summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--ObsoleteFiles.inc31
-rw-r--r--bin/expr/expr.182
-rw-r--r--bin/expr/expr.y538
-rw-r--r--bin/ps/ps.116
-rw-r--r--bin/sh/sh.154
-rw-r--r--cddl/contrib/opensolaris/cmd/zfs/zfs.85
-rw-r--r--cddl/contrib/opensolaris/cmd/zpool/zpool.827
-rw-r--r--cddl/contrib/opensolaris/cmd/zpool/zpool_main.c134
-rw-r--r--cddl/contrib/opensolaris/cmd/ztest/ztest.c2
-rw-r--r--cddl/contrib/opensolaris/lib/libzfs/common/libzfs.h5
-rw-r--r--cddl/contrib/opensolaris/lib/libzfs/common/libzfs_import.c4
-rw-r--r--cddl/contrib/opensolaris/lib/libzfs/common/libzfs_pool.c51
-rw-r--r--contrib/bind9/CHANGES1297
-rw-r--r--contrib/bind9/COPYRIGHT2
-rw-r--r--contrib/bind9/FAQ.xml2
-rw-r--r--contrib/bind9/HISTORY313
-rw-r--r--contrib/bind9/KNOWN-DEFECTS15
-rw-r--r--contrib/bind9/Makefile.in11
-rw-r--r--contrib/bind9/NSEC3-NOTES128
-rw-r--r--contrib/bind9/README448
-rw-r--r--contrib/bind9/README.idnkit112
-rw-r--r--contrib/bind9/README.pkcs1161
-rw-r--r--contrib/bind9/acconfig.h4
-rw-r--r--contrib/bind9/bin/Makefile.in7
-rw-r--r--contrib/bind9/bin/check/Makefile.in20
-rw-r--r--contrib/bind9/bin/check/check-tool.c5
-rw-r--r--contrib/bind9/bin/check/check-tool.h2
-rw-r--r--contrib/bind9/bin/check/named-checkconf.835
-rw-r--r--contrib/bind9/bin/check/named-checkconf.c43
-rw-r--r--contrib/bind9/bin/check/named-checkconf.docbook36
-rw-r--r--contrib/bind9/bin/check/named-checkconf.html41
-rw-r--r--contrib/bind9/bin/check/named-checkzone.819
-rw-r--r--contrib/bind9/bin/check/named-checkzone.c47
-rw-r--r--contrib/bind9/bin/check/named-checkzone.docbook22
-rw-r--r--contrib/bind9/bin/check/named-checkzone.html26
-rw-r--r--contrib/bind9/bin/confgen/Makefile.in101
-rw-r--r--contrib/bind9/bin/confgen/ddns-confgen.8143
-rw-r--r--contrib/bind9/bin/confgen/ddns-confgen.c257
-rw-r--r--contrib/bind9/bin/confgen/ddns-confgen.docbook218
-rw-r--r--contrib/bind9/bin/confgen/ddns-confgen.html141
-rw-r--r--contrib/bind9/bin/confgen/include/confgen/os.h39
-rw-r--r--contrib/bind9/bin/confgen/keygen.c218
-rw-r--r--contrib/bind9/bin/confgen/keygen.h41
-rw-r--r--contrib/bind9/bin/confgen/rndc-confgen.8 (renamed from contrib/bind9/bin/rndc/rndc-confgen.8)6
-rw-r--r--contrib/bind9/bin/confgen/rndc-confgen.c (renamed from contrib/bind9/bin/rndc/rndc-confgen.c)126
-rw-r--r--contrib/bind9/bin/confgen/rndc-confgen.docbook (renamed from contrib/bind9/bin/rndc/rndc-confgen.docbook)5
-rw-r--r--contrib/bind9/bin/confgen/rndc-confgen.html (renamed from contrib/bind9/bin/rndc/rndc-confgen.html)14
-rw-r--r--contrib/bind9/bin/confgen/unix/Makefile.in (renamed from contrib/bind9/bin/rndc/unix/Makefile.in)5
-rw-r--r--contrib/bind9/bin/confgen/unix/os.c (renamed from contrib/bind9/bin/rndc/unix/os.c)33
-rw-r--r--contrib/bind9/bin/confgen/util.c56
-rw-r--r--contrib/bind9/bin/confgen/util.h52
-rw-r--r--contrib/bind9/bin/dig/Makefile.in26
-rw-r--r--contrib/bind9/bin/dig/dig.111
-rw-r--r--contrib/bind9/bin/dig/dig.c176
-rw-r--r--contrib/bind9/bin/dig/dig.docbook16
-rw-r--r--contrib/bind9/bin/dig/dig.html28
-rw-r--r--contrib/bind9/bin/dig/dighost.c223
-rw-r--r--contrib/bind9/bin/dig/host.12
-rw-r--r--contrib/bind9/bin/dig/host.c5
-rw-r--r--contrib/bind9/bin/dig/host.docbook2
-rw-r--r--contrib/bind9/bin/dig/host.html2
-rw-r--r--contrib/bind9/bin/dig/include/dig/dig.h14
-rw-r--r--contrib/bind9/bin/dig/nslookup.12
-rw-r--r--contrib/bind9/bin/dig/nslookup.c20
-rw-r--r--contrib/bind9/bin/dig/nslookup.docbook2
-rw-r--r--contrib/bind9/bin/dig/nslookup.html2
-rw-r--r--contrib/bind9/bin/dnssec/Makefile.in41
-rw-r--r--contrib/bind9/bin/dnssec/dnssec-dsfromkey.855
-rw-r--r--contrib/bind9/bin/dnssec/dnssec-dsfromkey.c314
-rw-r--r--contrib/bind9/bin/dnssec/dnssec-dsfromkey.docbook78
-rw-r--r--contrib/bind9/bin/dnssec/dnssec-dsfromkey.html67
-rw-r--r--contrib/bind9/bin/dnssec/dnssec-keyfromlabel.886
-rw-r--r--contrib/bind9/bin/dnssec/dnssec-keyfromlabel.c336
-rw-r--r--contrib/bind9/bin/dnssec/dnssec-keyfromlabel.docbook195
-rw-r--r--contrib/bind9/bin/dnssec/dnssec-keyfromlabel.html136
-rw-r--r--contrib/bind9/bin/dnssec/dnssec-keygen.8114
-rw-r--r--contrib/bind9/bin/dnssec/dnssec-keygen.c768
-rw-r--r--contrib/bind9/bin/dnssec/dnssec-keygen.docbook264
-rw-r--r--contrib/bind9/bin/dnssec/dnssec-keygen.html196
-rw-r--r--contrib/bind9/bin/dnssec/dnssec-revoke.883
-rw-r--r--contrib/bind9/bin/dnssec/dnssec-revoke.c269
-rw-r--r--contrib/bind9/bin/dnssec/dnssec-revoke.docbook149
-rw-r--r--contrib/bind9/bin/dnssec/dnssec-revoke.html87
-rw-r--r--contrib/bind9/bin/dnssec/dnssec-settime.8166
-rw-r--r--contrib/bind9/bin/dnssec/dnssec-settime.c576
-rw-r--r--contrib/bind9/bin/dnssec/dnssec-settime.docbook319
-rw-r--r--contrib/bind9/bin/dnssec/dnssec-settime.html208
-rw-r--r--contrib/bind9/bin/dnssec/dnssec-signzone.8154
-rw-r--r--contrib/bind9/bin/dnssec/dnssec-signzone.c1157
-rw-r--r--contrib/bind9/bin/dnssec/dnssec-signzone.docbook246
-rw-r--r--contrib/bind9/bin/dnssec/dnssec-signzone.html200
-rw-r--r--contrib/bind9/bin/dnssec/dnssectool.c223
-rw-r--r--contrib/bind9/bin/dnssec/dnssectool.h33
-rw-r--r--contrib/bind9/bin/named/Makefile.in33
-rw-r--r--contrib/bind9/bin/named/bind.keys.h99
-rw-r--r--contrib/bind9/bin/named/bind9.xsl2
-rw-r--r--contrib/bind9/bin/named/bind9.xsl.h6
-rw-r--r--contrib/bind9/bin/named/builtin.c205
-rw-r--r--contrib/bind9/bin/named/client.c130
-rw-r--r--contrib/bind9/bin/named/config.c74
-rw-r--r--contrib/bind9/bin/named/control.c11
-rw-r--r--contrib/bind9/bin/named/include/named/client.h17
-rw-r--r--contrib/bind9/bin/named/include/named/config.h7
-rw-r--r--contrib/bind9/bin/named/include/named/control.h9
-rw-r--r--contrib/bind9/bin/named/include/named/globals.h21
-rw-r--r--contrib/bind9/bin/named/include/named/log.h2
-rw-r--r--contrib/bind9/bin/named/include/named/lwdclient.h2
-rw-r--r--contrib/bind9/bin/named/include/named/main.h9
-rw-r--r--contrib/bind9/bin/named/include/named/notify.h2
-rw-r--r--contrib/bind9/bin/named/include/named/query.h17
-rw-r--r--contrib/bind9/bin/named/include/named/server.h53
-rw-r--r--contrib/bind9/bin/named/include/named/tsigconf.h7
-rw-r--r--contrib/bind9/bin/named/include/named/types.h6
-rw-r--r--contrib/bind9/bin/named/include/named/zoneconf.h19
-rw-r--r--contrib/bind9/bin/named/interfacemgr.c2
-rw-r--r--contrib/bind9/bin/named/log.c2
-rw-r--r--contrib/bind9/bin/named/lwdgabn.c6
-rw-r--r--contrib/bind9/bin/named/lwdgrbn.c6
-rw-r--r--contrib/bind9/bin/named/lwresd.82
-rw-r--r--contrib/bind9/bin/named/lwresd.c7
-rw-r--r--contrib/bind9/bin/named/lwresd.docbook2
-rw-r--r--contrib/bind9/bin/named/lwresd.html2
-rw-r--r--contrib/bind9/bin/named/main.c132
-rw-r--r--contrib/bind9/bin/named/named.811
-rw-r--r--contrib/bind9/bin/named/named.conf.567
-rw-r--r--contrib/bind9/bin/named/named.conf.docbook68
-rw-r--r--contrib/bind9/bin/named/named.conf.html92
-rw-r--r--contrib/bind9/bin/named/named.docbook17
-rw-r--r--contrib/bind9/bin/named/named.html26
-rw-r--r--contrib/bind9/bin/named/query.c2245
-rw-r--r--contrib/bind9/bin/named/server.c2454
-rw-r--r--contrib/bind9/bin/named/statschannel.c19
-rw-r--r--contrib/bind9/bin/named/tkeyconf.c28
-rw-r--r--contrib/bind9/bin/named/tsigconf.c10
-rw-r--r--contrib/bind9/bin/named/unix/Makefile.in4
-rw-r--r--contrib/bind9/bin/named/unix/include/named/os.h8
-rw-r--r--contrib/bind9/bin/named/unix/os.c186
-rw-r--r--contrib/bind9/bin/named/update.c1060
-rw-r--r--contrib/bind9/bin/named/xfrout.c204
-rw-r--r--contrib/bind9/bin/named/zoneconf.c531
-rw-r--r--contrib/bind9/bin/nsupdate/Makefile.in19
-rw-r--r--contrib/bind9/bin/nsupdate/nsupdate.198
-rw-r--r--contrib/bind9/bin/nsupdate/nsupdate.c279
-rw-r--r--contrib/bind9/bin/nsupdate/nsupdate.docbook125
-rw-r--r--contrib/bind9/bin/nsupdate/nsupdate.html113
-rw-r--r--contrib/bind9/bin/rndc/Makefile.in40
-rw-r--r--contrib/bind9/bin/rndc/include/rndc/os.h8
-rw-r--r--contrib/bind9/bin/rndc/rndc.82
-rw-r--r--contrib/bind9/bin/rndc/rndc.c25
-rw-r--r--contrib/bind9/bin/rndc/rndc.conf.52
-rw-r--r--contrib/bind9/bin/rndc/rndc.conf.html2
-rw-r--r--contrib/bind9/bin/rndc/rndc.html2
-rw-r--r--contrib/bind9/bin/rndc/util.h10
-rw-r--r--contrib/bind9/bin/tools/Makefile.in103
-rw-r--r--contrib/bind9/bin/tools/arpaname.148
-rw-r--r--contrib/bind9/bin/tools/arpaname.c53
-rw-r--r--contrib/bind9/bin/tools/arpaname.docbook76
-rw-r--r--contrib/bind9/bin/tools/arpaname.html52
-rw-r--r--contrib/bind9/bin/tools/genrandom.869
-rw-r--r--contrib/bind9/bin/tools/genrandom.c136
-rw-r--r--contrib/bind9/bin/tools/genrandom.docbook119
-rw-r--r--contrib/bind9/bin/tools/genrandom.html73
-rw-r--r--contrib/bind9/bin/tools/isc-hmac-fixup.861
-rw-r--r--contrib/bind9/bin/tools/isc-hmac-fixup.c136
-rw-r--r--contrib/bind9/bin/tools/isc-hmac-fixup.docbook109
-rw-r--r--contrib/bind9/bin/tools/isc-hmac-fixup.html83
-rw-r--r--contrib/bind9/bin/tools/named-journalprint.860
-rw-r--r--contrib/bind9/bin/tools/named-journalprint.c86
-rw-r--r--contrib/bind9/bin/tools/named-journalprint.docbook101
-rw-r--r--contrib/bind9/bin/tools/named-journalprint.html73
-rw-r--r--contrib/bind9/bin/tools/nsec3hash.870
-rw-r--r--contrib/bind9/bin/tools/nsec3hash.c121
-rw-r--r--contrib/bind9/bin/tools/nsec3hash.docbook125
-rw-r--r--contrib/bind9/bin/tools/nsec3hash.html78
-rw-r--r--contrib/bind9/config.guess2
-rw-r--r--contrib/bind9/config.h.in66
-rw-r--r--contrib/bind9/configure.in501
-rw-r--r--contrib/bind9/doc/arm/Bv9ARM-book.xml2041
-rw-r--r--contrib/bind9/doc/arm/Bv9ARM.ch01.html54
-rw-r--r--contrib/bind9/doc/arm/Bv9ARM.ch02.html30
-rw-r--r--contrib/bind9/doc/arm/Bv9ARM.ch03.html174
-rw-r--r--contrib/bind9/doc/arm/Bv9ARM.ch04.html969
-rw-r--r--contrib/bind9/doc/arm/Bv9ARM.ch05.html8
-rw-r--r--contrib/bind9/doc/arm/Bv9ARM.ch06.html1669
-rw-r--r--contrib/bind9/doc/arm/Bv9ARM.ch07.html29
-rw-r--r--contrib/bind9/doc/arm/Bv9ARM.ch08.html20
-rw-r--r--contrib/bind9/doc/arm/Bv9ARM.ch09.html657
-rw-r--r--contrib/bind9/doc/arm/Bv9ARM.ch10.html28
-rw-r--r--contrib/bind9/doc/arm/Bv9ARM.html217
-rw-r--r--contrib/bind9/doc/arm/Bv9ARM.pdf19903
-rw-r--r--contrib/bind9/doc/arm/Makefile.in2
-rw-r--r--contrib/bind9/doc/arm/dnssec.xml268
-rw-r--r--contrib/bind9/doc/arm/libdns.xml530
-rw-r--r--contrib/bind9/doc/arm/man.arpaname.html91
-rw-r--r--contrib/bind9/doc/arm/man.ddns-confgen.html180
-rw-r--r--contrib/bind9/doc/arm/man.dig.html28
-rw-r--r--contrib/bind9/doc/arm/man.dnssec-dsfromkey.html67
-rw-r--r--contrib/bind9/doc/arm/man.dnssec-keyfromlabel.html136
-rw-r--r--contrib/bind9/doc/arm/man.dnssec-keygen.html206
-rw-r--r--contrib/bind9/doc/arm/man.dnssec-revoke.html126
-rw-r--r--contrib/bind9/doc/arm/man.dnssec-settime.html247
-rw-r--r--contrib/bind9/doc/arm/man.dnssec-signzone.html210
-rw-r--r--contrib/bind9/doc/arm/man.genrandom.html112
-rw-r--r--contrib/bind9/doc/arm/man.host.html12
-rw-r--r--contrib/bind9/doc/arm/man.isc-hmac-fixup.html122
-rw-r--r--contrib/bind9/doc/arm/man.named-checkconf.html41
-rw-r--r--contrib/bind9/doc/arm/man.named-checkzone.html26
-rw-r--r--contrib/bind9/doc/arm/man.named-journalprint.html112
-rw-r--r--contrib/bind9/doc/arm/man.named.html36
-rw-r--r--contrib/bind9/doc/arm/man.nsec3hash.html113
-rw-r--r--contrib/bind9/doc/arm/man.nsupdate.html123
-rw-r--r--contrib/bind9/doc/arm/man.rndc-confgen.html24
-rw-r--r--contrib/bind9/doc/arm/man.rndc.conf.html14
-rw-r--r--contrib/bind9/doc/arm/man.rndc.html14
-rw-r--r--contrib/bind9/doc/arm/managed-keys.xml100
-rw-r--r--contrib/bind9/doc/arm/pkcs11.xml390
-rw-r--r--contrib/bind9/doc/misc/Makefile.in2
-rw-r--r--contrib/bind9/doc/misc/options104
-rw-r--r--contrib/bind9/lib/bind9/Makefile.in4
-rw-r--r--contrib/bind9/lib/bind9/api4
-rw-r--r--contrib/bind9/lib/bind9/check.c549
-rw-r--r--contrib/bind9/lib/bind9/include/bind9/getaddresses.h2
-rw-r--r--contrib/bind9/lib/dns/Makefile.in44
-rw-r--r--contrib/bind9/lib/dns/acl.c2
-rw-r--r--contrib/bind9/lib/dns/adb.c581
-rw-r--r--contrib/bind9/lib/dns/api4
-rw-r--r--contrib/bind9/lib/dns/byaddr.c47
-rw-r--r--contrib/bind9/lib/dns/cache.c78
-rw-r--r--contrib/bind9/lib/dns/client.c3019
-rw-r--r--contrib/bind9/lib/dns/db.c46
-rw-r--r--contrib/bind9/lib/dns/diff.c19
-rw-r--r--contrib/bind9/lib/dns/dispatch.c93
-rw-r--r--contrib/bind9/lib/dns/dlz.c154
-rw-r--r--contrib/bind9/lib/dns/dns64.c299
-rw-r--r--contrib/bind9/lib/dns/dnssec.c804
-rw-r--r--contrib/bind9/lib/dns/ds.c72
-rw-r--r--contrib/bind9/lib/dns/dst_api.c489
-rw-r--r--contrib/bind9/lib/dns/dst_internal.h40
-rw-r--r--contrib/bind9/lib/dns/dst_openssl.h9
-rw-r--r--contrib/bind9/lib/dns/dst_parse.c193
-rw-r--r--contrib/bind9/lib/dns/dst_parse.h21
-rw-r--r--contrib/bind9/lib/dns/ecdb.c810
-rw-r--r--contrib/bind9/lib/dns/forward.c22
-rw-r--r--contrib/bind9/lib/dns/gen-unix.h2
-rw-r--r--contrib/bind9/lib/dns/gen.c6
-rw-r--r--contrib/bind9/lib/dns/gssapi_link.c91
-rw-r--r--contrib/bind9/lib/dns/gssapictx.c96
-rw-r--r--contrib/bind9/lib/dns/hmac_link.c211
-rw-r--r--contrib/bind9/lib/dns/include/dns/Makefile.in20
-rw-r--r--contrib/bind9/lib/dns/include/dns/acl.h2
-rw-r--r--contrib/bind9/lib/dns/include/dns/cache.h39
-rw-r--r--contrib/bind9/lib/dns/include/dns/client.h621
-rw-r--r--contrib/bind9/lib/dns/include/dns/compress.h2
-rw-r--r--contrib/bind9/lib/dns/include/dns/db.h49
-rw-r--r--contrib/bind9/lib/dns/include/dns/diff.h2
-rw-r--r--contrib/bind9/lib/dns/include/dns/dispatch.h2
-rw-r--r--contrib/bind9/lib/dns/include/dns/dlz.h62
-rw-r--r--contrib/bind9/lib/dns/include/dns/dns64.h175
-rw-r--r--contrib/bind9/lib/dns/include/dns/dnssec.h137
-rw-r--r--contrib/bind9/lib/dns/include/dns/ds.h9
-rw-r--r--contrib/bind9/lib/dns/include/dns/ecdb.h52
-rw-r--r--contrib/bind9/lib/dns/include/dns/events.h7
-rw-r--r--contrib/bind9/lib/dns/include/dns/forward.h19
-rw-r--r--contrib/bind9/lib/dns/include/dns/journal.h2
-rw-r--r--contrib/bind9/lib/dns/include/dns/keydata.h55
-rw-r--r--contrib/bind9/lib/dns/include/dns/keytable.h212
-rw-r--r--contrib/bind9/lib/dns/include/dns/keyvalues.h8
-rw-r--r--contrib/bind9/lib/dns/include/dns/lib.h18
-rw-r--r--contrib/bind9/lib/dns/include/dns/log.h3
-rw-r--r--contrib/bind9/lib/dns/include/dns/lookup.h2
-rw-r--r--contrib/bind9/lib/dns/include/dns/master.h5
-rw-r--r--contrib/bind9/lib/dns/include/dns/masterdump.h4
-rw-r--r--contrib/bind9/lib/dns/include/dns/message.h20
-rw-r--r--contrib/bind9/lib/dns/include/dns/name.h84
-rw-r--r--contrib/bind9/lib/dns/include/dns/ncache.h2
-rw-r--r--contrib/bind9/lib/dns/include/dns/nsec3.h61
-rw-r--r--contrib/bind9/lib/dns/include/dns/peer.h2
-rw-r--r--contrib/bind9/lib/dns/include/dns/private.h55
-rw-r--r--contrib/bind9/lib/dns/include/dns/rbt.h19
-rw-r--r--contrib/bind9/lib/dns/include/dns/rdata.h55
-rw-r--r--contrib/bind9/lib/dns/include/dns/rdataset.h5
-rw-r--r--contrib/bind9/lib/dns/include/dns/request.h11
-rw-r--r--contrib/bind9/lib/dns/include/dns/resolver.h28
-rw-r--r--contrib/bind9/lib/dns/include/dns/result.h9
-rw-r--r--contrib/bind9/lib/dns/include/dns/rpz.h189
-rw-r--r--contrib/bind9/lib/dns/include/dns/rriterator.h103
-rw-r--r--contrib/bind9/lib/dns/include/dns/sdb.h2
-rw-r--r--contrib/bind9/lib/dns/include/dns/sdlz.h130
-rw-r--r--contrib/bind9/lib/dns/include/dns/secalg.h11
-rw-r--r--contrib/bind9/lib/dns/include/dns/soa.h26
-rw-r--r--contrib/bind9/lib/dns/include/dns/ssu.h31
-rw-r--r--contrib/bind9/lib/dns/include/dns/stats.h2
-rw-r--r--contrib/bind9/lib/dns/include/dns/tkey.h14
-rw-r--r--contrib/bind9/lib/dns/include/dns/tsec.h135
-rw-r--r--contrib/bind9/lib/dns/include/dns/tsig.h32
-rw-r--r--contrib/bind9/lib/dns/include/dns/types.h18
-rw-r--r--contrib/bind9/lib/dns/include/dns/validator.h2
-rw-r--r--contrib/bind9/lib/dns/include/dns/view.h211
-rw-r--r--contrib/bind9/lib/dns/include/dns/xfrin.h2
-rw-r--r--contrib/bind9/lib/dns/include/dns/zone.h109
-rw-r--r--contrib/bind9/lib/dns/include/dst/dst.h241
-rw-r--r--contrib/bind9/lib/dns/include/dst/gssapi.h13
-rw-r--r--contrib/bind9/lib/dns/iptable.c2
-rw-r--r--contrib/bind9/lib/dns/journal.c8
-rw-r--r--contrib/bind9/lib/dns/keydata.c89
-rw-r--r--contrib/bind9/lib/dns/keytable.c389
-rw-r--r--contrib/bind9/lib/dns/lib.c109
-rw-r--r--contrib/bind9/lib/dns/log.c5
-rw-r--r--contrib/bind9/lib/dns/master.c113
-rw-r--r--contrib/bind9/lib/dns/masterdump.c95
-rw-r--r--contrib/bind9/lib/dns/message.c71
-rw-r--r--contrib/bind9/lib/dns/name.c77
-rw-r--r--contrib/bind9/lib/dns/ncache.c64
-rw-r--r--contrib/bind9/lib/dns/nsec.c2
-rw-r--r--contrib/bind9/lib/dns/nsec3.c490
-rw-r--r--contrib/bind9/lib/dns/openssl_link.c231
-rw-r--r--contrib/bind9/lib/dns/openssldh_link.c45
-rw-r--r--contrib/bind9/lib/dns/openssldsa_link.c47
-rw-r--r--contrib/bind9/lib/dns/opensslgost_link.c418
-rw-r--r--contrib/bind9/lib/dns/opensslrsa_link.c166
-rw-r--r--contrib/bind9/lib/dns/peer.c6
-rw-r--r--contrib/bind9/lib/dns/private.c295
-rw-r--r--contrib/bind9/lib/dns/rbt.c9
-rw-r--r--contrib/bind9/lib/dns/rbtdb.c864
-rw-r--r--contrib/bind9/lib/dns/rcode.c27
-rw-r--r--contrib/bind9/lib/dns/rdata.c143
-rw-r--r--contrib/bind9/lib/dns/rdata/any_255/tsig_250.c9
-rw-r--r--contrib/bind9/lib/dns/rdata/ch_3/a_1.c12
-rw-r--r--contrib/bind9/lib/dns/rdata/generic/afsdb_18.c8
-rw-r--r--contrib/bind9/lib/dns/rdata/generic/cert_37.c10
-rw-r--r--contrib/bind9/lib/dns/rdata/generic/cname_5.c9
-rw-r--r--contrib/bind9/lib/dns/rdata/generic/dlv_32769.c36
-rw-r--r--contrib/bind9/lib/dns/rdata/generic/dname_39.c8
-rw-r--r--contrib/bind9/lib/dns/rdata/generic/dnskey_48.c41
-rw-r--r--contrib/bind9/lib/dns/rdata/generic/ds_43.c32
-rw-r--r--contrib/bind9/lib/dns/rdata/generic/gpos_27.c9
-rw-r--r--contrib/bind9/lib/dns/rdata/generic/hinfo_13.c8
-rw-r--r--contrib/bind9/lib/dns/rdata/generic/hip_55.c506
-rw-r--r--contrib/bind9/lib/dns/rdata/generic/hip_55.h47
-rw-r--r--contrib/bind9/lib/dns/rdata/generic/ipseckey_45.c41
-rw-r--r--contrib/bind9/lib/dns/rdata/generic/isdn_20.c9
-rw-r--r--contrib/bind9/lib/dns/rdata/generic/key_25.c37
-rw-r--r--contrib/bind9/lib/dns/rdata/generic/keydata_65533.c377
-rw-r--r--contrib/bind9/lib/dns/rdata/generic/keydata_65533.h35
-rw-r--r--contrib/bind9/lib/dns/rdata/generic/loc_29.c7
-rw-r--r--contrib/bind9/lib/dns/rdata/generic/mb_7.c15
-rw-r--r--contrib/bind9/lib/dns/rdata/generic/md_3.c15
-rw-r--r--contrib/bind9/lib/dns/rdata/generic/mf_4.c15
-rw-r--r--contrib/bind9/lib/dns/rdata/generic/mg_8.c15
-rw-r--r--contrib/bind9/lib/dns/rdata/generic/minfo_14.c21
-rw-r--r--contrib/bind9/lib/dns/rdata/generic/mr_9.c15
-rw-r--r--contrib/bind9/lib/dns/rdata/generic/mx_15.c13
-rw-r--r--contrib/bind9/lib/dns/rdata/generic/ns_2.c15
-rw-r--r--contrib/bind9/lib/dns/rdata/generic/nsec3_50.c7
-rw-r--r--contrib/bind9/lib/dns/rdata/generic/nsec3param_51.c7
-rw-r--r--contrib/bind9/lib/dns/rdata/generic/nsec_47.c36
-rw-r--r--contrib/bind9/lib/dns/rdata/generic/null_10.c9
-rw-r--r--contrib/bind9/lib/dns/rdata/generic/nxt_30.c8
-rw-r--r--contrib/bind9/lib/dns/rdata/generic/opt_41.c9
-rw-r--r--contrib/bind9/lib/dns/rdata/generic/proforma.c21
-rw-r--r--contrib/bind9/lib/dns/rdata/generic/ptr_12.c14
-rw-r--r--contrib/bind9/lib/dns/rdata/generic/rp_17.c20
-rw-r--r--contrib/bind9/lib/dns/rdata/generic/rrsig_46.c47
-rw-r--r--contrib/bind9/lib/dns/rdata/generic/rt_21.c13
-rw-r--r--contrib/bind9/lib/dns/rdata/generic/sig_24.c8
-rw-r--r--contrib/bind9/lib/dns/rdata/generic/soa_6.c7
-rw-r--r--contrib/bind9/lib/dns/rdata/generic/spf_99.c8
-rw-r--r--contrib/bind9/lib/dns/rdata/generic/sshfp_44.c9
-rw-r--r--contrib/bind9/lib/dns/rdata/generic/tkey_249.c8
-rw-r--r--contrib/bind9/lib/dns/rdata/generic/txt_16.c9
-rw-r--r--contrib/bind9/lib/dns/rdata/generic/unspec_103.c9
-rw-r--r--contrib/bind9/lib/dns/rdata/generic/x25_19.c9
-rw-r--r--contrib/bind9/lib/dns/rdata/hs_4/a_1.c9
-rw-r--r--contrib/bind9/lib/dns/rdata/in_1/a6_38.c9
-rw-r--r--contrib/bind9/lib/dns/rdata/in_1/a_1.c9
-rw-r--r--contrib/bind9/lib/dns/rdata/in_1/aaaa_28.c8
-rw-r--r--contrib/bind9/lib/dns/rdata/in_1/apl_42.c9
-rw-r--r--contrib/bind9/lib/dns/rdata/in_1/dhcid_49.c11
-rw-r--r--contrib/bind9/lib/dns/rdata/in_1/kx_36.c13
-rw-r--r--contrib/bind9/lib/dns/rdata/in_1/naptr_35.c136
-rw-r--r--contrib/bind9/lib/dns/rdata/in_1/nsap-ptr_23.c15
-rw-r--r--contrib/bind9/lib/dns/rdata/in_1/nsap_22.c9
-rw-r--r--contrib/bind9/lib/dns/rdata/in_1/px_26.c13
-rw-r--r--contrib/bind9/lib/dns/rdata/in_1/srv_33.c13
-rw-r--r--contrib/bind9/lib/dns/rdata/in_1/wks_11.c7
-rw-r--r--contrib/bind9/lib/dns/rdatalist.c2
-rw-r--r--contrib/bind9/lib/dns/rdataset.c6
-rw-r--r--contrib/bind9/lib/dns/rdataslab.c28
-rw-r--r--contrib/bind9/lib/dns/request.c10
-rw-r--r--contrib/bind9/lib/dns/resolver.c643
-rw-r--r--contrib/bind9/lib/dns/result.c7
-rw-r--r--contrib/bind9/lib/dns/rootns.c2
-rw-r--r--contrib/bind9/lib/dns/rpz.c1168
-rw-r--r--contrib/bind9/lib/dns/rriterator.c202
-rw-r--r--contrib/bind9/lib/dns/sdb.c8
-rw-r--r--contrib/bind9/lib/dns/sdlz.c413
-rw-r--r--contrib/bind9/lib/dns/soa.c40
-rw-r--r--contrib/bind9/lib/dns/spnego.c9
-rw-r--r--contrib/bind9/lib/dns/ssu.c68
-rw-r--r--contrib/bind9/lib/dns/ssu_external.c265
-rw-r--r--contrib/bind9/lib/dns/stats.c2
-rw-r--r--contrib/bind9/lib/dns/time.c2
-rw-r--r--contrib/bind9/lib/dns/tkey.c53
-rw-r--r--contrib/bind9/lib/dns/tsec.c160
-rw-r--r--contrib/bind9/lib/dns/tsig.c367
-rw-r--r--contrib/bind9/lib/dns/validator.c436
-rw-r--r--contrib/bind9/lib/dns/view.c421
-rw-r--r--contrib/bind9/lib/dns/xfrin.c43
-rw-r--r--contrib/bind9/lib/dns/zone.c3909
-rw-r--r--contrib/bind9/lib/export/Makefile.in27
-rw-r--r--contrib/bind9/lib/export/dns/Makefile.in179
-rw-r--r--contrib/bind9/lib/export/dns/include/Makefile.in23
-rw-r--r--contrib/bind9/lib/export/dns/include/dns/Makefile.in56
-rw-r--r--contrib/bind9/lib/export/dns/include/dst/Makefile.in36
-rw-r--r--contrib/bind9/lib/export/irs/Makefile.in86
-rw-r--r--contrib/bind9/lib/export/irs/include/Makefile.in24
-rw-r--r--contrib/bind9/lib/export/irs/include/irs/Makefile.in46
-rw-r--r--contrib/bind9/lib/export/isc/Makefile.in139
-rw-r--r--contrib/bind9/lib/export/isc/include/Makefile.in24
-rw-r--r--contrib/bind9/lib/export/isc/include/isc/Makefile.in66
-rw-r--r--contrib/bind9/lib/export/isc/include/isc/bind9.h30
-rw-r--r--contrib/bind9/lib/export/isc/nls/Makefile.in35
-rw-r--r--contrib/bind9/lib/export/isc/nothreads/Makefile.in40
-rw-r--r--contrib/bind9/lib/export/isc/nothreads/include/Makefile.in24
-rw-r--r--contrib/bind9/lib/export/isc/nothreads/include/isc/Makefile.in36
-rw-r--r--contrib/bind9/lib/export/isc/pthreads/Makefile.in38
-rw-r--r--contrib/bind9/lib/export/isc/pthreads/include/Makefile.in24
-rw-r--r--contrib/bind9/lib/export/isc/pthreads/include/isc/Makefile.in36
-rw-r--r--contrib/bind9/lib/export/isc/unix/Makefile.in57
-rw-r--r--contrib/bind9/lib/export/isc/unix/include/Makefile.in24
-rw-r--r--contrib/bind9/lib/export/isc/unix/include/isc/Makefile.in37
-rw-r--r--contrib/bind9/lib/export/isccfg/Makefile.in83
-rw-r--r--contrib/bind9/lib/export/isccfg/include/Makefile.in24
-rw-r--r--contrib/bind9/lib/export/isccfg/include/isccfg/Makefile.in42
-rw-r--r--contrib/bind9/lib/export/samples/Makefile-postinstall.in78
-rw-r--r--contrib/bind9/lib/export/samples/Makefile.in98
-rw-r--r--contrib/bind9/lib/export/samples/nsprobe.c1220
-rw-r--r--contrib/bind9/lib/export/samples/sample-async.c402
-rw-r--r--contrib/bind9/lib/export/samples/sample-gai.c77
-rw-r--r--contrib/bind9/lib/export/samples/sample-request.c263
-rw-r--r--contrib/bind9/lib/export/samples/sample-update.c755
-rw-r--r--contrib/bind9/lib/export/samples/sample.c378
-rw-r--r--contrib/bind9/lib/irs/Makefile.in80
-rw-r--r--contrib/bind9/lib/irs/api3
-rw-r--r--contrib/bind9/lib/irs/context.c396
-rw-r--r--contrib/bind9/lib/irs/dnsconf.c269
-rw-r--r--contrib/bind9/lib/irs/gai_strerror.c93
-rw-r--r--contrib/bind9/lib/irs/getaddrinfo.c1295
-rw-r--r--contrib/bind9/lib/irs/getnameinfo.c410
-rw-r--r--contrib/bind9/lib/irs/include/Makefile.in24
-rw-r--r--contrib/bind9/lib/irs/include/irs/Makefile.in44
-rw-r--r--contrib/bind9/lib/irs/include/irs/context.h159
-rw-r--r--contrib/bind9/lib/irs/include/irs/dnsconf.h94
-rw-r--r--contrib/bind9/lib/irs/include/irs/netdb.h.in167
-rw-r--r--contrib/bind9/lib/irs/include/irs/platform.h.in45
-rw-r--r--contrib/bind9/lib/irs/include/irs/resconf.h113
-rw-r--r--contrib/bind9/lib/irs/include/irs/types.h31
-rw-r--r--contrib/bind9/lib/irs/include/irs/version.h27
-rw-r--r--contrib/bind9/lib/irs/resconf.c636
-rw-r--r--contrib/bind9/lib/irs/version.c27
-rw-r--r--contrib/bind9/lib/isc/Makefile.in38
-rw-r--r--contrib/bind9/lib/isc/alpha/include/isc/atomic.h2
-rw-r--r--contrib/bind9/lib/isc/api6
-rw-r--r--contrib/bind9/lib/isc/app_api.c136
-rw-r--r--contrib/bind9/lib/isc/assertions.c64
-rw-r--r--contrib/bind9/lib/isc/backtrace-emptytbl.c34
-rw-r--r--contrib/bind9/lib/isc/backtrace.c285
-rw-r--r--contrib/bind9/lib/isc/base32.c2
-rw-r--r--contrib/bind9/lib/isc/base64.c2
-rw-r--r--contrib/bind9/lib/isc/entropy.c2
-rw-r--r--contrib/bind9/lib/isc/hash.c20
-rw-r--r--contrib/bind9/lib/isc/heap.c2
-rw-r--r--contrib/bind9/lib/isc/hmacmd5.c35
-rw-r--r--contrib/bind9/lib/isc/hmacsha.c269
-rw-r--r--contrib/bind9/lib/isc/httpd.c2
-rw-r--r--contrib/bind9/lib/isc/ia64/include/isc/atomic.h2
-rw-r--r--contrib/bind9/lib/isc/include/isc/Makefile.in10
-rw-r--r--contrib/bind9/lib/isc/include/isc/app.h173
-rw-r--r--contrib/bind9/lib/isc/include/isc/assertions.h8
-rw-r--r--contrib/bind9/lib/isc/include/isc/backtrace.h131
-rw-r--r--contrib/bind9/lib/isc/include/isc/bind9.h30
-rw-r--r--contrib/bind9/lib/isc/include/isc/buffer.h4
-rw-r--r--contrib/bind9/lib/isc/include/isc/entropy.h2
-rw-r--r--contrib/bind9/lib/isc/include/isc/error.h9
-rw-r--r--contrib/bind9/lib/isc/include/isc/file.h31
-rw-r--r--contrib/bind9/lib/isc/include/isc/fsaccess.h2
-rw-r--r--contrib/bind9/lib/isc/include/isc/hash.h2
-rw-r--r--contrib/bind9/lib/isc/include/isc/heap.h2
-rw-r--r--contrib/bind9/lib/isc/include/isc/hmacmd5.h13
-rw-r--r--contrib/bind9/lib/isc/include/isc/hmacsha.h17
-rw-r--r--contrib/bind9/lib/isc/include/isc/lib.h13
-rw-r--r--contrib/bind9/lib/isc/include/isc/log.h2
-rw-r--r--contrib/bind9/lib/isc/include/isc/md5.h14
-rw-r--r--contrib/bind9/lib/isc/include/isc/mem.h161
-rw-r--r--contrib/bind9/lib/isc/include/isc/msgs.h6
-rw-r--r--contrib/bind9/lib/isc/include/isc/namespace.h164
-rw-r--r--contrib/bind9/lib/isc/include/isc/netaddr.h2
-rw-r--r--contrib/bind9/lib/isc/include/isc/netscope.h2
-rw-r--r--contrib/bind9/lib/isc/include/isc/platform.h.in24
-rw-r--r--contrib/bind9/lib/isc/include/isc/portset.h2
-rw-r--r--contrib/bind9/lib/isc/include/isc/radix.h2
-rw-r--r--contrib/bind9/lib/isc/include/isc/random.h2
-rw-r--r--contrib/bind9/lib/isc/include/isc/ratelimiter.h2
-rw-r--r--contrib/bind9/lib/isc/include/isc/refcount.h12
-rw-r--r--contrib/bind9/lib/isc/include/isc/result.h5
-rw-r--r--contrib/bind9/lib/isc/include/isc/resultclass.h5
-rw-r--r--contrib/bind9/lib/isc/include/isc/serial.h2
-rw-r--r--contrib/bind9/lib/isc/include/isc/sha1.h13
-rw-r--r--contrib/bind9/lib/isc/include/isc/sha2.h17
-rw-r--r--contrib/bind9/lib/isc/include/isc/sockaddr.h2
-rw-r--r--contrib/bind9/lib/isc/include/isc/socket.h149
-rw-r--r--contrib/bind9/lib/isc/include/isc/stats.h2
-rw-r--r--contrib/bind9/lib/isc/include/isc/symtab.h2
-rw-r--r--contrib/bind9/lib/isc/include/isc/task.h108
-rw-r--r--contrib/bind9/lib/isc/include/isc/timer.h93
-rw-r--r--contrib/bind9/lib/isc/include/isc/types.h9
-rw-r--r--contrib/bind9/lib/isc/include/isc/util.h2
-rw-r--r--contrib/bind9/lib/isc/inet_aton.c4
-rw-r--r--contrib/bind9/lib/isc/inet_ntop.c2
-rw-r--r--contrib/bind9/lib/isc/iterated_hash.c2
-rw-r--r--contrib/bind9/lib/isc/lib.c34
-rw-r--r--contrib/bind9/lib/isc/log.c2
-rw-r--r--contrib/bind9/lib/isc/md5.c30
-rw-r--r--contrib/bind9/lib/isc/mem.c573
-rw-r--r--contrib/bind9/lib/isc/mem_api.c303
-rw-r--r--contrib/bind9/lib/isc/netaddr.c24
-rw-r--r--contrib/bind9/lib/isc/nls/Makefile.in4
-rw-r--r--contrib/bind9/lib/isc/nothreads/Makefile.in8
-rw-r--r--contrib/bind9/lib/isc/powerpc/include/isc/atomic.h2
-rw-r--r--contrib/bind9/lib/isc/print.c2
-rw-r--r--contrib/bind9/lib/isc/pthreads/Makefile.in4
-rw-r--r--contrib/bind9/lib/isc/pthreads/mutex.c2
-rw-r--r--contrib/bind9/lib/isc/radix.c2
-rw-r--r--contrib/bind9/lib/isc/random.c4
-rw-r--r--contrib/bind9/lib/isc/rwlock.c2
-rw-r--r--contrib/bind9/lib/isc/sha1.c41
-rw-r--r--contrib/bind9/lib/isc/sha2.c429
-rw-r--r--contrib/bind9/lib/isc/sockaddr.c8
-rw-r--r--contrib/bind9/lib/isc/socket_api.c216
-rw-r--r--contrib/bind9/lib/isc/sparc64/include/isc/atomic.h19
-rw-r--r--contrib/bind9/lib/isc/stats.c2
-rw-r--r--contrib/bind9/lib/isc/task.c517
-rw-r--r--contrib/bind9/lib/isc/task_api.c216
-rw-r--r--contrib/bind9/lib/isc/task_p.h8
-rw-r--r--contrib/bind9/lib/isc/timer.c346
-rw-r--r--contrib/bind9/lib/isc/timer_api.c144
-rw-r--r--contrib/bind9/lib/isc/timer_p.h8
-rw-r--r--contrib/bind9/lib/isc/unix/Makefile.in4
-rw-r--r--contrib/bind9/lib/isc/unix/app.c540
-rw-r--r--contrib/bind9/lib/isc/unix/dir.c4
-rw-r--r--contrib/bind9/lib/isc/unix/entropy.c4
-rw-r--r--contrib/bind9/lib/isc/unix/file.c90
-rw-r--r--contrib/bind9/lib/isc/unix/ifiter_getifaddrs.c2
-rw-r--r--contrib/bind9/lib/isc/unix/ifiter_ioctl.c2
-rw-r--r--contrib/bind9/lib/isc/unix/include/isc/net.h4
-rw-r--r--contrib/bind9/lib/isc/unix/include/isc/offset.h4
-rw-r--r--contrib/bind9/lib/isc/unix/include/isc/strerror.h4
-rw-r--r--contrib/bind9/lib/isc/unix/include/isc/time.h2
-rw-r--r--contrib/bind9/lib/isc/unix/interfaceiter.c4
-rw-r--r--contrib/bind9/lib/isc/unix/resource.c2
-rw-r--r--contrib/bind9/lib/isc/unix/socket.c952
-rw-r--r--contrib/bind9/lib/isc/unix/socket_p.h9
-rw-r--r--contrib/bind9/lib/isc/unix/strerror.c2
-rw-r--r--contrib/bind9/lib/isccc/Makefile.in6
-rw-r--r--contrib/bind9/lib/isccc/api4
-rw-r--r--contrib/bind9/lib/isccfg/Makefile.in8
-rw-r--r--contrib/bind9/lib/isccfg/aclconf.c25
-rw-r--r--contrib/bind9/lib/isccfg/api6
-rw-r--r--contrib/bind9/lib/isccfg/dnsconf.c69
-rw-r--r--contrib/bind9/lib/isccfg/include/isccfg/aclconf.h14
-rw-r--r--contrib/bind9/lib/isccfg/include/isccfg/cfg.h38
-rw-r--r--contrib/bind9/lib/isccfg/include/isccfg/dnsconf.h35
-rw-r--r--contrib/bind9/lib/isccfg/include/isccfg/grammar.h24
-rw-r--r--contrib/bind9/lib/isccfg/include/isccfg/log.h2
-rw-r--r--contrib/bind9/lib/isccfg/include/isccfg/namedconf.h16
-rw-r--r--contrib/bind9/lib/isccfg/namedconf.c588
-rw-r--r--contrib/bind9/lib/isccfg/parser.c92
-rw-r--r--contrib/bind9/lib/lwres/api4
-rw-r--r--contrib/bind9/lib/lwres/context.c2
-rw-r--r--contrib/bind9/lib/lwres/context_p.h2
-rw-r--r--contrib/bind9/lib/lwres/getaddrinfo.c4
-rw-r--r--contrib/bind9/lib/lwres/getipnode.c2
-rw-r--r--contrib/bind9/lib/lwres/include/lwres/context.h2
-rw-r--r--contrib/bind9/lib/lwres/include/lwres/netdb.h.in2
-rw-r--r--contrib/bind9/lib/lwres/lwconfig.c2
-rw-r--r--contrib/bind9/lib/lwres/man/lwres.32
-rw-r--r--contrib/bind9/lib/lwres/man/lwres.html14
-rw-r--r--contrib/bind9/lib/lwres/man/lwres_buffer.32
-rw-r--r--contrib/bind9/lib/lwres/man/lwres_buffer.html6
-rw-r--r--contrib/bind9/lib/lwres/man/lwres_config.32
-rw-r--r--contrib/bind9/lib/lwres/man/lwres_config.html12
-rw-r--r--contrib/bind9/lib/lwres/man/lwres_context.32
-rw-r--r--contrib/bind9/lib/lwres/man/lwres_context.html10
-rw-r--r--contrib/bind9/lib/lwres/man/lwres_gabn.32
-rw-r--r--contrib/bind9/lib/lwres/man/lwres_gabn.html10
-rw-r--r--contrib/bind9/lib/lwres/man/lwres_gai_strerror.32
-rw-r--r--contrib/bind9/lib/lwres/man/lwres_gai_strerror.html8
-rw-r--r--contrib/bind9/lib/lwres/man/lwres_getaddrinfo.32
-rw-r--r--contrib/bind9/lib/lwres/man/lwres_getaddrinfo.html10
-rw-r--r--contrib/bind9/lib/lwres/man/lwres_gethostent.32
-rw-r--r--contrib/bind9/lib/lwres/man/lwres_gethostent.html12
-rw-r--r--contrib/bind9/lib/lwres/man/lwres_getipnode.32
-rw-r--r--contrib/bind9/lib/lwres/man/lwres_getipnode.html10
-rw-r--r--contrib/bind9/lib/lwres/man/lwres_getnameinfo.32
-rw-r--r--contrib/bind9/lib/lwres/man/lwres_getnameinfo.html12
-rw-r--r--contrib/bind9/lib/lwres/man/lwres_getrrsetbyname.32
-rw-r--r--contrib/bind9/lib/lwres/man/lwres_getrrsetbyname.html10
-rw-r--r--contrib/bind9/lib/lwres/man/lwres_gnba.32
-rw-r--r--contrib/bind9/lib/lwres/man/lwres_gnba.html10
-rw-r--r--contrib/bind9/lib/lwres/man/lwres_hstrerror.32
-rw-r--r--contrib/bind9/lib/lwres/man/lwres_hstrerror.html10
-rw-r--r--contrib/bind9/lib/lwres/man/lwres_inetntop.32
-rw-r--r--contrib/bind9/lib/lwres/man/lwres_inetntop.html10
-rw-r--r--contrib/bind9/lib/lwres/man/lwres_noop.32
-rw-r--r--contrib/bind9/lib/lwres/man/lwres_noop.html10
-rw-r--r--contrib/bind9/lib/lwres/man/lwres_packet.32
-rw-r--r--contrib/bind9/lib/lwres/man/lwres_packet.html8
-rw-r--r--contrib/bind9/lib/lwres/man/lwres_resutil.32
-rw-r--r--contrib/bind9/lib/lwres/man/lwres_resutil.html10
-rw-r--r--contrib/bind9/lib/lwres/print_p.h2
-rw-r--r--contrib/bind9/make/rules.in91
-rw-r--r--contrib/bind9/version10
-rw-r--r--contrib/dialog/CHANGES89
-rw-r--r--contrib/dialog/VERSION2
-rw-r--r--contrib/dialog/aclocal.m4199
-rw-r--r--contrib/dialog/arrows.c42
-rw-r--r--contrib/dialog/buttons.c23
-rw-r--r--contrib/dialog/calendar.c5
-rw-r--r--contrib/dialog/checklist.c26
-rw-r--r--contrib/dialog/columns.c4
-rwxr-xr-xcontrib/dialog/config.guess37
-rwxr-xr-xcontrib/dialog/config.sub75
-rwxr-xr-xcontrib/dialog/configure2189
-rw-r--r--contrib/dialog/configure.in3
-rw-r--r--contrib/dialog/dialog.133
-rw-r--r--contrib/dialog/dialog.3541
-rw-r--r--contrib/dialog/dialog.c60
-rw-r--r--contrib/dialog/dialog.h21
-rw-r--r--contrib/dialog/dlg_keys.h12
-rw-r--r--contrib/dialog/editbox.c6
-rw-r--r--contrib/dialog/formbox.c8
-rw-r--r--contrib/dialog/fselect.c6
-rw-r--r--contrib/dialog/guage.c210
-rw-r--r--contrib/dialog/help.c43
-rw-r--r--contrib/dialog/inputbox.c11
-rw-r--r--contrib/dialog/makefile.in3
-rw-r--r--contrib/dialog/menubox.c6
-rw-r--r--contrib/dialog/mixedgauge.c3
-rw-r--r--contrib/dialog/msgbox.c7
-rw-r--r--contrib/dialog/package/debian/changelog12
-rw-r--r--contrib/dialog/package/debian/control4
-rw-r--r--contrib/dialog/package/dialog.spec4
-rw-r--r--contrib/dialog/pause.c6
-rw-r--r--contrib/dialog/po/sk.po111
-rw-r--r--contrib/dialog/prgbox.c7
-rw-r--r--contrib/dialog/progressbox.c4
-rw-r--r--contrib/dialog/rc.c15
-rw-r--r--contrib/dialog/samples/valgrind.log847
-rw-r--r--contrib/dialog/tailbox.c4
-rw-r--r--contrib/dialog/textbox.c9
-rw-r--r--contrib/dialog/timebox.c4
-rw-r--r--contrib/dialog/trace.c4
-rw-r--r--contrib/dialog/ui_getc.c168
-rw-r--r--contrib/dialog/util.c429
-rw-r--r--contrib/dialog/yesno.c6
-rw-r--r--contrib/gcc/c-decl.c2
-rw-r--r--contrib/gcc/c.opt4
-rw-r--r--contrib/gcc/common.opt4
-rw-r--r--contrib/gcc/tree-nested.c6
-rw-r--r--contrib/llvm/include/llvm-c/Core.h34
-rw-r--r--contrib/llvm/include/llvm-c/Target.h12
-rw-r--r--contrib/llvm/include/llvm-c/Transforms/IPO.h3
-rw-r--r--contrib/llvm/include/llvm/ADT/APFloat.h2
-rw-r--r--contrib/llvm/include/llvm/ADT/APInt.h7
-rw-r--r--contrib/llvm/include/llvm/ADT/ArrayRef.h38
-rw-r--r--contrib/llvm/include/llvm/ADT/ImmutableList.h8
-rw-r--r--contrib/llvm/include/llvm/ADT/PackedVector.h2
-rw-r--r--contrib/llvm/include/llvm/ADT/SmallVector.h9
-rw-r--r--contrib/llvm/include/llvm/ADT/StringMap.h21
-rw-r--r--contrib/llvm/include/llvm/ADT/Triple.h20
-rw-r--r--contrib/llvm/include/llvm/AbstractTypeUser.h205
-rw-r--r--contrib/llvm/include/llvm/Analysis/BlockFrequency.h53
-rw-r--r--contrib/llvm/include/llvm/Analysis/BlockFrequencyImpl.h349
-rw-r--r--contrib/llvm/include/llvm/Analysis/BranchProbabilityInfo.h13
-rw-r--r--contrib/llvm/include/llvm/Analysis/DIBuilder.h3
-rw-r--r--contrib/llvm/include/llvm/Analysis/IVUsers.h16
-rw-r--r--contrib/llvm/include/llvm/Analysis/MemoryDependenceAnalysis.h11
-rw-r--r--contrib/llvm/include/llvm/Analysis/Passes.h7
-rw-r--r--contrib/llvm/include/llvm/Analysis/ScalarEvolutionExpander.h10
-rw-r--r--contrib/llvm/include/llvm/Analysis/ValueTracking.h16
-rw-r--r--contrib/llvm/include/llvm/Assembly/Writer.h40
-rw-r--r--contrib/llvm/include/llvm/Attributes.h5
-rw-r--r--contrib/llvm/include/llvm/BasicBlock.h12
-rw-r--r--contrib/llvm/include/llvm/Bitcode/BitstreamReader.h7
-rw-r--r--contrib/llvm/include/llvm/Bitcode/LLVMBitCodes.h100
-rw-r--r--contrib/llvm/include/llvm/CodeGen/Analysis.h7
-rw-r--r--contrib/llvm/include/llvm/CodeGen/AsmPrinter.h4
-rw-r--r--contrib/llvm/include/llvm/CodeGen/FunctionLoweringInfo.h3
-rw-r--r--contrib/llvm/include/llvm/CodeGen/ISDOpcodes.h5
-rw-r--r--contrib/llvm/include/llvm/CodeGen/LinkAllCodegenComponents.h2
-rw-r--r--contrib/llvm/include/llvm/CodeGen/MachineBasicBlock.h44
-rw-r--r--contrib/llvm/include/llvm/CodeGen/MachineBlockFrequency.h53
-rw-r--r--contrib/llvm/include/llvm/CodeGen/MachineBranchProbabilityInfo.h78
-rw-r--r--contrib/llvm/include/llvm/CodeGen/MachineFunction.h2
-rw-r--r--contrib/llvm/include/llvm/CodeGen/MachineInstr.h42
-rw-r--r--contrib/llvm/include/llvm/CodeGen/MachineInstrBuilder.h31
-rw-r--r--contrib/llvm/include/llvm/CodeGen/MachineOperand.h16
-rw-r--r--contrib/llvm/include/llvm/CodeGen/MachineRegisterInfo.h20
-rw-r--r--contrib/llvm/include/llvm/CodeGen/Passes.h11
-rw-r--r--contrib/llvm/include/llvm/CodeGen/RegAllocPBQP.h3
-rw-r--r--contrib/llvm/include/llvm/CodeGen/RegisterCoalescer.h244
-rw-r--r--contrib/llvm/include/llvm/CodeGen/RuntimeLibcalls.h9
-rw-r--r--contrib/llvm/include/llvm/CodeGen/ScheduleDAG.h16
-rw-r--r--contrib/llvm/include/llvm/CodeGen/ScoreboardHazardRecognizer.h1
-rw-r--r--contrib/llvm/include/llvm/CodeGen/SelectionDAG.h10
-rw-r--r--contrib/llvm/include/llvm/CodeGen/SelectionDAGNodes.h27
-rw-r--r--contrib/llvm/include/llvm/CodeGen/SlotIndexes.h3
-rw-r--r--contrib/llvm/include/llvm/CodeGen/TargetLoweringObjectFileImpl.h6
-rw-r--r--contrib/llvm/include/llvm/CodeGen/ValueTypes.h6
-rw-r--r--contrib/llvm/include/llvm/CodeGen/ValueTypes.td5
-rw-r--r--contrib/llvm/include/llvm/Constant.h4
-rw-r--r--contrib/llvm/include/llvm/Constants.h160
-rw-r--r--contrib/llvm/include/llvm/DefaultPasses.h1
-rw-r--r--contrib/llvm/include/llvm/DerivedTypes.h325
-rw-r--r--contrib/llvm/include/llvm/ExecutionEngine/RuntimeDyld.h1
-rw-r--r--contrib/llvm/include/llvm/Function.h10
-rw-r--r--contrib/llvm/include/llvm/GlobalAlias.h15
-rw-r--r--contrib/llvm/include/llvm/GlobalValue.h12
-rw-r--r--contrib/llvm/include/llvm/GlobalVariable.h7
-rw-r--r--contrib/llvm/include/llvm/InitializePasses.h13
-rw-r--r--contrib/llvm/include/llvm/InlineAsm.h39
-rw-r--r--contrib/llvm/include/llvm/Instructions.h495
-rw-r--r--contrib/llvm/include/llvm/Intrinsics.h9
-rw-r--r--contrib/llvm/include/llvm/Intrinsics.td16
-rw-r--r--contrib/llvm/include/llvm/LLVMContext.h3
-rw-r--r--contrib/llvm/include/llvm/LinkAllPasses.h6
-rw-r--r--contrib/llvm/include/llvm/MC/MCAsmInfo.h34
-rw-r--r--contrib/llvm/include/llvm/MC/MCContext.h13
-rw-r--r--contrib/llvm/include/llvm/MC/MCInstrDesc.h (renamed from contrib/llvm/include/llvm/Target/TargetInstrDesc.h)154
-rw-r--r--contrib/llvm/include/llvm/MC/MCInstrInfo.h51
-rw-r--r--contrib/llvm/include/llvm/MC/MCInstrItineraries.h (renamed from contrib/llvm/include/llvm/Target/TargetInstrItineraries.h)6
-rw-r--r--contrib/llvm/include/llvm/MC/MCMachObjectWriter.h192
-rw-r--r--contrib/llvm/include/llvm/MC/MCObjectStreamer.h3
-rw-r--r--contrib/llvm/include/llvm/MC/MCParser/MCParsedAsmOperand.h14
-rw-r--r--contrib/llvm/include/llvm/MC/MCRegisterInfo.h129
-rw-r--r--contrib/llvm/include/llvm/MC/MCStreamer.h6
-rw-r--r--contrib/llvm/include/llvm/MC/MCSubtargetInfo.h79
-rw-r--r--contrib/llvm/include/llvm/MC/SubtargetFeature.h (renamed from contrib/llvm/include/llvm/Target/SubtargetFeature.h)46
-rw-r--r--contrib/llvm/include/llvm/Module.h76
-rw-r--r--contrib/llvm/include/llvm/Object/Binary.h67
-rw-r--r--contrib/llvm/include/llvm/Object/COFF.h117
-rw-r--r--contrib/llvm/include/llvm/Object/Error.h50
-rw-r--r--contrib/llvm/include/llvm/Object/ObjectFile.h178
-rw-r--r--contrib/llvm/include/llvm/Support/BranchProbability.h16
-rw-r--r--contrib/llvm/include/llvm/Support/CFG.h16
-rw-r--r--contrib/llvm/include/llvm/Support/ConstantFolder.h10
-rw-r--r--contrib/llvm/include/llvm/Support/DebugLoc.h7
-rw-r--r--contrib/llvm/include/llvm/Support/ELF.h8
-rw-r--r--contrib/llvm/include/llvm/Support/Endian.h1
-rw-r--r--contrib/llvm/include/llvm/Support/IRBuilder.h135
-rw-r--r--contrib/llvm/include/llvm/Support/NoFolder.h12
-rw-r--r--contrib/llvm/include/llvm/Support/PassManagerBuilder.h13
-rw-r--r--contrib/llvm/include/llvm/Support/TargetFolder.h11
-rw-r--r--contrib/llvm/include/llvm/Support/TypeBuilder.h75
-rw-r--r--contrib/llvm/include/llvm/Support/system_error.h4
-rw-r--r--contrib/llvm/include/llvm/Target/Target.td169
-rw-r--r--contrib/llvm/include/llvm/Target/TargetAsmInfo.h31
-rw-r--r--contrib/llvm/include/llvm/Target/TargetAsmParser.h13
-rw-r--r--contrib/llvm/include/llvm/Target/TargetData.h8
-rw-r--r--contrib/llvm/include/llvm/Target/TargetFrameLowering.h10
-rw-r--r--contrib/llvm/include/llvm/Target/TargetInstrInfo.h51
-rw-r--r--contrib/llvm/include/llvm/Target/TargetLowering.h13
-rw-r--r--contrib/llvm/include/llvm/Target/TargetLoweringObjectFile.h9
-rw-r--r--contrib/llvm/include/llvm/Target/TargetMachine.h50
-rw-r--r--contrib/llvm/include/llvm/Target/TargetOpcodes.h4
-rw-r--r--contrib/llvm/include/llvm/Target/TargetOptions.h4
-rw-r--r--contrib/llvm/include/llvm/Target/TargetRegisterInfo.h224
-rw-r--r--contrib/llvm/include/llvm/Target/TargetRegistry.h284
-rw-r--r--contrib/llvm/include/llvm/Target/TargetSelect.h48
-rw-r--r--contrib/llvm/include/llvm/Target/TargetSelectionDAG.td5
-rw-r--r--contrib/llvm/include/llvm/Target/TargetSubtargetInfo.h (renamed from contrib/llvm/include/llvm/Target/TargetSubtarget.h)21
-rw-r--r--contrib/llvm/include/llvm/Transforms/IPO.h7
-rw-r--r--contrib/llvm/include/llvm/Transforms/Scalar.h26
-rw-r--r--contrib/llvm/include/llvm/Transforms/Utils/Cloning.h6
-rw-r--r--contrib/llvm/include/llvm/Transforms/Utils/SSAUpdater.h9
-rw-r--r--contrib/llvm/include/llvm/Transforms/Utils/ValueMapper.h34
-rw-r--r--contrib/llvm/include/llvm/Type.h382
-rw-r--r--contrib/llvm/include/llvm/TypeSymbolTable.h152
-rw-r--r--contrib/llvm/include/llvm/Use.h19
-rw-r--r--contrib/llvm/include/llvm/Value.h27
-rw-r--r--contrib/llvm/lib/Analysis/Analysis.cpp1
-rw-r--r--contrib/llvm/lib/Analysis/BlockFrequency.cpp59
-rw-r--r--contrib/llvm/lib/Analysis/BranchProbabilityInfo.cpp14
-rw-r--r--contrib/llvm/lib/Analysis/ConstantFolding.cpp6
-rw-r--r--contrib/llvm/lib/Analysis/DIBuilder.cpp14
-rw-r--r--contrib/llvm/lib/Analysis/DebugInfo.cpp36
-rw-r--r--contrib/llvm/lib/Analysis/IPA/FindUsedTypes.cpp4
-rw-r--r--contrib/llvm/lib/Analysis/IVUsers.cpp47
-rw-r--r--contrib/llvm/lib/Analysis/InstructionSimplify.cpp8
-rw-r--r--contrib/llvm/lib/Analysis/Lint.cpp7
-rw-r--r--contrib/llvm/lib/Analysis/MemDepPrinter.cpp29
-rw-r--r--contrib/llvm/lib/Analysis/MemoryBuiltins.cpp11
-rw-r--r--contrib/llvm/lib/Analysis/MemoryDependenceAnalysis.cpp63
-rw-r--r--contrib/llvm/lib/Analysis/ScalarEvolutionExpander.cpp37
-rw-r--r--contrib/llvm/lib/Analysis/ValueTracking.cpp75
-rw-r--r--contrib/llvm/lib/AsmParser/LLLexer.cpp48
-rw-r--r--contrib/llvm/lib/AsmParser/LLLexer.h4
-rw-r--r--contrib/llvm/lib/AsmParser/LLParser.cpp891
-rw-r--r--contrib/llvm/lib/AsmParser/LLParser.h97
-rw-r--r--contrib/llvm/lib/AsmParser/LLToken.h6
-rw-r--r--contrib/llvm/lib/Bitcode/Reader/BitcodeReader.cpp571
-rw-r--r--contrib/llvm/lib/Bitcode/Reader/BitcodeReader.h28
-rw-r--r--contrib/llvm/lib/Bitcode/Writer/BitcodeWriter.cpp199
-rw-r--r--contrib/llvm/lib/Bitcode/Writer/ValueEnumerator.cpp114
-rw-r--r--contrib/llvm/lib/Bitcode/Writer/ValueEnumerator.h3
-rw-r--r--contrib/llvm/lib/CodeGen/AggressiveAntiDepBreaker.cpp31
-rw-r--r--contrib/llvm/lib/CodeGen/AggressiveAntiDepBreaker.h17
-rw-r--r--contrib/llvm/lib/CodeGen/AllocationOrder.cpp18
-rw-r--r--contrib/llvm/lib/CodeGen/AsmPrinter/AsmPrinter.cpp44
-rw-r--r--contrib/llvm/lib/CodeGen/AsmPrinter/AsmPrinterInlineAsm.cpp12
-rw-r--r--contrib/llvm/lib/CodeGen/AsmPrinter/DwarfCompileUnit.cpp2
-rw-r--r--contrib/llvm/lib/CodeGen/AsmPrinter/DwarfCompileUnit.h2
-rw-r--r--contrib/llvm/lib/CodeGen/AsmPrinter/DwarfDebug.cpp303
-rw-r--r--contrib/llvm/lib/CodeGen/AsmPrinter/DwarfDebug.h48
-rw-r--r--contrib/llvm/lib/CodeGen/AsmPrinter/DwarfException.cpp111
-rw-r--r--contrib/llvm/lib/CodeGen/BranchFolding.cpp66
-rw-r--r--contrib/llvm/lib/CodeGen/BranchFolding.h4
-rw-r--r--contrib/llvm/lib/CodeGen/CalcSpillWeights.cpp6
-rw-r--r--contrib/llvm/lib/CodeGen/CodeGen.cpp4
-rw-r--r--contrib/llvm/lib/CodeGen/CriticalAntiDepBreaker.cpp18
-rw-r--r--contrib/llvm/lib/CodeGen/CriticalAntiDepBreaker.h5
-rw-r--r--contrib/llvm/lib/CodeGen/DeadMachineInstructionElim.cpp11
-rw-r--r--contrib/llvm/lib/CodeGen/DwarfEHPrepare.cpp7
-rw-r--r--contrib/llvm/lib/CodeGen/ELFWriter.cpp4
-rw-r--r--contrib/llvm/lib/CodeGen/ELFWriter.h2
-rw-r--r--contrib/llvm/lib/CodeGen/EdgeBundles.cpp2
-rw-r--r--contrib/llvm/lib/CodeGen/ExpandISelPseudos.cpp4
-rw-r--r--contrib/llvm/lib/CodeGen/IfConversion.cpp76
-rw-r--r--contrib/llvm/lib/CodeGen/InlineSpiller.cpp36
-rw-r--r--contrib/llvm/lib/CodeGen/InterferenceCache.cpp17
-rw-r--r--contrib/llvm/lib/CodeGen/InterferenceCache.h51
-rw-r--r--contrib/llvm/lib/CodeGen/IntrinsicLowering.cpp18
-rw-r--r--contrib/llvm/lib/CodeGen/LLVMTargetMachine.cpp48
-rw-r--r--contrib/llvm/lib/CodeGen/LiveDebugVariables.cpp2
-rw-r--r--contrib/llvm/lib/CodeGen/LiveIntervalUnion.cpp6
-rw-r--r--contrib/llvm/lib/CodeGen/LiveIntervalUnion.h3
-rw-r--r--contrib/llvm/lib/CodeGen/LiveRangeEdit.cpp6
-rw-r--r--contrib/llvm/lib/CodeGen/MachineBasicBlock.cpp94
-rw-r--r--contrib/llvm/lib/CodeGen/MachineBlockFrequency.cpp59
-rw-r--r--contrib/llvm/lib/CodeGen/MachineBranchProbabilityInfo.cpp113
-rw-r--r--contrib/llvm/lib/CodeGen/MachineCSE.cpp6
-rw-r--r--contrib/llvm/lib/CodeGen/MachineFunction.cpp4
-rw-r--r--contrib/llvm/lib/CodeGen/MachineInstr.cpp168
-rw-r--r--contrib/llvm/lib/CodeGen/MachineLICM.cpp8
-rw-r--r--contrib/llvm/lib/CodeGen/MachineRegisterInfo.cpp14
-rw-r--r--contrib/llvm/lib/CodeGen/MachineVerifier.cpp41
-rw-r--r--contrib/llvm/lib/CodeGen/PeepholeOptimizer.cpp12
-rw-r--r--contrib/llvm/lib/CodeGen/PostRASchedulerList.cpp36
-rw-r--r--contrib/llvm/lib/CodeGen/PreAllocSplitting.cpp1430
-rw-r--r--contrib/llvm/lib/CodeGen/PrologEpilogInserter.cpp10
-rw-r--r--contrib/llvm/lib/CodeGen/RegAllocBasic.cpp30
-rw-r--r--contrib/llvm/lib/CodeGen/RegAllocFast.cpp65
-rw-r--r--contrib/llvm/lib/CodeGen/RegAllocGreedy.cpp579
-rw-r--r--contrib/llvm/lib/CodeGen/RegAllocLinearScan.cpp63
-rw-r--r--contrib/llvm/lib/CodeGen/RegAllocPBQP.cpp26
-rw-r--r--contrib/llvm/lib/CodeGen/RegisterClassInfo.cpp10
-rw-r--r--contrib/llvm/lib/CodeGen/RegisterClassInfo.h2
-rw-r--r--contrib/llvm/lib/CodeGen/RegisterCoalescer.cpp1658
-rw-r--r--contrib/llvm/lib/CodeGen/RegisterCoalescer.h (renamed from contrib/llvm/lib/CodeGen/SimpleRegisterCoalescing.h)167
-rw-r--r--contrib/llvm/lib/CodeGen/RenderMachineFunction.cpp6
-rw-r--r--contrib/llvm/lib/CodeGen/ScheduleDAG.cpp14
-rw-r--r--contrib/llvm/lib/CodeGen/ScheduleDAGEmit.cpp1
-rw-r--r--contrib/llvm/lib/CodeGen/ScheduleDAGInstrs.cpp37
-rw-r--r--contrib/llvm/lib/CodeGen/ScoreboardHazardRecognizer.cpp16
-rw-r--r--contrib/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp495
-rw-r--r--contrib/llvm/lib/CodeGen/SelectionDAG/FastISel.cpp35
-rw-r--r--contrib/llvm/lib/CodeGen/SelectionDAG/InstrEmitter.cpp67
-rw-r--r--contrib/llvm/lib/CodeGen/SelectionDAG/InstrEmitter.h8
-rw-r--r--contrib/llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp234
-rw-r--r--contrib/llvm/lib/CodeGen/SelectionDAG/LegalizeFloatTypes.cpp28
-rw-r--r--contrib/llvm/lib/CodeGen/SelectionDAG/LegalizeIntegerTypes.cpp164
-rw-r--r--contrib/llvm/lib/CodeGen/SelectionDAG/LegalizeTypes.h5
-rw-r--r--contrib/llvm/lib/CodeGen/SelectionDAG/LegalizeVectorOps.cpp2
-rw-r--r--contrib/llvm/lib/CodeGen/SelectionDAG/LegalizeVectorTypes.cpp2
-rw-r--r--contrib/llvm/lib/CodeGen/SelectionDAG/ScheduleDAGFast.cpp25
-rw-r--r--contrib/llvm/lib/CodeGen/SelectionDAG/ScheduleDAGRRList.cpp165
-rw-r--r--contrib/llvm/lib/CodeGen/SelectionDAG/ScheduleDAGSDNodes.cpp32
-rw-r--r--contrib/llvm/lib/CodeGen/SelectionDAG/ScheduleDAGSDNodes.h8
-rw-r--r--contrib/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp74
-rw-r--r--contrib/llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp254
-rw-r--r--contrib/llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.h5
-rw-r--r--contrib/llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp27
-rw-r--r--contrib/llvm/lib/CodeGen/SelectionDAG/TargetLowering.cpp78
-rw-r--r--contrib/llvm/lib/CodeGen/ShadowStackGC.cpp62
-rw-r--r--contrib/llvm/lib/CodeGen/SimpleRegisterCoalescing.cpp1539
-rw-r--r--contrib/llvm/lib/CodeGen/SjLjEHPrepare.cpp8
-rw-r--r--contrib/llvm/lib/CodeGen/SplitKit.cpp295
-rw-r--r--contrib/llvm/lib/CodeGen/SplitKit.h46
-rw-r--r--contrib/llvm/lib/CodeGen/Splitter.cpp2
-rw-r--r--contrib/llvm/lib/CodeGen/StackProtector.cpp2
-rw-r--r--contrib/llvm/lib/CodeGen/StackSlotColoring.cpp8
-rw-r--r--contrib/llvm/lib/CodeGen/TailDuplication.cpp427
-rw-r--r--contrib/llvm/lib/CodeGen/TargetInstrInfoImpl.cpp24
-rw-r--r--contrib/llvm/lib/CodeGen/TargetLoweringObjectFileImpl.cpp62
-rw-r--r--contrib/llvm/lib/CodeGen/TwoAddressInstructionPass.cpp40
-rw-r--r--contrib/llvm/lib/CodeGen/VirtRegMap.h5
-rw-r--r--contrib/llvm/lib/CodeGen/VirtRegRewriter.cpp20
-rw-r--r--contrib/llvm/lib/ExecutionEngine/Interpreter/ExternalFunctions.cpp5
-rw-r--r--contrib/llvm/lib/ExecutionEngine/JIT/JIT.cpp3
-rw-r--r--contrib/llvm/lib/ExecutionEngine/RuntimeDyld/RuntimeDyld.cpp615
-rw-r--r--contrib/llvm/lib/ExecutionEngine/RuntimeDyld/RuntimeDyldImpl.h152
-rw-r--r--contrib/llvm/lib/ExecutionEngine/RuntimeDyld/RuntimeDyldMachO.cpp524
-rw-r--r--contrib/llvm/lib/ExecutionEngine/TargetSelect.cpp7
-rw-r--r--contrib/llvm/lib/Linker/LinkModules.cpp1816
-rw-r--r--contrib/llvm/lib/MC/MCAsmInfo.cpp4
-rw-r--r--contrib/llvm/lib/MC/MCAsmStreamer.cpp31
-rw-r--r--contrib/llvm/lib/MC/MCDisassembler/Disassembler.cpp9
-rw-r--r--contrib/llvm/lib/MC/MCDisassembler/EDDisassembler.cpp22
-rw-r--r--contrib/llvm/lib/MC/MCDisassembler/EDDisassembler.h1
-rw-r--r--contrib/llvm/lib/MC/MCDisassembler/EDInfo.h19
-rw-r--r--contrib/llvm/lib/MC/MCDisassembler/EDOperand.cpp21
-rw-r--r--contrib/llvm/lib/MC/MCDwarf.cpp324
-rw-r--r--contrib/llvm/lib/MC/MCELFStreamer.cpp1
-rw-r--r--contrib/llvm/lib/MC/MCELFStreamer.h134
-rw-r--r--contrib/llvm/lib/MC/MCLoggingStreamer.cpp6
-rw-r--r--contrib/llvm/lib/MC/MCMachOStreamer.cpp1
-rw-r--r--contrib/llvm/lib/MC/MCNullStreamer.cpp3
-rw-r--r--contrib/llvm/lib/MC/MCObjectStreamer.cpp5
-rw-r--r--contrib/llvm/lib/MC/MCParser/AsmParser.cpp49
-rw-r--r--contrib/llvm/lib/MC/MCParser/COFFAsmParser.cpp6
-rw-r--r--contrib/llvm/lib/MC/MCParser/MCAsmParser.cpp6
-rw-r--r--contrib/llvm/lib/MC/MCParser/TargetAsmParser.cpp4
-rw-r--r--contrib/llvm/lib/MC/MCStreamer.cpp3
-rw-r--r--contrib/llvm/lib/MC/MCSubtargetInfo.cpp96
-rw-r--r--contrib/llvm/lib/MC/MCWin64EH.cpp10
-rw-r--r--contrib/llvm/lib/MC/MachObjectWriter.cpp2111
-rw-r--r--contrib/llvm/lib/MC/SubtargetFeature.cpp (renamed from contrib/llvm/lib/Target/SubtargetFeature.cpp)169
-rw-r--r--contrib/llvm/lib/Object/Binary.cpp96
-rw-r--r--contrib/llvm/lib/Object/COFFObjectFile.cpp433
-rw-r--r--contrib/llvm/lib/Object/ELFObjectFile.cpp214
-rw-r--r--contrib/llvm/lib/Object/Error.cpp57
-rw-r--r--contrib/llvm/lib/Object/MachOObjectFile.cpp278
-rw-r--r--contrib/llvm/lib/Object/Object.cpp21
-rw-r--r--contrib/llvm/lib/Object/ObjectFile.cpp14
-rw-r--r--contrib/llvm/lib/Support/APFloat.cpp18
-rw-r--r--contrib/llvm/lib/Support/APInt.cpp37
-rw-r--r--contrib/llvm/lib/Support/Atomic.cpp10
-rw-r--r--contrib/llvm/lib/Support/CommandLine.cpp6
-rw-r--r--contrib/llvm/lib/Support/ConstantRange.cpp4
-rw-r--r--contrib/llvm/lib/Support/Host.cpp7
-rw-r--r--contrib/llvm/lib/Support/Threading.cpp6
-rw-r--r--contrib/llvm/lib/Support/Triple.cpp6
-rw-r--r--contrib/llvm/lib/Support/Twine.cpp11
-rw-r--r--contrib/llvm/lib/Support/Unix/Path.inc3
-rw-r--r--contrib/llvm/lib/Support/Windows/DynamicLibrary.inc2
-rw-r--r--contrib/llvm/lib/Support/Windows/explicit_symbols.inc4
-rw-r--r--contrib/llvm/lib/Target/ARM/ARM.h25
-rw-r--r--contrib/llvm/lib/Target/ARM/ARM.td154
-rw-r--r--contrib/llvm/lib/Target/ARM/ARMAsmBackend.cpp34
-rw-r--r--contrib/llvm/lib/Target/ARM/ARMAsmPrinter.cpp177
-rw-r--r--contrib/llvm/lib/Target/ARM/ARMAsmPrinter.h12
-rw-r--r--contrib/llvm/lib/Target/ARM/ARMBaseInfo.h10
-rw-r--r--contrib/llvm/lib/Target/ARM/ARMBaseInstrInfo.cpp183
-rw-r--r--contrib/llvm/lib/Target/ARM/ARMBaseInstrInfo.h47
-rw-r--r--contrib/llvm/lib/Target/ARM/ARMBaseRegisterInfo.cpp88
-rw-r--r--contrib/llvm/lib/Target/ARM/ARMBaseRegisterInfo.h11
-rw-r--r--contrib/llvm/lib/Target/ARM/ARMCodeEmitter.cpp150
-rw-r--r--contrib/llvm/lib/Target/ARM/ARMConstantIslandPass.cpp17
-rw-r--r--contrib/llvm/lib/Target/ARM/ARMExpandPseudoInsts.cpp28
-rw-r--r--contrib/llvm/lib/Target/ARM/ARMFastISel.cpp34
-rw-r--r--contrib/llvm/lib/Target/ARM/ARMFrameLowering.cpp80
-rw-r--r--contrib/llvm/lib/Target/ARM/ARMGlobalMerge.cpp10
-rw-r--r--contrib/llvm/lib/Target/ARM/ARMHazardRecognizer.cpp20
-rw-r--r--contrib/llvm/lib/Target/ARM/ARMISelDAGToDAG.cpp41
-rw-r--r--contrib/llvm/lib/Target/ARM/ARMISelLowering.cpp417
-rw-r--r--contrib/llvm/lib/Target/ARM/ARMISelLowering.h4
-rw-r--r--contrib/llvm/lib/Target/ARM/ARMInstrFormats.td241
-rw-r--r--contrib/llvm/lib/Target/ARM/ARMInstrInfo.cpp1
-rw-r--r--contrib/llvm/lib/Target/ARM/ARMInstrInfo.td605
-rw-r--r--contrib/llvm/lib/Target/ARM/ARMInstrNEON.td40
-rw-r--r--contrib/llvm/lib/Target/ARM/ARMInstrThumb.td360
-rw-r--r--contrib/llvm/lib/Target/ARM/ARMInstrThumb2.td561
-rw-r--r--contrib/llvm/lib/Target/ARM/ARMInstrVFP.td27
-rw-r--r--contrib/llvm/lib/Target/ARM/ARMLoadStoreOptimizer.cpp34
-rw-r--r--contrib/llvm/lib/Target/ARM/ARMMCCodeEmitter.cpp75
-rw-r--r--contrib/llvm/lib/Target/ARM/ARMMCInstLower.cpp118
-rw-r--r--contrib/llvm/lib/Target/ARM/ARMMachObjectWriter.cpp389
-rw-r--r--contrib/llvm/lib/Target/ARM/ARMRegisterInfo.td305
-rw-r--r--contrib/llvm/lib/Target/ARM/ARMSubtarget.cpp136
-rw-r--r--contrib/llvm/lib/Target/ARM/ARMSubtarget.h95
-rw-r--r--contrib/llvm/lib/Target/ARM/ARMTargetMachine.cpp32
-rw-r--r--contrib/llvm/lib/Target/ARM/ARMTargetMachine.h6
-rw-r--r--contrib/llvm/lib/Target/ARM/AsmParser/ARMAsmLexer.cpp6
-rw-r--r--contrib/llvm/lib/Target/ARM/AsmParser/ARMAsmParser.cpp340
-rw-r--r--contrib/llvm/lib/Target/ARM/Disassembler/ARMDisassemblerCore.cpp179
-rw-r--r--contrib/llvm/lib/Target/ARM/Disassembler/ThumbDisassemblerCore.h78
-rw-r--r--contrib/llvm/lib/Target/ARM/InstPrinter/ARMInstPrinter.cpp34
-rw-r--r--contrib/llvm/lib/Target/ARM/InstPrinter/ARMInstPrinter.h5
-rw-r--r--contrib/llvm/lib/Target/ARM/MCTargetDesc/ARMMCAsmInfo.cpp (renamed from contrib/llvm/lib/Target/ARM/ARMMCAsmInfo.cpp)0
-rw-r--r--contrib/llvm/lib/Target/ARM/MCTargetDesc/ARMMCAsmInfo.h (renamed from contrib/llvm/lib/Target/ARM/ARMMCAsmInfo.h)0
-rw-r--r--contrib/llvm/lib/Target/ARM/MCTargetDesc/ARMMCTargetDesc.cpp144
-rw-r--r--contrib/llvm/lib/Target/ARM/MCTargetDesc/ARMMCTargetDesc.h52
-rw-r--r--contrib/llvm/lib/Target/ARM/MCTargetDesc/CMakeLists.txt7
-rw-r--r--contrib/llvm/lib/Target/ARM/MCTargetDesc/Makefile16
-rw-r--r--contrib/llvm/lib/Target/ARM/MLxExpansionPass.cpp26
-rw-r--r--contrib/llvm/lib/Target/ARM/NEONMoveFix.cpp5
-rw-r--r--contrib/llvm/lib/Target/ARM/Thumb1FrameLowering.cpp23
-rw-r--r--contrib/llvm/lib/Target/ARM/Thumb1InstrInfo.cpp19
-rw-r--r--contrib/llvm/lib/Target/ARM/Thumb1RegisterInfo.cpp48
-rw-r--r--contrib/llvm/lib/Target/ARM/Thumb2ITBlockPass.cpp3
-rw-r--r--contrib/llvm/lib/Target/ARM/Thumb2InstrInfo.cpp43
-rw-r--r--contrib/llvm/lib/Target/ARM/Thumb2SizeReduction.cpp148
-rw-r--r--contrib/llvm/lib/Target/Alpha/Alpha.h12
-rw-r--r--contrib/llvm/lib/Target/Alpha/AlphaISelLowering.cpp44
-rw-r--r--contrib/llvm/lib/Target/Alpha/AlphaISelLowering.h6
-rw-r--r--contrib/llvm/lib/Target/Alpha/AlphaInstrInfo.cpp12
-rw-r--r--contrib/llvm/lib/Target/Alpha/AlphaInstrInfo.h5
-rw-r--r--contrib/llvm/lib/Target/Alpha/AlphaRegisterInfo.cpp10
-rw-r--r--contrib/llvm/lib/Target/Alpha/AlphaRegisterInfo.h4
-rw-r--r--contrib/llvm/lib/Target/Alpha/AlphaRegisterInfo.td19
-rw-r--r--contrib/llvm/lib/Target/Alpha/AlphaSubtarget.cpp23
-rw-r--r--contrib/llvm/lib/Target/Alpha/AlphaSubtarget.h19
-rw-r--r--contrib/llvm/lib/Target/Alpha/AlphaTargetMachine.cpp7
-rw-r--r--contrib/llvm/lib/Target/Alpha/AlphaTargetMachine.h2
-rw-r--r--contrib/llvm/lib/Target/Alpha/MCTargetDesc/AlphaMCAsmInfo.cpp (renamed from contrib/llvm/lib/Target/Alpha/AlphaMCAsmInfo.cpp)0
-rw-r--r--contrib/llvm/lib/Target/Alpha/MCTargetDesc/AlphaMCAsmInfo.h (renamed from contrib/llvm/lib/Target/Alpha/AlphaMCAsmInfo.h)0
-rw-r--r--contrib/llvm/lib/Target/Alpha/MCTargetDesc/AlphaMCTargetDesc.cpp57
-rw-r--r--contrib/llvm/lib/Target/Alpha/MCTargetDesc/AlphaMCTargetDesc.h40
-rw-r--r--contrib/llvm/lib/Target/Alpha/MCTargetDesc/CMakeLists.txt4
-rw-r--r--contrib/llvm/lib/Target/Alpha/MCTargetDesc/Makefile16
-rw-r--r--contrib/llvm/lib/Target/Blackfin/Blackfin.h9
-rw-r--r--contrib/llvm/lib/Target/Blackfin/BlackfinISelDAGToDAG.cpp12
-rw-r--r--contrib/llvm/lib/Target/Blackfin/BlackfinISelLowering.cpp34
-rw-r--r--contrib/llvm/lib/Target/Blackfin/BlackfinISelLowering.h3
-rw-r--r--contrib/llvm/lib/Target/Blackfin/BlackfinInstrInfo.cpp9
-rw-r--r--contrib/llvm/lib/Target/Blackfin/BlackfinInstrInfo.h5
-rw-r--r--contrib/llvm/lib/Target/Blackfin/BlackfinIntrinsicInfo.cpp2
-rw-r--r--contrib/llvm/lib/Target/Blackfin/BlackfinRegisterInfo.cpp11
-rw-r--r--contrib/llvm/lib/Target/Blackfin/BlackfinRegisterInfo.h4
-rw-r--r--contrib/llvm/lib/Target/Blackfin/BlackfinRegisterInfo.td111
-rw-r--r--contrib/llvm/lib/Target/Blackfin/BlackfinSubtarget.cpp18
-rw-r--r--contrib/llvm/lib/Target/Blackfin/BlackfinSubtarget.h16
-rw-r--r--contrib/llvm/lib/Target/Blackfin/BlackfinTargetMachine.cpp8
-rw-r--r--contrib/llvm/lib/Target/Blackfin/BlackfinTargetMachine.h2
-rw-r--r--contrib/llvm/lib/Target/Blackfin/MCTargetDesc/BlackfinMCAsmInfo.cpp (renamed from contrib/llvm/lib/Target/Blackfin/BlackfinMCAsmInfo.cpp)0
-rw-r--r--contrib/llvm/lib/Target/Blackfin/MCTargetDesc/BlackfinMCAsmInfo.h (renamed from contrib/llvm/lib/Target/Blackfin/BlackfinMCAsmInfo.h)0
-rw-r--r--contrib/llvm/lib/Target/Blackfin/MCTargetDesc/BlackfinMCTargetDesc.cpp60
-rw-r--r--contrib/llvm/lib/Target/Blackfin/MCTargetDesc/BlackfinMCTargetDesc.h38
-rw-r--r--contrib/llvm/lib/Target/Blackfin/MCTargetDesc/CMakeLists.txt4
-rw-r--r--contrib/llvm/lib/Target/Blackfin/MCTargetDesc/Makefile16
-rw-r--r--contrib/llvm/lib/Target/CBackend/CBackend.cpp413
-rw-r--r--contrib/llvm/lib/Target/CBackend/CTargetMachine.h5
-rw-r--r--contrib/llvm/lib/Target/CellSPU/MCTargetDesc/CMakeLists.txt4
-rw-r--r--contrib/llvm/lib/Target/CellSPU/MCTargetDesc/Makefile16
-rw-r--r--contrib/llvm/lib/Target/CellSPU/MCTargetDesc/SPUMCAsmInfo.cpp (renamed from contrib/llvm/lib/Target/CellSPU/SPUMCAsmInfo.cpp)2
-rw-r--r--contrib/llvm/lib/Target/CellSPU/MCTargetDesc/SPUMCAsmInfo.h (renamed from contrib/llvm/lib/Target/CellSPU/SPUMCAsmInfo.h)0
-rw-r--r--contrib/llvm/lib/Target/CellSPU/MCTargetDesc/SPUMCTargetDesc.cpp56
-rw-r--r--contrib/llvm/lib/Target/CellSPU/MCTargetDesc/SPUMCTargetDesc.h40
-rw-r--r--contrib/llvm/lib/Target/CellSPU/SPU.h6
-rw-r--r--contrib/llvm/lib/Target/CellSPU/SPUFrameLowering.cpp1
-rw-r--r--contrib/llvm/lib/Target/CellSPU/SPUISelDAGToDAG.cpp1
-rw-r--r--contrib/llvm/lib/Target/CellSPU/SPUISelLowering.cpp4
-rw-r--r--contrib/llvm/lib/Target/CellSPU/SPUInstrInfo.cpp10
-rw-r--r--contrib/llvm/lib/Target/CellSPU/SPUInstrInfo.h5
-rw-r--r--contrib/llvm/lib/Target/CellSPU/SPURegisterInfo.cpp10
-rw-r--r--contrib/llvm/lib/Target/CellSPU/SPURegisterInfo.h4
-rw-r--r--contrib/llvm/lib/Target/CellSPU/SPURegisterInfo.td140
-rw-r--r--contrib/llvm/lib/Target/CellSPU/SPURegisterNames.h3
-rw-r--r--contrib/llvm/lib/Target/CellSPU/SPUSubtarget.cpp23
-rw-r--r--contrib/llvm/lib/Target/CellSPU/SPUSubtarget.h21
-rw-r--r--contrib/llvm/lib/Target/CellSPU/SPUTargetMachine.cpp9
-rw-r--r--contrib/llvm/lib/Target/CellSPU/SPUTargetMachine.h2
-rw-r--r--contrib/llvm/lib/Target/CppBackend/CPPBackend.cpp249
-rw-r--r--contrib/llvm/lib/Target/CppBackend/CPPTargetMachine.h4
-rw-r--r--contrib/llvm/lib/Target/MBlaze/AsmParser/MBlazeAsmLexer.cpp3
-rw-r--r--contrib/llvm/lib/Target/MBlaze/AsmParser/MBlazeAsmParser.cpp9
-rw-r--r--contrib/llvm/lib/Target/MBlaze/Disassembler/MBlazeDisassembler.cpp5
-rw-r--r--contrib/llvm/lib/Target/MBlaze/InstPrinter/MBlazeInstPrinter.h3
-rw-r--r--contrib/llvm/lib/Target/MBlaze/MBlaze.h17
-rw-r--r--contrib/llvm/lib/Target/MBlaze/MBlazeAsmPrinter.cpp3
-rw-r--r--contrib/llvm/lib/Target/MBlaze/MBlazeDelaySlotFiller.cpp6
-rw-r--r--contrib/llvm/lib/Target/MBlaze/MBlazeISelLowering.cpp37
-rw-r--r--contrib/llvm/lib/Target/MBlaze/MBlazeISelLowering.h4
-rw-r--r--contrib/llvm/lib/Target/MBlaze/MBlazeInstrInfo.cpp7
-rw-r--r--contrib/llvm/lib/Target/MBlaze/MBlazeInstrInfo.h5
-rw-r--r--contrib/llvm/lib/Target/MBlaze/MBlazeIntrinsicInfo.cpp2
-rw-r--r--contrib/llvm/lib/Target/MBlaze/MBlazeMCCodeEmitter.cpp17
-rw-r--r--contrib/llvm/lib/Target/MBlaze/MBlazeRegisterInfo.cpp9
-rw-r--r--contrib/llvm/lib/Target/MBlaze/MBlazeRegisterInfo.h4
-rw-r--r--contrib/llvm/lib/Target/MBlaze/MBlazeRegisterInfo.td31
-rw-r--r--contrib/llvm/lib/Target/MBlaze/MBlazeSubtarget.cpp32
-rw-r--r--contrib/llvm/lib/Target/MBlaze/MBlazeSubtarget.h21
-rw-r--r--contrib/llvm/lib/Target/MBlaze/MBlazeTargetMachine.cpp18
-rw-r--r--contrib/llvm/lib/Target/MBlaze/MBlazeTargetMachine.h2
-rw-r--r--contrib/llvm/lib/Target/MBlaze/MCTargetDesc/CMakeLists.txt4
-rw-r--r--contrib/llvm/lib/Target/MBlaze/MCTargetDesc/MBlazeMCAsmInfo.cpp (renamed from contrib/llvm/lib/Target/MBlaze/MBlazeMCAsmInfo.cpp)2
-rw-r--r--contrib/llvm/lib/Target/MBlaze/MCTargetDesc/MBlazeMCAsmInfo.h (renamed from contrib/llvm/lib/Target/MBlaze/MBlazeMCAsmInfo.h)0
-rw-r--r--contrib/llvm/lib/Target/MBlaze/MCTargetDesc/MBlazeMCTargetDesc.cpp65
-rw-r--r--contrib/llvm/lib/Target/MBlaze/MCTargetDesc/MBlazeMCTargetDesc.h38
-rw-r--r--contrib/llvm/lib/Target/MBlaze/MCTargetDesc/Makefile16
-rw-r--r--contrib/llvm/lib/Target/MSP430/InstPrinter/MSP430InstPrinter.h3
-rw-r--r--contrib/llvm/lib/Target/MSP430/MCTargetDesc/CMakeLists.txt4
-rw-r--r--contrib/llvm/lib/Target/MSP430/MCTargetDesc/MSP430MCAsmInfo.cpp (renamed from contrib/llvm/lib/Target/MSP430/MSP430MCAsmInfo.cpp)2
-rw-r--r--contrib/llvm/lib/Target/MSP430/MCTargetDesc/MSP430MCAsmInfo.h (renamed from contrib/llvm/lib/Target/MSP430/MSP430MCAsmInfo.h)0
-rw-r--r--contrib/llvm/lib/Target/MSP430/MCTargetDesc/MSP430MCTargetDesc.cpp58
-rw-r--r--contrib/llvm/lib/Target/MSP430/MCTargetDesc/MSP430MCTargetDesc.h38
-rw-r--r--contrib/llvm/lib/Target/MSP430/MCTargetDesc/Makefile16
-rw-r--r--contrib/llvm/lib/Target/MSP430/MSP430.h10
-rw-r--r--contrib/llvm/lib/Target/MSP430/MSP430AsmPrinter.cpp5
-rw-r--r--contrib/llvm/lib/Target/MSP430/MSP430InstrInfo.cpp17
-rw-r--r--contrib/llvm/lib/Target/MSP430/MSP430InstrInfo.h5
-rw-r--r--contrib/llvm/lib/Target/MSP430/MSP430RegisterInfo.cpp14
-rw-r--r--contrib/llvm/lib/Target/MSP430/MSP430RegisterInfo.h4
-rw-r--r--contrib/llvm/lib/Target/MSP430/MSP430RegisterInfo.td8
-rw-r--r--contrib/llvm/lib/Target/MSP430/MSP430Subtarget.cpp17
-rw-r--r--contrib/llvm/lib/Target/MSP430/MSP430Subtarget.h16
-rw-r--r--contrib/llvm/lib/Target/MSP430/MSP430TargetMachine.cpp7
-rw-r--r--contrib/llvm/lib/Target/MSP430/MSP430TargetMachine.h2
-rw-r--r--contrib/llvm/lib/Target/Mips/InstPrinter/CMakeLists.txt6
-rw-r--r--contrib/llvm/lib/Target/Mips/InstPrinter/Makefile16
-rw-r--r--contrib/llvm/lib/Target/Mips/InstPrinter/MipsInstPrinter.cpp127
-rw-r--r--contrib/llvm/lib/Target/Mips/InstPrinter/MipsInstPrinter.h100
-rw-r--r--contrib/llvm/lib/Target/Mips/MCTargetDesc/CMakeLists.txt4
-rw-r--r--contrib/llvm/lib/Target/Mips/MCTargetDesc/Makefile16
-rw-r--r--contrib/llvm/lib/Target/Mips/MCTargetDesc/MipsMCAsmInfo.cpp (renamed from contrib/llvm/lib/Target/Mips/MipsMCAsmInfo.cpp)9
-rw-r--r--contrib/llvm/lib/Target/Mips/MCTargetDesc/MipsMCAsmInfo.h (renamed from contrib/llvm/lib/Target/Mips/MipsMCAsmInfo.h)0
-rw-r--r--contrib/llvm/lib/Target/Mips/MCTargetDesc/MipsMCTargetDesc.cpp58
-rw-r--r--contrib/llvm/lib/Target/Mips/MCTargetDesc/MipsMCTargetDesc.h39
-rw-r--r--contrib/llvm/lib/Target/Mips/Mips.h11
-rw-r--r--contrib/llvm/lib/Target/Mips/Mips.td8
-rw-r--r--contrib/llvm/lib/Target/Mips/MipsAsmPrinter.cpp140
-rw-r--r--contrib/llvm/lib/Target/Mips/MipsAsmPrinter.h71
-rw-r--r--contrib/llvm/lib/Target/Mips/MipsCallingConv.td4
-rw-r--r--contrib/llvm/lib/Target/Mips/MipsDelaySlotFiller.cpp6
-rw-r--r--contrib/llvm/lib/Target/Mips/MipsEmitGPRestore.cpp8
-rw-r--r--contrib/llvm/lib/Target/Mips/MipsExpandPseudo.cpp8
-rw-r--r--contrib/llvm/lib/Target/Mips/MipsISelDAGToDAG.cpp29
-rw-r--r--contrib/llvm/lib/Target/Mips/MipsISelLowering.cpp201
-rw-r--r--contrib/llvm/lib/Target/Mips/MipsISelLowering.h8
-rw-r--r--contrib/llvm/lib/Target/Mips/MipsInstrInfo.cpp62
-rw-r--r--contrib/llvm/lib/Target/Mips/MipsInstrInfo.h103
-rw-r--r--contrib/llvm/lib/Target/Mips/MipsInstrInfo.td29
-rw-r--r--contrib/llvm/lib/Target/Mips/MipsMCInstLower.cpp118
-rw-r--r--contrib/llvm/lib/Target/Mips/MipsMCInstLower.h43
-rw-r--r--contrib/llvm/lib/Target/Mips/MipsMCSymbolRefExpr.cpp63
-rw-r--r--contrib/llvm/lib/Target/Mips/MipsMCSymbolRefExpr.h62
-rw-r--r--contrib/llvm/lib/Target/Mips/MipsMachineFunction.h18
-rw-r--r--contrib/llvm/lib/Target/Mips/MipsRegisterInfo.cpp89
-rw-r--r--contrib/llvm/lib/Target/Mips/MipsRegisterInfo.h4
-rw-r--r--contrib/llvm/lib/Target/Mips/MipsRegisterInfo.td28
-rw-r--r--contrib/llvm/lib/Target/Mips/MipsSubtarget.cpp23
-rw-r--r--contrib/llvm/lib/Target/Mips/MipsSubtarget.h19
-rw-r--r--contrib/llvm/lib/Target/Mips/MipsTargetMachine.cpp14
-rw-r--r--contrib/llvm/lib/Target/Mips/MipsTargetMachine.h5
-rw-r--r--contrib/llvm/lib/Target/PTX/MCTargetDesc/CMakeLists.txt4
-rw-r--r--contrib/llvm/lib/Target/PTX/MCTargetDesc/Makefile16
-rw-r--r--contrib/llvm/lib/Target/PTX/MCTargetDesc/PTXMCAsmInfo.cpp (renamed from contrib/llvm/lib/Target/PTX/PTXMCAsmInfo.cpp)5
-rw-r--r--contrib/llvm/lib/Target/PTX/MCTargetDesc/PTXMCAsmInfo.h (renamed from contrib/llvm/lib/Target/PTX/PTXMCAsmInfo.h)0
-rw-r--r--contrib/llvm/lib/Target/PTX/MCTargetDesc/PTXMCTargetDesc.cpp60
-rw-r--r--contrib/llvm/lib/Target/PTX/MCTargetDesc/PTXMCTargetDesc.h38
-rw-r--r--contrib/llvm/lib/Target/PTX/PTX.h9
-rw-r--r--contrib/llvm/lib/Target/PTX/PTX.td89
-rw-r--r--contrib/llvm/lib/Target/PTX/PTXAsmPrinter.cpp238
-rw-r--r--contrib/llvm/lib/Target/PTX/PTXCallingConv.td29
-rw-r--r--contrib/llvm/lib/Target/PTX/PTXISelDAGToDAG.cpp36
-rw-r--r--contrib/llvm/lib/Target/PTX/PTXISelLowering.cpp291
-rw-r--r--contrib/llvm/lib/Target/PTX/PTXISelLowering.h11
-rw-r--r--contrib/llvm/lib/Target/PTX/PTXInstrFormats.td2
-rw-r--r--contrib/llvm/lib/Target/PTX/PTXInstrInfo.cpp107
-rw-r--r--contrib/llvm/lib/Target/PTX/PTXInstrInfo.h28
-rw-r--r--contrib/llvm/lib/Target/PTX/PTXInstrInfo.td871
-rw-r--r--contrib/llvm/lib/Target/PTX/PTXIntrinsicInstrInfo.td8
-rw-r--r--contrib/llvm/lib/Target/PTX/PTXMCAsmStreamer.cpp9
-rw-r--r--contrib/llvm/lib/Target/PTX/PTXMFInfoExtract.cpp6
-rw-r--r--contrib/llvm/lib/Target/PTX/PTXMachineFunctionInfo.h21
-rw-r--r--contrib/llvm/lib/Target/PTX/PTXRegisterInfo.cpp34
-rw-r--r--contrib/llvm/lib/Target/PTX/PTXRegisterInfo.h11
-rw-r--r--contrib/llvm/lib/Target/PTX/PTXRegisterInfo.td548
-rw-r--r--contrib/llvm/lib/Target/PTX/PTXSubtarget.cpp39
-rw-r--r--contrib/llvm/lib/Target/PTX/PTXSubtarget.h68
-rw-r--r--contrib/llvm/lib/Target/PTX/PTXTargetMachine.cpp15
-rw-r--r--contrib/llvm/lib/Target/PTX/PTXTargetMachine.h7
-rwxr-xr-xcontrib/llvm/lib/Target/PTX/generate-register-td.py163
-rw-r--r--contrib/llvm/lib/Target/PowerPC/InstPrinter/PPCInstPrinter.h4
-rw-r--r--contrib/llvm/lib/Target/PowerPC/MCTargetDesc/CMakeLists.txt4
-rw-r--r--contrib/llvm/lib/Target/PowerPC/MCTargetDesc/Makefile16
-rw-r--r--contrib/llvm/lib/Target/PowerPC/MCTargetDesc/PPCMCAsmInfo.cpp (renamed from contrib/llvm/lib/Target/PowerPC/PPCMCAsmInfo.cpp)4
-rw-r--r--contrib/llvm/lib/Target/PowerPC/MCTargetDesc/PPCMCAsmInfo.h (renamed from contrib/llvm/lib/Target/PowerPC/PPCMCAsmInfo.h)0
-rw-r--r--contrib/llvm/lib/Target/PowerPC/MCTargetDesc/PPCMCTargetDesc.cpp70
-rw-r--r--contrib/llvm/lib/Target/PowerPC/MCTargetDesc/PPCMCTargetDesc.h41
-rw-r--r--contrib/llvm/lib/Target/PowerPC/PPC.h18
-rw-r--r--contrib/llvm/lib/Target/PowerPC/PPCAsmBackend.cpp6
-rw-r--r--contrib/llvm/lib/Target/PowerPC/PPCAsmPrinter.cpp3
-rw-r--r--contrib/llvm/lib/Target/PowerPC/PPCHazardRecognizers.cpp8
-rw-r--r--contrib/llvm/lib/Target/PowerPC/PPCISelDAGToDAG.cpp37
-rw-r--r--contrib/llvm/lib/Target/PowerPC/PPCISelLowering.cpp154
-rw-r--r--contrib/llvm/lib/Target/PowerPC/PPCInstrInfo.cpp24
-rw-r--r--contrib/llvm/lib/Target/PowerPC/PPCInstrInfo.h5
-rw-r--r--contrib/llvm/lib/Target/PowerPC/PPCJITInfo.cpp90
-rw-r--r--contrib/llvm/lib/Target/PowerPC/PPCMCCodeEmitter.cpp11
-rw-r--r--contrib/llvm/lib/Target/PowerPC/PPCRegisterInfo.cpp11
-rw-r--r--contrib/llvm/lib/Target/PowerPC/PPCRegisterInfo.h4
-rw-r--r--contrib/llvm/lib/Target/PowerPC/PPCRegisterInfo.td59
-rw-r--r--contrib/llvm/lib/Target/PowerPC/PPCSubtarget.cpp28
-rw-r--r--contrib/llvm/lib/Target/PowerPC/PPCSubtarget.h22
-rw-r--r--contrib/llvm/lib/Target/PowerPC/PPCTargetMachine.cpp24
-rw-r--r--contrib/llvm/lib/Target/PowerPC/PPCTargetMachine.h7
-rw-r--r--contrib/llvm/lib/Target/Sparc/DelaySlotFiller.cpp2
-rw-r--r--contrib/llvm/lib/Target/Sparc/MCTargetDesc/CMakeLists.txt4
-rw-r--r--contrib/llvm/lib/Target/Sparc/MCTargetDesc/Makefile16
-rw-r--r--contrib/llvm/lib/Target/Sparc/MCTargetDesc/SparcMCAsmInfo.cpp (renamed from contrib/llvm/lib/Target/Sparc/SparcMCAsmInfo.cpp)7
-rw-r--r--contrib/llvm/lib/Target/Sparc/MCTargetDesc/SparcMCAsmInfo.h (renamed from contrib/llvm/lib/Target/Sparc/SparcMCAsmInfo.h)0
-rw-r--r--contrib/llvm/lib/Target/Sparc/MCTargetDesc/SparcMCTargetDesc.cpp57
-rw-r--r--contrib/llvm/lib/Target/Sparc/MCTargetDesc/SparcMCTargetDesc.h41
-rw-r--r--contrib/llvm/lib/Target/Sparc/Sparc.h14
-rw-r--r--contrib/llvm/lib/Target/Sparc/SparcISelLowering.cpp23
-rw-r--r--contrib/llvm/lib/Target/Sparc/SparcISelLowering.h3
-rw-r--r--contrib/llvm/lib/Target/Sparc/SparcInstrInfo.cpp14
-rw-r--r--contrib/llvm/lib/Target/Sparc/SparcInstrInfo.h5
-rw-r--r--contrib/llvm/lib/Target/Sparc/SparcRegisterInfo.cpp10
-rw-r--r--contrib/llvm/lib/Target/Sparc/SparcRegisterInfo.h4
-rw-r--r--contrib/llvm/lib/Target/Sparc/SparcRegisterInfo.td34
-rw-r--r--contrib/llvm/lib/Target/Sparc/SparcSubtarget.cpp28
-rw-r--r--contrib/llvm/lib/Target/Sparc/SparcSubtarget.h16
-rw-r--r--contrib/llvm/lib/Target/Sparc/SparcTargetMachine.cpp16
-rw-r--r--contrib/llvm/lib/Target/Sparc/SparcTargetMachine.h7
-rw-r--r--contrib/llvm/lib/Target/SystemZ/MCTargetDesc/CMakeLists.txt7
-rw-r--r--contrib/llvm/lib/Target/SystemZ/MCTargetDesc/Makefile16
-rw-r--r--contrib/llvm/lib/Target/SystemZ/MCTargetDesc/SystemZMCAsmInfo.cpp (renamed from contrib/llvm/lib/Target/SystemZ/SystemZMCAsmInfo.cpp)2
-rw-r--r--contrib/llvm/lib/Target/SystemZ/MCTargetDesc/SystemZMCAsmInfo.h (renamed from contrib/llvm/lib/Target/SystemZ/SystemZMCAsmInfo.h)0
-rw-r--r--contrib/llvm/lib/Target/SystemZ/MCTargetDesc/SystemZMCTargetDesc.cpp58
-rw-r--r--contrib/llvm/lib/Target/SystemZ/MCTargetDesc/SystemZMCTargetDesc.h38
-rw-r--r--contrib/llvm/lib/Target/SystemZ/SystemZ.h11
-rw-r--r--contrib/llvm/lib/Target/SystemZ/SystemZISelLowering.cpp2
-rw-r--r--contrib/llvm/lib/Target/SystemZ/SystemZInstrBuilder.h6
-rw-r--r--contrib/llvm/lib/Target/SystemZ/SystemZInstrInfo.cpp20
-rw-r--r--contrib/llvm/lib/Target/SystemZ/SystemZInstrInfo.h11
-rw-r--r--contrib/llvm/lib/Target/SystemZ/SystemZRegisterInfo.cpp22
-rw-r--r--contrib/llvm/lib/Target/SystemZ/SystemZRegisterInfo.h4
-rw-r--r--contrib/llvm/lib/Target/SystemZ/SystemZRegisterInfo.td311
-rw-r--r--contrib/llvm/lib/Target/SystemZ/SystemZSubtarget.cpp17
-rw-r--r--contrib/llvm/lib/Target/SystemZ/SystemZSubtarget.h17
-rw-r--r--contrib/llvm/lib/Target/SystemZ/SystemZTargetMachine.cpp7
-rw-r--r--contrib/llvm/lib/Target/SystemZ/SystemZTargetMachine.h2
-rw-r--r--contrib/llvm/lib/Target/Target.cpp4
-rw-r--r--contrib/llvm/lib/Target/TargetAsmInfo.cpp8
-rw-r--r--contrib/llvm/lib/Target/TargetData.cpp64
-rw-r--r--contrib/llvm/lib/Target/TargetInstrInfo.cpp43
-rw-r--r--contrib/llvm/lib/Target/TargetLoweringObjectFile.cpp55
-rw-r--r--contrib/llvm/lib/Target/TargetMachine.cpp9
-rw-r--r--contrib/llvm/lib/Target/TargetRegisterInfo.cpp24
-rw-r--r--contrib/llvm/lib/Target/TargetSubtargetInfo.cpp (renamed from contrib/llvm/lib/Target/TargetSubtarget.cpp)12
-rw-r--r--contrib/llvm/lib/Target/X86/AsmParser/X86AsmParser.cpp72
-rw-r--r--contrib/llvm/lib/Target/X86/Disassembler/X86Disassembler.cpp3
-rw-r--r--contrib/llvm/lib/Target/X86/InstPrinter/X86ATTInstPrinter.cpp11
-rw-r--r--contrib/llvm/lib/Target/X86/InstPrinter/X86ATTInstPrinter.h6
-rw-r--r--contrib/llvm/lib/Target/X86/InstPrinter/X86InstComments.cpp2
-rw-r--r--contrib/llvm/lib/Target/X86/InstPrinter/X86IntelInstPrinter.cpp3
-rw-r--r--contrib/llvm/lib/Target/X86/InstPrinter/X86IntelInstPrinter.h3
-rw-r--r--contrib/llvm/lib/Target/X86/MCTargetDesc/CMakeLists.txt7
-rw-r--r--contrib/llvm/lib/Target/X86/MCTargetDesc/Makefile16
-rw-r--r--contrib/llvm/lib/Target/X86/MCTargetDesc/X86MCAsmInfo.cpp (renamed from contrib/llvm/lib/Target/X86/X86MCAsmInfo.cpp)35
-rw-r--r--contrib/llvm/lib/Target/X86/MCTargetDesc/X86MCAsmInfo.h (renamed from contrib/llvm/lib/Target/X86/X86MCAsmInfo.h)0
-rw-r--r--contrib/llvm/lib/Target/X86/MCTargetDesc/X86MCTargetDesc.cpp185
-rw-r--r--contrib/llvm/lib/Target/X86/MCTargetDesc/X86MCTargetDesc.h60
-rw-r--r--contrib/llvm/lib/Target/X86/X86.h23
-rw-r--r--contrib/llvm/lib/Target/X86/X86.td7
-rw-r--r--contrib/llvm/lib/Target/X86/X86AsmBackend.cpp3
-rw-r--r--contrib/llvm/lib/Target/X86/X86AsmPrinter.cpp5
-rw-r--r--contrib/llvm/lib/Target/X86/X86CallingConv.td41
-rw-r--r--contrib/llvm/lib/Target/X86/X86CodeEmitter.cpp14
-rw-r--r--contrib/llvm/lib/Target/X86/X86FastISel.cpp29
-rw-r--r--contrib/llvm/lib/Target/X86/X86FloatingPoint.cpp498
-rw-r--r--contrib/llvm/lib/Target/X86/X86FrameLowering.cpp201
-rw-r--r--contrib/llvm/lib/Target/X86/X86FrameLowering.h4
-rw-r--r--contrib/llvm/lib/Target/X86/X86ISelDAGToDAG.cpp114
-rw-r--r--contrib/llvm/lib/Target/X86/X86ISelLowering.cpp380
-rw-r--r--contrib/llvm/lib/Target/X86/X86ISelLowering.h15
-rw-r--r--contrib/llvm/lib/Target/X86/X86InstrBuilder.h6
-rw-r--r--contrib/llvm/lib/Target/X86/X86InstrCompiler.td5
-rw-r--r--contrib/llvm/lib/Target/X86/X86InstrFPStack.td40
-rw-r--r--contrib/llvm/lib/Target/X86/X86InstrFormats.td5
-rw-r--r--contrib/llvm/lib/Target/X86/X86InstrFragmentsSIMD.td7
-rw-r--r--contrib/llvm/lib/Target/X86/X86InstrInfo.cpp99
-rw-r--r--contrib/llvm/lib/Target/X86/X86InstrInfo.h5
-rw-r--r--contrib/llvm/lib/Target/X86/X86InstrInfo.td20
-rw-r--r--contrib/llvm/lib/Target/X86/X86InstrSSE.td248
-rw-r--r--contrib/llvm/lib/Target/X86/X86InstrSystem.td2
-rw-r--r--contrib/llvm/lib/Target/X86/X86MCCodeEmitter.cpp58
-rw-r--r--contrib/llvm/lib/Target/X86/X86MCInstLower.cpp2
-rw-r--r--contrib/llvm/lib/Target/X86/X86MachObjectWriter.cpp522
-rw-r--r--contrib/llvm/lib/Target/X86/X86RegisterInfo.cpp79
-rw-r--r--contrib/llvm/lib/Target/X86/X86RegisterInfo.h14
-rw-r--r--contrib/llvm/lib/Target/X86/X86RegisterInfo.td199
-rw-r--r--contrib/llvm/lib/Target/X86/X86Subtarget.cpp241
-rw-r--r--contrib/llvm/lib/Target/X86/X86Subtarget.h31
-rw-r--r--contrib/llvm/lib/Target/X86/X86TargetMachine.cpp40
-rw-r--r--contrib/llvm/lib/Target/X86/X86TargetMachine.h7
-rw-r--r--contrib/llvm/lib/Target/XCore/MCTargetDesc/CMakeLists.txt7
-rw-r--r--contrib/llvm/lib/Target/XCore/MCTargetDesc/Makefile16
-rw-r--r--contrib/llvm/lib/Target/XCore/MCTargetDesc/XCoreMCAsmInfo.cpp (renamed from contrib/llvm/lib/Target/XCore/XCoreMCAsmInfo.cpp)0
-rw-r--r--contrib/llvm/lib/Target/XCore/MCTargetDesc/XCoreMCAsmInfo.h (renamed from contrib/llvm/lib/Target/XCore/XCoreMCAsmInfo.h)0
-rw-r--r--contrib/llvm/lib/Target/XCore/MCTargetDesc/XCoreMCTargetDesc.cpp56
-rw-r--r--contrib/llvm/lib/Target/XCore/MCTargetDesc/XCoreMCTargetDesc.h40
-rw-r--r--contrib/llvm/lib/Target/XCore/XCore.h12
-rw-r--r--contrib/llvm/lib/Target/XCore/XCoreAsmPrinter.cpp4
-rw-r--r--contrib/llvm/lib/Target/XCore/XCoreISelLowering.cpp25
-rw-r--r--contrib/llvm/lib/Target/XCore/XCoreISelLowering.h6
-rw-r--r--contrib/llvm/lib/Target/XCore/XCoreInstrInfo.cpp7
-rw-r--r--contrib/llvm/lib/Target/XCore/XCoreInstrInfo.h5
-rw-r--r--contrib/llvm/lib/Target/XCore/XCoreRegisterInfo.cpp35
-rw-r--r--contrib/llvm/lib/Target/XCore/XCoreRegisterInfo.h4
-rw-r--r--contrib/llvm/lib/Target/XCore/XCoreRegisterInfo.td6
-rw-r--r--contrib/llvm/lib/Target/XCore/XCoreSubtarget.cpp12
-rw-r--r--contrib/llvm/lib/Target/XCore/XCoreSubtarget.h17
-rw-r--r--contrib/llvm/lib/Target/XCore/XCoreTargetMachine.cpp7
-rw-r--r--contrib/llvm/lib/Target/XCore/XCoreTargetMachine.h2
-rw-r--r--contrib/llvm/lib/Transforms/IPO/ArgumentPromotion.cpp6
-rw-r--r--contrib/llvm/lib/Transforms/IPO/DeadArgumentElimination.cpp16
-rw-r--r--contrib/llvm/lib/Transforms/IPO/DeadTypeElimination.cpp112
-rw-r--r--contrib/llvm/lib/Transforms/IPO/GlobalOpt.cpp78
-rw-r--r--contrib/llvm/lib/Transforms/IPO/IPO.cpp5
-rw-r--r--contrib/llvm/lib/Transforms/IPO/LowerSetJmp.cpp6
-rw-r--r--contrib/llvm/lib/Transforms/IPO/MergeFunctions.cpp3
-rw-r--r--contrib/llvm/lib/Transforms/IPO/PruneEH.cpp3
-rw-r--r--contrib/llvm/lib/Transforms/IPO/StripSymbols.cpp27
-rw-r--r--contrib/llvm/lib/Transforms/InstCombine/InstCombineAndOrXor.cpp5
-rw-r--r--contrib/llvm/lib/Transforms/InstCombine/InstCombineCalls.cpp45
-rw-r--r--contrib/llvm/lib/Transforms/InstCombine/InstCombineCasts.cpp11
-rw-r--r--contrib/llvm/lib/Transforms/InstCombine/InstCombineCompares.cpp109
-rw-r--r--contrib/llvm/lib/Transforms/InstCombine/InstCombineMulDivRem.cpp4
-rw-r--r--contrib/llvm/lib/Transforms/InstCombine/InstCombineSelect.cpp4
-rw-r--r--contrib/llvm/lib/Transforms/InstCombine/InstructionCombining.cpp18
-rw-r--r--contrib/llvm/lib/Transforms/Instrumentation/GCOVProfiling.cpp13
-rw-r--r--contrib/llvm/lib/Transforms/Instrumentation/PathProfiling.cpp4
-rw-r--r--contrib/llvm/lib/Transforms/Instrumentation/ProfilingUtils.cpp8
-rw-r--r--contrib/llvm/lib/Transforms/Scalar/DeadStoreElimination.cpp25
-rw-r--r--contrib/llvm/lib/Transforms/Scalar/GVN.cpp109
-rw-r--r--contrib/llvm/lib/Transforms/Scalar/IndVarSimplify.cpp1772
-rw-r--r--contrib/llvm/lib/Transforms/Scalar/JumpThreading.cpp4
-rw-r--r--contrib/llvm/lib/Transforms/Scalar/LICM.cpp104
-rw-r--r--contrib/llvm/lib/Transforms/Scalar/LoopDeletion.cpp4
-rw-r--r--contrib/llvm/lib/Transforms/Scalar/LoopIdiomRecognize.cpp25
-rw-r--r--contrib/llvm/lib/Transforms/Scalar/LoopRotation.cpp2
-rw-r--r--contrib/llvm/lib/Transforms/Scalar/LoopStrengthReduce.cpp7
-rw-r--r--contrib/llvm/lib/Transforms/Scalar/LoopUnswitch.cpp8
-rw-r--r--contrib/llvm/lib/Transforms/Scalar/MemCpyOptimizer.cpp28
-rw-r--r--contrib/llvm/lib/Transforms/Scalar/ObjCARC.cpp3595
-rw-r--r--contrib/llvm/lib/Transforms/Scalar/Reassociate.cpp2
-rw-r--r--contrib/llvm/lib/Transforms/Scalar/Scalar.cpp5
-rw-r--r--contrib/llvm/lib/Transforms/Scalar/ScalarReplAggregates.cpp240
-rw-r--r--contrib/llvm/lib/Transforms/Scalar/SimplifyCFGPass.cpp3
-rw-r--r--contrib/llvm/lib/Transforms/Scalar/SimplifyLibCalls.cpp4
-rw-r--r--contrib/llvm/lib/Transforms/Utils/BasicBlockUtils.cpp6
-rw-r--r--contrib/llvm/lib/Transforms/Utils/BreakCriticalEdges.cpp54
-rw-r--r--contrib/llvm/lib/Transforms/Utils/CloneFunction.cpp60
-rw-r--r--contrib/llvm/lib/Transforms/Utils/CloneLoop.cpp128
-rw-r--r--contrib/llvm/lib/Transforms/Utils/CloneModule.cpp24
-rw-r--r--contrib/llvm/lib/Transforms/Utils/CodeExtractor.cpp8
-rw-r--r--contrib/llvm/lib/Transforms/Utils/InlineFunction.cpp78
-rw-r--r--contrib/llvm/lib/Transforms/Utils/Local.cpp69
-rw-r--r--contrib/llvm/lib/Transforms/Utils/LoopSimplify.cpp1
-rw-r--r--contrib/llvm/lib/Transforms/Utils/LoopUnroll.cpp71
-rw-r--r--contrib/llvm/lib/Transforms/Utils/LowerExpectIntrinsic.cpp166
-rw-r--r--contrib/llvm/lib/Transforms/Utils/LowerInvoke.cpp30
-rw-r--r--contrib/llvm/lib/Transforms/Utils/PromoteMemoryToRegister.cpp44
-rw-r--r--contrib/llvm/lib/Transforms/Utils/SSAUpdater.cpp14
-rw-r--r--contrib/llvm/lib/Transforms/Utils/SimplifyCFG.cpp82
-rw-r--r--contrib/llvm/lib/Transforms/Utils/ValueMapper.cpp144
-rw-r--r--contrib/llvm/lib/VMCore/AsmWriter.cpp535
-rw-r--r--contrib/llvm/lib/VMCore/Attributes.cpp2
-rw-r--r--contrib/llvm/lib/VMCore/AutoUpgrade.cpp1286
-rw-r--r--contrib/llvm/lib/VMCore/BasicBlock.cpp40
-rw-r--r--contrib/llvm/lib/VMCore/ConstantFold.cpp91
-rw-r--r--contrib/llvm/lib/VMCore/ConstantFold.h8
-rw-r--r--contrib/llvm/lib/VMCore/Constants.cpp476
-rw-r--r--contrib/llvm/lib/VMCore/ConstantsContext.h146
-rw-r--r--contrib/llvm/lib/VMCore/Core.cpp113
-rw-r--r--contrib/llvm/lib/VMCore/DebugLoc.cpp32
-rw-r--r--contrib/llvm/lib/VMCore/Function.cpp27
-rw-r--r--contrib/llvm/lib/VMCore/Globals.cpp58
-rw-r--r--contrib/llvm/lib/VMCore/IRBuilder.cpp30
-rw-r--r--contrib/llvm/lib/VMCore/InlineAsm.cpp4
-rw-r--r--contrib/llvm/lib/VMCore/Instruction.cpp44
-rw-r--r--contrib/llvm/lib/VMCore/Instructions.cpp305
-rw-r--r--contrib/llvm/lib/VMCore/LLVMContext.cpp4
-rw-r--r--contrib/llvm/lib/VMCore/LLVMContextImpl.cpp41
-rw-r--r--contrib/llvm/lib/VMCore/LLVMContextImpl.h86
-rw-r--r--contrib/llvm/lib/VMCore/Metadata.cpp1
-rw-r--r--contrib/llvm/lib/VMCore/Module.cpp186
-rw-r--r--contrib/llvm/lib/VMCore/Type.cpp1239
-rw-r--r--contrib/llvm/lib/VMCore/TypeSymbolTable.cpp169
-rw-r--r--contrib/llvm/lib/VMCore/TypesContext.h426
-rw-r--r--contrib/llvm/lib/VMCore/Use.cpp8
-rw-r--r--contrib/llvm/lib/VMCore/User.cpp12
-rw-r--r--contrib/llvm/lib/VMCore/Value.cpp44
-rw-r--r--contrib/llvm/lib/VMCore/ValueSymbolTable.cpp2
-rw-r--r--contrib/llvm/lib/VMCore/ValueTypes.cpp1
-rw-r--r--contrib/llvm/lib/VMCore/Verifier.cpp148
-rw-r--r--contrib/llvm/tools/clang/include/clang-c/Index.h255
-rw-r--r--contrib/llvm/tools/clang/include/clang/ARCMigrate/ARCMT.h94
-rw-r--r--contrib/llvm/tools/clang/include/clang/ARCMigrate/ARCMTActions.h47
-rw-r--r--contrib/llvm/tools/clang/include/clang/ARCMigrate/FileRemapper.h76
-rw-r--r--contrib/llvm/tools/clang/include/clang/AST/ASTContext.h40
-rw-r--r--contrib/llvm/tools/clang/include/clang/AST/ASTDiagnostic.h22
-rw-r--r--contrib/llvm/tools/clang/include/clang/AST/CanonicalType.h2
-rw-r--r--contrib/llvm/tools/clang/include/clang/AST/Decl.h34
-rw-r--r--contrib/llvm/tools/clang/include/clang/AST/DeclBase.h19
-rw-r--r--contrib/llvm/tools/clang/include/clang/AST/DeclCXX.h1
-rw-r--r--contrib/llvm/tools/clang/include/clang/AST/DeclObjC.h43
-rw-r--r--contrib/llvm/tools/clang/include/clang/AST/DeclTemplate.h8
-rw-r--r--contrib/llvm/tools/clang/include/clang/AST/DeclarationName.h3
-rw-r--r--contrib/llvm/tools/clang/include/clang/AST/Expr.h211
-rw-r--r--contrib/llvm/tools/clang/include/clang/AST/ExprCXX.h170
-rw-r--r--contrib/llvm/tools/clang/include/clang/AST/ExprObjC.h149
-rw-r--r--contrib/llvm/tools/clang/include/clang/AST/ExternalASTSource.h24
-rw-r--r--contrib/llvm/tools/clang/include/clang/AST/GlobalDecl.h (renamed from contrib/llvm/tools/clang/lib/CodeGen/GlobalDecl.h)25
-rw-r--r--contrib/llvm/tools/clang/include/clang/AST/NestedNameSpecifier.h12
-rw-r--r--contrib/llvm/tools/clang/include/clang/AST/OperationKinds.h30
-rw-r--r--contrib/llvm/tools/clang/include/clang/AST/ParentMap.h1
-rw-r--r--contrib/llvm/tools/clang/include/clang/AST/PrettyPrinter.h6
-rw-r--r--contrib/llvm/tools/clang/include/clang/AST/RecursiveASTVisitor.h7
-rw-r--r--contrib/llvm/tools/clang/include/clang/AST/Stmt.h29
-rw-r--r--contrib/llvm/tools/clang/include/clang/AST/StmtObjC.h33
-rw-r--r--contrib/llvm/tools/clang/include/clang/AST/TemplateBase.h7
-rw-r--r--contrib/llvm/tools/clang/include/clang/AST/TemplateName.h110
-rw-r--r--contrib/llvm/tools/clang/include/clang/AST/Type.h420
-rw-r--r--contrib/llvm/tools/clang/include/clang/Analysis/Analyses/UninitializedValues.h10
-rw-r--r--contrib/llvm/tools/clang/include/clang/Analysis/AnalysisContext.h5
-rw-r--r--contrib/llvm/tools/clang/include/clang/Analysis/DomainSpecific/CocoaConventions.h25
-rw-r--r--contrib/llvm/tools/clang/include/clang/Basic/Attr.td9
-rw-r--r--contrib/llvm/tools/clang/include/clang/Basic/Builtins.def6
-rw-r--r--contrib/llvm/tools/clang/include/clang/Basic/Builtins.h1
-rw-r--r--contrib/llvm/tools/clang/include/clang/Basic/BuiltinsX86.def82
-rw-r--r--contrib/llvm/tools/clang/include/clang/Basic/DelayedCleanupPool.h109
-rw-r--r--contrib/llvm/tools/clang/include/clang/Basic/Diagnostic.h53
-rw-r--r--contrib/llvm/tools/clang/include/clang/Basic/DiagnosticCategories.h26
-rw-r--r--contrib/llvm/tools/clang/include/clang/Basic/DiagnosticCommonKinds.td1
-rw-r--r--contrib/llvm/tools/clang/include/clang/Basic/DiagnosticDriverKinds.td6
-rw-r--r--contrib/llvm/tools/clang/include/clang/Basic/DiagnosticFrontendKinds.td3
-rw-r--r--contrib/llvm/tools/clang/include/clang/Basic/DiagnosticGroups.td22
-rw-r--r--contrib/llvm/tools/clang/include/clang/Basic/DiagnosticIDs.h4
-rw-r--r--contrib/llvm/tools/clang/include/clang/Basic/DiagnosticLexKinds.td2
-rw-r--r--contrib/llvm/tools/clang/include/clang/Basic/DiagnosticParseKinds.td5
-rw-r--r--contrib/llvm/tools/clang/include/clang/Basic/DiagnosticSemaKinds.td338
-rw-r--r--contrib/llvm/tools/clang/include/clang/Basic/FileManager.h5
-rw-r--r--contrib/llvm/tools/clang/include/clang/Basic/IdentifierTable.h20
-rw-r--r--contrib/llvm/tools/clang/include/clang/Basic/LangOptions.h13
-rw-r--r--contrib/llvm/tools/clang/include/clang/Basic/SourceManager.h144
-rw-r--r--contrib/llvm/tools/clang/include/clang/Basic/SourceManagerInternals.h2
-rw-r--r--contrib/llvm/tools/clang/include/clang/Basic/Specifiers.h2
-rw-r--r--contrib/llvm/tools/clang/include/clang/Basic/StmtNodes.td7
-rw-r--r--contrib/llvm/tools/clang/include/clang/Basic/TargetInfo.h24
-rw-r--r--contrib/llvm/tools/clang/include/clang/Basic/TokenKinds.def7
-rw-r--r--contrib/llvm/tools/clang/include/clang/Basic/arm_neon.td4
-rw-r--r--contrib/llvm/tools/clang/include/clang/CodeGen/BackendUtil.h4
-rw-r--r--contrib/llvm/tools/clang/include/clang/Driver/CC1Options.td40
-rw-r--r--contrib/llvm/tools/clang/include/clang/Driver/Compilation.h1
-rw-r--r--contrib/llvm/tools/clang/include/clang/Driver/Driver.h2
-rw-r--r--contrib/llvm/tools/clang/include/clang/Driver/ObjCRuntime.h46
-rw-r--r--contrib/llvm/tools/clang/include/clang/Driver/Option.h7
-rw-r--r--contrib/llvm/tools/clang/include/clang/Driver/Options.td20
-rw-r--r--contrib/llvm/tools/clang/include/clang/Driver/ToolChain.h10
-rw-r--r--contrib/llvm/tools/clang/include/clang/Frontend/ASTUnit.h14
-rw-r--r--contrib/llvm/tools/clang/include/clang/Frontend/CodeGenOptions.h13
-rw-r--r--contrib/llvm/tools/clang/include/clang/Frontend/DependencyOutputOptions.h2
-rw-r--r--contrib/llvm/tools/clang/include/clang/Frontend/DiagnosticOptions.h3
-rw-r--r--contrib/llvm/tools/clang/include/clang/Frontend/FrontendAction.h39
-rw-r--r--contrib/llvm/tools/clang/include/clang/Frontend/FrontendActions.h6
-rw-r--r--contrib/llvm/tools/clang/include/clang/Frontend/FrontendOptions.h11
-rw-r--r--contrib/llvm/tools/clang/include/clang/Frontend/HeaderSearchOptions.h27
-rw-r--r--contrib/llvm/tools/clang/include/clang/Frontend/PreprocessorOptions.h27
-rw-r--r--contrib/llvm/tools/clang/include/clang/Frontend/TextDiagnosticPrinter.h19
-rw-r--r--contrib/llvm/tools/clang/include/clang/Frontend/Utils.h1
-rw-r--r--contrib/llvm/tools/clang/include/clang/Lex/Lexer.h22
-rw-r--r--contrib/llvm/tools/clang/include/clang/Lex/LiteralSupport.h4
-rw-r--r--contrib/llvm/tools/clang/include/clang/Lex/MacroInfo.h16
-rw-r--r--contrib/llvm/tools/clang/include/clang/Lex/PPCallbacks.h37
-rw-r--r--contrib/llvm/tools/clang/include/clang/Lex/PreprocessingRecord.h34
-rw-r--r--contrib/llvm/tools/clang/include/clang/Lex/Preprocessor.h55
-rw-r--r--contrib/llvm/tools/clang/include/clang/Lex/Token.h4
-rw-r--r--contrib/llvm/tools/clang/include/clang/Lex/TokenLexer.h33
-rw-r--r--contrib/llvm/tools/clang/include/clang/Parse/Parser.h72
-rw-r--r--contrib/llvm/tools/clang/include/clang/Rewrite/FixItRewriter.h1
-rw-r--r--contrib/llvm/tools/clang/include/clang/Rewrite/Rewriter.h5
-rw-r--r--contrib/llvm/tools/clang/include/clang/Sema/AnalysisBasedWarnings.h38
-rw-r--r--contrib/llvm/tools/clang/include/clang/Sema/AttributeList.h48
-rw-r--r--contrib/llvm/tools/clang/include/clang/Sema/CodeCompleteConsumer.h30
-rw-r--r--contrib/llvm/tools/clang/include/clang/Sema/DeclSpec.h59
-rw-r--r--contrib/llvm/tools/clang/include/clang/Sema/DelayedDiagnostic.h41
-rw-r--r--contrib/llvm/tools/clang/include/clang/Sema/ExternalSemaSource.h5
-rw-r--r--contrib/llvm/tools/clang/include/clang/Sema/Initialization.h107
-rw-r--r--contrib/llvm/tools/clang/include/clang/Sema/LocInfoType.h63
-rw-r--r--contrib/llvm/tools/clang/include/clang/Sema/Overload.h18
-rw-r--r--contrib/llvm/tools/clang/include/clang/Sema/Scope.h8
-rw-r--r--contrib/llvm/tools/clang/include/clang/Sema/Sema.h332
-rw-r--r--contrib/llvm/tools/clang/include/clang/Sema/TypoCorrection.h105
-rw-r--r--contrib/llvm/tools/clang/include/clang/Serialization/ASTBitCodes.h40
-rw-r--r--contrib/llvm/tools/clang/include/clang/Serialization/ASTReader.h10
-rw-r--r--contrib/llvm/tools/clang/include/clang/Serialization/ASTWriter.h2
-rw-r--r--contrib/llvm/tools/clang/include/clang/Serialization/ChainedIncludesSource.h2
-rw-r--r--contrib/llvm/tools/clang/include/clang/StaticAnalyzer/Core/PathSensitive/GRStateTrait.h4
-rw-r--r--contrib/llvm/tools/clang/lib/ARCMigrate/ARCMT.cpp541
-rw-r--r--contrib/llvm/tools/clang/lib/ARCMigrate/ARCMTActions.cpp53
-rw-r--r--contrib/llvm/tools/clang/lib/ARCMigrate/CMakeLists.txt24
-rw-r--r--contrib/llvm/tools/clang/lib/ARCMigrate/FileRemapper.cpp291
-rw-r--r--contrib/llvm/tools/clang/lib/ARCMigrate/Internals.h148
-rw-r--r--contrib/llvm/tools/clang/lib/ARCMigrate/Makefile (renamed from contrib/llvm/tools/clang/lib/Tooling/Makefile)11
-rw-r--r--contrib/llvm/tools/clang/lib/ARCMigrate/TransARCAssign.cpp75
-rw-r--r--contrib/llvm/tools/clang/lib/ARCMigrate/TransAutoreleasePool.cpp436
-rw-r--r--contrib/llvm/tools/clang/lib/ARCMigrate/TransBlockObjCVariable.cpp143
-rw-r--r--contrib/llvm/tools/clang/lib/ARCMigrate/TransEmptyStatementsAndDealloc.cpp211
-rw-r--r--contrib/llvm/tools/clang/lib/ARCMigrate/TransProperties.cpp364
-rw-r--r--contrib/llvm/tools/clang/lib/ARCMigrate/TransRetainReleaseDealloc.cpp219
-rw-r--r--contrib/llvm/tools/clang/lib/ARCMigrate/TransUnbridgedCasts.cpp203
-rw-r--r--contrib/llvm/tools/clang/lib/ARCMigrate/TransUnusedInitDelegate.cpp74
-rw-r--r--contrib/llvm/tools/clang/lib/ARCMigrate/TransZeroOutPropsInDealloc.cpp198
-rw-r--r--contrib/llvm/tools/clang/lib/ARCMigrate/TransformActions.cpp699
-rw-r--r--contrib/llvm/tools/clang/lib/ARCMigrate/Transforms.cpp296
-rw-r--r--contrib/llvm/tools/clang/lib/ARCMigrate/Transforms.h92
-rw-r--r--contrib/llvm/tools/clang/lib/AST/ASTContext.cpp293
-rw-r--r--contrib/llvm/tools/clang/lib/AST/ASTDiagnostic.cpp74
-rw-r--r--contrib/llvm/tools/clang/lib/AST/ASTImporter.cpp20
-rw-r--r--contrib/llvm/tools/clang/lib/AST/Decl.cpp110
-rw-r--r--contrib/llvm/tools/clang/lib/AST/DeclBase.cpp35
-rw-r--r--contrib/llvm/tools/clang/lib/AST/DeclCXX.cpp54
-rw-r--r--contrib/llvm/tools/clang/lib/AST/DeclObjC.cpp58
-rw-r--r--contrib/llvm/tools/clang/lib/AST/DeclPrinter.cpp5
-rw-r--r--contrib/llvm/tools/clang/lib/AST/DeclarationName.cpp22
-rw-r--r--contrib/llvm/tools/clang/lib/AST/Expr.cpp256
-rw-r--r--contrib/llvm/tools/clang/lib/AST/ExprCXX.cpp60
-rw-r--r--contrib/llvm/tools/clang/lib/AST/ExprClassification.cpp15
-rw-r--r--contrib/llvm/tools/clang/lib/AST/ExprConstant.cpp68
-rw-r--r--contrib/llvm/tools/clang/lib/AST/ExternalASTSource.cpp4
-rw-r--r--contrib/llvm/tools/clang/lib/AST/ItaniumMangle.cpp447
-rw-r--r--contrib/llvm/tools/clang/lib/AST/NestedNameSpecifier.cpp22
-rw-r--r--contrib/llvm/tools/clang/lib/AST/ParentMap.cpp9
-rw-r--r--contrib/llvm/tools/clang/lib/AST/RecordLayoutBuilder.cpp9
-rw-r--r--contrib/llvm/tools/clang/lib/AST/Stmt.cpp33
-rw-r--r--contrib/llvm/tools/clang/lib/AST/StmtPrinter.cpp26
-rw-r--r--contrib/llvm/tools/clang/lib/AST/StmtProfile.cpp308
-rw-r--r--contrib/llvm/tools/clang/lib/AST/TemplateBase.cpp43
-rw-r--r--contrib/llvm/tools/clang/lib/AST/TemplateName.cpp40
-rw-r--r--contrib/llvm/tools/clang/lib/AST/Type.cpp547
-rw-r--r--contrib/llvm/tools/clang/lib/AST/TypePrinter.cpp117
-rw-r--r--contrib/llvm/tools/clang/lib/Analysis/CFG.cpp6
-rw-r--r--contrib/llvm/tools/clang/lib/Analysis/CocoaConventions.cpp65
-rw-r--r--contrib/llvm/tools/clang/lib/Analysis/FormatString.cpp3
-rw-r--r--contrib/llvm/tools/clang/lib/Analysis/ReachableCode.cpp6
-rw-r--r--contrib/llvm/tools/clang/lib/Analysis/UninitializedValues.cpp46
-rw-r--r--contrib/llvm/tools/clang/lib/Basic/Builtins.cpp22
-rw-r--r--contrib/llvm/tools/clang/lib/Basic/Diagnostic.cpp16
-rw-r--r--contrib/llvm/tools/clang/lib/Basic/DiagnosticIDs.cpp81
-rw-r--r--contrib/llvm/tools/clang/lib/Basic/IdentifierTable.cpp9
-rw-r--r--contrib/llvm/tools/clang/lib/Basic/SourceManager.cpp121
-rw-r--r--contrib/llvm/tools/clang/lib/Basic/TargetInfo.cpp39
-rw-r--r--contrib/llvm/tools/clang/lib/Basic/Targets.cpp348
-rw-r--r--contrib/llvm/tools/clang/lib/CodeGen/ABIInfo.h12
-rw-r--r--contrib/llvm/tools/clang/lib/CodeGen/BackendUtil.cpp46
-rw-r--r--contrib/llvm/tools/clang/lib/CodeGen/CGBlocks.cpp316
-rw-r--r--contrib/llvm/tools/clang/lib/CodeGen/CGBlocks.h3
-rw-r--r--contrib/llvm/tools/clang/lib/CodeGen/CGBuiltin.cpp348
-rw-r--r--contrib/llvm/tools/clang/lib/CodeGen/CGCXXABI.cpp2
-rw-r--r--contrib/llvm/tools/clang/lib/CodeGen/CGCXXABI.h2
-rw-r--r--contrib/llvm/tools/clang/lib/CodeGen/CGCall.cpp555
-rw-r--r--contrib/llvm/tools/clang/lib/CodeGen/CGCall.h47
-rw-r--r--contrib/llvm/tools/clang/lib/CodeGen/CGClass.cpp390
-rw-r--r--contrib/llvm/tools/clang/lib/CodeGen/CGCleanup.cpp35
-rw-r--r--contrib/llvm/tools/clang/lib/CodeGen/CGDebugInfo.cpp51
-rw-r--r--contrib/llvm/tools/clang/lib/CodeGen/CGDebugInfo.h8
-rw-r--r--contrib/llvm/tools/clang/lib/CodeGen/CGDecl.cpp770
-rw-r--r--contrib/llvm/tools/clang/lib/CodeGen/CGDeclCXX.cpp162
-rw-r--r--contrib/llvm/tools/clang/lib/CodeGen/CGException.cpp212
-rw-r--r--contrib/llvm/tools/clang/lib/CodeGen/CGExpr.cpp450
-rw-r--r--contrib/llvm/tools/clang/lib/CodeGen/CGExprAgg.cpp319
-rw-r--r--contrib/llvm/tools/clang/lib/CodeGen/CGExprCXX.cpp147
-rw-r--r--contrib/llvm/tools/clang/lib/CodeGen/CGExprComplex.cpp93
-rw-r--r--contrib/llvm/tools/clang/lib/CodeGen/CGExprConstant.cpp42
-rw-r--r--contrib/llvm/tools/clang/lib/CodeGen/CGExprScalar.cpp494
-rw-r--r--contrib/llvm/tools/clang/lib/CodeGen/CGObjC.cpp1255
-rw-r--r--contrib/llvm/tools/clang/lib/CodeGen/CGObjCGNU.cpp224
-rw-r--r--contrib/llvm/tools/clang/lib/CodeGen/CGObjCMac.cpp791
-rw-r--r--contrib/llvm/tools/clang/lib/CodeGen/CGObjCRuntime.cpp28
-rw-r--r--contrib/llvm/tools/clang/lib/CodeGen/CGObjCRuntime.h8
-rw-r--r--contrib/llvm/tools/clang/lib/CodeGen/CGRTTI.cpp4
-rw-r--r--contrib/llvm/tools/clang/lib/CodeGen/CGRecordLayout.h16
-rw-r--r--contrib/llvm/tools/clang/lib/CodeGen/CGRecordLayoutBuilder.cpp69
-rw-r--r--contrib/llvm/tools/clang/lib/CodeGen/CGStmt.cpp32
-rw-r--r--contrib/llvm/tools/clang/lib/CodeGen/CGTemporaries.cpp9
-rw-r--r--contrib/llvm/tools/clang/lib/CodeGen/CGVTT.cpp3
-rw-r--r--contrib/llvm/tools/clang/lib/CodeGen/CGVTables.cpp5
-rw-r--r--contrib/llvm/tools/clang/lib/CodeGen/CGVTables.h2
-rw-r--r--contrib/llvm/tools/clang/lib/CodeGen/CGValue.h81
-rw-r--r--contrib/llvm/tools/clang/lib/CodeGen/CodeGenAction.cpp12
-rw-r--r--contrib/llvm/tools/clang/lib/CodeGen/CodeGenFunction.cpp262
-rw-r--r--contrib/llvm/tools/clang/lib/CodeGen/CodeGenFunction.h414
-rw-r--r--contrib/llvm/tools/clang/lib/CodeGen/CodeGenModule.cpp58
-rw-r--r--contrib/llvm/tools/clang/lib/CodeGen/CodeGenModule.h125
-rw-r--r--contrib/llvm/tools/clang/lib/CodeGen/CodeGenTypes.cpp617
-rw-r--r--contrib/llvm/tools/clang/lib/CodeGen/CodeGenTypes.h130
-rw-r--r--contrib/llvm/tools/clang/lib/CodeGen/ItaniumCXXABI.cpp123
-rw-r--r--contrib/llvm/tools/clang/lib/CodeGen/TargetInfo.cpp274
-rw-r--r--contrib/llvm/tools/clang/lib/CodeGen/TargetInfo.h20
-rw-r--r--contrib/llvm/tools/clang/lib/Driver/Arg.cpp2
-rw-r--r--contrib/llvm/tools/clang/lib/Driver/ArgList.cpp4
-rw-r--r--contrib/llvm/tools/clang/lib/Driver/Driver.cpp41
-rw-r--r--contrib/llvm/tools/clang/lib/Driver/Option.cpp16
-rw-r--r--contrib/llvm/tools/clang/lib/Driver/ToolChain.cpp34
-rw-r--r--contrib/llvm/tools/clang/lib/Driver/ToolChains.cpp161
-rw-r--r--contrib/llvm/tools/clang/lib/Driver/ToolChains.h26
-rw-r--r--contrib/llvm/tools/clang/lib/Driver/Tools.cpp267
-rw-r--r--contrib/llvm/tools/clang/lib/Driver/Tools.h2
-rw-r--r--contrib/llvm/tools/clang/lib/Frontend/ASTUnit.cpp85
-rw-r--r--contrib/llvm/tools/clang/lib/Frontend/BoostConAction.cpp39
-rw-r--r--contrib/llvm/tools/clang/lib/Frontend/CacheTokens.cpp7
-rw-r--r--contrib/llvm/tools/clang/lib/Frontend/CompilerInstance.cpp3
-rw-r--r--contrib/llvm/tools/clang/lib/Frontend/CompilerInvocation.cpp123
-rw-r--r--contrib/llvm/tools/clang/lib/Frontend/DependencyFile.cpp55
-rw-r--r--contrib/llvm/tools/clang/lib/Frontend/FrontendAction.cpp46
-rw-r--r--contrib/llvm/tools/clang/lib/Frontend/InitHeaderSearch.cpp217
-rw-r--r--contrib/llvm/tools/clang/lib/Frontend/InitPreprocessor.cpp170
-rw-r--r--contrib/llvm/tools/clang/lib/Frontend/PrintPreprocessedOutput.cpp48
-rw-r--r--contrib/llvm/tools/clang/lib/Frontend/TextDiagnosticPrinter.cpp115
-rw-r--r--contrib/llvm/tools/clang/lib/FrontendTool/ExecuteCompilerInvocation.cpp17
-rw-r--r--contrib/llvm/tools/clang/lib/Headers/float.h42
-rw-r--r--contrib/llvm/tools/clang/lib/Headers/stdarg.h2
-rw-r--r--contrib/llvm/tools/clang/lib/Lex/HeaderSearch.cpp6
-rw-r--r--contrib/llvm/tools/clang/lib/Lex/Lexer.cpp84
-rw-r--r--contrib/llvm/tools/clang/lib/Lex/MacroArgs.cpp11
-rw-r--r--contrib/llvm/tools/clang/lib/Lex/MacroArgs.h7
-rw-r--r--contrib/llvm/tools/clang/lib/Lex/MacroInfo.cpp32
-rw-r--r--contrib/llvm/tools/clang/lib/Lex/PPDirectives.cpp22
-rw-r--r--contrib/llvm/tools/clang/lib/Lex/PPLexerChange.cpp4
-rw-r--r--contrib/llvm/tools/clang/lib/Lex/PPMacroExpansion.cpp72
-rw-r--r--contrib/llvm/tools/clang/lib/Lex/Pragma.cpp30
-rw-r--r--contrib/llvm/tools/clang/lib/Lex/PreprocessingRecord.cpp11
-rw-r--r--contrib/llvm/tools/clang/lib/Lex/Preprocessor.cpp18
-rw-r--r--contrib/llvm/tools/clang/lib/Lex/TokenLexer.cpp182
-rw-r--r--contrib/llvm/tools/clang/lib/Parse/ParseAST.cpp9
-rw-r--r--contrib/llvm/tools/clang/lib/Parse/ParseDecl.cpp498
-rw-r--r--contrib/llvm/tools/clang/lib/Parse/ParseDeclCXX.cpp37
-rw-r--r--contrib/llvm/tools/clang/lib/Parse/ParseExpr.cpp156
-rw-r--r--contrib/llvm/tools/clang/lib/Parse/ParseExprCXX.cpp49
-rw-r--r--contrib/llvm/tools/clang/lib/Parse/ParseObjc.cpp46
-rw-r--r--contrib/llvm/tools/clang/lib/Parse/ParseStmt.cpp23
-rw-r--r--contrib/llvm/tools/clang/lib/Parse/ParseTemplate.cpp4
-rw-r--r--contrib/llvm/tools/clang/lib/Parse/ParseTentative.cpp3
-rw-r--r--contrib/llvm/tools/clang/lib/Parse/Parser.cpp26
-rw-r--r--contrib/llvm/tools/clang/lib/Rewrite/FixItRewriter.cpp3
-rw-r--r--contrib/llvm/tools/clang/lib/Rewrite/HTMLRewrite.cpp2
-rw-r--r--contrib/llvm/tools/clang/lib/Rewrite/RewriteObjC.cpp20
-rw-r--r--contrib/llvm/tools/clang/lib/Rewrite/Rewriter.cpp73
-rw-r--r--contrib/llvm/tools/clang/lib/Sema/AnalysisBasedWarnings.cpp84
-rw-r--r--contrib/llvm/tools/clang/lib/Sema/AttributeList.cpp6
-rw-r--r--contrib/llvm/tools/clang/lib/Sema/CodeCompleteConsumer.cpp8
-rw-r--r--contrib/llvm/tools/clang/lib/Sema/DeclSpec.cpp80
-rw-r--r--contrib/llvm/tools/clang/lib/Sema/DelayedDiagnostic.cpp3
-rw-r--r--contrib/llvm/tools/clang/lib/Sema/JumpDiagnostics.cpp224
-rw-r--r--contrib/llvm/tools/clang/lib/Sema/Sema.cpp59
-rw-r--r--contrib/llvm/tools/clang/lib/Sema/SemaCXXCast.cpp162
-rw-r--r--contrib/llvm/tools/clang/lib/Sema/SemaCXXScopeSpec.cpp58
-rw-r--r--contrib/llvm/tools/clang/lib/Sema/SemaChecking.cpp541
-rw-r--r--contrib/llvm/tools/clang/lib/Sema/SemaCodeComplete.cpp154
-rw-r--r--contrib/llvm/tools/clang/lib/Sema/SemaDecl.cpp444
-rw-r--r--contrib/llvm/tools/clang/lib/Sema/SemaDeclAttr.cpp1115
-rw-r--r--contrib/llvm/tools/clang/lib/Sema/SemaDeclCXX.cpp575
-rw-r--r--contrib/llvm/tools/clang/lib/Sema/SemaDeclObjC.cpp540
-rw-r--r--contrib/llvm/tools/clang/lib/Sema/SemaExpr.cpp2769
-rw-r--r--contrib/llvm/tools/clang/lib/Sema/SemaExprCXX.cpp439
-rw-r--r--contrib/llvm/tools/clang/lib/Sema/SemaExprMember.cpp1594
-rw-r--r--contrib/llvm/tools/clang/lib/Sema/SemaExprObjC.cpp627
-rw-r--r--contrib/llvm/tools/clang/lib/Sema/SemaInit.cpp410
-rw-r--r--contrib/llvm/tools/clang/lib/Sema/SemaLookup.cpp990
-rw-r--r--contrib/llvm/tools/clang/lib/Sema/SemaObjCProperty.cpp432
-rw-r--r--contrib/llvm/tools/clang/lib/Sema/SemaOverload.cpp367
-rw-r--r--contrib/llvm/tools/clang/lib/Sema/SemaStmt.cpp77
-rw-r--r--contrib/llvm/tools/clang/lib/Sema/SemaTemplate.cpp134
-rw-r--r--contrib/llvm/tools/clang/lib/Sema/SemaTemplateDeduction.cpp328
-rw-r--r--contrib/llvm/tools/clang/lib/Sema/SemaTemplateInstantiate.cpp151
-rw-r--r--contrib/llvm/tools/clang/lib/Sema/SemaTemplateInstantiateDecl.cpp42
-rw-r--r--contrib/llvm/tools/clang/lib/Sema/SemaTemplateVariadic.cpp16
-rw-r--r--contrib/llvm/tools/clang/lib/Sema/SemaType.cpp848
-rw-r--r--contrib/llvm/tools/clang/lib/Sema/TreeTransform.h175
-rw-r--r--contrib/llvm/tools/clang/lib/Sema/TypeLocBuilder.h27
-rw-r--r--contrib/llvm/tools/clang/lib/Serialization/ASTReader.cpp77
-rw-r--r--contrib/llvm/tools/clang/lib/Serialization/ASTReaderDecl.cpp1
-rw-r--r--contrib/llvm/tools/clang/lib/Serialization/ASTReaderStmt.cpp263
-rw-r--r--contrib/llvm/tools/clang/lib/Serialization/ASTWriter.cpp63
-rw-r--r--contrib/llvm/tools/clang/lib/Serialization/ASTWriterDecl.cpp22
-rw-r--r--contrib/llvm/tools/clang/lib/Serialization/ASTWriterStmt.cpp228
-rw-r--r--contrib/llvm/tools/clang/lib/Serialization/ChainedIncludesSource.cpp3
-rw-r--r--contrib/llvm/tools/clang/lib/StaticAnalyzer/Checkers/BasicObjCFoundationChecks.cpp2
-rw-r--r--contrib/llvm/tools/clang/lib/StaticAnalyzer/Checkers/CStringChecker.cpp756
-rw-r--r--contrib/llvm/tools/clang/lib/StaticAnalyzer/Checkers/CallAndMessageChecker.cpp2
-rw-r--r--contrib/llvm/tools/clang/lib/StaticAnalyzer/Checkers/Checkers.td8
-rw-r--r--contrib/llvm/tools/clang/lib/StaticAnalyzer/Checkers/DeadStoresChecker.cpp6
-rw-r--r--contrib/llvm/tools/clang/lib/StaticAnalyzer/Checkers/IteratorsChecker.cpp27
-rw-r--r--contrib/llvm/tools/clang/lib/StaticAnalyzer/Checkers/MacOSXAPIChecker.cpp79
-rw-r--r--contrib/llvm/tools/clang/lib/StaticAnalyzer/Checkers/StackAddrEscapeChecker.cpp20
-rw-r--r--contrib/llvm/tools/clang/lib/StaticAnalyzer/Checkers/UnixAPIChecker.cpp110
-rw-r--r--contrib/llvm/tools/clang/lib/StaticAnalyzer/Core/CFRefCount.cpp142
-rw-r--r--contrib/llvm/tools/clang/lib/StaticAnalyzer/Core/Environment.cpp3
-rw-r--r--contrib/llvm/tools/clang/lib/StaticAnalyzer/Core/ExprEngine.cpp78
-rw-r--r--contrib/llvm/tools/clang/lib/StaticAnalyzer/Core/RegionStore.cpp7
-rw-r--r--contrib/llvm/tools/clang/lib/StaticAnalyzer/Core/SimpleSValBuilder.cpp36
-rw-r--r--contrib/llvm/tools/clang/lib/Tooling/CMakeLists.txt6
-rw-r--r--contrib/llvm/tools/clang/tools/driver/cc1_main.cpp2
-rw-r--r--contrib/llvm/tools/clang/tools/driver/cc1as_main.cpp24
-rw-r--r--contrib/llvm/tools/clang/tools/driver/driver.cpp8
-rw-r--r--contrib/llvm/utils/TableGen/ARMDecoderEmitter.cpp25
-rw-r--r--contrib/llvm/utils/TableGen/AsmMatcherEmitter.cpp99
-rw-r--r--contrib/llvm/utils/TableGen/AsmWriterEmitter.cpp332
-rw-r--r--contrib/llvm/utils/TableGen/ClangDiagnosticsEmitter.cpp12
-rw-r--r--contrib/llvm/utils/TableGen/CodeEmitterGen.cpp9
-rw-r--r--contrib/llvm/utils/TableGen/CodeGenDAGPatterns.cpp30
-rw-r--r--contrib/llvm/utils/TableGen/CodeGenDAGPatterns.h2
-rw-r--r--contrib/llvm/utils/TableGen/CodeGenInstruction.cpp23
-rw-r--r--contrib/llvm/utils/TableGen/CodeGenInstruction.h13
-rw-r--r--contrib/llvm/utils/TableGen/CodeGenRegisters.cpp351
-rw-r--r--contrib/llvm/utils/TableGen/CodeGenRegisters.h115
-rw-r--r--contrib/llvm/utils/TableGen/CodeGenTarget.cpp33
-rw-r--r--contrib/llvm/utils/TableGen/CodeGenTarget.h77
-rw-r--r--contrib/llvm/utils/TableGen/DAGISelMatcherGen.cpp35
-rw-r--r--contrib/llvm/utils/TableGen/DisassemblerEmitter.cpp1
-rw-r--r--contrib/llvm/utils/TableGen/EDEmitter.cpp36
-rw-r--r--contrib/llvm/utils/TableGen/Error.cpp39
-rw-r--r--contrib/llvm/utils/TableGen/Error.h43
-rw-r--r--contrib/llvm/utils/TableGen/FastISelEmitter.cpp17
-rw-r--r--contrib/llvm/utils/TableGen/FixedLenDecoderEmitter.cpp13
-rw-r--r--contrib/llvm/utils/TableGen/InstrInfoEmitter.cpp246
-rw-r--r--contrib/llvm/utils/TableGen/InstrInfoEmitter.h10
-rw-r--r--contrib/llvm/utils/TableGen/IntrinsicEmitter.cpp4
-rw-r--r--contrib/llvm/utils/TableGen/LLVMCConfigurationEmitter.cpp4
-rw-r--r--contrib/llvm/utils/TableGen/NeonEmitter.cpp1
-rw-r--r--contrib/llvm/utils/TableGen/PseudoLoweringEmitter.cpp243
-rw-r--r--contrib/llvm/utils/TableGen/PseudoLoweringEmitter.h65
-rw-r--r--contrib/llvm/utils/TableGen/Record.cpp20
-rw-r--r--contrib/llvm/utils/TableGen/Record.h25
-rw-r--r--contrib/llvm/utils/TableGen/RegisterInfoEmitter.cpp650
-rw-r--r--contrib/llvm/utils/TableGen/RegisterInfoEmitter.h23
-rw-r--r--contrib/llvm/utils/TableGen/SetTheory.cpp8
-rw-r--r--contrib/llvm/utils/TableGen/SetTheory.h2
-rw-r--r--contrib/llvm/utils/TableGen/SubtargetEmitter.cpp242
-rw-r--r--contrib/llvm/utils/TableGen/SubtargetEmitter.h9
-rw-r--r--contrib/llvm/utils/TableGen/TGLexer.cpp12
-rw-r--r--contrib/llvm/utils/TableGen/TGLexer.h3
-rw-r--r--contrib/llvm/utils/TableGen/TGParser.h5
-rw-r--r--contrib/llvm/utils/TableGen/TableGen.cpp55
-rw-r--r--contrib/llvm/utils/TableGen/X86RecognizableInstr.cpp26
-rw-r--r--contrib/llvm/utils/TableGen/X86RecognizableInstr.h2
-rw-r--r--contrib/lukemftpd/src/ftpd.c10
-rw-r--r--contrib/pf/man/pf.414
-rw-r--r--contrib/sendmail/src/deliver.c6
-rw-r--r--contrib/top/commands.c1
-rw-r--r--contrib/top/display.c21
-rw-r--r--contrib/top/top.X11
-rw-r--r--contrib/top/top.c23
-rw-r--r--contrib/xz/ChangeLog325
-rw-r--r--contrib/xz/FREEBSD-Xlist1
-rw-r--r--contrib/xz/FREEBSD-upgrade4
-rw-r--r--contrib/xz/THANKS9
-rw-r--r--contrib/xz/po/LINGUAS2
-rw-r--r--contrib/xz/po/fr.po864
-rw-r--r--contrib/xz/po/it.po333
-rw-r--r--contrib/xz/po/pl.po825
-rw-r--r--contrib/xz/src/common/tuklib_open_stdxxx.c4
-rw-r--r--contrib/xz/src/liblzma/api/lzma/block.h1
-rw-r--r--contrib/xz/src/liblzma/api/lzma/container.h12
-rw-r--r--contrib/xz/src/liblzma/api/lzma/filter.h8
-rw-r--r--contrib/xz/src/liblzma/api/lzma/version.h2
-rw-r--r--contrib/xz/src/liblzma/common/alone_decoder.c2
-rw-r--r--contrib/xz/src/liblzma/common/alone_encoder.c4
-rw-r--r--contrib/xz/src/liblzma/common/block_buffer_encoder.c18
-rw-r--r--contrib/xz/src/liblzma/common/block_encoder.c7
-rw-r--r--contrib/xz/src/liblzma/common/common.c2
-rw-r--r--contrib/xz/src/liblzma/common/common.h2
-rw-r--r--contrib/xz/src/liblzma/common/filter_common.c6
-rw-r--r--contrib/xz/src/liblzma/common/index.c7
-rw-r--r--contrib/xz/src/liblzma/common/index_decoder.c9
-rw-r--r--contrib/xz/src/liblzma/common/index_encoder.c11
-rw-r--r--contrib/xz/src/liblzma/common/stream_buffer_encoder.c23
-rw-r--r--contrib/xz/src/liblzma/common/stream_encoder.c2
-rw-r--r--contrib/xz/src/liblzma/delta/delta_encoder.c2
-rw-r--r--contrib/xz/src/liblzma/lz/lz_decoder.c2
-rw-r--r--contrib/xz/src/liblzma/lz/lz_encoder.c2
-rw-r--r--contrib/xz/src/liblzma/lz/lz_encoder_hash.h2
-rw-r--r--contrib/xz/src/liblzma/lzma/lzma2_decoder.c8
-rw-r--r--contrib/xz/src/liblzma/lzma/lzma2_encoder.c2
-rw-r--r--contrib/xz/src/liblzma/simple/arm.c2
-rw-r--r--contrib/xz/src/liblzma/simple/armthumb.c2
-rw-r--r--contrib/xz/src/liblzma/simple/ia64.c2
-rw-r--r--contrib/xz/src/liblzma/simple/powerpc.c2
-rw-r--r--contrib/xz/src/liblzma/simple/simple_coder.c2
-rw-r--r--contrib/xz/src/liblzma/simple/sparc.c2
-rw-r--r--contrib/xz/src/lzmainfo/lzmainfo.c4
-rw-r--r--contrib/xz/src/xz/coder.c2
-rw-r--r--contrib/xz/src/xz/file_io.c2
-rw-r--r--contrib/xz/src/xz/hardware.h2
-rw-r--r--contrib/xz/src/xz/list.c21
-rw-r--r--contrib/xz/src/xz/message.c8
-rw-r--r--contrib/xz/src/xz/message.h18
-rw-r--r--contrib/xz/src/xz/options.c6
-rw-r--r--contrib/xz/src/xz/signals.c2
-rw-r--r--contrib/xz/src/xz/suffix.c53
-rw-r--r--contrib/xz/src/xz/util.h6
-rw-r--r--contrib/xz/src/xz/xz.12
-rw-r--r--contrib/xz/src/xzdec/xzdec.c6
-rw-r--r--etc/namedb/named.conf20
-rw-r--r--etc/namedb/named.root5
-rw-r--r--etc/rc.d/Makefile2
-rwxr-xr-xetc/rc.d/kld17
-rwxr-xr-xetc/rc.d/lockd2
-rwxr-xr-xetc/rc.d/mountd2
-rwxr-xr-xetc/rc.d/nfsd6
-rwxr-xr-xetc/rc.d/nfsserver19
-rwxr-xr-xetc/rc.d/routing42
-rwxr-xr-xetc/rc.d/statd2
-rw-r--r--etc/regdomain.xml68
-rw-r--r--gnu/lib/libdialog/Makefile10
-rw-r--r--gnu/usr.bin/groff/tmac/mdoc.local1
-rw-r--r--include/rpc/xdr.h1
-rw-r--r--lib/bind/Makefile2
-rw-r--r--lib/bind/config.h54
-rw-r--r--lib/bind/config.mk27
-rw-r--r--lib/bind/dns/Makefile21
-rw-r--r--lib/bind/dns/code.h147
-rw-r--r--lib/bind/dns/dns/enumtype.h4
-rw-r--r--lib/bind/dns/dns/rdatastruct.h194
-rw-r--r--lib/bind/isc/Makefile20
-rw-r--r--lib/bind/isc/backtrace-emptytbl.c36
-rw-r--r--lib/bind/isc/isc/platform.h53
-rw-r--r--lib/bind/lwres/lwres/netdb.h2
-rw-r--r--lib/bind/lwres/lwres/platform.h2
-rw-r--r--lib/clang/Makefile6
-rw-r--r--lib/clang/clang.build.mk89
-rw-r--r--lib/clang/include/ARMGenInstrNames.inc2
-rw-r--r--lib/clang/include/ARMGenMCPseudoLowering.inc2
-rw-r--r--lib/clang/include/ARMGenRegisterInfo.h.inc2
-rw-r--r--lib/clang/include/ARMGenRegisterNames.inc2
-rw-r--r--lib/clang/include/ARMGenSubtarget.inc2
-rw-r--r--lib/clang/include/ARMGenSubtargetInfo.inc2
-rw-r--r--lib/clang/include/IA64GenInstrNames.inc2
-rw-r--r--lib/clang/include/IA64GenRegisterInfo.h.inc2
-rw-r--r--lib/clang/include/IA64GenRegisterNames.inc2
-rw-r--r--lib/clang/include/MipsGenInstrNames.inc2
-rw-r--r--lib/clang/include/MipsGenRegisterInfo.h.inc2
-rw-r--r--lib/clang/include/MipsGenRegisterNames.inc2
-rw-r--r--lib/clang/include/MipsGenSubtarget.inc2
-rw-r--r--lib/clang/include/MipsGenSubtargetInfo.inc2
-rw-r--r--lib/clang/include/PPCGenInstrNames.inc2
-rw-r--r--lib/clang/include/PPCGenRegisterInfo.h.inc2
-rw-r--r--lib/clang/include/PPCGenRegisterNames.inc2
-rw-r--r--lib/clang/include/PPCGenSubtarget.inc2
-rw-r--r--lib/clang/include/PPCGenSubtargetInfo.inc2
-rw-r--r--lib/clang/include/X86GenInstrNames.inc2
-rw-r--r--lib/clang/include/X86GenRegisterInfo.h.inc2
-rw-r--r--lib/clang/include/X86GenRegisterNames.inc2
-rw-r--r--lib/clang/include/X86GenSubtarget.inc2
-rw-r--r--lib/clang/include/X86GenSubtargetInfo.inc2
-rw-r--r--lib/clang/include/clang/Basic/Version.inc4
-rw-r--r--lib/clang/include/llvm/Config/config.h9
-rw-r--r--lib/clang/include/llvm/Config/llvm-config.h6
-rw-r--r--lib/clang/libclangarcmigrate/Makefile29
-rw-r--r--lib/clang/libclangfrontend/Makefile1
-rw-r--r--lib/clang/libclangsema/Makefile1
-rw-r--r--lib/clang/libllvmanalysis/Makefile1
-rw-r--r--lib/clang/libllvmarmasmparser/Makefile6
-rw-r--r--lib/clang/libllvmarmcodegen/Makefile10
-rw-r--r--lib/clang/libllvmarmdesc/Makefile13
-rw-r--r--lib/clang/libllvmarmdisassembler/Makefile5
-rw-r--r--lib/clang/libllvmarminfo/Makefile5
-rw-r--r--lib/clang/libllvmarminstprinter/Makefile5
-rw-r--r--lib/clang/libllvmcodegen/Makefile2
-rw-r--r--lib/clang/libllvmcore/Makefile1
-rw-r--r--lib/clang/libllvmipo/Makefile1
-rw-r--r--lib/clang/libllvmmc/Makefile2
-rw-r--r--lib/clang/libllvmmipscodegen/Makefile8
-rw-r--r--lib/clang/libllvmmipsdesc/Makefile13
-rw-r--r--lib/clang/libllvmmipsinfo/Makefile5
-rw-r--r--lib/clang/libllvmmipsinstprinter/Makefile13
-rw-r--r--lib/clang/libllvmpowerpccodegen/Makefile6
-rw-r--r--lib/clang/libllvmpowerpcdesc/Makefile13
-rw-r--r--lib/clang/libllvmpowerpcinfo/Makefile5
-rw-r--r--lib/clang/libllvmpowerpcinstprinter/Makefile6
-rw-r--r--lib/clang/libllvmscalaropts/Makefile1
-rw-r--r--lib/clang/libllvmsupport/Makefile1
-rw-r--r--lib/clang/libllvmtarget/Makefile3
-rw-r--r--lib/clang/libllvmtransformutils/Makefile2
-rw-r--r--lib/clang/libllvmx86asmparser/Makefile5
-rw-r--r--lib/clang/libllvmx86codegen/Makefile6
-rw-r--r--lib/clang/libllvmx86desc/Makefile13
-rw-r--r--lib/clang/libllvmx86disassembler/Makefile2
-rw-r--r--lib/clang/libllvmx86info/Makefile5
-rw-r--r--lib/clang/libllvmx86instprinter/Makefile5
-rw-r--r--lib/libarchive/Makefile5
-rw-r--r--lib/libarchive/README11
-rw-r--r--lib/libarchive/archive.h10
-rw-r--r--lib/libarchive/archive_hash.h171
-rw-r--r--lib/libarchive/archive_read.32
-rw-r--r--lib/libarchive/archive_read_disk_entry_from_file.c13
-rw-r--r--lib/libarchive/archive_read_disk_set_standard_lookup.c31
-rw-r--r--lib/libarchive/archive_read_support_compression_all.c2
-rw-r--r--lib/libarchive/archive_read_support_compression_bzip2.c6
-rw-r--r--lib/libarchive/archive_read_support_compression_rpm.c288
-rw-r--r--lib/libarchive/archive_read_support_compression_uu.c2
-rw-r--r--lib/libarchive/archive_read_support_format_all.c1
-rw-r--r--lib/libarchive/archive_read_support_format_mtree.c2
-rw-r--r--lib/libarchive/archive_read_support_format_xar.c3151
-rw-r--r--lib/libarchive/archive_write_disk.c2
-rw-r--r--lib/libarchive/archive_write_disk_set_standard_lookup.c20
-rw-r--r--lib/libarchive/archive_write_set_compression_bzip2.c4
-rw-r--r--lib/libarchive/config_freebsd.h19
-rw-r--r--lib/libarchive/filter_fork.c4
-rw-r--r--lib/libarchive/libarchive_fe/err.c (renamed from usr.bin/cpio/err.c)16
-rw-r--r--lib/libarchive/libarchive_fe/err.h (renamed from usr.bin/cpio/err.h)6
-rw-r--r--lib/libarchive/libarchive_fe/lafe_platform.h (renamed from usr.bin/cpio/pathmatch.h)35
-rw-r--r--lib/libarchive/libarchive_fe/line_reader.c (renamed from usr.bin/tar/line_reader.c)14
-rw-r--r--lib/libarchive/libarchive_fe/line_reader.h (renamed from usr.bin/tar/line_reader.h)0
-rw-r--r--lib/libarchive/libarchive_fe/matching.c (renamed from usr.bin/tar/matching.c)8
-rw-r--r--lib/libarchive/libarchive_fe/matching.h (renamed from usr.bin/tar/matching.h)0
-rw-r--r--lib/libarchive/libarchive_fe/pathmatch.c (renamed from usr.bin/tar/pathmatch.c)2
-rw-r--r--lib/libarchive/libarchive_fe/pathmatch.h (renamed from usr.bin/tar/pathmatch.h)0
-rw-r--r--lib/libarchive/test/Makefile3
-rw-r--r--lib/libarchive/test/main.c18
-rw-r--r--lib/libarchive/test/read_open_memory.c21
-rw-r--r--lib/libarchive/test/test.h7
-rw-r--r--lib/libarchive/test/test_entry.c12
-rw-r--r--lib/libarchive/test/test_fuzz.c7
-rw-r--r--lib/libarchive/test/test_pax_filename_encoding.c2
-rw-r--r--lib/libarchive/test/test_read_data_large.c2
-rw-r--r--lib/libarchive/test/test_read_format_cpio_svr4_bzip2_rpm.c128
-rw-r--r--lib/libarchive/test/test_read_format_cpio_svr4_bzip2_rpm.rpm.uu49
-rw-r--r--lib/libarchive/test/test_read_format_cpio_svr4_gzip_rpm.c128
-rw-r--r--lib/libarchive/test/test_read_format_cpio_svr4_gzip_rpm.rpm.uu48
-rw-r--r--lib/libarchive/test/test_read_format_xar.c697
-rw-r--r--lib/libarchive/test/test_read_large.c2
-rw-r--r--lib/libarchive/test/test_read_truncated.c4
-rw-r--r--lib/libarchive/test/test_ustar_filenames.c2
-rw-r--r--lib/libarchive/test/test_write_format_cpio.c24
-rw-r--r--lib/libc/gen/posix_spawn.c5
-rw-r--r--lib/libc/sys/rfork.216
-rw-r--r--lib/libc/xdr/Makefile.inc4
-rw-r--r--lib/libc/xdr/Symbol.map5
-rw-r--r--lib/libc/xdr/xdr.318
-rw-r--r--lib/libc/xdr/xdr_sizeof.c4
-rw-r--r--lib/libkvm/kvm_pcpu.c31
-rw-r--r--lib/liblzma/config.h10
-rw-r--r--lib/libprocstat/Makefile6
-rw-r--r--lib/libprocstat/libprocstat.3258
-rw-r--r--lib/libstand/stand.h6
-rw-r--r--lib/libstand/zalloc.c22
-rw-r--r--lib/libstand/zalloc_defs.h17
-rw-r--r--lib/libstand/zalloc_malloc.c2
-rw-r--r--lib/libstand/zalloc_mem.h6
-rw-r--r--lib/libstand/zalloc_protos.h6
-rw-r--r--lib/libusb/libusb.32
-rw-r--r--lib/libusb/libusb01.c70
-rw-r--r--lib/libusb/libusb10.c2
-rw-r--r--lib/libusb/libusb10_desc.c9
-rw-r--r--lib/libusb/libusb20.c2
-rw-r--r--lib/libusb/usb.h2
-rw-r--r--lib/libutil/login.conf.53
-rw-r--r--release/Makefile7
-rwxr-xr-xrelease/generate-release.sh3
-rwxr-xr-xrelease/ia64/make-memstick.sh38
-rw-r--r--sbin/dumpfs/dumpfs.811
-rw-r--r--sbin/dumpfs/dumpfs.c21
-rw-r--r--sbin/fdisk/fdisk.c8
-rw-r--r--sbin/fsck_ffs/fsck.h1
-rw-r--r--sbin/fsck_ffs/pass5.c72
-rw-r--r--sbin/hastctl/hastctl.c6
-rw-r--r--sbin/hastd/control.c3
-rw-r--r--sbin/hastd/primary.c2
-rw-r--r--sbin/ifconfig/Makefile1
-rw-r--r--sbin/ifconfig/af_inet.c3
-rw-r--r--sbin/ifconfig/af_inet6.c2
-rw-r--r--sbin/ifconfig/ifconfig.815
-rw-r--r--sbin/ifconfig/ifconfig.c2
-rw-r--r--sbin/ifconfig/iffib.c103
-rw-r--r--sbin/natd/natd.82
-rw-r--r--sbin/newfs_msdos/newfs_msdos.c24
-rw-r--r--sbin/shutdown/shutdown.830
-rw-r--r--sbin/umount/umount.c2
-rw-r--r--share/doc/bind9/Makefile13
-rw-r--r--share/man/man3/pthread_set_name_np.33
-rw-r--r--share/man/man4/axe.485
-rw-r--r--share/man/man8/picobsd.83
-rw-r--r--share/man/man9/Makefile10
-rw-r--r--share/man/man9/copy.956
-rw-r--r--share/man/man9/fail.97
-rw-r--r--share/man/man9/ifnet.911
-rw-r--r--share/man/man9/uio.945
-rw-r--r--share/man/man9/vm_map.911
-rw-r--r--share/man/man9/vm_map_sync.9 (renamed from share/man/man9/vm_map_clean.9)16
-rw-r--r--share/man/man9/vm_page_copy.957
-rw-r--r--share/man/man9/vm_page_protect.975
-rw-r--r--share/man/man9/vm_page_zero_fill.953
-rw-r--r--share/misc/committers-ports.dot3
-rw-r--r--share/misc/pci_vendors31202
-rw-r--r--sys/amd64/acpica/acpi_wakeup.c3
-rw-r--r--sys/amd64/amd64/genassym.c1
-rw-r--r--sys/amd64/amd64/intr_machdep.c5
-rw-r--r--sys/amd64/amd64/mp_machdep.c71
-rw-r--r--sys/amd64/amd64/pmap.c72
-rw-r--r--sys/amd64/amd64/support.S12
-rw-r--r--sys/amd64/amd64/vm_machdep.c9
-rw-r--r--sys/amd64/include/cpufunc.h12
-rw-r--r--sys/arm/arm/irq_dispatch.S10
-rw-r--r--sys/arm/arm/pmap.c9
-rw-r--r--sys/arm/mv/gpio.c21
-rw-r--r--sys/arm/mv/mv_machdep.c8
-rw-r--r--sys/arm/sa11x0/sa11x0_irq.S13
-rw-r--r--sys/boot/common/disk.c21
-rw-r--r--sys/boot/common/ufsread.c66
-rw-r--r--sys/boot/i386/Makefile.inc1
-rw-r--r--sys/boot/i386/boot2/Makefile3
-rw-r--r--sys/boot/i386/zfsboot/Makefile3
-rw-r--r--sys/boot/powerpc/ps3/Makefile4
-rw-r--r--sys/boot/powerpc/ps3/conf.c6
-rw-r--r--sys/boot/powerpc/ps3/devicename.c20
-rw-r--r--sys/boot/powerpc/ps3/lv1call.S98
-rw-r--r--sys/boot/powerpc/ps3/lv1call.h8
-rw-r--r--sys/boot/powerpc/ps3/main.c46
-rw-r--r--sys/boot/powerpc/ps3/ps3bus.h41
-rw-r--r--sys/boot/powerpc/ps3/ps3devdesc.h53
-rw-r--r--sys/boot/powerpc/ps3/ps3disk.c313
-rw-r--r--sys/boot/powerpc/ps3/ps3repo.c249
-rw-r--r--sys/boot/powerpc/ps3/ps3repo.h51
-rw-r--r--sys/boot/powerpc/ps3/ps3stor.c165
-rw-r--r--sys/boot/powerpc/ps3/ps3stor.h59
-rw-r--r--sys/boot/powerpc/ps3/version2
-rw-r--r--sys/boot/sparc64/loader/main.c88
-rw-r--r--sys/boot/userboot/userboot/Makefile2
-rw-r--r--sys/cddl/contrib/opensolaris/common/acl/acl_common.c119
-rw-r--r--sys/cddl/contrib/opensolaris/common/acl/acl_common.h20
-rw-r--r--sys/cddl/contrib/opensolaris/common/zfs/zfs_prop.c17
-rw-r--r--sys/cddl/contrib/opensolaris/uts/common/fs/zfs/metaslab.c111
-rw-r--r--sys/cddl/contrib/opensolaris/uts/common/fs/zfs/spa_misc.c7
-rw-r--r--sys/cddl/contrib/opensolaris/uts/common/fs/zfs/sys/metaslab.h3
-rw-r--r--sys/cddl/contrib/opensolaris/uts/common/fs/zfs/sys/metaslab_impl.h2
-rw-r--r--sys/cddl/contrib/opensolaris/uts/common/fs/zfs/sys/spa.h8
-rw-r--r--sys/cddl/contrib/opensolaris/uts/common/fs/zfs/sys/spa_impl.h2
-rw-r--r--sys/cddl/contrib/opensolaris/uts/common/fs/zfs/sys/zfs_acl.h2
-rw-r--r--sys/cddl/contrib/opensolaris/uts/common/fs/zfs/sys/zfs_vfsops.h1
-rw-r--r--sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_acl.c155
-rw-r--r--sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_vfsops.c14
-rw-r--r--sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_vnops.c3
-rw-r--r--sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zio.c25
-rw-r--r--sys/cddl/contrib/opensolaris/uts/common/sys/fs/zfs.h2
-rw-r--r--sys/cddl/dev/dtrace/amd64/dtrace_subr.c4
-rw-r--r--sys/cddl/dev/dtrace/i386/dtrace_subr.c4
-rw-r--r--sys/compat/freebsd32/freebsd32.h2
-rw-r--r--sys/compat/freebsd32/freebsd32_proto.h2
-rw-r--r--sys/compat/freebsd32/freebsd32_syscall.h4
-rw-r--r--sys/compat/freebsd32/freebsd32_syscalls.c6
-rw-r--r--sys/compat/freebsd32/freebsd32_sysent.c6
-rw-r--r--sys/compat/freebsd32/freebsd32_systrace_args.c42
-rw-r--r--sys/compat/freebsd32/syscalls.master5
-rw-r--r--sys/compat/linux/linux_ipc.c10
-rw-r--r--sys/conf/Makefile.mips21
-rw-r--r--sys/conf/NOTES12
-rw-r--r--sys/conf/files5
-rw-r--r--sys/conf/files.i3862
-rw-r--r--sys/conf/files.mips1
-rw-r--r--sys/conf/options3
-rw-r--r--sys/conf/options.mips9
-rw-r--r--sys/dev/acpica/acpi_pcib_acpi.c159
-rw-r--r--sys/dev/adb/adb_kbd.c1
-rw-r--r--sys/dev/ahci/ahci.c1
-rw-r--r--sys/dev/aic7xxx/aicasm/aicasm.c2
-rw-r--r--sys/dev/aic7xxx/aicasm/aicasm.h4
-rw-r--r--sys/dev/aic7xxx/aicasm/aicasm_gram.y5
-rw-r--r--sys/dev/aic7xxx/aicasm/aicasm_macro_gram.y5
-rw-r--r--sys/dev/aic7xxx/aicasm/aicasm_macro_scan.l4
-rw-r--r--sys/dev/aic7xxx/aicasm/aicasm_scan.l4
-rw-r--r--sys/dev/aic7xxx/aicasm/aicasm_symbol.c8
-rw-r--r--sys/dev/aic7xxx/aicasm/aicasm_symbol.h4
-rw-r--r--sys/dev/ath/ah_osdep.c4
-rw-r--r--sys/dev/atkbdc/atkbd.c1
-rw-r--r--sys/dev/cas/if_cas.c133
-rw-r--r--sys/dev/cas/if_casvar.h2
-rw-r--r--sys/dev/e1000/if_igb.c6
-rw-r--r--sys/dev/gem/if_gem.c61
-rw-r--r--sys/dev/gem/if_gem_pci.c4
-rw-r--r--sys/dev/gem/if_gemreg.h23
-rw-r--r--sys/dev/iicbus/if_ic.c1
-rw-r--r--sys/dev/kbd/kbd.c40
-rw-r--r--sys/dev/kbdmux/kbdmux.c1
-rw-r--r--sys/dev/lmc/if_lmc.c1
-rw-r--r--sys/dev/md/md.c1
-rw-r--r--sys/dev/mfi/mfi.c19
-rw-r--r--sys/dev/mfi/mfireg.h2
-rw-r--r--sys/dev/mpt/mpt.h2
-rw-r--r--sys/dev/mpt/mpt_pci.c51
-rw-r--r--sys/dev/mxge/eth_z8e.h14774
-rw-r--r--sys/dev/mxge/ethp_z8e.h14855
-rw-r--r--sys/dev/mxge/if_mxge.c2
-rw-r--r--sys/dev/mxge/rss_eth_z8e.h19537
-rw-r--r--sys/dev/mxge/rss_ethp_z8e.h19682
-rw-r--r--sys/dev/pci/pci.c20
-rw-r--r--sys/dev/pci/pci_pci.c14
-rw-r--r--sys/dev/pci/pci_subr.c157
-rw-r--r--sys/dev/pci/pcib_private.h28
-rw-r--r--sys/dev/pci/pcivar.h1
-rw-r--r--sys/dev/ppbus/if_plip.c4
-rw-r--r--sys/dev/rt/if_rt.c2616
-rw-r--r--sys/dev/rt/if_rtreg.h289
-rw-r--r--sys/dev/rt/if_rtvar.h282
-rw-r--r--sys/dev/sound/usb/uaudio.c51
-rw-r--r--sys/dev/syscons/syscons.c2
-rw-r--r--sys/dev/uart/uart_bus_pci.c1
-rw-r--r--sys/dev/uart/uart_kbd_sun.c1
-rw-r--r--sys/dev/usb/input/uhid.c12
-rw-r--r--sys/dev/usb/input/ukbd.c623
-rw-r--r--sys/dev/usb/net/if_aue.c1
-rw-r--r--sys/dev/usb/net/if_axe.c121
-rw-r--r--sys/dev/usb/net/if_axereg.h29
-rw-r--r--sys/dev/usb/net/if_mos.c1
-rw-r--r--sys/dev/usb/net/if_rue.c1
-rw-r--r--sys/dev/usb/net/if_udav.c1
-rw-r--r--sys/dev/usb/net/if_usie.c1586
-rw-r--r--sys/dev/usb/net/if_usievar.h256
-rw-r--r--sys/dev/usb/net/uhso.c1
-rw-r--r--sys/dev/usb/quirk/usb_quirk.c2
-rw-r--r--sys/dev/usb/quirk/usb_quirk.h1
-rw-r--r--sys/dev/usb/usb_hid.c37
-rw-r--r--sys/dev/usb/usb_request.c35
-rw-r--r--sys/dev/usb/usbdevs6
-rw-r--r--sys/dev/usb/usbhid.h2
-rw-r--r--sys/dev/vkbd/vkbd.c1
-rw-r--r--sys/dev/xen/control/control.c9
-rw-r--r--sys/fs/devfs/devfs_vnops.c18
-rw-r--r--sys/fs/nfs/nfs_commonacl.c38
-rw-r--r--sys/fs/nfs/nfs_commonkrpc.c15
-rw-r--r--sys/fs/nfs/nfs_commonport.c59
-rw-r--r--sys/fs/nfs/nfs_commonsubs.c246
-rw-r--r--sys/fs/nfs/nfs_var.h5
-rw-r--r--sys/fs/nfs/nfsdport.h16
-rw-r--r--sys/fs/nfs/nfsport.h9
-rw-r--r--sys/fs/nfsclient/nfs_clport.c4
-rw-r--r--sys/fs/nfsclient/nfs_clrpcops.c46
-rw-r--r--sys/fs/nfsclient/nfs_clstate.c181
-rw-r--r--sys/fs/nfsclient/nfs_clsubs.c6
-rw-r--r--sys/fs/nfsclient/nfs_clvfsops.c6
-rw-r--r--sys/fs/nfsclient/nfs_clvnops.c44
-rw-r--r--sys/fs/nfsserver/nfs_nfsdcache.c23
-rw-r--r--sys/fs/nfsserver/nfs_nfsdkrpc.c42
-rw-r--r--sys/fs/nfsserver/nfs_nfsdport.c325
-rw-r--r--sys/fs/nfsserver/nfs_nfsdserv.c377
-rw-r--r--sys/fs/nfsserver/nfs_nfsdsocket.c25
-rw-r--r--sys/fs/nfsserver/nfs_nfsdstate.c396
-rw-r--r--sys/fs/nfsserver/nfs_nfsdsubs.c74
-rw-r--r--sys/fs/smbfs/smbfs_smb.c2
-rw-r--r--sys/geom/cache/g_cache.c1
-rw-r--r--sys/geom/concat/g_concat.c1
-rw-r--r--sys/geom/eli/g_eli.c1
-rw-r--r--sys/geom/gate/g_gate.c1
-rw-r--r--sys/geom/geom.h6
-rw-r--r--sys/geom/geom_bsd.c1
-rw-r--r--sys/geom/geom_ccd.c1
-rw-r--r--sys/geom/geom_disk.c1
-rw-r--r--sys/geom/geom_pc98.c1
-rw-r--r--sys/geom/geom_sunlabel.c1
-rw-r--r--sys/geom/geom_vfs.c2
-rw-r--r--sys/geom/label/g_label_gpt.c1
-rw-r--r--sys/geom/mirror/g_mirror.c1
-rw-r--r--sys/geom/mountver/g_mountver.c1
-rw-r--r--sys/geom/multipath/g_multipath.c1
-rw-r--r--sys/geom/nop/g_nop.c1
-rw-r--r--sys/geom/raid/g_raid.c1
-rw-r--r--sys/geom/raid3/g_raid3.c1
-rw-r--r--sys/geom/sched/g_sched.c1
-rw-r--r--sys/geom/sched/gs_rr.c1
-rw-r--r--sys/geom/shsec/g_shsec.c1
-rw-r--r--sys/geom/stripe/g_stripe.c1
-rw-r--r--sys/geom/vinum/geom_vinum.c1
-rw-r--r--sys/geom/vinum/geom_vinum_drive.c2
-rw-r--r--sys/geom/vinum/geom_vinum_list.c2
-rw-r--r--sys/geom/vinum/geom_vinum_subr.c1
-rw-r--r--sys/geom/virstor/g_virstor.c1
-rw-r--r--sys/i386/Makefile3
-rw-r--r--sys/i386/i386/genassym.c1
-rw-r--r--sys/i386/i386/intr_machdep.c5
-rw-r--r--sys/i386/i386/mp_machdep.c60
-rw-r--r--sys/i386/i386/pmap.c92
-rw-r--r--sys/i386/i386/support.s12
-rw-r--r--sys/i386/i386/vm_machdep.c20
-rw-r--r--sys/i386/ibcs2/ibcs2_ioctl.c4
-rw-r--r--sys/i386/include/cpufunc.h12
-rw-r--r--sys/i386/xen/mp_machdep.c54
-rw-r--r--sys/i386/xen/mptable.c23
-rw-r--r--sys/i386/xen/pmap.c55
-rw-r--r--sys/ia64/conf/DEFAULTS2
-rw-r--r--sys/ia64/conf/GENERIC2
-rw-r--r--sys/ia64/ia64/clock.c4
-rw-r--r--sys/ia64/ia64/efi.c55
-rw-r--r--sys/ia64/ia64/exception.S225
-rw-r--r--sys/ia64/ia64/interrupt.c7
-rw-r--r--sys/ia64/ia64/locore.S7
-rw-r--r--sys/ia64/ia64/mp_machdep.c16
-rw-r--r--sys/ia64/ia64/nexus.c51
-rw-r--r--sys/ia64/ia64/pmap.c186
-rw-r--r--sys/ia64/include/efi.h3
-rw-r--r--sys/ia64/include/pmap.h10
-rw-r--r--sys/ia64/include/sf_buf.h16
-rw-r--r--sys/kern/Make.tags.inc2
-rw-r--r--sys/kern/imgact_elf.c2
-rw-r--r--sys/kern/init_sysent.c4
-rw-r--r--sys/kern/kern_clock.c2
-rw-r--r--sys/kern/kern_descrip.c122
-rw-r--r--sys/kern/kern_exec.c5
-rw-r--r--sys/kern/kern_exit.c6
-rw-r--r--sys/kern/kern_fail.c171
-rw-r--r--sys/kern/kern_fork.c23
-rw-r--r--sys/kern/kern_intr.c11
-rw-r--r--sys/kern/kern_jail.c1
-rw-r--r--sys/kern/kern_linker.c35
-rw-r--r--sys/kern/kern_mib.c36
-rw-r--r--sys/kern/kern_racct.c28
-rw-r--r--sys/kern/kern_rctl.c36
-rw-r--r--sys/kern/kern_rmlock.c6
-rw-r--r--sys/kern/kern_sysctl.c42
-rw-r--r--sys/kern/kern_tc.c6
-rw-r--r--sys/kern/kern_thr.c4
-rw-r--r--sys/kern/posix4_mib.c5
-rw-r--r--sys/kern/sched_4bsd.c57
-rw-r--r--sys/kern/subr_kdb.c16
-rw-r--r--sys/kern/subr_pcpu.c1
-rw-r--r--sys/kern/subr_smp.c18
-rw-r--r--sys/kern/subr_uio.c63
-rw-r--r--sys/kern/sys_capability.c399
-rw-r--r--sys/kern/syscalls.c4
-rw-r--r--sys/kern/syscalls.master5
-rw-r--r--sys/kern/systrace_args.c42
-rw-r--r--sys/kern/sysv_msg.c8
-rw-r--r--sys/kern/sysv_sem.c11
-rw-r--r--sys/kern/sysv_shm.c4
-rw-r--r--sys/kern/tty.c26
-rw-r--r--sys/kern/uipc_socket.c24
-rw-r--r--sys/kern/vfs_bio.c8
-rw-r--r--sys/kern/vfs_mount.c1
-rw-r--r--sys/kern/vfs_mountroot.c1
-rw-r--r--sys/kgssapi/gss_impl.c6
-rw-r--r--sys/mips/conf/RT305X6
-rw-r--r--sys/mips/conf/RT305X.hints11
-rw-r--r--sys/mips/conf/XLP93
-rw-r--r--sys/mips/conf/XLP6495
-rw-r--r--sys/mips/conf/XLPN3294
-rw-r--r--sys/mips/include/bus.h2
-rw-r--r--sys/mips/include/cpufunc.h4
-rw-r--r--sys/mips/include/intr_machdep.h2
-rw-r--r--sys/mips/malta/gt_pci.c12
-rw-r--r--sys/mips/mips/cache.c22
-rw-r--r--sys/mips/mips/cache_mipsNN.c25
-rw-r--r--sys/mips/mips/cpu.c6
-rw-r--r--sys/mips/mips/elf_trampoline.c47
-rw-r--r--sys/mips/mips/exception.S17
-rw-r--r--sys/mips/mips/locore.S2
-rw-r--r--sys/mips/mips/machdep.c2
-rw-r--r--sys/mips/mips/mp_machdep.c32
-rw-r--r--sys/mips/mips/pmap.c49
-rw-r--r--sys/mips/nlm/board.c80
-rw-r--r--sys/mips/nlm/board.h75
-rw-r--r--sys/mips/nlm/bus_space_rmi.c688
-rw-r--r--sys/mips/nlm/clock.h41
-rw-r--r--sys/mips/nlm/cms.c452
-rw-r--r--sys/mips/nlm/files.xlp12
-rw-r--r--sys/mips/nlm/hal/bridge.h177
-rw-r--r--sys/mips/nlm/hal/cop0.h280
-rw-r--r--sys/mips/nlm/hal/cop2.h327
-rw-r--r--sys/mips/nlm/hal/cpucontrol.h70
-rw-r--r--sys/mips/nlm/hal/fmn.c789
-rw-r--r--sys/mips/nlm/hal/fmn.h275
-rw-r--r--sys/mips/nlm/hal/iomap.h237
-rw-r--r--sys/mips/nlm/hal/mips-extns.h200
-rw-r--r--sys/mips/nlm/hal/mmio.h338
-rw-r--r--sys/mips/nlm/hal/mmu.h204
-rw-r--r--sys/mips/nlm/hal/pic.h427
-rw-r--r--sys/mips/nlm/hal/sys.h125
-rw-r--r--sys/mips/nlm/hal/uart.h196
-rw-r--r--sys/mips/nlm/interrupt.h49
-rw-r--r--sys/mips/nlm/intr_machdep.c253
-rw-r--r--sys/mips/nlm/iodi.c233
-rw-r--r--sys/mips/nlm/mpreset.S159
-rw-r--r--sys/mips/nlm/msgring.h44
-rw-r--r--sys/mips/nlm/std.xlp4
-rw-r--r--sys/mips/nlm/tick.c393
-rw-r--r--sys/mips/nlm/uart_bus_xlp_iodi.c88
-rw-r--r--sys/mips/nlm/uart_cpu_mips_xlp.c89
-rw-r--r--sys/mips/nlm/xlp.h133
-rw-r--r--sys/mips/nlm/xlp_machdep.c665
-rw-r--r--sys/modules/usb/Makefile2
-rw-r--r--sys/modules/usb/usie/Makefile35
-rw-r--r--sys/net/bpf_filter.c2
-rw-r--r--sys/net/if.c16
-rw-r--r--sys/net/if.h2
-rw-r--r--sys/net/if_arcsubr.c1
-rw-r--r--sys/net/if_atmsubr.c1
-rw-r--r--sys/net/if_debug.c1
-rw-r--r--sys/net/if_ethersubr.c2
-rw-r--r--sys/net/if_fddisubr.c1
-rw-r--r--sys/net/if_fwsubr.c1
-rw-r--r--sys/net/if_gif.c1
-rw-r--r--sys/net/if_iso88025subr.c1
-rw-r--r--sys/net/if_lagg.c3
-rw-r--r--sys/net/if_llatbl.h3
-rw-r--r--sys/net/if_spppfr.c2
-rw-r--r--sys/net/if_spppsubr.c1
-rw-r--r--sys/net/if_stf.c1
-rw-r--r--sys/net/if_tun.c1
-rw-r--r--sys/net/if_var.h9
-rw-r--r--sys/net/radix.h1
-rw-r--r--sys/net80211/ieee80211_ageq.c2
-rw-r--r--sys/net80211/ieee80211_power.c2
-rw-r--r--sys/netgraph/netflow/netflow.c207
-rw-r--r--sys/netgraph/netflow/netflow_v9.c1
-rw-r--r--sys/netgraph/netflow/ng_netflow.c13
-rw-r--r--sys/netgraph/netflow/ng_netflow.h39
-rw-r--r--sys/netgraph/netgraph.h13
-rw-r--r--sys/netgraph/ng_base.c21
-rw-r--r--sys/netgraph/ng_ether.c2
-rw-r--r--sys/netgraph/ng_iface.c1
-rw-r--r--sys/netgraph/ng_socket.c31
-rw-r--r--sys/netinet/if_ether.c13
-rw-r--r--sys/netinet/in.c14
-rw-r--r--sys/netinet/in_pcb.h5
-rw-r--r--sys/netinet/in_proto.c14
-rw-r--r--sys/netinet/libalias/libalias.3131
-rw-r--r--sys/netinet/sctp_pcb.c10
-rw-r--r--sys/netinet/sctp_uio.h1
-rw-r--r--sys/netinet/sctp_usrreq.c12
-rw-r--r--sys/netinet/tcp_lro.c8
-rw-r--r--sys/netinet/tcp_output.c19
-rw-r--r--sys/netinet/tcp_subr.c9
-rw-r--r--sys/netinet/tcp_syncache.h2
-rw-r--r--sys/netinet/tcp_var.h5
-rw-r--r--sys/netinet6/in6.c2
-rw-r--r--sys/netinet6/in6_proto.c50
-rw-r--r--sys/pc98/cbus/pckbd.c1
-rw-r--r--sys/pc98/conf/DEFAULTS2
-rw-r--r--sys/powerpc/aim/locore32.S7
-rw-r--r--sys/powerpc/aim/locore64.S7
-rw-r--r--sys/powerpc/aim/mmu_oea.c8
-rw-r--r--sys/powerpc/aim/mmu_oea64.c8
-rw-r--r--sys/powerpc/booke/locore.S7
-rw-r--r--sys/powerpc/booke/pmap.c12
-rw-r--r--sys/powerpc/conf/GENERIC1
-rw-r--r--sys/powerpc/conf/GENERIC641
-rw-r--r--sys/powerpc/powerpc/mp_machdep.c21
-rw-r--r--sys/powerpc/ps3/if_glc.c11
-rw-r--r--sys/security/audit/audit.h7
-rw-r--r--sys/security/audit/audit_arg.c13
-rw-r--r--sys/security/audit/audit_bsm.c22
-rw-r--r--sys/security/audit/audit_private.h2
-rw-r--r--sys/sparc64/include/cache.h9
-rw-r--r--sys/sparc64/include/cpu.h1
-rw-r--r--sys/sparc64/include/pmap.h3
-rw-r--r--sys/sparc64/include/tlb.h15
-rw-r--r--sys/sparc64/pci/fire.c23
-rw-r--r--sys/sparc64/pci/schizo.c6
-rw-r--r--sys/sparc64/sparc64/cache.c6
-rw-r--r--sys/sparc64/sparc64/cheetah.c107
-rw-r--r--sys/sparc64/sparc64/counter.c6
-rw-r--r--sys/sparc64/sparc64/exception.S23
-rw-r--r--sys/sparc64/sparc64/interrupt.S24
-rw-r--r--sys/sparc64/sparc64/intr_machdep.c2
-rw-r--r--sys/sparc64/sparc64/machdep.c5
-rw-r--r--sys/sparc64/sparc64/mp_exception.S4
-rw-r--r--sys/sparc64/sparc64/mp_machdep.c18
-rw-r--r--sys/sparc64/sparc64/pmap.c35
-rw-r--r--sys/sparc64/sparc64/spitfire.c38
-rw-r--r--sys/sparc64/sparc64/tick.c4
-rw-r--r--sys/sparc64/sparc64/vm_machdep.c2
-rw-r--r--sys/sparc64/sparc64/zeus.c108
-rw-r--r--sys/sys/_types.h1
-rw-r--r--sys/sys/bus.h1
-rw-r--r--sys/sys/capability.h58
-rw-r--r--sys/sys/cpuset.h8
-rw-r--r--sys/sys/file.h2
-rw-r--r--sys/sys/interrupt.h4
-rw-r--r--sys/sys/kbio.h18
-rw-r--r--sys/sys/pcpu.h14
-rw-r--r--sys/sys/priv.h1
-rw-r--r--sys/sys/proc.h21
-rw-r--r--sys/sys/racct.h14
-rw-r--r--sys/sys/sem.h3
-rw-r--r--sys/sys/sockio.h3
-rw-r--r--sys/sys/syscall.h2
-rw-r--r--sys/sys/syscall.mk2
-rw-r--r--sys/sys/sysctl.h6
-rw-r--r--sys/sys/sysproto.h12
-rw-r--r--sys/sys/systm.h15
-rw-r--r--sys/sys/timetc.h4
-rw-r--r--sys/sys/tty.h5
-rw-r--r--sys/sys/ttydevsw.h14
-rw-r--r--sys/sys/types.h2
-rw-r--r--sys/sys/uio.h1
-rw-r--r--sys/sys/unistd.h8
-rw-r--r--sys/sys/vnode.h7
-rw-r--r--sys/ufs/ffs/ffs_alloc.c191
-rw-r--r--sys/ufs/ffs/ffs_balloc.c28
-rw-r--r--sys/ufs/ffs/ffs_inode.c2
-rw-r--r--sys/ufs/ffs/ffs_softdep.c104
-rw-r--r--sys/ufs/ffs/ffs_vfsops.c160
-rw-r--r--sys/ufs/ffs/fs.h4
-rw-r--r--sys/ufs/ffs/softdep.h3
-rw-r--r--sys/ufs/ufs/ufs_inode.c9
-rw-r--r--sys/ufs/ufs/ufsmount.h1
-rw-r--r--sys/vm/device_pager.c6
-rw-r--r--sys/vm/swap_pager.c6
-rw-r--r--sys/vm/vm_extern.h3
-rw-r--r--sys/vm/vm_fault.c16
-rw-r--r--sys/vm/vm_glue.c4
-rw-r--r--sys/vm/vm_map.c10
-rw-r--r--sys/vm/vm_mmap.c21
-rw-r--r--sys/vm/vm_pageout.c14
-rw-r--r--sys/vm/vm_unix.c6
-rw-r--r--sys/x86/include/mptable.h64
-rw-r--r--sys/x86/x86/mptable.c177
-rw-r--r--sys/x86/x86/mptable_pci.c85
-rw-r--r--sys/x86/x86/tsc.c1
-rw-r--r--tools/regression/bin/sh/parser/alias6.06
-rw-r--r--tools/regression/kqueue/config.h6
-rw-r--r--tools/regression/kqueue/main.c3
-rw-r--r--tools/regression/kqueue/proc.c16
-rw-r--r--tools/regression/lib/libc/gen/Makefile2
-rw-r--r--tools/regression/lib/libc/gen/test-posix_spawn.c90
-rw-r--r--tools/tools/pciid/mk_pci_vendors.pl263
-rw-r--r--usr.bin/calendar/parsedata.c30
-rw-r--r--usr.bin/calendar/pom.c2
-rw-r--r--usr.bin/clang/clang/Makefile6
-rw-r--r--usr.bin/clang/tblgen/Makefile2
-rw-r--r--usr.bin/cpio/Makefile15
-rw-r--r--usr.bin/cpio/cmdline.c10
-rw-r--r--usr.bin/cpio/config_freebsd.h1
-rw-r--r--usr.bin/cpio/cpio.c146
-rw-r--r--usr.bin/cpio/cpio.h2
-rw-r--r--usr.bin/cpio/line_reader.c171
-rw-r--r--usr.bin/cpio/matching.c284
-rw-r--r--usr.bin/cpio/pathmatch.c255
-rw-r--r--usr.bin/cpio/test/Makefile22
-rw-r--r--usr.bin/cpio/test/main.c2030
-rw-r--r--usr.bin/cpio/test/test.h216
-rw-r--r--usr.bin/cpio/test/test_0.c6
-rw-r--r--usr.bin/cpio/test/test_basic.c177
-rw-r--r--usr.bin/cpio/test/test_cmdline.c107
-rw-r--r--usr.bin/cpio/test/test_format_newc.c146
-rw-r--r--usr.bin/cpio/test/test_gcpio_compat.c122
-rw-r--r--usr.bin/cpio/test/test_gcpio_compat_ref_nosym.bin.uu17
-rw-r--r--usr.bin/cpio/test/test_gcpio_compat_ref_nosym.crc.uu17
-rw-r--r--usr.bin/cpio/test/test_gcpio_compat_ref_nosym.newc.uu17
-rw-r--r--usr.bin/cpio/test/test_gcpio_compat_ref_nosym.ustar.uu74
-rw-r--r--usr.bin/cpio/test/test_option_B_upper.c (renamed from usr.bin/cpio/test/test_option_B.c)12
-rw-r--r--usr.bin/cpio/test/test_option_C_upper.c62
-rw-r--r--usr.bin/cpio/test/test_option_J_upper.c (renamed from usr.bin/cpio/line_reader.h)41
-rw-r--r--usr.bin/cpio/test/test_option_L_upper.c (renamed from usr.bin/cpio/test/test_option_L.c)75
-rw-r--r--usr.bin/cpio/test/test_option_Z_upper.c56
-rw-r--r--usr.bin/cpio/test/test_option_a.c25
-rw-r--r--usr.bin/cpio/test/test_option_c.c108
-rw-r--r--usr.bin/cpio/test/test_option_d.c26
-rw-r--r--usr.bin/cpio/test/test_option_f.c40
-rw-r--r--usr.bin/cpio/test/test_option_help.c3
-rw-r--r--usr.bin/cpio/test/test_option_l.c (renamed from usr.bin/cpio/test/test_option_ell.c)24
-rw-r--r--usr.bin/cpio/test/test_option_lzma.c (renamed from usr.bin/cpio/matching.h)50
-rw-r--r--usr.bin/cpio/test/test_option_m.c25
-rw-r--r--usr.bin/cpio/test/test_option_t.c22
-rw-r--r--usr.bin/cpio/test/test_option_u.c17
-rw-r--r--usr.bin/cpio/test/test_option_version.c12
-rw-r--r--usr.bin/cpio/test/test_option_y.c30
-rw-r--r--usr.bin/cpio/test/test_option_z.c29
-rw-r--r--usr.bin/cpio/test/test_owner_parse.c52
-rw-r--r--usr.bin/cpio/test/test_passthrough_dotdot.c45
-rw-r--r--usr.bin/cpio/test/test_passthrough_reverse.c55
-rw-r--r--usr.bin/cpio/test/test_pathmatch.c280
-rw-r--r--usr.bin/gcore/elfcore.c2
-rw-r--r--usr.bin/ipcs/ipc.c7
-rw-r--r--usr.bin/ipcs/ipcs.c2
-rw-r--r--usr.bin/ncal/ncal.12
-rw-r--r--usr.bin/ncal/ncal.c3
-rw-r--r--usr.bin/netstat/if.c2
-rw-r--r--usr.bin/nsupdate/Makefile1
-rw-r--r--usr.bin/rctl/rctl.849
-rw-r--r--usr.bin/rpcgen/rpc_scan.c26
-rw-r--r--usr.bin/tar/Makefile18
-rw-r--r--usr.bin/tar/bsdtar.14
-rw-r--r--usr.bin/tar/bsdtar.c65
-rw-r--r--usr.bin/tar/cmdline.c12
-rw-r--r--usr.bin/tar/config_freebsd.h3
-rw-r--r--usr.bin/tar/err.c74
-rw-r--r--usr.bin/tar/read.c20
-rw-r--r--usr.bin/tar/subst.c22
-rw-r--r--usr.bin/tar/test/Makefile6
-rw-r--r--usr.bin/tar/test/main.c2199
-rw-r--r--usr.bin/tar/test/test.h208
-rw-r--r--usr.bin/tar/test/test_0.c2
-rw-r--r--usr.bin/tar/test/test_basic.c132
-rw-r--r--usr.bin/tar/test/test_copy.c405
-rw-r--r--usr.bin/tar/test/test_empty_mtree.c (renamed from usr.bin/tar/err.h)36
-rw-r--r--usr.bin/tar/test/test_help.c3
-rw-r--r--usr.bin/tar/test/test_option_T_upper.c (renamed from usr.bin/tar/test/test_option_T.c)97
-rw-r--r--usr.bin/tar/test/test_option_q.c76
-rw-r--r--usr.bin/tar/test/test_option_r.c117
-rw-r--r--usr.bin/tar/test/test_option_s.c29
-rw-r--r--usr.bin/tar/test/test_patterns.c43
-rw-r--r--usr.bin/tar/test/test_patterns_2.tar.uu1
-rw-r--r--usr.bin/tar/test/test_patterns_3.tar.uu1
-rw-r--r--usr.bin/tar/test/test_patterns_4.tar.uu1
-rw-r--r--usr.bin/tar/test/test_stdio.c33
-rw-r--r--usr.bin/tar/test/test_strip_components.c59
-rw-r--r--usr.bin/tar/test/test_symlink_dir.c171
-rw-r--r--usr.bin/tar/test/test_version.c3
-rw-r--r--usr.bin/tar/util.c14
-rw-r--r--usr.bin/tar/write.c90
-rw-r--r--usr.bin/tftp/main.c2
-rw-r--r--usr.bin/top/machine.c180
-rw-r--r--usr.bin/vmstat/vmstat.c14
-rw-r--r--usr.bin/w/w.c2
-rw-r--r--usr.bin/wall/wall.c3
-rw-r--r--usr.sbin/Makefile10
-rw-r--r--usr.sbin/arpaname/Makefile24
-rw-r--r--usr.sbin/bsdinstall/partedit/partedit.c2
-rw-r--r--usr.sbin/bsdinstall/partedit/partedit_powerpc.c27
-rw-r--r--usr.sbin/bsdinstall/scripts/Makefile6
-rwxr-xr-xusr.sbin/bsdinstall/scripts/auto7
-rwxr-xr-xusr.sbin/bsdinstall/scripts/config4
-rw-r--r--usr.sbin/bsdinstall/scripts/docsinstall69
-rw-r--r--usr.sbin/bsnmpd/modules/snmp_hostres/hostres_device_tbl.c16
-rw-r--r--usr.sbin/config/main.c9
-rw-r--r--usr.sbin/ddns-confgen/Makefile31
-rw-r--r--usr.sbin/dnssec-revoke/Makefile24
-rw-r--r--usr.sbin/dnssec-settime/Makefile24
-rw-r--r--usr.sbin/dnssec-signzone/Makefile2
-rw-r--r--usr.sbin/flowctl/Makefile9
-rw-r--r--usr.sbin/flowctl/flowctl.811
-rw-r--r--usr.sbin/flowctl/flowctl.c232
-rw-r--r--usr.sbin/genrandom/Makefile24
-rw-r--r--usr.sbin/isc-hmac-fixup/Makefile24
-rw-r--r--usr.sbin/mountd/exports.522
-rw-r--r--usr.sbin/mountd/mountd.c6
-rw-r--r--usr.sbin/named-checkconf/Makefile1
-rw-r--r--usr.sbin/named-journalprint/Makefile24
-rw-r--r--usr.sbin/named.reload/Makefile9
-rw-r--r--usr.sbin/named.reload/named.reload.868
-rw-r--r--usr.sbin/named.reload/named.reload.sh42
-rw-r--r--usr.sbin/named/Makefile8
-rw-r--r--usr.sbin/nsec3hash/Makefile24
-rw-r--r--usr.sbin/pmccontrol/pmccontrol.c39
-rw-r--r--usr.sbin/pmcstat/pmcstat.c12
-rw-r--r--usr.sbin/pwd_mkdb/pwd_mkdb.c8
-rw-r--r--usr.sbin/rndc-confgen/Makefile4
-rw-r--r--usr.sbin/rndc/Makefile6
-rw-r--r--usr.sbin/rpcbind/rpcb_stat.c2
-rw-r--r--usr.sbin/rpcbind/rpcb_svc_com.c2
-rw-r--r--usr.sbin/rpcbind/rpcbind.c5
-rw-r--r--usr.sbin/rpcbind/util.c2
-rw-r--r--usr.sbin/rpcbind/warmstart.c4
-rw-r--r--usr.sbin/rtadvctl/Makefile13
-rw-r--r--usr.sbin/rtadvctl/rtadvctl.8104
-rw-r--r--usr.sbin/rtadvctl/rtadvctl.c926
-rw-r--r--usr.sbin/rtadvd/Makefile5
-rw-r--r--usr.sbin/rtadvd/config.c548
-rw-r--r--usr.sbin/rtadvd/config.h10
-rw-r--r--usr.sbin/rtadvd/control.c456
-rw-r--r--usr.sbin/rtadvd/control.h74
-rw-r--r--usr.sbin/rtadvd/control_client.c131
-rw-r--r--usr.sbin/rtadvd/control_client.h30
-rw-r--r--usr.sbin/rtadvd/control_server.c742
-rw-r--r--usr.sbin/rtadvd/control_server.h42
-rw-r--r--usr.sbin/rtadvd/dump.c321
-rw-r--r--usr.sbin/rtadvd/if.c673
-rw-r--r--usr.sbin/rtadvd/if.h37
-rw-r--r--usr.sbin/rtadvd/pathnames.h3
-rw-r--r--usr.sbin/rtadvd/rrenum.c20
-rw-r--r--usr.sbin/rtadvd/rtadvd.822
-rw-r--r--usr.sbin/rtadvd/rtadvd.c964
-rw-r--r--usr.sbin/rtadvd/rtadvd.h150
-rw-r--r--usr.sbin/rtadvd/timer.c120
-rw-r--r--usr.sbin/rtadvd/timer.h22
-rw-r--r--usr.sbin/rtadvd/timer_subr.c126
-rw-r--r--usr.sbin/rtadvd/timer_subr.h (renamed from usr.sbin/rtadvd/dump.h)28
-rw-r--r--usr.sbin/syslogd/syslogd.89
-rw-r--r--usr.sbin/syslogd/syslogd.c30
2582 files changed, 236195 insertions, 110579 deletions
diff --git a/ObsoleteFiles.inc b/ObsoleteFiles.inc
index 8500b6b..8ab7ddb 100644
--- a/ObsoleteFiles.inc
+++ b/ObsoleteFiles.inc
@@ -38,6 +38,31 @@
# xargs -n1 | sort | uniq -d;
# done
+# 20110709: vm_map_clean.9 -> vm_map_sync.9
+OLD_FILES+=usr/share/man/man9/vm_map_clean.9.gz
+# 20110709: Catch up with removal of these functions.
+OLD_FILES+=usr/share/man/man9/vm_page_copy.9.gz
+OLD_FILES+=usr/share/man/man9/vm_page_protect.9.gz
+OLD_FILES+=usr/share/man/man9/vm_page_zero_fill.9.gz
+# 20110707: script no longer needed by /etc/rc.d/nfsd
+OLD_FILES+=etc/rc.d/nfsserver
+# 20110705: files moved so both NFS clients can share them
+OLD_FILES+=usr/include/nfsclient/krpc.h
+OLD_FILES+=usr/include/nfsclient/nfsdiskless.h
+# 20110705: the switch of default NFS client to the new one
+OLD_FILES+=sbin/mount_newnfs
+OLD_FILES+=usr/share/man/man8/mount_newnfs.8.gz
+OLD_FILES+=usr/include/nfsclient/nfs_kdtrace.h
+# 20110628: calendar.msk removed
+OLD_FILES+=usr/share/calendar/ru_RU.KOI8-R/calendar.msk
+# 20110517: libpkg removed
+OLD_FILES+=usr/include/pkg.h
+OLD_FILES+=usr/lib/libpkg.a
+OLD_FILES+=usr/lib/libpkg.so
+OLD_LIBS+=usr/lib/libpkg.so.0
+OLD_FILES+=usr/lib/libpkg_p.a
+# 20110517: libsbuf version bump
+OLD_LIBS+=lib/libsbuf.so.5
# 20110502: new clang import which bumps version from 2.9 to 3.0
OLD_FILES+=usr/include/clang/2.9/emmintrin.h
OLD_FILES+=usr/include/clang/2.9/mm_malloc.h
@@ -66,6 +91,8 @@ OLD_FILES+=usr/lib/libobjc_p.a
OLD_FILES+=usr/libexec/cc1obj
OLD_LIBS+=usr/lib/libobjc.so.4
OLD_DIRS+=usr/include/objc
+# 20110331: firmware.img created at build time
+OLD_FILES+=usr/share/examples/kld/firmware/fwimage/firmware.img
# 20110224: sticky.8 -> sticky.7
OLD_FILES+=usr/share/man/man8/sticky.8.gz
# 20110220: new clang import which bumps version from 2.8 to 2.9
@@ -76,6 +103,8 @@ OLD_FILES+=usr/include/clang/2.8/pmmintrin.h
OLD_FILES+=usr/include/clang/2.8/tmmintrin.h
OLD_FILES+=usr/include/clang/2.8/xmmintrin.h
OLD_DIRS+=usr/include/clang/2.8
+# 20110119: netinet/sctp_cc_functions.h removed
+OLD_FILES+=usr/include/netinet/sctp_cc_functions.h
# 20110119: Remove SYSCTL_*X* sysctl additions.
OLD_FILES+=usr/share/man/man9/SYSCTL_XINT.9.gz \
usr/share/man/man9/SYSCTL_XLONG.9.gz
@@ -131,6 +160,8 @@ OLD_FILES+=usr/share/man/man8/MAKEDEV.8.gz
OLD_FILES+=usr/share/man/man9/vgonel.9.gz
# 20101112: removed gasp.info
OLD_FILES+=usr/share/info/gasp.info.gz
+# 20101109: machine/mutex.h removed
+OLD_FILES+=usr/include/machine/mutex.h
# 20101109: headers moved from machine/ to x86/
.if ${TARGET_ARCH} == "amd64" || ${TARGET_ARCH} == "i386"
OLD_FILES+=usr/include/machine/mptable.h
diff --git a/bin/expr/expr.1 b/bin/expr/expr.1
index 5c3cb44..6b9c610 100644
--- a/bin/expr/expr.1
+++ b/bin/expr/expr.1
@@ -50,25 +50,25 @@ and writes the result on standard output.
All operators and operands must be passed as separate arguments.
Several of the operators have special meaning to command interpreters
and must therefore be quoted appropriately.
-All integer operands are interpreted in base 10.
+All integer operands are interpreted in base 10 and must consist of only
+an optional leading minus sign followed by one or more digits (unless
+less strict parsing has been enabled for backwards compatibilty with
+prior versions of
+.Nm
+in
+.Fx ) .
.Pp
-Arithmetic operations are performed using signed integer math.
-If the
-.Fl e
-flag is specified, arithmetic uses the C
+Arithmetic operations are performed using signed integer math with a
+range according to the C
.Vt intmax_t
-data type (the largest integral type available), and
-.Nm
-will detect arithmetic overflow and return an error indication.
-If a numeric operand is specified which is so large as to overflow
-conversion to an integer, it is parsed as a string instead.
-If
+data type (the largest signed integral type available).
+All conversions and operations are checked for overflow.
+Overflow results in program termination with an error message on stdout
+and with an error status.
+.Pp
+The
.Fl e
-is not specified, arithmetic operations and parsing of integer
-arguments will overflow silently according to the rules of the C
-standard, using the
-.Vt long
-data type.
+option enables backwards compatible behaviour as detailed below.
.Pp
Operators are listed below in order of increasing precedence; all
are left-associative.
@@ -82,7 +82,9 @@ Return the evaluation of
.Ar expr1
if it is neither an empty string nor zero;
otherwise, returns the evaluation of
-.Ar expr2 .
+.Ar expr2
+if it is not an empty string;
+otherwise, returns zero.
.It Ar expr1 Li & Ar expr2
Return the evaluation of
.Ar expr1
@@ -163,25 +165,26 @@ function (with a
.Fa utility
argument of
.Dq Li expr )
-is used to determine whether compatibility mode should be enabled.
+is used to determine whether backwards compatibility mode should be enabled.
This feature is intended for use as a transition and debugging aid, when
.Nm
is used in complex scripts which cannot easily be recast to avoid the
non-portable usage.
-Enabling compatibility mode
-also implicitly enables the
+Enabling backwards compatibility mode also implicitly enables the
.Fl e
option, since this matches the historic behavior of
.Nm
in
-.Fx .
+.Fx . This option makes number parsing less strict and permits leading
+white space and an optional leading plus sign. In addition, empty operands
+have an implied value of zero in numeric context.
For historical reasons, defining the environment variable
.Ev EXPR_COMPAT
-also enables compatibility mode.
+also enables backwards compatibility mode.
.Sh ENVIRONMENT
.Bl -tag -width ".Ev EXPR_COMPAT"
.It Ev EXPR_COMPAT
-If set, enables compatibility mode.
+If set, enables backwards compatibility mode.
.El
.Sh EXIT STATUS
The
@@ -270,8 +273,37 @@ expands to the required number.
The
.Nm
utility conforms to
-.St -p1003.1-2001 ,
-provided that compatibility mode is not enabled.
+.St -p1003.1-2008 ,
+provided that backwards compatibility mode is not enabled.
+.Pp
+Backwards compatibility mode performs less strict checks of numeric arguments:
+.Bl -bullet
+.It
+An empty operand string is interpreted as 0.
+.El
+.Bl -bullet
+.It
+Leading white space and/or a plus sign before an otherwise valid positive
+numberic operand are allowed and will be ignored.
+.El
+.Pp
+The extended arithmetic range and overflow checks do not conflict with
+POSIX's requirement that arithmetic be done using signed longs, since
+they only make a difference to the result in cases where using signed
+longs would give undefined behavior.
+.Pp
+According to the
+.Tn POSIX
+standard, the use of string arguments
+.Va length ,
+.Va substr ,
+.Va index ,
+or
+.Va match
+produces undefined results. In this version of
+.Nm ,
+these arguments are treated just as their respective string values.
+.Pp
The
.Fl e
flag is an extension.
diff --git a/bin/expr/expr.y b/bin/expr/expr.y
index 356bac2..89f8cce 100644
--- a/bin/expr/expr.y
+++ b/bin/expr/expr.y
@@ -1,6 +1,6 @@
%{
/*-
- * Written by Pace Willisson (pace@blitz.com)
+ * Written by Pace Willisson (pace@blitz.com)
* and placed in the public domain.
*
* Largely rewritten by J.T. Conklin (jtc@wimsey.com)
@@ -21,7 +21,7 @@
#include <string.h>
#include <regex.h>
#include <unistd.h>
-
+
/*
* POSIX specifies a specific error code for syntax errors. We exit
* with this code for all errors.
@@ -40,15 +40,20 @@ struct val {
} u;
} ;
-struct val *result;
+char **av;
+int nonposix;
+struct val *result;
-int chk_div(intmax_t, intmax_t);
-int chk_minus(intmax_t, intmax_t, intmax_t);
-int chk_plus(intmax_t, intmax_t, intmax_t);
-int chk_times(intmax_t, intmax_t, intmax_t);
+void assert_to_integer(struct val *);
+void assert_div(intmax_t, intmax_t);
+void assert_minus(intmax_t, intmax_t, intmax_t);
+void assert_plus(intmax_t, intmax_t, intmax_t);
+void assert_times(intmax_t, intmax_t, intmax_t);
+int compare_vals(struct val *, struct val *);
void free_value(struct val *);
+int is_integer(const char *);
+int is_string(struct val *);
int is_zero_or_null(struct val *);
-int isstring(struct val *);
struct val *make_integer(intmax_t);
struct val *make_str(const char *);
struct val *op_and(struct val *, struct val *);
@@ -65,14 +70,12 @@ struct val *op_or(struct val *, struct val *);
struct val *op_plus(struct val *, struct val *);
struct val *op_rem(struct val *, struct val *);
struct val *op_times(struct val *, struct val *);
-intmax_t to_integer(struct val *);
+int to_integer(struct val *);
void to_string(struct val *);
int yyerror(const char *);
int yylex(void);
int yyparse(void);
-static int eflag;
-char **av;
%}
%union
@@ -96,23 +99,22 @@ start: expr { result = $$; }
expr: TOKEN
| '(' expr ')' { $$ = $2; }
- | expr '|' expr { $$ = op_or ($1, $3); }
- | expr '&' expr { $$ = op_and ($1, $3); }
- | expr '=' expr { $$ = op_eq ($1, $3); }
- | expr '>' expr { $$ = op_gt ($1, $3); }
- | expr '<' expr { $$ = op_lt ($1, $3); }
- | expr GE expr { $$ = op_ge ($1, $3); }
- | expr LE expr { $$ = op_le ($1, $3); }
- | expr NE expr { $$ = op_ne ($1, $3); }
- | expr '+' expr { $$ = op_plus ($1, $3); }
- | expr '-' expr { $$ = op_minus ($1, $3); }
- | expr '*' expr { $$ = op_times ($1, $3); }
- | expr '/' expr { $$ = op_div ($1, $3); }
- | expr '%' expr { $$ = op_rem ($1, $3); }
- | expr ':' expr { $$ = op_colon ($1, $3); }
+ | expr '|' expr { $$ = op_or($1, $3); }
+ | expr '&' expr { $$ = op_and($1, $3); }
+ | expr '=' expr { $$ = op_eq($1, $3); }
+ | expr '>' expr { $$ = op_gt($1, $3); }
+ | expr '<' expr { $$ = op_lt($1, $3); }
+ | expr GE expr { $$ = op_ge($1, $3); }
+ | expr LE expr { $$ = op_le($1, $3); }
+ | expr NE expr { $$ = op_ne($1, $3); }
+ | expr '+' expr { $$ = op_plus($1, $3); }
+ | expr '-' expr { $$ = op_minus($1, $3); }
+ | expr '*' expr { $$ = op_times($1, $3); }
+ | expr '/' expr { $$ = op_div($1, $3); }
+ | expr '%' expr { $$ = op_rem($1, $3); }
+ | expr ':' expr { $$ = op_colon($1, $3); }
;
-
%%
struct val *
@@ -120,89 +122,65 @@ make_integer(intmax_t i)
{
struct val *vp;
- vp = (struct val *) malloc (sizeof (*vp));
- if (vp == NULL) {
+ vp = (struct val *)malloc(sizeof(*vp));
+ if (vp == NULL)
errx(ERR_EXIT, "malloc() failed");
- }
vp->type = integer;
vp->u.i = i;
- return vp;
+ return (vp);
}
struct val *
make_str(const char *s)
{
struct val *vp;
- char *ep;
- vp = (struct val *) malloc (sizeof (*vp));
- if (vp == NULL || ((vp->u.s = strdup (s)) == NULL)) {
+ vp = (struct val *)malloc(sizeof(*vp));
+ if (vp == NULL || ((vp->u.s = strdup(s)) == NULL))
errx(ERR_EXIT, "malloc() failed");
- }
- /*
- * Previously we tried to scan the string to see if it ``looked like''
- * an integer (erroneously, as it happened). Let strtoimax() do the
- * dirty work. We could cache the value, except that we are using
- * a union and need to preserve the original string form until we
- * are certain that it is not needed.
- *
- * IEEE Std.1003.1-2001 says:
- * /integer/ An argument consisting only of an (optional) unary minus
- * followed by digits.
- *
- * This means that arguments which consist of digits followed by
- * non-digits MUST NOT be considered integers. strtoimax() will
- * figure this out for us.
- */
- if (eflag)
- (void)strtoimax(s, &ep, 10);
+ if (is_integer(s))
+ vp->type = numeric_string;
else
- (void)strtol(s, &ep, 10);
-
- if (*ep != '\0')
vp->type = string;
- else
- vp->type = numeric_string;
- return vp;
+ return (vp);
}
-
void
free_value(struct val *vp)
{
if (vp->type == string || vp->type == numeric_string)
- free (vp->u.s);
+ free(vp->u.s);
}
-
-intmax_t
+int
to_integer(struct val *vp)
{
intmax_t i;
- if (vp->type == integer)
- return 1;
-
- if (vp->type == string)
- return 0;
-
- /* vp->type == numeric_string, make it numeric */
- errno = 0;
- if (eflag) {
+ /* we can only convert numeric_string to integer, here */
+ if (vp->type == numeric_string) {
+ errno = 0;
i = strtoimax(vp->u.s, (char **)NULL, 10);
- if (errno == ERANGE)
- err(ERR_EXIT, NULL);
- } else {
- i = strtol(vp->u.s, (char **)NULL, 10);
+ /* just keep as numeric_string, if the conversion fails */
+ if (errno != ERANGE) {
+ free(vp->u.s);
+ vp->u.i = i;
+ vp->type = integer;
+ }
}
+ return (vp->type == integer);
+}
- free (vp->u.s);
- vp->u.i = i;
- vp->type = integer;
- return 1;
+void
+assert_to_integer(struct val *vp)
+{
+ if (vp->type == string)
+ errx(ERR_EXIT, "not a decimal number: '%s'", vp->u.s);
+ if (!to_integer(vp))
+ errx(ERR_EXIT, "operand too large: '%s'", vp->u.s);
}
void
@@ -228,15 +206,31 @@ to_string(struct val *vp)
vp->u.s = tmp;
}
+int
+is_integer(const char *s)
+{
+ if (nonposix) {
+ if (*s == '\0')
+ return (1);
+ while (isspace((unsigned char)*s))
+ s++;
+ }
+ if (*s == '-' || (nonposix && *s == '+'))
+ s++;
+ if (*s == '\0')
+ return (0);
+ while (isdigit((unsigned char)*s))
+ s++;
+ return (*s == '\0');
+}
int
-isstring(struct val *vp)
+is_string(struct val *vp)
{
/* only TRUE if this string is not a valid integer */
return (vp->type == string);
}
-
int
yylex(void)
{
@@ -247,10 +241,10 @@ yylex(void)
p = *av++;
- if (strlen (p) == 1) {
- if (strchr ("|&=<>+-*/%:()", *p))
+ if (strlen(p) == 1) {
+ if (strchr("|&=<>+-*/%:()", *p))
return (*p);
- } else if (strlen (p) == 2 && p[1] == '=') {
+ } else if (strlen(p) == 2 && p[1] == '=') {
switch (*p) {
case '>': return (GE);
case '<': return (LE);
@@ -258,19 +252,17 @@ yylex(void)
}
}
- yylval.val = make_str (p);
+ yylval.val = make_str(p);
return (TOKEN);
}
int
is_zero_or_null(struct val *vp)
{
- if (vp->type == integer) {
+ if (vp->type == integer)
return (vp->u.i == 0);
- } else {
- return (*vp->u.s == 0 || (to_integer (vp) && vp->u.i == 0));
- }
- /* NOTREACHED */
+
+ return (*vp->u.s == 0 || (to_integer(vp) && vp->u.i == 0));
}
int
@@ -278,23 +270,22 @@ main(int argc, char *argv[])
{
int c;
- setlocale (LC_ALL, "");
+ setlocale(LC_ALL, "");
if (getenv("EXPR_COMPAT") != NULL
|| check_utility_compat("expr")) {
av = argv + 1;
- eflag = 1;
+ nonposix = 1;
} else {
- while ((c = getopt(argc, argv, "e")) != -1)
+ while ((c = getopt(argc, argv, "e")) != -1) {
switch (c) {
case 'e':
- eflag = 1;
+ nonposix = 1;
break;
-
default:
- fprintf(stderr,
+ errx(ERR_EXIT,
"usage: expr [-e] expression\n");
- exit(ERR_EXIT);
}
+ }
av = argv + optind;
}
@@ -314,164 +305,104 @@ yyerror(const char *s __unused)
errx(ERR_EXIT, "syntax error");
}
-
struct val *
op_or(struct val *a, struct val *b)
{
- if (is_zero_or_null (a)) {
- free_value (a);
- return (b);
- } else {
- free_value (b);
+ if (!is_zero_or_null(a)) {
+ free_value(b);
return (a);
}
+ free_value(a);
+ if (!is_zero_or_null(b))
+ return (b);
+ free_value(b);
+ return (make_integer((intmax_t)0));
}
-
+
struct val *
op_and(struct val *a, struct val *b)
{
- if (is_zero_or_null (a) || is_zero_or_null (b)) {
- free_value (a);
- free_value (b);
- return (make_integer ((intmax_t)0));
+ if (is_zero_or_null(a) || is_zero_or_null(b)) {
+ free_value(a);
+ free_value(b);
+ return (make_integer((intmax_t)0));
} else {
- free_value (b);
+ free_value(b);
return (a);
}
}
-struct val *
-op_eq(struct val *a, struct val *b)
+int
+compare_vals(struct val *a, struct val *b)
{
- struct val *r;
+ int r;
- if (isstring (a) || isstring (b)) {
- to_string (a);
- to_string (b);
- r = make_integer ((intmax_t)(strcoll (a->u.s, b->u.s) == 0));
+ if (is_string(a) || is_string(b)) {
+ to_string(a);
+ to_string(b);
+ r = strcoll(a->u.s, b->u.s);
} else {
- (void)to_integer(a);
- (void)to_integer(b);
- r = make_integer ((intmax_t)(a->u.i == b->u.i));
+ assert_to_integer(a);
+ assert_to_integer(b);
+ if (a->u.i > b->u.i)
+ r = 1;
+ else if (a->u.i < b->u.i)
+ r = -1;
+ else
+ r = 0;
}
- free_value (a);
- free_value (b);
- return r;
+ free_value(a);
+ free_value(b);
+ return (r);
}
struct val *
-op_gt(struct val *a, struct val *b)
+op_eq(struct val *a, struct val *b)
{
- struct val *r;
-
- if (isstring (a) || isstring (b)) {
- to_string (a);
- to_string (b);
- r = make_integer ((intmax_t)(strcoll (a->u.s, b->u.s) > 0));
- } else {
- (void)to_integer(a);
- (void)to_integer(b);
- r = make_integer ((intmax_t)(a->u.i > b->u.i));
- }
+ return (make_integer((intmax_t)(compare_vals(a, b) == 0)));
+}
- free_value (a);
- free_value (b);
- return r;
+struct val *
+op_gt(struct val *a, struct val *b)
+{
+ return (make_integer((intmax_t)(compare_vals(a, b) > 0)));
}
struct val *
op_lt(struct val *a, struct val *b)
{
- struct val *r;
-
- if (isstring (a) || isstring (b)) {
- to_string (a);
- to_string (b);
- r = make_integer ((intmax_t)(strcoll (a->u.s, b->u.s) < 0));
- } else {
- (void)to_integer(a);
- (void)to_integer(b);
- r = make_integer ((intmax_t)(a->u.i < b->u.i));
- }
-
- free_value (a);
- free_value (b);
- return r;
+ return (make_integer((intmax_t)(compare_vals(a, b) < 0)));
}
struct val *
op_ge(struct val *a, struct val *b)
{
- struct val *r;
-
- if (isstring (a) || isstring (b)) {
- to_string (a);
- to_string (b);
- r = make_integer ((intmax_t)(strcoll (a->u.s, b->u.s) >= 0));
- } else {
- (void)to_integer(a);
- (void)to_integer(b);
- r = make_integer ((intmax_t)(a->u.i >= b->u.i));
- }
-
- free_value (a);
- free_value (b);
- return r;
+ return (make_integer((intmax_t)(compare_vals(a, b) >= 0)));
}
struct val *
op_le(struct val *a, struct val *b)
{
- struct val *r;
-
- if (isstring (a) || isstring (b)) {
- to_string (a);
- to_string (b);
- r = make_integer ((intmax_t)(strcoll (a->u.s, b->u.s) <= 0));
- } else {
- (void)to_integer(a);
- (void)to_integer(b);
- r = make_integer ((intmax_t)(a->u.i <= b->u.i));
- }
-
- free_value (a);
- free_value (b);
- return r;
+ return (make_integer((intmax_t)(compare_vals(a, b) <= 0)));
}
struct val *
op_ne(struct val *a, struct val *b)
{
- struct val *r;
-
- if (isstring (a) || isstring (b)) {
- to_string (a);
- to_string (b);
- r = make_integer ((intmax_t)(strcoll (a->u.s, b->u.s) != 0));
- } else {
- (void)to_integer(a);
- (void)to_integer(b);
- r = make_integer ((intmax_t)(a->u.i != b->u.i));
- }
-
- free_value (a);
- free_value (b);
- return r;
+ return (make_integer((intmax_t)(compare_vals(a, b) != 0)));
}
-int
-chk_plus(intmax_t a, intmax_t b, intmax_t r)
+void
+assert_plus(intmax_t a, intmax_t b, intmax_t r)
{
-
- /* sum of two positive numbers must be positive */
- if (a > 0 && b > 0 && r <= 0)
- return 1;
- /* sum of two negative numbers must be negative */
- if (a < 0 && b < 0 && r >= 0)
- return 1;
- /* all other cases are OK */
- return 0;
+ /*
+ * sum of two positive numbers must be positive,
+ * sum of two negative numbers must be negative
+ */
+ if ((a > 0 && b > 0 && r <= 0) ||
+ (a < 0 && b < 0 && r >= 0))
+ errx(ERR_EXIT, "overflow");
}
struct val *
@@ -479,36 +410,24 @@ op_plus(struct val *a, struct val *b)
{
struct val *r;
- if (!to_integer(a) || !to_integer(b)) {
- errx(ERR_EXIT, "non-numeric argument");
- }
-
- if (eflag) {
- r = make_integer(a->u.i + b->u.i);
- if (chk_plus(a->u.i, b->u.i, r->u.i)) {
- errx(ERR_EXIT, "overflow");
- }
- } else
- r = make_integer((long)a->u.i + (long)b->u.i);
+ assert_to_integer(a);
+ assert_to_integer(b);
+ r = make_integer(a->u.i + b->u.i);
+ assert_plus(a->u.i, b->u.i, r->u.i);
- free_value (a);
- free_value (b);
- return r;
+ free_value(a);
+ free_value(b);
+ return (r);
}
-int
-chk_minus(intmax_t a, intmax_t b, intmax_t r)
+void
+assert_minus(intmax_t a, intmax_t b, intmax_t r)
{
-
/* special case subtraction of INTMAX_MIN */
- if (b == INTMAX_MIN) {
- if (a >= 0)
- return 1;
- else
- return 0;
- }
- /* this is allowed for b != INTMAX_MIN */
- return chk_plus (a, -b, r);
+ if (b == INTMAX_MIN && a < 0)
+ errx(ERR_EXIT, "overflow");
+ /* check addition of negative subtrahend */
+ assert_plus(a, -b, r);
}
struct val *
@@ -516,33 +435,25 @@ op_minus(struct val *a, struct val *b)
{
struct val *r;
- if (!to_integer(a) || !to_integer(b)) {
- errx(ERR_EXIT, "non-numeric argument");
- }
-
- if (eflag) {
- r = make_integer(a->u.i - b->u.i);
- if (chk_minus(a->u.i, b->u.i, r->u.i)) {
- errx(ERR_EXIT, "overflow");
- }
- } else
- r = make_integer((long)a->u.i - (long)b->u.i);
+ assert_to_integer(a);
+ assert_to_integer(b);
+ r = make_integer(a->u.i - b->u.i);
+ assert_minus(a->u.i, b->u.i, r->u.i);
- free_value (a);
- free_value (b);
- return r;
+ free_value(a);
+ free_value(b);
+ return (r);
}
-int
-chk_times(intmax_t a, intmax_t b, intmax_t r)
+void
+assert_times(intmax_t a, intmax_t b, intmax_t r)
{
- /* special case: first operand is 0, no overflow possible */
- if (a == 0)
- return 0;
- /* verify that result of division matches second operand */
- if (r / a != b)
- return 1;
- return 0;
+ /*
+ * if first operand is 0, no overflow is possible,
+ * else result of division test must match second operand
+ */
+ if (a != 0 && r / a != b)
+ errx(ERR_EXIT, "overflow");
}
struct val *
@@ -550,32 +461,24 @@ op_times(struct val *a, struct val *b)
{
struct val *r;
- if (!to_integer(a) || !to_integer(b)) {
- errx(ERR_EXIT, "non-numeric argument");
- }
-
- if (eflag) {
- r = make_integer(a->u.i * b->u.i);
- if (chk_times(a->u.i, b->u.i, r->u.i)) {
- errx(ERR_EXIT, "overflow");
- }
- } else
- r = make_integer((long)a->u.i * (long)b->u.i);
+ assert_to_integer(a);
+ assert_to_integer(b);
+ r = make_integer(a->u.i * b->u.i);
+ assert_times(a->u.i, b->u.i, r->u.i);
- free_value (a);
- free_value (b);
+ free_value(a);
+ free_value(b);
return (r);
}
-int
-chk_div(intmax_t a, intmax_t b)
+void
+assert_div(intmax_t a, intmax_t b)
{
- /* div by zero has been taken care of before */
+ if (b == 0)
+ errx(ERR_EXIT, "division by zero");
/* only INTMAX_MIN / -1 causes overflow */
if (a == INTMAX_MIN && b == -1)
- return 1;
- /* everything else is OK */
- return 0;
+ errx(ERR_EXIT, "overflow");
}
struct val *
@@ -583,51 +486,33 @@ op_div(struct val *a, struct val *b)
{
struct val *r;
- if (!to_integer(a) || !to_integer(b)) {
- errx(ERR_EXIT, "non-numeric argument");
- }
-
- if (b->u.i == 0) {
- errx(ERR_EXIT, "division by zero");
- }
-
- if (eflag) {
- r = make_integer(a->u.i / b->u.i);
- if (chk_div(a->u.i, b->u.i)) {
- errx(ERR_EXIT, "overflow");
- }
- } else
- r = make_integer((long)a->u.i / (long)b->u.i);
+ assert_to_integer(a);
+ assert_to_integer(b);
+ /* assert based on operands only, not on result */
+ assert_div(a->u.i, b->u.i);
+ r = make_integer(a->u.i / b->u.i);
- free_value (a);
- free_value (b);
- return r;
+ free_value(a);
+ free_value(b);
+ return (r);
}
-
+
struct val *
op_rem(struct val *a, struct val *b)
{
struct val *r;
- if (!to_integer(a) || !to_integer(b)) {
- errx(ERR_EXIT, "non-numeric argument");
- }
-
- if (b->u.i == 0) {
- errx(ERR_EXIT, "division by zero");
- }
-
- if (eflag)
- r = make_integer(a->u.i % b->u.i);
- /* chk_rem necessary ??? */
- else
- r = make_integer((long)a->u.i % (long)b->u.i);
+ assert_to_integer(a);
+ assert_to_integer(b);
+ /* pass a=1 to only check for div by zero */
+ assert_div(1, b->u.i);
+ r = make_integer(a->u.i % b->u.i);
- free_value (a);
- free_value (b);
- return r;
+ free_value(a);
+ free_value(b);
+ return (r);
}
-
+
struct val *
op_colon(struct val *a, struct val *b)
{
@@ -642,33 +527,30 @@ op_colon(struct val *a, struct val *b)
to_string(b);
/* compile regular expression */
- if ((eval = regcomp (&rp, b->u.s, 0)) != 0) {
- regerror (eval, &rp, errbuf, sizeof(errbuf));
+ if ((eval = regcomp(&rp, b->u.s, 0)) != 0) {
+ regerror(eval, &rp, errbuf, sizeof(errbuf));
errx(ERR_EXIT, "%s", errbuf);
}
/* compare string against pattern */
/* remember that patterns are anchored to the beginning of the line */
- if (regexec(&rp, a->u.s, (size_t)2, rm, 0) == 0 && rm[0].rm_so == 0) {
+ if (regexec(&rp, a->u.s, (size_t)2, rm, 0) == 0 && rm[0].rm_so == 0)
if (rm[1].rm_so >= 0) {
*(a->u.s + rm[1].rm_eo) = '\0';
- v = make_str (a->u.s + rm[1].rm_so);
+ v = make_str(a->u.s + rm[1].rm_so);
- } else {
- v = make_integer ((intmax_t)(rm[0].rm_eo - rm[0].rm_so));
- }
- } else {
- if (rp.re_nsub == 0) {
- v = make_integer ((intmax_t)0);
- } else {
- v = make_str ("");
- }
- }
+ } else
+ v = make_integer((intmax_t)(rm[0].rm_eo - rm[0].rm_so));
+ else
+ if (rp.re_nsub == 0)
+ v = make_integer((intmax_t)0);
+ else
+ v = make_str("");
/* free arguments and pattern buffer */
- free_value (a);
- free_value (b);
- regfree (&rp);
+ free_value(a);
+ free_value(b);
+ regfree(&rp);
- return v;
+ return (v);
}
diff --git a/bin/ps/ps.1 b/bin/ps/ps.1
index 10dd6af..a66ed5d 100644
--- a/bin/ps/ps.1
+++ b/bin/ps/ps.1
@@ -29,7 +29,7 @@
.\" @(#)ps.1 8.3 (Berkeley) 4/18/94
.\" $FreeBSD$
.\"
-.Dd June 14, 2011
+.Dd July 1, 2011
.Dt PS 1
.Os
.Sh NAME
@@ -492,6 +492,8 @@ command
command and arguments
.It Cm cpu
short-term CPU usage factor (for scheduling)
+.It Cm emul
+system-call emulation environment
.It Cm etime
elapsed running time, format
.Op days- Ns
@@ -527,6 +529,8 @@ lock currently blocked on (as a symbolic name)
login name of user who started the session
.It Cm lstart
time started
+.It Cm lwp
+process thread-id
.It Cm majflt
total page faults
.It Cm minflt
@@ -542,6 +546,8 @@ nice value (alias
.Cm ni )
.It Cm nivcsw
total involuntary context switches
+.It Cm nlwp
+number of threads tied to a process
.It Cm nsigs
total signals taken (alias
.Cm nsignals )
@@ -562,8 +568,6 @@ pageins (same as majflt)
process group number
.It Cm pid
process ID
-.It Cm poip
-pageouts in progress
.It Cm ppid
parent process ID
.It Cm pri
@@ -574,8 +578,6 @@ core residency time (in seconds; 127 = infinity)
real group ID
.It Cm rgroup
group name (from rgid)
-.It Cm rlink
-reverse link on run queue, or 0
.It Cm rss
resident set size
.It Cm rtprio
@@ -630,8 +632,6 @@ text size (in Kbytes)
control terminal name (two letter abbreviation)
.It Cm tty
full name of control terminal
-.It Cm uprocp
-process pointer
.It Cm ucomm
name to be used for accounting
.It Cm uid
@@ -640,6 +640,8 @@ effective user ID (alias
.It Cm upr
scheduling priority on return from system call (alias
.Cm usrpri )
+.It Cm uprocp
+process pointer
.It Cm user
user name (from UID)
.It Cm usertime
diff --git a/bin/sh/sh.1 b/bin/sh/sh.1
index 4a9fe06..bbb0f49 100644
--- a/bin/sh/sh.1
+++ b/bin/sh/sh.1
@@ -32,7 +32,7 @@
.\" from: @(#)sh.1 8.6 (Berkeley) 5/4/95
.\" $FreeBSD$
.\"
-.Dd June 24, 2011
+.Dd July 10, 2011
.Dt SH 1
.Os
.Sh NAME
@@ -861,7 +861,9 @@ causes asynchronous execution of the preceding AND-OR-list.
.Ss Background Commands (&)
If a command is terminated by the control operator ampersand
.Pq Ql & ,
-the shell executes the command asynchronously;
+the shell executes the command in a subshell environment (see
+.Sx Grouping Commands Together
+below) and asynchronously;
the shell does not wait for the command to finish
before executing the next command.
.Pp
@@ -1024,7 +1026,41 @@ or
.D1 Li { Ar list Ns Li \&; }
.Pp
The first form executes the commands in a subshell environment.
-Note that built-in commands thus executed do not affect the current shell.
+A subshell environment has its own copy of:
+.Pp
+.Bl -enum
+.It
+The current working directory as set by
+.Ic cd .
+.It
+The file creation mask as set by
+.Ic umask .
+.It
+References to open files.
+.It
+Traps as set by
+.Ic trap .
+.It
+Known jobs.
+.It
+Positional parameters and variables.
+.It
+Shell options.
+.It
+Shell functions.
+.It
+Shell aliases.
+.El
+.Pp
+These are copied from the parent shell environment,
+except that trapped (but not ignored) signals are reset to the default action
+and known jobs are cleared.
+Any changes do not affect the parent shell environment.
+.Pp
+A subshell environment may be implemented as a child process or differently.
+If job control is enabled in an interactive shell,
+commands grouped in parentheses can be suspended and continued as a unit.
+.Pp
The second form never forks another shell,
so it is slightly more efficient.
Grouping commands together this way allows the user to
@@ -1552,10 +1588,12 @@ The command is executed in a subshell environment,
except that the built-in commands
.Ic jobid ,
.Ic jobs ,
-.Ic times
and
.Ic trap
-return information about the main shell environment
+return information about the parent shell environment
+and
+.Ic times
+returns information about the same process
if they are the only command in a command substitution.
.Ss Arithmetic Expansion
Arithmetic expansion provides a mechanism for evaluating an arithmetic
@@ -2359,8 +2397,8 @@ If there are zero positional parameters, shifting does not do anything.
A built-in equivalent of
.Xr test 1 .
.It Ic times
-Print the amount of time spent executing the shell and its children.
-The first output line shows the user and system times for the shell
+Print the amount of time spent executing the shell process and its children.
+The first output line shows the user and system times for the shell process
itself, the second one contains the user and system times for the
children.
.It Ic trap Oo Ar action Oc Ar signal ...
@@ -2386,7 +2424,7 @@ Omitting the
.Ar action
is another way to request the default action, for compatibility reasons this
usage is not recommended though.
-In a subshell environment,
+In a subshell or utility environment,
the shell resets trapped (but not ignored) signals to the default action.
The
.Ic trap
diff --git a/cddl/contrib/opensolaris/cmd/zfs/zfs.8 b/cddl/contrib/opensolaris/cmd/zfs/zfs.8
index e5d8590..e30b4b2 100644
--- a/cddl/contrib/opensolaris/cmd/zfs/zfs.8
+++ b/cddl/contrib/opensolaris/cmd/zfs/zfs.8
@@ -6,6 +6,7 @@
.\" The contents of this file are subject to the terms of the Common Development and Distribution License (the "License"). You may not use this file except in compliance with the License. You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE or http://www.opensolaris.org/os/licensing.
.\" See the License for the specific language governing permissions and limitations under the License. When distributing Covered Code, include this CDDL HEADER in each file and include the License file at usr/src/OPENSOLARIS.LICENSE. If applicable, add the following below this CDDL HEADER, with
.\" the fields enclosed by brackets "[]" replaced with your own identifying information: Portions Copyright [yyyy] [name of copyright owner]
+.\" Copyright 2011 Nexenta Systems, Inc. All rights reserved.
.\" Copyright 2011 by Delphix. All rights reserved.
.TH zfs 1M "24 Sep 2009" "SunOS 5.11" "System Administration Commands"
.SH NAME
@@ -642,7 +643,7 @@ When the property value is set to \fBpassthrough\fR, files are created with a mo
.ad
.sp .6
.RS 4n
-Controls how an \fBACL\fR is modified during \fBchmod\fR(2). A file system with an \fBaclmode\fR property of \fBdiscard\fR deletes all \fBACL\fR entries that do not represent the mode of the file. An \fBaclmode\fR property of \fBgroupmask\fR (the default) reduces user or group permissions. The permissions are reduced, such that they are no greater than the group permission bits, unless it is a user entry that has the same \fBUID\fR as the owner of the file or directory. In this case, the \fBACL\fR permissions are reduced so that they are no greater than owner permission bits. A file system with an \fBaclmode\fR property of \fBpassthrough\fR indicates that no changes are made to the \fBACL\fR other than generating the necessary \fBACL\fR entries to represent the new mode of the file or directory.
+Controls how an \fBACL\fR is modified during \fBchmod\fR(2). A file system with an \fBaclmode\fR property of \fBdiscard\fR (the default) deletes all \fBACL\fR entries that do not represent the mode of the file. An \fBaclmode\fR property of \fBgroupmask\fR reduces permissions granted in all \fBALLOW\fR entries found in the \fBACL\fR such that they are no greater than the group permissions specified by \fBchmod\fR. A file system with an \fBaclmode\fR property of \fBpassthrough\fR indicates that no changes are made to the \fBACL\fR other than creating or updating the necessary \fBACL\fR entries to represent the new mode of the file or directory.
.RE
.sp
@@ -2697,7 +2698,7 @@ pool/home/bob setuid on default
pool/home/bob readonly off default
pool/home/bob zoned off default
pool/home/bob snapdir hidden default
-pool/home/bob aclmode groupmask default
+pool/home/bob aclmode discard default
pool/home/bob aclinherit restricted default
pool/home/bob canmount on default
pool/home/bob shareiscsi off default
diff --git a/cddl/contrib/opensolaris/cmd/zpool/zpool.8 b/cddl/contrib/opensolaris/cmd/zpool/zpool.8
index ff71dff..c700b7f 100644
--- a/cddl/contrib/opensolaris/cmd/zpool/zpool.8
+++ b/cddl/contrib/opensolaris/cmd/zpool/zpool.8
@@ -82,6 +82,11 @@ zpool \- configures ZFS storage pools
.LP
.nf
+\fBzpool labelclear\fR [\fB-f\fR] \fIdevice\fR
+.fi
+
+.LP
+.nf
\fBzpool list\fR [\fB-H\fR] [\fB-o\fR \fIproperty\fR[,...]] [\fIpool\fR] ...
.fi
@@ -1205,6 +1210,28 @@ Verbose statistics. Reports usage statistics for individual \fIvdevs\fR within t
.ne 2
.mk
.na
+\fB\fBzpool labelclear\fR [\fB-f\fR] \fIdevice\fR
+.ad
+.sp .6
+.RS 4n
+Removes ZFS label information from the specified device. The device must not be part of an active pool configuration.
+.sp
+.ne 2
+.mk
+.na
+\fB\fB-f\fR\fR
+.ad
+.RS 12n
+.rt
+Treat exported or foreign devices as inactive.
+.RE
+
+.RE
+
+.sp
+.ne 2
+.mk
+.na
\fB\fBzpool list\fR [\fB-H\fR] [\fB-o\fR \fIprops\fR[,...]] [\fIpool\fR] ...\fR
.ad
.sp .6
diff --git a/cddl/contrib/opensolaris/cmd/zpool/zpool_main.c b/cddl/contrib/opensolaris/cmd/zpool/zpool_main.c
index 73e40ec..45465b8 100644
--- a/cddl/contrib/opensolaris/cmd/zpool/zpool_main.c
+++ b/cddl/contrib/opensolaris/cmd/zpool/zpool_main.c
@@ -57,6 +57,7 @@ static int zpool_do_destroy(int, char **);
static int zpool_do_add(int, char **);
static int zpool_do_remove(int, char **);
+static int zpool_do_labelclear(int, char **);
static int zpool_do_list(int, char **);
static int zpool_do_iostat(int, char **);
@@ -113,6 +114,7 @@ typedef enum {
HELP_HISTORY,
HELP_IMPORT,
HELP_IOSTAT,
+ HELP_LABELCLEAR,
HELP_LIST,
HELP_OFFLINE,
HELP_ONLINE,
@@ -149,6 +151,8 @@ static zpool_command_t command_table[] = {
{ "add", zpool_do_add, HELP_ADD },
{ "remove", zpool_do_remove, HELP_REMOVE },
{ NULL },
+ { "labelclear", zpool_do_labelclear, HELP_LABELCLEAR },
+ { NULL },
{ "list", zpool_do_list, HELP_LIST },
{ "iostat", zpool_do_iostat, HELP_IOSTAT },
{ "status", zpool_do_status, HELP_STATUS },
@@ -215,6 +219,8 @@ get_usage(zpool_help_t idx) {
case HELP_IOSTAT:
return (gettext("\tiostat [-v] [-T d|u] [pool] ... [interval "
"[count]]\n"));
+ case HELP_LABELCLEAR:
+ return (gettext("\tlabelclear [-f] <vdev>\n"));
case HELP_LIST:
return (gettext("\tlist [-H] [-o property[,...]] "
"[-T d|u] [pool] ... [interval [count]]\n"));
@@ -561,6 +567,125 @@ zpool_do_remove(int argc, char **argv)
}
/*
+ * zpool labelclear <vdev>
+ *
+ * Verifies that the vdev is not active and zeros out the label information
+ * on the device.
+ */
+int
+zpool_do_labelclear(int argc, char **argv)
+{
+ char *vdev, *name;
+ int c, fd = -1, ret = 0;
+ pool_state_t state;
+ boolean_t inuse = B_FALSE;
+ boolean_t force = B_FALSE;
+
+ /* check options */
+ while ((c = getopt(argc, argv, "f")) != -1) {
+ switch (c) {
+ case 'f':
+ force = B_TRUE;
+ break;
+ default:
+ (void) fprintf(stderr, gettext("invalid option '%c'\n"),
+ optopt);
+ usage(B_FALSE);
+ }
+ }
+
+ argc -= optind;
+ argv += optind;
+
+ /* get vdev name */
+ if (argc < 1) {
+ (void) fprintf(stderr, gettext("missing vdev device name\n"));
+ usage(B_FALSE);
+ }
+
+ vdev = argv[0];
+ if ((fd = open(vdev, O_RDWR)) < 0) {
+ (void) fprintf(stderr, gettext("Unable to open %s\n"), vdev);
+ return (B_FALSE);
+ }
+
+ name = NULL;
+ if (zpool_in_use(g_zfs, fd, &state, &name, &inuse) != 0) {
+ if (force)
+ goto wipe_label;
+
+ (void) fprintf(stderr,
+ gettext("Unable to determine pool state for %s\n"
+ "Use -f to force the clearing any label data\n"), vdev);
+
+ return (1);
+ }
+
+ if (inuse) {
+ switch (state) {
+ default:
+ case POOL_STATE_ACTIVE:
+ case POOL_STATE_SPARE:
+ case POOL_STATE_L2CACHE:
+ (void) fprintf(stderr,
+gettext("labelclear operation failed.\n"
+ "\tVdev %s is a member (%s), of pool \"%s\".\n"
+ "\tTo remove label information from this device, export or destroy\n"
+ "\tthe pool, or remove %s from the configuration of this pool\n"
+ "\tand retry the labelclear operation\n"),
+ vdev, zpool_pool_state_to_name(state), name, vdev);
+ ret = 1;
+ goto errout;
+
+ case POOL_STATE_EXPORTED:
+ if (force)
+ break;
+
+ (void) fprintf(stderr,
+gettext("labelclear operation failed.\n"
+ "\tVdev %s is a member of the exported pool \"%s\".\n"
+ "\tUse \"zpool labelclear -f %s\" to force the removal of label\n"
+ "\tinformation.\n"),
+ vdev, name, vdev);
+ ret = 1;
+ goto errout;
+
+ case POOL_STATE_POTENTIALLY_ACTIVE:
+ if (force)
+ break;
+
+ (void) fprintf(stderr,
+gettext("labelclear operation failed.\n"
+ "\tVdev %s is a member of the pool \"%s\".\n"
+ "\tThis pool is unknown to this system, but may be active on\n"
+ "\tanother system. Use \'zpool labelclear -f %s\' to force the\n"
+ "\tremoval of label information.\n"),
+ vdev, name, vdev);
+ ret = 1;
+ goto errout;
+
+ case POOL_STATE_DESTROYED:
+ /* inuse should never be set for a destoryed pool... */
+ break;
+ }
+ }
+
+wipe_label:
+ if (zpool_clear_label(fd) != 0) {
+ (void) fprintf(stderr,
+ gettext("Label clear failed on vdev %s\n"), vdev);
+ ret = 1;
+ }
+
+errout:
+ close(fd);
+ if (name != NULL)
+ free(name);
+
+ return (ret);
+}
+
+/*
* zpool create [-fn] [-o property=value] ...
* [-O file-system-property=value] ...
* [-R root] [-m mountpoint] <pool> <dev> ...
@@ -1052,7 +1177,7 @@ print_status_config(zpool_handle_t *zhp, const char *name, nvlist_t *nv,
char *vname;
uint64_t notpresent;
spare_cbdata_t cb;
- char *state;
+ const char *state;
if (nvlist_lookup_nvlist_array(nv, ZPOOL_CONFIG_CHILDREN,
&child, &children) != 0)
@@ -1084,10 +1209,11 @@ print_status_config(zpool_handle_t *zhp, const char *name, nvlist_t *nv,
}
if (nvlist_lookup_uint64(nv, ZPOOL_CONFIG_NOT_PRESENT,
- &notpresent) == 0) {
+ &notpresent) == 0 ||
+ vs->vs_state <= VDEV_STATE_CANT_OPEN) {
char *path;
- verify(nvlist_lookup_string(nv, ZPOOL_CONFIG_PATH, &path) == 0);
- (void) printf(" was %s", path);
+ if (nvlist_lookup_string(nv, ZPOOL_CONFIG_PATH, &path) == 0)
+ (void) printf(" was %s", path);
} else if (vs->vs_aux != 0) {
(void) printf(" ");
diff --git a/cddl/contrib/opensolaris/cmd/ztest/ztest.c b/cddl/contrib/opensolaris/cmd/ztest/ztest.c
index d350230..62c98f4 100644
--- a/cddl/contrib/opensolaris/cmd/ztest/ztest.c
+++ b/cddl/contrib/opensolaris/cmd/ztest/ztest.c
@@ -20,6 +20,7 @@
*/
/*
* Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2011 by Delphix. All rights reserved.
*/
/*
@@ -5137,6 +5138,7 @@ ztest_run(ztest_shared_t *zs)
*/
kernel_init(FREAD | FWRITE);
VERIFY(spa_open(zs->zs_pool, &spa, FTAG) == 0);
+ spa->spa_debug = B_TRUE;
zs->zs_spa = spa;
spa->spa_dedup_ditto = 2 * ZIO_DEDUPDITTO_MIN;
diff --git a/cddl/contrib/opensolaris/lib/libzfs/common/libzfs.h b/cddl/contrib/opensolaris/lib/libzfs/common/libzfs.h
index fff63dd..1077958 100644
--- a/cddl/contrib/opensolaris/lib/libzfs/common/libzfs.h
+++ b/cddl/contrib/opensolaris/lib/libzfs/common/libzfs.h
@@ -200,7 +200,8 @@ extern zpool_handle_t *zpool_open_canfail(libzfs_handle_t *, const char *);
extern void zpool_close(zpool_handle_t *);
extern const char *zpool_get_name(zpool_handle_t *);
extern int zpool_get_state(zpool_handle_t *);
-extern char *zpool_state_to_name(vdev_state_t, vdev_aux_t);
+extern const char *zpool_state_to_name(vdev_state_t, vdev_aux_t);
+extern const char *zpool_pool_state_to_name(pool_state_t);
extern void zpool_free_handles(libzfs_handle_t *);
/*
@@ -249,7 +250,7 @@ extern nvlist_t *zpool_find_vdev(zpool_handle_t *, const char *, boolean_t *,
boolean_t *, boolean_t *);
extern nvlist_t *zpool_find_vdev_by_physpath(zpool_handle_t *, const char *,
boolean_t *, boolean_t *, boolean_t *);
-extern int zpool_label_disk(libzfs_handle_t *, zpool_handle_t *, char *);
+extern int zpool_label_disk(libzfs_handle_t *, zpool_handle_t *, const char *);
/*
* Functions to manage pool properties
diff --git a/cddl/contrib/opensolaris/lib/libzfs/common/libzfs_import.c b/cddl/contrib/opensolaris/lib/libzfs/common/libzfs_import.c
index 4c31e56..cafb981 100644
--- a/cddl/contrib/opensolaris/lib/libzfs/common/libzfs_import.c
+++ b/cddl/contrib/opensolaris/lib/libzfs/common/libzfs_import.c
@@ -1084,8 +1084,8 @@ zpool_open_func(void *arg)
/*
* Given a file descriptor, clear (zero) the label information. This function
- * is currently only used in the appliance stack as part of the ZFS sysevent
- * module.
+ * is used in the appliance stack as part of the ZFS sysevent module and
+ * to implement the "zpool labelclear" command.
*/
int
zpool_clear_label(int fd)
diff --git a/cddl/contrib/opensolaris/lib/libzfs/common/libzfs_pool.c b/cddl/contrib/opensolaris/lib/libzfs/common/libzfs_pool.c
index c2306ec..061daab 100644
--- a/cddl/contrib/opensolaris/lib/libzfs/common/libzfs_pool.c
+++ b/cddl/contrib/opensolaris/lib/libzfs/common/libzfs_pool.c
@@ -174,7 +174,7 @@ zpool_get_prop_int(zpool_handle_t *zhp, zpool_prop_t prop, zprop_source_t *src)
/*
* Map VDEV STATE to printed strings.
*/
-char *
+const char *
zpool_state_to_name(vdev_state_t state, vdev_aux_t aux)
{
switch (state) {
@@ -202,6 +202,34 @@ zpool_state_to_name(vdev_state_t state, vdev_aux_t aux)
}
/*
+ * Map POOL STATE to printed strings.
+ */
+const char *
+zpool_pool_state_to_name(pool_state_t state)
+{
+ switch (state) {
+ case POOL_STATE_ACTIVE:
+ return (gettext("ACTIVE"));
+ case POOL_STATE_EXPORTED:
+ return (gettext("EXPORTED"));
+ case POOL_STATE_DESTROYED:
+ return (gettext("DESTROYED"));
+ case POOL_STATE_SPARE:
+ return (gettext("SPARE"));
+ case POOL_STATE_L2CACHE:
+ return (gettext("L2CACHE"));
+ case POOL_STATE_UNINITIALIZED:
+ return (gettext("UNINITIALIZED"));
+ case POOL_STATE_UNAVAIL:
+ return (gettext("UNAVAIL"));
+ case POOL_STATE_POTENTIALLY_ACTIVE:
+ return (gettext("POTENTIALLY_ACTIVE"));
+ }
+
+ return (gettext("UNKNOWN"));
+}
+
+/*
* Get a zpool property value for 'prop' and return the value in
* a pre-allocated buffer.
*/
@@ -3082,15 +3110,25 @@ zpool_vdev_name(libzfs_handle_t *hdl, zpool_handle_t *zhp, nvlist_t *nv,
char buf[64];
vdev_stat_t *vs;
uint_t vsc;
+ int have_stats;
+ int have_path;
- if (nvlist_lookup_uint64(nv, ZPOOL_CONFIG_NOT_PRESENT,
- &value) == 0) {
+ have_stats = nvlist_lookup_uint64_array(nv, ZPOOL_CONFIG_VDEV_STATS,
+ (uint64_t **)&vs, &vsc) == 0;
+ have_path = nvlist_lookup_string(nv, ZPOOL_CONFIG_PATH, &path) == 0;
+
+ /*
+ * If the device is not currently present, assume it will not
+ * come back at the same device path. Display the device by GUID.
+ */
+ if (nvlist_lookup_uint64(nv, ZPOOL_CONFIG_NOT_PRESENT, &value) == 0 ||
+ have_path && have_stats && vs->vs_state <= VDEV_STATE_CANT_OPEN) {
verify(nvlist_lookup_uint64(nv, ZPOOL_CONFIG_GUID,
&value) == 0);
(void) snprintf(buf, sizeof (buf), "%llu",
(u_longlong_t)value);
path = buf;
- } else if (nvlist_lookup_string(nv, ZPOOL_CONFIG_PATH, &path) == 0) {
+ } else if (have_path) {
/*
* If the device is dead (faulted, offline, etc) then don't
@@ -3098,8 +3136,7 @@ zpool_vdev_name(libzfs_handle_t *hdl, zpool_handle_t *zhp, nvlist_t *nv,
* open a misbehaving device, which can have undesirable
* effects.
*/
- if ((nvlist_lookup_uint64_array(nv, ZPOOL_CONFIG_VDEV_STATS,
- (uint64_t **)&vs, &vsc) != 0 ||
+ if ((have_stats == 0 ||
vs->vs_state >= VDEV_STATE_DEGRADED) &&
zhp != NULL &&
nvlist_lookup_string(nv, ZPOOL_CONFIG_DEVID, &devid) == 0) {
@@ -3605,7 +3642,7 @@ find_start_block(nvlist_t *config)
* stripped of any leading /dev path.
*/
int
-zpool_label_disk(libzfs_handle_t *hdl, zpool_handle_t *zhp, char *name)
+zpool_label_disk(libzfs_handle_t *hdl, zpool_handle_t *zhp, const char *name)
{
#ifdef sun
char path[MAXPATHLEN];
diff --git a/contrib/bind9/CHANGES b/contrib/bind9/CHANGES
index cd744c6..80ac38a 100644
--- a/contrib/bind9/CHANGES
+++ b/contrib/bind9/CHANGES
@@ -1,4 +1,28 @@
- --- 9.6-ESV-R4-P1 released ---
+ --- 9.8.0-P4 released ---
+
+3124. [bug] Use an rdataset attribute flag to indicate
+ negative-cache records rather than using rrtype 0;
+ this will prevent problems when that rrtype is
+ used in actual DNS packets. [RT #24777]
+
+ --- 9.8.0-P3 released (withdrawn) ---
+
+3126. [security] Using DNAME record to generate replacements caused
+ RPZ to exit with a assertion failure. [RT #23766]
+
+3125. [security] Using wildcard CNAME records as a replacement with
+ RPZ caused named to exit with a assertion failure.
+ [RT #24715]
+
+3123. [security] Change #2912 exposed a latent flaw in
+ dns_rdataset_totext() that could cause named to
+ crash with an assertion failure. [RT #24777]
+
+3115. [bug] Named could fail to return requested data when
+ following a CNAME that points into the same zone.
+ [RT #2445]
+
+ --- 9.8.0-P2 released ---
3121. [security] An authoritative name server sending a negative
response containing a very large RRset could
@@ -9,22 +33,114 @@
that validated insecure without using DLV and had
DS records in the parent zone. [RT #24631]
- --- 9.6-ESV-R4 released ---
+ --- 9.8.0-P1 released ---
+
+3100. [security] Certain response policy zone configurations could
+ trigger an INSIST when receiving a query of type
+ RRSIG. [RT #24280]
+
+ --- 9.8.0 released ---
+
+3025. [bug] Fixed a possible deadlock due to zone resigning.
+ [RT #22964]
+
+3024. [func] RTT Banding removed due to minor security increase
+ but major impact on resolver latency. [RT #23310]
+
+3023. [bug] Named could be left in an inconsistent state when
+ receiving multiple AXFR response messages that were
+ not all TSIG-signed. [RT #23254]
+
+3022. [bug] Fixed rpz SERVFAILs after failed zone transfers
+ [RT #23246]
+
+3021. [bug] Change #3010 was incomplete. [RT #22296]
+
+3020. [bug] auto-dnssec failed to correctly update the zone when
+ changing the DNSKEY RRset. [RT #23232]
+
+3019. [test] Test: check apex NSEC3 records after adding DNSKEY
+ record via UPDATE. [RT #23229]
+
+ --- 9.8.0rc1 released ---
- --- 9.6.3 released ---
+3018. [bug] Named failed to check for the "none;" acl when deciding
+ if a zone may need to be re-signed. [RT #23120]
+
+3017. [doc] dnssec-keyfromlabel -I was not properly documented.
+ [RT #22887]
+
+3016. [bug] rndc usage missing '-b'. [RT #22937]
+
+3015. [port] win32: fix IN6_IS_ADDR_LINKLOCAL and
+ IN6_IS_ADDR_SITELOCAL macros. [RT #22724]
+
+3013. [bug] The DNS64 ttl was not always being set as expected.
+ [RT #23034]
+
+3012. [bug] Remove DNSKEY TTL change pairs before generating
+ signing records for any remaining DNSKEY changes.
+ [RT #22590]
+
+3011. [func] Allow setting this in named.conf using the new
+ 'resolver-query-timeout' option, which specifies a max
+ time in seconds. 0 means 'default' and anything longer
+ than 30 will be silently set to 30. [RT #22852]
+
+3010. [bug] Fixed a bug where "rndc reconfig" stopped the timer
+ for refreshing managed-keys. [RT #22296]
3009. [bug] clients-per-query code didn't work as expected with
particular query patterns. [RT #22972]
- --- 9.6.3rc1 released ---
+ --- 9.8.0b1 released ---
+
+3008. [func] Response policy zones (RPZ) support. [RT #21726]
3007. [bug] Named failed to preserve the case of domain names in
rdata which is not compressible when writing master
files. [RT #22863]
+3006. [func] Allow dynamically generated TSIG keys to be preserved
+ across restarts of named. Initially this is for
+ TSIG keys generated using GSSAPI. [RT #22639]
+
+3005. [port] Solaris: Work around the lack of
+ gsskrb5_register_acceptor_identity() by setting
+ the KRB5_KTNAME environment variable to the
+ contents of tkey-gssapi-keytab. Also fixed
+ test errors on MacOSX. [RT #22853]
+
+3004. [func] DNS64 reverse support. [RT #22769]
+
+3003. [experimental] Added update-policy match type "external",
+ enabling named to defer the decision of whether to
+ allow a dynamic update to an external daemon.
+ (Contributed by Andrew Tridgell.) [RT #22758]
+
3002. [bug] isc_mutex_init_errcheck() failed to destroy attr.
[RT #22766]
+3001. [func] Added a default trust anchor for the root zone, which
+ can be switched on by setting "dnssec-validation auto;"
+ in the named.conf options. [RT #21727]
+
+3000. [bug] More TKEY/GSS fixes:
+ - nsupdate can now get the default realm from
+ the user's Kerberos principal
+ - corrected gsstest compilation flags
+ - improved documentation
+ - fixed some NULL dereferences
+ [RT #22795]
+
+2999. [func] Add GOST support (RFC 5933). [RT #20639]
+
+2998. [func] Add isc_task_beginexclusive and isc_task_endexclusive
+ to the task api. [RT #22776]
+
+2997. [func] named -V now reports the OpenSSL and libxml2 verions
+ it was compiled against. [RT #22687]
+
2996. [security] Temporarily disable SO_ACCEPTFILTER support.
[RT #22589]
@@ -35,13 +151,52 @@
do not use threads on earlier versions. Also kill
the unproven-pthreads, mit-pthreads, and ptl2 support.
+2993. [func] Dynamically grow adb hash tables. [RT #21186]
+
+2992. [contrib] contrib/check-secure-delegation.pl: A simple tool
+ for looking at a secure delegation. [RT #22059]
+
+2991. [contrib] contrib/zone-edit.sh: A simple zone editing tool for
+ dynamic zones. [RT #22365]
+
+2990. [bug] 'dnssec-settime -S' no longer tests prepublication
+ interval validity when the interval is set to 0.
+ [RT #22761]
+
+2989. [func] Added support for writable DLZ zones. (Contributed
+ by Andrew Tridgell of the Samba project.) [RT #22629]
+
+2988. [experimental] Added a "dlopen" DLZ driver, allowing the creation
+ of external DLZ drivers that can be loaded as
+ shared objects at runtime rather than linked with
+ named. Currently this is switched on via a
+ compile-time option, "configure --with-dlz-dlopen".
+ Note: the syntax for configuring DLZ zones
+ is likely to be refined in future releases.
+ (Contributed by Andrew Tridgell of the Samba
+ project.) [RT #22629]
+
+2987. [func] Improve ease of configuring TKEY/GSS updates by
+ adding a "tkey-gssapi-keytab" option. If set,
+ updates will be allowed with any key matching
+ a principal in the specified keytab file.
+ "tkey-gssapi-credential" is no longer required
+ and is expected to be deprecated. (Contributed
+ by Andrew Tridgell of the Samba project.)
+ [RT #22629]
+
+2986. [func] Add new zone type "static-stub". It's like a stub
+ zone, but the nameserver names and/or their IP
+ addresses are statically configured. [RT #21474]
+
+2985. [bug] Add a regression test for change #2896. [RT #21324]
+
2984. [bug] Don't run MX checks when the target of the MX record
is ".". [RT #22645]
-2817. [cleanup] Removed unnecessary isc_task_endexclusive() calls.
- [RT #20768]
+2983. [bug] Include "loadkeys" in rndc help output. [RT #22493]
- --- 9.6.3b1 released ---
+ --- 9.8.0a1 released ---
2982. [bug] Reference count dst keys. dst_key_attach() can be used
increment the reference count.
@@ -50,34 +205,103 @@
always call dst_key_free() rather than setting it
to NULL on success. [RT #22672]
+2981. [func] Partial DNS64 support (AAAA synthesis). [RT #21991]
+
+2980. [bug] named didn't properly handle UPDATES that changed the
+ TTL of the NSEC3PARAM RRset. [RT #22363]
+
2979. [bug] named could deadlock during shutdown if two
"rndc stop" commands were issued at the same
time. [RT #22108]
2978. [port] hpux: look for <devpoll.h> [RT #21919]
+2977. [bug] 'nsupdate -l' report if the session key is missing.
+ [RT #21670]
+
2976. [bug] named could die on exit after negotiating a GSS-TSIG
key. [RT #22573]
-2975. [bug] rbtdb.c:cleanup_dead_nodes_callback() aquired the
+2975. [bug] rbtdb.c:cleanup_dead_nodes_callback() acquired the
wrong lock which could lead to server deadlock.
[RT #22614]
+2974. [bug] Some valid UPDATE requests could fail due to a
+ consistency check examining the existing version
+ of the zone rather than the new version resulting
+ from the UPDATE. [RT #22413]
+
+2973. [bug] bind.keys.h was being removed by the "make clean"
+ at the end of configure resulting in build failures
+ where there is very old version of perl installed.
+ Move it to "make maintainer-clean". [RT #22230]
+
+2972. [bug] win32: address windows socket errors. [RT #21906]
+
+2971. [bug] Fixed a bug that caused journal files not to be
+ compacted on Windows systems as a result of
+ non-POSIX-compliant rename() semantics. [RT #22434]
+
+2970. [security] Adding a NO DATA negative cache entry failed to clear
+ any matching RRSIG records. A subsequent lookup of
+ of NO DATA cache entry could trigger a INSIST when the
+ unexpected RRSIG was also returned with the NO DATA
+ cache entry.
+
+ CVE-2010-3613, VU#706148. [RT #22288]
+
+2969. [security] Fix acl type processing so that allow-query works
+ in options and view statements. Also add a new
+ set of tests to verify proper functioning.
+
+ CVE-2010-3615, VU#510208. [RT #22418]
+
+2968. [security] Named could fail to prove a data set was insecure
+ before marking it as insecure. One set of conditions
+ that can trigger this occurs naturally when rolling
+ DNSKEY algorithms.
+
+ CVE-2010-3614, VU#837744. [RT #22309]
+
+2967. [bug] 'host -D' now turns on debugging messages earlier.
+ [RT #22361]
+
+2966. [bug] isc_print_vsnprintf() failed to check if there was
+ space available in the buffer when adding a left
+ justified character with a non zero width,
+ (e.g. "%-1c"). [RT #22270]
+
2965. [func] Test HMAC functions using test data from RFC 2104 and
RFC 4634. [RT #21702]
+2964. [placeholder]
+
+2963. [security] The allow-query acl was being applied instead of the
+ allow-query-cache acl to cache lookups. [RT #22114]
+
+2962. [port] win32: add more dependencies to BINDBuild.dsw.
+ [RT #22062]
+
+2961. [bug] Be still more selective about the non-authoritative
+ answers we apply change 2748 to. [RT #22074]
+
2960. [func] Check that named accepts non-authoritative answers.
[RT #21594]
2959. [func] Check that named starts with a missing masterfile.
[RT #22076]
+2958. [bug] named failed to start with a missing master file.
+ [RT #22076]
+
2957. [bug] entropy_get() and entropy_getpseudo() failed to match
the API for RAND_bytes() and RAND_pseudo_bytes()
respectively. [RT #21962]
2956. [port] Enable atomic operations on the PowerPC64. [RT #21899]
+2955. [func] Provide more detail in the recursing log. [RT #22043]
+
2954. [bug] contrib: dlz_mysql_driver.c bad error handling on
build_sqldbinstance failure. [RT #21623]
@@ -85,10 +309,26 @@
exact match" message when returning a wildcard
no data response. [RT #21744]
+2952. [port] win32: named-checkzone and named-checkconf failed
+ to initialise winsock. [RT #21932]
+
+2951. [bug] named failed to generate a correct signed response
+ in a optout, delegation only zone with no secure
+ delegations. [RT #22007]
+
2950. [bug] named failed to perform a SOA up to date check when
falling back to TCP on UDP timeouts when
ixfr-from-differences was set. [RT #21595]
+2949. [bug] dns_view_setnewzones() contained a memory leak if
+ it was called multiple times. [RT #21942]
+
+2948. [port] MacOS: provide a mechanism to configure the test
+ interfaces at reboot. See bin/tests/system/README
+ for details.
+
+2947. [placeholder]
+
2946. [doc] Document the default values for the minimum and maximum
zone refresh and retry values in the ARM. [RT #21886]
@@ -97,12 +337,59 @@
2944. [maint] Remove ORCHID prefix from built in empty zones.
[RT #21772]
+2943. [func] Add support to load new keys into managed zones
+ without signing immediately with "rndc loadkeys".
+ Add support to link keys with "dnssec-keygen -S"
+ and "dnssec-settime -S". [RT #21351]
+
2942. [contrib] zone2sqlite failed to setup the entropy sources.
[RT #21610]
2941. [bug] sdb and sdlz (dlz's zone database) failed to support
DNAME at the zone apex. [RT #21610]
+2940. [port] Remove connection aborted error message on
+ Windows. [RT #21549]
+
+2939. [func] Check that named successfully skips NSEC3 records
+ that fail to match the NSEC3PARAM record currently
+ in use. [RT# 21868]
+
+2938. [bug] When generating signed responses, from a signed zone
+ that uses NSEC3, named would use a uninitialised
+ pointer if it needed to skip a NSEC3 record because
+ it didn't match the selected NSEC3PARAM record for
+ zone. [RT# 21868]
+
+2937. [bug] Worked around an apparent race condition in over
+ memory conditions. Without this fix a DNS cache DB or
+ ADB could incorrectly stay in an over memory state,
+ effectively refusing further caching, which
+ subsequently made a BIND 9 caching server unworkable.
+ This fix prevents this problem from happening by
+ polling the state of the memory context, rather than
+ making a copy of the state, which appeared to cause
+ a race. This is a "workaround" in that it doesn't
+ solve the possible race per se, but several experiments
+ proved this change solves the symptom. Also, the
+ polling overhead hasn't been reported to be an issue.
+ This bug should only affect a caching server that
+ specifies a finite max-cache-size. It's also quite
+ likely that the bug happens only when enabling threads,
+ but it's not confirmed yet. [RT #21818]
+
+2936. [func] Improved configuration syntax and multiple-view
+ support for addzone/delzone feature (see change
+ #2930). Removed "new-zone-file" option, replaced
+ with "allow-new-zones (yes|no)". The new-zone-file
+ for each view is now created automatically, with
+ a filename generated from a hash of the view name.
+ It is no longer necessary to "include" the
+ new-zone-file in named.conf; this happens
+ automatically. Zones that were not added via
+ "rndc addzone" can no longer be removed with
+ "rndc delzone". [RT #19447]
+
2935. [bug] nsupdate: improve 'file not found' error message.
[RT #21871]
@@ -123,6 +410,17 @@
revisit the issue and complete the fix later.
[RT #21710]
+2930. [experimental] New "rndc addzone" and "rndc delzone" commads
+ allow dynamic addition and deletion of zones.
+ To enable this feature, specify a "new-zone-file"
+ option at the view or options level in named.conf.
+ Zone configuration information for the new zones
+ will be written into that file. To make the new
+ zones persist after a restart, "include" the file
+ into named.conf in the appropriate view. (Note:
+ This feature is not yet documented, and its syntax
+ is expected to change.) [RT #19447]
+
2929. [bug] Improved handling of GSS security contexts:
- added LRU expiration for generated TSIGs
- added the ability to use a non-default realm
@@ -132,19 +430,49 @@
smaller)
[RT #19737]
+2928. [bug] Be more selective about the non-authoritative
+ answer we apply change 2748 to. [RT #21594]
+
+2927. [placeholder]
+
+2926. [placeholder]
+h
+2925. [bug] Named failed to accept uncachable negative responses
+ from insecure zones. [RT# 21555]
+
+2924. [func] 'rndc secroots' dump a combined summary of the
+ current managed keys combined with trusted keys.
+ [RT #20904]
+
2923. [bug] 'dig +trace' could drop core after "connection
timeout". [RT #21514]
2922. [contrib] Update zkt to version 1.0.
+2921. [bug] The resolver could attempt to destroy a fetch context
+ too soon. [RT #19878]
+
+2920. [func] Allow 'filter-aaaa-on-v4' to be applied selectively
+ to IPv4 clients. New acl 'filter-aaaa' (default any).
+
+2919. [func] Add autosign-ksk and autosign-zsk virtual time tests.
+ [RT #20840]
+
2918. [maint] Add AAAA address for I.ROOT-SERVERS.NET.
+2917. [func] Virtual time test framework. [RT #20801]
+
2916. [func] Add framework to use IPv6 in tests.
fd92:7065:b8e:ffff::1 ... fd92:7065:b8e:ffff::7
2915. [cleanup] Be smarter about which objects we attempt to compile
based on configure options. [RT #21444]
+2914. [bug] Make the "autosign" system test more portable.
+ [RT #20997]
+
+2913. [func] Add pkcs#11 system tests. [RT #20784]
+
2912. [func] Windows clients don't like UPDATE responses that clear
the zone section. [RT #20986]
@@ -153,9 +481,17 @@
2910. [func] Sanity check Kerberos credentials. [RT #20986]
+2909. [bug] named-checkconf -p could die if "update-policy local;"
+ was specified in named.conf. [RT #21416]
+
2908. [bug] It was possible for re-signing to stop after removing
a DNSKEY. [RT #21384]
+2907. [bug] The export version of libdns had undefined references.
+ [RT #21444]
+
+2906. [bug] Address RFC 5011 implementation issues. [RT #20903]
+
2905. [port] aix: set use_atomic=yes with native compiler.
[RT #21402]
@@ -164,23 +500,55 @@
secure leading to negative proofs failing. This was
a unintended outcome from change 2890. [RT# 21392]
+2903. [bug] managed-keys-directory missing from namedconf.c.
+ [RT #21370]
+
+2902. [func] Add regression test for change 2897. [RT #21040]
+
2901. [port] Use AC_C_FLEXIBLE_ARRAY_MEMBER. [RT #21316]
+2900. [bug] The placeholder negative caching element was not
+ properly constructed triggering a INSIST in
+ dns_ncache_towire(). [RT #21346]
+
2899. [port] win32: Support linking against OpenSSL 1.0.0.
2898. [bug] nslookup leaked memory when -domain=value was
specified. [RT #21301]
+2897. [bug] NSEC3 chains could be left behind when transitioning
+ to insecure. [RT #21040]
+
+2896. [bug] "rndc sign" failed to properly update the zone
+ when adding a DNSKEY for publication only. [RT #21045]
+
+2895. [func] genrandom: add support for the generation of multiple
+ files. [RT #20917]
+
2894. [contrib] DLZ LDAP support now use '$' not '%'. [RT #21294]
+2893. [bug] Improve managed keys support. New named.conf option
+ managed-keys-directory. [RT #20924]
+
+2892. [bug] Handle REVOKED keys better. [RT #20961]
+
2891. [maint] Update empty-zones list to match
draft-ietf-dnsop-default-local-zones-13. [RT# 21099]
+2890. [bug] Handle the introduction of new trusted-keys and
+ DS, DLV RRsets better. [RT #21097]
+
2889. [bug] Elements of the grammar where not properly reported.
[RT #21046]
2888. [bug] Only the first EDNS option was displayed. [RT #21273]
+2887. [bug] Report the keytag times in UTC in the .key file,
+ local time is presented as a comment within the
+ comment. [RT #21223]
+
+2886. [bug] ctime() is not thread safe. [RT #21223]
+
2885. [bug] Improve -fno-strict-aliasing support probing in
configure. [RT #21080]
@@ -196,12 +564,21 @@
2881. [bug] Reduce the amount of time the rbtdb write lock
is held when closing a version. [RT #21198]
+2880. [cleanup] Make the output of dnssec-keygen and dnssec-revoke
+ consistent. [RT #21078]
+
2879. [contrib] DLZ bdbhpt driver fails to close correct cursor.
[RT #21106]
+2878. [func] Incrementally write the master file after performing
+ a AXFR. [RT #21010]
+
2877. [bug] The validator failed to skip obviously mismatching
RRSIGs. [RT #21138]
+2876. [bug] Named could return SERVFAIL for negative responses
+ from unsigned zones. [RT #21131]
+
2875. [bug] dns_time64_fromtext() could accept non digits.
[RT #21033]
@@ -209,8 +586,22 @@
successfully responds to the query using plain DNS.
[RT #20930]
+2873. [bug] Cancelling a dynamic update via the dns/client module
+ could trigger an assertion failure. [RT #21133]
+
+2872. [bug] Modify dns/client.c:dns_client_createx() to only
+ require one of IPv4 or IPv6 rather than both.
+ [RT #21122]
+
+2871. [bug] Type mismatch in mem_api.c between the definition and
+ the header file, causing build failure with
+ --enable-exportlib. [RT #21138]
+
2870. [maint] Add AAAA address for L.ROOT-SERVERS.NET.
+2869. [bug] Fix arguments to dns_keytable_findnextkeynode() call.
+ [RT #20877]
+
2868. [cleanup] Run "make clean" at the end of configure to ensure
any changes made by configure are integrated.
Use --with-make-clean=no to disable. [RT #20994]
@@ -232,6 +623,11 @@
2862. [bug] nsupdate didn't default to the parent zone when
updating DS records. [RT #20896]
+2861. [doc] dnssec-settime man pages didn't correctly document the
+ inactivation time. [RT #21039]
+
+2860. [bug] named-checkconf's usage was out of date. [RT #21039]
+
2859. [bug] When cancelling validation it was possible to leak
memory. [RT #20800]
@@ -244,173 +640,244 @@
2856. [bug] The size of a memory allocation was not always properly
recorded. [RT #20927]
-2853. [bug] add_sigs() could run out of scratch space. [RT #21015]
-
-2851. [doc] nslookup.1, removed <informalexample> from the docbook
- source as it produced bad nroff. [RT #21007]
-
- --- 9.6-ESV-R3 released ---
-
-2972. [bug] win32: address windows socket errors. [RT #21906]
-
-2971. [bug] Fixed a bug that caused journal files not to be
- compacted on Windows systems as a result of
- non-POSIX-compliant rename() semantics. [RT #22434]
-
-2970. [security] Adding a NO DATA negative cache entry failed to clear
- any matching RRSIG records. A subsequent lookup of
- of NO DATA cache entry could trigger a INSIST when the
- unexpected RRSIG was also returned with the NO DATA
- cache entry.
-
- CVE-2010-3613, VU#706148. [RT #22288]
-
-2969. [security] Fix acl type processing so that allow-query works
- in options and view statements. Also add a new
- set of tests to verify proper functioning.
-
- CVE-2010-3615, VU#510208. [RT #22418]
+2855. [func] nsupdate will now preserve the entered case of domain
+ names in update requests it sends. [RT #20928]
-2968. [security] Named could fail to prove a data set was insecure
- before marking it as insecure. One set of conditions
- that can trigger this occurs naturally when rolling
- DNSKEY algorithms.
+2854. [func] dig: allow the final soa record in a axfr response to
+ be suppressed, dig +onesoa. [RT #20929]
- CVE-2010-3614, VU#837744. [RT #22309]
-
-2967. [bug] 'host -D' now turns on debugging messages earlier.
- [RT #22361]
-
-2966. [bug] isc_print_vsnprintf() failed to check if there was
- space available in the buffer when adding a left
- justified character with a non zero width,
- (e.g. "%-1c"). [RT #22270]
-
-2964. [bug] view->queryacl was being overloaded. Seperate the
- usage into view->queryacl, view->cacheacl and
- view->queryonacl. [RT #22114]
-
-2962. [port] win32: add more dependencies to BINDBuild.dsw.
- [RT #22062]
-
-2952. [port] win32: named-checkzone and named-checkconf failed
- to initialise winsock. [RT #21932]
+2853. [bug] add_sigs() could run out of scratch space. [RT #21015]
-2951. [bug] named failed to generate a correct signed response
- in a optout, delegation only zone with no secure
- delegations. [RT #22007]
+2852. [bug] Handle broken DNSSEC trust chains better. [RT #15619]
- --- 9.6-ESV-R2 released ---
+2851. [doc] nslookup.1, removed <informalexample> from the docbook
+ source as it produced bad nroff. [RT #21007]
-2939. [func] Check that named successfully skips NSEC3 records
- that fail to match the NSEC3PARAM record currently
- in use. [RT# 21868]
+2850. [bug] If isc_heap_insert() failed due to memory shortage
+ the heap would have corrupted entries. [RT #20951]
-2937. [bug] Worked around an apparent race condition in over
- memory conditions. Without this fix a DNS cache DB or
- ADB could incorrectly stay in an over memory state,
- effectively refusing further caching, which
- subsequently made a BIND 9 caching server unworkable.
- This fix prevents this problem from happening by
- polling the state of the memory context, rather than
- making a copy of the state, which appeared to cause
- a race. This is a "workaround" in that it doesn't
- solve the possible race per se, but several experiments
- proved this change solves the symptom. Also, the
- polling overhead hasn't been reported to be an issue.
- This bug should only affect a caching server that
- specifies a finite max-cache-size. It's also quite
- likely that the bug happens only when enabling threads,
- but it's not confirmed yet. [RT #21818]
+2849. [bug] Don't treat errors from the xml2 library as fatal.
+ [RT #20945]
-2925. [bug] Named failed to accept uncachable negative responses
- from insecure zones. [RT# 21555]
+2848. [doc] Moved README.dnssec, README.libdns, README.pkcs11 and
+ README.rfc5011 into the ARM. [RT #20899]
-2921. [bug] The resolver could attempt to destroy a fetch context
- too soon. [RT #19878]
+2847. [cleanup] Corrected usage message in dnssec-settime. [RT #20921]
-2900. [bug] The placeholder negative caching element was not
- properly constructed triggering a INSIST in
- dns_ncache_towire(). [RT #21346]
+2846. [bug] EOF on unix domain sockets was not being handled
+ correctly. [RT #20731]
-2890. [bug] Handle the introduction of new trusted-keys and
- DS, DLV RRsets better. [RT #21097]
+2845. [bug] RFC 5011 client could crash on shutdown. [RT #20903]
-2869. [bug] Fix arguments to dns_keytable_findnextkeynode() call.
- [RT #20877]
+2844. [doc] notify-delay default in ARM was wrong. It should have
+ been five (5) seconds.
- --- 9.6-ESV-R1 released ---
+2843. [func] Prevent dnssec-keygen and dnssec-keyfromlabel from
+ creating key files if there is a chance that the new
+ key ID will collide with an existing one after
+ either of the keys has been revoked. (To override
+ this in the case of dnssec-keyfromlabel, use the -y
+ option. dnssec-keygen will simply create a
+ different, non-colliding key, so an override is
+ not necessary.) [RT #20838]
-2876. [bug] Named could return SERVFAIL for negative responses
- from unsigned zones. [RT #21131]
+2842. [func] Added "smartsign" and improved "autosign" and
+ "dnssec" regression tests. [RT #20865]
- --- 9.6-ESV released ---
+2841. [bug] Change 2836 was not complete. [RT #20883]
-2852. [bug] Handle broken DNSSEC trust chains better. [RT #15619]
+2840. [bug] Temporary fixed pkcs11-destroy usage check.
+ [RT #20760]
- --- 9.6.2 released ---
+2839. [bug] A KSK revoked by named could not be deleted.
+ [RT #20881]
-2850. [bug] If isc_heap_insert() failed due to memory shortage
- the heap would have corrupted entries. [RT #20951]
+2838. [placeholder]
-2849. [bug] Don't treat errors from the xml2 library as fatal.
- [RT #20945]
+2837. [port] Prevent Linux spurious warnings about fwrite().
+ [RT #20812]
-2846. [bug] EOF on unix domain sockets was not being handled
- correctly. [RT #20731]
+2836. [bug] Keys that were scheduled to become active could
+ be delayed. [RT #20874]
-2844. [doc] notify-delay default in ARM was wrong. It should have
- been five (5) seconds.
+2835. [bug] Key inactivity dates were inadvertently stored in
+ the private key file with the outdated tag
+ "Unpublish" rather than "Inactive". This has been
+ fixed; however, any existing keys that had Inactive
+ dates set will now need to have them reset, using
+ 'dnssec-settime -I'. [RT #20868]
- --- 9.6.2rc1 released ---
+2834. [bug] HMAC-SHA* keys that were longer than the algorithm
+ digest length were used incorrectly, leading to
+ interoperability problems with other DNS
+ implementations. This has been corrected.
+ (Note: If an oversize key is in use, and
+ compatibility is needed with an older release of
+ BIND, the new tool "isc-hmac-fixup" can convert
+ the key secret to a form that will work with all
+ versions.) [RT #20751]
-2838. [func] Backport support for SHA-2 DNSSEC algorithms,
- RSASHA256 and RSASHA512, from BIND 9.7. (This
- incorporates changes 2726 and 2738 from that
- release branch.) [RT #20871]
+2833. [cleanup] Fix usage messages in dnssec-keygen and dnssec-settime.
+ [RT #20851]
-2837. [port] Prevent Linux spurious warnings about fwrite().
- [RT #20812]
+2832. [bug] Modify "struct stat" in lib/export/samples/nsprobe.c
+ to avoid redefinition in some OSs [RT 20831]
2831. [security] Do not attempt to validate or cache
out-of-bailiwick data returned with a secure
answer; it must be re-fetched from its original
source and validated in that context. [RT #20819]
+2830. [bug] Changing the OPTOUT setting could take multiple
+ passes. [RT #20813]
+
+2829. [bug] Fixed potential node inconsistency in rbtdb.c.
+ [RT #20808]
+
2828. [security] Cached CNAME or DNAME RR could be returned to clients
without DNSSEC validation. [RT #20737]
2827. [security] Bogus NXDOMAIN could be cached as if valid. [RT #20712]
+2826. [bug] NSEC3->NSEC transitions could fail due to a lock not
+ being released. [RT #20740]
+
2825. [bug] Changing the setting of OPTOUT in a NSEC3 chain that
was in the process of being created was not properly
recorded in the zone. [RT #20786]
+2824. [bug] "rndc sign" was not being run by the correct task.
+ [RT #20759]
+
2823. [bug] rbtdb.c:getsigningtime() was missing locks. [RT #20781]
+2822. [bug] rbtdb.c:loadnode() could return the wrong result.
+ [RT #20802]
+
+2821. [doc] Add note that named-checkconf doesn't automatically
+ read rndc.key and bind.keys [RT #20758]
+
+2820. [func] Handle read access failure of OpenSSL configuration
+ file more user friendly (PKCS#11 engine patch).
+ [RT #20668]
+
2819. [cleanup] Removed unnecessary DNS_POINTER_MAXHOPS define.
[RT #20771]
2818. [cleanup] rndc could return an incorrect error code
when a zone was not found. [RT #20767]
+2817. [cleanup] Removed unnecessary isc_task_endexclusive() calls.
+ [RT #20768]
+
+2816. [bug] previous_closest_nsec() could fail to return
+ data for NSEC3 nodes [RT #29730]
+
2815. [bug] Exclusively lock the task when freezing a zone.
[RT #19838]
2814. [func] Provide a definitive error message when a master
zone is not loaded. [RT #20757]
- --- 9.6.2b1 released ---
+2813. [bug] Better handling of unreadable DNSSEC key files.
+ [RT #20710]
+
+2812. [bug] Make sure updates can't result in a zone with
+ NSEC-only keys and NSEC3 records. [RT 20748]
+
+2811. [cleanup] Add "rndc sign" to list of commands in rndc usage
+ output. [RT #20733]
+
+2810. [doc] Clarified the process of transitioning an NSEC3 zone
+ to insecure. [RT #20746]
+
+2809. [cleanup] Restored accidentally-deleted text in usage output
+ in dnssec-settime and dnssec-revoke [RT #20739]
+
+2808. [bug] Remove the attempt to install atomic.h from lib/isc.
+ atomic.h is correctly installed by the architecture
+ specific subdirectories. [RT #20722]
+
+2807. [bug] Fixed a possible ASSERT when reconfiguring zone
+ keys. [RT #20720]
+
+ --- 9.7.0rc1 released ---
+
+2806. [bug] "rdnc sign" could delay re-signing the DNSKEY
+ when it had changed. [RT #20703]
+
+2805. [bug] Fixed namespace problems encountered when building
+ external programs using non-exported BIND9 libraries
+ (i.e., built without --enable-exportlib). [RT #20679]
+
+2804. [bug] Send notifies when a zone is signed with "rndc sign"
+ or as a result of a scheduled key change. [RT #20700]
+
+2803. [port] win32: Install named-journalprint, nsec3hash, arpaname
+ and genrandom under windows. [RT #20670]
+
+2802. [cleanup] Rename journalprint to named-journalprint. [RT #20670]
+
+2801. [func] Detect and report records that are different according
+ to DNSSEC but are semantically equal according to plain
+ DNS. Apply plain DNS comparisons rather than DNSSEC
+ comparisons when processing UPDATE requests.
+ dnssec-signzone now removes such semantically duplicate
+ records prior to signing the RRset.
+
+ named-checkzone -r {ignore|warn|fail} (default warn)
+ named-compilezone -r {ignore|warn|fail} (default warn)
+
+ named.conf: check-dup-records {ignore|warn|fail};
+
+2800. [func] Reject zones which have NS records which refer to
+ CNAMEs, DNAMEs or don't have address record (class IN
+ only). Reject UPDATEs which would cause the zone
+ to fail the above checks if committed. [RT #20678]
+
+2799. [cleanup] Changed the "secure-to-insecure" option to
+ "dnssec-secure-to-insecure", and "dnskey-ksk-only"
+ to "dnssec-dnskey-kskonly", for clarity. [RT #20586]
+
+2798. [bug] Addressed bugs in managed-keys initialization
+ and rollover. [RT #20683]
2797. [bug] Don't decrement the dispatch manager's maxbuffers.
[RT #20613]
+2796. [bug] Missing dns_rdataset_disassociate() call in
+ dns_nsec3_delnsec3sx(). [RT #20681]
+
+2795. [cleanup] Add text to differentiate "update with no effect"
+ log messages. [RT #18889]
+
+2794. [bug] Install <isc/namespace.h>. [RT #20677]
+
+2793. [func] Add "autosign" and "metadata" tests to the
+ automatic tests. [RT #19946]
+
+2792. [func] "filter-aaaa-on-v4" can now be set in view
+ options (if compiled in). [RT #20635]
+
+2791. [bug] The installation of isc-config.sh was broken.
+ [RT #20667]
+
2790. [bug] Handle DS queries to stub zones. [RT #20440]
2789. [bug] Fixed an INSIST in dispatch.c [RT #20576]
+2788. [bug] dnssec-signzone could sign with keys that were
+ not requested [RT #20625]
+
+2787. [bug] Spurious log message when zone keys were
+ dynamically reconfigured. [RT #20659]
+
2786. [bug] Additional could be promoted to answer. [RT #20663]
+ --- 9.7.0b3 released ---
+
+2785. [bug] Revoked keys could fail to self-sign [RT #20652]
+
2784. [bug] TC was not always being set when required glue was
dropped. [RT #20655]
@@ -420,15 +887,65 @@
2782. [port] win32: use getaddrinfo() for hostname lookups.
[RT #20650]
+2781. [bug] Inactive keys could be used for signing. [RT #20649]
+
+2780. [bug] dnssec-keygen -A none didn't properly unset the
+ activation date in all cases. [RT #20648]
+
+2779. [bug] Dynamic key revocation could fail. [RT #20644]
+
+2778. [bug] dnssec-signzone could fail when a key was revoked
+ without deleting the unrevoked version. [RT #20638]
+
2777. [contrib] DLZ MYSQL auto reconnect support discovery was wrong.
+2776. [bug] Change #2762 was not correct. [RT #20647]
+
+2775. [bug] Accept RSASHA256 and RSASHA512 as NSEC3 compatible
+ in dnssec-keyfromlabel. [RT #20643]
+
+2774. [bug] Existing cache DB wasn't being reused after
+ reconfiguration. [RT #20629]
+
+2773. [bug] In autosigned zones, the SOA could be signed
+ with the KSK. [RT #20628]
+
2772. [security] When validating, track whether pending data was from
the additional section or not and only return it if
validates as secure. [RT #20438]
+2771. [bug] dnssec-signzone: DNSKEY records could be
+ corrupted when importing from key files [RT #20624]
+
+2770. [cleanup] Add log messages to resolver.c to indicate events
+ causing FORMERR responses. [RT #20526]
+
+2769. [cleanup] Change #2742 was incomplete. [RT #19589]
+
+2768. [bug] dnssec-signzone: -S no longer implies -g [RT #20568]
+
+2767. [bug] named could crash on startup if a zone was
+ configured with auto-dnssec and there was no
+ key-directory. [RT #20615]
+
+2766. [bug] isc_socket_fdwatchpoke() should only update the
+ socketmgr state if the socket is not pending on a
+ read or write. [RT #20603]
+
2765. [bug] Skip masters for which the TSIG key cannot be found.
[RT #20595]
+2764. [bug] "rndc-confgen -a" could trigger a REQUIRE. [RT #20610]
+
+2763. [bug] "rndc sign" didn't create an NSEC chain. [RT #20591]
+
+2762. [bug] DLV validation failed with a local slave DLV zone.
+ [RT #20577]
+
+2761. [cleanup] Enable internal symbol table for backtrace only for
+ systems that are known to work. Currently, BSD
+ variants, Linux and Solaris are supported. [RT# 20202]
+
2760. [cleanup] Corrected named-compilezone usage summary. [RT #20533]
2759. [doc] Add information about .jbk/.jnw files to
@@ -441,27 +958,115 @@
2757. [bug] dig: assertion failure could occur in connect
timeout. [RT #20599]
-2755. [doc] Clarify documentation of keyset- files in
- dnssec-signzone man page. [RT #19810]
+2756. [bug] Fixed corrupt logfile message in update.c. [RT# 20597]
+
+2755. [placeholder]
2754. [bug] Secure-to-insecure transitions failed when zone
was signed with NSEC3. [RT #20587]
+2753. [bug] Removed an unnecessary warning that could appear when
+ building an NSEC chain. [RT #20589]
+
+2752. [bug] Locking violation. [RT #20587]
+
+2751. [bug] Fixed a memory leak in dnssec-keyfromlabel. [RT #20588]
+
2750. [bug] dig: assertion failure could occur when a server
didn't have an address. [RT #20579]
2749. [bug] ixfr-from-differences generated a non-minimal ixfr
for NSEC3 signed zones. [RT #20452]
+2748. [func] Identify bad answers from GTLD servers and treat them
+ as referrals. [RT #18884]
+
2747. [bug] Journal roll forwards failed to set the re-signing
time of RRSIGs correctly. [RT #20541]
+2746. [port] hpux: address signed/unsigned expansion mismatch of
+ dns_rbtnode_t.nsec. [RT #20542]
+
+2745. [bug] configure script didn't probe the return type of
+ gai_strerror(3) correctly. [RT #20573]
+
+2744. [func] Log if a query was over TCP. [RT #19961]
+
2743. [bug] RRSIG could be incorrectly set in the NSEC3 record
for a insecure delegation.
+ --- 9.7.0b2 released ---
+
+2742. [cleanup] Clarify some DNSSEC-related log messages in
+ validator.c. [RT #19589]
+
+2741. [func] Allow the dnssec-keygen progress messages to be
+ suppressed (dnssec-keygen -q). Automatically
+ suppress the progress messages when stdin is not
+ a tty. [RT #20474]
+
+2740. [placeholder]
+
+2739. [cleanup] Clean up API for initializing and clearing trust
+ anchors for a view. [RT #20211]
+
+2738. [func] Add RSASHA256 and RSASHA512 tests to the dnssec system
+ test. [RT #20453]
+
+2737. [func] UPDATE requests can leak existence information.
+ [RT #17261]
+
+2736. [func] Improve the performance of NSEC signed zones with
+ more than a normal amount of glue below a delegation.
+ [RT #20191]
+
+2735. [bug] dnssec-signzone could fail to read keys
+ that were specified on the command line with
+ full paths, but weren't in the current
+ directory. [RT #20421]
+
+2734. [port] cygwin: arpaname did not compile. [RT #20473]
+
+2733. [cleanup] Clean up coding style in pkcs11-* tools. [RT #20355]
+
+2732. [func] Add optional filter-aaaa-on-v4 option, available
+ if built with './configure --enable-filter-aaaa'.
+ Filters out AAAA answers to clients connecting
+ via IPv4. (This is NOT recommended for general
+ use.) [RT #20339]
+
+2731. [func] Additional work on change 2709. The key parser
+ will now ignore unrecognized fields when the
+ minor version number of the private key format
+ has been increased. It will reject any key with
+ the major version number increased. [RT #20310]
+
+2730. [func] Have dnssec-keygen display a progress indication
+ a la 'openssl genrsa' on standard error. Note
+ when the first '.' is followed by a long stop
+ one has the choice between slow generation vs.
+ poor random quality, i.e., '-r /dev/urandom'.
+ [RT #20284]
+
2729. [func] When constructing a CNAME from a DNAME use the DNAME
TTL. [RT #20451]
+2728. [bug] dnssec-keygen, dnssec-keyfromlabel and
+ dnssec-signzone now warn immediately if asked to
+ write into a nonexistent directory. [RT #20278]
+
+2727. [func] The 'key-directory' option can now specify a relative
+ path. [RT #20154]
+
+2726. [func] Added support for SHA-2 DNSSEC algorithms,
+ RSASHA256 and RSASHA512. [RT #20023]
+
+2725. [doc] Added information about the file "managed-keys.bind"
+ to the ARM. [RT #20235]
+
+2724. [bug] Updates to a existing node in secure zone using NSEC
+ were failing. [RT #20448]
+
2723. [bug] isc_base32_totext(), isc_base32hex_totext(), and
isc_base64_totext(), didn't always mark regions of
memory as fully consumed after conversion. [RT #20445]
@@ -473,11 +1078,24 @@
2721. [port] Have dst__entropy_status() prime the random number
generator. [RT #20369]
+2720. [bug] RFC 5011 trust anchor updates could trigger an
+ assert if the DNSKEY record was unsigned. [RT #20406]
+
+2719. [func] Skip trusted/managed keys for unsupported algorithms.
+ [RT #20392]
+
2718. [bug] The space calculations in opensslrsa_todns() were
incorrect. [RT #20394]
+2717. [bug] named failed to update the NSEC/NSEC3 record when
+ the last private type record was removed as a result
+ of completing the signing the zone with a key.
+ [RT #20399]
+
2716. [bug] nslookup debug mode didn't return the ttl. [RT #20414]
+ --- 9.7.0b1 released ---
+
2715. [bug] Require OpenSSL support to be explicitly disabled.
[RT #20288]
@@ -487,19 +1105,63 @@
2713. [bug] powerpc: atomic operations missing asm("ics") /
__isync() calls.
+2712. [func] New 'auto-dnssec' zone option allows zone signing
+ to be fully automated in zones configured for
+ dynamic DNS. 'auto-dnssec allow;' permits a zone
+ to be signed by creating keys for it in the
+ key-directory and using 'rndc sign <zone>'.
+ 'auto-dnssec maintain;' allows that too, plus it
+ also keeps the zone's DNSSEC keys up to date
+ according to their timing metadata. [RT #19943]
+
+2711. [port] win32: Add the bin/pkcs11 tools into the full
+ build. [RT #20372]
+
+2710. [func] New 'dnssec-signzone -x' flag and 'dnskey-ksk-only'
+ zone option cause a zone to be signed with only KSKs
+ signing the DNSKEY RRset, not ZSKs. This reduces
+ the size of a DNSKEY answer. [RT #20340]
+
+2709. [func] Added some data fields, currently unused, to the
+ private key file format, to allow implementation
+ of explicit key rollover in a future release
+ without impairing backward or forward compatibility.
+ [RT #20310]
+
+2708. [func] Insecure to secure and NSEC3 parameter changes via
+ update are now fully supported and no longer require
+ defines to enable. We now no longer overload the
+ NSEC3PARAM flag field, nor the NSEC OPT bit at the
+ apex. Secure to insecure changes are controlled by
+ by the named.conf option 'secure-to-insecure'.
+
+ Warning: If you had previously enabled support by
+ adding defines at compile time to BIND 9.6 you should
+ ensure that all changes that are in progress have
+ completed prior to upgrading to BIND 9.7. BIND 9.7
+ is not backwards compatible.
+
+2707. [func] dnssec-keyfromlabel no longer require engine name
+ to be specified in the label if there is a default
+ engine or the -E option has been used. Also, it
+ now uses default algorithms as dnssec-keygen does
+ (i.e., RSASHA1, or NSEC3RSASHA1 if -3 is used).
+ [RT #20371]
+
2706. [bug] Loading a zone with a very large NSEC3 salt could
trigger an assert. [RT #20368]
-2705. [bug] Reconcile the XML stats version number with a later
- BIND9 release, by adding a "name" attribute to
- "cache" elements and increasing the version number
- to 2.2. (This is a minor version change, but may
- affect XML parsers if they assume the cache element
- doesn't take an attribute.)
+2705. [placeholder]
2704. [bug] Serial of dynamic and stub zones could be inconsistent
with their SOA serial. [RT #19387]
+2703. [func] Introduce an OpenSSL "engine" argument with -E
+ for all binaries which can take benefit of
+ crypto hardware. [RT #20230]
+
+2702. [func] Update PKCS#11 tools (bin/pkcs11) [RT #20225 & all]
+
2701. [doc] Correction to ARM: hmac-md5 is no longer the only
supported TSIG key algorithm. [RT #18046]
@@ -508,6 +1170,8 @@
2699. [bug] Missing lock in rbtdb.c. [RT #20037]
+2698. [placeholder]
+
2697. [port] win32: ensure that S_IFMT, S_IFDIR, S_IFCHR and
S_IFREG are defined after including <isc/stat.h>.
[RT #20309]
@@ -515,8 +1179,25 @@
2696. [bug] named failed to successfully process some valid
acl constructs. [RT #20308]
+2695. [func] DHCP/DDNS - update fdwatch code for use by
+ DHCP. Modify the api to isc_sockfdwatch_t (the
+ callback functon for isc_socket_fdwatchcreate)
+ to include information about the direction (read
+ or write) and add isc_socket_fdwatchpoke.
+ [RT #20253]
+
+2694. [bug] Reduce default NSEC3 iterations from 100 to 10.
+ [RT #19970]
+
+2693. [port] Add some noreturn attributes. [RT #20257]
+
2692. [port] win32: 32/64 bit cleanups. [RT #20335]
+2691. [func] dnssec-signzone: retain the existing NSEC or NSEC3
+ chain when re-signing a previously-signed zone.
+ Use -u to modify NSEC3 parameters or switch
+ between NSEC and NSEC3. [RT #20304]
+
2690. [bug] win32: fix isc_thread_key_getspecific() prototype.
[RT #20315]
@@ -525,25 +1206,102 @@
2688. [bug] Use INTERFACE_F_POINTTOPOINT, not IFF_POINTOPOINT,
to decide to fetch the destination address. [RT #20305]
+2687. [bug] Fixed dnssec-signzone -S handling of revoked keys.
+ Also, added warnings when revoking a ZSK, as this is
+ not defined by protocol (but is legal). [RT #19943]
+
2686. [bug] dnssec-signzone should clean the old NSEC chain when
signing with NSEC3 and vice versa. [RT #20301]
+2685. [contrib] Update contrib/zkt to version 0.99c. [RT #20054]
+
+2684. [cleanup] dig: formalize +ad and +cd as synonyms for
+ +adflag and +cdflag. [RT #19305]
+
2683. [bug] dnssec-signzone should clean out old NSEC3 chains when
the NSEC3 parameters used to sign the zone change.
[RT #20246]
+2682. [bug] "configure --enable-symtable=all" failed to
+ build. [RT #20282]
+
2681. [bug] IPSECKEY RR of gateway type 3 was not correctly
decoded. [RT #20269]
+2680. [func] Move contrib/pkcs11-keygen to bin/pkcs11. [RT #20067]
+
+2679. [func] dig -k can now accept TSIG keys in named.conf
+ format. [RT #20031]
+
2678. [func] Treat DS queries as if "minimal-response yes;"
was set. [RT #20258]
+2677. [func] Changes to key metadata behavior:
+ - Keys without "publish" or "active" dates set will
+ no longer be used for smart signing. However,
+ those dates will be set to "now" by default when
+ a key is created; to generate a key but not use
+ it yet, use dnssec-keygen -G.
+ - New "inactive" date (dnssec-keygen/settime -I)
+ sets the time when a key is no longer used for
+ signing but is still published.
+ - The "unpublished" date (-U) is deprecated in
+ favour of "deleted" (-D).
+ [RT #20247]
+
+2676. [bug] --with-export-installdir should have been
+ --with-export-includedir. [RT #20252]
+
+2675. [bug] dnssec-signzone could crash if the key directory
+ did not exist. [RT #20232]
+
+ --- 9.7.0a3 released ---
+
+2674. [bug] "dnssec-lookaside auto;" crashed if named was built
+ without openssl. [RT #20231]
+
+2673. [bug] The managed-keys.bind zone file could fail to
+ load due to a spurious result from sync_keyzone()
+ [RT #20045]
+
2672. [bug] Don't enable searching in 'host' when doing reverse
lookups. [RT #20218]
+2671. [bug] Add support for PKCS#11 providers not returning
+ the public exponent in RSA private keys
+ (OpenCryptoki for instance) in
+ dnssec-keyfromlabel. [RT #19294]
+
2670. [bug] Unexpected connect failures failed to log enough
information to be useful. [RT #20205]
+2669. [func] Update PKCS#11 support to support Keyper HSM.
+ Update PKCS#11 patch to be against openssl-0.9.8i.
+
+2668. [func] Several improvements to dnssec-* tools, including:
+ - dnssec-keygen and dnssec-settime can now set key
+ metadata fields 0 (to unset a value, use "none")
+ - dnssec-revoke sets the revocation date in
+ addition to the revoke bit
+ - dnssec-settime can now print individual metadata
+ fields instead of always printing all of them,
+ and can print them in unix epoch time format for
+ use by scripts
+ [RT #19942]
+
+2667. [func] Add support for logging stack backtrace on assertion
+ failure (not available for all platforms). [RT #19780]
+
+2666. [func] Added an 'options' argument to dns_name_fromstring()
+ (API change from 9.7.0a2). [RT #20196]
+
+2665. [func] Clarify syntax for managed-keys {} statement, add
+ ARM documentation about RFC 5011 support. [RT #19874]
+
+2664. [bug] create_keydata() and minimal_update() in zone.c
+ didn't properly check return values for some
+ functions. [RT #19956]
+
2663. [func] win32: allow named to run as a service using
"NT AUTHORITY\LocalService" as the account. [RT #19977]
@@ -554,19 +1312,40 @@
2661. [bug] Check whether socket fd exceeds FD_SETSIZE when
creating lwres context. [RT #20029]
+2660. [func] Add a new set of DNS libraries for non-BIND9
+ applications. See README.libdns. [RT #19369]
+
2659. [doc] Clarify dnssec-keygen doc: key name must match zone
name for DNSSEC keys. [RT #19938]
+2658. [bug] dnssec-settime and dnssec-revoke didn't process
+ key file paths correctly. [RT #20078]
+
+2657. [cleanup] Lower "journal file <path> does not exist, creating it"
+ log level to debug 1. [RT #20058]
+
2656. [func] win32: add a "tools only" check box to the installer
which causes it to only install dig, host, nslookup,
nsupdate and relevant DLLs. [RT #19998]
2655. [doc] Document that key-directory does not affect
- rndc.key. [RT #20155]
+ bind.keys, rndc.key or session.key. [RT #20155]
+
+2654. [bug] Improve error reporting on duplicated names for
+ deny-answer-xxx. [RT #20164]
2653. [bug] Treat ENGINE_load_private_key() failures as key
not found rather than out of memory. [RT #18033]
+2652. [func] Provide more detail about what record is being
+ deleted. [RT #20061]
+
+2651. [bug] Dates could print incorrectly in K*.key files on
+ 64-bit systems. [RT #20076]
+
+2650. [bug] Assertion failure in dnssec-signzone when trying
+ to read keyset-* files. [RT #20075]
+
2649. [bug] Set the domain for forward only zones. [RT #19944]
2648. [port] win32: isc_time_seconds() was broken. [RT #19900]
@@ -579,37 +1358,99 @@
2645. [port] "gcc -m32" didn't work on amd64 and x86_64 platforms
which default to 64 bits. [RT #19927]
+ --- 9.7.0a2 released ---
+
+2644. [bug] Change #2628 caused a regression on some systems;
+ named was unable to write the PID file and would
+ fail on startup. [RT #20001]
+
2643. [bug] Stub zones interacted badly with NSEC3 support.
[RT #19777]
2642. [bug] nsupdate could dump core on solaris when reading
improperly formatted key files. [RT #20015]
+2641. [bug] Fixed an error in parsing update-policy syntax,
+ added a regression test to check it. [RT #20007]
+
2640. [security] A specially crafted update packet will cause named
to exit. [RT #20000]
2639. [bug] Silence compiler warnings in gssapi code. [RT #19954]
+2638. [bug] Install arpaname. [RT #19957]
+
2637. [func] Rationalize dnssec-signzone's signwithkey() calling.
[RT #19959]
+2636. [func] Simplify zone signing and key maintenance with the
+ dnssec-* tools. Major changes:
+ - all dnssec-* tools now take a -K option to
+ specify a directory in which key files will be
+ stored
+ - DNSSEC can now store metadata indicating when
+ they are scheduled to be published, activated,
+ revoked or removed; these values can be set by
+ dnssec-keygen or overwritten by the new
+ dnssec-settime command
+ - dnssec-signzone -S (for "smart") option reads key
+ metadata and uses it to determine automatically
+ which keys to publish to the zone, use for
+ signing, revoke, or remove from the zone
+ [RT #19816]
+
2635. [bug] isc_inet_ntop() incorrectly handled 0.0/16 addresses.
[RT #19716]
+2634. [port] win32: Add support for libxml2, enable
+ statschannel. [RT #19773]
+
2633. [bug] Handle 15 bit rand() functions. [RT #19783]
2632. [func] util/kit.sh: warn if documentation appears to be out of
date. [RT #19922]
+2631. [bug] Handle "//", "/./" and "/../" in mkdirpath().
+ [RT #19926 ]
+
+2630. [func] Improved syntax for DDNS autoconfiguration: use
+ "update-policy local;" to switch on local DDNS in a
+ zone. (The "ddns-autoconf" option has been removed.)
+ [RT #19875]
+
+2629. [port] Check for seteuid()/setegid(), use setresuid()/
+ setresgid() if not present. [RT #19932]
+
+2628. [port] linux: Allow /var/run/named/named.pid to be opened
+ at startup with reduced capabilities in operation.
+ [RT #19884]
+
+2627. [bug] Named aborted if the same key was included in
+ trusted-keys more than once. [RT #19918]
+
+2626. [bug] Multiple trusted-keys could trigger an assertion
+ failure. [RT #19914]
+
2625. [bug] Missing UNLOCK in rbtdb.c. [RT #19865]
-2623. [bug] Named started seaches for DS non-optimally. [RT #19915]
+2624. [func] 'named-checkconf -p' will print out the parsed
+ configuration. [RT #18871]
+
+2623. [bug] Named started searches for DS non-optimally. [RT #19915]
+
+2622. [bug] Printing of named.conf grammar was broken. [RT #19919]
-2621. [doc] Made copyright boilterplate consistent. [RT #19833]
+2621. [doc] Made copyright boilerplate consistent. [RT #19833]
2620. [bug] Delay thawing the zone until the reload of it has
completed successfully. [RT #19750]
+2619. [func] Add support for RFC 5011, automatic trust anchor
+ maintenance. The new "managed-keys" statement can
+ be used in place of "trusted-keys" for zones which
+ support this protocol. (Note: this syntax is
+ expected to change prior to 9.7.0 final.) [RT #19248]
+
2618. [bug] The sdb and sdlz db_interator_seek() methods could
loop infinitely. [RT #19847]
@@ -625,11 +1466,33 @@
2614. [port] win32: 'named -v' should automatically be executed
in the foreground. [RT #19844]
-2613. [bug] Option argument validation was missing for
- dnssec-dsfromkey. [RT #19828]
+2613. [placeholder]
+
+ --- 9.7.0a1 released ---
+
+2612. [func] Add default values for the arguments to
+ dnssec-keygen. Without arguments, it will now
+ generate a 1024-bit RSASHA1 zone-signing key,
+ or with the -f KSK option, a 2048-bit RSASHA1
+ key-signing key. [RT #19300]
+
+2611. [func] Add -l option to dnssec-dsfromkey to generate
+ DLV records instead of DS records. [RT #19300]
2610. [port] sunos: Change #2363 was not complete. [RT #19796]
+2609. [func] Simplify the configuration of dynamic zones:
+ - add ddns-confgen command to generate
+ configuration text for named.conf
+ - add zone option "ddns-autoconf yes;", which
+ causes named to generate a TSIG session key
+ and allow updates to the zone using that key
+ - add '-l' (localhost) option to nsupdate, which
+ causes nsupdate to connect to a locally-running
+ named process using the session key generated
+ by named
+ [RT #19284]
+
2608. [func] Perform post signing verification checks in
dnssec-signzone. These can be disabled with -P.
@@ -639,27 +1502,6 @@
self signed. That all records in the zone are signed
by the algorithm. [RT #19653]
-2601. [doc] Mention file creation mode mask in the
- named manual page.
-
-2593. [bug] Improve a corner source of SERVFAILs [RT #19632]
-
-2589. [bug] dns_db_unregister() failed to clear '*dbimp'.
- [RT #19626]
-
-2581. [contrib] dlz/mysql set MYSQL_OPT_RECONNECT option on connection.
- Requires MySQL 5.0.19 or later. [RT #19084]
-
-2580. [bug] UpdateRej statistics counter could be incremented twice
- for one rejection. [RT #19476]
-
-2533. [doc] ARM: document @ (at-sign). [RT #17144]
-
-2500. [contrib] contrib/sdb/pgsql/zonetodb.c called non-existent
- function. [RT #18582]
-
- --- 9.6.1 released ---
-
2607. [bug] named could incorrectly delete NSEC3 records for
empty nodes when processing a update request.
[RT #19749]
@@ -670,6 +1512,11 @@
2605. [bug] Accept DS responses from delegation only zones.
[RT # 19296]
+2604. [func] Add support for DNS rebinding attack prevention through
+ new options, deny-answer-addresses and
+ deny-answer-aliases. Based on contributed code from
+ JD Nurmi, Google. [RT #18192]
+
2603. [port] win32: handle .exe extension of named-checkzone and
named-comilezone argv[0] names under windows.
[RT #19767]
@@ -677,11 +1524,17 @@
2602. [port] win32: fix debugging command line build of libisccfg.
[RT #19767]
- --- 9.6.1rc1 released ---
+2601. [doc] Mention file creation mode mask in the
+ named manual page.
+
+2600. [doc] ARM: miscellaneous reformatting for different
+ page widths. [RT #19574]
2599. [bug] Address rapid memory growth when validation fails.
[RT #19654]
+2598. [func] Reserve the -F flag. [RT #19657]
+
2597. [bug] Handle a validation failure with a insecure delegation
from a NSEC3 signed master/slave zone. [RT #19464]
@@ -691,16 +1544,31 @@
2595. [bug] Fix unknown extended rcodes in dig. [RT #19625]
+2594. [func] Have rndc warn if using its default configuration
+ file when the key file also exists. [RT #19424]
+
+2593. [bug] Improve a corner source of SERVFAILs [RT #19632]
+
2592. [bug] Treat "any" as a type in nsupdate. [RT #19455]
2591. [bug] named could die when processing a update in
removed_orphaned_ds(). [RT #19507]
+2590. [func] Report zone/class of "update with no effect".
+ [RT #19542]
+
+2589. [bug] dns_db_unregister() failed to clear '*dbimp'.
+ [RT #19626]
+
2588. [bug] SO_REUSEADDR could be set unconditionally after failure
of bind(2) call. This should be rare and mostly
harmless, but may cause interference with other
processes that happen to use the same port. [RT #19642]
+2587. [func] Improve logging by reporting serial numbers for
+ when zone serial has gone backwards or unchanged.
+ [RT #19506]
+
2586. [bug] Missing cleanup of SIG rdataset in searching a DLZ DB
or SDB. [RT #19577]
@@ -717,28 +1585,57 @@
2582. [bug] Don't emit warning log message when we attempt to
remove non-existent journal. [RT #19516]
+2581. [contrib] dlz/mysql set MYSQL_OPT_RECONNECT option on connection.
+ Requires MySQL 5.0.19 or later. [RT #19084]
+
+2580. [bug] UpdateRej statistics counter could be incremented twice
+ for one rejection. [RT #19476]
+
2579. [bug] DNSSEC lookaside validation failed to handle unknown
algorithms. [RT #19479]
2578. [bug] Changed default sig-signing-type to 65534, because
65535 turns out to be reserved. [RT #19477]
-2499. [port] solaris: lib/lwres/getaddrinfo.c namespace clash.
- [RT #18837]
-
- --- 9.6.1b1 released ---
-
2577. [doc] Clarified some statistics counters. [RT #19454]
2576. [bug] NSEC record were not being correctly signed when
a zone transitions from insecure to secure.
Handle such incorrectly signed zones. [RT #19114]
+2575. [func] New functions dns_name_fromstring() and
+ dns_name_tostring(), to simplify conversion
+ of a string to a dns_name structure and vice
+ versa. [RT #19451]
+
2574. [doc] Document nsupdate -g and -o. [RT #19351]
2573. [bug] Replacing a non-CNAME record with a CNAME record in a
single transaction in a signed zone failed. [RT #19397]
+2572. [func] Simplify DLV configuration, with a new option
+ "dnssec-lookaside auto;" This is the equivalent
+ of "dnssec-lookaside . trust-anchor dlv.isc.org;"
+ plus setting a trusted-key for dlv.isc.org.
+
+ Note: The trusted key is hard-coded into named,
+ but is also stored in (and can be overridden
+ by) $sysconfdir/bind.keys. As the ISC DLV key
+ rolls over it can be kept up to date by replacing
+ the bind.keys file with a key downloaded from
+ https://www.isc.org/solutions/dlv. [RT #18685]
+
+2571. [func] Add a new tool "arpaname" which translates IP addresses
+ to the corresponding IN-ADDR.ARPA or IP6.ARPA name.
+ [RT #18976]
+
+2570. [func] Log the destination address the query was sent to.
+ [RT #19209]
+
+2569. [func] Move journalprint, nsec3hash, and genrandom
+ commands from bin/tests into bin/tools;
+ "make install" will put them in $sbindir. [RT #19301]
+
2568. [bug] Report when the write to indicate a otherwise
successful start fails. [RT #19360]
@@ -747,6 +1644,15 @@
dnssec-dsfromkey could miss write errors.
[RT #19360]
+2566. [cleanup] Clarify logged message when an insecure DNSSEC
+ response arrives from a zone thought to be secure:
+ "insecurity proof failed" instead of "not
+ insecure". [RT #19400]
+
+2565. [func] Add support for HIP record. Includes new functions
+ dns_rdata_hip_first(), dns_rdata_hip_next()
+ and dns_rdata_hip_current(). [RT #19384]
+
2564. [bug] Only take EDNS fallback steps when processing timeouts.
[RT #19405]
@@ -763,6 +1669,10 @@
2559. [bug] dnssec-dsfromkey could compute bad DS records when
reading from a K* files. [RT #19357]
+2558. [func] Set the ownership of missing directories created
+ for pid-file if -u has been specified on the command
+ line. [RT #19328]
+
2557. [cleanup] PCI compliance:
* new libisc log module file
* isc_dir_chroot() now also changes the working
@@ -774,6 +1684,9 @@
error checks in the correct order resulting in the
wrong error code sometimes being returned. [RT #19249]
+2555. [func] dig: when emitting a hex dump also display the
+ corresponding characters. [RT #19258]
+
2554. [bug] Validation of uppercase queries from NSEC3 zones could
fail. [RT #19297]
@@ -797,6 +1710,10 @@
function isc_mem_reallocate() was introduced to address
this bug. [RT #19313]
+2546. [func] Add --enable-openssl-hash configure flag to use
+ OpenSSL (in place of internal routine) for hash
+ functions (MD5, SHA[12] and HMAC). [RT #18815]
+
2545. [doc] ARM: Legal hostname checking (check-names) is
for SRV RDATA too. [RT #19304]
@@ -809,6 +1726,8 @@
2541. [bug] Conditionally update dispatch manager statistics.
[RT #19247]
+2540. [func] Add a nibble mode to $GENERATE. [RT #18872]
+
2539. [security] Update the interaction between recursion, allow-query,
allow-query-cache and allow-recursion. [RT #19198]
@@ -816,7 +1735,7 @@
especially with threads and smaller max-cache-size
values. [RT #19240]
-2537. [experimental] Added more statistics counters including those on socket
+2537. [func] Added more statistics counters including those on socket
I/O events and query RTT histograms. [RT #18802]
2536. [cleanup] Silence some warnings when -Werror=format-security is
@@ -824,6 +1743,12 @@
2535. [bug] dig +showsearch and +trace interacted badly. [RT #19091]
+2534. [func] Check NAPTR records regular expressions and
+ replacement strings to ensure they are syntactically
+ valid and consistant. [RT #18168]
+
+2533. [doc] ARM: document @ (at-sign). [RT #17144]
+
2532. [bug] dig: check the question section of the response to
see if it matches the asked question. [RT #18495]
@@ -838,10 +1763,14 @@
2528. [cleanup] Silence spurious configure warning about
--datarootdir [RT #19096]
-2527. [bug] named could reuse cache on reload with
- enabling/disabling validation. [RT #19119]
+2527. [placeholder]
-2525. [experimental] New logging category "query-errors" to provide detailed
+2526. [func] New named option "attach-cache" that allows multiple
+ views to share a single cache to save memory and
+ improve lookup efficiency. Based on contributed code
+ from Barclay Osborn, Google. [RT #18905]
+
+2525. [func] New logging category "query-errors" to provide detailed
internal information about query failures, especially
about server failures. [RT #19027]
@@ -854,10 +1783,17 @@
2521. [bug] Improve epoll cross compilation support. [RT #19047]
+2520. [bug] Update xml statistics version number to 2.0 as change
+ #2388 made the schema incompatible to the previous
+ version. [RT #19080]
+
2519. [bug] dig/host with -4 or -6 didn't work if more than two
nameserver addresses of the excluded address family
preceded in resolv.conf. [RT #19081]
+2518. [func] Add support for the new CERT types from RFC 4398.
+ [RT #19077]
+
2517. [bug] dig +trace with -4 or -6 failed when it chose a
nameserver address of the excluded address type.
[RT #18843]
@@ -865,45 +1801,56 @@
2516. [bug] glue sort for responses was performed even when not
needed. [RT #19039]
+2515. [port] win32: build dnssec-dsfromkey and dnssec-keyfromlabel.
+ [RT #19063]
+
2514. [bug] dig/host failed with -4 or -6 when resolv.conf contains
a nameserver of the excluded address family.
[RT #18848]
+2513. [bug] Fix windows cli build. [RT #19062]
+
+2512. [func] Print a summary of the cached records which make up
+ the negative response. [RT #18885]
+
2511. [cleanup] dns_rdata_tofmttext() add const to linebreak.
[RT #18885]
+2510. [bug] "dig +sigchase" could trigger REQUIRE failures.
+ [RT #19033]
+
+2509. [bug] Specifying a fixed query source port was broken.
+ [RT #19051]
+
+2508. [placeholder]
+
+2507. [func] Log the recursion quota values when killing the
+ oldest query or refusing to recurse due to quota.
+ [RT #19022]
+
2506. [port] solaris: Check at configure time if
hack_shutup_pthreadonceinit is needed. [RT #19037]
2505. [port] Treat amd64 similarly to x86_64 when determining
atomic operation support. [RT #19031]
+2504. [bug] Address race condition in the socket code. [RT #18899]
+
2503. [port] linux: improve compatibility with Linux Standard
Base. [RT #18793]
2502. [cleanup] isc_radix: Improve compliance with coding style,
document function in <isc/radix.h>. [RT #18534]
- --- 9.6.0 released ---
-
-2520. [bug] Update xml statistics version number to 2.0 as change
- #2388 made the schema incompatible to the previous
- version. [RT #19080]
-
- --- 9.6.0rc2 released ---
-
-2515. [port] win32: build dnssec-dsfromkey and dnssec-keyfromlabel.
- [RT #19063]
-
-2513. [bug] Fix windows cli build. [RT #19062]
-
-2510. [bug] "dig +sigchase" could trigger REQUIRE failures.
- [RT #19033]
+2501. [func] $GENERATE now supports all rdata types. Multi-field
+ rdata types need to be quoted. See the ARM for
+ details. [RT #18368]
-2509. [bug] Specifying a fixed query source port was broken.
- [RT #19051]
+2500. [contrib] contrib/sdb/pgsql/zonetodb.c called non-existent
+ function. [RT #18582]
-2504. [bug] Address race condition in the socket code. [RT #18899]
+2499. [port] solaris: lib/lwres/getaddrinfo.c namespace clash.
+ [RT #18837]
--- 9.6.0rc1 released ---
diff --git a/contrib/bind9/COPYRIGHT b/contrib/bind9/COPYRIGHT
index ee90ece..8721cec 100644
--- a/contrib/bind9/COPYRIGHT
+++ b/contrib/bind9/COPYRIGHT
@@ -13,7 +13,7 @@ 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.
-$Id: COPYRIGHT,v 1.14.176.3 2011-01-04 23:45:42 tbox Exp $
+$Id: COPYRIGHT,v 1.17 2011-01-04 23:47:13 tbox Exp $
Portions Copyright (C) 1996-2001 Nominum, Inc.
diff --git a/contrib/bind9/FAQ.xml b/contrib/bind9/FAQ.xml
index a9b2b41..4c83f76 100644
--- a/contrib/bind9/FAQ.xml
+++ b/contrib/bind9/FAQ.xml
@@ -17,7 +17,7 @@
- PERFORMANCE OF THIS SOFTWARE.
-->
-<!-- $Id: FAQ.xml,v 1.46.56.9 2010-01-20 23:47:43 tbox Exp $ -->
+<!-- $Id: FAQ.xml,v 1.54 2010-01-19 23:48:55 tbox Exp $ -->
<article class="faq">
<title>Frequently Asked Questions about BIND 9</title>
diff --git a/contrib/bind9/HISTORY b/contrib/bind9/HISTORY
new file mode 100644
index 0000000..e98f9b4
--- /dev/null
+++ b/contrib/bind9/HISTORY
@@ -0,0 +1,313 @@
+Summary of functional enhancements from prior major releases of BIND 9:
+
+BIND 9.6.0
+
+ Full NSEC3 support
+
+ Automatic zone re-signing
+
+ New update-policy methods tcp-self and 6to4-self
+
+ The BIND 8 resolver library, libbind, has been removed from the
+ BIND 9 distribution and is now available as a separate download.
+
+ Change the default pid file location from /var/run to
+ /var/run/{named,lwresd} for improved chroot/setuid support.
+
+BIND 9.5.0
+
+ GSS-TSIG support (RFC 3645).
+
+ DHCID support.
+
+ Experimental http server and statistics support for named via xml.
+
+ More detailed statistics counters including those supported in BIND 8.
+
+ Faster ACL processing.
+
+ Use Doxygen to generate internal documentation.
+
+ Efficient LRU cache-cleaning mechanism.
+
+ NSID support.
+
+BIND 9.4.0
+
+ Implemented "additional section caching (or acache)", an
+ internal cache framework for additional section content to
+ improve response performance. Several configuration options
+ were provided to control the behavior.
+
+ New notify type 'master-only'. Enable notify for master
+ zones only.
+
+ Accept 'notify-source' style syntax for query-source.
+
+ rndc now allows addresses to be set in the server clauses.
+
+ New option "allow-query-cache". This lets "allow-query"
+ be used to specify the default zone access level rather
+ than having to have every zone override the global value.
+ "allow-query-cache" can be set at both the options and view
+ levels. If "allow-query-cache" is not set then "allow-recursion"
+ is used if set, otherwise "allow-query" is used if set
+ unless "recursion no;" is set in which case "none;" is used,
+ otherwise the default (localhost; localnets;) is used.
+
+ rndc: the source address can now be specified.
+
+ ixfr-from-differences now takes master and slave in addition
+ to yes and no at the options and view levels.
+
+ Allow the journal's name to be changed via named.conf.
+
+ 'rndc notify zone [class [view]]' resend the NOTIFY messages
+ for the specified zone.
+
+ 'dig +trace' now randomly selects the next servers to try.
+ Report if there is a bad delegation.
+
+ Improve check-names error messages.
+
+ Make public the function to read a key file, dst_key_read_public().
+
+ dig now returns the byte count for axfr/ixfr.
+
+ allow-update is now settable at the options / view level.
+
+ named-checkconf now checks the logging configuration.
+
+ host now can turn on memory debugging flags with '-m'.
+
+ Don't send notify messages to self.
+
+ Perform sanity checks on NS records which refer to 'in zone' names.
+
+ New zone option "notify-delay". Specify a minimum delay
+ between sets of NOTIFY messages.
+
+ Extend adjusting TTL warning messages.
+
+ Named and named-checkzone can now both check for non-terminal
+ wildcard records.
+
+ "rndc freeze/thaw" now freezes/thaws all zones.
+
+ named-checkconf now check acls to verify that they only
+ refer to existing acls.
+
+ The server syntax has been extended to support a range of
+ servers.
+
+ Report differences between hints and real NS rrset and
+ associated address records.
+
+ Preserve the case of domain names in rdata during zone
+ transfers.
+
+ Restructured the data locking framework using architecture
+ dependent atomic operations (when available), improving
+ response performance on multi-processor machines significantly.
+ x86, x86_64, alpha, powerpc, and mips are currently supported.
+
+ UNIX domain controls are now supported.
+
+ Add support for additional zone file formats for improving
+ loading performance. The masterfile-format option in
+ named.conf can be used to specify a non-default format. A
+ separate command named-compilezone was provided to generate
+ zone files in the new format. Additionally, the -I and -O
+ options for dnssec-signzone specify the input and output
+ formats.
+
+ dnssec-signzone can now randomize signature end times
+ (dnssec-signzone -j jitter).
+
+ Add support for CH A record.
+
+ Add additional zone data constancy checks. named-checkzone
+ has extended checking of NS, MX and SRV record and the hosts
+ they reference. named has extended post zone load checks.
+ New zone options: check-mx and integrity-check.
+
+
+ edns-udp-size can now be overridden on a per server basis.
+
+ dig can now specify the EDNS version when making a query.
+
+ Added framework for handling multiple EDNS versions.
+
+ Additional memory debugging support to track size and mctx
+ arguments.
+
+ Detect duplicates of UDP queries we are recursing on and
+ drop them. New stats category "duplicates".
+
+ "USE INTERNAL MALLOC" is now runtime selectable.
+
+ The lame cache is now done on a <qname,qclass,qtype> basis
+ as some servers only appear to be lame for certain query
+ types.
+
+ Limit the number of recursive clients that can be waiting
+ for a single query (<qname,qtype,qclass>) to resolve. New
+ options clients-per-query and max-clients-per-query.
+
+ dig: report the number of extra bytes still left in the
+ packet after processing all the records.
+
+ Support for IPSECKEY rdata type.
+
+ Raise the UDP recieve buffer size to 32k if it is less than 32k.
+
+ x86 and x86_64 now have seperate atomic locking implementations.
+
+ named-checkconf now validates update-policy entries.
+
+ Attempt to make the amount of work performed in a iteration
+ self tuning. The covers nodes clean from the cache per
+ iteration, nodes written to disk when rewriting a master
+ file and nodes destroyed per iteration when destroying a
+ zone or a cache.
+
+ ISC string copy API.
+
+ Automatic empty zone creation for D.F.IP6.ARPA and friends.
+ Note: RFC 1918 zones are not yet covered by this but are
+ likely to be in a future release.
+
+ New options: empty-server, empty-contact, empty-zones-enable
+ and disable-empty-zone.
+
+ dig now has a '-q queryname' and '+showsearch' options.
+
+ host/nslookup now continue (default)/fail on SERVFAIL.
+
+ dig now warns if 'RA' is not set in the answer when 'RD'
+ was set in the query. host/nslookup skip servers that fail
+ to set 'RA' when 'RD' is set unless a server is explicitly
+ set.
+
+ Integrate contibuted DLZ code into named.
+
+ Integrate contibuted IDN code from JPNIC.
+
+ libbind: corresponds to that from BIND 8.4.7.
+
+BIND 9.3.0
+
+ DNSSEC is now DS based (RFC 3658).
+ See also RFC 3845, doc/draft/draft-ietf-dnsext-dnssec-*.
+
+ DNSSEC lookaside validation.
+
+ check-names is now implemented.
+ rrset-order in more complete.
+
+ IPv4/IPv6 transition support, dual-stack-servers.
+
+ IXFR deltas can now be generated when loading master files,
+ ixfr-from-differences.
+
+ It is now possible to specify the size of a journal, max-journal-size.
+
+ It is now possible to define a named set of master servers to be
+ used in masters clause, masters.
+
+ The advertised EDNS UDP size can now be set, edns-udp-size.
+
+ allow-v6-synthesis has been obsoleted.
+
+ NOTE:
+ * Zones containing MD and MF will now be rejected.
+ * dig, nslookup name. now report "Not Implemented" as
+ NOTIMP rather than NOTIMPL. This will have impact on scripts
+ that are looking for NOTIMPL.
+
+ libbind: corresponds to that from BIND 8.4.5.
+
+BIND 9.2.0
+
+ The size of the cache can now be limited using the
+ "max-cache-size" option.
+
+ The server can now automatically convert RFC1886-style recursive
+ lookup requests into RFC2874-style lookups, when enabled using the
+ new option "allow-v6-synthesis". This allows stub resolvers that
+ support AAAA records but not A6 record chains or binary labels to
+ perform lookups in domains that make use of these IPv6 DNS
+ features.
+
+ Performance has been improved.
+
+ The man pages now use the more portable "man" macros rather than
+ the "mandoc" macros, and are installed by "make install".
+
+ The named.conf parser has been completely rewritten. It now
+ supports "include" directives in more places such as inside "view"
+ statements, and it no longer has any reserved words.
+
+ The "rndc status" command is now implemented.
+
+ rndc can now be configured automatically.
+
+ A BIND 8 compatible stub resolver library is now included in
+ lib/bind.
+
+ OpenSSL has been removed from the distribution. This means that to
+ use DNSSEC, OpenSSL must be installed and the --with-openssl option
+ must be supplied to configure. This does not apply to the use of
+ TSIG, which does not require OpenSSL.
+
+ The source distribution now builds on Windows. See
+ win32utils/readme1.txt and win32utils/win32-build.txt for details.
+
+ This distribution also includes a new lightweight stub
+ resolver library and associated resolver daemon that fully
+ support forward and reverse lookups of both IPv4 and IPv6
+ addresses. This library is considered experimental and
+ is not a complete replacement for the BIND 8 resolver library.
+ Applications that use the BIND 8 res_* functions to perform
+ DNS lookups or dynamic updates still need to be linked against
+ the BIND 8 libraries. For DNS lookups, they can also use the
+ new "getrrsetbyname()" API.
+
+ BIND 9.2 is capable of acting as an authoritative server
+ for DNSSEC secured zones. This functionality is believed to
+ be stable and complete except for lacking support for
+ verifications involving wildcard records in secure zones.
+
+ When acting as a caching server, BIND 9.2 can be configured
+ to perform DNSSEC secure resolution on behalf of its clients.
+ This part of the DNSSEC implementation is still considered
+ experimental. For detailed information about the state of the
+ DNSSEC implementation, see the file doc/misc/dnssec.
+
+ There are a few known bugs:
+
+ On some systems, IPv6 and IPv4 sockets interact in
+ unexpected ways. For details, see doc/misc/ipv6.
+ To reduce the impact of these problems, the server
+ no longer listens for requests on IPv6 addresses
+ by default. If you need to accept DNS queries over
+ IPv6, you must specify "listen-on-v6 { any; };"
+ in the named.conf options statement.
+
+ FreeBSD prior to 4.2 (and 4.2 if running as non-root)
+ and OpenBSD prior to 2.8 log messages like
+ "fcntl(8, F_SETFL, 4): Inappropriate ioctl for device".
+ This is due to a bug in "/dev/random" and impacts the
+ server's DNSSEC support.
+
+ OS X 10.1.4 (Darwin 5.4), OS X 10.1.5 (Darwin 5.5) and
+ OS X 10.2 (Darwin 6.0) reports errors like
+ "fcntl(3, F_SETFL, 4): Operation not supported by device".
+ This is due to a bug in "/dev/random" and impacts the
+ server's DNSSEC support.
+
+ --with-libtool does not work on AIX.
+
+ A bug in some versions of the Microsoft DNS server can cause zone
+ transfers from a BIND 9 server to a W2K server to fail. For details,
+ see the "Zone Transfers" section in doc/misc/migration.
diff --git a/contrib/bind9/KNOWN-DEFECTS b/contrib/bind9/KNOWN-DEFECTS
deleted file mode 100644
index 83d7175..0000000
--- a/contrib/bind9/KNOWN-DEFECTS
+++ /dev/null
@@ -1,15 +0,0 @@
-dnssec-signzone was designed so that it could sign a zone partially, using
-only a subset of the DNSSEC keys needed to produce a fully-signed zone.
-This permits a zone administrator, for example, to sign a zone with one
-key on one machine, move the resulting partially-signed zone to a second
-machine, and sign it again with a second key.
-
-An unfortunate side-effect of this flexibility is that dnssec-signzone
-does not check to make sure it's signing a zone with any valid keys at
-all. An attempt to sign a zone without any keys will appear to succeed,
-producing a "signed" zone with no signatures. There is no warning issued
-when a zone is not signed.
-
-This will be corrected in a future release. In the meantime, ISC
-recommends examining the output of dnssec-signzone to confirm that
-the zone is properly signed by all keys before using it.
diff --git a/contrib/bind9/Makefile.in b/contrib/bind9/Makefile.in
index e4d5639..95944d9 100644
--- a/contrib/bind9/Makefile.in
+++ b/contrib/bind9/Makefile.in
@@ -13,7 +13,7 @@
# OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
# PERFORMANCE OF THIS SOFTWARE.
-# $Id: Makefile.in,v 1.52.48.2 2009-02-20 23:47:23 tbox Exp $
+# $Id: Makefile.in,v 1.58 2009-11-26 20:52:44 marka Exp $
srcdir = @srcdir@
VPATH = @srcdir@
@@ -21,13 +21,13 @@ top_srcdir = @top_srcdir@
@BIND9_VERSION@
-SUBDIRS = make lib bin doc
+SUBDIRS = make lib bin doc @LIBEXPORT@
TARGETS =
MANPAGES = isc-config.sh.1
-
+
HTMLPAGES = isc-config.sh.html
-
+
MANOBJS = ${MANPAGES} ${HTMLPAGES}
@BIND9_MAKE_RULES@
@@ -54,7 +54,8 @@ installdirs:
install:: isc-config.sh installdirs
${INSTALL_SCRIPT} isc-config.sh ${DESTDIR}${bindir}
- ${INSTALL_DATA} ${srcdir}/isc-config.sh.1 ${DESTDIR}${mandir}/man1
+ ${INSTALL_DATA} ${top_srcdir}/isc-config.sh.1 ${DESTDIR}${mandir}/man1
+ ${INSTALL_DATA} ${top_srcdir}/bind.keys ${DESTDIR}${sysconfdir}
tags:
rm -f TAGS
diff --git a/contrib/bind9/NSEC3-NOTES b/contrib/bind9/NSEC3-NOTES
deleted file mode 100644
index 3f8d8f9..0000000
--- a/contrib/bind9/NSEC3-NOTES
+++ /dev/null
@@ -1,128 +0,0 @@
-
- DNSSEC and UPDATE
-
- Converting from insecure to secure
-
-As of BIND 9.6.0 it is possible to move a zone between being insecure
-to secure and back again. A secure zone can be using NSEC or NSEC3.
-
-To move a zone from insecure to secure you need to configure named
-so that it can see the K* files which contain the public and private
-parts of the keys that will be used to sign the zone. These files
-will have been generated by dnssec-keygen. You can do this by
-placing them in the key-directory as specified in named.conf.
-
- zone example.net {
- type master;
- allow-update { .... };
- file "dynamic/example.net/example.net";
- key-directory "dynamic/example.net";
- };
-
-Assuming one KSK and one ZSK DNSKEY key have been generated. Then
-this will cause the zone to be signed with the ZSK and the DNSKEY
-RRset to be signed with the KSK DNSKEY. A NSEC chain will also be
-generated as part of the initial signing process.
-
- % nsupdate
- > ttl 3600
- > update add example.net DNSKEY 256 3 7 AwEAAZn17pUF0KpbPA2c7Gz76Vb18v0teKT3EyAGfBfL8eQ8al35zz3Y I1m/SAQBxIqMfLtIwqWPdgthsu36azGQAX8=
- > update add example.net DNSKEY 257 3 7 AwEAAd/7odU/64o2LGsifbLtQmtO8dFDtTAZXSX2+X3e/UNlq9IHq3Y0 XtC0Iuawl/qkaKVxXe2lo8Ct+dM6UehyCqk=
- > send
-
-While the update request will complete almost immediately the zone
-will not be completely signed until named has had time to walk the
-zone and generate the NSEC and RRSIG records. Initially the NSEC
-record at the zone apex will have the OPT bit set. When the NSEC
-chain is complete the OPT bit will be cleared. Additionally when
-the zone is fully signed the private type (default TYPE65534) records
-will have a non zero value for the final octet.
-
-The private type record has 5 octets.
- algorithm (octet 1)
- key id in network order (octet 2 and 3)
- removal flag (octet 4)
- complete flag (octet 5)
-
-If you wish to go straight to a secure zone using NSEC3 you should
-also add a NSEC3PARAM record to the update request with the flags
-field set to indicate whether the NSEC3 chain will have the OPTOUT
-bit set or not.
-
- % nsupdate
- > ttl 3600
- > update add example.net DNSKEY 256 3 7 AwEAAZn17pUF0KpbPA2c7Gz76Vb18v0teKT3EyAGfBfL8eQ8al35zz3Y I1m/SAQBxIqMfLtIwqWPdgthsu36azGQAX8=
- > update add example.net DNSKEY 257 3 7 AwEAAd/7odU/64o2LGsifbLtQmtO8dFDtTAZXSX2+X3e/UNlq9IHq3Y0 XtC0Iuawl/qkaKVxXe2lo8Ct+dM6UehyCqk=
- > update add example.net NSEC3PARAM 1 1 100 1234567890
- > send
-
-Again the update request will complete almost immediately however the
-NSEC3PARAM record will have additional flag bits set indicating that the
-NSEC3 chain is under construction. When the NSEC3 chain is complete the
-flags field will be set to zero.
-
-While the initial signing and NSEC/NSEC3 chain generation is happening
-other updates are possible.
-
- DNSKEY roll overs via UPDATE
-
-It is possible to perform key rollovers via update. You need to
-add the K* files for the new keys so that named can find them. You
-can then add the new DNSKEY RRs via update. Named will then cause
-the zone to be signed with the new keys. When the signing is
-complete the private type records will be updated so that the last
-octet is non zero.
-
-If this is for a KSK you need to inform the parent and any trust
-anchor repositories of the new KSK.
-
-You should then wait for the maximum TLL in the zone before removing the
-old DNSKEY. If it is a KSK that is being updated you also need to wait
-for the DS RRset in the parent to be updated and its TTL to expire.
-This ensures that all clients will be able to verify at least a signature
-when you remove the old DNSKEY.
-
-The old DNSKEY can be removed via UPDATE. Take care to specify
-the correct key. Named will clean out any signatures generated by
-the old key after the update completes.
-
- NSEC3PARAM rollovers via UPDATE.
-
-Add the new NSEC3PARAM record via update. When the new NSEC3 chain
-has been generated the NSEC3PARAM flag field will be zero. At this
-point you can remove the old NSEC3PARAM record. The old chain will
-be removed after the update request completes.
-
- Converting from NSEC to NSEC3
-
-To do this you just need to add a NSEC3PARAM record. When the
-conversion is complete the NSEC chain will have been removed and
-the NSEC3PARAM record will have a zero flag field. The NSEC3 chain
-will be generated before the NSEC chain is destroyed.
-
- Converting from NSEC3 to NSEC
-
-To do this remove all NSEC3PARAM records with a zero flag field. The
-NSEC chain will be generated before the NSEC3 chain is removed.
-
- Converting from secure to insecure
-
-To do this remove all the DNSKEY records. Any NSEC or NSEC3 chains
-will be removed as well as associated NSEC3PARAM records. This will
-take place after the update requests completes.
-
- Periodic re-signing.
-
-Named will periodically re-sign RRsets which have not been re-signed
-as a result of some update action. The signature lifetimes will
-be adjusted so as to spread the re-sign load over time rather than
-all at once.
-
- NSEC3 and OPTOUT
-
-Named only supports creating new NSEC3 chains where all the NSEC3
-records in the zone have the same OPTOUT state. Named supports
-UPDATES to zones where the NSEC3 records in the chain have mixed
-OPTOUT state. Named does not support changing the OPTOUT state of
-an individual NSEC3 record, the entire chain needs to be changed if
-the OPTOUT state of an individual NSEC3 needs to be changed.
diff --git a/contrib/bind9/README b/contrib/bind9/README
index 54d90fe..00010c3 100644
--- a/contrib/bind9/README
+++ b/contrib/bind9/README
@@ -42,368 +42,95 @@ BIND 9
Stichting NLnet - NLnet Foundation
Nominum, Inc.
-BIND 9.6.3
-
- BIND 9.6.3 is a maintenance release, fixing bugs in 9.6.2.
-
-BIND 9.6.2
-
- BIND 9.6.2 is a maintenance release, fixing bugs in 9.6.1.
- It also introduces support for the SHA-2 DNSSEC algorithms,
- RSASHA256 and RSASHA512.
-
- Known issues in this release:
-
- - A validating resolver that has been incorrectly configured with
- an invalid trust anchor will be unable to resolve names covered
- by that trust anchor. In all current versions of BIND 9, such a
- resolver will also generate significant unnecessary DNS traffic
- while trying to validate. The latter problem will be addressed
- in future BIND 9 releases. In the meantime, to avoid these
- problems, exercise caution when configuring "trusted-keys":
- make sure all keys are correct and current when you add them,
- and update your configuration in a timely manner when keys
- roll over.
-
-BIND 9.6.1
-
- BIND 9.6.1 is a maintenance release, fixing bugs in 9.6.0.
-
-BIND 9.6.0
-
- BIND 9.6.0 includes a number of changes from BIND 9.5 and earlier
- releases, including:
-
- Full NSEC3 support
-
- Automatic zone re-signing
-
- New update-policy methods tcp-self and 6to4-self
-
- The BIND 8 resolver library, libbind, has been removed from the
- BIND 9 distribution and is now available as a separate download.
-
- Change the default pid file location from /var/run to
- /var/run/{named,lwresd} for improved chroot/setuid support.
-
-BIND 9.5.0
-
- BIND 9.5.0 has a number of new features over 9.4,
- including:
-
- GSS-TSIG support (RFC 3645).
-
- DHCID support.
-
- Experimental http server and statistics support for named via xml.
-
- More detailed statistics counters including those supported in BIND 8.
-
- Faster ACL processing.
-
- Use Doxygen to generate internal documentation.
-
- Efficient LRU cache-cleaning mechanism.
-
- NSID support.
-
-BIND 9.4.0
-
- BIND 9.4.0 has a number of new features over 9.3,
- including:
-
- Implemented "additional section caching (or acache)", an
- internal cache framework for additional section content to
- improve response performance. Several configuration options
- were provided to control the behavior.
-
- New notify type 'master-only'. Enable notify for master
- zones only.
-
- Accept 'notify-source' style syntax for query-source.
-
- rndc now allows addresses to be set in the server clauses.
-
- New option "allow-query-cache". This lets "allow-query"
- be used to specify the default zone access level rather
- than having to have every zone override the global value.
- "allow-query-cache" can be set at both the options and view
- levels. If "allow-query-cache" is not set then "allow-recursion"
- is used if set, otherwise "allow-query" is used if set
- unless "recursion no;" is set in which case "none;" is used,
- otherwise the default (localhost; localnets;) is used.
-
- rndc: the source address can now be specified.
-
- ixfr-from-differences now takes master and slave in addition
- to yes and no at the options and view levels.
-
- Allow the journal's name to be changed via named.conf.
-
- 'rndc notify zone [class [view]]' resend the NOTIFY messages
- for the specified zone.
-
- 'dig +trace' now randomly selects the next servers to try.
- Report if there is a bad delegation.
-
- Improve check-names error messages.
-
- Make public the function to read a key file, dst_key_read_public().
-
- dig now returns the byte count for axfr/ixfr.
-
- allow-update is now settable at the options / view level.
-
- named-checkconf now checks the logging configuration.
-
- host now can turn on memory debugging flags with '-m'.
-
- Don't send notify messages to self.
-
- Perform sanity checks on NS records which refer to 'in zone' names.
-
- New zone option "notify-delay". Specify a minimum delay
- between sets of NOTIFY messages.
-
- Extend adjusting TTL warning messages.
-
- Named and named-checkzone can now both check for non-terminal
- wildcard records.
-
- "rndc freeze/thaw" now freezes/thaws all zones.
-
- named-checkconf now check acls to verify that they only
- refer to existing acls.
-
- The server syntax has been extended to support a range of
- servers.
-
- Report differences between hints and real NS rrset and
- associated address records.
-
- Preserve the case of domain names in rdata during zone
- transfers.
-
- Restructured the data locking framework using architecture
- dependent atomic operations (when available), improving
- response performance on multi-processor machines significantly.
- x86, x86_64, alpha, powerpc, and mips are currently supported.
-
- UNIX domain controls are now supported.
-
- Add support for additional zone file formats for improving
- loading performance. The masterfile-format option in
- named.conf can be used to specify a non-default format. A
- separate command named-compilezone was provided to generate
- zone files in the new format. Additionally, the -I and -O
- options for dnssec-signzone specify the input and output
- formats.
-
- dnssec-signzone can now randomize signature end times
- (dnssec-signzone -j jitter).
-
- Add support for CH A record.
-
- Add additional zone data constancy checks. named-checkzone
- has extended checking of NS, MX and SRV record and the hosts
- they reference. named has extended post zone load checks.
- New zone options: check-mx and integrity-check.
-
-
- edns-udp-size can now be overridden on a per server basis.
-
- dig can now specify the EDNS version when making a query.
-
- Added framework for handling multiple EDNS versions.
-
- Additional memory debugging support to track size and mctx
- arguments.
-
- Detect duplicates of UDP queries we are recursing on and
- drop them. New stats category "duplicates".
-
- "USE INTERNAL MALLOC" is now runtime selectable.
-
- The lame cache is now done on a <qname,qclass,qtype> basis
- as some servers only appear to be lame for certain query
- types.
-
- Limit the number of recursive clients that can be waiting
- for a single query (<qname,qtype,qclass>) to resolve. New
- options clients-per-query and max-clients-per-query.
-
- dig: report the number of extra bytes still left in the
- packet after processing all the records.
-
- Support for IPSECKEY rdata type.
-
- Raise the UDP recieve buffer size to 32k if it is less than 32k.
-
- x86 and x86_64 now have seperate atomic locking implementations.
-
- named-checkconf now validates update-policy entries.
-
- Attempt to make the amount of work performed in a iteration
- self tuning. The covers nodes clean from the cache per
- iteration, nodes written to disk when rewriting a master
- file and nodes destroyed per iteration when destroying a
- zone or a cache.
-
- ISC string copy API.
-
- Automatic empty zone creation for D.F.IP6.ARPA and friends.
- Note: RFC 1918 zones are not yet covered by this but are
- likely to be in a future release.
-
- New options: empty-server, empty-contact, empty-zones-enable
- and disable-empty-zone.
-
- dig now has a '-q queryname' and '+showsearch' options.
-
- host/nslookup now continue (default)/fail on SERVFAIL.
-
- dig now warns if 'RA' is not set in the answer when 'RD'
- was set in the query. host/nslookup skip servers that fail
- to set 'RA' when 'RD' is set unless a server is explicitly
- set.
-
- Integrate contibuted DLZ code into named.
-
- Integrate contibuted IDN code from JPNIC.
-
- libbind: corresponds to that from BIND 8.4.7.
-
-BIND 9.3.0
-
- BIND 9.3.0 has a number of new features over 9.2,
- including:
-
- DNSSEC is now DS based (RFC 3658).
- See also RFC 3845, doc/draft/draft-ietf-dnsext-dnssec-*.
-
- DNSSEC lookaside validation.
-
- check-names is now implemented.
- rrset-order in more complete.
-
- IPv4/IPv6 transition support, dual-stack-servers.
-
- IXFR deltas can now be generated when loading master files,
- ixfr-from-differences.
-
- It is now possible to specify the size of a journal, max-journal-size.
-
- It is now possible to define a named set of master servers to be
- used in masters clause, masters.
-
- The advertised EDNS UDP size can now be set, edns-udp-size.
-
- allow-v6-synthesis has been obsoleted.
-
- NOTE:
- * Zones containing MD and MF will now be rejected.
- * dig, nslookup name. now report "Not Implemented" as
- NOTIMP rather than NOTIMPL. This will have impact on scripts
- that are looking for NOTIMPL.
-
- libbind: corresponds to that from BIND 8.4.5.
-
-BIND 9.2.0
-
- BIND 9.2.0 has a number of new features over 9.1,
- including:
-
- - The size of the cache can now be limited using the
- "max-cache-size" option.
-
- - The server can now automatically convert RFC1886-style
- recursive lookup requests into RFC2874-style lookups,
- when enabled using the new option "allow-v6-synthesis".
- This allows stub resolvers that support AAAA records
- but not A6 record chains or binary labels to perform
- lookups in domains that make use of these IPv6 DNS
- features.
-
- - Performance has been improved.
-
- - The man pages now use the more portable "man" macros
- rather than the "mandoc" macros, and are installed
- by "make install".
-
- - The named.conf parser has been completely rewritten.
- It now supports "include" directives in more
- places such as inside "view" statements, and it no
- longer has any reserved words.
-
- - The "rndc status" command is now implemented.
-
- - rndc can now be configured automatically.
-
- - A BIND 8 compatible stub resolver library is now
- included in lib/bind.
-
- - OpenSSL has been removed from the distribution. This
- means that to use DNSSEC, OpenSSL must be installed and
- the --with-openssl option must be supplied to configure.
- This does not apply to the use of TSIG, which does not
- require OpenSSL.
-
- - The source distribution now builds on Windows.
- See win32utils/readme1.txt and win32utils/win32-build.txt
- for details.
-
- This distribution also includes a new lightweight stub
- resolver library and associated resolver daemon that fully
- support forward and reverse lookups of both IPv4 and IPv6
- addresses. This library is considered experimental and
- is not a complete replacement for the BIND 8 resolver library.
- Applications that use the BIND 8 res_* functions to perform
- DNS lookups or dynamic updates still need to be linked against
- the BIND 8 libraries. For DNS lookups, they can also use the
- new "getrrsetbyname()" API.
-
- BIND 9.2 is capable of acting as an authoritative server
- for DNSSEC secured zones. This functionality is believed to
- be stable and complete except for lacking support for
- verifications involving wildcard records in secure zones.
-
- When acting as a caching server, BIND 9.2 can be configured
- to perform DNSSEC secure resolution on behalf of its clients.
- This part of the DNSSEC implementation is still considered
- experimental. For detailed information about the state of the
- DNSSEC implementation, see the file doc/misc/dnssec.
-
- There are a few known bugs:
-
- On some systems, IPv6 and IPv4 sockets interact in
- unexpected ways. For details, see doc/misc/ipv6.
- To reduce the impact of these problems, the server
- no longer listens for requests on IPv6 addresses
- by default. If you need to accept DNS queries over
- IPv6, you must specify "listen-on-v6 { any; };"
- in the named.conf options statement.
-
- FreeBSD prior to 4.2 (and 4.2 if running as non-root)
- and OpenBSD prior to 2.8 log messages like
- "fcntl(8, F_SETFL, 4): Inappropriate ioctl for device".
- This is due to a bug in "/dev/random" and impacts the
- server's DNSSEC support.
-
- OS X 10.1.4 (Darwin 5.4), OS X 10.1.5 (Darwin 5.5) and
- OS X 10.2 (Darwin 6.0) reports errors like
- "fcntl(3, F_SETFL, 4): Operation not supported by device".
- This is due to a bug in "/dev/random" and impacts the
- server's DNSSEC support.
-
- --with-libtool does not work on AIX.
-
- A bug in some versions of the Microsoft DNS server can cause zone
- transfers from a BIND 9 server to a W2K server to fail. For details,
- see the "Zone Transfers" section in doc/misc/migration.
+ For a summary of functional enhancements in previous
+ releases, see the HISTORY file.
For a detailed list of user-visible changes from
previous releases, see the CHANGES file.
+BIND 9.8.0
+
+ BIND 9.8.0 includes a number of changes from BIND 9.7 and earlier
+ releases. New features include:
+
+ - Built-in trust anchor for the root zone, which can be
+ switched on via "dnssec-validation auto;"
+ - Support for DNS64.
+ - Support for response policy zones (RPZ).
+ - Support for writable DLZ zones.
+ - Improved ease of configuration of GSS/TSIG for
+ interoperability with Active Directory
+ - Support for GOST signing algorithm for DNSSEC.
+ - Removed RTT Banding from server selection algorithm.
+ - New "static-stub" zone type.
+ - Allow configuration of resolver timeouts via
+ "resolver-query-timeout" option.
+
+BIND 9.7.0
+
+ BIND 9.7.0 includes a number of changes from BIND 9.6 and earlier
+ releases. Most are intended to simplify DNSSEC configuration.
+
+ New features include:
+
+ - Fully automatic signing of zones by "named".
+ - Simplified configuration of DNSSEC Lookaside Validation (DLV).
+ - Simplified configuration of Dynamic DNS, using the "ddns-confgen"
+ command line tool or the "local" update-policy option. (As a side
+ effect, this also makes it easier to configure automatic zone
+ re-signing.)
+ - New named option "attach-cache" that allows multiple views to
+ share a single cache.
+ - DNS rebinding attack prevention.
+ - New default values for dnssec-keygen parameters.
+ - Support for RFC 5011 automated trust anchor maintenance
+ - Smart signing: simplified tools for zone signing and key
+ maintenance.
+ - The "statistics-channels" option is now available on Windows.
+ - A new DNSSEC-aware libdns API for use by non-BIND9 applications
+ - On some platforms, named and other binaries can now print out
+ a stack backtrace on assertion failure, to aid in debugging.
+ - A "tools only" installation mode on Windows, which only installs
+ dig, host, nslookup and nsupdate.
+ - Improved PKCS#11 support, including Keyper support and explicit
+ OpenSSL engine selection.
+
+ Known issues in this release:
+
+ - In rare cases, DNSSEC validation can leak memory. When this
+ happens, it will cause an assertion failure when named exits,
+ but is otherwise harmless. A fix exists, but was too late for
+ this release; it will be included in BIND 9.7.1.
+
+ Compatibility notes:
+
+ - If you had built BIND 9.6 with any of ALLOW_NSEC3PARAM_UPDATE,
+ ALLOW_SECURE_TO_INSECURE or ALLOW_INSECURE_TO_SECURE defined, then
+ you should ensure that all changes that are in progress have
+ completed prior to upgrading to BIND 9.7. BIND 9.7 implements
+ those features in a way which is not backwards compatible.
+
+ - Prior releases had a bug which caused HMAC-SHA* keys with long
+ secrets to be used incorrectly. Fixing this bug means that older
+ versions of BIND 9 may fail to interoperate with this version
+ when using TSIG keys. If this occurs, the new "isc-hmac-fixup"
+ tool will convert a key with a long secret into a form that works
+ correctly with all versions of BIND 9. See the "isc-hmac-fixup"
+ man page for additional details.
+
+ - Revoking a DNSSEC key with "dnssec-revoke" changes its key ID.
+ It is possible for the new key ID to collide with that of a
+ different key. Newly generated keys will not have this problem,
+ as "dnssec-keygen" looks for potential collisions before
+ generating keys, but exercise caution if using key revokation
+ with keys that were generated by older versions of BIND 9. See
+ the Administrator's Reference Manual, section 4.10 ("Dynamic
+ Trust Anchor Management") for more details.
+
+ - A bug was fixed in which a key's scheduled inactivity date was
+ stored incorectly. Users who participated in the 9.7.0 BETA test
+ and had DNSSEC keys with scheduled inactivity dates will need to
+ reset those keys' dates using "dnssec-settime -I".
Building
@@ -417,7 +144,7 @@ Building
FreeBSD 4.10, 5.2.1, 6.2
HP-UX 11.11
Mac OS X 10.5
- NetBSD 3.x and 4.0-beta
+ NetBSD 3.x, 4.0-beta, 5.0-beta
OpenBSD 3.3 and up
Solaris 8, 9, 9 (x86), 10
Ubuntu 7.04, 7.10
@@ -594,6 +321,9 @@ Documentation
Frequently asked questions and their answers can be found in
FAQ.
+ Additional information on various subjects can be found
+ in the other README files.
+
Bug Reports and Mailing Lists
diff --git a/contrib/bind9/README.idnkit b/contrib/bind9/README.idnkit
deleted file mode 100644
index f5255f5..0000000
--- a/contrib/bind9/README.idnkit
+++ /dev/null
@@ -1,112 +0,0 @@
-
- BIND-9 IDN patch
-
- Japan Network Information Center (JPNIC)
-
-
-* What is this patch for?
-
-This patch adds internationalized domain name (IDN) support to BIND-9.
-You'll get internationalized version of dig/host/nslookup commands.
-
- + internationalized dig/host/nslookup
- dig/host/nslookup accepts non-ASCII domain names in the local
- codeset (such as Shift JIS, Big5 or ISO8859-1) determined by
- the locale information. The domain names are normalized and
- converted to the encoding on the DNS protocol, and sent to DNS
- servers. The replies are converted back to the local codeset
- and displayed.
-
-
-* Compilation & installation
-
-0. Prerequisite
-
-You have to build and install idnkit before building this patched version
-of bind-9.
-
-1. Running configure script
-
-Run `configure' in the top directory. See `README' for the
-configuration options.
-
-This patch adds the following 4 options to `configure'. You should
-at least specify `--with-idn' option to enable IDN support.
-
- --with-idn[=IDN_PREFIX]
- To enable IDN support, you have to specify `--with-idn' option.
- The argument IDN_PREFIX is the install prefix of idnkit. If
- IDN_PREFIX is omitted, PREFIX (derived from `--prefix=PREFIX')
- is assumed.
-
- --with-libiconv[=LIBICONV_PREFIX]
- Specify this option if idnkit you have installed links GNU
- libiconv. The argument LIBICONV_PREFIX is install prefix of
- GNU libiconv. If the argument is omitted, PREFIX (derived
- from `--prefix=PREFIX') is assumed.
-
- `--with-libiconv' is shorthand option for GNU libiconv.
-
- --with-libiconv=/usr/local
-
- This is equivalent to:
-
- --with-iconv='-L/usr/local/lib -R/usr/local/lib -liconv'
-
- `--with-libiconv' assumes that your C compiler has `-R'
- option, and that the option adds the specified run-time path
- to an executable binary. If `-R' option of your compiler has
- different meaning, or your compiler lacks the option, you
- should use `--with-iconv' option instead. Binary command
- without run-time path information might be unexecutable.
- In that case, you would see an error message like:
-
- error in loading shared libraries: libiconv.so.2: cannot
- open shared object file
-
- If both `--with-libiconv' and `--with-iconv' options are
- specified, `--with-iconv' is prior to `--with-libiconv'.
-
- --with-iconv=ICONV_LIBSPEC
- If your libc doesn't provide iconv(), you need to specify the
- library containing iconv() with this option. `ICONV_LIBSPEC'
- is the argument(s) to `cc' or `ld' to link the library, for
- example, `--with-iconv="-L/usr/local/lib -liconv"'.
- You don't need to specify the header file directory for "iconv.h"
- to the compiler, as it isn't included directly by bind-9 with
- this patch.
-
- --with-idnlib=IDN_LIBSPEC
- With this option, you can explicitly specify the argument(s)
- to `cc' or `ld' to link the idnkit's library, `libidnkit'. If
- this option is not specified, `-L${PREFIX}/lib -lidnkit' is
- assumed, where ${PREFIX} is the installation prefix specified
- with `--with-idn' option above. You may need to use this
- option to specify extra arguments, for example,
- `--with-idnlib="-L/usr/local/lib -R/usr/local/lib -lidnkit"'.
-
-Please consult `README' for other configuration options.
-
-Note that if you want to specify some extra header file directories,
-you should use the environment variable STD_CINCLUDES instead of
-CFLAGS, as described in README.
-
-2. Compilation and installation
-
-After running "configure", just do
-
- make
- make install
-
-for compiling and installing.
-
-
-* Contact information
-
-Please see http//www.nic.ad.jp/en/idn/ for the latest news
-about idnkit and this patch.
-
-Bug reports and comments on this kit should be sent to
-mdnkit-bugs@nic.ad.jp and idn-cmt@nic.ad.jp, respectively.
-
-; $Id: README.idnkit,v 1.2.762.1 2009-01-18 23:25:14 marka Exp $
diff --git a/contrib/bind9/README.pkcs11 b/contrib/bind9/README.pkcs11
deleted file mode 100644
index b58640d..0000000
--- a/contrib/bind9/README.pkcs11
+++ /dev/null
@@ -1,61 +0,0 @@
-
- BIND-9 PKCS#11 support
-
-Prerequisite
-
-The PKCS#11 support needs a PKCS#11 OpenSSL engine based on the Solaris one,
-released the 2007-11-21 for OpenSSL 0.9.8g, with a bug fix (call to free)
-and some improvements, including user friendly PIN management.
-
-Compilation
-
-"configure --with-pkcs11 ..."
-
-PKCS#11 Libraries
-
-Tested with Solaris one with a SCA board and with openCryptoki with the
-software token.
-
-OpenSSL Engines
-
-With PKCS#11 support the PKCS#11 engine is statically loaded but at its
-initialization it dynamically loads the PKCS#11 objects.
-Even the pre commands are therefore unused they are defined with:
- SO_PATH:
- define: PKCS11_SO_PATH
- default: /usr/local/lib/engines/engine_pkcs11.so
- MODULE_PATH:
- define: PKCS11_MODULE_PATH
- default: /usr/lib/libpkcs11.so
-Without PKCS#11 support, a specific OpenSSL engine can be still used
-by defining ENGINE_ID at compile time.
-
-PKCS#11 tools
-
-The contrib/pkcs11-keygen directory contains a set of experimental tools
-to handle keys stored in a Hardware Security Module at the benefit of BIND.
-
-The patch for OpenSSL 0.9.8g is in this directory. Read its README.pkcs11
-for the way to use it (these are the original notes so with the original
-path, etc. Define OPENCRYPTOKI to use it with openCryptoki.)
-
-PIN management
-
-With the just fixed PKCS#11 OpenSSL engine, the PIN should be entered
-each time it is required. With the improved engine, the PIN should be
-entered the first time it is required or can be configured in the
-OpenSSL configuration file (aka. openssl.cnf) by adding in it:
- - at the beginning:
- openssl_conf = openssl_def
- - at any place these sections:
- [ openssl_def ]
- engines = engine_section
- [ engine_section ]
- pkcs11 = pkcs11_section
- [ pkcs11_section ]
- PIN = put__your__pin__value__here
-
-Note
-
-Some names here are registered trademarks, at least Solaris is a trademark
-of Sun Microsystems Inc...
diff --git a/contrib/bind9/acconfig.h b/contrib/bind9/acconfig.h
index d64404a..d9da221 100644
--- a/contrib/bind9/acconfig.h
+++ b/contrib/bind9/acconfig.h
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004, 2005, 2007, 2009 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004, 2005, 2007, 2008 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 1999-2003 Internet Software Consortium.
*
* Permission to use, copy, modify, and/or distribute this software for any
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: acconfig.h,v 1.51.334.2 2009-02-16 23:47:15 tbox Exp $ */
+/* $Id: acconfig.h,v 1.53 2008-12-01 23:47:44 tbox Exp $ */
/*! \file */
diff --git a/contrib/bind9/bin/Makefile.in b/contrib/bind9/bin/Makefile.in
index 1694268..d263d79 100644
--- a/contrib/bind9/bin/Makefile.in
+++ b/contrib/bind9/bin/Makefile.in
@@ -1,4 +1,4 @@
-# Copyright (C) 2004, 2007 Internet Systems Consortium, Inc. ("ISC")
+# Copyright (C) 2004, 2007, 2009 Internet Systems Consortium, Inc. ("ISC")
# Copyright (C) 1998-2001 Internet Software Consortium.
#
# Permission to use, copy, modify, and/or distribute this software for any
@@ -13,13 +13,14 @@
# OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
# PERFORMANCE OF THIS SOFTWARE.
-# $Id: Makefile.in,v 1.25 2007-06-19 23:46:59 tbox Exp $
+# $Id: Makefile.in,v 1.29 2009-10-05 12:07:08 fdupont Exp $
srcdir = @srcdir@
VPATH = @srcdir@
top_srcdir = @top_srcdir@
-SUBDIRS = named rndc dig dnssec tests nsupdate check
+SUBDIRS = named rndc dig dnssec tests tools nsupdate \
+ check confgen @PKCS11_TOOLS@
TARGETS =
@BIND9_MAKE_RULES@
diff --git a/contrib/bind9/bin/check/Makefile.in b/contrib/bind9/bin/check/Makefile.in
index 46271c7..d5827dc 100644
--- a/contrib/bind9/bin/check/Makefile.in
+++ b/contrib/bind9/bin/check/Makefile.in
@@ -1,4 +1,4 @@
-# Copyright (C) 2004-2007 Internet Systems Consortium, Inc. ("ISC")
+# Copyright (C) 2004-2007, 2009 Internet Systems Consortium, Inc. ("ISC")
# Copyright (C) 2000-2003 Internet Software Consortium.
#
# Permission to use, copy, modify, and/or distribute this software for any
@@ -13,7 +13,7 @@
# OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
# PERFORMANCE OF THIS SOFTWARE.
-# $Id: Makefile.in,v 1.32 2007-06-19 23:46:59 tbox Exp $
+# $Id: Makefile.in,v 1.36 2009-12-05 23:31:40 each Exp $
srcdir = @srcdir@
VPATH = @srcdir@
@@ -32,6 +32,7 @@ CWARNINGS =
DNSLIBS = ../../lib/dns/libdns.@A@ @DNS_CRYPTO_LIBS@
ISCCFGLIBS = ../../lib/isccfg/libisccfg.@A@
ISCLIBS = ../../lib/isc/libisc.@A@
+ISCNOSYMLIBS = ../../lib/isc/libisc-nosymtbl.@A@
BIND9LIBS = ../../lib/bind9/libbind9.@A@
DNSDEPLIBS = ../../lib/dns/libdns.@A@
@@ -39,7 +40,8 @@ ISCCFGDEPLIBS = ../../lib/isccfg/libisccfg.@A@
ISCDEPLIBS = ../../lib/isc/libisc.@A@
BIND9DEPLIBS = ../../lib/bind9/libbind9.@A@
-LIBS = @LIBS@
+LIBS = ${ISCLIBS} @LIBS@
+NOSYMLIBS = ${ISCNOSYMLIBS} @LIBS@
SUBDIRS =
@@ -69,14 +71,14 @@ named-checkzone.@O@: named-checkzone.c
named-checkconf@EXEEXT@: named-checkconf.@O@ check-tool.@O@ ${ISCDEPLIBS} \
${ISCCFGDEPLIBS} ${BIND9DEPLIBS}
- ${LIBTOOL_MODE_LINK} ${PURIFY} ${CC} ${CFLAGS} ${LDFLAGS} -o $@ \
- named-checkconf.@O@ check-tool.@O@ ${BIND9LIBS} ${ISCCFGLIBS} \
- ${DNSLIBS} ${ISCLIBS} ${LIBS}
+ export BASEOBJS="named-checkconf.@O@ check-tool.@O@"; \
+ export LIBS0="${BIND9LIBS} ${ISCCFGLIBS} ${DNSLIBS}"; \
+ ${FINALBUILDCMD}
named-checkzone@EXEEXT@: named-checkzone.@O@ check-tool.@O@ ${ISCDEPLIBS} ${DNSDEPLIBS}
- ${LIBTOOL_MODE_LINK} ${PURIFY} ${CC} ${CFLAGS} ${LDFLAGS} -o $@ \
- named-checkzone.@O@ check-tool.@O@ ${ISCCFGLIBS} ${DNSLIBS} \
- ${ISCLIBS} ${LIBS}
+ export BASEOBJS="named-checkzone.@O@ check-tool.@O@"; \
+ export LIBS0="${ISCCFGLIBS} ${DNSLIBS}"; \
+ ${FINALBUILDCMD}
doc man:: ${MANOBJS}
diff --git a/contrib/bind9/bin/check/check-tool.c b/contrib/bind9/bin/check/check-tool.c
index ed9224b..4d2ca5c 100644
--- a/contrib/bind9/bin/check/check-tool.c
+++ b/contrib/bind9/bin/check/check-tool.c
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: check-tool.c,v 1.35.36.5 2010-09-07 23:46:05 tbox Exp $ */
+/* $Id: check-tool.c,v 1.41 2010-09-07 23:46:59 tbox Exp $ */
/*! \file */
@@ -601,8 +601,7 @@ load_zone(isc_mem_t *mctx, const char *zonename, const char *filename,
isc_buffer_add(&buffer, strlen(zonename));
dns_fixedname_init(&fixorigin);
origin = dns_fixedname_name(&fixorigin);
- CHECK(dns_name_fromtext(origin, &buffer, dns_rootname,
- ISC_FALSE, NULL));
+ CHECK(dns_name_fromtext(origin, &buffer, dns_rootname, 0, NULL));
CHECK(dns_zone_setorigin(zone, origin));
CHECK(dns_zone_setdbtype(zone, 1, (const char * const *) dbtype));
CHECK(dns_zone_setfile2(zone, filename, fileformat));
diff --git a/contrib/bind9/bin/check/check-tool.h b/contrib/bind9/bin/check/check-tool.h
index f9273ff..4371ae2 100644
--- a/contrib/bind9/bin/check/check-tool.h
+++ b/contrib/bind9/bin/check/check-tool.h
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: check-tool.h,v 1.14.334.2 2010-09-07 23:46:05 tbox Exp $ */
+/* $Id: check-tool.h,v 1.16 2010-09-07 23:46:59 tbox Exp $ */
#ifndef CHECK_TOOL_H
#define CHECK_TOOL_H
diff --git a/contrib/bind9/bin/check/named-checkconf.8 b/contrib/bind9/bin/check/named-checkconf.8
index 7131007..fabcfa9 100644
--- a/contrib/bind9/bin/check/named-checkconf.8
+++ b/contrib/bind9/bin/check/named-checkconf.8
@@ -1,4 +1,4 @@
-.\" Copyright (C) 2004, 2005, 2007 Internet Systems Consortium, Inc. ("ISC")
+.\" Copyright (C) 2004, 2005, 2007, 2009 Internet Systems Consortium, Inc. ("ISC")
.\" Copyright (C) 2000-2002 Internet Software Consortium.
.\"
.\" Permission to use, copy, modify, and/or distribute this software for any
@@ -13,7 +13,7 @@
.\" OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
.\" PERFORMANCE OF THIS SOFTWARE.
.\"
-.\" $Id: named-checkconf.8,v 1.30.334.1 2009-07-11 01:55:20 tbox Exp $
+.\" $Id: named-checkconf.8,v 1.33 2009-12-29 01:14:03 tbox Exp $
.\"
.hy 0
.ad l
@@ -33,11 +33,29 @@
named\-checkconf \- named configuration file syntax checking tool
.SH "SYNOPSIS"
.HP 16
-\fBnamed\-checkconf\fR [\fB\-h\fR] [\fB\-v\fR] [\fB\-j\fR] [\fB\-t\ \fR\fB\fIdirectory\fR\fR] {filename} [\fB\-z\fR]
+\fBnamed\-checkconf\fR [\fB\-h\fR] [\fB\-v\fR] [\fB\-j\fR] [\fB\-t\ \fR\fB\fIdirectory\fR\fR] {filename} [\fB\-p\fR] [\fB\-z\fR]
.SH "DESCRIPTION"
.PP
\fBnamed\-checkconf\fR
-checks the syntax, but not the semantics, of a named configuration file.
+checks the syntax, but not the semantics, of a
+\fBnamed\fR
+configuration file. The file is parsed and checked for syntax errors, along with all files included by it. If no file is specified,
+\fI/etc/named.conf\fR
+is read by default.
+.PP
+Note: files that
+\fBnamed\fR
+reads in separate parser contexts, such as
+\fIrndc.key\fR
+and
+\fIbind.keys\fR, are not automatically read by
+\fBnamed\-checkconf\fR. Configuration errors in these files may cause
+\fBnamed\fR
+to fail to run, even if
+\fBnamed\-checkconf\fR
+was successful.
+\fBnamed\-checkconf\fR
+can be run on these files explicitly, however.
.SH "OPTIONS"
.PP
\-h
@@ -59,6 +77,13 @@ Print the version of the
program and exit.
.RE
.PP
+\-p
+.RS 4
+Print out the
+\fInamed.conf\fR
+and included files in canonical form if no errors were detected.
+.RE
+.PP
\-z
.RS 4
Perform a test load of all master zones found in
@@ -88,7 +113,7 @@ BIND 9 Administrator Reference Manual.
.PP
Internet Systems Consortium
.SH "COPYRIGHT"
-Copyright \(co 2004, 2005, 2007 Internet Systems Consortium, Inc. ("ISC")
+Copyright \(co 2004, 2005, 2007, 2009 Internet Systems Consortium, Inc. ("ISC")
.br
Copyright \(co 2000\-2002 Internet Software Consortium.
.br
diff --git a/contrib/bind9/bin/check/named-checkconf.c b/contrib/bind9/bin/check/named-checkconf.c
index 20983b5..521ed31 100644
--- a/contrib/bind9/bin/check/named-checkconf.c
+++ b/contrib/bind9/bin/check/named-checkconf.c
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: named-checkconf.c,v 1.46.222.4 2010-09-07 23:46:05 tbox Exp $ */
+/* $Id: named-checkconf.c,v 1.54 2010-09-07 01:49:08 marka Exp $ */
/*! \file */
@@ -59,9 +59,12 @@ isc_log_t *logc = NULL;
} while (0)
/*% usage */
+ISC_PLATFORM_NORETURN_PRE static void
+usage(void) ISC_PLATFORM_NORETURN_POST;
+
static void
usage(void) {
- fprintf(stderr, "usage: %s [-h] [-j] [-v] [-z] [-t directory] "
+ fprintf(stderr, "usage: %s [-h] [-j] [-p] [-v] [-z] [-t directory] "
"[named.conf]\n", program);
exit(1);
}
@@ -203,6 +206,24 @@ configure_zone(const char *vclass, const char *view,
zfile = cfg_obj_asstring(fileobj);
obj = NULL;
+ if (get_maps(maps, "check-dup-records", &obj)) {
+ if (strcasecmp(cfg_obj_asstring(obj), "warn") == 0) {
+ zone_options |= DNS_ZONEOPT_CHECKDUPRR;
+ zone_options &= ~DNS_ZONEOPT_CHECKDUPRRFAIL;
+ } else if (strcasecmp(cfg_obj_asstring(obj), "fail") == 0) {
+ zone_options |= DNS_ZONEOPT_CHECKDUPRR;
+ zone_options |= DNS_ZONEOPT_CHECKDUPRRFAIL;
+ } else if (strcasecmp(cfg_obj_asstring(obj), "ignore") == 0) {
+ zone_options &= ~DNS_ZONEOPT_CHECKDUPRR;
+ zone_options &= ~DNS_ZONEOPT_CHECKDUPRRFAIL;
+ } else
+ INSIST(0);
+ } else {
+ zone_options |= DNS_ZONEOPT_CHECKDUPRR;
+ zone_options &= ~DNS_ZONEOPT_CHECKDUPRRFAIL;
+ }
+
+ obj = NULL;
if (get_maps(maps, "check-mx", &obj)) {
if (strcasecmp(cfg_obj_asstring(obj), "warn") == 0) {
zone_options |= DNS_ZONEOPT_CHECKMX;
@@ -387,6 +408,15 @@ load_zones_fromconfig(const cfg_obj_t *config, isc_mem_t *mctx) {
return (result);
}
+static void
+output(void *closure, const char *text, int textlen) {
+ UNUSED(closure);
+ if (fwrite(text, 1, textlen, stdout) != (size_t)textlen) {
+ perror("fwrite");
+ exit(1);
+ }
+}
+
/*% The main processing routine */
int
main(int argc, char **argv) {
@@ -399,10 +429,11 @@ main(int argc, char **argv) {
int exit_status = 0;
isc_entropy_t *ectx = NULL;
isc_boolean_t load_zones = ISC_FALSE;
+ isc_boolean_t print = ISC_FALSE;
isc_commandline_errprint = ISC_FALSE;
- while ((c = isc_commandline_parse(argc, argv, "dhjt:vz")) != EOF) {
+ while ((c = isc_commandline_parse(argc, argv, "dhjt:pvz")) != EOF) {
switch (c) {
case 'd':
debug++;
@@ -421,6 +452,10 @@ main(int argc, char **argv) {
}
break;
+ case 'p':
+ print = ISC_TRUE;
+ break;
+
case 'v':
printf(VERSION "\n");
exit(0);
@@ -485,6 +520,8 @@ main(int argc, char **argv) {
exit_status = 1;
}
+ if (print && exit_status == 0)
+ cfg_print(config, output, NULL);
cfg_obj_destroy(parser, &config);
cfg_parser_destroy(&parser);
diff --git a/contrib/bind9/bin/check/named-checkconf.docbook b/contrib/bind9/bin/check/named-checkconf.docbook
index e0c43d1..fe12cb3 100644
--- a/contrib/bind9/bin/check/named-checkconf.docbook
+++ b/contrib/bind9/bin/check/named-checkconf.docbook
@@ -2,7 +2,7 @@
"http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd"
[<!ENTITY mdash "&#8212;">]>
<!--
- - Copyright (C) 2004, 2005, 2007 Internet Systems Consortium, Inc. ("ISC")
+ - Copyright (C) 2004, 2005, 2007, 2009 Internet Systems Consortium, Inc. ("ISC")
- Copyright (C) 2000-2002 Internet Software Consortium.
-
- Permission to use, copy, modify, and/or distribute this software for any
@@ -18,7 +18,7 @@
- PERFORMANCE OF THIS SOFTWARE.
-->
-<!-- $Id: named-checkconf.docbook,v 1.19 2007-06-19 06:58:03 marka Exp $ -->
+<!-- $Id: named-checkconf.docbook,v 1.22 2009-12-28 23:21:16 each Exp $ -->
<refentry id="man.named-checkconf">
<refentryinfo>
<date>June 14, 2000</date>
@@ -35,6 +35,7 @@
<year>2004</year>
<year>2005</year>
<year>2007</year>
+ <year>2009</year>
<holder>Internet Systems Consortium, Inc. ("ISC")</holder>
</copyright>
<copyright>
@@ -58,6 +59,7 @@
<arg><option>-j</option></arg>
<arg><option>-t <replaceable class="parameter">directory</replaceable></option></arg>
<arg choice="req">filename</arg>
+ <arg><option>-p</option></arg>
<arg><option>-z</option></arg>
</cmdsynopsis>
</refsynopsisdiv>
@@ -65,8 +67,21 @@
<refsect1>
<title>DESCRIPTION</title>
<para><command>named-checkconf</command>
- checks the syntax, but not the semantics, of a named
- configuration file.
+ checks the syntax, but not the semantics, of a
+ <command>named</command> configuration file. The file is parsed
+ and checked for syntax errors, along with all files included by it.
+ If no file is specified, <filename>/etc/named.conf</filename> is read
+ by default.
+ </para>
+ <para>
+ Note: files that <command>named</command> reads in separate
+ parser contexts, such as <filename>rndc.key</filename> and
+ <filename>bind.keys</filename>, are not automatically read
+ by <command>named-checkconf</command>. Configuration
+ errors in these files may cause <command>named</command> to
+ fail to run, even if <command>named-checkconf</command> was
+ successful. <command>named-checkconf</command> can be run
+ on these files explicitly, however.
</para>
</refsect1>
@@ -87,8 +102,7 @@
<term>-t <replaceable class="parameter">directory</replaceable></term>
<listitem>
<para>
- Chroot to <filename>directory</filename> so that
- include
+ Chroot to <filename>directory</filename> so that include
directives in the configuration file are processed as if
run by a similarly chrooted named.
</para>
@@ -106,6 +120,16 @@
</varlistentry>
<varlistentry>
+ <term>-p</term>
+ <listitem>
+ <para>
+ Print out the <filename>named.conf</filename> and included files
+ in canonical form if no errors were detected.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
<term>-z</term>
<listitem>
<para>
diff --git a/contrib/bind9/bin/check/named-checkconf.html b/contrib/bind9/bin/check/named-checkconf.html
index 458b486..f5e4cd3 100644
--- a/contrib/bind9/bin/check/named-checkconf.html
+++ b/contrib/bind9/bin/check/named-checkconf.html
@@ -1,5 +1,5 @@
<!--
- - Copyright (C) 2004, 2005, 2007 Internet Systems Consortium, Inc. ("ISC")
+ - Copyright (C) 2004, 2005, 2007, 2009 Internet Systems Consortium, Inc. ("ISC")
- Copyright (C) 2000-2002 Internet Software Consortium.
-
- Permission to use, copy, modify, and/or distribute this software for any
@@ -14,7 +14,7 @@
- OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
- PERFORMANCE OF THIS SOFTWARE.
-->
-<!-- $Id: named-checkconf.html,v 1.30.334.1 2009-07-11 01:55:20 tbox Exp $ -->
+<!-- $Id: named-checkconf.html,v 1.33 2009-12-29 01:14:03 tbox Exp $ -->
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
@@ -29,17 +29,30 @@
</div>
<div class="refsynopsisdiv">
<h2>Synopsis</h2>
-<div class="cmdsynopsis"><p><code class="command">named-checkconf</code> [<code class="option">-h</code>] [<code class="option">-v</code>] [<code class="option">-j</code>] [<code class="option">-t <em class="replaceable"><code>directory</code></em></code>] {filename} [<code class="option">-z</code>]</p></div>
+<div class="cmdsynopsis"><p><code class="command">named-checkconf</code> [<code class="option">-h</code>] [<code class="option">-v</code>] [<code class="option">-j</code>] [<code class="option">-t <em class="replaceable"><code>directory</code></em></code>] {filename} [<code class="option">-p</code>] [<code class="option">-z</code>]</p></div>
</div>
<div class="refsect1" lang="en">
-<a name="id2543387"></a><h2>DESCRIPTION</h2>
+<a name="id2543395"></a><h2>DESCRIPTION</h2>
<p><span><strong class="command">named-checkconf</strong></span>
- checks the syntax, but not the semantics, of a named
- configuration file.
+ checks the syntax, but not the semantics, of a
+ <span><strong class="command">named</strong></span> configuration file. The file is parsed
+ and checked for syntax errors, along with all files included by it.
+ If no file is specified, <code class="filename">/etc/named.conf</code> is read
+ by default.
+ </p>
+<p>
+ Note: files that <span><strong class="command">named</strong></span> reads in separate
+ parser contexts, such as <code class="filename">rndc.key</code> and
+ <code class="filename">bind.keys</code>, are not automatically read
+ by <span><strong class="command">named-checkconf</strong></span>. Configuration
+ errors in these files may cause <span><strong class="command">named</strong></span> to
+ fail to run, even if <span><strong class="command">named-checkconf</strong></span> was
+ successful. <span><strong class="command">named-checkconf</strong></span> can be run
+ on these files explicitly, however.
</p>
</div>
<div class="refsect1" lang="en">
-<a name="id2543399"></a><h2>OPTIONS</h2>
+<a name="id2543444"></a><h2>OPTIONS</h2>
<div class="variablelist"><dl>
<dt><span class="term">-h</span></dt>
<dd><p>
@@ -47,8 +60,7 @@
</p></dd>
<dt><span class="term">-t <em class="replaceable"><code>directory</code></em></span></dt>
<dd><p>
- Chroot to <code class="filename">directory</code> so that
- include
+ Chroot to <code class="filename">directory</code> so that include
directives in the configuration file are processed as if
run by a similarly chrooted named.
</p></dd>
@@ -57,6 +69,11 @@
Print the version of the <span><strong class="command">named-checkconf</strong></span>
program and exit.
</p></dd>
+<dt><span class="term">-p</span></dt>
+<dd><p>
+ Print out the <code class="filename">named.conf</code> and included files
+ in canonical form if no errors were detected.
+ </p></dd>
<dt><span class="term">-z</span></dt>
<dd><p>
Perform a test load of all master zones found in
@@ -74,21 +91,21 @@
</dl></div>
</div>
<div class="refsect1" lang="en">
-<a name="id2543507"></a><h2>RETURN VALUES</h2>
+<a name="id2543568"></a><h2>RETURN VALUES</h2>
<p><span><strong class="command">named-checkconf</strong></span>
returns an exit status of 1 if
errors were detected and 0 otherwise.
</p>
</div>
<div class="refsect1" lang="en">
-<a name="id2543518"></a><h2>SEE ALSO</h2>
+<a name="id2543579"></a><h2>SEE ALSO</h2>
<p><span class="citerefentry"><span class="refentrytitle">named</span>(8)</span>,
<span class="citerefentry"><span class="refentrytitle">named-checkzone</span>(8)</span>,
<em class="citetitle">BIND 9 Administrator Reference Manual</em>.
</p>
</div>
<div class="refsect1" lang="en">
-<a name="id2543548"></a><h2>AUTHOR</h2>
+<a name="id2543609"></a><h2>AUTHOR</h2>
<p><span class="corpauthor">Internet Systems Consortium</span>
</p>
</div>
diff --git a/contrib/bind9/bin/check/named-checkzone.8 b/contrib/bind9/bin/check/named-checkzone.8
index e5f0790..1bb7846 100644
--- a/contrib/bind9/bin/check/named-checkzone.8
+++ b/contrib/bind9/bin/check/named-checkzone.8
@@ -1,4 +1,4 @@
-.\" Copyright (C) 2004-2007, 2009 Internet Systems Consortium, Inc. ("ISC")
+.\" Copyright (C) 2004-2007, 2009, 2010 Internet Systems Consortium, Inc. ("ISC")
.\" Copyright (C) 2000-2002 Internet Software Consortium.
.\"
.\" Permission to use, copy, modify, and/or distribute this software for any
@@ -13,7 +13,7 @@
.\" OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
.\" PERFORMANCE OF THIS SOFTWARE.
.\"
-.\" $Id: named-checkzone.8,v 1.42.334.3 2009-11-11 01:56:22 tbox Exp $
+.\" $Id: named-checkzone.8,v 1.47 2010-01-17 01:14:02 tbox Exp $
.\"
.hy 0
.ad l
@@ -33,9 +33,9 @@
named\-checkzone, named\-compilezone \- zone file validity checking or converting tool
.SH "SYNOPSIS"
.HP 16
-\fBnamed\-checkzone\fR [\fB\-d\fR] [\fB\-h\fR] [\fB\-j\fR] [\fB\-q\fR] [\fB\-v\fR] [\fB\-c\ \fR\fB\fIclass\fR\fR] [\fB\-f\ \fR\fB\fIformat\fR\fR] [\fB\-F\ \fR\fB\fIformat\fR\fR] [\fB\-i\ \fR\fB\fImode\fR\fR] [\fB\-k\ \fR\fB\fImode\fR\fR] [\fB\-m\ \fR\fB\fImode\fR\fR] [\fB\-M\ \fR\fB\fImode\fR\fR] [\fB\-n\ \fR\fB\fImode\fR\fR] [\fB\-s\ \fR\fB\fIstyle\fR\fR] [\fB\-S\ \fR\fB\fImode\fR\fR] [\fB\-t\ \fR\fB\fIdirectory\fR\fR] [\fB\-w\ \fR\fB\fIdirectory\fR\fR] [\fB\-D\fR] [\fB\-W\ \fR\fB\fImode\fR\fR] {zonename} {filename}
+\fBnamed\-checkzone\fR [\fB\-d\fR] [\fB\-h\fR] [\fB\-j\fR] [\fB\-q\fR] [\fB\-v\fR] [\fB\-c\ \fR\fB\fIclass\fR\fR] [\fB\-f\ \fR\fB\fIformat\fR\fR] [\fB\-F\ \fR\fB\fIformat\fR\fR] [\fB\-i\ \fR\fB\fImode\fR\fR] [\fB\-k\ \fR\fB\fImode\fR\fR] [\fB\-m\ \fR\fB\fImode\fR\fR] [\fB\-M\ \fR\fB\fImode\fR\fR] [\fB\-n\ \fR\fB\fImode\fR\fR] [\fB\-o\ \fR\fB\fIfilename\fR\fR] [\fB\-r\ \fR\fB\fImode\fR\fR] [\fB\-s\ \fR\fB\fIstyle\fR\fR] [\fB\-S\ \fR\fB\fImode\fR\fR] [\fB\-t\ \fR\fB\fIdirectory\fR\fR] [\fB\-w\ \fR\fB\fIdirectory\fR\fR] [\fB\-D\fR] [\fB\-W\ \fR\fB\fImode\fR\fR] {zonename} {filename}
.HP 18
-\fBnamed\-compilezone\fR [\fB\-d\fR] [\fB\-j\fR] [\fB\-q\fR] [\fB\-v\fR] [\fB\-c\ \fR\fB\fIclass\fR\fR] [\fB\-C\ \fR\fB\fImode\fR\fR] [\fB\-f\ \fR\fB\fIformat\fR\fR] [\fB\-F\ \fR\fB\fIformat\fR\fR] [\fB\-i\ \fR\fB\fImode\fR\fR] [\fB\-k\ \fR\fB\fImode\fR\fR] [\fB\-m\ \fR\fB\fImode\fR\fR] [\fB\-n\ \fR\fB\fImode\fR\fR] [\fB\-o\ \fR\fB\fIfilename\fR\fR] [\fB\-s\ \fR\fB\fIstyle\fR\fR] [\fB\-t\ \fR\fB\fIdirectory\fR\fR] [\fB\-w\ \fR\fB\fIdirectory\fR\fR] [\fB\-D\fR] [\fB\-W\ \fR\fB\fImode\fR\fR] {\fB\-o\ \fR\fB\fIfilename\fR\fR} {zonename} {filename}
+\fBnamed\-compilezone\fR [\fB\-d\fR] [\fB\-j\fR] [\fB\-q\fR] [\fB\-v\fR] [\fB\-c\ \fR\fB\fIclass\fR\fR] [\fB\-C\ \fR\fB\fImode\fR\fR] [\fB\-f\ \fR\fB\fIformat\fR\fR] [\fB\-F\ \fR\fB\fIformat\fR\fR] [\fB\-i\ \fR\fB\fImode\fR\fR] [\fB\-k\ \fR\fB\fImode\fR\fR] [\fB\-m\ \fR\fB\fImode\fR\fR] [\fB\-n\ \fR\fB\fImode\fR\fR] [\fB\-r\ \fR\fB\fImode\fR\fR] [\fB\-s\ \fR\fB\fIstyle\fR\fR] [\fB\-t\ \fR\fB\fIdirectory\fR\fR] [\fB\-w\ \fR\fB\fIdirectory\fR\fR] [\fB\-D\fR] [\fB\-W\ \fR\fB\fImode\fR\fR] {\fB\-o\ \fR\fB\fIfilename\fR\fR} {zonename} {filename}
.SH "DESCRIPTION"
.PP
\fBnamed\-checkzone\fR
@@ -201,6 +201,15 @@ then write to standard out. This is mandatory for
\fBnamed\-compilezone\fR.
.RE
.PP
+\-r \fImode\fR
+.RS 4
+Check for records that are treated as different by DNSSEC but are semantically equal in plain DNS. Possible modes are
+\fB"fail"\fR,
+\fB"warn"\fR
+(default) and
+\fB"ignore"\fR.
+.RE
+.PP
\-s \fIstyle\fR
.RS 4
Specify the style of the dumped zone file. Possible styles are
@@ -272,7 +281,7 @@ BIND 9 Administrator Reference Manual.
.PP
Internet Systems Consortium
.SH "COPYRIGHT"
-Copyright \(co 2004\-2007, 2009 Internet Systems Consortium, Inc. ("ISC")
+Copyright \(co 2004\-2007, 2009, 2010 Internet Systems Consortium, Inc. ("ISC")
.br
Copyright \(co 2000\-2002 Internet Software Consortium.
.br
diff --git a/contrib/bind9/bin/check/named-checkzone.c b/contrib/bind9/bin/check/named-checkzone.c
index 3b86e57..100e809 100644
--- a/contrib/bind9/bin/check/named-checkzone.c
+++ b/contrib/bind9/bin/check/named-checkzone.c
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: named-checkzone.c,v 1.51.34.6 2010-09-07 23:46:06 tbox Exp $ */
+/* $Id: named-checkzone.c,v 1.61 2010-09-07 23:46:59 tbox Exp $ */
/*! \file */
@@ -70,6 +70,9 @@ static enum { progmode_check, progmode_compile } progmode;
} \
} while (0)
+ISC_PLATFORM_NORETURN_PRE static void
+usage(void) ISC_PLATFORM_NORETURN_POST;
+
static void
usage(void) {
fprintf(stderr,
@@ -77,12 +80,13 @@ usage(void) {
"[-f inputformat] [-F outputformat] "
"[-t directory] [-w directory] [-k (ignore|warn|fail)] "
"[-n (ignore|warn|fail)] [-m (ignore|warn|fail)] "
+ "[-r (ignore|warn|fail)] "
"[-i (full|full-sibling|local|local-sibling|none)] "
"[-M (ignore|warn|fail)] [-S (ignore|warn|fail)] "
"[-W (ignore|warn)] "
"%s zonename filename\n",
prog_name,
- progmode == progmode_check ? "[-o filename]" : "{-o filename}");
+ progmode == progmode_check ? "[-o filename]" : "-o filename");
exit(1);
}
@@ -140,17 +144,19 @@ main(int argc, char **argv) {
if (progmode == progmode_compile) {
zone_options |= (DNS_ZONEOPT_CHECKNS |
DNS_ZONEOPT_FATALNS |
+ DNS_ZONEOPT_CHECKDUPRR |
DNS_ZONEOPT_CHECKNAMES |
DNS_ZONEOPT_CHECKNAMESFAIL |
DNS_ZONEOPT_CHECKWILDCARD);
- }
+ } else
+ zone_options |= DNS_ZONEOPT_CHECKDUPRR;
#define ARGCMP(X) (strcmp(isc_commandline_argument, X) == 0)
isc_commandline_errprint = ISC_FALSE;
while ((c = isc_commandline_parse(argc, argv,
- "c:df:hi:jk:m:n:qs:t:o:vw:DF:M:S:W:"))
+ "c:df:hi:jk:m:n:qr:s:t:o:vw:DF:M:S:W:"))
!= EOF) {
switch (c) {
case 'c':
@@ -262,16 +268,27 @@ main(int argc, char **argv) {
}
break;
+ case 'o':
+ output_filename = isc_commandline_argument;
+ break;
+
case 'q':
quiet++;
break;
- case 't':
- result = isc_dir_chroot(isc_commandline_argument);
- if (result != ISC_R_SUCCESS) {
- fprintf(stderr, "isc_dir_chroot: %s: %s\n",
- isc_commandline_argument,
- isc_result_totext(result));
+ case 'r':
+ if (ARGCMP("warn")) {
+ zone_options |= DNS_ZONEOPT_CHECKDUPRR;
+ zone_options &= ~DNS_ZONEOPT_CHECKDUPRRFAIL;
+ } else if (ARGCMP("fail")) {
+ zone_options |= DNS_ZONEOPT_CHECKDUPRR |
+ DNS_ZONEOPT_CHECKDUPRRFAIL;
+ } else if (ARGCMP("ignore")) {
+ zone_options &= ~(DNS_ZONEOPT_CHECKDUPRR |
+ DNS_ZONEOPT_CHECKDUPRRFAIL);
+ } else {
+ fprintf(stderr, "invalid argument to -r: %s\n",
+ isc_commandline_argument);
exit(1);
}
break;
@@ -289,8 +306,14 @@ main(int argc, char **argv) {
}
break;
- case 'o':
- output_filename = isc_commandline_argument;
+ case 't':
+ result = isc_dir_chroot(isc_commandline_argument);
+ if (result != ISC_R_SUCCESS) {
+ fprintf(stderr, "isc_dir_chroot: %s: %s\n",
+ isc_commandline_argument,
+ isc_result_totext(result));
+ exit(1);
+ }
break;
case 'v':
diff --git a/contrib/bind9/bin/check/named-checkzone.docbook b/contrib/bind9/bin/check/named-checkzone.docbook
index 0e04c03..415ee1c 100644
--- a/contrib/bind9/bin/check/named-checkzone.docbook
+++ b/contrib/bind9/bin/check/named-checkzone.docbook
@@ -2,7 +2,7 @@
"http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd"
[<!ENTITY mdash "&#8212;">]>
<!--
- - Copyright (C) 2004-2007, 2009 Internet Systems Consortium, Inc. ("ISC")
+ - Copyright (C) 2004-2007, 2009, 2010 Internet Systems Consortium, Inc. ("ISC")
- Copyright (C) 2000-2002 Internet Software Consortium.
-
- Permission to use, copy, modify, and/or distribute this software for any
@@ -18,7 +18,7 @@
- PERFORMANCE OF THIS SOFTWARE.
-->
-<!-- $Id: named-checkzone.docbook,v 1.34.334.3 2009-11-10 20:01:41 each Exp $ -->
+<!-- $Id: named-checkzone.docbook,v 1.40 2010-01-16 23:48:15 tbox Exp $ -->
<refentry id="man.named-checkzone">
<refentryinfo>
<date>June 13, 2000</date>
@@ -37,6 +37,7 @@
<year>2006</year>
<year>2007</year>
<year>2009</year>
+ <year>2010</year>
<holder>Internet Systems Consortium, Inc. ("ISC")</holder>
</copyright>
<copyright>
@@ -69,6 +70,8 @@
<arg><option>-m <replaceable class="parameter">mode</replaceable></option></arg>
<arg><option>-M <replaceable class="parameter">mode</replaceable></option></arg>
<arg><option>-n <replaceable class="parameter">mode</replaceable></option></arg>
+ <arg><option>-o <replaceable class="parameter">filename</replaceable></option></arg>
+ <arg><option>-r <replaceable class="parameter">mode</replaceable></option></arg>
<arg><option>-s <replaceable class="parameter">style</replaceable></option></arg>
<arg><option>-S <replaceable class="parameter">mode</replaceable></option></arg>
<arg><option>-t <replaceable class="parameter">directory</replaceable></option></arg>
@@ -92,7 +95,7 @@
<arg><option>-k <replaceable class="parameter">mode</replaceable></option></arg>
<arg><option>-m <replaceable class="parameter">mode</replaceable></option></arg>
<arg><option>-n <replaceable class="parameter">mode</replaceable></option></arg>
- <arg><option>-o <replaceable class="parameter">filename</replaceable></option></arg>
+ <arg><option>-r <replaceable class="parameter">mode</replaceable></option></arg>
<arg><option>-s <replaceable class="parameter">style</replaceable></option></arg>
<arg><option>-t <replaceable class="parameter">directory</replaceable></option></arg>
<arg><option>-w <replaceable class="parameter">directory</replaceable></option></arg>
@@ -320,6 +323,19 @@
</varlistentry>
<varlistentry>
+ <term>-r <replaceable class="parameter">mode</replaceable></term>
+ <listitem>
+ <para>
+ Check for records that are treated as different by DNSSEC but
+ are semantically equal in plain DNS.
+ Possible modes are <command>"fail"</command>,
+ <command>"warn"</command> (default) and
+ <command>"ignore"</command>.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
<term>-s <replaceable class="parameter">style</replaceable></term>
<listitem>
<para>
diff --git a/contrib/bind9/bin/check/named-checkzone.html b/contrib/bind9/bin/check/named-checkzone.html
index 24f5c05..e0532af 100644
--- a/contrib/bind9/bin/check/named-checkzone.html
+++ b/contrib/bind9/bin/check/named-checkzone.html
@@ -1,5 +1,5 @@
<!--
- - Copyright (C) 2004-2007, 2009 Internet Systems Consortium, Inc. ("ISC")
+ - Copyright (C) 2004-2007, 2009, 2010 Internet Systems Consortium, Inc. ("ISC")
- Copyright (C) 2000-2002 Internet Software Consortium.
-
- Permission to use, copy, modify, and/or distribute this software for any
@@ -14,7 +14,7 @@
- OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
- PERFORMANCE OF THIS SOFTWARE.
-->
-<!-- $Id: named-checkzone.html,v 1.42.334.3 2009-11-11 01:56:22 tbox Exp $ -->
+<!-- $Id: named-checkzone.html,v 1.47 2010-01-17 01:14:02 tbox Exp $ -->
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
@@ -29,11 +29,11 @@
</div>
<div class="refsynopsisdiv">
<h2>Synopsis</h2>
-<div class="cmdsynopsis"><p><code class="command">named-checkzone</code> [<code class="option">-d</code>] [<code class="option">-h</code>] [<code class="option">-j</code>] [<code class="option">-q</code>] [<code class="option">-v</code>] [<code class="option">-c <em class="replaceable"><code>class</code></em></code>] [<code class="option">-f <em class="replaceable"><code>format</code></em></code>] [<code class="option">-F <em class="replaceable"><code>format</code></em></code>] [<code class="option">-i <em class="replaceable"><code>mode</code></em></code>] [<code class="option">-k <em class="replaceable"><code>mode</code></em></code>] [<code class="option">-m <em class="replaceable"><code>mode</code></em></code>] [<code class="option">-M <em class="replaceable"><code>mode</code></em></code>] [<code class="option">-n <em class="replaceable"><code>mode</code></em></code>] [<code class="option">-s <em class="replaceable"><code>style</code></em></code>] [<code class="option">-S <em class="replaceable"><code>mode</code></em></code>] [<code class="option">-t <em class="replaceable"><code>directory</code></em></code>] [<code class="option">-w <em class="replaceable"><code>directory</code></em></code>] [<code class="option">-D</code>] [<code class="option">-W <em class="replaceable"><code>mode</code></em></code>] {zonename} {filename}</p></div>
-<div class="cmdsynopsis"><p><code class="command">named-compilezone</code> [<code class="option">-d</code>] [<code class="option">-j</code>] [<code class="option">-q</code>] [<code class="option">-v</code>] [<code class="option">-c <em class="replaceable"><code>class</code></em></code>] [<code class="option">-C <em class="replaceable"><code>mode</code></em></code>] [<code class="option">-f <em class="replaceable"><code>format</code></em></code>] [<code class="option">-F <em class="replaceable"><code>format</code></em></code>] [<code class="option">-i <em class="replaceable"><code>mode</code></em></code>] [<code class="option">-k <em class="replaceable"><code>mode</code></em></code>] [<code class="option">-m <em class="replaceable"><code>mode</code></em></code>] [<code class="option">-n <em class="replaceable"><code>mode</code></em></code>] [<code class="option">-o <em class="replaceable"><code>filename</code></em></code>] [<code class="option">-s <em class="replaceable"><code>style</code></em></code>] [<code class="option">-t <em class="replaceable"><code>directory</code></em></code>] [<code class="option">-w <em class="replaceable"><code>directory</code></em></code>] [<code class="option">-D</code>] [<code class="option">-W <em class="replaceable"><code>mode</code></em></code>] {<code class="option">-o <em class="replaceable"><code>filename</code></em></code>} {zonename} {filename}</p></div>
+<div class="cmdsynopsis"><p><code class="command">named-checkzone</code> [<code class="option">-d</code>] [<code class="option">-h</code>] [<code class="option">-j</code>] [<code class="option">-q</code>] [<code class="option">-v</code>] [<code class="option">-c <em class="replaceable"><code>class</code></em></code>] [<code class="option">-f <em class="replaceable"><code>format</code></em></code>] [<code class="option">-F <em class="replaceable"><code>format</code></em></code>] [<code class="option">-i <em class="replaceable"><code>mode</code></em></code>] [<code class="option">-k <em class="replaceable"><code>mode</code></em></code>] [<code class="option">-m <em class="replaceable"><code>mode</code></em></code>] [<code class="option">-M <em class="replaceable"><code>mode</code></em></code>] [<code class="option">-n <em class="replaceable"><code>mode</code></em></code>] [<code class="option">-o <em class="replaceable"><code>filename</code></em></code>] [<code class="option">-r <em class="replaceable"><code>mode</code></em></code>] [<code class="option">-s <em class="replaceable"><code>style</code></em></code>] [<code class="option">-S <em class="replaceable"><code>mode</code></em></code>] [<code class="option">-t <em class="replaceable"><code>directory</code></em></code>] [<code class="option">-w <em class="replaceable"><code>directory</code></em></code>] [<code class="option">-D</code>] [<code class="option">-W <em class="replaceable"><code>mode</code></em></code>] {zonename} {filename}</p></div>
+<div class="cmdsynopsis"><p><code class="command">named-compilezone</code> [<code class="option">-d</code>] [<code class="option">-j</code>] [<code class="option">-q</code>] [<code class="option">-v</code>] [<code class="option">-c <em class="replaceable"><code>class</code></em></code>] [<code class="option">-C <em class="replaceable"><code>mode</code></em></code>] [<code class="option">-f <em class="replaceable"><code>format</code></em></code>] [<code class="option">-F <em class="replaceable"><code>format</code></em></code>] [<code class="option">-i <em class="replaceable"><code>mode</code></em></code>] [<code class="option">-k <em class="replaceable"><code>mode</code></em></code>] [<code class="option">-m <em class="replaceable"><code>mode</code></em></code>] [<code class="option">-n <em class="replaceable"><code>mode</code></em></code>] [<code class="option">-r <em class="replaceable"><code>mode</code></em></code>] [<code class="option">-s <em class="replaceable"><code>style</code></em></code>] [<code class="option">-t <em class="replaceable"><code>directory</code></em></code>] [<code class="option">-w <em class="replaceable"><code>directory</code></em></code>] [<code class="option">-D</code>] [<code class="option">-W <em class="replaceable"><code>mode</code></em></code>] {<code class="option">-o <em class="replaceable"><code>filename</code></em></code>} {zonename} {filename}</p></div>
</div>
<div class="refsect1" lang="en">
-<a name="id2543674"></a><h2>DESCRIPTION</h2>
+<a name="id2543694"></a><h2>DESCRIPTION</h2>
<p><span><strong class="command">named-checkzone</strong></span>
checks the syntax and integrity of a zone file. It performs the
same checks as <span><strong class="command">named</strong></span> does when loading a
@@ -53,7 +53,7 @@
</p>
</div>
<div class="refsect1" lang="en">
-<a name="id2543709"></a><h2>OPTIONS</h2>
+<a name="id2543730"></a><h2>OPTIONS</h2>
<div class="variablelist"><dl>
<dt><span class="term">-d</span></dt>
<dd><p>
@@ -177,6 +177,14 @@
write to standard out.
This is mandatory for <span><strong class="command">named-compilezone</strong></span>.
</p></dd>
+<dt><span class="term">-r <em class="replaceable"><code>mode</code></em></span></dt>
+<dd><p>
+ Check for records that are treated as different by DNSSEC but
+ are semantically equal in plain DNS.
+ Possible modes are <span><strong class="command">"fail"</strong></span>,
+ <span><strong class="command">"warn"</strong></span> (default) and
+ <span><strong class="command">"ignore"</strong></span>.
+ </p></dd>
<dt><span class="term">-s <em class="replaceable"><code>style</code></em></span></dt>
<dd><p>
Specify the style of the dumped zone file.
@@ -239,14 +247,14 @@
</dl></div>
</div>
<div class="refsect1" lang="en">
-<a name="id2544330"></a><h2>RETURN VALUES</h2>
+<a name="id2544377"></a><h2>RETURN VALUES</h2>
<p><span><strong class="command">named-checkzone</strong></span>
returns an exit status of 1 if
errors were detected and 0 otherwise.
</p>
</div>
<div class="refsect1" lang="en">
-<a name="id2544342"></a><h2>SEE ALSO</h2>
+<a name="id2544389"></a><h2>SEE ALSO</h2>
<p><span class="citerefentry"><span class="refentrytitle">named</span>(8)</span>,
<span class="citerefentry"><span class="refentrytitle">named-checkconf</span>(8)</span>,
<em class="citetitle">RFC 1035</em>,
@@ -254,7 +262,7 @@
</p>
</div>
<div class="refsect1" lang="en">
-<a name="id2544375"></a><h2>AUTHOR</h2>
+<a name="id2544422"></a><h2>AUTHOR</h2>
<p><span class="corpauthor">Internet Systems Consortium</span>
</p>
</div>
diff --git a/contrib/bind9/bin/confgen/Makefile.in b/contrib/bind9/bin/confgen/Makefile.in
new file mode 100644
index 0000000..da35879
--- /dev/null
+++ b/contrib/bind9/bin/confgen/Makefile.in
@@ -0,0 +1,101 @@
+# Copyright (C) 2009 Internet Systems Consortium, Inc. ("ISC")
+#
+# Permission to use, copy, modify, and/or 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 ISC DISCLAIMS ALL WARRANTIES WITH
+# REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+# AND FITNESS. IN NO EVENT SHALL ISC 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.
+
+# $Id: Makefile.in,v 1.8 2009-12-05 23:31:40 each Exp $
+
+srcdir = @srcdir@
+VPATH = @srcdir@
+top_srcdir = @top_srcdir@
+
+@BIND9_VERSION@
+
+@BIND9_MAKE_INCLUDES@
+
+CINCLUDES = -I${srcdir}/include ${ISC_INCLUDES} ${ISCCC_INCLUDES} \
+ ${ISCCFG_INCLUDES} ${DNS_INCLUDES} ${BIND9_INCLUDES}
+
+CDEFINES =
+CWARNINGS =
+
+ISCCFGLIBS = ../../lib/isccfg/libisccfg.@A@
+ISCCCLIBS = ../../lib/isccc/libisccc.@A@
+ISCLIBS = ../../lib/isc/libisc.@A@
+ISCNOSYMLIBS = ../../lib/isc/libisc-nosymtbl.@A@
+DNSLIBS = ../../lib/dns/libdns.@A@ @DNS_CRYPTO_LIBS@
+BIND9LIBS = ../../lib/bind9/libbind9.@A@
+
+ISCCFGDEPLIBS = ../../lib/isccfg/libisccfg.@A@
+ISCCCDEPLIBS = ../../lib/isccc/libisccc.@A@
+ISCDEPLIBS = ../../lib/isc/libisc.@A@
+DNSDEPLIBS = ../../lib/dns/libdns.@A@
+BIND9DEPLIBS = ../../lib/bind9/libbind9.@A@
+
+RNDCLIBS = ${ISCCFGLIBS} ${ISCCCLIBS} ${BIND9LIBS} ${DNSLIBS} ${ISCLIBS} @LIBS@
+RNDCDEPLIBS = ${ISCCFGDEPLIBS} ${ISCCCDEPLIBS} ${BIND9DEPLIBS} ${DNSDEPLIBS} ${ISCDEPLIBS}
+
+LIBS = ${DNSLIBS} ${ISCLIBS} @LIBS@
+
+NOSYMLIBS = ${DNSLIBS} ${ISCNOSYMLIBS} @LIBS@
+
+CONFDEPLIBS = ${DNSDEPLIBS} ${ISCDEPLIBS}
+
+SRCS= rndc-confgen.c ddns-confgen.c
+
+SUBDIRS = unix
+
+TARGETS = rndc-confgen@EXEEXT@ ddns-confgen@EXEEXT@
+
+MANPAGES = rndc-confgen.8 ddns-confgen.8
+
+HTMLPAGES = rndc-confgen.html ddns-confgen.html
+
+MANOBJS = ${MANPAGES} ${HTMLPAGES}
+
+UOBJS = unix/os.@O@
+
+@BIND9_MAKE_RULES@
+
+rndc-confgen.@O@: rndc-confgen.c
+ ${LIBTOOL_MODE_COMPILE} ${CC} ${ALL_CFLAGS} \
+ -DRNDC_KEYFILE=\"${sysconfdir}/rndc.key\" \
+ -c ${srcdir}/rndc-confgen.c
+
+ddns-confgen.@O@: ddns-confgen.c
+ ${LIBTOOL_MODE_COMPILE} ${CC} ${ALL_CFLAGS} -c ${srcdir}/ddns-confgen.c
+
+rndc-confgen@EXEEXT@: rndc-confgen.@O@ util.@O@ keygen.@O@ ${UOBJS} ${CONFDEPLIBS}
+ export BASEOBJS="rndc-confgen.@O@ util.@O@ keygen.@O@ ${UOBJS}"; \
+ ${FINALBUILDCMD}
+
+ddns-confgen@EXEEXT@: ddns-confgen.@O@ util.@O@ keygen.@O@ ${UOBJS} ${CONFDEPLIBS}
+ export BASEOBJS="ddns-confgen.@O@ util.@O@ keygen.@O@ ${UOBJS}"; \
+ ${FINALBUILDCMD}
+
+doc man:: ${MANOBJS}
+
+docclean manclean maintainer-clean::
+ rm -f ${MANOBJS}
+
+installdirs:
+ $(SHELL) ${top_srcdir}/mkinstalldirs ${DESTDIR}${sbindir}
+ $(SHELL) ${top_srcdir}/mkinstalldirs ${DESTDIR}${mandir}/man8
+
+install:: rndc-confgen@EXEEXT@ ddns-confgen@EXEEXT@ installdirs
+ ${LIBTOOL_MODE_INSTALL} ${INSTALL_PROGRAM} rndc-confgen@EXEEXT@ ${DESTDIR}${sbindir}
+ ${LIBTOOL_MODE_INSTALL} ${INSTALL_PROGRAM} ddns-confgen@EXEEXT@ ${DESTDIR}${sbindir}
+ ${INSTALL_DATA} ${srcdir}/rndc-confgen.8 ${DESTDIR}${mandir}/man8
+ ${INSTALL_DATA} ${srcdir}/ddns-confgen.8 ${DESTDIR}${mandir}/man8
+
+clean distclean maintainer-clean::
+ rm -f ${TARGETS}
diff --git a/contrib/bind9/bin/confgen/ddns-confgen.8 b/contrib/bind9/bin/confgen/ddns-confgen.8
new file mode 100644
index 0000000..d69af39
--- /dev/null
+++ b/contrib/bind9/bin/confgen/ddns-confgen.8
@@ -0,0 +1,143 @@
+.\" Copyright (C) 2009 Internet Systems Consortium, Inc. ("ISC")
+.\"
+.\" Permission to use, copy, modify, and/or 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 ISC DISCLAIMS ALL WARRANTIES WITH
+.\" REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+.\" AND FITNESS. IN NO EVENT SHALL ISC 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.
+.\"
+.\" $Id: ddns-confgen.8,v 1.10 2009-09-19 01:14:52 tbox Exp $
+.\"
+.hy 0
+.ad l
+.\" Title: ddns\-confgen
+.\" Author:
+.\" Generator: DocBook XSL Stylesheets v1.71.1 <http://docbook.sf.net/>
+.\" Date: Jan 29, 2009
+.\" Manual: BIND9
+.\" Source: BIND9
+.\"
+.TH "DDNS\-CONFGEN" "8" "Jan 29, 2009" "BIND9" "BIND9"
+.\" disable hyphenation
+.nh
+.\" disable justification (adjust text to left margin only)
+.ad l
+.SH "NAME"
+ddns\-confgen \- ddns key generation tool
+.SH "SYNOPSIS"
+.HP 13
+\fBddns\-confgen\fR [\fB\-a\ \fR\fB\fIalgorithm\fR\fR] [\fB\-h\fR] [\fB\-k\ \fR\fB\fIkeyname\fR\fR] [\fB\-r\ \fR\fB\fIrandomfile\fR\fR] [\-s\ \fIname\fR | \-z\ \fIzone\fR] [\fB\-q\fR] [name]
+.SH "DESCRIPTION"
+.PP
+\fBddns\-confgen\fR
+generates a key for use by
+\fBnsupdate\fR
+and
+\fBnamed\fR. It simplifies configuration of dynamic zones by generating a key and providing the
+\fBnsupdate\fR
+and
+\fBnamed.conf\fR
+syntax that will be needed to use it, including an example
+\fBupdate\-policy\fR
+statement.
+.PP
+If a domain name is specified on the command line, it will be used in the name of the generated key and in the sample
+\fBnamed.conf\fR
+syntax. For example,
+\fBddns\-confgen example.com\fR
+would generate a key called "ddns\-key.example.com", and sample
+\fBnamed.conf\fR
+command that could be used in the zone definition for "example.com".
+.PP
+Note that
+\fBnamed\fR
+itself can configure a local DDNS key for use with
+\fBnsupdate \-l\fR.
+\fBddns\-confgen\fR
+is only needed when a more elaborate configuration is required: for instance, if
+\fBnsupdate\fR
+is to be used from a remote system.
+.SH "OPTIONS"
+.PP
+\-a \fIalgorithm\fR
+.RS 4
+Specifies the algorithm to use for the TSIG key. Available choices are: hmac\-md5, hmac\-sha1, hmac\-sha224, hmac\-sha256, hmac\-sha384 and hmac\-sha512. The default is hmac\-sha256.
+.RE
+.PP
+\-h
+.RS 4
+Prints a short summary of the options and arguments to
+\fBddns\-confgen\fR.
+.RE
+.PP
+\-k \fIkeyname\fR
+.RS 4
+Specifies the key name of the DDNS authentication key. The default is
+\fBddns\-key\fR
+when neither the
+\fB\-s\fR
+nor
+\fB\-z\fR
+option is specified; otherwise, the default is
+\fBddns\-key\fR
+as a separate label followed by the argument of the option, e.g.,
+\fBddns\-key.example.com.\fR
+The key name must have the format of a valid domain name, consisting of letters, digits, hyphens and periods.
+.RE
+.PP
+\-q
+.RS 4
+Quiet mode: Print only the key, with no explanatory text or usage examples.
+.RE
+.PP
+\-r \fIrandomfile\fR
+.RS 4
+Specifies a source of random data for generating the authorization. If the operating system does not provide a
+\fI/dev/random\fR
+or equivalent device, the default source of randomness is keyboard input.
+\fIrandomdev\fR
+specifies the name of a character device or file containing random data to be used instead of the default. The special value
+\fIkeyboard\fR
+indicates that keyboard input should be used.
+.RE
+.PP
+\-s \fIname\fR
+.RS 4
+Single host mode: The example
+\fBnamed.conf\fR
+text shows how to set an update policy for the specified
+\fIname\fR
+using the "name" nametype. The default key name is ddns\-key.\fIname\fR. Note that the "self" nametype cannot be used, since the name to be updated may differ from the key name. This option cannot be used with the
+\fB\-z\fR
+option.
+.RE
+.PP
+\-z \fIzone\fR
+.RS 4
+zone mode: The example
+\fBnamed.conf\fR
+text shows how to set an update policy for the specified
+\fIzone\fR
+using the "zonesub" nametype, allowing updates to all subdomain names within that
+\fIzone\fR. This option cannot be used with the
+\fB\-s\fR
+option.
+.RE
+.SH "SEE ALSO"
+.PP
+\fBnsupdate\fR(1),
+\fBnamed.conf\fR(5),
+\fBnamed\fR(8),
+BIND 9 Administrator Reference Manual.
+.SH "AUTHOR"
+.PP
+Internet Systems Consortium
+.SH "COPYRIGHT"
+Copyright \(co 2009 Internet Systems Consortium, Inc. ("ISC")
+.br
diff --git a/contrib/bind9/bin/confgen/ddns-confgen.c b/contrib/bind9/bin/confgen/ddns-confgen.c
new file mode 100644
index 0000000..814a565
--- /dev/null
+++ b/contrib/bind9/bin/confgen/ddns-confgen.c
@@ -0,0 +1,257 @@
+/*
+ * Copyright (C) 2009 Internet Systems Consortium, Inc. ("ISC")
+ *
+ * Permission to use, copy, modify, and/or 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 ISC DISCLAIMS ALL WARRANTIES WITH
+ * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+ * AND FITNESS. IN NO EVENT SHALL ISC 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.
+ */
+
+/* $Id: ddns-confgen.c,v 1.9 2009-09-29 15:06:05 fdupont Exp $ */
+
+/*! \file */
+
+/**
+ * ddns-confgen generates configuration files for dynamic DNS. It can
+ * be used as a convenient alternative to writing the ddns.key file
+ * and the corresponding key and update-policy statements in named.conf.
+ */
+
+#include <config.h>
+
+#include <stdlib.h>
+#include <stdarg.h>
+
+#include <isc/assertions.h>
+#include <isc/base64.h>
+#include <isc/buffer.h>
+#include <isc/commandline.h>
+#include <isc/entropy.h>
+#include <isc/file.h>
+#include <isc/keyboard.h>
+#include <isc/mem.h>
+#include <isc/net.h>
+#include <isc/print.h>
+#include <isc/result.h>
+#include <isc/string.h>
+#include <isc/time.h>
+#include <isc/util.h>
+
+#include <dns/keyvalues.h>
+#include <dns/name.h>
+
+#include <dst/dst.h>
+#include <confgen/os.h>
+
+#include "util.h"
+#include "keygen.h"
+
+#define DEFAULT_KEYNAME "ddns-key"
+
+static char program[256];
+const char *progname;
+
+isc_boolean_t verbose = ISC_FALSE;
+
+ISC_PLATFORM_NORETURN_PRE static void
+usage(int status) ISC_PLATFORM_NORETURN_POST;
+
+static void
+usage(int status) {
+
+ fprintf(stderr, "\
+Usage:\n\
+ %s [-a alg] [-k keyname] [-r randomfile] [-q] [-s name | -z zone]\n\
+ -a alg: algorithm (default hmac-sha256)\n\
+ -k keyname: name of the key as it will be used in named.conf\n\
+ -r randomfile: source of random data (use \"keyboard\" for key timing)\n\
+ -s name: domain name to be updated using the created key\n\
+ -z zone: name of the zone as it will be used in named.conf\n\
+ -q: quiet mode: print the key, with no explanatory text\n",
+ progname);
+
+ exit (status);
+}
+
+int
+main(int argc, char **argv) {
+ isc_boolean_t show_final_mem = ISC_FALSE;
+ isc_boolean_t quiet = ISC_FALSE;
+ isc_buffer_t key_txtbuffer;
+ char key_txtsecret[256];
+ isc_mem_t *mctx = NULL;
+ isc_result_t result = ISC_R_SUCCESS;
+ const char *randomfile = NULL;
+ const char *keyname = NULL;
+ const char *zone = NULL;
+ const char *self_domain = NULL;
+ char *keybuf = NULL;
+ dns_secalg_t alg = DST_ALG_HMACSHA256;
+ const char *algname = alg_totext(alg);
+ int keysize = 256;
+ int len = 0;
+ int ch;
+
+ result = isc_file_progname(*argv, program, sizeof(program));
+ if (result != ISC_R_SUCCESS)
+ memcpy(program, "ddns-confgen", 13);
+ progname = program;
+
+ isc_commandline_errprint = ISC_FALSE;
+
+ while ((ch = isc_commandline_parse(argc, argv,
+ "a:hk:Mmr:qs:Vy:z:")) != -1) {
+ switch (ch) {
+ case 'a':
+ algname = isc_commandline_argument;
+ alg = alg_fromtext(algname);
+ if (alg == DST_ALG_UNKNOWN)
+ fatal("Unsupported algorithm '%s'", algname);
+ keysize = alg_bits(alg);
+ break;
+ case 'h':
+ usage(0);
+ case 'k':
+ case 'y':
+ keyname = isc_commandline_argument;
+ break;
+ case 'M':
+ isc_mem_debugging = ISC_MEM_DEBUGTRACE;
+ break;
+ case 'm':
+ show_final_mem = ISC_TRUE;
+ break;
+ case 'q':
+ quiet = ISC_TRUE;
+ break;
+ case 'r':
+ randomfile = isc_commandline_argument;
+ break;
+ case 's':
+ self_domain = isc_commandline_argument;
+ break;
+ case 'V':
+ verbose = ISC_TRUE;
+ break;
+ case 'z':
+ zone = isc_commandline_argument;
+ break;
+ case '?':
+ if (isc_commandline_option != '?') {
+ fprintf(stderr, "%s: invalid argument -%c\n",
+ program, isc_commandline_option);
+ usage(1);
+ } else
+ usage(0);
+ break;
+ default:
+ fprintf(stderr, "%s: unhandled option -%c\n",
+ program, isc_commandline_option);
+ exit(1);
+ }
+ }
+
+ argc -= isc_commandline_index;
+ argv += isc_commandline_index;
+
+ if (self_domain != NULL && zone != NULL)
+ usage(1); /* -s and -z cannot coexist */
+
+ if (argc > 0)
+ usage(1);
+
+ DO("create memory context", isc_mem_create(0, 0, &mctx));
+
+ if (keyname == NULL) {
+ const char *suffix = NULL;
+
+ keyname = DEFAULT_KEYNAME;
+ if (self_domain != NULL)
+ suffix = self_domain;
+ else if (zone != NULL)
+ suffix = zone;
+ if (suffix != NULL) {
+ len = strlen(keyname) + strlen(suffix) + 2;
+ keybuf = isc_mem_get(mctx, len);
+ if (keybuf == NULL)
+ fatal("failed to allocate memory for keyname");
+ snprintf(keybuf, len, "%s.%s", keyname, suffix);
+ keyname = (const char *) keybuf;
+ }
+ }
+
+ isc_buffer_init(&key_txtbuffer, &key_txtsecret, sizeof(key_txtsecret));
+
+ generate_key(mctx, randomfile, alg, keysize, &key_txtbuffer);
+
+
+ if (!quiet)
+ printf("\
+# To activate this key, place the following in named.conf, and\n\
+# in a separate keyfile on the system or systems from which nsupdate\n\
+# will be run:\n");
+
+ printf("\
+key \"%s\" {\n\
+ algorithm %s;\n\
+ secret \"%.*s\";\n\
+};\n",
+ keyname, algname,
+ (int)isc_buffer_usedlength(&key_txtbuffer),
+ (char *)isc_buffer_base(&key_txtbuffer));
+
+ if (!quiet) {
+ if (self_domain != NULL) {
+ printf("\n\
+# Then, in the \"zone\" statement for the zone containing the\n\
+# name \"%s\", place an \"update-policy\" statement\n\
+# like this one, adjusted as needed for your preferred permissions:\n\
+update-policy {\n\
+ grant %s name %s ANY;\n\
+};\n",
+ self_domain, keyname, self_domain);
+ } else if (zone != NULL) {
+ printf("\n\
+# Then, in the \"zone\" definition statement for \"%s\",\n\
+# place an \"update-policy\" statement like this one, adjusted as \n\
+# needed for your preferred permissions:\n\
+update-policy {\n\
+ grant %s zonesub ANY;\n\
+};\n",
+ zone, keyname);
+ } else {
+ printf("\n\
+# Then, in the \"zone\" statement for each zone you wish to dynamically\n\
+# update, place an \"update-policy\" statement granting update permission\n\
+# to this key. For example, the following statement grants this key\n\
+# permission to update any name within the zone:\n\
+update-policy {\n\
+ grant %s zonesub ANY;\n\
+};\n",
+ keyname);
+ }
+
+ printf("\n\
+# After the keyfile has been placed, the following command will\n\
+# execute nsupdate using this key:\n\
+nsupdate -k <keyfile>\n");
+
+ }
+
+ if (keybuf != NULL)
+ isc_mem_put(mctx, keybuf, len);
+
+ if (show_final_mem)
+ isc_mem_stats(mctx, stderr);
+
+ isc_mem_destroy(&mctx);
+
+ return (0);
+}
diff --git a/contrib/bind9/bin/confgen/ddns-confgen.docbook b/contrib/bind9/bin/confgen/ddns-confgen.docbook
new file mode 100644
index 0000000..2b3e1c0
--- /dev/null
+++ b/contrib/bind9/bin/confgen/ddns-confgen.docbook
@@ -0,0 +1,218 @@
+<!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN"
+ "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd"
+ [<!ENTITY mdash "&#8212;">]>
+<!--
+ - Copyright (C) 2009 Internet Systems Consortium, Inc. ("ISC")
+ -
+ - Permission to use, copy, modify, and/or 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 ISC DISCLAIMS ALL WARRANTIES WITH
+ - REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+ - AND FITNESS. IN NO EVENT SHALL ISC 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.
+-->
+
+<!-- $Id: ddns-confgen.docbook,v 1.6 2009-09-18 22:08:55 fdupont Exp $ -->
+<refentry id="man.ddns-confgen">
+ <refentryinfo>
+ <date>Jan 29, 2009</date>
+ </refentryinfo>
+
+ <refmeta>
+ <refentrytitle><application>ddns-confgen</application></refentrytitle>
+ <manvolnum>8</manvolnum>
+ <refmiscinfo>BIND9</refmiscinfo>
+ </refmeta>
+
+ <refnamediv>
+ <refname><application>ddns-confgen</application></refname>
+ <refpurpose>ddns key generation tool</refpurpose>
+ </refnamediv>
+
+ <docinfo>
+ <copyright>
+ <year>2009</year>
+ <holder>Internet Systems Consortium, Inc. ("ISC")</holder>
+ </copyright>
+ </docinfo>
+
+ <refsynopsisdiv>
+ <cmdsynopsis>
+ <command>ddns-confgen</command>
+ <arg><option>-a <replaceable class="parameter">algorithm</replaceable></option></arg>
+ <arg><option>-h</option></arg>
+ <arg><option>-k <replaceable class="parameter">keyname</replaceable></option></arg>
+ <arg><option>-r <replaceable class="parameter">randomfile</replaceable></option></arg>
+ <group>
+ <arg choice="plain">-s <replaceable class="parameter">name</replaceable></arg>
+ <arg choice="plain">-z <replaceable class="parameter">zone</replaceable></arg>
+ </group>
+ <arg><option>-q</option></arg>
+ <arg choice="opt">name</arg>
+ </cmdsynopsis>
+ </refsynopsisdiv>
+
+ <refsect1>
+ <title>DESCRIPTION</title>
+ <para><command>ddns-confgen</command>
+ generates a key for use by <command>nsupdate</command>
+ and <command>named</command>. It simplifies configuration
+ of dynamic zones by generating a key and providing the
+ <command>nsupdate</command> and <command>named.conf</command>
+ syntax that will be needed to use it, including an example
+ <command>update-policy</command> statement.
+ </para>
+
+ <para>
+ If a domain name is specified on the command line, it will
+ be used in the name of the generated key and in the sample
+ <command>named.conf</command> syntax. For example,
+ <command>ddns-confgen example.com</command> would
+ generate a key called "ddns-key.example.com", and sample
+ <command>named.conf</command> command that could be used
+ in the zone definition for "example.com".
+ </para>
+
+ <para>
+ Note that <command>named</command> itself can configure a
+ local DDNS key for use with <command>nsupdate -l</command>.
+ <command>ddns-confgen</command> is only needed when a
+ more elaborate configuration is required: for instance, if
+ <command>nsupdate</command> is to be used from a remote system.
+ </para>
+ </refsect1>
+
+ <refsect1>
+ <title>OPTIONS</title>
+
+ <variablelist>
+ <varlistentry>
+ <term>-a <replaceable class="parameter">algorithm</replaceable></term>
+ <listitem>
+ <para>
+ Specifies the algorithm to use for the TSIG key. Available
+ choices are: hmac-md5, hmac-sha1, hmac-sha224, hmac-sha256,
+ hmac-sha384 and hmac-sha512. The default is hmac-sha256.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>-h</term>
+ <listitem>
+ <para>
+ Prints a short summary of the options and arguments to
+ <command>ddns-confgen</command>.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>-k <replaceable class="parameter">keyname</replaceable></term>
+ <listitem>
+ <para>
+ Specifies the key name of the DDNS authentication key.
+ The default is <constant>ddns-key</constant> when neither
+ the <option>-s</option> nor <option>-z</option> option is
+ specified; otherwise, the default
+ is <constant>ddns-key</constant> as a separate label
+ followed by the argument of the option, e.g.,
+ <constant>ddns-key.example.com.</constant>
+ The key name must have the format of a valid domain name,
+ consisting of letters, digits, hyphens and periods.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>-q</term>
+ <listitem>
+ <para>
+ Quiet mode: Print only the key, with no explanatory text or
+ usage examples.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>-r <replaceable class="parameter">randomfile</replaceable></term>
+ <listitem>
+ <para>
+ Specifies a source of random data for generating the
+ authorization. If the operating system does not provide a
+ <filename>/dev/random</filename> or equivalent device, the
+ default source of randomness is keyboard input.
+ <filename>randomdev</filename> specifies the name of a
+ character device or file containing random data to be used
+ instead of the default. The special value
+ <filename>keyboard</filename> indicates that keyboard input
+ should be used.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>-s <replaceable class="parameter">name</replaceable></term>
+ <listitem>
+ <para>
+ Single host mode: The example <command>named.conf</command> text
+ shows how to set an update policy for the specified
+ <replaceable class="parameter">name</replaceable>
+ using the "name" nametype.
+ The default key name is
+ ddns-key.<replaceable class="parameter">name</replaceable>.
+ Note that the "self" nametype cannot be used, since
+ the name to be updated may differ from the key name.
+ This option cannot be used with the <option>-z</option> option.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>-z <replaceable class="parameter">zone</replaceable></term>
+ <listitem>
+ <para>
+ zone mode: The example <command>named.conf</command> text
+ shows how to set an update policy for the specified
+ <replaceable class="parameter">zone</replaceable>
+ using the "zonesub" nametype, allowing updates to all subdomain
+ names within
+ that <replaceable class="parameter">zone</replaceable>.
+ This option cannot be used with the <option>-s</option> option.
+ </para>
+ </listitem>
+ </varlistentry>
+ </variablelist>
+ </refsect1>
+
+ <refsect1>
+ <title>SEE ALSO</title>
+ <para><citerefentry>
+ <refentrytitle>nsupdate</refentrytitle><manvolnum>1</manvolnum>
+ </citerefentry>,
+ <citerefentry>
+ <refentrytitle>named.conf</refentrytitle><manvolnum>5</manvolnum>
+ </citerefentry>,
+ <citerefentry>
+ <refentrytitle>named</refentrytitle><manvolnum>8</manvolnum>
+ </citerefentry>,
+ <citetitle>BIND 9 Administrator Reference Manual</citetitle>.
+ </para>
+ </refsect1>
+
+ <refsect1>
+ <title>AUTHOR</title>
+ <para><corpauthor>Internet Systems Consortium</corpauthor>
+ </para>
+ </refsect1>
+
+</refentry><!--
+ - Local variables:
+ - mode: sgml
+ - End:
+-->
diff --git a/contrib/bind9/bin/confgen/ddns-confgen.html b/contrib/bind9/bin/confgen/ddns-confgen.html
new file mode 100644
index 0000000..17c3f26
--- /dev/null
+++ b/contrib/bind9/bin/confgen/ddns-confgen.html
@@ -0,0 +1,141 @@
+<!--
+ - Copyright (C) 2009 Internet Systems Consortium, Inc. ("ISC")
+ -
+ - Permission to use, copy, modify, and/or 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 ISC DISCLAIMS ALL WARRANTIES WITH
+ - REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+ - AND FITNESS. IN NO EVENT SHALL ISC 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.
+-->
+<!-- $Id: ddns-confgen.html,v 1.10 2009-09-19 01:14:52 tbox Exp $ -->
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
+<title>ddns-confgen</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.71.1">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"><div class="refentry" lang="en">
+<a name="man.ddns-confgen"></a><div class="titlepage"></div>
+<div class="refnamediv">
+<h2>Name</h2>
+<p><span class="application">ddns-confgen</span> &#8212; ddns key generation tool</p>
+</div>
+<div class="refsynopsisdiv">
+<h2>Synopsis</h2>
+<div class="cmdsynopsis"><p><code class="command">ddns-confgen</code> [<code class="option">-a <em class="replaceable"><code>algorithm</code></em></code>] [<code class="option">-h</code>] [<code class="option">-k <em class="replaceable"><code>keyname</code></em></code>] [<code class="option">-r <em class="replaceable"><code>randomfile</code></em></code>] [ -s <em class="replaceable"><code>name</code></em> | -z <em class="replaceable"><code>zone</code></em> ] [<code class="option">-q</code>] [name]</p></div>
+</div>
+<div class="refsect1" lang="en">
+<a name="id2543395"></a><h2>DESCRIPTION</h2>
+<p><span><strong class="command">ddns-confgen</strong></span>
+ generates a key for use by <span><strong class="command">nsupdate</strong></span>
+ and <span><strong class="command">named</strong></span>. It simplifies configuration
+ of dynamic zones by generating a key and providing the
+ <span><strong class="command">nsupdate</strong></span> and <span><strong class="command">named.conf</strong></span>
+ syntax that will be needed to use it, including an example
+ <span><strong class="command">update-policy</strong></span> statement.
+ </p>
+<p>
+ If a domain name is specified on the command line, it will
+ be used in the name of the generated key and in the sample
+ <span><strong class="command">named.conf</strong></span> syntax. For example,
+ <span><strong class="command">ddns-confgen example.com</strong></span> would
+ generate a key called "ddns-key.example.com", and sample
+ <span><strong class="command">named.conf</strong></span> command that could be used
+ in the zone definition for "example.com".
+ </p>
+<p>
+ Note that <span><strong class="command">named</strong></span> itself can configure a
+ local DDNS key for use with <span><strong class="command">nsupdate -l</strong></span>.
+ <span><strong class="command">ddns-confgen</strong></span> is only needed when a
+ more elaborate configuration is required: for instance, if
+ <span><strong class="command">nsupdate</strong></span> is to be used from a remote system.
+ </p>
+</div>
+<div class="refsect1" lang="en">
+<a name="id2543454"></a><h2>OPTIONS</h2>
+<div class="variablelist"><dl>
+<dt><span class="term">-a <em class="replaceable"><code>algorithm</code></em></span></dt>
+<dd><p>
+ Specifies the algorithm to use for the TSIG key. Available
+ choices are: hmac-md5, hmac-sha1, hmac-sha224, hmac-sha256,
+ hmac-sha384 and hmac-sha512. The default is hmac-sha256.
+ </p></dd>
+<dt><span class="term">-h</span></dt>
+<dd><p>
+ Prints a short summary of the options and arguments to
+ <span><strong class="command">ddns-confgen</strong></span>.
+ </p></dd>
+<dt><span class="term">-k <em class="replaceable"><code>keyname</code></em></span></dt>
+<dd><p>
+ Specifies the key name of the DDNS authentication key.
+ The default is <code class="constant">ddns-key</code> when neither
+ the <code class="option">-s</code> nor <code class="option">-z</code> option is
+ specified; otherwise, the default
+ is <code class="constant">ddns-key</code> as a separate label
+ followed by the argument of the option, e.g.,
+ <code class="constant">ddns-key.example.com.</code>
+ The key name must have the format of a valid domain name,
+ consisting of letters, digits, hyphens and periods.
+ </p></dd>
+<dt><span class="term">-q</span></dt>
+<dd><p>
+ Quiet mode: Print only the key, with no explanatory text or
+ usage examples.
+ </p></dd>
+<dt><span class="term">-r <em class="replaceable"><code>randomfile</code></em></span></dt>
+<dd><p>
+ Specifies a source of random data for generating the
+ authorization. If the operating system does not provide a
+ <code class="filename">/dev/random</code> or equivalent device, the
+ default source of randomness is keyboard input.
+ <code class="filename">randomdev</code> specifies the name of a
+ character device or file containing random data to be used
+ instead of the default. The special value
+ <code class="filename">keyboard</code> indicates that keyboard input
+ should be used.
+ </p></dd>
+<dt><span class="term">-s <em class="replaceable"><code>name</code></em></span></dt>
+<dd><p>
+ Single host mode: The example <span><strong class="command">named.conf</strong></span> text
+ shows how to set an update policy for the specified
+ <em class="replaceable"><code>name</code></em>
+ using the "name" nametype.
+ The default key name is
+ ddns-key.<em class="replaceable"><code>name</code></em>.
+ Note that the "self" nametype cannot be used, since
+ the name to be updated may differ from the key name.
+ This option cannot be used with the <code class="option">-z</code> option.
+ </p></dd>
+<dt><span class="term">-z <em class="replaceable"><code>zone</code></em></span></dt>
+<dd><p>
+ zone mode: The example <span><strong class="command">named.conf</strong></span> text
+ shows how to set an update policy for the specified
+ <em class="replaceable"><code>zone</code></em>
+ using the "zonesub" nametype, allowing updates to all subdomain
+ names within
+ that <em class="replaceable"><code>zone</code></em>.
+ This option cannot be used with the <code class="option">-s</code> option.
+ </p></dd>
+</dl></div>
+</div>
+<div class="refsect1" lang="en">
+<a name="id2543642"></a><h2>SEE ALSO</h2>
+<p><span class="citerefentry"><span class="refentrytitle">nsupdate</span>(1)</span>,
+ <span class="citerefentry"><span class="refentrytitle">named.conf</span>(5)</span>,
+ <span class="citerefentry"><span class="refentrytitle">named</span>(8)</span>,
+ <em class="citetitle">BIND 9 Administrator Reference Manual</em>.
+ </p>
+</div>
+<div class="refsect1" lang="en">
+<a name="id2543681"></a><h2>AUTHOR</h2>
+<p><span class="corpauthor">Internet Systems Consortium</span>
+ </p>
+</div>
+</div></body>
+</html>
diff --git a/contrib/bind9/bin/confgen/include/confgen/os.h b/contrib/bind9/bin/confgen/include/confgen/os.h
new file mode 100644
index 0000000..bf80f00
--- /dev/null
+++ b/contrib/bind9/bin/confgen/include/confgen/os.h
@@ -0,0 +1,39 @@
+/*
+ * Copyright (C) 2009 Internet Systems Consortium, Inc. ("ISC")
+ *
+ * Permission to use, copy, modify, and/or 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 ISC DISCLAIMS ALL WARRANTIES WITH
+ * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+ * AND FITNESS. IN NO EVENT SHALL ISC 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.
+ */
+
+/* $Id: os.h,v 1.3 2009-06-11 23:47:55 tbox Exp $ */
+
+/*! \file */
+
+#ifndef RNDC_OS_H
+#define RNDC_OS_H 1
+
+#include <isc/lang.h>
+#include <stdio.h>
+
+ISC_LANG_BEGINDECLS
+
+int set_user(FILE *fd, const char *user);
+/*%<
+ * Set the owner of the file referenced by 'fd' to 'user'.
+ * Returns:
+ * 0 success
+ * -1 insufficient permissions, or 'user' does not exist.
+ */
+
+ISC_LANG_ENDDECLS
+
+#endif
diff --git a/contrib/bind9/bin/confgen/keygen.c b/contrib/bind9/bin/confgen/keygen.c
new file mode 100644
index 0000000..c259e7e
--- /dev/null
+++ b/contrib/bind9/bin/confgen/keygen.c
@@ -0,0 +1,218 @@
+/*
+ * Copyright (C) 2009 Internet Systems Consortium, Inc. ("ISC")
+ *
+ * Permission to use, copy, modify, and/or 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 ISC DISCLAIMS ALL WARRANTIES WITH
+ * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+ * AND FITNESS. IN NO EVENT SHALL ISC 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.
+ */
+
+/* $Id: keygen.c,v 1.4 2009-11-12 14:02:38 marka Exp $ */
+
+/*! \file */
+
+#include <config.h>
+
+#include <stdlib.h>
+#include <stdarg.h>
+
+#include <isc/base64.h>
+#include <isc/buffer.h>
+#include <isc/entropy.h>
+#include <isc/file.h>
+#include <isc/keyboard.h>
+#include <isc/mem.h>
+#include <isc/result.h>
+#include <isc/string.h>
+
+#include <dns/keyvalues.h>
+#include <dns/name.h>
+
+#include <dst/dst.h>
+#include <confgen/os.h>
+
+#include "util.h"
+#include "keygen.h"
+
+/*%
+ * Convert algorithm type to string.
+ */
+const char *
+alg_totext(dns_secalg_t alg) {
+ switch (alg) {
+ case DST_ALG_HMACMD5:
+ return "hmac-md5";
+ case DST_ALG_HMACSHA1:
+ return "hmac-sha1";
+ case DST_ALG_HMACSHA224:
+ return "hmac-sha224";
+ case DST_ALG_HMACSHA256:
+ return "hmac-sha256";
+ case DST_ALG_HMACSHA384:
+ return "hmac-sha384";
+ case DST_ALG_HMACSHA512:
+ return "hmac-sha512";
+ default:
+ return "(unknown)";
+ }
+}
+
+/*%
+ * Convert string to algorithm type.
+ */
+dns_secalg_t
+alg_fromtext(const char *name) {
+ if (strcmp(name, "hmac-md5") == 0)
+ return DST_ALG_HMACMD5;
+ if (strcmp(name, "hmac-sha1") == 0)
+ return DST_ALG_HMACSHA1;
+ if (strcmp(name, "hmac-sha224") == 0)
+ return DST_ALG_HMACSHA224;
+ if (strcmp(name, "hmac-sha256") == 0)
+ return DST_ALG_HMACSHA256;
+ if (strcmp(name, "hmac-sha384") == 0)
+ return DST_ALG_HMACSHA384;
+ if (strcmp(name, "hmac-sha512") == 0)
+ return DST_ALG_HMACSHA512;
+ return DST_ALG_UNKNOWN;
+}
+
+/*%
+ * Return default keysize for a given algorithm type.
+ */
+int
+alg_bits(dns_secalg_t alg) {
+ switch (alg) {
+ case DST_ALG_HMACMD5:
+ return 128;
+ case DST_ALG_HMACSHA1:
+ return 160;
+ case DST_ALG_HMACSHA224:
+ return 224;
+ case DST_ALG_HMACSHA256:
+ return 256;
+ case DST_ALG_HMACSHA384:
+ return 384;
+ case DST_ALG_HMACSHA512:
+ return 512;
+ default:
+ return 0;
+ }
+}
+
+/*%
+ * Generate a key of size 'keysize' using entropy source 'randomfile',
+ * and place it in 'key_txtbuffer'
+ */
+void
+generate_key(isc_mem_t *mctx, const char *randomfile, dns_secalg_t alg,
+ int keysize, isc_buffer_t *key_txtbuffer) {
+ isc_result_t result = ISC_R_SUCCESS;
+ isc_entropysource_t *entropy_source = NULL;
+ int open_keyboard = ISC_ENTROPY_KEYBOARDMAYBE;
+ int entropy_flags = 0;
+ isc_entropy_t *ectx = NULL;
+ isc_buffer_t key_rawbuffer;
+ isc_region_t key_rawregion;
+ char key_rawsecret[64];
+ dst_key_t *key = NULL;
+
+ switch (alg) {
+ case DST_ALG_HMACMD5:
+ if (keysize < 1 || keysize > 512)
+ fatal("keysize %d out of range (must be 1-512)\n",
+ keysize);
+ break;
+ case DST_ALG_HMACSHA256:
+ if (keysize < 1 || keysize > 256)
+ fatal("keysize %d out of range (must be 1-256)\n",
+ keysize);
+ break;
+ default:
+ fatal("unsupported algorithm %d\n", alg);
+ }
+
+
+ DO("create entropy context", isc_entropy_create(mctx, &ectx));
+
+ if (randomfile != NULL && strcmp(randomfile, "keyboard") == 0) {
+ randomfile = NULL;
+ open_keyboard = ISC_ENTROPY_KEYBOARDYES;
+ }
+ DO("start entropy source", isc_entropy_usebestsource(ectx,
+ &entropy_source,
+ randomfile,
+ open_keyboard));
+
+ entropy_flags = ISC_ENTROPY_BLOCKING | ISC_ENTROPY_GOODONLY;
+
+ DO("initialize dst library", dst_lib_init(mctx, ectx, entropy_flags));
+
+ DO("generate key", dst_key_generate(dns_rootname, alg,
+ keysize, 0, 0,
+ DNS_KEYPROTO_ANY,
+ dns_rdataclass_in, mctx, &key));
+
+ isc_buffer_init(&key_rawbuffer, &key_rawsecret, sizeof(key_rawsecret));
+
+ DO("dump key to buffer", dst_key_tobuffer(key, &key_rawbuffer));
+
+ isc_buffer_usedregion(&key_rawbuffer, &key_rawregion);
+
+ DO("bsse64 encode secret", isc_base64_totext(&key_rawregion, -1, "",
+ key_txtbuffer));
+
+ /*
+ * Shut down the entropy source now so the "stop typing" message
+ * does not muck with the output.
+ */
+ if (entropy_source != NULL)
+ isc_entropy_destroysource(&entropy_source);
+
+ if (key != NULL)
+ dst_key_free(&key);
+
+ isc_entropy_detach(&ectx);
+ dst_lib_destroy();
+}
+
+/*%
+ * Write a key file to 'keyfile'. If 'user' is non-NULL,
+ * make that user the owner of the file. The key will have
+ * the name 'keyname' and the secret in the buffer 'secret'.
+ */
+void
+write_key_file(const char *keyfile, const char *user,
+ const char *keyname, isc_buffer_t *secret,
+ dns_secalg_t alg) {
+ isc_result_t result;
+ const char *algname = alg_totext(alg);
+ FILE *fd = NULL;
+
+ DO("create keyfile", isc_file_safecreate(keyfile, &fd));
+
+ if (user != NULL) {
+ if (set_user(fd, user) == -1)
+ fatal("unable to set file owner\n");
+ }
+
+ fprintf(fd, "key \"%s\" {\n\talgorithm %s;\n"
+ "\tsecret \"%.*s\";\n};\n",
+ keyname, algname,
+ (int)isc_buffer_usedlength(secret),
+ (char *)isc_buffer_base(secret));
+ fflush(fd);
+ if (ferror(fd))
+ fatal("write to %s failed\n", keyfile);
+ if (fclose(fd))
+ fatal("fclose(%s) failed\n", keyfile);
+ fprintf(stderr, "wrote key file \"%s\"\n", keyfile);
+}
+
diff --git a/contrib/bind9/bin/confgen/keygen.h b/contrib/bind9/bin/confgen/keygen.h
new file mode 100644
index 0000000..cea25dd
--- /dev/null
+++ b/contrib/bind9/bin/confgen/keygen.h
@@ -0,0 +1,41 @@
+/*
+ * Copyright (C) 2009 Internet Systems Consortium, Inc. ("ISC")
+ *
+ * Permission to use, copy, modify, and/or 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 ISC DISCLAIMS ALL WARRANTIES WITH
+ * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+ * AND FITNESS. IN NO EVENT SHALL ISC 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.
+ */
+
+/* $Id: keygen.h,v 1.3 2009-06-11 23:47:55 tbox Exp $ */
+
+#ifndef RNDC_KEYGEN_H
+#define RNDC_KEYGEN_H 1
+
+/*! \file */
+
+#include <isc/lang.h>
+
+ISC_LANG_BEGINDECLS
+
+void generate_key(isc_mem_t *mctx, const char *randomfile, dns_secalg_t alg,
+ int keysize, isc_buffer_t *key_txtbuffer);
+
+void write_key_file(const char *keyfile, const char *user,
+ const char *keyname, isc_buffer_t *secret,
+ dns_secalg_t alg);
+
+const char *alg_totext(dns_secalg_t alg);
+dns_secalg_t alg_fromtext(const char *name);
+int alg_bits(dns_secalg_t alg);
+
+ISC_LANG_ENDDECLS
+
+#endif /* RNDC_KEYGEN_H */
diff --git a/contrib/bind9/bin/rndc/rndc-confgen.8 b/contrib/bind9/bin/confgen/rndc-confgen.8
index db45df4..a1b3ae8 100644
--- a/contrib/bind9/bin/rndc/rndc-confgen.8
+++ b/contrib/bind9/bin/confgen/rndc-confgen.8
@@ -1,4 +1,4 @@
-.\" Copyright (C) 2004, 2005, 2007 Internet Systems Consortium, Inc. ("ISC")
+.\" Copyright (C) 2004, 2005, 2007, 2009 Internet Systems Consortium, Inc. ("ISC")
.\" Copyright (C) 2001, 2003 Internet Software Consortium.
.\"
.\" Permission to use, copy, modify, and/or distribute this software for any
@@ -13,7 +13,7 @@
.\" OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
.\" PERFORMANCE OF THIS SOFTWARE.
.\"
-.\" $Id: rndc-confgen.8,v 1.20.418.1 2009-07-11 01:55:21 tbox Exp $
+.\" $Id: rndc-confgen.8,v 1.7 2009-07-11 01:12:45 tbox Exp $
.\"
.hy 0
.ad l
@@ -205,7 +205,7 @@ BIND 9 Administrator Reference Manual.
.PP
Internet Systems Consortium
.SH "COPYRIGHT"
-Copyright \(co 2004, 2005, 2007 Internet Systems Consortium, Inc. ("ISC")
+Copyright \(co 2004, 2005, 2007, 2009 Internet Systems Consortium, Inc. ("ISC")
.br
Copyright \(co 2001, 2003 Internet Software Consortium.
.br
diff --git a/contrib/bind9/bin/rndc/rndc-confgen.c b/contrib/bind9/bin/confgen/rndc-confgen.c
index 1cb0a0a..766e3b4 100644
--- a/contrib/bind9/bin/rndc/rndc-confgen.c
+++ b/contrib/bind9/bin/confgen/rndc-confgen.c
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004, 2005, 2007, 2008 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004, 2005, 2007-2009 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 2001, 2003 Internet Software Consortium.
*
* Permission to use, copy, modify, and/or distribute this software for any
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: rndc-confgen.c,v 1.26 2008-10-15 23:47:31 tbox Exp $ */
+/* $Id: rndc-confgen.c,v 1.5 2009-09-29 15:06:05 fdupont Exp $ */
/*! \file */
@@ -52,9 +52,10 @@
#include <dns/name.h>
#include <dst/dst.h>
-#include <rndc/os.h>
+#include <confgen/os.h>
#include "util.h"
+#include "keygen.h"
#define DEFAULT_KEYLENGTH 128 /*% Bits. */
#define DEFAULT_KEYNAME "rndc-key"
@@ -68,6 +69,9 @@ isc_boolean_t verbose = ISC_FALSE;
const char *keyfile, *keydef;
+ISC_PLATFORM_NORETURN_PRE static void
+usage(int status) ISC_PLATFORM_NORETURN_POST;
+
static void
usage(int status) {
@@ -75,72 +79,36 @@ usage(int status) {
Usage:\n\
%s [-a] [-b bits] [-c keyfile] [-k keyname] [-p port] [-r randomfile] \
[-s addr] [-t chrootdir] [-u user]\n\
- -a: generate just the key clause and write it to keyfile (%s)\n\
- -b bits: from 1 through 512, default %d; total length of the secret\n\
- -c keyfile: specify an alternate key file (requires -a)\n\
- -k keyname: the name as it will be used in named.conf and rndc.conf\n\
- -p port: the port named will listen on and rndc will connect to\n\
- -r randomfile: a file containing random data\n\
- -s addr: the address to which rndc should connect\n\
- -t chrootdir: write a keyfile in chrootdir as well (requires -a)\n\
- -u user: set the keyfile owner to \"user\" (requires -a)\n",
- progname, keydef, DEFAULT_KEYLENGTH);
+ -a: generate just the key clause and write it to keyfile (%s)\n\
+ -b bits: from 1 through 512, default %d; total length of the secret\n\
+ -c keyfile: specify an alternate key file (requires -a)\n\
+ -k keyname: the name as it will be used in named.conf and rndc.conf\n\
+ -p port: the port named will listen on and rndc will connect to\n\
+ -r randomfile: source of random data (use \"keyboard\" for key timing)\n\
+ -s addr: the address to which rndc should connect\n\
+ -t chrootdir: write a keyfile in chrootdir as well (requires -a)\n\
+ -u user: set the keyfile owner to \"user\" (requires -a)\n",
+ progname, keydef, DEFAULT_KEYLENGTH);
exit (status);
}
-/*%
- * Write an rndc.key file to 'keyfile'. If 'user' is non-NULL,
- * make that user the owner of the file. The key will have
- * the name 'keyname' and the secret in the buffer 'secret'.
- */
-static void
-write_key_file(const char *keyfile, const char *user,
- const char *keyname, isc_buffer_t *secret )
-{
- FILE *fd;
-
- fd = safe_create(keyfile);
- if (fd == NULL)
- fatal( "unable to create \"%s\"\n", keyfile);
- if (user != NULL) {
- if (set_user(fd, user) == -1)
- fatal("unable to set file owner\n");
- }
- fprintf(fd, "key \"%s\" {\n\talgorithm hmac-md5;\n"
- "\tsecret \"%.*s\";\n};\n", keyname,
- (int)isc_buffer_usedlength(secret),
- (char *)isc_buffer_base(secret));
- fflush(fd);
- if (ferror(fd))
- fatal("write to %s failed\n", keyfile);
- if (fclose(fd))
- fatal("fclose(%s) failed\n", keyfile);
- fprintf(stderr, "wrote key file \"%s\"\n", keyfile);
-}
-
int
main(int argc, char **argv) {
isc_boolean_t show_final_mem = ISC_FALSE;
- isc_buffer_t key_rawbuffer;
isc_buffer_t key_txtbuffer;
- isc_region_t key_rawregion;
+ char key_txtsecret[256];
isc_mem_t *mctx = NULL;
- isc_entropy_t *ectx = NULL;
- isc_entropysource_t *entropy_source = NULL;
isc_result_t result = ISC_R_SUCCESS;
- dst_key_t *key = NULL;
const char *keyname = NULL;
const char *randomfile = NULL;
const char *serveraddr = NULL;
- char key_rawsecret[64];
- char key_txtsecret[256];
+ dns_secalg_t alg = DST_ALG_HMACMD5;
+ const char *algname = alg_totext(alg);
char *p;
int ch;
int port;
int keysize;
- int entropy_flags = 0;
- int open_keyboard = ISC_ENTROPY_KEYBOARDMAYBE;
struct in_addr addr4_dummy;
struct in6_addr addr6_dummy;
char *chrootdir = NULL;
@@ -237,53 +205,13 @@ main(int argc, char **argv) {
usage(1);
DO("create memory context", isc_mem_create(0, 0, &mctx));
-
- DO("create entropy context", isc_entropy_create(mctx, &ectx));
-
- if (randomfile != NULL && strcmp(randomfile, "keyboard") == 0) {
- randomfile = NULL;
- open_keyboard = ISC_ENTROPY_KEYBOARDYES;
- }
- DO("start entropy source", isc_entropy_usebestsource(ectx,
- &entropy_source,
- randomfile,
- open_keyboard));
-
- entropy_flags = ISC_ENTROPY_BLOCKING | ISC_ENTROPY_GOODONLY;
-
- DO("initialize dst library", dst_lib_init(mctx, ectx, entropy_flags));
-
- DO("generate key", dst_key_generate(dns_rootname, DST_ALG_HMACMD5,
- keysize, 0, 0,
- DNS_KEYPROTO_ANY,
- dns_rdataclass_in, mctx, &key));
-
- isc_buffer_init(&key_rawbuffer, &key_rawsecret, sizeof(key_rawsecret));
-
- DO("dump key to buffer", dst_key_tobuffer(key, &key_rawbuffer));
-
isc_buffer_init(&key_txtbuffer, &key_txtsecret, sizeof(key_txtsecret));
- isc_buffer_usedregion(&key_rawbuffer, &key_rawregion);
-
- DO("bsse64 encode secret", isc_base64_totext(&key_rawregion, -1, "",
- &key_txtbuffer));
-
- /*
- * Shut down the entropy source now so the "stop typing" message
- * does not muck with the output.
- */
- if (entropy_source != NULL)
- isc_entropy_destroysource(&entropy_source);
-
- if (key != NULL)
- dst_key_free(&key);
- isc_entropy_detach(&ectx);
- dst_lib_destroy();
+ generate_key(mctx, randomfile, alg, keysize, &key_txtbuffer);
if (keyonly) {
write_key_file(keyfile, chrootdir == NULL ? user : NULL,
- keyname, &key_txtbuffer);
+ keyname, &key_txtbuffer, alg);
if (chrootdir != NULL) {
char *buf;
@@ -294,14 +222,14 @@ main(int argc, char **argv) {
snprintf(buf, len, "%s%s%s", chrootdir,
(*keyfile != '/') ? "/" : "", keyfile);
- write_key_file(buf, user, keyname, &key_txtbuffer);
+ write_key_file(buf, user, keyname, &key_txtbuffer, alg);
isc_mem_put(mctx, buf, len);
}
} else {
printf("\
# Start of rndc.conf\n\
key \"%s\" {\n\
- algorithm hmac-md5;\n\
+ algorithm %s;\n\
secret \"%.*s\";\n\
};\n\
\n\
@@ -314,7 +242,7 @@ options {\n\
\n\
# Use with the following in named.conf, adjusting the allow list as needed:\n\
# key \"%s\" {\n\
-# algorithm hmac-md5;\n\
+# algorithm %s;\n\
# secret \"%.*s\";\n\
# };\n\
# \n\
@@ -323,11 +251,11 @@ options {\n\
# allow { %s; } keys { \"%s\"; };\n\
# };\n\
# End of named.conf\n",
- keyname,
+ keyname, algname,
(int)isc_buffer_usedlength(&key_txtbuffer),
(char *)isc_buffer_base(&key_txtbuffer),
keyname, serveraddr, port,
- keyname,
+ keyname, algname,
(int)isc_buffer_usedlength(&key_txtbuffer),
(char *)isc_buffer_base(&key_txtbuffer),
serveraddr, port, serveraddr, keyname);
diff --git a/contrib/bind9/bin/rndc/rndc-confgen.docbook b/contrib/bind9/bin/confgen/rndc-confgen.docbook
index f71dd9f..d43fcfb 100644
--- a/contrib/bind9/bin/rndc/rndc-confgen.docbook
+++ b/contrib/bind9/bin/confgen/rndc-confgen.docbook
@@ -2,7 +2,7 @@
"http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd"
[<!ENTITY mdash "&#8212;">]>
<!--
- - Copyright (C) 2004, 2005, 2007 Internet Systems Consortium, Inc. ("ISC")
+ - Copyright (C) 2004, 2005, 2007, 2009 Internet Systems Consortium, Inc. ("ISC")
- Copyright (C) 2001, 2003 Internet Software Consortium.
-
- Permission to use, copy, modify, and/or distribute this software for any
@@ -18,7 +18,7 @@
- PERFORMANCE OF THIS SOFTWARE.
-->
-<!-- $Id: rndc-confgen.docbook,v 1.13 2007-06-18 23:47:25 tbox Exp $ -->
+<!-- $Id: rndc-confgen.docbook,v 1.4 2009-06-15 23:47:59 tbox Exp $ -->
<refentry id="man.rndc-confgen">
<refentryinfo>
<date>Aug 27, 2001</date>
@@ -40,6 +40,7 @@
<year>2004</year>
<year>2005</year>
<year>2007</year>
+ <year>2009</year>
<holder>Internet Systems Consortium, Inc. ("ISC")</holder>
</copyright>
<copyright>
diff --git a/contrib/bind9/bin/rndc/rndc-confgen.html b/contrib/bind9/bin/confgen/rndc-confgen.html
index 6ef1073..82a7120 100644
--- a/contrib/bind9/bin/rndc/rndc-confgen.html
+++ b/contrib/bind9/bin/confgen/rndc-confgen.html
@@ -1,5 +1,5 @@
<!--
- - Copyright (C) 2004, 2005, 2007 Internet Systems Consortium, Inc. ("ISC")
+ - Copyright (C) 2004, 2005, 2007, 2009 Internet Systems Consortium, Inc. ("ISC")
- Copyright (C) 2001, 2003 Internet Software Consortium.
-
- Permission to use, copy, modify, and/or distribute this software for any
@@ -14,7 +14,7 @@
- OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
- PERFORMANCE OF THIS SOFTWARE.
-->
-<!-- $Id: rndc-confgen.html,v 1.25.418.1 2009-07-11 01:55:21 tbox Exp $ -->
+<!-- $Id: rndc-confgen.html,v 1.7 2009-07-11 01:12:45 tbox Exp $ -->
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
@@ -32,7 +32,7 @@
<div class="cmdsynopsis"><p><code class="command">rndc-confgen</code> [<code class="option">-a</code>] [<code class="option">-b <em class="replaceable"><code>keysize</code></em></code>] [<code class="option">-c <em class="replaceable"><code>keyfile</code></em></code>] [<code class="option">-h</code>] [<code class="option">-k <em class="replaceable"><code>keyname</code></em></code>] [<code class="option">-p <em class="replaceable"><code>port</code></em></code>] [<code class="option">-r <em class="replaceable"><code>randomfile</code></em></code>] [<code class="option">-s <em class="replaceable"><code>address</code></em></code>] [<code class="option">-t <em class="replaceable"><code>chrootdir</code></em></code>] [<code class="option">-u <em class="replaceable"><code>user</code></em></code>]</p></div>
</div>
<div class="refsect1" lang="en">
-<a name="id2543429"></a><h2>DESCRIPTION</h2>
+<a name="id2543432"></a><h2>DESCRIPTION</h2>
<p><span><strong class="command">rndc-confgen</strong></span>
generates configuration files
for <span><strong class="command">rndc</strong></span>. It can be used as a
@@ -48,7 +48,7 @@
</p>
</div>
<div class="refsect1" lang="en">
-<a name="id2543474"></a><h2>OPTIONS</h2>
+<a name="id2543477"></a><h2>OPTIONS</h2>
<div class="variablelist"><dl>
<dt><span class="term">-a</span></dt>
<dd>
@@ -155,7 +155,7 @@
</dl></div>
</div>
<div class="refsect1" lang="en">
-<a name="id2543787"></a><h2>EXAMPLES</h2>
+<a name="id2543790"></a><h2>EXAMPLES</h2>
<p>
To allow <span><strong class="command">rndc</strong></span> to be used with
no manual configuration, run
@@ -172,7 +172,7 @@
</p>
</div>
<div class="refsect1" lang="en">
-<a name="id2543829"></a><h2>SEE ALSO</h2>
+<a name="id2543832"></a><h2>SEE ALSO</h2>
<p><span class="citerefentry"><span class="refentrytitle">rndc</span>(8)</span>,
<span class="citerefentry"><span class="refentrytitle">rndc.conf</span>(5)</span>,
<span class="citerefentry"><span class="refentrytitle">named</span>(8)</span>,
@@ -180,7 +180,7 @@
</p>
</div>
<div class="refsect1" lang="en">
-<a name="id2543867"></a><h2>AUTHOR</h2>
+<a name="id2543870"></a><h2>AUTHOR</h2>
<p><span class="corpauthor">Internet Systems Consortium</span>
</p>
</div>
diff --git a/contrib/bind9/bin/rndc/unix/Makefile.in b/contrib/bind9/bin/confgen/unix/Makefile.in
index e503db3..1785e0d 100644
--- a/contrib/bind9/bin/rndc/unix/Makefile.in
+++ b/contrib/bind9/bin/confgen/unix/Makefile.in
@@ -1,5 +1,4 @@
-# Copyright (C) 2004, 2007 Internet Systems Consortium, Inc. ("ISC")
-# Copyright (C) 2001 Internet Software Consortium.
+# Copyright (C) 2009 Internet Systems Consortium, Inc. ("ISC")
#
# Permission to use, copy, modify, and/or distribute this software for any
# purpose with or without fee is hereby granted, provided that the above
@@ -13,7 +12,7 @@
# OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
# PERFORMANCE OF THIS SOFTWARE.
-# $Id: Makefile.in,v 1.5 2007-06-19 23:46:59 tbox Exp $
+# $Id: Makefile.in,v 1.3 2009-06-11 23:47:55 tbox Exp $
srcdir = @srcdir@
VPATH = @srcdir@
diff --git a/contrib/bind9/bin/rndc/unix/os.c b/contrib/bind9/bin/confgen/unix/os.c
index e9ece1b..e439a51 100644
--- a/contrib/bind9/bin/rndc/unix/os.c
+++ b/contrib/bind9/bin/confgen/unix/os.c
@@ -1,6 +1,5 @@
/*
- * Copyright (C) 2004, 2005, 2007 Internet Systems Consortium, Inc. ("ISC")
- * Copyright (C) 2001 Internet Software Consortium.
+ * Copyright (C) 2009 Internet Systems Consortium, Inc. ("ISC")
*
* Permission to use, copy, modify, and/or distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
@@ -15,13 +14,13 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: os.c,v 1.10 2007-06-19 23:46:59 tbox Exp $ */
+/* $Id: os.c,v 1.3 2009-06-11 23:47:55 tbox Exp $ */
/*! \file */
#include <config.h>
-#include <rndc/os.h>
+#include <confgen/os.h>
#include <fcntl.h>
#include <unistd.h>
@@ -42,29 +41,3 @@ set_user(FILE *fd, const char *user) {
}
return (fchown(fileno(fd), pw->pw_uid, -1));
}
-
-FILE *
-safe_create(const char *filename) {
- int fd;
- FILE *f;
- struct stat sb;
- int flags = O_WRONLY;
-
- if (stat(filename, &sb) == -1) {
- if (errno != ENOENT)
- return (NULL);
- flags = O_WRONLY | O_CREAT | O_EXCL;
- } else if ((sb.st_mode & S_IFREG) == 0) {
- errno = EOPNOTSUPP;
- return (NULL);
- } else
- flags = O_WRONLY | O_TRUNC;
-
- fd = open(filename, flags, S_IRUSR | S_IWUSR);
- if (fd == -1)
- return (NULL);
- f = fdopen(fd, "w");
- if (f == NULL)
- close(fd);
- return (f);
-}
diff --git a/contrib/bind9/bin/confgen/util.c b/contrib/bind9/bin/confgen/util.c
new file mode 100644
index 0000000..158a8d3
--- /dev/null
+++ b/contrib/bind9/bin/confgen/util.c
@@ -0,0 +1,56 @@
+/*
+ * Copyright (C) 2009 Internet Systems Consortium, Inc. ("ISC")
+ *
+ * Permission to use, copy, modify, and/or 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 ISC DISCLAIMS ALL WARRANTIES WITH
+ * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+ * AND FITNESS. IN NO EVENT SHALL ISC 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.
+ */
+
+/* $Id: util.c,v 1.3 2009-06-11 23:47:55 tbox Exp $ */
+
+/*! \file */
+
+#include <config.h>
+
+#include <stdarg.h>
+#include <stdlib.h>
+#include <stdio.h>
+
+#include <isc/boolean.h>
+
+#include "util.h"
+
+extern isc_boolean_t verbose;
+extern const char *progname;
+
+void
+notify(const char *fmt, ...) {
+ va_list ap;
+
+ if (verbose) {
+ va_start(ap, fmt);
+ vfprintf(stderr, fmt, ap);
+ va_end(ap);
+ fputs("\n", stderr);
+ }
+}
+
+void
+fatal(const char *format, ...) {
+ va_list args;
+
+ fprintf(stderr, "%s: ", progname);
+ va_start(args, format);
+ vfprintf(stderr, format, args);
+ va_end(args);
+ fprintf(stderr, "\n");
+ exit(1);
+}
diff --git a/contrib/bind9/bin/confgen/util.h b/contrib/bind9/bin/confgen/util.h
new file mode 100644
index 0000000..651b6e5
--- /dev/null
+++ b/contrib/bind9/bin/confgen/util.h
@@ -0,0 +1,52 @@
+/*
+ * Copyright (C) 2009 Internet Systems Consortium, Inc. ("ISC")
+ *
+ * Permission to use, copy, modify, and/or 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 ISC DISCLAIMS ALL WARRANTIES WITH
+ * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+ * AND FITNESS. IN NO EVENT SHALL ISC 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.
+ */
+
+/* $Id: util.h,v 1.4 2009-09-29 15:06:05 fdupont Exp $ */
+
+#ifndef RNDC_UTIL_H
+#define RNDC_UTIL_H 1
+
+/*! \file */
+
+#include <isc/lang.h>
+#include <isc/platform.h>
+
+#include <isc/formatcheck.h>
+
+#define NS_CONTROL_PORT 953
+
+#undef DO
+#define DO(name, function) \
+ do { \
+ result = function; \
+ if (result != ISC_R_SUCCESS) \
+ fatal("%s: %s", name, isc_result_totext(result)); \
+ else \
+ notify("%s", name); \
+ } while (0)
+
+ISC_LANG_BEGINDECLS
+
+void
+notify(const char *fmt, ...) ISC_FORMAT_PRINTF(1, 2);
+
+ISC_PLATFORM_NORETURN_PRE void
+fatal(const char *format, ...)
+ISC_FORMAT_PRINTF(1, 2) ISC_PLATFORM_NORETURN_POST;
+
+ISC_LANG_ENDDECLS
+
+#endif /* RNDC_UTIL_H */
diff --git a/contrib/bind9/bin/dig/Makefile.in b/contrib/bind9/bin/dig/Makefile.in
index ad20553..bebef6f 100644
--- a/contrib/bind9/bin/dig/Makefile.in
+++ b/contrib/bind9/bin/dig/Makefile.in
@@ -1,4 +1,4 @@
-# Copyright (C) 2004, 2005, 2007 Internet Systems Consortium, Inc. ("ISC")
+# Copyright (C) 2004, 2005, 2007, 2009 Internet Systems Consortium, Inc. ("ISC")
# Copyright (C) 2000-2002 Internet Software Consortium.
#
# Permission to use, copy, modify, and/or distribute this software for any
@@ -13,7 +13,7 @@
# OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
# PERFORMANCE OF THIS SOFTWARE.
-# $Id: Makefile.in,v 1.41 2007-06-19 23:46:59 tbox Exp $
+# $Id: Makefile.in,v 1.47 2009-12-05 23:31:40 each Exp $
srcdir = @srcdir@
VPATH = @srcdir@
@@ -24,7 +24,7 @@ top_srcdir = @top_srcdir@
@BIND9_MAKE_INCLUDES@
CINCLUDES = -I${srcdir}/include ${DNS_INCLUDES} ${BIND9_INCLUDES} \
- ${ISC_INCLUDES} ${LWRES_INCLUDES}
+ ${ISC_INCLUDES} ${LWRES_INCLUDES} ${ISCCFG_INCLUDES}
CDEFINES = -DVERSION=\"${VERSION}\"
CWARNINGS =
@@ -33,6 +33,7 @@ ISCCFGLIBS = ../../lib/isccfg/libisccfg.@A@
DNSLIBS = ../../lib/dns/libdns.@A@ @DNS_CRYPTO_LIBS@
BIND9LIBS = ../../lib/bind9/libbind9.@A@
ISCLIBS = ../../lib/isc/libisc.@A@
+ISCNOSYMLIBS = ../../lib/isc/libisc-nosymtbl.@A@
LWRESLIBS = ../../lib/lwres/liblwres.@A@
ISCCFGDEPLIBS = ../../lib/isccfg/libisccfg.@A@
@@ -44,8 +45,11 @@ LWRESDEPLIBS = ../../lib/lwres/liblwres.@A@
DEPLIBS = ${DNSDEPLIBS} ${BIND9DEPLIBS} ${ISCDEPLIBS} ${ISCCFGDEPLIBS} \
${LWRESDEPLIBS}
-LIBS = ${LWRESLIBS} ${DNSLIBS} ${BIND9LIBS} ${ISCLIBS} \
- ${ISCCFGLIBS} @IDNLIBS@ @LIBS@
+LIBS = ${LWRESLIBS} ${DNSLIBS} ${BIND9LIBS} ${ISCCFGLIBS} \
+ ${ISCLIBS} @IDNLIBS@ @LIBS@
+
+NOSYMLIBS = ${LWRESLIBS} ${DNSLIBS} ${BIND9LIBS} ${ISCCFGLIBS} \
+ ${ISCNOSYMLIBS} @IDNLIBS@ @LIBS@
SUBDIRS =
@@ -66,16 +70,16 @@ MANOBJS = ${MANPAGES} ${HTMLPAGES}
@BIND9_MAKE_RULES@
dig@EXEEXT@: dig.@O@ dighost.@O@ ${UOBJS} ${DEPLIBS}
- ${LIBTOOL_MODE_LINK} ${PURIFY} ${CC} ${CFLAGS} ${LDFLAGS} -o $@ \
- dig.@O@ dighost.@O@ ${UOBJS} ${LIBS}
+ export BASEOBJS="dig.@O@ dighost.@O@ ${UOBJS}"; \
+ ${FINALBUILDCMD}
host@EXEEXT@: host.@O@ dighost.@O@ ${UOBJS} ${DEPLIBS}
- ${LIBTOOL_MODE_LINK} ${PURIFY} ${CC} ${CFLAGS} ${LDFLAGS} -o $@ \
- host.@O@ dighost.@O@ ${UOBJS} ${LIBS}
+ export BASEOBJS="host.@O@ dighost.@O@ ${UOBJS}"; \
+ ${FINALBUILDCMD}
nslookup@EXEEXT@: nslookup.@O@ dighost.@O@ ${UOBJS} ${DEPLIBS}
- ${LIBTOOL_MODE_LINK} ${PURIFY} ${CC} ${CFLAGS} ${LDFLAGS} -o $@ \
- nslookup.@O@ dighost.@O@ ${UOBJS} ${LIBS}
+ export BASEOBJS="nslookup.@O@ dighost.@O@ ${UOBJS}"; \
+ ${FINALBUILDCMD}
doc man:: ${MANOBJS}
diff --git a/contrib/bind9/bin/dig/dig.1 b/contrib/bind9/bin/dig/dig.1
index 93f90b2..87d5045 100644
--- a/contrib/bind9/bin/dig/dig.1
+++ b/contrib/bind9/bin/dig/dig.1
@@ -1,4 +1,4 @@
-.\" Copyright (C) 2004-2009 Internet Systems Consortium, Inc. ("ISC")
+.\" Copyright (C) 2004-2010 Internet Systems Consortium, Inc. ("ISC")
.\" Copyright (C) 2000-2003 Internet Software Consortium.
.\"
.\" Permission to use, copy, modify, and/or distribute this software for any
@@ -13,7 +13,7 @@
.\" OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
.\" PERFORMANCE OF THIS SOFTWARE.
.\"
-.\" $Id: dig.1,v 1.50.44.3 2009-07-11 01:55:20 tbox Exp $
+.\" $Id: dig.1,v 1.54 2010-03-05 01:14:15 tbox Exp $
.\"
.hy 0
.ad l
@@ -455,6 +455,11 @@ Print records like the SOA records in a verbose multi\-line format with human\-r
output.
.RE
.PP
+\fB+[no]onesoa\fR
+.RS 4
+Print only one (starting) SOA record when performing an AXFR. The default is to print both the starting and ending SOA records.
+.RE
+.PP
\fB+[no]fail\fR
.RS 4
Do not try the next server if you receive a SERVFAIL. The default is to not try the next server which is the reverse of normal stub resolver behavior.
@@ -562,7 +567,7 @@ RFC1035.
.PP
There are probably too many query options.
.SH "COPYRIGHT"
-Copyright \(co 2004\-2009 Internet Systems Consortium, Inc. ("ISC")
+Copyright \(co 2004\-2010 Internet Systems Consortium, Inc. ("ISC")
.br
Copyright \(co 2000\-2003 Internet Software Consortium.
.br
diff --git a/contrib/bind9/bin/dig/dig.c b/contrib/bind9/bin/dig/dig.c
index 7de934b..a3143c9 100644
--- a/contrib/bind9/bin/dig/dig.c
+++ b/contrib/bind9/bin/dig/dig.c
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: dig.c,v 1.225.26.7 2010-05-13 00:43:37 marka Exp $ */
+/* $Id: dig.c,v 1.237 2010-05-13 00:40:46 marka Exp $ */
/*! \file */
@@ -68,7 +68,8 @@ static char domainopt[DNS_NAME_MAXTEXT];
static isc_boolean_t short_form = ISC_FALSE, printcmd = ISC_TRUE,
ip6_int = ISC_FALSE, plusquest = ISC_FALSE, pluscomm = ISC_FALSE,
- multiline = ISC_FALSE, nottl = ISC_FALSE, noclass = ISC_FALSE;
+ multiline = ISC_FALSE, nottl = ISC_FALSE, noclass = ISC_FALSE,
+ onesoa = ISC_FALSE;
/*% opcode text */
static const char * const opcodetext[] = {
@@ -138,6 +139,9 @@ print_usage(FILE *fp) {
" [ host [@local-server] {local-d-opt} [...]]\n", fp);
}
+ISC_PLATFORM_NORETURN_PRE static void
+usage(void) ISC_PLATFORM_NORETURN_POST;
+
static void
usage(void) {
print_usage(stderr);
@@ -222,6 +226,7 @@ help(void) {
#endif
#endif
" +[no]multiline (Print records in an expanded format)\n"
+" +[no]onesoa (AXFR prints only one soa record)\n"
" global d-opts and servers (before host name) affect all queries.\n"
" local d-opts and servers (after host name) affect only that lookup.\n"
" -h (print help and exit)\n"
@@ -468,6 +473,9 @@ printmessage(dig_query_t *query, dns_message_t *msg, isc_boolean_t headers) {
flags |= DNS_MESSAGETEXTFLAG_NOHEADERS;
flags |= DNS_MESSAGETEXTFLAG_NOCOMMENTS;
}
+ if (onesoa && query->lookup->rdtype == dns_rdatatype_axfr)
+ flags |= (query->msg_count == 0) ? DNS_MESSAGETEXTFLAG_ONESOA :
+ DNS_MESSAGETEXTFLAG_OMITSOA;
if (!query->lookup->comments)
flags |= DNS_MESSAGETEXTFLAG_NOCOMMENTS;
@@ -673,19 +681,6 @@ printgreeting(int argc, char **argv, dig_lookup_t *lookup) {
}
}
-static isc_uint32_t
-parse_uint(char *arg, const char *desc, isc_uint32_t max) {
- isc_result_t result;
- isc_uint32_t tmp;
-
- result = isc_parse_uint32(&tmp, arg, 10);
- if (result == ISC_R_SUCCESS && tmp > max)
- result = ISC_R_RANGE;
- if (result != ISC_R_SUCCESS)
- fatal("%s '%s': %s", desc, arg, isc_result_totext(result));
- return (tmp);
-}
-
/*%
* We're not using isc_commandline_parse() here since the command line
* syntax of dig is quite a bit different from that which can be described
@@ -697,8 +692,10 @@ static void
plus_option(char *option, isc_boolean_t is_batchfile,
dig_lookup_t *lookup)
{
+ isc_result_t result;
char option_store[256];
char *cmd, *value, *ptr;
+ isc_uint32_t num;
isc_boolean_t state = ISC_TRUE;
#ifdef DIG_SIGCHASE
size_t n;
@@ -746,6 +743,7 @@ plus_option(char *option, isc_boolean_t is_batchfile,
lookup->section_additional = state;
break;
case 'f': /* adflag */
+ case '\0': /* +ad is a synonym for +adflag */
FULLCHECK("adflag");
lookup->adflag = state;
break;
@@ -787,8 +785,11 @@ plus_option(char *option, isc_boolean_t is_batchfile,
goto need_value;
if (!state)
goto invalid_option;
- lookup->udpsize = (isc_uint16_t) parse_uint(value,
- "buffer size", COMMSIZE);
+ result = parse_uint(&num, value, COMMSIZE,
+ "buffer size");
+ if (result != ISC_R_SUCCESS)
+ fatal("Couldn't parse buffer size");
+ lookup->udpsize = num;
break;
default:
goto invalid_option;
@@ -797,8 +798,15 @@ plus_option(char *option, isc_boolean_t is_batchfile,
case 'c':
switch (cmd[1]) {
case 'd':/* cdflag */
- FULLCHECK("cdflag");
- lookup->cdflag = state;
+ switch (cmd[2]) {
+ case 'f': /* cdflag */
+ case '\0': /* +cd is a synonym for +cdflag */
+ FULLCHECK("cdflag");
+ lookup->cdflag = state;
+ break;
+ default:
+ goto invalid_option;
+ }
break;
case 'l': /* cl */
FULLCHECK("cl");
@@ -853,7 +861,10 @@ plus_option(char *option, isc_boolean_t is_batchfile,
}
if (value == NULL)
goto need_value;
- lookup->edns = (isc_int16_t) parse_uint(value, "edns", 255);
+ result = parse_uint(&num, value, 255, "edns");
+ if (result != ISC_R_SUCCESS)
+ fatal("Couldn't parse edns");
+ lookup->edns = num;
break;
case 'f': /* fail */
FULLCHECK("fail");
@@ -883,7 +894,10 @@ plus_option(char *option, isc_boolean_t is_batchfile,
goto need_value;
if (!state)
goto invalid_option;
- ndots = parse_uint(value, "ndots", MAXNDOTS);
+ result = parse_uint(&num, value, MAXNDOTS, "ndots");
+ if (result != ISC_R_SUCCESS)
+ fatal("Couldn't parse ndots");
+ ndots = num;
break;
case 's':
switch (cmd[2]) {
@@ -918,6 +932,10 @@ plus_option(char *option, isc_boolean_t is_batchfile,
goto invalid_option;
}
break;
+ case 'o':
+ FULLCHECK("onesoa");
+ onesoa = state;
+ break;
case 'q':
switch (cmd[1]) {
case 'r': /* qr */
@@ -948,8 +966,10 @@ plus_option(char *option, isc_boolean_t is_batchfile,
goto need_value;
if (!state)
goto invalid_option;
- lookup->retries = parse_uint(value, "retries",
- MAXTRIES - 1);
+ result = parse_uint(&lookup->retries, value,
+ MAXTRIES - 1, "retries");
+ if (result != ISC_R_SUCCESS)
+ fatal("Couldn't parse retries");
lookup->retries++;
break;
default:
@@ -1025,7 +1045,10 @@ plus_option(char *option, isc_boolean_t is_batchfile,
goto need_value;
if (!state)
goto invalid_option;
- timeout = parse_uint(value, "timeout", MAXTIMEOUT);
+ result = parse_uint(&timeout, value, MAXTIMEOUT,
+ "timeout");
+ if (result != ISC_R_SUCCESS)
+ fatal("Couldn't parse timeout");
if (timeout == 0)
timeout = 1;
break;
@@ -1058,8 +1081,10 @@ plus_option(char *option, isc_boolean_t is_batchfile,
goto need_value;
if (!state)
goto invalid_option;
- lookup->retries = parse_uint(value, "tries",
- MAXTRIES);
+ result = parse_uint(&lookup->retries, value,
+ MAXTRIES, "tries");
+ if (result != ISC_R_SUCCESS)
+ fatal("Couldn't parse tries");
if (lookup->retries == 0)
lookup->retries = 1;
break;
@@ -1125,6 +1150,7 @@ dash_option(char *option, char *next, dig_lookup_t **lookup,
struct in6_addr in6;
in_port_t srcport;
char *hash, *cmd;
+ isc_uint32_t num;
while (strpbrk(option, single_dash_opts) == &option[0]) {
/*
@@ -1140,6 +1166,7 @@ dash_option(char *option, char *next, dig_lookup_t **lookup,
have_ipv6 = ISC_FALSE;
} else {
fatal("can't find IPv4 networking");
+ /* NOTREACHED */
return (ISC_FALSE);
}
break;
@@ -1149,6 +1176,7 @@ dash_option(char *option, char *next, dig_lookup_t **lookup,
have_ipv4 = ISC_FALSE;
} else {
fatal("can't find IPv6 networking");
+ /* NOTREACHED */
return (ISC_FALSE);
}
break;
@@ -1199,9 +1227,11 @@ dash_option(char *option, char *next, dig_lookup_t **lookup,
case 'b':
hash = strchr(value, '#');
if (hash != NULL) {
- srcport = (in_port_t)
- parse_uint(hash + 1,
- "port number", MAXPORT);
+ result = parse_uint(&num, hash + 1, MAXPORT,
+ "port number");
+ if (result != ISC_R_SUCCESS)
+ fatal("Couldn't parse port number");
+ srcport = num;
*hash = '\0';
} else
srcport = 0;
@@ -1245,7 +1275,10 @@ dash_option(char *option, char *next, dig_lookup_t **lookup,
keyfile[sizeof(keyfile)-1]=0;
return (value_from_next);
case 'p':
- port = (in_port_t) parse_uint(value, "port number", MAXPORT);
+ result = parse_uint(&num, value, MAXPORT, "port number");
+ if (result != ISC_R_SUCCESS)
+ fatal("Couldn't parse port number");
+ port = num;
return (value_from_next);
case 'q':
if (!config_only) {
@@ -1288,11 +1321,14 @@ dash_option(char *option, char *next, dig_lookup_t **lookup,
"extra type option\n");
}
if (rdtype == dns_rdatatype_ixfr) {
+ isc_uint32_t serial;
(*lookup)->rdtype = dns_rdatatype_ixfr;
(*lookup)->rdtypeset = ISC_TRUE;
- (*lookup)->ixfr_serial =
- parse_uint(&value[5], "serial number",
- MAXSERIAL);
+ result = parse_uint(&serial, &value[5],
+ MAXSERIAL, "serial number");
+ if (result != ISC_R_SUCCESS)
+ fatal("Couldn't parse serial number");
+ (*lookup)->ixfr_serial = serial;
(*lookup)->section_question = plusquest;
(*lookup)->comments = pluscomm;
(*lookup)->tcp_mode = ISC_TRUE;
@@ -1320,65 +1356,7 @@ dash_option(char *option, char *next, dig_lookup_t **lookup,
usage();
ptr3 = next_token(&value,":"); /* secret or NULL */
if (ptr3 != NULL) {
- if (strcasecmp(ptr, "hmac-md5") == 0) {
- hmacname = DNS_TSIG_HMACMD5_NAME;
- digestbits = 0;
- } else if (strncasecmp(ptr, "hmac-md5-", 9) == 0) {
- hmacname = DNS_TSIG_HMACMD5_NAME;
- digestbits = parse_uint(&ptr[9],
- "digest-bits [0..128]",
- 128);
- digestbits = (digestbits + 7) & ~0x7U;
- } else if (strcasecmp(ptr, "hmac-sha1") == 0) {
- hmacname = DNS_TSIG_HMACSHA1_NAME;
- digestbits = 0;
- } else if (strncasecmp(ptr, "hmac-sha1-", 10) == 0) {
- hmacname = DNS_TSIG_HMACSHA1_NAME;
- digestbits = parse_uint(&ptr[10],
- "digest-bits [0..160]",
- 160);
- digestbits = (digestbits + 7) & ~0x7U;
- } else if (strcasecmp(ptr, "hmac-sha224") == 0) {
- hmacname = DNS_TSIG_HMACSHA224_NAME;
- digestbits = 0;
- } else if (strncasecmp(ptr, "hmac-sha224-", 12) == 0) {
- hmacname = DNS_TSIG_HMACSHA224_NAME;
- digestbits = parse_uint(&ptr[12],
- "digest-bits [0..224]",
- 224);
- digestbits = (digestbits + 7) & ~0x7U;
- } else if (strcasecmp(ptr, "hmac-sha256") == 0) {
- hmacname = DNS_TSIG_HMACSHA256_NAME;
- digestbits = 0;
- } else if (strncasecmp(ptr, "hmac-sha256-", 12) == 0) {
- hmacname = DNS_TSIG_HMACSHA256_NAME;
- digestbits = parse_uint(&ptr[12],
- "digest-bits [0..256]",
- 256);
- digestbits = (digestbits + 7) & ~0x7U;
- } else if (strcasecmp(ptr, "hmac-sha384") == 0) {
- hmacname = DNS_TSIG_HMACSHA384_NAME;
- digestbits = 0;
- } else if (strncasecmp(ptr, "hmac-sha384-", 12) == 0) {
- hmacname = DNS_TSIG_HMACSHA384_NAME;
- digestbits = parse_uint(&ptr[12],
- "digest-bits [0..384]",
- 384);
- digestbits = (digestbits + 7) & ~0x7U;
- } else if (strcasecmp(ptr, "hmac-sha512") == 0) {
- hmacname = DNS_TSIG_HMACSHA512_NAME;
- digestbits = 0;
- } else if (strncasecmp(ptr, "hmac-sha512-", 12) == 0) {
- hmacname = DNS_TSIG_HMACSHA512_NAME;
- digestbits = parse_uint(&ptr[12],
- "digest-bits [0..512]",
- 512);
- digestbits = (digestbits + 7) & ~0x7U;
- } else {
- fprintf(stderr, ";; Warning, ignoring "
- "invalid TSIG algorithm %s\n", ptr);
- return (value_from_next);
- }
+ parse_hmac(ptr);
ptr = ptr2;
ptr2 = ptr3;
} else {
@@ -1422,6 +1400,7 @@ dash_option(char *option, char *next, dig_lookup_t **lookup,
fprintf(stderr, "Invalid option: -%s\n", option);
usage();
}
+ /* NOTREACHED */
return (ISC_FALSE);
}
@@ -1626,13 +1605,18 @@ parse_args(isc_boolean_t is_batchfile, isc_boolean_t config_only,
"extra type option\n");
}
if (rdtype == dns_rdatatype_ixfr) {
+ isc_uint32_t serial;
lookup->rdtype =
dns_rdatatype_ixfr;
lookup->rdtypeset = ISC_TRUE;
- lookup->ixfr_serial =
- parse_uint(&rv[0][5],
- "serial number",
- MAXSERIAL);
+ result = parse_uint(&serial,
+ &rv[0][5],
+ MAXSERIAL,
+ "serial number");
+ if (result != ISC_R_SUCCESS)
+ fatal("Couldn't parse "
+ "serial number");
+ lookup->ixfr_serial = serial;
lookup->section_question =
plusquest;
lookup->comments = pluscomm;
diff --git a/contrib/bind9/bin/dig/dig.docbook b/contrib/bind9/bin/dig/dig.docbook
index d8e3586..19e2ca2 100644
--- a/contrib/bind9/bin/dig/dig.docbook
+++ b/contrib/bind9/bin/dig/dig.docbook
@@ -2,7 +2,7 @@
"http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd"
[<!ENTITY mdash "&#8212;">]>
<!--
- - Copyright (C) 2004-2009 Internet Systems Consortium, Inc. ("ISC")
+ - Copyright (C) 2004-2010 Internet Systems Consortium, Inc. ("ISC")
- Copyright (C) 2000-2003 Internet Software Consortium.
-
- Permission to use, copy, modify, and/or distribute this software for any
@@ -18,7 +18,7 @@
- PERFORMANCE OF THIS SOFTWARE.
-->
-<!-- $Id: dig.docbook,v 1.42.44.3 2009-02-02 04:42:48 marka Exp $ -->
+<!-- $Id: dig.docbook,v 1.47 2010-03-04 23:50:34 tbox Exp $ -->
<refentry id="man.dig">
<refentryinfo>
@@ -44,6 +44,7 @@
<year>2007</year>
<year>2008</year>
<year>2009</year>
+ <year>2010</year>
<holder>Internet Systems Consortium, Inc. ("ISC")</holder>
</copyright>
<copyright>
@@ -766,6 +767,17 @@
</listitem>
</varlistentry>
+ <varlistentry>
+ <term><option>+[no]onesoa</option></term>
+ <listitem>
+ <para>
+ Print only one (starting) SOA record when performing
+ an AXFR. The default is to print both the starting and
+ ending SOA records.
+ </para>
+ </listitem>
+ </varlistentry>
+
<varlistentry>
<term><option>+[no]fail</option></term>
<listitem>
diff --git a/contrib/bind9/bin/dig/dig.html b/contrib/bind9/bin/dig/dig.html
index 17fd5bb..c9ce8f0 100644
--- a/contrib/bind9/bin/dig/dig.html
+++ b/contrib/bind9/bin/dig/dig.html
@@ -1,5 +1,5 @@
<!--
- - Copyright (C) 2004-2009 Internet Systems Consortium, Inc. ("ISC")
+ - Copyright (C) 2004-2010 Internet Systems Consortium, Inc. ("ISC")
- Copyright (C) 2000-2003 Internet Software Consortium.
-
- Permission to use, copy, modify, and/or distribute this software for any
@@ -14,7 +14,7 @@
- OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
- PERFORMANCE OF THIS SOFTWARE.
-->
-<!-- $Id: dig.html,v 1.45.44.3 2009-07-11 01:55:20 tbox Exp $ -->
+<!-- $Id: dig.html,v 1.49 2010-03-05 01:14:15 tbox Exp $ -->
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
@@ -34,7 +34,7 @@
<div class="cmdsynopsis"><p><code class="command">dig</code> [global-queryopt...] [query...]</p></div>
</div>
<div class="refsect1" lang="en">
-<a name="id2543518"></a><h2>DESCRIPTION</h2>
+<a name="id2543522"></a><h2>DESCRIPTION</h2>
<p><span><strong class="command">dig</strong></span>
(domain information groper) is a flexible tool
for interrogating DNS name servers. It performs DNS lookups and
@@ -80,7 +80,7 @@
</p>
</div>
<div class="refsect1" lang="en">
-<a name="id2543592"></a><h2>SIMPLE USAGE</h2>
+<a name="id2543595"></a><h2>SIMPLE USAGE</h2>
<p>
A typical invocation of <span><strong class="command">dig</strong></span> looks like:
</p>
@@ -126,7 +126,7 @@
</p>
</div>
<div class="refsect1" lang="en">
-<a name="id2543683"></a><h2>OPTIONS</h2>
+<a name="id2543686"></a><h2>OPTIONS</h2>
<p>
The <code class="option">-b</code> option sets the source IP address of the query
to <em class="parameter"><code>address</code></em>. This must be a valid
@@ -230,7 +230,7 @@
</p>
</div>
<div class="refsect1" lang="en">
-<a name="id2544032"></a><h2>QUERY OPTIONS</h2>
+<a name="id2544035"></a><h2>QUERY OPTIONS</h2>
<p><span><strong class="command">dig</strong></span>
provides a number of query options which affect
the way in which lookups are made and the results displayed. Some of
@@ -499,6 +499,12 @@
each record on a single line, to facilitate machine parsing
of the <span><strong class="command">dig</strong></span> output.
</p></dd>
+<dt><span class="term"><code class="option">+[no]onesoa</code></span></dt>
+<dd><p>
+ Print only one (starting) SOA record when performing
+ an AXFR. The default is to print both the starting and
+ ending SOA records.
+ </p></dd>
<dt><span class="term"><code class="option">+[no]fail</code></span></dt>
<dd><p>
Do not try the next server if you receive a SERVFAIL. The
@@ -555,7 +561,7 @@
</p>
</div>
<div class="refsect1" lang="en">
-<a name="id2545166"></a><h2>MULTIPLE QUERIES</h2>
+<a name="id2545184"></a><h2>MULTIPLE QUERIES</h2>
<p>
The BIND 9 implementation of <span><strong class="command">dig </strong></span>
supports
@@ -601,7 +607,7 @@ dig +qr www.isc.org any -x 127.0.0.1 isc.org ns +noqr
</p>
</div>
<div class="refsect1" lang="en">
-<a name="id2545228"></a><h2>IDN SUPPORT</h2>
+<a name="id2545245"></a><h2>IDN SUPPORT</h2>
<p>
If <span><strong class="command">dig</strong></span> has been built with IDN (internationalized
domain name) support, it can accept and display non-ASCII domain names.
@@ -615,14 +621,14 @@ dig +qr www.isc.org any -x 127.0.0.1 isc.org ns +noqr
</p>
</div>
<div class="refsect1" lang="en">
-<a name="id2545251"></a><h2>FILES</h2>
+<a name="id2545336"></a><h2>FILES</h2>
<p><code class="filename">/etc/resolv.conf</code>
</p>
<p><code class="filename">${HOME}/.digrc</code>
</p>
</div>
<div class="refsect1" lang="en">
-<a name="id2545336"></a><h2>SEE ALSO</h2>
+<a name="id2545353"></a><h2>SEE ALSO</h2>
<p><span class="citerefentry"><span class="refentrytitle">host</span>(1)</span>,
<span class="citerefentry"><span class="refentrytitle">named</span>(8)</span>,
<span class="citerefentry"><span class="refentrytitle">dnssec-keygen</span>(8)</span>,
@@ -630,7 +636,7 @@ dig +qr www.isc.org any -x 127.0.0.1 isc.org ns +noqr
</p>
</div>
<div class="refsect1" lang="en">
-<a name="id2545373"></a><h2>BUGS</h2>
+<a name="id2545390"></a><h2>BUGS</h2>
<p>
There are probably too many query options.
</p>
diff --git a/contrib/bind9/bin/dig/dighost.c b/contrib/bind9/bin/dig/dighost.c
index df5a0c0..e92bc6e 100644
--- a/contrib/bind9/bin/dig/dighost.c
+++ b/contrib/bind9/bin/dig/dighost.c
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: dighost.c,v 1.311.70.17 2010-12-09 01:12:54 marka Exp $ */
+/* $Id: dighost.c,v 1.336 2010-12-09 00:54:33 marka Exp $ */
/*! \file
* \note
@@ -53,6 +53,7 @@
#include <ctype.h>
#endif
#include <dns/fixedname.h>
+#include <dns/log.h>
#include <dns/message.h>
#include <dns/name.h>
#include <dns/rdata.h>
@@ -71,10 +72,12 @@
#include <isc/entropy.h>
#include <isc/file.h>
#include <isc/lang.h>
+#include <isc/log.h>
#include <isc/netaddr.h>
#ifdef DIG_SIGCHASE
#include <isc/netdb.h>
#endif
+#include <isc/parseint.h>
#include <isc/print.h>
#include <isc/random.h>
#include <isc/result.h>
@@ -84,6 +87,8 @@
#include <isc/types.h>
#include <isc/util.h>
+#include <isccfg/namedconf.h>
+
#include <lwres/lwres.h>
#include <lwres/net.h>
@@ -121,6 +126,7 @@ in_port_t port = 53;
unsigned int timeout = 0;
unsigned int extrabytes;
isc_mem_t *mctx = NULL;
+isc_log_t *lctx = NULL;
isc_taskmgr_t *taskmgr = NULL;
isc_task_t *global_task = NULL;
isc_timermgr_t *timermgr = NULL;
@@ -393,7 +399,7 @@ count_dots(char *string) {
static void
hex_dump(isc_buffer_t *b) {
- unsigned int len;
+ unsigned int len, i;
isc_region_t r;
isc_buffer_usedregion(b, &r);
@@ -401,11 +407,29 @@ hex_dump(isc_buffer_t *b) {
printf("%d bytes\n", r.length);
for (len = 0; len < r.length; len++) {
printf("%02x ", r.base[len]);
- if (len % 16 == 15)
+ if (len % 16 == 15) {
+ fputs(" ", stdout);
+ for (i = len - 15; i <= len; i++) {
+ if (r.base[i] >= '!' && r.base[i] <= '}')
+ putchar(r.base[i]);
+ else
+ putchar('.');
+ }
printf("\n");
+ }
}
- if (len % 16 != 0)
+ if (len % 16 != 0) {
+ for (i = len; (i % 16) != 0; i++)
+ fputs(" ", stdout);
+ fputs(" ", stdout);
+ for (i = ((len>>4)<<4); i < len; i++) {
+ if (r.base[i] >= '!' && r.base[i] <= '}')
+ putchar(r.base[i]);
+ else
+ putchar('.');
+ }
printf("\n");
+ }
}
/*%
@@ -903,9 +927,7 @@ setup_text_key(void) {
secretsize = isc_buffer_usedlength(&secretbuf);
- result = dns_name_fromtext(&keyname, namebuf,
- dns_rootname, ISC_FALSE,
- namebuf);
+ result = dns_name_fromtext(&keyname, namebuf, dns_rootname, 0, namebuf);
if (result != ISC_R_SUCCESS)
goto failure;
@@ -924,14 +946,164 @@ setup_text_key(void) {
isc_buffer_free(&namebuf);
}
+isc_result_t
+parse_uint(isc_uint32_t *uip, const char *value, isc_uint32_t max,
+ const char *desc) {
+ isc_uint32_t n;
+ isc_result_t result = isc_parse_uint32(&n, value, 10);
+ if (result == ISC_R_SUCCESS && n > max)
+ result = ISC_R_RANGE;
+ if (result != ISC_R_SUCCESS) {
+ printf("invalid %s '%s': %s\n", desc,
+ value, isc_result_totext(result));
+ return (result);
+ }
+ *uip = n;
+ return (ISC_R_SUCCESS);
+}
+
+static isc_uint32_t
+parse_bits(char *arg, const char *desc, isc_uint32_t max) {
+ isc_result_t result;
+ isc_uint32_t tmp;
+
+ result = parse_uint(&tmp, arg, max, desc);
+ if (result != ISC_R_SUCCESS)
+ fatal("couldn't parse digest bits");
+ tmp = (tmp + 7) & ~0x7U;
+ return (tmp);
+}
+
+
+/*
+ * Parse HMAC algorithm specification
+ */
+void
+parse_hmac(const char *hmac) {
+ char buf[20];
+ int len;
+
+ REQUIRE(hmac != NULL);
+
+ len = strlen(hmac);
+ if (len >= (int) sizeof(buf))
+ fatal("unknown key type '%.*s'", len, hmac);
+ strncpy(buf, hmac, sizeof(buf));
+
+ digestbits = 0;
+
+ if (strcasecmp(buf, "hmac-md5") == 0) {
+ hmacname = DNS_TSIG_HMACMD5_NAME;
+ } else if (strncasecmp(buf, "hmac-md5-", 9) == 0) {
+ hmacname = DNS_TSIG_HMACMD5_NAME;
+ digestbits = parse_bits(&buf[9], "digest-bits [0..128]", 128);
+ } else if (strcasecmp(buf, "hmac-sha1") == 0) {
+ hmacname = DNS_TSIG_HMACSHA1_NAME;
+ digestbits = 0;
+ } else if (strncasecmp(buf, "hmac-sha1-", 10) == 0) {
+ hmacname = DNS_TSIG_HMACSHA1_NAME;
+ digestbits = parse_bits(&buf[10], "digest-bits [0..160]", 160);
+ } else if (strcasecmp(buf, "hmac-sha224") == 0) {
+ hmacname = DNS_TSIG_HMACSHA224_NAME;
+ } else if (strncasecmp(buf, "hmac-sha224-", 12) == 0) {
+ hmacname = DNS_TSIG_HMACSHA224_NAME;
+ digestbits = parse_bits(&buf[12], "digest-bits [0..224]", 224);
+ } else if (strcasecmp(buf, "hmac-sha256") == 0) {
+ hmacname = DNS_TSIG_HMACSHA256_NAME;
+ } else if (strncasecmp(buf, "hmac-sha256-", 12) == 0) {
+ hmacname = DNS_TSIG_HMACSHA256_NAME;
+ digestbits = parse_bits(&buf[12], "digest-bits [0..256]", 256);
+ } else if (strcasecmp(buf, "hmac-sha384") == 0) {
+ hmacname = DNS_TSIG_HMACSHA384_NAME;
+ } else if (strncasecmp(buf, "hmac-sha384-", 12) == 0) {
+ hmacname = DNS_TSIG_HMACSHA384_NAME;
+ digestbits = parse_bits(&buf[12], "digest-bits [0..384]", 384);
+ } else if (strcasecmp(buf, "hmac-sha512") == 0) {
+ hmacname = DNS_TSIG_HMACSHA512_NAME;
+ } else if (strncasecmp(buf, "hmac-sha512-", 12) == 0) {
+ hmacname = DNS_TSIG_HMACSHA512_NAME;
+ digestbits = parse_bits(&buf[12], "digest-bits [0..512]", 512);
+ } else {
+ fprintf(stderr, ";; Warning, ignoring "
+ "invalid TSIG algorithm %s\n", buf);
+ }
+}
+
+/*
+ * Get a key from a named.conf format keyfile
+ */
+static isc_result_t
+read_confkey(void) {
+ isc_log_t *lctx = NULL;
+ cfg_parser_t *pctx = NULL;
+ cfg_obj_t *file = NULL;
+ const cfg_obj_t *key = NULL;
+ const cfg_obj_t *secretobj = NULL;
+ const cfg_obj_t *algorithmobj = NULL;
+ const char *keyname;
+ const char *secretstr;
+ const char *algorithm;
+ isc_result_t result;
+
+ if (! isc_file_exists(keyfile))
+ return (ISC_R_FILENOTFOUND);
+
+ result = cfg_parser_create(mctx, lctx, &pctx);
+ if (result != ISC_R_SUCCESS)
+ goto cleanup;
+
+ result = cfg_parse_file(pctx, keyfile, &cfg_type_sessionkey,
+ &file);
+ if (result != ISC_R_SUCCESS)
+ goto cleanup;
+
+ result = cfg_map_get(file, "key", &key);
+ if (result != ISC_R_SUCCESS)
+ goto cleanup;
+
+ (void) cfg_map_get(key, "secret", &secretobj);
+ (void) cfg_map_get(key, "algorithm", &algorithmobj);
+ if (secretobj == NULL || algorithmobj == NULL)
+ fatal("key must have algorithm and secret");
+
+ keyname = cfg_obj_asstring(cfg_map_getname(key));
+ secretstr = cfg_obj_asstring(secretobj);
+ algorithm = cfg_obj_asstring(algorithmobj);
+
+ strncpy(keynametext, keyname, sizeof(keynametext));
+ strncpy(keysecret, secretstr, sizeof(keysecret));
+ parse_hmac(algorithm);
+ setup_text_key();
+
+ cleanup:
+ if (pctx != NULL) {
+ if (file != NULL)
+ cfg_obj_destroy(pctx, &file);
+ cfg_parser_destroy(&pctx);
+ }
+
+ return (result);
+}
+
static void
setup_file_key(void) {
isc_result_t result;
dst_key_t *dstkey = NULL;
debug("setup_file_key()");
- result = dst_key_fromnamedfile(keyfile, DST_TYPE_PRIVATE | DST_TYPE_KEY,
- mctx, &dstkey);
+
+ /* Try reading the key from a K* pair */
+ result = dst_key_fromnamedfile(keyfile, NULL,
+ DST_TYPE_PRIVATE | DST_TYPE_KEY, mctx,
+ &dstkey);
+
+ /* If that didn't work, try reading it as a session.key keyfile */
+ if (result != ISC_R_SUCCESS) {
+ result = read_confkey();
+ if (result == ISC_R_SUCCESS)
+ return;
+ }
+
if (result != ISC_R_SUCCESS) {
fprintf(stderr, "Couldn't read key from %s: %s\n",
keyfile, isc_result_totext(result));
@@ -1119,6 +1291,7 @@ set_search_domain(char *domain) {
void
setup_libs(void) {
isc_result_t result;
+ isc_logconfig_t *logconfig = NULL;
debug("setup_libs()");
@@ -1135,6 +1308,18 @@ setup_libs(void) {
result = isc_mem_create(0, 0, &mctx);
check_result(result, "isc_mem_create");
+ result = isc_log_create(mctx, &lctx, &logconfig);
+ check_result(result, "isc_log_create");
+
+ isc_log_setcontext(lctx);
+ dns_log_init(lctx);
+ dns_log_setcontext(lctx);
+
+ result = isc_log_usechannel(logconfig, "default_debug", NULL, NULL);
+ check_result(result, "isc_log_usechannel");
+
+ isc_log_setdebuglevel(lctx, 0);
+
result = isc_taskmgr_create(mctx, 1, 0, &taskmgr);
check_result(result, "isc_taskmgr_create");
@@ -1871,7 +2056,7 @@ setup_lookup(dig_lookup_t *lookup) {
isc_buffer_init(&b, lookup->origin->origin, len);
isc_buffer_add(&b, len);
result = dns_name_fromtext(lookup->oname, &b, dns_rootname,
- ISC_FALSE, &lookup->onamebuf);
+ 0, &lookup->onamebuf);
if (result != ISC_R_SUCCESS) {
dns_message_puttempname(lookup->sendmsg,
&lookup->name);
@@ -1888,7 +2073,7 @@ setup_lookup(dig_lookup_t *lookup) {
isc_buffer_init(&b, lookup->textname, len);
isc_buffer_add(&b, len);
result = dns_name_fromtext(lookup->name, &b,
- lookup->oname, ISC_FALSE,
+ lookup->oname, 0,
&lookup->namebuf);
}
if (result != ISC_R_SUCCESS) {
@@ -1912,16 +2097,14 @@ setup_lookup(dig_lookup_t *lookup) {
isc_buffer_init(&b, idn_textname, len);
isc_buffer_add(&b, len);
result = dns_name_fromtext(lookup->name, &b,
- dns_rootname,
- ISC_FALSE,
+ dns_rootname, 0,
&lookup->namebuf);
#else
len = strlen(lookup->textname);
isc_buffer_init(&b, lookup->textname, len);
isc_buffer_add(&b, len);
result = dns_name_fromtext(lookup->name, &b,
- dns_rootname,
- ISC_FALSE,
+ dns_rootname, 0,
&lookup->namebuf);
#endif
}
@@ -3549,9 +3732,11 @@ destroy_libs(void) {
free_name(&chase_signame, mctx);
#endif
- debug("Destroy memory");
-
#endif
+ debug("Removing log context");
+ isc_log_destroy(&lctx);
+
+ debug("Destroy memory");
if (memdebugging != 0)
isc_mem_stats(mctx, stderr);
if (mctx != NULL)
@@ -4041,7 +4226,7 @@ get_trusted_key(isc_mem_t *mctx)
return (ISC_R_FAILURE);
}
fclose(fptemp);
- result = dst_key_fromnamedfile(filetemp, DST_TYPE_PUBLIC,
+ result = dst_key_fromnamedfile(filetemp, NULL, DST_TYPE_PUBLIC,
mctx, &key);
removetmpkey(mctx, filetemp);
isc_mem_free(mctx, filetemp);
@@ -4075,7 +4260,7 @@ nameFromString(const char *str, dns_name_t *p_ret) {
dns_fixedname_init(&fixedname);
result = dns_name_fromtext(dns_fixedname_name(&fixedname), &buffer,
- dns_rootname, ISC_TRUE, NULL);
+ dns_rootname, DNS_NAME_DOWNCASE, NULL);
check_result(result, "nameFromString");
if (dns_name_dynamic(p_ret))
diff --git a/contrib/bind9/bin/dig/host.1 b/contrib/bind9/bin/dig/host.1
index 1573eff..464d517 100644
--- a/contrib/bind9/bin/dig/host.1
+++ b/contrib/bind9/bin/dig/host.1
@@ -13,7 +13,7 @@
.\" OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
.\" PERFORMANCE OF THIS SOFTWARE.
.\"
-.\" $Id: host.1,v 1.29.114.2 2009-07-11 01:55:20 tbox Exp $
+.\" $Id: host.1,v 1.31 2009-07-11 01:12:45 tbox Exp $
.\"
.hy 0
.ad l
diff --git a/contrib/bind9/bin/dig/host.c b/contrib/bind9/bin/dig/host.c
index ab0be99..13569f6 100644
--- a/contrib/bind9/bin/dig/host.c
+++ b/contrib/bind9/bin/dig/host.c
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: host.c,v 1.116.216.5 2010-10-19 23:45:58 tbox Exp $ */
+/* $Id: host.c,v 1.124 2010-11-16 05:38:30 marka Exp $ */
/*! \file */
@@ -141,6 +141,9 @@ rcode_totext(dns_rcode_t rcode)
return totext.deconsttext;
}
+ISC_PLATFORM_NORETURN_PRE static void
+show_usage(void) ISC_PLATFORM_NORETURN_POST;
+
static void
show_usage(void) {
fputs(
diff --git a/contrib/bind9/bin/dig/host.docbook b/contrib/bind9/bin/dig/host.docbook
index 41175aa..9ffd8e6 100644
--- a/contrib/bind9/bin/dig/host.docbook
+++ b/contrib/bind9/bin/dig/host.docbook
@@ -18,7 +18,7 @@
- PERFORMANCE OF THIS SOFTWARE.
-->
-<!-- $Id: host.docbook,v 1.18.114.2 2009-01-22 23:47:05 tbox Exp $ -->
+<!-- $Id: host.docbook,v 1.20 2009-01-20 23:47:56 tbox Exp $ -->
<refentry id="man.host">
<refentryinfo>
diff --git a/contrib/bind9/bin/dig/host.html b/contrib/bind9/bin/dig/host.html
index de4b579..531fc1d 100644
--- a/contrib/bind9/bin/dig/host.html
+++ b/contrib/bind9/bin/dig/host.html
@@ -14,7 +14,7 @@
- OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
- PERFORMANCE OF THIS SOFTWARE.
-->
-<!-- $Id: host.html,v 1.28.114.2 2009-07-11 01:55:20 tbox Exp $ -->
+<!-- $Id: host.html,v 1.30 2009-07-11 01:12:45 tbox Exp $ -->
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
diff --git a/contrib/bind9/bin/dig/include/dig/dig.h b/contrib/bind9/bin/dig/include/dig/dig.h
index 3d696c7..c0f778b 100644
--- a/contrib/bind9/bin/dig/include/dig/dig.h
+++ b/contrib/bind9/bin/dig/include/dig/dig.h
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: dig.h,v 1.107.120.2 2009-01-06 23:47:26 tbox Exp $ */
+/* $Id: dig.h,v 1.111 2009-09-29 15:06:06 fdupont Exp $ */
#ifndef DIG_H
#define DIG_H
@@ -292,8 +292,9 @@ isc_result_t
get_reverse(char *reverse, size_t len, char *value, isc_boolean_t ip6_int,
isc_boolean_t strict);
-void
-fatal(const char *format, ...) ISC_FORMAT_PRINTF(1, 2);
+ISC_PLATFORM_NORETURN_PRE void
+fatal(const char *format, ...)
+ISC_FORMAT_PRINTF(1, 2) ISC_PLATFORM_NORETURN_POST;
void
debug(const char *format, ...) ISC_FORMAT_PRINTF(1, 2);
@@ -325,6 +326,13 @@ setup_libs(void);
void
setup_system(void);
+isc_result_t
+parse_uint(isc_uint32_t *uip, const char *value, isc_uint32_t max,
+ const char *desc);
+
+void
+parse_hmac(const char *hmacstr);
+
dig_lookup_t *
requeue_lookup(dig_lookup_t *lookold, isc_boolean_t servers);
diff --git a/contrib/bind9/bin/dig/nslookup.1 b/contrib/bind9/bin/dig/nslookup.1
index a8331f9..e97ee1f 100644
--- a/contrib/bind9/bin/dig/nslookup.1
+++ b/contrib/bind9/bin/dig/nslookup.1
@@ -12,7 +12,7 @@
.\" OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
.\" PERFORMANCE OF THIS SOFTWARE.
.\"
-.\" $Id: nslookup.1,v 1.14.354.2 2010-02-23 01:56:02 tbox Exp $
+.\" $Id: nslookup.1,v 1.16 2010-02-23 01:14:31 tbox Exp $
.\"
.hy 0
.ad l
diff --git a/contrib/bind9/bin/dig/nslookup.c b/contrib/bind9/bin/dig/nslookup.c
index 8a166fd..0d368b1 100644
--- a/contrib/bind9/bin/dig/nslookup.c
+++ b/contrib/bind9/bin/dig/nslookup.c
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004-2007, 2009 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004-2010 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 2000-2003 Internet Software Consortium.
*
* Permission to use, copy, modify, and/or distribute this software for any
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: nslookup.c,v 1.117.334.5 2009-10-20 01:11:22 marka Exp $ */
+/* $Id: nslookup.c,v 1.127 2010-11-17 23:47:08 tbox Exp $ */
#include <config.h>
@@ -541,22 +541,6 @@ safecpy(char *dest, char *src, int size) {
dest[size-1] = 0;
}
-static isc_result_t
-parse_uint(isc_uint32_t *uip, const char *value, isc_uint32_t max,
- const char *desc) {
- isc_uint32_t n;
- isc_result_t result = isc_parse_uint32(&n, value, 10);
- if (result == ISC_R_SUCCESS && n > max)
- result = ISC_R_RANGE;
- if (result != ISC_R_SUCCESS) {
- printf("invalid %s '%s': %s\n", desc,
- value, isc_result_totext(result));
- return result;
- }
- *uip = n;
- return (ISC_R_SUCCESS);
-}
-
static void
set_port(const char *value) {
isc_uint32_t n;
diff --git a/contrib/bind9/bin/dig/nslookup.docbook b/contrib/bind9/bin/dig/nslookup.docbook
index fb6e706..9c4789d 100644
--- a/contrib/bind9/bin/dig/nslookup.docbook
+++ b/contrib/bind9/bin/dig/nslookup.docbook
@@ -17,7 +17,7 @@
- PERFORMANCE OF THIS SOFTWARE.
-->
-<!-- $Id: nslookup.docbook,v 1.16.334.2 2010-02-22 23:47:53 tbox Exp $ -->
+<!-- $Id: nslookup.docbook,v 1.18 2010-02-22 23:49:11 tbox Exp $ -->
<!--
- Copyright (c) 1985, 1989
- The Regents of the University of California. All rights reserved.
diff --git a/contrib/bind9/bin/dig/nslookup.html b/contrib/bind9/bin/dig/nslookup.html
index bff3528..bae63bd 100644
--- a/contrib/bind9/bin/dig/nslookup.html
+++ b/contrib/bind9/bin/dig/nslookup.html
@@ -13,7 +13,7 @@
- OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
- PERFORMANCE OF THIS SOFTWARE.
-->
-<!-- $Id: nslookup.html,v 1.21.354.2 2010-02-23 01:56:02 tbox Exp $ -->
+<!-- $Id: nslookup.html,v 1.23 2010-02-23 01:14:31 tbox Exp $ -->
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
diff --git a/contrib/bind9/bin/dnssec/Makefile.in b/contrib/bind9/bin/dnssec/Makefile.in
index 50429be..0f5e4e8 100644
--- a/contrib/bind9/bin/dnssec/Makefile.in
+++ b/contrib/bind9/bin/dnssec/Makefile.in
@@ -1,4 +1,4 @@
-# Copyright (C) 2004, 2005, 2007, 2008 Internet Systems Consortium, Inc. ("ISC")
+# Copyright (C) 2004, 2005, 2007-2009 Internet Systems Consortium, Inc. ("ISC")
# Copyright (C) 2000-2002 Internet Software Consortium.
#
# Permission to use, copy, modify, and/or distribute this software for any
@@ -13,7 +13,7 @@
# OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
# PERFORMANCE OF THIS SOFTWARE.
-# $Id: Makefile.in,v 1.35 2008-11-07 02:28:49 marka Exp $
+# $Id: Makefile.in,v 1.42 2009-12-05 23:31:40 each Exp $
srcdir = @srcdir@
VPATH = @srcdir@
@@ -25,11 +25,12 @@ top_srcdir = @top_srcdir@
CINCLUDES = ${DNS_INCLUDES} ${ISC_INCLUDES}
-CDEFINES = -DVERSION=\"${VERSION}\"
+CDEFINES = -DVERSION=\"${VERSION}\" @USE_PKCS11@
CWARNINGS =
DNSLIBS = ../../lib/dns/libdns.@A@ @DNS_CRYPTO_LIBS@
ISCLIBS = ../../lib/isc/libisc.@A@
+ISCNOSYMLIBS = ../../lib/isc/libisc-nosymtbl.@A@
DNSDEPLIBS = ../../lib/dns/libdns.@A@
ISCDEPLIBS = ../../lib/isc/libisc.@A@
@@ -38,44 +39,56 @@ DEPLIBS = ${DNSDEPLIBS} ${ISCDEPLIBS}
LIBS = ${DNSLIBS} ${ISCLIBS} @LIBS@
+NOSYMLIBS = ${DNSLIBS} ${ISCNOSYMLIBS} @LIBS@
+
# Alphabetically
TARGETS = dnssec-keygen@EXEEXT@ dnssec-signzone@EXEEXT@ \
- dnssec-keyfromlabel@EXEEXT@ dnssec-dsfromkey@EXEEXT@
+ dnssec-keyfromlabel@EXEEXT@ dnssec-dsfromkey@EXEEXT@ \
+ dnssec-revoke@EXEEXT@ dnssec-settime@EXEEXT@
OBJS = dnssectool.@O@
SRCS = dnssec-dsfromkey.c dnssec-keyfromlabel.c dnssec-keygen.c \
- dnssec-signzone.c dnssectool.c
+ dnssec-revoke.c dnssec-settime.c dnssec-signzone.c dnssectool.c
MANPAGES = dnssec-dsfromkey.8 dnssec-keyfromlabel.8 dnssec-keygen.8 \
- dnssec-signzone.8
+ dnssec-revoke.8 dnssec-settime.8 dnssec-signzone.8
HTMLPAGES = dnssec-dsfromkey.html dnssec-keyfromlabel.html \
- dnssec-keygen.html dnssec-signzone.html
+ dnssec-keygen.html dnssec-revoke.html \
+ dnssec-settime.html dnssec-signzone.html
MANOBJS = ${MANPAGES} ${HTMLPAGES}
@BIND9_MAKE_RULES@
dnssec-dsfromkey@EXEEXT@: dnssec-dsfromkey.@O@ ${OBJS} ${DEPLIBS}
- ${LIBTOOL_MODE_LINK} ${PURIFY} ${CC} ${CFLAGS} ${LDFLAGS} -o $@ \
- dnssec-dsfromkey.@O@ ${OBJS} ${LIBS}
+ export BASEOBJS="dnssec-dsfromkey.@O@ ${OBJS}"; \
+ ${FINALBUILDCMD}
dnssec-keyfromlabel@EXEEXT@: dnssec-keyfromlabel.@O@ ${OBJS} ${DEPLIBS}
- ${LIBTOOL_MODE_LINK} ${PURIFY} ${CC} ${CFLAGS} ${LDFLAGS} -o $@ \
- dnssec-keyfromlabel.@O@ ${OBJS} ${LIBS}
+ export BASEOBJS="dnssec-keyfromlabel.@O@ ${OBJS}"; \
+ ${FINALBUILDCMD}
dnssec-keygen@EXEEXT@: dnssec-keygen.@O@ ${OBJS} ${DEPLIBS}
- ${LIBTOOL_MODE_LINK} ${PURIFY} ${CC} ${CFLAGS} ${LDFLAGS} -o $@ \
- dnssec-keygen.@O@ ${OBJS} ${LIBS}
+ export BASEOBJS="dnssec-keygen.@O@ ${OBJS}"; \
+ ${FINALBUILDCMD}
dnssec-signzone.@O@: dnssec-signzone.c
${LIBTOOL_MODE_COMPILE} ${CC} ${ALL_CFLAGS} -DVERSION=\"${VERSION}\" \
-c ${srcdir}/dnssec-signzone.c
dnssec-signzone@EXEEXT@: dnssec-signzone.@O@ ${OBJS} ${DEPLIBS}
+ export BASEOBJS="dnssec-signzone.@O@ ${OBJS}"; \
+ ${FINALBUILDCMD}
+
+dnssec-revoke@EXEEXT@: dnssec-revoke.@O@ ${OBJS} ${DEPLIBS}
+ ${LIBTOOL_MODE_LINK} ${PURIFY} ${CC} ${CFLAGS} ${LDFLAGS} -o $@ \
+ dnssec-revoke.@O@ ${OBJS} ${LIBS}
+
+dnssec-settime@EXEEXT@: dnssec-settime.@O@ ${OBJS} ${DEPLIBS}
${LIBTOOL_MODE_LINK} ${PURIFY} ${CC} ${CFLAGS} ${LDFLAGS} -o $@ \
- dnssec-signzone.@O@ ${OBJS} ${LIBS}
+ dnssec-settime.@O@ ${OBJS} ${LIBS}
doc man:: ${MANOBJS}
diff --git a/contrib/bind9/bin/dnssec/dnssec-dsfromkey.8 b/contrib/bind9/bin/dnssec/dnssec-dsfromkey.8
index c49ccdc..25aa2bf 100644
--- a/contrib/bind9/bin/dnssec/dnssec-dsfromkey.8
+++ b/contrib/bind9/bin/dnssec/dnssec-dsfromkey.8
@@ -1,4 +1,4 @@
-.\" Copyright (C) 2008 Internet Systems Consortium, Inc. ("ISC")
+.\" Copyright (C) 2008-2010 Internet Systems Consortium, Inc. ("ISC")
.\"
.\" Permission to use, copy, modify, and/or distribute this software for any
.\" purpose with or without fee is hereby granted, provided that the above
@@ -12,18 +12,18 @@
.\" OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
.\" PERFORMANCE OF THIS SOFTWARE.
.\"
-.\" $Id: dnssec-dsfromkey.8,v 1.5.14.1 2010-05-19 02:06:11 tbox Exp $
+.\" $Id: dnssec-dsfromkey.8,v 1.13 2010-12-24 01:14:20 tbox Exp $
.\"
.hy 0
.ad l
.\" Title: dnssec\-dsfromkey
.\" Author:
.\" Generator: DocBook XSL Stylesheets v1.71.1 <http://docbook.sf.net/>
-.\" Date: November 29, 2008
+.\" Date: August 26, 2009
.\" Manual: BIND9
.\" Source: BIND9
.\"
-.TH "DNSSEC\-DSFROMKEY" "8" "November 29, 2008" "BIND9" "BIND9"
+.TH "DNSSEC\-DSFROMKEY" "8" "August 26, 2009" "BIND9" "BIND9"
.\" disable hyphenation
.nh
.\" disable justification (adjust text to left margin only)
@@ -32,9 +32,9 @@
dnssec\-dsfromkey \- DNSSEC DS RR generation tool
.SH "SYNOPSIS"
.HP 17
-\fBdnssec\-dsfromkey\fR [\fB\-v\ \fR\fB\fIlevel\fR\fR] [\fB\-1\fR] [\fB\-2\fR] [\fB\-a\ \fR\fB\fIalg\fR\fR] {keyfile}
+\fBdnssec\-dsfromkey\fR [\fB\-v\ \fR\fB\fIlevel\fR\fR] [\fB\-1\fR] [\fB\-2\fR] [\fB\-a\ \fR\fB\fIalg\fR\fR] [\fB\-l\ \fR\fB\fIdomain\fR\fR] {keyfile}
.HP 17
-\fBdnssec\-dsfromkey\fR {\-s} [\fB\-v\ \fR\fB\fIlevel\fR\fR] [\fB\-1\fR] [\fB\-2\fR] [\fB\-a\ \fR\fB\fIalg\fR\fR] [\fB\-c\ \fR\fB\fIclass\fR\fR] [\fB\-d\ \fR\fB\fIdir\fR\fR] {dnsname}
+\fBdnssec\-dsfromkey\fR {\-s} [\fB\-1\fR] [\fB\-2\fR] [\fB\-a\ \fR\fB\fIalg\fR\fR] [\fB\-K\ \fR\fB\fIdirectory\fR\fR] [\fB\-l\ \fR\fB\fIdomain\fR\fR] [\fB\-s\fR] [\fB\-c\ \fR\fB\fIclass\fR\fR] [\fB\-f\ \fR\fB\fIfile\fR\fR] [\fB\-A\fR] [\fB\-v\ \fR\fB\fIlevel\fR\fR] {dnsname}
.SH "DESCRIPTION"
.PP
\fBdnssec\-dsfromkey\fR
@@ -55,31 +55,49 @@ Use SHA\-256 as the digest algorithm.
.RS 4
Select the digest algorithm. The value of
\fBalgorithm\fR
-must be one of SHA\-1 (SHA1) or SHA\-256 (SHA256). These values are case insensitive.
+must be one of SHA\-1 (SHA1), SHA\-256 (SHA256) or GOST. These values are case insensitive.
.RE
.PP
-\-v \fIlevel\fR
+\-K \fIdirectory\fR
.RS 4
-Sets the debugging level.
+Look for key files (or, in keyset mode,
+\fIkeyset\-\fR
+files) in
+\fBdirectory\fR.
+.RE
+.PP
+\-f \fIfile\fR
+.RS 4
+Zone file mode: in place of the keyfile name, the argument is the DNS domain name of a zone master file, which can be read from
+\fBfile\fR. If the zone name is the same as
+\fBfile\fR, then it may be omitted.
+.RE
+.PP
+\-A
+.RS 4
+Include ZSK's when generating DS records. Without this option, only keys which have the KSK flag set will be converted to DS records and printed. Useful only in zone file mode.
+.RE
+.PP
+\-l \fIdomain\fR
+.RS 4
+Generate a DLV set instead of a DS set. The specified
+\fBdomain\fR
+is appended to the name for each record in the set. The DNSSEC Lookaside Validation (DLV) RR is described in RFC 4431.
.RE
.PP
\-s
.RS 4
-Keyset mode: in place of the keyfile name, the argument is the DNS domain name of a keyset file. Following options make sense only in this mode.
+Keyset mode: in place of the keyfile name, the argument is the DNS domain name of a keyset file.
.RE
.PP
\-c \fIclass\fR
.RS 4
-Specifies the DNS class (default is IN), useful only in the keyset mode.
+Specifies the DNS class (default is IN). Useful only in keyset or zone file mode.
.RE
.PP
-\-d \fIdirectory\fR
+\-v \fIlevel\fR
.RS 4
-Look for
-\fIkeyset\fR
-files in
-\fBdirectory\fR
-as the directory, ignored when not in the keyset mode.
+Sets the debugging level.
.RE
.SH "EXAMPLE"
.PP
@@ -115,10 +133,11 @@ A keyfile error can give a "file not found" even if the file exists.
\fBdnssec\-signzone\fR(8),
BIND 9 Administrator Reference Manual,
RFC 3658,
+RFC 4431.
RFC 4509.
.SH "AUTHOR"
.PP
Internet Systems Consortium
.SH "COPYRIGHT"
-Copyright \(co 2008 Internet Systems Consortium, Inc. ("ISC")
+Copyright \(co 2008\-2010 Internet Systems Consortium, Inc. ("ISC")
.br
diff --git a/contrib/bind9/bin/dnssec/dnssec-dsfromkey.c b/contrib/bind9/bin/dnssec/dnssec-dsfromkey.c
index 934d25b..b7f84a0 100644
--- a/contrib/bind9/bin/dnssec/dnssec-dsfromkey.c
+++ b/contrib/bind9/bin/dnssec/dnssec-dsfromkey.c
@@ -14,7 +14,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: dnssec-dsfromkey.c,v 1.2.14.6 2010-01-11 23:47:22 tbox Exp $ */
+/* $Id: dnssec-dsfromkey.c,v 1.19 2010-12-23 04:07:59 marka Exp $ */
/*! \file */
@@ -36,6 +36,8 @@
#include <dns/ds.h>
#include <dns/fixedname.h>
#include <dns/log.h>
+#include <dns/keyvalues.h>
+#include <dns/master.h>
#include <dns/name.h>
#include <dns/rdata.h>
#include <dns/rdataclass.h>
@@ -48,54 +50,40 @@
#include "dnssectool.h"
+#ifndef PATH_MAX
+#define PATH_MAX 1024 /* AIX, WIN32, and others don't define this. */
+#endif
+
const char *program = "dnssec-dsfromkey";
int verbose;
static dns_rdataclass_t rdclass;
-static dns_fixedname_t fixed;
-static dns_name_t *name = NULL;
-static dns_db_t *db = NULL;
-static dns_dbnode_t *node = NULL;
-static dns_rdataset_t keyset;
-static isc_mem_t *mctx = NULL;
+static dns_fixedname_t fixed;
+static dns_name_t *name = NULL;
+static isc_mem_t *mctx = NULL;
-static void
-loadkeys(char *dirname, char *setname)
-{
- isc_result_t result;
- char filename[1024];
- isc_buffer_t buf;
+static isc_result_t
+initname(char *setname) {
+ isc_result_t result;
+ isc_buffer_t buf;
- dns_rdataset_init(&keyset);
dns_fixedname_init(&fixed);
name = dns_fixedname_name(&fixed);
isc_buffer_init(&buf, setname, strlen(setname));
isc_buffer_add(&buf, strlen(setname));
- result = dns_name_fromtext(name, &buf, dns_rootname, ISC_FALSE, NULL);
- if (result != ISC_R_SUCCESS)
- fatal("can't convert DNS name %s", setname);
+ result = dns_name_fromtext(name, &buf, dns_rootname, 0, NULL);
+ return (result);
+}
- isc_buffer_init(&buf, filename, sizeof(filename));
- if (dirname != NULL) {
- if (isc_buffer_availablelength(&buf) < strlen(dirname))
- fatal("directory name '%s' too long", dirname);
- isc_buffer_putstr(&buf, dirname);
- if (dirname[strlen(dirname) - 1] != '/') {
- if (isc_buffer_availablelength(&buf) < 1)
- fatal("directory name '%s' too long", dirname);
- isc_buffer_putstr(&buf, "/");
- }
- }
+static isc_result_t
+loadsetfromfile(char *filename, dns_rdataset_t *rdataset) {
+ isc_result_t result;
+ dns_db_t *db = NULL;
+ dns_dbnode_t *node = NULL;
+ char setname[DNS_NAME_FORMATSIZE];
- if (isc_buffer_availablelength(&buf) < strlen("keyset-"))
- fatal("directory name '%s' too long", dirname);
- isc_buffer_putstr(&buf, "keyset-");
- result = dns_name_tofilenametext(name, ISC_FALSE, &buf);
- check_result(result, "dns_name_tofilenametext()");
- if (isc_buffer_availablelength(&buf) == 0)
- fatal("name %s too long", setname);
- isc_buffer_putuint8(&buf, 0);
+ dns_name_format(name, setname, sizeof(setname));
result = dns_db_create(mctx, "rbt", name, dns_dbtype_zone,
rdclass, 0, NULL, &db);
@@ -111,11 +99,49 @@ loadkeys(char *dirname, char *setname)
fatal("can't find %s node in %s", setname, filename);
result = dns_db_findrdataset(db, node, NULL, dns_rdatatype_dnskey,
- 0, 0, &keyset, NULL);
+ 0, 0, rdataset, NULL);
+
if (result == ISC_R_NOTFOUND)
fatal("no DNSKEY RR for %s in %s", setname, filename);
else if (result != ISC_R_SUCCESS)
fatal("dns_db_findrdataset");
+
+ if (node != NULL)
+ dns_db_detachnode(db, &node);
+ if (db != NULL)
+ dns_db_detach(&db);
+ return (result);
+}
+
+static isc_result_t
+loadkeyset(char *dirname, dns_rdataset_t *rdataset) {
+ isc_result_t result;
+ char filename[PATH_MAX + 1];
+ isc_buffer_t buf;
+
+ dns_rdataset_init(rdataset);
+
+ isc_buffer_init(&buf, filename, sizeof(filename));
+ if (dirname != NULL) {
+ /* allow room for a trailing slash */
+ if (strlen(dirname) >= isc_buffer_availablelength(&buf))
+ return (ISC_R_NOSPACE);
+ isc_buffer_putstr(&buf, dirname);
+ if (dirname[strlen(dirname) - 1] != '/')
+ isc_buffer_putstr(&buf, "/");
+ }
+
+ if (isc_buffer_availablelength(&buf) < 7)
+ return (ISC_R_NOSPACE);
+ isc_buffer_putstr(&buf, "keyset-");
+
+ result = dns_name_tofilenametext(name, ISC_FALSE, &buf);
+ check_result(result, "dns_name_tofilenametext()");
+ if (isc_buffer_availablelength(&buf) == 0)
+ return (ISC_R_NOSPACE);
+ isc_buffer_putuint8(&buf, 0);
+
+ return (loadsetfromfile(filename, rdataset));
}
static void
@@ -127,20 +153,20 @@ loadkey(char *filename, unsigned char *key_buf, unsigned int key_buf_size,
isc_buffer_t keyb;
isc_region_t r;
- dns_rdataset_init(&keyset);
dns_rdata_init(rdata);
isc_buffer_init(&keyb, key_buf, key_buf_size);
- result = dst_key_fromnamedfile(filename, DST_TYPE_PUBLIC, mctx, &key);
+ result = dst_key_fromnamedfile(filename, NULL, DST_TYPE_PUBLIC,
+ mctx, &key);
if (result != ISC_R_SUCCESS)
fatal("invalid keyfile name %s: %s",
filename, isc_result_totext(result));
if (verbose > 2) {
- char keystr[KEY_FORMATSIZE];
+ char keystr[DST_KEY_FORMATSIZE];
- key_format(key, keystr, sizeof(keystr));
+ dst_key_format(key, keystr, sizeof(keystr));
fprintf(stderr, "%s: %s\n", program, keystr);
}
@@ -169,7 +195,7 @@ logkey(dns_rdata_t *rdata)
isc_result_t result;
dst_key_t *key = NULL;
isc_buffer_t buf;
- char keystr[KEY_FORMATSIZE];
+ char keystr[DST_KEY_FORMATSIZE];
isc_buffer_init(&buf, rdata->data, rdata->length);
isc_buffer_add(&buf, rdata->length);
@@ -177,89 +203,132 @@ logkey(dns_rdata_t *rdata)
if (result != ISC_R_SUCCESS)
return;
- key_format(key, keystr, sizeof(keystr));
+ dst_key_format(key, keystr, sizeof(keystr));
fprintf(stderr, "%s: %s\n", program, keystr);
dst_key_free(&key);
}
static void
-emitds(unsigned int dtype, dns_rdata_t *rdata)
+emit(unsigned int dtype, isc_boolean_t showall, char *lookaside,
+ dns_rdata_t *rdata)
{
- isc_result_t result;
- unsigned char buf[DNS_DS_BUFFERSIZE];
- char text_buf[DST_KEY_MAXTEXTSIZE];
- char class_buf[10];
- isc_buffer_t textb, classb;
- isc_region_t r;
- dns_rdata_t ds;
+ isc_result_t result;
+ unsigned char buf[DNS_DS_BUFFERSIZE];
+ char text_buf[DST_KEY_MAXTEXTSIZE];
+ char name_buf[DNS_NAME_MAXWIRE];
+ char class_buf[10];
+ isc_buffer_t textb, nameb, classb;
+ isc_region_t r;
+ dns_rdata_t ds;
+ dns_rdata_dnskey_t dnskey;
isc_buffer_init(&textb, text_buf, sizeof(text_buf));
+ isc_buffer_init(&nameb, name_buf, sizeof(name_buf));
isc_buffer_init(&classb, class_buf, sizeof(class_buf));
dns_rdata_init(&ds);
+ result = dns_rdata_tostruct(rdata, &dnskey, NULL);
+ if (result != ISC_R_SUCCESS)
+ fatal("can't convert DNSKEY");
+
+ if ((dnskey.flags & DNS_KEYFLAG_KSK) == 0 && !showall)
+ return;
+
result = dns_ds_buildrdata(name, rdata, dtype, buf, &ds);
if (result != ISC_R_SUCCESS)
- fatal("can't build DS");
+ fatal("can't build record");
+
+ result = dns_name_totext(name, ISC_FALSE, &nameb);
+ if (result != ISC_R_SUCCESS)
+ fatal("can't print name");
+
+ /* Add lookaside origin, if set */
+ if (lookaside != NULL) {
+ if (isc_buffer_availablelength(&nameb) < strlen(lookaside))
+ fatal("DLV origin '%s' is too long", lookaside);
+ isc_buffer_putstr(&nameb, lookaside);
+ if (lookaside[strlen(lookaside) - 1] != '.') {
+ if (isc_buffer_availablelength(&nameb) < 1)
+ fatal("DLV origin '%s' is too long", lookaside);
+ isc_buffer_putstr(&nameb, ".");
+ }
+ }
result = dns_rdata_totext(&ds, (dns_name_t *) NULL, &textb);
if (result != ISC_R_SUCCESS)
- fatal("can't print DS rdata");
+ fatal("can't print rdata");
result = dns_rdataclass_totext(rdclass, &classb);
if (result != ISC_R_SUCCESS)
- fatal("can't print DS class");
+ fatal("can't print class");
- result = dns_name_print(name, stdout);
- if (result != ISC_R_SUCCESS)
- fatal("can't print DS name");
+ isc_buffer_usedregion(&nameb, &r);
+ isc_util_fwrite(r.base, 1, r.length, stdout);
putchar(' ');
isc_buffer_usedregion(&classb, &r);
isc_util_fwrite(r.base, 1, r.length, stdout);
- printf(" DS ");
+ if (lookaside == NULL)
+ printf(" DS ");
+ else
+ printf(" DLV ");
isc_buffer_usedregion(&textb, &r);
isc_util_fwrite(r.base, 1, r.length, stdout);
putchar('\n');
}
+ISC_PLATFORM_NORETURN_PRE static void
+usage(void) ISC_PLATFORM_NORETURN_POST;
+
static void
usage(void) {
fprintf(stderr, "Usage:\n");
- fprintf(stderr, " %s options keyfile\n\n", program);
- fprintf(stderr, " %s options [-c class] [-d dir] -s dnsname\n\n",
+ fprintf(stderr, " %s options [-K dir] keyfile\n\n", program);
+ fprintf(stderr, " %s options [-K dir] [-c class] -s dnsname\n\n",
program);
+ fprintf(stderr, " %s options -f zonefile (as zone name)\n\n", program);
+ fprintf(stderr, " %s options -f zonefile zonename\n\n", program);
fprintf(stderr, "Version: %s\n", VERSION);
fprintf(stderr, "Options:\n");
fprintf(stderr, " -v <verbose level>\n");
+ fprintf(stderr, " -K <directory>: directory in which to find "
+ "key file or keyset file\n");
+ fprintf(stderr, " -a algorithm: digest algorithm "
+ "(SHA-1, SHA-256 or GOST)\n");
fprintf(stderr, " -1: use SHA-1\n");
fprintf(stderr, " -2: use SHA-256\n");
- fprintf(stderr, " -a algorithm: use algorithm\n");
- fprintf(stderr, "Keyset options:\n");
- fprintf(stderr, " -s: keyset mode\n");
- fprintf(stderr, " -c class\n");
- fprintf(stderr, " -d directory\n");
- fprintf(stderr, "Output: DS RRs\n");
+ fprintf(stderr, " -l: add lookaside zone and print DLV records\n");
+ fprintf(stderr, " -s: read keyset from keyset-<dnsname> file\n");
+ fprintf(stderr, " -c class: rdata class for DS set (default: IN)\n");
+ fprintf(stderr, " -f file: read keyset from zone file\n");
+ fprintf(stderr, " -A: when used with -f, "
+ "include all keys in DS set, not just KSKs\n");
+ fprintf(stderr, "Output: DS or DLV RRs\n");
exit (-1);
}
int
main(int argc, char **argv) {
- char *algname = NULL, *classname = NULL, *dirname = NULL;
- char *endp;
- int ch;
- unsigned int dtype = DNS_DSDIGEST_SHA1;
- isc_boolean_t both = ISC_TRUE;
- isc_boolean_t usekeyset = ISC_FALSE;
- isc_result_t result;
- isc_log_t *log = NULL;
- isc_entropy_t *ectx = NULL;
- dns_rdata_t rdata;
+ char *algname = NULL, *classname = NULL;
+ char *filename = NULL, *dir = NULL, *namestr;
+ char *lookaside = NULL;
+ char *endp;
+ int ch;
+ unsigned int dtype = DNS_DSDIGEST_SHA1;
+ isc_boolean_t both = ISC_TRUE;
+ isc_boolean_t usekeyset = ISC_FALSE;
+ isc_boolean_t showall = ISC_FALSE;
+ isc_result_t result;
+ isc_log_t *log = NULL;
+ isc_entropy_t *ectx = NULL;
+ dns_rdataset_t rdataset;
+ dns_rdata_t rdata;
dns_rdata_init(&rdata);
@@ -275,7 +344,7 @@ main(int argc, char **argv) {
isc_commandline_errprint = ISC_FALSE;
while ((ch = isc_commandline_parse(argc, argv,
- "12a:c:d:sv:h")) != -1) {
+ "12Aa:c:d:Ff:K:l:sv:h")) != -1) {
switch (ch) {
case '1':
dtype = DNS_DSDIGEST_SHA1;
@@ -285,6 +354,9 @@ main(int argc, char **argv) {
dtype = DNS_DSDIGEST_SHA256;
both = ISC_FALSE;
break;
+ case 'A':
+ showall = ISC_TRUE;
+ break;
case 'a':
algname = isc_commandline_argument;
both = ISC_FALSE;
@@ -293,7 +365,21 @@ main(int argc, char **argv) {
classname = isc_commandline_argument;
break;
case 'd':
- dirname = isc_commandline_argument;
+ fprintf(stderr, "%s: the -d option is deprecated; "
+ "use -K\n", program);
+ /* fall through */
+ case 'K':
+ dir = isc_commandline_argument;
+ if (strlen(dir) == 0U)
+ fatal("directory must be non-empty string");
+ break;
+ case 'f':
+ filename = isc_commandline_argument;
+ break;
+ case 'l':
+ lookaside = isc_commandline_argument;
+ if (strlen(lookaside) == 0U)
+ fatal("lookaside must be a non-empty string");
break;
case 's':
usekeyset = ISC_TRUE;
@@ -303,11 +389,14 @@ main(int argc, char **argv) {
if (*endp != '\0')
fatal("-v must be followed by a number");
break;
+ case 'F':
+ /* Reserved for FIPS mode */
+ /* FALLTHROUGH */
case '?':
if (isc_commandline_option != '?')
fprintf(stderr, "%s: invalid argument -%c\n",
program, isc_commandline_option);
- /* Falls into */
+ /* FALLTHROUGH */
case 'h':
usage();
@@ -325,13 +414,24 @@ main(int argc, char **argv) {
else if (strcasecmp(algname, "SHA256") == 0 ||
strcasecmp(algname, "SHA-256") == 0)
dtype = DNS_DSDIGEST_SHA256;
+#ifdef HAVE_OPENSSL_GOST
+ else if (strcasecmp(algname, "GOST") == 0)
+ dtype = DNS_DSDIGEST_GOST;
+#endif
else
fatal("unknown algorithm %s", algname);
}
rdclass = strtoclass(classname);
- if (argc < isc_commandline_index + 1)
+ if (usekeyset && filename != NULL)
+ fatal("cannot use both -s and -f");
+
+ /* When not using -f, -A is implicit */
+ if (filename == NULL)
+ showall = ISC_TRUE;
+
+ if (argc < isc_commandline_index + 1 && filename == NULL)
fatal("the key file name was not specified");
if (argc > isc_commandline_index + 1)
fatal("extraneous arguments");
@@ -344,28 +444,50 @@ main(int argc, char **argv) {
result = dst_lib_init(mctx, ectx,
ISC_ENTROPY_BLOCKING | ISC_ENTROPY_GOODONLY);
if (result != ISC_R_SUCCESS)
- fatal("could not initialize dst");
+ fatal("could not initialize dst: %s",
+ isc_result_totext(result));
isc_entropy_stopcallbacksources(ectx);
setup_logging(verbose, mctx, &log);
- if (usekeyset) {
- loadkeys(dirname, argv[isc_commandline_index]);
+ dns_rdataset_init(&rdataset);
+
+ if (usekeyset || filename != NULL) {
+ if (argc < isc_commandline_index + 1 && filename != NULL) {
+ /* using zone name as the zone file name */
+ namestr = filename;
+ } else
+ namestr = argv[isc_commandline_index];
- for (result = dns_rdataset_first(&keyset);
+ result = initname(namestr);
+ if (result != ISC_R_SUCCESS)
+ fatal("could not initialize name %s", namestr);
+
+ if (usekeyset)
+ result = loadkeyset(dir, &rdataset);
+ else
+ result = loadsetfromfile(filename, &rdataset);
+
+ if (result != ISC_R_SUCCESS)
+ fatal("could not load DNSKEY set: %s\n",
+ isc_result_totext(result));
+
+ for (result = dns_rdataset_first(&rdataset);
result == ISC_R_SUCCESS;
- result = dns_rdataset_next(&keyset)) {
+ result = dns_rdataset_next(&rdataset)) {
dns_rdata_init(&rdata);
- dns_rdataset_current(&keyset, &rdata);
+ dns_rdataset_current(&rdataset, &rdata);
if (verbose > 2)
logkey(&rdata);
if (both) {
- emitds(DNS_DSDIGEST_SHA1, &rdata);
- emitds(DNS_DSDIGEST_SHA256, &rdata);
+ emit(DNS_DSDIGEST_SHA1, showall, lookaside,
+ &rdata);
+ emit(DNS_DSDIGEST_SHA256, showall, lookaside,
+ &rdata);
} else
- emitds(dtype, &rdata);
+ emit(dtype, showall, lookaside, &rdata);
}
} else {
unsigned char key_buf[DST_KEY_MAXSIZE];
@@ -374,18 +496,14 @@ main(int argc, char **argv) {
DST_KEY_MAXSIZE, &rdata);
if (both) {
- emitds(DNS_DSDIGEST_SHA1, &rdata);
- emitds(DNS_DSDIGEST_SHA256, &rdata);
+ emit(DNS_DSDIGEST_SHA1, showall, lookaside, &rdata);
+ emit(DNS_DSDIGEST_SHA256, showall, lookaside, &rdata);
} else
- emitds(dtype, &rdata);
+ emit(dtype, showall, lookaside, &rdata);
}
- if (dns_rdataset_isassociated(&keyset))
- dns_rdataset_disassociate(&keyset);
- if (node != NULL)
- dns_db_detachnode(db, &node);
- if (db != NULL)
- dns_db_detach(&db);
+ if (dns_rdataset_isassociated(&rdataset))
+ dns_rdataset_disassociate(&rdataset);
cleanup_logging(&log);
dst_lib_destroy();
isc_hash_destroy();
diff --git a/contrib/bind9/bin/dnssec/dnssec-dsfromkey.docbook b/contrib/bind9/bin/dnssec/dnssec-dsfromkey.docbook
index c4ea38d..36410d5 100644
--- a/contrib/bind9/bin/dnssec/dnssec-dsfromkey.docbook
+++ b/contrib/bind9/bin/dnssec/dnssec-dsfromkey.docbook
@@ -2,7 +2,7 @@
"http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd"
[<!ENTITY mdash "&#8212;">]>
<!--
- - Copyright (C) 2008 Internet Systems Consortium, Inc. ("ISC")
+ - Copyright (C) 2008-2010 Internet Systems Consortium, Inc. ("ISC")
-
- Permission to use, copy, modify, and/or distribute this software for any
- purpose with or without fee is hereby granted, provided that the above
@@ -17,10 +17,10 @@
- PERFORMANCE OF THIS SOFTWARE.
-->
-<!-- $Id: dnssec-dsfromkey.docbook,v 1.6 2008-11-07 13:54:11 jreed Exp $ -->
+<!-- $Id: dnssec-dsfromkey.docbook,v 1.12 2010-12-23 23:47:08 tbox Exp $ -->
<refentry id="man.dnssec-dsfromkey">
<refentryinfo>
- <date>November 29, 2008</date>
+ <date>August 26, 2009</date>
</refentryinfo>
<refmeta>
@@ -37,6 +37,8 @@
<docinfo>
<copyright>
<year>2008</year>
+ <year>2009</year>
+ <year>2010</year>
<holder>Internet Systems Consortium, Inc. ("ISC")</holder>
</copyright>
</docinfo>
@@ -48,17 +50,22 @@
<arg><option>-1</option></arg>
<arg><option>-2</option></arg>
<arg><option>-a <replaceable class="parameter">alg</replaceable></option></arg>
+ <arg><option>-l <replaceable class="parameter">domain</replaceable></option></arg>
<arg choice="req">keyfile</arg>
</cmdsynopsis>
<cmdsynopsis>
<command>dnssec-dsfromkey</command>
<arg choice="req">-s</arg>
- <arg><option>-v <replaceable class="parameter">level</replaceable></option></arg>
<arg><option>-1</option></arg>
<arg><option>-2</option></arg>
<arg><option>-a <replaceable class="parameter">alg</replaceable></option></arg>
+ <arg><option>-K <replaceable class="parameter">directory</replaceable></option></arg>
+ <arg><option>-l <replaceable class="parameter">domain</replaceable></option></arg>
+ <arg><option>-s</option></arg>
<arg><option>-c <replaceable class="parameter">class</replaceable></option></arg>
- <arg><option>-d <replaceable class="parameter">dir</replaceable></option></arg>
+ <arg><option>-f <replaceable class="parameter">file</replaceable></option></arg>
+ <arg><option>-A</option></arg>
+ <arg><option>-v <replaceable class="parameter">level</replaceable></option></arg>
<arg choice="req">dnsname</arg>
</cmdsynopsis>
</refsynopsisdiv>
@@ -99,17 +106,55 @@
<listitem>
<para>
Select the digest algorithm. The value of
- <option>algorithm</option> must be one of SHA-1 (SHA1) or
- SHA-256 (SHA256). These values are case insensitive.
+ <option>algorithm</option> must be one of SHA-1 (SHA1),
+ SHA-256 (SHA256) or GOST. These values are case insensitive.
</para>
</listitem>
</varlistentry>
<varlistentry>
- <term>-v <replaceable class="parameter">level</replaceable></term>
+ <term>-K <replaceable class="parameter">directory</replaceable></term>
<listitem>
<para>
- Sets the debugging level.
+ Look for key files (or, in keyset mode,
+ <filename>keyset-</filename> files) in
+ <option>directory</option>.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>-f <replaceable class="parameter">file</replaceable></term>
+ <listitem>
+ <para>
+ Zone file mode: in place of the keyfile name, the argument is
+ the DNS domain name of a zone master file, which can be read
+ from <option>file</option>. If the zone name is the same as
+ <option>file</option>, then it may be omitted.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>-A</term>
+ <listitem>
+ <para>
+ Include ZSK's when generating DS records. Without this option,
+ only keys which have the KSK flag set will be converted to DS
+ records and printed. Useful only in zone file mode.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>-l <replaceable class="parameter">domain</replaceable></term>
+ <listitem>
+ <para>
+ Generate a DLV set instead of a DS set. The specified
+ <option>domain</option> is appended to the name for each
+ record in the set.
+ The DNSSEC Lookaside Validation (DLV) RR is described
+ in RFC 4431.
</para>
</listitem>
</varlistentry>
@@ -119,8 +164,7 @@
<listitem>
<para>
Keyset mode: in place of the keyfile name, the argument is
- the DNS domain name of a keyset file. Following options make sense
- only in this mode.
+ the DNS domain name of a keyset file.
</para>
</listitem>
</varlistentry>
@@ -129,23 +173,20 @@
<term>-c <replaceable class="parameter">class</replaceable></term>
<listitem>
<para>
- Specifies the DNS class (default is IN), useful only
- in the keyset mode.
+ Specifies the DNS class (default is IN). Useful only
+ in keyset or zone file mode.
</para>
</listitem>
</varlistentry>
<varlistentry>
- <term>-d <replaceable class="parameter">directory</replaceable></term>
+ <term>-v <replaceable class="parameter">level</replaceable></term>
<listitem>
<para>
- Look for <filename>keyset</filename> files in
- <option>directory</option> as the directory, ignored when
- not in the keyset mode.
+ Sets the debugging level.
</para>
</listitem>
</varlistentry>
-
</variablelist>
</refsect1>
@@ -197,6 +238,7 @@
</citerefentry>,
<citetitle>BIND 9 Administrator Reference Manual</citetitle>,
<citetitle>RFC 3658</citetitle>,
+ <citetitle>RFC 4431</citetitle>.
<citetitle>RFC 4509</citetitle>.
</para>
</refsect1>
diff --git a/contrib/bind9/bin/dnssec/dnssec-dsfromkey.html b/contrib/bind9/bin/dnssec/dnssec-dsfromkey.html
index 6186481..54cc1ab 100644
--- a/contrib/bind9/bin/dnssec/dnssec-dsfromkey.html
+++ b/contrib/bind9/bin/dnssec/dnssec-dsfromkey.html
@@ -1,5 +1,5 @@
<!--
- - Copyright (C) 2008 Internet Systems Consortium, Inc. ("ISC")
+ - Copyright (C) 2008-2010 Internet Systems Consortium, Inc. ("ISC")
-
- Permission to use, copy, modify, and/or distribute this software for any
- purpose with or without fee is hereby granted, provided that the above
@@ -13,7 +13,7 @@
- OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
- PERFORMANCE OF THIS SOFTWARE.
-->
-<!-- $Id: dnssec-dsfromkey.html,v 1.5.14.1 2010-05-19 02:06:11 tbox Exp $ -->
+<!-- $Id: dnssec-dsfromkey.html,v 1.13 2010-12-24 01:14:19 tbox Exp $ -->
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
@@ -28,18 +28,18 @@
</div>
<div class="refsynopsisdiv">
<h2>Synopsis</h2>
-<div class="cmdsynopsis"><p><code class="command">dnssec-dsfromkey</code> [<code class="option">-v <em class="replaceable"><code>level</code></em></code>] [<code class="option">-1</code>] [<code class="option">-2</code>] [<code class="option">-a <em class="replaceable"><code>alg</code></em></code>] {keyfile}</p></div>
-<div class="cmdsynopsis"><p><code class="command">dnssec-dsfromkey</code> {-s} [<code class="option">-v <em class="replaceable"><code>level</code></em></code>] [<code class="option">-1</code>] [<code class="option">-2</code>] [<code class="option">-a <em class="replaceable"><code>alg</code></em></code>] [<code class="option">-c <em class="replaceable"><code>class</code></em></code>] [<code class="option">-d <em class="replaceable"><code>dir</code></em></code>] {dnsname}</p></div>
+<div class="cmdsynopsis"><p><code class="command">dnssec-dsfromkey</code> [<code class="option">-v <em class="replaceable"><code>level</code></em></code>] [<code class="option">-1</code>] [<code class="option">-2</code>] [<code class="option">-a <em class="replaceable"><code>alg</code></em></code>] [<code class="option">-l <em class="replaceable"><code>domain</code></em></code>] {keyfile}</p></div>
+<div class="cmdsynopsis"><p><code class="command">dnssec-dsfromkey</code> {-s} [<code class="option">-1</code>] [<code class="option">-2</code>] [<code class="option">-a <em class="replaceable"><code>alg</code></em></code>] [<code class="option">-K <em class="replaceable"><code>directory</code></em></code>] [<code class="option">-l <em class="replaceable"><code>domain</code></em></code>] [<code class="option">-s</code>] [<code class="option">-c <em class="replaceable"><code>class</code></em></code>] [<code class="option">-f <em class="replaceable"><code>file</code></em></code>] [<code class="option">-A</code>] [<code class="option">-v <em class="replaceable"><code>level</code></em></code>] {dnsname}</p></div>
</div>
<div class="refsect1" lang="en">
-<a name="id2543424"></a><h2>DESCRIPTION</h2>
+<a name="id2543464"></a><h2>DESCRIPTION</h2>
<p><span><strong class="command">dnssec-dsfromkey</strong></span>
outputs the Delegation Signer (DS) resource record (RR), as defined in
RFC 3658 and RFC 4509, for the given key(s).
</p>
</div>
<div class="refsect1" lang="en">
-<a name="id2543435"></a><h2>OPTIONS</h2>
+<a name="id2543476"></a><h2>OPTIONS</h2>
<div class="variablelist"><dl>
<dt><span class="term">-1</span></dt>
<dd><p>
@@ -53,34 +53,54 @@
<dt><span class="term">-a <em class="replaceable"><code>algorithm</code></em></span></dt>
<dd><p>
Select the digest algorithm. The value of
- <code class="option">algorithm</code> must be one of SHA-1 (SHA1) or
- SHA-256 (SHA256). These values are case insensitive.
+ <code class="option">algorithm</code> must be one of SHA-1 (SHA1),
+ SHA-256 (SHA256) or GOST. These values are case insensitive.
</p></dd>
-<dt><span class="term">-v <em class="replaceable"><code>level</code></em></span></dt>
+<dt><span class="term">-K <em class="replaceable"><code>directory</code></em></span></dt>
<dd><p>
- Sets the debugging level.
+ Look for key files (or, in keyset mode,
+ <code class="filename">keyset-</code> files) in
+ <code class="option">directory</code>.
+ </p></dd>
+<dt><span class="term">-f <em class="replaceable"><code>file</code></em></span></dt>
+<dd><p>
+ Zone file mode: in place of the keyfile name, the argument is
+ the DNS domain name of a zone master file, which can be read
+ from <code class="option">file</code>. If the zone name is the same as
+ <code class="option">file</code>, then it may be omitted.
+ </p></dd>
+<dt><span class="term">-A</span></dt>
+<dd><p>
+ Include ZSK's when generating DS records. Without this option,
+ only keys which have the KSK flag set will be converted to DS
+ records and printed. Useful only in zone file mode.
+ </p></dd>
+<dt><span class="term">-l <em class="replaceable"><code>domain</code></em></span></dt>
+<dd><p>
+ Generate a DLV set instead of a DS set. The specified
+ <code class="option">domain</code> is appended to the name for each
+ record in the set.
+ The DNSSEC Lookaside Validation (DLV) RR is described
+ in RFC 4431.
</p></dd>
<dt><span class="term">-s</span></dt>
<dd><p>
Keyset mode: in place of the keyfile name, the argument is
- the DNS domain name of a keyset file. Following options make sense
- only in this mode.
+ the DNS domain name of a keyset file.
</p></dd>
<dt><span class="term">-c <em class="replaceable"><code>class</code></em></span></dt>
<dd><p>
- Specifies the DNS class (default is IN), useful only
- in the keyset mode.
+ Specifies the DNS class (default is IN). Useful only
+ in keyset or zone file mode.
</p></dd>
-<dt><span class="term">-d <em class="replaceable"><code>directory</code></em></span></dt>
+<dt><span class="term">-v <em class="replaceable"><code>level</code></em></span></dt>
<dd><p>
- Look for <code class="filename">keyset</code> files in
- <code class="option">directory</code> as the directory, ignored when
- not in the keyset mode.
+ Sets the debugging level.
</p></dd>
</dl></div>
</div>
<div class="refsect1" lang="en">
-<a name="id2543563"></a><h2>EXAMPLE</h2>
+<a name="id2543662"></a><h2>EXAMPLE</h2>
<p>
To build the SHA-256 DS RR from the
<strong class="userinput"><code>Kexample.com.+003+26160</code></strong>
@@ -95,7 +115,7 @@
</p>
</div>
<div class="refsect1" lang="en">
-<a name="id2543593"></a><h2>FILES</h2>
+<a name="id2543692"></a><h2>FILES</h2>
<p>
The keyfile can be designed by the key identification
<code class="filename">Knnnn.+aaa+iiiii</code> or the full file name
@@ -109,22 +129,23 @@
</p>
</div>
<div class="refsect1" lang="en">
-<a name="id2543628"></a><h2>CAVEAT</h2>
+<a name="id2543728"></a><h2>CAVEAT</h2>
<p>
A keyfile error can give a "file not found" even if the file exists.
</p>
</div>
<div class="refsect1" lang="en">
-<a name="id2543638"></a><h2>SEE ALSO</h2>
+<a name="id2543737"></a><h2>SEE ALSO</h2>
<p><span class="citerefentry"><span class="refentrytitle">dnssec-keygen</span>(8)</span>,
<span class="citerefentry"><span class="refentrytitle">dnssec-signzone</span>(8)</span>,
<em class="citetitle">BIND 9 Administrator Reference Manual</em>,
<em class="citetitle">RFC 3658</em>,
+ <em class="citetitle">RFC 4431</em>.
<em class="citetitle">RFC 4509</em>.
</p>
</div>
<div class="refsect1" lang="en">
-<a name="id2543674"></a><h2>AUTHOR</h2>
+<a name="id2543777"></a><h2>AUTHOR</h2>
<p><span class="corpauthor">Internet Systems Consortium</span>
</p>
</div>
diff --git a/contrib/bind9/bin/dnssec/dnssec-keyfromlabel.8 b/contrib/bind9/bin/dnssec/dnssec-keyfromlabel.8
index 45fc087..d8c19f2 100644
--- a/contrib/bind9/bin/dnssec/dnssec-keyfromlabel.8
+++ b/contrib/bind9/bin/dnssec/dnssec-keyfromlabel.8
@@ -1,4 +1,4 @@
-.\" Copyright (C) 2008, 2010 Internet Systems Consortium, Inc. ("ISC")
+.\" Copyright (C) 2008-2011 Internet Systems Consortium, Inc. ("ISC")
.\"
.\" Permission to use, copy, modify, and/or distribute this software for any
.\" purpose with or without fee is hereby granted, provided that the above
@@ -12,7 +12,7 @@
.\" OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
.\" PERFORMANCE OF THIS SOFTWARE.
.\"
-.\" $Id: dnssec-keyfromlabel.8,v 1.6.14.3 2010-01-16 01:55:32 tbox Exp $
+.\" $Id: dnssec-keyfromlabel.8,v 1.18.14.1.2.1 2011-06-09 03:41:05 tbox Exp $
.\"
.hy 0
.ad l
@@ -32,18 +32,22 @@
dnssec\-keyfromlabel \- DNSSEC key generation tool
.SH "SYNOPSIS"
.HP 20
-\fBdnssec\-keyfromlabel\fR {\-a\ \fIalgorithm\fR} {\-l\ \fIlabel\fR} [\fB\-c\ \fR\fB\fIclass\fR\fR] [\fB\-f\ \fR\fB\fIflag\fR\fR] [\fB\-k\fR] [\fB\-n\ \fR\fB\fInametype\fR\fR] [\fB\-p\ \fR\fB\fIprotocol\fR\fR] [\fB\-t\ \fR\fB\fItype\fR\fR] [\fB\-v\ \fR\fB\fIlevel\fR\fR] {name}
+\fBdnssec\-keyfromlabel\fR {\-l\ \fIlabel\fR} [\fB\-3\fR] [\fB\-a\ \fR\fB\fIalgorithm\fR\fR] [\fB\-A\ \fR\fB\fIdate/offset\fR\fR] [\fB\-c\ \fR\fB\fIclass\fR\fR] [\fB\-D\ \fR\fB\fIdate/offset\fR\fR] [\fB\-E\ \fR\fB\fIengine\fR\fR] [\fB\-f\ \fR\fB\fIflag\fR\fR] [\fB\-G\fR] [\fB\-I\ \fR\fB\fIdate/offset\fR\fR] [\fB\-k\fR] [\fB\-K\ \fR\fB\fIdirectory\fR\fR] [\fB\-n\ \fR\fB\fInametype\fR\fR] [\fB\-P\ \fR\fB\fIdate/offset\fR\fR] [\fB\-p\ \fR\fB\fIprotocol\fR\fR] [\fB\-R\ \fR\fB\fIdate/offset\fR\fR] [\fB\-t\ \fR\fB\fItype\fR\fR] [\fB\-v\ \fR\fB\fIlevel\fR\fR] [\fB\-y\fR] {name}
.SH "DESCRIPTION"
.PP
\fBdnssec\-keyfromlabel\fR
gets keys with the given label from a crypto hardware and builds key files for DNSSEC (Secure DNS), as defined in RFC 2535 and RFC 4034.
+.PP
+The
+\fBname\fR
+of the key is specified on the command line. This must match the name of the zone for which the key is being generated.
.SH "OPTIONS"
.PP
\-a \fIalgorithm\fR
.RS 4
Selects the cryptographic algorithm. The value of
\fBalgorithm\fR
-must be one of RSAMD5, RSASHA1, DSA, NSEC3RSASHA1, NSEC3DSA, RSASHA256, RSASHA512 or DH (Diffie Hellman). These values are case insensitive.
+must be one of RSAMD5, RSASHA1, DSA, NSEC3RSASHA1, NSEC3DSA, RSASHA256, RSASHA512 or ECCGOST. These values are case insensitive.
.sp
If no algorithm is specified, then RSASHA1 will be used by default, unless the
\fB\-3\fR
@@ -56,9 +60,19 @@ Note 1: that for DNSSEC, RSASHA1 is a mandatory to implement algorithm, and DSA
Note 2: DH automatically sets the \-k flag.
.RE
.PP
+\-3
+.RS 4
+Use an NSEC3\-capable algorithm to generate a DNSSEC key. If this option is used and no algorithm is explicitly set on the command line, NSEC3RSASHA1 will be used by default.
+.RE
+.PP
+\-E \fIengine\fR
+.RS 4
+Specifies the name of the crypto hardware (OpenSSL engine). When compiled with PKCS#11 support it defaults to "pkcs11".
+.RE
+.PP
\-l \fIlabel\fR
.RS 4
-Specifies the label of keys in the crypto hardware (PKCS#11 device).
+Specifies the label of the key pair in the crypto hardware. The label may be preceded by an optional OpenSSL engine name, separated by a colon, as in "pkcs11:keylabel".
.RE
.PP
\-n \fInametype\fR
@@ -68,6 +82,15 @@ Specifies the owner type of the key. The value of
must either be ZONE (for a DNSSEC zone key (KEY/DNSKEY)), HOST or ENTITY (for a key associated with a host (KEY)), USER (for a key associated with a user(KEY)) or OTHER (DNSKEY). These values are case insensitive.
.RE
.PP
+\-C
+.RS 4
+Compatibility mode: generates an old\-style key, without any metadata. By default,
+\fBdnssec\-keyfromlabel\fR
+will include the key's creation date in the metadata stored with the private key, and other dates may be set there as well (publication date, activation date, etc). Keys that include this data may be incompatible with older versions of BIND; the
+\fB\-C\fR
+option suppresses them.
+.RE
+.PP
\-c \fIclass\fR
.RS 4
Indicates that the DNS record containing the key should have the specified class. If not specified, class IN is used.
@@ -75,13 +98,23 @@ Indicates that the DNS record containing the key should have the specified class
.PP
\-f \fIflag\fR
.RS 4
-Set the specified flag in the flag field of the KEY/DNSKEY record. The only recognized flag is KSK (Key Signing Key) DNSKEY.
+Set the specified flag in the flag field of the KEY/DNSKEY record. The only recognized flags are KSK (Key Signing Key) and REVOKE.
+.RE
+.PP
+\-G
+.RS 4
+Generate a key, but do not publish it or sign with it. This option is incompatible with \-P and \-A.
.RE
.PP
\-h
.RS 4
Prints a short summary of the options and arguments to
-\fBdnssec\-keygen\fR.
+\fBdnssec\-keyfromlabel\fR.
+.RE
+.PP
+\-K \fIdirectory\fR
+.RS 4
+Sets the directory in which the key files are to be written.
.RE
.PP
\-k
@@ -91,7 +124,7 @@ Generate KEY records rather than DNSKEY records.
.PP
\-p \fIprotocol\fR
.RS 4
-Sets the protocol value for the generated key. The protocol is a number between 0 and 255. The default is 3 (DNSSEC). Other possible values for this argument are listed in RFC 2535 and its successors.
+Sets the protocol value for the key. The protocol is a number between 0 and 255. The default is 3 (DNSSEC). Other possible values for this argument are listed in RFC 2535 and its successors.
.RE
.PP
\-t \fItype\fR
@@ -105,6 +138,39 @@ must be one of AUTHCONF, NOAUTHCONF, NOAUTH, or NOCONF. The default is AUTHCONF.
.RS 4
Sets the debugging level.
.RE
+.PP
+\-y
+.RS 4
+Allows DNSSEC key files to be generated even if the key ID would collide with that of an existing key, in the event of either key being revoked. (This is only safe to use if you are sure you won't be using RFC 5011 trust anchor maintenance with either of the keys involved.)
+.RE
+.SH "TIMING OPTIONS"
+.PP
+Dates can be expressed in the format YYYYMMDD or YYYYMMDDHHMMSS. If the argument begins with a '+' or '\-', it is interpreted as an offset from the present time. For convenience, if such an offset is followed by one of the suffixes 'y', 'mo', 'w', 'd', 'h', or 'mi', then the offset is computed in years (defined as 365 24\-hour days, ignoring leap years), months (defined as 30 24\-hour days), weeks, days, hours, or minutes, respectively. Without a suffix, the offset is computed in seconds.
+.PP
+\-P \fIdate/offset\fR
+.RS 4
+Sets the date on which a key is to be published to the zone. After that date, the key will be included in the zone but will not be used to sign it. If not set, and if the \-G option has not been used, the default is "now".
+.RE
+.PP
+\-A \fIdate/offset\fR
+.RS 4
+Sets the date on which the key is to be activated. After that date, the key will be included in the zone and used to sign it. If not set, and if the \-G option has not been used, the default is "now".
+.RE
+.PP
+\-R \fIdate/offset\fR
+.RS 4
+Sets the date on which the key is to be revoked. After that date, the key will be flagged as revoked. It will be included in the zone and will be used to sign it.
+.RE
+.PP
+\-I \fIdate/offset\fR
+.RS 4
+Sets the date on which the key is to be retired. After that date, the key will still be included in the zone, but it will not be used to sign it.
+.RE
+.PP
+\-D \fIdate/offset\fR
+.RS 4
+Sets the date on which the key is to be deleted. After that date, the key will no longer be included in the zone. (It may remain in the key repository, however.)
+.RE
.SH "GENERATED KEY FILES"
.PP
When
@@ -138,7 +204,7 @@ file contains a DNS KEY record that can be inserted into a zone file (directly o
.PP
The
\fI.private\fR
-file contains algorithm specific fields. For obvious security reasons, this file does not have general read permission.
+file contains algorithm\-specific fields. For obvious security reasons, this file does not have general read permission.
.SH "SEE ALSO"
.PP
\fBdnssec\-keygen\fR(8),
@@ -149,5 +215,5 @@ RFC 4034.
.PP
Internet Systems Consortium
.SH "COPYRIGHT"
-Copyright \(co 2008, 2010 Internet Systems Consortium, Inc. ("ISC")
+Copyright \(co 2008\-2011 Internet Systems Consortium, Inc. ("ISC")
.br
diff --git a/contrib/bind9/bin/dnssec/dnssec-keyfromlabel.c b/contrib/bind9/bin/dnssec/dnssec-keyfromlabel.c
index 8e9a53b..323f918 100644
--- a/contrib/bind9/bin/dnssec/dnssec-keyfromlabel.c
+++ b/contrib/bind9/bin/dnssec/dnssec-keyfromlabel.c
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2007, 2008, 2010 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2007-2010 Internet Systems Consortium, Inc. ("ISC")
*
* Permission to use, copy, modify, and/or distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
@@ -14,12 +14,13 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: dnssec-keyfromlabel.c,v 1.4.50.2 2010-01-15 23:47:31 tbox Exp $ */
+/* $Id: dnssec-keyfromlabel.c,v 1.32 2010-12-23 04:07:59 marka Exp $ */
/*! \file */
#include <config.h>
+#include <ctype.h>
#include <stdlib.h>
#include <isc/buffer.h>
@@ -27,9 +28,11 @@
#include <isc/entropy.h>
#include <isc/mem.h>
#include <isc/region.h>
+#include <isc/print.h>
#include <isc/string.h>
#include <isc/util.h>
+#include <dns/dnssec.h>
#include <dns/fixedname.h>
#include <dns/keyvalues.h>
#include <dns/log.h>
@@ -47,35 +50,60 @@
const char *program = "dnssec-keyfromlabel";
int verbose;
+#define DEFAULT_ALGORITHM "RSASHA1"
+#define DEFAULT_NSEC3_ALGORITHM "NSEC3RSASHA1"
+
static const char *algs = "RSA | RSAMD5 | DH | DSA | RSASHA1 |"
" NSEC3DSA | NSEC3RSASHA1 |"
- " RSASHA256 | RSASHA512";
+ " RSASHA256 | RSASHA512 | ECCGOST";
+
+ISC_PLATFORM_NORETURN_PRE static void
+usage(void) ISC_PLATFORM_NORETURN_POST;
static void
usage(void) {
fprintf(stderr, "Usage:\n");
- fprintf(stderr, " %s -a alg -l label [options] name\n\n",
+ fprintf(stderr, " %s -l label [options] name\n\n",
program);
fprintf(stderr, "Version: %s\n", VERSION);
fprintf(stderr, "Required options:\n");
- fprintf(stderr, " -a algorithm: %s\n", algs);
- fprintf(stderr, " -l label: label of the key\n");
+ fprintf(stderr, " -l label: label of the key pair\n");
fprintf(stderr, " name: owner of the key\n");
fprintf(stderr, "Other options:\n");
+ fprintf(stderr, " -a algorithm: %s\n", algs);
+ fprintf(stderr, " (default: RSASHA1, or "
+ "NSEC3RSASHA1 if using -3)\n");
+ fprintf(stderr, " -3: use NSEC3-capable algorithm\n");
+ fprintf(stderr, " -c class (default: IN)\n");
+#ifdef USE_PKCS11
+ fprintf(stderr, " -E enginename (default: pkcs11)\n");
+#else
+ fprintf(stderr, " -E enginename\n");
+#endif
+ fprintf(stderr, " -f keyflag: KSK | REVOKE\n");
+ fprintf(stderr, " -K directory: directory in which to place "
+ "key files\n");
+ fprintf(stderr, " -k: generate a TYPE=KEY key\n");
fprintf(stderr, " -n nametype: ZONE | HOST | ENTITY | USER | OTHER\n");
fprintf(stderr, " (DNSKEY generation defaults to ZONE\n");
- fprintf(stderr, " -c <class> (default: IN)\n");
- fprintf(stderr, " -f keyflag: KSK\n");
- fprintf(stderr, " -t <type>: "
+ fprintf(stderr, " -p protocol: default: 3 [dnssec]\n");
+ fprintf(stderr, " -t type: "
"AUTHCONF | NOAUTHCONF | NOAUTH | NOCONF "
"(default: AUTHCONF)\n");
- fprintf(stderr, " -p <protocol>: "
- "default: 3 [dnssec]\n");
- fprintf(stderr, " -v <verbose level>\n");
- fprintf(stderr, " -k : generate a TYPE=KEY key\n");
+ fprintf(stderr, " -y: permit keys that might collide\n");
+ fprintf(stderr, " -v verbose level\n");
+ fprintf(stderr, "Date options:\n");
+ fprintf(stderr, " -P date/[+-]offset: set key publication date\n");
+ fprintf(stderr, " -A date/[+-]offset: set key activation date\n");
+ fprintf(stderr, " -R date/[+-]offset: set key revocation date\n");
+ fprintf(stderr, " -I date/[+-]offset: set key inactivation date\n");
+ fprintf(stderr, " -D date/[+-]offset: set key deletion date\n");
+ fprintf(stderr, " -G: generate key only; do not set -P or -A\n");
+ fprintf(stderr, " -C: generate a backward-compatible key, omitting"
+ " all dates\n");
fprintf(stderr, "Output:\n");
fprintf(stderr, " K<name>+<alg>+<id>.key, "
- "K<name>+<alg>+<id>.private\n");
+ "K<name>+<alg>+<id>.private\n");
exit (-1);
}
@@ -83,14 +111,20 @@ usage(void) {
int
main(int argc, char **argv) {
char *algname = NULL, *nametype = NULL, *type = NULL;
+ const char *directory = NULL;
+#ifdef USE_PKCS11
+ const char *engine = "pkcs11";
+#else
+ const char *engine = NULL;
+#endif
char *classname = NULL;
char *endp;
- dst_key_t *key = NULL, *oldkey;
+ dst_key_t *key = NULL;
dns_fixedname_t fname;
dns_name_t *name;
- isc_uint16_t flags = 0, ksk = 0;
+ isc_uint16_t flags = 0, kskflag = 0, revflag = 0;
dns_secalg_t alg;
- isc_boolean_t null_key = ISC_FALSE;
+ isc_boolean_t oldstyle = ISC_FALSE;
isc_mem_t *mctx = NULL;
int ch;
int protocol = -1, signatory = 0;
@@ -103,6 +137,20 @@ main(int argc, char **argv) {
dns_rdataclass_t rdclass;
int options = DST_TYPE_PRIVATE | DST_TYPE_PUBLIC;
char *label = NULL;
+ isc_stdtime_t publish = 0, activate = 0, revoke = 0;
+ isc_stdtime_t inactive = 0, delete = 0;
+ isc_stdtime_t now;
+ isc_boolean_t setpub = ISC_FALSE, setact = ISC_FALSE;
+ isc_boolean_t setrev = ISC_FALSE, setinact = ISC_FALSE;
+ isc_boolean_t setdel = ISC_FALSE;
+ isc_boolean_t unsetpub = ISC_FALSE, unsetact = ISC_FALSE;
+ isc_boolean_t unsetrev = ISC_FALSE, unsetinact = ISC_FALSE;
+ isc_boolean_t unsetdel = ISC_FALSE;
+ isc_boolean_t genonly = ISC_FALSE;
+ isc_boolean_t use_nsec3 = ISC_FALSE;
+ isc_boolean_t avoid_collisions = ISC_TRUE;
+ isc_boolean_t exact;
+ unsigned char c;
if (argc == 1)
usage();
@@ -113,28 +161,49 @@ main(int argc, char **argv) {
isc_commandline_errprint = ISC_FALSE;
+ isc_stdtime_get(&now);
+
while ((ch = isc_commandline_parse(argc, argv,
- "a:c:f:kl:n:p:t:v:h")) != -1)
+ "3a:Cc:E:f:K:kl:n:p:t:v:yFhGP:A:R:I:D:")) != -1)
{
switch (ch) {
+ case '3':
+ use_nsec3 = ISC_TRUE;
+ break;
case 'a':
algname = isc_commandline_argument;
break;
+ case 'C':
+ oldstyle = ISC_TRUE;
+ break;
case 'c':
classname = isc_commandline_argument;
break;
+ case 'E':
+ engine = isc_commandline_argument;
+ break;
case 'f':
- if (strcasecmp(isc_commandline_argument, "KSK") == 0)
- ksk = DNS_KEYFLAG_KSK;
+ c = (unsigned char)(isc_commandline_argument[0]);
+ if (toupper(c) == 'K')
+ kskflag = DNS_KEYFLAG_KSK;
+ else if (toupper(c) == 'R')
+ revflag = DNS_KEYFLAG_REVOKE;
else
fatal("unknown flag '%s'",
isc_commandline_argument);
break;
+ case 'K':
+ directory = isc_commandline_argument;
+ ret = try_dir(directory);
+ if (ret != ISC_R_SUCCESS)
+ fatal("cannot open directory %s: %s",
+ directory, isc_result_totext(ret));
+ break;
case 'k':
options |= DST_TYPE_KEY;
break;
case 'l':
- label = isc_commandline_argument;
+ label = isc_mem_strdup(mctx, isc_commandline_argument);
break;
case 'n':
nametype = isc_commandline_argument;
@@ -153,11 +222,80 @@ main(int argc, char **argv) {
if (*endp != '\0')
fatal("-v must be followed by a number");
break;
-
+ case 'y':
+ avoid_collisions = ISC_FALSE;
+ break;
+ case 'G':
+ genonly = ISC_TRUE;
+ break;
+ case 'P':
+ if (setpub || unsetpub)
+ fatal("-P specified more than once");
+
+ if (strcasecmp(isc_commandline_argument, "none")) {
+ setpub = ISC_TRUE;
+ publish = strtotime(isc_commandline_argument,
+ now, now);
+ } else {
+ unsetpub = ISC_TRUE;
+ }
+ break;
+ case 'A':
+ if (setact || unsetact)
+ fatal("-A specified more than once");
+
+ if (strcasecmp(isc_commandline_argument, "none")) {
+ setact = ISC_TRUE;
+ activate = strtotime(isc_commandline_argument,
+ now, now);
+ } else {
+ unsetact = ISC_TRUE;
+ }
+ break;
+ case 'R':
+ if (setrev || unsetrev)
+ fatal("-R specified more than once");
+
+ if (strcasecmp(isc_commandline_argument, "none")) {
+ setrev = ISC_TRUE;
+ revoke = strtotime(isc_commandline_argument,
+ now, now);
+ } else {
+ unsetrev = ISC_TRUE;
+ }
+ break;
+ case 'I':
+ if (setinact || unsetinact)
+ fatal("-I specified more than once");
+
+ if (strcasecmp(isc_commandline_argument, "none")) {
+ setinact = ISC_TRUE;
+ inactive = strtotime(isc_commandline_argument,
+ now, now);
+ } else {
+ unsetinact = ISC_TRUE;
+ }
+ break;
+ case 'D':
+ if (setdel || unsetdel)
+ fatal("-D specified more than once");
+
+ if (strcasecmp(isc_commandline_argument, "none")) {
+ setdel = ISC_TRUE;
+ delete = strtotime(isc_commandline_argument,
+ now, now);
+ } else {
+ unsetdel = ISC_TRUE;
+ }
+ break;
+ case 'F':
+ /* Reserved for FIPS mode */
+ /* FALLTHROUGH */
case '?':
if (isc_commandline_option != '?')
fprintf(stderr, "%s: invalid argument -%c\n",
program, isc_commandline_option);
+ /* FALLTHROUGH */
case 'h':
usage();
@@ -170,10 +308,11 @@ main(int argc, char **argv) {
if (ectx == NULL)
setup_entropy(mctx, NULL, &ectx);
- ret = dst_lib_init(mctx, ectx,
- ISC_ENTROPY_BLOCKING | ISC_ENTROPY_GOODONLY);
+ ret = dst_lib_init2(mctx, ectx, engine,
+ ISC_ENTROPY_BLOCKING | ISC_ENTROPY_GOODONLY);
if (ret != ISC_R_SUCCESS)
- fatal("could not initialize dst");
+ fatal("could not initialize dst: %s",
+ isc_result_totext(ret));
setup_logging(verbose, mctx, &log);
@@ -184,8 +323,30 @@ main(int argc, char **argv) {
if (argc > isc_commandline_index + 1)
fatal("extraneous arguments");
- if (algname == NULL)
- fatal("no algorithm was specified");
+ if (strchr(label, ':') == NULL &&
+ engine != NULL && strlen(engine) != 0U) {
+ char *l;
+ int len;
+
+ len = strlen(label) + strlen(engine) + 2;
+ l = isc_mem_allocate(mctx, len);
+ if (l == NULL)
+ fatal("cannot allocate memory");
+ snprintf(l, len, "%s:%s", engine, label);
+ isc_mem_free(mctx, label);
+ label = l;
+ }
+
+ if (algname == NULL) {
+ if (use_nsec3)
+ algname = strdup(DEFAULT_NSEC3_ALGORITHM);
+ else
+ algname = strdup(DEFAULT_ALGORITHM);
+ if (verbose > 0)
+ fprintf(stderr, "no algorithm specified; "
+ "defaulting to %s\n", algname);
+ }
+
if (strcasecmp(algname, "RSA") == 0) {
fprintf(stderr, "The use of RSA (RSAMD5) is not recommended.\n"
"If you still wish to use RSA (RSAMD5) please "
@@ -201,6 +362,14 @@ main(int argc, char **argv) {
options |= DST_TYPE_KEY;
}
+ if (use_nsec3 &&
+ alg != DST_ALG_NSEC3DSA && alg != DST_ALG_NSEC3RSASHA1 &&
+ alg != DST_ALG_RSASHA256 && alg != DST_ALG_RSASHA512 &&
+ alg != DST_ALG_ECCGOST) {
+ fatal("%s is incompatible with NSEC3; "
+ "do not use the -3 option", algname);
+ }
+
if (type != NULL && (options & DST_TYPE_KEY) != 0) {
if (strcasecmp(type, "NOAUTH") == 0)
flags |= DNS_KEYTYPE_NOAUTH;
@@ -234,10 +403,15 @@ main(int argc, char **argv) {
rdclass = strtoclass(classname);
+ if (directory == NULL)
+ directory = ".";
+
if ((options & DST_TYPE_KEY) != 0) /* KEY */
flags |= signatory;
- else if ((flags & DNS_KEYOWNER_ZONE) != 0) /* DNSKEY */
- flags |= ksk;
+ else if ((flags & DNS_KEYOWNER_ZONE) != 0) { /* DNSKEY */
+ flags |= kskflag;
+ flags |= revflag;
+ }
if (protocol == -1)
protocol = DNS_KEYPROTO_DNSSEC;
@@ -260,53 +434,108 @@ main(int argc, char **argv) {
isc_buffer_init(&buf, argv[isc_commandline_index],
strlen(argv[isc_commandline_index]));
isc_buffer_add(&buf, strlen(argv[isc_commandline_index]));
- ret = dns_name_fromtext(name, &buf, dns_rootname, ISC_FALSE, NULL);
+ ret = dns_name_fromtext(name, &buf, dns_rootname, 0, NULL);
if (ret != ISC_R_SUCCESS)
fatal("invalid key name %s: %s", argv[isc_commandline_index],
isc_result_totext(ret));
- if ((flags & DNS_KEYFLAG_TYPEMASK) == DNS_KEYTYPE_NOKEY)
- null_key = ISC_TRUE;
-
isc_buffer_init(&buf, filename, sizeof(filename) - 1);
/* associate the key */
ret = dst_key_fromlabel(name, alg, flags, protocol,
- rdclass, "", label, NULL, mctx, &key);
+ rdclass, engine, label, NULL, mctx, &key);
isc_entropy_stopcallbacksources(ectx);
if (ret != ISC_R_SUCCESS) {
char namestr[DNS_NAME_FORMATSIZE];
- char algstr[ALG_FORMATSIZE];
+ char algstr[DNS_SECALG_FORMATSIZE];
dns_name_format(name, namestr, sizeof(namestr));
- alg_format(alg, algstr, sizeof(algstr));
- fatal("failed to generate key %s/%s: %s\n",
+ dns_secalg_format(alg, algstr, sizeof(algstr));
+ fatal("failed to get key %s/%s: %s\n",
namestr, algstr, isc_result_totext(ret));
+ /* NOTREACHED */
exit(-1);
}
/*
- * Try to read a key with the same name, alg and id from disk.
- * If there is one we must continue generating a new one
- * unless we were asked to generate a null key, in which
- * case we return failure.
+ * Set key timing metadata (unless using -C)
+ *
+ * Publish and activation dates are set to "now" by default, but
+ * can be overridden. Creation date is always set to "now".
*/
- ret = dst_key_fromfile(name, dst_key_id(key), alg,
- DST_TYPE_PRIVATE, NULL, mctx, &oldkey);
- /* do not overwrite an existing key */
- if (ret == ISC_R_SUCCESS) {
+ if (!oldstyle) {
+ dst_key_settime(key, DST_TIME_CREATED, now);
+
+ if (genonly && (setpub || setact))
+ fatal("cannot use -G together with -P or -A options");
+
+ if (setpub)
+ dst_key_settime(key, DST_TIME_PUBLISH, publish);
+ else if (setact)
+ dst_key_settime(key, DST_TIME_PUBLISH, activate);
+ else if (!genonly && !unsetpub)
+ dst_key_settime(key, DST_TIME_PUBLISH, now);
+
+ if (setact)
+ dst_key_settime(key, DST_TIME_ACTIVATE, activate);
+ else if (!genonly && !unsetact)
+ dst_key_settime(key, DST_TIME_ACTIVATE, now);
+
+ if (setrev) {
+ if (kskflag == 0)
+ fprintf(stderr, "%s: warning: Key is "
+ "not flagged as a KSK, but -R "
+ "was used. Revoking a ZSK is "
+ "legal, but undefined.\n",
+ program);
+ dst_key_settime(key, DST_TIME_REVOKE, revoke);
+ }
+
+ if (setinact)
+ dst_key_settime(key, DST_TIME_INACTIVE, inactive);
+
+ if (setdel)
+ dst_key_settime(key, DST_TIME_DELETE, delete);
+ } else {
+ if (setpub || setact || setrev || setinact ||
+ setdel || unsetpub || unsetact ||
+ unsetrev || unsetinact || unsetdel || genonly)
+ fatal("cannot use -C together with "
+ "-P, -A, -R, -I, -D, or -G options");
+ /*
+ * Compatibility mode: Private-key-format
+ * should be set to 1.2.
+ */
+ dst_key_setprivateformat(key, 1, 2);
+ }
+
+ /*
+ * Do not overwrite an existing key. Warn LOUDLY if there
+ * is a risk of ID collision due to this key or another key
+ * being revoked.
+ */
+ if (key_collision(dst_key_id(key), name, directory, alg, mctx, &exact))
+ {
isc_buffer_clear(&buf);
- ret = dst_key_buildfilename(key, 0, NULL, &buf);
- fprintf(stderr, "%s: %s already exists\n",
- program, filename);
- dst_key_free(&key);
- exit (1);
+ ret = dst_key_buildfilename(key, 0, directory, &buf);
+ if (exact)
+ fatal("%s: %s already exists\n", program, filename);
+
+ if (avoid_collisions)
+ fatal("%s: %s could collide with another key upon "
+ "revokation\n", program, filename);
+
+ fprintf(stderr, "%s: WARNING: Key %s could collide with "
+ "another key upon revokation. If you plan "
+ "to revoke keys, destroy this key and "
+ "generate a different one.\n",
+ program, filename);
}
- ret = dst_key_tofile(key, options, NULL);
+ ret = dst_key_tofile(key, options, directory);
if (ret != ISC_R_SUCCESS) {
- char keystr[KEY_FORMATSIZE];
- key_format(key, keystr, sizeof(keystr));
+ char keystr[DST_KEY_FORMATSIZE];
+ dst_key_format(key, keystr, sizeof(keystr));
fatal("failed to write key %s: %s\n", keystr,
isc_result_totext(ret));
}
@@ -322,6 +551,7 @@ main(int argc, char **argv) {
dns_name_destroy();
if (verbose > 10)
isc_mem_stats(mctx, stdout);
+ isc_mem_free(mctx, label);
isc_mem_destroy(&mctx);
return (0);
diff --git a/contrib/bind9/bin/dnssec/dnssec-keyfromlabel.docbook b/contrib/bind9/bin/dnssec/dnssec-keyfromlabel.docbook
index a2fff5a..be38a24 100644
--- a/contrib/bind9/bin/dnssec/dnssec-keyfromlabel.docbook
+++ b/contrib/bind9/bin/dnssec/dnssec-keyfromlabel.docbook
@@ -2,7 +2,7 @@
"http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd"
[<!ENTITY mdash "&#8212;">]>
<!--
- - Copyright (C) 2008, 2010 Internet Systems Consortium, Inc. ("ISC")
+ - Copyright (C) 2008-2011 Internet Systems Consortium, Inc. ("ISC")
-
- Permission to use, copy, modify, and/or distribute this software for any
- purpose with or without fee is hereby granted, provided that the above
@@ -17,7 +17,7 @@
- PERFORMANCE OF THIS SOFTWARE.
-->
-<!-- $Id: dnssec-keyfromlabel.docbook,v 1.6.14.2 2010-01-15 23:47:31 tbox Exp $ -->
+<!-- $Id: dnssec-keyfromlabel.docbook,v 1.18.14.1.2.1 2011-06-02 23:47:27 tbox Exp $ -->
<refentry id="man.dnssec-keyfromlabel">
<refentryinfo>
<date>February 8, 2008</date>
@@ -37,7 +37,9 @@
<docinfo>
<copyright>
<year>2008</year>
+ <year>2009</year>
<year>2010</year>
+ <year>2011</year>
<holder>Internet Systems Consortium, Inc. ("ISC")</holder>
</copyright>
</docinfo>
@@ -45,15 +47,25 @@
<refsynopsisdiv>
<cmdsynopsis>
<command>dnssec-keyfromlabel</command>
- <arg choice="req">-a <replaceable class="parameter">algorithm</replaceable></arg>
<arg choice="req">-l <replaceable class="parameter">label</replaceable></arg>
+ <arg><option>-3</option></arg>
+ <arg><option>-a <replaceable class="parameter">algorithm</replaceable></option></arg>
+ <arg><option>-A <replaceable class="parameter">date/offset</replaceable></option></arg>
<arg><option>-c <replaceable class="parameter">class</replaceable></option></arg>
+ <arg><option>-D <replaceable class="parameter">date/offset</replaceable></option></arg>
+ <arg><option>-E <replaceable class="parameter">engine</replaceable></option></arg>
<arg><option>-f <replaceable class="parameter">flag</replaceable></option></arg>
+ <arg><option>-G</option></arg>
+ <arg><option>-I <replaceable class="parameter">date/offset</replaceable></option></arg>
<arg><option>-k</option></arg>
+ <arg><option>-K <replaceable class="parameter">directory</replaceable></option></arg>
<arg><option>-n <replaceable class="parameter">nametype</replaceable></option></arg>
+ <arg><option>-P <replaceable class="parameter">date/offset</replaceable></option></arg>
<arg><option>-p <replaceable class="parameter">protocol</replaceable></option></arg>
+ <arg><option>-R <replaceable class="parameter">date/offset</replaceable></option></arg>
<arg><option>-t <replaceable class="parameter">type</replaceable></option></arg>
<arg><option>-v <replaceable class="parameter">level</replaceable></option></arg>
+ <arg><option>-y</option></arg>
<arg choice="req">name</arg>
</cmdsynopsis>
</refsynopsisdiv>
@@ -65,6 +77,11 @@
key files for DNSSEC (Secure DNS), as defined in RFC 2535
and RFC 4034.
</para>
+ <para>
+ The <option>name</option> of the key is specified on the command
+ line. This must match the name of the zone for which the key is
+ being generated.
+ </para>
</refsect1>
<refsect1>
@@ -76,9 +93,8 @@
<listitem>
<para>
Selects the cryptographic algorithm. The value of
- <option>algorithm</option> must be one of RSAMD5,
- RSASHA1, DSA, NSEC3RSASHA1, NSEC3DSA, RSASHA256,
- RSASHA512 or DH (Diffie Hellman).
+ <option>algorithm</option> must be one of RSAMD5, RSASHA1,
+ DSA, NSEC3RSASHA1, NSEC3DSA, RSASHA256, RSASHA512 or ECCGOST.
These values are case insensitive.
</para>
<para>
@@ -99,11 +115,34 @@
</varlistentry>
<varlistentry>
+ <term>-3</term>
+ <listitem>
+ <para>
+ Use an NSEC3-capable algorithm to generate a DNSSEC key.
+ If this option is used and no algorithm is explicitly
+ set on the command line, NSEC3RSASHA1 will be used by
+ default.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>-E <replaceable class="parameter">engine</replaceable></term>
+ <listitem>
+ <para>
+ Specifies the name of the crypto hardware (OpenSSL engine).
+ When compiled with PKCS#11 support it defaults to "pkcs11".
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
<term>-l <replaceable class="parameter">label</replaceable></term>
<listitem>
<para>
- Specifies the label of keys in the crypto hardware
- (PKCS#11 device).
+ Specifies the label of the key pair in the crypto hardware.
+ The label may be preceded by an optional OpenSSL engine name,
+ separated by a colon, as in "pkcs11:keylabel".
</para>
</listitem>
</varlistentry>
@@ -117,8 +156,22 @@
zone key (KEY/DNSKEY)), HOST or ENTITY (for a key associated with
a host (KEY)),
USER (for a key associated with a user(KEY)) or OTHER (DNSKEY).
- These values are
- case insensitive.
+ These values are case insensitive.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>-C</term>
+ <listitem>
+ <para>
+ Compatibility mode: generates an old-style key, without
+ any metadata. By default, <command>dnssec-keyfromlabel</command>
+ will include the key's creation date in the metadata stored
+ with the private key, and other dates may be set there as well
+ (publication date, activation date, etc). Keys that include
+ this data may be incompatible with older versions of BIND; the
+ <option>-C</option> option suppresses them.
</para>
</listitem>
</varlistentry>
@@ -138,7 +191,17 @@
<listitem>
<para>
Set the specified flag in the flag field of the KEY/DNSKEY record.
- The only recognized flag is KSK (Key Signing Key) DNSKEY.
+ The only recognized flags are KSK (Key Signing Key) and REVOKE.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>-G</term>
+ <listitem>
+ <para>
+ Generate a key, but do not publish it or sign with it. This
+ option is incompatible with -P and -A.
</para>
</listitem>
</varlistentry>
@@ -148,7 +211,16 @@
<listitem>
<para>
Prints a short summary of the options and arguments to
- <command>dnssec-keygen</command>.
+ <command>dnssec-keyfromlabel</command>.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>-K <replaceable class="parameter">directory</replaceable></term>
+ <listitem>
+ <para>
+ Sets the directory in which the key files are to be written.
</para>
</listitem>
</varlistentry>
@@ -166,7 +238,7 @@
<term>-p <replaceable class="parameter">protocol</replaceable></term>
<listitem>
<para>
- Sets the protocol value for the generated key. The protocol
+ Sets the protocol value for the key. The protocol
is a number between 0 and 255. The default is 3 (DNSSEC).
Other possible values for this argument are listed in
RFC 2535 and its successors.
@@ -195,6 +267,93 @@
</listitem>
</varlistentry>
+ <varlistentry>
+ <term>-y</term>
+ <listitem>
+ <para>
+ Allows DNSSEC key files to be generated even if the key ID
+ would collide with that of an existing key, in the event of
+ either key being revoked. (This is only safe to use if you
+ are sure you won't be using RFC 5011 trust anchor maintenance
+ with either of the keys involved.)
+ </para>
+ </listitem>
+ </varlistentry>
+
+ </variablelist>
+ </refsect1>
+
+ <refsect1>
+ <title>TIMING OPTIONS</title>
+
+ <para>
+ Dates can be expressed in the format YYYYMMDD or YYYYMMDDHHMMSS.
+ If the argument begins with a '+' or '-', it is interpreted as
+ an offset from the present time. For convenience, if such an offset
+ is followed by one of the suffixes 'y', 'mo', 'w', 'd', 'h', or 'mi',
+ then the offset is computed in years (defined as 365 24-hour days,
+ ignoring leap years), months (defined as 30 24-hour days), weeks,
+ days, hours, or minutes, respectively. Without a suffix, the offset
+ is computed in seconds.
+ </para>
+
+ <variablelist>
+ <varlistentry>
+ <term>-P <replaceable class="parameter">date/offset</replaceable></term>
+ <listitem>
+ <para>
+ Sets the date on which a key is to be published to the zone.
+ After that date, the key will be included in the zone but will
+ not be used to sign it. If not set, and if the -G option has
+ not been used, the default is "now".
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>-A <replaceable class="parameter">date/offset</replaceable></term>
+ <listitem>
+ <para>
+ Sets the date on which the key is to be activated. After that
+ date, the key will be included in the zone and used to sign
+ it. If not set, and if the -G option has not been used, the
+ default is "now".
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>-R <replaceable class="parameter">date/offset</replaceable></term>
+ <listitem>
+ <para>
+ Sets the date on which the key is to be revoked. After that
+ date, the key will be flagged as revoked. It will be included
+ in the zone and will be used to sign it.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>-I <replaceable class="parameter">date/offset</replaceable></term>
+ <listitem>
+ <para>
+ Sets the date on which the key is to be retired. After that
+ date, the key will still be included in the zone, but it
+ will not be used to sign it.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>-D <replaceable class="parameter">date/offset</replaceable></term>
+ <listitem>
+ <para>
+ Sets the date on which the key is to be deleted. After that
+ date, the key will no longer be included in the zone. (It
+ may remain in the key repository, however.)
+ </para>
+ </listitem>
+ </varlistentry>
</variablelist>
</refsect1>
@@ -214,8 +373,7 @@
</listitem>
<listitem>
<para><filename>aaa</filename> is the numeric representation
- of the
- algorithm.
+ of the algorithm.
</para>
</listitem>
<listitem>
@@ -229,8 +387,7 @@
on the printed string. <filename>Knnnn.+aaa+iiiii.key</filename>
contains the public key, and
<filename>Knnnn.+aaa+iiiii.private</filename> contains the
- private
- key.
+ private key.
</para>
<para>
The <filename>.key</filename> file contains a DNS KEY record
@@ -239,8 +396,8 @@
statement).
</para>
<para>
- The <filename>.private</filename> file contains algorithm
- specific
+ The <filename>.private</filename> file contains
+ algorithm-specific
fields. For obvious security reasons, this file does not have
general read permission.
</para>
diff --git a/contrib/bind9/bin/dnssec/dnssec-keyfromlabel.html b/contrib/bind9/bin/dnssec/dnssec-keyfromlabel.html
index ad2a562..2b1b236 100644
--- a/contrib/bind9/bin/dnssec/dnssec-keyfromlabel.html
+++ b/contrib/bind9/bin/dnssec/dnssec-keyfromlabel.html
@@ -1,5 +1,5 @@
<!--
- - Copyright (C) 2008, 2010 Internet Systems Consortium, Inc. ("ISC")
+ - Copyright (C) 2008-2011 Internet Systems Consortium, Inc. ("ISC")
-
- Permission to use, copy, modify, and/or distribute this software for any
- purpose with or without fee is hereby granted, provided that the above
@@ -13,7 +13,7 @@
- OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
- PERFORMANCE OF THIS SOFTWARE.
-->
-<!-- $Id: dnssec-keyfromlabel.html,v 1.5.44.3 2010-01-16 01:55:32 tbox Exp $ -->
+<!-- $Id: dnssec-keyfromlabel.html,v 1.17.14.1.2.1 2011-06-09 03:41:05 tbox Exp $ -->
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
@@ -28,26 +28,30 @@
</div>
<div class="refsynopsisdiv">
<h2>Synopsis</h2>
-<div class="cmdsynopsis"><p><code class="command">dnssec-keyfromlabel</code> {-a <em class="replaceable"><code>algorithm</code></em>} {-l <em class="replaceable"><code>label</code></em>} [<code class="option">-c <em class="replaceable"><code>class</code></em></code>] [<code class="option">-f <em class="replaceable"><code>flag</code></em></code>] [<code class="option">-k</code>] [<code class="option">-n <em class="replaceable"><code>nametype</code></em></code>] [<code class="option">-p <em class="replaceable"><code>protocol</code></em></code>] [<code class="option">-t <em class="replaceable"><code>type</code></em></code>] [<code class="option">-v <em class="replaceable"><code>level</code></em></code>] {name}</p></div>
+<div class="cmdsynopsis"><p><code class="command">dnssec-keyfromlabel</code> {-l <em class="replaceable"><code>label</code></em>} [<code class="option">-3</code>] [<code class="option">-a <em class="replaceable"><code>algorithm</code></em></code>] [<code class="option">-A <em class="replaceable"><code>date/offset</code></em></code>] [<code class="option">-c <em class="replaceable"><code>class</code></em></code>] [<code class="option">-D <em class="replaceable"><code>date/offset</code></em></code>] [<code class="option">-E <em class="replaceable"><code>engine</code></em></code>] [<code class="option">-f <em class="replaceable"><code>flag</code></em></code>] [<code class="option">-G</code>] [<code class="option">-I <em class="replaceable"><code>date/offset</code></em></code>] [<code class="option">-k</code>] [<code class="option">-K <em class="replaceable"><code>directory</code></em></code>] [<code class="option">-n <em class="replaceable"><code>nametype</code></em></code>] [<code class="option">-P <em class="replaceable"><code>date/offset</code></em></code>] [<code class="option">-p <em class="replaceable"><code>protocol</code></em></code>] [<code class="option">-R <em class="replaceable"><code>date/offset</code></em></code>] [<code class="option">-t <em class="replaceable"><code>type</code></em></code>] [<code class="option">-v <em class="replaceable"><code>level</code></em></code>] [<code class="option">-y</code>] {name}</p></div>
</div>
<div class="refsect1" lang="en">
-<a name="id2543416"></a><h2>DESCRIPTION</h2>
+<a name="id2543494"></a><h2>DESCRIPTION</h2>
<p><span><strong class="command">dnssec-keyfromlabel</strong></span>
gets keys with the given label from a crypto hardware and builds
key files for DNSSEC (Secure DNS), as defined in RFC 2535
and RFC 4034.
</p>
+<p>
+ The <code class="option">name</code> of the key is specified on the command
+ line. This must match the name of the zone for which the key is
+ being generated.
+ </p>
</div>
<div class="refsect1" lang="en">
-<a name="id2543428"></a><h2>OPTIONS</h2>
+<a name="id2543512"></a><h2>OPTIONS</h2>
<div class="variablelist"><dl>
<dt><span class="term">-a <em class="replaceable"><code>algorithm</code></em></span></dt>
<dd>
<p>
Selects the cryptographic algorithm. The value of
- <code class="option">algorithm</code> must be one of RSAMD5,
- RSASHA1, DSA, NSEC3RSASHA1, NSEC3DSA, RSASHA256,
- RSASHA512 or DH (Diffie Hellman).
+ <code class="option">algorithm</code> must be one of RSAMD5, RSASHA1,
+ DSA, NSEC3RSASHA1, NSEC3DSA, RSASHA256, RSASHA512 or ECCGOST.
These values are case insensitive.
</p>
<p>
@@ -65,10 +69,23 @@
Note 2: DH automatically sets the -k flag.
</p>
</dd>
+<dt><span class="term">-3</span></dt>
+<dd><p>
+ Use an NSEC3-capable algorithm to generate a DNSSEC key.
+ If this option is used and no algorithm is explicitly
+ set on the command line, NSEC3RSASHA1 will be used by
+ default.
+ </p></dd>
+<dt><span class="term">-E <em class="replaceable"><code>engine</code></em></span></dt>
+<dd><p>
+ Specifies the name of the crypto hardware (OpenSSL engine).
+ When compiled with PKCS#11 support it defaults to "pkcs11".
+ </p></dd>
<dt><span class="term">-l <em class="replaceable"><code>label</code></em></span></dt>
<dd><p>
- Specifies the label of keys in the crypto hardware
- (PKCS#11 device).
+ Specifies the label of the key pair in the crypto hardware.
+ The label may be preceded by an optional OpenSSL engine name,
+ separated by a colon, as in "pkcs11:keylabel".
</p></dd>
<dt><span class="term">-n <em class="replaceable"><code>nametype</code></em></span></dt>
<dd><p>
@@ -77,8 +94,17 @@
zone key (KEY/DNSKEY)), HOST or ENTITY (for a key associated with
a host (KEY)),
USER (for a key associated with a user(KEY)) or OTHER (DNSKEY).
- These values are
- case insensitive.
+ These values are case insensitive.
+ </p></dd>
+<dt><span class="term">-C</span></dt>
+<dd><p>
+ Compatibility mode: generates an old-style key, without
+ any metadata. By default, <span><strong class="command">dnssec-keyfromlabel</strong></span>
+ will include the key's creation date in the metadata stored
+ with the private key, and other dates may be set there as well
+ (publication date, activation date, etc). Keys that include
+ this data may be incompatible with older versions of BIND; the
+ <code class="option">-C</code> option suppresses them.
</p></dd>
<dt><span class="term">-c <em class="replaceable"><code>class</code></em></span></dt>
<dd><p>
@@ -88,12 +114,21 @@
<dt><span class="term">-f <em class="replaceable"><code>flag</code></em></span></dt>
<dd><p>
Set the specified flag in the flag field of the KEY/DNSKEY record.
- The only recognized flag is KSK (Key Signing Key) DNSKEY.
+ The only recognized flags are KSK (Key Signing Key) and REVOKE.
+ </p></dd>
+<dt><span class="term">-G</span></dt>
+<dd><p>
+ Generate a key, but do not publish it or sign with it. This
+ option is incompatible with -P and -A.
</p></dd>
<dt><span class="term">-h</span></dt>
<dd><p>
Prints a short summary of the options and arguments to
- <span><strong class="command">dnssec-keygen</strong></span>.
+ <span><strong class="command">dnssec-keyfromlabel</strong></span>.
+ </p></dd>
+<dt><span class="term">-K <em class="replaceable"><code>directory</code></em></span></dt>
+<dd><p>
+ Sets the directory in which the key files are to be written.
</p></dd>
<dt><span class="term">-k</span></dt>
<dd><p>
@@ -101,7 +136,7 @@
</p></dd>
<dt><span class="term">-p <em class="replaceable"><code>protocol</code></em></span></dt>
<dd><p>
- Sets the protocol value for the generated key. The protocol
+ Sets the protocol value for the key. The protocol
is a number between 0 and 255. The default is 3 (DNSSEC).
Other possible values for this argument are listed in
RFC 2535 and its successors.
@@ -117,10 +152,65 @@
<dd><p>
Sets the debugging level.
</p></dd>
+<dt><span class="term">-y</span></dt>
+<dd><p>
+ Allows DNSSEC key files to be generated even if the key ID
+ would collide with that of an existing key, in the event of
+ either key being revoked. (This is only safe to use if you
+ are sure you won't be using RFC 5011 trust anchor maintenance
+ with either of the keys involved.)
+ </p></dd>
+</dl></div>
+</div>
+<div class="refsect1" lang="en">
+<a name="id2543876"></a><h2>TIMING OPTIONS</h2>
+<p>
+ Dates can be expressed in the format YYYYMMDD or YYYYMMDDHHMMSS.
+ If the argument begins with a '+' or '-', it is interpreted as
+ an offset from the present time. For convenience, if such an offset
+ is followed by one of the suffixes 'y', 'mo', 'w', 'd', 'h', or 'mi',
+ then the offset is computed in years (defined as 365 24-hour days,
+ ignoring leap years), months (defined as 30 24-hour days), weeks,
+ days, hours, or minutes, respectively. Without a suffix, the offset
+ is computed in seconds.
+ </p>
+<div class="variablelist"><dl>
+<dt><span class="term">-P <em class="replaceable"><code>date/offset</code></em></span></dt>
+<dd><p>
+ Sets the date on which a key is to be published to the zone.
+ After that date, the key will be included in the zone but will
+ not be used to sign it. If not set, and if the -G option has
+ not been used, the default is "now".
+ </p></dd>
+<dt><span class="term">-A <em class="replaceable"><code>date/offset</code></em></span></dt>
+<dd><p>
+ Sets the date on which the key is to be activated. After that
+ date, the key will be included in the zone and used to sign
+ it. If not set, and if the -G option has not been used, the
+ default is "now".
+ </p></dd>
+<dt><span class="term">-R <em class="replaceable"><code>date/offset</code></em></span></dt>
+<dd><p>
+ Sets the date on which the key is to be revoked. After that
+ date, the key will be flagged as revoked. It will be included
+ in the zone and will be used to sign it.
+ </p></dd>
+<dt><span class="term">-I <em class="replaceable"><code>date/offset</code></em></span></dt>
+<dd><p>
+ Sets the date on which the key is to be retired. After that
+ date, the key will still be included in the zone, but it
+ will not be used to sign it.
+ </p></dd>
+<dt><span class="term">-D <em class="replaceable"><code>date/offset</code></em></span></dt>
+<dd><p>
+ Sets the date on which the key is to be deleted. After that
+ date, the key will no longer be included in the zone. (It
+ may remain in the key repository, however.)
+ </p></dd>
</dl></div>
</div>
<div class="refsect1" lang="en">
-<a name="id2543632"></a><h2>GENERATED KEY FILES</h2>
+<a name="id2544042"></a><h2>GENERATED KEY FILES</h2>
<p>
When <span><strong class="command">dnssec-keyfromlabel</strong></span> completes
successfully,
@@ -132,8 +222,7 @@
<li><p><code class="filename">nnnn</code> is the key name.
</p></li>
<li><p><code class="filename">aaa</code> is the numeric representation
- of the
- algorithm.
+ of the algorithm.
</p></li>
<li><p><code class="filename">iiiii</code> is the key identifier (or
footprint).
@@ -144,8 +233,7 @@
on the printed string. <code class="filename">Knnnn.+aaa+iiiii.key</code>
contains the public key, and
<code class="filename">Knnnn.+aaa+iiiii.private</code> contains the
- private
- key.
+ private key.
</p>
<p>
The <code class="filename">.key</code> file contains a DNS KEY record
@@ -154,14 +242,14 @@
statement).
</p>
<p>
- The <code class="filename">.private</code> file contains algorithm
- specific
+ The <code class="filename">.private</code> file contains
+ algorithm-specific
fields. For obvious security reasons, this file does not have
general read permission.
</p>
</div>
<div class="refsect1" lang="en">
-<a name="id2543704"></a><h2>SEE ALSO</h2>
+<a name="id2544115"></a><h2>SEE ALSO</h2>
<p><span class="citerefentry"><span class="refentrytitle">dnssec-keygen</span>(8)</span>,
<span class="citerefentry"><span class="refentrytitle">dnssec-signzone</span>(8)</span>,
<em class="citetitle">BIND 9 Administrator Reference Manual</em>,
@@ -169,7 +257,7 @@
</p>
</div>
<div class="refsect1" lang="en">
-<a name="id2543737"></a><h2>AUTHOR</h2>
+<a name="id2544148"></a><h2>AUTHOR</h2>
<p><span class="corpauthor">Internet Systems Consortium</span>
</p>
</div>
diff --git a/contrib/bind9/bin/dnssec/dnssec-keygen.8 b/contrib/bind9/bin/dnssec/dnssec-keygen.8
index c4be24e..ea4690e 100644
--- a/contrib/bind9/bin/dnssec/dnssec-keygen.8
+++ b/contrib/bind9/bin/dnssec/dnssec-keygen.8
@@ -13,7 +13,7 @@
.\" OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
.\" PERFORMANCE OF THIS SOFTWARE.
.\"
-.\" $Id: dnssec-keygen.8,v 1.40.44.4 2010-01-16 01:55:32 tbox Exp $
+.\" $Id: dnssec-keygen.8,v 1.55 2010-12-24 01:14:19 tbox Exp $
.\"
.hy 0
.ad l
@@ -33,11 +33,11 @@
dnssec\-keygen \- DNSSEC key generation tool
.SH "SYNOPSIS"
.HP 14
-\fBdnssec\-keygen\fR {\-a\ \fIalgorithm\fR} {\-b\ \fIkeysize\fR} {\-n\ \fInametype\fR} [\fB\-c\ \fR\fB\fIclass\fR\fR] [\fB\-e\fR] [\fB\-f\ \fR\fB\fIflag\fR\fR] [\fB\-g\ \fR\fB\fIgenerator\fR\fR] [\fB\-h\fR] [\fB\-k\fR] [\fB\-p\ \fR\fB\fIprotocol\fR\fR] [\fB\-r\ \fR\fB\fIrandomdev\fR\fR] [\fB\-s\ \fR\fB\fIstrength\fR\fR] [\fB\-t\ \fR\fB\fItype\fR\fR] [\fB\-v\ \fR\fB\fIlevel\fR\fR] {name}
+\fBdnssec\-keygen\fR [\fB\-a\ \fR\fB\fIalgorithm\fR\fR] [\fB\-b\ \fR\fB\fIkeysize\fR\fR] [\fB\-n\ \fR\fB\fInametype\fR\fR] [\fB\-3\fR] [\fB\-A\ \fR\fB\fIdate/offset\fR\fR] [\fB\-C\fR] [\fB\-c\ \fR\fB\fIclass\fR\fR] [\fB\-D\ \fR\fB\fIdate/offset\fR\fR] [\fB\-E\ \fR\fB\fIengine\fR\fR] [\fB\-e\fR] [\fB\-f\ \fR\fB\fIflag\fR\fR] [\fB\-G\fR] [\fB\-g\ \fR\fB\fIgenerator\fR\fR] [\fB\-h\fR] [\fB\-I\ \fR\fB\fIdate/offset\fR\fR] [\fB\-i\ \fR\fB\fIinterval\fR\fR] [\fB\-K\ \fR\fB\fIdirectory\fR\fR] [\fB\-k\fR] [\fB\-P\ \fR\fB\fIdate/offset\fR\fR] [\fB\-p\ \fR\fB\fIprotocol\fR\fR] [\fB\-q\fR] [\fB\-R\ \fR\fB\fIdate/offset\fR\fR] [\fB\-r\ \fR\fB\fIrandomdev\fR\fR] [\fB\-S\ \fR\fB\fIkey\fR\fR] [\fB\-s\ \fR\fB\fIstrength\fR\fR] [\fB\-t\ \fR\fB\fItype\fR\fR] [\fB\-v\ \fR\fB\fIlevel\fR\fR] [\fB\-z\fR] {name}
.SH "DESCRIPTION"
.PP
\fBdnssec\-keygen\fR
-generates keys for DNSSEC (Secure DNS), as defined in RFC 2535 and RFC 4034. It can also generate keys for use with TSIG (Transaction Signatures), as defined in RFC 2845.
+generates keys for DNSSEC (Secure DNS), as defined in RFC 2535 and RFC 4034. It can also generate keys for use with TSIG (Transaction Signatures) as defined in RFC 2845, or TKEY (Transaction Key) as defined in RFC 2930.
.PP
The
\fBname\fR
@@ -48,16 +48,28 @@ of the key is specified on the command line. For DNSSEC keys, this must match th
.RS 4
Selects the cryptographic algorithm. For DNSSEC keys, the value of
\fBalgorithm\fR
-must be one of RSAMD5, RSASHA1, DSA, NSEC3RSASHA1, NSEC3DSA, RSASHA256 or RSASHA512. For TSIG/TKEY, the value must be DH (Diffie Hellman), HMAC\-MD5, HMAC\-SHA1, HMAC\-SHA224, HMAC\-SHA256, HMAC\-SHA384, or HMAC\-SHA512. These values are case insensitive.
+must be one of RSAMD5, RSASHA1, DSA, NSEC3RSASHA1, NSEC3DSA, RSASHA256, RSASHA512 or ECCGOST. For TSIG/TKEY, the value must be DH (Diffie Hellman), HMAC\-MD5, HMAC\-SHA1, HMAC\-SHA224, HMAC\-SHA256, HMAC\-SHA384, or HMAC\-SHA512. These values are case insensitive.
+.sp
+If no algorithm is specified, then RSASHA1 will be used by default, unless the
+\fB\-3\fR
+option is specified, in which case NSEC3RSASHA1 will be used instead. (If
+\fB\-3\fR
+is used and an algorithm is specified, that algorithm will be checked for compatibility with NSEC3.)
.sp
Note 1: that for DNSSEC, RSASHA1 is a mandatory to implement algorithm, and DSA is recommended. For TSIG, HMAC\-MD5 is mandatory.
.sp
-Note 2: HMAC\-MD5 and DH automatically set the \-k flag.
+Note 2: DH, HMAC\-MD5, and HMAC\-SHA1 through HMAC\-SHA512 automatically set the \-T KEY option.
.RE
.PP
\-b \fIkeysize\fR
.RS 4
Specifies the number of bits in the key. The choice of key size depends on the algorithm used. RSA keys must be between 512 and 2048 bits. Diffie Hellman keys must be between 128 and 4096 bits. DSA keys must be between 512 and 1024 bits and an exact multiple of 64. HMAC keys must be between 1 and 512 bits.
+.sp
+The key size does not need to be specified if using a default algorithm. The default key size is 1024 bits for zone signing keys (ZSK's) and 2048 bits for key signing keys (KSK's, generated with
+\fB\-f KSK\fR). However, if an algorithm is explicitly specified with the
+\fB\-a\fR, then there is no default key size, and the
+\fB\-b\fR
+must be used.
.RE
.PP
\-n \fInametype\fR
@@ -67,11 +79,30 @@ Specifies the owner type of the key. The value of
must either be ZONE (for a DNSSEC zone key (KEY/DNSKEY)), HOST or ENTITY (for a key associated with a host (KEY)), USER (for a key associated with a user(KEY)) or OTHER (DNSKEY). These values are case insensitive. Defaults to ZONE for DNSKEY generation.
.RE
.PP
+\-3
+.RS 4
+Use an NSEC3\-capable algorithm to generate a DNSSEC key. If this option is used and no algorithm is explicitly set on the command line, NSEC3RSASHA1 will be used by default. Note that RSASHA256, RSASHA512 and ECCGOST algorithms are NSEC3\-capable.
+.RE
+.PP
+\-C
+.RS 4
+Compatibility mode: generates an old\-style key, without any metadata. By default,
+\fBdnssec\-keygen\fR
+will include the key's creation date in the metadata stored with the private key, and other dates may be set there as well (publication date, activation date, etc). Keys that include this data may be incompatible with older versions of BIND; the
+\fB\-C\fR
+option suppresses them.
+.RE
+.PP
\-c \fIclass\fR
.RS 4
Indicates that the DNS record containing the key should have the specified class. If not specified, class IN is used.
.RE
.PP
+\-E \fIengine\fR
+.RS 4
+Uses a crypto hardware (OpenSSL engine) for random number and, when supported, key generation. When compiled with PKCS#11 support it defaults to pkcs11; the empty name resets it to no engine.
+.RE
+.PP
\-e
.RS 4
If generating an RSAMD5/RSASHA1 key, use a large exponent.
@@ -79,7 +110,12 @@ If generating an RSAMD5/RSASHA1 key, use a large exponent.
.PP
\-f \fIflag\fR
.RS 4
-Set the specified flag in the flag field of the KEY/DNSKEY record. The only recognized flag is KSK (Key Signing Key) DNSKEY.
+Set the specified flag in the flag field of the KEY/DNSKEY record. The only recognized flags are KSK (Key Signing Key) and REVOKE.
+.RE
+.PP
+\-G
+.RS 4
+Generate a key, but do not publish it or sign with it. This option is incompatible with \-P and \-A.
.RE
.PP
\-g \fIgenerator\fR
@@ -93,9 +129,14 @@ Prints a short summary of the options and arguments to
\fBdnssec\-keygen\fR.
.RE
.PP
+\-K \fIdirectory\fR
+.RS 4
+Sets the directory in which the key files are to be written.
+.RE
+.PP
\-k
.RS 4
-Generate KEY records rather than DNSKEY records.
+Deprecated in favor of \-T KEY.
.RE
.PP
\-p \fIprotocol\fR
@@ -103,6 +144,15 @@ Generate KEY records rather than DNSKEY records.
Sets the protocol value for the generated key. The protocol is a number between 0 and 255. The default is 3 (DNSSEC). Other possible values for this argument are listed in RFC 2535 and its successors.
.RE
.PP
+\-q
+.RS 4
+Quiet mode: Suppresses unnecessary output, including progress indication. Without this option, when
+\fBdnssec\-keygen\fR
+is run interactively to generate an RSA or DSA key pair, it will print a string of symbols to
+\fIstderr\fR
+indicating the progress of the key generation. A '.' indicates that a random number has been found which passed an initial sieve test; '+' means a number has passed a single round of the Miller\-Rabin primality test; a space means that the number has passed all the tests and is a satisfactory key.
+.RE
+.PP
\-r \fIrandomdev\fR
.RS 4
Specifies the source of randomness. If the operating system does not provide a
@@ -114,11 +164,24 @@ specifies the name of a character device or file containing random data to be us
indicates that keyboard input should be used.
.RE
.PP
+\-S \fIkey\fR
+.RS 4
+Create a new key which is an explicit successor to an existing key. The name, algorithm, size, and type of the key will be set to match the existing key. The activation date of the new key will be set to the inactivation date of the existing one. The publication date will be set to the activation date minus the prepublication interval, which defaults to 30 days.
+.RE
+.PP
\-s \fIstrength\fR
.RS 4
Specifies the strength value of the key. The strength is a number between 0 and 15, and currently has no defined purpose in DNSSEC.
.RE
.PP
+\-T \fIrrtype\fR
+.RS 4
+Specifies the resource record type to use for the key.
+\fBrrtype\fR
+must be either DNSKEY or KEY. The default is DNSKEY when using a DNSSEC algorithm, but it can be overridden to KEY for use with SIG(0).
+Using any TSIG algorithm (HMAC\-* or DH) forces this option to KEY.
+.RE
+.PP
\-t \fItype\fR
.RS 4
Indicates the use of the key.
@@ -130,6 +193,43 @@ must be one of AUTHCONF, NOAUTHCONF, NOAUTH, or NOCONF. The default is AUTHCONF.
.RS 4
Sets the debugging level.
.RE
+.SH "TIMING OPTIONS"
+.PP
+Dates can be expressed in the format YYYYMMDD or YYYYMMDDHHMMSS. If the argument begins with a '+' or '\-', it is interpreted as an offset from the present time. For convenience, if such an offset is followed by one of the suffixes 'y', 'mo', 'w', 'd', 'h', or 'mi', then the offset is computed in years (defined as 365 24\-hour days, ignoring leap years), months (defined as 30 24\-hour days), weeks, days, hours, or minutes, respectively. Without a suffix, the offset is computed in seconds.
+.PP
+\-P \fIdate/offset\fR
+.RS 4
+Sets the date on which a key is to be published to the zone. After that date, the key will be included in the zone but will not be used to sign it. If not set, and if the \-G option has not been used, the default is "now".
+.RE
+.PP
+\-A \fIdate/offset\fR
+.RS 4
+Sets the date on which the key is to be activated. After that date, the key will be included in the zone and used to sign it. If not set, and if the \-G option has not been used, the default is "now".
+.RE
+.PP
+\-R \fIdate/offset\fR
+.RS 4
+Sets the date on which the key is to be revoked. After that date, the key will be flagged as revoked. It will be included in the zone and will be used to sign it.
+.RE
+.PP
+\-I \fIdate/offset\fR
+.RS 4
+Sets the date on which the key is to be retired. After that date, the key will still be included in the zone, but it will not be used to sign it.
+.RE
+.PP
+\-D \fIdate/offset\fR
+.RS 4
+Sets the date on which the key is to be deleted. After that date, the key will no longer be included in the zone. (It may remain in the key repository, however.)
+.RE
+.PP
+\-i \fIinterval\fR
+.RS 4
+Sets the prepublication interval for a key. If set, then the publication and activation dates must be separated by at least this much time. If the activation date is specified but the publication date isn't, then the publication date will default to this much time before the activation date; conversely, if the publication date is specified but activation date isn't, then activation will be set to this much time after publication.
+.sp
+If the key is being created as an explicit successor to another key, then the default prepublication interval is 30 days; otherwise it is zero.
+.sp
+As with date offsets, if the argument is followed by one of the suffixes 'y', 'mo', 'w', 'd', 'h', or 'mi', then the interval is measured in years, months, weeks, days, hours, or minutes, respectively. Without a suffix, the interval is measured in seconds.
+.RE
.SH "GENERATED KEYS"
.PP
When
diff --git a/contrib/bind9/bin/dnssec/dnssec-keygen.c b/contrib/bind9/bin/dnssec/dnssec-keygen.c
index 2184122..f369326 100644
--- a/contrib/bind9/bin/dnssec/dnssec-keygen.c
+++ b/contrib/bind9/bin/dnssec/dnssec-keygen.c
@@ -1,5 +1,5 @@
/*
- * Portions Copyright (C) 2004-2008, 2010 Internet Systems Consortium, Inc. ("ISC")
+ * Portions Copyright (C) 2004-2010 Internet Systems Consortium, Inc. ("ISC")
* Portions Copyright (C) 1999-2003 Internet Software Consortium.
*
* Permission to use, copy, modify, and/or distribute this software for any
@@ -29,13 +29,15 @@
* IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: dnssec-keygen.c,v 1.81.48.2 2010-01-15 23:47:31 tbox Exp $ */
+/* $Id: dnssec-keygen.c,v 1.115 2010-12-23 04:07:59 marka Exp $ */
/*! \file */
#include <config.h>
+#include <ctype.h>
#include <stdlib.h>
+#include <unistd.h>
#include <isc/buffer.h>
#include <isc/commandline.h>
@@ -45,6 +47,7 @@
#include <isc/string.h>
#include <isc/util.h>
+#include <dns/dnssec.h>
#include <dns/fixedname.h>
#include <dns/keyvalues.h>
#include <dns/log.h>
@@ -62,103 +65,224 @@
const char *program = "dnssec-keygen";
int verbose;
-static const char *algs = "RSA | RSAMD5 | DH | DSA | RSASHA1 | RSASHA256 |"
- " RSASHA512 | NSEC3DSA | NSEC3RSASHA1 | HMAC-MD5 |"
- " HMAC-SHA1 | HMAC-SHA224 | HMAC-SHA256 |"
- " HMAC-SHA384 | HMAC-SHA512";
+#define DEFAULT_ALGORITHM "RSASHA1"
+#define DEFAULT_NSEC3_ALGORITHM "NSEC3RSASHA1"
-static isc_boolean_t
-dsa_size_ok(int size) {
- return (ISC_TF(size >= 512 && size <= 1024 && size % 64 == 0));
-}
+ISC_PLATFORM_NORETURN_PRE static void
+usage(void) ISC_PLATFORM_NORETURN_POST;
+
+static void progress(int p);
static void
usage(void) {
fprintf(stderr, "Usage:\n");
- fprintf(stderr, " %s -a alg -b bits [-n type] [options] name\n\n",
- program);
+ fprintf(stderr, " %s [options] name\n\n", program);
fprintf(stderr, "Version: %s\n", VERSION);
- fprintf(stderr, "Required options:\n");
- fprintf(stderr, " -a algorithm: %s\n", algs);
- fprintf(stderr, " -b key size, in bits:\n");
- fprintf(stderr, " RSAMD5:\t\t[512..%d]\n", MAX_RSA);
- fprintf(stderr, " RSASHA1:\t\t[512..%d]\n", MAX_RSA);
- fprintf(stderr, " NSEC3RSASHA1:\t\t[512..%d]\n", MAX_RSA);
- fprintf(stderr, " RSASHA256:\t[512..%d]\n", MAX_RSA);
- fprintf(stderr, " RSASHA512:\t[1024..%d]\n", MAX_RSA);
+ fprintf(stderr, " name: owner of the key\n");
+ fprintf(stderr, "Options:\n");
+ fprintf(stderr, " -K <directory>: write keys into directory\n");
+ fprintf(stderr, " -a <algorithm>:\n");
+ fprintf(stderr, " RSA | RSAMD5 | DSA | RSASHA1 | NSEC3RSASHA1"
+ " | NSEC3DSA |\n");
+ fprintf(stderr, " RSASHA256 | RSASHA512 | ECCGOST |\n");
+ fprintf(stderr, " DH | HMAC-MD5 | HMAC-SHA1 | HMAC-SHA224 | "
+ "HMAC-SHA256 | \n");
+ fprintf(stderr, " HMAC-SHA384 | HMAC-SHA512\n");
+ fprintf(stderr, " (default: RSASHA1, or "
+ "NSEC3RSASHA1 if using -3)\n");
+ fprintf(stderr, " -3: use NSEC3-capable algorithm\n");
+ fprintf(stderr, " -b <key size in bits>:\n");
+ fprintf(stderr, " RSAMD5:\t[512..%d]\n", MAX_RSA);
+ fprintf(stderr, " RSASHA1:\t[512..%d]\n", MAX_RSA);
+ fprintf(stderr, " NSEC3RSASHA1:\t[512..%d]\n", MAX_RSA);
+ fprintf(stderr, " RSASHA256:\t[512..%d]\n", MAX_RSA);
+ fprintf(stderr, " RSASHA512:\t[1024..%d]\n", MAX_RSA);
fprintf(stderr, " DH:\t\t[128..4096]\n");
fprintf(stderr, " DSA:\t\t[512..1024] and divisible by 64\n");
- fprintf(stderr, " NSEC3DSA:\t\t[512..1024] and divisible by 64\n");
+ fprintf(stderr, " NSEC3DSA:\t[512..1024] and divisible "
+ "by 64\n");
+ fprintf(stderr, " ECCGOST:\tignored\n");
fprintf(stderr, " HMAC-MD5:\t[1..512]\n");
fprintf(stderr, " HMAC-SHA1:\t[1..160]\n");
fprintf(stderr, " HMAC-SHA224:\t[1..224]\n");
fprintf(stderr, " HMAC-SHA256:\t[1..256]\n");
fprintf(stderr, " HMAC-SHA384:\t[1..384]\n");
fprintf(stderr, " HMAC-SHA512:\t[1..512]\n");
- fprintf(stderr, " -n nametype: ZONE | HOST | ENTITY | USER | OTHER\n");
- fprintf(stderr, " (DNSKEY generation defaults to ZONE\n");
- fprintf(stderr, " name: owner of the key\n");
- fprintf(stderr, "Other options:\n");
- fprintf(stderr, " -c <class> (default: IN)\n");
+ fprintf(stderr, " (if using the default algorithm, key size\n"
+ " defaults to 2048 for KSK, or 1024 for all "
+ "others)\n");
+ fprintf(stderr, " -n <nametype>: ZONE | HOST | ENTITY | "
+ "USER | OTHER\n");
+ fprintf(stderr, " (DNSKEY generation defaults to ZONE)\n");
+ fprintf(stderr, " -c <class>: (default: IN)\n");
fprintf(stderr, " -d <digest bits> (0 => max, default)\n");
- fprintf(stderr, " -e use large exponent (RSAMD5/RSASHA1 only)\n");
- fprintf(stderr, " -f keyflag: KSK\n");
- fprintf(stderr, " -g <generator> use specified generator "
- "(DH only)\n");
+#ifdef USE_PKCS11
+ fprintf(stderr, " -E <engine name> (default \"pkcs11\")\n");
+#else
+ fprintf(stderr, " -E <engine name>\n");
+#endif
+ fprintf(stderr, " -e: use large exponent (RSAMD5/RSASHA1 only)\n");
+ fprintf(stderr, " -f <keyflag>: KSK | REVOKE\n");
+ fprintf(stderr, " -g <generator>: use specified generator "
+ "(DH only)\n");
+ fprintf(stderr, " -p <protocol>: (default: 3 [dnssec])\n");
+ fprintf(stderr, " -s <strength>: strength value this key signs DNS "
+ "records with (default: 0)\n");
+ fprintf(stderr, " -T <rrtype>: DNSKEY | KEY (default: DNSKEY; "
+ "use KEY for SIG(0))\n");
+ fprintf(stderr, " ECCGOST:\tignored\n");
fprintf(stderr, " -t <type>: "
- "AUTHCONF | NOAUTHCONF | NOAUTH | NOCONF "
- "(default: AUTHCONF)\n");
- fprintf(stderr, " -p <protocol>: "
- "default: 3 [dnssec]\n");
- fprintf(stderr, " -s <strength> strength value this key signs DNS "
- "records with (default: 0)\n");
+ "AUTHCONF | NOAUTHCONF | NOAUTH | NOCONF "
+ "(default: AUTHCONF)\n");
fprintf(stderr, " -r <randomdev>: a file containing random data\n");
- fprintf(stderr, " -v <verbose level>\n");
- fprintf(stderr, " -k : generate a TYPE=KEY key\n");
+
+ fprintf(stderr, " -h: print usage and exit\n");
+ fprintf(stderr, " -m <memory debugging mode>:\n");
+ fprintf(stderr, " usage | trace | record | size | mctx\n");
+ fprintf(stderr, " -v <level>: set verbosity level (0 - 10)\n");
+ fprintf(stderr, "Timing options:\n");
+ fprintf(stderr, " -P date/[+-]offset/none: set key publication date "
+ "(default: now)\n");
+ fprintf(stderr, " -A date/[+-]offset/none: set key activation date "
+ "(default: now)\n");
+ fprintf(stderr, " -R date/[+-]offset/none: set key "
+ "revocation date\n");
+ fprintf(stderr, " -I date/[+-]offset/none: set key "
+ "inactivation date\n");
+ fprintf(stderr, " -D date/[+-]offset/none: set key deletion date\n");
+ fprintf(stderr, " -G: generate key only; do not set -P or -A\n");
+ fprintf(stderr, " -C: generate a backward-compatible key, omitting "
+ "all dates\n");
+ fprintf(stderr, " -S <key>: generate a successor to an existing "
+ "key\n");
+ fprintf(stderr, " -i <interval>: prepublication interval for "
+ "successor key "
+ "(default: 30 days)\n");
fprintf(stderr, "Output:\n");
fprintf(stderr, " K<name>+<alg>+<id>.key, "
- "K<name>+<alg>+<id>.private\n");
+ "K<name>+<alg>+<id>.private\n");
exit (-1);
}
+static isc_boolean_t
+dsa_size_ok(int size) {
+ return (ISC_TF(size >= 512 && size <= 1024 && size % 64 == 0));
+}
+
+static void
+progress(int p)
+{
+ char c = '*';
+
+ switch (p) {
+ case 0:
+ c = '.';
+ break;
+ case 1:
+ c = '+';
+ break;
+ case 2:
+ c = '*';
+ break;
+ case 3:
+ c = ' ';
+ break;
+ default:
+ break;
+ }
+ (void) putc(c, stderr);
+ (void) fflush(stderr);
+}
+
int
main(int argc, char **argv) {
char *algname = NULL, *nametype = NULL, *type = NULL;
char *classname = NULL;
char *endp;
- dst_key_t *key = NULL, *oldkey;
+ dst_key_t *key = NULL;
dns_fixedname_t fname;
dns_name_t *name;
- isc_uint16_t flags = 0, ksk = 0;
+ isc_uint16_t flags = 0, kskflag = 0, revflag = 0;
dns_secalg_t alg;
isc_boolean_t conflict = ISC_FALSE, null_key = ISC_FALSE;
+ isc_boolean_t oldstyle = ISC_FALSE;
isc_mem_t *mctx = NULL;
int ch, rsa_exp = 0, generator = 0, param = 0;
int protocol = -1, size = -1, signatory = 0;
isc_result_t ret;
isc_textregion_t r;
char filename[255];
+ const char *directory = NULL;
+ const char *predecessor = NULL;
+ dst_key_t *prevkey = NULL;
isc_buffer_t buf;
isc_log_t *log = NULL;
isc_entropy_t *ectx = NULL;
+#ifdef USE_PKCS11
+ const char *engine = "pkcs11";
+#else
+ const char *engine = NULL;
+#endif
dns_rdataclass_t rdclass;
int options = DST_TYPE_PRIVATE | DST_TYPE_PUBLIC;
int dbits = 0;
+ isc_boolean_t use_default = ISC_FALSE, use_nsec3 = ISC_FALSE;
+ isc_stdtime_t publish = 0, activate = 0, revoke = 0;
+ isc_stdtime_t inactive = 0, delete = 0;
+ isc_stdtime_t now;
+ int prepub = -1;
+ isc_boolean_t setpub = ISC_FALSE, setact = ISC_FALSE;
+ isc_boolean_t setrev = ISC_FALSE, setinact = ISC_FALSE;
+ isc_boolean_t setdel = ISC_FALSE;
+ isc_boolean_t unsetpub = ISC_FALSE, unsetact = ISC_FALSE;
+ isc_boolean_t unsetrev = ISC_FALSE, unsetinact = ISC_FALSE;
+ isc_boolean_t unsetdel = ISC_FALSE;
+ isc_boolean_t genonly = ISC_FALSE;
+ isc_boolean_t quiet = ISC_FALSE;
+ isc_boolean_t show_progress = ISC_FALSE;
+ unsigned char c;
if (argc == 1)
usage();
- RUNTIME_CHECK(isc_mem_create(0, 0, &mctx) == ISC_R_SUCCESS);
-
dns_result_register();
isc_commandline_errprint = ISC_FALSE;
- while ((ch = isc_commandline_parse(argc, argv,
- "a:b:c:d:ef:g:kn:t:p:s:r:v:h")) != -1)
- {
+ /*
+ * Process memory debugging argument first.
+ */
+#define CMDLINE_FLAGS "3A:a:b:Cc:D:d:E:eFf:Gg:hI:i:K:km:n:P:p:qR:r:S:s:T:t:v:"
+ while ((ch = isc_commandline_parse(argc, argv, CMDLINE_FLAGS)) != -1) {
+ switch (ch) {
+ case 'm':
+ if (strcasecmp(isc_commandline_argument, "record") == 0)
+ isc_mem_debugging |= ISC_MEM_DEBUGRECORD;
+ if (strcasecmp(isc_commandline_argument, "trace") == 0)
+ isc_mem_debugging |= ISC_MEM_DEBUGTRACE;
+ if (strcasecmp(isc_commandline_argument, "usage") == 0)
+ isc_mem_debugging |= ISC_MEM_DEBUGUSAGE;
+ if (strcasecmp(isc_commandline_argument, "size") == 0)
+ isc_mem_debugging |= ISC_MEM_DEBUGSIZE;
+ if (strcasecmp(isc_commandline_argument, "mctx") == 0)
+ isc_mem_debugging |= ISC_MEM_DEBUGCTX;
+ break;
+ default:
+ break;
+ }
+ }
+ isc_commandline_reset = ISC_TRUE;
+
+ RUNTIME_CHECK(isc_mem_create(0, 0, &mctx) == ISC_R_SUCCESS);
+
+ isc_stdtime_get(&now);
+
+ while ((ch = isc_commandline_parse(argc, argv, CMDLINE_FLAGS)) != -1) {
switch (ch) {
+ case '3':
+ use_nsec3 = ISC_TRUE;
+ break;
case 'a':
algname = isc_commandline_argument;
break;
@@ -167,6 +291,9 @@ main(int argc, char **argv) {
if (*endp != '\0' || size < 0)
fatal("-b requires a non-negative number");
break;
+ case 'C':
+ oldstyle = ISC_TRUE;
+ break;
case 'c':
classname = isc_commandline_argument;
break;
@@ -175,12 +302,18 @@ main(int argc, char **argv) {
if (*endp != '\0' || dbits < 0)
fatal("-d requires a non-negative number");
break;
+ case 'E':
+ engine = isc_commandline_argument;
+ break;
case 'e':
rsa_exp = 1;
break;
case 'f':
- if (strcasecmp(isc_commandline_argument, "KSK") == 0)
- ksk = DNS_KEYFLAG_KSK;
+ c = (unsigned char)(isc_commandline_argument[0]);
+ if (toupper(c) == 'K')
+ kskflag = DNS_KEYFLAG_KSK;
+ else if (toupper(c) == 'R')
+ revflag = DNS_KEYFLAG_REVOKE;
else
fatal("unknown flag '%s'",
isc_commandline_argument);
@@ -191,14 +324,22 @@ main(int argc, char **argv) {
if (*endp != '\0' || generator <= 0)
fatal("-g requires a positive number");
break;
+ case 'K':
+ directory = isc_commandline_argument;
+ ret = try_dir(directory);
+ if (ret != ISC_R_SUCCESS)
+ fatal("cannot open directory %s: %s",
+ directory, isc_result_totext(ret));
+ break;
case 'k':
- options |= DST_TYPE_KEY;
+ fatal("The -k option has been deprecated.\n"
+ "To generate a key-signing key, use -f KSK.\n"
+ "To generate a key with TYPE=KEY, use -T KEY.\n");
break;
case 'n':
nametype = isc_commandline_argument;
break;
- case 't':
- type = isc_commandline_argument;
+ case 'm':
break;
case 'p':
protocol = strtol(isc_commandline_argument, &endp, 10);
@@ -206,6 +347,12 @@ main(int argc, char **argv) {
fatal("-p must be followed by a number "
"[0..255]");
break;
+ case 'q':
+ quiet = ISC_TRUE;
+ break;
+ case 'r':
+ setup_entropy(mctx, isc_commandline_argument, &ectx);
+ break;
case 's':
signatory = strtol(isc_commandline_argument,
&endp, 10);
@@ -213,8 +360,19 @@ main(int argc, char **argv) {
fatal("-s must be followed by a number "
"[0..15]");
break;
- case 'r':
- setup_entropy(mctx, isc_commandline_argument, &ectx);
+ case 'T':
+ if (strcasecmp(isc_commandline_argument, "KEY") == 0)
+ options |= DST_TYPE_KEY;
+ else if (strcasecmp(isc_commandline_argument,
+ "DNSKEY") == 0)
+ /* default behavior */
+ ;
+ else
+ fatal("unknown type '%s'",
+ isc_commandline_argument);
+ break;
+ case 't':
+ type = isc_commandline_argument;
break;
case 'v':
endp = NULL;
@@ -222,11 +380,86 @@ main(int argc, char **argv) {
if (*endp != '\0')
fatal("-v must be followed by a number");
break;
-
+ case 'z':
+ /* already the default */
+ break;
+ case 'G':
+ genonly = ISC_TRUE;
+ break;
+ case 'P':
+ if (setpub || unsetpub)
+ fatal("-P specified more than once");
+
+ if (strcasecmp(isc_commandline_argument, "none")) {
+ setpub = ISC_TRUE;
+ publish = strtotime(isc_commandline_argument,
+ now, now);
+ } else {
+ unsetpub = ISC_TRUE;
+ }
+ break;
+ case 'A':
+ if (setact || unsetact)
+ fatal("-A specified more than once");
+
+ if (strcasecmp(isc_commandline_argument, "none")) {
+ setact = ISC_TRUE;
+ activate = strtotime(isc_commandline_argument,
+ now, now);
+ } else {
+ unsetact = ISC_TRUE;
+ }
+ break;
+ case 'R':
+ if (setrev || unsetrev)
+ fatal("-R specified more than once");
+
+ if (strcasecmp(isc_commandline_argument, "none")) {
+ setrev = ISC_TRUE;
+ revoke = strtotime(isc_commandline_argument,
+ now, now);
+ } else {
+ unsetrev = ISC_TRUE;
+ }
+ break;
+ case 'I':
+ if (setinact || unsetinact)
+ fatal("-I specified more than once");
+
+ if (strcasecmp(isc_commandline_argument, "none")) {
+ setinact = ISC_TRUE;
+ inactive = strtotime(isc_commandline_argument,
+ now, now);
+ } else {
+ unsetinact = ISC_TRUE;
+ }
+ break;
+ case 'D':
+ if (setdel || unsetdel)
+ fatal("-D specified more than once");
+
+ if (strcasecmp(isc_commandline_argument, "none")) {
+ setdel = ISC_TRUE;
+ delete = strtotime(isc_commandline_argument,
+ now, now);
+ } else {
+ unsetdel = ISC_TRUE;
+ }
+ break;
+ case 'S':
+ predecessor = isc_commandline_argument;
+ break;
+ case 'i':
+ prepub = strtottl(isc_commandline_argument);
+ break;
+ case 'F':
+ /* Reserved for FIPS mode */
+ /* FALLTHROUGH */
case '?':
if (isc_commandline_option != '?')
fprintf(stderr, "%s: invalid argument -%c\n",
program, isc_commandline_option);
+ /* FALLTHROUGH */
case 'h':
usage();
@@ -237,73 +470,219 @@ main(int argc, char **argv) {
}
}
+ if (!isatty(0))
+ quiet = ISC_TRUE;
+
if (ectx == NULL)
setup_entropy(mctx, NULL, &ectx);
- ret = dst_lib_init(mctx, ectx,
- ISC_ENTROPY_BLOCKING | ISC_ENTROPY_GOODONLY);
+ ret = dst_lib_init2(mctx, ectx, engine,
+ ISC_ENTROPY_BLOCKING | ISC_ENTROPY_GOODONLY);
if (ret != ISC_R_SUCCESS)
- fatal("could not initialize dst");
+ fatal("could not initialize dst: %s",
+ isc_result_totext(ret));
setup_logging(verbose, mctx, &log);
- if (argc < isc_commandline_index + 1)
- fatal("the key name was not specified");
- if (argc > isc_commandline_index + 1)
- fatal("extraneous arguments");
-
- if (algname == NULL)
- fatal("no algorithm was specified");
- if (strcasecmp(algname, "RSA") == 0) {
- fprintf(stderr, "The use of RSA (RSAMD5) is not recommended.\n"
- "If you still wish to use RSA (RSAMD5) please "
- "specify \"-a RSAMD5\"\n");
- return (1);
- } else if (strcasecmp(algname, "HMAC-MD5") == 0) {
- options |= DST_TYPE_KEY;
- alg = DST_ALG_HMACMD5;
- } else if (strcasecmp(algname, "HMAC-SHA1") == 0) {
- options |= DST_TYPE_KEY;
- alg = DST_ALG_HMACSHA1;
- } else if (strcasecmp(algname, "HMAC-SHA224") == 0) {
- options |= DST_TYPE_KEY;
- alg = DST_ALG_HMACSHA224;
- } else if (strcasecmp(algname, "HMAC-SHA256") == 0) {
- options |= DST_TYPE_KEY;
- alg = DST_ALG_HMACSHA256;
- } else if (strcasecmp(algname, "HMAC-SHA384") == 0) {
- options |= DST_TYPE_KEY;
- alg = DST_ALG_HMACSHA384;
- } else if (strcasecmp(algname, "HMAC-SHA512") == 0) {
- options |= DST_TYPE_KEY;
- alg = DST_ALG_HMACSHA512;
- } else {
- r.base = algname;
- r.length = strlen(algname);
- ret = dns_secalg_fromtext(&alg, &r);
+ if (predecessor == NULL) {
+ if (prepub == -1)
+ prepub = 0;
+
+ if (argc < isc_commandline_index + 1)
+ fatal("the key name was not specified");
+ if (argc > isc_commandline_index + 1)
+ fatal("extraneous arguments");
+
+ dns_fixedname_init(&fname);
+ name = dns_fixedname_name(&fname);
+ isc_buffer_init(&buf, argv[isc_commandline_index],
+ strlen(argv[isc_commandline_index]));
+ isc_buffer_add(&buf, strlen(argv[isc_commandline_index]));
+ ret = dns_name_fromtext(name, &buf, dns_rootname, 0, NULL);
if (ret != ISC_R_SUCCESS)
- fatal("unknown algorithm %s", algname);
- if (alg == DST_ALG_DH)
- options |= DST_TYPE_KEY;
- }
+ fatal("invalid key name %s: %s",
+ argv[isc_commandline_index],
+ isc_result_totext(ret));
+
+ if (algname == NULL) {
+ use_default = ISC_TRUE;
+ if (use_nsec3)
+ algname = strdup(DEFAULT_NSEC3_ALGORITHM);
+ else
+ algname = strdup(DEFAULT_ALGORITHM);
+ if (verbose > 0)
+ fprintf(stderr, "no algorithm specified; "
+ "defaulting to %s\n", algname);
+ }
- if (type != NULL && (options & DST_TYPE_KEY) != 0) {
- if (strcasecmp(type, "NOAUTH") == 0)
- flags |= DNS_KEYTYPE_NOAUTH;
- else if (strcasecmp(type, "NOCONF") == 0)
- flags |= DNS_KEYTYPE_NOCONF;
- else if (strcasecmp(type, "NOAUTHCONF") == 0) {
- flags |= (DNS_KEYTYPE_NOAUTH | DNS_KEYTYPE_NOCONF);
- if (size < 0)
- size = 0;
+ if (strcasecmp(algname, "RSA") == 0) {
+ fprintf(stderr, "The use of RSA (RSAMD5) is not "
+ "recommended.\nIf you still wish to "
+ "use RSA (RSAMD5) please specify "
+ "\"-a RSAMD5\"\n");
+ return (1);
+ } else if (strcasecmp(algname, "HMAC-MD5") == 0)
+ alg = DST_ALG_HMACMD5;
+ else if (strcasecmp(algname, "HMAC-SHA1") == 0)
+ alg = DST_ALG_HMACSHA1;
+ else if (strcasecmp(algname, "HMAC-SHA224") == 0)
+ alg = DST_ALG_HMACSHA224;
+ else if (strcasecmp(algname, "HMAC-SHA256") == 0)
+ alg = DST_ALG_HMACSHA256;
+ else if (strcasecmp(algname, "HMAC-SHA384") == 0)
+ alg = DST_ALG_HMACSHA384;
+ else if (strcasecmp(algname, "HMAC-SHA512") == 0)
+ alg = DST_ALG_HMACSHA512;
+ else {
+ r.base = algname;
+ r.length = strlen(algname);
+ ret = dns_secalg_fromtext(&alg, &r);
+ if (ret != ISC_R_SUCCESS)
+ fatal("unknown algorithm %s", algname);
+ if (alg == DST_ALG_DH)
+ options |= DST_TYPE_KEY;
}
- else if (strcasecmp(type, "AUTHCONF") == 0)
- /* nothing */;
- else
- fatal("invalid type %s", type);
- }
- if (size < 0)
- fatal("key size not specified (-b option)");
+ if (use_nsec3 &&
+ alg != DST_ALG_NSEC3DSA && alg != DST_ALG_NSEC3RSASHA1 &&
+ alg != DST_ALG_RSASHA256 && alg!= DST_ALG_RSASHA512 &&
+ alg != DST_ALG_ECCGOST) {
+ fatal("%s is incompatible with NSEC3; "
+ "do not use the -3 option", algname);
+ }
+
+ if (type != NULL && (options & DST_TYPE_KEY) != 0) {
+ if (strcasecmp(type, "NOAUTH") == 0)
+ flags |= DNS_KEYTYPE_NOAUTH;
+ else if (strcasecmp(type, "NOCONF") == 0)
+ flags |= DNS_KEYTYPE_NOCONF;
+ else if (strcasecmp(type, "NOAUTHCONF") == 0) {
+ flags |= (DNS_KEYTYPE_NOAUTH |
+ DNS_KEYTYPE_NOCONF);
+ if (size < 0)
+ size = 0;
+ }
+ else if (strcasecmp(type, "AUTHCONF") == 0)
+ /* nothing */;
+ else
+ fatal("invalid type %s", type);
+ }
+
+ if (size < 0) {
+ if (use_default) {
+ if ((kskflag & DNS_KEYFLAG_KSK) != 0)
+ size = 2048;
+ else
+ size = 1024;
+ if (verbose > 0)
+ fprintf(stderr, "key size not "
+ "specified; defaulting "
+ "to %d\n", size);
+ } else if (alg != DST_ALG_ECCGOST)
+ fatal("key size not specified (-b option)");
+ }
+
+ if (!oldstyle && prepub > 0) {
+ if (setpub && setact && (activate - prepub) < publish)
+ fatal("Activation and publication dates "
+ "are closer together than the\n\t"
+ "prepublication interval.");
+
+ if (!setpub && !setact) {
+ setpub = setact = ISC_TRUE;
+ publish = now;
+ activate = now + prepub;
+ } else if (setpub && !setact) {
+ setact = ISC_TRUE;
+ activate = publish + prepub;
+ } else if (setact && !setpub) {
+ setpub = ISC_TRUE;
+ publish = activate - prepub;
+ }
+
+ if ((activate - prepub) < now)
+ fatal("Time until activation is shorter "
+ "than the\n\tprepublication interval.");
+ }
+ } else {
+ char keystr[DST_KEY_FORMATSIZE];
+ isc_stdtime_t when;
+ int major, minor;
+
+ if (prepub == -1)
+ prepub = (30 * 86400);
+
+ if (algname != NULL)
+ fatal("-S and -a cannot be used together");
+ if (size >= 0)
+ fatal("-S and -b cannot be used together");
+ if (nametype != NULL)
+ fatal("-S and -n cannot be used together");
+ if (type != NULL)
+ fatal("-S and -t cannot be used together");
+ if (setpub || unsetpub)
+ fatal("-S and -P cannot be used together");
+ if (setact || unsetact)
+ fatal("-S and -A cannot be used together");
+ if (use_nsec3)
+ fatal("-S and -3 cannot be used together");
+ if (oldstyle)
+ fatal("-S and -C cannot be used together");
+ if (genonly)
+ fatal("-S and -G cannot be used together");
+
+ ret = dst_key_fromnamedfile(predecessor, directory,
+ DST_TYPE_PUBLIC | DST_TYPE_PRIVATE,
+ mctx, &prevkey);
+ if (ret != ISC_R_SUCCESS)
+ fatal("Invalid keyfile %s: %s",
+ filename, isc_result_totext(ret));
+ if (!dst_key_isprivate(prevkey))
+ fatal("%s is not a private key", filename);
+
+ name = dst_key_name(prevkey);
+ alg = dst_key_alg(prevkey);
+ size = dst_key_size(prevkey);
+ flags = dst_key_flags(prevkey);
+
+ dst_key_format(prevkey, keystr, sizeof(keystr));
+ dst_key_getprivateformat(prevkey, &major, &minor);
+ if (major != DST_MAJOR_VERSION || minor < DST_MINOR_VERSION)
+ fatal("Key %s has incompatible format version %d.%d\n\t"
+ "It is not possible to generate a successor key.",
+ keystr, major, minor);
+
+ ret = dst_key_gettime(prevkey, DST_TIME_ACTIVATE, &when);
+ if (ret != ISC_R_SUCCESS)
+ fatal("Key %s has no activation date.\n\t"
+ "You must use dnssec-settime -A to set one "
+ "before generating a successor.", keystr);
+
+ ret = dst_key_gettime(prevkey, DST_TIME_INACTIVE, &activate);
+ if (ret != ISC_R_SUCCESS)
+ fatal("Key %s has no inactivation date.\n\t"
+ "You must use dnssec-settime -I to set one "
+ "before generating a successor.", keystr);
+
+ publish = activate - prepub;
+ if (publish < now)
+ fatal("Key %s becomes inactive\n\t"
+ "sooner than the prepublication period "
+ "for the new key ends.\n\t"
+ "Either change the inactivation date with "
+ "dnssec-settime -I,\n\t"
+ "or use the -i option to set a shorter "
+ "prepublication interval.", keystr);
+
+ ret = dst_key_gettime(prevkey, DST_TIME_DELETE, &when);
+ if (ret != ISC_R_SUCCESS)
+ fprintf(stderr, "%s: WARNING: Key %s has no removal "
+ "date;\n\t it will remain in the zone "
+ "indefinitely after rollover.\n\t "
+ "You can use dnssec-settime -D to "
+ "change this.\n", program, keystr);
+
+ setpub = setact = ISC_TRUE;
+ }
switch (alg) {
case DNS_KEYALG_RSAMD5:
@@ -326,7 +705,10 @@ main(int argc, char **argv) {
if (size != 0 && !dsa_size_ok(size))
fatal("invalid DSS key size: %d", size);
break;
+ case DST_ALG_ECCGOST:
+ break;
case DST_ALG_HMACMD5:
+ options |= DST_TYPE_KEY;
if (size < 1 || size > 512)
fatal("HMAC-MD5 key size %d out of range", size);
if (dbits != 0 && (dbits < 80 || dbits > 128))
@@ -336,6 +718,7 @@ main(int argc, char **argv) {
dbits);
break;
case DST_ALG_HMACSHA1:
+ options |= DST_TYPE_KEY;
if (size < 1 || size > 160)
fatal("HMAC-SHA1 key size %d out of range", size);
if (dbits != 0 && (dbits < 80 || dbits > 160))
@@ -345,6 +728,7 @@ main(int argc, char **argv) {
dbits);
break;
case DST_ALG_HMACSHA224:
+ options |= DST_TYPE_KEY;
if (size < 1 || size > 224)
fatal("HMAC-SHA224 key size %d out of range", size);
if (dbits != 0 && (dbits < 112 || dbits > 224))
@@ -354,6 +738,7 @@ main(int argc, char **argv) {
dbits);
break;
case DST_ALG_HMACSHA256:
+ options |= DST_TYPE_KEY;
if (size < 1 || size > 256)
fatal("HMAC-SHA256 key size %d out of range", size);
if (dbits != 0 && (dbits < 128 || dbits > 256))
@@ -363,6 +748,7 @@ main(int argc, char **argv) {
dbits);
break;
case DST_ALG_HMACSHA384:
+ options |= DST_TYPE_KEY;
if (size < 1 || size > 384)
fatal("HMAC-384 key size %d out of range", size);
if (dbits != 0 && (dbits < 192 || dbits > 384))
@@ -372,6 +758,7 @@ main(int argc, char **argv) {
dbits);
break;
case DST_ALG_HMACSHA512:
+ options |= DST_TYPE_KEY;
if (size < 1 || size > 512)
fatal("HMAC-SHA512 key size %d out of range", size);
if (dbits != 0 && (dbits < 256 || dbits > 512))
@@ -384,7 +771,8 @@ main(int argc, char **argv) {
if (!(alg == DNS_KEYALG_RSAMD5 || alg == DNS_KEYALG_RSASHA1 ||
alg == DNS_KEYALG_NSEC3RSASHA1 || alg == DNS_KEYALG_RSASHA256 ||
- alg == DNS_KEYALG_RSASHA512) && rsa_exp != 0)
+ alg == DNS_KEYALG_RSASHA512 || alg == DST_ALG_ECCGOST) &&
+ rsa_exp != 0)
fatal("specified RSA exponent for a non-RSA key");
if (alg != DNS_KEYALG_DH && generator != 0)
@@ -409,10 +797,15 @@ main(int argc, char **argv) {
rdclass = strtoclass(classname);
+ if (directory == NULL)
+ directory = ".";
+
if ((options & DST_TYPE_KEY) != 0) /* KEY / HMAC */
flags |= signatory;
- else if ((flags & DNS_KEYOWNER_ZONE) != 0) /* DNSKEY */
- flags |= ksk;
+ else if ((flags & DNS_KEYOWNER_ZONE) != 0) { /* DNSKEY */
+ flags |= kskflag;
+ flags |= revflag;
+ }
if (protocol == -1)
protocol = DNS_KEYPROTO_DNSSEC;
@@ -435,16 +828,6 @@ main(int argc, char **argv) {
fatal("a key with algorithm '%s' cannot be a zone key",
algname);
- dns_fixedname_init(&fname);
- name = dns_fixedname_name(&fname);
- isc_buffer_init(&buf, argv[isc_commandline_index],
- strlen(argv[isc_commandline_index]));
- isc_buffer_add(&buf, strlen(argv[isc_commandline_index]));
- ret = dns_name_fromtext(name, &buf, dns_rootname, ISC_FALSE, NULL);
- if (ret != ISC_R_SUCCESS)
- fatal("invalid key name %s: %s", argv[isc_commandline_index],
- isc_result_totext(ret));
-
switch(alg) {
case DNS_KEYALG_RSAMD5:
case DNS_KEYALG_RSASHA1:
@@ -452,12 +835,19 @@ main(int argc, char **argv) {
case DNS_KEYALG_RSASHA256:
case DNS_KEYALG_RSASHA512:
param = rsa_exp;
+ show_progress = ISC_TRUE;
break;
+
case DNS_KEYALG_DH:
param = generator;
break;
+
case DNS_KEYALG_DSA:
case DNS_KEYALG_NSEC3DSA:
+ case DST_ALG_ECCGOST:
+ show_progress = ISC_TRUE;
+ /* fall through */
+
case DST_ALG_HMACMD5:
case DST_ALG_HMACSHA1:
case DST_ALG_HMACSHA224:
@@ -475,62 +865,136 @@ main(int argc, char **argv) {
do {
conflict = ISC_FALSE;
- oldkey = NULL;
- /* generate the key */
- ret = dst_key_generate(name, alg, size, param, flags, protocol,
- rdclass, mctx, &key);
+ if (!quiet && show_progress) {
+ fprintf(stderr, "Generating key pair.");
+ ret = dst_key_generate2(name, alg, size, param, flags,
+ protocol, rdclass, mctx, &key,
+ &progress);
+ putc('\n', stderr);
+ fflush(stderr);
+ } else {
+ ret = dst_key_generate2(name, alg, size, param, flags,
+ protocol, rdclass, mctx, &key,
+ NULL);
+ }
+
isc_entropy_stopcallbacksources(ectx);
if (ret != ISC_R_SUCCESS) {
char namestr[DNS_NAME_FORMATSIZE];
- char algstr[ALG_FORMATSIZE];
+ char algstr[DNS_SECALG_FORMATSIZE];
dns_name_format(name, namestr, sizeof(namestr));
- alg_format(alg, algstr, sizeof(algstr));
+ dns_secalg_format(alg, algstr, sizeof(algstr));
fatal("failed to generate key %s/%s: %s\n",
namestr, algstr, isc_result_totext(ret));
+ /* NOTREACHED */
exit(-1);
}
dst_key_setbits(key, dbits);
/*
- * Try to read a key with the same name, alg and id from disk.
- * If there is one we must continue generating a new one
- * unless we were asked to generate a null key, in which
- * case we return failure.
+ * Set key timing metadata (unless using -C)
+ *
+ * Creation date is always set to "now".
+ *
+ * For a new key without an explicit predecessor, publish
+ * and activation dates are set to "now" by default, but
+ * can both be overridden.
+ *
+ * For a successor key, activation is set to match the
+ * predecessor's inactivation date. Publish is set to 30
+ * days earlier than that (XXX: this should be configurable).
+ * If either of the resulting dates are in the past, that's
+ * an error; the inactivation date of the predecessor key
+ * must be updated before a successor key can be created.
*/
- ret = dst_key_fromfile(name, dst_key_id(key), alg,
- DST_TYPE_PRIVATE, NULL, mctx, &oldkey);
- /* do not overwrite an existing key */
- if (ret == ISC_R_SUCCESS) {
- dst_key_free(&oldkey);
+ if (!oldstyle) {
+ dst_key_settime(key, DST_TIME_CREATED, now);
+
+ if (genonly && (setpub || setact))
+ fatal("cannot use -G together with "
+ "-P or -A options");
+
+ if (setpub)
+ dst_key_settime(key, DST_TIME_PUBLISH, publish);
+ else if (setact)
+ dst_key_settime(key, DST_TIME_PUBLISH,
+ activate);
+ else if (!genonly && !unsetpub)
+ dst_key_settime(key, DST_TIME_PUBLISH, now);
+
+ if (setact)
+ dst_key_settime(key, DST_TIME_ACTIVATE,
+ activate);
+ else if (!genonly && !unsetact)
+ dst_key_settime(key, DST_TIME_ACTIVATE, now);
+
+ if (setrev) {
+ if (kskflag == 0)
+ fprintf(stderr, "%s: warning: Key is "
+ "not flagged as a KSK, but -R "
+ "was used. Revoking a ZSK is "
+ "legal, but undefined.\n",
+ program);
+ dst_key_settime(key, DST_TIME_REVOKE, revoke);
+ }
+
+ if (setinact)
+ dst_key_settime(key, DST_TIME_INACTIVE,
+ inactive);
+
+ if (setdel)
+ dst_key_settime(key, DST_TIME_DELETE, delete);
+ } else {
+ if (setpub || setact || setrev || setinact ||
+ setdel || unsetpub || unsetact ||
+ unsetrev || unsetinact || unsetdel || genonly)
+ fatal("cannot use -C together with "
+ "-P, -A, -R, -I, -D, or -G options");
+ /*
+ * Compatibility mode: Private-key-format
+ * should be set to 1.2.
+ */
+ dst_key_setprivateformat(key, 1, 2);
+ }
+
+ /*
+ * Do not overwrite an existing key, or create a key
+ * if there is a risk of ID collision due to this key
+ * or another key being revoked.
+ */
+ if (key_collision(dst_key_id(key), name, directory,
+ alg, mctx, NULL)) {
conflict = ISC_TRUE;
- if (null_key)
+ if (null_key) {
+ dst_key_free(&key);
break;
- }
- if (conflict == ISC_TRUE) {
+ }
+
if (verbose > 0) {
isc_buffer_clear(&buf);
- ret = dst_key_buildfilename(key, 0, NULL, &buf);
+ dst_key_buildfilename(key, 0, directory, &buf);
fprintf(stderr,
- "%s: %s already exists, "
- "generating a new key\n",
+ "%s: %s already exists, or might "
+ "collide with another key upon "
+ "revokation. Generating a new key\n",
program, filename);
}
+
dst_key_free(&key);
}
-
} while (conflict == ISC_TRUE);
if (conflict)
- fatal("cannot generate a null key when a key with id 0 "
- "already exists");
+ fatal("cannot generate a null key due to possible key ID "
+ "collision");
- ret = dst_key_tofile(key, options, NULL);
+ ret = dst_key_tofile(key, options, directory);
if (ret != ISC_R_SUCCESS) {
- char keystr[KEY_FORMATSIZE];
- key_format(key, keystr, sizeof(keystr));
+ char keystr[DST_KEY_FORMATSIZE];
+ dst_key_format(key, keystr, sizeof(keystr));
fatal("failed to write key %s: %s\n", keystr,
isc_result_totext(ret));
}
@@ -539,6 +1003,8 @@ main(int argc, char **argv) {
ret = dst_key_buildfilename(key, 0, NULL, &buf);
printf("%s\n", filename);
dst_key_free(&key);
+ if (prevkey != NULL)
+ dst_key_free(&prevkey);
cleanup_logging(&log);
cleanup_entropy(&ectx);
diff --git a/contrib/bind9/bin/dnssec/dnssec-keygen.docbook b/contrib/bind9/bin/dnssec/dnssec-keygen.docbook
index 5c7d164..dc140eb 100644
--- a/contrib/bind9/bin/dnssec/dnssec-keygen.docbook
+++ b/contrib/bind9/bin/dnssec/dnssec-keygen.docbook
@@ -18,7 +18,7 @@
- PERFORMANCE OF THIS SOFTWARE.
-->
-<!-- $Id: dnssec-keygen.docbook,v 1.22.44.4 2010-01-15 23:47:33 tbox Exp $ -->
+<!-- $Id: dnssec-keygen.docbook,v 1.36 2010-12-23 04:07:59 marka Exp $ -->
<refentry id="man.dnssec-keygen">
<refentryinfo>
<date>June 30, 2000</date>
@@ -57,20 +57,34 @@
<refsynopsisdiv>
<cmdsynopsis>
<command>dnssec-keygen</command>
- <arg choice="req">-a <replaceable class="parameter">algorithm</replaceable></arg>
- <arg choice="req">-b <replaceable class="parameter">keysize</replaceable></arg>
- <arg choice="req">-n <replaceable class="parameter">nametype</replaceable></arg>
+ <arg><option>-a <replaceable class="parameter">algorithm</replaceable></option></arg>
+ <arg ><option>-b <replaceable class="parameter">keysize</replaceable></option></arg>
+ <arg><option>-n <replaceable class="parameter">nametype</replaceable></option></arg>
+ <arg><option>-3</option></arg>
+ <arg><option>-A <replaceable class="parameter">date/offset</replaceable></option></arg>
+ <arg><option>-C</option></arg>
<arg><option>-c <replaceable class="parameter">class</replaceable></option></arg>
+ <arg><option>-D <replaceable class="parameter">date/offset</replaceable></option></arg>
+ <arg><option>-E <replaceable class="parameter">engine</replaceable></option></arg>
<arg><option>-e</option></arg>
<arg><option>-f <replaceable class="parameter">flag</replaceable></option></arg>
+ <arg><option>-G</option></arg>
<arg><option>-g <replaceable class="parameter">generator</replaceable></option></arg>
<arg><option>-h</option></arg>
+ <arg><option>-I <replaceable class="parameter">date/offset</replaceable></option></arg>
+ <arg><option>-i <replaceable class="parameter">interval</replaceable></option></arg>
+ <arg><option>-K <replaceable class="parameter">directory</replaceable></option></arg>
<arg><option>-k</option></arg>
+ <arg><option>-P <replaceable class="parameter">date/offset</replaceable></option></arg>
<arg><option>-p <replaceable class="parameter">protocol</replaceable></option></arg>
+ <arg><option>-q</option></arg>
+ <arg><option>-R <replaceable class="parameter">date/offset</replaceable></option></arg>
<arg><option>-r <replaceable class="parameter">randomdev</replaceable></option></arg>
+ <arg><option>-S <replaceable class="parameter">key</replaceable></option></arg>
<arg><option>-s <replaceable class="parameter">strength</replaceable></option></arg>
<arg><option>-t <replaceable class="parameter">type</replaceable></option></arg>
<arg><option>-v <replaceable class="parameter">level</replaceable></option></arg>
+ <arg><option>-z</option></arg>
<arg choice="req">name</arg>
</cmdsynopsis>
</refsynopsisdiv>
@@ -80,7 +94,8 @@
<para><command>dnssec-keygen</command>
generates keys for DNSSEC (Secure DNS), as defined in RFC 2535
and RFC 4034. It can also generate keys for use with
- TSIG (Transaction Signatures), as defined in RFC 2845.
+ TSIG (Transaction Signatures) as defined in RFC 2845, or TKEY
+ (Transaction Key) as defined in RFC 2930.
</para>
<para>
The <option>name</option> of the key is specified on the command
@@ -99,19 +114,27 @@
<para>
Selects the cryptographic algorithm. For DNSSEC keys, the value
of <option>algorithm</option> must be one of RSAMD5, RSASHA1,
- DSA, NSEC3RSASHA1, NSEC3DSA, RSASHA256 or RSASHA512.
- For TSIG/TKEY, the value must
+ DSA, NSEC3RSASHA1, NSEC3DSA, RSASHA256, RSASHA512 or ECCGOST.
+ For TSIG/TKEY, the value must
be DH (Diffie Hellman), HMAC-MD5, HMAC-SHA1, HMAC-SHA224,
HMAC-SHA256, HMAC-SHA384, or HMAC-SHA512. These values are
case insensitive.
</para>
<para>
+ If no algorithm is specified, then RSASHA1 will be used by
+ default, unless the <option>-3</option> option is specified,
+ in which case NSEC3RSASHA1 will be used instead. (If
+ <option>-3</option> is used and an algorithm is specified,
+ that algorithm will be checked for compatibility with NSEC3.)
+ </para>
+ <para>
Note 1: that for DNSSEC, RSASHA1 is a mandatory to implement
algorithm, and DSA is recommended. For TSIG, HMAC-MD5 is
mandatory.
</para>
<para>
- Note 2: HMAC-MD5 and DH automatically set the -k flag.
+ Note 2: DH, HMAC-MD5, and HMAC-SHA1 through HMAC-SHA512
+ automatically set the -T KEY option.
</para>
</listitem>
</varlistentry>
@@ -127,6 +150,15 @@
bits and an exact multiple of 64. HMAC keys must be
between 1 and 512 bits.
</para>
+ <para>
+ The key size does not need to be specified if using a default
+ algorithm. The default key size is 1024 bits for zone signing
+ keys (ZSK's) and 2048 bits for key signing keys (KSK's,
+ generated with <option>-f KSK</option>). However, if an
+ algorithm is explicitly specified with the <option>-a</option>,
+ then there is no default key size, and the <option>-b</option>
+ must be used.
+ </para>
</listitem>
</varlistentry>
@@ -146,6 +178,34 @@
</varlistentry>
<varlistentry>
+ <term>-3</term>
+ <listitem>
+ <para>
+ Use an NSEC3-capable algorithm to generate a DNSSEC key.
+ If this option is used and no algorithm is explicitly
+ set on the command line, NSEC3RSASHA1 will be used by
+ default. Note that RSASHA256, RSASHA512 and ECCGOST algorithms
+ are NSEC3-capable.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>-C</term>
+ <listitem>
+ <para>
+ Compatibility mode: generates an old-style key, without
+ any metadata. By default, <command>dnssec-keygen</command>
+ will include the key's creation date in the metadata stored
+ with the private key, and other dates may be set there as well
+ (publication date, activation date, etc). Keys that include
+ this data may be incompatible with older versions of BIND; the
+ <option>-C</option> option suppresses them.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
<term>-c <replaceable class="parameter">class</replaceable></term>
<listitem>
<para>
@@ -156,6 +216,18 @@
</varlistentry>
<varlistentry>
+ <term>-E <replaceable class="parameter">engine</replaceable></term>
+ <listitem>
+ <para>
+ Uses a crypto hardware (OpenSSL engine) for random number
+ and, when supported, key generation. When compiled with PKCS#11
+ support it defaults to pkcs11; the empty name resets it to
+ no engine.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
<term>-e</term>
<listitem>
<para>
@@ -169,7 +241,17 @@
<listitem>
<para>
Set the specified flag in the flag field of the KEY/DNSKEY record.
- The only recognized flag is KSK (Key Signing Key) DNSKEY.
+ The only recognized flags are KSK (Key Signing Key) and REVOKE.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>-G</term>
+ <listitem>
+ <para>
+ Generate a key, but do not publish it or sign with it. This
+ option is incompatible with -P and -A.
</para>
</listitem>
</varlistentry>
@@ -197,10 +279,19 @@
</varlistentry>
<varlistentry>
+ <term>-K <replaceable class="parameter">directory</replaceable></term>
+ <listitem>
+ <para>
+ Sets the directory in which the key files are to be written.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
<term>-k</term>
<listitem>
<para>
- Generate KEY records rather than DNSKEY records.
+ Deprecated in favor of -T KEY.
</para>
</listitem>
</varlistentry>
@@ -218,6 +309,25 @@
</varlistentry>
<varlistentry>
+ <term>-q</term>
+ <listitem>
+ <para>
+ Quiet mode: Suppresses unnecessary output, including
+ progress indication. Without this option, when
+ <command>dnssec-keygen</command> is run interactively
+ to generate an RSA or DSA key pair, it will print a string
+ of symbols to <filename>stderr</filename> indicating the
+ progress of the key generation. A '.' indicates that a
+ random number has been found which passed an initial
+ sieve test; '+' means a number has passed a single
+ round of the Miller-Rabin primality test; a space
+ means that the number has passed all the tests and is
+ a satisfactory key.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
<term>-r <replaceable class="parameter">randomdev</replaceable></term>
<listitem>
<para>
@@ -235,6 +345,21 @@
</varlistentry>
<varlistentry>
+ <term>-S <replaceable class="parameter">key</replaceable></term>
+ <listitem>
+ <para>
+ Create a new key which is an explicit successor to an
+ existing key. The name, algorithm, size, and type of the
+ key will be set to match the existing key. The activation
+ date of the new key will be set to the inactivation date of
+ the existing one. The publication date will be set to the
+ activation date minus the prepublication interval, which
+ defaults to 30 days.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
<term>-s <replaceable class="parameter">strength</replaceable></term>
<listitem>
<para>
@@ -246,6 +371,22 @@
</varlistentry>
<varlistentry>
+ <term>-T <replaceable class="parameter">rrtype</replaceable></term>
+ <listitem>
+ <para>
+ Specifies the resource record type to use for the key.
+ <option>rrtype</option> must be either DNSKEY or KEY. The
+ default is DNSKEY when using a DNSSEC algorithm, but it can be
+ overridden to KEY for use with SIG(0).
+ <para>
+ </para>
+ Using any TSIG algorithm (HMAC-* or DH) forces this option
+ to KEY.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
<term>-t <replaceable class="parameter">type</replaceable></term>
<listitem>
<para>
@@ -270,6 +411,109 @@
</refsect1>
<refsect1>
+ <title>TIMING OPTIONS</title>
+
+ <para>
+ Dates can be expressed in the format YYYYMMDD or YYYYMMDDHHMMSS.
+ If the argument begins with a '+' or '-', it is interpreted as
+ an offset from the present time. For convenience, if such an offset
+ is followed by one of the suffixes 'y', 'mo', 'w', 'd', 'h', or 'mi',
+ then the offset is computed in years (defined as 365 24-hour days,
+ ignoring leap years), months (defined as 30 24-hour days), weeks,
+ days, hours, or minutes, respectively. Without a suffix, the offset
+ is computed in seconds.
+ </para>
+
+ <variablelist>
+ <varlistentry>
+ <term>-P <replaceable class="parameter">date/offset</replaceable></term>
+ <listitem>
+ <para>
+ Sets the date on which a key is to be published to the zone.
+ After that date, the key will be included in the zone but will
+ not be used to sign it. If not set, and if the -G option has
+ not been used, the default is "now".
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>-A <replaceable class="parameter">date/offset</replaceable></term>
+ <listitem>
+ <para>
+ Sets the date on which the key is to be activated. After that
+ date, the key will be included in the zone and used to sign
+ it. If not set, and if the -G option has not been used, the
+ default is "now".
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>-R <replaceable class="parameter">date/offset</replaceable></term>
+ <listitem>
+ <para>
+ Sets the date on which the key is to be revoked. After that
+ date, the key will be flagged as revoked. It will be included
+ in the zone and will be used to sign it.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>-I <replaceable class="parameter">date/offset</replaceable></term>
+ <listitem>
+ <para>
+ Sets the date on which the key is to be retired. After that
+ date, the key will still be included in the zone, but it
+ will not be used to sign it.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>-D <replaceable class="parameter">date/offset</replaceable></term>
+ <listitem>
+ <para>
+ Sets the date on which the key is to be deleted. After that
+ date, the key will no longer be included in the zone. (It
+ may remain in the key repository, however.)
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>-i <replaceable class="parameter">interval</replaceable></term>
+ <listitem>
+ <para>
+ Sets the prepublication interval for a key. If set, then
+ the publication and activation dates must be separated by at least
+ this much time. If the activation date is specified but the
+ publication date isn't, then the publication date will default
+ to this much time before the activation date; conversely, if
+ the publication date is specified but activation date isn't,
+ then activation will be set to this much time after publication.
+ </para>
+ <para>
+ If the key is being created as an explicit successor to another
+ key, then the default prepublication interval is 30 days;
+ otherwise it is zero.
+ </para>
+ <para>
+ As with date offsets, if the argument is followed by one of
+ the suffixes 'y', 'mo', 'w', 'd', 'h', or 'mi', then the
+ interval is measured in years, months, weeks, days, hours,
+ or minutes, respectively. Without a suffix, the interval is
+ measured in seconds.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ </variablelist>
+ </refsect1>
+
+
+ <refsect1>
<title>GENERATED KEYS</title>
<para>
When <command>dnssec-keygen</command> completes
diff --git a/contrib/bind9/bin/dnssec/dnssec-keygen.html b/contrib/bind9/bin/dnssec/dnssec-keygen.html
index 7ca7d57..2f3a69b 100644
--- a/contrib/bind9/bin/dnssec/dnssec-keygen.html
+++ b/contrib/bind9/bin/dnssec/dnssec-keygen.html
@@ -14,7 +14,7 @@
- OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
- PERFORMANCE OF THIS SOFTWARE.
-->
-<!-- $Id: dnssec-keygen.html,v 1.32.44.4 2010-01-16 01:55:32 tbox Exp $ -->
+<!-- $Id: dnssec-keygen.html,v 1.47 2010-12-24 01:14:20 tbox Exp $ -->
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
@@ -29,14 +29,15 @@
</div>
<div class="refsynopsisdiv">
<h2>Synopsis</h2>
-<div class="cmdsynopsis"><p><code class="command">dnssec-keygen</code> {-a <em class="replaceable"><code>algorithm</code></em>} {-b <em class="replaceable"><code>keysize</code></em>} {-n <em class="replaceable"><code>nametype</code></em>} [<code class="option">-c <em class="replaceable"><code>class</code></em></code>] [<code class="option">-e</code>] [<code class="option">-f <em class="replaceable"><code>flag</code></em></code>] [<code class="option">-g <em class="replaceable"><code>generator</code></em></code>] [<code class="option">-h</code>] [<code class="option">-k</code>] [<code class="option">-p <em class="replaceable"><code>protocol</code></em></code>] [<code class="option">-r <em class="replaceable"><code>randomdev</code></em></code>] [<code class="option">-s <em class="replaceable"><code>strength</code></em></code>] [<code class="option">-t <em class="replaceable"><code>type</code></em></code>] [<code class="option">-v <em class="replaceable"><code>level</code></em></code>] {name}</p></div>
+<div class="cmdsynopsis"><p><code class="command">dnssec-keygen</code> [<code class="option">-a <em class="replaceable"><code>algorithm</code></em></code>] [<code class="option">-b <em class="replaceable"><code>keysize</code></em></code>] [<code class="option">-n <em class="replaceable"><code>nametype</code></em></code>] [<code class="option">-3</code>] [<code class="option">-A <em class="replaceable"><code>date/offset</code></em></code>] [<code class="option">-C</code>] [<code class="option">-c <em class="replaceable"><code>class</code></em></code>] [<code class="option">-D <em class="replaceable"><code>date/offset</code></em></code>] [<code class="option">-E <em class="replaceable"><code>engine</code></em></code>] [<code class="option">-e</code>] [<code class="option">-f <em class="replaceable"><code>flag</code></em></code>] [<code class="option">-G</code>] [<code class="option">-g <em class="replaceable"><code>generator</code></em></code>] [<code class="option">-h</code>] [<code class="option">-I <em class="replaceable"><code>date/offset</code></em></code>] [<code class="option">-i <em class="replaceable"><code>interval</code></em></code>] [<code class="option">-K <em class="replaceable"><code>directory</code></em></code>] [<code class="option">-k</code>] [<code class="option">-P <em class="replaceable"><code>date/offset</code></em></code>] [<code class="option">-p <em class="replaceable"><code>protocol</code></em></code>] [<code class="option">-q</code>] [<code class="option">-R <em class="replaceable"><code>date/offset</code></em></code>] [<code class="option">-r <em class="replaceable"><code>randomdev</code></em></code>] [<code class="option">-S <em class="replaceable"><code>key</code></em></code>] [<code class="option">-s <em class="replaceable"><code>strength</code></em></code>] [<code class="option">-t <em class="replaceable"><code>type</code></em></code>] [<code class="option">-v <em class="replaceable"><code>level</code></em></code>] [<code class="option">-z</code>] {name}</p></div>
</div>
<div class="refsect1" lang="en">
-<a name="id2543483"></a><h2>DESCRIPTION</h2>
+<a name="id2543578"></a><h2>DESCRIPTION</h2>
<p><span><strong class="command">dnssec-keygen</strong></span>
generates keys for DNSSEC (Secure DNS), as defined in RFC 2535
and RFC 4034. It can also generate keys for use with
- TSIG (Transaction Signatures), as defined in RFC 2845.
+ TSIG (Transaction Signatures) as defined in RFC 2845, or TKEY
+ (Transaction Key) as defined in RFC 2930.
</p>
<p>
The <code class="option">name</code> of the key is specified on the command
@@ -45,37 +46,56 @@
</p>
</div>
<div class="refsect1" lang="en">
-<a name="id2543501"></a><h2>OPTIONS</h2>
+<a name="id2543596"></a><h2>OPTIONS</h2>
<div class="variablelist"><dl>
<dt><span class="term">-a <em class="replaceable"><code>algorithm</code></em></span></dt>
<dd>
<p>
Selects the cryptographic algorithm. For DNSSEC keys, the value
of <code class="option">algorithm</code> must be one of RSAMD5, RSASHA1,
- DSA, NSEC3RSASHA1, NSEC3DSA, RSASHA256 or RSASHA512.
- For TSIG/TKEY, the value must
+ DSA, NSEC3RSASHA1, NSEC3DSA, RSASHA256, RSASHA512 or ECCGOST.
+ For TSIG/TKEY, the value must
be DH (Diffie Hellman), HMAC-MD5, HMAC-SHA1, HMAC-SHA224,
HMAC-SHA256, HMAC-SHA384, or HMAC-SHA512. These values are
case insensitive.
</p>
<p>
+ If no algorithm is specified, then RSASHA1 will be used by
+ default, unless the <code class="option">-3</code> option is specified,
+ in which case NSEC3RSASHA1 will be used instead. (If
+ <code class="option">-3</code> is used and an algorithm is specified,
+ that algorithm will be checked for compatibility with NSEC3.)
+ </p>
+<p>
Note 1: that for DNSSEC, RSASHA1 is a mandatory to implement
algorithm, and DSA is recommended. For TSIG, HMAC-MD5 is
mandatory.
</p>
<p>
- Note 2: HMAC-MD5 and DH automatically set the -k flag.
+ Note 2: DH, HMAC-MD5, and HMAC-SHA1 through HMAC-SHA512
+ automatically set the -T KEY option.
</p>
</dd>
<dt><span class="term">-b <em class="replaceable"><code>keysize</code></em></span></dt>
-<dd><p>
+<dd>
+<p>
Specifies the number of bits in the key. The choice of key
size depends on the algorithm used. RSA keys must be
between 512 and 2048 bits. Diffie Hellman keys must be between
128 and 4096 bits. DSA keys must be between 512 and 1024
bits and an exact multiple of 64. HMAC keys must be
between 1 and 512 bits.
- </p></dd>
+ </p>
+<p>
+ The key size does not need to be specified if using a default
+ algorithm. The default key size is 1024 bits for zone signing
+ keys (ZSK's) and 2048 bits for key signing keys (KSK's,
+ generated with <code class="option">-f KSK</code>). However, if an
+ algorithm is explicitly specified with the <code class="option">-a</code>,
+ then there is no default key size, and the <code class="option">-b</code>
+ must be used.
+ </p>
+</dd>
<dt><span class="term">-n <em class="replaceable"><code>nametype</code></em></span></dt>
<dd><p>
Specifies the owner type of the key. The value of
@@ -86,11 +106,36 @@
These values are case insensitive. Defaults to ZONE for DNSKEY
generation.
</p></dd>
+<dt><span class="term">-3</span></dt>
+<dd><p>
+ Use an NSEC3-capable algorithm to generate a DNSSEC key.
+ If this option is used and no algorithm is explicitly
+ set on the command line, NSEC3RSASHA1 will be used by
+ default. Note that RSASHA256, RSASHA512 and ECCGOST algorithms
+ are NSEC3-capable.
+ </p></dd>
+<dt><span class="term">-C</span></dt>
+<dd><p>
+ Compatibility mode: generates an old-style key, without
+ any metadata. By default, <span><strong class="command">dnssec-keygen</strong></span>
+ will include the key's creation date in the metadata stored
+ with the private key, and other dates may be set there as well
+ (publication date, activation date, etc). Keys that include
+ this data may be incompatible with older versions of BIND; the
+ <code class="option">-C</code> option suppresses them.
+ </p></dd>
<dt><span class="term">-c <em class="replaceable"><code>class</code></em></span></dt>
<dd><p>
Indicates that the DNS record containing the key should have
the specified class. If not specified, class IN is used.
</p></dd>
+<dt><span class="term">-E <em class="replaceable"><code>engine</code></em></span></dt>
+<dd><p>
+ Uses a crypto hardware (OpenSSL engine) for random number
+ and, when supported, key generation. When compiled with PKCS#11
+ support it defaults to pkcs11; the empty name resets it to
+ no engine.
+ </p></dd>
<dt><span class="term">-e</span></dt>
<dd><p>
If generating an RSAMD5/RSASHA1 key, use a large exponent.
@@ -98,7 +143,12 @@
<dt><span class="term">-f <em class="replaceable"><code>flag</code></em></span></dt>
<dd><p>
Set the specified flag in the flag field of the KEY/DNSKEY record.
- The only recognized flag is KSK (Key Signing Key) DNSKEY.
+ The only recognized flags are KSK (Key Signing Key) and REVOKE.
+ </p></dd>
+<dt><span class="term">-G</span></dt>
+<dd><p>
+ Generate a key, but do not publish it or sign with it. This
+ option is incompatible with -P and -A.
</p></dd>
<dt><span class="term">-g <em class="replaceable"><code>generator</code></em></span></dt>
<dd><p>
@@ -112,9 +162,13 @@
Prints a short summary of the options and arguments to
<span><strong class="command">dnssec-keygen</strong></span>.
</p></dd>
+<dt><span class="term">-K <em class="replaceable"><code>directory</code></em></span></dt>
+<dd><p>
+ Sets the directory in which the key files are to be written.
+ </p></dd>
<dt><span class="term">-k</span></dt>
<dd><p>
- Generate KEY records rather than DNSKEY records.
+ Deprecated in favor of -T KEY.
</p></dd>
<dt><span class="term">-p <em class="replaceable"><code>protocol</code></em></span></dt>
<dd><p>
@@ -123,6 +177,20 @@
Other possible values for this argument are listed in
RFC 2535 and its successors.
</p></dd>
+<dt><span class="term">-q</span></dt>
+<dd><p>
+ Quiet mode: Suppresses unnecessary output, including
+ progress indication. Without this option, when
+ <span><strong class="command">dnssec-keygen</strong></span> is run interactively
+ to generate an RSA or DSA key pair, it will print a string
+ of symbols to <code class="filename">stderr</code> indicating the
+ progress of the key generation. A '.' indicates that a
+ random number has been found which passed an initial
+ sieve test; '+' means a number has passed a single
+ round of the Miller-Rabin primality test; a space
+ means that the number has passed all the tests and is
+ a satisfactory key.
+ </p></dd>
<dt><span class="term">-r <em class="replaceable"><code>randomdev</code></em></span></dt>
<dd><p>
Specifies the source of randomness. If the operating
@@ -135,12 +203,37 @@
<code class="filename">keyboard</code> indicates that keyboard
input should be used.
</p></dd>
+<dt><span class="term">-S <em class="replaceable"><code>key</code></em></span></dt>
+<dd><p>
+ Create a new key which is an explicit successor to an
+ existing key. The name, algorithm, size, and type of the
+ key will be set to match the existing key. The activation
+ date of the new key will be set to the inactivation date of
+ the existing one. The publication date will be set to the
+ activation date minus the prepublication interval, which
+ defaults to 30 days.
+ </p></dd>
<dt><span class="term">-s <em class="replaceable"><code>strength</code></em></span></dt>
<dd><p>
Specifies the strength value of the key. The strength is
a number between 0 and 15, and currently has no defined
purpose in DNSSEC.
</p></dd>
+<dt><span class="term">-T <em class="replaceable"><code>rrtype</code></em></span></dt>
+<dd>
+<p>
+ Specifies the resource record type to use for the key.
+ <code class="option">rrtype</code> must be either DNSKEY or KEY. The
+ default is DNSKEY when using a DNSSEC algorithm, but it can be
+ overridden to KEY for use with SIG(0).
+ </p>
+<p>
+ </p>
+<p>
+ Using any TSIG algorithm (HMAC-* or DH) forces this option
+ to KEY.
+ </p>
+</dd>
<dt><span class="term">-t <em class="replaceable"><code>type</code></em></span></dt>
<dd><p>
Indicates the use of the key. <code class="option">type</code> must be
@@ -155,7 +248,78 @@
</dl></div>
</div>
<div class="refsect1" lang="en">
-<a name="id2543836"></a><h2>GENERATED KEYS</h2>
+<a name="id2544301"></a><h2>TIMING OPTIONS</h2>
+<p>
+ Dates can be expressed in the format YYYYMMDD or YYYYMMDDHHMMSS.
+ If the argument begins with a '+' or '-', it is interpreted as
+ an offset from the present time. For convenience, if such an offset
+ is followed by one of the suffixes 'y', 'mo', 'w', 'd', 'h', or 'mi',
+ then the offset is computed in years (defined as 365 24-hour days,
+ ignoring leap years), months (defined as 30 24-hour days), weeks,
+ days, hours, or minutes, respectively. Without a suffix, the offset
+ is computed in seconds.
+ </p>
+<div class="variablelist"><dl>
+<dt><span class="term">-P <em class="replaceable"><code>date/offset</code></em></span></dt>
+<dd><p>
+ Sets the date on which a key is to be published to the zone.
+ After that date, the key will be included in the zone but will
+ not be used to sign it. If not set, and if the -G option has
+ not been used, the default is "now".
+ </p></dd>
+<dt><span class="term">-A <em class="replaceable"><code>date/offset</code></em></span></dt>
+<dd><p>
+ Sets the date on which the key is to be activated. After that
+ date, the key will be included in the zone and used to sign
+ it. If not set, and if the -G option has not been used, the
+ default is "now".
+ </p></dd>
+<dt><span class="term">-R <em class="replaceable"><code>date/offset</code></em></span></dt>
+<dd><p>
+ Sets the date on which the key is to be revoked. After that
+ date, the key will be flagged as revoked. It will be included
+ in the zone and will be used to sign it.
+ </p></dd>
+<dt><span class="term">-I <em class="replaceable"><code>date/offset</code></em></span></dt>
+<dd><p>
+ Sets the date on which the key is to be retired. After that
+ date, the key will still be included in the zone, but it
+ will not be used to sign it.
+ </p></dd>
+<dt><span class="term">-D <em class="replaceable"><code>date/offset</code></em></span></dt>
+<dd><p>
+ Sets the date on which the key is to be deleted. After that
+ date, the key will no longer be included in the zone. (It
+ may remain in the key repository, however.)
+ </p></dd>
+<dt><span class="term">-i <em class="replaceable"><code>interval</code></em></span></dt>
+<dd>
+<p>
+ Sets the prepublication interval for a key. If set, then
+ the publication and activation dates must be separated by at least
+ this much time. If the activation date is specified but the
+ publication date isn't, then the publication date will default
+ to this much time before the activation date; conversely, if
+ the publication date is specified but activation date isn't,
+ then activation will be set to this much time after publication.
+ </p>
+<p>
+ If the key is being created as an explicit successor to another
+ key, then the default prepublication interval is 30 days;
+ otherwise it is zero.
+ </p>
+<p>
+ As with date offsets, if the argument is followed by one of
+ the suffixes 'y', 'mo', 'w', 'd', 'h', or 'mi', then the
+ interval is measured in years, months, weeks, days, hours,
+ or minutes, respectively. Without a suffix, the interval is
+ measured in seconds.
+ </p>
+</dd>
+</dl></div>
+</div>
+<div class="refsect1" lang="en">
+<a name="id2544491"></a><h2>GENERATED KEYS</h2>
<p>
When <span><strong class="command">dnssec-keygen</strong></span> completes
successfully,
@@ -201,7 +365,7 @@
</p>
</div>
<div class="refsect1" lang="en">
-<a name="id2543918"></a><h2>EXAMPLE</h2>
+<a name="id2544642"></a><h2>EXAMPLE</h2>
<p>
To generate a 768-bit DSA key for the domain
<strong class="userinput"><code>example.com</code></strong>, the following command would be
@@ -222,7 +386,7 @@
</p>
</div>
<div class="refsect1" lang="en">
-<a name="id2544030"></a><h2>SEE ALSO</h2>
+<a name="id2544685"></a><h2>SEE ALSO</h2>
<p><span class="citerefentry"><span class="refentrytitle">dnssec-signzone</span>(8)</span>,
<em class="citetitle">BIND 9 Administrator Reference Manual</em>,
<em class="citetitle">RFC 2539</em>,
@@ -231,7 +395,7 @@
</p>
</div>
<div class="refsect1" lang="en">
-<a name="id2544061"></a><h2>AUTHOR</h2>
+<a name="id2544716"></a><h2>AUTHOR</h2>
<p><span class="corpauthor">Internet Systems Consortium</span>
</p>
</div>
diff --git a/contrib/bind9/bin/dnssec/dnssec-revoke.8 b/contrib/bind9/bin/dnssec/dnssec-revoke.8
new file mode 100644
index 0000000..d57b6aa
--- /dev/null
+++ b/contrib/bind9/bin/dnssec/dnssec-revoke.8
@@ -0,0 +1,83 @@
+.\" Copyright (C) 2009 Internet Systems Consortium, Inc. ("ISC")
+.\"
+.\" Permission to use, copy, modify, and/or 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 ISC DISCLAIMS ALL WARRANTIES WITH
+.\" REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+.\" AND FITNESS. IN NO EVENT SHALL ISC 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.
+.\"
+.\" $Id: dnssec-revoke.8,v 1.9 2010-05-19 01:14:14 tbox Exp $
+.\"
+.hy 0
+.ad l
+.\" Title: dnssec\-revoke
+.\" Author:
+.\" Generator: DocBook XSL Stylesheets v1.71.1 <http://docbook.sf.net/>
+.\" Date: June 1, 2009
+.\" Manual: BIND9
+.\" Source: BIND9
+.\"
+.TH "DNSSEC\-REVOKE" "8" "June 1, 2009" "BIND9" "BIND9"
+.\" disable hyphenation
+.nh
+.\" disable justification (adjust text to left margin only)
+.ad l
+.SH "NAME"
+dnssec\-revoke \- Set the REVOKED bit on a DNSSEC key
+.SH "SYNOPSIS"
+.HP 14
+\fBdnssec\-revoke\fR [\fB\-hr\fR] [\fB\-v\ \fR\fB\fIlevel\fR\fR] [\fB\-K\ \fR\fB\fIdirectory\fR\fR] [\fB\-E\ \fR\fB\fIengine\fR\fR] [\fB\-f\fR] {keyfile}
+.SH "DESCRIPTION"
+.PP
+\fBdnssec\-revoke\fR
+reads a DNSSEC key file, sets the REVOKED bit on the key as defined in RFC 5011, and creates a new pair of key files containing the now\-revoked key.
+.SH "OPTIONS"
+.PP
+\-h
+.RS 4
+Emit usage message and exit.
+.RE
+.PP
+\-K \fIdirectory\fR
+.RS 4
+Sets the directory in which the key files are to reside.
+.RE
+.PP
+\-r
+.RS 4
+After writing the new keyset files remove the original keyset files.
+.RE
+.PP
+\-v \fIlevel\fR
+.RS 4
+Sets the debugging level.
+.RE
+.PP
+\-E \fIengine\fR
+.RS 4
+Use the given OpenSSL engine. When compiled with PKCS#11 support it defaults to pkcs11; the empty name resets it to no engine.
+.RE
+.PP
+\-f
+.RS 4
+Force overwrite: Causes
+\fBdnssec\-revoke\fR
+to write the new key pair even if a file already exists matching the algorithm and key ID of the revoked key.
+.RE
+.SH "SEE ALSO"
+.PP
+\fBdnssec\-keygen\fR(8),
+BIND 9 Administrator Reference Manual,
+RFC 5011.
+.SH "AUTHOR"
+.PP
+Internet Systems Consortium
+.SH "COPYRIGHT"
+Copyright \(co 2009 Internet Systems Consortium, Inc. ("ISC")
+.br
diff --git a/contrib/bind9/bin/dnssec/dnssec-revoke.c b/contrib/bind9/bin/dnssec/dnssec-revoke.c
new file mode 100644
index 0000000..90e905c
--- /dev/null
+++ b/contrib/bind9/bin/dnssec/dnssec-revoke.c
@@ -0,0 +1,269 @@
+/*
+ * Copyright (C) 2009, 2010 Internet Systems Consortium, Inc. ("ISC")
+ *
+ * Permission to use, copy, modify, and/or 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 ISC DISCLAIMS ALL WARRANTIES WITH
+ * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+ * AND FITNESS. IN NO EVENT SHALL ISC 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.
+ */
+
+/* $Id: dnssec-revoke.c,v 1.22 2010-05-06 23:50:56 tbox Exp $ */
+
+/*! \file */
+
+#include <config.h>
+
+#include <libgen.h>
+#include <stdlib.h>
+#include <unistd.h>
+
+#include <isc/buffer.h>
+#include <isc/commandline.h>
+#include <isc/entropy.h>
+#include <isc/file.h>
+#include <isc/hash.h>
+#include <isc/mem.h>
+#include <isc/print.h>
+#include <isc/string.h>
+#include <isc/util.h>
+
+#include <dns/keyvalues.h>
+#include <dns/result.h>
+
+#include <dst/dst.h>
+
+#include "dnssectool.h"
+
+const char *program = "dnssec-revoke";
+int verbose;
+
+static isc_mem_t *mctx = NULL;
+
+ISC_PLATFORM_NORETURN_PRE static void
+usage(void) ISC_PLATFORM_NORETURN_POST;
+
+static void
+usage(void) {
+ fprintf(stderr, "Usage:\n");
+ fprintf(stderr, " %s [options] keyfile\n\n", program);
+ fprintf(stderr, "Version: %s\n", VERSION);
+#ifdef USE_PKCS11
+ fprintf(stderr, " -E engine: specify OpenSSL engine "
+ "(default \"pkcs11\")\n");
+#else
+ fprintf(stderr, " -E engine: specify OpenSSL engine\n");
+#endif
+ fprintf(stderr, " -f: force overwrite\n");
+ fprintf(stderr, " -K directory: use directory for key files\n");
+ fprintf(stderr, " -h: help\n");
+ fprintf(stderr, " -r: remove old keyfiles after "
+ "creating revoked version\n");
+ fprintf(stderr, " -v level: set level of verbosity\n");
+ fprintf(stderr, "Output:\n");
+ fprintf(stderr, " K<name>+<alg>+<new id>.key, "
+ "K<name>+<alg>+<new id>.private\n");
+
+ exit (-1);
+}
+
+int
+main(int argc, char **argv) {
+ isc_result_t result;
+#ifdef USE_PKCS11
+ const char *engine = "pkcs11";
+#else
+ const char *engine = NULL;
+#endif
+ char *filename = NULL, *dir = NULL;
+ char newname[1024], oldname[1024];
+ char keystr[DST_KEY_FORMATSIZE];
+ char *endp;
+ int ch;
+ isc_entropy_t *ectx = NULL;
+ dst_key_t *key = NULL;
+ isc_uint32_t flags;
+ isc_buffer_t buf;
+ isc_boolean_t force = ISC_FALSE;
+ isc_boolean_t remove = ISC_FALSE;
+
+ if (argc == 1)
+ usage();
+
+ result = isc_mem_create(0, 0, &mctx);
+ if (result != ISC_R_SUCCESS)
+ fatal("Out of memory");
+
+ dns_result_register();
+
+ isc_commandline_errprint = ISC_FALSE;
+
+ while ((ch = isc_commandline_parse(argc, argv, "E:fK:rhv:")) != -1) {
+ switch (ch) {
+ case 'E':
+ engine = isc_commandline_argument;
+ break;
+ case 'f':
+ force = ISC_TRUE;
+ break;
+ case 'K':
+ /*
+ * We don't have to copy it here, but do it to
+ * simplify cleanup later
+ */
+ dir = isc_mem_strdup(mctx, isc_commandline_argument);
+ if (dir == NULL) {
+ fatal("Failed to allocate memory for "
+ "directory");
+ }
+ break;
+ case 'r':
+ remove = ISC_TRUE;
+ break;
+ case 'v':
+ verbose = strtol(isc_commandline_argument, &endp, 0);
+ if (*endp != '\0')
+ fatal("-v must be followed by a number");
+ break;
+ case '?':
+ if (isc_commandline_option != '?')
+ fprintf(stderr, "%s: invalid argument -%c\n",
+ program, isc_commandline_option);
+ /* Falls into */
+ case 'h':
+ usage();
+
+ default:
+ fprintf(stderr, "%s: unhandled option -%c\n",
+ program, isc_commandline_option);
+ exit(1);
+ }
+ }
+
+ if (argc < isc_commandline_index + 1 ||
+ argv[isc_commandline_index] == NULL)
+ fatal("The key file name was not specified");
+ if (argc > isc_commandline_index + 1)
+ fatal("Extraneous arguments");
+
+ if (dir != NULL) {
+ filename = argv[isc_commandline_index];
+ } else {
+ result = isc_file_splitpath(mctx, argv[isc_commandline_index],
+ &dir, &filename);
+ if (result != ISC_R_SUCCESS)
+ fatal("cannot process filename %s: %s",
+ argv[isc_commandline_index],
+ isc_result_totext(result));
+ if (strcmp(dir, ".") == 0) {
+ isc_mem_free(mctx, dir);
+ dir = NULL;
+ }
+ }
+
+ if (ectx == NULL)
+ setup_entropy(mctx, NULL, &ectx);
+ result = isc_hash_create(mctx, ectx, DNS_NAME_MAXWIRE);
+ if (result != ISC_R_SUCCESS)
+ fatal("Could not initialize hash");
+ result = dst_lib_init2(mctx, ectx, engine,
+ ISC_ENTROPY_BLOCKING | ISC_ENTROPY_GOODONLY);
+ if (result != ISC_R_SUCCESS)
+ fatal("Could not initialize dst: %s",
+ isc_result_totext(result));
+ isc_entropy_stopcallbacksources(ectx);
+
+ result = dst_key_fromnamedfile(filename, dir,
+ DST_TYPE_PUBLIC|DST_TYPE_PRIVATE,
+ mctx, &key);
+ if (result != ISC_R_SUCCESS)
+ fatal("Invalid keyfile name %s: %s",
+ filename, isc_result_totext(result));
+
+ dst_key_format(key, keystr, sizeof(keystr));
+
+ if (verbose > 2)
+ fprintf(stderr, "%s: %s\n", program, keystr);
+
+ if (force)
+ set_keyversion(key);
+ else
+ check_keyversion(key, keystr);
+
+
+ flags = dst_key_flags(key);
+ if ((flags & DNS_KEYFLAG_REVOKE) == 0) {
+ isc_stdtime_t now;
+
+ if ((flags & DNS_KEYFLAG_KSK) == 0)
+ fprintf(stderr, "%s: warning: Key is not flagged "
+ "as a KSK. Revoking a ZSK is "
+ "legal, but undefined.\n",
+ program);
+
+ isc_stdtime_get(&now);
+ dst_key_settime(key, DST_TIME_REVOKE, now);
+
+ dst_key_setflags(key, flags | DNS_KEYFLAG_REVOKE);
+
+ isc_buffer_init(&buf, newname, sizeof(newname));
+ dst_key_buildfilename(key, DST_TYPE_PUBLIC, dir, &buf);
+
+ if (access(newname, F_OK) == 0 && !force) {
+ fatal("Key file %s already exists; "
+ "use -f to force overwrite", newname);
+ }
+
+ result = dst_key_tofile(key, DST_TYPE_PUBLIC|DST_TYPE_PRIVATE,
+ dir);
+ if (result != ISC_R_SUCCESS) {
+ dst_key_format(key, keystr, sizeof(keystr));
+ fatal("Failed to write key %s: %s", keystr,
+ isc_result_totext(result));
+ }
+
+ isc_buffer_clear(&buf);
+ dst_key_buildfilename(key, 0, dir, &buf);
+ printf("%s\n", newname);
+
+ /*
+ * Remove old key file, if told to (and if
+ * it isn't the same as the new file)
+ */
+ if (remove && dst_key_alg(key) != DST_ALG_RSAMD5) {
+ isc_buffer_init(&buf, oldname, sizeof(oldname));
+ dst_key_setflags(key, flags & ~DNS_KEYFLAG_REVOKE);
+ dst_key_buildfilename(key, DST_TYPE_PRIVATE, dir, &buf);
+ if (strcmp(oldname, newname) == 0)
+ goto cleanup;
+ if (access(oldname, F_OK) == 0)
+ unlink(oldname);
+ isc_buffer_clear(&buf);
+ dst_key_buildfilename(key, DST_TYPE_PUBLIC, dir, &buf);
+ if (access(oldname, F_OK) == 0)
+ unlink(oldname);
+ }
+ } else {
+ dst_key_format(key, keystr, sizeof(keystr));
+ fatal("Key %s is already revoked", keystr);
+ }
+
+cleanup:
+ dst_key_free(&key);
+ dst_lib_destroy();
+ isc_hash_destroy();
+ cleanup_entropy(&ectx);
+ if (verbose > 10)
+ isc_mem_stats(mctx, stdout);
+ if (dir != NULL)
+ isc_mem_free(mctx, dir);
+ isc_mem_destroy(&mctx);
+
+ return (0);
+}
diff --git a/contrib/bind9/bin/dnssec/dnssec-revoke.docbook b/contrib/bind9/bin/dnssec/dnssec-revoke.docbook
new file mode 100644
index 0000000..b7b5620
--- /dev/null
+++ b/contrib/bind9/bin/dnssec/dnssec-revoke.docbook
@@ -0,0 +1,149 @@
+<!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN"
+ "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd"
+ [<!ENTITY mdash "&#8212;">]>
+<!--
+ - Copyright (C) 2009 Internet Systems Consortium, Inc. ("ISC")
+ -
+ - Permission to use, copy, modify, and/or 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 ISC DISCLAIMS ALL WARRANTIES WITH
+ - REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+ - AND FITNESS. IN NO EVENT SHALL ISC 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.
+-->
+
+<!-- $Id: dnssec-revoke.docbook,v 1.7 2009-11-03 21:44:46 each Exp $ -->
+<refentry id="man.dnssec-revoke">
+ <refentryinfo>
+ <date>June 1, 2009</date>
+ </refentryinfo>
+
+ <refmeta>
+ <refentrytitle><application>dnssec-revoke</application></refentrytitle>
+ <manvolnum>8</manvolnum>
+ <refmiscinfo>BIND9</refmiscinfo>
+ </refmeta>
+
+ <refnamediv>
+ <refname><application>dnssec-revoke</application></refname>
+ <refpurpose>Set the REVOKED bit on a DNSSEC key</refpurpose>
+ </refnamediv>
+
+ <docinfo>
+ <copyright>
+ <year>2009</year>
+ <holder>Internet Systems Consortium, Inc. ("ISC")</holder>
+ </copyright>
+ </docinfo>
+
+ <refsynopsisdiv>
+ <cmdsynopsis>
+ <command>dnssec-revoke</command>
+ <arg><option>-hr</option></arg>
+ <arg><option>-v <replaceable class="parameter">level</replaceable></option></arg>
+ <arg><option>-K <replaceable class="parameter">directory</replaceable></option></arg>
+ <arg><option>-E <replaceable class="parameter">engine</replaceable></option></arg>
+ <arg><option>-f</option></arg>
+ <arg choice="req">keyfile</arg>
+ </cmdsynopsis>
+ </refsynopsisdiv>
+
+ <refsect1>
+ <title>DESCRIPTION</title>
+ <para><command>dnssec-revoke</command>
+ reads a DNSSEC key file, sets the REVOKED bit on the key as defined
+ in RFC 5011, and creates a new pair of key files containing the
+ now-revoked key.
+ </para>
+ </refsect1>
+
+ <refsect1>
+ <title>OPTIONS</title>
+
+ <variablelist>
+ <varlistentry>
+ <term>-h</term>
+ <listitem>
+ <para>
+ Emit usage message and exit.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>-K <replaceable class="parameter">directory</replaceable></term>
+ <listitem>
+ <para>
+ Sets the directory in which the key files are to reside.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>-r</term>
+ <listitem>
+ <para>
+ After writing the new keyset files remove the original keyset
+ files.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>-v <replaceable class="parameter">level</replaceable></term>
+ <listitem>
+ <para>
+ Sets the debugging level.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>-E <replaceable class="parameter">engine</replaceable></term>
+ <listitem>
+ <para>
+ Use the given OpenSSL engine. When compiled with PKCS#11 support
+ it defaults to pkcs11; the empty name resets it to no engine.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>-f</term>
+ <listitem>
+ <para>
+ Force overwrite: Causes <command>dnssec-revoke</command> to
+ write the new key pair even if a file already exists matching
+ the algorithm and key ID of the revoked key.
+ </para>
+ </listitem>
+ </varlistentry>
+ </variablelist>
+ </refsect1>
+
+ <refsect1>
+ <title>SEE ALSO</title>
+ <para><citerefentry>
+ <refentrytitle>dnssec-keygen</refentrytitle><manvolnum>8</manvolnum>
+ </citerefentry>,
+ <citetitle>BIND 9 Administrator Reference Manual</citetitle>,
+ <citetitle>RFC 5011</citetitle>.
+ </para>
+ </refsect1>
+
+ <refsect1>
+ <title>AUTHOR</title>
+ <para><corpauthor>Internet Systems Consortium</corpauthor>
+ </para>
+ </refsect1>
+
+</refentry><!--
+ - Local variables:
+ - mode: sgml
+ - End:
+-->
diff --git a/contrib/bind9/bin/dnssec/dnssec-revoke.html b/contrib/bind9/bin/dnssec/dnssec-revoke.html
new file mode 100644
index 0000000..fad9ac5
--- /dev/null
+++ b/contrib/bind9/bin/dnssec/dnssec-revoke.html
@@ -0,0 +1,87 @@
+<!--
+ - Copyright (C) 2009 Internet Systems Consortium, Inc. ("ISC")
+ -
+ - Permission to use, copy, modify, and/or 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 ISC DISCLAIMS ALL WARRANTIES WITH
+ - REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+ - AND FITNESS. IN NO EVENT SHALL ISC 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.
+-->
+<!-- $Id: dnssec-revoke.html,v 1.9 2010-05-19 01:14:14 tbox Exp $ -->
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
+<title>dnssec-revoke</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.71.1">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"><div class="refentry" lang="en">
+<a name="man.dnssec-revoke"></a><div class="titlepage"></div>
+<div class="refnamediv">
+<h2>Name</h2>
+<p><span class="application">dnssec-revoke</span> &#8212; Set the REVOKED bit on a DNSSEC key</p>
+</div>
+<div class="refsynopsisdiv">
+<h2>Synopsis</h2>
+<div class="cmdsynopsis"><p><code class="command">dnssec-revoke</code> [<code class="option">-hr</code>] [<code class="option">-v <em class="replaceable"><code>level</code></em></code>] [<code class="option">-K <em class="replaceable"><code>directory</code></em></code>] [<code class="option">-E <em class="replaceable"><code>engine</code></em></code>] [<code class="option">-f</code>] {keyfile}</p></div>
+</div>
+<div class="refsect1" lang="en">
+<a name="id2543373"></a><h2>DESCRIPTION</h2>
+<p><span><strong class="command">dnssec-revoke</strong></span>
+ reads a DNSSEC key file, sets the REVOKED bit on the key as defined
+ in RFC 5011, and creates a new pair of key files containing the
+ now-revoked key.
+ </p>
+</div>
+<div class="refsect1" lang="en">
+<a name="id2543385"></a><h2>OPTIONS</h2>
+<div class="variablelist"><dl>
+<dt><span class="term">-h</span></dt>
+<dd><p>
+ Emit usage message and exit.
+ </p></dd>
+<dt><span class="term">-K <em class="replaceable"><code>directory</code></em></span></dt>
+<dd><p>
+ Sets the directory in which the key files are to reside.
+ </p></dd>
+<dt><span class="term">-r</span></dt>
+<dd><p>
+ After writing the new keyset files remove the original keyset
+ files.
+ </p></dd>
+<dt><span class="term">-v <em class="replaceable"><code>level</code></em></span></dt>
+<dd><p>
+ Sets the debugging level.
+ </p></dd>
+<dt><span class="term">-E <em class="replaceable"><code>engine</code></em></span></dt>
+<dd><p>
+ Use the given OpenSSL engine. When compiled with PKCS#11 support
+ it defaults to pkcs11; the empty name resets it to no engine.
+ </p></dd>
+<dt><span class="term">-f</span></dt>
+<dd><p>
+ Force overwrite: Causes <span><strong class="command">dnssec-revoke</strong></span> to
+ write the new key pair even if a file already exists matching
+ the algorithm and key ID of the revoked key.
+ </p></dd>
+</dl></div>
+</div>
+<div class="refsect1" lang="en">
+<a name="id2543491"></a><h2>SEE ALSO</h2>
+<p><span class="citerefentry"><span class="refentrytitle">dnssec-keygen</span>(8)</span>,
+ <em class="citetitle">BIND 9 Administrator Reference Manual</em>,
+ <em class="citetitle">RFC 5011</em>.
+ </p>
+</div>
+<div class="refsect1" lang="en">
+<a name="id2543515"></a><h2>AUTHOR</h2>
+<p><span class="corpauthor">Internet Systems Consortium</span>
+ </p>
+</div>
+</div></body>
+</html>
diff --git a/contrib/bind9/bin/dnssec/dnssec-settime.8 b/contrib/bind9/bin/dnssec/dnssec-settime.8
new file mode 100644
index 0000000..4390494
--- /dev/null
+++ b/contrib/bind9/bin/dnssec/dnssec-settime.8
@@ -0,0 +1,166 @@
+.\" Copyright (C) 2009, 2010 Internet Systems Consortium, Inc. ("ISC")
+.\"
+.\" Permission to use, copy, modify, and/or 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 ISC DISCLAIMS ALL WARRANTIES WITH
+.\" REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+.\" AND FITNESS. IN NO EVENT SHALL ISC 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.
+.\"
+.\" $Id: dnssec-settime.8,v 1.14 2010-08-17 01:15:26 tbox Exp $
+.\"
+.hy 0
+.ad l
+.\" Title: dnssec\-settime
+.\" Author:
+.\" Generator: DocBook XSL Stylesheets v1.71.1 <http://docbook.sf.net/>
+.\" Date: July 15, 2009
+.\" Manual: BIND9
+.\" Source: BIND9
+.\"
+.TH "DNSSEC\-SETTIME" "8" "July 15, 2009" "BIND9" "BIND9"
+.\" disable hyphenation
+.nh
+.\" disable justification (adjust text to left margin only)
+.ad l
+.SH "NAME"
+dnssec\-settime \- Set the key timing metadata for a DNSSEC key
+.SH "SYNOPSIS"
+.HP 15
+\fBdnssec\-settime\fR [\fB\-f\fR] [\fB\-K\ \fR\fB\fIdirectory\fR\fR] [\fB\-P\ \fR\fB\fIdate/offset\fR\fR] [\fB\-A\ \fR\fB\fIdate/offset\fR\fR] [\fB\-R\ \fR\fB\fIdate/offset\fR\fR] [\fB\-I\ \fR\fB\fIdate/offset\fR\fR] [\fB\-D\ \fR\fB\fIdate/offset\fR\fR] [\fB\-h\fR] [\fB\-v\ \fR\fB\fIlevel\fR\fR] [\fB\-E\ \fR\fB\fIengine\fR\fR] {keyfile}
+.SH "DESCRIPTION"
+.PP
+\fBdnssec\-settime\fR
+reads a DNSSEC private key file and sets the key timing metadata as specified by the
+\fB\-P\fR,
+\fB\-A\fR,
+\fB\-R\fR,
+\fB\-I\fR, and
+\fB\-D\fR
+options. The metadata can then be used by
+\fBdnssec\-signzone\fR
+or other signing software to determine when a key is to be published, whether it should be used for signing a zone, etc.
+.PP
+If none of these options is set on the command line, then
+\fBdnssec\-settime\fR
+simply prints the key timing metadata already stored in the key.
+.PP
+When key metadata fields are changed, both files of a key pair (\fIKnnnn.+aaa+iiiii.key\fR
+and
+\fIKnnnn.+aaa+iiiii.private\fR) are regenerated. Metadata fields are stored in the private file. A human\-readable description of the metadata is also placed in comments in the key file.
+.SH "OPTIONS"
+.PP
+\-f
+.RS 4
+Force an update of an old\-format key with no metadata fields. Without this option,
+\fBdnssec\-settime\fR
+will fail when attempting to update a legacy key. With this option, the key will be recreated in the new format, but with the original key data retained. The key's creation date will be set to the present time.
+.RE
+.PP
+\-K \fIdirectory\fR
+.RS 4
+Sets the directory in which the key files are to reside.
+.RE
+.PP
+\-h
+.RS 4
+Emit usage message and exit.
+.RE
+.PP
+\-v \fIlevel\fR
+.RS 4
+Sets the debugging level.
+.RE
+.PP
+\-E \fIengine\fR
+.RS 4
+Use the given OpenSSL engine. When compiled with PKCS#11 support it defaults to pkcs11; the empty name resets it to no engine.
+.RE
+.SH "TIMING OPTIONS"
+.PP
+Dates can be expressed in the format YYYYMMDD or YYYYMMDDHHMMSS. If the argument begins with a '+' or '\-', it is interpreted as an offset from the present time. For convenience, if such an offset is followed by one of the suffixes 'y', 'mo', 'w', 'd', 'h', or 'mi', then the offset is computed in years (defined as 365 24\-hour days, ignoring leap years), months (defined as 30 24\-hour days), weeks, days, hours, or minutes, respectively. Without a suffix, the offset is computed in seconds. To unset a date, use 'none'.
+.PP
+\-P \fIdate/offset\fR
+.RS 4
+Sets the date on which a key is to be published to the zone. After that date, the key will be included in the zone but will not be used to sign it.
+.RE
+.PP
+\-A \fIdate/offset\fR
+.RS 4
+Sets the date on which the key is to be activated. After that date, the key will be included in the zone and used to sign it.
+.RE
+.PP
+\-R \fIdate/offset\fR
+.RS 4
+Sets the date on which the key is to be revoked. After that date, the key will be flagged as revoked. It will be included in the zone and will be used to sign it.
+.RE
+.PP
+\-I \fIdate/offset\fR
+.RS 4
+Sets the date on which the key is to be retired. After that date, the key will still be included in the zone, but it will not be used to sign it.
+.RE
+.PP
+\-D \fIdate/offset\fR
+.RS 4
+Sets the date on which the key is to be deleted. After that date, the key will no longer be included in the zone. (It may remain in the key repository, however.)
+.RE
+.PP
+\-S \fIpredecessor key\fR
+.RS 4
+Select a key for which the key being modified will be an explicit successor. The name, algorithm, size, and type of the predecessor key must exactly match those of the key being modified. The activation date of the successor key will be set to the inactivation date of the predecessor. The publication date will be set to the activation date minus the prepublication interval, which defaults to 30 days.
+.RE
+.PP
+\-i \fIinterval\fR
+.RS 4
+Sets the prepublication interval for a key. If set, then the publication and activation dates must be separated by at least this much time. If the activation date is specified but the publication date isn't, then the publication date will default to this much time before the activation date; conversely, if the publication date is specified but activation date isn't, then activation will be set to this much time after publication.
+.sp
+If the key is being set to be an explicit successor to another key, then the default prepublication interval is 30 days; otherwise it is zero.
+.sp
+As with date offsets, if the argument is followed by one of the suffixes 'y', 'mo', 'w', 'd', 'h', or 'mi', then the interval is measured in years, months, weeks, days, hours, or minutes, respectively. Without a suffix, the interval is measured in seconds.
+.RE
+.SH "PRINTING OPTIONS"
+.PP
+\fBdnssec\-settime\fR
+can also be used to print the timing metadata associated with a key.
+.PP
+\-u
+.RS 4
+Print times in UNIX epoch format.
+.RE
+.PP
+\-p \fIC/P/A/R/I/D/all\fR
+.RS 4
+Print a specific metadata value or set of metadata values. The
+\fB\-p\fR
+option may be followed by one or more of the following letters to indicate which value or values to print:
+\fBC\fR
+for the creation date,
+\fBP\fR
+for the publication date,
+\fBA\fR
+for the activation date,
+\fBR\fR
+for the revocation date,
+\fBI\fR
+for the inactivation date, or
+\fBD\fR
+for the deletion date. To print all of the metadata, use
+\fB\-p all\fR.
+.RE
+.SH "SEE ALSO"
+.PP
+\fBdnssec\-keygen\fR(8),
+\fBdnssec\-signzone\fR(8),
+BIND 9 Administrator Reference Manual,
+RFC 5011.
+.SH "AUTHOR"
+.PP
+Internet Systems Consortium
+.SH "COPYRIGHT"
+Copyright \(co 2009, 2010 Internet Systems Consortium, Inc. ("ISC")
+.br
diff --git a/contrib/bind9/bin/dnssec/dnssec-settime.c b/contrib/bind9/bin/dnssec/dnssec-settime.c
new file mode 100644
index 0000000..364e2ab
--- /dev/null
+++ b/contrib/bind9/bin/dnssec/dnssec-settime.c
@@ -0,0 +1,576 @@
+/*
+ * Copyright (C) 2009, 2010 Internet Systems Consortium, Inc. ("ISC")
+ *
+ * Permission to use, copy, modify, and/or 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 ISC DISCLAIMS ALL WARRANTIES WITH
+ * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+ * AND FITNESS. IN NO EVENT SHALL ISC 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.
+ */
+
+/* $Id: dnssec-settime.c,v 1.28 2010-12-19 07:29:36 each Exp $ */
+
+/*! \file */
+
+#include <config.h>
+
+#include <libgen.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <errno.h>
+#include <time.h>
+
+#include <isc/buffer.h>
+#include <isc/commandline.h>
+#include <isc/entropy.h>
+#include <isc/file.h>
+#include <isc/hash.h>
+#include <isc/mem.h>
+#include <isc/print.h>
+#include <isc/string.h>
+#include <isc/util.h>
+
+#include <dns/keyvalues.h>
+#include <dns/result.h>
+
+#include <dst/dst.h>
+
+#include "dnssectool.h"
+
+const char *program = "dnssec-settime";
+int verbose;
+
+static isc_mem_t *mctx = NULL;
+
+ISC_PLATFORM_NORETURN_PRE static void
+usage(void) ISC_PLATFORM_NORETURN_POST;
+
+static void
+usage(void) {
+ fprintf(stderr, "Usage:\n");
+ fprintf(stderr, " %s [options] keyfile\n\n", program);
+ fprintf(stderr, "Version: %s\n", VERSION);
+ fprintf(stderr, "General options:\n");
+#ifdef USE_PKCS11
+ fprintf(stderr, " -E engine: specify OpenSSL engine "
+ "(default \"pkcs11\")\n");
+#else
+ fprintf(stderr, " -E engine: specify OpenSSL engine\n");
+#endif
+ fprintf(stderr, " -f: force update of old-style "
+ "keys\n");
+ fprintf(stderr, " -K directory: set key file location\n");
+ fprintf(stderr, " -v level: set level of verbosity\n");
+ fprintf(stderr, " -h: help\n");
+ fprintf(stderr, "Timing options:\n");
+ fprintf(stderr, " -P date/[+-]offset/none: set/unset key "
+ "publication date\n");
+ fprintf(stderr, " -A date/[+-]offset/none: set/unset key "
+ "activation date\n");
+ fprintf(stderr, " -R date/[+-]offset/none: set/unset key "
+ "revocation date\n");
+ fprintf(stderr, " -I date/[+-]offset/none: set/unset key "
+ "inactivation date\n");
+ fprintf(stderr, " -D date/[+-]offset/none: set/unset key "
+ "deletion date\n");
+ fprintf(stderr, "Printing options:\n");
+ fprintf(stderr, " -p C/P/A/R/I/D/all: print a particular time "
+ "value or values "
+ "[default: all]\n");
+ fprintf(stderr, " -u: print times in unix epoch "
+ "format\n");
+ fprintf(stderr, "Output:\n");
+ fprintf(stderr, " K<name>+<alg>+<new id>.key, "
+ "K<name>+<alg>+<new id>.private\n");
+
+ exit (-1);
+}
+
+static void
+printtime(dst_key_t *key, int type, const char *tag, isc_boolean_t epoch,
+ FILE *stream)
+{
+ isc_result_t result;
+ const char *output = NULL;
+ isc_stdtime_t when;
+
+ if (tag != NULL)
+ fprintf(stream, "%s: ", tag);
+
+ result = dst_key_gettime(key, type, &when);
+ if (result == ISC_R_NOTFOUND) {
+ fprintf(stream, "UNSET\n");
+ } else if (epoch) {
+ fprintf(stream, "%d\n", (int) when);
+ } else {
+ time_t time = when;
+ output = ctime(&time);
+ fprintf(stream, "%s", output);
+ }
+}
+
+int
+main(int argc, char **argv) {
+ isc_result_t result;
+#ifdef USE_PKCS11
+ const char *engine = "pkcs11";
+#else
+ const char *engine = NULL;
+#endif
+ char *filename = NULL, *directory = NULL;
+ char newname[1024];
+ char keystr[DST_KEY_FORMATSIZE];
+ char *endp, *p;
+ int ch;
+ isc_entropy_t *ectx = NULL;
+ const char *predecessor = NULL;
+ dst_key_t *prevkey = NULL;
+ dst_key_t *key = NULL;
+ isc_buffer_t buf;
+ dns_name_t *name = NULL;
+ dns_secalg_t alg = 0;
+ unsigned int size = 0;
+ isc_uint16_t flags = 0;
+ int prepub = -1;
+ isc_stdtime_t now;
+ isc_stdtime_t pub = 0, act = 0, rev = 0, inact = 0, del = 0;
+ isc_boolean_t setpub = ISC_FALSE, setact = ISC_FALSE;
+ isc_boolean_t setrev = ISC_FALSE, setinact = ISC_FALSE;
+ isc_boolean_t setdel = ISC_FALSE;
+ isc_boolean_t unsetpub = ISC_FALSE, unsetact = ISC_FALSE;
+ isc_boolean_t unsetrev = ISC_FALSE, unsetinact = ISC_FALSE;
+ isc_boolean_t unsetdel = ISC_FALSE;
+ isc_boolean_t printcreate = ISC_FALSE, printpub = ISC_FALSE;
+ isc_boolean_t printact = ISC_FALSE, printrev = ISC_FALSE;
+ isc_boolean_t printinact = ISC_FALSE, printdel = ISC_FALSE;
+ isc_boolean_t force = ISC_FALSE;
+ isc_boolean_t epoch = ISC_FALSE;
+ isc_boolean_t changed = ISC_FALSE;
+
+ if (argc == 1)
+ usage();
+
+ result = isc_mem_create(0, 0, &mctx);
+ if (result != ISC_R_SUCCESS)
+ fatal("Out of memory");
+
+ dns_result_register();
+
+ isc_commandline_errprint = ISC_FALSE;
+
+ isc_stdtime_get(&now);
+
+#define CMDLINE_FLAGS "A:D:E:fhI:i:K:P:p:R:S:uv:"
+ while ((ch = isc_commandline_parse(argc, argv, CMDLINE_FLAGS)) != -1) {
+ switch (ch) {
+ case 'E':
+ engine = isc_commandline_argument;
+ break;
+ case 'f':
+ force = ISC_TRUE;
+ break;
+ case 'p':
+ p = isc_commandline_argument;
+ if (!strcasecmp(p, "all")) {
+ printcreate = ISC_TRUE;
+ printpub = ISC_TRUE;
+ printact = ISC_TRUE;
+ printrev = ISC_TRUE;
+ printinact = ISC_TRUE;
+ printdel = ISC_TRUE;
+ break;
+ }
+
+ do {
+ switch (*p++) {
+ case 'C':
+ printcreate = ISC_TRUE;
+ break;
+ case 'P':
+ printpub = ISC_TRUE;
+ break;
+ case 'A':
+ printact = ISC_TRUE;
+ break;
+ case 'R':
+ printrev = ISC_TRUE;
+ break;
+ case 'I':
+ printinact = ISC_TRUE;
+ break;
+ case 'D':
+ printdel = ISC_TRUE;
+ break;
+ case ' ':
+ break;
+ default:
+ usage();
+ break;
+ }
+ } while (*p != '\0');
+ break;
+ case 'u':
+ epoch = ISC_TRUE;
+ break;
+ case 'K':
+ /*
+ * We don't have to copy it here, but do it to
+ * simplify cleanup later
+ */
+ directory = isc_mem_strdup(mctx,
+ isc_commandline_argument);
+ if (directory == NULL) {
+ fatal("Failed to allocate memory for "
+ "directory");
+ }
+ break;
+ case 'v':
+ verbose = strtol(isc_commandline_argument, &endp, 0);
+ if (*endp != '\0')
+ fatal("-v must be followed by a number");
+ break;
+ case 'P':
+ if (setpub || unsetpub)
+ fatal("-P specified more than once");
+
+ changed = ISC_TRUE;
+ if (!strcasecmp(isc_commandline_argument, "none")) {
+ unsetpub = ISC_TRUE;
+ } else {
+ setpub = ISC_TRUE;
+ pub = strtotime(isc_commandline_argument,
+ now, now);
+ }
+ break;
+ case 'A':
+ if (setact || unsetact)
+ fatal("-A specified more than once");
+
+ changed = ISC_TRUE;
+ if (!strcasecmp(isc_commandline_argument, "none")) {
+ unsetact = ISC_TRUE;
+ } else {
+ setact = ISC_TRUE;
+ act = strtotime(isc_commandline_argument,
+ now, now);
+ }
+ break;
+ case 'R':
+ if (setrev || unsetrev)
+ fatal("-R specified more than once");
+
+ changed = ISC_TRUE;
+ if (!strcasecmp(isc_commandline_argument, "none")) {
+ unsetrev = ISC_TRUE;
+ } else {
+ setrev = ISC_TRUE;
+ rev = strtotime(isc_commandline_argument,
+ now, now);
+ }
+ break;
+ case 'I':
+ if (setinact || unsetinact)
+ fatal("-I specified more than once");
+
+ changed = ISC_TRUE;
+ if (!strcasecmp(isc_commandline_argument, "none")) {
+ unsetinact = ISC_TRUE;
+ } else {
+ setinact = ISC_TRUE;
+ inact = strtotime(isc_commandline_argument,
+ now, now);
+ }
+ break;
+ case 'D':
+ if (setdel || unsetdel)
+ fatal("-D specified more than once");
+
+ changed = ISC_TRUE;
+ if (!strcasecmp(isc_commandline_argument, "none")) {
+ unsetdel = ISC_TRUE;
+ } else {
+ setdel = ISC_TRUE;
+ del = strtotime(isc_commandline_argument,
+ now, now);
+ }
+ break;
+ case 'S':
+ predecessor = isc_commandline_argument;
+ break;
+ case 'i':
+ prepub = strtottl(isc_commandline_argument);
+ break;
+ case '?':
+ if (isc_commandline_option != '?')
+ fprintf(stderr, "%s: invalid argument -%c\n",
+ program, isc_commandline_option);
+ /* Falls into */
+ case 'h':
+ usage();
+
+ default:
+ fprintf(stderr, "%s: unhandled option -%c\n",
+ program, isc_commandline_option);
+ exit(1);
+ }
+ }
+
+ if (argc < isc_commandline_index + 1 ||
+ argv[isc_commandline_index] == NULL)
+ fatal("The key file name was not specified");
+ if (argc > isc_commandline_index + 1)
+ fatal("Extraneous arguments");
+
+ if (ectx == NULL)
+ setup_entropy(mctx, NULL, &ectx);
+ result = isc_hash_create(mctx, ectx, DNS_NAME_MAXWIRE);
+ if (result != ISC_R_SUCCESS)
+ fatal("Could not initialize hash");
+ result = dst_lib_init2(mctx, ectx, engine,
+ ISC_ENTROPY_BLOCKING | ISC_ENTROPY_GOODONLY);
+ if (result != ISC_R_SUCCESS)
+ fatal("Could not initialize dst: %s",
+ isc_result_totext(result));
+ isc_entropy_stopcallbacksources(ectx);
+
+ if (predecessor != NULL) {
+ char keystr[DST_KEY_FORMATSIZE];
+ isc_stdtime_t when;
+ int major, minor;
+
+ if (prepub == -1)
+ prepub = (30 * 86400);
+
+ if (setpub || unsetpub)
+ fatal("-S and -P cannot be used together");
+ if (setact || unsetact)
+ fatal("-S and -A cannot be used together");
+
+ result = dst_key_fromnamedfile(predecessor, directory,
+ DST_TYPE_PUBLIC |
+ DST_TYPE_PRIVATE,
+ mctx, &prevkey);
+ if (result != ISC_R_SUCCESS)
+ fatal("Invalid keyfile %s: %s",
+ filename, isc_result_totext(result));
+ if (!dst_key_isprivate(prevkey))
+ fatal("%s is not a private key", filename);
+
+ name = dst_key_name(prevkey);
+ alg = dst_key_alg(prevkey);
+ size = dst_key_size(prevkey);
+ flags = dst_key_flags(prevkey);
+
+ dst_key_format(prevkey, keystr, sizeof(keystr));
+ dst_key_getprivateformat(prevkey, &major, &minor);
+ if (major != DST_MAJOR_VERSION || minor < DST_MINOR_VERSION)
+ fatal("Predecessor has incompatible format "
+ "version %d.%d\n\t", major, minor);
+
+ result = dst_key_gettime(prevkey, DST_TIME_ACTIVATE, &when);
+ if (result != ISC_R_SUCCESS)
+ fatal("Predecessor has no activation date. "
+ "You must set one before\n\t"
+ "generating a successor.");
+
+ result = dst_key_gettime(prevkey, DST_TIME_INACTIVE, &act);
+ if (result != ISC_R_SUCCESS)
+ fatal("Predecessor has no inactivation date. "
+ "You must set one before\n\t"
+ "generating a successor.");
+
+ pub = act - prepub;
+ if (pub < now && prepub != 0)
+ fatal("Predecessor will become inactive before the\n\t"
+ "prepublication period ends. Either change "
+ "its inactivation date,\n\t"
+ "or use the -i option to set a shorter "
+ "prepublication interval.");
+
+ result = dst_key_gettime(prevkey, DST_TIME_DELETE, &when);
+ if (result != ISC_R_SUCCESS)
+ fprintf(stderr, "%s: WARNING: Predecessor has no "
+ "removal date;\n\t"
+ "it will remain in the zone "
+ "indefinitely after rollover.\n",
+ program);
+
+ changed = setpub = setact = ISC_TRUE;
+ dst_key_free(&prevkey);
+ } else {
+ if (prepub < 0)
+ prepub = 0;
+
+ if (prepub > 0) {
+ if (setpub && setact && (act - prepub) < pub)
+ fatal("Activation and publication dates "
+ "are closer together than the\n\t"
+ "prepublication interval.");
+
+ if (setpub && !setact) {
+ setact = ISC_TRUE;
+ act = pub + prepub;
+ } else if (setact && !setpub) {
+ setpub = ISC_TRUE;
+ pub = act - prepub;
+ }
+
+ if ((act - prepub) < now)
+ fatal("Time until activation is shorter "
+ "than the\n\tprepublication interval.");
+ }
+ }
+
+ if (directory != NULL) {
+ filename = argv[isc_commandline_index];
+ } else {
+ result = isc_file_splitpath(mctx, argv[isc_commandline_index],
+ &directory, &filename);
+ if (result != ISC_R_SUCCESS)
+ fatal("cannot process filename %s: %s",
+ argv[isc_commandline_index],
+ isc_result_totext(result));
+ }
+
+ result = dst_key_fromnamedfile(filename, directory,
+ DST_TYPE_PUBLIC | DST_TYPE_PRIVATE,
+ mctx, &key);
+ if (result != ISC_R_SUCCESS)
+ fatal("Invalid keyfile %s: %s",
+ filename, isc_result_totext(result));
+
+ if (!dst_key_isprivate(key))
+ fatal("%s is not a private key", filename);
+
+ dst_key_format(key, keystr, sizeof(keystr));
+
+ if (predecessor != NULL) {
+ if (!dns_name_equal(name, dst_key_name(key)))
+ fatal("Key name mismatch");
+ if (alg != dst_key_alg(key))
+ fatal("Key algorithm mismatch");
+ if (size != dst_key_size(key))
+ fatal("Key size mismatch");
+ if (flags != dst_key_flags(key))
+ fatal("Key flags mismatch");
+ }
+
+ if (force)
+ set_keyversion(key);
+ else
+ check_keyversion(key, keystr);
+
+ if (verbose > 2)
+ fprintf(stderr, "%s: %s\n", program, keystr);
+
+ /*
+ * Set time values.
+ */
+ if (setpub)
+ dst_key_settime(key, DST_TIME_PUBLISH, pub);
+ else if (unsetpub)
+ dst_key_unsettime(key, DST_TIME_PUBLISH);
+
+ if (setact)
+ dst_key_settime(key, DST_TIME_ACTIVATE, act);
+ else if (unsetact)
+ dst_key_unsettime(key, DST_TIME_ACTIVATE);
+
+ if (setrev) {
+ if ((dst_key_flags(key) & DNS_KEYFLAG_REVOKE) != 0)
+ fprintf(stderr, "%s: warning: Key %s is already "
+ "revoked; changing the revocation date "
+ "will not affect this.\n",
+ program, keystr);
+ if ((dst_key_flags(key) & DNS_KEYFLAG_KSK) == 0)
+ fprintf(stderr, "%s: warning: Key %s is not flagged as "
+ "a KSK, but -R was used. Revoking a "
+ "ZSK is legal, but undefined.\n",
+ program, keystr);
+ dst_key_settime(key, DST_TIME_REVOKE, rev);
+ } else if (unsetrev) {
+ if ((dst_key_flags(key) & DNS_KEYFLAG_REVOKE) != 0)
+ fprintf(stderr, "%s: warning: Key %s is already "
+ "revoked; removing the revocation date "
+ "will not affect this.\n",
+ program, keystr);
+ dst_key_unsettime(key, DST_TIME_REVOKE);
+ }
+
+ if (setinact)
+ dst_key_settime(key, DST_TIME_INACTIVE, inact);
+ else if (unsetinact)
+ dst_key_unsettime(key, DST_TIME_INACTIVE);
+
+ if (setdel)
+ dst_key_settime(key, DST_TIME_DELETE, del);
+ else if (unsetdel)
+ dst_key_unsettime(key, DST_TIME_DELETE);
+
+ /*
+ * Print out time values, if -p was used.
+ */
+ if (printcreate)
+ printtime(key, DST_TIME_CREATED, "Created", epoch, stdout);
+
+ if (printpub)
+ printtime(key, DST_TIME_PUBLISH, "Publish", epoch, stdout);
+
+ if (printact)
+ printtime(key, DST_TIME_ACTIVATE, "Activate", epoch, stdout);
+
+ if (printrev)
+ printtime(key, DST_TIME_REVOKE, "Revoke", epoch, stdout);
+
+ if (printinact)
+ printtime(key, DST_TIME_INACTIVE, "Inactive", epoch, stdout);
+
+ if (printdel)
+ printtime(key, DST_TIME_DELETE, "Delete", epoch, stdout);
+
+ if (changed) {
+ isc_buffer_init(&buf, newname, sizeof(newname));
+ result = dst_key_buildfilename(key, DST_TYPE_PUBLIC, directory,
+ &buf);
+ if (result != ISC_R_SUCCESS) {
+ fatal("Failed to build public key filename: %s",
+ isc_result_totext(result));
+ }
+
+ result = dst_key_tofile(key, DST_TYPE_PUBLIC|DST_TYPE_PRIVATE,
+ directory);
+ if (result != ISC_R_SUCCESS) {
+ dst_key_format(key, keystr, sizeof(keystr));
+ fatal("Failed to write key %s: %s", keystr,
+ isc_result_totext(result));
+ }
+
+ printf("%s\n", newname);
+
+ isc_buffer_clear(&buf);
+ result = dst_key_buildfilename(key, DST_TYPE_PRIVATE, directory,
+ &buf);
+ if (result != ISC_R_SUCCESS) {
+ fatal("Failed to build private key filename: %s",
+ isc_result_totext(result));
+ }
+ printf("%s\n", newname);
+ }
+
+ dst_key_free(&key);
+ dst_lib_destroy();
+ isc_hash_destroy();
+ cleanup_entropy(&ectx);
+ if (verbose > 10)
+ isc_mem_stats(mctx, stdout);
+ isc_mem_free(mctx, directory);
+ isc_mem_destroy(&mctx);
+
+ return (0);
+}
diff --git a/contrib/bind9/bin/dnssec/dnssec-settime.docbook b/contrib/bind9/bin/dnssec/dnssec-settime.docbook
new file mode 100644
index 0000000..1096cb7
--- /dev/null
+++ b/contrib/bind9/bin/dnssec/dnssec-settime.docbook
@@ -0,0 +1,319 @@
+<!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN"
+ "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd"
+ [<!ENTITY mdash "&#8212;">]>
+<!--
+ - Copyright (C) 2009, 2010 Internet Systems Consortium, Inc. ("ISC")
+ -
+ - Permission to use, copy, modify, and/or 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 ISC DISCLAIMS ALL WARRANTIES WITH
+ - REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+ - AND FITNESS. IN NO EVENT SHALL ISC 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.
+-->
+
+<!-- $Id: dnssec-settime.docbook,v 1.11 2010-08-16 22:21:06 marka Exp $ -->
+<refentry id="man.dnssec-settime">
+ <refentryinfo>
+ <date>July 15, 2009</date>
+ </refentryinfo>
+
+ <refmeta>
+ <refentrytitle><application>dnssec-settime</application></refentrytitle>
+ <manvolnum>8</manvolnum>
+ <refmiscinfo>BIND9</refmiscinfo>
+ </refmeta>
+
+ <refnamediv>
+ <refname><application>dnssec-settime</application></refname>
+ <refpurpose>Set the key timing metadata for a DNSSEC key</refpurpose>
+ </refnamediv>
+
+ <docinfo>
+ <copyright>
+ <year>2009</year>
+ <year>2010</year>
+ <holder>Internet Systems Consortium, Inc. ("ISC")</holder>
+ </copyright>
+ </docinfo>
+
+ <refsynopsisdiv>
+ <cmdsynopsis>
+ <command>dnssec-settime</command>
+ <arg><option>-f</option></arg>
+ <arg><option>-K <replaceable class="parameter">directory</replaceable></option></arg>
+ <arg><option>-P <replaceable class="parameter">date/offset</replaceable></option></arg>
+ <arg><option>-A <replaceable class="parameter">date/offset</replaceable></option></arg>
+ <arg><option>-R <replaceable class="parameter">date/offset</replaceable></option></arg>
+ <arg><option>-I <replaceable class="parameter">date/offset</replaceable></option></arg>
+ <arg><option>-D <replaceable class="parameter">date/offset</replaceable></option></arg>
+ <arg><option>-h</option></arg>
+ <arg><option>-v <replaceable class="parameter">level</replaceable></option></arg>
+ <arg><option>-E <replaceable class="parameter">engine</replaceable></option></arg>
+ <arg choice="req">keyfile</arg>
+ </cmdsynopsis>
+ </refsynopsisdiv>
+
+ <refsect1>
+ <title>DESCRIPTION</title>
+ <para><command>dnssec-settime</command>
+ reads a DNSSEC private key file and sets the key timing metadata
+ as specified by the <option>-P</option>, <option>-A</option>,
+ <option>-R</option>, <option>-I</option>, and <option>-D</option>
+ options. The metadata can then be used by
+ <command>dnssec-signzone</command> or other signing software to
+ determine when a key is to be published, whether it should be
+ used for signing a zone, etc.
+ </para>
+ <para>
+ If none of these options is set on the command line,
+ then <command>dnssec-settime</command> simply prints the key timing
+ metadata already stored in the key.
+ </para>
+ <para>
+ When key metadata fields are changed, both files of a key
+ pair (<filename>Knnnn.+aaa+iiiii.key</filename> and
+ <filename>Knnnn.+aaa+iiiii.private</filename>) are regenerated.
+ Metadata fields are stored in the private file. A human-readable
+ description of the metadata is also placed in comments in the key
+ file.
+ </para>
+ </refsect1>
+
+ <refsect1>
+ <title>OPTIONS</title>
+
+ <variablelist>
+ <varlistentry>
+ <term>-f</term>
+ <listitem>
+ <para>
+ Force an update of an old-format key with no metadata fields.
+ Without this option, <command>dnssec-settime</command> will
+ fail when attempting to update a legacy key. With this option,
+ the key will be recreated in the new format, but with the
+ original key data retained. The key's creation date will be
+ set to the present time.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>-K <replaceable class="parameter">directory</replaceable></term>
+ <listitem>
+ <para>
+ Sets the directory in which the key files are to reside.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>-h</term>
+ <listitem>
+ <para>
+ Emit usage message and exit.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>-v <replaceable class="parameter">level</replaceable></term>
+ <listitem>
+ <para>
+ Sets the debugging level.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>-E <replaceable class="parameter">engine</replaceable></term>
+ <listitem>
+ <para>
+ Use the given OpenSSL engine. When compiled with PKCS#11 support
+ it defaults to pkcs11; the empty name resets it to no engine.
+ </para>
+ </listitem>
+ </varlistentry>
+ </variablelist>
+ </refsect1>
+
+ <refsect1>
+ <title>TIMING OPTIONS</title>
+ <para>
+ Dates can be expressed in the format YYYYMMDD or YYYYMMDDHHMMSS.
+ If the argument begins with a '+' or '-', it is interpreted as
+ an offset from the present time. For convenience, if such an offset
+ is followed by one of the suffixes 'y', 'mo', 'w', 'd', 'h', or 'mi',
+ then the offset is computed in years (defined as 365 24-hour days,
+ ignoring leap years), months (defined as 30 24-hour days), weeks,
+ days, hours, or minutes, respectively. Without a suffix, the offset
+ is computed in seconds. To unset a date, use 'none'.
+ </para>
+
+ <variablelist>
+ <varlistentry>
+ <term>-P <replaceable class="parameter">date/offset</replaceable></term>
+ <listitem>
+ <para>
+ Sets the date on which a key is to be published to the zone.
+ After that date, the key will be included in the zone but will
+ not be used to sign it.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>-A <replaceable class="parameter">date/offset</replaceable></term>
+ <listitem>
+ <para>
+ Sets the date on which the key is to be activated. After that
+ date, the key will be included in the zone and used to sign
+ it.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>-R <replaceable class="parameter">date/offset</replaceable></term>
+ <listitem>
+ <para>
+ Sets the date on which the key is to be revoked. After that
+ date, the key will be flagged as revoked. It will be included
+ in the zone and will be used to sign it.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>-I <replaceable class="parameter">date/offset</replaceable></term>
+ <listitem>
+ <para>
+ Sets the date on which the key is to be retired. After that
+ date, the key will still be included in the zone, but it
+ will not be used to sign it.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>-D <replaceable class="parameter">date/offset</replaceable></term>
+ <listitem>
+ <para>
+ Sets the date on which the key is to be deleted. After that
+ date, the key will no longer be included in the zone. (It
+ may remain in the key repository, however.)
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>-S <replaceable class="parameter">predecessor key</replaceable></term>
+ <listitem>
+ <para>
+ Select a key for which the key being modified will be an
+ explicit successor. The name, algorithm, size, and type of the
+ predecessor key must exactly match those of the key being
+ modified. The activation date of the successor key will be set
+ to the inactivation date of the predecessor. The publication
+ date will be set to the activation date minus the prepublication
+ interval, which defaults to 30 days.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>-i <replaceable class="parameter">interval</replaceable></term>
+ <listitem>
+ <para>
+ Sets the prepublication interval for a key. If set, then
+ the publication and activation dates must be separated by at least
+ this much time. If the activation date is specified but the
+ publication date isn't, then the publication date will default
+ to this much time before the activation date; conversely, if
+ the publication date is specified but activation date isn't,
+ then activation will be set to this much time after publication.
+ </para>
+ <para>
+ If the key is being set to be an explicit successor to another
+ key, then the default prepublication interval is 30 days;
+ otherwise it is zero.
+ </para>
+ <para>
+ As with date offsets, if the argument is followed by one of
+ the suffixes 'y', 'mo', 'w', 'd', 'h', or 'mi', then the
+ interval is measured in years, months, weeks, days, hours,
+ or minutes, respectively. Without a suffix, the interval is
+ measured in seconds.
+ </para>
+ </listitem>
+ </varlistentry>
+ </variablelist>
+ </refsect1>
+
+ <refsect1>
+ <title>PRINTING OPTIONS</title>
+ <para>
+ <command>dnssec-settime</command> can also be used to print the
+ timing metadata associated with a key.
+ </para>
+
+ <variablelist>
+ <varlistentry>
+ <term>-u</term>
+ <listitem>
+ <para>
+ Print times in UNIX epoch format.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>-p <replaceable class="parameter">C/P/A/R/I/D/all</replaceable></term>
+ <listitem>
+ <para>
+ Print a specific metadata value or set of metadata values.
+ The <option>-p</option> option may be followed by one or more
+ of the following letters to indicate which value or values to print:
+ <option>C</option> for the creation date,
+ <option>P</option> for the publication date,
+ <option>A</option> for the activation date,
+ <option>R</option> for the revocation date,
+ <option>I</option> for the inactivation date, or
+ <option>D</option> for the deletion date.
+ To print all of the metadata, use <option>-p all</option>.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ </variablelist>
+ </refsect1>
+
+ <refsect1>
+ <title>SEE ALSO</title>
+ <para><citerefentry>
+ <refentrytitle>dnssec-keygen</refentrytitle><manvolnum>8</manvolnum>
+ </citerefentry>,
+ <citerefentry>
+ <refentrytitle>dnssec-signzone</refentrytitle><manvolnum>8</manvolnum>
+ </citerefentry>,
+ <citetitle>BIND 9 Administrator Reference Manual</citetitle>,
+ <citetitle>RFC 5011</citetitle>.
+ </para>
+ </refsect1>
+
+ <refsect1>
+ <title>AUTHOR</title>
+ <para><corpauthor>Internet Systems Consortium</corpauthor>
+ </para>
+ </refsect1>
+
+</refentry><!--
+ - Local variables:
+ - mode: sgml
+ - End:
+-->
diff --git a/contrib/bind9/bin/dnssec/dnssec-settime.html b/contrib/bind9/bin/dnssec/dnssec-settime.html
new file mode 100644
index 0000000..84c8dde
--- /dev/null
+++ b/contrib/bind9/bin/dnssec/dnssec-settime.html
@@ -0,0 +1,208 @@
+<!--
+ - Copyright (C) 2009, 2010 Internet Systems Consortium, Inc. ("ISC")
+ -
+ - Permission to use, copy, modify, and/or 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 ISC DISCLAIMS ALL WARRANTIES WITH
+ - REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+ - AND FITNESS. IN NO EVENT SHALL ISC 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.
+-->
+<!-- $Id: dnssec-settime.html,v 1.14 2010-08-17 01:15:26 tbox Exp $ -->
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
+<title>dnssec-settime</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.71.1">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"><div class="refentry" lang="en">
+<a name="man.dnssec-settime"></a><div class="titlepage"></div>
+<div class="refnamediv">
+<h2>Name</h2>
+<p><span class="application">dnssec-settime</span> &#8212; Set the key timing metadata for a DNSSEC key</p>
+</div>
+<div class="refsynopsisdiv">
+<h2>Synopsis</h2>
+<div class="cmdsynopsis"><p><code class="command">dnssec-settime</code> [<code class="option">-f</code>] [<code class="option">-K <em class="replaceable"><code>directory</code></em></code>] [<code class="option">-P <em class="replaceable"><code>date/offset</code></em></code>] [<code class="option">-A <em class="replaceable"><code>date/offset</code></em></code>] [<code class="option">-R <em class="replaceable"><code>date/offset</code></em></code>] [<code class="option">-I <em class="replaceable"><code>date/offset</code></em></code>] [<code class="option">-D <em class="replaceable"><code>date/offset</code></em></code>] [<code class="option">-h</code>] [<code class="option">-v <em class="replaceable"><code>level</code></em></code>] [<code class="option">-E <em class="replaceable"><code>engine</code></em></code>] {keyfile}</p></div>
+</div>
+<div class="refsect1" lang="en">
+<a name="id2543419"></a><h2>DESCRIPTION</h2>
+<p><span><strong class="command">dnssec-settime</strong></span>
+ reads a DNSSEC private key file and sets the key timing metadata
+ as specified by the <code class="option">-P</code>, <code class="option">-A</code>,
+ <code class="option">-R</code>, <code class="option">-I</code>, and <code class="option">-D</code>
+ options. The metadata can then be used by
+ <span><strong class="command">dnssec-signzone</strong></span> or other signing software to
+ determine when a key is to be published, whether it should be
+ used for signing a zone, etc.
+ </p>
+<p>
+ If none of these options is set on the command line,
+ then <span><strong class="command">dnssec-settime</strong></span> simply prints the key timing
+ metadata already stored in the key.
+ </p>
+<p>
+ When key metadata fields are changed, both files of a key
+ pair (<code class="filename">Knnnn.+aaa+iiiii.key</code> and
+ <code class="filename">Knnnn.+aaa+iiiii.private</code>) are regenerated.
+ Metadata fields are stored in the private file. A human-readable
+ description of the metadata is also placed in comments in the key
+ file.
+ </p>
+</div>
+<div class="refsect1" lang="en">
+<a name="id2543467"></a><h2>OPTIONS</h2>
+<div class="variablelist"><dl>
+<dt><span class="term">-f</span></dt>
+<dd><p>
+ Force an update of an old-format key with no metadata fields.
+ Without this option, <span><strong class="command">dnssec-settime</strong></span> will
+ fail when attempting to update a legacy key. With this option,
+ the key will be recreated in the new format, but with the
+ original key data retained. The key's creation date will be
+ set to the present time.
+ </p></dd>
+<dt><span class="term">-K <em class="replaceable"><code>directory</code></em></span></dt>
+<dd><p>
+ Sets the directory in which the key files are to reside.
+ </p></dd>
+<dt><span class="term">-h</span></dt>
+<dd><p>
+ Emit usage message and exit.
+ </p></dd>
+<dt><span class="term">-v <em class="replaceable"><code>level</code></em></span></dt>
+<dd><p>
+ Sets the debugging level.
+ </p></dd>
+<dt><span class="term">-E <em class="replaceable"><code>engine</code></em></span></dt>
+<dd><p>
+ Use the given OpenSSL engine. When compiled with PKCS#11 support
+ it defaults to pkcs11; the empty name resets it to no engine.
+ </p></dd>
+</dl></div>
+</div>
+<div class="refsect1" lang="en">
+<a name="id2543559"></a><h2>TIMING OPTIONS</h2>
+<p>
+ Dates can be expressed in the format YYYYMMDD or YYYYMMDDHHMMSS.
+ If the argument begins with a '+' or '-', it is interpreted as
+ an offset from the present time. For convenience, if such an offset
+ is followed by one of the suffixes 'y', 'mo', 'w', 'd', 'h', or 'mi',
+ then the offset is computed in years (defined as 365 24-hour days,
+ ignoring leap years), months (defined as 30 24-hour days), weeks,
+ days, hours, or minutes, respectively. Without a suffix, the offset
+ is computed in seconds. To unset a date, use 'none'.
+ </p>
+<div class="variablelist"><dl>
+<dt><span class="term">-P <em class="replaceable"><code>date/offset</code></em></span></dt>
+<dd><p>
+ Sets the date on which a key is to be published to the zone.
+ After that date, the key will be included in the zone but will
+ not be used to sign it.
+ </p></dd>
+<dt><span class="term">-A <em class="replaceable"><code>date/offset</code></em></span></dt>
+<dd><p>
+ Sets the date on which the key is to be activated. After that
+ date, the key will be included in the zone and used to sign
+ it.
+ </p></dd>
+<dt><span class="term">-R <em class="replaceable"><code>date/offset</code></em></span></dt>
+<dd><p>
+ Sets the date on which the key is to be revoked. After that
+ date, the key will be flagged as revoked. It will be included
+ in the zone and will be used to sign it.
+ </p></dd>
+<dt><span class="term">-I <em class="replaceable"><code>date/offset</code></em></span></dt>
+<dd><p>
+ Sets the date on which the key is to be retired. After that
+ date, the key will still be included in the zone, but it
+ will not be used to sign it.
+ </p></dd>
+<dt><span class="term">-D <em class="replaceable"><code>date/offset</code></em></span></dt>
+<dd><p>
+ Sets the date on which the key is to be deleted. After that
+ date, the key will no longer be included in the zone. (It
+ may remain in the key repository, however.)
+ </p></dd>
+<dt><span class="term">-S <em class="replaceable"><code>predecessor key</code></em></span></dt>
+<dd><p>
+ Select a key for which the key being modified will be an
+ explicit successor. The name, algorithm, size, and type of the
+ predecessor key must exactly match those of the key being
+ modified. The activation date of the successor key will be set
+ to the inactivation date of the predecessor. The publication
+ date will be set to the activation date minus the prepublication
+ interval, which defaults to 30 days.
+ </p></dd>
+<dt><span class="term">-i <em class="replaceable"><code>interval</code></em></span></dt>
+<dd>
+<p>
+ Sets the prepublication interval for a key. If set, then
+ the publication and activation dates must be separated by at least
+ this much time. If the activation date is specified but the
+ publication date isn't, then the publication date will default
+ to this much time before the activation date; conversely, if
+ the publication date is specified but activation date isn't,
+ then activation will be set to this much time after publication.
+ </p>
+<p>
+ If the key is being set to be an explicit successor to another
+ key, then the default prepublication interval is 30 days;
+ otherwise it is zero.
+ </p>
+<p>
+ As with date offsets, if the argument is followed by one of
+ the suffixes 'y', 'mo', 'w', 'd', 'h', or 'mi', then the
+ interval is measured in years, months, weeks, days, hours,
+ or minutes, respectively. Without a suffix, the interval is
+ measured in seconds.
+ </p>
+</dd>
+</dl></div>
+</div>
+<div class="refsect1" lang="en">
+<a name="id2543698"></a><h2>PRINTING OPTIONS</h2>
+<p>
+ <span><strong class="command">dnssec-settime</strong></span> can also be used to print the
+ timing metadata associated with a key.
+ </p>
+<div class="variablelist"><dl>
+<dt><span class="term">-u</span></dt>
+<dd><p>
+ Print times in UNIX epoch format.
+ </p></dd>
+<dt><span class="term">-p <em class="replaceable"><code>C/P/A/R/I/D/all</code></em></span></dt>
+<dd><p>
+ Print a specific metadata value or set of metadata values.
+ The <code class="option">-p</code> option may be followed by one or more
+ of the following letters to indicate which value or values to print:
+ <code class="option">C</code> for the creation date,
+ <code class="option">P</code> for the publication date,
+ <code class="option">A</code> for the activation date,
+ <code class="option">R</code> for the revocation date,
+ <code class="option">I</code> for the inactivation date, or
+ <code class="option">D</code> for the deletion date.
+ To print all of the metadata, use <code class="option">-p all</code>.
+ </p></dd>
+</dl></div>
+</div>
+<div class="refsect1" lang="en">
+<a name="id2543912"></a><h2>SEE ALSO</h2>
+<p><span class="citerefentry"><span class="refentrytitle">dnssec-keygen</span>(8)</span>,
+ <span class="citerefentry"><span class="refentrytitle">dnssec-signzone</span>(8)</span>,
+ <em class="citetitle">BIND 9 Administrator Reference Manual</em>,
+ <em class="citetitle">RFC 5011</em>.
+ </p>
+</div>
+<div class="refsect1" lang="en">
+<a name="id2543945"></a><h2>AUTHOR</h2>
+<p><span class="corpauthor">Internet Systems Consortium</span>
+ </p>
+</div>
+</div></body>
+</html>
diff --git a/contrib/bind9/bin/dnssec/dnssec-signzone.8 b/contrib/bind9/bin/dnssec/dnssec-signzone.8
index bfe7a20..9822883 100644
--- a/contrib/bind9/bin/dnssec/dnssec-signzone.8
+++ b/contrib/bind9/bin/dnssec/dnssec-signzone.8
@@ -13,18 +13,18 @@
.\" OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
.\" PERFORMANCE OF THIS SOFTWARE.
.\"
-.\" $Id: dnssec-signzone.8,v 1.47.44.8 2009-11-07 01:56:11 tbox Exp $
+.\" $Id: dnssec-signzone.8,v 1.59 2009-12-04 01:13:44 tbox Exp $
.\"
.hy 0
.ad l
.\" Title: dnssec\-signzone
.\" Author:
.\" Generator: DocBook XSL Stylesheets v1.71.1 <http://docbook.sf.net/>
-.\" Date: June 08, 2009
+.\" Date: June 05, 2009
.\" Manual: BIND9
.\" Source: BIND9
.\"
-.TH "DNSSEC\-SIGNZONE" "8" "June 08, 2009" "BIND9" "BIND9"
+.TH "DNSSEC\-SIGNZONE" "8" "June 05, 2009" "BIND9" "BIND9"
.\" disable hyphenation
.nh
.\" disable justification (adjust text to left margin only)
@@ -33,15 +33,13 @@
dnssec\-signzone \- DNSSEC zone signing tool
.SH "SYNOPSIS"
.HP 16
-\fBdnssec\-signzone\fR [\fB\-a\fR] [\fB\-c\ \fR\fB\fIclass\fR\fR] [\fB\-d\ \fR\fB\fIdirectory\fR\fR] [\fB\-e\ \fR\fB\fIend\-time\fR\fR] [\fB\-f\ \fR\fB\fIoutput\-file\fR\fR] [\fB\-g\fR] [\fB\-h\fR] [\fB\-k\ \fR\fB\fIkey\fR\fR] [\fB\-l\ \fR\fB\fIdomain\fR\fR] [\fB\-i\ \fR\fB\fIinterval\fR\fR] [\fB\-I\ \fR\fB\fIinput\-format\fR\fR] [\fB\-j\ \fR\fB\fIjitter\fR\fR] [\fB\-N\ \fR\fB\fIsoa\-serial\-format\fR\fR] [\fB\-o\ \fR\fB\fIorigin\fR\fR] [\fB\-O\ \fR\fB\fIoutput\-format\fR\fR] [\fB\-p\fR] [\fB\-P\fR] [\fB\-r\ \fR\fB\fIrandomdev\fR\fR] [\fB\-s\ \fR\fB\fIstart\-time\fR\fR] [\fB\-t\fR] [\fB\-v\ \fR\fB\fIlevel\fR\fR] [\fB\-z\fR] [\fB\-3\ \fR\fB\fIsalt\fR\fR] [\fB\-H\ \fR\fB\fIiterations\fR\fR] [\fB\-A\fR] {zonefile} [key...]
+\fBdnssec\-signzone\fR [\fB\-a\fR] [\fB\-c\ \fR\fB\fIclass\fR\fR] [\fB\-d\ \fR\fB\fIdirectory\fR\fR] [\fB\-E\ \fR\fB\fIengine\fR\fR] [\fB\-e\ \fR\fB\fIend\-time\fR\fR] [\fB\-f\ \fR\fB\fIoutput\-file\fR\fR] [\fB\-g\fR] [\fB\-h\fR] [\fB\-K\ \fR\fB\fIdirectory\fR\fR] [\fB\-k\ \fR\fB\fIkey\fR\fR] [\fB\-l\ \fR\fB\fIdomain\fR\fR] [\fB\-i\ \fR\fB\fIinterval\fR\fR] [\fB\-I\ \fR\fB\fIinput\-format\fR\fR] [\fB\-j\ \fR\fB\fIjitter\fR\fR] [\fB\-N\ \fR\fB\fIsoa\-serial\-format\fR\fR] [\fB\-o\ \fR\fB\fIorigin\fR\fR] [\fB\-O\ \fR\fB\fIoutput\-format\fR\fR] [\fB\-p\fR] [\fB\-P\fR] [\fB\-r\ \fR\fB\fIrandomdev\fR\fR] [\fB\-S\fR] [\fB\-s\ \fR\fB\fIstart\-time\fR\fR] [\fB\-T\ \fR\fB\fIttl\fR\fR] [\fB\-t\fR] [\fB\-u\fR] [\fB\-v\ \fR\fB\fIlevel\fR\fR] [\fB\-x\fR] [\fB\-z\fR] [\fB\-3\ \fR\fB\fIsalt\fR\fR] [\fB\-H\ \fR\fB\fIiterations\fR\fR] [\fB\-A\fR] {zonefile} [key...]
.SH "DESCRIPTION"
.PP
\fBdnssec\-signzone\fR
-signs a zone. It generates NSEC and RRSIG records and produces a signed version of the zone. It also generates a
-\fIkeyset\-\fR
-file containing the key\-signing keys for the zone, and if signing a zone which contains delegations, it can optionally generate DS records for the child zones from their
-\fIkeyset\-\fR
-files.
+signs a zone. It generates NSEC and RRSIG records and produces a signed version of the zone. The security status of delegations from the signed zone (that is, whether the child zones are secure or not) is determined by the presence or absence of a
+\fIkeyset\fR
+file for each child zone.
.SH "OPTIONS"
.PP
\-a
@@ -54,30 +52,53 @@ Verify all generated signatures.
Specifies the DNS class of the zone.
.RE
.PP
-\-k \fIkey\fR
-.RS 4
-Treat specified key as a key signing key ignoring any key flags. This option may be specified multiple times.
-.RE
-.PP
-\-l \fIdomain\fR
+\-C
.RS 4
-Generate a DLV set in addition to the key (DNSKEY) and DS sets. The domain is appended to the name of the records.
+Compatibility mode: Generate a
+\fIkeyset\-\fR\fI\fIzonename\fR\fR
+file in addition to
+\fIdsset\-\fR\fI\fIzonename\fR\fR
+when signing a zone, for use by older versions of
+\fBdnssec\-signzone\fR.
.RE
.PP
\-d \fIdirectory\fR
.RS 4
Look for
-\fIkeyset\fR
+\fIdsset\-\fR
+or
+\fIkeyset\-\fR
files in
-\fBdirectory\fR
-as the directory
+\fBdirectory\fR.
+.RE
+.PP
+\-E \fIengine\fR
+.RS 4
+Uses a crypto hardware (OpenSSL engine) for the crypto operations it supports, for instance signing with private keys from a secure key store. When compiled with PKCS#11 support it defaults to pkcs11; the empty name resets it to no engine.
.RE
.PP
\-g
.RS 4
-If the zone contains any delegations, and there are
+Generate DS records for child zones from
+\fIdsset\-\fR
+or
\fIkeyset\-\fR
-files for any of the child zones, then DS records for the child zones will be generated from the keys in those files. Existing DS records will be removed.
+file. Existing DS records will be removed.
+.RE
+.PP
+\-K \fIdirectory\fR
+.RS 4
+Key repository: Specify a directory to search for DNSSEC keys. If not specified, defaults to the current directory.
+.RE
+.PP
+\-k \fIkey\fR
+.RS 4
+Treat specified key as a key signing key ignoring any key flags. This option may be specified multiple times.
+.RE
+.PP
+\-l \fIdomain\fR
+.RS 4
+Generate a DLV set in addition to the key (DNSKEY) and DS sets. The domain is appended to the name of the records.
.RE
.PP
\-s \fIstart\-time\fR
@@ -93,6 +114,9 @@ Specify the date and time when the generated RRSIG records expire. As with
\fBstart\-time\fR, an absolute time is indicated in YYYYMMDDHHMMSS notation. A time relative to the start time is indicated with +N, which is N seconds from the start time. A time relative to the current time is indicated with now+N. If no
\fBend\-time\fR
is specified, 30 days from the start time is used as a default.
+\fBend\-time\fR
+must be later than
+\fBstart\-time\fR.
.RE
.PP
\-f \fIoutput\-file\fR
@@ -208,34 +232,94 @@ specifies the name of a character device or file containing random data to be us
indicates that keyboard input should be used.
.RE
.PP
+\-S
+.RS 4
+Smart signing: Instructs
+\fBdnssec\-signzone\fR
+to search the key repository for keys that match the zone being signed, and to include them in the zone if appropriate.
+.sp
+When a key is found, its timing metadata is examined to determine how it should be used, according to the following rules. Each successive rule takes priority over the prior ones:
+.RS 4
+.PP
+.RS 4
+If no timing metadata has been set for the key, the key is published in the zone and used to sign the zone.
+.RE
+.PP
+.RS 4
+If the key's publication date is set and is in the past, the key is published in the zone.
+.RE
+.PP
+.RS 4
+If the key's activation date is set and in the past, the key is published (regardless of publication date) and used to sign the zone.
+.RE
+.PP
+.RS 4
+If the key's revocation date is set and in the past, and the key is published, then the key is revoked, and the revoked key is used to sign the zone.
+.RE
+.PP
+.RS 4
+If either of the key's unpublication or deletion dates are set and in the past, the key is NOT published or used to sign the zone, regardless of any other metadata.
+.RE
+.RE
+.RE
+.PP
+\-T \fIttl\fR
+.RS 4
+Specifies the TTL to be used for new DNSKEY records imported into the zone from the key repository. If not specified, the default is the minimum TTL value from the zone's SOA record. This option is ignored when signing without
+\fB\-S\fR, since DNSKEY records are not imported from the key repository in that case. It is also ignored if there are any pre\-existing DNSKEY records at the zone apex, in which case new records' TTL values will be set to match them.
+.RE
+.PP
\-t
.RS 4
Print statistics at completion.
.RE
.PP
+\-u
+.RS 4
+Update NSEC/NSEC3 chain when re\-signing a previously signed zone. With this option, a zone signed with NSEC can be switched to NSEC3, or a zone signed with NSEC3 can be switch to NSEC or to NSEC3 with different parameters. Without this option,
+\fBdnssec\-signzone\fR
+will retain the existing chain when re\-signing.
+.RE
+.PP
\-v \fIlevel\fR
.RS 4
Sets the debugging level.
.RE
.PP
+\-x
+.RS 4
+Only sign the DNSKEY RRset with key\-signing keys, and omit signatures from zone\-signing keys. (This is similar to the
+\fBdnssec\-dnskey\-kskonly yes;\fR
+zone option in
+\fBnamed\fR.)
+.RE
+.PP
\-z
.RS 4
-Ignore KSK flag on key when determining what to sign.
+Ignore KSK flag on key when determining what to sign. This causes KSK\-flagged keys to sign all records, not just the DNSKEY RRset. (This is similar to the
+\fBupdate\-check\-ksk no;\fR
+zone option in
+\fBnamed\fR.)
.RE
.PP
\-3 \fIsalt\fR
.RS 4
-Generate a NSEC3 chain with the given hex encoded salt. A dash (\fIsalt\fR) can be used to indicate that no salt is to be used when generating the NSEC3 chain.
+Generate an NSEC3 chain with the given hex encoded salt. A dash (\fIsalt\fR) can be used to indicate that no salt is to be used when generating the NSEC3 chain.
.RE
.PP
\-H \fIiterations\fR
.RS 4
-When generating a NSEC3 chain use this many interations. The default is 100.
+When generating an NSEC3 chain, use this many interations. The default is 10.
.RE
.PP
\-A
.RS 4
-When generating a NSEC3 chain set the OPTOUT flag on all NSEC3 records and do not generate NSEC3 records for insecure delegations.
+When generating an NSEC3 chain set the OPTOUT flag on all NSEC3 records and do not generate NSEC3 records for insecure delegations.
+.sp
+Using this option twice (i.e.,
+\fB\-AA\fR) turns the OPTOUT flag off for all records. This is useful when using the
+\fB\-u\fR
+option to modify an NSEC3 chain which previously had OPTOUT set.
.RE
.PP
zonefile
@@ -253,9 +337,11 @@ The following command signs the
\fBexample.com\fR
zone with the DSA key generated by
\fBdnssec\-keygen\fR
-(Kexample.com.+003+17247). The zone's keys must be in the master file (\fIdb.example.com\fR). This invocation looks for
-\fIkeyset\fR
-files, in the current directory, so that DS records can be generated from them (\fB\-g\fR).
+(Kexample.com.+003+17247). Because the
+\fB\-S\fR
+option is not being used, the zone's keys must be in the master file (\fIdb.example.com\fR). This invocation looks for
+\fIdsset\fR
+files, in the current directory, so that DS records can be imported from them (\fB\-g\fR).
.sp
.RS 4
.nf
@@ -283,18 +369,6 @@ db.example.com.signed
%
.fi
.RE
-.SH "KNOWN BUGS"
-.PP
-\fBdnssec\-signzone\fR
-was designed so that it could sign a zone partially, using only a subset of the DNSSEC keys needed to produce a fully\-signed zone. This permits a zone administrator, for example, to sign a zone with one key on one machine, move the resulting partially\-signed zone to a second machine, and sign it again with a second key.
-.PP
-An unfortunate side\-effect of this flexibility is that
-\fBdnssec\-signzone\fR
-does not check to make sure it's signing a zone with any valid keys at all. An attempt to sign a zone without any keys will appear to succeed, producing a "signed" zone with no signatures. There is no warning issued when a zone is not fully signed.
-.PP
-This will be corrected in a future release. In the meantime, ISC recommends examining the output of
-\fBdnssec\-signzone\fR
-to confirm that the zone is properly signed by all keys before using it.
.SH "SEE ALSO"
.PP
\fBdnssec\-keygen\fR(8),
diff --git a/contrib/bind9/bin/dnssec/dnssec-signzone.c b/contrib/bind9/bin/dnssec/dnssec-signzone.c
index b8f4d66..3997a13 100644
--- a/contrib/bind9/bin/dnssec/dnssec-signzone.c
+++ b/contrib/bind9/bin/dnssec/dnssec-signzone.c
@@ -29,7 +29,7 @@
* IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: dnssec-signzone.c,v 1.209.12.20 2010-06-03 23:47:48 tbox Exp $ */
+/* $Id: dnssec-signzone.c,v 1.262 2010-06-03 23:51:04 tbox Exp $ */
/*! \file */
@@ -87,6 +87,10 @@
#include "dnssectool.h"
+#ifndef PATH_MAX
+#define PATH_MAX 1024 /* AIX, WIN32, and others don't define this. */
+#endif
+
const char *program = "dnssec-signzone";
int verbose;
@@ -97,22 +101,11 @@ static int nsec_datatype = dns_rdatatype_nsec;
#define IS_NSEC3 (nsec_datatype == dns_rdatatype_nsec3)
#define OPTOUT(x) (((x) & DNS_NSEC3FLAG_OPTOUT) != 0)
+#define REVOKE(x) ((dst_key_flags(x) & DNS_KEYFLAG_REVOKE) != 0)
+
#define BUFSIZE 2048
#define MAXDSKEYS 8
-typedef struct signer_key_struct signer_key_t;
-
-struct signer_key_struct {
- dst_key_t *key;
- isc_boolean_t issigningkey;
- isc_boolean_t isdsk;
- isc_boolean_t isksk;
- isc_boolean_t wasused;
- isc_boolean_t commandline;
- unsigned int position;
- ISC_LINK(signer_key_t) link;
-};
-
#define SIGNER_EVENTCLASS ISC_EVENTCLASS(0x4453)
#define SIGNER_EVENT_WRITE (SIGNER_EVENTCLASS + 0)
#define SIGNER_EVENT_WORK (SIGNER_EVENTCLASS + 1)
@@ -128,7 +121,7 @@ struct signer_event {
dns_dbnode_t *node;
};
-static ISC_LIST(signer_key_t) keylist;
+static dns_dnsseckeylist_t keylist;
static unsigned int keycount = 0;
isc_rwlock_t keylist_lock;
static isc_stdtime_t starttime = 0, endtime = 0, now;
@@ -138,7 +131,8 @@ static isc_boolean_t tryverify = ISC_FALSE;
static isc_boolean_t printstats = ISC_FALSE;
static isc_mem_t *mctx = NULL;
static isc_entropy_t *ectx = NULL;
-static dns_ttl_t zonettl;
+static dns_ttl_t zone_soa_min_ttl;
+static dns_ttl_t soa_ttl;
static FILE *fp;
static char *tempfile = NULL;
static const dns_master_style_t *masterstyle;
@@ -146,7 +140,7 @@ static dns_masterformat_t inputformat = dns_masterformat_text;
static dns_masterformat_t outputformat = dns_masterformat_text;
static unsigned int nsigned = 0, nretained = 0, ndropped = 0;
static unsigned int nverified = 0, nverifyfailed = 0;
-static const char *directory;
+static const char *directory = NULL, *dsdir = NULL;
static isc_mutex_t namelock, statslock;
static isc_taskmgr_t *taskmgr = NULL;
static dns_db_t *gdb; /* The database */
@@ -155,13 +149,18 @@ static dns_dbiterator_t *gdbiter; /* The database iterator */
static dns_rdataclass_t gclass; /* The class */
static dns_name_t *gorigin; /* The database origin */
static int nsec3flags = 0;
+static dns_iterations_t nsec3iter = 10U;
+static unsigned char saltbuf[255];
+static unsigned char *salt = saltbuf;
+static size_t salt_length = 0;
static isc_task_t *master = NULL;
static unsigned int ntasks = 0;
static isc_boolean_t shuttingdown = ISC_FALSE, finished = ISC_FALSE;
static isc_boolean_t nokeys = ISC_FALSE;
static isc_boolean_t removefile = ISC_FALSE;
static isc_boolean_t generateds = ISC_FALSE;
-static isc_boolean_t ignoreksk = ISC_FALSE;
+static isc_boolean_t ignore_kskflag = ISC_FALSE;
+static isc_boolean_t keyset_kskonly = ISC_FALSE;
static dns_name_t *dlv = NULL;
static dns_fixedname_t dlv_fixed;
static dns_master_style_t *dsstyle = NULL;
@@ -169,6 +168,9 @@ static unsigned int serialformat = SOA_SERIAL_KEEP;
static unsigned int hash_length = 0;
static isc_boolean_t unknownalg = ISC_FALSE;
static isc_boolean_t disable_zone_check = ISC_FALSE;
+static isc_boolean_t update_chain = ISC_FALSE;
+static isc_boolean_t set_keyttl = ISC_FALSE;
+static dns_ttl_t keyttl;
#define INCSTAT(counter) \
if (printstats) { \
@@ -195,48 +197,23 @@ dumpnode(dns_name_t *name, dns_dbnode_t *node) {
check_result(result, "dns_master_dumpnodetostream");
}
-static signer_key_t *
-newkeystruct(dst_key_t *dstkey, isc_boolean_t signwithkey) {
- signer_key_t *key;
-
- key = isc_mem_get(mctx, sizeof(signer_key_t));
- if (key == NULL)
- fatal("out of memory");
- key->key = dstkey;
- if ((dst_key_flags(dstkey) & DNS_KEYFLAG_KSK) != 0) {
- key->issigningkey = signwithkey;
- key->isksk = ISC_TRUE;
- key->isdsk = ISC_FALSE;
- } else {
- key->issigningkey = signwithkey;
- key->isksk = ISC_FALSE;
- key->isdsk = ISC_TRUE;
- }
- key->wasused = ISC_FALSE;
- key->commandline = ISC_FALSE;
- key->position = keycount++;
- ISC_LINK_INIT(key, link);
- return (key);
-}
-
/*%
* Sign the given RRset with given key, and add the signature record to the
* given tuple.
*/
-
static void
signwithkey(dns_name_t *name, dns_rdataset_t *rdataset, dst_key_t *key,
dns_ttl_t ttl, dns_diff_t *add, const char *logmsg)
{
isc_result_t result;
isc_stdtime_t jendtime;
- char keystr[KEY_FORMATSIZE];
+ char keystr[DST_KEY_FORMATSIZE];
dns_rdata_t trdata = DNS_RDATA_INIT;
unsigned char array[BUFSIZE];
isc_buffer_t b;
dns_difftuple_t *tuple;
- key_format(key, keystr, sizeof(keystr));
+ dst_key_format(key, keystr, sizeof(keystr));
vbprintf(1, "\t%s %s\n", logmsg, keystr);
jendtime = (jitter != 0) ? isc_random_jitter(endtime, jitter) : endtime;
@@ -245,8 +222,8 @@ signwithkey(dns_name_t *name, dns_rdataset_t *rdataset, dst_key_t *key,
mctx, &b, &trdata);
isc_entropy_stopcallbacksources(ectx);
if (result != ISC_R_SUCCESS) {
- char keystr[KEY_FORMATSIZE];
- key_format(key, keystr, sizeof(keystr));
+ char keystr[DST_KEY_FORMATSIZE];
+ dst_key_format(key, keystr, sizeof(keystr));
fatal("dnskey '%s' failed to sign data: %s",
keystr, isc_result_totext(result));
}
@@ -272,31 +249,43 @@ signwithkey(dns_name_t *name, dns_rdataset_t *rdataset, dst_key_t *key,
}
static inline isc_boolean_t
-issigningkey(signer_key_t *key) {
- return (key->issigningkey);
+issigningkey(dns_dnsseckey_t *key) {
+ return (key->force_sign || key->hint_sign);
}
static inline isc_boolean_t
-iszonekey(signer_key_t *key) {
+iszonekey(dns_dnsseckey_t *key) {
return (ISC_TF(dns_name_equal(dst_key_name(key->key), gorigin) &&
dst_key_iszonekey(key->key)));
}
+static inline isc_boolean_t
+isksk(dns_dnsseckey_t *key) {
+ return (key->ksk);
+}
+
+static inline isc_boolean_t
+iszsk(dns_dnsseckey_t *key) {
+ return (ignore_kskflag || !key->ksk);
+}
+
/*%
- * Find the key if it is in our list. If it is, return it, otherwise null.
+ * Find the key that generated an RRSIG, if it is in the key list. If
+ * so, return a pointer to it, otherwise return NULL.
+ *
* No locking is performed here, this must be done by the caller.
*/
-static signer_key_t *
+static dns_dnsseckey_t *
keythatsigned_unlocked(dns_rdata_rrsig_t *rrsig) {
- signer_key_t *key;
+ dns_dnsseckey_t *key;
- key = ISC_LIST_HEAD(keylist);
- while (key != NULL) {
+ for (key = ISC_LIST_HEAD(keylist);
+ key != NULL;
+ key = ISC_LIST_NEXT(key, link)) {
if (rrsig->keyid == dst_key_id(key->key) &&
rrsig->algorithm == dst_key_alg(key->key) &&
dns_name_equal(&rrsig->signer, dst_key_name(key->key)))
return (key);
- key = ISC_LIST_NEXT(key, link);
}
return (NULL);
}
@@ -305,11 +294,11 @@ keythatsigned_unlocked(dns_rdata_rrsig_t *rrsig) {
* Finds the key that generated a RRSIG, if possible. First look at the keys
* that we've loaded already, and then see if there's a key on disk.
*/
-static signer_key_t *
+static dns_dnsseckey_t *
keythatsigned(dns_rdata_rrsig_t *rrsig) {
isc_result_t result;
dst_key_t *pubkey = NULL, *privkey = NULL;
- signer_key_t *key;
+ dns_dnsseckey_t *key = NULL;
isc_rwlock_lock(&keylist_lock, isc_rwlocktype_read);
key = keythatsigned_unlocked(rrsig);
@@ -325,7 +314,6 @@ keythatsigned(dns_rdata_rrsig_t *rrsig) {
* after all.
*/
isc_rwlock_lock(&keylist_lock, isc_rwlocktype_write);
-
key = keythatsigned_unlocked(rrsig);
if (key != NULL) {
isc_rwlock_unlock(&keylist_lock, isc_rwlocktype_write);
@@ -334,7 +322,7 @@ keythatsigned(dns_rdata_rrsig_t *rrsig) {
result = dst_key_fromfile(&rrsig->signer, rrsig->keyid,
rrsig->algorithm, DST_TYPE_PUBLIC,
- NULL, mctx, &pubkey);
+ directory, mctx, &pubkey);
if (result != ISC_R_SUCCESS) {
isc_rwlock_unlock(&keylist_lock, isc_rwlocktype_write);
return (NULL);
@@ -343,12 +331,15 @@ keythatsigned(dns_rdata_rrsig_t *rrsig) {
result = dst_key_fromfile(&rrsig->signer, rrsig->keyid,
rrsig->algorithm,
DST_TYPE_PUBLIC | DST_TYPE_PRIVATE,
- NULL, mctx, &privkey);
+ directory, mctx, &privkey);
if (result == ISC_R_SUCCESS) {
dst_key_free(&pubkey);
- key = newkeystruct(privkey, ISC_FALSE);
- } else
- key = newkeystruct(pubkey, ISC_FALSE);
+ dns_dnsseckey_create(mctx, &privkey, &key);
+ } else {
+ dns_dnsseckey_create(mctx, &pubkey, &key);
+ }
+ key->force_publish = ISC_TRUE;
+ key->force_sign = ISC_FALSE;
ISC_LIST_APPEND(keylist, key, link);
isc_rwlock_unlock(&keylist_lock, isc_rwlocktype_write);
@@ -383,15 +374,16 @@ expecttofindkey(dns_name_t *name) {
dns_name_format(name, namestr, sizeof(namestr));
fatal("failure looking for '%s DNSKEY' in database: %s",
namestr, isc_result_totext(result));
+ /* NOTREACHED */
return (ISC_FALSE); /* removes a warning */
}
static inline isc_boolean_t
-setverifies(dns_name_t *name, dns_rdataset_t *set, signer_key_t *key,
+setverifies(dns_name_t *name, dns_rdataset_t *set, dst_key_t *key,
dns_rdata_t *rrsig)
{
isc_result_t result;
- result = dns_dnssec_verify(name, set, key->key, ISC_FALSE, mctx, rrsig);
+ result = dns_dnssec_verify(name, set, key, ISC_FALSE, mctx, rrsig);
if (result == ISC_R_SUCCESS) {
INCSTAT(nverified);
return (ISC_TRUE);
@@ -413,7 +405,7 @@ signset(dns_diff_t *del, dns_diff_t *add, dns_dbnode_t *node, dns_name_t *name,
dns_rdataset_t sigset;
dns_rdata_t sigrdata = DNS_RDATA_INIT;
dns_rdata_rrsig_t rrsig;
- signer_key_t *key;
+ dns_dnsseckey_t *key;
isc_result_t result;
isc_boolean_t nosigs = ISC_FALSE;
isc_boolean_t *wassignedby, *nowsignedby;
@@ -483,8 +475,7 @@ signset(dns_diff_t *del, dns_diff_t *add, dns_dbnode_t *node, dns_name_t *name,
"invalid validity period\n",
sigstr);
} else if (key == NULL && !future &&
- expecttofindkey(&rrsig.signer))
- {
+ expecttofindkey(&rrsig.signer)) {
/* rrsig is dropped and not replaced */
vbprintf(2, "\trrsig by %s dropped - "
"private dnskey not found\n",
@@ -495,35 +486,33 @@ signset(dns_diff_t *del, dns_diff_t *add, dns_dbnode_t *node, dns_name_t *name,
if (!expired)
keep = ISC_TRUE;
} else if (issigningkey(key)) {
- if (!expired && setverifies(name, set, key, &sigrdata))
- {
+ if (!expired && setverifies(name, set, key->key,
+ &sigrdata)) {
vbprintf(2, "\trrsig by %s retained\n", sigstr);
keep = ISC_TRUE;
- wassignedby[key->position] = ISC_TRUE;
- nowsignedby[key->position] = ISC_TRUE;
- key->wasused = ISC_TRUE;
+ wassignedby[key->index] = ISC_TRUE;
+ nowsignedby[key->index] = ISC_TRUE;
} else {
vbprintf(2, "\trrsig by %s dropped - %s\n",
sigstr,
expired ? "expired" :
"failed to verify");
- wassignedby[key->position] = ISC_TRUE;
+ wassignedby[key->index] = ISC_TRUE;
resign = ISC_TRUE;
}
} else if (iszonekey(key)) {
- if (!expired && setverifies(name, set, key, &sigrdata))
- {
+ if (!expired && setverifies(name, set, key->key,
+ &sigrdata)) {
vbprintf(2, "\trrsig by %s retained\n", sigstr);
keep = ISC_TRUE;
- wassignedby[key->position] = ISC_TRUE;
- nowsignedby[key->position] = ISC_TRUE;
- key->wasused = ISC_TRUE;
+ wassignedby[key->index] = ISC_TRUE;
+ nowsignedby[key->index] = ISC_TRUE;
} else {
vbprintf(2, "\trrsig by %s dropped - %s\n",
sigstr,
expired ? "expired" :
"failed to verify");
- wassignedby[key->position] = ISC_TRUE;
+ wassignedby[key->index] = ISC_TRUE;
}
} else if (!expired) {
vbprintf(2, "\trrsig by %s retained\n", sigstr);
@@ -533,7 +522,7 @@ signset(dns_diff_t *del, dns_diff_t *add, dns_dbnode_t *node, dns_name_t *name,
}
if (keep) {
- nowsignedby[key->position] = ISC_TRUE;
+ nowsignedby[key->index] = ISC_TRUE;
INCSTAT(nretained);
if (sigset.ttl != ttl) {
vbprintf(2, "\tfixing ttl %s\n", sigstr);
@@ -568,8 +557,7 @@ signset(dns_diff_t *del, dns_diff_t *add, dns_dbnode_t *node, dns_name_t *name,
signwithkey(name, set, key->key, ttl, add,
"resigning with dnskey");
- nowsignedby[key->position] = ISC_TRUE;
- key->wasused = ISC_TRUE;
+ nowsignedby[key->index] = ISC_TRUE;
}
dns_rdata_reset(&sigrdata);
@@ -587,20 +575,37 @@ signset(dns_diff_t *del, dns_diff_t *add, dns_dbnode_t *node, dns_name_t *name,
key != NULL;
key = ISC_LIST_NEXT(key, link))
{
- if (nowsignedby[key->position])
+ if (nowsignedby[key->index])
continue;
- if (!key->issigningkey)
- continue;
- if (!(ignoreksk || key->isdsk ||
- (key->isksk &&
- set->type == dns_rdatatype_dnskey &&
- dns_name_equal(name, gorigin))))
+ if (!issigningkey(key))
continue;
- signwithkey(name, set, key->key, ttl, add,
- "signing with dnskey");
- key->wasused = ISC_TRUE;
+ if (set->type == dns_rdatatype_dnskey &&
+ dns_name_equal(name, gorigin)) {
+ isc_boolean_t have_ksk;
+ dns_dnsseckey_t *tmpkey;
+
+ have_ksk = isksk(key);
+ for (tmpkey = ISC_LIST_HEAD(keylist);
+ tmpkey != NULL;
+ tmpkey = ISC_LIST_NEXT(tmpkey, link)) {
+ if (dst_key_alg(key->key) !=
+ dst_key_alg(tmpkey->key))
+ continue;
+ if (REVOKE(tmpkey->key))
+ continue;
+ if (isksk(tmpkey))
+ have_ksk = ISC_TRUE;
+ }
+ if (isksk(key) || !have_ksk ||
+ (iszsk(key) && !keyset_kskonly))
+ signwithkey(name, set, key->key, ttl, add,
+ "signing with dnskey");
+ } else if (iszsk(key)) {
+ signwithkey(name, set, key->key, ttl, add,
+ "signing with dnskey");
+ }
}
isc_mem_put(mctx, wassignedby, arraysize * sizeof(isc_boolean_t));
@@ -774,16 +779,21 @@ static void
opendb(const char *prefix, dns_name_t *name, dns_rdataclass_t rdclass,
dns_db_t **dbp)
{
- char filename[256];
+ char filename[PATH_MAX];
isc_buffer_t b;
isc_result_t result;
isc_buffer_init(&b, filename, sizeof(filename));
- if (directory != NULL) {
- isc_buffer_putstr(&b, directory);
- if (directory[strlen(directory) - 1] != '/')
+ if (dsdir != NULL) {
+ /* allow room for a trailing slash */
+ if (strlen(dsdir) >= isc_buffer_availablelength(&b))
+ fatal("path '%s' is too long", dsdir);
+ isc_buffer_putstr(&b, dsdir);
+ if (dsdir[strlen(dsdir) - 1] != '/')
isc_buffer_putstr(&b, "/");
}
+ if (strlen(prefix) > isc_buffer_availablelength(&b))
+ fatal("path '%s' is too long", dsdir);
isc_buffer_putstr(&b, prefix);
result = dns_name_tofilenametext(name, ISC_FALSE, &b);
check_result(result, "dns_name_tofilenametext()");
@@ -798,13 +808,15 @@ opendb(const char *prefix, dns_name_t *name, dns_rdataclass_t rdclass,
rdclass, 0, NULL, dbp);
check_result(result, "dns_db_create()");
- result = dns_db_load(*dbp, filename);
+ result = dns_db_load3(*dbp, filename, inputformat, DNS_MASTER_HINT);
if (result != ISC_R_SUCCESS && result != DNS_R_SEENINCLUDE)
dns_db_detach(dbp);
}
/*%
- * Loads the key set for a child zone, if there is one, and builds DS records.
+ * Load the DS set for a child zone, if a dsset-* file can be found.
+ * If not, try to find a keyset-* file from an earlier version of
+ * dnssec-signzone, and build DS records from that.
*/
static isc_result_t
loadds(dns_name_t *name, isc_uint32_t ttl, dns_rdataset_t *dsset) {
@@ -818,29 +830,49 @@ loadds(dns_name_t *name, isc_uint32_t ttl, dns_rdataset_t *dsset) {
dns_diff_t diff;
dns_difftuple_t *tuple = NULL;
+ opendb("dsset-", name, gclass, &db);
+ if (db != NULL) {
+ result = dns_db_findnode(db, name, ISC_FALSE, &node);
+ if (result == ISC_R_SUCCESS) {
+ dns_rdataset_init(dsset);
+ result = dns_db_findrdataset(db, node, NULL,
+ dns_rdatatype_ds, 0, 0,
+ dsset, NULL);
+ dns_db_detachnode(db, &node);
+ if (result == ISC_R_SUCCESS) {
+ vbprintf(2, "found DS records\n");
+ dsset->ttl = ttl;
+ dns_db_detach(&db);
+ return (result);
+ }
+ }
+ dns_db_detach(&db);
+ }
+
+ /* No DS records found; try again, looking for DNSKEY records */
opendb("keyset-", name, gclass, &db);
- if (db == NULL)
+ if (db == NULL) {
return (ISC_R_NOTFOUND);
+ }
result = dns_db_findnode(db, name, ISC_FALSE, &node);
if (result != ISC_R_SUCCESS) {
dns_db_detach(&db);
- return (DNS_R_BADDB);
+ return (result);
}
+
dns_rdataset_init(&keyset);
- result = dns_db_findrdataset(db, node, NULL, dns_rdatatype_dnskey, 0,
- 0, &keyset, NULL);
+ result = dns_db_findrdataset(db, node, NULL, dns_rdatatype_dnskey, 0, 0,
+ &keyset, NULL);
if (result != ISC_R_SUCCESS) {
dns_db_detachnode(db, &node);
dns_db_detach(&db);
return (result);
}
-
vbprintf(2, "found DNSKEY records\n");
result = dns_db_newversion(db, &ver);
check_result(result, "dns_db_newversion");
-
dns_diff_init(mctx, &diff);
for (result = dns_rdataset_first(&keyset);
@@ -869,6 +901,7 @@ loadds(dns_name_t *name, isc_uint32_t ttl, dns_rdataset_t *dsset) {
check_result(result, "dns_difftuple_create");
dns_diff_append(&diff, &tuple);
}
+
result = dns_diff_apply(&diff, db, ver);
check_result(result, "dns_diff_apply");
dns_diff_clear(&diff);
@@ -1112,17 +1145,15 @@ active_node(dns_dbnode_t *node) {
}
/*%
- * Extracts the TTL from the SOA.
+ * Extracts the minimum TTL from the SOA record, and the SOA record's TTL.
*/
-static dns_ttl_t
-soattl(void) {
+static void
+get_soa_ttls(void) {
dns_rdataset_t soaset;
dns_fixedname_t fname;
dns_name_t *name;
isc_result_t result;
- dns_ttl_t ttl;
dns_rdata_t rdata = DNS_RDATA_INIT;
- dns_rdata_soa_t soa;
dns_fixedname_init(&fname);
name = dns_fixedname_name(&fname);
@@ -1136,11 +1167,9 @@ soattl(void) {
result = dns_rdataset_first(&soaset);
check_result(result, "dns_rdataset_first");
dns_rdataset_current(&soaset, &rdata);
- result = dns_rdata_tostruct(&rdata, &soa, NULL);
- check_result(result, "dns_rdata_tostruct");
- ttl = soa.minimum;
+ zone_soa_min_ttl = dns_soa_getminimum(&rdata);
+ soa_ttl = soaset.ttl;
dns_rdataset_disassociate(&soaset);
- return (ttl);
}
/*%
@@ -1371,7 +1400,7 @@ verifyset(dns_rdataset_t *rdataset, dns_name_t *name, dns_dbnode_t *node,
for (i = 0; i < 256; i++)
if ((ksk_algorithms[i] != 0) &&
(set_algorithms[i] == 0)) {
- alg_format(i, algbuf, sizeof(algbuf));
+ dns_secalg_format(i, algbuf, sizeof(algbuf));
fprintf(stderr, "Missing %s signature for "
"%s %s\n", algbuf, namebuf, typebuf);
bad_algorithms[i] = 1;
@@ -1414,8 +1443,8 @@ verifynode(dns_name_t *name, dns_dbnode_t *node, isc_boolean_t delegation,
/*%
* Verify that certain things are sane:
*
- * The apex has a DNSKEY record with at least one KSK and at least
- * one ZSK.
+ * The apex has a DNSKEY record with at least one KSK, and at least
+ * one ZSK if the -x flag was not used.
*
* The DNSKEY record was signed with at least one of the KSKs in this
* set.
@@ -1440,8 +1469,10 @@ verifyzone(void) {
isc_boolean_t goodksk = ISC_FALSE;
isc_boolean_t goodzsk = ISC_FALSE;
isc_result_t result;
- unsigned char revoked[256];
- unsigned char standby[256];
+ unsigned char revoked_ksk[256];
+ unsigned char revoked_zsk[256];
+ unsigned char standby_ksk[256];
+ unsigned char standby_zsk[256];
unsigned char ksk_algorithms[256];
unsigned char zsk_algorithms[256];
unsigned char bad_algorithms[256];
@@ -1470,8 +1501,10 @@ verifyzone(void) {
if (!dns_rdataset_isassociated(&sigrdataset))
fatal("cannot find DNSKEY RRSIGs\n");
- memset(revoked, 0, sizeof(revoked));
- memset(standby, 0, sizeof(revoked));
+ memset(revoked_ksk, 0, sizeof(revoked_ksk));
+ memset(revoked_zsk, 0, sizeof(revoked_zsk));
+ memset(standby_ksk, 0, sizeof(standby_ksk));
+ memset(standby_zsk, 0, sizeof(standby_zsk));
memset(ksk_algorithms, 0, sizeof(ksk_algorithms));
memset(zsk_algorithms, 0, sizeof(zsk_algorithms));
memset(bad_algorithms, 0, sizeof(bad_algorithms));
@@ -1480,8 +1513,9 @@ verifyzone(void) {
#endif
/*
- * Check that the DNSKEY RR has at least one self signing KSK and
- * one ZSK per algorithm in it.
+ * Check that the DNSKEY RR has at least one self signing KSK
+ * and one ZSK per algorithm in it (or, if -x was used, one
+ * self-signing KSK).
*/
for (result = dns_rdataset_first(&rdataset);
result == ISC_R_SUCCESS;
@@ -1511,8 +1545,11 @@ verifyzone(void) {
(int)isc_buffer_usedlength(&buf), buffer);
}
if ((dnskey.flags & DNS_KEYFLAG_KSK) != 0 &&
- revoked[dnskey.algorithm] != 255)
- revoked[dnskey.algorithm]++;
+ revoked_ksk[dnskey.algorithm] != 255)
+ revoked_ksk[dnskey.algorithm]++;
+ else if ((dnskey.flags & DNS_KEYFLAG_KSK) == 0 &&
+ revoked_zsk[dnskey.algorithm] != 255)
+ revoked_zsk[dnskey.algorithm]++;
} else if ((dnskey.flags & DNS_KEYFLAG_KSK) != 0) {
if (dns_dnssec_selfsigns(&rdata, gorigin, &rdataset,
&sigrdataset, ISC_FALSE, mctx)) {
@@ -1520,8 +1557,8 @@ verifyzone(void) {
ksk_algorithms[dnskey.algorithm]++;
goodksk = ISC_TRUE;
} else {
- if (standby[dnskey.algorithm] != 255)
- standby[dnskey.algorithm]++;
+ if (standby_ksk[dnskey.algorithm] != 255)
+ standby_ksk[dnskey.algorithm]++;
}
} else if (dns_dnssec_selfsigns(&rdata, gorigin, &rdataset,
&sigrdataset, ISC_FALSE,
@@ -1534,8 +1571,8 @@ verifyzone(void) {
zsk_algorithms[dnskey.algorithm]++;
goodzsk = ISC_TRUE;
} else {
- if (zsk_algorithms[dnskey.algorithm] != 255)
- zsk_algorithms[dnskey.algorithm]++;
+ if (standby_zsk[dnskey.algorithm] != 255)
+ standby_zsk[dnskey.algorithm]++;
#ifdef ALLOW_KSKLESS_ZONES
allzsksigned = ISC_FALSE;
#endif
@@ -1545,42 +1582,54 @@ verifyzone(void) {
}
dns_rdataset_disassociate(&sigrdataset);
- if (!goodksk) {
#ifdef ALLOW_KSKLESS_ZONES
- if (!goodzsk)
- fatal("no self signing keys found");
- fprintf(stderr, "No self signing KSK found. Using self signed "
- "ZSK's for active algorithm list.\n");
+ if (!goodksk) {
+ if (!ignore_kskflag)
+ fprintf(stderr, "No self signing KSK found. Using "
+ "self signed ZSK's for active "
+ "algorithm list.\n");
memcpy(ksk_algorithms, self_algorithms, sizeof(ksk_algorithms));
if (!allzsksigned)
fprintf(stderr, "warning: not all ZSK's are self "
"signed.\n");
+ }
#else
+ if (!goodksk) {
fatal("no self signed KSK's found");
-#endif
}
+#endif
fprintf(stderr, "Verifying the zone using the following algorithms:");
for (i = 0; i < 256; i++) {
- if (ksk_algorithms[i] != 0) {
- alg_format(i, algbuf, sizeof(algbuf));
+#ifdef ALLOW_KSKLESS_ZONES
+ if (ksk_algorithms[i] != 0 || zsk_algorithms[i] != 0)
+#else
+ if (ksk_algorithms[i] != 0)
+#endif
+ {
+ dns_secalg_format(i, algbuf, sizeof(algbuf));
fprintf(stderr, " %s", algbuf);
}
}
fprintf(stderr, ".\n");
- for (i = 0; i < 256; i++) {
- /*
- * The counts should both be zero or both be non-zero.
- * Mark the algorithm as bad if this is not met.
- */
- if ((ksk_algorithms[i] != 0) == (zsk_algorithms[i] != 0))
- continue;
- alg_format(i, algbuf, sizeof(algbuf));
- fprintf(stderr, "Missing %s for algorithm %s\n",
- (ksk_algorithms[i] != 0) ? "ZSK" : "self signing KSK",
- algbuf);
- bad_algorithms[i] = 1;
+ if (!ignore_kskflag && !keyset_kskonly) {
+ for (i = 0; i < 256; i++) {
+ /*
+ * The counts should both be zero or both be non-zero.
+ * Mark the algorithm as bad if this is not met.
+ */
+ if ((ksk_algorithms[i] != 0) ==
+ (zsk_algorithms[i] != 0))
+ continue;
+ dns_secalg_format(i, algbuf, sizeof(algbuf));
+ fprintf(stderr, "Missing %s for algorithm %s\n",
+ (ksk_algorithms[i] != 0)
+ ? "ZSK"
+ : "self signing KSK",
+ algbuf);
+ bad_algorithms[i] = 1;
+ }
}
/*
@@ -1674,7 +1723,7 @@ verifyzone(void) {
if (first)
fprintf(stderr, "The zone is not fully signed "
"for the following algorithms:");
- alg_format(i, algbuf, sizeof(algbuf));
+ dns_secalg_format(i, algbuf, sizeof(algbuf));
fprintf(stderr, " %s", algbuf);
first = ISC_FALSE;
}
@@ -1684,21 +1733,30 @@ verifyzone(void) {
fatal("DNSSEC completeness test failed.");
}
- if (goodksk) {
+ if (goodksk || ignore_kskflag) {
/*
* Print the success summary.
*/
fprintf(stderr, "Zone signing complete:\n");
for (i = 0; i < 256; i++) {
- if ((zsk_algorithms[i] != 0) ||
- (ksk_algorithms[i] != 0) ||
- (revoked[i] != 0) || (standby[i] != 0)) {
- alg_format(i, algbuf, sizeof(algbuf));
- fprintf(stderr, "Algorithm: %s: ZSKs: %u, "
- "KSKs: %u active, %u revoked, %u "
- "stand-by\n", algbuf,
- zsk_algorithms[i], ksk_algorithms[i],
- revoked[i], standby[i]);
+ if ((ksk_algorithms[i] != 0) ||
+ (standby_ksk[i] != 0) ||
+ (revoked_zsk[i] != 0) ||
+ (zsk_algorithms[i] != 0) ||
+ (standby_zsk[i] != 0) ||
+ (revoked_zsk[i] != 0)) {
+ dns_secalg_format(i, algbuf, sizeof(algbuf));
+ fprintf(stderr, "Algorithm: %s: KSKs: "
+ "%u active, %u stand-by, %u revoked\n",
+ algbuf, ksk_algorithms[i],
+ standby_ksk[i], revoked_ksk[i]);
+ fprintf(stderr, "%*sZSKs: "
+ "%u active, %u %s, %u revoked\n",
+ (int) strlen(algbuf) + 13, "",
+ zsk_algorithms[i],
+ standby_zsk[i],
+ keyset_kskonly ? "present" : "stand-by",
+ revoked_zsk[i]);
}
}
}
@@ -1923,6 +1981,7 @@ add_ds(dns_name_t *name, dns_dbnode_t *node, isc_uint32_t nsttl) {
dns_rdatatype_ds, 0);
check_result(result, "dns_db_deleterdataset");
}
+
result = loadds(name, nsttl, &dsset);
if (result == ISC_R_SUCCESS) {
result = dns_db_addrdataset(gdb, node, gversion, 0,
@@ -1953,7 +2012,7 @@ remove_records(dns_dbnode_t *node, dns_rdatatype_t which) {
dns_rdataset_init(&rdataset);
/*
- * Delete any NSEC records at the apex.
+ * Delete any records of the given type at the apex.
*/
result = dns_db_allrdatasets(gdb, node, gversion, 0, &rdsiter);
check_result(result, "dns_db_allrdatasets()");
@@ -1965,6 +2024,12 @@ remove_records(dns_dbnode_t *node, dns_rdatatype_t which) {
covers = rdataset.covers;
dns_rdataset_disassociate(&rdataset);
if (type == which || covers == which) {
+ if (which == dns_rdatatype_nsec && !update_chain)
+ fatal("Zone contains NSEC records. Use -u "
+ "to update to NSEC3.");
+ if (which == dns_rdatatype_nsec3param && !update_chain)
+ fatal("Zone contains NSEC3 chains. Use -u "
+ "to update to NSEC.");
result = dns_db_deleterdataset(gdb, node, gversion,
type, covers);
check_result(result, "dns_db_deleterdataset()");
@@ -2088,8 +2153,9 @@ nsecify(void) {
} else if (result != ISC_R_SUCCESS)
fatal("iterating through the database failed: %s",
isc_result_totext(result));
+ dns_dbiterator_pause(dbiter);
result = dns_nsec_build(gdb, gversion, node, nextname,
- zonettl);
+ zone_soa_min_ttl);
check_result(result, "dns_nsec_build()");
dns_db_detachnode(gdb, &node);
}
@@ -2320,6 +2386,97 @@ nsec3clean(dns_name_t *name, dns_dbnode_t *node,
check_result(result, "dns_db_deleterdataset(RRSIG(NSEC3))");
}
+static void
+rrset_remove_duplicates(dns_name_t *name, dns_rdataset_t *rdataset,
+ dns_diff_t *diff)
+{
+ dns_difftuple_t *tuple = NULL;
+ isc_result_t result;
+ unsigned int count1 = 0;
+ dns_rdataset_t tmprdataset;
+
+ dns_rdataset_init(&tmprdataset);
+ for (result = dns_rdataset_first(rdataset);
+ result == ISC_R_SUCCESS;
+ result = dns_rdataset_next(rdataset)) {
+ dns_rdata_t rdata1 = DNS_RDATA_INIT;
+ unsigned int count2 = 0;
+
+ count1++;
+ dns_rdataset_current(rdataset, &rdata1);
+ dns_rdataset_clone(rdataset, &tmprdataset);
+ for (result = dns_rdataset_first(&tmprdataset);
+ result == ISC_R_SUCCESS;
+ result = dns_rdataset_next(&tmprdataset)) {
+ dns_rdata_t rdata2 = DNS_RDATA_INIT;
+ count2++;
+ if (count1 >= count2)
+ continue;
+ dns_rdataset_current(&tmprdataset, &rdata2);
+ if (dns_rdata_casecompare(&rdata1, &rdata2) == 0) {
+ result = dns_difftuple_create(mctx,
+ DNS_DIFFOP_DEL,
+ name,
+ rdataset->ttl,
+ &rdata2, &tuple);
+ check_result(result, "dns_difftuple_create");
+ dns_diff_append(diff, &tuple);
+ }
+ }
+ dns_rdataset_disassociate(&tmprdataset);
+ }
+}
+
+static void
+remove_duplicates(void) {
+ isc_result_t result;
+ dns_dbiterator_t *dbiter = NULL;
+ dns_rdatasetiter_t *rdsiter = NULL;
+ dns_diff_t diff;
+ dns_dbnode_t *node = NULL;
+ dns_rdataset_t rdataset;
+ dns_fixedname_t fname;
+ dns_name_t *name;
+
+ dns_diff_init(mctx, &diff);
+ dns_fixedname_init(&fname);
+ name = dns_fixedname_name(&fname);
+ dns_rdataset_init(&rdataset);
+
+ result = dns_db_createiterator(gdb, 0, &dbiter);
+ check_result(result, "dns_db_createiterator()");
+
+ for (result = dns_dbiterator_first(dbiter);
+ result == ISC_R_SUCCESS;
+ result = dns_dbiterator_next(dbiter)) {
+
+ result = dns_dbiterator_current(dbiter, &node, name);
+ check_dns_dbiterator_current(result);
+ result = dns_db_allrdatasets(gdb, node, gversion, 0, &rdsiter);
+ check_result(result, "dns_db_allrdatasets()");
+ for (result = dns_rdatasetiter_first(rdsiter);
+ result == ISC_R_SUCCESS;
+ result = dns_rdatasetiter_next(rdsiter)) {
+ dns_rdatasetiter_current(rdsiter, &rdataset);
+ rrset_remove_duplicates(name, &rdataset, &diff);
+ dns_rdataset_disassociate(&rdataset);
+ }
+ if (result != ISC_R_NOMORE)
+ fatal("rdatasets iteration failed.");
+ dns_rdatasetiter_destroy(&rdsiter);
+ dns_db_detachnode(gdb, &node);
+ }
+ if (result != ISC_R_NOMORE)
+ fatal("zone iteration failed.");
+
+ if (!ISC_LIST_EMPTY(diff.tuples)) {
+ result = dns_diff_applysilently(&diff, gdb, gversion);
+ check_result(result, "dns_diff_applysilently");
+ }
+ dns_diff_clear(&diff);
+ dns_dbiterator_destroy(&dbiter);
+}
+
/*
* Generate NSEC3 records for the zone.
*/
@@ -2546,7 +2703,7 @@ nsec3ify(unsigned int hashalg, unsigned int iterations,
*/
dns_dbiterator_pause(dbiter);
addnsec3(name, node, salt, salt_length, iterations,
- hashlist, zonettl);
+ hashlist, zone_soa_min_ttl);
dns_db_detachnode(gdb, &node);
/*
* Add NSEC3's for empty nodes. Use closest encloser logic.
@@ -2557,7 +2714,7 @@ nsec3ify(unsigned int hashalg, unsigned int iterations,
count--;
dns_name_split(nextname, count, NULL, nextname);
addnsec3(nextname, NULL, salt, salt_length,
- iterations, hashlist, zonettl);
+ iterations, hashlist, zone_soa_min_ttl);
}
}
dns_dbiterator_destroy(&dbiter);
@@ -2580,7 +2737,7 @@ loadzone(char *file, char *origin, dns_rdataclass_t rdclass, dns_db_t **db) {
dns_fixedname_init(&fname);
name = dns_fixedname_name(&fname);
- result = dns_name_fromtext(name, &b, dns_rootname, ISC_FALSE, NULL);
+ result = dns_name_fromtext(name, &b, dns_rootname, 0, NULL);
if (result != ISC_R_SUCCESS)
fatal("failed converting name '%s' to dns format: %s",
origin, isc_result_totext(result));
@@ -2600,90 +2757,169 @@ loadzone(char *file, char *origin, dns_rdataclass_t rdclass, dns_db_t **db) {
* private keys from disk.
*/
static void
-loadzonekeys(dns_db_t *db) {
+loadzonekeys(isc_boolean_t preserve_keys, isc_boolean_t load_public) {
dns_dbnode_t *node;
- dns_dbversion_t *currentversion;
+ dns_dbversion_t *currentversion = NULL;
isc_result_t result;
- dst_key_t *keys[20];
- unsigned int nkeys, i;
-
- currentversion = NULL;
- dns_db_currentversion(db, &currentversion);
+ dns_rdataset_t rdataset, keysigs, soasigs;
node = NULL;
- result = dns_db_findnode(db, gorigin, ISC_FALSE, &node);
+ result = dns_db_findnode(gdb, gorigin, ISC_FALSE, &node);
if (result != ISC_R_SUCCESS)
fatal("failed to find the zone's origin: %s",
isc_result_totext(result));
- result = dns_dnssec_findzonekeys(db, currentversion, node, gorigin,
- mctx, 20, keys, &nkeys);
- if (result == ISC_R_NOTFOUND)
- result = ISC_R_SUCCESS;
+ dns_db_currentversion(gdb, &currentversion);
+
+ dns_rdataset_init(&rdataset);
+ dns_rdataset_init(&soasigs);
+ dns_rdataset_init(&keysigs);
+
+ /* Make note of the keys which signed the SOA, if any */
+ result = dns_db_findrdataset(gdb, node, currentversion,
+ dns_rdatatype_soa, 0, 0,
+ &rdataset, &soasigs);
+ if (result != ISC_R_SUCCESS)
+ goto cleanup;
+
+ /* Preserve the TTL of the DNSKEY RRset, if any */
+ dns_rdataset_disassociate(&rdataset);
+ result = dns_db_findrdataset(gdb, node, currentversion,
+ dns_rdatatype_dnskey, 0, 0,
+ &rdataset, &keysigs);
+
if (result != ISC_R_SUCCESS)
- fatal("failed to find the zone keys: %s",
+ goto cleanup;
+
+ if (set_keyttl && keyttl != rdataset.ttl) {
+ fprintf(stderr, "User-specified TTL (%d) conflicts "
+ "with existing DNSKEY RRset TTL.\n",
+ keyttl);
+ fprintf(stderr, "Imported keys will use the RRSet "
+ "TTL (%d) instead.\n",
+ rdataset.ttl);
+ }
+ keyttl = rdataset.ttl;
+
+ /* Load keys corresponding to the existing DNSKEY RRset */
+ result = dns_dnssec_keylistfromrdataset(gorigin, directory, mctx,
+ &rdataset, &keysigs, &soasigs,
+ preserve_keys, load_public,
+ &keylist);
+ if (result != ISC_R_SUCCESS)
+ fatal("failed to load the zone keys: %s",
isc_result_totext(result));
- for (i = 0; i < nkeys; i++) {
- signer_key_t *key;
+ cleanup:
+ if (dns_rdataset_isassociated(&rdataset))
+ dns_rdataset_disassociate(&rdataset);
+ if (dns_rdataset_isassociated(&keysigs))
+ dns_rdataset_disassociate(&keysigs);
+ if (dns_rdataset_isassociated(&soasigs))
+ dns_rdataset_disassociate(&soasigs);
+ dns_db_detachnode(gdb, &node);
+ dns_db_closeversion(gdb, &currentversion, ISC_FALSE);
+}
+
+static void
+loadexplicitkeys(char *keyfiles[], int n, isc_boolean_t setksk) {
+ isc_result_t result;
+ int i;
+
+ for (i = 0; i < n; i++) {
+ dns_dnsseckey_t *key = NULL;
+ dst_key_t *newkey = NULL;
+
+ result = dst_key_fromnamedfile(keyfiles[i], directory,
+ DST_TYPE_PUBLIC |
+ DST_TYPE_PRIVATE,
+ mctx, &newkey);
+ if (result != ISC_R_SUCCESS)
+ fatal("cannot load dnskey %s: %s", keyfiles[i],
+ isc_result_totext(result));
+
+ if (!dns_name_equal(gorigin, dst_key_name(newkey)))
+ fatal("key %s not at origin\n", keyfiles[i]);
+
+ if (!dst_key_isprivate(newkey))
+ fatal("cannot sign zone with non-private dnskey %s",
+ keyfiles[i]);
+
+ /* Skip any duplicates */
+ for (key = ISC_LIST_HEAD(keylist);
+ key != NULL;
+ key = ISC_LIST_NEXT(key, link)) {
+ if (dst_key_id(key->key) == dst_key_id(newkey) &&
+ dst_key_alg(key->key) == dst_key_alg(newkey))
+ break;
+ }
+
+ if (key == NULL) {
+ /* We haven't seen this key before */
+ dns_dnsseckey_create(mctx, &newkey, &key);
+ ISC_LIST_APPEND(keylist, key, link);
+ key->source = dns_keysource_user;
+ } else {
+ dst_key_free(&key->key);
+ key->key = newkey;
+ }
+
+ key->force_publish = ISC_TRUE;
+ key->force_sign = ISC_TRUE;
- key = newkeystruct(keys[i], dst_key_isprivate(keys[i]));
- ISC_LIST_APPEND(keylist, key, link);
+ if (setksk)
+ key->ksk = ISC_TRUE;
}
- dns_db_detachnode(db, &node);
- dns_db_closeversion(db, &currentversion, ISC_FALSE);
}
-/*%
- * Finds all public zone keys in the zone.
- */
static void
-loadzonepubkeys(dns_db_t *db) {
- dns_dbversion_t *currentversion = NULL;
- dns_dbnode_t *node = NULL;
- dns_rdataset_t rdataset;
- dns_rdata_t rdata = DNS_RDATA_INIT;
- dst_key_t *pubkey;
- signer_key_t *key;
+report(const char *format, ...) {
+ va_list args;
+ va_start(args, format);
+ vfprintf(stderr, format, args);
+ va_end(args);
+ putc('\n', stderr);
+}
+
+static void
+build_final_keylist() {
isc_result_t result;
+ dns_dbversion_t *ver = NULL;
+ dns_diff_t diff;
+ dns_dnsseckeylist_t matchkeys;
+ char name[DNS_NAME_FORMATSIZE];
- dns_db_currentversion(db, &currentversion);
+ /*
+ * Find keys that match this zone in the key repository.
+ */
+ ISC_LIST_INIT(matchkeys);
+ result = dns_dnssec_findmatchingkeys(gorigin, directory,
+ mctx, &matchkeys);
+ if (result == ISC_R_NOTFOUND)
+ result = ISC_R_SUCCESS;
+ check_result(result, "dns_dnssec_findmatchingkeys");
- result = dns_db_findnode(db, gorigin, ISC_FALSE, &node);
- if (result != ISC_R_SUCCESS)
- fatal("failed to find the zone's origin: %s",
- isc_result_totext(result));
+ result = dns_db_newversion(gdb, &ver);
+ check_result(result, "dns_db_newversion");
- dns_rdataset_init(&rdataset);
- result = dns_db_findrdataset(db, node, currentversion,
- dns_rdatatype_dnskey, 0, 0, &rdataset,
- NULL);
+ dns_diff_init(mctx, &diff);
+
+ /*
+ * Update keylist with information from from the key repository.
+ */
+ dns_dnssec_updatekeys(&keylist, &matchkeys, NULL, gorigin, keyttl,
+ &diff, ignore_kskflag, mctx, report);
+
+ dns_name_format(gorigin, name, sizeof(name));
+
+ result = dns_diff_applysilently(&diff, gdb, ver);
if (result != ISC_R_SUCCESS)
- fatal("failed to find keys at the zone apex: %s",
- isc_result_totext(result));
- result = dns_rdataset_first(&rdataset);
- check_result(result, "dns_rdataset_first");
- while (result == ISC_R_SUCCESS) {
- pubkey = NULL;
- dns_rdata_reset(&rdata);
- dns_rdataset_current(&rdataset, &rdata);
- result = dns_dnssec_keyfromrdata(gorigin, &rdata, mctx,
- &pubkey);
- if (result != ISC_R_SUCCESS)
- goto next;
- if (!dst_key_iszonekey(pubkey)) {
- dst_key_free(&pubkey);
- goto next;
- }
+ fatal("failed to update DNSKEY RRset at node '%s': %s",
+ name, isc_result_totext(result));
- key = newkeystruct(pubkey, ISC_FALSE);
- ISC_LIST_APPEND(keylist, key, link);
- next:
- result = dns_rdataset_next(&rdataset);
- }
- dns_rdataset_disassociate(&rdataset);
- dns_db_detachnode(db, &node);
- dns_db_closeversion(db, &currentversion, ISC_FALSE);
+ dns_db_closeversion(gdb, &ver, ISC_TRUE);
+
+ dns_diff_clear(&diff);
}
static void
@@ -2727,18 +2963,112 @@ warnifallksk(dns_db_t *db) {
dns_rdataset_disassociate(&rdataset);
dns_db_detachnode(db, &node);
dns_db_closeversion(db, &currentversion, ISC_FALSE);
- if (!have_non_ksk && !ignoreksk) {
+ if (!have_non_ksk && !ignore_kskflag) {
if (disable_zone_check)
- fprintf(stderr, "%s: warning: No non-KSK dnskey found. "
- "Supply non-KSK dnskey or use '-z'.\n",
+ fprintf(stderr, "%s: warning: No non-KSK DNSKEY found; "
+ "supply a ZSK or use '-z'.\n",
program);
else
- fatal("No non-KSK dnskey found. "
- "Supply non-KSK dnskey or use '-z'.");
+ fatal("No non-KSK DNSKEY found; "
+ "supply a ZSK or use '-z'.");
}
}
static void
+set_nsec3params(isc_boolean_t update_chain, isc_boolean_t set_salt,
+ isc_boolean_t set_optout, isc_boolean_t set_iter)
+{
+ isc_result_t result;
+ dns_dbversion_t *ver = NULL;
+ dns_dbnode_t *node = NULL;
+ dns_rdataset_t rdataset;
+ dns_rdata_t rdata = DNS_RDATA_INIT;
+ dns_rdata_nsec3_t nsec3;
+ dns_fixedname_t fname;
+ dns_name_t *hashname;
+ unsigned char orig_salt[256];
+ size_t orig_saltlen;
+ dns_hash_t orig_hash;
+ isc_uint16_t orig_iter;
+
+ dns_db_currentversion(gdb, &ver);
+ dns_rdataset_init(&rdataset);
+
+ orig_saltlen = sizeof(orig_salt);
+ result = dns_db_getnsec3parameters(gdb, ver, &orig_hash, NULL,
+ &orig_iter, orig_salt,
+ &orig_saltlen);
+ if (result != ISC_R_SUCCESS)
+ goto cleanup;
+
+ nsec_datatype = dns_rdatatype_nsec3;
+
+ if (!update_chain && set_salt) {
+ if (salt_length != orig_saltlen ||
+ memcmp(saltbuf, orig_salt, salt_length) != 0)
+ fatal("An NSEC3 chain exists with a different salt. "
+ "Use -u to update it.");
+ } else if (!set_salt) {
+ salt_length = orig_saltlen;
+ memcpy(saltbuf, orig_salt, orig_saltlen);
+ salt = saltbuf;
+ }
+
+ if (!update_chain && set_iter) {
+ if (nsec3iter != orig_iter)
+ fatal("An NSEC3 chain exists with different "
+ "iterations. Use -u to update it.");
+ } else if (!set_iter)
+ nsec3iter = orig_iter;
+
+ /*
+ * Find an NSEC3 record to get the current OPTOUT value.
+ * (This assumes all NSEC3 records agree.)
+ */
+
+ dns_fixedname_init(&fname);
+ hashname = dns_fixedname_name(&fname);
+ result = dns_nsec3_hashname(&fname, NULL, NULL,
+ gorigin, gorigin, dns_hash_sha1,
+ orig_iter, orig_salt, orig_saltlen);
+ check_result(result, "dns_nsec3_hashname");
+
+ result = dns_db_findnsec3node(gdb, hashname, ISC_FALSE, &node);
+ if (result != ISC_R_SUCCESS)
+ goto cleanup;
+
+ result = dns_db_findrdataset(gdb, node, ver, dns_rdatatype_nsec3,
+ 0, 0, &rdataset, NULL);
+ if (result != ISC_R_SUCCESS)
+ goto cleanup;
+
+ result = dns_rdataset_first(&rdataset);
+ check_result(result, "dns_rdataset_first");
+ dns_rdataset_current(&rdataset, &rdata);
+ result = dns_rdata_tostruct(&rdata, &nsec3, NULL);
+ check_result(result, "dns_rdata_tostruct");
+
+ if (!update_chain && set_optout) {
+ if (nsec3flags != nsec3.flags)
+ fatal("An NSEC3 chain exists with%s OPTOUT. "
+ "Use -u -%s to %s it.",
+ OPTOUT(nsec3.flags) ? "" : "out",
+ OPTOUT(nsec3.flags) ? "AA" : "A",
+ OPTOUT(nsec3.flags) ? "clear" : "set");
+ } else if (!set_optout)
+ nsec3flags = nsec3.flags;
+
+ dns_rdata_freestruct(&nsec3);
+
+ cleanup:
+ if (dns_rdataset_isassociated(&rdataset))
+ dns_rdataset_disassociate(&rdataset);
+ if (node != NULL)
+ dns_db_detachnode(gdb, &node);
+ dns_db_closeversion(gdb, &ver, ISC_FALSE);
+}
+
+static void
writeset(const char *prefix, dns_rdatatype_t type) {
char *filename;
char namestr[DNS_NAME_FORMATSIZE];
@@ -2755,7 +3085,7 @@ writeset(const char *prefix, dns_rdatatype_t type) {
isc_buffer_t namebuf;
isc_region_t r;
isc_result_t result;
- signer_key_t *key;
+ dns_dnsseckey_t *key, *tmpkey;
unsigned char dsbuf[DNS_DS_BUFFERSIZE];
unsigned char keybuf[DST_KEY_MAXSIZE];
unsigned int filenamelen;
@@ -2767,13 +3097,13 @@ writeset(const char *prefix, dns_rdatatype_t type) {
check_result(result, "dns_name_tofilenametext");
isc_buffer_putuint8(&namebuf, 0);
filenamelen = strlen(prefix) + strlen(namestr);
- if (directory != NULL)
- filenamelen += strlen(directory) + 1;
+ if (dsdir != NULL)
+ filenamelen += strlen(dsdir) + 1;
filename = isc_mem_get(mctx, filenamelen + 1);
if (filename == NULL)
fatal("out of memory");
- if (directory != NULL)
- sprintf(filename, "%s/", directory);
+ if (dsdir != NULL)
+ sprintf(filename, "%s/", dsdir);
else
filename[0] = 0;
strcat(filename, prefix);
@@ -2781,22 +3111,6 @@ writeset(const char *prefix, dns_rdatatype_t type) {
dns_diff_init(mctx, &diff);
- for (key = ISC_LIST_HEAD(keylist);
- key != NULL;
- key = ISC_LIST_NEXT(key, link))
- if (!key->isksk) {
- have_non_ksk = ISC_TRUE;
- break;
- }
-
- for (key = ISC_LIST_HEAD(keylist);
- key != NULL;
- key = ISC_LIST_NEXT(key, link))
- if (key->isksk) {
- have_ksk = ISC_TRUE;
- break;
- }
-
if (type == dns_rdatatype_dlv) {
dns_name_t tname;
unsigned int labels;
@@ -2815,7 +3129,28 @@ writeset(const char *prefix, dns_rdatatype_t type) {
key != NULL;
key = ISC_LIST_NEXT(key, link))
{
- if (have_ksk && have_non_ksk && !key->isksk)
+ if (REVOKE(key->key))
+ continue;
+ if (isksk(key)) {
+ have_ksk = ISC_TRUE;
+ have_non_ksk = ISC_FALSE;
+ } else {
+ have_ksk = ISC_FALSE;
+ have_non_ksk = ISC_TRUE;
+ }
+ for (tmpkey = ISC_LIST_HEAD(keylist);
+ tmpkey != NULL;
+ tmpkey = ISC_LIST_NEXT(tmpkey, link)) {
+ if (dst_key_alg(key->key) != dst_key_alg(tmpkey->key))
+ continue;
+ if (REVOKE(tmpkey->key))
+ continue;
+ if (isksk(tmpkey))
+ have_ksk = ISC_TRUE;
+ else
+ have_non_ksk = ISC_TRUE;
+ }
+ if (have_ksk && have_non_ksk && !isksk(key))
continue;
dns_rdata_init(&rdata);
dns_rdata_init(&ds);
@@ -2848,7 +3183,7 @@ writeset(const char *prefix, dns_rdatatype_t type) {
} else
result = dns_difftuple_create(mctx, DNS_DIFFOP_ADD,
- gorigin, zonettl,
+ gorigin, zone_soa_min_ttl,
&rdata, &tuple);
check_result(result, "dns_difftuple_create");
dns_diff_append(&diff, &tuple);
@@ -2893,6 +3228,9 @@ print_version(FILE *fp) {
fprintf(fp, "; dnssec_signzone version " VERSION "\n");
}
+ISC_PLATFORM_NORETURN_PRE static void
+usage(void) ISC_PLATFORM_NORETURN_POST;
+
static void
usage(void) {
fprintf(stderr, "Usage:\n");
@@ -2903,14 +3241,18 @@ usage(void) {
fprintf(stderr, "Version: %s\n", VERSION);
fprintf(stderr, "Options: (default value in parenthesis) \n");
- fprintf(stderr, "\t-c class (IN)\n");
- fprintf(stderr, "\t-d directory\n");
- fprintf(stderr, "\t\tdirectory to find keyset files (.)\n");
+ fprintf(stderr, "\t-S:\tsmart signing: automatically finds key files\n"
+ "\t\tfor the zone and determines how they are to "
+ "be used\n");
+ fprintf(stderr, "\t-K directory:\n");
+ fprintf(stderr, "\t\tdirectory to find key files (.)\n");
+ fprintf(stderr, "\t-d directory:\n");
+ fprintf(stderr, "\t\tdirectory to find dsset-* files (.)\n");
fprintf(stderr, "\t-g:\t");
- fprintf(stderr, "generate DS records from keyset files\n");
+ fprintf(stderr, "update DS records based on child zones' "
+ "dsset-* files\n");
fprintf(stderr, "\t-s [YYYYMMDDHHMMSS|+offset]:\n");
- fprintf(stderr, "\t\tRRSIG start time - absolute|offset "
- "(now - 1 hour)\n");
+ fprintf(stderr, "\t\tRRSIG start time - absolute|offset (now - 1 hour)\n");
fprintf(stderr, "\t-e [YYYYMMDDHHMMSS|+offset|\"now\"+offset]:\n");
fprintf(stderr, "\t\tRRSIG end time - absolute|from start|from now "
"(now + 30 days)\n");
@@ -2918,8 +3260,7 @@ usage(void) {
fprintf(stderr, "\t\tcycle interval - resign "
"if < interval from end ( (end-start)/4 )\n");
fprintf(stderr, "\t-j jitter:\n");
- fprintf(stderr, "\t\trandomize signature end time up to jitter "
- "seconds\n");
+ fprintf(stderr, "\t\trandomize signature end time up to jitter seconds\n");
fprintf(stderr, "\t-v debuglevel (0)\n");
fprintf(stderr, "\t-o origin:\n");
fprintf(stderr, "\t\tzone origin (name of zonefile)\n");
@@ -2936,20 +3277,33 @@ usage(void) {
fprintf(stderr, "\t\ta file containing random data\n");
fprintf(stderr, "\t-a:\t");
fprintf(stderr, "verify generated signatures\n");
+ fprintf(stderr, "\t-c class (IN)\n");
+ fprintf(stderr, "\t-E engine:\n");
+#ifdef USE_PKCS11
+ fprintf(stderr, "\t\tname of an OpenSSL engine to use "
+ "(default is \"pkcs11\")\n");
+#else
+ fprintf(stderr, "\t\tname of an OpenSSL engine to use\n");
+#endif
fprintf(stderr, "\t-p:\t");
fprintf(stderr, "use pseudorandom data (faster but less secure)\n");
fprintf(stderr, "\t-P:\t");
fprintf(stderr, "disable post-sign verification\n");
+ fprintf(stderr, "\t-T TTL:\tTTL for newly added DNSKEYs\n");
fprintf(stderr, "\t-t:\t");
fprintf(stderr, "print statistics\n");
+ fprintf(stderr, "\t-u:\t");
+ fprintf(stderr, "update or replace an existing NSEC/NSEC3 chain\n");
+ fprintf(stderr, "\t-x:\tsign DNSKEY record with KSKs only, not ZSKs\n");
+ fprintf(stderr, "\t-z:\tsign all records with KSKs\n");
+ fprintf(stderr, "\t-C:\tgenerate a keyset file, for compatibility\n"
+ "\t\twith older versions of dnssec-signzone -g\n");
fprintf(stderr, "\t-n ncpus (number of cpus present)\n");
fprintf(stderr, "\t-k key_signing_key\n");
fprintf(stderr, "\t-l lookasidezone\n");
- fprintf(stderr, "\t-3 salt (NSEC3 salt)\n");
- fprintf(stderr, "\t-H iterations (NSEC3 iterations)\n");
- fprintf(stderr, "\t-A (NSEC3 optout)\n");
- fprintf(stderr, "\t-z:\t");
- fprintf(stderr, "ignore KSK flag in DNSKEYs");
+ fprintf(stderr, "\t-3 NSEC3 salt\n");
+ fprintf(stderr, "\t-H NSEC3 iterations (10)\n");
+ fprintf(stderr, "\t-A NSEC3 optout\n");
fprintf(stderr, "\n");
@@ -3001,10 +3355,15 @@ main(int argc, char *argv[]) {
int ndskeys = 0;
char *endp;
isc_time_t timer_start, timer_finish;
- signer_key_t *key;
+ dns_dnsseckey_t *key;
isc_result_t result;
isc_log_t *log = NULL;
isc_boolean_t pseudorandom = ISC_FALSE;
+#ifdef USE_PKCS11
+ const char *engine = "pkcs11";
+#else
+ const char *engine = NULL;
+#endif
unsigned int eflags;
isc_boolean_t free_output = ISC_FALSE;
int tempfilelen;
@@ -3012,13 +3371,15 @@ main(int argc, char *argv[]) {
isc_task_t **tasks = NULL;
isc_buffer_t b;
int len;
- unsigned int iterations = 100U;
- const unsigned char *salt = NULL;
- size_t salt_length = 0;
- unsigned char saltbuf[255];
hashlist_t hashlist;
+ isc_boolean_t smartsign = ISC_FALSE;
+ isc_boolean_t make_keyset = ISC_FALSE;
+ isc_boolean_t set_salt = ISC_FALSE;
+ isc_boolean_t set_optout = ISC_FALSE;
+ isc_boolean_t set_iter = ISC_FALSE;
-#define CMDLINE_FLAGS "3:aAc:d:e:f:FghH:i:I:j:k:l:m:n:N:o:O:pPr:s:StUv:z"
+#define CMDLINE_FLAGS \
+ "3:AaCc:Dd:E:e:f:FghH:i:I:j:K:k:l:m:n:N:o:O:pPr:s:ST:tuUv:xz"
/*
* Process memory debugging argument first.
@@ -3058,7 +3419,9 @@ main(int argc, char *argv[]) {
while ((ch = isc_commandline_parse(argc, argv, CMDLINE_FLAGS)) != -1) {
switch (ch) {
case '3':
- if (strcmp(isc_commandline_argument, "-")) {
+ set_salt = ISC_TRUE;
+ nsec_datatype = dns_rdatatype_nsec3;
+ if (strcmp(isc_commandline_argument, "-") != 0) {
isc_buffer_t target;
char *sarg;
@@ -3068,29 +3431,42 @@ main(int argc, char *argv[]) {
result = isc_hex_decodestring(sarg, &target);
check_result(result,
"isc_hex_decodestring(salt)");
- salt = saltbuf;
salt_length = isc_buffer_usedlength(&target);
- } else {
- salt = saltbuf;
- salt_length = 0;
}
- nsec_datatype = dns_rdatatype_nsec3;
break;
case 'A':
- nsec3flags |= DNS_NSEC3FLAG_OPTOUT;
+ set_optout = ISC_TRUE;
+ if (OPTOUT(nsec3flags))
+ nsec3flags &= ~DNS_NSEC3FLAG_OPTOUT;
+ else
+ nsec3flags |= DNS_NSEC3FLAG_OPTOUT;
break;
case 'a':
tryverify = ISC_TRUE;
break;
+ case 'C':
+ make_keyset = ISC_TRUE;
+ break;
+
case 'c':
classname = isc_commandline_argument;
break;
case 'd':
- directory = isc_commandline_argument;
+ dsdir = isc_commandline_argument;
+ if (strlen(dsdir) == 0U)
+ fatal("DS directory must be non-empty string");
+ result = try_dir(dsdir);
+ if (result != ISC_R_SUCCESS)
+ fatal("cannot open directory %s: %s",
+ dsdir, isc_result_totext(result));
+ break;
+
+ case 'E':
+ engine = isc_commandline_argument;
break;
case 'e':
@@ -3106,11 +3482,11 @@ main(int argc, char *argv[]) {
break;
case 'H':
- iterations = strtoul(isc_commandline_argument,
- &endp, 0);
+ set_iter = ISC_TRUE;
+ nsec3iter = strtoul(isc_commandline_argument, &endp, 0);
if (*endp != '\0')
fatal("iterations must be numeric");
- if (iterations > 0xffffU)
+ if (nsec3iter > 0xffffU)
fatal("iterations too big");
break;
@@ -3118,6 +3494,10 @@ main(int argc, char *argv[]) {
usage();
break;
+ case 'I':
+ inputformatstr = isc_commandline_argument;
+ break;
+
case 'i':
endp = NULL;
cycle = strtol(isc_commandline_argument, &endp, 0);
@@ -3126,10 +3506,6 @@ main(int argc, char *argv[]) {
"positive");
break;
- case 'I':
- inputformatstr = isc_commandline_argument;
- break;
-
case 'j':
endp = NULL;
jitter = strtol(isc_commandline_argument, &endp, 0);
@@ -3137,6 +3513,10 @@ main(int argc, char *argv[]) {
fatal("jitter must be numeric and positive");
break;
+ case 'K':
+ directory = isc_commandline_argument;
+ break;
+
case 'k':
if (ndskeys == MAXDSKEYS)
fatal("too many key-signing keys specified");
@@ -3150,14 +3530,18 @@ main(int argc, char *argv[]) {
dns_fixedname_init(&dlv_fixed);
dlv = dns_fixedname_name(&dlv_fixed);
- result = dns_name_fromtext(dlv, &b, dns_rootname,
- ISC_FALSE, NULL);
+ result = dns_name_fromtext(dlv, &b, dns_rootname, 0,
+ NULL);
check_result(result, "dns_name_fromtext(dlv)");
break;
case 'm':
break;
+ case 'N':
+ serialformatstr = isc_commandline_argument;
+ break;
+
case 'n':
endp = NULL;
ntasks = strtol(isc_commandline_argument, &endp, 0);
@@ -3165,38 +3549,38 @@ main(int argc, char *argv[]) {
fatal("number of cpus must be numeric");
break;
- case 'N':
- serialformatstr = isc_commandline_argument;
+ case 'O':
+ outputformatstr = isc_commandline_argument;
break;
case 'o':
origin = isc_commandline_argument;
break;
- case 'O':
- outputformatstr = isc_commandline_argument;
+ case 'P':
+ disable_zone_check = ISC_TRUE;
break;
case 'p':
pseudorandom = ISC_TRUE;
break;
- case 'P':
- disable_zone_check = ISC_TRUE;
- break;
-
case 'r':
setup_entropy(mctx, isc_commandline_argument, &ectx);
break;
+ case 'S':
+ smartsign = ISC_TRUE;
+ break;
+
case 's':
startstr = isc_commandline_argument;
break;
- case 'S':
- /* This is intentionally undocumented */
- /* -S: simple output style */
- masterstyle = &dns_master_style_simple;
+ case 'T':
+ endp = NULL;
+ set_keyttl = ISC_TRUE;
+ keyttl = strtottl(isc_commandline_argument);
break;
case 't':
@@ -3207,6 +3591,10 @@ main(int argc, char *argv[]) {
unknownalg = ISC_TRUE;
break;
+ case 'u':
+ update_chain = ISC_TRUE;
+ break;
+
case 'v':
endp = NULL;
verbose = strtol(isc_commandline_argument, &endp, 0);
@@ -3214,8 +3602,12 @@ main(int argc, char *argv[]) {
fatal("verbose level must be numeric");
break;
+ case 'x':
+ keyset_kskonly = ISC_TRUE;
+ break;
+
case 'z':
- ignoreksk = ISC_TRUE;
+ ignore_kskflag = ISC_TRUE;
break;
case 'F':
@@ -3245,20 +3637,21 @@ main(int argc, char *argv[]) {
if (result != ISC_R_SUCCESS)
fatal("could not create hash context");
- result = dst_lib_init(mctx, ectx, eflags);
+ result = dst_lib_init2(mctx, ectx, engine, eflags);
if (result != ISC_R_SUCCESS)
- fatal("could not initialize dst");
+ fatal("could not initialize dst: %s",
+ isc_result_totext(result));
isc_stdtime_get(&now);
- if (startstr != NULL)
+ if (startstr != NULL) {
starttime = strtotime(startstr, now, now);
- else
+ } else
starttime = now - 3600; /* Allow for some clock skew. */
- if (endstr != NULL)
+ if (endstr != NULL) {
endtime = strtotime(endstr, now, starttime);
- else
+ } else
endtime = starttime + (30 * 24 * 60 * 60);
if (cycle == -1)
@@ -3270,6 +3663,9 @@ main(int argc, char *argv[]) {
rdclass = strtoclass(classname);
+ if (directory == NULL)
+ directory = ".";
+
setup_logging(verbose, mctx, &log);
argc -= isc_commandline_index;
@@ -3335,7 +3731,19 @@ main(int argc, char *argv[]) {
loadzone(file, origin, rdclass, &gdb);
gorigin = dns_db_origin(gdb);
gclass = dns_db_class(gdb);
- zonettl = soattl();
+ get_soa_ttls();
+
+ if (!set_keyttl)
+ keyttl = soa_ttl;
+
+ /*
+ * Check for any existing NSEC3 parameters in the zone,
+ * and use them as defaults if -u was not specified.
+ */
+ if (update_chain && !set_optout && !set_iter && !set_salt)
+ nsec_datatype = dns_rdatatype_nsec;
+ else
+ set_nsec3params(update_chain, set_salt, set_optout, set_iter);
if (IS_NSEC3) {
isc_boolean_t answer;
@@ -3356,95 +3764,42 @@ main(int argc, char *argv[]) {
ISC_LIST_INIT(keylist);
isc_rwlock_init(&keylist_lock, 0, 0);
- if (argc == 0) {
- loadzonekeys(gdb);
- } else {
- for (i = 0; i < argc; i++) {
- dst_key_t *newkey = NULL;
-
- result = dst_key_fromnamedfile(argv[i],
- DST_TYPE_PUBLIC |
- DST_TYPE_PRIVATE,
- mctx, &newkey);
- if (result != ISC_R_SUCCESS)
- fatal("cannot load dnskey %s: %s", argv[i],
- isc_result_totext(result));
-
- if (!dns_name_equal(gorigin, dst_key_name(newkey)))
- fatal("key %s not at origin\n", argv[i]);
-
- key = ISC_LIST_HEAD(keylist);
- while (key != NULL) {
- dst_key_t *dkey = key->key;
- if (dst_key_id(dkey) == dst_key_id(newkey) &&
- dst_key_alg(dkey) == dst_key_alg(newkey) &&
- dns_name_equal(dst_key_name(dkey),
- dst_key_name(newkey)))
- {
- if (!dst_key_isprivate(dkey))
- fatal("cannot sign zone with "
- "non-private dnskey %s",
- argv[i]);
- break;
- }
- key = ISC_LIST_NEXT(key, link);
- }
- if (key == NULL) {
- key = newkeystruct(newkey, ISC_TRUE);
- key->commandline = ISC_TRUE;
- ISC_LIST_APPEND(keylist, key, link);
- } else
- dst_key_free(&newkey);
- }
-
- loadzonepubkeys(gdb);
- }
-
- for (i = 0; i < ndskeys; i++) {
- dst_key_t *newkey = NULL;
-
- result = dst_key_fromnamedfile(dskeyfile[i],
- DST_TYPE_PUBLIC |
- DST_TYPE_PRIVATE,
- mctx, &newkey);
- if (result != ISC_R_SUCCESS)
- fatal("cannot load dnskey %s: %s", dskeyfile[i],
- isc_result_totext(result));
+ /*
+ * Fill keylist with:
+ * 1) Keys listed in the DNSKEY set that have
+ * private keys associated, *if* no keys were
+ * set on the command line.
+ * 2) ZSKs set on the command line
+ * 3) KSKs set on the command line
+ * 4) Any keys remaining in the DNSKEY set which
+ * do not have private keys associated and were
+ * not specified on the command line.
+ */
+ if (argc == 0 || smartsign)
+ loadzonekeys(!smartsign, ISC_FALSE);
+ loadexplicitkeys(argv, argc, ISC_FALSE);
+ loadexplicitkeys(dskeyfile, ndskeys, ISC_TRUE);
+ loadzonekeys(!smartsign, ISC_TRUE);
- if (!dns_name_equal(gorigin, dst_key_name(newkey)))
- fatal("key %s not at origin\n", dskeyfile[i]);
+ /*
+ * If we're doing smart signing, look in the key repository for
+ * key files with metadata, and merge them with the keylist
+ * we have now.
+ */
+ if (smartsign)
+ build_final_keylist();
- key = ISC_LIST_HEAD(keylist);
- while (key != NULL) {
- dst_key_t *dkey = key->key;
- if (dst_key_id(dkey) == dst_key_id(newkey) &&
- dst_key_alg(dkey) == dst_key_alg(newkey) &&
- dns_name_equal(dst_key_name(dkey),
- dst_key_name(newkey)))
- {
- /* Override key flags. */
- key->issigningkey = ISC_TRUE;
- key->isksk = ISC_TRUE;
- key->isdsk = ISC_FALSE;
- dst_key_free(&dkey);
- key->key = newkey;
- break;
- }
- key = ISC_LIST_NEXT(key, link);
- }
- if (key == NULL) {
- /* Override dnskey flags. */
- key = newkeystruct(newkey, ISC_TRUE);
- key->isksk = ISC_TRUE;
- key->isdsk = ISC_FALSE;
- ISC_LIST_APPEND(keylist, key, link);
- }
+ /* Now enumerate the key list */
+ for (key = ISC_LIST_HEAD(keylist);
+ key != NULL;
+ key = ISC_LIST_NEXT(key, link)) {
+ key->index = keycount++;
}
- if (ISC_LIST_EMPTY(keylist)) {
+ if (keycount == 0) {
if (disable_zone_check)
fprintf(stderr, "%s: warning: No keys specified "
- "or found\n", program);
+ "or found\n", program);
else
fatal("No signing keys specified or found.");
nokeys = ISC_TRUE;
@@ -3454,7 +3809,7 @@ main(int argc, char *argv[]) {
unsigned int max;
result = dns_nsec3_maxiterations(gdb, NULL, mctx, &max);
check_result(result, "dns_nsec3_maxiterations()");
- if (iterations > max)
+ if (nsec3iter > max)
fatal("NSEC3 iterations too big for weakest DNSKEY "
"strength. Maximum iterations allowed %u.", max);
}
@@ -3478,15 +3833,18 @@ main(int argc, char *argv[]) {
break;
}
+ remove_duplicates();
+
if (IS_NSEC3)
- nsec3ify(dns_hash_sha1, iterations, salt, salt_length,
+ nsec3ify(dns_hash_sha1, nsec3iter, salt, salt_length,
&hashlist);
else
nsecify();
if (!nokeys) {
- writeset("keyset-", dns_rdatatype_dnskey);
writeset("dsset-", dns_rdatatype_ds);
+ if (make_keyset)
+ writeset("keyset-", dns_rdatatype_dnskey);
if (dlv != NULL) {
writeset("dlvset-", dns_rdatatype_dlv);
}
@@ -3591,8 +3949,7 @@ main(int argc, char *argv[]) {
while (!ISC_LIST_EMPTY(keylist)) {
key = ISC_LIST_HEAD(keylist);
ISC_LIST_UNLINK(keylist, key, link);
- dst_key_free(&key->key);
- isc_mem_put(mctx, key, sizeof(signer_key_t));
+ dns_dnsseckey_destroy(mctx, &key);
}
isc_mem_put(mctx, tempfile, tempfilelen);
diff --git a/contrib/bind9/bin/dnssec/dnssec-signzone.docbook b/contrib/bind9/bin/dnssec/dnssec-signzone.docbook
index 87a801e..51a1496 100644
--- a/contrib/bind9/bin/dnssec/dnssec-signzone.docbook
+++ b/contrib/bind9/bin/dnssec/dnssec-signzone.docbook
@@ -18,10 +18,10 @@
- PERFORMANCE OF THIS SOFTWARE.
-->
-<!-- $Id: dnssec-signzone.docbook,v 1.31.44.8 2009-11-06 21:36:22 each Exp $ -->
+<!-- $Id: dnssec-signzone.docbook,v 1.44 2009-12-03 23:18:16 each Exp $ -->
<refentry id="man.dnssec-signzone">
<refentryinfo>
- <date>June 08, 2009</date>
+ <date>June 05, 2009</date>
</refentryinfo>
<refmeta>
@@ -60,10 +60,12 @@
<arg><option>-a</option></arg>
<arg><option>-c <replaceable class="parameter">class</replaceable></option></arg>
<arg><option>-d <replaceable class="parameter">directory</replaceable></option></arg>
+ <arg><option>-E <replaceable class="parameter">engine</replaceable></option></arg>
<arg><option>-e <replaceable class="parameter">end-time</replaceable></option></arg>
<arg><option>-f <replaceable class="parameter">output-file</replaceable></option></arg>
<arg><option>-g</option></arg>
<arg><option>-h</option></arg>
+ <arg><option>-K <replaceable class="parameter">directory</replaceable></option></arg>
<arg><option>-k <replaceable class="parameter">key</replaceable></option></arg>
<arg><option>-l <replaceable class="parameter">domain</replaceable></option></arg>
<arg><option>-i <replaceable class="parameter">interval</replaceable></option></arg>
@@ -75,9 +77,13 @@
<arg><option>-p</option></arg>
<arg><option>-P</option></arg>
<arg><option>-r <replaceable class="parameter">randomdev</replaceable></option></arg>
+ <arg><option>-S</option></arg>
<arg><option>-s <replaceable class="parameter">start-time</replaceable></option></arg>
+ <arg><option>-T <replaceable class="parameter">ttl</replaceable></option></arg>
<arg><option>-t</option></arg>
+ <arg><option>-u</option></arg>
<arg><option>-v <replaceable class="parameter">level</replaceable></option></arg>
+ <arg><option>-x</option></arg>
<arg><option>-z</option></arg>
<arg><option>-3 <replaceable class="parameter">salt</replaceable></option></arg>
<arg><option>-H <replaceable class="parameter">iterations</replaceable></option></arg>
@@ -92,10 +98,10 @@
<para><command>dnssec-signzone</command>
signs a zone. It generates
NSEC and RRSIG records and produces a signed version of the
- zone. It also generates a <filename>keyset-</filename> file containing
- the key-signing keys for the zone, and if signing a zone which
- contains delegations, it can optionally generate DS records for
- the child zones from their <filename>keyset-</filename> files.
+ zone. The security status of delegations from the signed zone
+ (that is, whether the child zones are secure or not) is
+ determined by the presence or absence of a
+ <filename>keyset</filename> file for each child zone.
</para>
</refsect1>
@@ -122,31 +128,37 @@
</varlistentry>
<varlistentry>
- <term>-k <replaceable class="parameter">key</replaceable></term>
+ <term>-C</term>
<listitem>
<para>
- Treat specified key as a key signing key ignoring any
- key flags. This option may be specified multiple times.
+ Compatibility mode: Generate a
+ <filename>keyset-<replaceable>zonename</replaceable></filename>
+ file in addition to
+ <filename>dsset-<replaceable>zonename</replaceable></filename>
+ when signing a zone, for use by older versions of
+ <command>dnssec-signzone</command>.
</para>
</listitem>
</varlistentry>
<varlistentry>
- <term>-l <replaceable class="parameter">domain</replaceable></term>
+ <term>-d <replaceable class="parameter">directory</replaceable></term>
<listitem>
<para>
- Generate a DLV set in addition to the key (DNSKEY) and DS sets.
- The domain is appended to the name of the records.
+ Look for <filename>dsset-</filename> or
+ <filename>keyset-</filename> files in <option>directory</option>.
</para>
</listitem>
</varlistentry>
<varlistentry>
- <term>-d <replaceable class="parameter">directory</replaceable></term>
+ <term>-E <replaceable class="parameter">engine</replaceable></term>
<listitem>
<para>
- Look for <filename>keyset</filename> files in
- <option>directory</option> as the directory
+ Uses a crypto hardware (OpenSSL engine) for the crypto operations
+ it supports, for instance signing with private keys from
+ a secure key store. When compiled with PKCS#11 support
+ it defaults to pkcs11; the empty name resets it to no engine.
</para>
</listitem>
</varlistentry>
@@ -155,10 +167,39 @@
<term>-g</term>
<listitem>
<para>
- If the zone contains any delegations, and there are
- <filename>keyset-</filename> files for any of the child zones,
- then DS records for the child zones will be generated from the
- keys in those files. Existing DS records will be removed.
+ Generate DS records for child zones from
+ <filename>dsset-</filename> or <filename>keyset-</filename>
+ file. Existing DS records will be removed.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>-K <replaceable class="parameter">directory</replaceable></term>
+ <listitem>
+ <para>
+ Key repository: Specify a directory to search for DNSSEC keys.
+ If not specified, defaults to the current directory.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>-k <replaceable class="parameter">key</replaceable></term>
+ <listitem>
+ <para>
+ Treat specified key as a key signing key ignoring any
+ key flags. This option may be specified multiple times.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>-l <replaceable class="parameter">domain</replaceable></term>
+ <listitem>
+ <para>
+ Generate a DLV set in addition to the key (DNSKEY) and DS sets.
+ The domain is appended to the name of the records.
</para>
</listitem>
</varlistentry>
@@ -190,6 +231,8 @@
the start time. A time relative to the current time is
indicated with now+N. If no <option>end-time</option> is
specified, 30 days from the start time is used as a default.
+ <option>end-time</option> must be later than
+ <option>start-time</option>.
</para>
</listitem>
</varlistentry>
@@ -396,6 +439,89 @@
</varlistentry>
<varlistentry>
+ <term>-S</term>
+ <listitem>
+ <para>
+ Smart signing: Instructs <command>dnssec-signzone</command> to
+ search the key repository for keys that match the zone being
+ signed, and to include them in the zone if appropriate.
+ </para>
+ <para>
+ When a key is found, its timing metadata is examined to
+ determine how it should be used, according to the following
+ rules. Each successive rule takes priority over the prior
+ ones:
+ </para>
+ <variablelist>
+ <varlistentry>
+ <listitem>
+ <para>
+ If no timing metadata has been set for the key, the key is
+ published in the zone and used to sign the zone.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <listitem>
+ <para>
+ If the key's publication date is set and is in the past, the
+ key is published in the zone.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <listitem>
+ <para>
+ If the key's activation date is set and in the past, the
+ key is published (regardless of publication date) and
+ used to sign the zone.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <listitem>
+ <para>
+ If the key's revocation date is set and in the past, and the
+ key is published, then the key is revoked, and the revoked key
+ is used to sign the zone.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <listitem>
+ <para>
+ If either of the key's unpublication or deletion dates are set
+ and in the past, the key is NOT published or used to sign the
+ zone, regardless of any other metadata.
+ </para>
+ </listitem>
+ </varlistentry>
+ </variablelist>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>-T <replaceable class="parameter">ttl</replaceable></term>
+ <listitem>
+ <para>
+ Specifies the TTL to be used for new DNSKEY records imported
+ into the zone from the key repository. If not specified,
+ the default is the minimum TTL value from the zone's SOA
+ record. This option is ignored when signing without
+ <option>-S</option>, since DNSKEY records are not imported
+ from the key repository in that case. It is also ignored if
+ there are any pre-existing DNSKEY records at the zone apex,
+ in which case new records' TTL values will be set to match
+ them.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
<term>-t</term>
<listitem>
<para>
@@ -405,6 +531,20 @@
</varlistentry>
<varlistentry>
+ <term>-u</term>
+ <listitem>
+ <para>
+ Update NSEC/NSEC3 chain when re-signing a previously signed
+ zone. With this option, a zone signed with NSEC can be
+ switched to NSEC3, or a zone signed with NSEC3 can
+ be switch to NSEC or to NSEC3 with different parameters.
+ Without this option, <command>dnssec-signzone</command> will
+ retain the existing chain when re-signing.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
<term>-v <replaceable class="parameter">level</replaceable></term>
<listitem>
<para>
@@ -414,10 +554,26 @@
</varlistentry>
<varlistentry>
+ <term>-x</term>
+ <listitem>
+ <para>
+ Only sign the DNSKEY RRset with key-signing keys, and omit
+ signatures from zone-signing keys. (This is similar to the
+ <command>dnssec-dnskey-kskonly yes;</command> zone option in
+ <command>named</command>.)
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
<term>-z</term>
<listitem>
<para>
- Ignore KSK flag on key when determining what to sign.
+ Ignore KSK flag on key when determining what to sign. This
+ causes KSK-flagged keys to sign all records, not just the
+ DNSKEY RRset. (This is similar to the
+ <command>update-check-ksk no;</command> zone option in
+ <command>named</command>.)
</para>
</listitem>
</varlistentry>
@@ -426,7 +582,7 @@
<term>-3 <replaceable class="parameter">salt</replaceable></term>
<listitem>
<para>
- Generate a NSEC3 chain with the given hex encoded salt.
+ Generate an NSEC3 chain with the given hex encoded salt.
A dash (<replaceable class="parameter">salt</replaceable>) can
be used to indicate that no salt is to be used when generating the NSEC3 chain.
</para>
@@ -437,8 +593,8 @@
<term>-H <replaceable class="parameter">iterations</replaceable></term>
<listitem>
<para>
- When generating a NSEC3 chain use this many interations. The
- default is 100.
+ When generating an NSEC3 chain, use this many interations. The
+ default is 10.
</para>
</listitem>
</varlistentry>
@@ -447,10 +603,16 @@
<term>-A</term>
<listitem>
<para>
- When generating a NSEC3 chain set the OPTOUT flag on all
+ When generating an NSEC3 chain set the OPTOUT flag on all
NSEC3 records and do not generate NSEC3 records for insecure
delegations.
</para>
+ <para>
+ Using this option twice (i.e., <option>-AA</option>)
+ turns the OPTOUT flag off for all records. This is useful
+ when using the <option>-u</option> option to modify an NSEC3
+ chain which previously had OPTOUT set.
+ </para>
</listitem>
</varlistentry>
@@ -484,10 +646,11 @@
<para>
The following command signs the <userinput>example.com</userinput>
zone with the DSA key generated by <command>dnssec-keygen</command>
- (Kexample.com.+003+17247). The zone's keys must be in the master
- file (<filename>db.example.com</filename>). This invocation looks
- for <filename>keyset</filename> files, in the current directory,
- so that DS records can be generated from them (<command>-g</command>).
+ (Kexample.com.+003+17247). Because the <command>-S</command> option
+ is not being used, the zone's keys must be in the master file
+ (<filename>db.example.com</filename>). This invocation looks
+ for <filename>dsset</filename> files, in the current directory,
+ so that DS records can be imported from them (<command>-g</command>).
</para>
<programlisting>% dnssec-signzone -g -o example.com db.example.com \
Kexample.com.+003+17247
@@ -510,33 +673,6 @@ db.example.com.signed
</refsect1>
<refsect1>
- <title>KNOWN BUGS</title>
- <para>
- <command>dnssec-signzone</command> was designed so that it could
- sign a zone partially, using only a subset of the DNSSEC keys
- needed to produce a fully-signed zone. This permits a zone
- administrator, for example, to sign a zone with one key on one
- machine, move the resulting partially-signed zone to a second
- machine, and sign it again with a second key.
- </para>
- <para>
- An unfortunate side-effect of this flexibility is that
- <command>dnssec-signzone</command> does not check to make sure
- it's signing a zone with any valid keys at all. An attempt to
- sign a zone without any keys will appear to succeed, producing
- a "signed" zone with no signatures. There is no warning issued
- when a zone is not fully signed.
- </para>
-
- <para>
- This will be corrected in a future release. In the meantime, ISC
- recommends examining the output of <command>dnssec-signzone</command>
- to confirm that the zone is properly signed by all keys before
- using it.
- </para>
- </refsect1>
-
- <refsect1>
<title>SEE ALSO</title>
<para><citerefentry>
<refentrytitle>dnssec-keygen</refentrytitle><manvolnum>8</manvolnum>
diff --git a/contrib/bind9/bin/dnssec/dnssec-signzone.html b/contrib/bind9/bin/dnssec/dnssec-signzone.html
index 1d4ecff..28e7158 100644
--- a/contrib/bind9/bin/dnssec/dnssec-signzone.html
+++ b/contrib/bind9/bin/dnssec/dnssec-signzone.html
@@ -14,7 +14,7 @@
- OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
- PERFORMANCE OF THIS SOFTWARE.
-->
-<!-- $Id: dnssec-signzone.html,v 1.33.44.8 2009-11-07 01:56:11 tbox Exp $ -->
+<!-- $Id: dnssec-signzone.html,v 1.45 2009-12-04 01:13:44 tbox Exp $ -->
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
@@ -29,21 +29,21 @@
</div>
<div class="refsynopsisdiv">
<h2>Synopsis</h2>
-<div class="cmdsynopsis"><p><code class="command">dnssec-signzone</code> [<code class="option">-a</code>] [<code class="option">-c <em class="replaceable"><code>class</code></em></code>] [<code class="option">-d <em class="replaceable"><code>directory</code></em></code>] [<code class="option">-e <em class="replaceable"><code>end-time</code></em></code>] [<code class="option">-f <em class="replaceable"><code>output-file</code></em></code>] [<code class="option">-g</code>] [<code class="option">-h</code>] [<code class="option">-k <em class="replaceable"><code>key</code></em></code>] [<code class="option">-l <em class="replaceable"><code>domain</code></em></code>] [<code class="option">-i <em class="replaceable"><code>interval</code></em></code>] [<code class="option">-I <em class="replaceable"><code>input-format</code></em></code>] [<code class="option">-j <em class="replaceable"><code>jitter</code></em></code>] [<code class="option">-N <em class="replaceable"><code>soa-serial-format</code></em></code>] [<code class="option">-o <em class="replaceable"><code>origin</code></em></code>] [<code class="option">-O <em class="replaceable"><code>output-format</code></em></code>] [<code class="option">-p</code>] [<code class="option">-P</code>] [<code class="option">-r <em class="replaceable"><code>randomdev</code></em></code>] [<code class="option">-s <em class="replaceable"><code>start-time</code></em></code>] [<code class="option">-t</code>] [<code class="option">-v <em class="replaceable"><code>level</code></em></code>] [<code class="option">-z</code>] [<code class="option">-3 <em class="replaceable"><code>salt</code></em></code>] [<code class="option">-H <em class="replaceable"><code>iterations</code></em></code>] [<code class="option">-A</code>] {zonefile} [key...]</p></div>
+<div class="cmdsynopsis"><p><code class="command">dnssec-signzone</code> [<code class="option">-a</code>] [<code class="option">-c <em class="replaceable"><code>class</code></em></code>] [<code class="option">-d <em class="replaceable"><code>directory</code></em></code>] [<code class="option">-E <em class="replaceable"><code>engine</code></em></code>] [<code class="option">-e <em class="replaceable"><code>end-time</code></em></code>] [<code class="option">-f <em class="replaceable"><code>output-file</code></em></code>] [<code class="option">-g</code>] [<code class="option">-h</code>] [<code class="option">-K <em class="replaceable"><code>directory</code></em></code>] [<code class="option">-k <em class="replaceable"><code>key</code></em></code>] [<code class="option">-l <em class="replaceable"><code>domain</code></em></code>] [<code class="option">-i <em class="replaceable"><code>interval</code></em></code>] [<code class="option">-I <em class="replaceable"><code>input-format</code></em></code>] [<code class="option">-j <em class="replaceable"><code>jitter</code></em></code>] [<code class="option">-N <em class="replaceable"><code>soa-serial-format</code></em></code>] [<code class="option">-o <em class="replaceable"><code>origin</code></em></code>] [<code class="option">-O <em class="replaceable"><code>output-format</code></em></code>] [<code class="option">-p</code>] [<code class="option">-P</code>] [<code class="option">-r <em class="replaceable"><code>randomdev</code></em></code>] [<code class="option">-S</code>] [<code class="option">-s <em class="replaceable"><code>start-time</code></em></code>] [<code class="option">-T <em class="replaceable"><code>ttl</code></em></code>] [<code class="option">-t</code>] [<code class="option">-u</code>] [<code class="option">-v <em class="replaceable"><code>level</code></em></code>] [<code class="option">-x</code>] [<code class="option">-z</code>] [<code class="option">-3 <em class="replaceable"><code>salt</code></em></code>] [<code class="option">-H <em class="replaceable"><code>iterations</code></em></code>] [<code class="option">-A</code>] {zonefile} [key...]</p></div>
</div>
<div class="refsect1" lang="en">
-<a name="id2543558"></a><h2>DESCRIPTION</h2>
+<a name="id2543596"></a><h2>DESCRIPTION</h2>
<p><span><strong class="command">dnssec-signzone</strong></span>
signs a zone. It generates
NSEC and RRSIG records and produces a signed version of the
- zone. It also generates a <code class="filename">keyset-</code> file containing
- the key-signing keys for the zone, and if signing a zone which
- contains delegations, it can optionally generate DS records for
- the child zones from their <code class="filename">keyset-</code> files.
+ zone. The security status of delegations from the signed zone
+ (that is, whether the child zones are secure or not) is
+ determined by the presence or absence of a
+ <code class="filename">keyset</code> file for each child zone.
</p>
</div>
<div class="refsect1" lang="en">
-<a name="id2543576"></a><h2>OPTIONS</h2>
+<a name="id2543611"></a><h2>OPTIONS</h2>
<div class="variablelist"><dl>
<dt><span class="term">-a</span></dt>
<dd><p>
@@ -53,6 +53,38 @@
<dd><p>
Specifies the DNS class of the zone.
</p></dd>
+<dt><span class="term">-C</span></dt>
+<dd><p>
+ Compatibility mode: Generate a
+ <code class="filename">keyset-<em class="replaceable"><code>zonename</code></em></code>
+ file in addition to
+ <code class="filename">dsset-<em class="replaceable"><code>zonename</code></em></code>
+ when signing a zone, for use by older versions of
+ <span><strong class="command">dnssec-signzone</strong></span>.
+ </p></dd>
+<dt><span class="term">-d <em class="replaceable"><code>directory</code></em></span></dt>
+<dd><p>
+ Look for <code class="filename">dsset-</code> or
+ <code class="filename">keyset-</code> files in <code class="option">directory</code>.
+ </p></dd>
+<dt><span class="term">-E <em class="replaceable"><code>engine</code></em></span></dt>
+<dd><p>
+ Uses a crypto hardware (OpenSSL engine) for the crypto operations
+ it supports, for instance signing with private keys from
+ a secure key store. When compiled with PKCS#11 support
+ it defaults to pkcs11; the empty name resets it to no engine.
+ </p></dd>
+<dt><span class="term">-g</span></dt>
+<dd><p>
+ Generate DS records for child zones from
+ <code class="filename">dsset-</code> or <code class="filename">keyset-</code>
+ file. Existing DS records will be removed.
+ </p></dd>
+<dt><span class="term">-K <em class="replaceable"><code>directory</code></em></span></dt>
+<dd><p>
+ Key repository: Specify a directory to search for DNSSEC keys.
+ If not specified, defaults to the current directory.
+ </p></dd>
<dt><span class="term">-k <em class="replaceable"><code>key</code></em></span></dt>
<dd><p>
Treat specified key as a key signing key ignoring any
@@ -63,18 +95,6 @@
Generate a DLV set in addition to the key (DNSKEY) and DS sets.
The domain is appended to the name of the records.
</p></dd>
-<dt><span class="term">-d <em class="replaceable"><code>directory</code></em></span></dt>
-<dd><p>
- Look for <code class="filename">keyset</code> files in
- <code class="option">directory</code> as the directory
- </p></dd>
-<dt><span class="term">-g</span></dt>
-<dd><p>
- If the zone contains any delegations, and there are
- <code class="filename">keyset-</code> files for any of the child zones,
- then DS records for the child zones will be generated from the
- keys in those files. Existing DS records will be removed.
- </p></dd>
<dt><span class="term">-s <em class="replaceable"><code>start-time</code></em></span></dt>
<dd><p>
Specify the date and time when the generated RRSIG records
@@ -95,6 +115,8 @@
the start time. A time relative to the current time is
indicated with now+N. If no <code class="option">end-time</code> is
specified, 30 days from the start time is used as a default.
+ <code class="option">end-time</code> must be later than
+ <code class="option">start-time</code>.
</p></dd>
<dt><span class="term">-f <em class="replaceable"><code>output-file</code></em></span></dt>
<dd><p>
@@ -229,35 +251,119 @@
<code class="filename">keyboard</code> indicates that keyboard
input should be used.
</p></dd>
+<dt><span class="term">-S</span></dt>
+<dd>
+<p>
+ Smart signing: Instructs <span><strong class="command">dnssec-signzone</strong></span> to
+ search the key repository for keys that match the zone being
+ signed, and to include them in the zone if appropriate.
+ </p>
+<p>
+ When a key is found, its timing metadata is examined to
+ determine how it should be used, according to the following
+ rules. Each successive rule takes priority over the prior
+ ones:
+ </p>
+<div class="variablelist"><dl>
+<dt></dt>
+<dd><p>
+ If no timing metadata has been set for the key, the key is
+ published in the zone and used to sign the zone.
+ </p></dd>
+<dt></dt>
+<dd><p>
+ If the key's publication date is set and is in the past, the
+ key is published in the zone.
+ </p></dd>
+<dt></dt>
+<dd><p>
+ If the key's activation date is set and in the past, the
+ key is published (regardless of publication date) and
+ used to sign the zone.
+ </p></dd>
+<dt></dt>
+<dd><p>
+ If the key's revocation date is set and in the past, and the
+ key is published, then the key is revoked, and the revoked key
+ is used to sign the zone.
+ </p></dd>
+<dt></dt>
+<dd><p>
+ If either of the key's unpublication or deletion dates are set
+ and in the past, the key is NOT published or used to sign the
+ zone, regardless of any other metadata.
+ </p></dd>
+</dl></div>
+</dd>
+<dt><span class="term">-T <em class="replaceable"><code>ttl</code></em></span></dt>
+<dd><p>
+ Specifies the TTL to be used for new DNSKEY records imported
+ into the zone from the key repository. If not specified,
+ the default is the minimum TTL value from the zone's SOA
+ record. This option is ignored when signing without
+ <code class="option">-S</code>, since DNSKEY records are not imported
+ from the key repository in that case. It is also ignored if
+ there are any pre-existing DNSKEY records at the zone apex,
+ in which case new records' TTL values will be set to match
+ them.
+ </p></dd>
<dt><span class="term">-t</span></dt>
<dd><p>
Print statistics at completion.
</p></dd>
+<dt><span class="term">-u</span></dt>
+<dd><p>
+ Update NSEC/NSEC3 chain when re-signing a previously signed
+ zone. With this option, a zone signed with NSEC can be
+ switched to NSEC3, or a zone signed with NSEC3 can
+ be switch to NSEC or to NSEC3 with different parameters.
+ Without this option, <span><strong class="command">dnssec-signzone</strong></span> will
+ retain the existing chain when re-signing.
+ </p></dd>
<dt><span class="term">-v <em class="replaceable"><code>level</code></em></span></dt>
<dd><p>
Sets the debugging level.
</p></dd>
+<dt><span class="term">-x</span></dt>
+<dd><p>
+ Only sign the DNSKEY RRset with key-signing keys, and omit
+ signatures from zone-signing keys. (This is similar to the
+ <span><strong class="command">dnssec-dnskey-kskonly yes;</strong></span> zone option in
+ <span><strong class="command">named</strong></span>.)
+ </p></dd>
<dt><span class="term">-z</span></dt>
<dd><p>
- Ignore KSK flag on key when determining what to sign.
+ Ignore KSK flag on key when determining what to sign. This
+ causes KSK-flagged keys to sign all records, not just the
+ DNSKEY RRset. (This is similar to the
+ <span><strong class="command">update-check-ksk no;</strong></span> zone option in
+ <span><strong class="command">named</strong></span>.)
</p></dd>
<dt><span class="term">-3 <em class="replaceable"><code>salt</code></em></span></dt>
<dd><p>
- Generate a NSEC3 chain with the given hex encoded salt.
+ Generate an NSEC3 chain with the given hex encoded salt.
A dash (<em class="replaceable"><code>salt</code></em>) can
be used to indicate that no salt is to be used when generating the NSEC3 chain.
</p></dd>
<dt><span class="term">-H <em class="replaceable"><code>iterations</code></em></span></dt>
<dd><p>
- When generating a NSEC3 chain use this many interations. The
- default is 100.
+ When generating an NSEC3 chain, use this many interations. The
+ default is 10.
</p></dd>
<dt><span class="term">-A</span></dt>
-<dd><p>
- When generating a NSEC3 chain set the OPTOUT flag on all
+<dd>
+<p>
+ When generating an NSEC3 chain set the OPTOUT flag on all
NSEC3 records and do not generate NSEC3 records for insecure
delegations.
- </p></dd>
+ </p>
+<p>
+ Using this option twice (i.e., <code class="option">-AA</code>)
+ turns the OPTOUT flag off for all records. This is useful
+ when using the <code class="option">-u</code> option to modify an NSEC3
+ chain which previously had OPTOUT set.
+ </p>
+</dd>
<dt><span class="term">zonefile</span></dt>
<dd><p>
The file containing the zone to be signed.
@@ -273,14 +379,15 @@
</dl></div>
</div>
<div class="refsect1" lang="en">
-<a name="id2544503"></a><h2>EXAMPLE</h2>
+<a name="id2544896"></a><h2>EXAMPLE</h2>
<p>
The following command signs the <strong class="userinput"><code>example.com</code></strong>
zone with the DSA key generated by <span><strong class="command">dnssec-keygen</strong></span>
- (Kexample.com.+003+17247). The zone's keys must be in the master
- file (<code class="filename">db.example.com</code>). This invocation looks
- for <code class="filename">keyset</code> files, in the current directory,
- so that DS records can be generated from them (<span><strong class="command">-g</strong></span>).
+ (Kexample.com.+003+17247). Because the <span><strong class="command">-S</strong></span> option
+ is not being used, the zone's keys must be in the master file
+ (<code class="filename">db.example.com</code>). This invocation looks
+ for <code class="filename">dsset</code> files, in the current directory,
+ so that DS records can be imported from them (<span><strong class="command">-g</strong></span>).
</p>
<pre class="programlisting">% dnssec-signzone -g -o example.com db.example.com \
Kexample.com.+003+17247
@@ -302,39 +409,14 @@ db.example.com.signed
%</pre>
</div>
<div class="refsect1" lang="en">
-<a name="id2544554"></a><h2>KNOWN BUGS</h2>
-<p>
- <span><strong class="command">dnssec-signzone</strong></span> was designed so that it could
- sign a zone partially, using only a subset of the DNSSEC keys
- needed to produce a fully-signed zone. This permits a zone
- administrator, for example, to sign a zone with one key on one
- machine, move the resulting partially-signed zone to a second
- machine, and sign it again with a second key.
- </p>
-<p>
- An unfortunate side-effect of this flexibility is that
- <span><strong class="command">dnssec-signzone</strong></span> does not check to make sure
- it's signing a zone with any valid keys at all. An attempt to
- sign a zone without any keys will appear to succeed, producing
- a "signed" zone with no signatures. There is no warning issued
- when a zone is not fully signed.
- </p>
-<p>
- This will be corrected in a future release. In the meantime, ISC
- recommends examining the output of <span><strong class="command">dnssec-signzone</strong></span>
- to confirm that the zone is properly signed by all keys before
- using it.
- </p>
-</div>
-<div class="refsect1" lang="en">
-<a name="id2544716"></a><h2>SEE ALSO</h2>
+<a name="id2545019"></a><h2>SEE ALSO</h2>
<p><span class="citerefentry"><span class="refentrytitle">dnssec-keygen</span>(8)</span>,
<em class="citetitle">BIND 9 Administrator Reference Manual</em>,
<em class="citetitle">RFC 4033</em>.
</p>
</div>
<div class="refsect1" lang="en">
-<a name="id2544741"></a><h2>AUTHOR</h2>
+<a name="id2545044"></a><h2>AUTHOR</h2>
<p><span class="corpauthor">Internet Systems Consortium</span>
</p>
</div>
diff --git a/contrib/bind9/bin/dnssec/dnssectool.c b/contrib/bind9/bin/dnssec/dnssectool.c
index 81120e3..da6b0b2 100644
--- a/contrib/bind9/bin/dnssec/dnssectool.c
+++ b/contrib/bind9/bin/dnssec/dnssectool.c
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004, 2005, 2007, 2009 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004, 2005, 2007, 2009, 2010 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 2000, 2001, 2003 Internet Software Consortium.
*
* Permission to use, copy, modify, and/or distribute this software for any
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: dnssectool.c,v 1.45.334.5 2009-06-22 05:05:00 marka Exp $ */
+/* $Id: dnssectool.c,v 1.60 2010-01-19 23:48:56 tbox Exp $ */
/*! \file */
@@ -28,6 +28,7 @@
#include <stdlib.h>
#include <isc/buffer.h>
+#include <isc/dir.h>
#include <isc/entropy.h>
#include <isc/list.h>
#include <isc/mem.h>
@@ -36,6 +37,8 @@
#include <isc/util.h>
#include <isc/print.h>
+#include <dns/dnssec.h>
+#include <dns/keyvalues.h>
#include <dns/log.h>
#include <dns/name.h>
#include <dns/rdatastruct.h>
@@ -111,39 +114,16 @@ type_format(const dns_rdatatype_t type, char *cp, unsigned int size) {
}
void
-alg_format(const dns_secalg_t alg, char *cp, unsigned int size) {
- isc_buffer_t b;
- isc_region_t r;
- isc_result_t result;
-
- isc_buffer_init(&b, cp, size - 1);
- result = dns_secalg_totext(alg, &b);
- check_result(result, "dns_secalg_totext()");
- isc_buffer_usedregion(&b, &r);
- r.base[r.length] = 0;
-}
-
-void
sig_format(dns_rdata_rrsig_t *sig, char *cp, unsigned int size) {
char namestr[DNS_NAME_FORMATSIZE];
char algstr[DNS_NAME_FORMATSIZE];
dns_name_format(&sig->signer, namestr, sizeof(namestr));
- alg_format(sig->algorithm, algstr, sizeof(algstr));
+ dns_secalg_format(sig->algorithm, algstr, sizeof(algstr));
snprintf(cp, size, "%s/%s/%d", namestr, algstr, sig->keyid);
}
void
-key_format(const dst_key_t *key, char *cp, unsigned int size) {
- char namestr[DNS_NAME_FORMATSIZE];
- char algstr[DNS_NAME_FORMATSIZE];
-
- dns_name_format(dst_key_name(key), namestr, sizeof(namestr));
- alg_format((dns_secalg_t) dst_key_alg(key), algstr, sizeof(algstr));
- snprintf(cp, size, "%s/%s/%d", namestr, algstr, dst_key_id(key));
-}
-
-void
setup_logging(int verbose, isc_mem_t *mctx, isc_log_t **logp) {
isc_result_t result;
isc_logdestination_t destination;
@@ -265,32 +245,92 @@ cleanup_entropy(isc_entropy_t **ectx) {
isc_entropy_detach(ectx);
}
+static isc_stdtime_t
+time_units(isc_stdtime_t offset, char *suffix, const char *str) {
+ switch (suffix[0]) {
+ case 'Y': case 'y':
+ return (offset * (365 * 24 * 3600));
+ case 'M': case 'm':
+ switch (suffix[1]) {
+ case 'O': case 'o':
+ return (offset * (30 * 24 * 3600));
+ case 'I': case 'i':
+ return (offset * 60);
+ case '\0':
+ fatal("'%s' ambiguous: use 'mi' for minutes "
+ "or 'mo' for months", str);
+ default:
+ fatal("time value %s is invalid", str);
+ }
+ /* NOTREACHED */
+ break;
+ case 'W': case 'w':
+ return (offset * (7 * 24 * 3600));
+ case 'D': case 'd':
+ return (offset * (24 * 3600));
+ case 'H': case 'h':
+ return (offset * 3600);
+ case 'S': case 's': case '\0':
+ return (offset);
+ default:
+ fatal("time value %s is invalid", str);
+ }
+ /* NOTREACHED */
+ return(0); /* silence compiler warning */
+}
+
+dns_ttl_t
+strtottl(const char *str) {
+ const char *orig = str;
+ dns_ttl_t ttl;
+ char *endp;
+
+ ttl = strtol(str, &endp, 0);
+ if (ttl == 0 && endp == str)
+ fatal("TTL must be numeric");
+ ttl = time_units(ttl, endp, orig);
+ return (ttl);
+}
+
isc_stdtime_t
strtotime(const char *str, isc_int64_t now, isc_int64_t base) {
isc_int64_t val, offset;
isc_result_t result;
+ const char *orig = str;
char *endp;
- if (str[0] == '+') {
+ if ((str[0] == '0' || str[0] == '-') && str[1] == '\0')
+ return ((isc_stdtime_t) 0);
+
+ if (strncmp(str, "now", 3) == 0) {
+ base = now;
+ str += 3;
+ }
+
+ if (str[0] == '\0')
+ return ((isc_stdtime_t) base);
+ else if (str[0] == '+') {
offset = strtol(str + 1, &endp, 0);
- if (*endp != '\0')
- fatal("time value %s is invalid", str);
+ offset = time_units((isc_stdtime_t) offset, endp, orig);
val = base + offset;
- } else if (strncmp(str, "now+", 4) == 0) {
- offset = strtol(str + 4, &endp, 0);
- if (*endp != '\0')
- fatal("time value %s is invalid", str);
- val = now + offset;
+ } else if (str[0] == '-') {
+ offset = strtol(str + 1, &endp, 0);
+ offset = time_units((isc_stdtime_t) offset, endp, orig);
+ val = base - offset;
} else if (strlen(str) == 8U) {
char timestr[15];
sprintf(timestr, "%s000000", str);
result = dns_time64_fromtext(timestr, &val);
if (result != ISC_R_SUCCESS)
- fatal("time value %s is invalid", str);
+ fatal("time value %s is invalid: %s", orig,
+ isc_result_totext(result));
+ } else if (strlen(str) > 14U) {
+ fatal("time value %s is invalid", orig);
} else {
result = dns_time64_fromtext(str, &val);
if (result != ISC_R_SUCCESS)
- fatal("time value %s is invalid", str);
+ fatal("time value %s is invalid: %s", orig,
+ isc_result_totext(result));
}
return ((isc_stdtime_t) val);
@@ -311,3 +351,114 @@ strtoclass(const char *str) {
fatal("unknown class %s", str);
return (rdclass);
}
+
+isc_result_t
+try_dir(const char *dirname) {
+ isc_result_t result;
+ isc_dir_t d;
+
+ isc_dir_init(&d);
+ result = isc_dir_open(&d, dirname);
+ if (result == ISC_R_SUCCESS) {
+ isc_dir_close(&d);
+ }
+ return (result);
+}
+
+/*
+ * Check private key version compatibility.
+ */
+void
+check_keyversion(dst_key_t *key, char *keystr) {
+ int major, minor;
+ dst_key_getprivateformat(key, &major, &minor);
+ INSIST(major <= DST_MAJOR_VERSION); /* invalid private key */
+
+ if (major < DST_MAJOR_VERSION || minor < DST_MINOR_VERSION)
+ fatal("Key %s has incompatible format version %d.%d, "
+ "use -f to force upgrade to new version.",
+ keystr, major, minor);
+ if (minor > DST_MINOR_VERSION)
+ fatal("Key %s has incompatible format version %d.%d, "
+ "use -f to force downgrade to current version.",
+ keystr, major, minor);
+}
+
+void
+set_keyversion(dst_key_t *key) {
+ int major, minor;
+ dst_key_getprivateformat(key, &major, &minor);
+ INSIST(major <= DST_MAJOR_VERSION);
+
+ if (major != DST_MAJOR_VERSION || minor != DST_MINOR_VERSION)
+ dst_key_setprivateformat(key, DST_MAJOR_VERSION,
+ DST_MINOR_VERSION);
+
+ /*
+ * If the key is from a version older than 1.3, set
+ * set the creation date
+ */
+ if (major < 1 || (major == 1 && minor <= 2)) {
+ isc_stdtime_t now;
+ isc_stdtime_get(&now);
+ dst_key_settime(key, DST_TIME_CREATED, now);
+ }
+}
+
+isc_boolean_t
+key_collision(isc_uint16_t id, dns_name_t *name, const char *dir,
+ dns_secalg_t alg, isc_mem_t *mctx, isc_boolean_t *exact)
+{
+ isc_result_t result;
+ isc_boolean_t conflict = ISC_FALSE;
+ dns_dnsseckeylist_t matchkeys;
+ dns_dnsseckey_t *key = NULL;
+ isc_uint16_t oldid, diff;
+ isc_uint16_t bits = DNS_KEYFLAG_REVOKE; /* flag bits to look for */
+
+ if (exact != NULL)
+ *exact = ISC_FALSE;
+
+ ISC_LIST_INIT(matchkeys);
+ result = dns_dnssec_findmatchingkeys(name, dir, mctx, &matchkeys);
+ if (result == ISC_R_NOTFOUND)
+ return (ISC_FALSE);
+
+ while (!ISC_LIST_EMPTY(matchkeys) && !conflict) {
+ key = ISC_LIST_HEAD(matchkeys);
+ if (dst_key_alg(key->key) != alg)
+ goto next;
+
+ oldid = dst_key_id(key->key);
+ diff = (oldid > id) ? (oldid - id) : (id - oldid);
+ if ((diff & ~bits) == 0) {
+ conflict = ISC_TRUE;
+ if (diff != 0) {
+ if (verbose > 1)
+ fprintf(stderr, "Key ID %d could "
+ "collide with %d\n",
+ id, oldid);
+ } else {
+ if (exact != NULL)
+ *exact = ISC_TRUE;
+ if (verbose > 1)
+ fprintf(stderr, "Key ID %d exists\n",
+ id);
+ }
+ }
+
+ next:
+ ISC_LIST_UNLINK(matchkeys, key, link);
+ dns_dnsseckey_destroy(mctx, &key);
+ }
+
+ /* Finish freeing the list */
+ while (!ISC_LIST_EMPTY(matchkeys)) {
+ key = ISC_LIST_HEAD(matchkeys);
+ ISC_LIST_UNLINK(matchkeys, key, link);
+ dns_dnsseckey_destroy(mctx, &key);
+ }
+
+ return (conflict);
+}
+
diff --git a/contrib/bind9/bin/dnssec/dnssectool.h b/contrib/bind9/bin/dnssec/dnssectool.h
index 8cc133d..b52bc13 100644
--- a/contrib/bind9/bin/dnssec/dnssectool.h
+++ b/contrib/bind9/bin/dnssec/dnssectool.h
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004, 2007-2009 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004, 2007-2010 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 2000, 2001, 2003 Internet Software Consortium.
*
* Permission to use, copy, modify, and/or distribute this software for any
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: dnssectool.h,v 1.22.48.2 2009-09-04 23:46:58 tbox Exp $ */
+/* $Id: dnssectool.h,v 1.31 2010-01-19 23:48:56 tbox Exp $ */
#ifndef DNSSECTOOL_H
#define DNSSECTOOL_H 1
@@ -27,8 +27,9 @@
typedef void (fatalcallback_t)(void);
-void
-fatal(const char *format, ...) ISC_FORMAT_PRINTF(1, 2);
+ISC_PLATFORM_NORETURN_PRE void
+fatal(const char *format, ...)
+ISC_FORMAT_PRINTF(1, 2) ISC_PLATFORM_NORETURN_POST;
void
setfatalcallback(fatalcallback_t *callback);
@@ -44,16 +45,8 @@ type_format(const dns_rdatatype_t type, char *cp, unsigned int size);
#define TYPE_FORMATSIZE 20
void
-alg_format(const dns_secalg_t alg, char *cp, unsigned int size);
-#define ALG_FORMATSIZE 20
-
-void
sig_format(dns_rdata_rrsig_t *sig, char *cp, unsigned int size);
-#define SIG_FORMATSIZE (DNS_NAME_FORMATSIZE + ALG_FORMATSIZE + sizeof("65535"))
-
-void
-key_format(const dst_key_t *key, char *cp, unsigned int size);
-#define KEY_FORMATSIZE (DNS_NAME_FORMATSIZE + ALG_FORMATSIZE + sizeof("65535"))
+#define SIG_FORMATSIZE (DNS_NAME_FORMATSIZE + DNS_SECALG_FORMATSIZE + sizeof("65535"))
void
setup_logging(int verbose, isc_mem_t *mctx, isc_log_t **logp);
@@ -67,10 +60,24 @@ setup_entropy(isc_mem_t *mctx, const char *randomfile, isc_entropy_t **ectx);
void
cleanup_entropy(isc_entropy_t **ectx);
+dns_ttl_t strtottl(const char *str);
+
isc_stdtime_t
strtotime(const char *str, isc_int64_t now, isc_int64_t base);
dns_rdataclass_t
strtoclass(const char *str);
+isc_result_t
+try_dir(const char *dirname);
+
+void
+check_keyversion(dst_key_t *key, char *keystr);
+
+void
+set_keyversion(dst_key_t *key);
+
+isc_boolean_t
+key_collision(isc_uint16_t id, dns_name_t *name, const char *dir,
+ dns_secalg_t alg, isc_mem_t *mctx, isc_boolean_t *exact);
#endif /* DNSSEC_DNSSECTOOL_H */
diff --git a/contrib/bind9/bin/named/Makefile.in b/contrib/bind9/bin/named/Makefile.in
index ee76134..a3dbb38 100644
--- a/contrib/bind9/bin/named/Makefile.in
+++ b/contrib/bind9/bin/named/Makefile.in
@@ -1,4 +1,4 @@
-# Copyright (C) 2004-2008 Internet Systems Consortium, Inc. ("ISC")
+# Copyright (C) 2004-2010 Internet Systems Consortium, Inc. ("ISC")
# Copyright (C) 1998-2002 Internet Software Consortium.
#
# Permission to use, copy, modify, and/or distribute this software for any
@@ -13,7 +13,7 @@
# OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
# PERFORMANCE OF THIS SOFTWARE.
-# $Id: Makefile.in,v 1.101 2008-09-23 17:25:47 jinmei Exp $
+# $Id: Makefile.in,v 1.114 2010-12-22 09:00:40 marka Exp $
srcdir = @srcdir@
VPATH = @srcdir@
@@ -43,9 +43,9 @@ DLZDRIVER_LIBS = @DLZ_DRIVER_LIBS@
CINCLUDES = -I${srcdir}/include -I${srcdir}/unix/include -I. \
${LWRES_INCLUDES} ${DNS_INCLUDES} ${BIND9_INCLUDES} \
${ISCCFG_INCLUDES} ${ISCCC_INCLUDES} ${ISC_INCLUDES} \
- ${DLZDRIVER_INCLUDES} ${DBDRIVER_INCLUDES}
+ ${DLZDRIVER_INCLUDES} ${DBDRIVER_INCLUDES} @DST_OPENSSL_INC@
-CDEFINES = @USE_DLZ@
+CDEFINES = @USE_DLZ@ @USE_PKCS11@ @USE_OPENSSL@
CWARNINGS =
@@ -53,6 +53,7 @@ DNSLIBS = ../../lib/dns/libdns.@A@ @DNS_CRYPTO_LIBS@
ISCCFGLIBS = ../../lib/isccfg/libisccfg.@A@
ISCCCLIBS = ../../lib/isccc/libisccc.@A@
ISCLIBS = ../../lib/isc/libisc.@A@
+ISCNOSYMLIBS = ../../lib/isc/libisc-nosymtbl.@A@
LWRESLIBS = ../../lib/lwres/liblwres.@A@
BIND9LIBS = ../../lib/bind9/libbind9.@A@
@@ -70,6 +71,10 @@ LIBS = ${LWRESLIBS} ${DNSLIBS} ${BIND9LIBS} \
${ISCCFGLIBS} ${ISCCCLIBS} ${ISCLIBS} \
${DLZDRIVER_LIBS} ${DBDRIVER_LIBS} @LIBS@
+NOSYMLIBS = ${LWRESLIBS} ${DNSLIBS} ${BIND9LIBS} \
+ ${ISCCFGLIBS} ${ISCCCLIBS} ${ISCNOSYMLIBS} \
+ ${DLZDRIVER_LIBS} ${DBDRIVER_LIBS} @LIBS@
+
SUBDIRS = unix
TARGETS = named@EXEEXT@ lwresd@EXEEXT@
@@ -86,10 +91,12 @@ OBJS = builtin.@O@ client.@O@ config.@O@ control.@O@ \
UOBJS = unix/os.@O@
+SYMOBJS = symtbl.@O@
+
SRCS = builtin.c client.c config.c control.c \
controlconf.c interfacemgr.c \
listenlist.c log.c logconf.c main.c notify.c \
- query.c server.c sortlist.c statschannel.c \
+ query.c server.c sortlist.c statschannel.c symtbl.c symtbl-empty.c \
tkeyconf.c tsigconf.c update.c xfrout.c \
zoneconf.c \
lwaddr.c lwresd.c lwdclient.c lwderror.c lwdgabn.c \
@@ -111,15 +118,20 @@ main.@O@: main.c
-DNS_LOCALSTATEDIR=\"${localstatedir}\" \
-DNS_SYSCONFDIR=\"${sysconfdir}\" -c ${srcdir}/main.c
-config.@O@: config.c
+bind.keys.h: ${top_srcdir}/bind.keys ${srcdir}/bindkeys.pl
+ ${PERL} ${srcdir}/bindkeys.pl < ${top_srcdir}/bind.keys > $@
+
+config.@O@: config.c bind.keys.h
${LIBTOOL_MODE_COMPILE} ${CC} ${ALL_CFLAGS} \
-DVERSION=\"${VERSION}\" \
-DNS_LOCALSTATEDIR=\"${localstatedir}\" \
+ -DNS_SYSCONFDIR=\"${sysconfdir}\" \
-c ${srcdir}/config.c
named@EXEEXT@: ${OBJS} ${UOBJS} ${DEPLIBS}
- ${LIBTOOL_MODE_LINK} ${PURIFY} ${CC} ${CFLAGS} ${LDFLAGS} -o $@ \
- ${OBJS} ${UOBJS} ${LIBS}
+ export MAKE_SYMTABLE="yes"; \
+ export BASEOBJS="${OBJS} ${UOBJS}"; \
+ ${FINALBUILDCMD}
lwresd@EXEEXT@: named@EXEEXT@
rm -f lwresd@EXEEXT@
@@ -133,7 +145,10 @@ docclean manclean maintainer-clean::
clean distclean maintainer-clean::
rm -f ${TARGETS} ${OBJS}
-bind9.xsl.h: bind9.xsl convertxsl.pl
+maintainer-clean::
+ rm -f bind.keys.h
+
+bind9.xsl.h: bind9.xsl ${srcdir}/convertxsl.pl
${PERL} ${srcdir}/convertxsl.pl < ${srcdir}/bind9.xsl > bind9.xsl.h
depend: bind9.xsl.h
diff --git a/contrib/bind9/bin/named/bind.keys.h b/contrib/bind9/bin/named/bind.keys.h
new file mode 100644
index 0000000..0177214
--- /dev/null
+++ b/contrib/bind9/bin/named/bind.keys.h
@@ -0,0 +1,99 @@
+/*
+ * Generated by bindkeys.pl 1.7 2011-01-04 23:47:13 tbox Exp
+ * From bind.keys 1.7 2011-01-03 23:45:07 each Exp
+ */
+#define TRUSTED_KEYS "\
+# The bind.keys file is used to override the built-in DNSSEC trust anchors\n\
+# which are included as part of BIND 9. As of the current release, the only\n\
+# trust anchors it contains are those for the DNS root zone (\".\"), and for\n\
+# the ISC DNSSEC Lookaside Validation zone (\"dlv.isc.org\"). Trust anchors\n\
+# for any other zones MUST be configured elsewhere; if they are configured\n\
+# here, they will not be recognized or used by named.\n\
+#\n\
+# The built-in trust anchors are provided for convenience of configuration.\n\
+# They are not activated within named.conf unless specifically switched on.\n\
+# To use the built-in root key, set \"dnssec-validation auto;\" in\n\
+# named.conf options. To use the built-in DLV key, set\n\
+# \"dnssec-lookaside auto;\". Without these options being set,\n\
+# the keys in this file are ignored.\n\
+#\n\
+# This file is NOT expected to be user-configured.\n\
+#\n\
+# These keys are current as of January 2011. If any key fails to\n\
+# initialize correctly, it may have expired. In that event you should\n\
+# replace this file with a current version. The latest version of\n\
+# bind.keys can always be obtained from ISC at https://www.isc.org/bind-keys.\n\
+\n\
+trusted-keys {\n\
+ # ISC DLV: See https://www.isc.org/solutions/dlv for details.\n\
+ # NOTE: This key is activated by setting \"dnssec-lookaside auto;\"\n\
+ # in named.conf.\n\
+ dlv.isc.org. 257 3 5 \"BEAAAAPHMu/5onzrEE7z1egmhg/WPO0+juoZrW3euWEn4MxDCE1+lLy2\n\
+ brhQv5rN32RKtMzX6Mj70jdzeND4XknW58dnJNPCxn8+jAGl2FZLK8t+\n\
+ 1uq4W+nnA3qO2+DL+k6BD4mewMLbIYFwe0PG73Te9fZ2kJb56dhgMde5\n\
+ ymX4BI/oQ+cAK50/xvJv00Frf8kw6ucMTwFlgPe+jnGxPPEmHAte/URk\n\
+ Y62ZfkLoBAADLHQ9IrS2tryAe7mbBZVcOwIeU/Rw/mRx/vwwMCTgNboM\n\
+ QKtUdvNXDrYJDSHZws3xiRXF1Rf+al9UmZfSav/4NWLKjHzpT59k/VSt\n\
+ TDN0YUuWrBNh\";\n\
+\n\
+ # ROOT KEY: See https://data.iana.org/root-anchors/root-anchors.xml\n\
+ # for current trust anchor information.\n\
+ # NOTE: This key is activated by setting \"dnssec-validation auto;\"\n\
+ # in named.conf.\n\
+ . 257 3 8 \"AwEAAagAIKlVZrpC6Ia7gEzahOR+9W29euxhJhVVLOyQbSEW0O8gcCjF\n\
+ FVQUTf6v58fLjwBd0YI0EzrAcQqBGCzh/RStIoO8g0NfnfL2MTJRkxoX\n\
+ bfDaUeVPQuYEhg37NZWAJQ9VnMVDxP/VHL496M/QZxkjf5/Efucp2gaD\n\
+ X6RS6CXpoY68LsvPVjR0ZSwzz1apAzvN9dlzEheX7ICJBBtuA6G3LQpz\n\
+ W5hOA2hzCTMjJPJ8LbqF6dsV6DoBQzgul0sGIcGOYl7OyQdXfZ57relS\n\
+ Qageu+ipAdTTJ25AsRTAoub8ONGcLmqrAmRLKBP1dfwhYB4N7knNnulq\n\
+ QxA+Uk1ihz0=\";\n\
+};\n\
+"
+
+#define MANAGED_KEYS "\
+# The bind.keys file is used to override the built-in DNSSEC trust anchors\n\
+# which are included as part of BIND 9. As of the current release, the only\n\
+# trust anchors it contains are those for the DNS root zone (\".\"), and for\n\
+# the ISC DNSSEC Lookaside Validation zone (\"dlv.isc.org\"). Trust anchors\n\
+# for any other zones MUST be configured elsewhere; if they are configured\n\
+# here, they will not be recognized or used by named.\n\
+#\n\
+# The built-in trust anchors are provided for convenience of configuration.\n\
+# They are not activated within named.conf unless specifically switched on.\n\
+# To use the built-in root key, set \"dnssec-validation auto;\" in\n\
+# named.conf options. To use the built-in DLV key, set\n\
+# \"dnssec-lookaside auto;\". Without these options being set,\n\
+# the keys in this file are ignored.\n\
+#\n\
+# This file is NOT expected to be user-configured.\n\
+#\n\
+# These keys are current as of January 2011. If any key fails to\n\
+# initialize correctly, it may have expired. In that event you should\n\
+# replace this file with a current version. The latest version of\n\
+# bind.keys can always be obtained from ISC at https://www.isc.org/bind-keys.\n\
+\n\
+managed-keys {\n\
+ # ISC DLV: See https://www.isc.org/solutions/dlv for details.\n\
+ # NOTE: This key is activated by setting \"dnssec-lookaside auto;\"\n\
+ # in named.conf.\n\
+ dlv.isc.org. initial-key 257 3 5 \"BEAAAAPHMu/5onzrEE7z1egmhg/WPO0+juoZrW3euWEn4MxDCE1+lLy2\n\
+ brhQv5rN32RKtMzX6Mj70jdzeND4XknW58dnJNPCxn8+jAGl2FZLK8t+\n\
+ 1uq4W+nnA3qO2+DL+k6BD4mewMLbIYFwe0PG73Te9fZ2kJb56dhgMde5\n\
+ ymX4BI/oQ+cAK50/xvJv00Frf8kw6ucMTwFlgPe+jnGxPPEmHAte/URk\n\
+ Y62ZfkLoBAADLHQ9IrS2tryAe7mbBZVcOwIeU/Rw/mRx/vwwMCTgNboM\n\
+ QKtUdvNXDrYJDSHZws3xiRXF1Rf+al9UmZfSav/4NWLKjHzpT59k/VSt\n\
+ TDN0YUuWrBNh\";\n\
+\n\
+ # ROOT KEY: See https://data.iana.org/root-anchors/root-anchors.xml\n\
+ # for current trust anchor information.\n\
+ # NOTE: This key is activated by setting \"dnssec-validation auto;\"\n\
+ # in named.conf.\n\
+ . initial-key 257 3 8 \"AwEAAagAIKlVZrpC6Ia7gEzahOR+9W29euxhJhVVLOyQbSEW0O8gcCjF\n\
+ FVQUTf6v58fLjwBd0YI0EzrAcQqBGCzh/RStIoO8g0NfnfL2MTJRkxoX\n\
+ bfDaUeVPQuYEhg37NZWAJQ9VnMVDxP/VHL496M/QZxkjf5/Efucp2gaD\n\
+ X6RS6CXpoY68LsvPVjR0ZSwzz1apAzvN9dlzEheX7ICJBBtuA6G3LQpz\n\
+ W5hOA2hzCTMjJPJ8LbqF6dsV6DoBQzgul0sGIcGOYl7OyQdXfZ57relS\n\
+ Qageu+ipAdTTJ25AsRTAoub8ONGcLmqrAmRLKBP1dfwhYB4N7knNnulq\n\
+ QxA+Uk1ihz0=\";\n\
+};\n\
+"
diff --git a/contrib/bind9/bin/named/bind9.xsl b/contrib/bind9/bin/named/bind9.xsl
index 71d2eba..5913c1c 100644
--- a/contrib/bind9/bin/named/bind9.xsl
+++ b/contrib/bind9/bin/named/bind9.xsl
@@ -15,7 +15,7 @@
- PERFORMANCE OF THIS SOFTWARE.
-->
-<!-- $Id: bind9.xsl,v 1.19.82.2 2009-01-29 23:47:43 tbox Exp $ -->
+<!-- $Id: bind9.xsl,v 1.21 2009-01-27 23:47:54 tbox Exp $ -->
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
diff --git a/contrib/bind9/bin/named/bind9.xsl.h b/contrib/bind9/bin/named/bind9.xsl.h
index e42fda0..b6f1f54 100644
--- a/contrib/bind9/bin/named/bind9.xsl.h
+++ b/contrib/bind9/bin/named/bind9.xsl.h
@@ -1,6 +1,6 @@
/*
- * Generated by convertxsl.pl 1.14 2008/07/17 23:43:26 jinmei Exp
- * From bind9.xsl 1.19.82.2 2009/01/29 23:47:43 tbox Exp
+ * Generated by convertxsl.pl 1.14 2008-07-17 23:43:26 jinmei Exp
+ * From bind9.xsl 1.21 2009-01-27 23:47:54 tbox Exp
*/
static char xslmsg[] =
"<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
@@ -20,7 +20,7 @@ static char xslmsg[] =
" - PERFORMANCE OF THIS SOFTWARE.\n"
"-->\n"
"\n"
- "<!-- \045Id: bind9.xsl,v 1.19.82.2 2009/01/29 23:47:43 tbox Exp \045 -->\n"
+ "<!-- \045Id: bind9.xsl,v 1.21 2009-01-27 23:47:54 tbox Exp \045 -->\n"
"\n"
"<xsl:stylesheet version=\"1.0\"\n"
" xmlns:xsl=\"http://www.w3.org/1999/XSL/Transform\"\n"
diff --git a/contrib/bind9/bin/named/builtin.c b/contrib/bind9/bin/named/builtin.c
index 60cb634..d7730e7 100644
--- a/contrib/bind9/bin/named/builtin.c
+++ b/contrib/bind9/bin/named/builtin.c
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004, 2005, 2007, 2010 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004, 2005, 2007, 2009-2011 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 2001-2003 Internet Software Consortium.
*
* Permission to use, copy, modify, and/or distribute this software for any
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: builtin.c,v 1.12.334.3 2010-08-03 23:45:47 tbox Exp $ */
+/* $Id: builtin.c,v 1.20 2011-01-07 23:47:07 tbox Exp $ */
/*! \file
* \brief
@@ -47,6 +47,7 @@ static isc_result_t do_hostname_lookup(dns_sdblookup_t *lookup);
static isc_result_t do_authors_lookup(dns_sdblookup_t *lookup);
static isc_result_t do_id_lookup(dns_sdblookup_t *lookup);
static isc_result_t do_empty_lookup(dns_sdblookup_t *lookup);
+static isc_result_t do_dns64_lookup(dns_sdblookup_t *lookup);
/*
* We can't use function pointers as the db_data directly
@@ -65,9 +66,179 @@ static builtin_t hostname_builtin = { do_hostname_lookup, NULL, NULL };
static builtin_t authors_builtin = { do_authors_lookup, NULL, NULL };
static builtin_t id_builtin = { do_id_lookup, NULL, NULL };
static builtin_t empty_builtin = { do_empty_lookup, NULL, NULL };
+static builtin_t dns64_builtin = { do_dns64_lookup, NULL, NULL };
static dns_sdbimplementation_t *builtin_impl;
+static const char hex[] = "0123456789abcdef";
+static const char HEX[] = "0123456789ABCDEF";
+
+static isc_result_t
+dns64_cname(const char *zone, const char *name, dns_sdblookup_t *lookup) {
+ size_t zlen, nlen, j;
+ const char *s;
+ unsigned char v[16];
+ unsigned int i;
+ char reverse[sizeof("123.123.123.123.in-addr.arpa.")];
+
+ /*
+ * The sum the length of the relative name and the length of the zone
+ * name for a IPv6 reverse lookup comes to 71.
+ *
+ * The reverse of 2001::10.0.0.1 (dns64 2001::/96) has a zone of
+ * "0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.1.0.0.2.ip6.arpa"
+ * and a name of "1.0.0.0.0.0.a.0". The sum of the lengths of these
+ * two strings is 71.
+ *
+ * The minimum length for a ip6.arpa zone name is 8.
+ *
+ * The length of name should always be odd as we are expecting
+ * a series of nibbles.
+ */
+ zlen = strlen(zone);
+ nlen = strlen(name);
+ if ((zlen + nlen) > 71U || zlen < 8U || (nlen % 2) != 1U)
+ return (ISC_R_NOTFOUND);
+
+ /*
+ * We assume the zone name is well formed.
+ */
+
+ /*
+ * XXXMPA We could check the dns64 suffix here if we need to.
+ */
+ /*
+ * Check that name is a series of nibbles.
+ * Compute the byte values that correspond to the nibbles as we go.
+ *
+ * Shift the final result 4 bits, by setting 'i' to 1, if we if we
+ * have a odd number of nibbles so that "must be zero" tests below
+ * are byte aligned and we correctly return ISC_R_NOTFOUND or
+ * ISC_R_SUCCESS. We will not generate a CNAME in this case.
+ */
+ i = (nlen % 4) == 1U ? 1 : 0;
+ j = nlen;
+ memset(v, 0, sizeof(v));
+ while (j >= 1U) {
+ INSIST((i/2) < sizeof(v));
+ if (j > 1U && name[1] != '.')
+ return (ISC_R_NOTFOUND);
+ v[i/2] >>= 4;
+ if ((s = strchr(hex, name[0])) != NULL)
+ v[i/2] |= (s - hex) << 4;
+ else if ((s = strchr(HEX, name[0])) != NULL)
+ v[i/2] |= (s - HEX) << 4;
+ else
+ return (ISC_R_NOTFOUND);
+ if (j > 1U)
+ j -= 2;
+ else
+ j -= 1;
+ name += 2;
+ i++;
+ }
+
+ /*
+ * If we get here then we know name only consisted of nibbles.
+ * Now we need to determine if the name exists or not and whether
+ * it corresponds to a empty node in the zone or there should be
+ * a CNAME.
+ */
+ switch (zlen) {
+ case 24: /* prefix len 32 */
+ /*
+ * If the total length is not 71 then this is a empty node
+ * so return success.
+ */
+ if (nlen + zlen != 71U)
+ return (ISC_R_SUCCESS);
+ snprintf(reverse, sizeof(reverse), "%u.%u.%u.%u.in-addr.arpa.",
+ v[8], v[9], v[10], v[11]);
+ break;
+ case 28: /* prefix len 40 */
+ /*
+ * The nibbles that map to this byte must be zero for 'name'
+ * to exist in the zone.
+ */
+ if (nlen > 11U && v[nlen/4 - 3] != 0)
+ return (ISC_R_NOTFOUND);
+ /*
+ * If the total length is not 71 then this is a empty node
+ * so return success.
+ */
+ if (nlen + zlen != 71U)
+ return (ISC_R_SUCCESS);
+ snprintf(reverse, sizeof(reverse), "%u.%u.%u.%u.in-addr.arpa.",
+ v[6], v[8], v[9], v[10]);
+ break;
+ case 32: /* prefix len 48 */
+ /*
+ * The nibbles that map to this byte must be zero for 'name'
+ * to exist in the zone.
+ */
+ if (nlen > 7U && v[nlen/4 - 2] != 0)
+ return (ISC_R_NOTFOUND);
+ /*
+ * If the total length is not 71 then this is a empty node
+ * so return success.
+ */
+ if (nlen + zlen != 71U)
+ return (ISC_R_SUCCESS);
+ snprintf(reverse, sizeof(reverse), "%u.%u.%u.%u.in-addr.arpa.",
+ v[5], v[6], v[8], v[9]);
+ break;
+ case 36: /* prefix len 56 */
+ /*
+ * The nibbles that map to this byte must be zero for 'name'
+ * to exist in the zone.
+ */
+ if (nlen > 3U && v[nlen/4 - 1] != 0)
+ return (ISC_R_NOTFOUND);
+ /*
+ * If the total length is not 71 then this is a empty node
+ * so return success.
+ */
+ if (nlen + zlen != 71U)
+ return (ISC_R_SUCCESS);
+ snprintf(reverse, sizeof(reverse), "%u.%u.%u.%u.in-addr.arpa.",
+ v[4], v[5], v[6], v[8]);
+ break;
+ case 40: /* prefix len 64 */
+ /*
+ * The nibbles that map to this byte must be zero for 'name'
+ * to exist in the zone.
+ */
+ if (v[nlen/4] != 0)
+ return (ISC_R_NOTFOUND);
+ /*
+ * If the total length is not 71 then this is a empty node
+ * so return success.
+ */
+ if (nlen + zlen != 71U)
+ return (ISC_R_SUCCESS);
+ snprintf(reverse, sizeof(reverse), "%u.%u.%u.%u.in-addr.arpa.",
+ v[3], v[4], v[5], v[6]);
+ break;
+ case 56: /* prefix len 96 */
+ /*
+ * If the total length is not 71 then this is a empty node
+ * so return success.
+ */
+ if (nlen + zlen != 71U)
+ return (ISC_R_SUCCESS);
+ snprintf(reverse, sizeof(reverse), "%u.%u.%u.%u.in-addr.arpa.",
+ v[0], v[1], v[2], v[3]);
+ break;
+ default:
+ /*
+ * This should never be reached unless someone adds a
+ * zone declaration with this internal type to named.conf.
+ */
+ return (ISC_R_NOTFOUND);
+ }
+ return (dns_sdb_putrr(lookup, "CNAME", 600, reverse));
+}
+
static isc_result_t
builtin_lookup(const char *zone, const char *name, void *dbdata,
dns_sdblookup_t *lookup)
@@ -78,6 +249,8 @@ builtin_lookup(const char *zone, const char *name, void *dbdata,
if (strcmp(name, "@") == 0)
return (b->do_lookup(lookup));
+ else if (b->do_lookup == do_dns64_lookup)
+ return (dns64_cname(zone, name, lookup));
else
return (ISC_R_NOTFOUND);
}
@@ -132,11 +305,13 @@ do_authors_lookup(dns_sdblookup_t *lookup) {
"Michael Graff",
"Andreas Gustafsson",
"Bob Halley",
+ "Evan Hunt",
"JINMEI Tatuya",
"David Lawrence",
"Danny Mayer",
"Damien Neil",
"Matt Nelson",
+ "Jeremy C. Reed",
"Michael Sawyer",
"Brian Wellington",
NULL
@@ -174,6 +349,12 @@ do_id_lookup(dns_sdblookup_t *lookup) {
}
static isc_result_t
+do_dns64_lookup(dns_sdblookup_t *lookup) {
+ UNUSED(lookup);
+ return (ISC_R_SUCCESS);
+}
+
+static isc_result_t
do_empty_lookup(dns_sdblookup_t *lookup) {
UNUSED(lookup);
@@ -220,7 +401,7 @@ builtin_create(const char *zone, int argc, char **argv,
UNUSED(zone);
UNUSED(driverdata);
- if (strcmp(argv[0], "empty") == 0) {
+ if (strcmp(argv[0], "empty") == 0 || strcmp(argv[0], "dns64") == 0) {
if (argc != 3)
return (DNS_R_SYNTAX);
} else if (argc != 1)
@@ -234,7 +415,8 @@ builtin_create(const char *zone, int argc, char **argv,
*dbdata = &authors_builtin;
else if (strcmp(argv[0], "id") == 0)
*dbdata = &id_builtin;
- else if (strcmp(argv[0], "empty") == 0) {
+ else if (strcmp(argv[0], "empty") == 0 ||
+ strcmp(argv[0], "dns64") == 0) {
builtin_t *empty;
char *server;
char *contact;
@@ -246,7 +428,10 @@ builtin_create(const char *zone, int argc, char **argv,
server = isc_mem_strdup(ns_g_mctx, argv[1]);
contact = isc_mem_strdup(ns_g_mctx, argv[2]);
if (empty == NULL || server == NULL || contact == NULL) {
- *dbdata = &empty_builtin;
+ if (strcmp(argv[0], "empty") == 0)
+ *dbdata = &empty_builtin;
+ else
+ *dbdata = &dns64_builtin;
if (server != NULL)
isc_mem_free(ns_g_mctx, server);
if (contact != NULL)
@@ -254,7 +439,12 @@ builtin_create(const char *zone, int argc, char **argv,
if (empty != NULL)
isc_mem_put(ns_g_mctx, empty, sizeof (*empty));
} else {
- memcpy(empty, &empty_builtin, sizeof (empty_builtin));
+ if (strcmp(argv[0], "empty") == 0)
+ memcpy(empty, &empty_builtin,
+ sizeof (empty_builtin));
+ else
+ memcpy(empty, &dns64_builtin,
+ sizeof (empty_builtin));
empty->server = server;
empty->contact = contact;
*dbdata = empty;
@@ -276,7 +466,7 @@ builtin_destroy(const char *zone, void *driverdata, void **dbdata) {
*/
if (*dbdata == &version_builtin || *dbdata == &hostname_builtin ||
*dbdata == &authors_builtin || *dbdata == &id_builtin ||
- *dbdata == &empty_builtin)
+ *dbdata == &empty_builtin || *dbdata == &dns64_builtin)
return;
isc_mem_free(ns_g_mctx, b->server);
@@ -306,3 +496,4 @@ void
ns_builtin_deinit(void) {
dns_sdb_unregister(&builtin_impl);
}
+
diff --git a/contrib/bind9/bin/named/client.c b/contrib/bind9/bin/named/client.c
index 6236d27..bc9cc87 100644
--- a/contrib/bind9/bin/named/client.c
+++ b/contrib/bind9/bin/named/client.c
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004-2010 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004-2011 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 1999-2003 Internet Software Consortium.
*
* Permission to use, copy, modify, and/or distribute this software for any
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: client.c,v 1.259.12.5 2010-09-24 08:30:27 tbox Exp $ */
+/* $Id: client.c,v 1.271 2011-01-11 23:47:12 tbox Exp $ */
#include <config.h>
@@ -918,7 +918,7 @@ ns_client_send(ns_client_t *client) {
dns_compress_t cctx;
isc_boolean_t cleanup_cctx = ISC_FALSE;
unsigned char sendbuf[SEND_BUFFER_SIZE];
- unsigned int dnssec_opts;
+ unsigned int render_opts;
unsigned int preferred_glue;
isc_boolean_t opt_included = ISC_FALSE;
@@ -930,10 +930,21 @@ ns_client_send(ns_client_t *client) {
client->message->flags |= DNS_MESSAGEFLAG_RA;
if ((client->attributes & NS_CLIENTATTR_WANTDNSSEC) != 0)
- dnssec_opts = 0;
+ render_opts = 0;
else
- dnssec_opts = DNS_MESSAGERENDER_OMITDNSSEC;
-
+ render_opts = DNS_MESSAGERENDER_OMITDNSSEC;
+#ifdef ALLOW_FILTER_AAAA_ON_V4
+ /*
+ * filter-aaaa-on-v4 yes or break-dnssec option to suppress
+ * AAAA records
+ * We already know that request came via IPv4,
+ * that we have both AAAA and A records,
+ * and that we either have no signatures that the client wants
+ * or we are supposed to break DNSSEC.
+ */
+ if ((client->attributes & NS_CLIENTATTR_FILTER_AAAA) != 0)
+ render_opts |= DNS_MESSAGERENDER_FILTER_AAAA;
+#endif
preferred_glue = 0;
if (client->view != NULL) {
if (client->view->preferred_glue == dns_rdatatype_a)
@@ -977,7 +988,7 @@ ns_client_send(ns_client_t *client) {
result = dns_message_rendersection(client->message,
DNS_SECTION_ANSWER,
DNS_MESSAGERENDER_PARTIAL |
- dnssec_opts);
+ render_opts);
if (result == ISC_R_NOSPACE) {
client->message->flags |= DNS_MESSAGEFLAG_TC;
goto renderend;
@@ -987,7 +998,7 @@ ns_client_send(ns_client_t *client) {
result = dns_message_rendersection(client->message,
DNS_SECTION_AUTHORITY,
DNS_MESSAGERENDER_PARTIAL |
- dnssec_opts);
+ render_opts);
if (result == ISC_R_NOSPACE) {
client->message->flags |= DNS_MESSAGEFLAG_TC;
goto renderend;
@@ -996,7 +1007,7 @@ ns_client_send(ns_client_t *client) {
goto done;
result = dns_message_rendersection(client->message,
DNS_SECTION_ADDITIONAL,
- preferred_glue | dnssec_opts);
+ preferred_glue | render_opts);
if (result != ISC_R_SUCCESS && result != ISC_R_NOSPACE)
goto done;
renderend:
@@ -1355,7 +1366,6 @@ client_request(isc_task_t *task, isc_event_t *event) {
dns_name_t *signame;
isc_boolean_t ra; /* Recursion available. */
isc_netaddr_t netaddr;
- isc_netaddr_t destaddr;
int match;
dns_messageid_t id;
unsigned int flags;
@@ -1473,7 +1483,7 @@ client_request(isc_task_t *task, isc_event_t *event) {
/*
* Silently drop multicast requests for the present.
- * XXXMPA look at when/if mDNS spec stabilizes.
+ * XXXMPA revisit this as mDNS spec was published.
*/
if ((client->attributes & NS_CLIENTATTR_MULTICAST) != 0) {
ns_client_log(client, NS_LOGCATEGORY_CLIENT,
@@ -1647,24 +1657,20 @@ client_request(isc_task_t *task, isc_event_t *event) {
* etc), we regard this as an error for safety.
*/
if ((client->interface->flags & NS_INTERFACEFLAG_ANYADDR) == 0)
- isc_netaddr_fromsockaddr(&destaddr, &client->interface->addr);
+ isc_netaddr_fromsockaddr(&client->destaddr,
+ &client->interface->addr);
else {
+ isc_sockaddr_t sockaddr;
result = ISC_R_FAILURE;
- if (TCP_CLIENT(client)) {
- isc_sockaddr_t destsockaddr;
-
+ if (TCP_CLIENT(client))
result = isc_socket_getsockname(client->tcpsocket,
- &destsockaddr);
- if (result == ISC_R_SUCCESS)
- isc_netaddr_fromsockaddr(&destaddr,
- &destsockaddr);
- }
+ &sockaddr);
+ if (result == ISC_R_SUCCESS)
+ isc_netaddr_fromsockaddr(&client->destaddr, &sockaddr);
if (result != ISC_R_SUCCESS &&
client->interface->addr.type.sa.sa_family == AF_INET6 &&
(client->attributes & NS_CLIENTATTR_PKTINFO) != 0) {
- isc_uint32_t zone = 0;
-
/*
* XXXJT technically, we should convert the receiving
* interface ID to a proper scope zone ID. However,
@@ -1673,12 +1679,11 @@ client_request(isc_task_t *task, isc_event_t *event) {
* interface index as link ID. Despite the assumption,
* it should cover most typical cases.
*/
- if (IN6_IS_ADDR_LINKLOCAL(&client->pktinfo.ipi6_addr))
- zone = (isc_uint32_t)client->pktinfo.ipi6_ifindex;
-
- isc_netaddr_fromin6(&destaddr,
+ isc_netaddr_fromin6(&client->destaddr,
&client->pktinfo.ipi6_addr);
- isc_netaddr_setzone(&destaddr, zone);
+ if (IN6_IS_ADDR_LINKLOCAL(&client->pktinfo.ipi6_addr))
+ isc_netaddr_setzone(&client->destaddr,
+ client->pktinfo.ipi6_ifindex);
result = ISC_R_SUCCESS;
}
if (result != ISC_R_SUCCESS) {
@@ -1708,7 +1713,8 @@ client_request(isc_task_t *task, isc_event_t *event) {
tsig = dns_tsigkey_identity(client->message->tsigkey);
if (allowed(&netaddr, tsig, view->matchclients) &&
- allowed(&destaddr, tsig, view->matchdestinations) &&
+ allowed(&client->destaddr, tsig,
+ view->matchdestinations) &&
!((client->message->flags & DNS_MESSAGEFLAG_RD)
== 0 && view->matchrecursiveonly))
{
@@ -1771,9 +1777,11 @@ client_request(isc_task_t *task, isc_event_t *event) {
}
if (result == ISC_R_SUCCESS) {
+ char namebuf[DNS_NAME_FORMATSIZE];
+ dns_name_format(&client->signername, namebuf, sizeof(namebuf));
ns_client_log(client, DNS_LOGCATEGORY_SECURITY,
NS_LOGMODULE_CLIENT, ISC_LOG_DEBUG(3),
- "request has valid signature");
+ "request has valid signature: %s", namebuf);
client->signer = &client->signername;
} else if (result == ISC_R_NOTFOUND) {
ns_client_log(client, DNS_LOGCATEGORY_SECURITY,
@@ -1861,10 +1869,10 @@ client_request(isc_task_t *task, isc_event_t *event) {
ns_client_checkaclsilent(client, NULL,
client->view->cacheacl,
ISC_TRUE) == ISC_R_SUCCESS &&
- ns_client_checkaclsilent(client, &client->interface->addr,
+ ns_client_checkaclsilent(client, &client->destaddr,
client->view->recursiononacl,
ISC_TRUE) == ISC_R_SUCCESS &&
- ns_client_checkaclsilent(client, &client->interface->addr,
+ ns_client_checkaclsilent(client, &client->destaddr,
client->view->cacheonacl,
ISC_TRUE) == ISC_R_SUCCESS)
ra = ISC_TRUE;
@@ -2600,12 +2608,12 @@ ns_client_getsockaddr(ns_client_t *client) {
}
isc_result_t
-ns_client_checkaclsilent(ns_client_t *client, isc_sockaddr_t *sockaddr,
+ns_client_checkaclsilent(ns_client_t *client, isc_netaddr_t *netaddr,
dns_acl_t *acl, isc_boolean_t default_allow)
{
isc_result_t result;
+ isc_netaddr_t tmpnetaddr;
int match;
- isc_netaddr_t netaddr;
if (acl == NULL) {
if (default_allow)
@@ -2614,15 +2622,13 @@ ns_client_checkaclsilent(ns_client_t *client, isc_sockaddr_t *sockaddr,
goto deny;
}
+ if (netaddr == NULL) {
+ isc_netaddr_fromsockaddr(&tmpnetaddr, &client->peeraddr);
+ netaddr = &tmpnetaddr;
+ }
- if (sockaddr == NULL)
- isc_netaddr_fromsockaddr(&netaddr, &client->peeraddr);
- else
- isc_netaddr_fromsockaddr(&netaddr, sockaddr);
-
- result = dns_acl_match(&netaddr, client->signer, acl,
- &ns_g_server->aclenv,
- &match, NULL);
+ result = dns_acl_match(netaddr, client->signer, acl,
+ &ns_g_server->aclenv, &match, NULL);
if (result != ISC_R_SUCCESS)
goto deny; /* Internal error, already logged. */
@@ -2642,8 +2648,14 @@ ns_client_checkacl(ns_client_t *client, isc_sockaddr_t *sockaddr,
const char *opname, dns_acl_t *acl,
isc_boolean_t default_allow, int log_level)
{
- isc_result_t result =
- ns_client_checkaclsilent(client, sockaddr, acl, default_allow);
+ isc_result_t result;
+ isc_netaddr_t netaddr;
+
+ if (sockaddr != NULL)
+ isc_netaddr_fromsockaddr(&netaddr, sockaddr);
+
+ result = ns_client_checkaclsilent(client, sockaddr ? &netaddr : NULL,
+ acl, default_allow);
if (result == ISC_R_SUCCESS)
ns_client_log(client, DNS_LOGCATEGORY_SECURITY,
@@ -2753,9 +2765,14 @@ void
ns_client_dumprecursing(FILE *f, ns_clientmgr_t *manager) {
ns_client_t *client;
char namebuf[DNS_NAME_FORMATSIZE];
+ char original[DNS_NAME_FORMATSIZE];
char peerbuf[ISC_SOCKADDR_FORMATSIZE];
+ char typebuf[DNS_RDATATYPE_FORMATSIZE];
+ char classbuf[DNS_RDATACLASS_FORMATSIZE];
const char *name;
const char *sep;
+ const char *origfor;
+ dns_rdataset_t *rdataset;
REQUIRE(VALID_MANAGER(manager));
@@ -2773,8 +2790,31 @@ ns_client_dumprecursing(FILE *f, ns_clientmgr_t *manager) {
sep = "";
}
dns_name_format(client->query.qname, namebuf, sizeof(namebuf));
- fprintf(f, "; client %s%s%s: '%s' requesttime %d\n",
- peerbuf, sep, name, namebuf, client->requesttime);
+ if (client->query.qname != client->query.origqname &&
+ client->query.origqname != NULL) {
+ origfor = " for ";
+ dns_name_format(client->query.origqname, original,
+ sizeof(original));
+ } else {
+ origfor = "";
+ original[0] = '\0';
+ }
+ rdataset = ISC_LIST_HEAD(client->query.qname->list);
+ if (rdataset == NULL && client->query.origqname != NULL)
+ rdataset = ISC_LIST_HEAD(client->query.origqname->list);
+ if (rdataset != NULL) {
+ dns_rdatatype_format(rdataset->type, typebuf,
+ sizeof(typebuf));
+ dns_rdataclass_format(rdataset->rdclass, classbuf,
+ sizeof(classbuf));
+ } else {
+ strcpy(typebuf, "-");
+ strcpy(classbuf, "-");
+ }
+ fprintf(f, "; client %s%s%s: id %u '%s/%s/%s'%s%s "
+ "requesttime %d\n", peerbuf, sep, name,
+ client->message->id, namebuf, typebuf, classbuf,
+ origfor, original, client->requesttime);
client = ISC_LIST_NEXT(client, link);
}
UNLOCK(&manager->lock);
diff --git a/contrib/bind9/bin/named/config.c b/contrib/bind9/bin/named/config.c
index 43d0e52..704d7ecc 100644
--- a/contrib/bind9/bin/named/config.c
+++ b/contrib/bind9/bin/named/config.c
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004-2009 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004-2011 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 2001-2003 Internet Software Consortium.
*
* Permission to use, copy, modify, and/or distribute this software for any
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: config.c,v 1.93.14.2 2009-03-17 23:47:28 tbox Exp $ */
+/* $Id: config.c,v 1.113.16.1.2.1 2011-06-02 23:47:28 tbox Exp $ */
/*! \file */
@@ -42,9 +42,13 @@
#include <dns/tsig.h>
#include <dns/zone.h>
+#include <dst/dst.h>
+
#include <named/config.h>
#include <named/globals.h>
+#include "bind.keys.h"
+
/*% default configuration */
static char defaultconf[] = "\
options {\n\
@@ -55,7 +59,10 @@ options {\n\
files unlimited;\n\
stacksize default;\n"
#endif
-" deallocate-on-exit true;\n\
+"# session-keyfile \"" NS_LOCALSTATEDIR "/run/named/session.key\";\n\
+ session-keyname local-ddns;\n\
+ session-keyalg hmac-sha256;\n\
+ deallocate-on-exit true;\n\
# directory <none>\n\
dump-file \"named_dump.db\";\n\
fake-iquery no;\n\
@@ -70,8 +77,10 @@ options {\n\
multiple-cnames no;\n\
# named-xfer <obsolete>;\n\
# pid-file \"" NS_LOCALSTATEDIR "/run/named/named.pid\"; /* or /lwresd.pid */\n\
+ bindkeys-file \"" NS_SYSCONFDIR "/bind.keys\";\n\
port 53;\n\
recursing-file \"named.recursing\";\n\
+ secroots-file \"named.secroots\";\n\
"
#ifdef PATH_RANDOMDEV
"\
@@ -80,6 +89,7 @@ options {\n\
#endif
"\
recursive-clients 1000;\n\
+ resolver-query-timeout 30;\n\
rrset-order {type NS order random; order cyclic; };\n\
serial-queries 20;\n\
serial-query-rate 20;\n\
@@ -102,6 +112,9 @@ options {\n\
request-nsid false;\n\
reserved-sockets 512;\n\
\n\
+ /* DLV */\n\
+ dnssec-lookaside . trust-anchor dlv.isc.org;\n\
+\n\
/* view */\n\
allow-notify {none;};\n\
allow-update-forwarding {none;};\n\
@@ -135,6 +148,7 @@ options {\n\
check-names master fail;\n\
check-names slave warn;\n\
check-names response ignore;\n\
+ check-dup-records warn;\n\
check-mx warn;\n\
acache-enable no;\n\
acache-cleaning-interval 60;\n\
@@ -146,7 +160,13 @@ options {\n\
max-clients-per-query 100;\n\
zero-no-soa-ttl-cache no;\n\
nsec3-test-zone no;\n\
+ allow-new-zones no;\n\
+"
+#ifdef ALLOW_FILTER_AAAA_ON_V4
+" filter-aaaa-on-v4 no;\n\
+ filter-aaaa { any; };\n\
"
+#endif
" /* zone */\n\
allow-query {any;};\n\
@@ -174,6 +194,7 @@ options {\n\
max-refresh-time 2419200; /* 4 weeks */\n\
min-refresh-time 300;\n\
multi-master no;\n\
+ dnssec-secure-to-insecure no;\n\
sig-validity-interval 30; /* days */\n\
sig-signing-nodes 100;\n\
sig-signing-signatures 10;\n\
@@ -188,6 +209,7 @@ options {\n\
check-srv-cname warn;\n\
zero-no-soa-ttl yes;\n\
update-check-ksk yes;\n\
+ dnssec-dnskey-kskonly no;\n\
try-tcp-refresh yes; /* BIND 8 compat */\n\
};\n\
"
@@ -198,6 +220,7 @@ options {\n\
view \"_bind\" chaos {\n\
recursion no;\n\
notify no;\n\
+ allow-new-zones no;\n\
\n\
zone \"version.bind\" chaos {\n\
type master;\n\
@@ -213,11 +236,24 @@ view \"_bind\" chaos {\n\
type master;\n\
database \"_builtin authors\";\n\
};\n\
+\n\
zone \"id.server\" chaos {\n\
type master;\n\
database \"_builtin id\";\n\
};\n\
};\n\
+"
+"#\n\
+# Default trusted key(s) for builtin DLV support\n\
+# (used if \"dnssec-lookaside auto;\" is set and\n\
+# sysconfdir/bind.keys doesn't exist).\n\
+#\n\
+# BEGIN MANAGED KEYS\n"
+
+/* Imported from bind.keys.h: */
+MANAGED_KEYS
+
+"# END MANAGED KEYS\n\
";
isc_result_t
@@ -339,6 +375,8 @@ ns_config_getzonetype(const cfg_obj_t *zonetypeobj) {
ztype = dns_zone_slave;
else if (strcasecmp(str, "stub") == 0)
ztype = dns_zone_stub;
+ else if (strcasecmp(str, "static-stub") == 0)
+ ztype = dns_zone_staticstub;
else
INSIST(0);
return (ztype);
@@ -615,7 +653,7 @@ ns_config_getipandkeylist(const cfg_obj_t *config, const cfg_obj_t *list,
isc_buffer_add(&b, strlen(keystr));
dns_fixedname_init(&fname);
result = dns_name_fromtext(dns_fixedname_name(&fname), &b,
- dns_rootname, ISC_FALSE, NULL);
+ dns_rootname, 0, NULL);
if (result != ISC_R_SUCCESS)
goto cleanup;
result = dns_name_dup(dns_fixedname_name(&fname), mctx,
@@ -747,23 +785,31 @@ struct keyalgorithms {
const char *str;
enum { hmacnone, hmacmd5, hmacsha1, hmacsha224,
hmacsha256, hmacsha384, hmacsha512 } hmac;
+ unsigned int type;
isc_uint16_t size;
} algorithms[] = {
- { "hmac-md5", hmacmd5, 128 },
- { "hmac-md5.sig-alg.reg.int", hmacmd5, 0 },
- { "hmac-md5.sig-alg.reg.int.", hmacmd5, 0 },
- { "hmac-sha1", hmacsha1, 160 },
- { "hmac-sha224", hmacsha224, 224 },
- { "hmac-sha256", hmacsha256, 256 },
- { "hmac-sha384", hmacsha384, 384 },
- { "hmac-sha512", hmacsha512, 512 },
- { NULL, hmacnone, 0 }
+ { "hmac-md5", hmacmd5, DST_ALG_HMACMD5, 128 },
+ { "hmac-md5.sig-alg.reg.int", hmacmd5, DST_ALG_HMACMD5, 0 },
+ { "hmac-md5.sig-alg.reg.int.", hmacmd5, DST_ALG_HMACMD5, 0 },
+ { "hmac-sha1", hmacsha1, DST_ALG_HMACSHA1, 160 },
+ { "hmac-sha224", hmacsha224, DST_ALG_HMACSHA224, 224 },
+ { "hmac-sha256", hmacsha256, DST_ALG_HMACSHA256, 256 },
+ { "hmac-sha384", hmacsha384, DST_ALG_HMACSHA384, 384 },
+ { "hmac-sha512", hmacsha512, DST_ALG_HMACSHA512, 512 },
+ { NULL, hmacnone, DST_ALG_UNKNOWN, 0 }
};
isc_result_t
ns_config_getkeyalgorithm(const char *str, dns_name_t **name,
isc_uint16_t *digestbits)
{
+ return (ns_config_getkeyalgorithm2(str, name, NULL, digestbits));
+}
+
+isc_result_t
+ns_config_getkeyalgorithm2(const char *str, dns_name_t **name,
+ unsigned int *typep, isc_uint16_t *digestbits)
+{
int i;
size_t len = 0;
isc_uint16_t bits;
@@ -801,6 +847,8 @@ ns_config_getkeyalgorithm(const char *str, dns_name_t **name,
INSIST(0);
}
}
+ if (typep != NULL)
+ *typep = algorithms[i].type;
if (digestbits != NULL)
*digestbits = bits;
return (ISC_R_SUCCESS);
diff --git a/contrib/bind9/bin/named/control.c b/contrib/bind9/bin/named/control.c
index 38115d6..3fc7bd3 100644
--- a/contrib/bind9/bin/named/control.c
+++ b/contrib/bind9/bin/named/control.c
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: control.c,v 1.33.266.4 2010-12-03 23:45:46 tbox Exp $ */
+/* $Id: control.c,v 1.41 2010-12-03 22:05:19 each Exp $ */
/*! \file */
@@ -158,6 +158,8 @@ ns_control_docommand(isccc_sexpr_t *message, isc_buffer_t *text) {
} else if (command_compare(command, NS_COMMAND_DUMPDB)) {
ns_server_dumpdb(ns_g_server, command);
result = ISC_R_SUCCESS;
+ } else if (command_compare(command, NS_COMMAND_SECROOTS)) {
+ result = ns_server_dumpsecroots(ns_g_server, command);
} else if (command_compare(command, NS_COMMAND_TRACE)) {
result = ns_server_setdebuglevel(ns_g_server, command);
} else if (command_compare(command, NS_COMMAND_NOTRACE)) {
@@ -192,6 +194,13 @@ ns_control_docommand(isccc_sexpr_t *message, isc_buffer_t *text) {
result = ns_server_notifycommand(ns_g_server, command, text);
} else if (command_compare(command, NS_COMMAND_VALIDATION)) {
result = ns_server_validation(ns_g_server, command);
+ } else if (command_compare(command, NS_COMMAND_SIGN) ||
+ command_compare(command, NS_COMMAND_LOADKEYS)) {
+ result = ns_server_rekey(ns_g_server, command);
+ } else if (command_compare(command, NS_COMMAND_ADDZONE)) {
+ result = ns_server_add_zone(ns_g_server, command);
+ } else if (command_compare(command, NS_COMMAND_DELZONE)) {
+ result = ns_server_del_zone(ns_g_server, command);
} else {
isc_log_write(ns_g_lctx, NS_LOGCATEGORY_GENERAL,
NS_LOGMODULE_CONTROL, ISC_LOG_WARNING,
diff --git a/contrib/bind9/bin/named/include/named/client.h b/contrib/bind9/bin/named/include/named/client.h
index 5ad9c6b..33f124d 100644
--- a/contrib/bind9/bin/named/include/named/client.h
+++ b/contrib/bind9/bin/named/include/named/client.h
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: client.h,v 1.86.120.2 2009-01-18 23:47:34 tbox Exp $ */
+/* $Id: client.h,v 1.91 2009-10-26 23:14:53 each Exp $ */
#ifndef NAMED_CLIENT_H
#define NAMED_CLIENT_H 1
@@ -138,6 +138,7 @@ struct ns_client {
ns_interface_t *interface;
isc_sockaddr_t peeraddr;
isc_boolean_t peeraddr_valid;
+ isc_netaddr_t destaddr;
struct in6_pktinfo pktinfo;
isc_event_t ctlevent;
/*%
@@ -167,6 +168,10 @@ struct ns_client {
#define NS_CLIENTATTR_MULTICAST 0x08 /*%< recv'd from multicast */
#define NS_CLIENTATTR_WANTDNSSEC 0x10 /*%< include dnssec records */
#define NS_CLIENTATTR_WANTNSID 0x20 /*%< include nameserver ID */
+#ifdef ALLOW_FILTER_AAAA_ON_V4
+#define NS_CLIENTATTR_FILTER_AAAA 0x40 /*%< suppress AAAAs */
+#define NS_CLIENTATTR_FILTER_AAAA_RC 0x80 /*%< recursing for A against AAAA */
+#endif
extern unsigned int ns_client_requests;
@@ -274,10 +279,8 @@ ns_client_getsockaddr(ns_client_t *client);
*/
isc_result_t
-ns_client_checkaclsilent(ns_client_t *client,
- isc_sockaddr_t *sockaddr,
- dns_acl_t *acl,
- isc_boolean_t default_allow);
+ns_client_checkaclsilent(ns_client_t *client, isc_netaddr_t *netaddr,
+ dns_acl_t *acl, isc_boolean_t default_allow);
/*%
* Convenience function for client request ACL checking.
@@ -296,12 +299,12 @@ ns_client_checkaclsilent(ns_client_t *client,
*
* Requires:
*\li 'client' points to a valid client.
- *\li 'sockaddr' points to a valid address, or is NULL.
+ *\li 'netaddr' points to a valid address, or is NULL.
*\li 'acl' points to a valid ACL, or is NULL.
*
* Returns:
*\li ISC_R_SUCCESS if the request should be allowed
- * \li ISC_R_REFUSED if the request should be denied
+ * \li DNS_R_REFUSED if the request should be denied
*\li No other return values are possible.
*/
diff --git a/contrib/bind9/bin/named/include/named/config.h b/contrib/bind9/bin/named/include/named/config.h
index fa96d32..d1570b0 100644
--- a/contrib/bind9/bin/named/include/named/config.h
+++ b/contrib/bind9/bin/named/include/named/config.h
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004-2007 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004-2007, 2009 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 2001, 2002 Internet Software Consortium.
*
* Permission to use, copy, modify, and/or distribute this software for any
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: config.h,v 1.14 2007-06-19 23:46:59 tbox Exp $ */
+/* $Id: config.h,v 1.16 2009-06-11 23:47:55 tbox Exp $ */
#ifndef NAMED_CONFIG_H
#define NAMED_CONFIG_H 1
@@ -75,5 +75,8 @@ ns_config_getport(const cfg_obj_t *config, in_port_t *portp);
isc_result_t
ns_config_getkeyalgorithm(const char *str, dns_name_t **name,
isc_uint16_t *digestbits);
+isc_result_t
+ns_config_getkeyalgorithm2(const char *str, dns_name_t **name,
+ unsigned int *typep, isc_uint16_t *digestbits);
#endif /* NAMED_CONFIG_H */
diff --git a/contrib/bind9/bin/named/include/named/control.h b/contrib/bind9/bin/named/include/named/control.h
index 436fb19..e699892 100644
--- a/contrib/bind9/bin/named/include/named/control.h
+++ b/contrib/bind9/bin/named/include/named/control.h
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004-2007 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004-2007, 2009, 2010 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 2001-2003 Internet Software Consortium.
*
* Permission to use, copy, modify, and/or distribute this software for any
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: control.h,v 1.25 2007-06-19 23:46:59 tbox Exp $ */
+/* $Id: control.h,v 1.31 2010-08-16 22:21:06 marka Exp $ */
#ifndef NAMED_CONTROL_H
#define NAMED_CONTROL_H 1
@@ -42,6 +42,7 @@
#define NS_COMMAND_DUMPSTATS "stats"
#define NS_COMMAND_QUERYLOG "querylog"
#define NS_COMMAND_DUMPDB "dumpdb"
+#define NS_COMMAND_SECROOTS "secroots"
#define NS_COMMAND_TRACE "trace"
#define NS_COMMAND_NOTRACE "notrace"
#define NS_COMMAND_FLUSH "flush"
@@ -57,6 +58,10 @@
#define NS_COMMAND_NULL "null"
#define NS_COMMAND_NOTIFY "notify"
#define NS_COMMAND_VALIDATION "validation"
+#define NS_COMMAND_SIGN "sign"
+#define NS_COMMAND_LOADKEYS "loadkeys"
+#define NS_COMMAND_ADDZONE "addzone"
+#define NS_COMMAND_DELZONE "delzone"
isc_result_t
ns_controls_create(ns_server_t *server, ns_controls_t **ctrlsp);
diff --git a/contrib/bind9/bin/named/include/named/globals.h b/contrib/bind9/bin/named/include/named/globals.h
index 1d57a18..f155c7f 100644
--- a/contrib/bind9/bin/named/include/named/globals.h
+++ b/contrib/bind9/bin/named/include/named/globals.h
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004-2008, 2010 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004-2010 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 1999-2003 Internet Software Consortium.
*
* Permission to use, copy, modify, and/or distribute this software for any
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: globals.h,v 1.80.12.3 2010-09-15 12:16:50 marka Exp $ */
+/* $Id: globals.h,v 1.89 2010-09-15 12:07:55 marka Exp $ */
#ifndef NAMED_GLOBALS_H
#define NAMED_GLOBALS_H 1
@@ -30,6 +30,8 @@
#include <dns/zone.h>
+#include <dst/dst.h>
+
#include <named/types.h>
#undef EXTERN
@@ -86,8 +88,13 @@ EXTERN cfg_obj_t * ns_g_config INIT(NULL);
EXTERN const cfg_obj_t * ns_g_defaults INIT(NULL);
EXTERN const char * ns_g_conffile INIT(NS_SYSCONFDIR
"/named.conf");
+EXTERN cfg_obj_t * ns_g_bindkeys INIT(NULL);
EXTERN const char * ns_g_keyfile INIT(NS_SYSCONFDIR
"/rndc.key");
+
+EXTERN dns_tsigkey_t * ns_g_sessionkey INIT(NULL);
+EXTERN dns_name_t ns_g_sessionkeyname;
+
EXTERN const char * lwresd_g_conffile INIT(NS_SYSCONFDIR
"/lwresd.conf");
EXTERN const char * lwresd_g_resolvconffile INIT("/etc"
@@ -112,6 +119,10 @@ EXTERN const char * ns_g_chrootdir INIT(NULL);
EXTERN isc_boolean_t ns_g_foreground INIT(ISC_FALSE);
EXTERN isc_boolean_t ns_g_logstderr INIT(ISC_FALSE);
+EXTERN const char * ns_g_defaultsessionkeyfile
+ INIT(NS_LOCALSTATEDIR "/run/named/"
+ "session.key");
+
#if NS_RUN_PID_DIR
EXTERN const char * ns_g_defaultpidfile INIT(NS_LOCALSTATEDIR
"/run/named/"
@@ -128,6 +139,12 @@ EXTERN const char * lwresd_g_defaultpidfile INIT(NS_LOCALSTATEDIR
EXTERN const char * ns_g_username INIT(NULL);
+#ifdef USE_PKCS11
+EXTERN const char * ns_g_engine INIT("pkcs11");
+#else
+EXTERN const char * ns_g_engine INIT(NULL);
+#endif
+
EXTERN int ns_g_listen INIT(3);
EXTERN isc_time_t ns_g_boottime;
EXTERN isc_boolean_t ns_g_memstatistics INIT(ISC_FALSE);
diff --git a/contrib/bind9/bin/named/include/named/log.h b/contrib/bind9/bin/named/include/named/log.h
index 0cfbee9..1ce680f 100644
--- a/contrib/bind9/bin/named/include/named/log.h
+++ b/contrib/bind9/bin/named/include/named/log.h
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: log.h,v 1.25.332.2 2009-01-07 23:47:16 tbox Exp $ */
+/* $Id: log.h,v 1.27 2009-01-07 23:47:46 tbox Exp $ */
#ifndef NAMED_LOG_H
#define NAMED_LOG_H 1
diff --git a/contrib/bind9/bin/named/include/named/lwdclient.h b/contrib/bind9/bin/named/include/named/lwdclient.h
index 44e1fa6..5451b73 100644
--- a/contrib/bind9/bin/named/include/named/lwdclient.h
+++ b/contrib/bind9/bin/named/include/named/lwdclient.h
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: lwdclient.h,v 1.18.332.2 2009-01-18 23:47:34 tbox Exp $ */
+/* $Id: lwdclient.h,v 1.20 2009-01-17 23:47:42 tbox Exp $ */
#ifndef NAMED_LWDCLIENT_H
#define NAMED_LWDCLIENT_H 1
diff --git a/contrib/bind9/bin/named/include/named/main.h b/contrib/bind9/bin/named/include/named/main.h
index 96fb23e..6116add 100644
--- a/contrib/bind9/bin/named/include/named/main.h
+++ b/contrib/bind9/bin/named/include/named/main.h
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004, 2005, 2007 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004, 2005, 2007, 2009 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 1999-2002 Internet Software Consortium.
*
* Permission to use, copy, modify, and/or distribute this software for any
@@ -15,15 +15,16 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: main.h,v 1.15 2007-06-19 23:46:59 tbox Exp $ */
+/* $Id: main.h,v 1.17 2009-09-29 23:48:03 tbox Exp $ */
#ifndef NAMED_MAIN_H
#define NAMED_MAIN_H 1
/*! \file */
-void
-ns_main_earlyfatal(const char *format, ...) ISC_FORMAT_PRINTF(1, 2);
+ISC_PLATFORM_NORETURN_PRE void
+ns_main_earlyfatal(const char *format, ...)
+ISC_FORMAT_PRINTF(1, 2) ISC_PLATFORM_NORETURN_POST;
void
ns_main_earlywarning(const char *format, ...) ISC_FORMAT_PRINTF(1, 2);
diff --git a/contrib/bind9/bin/named/include/named/notify.h b/contrib/bind9/bin/named/include/named/notify.h
index ac7fe2d..34fabcd 100644
--- a/contrib/bind9/bin/named/include/named/notify.h
+++ b/contrib/bind9/bin/named/include/named/notify.h
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: notify.h,v 1.14.332.2 2009-01-18 23:47:34 tbox Exp $ */
+/* $Id: notify.h,v 1.16 2009-01-17 23:47:42 tbox Exp $ */
#ifndef NAMED_NOTIFY_H
#define NAMED_NOTIFY_H 1
diff --git a/contrib/bind9/bin/named/include/named/query.h b/contrib/bind9/bin/named/include/named/query.h
index 2f00f1e..37f771b 100644
--- a/contrib/bind9/bin/named/include/named/query.h
+++ b/contrib/bind9/bin/named/include/named/query.h
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004, 2005, 2007, 2010 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004, 2005, 2007, 2010, 2011 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 1999-2002 Internet Software Consortium.
*
* Permission to use, copy, modify, and/or distribute this software for any
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: query.h,v 1.40.332.2 2010-09-24 08:30:28 tbox Exp $ */
+/* $Id: query.h,v 1.45 2011-01-13 04:59:24 tbox Exp $ */
#ifndef NAMED_QUERY_H
#define NAMED_QUERY_H 1
@@ -26,6 +26,8 @@
#include <isc/buffer.h>
#include <isc/netaddr.h>
+#include <dns/rdataset.h>
+#include <dns/rpz.h>
#include <dns/types.h>
#include <named/types.h>
@@ -34,6 +36,7 @@
typedef struct ns_dbversion {
dns_db_t *db;
dns_dbversion_t *version;
+ isc_boolean_t acl_checked;
isc_boolean_t queryok;
ISC_LINK(struct ns_dbversion) link;
} ns_dbversion_t;
@@ -54,9 +57,16 @@ struct ns_query {
isc_boolean_t isreferral;
isc_mutex_t fetchlock;
dns_fetch_t * fetch;
+ dns_rpz_st_t * rpz_st;
isc_bufferlist_t namebufs;
ISC_LIST(ns_dbversion_t) activeversions;
ISC_LIST(ns_dbversion_t) freeversions;
+ dns_rdataset_t * dns64_aaaa;
+ dns_rdataset_t * dns64_sigaaaa;
+ isc_boolean_t * dns64_aaaaok;
+ unsigned int dns64_aaaaoklen;
+ unsigned int dns64_options;
+ unsigned int dns64_ttl;
};
#define NS_QUERYATTR_RECURSIONOK 0x0001
@@ -73,6 +83,9 @@ struct ns_query {
#define NS_QUERYATTR_NOADDITIONAL 0x0800
#define NS_QUERYATTR_CACHEACLOKVALID 0x1000
#define NS_QUERYATTR_CACHEACLOK 0x2000
+#define NS_QUERYATTR_DNS64 0x4000
+#define NS_QUERYATTR_DNS64EXCLUDE 0x8000
+
isc_result_t
ns_query_init(ns_client_t *client);
diff --git a/contrib/bind9/bin/named/include/named/server.h b/contrib/bind9/bin/named/include/named/server.h
index 3a4c5f7..3c6426e 100644
--- a/contrib/bind9/bin/named/include/named/server.h
+++ b/contrib/bind9/bin/named/include/named/server.h
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004-2009 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004-2010 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 1999-2003 Internet Software Consortium.
*
* Permission to use, copy, modify, and/or distribute this software for any
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: server.h,v 1.93.120.3 2009-07-11 04:23:53 marka Exp $ */
+/* $Id: server.h,v 1.110 2010-08-16 23:46:52 tbox Exp $ */
#ifndef NAMED_SERVER_H
#define NAMED_SERVER_H 1
@@ -54,6 +54,8 @@ struct ns_server {
dns_acl_t *blackholeacl;
char * statsfile; /*%< Statistics file name */
char * dumpfile; /*%< Dump file name */
+ char * secrootsfile; /*%< Secroots file name */
+ char * bindkeysfile; /*%< bind.keys file name */
char * recfile; /*%< Recursive file name */
isc_boolean_t version_set; /*%< User has set version */
char * version; /*%< User-specified version */
@@ -91,13 +93,14 @@ struct ns_server {
isc_boolean_t flushonshutdown;
isc_boolean_t log_queries; /*%< For BIND 8 compatibility */
- isc_stats_t * nsstats; /*%< Server statistics */
- dns_stats_t * rcvquerystats; /*% Incoming query statistics */
- dns_stats_t * opcodestats; /*%< Incoming message statistics */
- isc_stats_t * zonestats; /*% Zone management statistics */
- isc_stats_t * resolverstats; /*% Resolver statistics */
+ ns_cachelist_t cachelist; /*%< Possibly shared caches */
+ isc_stats_t * nsstats; /*%< Server stats */
+ dns_stats_t * rcvquerystats; /*% Incoming query stats */
+ dns_stats_t * opcodestats; /*%< Incoming message stats */
+ isc_stats_t * zonestats; /*% Zone management stats */
+ isc_stats_t * resolverstats; /*% Resolver stats */
+ isc_stats_t * sockstats; /*%< Socket stats */
- isc_stats_t * sockstats; /*%< Socket statistics */
ns_controls_t * controls; /*%< Control channels */
unsigned int dispatchgen;
ns_dispatchlist_t dispatches;
@@ -105,6 +108,12 @@ struct ns_server {
dns_acache_t *acache;
ns_statschannellist_t statschannels;
+
+ dns_tsigkey_t *sessionkey;
+ char *session_keyfile;
+ dns_name_t *session_keyname;
+ unsigned int session_keyalg;
+ isc_uint16_t session_keybits;
};
#define NS_SERVER_MAGIC ISC_MAGIC('S','V','E','R')
@@ -237,6 +246,12 @@ isc_result_t
ns_server_dumpdb(ns_server_t *server, char *args);
/*%
+ * Dump the current security roots to the secroots file.
+ */
+isc_result_t
+ns_server_dumpsecroots(ns_server_t *server, char *args);
+
+/*%
* Change or increment the server debug level.
*/
isc_result_t
@@ -280,6 +295,16 @@ ns_server_freeze(ns_server_t *server, isc_boolean_t freeze, char *args,
isc_buffer_t *text);
/*%
+ * Update a zone's DNSKEY set from the key repository. If
+ * the command that triggered the call to this function was "sign",
+ * then force a full signing of the zone. If it was "loadkeys",
+ * then don't sign the zone; any needed changes to signatures can
+ * take place incrementally.
+ */
+isc_result_t
+ns_server_rekey(ns_server_t *server, char *args);
+
+/*%
* Dump the current recursive queries.
*/
isc_result_t
@@ -297,4 +322,16 @@ ns_add_reserved_dispatch(ns_server_t *server, const isc_sockaddr_t *addr);
isc_result_t
ns_server_validation(ns_server_t *server, char *args);
+/*%
+ * Add a zone to a running process
+ */
+isc_result_t
+ns_server_add_zone(ns_server_t *server, char *args);
+
+/*%
+ * Deletes a zone from a running process
+ */
+isc_result_t
+ns_server_del_zone(ns_server_t *server, char *args);
+
#endif /* NAMED_SERVER_H */
diff --git a/contrib/bind9/bin/named/include/named/tsigconf.h b/contrib/bind9/bin/named/include/named/tsigconf.h
index a4841ba..4a59ec2 100644
--- a/contrib/bind9/bin/named/include/named/tsigconf.h
+++ b/contrib/bind9/bin/named/include/named/tsigconf.h
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004-2007 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004-2007, 2009 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 1999-2001 Internet Software Consortium.
*
* Permission to use, copy, modify, and/or distribute this software for any
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: tsigconf.h,v 1.16 2007-06-19 23:46:59 tbox Exp $ */
+/* $Id: tsigconf.h,v 1.18 2009-06-11 23:47:55 tbox Exp $ */
#ifndef NS_TSIGCONF_H
#define NS_TSIGCONF_H 1
@@ -36,8 +36,9 @@ ns_tsigkeyring_fromconfig(const cfg_obj_t *config, const cfg_obj_t *vconfig,
*
* Requires:
* \li 'config' is not NULL.
+ * \li 'vconfig' is not NULL.
* \li 'mctx' is not NULL
- * \li 'ring' is not NULL, and '*ring' is NULL
+ * \li 'ringp' is not NULL, and '*ringp' is NULL
*
* Returns:
* \li ISC_R_SUCCESS
diff --git a/contrib/bind9/bin/named/include/named/types.h b/contrib/bind9/bin/named/include/named/types.h
index b0729a7..96c4c01 100644
--- a/contrib/bind9/bin/named/include/named/types.h
+++ b/contrib/bind9/bin/named/include/named/types.h
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004-2008 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004-2009 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 1999-2001 Internet Software Consortium.
*
* Permission to use, copy, modify, and/or distribute this software for any
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: types.h,v 1.29 2008-01-17 23:46:59 tbox Exp $ */
+/* $Id: types.h,v 1.31 2009-01-09 23:47:45 tbox Exp $ */
#ifndef NAMED_TYPES_H
#define NAMED_TYPES_H 1
@@ -24,6 +24,8 @@
#include <dns/types.h>
+typedef struct ns_cache ns_cache_t;
+typedef ISC_LIST(ns_cache_t) ns_cachelist_t;
typedef struct ns_client ns_client_t;
typedef struct ns_clientmgr ns_clientmgr_t;
typedef struct ns_query ns_query_t;
diff --git a/contrib/bind9/bin/named/include/named/zoneconf.h b/contrib/bind9/bin/named/include/named/zoneconf.h
index ab84c84..65cf72f 100644
--- a/contrib/bind9/bin/named/include/named/zoneconf.h
+++ b/contrib/bind9/bin/named/include/named/zoneconf.h
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004-2007 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004-2007, 2010 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 1999-2002 Internet Software Consortium.
*
* Permission to use, copy, modify, and/or distribute this software for any
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: zoneconf.h,v 1.26 2007-06-19 23:46:59 tbox Exp $ */
+/* $Id: zoneconf.h,v 1.28 2010-12-20 23:47:20 tbox Exp $ */
#ifndef NS_ZONECONF_H
#define NS_ZONECONF_H 1
@@ -58,6 +58,21 @@ ns_zone_reusable(dns_zone_t *zone, const cfg_obj_t *zconfig);
* and recreated, return ISC_FALSE.
*/
+
+isc_result_t
+ns_zone_configure_writeable_dlz(dns_dlzdb_t *dlzdatabase, dns_zone_t *zone,
+ dns_rdataclass_t rdclass, dns_name_t *name);
+/*%>
+ * configure a DLZ zone, setting up the database methods and calling
+ * postload to load the origin values
+ *
+ * Require:
+ * \li 'dlzdatabase' to be a valid dlz database
+ * \li 'zone' to be initialized.
+ * \li 'rdclass' to be a valid rdataclass
+ * \li 'name' to be a valid zone origin name
+ */
+
ISC_LANG_ENDDECLS
#endif /* NS_ZONECONF_H */
diff --git a/contrib/bind9/bin/named/interfacemgr.c b/contrib/bind9/bin/named/interfacemgr.c
index fad3213..e99d3b9 100644
--- a/contrib/bind9/bin/named/interfacemgr.c
+++ b/contrib/bind9/bin/named/interfacemgr.c
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: interfacemgr.c,v 1.93.70.2 2009-01-18 23:47:34 tbox Exp $ */
+/* $Id: interfacemgr.c,v 1.95 2009-01-17 23:47:42 tbox Exp $ */
/*! \file */
diff --git a/contrib/bind9/bin/named/log.c b/contrib/bind9/bin/named/log.c
index 867ad56..5d1c942 100644
--- a/contrib/bind9/bin/named/log.c
+++ b/contrib/bind9/bin/named/log.c
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: log.c,v 1.46.334.3 2009-01-07 01:50:14 jinmei Exp $ */
+/* $Id: log.c,v 1.49 2009-01-07 01:46:40 jinmei Exp $ */
/*! \file */
diff --git a/contrib/bind9/bin/named/lwdgabn.c b/contrib/bind9/bin/named/lwdgabn.c
index 66d7246..6a609c9 100644
--- a/contrib/bind9/bin/named/lwdgabn.c
+++ b/contrib/bind9/bin/named/lwdgabn.c
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004-2007 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004-2007, 2009 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 2000, 2001 Internet Software Consortium.
*
* Permission to use, copy, modify, and/or distribute this software for any
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: lwdgabn.c,v 1.22 2007-06-19 23:46:59 tbox Exp $ */
+/* $Id: lwdgabn.c,v 1.24 2009-09-02 23:48:01 tbox Exp $ */
/*! \file */
@@ -619,7 +619,7 @@ ns_lwdclient_processgabn(ns_lwdclient_t *client, lwres_buffer_t *b) {
dns_fixedname_init(&client->target_name);
dns_fixedname_init(&client->query_name);
result = dns_name_fromtext(dns_fixedname_name(&client->query_name),
- &namebuf, NULL, ISC_FALSE, NULL);
+ &namebuf, NULL, 0, NULL);
if (result != ISC_R_SUCCESS)
goto out;
ns_lwsearchctx_init(&client->searchctx,
diff --git a/contrib/bind9/bin/named/lwdgrbn.c b/contrib/bind9/bin/named/lwdgrbn.c
index bf29a48..22b62c6 100644
--- a/contrib/bind9/bin/named/lwdgrbn.c
+++ b/contrib/bind9/bin/named/lwdgrbn.c
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004-2007 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004-2007, 2009 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 2000, 2001, 2003 Internet Software Consortium.
*
* Permission to use, copy, modify, and/or distribute this software for any
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: lwdgrbn.c,v 1.20 2007-06-19 23:46:59 tbox Exp $ */
+/* $Id: lwdgrbn.c,v 1.22 2009-09-02 23:48:01 tbox Exp $ */
/*! \file */
@@ -472,7 +472,7 @@ ns_lwdclient_processgrbn(ns_lwdclient_t *client, lwres_buffer_t *b) {
dns_fixedname_init(&client->query_name);
result = dns_name_fromtext(dns_fixedname_name(&client->query_name),
- &namebuf, NULL, ISC_FALSE, NULL);
+ &namebuf, NULL, 0, NULL);
if (result != ISC_R_SUCCESS)
goto out;
ns_lwsearchctx_init(&client->searchctx,
diff --git a/contrib/bind9/bin/named/lwresd.8 b/contrib/bind9/bin/named/lwresd.8
index d1e760d..30dfbd5 100644
--- a/contrib/bind9/bin/named/lwresd.8
+++ b/contrib/bind9/bin/named/lwresd.8
@@ -13,7 +13,7 @@
.\" OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
.\" PERFORMANCE OF THIS SOFTWARE.
.\"
-.\" $Id: lwresd.8,v 1.29.14.2 2009-07-11 01:55:21 tbox Exp $
+.\" $Id: lwresd.8,v 1.31 2009-07-11 01:12:45 tbox Exp $
.\"
.hy 0
.ad l
diff --git a/contrib/bind9/bin/named/lwresd.c b/contrib/bind9/bin/named/lwresd.c
index b7dc0af..ad36709 100644
--- a/contrib/bind9/bin/named/lwresd.c
+++ b/contrib/bind9/bin/named/lwresd.c
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004-2008 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004-2009 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 2000-2003 Internet Software Consortium.
*
* Permission to use, copy, modify, and/or distribute this software for any
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: lwresd.c,v 1.58 2008-07-23 23:27:54 marka Exp $ */
+/* $Id: lwresd.c,v 1.60 2009-09-02 23:48:01 tbox Exp $ */
/*! \file
* \brief
@@ -372,8 +372,7 @@ ns_lwdmanager_create(isc_mem_t *mctx, const cfg_obj_t *lwres,
strlen(searchstr));
isc_buffer_add(&namebuf, strlen(searchstr));
result = dns_name_fromtext(name, &namebuf,
- dns_rootname, ISC_FALSE,
- NULL);
+ dns_rootname, 0, NULL);
if (result != ISC_R_SUCCESS) {
isc_log_write(ns_g_lctx,
NS_LOGCATEGORY_GENERAL,
diff --git a/contrib/bind9/bin/named/lwresd.docbook b/contrib/bind9/bin/named/lwresd.docbook
index f8e1500..934b5da 100644
--- a/contrib/bind9/bin/named/lwresd.docbook
+++ b/contrib/bind9/bin/named/lwresd.docbook
@@ -18,7 +18,7 @@
- PERFORMANCE OF THIS SOFTWARE.
-->
-<!-- $Id: lwresd.docbook,v 1.18.14.2 2009-01-22 23:47:05 tbox Exp $ -->
+<!-- $Id: lwresd.docbook,v 1.20 2009-01-20 23:47:56 tbox Exp $ -->
<refentry>
<refentryinfo>
<date>June 30, 2000</date>
diff --git a/contrib/bind9/bin/named/lwresd.html b/contrib/bind9/bin/named/lwresd.html
index dec47ca..223b1c2 100644
--- a/contrib/bind9/bin/named/lwresd.html
+++ b/contrib/bind9/bin/named/lwresd.html
@@ -14,7 +14,7 @@
- OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
- PERFORMANCE OF THIS SOFTWARE.
-->
-<!-- $Id: lwresd.html,v 1.25.14.2 2009-07-11 01:55:21 tbox Exp $ -->
+<!-- $Id: lwresd.html,v 1.27 2009-07-11 01:12:45 tbox Exp $ -->
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
diff --git a/contrib/bind9/bin/named/main.c b/contrib/bind9/bin/named/main.c
index a1d94ff..84d86b1 100644
--- a/contrib/bind9/bin/named/main.c
+++ b/contrib/bind9/bin/named/main.c
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: main.c,v 1.166.34.7 2010-09-15 12:16:49 marka Exp $ */
+/* $Id: main.c,v 1.180 2010-12-22 03:59:02 marka Exp $ */
/*! \file */
@@ -26,6 +26,7 @@
#include <string.h>
#include <isc/app.h>
+#include <isc/backtrace.h>
#include <isc/commandline.h>
#include <isc/dir.h>
#include <isc/entropy.h>
@@ -69,6 +70,12 @@
#include <named/ns_smf_globals.h>
#endif
+#ifdef OPENSSL
+#include <openssl/opensslv.h>
+#endif
+#ifdef HAVE_LIBXML2
+#include <libxml/xmlversion.h>
+#endif
/*
* Include header files for database drivers here.
*/
@@ -81,12 +88,20 @@
#include <dlz/dlz_drivers.h>
#endif
+/*
+ * The maximum number of stack frames to dump on assertion failure.
+ */
+#ifndef BACKTRACE_MAXFRAME
+#define BACKTRACE_MAXFRAME 128
+#endif
+
static isc_boolean_t want_stats = ISC_FALSE;
static char program_name[ISC_DIR_NAMEMAX] = "named";
static char absolute_conffile[ISC_DIR_PATHMAX];
static char saved_command_line[512];
static char version[512];
static unsigned int maxsocks = 0;
+static int maxudp = 0;
void
ns_main_earlywarning(const char *format, ...) {
@@ -129,10 +144,20 @@ ns_main_earlyfatal(const char *format, ...) {
exit(1);
}
+ISC_PLATFORM_NORETURN_PRE static void
+assertion_failed(const char *file, int line, isc_assertiontype_t type,
+ const char *cond) ISC_PLATFORM_NORETURN_POST;
+
static void
assertion_failed(const char *file, int line, isc_assertiontype_t type,
const char *cond)
{
+ void *tracebuf[BACKTRACE_MAXFRAME];
+ int i, nframes;
+ isc_result_t result;
+ const char *logsuffix = "";
+ const char *fname;
+
/*
* Handle assertion failures.
*/
@@ -144,10 +169,40 @@ assertion_failed(const char *file, int line, isc_assertiontype_t type,
*/
isc_assertion_setcallback(NULL);
+ result = isc_backtrace_gettrace(tracebuf, BACKTRACE_MAXFRAME,
+ &nframes);
+ if (result == ISC_R_SUCCESS && nframes > 0)
+ logsuffix = ", back trace";
isc_log_write(ns_g_lctx, NS_LOGCATEGORY_GENERAL,
NS_LOGMODULE_MAIN, ISC_LOG_CRITICAL,
- "%s:%d: %s(%s) failed", file, line,
- isc_assertion_typetotext(type), cond);
+ "%s:%d: %s(%s) failed%s", file, line,
+ isc_assertion_typetotext(type), cond, logsuffix);
+ if (result == ISC_R_SUCCESS) {
+ for (i = 0; i < nframes; i++) {
+ unsigned long offset;
+
+ fname = NULL;
+ result = isc_backtrace_getsymbol(tracebuf[i],
+ &fname,
+ &offset);
+ if (result == ISC_R_SUCCESS) {
+ isc_log_write(ns_g_lctx,
+ NS_LOGCATEGORY_GENERAL,
+ NS_LOGMODULE_MAIN,
+ ISC_LOG_CRITICAL,
+ "#%d %p in %s()+0x%lx", i,
+ tracebuf[i], fname,
+ offset);
+ } else {
+ isc_log_write(ns_g_lctx,
+ NS_LOGCATEGORY_GENERAL,
+ NS_LOGMODULE_MAIN,
+ ISC_LOG_CRITICAL,
+ "#%d %p in ??", i,
+ tracebuf[i]);
+ }
+ }
+ }
isc_log_write(ns_g_lctx, NS_LOGCATEGORY_GENERAL,
NS_LOGMODULE_MAIN, ISC_LOG_CRITICAL,
"exiting (due to assertion failure)");
@@ -162,9 +217,10 @@ assertion_failed(const char *file, int line, isc_assertiontype_t type,
exit(1);
}
-static void
+ISC_PLATFORM_NORETURN_PRE static void
library_fatal_error(const char *file, int line, const char *format,
- va_list args) ISC_FORMAT_PRINTF(3, 0);
+ va_list args)
+ISC_FORMAT_PRINTF(3, 0) ISC_PLATFORM_NORETURN_POST;
static void
library_fatal_error(const char *file, int line, const char *format,
@@ -248,8 +304,9 @@ usage(void) {
}
fprintf(stderr,
"usage: named [-4|-6] [-c conffile] [-d debuglevel] "
- "[-f|-g] [-n number_of_cpus]\n"
- " [-p port] [-s] [-t chrootdir] [-u username]\n"
+ "[-E engine] [-f|-g]\n"
+ " [-n number_of_cpus] [-p port] [-s] "
+ "[-t chrootdir] [-u username]\n"
" [-m {usage|trace|record|size|mctx}]\n");
}
@@ -358,7 +415,7 @@ parse_command_line(int argc, char *argv[]) {
isc_commandline_errprint = ISC_FALSE;
while ((ch = isc_commandline_parse(argc, argv,
- "46c:C:d:fgi:lm:n:N:p:P:"
+ "46c:C:d:E:fFgi:lm:n:N:p:P:"
"sS:t:T:u:vVx:")) != -1) {
switch (ch) {
case '4':
@@ -394,6 +451,9 @@ parse_command_line(int argc, char *argv[]) {
ns_g_debuglevel = parse_int(isc_commandline_argument,
"debug level");
break;
+ case 'E':
+ ns_g_engine = isc_commandline_argument;
+ break;
case 'f':
ns_g_foreground = ISC_TRUE;
break;
@@ -451,12 +511,16 @@ parse_command_line(int argc, char *argv[]) {
* clienttest: make clients single shot with their
* own memory context.
*/
- if (strcmp(isc_commandline_argument, "clienttest") == 0)
+ if (!strcmp(isc_commandline_argument, "clienttest"))
ns_g_clienttest = ISC_TRUE;
else if (!strcmp(isc_commandline_argument, "nosoa"))
ns_g_nosoa = ISC_TRUE;
else if (!strcmp(isc_commandline_argument, "noaa"))
ns_g_noaa = ISC_TRUE;
+ else if (!strcmp(isc_commandline_argument, "maxudp512"))
+ maxudp = 512;
+ else if (!strcmp(isc_commandline_argument, "maxudp1460"))
+ maxudp = 1460;
else
fprintf(stderr, "unknown -T flag '%s\n",
isc_commandline_argument);
@@ -470,13 +534,25 @@ parse_command_line(int argc, char *argv[]) {
case 'V':
printf("BIND %s built with %s\n", ns_g_version,
ns_g_configargs);
+#ifdef OPENSSL
+ printf("using OpenSSL version: %s\n",
+ OPENSSL_VERSION_TEXT);
+#endif
+#ifdef HAVE_LIBXML2
+ printf("using libxml2 version: %s\n",
+ LIBXML_DOTTED_VERSION);
+#endif
exit(0);
+ case 'F':
+ /* Reserved for FIPS mode */
+ /* FALLTHROUGH */
case '?':
usage();
if (isc_commandline_option == '?')
exit(0);
ns_main_earlyfatal("unknown option '-%c'",
isc_commandline_option);
+ /* FALLTHROUGH */
default:
ns_main_earlyfatal("parsing options returned %d", ch);
}
@@ -529,6 +605,7 @@ create_managers(void) {
isc_result_totext(result));
return (ISC_R_UNEXPECTED);
}
+ isc__socketmgr_maxudp(ns_g_socketmgr, maxudp);
result = isc_socketmgr_getmaxsockets(ns_g_socketmgr, &socks);
if (result == ISC_R_SUCCESS) {
isc_log_write(ns_g_lctx, NS_LOGCATEGORY_GENERAL,
@@ -579,6 +656,34 @@ destroy_managers(void) {
}
static void
+dump_symboltable() {
+ int i;
+ isc_result_t result;
+ const char *fname;
+ const void *addr;
+
+ if (isc__backtrace_nsymbols == 0)
+ return;
+
+ if (!isc_log_wouldlog(ns_g_lctx, ISC_LOG_DEBUG(99)))
+ return;
+
+ isc_log_write(ns_g_lctx, NS_LOGCATEGORY_GENERAL, NS_LOGMODULE_MAIN,
+ ISC_LOG_DEBUG(99), "Symbol table:");
+
+ for (i = 0, result = ISC_R_SUCCESS; result == ISC_R_SUCCESS; i++) {
+ addr = NULL;
+ fname = NULL;
+ result = isc_backtrace_getsymbolfromindex(i, &addr, &fname);
+ if (result == ISC_R_SUCCESS) {
+ isc_log_write(ns_g_lctx, NS_LOGCATEGORY_GENERAL,
+ NS_LOGMODULE_MAIN, ISC_LOG_DEBUG(99),
+ "[%d] %p %s", i, addr, fname);
+ }
+ }
+}
+
+static void
setup(void) {
isc_result_t result;
isc_resourcevalue_t old_openfiles;
@@ -685,6 +790,8 @@ setup(void) {
isc_log_write(ns_g_lctx, NS_LOGCATEGORY_GENERAL, NS_LOGMODULE_MAIN,
ISC_LOG_NOTICE, "built with %s", ns_g_configargs);
+ dump_symboltable();
+
/*
* Get the initial resource limits.
*/
@@ -723,8 +830,8 @@ setup(void) {
absolute_conffile,
sizeof(absolute_conffile));
if (result != ISC_R_SUCCESS)
- ns_main_earlyfatal("could not construct absolute path of "
- "configuration file: %s",
+ ns_main_earlyfatal("could not construct absolute path "
+ "of configuration file: %s",
isc_result_totext(result));
ns_g_conffile = absolute_conffile;
}
@@ -896,6 +1003,9 @@ main(int argc, char *argv[]) {
if (strcmp(program_name, "lwresd") == 0)
ns_g_lwresdonly = ISC_TRUE;
+ if (result != ISC_R_SUCCESS)
+ ns_main_earlyfatal("failed to build internal symbol table");
+
isc_assertion_setcallback(assertion_failed);
isc_error_setfatal(library_fatal_error);
isc_error_setunexpected(library_unexpected_error);
diff --git a/contrib/bind9/bin/named/named.8 b/contrib/bind9/bin/named/named.8
index 90782ed..23805b0 100644
--- a/contrib/bind9/bin/named/named.8
+++ b/contrib/bind9/bin/named/named.8
@@ -13,7 +13,7 @@
.\" OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
.\" PERFORMANCE OF THIS SOFTWARE.
.\"
-.\" $Id: named.8,v 1.38.14.2 2009-12-03 05:06:38 tbox Exp $
+.\" $Id: named.8,v 1.41 2009-10-06 01:14:41 tbox Exp $
.\"
.hy 0
.ad l
@@ -33,7 +33,7 @@
named \- Internet domain name server
.SH "SYNOPSIS"
.HP 6
-\fBnamed\fR [\fB\-4\fR] [\fB\-6\fR] [\fB\-c\ \fR\fB\fIconfig\-file\fR\fR] [\fB\-d\ \fR\fB\fIdebug\-level\fR\fR] [\fB\-f\fR] [\fB\-g\fR] [\fB\-m\ \fR\fB\fIflag\fR\fR] [\fB\-n\ \fR\fB\fI#cpus\fR\fR] [\fB\-p\ \fR\fB\fIport\fR\fR] [\fB\-s\fR] [\fB\-S\ \fR\fB\fI#max\-socks\fR\fR] [\fB\-t\ \fR\fB\fIdirectory\fR\fR] [\fB\-u\ \fR\fB\fIuser\fR\fR] [\fB\-v\fR] [\fB\-V\fR] [\fB\-x\ \fR\fB\fIcache\-file\fR\fR]
+\fBnamed\fR [\fB\-4\fR] [\fB\-6\fR] [\fB\-c\ \fR\fB\fIconfig\-file\fR\fR] [\fB\-d\ \fR\fB\fIdebug\-level\fR\fR] [\fB\-E\ \fR\fB\fIengine\-name\fR\fR] [\fB\-f\fR] [\fB\-g\fR] [\fB\-m\ \fR\fB\fIflag\fR\fR] [\fB\-n\ \fR\fB\fI#cpus\fR\fR] [\fB\-p\ \fR\fB\fIport\fR\fR] [\fB\-s\fR] [\fB\-S\ \fR\fB\fI#max\-socks\fR\fR] [\fB\-t\ \fR\fB\fIdirectory\fR\fR] [\fB\-u\ \fR\fB\fIuser\fR\fR] [\fB\-v\fR] [\fB\-V\fR] [\fB\-x\ \fR\fB\fIcache\-file\fR\fR]
.SH "DESCRIPTION"
.PP
\fBnamed\fR
@@ -83,6 +83,13 @@ Set the daemon's debug level to
become more verbose as the debug level increases.
.RE
.PP
+\-E \fIengine\-name\fR
+.RS 4
+Use a crypto hardware (OpenSSL engine) for the crypto operations it supports, for instance re\-signing with private keys from a secure key store. When compiled with PKCS#11 support
+\fIengine\-name\fR
+defaults to pkcs11, the empty name resets it to no engine.
+.RE
+.PP
\-f
.RS 4
Run the server in the foreground (i.e. do not daemonize).
diff --git a/contrib/bind9/bin/named/named.conf.5 b/contrib/bind9/bin/named/named.conf.5
index cd0d4ad..9dc7002b 100644
--- a/contrib/bind9/bin/named/named.conf.5
+++ b/contrib/bind9/bin/named/named.conf.5
@@ -1,4 +1,4 @@
-.\" Copyright (C) 2004-2008 Internet Systems Consortium, Inc. ("ISC")
+.\" Copyright (C) 2004-2011 Internet Systems Consortium, Inc. ("ISC")
.\"
.\" Permission to use, copy, modify, and/or distribute this software for any
.\" purpose with or without fee is hereby granted, provided that the above
@@ -12,7 +12,7 @@
.\" OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
.\" PERFORMANCE OF THIS SOFTWARE.
.\"
-.\" $Id: named.conf.5,v 1.36.48.1 2009-07-11 01:55:21 tbox Exp $
+.\" $Id: named.conf.5,v 1.44.12.1 2011-02-03 12:29:12 tbox Exp $
.\"
.hy 0
.ad l
@@ -102,6 +102,15 @@ trusted\-keys {
};
.fi
.RE
+.SH "MANAGED\-KEYS"
+.sp
+.RS 4
+.nf
+managed\-keys {
+ \fIdomain_name\fR \fBinitial\-key\fR \fIflags\fR \fIprotocol\fR \fIalgorithm\fR \fIkey\fR; ...
+};
+.fi
+.RE
.SH "CONTROLS"
.sp
.RS 4
@@ -186,6 +195,7 @@ options {
tcp\-listen\-queue \fIinteger\fR;
tkey\-dhkey \fIquoted_string\fR \fIinteger\fR;
tkey\-gssapi\-credential \fIquoted_string\fR;
+ tkey\-gssapi\-keytab \fIquoted_string\fR;
tkey\-domain \fIquoted_string\fR;
transfers\-per\-ns \fIinteger\fR;
transfers\-in \fIinteger\fR;
@@ -214,6 +224,7 @@ options {
queryport\-pool\-ports \fIinteger\fR;
queryport\-pool\-updateinterval \fIinteger\fR;
cleaning\-interval \fIinteger\fR;
+ resolver\-query\-timeout \fIinteger\fR;
min\-roots \fIinteger\fR; // not implemented
lame\-ttl \fIinteger\fR;
max\-ncache\-ttl \fIinteger\fR;
@@ -244,8 +255,19 @@ options {
dnssec\-enable \fIboolean\fR;
dnssec\-validation \fIboolean\fR;
dnssec\-lookaside \fIstring\fR trust\-anchor \fIstring\fR;
+ dnssec\-lookaside ( \fIauto\fR | \fIdomain\fR trust\-anchor \fIdomain\fR );
dnssec\-must\-be\-secure \fIstring\fR \fIboolean\fR;
dnssec\-accept\-expired \fIboolean\fR;
+ dns64\-server \fIstring\fR;
+ dns64\-contact \fIstring\fR;
+ dns64 \fIprefix\fR {
+ clients { <replacable>acl</replacable>; };
+ exclude { <replacable>acl</replacable>; };
+ mapped { <replacable>acl</replacable>; };
+ break\-dnssec \fIboolean\fR;
+ recursive\-only \fIboolean\fR;
+ suffix \fIipv6_address\fR;
+ };
empty\-server \fIstring\fR;
empty\-contact \fIstring\fR;
empty\-zones\-enable \fIboolean\fR;
@@ -260,6 +282,7 @@ options {
allow\-update { \fIaddress_match_element\fR; ... };
allow\-update\-forwarding { \fIaddress_match_element\fR; ... };
update\-check\-ksk \fIboolean\fR;
+ dnssec\-dnskey\-kskonly \fIboolean\fR;
masterfile\-format ( text | raw );
notify \fInotifytype\fR;
notify\-source ( \fIipv4_address\fR | * ) [ port ( \fIinteger\fR | * ) ];
@@ -299,9 +322,18 @@ options {
use\-alt\-transfer\-source \fIboolean\fR;
zone\-statistics \fIboolean\fR;
key\-directory \fIquoted_string\fR;
+ managed\-keys\-directory \fIquoted_string\fR;
+ auto\-dnssec \fBallow\fR|\fBmaintain\fR|\fBcreate\fR|\fBoff\fR;
try\-tcp\-refresh \fIboolean\fR;
zero\-no\-soa\-ttl \fIboolean\fR;
zero\-no\-soa\-ttl\-cache \fIboolean\fR;
+ dnssec\-secure\-to\-insecure \fIboolean\fR;
+ deny\-answer\-addresses {
+ \fIaddress_match_list\fR
+ } [ except\-from { \fInamelist\fR } ];
+ deny\-answer\-aliases {
+ \fInamelist\fR
+ } [ except\-from { \fInamelist\fR } ];
nsec3\-test\-zone \fIboolean\fR; // testing only
allow\-v6\-synthesis { \fIaddress_match_element\fR; ... }; // obsolete
deallocate\-on\-exit \fIboolean\fR; // obsolete
@@ -337,7 +369,8 @@ view \fIstring\fR \fIoptional_class\fR {
...
};
trusted\-keys {
- \fIstring\fR \fIinteger\fR \fIinteger\fR \fIinteger\fR \fIquoted_string\fR; ...
+ \fIstring\fR \fIinteger\fR \fIinteger\fR \fIinteger\fR \fIquoted_string\fR;
+ [...]
};
allow\-recursion { \fIaddress_match_element\fR; ... };
allow\-recursion\-on { \fIaddress_match_element\fR; ... };
@@ -361,6 +394,7 @@ view \fIstring\fR \fIoptional_class\fR {
queryport\-pool\-ports \fIinteger\fR;
queryport\-pool\-updateinterval \fIinteger\fR;
cleaning\-interval \fIinteger\fR;
+ resolver\-query\-timeout \fIinteger\fR;
min\-roots \fIinteger\fR; // not implemented
lame\-ttl \fIinteger\fR;
max\-ncache\-ttl \fIinteger\fR;
@@ -393,6 +427,16 @@ view \fIstring\fR \fIoptional_class\fR {
dnssec\-lookaside \fIstring\fR trust\-anchor \fIstring\fR;
dnssec\-must\-be\-secure \fIstring\fR \fIboolean\fR;
dnssec\-accept\-expired \fIboolean\fR;
+ dns64\-server \fIstring\fR;
+ dns64\-contact \fIstring\fR;
+ dns64 \fIprefix\fR {
+ clients { <replacable>acl</replacable>; };
+ exclude { <replacable>acl</replacable>; };
+ mapped { <replacable>acl</replacable>; };
+ break\-dnssec \fIboolean\fR;
+ recursive\-only \fIboolean\fR;
+ suffix \fIipv6_address\fR;
+ };
empty\-server \fIstring\fR;
empty\-contact \fIstring\fR;
empty\-zones\-enable \fIboolean\fR;
@@ -407,6 +451,7 @@ view \fIstring\fR \fIoptional_class\fR {
allow\-update { \fIaddress_match_element\fR; ... };
allow\-update\-forwarding { \fIaddress_match_element\fR; ... };
update\-check\-ksk \fIboolean\fR;
+ dnssec\-dnskey\-kskonly \fIboolean\fR;
masterfile\-format ( text | raw );
notify \fInotifytype\fR;
notify\-source ( \fIipv4_address\fR | * ) [ port ( \fIinteger\fR | * ) ];
@@ -445,6 +490,7 @@ view \fIstring\fR \fIoptional_class\fR {
key\-directory \fIquoted_string\fR;
zero\-no\-soa\-ttl \fIboolean\fR;
zero\-no\-soa\-ttl\-cache \fIboolean\fR;
+ dnssec\-secure\-to\-insecure \fIboolean\fR;
allow\-v6\-synthesis { \fIaddress_match_element\fR; ... }; // obsolete
fetch\-glue \fIboolean\fR; // obsolete
maintain\-ixfr\-base \fIboolean\fR; // obsolete
@@ -476,19 +522,22 @@ zone \fIstring\fR \fIoptional_class\fR {
ixfr\-from\-differences \fIboolean\fR;
journal \fIquoted_string\fR;
zero\-no\-soa\-ttl \fIboolean\fR;
+ dnssec\-secure\-to\-insecure \fIboolean\fR;
allow\-query { \fIaddress_match_element\fR; ... };
allow\-query\-on { \fIaddress_match_element\fR; ... };
allow\-transfer { \fIaddress_match_element\fR; ... };
allow\-update { \fIaddress_match_element\fR; ... };
allow\-update\-forwarding { \fIaddress_match_element\fR; ... };
- update\-policy {
- ( grant | deny ) \fIstring\fR
+ update\-policy \fIlocal\fR | \fI {
+ ( grant | deny ) \fR\fI\fIstring\fR\fR\fI
( name | subdomain | wildcard | self | selfsub | selfwild |
krb5\-self | ms\-self | krb5\-subdomain | ms\-subdomain |
- tcp\-self | 6to4\-self ) \fIstring\fR
- \fIrrtypelist\fR; ...
- };
+ tcp\-self | zonesub | 6to4\-self ) \fR\fI\fIstring\fR\fR\fI
+ \fR\fI\fIrrtypelist\fR\fR\fI;
+ \fR\fI[...]\fR\fI
+ }\fR;
update\-check\-ksk \fIboolean\fR;
+ dnssec\-dnskey\-kskonly \fIboolean\fR;
masterfile\-format ( text | raw );
notify \fInotifytype\fR;
notify\-source ( \fIipv4_address\fR | * ) [ port ( \fIinteger\fR | * ) ];
@@ -544,5 +593,5 @@ zone \fIstring\fR \fIoptional_class\fR {
\fBrndc\fR(8),
BIND 9 Administrator Reference Manual.
.SH "COPYRIGHT"
-Copyright \(co 2004\-2008 Internet Systems Consortium, Inc. ("ISC")
+Copyright \(co 2004\-2011 Internet Systems Consortium, Inc. ("ISC")
.br
diff --git a/contrib/bind9/bin/named/named.conf.docbook b/contrib/bind9/bin/named/named.conf.docbook
index d98e289..962eaaa 100644
--- a/contrib/bind9/bin/named/named.conf.docbook
+++ b/contrib/bind9/bin/named/named.conf.docbook
@@ -2,7 +2,7 @@
"http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd"
[<!ENTITY mdash "&#8212;">]>
<!--
- - Copyright (C) 2004-2008 Internet Systems Consortium, Inc. ("ISC")
+ - Copyright (C) 2004-2011 Internet Systems Consortium, Inc. ("ISC")
-
- Permission to use, copy, modify, and/or distribute this software for any
- purpose with or without fee is hereby granted, provided that the above
@@ -17,7 +17,7 @@
- PERFORMANCE OF THIS SOFTWARE.
-->
-<!-- $Id: named.conf.docbook,v 1.39 2008-09-24 02:46:21 marka Exp $ -->
+<!-- $Id: named.conf.docbook,v 1.49.14.1 2011-02-03 05:50:05 marka Exp $ -->
<refentry>
<refentryinfo>
<date>Aug 13, 2004</date>
@@ -41,6 +41,9 @@
<year>2006</year>
<year>2007</year>
<year>2008</year>
+ <year>2009</year>
+ <year>2010</year>
+ <year>2011</year>
<holder>Internet Systems Consortium, Inc. ("ISC")</holder>
</copyright>
</docinfo>
@@ -132,6 +135,15 @@ trusted-keys {
</refsect1>
<refsect1>
+ <title>MANAGED-KEYS</title>
+ <literallayout>
+managed-keys {
+ <replaceable>domain_name</replaceable> <constant>initial-key</constant> <replaceable>flags</replaceable> <replaceable>protocol</replaceable> <replaceable>algorithm</replaceable> <replaceable>key</replaceable>; ...
+};
+</literallayout>
+ </refsect1>
+
+ <refsect1>
<title>CONTROLS</title>
<literallayout>
controls {
@@ -214,6 +226,7 @@ options {
tcp-listen-queue <replaceable>integer</replaceable>;
tkey-dhkey <replaceable>quoted_string</replaceable> <replaceable>integer</replaceable>;
tkey-gssapi-credential <replaceable>quoted_string</replaceable>;
+ tkey-gssapi-keytab <replaceable>quoted_string</replaceable>;
tkey-domain <replaceable>quoted_string</replaceable>;
transfers-per-ns <replaceable>integer</replaceable>;
transfers-in <replaceable>integer</replaceable>;
@@ -242,6 +255,7 @@ options {
queryport-pool-ports <replaceable>integer</replaceable>;
queryport-pool-updateinterval <replaceable>integer</replaceable>;
cleaning-interval <replaceable>integer</replaceable>;
+ resolver-query-timeout <replaceable>integer</replaceable>;
min-roots <replaceable>integer</replaceable>; // not implemented
lame-ttl <replaceable>integer</replaceable>;
max-ncache-ttl <replaceable>integer</replaceable>;
@@ -272,9 +286,21 @@ options {
dnssec-enable <replaceable>boolean</replaceable>;
dnssec-validation <replaceable>boolean</replaceable>;
dnssec-lookaside <replaceable>string</replaceable> trust-anchor <replaceable>string</replaceable>;
+ dnssec-lookaside ( <replaceable>auto</replaceable> | <replaceable>domain</replaceable> trust-anchor <replaceable>domain</replaceable> );
dnssec-must-be-secure <replaceable>string</replaceable> <replaceable>boolean</replaceable>;
dnssec-accept-expired <replaceable>boolean</replaceable>;
+ dns64-server <replaceable>string</replaceable>;
+ dns64-contact <replaceable>string</replaceable>;
+ dns64 <replaceable>prefix</replaceable> {
+ clients { <replacable>acl</replacable>; };
+ exclude { <replacable>acl</replacable>; };
+ mapped { <replacable>acl</replacable>; };
+ break-dnssec <replaceable>boolean</replaceable>;
+ recursive-only <replaceable>boolean</replaceable>;
+ suffix <replaceable>ipv6_address</replaceable>;
+ };
+
empty-server <replaceable>string</replaceable>;
empty-contact <replaceable>string</replaceable>;
empty-zones-enable <replaceable>boolean</replaceable>;
@@ -291,6 +317,7 @@ options {
allow-update { <replaceable>address_match_element</replaceable>; ... };
allow-update-forwarding { <replaceable>address_match_element</replaceable>; ... };
update-check-ksk <replaceable>boolean</replaceable>;
+ dnssec-dnskey-kskonly <replaceable>boolean</replaceable>;
masterfile-format ( text | raw );
notify <replaceable>notifytype</replaceable>;
@@ -337,9 +364,18 @@ options {
zone-statistics <replaceable>boolean</replaceable>;
key-directory <replaceable>quoted_string</replaceable>;
+ managed-keys-directory <replaceable>quoted_string</replaceable>;
+ auto-dnssec <constant>allow</constant>|<constant>maintain</constant>|<constant>create</constant>|<constant>off</constant>;
try-tcp-refresh <replaceable>boolean</replaceable>;
zero-no-soa-ttl <replaceable>boolean</replaceable>;
zero-no-soa-ttl-cache <replaceable>boolean</replaceable>;
+ dnssec-secure-to-insecure <replaceable>boolean</replaceable>;
+ deny-answer-addresses {
+ <replaceable>address_match_list</replaceable>
+ } <optional> except-from { <replaceable>namelist</replaceable> } </optional>;
+ deny-answer-aliases {
+ <replaceable>namelist</replaceable>
+ } <optional> except-from { <replaceable>namelist</replaceable> } </optional>;
nsec3-test-zone <replaceable>boolean</replaceable>; // testing only
@@ -381,7 +417,8 @@ view <replaceable>string</replaceable> <replaceable>optional_class</replaceable>
};
trusted-keys {
- <replaceable>string</replaceable> <replaceable>integer</replaceable> <replaceable>integer</replaceable> <replaceable>integer</replaceable> <replaceable>quoted_string</replaceable>; ...
+ <replaceable>string</replaceable> <replaceable>integer</replaceable> <replaceable>integer</replaceable> <replaceable>integer</replaceable> <replaceable>quoted_string</replaceable>;
+ <optional>...</optional>
};
allow-recursion { <replaceable>address_match_element</replaceable>; ... };
@@ -406,6 +443,7 @@ view <replaceable>string</replaceable> <replaceable>optional_class</replaceable>
queryport-pool-ports <replaceable>integer</replaceable>;
queryport-pool-updateinterval <replaceable>integer</replaceable>;
cleaning-interval <replaceable>integer</replaceable>;
+ resolver-query-timeout <replaceable>integer</replaceable>;
min-roots <replaceable>integer</replaceable>; // not implemented
lame-ttl <replaceable>integer</replaceable>;
max-ncache-ttl <replaceable>integer</replaceable>;
@@ -439,6 +477,17 @@ view <replaceable>string</replaceable> <replaceable>optional_class</replaceable>
dnssec-must-be-secure <replaceable>string</replaceable> <replaceable>boolean</replaceable>;
dnssec-accept-expired <replaceable>boolean</replaceable>;
+ dns64-server <replaceable>string</replaceable>;
+ dns64-contact <replaceable>string</replaceable>;
+ dns64 <replaceable>prefix</replaceable> {
+ clients { <replacable>acl</replacable>; };
+ exclude { <replacable>acl</replacable>; };
+ mapped { <replacable>acl</replacable>; };
+ break-dnssec <replaceable>boolean</replaceable>;
+ recursive-only <replaceable>boolean</replaceable>;
+ suffix <replaceable>ipv6_address</replaceable>;
+ };
+
empty-server <replaceable>string</replaceable>;
empty-contact <replaceable>string</replaceable>;
empty-zones-enable <replaceable>boolean</replaceable>;
@@ -455,6 +504,7 @@ view <replaceable>string</replaceable> <replaceable>optional_class</replaceable>
allow-update { <replaceable>address_match_element</replaceable>; ... };
allow-update-forwarding { <replaceable>address_match_element</replaceable>; ... };
update-check-ksk <replaceable>boolean</replaceable>;
+ dnssec-dnskey-kskonly <replaceable>boolean</replaceable>;
masterfile-format ( text | raw );
notify <replaceable>notifytype</replaceable>;
@@ -499,6 +549,7 @@ view <replaceable>string</replaceable> <replaceable>optional_class</replaceable>
key-directory <replaceable>quoted_string</replaceable>;
zero-no-soa-ttl <replaceable>boolean</replaceable>;
zero-no-soa-ttl-cache <replaceable>boolean</replaceable>;
+ dnssec-secure-to-insecure <replaceable>boolean</replaceable>;
allow-v6-synthesis { <replaceable>address_match_element</replaceable>; ... }; // obsolete
fetch-glue <replaceable>boolean</replaceable>; // obsolete
@@ -533,20 +584,23 @@ zone <replaceable>string</replaceable> <replaceable>optional_class</replaceable>
ixfr-from-differences <replaceable>boolean</replaceable>;
journal <replaceable>quoted_string</replaceable>;
zero-no-soa-ttl <replaceable>boolean</replaceable>;
+ dnssec-secure-to-insecure <replaceable>boolean</replaceable>;
allow-query { <replaceable>address_match_element</replaceable>; ... };
allow-query-on { <replaceable>address_match_element</replaceable>; ... };
allow-transfer { <replaceable>address_match_element</replaceable>; ... };
allow-update { <replaceable>address_match_element</replaceable>; ... };
allow-update-forwarding { <replaceable>address_match_element</replaceable>; ... };
- update-policy {
+ update-policy <replaceable>local</replaceable> | <replaceable> {
( grant | deny ) <replaceable>string</replaceable>
( name | subdomain | wildcard | self | selfsub | selfwild |
krb5-self | ms-self | krb5-subdomain | ms-subdomain |
- tcp-self | 6to4-self ) <replaceable>string</replaceable>
- <replaceable>rrtypelist</replaceable>; ...
- };
+ tcp-self | zonesub | 6to4-self ) <replaceable>string</replaceable>
+ <replaceable>rrtypelist</replaceable>;
+ <optional>...</optional>
+ }</replaceable>;
update-check-ksk <replaceable>boolean</replaceable>;
+ dnssec-dnskey-kskonly <replaceable>boolean</replaceable>;
masterfile-format ( text | raw );
notify <replaceable>notifytype</replaceable>;
diff --git a/contrib/bind9/bin/named/named.conf.html b/contrib/bind9/bin/named/named.conf.html
index fccad18..f20e411 100644
--- a/contrib/bind9/bin/named/named.conf.html
+++ b/contrib/bind9/bin/named/named.conf.html
@@ -1,5 +1,5 @@
<!--
- - Copyright (C) 2004-2008 Internet Systems Consortium, Inc. ("ISC")
+ - Copyright (C) 2004-2011 Internet Systems Consortium, Inc. ("ISC")
-
- Permission to use, copy, modify, and/or distribute this software for any
- purpose with or without fee is hereby granted, provided that the above
@@ -13,7 +13,7 @@
- OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
- PERFORMANCE OF THIS SOFTWARE.
-->
-<!-- $Id: named.conf.html,v 1.45.48.1 2009-07-11 01:55:21 tbox Exp $ -->
+<!-- $Id: named.conf.html,v 1.53.12.1 2011-02-03 12:29:12 tbox Exp $ -->
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
@@ -31,7 +31,7 @@
<div class="cmdsynopsis"><p><code class="command">named.conf</code> </p></div>
</div>
<div class="refsect1" lang="en">
-<a name="id2543342"></a><h2>DESCRIPTION</h2>
+<a name="id2543352"></a><h2>DESCRIPTION</h2>
<p><code class="filename">named.conf</code> is the configuration file
for
<span><strong class="command">named</strong></span>. Statements are enclosed
@@ -50,14 +50,14 @@
</p>
</div>
<div class="refsect1" lang="en">
-<a name="id2543370"></a><h2>ACL</h2>
+<a name="id2543380"></a><h2>ACL</h2>
<div class="literallayout"><p><br>
acl <em class="replaceable"><code>string</code></em> { <em class="replaceable"><code>address_match_element</code></em>; ... };<br>
<br>
</p></div>
</div>
<div class="refsect1" lang="en">
-<a name="id2543386"></a><h2>KEY</h2>
+<a name="id2543396"></a><h2>KEY</h2>
<div class="literallayout"><p><br>
key <em class="replaceable"><code>domain_name</code></em> {<br>
algorithm <em class="replaceable"><code>string</code></em>;<br>
@@ -66,7 +66,7 @@ key <em class="replaceable"><code>domain_name</code></em> {<br>
</p></div>
</div>
<div class="refsect1" lang="en">
-<a name="id2543405"></a><h2>MASTERS</h2>
+<a name="id2543415"></a><h2>MASTERS</h2>
<div class="literallayout"><p><br>
masters <em class="replaceable"><code>string</code></em> [<span class="optional"> port <em class="replaceable"><code>integer</code></em> </span>] {<br>
( <em class="replaceable"><code>masters</code></em> | <em class="replaceable"><code>ipv4_address</code></em> [<span class="optional">port <em class="replaceable"><code>integer</code></em></span>] |<br>
@@ -75,7 +75,7 @@ masters <em class="replaceable"><code>string</code></em> [<span class="optional"
</p></div>
</div>
<div class="refsect1" lang="en">
-<a name="id2543451"></a><h2>SERVER</h2>
+<a name="id2543461"></a><h2>SERVER</h2>
<div class="literallayout"><p><br>
server ( <em class="replaceable"><code>ipv4_address[<span class="optional">/prefixlen</span>]</code></em> | <em class="replaceable"><code>ipv6_address[<span class="optional">/prefixlen</span>]</code></em> ) {<br>
bogus <em class="replaceable"><code>boolean</code></em>;<br>
@@ -97,7 +97,7 @@ server ( <em class="replaceable"><code>ipv4_address[<span class="optional">/pref
</p></div>
</div>
<div class="refsect1" lang="en">
-<a name="id2543520"></a><h2>TRUSTED-KEYS</h2>
+<a name="id2543529"></a><h2>TRUSTED-KEYS</h2>
<div class="literallayout"><p><br>
trusted-keys {<br>
<em class="replaceable"><code>domain_name</code></em> <em class="replaceable"><code>flags</code></em> <em class="replaceable"><code>protocol</code></em> <em class="replaceable"><code>algorithm</code></em> <em class="replaceable"><code>key</code></em>; ... <br>
@@ -105,7 +105,15 @@ trusted-keys {<br>
</p></div>
</div>
<div class="refsect1" lang="en">
-<a name="id2543545"></a><h2>CONTROLS</h2>
+<a name="id2543555"></a><h2>MANAGED-KEYS</h2>
+<div class="literallayout"><p><br>
+managed-keys {<br>
+ <em class="replaceable"><code>domain_name</code></em> <code class="constant">initial-key</code> <em class="replaceable"><code>flags</code></em> <em class="replaceable"><code>protocol</code></em> <em class="replaceable"><code>algorithm</code></em> <em class="replaceable"><code>key</code></em>; ... <br>
+};<br>
+</p></div>
+</div>
+<div class="refsect1" lang="en">
+<a name="id2543584"></a><h2>CONTROLS</h2>
<div class="literallayout"><p><br>
controls {<br>
inet ( <em class="replaceable"><code>ipv4_address</code></em> | <em class="replaceable"><code>ipv6_address</code></em> | * )<br>
@@ -117,7 +125,7 @@ controls {<br>
</p></div>
</div>
<div class="refsect1" lang="en">
-<a name="id2543580"></a><h2>LOGGING</h2>
+<a name="id2543619"></a><h2>LOGGING</h2>
<div class="literallayout"><p><br>
logging {<br>
channel <em class="replaceable"><code>string</code></em> {<br>
@@ -135,7 +143,7 @@ logging {<br>
</p></div>
</div>
<div class="refsect1" lang="en">
-<a name="id2543619"></a><h2>LWRES</h2>
+<a name="id2543657"></a><h2>LWRES</h2>
<div class="literallayout"><p><br>
lwres {<br>
listen-on [<span class="optional"> port <em class="replaceable"><code>integer</code></em> </span>] {<br>
@@ -148,7 +156,7 @@ lwres {<br>
</p></div>
</div>
<div class="refsect1" lang="en">
-<a name="id2543660"></a><h2>OPTIONS</h2>
+<a name="id2543699"></a><h2>OPTIONS</h2>
<div class="literallayout"><p><br>
options {<br>
avoid-v4-udp-ports { <em class="replaceable"><code>port</code></em>; ... };<br>
@@ -184,6 +192,7 @@ options {<br>
tcp-listen-queue <em class="replaceable"><code>integer</code></em>;<br>
tkey-dhkey <em class="replaceable"><code>quoted_string</code></em> <em class="replaceable"><code>integer</code></em>;<br>
tkey-gssapi-credential <em class="replaceable"><code>quoted_string</code></em>;<br>
+ tkey-gssapi-keytab <em class="replaceable"><code>quoted_string</code></em>;<br>
tkey-domain <em class="replaceable"><code>quoted_string</code></em>;<br>
transfers-per-ns <em class="replaceable"><code>integer</code></em>;<br>
transfers-in <em class="replaceable"><code>integer</code></em>;<br>
@@ -212,6 +221,7 @@ options {<br>
queryport-pool-ports <em class="replaceable"><code>integer</code></em>;<br>
queryport-pool-updateinterval <em class="replaceable"><code>integer</code></em>;<br>
cleaning-interval <em class="replaceable"><code>integer</code></em>;<br>
+ resolver-query-timeout <em class="replaceable"><code>integer</code></em>;<br>
min-roots <em class="replaceable"><code>integer</code></em>; // not implemented<br>
lame-ttl <em class="replaceable"><code>integer</code></em>;<br>
max-ncache-ttl <em class="replaceable"><code>integer</code></em>;<br>
@@ -242,9 +252,21 @@ options {<br>
dnssec-enable <em class="replaceable"><code>boolean</code></em>;<br>
dnssec-validation <em class="replaceable"><code>boolean</code></em>;<br>
dnssec-lookaside <em class="replaceable"><code>string</code></em> trust-anchor <em class="replaceable"><code>string</code></em>;<br>
+ dnssec-lookaside ( <em class="replaceable"><code>auto</code></em> | <em class="replaceable"><code>domain</code></em> trust-anchor <em class="replaceable"><code>domain</code></em> );<br>
dnssec-must-be-secure <em class="replaceable"><code>string</code></em> <em class="replaceable"><code>boolean</code></em>;<br>
dnssec-accept-expired <em class="replaceable"><code>boolean</code></em>;<br>
<br>
+ dns64-server <em class="replaceable"><code>string</code></em>;<br>
+ dns64-contact <em class="replaceable"><code>string</code></em>;<br>
+ dns64 <em class="replaceable"><code>prefix</code></em> {<br>
+ clients { <font color="red">&lt;replacable&gt;acl&lt;/replacable&gt;</font>; };<br>
+ exclude { <font color="red">&lt;replacable&gt;acl&lt;/replacable&gt;</font>; };<br>
+ mapped { <font color="red">&lt;replacable&gt;acl&lt;/replacable&gt;</font>; };<br>
+ break-dnssec <em class="replaceable"><code>boolean</code></em>;<br>
+ recursive-only <em class="replaceable"><code>boolean</code></em>;<br>
+ suffix <em class="replaceable"><code>ipv6_address</code></em>;<br>
+ };<br>
+<br>
empty-server <em class="replaceable"><code>string</code></em>;<br>
empty-contact <em class="replaceable"><code>string</code></em>;<br>
empty-zones-enable <em class="replaceable"><code>boolean</code></em>;<br>
@@ -261,6 +283,7 @@ options {<br>
allow-update { <em class="replaceable"><code>address_match_element</code></em>; ... };<br>
allow-update-forwarding { <em class="replaceable"><code>address_match_element</code></em>; ... };<br>
update-check-ksk <em class="replaceable"><code>boolean</code></em>;<br>
+ dnssec-dnskey-kskonly <em class="replaceable"><code>boolean</code></em>;<br>
<br>
masterfile-format ( text | raw );<br>
notify <em class="replaceable"><code>notifytype</code></em>;<br>
@@ -307,9 +330,18 @@ options {<br>
<br>
zone-statistics <em class="replaceable"><code>boolean</code></em>;<br>
key-directory <em class="replaceable"><code>quoted_string</code></em>;<br>
+ managed-keys-directory <em class="replaceable"><code>quoted_string</code></em>;<br>
+ auto-dnssec <code class="constant">allow</code>|<code class="constant">maintain</code>|<code class="constant">create</code>|<code class="constant">off</code>;<br>
try-tcp-refresh <em class="replaceable"><code>boolean</code></em>;<br>
zero-no-soa-ttl <em class="replaceable"><code>boolean</code></em>;<br>
zero-no-soa-ttl-cache <em class="replaceable"><code>boolean</code></em>;<br>
+ dnssec-secure-to-insecure <em class="replaceable"><code>boolean</code></em>;<br>
+ deny-answer-addresses {<br>
+ <em class="replaceable"><code>address_match_list</code></em><br>
+ } [<span class="optional"> except-from { <em class="replaceable"><code>namelist</code></em> } </span>];<br>
+ deny-answer-aliases {<br>
+ <em class="replaceable"><code>namelist</code></em><br>
+ } [<span class="optional"> except-from { <em class="replaceable"><code>namelist</code></em> } </span>];<br>
<br>
nsec3-test-zone <em class="replaceable"><code>boolean</code></em>;  // testing only<br>
<br>
@@ -329,7 +361,7 @@ options {<br>
</p></div>
</div>
<div class="refsect1" lang="en">
-<a name="id2544452"></a><h2>VIEW</h2>
+<a name="id2544577"></a><h2>VIEW</h2>
<div class="literallayout"><p><br>
view <em class="replaceable"><code>string</code></em> <em class="replaceable"><code>optional_class</code></em> {<br>
match-clients { <em class="replaceable"><code>address_match_element</code></em>; ... };<br>
@@ -350,7 +382,8 @@ view <em class="replaceable"><code>string</code></em> <em class="replaceable"><c
};<br>
<br>
trusted-keys {<br>
- <em class="replaceable"><code>string</code></em> <em class="replaceable"><code>integer</code></em> <em class="replaceable"><code>integer</code></em> <em class="replaceable"><code>integer</code></em> <em class="replaceable"><code>quoted_string</code></em>; ...<br>
+ <em class="replaceable"><code>string</code></em> <em class="replaceable"><code>integer</code></em> <em class="replaceable"><code>integer</code></em> <em class="replaceable"><code>integer</code></em> <em class="replaceable"><code>quoted_string</code></em>;<br>
+ [<span class="optional">...</span>]<br>
};<br>
<br>
allow-recursion { <em class="replaceable"><code>address_match_element</code></em>; ... };<br>
@@ -375,6 +408,7 @@ view <em class="replaceable"><code>string</code></em> <em class="replaceable"><c
queryport-pool-ports <em class="replaceable"><code>integer</code></em>;<br>
queryport-pool-updateinterval <em class="replaceable"><code>integer</code></em>;<br>
cleaning-interval <em class="replaceable"><code>integer</code></em>;<br>
+ resolver-query-timeout <em class="replaceable"><code>integer</code></em>;<br>
min-roots <em class="replaceable"><code>integer</code></em>; // not implemented<br>
lame-ttl <em class="replaceable"><code>integer</code></em>;<br>
max-ncache-ttl <em class="replaceable"><code>integer</code></em>;<br>
@@ -408,6 +442,17 @@ view <em class="replaceable"><code>string</code></em> <em class="replaceable"><c
dnssec-must-be-secure <em class="replaceable"><code>string</code></em> <em class="replaceable"><code>boolean</code></em>;<br>
dnssec-accept-expired <em class="replaceable"><code>boolean</code></em>;<br>
<br>
+ dns64-server <em class="replaceable"><code>string</code></em>;<br>
+ dns64-contact <em class="replaceable"><code>string</code></em>;<br>
+ dns64 <em class="replaceable"><code>prefix</code></em> {<br>
+ clients { <font color="red">&lt;replacable&gt;acl&lt;/replacable&gt;</font>; };<br>
+ exclude { <font color="red">&lt;replacable&gt;acl&lt;/replacable&gt;</font>; };<br>
+ mapped { <font color="red">&lt;replacable&gt;acl&lt;/replacable&gt;</font>; };<br>
+ break-dnssec <em class="replaceable"><code>boolean</code></em>;<br>
+ recursive-only <em class="replaceable"><code>boolean</code></em>;<br>
+ suffix <em class="replaceable"><code>ipv6_address</code></em>;<br>
+ };<br>
+<br>
empty-server <em class="replaceable"><code>string</code></em>;<br>
empty-contact <em class="replaceable"><code>string</code></em>;<br>
empty-zones-enable <em class="replaceable"><code>boolean</code></em>;<br>
@@ -424,6 +469,7 @@ view <em class="replaceable"><code>string</code></em> <em class="replaceable"><c
allow-update { <em class="replaceable"><code>address_match_element</code></em>; ... };<br>
allow-update-forwarding { <em class="replaceable"><code>address_match_element</code></em>; ... };<br>
update-check-ksk <em class="replaceable"><code>boolean</code></em>;<br>
+ dnssec-dnskey-kskonly <em class="replaceable"><code>boolean</code></em>;<br>
<br>
masterfile-format ( text | raw );<br>
notify <em class="replaceable"><code>notifytype</code></em>;<br>
@@ -468,6 +514,7 @@ view <em class="replaceable"><code>string</code></em> <em class="replaceable"><c
key-directory <em class="replaceable"><code>quoted_string</code></em>;<br>
zero-no-soa-ttl <em class="replaceable"><code>boolean</code></em>;<br>
zero-no-soa-ttl-cache <em class="replaceable"><code>boolean</code></em>;<br>
+ dnssec-secure-to-insecure <em class="replaceable"><code>boolean</code></em>;<br>
<br>
allow-v6-synthesis { <em class="replaceable"><code>address_match_element</code></em>; ... }; // obsolete<br>
fetch-glue <em class="replaceable"><code>boolean</code></em>; // obsolete<br>
@@ -477,7 +524,7 @@ view <em class="replaceable"><code>string</code></em> <em class="replaceable"><c
</p></div>
</div>
<div class="refsect1" lang="en">
-<a name="id2545113"></a><h2>ZONE</h2>
+<a name="id2545280"></a><h2>ZONE</h2>
<div class="literallayout"><p><br>
zone <em class="replaceable"><code>string</code></em> <em class="replaceable"><code>optional_class</code></em> {<br>
type ( master | slave | stub | hint |<br>
@@ -501,20 +548,23 @@ zone <em class="replaceable"><code>string</code></em> <em class="replaceable"><c
ixfr-from-differences <em class="replaceable"><code>boolean</code></em>;<br>
journal <em class="replaceable"><code>quoted_string</code></em>;<br>
zero-no-soa-ttl <em class="replaceable"><code>boolean</code></em>;<br>
+ dnssec-secure-to-insecure <em class="replaceable"><code>boolean</code></em>;<br>
<br>
allow-query { <em class="replaceable"><code>address_match_element</code></em>; ... };<br>
allow-query-on { <em class="replaceable"><code>address_match_element</code></em>; ... };<br>
allow-transfer { <em class="replaceable"><code>address_match_element</code></em>; ... };<br>
allow-update { <em class="replaceable"><code>address_match_element</code></em>; ... };<br>
allow-update-forwarding { <em class="replaceable"><code>address_match_element</code></em>; ... };<br>
- update-policy {<br>
+ update-policy <em class="replaceable"><code>local</code></em> | <em class="replaceable"><code> {<br>
( grant | deny ) <em class="replaceable"><code>string</code></em><br>
( name | subdomain | wildcard | self | selfsub | selfwild |<br>
                  krb5-self | ms-self | krb5-subdomain | ms-subdomain |<br>
-   tcp-self | 6to4-self ) <em class="replaceable"><code>string</code></em><br>
- <em class="replaceable"><code>rrtypelist</code></em>; ...<br>
- };<br>
+   tcp-self | zonesub | 6to4-self ) <em class="replaceable"><code>string</code></em><br>
+ <em class="replaceable"><code>rrtypelist</code></em>;<br>
+ [<span class="optional">...</span>]<br>
+ }</code></em>;<br>
update-check-ksk <em class="replaceable"><code>boolean</code></em>;<br>
+ dnssec-dnskey-kskonly <em class="replaceable"><code>boolean</code></em>;<br>
<br>
masterfile-format ( text | raw );<br>
notify <em class="replaceable"><code>notifytype</code></em>;<br>
@@ -569,12 +619,12 @@ zone <em class="replaceable"><code>string</code></em> <em class="replaceable"><c
</p></div>
</div>
<div class="refsect1" lang="en">
-<a name="id2545410"></a><h2>FILES</h2>
+<a name="id2545659"></a><h2>FILES</h2>
<p><code class="filename">/etc/named.conf</code>
</p>
</div>
<div class="refsect1" lang="en">
-<a name="id2545421"></a><h2>SEE ALSO</h2>
+<a name="id2545671"></a><h2>SEE ALSO</h2>
<p><span class="citerefentry"><span class="refentrytitle">named</span>(8)</span>,
<span class="citerefentry"><span class="refentrytitle">named-checkconf</span>(8)</span>,
<span class="citerefentry"><span class="refentrytitle">rndc</span>(8)</span>,
diff --git a/contrib/bind9/bin/named/named.docbook b/contrib/bind9/bin/named/named.docbook
index 808e998..214f8ac 100644
--- a/contrib/bind9/bin/named/named.docbook
+++ b/contrib/bind9/bin/named/named.docbook
@@ -18,7 +18,7 @@
- PERFORMANCE OF THIS SOFTWARE.
-->
-<!-- $Id: named.docbook,v 1.23.14.2 2009-12-03 04:49:32 tbox Exp $ -->
+<!-- $Id: named.docbook,v 1.26 2009-10-05 17:30:49 fdupont Exp $ -->
<refentry id="man.named">
<refentryinfo>
<date>May 21, 2009</date>
@@ -60,6 +60,7 @@
<arg><option>-6</option></arg>
<arg><option>-c <replaceable class="parameter">config-file</replaceable></option></arg>
<arg><option>-d <replaceable class="parameter">debug-level</replaceable></option></arg>
+ <arg><option>-E <replaceable class="parameter">engine-name</replaceable></option></arg>
<arg><option>-f</option></arg>
<arg><option>-g</option></arg>
<arg><option>-m <replaceable class="parameter">flag</replaceable></option></arg>
@@ -116,6 +117,7 @@
</para>
</listitem>
</varlistentry>
+
<varlistentry>
<term>-c <replaceable class="parameter">config-file</replaceable></term>
<listitem>
@@ -145,6 +147,19 @@
</varlistentry>
<varlistentry>
+ <term>-E <replaceable class="parameter">engine-name</replaceable></term>
+ <listitem>
+ <para>
+ Use a crypto hardware (OpenSSL engine) for the crypto operations
+ it supports, for instance re-signing with private keys from
+ a secure key store. When compiled with PKCS#11 support
+ <replaceable class="parameter">engine-name</replaceable>
+ defaults to pkcs11, the empty name resets it to no engine.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
<term>-f</term>
<listitem>
<para>
diff --git a/contrib/bind9/bin/named/named.html b/contrib/bind9/bin/named/named.html
index 031b492..fa869c4 100644
--- a/contrib/bind9/bin/named/named.html
+++ b/contrib/bind9/bin/named/named.html
@@ -14,7 +14,7 @@
- OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
- PERFORMANCE OF THIS SOFTWARE.
-->
-<!-- $Id: named.html,v 1.30.14.2 2009-12-03 05:06:38 tbox Exp $ -->
+<!-- $Id: named.html,v 1.33 2009-10-06 01:14:41 tbox Exp $ -->
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
@@ -29,10 +29,10 @@
</div>
<div class="refsynopsisdiv">
<h2>Synopsis</h2>
-<div class="cmdsynopsis"><p><code class="command">named</code> [<code class="option">-4</code>] [<code class="option">-6</code>] [<code class="option">-c <em class="replaceable"><code>config-file</code></em></code>] [<code class="option">-d <em class="replaceable"><code>debug-level</code></em></code>] [<code class="option">-f</code>] [<code class="option">-g</code>] [<code class="option">-m <em class="replaceable"><code>flag</code></em></code>] [<code class="option">-n <em class="replaceable"><code>#cpus</code></em></code>] [<code class="option">-p <em class="replaceable"><code>port</code></em></code>] [<code class="option">-s</code>] [<code class="option">-S <em class="replaceable"><code>#max-socks</code></em></code>] [<code class="option">-t <em class="replaceable"><code>directory</code></em></code>] [<code class="option">-u <em class="replaceable"><code>user</code></em></code>] [<code class="option">-v</code>] [<code class="option">-V</code>] [<code class="option">-x <em class="replaceable"><code>cache-file</code></em></code>]</p></div>
+<div class="cmdsynopsis"><p><code class="command">named</code> [<code class="option">-4</code>] [<code class="option">-6</code>] [<code class="option">-c <em class="replaceable"><code>config-file</code></em></code>] [<code class="option">-d <em class="replaceable"><code>debug-level</code></em></code>] [<code class="option">-E <em class="replaceable"><code>engine-name</code></em></code>] [<code class="option">-f</code>] [<code class="option">-g</code>] [<code class="option">-m <em class="replaceable"><code>flag</code></em></code>] [<code class="option">-n <em class="replaceable"><code>#cpus</code></em></code>] [<code class="option">-p <em class="replaceable"><code>port</code></em></code>] [<code class="option">-s</code>] [<code class="option">-S <em class="replaceable"><code>#max-socks</code></em></code>] [<code class="option">-t <em class="replaceable"><code>directory</code></em></code>] [<code class="option">-u <em class="replaceable"><code>user</code></em></code>] [<code class="option">-v</code>] [<code class="option">-V</code>] [<code class="option">-x <em class="replaceable"><code>cache-file</code></em></code>]</p></div>
</div>
<div class="refsect1" lang="en">
-<a name="id2543472"></a><h2>DESCRIPTION</h2>
+<a name="id2543480"></a><h2>DESCRIPTION</h2>
<p><span><strong class="command">named</strong></span>
is a Domain Name System (DNS) server,
part of the BIND 9 distribution from ISC. For more
@@ -47,7 +47,7 @@
</p>
</div>
<div class="refsect1" lang="en">
-<a name="id2543496"></a><h2>OPTIONS</h2>
+<a name="id2543505"></a><h2>OPTIONS</h2>
<div class="variablelist"><dl>
<dt><span class="term">-4</span></dt>
<dd><p>
@@ -79,6 +79,14 @@
Debugging traces from <span><strong class="command">named</strong></span> become
more verbose as the debug level increases.
</p></dd>
+<dt><span class="term">-E <em class="replaceable"><code>engine-name</code></em></span></dt>
+<dd><p>
+ Use a crypto hardware (OpenSSL engine) for the crypto operations
+ it supports, for instance re-signing with private keys from
+ a secure key store. When compiled with PKCS#11 support
+ <em class="replaceable"><code>engine-name</code></em>
+ defaults to pkcs11, the empty name resets it to no engine.
+ </p></dd>
<dt><span class="term">-f</span></dt>
<dd><p>
Run the server in the foreground (i.e. do not daemonize).
@@ -220,7 +228,7 @@
</dl></div>
</div>
<div class="refsect1" lang="en">
-<a name="id2543931"></a><h2>SIGNALS</h2>
+<a name="id2543962"></a><h2>SIGNALS</h2>
<p>
In routine operation, signals should not be used to control
the nameserver; <span><strong class="command">rndc</strong></span> should be used
@@ -241,7 +249,7 @@
</p>
</div>
<div class="refsect1" lang="en">
-<a name="id2543979"></a><h2>CONFIGURATION</h2>
+<a name="id2544010"></a><h2>CONFIGURATION</h2>
<p>
The <span><strong class="command">named</strong></span> configuration file is too complex
to describe in detail here. A complete description is provided
@@ -258,7 +266,7 @@
</p>
</div>
<div class="refsect1" lang="en">
-<a name="id2544016"></a><h2>FILES</h2>
+<a name="id2544046"></a><h2>FILES</h2>
<div class="variablelist"><dl>
<dt><span class="term"><code class="filename">/etc/named.conf</code></span></dt>
<dd><p>
@@ -271,7 +279,7 @@
</dl></div>
</div>
<div class="refsect1" lang="en">
-<a name="id2544123"></a><h2>SEE ALSO</h2>
+<a name="id2544086"></a><h2>SEE ALSO</h2>
<p><em class="citetitle">RFC 1033</em>,
<em class="citetitle">RFC 1034</em>,
<em class="citetitle">RFC 1035</em>,
@@ -284,7 +292,7 @@
</p>
</div>
<div class="refsect1" lang="en">
-<a name="id2544194"></a><h2>AUTHOR</h2>
+<a name="id2544293"></a><h2>AUTHOR</h2>
<p><span class="corpauthor">Internet Systems Consortium</span>
</p>
</div>
diff --git a/contrib/bind9/bin/named/query.c b/contrib/bind9/bin/named/query.c
index fa34da6..1950257 100644
--- a/contrib/bind9/bin/named/query.c
+++ b/contrib/bind9/bin/named/query.c
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004-2010 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004-2011 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 1999-2003 Internet Software Consortium.
*
* Permission to use, copy, modify, and/or distribute this software for any
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: query.c,v 1.313.20.24 2010-09-24 08:09:07 marka Exp $ */
+/* $Id: query.c,v 1.353.8.2.2.5 2011-06-09 03:17:10 marka Exp $ */
/*! \file */
@@ -34,6 +34,7 @@
#ifdef DLZ
#include <dns/dlz.h>
#endif
+#include <dns/dns64.h>
#include <dns/dnssec.h>
#include <dns/events.h>
#include <dns/message.h>
@@ -62,6 +63,17 @@
#include <named/sortlist.h>
#include <named/xfrout.h>
+#if 0
+/*
+ * It has been recommended that DNS64 be changed to return excluded
+ * AAAA addresses if DNS64 synthesis does not occur. This minimises
+ * the impact on the lookup results. While most DNS AAAA lookups are
+ * done to send IP packets to a host, not all of them are and filtering
+ * excluded addresses has a negative impact on those uses.
+ */
+#define dns64_bis_return_excluded_addresses 1
+#endif
+
/*% Partial answer? */
#define PARTIALANSWER(c) (((c)->query.attributes & \
NS_QUERYATTR_PARTIALANSWER) != 0)
@@ -92,6 +104,12 @@
/*% Secure? */
#define SECURE(c) (((c)->query.attributes & \
NS_QUERYATTR_SECURE) != 0)
+/*% DNS64 A lookup? */
+#define DNS64(c) (((c)->query.attributes & \
+ NS_QUERYATTR_DNS64) != 0)
+
+#define DNS64EXCLUDE(c) (((c)->query.attributes & \
+ NS_QUERYATTR_DNS64EXCLUDE) != 0)
/*% No QNAME Proof? */
#define NOQNAME(r) (((r)->attributes & \
@@ -116,6 +134,7 @@
#define DNS_GETDB_NOEXACT 0x01U
#define DNS_GETDB_NOLOG 0x02U
#define DNS_GETDB_PARTIAL 0x04U
+#define DNS_GETDB_IGNOREACL 0x08U
#define PENDINGOK(x) (((x) & DNS_DBFIND_PENDINGOK) != 0)
@@ -141,6 +160,9 @@ query_findclosestnsec3(dns_name_t *qname, dns_db_t *db,
static inline void
log_queryerror(ns_client_t *client, isc_result_t result, int line, int level);
+static void
+rpz_st_clear(ns_client_t *client);
+
/*%
* Increment query statistics counters.
*/
@@ -252,6 +274,19 @@ ns_query_cancel(ns_client_t *client) {
}
static inline void
+query_putrdataset(ns_client_t *client, dns_rdataset_t **rdatasetp) {
+ dns_rdataset_t *rdataset = *rdatasetp;
+
+ CTRACE("query_putrdataset");
+ if (rdataset != NULL) {
+ if (dns_rdataset_isassociated(rdataset))
+ dns_rdataset_disassociate(rdataset);
+ dns_message_puttemprdataset(client->message, rdatasetp);
+ }
+ CTRACE("query_putrdataset: done");
+}
+
+static inline void
query_reset(ns_client_t *client, isc_boolean_t everything) {
isc_buffer_t *dbuf, *dbuf_next;
ns_dbversion_t *dbversion, *dbversion_next;
@@ -285,6 +320,18 @@ query_reset(ns_client_t *client, isc_boolean_t everything) {
if (client->query.authzone != NULL)
dns_zone_detach(&client->query.authzone);
+ if (client->query.dns64_aaaa != NULL)
+ query_putrdataset(client, &client->query.dns64_aaaa);
+ if (client->query.dns64_sigaaaa != NULL)
+ query_putrdataset(client, &client->query.dns64_sigaaaa);
+ if (client->query.dns64_aaaaok != NULL) {
+ isc_mem_put(client->mctx, client->query.dns64_aaaaok,
+ client->query.dns64_aaaaoklen *
+ sizeof(isc_boolean_t));
+ client->query.dns64_aaaaok = NULL;
+ client->query.dns64_aaaaoklen = 0;
+ }
+
query_freefreeversions(client, everything);
for (dbuf = ISC_LIST_HEAD(client->query.namebufs);
@@ -310,13 +357,22 @@ query_reset(ns_client_t *client, isc_boolean_t everything) {
NS_QUERYATTR_SECURE);
client->query.restarts = 0;
client->query.timerset = ISC_FALSE;
+ if (client->query.rpz_st != NULL) {
+ rpz_st_clear(client);
+ if (everything) {
+ isc_mem_put(client->mctx, client->query.rpz_st,
+ sizeof(*client->query.rpz_st));
+ client->query.rpz_st = NULL;
+ }
+ }
client->query.origqname = NULL;
- client->query.qname = NULL;
client->query.dboptions = 0;
client->query.fetchoptions = 0;
client->query.gluedb = NULL;
client->query.authdbset = ISC_FALSE;
client->query.isreferral = ISC_FALSE;
+ client->query.dns64_options = 0;
+ client->query.dns64_ttl = ISC_UINT32_MAX;
}
static void
@@ -473,20 +529,6 @@ query_newrdataset(ns_client_t *client) {
return (rdataset);
}
-static inline void
-query_putrdataset(ns_client_t *client, dns_rdataset_t **rdatasetp) {
- dns_rdataset_t *rdataset = *rdatasetp;
-
- CTRACE("query_putrdataset");
- if (rdataset != NULL) {
- if (dns_rdataset_isassociated(rdataset))
- dns_rdataset_disassociate(rdataset);
- dns_message_puttemprdataset(client->message, rdatasetp);
- }
- CTRACE("query_putrdataset: done");
-}
-
-
static inline isc_result_t
query_newdbversion(ns_client_t *client, unsigned int n) {
unsigned int i;
@@ -540,6 +582,7 @@ ns_query_init(ns_client_t *client) {
ISC_LIST_INIT(client->query.freeversions);
client->query.restarts = 0;
client->query.timerset = ISC_FALSE;
+ client->query.rpz_st = NULL;
client->query.qname = NULL;
result = isc_mutex_init(&client->query.fetchlock);
if (result != ISC_R_SUCCESS)
@@ -549,6 +592,10 @@ ns_query_init(ns_client_t *client) {
client->query.authzone = NULL;
client->query.authdbset = ISC_FALSE;
client->query.isreferral = ISC_FALSE;
+ client->query.dns64_aaaa = NULL;
+ client->query.dns64_sigaaaa = NULL;
+ client->query.dns64_aaaaok = NULL;
+ client->query.dns64_aaaaoklen = 0;
query_reset(client, ISC_FALSE);
result = query_newdbversion(client, 3);
if (result != ISC_R_SUCCESS) {
@@ -563,8 +610,7 @@ ns_query_init(ns_client_t *client) {
}
static inline ns_dbversion_t *
-query_findversion(ns_client_t *client, dns_db_t *db,
- isc_boolean_t *newzonep)
+query_findversion(ns_client_t *client, dns_db_t *db)
{
ns_dbversion_t *dbversion;
@@ -590,12 +636,11 @@ query_findversion(ns_client_t *client, dns_db_t *db,
return (NULL);
dns_db_attach(db, &dbversion->db);
dns_db_currentversion(db, &dbversion->version);
+ dbversion->acl_checked = ISC_FALSE;
dbversion->queryok = ISC_FALSE;
ISC_LIST_APPEND(client->query.activeversions,
dbversion, link);
- *newzonep = ISC_TRUE;
- } else
- *newzonep = ISC_FALSE;
+ }
return (dbversion);
}
@@ -607,7 +652,6 @@ query_validatezonedb(ns_client_t *client, dns_name_t *name,
dns_dbversion_t **versionp)
{
isc_result_t result;
- isc_boolean_t check_acl, new_zone;
dns_acl_t *queryacl;
ns_dbversion_t *dbversion;
@@ -623,7 +667,17 @@ query_validatezonedb(ns_client_t *client, dns_name_t *name,
if (!client->view->additionalfromauth &&
client->query.authdbset &&
db != client->query.authdb)
- goto refuse;
+ return (DNS_R_REFUSED);
+
+ /*
+ * Non recursive query to a static-stub zone is prohibited; its
+ * zone content is not public data, but a part of local configuration
+ * and should not be disclosed.
+ */
+ if (dns_zone_gettype(zone) == dns_zone_staticstub &&
+ !RECURSIONOK(client)) {
+ return (DNS_R_REFUSED);
+ }
/*
* If the zone has an ACL, we'll check it, otherwise
@@ -633,23 +687,19 @@ query_validatezonedb(ns_client_t *client, dns_name_t *name,
* Also, get the database version to use.
*/
- check_acl = ISC_TRUE; /* Keep compiler happy. */
- queryacl = NULL;
-
/*
* Get the current version of this database.
*/
- dbversion = query_findversion(client, db, &new_zone);
- if (dbversion == NULL) {
- result = DNS_R_SERVFAIL;
- goto fail;
- }
- if (new_zone) {
- check_acl = ISC_TRUE;
- } else if (!dbversion->queryok) {
- goto refuse;
- } else {
- check_acl = ISC_FALSE;
+ dbversion = query_findversion(client, db);
+ if (dbversion == NULL)
+ return (DNS_R_SERVFAIL);
+
+ if ((options & DNS_GETDB_IGNOREACL) != 0)
+ goto approved;
+ if (dbversion->acl_checked) {
+ if (!dbversion->queryok)
+ return (DNS_R_REFUSED);
+ goto approved;
}
queryacl = dns_zone_getqueryacl(zone);
@@ -663,88 +713,69 @@ query_validatezonedb(ns_client_t *client, dns_name_t *name,
* allowed to make queries, otherwise the query should
* be refused.
*/
- check_acl = ISC_FALSE;
+ dbversion->acl_checked = ISC_TRUE;
if ((client->query.attributes &
- NS_QUERYATTR_QUERYOK) == 0)
- goto refuse;
- } else {
- /*
- * We haven't evaluated the view's queryacl yet.
- */
- check_acl = ISC_TRUE;
+ NS_QUERYATTR_QUERYOK) == 0) {
+ dbversion->queryok = ISC_FALSE;
+ return (DNS_R_REFUSED);
+ }
+ dbversion->queryok = ISC_TRUE;
+ goto approved;
}
}
- if (check_acl) {
- isc_boolean_t log = ISC_TF((options & DNS_GETDB_NOLOG) == 0);
-
- result = ns_client_checkaclsilent(client, NULL, queryacl,
- ISC_TRUE);
- if (log) {
- char msg[NS_CLIENT_ACLMSGSIZE("query")];
- if (result == ISC_R_SUCCESS) {
- if (isc_log_wouldlog(ns_g_lctx,
- ISC_LOG_DEBUG(3)))
- {
- ns_client_aclmsg("query", name, qtype,
- client->view->rdclass,
- msg, sizeof(msg));
- ns_client_log(client,
- DNS_LOGCATEGORY_SECURITY,
- NS_LOGMODULE_QUERY,
- ISC_LOG_DEBUG(3),
- "%s approved", msg);
- }
- } else {
+ result = ns_client_checkaclsilent(client, NULL, queryacl, ISC_TRUE);
+ if ((options & DNS_GETDB_NOLOG) == 0) {
+ char msg[NS_CLIENT_ACLMSGSIZE("query")];
+ if (result == ISC_R_SUCCESS) {
+ if (isc_log_wouldlog(ns_g_lctx, ISC_LOG_DEBUG(3))) {
ns_client_aclmsg("query", name, qtype,
client->view->rdclass,
msg, sizeof(msg));
- ns_client_log(client, DNS_LOGCATEGORY_SECURITY,
- NS_LOGMODULE_QUERY, ISC_LOG_INFO,
- "%s denied", msg);
+ ns_client_log(client,
+ DNS_LOGCATEGORY_SECURITY,
+ NS_LOGMODULE_QUERY,
+ ISC_LOG_DEBUG(3),
+ "%s approved", msg);
}
+ } else {
+ ns_client_aclmsg("query", name, qtype,
+ client->view->rdclass,
+ msg, sizeof(msg));
+ ns_client_log(client, DNS_LOGCATEGORY_SECURITY,
+ NS_LOGMODULE_QUERY, ISC_LOG_INFO,
+ "%s denied", msg);
}
+ }
- if (queryacl == client->view->queryacl) {
- if (result == ISC_R_SUCCESS) {
- /*
- * We were allowed by the default
- * "allow-query" ACL. Remember this so we
- * don't have to check again.
- */
- client->query.attributes |=
- NS_QUERYATTR_QUERYOK;
- }
+ if (queryacl == client->view->queryacl) {
+ if (result == ISC_R_SUCCESS) {
/*
- * We've now evaluated the view's query ACL, and
- * the NS_QUERYATTR_QUERYOK attribute is now valid.
+ * We were allowed by the default
+ * "allow-query" ACL. Remember this so we
+ * don't have to check again.
*/
- client->query.attributes |= NS_QUERYATTR_QUERYOKVALID;
+ client->query.attributes |= NS_QUERYATTR_QUERYOK;
}
-
- if (result != ISC_R_SUCCESS)
- goto refuse;
+ /*
+ * We've now evaluated the view's query ACL, and
+ * the NS_QUERYATTR_QUERYOK attribute is now valid.
+ */
+ client->query.attributes |= NS_QUERYATTR_QUERYOKVALID;
}
- /* Approved. */
-
- /*
- * Remember the result of the ACL check so we
- * don't have to check again.
- */
+ dbversion->acl_checked = ISC_TRUE;
+ if (result != ISC_R_SUCCESS) {
+ dbversion->queryok = ISC_FALSE;
+ return (DNS_R_REFUSED);
+ }
dbversion->queryok = ISC_TRUE;
+ approved:
/* Transfer ownership, if necessary. */
if (versionp != NULL)
*versionp = dbversion->version;
-
return (ISC_R_SUCCESS);
-
- refuse:
- return (DNS_R_REFUSED);
-
- fail:
- return (result);
}
static inline isc_result_t
@@ -800,6 +831,97 @@ query_getzonedb(ns_client_t *client, dns_name_t *name, dns_rdatatype_t qtype,
return (result);
}
+static void
+rpz_log(ns_client_t *client) {
+ char namebuf1[DNS_NAME_FORMATSIZE];
+ char namebuf2[DNS_NAME_FORMATSIZE];
+ dns_rpz_st_t *st;
+ const char *pat;
+
+ if (!ns_g_server->log_queries ||
+ !isc_log_wouldlog(ns_g_lctx, DNS_RPZ_INFO_LEVEL))
+ return;
+
+ st = client->query.rpz_st;
+ dns_name_format(client->query.qname, namebuf1, sizeof(namebuf1));
+ dns_name_format(st->qname, namebuf2, sizeof(namebuf2));
+
+ switch (st->m.policy) {
+ case DNS_RPZ_POLICY_NO_OP:
+ pat ="response policy %s rewrite %s NO-OP using %s";
+ break;
+ case DNS_RPZ_POLICY_NXDOMAIN:
+ pat = "response policy %s rewrite %s to NXDOMAIN using %s";
+ break;
+ case DNS_RPZ_POLICY_NODATA:
+ pat = "response policy %s rewrite %s to NODATA using %s";
+ break;
+ case DNS_RPZ_POLICY_RECORD:
+ case DNS_RPZ_POLICY_CNAME:
+ pat = "response policy %s rewrite %s using %s";
+ break;
+ default:
+ INSIST(0);
+ }
+ ns_client_log(client, NS_LOGCATEGORY_QUERIES, NS_LOGMODULE_QUERY,
+ DNS_RPZ_INFO_LEVEL, pat, dns_rpz_type2str(st->m.type),
+ namebuf1, namebuf2);
+}
+
+static void
+rpz_fail_log(ns_client_t *client, int level, dns_rpz_type_t rpz_type,
+ dns_name_t *name, const char *str, isc_result_t result)
+{
+ char namebuf1[DNS_NAME_FORMATSIZE];
+ char namebuf2[DNS_NAME_FORMATSIZE];
+
+ if (!ns_g_server->log_queries || !isc_log_wouldlog(ns_g_lctx, level))
+ return;
+
+ dns_name_format(client->query.qname, namebuf1, sizeof(namebuf1));
+ dns_name_format(name, namebuf2, sizeof(namebuf2));
+ ns_client_log(client, NS_LOGCATEGORY_QUERY_EERRORS,
+ NS_LOGMODULE_QUERY, level,
+ "response policy %s rewrite %s via %s %sfailed: %s",
+ dns_rpz_type2str(rpz_type),
+ namebuf1, namebuf2, str, isc_result_totext(result));
+}
+
+/*
+ * Get a policy rewrite zone database.
+ */
+static isc_result_t
+rpz_getdb(ns_client_t *client, dns_rpz_type_t rpz_type,
+ dns_name_t *rpz_qname, dns_zone_t **zonep,
+ dns_db_t **dbp, dns_dbversion_t **versionp)
+{
+ char namebuf1[DNS_NAME_FORMATSIZE];
+ char namebuf2[DNS_NAME_FORMATSIZE];
+ dns_dbversion_t *rpz_version = NULL;
+ isc_result_t result;
+
+ result = query_getzonedb(client, rpz_qname, dns_rdatatype_any,
+ DNS_GETDB_IGNOREACL, zonep, dbp, &rpz_version);
+ if (result == ISC_R_SUCCESS) {
+ if (ns_g_server->log_queries &&
+ isc_log_wouldlog(ns_g_lctx, DNS_RPZ_DEBUG_LEVEL2)) {
+ dns_name_format(client->query.qname, namebuf1,
+ sizeof(namebuf1));
+ dns_name_format(rpz_qname, namebuf2, sizeof(namebuf2));
+ ns_client_log(client, NS_LOGCATEGORY_QUERIES,
+ NS_LOGMODULE_QUERY, DNS_RPZ_DEBUG_LEVEL2,
+ "try rpz %s rewrite %s via %s",
+ dns_rpz_type2str(rpz_type),
+ namebuf1, namebuf2);
+ }
+ *versionp = rpz_version;
+ return (ISC_R_SUCCESS);
+ }
+ rpz_fail_log(client, DNS_RPZ_ERROR_LEVEL, rpz_type, rpz_qname,
+ "query_getzonedb() ", result);
+ return (result);
+}
+
static inline isc_result_t
query_getcachedb(ns_client_t *client, dns_name_t *name, dns_rdatatype_t qtype,
dns_db_t **dbp, unsigned int options)
@@ -1958,6 +2080,323 @@ query_addrdataset(ns_client_t *client, dns_name_t *fname,
CTRACE("query_addrdataset: done");
}
+static isc_result_t
+query_dns64(ns_client_t *client, dns_name_t **namep, dns_rdataset_t *rdataset,
+ dns_rdataset_t *sigrdataset, isc_buffer_t *dbuf,
+ dns_section_t section)
+{
+ dns_name_t *name, *mname;
+ dns_rdata_t *dns64_rdata;
+ dns_rdata_t rdata = DNS_RDATA_INIT;
+ dns_rdatalist_t *dns64_rdatalist;
+ dns_rdataset_t *dns64_rdataset;
+ dns_rdataset_t *mrdataset;
+ isc_buffer_t *buffer;
+ isc_region_t r;
+ isc_result_t result;
+ dns_view_t *view = client->view;
+ isc_netaddr_t netaddr;
+ dns_dns64_t *dns64;
+ unsigned int flags = 0;
+
+ /*%
+ * To the current response for 'client', add the answer RRset
+ * '*rdatasetp' and an optional signature set '*sigrdatasetp', with
+ * owner name '*namep', to section 'section', unless they are
+ * already there. Also add any pertinent additional data.
+ *
+ * If 'dbuf' is not NULL, then '*namep' is the name whose data is
+ * stored in 'dbuf'. In this case, query_addrrset() guarantees that
+ * when it returns the name will either have been kept or released.
+ */
+ CTRACE("query_dns64");
+ name = *namep;
+ mname = NULL;
+ mrdataset = NULL;
+ buffer = NULL;
+ dns64_rdata = NULL;
+ dns64_rdataset = NULL;
+ dns64_rdatalist = NULL;
+ result = dns_message_findname(client->message, section,
+ name, dns_rdatatype_aaaa,
+ rdataset->covers,
+ &mname, &mrdataset);
+ if (result == ISC_R_SUCCESS) {
+ /*
+ * We've already got an RRset of the given name and type.
+ * There's nothing else to do;
+ */
+ CTRACE("query_dns64: dns_message_findname succeeded: done");
+ if (dbuf != NULL)
+ query_releasename(client, namep);
+ return (ISC_R_SUCCESS);
+ } else if (result == DNS_R_NXDOMAIN) {
+ /*
+ * The name doesn't exist.
+ */
+ if (dbuf != NULL)
+ query_keepname(client, name, dbuf);
+ dns_message_addname(client->message, name, section);
+ *namep = NULL;
+ mname = name;
+ } else {
+ RUNTIME_CHECK(result == DNS_R_NXRRSET);
+ if (dbuf != NULL)
+ query_releasename(client, namep);
+ }
+
+ if (rdataset->trust != dns_trust_secure &&
+ (section == DNS_SECTION_ANSWER ||
+ section == DNS_SECTION_AUTHORITY))
+ client->query.attributes &= ~NS_QUERYATTR_SECURE;
+
+ isc_netaddr_fromsockaddr(&netaddr, &client->peeraddr);
+
+ result = isc_buffer_allocate(client->mctx, &buffer, view->dns64cnt *
+ 16 * dns_rdataset_count(rdataset));
+ if (result != ISC_R_SUCCESS)
+ goto cleanup;
+ result = dns_message_gettemprdataset(client->message, &dns64_rdataset);
+ if (result != ISC_R_SUCCESS)
+ goto cleanup;
+ result = dns_message_gettemprdatalist(client->message,
+ &dns64_rdatalist);
+ if (result != ISC_R_SUCCESS)
+ goto cleanup;
+
+ dns_rdataset_init(dns64_rdataset);
+ dns_rdatalist_init(dns64_rdatalist);
+ dns64_rdatalist->rdclass = dns_rdataclass_in;
+ dns64_rdatalist->type = dns_rdatatype_aaaa;
+ if (client->query.dns64_ttl != ISC_UINT32_MAX)
+ dns64_rdatalist->ttl = ISC_MIN(rdataset->ttl,
+ client->query.dns64_ttl);
+ else
+ dns64_rdatalist->ttl = ISC_MIN(rdataset->ttl, 600);
+
+ if (RECURSIONOK(client))
+ flags |= DNS_DNS64_RECURSIVE;
+
+ /*
+ * We use the signatures from the A lookup to set DNS_DNS64_DNSSEC
+ * as this provides a easy way to see if the answer was signed.
+ */
+ if (sigrdataset != NULL && dns_rdataset_isassociated(sigrdataset))
+ flags |= DNS_DNS64_DNSSEC;
+
+ for (result = dns_rdataset_first(rdataset);
+ result == ISC_R_SUCCESS;
+ result = dns_rdataset_next(rdataset)) {
+ for (dns64 = ISC_LIST_HEAD(client->view->dns64);
+ dns64 != NULL; dns64 = dns_dns64_next(dns64)) {
+
+ dns_rdataset_current(rdataset, &rdata);
+ isc__buffer_availableregion(buffer, &r);
+ INSIST(r.length >= 16);
+ result = dns_dns64_aaaafroma(dns64, &netaddr,
+ client->signer,
+ &ns_g_server->aclenv,
+ flags, rdata.data, r.base);
+ if (result != ISC_R_SUCCESS) {
+ dns_rdata_reset(&rdata);
+ continue;
+ }
+ isc_buffer_add(buffer, 16);
+ isc_buffer_remainingregion(buffer, &r);
+ isc_buffer_forward(buffer, 16);
+ result = dns_message_gettemprdata(client->message,
+ &dns64_rdata);
+ if (result != ISC_R_SUCCESS)
+ goto cleanup;
+ dns_rdata_init(dns64_rdata);
+ dns_rdata_fromregion(dns64_rdata, dns_rdataclass_in,
+ dns_rdatatype_aaaa, &r);
+ ISC_LIST_APPEND(dns64_rdatalist->rdata, dns64_rdata,
+ link);
+ dns64_rdata = NULL;
+ dns_rdata_reset(&rdata);
+ }
+ }
+ if (result != ISC_R_NOMORE)
+ goto cleanup;
+
+ if (ISC_LIST_EMPTY(dns64_rdatalist->rdata))
+ goto cleanup;
+
+ result = dns_rdatalist_tordataset(dns64_rdatalist, dns64_rdataset);
+ if (result != ISC_R_SUCCESS)
+ goto cleanup;
+ client->query.attributes |= NS_QUERYATTR_NOADDITIONAL;
+ dns64_rdataset->trust = rdataset->trust;
+ query_addrdataset(client, mname, dns64_rdataset);
+ dns64_rdataset = NULL;
+ dns64_rdatalist = NULL;
+ dns_message_takebuffer(client->message, &buffer);
+ result = ISC_R_SUCCESS;
+
+ cleanup:
+ if (buffer != NULL)
+ isc_buffer_free(&buffer);
+
+ if (dns64_rdata != NULL)
+ dns_message_puttemprdata(client->message, &dns64_rdata);
+
+ if (dns64_rdataset != NULL)
+ dns_message_puttemprdataset(client->message, &dns64_rdataset);
+
+ if (dns64_rdatalist != NULL) {
+ for (dns64_rdata = ISC_LIST_HEAD(dns64_rdatalist->rdata);
+ dns64_rdata != NULL;
+ dns64_rdata = ISC_LIST_HEAD(dns64_rdatalist->rdata))
+ {
+ ISC_LIST_UNLINK(dns64_rdatalist->rdata,
+ dns64_rdata, link);
+ dns_message_puttemprdata(client->message, &dns64_rdata);
+ }
+ dns_message_puttemprdatalist(client->message, &dns64_rdatalist);
+ }
+
+ CTRACE("query_dns64: done");
+ return (result);
+}
+
+static void
+query_filter64(ns_client_t *client, dns_name_t **namep,
+ dns_rdataset_t *rdataset, isc_buffer_t *dbuf,
+ dns_section_t section)
+{
+ dns_name_t *name, *mname;
+ dns_rdata_t *myrdata;
+ dns_rdata_t rdata = DNS_RDATA_INIT;
+ dns_rdatalist_t *myrdatalist;
+ dns_rdataset_t *myrdataset;
+ isc_buffer_t *buffer;
+ isc_region_t r;
+ isc_result_t result;
+ unsigned int i;
+
+ CTRACE("query_filter64");
+
+ INSIST(client->query.dns64_aaaaok != NULL);
+ INSIST(client->query.dns64_aaaaoklen == dns_rdataset_count(rdataset));
+
+ name = *namep;
+ mname = NULL;
+ buffer = NULL;
+ myrdata = NULL;
+ myrdataset = NULL;
+ myrdatalist = NULL;
+ result = dns_message_findname(client->message, section,
+ name, dns_rdatatype_aaaa,
+ rdataset->covers,
+ &mname, &myrdataset);
+ if (result == ISC_R_SUCCESS) {
+ /*
+ * We've already got an RRset of the given name and type.
+ * There's nothing else to do;
+ */
+ CTRACE("query_filter64: dns_message_findname succeeded: done");
+ if (dbuf != NULL)
+ query_releasename(client, namep);
+ return;
+ } else if (result == DNS_R_NXDOMAIN) {
+ mname = name;
+ *namep = NULL;
+ } else {
+ RUNTIME_CHECK(result == DNS_R_NXRRSET);
+ if (dbuf != NULL)
+ query_releasename(client, namep);
+ dbuf = NULL;
+ }
+
+ if (rdataset->trust != dns_trust_secure &&
+ (section == DNS_SECTION_ANSWER ||
+ section == DNS_SECTION_AUTHORITY))
+ client->query.attributes &= ~NS_QUERYATTR_SECURE;
+
+ result = isc_buffer_allocate(client->mctx, &buffer,
+ 16 * dns_rdataset_count(rdataset));
+ if (result != ISC_R_SUCCESS)
+ goto cleanup;
+ result = dns_message_gettemprdataset(client->message, &myrdataset);
+ if (result != ISC_R_SUCCESS)
+ goto cleanup;
+ result = dns_message_gettemprdatalist(client->message, &myrdatalist);
+ if (result != ISC_R_SUCCESS)
+ goto cleanup;
+
+ dns_rdataset_init(myrdataset);
+ dns_rdatalist_init(myrdatalist);
+ myrdatalist->rdclass = dns_rdataclass_in;
+ myrdatalist->type = dns_rdatatype_aaaa;
+ myrdatalist->ttl = rdataset->ttl;
+
+ i = 0;
+ for (result = dns_rdataset_first(rdataset);
+ result == ISC_R_SUCCESS;
+ result = dns_rdataset_next(rdataset)) {
+ if (!client->query.dns64_aaaaok[i++])
+ continue;
+ dns_rdataset_current(rdataset, &rdata);
+ INSIST(rdata.length == 16);
+ isc_buffer_putmem(buffer, rdata.data, rdata.length);
+ isc_buffer_remainingregion(buffer, &r);
+ isc_buffer_forward(buffer, rdata.length);
+ result = dns_message_gettemprdata(client->message, &myrdata);
+ if (result != ISC_R_SUCCESS)
+ goto cleanup;
+ dns_rdata_init(myrdata);
+ dns_rdata_fromregion(myrdata, dns_rdataclass_in,
+ dns_rdatatype_aaaa, &r);
+ ISC_LIST_APPEND(myrdatalist->rdata, myrdata, link);
+ myrdata = NULL;
+ dns_rdata_reset(&rdata);
+ }
+ if (result != ISC_R_NOMORE)
+ goto cleanup;
+
+ result = dns_rdatalist_tordataset(myrdatalist, myrdataset);
+ if (result != ISC_R_SUCCESS)
+ goto cleanup;
+ client->query.attributes |= NS_QUERYATTR_NOADDITIONAL;
+ if (mname == name) {
+ if (dbuf != NULL)
+ query_keepname(client, name, dbuf);
+ dns_message_addname(client->message, name, section);
+ dbuf = NULL;
+ }
+ myrdataset->trust = rdataset->trust;
+ query_addrdataset(client, mname, myrdataset);
+ myrdataset = NULL;
+ myrdatalist = NULL;
+ dns_message_takebuffer(client->message, &buffer);
+
+ cleanup:
+ if (buffer != NULL)
+ isc_buffer_free(&buffer);
+
+ if (myrdata != NULL)
+ dns_message_puttemprdata(client->message, &myrdata);
+
+ if (myrdataset != NULL)
+ dns_message_puttemprdataset(client->message, &myrdataset);
+
+ if (myrdatalist != NULL) {
+ for (myrdata = ISC_LIST_HEAD(myrdatalist->rdata);
+ myrdata != NULL;
+ myrdata = ISC_LIST_HEAD(myrdatalist->rdata))
+ {
+ ISC_LIST_UNLINK(myrdatalist->rdata, myrdata, link);
+ dns_message_puttemprdata(client->message, &myrdata);
+ }
+ dns_message_puttemprdatalist(client->message, &myrdatalist);
+ }
+ if (dbuf != NULL)
+ query_releasename(client, &name);
+
+ CTRACE("query_filter64: done");
+}
+
static void
query_addrrset(ns_client_t *client, dns_name_t **namep,
dns_rdataset_t **rdatasetp, dns_rdataset_t **sigrdatasetp,
@@ -2036,7 +2475,7 @@ query_addrrset(ns_client_t *client, dns_name_t **namep,
static inline isc_result_t
query_addsoa(ns_client_t *client, dns_db_t *db, dns_dbversion_t *version,
- isc_boolean_t zero_ttl, isc_boolean_t isassociated)
+ unsigned int override_ttl, isc_boolean_t isassociated)
{
dns_name_t *name;
dns_dbnode_t *node;
@@ -2119,10 +2558,11 @@ query_addsoa(ns_client_t *client, dns_db_t *db, dns_dbversion_t *version,
if (result != ISC_R_SUCCESS)
goto cleanup;
- if (zero_ttl) {
- rdataset->ttl = 0;
+ if (override_ttl != ISC_UINT32_MAX &&
+ override_ttl < rdataset->ttl) {
+ rdataset->ttl = override_ttl;
if (sigrdataset != NULL)
- sigrdataset->ttl = 0;
+ sigrdataset->ttl = override_ttl;
}
/*
@@ -2246,67 +2686,79 @@ query_addns(ns_client_t *client, dns_db_t *db, dns_dbversion_t *version) {
return (eresult);
}
-static inline isc_result_t
-query_addcnamelike(ns_client_t *client, dns_name_t *qname, dns_name_t *tname,
- dns_rdataset_t *dname, dns_name_t **anamep,
- dns_rdatatype_t type)
+static isc_result_t
+query_add_cname(ns_client_t *client, dns_name_t *qname, dns_name_t *tname,
+ dns_trust_t trust, dns_ttl_t ttl)
{
dns_rdataset_t *rdataset;
dns_rdatalist_t *rdatalist;
dns_rdata_t *rdata;
- isc_result_t result;
isc_region_t r;
+ dns_name_t *aname;
+ isc_result_t result;
/*
* We assume the name data referred to by tname won't go away.
*/
- REQUIRE(anamep != NULL);
+ aname = NULL;
+ result = dns_message_gettempname(client->message, &aname);
+ if (result != ISC_R_SUCCESS)
+ return (result);
+ result = dns_name_dup(qname, client->mctx, aname);
+ if (result != ISC_R_SUCCESS) {
+ dns_message_puttempname(client->message, &aname);
+ return (result);
+ }
rdatalist = NULL;
result = dns_message_gettemprdatalist(client->message, &rdatalist);
- if (result != ISC_R_SUCCESS)
+ if (result != ISC_R_SUCCESS) {
+ dns_message_puttempname(client->message, &aname);
return (result);
+ }
rdata = NULL;
result = dns_message_gettemprdata(client->message, &rdata);
- if (result != ISC_R_SUCCESS)
+ if (result != ISC_R_SUCCESS) {
+ dns_message_puttempname(client->message, &aname);
+ dns_message_puttemprdatalist(client->message, &rdatalist);
return (result);
+ }
rdataset = NULL;
result = dns_message_gettemprdataset(client->message, &rdataset);
- if (result != ISC_R_SUCCESS)
- return (result);
- dns_rdataset_init(rdataset);
- result = dns_name_dup(qname, client->mctx, *anamep);
if (result != ISC_R_SUCCESS) {
- dns_message_puttemprdataset(client->message, &rdataset);
+ dns_message_puttempname(client->message, &aname);
+ dns_message_puttemprdatalist(client->message, &rdatalist);
+ dns_message_puttemprdata(client->message, &rdata);
return (result);
}
-
- rdatalist->type = type;
+ dns_rdataset_init(rdataset);
+ rdatalist->type = dns_rdatatype_cname;
rdatalist->covers = 0;
rdatalist->rdclass = client->message->rdclass;
- rdatalist->ttl = dname->ttl;
+ rdatalist->ttl = ttl;
dns_name_toregion(tname, &r);
rdata->data = r.base;
rdata->length = r.length;
rdata->rdclass = client->message->rdclass;
- rdata->type = type;
+ rdata->type = dns_rdatatype_cname;
ISC_LIST_INIT(rdatalist->rdata);
ISC_LIST_APPEND(rdatalist->rdata, rdata, link);
RUNTIME_CHECK(dns_rdatalist_tordataset(rdatalist, rdataset)
== ISC_R_SUCCESS);
- rdataset->trust = dname->trust;
+ rdataset->trust = trust;
- query_addrrset(client, anamep, &rdataset, NULL, NULL,
+ query_addrrset(client, &aname, &rdataset, NULL, NULL,
DNS_SECTION_ANSWER);
-
if (rdataset != NULL) {
if (dns_rdataset_isassociated(rdataset))
dns_rdataset_disassociate(rdataset);
dns_message_puttemprdataset(client->message, &rdataset);
}
+ if (aname != NULL)
+ dns_message_puttempname(client->message, &aname);
return (ISC_R_SUCCESS);
}
@@ -2860,7 +3312,7 @@ query_addwildcardproof(ns_client_t *client, dns_db_t *db,
* j.example -> z.i.example NSEC example
* owner common example
* next common example
- * wild *.f.example
+ * wild *.example
*/
options = client->query.dboptions | DNS_DBFIND_NOWILD;
dns_fixedname_init(&wfixed);
@@ -3196,8 +3648,9 @@ query_resume(isc_task_t *task, isc_event_t *event) {
}
static isc_result_t
-query_recurse(ns_client_t *client, dns_rdatatype_t qtype, dns_name_t *qdomain,
- dns_rdataset_t *nameservers, isc_boolean_t resuming)
+query_recurse(ns_client_t *client, dns_rdatatype_t qtype, dns_name_t *qname,
+ dns_name_t *qdomain, dns_rdataset_t *nameservers,
+ isc_boolean_t resuming)
{
isc_result_t result;
dns_rdataset_t *rdataset, *sigrdataset;
@@ -3229,7 +3682,11 @@ query_recurse(ns_client_t *client, dns_rdatatype_t qtype, dns_name_t *qdomain,
NS_LOGMODULE_QUERY,
ISC_LOG_WARNING,
"recursive-clients soft limit "
- "exceeded, aborting oldest query");
+ "exceeded (%d/%d/%d), "
+ "aborting oldest query",
+ client->recursionquota->used,
+ client->recursionquota->soft,
+ client->recursionquota->max);
}
ns_client_killoldestquery(client);
result = ISC_R_SUCCESS;
@@ -3242,7 +3699,11 @@ query_recurse(ns_client_t *client, dns_rdatatype_t qtype, dns_name_t *qdomain,
ns_client_log(client, NS_LOGCATEGORY_CLIENT,
NS_LOGMODULE_QUERY,
ISC_LOG_WARNING,
- "no more recursive clients: %s",
+ "no more recursive clients "
+ "(%d/%d/%d): %s",
+ ns_g_server->recursionquota.used,
+ ns_g_server->recursionquota.soft,
+ ns_g_server->recursionquota.max,
isc_result_totext(result));
}
ns_client_killoldestquery(client);
@@ -3289,8 +3750,7 @@ query_recurse(ns_client_t *client, dns_rdatatype_t qtype, dns_name_t *qdomain,
else
peeraddr = NULL;
result = dns_resolver_createfetch2(client->view->resolver,
- client->query.qname,
- qtype, qdomain, nameservers,
+ qname, qtype, qdomain, nameservers,
NULL, peeraddr, client->message->id,
client->query.fetchoptions,
client->task,
@@ -3313,6 +3773,696 @@ query_recurse(ns_client_t *client, dns_rdatatype_t qtype, dns_name_t *qdomain,
return (result);
}
+static inline void
+rpz_clean(dns_zone_t **zonep, dns_db_t **dbp, dns_dbnode_t **nodep,
+ dns_rdataset_t **rdatasetp)
+{
+ if (nodep != NULL && *nodep != NULL) {
+ REQUIRE(dbp != NULL && *dbp != NULL);
+ dns_db_detachnode(*dbp, nodep);
+ }
+ if (dbp != NULL && *dbp != NULL)
+ dns_db_detach(dbp);
+ if (zonep != NULL && *zonep != NULL)
+ dns_zone_detach(zonep);
+ if (rdatasetp != NULL && *rdatasetp != NULL &&
+ dns_rdataset_isassociated(*rdatasetp))
+ dns_rdataset_disassociate(*rdatasetp);
+}
+
+static inline isc_result_t
+rpz_ready(ns_client_t *client, dns_zone_t **zonep, dns_db_t **dbp,
+ dns_dbnode_t **nodep, dns_rdataset_t **rdatasetp)
+{
+ REQUIRE(rdatasetp != NULL);
+
+ rpz_clean(zonep, dbp, nodep, rdatasetp);
+ if (*rdatasetp == NULL) {
+ *rdatasetp = query_newrdataset(client);
+ if (*rdatasetp == NULL)
+ return (DNS_R_SERVFAIL);
+ }
+ return (ISC_R_SUCCESS);
+}
+
+static void
+rpz_st_clear(ns_client_t *client) {
+ dns_rpz_st_t *st = client->query.rpz_st;
+
+ rpz_clean(&st->m.zone, &st->m.db, &st->m.node, NULL);
+ if (st->m.rdataset != NULL)
+ query_putrdataset(client, &st->m.rdataset);
+
+ rpz_clean(NULL, &st->ns.db, NULL, NULL);
+ if (st->ns.ns_rdataset != NULL)
+ query_putrdataset(client, &st->ns.ns_rdataset);
+ if (st->ns.r_rdataset != NULL)
+ query_putrdataset(client, &st->ns.r_rdataset);
+
+ rpz_clean(&st->q.zone, &st->q.db, &st->q.node, NULL);
+ if (st->q.rdataset != NULL)
+ query_putrdataset(client, &st->q.rdataset);
+ if (st->q.sigrdataset != NULL)
+ query_putrdataset(client, &st->q.sigrdataset);
+ st->state = 0;
+}
+
+/*
+ * Get NS, A, or AAAA rrset for rpz nsdname or nsip checking.
+ */
+static isc_result_t
+rpz_ns_find(ns_client_t *client, dns_name_t *name, dns_rdatatype_t type,
+ dns_db_t **dbp, dns_dbversion_t *version,
+ dns_rdataset_t **rdatasetp, isc_boolean_t resuming)
+{
+ dns_rpz_st_t *st;
+ isc_boolean_t is_zone;
+ dns_dbnode_t *node;
+ dns_fixedname_t fixed;
+ dns_name_t *found;
+ isc_result_t result;
+
+ st = client->query.rpz_st;
+ if ((st->state & DNS_RPZ_RECURSING) != 0) {
+ INSIST(st->ns.r_type == type);
+ INSIST(dns_name_equal(name, st->r_name));
+ INSIST(*rdatasetp == NULL ||
+ !dns_rdataset_isassociated(*rdatasetp));
+ st->state &= ~DNS_RPZ_RECURSING;
+ *dbp = st->ns.db;
+ st->ns.db = NULL;
+ if (*rdatasetp != NULL)
+ query_putrdataset(client, rdatasetp);
+ *rdatasetp = st->ns.r_rdataset;
+ st->ns.r_rdataset = NULL;
+ result = st->ns.r_result;
+ if (result == DNS_R_DELEGATION) {
+ rpz_fail_log(client, DNS_RPZ_ERROR_LEVEL,
+ DNS_RPZ_TYPE_NSIP, name,
+ "rpz_ns_find() ", result);
+ st->m.policy = DNS_RPZ_POLICY_ERROR;
+ result = DNS_R_SERVFAIL;
+ }
+ return (result);
+ }
+
+ result = rpz_ready(client, NULL, NULL, NULL, rdatasetp);
+ if (result != ISC_R_SUCCESS) {
+ st->m.policy = DNS_RPZ_POLICY_ERROR;
+ return (result);
+ }
+ if (*dbp != NULL) {
+ is_zone = ISC_FALSE;
+ } else {
+ dns_zone_t *zone;
+
+ version = NULL;
+ zone = NULL;
+ result = query_getdb(client, name, type, 0, &zone, dbp,
+ &version, &is_zone);
+ if (result != ISC_R_SUCCESS) {
+ rpz_fail_log(client, DNS_RPZ_ERROR_LEVEL,
+ DNS_RPZ_TYPE_NSIP, name, "NS getdb() ",
+ result);
+ st->m.policy = DNS_RPZ_POLICY_ERROR;
+ if (zone != NULL)
+ dns_zone_detach(&zone);
+ return (result);
+ }
+ if (zone != NULL)
+ dns_zone_detach(&zone);
+ }
+
+ node = NULL;
+ dns_fixedname_init(&fixed);
+ found = dns_fixedname_name(&fixed);
+ result = dns_db_find(*dbp, name, version, type, 0, client->now, &node,
+ found, *rdatasetp, NULL);
+ if (result == DNS_R_DELEGATION && is_zone && USECACHE(client)) {
+ /*
+ * Try the cache if we're authoritative for an
+ * ancestor but not the domain itself.
+ */
+ rpz_clean(NULL, dbp, &node, rdatasetp);
+ version = NULL;
+ dns_db_attach(client->view->cachedb, dbp);
+ result = dns_db_find(*dbp, name, version, dns_rdatatype_ns,
+ 0, client->now, &node, found,
+ *rdatasetp, NULL);
+ }
+ rpz_clean(NULL, dbp, &node, NULL);
+ if (result == DNS_R_DELEGATION) {
+ /*
+ * Recurse to get NS rrset or A or AAAA rrset for an NS name.
+ */
+ rpz_clean(NULL, NULL, NULL, rdatasetp);
+ dns_name_copy(name, st->r_name, NULL);
+ result = query_recurse(client, type, st->r_name, NULL, NULL,
+ resuming);
+ if (result == ISC_R_SUCCESS) {
+ st->state |= DNS_RPZ_RECURSING;
+ result = DNS_R_DELEGATION;
+ }
+ }
+ return (result);
+}
+
+/*
+ * Check the IP address in an A or AAAA rdataset against
+ * the IP or NSIP response policy rules of a view.
+ */
+static isc_result_t
+rpz_rewrite_ip(ns_client_t *client, dns_rdataset_t *rdataset,
+ dns_rpz_type_t rpz_type)
+{
+ dns_rpz_st_t *st;
+ dns_dbversion_t *version;
+ dns_zone_t *zone;
+ dns_db_t *db;
+ dns_rpz_zone_t *new_rpz;
+ isc_result_t result;
+
+ st = client->query.rpz_st;
+ if (st->m.rdataset == NULL) {
+ st->m.rdataset = query_newrdataset(client);
+ if (st->m.rdataset == NULL)
+ return (DNS_R_SERVFAIL);
+ }
+ zone = NULL;
+ db = NULL;
+ for (new_rpz = ISC_LIST_HEAD(client->view->rpz_zones);
+ new_rpz != NULL;
+ new_rpz = ISC_LIST_NEXT(new_rpz, link)) {
+ version = NULL;
+
+ /*
+ * Find the database for this policy zone to get its
+ * radix tree.
+ */
+ result = rpz_getdb(client, rpz_type, &new_rpz->origin,
+ &zone, &db, &version);
+ if (result != ISC_R_SUCCESS) {
+ rpz_clean(&zone, &db, NULL, NULL);
+ continue;
+ }
+ /*
+ * Look for a better (e.g. longer prefix) hit for an IP address
+ * in this rdataset in this radix tree than than the previous
+ * hit, if any. Note the domain name and quality of the
+ * best hit.
+ */
+ result = dns_db_rpz_findips(new_rpz, rpz_type, zone, db,
+ version, rdataset, st);
+ RUNTIME_CHECK(result == ISC_R_SUCCESS);
+ rpz_clean(&zone, &db, NULL, NULL);
+ }
+ return (ISC_R_SUCCESS);
+}
+
+static isc_result_t
+rpz_rewrite_nsip(ns_client_t *client, dns_rdatatype_t type, dns_name_t *name,
+ dns_db_t **dbp, dns_dbversion_t *version,
+ dns_rdataset_t **rdatasetp, isc_boolean_t resuming)
+{
+ isc_result_t result;
+
+ result = rpz_ns_find(client, name, type, dbp, version, rdatasetp,
+ resuming);
+ switch (result) {
+ case ISC_R_SUCCESS:
+ result = rpz_rewrite_ip(client, *rdatasetp, DNS_RPZ_TYPE_NSIP);
+ break;
+ case DNS_R_EMPTYNAME:
+ case DNS_R_EMPTYWILD:
+ case DNS_R_NXDOMAIN:
+ case DNS_R_NCACHENXDOMAIN:
+ case DNS_R_NXRRSET:
+ case DNS_R_NCACHENXRRSET:
+ result = ISC_R_SUCCESS;
+ break;
+ case DNS_R_DELEGATION:
+ case DNS_R_DUPLICATE:
+ case DNS_R_DROP:
+ break;
+ default:
+ if (client->query.rpz_st->m.policy != DNS_RPZ_POLICY_ERROR) {
+ client->query.rpz_st->m.policy = DNS_RPZ_POLICY_ERROR;
+ rpz_fail_log(client, ISC_LOG_WARNING, DNS_RPZ_TYPE_NSIP,
+ name, "NS address rewrite nsip ", result);
+ }
+ break;
+ }
+ return (result);
+}
+
+/*
+ * Get the rrset from a response policy zone.
+ */
+static isc_result_t
+rpz_find(ns_client_t *client, dns_rdatatype_t qtype, dns_name_t *qnamef,
+ dns_name_t *sname, dns_rpz_type_t rpz_type, dns_zone_t **zonep,
+ dns_db_t **dbp, dns_dbnode_t **nodep, dns_rdataset_t **rdatasetp,
+ dns_rpz_policy_t *policyp)
+{
+ dns_dbversion_t *version;
+ dns_rpz_policy_t policy;
+ dns_fixedname_t fixed;
+ dns_name_t *found;
+ isc_result_t result;
+
+ result = rpz_ready(client, zonep, dbp, nodep, rdatasetp);
+ if (result != ISC_R_SUCCESS) {
+ *policyp = DNS_RPZ_POLICY_ERROR;
+ return (result);
+ }
+
+ /*
+ * Try to get either a CNAME or the type of record demanded by the
+ * request from the policy zone.
+ */
+ version = NULL;
+ result = rpz_getdb(client, rpz_type, qnamef, zonep, dbp, &version);
+ if (result != ISC_R_SUCCESS) {
+ *policyp = DNS_RPZ_POLICY_MISS;
+ return (DNS_R_NXDOMAIN);
+ }
+
+ dns_fixedname_init(&fixed);
+ found = dns_fixedname_name(&fixed);
+ result = dns_db_find(*dbp, qnamef, version, dns_rdatatype_any, 0,
+ client->now, nodep, found, *rdatasetp, NULL);
+ if (result == ISC_R_SUCCESS) {
+ dns_rdatasetiter_t *rdsiter;
+
+ rdsiter = NULL;
+ result = dns_db_allrdatasets(*dbp, *nodep, version, 0,
+ &rdsiter);
+ if (result != ISC_R_SUCCESS) {
+ dns_db_detachnode(*dbp, nodep);
+ rpz_fail_log(client, DNS_RPZ_ERROR_LEVEL, rpz_type,
+ qnamef, "allrdatasets()", result);
+ *policyp = DNS_RPZ_POLICY_ERROR;
+ return (DNS_R_SERVFAIL);
+ }
+ for (result = dns_rdatasetiter_first(rdsiter);
+ result == ISC_R_SUCCESS;
+ result = dns_rdatasetiter_next(rdsiter)) {
+ dns_rdatasetiter_current(rdsiter, *rdatasetp);
+ if ((*rdatasetp)->type == dns_rdatatype_cname ||
+ (*rdatasetp)->type == qtype)
+ break;
+ dns_rdataset_disassociate(*rdatasetp);
+ }
+ dns_rdatasetiter_destroy(&rdsiter);
+ if (result != ISC_R_SUCCESS) {
+ if (result != ISC_R_NOMORE) {
+ rpz_fail_log(client, DNS_RPZ_ERROR_LEVEL,
+ rpz_type, qnamef, "rdatasetiter",
+ result);
+ *policyp = DNS_RPZ_POLICY_ERROR;
+ return (DNS_R_SERVFAIL);
+ }
+ /*
+ * Ask again to get the right DNS_R_DNAME/NXRRSET/...
+ * result if there is neither a CNAME nor target type.
+ */
+ if (dns_rdataset_isassociated(*rdatasetp))
+ dns_rdataset_disassociate(*rdatasetp);
+ dns_db_detachnode(*dbp, nodep);
+
+ if (qtype == dns_rdatatype_rrsig ||
+ qtype == dns_rdatatype_sig)
+ result = DNS_R_NXRRSET;
+ else
+ result = dns_db_find(*dbp, qnamef, version,
+ qtype, 0, client->now,
+ nodep, found, *rdatasetp,
+ NULL);
+ }
+ }
+ switch (result) {
+ case ISC_R_SUCCESS:
+ if ((*rdatasetp)->type != dns_rdatatype_cname) {
+ policy = DNS_RPZ_POLICY_RECORD;
+ } else {
+ policy = dns_rpz_decode_cname(*rdatasetp, sname);
+ if (policy == DNS_RPZ_POLICY_RECORD &&
+ qtype != dns_rdatatype_cname &&
+ qtype != dns_rdatatype_any)
+ result = DNS_R_CNAME;
+ }
+ break;
+ case DNS_R_DNAME:
+ /*
+ * DNAME policy RRs have very few if any uses that are not
+ * better served with simple wildcards. Making the work would
+ * require complications to get the number of labels matched
+ * in the name or the found name itself to the main DNS_R_DNAME
+ * case in query_find(). So fall through to treat them as NODATA.
+ */
+ case DNS_R_NXRRSET:
+ policy = DNS_RPZ_POLICY_NODATA;
+ break;
+ case DNS_R_NXDOMAIN:
+ case DNS_R_EMPTYNAME:
+ /*
+ * If we don't get a qname hit,
+ * see if it is worth looking for other types.
+ */
+ dns_db_rpz_enabled(*dbp, client->query.rpz_st);
+ dns_db_detach(dbp);
+ dns_zone_detach(zonep);
+ policy = DNS_RPZ_POLICY_MISS;
+ break;
+ default:
+ dns_db_detach(dbp);
+ dns_zone_detach(zonep);
+ rpz_fail_log(client, DNS_RPZ_ERROR_LEVEL, rpz_type, qnamef,
+ "", result);
+ policy = DNS_RPZ_POLICY_ERROR;
+ result = DNS_R_SERVFAIL;
+ break;
+ }
+
+ *policyp = policy;
+ return (result);
+}
+
+/*
+ * Build and look for a QNAME or NSDNAME owner name in a response policy zone.
+ */
+static isc_result_t
+rpz_rewrite_name(ns_client_t *client, dns_rdatatype_t qtype, dns_name_t *qname,
+ dns_rpz_type_t rpz_type, dns_rdataset_t **rdatasetp)
+{
+ dns_rpz_st_t *st;
+ dns_rpz_zone_t *rpz;
+ dns_fixedname_t prefixf, rpz_qnamef;
+ dns_name_t *prefix, *suffix, *rpz_qname;
+ dns_zone_t *zone;
+ dns_db_t *db;
+ dns_dbnode_t *node;
+ dns_rpz_policy_t policy;
+ unsigned int labels;
+ isc_result_t result;
+
+ st = client->query.rpz_st;
+ zone = NULL;
+ db = NULL;
+ node = NULL;
+
+ for (rpz = ISC_LIST_HEAD(client->view->rpz_zones);
+ rpz != NULL;
+ rpz = ISC_LIST_NEXT(rpz, link)) {
+ /*
+ * Construct the rule's owner name.
+ */
+ dns_fixedname_init(&prefixf);
+ prefix = dns_fixedname_name(&prefixf);
+ dns_name_split(qname, 1, prefix, NULL);
+ if (rpz_type == DNS_RPZ_TYPE_NSDNAME)
+ suffix = &rpz->nsdname;
+ else
+ suffix = &rpz->origin;
+ dns_fixedname_init(&rpz_qnamef);
+ rpz_qname = dns_fixedname_name(&rpz_qnamef);
+ for (;;) {
+ result = dns_name_concatenate(prefix, suffix,
+ rpz_qname, NULL);
+ if (result == ISC_R_SUCCESS)
+ break;
+ INSIST(result == DNS_R_NAMETOOLONG);
+ labels = dns_name_countlabels(prefix);
+ if (labels < 2) {
+ rpz_fail_log(client, DNS_RPZ_ERROR_LEVEL,
+ rpz_type, suffix,
+ "concatentate() ", result);
+ return (ISC_R_SUCCESS);
+ }
+ if (labels+1 == dns_name_countlabels(qname)) {
+ rpz_fail_log(client, DNS_RPZ_DEBUG_LEVEL1,
+ rpz_type, suffix,
+ "concatentate() ", result);
+ }
+ dns_name_split(prefix, labels - 1, NULL, prefix);
+ }
+
+ /*
+ * See if the qname rule (or RR) exists.
+ */
+ result = rpz_find(client, qtype, rpz_qname, qname, rpz_type,
+ &zone, &db, &node, rdatasetp, &policy);
+ switch (result) {
+ case DNS_R_NXDOMAIN:
+ case DNS_R_EMPTYNAME:
+ break;
+ case DNS_R_SERVFAIL:
+ rpz_clean(&zone, &db, &node, rdatasetp);
+ st->m.policy = DNS_RPZ_POLICY_ERROR;
+ return (DNS_R_SERVFAIL);
+ default:
+ /*
+ * when more than one name or address hits a rule,
+ * prefer the first set of names (qname or NS),
+ * the first policy zone, and the smallest name
+ */
+ if (st->m.type == rpz_type &&
+ rpz->num > st->m.rpz->num &&
+ 0 <= dns_name_compare(rpz_qname, st->qname))
+ continue;
+ rpz_clean(&st->m.zone, &st->m.db, &st->m.node,
+ &st->m.rdataset);
+ st->m.rpz = rpz;
+ st->m.type = rpz_type;
+ st->m.prefix = 0;
+ st->m.policy = policy;
+ st->m.result = result;
+ dns_name_copy(rpz_qname, st->qname, NULL);
+ if (dns_rdataset_isassociated(*rdatasetp)) {
+ dns_rdataset_t *trdataset;
+
+ trdataset = st->m.rdataset;
+ st->m.rdataset = *rdatasetp;
+ *rdatasetp = trdataset;
+ st->m.ttl = st->m.rdataset->ttl;
+ } else {
+ st->m.ttl = DNS_RPZ_TTL_DEFAULT;
+ }
+ st->m.node = node;
+ node = NULL;
+ st->m.db = db;
+ db = NULL;
+ st->m.zone = zone;
+ zone = NULL;
+ }
+ }
+
+ rpz_clean(&zone, &db, &node, rdatasetp);
+ return (ISC_R_SUCCESS);
+}
+
+/*
+ * Look for response policy zone NSIP and NSDNAME rewriting.
+ */
+static isc_result_t
+rpz_rewrite(ns_client_t *client, dns_rdatatype_t qtype,
+ isc_boolean_t resuming)
+{
+ dns_rpz_st_t *st;
+ dns_db_t *ipdb;
+ dns_rdataset_t *rdataset;
+ dns_fixedname_t nsnamef;
+ dns_name_t *nsname;
+ dns_dbversion_t *version;
+ isc_result_t result;
+
+ ipdb = NULL;
+ rdataset = NULL;
+
+ st = client->query.rpz_st;
+ if (st == NULL) {
+ st = isc_mem_get(client->mctx, sizeof(*st));
+ if (st == NULL)
+ return (ISC_R_NOMEMORY);
+ st->state = 0;
+ memset(&st->m, 0, sizeof(st->m));
+ memset(&st->ns, 0, sizeof(st->ns));
+ memset(&st->q, 0, sizeof(st->q));
+ dns_fixedname_init(&st->_qnamef);
+ dns_fixedname_init(&st->_r_namef);
+ dns_fixedname_init(&st->_fnamef);
+ st->qname = dns_fixedname_name(&st->_qnamef);
+ st->r_name = dns_fixedname_name(&st->_r_namef);
+ st->fname = dns_fixedname_name(&st->_fnamef);
+ client->query.rpz_st = st;
+ }
+ if ((st->state & DNS_RPZ_DONE_QNAME) == 0) {
+ st->state = DNS_RPZ_DONE_QNAME;
+ st->m.type = DNS_RPZ_TYPE_BAD;
+ st->m.policy = DNS_RPZ_POLICY_MISS;
+
+ /*
+ * Check rules for the name if this it the first time,
+ * i.e. we've not been recursing.
+ */
+ result = DNS_R_SERVFAIL;
+ st->state &= ~(DNS_RPZ_HAVE_IP | DNS_RPZ_HAVE_NSIPv4 |
+ DNS_RPZ_HAVE_NSIPv6 | DNS_RPZ_HAD_NSDNAME);
+ result = rpz_rewrite_name(client, qtype, client->query.qname,
+ DNS_RPZ_TYPE_QNAME, &rdataset);
+ if (st->m.policy != DNS_RPZ_POLICY_MISS)
+ goto cleanup;
+ if ((st->state & (DNS_RPZ_HAVE_NSIPv4 | DNS_RPZ_HAVE_NSIPv6 |
+ DNS_RPZ_HAD_NSDNAME)) == 0)
+ goto cleanup;
+ st->ns.label = dns_name_countlabels(client->query.qname);
+ }
+
+ dns_fixedname_init(&nsnamef);
+ dns_name_clone(client->query.qname, dns_fixedname_name(&nsnamef));
+ while (st->ns.label > 1 && st->m.policy == DNS_RPZ_POLICY_MISS) {
+ if (st->ns.label == dns_name_countlabels(client->query.qname)) {
+ nsname = client->query.qname;
+ } else {
+ nsname = dns_fixedname_name(&nsnamef);
+ dns_name_split(client->query.qname, st->ns.label,
+ NULL, nsname);
+ }
+ if (st->ns.ns_rdataset == NULL ||
+ !dns_rdataset_isassociated(st->ns.ns_rdataset)) {
+ dns_db_t *db = NULL;
+ result = rpz_ns_find(client, nsname, dns_rdatatype_ns,
+ &db, NULL, &st->ns.ns_rdataset,
+ resuming);
+ if (db != NULL)
+ dns_db_detach(&db);
+ if (result != ISC_R_SUCCESS) {
+ if (result == DNS_R_DELEGATION)
+ goto cleanup;
+ if (result == DNS_R_EMPTYNAME ||
+ result == DNS_R_NXRRSET ||
+ result == DNS_R_EMPTYWILD ||
+ result == DNS_R_NXDOMAIN ||
+ result == DNS_R_NCACHENXDOMAIN ||
+ result == DNS_R_NCACHENXRRSET ||
+ result == DNS_R_CNAME ||
+ result == DNS_R_DNAME) {
+ rpz_fail_log(client,
+ DNS_RPZ_DEBUG_LEVEL2,
+ DNS_RPZ_TYPE_NSIP, nsname,
+ "NS db_find() ", result);
+ dns_rdataset_disassociate(st->ns.
+ ns_rdataset);
+ st->ns.label--;
+ continue;
+ }
+ if (st->m.policy != DNS_RPZ_POLICY_ERROR) {
+ rpz_fail_log(client, DNS_RPZ_INFO_LEVEL,
+ DNS_RPZ_TYPE_NSIP, nsname,
+ "NS db_find() ", result);
+ st->m.policy = DNS_RPZ_POLICY_ERROR;
+ }
+ goto cleanup;
+ }
+ result = dns_rdataset_first(st->ns.ns_rdataset);
+ if (result != ISC_R_SUCCESS)
+ goto cleanup;
+ }
+ /*
+ * Check all NS names.
+ */
+ do {
+ dns_rdata_ns_t ns;
+ dns_rdata_t nsrdata = DNS_RDATA_INIT;
+
+ dns_rdataset_current(st->ns.ns_rdataset, &nsrdata);
+ result = dns_rdata_tostruct(&nsrdata, &ns, NULL);
+ dns_rdata_reset(&nsrdata);
+ if (result != ISC_R_SUCCESS) {
+ rpz_fail_log(client, DNS_RPZ_ERROR_LEVEL,
+ DNS_RPZ_TYPE_NSIP, nsname,
+ "rdata_tostruct() ", result);
+ st->m.policy = DNS_RPZ_POLICY_ERROR;
+ goto cleanup;
+ }
+ if ((st->state & DNS_RPZ_HAD_NSDNAME) != 0) {
+ result = rpz_rewrite_name(client, qtype,
+ &ns.name,
+ DNS_RPZ_TYPE_NSDNAME,
+ &rdataset);
+ if (result != ISC_R_SUCCESS) {
+ dns_rdata_freestruct(&ns);
+ goto cleanup;
+ }
+ }
+ /*
+ * Check all IP addresses for this NS name, but don't
+ * bother without NSIP rules or with a NSDNAME hit.
+ */
+ version = NULL;
+ if ((st->state & DNS_RPZ_HAVE_NSIPv4) != 0 &&
+ st->m.type != DNS_RPZ_TYPE_NSDNAME &&
+ (st->state & DNS_RPZ_DONE_A) == 0) {
+ result = rpz_rewrite_nsip(client,
+ dns_rdatatype_a,
+ &ns.name, &ipdb,
+ version, &rdataset,
+ resuming);
+ if (result == ISC_R_SUCCESS)
+ st->state |= DNS_RPZ_DONE_A;
+ }
+ if (result == ISC_R_SUCCESS &&
+ (st->state & DNS_RPZ_HAVE_NSIPv6) != 0 &&
+ st->m.type != DNS_RPZ_TYPE_NSDNAME) {
+ result = rpz_rewrite_nsip(client,
+ dns_rdatatype_aaaa,
+ &ns.name, &ipdb, version,
+ &rdataset, resuming);
+ }
+ dns_rdata_freestruct(&ns);
+ if (ipdb != NULL)
+ dns_db_detach(&ipdb);
+ if (result != ISC_R_SUCCESS)
+ goto cleanup;
+ st->state &= ~DNS_RPZ_DONE_A;
+ result = dns_rdataset_next(st->ns.ns_rdataset);
+ } while (result == ISC_R_SUCCESS);
+ dns_rdataset_disassociate(st->ns.ns_rdataset);
+ st->ns.label--;
+ }
+
+ /*
+ * Use the best, if any, hit.
+ */
+ result = ISC_R_SUCCESS;
+
+cleanup:
+ if (st->m.policy != DNS_RPZ_POLICY_MISS &&
+ st->m.policy != DNS_RPZ_POLICY_NO_OP &&
+ st->m.policy != DNS_RPZ_POLICY_ERROR &&
+ st->m.rpz->policy != DNS_RPZ_POLICY_GIVEN)
+ st->m.policy = st->m.rpz->policy;
+ if (st->m.policy == DNS_RPZ_POLICY_NO_OP)
+ rpz_log(client);
+ if (st->m.policy == DNS_RPZ_POLICY_MISS ||
+ st->m.policy == DNS_RPZ_POLICY_NO_OP ||
+ st->m.policy == DNS_RPZ_POLICY_ERROR)
+ rpz_clean(&st->m.zone, &st->m.db, &st->m.node, &st->m.rdataset);
+ if (st->m.policy != DNS_RPZ_POLICY_MISS)
+ st->state |= DNS_RPZ_REWRITTEN;
+ if (st->m.policy == DNS_RPZ_POLICY_ERROR) {
+ st->m.type = DNS_RPZ_TYPE_BAD;
+ result = DNS_R_SERVFAIL;
+ }
+ if (rdataset != NULL)
+ query_putrdataset(client, &rdataset);
+ if ((st->state & DNS_RPZ_RECURSING) == 0) {
+ rpz_clean(NULL, &st->ns.db, NULL, &st->ns.ns_rdataset);
+ }
+
+ return (result);
+}
+
#define MAX_RESTARTS 16
#define QUERY_ERROR(r) \
@@ -3698,6 +4848,99 @@ query_findclosestnsec3(dns_name_t *qname, dns_db_t *db,
return;
}
+#ifdef ALLOW_FILTER_AAAA_ON_V4
+static isc_boolean_t
+is_v4_client(ns_client_t *client) {
+ if (isc_sockaddr_pf(&client->peeraddr) == AF_INET)
+ return (ISC_TRUE);
+ if (isc_sockaddr_pf(&client->peeraddr) == AF_INET6 &&
+ IN6_IS_ADDR_V4MAPPED(&client->peeraddr.type.sin6.sin6_addr))
+ return (ISC_TRUE);
+ return (ISC_FALSE);
+}
+#endif
+
+static isc_uint32_t
+dns64_ttl(dns_db_t *db, dns_dbversion_t *version) {
+ dns_dbnode_t *node = NULL;
+ dns_rdata_soa_t soa;
+ dns_rdata_t rdata = DNS_RDATA_INIT;
+ dns_rdataset_t rdataset;
+ isc_result_t result;
+ isc_uint32_t ttl = ISC_UINT32_MAX;
+
+ result = dns_db_getoriginnode(db, &node);
+ if (result != ISC_R_SUCCESS)
+ goto cleanup;
+ dns_rdataset_init(&rdataset);
+ result = dns_db_findrdataset(db, node, version, dns_rdatatype_soa,
+ 0, 0, &rdataset, NULL);
+ if (result != ISC_R_SUCCESS)
+ goto cleanup;
+ result = dns_rdataset_first(&rdataset);
+ if (result != ISC_R_SUCCESS)
+ goto cleanup;
+
+ dns_rdataset_current(&rdataset, &rdata);
+ result = dns_rdata_tostruct(&rdata, &soa, NULL);
+ RUNTIME_CHECK(result == ISC_R_SUCCESS);
+ ttl = ISC_MIN(rdataset.ttl, soa.minimum);
+
+cleanup:
+ if (dns_rdataset_isassociated(&rdataset))
+ dns_rdataset_disassociate(&rdataset);
+ if (node != NULL)
+ dns_db_detachnode(db, &node);
+ return (ttl);
+}
+
+static isc_boolean_t
+dns64_aaaaok(ns_client_t *client, dns_rdataset_t *rdataset,
+ dns_rdataset_t *sigrdataset)
+{
+ isc_netaddr_t netaddr;
+ dns_dns64_t *dns64 = ISC_LIST_HEAD(client->view->dns64);
+ unsigned int flags = 0;
+ unsigned int i, count;
+ isc_boolean_t *aaaaok;
+
+ INSIST(client->query.dns64_aaaaok == NULL);
+ INSIST(client->query.dns64_aaaaoklen == 0);
+ INSIST(client->query.dns64_aaaa == NULL);
+ INSIST(client->query.dns64_sigaaaa == NULL);
+
+ if (dns64 == NULL)
+ return (ISC_TRUE);
+
+ if (RECURSIONOK(client))
+ flags |= DNS_DNS64_RECURSIVE;
+
+ if (sigrdataset != NULL && dns_rdataset_isassociated(sigrdataset))
+ flags |= DNS_DNS64_DNSSEC;
+
+ count = dns_rdataset_count(rdataset);
+ aaaaok = isc_mem_get(client->mctx, sizeof(isc_boolean_t) * count);
+
+ isc_netaddr_fromsockaddr(&netaddr, &client->peeraddr);
+ if (dns_dns64_aaaaok(dns64, &netaddr, client->signer,
+ &ns_g_server->aclenv, flags, rdataset,
+ aaaaok, count)) {
+ for (i = 0; i < count; i++) {
+ if (aaaaok != NULL && !aaaaok[i]) {
+ client->query.dns64_aaaaok = aaaaok;
+ client->query.dns64_aaaaoklen = count;
+ break;
+ }
+ }
+ if (i == count)
+ isc_mem_put(client->mctx, aaaaok,
+ sizeof(isc_boolean_t) * count);
+ return (ISC_TRUE);
+ }
+ isc_mem_put(client->mctx, aaaaok, sizeof(isc_boolean_t) * count);
+ return (ISC_FALSE);
+}
+
/*
* Do the bulk of query processing for the current query of 'client'.
* If 'event' is non-NULL, we are returning from recursion and 'qtype'
@@ -3716,6 +4959,7 @@ query_find(ns_client_t *client, dns_fetchevent_t *event, dns_rdatatype_t qtype)
dns_rdata_t rdata = DNS_RDATA_INIT;
dns_rdatasetiter_t *rdsiter;
isc_boolean_t want_restart, authoritative, is_zone, need_wildcardproof;
+ isc_boolean_t is_staticstub_zone;
unsigned int n, nlabels;
dns_namereln_t namereln;
int order;
@@ -3731,8 +4975,10 @@ query_find(ns_client_t *client, dns_fetchevent_t *event, dns_rdatatype_t qtype)
unsigned int options;
isc_boolean_t empty_wild;
dns_rdataset_t *noqname;
+ dns_rpz_st_t *rpz_st;
isc_boolean_t resuming;
int line = -1;
+ isc_boolean_t dns64_exclude, dns64;
CTRACE("query_find");
@@ -3758,28 +5004,67 @@ query_find(ns_client_t *client, dns_fetchevent_t *event, dns_rdatatype_t qtype)
zone = NULL;
need_wildcardproof = ISC_FALSE;
empty_wild = ISC_FALSE;
+ dns64_exclude = dns64 = ISC_FALSE;
options = 0;
resuming = ISC_FALSE;
is_zone = ISC_FALSE;
+ is_staticstub_zone = ISC_FALSE;
if (event != NULL) {
/*
* We're returning from recursion. Restore the query context
* and resume.
*/
-
want_restart = ISC_FALSE;
- authoritative = ISC_FALSE;
- qtype = event->qtype;
+ rpz_st = client->query.rpz_st;
+ if (rpz_st != NULL &&
+ (rpz_st->state & DNS_RPZ_RECURSING) != 0) {
+ is_zone = rpz_st->q.is_zone;
+ authoritative = rpz_st->q.authoritative;
+ zone = rpz_st->q.zone;
+ rpz_st->q.zone = NULL;
+ node = rpz_st->q.node;
+ rpz_st->q.node = NULL;
+ db = rpz_st->q.db;
+ rpz_st->q.db = NULL;
+ rdataset = rpz_st->q.rdataset;
+ rpz_st->q.rdataset = NULL;
+ sigrdataset = rpz_st->q.sigrdataset;
+ rpz_st->q.sigrdataset = NULL;
+ qtype = rpz_st->q.qtype;
+
+ if (event->node != NULL)
+ dns_db_detachnode(db, &event->node);
+ rpz_st->ns.db = event->db;
+ rpz_st->ns.r_type = event->qtype;
+ rpz_st->ns.r_rdataset = event->rdataset;
+ if (event->sigrdataset != NULL &&
+ dns_rdataset_isassociated(event->sigrdataset))
+ dns_rdataset_disassociate(event->sigrdataset);
+ } else {
+ authoritative = ISC_FALSE;
+
+ qtype = event->qtype;
+ db = event->db;
+ node = event->node;
+ rdataset = event->rdataset;
+ sigrdataset = event->sigrdataset;
+ }
+
if (qtype == dns_rdatatype_rrsig || qtype == dns_rdatatype_sig)
type = dns_rdatatype_any;
else
type = qtype;
- db = event->db;
- node = event->node;
- rdataset = event->rdataset;
- sigrdataset = event->sigrdataset;
+
+ if (DNS64(client)) {
+ client->query.attributes &= ~NS_QUERYATTR_DNS64;
+ dns64 = ISC_TRUE;
+ }
+ if (DNS64EXCLUDE(client)) {
+ client->query.attributes &= ~NS_QUERYATTR_DNS64EXCLUDE;
+ dns64_exclude = ISC_TRUE;
+ }
/*
* We'll need some resources...
@@ -3794,16 +5079,26 @@ query_find(ns_client_t *client, dns_fetchevent_t *event, dns_rdatatype_t qtype)
QUERY_ERROR(DNS_R_SERVFAIL);
goto cleanup;
}
- tname = dns_fixedname_name(&event->foundname);
+ if (rpz_st != NULL &&
+ (rpz_st->state & DNS_RPZ_RECURSING) != 0) {
+ tname = rpz_st->fname;
+ } else {
+ tname = dns_fixedname_name(&event->foundname);
+ }
result = dns_name_copy(tname, fname, NULL);
if (result != ISC_R_SUCCESS) {
QUERY_ERROR(DNS_R_SERVFAIL);
goto cleanup;
}
-
- result = event->result;
+ if (rpz_st != NULL &&
+ (rpz_st->state & DNS_RPZ_RECURSING) != 0) {
+ rpz_st->ns.r_result = event->result;
+ result = rpz_st->q.result;
+ isc_event_free(ISC_EVENT_PTR(&event));
+ } else {
+ result = event->result;
+ }
resuming = ISC_TRUE;
-
goto resume;
}
@@ -3902,8 +5197,12 @@ query_find(ns_client_t *client, dns_fetchevent_t *event, dns_rdatatype_t qtype)
goto cleanup;
}
- if (is_zone)
+ is_staticstub_zone = ISC_FALSE;
+ if (is_zone && zone != NULL) {
authoritative = ISC_TRUE;
+ if (dns_zone_gettype(zone) == dns_zone_staticstub)
+ is_staticstub_zone = ISC_TRUE;
+ }
if (event == NULL && client->query.restarts == 0) {
if (is_zone) {
@@ -3956,6 +5255,119 @@ query_find(ns_client_t *client, dns_fetchevent_t *event, dns_rdatatype_t qtype)
resume:
CTRACE("query_find: resume");
+
+ if (!ISC_LIST_EMPTY(client->view->rpz_zones) &&
+ RECURSIONOK(client) && !RECURSING(client) &&
+ result != DNS_R_DELEGATION && result != ISC_R_NOTFOUND &&
+ (client->query.rpz_st == NULL ||
+ (client->query.rpz_st->state & DNS_RPZ_REWRITTEN) == 0) &&
+ !dns_name_equal(client->query.qname, dns_rootname)) {
+ isc_result_t rresult;
+
+ rresult = rpz_rewrite(client, qtype, resuming);
+ rpz_st = client->query.rpz_st;
+ switch (rresult) {
+ case ISC_R_SUCCESS:
+ break;
+ case DNS_R_DELEGATION:
+ /*
+ * recursing for NS names or addresses,
+ * so save the main query state
+ */
+ rpz_st->q.qtype = qtype;
+ rpz_st->q.is_zone = is_zone;
+ rpz_st->q.authoritative = authoritative;
+ rpz_st->q.zone = zone;
+ zone = NULL;
+ rpz_st->q.db = db;
+ db = NULL;
+ rpz_st->q.node = node;
+ node = NULL;
+ rpz_st->q.rdataset = rdataset;
+ rdataset = NULL;
+ rpz_st->q.sigrdataset = sigrdataset;
+ sigrdataset = NULL;
+ dns_name_copy(fname, rpz_st->fname, NULL);
+ rpz_st->q.result = result;
+ client->query.attributes |= NS_QUERYATTR_RECURSING;
+ result = ISC_R_SUCCESS;
+ goto cleanup;
+ default:
+ RECURSE_ERROR(rresult);
+ goto cleanup;
+ }
+ if (rpz_st->m.policy != DNS_RPZ_POLICY_MISS &&
+ rpz_st->m.policy != DNS_RPZ_POLICY_NO_OP) {
+ result = dns_name_copy(client->query.qname, fname,
+ NULL);
+ RUNTIME_CHECK(result == ISC_R_SUCCESS);
+ finish_rewrite:
+ rpz_clean(&zone, &db, &node, NULL);
+ if (rpz_st->m.rdataset != NULL) {
+ if (rdataset != NULL)
+ query_putrdataset(client, &rdataset);
+ rdataset = rpz_st->m.rdataset;
+ rpz_st->m.rdataset = NULL;
+ } else if (rdataset != NULL &&
+ dns_rdataset_isassociated(rdataset)) {
+ dns_rdataset_disassociate(rdataset);
+ }
+ node = rpz_st->m.node;
+ rpz_st->m.node = NULL;
+ db = rpz_st->m.db;
+ rpz_st->m.db = NULL;
+ zone = rpz_st->m.zone;
+ rpz_st->m.zone = NULL;
+
+ result = rpz_st->m.result;
+ switch (rpz_st->m.policy) {
+ case DNS_RPZ_POLICY_NXDOMAIN:
+ result = DNS_R_NXDOMAIN;
+ break;
+ case DNS_RPZ_POLICY_NODATA:
+ result = DNS_R_NXRRSET;
+ break;
+ case DNS_RPZ_POLICY_RECORD:
+ if (type == dns_rdatatype_any &&
+ result != DNS_R_CNAME &&
+ dns_rdataset_isassociated(rdataset))
+ dns_rdataset_disassociate(rdataset);
+ break;
+ case DNS_RPZ_POLICY_CNAME:
+ result = dns_name_copy(&rpz_st->m.rpz->cname,
+ fname, NULL);
+ RUNTIME_CHECK(result == ISC_R_SUCCESS);
+ query_keepname(client, fname, dbuf);
+ result = query_add_cname(client,
+ client->query.qname,
+ fname,
+ dns_trust_authanswer,
+ rpz_st->m.ttl);
+ if (result != ISC_R_SUCCESS)
+ goto cleanup;
+ ns_client_qnamereplace(client, fname);
+ fname = NULL;
+ client->attributes &= ~NS_CLIENTATTR_WANTDNSSEC;
+ rpz_log(client);
+ want_restart = ISC_TRUE;
+ goto cleanup;
+ default:
+ INSIST(0);
+ }
+
+ /*
+ * Turn off DNSSEC because the results of a
+ * response policy zone cannot verify.
+ */
+ client->attributes &= ~NS_CLIENTATTR_WANTDNSSEC;
+ if (sigrdataset != NULL &&
+ dns_rdataset_isassociated(sigrdataset))
+ dns_rdataset_disassociate(sigrdataset);
+ is_zone = ISC_TRUE;
+ rpz_log(client);
+ }
+ }
+
switch (result) {
case ISC_R_SUCCESS:
/*
@@ -4008,11 +5420,18 @@ query_find(ns_client_t *client, dns_fetchevent_t *event, dns_rdatatype_t qtype)
*/
if (RECURSIONOK(client)) {
result = query_recurse(client, qtype,
+ client->query.qname,
NULL, NULL, resuming);
- if (result == ISC_R_SUCCESS)
+ if (result == ISC_R_SUCCESS) {
client->query.attributes |=
NS_QUERYATTR_RECURSING;
- else
+ if (dns64)
+ client->query.attributes |=
+ NS_QUERYATTR_DNS64;
+ if (dns64_exclude)
+ client->query.attributes |=
+ NS_QUERYATTR_DNS64EXCLUDE;
+ } else
RECURSE_ERROR(result);
goto cleanup;
} else {
@@ -4143,12 +5562,22 @@ query_find(ns_client_t *client, dns_fetchevent_t *event, dns_rdatatype_t qtype)
}
} else {
if (zfname != NULL &&
- !dns_name_issubdomain(fname, zfname)) {
+ (!dns_name_issubdomain(fname, zfname) ||
+ (is_staticstub_zone &&
+ dns_name_equal(fname, zfname)))) {
/*
- * We've already got a delegation from
- * authoritative data, and it is better
- * than what we found in the cache. Use
- * it instead of the cache delegation.
+ * In the following cases use "authoritative"
+ * data instead of the cache delegation:
+ * 1. We've already got a delegation from
+ * authoritative data, and it is better
+ * than what we found in the cache.
+ * 2. The query name matches the origin name
+ * of a static-stub zone. This needs to be
+ * considered for the case where the NS of
+ * the static-stub zone and the cached NS
+ * are different. We still need to contact
+ * the nameservers configured in the
+ * static-stub zone.
*/
query_releasename(client, &fname);
fname = zfname;
@@ -4183,15 +5612,31 @@ query_find(ns_client_t *client, dns_fetchevent_t *event, dns_rdatatype_t qtype)
*/
if (dns_rdatatype_atparent(type))
result = query_recurse(client, qtype,
- NULL, NULL,
- resuming);
+ client->query.qname,
+ NULL, NULL, resuming);
+ else if (dns64)
+ result = query_recurse(client,
+ dns_rdatatype_a,
+ client->query.qname,
+ NULL, NULL, resuming);
else
result = query_recurse(client, qtype,
- fname, rdataset,
- resuming);
- if (result == ISC_R_SUCCESS)
+ client->query.qname,
+ fname, rdataset,
+ resuming);
+
+ if (result == ISC_R_SUCCESS) {
client->query.attributes |=
NS_QUERYATTR_RECURSING;
+ if (dns64)
+ client->query.attributes |=
+ NS_QUERYATTR_DNS64;
+ if (dns64_exclude)
+ client->query.attributes |=
+ NS_QUERYATTR_DNS64EXCLUDE;
+ } else if (result == DNS_R_DUPLICATE ||
+ result == DNS_R_DROP)
+ QUERY_ERROR(result);
else
RECURSE_ERROR(result);
} else {
@@ -4231,11 +5676,75 @@ query_find(ns_client_t *client, dns_fetchevent_t *event, dns_rdatatype_t qtype)
}
}
goto cleanup;
+
case DNS_R_EMPTYNAME:
- result = DNS_R_NXRRSET;
- /* FALLTHROUGH */
case DNS_R_NXRRSET:
+ nxrrset:
INSIST(is_zone);
+
+#ifdef dns64_bis_return_excluded_addresses
+ if (dns64)
+#else
+ if (dns64 && !dns64_exclude)
+#endif
+ {
+ /*
+ * Restore the answers from the previous AAAA lookup.
+ */
+ if (rdataset != NULL)
+ query_putrdataset(client, &rdataset);
+ if (sigrdataset != NULL)
+ query_putrdataset(client, &sigrdataset);
+ rdataset = client->query.dns64_aaaa;
+ sigrdataset = client->query.dns64_sigaaaa;
+ if (fname == NULL) {
+ dbuf = query_getnamebuf(client);
+ if (dbuf == NULL) {
+ QUERY_ERROR(DNS_R_SERVFAIL);
+ goto cleanup;
+ }
+ fname = query_newname(client, dbuf, &b);
+ if (fname == NULL) {
+ QUERY_ERROR(DNS_R_SERVFAIL);
+ goto cleanup;
+ }
+ }
+ dns_name_copy(client->query.qname, fname, NULL);
+ client->query.dns64_aaaa = NULL;
+ client->query.dns64_sigaaaa = NULL;
+ dns64 = ISC_FALSE;
+#ifdef dns64_bis_return_excluded_addresses
+ /*
+ * Resume the diverted processing of the AAAA response?
+ */
+ if (dns64_excluded)
+ break;
+#endif
+ } else if (result == DNS_R_NXRRSET &&
+ !ISC_LIST_EMPTY(client->view->dns64) &&
+ client->message->rdclass == dns_rdataclass_in &&
+ qtype == dns_rdatatype_aaaa)
+ {
+ /*
+ * Look to see if there are A records for this
+ * name.
+ */
+ INSIST(client->query.dns64_aaaa == NULL);
+ INSIST(client->query.dns64_sigaaaa == NULL);
+ client->query.dns64_aaaa = rdataset;
+ client->query.dns64_sigaaaa = sigrdataset;
+ client->query.dns64_ttl = dns64_ttl(db, version);
+ query_releasename(client, &fname);
+ dns_db_detachnode(db, &node);
+ rdataset = NULL;
+ sigrdataset = NULL;
+ type = qtype = dns_rdatatype_a;
+ dns64 = ISC_TRUE;
+ goto db_find;
+ }
+
+ result = DNS_R_NXRRSET;
+
/*
* Look for a NSEC3 record if we don't have a NSEC record.
*/
@@ -4258,10 +5767,8 @@ query_find(ns_client_t *client, dns_fetchevent_t *event, dns_rdatatype_t qtype)
* instead? If so add the nearest to the
* closest provable encloser.
*/
- if (found &&
- dns_rdataset_isassociated(rdataset) &&
- !dns_name_equal(qname, found))
- {
+ if (dns_rdataset_isassociated(rdataset) &&
+ !dns_name_equal(qname, found)) {
unsigned int count;
unsigned int skip;
@@ -4328,7 +5835,7 @@ query_find(ns_client_t *client, dns_fetchevent_t *event, dns_rdatatype_t qtype)
/*
* Add SOA.
*/
- result = query_addsoa(client, db, version, ISC_FALSE,
+ result = query_addsoa(client, db, version, ISC_UINT32_MAX,
dns_rdataset_isassociated(rdataset));
if (result != ISC_R_SUCCESS) {
QUERY_ERROR(result);
@@ -4377,10 +5884,11 @@ query_find(ns_client_t *client, dns_fetchevent_t *event, dns_rdatatype_t qtype)
zone != NULL &&
#endif
dns_zone_getzeronosoattl(zone))
- result = query_addsoa(client, db, version, ISC_TRUE,
+ result = query_addsoa(client, db, version, 0,
dns_rdataset_isassociated(rdataset));
else
- result = query_addsoa(client, db, version, ISC_FALSE,
+ result = query_addsoa(client, db, version,
+ ISC_UINT32_MAX,
dns_rdataset_isassociated(rdataset));
if (result != ISC_R_SUCCESS) {
QUERY_ERROR(result);
@@ -4411,6 +5919,7 @@ query_find(ns_client_t *client, dns_fetchevent_t *event, dns_rdatatype_t qtype)
case DNS_R_NCACHENXDOMAIN:
case DNS_R_NCACHENXRRSET:
+ ncache_nxrrset:
INSIST(!is_zone);
authoritative = ISC_FALSE;
/*
@@ -4426,6 +5935,74 @@ query_find(ns_client_t *client, dns_fetchevent_t *event, dns_rdatatype_t qtype)
client->message->rdclass == dns_rdataclass_in &&
dns_name_countlabels(fname) == 7)
warn_rfc1918(client, fname, rdataset);
+
+#ifdef dns64_bis_return_excluded_addresses
+ if (dns64)
+#else
+ if (dns64 && !dns64_exclude)
+#endif
+ {
+ /*
+ * Restore the answers from the previous AAAA lookup.
+ */
+ if (rdataset != NULL)
+ query_putrdataset(client, &rdataset);
+ if (sigrdataset != NULL)
+ query_putrdataset(client, &sigrdataset);
+ rdataset = client->query.dns64_aaaa;
+ sigrdataset = client->query.dns64_sigaaaa;
+ if (fname == NULL) {
+ dbuf = query_getnamebuf(client);
+ if (dbuf == NULL) {
+ QUERY_ERROR(DNS_R_SERVFAIL);
+ goto cleanup;
+ }
+ fname = query_newname(client, dbuf, &b);
+ if (fname == NULL) {
+ QUERY_ERROR(DNS_R_SERVFAIL);
+ goto cleanup;
+ }
+ }
+ dns_name_copy(client->query.qname, fname, NULL);
+ client->query.dns64_aaaa = NULL;
+ client->query.dns64_sigaaaa = NULL;
+ dns64 = ISC_FALSE;
+#ifdef dns64_bis_return_excluded_addresses
+ if (dns64_excluded)
+ break;
+#endif
+ } else if (result == DNS_R_NCACHENXRRSET &&
+ !ISC_LIST_EMPTY(client->view->dns64) &&
+ client->message->rdclass == dns_rdataclass_in &&
+ qtype == dns_rdatatype_aaaa)
+ {
+ /*
+ * Look to see if there are A records for this
+ * name.
+ */
+ INSIST(client->query.dns64_aaaa == NULL);
+ INSIST(client->query.dns64_sigaaaa == NULL);
+ client->query.dns64_aaaa = rdataset;
+ client->query.dns64_sigaaaa = sigrdataset;
+ /*
+ * If the ttl is zero we need to workout if we have just
+ * decremented to zero or if there was no negative cache
+ * ttl in the answer.
+ */
+ if (rdataset->ttl != 0)
+ client->query.dns64_ttl = rdataset->ttl;
+ else if (dns_rdataset_first(rdataset) == ISC_R_SUCCESS)
+ client->query.dns64_ttl = 0;
+ query_releasename(client, &fname);
+ dns_db_detachnode(db, &node);
+ rdataset = NULL;
+ sigrdataset = NULL;
+ fname = NULL;
+ type = qtype = dns_rdatatype_a;
+ dns64 = ISC_TRUE;
+ goto db_find;
+ }
+
/*
* We don't call query_addrrset() because we don't need any
* of its extra features (and things would probably break!).
@@ -4562,11 +6139,11 @@ query_find(ns_client_t *client, dns_fetchevent_t *event, dns_rdatatype_t qtype)
dns_message_puttempname(client->message, &tname);
goto cleanup;
}
- dns_name_init(tname, NULL);
dns_name_clone(&dname.dname, tname);
dns_rdata_freestruct(&dname);
/*
- * Construct the new qname.
+ * Construct the new qname consisting of
+ * <found name prefix>.<dname target>
*/
dns_fixedname_init(&fixed);
prefix = dns_fixedname_name(&fixed);
@@ -4583,8 +6160,8 @@ query_find(ns_client_t *client, dns_fetchevent_t *event, dns_rdatatype_t qtype)
goto cleanup;
}
result = dns_name_concatenate(prefix, tname, fname, NULL);
+ dns_message_puttempname(client->message, &tname);
if (result != ISC_R_SUCCESS) {
- dns_message_puttempname(client->message, &tname);
if (result == ISC_R_NOSPACE) {
/*
* RFC2672, section 4.1, subsection 3c says
@@ -4597,11 +6174,12 @@ query_find(ns_client_t *client, dns_fetchevent_t *event, dns_rdatatype_t qtype)
}
query_keepname(client, fname, dbuf);
/*
- * Synthesize a CNAME for this DNAME.
+ * Synthesize a CNAME consisting of
+ * <old qname> <dname ttl> CNAME <new qname>
+ * with <dname trust value>
*
- * We want to synthesize a CNAME since if we don't
- * then older software that doesn't understand DNAME
- * will not chain like it should.
+ * Synthesize a CNAME so old old clients that don't understand
+ * DNAME can chain.
*
* We do not try to synthesize a signature because we hope
* that security aware servers will understand DNAME. Also,
@@ -4609,12 +6187,10 @@ query_find(ns_client_t *client, dns_fetchevent_t *event, dns_rdatatype_t qtype)
* on-the-fly is costly, and not really legitimate anyway
* since the synthesized CNAME is NOT in the zone.
*/
- dns_name_init(tname, NULL);
- (void)query_addcnamelike(client, client->query.qname, fname,
- trdataset, &tname,
- dns_rdatatype_cname);
- if (tname != NULL)
- dns_message_puttempname(client->message, &tname);
+ result = query_add_cname(client, client->query.qname, fname,
+ trdataset->trust, trdataset->ttl);
+ if (result != ISC_R_SUCCESS)
+ goto cleanup;
/*
* Switch to the new qname and restart.
*/
@@ -4641,6 +6217,28 @@ query_find(ns_client_t *client, dns_fetchevent_t *event, dns_rdatatype_t qtype)
}
if (type == dns_rdatatype_any) {
+#ifdef ALLOW_FILTER_AAAA_ON_V4
+ isc_boolean_t have_aaaa, have_a, have_sig, filter_aaaa;
+
+ /*
+ * The filter-aaaa-on-v4 option should
+ * suppress AAAAs for IPv4 clients if there is an A.
+ * If we are not authoritative, assume there is a A
+ * even in if it is not in our cache. This assumption could
+ * be wrong but it is a good bet.
+ */
+ have_aaaa = ISC_FALSE;
+ have_a = !authoritative;
+ have_sig = ISC_FALSE;
+ if (client->view->v4_aaaa != dns_v4_aaaa_ok &&
+ is_v4_client(client) &&
+ ns_client_checkaclsilent(client, NULL,
+ client->view->v4_aaaa_acl,
+ ISC_TRUE) == ISC_R_SUCCESS)
+ filter_aaaa = ISC_TRUE;
+ else
+ filter_aaaa = ISC_FALSE;
+#endif
/*
* XXXRTH Need to handle zonecuts with special case
* code.
@@ -4652,6 +6250,54 @@ query_find(ns_client_t *client, dns_fetchevent_t *event, dns_rdatatype_t qtype)
QUERY_ERROR(DNS_R_SERVFAIL);
goto cleanup;
}
+
+ /*
+ * Check all A and AAAA records in all response policy
+ * IP address zones
+ */
+ rpz_st = client->query.rpz_st;
+ if (rpz_st != NULL &&
+ (rpz_st->state & DNS_RPZ_DONE_QNAME) != 0 &&
+ (rpz_st->state & DNS_RPZ_REWRITTEN) == 0 &&
+ RECURSIONOK(client) && !RECURSING(client) &&
+ (rpz_st->state & DNS_RPZ_HAVE_IP) != 0) {
+ for (result = dns_rdatasetiter_first(rdsiter);
+ result == ISC_R_SUCCESS;
+ result = dns_rdatasetiter_next(rdsiter)) {
+ dns_rdatasetiter_current(rdsiter, rdataset);
+ if (rdataset->type == dns_rdatatype_a ||
+ rdataset->type == dns_rdatatype_aaaa)
+ result = rpz_rewrite_ip(client,
+ rdataset,
+ DNS_RPZ_TYPE_IP);
+ dns_rdataset_disassociate(rdataset);
+ if (result != ISC_R_SUCCESS)
+ break;
+ }
+ if (result != ISC_R_NOMORE) {
+ dns_rdatasetiter_destroy(&rdsiter);
+ QUERY_ERROR(DNS_R_SERVFAIL);
+ goto cleanup;
+ }
+ switch (rpz_st->m.policy) {
+ case DNS_RPZ_POLICY_MISS:
+ break;
+ case DNS_RPZ_POLICY_NO_OP:
+ rpz_log(client);
+ rpz_st->state |= DNS_RPZ_REWRITTEN;
+ break;
+ case DNS_RPZ_POLICY_NXDOMAIN:
+ case DNS_RPZ_POLICY_NODATA:
+ case DNS_RPZ_POLICY_RECORD:
+ case DNS_RPZ_POLICY_CNAME:
+ dns_rdatasetiter_destroy(&rdsiter);
+ rpz_st->state |= DNS_RPZ_REWRITTEN;
+ goto finish_rewrite;
+ default:
+ INSIST(0);
+ }
+ }
+
/*
* Calling query_addrrset() with a non-NULL dbuf is going
* to either keep or release the name. We don't want it to
@@ -4668,6 +6314,18 @@ query_find(ns_client_t *client, dns_fetchevent_t *event, dns_rdatatype_t qtype)
result = dns_rdatasetiter_first(rdsiter);
while (result == ISC_R_SUCCESS) {
dns_rdatasetiter_current(rdsiter, rdataset);
+#ifdef ALLOW_FILTER_AAAA_ON_V4
+ /*
+ * Notice the presence of A and AAAAs so
+ * that AAAAs can be hidden from IPv4 clients.
+ */
+ if (filter_aaaa) {
+ if (rdataset->type == dns_rdatatype_aaaa)
+ have_aaaa = ISC_TRUE;
+ else if (rdataset->type == dns_rdatatype_a)
+ have_a = ISC_TRUE;
+ }
+#endif
if (is_zone && qtype == dns_rdatatype_any &&
!dns_db_issecure(db) &&
dns_rdatatype_isdnssec(rdataset->type)) {
@@ -4679,6 +6337,10 @@ query_find(ns_client_t *client, dns_fetchevent_t *event, dns_rdatatype_t qtype)
dns_rdataset_disassociate(rdataset);
} else if ((qtype == dns_rdatatype_any ||
rdataset->type == qtype) && rdataset->type != 0) {
+#ifdef ALLOW_FILTER_AAAA_ON_V4
+ if (dns_rdatatype_isdnssec(rdataset->type))
+ have_sig = ISC_TRUE;
+#endif
if (NOQNAME(rdataset) && WANTDNSSEC(client))
noqname = rdataset;
else
@@ -4709,6 +6371,16 @@ query_find(ns_client_t *client, dns_fetchevent_t *event, dns_rdatatype_t qtype)
result = dns_rdatasetiter_next(rdsiter);
}
+#ifdef ALLOW_FILTER_AAAA_ON_V4
+ /*
+ * Filter AAAAs if there is an A and there is no signature
+ * or we are supposed to break DNSSEC.
+ */
+ if (filter_aaaa && have_aaaa && have_a &&
+ (!have_sig || !WANTDNSSEC(client) ||
+ client->view->v4_aaaa == dns_v4_aaaa_break_dnssec))
+ client->attributes |= NS_CLIENTATTR_FILTER_AAAA;
+#endif
if (fname != NULL)
dns_message_puttempname(client->message, &fname);
@@ -4742,10 +6414,10 @@ query_find(ns_client_t *client, dns_fetchevent_t *event, dns_rdatatype_t qtype)
dns_rdatasetiter_destroy(&rdsiter);
if (RECURSIONOK(client)) {
result = query_recurse(client,
- qtype,
- NULL,
- NULL,
- resuming);
+ qtype,
+ client->query.qname,
+ NULL, NULL,
+ resuming);
if (result == ISC_R_SUCCESS)
client->query.attributes |=
NS_QUERYATTR_RECURSING;
@@ -4763,7 +6435,8 @@ query_find(ns_client_t *client, dns_fetchevent_t *event, dns_rdatatype_t qtype)
* Add SOA.
*/
result = query_addsoa(client, db, version,
- ISC_FALSE, ISC_FALSE);
+ ISC_UINT32_MAX,
+ ISC_FALSE);
if (result == ISC_R_SUCCESS)
result = ISC_R_NOMORE;
} else {
@@ -4783,6 +6456,162 @@ query_find(ns_client_t *client, dns_fetchevent_t *event, dns_rdatatype_t qtype)
* This is the "normal" case -- an ordinary question to which
* we know the answer.
*/
+
+ /*
+ * Check all A and AAAA records in all response policy
+ * IP address zones
+ */
+ rpz_st = client->query.rpz_st;
+ if (rpz_st != NULL &&
+ (rpz_st->state & DNS_RPZ_DONE_QNAME) != 0 &&
+ (rpz_st->state & DNS_RPZ_REWRITTEN) == 0 &&
+ RECURSIONOK(client) && !RECURSING(client) &&
+ (rpz_st->state & DNS_RPZ_HAVE_IP) != 0 &&
+ (qtype == dns_rdatatype_aaaa || qtype == dns_rdatatype_a)) {
+ result = rpz_rewrite_ip(client, rdataset,
+ DNS_RPZ_TYPE_IP);
+ if (result != ISC_R_SUCCESS) {
+ QUERY_ERROR(DNS_R_SERVFAIL);
+ goto cleanup;
+ }
+ /*
+ * After a hit in the radix tree for the policy domain,
+ * either stop trying to rewrite (DNS_RPZ_POLICY_NO_OP)
+ * or restart to ask the ordinary database of the
+ * policy zone for the DNS record corresponding to the
+ * record in the radix tree.
+ */
+ switch (rpz_st->m.policy) {
+ case DNS_RPZ_POLICY_MISS:
+ break;
+ case DNS_RPZ_POLICY_NO_OP:
+ rpz_log(client);
+ rpz_st->state |= DNS_RPZ_REWRITTEN;
+ break;
+ case DNS_RPZ_POLICY_NXDOMAIN:
+ case DNS_RPZ_POLICY_NODATA:
+ case DNS_RPZ_POLICY_RECORD:
+ case DNS_RPZ_POLICY_CNAME:
+ rpz_st->state |= DNS_RPZ_REWRITTEN;
+ goto finish_rewrite;
+ default:
+ INSIST(0);
+ }
+ }
+
+#ifdef ALLOW_FILTER_AAAA_ON_V4
+ /*
+ * Optionally hide AAAAs from IPv4 clients if there is an A.
+ * We add the AAAAs now, but might refuse to render them later
+ * after DNSSEC is figured out.
+ * This could be more efficient, but the whole idea is
+ * so fundamentally wrong, unavoidably inaccurate, and
+ * unneeded that it is best to keep it as short as possible.
+ */
+ if (client->view->v4_aaaa != dns_v4_aaaa_ok &&
+ is_v4_client(client) &&
+ ns_client_checkaclsilent(client, NULL,
+ client->view->v4_aaaa_acl,
+ ISC_TRUE) == ISC_R_SUCCESS &&
+ (!WANTDNSSEC(client) ||
+ sigrdataset == NULL ||
+ !dns_rdataset_isassociated(sigrdataset) ||
+ client->view->v4_aaaa == dns_v4_aaaa_break_dnssec)) {
+ if (qtype == dns_rdatatype_aaaa) {
+ trdataset = query_newrdataset(client);
+ result = dns_db_findrdataset(db, node, version,
+ dns_rdatatype_a, 0,
+ client->now,
+ trdataset, NULL);
+ if (dns_rdataset_isassociated(trdataset))
+ dns_rdataset_disassociate(trdataset);
+ query_putrdataset(client, &trdataset);
+
+ /*
+ * We have an AAAA but the A is not in our cache.
+ * Assume any result other than DNS_R_DELEGATION
+ * or ISC_R_NOTFOUND means there is no A and
+ * so AAAAs are ok.
+ * Assume there is no A if we can't recurse
+ * for this client, although that could be
+ * the wrong answer. What else can we do?
+ * Besides, that we have the AAAA and are using
+ * this mechanism suggests that we care more
+ * about As than AAAAs and would have cached
+ * the A if it existed.
+ */
+ if (result == ISC_R_SUCCESS) {
+ client->attributes |=
+ NS_CLIENTATTR_FILTER_AAAA;
+
+ } else if (authoritative ||
+ !RECURSIONOK(client) ||
+ (result != DNS_R_DELEGATION &&
+ result != ISC_R_NOTFOUND)) {
+ client->attributes &=
+ ~NS_CLIENTATTR_FILTER_AAAA;
+ } else {
+ /*
+ * This is an ugly kludge to recurse
+ * for the A and discard the result.
+ *
+ * Continue to add the AAAA now.
+ * We'll make a note to not render it
+ * if the recursion for the A succeeds.
+ */
+ result = query_recurse(client,
+ dns_rdatatype_a,
+ client->query.qname,
+ NULL, NULL, resuming);
+ if (result == ISC_R_SUCCESS) {
+ client->attributes |=
+ NS_CLIENTATTR_FILTER_AAAA_RC;
+ client->query.attributes |=
+ NS_QUERYATTR_RECURSING;
+ }
+ }
+
+ } else if (qtype == dns_rdatatype_a &&
+ (client->attributes &
+ NS_CLIENTATTR_FILTER_AAAA_RC) != 0) {
+ client->attributes &=
+ ~NS_CLIENTATTR_FILTER_AAAA_RC;
+ client->attributes |=
+ NS_CLIENTATTR_FILTER_AAAA;
+ dns_rdataset_disassociate(rdataset);
+ if (sigrdataset != NULL &&
+ dns_rdataset_isassociated(sigrdataset))
+ dns_rdataset_disassociate(sigrdataset);
+ goto cleanup;
+ }
+ }
+#endif
+ /*
+ * Check to see if the AAAA RRset has non-excluded addresses
+ * in it. If not look for a A RRset.
+ */
+ INSIST(client->query.dns64_aaaaok == NULL);
+
+ if (qtype == dns_rdatatype_aaaa && !dns64_exclude &&
+ !ISC_LIST_EMPTY(client->view->dns64) &&
+ client->message->rdclass == dns_rdataclass_in &&
+ !dns64_aaaaok(client, rdataset, sigrdataset)) {
+ /*
+ * Look to see if there are A records for this
+ * name.
+ */
+ client->query.dns64_aaaa = rdataset;
+ client->query.dns64_sigaaaa = sigrdataset;
+ client->query.dns64_ttl = rdataset->ttl;
+ query_releasename(client, &fname);
+ dns_db_detachnode(db, &node);
+ rdataset = NULL;
+ sigrdataset = NULL;
+ type = qtype = dns_rdatatype_a;
+ dns64_exclude = dns64 = ISC_TRUE;
+ goto db_find;
+ }
+
if (sigrdataset != NULL)
sigrdatasetp = &sigrdataset;
else
@@ -4798,8 +6627,43 @@ query_find(ns_client_t *client, dns_fetchevent_t *event, dns_rdatatype_t qtype)
dns_name_equal(client->query.qname, dns_rootname))
client->query.attributes &= ~NS_QUERYATTR_NOADDITIONAL;
- query_addrrset(client, &fname, &rdataset, sigrdatasetp, dbuf,
- DNS_SECTION_ANSWER);
+ if (dns64) {
+ qtype = type = dns_rdatatype_aaaa;
+ result = query_dns64(client, &fname, rdataset,
+ sigrdataset, dbuf,
+ DNS_SECTION_ANSWER);
+ dns_rdataset_disassociate(rdataset);
+ dns_message_puttemprdataset(client->message, &rdataset);
+ if (result == ISC_R_NOMORE) {
+#ifndef dns64_bis_return_excluded_addresses
+ if (dns64_exclude) {
+ if (!is_zone)
+ goto cleanup;
+ /*
+ * Add a fake SOA record.
+ */
+ result = query_addsoa(client, db,
+ version, 600,
+ ISC_FALSE);
+ goto cleanup;
+ }
+#endif
+ if (is_zone)
+ goto nxrrset;
+ else
+ goto ncache_nxrrset;
+ } else if (result != ISC_R_SUCCESS) {
+ eresult = result;
+ goto cleanup;
+ }
+ } else if (client->query.dns64_aaaaok != NULL) {
+ query_filter64(client, &fname, rdataset, dbuf,
+ DNS_SECTION_ANSWER);
+ query_putrdataset(client, &rdataset);
+ } else
+ query_addrrset(client, &fname, &rdataset,
+ sigrdatasetp, dbuf, DNS_SECTION_ANSWER);
+
if (noqname != NULL)
query_addnoqnameproof(client, noqname);
/*
@@ -4842,6 +6706,10 @@ query_find(ns_client_t *client, dns_fetchevent_t *event, dns_rdatatype_t qtype)
/*
* General cleanup.
*/
+ rpz_st = client->query.rpz_st;
+ if (rpz_st != NULL && (rpz_st->state & DNS_RPZ_RECURSING) == 0)
+ rpz_clean(&rpz_st->m.zone, &rpz_st->m.db, &rpz_st->m.node,
+ &rpz_st->m.rdataset);
if (rdataset != NULL)
query_putrdataset(client, &rdataset);
if (sigrdataset != NULL)
@@ -4949,6 +6817,7 @@ log_query(ns_client_t *client, unsigned int flags, unsigned int extflags) {
char namebuf[DNS_NAME_FORMATSIZE];
char typename[DNS_RDATATYPE_FORMATSIZE];
char classname[DNS_RDATACLASS_FORMATSIZE];
+ char onbuf[ISC_NETADDR_FORMATSIZE];
dns_rdataset_t *rdataset;
int level = ISC_LOG_INFO;
@@ -4960,14 +6829,18 @@ log_query(ns_client_t *client, unsigned int flags, unsigned int extflags) {
dns_name_format(client->query.qname, namebuf, sizeof(namebuf));
dns_rdataclass_format(rdataset->rdclass, classname, sizeof(classname));
dns_rdatatype_format(rdataset->type, typename, sizeof(typename));
+ isc_netaddr_format(&client->destaddr, onbuf, sizeof(onbuf));
ns_client_log(client, NS_LOGCATEGORY_QUERIES, NS_LOGMODULE_QUERY,
- level, "query: %s %s %s %s%s%s%s%s", namebuf, classname,
- typename, WANTRECURSION(client) ? "+" : "-",
+ level, "query: %s %s %s %s%s%s%s%s%s (%s)", namebuf,
+ classname, typename, WANTRECURSION(client) ? "+" : "-",
(client->signer != NULL) ? "S": "",
(client->opt != NULL) ? "E" : "",
+ ((client->attributes & NS_CLIENTATTR_TCP) != 0) ?
+ "T" : "",
((extflags & DNS_MESSAGEEXTFLAG_DO) != 0) ? "D" : "",
- ((flags & DNS_MESSAGEFLAG_CD) != 0) ? "C" : "");
+ ((flags & DNS_MESSAGEFLAG_CD) != 0) ? "C" : "",
+ onbuf);
}
static inline void
diff --git a/contrib/bind9/bin/named/server.c b/contrib/bind9/bin/named/server.c
index bc7fc17..5bbf94b 100644
--- a/contrib/bind9/bin/named/server.c
+++ b/contrib/bind9/bin/named/server.c
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: server.c,v 1.520.12.21 2011-01-14 23:45:49 tbox Exp $ */
+/* $Id: server.c,v 1.599.8.4 2011-02-16 19:46:12 each Exp $ */
/*! \file */
@@ -23,6 +23,10 @@
#include <stdlib.h>
#include <unistd.h>
+#include <limits.h>
+#include <ctype.h>
+#include <sys/types.h>
+#include <sys/stat.h>
#include <isc/app.h>
#include <isc/base64.h>
@@ -36,7 +40,9 @@
#include <isc/portset.h>
#include <isc/print.h>
#include <isc/resource.h>
+#include <isc/sha2.h>
#include <isc/socket.h>
+#include <isc/stat.h>
#include <isc/stats.h>
#include <isc/stdio.h>
#include <isc/string.h>
@@ -57,9 +63,11 @@
#ifdef DLZ
#include <dns/dlz.h>
#endif
+#include <dns/dns64.h>
#include <dns/forward.h>
#include <dns/journal.h>
#include <dns/keytable.h>
+#include <dns/keyvalues.h>
#include <dns/lib.h>
#include <dns/master.h>
#include <dns/masterdump.h>
@@ -102,6 +110,10 @@
#include <stdlib.h>
#endif
+#ifndef PATH_MAX
+#define PATH_MAX 1024
+#endif
+
/*%
* Check an operation for failure. Assumes that the function
* using it has a 'result' variable and a 'cleanup' label.
@@ -143,6 +155,14 @@
fatal(msg, result); \
} while (0) \
+/*%
+ * Maximum ADB size for views that share a cache. Use this limit to suppress
+ * the total of memory footprint, which should be the main reason for sharing
+ * a cache. Only effective when a finite max-cache-size is specified.
+ * This is currently defined to be 8MB.
+ */
+#define MAX_ADB_SIZE_FOR_CACHESHARE 8388608
+
struct ns_dispatch {
isc_sockaddr_t addr;
unsigned int dispatchgen;
@@ -150,6 +170,14 @@ struct ns_dispatch {
ISC_LINK(struct ns_dispatch) link;
};
+struct ns_cache {
+ dns_cache_t *cache;
+ dns_view_t *primaryview;
+ isc_boolean_t needflush;
+ isc_boolean_t adbsizeadjusted;
+ ISC_LINK(ns_cache_t) link;
+};
+
struct dumpcontext {
isc_mem_t *mctx;
isc_boolean_t dumpcache;
@@ -176,6 +204,17 @@ struct zonelistentry {
ISC_LINK(struct zonelistentry) link;
};
+/*%
+ * Configuration context to retain for each view that allows
+ * new zones to be added at runtime
+ */
+struct cfg_context {
+ isc_mem_t * mctx;
+ cfg_obj_t * config;
+ cfg_parser_t * parser;
+ cfg_aclconfctx_t actx;
+};
+
/*
* These zones should not leak onto the Internet.
*/
@@ -230,8 +269,8 @@ static const struct {
{ NULL, ISC_FALSE }
};
-static void
-fatal(const char *msg, isc_result_t result);
+ISC_PLATFORM_NORETURN_PRE static void
+fatal(const char *msg, isc_result_t result) ISC_PLATFORM_NORETURN_POST;
static void
ns_server_reload(isc_task_t *task, isc_event_t *event);
@@ -256,19 +295,25 @@ configure_alternates(const cfg_obj_t *config, dns_view_t *view,
static isc_result_t
configure_zone(const cfg_obj_t *config, const cfg_obj_t *zconfig,
const cfg_obj_t *vconfig, isc_mem_t *mctx, dns_view_t *view,
- cfg_aclconfctx_t *aclconf);
+ cfg_aclconfctx_t *aclconf, isc_boolean_t added);
+
+static isc_result_t
+add_keydata_zone(dns_view_t *view, const char *directory, isc_mem_t *mctx);
static void
end_reserved_dispatches(ns_server_t *server, isc_boolean_t all);
+static void
+cfgctx_destroy(void **cfgp);
+
/*%
* Configure a single view ACL at '*aclp'. Get its configuration from
* 'vconfig' (for per-view configuration) and maybe from 'config'
*/
static isc_result_t
configure_view_acl(const cfg_obj_t *vconfig, const cfg_obj_t *config,
- const char *aclname, cfg_aclconfctx_t *actx,
- isc_mem_t *mctx, dns_acl_t **aclp)
+ const char *aclname, const char *acltuplename,
+ cfg_aclconfctx_t *actx, isc_mem_t *mctx, dns_acl_t **aclp)
{
isc_result_t result;
const cfg_obj_t *maps[3];
@@ -294,13 +339,21 @@ configure_view_acl(const cfg_obj_t *vconfig, const cfg_obj_t *config,
*/
return (ISC_R_SUCCESS);
+ if (acltuplename != NULL) {
+ /*
+ * If the ACL is given in an optional tuple, retrieve it.
+ * The parser should have ensured that a valid object be
+ * returned.
+ */
+ aclobj = cfg_tuple_get(aclobj, acltuplename);
+ }
+
result = cfg_acl_fromconfig(aclobj, config, ns_g_lctx,
actx, mctx, 0, aclp);
return (result);
}
-
/*%
* Configure a sortlist at '*aclp'. Essentially the same as
* configure_view_acl() except it calls cfg_acl_fromconfig with a
@@ -345,8 +398,88 @@ configure_view_sortlist(const cfg_obj_t *vconfig, const cfg_obj_t *config,
}
static isc_result_t
-configure_view_dnsseckey(const cfg_obj_t *vconfig, const cfg_obj_t *key,
- dns_keytable_t *keytable, isc_mem_t *mctx)
+configure_view_nametable(const cfg_obj_t *vconfig, const cfg_obj_t *config,
+ const char *confname, const char *conftuplename,
+ isc_mem_t *mctx, dns_rbt_t **rbtp)
+{
+ isc_result_t result;
+ const cfg_obj_t *maps[3];
+ const cfg_obj_t *obj = NULL;
+ const cfg_listelt_t *element;
+ int i = 0;
+ dns_fixedname_t fixed;
+ dns_name_t *name;
+ isc_buffer_t b;
+ const char *str;
+ const cfg_obj_t *nameobj;
+
+ if (*rbtp != NULL)
+ dns_rbt_destroy(rbtp);
+ if (vconfig != NULL)
+ maps[i++] = cfg_tuple_get(vconfig, "options");
+ if (config != NULL) {
+ const cfg_obj_t *options = NULL;
+ (void)cfg_map_get(config, "options", &options);
+ if (options != NULL)
+ maps[i++] = options;
+ }
+ maps[i] = NULL;
+
+ (void)ns_config_get(maps, confname, &obj);
+ if (obj == NULL)
+ /*
+ * No value available. *rbtp == NULL.
+ */
+ return (ISC_R_SUCCESS);
+
+ if (conftuplename != NULL) {
+ obj = cfg_tuple_get(obj, conftuplename);
+ if (cfg_obj_isvoid(obj))
+ return (ISC_R_SUCCESS);
+ }
+
+ result = dns_rbt_create(mctx, NULL, NULL, rbtp);
+ if (result != ISC_R_SUCCESS)
+ return (result);
+
+ dns_fixedname_init(&fixed);
+ name = dns_fixedname_name(&fixed);
+ for (element = cfg_list_first(obj);
+ element != NULL;
+ element = cfg_list_next(element)) {
+ nameobj = cfg_listelt_value(element);
+ str = cfg_obj_asstring(nameobj);
+ isc_buffer_init(&b, str, strlen(str));
+ isc_buffer_add(&b, strlen(str));
+ CHECK(dns_name_fromtext(name, &b, dns_rootname, 0, NULL));
+ /*
+ * We don't need the node data, but need to set dummy data to
+ * avoid a partial match with an empty node. For example, if
+ * we have foo.example.com and bar.example.com, we'd get a match
+ * for baz.example.com, which is not the expected result.
+ * We simply use (void *)1 as the dummy data.
+ */
+ result = dns_rbt_addname(*rbtp, name, (void *)1);
+ if (result != ISC_R_SUCCESS) {
+ cfg_obj_log(nameobj, ns_g_lctx, ISC_LOG_ERROR,
+ "failed to add %s for %s: %s",
+ str, confname, isc_result_totext(result));
+ goto cleanup;
+ }
+
+ }
+
+ return (result);
+
+ cleanup:
+ dns_rbt_destroy(rbtp);
+ return (result);
+
+}
+
+static isc_result_t
+dstkey_fromconfig(const cfg_obj_t *vconfig, const cfg_obj_t *key,
+ isc_boolean_t managed, dst_key_t **target, isc_mem_t *mctx)
{
dns_rdataclass_t viewclass;
dns_rdata_dnskey_t keystruct;
@@ -363,12 +496,28 @@ configure_view_dnsseckey(const cfg_obj_t *vconfig, const cfg_obj_t *key,
isc_result_t result;
dst_key_t *dstkey = NULL;
+ INSIST(target != NULL && *target == NULL);
+
flags = cfg_obj_asuint32(cfg_tuple_get(key, "flags"));
proto = cfg_obj_asuint32(cfg_tuple_get(key, "protocol"));
alg = cfg_obj_asuint32(cfg_tuple_get(key, "algorithm"));
keyname = dns_fixedname_name(&fkeyname);
keynamestr = cfg_obj_asstring(cfg_tuple_get(key, "name"));
+ if (managed) {
+ const char *initmethod;
+ initmethod = cfg_obj_asstring(cfg_tuple_get(key, "init"));
+
+ if (strcasecmp(initmethod, "initial-key") != 0) {
+ cfg_obj_log(key, ns_g_lctx, ISC_LOG_ERROR,
+ "managed key '%s': "
+ "invalid initialization method '%s'",
+ keynamestr, initmethod);
+ result = ISC_R_FAILURE;
+ goto cleanup;
+ }
+ }
+
if (vconfig == NULL)
viewclass = dns_rdataclass_in;
else {
@@ -408,7 +557,8 @@ configure_view_dnsseckey(const cfg_obj_t *vconfig, const cfg_obj_t *key,
keystruct.algorithm == DST_ALG_RSAMD5) &&
r.length > 1 && r.base[0] == 1 && r.base[1] == 3)
cfg_obj_log(key, ns_g_lctx, ISC_LOG_WARNING,
- "trusted key '%s' has a weak exponent",
+ "%s key '%s' has a weak exponent",
+ managed ? "managed" : "trusted",
keynamestr);
CHECK(dns_rdata_fromstruct(NULL,
@@ -418,25 +568,28 @@ configure_view_dnsseckey(const cfg_obj_t *vconfig, const cfg_obj_t *key,
dns_fixedname_init(&fkeyname);
isc_buffer_init(&namebuf, keynamestr, strlen(keynamestr));
isc_buffer_add(&namebuf, strlen(keynamestr));
- CHECK(dns_name_fromtext(keyname, &namebuf,
- dns_rootname, ISC_FALSE,
- NULL));
+ CHECK(dns_name_fromtext(keyname, &namebuf, dns_rootname, 0, NULL));
CHECK(dst_key_fromdns(keyname, viewclass, &rrdatabuf,
mctx, &dstkey));
- CHECK(dns_keytable_add(keytable, &dstkey));
- INSIST(dstkey == NULL);
+ *target = dstkey;
return (ISC_R_SUCCESS);
cleanup:
if (result == DST_R_NOCRYPTO) {
cfg_obj_log(key, ns_g_lctx, ISC_LOG_ERROR,
- "ignoring trusted key for '%s': no crypto support",
+ "ignoring %s key for '%s': no crypto support",
+ managed ? "managed" : "trusted",
keynamestr);
- result = ISC_R_SUCCESS;
+ } else if (result == DST_R_UNSUPPORTEDALG) {
+ cfg_obj_log(key, ns_g_lctx, ISC_LOG_WARNING,
+ "skipping %s key for '%s': %s",
+ managed ? "managed" : "trusted",
+ keynamestr, isc_result_totext(result));
} else {
cfg_obj_log(key, ns_g_lctx, ISC_LOG_ERROR,
- "configuring trusted key for '%s': %s",
+ "configuring %s key for '%s': %s",
+ managed ? "managed" : "trusted",
keynamestr, isc_result_totext(result));
result = ISC_R_FAILURE;
}
@@ -447,63 +600,215 @@ configure_view_dnsseckey(const cfg_obj_t *vconfig, const cfg_obj_t *key,
return (result);
}
+static isc_result_t
+load_view_keys(const cfg_obj_t *keys, const cfg_obj_t *vconfig,
+ dns_view_t *view, isc_boolean_t managed,
+ dns_name_t *keyname, isc_mem_t *mctx)
+{
+ const cfg_listelt_t *elt, *elt2;
+ const cfg_obj_t *key, *keylist;
+ dst_key_t *dstkey = NULL;
+ isc_result_t result;
+ dns_keytable_t *secroots = NULL;
+
+ CHECK(dns_view_getsecroots(view, &secroots));
+
+ for (elt = cfg_list_first(keys);
+ elt != NULL;
+ elt = cfg_list_next(elt)) {
+ keylist = cfg_listelt_value(elt);
+
+ for (elt2 = cfg_list_first(keylist);
+ elt2 != NULL;
+ elt2 = cfg_list_next(elt2)) {
+ key = cfg_listelt_value(elt2);
+ result = dstkey_fromconfig(vconfig, key, managed,
+ &dstkey, mctx);
+ if (result == DST_R_UNSUPPORTEDALG) {
+ result = ISC_R_SUCCESS;
+ continue;
+ }
+ if (result != ISC_R_SUCCESS)
+ goto cleanup;
+
+ /*
+ * If keyname was specified, we only add that key.
+ */
+ if (keyname != NULL &&
+ !dns_name_equal(keyname, dst_key_name(dstkey)))
+ {
+ dst_key_free(&dstkey);
+ continue;
+ }
+
+ CHECK(dns_keytable_add(secroots, managed, &dstkey));
+ }
+ }
+
+ cleanup:
+ if (dstkey != NULL)
+ dst_key_free(&dstkey);
+ if (secroots != NULL)
+ dns_keytable_detach(&secroots);
+ if (result == DST_R_NOCRYPTO)
+ result = ISC_R_SUCCESS;
+ return (result);
+}
+
/*%
- * Configure DNSSEC keys for a view. Currently used only for
- * the security roots.
+ * Configure DNSSEC keys for a view.
*
* The per-view configuration values and the server-global defaults are read
- * from 'vconfig' and 'config'. The variable to be configured is '*target'.
+ * from 'vconfig' and 'config'.
*/
static isc_result_t
-configure_view_dnsseckeys(const cfg_obj_t *vconfig, const cfg_obj_t *config,
- isc_mem_t *mctx, dns_keytable_t **target)
+configure_view_dnsseckeys(dns_view_t *view, const cfg_obj_t *vconfig,
+ const cfg_obj_t *config, const cfg_obj_t *bindkeys,
+ isc_boolean_t auto_dlv, isc_boolean_t auto_root,
+ isc_mem_t *mctx)
{
- isc_result_t result;
- const cfg_obj_t *keys = NULL;
+ isc_result_t result = ISC_R_SUCCESS;
+ const cfg_obj_t *view_keys = NULL;
+ const cfg_obj_t *global_keys = NULL;
+ const cfg_obj_t *view_managed_keys = NULL;
+ const cfg_obj_t *global_managed_keys = NULL;
+ const cfg_obj_t *maps[4];
const cfg_obj_t *voptions = NULL;
- const cfg_listelt_t *element, *element2;
- const cfg_obj_t *keylist;
- const cfg_obj_t *key;
- dns_keytable_t *keytable = NULL;
+ const cfg_obj_t *options = NULL;
+ const cfg_obj_t *obj = NULL;
+ const char *directory;
+ int i = 0;
- CHECK(dns_keytable_create(mctx, &keytable));
+ /* We don't need trust anchors for the _bind view */
+ if (strcmp(view->name, "_bind") == 0 &&
+ view->rdclass == dns_rdataclass_chaos) {
+ return (ISC_R_SUCCESS);
+ }
- if (vconfig != NULL)
+ if (vconfig != NULL) {
voptions = cfg_tuple_get(vconfig, "options");
+ if (voptions != NULL) {
+ (void) cfg_map_get(voptions, "trusted-keys",
+ &view_keys);
+ (void) cfg_map_get(voptions, "managed-keys",
+ &view_managed_keys);
+ maps[i++] = voptions;
+ }
+ }
- keys = NULL;
- if (voptions != NULL)
- (void)cfg_map_get(voptions, "trusted-keys", &keys);
- if (keys == NULL)
- (void)cfg_map_get(config, "trusted-keys", &keys);
+ if (config != NULL) {
+ (void)cfg_map_get(config, "trusted-keys", &global_keys);
+ (void)cfg_map_get(config, "managed-keys", &global_managed_keys);
+ (void)cfg_map_get(config, "options", &options);
+ if (options != NULL) {
+ maps[i++] = options;
+ }
+ }
- for (element = cfg_list_first(keys);
- element != NULL;
- element = cfg_list_next(element))
- {
- keylist = cfg_listelt_value(element);
- for (element2 = cfg_list_first(keylist);
- element2 != NULL;
- element2 = cfg_list_next(element2))
- {
- key = cfg_listelt_value(element2);
- CHECK(configure_view_dnsseckey(vconfig, key,
- keytable, mctx));
+ maps[i++] = ns_g_defaults;
+ maps[i] = NULL;
+
+ result = dns_view_initsecroots(view, mctx);
+ if (result != ISC_R_SUCCESS) {
+ isc_log_write(ns_g_lctx, NS_LOGCATEGORY_GENERAL,
+ NS_LOGMODULE_SERVER, ISC_LOG_ERROR,
+ "couldn't create keytable");
+ return (ISC_R_UNEXPECTED);
+ }
+
+ if (auto_dlv && view->rdclass == dns_rdataclass_in) {
+ const cfg_obj_t *builtin_keys = NULL;
+ const cfg_obj_t *builtin_managed_keys = NULL;
+
+ isc_log_write(ns_g_lctx, DNS_LOGCATEGORY_SECURITY,
+ NS_LOGMODULE_SERVER, ISC_LOG_WARNING,
+ "using built-in DLV key for view %s",
+ view->name);
+
+ /*
+ * If bind.keys exists, it overrides the managed-keys
+ * clause hard-coded in ns_g_config.
+ */
+ if (bindkeys != NULL) {
+ (void)cfg_map_get(bindkeys, "trusted-keys",
+ &builtin_keys);
+ (void)cfg_map_get(bindkeys, "managed-keys",
+ &builtin_managed_keys);
+ } else {
+ (void)cfg_map_get(ns_g_config, "trusted-keys",
+ &builtin_keys);
+ (void)cfg_map_get(ns_g_config, "managed-keys",
+ &builtin_managed_keys);
}
+
+ if (builtin_keys != NULL)
+ CHECK(load_view_keys(builtin_keys, vconfig, view,
+ ISC_FALSE, view->dlv, mctx));
+ if (builtin_managed_keys != NULL)
+ CHECK(load_view_keys(builtin_managed_keys, vconfig,
+ view, ISC_TRUE, view->dlv, mctx));
}
- dns_keytable_detach(target);
- *target = keytable; /* Transfer ownership. */
- keytable = NULL;
- result = ISC_R_SUCCESS;
+ if (auto_root && view->rdclass == dns_rdataclass_in) {
+ const cfg_obj_t *builtin_keys = NULL;
+ const cfg_obj_t *builtin_managed_keys = NULL;
- cleanup:
+ isc_log_write(ns_g_lctx, DNS_LOGCATEGORY_SECURITY,
+ NS_LOGMODULE_SERVER, ISC_LOG_WARNING,
+ "using built-in root key for view %s",
+ view->name);
+
+ /*
+ * If bind.keys exists, it overrides the managed-keys
+ * clause hard-coded in ns_g_config.
+ */
+ if (bindkeys != NULL) {
+ (void)cfg_map_get(bindkeys, "trusted-keys",
+ &builtin_keys);
+ (void)cfg_map_get(bindkeys, "managed-keys",
+ &builtin_managed_keys);
+ } else {
+ (void)cfg_map_get(ns_g_config, "trusted-keys",
+ &builtin_keys);
+ (void)cfg_map_get(ns_g_config, "managed-keys",
+ &builtin_managed_keys);
+ }
+
+ if (builtin_keys != NULL)
+ CHECK(load_view_keys(builtin_keys, vconfig, view,
+ ISC_FALSE, dns_rootname, mctx));
+ if (builtin_managed_keys != NULL)
+ CHECK(load_view_keys(builtin_managed_keys, vconfig,
+ view, ISC_TRUE, dns_rootname,
+ mctx));
+ }
+
+ CHECK(load_view_keys(view_keys, vconfig, view, ISC_FALSE,
+ NULL, mctx));
+ CHECK(load_view_keys(view_managed_keys, vconfig, view, ISC_TRUE,
+ NULL, mctx));
+
+ if (view->rdclass == dns_rdataclass_in) {
+ CHECK(load_view_keys(global_keys, vconfig, view, ISC_FALSE,
+ NULL, mctx));
+ CHECK(load_view_keys(global_managed_keys, vconfig, view,
+ ISC_TRUE, NULL, mctx));
+ }
+
+ /*
+ * Add key zone for managed-keys.
+ */
+ obj = NULL;
+ (void)ns_config_get(maps, "managed-keys-directory", &obj);
+ directory = obj != NULL ? cfg_obj_asstring(obj) : NULL;
+ CHECK(add_keydata_zone(view, directory, ns_g_mctx));
+
+ cleanup:
return (result);
}
static isc_result_t
-mustbesecure(const cfg_obj_t *mbs, dns_resolver_t *resolver)
-{
+mustbesecure(const cfg_obj_t *mbs, dns_resolver_t *resolver) {
const cfg_listelt_t *element;
const cfg_obj_t *obj;
const char *str;
@@ -523,8 +828,7 @@ mustbesecure(const cfg_obj_t *mbs, dns_resolver_t *resolver)
str = cfg_obj_asstring(cfg_tuple_get(obj, "name"));
isc_buffer_init(&b, str, strlen(str));
isc_buffer_add(&b, strlen(str));
- CHECK(dns_name_fromtext(name, &b, dns_rootname,
- ISC_FALSE, NULL));
+ CHECK(dns_name_fromtext(name, &b, dns_rootname, 0, NULL));
value = cfg_obj_asboolean(cfg_tuple_get(obj, "value"));
CHECK(dns_resolver_setmustbesecure(resolver, name, value));
}
@@ -684,7 +988,7 @@ configure_order(dns_order_t *order, const cfg_obj_t *ent) {
isc_buffer_add(&b, strlen(str));
dns_fixedname_init(&fixed);
result = dns_name_fromtext(dns_fixedname_name(&fixed), &b,
- dns_rootname, ISC_FALSE, NULL);
+ dns_rootname, 0, NULL);
if (result != ISC_R_SUCCESS)
return (result);
@@ -868,7 +1172,7 @@ disable_algorithms(const cfg_obj_t *disabled, dns_resolver_t *resolver) {
str = cfg_obj_asstring(cfg_tuple_get(disabled, "name"));
isc_buffer_init(&b, str, strlen(str));
isc_buffer_add(&b, strlen(str));
- CHECK(dns_name_fromtext(name, &b, dns_rootname, ISC_FALSE, NULL));
+ CHECK(dns_name_fromtext(name, &b, dns_rootname, 0, NULL));
algorithms = cfg_tuple_get(disabled, "algorithms");
for (element = cfg_list_first(algorithms);
@@ -921,7 +1225,7 @@ on_disable_list(const cfg_obj_t *disablelist, dns_name_t *zonename) {
isc_buffer_init(&b, str, strlen(str));
isc_buffer_add(&b, strlen(str));
result = dns_name_fromtext(name, &b, dns_rootname,
- ISC_TRUE, NULL);
+ 0, NULL);
RUNTIME_CHECK(result == ISC_R_SUCCESS);
if (dns_name_equal(name, zonename))
return (ISC_TRUE);
@@ -979,6 +1283,20 @@ setquerystats(dns_zone_t *zone, isc_mem_t *mctx, isc_boolean_t on) {
return (ISC_R_SUCCESS);
}
+static ns_cache_t *
+cachelist_find(ns_cachelist_t *cachelist, const char *cachename) {
+ ns_cache_t *nsc;
+
+ for (nsc = ISC_LIST_HEAD(*cachelist);
+ nsc != NULL;
+ nsc = ISC_LIST_NEXT(nsc, link)) {
+ if (strcmp(dns_cache_getname(nsc->cache), cachename) == 0)
+ return (nsc);
+ }
+
+ return (NULL);
+}
+
static isc_boolean_t
cache_reusable(dns_view_t *originview, dns_view_t *view,
isc_boolean_t new_zero_no_soattl)
@@ -996,6 +1314,238 @@ cache_reusable(dns_view_t *originview, dns_view_t *view,
return (ISC_TRUE);
}
+static isc_boolean_t
+cache_sharable(dns_view_t *originview, dns_view_t *view,
+ isc_boolean_t new_zero_no_soattl,
+ unsigned int new_cleaning_interval,
+ isc_uint32_t new_max_cache_size)
+{
+ /*
+ * If the cache cannot even reused for the same view, it cannot be
+ * shared with other views.
+ */
+ if (!cache_reusable(originview, view, new_zero_no_soattl))
+ return (ISC_FALSE);
+
+ /*
+ * Check other cache related parameters that must be consistent among
+ * the sharing views.
+ */
+ if (dns_cache_getcleaninginterval(originview->cache) !=
+ new_cleaning_interval ||
+ dns_cache_getcachesize(originview->cache) != new_max_cache_size) {
+ return (ISC_FALSE);
+ }
+
+ return (ISC_TRUE);
+}
+
+#ifdef DLZ
+/*
+ * Callback from DLZ configure when the driver sets up a writeable zone
+ */
+static isc_result_t
+dlzconfigure_callback(dns_view_t *view, dns_zone_t *zone) {
+ dns_name_t *origin = dns_zone_getorigin(zone);
+ dns_rdataclass_t zclass = view->rdclass;
+ isc_result_t result;
+
+ result = dns_zonemgr_managezone(ns_g_server->zonemgr, zone);
+ if (result != ISC_R_SUCCESS)
+ return result;
+ dns_zone_setstats(zone, ns_g_server->zonestats);
+
+ return ns_zone_configure_writeable_dlz(view->dlzdatabase,
+ zone, zclass, origin);
+}
+#endif
+
+static isc_result_t
+dns64_reverse(dns_view_t *view, isc_mem_t *mctx, isc_netaddr_t *na,
+ unsigned int prefixlen, const char *server,
+ const char *contact)
+{
+ char *cp;
+ char reverse[48+sizeof("ip6.arpa.")];
+ const char *dns64_dbtype[4] = { "_builtin", "dns64", ".", "." };
+ const char *sep = ": view ";
+ const char *viewname = view->name;
+ const unsigned char *s6;
+ dns_fixedname_t fixed;
+ dns_name_t *name;
+ dns_zone_t *zone = NULL;
+ int dns64_dbtypec = 4;
+ isc_buffer_t b;
+ isc_result_t result;
+
+ REQUIRE(prefixlen == 32 || prefixlen == 40 || prefixlen == 48 ||
+ prefixlen == 56 || prefixlen == 64 || prefixlen == 96);
+
+ if (!strcmp(viewname, "_default")) {
+ sep = "";
+ viewname = "";
+ }
+
+ /*
+ * Construct the reverse name of the zone.
+ */
+ cp = reverse;
+ s6 = na->type.in6.s6_addr;
+ while (prefixlen > 0) {
+ prefixlen -= 8;
+ sprintf(cp, "%x.%x.", s6[prefixlen/8] & 0xf,
+ (s6[prefixlen/8] >> 4) & 0xf);
+ cp += 4;
+ }
+ strcat(cp, "ip6.arpa.");
+
+ /*
+ * Create the actual zone.
+ */
+ if (server != NULL)
+ dns64_dbtype[2] = server;
+ if (contact != NULL)
+ dns64_dbtype[3] = contact;
+ dns_fixedname_init(&fixed);
+ name = dns_fixedname_name(&fixed);
+ isc_buffer_init(&b, reverse, strlen(reverse));
+ isc_buffer_add(&b, strlen(reverse));
+ CHECK(dns_name_fromtext(name, &b, dns_rootname, 0, NULL));
+ CHECK(dns_zone_create(&zone, mctx));
+ CHECK(dns_zone_setorigin(zone, name));
+ dns_zone_setview(zone, view);
+ CHECK(dns_zonemgr_managezone(ns_g_server->zonemgr, zone));
+ dns_zone_setclass(zone, view->rdclass);
+ dns_zone_settype(zone, dns_zone_master);
+ dns_zone_setstats(zone, ns_g_server->zonestats);
+ CHECK(dns_zone_setdbtype(zone, dns64_dbtypec, dns64_dbtype));
+ if (view->queryacl != NULL)
+ dns_zone_setqueryacl(zone, view->queryacl);
+ if (view->queryonacl != NULL)
+ dns_zone_setqueryonacl(zone, view->queryonacl);
+ dns_zone_setdialup(zone, dns_dialuptype_no);
+ dns_zone_setnotifytype(zone, dns_notifytype_no);
+ dns_zone_setoption(zone, DNS_ZONEOPT_NOCHECKNS, ISC_TRUE);
+ CHECK(setquerystats(zone, mctx, ISC_FALSE)); /* XXXMPA */
+ CHECK(dns_view_addzone(view, zone));
+ isc_log_write(ns_g_lctx, NS_LOGCATEGORY_GENERAL, NS_LOGMODULE_SERVER,
+ ISC_LOG_INFO, "dns64 reverse zone%s%s: %s", sep,
+ viewname, reverse);
+
+cleanup:
+ if (zone != NULL)
+ dns_zone_detach(&zone);
+ return (result);
+}
+
+static isc_result_t
+configure_rpz(dns_view_t *view, const cfg_listelt_t *element) {
+ const cfg_obj_t *rpz_obj, *policy_obj;
+ const char *str;
+ dns_fixedname_t fixed;
+ dns_name_t *origin;
+ dns_rpz_zone_t *old, *new;
+ dns_zone_t *zone = NULL;
+ isc_result_t result;
+ unsigned int l1, l2;
+
+ new = isc_mem_get(view->mctx, sizeof(*new));
+ if (new == NULL) {
+ result = ISC_R_NOMEMORY;
+ goto cleanup;
+ }
+
+ memset(new, 0, sizeof(*new));
+ dns_name_init(&new->nsdname, NULL);
+ dns_name_init(&new->origin, NULL);
+ dns_name_init(&new->cname, NULL);
+ ISC_LIST_INITANDAPPEND(view->rpz_zones, new, link);
+
+ rpz_obj = cfg_listelt_value(element);
+ policy_obj = cfg_tuple_get(rpz_obj, "policy");
+ if (cfg_obj_isvoid(policy_obj)) {
+ new->policy = DNS_RPZ_POLICY_GIVEN;
+ } else {
+ str = cfg_obj_asstring(policy_obj);
+ new->policy = dns_rpz_str2policy(str);
+ INSIST(new->policy != DNS_RPZ_POLICY_ERROR);
+ }
+
+ dns_fixedname_init(&fixed);
+ origin = dns_fixedname_name(&fixed);
+ str = cfg_obj_asstring(cfg_tuple_get(rpz_obj, "name"));
+ result = dns_name_fromstring(origin, str, DNS_NAME_DOWNCASE, NULL);
+ if (result != ISC_R_SUCCESS) {
+ cfg_obj_log(rpz_obj, ns_g_lctx, DNS_RPZ_ERROR_LEVEL,
+ "invalid zone '%s'", str);
+ goto cleanup;
+ }
+
+ result = dns_name_fromstring2(&new->nsdname, DNS_RPZ_NSDNAME_ZONE,
+ origin, DNS_NAME_DOWNCASE, view->mctx);
+ if (result != ISC_R_SUCCESS) {
+ cfg_obj_log(rpz_obj, ns_g_lctx, DNS_RPZ_ERROR_LEVEL,
+ "invalid zone '%s'", str);
+ goto cleanup;
+ }
+
+ /*
+ * The origin is part of 'nsdname' so we don't need to keep it
+ * seperately.
+ */
+ l1 = dns_name_countlabels(&new->nsdname);
+ l2 = dns_name_countlabels(origin);
+ dns_name_getlabelsequence(&new->nsdname, l1 - l2, l2, &new->origin);
+
+ /*
+ * Are we configured to with the reponse policy zone?
+ */
+ result = dns_view_findzone(view, &new->origin, &zone);
+ if (result != ISC_R_SUCCESS) {
+ cfg_obj_log(rpz_obj, ns_g_lctx, DNS_RPZ_ERROR_LEVEL,
+ "unknown zone '%s'", str);
+ goto cleanup;
+ }
+
+ if (dns_zone_gettype(zone) != dns_zone_master &&
+ dns_zone_gettype(zone) != dns_zone_slave) {
+ cfg_obj_log(rpz_obj, ns_g_lctx, DNS_RPZ_ERROR_LEVEL,
+ "zone '%s' is neither master nor slave", str);
+ dns_zone_detach(&zone);
+ result = DNS_R_NOTMASTER;
+ goto cleanup;
+ }
+ dns_zone_detach(&zone);
+
+ for (old = ISC_LIST_HEAD(view->rpz_zones);
+ old != new;
+ old = ISC_LIST_NEXT(old, link)) {
+ ++new->num;
+ if (dns_name_equal(&old->origin, &new->origin)) {
+ cfg_obj_log(rpz_obj, ns_g_lctx, DNS_RPZ_ERROR_LEVEL,
+ "duplicate '%s'", str);
+ result = DNS_R_DUPLICATE;
+ goto cleanup;
+ }
+ }
+
+ if (new->policy == DNS_RPZ_POLICY_CNAME) {
+ str = cfg_obj_asstring(cfg_tuple_get(rpz_obj, "cname"));
+ result = dns_name_fromstring(&new->cname, str, 0, view->mctx);
+ if (result != ISC_R_SUCCESS) {
+ cfg_obj_log(rpz_obj, ns_g_lctx, DNS_RPZ_ERROR_LEVEL,
+ "invalid cname '%s'", str);
+ goto cleanup;
+ }
+ }
+
+ return (ISC_R_SUCCESS);
+
+ cleanup:
+ dns_rpz_view_destroy(view);
+ return (result);
+}
+
/*
* Configure 'view' according to 'vconfig', taking defaults from 'config'
* where values are missing in 'vconfig'.
@@ -1004,12 +1554,15 @@ cache_reusable(dns_view_t *originview, dns_view_t *view,
* global defaults in 'config' used exclusively.
*/
static isc_result_t
-configure_view(dns_view_t *view, const cfg_obj_t *config,
- const cfg_obj_t *vconfig, isc_mem_t *mctx,
- cfg_aclconfctx_t *actx, isc_boolean_t need_hints)
+configure_view(dns_view_t *view, cfg_parser_t* parser,
+ cfg_obj_t *config, cfg_obj_t *vconfig,
+ ns_cachelist_t *cachelist, const cfg_obj_t *bindkeys,
+ isc_mem_t *mctx, cfg_aclconfctx_t *actx,
+ isc_boolean_t need_hints)
{
const cfg_obj_t *maps[4];
const cfg_obj_t *cfgmaps[3];
+ const cfg_obj_t *optionmaps[3];
const cfg_obj_t *options = NULL;
const cfg_obj_t *voptions = NULL;
const cfg_obj_t *forwardtype;
@@ -1028,17 +1581,20 @@ configure_view(dns_view_t *view, const cfg_obj_t *config,
dns_cache_t *cache = NULL;
isc_result_t result;
isc_uint32_t max_adb_size;
+ unsigned int cleaning_interval;
isc_uint32_t max_cache_size;
isc_uint32_t max_acache_size;
isc_uint32_t lame_ttl;
- dns_tsig_keyring_t *ring;
+ dns_tsig_keyring_t *ring = NULL;
dns_view_t *pview = NULL; /* Production view */
isc_mem_t *cmctx;
dns_dispatch_t *dispatch4 = NULL;
dns_dispatch_t *dispatch6 = NULL;
isc_boolean_t reused_cache = ISC_FALSE;
- int i;
+ isc_boolean_t shared_cache = ISC_FALSE;
+ int i = 0, j = 0, k = 0;
const char *str;
+ const char *cachename = NULL;
dns_order_t *order = NULL;
isc_uint32_t udpsize;
unsigned int resopts = 0;
@@ -1052,7 +1608,14 @@ configure_view(dns_view_t *view, const cfg_obj_t *config,
const cfg_obj_t *disablelist = NULL;
isc_stats_t *resstats = NULL;
dns_stats_t *resquerystats = NULL;
+ isc_boolean_t auto_dlv = ISC_FALSE;
+ isc_boolean_t auto_root = ISC_FALSE;
+ ns_cache_t *nsc;
isc_boolean_t zero_no_soattl;
+ cfg_parser_t *newzones_parser = NULL;
+ cfg_obj_t *nzfconf = NULL;
+ dns_acl_t *clients = NULL, *mapped = NULL, *excluded = NULL;
+ unsigned int query_timeout;
REQUIRE(DNS_VIEW_VALID(view));
@@ -1061,22 +1624,28 @@ configure_view(dns_view_t *view, const cfg_obj_t *config,
if (config != NULL)
(void)cfg_map_get(config, "options", &options);
- i = 0;
+ /*
+ * maps: view options, options, defaults
+ * cfgmaps: view options, config
+ * optionmaps: view options, options
+ */
if (vconfig != NULL) {
voptions = cfg_tuple_get(vconfig, "options");
maps[i++] = voptions;
+ optionmaps[j++] = voptions;
+ cfgmaps[k++] = voptions;
}
- if (options != NULL)
+ if (options != NULL) {
maps[i++] = options;
+ optionmaps[j++] = options;
+ }
+
maps[i++] = ns_g_defaults;
maps[i] = NULL;
-
- i = 0;
- if (voptions != NULL)
- cfgmaps[i++] = voptions;
+ optionmaps[j] = NULL;
if (config != NULL)
- cfgmaps[i++] = config;
- cfgmaps[i] = NULL;
+ cfgmaps[k++] = config;
+ cfgmaps[k] = NULL;
if (!strcmp(viewname, "_default")) {
sep = "";
@@ -1137,12 +1706,12 @@ configure_view(dns_view_t *view, const cfg_obj_t *config,
dns_acache_setcachesize(view->acache, max_acache_size);
}
- CHECK(configure_view_acl(vconfig, config, "allow-query", actx,
+ CHECK(configure_view_acl(vconfig, config, "allow-query", NULL, actx,
ns_g_mctx, &view->queryacl));
-
if (view->queryacl == NULL) {
- CHECK(configure_view_acl(NULL, ns_g_config, "allow-query", actx,
- ns_g_mctx, &view->queryacl));
+ CHECK(configure_view_acl(NULL, ns_g_config, "allow-query",
+ NULL, actx, ns_g_mctx,
+ &view->queryacl));
}
/*
@@ -1159,7 +1728,62 @@ configure_view(dns_view_t *view, const cfg_obj_t *config,
{
const cfg_obj_t *zconfig = cfg_listelt_value(element);
CHECK(configure_zone(config, zconfig, vconfig, mctx, view,
- actx));
+ actx, ISC_FALSE));
+ }
+
+ /*
+ * Are we allowing zones to be added and deleted dynamically?
+ */
+ obj = NULL;
+ result = ns_config_get(maps, "allow-new-zones", &obj);
+ if (result == ISC_R_SUCCESS) {
+ isc_boolean_t allow = cfg_obj_asboolean(obj);
+ struct cfg_context *cfg = NULL;
+ if (allow) {
+ cfg = isc_mem_get(view->mctx, sizeof(*cfg));
+ if (cfg == NULL) {
+ result = ISC_R_NOMEMORY;
+ goto cleanup;
+ }
+ memset(cfg, 0, sizeof(*cfg));
+ isc_mem_attach(view->mctx, &cfg->mctx);
+ if (config != NULL)
+ cfg_obj_attach(config, &cfg->config);
+ cfg_parser_attach(parser, &cfg->parser);
+ cfg_aclconfctx_clone(actx, &cfg->actx);
+ }
+ dns_view_setnewzones(view, allow, cfg, cfgctx_destroy);
+ }
+
+ /*
+ * If we're allowing added zones, then load zone configuration
+ * from the newzone file for zones that were added during previous
+ * runs.
+ */
+ if (view->new_zone_file != NULL) {
+ isc_log_write(ns_g_lctx, NS_LOGCATEGORY_GENERAL,
+ NS_LOGMODULE_SERVER, ISC_LOG_INFO,
+ "loading additional zones for view '%s'",
+ view->name);
+
+ CHECK(cfg_parser_create(view->mctx, ns_g_lctx,
+ &newzones_parser));
+ result = cfg_parse_file(newzones_parser, view->new_zone_file,
+ &cfg_type_newzones, &nzfconf);
+ if (result == ISC_R_SUCCESS) {
+ zonelist = NULL;
+ cfg_map_get(nzfconf, "zone", &zonelist);
+ for (element = cfg_list_first(zonelist);
+ element != NULL;
+ element = cfg_list_next(element))
+ {
+ const cfg_obj_t *zconfig =
+ cfg_listelt_value(element);
+ CHECK(configure_zone(config, zconfig, vconfig,
+ mctx, view, actx,
+ ISC_TRUE));
+ }
+ }
}
#ifdef DLZ
@@ -1197,6 +1821,14 @@ configure_view(dns_view_t *view, const cfg_obj_t *config,
isc_mem_put(mctx, dlzargv, dlzargc * sizeof(*dlzargv));
if (result != ISC_R_SUCCESS)
goto cleanup;
+
+ /*
+ * If the dlz backend supports configuration,
+ * then call its configure method now.
+ */
+ result = dns_dlzconfigure(view, dlzconfigure_callback);
+ if (result != ISC_R_SUCCESS)
+ goto cleanup;
}
}
#endif
@@ -1205,6 +1837,32 @@ configure_view(dns_view_t *view, const cfg_obj_t *config,
* Obtain configuration parameters that affect the decision of whether
* we can reuse/share an existing cache.
*/
+ obj = NULL;
+ result = ns_config_get(maps, "cleaning-interval", &obj);
+ INSIST(result == ISC_R_SUCCESS);
+ cleaning_interval = cfg_obj_asuint32(obj) * 60;
+
+ obj = NULL;
+ result = ns_config_get(maps, "max-cache-size", &obj);
+ INSIST(result == ISC_R_SUCCESS);
+ if (cfg_obj_isstring(obj)) {
+ str = cfg_obj_asstring(obj);
+ INSIST(strcasecmp(str, "unlimited") == 0);
+ max_cache_size = ISC_UINT32_MAX;
+ } else {
+ isc_resourcevalue_t value;
+ value = cfg_obj_asuint64(obj);
+ if (value > ISC_UINT32_MAX) {
+ cfg_obj_log(obj, ns_g_lctx, ISC_LOG_ERROR,
+ "'max-cache-size "
+ "%" ISC_PRINT_QUADFORMAT "d' is too large",
+ value);
+ result = ISC_R_RANGE;
+ goto cleanup;
+ }
+ max_cache_size = (isc_uint32_t)value;
+ }
+
/* Check-names. */
obj = NULL;
result = ns_checknames_get(maps, "response", &obj);
@@ -1229,6 +1887,109 @@ configure_view(dns_view_t *view, const cfg_obj_t *config,
zero_no_soattl = cfg_obj_asboolean(obj);
obj = NULL;
+ result = ns_config_get(maps, "dns64", &obj);
+ if (result == ISC_R_SUCCESS && strcmp(view->name, "_bind") &&
+ strcmp(view->name, "_meta")) {
+ const cfg_listelt_t *element;
+ isc_netaddr_t na, suffix, *sp;
+ unsigned int prefixlen;
+ const char *server, *contact;
+ const cfg_obj_t *myobj;
+
+ myobj = NULL;
+ result = ns_config_get(maps, "dns64-server", &myobj);
+ if (result == ISC_R_SUCCESS)
+ server = cfg_obj_asstring(myobj);
+ else
+ server = NULL;
+
+ myobj = NULL;
+ result = ns_config_get(maps, "dns64-contact", &myobj);
+ if (result == ISC_R_SUCCESS)
+ contact = cfg_obj_asstring(myobj);
+ else
+ contact = NULL;
+
+ for (element = cfg_list_first(obj);
+ element != NULL;
+ element = cfg_list_next(element))
+ {
+ const cfg_obj_t *map = cfg_listelt_value(element);
+ dns_dns64_t *dns64 = NULL;
+ unsigned int dns64options = 0;
+
+ cfg_obj_asnetprefix(cfg_map_getname(map), &na,
+ &prefixlen);
+
+ obj = NULL;
+ (void)cfg_map_get(map, "suffix", &obj);
+ if (obj != NULL) {
+ sp = &suffix;
+ isc_netaddr_fromsockaddr(sp,
+ cfg_obj_assockaddr(obj));
+ } else
+ sp = NULL;
+
+ clients = mapped = excluded = NULL;
+ obj = NULL;
+ (void)cfg_map_get(map, "clients", &obj);
+ if (obj != NULL) {
+ result = cfg_acl_fromconfig(obj, config,
+ ns_g_lctx, actx,
+ mctx, 0, &clients);
+ if (result != ISC_R_SUCCESS)
+ goto cleanup;
+ }
+ obj = NULL;
+ (void)cfg_map_get(map, "mapped", &obj);
+ if (obj != NULL) {
+ result = cfg_acl_fromconfig(obj, config,
+ ns_g_lctx, actx,
+ mctx, 0, &mapped);
+ if (result != ISC_R_SUCCESS)
+ goto cleanup;
+ }
+ obj = NULL;
+ (void)cfg_map_get(map, "exclude", &obj);
+ if (obj != NULL) {
+ result = cfg_acl_fromconfig(obj, config,
+ ns_g_lctx, actx,
+ mctx, 0, &excluded);
+ if (result != ISC_R_SUCCESS)
+ goto cleanup;
+ }
+
+ obj = NULL;
+ (void)cfg_map_get(map, "recursive-only", &obj);
+ if (obj != NULL && cfg_obj_asboolean(obj))
+ dns64options |= DNS_DNS64_RECURSIVE_ONLY;
+
+ obj = NULL;
+ (void)cfg_map_get(map, "break-dnssec", &obj);
+ if (obj != NULL && cfg_obj_asboolean(obj))
+ dns64options |= DNS_DNS64_BREAK_DNSSEC;
+
+ result = dns_dns64_create(mctx, &na, prefixlen, sp,
+ clients, mapped, excluded,
+ dns64options, &dns64);
+ if (result != ISC_R_SUCCESS)
+ goto cleanup;
+ dns_dns64_append(&view->dns64, dns64);
+ view->dns64cnt++;
+ result = dns64_reverse(view, mctx, &na, prefixlen,
+ server, contact);
+ if (result != ISC_R_SUCCESS)
+ goto cleanup;
+ if (clients != NULL)
+ dns_acl_detach(&clients);
+ if (mapped != NULL)
+ dns_acl_detach(&mapped);
+ if (excluded != NULL)
+ dns_acl_detach(&excluded);
+ }
+ }
+
+ obj = NULL;
result = ns_config_get(maps, "dnssec-accept-expired", &obj);
INSIST(result == ISC_R_SUCCESS);
view->acceptexpired = cfg_obj_asboolean(obj);
@@ -1236,7 +1997,13 @@ configure_view(dns_view_t *view, const cfg_obj_t *config,
obj = NULL;
result = ns_config_get(maps, "dnssec-validation", &obj);
INSIST(result == ISC_R_SUCCESS);
- view->enablevalidation = cfg_obj_asboolean(obj);
+ if (cfg_obj_isboolean(obj)) {
+ view->enablevalidation = cfg_obj_asboolean(obj);
+ } else {
+ /* If dnssec-validation is not boolean, it must be "auto" */
+ view->enablevalidation = ISC_TRUE;
+ auto_root = ISC_TRUE;
+ }
obj = NULL;
result = ns_config_get(maps, "max-cache-ttl", &obj);
@@ -1251,53 +2018,113 @@ configure_view(dns_view_t *view, const cfg_obj_t *config,
view->maxncachettl = 7 * 24 * 3600;
/*
- * Configure the view's cache. Try to reuse an existing
- * cache if possible, otherwise create a new cache.
- * Note that the ADB is not preserved in either case.
- * When a matching view is found, the associated statistics are
- * also retrieved and reused.
+ * Configure the view's cache.
+ *
+ * First, check to see if there are any attach-cache options. If yes,
+ * attempt to lookup an existing cache at attach it to the view. If
+ * there is not one, then try to reuse an existing cache if possible;
+ * otherwise create a new cache.
*
- * XXX Determining when it is safe to reuse a cache is tricky.
+ * Note that the ADB is not preserved or shared in either case.
+ *
+ * When a matching view is found, the associated statistics are also
+ * retrieved and reused.
+ *
+ * XXX Determining when it is safe to reuse or share a cache is tricky.
* When the view's configuration changes, the cached data may become
* invalid because it reflects our old view of the world. We check
- * some of the configuration parameters that could invalidate the cache,
- * but there are other configuration options that should be checked.
- * For example, if a view uses a forwarder, changes in the forwarder
- * configuration may invalidate the cache. At the moment, it's the
- * administrator's responsibility to ensure these configuration options
- * don't invalidate reusing.
+ * some of the configuration parameters that could invalidate the cache
+ * or otherwise make it unsharable, but there are other configuration
+ * options that should be checked. For example, if a view uses a
+ * forwarder, changes in the forwarder configuration may invalidate
+ * the cache. At the moment, it's the administrator's responsibility to
+ * ensure these configuration options don't invalidate reusing/sharing.
*/
- result = dns_viewlist_find(&ns_g_server->viewlist,
- view->name, view->rdclass,
- &pview);
- if (result != ISC_R_NOTFOUND && result != ISC_R_SUCCESS)
- goto cleanup;
- if (pview != NULL) {
- if (cache_reusable(pview, view, zero_no_soattl)) {
- INSIST(pview->cache != NULL);
- isc_log_write(ns_g_lctx, NS_LOGCATEGORY_GENERAL,
- NS_LOGMODULE_SERVER, ISC_LOG_DEBUG(3),
- "reusing existing cache");
- reused_cache = ISC_TRUE;
- dns_cache_attach(pview->cache, &cache);
- } else {
+ obj = NULL;
+ result = ns_config_get(maps, "attach-cache", &obj);
+ if (result == ISC_R_SUCCESS)
+ cachename = cfg_obj_asstring(obj);
+ else
+ cachename = view->name;
+ cache = NULL;
+ nsc = cachelist_find(cachelist, cachename);
+ if (nsc != NULL) {
+ if (!cache_sharable(nsc->primaryview, view, zero_no_soattl,
+ cleaning_interval, max_cache_size)) {
isc_log_write(ns_g_lctx, NS_LOGCATEGORY_GENERAL,
- NS_LOGMODULE_SERVER, ISC_LOG_DEBUG(1),
- "cache cannot be reused for view %s "
+ NS_LOGMODULE_SERVER, ISC_LOG_ERROR,
+ "views %s and %s can't share the cache "
"due to configuration parameter mismatch",
- view->name);
+ nsc->primaryview->name, view->name);
+ result = ISC_R_FAILURE;
+ goto cleanup;
}
- dns_view_getresstats(pview, &resstats);
- dns_view_getresquerystats(pview, &resquerystats);
- dns_view_detach(&pview);
- }
- if (cache == NULL) {
- CHECK(isc_mem_create(0, 0, &cmctx));
- CHECK(dns_cache_create(cmctx, ns_g_taskmgr, ns_g_timermgr,
- view->rdclass, "rbt", 0, NULL, &cache));
- isc_mem_setname(cmctx, "cache", NULL);
+ dns_cache_attach(nsc->cache, &cache);
+ shared_cache = ISC_TRUE;
+ } else {
+ if (strcmp(cachename, view->name) == 0) {
+ result = dns_viewlist_find(&ns_g_server->viewlist,
+ cachename, view->rdclass,
+ &pview);
+ if (result != ISC_R_NOTFOUND && result != ISC_R_SUCCESS)
+ goto cleanup;
+ if (pview != NULL) {
+ if (!cache_reusable(pview, view,
+ zero_no_soattl)) {
+ isc_log_write(ns_g_lctx,
+ NS_LOGCATEGORY_GENERAL,
+ NS_LOGMODULE_SERVER,
+ ISC_LOG_DEBUG(1),
+ "cache cannot be reused "
+ "for view %s due to "
+ "configuration parameter "
+ "mismatch", view->name);
+ } else {
+ INSIST(pview->cache != NULL);
+ isc_log_write(ns_g_lctx,
+ NS_LOGCATEGORY_GENERAL,
+ NS_LOGMODULE_SERVER,
+ ISC_LOG_DEBUG(3),
+ "reusing existing cache");
+ reused_cache = ISC_TRUE;
+ dns_cache_attach(pview->cache, &cache);
+ }
+ dns_view_getresstats(pview, &resstats);
+ dns_view_getresquerystats(pview,
+ &resquerystats);
+ dns_view_detach(&pview);
+ }
+ }
+ if (cache == NULL) {
+ /*
+ * Create a cache with the desired name. This normally
+ * equals the view name, but may also be a forward
+ * reference to a view that share the cache with this
+ * view but is not yet configured. If it is not the
+ * view name but not a forward reference either, then it
+ * is simply a named cache that is not shared.
+ */
+ CHECK(isc_mem_create(0, 0, &cmctx));
+ isc_mem_setname(cmctx, "cache", NULL);
+ CHECK(dns_cache_create2(cmctx, ns_g_taskmgr,
+ ns_g_timermgr, view->rdclass,
+ cachename, "rbt", 0, NULL,
+ &cache));
+ }
+ nsc = isc_mem_get(mctx, sizeof(*nsc));
+ if (nsc == NULL) {
+ result = ISC_R_NOMEMORY;
+ goto cleanup;
+ }
+ nsc->cache = NULL;
+ dns_cache_attach(cache, &nsc->cache);
+ nsc->primaryview = view;
+ nsc->needflush = ISC_FALSE;
+ nsc->adbsizeadjusted = ISC_FALSE;
+ ISC_LINK_INIT(nsc, link);
+ ISC_LIST_APPEND(*cachelist, nsc, link);
}
- dns_view_setcache(view, cache);
+ dns_view_setcache2(view, cache, shared_cache);
/*
* cache-file cannot be inherited if views are present, but this
@@ -1307,35 +2134,11 @@ configure_view(dns_view_t *view, const cfg_obj_t *config,
result = ns_config_get(maps, "cache-file", &obj);
if (result == ISC_R_SUCCESS && strcmp(view->name, "_bind") != 0) {
CHECK(dns_cache_setfilename(cache, cfg_obj_asstring(obj)));
- if (!reused_cache)
+ if (!reused_cache && !shared_cache)
CHECK(dns_cache_load(cache));
}
- obj = NULL;
- result = ns_config_get(maps, "cleaning-interval", &obj);
- INSIST(result == ISC_R_SUCCESS);
- dns_cache_setcleaninginterval(cache, cfg_obj_asuint32(obj) * 60);
-
- obj = NULL;
- result = ns_config_get(maps, "max-cache-size", &obj);
- INSIST(result == ISC_R_SUCCESS);
- if (cfg_obj_isstring(obj)) {
- str = cfg_obj_asstring(obj);
- INSIST(strcasecmp(str, "unlimited") == 0);
- max_cache_size = ISC_UINT32_MAX;
- } else {
- isc_resourcevalue_t value;
- value = cfg_obj_asuint64(obj);
- if (value > ISC_UINT32_MAX) {
- cfg_obj_log(obj, ns_g_lctx, ISC_LOG_ERROR,
- "'max-cache-size "
- "%" ISC_PRINT_QUADFORMAT "d' is too large",
- value);
- result = ISC_R_RANGE;
- goto cleanup;
- }
- max_cache_size = (isc_uint32_t)value;
- }
+ dns_cache_setcleaninginterval(cache, cleaning_interval);
dns_cache_setcachesize(cache, max_cache_size);
dns_cache_detach(&cache);
@@ -1373,13 +2176,23 @@ configure_view(dns_view_t *view, const cfg_obj_t *config,
dns_view_setresquerystats(view, resquerystats);
/*
- * Set the ADB cache size to 1/8th of the max-cache-size.
+ * Set the ADB cache size to 1/8th of the max-cache-size or
+ * MAX_ADB_SIZE_FOR_CACHESHARE when the cache is shared.
*/
max_adb_size = 0;
if (max_cache_size != 0) {
max_adb_size = max_cache_size / 8;
if (max_adb_size == 0)
max_adb_size = 1; /* Force minimum. */
+ if (view != nsc->primaryview &&
+ max_adb_size > MAX_ADB_SIZE_FOR_CACHESHARE) {
+ max_adb_size = MAX_ADB_SIZE_FOR_CACHESHARE;
+ if (!nsc->adbsizeadjusted) {
+ dns_adb_setadbsize(nsc->primaryview->adb,
+ MAX_ADB_SIZE_FOR_CACHESHARE);
+ nsc->adbsizeadjusted = ISC_TRUE;
+ }
+ }
}
dns_adb_setadbsize(view->adb, max_adb_size);
@@ -1395,6 +2208,18 @@ configure_view(dns_view_t *view, const cfg_obj_t *config,
dns_resolver_setlamettl(view->resolver, lame_ttl);
/*
+ * Set the resolver's query timeout.
+ */
+ obj = NULL;
+ result = ns_config_get(maps, "resolver-query-timeout", &obj);
+ INSIST(result == ISC_R_SUCCESS);
+ query_timeout = cfg_obj_asuint32(obj);
+ dns_resolver_settimeout(view->resolver, query_timeout);
+
+ /* Specify whether to use 0-TTL for negative response for SOA query */
+ dns_resolver_setzeronosoattl(view->resolver, zero_no_soattl);
+
+ /*
* Set the resolver's EDNS UDP size.
*/
obj = NULL;
@@ -1484,9 +2309,29 @@ configure_view(dns_view_t *view, const cfg_obj_t *config,
/*
* Configure the view's TSIG keys.
*/
- ring = NULL;
CHECK(ns_tsigkeyring_fromconfig(config, vconfig, view->mctx, &ring));
+ if (ns_g_server->sessionkey != NULL) {
+ CHECK(dns_tsigkeyring_add(ring, ns_g_server->session_keyname,
+ ns_g_server->sessionkey));
+ }
dns_view_setkeyring(view, ring);
+ dns_tsigkeyring_detach(&ring);
+
+ /*
+ * See if we can re-use a dynamic key ring.
+ */
+ result = dns_viewlist_find(&ns_g_server->viewlist, view->name,
+ view->rdclass, &pview);
+ if (result != ISC_R_NOTFOUND && result != ISC_R_SUCCESS)
+ goto cleanup;
+ if (pview != NULL) {
+ dns_view_getdynamickeyring(pview, &ring);
+ if (ring != NULL)
+ dns_view_setdynamickeyring(view, ring);
+ dns_tsigkeyring_detach(&ring);
+ dns_view_detach(&pview);
+ } else
+ dns_view_restorekeyring(view);
/*
* Configure the view's peer list.
@@ -1543,10 +2388,10 @@ configure_view(dns_view_t *view, const cfg_obj_t *config,
/*
* Configure the "match-clients" and "match-destinations" ACL.
*/
- CHECK(configure_view_acl(vconfig, config, "match-clients", actx,
+ CHECK(configure_view_acl(vconfig, config, "match-clients", NULL, actx,
ns_g_mctx, &view->matchclients));
- CHECK(configure_view_acl(vconfig, config, "match-destinations", actx,
- ns_g_mctx, &view->matchdestinations));
+ CHECK(configure_view_acl(vconfig, config, "match-destinations", NULL,
+ actx, ns_g_mctx, &view->matchdestinations));
/*
* Configure the "match-recursive-only" option.
@@ -1618,20 +2463,20 @@ configure_view(dns_view_t *view, const cfg_obj_t *config,
* "allow-recursion", and "allow-recursion-on" acls if
* configured in named.conf.
*/
- CHECK(configure_view_acl(vconfig, config, "allow-query-cache",
+ CHECK(configure_view_acl(vconfig, config, "allow-query-cache", NULL,
actx, ns_g_mctx, &view->cacheacl));
- CHECK(configure_view_acl(vconfig, config, "allow-query-cache-on",
+ CHECK(configure_view_acl(vconfig, config, "allow-query-cache-on", NULL,
actx, ns_g_mctx, &view->cacheonacl));
if (view->cacheonacl == NULL)
CHECK(configure_view_acl(NULL, ns_g_config,
- "allow-query-cache-on", actx,
+ "allow-query-cache-on", NULL, actx,
ns_g_mctx, &view->cacheonacl));
if (strcmp(view->name, "_bind") != 0) {
CHECK(configure_view_acl(vconfig, config, "allow-recursion",
- actx, ns_g_mctx,
+ NULL, actx, ns_g_mctx,
&view->recursionacl));
CHECK(configure_view_acl(vconfig, config, "allow-recursion-on",
- actx, ns_g_mctx,
+ NULL, actx, ns_g_mctx,
&view->recursiononacl));
}
@@ -1643,8 +2488,14 @@ configure_view(dns_view_t *view, const cfg_obj_t *config,
*/
if (view->cacheacl == NULL && view->recursionacl != NULL)
dns_acl_attach(view->recursionacl, &view->cacheacl);
+ /*
+ * XXXEACH: This call to configure_view_acl() is redundant. We
+ * are leaving it as it is because we are making a minimal change
+ * for a patch release. In the future this should be changed to
+ * dns_acl_attach(view->queryacl, &view->cacheacl).
+ */
if (view->cacheacl == NULL && view->recursion)
- CHECK(configure_view_acl(vconfig, config, "allow-query",
+ CHECK(configure_view_acl(vconfig, config, "allow-query", NULL,
actx, ns_g_mctx, &view->cacheacl));
if (view->recursion &&
view->recursionacl == NULL && view->cacheacl != NULL)
@@ -1656,24 +2507,44 @@ configure_view(dns_view_t *view, const cfg_obj_t *config,
*/
if (view->recursionacl == NULL && view->recursion)
CHECK(configure_view_acl(NULL, ns_g_config,
- "allow-recursion",
+ "allow-recursion", NULL,
actx, ns_g_mctx,
&view->recursionacl));
if (view->recursiononacl == NULL && view->recursion)
CHECK(configure_view_acl(NULL, ns_g_config,
- "allow-recursion-on",
+ "allow-recursion-on", NULL,
actx, ns_g_mctx,
&view->recursiononacl));
if (view->cacheacl == NULL) {
if (view->recursion)
CHECK(configure_view_acl(NULL, ns_g_config,
- "allow-query-cache", actx,
- ns_g_mctx, &view->cacheacl));
+ "allow-query-cache", NULL,
+ actx, ns_g_mctx,
+ &view->cacheacl));
else
- CHECK(dns_acl_none(ns_g_mctx, &view->cacheacl));
+ CHECK(dns_acl_none(mctx, &view->cacheacl));
}
/*
+ * Filter setting on addresses in the answer section.
+ */
+ CHECK(configure_view_acl(vconfig, config, "deny-answer-addresses",
+ "acl", actx, ns_g_mctx, &view->denyansweracl));
+ CHECK(configure_view_nametable(vconfig, config, "deny-answer-addresses",
+ "except-from", ns_g_mctx,
+ &view->answeracl_exclude));
+
+ /*
+ * Filter setting on names (CNAME/DNAME targets) in the answer section.
+ */
+ CHECK(configure_view_nametable(vconfig, config, "deny-answer-aliases",
+ "name", ns_g_mctx,
+ &view->denyanswernames));
+ CHECK(configure_view_nametable(vconfig, config, "deny-answer-aliases",
+ "except-from", ns_g_mctx,
+ &view->answernames_exclude));
+
+ /*
* Configure sortlist, if set
*/
CHECK(configure_view_sortlist(vconfig, config, actx, ns_g_mctx,
@@ -1686,19 +2557,19 @@ configure_view(dns_view_t *view, const cfg_obj_t *config,
*/
if (view->notifyacl == NULL)
CHECK(configure_view_acl(NULL, ns_g_config,
- "allow-notify", actx,
+ "allow-notify", NULL, actx,
ns_g_mctx, &view->notifyacl));
if (view->transferacl == NULL)
CHECK(configure_view_acl(NULL, ns_g_config,
- "allow-transfer", actx,
+ "allow-transfer", NULL, actx,
ns_g_mctx, &view->transferacl));
if (view->updateacl == NULL)
CHECK(configure_view_acl(NULL, ns_g_config,
- "allow-update", actx,
+ "allow-update", NULL, actx,
ns_g_mctx, &view->updateacl));
if (view->upfwdacl == NULL)
CHECK(configure_view_acl(NULL, ns_g_config,
- "allow-update-forwarding", actx,
+ "allow-update-forwarding", NULL, actx,
ns_g_mctx, &view->upfwdacl));
obj = NULL;
@@ -1728,13 +2599,47 @@ configure_view(dns_view_t *view, const cfg_obj_t *config,
cfg_obj_asuint32(obj),
max_clients_per_query);
+#ifdef ALLOW_FILTER_AAAA_ON_V4
+ obj = NULL;
+ result = ns_config_get(maps, "filter-aaaa-on-v4", &obj);
+ INSIST(result == ISC_R_SUCCESS);
+ if (cfg_obj_isboolean(obj)) {
+ if (cfg_obj_asboolean(obj))
+ view->v4_aaaa = dns_v4_aaaa_filter;
+ else
+ view->v4_aaaa = dns_v4_aaaa_ok;
+ } else {
+ const char *v4_aaaastr = cfg_obj_asstring(obj);
+ if (strcasecmp(v4_aaaastr, "break-dnssec") == 0)
+ view->v4_aaaa = dns_v4_aaaa_break_dnssec;
+ else
+ INSIST(0);
+ }
+ CHECK(configure_view_acl(vconfig, config, "filter-aaaa", NULL,
+ actx, ns_g_mctx, &view->v4_aaaa_acl));
+#endif
+
obj = NULL;
result = ns_config_get(maps, "dnssec-enable", &obj);
INSIST(result == ISC_R_SUCCESS);
view->enablednssec = cfg_obj_asboolean(obj);
obj = NULL;
- result = ns_config_get(maps, "dnssec-lookaside", &obj);
+ result = ns_config_get(optionmaps, "dnssec-lookaside", &obj);
+ if (result == ISC_R_SUCCESS) {
+ /* If set to "auto", use the version from the defaults */
+ const cfg_obj_t *dlvobj;
+ dlvobj = cfg_listelt_value(cfg_list_first(obj));
+ if (!strcmp(cfg_obj_asstring(cfg_tuple_get(dlvobj, "domain")),
+ "auto") &&
+ cfg_obj_isvoid(cfg_tuple_get(dlvobj, "trust-anchor"))) {
+ auto_dlv = ISC_TRUE;
+ obj = NULL;
+ result = cfg_map_get(ns_g_defaults,
+ "dnssec-lookaside", &obj);
+ }
+ }
+
if (result == ISC_R_SUCCESS) {
for (element = cfg_list_first(obj);
element != NULL;
@@ -1745,31 +2650,13 @@ configure_view(dns_view_t *view, const cfg_obj_t *config,
dns_name_t *dlv;
obj = cfg_listelt_value(element);
-#if 0
- dns_fixedname_t fixed;
- dns_name_t *name;
-
- /*
- * When we support multiple dnssec-lookaside
- * entries this is how to find the domain to be
- * checked. XXXMPA
- */
- dns_fixedname_init(&fixed);
- name = dns_fixedname_name(&fixed);
- str = cfg_obj_asstring(cfg_tuple_get(obj,
- "domain"));
- isc_buffer_init(&b, str, strlen(str));
- isc_buffer_add(&b, strlen(str));
- CHECK(dns_name_fromtext(name, &b, dns_rootname,
- ISC_TRUE, NULL));
-#endif
str = cfg_obj_asstring(cfg_tuple_get(obj,
"trust-anchor"));
isc_buffer_init(&b, str, strlen(str));
isc_buffer_add(&b, strlen(str));
dlv = dns_fixedname_name(&view->dlv_fixed);
CHECK(dns_name_fromtext(dlv, &b, dns_rootname,
- ISC_TRUE, NULL));
+ DNS_NAME_DOWNCASE, NULL));
view->dlv = dns_fixedname_name(&view->dlv_fixed);
}
} else
@@ -1779,8 +2666,8 @@ configure_view(dns_view_t *view, const cfg_obj_t *config,
* For now, there is only one kind of trusted keys, the
* "security roots".
*/
- CHECK(configure_view_dnsseckeys(vconfig, config, mctx,
- &view->secroots));
+ CHECK(configure_view_dnsseckeys(view, vconfig, config, bindkeys,
+ auto_dlv, auto_root, mctx));
dns_resolver_resetmustbesecure(view->resolver);
obj = NULL;
result = ns_config_get(maps, "dnssec-must-be-secure", &obj);
@@ -1821,7 +2708,7 @@ configure_view(dns_view_t *view, const cfg_obj_t *config,
isc_buffer_init(&b, str, strlen(str));
isc_buffer_add(&b, strlen(str));
CHECK(dns_name_fromtext(name, &b, dns_rootname,
- ISC_FALSE, NULL));
+ 0, NULL));
CHECK(dns_view_excludedelegationonly(view,
name));
}
@@ -1874,8 +2761,8 @@ configure_view(dns_view_t *view, const cfg_obj_t *config,
str = cfg_obj_asstring(obj);
isc_buffer_init(&buffer, str, strlen(str));
isc_buffer_add(&buffer, strlen(str));
- CHECK(dns_name_fromtext(name, &buffer, dns_rootname,
- ISC_FALSE, NULL));
+ CHECK(dns_name_fromtext(name, &buffer, dns_rootname, 0,
+ NULL));
isc_buffer_init(&buffer, server, sizeof(server) - 1);
CHECK(dns_name_totext(name, ISC_FALSE, &buffer));
server[isc_buffer_usedlength(&buffer)] = 0;
@@ -1889,8 +2776,8 @@ configure_view(dns_view_t *view, const cfg_obj_t *config,
str = cfg_obj_asstring(obj);
isc_buffer_init(&buffer, str, strlen(str));
isc_buffer_add(&buffer, strlen(str));
- CHECK(dns_name_fromtext(name, &buffer, dns_rootname,
- ISC_FALSE, NULL));
+ CHECK(dns_name_fromtext(name, &buffer, dns_rootname, 0,
+ NULL));
isc_buffer_init(&buffer, contact, sizeof(contact) - 1);
CHECK(dns_name_totext(name, ISC_FALSE, &buffer));
contact[isc_buffer_usedlength(&buffer)] = 0;
@@ -1916,8 +2803,8 @@ configure_view(dns_view_t *view, const cfg_obj_t *config,
/*
* Look for zone on drop list.
*/
- CHECK(dns_name_fromtext(name, &buffer, dns_rootname,
- ISC_FALSE, NULL));
+ CHECK(dns_name_fromtext(name, &buffer, dns_rootname, 0,
+ NULL));
if (disablelist != NULL &&
on_disable_list(disablelist, name))
continue;
@@ -2012,9 +2899,40 @@ configure_view(dns_view_t *view, const cfg_obj_t *config,
}
}
+ /*
+ * Make the list of response policy zone names for views that
+ * are used for real lookups and so care about hints.
+ */
+ zonelist = NULL;
+ if (view->rdclass == dns_rdataclass_in && need_hints) {
+ obj = NULL;
+ result = ns_config_get(maps, "response-policy", &obj);
+ if (result == ISC_R_SUCCESS)
+ cfg_map_get(obj, "zone", &zonelist);
+ }
+ if (zonelist != NULL) {
+
+ for (element = cfg_list_first(zonelist);
+ element != NULL;
+ element = cfg_list_next(element)) {
+ result = configure_rpz(view, element);
+ if (result != ISC_R_SUCCESS)
+ goto cleanup;
+ dns_rpz_set_need(ISC_TRUE);
+ }
+ }
+
result = ISC_R_SUCCESS;
cleanup:
+ if (clients != NULL)
+ dns_acl_detach(&clients);
+ if (mapped != NULL)
+ dns_acl_detach(&mapped);
+ if (excluded != NULL)
+ dns_acl_detach(&excluded);
+ if (ring != NULL)
+ dns_tsigkeyring_detach(&ring);
if (zone != NULL)
dns_zone_detach(&zone);
if (dispatch4 != NULL)
@@ -2033,6 +2951,12 @@ configure_view(dns_view_t *view, const cfg_obj_t *config,
if (cache != NULL)
dns_cache_detach(&cache);
+ if (newzones_parser != NULL) {
+ if (nzfconf != NULL)
+ cfg_obj_destroy(newzones_parser, &nzfconf);
+ cfg_parser_destroy(&newzones_parser);
+ }
+
return (result);
}
@@ -2105,8 +3029,8 @@ configure_alternates(const cfg_obj_t *config, dns_view_t *view,
isc_buffer_add(&buffer, strlen(str));
dns_fixedname_init(&fixed);
name = dns_fixedname_name(&fixed);
- CHECK(dns_name_fromtext(name, &buffer, dns_rootname,
- ISC_FALSE, NULL));
+ CHECK(dns_name_fromtext(name, &buffer, dns_rootname, 0,
+ NULL));
portobj = cfg_tuple_get(alternate, "port");
if (cfg_obj_isuint32(portobj)) {
@@ -2286,7 +3210,7 @@ create_view(const cfg_obj_t *vconfig, dns_viewlist_t *viewlist,
static isc_result_t
configure_zone(const cfg_obj_t *config, const cfg_obj_t *zconfig,
const cfg_obj_t *vconfig, isc_mem_t *mctx, dns_view_t *view,
- cfg_aclconfctx_t *aclconf)
+ cfg_aclconfctx_t *aclconf, isc_boolean_t added)
{
dns_view_t *pview = NULL; /* Production view */
dns_zone_t *zone = NULL; /* New or reused zone */
@@ -2319,7 +3243,7 @@ configure_zone(const cfg_obj_t *config, const cfg_obj_t *zconfig,
isc_buffer_add(&buffer, strlen(zname));
dns_fixedname_init(&fixorigin);
CHECK(dns_name_fromtext(dns_fixedname_name(&fixorigin),
- &buffer, dns_rootname, ISC_FALSE, NULL));
+ &buffer, dns_rootname, 0, NULL));
origin = dns_fixedname_name(&fixorigin);
CHECK(ns_config_getclass(cfg_tuple_get(zconfig, "class"),
@@ -2349,7 +3273,7 @@ configure_zone(const cfg_obj_t *config, const cfg_obj_t *zconfig,
ztypestr = cfg_obj_asstring(typeobj);
/*
- * "hints zones" aren't zones. If we've got one,
+ * "hints zones" aren't zones. If we've got one,
* configure it and return.
*/
if (strcasecmp(ztypestr, "hint") == 0) {
@@ -2500,6 +3424,11 @@ configure_zone(const cfg_obj_t *config, const cfg_obj_t *zconfig,
}
/*
+ * Mark whether the zone was originally added at runtime or not
+ */
+ dns_zone_setadded(zone, added);
+
+ /*
* Configure the zone.
*/
CHECK(ns_zone_configure(config, vconfig, zconfig, aclconf, zone));
@@ -2519,6 +3448,95 @@ configure_zone(const cfg_obj_t *config, const cfg_obj_t *zconfig,
}
/*
+ * Configure built-in zone for storing managed-key data.
+ */
+
+#define KEYZONE "managed-keys.bind"
+#define MKEYS ".mkeys"
+
+static isc_result_t
+add_keydata_zone(dns_view_t *view, const char *directory, isc_mem_t *mctx) {
+ isc_result_t result;
+ dns_view_t *pview = NULL;
+ dns_zone_t *zone = NULL;
+ dns_acl_t *none = NULL;
+ char filename[PATH_MAX];
+ char buffer[ISC_SHA256_DIGESTSTRINGLENGTH + sizeof(MKEYS)];
+ int n;
+
+ REQUIRE(view != NULL);
+
+ /* See if we can re-use an existing keydata zone. */
+ result = dns_viewlist_find(&ns_g_server->viewlist,
+ view->name, view->rdclass,
+ &pview);
+ if (result != ISC_R_NOTFOUND &&
+ result != ISC_R_SUCCESS)
+ return (result);
+
+ if (pview != NULL && pview->managed_keys != NULL) {
+ dns_zone_attach(pview->managed_keys, &view->managed_keys);
+ dns_zone_setview(pview->managed_keys, view);
+ dns_view_detach(&pview);
+ return (ISC_R_SUCCESS);
+ }
+
+ /* No existing keydata zone was found; create one */
+ CHECK(dns_zone_create(&zone, mctx));
+ CHECK(dns_zone_setorigin(zone, dns_rootname));
+
+ isc_sha256_data((void *)view->name, strlen(view->name), buffer);
+ strcat(buffer, MKEYS);
+ n = snprintf(filename, sizeof(filename), "%s%s%s",
+ directory ? directory : "", directory ? "/" : "",
+ strcmp(view->name, "_default") == 0 ? KEYZONE : buffer);
+ if (n < 0 || (size_t)n >= sizeof(filename)) {
+ result = (n < 0) ? ISC_R_FAILURE : ISC_R_NOSPACE;
+ goto cleanup;
+ }
+ CHECK(dns_zone_setfile(zone, filename));
+
+ dns_zone_setview(zone, view);
+ dns_zone_settype(zone, dns_zone_key);
+ dns_zone_setclass(zone, view->rdclass);
+
+ CHECK(dns_zonemgr_managezone(ns_g_server->zonemgr, zone));
+
+ if (view->acache != NULL)
+ dns_zone_setacache(zone, view->acache);
+
+ CHECK(dns_acl_none(mctx, &none));
+ dns_zone_setqueryacl(zone, none);
+ dns_zone_setqueryonacl(zone, none);
+ dns_acl_detach(&none);
+
+ dns_zone_setdialup(zone, dns_dialuptype_no);
+ dns_zone_setnotifytype(zone, dns_notifytype_no);
+ dns_zone_setoption(zone, DNS_ZONEOPT_NOCHECKNS, ISC_TRUE);
+ dns_zone_setjournalsize(zone, 0);
+
+ dns_zone_setstats(zone, ns_g_server->zonestats);
+ CHECK(setquerystats(zone, mctx, ISC_FALSE));
+
+ if (view->managed_keys != NULL)
+ dns_zone_detach(&view->managed_keys);
+ dns_zone_attach(zone, &view->managed_keys);
+
+ isc_log_write(ns_g_lctx, NS_LOGCATEGORY_GENERAL,
+ NS_LOGMODULE_SERVER, ISC_LOG_INFO,
+ "set up managed keys zone for view %s, file '%s'",
+ view->name, filename);
+
+cleanup:
+ if (zone != NULL)
+ dns_zone_detach(&zone);
+ if (none != NULL)
+ dns_acl_detach(&none);
+
+ return (result);
+}
+
+/*
* Configure a single server quota.
*/
static void
@@ -2914,13 +3932,226 @@ removed(dns_zone_t *zone, void *uap) {
return (ISC_R_SUCCESS);
}
+static void
+cleanup_session_key(ns_server_t *server, isc_mem_t *mctx) {
+ if (server->session_keyfile != NULL) {
+ isc_file_remove(server->session_keyfile);
+ isc_mem_free(mctx, server->session_keyfile);
+ server->session_keyfile = NULL;
+ }
+
+ if (server->session_keyname != NULL) {
+ if (dns_name_dynamic(server->session_keyname))
+ dns_name_free(server->session_keyname, mctx);
+ isc_mem_put(mctx, server->session_keyname, sizeof(dns_name_t));
+ server->session_keyname = NULL;
+ }
+
+ if (server->sessionkey != NULL)
+ dns_tsigkey_detach(&server->sessionkey);
+
+ server->session_keyalg = DST_ALG_UNKNOWN;
+ server->session_keybits = 0;
+}
+
+static isc_result_t
+generate_session_key(const char *filename, const char *keynamestr,
+ dns_name_t *keyname, const char *algstr,
+ dns_name_t *algname, unsigned int algtype,
+ isc_uint16_t bits, isc_mem_t *mctx,
+ dns_tsigkey_t **tsigkeyp)
+{
+ isc_result_t result = ISC_R_SUCCESS;
+ dst_key_t *key = NULL;
+ isc_buffer_t key_txtbuffer;
+ isc_buffer_t key_rawbuffer;
+ char key_txtsecret[256];
+ char key_rawsecret[64];
+ isc_region_t key_rawregion;
+ isc_stdtime_t now;
+ dns_tsigkey_t *tsigkey = NULL;
+ FILE *fp = NULL;
+
+ isc_log_write(ns_g_lctx, NS_LOGCATEGORY_GENERAL,
+ NS_LOGMODULE_SERVER, ISC_LOG_INFO,
+ "generating session key for dynamic DNS");
+
+ /* generate key */
+ result = dst_key_generate(keyname, algtype, bits, 1, 0,
+ DNS_KEYPROTO_ANY, dns_rdataclass_in,
+ mctx, &key);
+ if (result != ISC_R_SUCCESS)
+ return (result);
+
+ /*
+ * Dump the key to the buffer for later use. Should be done before
+ * we transfer the ownership of key to tsigkey.
+ */
+ isc_buffer_init(&key_rawbuffer, &key_rawsecret, sizeof(key_rawsecret));
+ CHECK(dst_key_tobuffer(key, &key_rawbuffer));
+
+ isc_buffer_usedregion(&key_rawbuffer, &key_rawregion);
+ isc_buffer_init(&key_txtbuffer, &key_txtsecret, sizeof(key_txtsecret));
+ CHECK(isc_base64_totext(&key_rawregion, -1, "", &key_txtbuffer));
+
+ /* Store the key in tsigkey. */
+ isc_stdtime_get(&now);
+ CHECK(dns_tsigkey_createfromkey(dst_key_name(key), algname, key,
+ ISC_FALSE, NULL, now, now, mctx, NULL,
+ &tsigkey));
+
+ /* Dump the key to the key file. */
+ fp = ns_os_openfile(filename, S_IRUSR|S_IWUSR, ISC_TRUE);
+ if (fp == NULL) {
+ isc_log_write(ns_g_lctx, NS_LOGCATEGORY_GENERAL,
+ NS_LOGMODULE_SERVER, ISC_LOG_ERROR,
+ "could not create %s", filename);
+ result = ISC_R_NOPERM;
+ goto cleanup;
+ }
+
+ fprintf(fp, "key \"%s\" {\n"
+ "\talgorithm %s;\n"
+ "\tsecret \"%.*s\";\n};\n", keynamestr, algstr,
+ (int) isc_buffer_usedlength(&key_txtbuffer),
+ (char*) isc_buffer_base(&key_txtbuffer));
+
+ RUNTIME_CHECK(isc_stdio_flush(fp) == ISC_R_SUCCESS);
+ RUNTIME_CHECK(isc_stdio_close(fp) == ISC_R_SUCCESS);
+
+ dst_key_free(&key);
+
+ *tsigkeyp = tsigkey;
+
+ return (ISC_R_SUCCESS);
+
+ cleanup:
+ isc_log_write(ns_g_lctx, NS_LOGCATEGORY_GENERAL,
+ NS_LOGMODULE_SERVER, ISC_LOG_ERROR,
+ "failed to generate session key "
+ "for dynamic DNS: %s", isc_result_totext(result));
+ if (tsigkey != NULL)
+ dns_tsigkey_detach(&tsigkey);
+ if (key != NULL)
+ dst_key_free(&key);
+
+ return (result);
+}
+
+static isc_result_t
+configure_session_key(const cfg_obj_t **maps, ns_server_t *server,
+ isc_mem_t *mctx)
+{
+ const char *keyfile, *keynamestr, *algstr;
+ unsigned int algtype;
+ dns_fixedname_t fname;
+ dns_name_t *keyname, *algname;
+ isc_buffer_t buffer;
+ isc_uint16_t bits;
+ const cfg_obj_t *obj;
+ isc_boolean_t need_deleteold = ISC_FALSE;
+ isc_boolean_t need_createnew = ISC_FALSE;
+ isc_result_t result;
+
+ obj = NULL;
+ result = ns_config_get(maps, "session-keyfile", &obj);
+ if (result == ISC_R_SUCCESS) {
+ if (cfg_obj_isvoid(obj))
+ keyfile = NULL; /* disable it */
+ else
+ keyfile = cfg_obj_asstring(obj);
+ } else
+ keyfile = ns_g_defaultsessionkeyfile;
+
+ obj = NULL;
+ result = ns_config_get(maps, "session-keyname", &obj);
+ INSIST(result == ISC_R_SUCCESS);
+ keynamestr = cfg_obj_asstring(obj);
+ dns_fixedname_init(&fname);
+ isc_buffer_init(&buffer, keynamestr, strlen(keynamestr));
+ isc_buffer_add(&buffer, strlen(keynamestr));
+ keyname = dns_fixedname_name(&fname);
+ result = dns_name_fromtext(keyname, &buffer, dns_rootname, 0, NULL);
+ if (result != ISC_R_SUCCESS)
+ return (result);
+
+ obj = NULL;
+ result = ns_config_get(maps, "session-keyalg", &obj);
+ INSIST(result == ISC_R_SUCCESS);
+ algstr = cfg_obj_asstring(obj);
+ algname = NULL;
+ result = ns_config_getkeyalgorithm2(algstr, &algname, &algtype, &bits);
+ if (result != ISC_R_SUCCESS) {
+ const char *s = " (keeping current key)";
+
+ cfg_obj_log(obj, ns_g_lctx, ISC_LOG_ERROR, "session-keyalg: "
+ "unsupported or unknown algorithm '%s'%s",
+ algstr,
+ server->session_keyfile != NULL ? s : "");
+ return (result);
+ }
+
+ /* See if we need to (re)generate a new key. */
+ if (keyfile == NULL) {
+ if (server->session_keyfile != NULL)
+ need_deleteold = ISC_TRUE;
+ } else if (server->session_keyfile == NULL)
+ need_createnew = ISC_TRUE;
+ else if (strcmp(keyfile, server->session_keyfile) != 0 ||
+ !dns_name_equal(server->session_keyname, keyname) ||
+ server->session_keyalg != algtype ||
+ server->session_keybits != bits) {
+ need_deleteold = ISC_TRUE;
+ need_createnew = ISC_TRUE;
+ }
+
+ if (need_deleteold) {
+ INSIST(server->session_keyfile != NULL);
+ INSIST(server->session_keyname != NULL);
+ INSIST(server->sessionkey != NULL);
+
+ cleanup_session_key(server, mctx);
+ }
+
+ if (need_createnew) {
+ INSIST(server->sessionkey == NULL);
+ INSIST(server->session_keyfile == NULL);
+ INSIST(server->session_keyname == NULL);
+ INSIST(server->session_keyalg == DST_ALG_UNKNOWN);
+ INSIST(server->session_keybits == 0);
+
+ server->session_keyname = isc_mem_get(mctx, sizeof(dns_name_t));
+ if (server->session_keyname == NULL)
+ goto cleanup;
+ dns_name_init(server->session_keyname, NULL);
+ CHECK(dns_name_dup(keyname, mctx, server->session_keyname));
+
+ server->session_keyfile = isc_mem_strdup(mctx, keyfile);
+ if (server->session_keyfile == NULL)
+ goto cleanup;
+
+ server->session_keyalg = algtype;
+ server->session_keybits = bits;
+
+ CHECK(generate_session_key(keyfile, keynamestr, keyname, algstr,
+ algname, algtype, bits, mctx,
+ &server->sessionkey));
+ }
+
+ return (result);
+
+ cleanup:
+ cleanup_session_key(server, mctx);
+ return (result);
+}
+
static isc_result_t
load_configuration(const char *filename, ns_server_t *server,
isc_boolean_t first_time)
{
cfg_aclconfctx_t aclconfctx;
- cfg_obj_t *config;
- cfg_parser_t *parser = NULL;
+ cfg_obj_t *config = NULL, *bindkeys = NULL;
+ cfg_parser_t *conf_parser = NULL, *bindkeys_parser = NULL;
const cfg_listelt_t *element;
const cfg_obj_t *builtin_views;
const cfg_obj_t *maps[3];
@@ -2931,7 +4162,7 @@ load_configuration(const char *filename, ns_server_t *server,
dns_view_t *view = NULL;
dns_view_t *view_next;
dns_viewlist_t tmpviewlist;
- dns_viewlist_t viewlist;
+ dns_viewlist_t viewlist, builtin_viewlist;
in_port_t listen_port, udpport_low, udpport_high;
int i;
isc_interval_t interval;
@@ -2943,10 +4174,14 @@ load_configuration(const char *filename, ns_server_t *server,
isc_uint32_t interface_interval;
isc_uint32_t reserved;
isc_uint32_t udpsize;
+ ns_cachelist_t cachelist, tmpcachelist;
unsigned int maxsocks;
+ ns_cache_t *nsc;
cfg_aclconfctx_init(&aclconfctx);
ISC_LIST_INIT(viewlist);
+ ISC_LIST_INIT(builtin_viewlist);
+ ISC_LIST_INIT(cachelist);
/* Ensure exclusive access to configuration data. */
result = isc_task_beginexclusive(server->task);
@@ -2958,8 +4193,7 @@ load_configuration(const char *filename, ns_server_t *server,
if (first_time) {
CHECK(ns_config_parsedefaults(ns_g_parser, &ns_g_config));
RUNTIME_CHECK(cfg_map_get(ns_g_config, "options",
- &ns_g_defaults) ==
- ISC_R_SUCCESS);
+ &ns_g_defaults) == ISC_R_SUCCESS);
}
/*
@@ -2976,10 +4210,10 @@ load_configuration(const char *filename, ns_server_t *server,
NS_LOGCATEGORY_GENERAL, NS_LOGMODULE_SERVER,
ISC_LOG_INFO, "loading configuration from '%s'",
filename);
- CHECK(cfg_parser_create(ns_g_mctx, ns_g_lctx, &parser));
- cfg_parser_setcallback(parser, directory_callback, NULL);
- result = cfg_parse_file(parser, filename, &cfg_type_namedconf,
- &config);
+ CHECK(cfg_parser_create(ns_g_mctx, ns_g_lctx, &conf_parser));
+ cfg_parser_setcallback(conf_parser, directory_callback, NULL);
+ result = cfg_parse_file(conf_parser, filename,
+ &cfg_type_namedconf, &config);
}
/*
@@ -2994,10 +4228,10 @@ load_configuration(const char *filename, ns_server_t *server,
NS_LOGCATEGORY_GENERAL, NS_LOGMODULE_SERVER,
ISC_LOG_INFO, "loading configuration from '%s'",
lwresd_g_resolvconffile);
- if (parser != NULL)
- cfg_parser_destroy(&parser);
- CHECK(cfg_parser_create(ns_g_mctx, ns_g_lctx, &parser));
- result = ns_lwresd_parseeresolvconf(ns_g_mctx, parser,
+ if (conf_parser != NULL)
+ cfg_parser_destroy(&conf_parser);
+ CHECK(cfg_parser_create(ns_g_mctx, ns_g_lctx, &conf_parser));
+ result = ns_lwresd_parseeresolvconf(ns_g_mctx, conf_parser,
&config);
}
CHECK(result);
@@ -3019,13 +4253,38 @@ load_configuration(const char *filename, ns_server_t *server,
maps[i++] = NULL;
/*
+ * If bind.keys exists, load it. If "dnssec-lookaside auto"
+ * is turned on, the keys found there will be used as default
+ * trust anchors.
+ */
+ obj = NULL;
+ result = ns_config_get(maps, "bindkeys-file", &obj);
+ INSIST(result == ISC_R_SUCCESS);
+ CHECKM(setstring(server, &server->bindkeysfile,
+ cfg_obj_asstring(obj)), "strdup");
+
+ if (access(server->bindkeysfile, R_OK) == 0) {
+ isc_log_write(ns_g_lctx, NS_LOGCATEGORY_GENERAL,
+ NS_LOGMODULE_SERVER, ISC_LOG_INFO,
+ "reading built-in trusted "
+ "keys from file '%s'", server->bindkeysfile);
+
+ CHECK(cfg_parser_create(ns_g_mctx, ns_g_lctx,
+ &bindkeys_parser));
+
+ result = cfg_parse_file(bindkeys_parser, server->bindkeysfile,
+ &cfg_type_bindkeys, &bindkeys);
+ CHECK(result);
+ }
+
+ /*
* Set process limits, which (usually) needs to be done as root.
*/
set_limits(maps);
/*
* Check if max number of open sockets that the system allows is
- * sufficiently large. Failing this condition is not necessarily fatal,
+ * sufficiently large. Failing this condition is not necessarily fatal,
* but may cause subsequent runtime failures for a busy recursive
* server.
*/
@@ -3078,7 +4337,7 @@ load_configuration(const char *filename, ns_server_t *server,
else
isc_quota_soft(&server->recursionquota, 0);
- CHECK(configure_view_acl(NULL, config, "blackhole", &aclconfctx,
+ CHECK(configure_view_acl(NULL, config, "blackhole", NULL, &aclconfctx,
ns_g_mctx, &server->blackholeacl));
if (server->blackholeacl != NULL)
dns_dispatchmgr_setblackhole(ns_g_dispatchmgr,
@@ -3318,6 +4577,31 @@ load_configuration(const char *filename, ns_server_t *server,
&interval, ISC_FALSE));
/*
+ * Write the PID file.
+ */
+ obj = NULL;
+ if (ns_config_get(maps, "pid-file", &obj) == ISC_R_SUCCESS)
+ if (cfg_obj_isvoid(obj))
+ ns_os_writepidfile(NULL, first_time);
+ else
+ ns_os_writepidfile(cfg_obj_asstring(obj), first_time);
+ else if (ns_g_lwresdonly)
+ ns_os_writepidfile(lwresd_g_defaultpidfile, first_time);
+ else
+ ns_os_writepidfile(ns_g_defaultpidfile, first_time);
+
+ /*
+ * Configure the server-wide session key. This must be done before
+ * configure views because zone configuration may need to know
+ * session-keyname.
+ *
+ * Failure of session key generation isn't fatal at this time; if it
+ * turns out that a session key is really needed but doesn't exist,
+ * we'll treat it as a fatal error then.
+ */
+ (void)configure_session_key(maps, server, ns_g_mctx);
+
+ /*
* Configure and freeze all explicit views. Explicit
* views that have zones were already created at parsing
* time, but views with no zones must be created here.
@@ -3328,12 +4612,13 @@ load_configuration(const char *filename, ns_server_t *server,
element != NULL;
element = cfg_list_next(element))
{
- const cfg_obj_t *vconfig = cfg_listelt_value(element);
+ cfg_obj_t *vconfig = cfg_listelt_value(element);
view = NULL;
CHECK(create_view(vconfig, &viewlist, &view));
INSIST(view != NULL);
- CHECK(configure_view(view, config, vconfig,
+ CHECK(configure_view(view, conf_parser, config, vconfig,
+ &cachelist, bindkeys,
ns_g_mctx, &aclconfctx, ISC_TRUE));
dns_view_freeze(view);
dns_view_detach(&view);
@@ -3351,15 +4636,15 @@ load_configuration(const char *filename, ns_server_t *server,
* In either case, we need to configure and freeze it.
*/
CHECK(create_view(NULL, &viewlist, &view));
- CHECK(configure_view(view, config, NULL, ns_g_mctx,
- &aclconfctx, ISC_TRUE));
+ CHECK(configure_view(view, conf_parser, config, NULL,
+ &cachelist, bindkeys,
+ ns_g_mctx, &aclconfctx, ISC_TRUE));
dns_view_freeze(view);
dns_view_detach(&view);
}
/*
- * Create (or recreate) the built-in views. Currently
- * there is only one, the _bind view.
+ * Create (or recreate) the built-in views.
*/
builtin_views = NULL;
RUNTIME_CHECK(cfg_map_get(ns_g_config, "view",
@@ -3368,25 +4653,38 @@ load_configuration(const char *filename, ns_server_t *server,
element != NULL;
element = cfg_list_next(element))
{
- const cfg_obj_t *vconfig = cfg_listelt_value(element);
- CHECK(create_view(vconfig, &viewlist, &view));
- CHECK(configure_view(view, config, vconfig, ns_g_mctx,
- &aclconfctx, ISC_FALSE));
+ cfg_obj_t *vconfig = cfg_listelt_value(element);
+
+ CHECK(create_view(vconfig, &builtin_viewlist, &view));
+ CHECK(configure_view(view, conf_parser, config, vconfig,
+ &cachelist, bindkeys,
+ ns_g_mctx, &aclconfctx, ISC_FALSE));
dns_view_freeze(view);
dns_view_detach(&view);
view = NULL;
}
- /*
- * Swap our new view list with the production one.
- */
+ /* Now combine the two viewlists into one */
+ ISC_LIST_APPENDLIST(viewlist, builtin_viewlist, link);
+
+ /* Swap our new view list with the production one. */
tmpviewlist = server->viewlist;
server->viewlist = viewlist;
viewlist = tmpviewlist;
- /*
- * Load the TKEY information from the configuration.
- */
+ /* Make the view list available to each of the views */
+ view = ISC_LIST_HEAD(server->viewlist);
+ while (view != NULL) {
+ view->viewlist = &server->viewlist;
+ view = ISC_LIST_NEXT(view, link);
+ }
+
+ /* Swap our new cache list with the production one. */
+ tmpcachelist = server->cachelist;
+ server->cachelist = cachelist;
+ cachelist = tmpcachelist;
+
+ /* Load the TKEY information from the configuration. */
if (options != NULL) {
dns_tkeyctx_t *t = NULL;
CHECKM(ns_tkeyctx_fromconfig(options, ns_g_mctx, ns_g_entropy,
@@ -3551,16 +4849,6 @@ load_configuration(const char *filename, ns_server_t *server,
}
}
- obj = NULL;
- if (ns_config_get(maps, "pid-file", &obj) == ISC_R_SUCCESS)
- if (cfg_obj_isvoid(obj))
- ns_os_writepidfile(NULL, first_time);
- else
- ns_os_writepidfile(cfg_obj_asstring(obj), first_time);
- else if (ns_g_lwresdonly)
- ns_os_writepidfile(lwresd_g_defaultpidfile, first_time);
- else
- ns_os_writepidfile(ns_g_defaultpidfile, first_time);
obj = NULL;
if (options != NULL &&
@@ -3591,6 +4879,12 @@ load_configuration(const char *filename, ns_server_t *server,
"strdup");
obj = NULL;
+ result = ns_config_get(maps, "secroots-file", &obj);
+ INSIST(result == ISC_R_SUCCESS);
+ CHECKM(setstring(server, &server->secrootsfile, cfg_obj_asstring(obj)),
+ "strdup");
+
+ obj = NULL;
result = ns_config_get(maps, "recursing-file", &obj);
INSIST(result == ISC_R_SUCCESS);
CHECKM(setstring(server, &server->recfile, cfg_obj_asstring(obj)),
@@ -3647,12 +4941,18 @@ load_configuration(const char *filename, ns_server_t *server,
if (v6portset != NULL)
isc_portset_destroy(ns_g_mctx, &v6portset);
- cfg_aclconfctx_destroy(&aclconfctx);
+ cfg_aclconfctx_clear(&aclconfctx);
- if (parser != NULL) {
+ if (conf_parser != NULL) {
if (config != NULL)
- cfg_obj_destroy(parser, &config);
- cfg_parser_destroy(&parser);
+ cfg_obj_destroy(conf_parser, &config);
+ cfg_parser_destroy(&conf_parser);
+ }
+
+ if (bindkeys_parser != NULL) {
+ if (bindkeys != NULL)
+ cfg_obj_destroy(bindkeys_parser, &bindkeys);
+ cfg_parser_destroy(&bindkeys_parser);
}
if (view != NULL)
@@ -3675,6 +4975,13 @@ load_configuration(const char *filename, ns_server_t *server,
dns_view_detach(&view);
}
+ /* Same cleanup for cache list. */
+ while ((nsc = ISC_LIST_HEAD(cachelist)) != NULL) {
+ ISC_LIST_UNLINK(cachelist, nsc, link);
+ dns_cache_detach(&nsc->cache);
+ isc_mem_put(server->mctx, nsc, sizeof(*nsc));
+ }
+
/*
* Adjust the listening interfaces in accordance with the source
* addresses specified in views and zones.
@@ -3708,6 +5015,8 @@ load_zones(ns_server_t *server, isc_boolean_t stop) {
view = ISC_LIST_NEXT(view, link))
{
CHECK(dns_view_load(view, stop));
+ if (view->managed_keys != NULL)
+ CHECK(dns_zone_load(view->managed_keys));
}
/*
@@ -3737,11 +5046,14 @@ load_new_zones(ns_server_t *server, isc_boolean_t stop) {
view = ISC_LIST_NEXT(view, link))
{
CHECK(dns_view_loadnew(view, stop));
+
+ /* Load managed-keys data */
+ if (view->managed_keys != NULL)
+ CHECK(dns_zone_loadnew(view->managed_keys));
}
+
/*
- * Force zone maintenance. Do this after loading
- * so that we know when we need to force AXFR of
- * slave zones whose master files are missing.
+ * Resume zone XFRs.
*/
dns_zonemgr_resumexfrs(server->zonemgr);
cleanup:
@@ -3820,6 +5132,7 @@ shutdown_server(isc_task_t *task, isc_event_t *event) {
dns_view_t *view, *view_next;
ns_server_t *server = (ns_server_t *)event->ev_arg;
isc_boolean_t flush = server->flushonshutdown;
+ ns_cache_t *nsc;
UNUSED(task);
INSIST(task == server->task);
@@ -3834,6 +5147,7 @@ shutdown_server(isc_task_t *task, isc_event_t *event) {
ns_statschannels_shutdown(server);
ns_controls_shutdown(server->controls);
end_reserved_dispatches(server, ISC_TRUE);
+ cleanup_session_key(server, server->mctx);
cfg_obj_destroy(ns_g_parser, &ns_g_config);
cfg_parser_destroy(&ns_g_parser);
@@ -3849,6 +5163,12 @@ shutdown_server(isc_task_t *task, isc_event_t *event) {
dns_view_detach(&view);
}
+ while ((nsc = ISC_LIST_HEAD(server->cachelist)) != NULL) {
+ ISC_LIST_UNLINK(server->cachelist, nsc, link);
+ dns_cache_detach(&nsc->cache);
+ isc_mem_put(server->mctx, nsc, sizeof(*nsc));
+ }
+
isc_timer_detach(&server->interface_timer);
isc_timer_detach(&server->heartbeat_timer);
isc_timer_detach(&server->pps_timer);
@@ -3860,6 +5180,11 @@ shutdown_server(isc_task_t *task, isc_event_t *event) {
dns_zonemgr_shutdown(server->zonemgr);
+ if (ns_g_sessionkey != NULL) {
+ dns_tsigkey_detach(&ns_g_sessionkey);
+ dns_name_free(&ns_g_sessionkeyname, server->mctx);
+ }
+
if (server->blackholeacl != NULL)
dns_acl_detach(&server->blackholeacl);
@@ -3918,7 +5243,8 @@ ns_server_create(isc_mem_t *mctx, ns_server_t **serverp) {
ISC_R_NOMEMORY : ISC_R_SUCCESS,
"allocating reload event");
- CHECKFATAL(dst_lib_init(ns_g_mctx, ns_g_entropy, ISC_ENTROPY_GOODONLY),
+ CHECKFATAL(dst_lib_init2(ns_g_mctx, ns_g_entropy,
+ ns_g_engine, ISC_ENTROPY_GOODONLY),
"initializing DST");
server->tkeyctx = NULL;
@@ -3963,10 +5289,20 @@ ns_server_create(isc_mem_t *mctx, ns_server_t **serverp) {
"isc_stats_create");
isc_socketmgr_setstats(ns_g_socketmgr, server->sockstats);
+ server->bindkeysfile = isc_mem_strdup(server->mctx, "bind.keys");
+ CHECKFATAL(server->bindkeysfile == NULL ? ISC_R_NOMEMORY :
+ ISC_R_SUCCESS,
+ "isc_mem_strdup");
+
server->dumpfile = isc_mem_strdup(server->mctx, "named_dump.db");
CHECKFATAL(server->dumpfile == NULL ? ISC_R_NOMEMORY : ISC_R_SUCCESS,
"isc_mem_strdup");
+ server->secrootsfile = isc_mem_strdup(server->mctx, "named.secroots");
+ CHECKFATAL(server->secrootsfile == NULL ? ISC_R_NOMEMORY :
+ ISC_R_SUCCESS,
+ "isc_mem_strdup");
+
server->recfile = isc_mem_strdup(server->mctx, "named.recursing");
CHECKFATAL(server->recfile == NULL ? ISC_R_NOMEMORY : ISC_R_SUCCESS,
"isc_mem_strdup");
@@ -4008,6 +5344,14 @@ ns_server_create(isc_mem_t *mctx, ns_server_t **serverp) {
ISC_LIST_INIT(server->statschannels);
+ ISC_LIST_INIT(server->cachelist);
+
+ server->sessionkey = NULL;
+ server->session_keyfile = NULL;
+ server->session_keyname = NULL;
+ server->session_keyalg = DST_ALG_UNKNOWN;
+ server->session_keybits = 0;
+
server->magic = NS_SERVER_MAGIC;
*serverp = server;
}
@@ -4027,7 +5371,9 @@ ns_server_destroy(ns_server_t **serverp) {
isc_stats_detach(&server->sockstats);
isc_mem_free(server->mctx, server->statsfile);
+ isc_mem_free(server->mctx, server->bindkeysfile);
isc_mem_free(server->mctx, server->dumpfile);
+ isc_mem_free(server->mctx, server->secrootsfile);
isc_mem_free(server->mctx, server->recfile);
if (server->version != NULL)
@@ -4047,6 +5393,7 @@ ns_server_destroy(ns_server_t **serverp) {
isc_event_free(&server->reload_event);
INSIST(ISC_LIST_EMPTY(server->viewlist));
+ INSIST(ISC_LIST_EMPTY(server->cachelist));
dns_aclenv_destroy(&server->aclenv);
@@ -4278,7 +5625,9 @@ next_token(char **stringp, const char *delim) {
* set '*zonep' to NULL.
*/
static isc_result_t
-zone_from_args(ns_server_t *server, char *args, dns_zone_t **zonep) {
+zone_from_args(ns_server_t *server, char *args, dns_zone_t **zonep,
+ const char **zonename)
+{
char *input, *ptr;
const char *zonetxt;
char *classtxt;
@@ -4302,6 +5651,8 @@ zone_from_args(ns_server_t *server, char *args, dns_zone_t **zonep) {
zonetxt = next_token(&input, " \t");
if (zonetxt == NULL)
return (ISC_R_SUCCESS);
+ if (zonename)
+ *zonename = zonetxt;
/* Look for the optional class name. */
classtxt = next_token(&input, " \t");
@@ -4314,7 +5665,7 @@ zone_from_args(ns_server_t *server, char *args, dns_zone_t **zonep) {
isc_buffer_add(&buf, strlen(zonetxt));
dns_fixedname_init(&name);
result = dns_name_fromtext(dns_fixedname_name(&name),
- &buf, dns_rootname, ISC_FALSE, NULL);
+ &buf, dns_rootname, 0, NULL);
if (result != ISC_R_SUCCESS)
goto fail1;
@@ -4362,7 +5713,7 @@ ns_server_retransfercommand(ns_server_t *server, char *args) {
dns_zone_t *zone = NULL;
dns_zonetype_t type;
- result = zone_from_args(server, args, &zone);
+ result = zone_from_args(server, args, &zone, NULL);
if (result != ISC_R_SUCCESS)
return (result);
if (zone == NULL)
@@ -4386,7 +5737,7 @@ ns_server_reloadcommand(ns_server_t *server, char *args, isc_buffer_t *text) {
dns_zonetype_t type;
const char *msg = NULL;
- result = zone_from_args(server, args, &zone);
+ result = zone_from_args(server, args, &zone, NULL);
if (result != ISC_R_SUCCESS)
return (result);
if (zone == NULL) {
@@ -4446,7 +5797,7 @@ ns_server_notifycommand(ns_server_t *server, char *args, isc_buffer_t *text) {
dns_zone_t *zone = NULL;
const unsigned char msg[] = "zone notify queued";
- result = zone_from_args(server, args, &zone);
+ result = zone_from_args(server, args, &zone, NULL);
if (result != ISC_R_SUCCESS)
return (result);
if (zone == NULL)
@@ -4471,7 +5822,7 @@ ns_server_refreshcommand(ns_server_t *server, char *args, isc_buffer_t *text) {
const unsigned char msg2[] = "not a slave or stub zone";
dns_zonetype_t type;
- result = zone_from_args(server, args, &zone);
+ result = zone_from_args(server, args, &zone, NULL);
if (result != ISC_R_SUCCESS)
return (result);
if (zone == NULL)
@@ -4710,15 +6061,23 @@ dumpdone(void *arg, isc_result_t result) {
nextview:
fprintf(dctx->fp, ";\n; Start view %s\n;\n", dctx->view->view->name);
resume:
- if (dctx->zone == NULL && dctx->cache == NULL && dctx->dumpcache) {
+ if (dctx->dumpcache && dns_view_iscacheshared(dctx->view->view)) {
+ fprintf(dctx->fp,
+ ";\n; Cache of view '%s' is shared as '%s'\n",
+ dctx->view->view->name,
+ dns_cache_getname(dctx->view->view->cache));
+ } else if (dctx->zone == NULL && dctx->cache == NULL &&
+ dctx->dumpcache)
+ {
style = &dns_master_style_cache;
/* start cache dump */
if (dctx->view->view->cachedb != NULL)
dns_db_attach(dctx->view->view->cachedb, &dctx->cache);
if (dctx->cache != NULL) {
-
- fprintf(dctx->fp, ";\n; Cache dump of view '%s'\n;\n",
- dctx->view->view->name);
+ fprintf(dctx->fp,
+ ";\n; Cache dump of view '%s' (cache %s)\n;\n",
+ dctx->view->view->name,
+ dns_cache_getname(dctx->view->view->cache));
result = dns_master_dumptostreaminc(dctx->mctx,
dctx->cache, NULL,
style, dctx->fp,
@@ -4880,6 +6239,68 @@ ns_server_dumpdb(ns_server_t *server, char *args) {
}
isc_result_t
+ns_server_dumpsecroots(ns_server_t *server, char *args) {
+ dns_view_t *view;
+ dns_keytable_t *secroots = NULL;
+ isc_result_t result;
+ char *ptr;
+ FILE *fp = NULL;
+ isc_time_t now;
+ char tbuf[64];
+
+ /* Skip the command name. */
+ ptr = next_token(&args, " \t");
+ if (ptr == NULL)
+ return (ISC_R_UNEXPECTEDEND);
+ ptr = next_token(&args, " \t");
+
+ CHECKMF(isc_stdio_open(server->secrootsfile, "w", &fp),
+ "could not open secroots dump file", server->secrootsfile);
+ TIME_NOW(&now);
+ isc_time_formattimestamp(&now, tbuf, sizeof(tbuf));
+ fprintf(fp, "%s\n", tbuf);
+
+ nextview:
+ for (view = ISC_LIST_HEAD(server->viewlist);
+ view != NULL;
+ view = ISC_LIST_NEXT(view, link))
+ {
+ if (ptr != NULL && strcmp(view->name, ptr) != 0)
+ continue;
+ if (secroots != NULL)
+ dns_keytable_detach(&secroots);
+ result = dns_view_getsecroots(view, &secroots);
+ if (result == ISC_R_NOTFOUND) {
+ result = ISC_R_SUCCESS;
+ continue;
+ }
+ fprintf(fp, "\n Start view %s\n\n", view->name);
+ CHECK(dns_keytable_dump(secroots, fp));
+ }
+ if (ptr != NULL) {
+ ptr = next_token(&args, " \t");
+ if (ptr != NULL)
+ goto nextview;
+ }
+
+ cleanup:
+ if (secroots != NULL)
+ dns_keytable_detach(&secroots);
+ if (fp != NULL)
+ (void)isc_stdio_close(fp);
+ if (result == ISC_R_SUCCESS)
+ isc_log_write(ns_g_lctx, NS_LOGCATEGORY_GENERAL,
+ NS_LOGMODULE_SERVER, ISC_LOG_INFO,
+ "dumpsecroots complete");
+ else
+ isc_log_write(ns_g_lctx, NS_LOGCATEGORY_GENERAL,
+ NS_LOGMODULE_SERVER, ISC_LOG_ERROR,
+ "dumpsecroots failed: %s",
+ dns_result_totext(result));
+ return (result);
+}
+
+isc_result_t
ns_server_dumprecursing(ns_server_t *server) {
FILE *fp = NULL;
isc_result_t result;
@@ -4997,6 +6418,7 @@ ns_server_flushcache(ns_server_t *server, char *args) {
isc_boolean_t flushed;
isc_boolean_t found;
isc_result_t result;
+ ns_cache_t *nsc;
/* Skip the command name. */
ptr = next_token(&args, " \t");
@@ -5010,22 +6432,96 @@ ns_server_flushcache(ns_server_t *server, char *args) {
RUNTIME_CHECK(result == ISC_R_SUCCESS);
flushed = ISC_TRUE;
found = ISC_FALSE;
- for (view = ISC_LIST_HEAD(server->viewlist);
- view != NULL;
- view = ISC_LIST_NEXT(view, link))
- {
- if (viewname != NULL && strcasecmp(viewname, view->name) != 0)
- continue;
+
+ /*
+ * Flushing a cache is tricky when caches are shared by multiple views.
+ * We first identify which caches should be flushed in the local cache
+ * list, flush these caches, and then update other views that refer to
+ * the flushed cache DB.
+ */
+ if (viewname != NULL) {
+ /*
+ * Mark caches that need to be flushed. This is an O(#view^2)
+ * operation in the very worst case, but should be normally
+ * much more lightweight because only a few (most typically just
+ * one) views will match.
+ */
+ for (view = ISC_LIST_HEAD(server->viewlist);
+ view != NULL;
+ view = ISC_LIST_NEXT(view, link))
+ {
+ if (strcasecmp(viewname, view->name) != 0)
+ continue;
+ found = ISC_TRUE;
+ for (nsc = ISC_LIST_HEAD(server->cachelist);
+ nsc != NULL;
+ nsc = ISC_LIST_NEXT(nsc, link)) {
+ if (nsc->cache == view->cache)
+ break;
+ }
+ INSIST(nsc != NULL);
+ nsc->needflush = ISC_TRUE;
+ }
+ } else
found = ISC_TRUE;
- result = dns_view_flushcache(view);
+
+ /* Perform flush */
+ for (nsc = ISC_LIST_HEAD(server->cachelist);
+ nsc != NULL;
+ nsc = ISC_LIST_NEXT(nsc, link)) {
+ if (viewname != NULL && !nsc->needflush)
+ continue;
+ nsc->needflush = ISC_TRUE;
+ result = dns_view_flushcache2(nsc->primaryview, ISC_FALSE);
if (result != ISC_R_SUCCESS) {
flushed = ISC_FALSE;
isc_log_write(ns_g_lctx, NS_LOGCATEGORY_GENERAL,
NS_LOGMODULE_SERVER, ISC_LOG_ERROR,
"flushing cache in view '%s' failed: %s",
- view->name, isc_result_totext(result));
+ nsc->primaryview->name,
+ isc_result_totext(result));
+ }
+ }
+
+ /*
+ * Fix up views that share a flushed cache: let the views update the
+ * cache DB they're referring to. This could also be an expensive
+ * operation, but should typically be marginal: the inner loop is only
+ * necessary for views that share a cache, and if there are many such
+ * views the number of shared cache should normally be small.
+ * A worst case is that we have n views and n/2 caches, each shared by
+ * two views. Then this will be a O(n^2/4) operation.
+ */
+ for (view = ISC_LIST_HEAD(server->viewlist);
+ view != NULL;
+ view = ISC_LIST_NEXT(view, link))
+ {
+ if (!dns_view_iscacheshared(view))
+ continue;
+ for (nsc = ISC_LIST_HEAD(server->cachelist);
+ nsc != NULL;
+ nsc = ISC_LIST_NEXT(nsc, link)) {
+ if (!nsc->needflush || nsc->cache != view->cache)
+ continue;
+ result = dns_view_flushcache2(view, ISC_TRUE);
+ if (result != ISC_R_SUCCESS) {
+ flushed = ISC_FALSE;
+ isc_log_write(ns_g_lctx, NS_LOGCATEGORY_GENERAL,
+ NS_LOGMODULE_SERVER, ISC_LOG_ERROR,
+ "fixing cache in view '%s' "
+ "failed: %s", view->name,
+ isc_result_totext(result));
+ }
}
}
+
+ /* Cleanup the cache list. */
+ for (nsc = ISC_LIST_HEAD(server->cachelist);
+ nsc != NULL;
+ nsc = ISC_LIST_NEXT(nsc, link)) {
+ nsc->needflush = ISC_FALSE;
+ }
+
if (flushed && found) {
if (viewname != NULL)
isc_log_write(ns_g_lctx, NS_LOGCATEGORY_GENERAL,
@@ -5076,7 +6572,7 @@ ns_server_flushname(ns_server_t *server, char *args) {
isc_buffer_add(&b, strlen(target));
dns_fixedname_init(&fixed);
name = dns_fixedname_name(&fixed);
- result = dns_name_fromtext(name, &b, dns_rootname, ISC_FALSE, NULL);
+ result = dns_name_fromtext(name, &b, dns_rootname, 0, NULL);
if (result != ISC_R_SUCCESS)
return (result);
@@ -5094,6 +6590,11 @@ ns_server_flushname(ns_server_t *server, char *args) {
if (viewname != NULL && strcasecmp(viewname, view->name) != 0)
continue;
found = ISC_TRUE;
+ /*
+ * It's a little inefficient to try flushing name for all views
+ * if some of the views share a single cache. But since the
+ * operation is lightweight we prefer simplicity here.
+ */
result = dns_view_flushname(view, name);
if (result != ISC_R_SUCCESS) {
flushed = ISC_FALSE;
@@ -5408,6 +6909,46 @@ ns_server_tsiglist(ns_server_t *server, isc_buffer_t *text) {
}
/*
+ * Act on a "sign" or "loadkeys" command from the command channel.
+ */
+isc_result_t
+ns_server_rekey(ns_server_t *server, char *args) {
+ isc_result_t result;
+ dns_zone_t *zone = NULL;
+ dns_zonetype_t type;
+ isc_uint16_t keyopts;
+ isc_boolean_t fullsign = ISC_FALSE;
+
+ if (strncasecmp(args, NS_COMMAND_SIGN, strlen(NS_COMMAND_SIGN)) == 0)
+ fullsign = ISC_TRUE;
+
+ result = zone_from_args(server, args, &zone, NULL);
+ if (result != ISC_R_SUCCESS)
+ return (result);
+ if (zone == NULL)
+ return (ISC_R_UNEXPECTEDEND); /* XXX: or do all zones? */
+
+ type = dns_zone_gettype(zone);
+ if (type != dns_zone_master) {
+ dns_zone_detach(&zone);
+ return (DNS_R_NOTMASTER);
+ }
+
+ keyopts = dns_zone_getkeyopts(zone);
+
+ /* "rndc loadkeys" requires "auto-dnssec maintain". */
+ if ((keyopts & DNS_ZONEKEY_ALLOW) == 0)
+ result = ISC_R_NOPERM;
+ else if ((keyopts & DNS_ZONEKEY_MAINTAIN) == 0 && !fullsign)
+ result = ISC_R_NOPERM;
+ else
+ dns_zone_rekey(zone, fullsign);
+
+ dns_zone_detach(&zone);
+ return (result);
+}
+
+/*
* Act on a "freeze" or "thaw" command from the command channel.
*/
isc_result_t
@@ -5425,7 +6966,7 @@ ns_server_freeze(ns_server_t *server, isc_boolean_t freeze, char *args,
isc_boolean_t frozen;
const char *msg = NULL;
- result = zone_from_args(server, args, &zone);
+ result = zone_from_args(server, args, &zone, NULL);
if (result != ISC_R_SUCCESS)
return (result);
if (zone == NULL) {
@@ -5451,7 +6992,7 @@ ns_server_freeze(ns_server_t *server, isc_boolean_t freeze, char *args,
type = dns_zone_gettype(zone);
if (type != dns_zone_master) {
dns_zone_detach(&zone);
- return (ISC_R_NOTFOUND);
+ return (DNS_R_NOTMASTER);
}
result = isc_task_beginexclusive(server->task);
@@ -5502,8 +7043,8 @@ ns_server_freeze(ns_server_t *server, isc_boolean_t freeze, char *args,
strlen(msg) + 1);
view = dns_zone_getview(zone);
- if (strcmp(view->name, "_bind") == 0 ||
- strcmp(view->name, "_default") == 0)
+ if (strcmp(view->name, "_default") == 0 ||
+ strcmp(view->name, "_bind") == 0)
{
vname = "";
sep = "";
@@ -5543,3 +7084,376 @@ ns_smf_add_message(isc_buffer_t *text) {
return (ISC_R_SUCCESS);
}
#endif /* HAVE_LIBSCF */
+
+/*
+ * Act on an "addzone" command from the command channel.
+ */
+isc_result_t
+ns_server_add_zone(ns_server_t *server, char *args) {
+ isc_result_t result;
+ isc_buffer_t argbuf;
+ size_t arglen;
+ cfg_parser_t *parser = NULL;
+ cfg_obj_t *config = NULL;
+ const cfg_obj_t *vconfig = NULL;
+ const cfg_obj_t *views = NULL;
+ const cfg_obj_t *parms = NULL;
+ const cfg_obj_t *obj = NULL;
+ const cfg_listelt_t *element;
+ const char *zonename;
+ const char *classname = NULL;
+ const char *argp;
+ const char *viewname = NULL;
+ dns_rdataclass_t rdclass;
+ dns_view_t *view = 0;
+ isc_buffer_t buf, *nbuf = NULL;
+ dns_name_t dnsname;
+ dns_zone_t *zone = NULL;
+ FILE *fp = NULL;
+ struct cfg_context *cfg = NULL;
+
+ /* Try to parse the argument string */
+ arglen = strlen(args);
+ isc_buffer_init(&argbuf, args, arglen);
+ isc_buffer_add(&argbuf, strlen(args));
+ CHECK(cfg_parser_create(server->mctx, ns_g_lctx, &parser));
+ CHECK(cfg_parse_buffer(parser, &argbuf, &cfg_type_addzoneconf,
+ &config));
+ CHECK(cfg_map_get(config, "addzone", &parms));
+
+ zonename = cfg_obj_asstring(cfg_tuple_get(parms, "name"));
+ isc_buffer_init(&buf, zonename, strlen(zonename));
+ isc_buffer_add(&buf, strlen(zonename));
+ dns_name_init(&dnsname, NULL);
+ isc_buffer_allocate(server->mctx, &nbuf, 256);
+ dns_name_setbuffer(&dnsname, nbuf);
+ CHECK(dns_name_fromtext(&dnsname, &buf, dns_rootname, ISC_FALSE, NULL));
+
+ /* Make sense of optional class argument */
+ obj = cfg_tuple_get(parms, "class");
+ CHECK(ns_config_getclass(obj, dns_rdataclass_in, &rdclass));
+ if (rdclass != dns_rdataclass_in && obj)
+ classname = cfg_obj_asstring(obj);
+
+ /* Make sense of optional view argument */
+ obj = cfg_tuple_get(parms, "view");
+ if (obj && cfg_obj_isstring(obj))
+ viewname = cfg_obj_asstring(obj);
+ if (viewname == NULL || *viewname == '\0')
+ viewname = "_default";
+ CHECK(dns_viewlist_find(&server->viewlist, viewname, rdclass, &view));
+
+ /* Are we accepting new zones? */
+ if (view->new_zone_file == NULL) {
+ result = ISC_R_NOPERM;
+ goto cleanup;
+ }
+
+ cfg = (struct cfg_context *) view->new_zone_config;
+ if (cfg == NULL) {
+ result = ISC_R_FAILURE;
+ goto cleanup;
+ }
+
+ /* Zone shouldn't already exist */
+ result = dns_zt_find(view->zonetable, &dnsname, 0, NULL, &zone);
+ if (result == ISC_R_SUCCESS) {
+ result = ISC_R_EXISTS;
+ goto cleanup;
+ } else if (result == DNS_R_PARTIALMATCH) {
+ /* Create our sub-zone anyway */
+ dns_zone_detach(&zone);
+ zone = NULL;
+ }
+ else if (result != ISC_R_NOTFOUND)
+ goto cleanup;
+
+ /* Find the view statement */
+ cfg_map_get(cfg->config, "view", &views);
+ for (element = cfg_list_first(views);
+ element != NULL;
+ element = cfg_list_next(element))
+ {
+ const char *vname;
+ vconfig = cfg_listelt_value(element);
+ vname = cfg_obj_asstring(cfg_tuple_get(vconfig, "name"));
+ if (vname && !strcasecmp(vname, viewname))
+ break;
+ vconfig = NULL;
+ }
+
+ /* Open save file for write configuration */
+ CHECK(isc_stdio_open(view->new_zone_file, "a", &fp));
+
+ /* Mark view unfrozen so that zone can be added */
+ dns_view_thaw(view);
+ result = configure_zone(cfg->config, parms, vconfig,
+ server->mctx, view, &cfg->actx, ISC_FALSE);
+ dns_view_freeze(view);
+ if (result != ISC_R_SUCCESS) {
+ goto cleanup;
+ }
+
+ /* Is it there yet? */
+ CHECK(dns_zt_find(view->zonetable, &dnsname, 0, NULL, &zone));
+
+ /*
+ * Load the zone from the master file. If this fails, we'll
+ * need to undo the configuration we've done already.
+ */
+ result = dns_zone_loadnew(zone);
+ if (result != ISC_R_SUCCESS) {
+ dns_db_t *dbp = NULL;
+
+ isc_log_write(ns_g_lctx, NS_LOGCATEGORY_GENERAL,
+ NS_LOGMODULE_SERVER, ISC_LOG_INFO,
+ "addzone failed; reverting.");
+
+ /* If the zone loaded partially, unload it */
+ if (dns_zone_getdb(zone, &dbp) == ISC_R_SUCCESS) {
+ dns_db_detach(&dbp);
+ dns_zone_unload(zone);
+ }
+
+ /* Remove the zone from the zone table */
+ dns_zt_unmount(view->zonetable, zone);
+ goto cleanup;
+ }
+
+ /* Flag the zone as having been added at runtime */
+ dns_zone_setadded(zone, ISC_TRUE);
+
+ /* Emit just the zone name from args */
+ CHECK(isc_stdio_write("zone ", 5, 1, fp, NULL));
+ CHECK(isc_stdio_write(zonename, strlen(zonename), 1, fp, NULL));
+ CHECK(isc_stdio_write(" ", 1, 1, fp, NULL));
+
+ /* Classname, if not default */
+ if (classname != NULL && *classname != '\0') {
+ CHECK(isc_stdio_write(classname, strlen(classname), 1, fp,
+ NULL));
+ CHECK(isc_stdio_write(" ", 1, 1, fp, NULL));
+ }
+
+ /* Find beginning of option block from args */
+ for (argp = args; *argp; argp++, arglen--) {
+ if (*argp == '{') { /* Assume matching '}' */
+ /* Add that to our file */
+ CHECK(isc_stdio_write(argp, arglen, 1, fp, NULL));
+
+ /* Make sure we end with a LF */
+ if (argp[arglen-1] != '\n') {
+ CHECK(isc_stdio_write("\n", 1, 1, fp, NULL));
+ }
+ break;
+ }
+ }
+
+ CHECK(isc_stdio_close(fp));
+ fp = NULL;
+ isc_log_write(ns_g_lctx, NS_LOGCATEGORY_GENERAL,
+ NS_LOGMODULE_SERVER, ISC_LOG_INFO,
+ "zone %s added to view %s via addzone",
+ zonename, viewname);
+
+ result = ISC_R_SUCCESS;
+
+ cleanup:
+ if (fp != NULL)
+ isc_stdio_close(fp);
+ if (parser != NULL) {
+ if (config != NULL)
+ cfg_obj_destroy(parser, &config);
+ cfg_parser_destroy(&parser);
+ }
+ if (zone != NULL)
+ dns_zone_detach(&zone);
+ if (view != NULL)
+ dns_view_detach(&view);
+ if (nbuf != NULL)
+ isc_buffer_free(&nbuf);
+
+ return (result);
+}
+
+/*
+ * Act on a "delzone" command from the command channel.
+ */
+isc_result_t
+ns_server_del_zone(ns_server_t *server, char *args) {
+ isc_result_t result;
+ dns_zone_t *zone = NULL;
+ dns_view_t *view = NULL;
+ dns_db_t *dbp = NULL;
+ const char *filename = NULL;
+ char *tmpname = NULL;
+ char buf[1024];
+ const char *zonename = NULL;
+ size_t znamelen = 0;
+ FILE *ifp = NULL, *ofp = NULL;
+
+ /* Parse parameters */
+ CHECK(zone_from_args(server, args, &zone, &zonename));
+ if (result != ISC_R_SUCCESS)
+ return (result);
+ if (zone == NULL) {
+ result = ISC_R_UNEXPECTEDEND;
+ goto cleanup;
+ }
+
+ /*
+ * Was this zone originally added at runtime?
+ * If not, we can't delete it now.
+ */
+ if (!dns_zone_getadded(zone)) {
+ result = ISC_R_NOPERM;
+ goto cleanup;
+ }
+
+ if (zonename != NULL)
+ znamelen = strlen(zonename);
+
+ /* Dig out configuration for this zone */
+ view = dns_zone_getview(zone);
+ filename = view->new_zone_file;
+ if (filename == NULL) {
+ /* No adding zones in this view */
+ result = ISC_R_FAILURE;
+ goto cleanup;
+ }
+
+ /* Rewrite zone list */
+ result = isc_stdio_open(filename, "r", &ifp);
+ if (ifp != NULL && result == ISC_R_SUCCESS) {
+ char *found = NULL, *p = NULL;
+ size_t n;
+
+ /* Create a temporary file */
+ CHECK(isc_string_printf(buf, 1023, "%s.%ld", filename,
+ (long)getpid()));
+ if (!(tmpname = isc_mem_strdup(server->mctx, buf))) {
+ result = ISC_R_NOMEMORY;
+ goto cleanup;
+ }
+ CHECK(isc_stdio_open(tmpname, "w", &ofp));
+
+ /* Look for the entry for that zone */
+ while (fgets(buf, 1024, ifp)) {
+ /* A 'zone' line */
+ if (strncasecmp(buf, "zone", 4)) {
+ fputs(buf, ofp);
+ continue;
+ }
+ p = buf+4;
+
+ /* Locate a name */
+ while (*p &&
+ ((*p == '"') || isspace((unsigned char)*p)))
+ p++;
+
+ /* Is that the zone we're looking for */
+ if (strncasecmp(p, zonename, znamelen)) {
+ fputs(buf, ofp);
+ continue;
+ }
+
+ /* And nothing else? */
+ p += znamelen;
+ if (isspace((unsigned char)*p) ||
+ *p == '"' || *p == '{') {
+ /* This must be the entry */
+ found = p;
+ break;
+ }
+
+ /* Spit it out, keep looking */
+ fputs(buf, ofp);
+ }
+
+ /* Skip over an option block (matching # of braces) */
+ if (found) {
+ int obrace = 0, cbrace = 0;
+ for (;;) {
+ while (*p) {
+ if (*p == '{') obrace++;
+ if (*p == '}') cbrace++;
+ p++;
+ }
+ if (obrace && (obrace == cbrace))
+ break;
+ if (!fgets(buf, 1024, ifp))
+ break;
+ p = buf;
+ }
+
+ /* Just spool the remainder of the file out */
+ result = isc_stdio_read(buf, 1, 1024, ifp, &n);
+ while (n > 0U) {
+ if (result == ISC_R_EOF)
+ result = ISC_R_SUCCESS;
+ CHECK(result);
+ isc_stdio_write(buf, 1, n, ofp, NULL);
+ result = isc_stdio_read(buf, 1, 1024, ifp, &n);
+ }
+
+ /* Move temporary into place */
+ CHECK(isc_file_rename(tmpname, view->new_zone_file));
+ } else {
+ isc_log_write(ns_g_lctx, NS_LOGCATEGORY_GENERAL,
+ NS_LOGMODULE_SERVER, ISC_LOG_WARNING,
+ "deleted zone %s was missing from "
+ "new zone file", zonename);
+ goto cleanup;
+ }
+ }
+
+ /* Stop answering for this zone */
+ if (dns_zone_getdb(zone, &dbp) == ISC_R_SUCCESS) {
+ dns_db_detach(&dbp);
+ dns_zone_unload(zone);
+ }
+
+ CHECK(dns_zt_unmount(view->zonetable, zone));
+
+ isc_log_write(ns_g_lctx, NS_LOGCATEGORY_GENERAL,
+ NS_LOGMODULE_SERVER, ISC_LOG_INFO,
+ "zone %s removed via delzone", zonename);
+
+ result = ISC_R_SUCCESS;
+
+ cleanup:
+ if (ifp != NULL)
+ isc_stdio_close(ifp);
+ if (ofp != NULL) {
+ isc_stdio_close(ofp);
+ isc_file_remove(tmpname);
+ }
+ if (tmpname != NULL)
+ isc_mem_free(server->mctx, tmpname);
+ if (zone != NULL)
+ dns_zone_detach(&zone);
+
+ return (result);
+}
+
+static void
+cfgctx_destroy(void **cfgp) {
+ struct cfg_context *cfg;
+ isc_mem_t *mctx;
+
+ REQUIRE(cfgp != NULL && *cfgp != NULL);
+ cfg = *cfgp;
+ mctx = cfg->mctx;
+ cfg->mctx = NULL;
+
+ if (cfg->parser != NULL) {
+ if (cfg->config != NULL)
+ cfg_obj_destroy(cfg->parser, &cfg->config);
+ cfg_parser_destroy(&cfg->parser);
+ }
+ cfg_aclconfctx_clear(&cfg->actx);
+
+ isc_mem_put(mctx, cfg, sizeof(*cfg));
+ isc_mem_detach(&mctx);
+ *cfgp = NULL;
+}
diff --git a/contrib/bind9/bin/named/statschannel.c b/contrib/bind9/bin/named/statschannel.c
index c77d3ca..6dce8e0 100644
--- a/contrib/bind9/bin/named/statschannel.c
+++ b/contrib/bind9/bin/named/statschannel.c
@@ -14,7 +14,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: statschannel.c,v 1.14.64.11 2010-02-04 23:47:46 tbox Exp $ */
+/* $Id: statschannel.c,v 1.26 2010-02-04 23:49:13 tbox Exp $ */
/*! \file */
@@ -29,6 +29,7 @@
#include <isc/stats.h>
#include <isc/task.h>
+#include <dns/cache.h>
#include <dns/db.h>
#include <dns/opcode.h>
#include <dns/resolver.h>
@@ -823,9 +824,9 @@ generatexml(ns_server_t *server, int *buflen, xmlChar **buf) {
TRY0(xmlTextWriterStartElement(writer,
ISC_XMLCHAR "cache"));
TRY0(xmlTextWriterWriteAttribute(writer,
- ISC_XMLCHAR "name",
- ISC_XMLCHAR
- view->name));
+ ISC_XMLCHAR "name",
+ ISC_XMLCHAR
+ dns_cache_getname(view->cache)));
dumparg.result = ISC_R_SUCCESS;
dns_rdatasetstats_dump(cachestats, rdatasetstats_dump,
&dumparg, 0);
@@ -1405,7 +1406,15 @@ ns_stats_dump(ns_server_t *server, FILE *fp) {
if (strcmp(view->name, "_default") == 0)
fprintf(fp, "[View: default]\n");
else
- fprintf(fp, "[View: %s]\n", view->name);
+ fprintf(fp, "[View: %s (Cache: %s)]\n", view->name,
+ dns_cache_getname(view->cache));
+ if (dns_view_iscacheshared(view)) {
+ /*
+ * Avoid dumping redundant statistics when the cache is
+ * shared.
+ */
+ continue;
+ }
dns_rdatasetstats_dump(cachestats, rdatasetstats_dump, &dumparg,
0);
}
diff --git a/contrib/bind9/bin/named/tkeyconf.c b/contrib/bind9/bin/named/tkeyconf.c
index 7344978..66c2d7f 100644
--- a/contrib/bind9/bin/named/tkeyconf.c
+++ b/contrib/bind9/bin/named/tkeyconf.c
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004-2007 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004-2007, 2009, 2010 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 1999-2001 Internet Software Consortium.
*
* Permission to use, copy, modify, and/or distribute this software for any
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: tkeyconf.c,v 1.29 2007-06-19 23:46:59 tbox Exp $ */
+/* $Id: tkeyconf.c,v 1.33 2010-12-20 23:47:20 tbox Exp $ */
/*! \file */
@@ -77,8 +77,7 @@ ns_tkeyctx_fromconfig(const cfg_obj_t *options, isc_mem_t *mctx,
isc_buffer_add(&b, strlen(s));
dns_fixedname_init(&fname);
name = dns_fixedname_name(&fname);
- RETERR(dns_name_fromtext(name, &b, dns_rootname,
- ISC_FALSE, NULL));
+ RETERR(dns_name_fromtext(name, &b, dns_rootname, 0, NULL));
type = DST_TYPE_PUBLIC|DST_TYPE_PRIVATE|DST_TYPE_KEY;
RETERR(dst_key_fromfile(name, (dns_keytag_t) n, DNS_KEYALG_DH,
type, NULL, mctx, &tctx->dhkey));
@@ -92,8 +91,7 @@ ns_tkeyctx_fromconfig(const cfg_obj_t *options, isc_mem_t *mctx,
isc_buffer_add(&b, strlen(s));
dns_fixedname_init(&fname);
name = dns_fixedname_name(&fname);
- RETERR(dns_name_fromtext(name, &b, dns_rootname, ISC_FALSE,
- NULL));
+ RETERR(dns_name_fromtext(name, &b, dns_rootname, 0, NULL));
tctx->domain = isc_mem_get(mctx, sizeof(dns_name_t));
if (tctx->domain == NULL) {
result = ISC_R_NOMEMORY;
@@ -112,12 +110,22 @@ ns_tkeyctx_fromconfig(const cfg_obj_t *options, isc_mem_t *mctx,
isc_buffer_add(&b, strlen(s));
dns_fixedname_init(&fname);
name = dns_fixedname_name(&fname);
- RETERR(dns_name_fromtext(name, &b, dns_rootname, ISC_FALSE,
- NULL));
- RETERR(dst_gssapi_acquirecred(name, ISC_FALSE,
- &tctx->gsscred));
+ RETERR(dns_name_fromtext(name, &b, dns_rootname, 0, NULL));
+ RETERR(dst_gssapi_acquirecred(name, ISC_FALSE, &tctx->gsscred));
}
+ obj = NULL;
+ result = cfg_map_get(options, "tkey-gssapi-keytab", &obj);
+ if (result == ISC_R_SUCCESS) {
+ s = cfg_obj_asstring(obj);
+ tctx->gssapi_keytab = isc_mem_strdup(mctx, s);
+ if (tctx->gssapi_keytab == NULL) {
+ result = ISC_R_NOMEMORY;
+ goto failure;
+ }
+ }
+
+
*tctxp = tctx;
return (ISC_R_SUCCESS);
diff --git a/contrib/bind9/bin/named/tsigconf.c b/contrib/bind9/bin/named/tsigconf.c
index e90a86b..19e8d38 100644
--- a/contrib/bind9/bin/named/tsigconf.c
+++ b/contrib/bind9/bin/named/tsigconf.c
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004-2007 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004-2007, 2009, 2011 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 1999-2001 Internet Software Consortium.
*
* Permission to use, copy, modify, and/or distribute this software for any
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: tsigconf.c,v 1.30 2007-06-19 23:46:59 tbox Exp $ */
+/* $Id: tsigconf.c,v 1.35 2011-01-11 23:47:12 tbox Exp $ */
/*! \file */
@@ -82,7 +82,7 @@ add_initial_keys(const cfg_obj_t *list, dns_tsig_keyring_t *ring,
isc_buffer_add(&keynamesrc, strlen(keyid));
isc_buffer_init(&keynamebuf, keynamedata, sizeof(keynamedata));
ret = dns_name_fromtext(&keyname, &keynamesrc, dns_rootname,
- ISC_TRUE, &keynamebuf);
+ DNS_NAME_DOWNCASE, &keynamebuf);
if (ret != ISC_R_SUCCESS)
goto failure;
@@ -149,6 +149,8 @@ ns_tsigkeyring_fromconfig(const cfg_obj_t *config, const cfg_obj_t *vconfig,
isc_result_t result;
int i;
+ REQUIRE(ringp != NULL && *ringp == NULL);
+
i = 0;
if (config != NULL)
maps[i++] = config;
@@ -176,6 +178,6 @@ ns_tsigkeyring_fromconfig(const cfg_obj_t *config, const cfg_obj_t *vconfig,
return (ISC_R_SUCCESS);
failure:
- dns_tsigkeyring_destroy(&ring);
+ dns_tsigkeyring_detach(&ring);
return (result);
}
diff --git a/contrib/bind9/bin/named/unix/Makefile.in b/contrib/bind9/bin/named/unix/Makefile.in
index 502db25..ca92c49 100644
--- a/contrib/bind9/bin/named/unix/Makefile.in
+++ b/contrib/bind9/bin/named/unix/Makefile.in
@@ -1,4 +1,4 @@
-# Copyright (C) 2004, 2007 Internet Systems Consortium, Inc. ("ISC")
+# Copyright (C) 2004, 2007, 2009 Internet Systems Consortium, Inc. ("ISC")
# Copyright (C) 1999-2001 Internet Software Consortium.
#
# Permission to use, copy, modify, and/or distribute this software for any
@@ -13,7 +13,7 @@
# OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
# PERFORMANCE OF THIS SOFTWARE.
-# $Id: Makefile.in,v 1.10 2007-06-19 23:46:59 tbox Exp $
+# $Id: Makefile.in,v 1.13 2009-12-05 23:31:40 each Exp $
srcdir = @srcdir@
VPATH = @srcdir@
diff --git a/contrib/bind9/bin/named/unix/include/named/os.h b/contrib/bind9/bin/named/unix/include/named/os.h
index 0a84608..c2768f4 100644
--- a/contrib/bind9/bin/named/unix/include/named/os.h
+++ b/contrib/bind9/bin/named/unix/include/named/os.h
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004, 2005, 2007, 2008 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004, 2005, 2007-2009 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 1999-2002 Internet Software Consortium.
*
* Permission to use, copy, modify, and/or distribute this software for any
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: os.h,v 1.29 2008-10-24 01:44:48 tbox Exp $ */
+/* $Id: os.h,v 1.31 2009-08-05 23:47:43 tbox Exp $ */
#ifndef NS_OS_H
#define NS_OS_H 1
@@ -51,8 +51,12 @@ ns_os_adjustnofile(void);
void
ns_os_minprivs(void);
+FILE *
+ns_os_openfile(const char *filename, mode_t mode, isc_boolean_t switch_user);
+
void
ns_os_writepidfile(const char *filename, isc_boolean_t first_time);
+
void
ns_os_shutdown(void);
diff --git a/contrib/bind9/bin/named/unix/os.c b/contrib/bind9/bin/named/unix/os.c
index 3f07784..53e9e45 100644
--- a/contrib/bind9/bin/named/unix/os.c
+++ b/contrib/bind9/bin/named/unix/os.c
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004-2009 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004-2010 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 1999-2002 Internet Software Consortium.
*
* Permission to use, copy, modify, and/or distribute this software for any
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: os.c,v 1.89.12.5 2009-03-02 03:03:54 marka Exp $ */
+/* $Id: os.c,v 1.104 2010-11-17 23:47:08 tbox Exp $ */
/*! \file */
@@ -291,6 +291,12 @@ linux_initialprivs(void) {
*/
SET_CAP(CAP_SYS_RESOURCE);
+ /*
+ * We need to be able to set the ownership of the containing
+ * directory of the pid file when we create it.
+ */
+ SET_CAP(CAP_CHOWN);
+
linux_setcaps(caps);
#ifdef HAVE_LIBCAP
@@ -631,7 +637,7 @@ ns_os_minprivs(void) {
}
static int
-safe_open(const char *filename, isc_boolean_t append) {
+safe_open(const char *filename, mode_t mode, isc_boolean_t append) {
int fd;
struct stat sb;
@@ -644,13 +650,11 @@ safe_open(const char *filename, isc_boolean_t append) {
}
if (append)
- fd = open(filename, O_WRONLY|O_CREAT|O_APPEND,
- S_IRUSR|S_IWUSR|S_IRGRP|S_IROTH);
+ fd = open(filename, O_WRONLY|O_CREAT|O_APPEND, mode);
else {
if (unlink(filename) < 0 && errno != ENOENT)
return (-1);
- fd = open(filename, O_WRONLY|O_CREAT|O_EXCL,
- S_IRUSR|S_IWUSR|S_IRGRP|S_IROTH);
+ fd = open(filename, O_WRONLY|O_CREAT|O_EXCL, mode);
}
return (fd);
}
@@ -686,6 +690,15 @@ mkdirpath(char *filename, void (*report)(const char *, ...)) {
}
if (mkdirpath(filename, report) == -1)
goto error;
+ /*
+ * Handle "//", "/./" and "/../" in path.
+ */
+ if (!strcmp(slash + 1, "") ||
+ !strcmp(slash + 1, ".") ||
+ !strcmp(slash + 1, "..")) {
+ *slash = '/';
+ return (0);
+ }
mode = S_IRUSR | S_IWUSR | S_IXUSR; /* u=rwx */
mode |= S_IRGRP | S_IXGRP; /* g=rx */
mode |= S_IROTH | S_IXOTH; /* o=rx */
@@ -695,6 +708,13 @@ mkdirpath(char *filename, void (*report)(const char *, ...)) {
strbuf);
goto error;
}
+ if (runas_pw != NULL &&
+ chown(filename, runas_pw->pw_uid,
+ runas_pw->pw_gid) == -1) {
+ isc__strerror(errno, strbuf, sizeof(strbuf));
+ (*report)("couldn't chown '%s': %s", filename,
+ strbuf);
+ }
}
*slash = '/';
}
@@ -705,11 +725,127 @@ mkdirpath(char *filename, void (*report)(const char *, ...)) {
return (-1);
}
+static void
+setperms(uid_t uid, gid_t gid) {
+ char strbuf[ISC_STRERRORSIZE];
+#if !defined(HAVE_SETEGID) && defined(HAVE_SETRESGID)
+ gid_t oldgid, tmpg;
+#endif
+#if !defined(HAVE_SETEUID) && defined(HAVE_SETRESUID)
+ uid_t olduid, tmpu;
+#endif
+#if defined(HAVE_SETEGID)
+ if (getegid() != gid && setegid(gid) == -1) {
+ isc__strerror(errno, strbuf, sizeof(strbuf));
+ ns_main_earlywarning("unable to set effective gid to %ld: %s",
+ (long)gid, strbuf);
+ }
+#elif defined(HAVE_SETRESGID)
+ if (getresgid(&tmpg, &oldgid, &tmpg) == -1 || oldgid != gid) {
+ if (setresgid(-1, gid, -1) == -1) {
+ isc__strerror(errno, strbuf, sizeof(strbuf));
+ ns_main_earlywarning("unable to set effective "
+ "gid to %d: %s", gid, strbuf);
+ }
+ }
+#endif
+
+#if defined(HAVE_SETEUID)
+ if (geteuid() != uid && seteuid(uid) == -1) {
+ isc__strerror(errno, strbuf, sizeof(strbuf));
+ ns_main_earlywarning("unable to set effective uid to %ld: %s",
+ (long)uid, strbuf);
+ }
+#elif defined(HAVE_SETRESUID)
+ if (getresuid(&tmpu, &olduid, &tmpu) == -1 || olduid != uid) {
+ if (setresuid(-1, uid, -1) == -1) {
+ isc__strerror(errno, strbuf, sizeof(strbuf));
+ ns_main_earlywarning("unable to set effective "
+ "uid to %d: %s", uid, strbuf);
+ }
+ }
+#endif
+}
+
+FILE *
+ns_os_openfile(const char *filename, mode_t mode, isc_boolean_t switch_user) {
+ char strbuf[ISC_STRERRORSIZE], *f;
+ FILE *fp;
+ int fd;
+
+ /*
+ * Make the containing directory if it doesn't exist.
+ */
+ f = strdup(filename);
+ if (f == NULL) {
+ isc__strerror(errno, strbuf, sizeof(strbuf));
+ ns_main_earlywarning("couldn't strdup() '%s': %s",
+ filename, strbuf);
+ return (NULL);
+ }
+ if (mkdirpath(f, ns_main_earlywarning) == -1) {
+ free(f);
+ return (NULL);
+ }
+ free(f);
+
+ if (switch_user && runas_pw != NULL) {
+ /* Set UID/GID to the one we'll be running with eventually */
+ setperms(runas_pw->pw_uid, runas_pw->pw_gid);
+
+ fd = safe_open(filename, mode, ISC_FALSE);
+
+#ifndef HAVE_LINUXTHREADS
+ /* Restore UID/GID to root */
+ setperms(0, 0);
+#endif /* HAVE_LINUXTHREADS */
+
+ if (fd == -1) {
+#ifndef HAVE_LINUXTHREADS
+ fd = safe_open(filename, mode, ISC_FALSE);
+ if (fd != -1) {
+ ns_main_earlywarning("Required root "
+ "permissions to open "
+ "'%s'.", filename);
+ } else {
+ ns_main_earlywarning("Could not open "
+ "'%s'.", filename);
+ }
+ ns_main_earlywarning("Please check file and "
+ "directory permissions "
+ "or reconfigure the filename.");
+#else /* HAVE_LINUXTHREADS */
+ ns_main_earlywarning("Could not open "
+ "'%s'.", filename);
+ ns_main_earlywarning("Please check file and "
+ "directory permissions "
+ "or reconfigure the filename.");
+#endif /* HAVE_LINUXTHREADS */
+ }
+ } else {
+ fd = safe_open(filename, mode, ISC_FALSE);
+ }
+
+ if (fd < 0) {
+ isc__strerror(errno, strbuf, sizeof(strbuf));
+ ns_main_earlywarning("could not open file '%s': %s",
+ filename, strbuf);
+ return (NULL);
+ }
+
+ fp = fdopen(fd, "w");
+ if (fp == NULL) {
+ isc__strerror(errno, strbuf, sizeof(strbuf));
+ ns_main_earlywarning("could not fdopen() file '%s': %s",
+ filename, strbuf);
+ }
+
+ return (fp);
+}
+
void
ns_os_writepidfile(const char *filename, isc_boolean_t first_time) {
- int fd;
FILE *lockfile;
- size_t len;
pid_t pid;
char strbuf[ISC_STRERRORSIZE];
void (*report)(const char *, ...);
@@ -725,40 +861,16 @@ ns_os_writepidfile(const char *filename, isc_boolean_t first_time) {
if (filename == NULL)
return;
- len = strlen(filename);
- pidfile = malloc(len + 1);
+ pidfile = strdup(filename);
if (pidfile == NULL) {
isc__strerror(errno, strbuf, sizeof(strbuf));
- (*report)("couldn't malloc '%s': %s", filename, strbuf);
+ (*report)("couldn't strdup() '%s': %s", filename, strbuf);
return;
}
- /* This is safe. */
- strcpy(pidfile, filename);
-
- /*
- * Make the containing directory if it doesn't exist.
- */
- if (mkdirpath(pidfile, report) == -1) {
- free(pidfile);
- pidfile = NULL;
- return;
- }
-
- fd = safe_open(filename, ISC_FALSE);
- if (fd < 0) {
- isc__strerror(errno, strbuf, sizeof(strbuf));
- (*report)("couldn't open pid file '%s': %s", filename, strbuf);
- free(pidfile);
- pidfile = NULL;
- return;
- }
- lockfile = fdopen(fd, "w");
+ lockfile = ns_os_openfile(filename, S_IRUSR|S_IWUSR|S_IRGRP|S_IROTH,
+ first_time);
if (lockfile == NULL) {
- isc__strerror(errno, strbuf, sizeof(strbuf));
- (*report)("could not fdopen() pid file '%s': %s",
- filename, strbuf);
- (void)close(fd);
cleanup_pidfile();
return;
}
diff --git a/contrib/bind9/bin/named/update.c b/contrib/bind9/bin/named/update.c
index 1504a44..eb1ed1d 100644
--- a/contrib/bind9/bin/named/update.c
+++ b/contrib/bind9/bin/named/update.c
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004-2010 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004-2011 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 1999-2003 Internet Software Consortium.
*
* Permission to use, copy, modify, and/or distribute this software for any
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: update.c,v 1.151.12.11 2010-02-26 23:48:43 tbox Exp $ */
+/* $Id: update.c,v 1.186.16.1.2.1 2011-06-02 23:47:28 tbox Exp $ */
#include <config.h>
@@ -38,6 +38,7 @@
#include <dns/message.h>
#include <dns/nsec.h>
#include <dns/nsec3.h>
+#include <dns/private.h>
#include <dns/rdataclass.h>
#include <dns/rdataset.h>
#include <dns/rdatasetiter.h>
@@ -45,6 +46,7 @@
#include <dns/rdatatype.h>
#include <dns/soa.h>
#include <dns/ssu.h>
+#include <dns/tsig.h>
#include <dns/view.h>
#include <dns/zone.h>
#include <dns/zt.h>
@@ -281,6 +283,47 @@ inc_stats(dns_zone_t *zone, isc_statscounter_t counter) {
}
/*%
+ * Check if we could have queried for the contents of this zone or
+ * if the zone is potentially updateable.
+ * If the zone can potentially be updated and the check failed then
+ * log a error otherwise we log a informational message.
+ */
+static isc_result_t
+checkqueryacl(ns_client_t *client, dns_acl_t *queryacl, dns_name_t *zonename,
+ dns_acl_t *updateacl, dns_ssutable_t *ssutable)
+{
+ char namebuf[DNS_NAME_FORMATSIZE];
+ char classbuf[DNS_RDATACLASS_FORMATSIZE];
+ int level;
+ isc_result_t result;
+
+ result = ns_client_checkaclsilent(client, NULL, queryacl, ISC_TRUE);
+ if (result != ISC_R_SUCCESS) {
+ dns_name_format(zonename, namebuf, sizeof(namebuf));
+ dns_rdataclass_format(client->view->rdclass, classbuf,
+ sizeof(classbuf));
+
+ level = (updateacl == NULL && ssutable == NULL) ?
+ ISC_LOG_INFO : ISC_LOG_ERROR;
+
+ ns_client_log(client, NS_LOGCATEGORY_UPDATE_SECURITY,
+ NS_LOGMODULE_UPDATE, level,
+ "update '%s/%s' denied due to allow-query",
+ namebuf, classbuf);
+ } else if (updateacl == NULL && ssutable == NULL) {
+ dns_name_format(zonename, namebuf, sizeof(namebuf));
+ dns_rdataclass_format(client->view->rdclass, classbuf,
+ sizeof(classbuf));
+
+ result = DNS_R_REFUSED;
+ ns_client_log(client, NS_LOGCATEGORY_UPDATE_SECURITY,
+ NS_LOGMODULE_UPDATE, ISC_LOG_INFO,
+ "update '%s/%s' denied", namebuf, classbuf);
+ }
+ return (result);
+}
+
+/*%
* Override the default acl logging when checking whether a client
* can update the zone or whether we can forward the request to the
* master based on IP address.
@@ -809,6 +852,9 @@ typedef struct {
/* The ssu table to check against. */
dns_ssutable_t *table;
+
+ /* the key used for TKEY requests */
+ dst_key_t *key;
} ssu_check_t;
static isc_result_t
@@ -825,14 +871,14 @@ ssu_checkrule(void *data, dns_rdataset_t *rrset) {
return (ISC_R_SUCCESS);
result = dns_ssutable_checkrules(ssuinfo->table, ssuinfo->signer,
ssuinfo->name, ssuinfo->tcpaddr,
- rrset->type);
+ rrset->type, ssuinfo->key);
return (result == ISC_TRUE ? ISC_R_SUCCESS : ISC_R_FAILURE);
}
static isc_boolean_t
ssu_checkall(dns_db_t *db, dns_dbversion_t *ver, dns_name_t *name,
dns_ssutable_t *ssutable, dns_name_t *signer,
- isc_netaddr_t *tcpaddr)
+ isc_netaddr_t *tcpaddr, dst_key_t *key)
{
isc_result_t result;
ssu_check_t ssuinfo;
@@ -841,6 +887,7 @@ ssu_checkall(dns_db_t *db, dns_dbversion_t *ver, dns_name_t *name,
ssuinfo.table = ssutable;
ssuinfo.signer = signer;
ssuinfo.tcpaddr = tcpaddr;
+ ssuinfo.key = key;
result = foreach_rrset(db, ver, name, ssu_checkrule, &ssuinfo);
return (ISC_TF(result == ISC_R_SUCCESS));
}
@@ -889,7 +936,7 @@ temp_check_rrset(dns_difftuple_t *a, dns_difftuple_t *b) {
b->op == DNS_DIFFOP_EXISTS);
INSIST(a->rdata.type == b->rdata.type);
INSIST(dns_name_equal(&a->name, &b->name));
- if (dns_rdata_compare(&a->rdata, &b->rdata) != 0)
+ if (dns_rdata_casecompare(&a->rdata, &b->rdata) != 0)
return (DNS_R_NXRRSET);
a = ISC_LIST_NEXT(a, link);
b = ISC_LIST_NEXT(b, link);
@@ -917,7 +964,7 @@ temp_order(const void *av, const void *bv) {
r = (b->rdata.type - a->rdata.type);
if (r != 0)
return (r);
- r = dns_rdata_compare(&a->rdata, &b->rdata);
+ r = dns_rdata_casecompare(&a->rdata, &b->rdata);
return (r);
}
@@ -1146,7 +1193,7 @@ rr_equal_p(dns_rdata_t *update_rr, dns_rdata_t *db_rr) {
* dns_rdata_equal() (that used dns_name_equal()), since it
* would be faster. Not a priority.
*/
- return (dns_rdata_compare(update_rr, db_rr) == 0 ?
+ return (dns_rdata_casecompare(update_rr, db_rr) == 0 ?
ISC_TRUE : ISC_FALSE);
}
@@ -1208,11 +1255,10 @@ replaces_p(dns_rdata_t *update_rr, dns_rdata_t *db_rr) {
return (ISC_FALSE);
INSIST(db_rr->length >= 4 && update_rr->length >= 4);
/*
- * Replace records added in this UPDATE request.
+ * Replace NSEC3PARAM records that only differ by the
+ * flags field.
*/
if (db_rr->data[0] == update_rr->data[0] &&
- db_rr->data[1] & DNS_NSEC3FLAG_UPDATE &&
- update_rr->data[1] & DNS_NSEC3FLAG_UPDATE &&
memcmp(db_rr->data+2, update_rr->data+2,
update_rr->length - 2) == 0)
return (ISC_TRUE);
@@ -1293,7 +1339,7 @@ add_rr_prepare_action(void *data, rr_t *rr) {
* If the update RR is a "duplicate" of the update RR,
* the update should be silently ignored.
*/
- equal = ISC_TF(dns_rdata_compare(&rr->rdata, ctx->update_rr) == 0);
+ equal = ISC_TF(dns_rdata_casecompare(&rr->rdata, ctx->update_rr) == 0);
if (equal && rr->ttl == ctx->update_rr_ttl) {
ctx->ignore_add = ISC_TRUE;
return (ISC_R_SUCCESS);
@@ -1717,35 +1763,6 @@ next_active(ns_client_t *client, dns_zone_t *zone, dns_db_t *db,
return (result);
}
-static isc_boolean_t
-has_opt_bit(dns_db_t *db, dns_dbversion_t *version, dns_dbnode_t *node) {
- isc_result_t result;
- dns_rdata_t rdata = DNS_RDATA_INIT;
- dns_rdataset_t rdataset;
- isc_boolean_t has_bit = ISC_FALSE;
-
- dns_rdataset_init(&rdataset);
- CHECK(dns_db_findrdataset(db, node, version, dns_rdatatype_nsec,
- dns_rdatatype_none, 0, &rdataset, NULL));
- CHECK(dns_rdataset_first(&rdataset));
- dns_rdataset_current(&rdataset, &rdata);
- has_bit = dns_nsec_typepresent(&rdata, dns_rdatatype_opt);
- failure:
- if (dns_rdataset_isassociated(&rdataset))
- dns_rdataset_disassociate(&rdataset);
- return (has_bit);
-}
-
-static void
-set_bit(unsigned char *array, unsigned int index) {
- unsigned int shift, bit;
-
- shift = 7 - (index % 8);
- bit = 1 << shift;
-
- array[index / 8] |= bit;
-}
-
/*%
* Add a NSEC record for "name", recording the change in "diff".
* The existing NSEC is removed.
@@ -1777,24 +1794,6 @@ add_nsec(ns_client_t *client, dns_zone_t *zone, dns_db_t *db,
CHECK(dns_db_findnode(db, name, ISC_FALSE, &node));
dns_rdata_init(&rdata);
CHECK(dns_nsec_buildrdata(db, ver, node, target, buffer, &rdata));
- /*
- * Preserve the status of the OPT bit in the origin's NSEC record.
- */
- if (dns_name_equal(dns_db_origin(db), name) &&
- has_opt_bit(db, ver, node))
- {
- isc_region_t region;
- dns_name_t next;
-
- dns_name_init(&next, NULL);
- dns_rdata_toregion(&rdata, &region);
- dns_name_fromregion(&next, &region);
- isc_region_consume(&region, next.length);
- INSIST(region.length > (2 + dns_rdatatype_opt / 8) &&
- region.base[0] == 0 &&
- region.base[1] > dns_rdatatype_opt / 8);
- set_bit(region.base + 2, dns_rdatatype_opt);
- }
dns_db_detachnode(db, &node);
/*
@@ -1856,44 +1855,6 @@ find_zone_keys(dns_zone_t *zone, dns_db_t *db, dns_dbversion_t *ver,
return (result);
}
-static isc_boolean_t
-ksk_sanity(dns_db_t *db, dns_dbversion_t *ver) {
- isc_boolean_t ret = ISC_FALSE;
- isc_boolean_t have_ksk = ISC_FALSE, have_nonksk = ISC_FALSE;
- isc_result_t result;
- dns_dbnode_t *node = NULL;
- dns_rdataset_t rdataset;
- dns_rdata_t rdata = DNS_RDATA_INIT;
- dns_rdata_dnskey_t dnskey;
-
- dns_rdataset_init(&rdataset);
- CHECK(dns_db_findnode(db, dns_db_origin(db), ISC_FALSE, &node));
- CHECK(dns_db_findrdataset(db, node, ver, dns_rdatatype_dnskey, 0, 0,
- &rdataset, NULL));
- CHECK(dns_rdataset_first(&rdataset));
- while (result == ISC_R_SUCCESS && (!have_ksk || !have_nonksk)) {
- dns_rdataset_current(&rdataset, &rdata);
- CHECK(dns_rdata_tostruct(&rdata, &dnskey, NULL));
- if ((dnskey.flags & (DNS_KEYFLAG_OWNERMASK|DNS_KEYTYPE_NOAUTH))
- == DNS_KEYOWNER_ZONE) {
- if ((dnskey.flags & DNS_KEYFLAG_KSK) != 0)
- have_ksk = ISC_TRUE;
- else
- have_nonksk = ISC_TRUE;
- }
- dns_rdata_reset(&rdata);
- result = dns_rdataset_next(&rdataset);
- }
- if (have_ksk && have_nonksk)
- ret = ISC_TRUE;
- failure:
- if (dns_rdataset_isassociated(&rdataset))
- dns_rdataset_disassociate(&rdataset);
- if (node != NULL)
- dns_db_detachnode(db, &node);
- return (ret);
-}
-
/*%
* Add RRSIG records for an RRset, recording the change in "diff".
*/
@@ -1902,7 +1863,7 @@ add_sigs(ns_client_t *client, dns_zone_t *zone, dns_db_t *db,
dns_dbversion_t *ver, dns_name_t *name, dns_rdatatype_t type,
dns_diff_t *diff, dst_key_t **keys, unsigned int nkeys,
isc_stdtime_t inception, isc_stdtime_t expire,
- isc_boolean_t check_ksk)
+ isc_boolean_t check_ksk, isc_boolean_t keyset_kskonly)
{
isc_result_t result;
dns_dbnode_t *node = NULL;
@@ -1910,7 +1871,7 @@ add_sigs(ns_client_t *client, dns_zone_t *zone, dns_db_t *db,
dns_rdata_t sig_rdata = DNS_RDATA_INIT;
isc_buffer_t buffer;
unsigned char data[1024]; /* XXX */
- unsigned int i;
+ unsigned int i, j;
isc_boolean_t added_sig = ISC_FALSE;
isc_mem_t *mctx = client->mctx;
@@ -1926,13 +1887,52 @@ add_sigs(ns_client_t *client, dns_zone_t *zone, dns_db_t *db,
(isc_stdtime_t) 0, &rdataset, NULL));
dns_db_detachnode(db, &node);
+#define REVOKE(x) ((dst_key_flags(x) & DNS_KEYFLAG_REVOKE) != 0)
+#define KSK(x) ((dst_key_flags(x) & DNS_KEYFLAG_KSK) != 0)
+#define ALG(x) dst_key_alg(x)
+
+ /*
+ * If we are honoring KSK flags then we need to check that we
+ * have both KSK and non-KSK keys that are not revoked per
+ * algorithm.
+ */
for (i = 0; i < nkeys; i++) {
+ isc_boolean_t both = ISC_FALSE;
- if (check_ksk && type != dns_rdatatype_dnskey &&
- (dst_key_flags(keys[i]) & DNS_KEYFLAG_KSK) != 0)
+ if (!dst_key_isprivate(keys[i]))
continue;
- if (!dst_key_isprivate(keys[i]))
+ if (check_ksk && !REVOKE(keys[i])) {
+ isc_boolean_t have_ksk, have_nonksk;
+ if (KSK(keys[i])) {
+ have_ksk = ISC_TRUE;
+ have_nonksk = ISC_FALSE;
+ } else {
+ have_ksk = ISC_FALSE;
+ have_nonksk = ISC_TRUE;
+ }
+ for (j = 0; j < nkeys; j++) {
+ if (j == i || ALG(keys[i]) != ALG(keys[j]))
+ continue;
+ if (REVOKE(keys[j]))
+ continue;
+ if (KSK(keys[j]))
+ have_ksk = ISC_TRUE;
+ else
+ have_nonksk = ISC_TRUE;
+ both = have_ksk && have_nonksk;
+ if (both)
+ break;
+ }
+ }
+
+ if (both) {
+ if (type == dns_rdatatype_dnskey) {
+ if (!KSK(keys[i]) && keyset_kskonly)
+ continue;
+ } else if (KSK(keys[i]))
+ continue;
+ } else if (REVOKE(keys[i]) && type != dns_rdatatype_dnskey)
continue;
/* Calculate the signature, creating a RRSIG RDATA. */
@@ -1950,7 +1950,7 @@ add_sigs(ns_client_t *client, dns_zone_t *zone, dns_db_t *db,
}
if (!added_sig) {
update_log(client, zone, ISC_LOG_ERROR,
- "found no private keys, "
+ "found no active private keys, "
"unable to generate any signatures");
result = ISC_R_NOTFOUND;
}
@@ -2044,7 +2044,7 @@ add_exposed_sigs(ns_client_t *client, dns_zone_t *zone, dns_db_t *db,
dns_dbversion_t *ver, dns_name_t *name, isc_boolean_t cut,
dns_diff_t *diff, dst_key_t **keys, unsigned int nkeys,
isc_stdtime_t inception, isc_stdtime_t expire,
- isc_boolean_t check_ksk)
+ isc_boolean_t check_ksk, isc_boolean_t keyset_kskonly)
{
isc_result_t result;
dns_dbnode_t *node;
@@ -2090,7 +2090,8 @@ add_exposed_sigs(ns_client_t *client, dns_zone_t *zone, dns_db_t *db,
if (flag)
continue;;
result = add_sigs(client, zone, db, ver, name, type, diff,
- keys, nkeys, inception, expire, check_ksk);
+ keys, nkeys, inception, expire,
+ check_ksk, keyset_kskonly);
if (result != ISC_R_SUCCESS)
goto cleanup_iterator;
}
@@ -2120,8 +2121,7 @@ add_exposed_sigs(ns_client_t *client, dns_zone_t *zone, dns_db_t *db,
static isc_result_t
update_signatures(ns_client_t *client, dns_zone_t *zone, dns_db_t *db,
dns_dbversion_t *oldver, dns_dbversion_t *newver,
- dns_diff_t *diff, isc_uint32_t sigvalidityinterval,
- isc_boolean_t *deleted_zsk)
+ dns_diff_t *diff, isc_uint32_t sigvalidityinterval)
{
isc_result_t result;
dns_difftuple_t *t;
@@ -2130,7 +2130,7 @@ update_signatures(ns_client_t *client, dns_zone_t *zone, dns_db_t *db,
dns_diff_t sig_diff;
dns_diff_t nsec_diff;
dns_diff_t nsec_mindiff;
- isc_boolean_t flag;
+ isc_boolean_t flag, build_nsec, build_nsec3;
dst_key_t *zone_keys[MAXZONEKEYS];
unsigned int nkeys = 0;
unsigned int i;
@@ -2140,9 +2140,10 @@ update_signatures(ns_client_t *client, dns_zone_t *zone, dns_db_t *db,
dns_rdata_t rdata = DNS_RDATA_INIT;
dns_rdataset_t rdataset;
dns_dbnode_t *node = NULL;
- isc_boolean_t check_ksk;
+ isc_boolean_t check_ksk, keyset_kskonly;
isc_boolean_t unsecure;
isc_boolean_t cut;
+ dns_rdatatype_t privatetype = dns_zone_getprivatetype(zone);
dns_diff_init(client->mctx, &diffnames);
dns_diff_init(client->mctx, &affected);
@@ -2172,27 +2173,8 @@ update_signatures(ns_client_t *client, dns_zone_t *zone, dns_db_t *db,
*/
check_ksk = ISC_TF((dns_zone_getoptions(zone) &
DNS_ZONEOPT_UPDATECHECKKSK) != 0);
- /*
- * If we are not checking the ZSK flag then all DNSKEY's are
- * already signing all RRsets so we don't need to trigger special
- * changes.
- */
- if (*deleted_zsk && (!check_ksk || !ksk_sanity(db, oldver)))
- *deleted_zsk = ISC_FALSE;
-
- if (check_ksk) {
- check_ksk = ksk_sanity(db, newver);
- if (!check_ksk && ksk_sanity(db, oldver))
- update_log(client, zone, ISC_LOG_WARNING,
- "disabling update-check-ksk");
- }
-
- /*
- * If we have deleted a ZSK and we we still have some ZSK's
- * we don't need to convert the KSK's to a ZSK's.
- */
- if (*deleted_zsk && check_ksk)
- *deleted_zsk = ISC_FALSE;
+ keyset_kskonly = ISC_TF((dns_zone_getoptions(zone) &
+ DNS_ZONEOPT_DNSKEYKSKONLY) != 0);
/*
* Get the NSEC/NSEC3 TTL from the SOA MINIMUM field.
@@ -2259,7 +2241,7 @@ update_signatures(ns_client_t *client, dns_zone_t *zone, dns_db_t *db,
CHECK(add_sigs(client, zone, db, newver, name,
type, &sig_diff, zone_keys,
nkeys, inception, expire,
- check_ksk));
+ check_ksk, keyset_kskonly));
}
skip:
/* Skip any other updates to the same RRset. */
@@ -2289,12 +2271,11 @@ update_signatures(ns_client_t *client, dns_zone_t *zone, dns_db_t *db,
"removed any orphaned NSEC records");
/*
- * If we don't have a NSEC record at the origin then we need to
- * update the NSEC3 records.
+ * See if we need to build NSEC or NSEC3 chains.
*/
- CHECK(rrset_exists(db, newver, dns_db_origin(db), dns_rdatatype_nsec,
- 0, &flag));
- if (!flag)
+ CHECK(dns_private_chains(db, newver, privatetype, &build_nsec,
+ &build_nsec3));
+ if (!build_nsec)
goto update_nsec3;
update_log(client, zone, ISC_LOG_DEBUG(3), "rebuilding NSEC chain");
@@ -2398,16 +2379,25 @@ update_signatures(ns_client_t *client, dns_zone_t *zone, dns_db_t *db,
dns_rdatatype_any, 0, NULL, diff));
} else {
/*
- * This name is not obscured. It should have a NSEC.
+ * This name is not obscured. It needs to have a
+ * NSEC unless it is the at the origin, in which
+ * case it should already exist if there is a complete
+ * NSEC chain and if there isn't a complete NSEC chain
+ * we don't want to add one as that would signal that
+ * there is a complete NSEC chain.
*/
- CHECK(rrset_exists(db, newver, name,
- dns_rdatatype_nsec, 0, &flag));
- if (! flag)
- CHECK(add_placeholder_nsec(db, newver, name,
- diff));
+ if (!dns_name_equal(name, dns_db_origin(db))) {
+ CHECK(rrset_exists(db, newver, name,
+ dns_rdatatype_nsec, 0,
+ &flag));
+ if (!flag)
+ CHECK(add_placeholder_nsec(db, newver,
+ name, diff));
+ }
CHECK(add_exposed_sigs(client, zone, db, newver, name,
cut, diff, zone_keys, nkeys,
- inception, expire, check_ksk));
+ inception, expire, check_ksk,
+ keyset_kskonly));
}
}
@@ -2469,7 +2459,7 @@ update_signatures(ns_client_t *client, dns_zone_t *zone, dns_db_t *db,
CHECK(add_sigs(client, zone, db, newver, &t->name,
dns_rdatatype_nsec, &sig_diff,
zone_keys, nkeys, inception, expire,
- check_ksk));
+ check_ksk, keyset_kskonly));
} else {
INSIST(0);
}
@@ -2491,13 +2481,7 @@ update_signatures(ns_client_t *client, dns_zone_t *zone, dns_db_t *db,
INSIST(ISC_LIST_EMPTY(nsec_diff.tuples));
INSIST(ISC_LIST_EMPTY(nsec_mindiff.tuples));
- /*
- * Check if we have any active NSEC3 chains by looking for a
- * NSEC3PARAM RRset.
- */
- CHECK(rrset_exists(db, newver, dns_db_origin(db),
- dns_rdatatype_nsec3param, 0, &flag));
- if (!flag) {
+ if (!build_nsec3) {
update_log(client, zone, ISC_LOG_DEBUG(3),
"no NSEC3 chains to rebuild");
goto failure;
@@ -2521,6 +2505,7 @@ update_signatures(ns_client_t *client, dns_zone_t *zone, dns_db_t *db,
isc_boolean_t ns_existed, dname_existed;
isc_boolean_t ns_exists, dname_exists;
+ isc_boolean_t exists, existed;
if (t->rdata.type == dns_rdatatype_nsec ||
t->rdata.type == dns_rdatatype_rrsig) {
@@ -2539,7 +2524,9 @@ update_signatures(ns_client_t *client, dns_zone_t *zone, dns_db_t *db,
CHECK(rrset_exists(db, newver, name, dns_rdatatype_dname, 0,
&dname_exists));
- if ((ns_exists || dname_exists) == (ns_existed || dname_existed))
+ exists = ns_exists || dname_exists;
+ existed = ns_existed || dname_existed;
+ if (exists == existed)
goto nextname;
/*
* There was a delegation change. Mark all subdomains
@@ -2563,14 +2550,16 @@ update_signatures(ns_client_t *client, dns_zone_t *zone, dns_db_t *db,
if (!flag) {
CHECK(delete_if(rrsig_p, db, newver, name,
dns_rdatatype_any, 0, NULL, diff));
- CHECK(dns_nsec3_delnsec3s(db, newver, name,
- &nsec_diff));
+ CHECK(dns_nsec3_delnsec3sx(db, newver, name,
+ privatetype, &nsec_diff));
} else {
CHECK(add_exposed_sigs(client, zone, db, newver, name,
cut, diff, zone_keys, nkeys,
- inception, expire, check_ksk));
- CHECK(dns_nsec3_addnsec3s(db, newver, name, nsecttl,
- unsecure, &nsec_diff));
+ inception, expire, check_ksk,
+ keyset_kskonly));
+ CHECK(dns_nsec3_addnsec3sx(db, newver, name, nsecttl,
+ unsecure, privatetype,
+ &nsec_diff));
}
}
@@ -2601,7 +2590,8 @@ update_signatures(ns_client_t *client, dns_zone_t *zone, dns_db_t *db,
CHECK(add_sigs(client, zone, db, newver, &t->name,
dns_rdatatype_nsec3,
&sig_diff, zone_keys, nkeys,
- inception, expire, check_ksk));
+ inception, expire, check_ksk,
+ keyset_kskonly));
} else {
INSIST(0);
}
@@ -2734,6 +2724,7 @@ ns_update_start(ns_client_t *client, isc_result_t sigresult) {
switch(dns_zone_gettype(zone)) {
case dns_zone_master:
+ case dns_zone_dlz:
/*
* We can now fail due to a bad signature as we now know
* that we are the master.
@@ -2943,7 +2934,7 @@ rr_exists(dns_db_t *db, dns_dbversion_t *ver, dns_name_t *name,
result = dns_rdataset_next(&rdataset)) {
dns_rdata_t myrdata = DNS_RDATA_INIT;
dns_rdataset_current(&rdataset, &myrdata);
- if (!dns_rdata_compare(&myrdata, rdata))
+ if (!dns_rdata_casecompare(&myrdata, rdata))
break;
}
dns_rdataset_disassociate(&rdataset);
@@ -2961,7 +2952,9 @@ rr_exists(dns_db_t *db, dns_dbversion_t *ver, dns_name_t *name,
}
static isc_result_t
-get_iterations(dns_db_t *db, dns_dbversion_t *ver, unsigned int *iterationsp) {
+get_iterations(dns_db_t *db, dns_dbversion_t *ver, dns_rdatatype_t privatetype,
+ unsigned int *iterationsp)
+{
dns_dbnode_t *node = NULL;
dns_rdata_nsec3param_t nsec3param;
dns_rdataset_t rdataset;
@@ -2975,7 +2968,33 @@ get_iterations(dns_db_t *db, dns_dbversion_t *ver, unsigned int *iterationsp) {
return (result);
result = dns_db_findrdataset(db, node, ver, dns_rdatatype_nsec3param,
0, (isc_stdtime_t) 0, &rdataset, NULL);
- dns_db_detachnode(db, &node);
+ if (result == ISC_R_NOTFOUND)
+ goto try_private;
+ if (result != ISC_R_SUCCESS)
+ goto failure;
+
+ for (result = dns_rdataset_first(&rdataset);
+ result == ISC_R_SUCCESS;
+ result = dns_rdataset_next(&rdataset)) {
+ dns_rdata_t rdata = DNS_RDATA_INIT;
+ dns_rdataset_current(&rdataset, &rdata);
+ CHECK(dns_rdata_tostruct(&rdata, &nsec3param, NULL));
+ if ((nsec3param.flags & DNS_NSEC3FLAG_REMOVE) != 0)
+ continue;
+ if (nsec3param.iterations > iterations)
+ iterations = nsec3param.iterations;
+ }
+ if (result != ISC_R_NOMORE)
+ goto failure;
+
+ dns_rdataset_disassociate(&rdataset);
+
+ try_private:
+ if (privatetype == 0)
+ goto success;
+
+ result = dns_db_findrdataset(db, node, ver, privatetype,
+ 0, (isc_stdtime_t) 0, &rdataset, NULL);
if (result == ISC_R_NOTFOUND)
goto success;
if (result != ISC_R_SUCCESS)
@@ -2984,8 +3003,14 @@ get_iterations(dns_db_t *db, dns_dbversion_t *ver, unsigned int *iterationsp) {
for (result = dns_rdataset_first(&rdataset);
result == ISC_R_SUCCESS;
result = dns_rdataset_next(&rdataset)) {
+ unsigned char buf[DNS_NSEC3PARAM_BUFFERSIZE];
+ dns_rdata_t private = DNS_RDATA_INIT;
dns_rdata_t rdata = DNS_RDATA_INIT;
+
dns_rdataset_current(&rdataset, &rdata);
+ if (!dns_nsec3param_fromprivate(&private, &rdata,
+ buf, sizeof(buf)))
+ continue;
CHECK(dns_rdata_tostruct(&rdata, &nsec3param, NULL));
if ((nsec3param.flags & DNS_NSEC3FLAG_REMOVE) != 0)
continue;
@@ -3000,6 +3025,8 @@ get_iterations(dns_db_t *db, dns_dbversion_t *ver, unsigned int *iterationsp) {
result = ISC_R_SUCCESS;
failure:
+ if (node != NULL)
+ dns_db_detachnode(db, &node);
if (dns_rdataset_isassociated(&rdataset))
dns_rdataset_disassociate(&rdataset);
return (result);
@@ -3013,77 +3040,83 @@ static isc_result_t
check_dnssec(ns_client_t *client, dns_zone_t *zone, dns_db_t *db,
dns_dbversion_t *ver, dns_diff_t *diff)
{
- dns_diff_t temp_diff;
- dns_diffop_t op;
- dns_difftuple_t *tuple, *newtuple = NULL, *next;
- isc_boolean_t flag;
+ dns_difftuple_t *tuple;
+ isc_boolean_t nseconly = ISC_FALSE, nsec3 = ISC_FALSE;
isc_result_t result;
unsigned int iterations = 0, max;
+ dns_rdatatype_t privatetype = dns_zone_getprivatetype(zone);
- dns_diff_init(diff->mctx, &temp_diff);
-
- CHECK(dns_nsec_nseconly(db, ver, &flag));
+ /* Scan the tuples for an NSEC-only DNSKEY or an NSEC3PARAM */
+ for (tuple = ISC_LIST_HEAD(diff->tuples);
+ tuple != NULL;
+ tuple = ISC_LIST_NEXT(tuple, link)) {
+ if (tuple->op != DNS_DIFFOP_ADD)
+ continue;
- if (flag)
- CHECK(dns_nsec3_active(db, ver, ISC_FALSE, &flag));
- if (flag) {
- update_log(client, zone, ISC_LOG_WARNING,
- "NSEC only DNSKEYs and NSEC3 chains not allowed");
- } else {
- CHECK(get_iterations(db, ver, &iterations));
- CHECK(dns_nsec3_maxiterations(db, ver, client->mctx, &max));
- if (max != 0 && iterations > max) {
- flag = ISC_TRUE;
- update_log(client, zone, ISC_LOG_WARNING,
- "too many NSEC3 iterations (%u) for "
- "weakest DNSKEY (%u)", iterations, max);
+ if (tuple->rdata.type == dns_rdatatype_dnskey) {
+ isc_uint8_t alg;
+ alg = tuple->rdata.data[3];
+ if (alg == DST_ALG_RSAMD5 || alg == DST_ALG_RSASHA1 ||
+ alg == DST_ALG_DSA || alg == DST_ALG_ECC) {
+ nseconly = ISC_TRUE;
+ break;
+ }
+ } else if (tuple->rdata.type == dns_rdatatype_nsec3param) {
+ nsec3 = ISC_TRUE;
+ break;
}
}
- if (flag) {
- for (tuple = ISC_LIST_HEAD(diff->tuples);
- tuple != NULL;
- tuple = next) {
- next = ISC_LIST_NEXT(tuple, link);
- if (tuple->rdata.type != dns_rdatatype_dnskey &&
- tuple->rdata.type != dns_rdatatype_nsec3param)
- continue;
- op = (tuple->op == DNS_DIFFOP_DEL) ?
- DNS_DIFFOP_ADD : DNS_DIFFOP_DEL;
- CHECK(dns_difftuple_create(temp_diff.mctx, op,
- &tuple->name, tuple->ttl,
- &tuple->rdata, &newtuple));
- CHECK(do_one_tuple(&newtuple, db, ver, &temp_diff));
- INSIST(newtuple == NULL);
- }
- for (tuple = ISC_LIST_HEAD(temp_diff.tuples);
- tuple != NULL;
- tuple = ISC_LIST_HEAD(temp_diff.tuples)) {
- ISC_LIST_UNLINK(temp_diff.tuples, tuple, link);
- dns_diff_appendminimal(diff, &tuple);
- }
+
+ /* Check existing DB for NSEC-only DNSKEY */
+ if (!nseconly)
+ CHECK(dns_nsec_nseconly(db, ver, &nseconly));
+
+ /* Check existing DB for NSEC3 */
+ if (!nsec3)
+ CHECK(dns_nsec3_activex(db, ver, ISC_FALSE,
+ privatetype, &nsec3));
+
+ /* Refuse to allow NSEC3 with NSEC-only keys */
+ if (nseconly && nsec3) {
+ update_log(client, zone, ISC_LOG_ERROR,
+ "NSEC only DNSKEYs and NSEC3 chains not allowed");
+ result = DNS_R_REFUSED;
+ goto failure;
}
+ /* Verify NSEC3 params */
+ CHECK(get_iterations(db, ver, privatetype, &iterations));
+ CHECK(dns_nsec3_maxiterations(db, ver, client->mctx, &max));
+ if (max != 0 && iterations > max) {
+ update_log(client, zone, ISC_LOG_ERROR,
+ "too many NSEC3 iterations (%u) for "
+ "weakest DNSKEY (%u)", iterations, max);
+ result = DNS_R_REFUSED;
+ goto failure;
+ }
failure:
- dns_diff_clear(&temp_diff);
return (result);
}
-#ifdef ALLOW_NSEC3PARAM_UPDATE
/*
* Delay NSEC3PARAM changes as they need to be applied to the whole zone.
*/
static isc_result_t
add_nsec3param_records(ns_client_t *client, dns_zone_t *zone, dns_db_t *db,
- dns_name_t *name, dns_dbversion_t *ver, dns_diff_t *diff)
+ dns_dbversion_t *ver, dns_diff_t *diff)
{
isc_result_t result = ISC_R_SUCCESS;
dns_difftuple_t *tuple, *newtuple = NULL, *next;
dns_rdata_t rdata = DNS_RDATA_INIT;
- unsigned char buf[DNS_NSEC3PARAM_BUFFERSIZE];
+ unsigned char buf[DNS_NSEC3PARAM_BUFFERSIZE + 1];
dns_diff_t temp_diff;
dns_diffop_t op;
isc_boolean_t flag;
+ dns_name_t *name = dns_zone_getorigin(zone);
+ dns_rdatatype_t privatetype = dns_zone_getprivatetype(zone);
+ isc_uint32_t ttl = 0;
+ isc_boolean_t ttl_good = ISC_FALSE;
update_log(client, zone, ISC_LOG_DEBUG(3),
"checking for NSEC3PARAM changes");
@@ -3106,55 +3139,143 @@ add_nsec3param_records(ns_client_t *client, dns_zone_t *zone, dns_db_t *db,
ISC_LIST_APPEND(temp_diff.tuples, tuple, link);
}
+ /*
+ * Extract TTL changes pairs, we don't need to convert these to
+ * delayed changes.
+ */
for (tuple = ISC_LIST_HEAD(temp_diff.tuples);
tuple != NULL; tuple = next) {
-
if (tuple->op == DNS_DIFFOP_ADD) {
+ if (!ttl_good) {
+ /*
+ * Any adds here will contain the final
+ * NSEC3PARAM RRset TTL.
+ */
+ ttl = tuple->ttl;
+ ttl_good = ISC_TRUE;
+ }
+ /*
+ * Walk the temp_diff list looking for the
+ * corresponding delete.
+ */
+ next = ISC_LIST_HEAD(temp_diff.tuples);
+ while (next != NULL) {
+ unsigned char *next_data = next->rdata.data;
+ unsigned char *tuple_data = tuple->rdata.data;
+ if (next->op == DNS_DIFFOP_DEL &&
+ next->rdata.length == tuple->rdata.length &&
+ !memcmp(next_data, tuple_data,
+ next->rdata.length)) {
+ ISC_LIST_UNLINK(temp_diff.tuples, next,
+ link);
+ ISC_LIST_APPEND(diff->tuples, next,
+ link);
+ break;
+ }
+ next = ISC_LIST_NEXT(next, link);
+ }
+ /*
+ * If we have not found a pair move onto the next
+ * tuple.
+ */
+ if (next == NULL) {
+ next = ISC_LIST_NEXT(tuple, link);
+ continue;
+ }
+ /*
+ * Find the next tuple to be processed before
+ * unlinking then complete moving the pair to 'diff'.
+ */
+ next = ISC_LIST_NEXT(tuple, link);
+ ISC_LIST_UNLINK(temp_diff.tuples, tuple, link);
+ ISC_LIST_APPEND(diff->tuples, tuple, link);
+ } else
next = ISC_LIST_NEXT(tuple, link);
+ }
+
+ /*
+ * Preserve any ongoing changes from a BIND 9.6.x upgrade.
+ *
+ * Any NSEC3PARAM records with flags other than OPTOUT named
+ * in managing and should not be touched so revert such changes
+ * taking into account any TTL change of the NSEC3PARAM RRset.
+ */
+ for (tuple = ISC_LIST_HEAD(temp_diff.tuples);
+ tuple != NULL; tuple = next) {
+ next = ISC_LIST_NEXT(tuple, link);
+ if ((tuple->rdata.data[1] & ~DNS_NSEC3FLAG_OPTOUT) != 0) {
+ /*
+ * If we havn't had any adds then the tuple->ttl must
+ * be the original ttl and should be used for any
+ * future changes.
+ */
+ if (!ttl_good) {
+ ttl = tuple->ttl;
+ ttl_good = ISC_TRUE;
+ }
+ op = (tuple->op == DNS_DIFFOP_DEL) ?
+ DNS_DIFFOP_ADD : DNS_DIFFOP_DEL;
+ CHECK(dns_difftuple_create(diff->mctx, op, name,
+ ttl, &tuple->rdata,
+ &newtuple));
+ CHECK(do_one_tuple(&newtuple, db, ver, diff));
+ ISC_LIST_UNLINK(temp_diff.tuples, tuple, link);
+ dns_diff_appendminimal(diff, &tuple);
+ }
+ }
+
+ /*
+ * We now have just the actual changes to the NSEC3PARAM RRset.
+ * Convert the adds to delayed adds and the deletions into delayed
+ * deletions.
+ */
+ for (tuple = ISC_LIST_HEAD(temp_diff.tuples);
+ tuple != NULL; tuple = next) {
+ /*
+ * If we havn't had any adds then the tuple->ttl must be the
+ * original ttl and should be used for any future changes.
+ */
+ if (!ttl_good) {
+ ttl = tuple->ttl;
+ ttl_good = ISC_TRUE;
+ }
+ if (tuple->op == DNS_DIFFOP_ADD) {
+ /*
+ * Look for any deletes which match this ADD ignoring
+ * OPTOUT. We don't need to explictly remove them as
+ * they will be removed a side effect of processing
+ * the add.
+ */
+ next = ISC_LIST_HEAD(temp_diff.tuples);
while (next != NULL) {
unsigned char *next_data = next->rdata.data;
unsigned char *tuple_data = tuple->rdata.data;
- if (next_data[0] != tuple_data[0] ||
- /* Ignore flags. */
+ if (next->op != DNS_DIFFOP_DEL ||
+ next->rdata.length != tuple->rdata.length ||
+ next_data[0] != tuple_data[0] ||
next_data[2] != tuple_data[2] ||
next_data[3] != tuple_data[3] ||
- next_data[4] != tuple_data[4] ||
- !memcmp(&next_data[5], &tuple_data[5],
- tuple_data[4])) {
+ memcmp(next_data + 4, tuple_data + 4,
+ tuple->rdata.length - 4)) {
next = ISC_LIST_NEXT(next, link);
continue;
}
- op = (next->op == DNS_DIFFOP_DEL) ?
- DNS_DIFFOP_ADD : DNS_DIFFOP_DEL;
- CHECK(dns_difftuple_create(diff->mctx, op,
- name, next->ttl,
- &next->rdata,
- &newtuple));
- CHECK(do_one_tuple(&newtuple, db, ver, diff));
ISC_LIST_UNLINK(temp_diff.tuples, next, link);
- dns_diff_appendminimal(diff, &next);
- next = ISC_LIST_NEXT(tuple, link);
+ ISC_LIST_APPEND(diff->tuples, next, link);
+ next = ISC_LIST_HEAD(temp_diff.tuples);
}
-
- INSIST(tuple->rdata.data[1] & DNS_NSEC3FLAG_UPDATE);
-
/*
* See if we already have a CREATE request in progress.
*/
- dns_rdata_clone(&tuple->rdata, &rdata);
- INSIST(rdata.length <= sizeof(buf));
- memcpy(buf, rdata.data, rdata.length);
- buf[1] |= DNS_NSEC3FLAG_CREATE;
- buf[1] &= ~DNS_NSEC3FLAG_UPDATE;
- rdata.data = buf;
-
+ dns_nsec3param_toprivate(&tuple->rdata, &rdata,
+ privatetype, buf, sizeof(buf));
+ buf[2] |= DNS_NSEC3FLAG_CREATE;
CHECK(rr_exists(db, ver, name, &rdata, &flag));
if (!flag) {
CHECK(dns_difftuple_create(diff->mctx,
DNS_DIFFOP_ADD,
- name, tuple->ttl,
- &rdata,
+ name, 0, &rdata,
&newtuple));
CHECK(do_one_tuple(&newtuple, db, ver, diff));
}
@@ -3164,26 +3285,26 @@ add_nsec3param_records(ns_client_t *client, dns_zone_t *zone, dns_db_t *db,
* otherwise indentical chain with a reversed
* OPTOUT state.
*/
- buf[1] ^= DNS_NSEC3FLAG_OPTOUT;
+ buf[2] ^= DNS_NSEC3FLAG_OPTOUT;
CHECK(rr_exists(db, ver, name, &rdata, &flag));
if (flag) {
CHECK(dns_difftuple_create(diff->mctx,
DNS_DIFFOP_DEL,
- name, tuple->ttl,
- &rdata,
+ name, 0, &rdata,
&newtuple));
CHECK(do_one_tuple(&newtuple, db, ver, diff));
}
/*
- * Remove the temporary add record.
+ * Find the next tuple to be processed and remove the
+ * temporary add record.
*/
+ next = ISC_LIST_NEXT(tuple, link);
CHECK(dns_difftuple_create(diff->mctx, DNS_DIFFOP_DEL,
- name, tuple->ttl,
- &tuple->rdata, &newtuple));
+ name, ttl, &tuple->rdata,
+ &newtuple));
CHECK(do_one_tuple(&newtuple, db, ver, diff));
- next = ISC_LIST_NEXT(tuple, link);
ISC_LIST_UNLINK(temp_diff.tuples, tuple, link);
dns_diff_appendminimal(diff, &tuple);
dns_rdata_reset(&rdata);
@@ -3191,50 +3312,33 @@ add_nsec3param_records(ns_client_t *client, dns_zone_t *zone, dns_db_t *db,
next = ISC_LIST_NEXT(tuple, link);
}
- /*
- * Reverse any pending changes.
- */
for (tuple = ISC_LIST_HEAD(temp_diff.tuples);
tuple != NULL; tuple = next) {
- next = ISC_LIST_NEXT(tuple, link);
- if ((tuple->rdata.data[1] & ~DNS_NSEC3FLAG_OPTOUT) != 0) {
- op = (tuple->op == DNS_DIFFOP_DEL) ?
- DNS_DIFFOP_ADD : DNS_DIFFOP_DEL;
- CHECK(dns_difftuple_create(diff->mctx, op, name,
- tuple->ttl, &tuple->rdata,
- &newtuple));
- CHECK(do_one_tuple(&newtuple, db, ver, diff));
- ISC_LIST_UNLINK(temp_diff.tuples, tuple, link);
- dns_diff_appendminimal(diff, &tuple);
- }
- }
- /*
- * Convert deletions into delayed deletions.
- */
- for (tuple = ISC_LIST_HEAD(temp_diff.tuples);
- tuple != NULL; tuple = next) {
+ INSIST(ttl_good);
+
next = ISC_LIST_NEXT(tuple, link);
/*
* See if we already have a REMOVE request in progress.
*/
- dns_rdata_clone(&tuple->rdata, &rdata);
- INSIST(rdata.length <= sizeof(buf));
- memcpy(buf, rdata.data, rdata.length);
- buf[1] |= DNS_NSEC3FLAG_REMOVE;
- rdata.data = buf;
+ dns_nsec3param_toprivate(&tuple->rdata, &rdata, privatetype,
+ buf, sizeof(buf));
+
+ buf[2] |= DNS_NSEC3FLAG_REMOVE | DNS_NSEC3FLAG_NONSEC;
CHECK(rr_exists(db, ver, name, &rdata, &flag));
+ if (!flag) {
+ buf[2] &= ~DNS_NSEC3FLAG_NONSEC;
+ CHECK(rr_exists(db, ver, name, &rdata, &flag));
+ }
if (!flag) {
CHECK(dns_difftuple_create(diff->mctx, DNS_DIFFOP_ADD,
- name, tuple->ttl, &rdata,
- &newtuple));
+ name, 0, &rdata, &newtuple));
CHECK(do_one_tuple(&newtuple, db, ver, diff));
}
CHECK(dns_difftuple_create(diff->mctx, DNS_DIFFOP_ADD, name,
- tuple->ttl, &tuple->rdata,
- &newtuple));
+ ttl, &tuple->rdata, &newtuple));
CHECK(do_one_tuple(&newtuple, db, ver, diff));
ISC_LIST_UNLINK(temp_diff.tuples, tuple, link);
dns_diff_appendminimal(diff, &tuple);
@@ -3246,17 +3350,75 @@ add_nsec3param_records(ns_client_t *client, dns_zone_t *zone, dns_db_t *db,
dns_diff_clear(&temp_diff);
return (result);
}
-#endif
+
+static isc_result_t
+rollback_private(dns_db_t *db, dns_rdatatype_t privatetype,
+ dns_dbversion_t *ver, dns_diff_t *diff)
+{
+ dns_diff_t temp_diff;
+ dns_diffop_t op;
+ dns_difftuple_t *tuple, *newtuple = NULL, *next;
+ dns_name_t *name = dns_db_origin(db);
+ isc_mem_t *mctx = diff->mctx;
+ isc_result_t result;
+
+ if (privatetype == 0)
+ return (ISC_R_SUCCESS);
+
+ dns_diff_init(mctx, &temp_diff);
+
+ /*
+ * Extract the changes to be rolled back.
+ */
+ for (tuple = ISC_LIST_HEAD(diff->tuples);
+ tuple != NULL; tuple = next) {
+
+ next = ISC_LIST_NEXT(tuple, link);
+
+ if (tuple->rdata.type != privatetype ||
+ !dns_name_equal(name, &tuple->name))
+ continue;
+
+ /*
+ * Allow records which indicate that a zone has been
+ * signed with a DNSKEY to be be removed.
+ */
+ if (tuple->op == DNS_DIFFOP_DEL &&
+ tuple->rdata.length == 5 &&
+ tuple->rdata.data[0] != 0 &&
+ tuple->rdata.data[4] != 0)
+ continue;
+
+ ISC_LIST_UNLINK(diff->tuples, tuple, link);
+ ISC_LIST_PREPEND(temp_diff.tuples, tuple, link);
+ }
+
+ /*
+ * Rollback the changes.
+ */
+ while ((tuple = ISC_LIST_HEAD(temp_diff.tuples)) != NULL) {
+ op = (tuple->op == DNS_DIFFOP_DEL) ?
+ DNS_DIFFOP_ADD : DNS_DIFFOP_DEL;
+ CHECK(dns_difftuple_create(mctx, op, name, tuple->ttl,
+ &tuple->rdata, &newtuple));
+ CHECK(do_one_tuple(&newtuple, db, ver, &temp_diff));
+ }
+ result = ISC_R_SUCCESS;
+
+ failure:
+ dns_diff_clear(&temp_diff);
+ return (result);
+}
/*
* Add records to cause the delayed signing of the zone by added DNSKEY
* to remove the RRSIG records generated by a deleted DNSKEY.
*/
static isc_result_t
-add_signing_records(dns_db_t *db, dns_name_t *name, dns_dbversion_t *ver,
- dns_rdatatype_t privatetype, dns_diff_t *diff)
+add_signing_records(dns_db_t *db, dns_rdatatype_t privatetype,
+ dns_dbversion_t *ver, dns_diff_t *diff)
{
- dns_difftuple_t *tuple, *newtuple = NULL;
+ dns_difftuple_t *tuple, *newtuple = NULL, *next;
dns_rdata_dnskey_t dnskey;
dns_rdata_t rdata = DNS_RDATA_INIT;
isc_boolean_t flag;
@@ -3264,13 +3426,82 @@ add_signing_records(dns_db_t *db, dns_name_t *name, dns_dbversion_t *ver,
isc_result_t result = ISC_R_SUCCESS;
isc_uint16_t keyid;
unsigned char buf[5];
+ dns_name_t *name = dns_db_origin(db);
+ dns_diff_t temp_diff;
+
+ dns_diff_init(diff->mctx, &temp_diff);
+ /*
+ * Extract the DNSKEY tuples from the list.
+ */
for (tuple = ISC_LIST_HEAD(diff->tuples);
- tuple != NULL;
- tuple = ISC_LIST_NEXT(tuple, link)) {
+ tuple != NULL; tuple = next) {
+
+ next = ISC_LIST_NEXT(tuple, link);
+
if (tuple->rdata.type != dns_rdatatype_dnskey)
continue;
+ ISC_LIST_UNLINK(diff->tuples, tuple, link);
+ ISC_LIST_APPEND(temp_diff.tuples, tuple, link);
+ }
+
+ /*
+ * Extract TTL changes pairs, we don't need signing records for these.
+ */
+ for (tuple = ISC_LIST_HEAD(temp_diff.tuples);
+ tuple != NULL; tuple = next) {
+ if (tuple->op == DNS_DIFFOP_ADD) {
+ /*
+ * Walk the temp_diff list looking for the
+ * corresponding delete.
+ */
+ next = ISC_LIST_HEAD(temp_diff.tuples);
+ while (next != NULL) {
+ unsigned char *next_data = next->rdata.data;
+ unsigned char *tuple_data = tuple->rdata.data;
+ if (next->op == DNS_DIFFOP_DEL &&
+ dns_name_equal(&tuple->name, &next->name) &&
+ next->rdata.length == tuple->rdata.length &&
+ !memcmp(next_data, tuple_data,
+ next->rdata.length)) {
+ ISC_LIST_UNLINK(temp_diff.tuples, next,
+ link);
+ ISC_LIST_APPEND(diff->tuples, next,
+ link);
+ break;
+ }
+ next = ISC_LIST_NEXT(next, link);
+ }
+ /*
+ * If we have not found a pair move onto the next
+ * tuple.
+ */
+ if (next == NULL) {
+ next = ISC_LIST_NEXT(tuple, link);
+ continue;
+ }
+ /*
+ * Find the next tuple to be processed before
+ * unlinking then complete moving the pair to 'diff'.
+ */
+ next = ISC_LIST_NEXT(tuple, link);
+ ISC_LIST_UNLINK(temp_diff.tuples, tuple, link);
+ ISC_LIST_APPEND(diff->tuples, tuple, link);
+ } else
+ next = ISC_LIST_NEXT(tuple, link);
+ }
+
+ /*
+ * Process the remaining DNSKEY entries.
+ */
+ for (tuple = ISC_LIST_HEAD(temp_diff.tuples);
+ tuple != NULL;
+ tuple = ISC_LIST_HEAD(temp_diff.tuples)) {
+
+ ISC_LIST_UNLINK(temp_diff.tuples, tuple, link);
+ ISC_LIST_APPEND(diff->tuples, tuple, link);
+
dns_rdata_tostruct(&tuple->rdata, &dnskey, NULL);
if ((dnskey.flags &
(DNS_KEYFLAG_OWNERMASK|DNS_KEYTYPE_NOAUTH))
@@ -3278,6 +3509,7 @@ add_signing_records(dns_db_t *db, dns_name_t *name, dns_dbversion_t *ver,
continue;
dns_rdata_toregion(&tuple->rdata, &r);
+
keyid = dst_region_computeid(&r, dnskey.algorithm);
buf[0] = dnskey.algorithm;
@@ -3310,87 +3542,25 @@ add_signing_records(dns_db_t *db, dns_name_t *name, dns_dbversion_t *ver,
INSIST(newtuple == NULL);
}
}
+
failure:
+ dns_diff_clear(&temp_diff);
return (result);
}
-#ifdef ALLOW_NSEC3PARAM_UPDATE
-/*
- * Mark all NSEC3 chains for deletion without creating a NSEC chain as
- * a side effect of deleting the last chain.
- */
-static isc_result_t
-delete_chains(dns_db_t *db, dns_dbversion_t *ver, dns_name_t *origin,
- dns_diff_t *diff)
-{
- dns_dbnode_t *node = NULL;
- dns_difftuple_t *tuple = NULL;
- dns_name_t next;
- dns_rdata_t rdata = DNS_RDATA_INIT;
- dns_rdataset_t rdataset;
- isc_boolean_t flag;
- isc_result_t result = ISC_R_SUCCESS;
- unsigned char buf[DNS_NSEC3PARAM_BUFFERSIZE];
-
- dns_name_init(&next, NULL);
- dns_rdataset_init(&rdataset);
-
- result = dns_db_getoriginnode(db, &node);
- if (result != ISC_R_SUCCESS)
- return (result);
-
- /*
- * Cause all NSEC3 chains to be deleted.
- */
- result = dns_db_findrdataset(db, node, ver, dns_rdatatype_nsec3param,
- 0, (isc_stdtime_t) 0, &rdataset, NULL);
- if (result == ISC_R_NOTFOUND)
- goto success;
- if (result != ISC_R_SUCCESS)
- goto failure;
-
- for (result = dns_rdataset_first(&rdataset);
- result == ISC_R_SUCCESS;
- result = dns_rdataset_next(&rdataset)) {
- dns_rdataset_current(&rdataset, &rdata);
- INSIST(rdata.length <= sizeof(buf));
- memcpy(buf, rdata.data, rdata.length);
-
- if (buf[1] == (DNS_NSEC3FLAG_REMOVE | DNS_NSEC3FLAG_NONSEC)) {
- dns_rdata_reset(&rdata);
- continue;
- }
-
- CHECK(dns_difftuple_create(diff->mctx, DNS_DIFFOP_DEL,
- origin, 0, &rdata, &tuple));
- CHECK(do_one_tuple(&tuple, db, ver, diff));
- INSIST(tuple == NULL);
-
- buf[1] = DNS_NSEC3FLAG_REMOVE | DNS_NSEC3FLAG_NONSEC;
- rdata.data = buf;
-
- CHECK(rr_exists(db, ver, origin, &rdata, &flag));
+static isc_boolean_t
+isdnssec(dns_db_t *db, dns_dbversion_t *ver, dns_rdatatype_t privatetype) {
+ isc_result_t result;
+ isc_boolean_t build_nsec, build_nsec3;
- if (!flag) {
- CHECK(dns_difftuple_create(diff->mctx, DNS_DIFFOP_ADD,
- origin, 0, &rdata, &tuple));
- CHECK(do_one_tuple(&tuple, db, ver, diff));
- INSIST(tuple == NULL);
- }
- dns_rdata_reset(&rdata);
- }
- if (result != ISC_R_NOMORE)
- goto failure;
- success:
- result = ISC_R_SUCCESS;
+ if (dns_db_issecure(db))
+ return (ISC_TRUE);
- failure:
- if (dns_rdataset_isassociated(&rdataset))
- dns_rdataset_disassociate(&rdataset);
- dns_db_detachnode(db, &node);
- return (result);
+ result = dns_private_chains(db, ver, privatetype,
+ &build_nsec, &build_nsec3);
+ RUNTIME_CHECK(result == ISC_R_SUCCESS);
+ return (build_nsec || build_nsec3);
}
-#endif
static void
update_action(isc_task_t *task, isc_event_t *event) {
@@ -3414,15 +3584,10 @@ update_action(isc_task_t *task, isc_event_t *event) {
dns_fixedname_t tmpnamefixed;
dns_name_t *tmpname = NULL;
unsigned int options;
- isc_boolean_t deleted_zsk;
dns_difftuple_t *tuple;
dns_rdata_dnskey_t dnskey;
-#ifdef ALLOW_NSEC3PARAM_UPDATE
- unsigned char buf[DNS_NSEC3PARAM_BUFFERSIZE];
-#endif
-#if !defined(ALLOW_SECURE_TO_INSECURE) || !defined(ALLOW_INSECURE_TO_SECURE)
isc_boolean_t had_dnskey;
-#endif
+ dns_rdatatype_t privatetype = dns_zone_getprivatetype(zone);
INSIST(event->ev_type == DNS_EVENT_UPDATE);
@@ -3433,6 +3598,18 @@ update_action(isc_task_t *task, isc_event_t *event) {
zonename = dns_db_origin(db);
zoneclass = dns_db_class(db);
dns_zone_getssutable(zone, &ssutable);
+
+ /*
+ * Update message processing can leak record existance information
+ * so check that we are allowed to query this zone. Additionally
+ * if we would refuse all updates for this zone we bail out here.
+ */
+ CHECK(checkqueryacl(client, dns_zone_getqueryacl(zone), zonename,
+ dns_zone_getupdateacl(zone), ssutable));
+
+ /*
+ * Get old and new versions now that queryacl has been checked.
+ */
dns_db_currentversion(db, &oldver);
CHECK(dns_db_newversion(db, &ver));
@@ -3525,7 +3702,6 @@ update_action(isc_task_t *task, isc_event_t *event) {
if (result != ISC_R_NOMORE)
FAIL(result);
-
/*
* Perform the final check of the "rrset exists (value dependent)"
* prerequisites.
@@ -3619,31 +3795,31 @@ update_action(isc_task_t *task, isc_event_t *event) {
update_class);
FAIL(DNS_R_FORMERR);
}
+
/*
* draft-ietf-dnsind-simple-secure-update-01 says
* "Unlike traditional dynamic update, the client
* is forbidden from updating NSEC records."
*/
- if (dns_db_issecure(db)) {
- if (rdata.type == dns_rdatatype_nsec3) {
- FAILC(DNS_R_REFUSED,
- "explicit NSEC3 updates are not allowed "
- "in secure zones");
- } else if (rdata.type == dns_rdatatype_nsec) {
- FAILC(DNS_R_REFUSED,
- "explicit NSEC updates are not allowed "
- "in secure zones");
- } else if (rdata.type == dns_rdatatype_rrsig &&
- !dns_name_equal(name, zonename)) {
- FAILC(DNS_R_REFUSED,
- "explicit RRSIG updates are currently "
- "not supported in secure zones except "
- "at the apex");
- }
+ if (rdata.type == dns_rdatatype_nsec3) {
+ FAILC(DNS_R_REFUSED,
+ "explicit NSEC3 updates are not allowed "
+ "in secure zones");
+ } else if (rdata.type == dns_rdatatype_nsec) {
+ FAILC(DNS_R_REFUSED,
+ "explicit NSEC updates are not allowed "
+ "in secure zones");
+ } else if (rdata.type == dns_rdatatype_rrsig &&
+ !dns_name_equal(name, zonename)) {
+ FAILC(DNS_R_REFUSED,
+ "explicit RRSIG updates are currently "
+ "not supported in secure zones except "
+ "at the apex");
}
if (ssutable != NULL) {
isc_netaddr_t *tcpaddr, netaddr;
+ dst_key_t *tsigkey = NULL;
/*
* If this is a TCP connection then pass the
* address of the client through for tcp-self
@@ -3656,16 +3832,22 @@ update_action(isc_task_t *task, isc_event_t *event) {
tcpaddr = &netaddr;
} else
tcpaddr = NULL;
+
+ if (client->message->tsigkey != NULL)
+ tsigkey = client->message->tsigkey->key;
+
if (rdata.type != dns_rdatatype_any) {
if (!dns_ssutable_checkrules(ssutable,
client->signer,
name, tcpaddr,
- rdata.type))
+ rdata.type,
+ tsigkey))
FAILC(DNS_R_REFUSED,
"rejected by secure update");
} else {
if (!ssu_checkall(db, ver, name, ssutable,
- client->signer, tcpaddr))
+ client->signer, tcpaddr,
+ tsigkey))
FAILC(DNS_R_REFUSED,
"rejected by secure update");
}
@@ -3774,7 +3956,14 @@ update_action(isc_task_t *task, isc_event_t *event) {
soa_serial_changed = ISC_TRUE;
}
-#ifdef ALLOW_NSEC3PARAM_UPDATE
+ if (rdata.type == privatetype) {
+ update_log(client, zone, LOGLEVEL_PROTOCOL,
+ "attempt to add a private type "
+ "(%u) record rejected internal "
+ "use only", privatetype);
+ continue;
+ }
+
if (rdata.type == dns_rdatatype_nsec3param) {
/*
* Ignore attempts to add NSEC3PARAM records
@@ -3788,27 +3977,7 @@ update_action(isc_task_t *task, isc_event_t *event) {
"flag");
continue;
}
-
- /*
- * Set the NSEC3CHAIN creation flag.
- */
- INSIST(rdata.length <= sizeof(buf));
- memcpy(buf, rdata.data, rdata.length);
- buf[1] |= DNS_NSEC3FLAG_UPDATE;
- rdata.data = buf;
- /*
- * Force the TTL to zero for NSEC3PARAM records.
- */
- ttl = 0;
}
-#else
- if (rdata.type == dns_rdatatype_nsec3param) {
- update_log(client, zone, LOGLEVEL_PROTOCOL,
- "attempt to add NSEC3PARAM "
- "record ignored");
- continue;
- };
-#endif
if ((options & DNS_ZONEOPT_CHECKWILDCARD) != 0 &&
dns_name_internalwildcard(name)) {
@@ -3885,13 +4054,6 @@ update_action(isc_task_t *task, isc_event_t *event) {
dns_rdatatype_any, 0,
&rdata, &diff));
}
-#ifndef ALLOW_NSEC3PARAM_UPDATE
- } else if (rdata.type == dns_rdatatype_nsec3param) {
- update_log(client, zone, LOGLEVEL_PROTOCOL,
- "attempt to delete a NSEC3PARAM "
- "records ignored");
- continue;
-#endif
} else if (dns_name_equal(name, zonename) &&
(rdata.type == dns_rdatatype_soa ||
rdata.type == dns_rdatatype_ns)) {
@@ -3920,6 +4082,9 @@ update_action(isc_task_t *task, isc_event_t *event) {
&diff));
}
} else if (update_class == dns_rdataclass_none) {
+ char namestr[DNS_NAME_FORMATSIZE];
+ char typestr[DNS_RDATATYPE_FORMATSIZE];
+
/*
* The (name == zonename) condition appears in
* RFC2136 3.4.2.4 but is missing from the pseudocode.
@@ -3947,11 +4112,13 @@ update_action(isc_task_t *task, isc_event_t *event) {
}
}
}
- update_log(client, zone,
- LOGLEVEL_PROTOCOL,
- "deleting an RR");
- CHECK(delete_if(rr_equal_p, db, ver, name,
- rdata.type, covers, &rdata, &diff));
+ dns_name_format(name, namestr, sizeof(namestr));
+ dns_rdatatype_format(rdata.type, typestr,
+ sizeof(typestr));
+ update_log(client, zone, LOGLEVEL_PROTOCOL,
+ "deleting an RR at %s %s", namestr, typestr);
+ CHECK(delete_if(rr_equal_p, db, ver, name, rdata.type,
+ covers, &rdata, &diff));
}
}
if (result != ISC_R_NOMORE)
@@ -3965,6 +4132,18 @@ update_action(isc_task_t *task, isc_event_t *event) {
if (! ISC_LIST_EMPTY(diff.tuples))
CHECK(check_dnssec(client, zone, db, ver, &diff));
+ if (! ISC_LIST_EMPTY(diff.tuples)) {
+ unsigned int errors = 0;
+ CHECK(dns_zone_nscheck(zone, db, ver, &errors));
+ if (errors != 0) {
+ update_log(client, zone, LOGLEVEL_PROTOCOL,
+ "update rejected: post update name server "
+ "sanity check failed");
+ result = DNS_R_REFUSED;
+ goto failure;
+ }
+ }
+
/*
* If any changes were made, increment the SOA serial number,
* update RRSIGs and NSECs (if zone is secure), and write the update
@@ -3990,37 +4169,29 @@ update_action(isc_task_t *task, isc_event_t *event) {
CHECK(rrset_exists(db, ver, zonename, dns_rdatatype_dnskey,
0, &has_dnskey));
-#if !defined(ALLOW_SECURE_TO_INSECURE) || !defined(ALLOW_INSECURE_TO_SECURE)
- CHECK(rrset_exists(db, oldver, zonename, dns_rdatatype_dnskey,
- 0, &had_dnskey));
+#define ALLOW_SECURE_TO_INSECURE(zone) \
+ ((dns_zone_getoptions(zone) & DNS_ZONEOPT_SECURETOINSECURE) != 0)
-#ifndef ALLOW_SECURE_TO_INSECURE
- if (had_dnskey && !has_dnskey) {
- update_log(client, zone, LOGLEVEL_PROTOCOL,
- "update rejected: all DNSKEY records "
- "removed");
- result = DNS_R_REFUSED;
- goto failure;
- }
-#endif
-#ifndef ALLOW_INSECURE_TO_SECURE
- if (!had_dnskey && has_dnskey) {
- update_log(client, zone, LOGLEVEL_PROTOCOL,
- "update rejected: DNSKEY record added");
- result = DNS_R_REFUSED;
- goto failure;
+ if (!ALLOW_SECURE_TO_INSECURE(zone)) {
+ CHECK(rrset_exists(db, oldver, zonename,
+ dns_rdatatype_dnskey, 0,
+ &had_dnskey));
+ if (had_dnskey && !has_dnskey) {
+ update_log(client, zone, LOGLEVEL_PROTOCOL,
+ "update rejected: all DNSKEY "
+ "records removed and "
+ "'dnssec-secure-to-insecure' "
+ "not set");
+ result = DNS_R_REFUSED;
+ goto failure;
+ }
}
-#endif
-#endif
- CHECK(add_signing_records(db, zonename, ver,
- dns_zone_getprivatetype(zone),
- &diff));
+ CHECK(rollback_private(db, privatetype, ver, &diff));
+
+ CHECK(add_signing_records(db, privatetype, ver, &diff));
-#ifdef ALLOW_NSEC3PARAM_UPDATE
- CHECK(add_nsec3param_records(client, zone, db, zonename,
- ver, &diff));
-#endif
+ CHECK(add_nsec3param_records(client, zone, db, ver, &diff));
if (!has_dnskey) {
/*
@@ -4029,15 +4200,13 @@ update_action(isc_task_t *task, isc_event_t *event) {
* the last signature for the DNSKEY records are
* remove any NSEC chain present will also be removed.
*/
-#ifdef ALLOW_NSEC3PARAM_UPDATE
- CHECK(delete_chains(db, ver, zonename, &diff));
-#endif
- } else if (has_dnskey && dns_db_isdnssec(db)) {
+ CHECK(dns_nsec3param_deletechains(db, ver, zone,
+ &diff));
+ } else if (has_dnskey && isdnssec(db, ver, privatetype)) {
isc_uint32_t interval;
interval = dns_zone_getsigvalidityinterval(zone);
result = update_signatures(client, zone, db, oldver,
- ver, &diff, interval,
- &deleted_zsk);
+ ver, &diff, interval);
if (result != ISC_R_SUCCESS) {
update_log(client, zone,
ISC_LOG_ERROR,
@@ -4123,7 +4292,6 @@ update_action(isc_task_t *task, isc_event_t *event) {
}
}
-#ifdef ALLOW_NSEC3PARAM_UPDATE
/*
* Cause the zone to add/delete NSEC3 chains for the
* deferred NSEC3PARAM changes.
@@ -4133,13 +4301,18 @@ update_action(isc_task_t *task, isc_event_t *event) {
for (tuple = ISC_LIST_HEAD(diff.tuples);
tuple != NULL;
tuple = ISC_LIST_NEXT(tuple, link)) {
+ unsigned char buf[DNS_NSEC3PARAM_BUFFERSIZE];
+ dns_rdata_t rdata = DNS_RDATA_INIT;
dns_rdata_nsec3param_t nsec3param;
- if (tuple->rdata.type != dns_rdatatype_nsec3param ||
+ if (tuple->rdata.type != privatetype ||
tuple->op != DNS_DIFFOP_ADD)
continue;
- dns_rdata_tostruct(&tuple->rdata, &nsec3param, NULL);
+ if (!dns_nsec3param_fromprivate(&tuple->rdata, &rdata,
+ buf, sizeof(buf)))
+ continue;
+ dns_rdata_tostruct(&rdata, &nsec3param, NULL);
if (nsec3param.flags == 0)
continue;
@@ -4150,7 +4323,6 @@ update_action(isc_task_t *task, isc_event_t *event) {
dns_result_totext(result));
}
}
-#endif
} else {
update_log(client, zone, LOGLEVEL_DEBUG, "redundant request");
dns_db_closeversion(db, &ver, ISC_TRUE);
diff --git a/contrib/bind9/bin/named/xfrout.c b/contrib/bind9/bin/named/xfrout.c
index e61dc72..b036ed1 100644
--- a/contrib/bind9/bin/named/xfrout.c
+++ b/contrib/bind9/bin/named/xfrout.c
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: xfrout.c,v 1.131.26.6 2010-05-27 23:48:18 tbox Exp $ */
+/* $Id: xfrout.c,v 1.139 2010-12-18 01:56:19 each Exp $ */
#include <config.h>
@@ -40,6 +40,7 @@
#include <dns/rdataset.h>
#include <dns/rdatasetiter.h>
#include <dns/result.h>
+#include <dns/rriterator.h>
#include <dns/soa.h>
#include <dns/stats.h>
#include <dns/timer.h>
@@ -112,43 +113,6 @@
} while (0)
/**************************************************************************/
-/*%
- * A db_rr_iterator_t is an iterator that iterates over an entire database,
- * returning one RR at a time, in some arbitrary order.
- */
-
-typedef struct db_rr_iterator db_rr_iterator_t;
-
-/*% db_rr_iterator structure */
-struct db_rr_iterator {
- isc_result_t result;
- dns_db_t *db;
- dns_dbiterator_t *dbit;
- dns_dbversion_t *ver;
- isc_stdtime_t now;
- dns_dbnode_t *node;
- dns_fixedname_t fixedname;
- dns_rdatasetiter_t *rdatasetit;
- dns_rdataset_t rdataset;
- dns_rdata_t rdata;
-};
-
-static isc_result_t
-db_rr_iterator_init(db_rr_iterator_t *it, dns_db_t *db, dns_dbversion_t *ver,
- isc_stdtime_t now);
-
-static isc_result_t
-db_rr_iterator_first(db_rr_iterator_t *it);
-
-static isc_result_t
-db_rr_iterator_next(db_rr_iterator_t *it);
-
-static void
-db_rr_iterator_current(db_rr_iterator_t *it, dns_name_t **name,
- isc_uint32_t *ttl, dns_rdata_t **rdata);
-
-static void
-db_rr_iterator_destroy(db_rr_iterator_t *it);
static inline void
inc_stats(dns_zone_t *zone, isc_statscounter_t counter) {
@@ -160,145 +124,6 @@ inc_stats(dns_zone_t *zone, isc_statscounter_t counter) {
}
}
-static isc_result_t
-db_rr_iterator_init(db_rr_iterator_t *it, dns_db_t *db, dns_dbversion_t *ver,
- isc_stdtime_t now)
-{
- isc_result_t result;
- it->db = db;
- it->dbit = NULL;
- it->ver = ver;
- it->now = now;
- it->node = NULL;
- result = dns_db_createiterator(it->db, 0, &it->dbit);
- if (result != ISC_R_SUCCESS)
- return (result);
- it->rdatasetit = NULL;
- dns_rdata_init(&it->rdata);
- dns_rdataset_init(&it->rdataset);
- dns_fixedname_init(&it->fixedname);
- INSIST(! dns_rdataset_isassociated(&it->rdataset));
- it->result = ISC_R_SUCCESS;
- return (it->result);
-}
-
-static isc_result_t
-db_rr_iterator_first(db_rr_iterator_t *it) {
- it->result = dns_dbiterator_first(it->dbit);
- /*
- * The top node may be empty when out of zone glue exists.
- * Walk the tree to find the first node with data.
- */
- while (it->result == ISC_R_SUCCESS) {
- it->result = dns_dbiterator_current(it->dbit, &it->node,
- dns_fixedname_name(&it->fixedname));
- if (it->result != ISC_R_SUCCESS)
- return (it->result);
-
- it->result = dns_db_allrdatasets(it->db, it->node,
- it->ver, it->now,
- &it->rdatasetit);
- if (it->result != ISC_R_SUCCESS)
- return (it->result);
-
- it->result = dns_rdatasetiter_first(it->rdatasetit);
- if (it->result != ISC_R_SUCCESS) {
- /*
- * This node is empty. Try next node.
- */
- dns_rdatasetiter_destroy(&it->rdatasetit);
- dns_db_detachnode(it->db, &it->node);
- it->result = dns_dbiterator_next(it->dbit);
- continue;
- }
- dns_rdatasetiter_current(it->rdatasetit, &it->rdataset);
- it->rdataset.attributes |= DNS_RDATASETATTR_LOADORDER;
- it->result = dns_rdataset_first(&it->rdataset);
- return (it->result);
- }
- return (it->result);
-}
-
-
-static isc_result_t
-db_rr_iterator_next(db_rr_iterator_t *it) {
- if (it->result != ISC_R_SUCCESS)
- return (it->result);
-
- INSIST(it->dbit != NULL);
- INSIST(it->node != NULL);
- INSIST(it->rdatasetit != NULL);
-
- it->result = dns_rdataset_next(&it->rdataset);
- if (it->result == ISC_R_NOMORE) {
- dns_rdataset_disassociate(&it->rdataset);
- it->result = dns_rdatasetiter_next(it->rdatasetit);
- /*
- * The while loop body is executed more than once
- * only when an empty dbnode needs to be skipped.
- */
- while (it->result == ISC_R_NOMORE) {
- dns_rdatasetiter_destroy(&it->rdatasetit);
- dns_db_detachnode(it->db, &it->node);
- it->result = dns_dbiterator_next(it->dbit);
- if (it->result == ISC_R_NOMORE) {
- /* We are at the end of the entire database. */
- return (it->result);
- }
- if (it->result != ISC_R_SUCCESS)
- return (it->result);
- it->result = dns_dbiterator_current(it->dbit,
- &it->node,
- dns_fixedname_name(&it->fixedname));
- if (it->result != ISC_R_SUCCESS)
- return (it->result);
- it->result = dns_db_allrdatasets(it->db, it->node,
- it->ver, it->now,
- &it->rdatasetit);
- if (it->result != ISC_R_SUCCESS)
- return (it->result);
- it->result = dns_rdatasetiter_first(it->rdatasetit);
- }
- if (it->result != ISC_R_SUCCESS)
- return (it->result);
- dns_rdatasetiter_current(it->rdatasetit, &it->rdataset);
- it->rdataset.attributes |= DNS_RDATASETATTR_LOADORDER;
- it->result = dns_rdataset_first(&it->rdataset);
- if (it->result != ISC_R_SUCCESS)
- return (it->result);
- }
- return (it->result);
-}
-
-static void
-db_rr_iterator_pause(db_rr_iterator_t *it) {
- RUNTIME_CHECK(dns_dbiterator_pause(it->dbit) == ISC_R_SUCCESS);
-}
-
-static void
-db_rr_iterator_destroy(db_rr_iterator_t *it) {
- if (dns_rdataset_isassociated(&it->rdataset))
- dns_rdataset_disassociate(&it->rdataset);
- if (it->rdatasetit != NULL)
- dns_rdatasetiter_destroy(&it->rdatasetit);
- if (it->node != NULL)
- dns_db_detachnode(it->db, &it->node);
- dns_dbiterator_destroy(&it->dbit);
-}
-
-static void
-db_rr_iterator_current(db_rr_iterator_t *it, dns_name_t **name,
- isc_uint32_t *ttl, dns_rdata_t **rdata)
-{
- REQUIRE(name != NULL && *name == NULL);
- REQUIRE(it->result == ISC_R_SUCCESS);
- *name = dns_fixedname_name(&it->fixedname);
- *ttl = it->rdataset.ttl;
- dns_rdata_reset(&it->rdata);
- dns_rdataset_current(&it->rdataset, &it->rdata);
- *rdata = &it->rdata;
-}
-
/**************************************************************************/
/*% Log an RR (for debugging) */
@@ -488,7 +313,7 @@ static rrstream_methods_t ixfr_rrstream_methods = {
typedef struct axfr_rrstream {
rrstream_t common;
- db_rr_iterator_t it;
+ dns_rriterator_t it;
isc_boolean_t it_valid;
} axfr_rrstream_t;
@@ -516,7 +341,7 @@ axfr_rrstream_create(isc_mem_t *mctx, dns_db_t *db, dns_dbversion_t *ver,
s->common.methods = &axfr_rrstream_methods;
s->it_valid = ISC_FALSE;
- CHECK(db_rr_iterator_init(&s->it, db, ver, 0));
+ CHECK(dns_rriterator_init(&s->it, db, ver, 0));
s->it_valid = ISC_TRUE;
*sp = (rrstream_t *) s;
@@ -531,7 +356,7 @@ static isc_result_t
axfr_rrstream_first(rrstream_t *rs) {
axfr_rrstream_t *s = (axfr_rrstream_t *) rs;
isc_result_t result;
- result = db_rr_iterator_first(&s->it);
+ result = dns_rriterator_first(&s->it);
if (result != ISC_R_SUCCESS)
return (result);
/* Skip SOA records. */
@@ -539,11 +364,11 @@ axfr_rrstream_first(rrstream_t *rs) {
dns_name_t *name_dummy = NULL;
isc_uint32_t ttl_dummy;
dns_rdata_t *rdata = NULL;
- db_rr_iterator_current(&s->it, &name_dummy,
- &ttl_dummy, &rdata);
+ dns_rriterator_current(&s->it, &name_dummy,
+ &ttl_dummy, NULL, &rdata);
if (rdata->type != dns_rdatatype_soa)
break;
- result = db_rr_iterator_next(&s->it);
+ result = dns_rriterator_next(&s->it);
if (result != ISC_R_SUCCESS)
break;
}
@@ -560,11 +385,11 @@ axfr_rrstream_next(rrstream_t *rs) {
dns_name_t *name_dummy = NULL;
isc_uint32_t ttl_dummy;
dns_rdata_t *rdata = NULL;
- result = db_rr_iterator_next(&s->it);
+ result = dns_rriterator_next(&s->it);
if (result != ISC_R_SUCCESS)
break;
- db_rr_iterator_current(&s->it, &name_dummy,
- &ttl_dummy, &rdata);
+ dns_rriterator_current(&s->it, &name_dummy,
+ &ttl_dummy, NULL, &rdata);
if (rdata->type != dns_rdatatype_soa)
break;
}
@@ -576,20 +401,20 @@ axfr_rrstream_current(rrstream_t *rs, dns_name_t **name, isc_uint32_t *ttl,
dns_rdata_t **rdata)
{
axfr_rrstream_t *s = (axfr_rrstream_t *) rs;
- db_rr_iterator_current(&s->it, name, ttl, rdata);
+ dns_rriterator_current(&s->it, name, ttl, NULL, rdata);
}
static void
axfr_rrstream_pause(rrstream_t *rs) {
axfr_rrstream_t *s = (axfr_rrstream_t *) rs;
- db_rr_iterator_pause(&s->it);
+ dns_rriterator_pause(&s->it);
}
static void
axfr_rrstream_destroy(rrstream_t **rsp) {
axfr_rrstream_t *s = (axfr_rrstream_t *) *rsp;
if (s->it_valid)
- db_rr_iterator_destroy(&s->it);
+ dns_rriterator_destroy(&s->it);
isc_mem_put(s->common.mctx, s, sizeof(*s));
}
@@ -1038,6 +863,7 @@ ns_xfr_start(ns_client_t *client, dns_rdatatype_t reqtype) {
switch(dns_zone_gettype(zone)) {
case dns_zone_master:
case dns_zone_slave:
+ case dns_zone_dlz:
break; /* Master and slave zones are OK for transfer. */
default:
FAILQ(DNS_R_NOTAUTH, "non-authoritative zone", question_name, question_class);
diff --git a/contrib/bind9/bin/named/zoneconf.c b/contrib/bind9/bin/named/zoneconf.c
index 367ddd3..eb93f1b 100644
--- a/contrib/bind9/bin/named/zoneconf.c
+++ b/contrib/bind9/bin/named/zoneconf.c
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004-2009 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004-2011 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 1999-2003 Internet Software Consortium.
*
* Permission to use, copy, modify, and/or distribute this software for any
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: zoneconf.c,v 1.147.50.2 2009-01-29 23:47:44 tbox Exp $ */
+/* $Id: zoneconf.c,v 1.170 2011-01-06 23:47:00 tbox Exp $ */
/*% */
@@ -30,10 +30,16 @@
#include <isc/util.h>
#include <dns/acl.h>
+#include <dns/db.h>
#include <dns/fixedname.h>
#include <dns/log.h>
#include <dns/name.h>
+#include <dns/rdata.h>
#include <dns/rdatatype.h>
+#include <dns/rdataset.h>
+#include <dns/rdatalist.h>
+#include <dns/result.h>
+#include <dns/sdlz.h>
#include <dns/ssu.h>
#include <dns/stats.h>
#include <dns/view.h>
@@ -55,16 +61,18 @@ typedef enum {
allow_update_forwarding
} acl_type_t;
-/*%
- * These are BIND9 server defaults, not necessarily identical to the
- * library defaults defined in zone.c.
- */
#define RETERR(x) do { \
isc_result_t _r = (x); \
if (_r != ISC_R_SUCCESS) \
return (_r); \
} while (0)
+#define CHECK(x) do { \
+ result = (x); \
+ if (result != ISC_R_SUCCESS) \
+ goto cleanup; \
+ } while (0)
+
/*%
* Convenience function for configuring a single zone ACL.
*/
@@ -133,8 +141,11 @@ configure_zone_acl(const cfg_obj_t *zconfig, const cfg_obj_t *vconfig,
}
/* Check for default ACLs that haven't been parsed yet */
- if (vconfig != NULL)
- maps[i++] = cfg_tuple_get(vconfig, "options");
+ if (vconfig != NULL) {
+ const cfg_obj_t *options = cfg_tuple_get(vconfig, "options");
+ if (options != NULL)
+ maps[i++] = options;
+ }
if (config != NULL) {
const cfg_obj_t *options = NULL;
(void)cfg_map_get(config, "options", &options);
@@ -169,19 +180,29 @@ parse_acl:
* Parse the zone update-policy statement.
*/
static isc_result_t
-configure_zone_ssutable(const cfg_obj_t *zconfig, dns_zone_t *zone) {
+configure_zone_ssutable(const cfg_obj_t *zconfig, dns_zone_t *zone,
+ const char *zname)
+{
const cfg_obj_t *updatepolicy = NULL;
const cfg_listelt_t *element, *element2;
dns_ssutable_t *table = NULL;
isc_mem_t *mctx = dns_zone_getmctx(zone);
+ isc_boolean_t autoddns = ISC_FALSE;
isc_result_t result;
(void)cfg_map_get(zconfig, "update-policy", &updatepolicy);
+
if (updatepolicy == NULL) {
dns_zone_setssutable(zone, NULL);
return (ISC_R_SUCCESS);
}
+ if (cfg_obj_isstring(updatepolicy) &&
+ strcmp("local", cfg_obj_asstring(updatepolicy)) == 0) {
+ autoddns = ISC_TRUE;
+ updatepolicy = NULL;
+ }
+
result = dns_ssutable_create(mctx, &table);
if (result != ISC_R_SUCCESS)
return (result);
@@ -198,6 +219,7 @@ configure_zone_ssutable(const cfg_obj_t *zconfig, dns_zone_t *zone) {
const cfg_obj_t *typelist = cfg_tuple_get(stmt, "types");
const char *str;
isc_boolean_t grant = ISC_FALSE;
+ isc_boolean_t usezone = ISC_FALSE;
unsigned int mtype = DNS_SSUMATCHTYPE_NAME;
dns_fixedname_t fname, fident;
isc_buffer_t b;
@@ -237,6 +259,11 @@ configure_zone_ssutable(const cfg_obj_t *zconfig, dns_zone_t *zone) {
mtype = DNS_SSUMATCHTYPE_TCPSELF;
else if (strcasecmp(str, "6to4-self") == 0)
mtype = DNS_SSUMATCHTYPE_6TO4SELF;
+ else if (strcasecmp(str, "zonesub") == 0) {
+ mtype = DNS_SSUMATCHTYPE_SUBDOMAIN;
+ usezone = ISC_TRUE;
+ } else if (strcasecmp(str, "external") == 0)
+ mtype = DNS_SSUMATCHTYPE_EXTERNAL;
else
INSIST(0);
@@ -245,7 +272,7 @@ configure_zone_ssutable(const cfg_obj_t *zconfig, dns_zone_t *zone) {
isc_buffer_init(&b, str, strlen(str));
isc_buffer_add(&b, strlen(str));
result = dns_name_fromtext(dns_fixedname_name(&fident), &b,
- dns_rootname, ISC_FALSE, NULL);
+ dns_rootname, 0, NULL);
if (result != ISC_R_SUCCESS) {
cfg_obj_log(identity, ns_g_lctx, ISC_LOG_ERROR,
"'%s' is not a valid name", str);
@@ -253,15 +280,27 @@ configure_zone_ssutable(const cfg_obj_t *zconfig, dns_zone_t *zone) {
}
dns_fixedname_init(&fname);
- str = cfg_obj_asstring(dname);
- isc_buffer_init(&b, str, strlen(str));
- isc_buffer_add(&b, strlen(str));
- result = dns_name_fromtext(dns_fixedname_name(&fname), &b,
- dns_rootname, ISC_FALSE, NULL);
- if (result != ISC_R_SUCCESS) {
- cfg_obj_log(identity, ns_g_lctx, ISC_LOG_ERROR,
- "'%s' is not a valid name", str);
- goto cleanup;
+ if (usezone) {
+ result = dns_name_copy(dns_zone_getorigin(zone),
+ dns_fixedname_name(&fname),
+ NULL);
+ if (result != ISC_R_SUCCESS) {
+ cfg_obj_log(identity, ns_g_lctx, ISC_LOG_ERROR,
+ "error copying origin: %s",
+ isc_result_totext(result));
+ goto cleanup;
+ }
+ } else {
+ str = cfg_obj_asstring(dname);
+ isc_buffer_init(&b, str, strlen(str));
+ isc_buffer_add(&b, strlen(str));
+ result = dns_name_fromtext(dns_fixedname_name(&fname),
+ &b, dns_rootname, 0, NULL);
+ if (result != ISC_R_SUCCESS) {
+ cfg_obj_log(identity, ns_g_lctx, ISC_LOG_ERROR,
+ "'%s' is not a valid name", str);
+ goto cleanup;
+ }
}
n = ns_config_listcount(typelist);
@@ -311,7 +350,34 @@ configure_zone_ssutable(const cfg_obj_t *zconfig, dns_zone_t *zone) {
if (result != ISC_R_SUCCESS) {
goto cleanup;
}
+ }
+
+ /*
+ * If "update-policy local;" and a session key exists,
+ * then use the default policy, which is equivalent to:
+ * update-policy { grant <session-keyname> zonesub any; };
+ */
+ if (autoddns) {
+ dns_rdatatype_t any = dns_rdatatype_any;
+
+ if (ns_g_server->session_keyname == NULL) {
+ isc_log_write(ns_g_lctx, NS_LOGCATEGORY_GENERAL,
+ NS_LOGMODULE_SERVER, ISC_LOG_ERROR,
+ "failed to enable auto DDNS policy "
+ "for zone %s: session key not found",
+ zname);
+ result = ISC_R_NOTFOUND;
+ goto cleanup;
+ }
+ result = dns_ssutable_addrule(table, ISC_TRUE,
+ ns_g_server->session_keyname,
+ DNS_SSUMATCHTYPE_SUBDOMAIN,
+ dns_zone_getorigin(zone),
+ 1, &any);
+
+ if (result != ISC_R_SUCCESS)
+ goto cleanup;
}
result = ISC_R_SUCCESS;
@@ -322,6 +388,323 @@ configure_zone_ssutable(const cfg_obj_t *zconfig, dns_zone_t *zone) {
return (result);
}
+/*
+ * This is the TTL used for internally generated RRsets for static-stub zones.
+ * The value doesn't matter because the mapping is static, but needs to be
+ * defined for the sake of implementation.
+ */
+#define STATICSTUB_SERVER_TTL 86400
+
+/*%
+ * Configure an apex NS with glues for a static-stub zone.
+ * For example, for the zone named "example.com", the following RRs will be
+ * added to the zone DB:
+ * example.com. NS example.com.
+ * example.com. A 192.0.2.1
+ * example.com. AAAA 2001:db8::1
+ */
+static isc_result_t
+configure_staticstub_serveraddrs(const cfg_obj_t *zconfig, dns_zone_t *zone,
+ dns_rdatalist_t *rdatalist_ns,
+ dns_rdatalist_t *rdatalist_a,
+ dns_rdatalist_t *rdatalist_aaaa)
+{
+ const cfg_listelt_t *element;
+ isc_mem_t *mctx = dns_zone_getmctx(zone);
+ isc_region_t region, sregion;
+ dns_rdata_t *rdata;
+ isc_result_t result = ISC_R_SUCCESS;
+
+ for (element = cfg_list_first(zconfig);
+ element != NULL;
+ element = cfg_list_next(element))
+ {
+ const isc_sockaddr_t* sa;
+ isc_netaddr_t na;
+ const cfg_obj_t *address = cfg_listelt_value(element);
+ dns_rdatalist_t *rdatalist;
+
+ sa = cfg_obj_assockaddr(address);
+ if (isc_sockaddr_getport(sa) != 0) {
+ cfg_obj_log(zconfig, ns_g_lctx, ISC_LOG_ERROR,
+ "port is not configurable for "
+ "static stub server-addresses");
+ return (ISC_R_FAILURE);
+ }
+ isc_netaddr_fromsockaddr(&na, sa);
+ if (isc_netaddr_getzone(&na) != 0) {
+ cfg_obj_log(zconfig, ns_g_lctx, ISC_LOG_ERROR,
+ "scoped address is not allowed "
+ "for static stub "
+ "server-addresses");
+ return (ISC_R_FAILURE);
+ }
+
+ switch (na.family) {
+ case AF_INET:
+ region.length = sizeof(na.type.in);
+ rdatalist = rdatalist_a;
+ break;
+ default:
+ INSIST(na.family == AF_INET6);
+ region.length = sizeof(na.type.in6);
+ rdatalist = rdatalist_aaaa;
+ break;
+ }
+
+ rdata = isc_mem_get(mctx, sizeof(*rdata) + region.length);
+ if (rdata == NULL)
+ return (ISC_R_NOMEMORY);
+ region.base = (unsigned char *)(rdata + 1);
+ memcpy(region.base, &na.type, region.length);
+ dns_rdata_init(rdata);
+ dns_rdata_fromregion(rdata, dns_zone_getclass(zone),
+ rdatalist->type, &region);
+ ISC_LIST_APPEND(rdatalist->rdata, rdata, link);
+ }
+
+ /*
+ * If no address is specified (unlikely in this context, but possible),
+ * there's nothing to do anymore.
+ */
+ if (ISC_LIST_EMPTY(rdatalist_a->rdata) &&
+ ISC_LIST_EMPTY(rdatalist_aaaa->rdata)) {
+ return (ISC_R_SUCCESS);
+ }
+
+ /* Add to the list an apex NS with the ns name being the origin name */
+ dns_name_toregion(dns_zone_getorigin(zone), &sregion);
+ rdata = isc_mem_get(mctx, sizeof(*rdata) + sregion.length);
+ if (rdata == NULL) {
+ /*
+ * Already allocated data will be freed in the caller, so
+ * we can simply return here.
+ */
+ return (ISC_R_NOMEMORY);
+ }
+ region.length = sregion.length;
+ region.base = (unsigned char *)(rdata + 1);
+ memcpy(region.base, sregion.base, region.length);
+ dns_rdata_init(rdata);
+ dns_rdata_fromregion(rdata, dns_zone_getclass(zone),
+ dns_rdatatype_ns, &region);
+ ISC_LIST_APPEND(rdatalist_ns->rdata, rdata, link);
+
+ return (result);
+}
+
+/*%
+ * Configure an apex NS with an out-of-zone NS names for a static-stub zone.
+ * For example, for the zone named "example.com", something like the following
+ * RRs will be added to the zone DB:
+ * example.com. NS ns.example.net.
+ */
+static isc_result_t
+configure_staticstub_servernames(const cfg_obj_t *zconfig, dns_zone_t *zone,
+ dns_rdatalist_t *rdatalist, const char *zname)
+{
+ const cfg_listelt_t *element;
+ isc_mem_t *mctx = dns_zone_getmctx(zone);
+ dns_rdata_t *rdata;
+ isc_region_t sregion, region;
+ isc_result_t result = ISC_R_SUCCESS;
+
+ for (element = cfg_list_first(zconfig);
+ element != NULL;
+ element = cfg_list_next(element))
+ {
+ const cfg_obj_t *obj;
+ const char *str;
+ dns_fixedname_t fixed_name;
+ dns_name_t *nsname;
+ isc_buffer_t b;
+
+ obj = cfg_listelt_value(element);
+ str = cfg_obj_asstring(obj);
+
+ dns_fixedname_init(&fixed_name);
+ nsname = dns_fixedname_name(&fixed_name);
+
+ isc_buffer_init(&b, str, strlen(str));
+ isc_buffer_add(&b, strlen(str));
+ result = dns_name_fromtext(nsname, &b, dns_rootname, 0, NULL);
+ if (result != ISC_R_SUCCESS) {
+ cfg_obj_log(zconfig, ns_g_lctx, ISC_LOG_ERROR,
+ "server-name '%s' is not a valid "
+ "name", str);
+ return (result);
+ }
+ if (dns_name_issubdomain(nsname, dns_zone_getorigin(zone))) {
+ cfg_obj_log(zconfig, ns_g_lctx, ISC_LOG_ERROR,
+ "server-name '%s' must not be a "
+ "subdomain of zone name '%s'",
+ str, zname);
+ return (ISC_R_FAILURE);
+ }
+
+ dns_name_toregion(nsname, &sregion);
+ rdata = isc_mem_get(mctx, sizeof(*rdata) + sregion.length);
+ if (rdata == NULL)
+ return (ISC_R_NOMEMORY);
+ region.length = sregion.length;
+ region.base = (unsigned char *)(rdata + 1);
+ memcpy(region.base, sregion.base, region.length);
+ dns_rdata_init(rdata);
+ dns_rdata_fromregion(rdata, dns_zone_getclass(zone),
+ dns_rdatatype_ns, &region);
+ ISC_LIST_APPEND(rdatalist->rdata, rdata, link);
+ }
+
+ return (result);
+}
+
+/*%
+ * Configure static-stub zone.
+ */
+static isc_result_t
+configure_staticstub(const cfg_obj_t *zconfig, dns_zone_t *zone,
+ const char *zname, const char *dbtype)
+{
+ int i = 0;
+ const cfg_obj_t *obj;
+ isc_mem_t *mctx = dns_zone_getmctx(zone);
+ dns_db_t *db = NULL;
+ dns_dbversion_t *dbversion = NULL;
+ dns_dbnode_t *apexnode = NULL;
+ dns_name_t apexname;
+ isc_result_t result;
+ dns_rdataset_t rdataset;
+ dns_rdatalist_t rdatalist_ns, rdatalist_a, rdatalist_aaaa;
+ dns_rdatalist_t* rdatalists[] = {
+ &rdatalist_ns, &rdatalist_a, &rdatalist_aaaa, NULL
+ };
+ dns_rdata_t *rdata;
+ isc_region_t region;
+
+ /* Create the DB beforehand */
+ RETERR(dns_db_create(mctx, dbtype, dns_zone_getorigin(zone),
+ dns_dbtype_stub, dns_zone_getclass(zone),
+ 0, NULL, &db));
+ dns_zone_setdb(zone, db);
+
+ dns_rdatalist_init(&rdatalist_ns);
+ rdatalist_ns.rdclass = dns_zone_getclass(zone);
+ rdatalist_ns.type = dns_rdatatype_ns;
+ rdatalist_ns.ttl = STATICSTUB_SERVER_TTL;
+
+ dns_rdatalist_init(&rdatalist_a);
+ rdatalist_a.rdclass = dns_zone_getclass(zone);
+ rdatalist_a.type = dns_rdatatype_a;
+ rdatalist_a.ttl = STATICSTUB_SERVER_TTL;
+
+ dns_rdatalist_init(&rdatalist_aaaa);
+ rdatalist_aaaa.rdclass = dns_zone_getclass(zone);
+ rdatalist_aaaa.type = dns_rdatatype_aaaa;
+ rdatalist_aaaa.ttl = STATICSTUB_SERVER_TTL;
+
+ /* Prepare zone RRs from the configuration */
+ obj = NULL;
+ result = cfg_map_get(zconfig, "server-addresses", &obj);
+ if (obj != NULL) {
+ result = configure_staticstub_serveraddrs(obj, zone,
+ &rdatalist_ns,
+ &rdatalist_a,
+ &rdatalist_aaaa);
+ if (result != ISC_R_SUCCESS)
+ goto cleanup;
+ }
+
+ obj = NULL;
+ result = cfg_map_get(zconfig, "server-names", &obj);
+ if (obj != NULL) {
+ result = configure_staticstub_servernames(obj, zone,
+ &rdatalist_ns,
+ zname);
+ if (result != ISC_R_SUCCESS)
+ goto cleanup;
+ }
+
+ /*
+ * Sanity check: there should be at least one NS RR at the zone apex
+ * to trigger delegation.
+ */
+ if (ISC_LIST_EMPTY(rdatalist_ns.rdata)) {
+ isc_log_write(ns_g_lctx, NS_LOGCATEGORY_GENERAL,
+ NS_LOGMODULE_SERVER, ISC_LOG_ERROR,
+ "No NS record is configured for a "
+ "static-stub zone '%s'", zname);
+ result = ISC_R_FAILURE;
+ goto cleanup;
+ }
+
+ /*
+ * Now add NS and glue A/AAAA RRsets to the zone DB.
+ * First open a new version for the add operation and get a pointer
+ * to the apex node (all RRs are of the apex name).
+ */
+ result = dns_db_newversion(db, &dbversion);
+ if (result != ISC_R_SUCCESS)
+ goto cleanup;
+ dns_name_init(&apexname, NULL);
+ dns_name_clone(dns_zone_getorigin(zone), &apexname);
+ result = dns_db_findnode(db, &apexname, ISC_FALSE, &apexnode);
+ if (result != ISC_R_SUCCESS)
+ goto cleanup;
+
+ /* Add NS RRset */
+ dns_rdataset_init(&rdataset);
+ RUNTIME_CHECK(dns_rdatalist_tordataset(&rdatalist_ns, &rdataset)
+ == ISC_R_SUCCESS);
+ result = dns_db_addrdataset(db, apexnode, dbversion, 0, &rdataset,
+ 0, NULL);
+ dns_rdataset_disassociate(&rdataset);
+ if (result != ISC_R_SUCCESS)
+ goto cleanup;
+
+ /* Add glue A RRset, if any */
+ if (!ISC_LIST_EMPTY(rdatalist_a.rdata)) {
+ RUNTIME_CHECK(dns_rdatalist_tordataset(&rdatalist_a, &rdataset)
+ == ISC_R_SUCCESS);
+ result = dns_db_addrdataset(db, apexnode, dbversion, 0,
+ &rdataset, 0, NULL);
+ dns_rdataset_disassociate(&rdataset);
+ if (result != ISC_R_SUCCESS)
+ goto cleanup;
+ }
+
+ /* Add glue AAAA RRset, if any */
+ if (!ISC_LIST_EMPTY(rdatalist_aaaa.rdata)) {
+ RUNTIME_CHECK(dns_rdatalist_tordataset(&rdatalist_aaaa,
+ &rdataset)
+ == ISC_R_SUCCESS);
+ result = dns_db_addrdataset(db, apexnode, dbversion, 0,
+ &rdataset, 0, NULL);
+ dns_rdataset_disassociate(&rdataset);
+ if (result != ISC_R_SUCCESS)
+ goto cleanup;
+ }
+
+ result = ISC_R_SUCCESS;
+
+ cleanup:
+ if (apexnode != NULL)
+ dns_db_detachnode(db, &apexnode);
+ if (dbversion != NULL)
+ dns_db_closeversion(db, &dbversion, ISC_TRUE);
+ if (db != NULL)
+ dns_db_detach(&db);
+ for (i = 0; rdatalists[i] != NULL; i++) {
+ while ((rdata = ISC_LIST_HEAD(rdatalists[i]->rdata)) != NULL) {
+ ISC_LIST_UNLINK(rdatalists[i]->rdata, rdata, link);
+ dns_rdata_toregion(rdata, &region);
+ isc_mem_put(mctx, rdata,
+ sizeof(*rdata) + region.length);
+ }
+ }
+
+ return (result);
+}
+
/*%
* Convert a config file zone type into a server zone type.
*/
@@ -503,6 +886,19 @@ ns_zone_configure(const cfg_obj_t *config, const cfg_obj_t *vconfig,
if (result == ISC_R_SUCCESS)
filename = cfg_obj_asstring(obj);
+ /*
+ * Unless we're using some alternative database, a master zone
+ * will be needing a master file.
+ */
+ if (ztype == dns_zone_master && cpval == default_dbtype &&
+ filename == NULL) {
+ isc_log_write(ns_g_lctx, NS_LOGCATEGORY_GENERAL,
+ NS_LOGMODULE_SERVER, ISC_LOG_ERROR,
+ "zone '%s': 'file' not specified",
+ zname);
+ return (ISC_R_FAILURE);
+ }
+
masterformat = dns_masterformat_text;
obj = NULL;
result= ns_config_get(maps, "masterfile-format", &obj);
@@ -577,7 +973,7 @@ ns_zone_configure(const cfg_obj_t *config, const cfg_obj_t *vconfig,
* to primary masters (type "master") and slaves
* acting as masters (type "slave"), but not to stubs.
*/
- if (ztype != dns_zone_stub) {
+ if (ztype != dns_zone_stub && ztype != dns_zone_staticstub) {
obj = NULL;
result = ns_config_get(maps, "notify", &obj);
INSIST(result == ISC_R_SUCCESS);
@@ -731,6 +1127,7 @@ ns_zone_configure(const cfg_obj_t *config, const cfg_obj_t *vconfig,
*/
if (ztype == dns_zone_master) {
dns_acl_t *updateacl;
+
RETERR(configure_zone_acl(zconfig, vconfig, config,
allow_update, ac, zone,
dns_zone_setupdateacl,
@@ -744,7 +1141,7 @@ ns_zone_configure(const cfg_obj_t *config, const cfg_obj_t *vconfig,
"address, which is insecure",
zname);
- RETERR(configure_zone_ssutable(zoptions, zone));
+ RETERR(configure_zone_ssutable(zoptions, zone, zname));
obj = NULL;
result = ns_config_get(maps, "sig-validity-interval", &obj);
@@ -774,12 +1171,6 @@ ns_zone_configure(const cfg_obj_t *config, const cfg_obj_t *vconfig,
result = ns_config_get(maps, "key-directory", &obj);
if (result == ISC_R_SUCCESS) {
filename = cfg_obj_asstring(obj);
- if (!isc_file_isabsolute(filename)) {
- cfg_obj_log(obj, ns_g_lctx, ISC_LOG_ERROR,
- "key-directory '%s' "
- "is not absolute", filename);
- return (ISC_R_FAILURE);
- }
RETERR(dns_zone_setkeydirectory(zone, filename));
}
@@ -804,6 +1195,11 @@ ns_zone_configure(const cfg_obj_t *config, const cfg_obj_t *vconfig,
dns_zone_setoption(zone, DNS_ZONEOPT_UPDATECHECKKSK,
cfg_obj_asboolean(obj));
+ obj = NULL;
+ result = ns_config_get(maps, "dnssec-dnskey-kskonly", &obj);
+ INSIST(result == ISC_R_SUCCESS);
+ dns_zone_setoption(zone, DNS_ZONEOPT_DNSKEYKSKONLY,
+ cfg_obj_asboolean(obj));
} else if (ztype == dns_zone_slave) {
RETERR(configure_zone_acl(zconfig, vconfig, config,
allow_update_forwarding, ac, zone,
@@ -811,11 +1207,13 @@ ns_zone_configure(const cfg_obj_t *config, const cfg_obj_t *vconfig,
dns_zone_clearforwardacl));
}
-
/*%
* Primary master functionality.
*/
if (ztype == dns_zone_master) {
+ isc_boolean_t allow = ISC_FALSE, maint = ISC_FALSE;
+ isc_boolean_t create = ISC_FALSE;
+
obj = NULL;
result = ns_config_get(maps, "check-wildcard", &obj);
if (result == ISC_R_SUCCESS)
@@ -825,6 +1223,21 @@ ns_zone_configure(const cfg_obj_t *config, const cfg_obj_t *vconfig,
dns_zone_setoption(zone, DNS_ZONEOPT_CHECKWILDCARD, check);
obj = NULL;
+ result = ns_config_get(maps, "check-dup-records", &obj);
+ INSIST(obj != NULL);
+ if (strcasecmp(cfg_obj_asstring(obj), "warn") == 0) {
+ fail = ISC_FALSE;
+ check = ISC_TRUE;
+ } else if (strcasecmp(cfg_obj_asstring(obj), "fail") == 0) {
+ fail = check = ISC_TRUE;
+ } else if (strcasecmp(cfg_obj_asstring(obj), "ignore") == 0) {
+ fail = check = ISC_FALSE;
+ } else
+ INSIST(0);
+ dns_zone_setoption(zone, DNS_ZONEOPT_CHECKDUPRR, check);
+ dns_zone_setoption(zone, DNS_ZONEOPT_CHECKDUPRRFAIL, fail);
+
+ obj = NULL;
result = ns_config_get(maps, "check-mx", &obj);
INSIST(obj != NULL);
if (strcasecmp(cfg_obj_asstring(obj), "warn") == 0) {
@@ -874,6 +1287,31 @@ ns_zone_configure(const cfg_obj_t *config, const cfg_obj_t *vconfig,
INSIST(0);
dns_zone_setoption(zone, DNS_ZONEOPT_WARNSRVCNAME, warn);
dns_zone_setoption(zone, DNS_ZONEOPT_IGNORESRVCNAME, ignore);
+
+ obj = NULL;
+ result = ns_config_get(maps, "dnssec-secure-to-insecure", &obj);
+ INSIST(obj != NULL);
+ dns_zone_setoption(zone, DNS_ZONEOPT_SECURETOINSECURE,
+ cfg_obj_asboolean(obj));
+
+ obj = NULL;
+ result = cfg_map_get(zoptions, "auto-dnssec", &obj);
+ if (result == ISC_R_SUCCESS) {
+ const char *arg = cfg_obj_asstring(obj);
+ if (strcasecmp(arg, "allow") == 0)
+ allow = ISC_TRUE;
+ else if (strcasecmp(arg, "maintain") == 0)
+ allow = maint = ISC_TRUE;
+ else if (strcasecmp(arg, "create") == 0)
+ allow = maint = create = ISC_TRUE;
+ else if (strcasecmp(arg, "off") == 0)
+ ;
+ else
+ INSIST(0);
+ dns_zone_setkeyopt(zone, DNS_ZONEKEY_ALLOW, allow);
+ dns_zone_setkeyopt(zone, DNS_ZONEKEY_MAINTAIN, maint);
+ dns_zone_setkeyopt(zone, DNS_ZONEKEY_CREATE, create);
+ }
}
/*
@@ -982,6 +1420,11 @@ ns_zone_configure(const cfg_obj_t *config, const cfg_obj_t *vconfig,
cfg_obj_asboolean(obj));
break;
+ case dns_zone_staticstub:
+ RETERR(configure_staticstub(zoptions, zone, zname,
+ default_dbtype));
+ break;
+
default:
break;
}
@@ -989,6 +1432,31 @@ ns_zone_configure(const cfg_obj_t *config, const cfg_obj_t *vconfig,
return (ISC_R_SUCCESS);
}
+
+#ifdef DLZ
+/*
+ * Set up a DLZ zone as writeable
+ */
+isc_result_t
+ns_zone_configure_writeable_dlz(dns_dlzdb_t *dlzdatabase, dns_zone_t *zone,
+ dns_rdataclass_t rdclass, dns_name_t *name)
+{
+ dns_db_t *db = NULL;
+ isc_time_t now;
+ isc_result_t result;
+
+ TIME_NOW(&now);
+
+ dns_zone_settype(zone, dns_zone_dlz);
+ result = dns_sdlz_setdb(dlzdatabase, rdclass, name, &db);
+ if (result != ISC_R_SUCCESS)
+ return result;
+ result = dns_zone_dlzpostload(zone, db);
+ dns_db_detach(&db);
+ return result;
+}
+#endif
+
isc_boolean_t
ns_zone_reusable(dns_zone_t *zone, const cfg_obj_t *zconfig) {
const cfg_obj_t *zoptions = NULL;
@@ -1001,6 +1469,13 @@ ns_zone_reusable(dns_zone_t *zone, const cfg_obj_t *zconfig) {
if (zonetype_fromconfig(zoptions) != dns_zone_gettype(zone))
return (ISC_FALSE);
+ /*
+ * We always reconfigure a static-stub zone for simplicity, assuming
+ * the amount of data to be loaded is small.
+ */
+ if (zonetype_fromconfig(zoptions) == dns_zone_staticstub)
+ return (ISC_FALSE);
+
obj = NULL;
(void)cfg_map_get(zoptions, "file", &obj);
if (obj != NULL)
diff --git a/contrib/bind9/bin/nsupdate/Makefile.in b/contrib/bind9/bin/nsupdate/Makefile.in
index f7f6346..a65aad9 100644
--- a/contrib/bind9/bin/nsupdate/Makefile.in
+++ b/contrib/bind9/bin/nsupdate/Makefile.in
@@ -1,4 +1,4 @@
-# Copyright (C) 2004, 2006-2008 Internet Systems Consortium, Inc. ("ISC")
+# Copyright (C) 2004, 2006-2009 Internet Systems Consortium, Inc. ("ISC")
# Copyright (C) 2000-2002 Internet Software Consortium.
#
# Permission to use, copy, modify, and/or distribute this software for any
@@ -13,7 +13,7 @@
# OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
# PERFORMANCE OF THIS SOFTWARE.
-# $Id: Makefile.in,v 1.29 2008-08-29 23:47:22 tbox Exp $
+# $Id: Makefile.in,v 1.36 2009-12-05 23:31:40 each Exp $
srcdir = @srcdir@
VPATH = @srcdir@
@@ -24,7 +24,7 @@ top_srcdir = @top_srcdir@
@BIND9_MAKE_INCLUDES@
CINCLUDES = ${LWRES_INCLUDES} ${DNS_INCLUDES} ${BIND9_INCLUDES} \
- ${ISC_INCLUDES} @DST_GSSAPI_INC@
+ ${ISC_INCLUDES} ${ISCCFG_INCLUDES} @DST_GSSAPI_INC@
CDEFINES = @USE_GSSAPI@
CWARNINGS =
@@ -33,6 +33,7 @@ LWRESLIBS = ../../lib/lwres/liblwres.@A@
DNSLIBS = ../../lib/dns/libdns.@A@ @DNS_CRYPTO_LIBS@
BIND9LIBS = ../../lib/bind9/libbind9.@A@
ISCLIBS = ../../lib/isc/libisc.@A@
+ISCNOSYMLIBS = ../../lib/isc/libisc-nosymtbl.@A@
ISCCFGLIBS = ../../lib/isccfg/libisccfg.@A@
LWRESDEPLIBS = ../../lib/lwres/liblwres.@A@
@@ -43,7 +44,9 @@ ISCCFGDEPLIBS = ../../lib/isccfg/libisccfg.@A@
DEPLIBS = ${DNSDEPLIBS} ${BIND9DEPLIBS} ${ISCDEPLIBS} ${ISCCFGDEPLIBS}
-LIBS = ${LWRESLIBS} ${DNSLIBS} ${BIND9LIBS} ${ISCLIBS} ${ISCCFGLIBS} @LIBS@
+LIBS = ${LWRESLIBS} ${DNSLIBS} ${BIND9LIBS} ${ISCCFGLIBS} ${ISCLIBS} @LIBS@
+
+NOSYMLIBS = ${LWRESLIBS} ${DNSLIBS} ${BIND9LIBS} ${ISCCFGLIBS} ${ISCNOSYMLIBS} @LIBS@
SUBDIRS =
@@ -63,8 +66,14 @@ MANOBJS = ${MANPAGES} ${HTMLPAGES}
@BIND9_MAKE_RULES@
+nsupdate.@O@: nsupdate.c
+ ${LIBTOOL_MODE_COMPILE} ${CC} ${ALL_CFLAGS} \
+ -DSESSION_KEYFILE=\"${localstatedir}/run/named/session.key\" \
+ -c ${srcdir}/nsupdate.c
+
nsupdate@EXEEXT@: nsupdate.@O@ ${UOBJS} ${DEPLIBS}
- ${LIBTOOL_MODE_LINK} ${PURIFY} ${CC} ${CFLAGS} ${LDFLAGS} -o $@ nsupdate.@O@ ${UOBJS} ${LIBS}
+ export BASEOBJS="nsupdate.@O@ ${UOBJS}"; \
+ ${FINALBUILDCMD}
doc man:: ${MANOBJS}
diff --git a/contrib/bind9/bin/nsupdate/nsupdate.1 b/contrib/bind9/bin/nsupdate/nsupdate.1
index 6c03486..9d82891 100644
--- a/contrib/bind9/bin/nsupdate/nsupdate.1
+++ b/contrib/bind9/bin/nsupdate/nsupdate.1
@@ -13,18 +13,18 @@
.\" OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
.\" PERFORMANCE OF THIS SOFTWARE.
.\"
-.\" $Id: nsupdate.1,v 1.3.48.4 2010-07-10 02:06:17 tbox Exp $
+.\" $Id: nsupdate.1,v 1.13 2010-07-10 01:14:19 tbox Exp $
.\"
.hy 0
.ad l
.\" Title: nsupdate
.\" Author:
.\" Generator: DocBook XSL Stylesheets v1.71.1 <http://docbook.sf.net/>
-.\" Date: Jun 30, 2000
+.\" Date: Aug 25, 2009
.\" Manual: BIND9
.\" Source: BIND9
.\"
-.TH "NSUPDATE" "1" "Jun 30, 2000" "BIND9" "BIND9"
+.TH "NSUPDATE" "1" "Aug 25, 2009" "BIND9" "BIND9"
.\" disable hyphenation
.nh
.\" disable justification (adjust text to left margin only)
@@ -33,11 +33,11 @@
nsupdate \- Dynamic DNS update utility
.SH "SYNOPSIS"
.HP 9
-\fBnsupdate\fR [\fB\-d\fR] [\fB\-D\fR] [[\fB\-g\fR] | [\fB\-o\fR] | [\fB\-y\ \fR\fB\fI[hmac:]\fR\fIkeyname:secret\fR\fR] | [\fB\-k\ \fR\fB\fIkeyfile\fR\fR]] [\fB\-t\ \fR\fB\fItimeout\fR\fR] [\fB\-u\ \fR\fB\fIudptimeout\fR\fR] [\fB\-r\ \fR\fB\fIudpretries\fR\fR] [\fB\-R\ \fR\fB\fIrandomdev\fR\fR] [\fB\-v\fR] [filename]
+\fBnsupdate\fR [\fB\-d\fR] [\fB\-D\fR] [[\fB\-g\fR] | [\fB\-o\fR] | [\fB\-l\fR] | [\fB\-y\ \fR\fB\fI[hmac:]\fR\fIkeyname:secret\fR\fR] | [\fB\-k\ \fR\fB\fIkeyfile\fR\fR]] [\fB\-t\ \fR\fB\fItimeout\fR\fR] [\fB\-u\ \fR\fB\fIudptimeout\fR\fR] [\fB\-r\ \fR\fB\fIudpretries\fR\fR] [\fB\-R\ \fR\fB\fIrandomdev\fR\fR] [\fB\-v\fR] [filename]
.SH "DESCRIPTION"
.PP
\fBnsupdate\fR
-is used to submit Dynamic DNS Update requests as defined in RFC2136 to a name server. This allows resource records to be added or removed from a zone without manually editing the zone file. A single update request can contain requests to add or remove more than one resource record.
+is used to submit Dynamic DNS Update requests as defined in RFC 2136 to a name server. This allows resource records to be added or removed from a zone without manually editing the zone file. A single update request can contain requests to add or remove more than one resource record.
.PP
Zones that are under dynamic control via
\fBnsupdate\fR
@@ -60,7 +60,11 @@ option makes
report additional debugging information to
\fB\-d\fR.
.PP
-Transaction signatures can be used to authenticate the Dynamic DNS updates. These use the TSIG resource record type described in RFC2845 or the SIG(0) record described in RFC3535 and RFC2931 or GSS\-TSIG as described in RFC3645. TSIG relies on a shared secret that should only be known to
+The
+\fB\-L\fR
+option with an integer argument of zero or higher sets the logging debug level. If zero, logging is disabled.
+.PP
+Transaction signatures can be used to authenticate the Dynamic DNS updates. These use the TSIG resource record type described in RFC 2845 or the SIG(0) record described in RFC 2535 and RFC 2931 or GSS\-TSIG as described in RFC 3645. TSIG relies on a shared secret that should only be known to
\fBnsupdate\fR
and the name server. Currently, the only supported encryption algorithm for TSIG is HMAC\-MD5, which is defined in RFC 2104. Once other algorithms are defined for TSIG, applications will need to ensure they select the appropriate algorithm as well as the key when authenticating each other. For instance, suitable
\fBkey\fR
@@ -71,22 +75,22 @@ statements would be added to
so that the name server can associate the appropriate secret key and algorithm with the IP address of the client application that will be using TSIG authentication. SIG(0) uses public key cryptography. To use a SIG(0) key, the public key must be stored in a KEY record in a zone served by the name server.
\fBnsupdate\fR
does not read
-\fI/etc/named.conf\fR. GSS\-TSIG uses Kerberos credentials.
+\fI/etc/named.conf\fR.
+.PP
+GSS\-TSIG uses Kerberos credentials. Standard GSS\-TSIG mode is switched on with the
+\fB\-g\fR
+flag. A non\-standards\-compliant variant of GSS\-TSIG used by Windows 2000 can be switched on with the
+\fB\-o\fR
+flag.
.PP
\fBnsupdate\fR
uses the
\fB\-y\fR
or
\fB\-k\fR
-option to provide the shared secret needed to generate a TSIG record for authenticating Dynamic DNS update requests, default type HMAC\-MD5. These options are mutually exclusive. With the
-\fB\-k\fR
-option,
-\fBnsupdate\fR
-reads the shared secret from the file
-\fIkeyfile\fR, whose name is of the form
-\fIK{name}.+157.+{random}.private\fR. For historical reasons, the file
-\fIK{name}.+157.+{random}.key\fR
-must also be present. When the
+option to provide the shared secret needed to generate a TSIG record for authenticating Dynamic DNS update requests, default type HMAC\-MD5. These options are mutually exclusive.
+.PP
+When the
\fB\-y\fR
option is used, a signature is generated from
[\fIhmac:\fR]\fIkeyname:secret.\fR
@@ -99,17 +103,37 @@ option is discouraged because the shared secret is supplied as a command line ar
\fBps\fR(1)
or in a history file maintained by the user's shell.
.PP
-The
+With the
+\fB\-k\fR
+option,
+\fBnsupdate\fR
+reads the shared secret from the file
+\fIkeyfile\fR. Keyfiles may be in two formats: a single file containing a
+\fInamed.conf\fR\-format
+\fBkey\fR
+statement, which may be generated automatically by
+\fBddns\-confgen\fR, or a pair of files whose names are of the format
+\fIK{name}.+157.+{random}.key\fR
+and
+\fIK{name}.+157.+{random}.private\fR, which can be generated by
+\fBdnssec\-keygen\fR. The
\fB\-k\fR
may also be used to specify a SIG(0) key used to authenticate Dynamic DNS update requests. In this case, the key specified is not an HMAC\-MD5 key.
.PP
-The
-\fB\-g\fR
-and
-\fB\-o\fR
-specify that GSS\-TSIG is to be used. The
-\fB\-o\fR
-should only be used with old Microsoft Windows 2000 servers.
+\fBnsupdate\fR
+can be run in a local\-host only mode using the
+\fB\-l\fR
+flag. This sets the server address to localhost (disabling the
+\fBserver\fR
+so that the server address cannot be overridden). Connections to the local server will use a TSIG key found in
+\fI/var/run/named/session.key\fR, which is automatically generated by
+\fBnamed\fR
+if any local master zone has set
+\fBupdate\-policy\fR
+to
+\fBlocal\fR. The location of this key file can be overridden with the
+\fB\-k\fR
+option.
.PP
By default,
\fBnsupdate\fR
@@ -120,6 +144,10 @@ option makes
use a TCP connection. This may be preferable when a batch of update requests is made.
.PP
The
+\fB\-p\fR
+sets the default port number to use for connections to a name server. The default is 53.
+.PP
+The
\fB\-t\fR
option sets the maximum time an update request can take before it is aborted. The default is 300 seconds. Zero can be used to disable the timeout.
.PP
@@ -367,7 +395,7 @@ with IP address 172.16.1.1 is added. The newly\-added record has a 1 day TTL (86
.sp
.PP
The prerequisite condition gets the name server to check that there are no resource records of any type for
-\fBnickname.example.com\fR. If there are, the update request fails. If this name does not exist, a CNAME for it is added. This ensures that when the CNAME is added, it cannot conflict with the long\-standing rule in RFC1034 that a name must not exist as any other record type if it exists as a CNAME. (The rule has been updated for DNSSEC in RFC2535 to allow CNAMEs to have RRSIG, DNSKEY and NSEC records.)
+\fBnickname.example.com\fR. If there are, the update request fails. If this name does not exist, a CNAME for it is added. This ensures that when the CNAME is added, it cannot conflict with the long\-standing rule in RFC 1034 that a name must not exist as any other record type if it exists as a CNAME. (The rule has been updated for DNSSEC in RFC 2535 to allow CNAMEs to have RRSIG, DNSKEY and NSEC records.)
.SH "FILES"
.PP
\fB/etc/resolv.conf\fR
@@ -375,6 +403,11 @@ The prerequisite condition gets the name server to check that there are no resou
used to identify default name server
.RE
.PP
+\fB/var/run/named/session.key\fR
+.RS 4
+sets the default TSIG key for use in local\-only mode
+.RE
+.PP
\fBK{name}.+157.+{random}.key\fR
.RS 4
base\-64 encoding of HMAC\-MD5 key created by
@@ -388,14 +421,15 @@ base\-64 encoding of HMAC\-MD5 key created by
.RE
.SH "SEE ALSO"
.PP
-\fBRFC2136\fR(),
-\fBRFC3007\fR(),
-\fBRFC2104\fR(),
-\fBRFC2845\fR(),
-\fBRFC1034\fR(),
-\fBRFC2535\fR(),
-\fBRFC2931\fR(),
+RFC 2136,
+RFC 3007,
+RFC 2104,
+RFC 2845,
+RFC 1034,
+RFC 2535,
+RFC 2931,
\fBnamed\fR(8),
+\fBddns\-confgen\fR(8),
\fBdnssec\-keygen\fR(8).
.SH "BUGS"
.PP
diff --git a/contrib/bind9/bin/nsupdate/nsupdate.c b/contrib/bind9/bin/nsupdate/nsupdate.c
index 69d390d..ed01a47 100644
--- a/contrib/bind9/bin/nsupdate/nsupdate.c
+++ b/contrib/bind9/bin/nsupdate/nsupdate.c
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004-2010 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004-2011 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 2000-2003 Internet Software Consortium.
*
* Permission to use, copy, modify, and/or distribute this software for any
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: nsupdate.c,v 1.163.48.15 2010-12-09 04:30:57 tbox Exp $ */
+/* $Id: nsupdate.c,v 1.193 2011-01-10 05:32:03 marka Exp $ */
/*! \file */
@@ -33,6 +33,7 @@
#include <isc/commandline.h>
#include <isc/entropy.h>
#include <isc/event.h>
+#include <isc/file.h>
#include <isc/hash.h>
#include <isc/lex.h>
#include <isc/log.h>
@@ -50,6 +51,8 @@
#include <isc/types.h>
#include <isc/util.h>
+#include <isccfg/namedconf.h>
+
#include <dns/callbacks.h>
#include <dns/dispatch.h>
#include <dns/dnssec.h>
@@ -78,6 +81,7 @@
#ifdef GSSAPI
#include <dst/gssapi.h>
+#include ISC_PLATFORM_KRB5HEADER
#endif
#include <bind9/getaddresses.h>
@@ -106,6 +110,8 @@ extern int h_errno;
#define DNSDEFAULTPORT 53
+static isc_uint16_t dnsport = DNSDEFAULTPORT;
+
#ifndef RESOLV_CONF
#define RESOLV_CONF "/etc/resolv.conf"
#endif
@@ -119,6 +125,7 @@ static isc_boolean_t usevc = ISC_FALSE;
static isc_boolean_t usegsstsig = ISC_FALSE;
static isc_boolean_t use_win2k_gsstsig = ISC_FALSE;
static isc_boolean_t tried_other_gsstsig = ISC_FALSE;
+static isc_boolean_t local_only = ISC_FALSE;
static isc_taskmgr_t *taskmgr = NULL;
static isc_task_t *global_task = NULL;
static isc_event_t *global_event = NULL;
@@ -148,7 +155,8 @@ static isc_sockaddr_t *userserver = NULL;
static isc_sockaddr_t *localaddr = NULL;
static isc_sockaddr_t *serveraddr = NULL;
static isc_sockaddr_t tempaddr;
-static char *keystr = NULL, *keyfile = NULL;
+static const char *keyfile = NULL;
+static char *keystr = NULL;
static isc_entropy_t *entropy = NULL;
static isc_boolean_t shuttingdown = ISC_FALSE;
static FILE *input;
@@ -174,8 +182,10 @@ typedef struct nsu_requestinfo {
static void
sendrequest(isc_sockaddr_t *srcaddr, isc_sockaddr_t *destaddr,
dns_message_t *msg, dns_request_t **request);
-static void
-fatal(const char *format, ...) ISC_FORMAT_PRINTF(1, 2);
+
+ISC_PLATFORM_NORETURN_PRE static void
+fatal(const char *format, ...)
+ISC_FORMAT_PRINTF(1, 2) ISC_PLATFORM_NORETURN_POST;
static void
debug(const char *format, ...) ISC_FORMAT_PRINTF(1, 2);
@@ -406,7 +416,7 @@ reset_system(void) {
if (tsigkey != NULL)
dns_tsigkey_detach(&tsigkey);
if (gssring != NULL)
- dns_tsigkeyring_destroy(&gssring);
+ dns_tsigkeyring_detach(&gssring);
tried_other_gsstsig = ISC_FALSE;
}
}
@@ -479,6 +489,19 @@ parse_hmac(dns_name_t **hmac, const char *hmacstr, size_t len) {
return (digestbits);
}
+static int
+basenamelen(const char *file) {
+ int len = strlen(file);
+
+ if (len > 1 && file[len - 1] == '.')
+ len -= 1;
+ else if (len > 8 && strcmp(file + len - 8, ".private") == 0)
+ len -= 8;
+ else if (len > 4 && strcmp(file + len - 4, ".key") == 0)
+ len -= 4;
+ return (len);
+}
+
static void
setup_keystr(void) {
unsigned char *secret = NULL;
@@ -520,8 +543,7 @@ setup_keystr(void) {
isc_buffer_add(&keynamesrc, n - name);
debug("namefromtext");
- result = dns_name_fromtext(keyname, &keynamesrc, dns_rootname,
- ISC_FALSE, NULL);
+ result = dns_name_fromtext(keyname, &keynamesrc, dns_rootname, 0, NULL);
check_result(result, "dns_name_fromtext");
secretlen = strlen(secretstr) * 3 / 4;
@@ -553,21 +575,67 @@ setup_keystr(void) {
isc_mem_free(mctx, secret);
}
-static int
-basenamelen(const char *file) {
- int len = strlen(file);
+/*
+ * Get a key from a named.conf format keyfile
+ */
+static isc_result_t
+read_sessionkey(isc_mem_t *mctx, isc_log_t *lctx) {
+ cfg_parser_t *pctx = NULL;
+ cfg_obj_t *sessionkey = NULL;
+ const cfg_obj_t *key = NULL;
+ const cfg_obj_t *secretobj = NULL;
+ const cfg_obj_t *algorithmobj = NULL;
+ const char *keyname;
+ const char *secretstr;
+ const char *algorithm;
+ isc_result_t result;
+ int len;
- if (len > 1 && file[len - 1] == '.')
- len -= 1;
- else if (len > 8 && strcmp(file + len - 8, ".private") == 0)
- len -= 8;
- else if (len > 4 && strcmp(file + len - 4, ".key") == 0)
- len -= 4;
- return (len);
+ if (! isc_file_exists(keyfile))
+ return (ISC_R_FILENOTFOUND);
+
+ result = cfg_parser_create(mctx, lctx, &pctx);
+ if (result != ISC_R_SUCCESS)
+ goto cleanup;
+
+ result = cfg_parse_file(pctx, keyfile, &cfg_type_sessionkey,
+ &sessionkey);
+ if (result != ISC_R_SUCCESS)
+ goto cleanup;
+
+ result = cfg_map_get(sessionkey, "key", &key);
+ if (result != ISC_R_SUCCESS)
+ goto cleanup;
+
+ (void) cfg_map_get(key, "secret", &secretobj);
+ (void) cfg_map_get(key, "algorithm", &algorithmobj);
+ if (secretobj == NULL || algorithmobj == NULL)
+ fatal("key must have algorithm and secret");
+
+ keyname = cfg_obj_asstring(cfg_map_getname(key));
+ secretstr = cfg_obj_asstring(secretobj);
+ algorithm = cfg_obj_asstring(algorithmobj);
+
+ len = strlen(algorithm) + strlen(keyname) + strlen(secretstr) + 3;
+ keystr = isc_mem_allocate(mctx, len);
+ snprintf(keystr, len, "%s:%s:%s", algorithm, keyname, secretstr);
+ setup_keystr();
+
+ cleanup:
+ if (pctx != NULL) {
+ if (sessionkey != NULL)
+ cfg_obj_destroy(pctx, &sessionkey);
+ cfg_parser_destroy(&pctx);
+ }
+
+ if (keystr != NULL)
+ isc_mem_free(mctx, keystr);
+
+ return (result);
}
static void
-setup_keyfile(void) {
+setup_keyfile(isc_mem_t *mctx, isc_log_t *lctx) {
dst_key_t *dstkey = NULL;
isc_result_t result;
dns_name_t *hmacname = NULL;
@@ -577,15 +645,25 @@ setup_keyfile(void) {
if (sig0key != NULL)
dst_key_free(&sig0key);
- result = dst_key_fromnamedfile(keyfile,
+ /* Try reading the key from a K* pair */
+ result = dst_key_fromnamedfile(keyfile, NULL,
DST_TYPE_PRIVATE | DST_TYPE_KEY, mctx,
&dstkey);
+
+ /* If that didn't work, try reading it as a session.key keyfile */
+ if (result != ISC_R_SUCCESS) {
+ result = read_sessionkey(mctx, lctx);
+ if (result == ISC_R_SUCCESS)
+ return;
+ }
+
if (result != ISC_R_SUCCESS) {
fprintf(stderr, "could not read key from %.*s.{private,key}: "
"%s\n", basenamelen(keyfile), keyfile,
isc_result_totext(result));
return;
}
+
switch (dst_key_alg(dstkey)) {
case DST_ALG_HMACMD5:
hmacname = DNS_TSIG_HMACMD5_NAME;
@@ -748,7 +826,7 @@ setup_system(void) {
if (servers == NULL)
fatal("out of memory");
localhost.s_addr = htonl(INADDR_LOOPBACK);
- isc_sockaddr_fromin(&servers[0], &localhost, DNSDEFAULTPORT);
+ isc_sockaddr_fromin(&servers[0], &localhost, dnsport);
} else {
servers = isc_mem_get(mctx, ns_total * sizeof(isc_sockaddr_t));
if (servers == NULL)
@@ -757,12 +835,12 @@ setup_system(void) {
if (lwconf->nameservers[i].family == LWRES_ADDRTYPE_V4) {
struct in_addr in4;
memcpy(&in4, lwconf->nameservers[i].address, 4);
- isc_sockaddr_fromin(&servers[i], &in4, DNSDEFAULTPORT);
+ isc_sockaddr_fromin(&servers[i], &in4, dnsport);
} else {
struct in6_addr in6;
memcpy(&in6, lwconf->nameservers[i].address, 16);
isc_sockaddr_fromin6(&servers[i], &in6,
- DNSDEFAULTPORT);
+ dnsport);
}
}
}
@@ -829,8 +907,13 @@ setup_system(void) {
if (keystr != NULL)
setup_keystr();
- else if (keyfile != NULL)
- setup_keyfile();
+ else if (local_only) {
+ result = read_sessionkey(mctx, lctx);
+ if (result != ISC_R_SUCCESS)
+ fatal("can't read key from %s: %s\n",
+ keyfile, isc_result_totext(result));
+ } else if (keyfile != NULL)
+ setup_keyfile(mctx, lctx);
}
static void
@@ -847,7 +930,7 @@ get_address(char *host, in_port_t port, isc_sockaddr_t *sockaddr) {
INSIST(count == 1);
}
-#define PARSE_ARGS_FMT "dDMl:y:govk:rR::t:u:"
+#define PARSE_ARGS_FMT "dDML:y:ghlovk:p:rR::t:u:"
static void
pre_parse_args(int argc, char **argv) {
@@ -864,10 +947,11 @@ pre_parse_args(int argc, char **argv) {
break;
case '?':
+ case 'h':
if (isc_commandline_option != '?')
fprintf(stderr, "%s: invalid argument -%c\n",
argv[0], isc_commandline_option);
- fprintf(stderr, "usage: nsupdate [-d] "
+ fprintf(stderr, "usage: nsupdate [-dD] [-L level] [-l]"
"[-g | -o | -y keyname:secret | -k keyfile] "
"[-v] [filename]\n");
exit(1);
@@ -899,6 +983,9 @@ parse_args(int argc, char **argv, isc_mem_t *mctx, isc_entropy_t **ectx) {
case 'M':
break;
case 'l':
+ local_only = ISC_TRUE;
+ break;
+ case 'L':
result = isc_parse_uint32(&i, isc_commandline_argument,
10);
if (result != ISC_R_SUCCESS) {
@@ -925,6 +1012,15 @@ parse_args(int argc, char **argv, isc_mem_t *mctx, isc_entropy_t **ectx) {
usegsstsig = ISC_TRUE;
use_win2k_gsstsig = ISC_TRUE;
break;
+ case 'p':
+ result = isc_parse_uint16(&dnsport,
+ isc_commandline_argument, 10);
+ if (result != ISC_R_SUCCESS) {
+ fprintf(stderr, "bad port number "
+ "'%s'\n", isc_commandline_argument);
+ exit(1);
+ }
+ break;
case 't':
result = isc_parse_uint32(&timeout,
isc_commandline_argument, 10);
@@ -970,6 +1066,22 @@ parse_args(int argc, char **argv, isc_mem_t *mctx, isc_entropy_t **ectx) {
exit(1);
}
+ if (local_only) {
+ struct in_addr localhost;
+
+ if (keyfile == NULL)
+ keyfile = SESSION_KEYFILE;
+
+ if (userserver == NULL) {
+ userserver = isc_mem_get(mctx, sizeof(isc_sockaddr_t));
+ if (userserver == NULL)
+ fatal("out of memory");
+ }
+
+ localhost.s_addr = htonl(INADDR_LOOPBACK);
+ isc_sockaddr_fromin(userserver, &localhost, dnsport);
+ }
+
#ifdef GSSAPI
if (usegsstsig && (keyfile != NULL || keystr != NULL)) {
fprintf(stderr, "%s: cannot specify -g with -k or -y\n",
@@ -978,7 +1090,7 @@ parse_args(int argc, char **argv, isc_mem_t *mctx, isc_entropy_t **ectx) {
}
#else
if (usegsstsig) {
- fprintf(stderr, "%s: cannot specify -g or -o, " \
+ fprintf(stderr, "%s: cannot specify -g or -o, " \
"program not linked with GSS API Library\n",
argv[0]);
exit(1);
@@ -1024,8 +1136,7 @@ parse_name(char **cmdlinep, dns_message_t *msg, dns_name_t **namep) {
dns_message_takebuffer(msg, &namebuf);
isc_buffer_init(&source, word, strlen(word));
isc_buffer_add(&source, strlen(word));
- result = dns_name_fromtext(*namep, &source, dns_rootname,
- ISC_FALSE, NULL);
+ result = dns_name_fromtext(*namep, &source, dns_rootname, 0, NULL);
check_result(result, "dns_name_fromtext");
isc_buffer_invalidate(&source);
return (STATUS_MORE);
@@ -1227,6 +1338,11 @@ evaluate_server(char *cmdline) {
char *word, *server;
long port;
+ if (local_only) {
+ fprintf(stderr, "cannot reset server in localhost-only mode\n");
+ return (STATUS_SYNTAX);
+ }
+
word = nsu_strsep(&cmdline, " \t\r\n");
if (*word == 0) {
fprintf(stderr, "could not read server name\n");
@@ -1236,7 +1352,7 @@ evaluate_server(char *cmdline) {
word = nsu_strsep(&cmdline, " \t\r\n");
if (*word == 0)
- port = DNSDEFAULTPORT;
+ port = dnsport;
else {
char *endp;
port = strtol(word, &endp, 10);
@@ -1342,7 +1458,7 @@ evaluate_key(char *cmdline) {
isc_buffer_init(&b, namestr, strlen(namestr));
isc_buffer_add(&b, strlen(namestr));
- result = dns_name_fromtext(keyname, &b, dns_rootname, ISC_FALSE, NULL);
+ result = dns_name_fromtext(keyname, &b, dns_rootname, 0, NULL);
if (result != ISC_R_SUCCESS) {
fprintf(stderr, "could not parse key name\n");
return (STATUS_SYNTAX);
@@ -1399,8 +1515,7 @@ evaluate_zone(char *cmdline) {
userzone = dns_fixedname_name(&fuserzone);
isc_buffer_init(&b, word, strlen(word));
isc_buffer_add(&b, strlen(word));
- result = dns_name_fromtext(userzone, &b, dns_rootname, ISC_FALSE,
- NULL);
+ result = dns_name_fromtext(userzone, &b, dns_rootname, 0, NULL);
if (result != ISC_R_SUCCESS) {
userzone = NULL; /* Lest it point to an invalid name */
fprintf(stderr, "could not parse zone name\n");
@@ -1852,9 +1967,9 @@ get_next_command(void) {
"server address [port] (set master server for zone)\n"
"send (send the update request)\n"
"show (show the update request)\n"
-"answer (show the answer to the last request)\n"
+"answer (show the answer to the last request)\n"
"quit (quit, any pending update is not sent\n"
-"help (display this message_\n"
+"help (display this message_\n"
"key [hmac:]keyname secret (use TSIG to sign the request)\n"
"gsstsig (use GSS_TSIG to sign the request)\n"
"oldgsstsig (use Microsoft's GSS_TSIG to sign the request)\n"
@@ -2015,7 +2130,7 @@ send_update(dns_name_t *zonename, isc_sockaddr_t *master,
{
isc_result_t result;
dns_request_t *request = NULL;
- unsigned int options = 0;
+ unsigned int options = DNS_REQUESTOPT_CASE;
ddebug("send_update()");
@@ -2248,7 +2363,7 @@ recvsoa(isc_task_t *task, isc_event_t *event) {
result = dns_name_totext(&master, ISC_TRUE, &buf);
check_result(result, "dns_name_totext");
serverstr[isc_buffer_usedlength(&buf)] = 0;
- get_address(serverstr, DNSDEFAULTPORT, &tempaddr);
+ get_address(serverstr, dnsport, &tempaddr);
serveraddr = &tempaddr;
}
dns_rdata_freestruct(&soa);
@@ -2319,9 +2434,60 @@ sendrequest(isc_sockaddr_t *srcaddr, isc_sockaddr_t *destaddr,
}
#ifdef GSSAPI
+
+/*
+ * Get the realm from the users kerberos ticket if possible
+ */
static void
-start_gssrequest(dns_name_t *master)
+get_ticket_realm(isc_mem_t *mctx)
{
+ krb5_context ctx;
+ krb5_error_code rc;
+ krb5_ccache ccache;
+ krb5_principal princ;
+ char *name, *ticket_realm;
+
+ rc = krb5_init_context(&ctx);
+ if (rc != 0)
+ return;
+
+ rc = krb5_cc_default(ctx, &ccache);
+ if (rc != 0) {
+ krb5_free_context(ctx);
+ return;
+ }
+
+ rc = krb5_cc_get_principal(ctx, ccache, &princ);
+ if (rc != 0) {
+ krb5_cc_close(ctx, ccache);
+ krb5_free_context(ctx);
+ return;
+ }
+
+ rc = krb5_unparse_name(ctx, princ, &name);
+ if (rc != 0) {
+ krb5_free_principal(ctx, princ);
+ krb5_cc_close(ctx, ccache);
+ krb5_free_context(ctx);
+ return;
+ }
+
+ ticket_realm = strrchr(name, '@');
+ if (ticket_realm != NULL) {
+ realm = isc_mem_strdup(mctx, ticket_realm);
+ }
+
+ free(name);
+ krb5_free_principal(ctx, princ);
+ krb5_cc_close(ctx, ccache);
+ krb5_free_context(ctx);
+ if (realm != NULL && debugging)
+ fprintf(stderr, "Found realm from ticket: %s\n", realm+1);
+}
+
+
+static void
+start_gssrequest(dns_name_t *master) {
gss_ctx_id_t context;
isc_buffer_t buf;
isc_result_t result;
@@ -2332,12 +2498,13 @@ start_gssrequest(dns_name_t *master)
dns_fixedname_t fname;
char namestr[DNS_NAME_FORMATSIZE];
char keystr[DNS_NAME_FORMATSIZE];
+ char *err_message = NULL;
debug("start_gssrequest");
usevc = ISC_TRUE;
if (gssring != NULL)
- dns_tsigkeyring_destroy(&gssring);
+ dns_tsigkeyring_detach(&gssring);
gssring = NULL;
result = dns_tsigkeyring_create(mctx, &gssring);
@@ -2352,13 +2519,16 @@ start_gssrequest(dns_name_t *master)
fatal("out of memory");
}
if (userserver == NULL)
- get_address(namestr, DNSDEFAULTPORT, kserver);
+ get_address(namestr, dnsport, kserver);
else
(void)memcpy(kserver, userserver, sizeof(isc_sockaddr_t));
dns_fixedname_init(&fname);
servname = dns_fixedname_name(&fname);
+ if (realm == NULL)
+ get_ticket_realm(mctx);
+
result = isc_string_printf(servicename, sizeof(servicename),
"DNS/%s%s", namestr, realm ? realm : "");
if (result != ISC_R_SUCCESS)
@@ -2366,8 +2536,7 @@ start_gssrequest(dns_name_t *master)
isc_result_totext(result));
isc_buffer_init(&buf, servicename, strlen(servicename));
isc_buffer_add(&buf, strlen(servicename));
- result = dns_name_fromtext(servname, &buf, dns_rootname,
- ISC_FALSE, NULL);
+ result = dns_name_fromtext(servname, &buf, dns_rootname, 0, NULL);
if (result != ISC_R_SUCCESS)
fatal("dns_name_fromtext(servname) failed: %s",
isc_result_totext(result));
@@ -2384,8 +2553,7 @@ start_gssrequest(dns_name_t *master)
isc_buffer_init(&buf, keystr, strlen(keystr));
isc_buffer_add(&buf, strlen(keystr));
- result = dns_name_fromtext(keyname, &buf, dns_rootname,
- ISC_FALSE, NULL);
+ result = dns_name_fromtext(keyname, &buf, dns_rootname, 0, NULL);
if (result != ISC_R_SUCCESS)
fatal("dns_name_fromtext(keyname) failed: %s",
isc_result_totext(result));
@@ -2402,9 +2570,11 @@ start_gssrequest(dns_name_t *master)
/* Build first request. */
context = GSS_C_NO_CONTEXT;
result = dns_tkey_buildgssquery(rmsg, keyname, servname, NULL, 0,
- &context, use_win2k_gsstsig);
+ &context, use_win2k_gsstsig,
+ mctx, &err_message);
if (result == ISC_R_FAILURE)
- fatal("Check your Kerberos ticket, it may have expired.");
+ fatal("tkey query failed: %s",
+ err_message != NULL ? err_message : "unknown error");
if (result != ISC_R_SUCCESS)
fatal("dns_tkey_buildgssquery failed: %s",
isc_result_totext(result));
@@ -2453,6 +2623,7 @@ recvgss(isc_task_t *task, isc_event_t *event) {
isc_buffer_t buf;
dns_name_t *servname;
dns_fixedname_t fname;
+ char *err_message = NULL;
UNUSED(task);
@@ -2535,14 +2706,14 @@ recvgss(isc_task_t *task, isc_event_t *event) {
servname = dns_fixedname_name(&fname);
isc_buffer_init(&buf, servicename, strlen(servicename));
isc_buffer_add(&buf, strlen(servicename));
- result = dns_name_fromtext(servname, &buf, dns_rootname,
- ISC_FALSE, NULL);
+ result = dns_name_fromtext(servname, &buf, dns_rootname, 0, NULL);
check_result(result, "dns_name_fromtext");
tsigkey = NULL;
result = dns_tkey_gssnegotiate(tsigquery, rcvmsg, servname,
&context, &tsigkey, gssring,
- use_win2k_gsstsig);
+ use_win2k_gsstsig,
+ &err_message);
switch (result) {
case DNS_R_CONTINUE:
@@ -2585,7 +2756,9 @@ recvgss(isc_task_t *task, isc_event_t *event) {
break;
default:
- fatal("dns_tkey_negotiategss: %s", isc_result_totext(result));
+ fatal("dns_tkey_negotiategss: %s %s",
+ isc_result_totext(result),
+ err_message != NULL ? err_message : "");
}
done:
@@ -2695,8 +2868,8 @@ cleanup(void) {
dns_tsigkey_detach(&tsigkey);
}
if (gssring != NULL) {
- ddebug("Destroying GSS-TSIG keyring");
- dns_tsigkeyring_destroy(&gssring);
+ ddebug("Detaching GSS-TSIG keyring");
+ dns_tsigkeyring_detach(&gssring);
}
if (kserver != NULL) {
isc_mem_put(mctx, kserver, sizeof(isc_sockaddr_t));
diff --git a/contrib/bind9/bin/nsupdate/nsupdate.docbook b/contrib/bind9/bin/nsupdate/nsupdate.docbook
index 4069a2b..2a92af4 100644
--- a/contrib/bind9/bin/nsupdate/nsupdate.docbook
+++ b/contrib/bind9/bin/nsupdate/nsupdate.docbook
@@ -18,10 +18,10 @@
- PERFORMANCE OF THIS SOFTWARE.
-->
-<!-- $Id: nsupdate.docbook,v 1.34.48.5 2010-07-09 23:45:50 tbox Exp $ -->
+<!-- $Id: nsupdate.docbook,v 1.44 2010-07-09 23:46:51 tbox Exp $ -->
<refentry id="man.nsupdate">
<refentryinfo>
- <date>Jun 30, 2000</date>
+ <date>Aug 25, 2009</date>
</refentryinfo>
<refmeta>
<refentrytitle><application>nsupdate</application></refentrytitle>
@@ -61,6 +61,7 @@
<group>
<arg><option>-g</option></arg>
<arg><option>-o</option></arg>
+ <arg><option>-l</option></arg>
<arg><option>-y <replaceable class="parameter"><optional>hmac:</optional>keyname:secret</replaceable></option></arg>
<arg><option>-k <replaceable class="parameter">keyfile</replaceable></option></arg>
</group>
@@ -76,7 +77,7 @@
<refsect1>
<title>DESCRIPTION</title>
<para><command>nsupdate</command>
- is used to submit Dynamic DNS Update requests as defined in RFC2136
+ is used to submit Dynamic DNS Update requests as defined in RFC 2136
to a name server.
This allows resource records to be added or removed from a zone
without manually editing the zone file.
@@ -112,10 +113,14 @@
report additional debugging information to <option>-d</option>.
</para>
<para>
+ The <option>-L</option> option with an integer argument of zero or
+ higher sets the logging debug level. If zero, logging is disabled.
+ </para>
+ <para>
Transaction signatures can be used to authenticate the Dynamic
DNS updates. These use the TSIG resource record type described
- in RFC2845 or the SIG(0) record described in RFC3535 and
- RFC2931 or GSS-TSIG as described in RFC3645. TSIG relies on
+ in RFC 2845 or the SIG(0) record described in RFC 2535 and
+ RFC 2931 or GSS-TSIG as described in RFC 3645. TSIG relies on
a shared secret that should only be known to
<command>nsupdate</command> and the name server. Currently,
the only supported encryption algorithm for TSIG is HMAC-MD5,
@@ -132,46 +137,61 @@
record in a zone served by the name server.
<command>nsupdate</command> does not read
<filename>/etc/named.conf</filename>.
- GSS-TSIG uses Kerberos credentials.
+ </para>
+ <para>
+ GSS-TSIG uses Kerberos credentials. Standard GSS-TSIG mode
+ is switched on with the <option>-g</option> flag. A
+ non-standards-compliant variant of GSS-TSIG used by Windows
+ 2000 can be switched on with the <option>-o</option> flag.
</para>
<para><command>nsupdate</command>
uses the <option>-y</option> or <option>-k</option> option
to provide the shared secret needed to generate a TSIG record
for authenticating Dynamic DNS update requests, default type
- HMAC-MD5. These options are mutually exclusive. With the
- <option>-k</option> option, <command>nsupdate</command> reads
- the shared secret from the file <parameter>keyfile</parameter>,
- whose name is of the form
- <filename>K{name}.+157.+{random}.private</filename>. For
- historical reasons, the file
- <filename>K{name}.+157.+{random}.key</filename> must also be
- present. When the <option>-y</option> option is used, a
- signature is generated from
+ HMAC-MD5. These options are mutually exclusive.
+ </para>
+ <para>
+ When the <option>-y</option> option is used, a signature is
+ generated from
<optional><parameter>hmac:</parameter></optional><parameter>keyname:secret.</parameter>
<parameter>keyname</parameter> is the name of the key, and
- <parameter>secret</parameter> is the base64 encoded shared
- secret. Use of the <option>-y</option> option is discouraged
- because the shared secret is supplied as a command line
- argument in clear text. This may be visible in the output
- from
+ <parameter>secret</parameter> is the base64 encoded shared secret.
+ Use of the <option>-y</option> option is discouraged because the
+ shared secret is supplied as a command line argument in clear text.
+ This may be visible in the output from
<citerefentry>
- <refentrytitle>ps</refentrytitle><manvolnum>1</manvolnum>
- </citerefentry> or in a history file maintained by the user's
- shell.
+ <refentrytitle>ps</refentrytitle><manvolnum>1</manvolnum>
+ </citerefentry>
+ or in a history file maintained by the user's shell.
</para>
<para>
+ With the
+ <option>-k</option> option, <command>nsupdate</command> reads
+ the shared secret from the file <parameter>keyfile</parameter>.
+ Keyfiles may be in two formats: a single file containing
+ a <filename>named.conf</filename>-format <command>key</command>
+ statement, which may be generated automatically by
+ <command>ddns-confgen</command>, or a pair of files whose names are
+ of the format <filename>K{name}.+157.+{random}.key</filename> and
+ <filename>K{name}.+157.+{random}.private</filename>, which can be
+ generated by <command>dnssec-keygen</command>.
The <option>-k</option> may also be used to specify a SIG(0) key used
to authenticate Dynamic DNS update requests. In this case, the key
specified is not an HMAC-MD5 key.
</para>
<para>
- The <option>-g</option> and <option>-o</option> specify that
- GSS-TSIG is to be used. The <option>-o</option> should only
- be used with old Microsoft Windows 2000 servers.
+ <command>nsupdate</command> can be run in a local-host only mode
+ using the <option>-l</option> flag. This sets the server address to
+ localhost (disabling the <command>server</command> so that the server
+ address cannot be overridden). Connections to the local server will
+ use a TSIG key found in <filename>/var/run/named/session.key</filename>,
+ which is automatically generated by <command>named</command> if any
+ local master zone has set <command>update-policy</command> to
+ <command>local</command>. The location of this key file can be
+ overridden with the <option>-k</option> option.
</para>
<para>
- By default,
- <command>nsupdate</command>
+ By default, <command>nsupdate</command>
uses UDP to send update requests to the name server unless they are too
large to fit in a UDP request in which case TCP will be used.
The
@@ -182,6 +202,10 @@
This may be preferable when a batch of update requests is made.
</para>
<para>
+ The <option>-p</option> sets the default port number to use for
+ connections to a name server. The default is 53.
+ </para>
+ <para>
The <option>-t</option> option sets the maximum time an update request
can
take before it is aborted. The default is 300 seconds. Zero can be
@@ -650,9 +674,9 @@
If there are, the update request fails.
If this name does not exist, a CNAME for it is added.
This ensures that when the CNAME is added, it cannot conflict with the
- long-standing rule in RFC1034 that a name must not exist as any other
+ long-standing rule in RFC 1034 that a name must not exist as any other
record type if it exists as a CNAME.
- (The rule has been updated for DNSSEC in RFC2535 to allow CNAMEs to have
+ (The rule has been updated for DNSSEC in RFC 2535 to allow CNAMEs to have
RRSIG, DNSKEY and NSEC records.)
</para>
</refsect1>
@@ -671,6 +695,15 @@
</varlistentry>
<varlistentry>
+ <term><constant>/var/run/named/session.key</constant></term>
+ <listitem>
+ <para>
+ sets the default TSIG key for use in local-only mode
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
<term><constant>K{name}.+157.+{random}.key</constant></term>
<listitem>
<para>
@@ -699,36 +732,26 @@
<refsect1>
<title>SEE ALSO</title>
- <para><citerefentry>
- <refentrytitle>RFC2136</refentrytitle>
- </citerefentry>,
- <citerefentry>
- <refentrytitle>RFC3007</refentrytitle>
- </citerefentry>,
- <citerefentry>
- <refentrytitle>RFC2104</refentrytitle>
- </citerefentry>,
- <citerefentry>
- <refentrytitle>RFC2845</refentrytitle>
- </citerefentry>,
- <citerefentry>
- <refentrytitle>RFC1034</refentrytitle>
- </citerefentry>,
- <citerefentry>
- <refentrytitle>RFC2535</refentrytitle>
- </citerefentry>,
+ <para>
+ <citetitle>RFC 2136</citetitle>,
+ <citetitle>RFC 3007</citetitle>,
+ <citetitle>RFC 2104</citetitle>,
+ <citetitle>RFC 2845</citetitle>,
+ <citetitle>RFC 1034</citetitle>,
+ <citetitle>RFC 2535</citetitle>,
+ <citetitle>RFC 2931</citetitle>,
<citerefentry>
- <refentrytitle>RFC2931</refentrytitle>
+ <refentrytitle>named</refentrytitle><manvolnum>8</manvolnum>
</citerefentry>,
<citerefentry>
- <refentrytitle>named</refentrytitle><manvolnum>8</manvolnum>
+ <refentrytitle>ddns-confgen</refentrytitle><manvolnum>8</manvolnum>
</citerefentry>,
<citerefentry>
<refentrytitle>dnssec-keygen</refentrytitle><manvolnum>8</manvolnum>
</citerefentry>.
</para>
-
</refsect1>
+
<refsect1>
<title>BUGS</title>
<para>
diff --git a/contrib/bind9/bin/nsupdate/nsupdate.html b/contrib/bind9/bin/nsupdate/nsupdate.html
index a383617..f488315 100644
--- a/contrib/bind9/bin/nsupdate/nsupdate.html
+++ b/contrib/bind9/bin/nsupdate/nsupdate.html
@@ -14,7 +14,7 @@
- OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
- PERFORMANCE OF THIS SOFTWARE.
-->
-<!-- $Id: nsupdate.html,v 1.40.48.4 2010-07-10 02:06:17 tbox Exp $ -->
+<!-- $Id: nsupdate.html,v 1.50 2010-07-10 01:14:19 tbox Exp $ -->
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
@@ -29,12 +29,12 @@
</div>
<div class="refsynopsisdiv">
<h2>Synopsis</h2>
-<div class="cmdsynopsis"><p><code class="command">nsupdate</code> [<code class="option">-d</code>] [<code class="option">-D</code>] [[<code class="option">-g</code>] | [<code class="option">-o</code>] | [<code class="option">-y <em class="replaceable"><code>[<span class="optional">hmac:</span>]keyname:secret</code></em></code>] | [<code class="option">-k <em class="replaceable"><code>keyfile</code></em></code>]] [<code class="option">-t <em class="replaceable"><code>timeout</code></em></code>] [<code class="option">-u <em class="replaceable"><code>udptimeout</code></em></code>] [<code class="option">-r <em class="replaceable"><code>udpretries</code></em></code>] [<code class="option">-R <em class="replaceable"><code>randomdev</code></em></code>] [<code class="option">-v</code>] [filename]</p></div>
+<div class="cmdsynopsis"><p><code class="command">nsupdate</code> [<code class="option">-d</code>] [<code class="option">-D</code>] [[<code class="option">-g</code>] | [<code class="option">-o</code>] | [<code class="option">-l</code>] | [<code class="option">-y <em class="replaceable"><code>[<span class="optional">hmac:</span>]keyname:secret</code></em></code>] | [<code class="option">-k <em class="replaceable"><code>keyfile</code></em></code>]] [<code class="option">-t <em class="replaceable"><code>timeout</code></em></code>] [<code class="option">-u <em class="replaceable"><code>udptimeout</code></em></code>] [<code class="option">-r <em class="replaceable"><code>udpretries</code></em></code>] [<code class="option">-R <em class="replaceable"><code>randomdev</code></em></code>] [<code class="option">-v</code>] [filename]</p></div>
</div>
<div class="refsect1" lang="en">
-<a name="id2543452"></a><h2>DESCRIPTION</h2>
+<a name="id2543457"></a><h2>DESCRIPTION</h2>
<p><span><strong class="command">nsupdate</strong></span>
- is used to submit Dynamic DNS Update requests as defined in RFC2136
+ is used to submit Dynamic DNS Update requests as defined in RFC 2136
to a name server.
This allows resource records to be added or removed from a zone
without manually editing the zone file.
@@ -70,10 +70,14 @@
report additional debugging information to <code class="option">-d</code>.
</p>
<p>
+ The <code class="option">-L</code> option with an integer argument of zero or
+ higher sets the logging debug level. If zero, logging is disabled.
+ </p>
+<p>
Transaction signatures can be used to authenticate the Dynamic
DNS updates. These use the TSIG resource record type described
- in RFC2845 or the SIG(0) record described in RFC3535 and
- RFC2931 or GSS-TSIG as described in RFC3645. TSIG relies on
+ in RFC 2845 or the SIG(0) record described in RFC 2535 and
+ RFC 2931 or GSS-TSIG as described in RFC 3645. TSIG relies on
a shared secret that should only be known to
<span><strong class="command">nsupdate</strong></span> and the name server. Currently,
the only supported encryption algorithm for TSIG is HMAC-MD5,
@@ -90,44 +94,59 @@
record in a zone served by the name server.
<span><strong class="command">nsupdate</strong></span> does not read
<code class="filename">/etc/named.conf</code>.
- GSS-TSIG uses Kerberos credentials.
+ </p>
+<p>
+ GSS-TSIG uses Kerberos credentials. Standard GSS-TSIG mode
+ is switched on with the <code class="option">-g</code> flag. A
+ non-standards-compliant variant of GSS-TSIG used by Windows
+ 2000 can be switched on with the <code class="option">-o</code> flag.
</p>
<p><span><strong class="command">nsupdate</strong></span>
uses the <code class="option">-y</code> or <code class="option">-k</code> option
to provide the shared secret needed to generate a TSIG record
for authenticating Dynamic DNS update requests, default type
- HMAC-MD5. These options are mutually exclusive. With the
- <code class="option">-k</code> option, <span><strong class="command">nsupdate</strong></span> reads
- the shared secret from the file <em class="parameter"><code>keyfile</code></em>,
- whose name is of the form
- <code class="filename">K{name}.+157.+{random}.private</code>. For
- historical reasons, the file
- <code class="filename">K{name}.+157.+{random}.key</code> must also be
- present. When the <code class="option">-y</code> option is used, a
- signature is generated from
+ HMAC-MD5. These options are mutually exclusive.
+ </p>
+<p>
+ When the <code class="option">-y</code> option is used, a signature is
+ generated from
[<span class="optional"><em class="parameter"><code>hmac:</code></em></span>]<em class="parameter"><code>keyname:secret.</code></em>
<em class="parameter"><code>keyname</code></em> is the name of the key, and
- <em class="parameter"><code>secret</code></em> is the base64 encoded shared
- secret. Use of the <code class="option">-y</code> option is discouraged
- because the shared secret is supplied as a command line
- argument in clear text. This may be visible in the output
- from
- <span class="citerefentry"><span class="refentrytitle">ps</span>(1)</span> or in a history file maintained by the user's
- shell.
+ <em class="parameter"><code>secret</code></em> is the base64 encoded shared secret.
+ Use of the <code class="option">-y</code> option is discouraged because the
+ shared secret is supplied as a command line argument in clear text.
+ This may be visible in the output from
+ <span class="citerefentry"><span class="refentrytitle">ps</span>(1)</span>
+ or in a history file maintained by the user's shell.
</p>
<p>
+ With the
+ <code class="option">-k</code> option, <span><strong class="command">nsupdate</strong></span> reads
+ the shared secret from the file <em class="parameter"><code>keyfile</code></em>.
+ Keyfiles may be in two formats: a single file containing
+ a <code class="filename">named.conf</code>-format <span><strong class="command">key</strong></span>
+ statement, which may be generated automatically by
+ <span><strong class="command">ddns-confgen</strong></span>, or a pair of files whose names are
+ of the format <code class="filename">K{name}.+157.+{random}.key</code> and
+ <code class="filename">K{name}.+157.+{random}.private</code>, which can be
+ generated by <span><strong class="command">dnssec-keygen</strong></span>.
The <code class="option">-k</code> may also be used to specify a SIG(0) key used
to authenticate Dynamic DNS update requests. In this case, the key
specified is not an HMAC-MD5 key.
</p>
<p>
- The <code class="option">-g</code> and <code class="option">-o</code> specify that
- GSS-TSIG is to be used. The <code class="option">-o</code> should only
- be used with old Microsoft Windows 2000 servers.
+ <span><strong class="command">nsupdate</strong></span> can be run in a local-host only mode
+ using the <code class="option">-l</code> flag. This sets the server address to
+ localhost (disabling the <span><strong class="command">server</strong></span> so that the server
+ address cannot be overridden). Connections to the local server will
+ use a TSIG key found in <code class="filename">/var/run/named/session.key</code>,
+ which is automatically generated by <span><strong class="command">named</strong></span> if any
+ local master zone has set <span><strong class="command">update-policy</strong></span> to
+ <span><strong class="command">local</strong></span>. The location of this key file can be
+ overridden with the <code class="option">-k</code> option.
</p>
<p>
- By default,
- <span><strong class="command">nsupdate</strong></span>
+ By default, <span><strong class="command">nsupdate</strong></span>
uses UDP to send update requests to the name server unless they are too
large to fit in a UDP request in which case TCP will be used.
The
@@ -138,6 +157,10 @@
This may be preferable when a batch of update requests is made.
</p>
<p>
+ The <code class="option">-p</code> sets the default port number to use for
+ connections to a name server. The default is 53.
+ </p>
+<p>
The <code class="option">-t</code> option sets the maximum time an update request
can
take before it is aborted. The default is 300 seconds. Zero can be
@@ -169,7 +192,7 @@
</p>
</div>
<div class="refsect1" lang="en">
-<a name="id2543730"></a><h2>INPUT FORMAT</h2>
+<a name="id2543788"></a><h2>INPUT FORMAT</h2>
<p><span><strong class="command">nsupdate</strong></span>
reads input from
<em class="parameter"><code>filename</code></em>
@@ -457,7 +480,7 @@
</p>
</div>
<div class="refsect1" lang="en">
-<a name="id2544642"></a><h2>EXAMPLES</h2>
+<a name="id2544700"></a><h2>EXAMPLES</h2>
<p>
The examples below show how
<span><strong class="command">nsupdate</strong></span>
@@ -504,19 +527,23 @@
If there are, the update request fails.
If this name does not exist, a CNAME for it is added.
This ensures that when the CNAME is added, it cannot conflict with the
- long-standing rule in RFC1034 that a name must not exist as any other
+ long-standing rule in RFC 1034 that a name must not exist as any other
record type if it exists as a CNAME.
- (The rule has been updated for DNSSEC in RFC2535 to allow CNAMEs to have
+ (The rule has been updated for DNSSEC in RFC 2535 to allow CNAMEs to have
RRSIG, DNSKEY and NSEC records.)
</p>
</div>
<div class="refsect1" lang="en">
-<a name="id2544685"></a><h2>FILES</h2>
+<a name="id2544744"></a><h2>FILES</h2>
<div class="variablelist"><dl>
<dt><span class="term"><code class="constant">/etc/resolv.conf</code></span></dt>
<dd><p>
used to identify default name server
</p></dd>
+<dt><span class="term"><code class="constant">/var/run/named/session.key</code></span></dt>
+<dd><p>
+ sets the default TSIG key for use in local-only mode
+ </p></dd>
<dt><span class="term"><code class="constant">K{name}.+157.+{random}.key</code></span></dt>
<dd><p>
base-64 encoding of HMAC-MD5 key created by
@@ -530,20 +557,22 @@
</dl></div>
</div>
<div class="refsect1" lang="en">
-<a name="id2544755"></a><h2>SEE ALSO</h2>
-<p><span class="citerefentry"><span class="refentrytitle">RFC2136</span></span>,
- <span class="citerefentry"><span class="refentrytitle">RFC3007</span></span>,
- <span class="citerefentry"><span class="refentrytitle">RFC2104</span></span>,
- <span class="citerefentry"><span class="refentrytitle">RFC2845</span></span>,
- <span class="citerefentry"><span class="refentrytitle">RFC1034</span></span>,
- <span class="citerefentry"><span class="refentrytitle">RFC2535</span></span>,
- <span class="citerefentry"><span class="refentrytitle">RFC2931</span></span>,
+<a name="id2544827"></a><h2>SEE ALSO</h2>
+<p>
+ <em class="citetitle">RFC 2136</em>,
+ <em class="citetitle">RFC 3007</em>,
+ <em class="citetitle">RFC 2104</em>,
+ <em class="citetitle">RFC 2845</em>,
+ <em class="citetitle">RFC 1034</em>,
+ <em class="citetitle">RFC 2535</em>,
+ <em class="citetitle">RFC 2931</em>,
<span class="citerefentry"><span class="refentrytitle">named</span>(8)</span>,
+ <span class="citerefentry"><span class="refentrytitle">ddns-confgen</span>(8)</span>,
<span class="citerefentry"><span class="refentrytitle">dnssec-keygen</span>(8)</span>.
</p>
</div>
<div class="refsect1" lang="en">
-<a name="id2542163"></a><h2>BUGS</h2>
+<a name="id2542154"></a><h2>BUGS</h2>
<p>
The TSIG key is redundantly stored in two separate files.
This is a consequence of nsupdate using the DST library
diff --git a/contrib/bind9/bin/rndc/Makefile.in b/contrib/bind9/bin/rndc/Makefile.in
index 27d4611..6c7c56f 100644
--- a/contrib/bind9/bin/rndc/Makefile.in
+++ b/contrib/bind9/bin/rndc/Makefile.in
@@ -1,4 +1,4 @@
-# Copyright (C) 2004, 2007 Internet Systems Consortium, Inc. ("ISC")
+# Copyright (C) 2004, 2007, 2009 Internet Systems Consortium, Inc. ("ISC")
# Copyright (C) 2000-2002 Internet Software Consortium.
#
# Permission to use, copy, modify, and/or distribute this software for any
@@ -13,7 +13,7 @@
# OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
# PERFORMANCE OF THIS SOFTWARE.
-# $Id: Makefile.in,v 1.44 2007-06-18 23:47:22 tbox Exp $
+# $Id: Makefile.in,v 1.49 2009-12-05 23:31:40 each Exp $
srcdir = @srcdir@
VPATH = @srcdir@
@@ -32,6 +32,7 @@ CWARNINGS =
ISCCFGLIBS = ../../lib/isccfg/libisccfg.@A@
ISCCCLIBS = ../../lib/isccc/libisccc.@A@
ISCLIBS = ../../lib/isc/libisc.@A@
+ISCNOSYMLIBS = ../../lib/isc/libisc-nosymtbl.@A@
DNSLIBS = ../../lib/dns/libdns.@A@ @DNS_CRYPTO_LIBS@
BIND9LIBS = ../../lib/bind9/libbind9.@A@
@@ -41,26 +42,23 @@ ISCDEPLIBS = ../../lib/isc/libisc.@A@
DNSDEPLIBS = ../../lib/dns/libdns.@A@
BIND9DEPLIBS = ../../lib/bind9/libbind9.@A@
-RNDCLIBS = ${ISCCFGLIBS} ${ISCCCLIBS} ${BIND9LIBS} ${DNSLIBS} ${ISCLIBS} @LIBS@
+LIBS = ${ISCLIBS} @LIBS@
+NOSYMLIBS = ${ISCNOSYMLIBS} @LIBS@
+
RNDCDEPLIBS = ${ISCCFGDEPLIBS} ${ISCCCDEPLIBS} ${BIND9DEPLIBS} ${DNSDEPLIBS} ${ISCDEPLIBS}
-CONFLIBS = ${DNSLIBS} ${ISCLIBS} @LIBS@
CONFDEPLIBS = ${DNSDEPLIBS} ${ISCDEPLIBS}
-SRCS= rndc.c rndc-confgen.c
-
-SUBDIRS = unix
+SRCS= rndc.c
-TARGETS = rndc@EXEEXT@ rndc-confgen@EXEEXT@
+TARGETS = rndc@EXEEXT@
-MANPAGES = rndc.8 rndc-confgen.8 rndc.conf.5
+MANPAGES = rndc.8 rndc.conf.5
-HTMLPAGES = rndc.html rndc-confgen.html rndc.conf.html
+HTMLPAGES = rndc.html rndc.conf.html
MANOBJS = ${MANPAGES} ${HTMLPAGES}
-UOBJS = unix/os.@O@
-
@BIND9_MAKE_RULES@
rndc.@O@: rndc.c
@@ -70,18 +68,10 @@ rndc.@O@: rndc.c
-DRNDC_KEYFILE=\"${sysconfdir}/rndc.key\" \
-c ${srcdir}/rndc.c
-rndc-confgen.@O@: rndc-confgen.c
- ${LIBTOOL_MODE_COMPILE} ${CC} ${ALL_CFLAGS} \
- -DRNDC_KEYFILE=\"${sysconfdir}/rndc.key\" \
- -c ${srcdir}/rndc-confgen.c
-
rndc@EXEEXT@: rndc.@O@ util.@O@ ${RNDCDEPLIBS}
- ${LIBTOOL_MODE_LINK} ${PURIFY} ${CC} ${CFLAGS} ${LDFLAGS} -o $@ rndc.@O@ util.@O@ \
- ${RNDCLIBS}
-
-rndc-confgen@EXEEXT@: rndc-confgen.@O@ util.@O@ ${UOBJS} ${CONFDEPLIBS}
- ${LIBTOOL_MODE_LINK} ${PURIFY} ${CC} ${CFLAGS} ${LDFLAGS} -o $@ rndc-confgen.@O@ util.@O@ \
- ${UOBJS} ${CONFLIBS}
+ export BASEOBJS="rndc.@O@ util.@O@"; \
+ export LIBS0="${ISCCFGLIBS} ${ISCCCLIBS} ${BIND9LIBS} ${DNSLIBS}"; \
+ ${FINALBUILDCMD}
doc man:: ${MANOBJS}
@@ -93,11 +83,9 @@ installdirs:
$(SHELL) ${top_srcdir}/mkinstalldirs ${DESTDIR}${mandir}/man8
$(SHELL) ${top_srcdir}/mkinstalldirs ${DESTDIR}${mandir}/man5
-install:: rndc@EXEEXT@ rndc-confgen@EXEEXT@ installdirs
+install:: rndc@EXEEXT@ installdirs
${LIBTOOL_MODE_INSTALL} ${INSTALL_PROGRAM} rndc@EXEEXT@ ${DESTDIR}${sbindir}
- ${LIBTOOL_MODE_INSTALL} ${INSTALL_PROGRAM} rndc-confgen@EXEEXT@ ${DESTDIR}${sbindir}
${INSTALL_DATA} ${srcdir}/rndc.8 ${DESTDIR}${mandir}/man8
- ${INSTALL_DATA} ${srcdir}/rndc-confgen.8 ${DESTDIR}${mandir}/man8
${INSTALL_DATA} ${srcdir}/rndc.conf.5 ${DESTDIR}${mandir}/man5
clean distclean maintainer-clean::
diff --git a/contrib/bind9/bin/rndc/include/rndc/os.h b/contrib/bind9/bin/rndc/include/rndc/os.h
index 9f96165..91986cb 100644
--- a/contrib/bind9/bin/rndc/include/rndc/os.h
+++ b/contrib/bind9/bin/rndc/include/rndc/os.h
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: os.h,v 1.9.332.2 2009-01-18 23:47:35 tbox Exp $ */
+/* $Id: os.h,v 1.12 2009-06-10 00:27:21 each Exp $ */
/*! \file */
@@ -27,12 +27,6 @@
ISC_LANG_BEGINDECLS
-FILE *safe_create(const char *filename);
-/*%<
- * Open 'filename' for writing, truncate if necessary. If the file was
- * created ensure that only the owner can read/write it.
- */
-
int set_user(FILE *fd, const char *user);
/*%<
* Set the owner of the file referenced by 'fd' to 'user'.
diff --git a/contrib/bind9/bin/rndc/rndc.8 b/contrib/bind9/bin/rndc/rndc.8
index 285ca9b..e4d723b 100644
--- a/contrib/bind9/bin/rndc/rndc.8
+++ b/contrib/bind9/bin/rndc/rndc.8
@@ -13,7 +13,7 @@
.\" OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
.\" PERFORMANCE OF THIS SOFTWARE.
.\"
-.\" $Id: rndc.8,v 1.42.214.1 2009-07-11 01:55:21 tbox Exp $
+.\" $Id: rndc.8,v 1.43 2009-07-11 01:12:46 tbox Exp $
.\"
.hy 0
.ad l
diff --git a/contrib/bind9/bin/rndc/rndc.c b/contrib/bind9/bin/rndc/rndc.c
index 133103e..1976d9c 100644
--- a/contrib/bind9/bin/rndc/rndc.c
+++ b/contrib/bind9/bin/rndc/rndc.c
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004-2009 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004-2011 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 2000-2003 Internet Software Consortium.
*
* Permission to use, copy, modify, and/or distribute this software for any
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: rndc.c,v 1.122.44.2 2009-01-18 23:47:35 tbox Exp $ */
+/* $Id: rndc.c,v 1.131.20.1.2.1 2011-06-02 23:47:28 tbox Exp $ */
/*! \file */
@@ -79,6 +79,7 @@ static unsigned char databuf[2048];
static isccc_ccmsg_t ccmsg;
static isccc_region_t secret;
static isc_boolean_t failed = ISC_FALSE;
+static isc_boolean_t c_flag = ISC_FALSE;
static isc_mem_t *mctx;
static int sends, recvs, connects;
static char *command;
@@ -89,10 +90,13 @@ static isc_uint32_t serial;
static void rndc_startconnect(isc_sockaddr_t *addr, isc_task_t *task);
+ISC_PLATFORM_NORETURN_PRE static void
+usage(int status) ISC_PLATFORM_NORETURN_POST;
+
static void
usage(int status) {
fprintf(stderr, "\
-Usage: %s [-c config] [-s server] [-p port]\n\
+Usage: %s [-b address] [-c config] [-s server] [-p port]\n\
[-k key-file ] [-y key] [-V] command\n\
\n\
command is one of the following:\n\
@@ -113,10 +117,16 @@ command is one of the following:\n\
notify zone [class [view]]\n\
Resend NOTIFY messages for the zone.\n\
reconfig Reload configuration file and new zones only.\n\
+ sign zone [class [view]]\n\
+ Update zone keys, and sign as needed.\n\
+ loadkeys zone [class [view]]\n\
+ Update keys without signing immediately.\n\
stats Write server statistics to the statistics file.\n\
querylog Toggle query logging.\n\
dumpdb [-all|-cache|-zones] [view ...]\n\
Dump cache(s) to the dump file (named_dump.db).\n\
+ secroots [view ...]\n\
+ Write security roots to the secroots file.\n\
stop Save pending updates to master files and stop the server.\n\
stop -p Save pending updates to master files and stop the server\n\
reporting process id.\n\
@@ -135,6 +145,10 @@ command is one of the following:\n\
validation newstate [view]\n\
Enable / disable DNSSEC validation.\n\
*restart Restart the server.\n\
+ addzone [\"file\"] zone [class [view]] { zone-options }\n\
+ Add zone to given view. Requires new-zone-file option.\n\
+ delzone [\"file\"] zone [class [view]]\n\
+ Removes zone from given view. Requires new-zone-file option.\n\
\n\
* == not yet implemented\n\
Version: %s\n",
@@ -455,6 +469,10 @@ parse_config(isc_mem_t *mctx, isc_log_t *log, const char *keyname,
fatal("neither %s nor %s was found",
admin_conffile, admin_keyfile);
key_only = ISC_TRUE;
+ } else if (! c_flag && isc_file_exists(admin_keyfile)) {
+ fprintf(stderr, "WARNING: key file (%s) exists, but using "
+ "default configuration file (%s)\n",
+ admin_keyfile, admin_conffile);
}
DO("create parser", cfg_parser_create(mctx, log, pctxp));
@@ -709,6 +727,7 @@ main(int argc, char **argv) {
case 'c':
admin_conffile = isc_commandline_argument;
+ c_flag = ISC_TRUE;
break;
case 'k':
diff --git a/contrib/bind9/bin/rndc/rndc.conf.5 b/contrib/bind9/bin/rndc/rndc.conf.5
index d7ad81e..54c4af9 100644
--- a/contrib/bind9/bin/rndc/rndc.conf.5
+++ b/contrib/bind9/bin/rndc/rndc.conf.5
@@ -13,7 +13,7 @@
.\" OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
.\" PERFORMANCE OF THIS SOFTWARE.
.\"
-.\" $Id: rndc.conf.5,v 1.38.366.1 2009-07-11 01:55:21 tbox Exp $
+.\" $Id: rndc.conf.5,v 1.41 2009-07-11 01:12:46 tbox Exp $
.\"
.hy 0
.ad l
diff --git a/contrib/bind9/bin/rndc/rndc.conf.html b/contrib/bind9/bin/rndc/rndc.conf.html
index 114cc15..463b99f 100644
--- a/contrib/bind9/bin/rndc/rndc.conf.html
+++ b/contrib/bind9/bin/rndc/rndc.conf.html
@@ -14,7 +14,7 @@
- OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
- PERFORMANCE OF THIS SOFTWARE.
-->
-<!-- $Id: rndc.conf.html,v 1.29.366.1 2009-07-11 01:55:21 tbox Exp $ -->
+<!-- $Id: rndc.conf.html,v 1.32 2009-07-11 01:12:46 tbox Exp $ -->
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
diff --git a/contrib/bind9/bin/rndc/rndc.html b/contrib/bind9/bin/rndc/rndc.html
index 0d91784..ecc0f31 100644
--- a/contrib/bind9/bin/rndc/rndc.html
+++ b/contrib/bind9/bin/rndc/rndc.html
@@ -14,7 +14,7 @@
- OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
- PERFORMANCE OF THIS SOFTWARE.
-->
-<!-- $Id: rndc.html,v 1.31.214.1 2009-07-11 01:55:21 tbox Exp $ -->
+<!-- $Id: rndc.html,v 1.32 2009-07-11 01:12:46 tbox Exp $ -->
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
diff --git a/contrib/bind9/bin/rndc/util.h b/contrib/bind9/bin/rndc/util.h
index c5da488..8eba61a 100644
--- a/contrib/bind9/bin/rndc/util.h
+++ b/contrib/bind9/bin/rndc/util.h
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004, 2005, 2007 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004, 2005, 2007, 2009 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 2000, 2001 Internet Software Consortium.
*
* Permission to use, copy, modify, and/or distribute this software for any
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: util.h,v 1.10 2007-06-19 23:46:59 tbox Exp $ */
+/* $Id: util.h,v 1.12 2009-09-29 23:48:03 tbox Exp $ */
#ifndef RNDC_UTIL_H
#define RNDC_UTIL_H 1
@@ -23,6 +23,7 @@
/*! \file */
#include <isc/lang.h>
+#include <isc/platform.h>
#include <isc/formatcheck.h>
@@ -43,8 +44,9 @@ ISC_LANG_BEGINDECLS
void
notify(const char *fmt, ...) ISC_FORMAT_PRINTF(1, 2);
-void
-fatal(const char *format, ...) ISC_FORMAT_PRINTF(1, 2);
+ISC_PLATFORM_NORETURN_PRE void
+fatal(const char *format, ...)
+ISC_FORMAT_PRINTF(1, 2) ISC_PLATFORM_NORETURN_POST;
ISC_LANG_ENDDECLS
diff --git a/contrib/bind9/bin/tools/Makefile.in b/contrib/bind9/bin/tools/Makefile.in
new file mode 100644
index 0000000..35b8285
--- /dev/null
+++ b/contrib/bind9/bin/tools/Makefile.in
@@ -0,0 +1,103 @@
+# Copyright (C) 2009, 2010 Internet Systems Consortium, Inc. ("ISC")
+#
+# Permission to use, copy, modify, and/or 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 ISC DISCLAIMS ALL WARRANTIES WITH
+# REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+# AND FITNESS. IN NO EVENT SHALL ISC 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.
+
+# $Id: Makefile.in,v 1.13 2010-01-07 23:48:53 tbox Exp $
+
+srcdir = @srcdir@
+VPATH = @srcdir@
+top_srcdir = @top_srcdir@
+
+@BIND9_MAKE_INCLUDES@
+
+CINCLUDES = ${DNS_INCLUDES} ${ISC_INCLUDES} ${ISCCFG_INCLUDES} \
+ ${LWRES_INCLUDES} ${OMAPI_INCLUDES}
+
+CDEFINES =
+CWARNINGS =
+
+DNSLIBS = ../../lib/dns/libdns.@A@ @DNS_CRYPTO_LIBS@
+ISCLIBS = ../../lib/isc/libisc.@A@ @DNS_CRYPTO_LIBS@
+ISCNOSYMLIBS = ../../lib/isc/libisc-nosymtbl.@A@
+ISCCFGLIBS = ../../lib/isccfg/libisccfg.@A@
+LWRESLIBS = ../../lib/lwres/liblwres.@A@
+
+DNSDEPLIBS = ../../lib/dns/libdns.@A@
+ISCDEPLIBS = ../../lib/isc/libisc.@A@
+ISCCFGDEPLIBS = ../../lib/isccfg/libisccfg.@A@
+LWRESDEPLIBS = ../../lib/lwres/liblwres.@A@
+
+LIBS = ${ISCLIBS} @LIBS@
+NOSYMLIBS = ${ISCNOSYMLIBS} @LIBS@
+
+SUBDIRS =
+
+TARGETS = arpaname@EXEEXT@ named-journalprint@EXEEXT@ nsec3hash@EXEEXT@ \
+ genrandom@EXEEXT@ isc-hmac-fixup@EXEEXT@
+SRCS = arpaname.c named-journalprint.c nsec3hash.c genrandom.c \
+ isc-hmac-fixup.c
+
+MANPAGES = arpaname.1 named-journalprint.8 nsec3hash.8 genrandom.8 \
+ isc-hmac-fixup.8
+HTMLPAGES = arpaname.html named-journalprint.html nsec3hash.html \
+ genrandom.html isc-hmac-fixup.html
+MANOBJS = ${MANPAGES} ${HTMLPAGES}
+
+@BIND9_MAKE_RULES@
+
+arpaname@EXEEXT@: arpaname.@O@ ${ISCDEPLIBS} ${DNSDEPLIBS}
+ ${LIBTOOL_MODE_LINK} ${PURIFY} ${CC} ${CFLAGS} ${LDFLAGS} -o $@ arpaname.@O@ \
+ ${ISCLIBS} ${LIBS}
+
+named-journalprint@EXEEXT@: named-journalprint.@O@ ${ISCDEPLIBS} ${DNSDEPLIBS}
+ export BASEOBJS="named-journalprint.@O@"; \
+ export LIBS0="${DNSLIBS}"; \
+ ${FINALBUILDCMD}
+
+nsec3hash@EXEEXT@: nsec3hash.@O@ ${ISCDEPLIBS} ${DNSDEPLIBS}
+ export BASEOBJS="nsec3hash.@O@"; \
+ export LIBS0="${DNSLIBS}"; \
+ ${FINALBUILDCMD}
+
+isc-hmac-fixup@EXEEXT@: isc-hmac-fixup.@O@ ${ISCDEPLIBS}
+ export BASEOBJS="isc-hmac-fixup.@O@"; \
+ export LIBS0="${ISCLIBS}"; \
+ ${FINALBUILDCMD}
+
+genrandom@EXEEXT@: genrandom.@O@
+ ${LIBTOOL_MODE_LINK} ${PURIFY} ${CC} ${CFLAGS} ${LDFLAGS} -o $@ genrandom.@O@ @GENRANDOMLIB@ ${LIBS}
+
+doc man:: ${MANOBJS}
+
+docclean manclean maintainer-clean::
+ rm -f ${MANOBJS}
+
+installdirs:
+ $(SHELL) ${top_srcdir}/mkinstalldirs ${DESTDIR}${sbindir}
+ $(SHELL) ${top_srcdir}/mkinstalldirs ${DESTDIR}${mandir}/man1
+ $(SHELL) ${top_srcdir}/mkinstalldirs ${DESTDIR}${mandir}/man8
+
+install:: ${TARGETS} installdirs
+ ${LIBTOOL_MODE_INSTALL} ${INSTALL_PROGRAM} arpaname@EXEEXT@ ${DESTDIR}${sbindir}
+ ${LIBTOOL_MODE_INSTALL} ${INSTALL_PROGRAM} named-journalprint@EXEEXT@ ${DESTDIR}${sbindir}
+ ${LIBTOOL_MODE_INSTALL} ${INSTALL_PROGRAM} nsec3hash@EXEEXT@ ${DESTDIR}${sbindir}
+ ${LIBTOOL_MODE_INSTALL} ${INSTALL_PROGRAM} genrandom@EXEEXT@ ${DESTDIR}${sbindir}
+ ${LIBTOOL_MODE_INSTALL} ${INSTALL_PROGRAM} isc-hmac-fixup@EXEEXT@ ${DESTDIR}${sbindir}
+ ${INSTALL_DATA} ${srcdir}/arpaname.1 ${DESTDIR}${mandir}/man1
+ ${INSTALL_DATA} ${srcdir}/isc-hmac-fixup.8 ${DESTDIR}${mandir}/man8
+ ${INSTALL_DATA} ${srcdir}/named-journalprint.8 ${DESTDIR}${mandir}/man8
+ ${INSTALL_DATA} ${srcdir}/nsec3hash.8 ${DESTDIR}${mandir}/man8
+ ${INSTALL_DATA} ${srcdir}/genrandom.8 ${DESTDIR}${mandir}/man8
+
+clean distclean::
+ rm -f ${TARGETS}
diff --git a/contrib/bind9/bin/tools/arpaname.1 b/contrib/bind9/bin/tools/arpaname.1
new file mode 100644
index 0000000..6662380
--- /dev/null
+++ b/contrib/bind9/bin/tools/arpaname.1
@@ -0,0 +1,48 @@
+.\" Copyright (C) 2009 Internet Systems Consortium, Inc. ("ISC")
+.\"
+.\" Permission to use, copy, modify, and/or 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 ISC DISCLAIMS ALL WARRANTIES WITH
+.\" REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+.\" AND FITNESS. IN NO EVENT SHALL ISC 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.
+.\"
+.\" $Id: arpaname.1,v 1.4 2010-05-19 01:14:14 tbox Exp $
+.\"
+.hy 0
+.ad l
+.\" Title: arpaname
+.\" Author:
+.\" Generator: DocBook XSL Stylesheets v1.71.1 <http://docbook.sf.net/>
+.\" Date: March 4, 2009
+.\" Manual: BIND9
+.\" Source: BIND9
+.\"
+.TH "ARPANAME" "1" "March 4, 2009" "BIND9" "BIND9"
+.\" disable hyphenation
+.nh
+.\" disable justification (adjust text to left margin only)
+.ad l
+.SH "NAME"
+arpaname \- translate IP addresses to the corresponding ARPA names
+.SH "SYNOPSIS"
+.HP 9
+\fBarpaname\fR {\fIipaddress\ \fR...}
+.SH "DESCRIPTION"
+.PP
+\fBarpaname\fR
+translates IP addresses (IPv4 and IPv6) to the corresponding IN\-ADDR.ARPA or IP6.ARPA names.
+.SH "SEE ALSO"
+.PP
+BIND 9 Administrator Reference Manual.
+.SH "AUTHOR"
+.PP
+Internet Systems Consortium
+.SH "COPYRIGHT"
+Copyright \(co 2009 Internet Systems Consortium, Inc. ("ISC")
+.br
diff --git a/contrib/bind9/bin/tools/arpaname.c b/contrib/bind9/bin/tools/arpaname.c
new file mode 100644
index 0000000..e7f1434
--- /dev/null
+++ b/contrib/bind9/bin/tools/arpaname.c
@@ -0,0 +1,53 @@
+/*
+ * Copyright (C) 2009 Internet Systems Consortium, Inc. ("ISC")
+ *
+ * Permission to use, copy, modify, and/or 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 ISC DISCLAIMS ALL WARRANTIES WITH
+ * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+ * AND FITNESS. IN NO EVENT SHALL ISC 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.
+ */
+
+/* $Id: arpaname.c,v 1.4 2009-10-27 03:05:33 marka Exp $ */
+
+#include "config.h"
+
+#include <isc/net.h>
+
+#include <stdio.h>
+
+#define UNUSED(x) (void)(x)
+
+int
+main(int argc, char *argv[]) {
+ unsigned char buf[16];
+ int i;
+
+ UNUSED(argc);
+
+ while (argv[1]) {
+ if (inet_pton(AF_INET6, argv[1], buf) == 1) {
+ for (i = 15; i >= 0; i--)
+ fprintf(stdout, "%X.%X.", buf[i] & 0xf,
+ (buf[i] >> 4) & 0xf);
+ fprintf(stdout, "IP6.ARPA\n");
+ argv++;
+ continue;
+ }
+ if (inet_pton(AF_INET, argv[1], buf) == 1) {
+ fprintf(stdout, "%u.%u.%u.%u.IN-ADDR.ARPA\n",
+ buf[3], buf[2], buf[1], buf[0]);
+ argv++;
+ continue;
+ }
+ return (1);
+ }
+ fflush(stdout);
+ return(ferror(stdout));
+}
diff --git a/contrib/bind9/bin/tools/arpaname.docbook b/contrib/bind9/bin/tools/arpaname.docbook
new file mode 100644
index 0000000..a7eb79e
--- /dev/null
+++ b/contrib/bind9/bin/tools/arpaname.docbook
@@ -0,0 +1,76 @@
+<!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN"
+ "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd"
+ [<!ENTITY mdash "&#8212;">]>
+<!--
+ - Copyright (C) 2009 Internet Systems Consortium, Inc. ("ISC")
+ -
+ - Permission to use, copy, modify, and/or 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 ISC DISCLAIMS ALL WARRANTIES WITH
+ - REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+ - AND FITNESS. IN NO EVENT SHALL ISC 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.
+-->
+
+<!-- $Id: arpaname.docbook,v 1.1 2009-03-04 01:30:27 marka Exp $ -->
+<refentry id="man.arpaname">
+ <refentryinfo>
+ <date>March 4, 2009</date>
+ </refentryinfo>
+
+ <refmeta>
+ <refentrytitle><application>arpaname</application></refentrytitle>
+ <manvolnum>1</manvolnum>
+ <refmiscinfo>BIND9</refmiscinfo>
+ </refmeta>
+
+ <refnamediv>
+ <refname><application>arpaname</application></refname>
+ <refpurpose>translate IP addresses to the corresponding ARPA names</refpurpose>
+ </refnamediv>
+
+ <docinfo>
+ <copyright>
+ <year>2009</year>
+ <holder>Internet Systems Consortium, Inc. ("ISC")</holder>
+ </copyright>
+ </docinfo>
+
+ <refsynopsisdiv>
+ <cmdsynopsis>
+ <command>arpaname</command>
+ <arg choice="req" rep="repeat"><replaceable class="parameter">ipaddress </replaceable></arg>
+ </cmdsynopsis>
+ </refsynopsisdiv>
+
+ <refsect1>
+ <title>DESCRIPTION</title>
+ <para>
+ <command>arpaname</command> translates IP addresses (IPv4 and
+ IPv6) to the corresponding IN-ADDR.ARPA or IP6.ARPA names.
+ </para>
+ </refsect1>
+
+ <refsect1>
+ <title>SEE ALSO</title>
+ <para>
+ <citetitle>BIND 9 Administrator Reference Manual</citetitle>.
+ </para>
+ </refsect1>
+
+ <refsect1>
+ <title>AUTHOR</title>
+ <para><corpauthor>Internet Systems Consortium</corpauthor>
+ </para>
+ </refsect1>
+
+</refentry><!--
+ - Local variables:
+ - mode: sgml
+ - End:
+-->
diff --git a/contrib/bind9/bin/tools/arpaname.html b/contrib/bind9/bin/tools/arpaname.html
new file mode 100644
index 0000000..e44cfbd
--- /dev/null
+++ b/contrib/bind9/bin/tools/arpaname.html
@@ -0,0 +1,52 @@
+<!--
+ - Copyright (C) 2009 Internet Systems Consortium, Inc. ("ISC")
+ -
+ - Permission to use, copy, modify, and/or 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 ISC DISCLAIMS ALL WARRANTIES WITH
+ - REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+ - AND FITNESS. IN NO EVENT SHALL ISC 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.
+-->
+<!-- $Id: arpaname.html,v 1.4 2010-05-19 01:14:14 tbox Exp $ -->
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
+<title>arpaname</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.71.1">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"><div class="refentry" lang="en">
+<a name="man.arpaname"></a><div class="titlepage"></div>
+<div class="refnamediv">
+<h2>Name</h2>
+<p><span class="application">arpaname</span> &#8212; translate IP addresses to the corresponding ARPA names</p>
+</div>
+<div class="refsynopsisdiv">
+<h2>Synopsis</h2>
+<div class="cmdsynopsis"><p><code class="command">arpaname</code> {<em class="replaceable"><code>ipaddress </code></em>...}</p></div>
+</div>
+<div class="refsect1" lang="en">
+<a name="id2543345"></a><h2>DESCRIPTION</h2>
+<p>
+ <span><strong class="command">arpaname</strong></span> translates IP addresses (IPv4 and
+ IPv6) to the corresponding IN-ADDR.ARPA or IP6.ARPA names.
+ </p>
+</div>
+<div class="refsect1" lang="en">
+<a name="id2543357"></a><h2>SEE ALSO</h2>
+<p>
+ <em class="citetitle">BIND 9 Administrator Reference Manual</em>.
+ </p>
+</div>
+<div class="refsect1" lang="en">
+<a name="id2543371"></a><h2>AUTHOR</h2>
+<p><span class="corpauthor">Internet Systems Consortium</span>
+ </p>
+</div>
+</div></body>
+</html>
diff --git a/contrib/bind9/bin/tools/genrandom.8 b/contrib/bind9/bin/tools/genrandom.8
new file mode 100644
index 0000000..32a4ff0
--- /dev/null
+++ b/contrib/bind9/bin/tools/genrandom.8
@@ -0,0 +1,69 @@
+.\" Copyright (C) 2009, 2010 Internet Systems Consortium, Inc. ("ISC")
+.\"
+.\" Permission to use, copy, modify, and/or 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 ISC DISCLAIMS ALL WARRANTIES WITH
+.\" REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+.\" AND FITNESS. IN NO EVENT SHALL ISC 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.
+.\"
+.\" $Id: genrandom.8,v 1.8 2010-05-19 01:14:14 tbox Exp $
+.\"
+.hy 0
+.ad l
+.\" Title: genrandom
+.\" Author:
+.\" Generator: DocBook XSL Stylesheets v1.71.1 <http://docbook.sf.net/>
+.\" Date: Feb 19, 2009
+.\" Manual: BIND9
+.\" Source: BIND9
+.\"
+.TH "GENRANDOM" "8" "Feb 19, 2009" "BIND9" "BIND9"
+.\" disable hyphenation
+.nh
+.\" disable justification (adjust text to left margin only)
+.ad l
+.SH "NAME"
+genrandom \- generate a file containing random data
+.SH "SYNOPSIS"
+.HP 10
+\fBgenrandom\fR [\fB\-n\ \fR\fB\fInumber\fR\fR] {\fIsize\fR} {\fIfilename\fR}
+.SH "DESCRIPTION"
+.PP
+\fBgenrandom\fR
+generates a file or a set of files containing a specified quantity of pseudo\-random data, which can be used as a source of entropy for other commands on systems with no random device.
+.SH "ARGUMENTS"
+.PP
+\-n \fInumber\fR
+.RS 4
+In place of generating one file, generates
+\fBnumber\fR
+(from 2 to 9) files, appending
+\fBnumber\fR
+to the name.
+.RE
+.PP
+size
+.RS 4
+The size of the file, in kilobytes, to generate.
+.RE
+.PP
+domain
+.RS 4
+The file name into which random data should be written.
+.RE
+.SH "SEE ALSO"
+.PP
+\fBrand\fR(3),
+\fBarc4random\fR(3)
+.SH "AUTHOR"
+.PP
+Internet Systems Consortium
+.SH "COPYRIGHT"
+Copyright \(co 2009, 2010 Internet Systems Consortium, Inc. ("ISC")
+.br
diff --git a/contrib/bind9/bin/tools/genrandom.c b/contrib/bind9/bin/tools/genrandom.c
new file mode 100644
index 0000000..8473be2
--- /dev/null
+++ b/contrib/bind9/bin/tools/genrandom.c
@@ -0,0 +1,136 @@
+/*
+ * Copyright (C) 2004, 2005, 2007, 2009, 2010 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2000-2003 Internet Software Consortium.
+ *
+ * Permission to use, copy, modify, and/or 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 ISC DISCLAIMS ALL WARRANTIES WITH
+ * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+ * AND FITNESS. IN NO EVENT SHALL ISC 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.
+ */
+
+/* $Id: genrandom.c,v 1.7 2010-05-17 23:51:04 tbox Exp $ */
+
+/*! \file */
+#include <config.h>
+
+#include <isc/commandline.h>
+#include <isc/print.h>
+#include <isc/stdlib.h>
+#include <isc/util.h>
+
+#include <stdio.h>
+#include <string.h>
+
+const char *program = "genrandom";
+
+ISC_PLATFORM_NORETURN_PRE static void
+usage(void) ISC_PLATFORM_NORETURN_POST;
+
+static void
+usage(void) {
+ fprintf(stderr, "usage: %s [-n 2..9] k file\n", program);
+ exit(1);
+}
+
+static void
+generate(char *filename, unsigned int bytes) {
+ FILE *fp;
+
+ fp = fopen(filename, "w");
+ if (fp == NULL) {
+ printf("failed to open %s\n", filename);
+ exit(1);
+ }
+
+ while (bytes > 0) {
+#ifndef HAVE_ARC4RANDOM
+ unsigned short int x = (rand() & 0xFFFF);
+#else
+ unsigned short int x = (arc4random() & 0xFFFF);
+#endif
+ unsigned char c = x & 0xFF;
+ if (putc(c, fp) == EOF) {
+ printf("error writing to %s\n", filename);
+ exit(1);
+ }
+ c = x >> 8;
+ if (putc(c, fp) == EOF) {
+ printf("error writing to %s\n", filename);
+ exit(1);
+ }
+ bytes -= 2;
+ }
+ fclose(fp);
+}
+
+int
+main(int argc, char **argv) {
+ unsigned int bytes;
+ unsigned int k;
+ char *endp;
+ int c, i, n = 1;
+ size_t len;
+ char *name;
+
+ isc_commandline_errprint = ISC_FALSE;
+
+ while ((c = isc_commandline_parse(argc, argv, "hn:")) != EOF) {
+ switch (c) {
+ case 'n':
+ n = strtol(isc_commandline_argument, &endp, 10);
+ if ((*endp != 0) || (n <= 1) || (n > 9))
+ usage();
+ break;
+
+ case '?':
+ if (isc_commandline_option != '?')
+ fprintf(stderr, "%s: invalid argument -%c\n",
+ program, isc_commandline_option);
+ case 'h':
+ usage();
+
+ default:
+ fprintf(stderr, "%s: unhandled option -%c\n",
+ program, isc_commandline_option);
+ exit(1);
+ }
+ }
+
+ if (isc_commandline_index + 2 != argc)
+ usage();
+
+ k = strtoul(argv[isc_commandline_index++], &endp, 10);
+ if (*endp != 0)
+ usage();
+ bytes = k << 10;
+
+#ifndef HAVE_ARC4RANDOM
+ srand(0x12345678);
+#endif
+ if (n == 1) {
+ generate(argv[isc_commandline_index], bytes);
+ return (0);
+ }
+
+ len = strlen(argv[isc_commandline_index]) + 2;
+ name = (char *) malloc(len);
+ if (name == NULL) {
+ perror("malloc");
+ exit(1);
+ }
+
+ for (i = 1; i <= n; i++) {
+ snprintf(name, len, "%s%d", argv[isc_commandline_index], i);
+ generate(name, bytes);
+ }
+ free(name);
+
+ return (0);
+}
diff --git a/contrib/bind9/bin/tools/genrandom.docbook b/contrib/bind9/bin/tools/genrandom.docbook
new file mode 100644
index 0000000..84e4553
--- /dev/null
+++ b/contrib/bind9/bin/tools/genrandom.docbook
@@ -0,0 +1,119 @@
+<!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN"
+ "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd"
+ [<!ENTITY mdash "&#8212;">]>
+<!--
+ - Copyright (C) 2009, 2010 Internet Systems Consortium, Inc. ("ISC")
+ -
+ - Permission to use, copy, modify, and/or 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 ISC DISCLAIMS ALL WARRANTIES WITH
+ - REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+ - AND FITNESS. IN NO EVENT SHALL ISC 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.
+-->
+
+<!-- $Id: genrandom.docbook,v 1.6 2010-05-17 23:51:05 tbox Exp $ -->
+<refentry id="man.genrandom">
+ <refentryinfo>
+ <date>Feb 19, 2009</date>
+ </refentryinfo>
+
+ <refmeta>
+ <refentrytitle><application>genrandom</application></refentrytitle>
+ <manvolnum>8</manvolnum>
+ <refmiscinfo>BIND9</refmiscinfo>
+ </refmeta>
+
+ <refnamediv>
+ <refname><application>genrandom</application></refname>
+ <refpurpose>generate a file containing random data</refpurpose>
+ </refnamediv>
+
+ <docinfo>
+ <copyright>
+ <year>2009</year>
+ <year>2010</year>
+ <holder>Internet Systems Consortium, Inc. ("ISC")</holder>
+ </copyright>
+ </docinfo>
+
+ <refsynopsisdiv>
+ <cmdsynopsis>
+ <command>genrandom</command>
+ <arg><option>-n <replaceable class="parameter">number</replaceable></option></arg>
+ <arg choice="req"><replaceable class="parameter">size</replaceable></arg>
+ <arg choice="req"><replaceable class="parameter">filename</replaceable></arg>
+ </cmdsynopsis>
+ </refsynopsisdiv>
+
+ <refsect1>
+ <title>DESCRIPTION</title>
+ <para>
+ <command>genrandom</command>
+ generates a file or a set of files containing a specified quantity
+ of pseudo-random data, which can be used as a source of entropy for
+ other commands on systems with no random device.
+ </para>
+ </refsect1>
+
+ <refsect1>
+ <title>ARGUMENTS</title>
+ <variablelist>
+ <varlistentry>
+ <term>-n <replaceable class="parameter">number</replaceable></term>
+ <listitem>
+ <para>
+ In place of generating one file, generates <option>number</option>
+ (from 2 to 9) files, appending <option>number</option> to the name.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>size</term>
+ <listitem>
+ <para>
+ The size of the file, in kilobytes, to generate.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>domain</term>
+ <listitem>
+ <para>
+ The file name into which random data should be written.
+ </para>
+ </listitem>
+ </varlistentry>
+ </variablelist>
+ </refsect1>
+
+ <refsect1>
+ <title>SEE ALSO</title>
+ <para>
+ <citerefentry>
+ <refentrytitle>rand</refentrytitle><manvolnum>3</manvolnum>
+ </citerefentry>,
+ <citerefentry>
+ <refentrytitle>arc4random</refentrytitle><manvolnum>3</manvolnum>
+ </citerefentry>
+ </para>
+ </refsect1>
+
+ <refsect1>
+ <title>AUTHOR</title>
+ <para><corpauthor>Internet Systems Consortium</corpauthor>
+ </para>
+ </refsect1>
+
+</refentry><!--
+ - Local variables:
+ - mode: sgml
+ - End:
+-->
diff --git a/contrib/bind9/bin/tools/genrandom.html b/contrib/bind9/bin/tools/genrandom.html
new file mode 100644
index 0000000..c14af9b
--- /dev/null
+++ b/contrib/bind9/bin/tools/genrandom.html
@@ -0,0 +1,73 @@
+<!--
+ - Copyright (C) 2009, 2010 Internet Systems Consortium, Inc. ("ISC")
+ -
+ - Permission to use, copy, modify, and/or 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 ISC DISCLAIMS ALL WARRANTIES WITH
+ - REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+ - AND FITNESS. IN NO EVENT SHALL ISC 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.
+-->
+<!-- $Id: genrandom.html,v 1.8 2010-05-19 01:14:14 tbox Exp $ -->
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
+<title>genrandom</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.71.1">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"><div class="refentry" lang="en">
+<a name="man.genrandom"></a><div class="titlepage"></div>
+<div class="refnamediv">
+<h2>Name</h2>
+<p><span class="application">genrandom</span> &#8212; generate a file containing random data</p>
+</div>
+<div class="refsynopsisdiv">
+<h2>Synopsis</h2>
+<div class="cmdsynopsis"><p><code class="command">genrandom</code> [<code class="option">-n <em class="replaceable"><code>number</code></em></code>] {<em class="replaceable"><code>size</code></em>} {<em class="replaceable"><code>filename</code></em>}</p></div>
+</div>
+<div class="refsect1" lang="en">
+<a name="id2543363"></a><h2>DESCRIPTION</h2>
+<p>
+ <span><strong class="command">genrandom</strong></span>
+ generates a file or a set of files containing a specified quantity
+ of pseudo-random data, which can be used as a source of entropy for
+ other commands on systems with no random device.
+ </p>
+</div>
+<div class="refsect1" lang="en">
+<a name="id2543376"></a><h2>ARGUMENTS</h2>
+<div class="variablelist"><dl>
+<dt><span class="term">-n <em class="replaceable"><code>number</code></em></span></dt>
+<dd><p>
+ In place of generating one file, generates <code class="option">number</code>
+ (from 2 to 9) files, appending <code class="option">number</code> to the name.
+ </p></dd>
+<dt><span class="term">size</span></dt>
+<dd><p>
+ The size of the file, in kilobytes, to generate.
+ </p></dd>
+<dt><span class="term">domain</span></dt>
+<dd><p>
+ The file name into which random data should be written.
+ </p></dd>
+</dl></div>
+</div>
+<div class="refsect1" lang="en">
+<a name="id2543436"></a><h2>SEE ALSO</h2>
+<p>
+ <span class="citerefentry"><span class="refentrytitle">rand</span>(3)</span>,
+ <span class="citerefentry"><span class="refentrytitle">arc4random</span>(3)</span>
+ </p>
+</div>
+<div class="refsect1" lang="en">
+<a name="id2543463"></a><h2>AUTHOR</h2>
+<p><span class="corpauthor">Internet Systems Consortium</span>
+ </p>
+</div>
+</div></body>
+</html>
diff --git a/contrib/bind9/bin/tools/isc-hmac-fixup.8 b/contrib/bind9/bin/tools/isc-hmac-fixup.8
new file mode 100644
index 0000000..99c58c8
--- /dev/null
+++ b/contrib/bind9/bin/tools/isc-hmac-fixup.8
@@ -0,0 +1,61 @@
+.\" Copyright (C) 2010 Internet Systems Consortium, Inc. ("ISC")
+.\"
+.\" Permission to use, copy, modify, and/or 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 ISC DISCLAIMS ALL WARRANTIES WITH
+.\" REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+.\" AND FITNESS. IN NO EVENT SHALL ISC 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.
+.\"
+.\" $Id: isc-hmac-fixup.8,v 1.4 2010-05-19 01:14:14 tbox Exp $
+.\"
+.hy 0
+.ad l
+.\" Title: isc\-hmac\-fixup
+.\" Author:
+.\" Generator: DocBook XSL Stylesheets v1.71.1 <http://docbook.sf.net/>
+.\" Date: January 5, 2010
+.\" Manual: BIND9
+.\" Source: BIND9
+.\"
+.TH "ISC\-HMAC\-FIXUP" "1" "January 5, 2010" "BIND9" "BIND9"
+.\" disable hyphenation
+.nh
+.\" disable justification (adjust text to left margin only)
+.ad l
+.SH "NAME"
+isc\-hmac\-fixup \- fixes HMAC keys generated by older versions of BIND
+.SH "SYNOPSIS"
+.HP 15
+\fBisc\-hmac\-fixup\fR {\fIalgorithm\fR} {\fIsecret\fR}
+.SH "DESCRIPTION"
+.PP
+Versions of BIND 9 up to and including BIND 9.6 had a bug causing HMAC\-SHA* TSIG keys which were longer than the digest length of the hash algorithm (i.e., SHA1 keys longer than 160 bits, SHA256 keys longer than 256 bits, etc) to be used incorrectly, generating a message authentication code that was incompatible with other DNS implementations.
+.PP
+This bug has been fixed in BIND 9.7. However, the fix may cause incompatibility between older and newer versions of BIND, when using long keys.
+\fBisc\-hmac\-fixup\fR
+modifies those keys to restore compatibility.
+.PP
+To modify a key, run
+\fBisc\-hmac\-fixup\fR
+and specify the key's algorithm and secret on the command line. If the secret is longer than the digest length of the algorithm (64 bytes for SHA1 through SHA256, or 128 bytes for SHA384 and SHA512), then a new secret will be generated consisting of a hash digest of the old secret. (If the secret did not require conversion, then it will be printed without modification.)
+.SH "SECURITY CONSIDERATIONS"
+.PP
+Secrets that have been converted by
+\fBisc\-hmac\-fixup\fR
+are shortened, but as this is how the HMAC protocol works in operation anyway, it does not affect security. RFC 2104 notes, "Keys longer than [the digest length] are acceptable but the extra length would not significantly increase the function strength."
+.SH "SEE ALSO"
+.PP
+BIND 9 Administrator Reference Manual,
+RFC 2104.
+.SH "AUTHOR"
+.PP
+Internet Systems Consortium
+.SH "COPYRIGHT"
+Copyright \(co 2010 Internet Systems Consortium, Inc. ("ISC")
+.br
diff --git a/contrib/bind9/bin/tools/isc-hmac-fixup.c b/contrib/bind9/bin/tools/isc-hmac-fixup.c
new file mode 100644
index 0000000..09cb85d
--- /dev/null
+++ b/contrib/bind9/bin/tools/isc-hmac-fixup.c
@@ -0,0 +1,136 @@
+/*
+ * Copyright (C) 2010 Internet Systems Consortium, Inc. ("ISC")
+ *
+ * Permission to use, copy, modify, and/or 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 ISC DISCLAIMS ALL WARRANTIES WITH
+ * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+ * AND FITNESS. IN NO EVENT SHALL ISC 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.
+ */
+
+/* $Id: isc-hmac-fixup.c,v 1.4 2010-03-10 02:17:52 marka Exp $ */
+
+#include <config.h>
+
+#include <isc/base64.h>
+#include <isc/buffer.h>
+#include <isc/md5.h>
+#include <isc/region.h>
+#include <isc/result.h>
+#include <isc/sha1.h>
+#include <isc/sha2.h>
+#include <isc/stdio.h>
+#include <isc/string.h>
+
+#define HMAC_LEN 64
+
+int
+main(int argc, char **argv) {
+ isc_buffer_t buf;
+ unsigned char key[1024];
+ char secret[1024];
+ char base64[(1024*4)/3];
+ isc_region_t r;
+ isc_result_t result;
+
+ if (argc != 3) {
+ fprintf(stderr, "Usage:\t%s algorithm secret\n", argv[0]);
+ fprintf(stderr, "\talgorithm: (MD5 | SHA1 | SHA224 | "
+ "SHA256 | SHA384 | SHA512)\n");
+ return (1);
+ }
+
+ isc_buffer_init(&buf, secret, sizeof(secret));
+ result = isc_base64_decodestring(argv[2], &buf);
+ if (result != ISC_R_SUCCESS) {
+ fprintf(stderr, "error: %s\n", isc_result_totext(result));
+ return (1);
+ }
+ isc__buffer_usedregion(&buf, &r);
+
+ if (!strcasecmp(argv[1], "md5") ||
+ !strcasecmp(argv[1], "hmac-md5")) {
+ if (r.length > HMAC_LEN) {
+ isc_md5_t md5ctx;
+ isc_md5_init(&md5ctx);
+ isc_md5_update(&md5ctx, r.base, r.length);
+ isc_md5_final(&md5ctx, key);
+
+ r.base = key;
+ r.length = ISC_MD5_DIGESTLENGTH;
+ }
+ } else if (!strcasecmp(argv[1], "sha1") ||
+ !strcasecmp(argv[1], "hmac-sha1")) {
+ if (r.length > ISC_SHA1_DIGESTLENGTH) {
+ isc_sha1_t sha1ctx;
+ isc_sha1_init(&sha1ctx);
+ isc_sha1_update(&sha1ctx, r.base, r.length);
+ isc_sha1_final(&sha1ctx, key);
+
+ r.base = key;
+ r.length = ISC_SHA1_DIGESTLENGTH;
+ }
+ } else if (!strcasecmp(argv[1], "sha224") ||
+ !strcasecmp(argv[1], "hmac-sha224")) {
+ if (r.length > ISC_SHA224_DIGESTLENGTH) {
+ isc_sha224_t sha224ctx;
+ isc_sha224_init(&sha224ctx);
+ isc_sha224_update(&sha224ctx, r.base, r.length);
+ isc_sha224_final(key, &sha224ctx);
+
+ r.base = key;
+ r.length = ISC_SHA224_DIGESTLENGTH;
+ }
+ } else if (!strcasecmp(argv[1], "sha256") ||
+ !strcasecmp(argv[1], "hmac-sha256")) {
+ if (r.length > ISC_SHA256_DIGESTLENGTH) {
+ isc_sha256_t sha256ctx;
+ isc_sha256_init(&sha256ctx);
+ isc_sha256_update(&sha256ctx, r.base, r.length);
+ isc_sha256_final(key, &sha256ctx);
+
+ r.base = key;
+ r.length = ISC_SHA256_DIGESTLENGTH;
+ }
+ } else if (!strcasecmp(argv[1], "sha384") ||
+ !strcasecmp(argv[1], "hmac-sha384")) {
+ if (r.length > ISC_SHA384_DIGESTLENGTH) {
+ isc_sha384_t sha384ctx;
+ isc_sha384_init(&sha384ctx);
+ isc_sha384_update(&sha384ctx, r.base, r.length);
+ isc_sha384_final(key, &sha384ctx);
+
+ r.base = key;
+ r.length = ISC_SHA384_DIGESTLENGTH;
+ }
+ } else if (!strcasecmp(argv[1], "sha512") ||
+ !strcasecmp(argv[1], "hmac-sha512")) {
+ if (r.length > ISC_SHA512_DIGESTLENGTH) {
+ isc_sha512_t sha512ctx;
+ isc_sha512_init(&sha512ctx);
+ isc_sha512_update(&sha512ctx, r.base, r.length);
+ isc_sha512_final(key, &sha512ctx);
+
+ r.base = key;
+ r.length = ISC_SHA512_DIGESTLENGTH;
+ }
+ } else {
+ fprintf(stderr, "unknown hmac/digest algorithm: %s\n", argv[1]);
+ return (1);
+ }
+
+ isc_buffer_init(&buf, base64, sizeof(base64));
+ result = isc_base64_totext(&r, 0, "", &buf);
+ if (result != ISC_R_SUCCESS) {
+ fprintf(stderr, "error: %s\n", isc_result_totext(result));
+ return (1);
+ }
+ fprintf(stdout, "%.*s\n", (int)isc_buffer_usedlength(&buf), base64);
+ return (0);
+}
diff --git a/contrib/bind9/bin/tools/isc-hmac-fixup.docbook b/contrib/bind9/bin/tools/isc-hmac-fixup.docbook
new file mode 100644
index 0000000..a3039ee
--- /dev/null
+++ b/contrib/bind9/bin/tools/isc-hmac-fixup.docbook
@@ -0,0 +1,109 @@
+<!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN"
+ "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd"
+ [<!ENTITY mdash "&#8212;">]>
+<!--
+ - Copyright (C) 2010 Internet Systems Consortium, Inc. ("ISC")
+ -
+ - Permission to use, copy, modify, and/or 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 ISC DISCLAIMS ALL WARRANTIES WITH
+ - REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+ - AND FITNESS. IN NO EVENT SHALL ISC 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.
+-->
+
+<!-- $Id: isc-hmac-fixup.docbook,v 1.2 2010-01-07 21:52:11 each Exp $ -->
+<refentry id="man.isc-hmac-fixup">
+ <refentryinfo>
+ <date>January 5, 2010</date>
+ </refentryinfo>
+
+ <refmeta>
+ <refentrytitle><application>isc-hmac-fixup</application></refentrytitle>
+ <manvolnum>1</manvolnum>
+ <refmiscinfo>BIND9</refmiscinfo>
+ </refmeta>
+
+ <refnamediv>
+ <refname><application>isc-hmac-fixup</application></refname>
+ <refpurpose>fixes HMAC keys generated by older versions of BIND</refpurpose>
+ </refnamediv>
+
+ <docinfo>
+ <copyright>
+ <year>2010</year>
+ <holder>Internet Systems Consortium, Inc. ("ISC")</holder>
+ </copyright>
+ </docinfo>
+
+ <refsynopsisdiv>
+ <cmdsynopsis>
+ <command>isc-hmac-fixup</command>
+ <arg choice="req"><replaceable class="parameter">algorithm</replaceable></arg>
+ <arg choice="req"><replaceable class="parameter">secret</replaceable></arg>
+ </cmdsynopsis>
+ </refsynopsisdiv>
+
+ <refsect1>
+ <title>DESCRIPTION</title>
+ <para>
+ Versions of BIND 9 up to and including BIND 9.6 had a bug causing
+ HMAC-SHA* TSIG keys which were longer than the digest length of the
+ hash algorithm (i.e., SHA1 keys longer than 160 bits, SHA256 keys
+ longer than 256 bits, etc) to be used incorrectly, generating a
+ message authentication code that was incompatible with other DNS
+ implementations.
+ </para>
+ <para>
+ This bug has been fixed in BIND 9.7. However, the fix may
+ cause incompatibility between older and newer versions of
+ BIND, when using long keys. <command>isc-hmac-fixup</command>
+ modifies those keys to restore compatibility.
+ </para>
+ <para>
+ To modify a key, run <command>isc-hmac-fixup</command> and
+ specify the key's algorithm and secret on the command line. If the
+ secret is longer than the digest length of the algorithm (64 bytes
+ for SHA1 through SHA256, or 128 bytes for SHA384 and SHA512), then a
+ new secret will be generated consisting of a hash digest of the old
+ secret. (If the secret did not require conversion, then it will be
+ printed without modification.)
+ </para>
+ </refsect1>
+
+ <refsect1>
+ <title>SECURITY CONSIDERATIONS</title>
+ <para>
+ Secrets that have been converted by <command>isc-hmac-fixup</command>
+ are shortened, but as this is how the HMAC protocol works in
+ operation anyway, it does not affect security. RFC 2104 notes,
+ "Keys longer than [the digest length] are acceptable but the
+ extra length would not significantly increase the function
+ strength."
+ </para>
+ </refsect1>
+
+ <refsect1>
+ <title>SEE ALSO</title>
+ <para>
+ <citetitle>BIND 9 Administrator Reference Manual</citetitle>,
+ <citetitle>RFC 2104</citetitle>.
+ </para>
+ </refsect1>
+
+ <refsect1>
+ <title>AUTHOR</title>
+ <para><corpauthor>Internet Systems Consortium</corpauthor>
+ </para>
+ </refsect1>
+
+</refentry><!--
+ - Local variables:
+ - mode: sgml
+ - End:
+-->
diff --git a/contrib/bind9/bin/tools/isc-hmac-fixup.html b/contrib/bind9/bin/tools/isc-hmac-fixup.html
new file mode 100644
index 0000000..8b70777
--- /dev/null
+++ b/contrib/bind9/bin/tools/isc-hmac-fixup.html
@@ -0,0 +1,83 @@
+<!--
+ - Copyright (C) 2010 Internet Systems Consortium, Inc. ("ISC")
+ -
+ - Permission to use, copy, modify, and/or 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 ISC DISCLAIMS ALL WARRANTIES WITH
+ - REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+ - AND FITNESS. IN NO EVENT SHALL ISC 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.
+-->
+<!-- $Id: isc-hmac-fixup.html,v 1.4 2010-05-19 01:14:14 tbox Exp $ -->
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
+<title>isc-hmac-fixup</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.71.1">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"><div class="refentry" lang="en">
+<a name="man.isc-hmac-fixup"></a><div class="titlepage"></div>
+<div class="refnamediv">
+<h2>Name</h2>
+<p><span class="application">isc-hmac-fixup</span> &#8212; fixes HMAC keys generated by older versions of BIND</p>
+</div>
+<div class="refsynopsisdiv">
+<h2>Synopsis</h2>
+<div class="cmdsynopsis"><p><code class="command">isc-hmac-fixup</code> {<em class="replaceable"><code>algorithm</code></em>} {<em class="replaceable"><code>secret</code></em>}</p></div>
+</div>
+<div class="refsect1" lang="en">
+<a name="id2543351"></a><h2>DESCRIPTION</h2>
+<p>
+ Versions of BIND 9 up to and including BIND 9.6 had a bug causing
+ HMAC-SHA* TSIG keys which were longer than the digest length of the
+ hash algorithm (i.e., SHA1 keys longer than 160 bits, SHA256 keys
+ longer than 256 bits, etc) to be used incorrectly, generating a
+ message authentication code that was incompatible with other DNS
+ implementations.
+ </p>
+<p>
+ This bug has been fixed in BIND 9.7. However, the fix may
+ cause incompatibility between older and newer versions of
+ BIND, when using long keys. <span><strong class="command">isc-hmac-fixup</strong></span>
+ modifies those keys to restore compatibility.
+ </p>
+<p>
+ To modify a key, run <span><strong class="command">isc-hmac-fixup</strong></span> and
+ specify the key's algorithm and secret on the command line. If the
+ secret is longer than the digest length of the algorithm (64 bytes
+ for SHA1 through SHA256, or 128 bytes for SHA384 and SHA512), then a
+ new secret will be generated consisting of a hash digest of the old
+ secret. (If the secret did not require conversion, then it will be
+ printed without modification.)
+ </p>
+</div>
+<div class="refsect1" lang="en">
+<a name="id2543374"></a><h2>SECURITY CONSIDERATIONS</h2>
+<p>
+ Secrets that have been converted by <span><strong class="command">isc-hmac-fixup</strong></span>
+ are shortened, but as this is how the HMAC protocol works in
+ operation anyway, it does not affect security. RFC 2104 notes,
+ "Keys longer than [the digest length] are acceptable but the
+ extra length would not significantly increase the function
+ strength."
+ </p>
+</div>
+<div class="refsect1" lang="en">
+<a name="id2543388"></a><h2>SEE ALSO</h2>
+<p>
+ <em class="citetitle">BIND 9 Administrator Reference Manual</em>,
+ <em class="citetitle">RFC 2104</em>.
+ </p>
+</div>
+<div class="refsect1" lang="en">
+<a name="id2543405"></a><h2>AUTHOR</h2>
+<p><span class="corpauthor">Internet Systems Consortium</span>
+ </p>
+</div>
+</div></body>
+</html>
diff --git a/contrib/bind9/bin/tools/named-journalprint.8 b/contrib/bind9/bin/tools/named-journalprint.8
new file mode 100644
index 0000000..347b67b
--- /dev/null
+++ b/contrib/bind9/bin/tools/named-journalprint.8
@@ -0,0 +1,60 @@
+.\" Copyright (C) 2009 Internet Systems Consortium, Inc. ("ISC")
+.\"
+.\" Permission to use, copy, modify, and/or 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 ISC DISCLAIMS ALL WARRANTIES WITH
+.\" REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+.\" AND FITNESS. IN NO EVENT SHALL ISC 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.
+.\"
+.\" $Id: named-journalprint.8,v 1.4 2010-05-19 01:14:14 tbox Exp $
+.\"
+.hy 0
+.ad l
+.\" Title: named\-journalprint
+.\" Author:
+.\" Generator: DocBook XSL Stylesheets v1.71.1 <http://docbook.sf.net/>
+.\" Date: Feb 18, 2009
+.\" Manual: BIND9
+.\" Source: BIND9
+.\"
+.TH "NAMED\-JOURNALPRINT" "8" "Feb 18, 2009" "BIND9" "BIND9"
+.\" disable hyphenation
+.nh
+.\" disable justification (adjust text to left margin only)
+.ad l
+.SH "NAME"
+named\-journalprint \- print zone journal in human\-readable form
+.SH "SYNOPSIS"
+.HP 19
+\fBnamed\-journalprint\fR {\fIjournal\fR}
+.SH "DESCRIPTION"
+.PP
+\fBnamed\-journalprint\fR
+prints the contents of a zone journal file in a human\-readable form.
+.PP
+Journal files are automatically created by
+\fBnamed\fR
+when changes are made to dynamic zones (e.g., by
+\fBnsupdate\fR). They record each addition or deletion of a resource record, in binary format, allowing the changes to be re\-applied to the zone when the server is restarted after a shutdown or crash. By default, the name of the journal file is formed by appending the extension
+\fI.jnl\fR
+to the name of the corresponding zone file.
+.PP
+\fBnamed\-journalprint\fR
+converts the contents of a given journal file into a human\-readable text format. Each line begins with "add" or "del", to indicate whether the record was added or deleted, and continues with the resource record in master\-file format.
+.SH "SEE ALSO"
+.PP
+\fBnamed\fR(8),
+\fBnsupdate\fR(8),
+BIND 9 Administrator Reference Manual.
+.SH "AUTHOR"
+.PP
+Internet Systems Consortium
+.SH "COPYRIGHT"
+Copyright \(co 2009 Internet Systems Consortium, Inc. ("ISC")
+.br
diff --git a/contrib/bind9/bin/tools/named-journalprint.c b/contrib/bind9/bin/tools/named-journalprint.c
new file mode 100644
index 0000000..8a00aa7
--- /dev/null
+++ b/contrib/bind9/bin/tools/named-journalprint.c
@@ -0,0 +1,86 @@
+/*
+ * Copyright (C) 2004-2009 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2000, 2001 Internet Software Consortium.
+ *
+ * Permission to use, copy, modify, and/or 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 ISC DISCLAIMS ALL WARRANTIES WITH
+ * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+ * AND FITNESS. IN NO EVENT SHALL ISC 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.
+ */
+
+/* $Id: named-journalprint.c,v 1.2 2009-12-04 21:59:23 marka Exp $ */
+
+/*! \file */
+#include <config.h>
+
+#include <isc/log.h>
+#include <isc/mem.h>
+#include <isc/util.h>
+
+#include <dns/journal.h>
+#include <dns/log.h>
+#include <dns/result.h>
+#include <dns/types.h>
+
+#include <stdlib.h>
+
+/*
+ * Setup logging to use stderr.
+ */
+static isc_result_t
+setup_logging(isc_mem_t *mctx, FILE *errout, isc_log_t **logp) {
+ isc_logdestination_t destination;
+ isc_logconfig_t *logconfig = NULL;
+ isc_log_t *log = NULL;
+
+ RUNTIME_CHECK(isc_log_create(mctx, &log, &logconfig) == ISC_R_SUCCESS);
+ isc_log_setcontext(log);
+ dns_log_init(log);
+ dns_log_setcontext(log);
+
+ destination.file.stream = errout;
+ destination.file.name = NULL;
+ destination.file.versions = ISC_LOG_ROLLNEVER;
+ destination.file.maximum_size = 0;
+ RUNTIME_CHECK(isc_log_createchannel(logconfig, "stderr",
+ ISC_LOG_TOFILEDESC,
+ ISC_LOG_DYNAMIC,
+ &destination, 0) == ISC_R_SUCCESS);
+ RUNTIME_CHECK(isc_log_usechannel(logconfig, "stderr",
+ NULL, NULL) == ISC_R_SUCCESS);
+
+ *logp = log;
+ return (ISC_R_SUCCESS);
+}
+
+int
+main(int argc, char **argv) {
+ char *file;
+ isc_mem_t *mctx = NULL;
+ isc_result_t result;
+ isc_log_t *lctx = NULL;
+
+ if (argc != 2) {
+ printf("usage: %s journal\n", argv[0]);
+ return(1);
+ }
+
+ file = argv[1];
+
+ RUNTIME_CHECK(isc_mem_create(0, 0, &mctx) == ISC_R_SUCCESS);
+ RUNTIME_CHECK(setup_logging(mctx, stderr, &lctx) == ISC_R_SUCCESS);
+
+ result = dns_journal_print(mctx, file, stdout);
+ if (result == DNS_R_NOJOURNAL)
+ fprintf(stderr, "%s\n", dns_result_totext(result));
+ isc_log_destroy(&lctx);
+ isc_mem_detach(&mctx);
+ return(result != ISC_R_SUCCESS ? 1 : 0);
+}
diff --git a/contrib/bind9/bin/tools/named-journalprint.docbook b/contrib/bind9/bin/tools/named-journalprint.docbook
new file mode 100644
index 0000000..d523f8c
--- /dev/null
+++ b/contrib/bind9/bin/tools/named-journalprint.docbook
@@ -0,0 +1,101 @@
+<!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN"
+ "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd"
+ [<!ENTITY mdash "&#8212;">]>
+<!--
+ - Copyright (C) 2009 Internet Systems Consortium, Inc. ("ISC")
+ -
+ - Permission to use, copy, modify, and/or 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 ISC DISCLAIMS ALL WARRANTIES WITH
+ - REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+ - AND FITNESS. IN NO EVENT SHALL ISC 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.
+-->
+
+<!-- $Id: named-journalprint.docbook,v 1.2 2009-12-04 21:59:23 marka Exp $ -->
+<refentry id="man.named-journalprint">
+ <refentryinfo>
+ <date>Feb 18, 2009</date>
+ </refentryinfo>
+
+ <refmeta>
+ <refentrytitle><application>named-journalprint</application></refentrytitle>
+ <manvolnum>8</manvolnum>
+ <refmiscinfo>BIND9</refmiscinfo>
+ </refmeta>
+
+ <refnamediv>
+ <refname><application>named-journalprint</application></refname>
+ <refpurpose>print zone journal in human-readable form</refpurpose>
+ </refnamediv>
+
+ <docinfo>
+ <copyright>
+ <year>2009</year>
+ <holder>Internet Systems Consortium, Inc. ("ISC")</holder>
+ </copyright>
+ </docinfo>
+
+ <refsynopsisdiv>
+ <cmdsynopsis>
+ <command>named-journalprint</command>
+ <arg choice="req"><replaceable class="parameter">journal</replaceable></arg>
+ </cmdsynopsis>
+ </refsynopsisdiv>
+
+ <refsect1>
+ <title>DESCRIPTION</title>
+ <para>
+ <command>named-journalprint</command>
+ prints the contents of a zone journal file in a human-readable
+ form.
+ </para>
+ <para>
+ Journal files are automatically created by <command>named</command>
+ when changes are made to dynamic zones (e.g., by
+ <command>nsupdate</command>). They record each addition
+ or deletion of a resource record, in binary format, allowing the
+ changes to be re-applied to the zone when the server is
+ restarted after a shutdown or crash. By default, the name of
+ the journal file is formed by appending the extension
+ <filename>.jnl</filename> to the name of the corresponding
+ zone file.
+ </para>
+ <para>
+ <command>named-journalprint</command> converts the contents of a given
+ journal file into a human-readable text format. Each line begins
+ with "add" or "del", to indicate whether the record was added or
+ deleted, and continues with the resource record in master-file
+ format.
+ </para>
+ </refsect1>
+
+ <refsect1>
+ <title>SEE ALSO</title>
+ <para>
+ <citerefentry>
+ <refentrytitle>named</refentrytitle><manvolnum>8</manvolnum>
+ </citerefentry>,
+ <citerefentry>
+ <refentrytitle>nsupdate</refentrytitle><manvolnum>8</manvolnum>
+ </citerefentry>,
+ <citetitle>BIND 9 Administrator Reference Manual</citetitle>.
+ </para>
+ </refsect1>
+
+ <refsect1>
+ <title>AUTHOR</title>
+ <para><corpauthor>Internet Systems Consortium</corpauthor>
+ </para>
+ </refsect1>
+
+</refentry><!--
+ - Local variables:
+ - mode: sgml
+ - End:
+-->
diff --git a/contrib/bind9/bin/tools/named-journalprint.html b/contrib/bind9/bin/tools/named-journalprint.html
new file mode 100644
index 0000000..8878fc50
--- /dev/null
+++ b/contrib/bind9/bin/tools/named-journalprint.html
@@ -0,0 +1,73 @@
+<!--
+ - Copyright (C) 2009 Internet Systems Consortium, Inc. ("ISC")
+ -
+ - Permission to use, copy, modify, and/or 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 ISC DISCLAIMS ALL WARRANTIES WITH
+ - REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+ - AND FITNESS. IN NO EVENT SHALL ISC 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.
+-->
+<!-- $Id: named-journalprint.html,v 1.4 2010-05-19 01:14:14 tbox Exp $ -->
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
+<title>named-journalprint</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.71.1">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"><div class="refentry" lang="en">
+<a name="man.named-journalprint"></a><div class="titlepage"></div>
+<div class="refnamediv">
+<h2>Name</h2>
+<p><span class="application">named-journalprint</span> &#8212; print zone journal in human-readable form</p>
+</div>
+<div class="refsynopsisdiv">
+<h2>Synopsis</h2>
+<div class="cmdsynopsis"><p><code class="command">named-journalprint</code> {<em class="replaceable"><code>journal</code></em>}</p></div>
+</div>
+<div class="refsect1" lang="en">
+<a name="id2543342"></a><h2>DESCRIPTION</h2>
+<p>
+ <span><strong class="command">named-journalprint</strong></span>
+ prints the contents of a zone journal file in a human-readable
+ form.
+ </p>
+<p>
+ Journal files are automatically created by <span><strong class="command">named</strong></span>
+ when changes are made to dynamic zones (e.g., by
+ <span><strong class="command">nsupdate</strong></span>). They record each addition
+ or deletion of a resource record, in binary format, allowing the
+ changes to be re-applied to the zone when the server is
+ restarted after a shutdown or crash. By default, the name of
+ the journal file is formed by appending the extension
+ <code class="filename">.jnl</code> to the name of the corresponding
+ zone file.
+ </p>
+<p>
+ <span><strong class="command">named-journalprint</strong></span> converts the contents of a given
+ journal file into a human-readable text format. Each line begins
+ with "add" or "del", to indicate whether the record was added or
+ deleted, and continues with the resource record in master-file
+ format.
+ </p>
+</div>
+<div class="refsect1" lang="en">
+<a name="id2543378"></a><h2>SEE ALSO</h2>
+<p>
+ <span class="citerefentry"><span class="refentrytitle">named</span>(8)</span>,
+ <span class="citerefentry"><span class="refentrytitle">nsupdate</span>(8)</span>,
+ <em class="citetitle">BIND 9 Administrator Reference Manual</em>.
+ </p>
+</div>
+<div class="refsect1" lang="en">
+<a name="id2543409"></a><h2>AUTHOR</h2>
+<p><span class="corpauthor">Internet Systems Consortium</span>
+ </p>
+</div>
+</div></body>
+</html>
diff --git a/contrib/bind9/bin/tools/nsec3hash.8 b/contrib/bind9/bin/tools/nsec3hash.8
new file mode 100644
index 0000000..6fba8c8
--- /dev/null
+++ b/contrib/bind9/bin/tools/nsec3hash.8
@@ -0,0 +1,70 @@
+.\" Copyright (C) 2009 Internet Systems Consortium, Inc. ("ISC")
+.\"
+.\" Permission to use, copy, modify, and/or 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 ISC DISCLAIMS ALL WARRANTIES WITH
+.\" REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+.\" AND FITNESS. IN NO EVENT SHALL ISC 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.
+.\"
+.\" $Id: nsec3hash.8,v 1.5 2010-05-19 01:14:14 tbox Exp $
+.\"
+.hy 0
+.ad l
+.\" Title: nsec3hash
+.\" Author:
+.\" Generator: DocBook XSL Stylesheets v1.71.1 <http://docbook.sf.net/>
+.\" Date: Feb 18, 2009
+.\" Manual: BIND9
+.\" Source: BIND9
+.\"
+.TH "NSEC3HASH" "8" "Feb 18, 2009" "BIND9" "BIND9"
+.\" disable hyphenation
+.nh
+.\" disable justification (adjust text to left margin only)
+.ad l
+.SH "NAME"
+nsec3hash \- generate NSEC3 hash
+.SH "SYNOPSIS"
+.HP 10
+\fBnsec3hash\fR {\fIsalt\fR} {\fIalgorithm\fR} {\fIiterations\fR} {\fIdomain\fR}
+.SH "DESCRIPTION"
+.PP
+\fBnsec3hash\fR
+generates an NSEC3 hash based on a set of NSEC3 parameters. This can be used to check the validity of NSEC3 records in a signed zone.
+.SH "ARGUMENTS"
+.PP
+salt
+.RS 4
+The salt provided to the hash algorithm.
+.RE
+.PP
+algorithm
+.RS 4
+A number indicating the hash algorithm. Currently the only supported hash algorithm for NSEC3 is SHA\-1, which is indicated by the number 1; consequently "1" is the only useful value for this argument.
+.RE
+.PP
+iterations
+.RS 4
+The number of additional times the hash should be performed.
+.RE
+.PP
+domain
+.RS 4
+The domain name to be hashed.
+.RE
+.SH "SEE ALSO"
+.PP
+BIND 9 Administrator Reference Manual,
+RFC 5155.
+.SH "AUTHOR"
+.PP
+Internet Systems Consortium
+.SH "COPYRIGHT"
+Copyright \(co 2009 Internet Systems Consortium, Inc. ("ISC")
+.br
diff --git a/contrib/bind9/bin/tools/nsec3hash.c b/contrib/bind9/bin/tools/nsec3hash.c
new file mode 100644
index 0000000..0e2a910
--- /dev/null
+++ b/contrib/bind9/bin/tools/nsec3hash.c
@@ -0,0 +1,121 @@
+/*
+ * Copyright (C) 2006, 2008, 2009 Internet Systems Consortium, Inc. ("ISC")
+ *
+ * Permission to use, copy, modify, and/or 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 ISC DISCLAIMS ALL WARRANTIES WITH
+ * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+ * AND FITNESS. IN NO EVENT SHALL ISC 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.
+ */
+
+/* $Id: nsec3hash.c,v 1.6 2009-10-06 21:20:44 each Exp $ */
+
+#include <config.h>
+
+#include <stdlib.h>
+#include <stdarg.h>
+
+#include <isc/base32.h>
+#include <isc/buffer.h>
+#include <isc/hex.h>
+#include <isc/iterated_hash.h>
+#include <isc/print.h>
+#include <isc/result.h>
+#include <isc/string.h>
+#include <isc/types.h>
+
+#include <dns/fixedname.h>
+#include <dns/name.h>
+#include <dns/nsec3.h>
+#include <dns/types.h>
+
+const char *program = "nsec3hash";
+
+ISC_PLATFORM_NORETURN_PRE static void
+fatal(const char *format, ...) ISC_PLATFORM_NORETURN_POST;
+
+static void
+fatal(const char *format, ...) {
+ va_list args;
+
+ fprintf(stderr, "%s: ", program);
+ va_start(args, format);
+ vfprintf(stderr, format, args);
+ va_end(args);
+ fprintf(stderr, "\n");
+ exit(1);
+}
+
+static void
+check_result(isc_result_t result, const char *message) {
+ if (result != ISC_R_SUCCESS)
+ fatal("%s: %s", message, isc_result_totext(result));
+}
+
+static void
+usage() {
+ fatal("salt hash iterations domain");
+}
+
+int
+main(int argc, char **argv) {
+ dns_fixedname_t fixed;
+ dns_name_t *name;
+ isc_buffer_t buffer;
+ isc_region_t region;
+ isc_result_t result;
+ unsigned char hash[NSEC3_MAX_HASH_LENGTH];
+ unsigned char salt[DNS_NSEC3_SALTSIZE];
+ unsigned char text[1024];
+ unsigned int hash_alg;
+ unsigned int length;
+ unsigned int iterations;
+ unsigned int salt_length;
+
+ if (argc != 5)
+ usage();
+
+ if (strcmp(argv[1], "-") == 0) {
+ salt_length = 0;
+ salt[0] = 0;
+ } else {
+ isc_buffer_init(&buffer, salt, sizeof(salt));
+ result = isc_hex_decodestring(argv[1], &buffer);
+ check_result(result, "isc_hex_decodestring(salt)");
+ salt_length = isc_buffer_usedlength(&buffer);
+ if (salt_length > DNS_NSEC3_SALTSIZE)
+ fatal("salt too long");
+ }
+ hash_alg = atoi(argv[2]);
+ if (hash_alg > 255U)
+ fatal("hash algorithm too large");
+ iterations = atoi(argv[3]);
+ if (iterations > 0xffffU)
+ fatal("iterations to large");
+
+ dns_fixedname_init(&fixed);
+ name = dns_fixedname_name(&fixed);
+ isc_buffer_init(&buffer, argv[4], strlen(argv[4]));
+ isc_buffer_add(&buffer, strlen(argv[4]));
+ result = dns_name_fromtext(name, &buffer, dns_rootname, 0, NULL);
+ check_result(result, "dns_name_fromtext() failed");
+
+ dns_name_downcase(name, name, NULL);
+ length = isc_iterated_hash(hash, hash_alg, iterations, salt,
+ salt_length, name->ndata, name->length);
+ if (length == 0)
+ fatal("isc_iterated_hash failed");
+ region.base = hash;
+ region.length = length;
+ isc_buffer_init(&buffer, text, sizeof(text));
+ isc_base32hex_totext(&region, 1, "", &buffer);
+ fprintf(stdout, "%.*s (salt=%s, hash=%u, iterations=%u)\n",
+ (int)isc_buffer_usedlength(&buffer), text, argv[1], hash_alg, iterations);
+ return(0);
+}
diff --git a/contrib/bind9/bin/tools/nsec3hash.docbook b/contrib/bind9/bin/tools/nsec3hash.docbook
new file mode 100644
index 0000000..48eb4af
--- /dev/null
+++ b/contrib/bind9/bin/tools/nsec3hash.docbook
@@ -0,0 +1,125 @@
+<!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN"
+ "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd"
+ [<!ENTITY mdash "&#8212;">]>
+<!--
+ - Copyright (C) 2009 Internet Systems Consortium, Inc. ("ISC")
+ -
+ - Permission to use, copy, modify, and/or 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 ISC DISCLAIMS ALL WARRANTIES WITH
+ - REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+ - AND FITNESS. IN NO EVENT SHALL ISC 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.
+-->
+
+<!-- $Id: nsec3hash.docbook,v 1.3 2009-03-02 23:47:43 tbox Exp $ -->
+<refentry id="man.nsec3hash">
+ <refentryinfo>
+ <date>Feb 18, 2009</date>
+ </refentryinfo>
+
+ <refmeta>
+ <refentrytitle><application>nsec3hash</application></refentrytitle>
+ <manvolnum>8</manvolnum>
+ <refmiscinfo>BIND9</refmiscinfo>
+ </refmeta>
+
+ <refnamediv>
+ <refname><application>nsec3hash</application></refname>
+ <refpurpose>generate NSEC3 hash</refpurpose>
+ </refnamediv>
+
+ <docinfo>
+ <copyright>
+ <year>2009</year>
+ <holder>Internet Systems Consortium, Inc. ("ISC")</holder>
+ </copyright>
+ </docinfo>
+
+ <refsynopsisdiv>
+ <cmdsynopsis>
+ <command>nsec3hash</command>
+ <arg choice="req"><replaceable class="parameter">salt</replaceable></arg>
+ <arg choice="req"><replaceable class="parameter">algorithm</replaceable></arg>
+ <arg choice="req"><replaceable class="parameter">iterations</replaceable></arg>
+ <arg choice="req"><replaceable class="parameter">domain</replaceable></arg>
+ </cmdsynopsis>
+ </refsynopsisdiv>
+
+ <refsect1>
+ <title>DESCRIPTION</title>
+ <para>
+ <command>nsec3hash</command> generates an NSEC3 hash based on
+ a set of NSEC3 parameters. This can be used to check the validity
+ of NSEC3 records in a signed zone.
+ </para>
+ </refsect1>
+
+ <refsect1>
+ <title>ARGUMENTS</title>
+ <variablelist>
+ <varlistentry>
+ <term>salt</term>
+ <listitem>
+ <para>
+ The salt provided to the hash algorithm.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>algorithm</term>
+ <listitem>
+ <para>
+ A number indicating the hash algorithm. Currently the
+ only supported hash algorithm for NSEC3 is SHA-1, which is
+ indicated by the number 1; consequently "1" is the only
+ useful value for this argument.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>iterations</term>
+ <listitem>
+ <para>
+ The number of additional times the hash should be performed.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>domain</term>
+ <listitem>
+ <para>
+ The domain name to be hashed.
+ </para>
+ </listitem>
+ </varlistentry>
+ </variablelist>
+ </refsect1>
+
+ <refsect1>
+ <title>SEE ALSO</title>
+ <para>
+ <citetitle>BIND 9 Administrator Reference Manual</citetitle>,
+ <citetitle>RFC 5155</citetitle>.
+ </para>
+ </refsect1>
+
+ <refsect1>
+ <title>AUTHOR</title>
+ <para><corpauthor>Internet Systems Consortium</corpauthor>
+ </para>
+ </refsect1>
+
+</refentry><!--
+ - Local variables:
+ - mode: sgml
+ - End:
+-->
diff --git a/contrib/bind9/bin/tools/nsec3hash.html b/contrib/bind9/bin/tools/nsec3hash.html
new file mode 100644
index 0000000..e6c0995
--- /dev/null
+++ b/contrib/bind9/bin/tools/nsec3hash.html
@@ -0,0 +1,78 @@
+<!--
+ - Copyright (C) 2009 Internet Systems Consortium, Inc. ("ISC")
+ -
+ - Permission to use, copy, modify, and/or 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 ISC DISCLAIMS ALL WARRANTIES WITH
+ - REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+ - AND FITNESS. IN NO EVENT SHALL ISC 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.
+-->
+<!-- $Id: nsec3hash.html,v 1.5 2010-05-19 01:14:14 tbox Exp $ -->
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
+<title>nsec3hash</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.71.1">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"><div class="refentry" lang="en">
+<a name="man.nsec3hash"></a><div class="titlepage"></div>
+<div class="refnamediv">
+<h2>Name</h2>
+<p><span class="application">nsec3hash</span> &#8212; generate NSEC3 hash</p>
+</div>
+<div class="refsynopsisdiv">
+<h2>Synopsis</h2>
+<div class="cmdsynopsis"><p><code class="command">nsec3hash</code> {<em class="replaceable"><code>salt</code></em>} {<em class="replaceable"><code>algorithm</code></em>} {<em class="replaceable"><code>iterations</code></em>} {<em class="replaceable"><code>domain</code></em>}</p></div>
+</div>
+<div class="refsect1" lang="en">
+<a name="id2543367"></a><h2>DESCRIPTION</h2>
+<p>
+ <span><strong class="command">nsec3hash</strong></span> generates an NSEC3 hash based on
+ a set of NSEC3 parameters. This can be used to check the validity
+ of NSEC3 records in a signed zone.
+ </p>
+</div>
+<div class="refsect1" lang="en">
+<a name="id2543380"></a><h2>ARGUMENTS</h2>
+<div class="variablelist"><dl>
+<dt><span class="term">salt</span></dt>
+<dd><p>
+ The salt provided to the hash algorithm.
+ </p></dd>
+<dt><span class="term">algorithm</span></dt>
+<dd><p>
+ A number indicating the hash algorithm. Currently the
+ only supported hash algorithm for NSEC3 is SHA-1, which is
+ indicated by the number 1; consequently "1" is the only
+ useful value for this argument.
+ </p></dd>
+<dt><span class="term">iterations</span></dt>
+<dd><p>
+ The number of additional times the hash should be performed.
+ </p></dd>
+<dt><span class="term">domain</span></dt>
+<dd><p>
+ The domain name to be hashed.
+ </p></dd>
+</dl></div>
+</div>
+<div class="refsect1" lang="en">
+<a name="id2543442"></a><h2>SEE ALSO</h2>
+<p>
+ <em class="citetitle">BIND 9 Administrator Reference Manual</em>,
+ <em class="citetitle">RFC 5155</em>.
+ </p>
+</div>
+<div class="refsect1" lang="en">
+<a name="id2543459"></a><h2>AUTHOR</h2>
+<p><span class="corpauthor">Internet Systems Consortium</span>
+ </p>
+</div>
+</div></body>
+</html>
diff --git a/contrib/bind9/config.guess b/contrib/bind9/config.guess
index c79aebc..f8d6eac 100644
--- a/contrib/bind9/config.guess
+++ b/contrib/bind9/config.guess
@@ -3,7 +3,7 @@
# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
# 2000, 2001, 2002, 2003, 2004 Free Software Foundation, Inc.
-timestamp='2004-09-07'
+timestamp='2009-01-17'
# This file is free software; you can redistribute it and/or modify it
# under the terms of the GNU General Public License as published by
diff --git a/contrib/bind9/config.h.in b/contrib/bind9/config.h.in
index aa1ba81..01f8b16 100644
--- a/contrib/bind9/config.h.in
+++ b/contrib/bind9/config.h.in
@@ -1,6 +1,6 @@
/* config.h.in. Generated from configure.in by autoheader. */
/*
- * Copyright (C) 2004, 2005, 2007, 2009 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004, 2005, 2007, 2008 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 1999-2003 Internet Software Consortium.
*
* Permission to use, copy, modify, and/or distribute this software for any
@@ -16,7 +16,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: config.h.in,v 1.106.40.24 2010-12-21 04:33:58 marka Exp $ */
+/* $Id: config.h.in,v 1.143.8.1 2011-02-03 05:52:35 marka Exp $ */
/*! \file */
@@ -147,6 +147,9 @@ int sigwait(const unsigned int *set, int *sig);
/* Define if building universal (internal helper macro) */
#undef AC_APPLE_UNIVERSAL_BUILD
+/* Define to enable the "filter-aaaa-on-v4" option. */
+#undef ALLOW_FILTER_AAAA_ON_V4
+
/* Define if recvmsg() does not meet all of the BSD socket API specifications.
*/
#undef BROKEN_RECVMSG
@@ -157,6 +160,12 @@ int sigwait(const unsigned int *set, int *sig);
/* Define to enable "rrset-order fixed" syntax. */
#undef DNS_RDATASET_FIXED
+/* Define to enable rpz-nsdname rules. */
+#undef ENABLE_RPZ_NSDNAME
+
+/* Define to enable rpz-nsip rules. */
+#undef ENABLE_RPZ_NSIP
+
/* Solaris hack to get select_large_fdset. */
#undef FD_SETSIZE
@@ -175,9 +184,18 @@ int sigwait(const unsigned int *set, int *sig);
/* Define to 1 if you have the <devpoll.h> header file. */
#undef HAVE_DEVPOLL_H
+/* Define to 1 if you have the `dlclose' function. */
+#undef HAVE_DLCLOSE
+
/* Define to 1 if you have the <dlfcn.h> header file. */
#undef HAVE_DLFCN_H
+/* Define to 1 if you have the `dlopen' function. */
+#undef HAVE_DLOPEN
+
+/* Define to 1 if you have the `dlsym' function. */
+#undef HAVE_DLSYM
+
/* Define to 1 if you have the `EVP_sha256' function. */
#undef HAVE_EVP_SHA256
@@ -190,9 +208,15 @@ int sigwait(const unsigned int *set, int *sig);
/* Define to 1 if you have the <gssapi/gssapi.h> header file. */
#undef HAVE_GSSAPI_GSSAPI_H
+/* Define to 1 if you have the <gssapi/gssapi_krb5.h> header file. */
+#undef HAVE_GSSAPI_GSSAPI_KRB5_H
+
/* Define to 1 if you have the <gssapi.h> header file. */
#undef HAVE_GSSAPI_H
+/* Define to 1 if you have the <gssapi_krb5.h> header file. */
+#undef HAVE_GSSAPI_KRB5_H
+
/* Define to 1 if you have the <inttypes.h> header file. */
#undef HAVE_INTTYPES_H
@@ -211,9 +235,15 @@ int sigwait(const unsigned int *set, int *sig);
/* Define to 1 if you have the `cap' library (-lcap). */
#undef HAVE_LIBCAP
+/* if system have backtrace function */
+#undef HAVE_LIBCTRACE
+
/* Define to 1 if you have the `c_r' library (-lc_r). */
#undef HAVE_LIBC_R
+/* Define to 1 if you have the `dl' library (-ldl). */
+#undef HAVE_LIBDL
+
/* Define to 1 if you have the `nsl' library (-lnsl). */
#undef HAVE_LIBNSL
@@ -247,9 +277,27 @@ int sigwait(const unsigned int *set, int *sig);
/* Define to 1 if you have the <net/if6.h> header file. */
#undef HAVE_NET_IF6_H
+/* Define if your OpenSSL version supports GOST. */
+#undef HAVE_OPENSSL_GOST
+
+/* Define to 1 if you have the <regex.h> header file. */
+#undef HAVE_REGEX_H
+
+/* Define to 1 if you have the `setegid' function. */
+#undef HAVE_SETEGID
+
+/* Define to 1 if you have the `seteuid' function. */
+#undef HAVE_SETEUID
+
/* Define to 1 if you have the `setlocale' function. */
#undef HAVE_SETLOCALE
+/* Define to 1 if you have the `setresgid' function. */
+#undef HAVE_SETRESGID
+
+/* Define to 1 if you have the `setresuid' function. */
+#undef HAVE_SETRESUID
+
/* Define to 1 if you have the <stdint.h> header file. */
#undef HAVE_STDINT_H
@@ -304,6 +352,15 @@ int sigwait(const unsigned int *set, int *sig);
/* Define to 1 if you have the <unistd.h> header file. */
#undef HAVE_UNISTD_H
+/* return type of gai_strerror */
+#undef IRS_GAISTRERROR_RETURN_T
+
+/* Define to the buffer length type used by getnameinfo(3). */
+#undef IRS_GETNAMEINFO_BUFLEN_T
+
+/* Define to the flags type used by getnameinfo(3). */
+#undef IRS_GETNAMEINFO_FLAGS_T
+
/* Defined if extern char *optarg is not declared. */
#undef NEED_OPTARG
@@ -361,11 +418,8 @@ int sigwait(const unsigned int *set, int *sig);
/* Define to empty if `const' does not conform to ANSI C. */
#undef const
-/* Define to `__inline__' or `__inline' if that's what the C compiler
- calls it, or to nothing if 'inline' is not supported under any name. */
-#ifndef __cplusplus
+/* Define to empty if your compiler does not support "static inline". */
#undef inline
-#endif
/* Define to `unsigned int' if <sys/types.h> does not define. */
#undef size_t
diff --git a/contrib/bind9/configure.in b/contrib/bind9/configure.in
index 08f0bf3..d5fb15c 100644
--- a/contrib/bind9/configure.in
+++ b/contrib/bind9/configure.in
@@ -1,4 +1,4 @@
-# Copyright (C) 2004-2010 Internet Systems Consortium, Inc. ("ISC")
+# Copyright (C) 2004-2011 Internet Systems Consortium, Inc. ("ISC")
# Copyright (C) 1998-2003 Internet Software Consortium.
#
# Permission to use, copy, modify, and/or distribute this software for any
@@ -18,7 +18,7 @@ AC_DIVERT_PUSH(1)dnl
esyscmd([sed "s/^/# /" COPYRIGHT])dnl
AC_DIVERT_POP()dnl
-AC_REVISION($Revision: 1.457.26.28 $)
+AC_REVISION($Revision: 1.512.8.1 $)
AC_INIT(lib/dns/name.c)
AC_PREREQ(2.59)
@@ -36,6 +36,7 @@ case $build_os in
sunos*)
# Just set the maximum command line length for sunos as it otherwise
# takes a exceptionally long time to work it out. Required for libtool.
+
lt_cv_sys_max_cmd_len=4096;
;;
esac
@@ -61,7 +62,6 @@ It is available from http://www.isc.org as a separate download.])
;;
esac
-
#
# Make very sure that these are the first files processed by
# config.status, since we use the processed output as the input for
@@ -111,6 +111,8 @@ AC_SUBST(ETAGS)
#
# Perl is optional; it is used only by some of the system test scripts.
+# Note: the backtrace feature (see below) uses perl to build the symbol table,
+# but it still compiles without perl, in which case an empty table will be used.
#
AC_PATH_PROGS(PERL, perl5 perl)
AC_SUBST(PERL)
@@ -269,7 +271,7 @@ esac
AC_HEADER_STDC
-AC_CHECK_HEADERS(fcntl.h sys/time.h unistd.h sys/sockio.h sys/select.h sys/param.h sys/sysctl.h net/if6.h,,,
+AC_CHECK_HEADERS(fcntl.h regex.h sys/time.h unistd.h sys/sockio.h sys/select.h sys/param.h sys/sysctl.h net/if6.h,,,
[$ac_includes_default
#ifdef HAVE_SYS_PARAM_H
# include <sys/param.h>
@@ -283,6 +285,12 @@ AC_CHECK_FUNC(sysctlbyname, AC_DEFINE(HAVE_SYSCTLBYNAME))
AC_C_FLEXIBLE_ARRAY_MEMBER
#
+# Older versions of HP/UX don't define seteuid() and setegid()
+#
+AC_CHECK_FUNCS(seteuid setresuid)
+AC_CHECK_FUNCS(setegid setresgid)
+
+#
# UnixWare 7.1.1 with the feature supplement to the UDK compiler
# is reported to not support "static inline" (RT #1212).
#
@@ -300,7 +308,7 @@ AC_TRY_COMPILE(, [
],
[AC_MSG_RESULT(no)],
[AC_MSG_RESULT(yes)
- AC_DEFINE(inline, )])
+ AC_DEFINE(inline, ,[Define to empty if your compiler does not support "static inline".])])
AC_TYPE_SIZE_T
AC_CHECK_TYPE(ssize_t, int)
@@ -332,6 +340,20 @@ AC_TRY_COMPILE([],[long long i = 0; return (0);],
AC_SUBST(ISC_PLATFORM_HAVELONGLONG)
#
+# check for GCC noreturn attribute
+#
+AC_MSG_CHECKING(for GCC noreturn attribute)
+AC_TRY_COMPILE([],[void foo() __attribute__((noreturn));],
+ [AC_MSG_RESULT(yes)
+ ISC_PLATFORM_NORETURN_PRE="#define ISC_PLATFORM_NORETURN_PRE"
+ ISC_PLATFORM_NORETURN_POST="#define ISC_PLATFORM_NORETURN_POST __attribute__((noreturn))"],
+ [AC_MSG_RESULT(no)
+ ISC_PLATFORM_NORETURN_PRE="#define ISC_PLATFORM_NORETURN_PRE"
+ ISC_PLATFORM_NORETURN_POST="#define ISC_PLATFORM_NORETURN_POST"])
+AC_SUBST(ISC_PLATFORM_NORETURN_PRE)
+AC_SUBST(ISC_PLATFORM_NORETURN_POST)
+
+#
# check if we have lifconf
#
AC_MSG_CHECKING(for struct lifconf)
@@ -495,6 +517,7 @@ then
fi
done
fi
+OPENSSL_GOST=""
case "$use_openssl" in
no)
AC_MSG_RESULT(no)
@@ -650,6 +673,42 @@ esac
AC_MSG_RESULT(no)
fi
AC_CHECK_FUNCS(EVP_sha256 EVP_sha512)
+
+ AC_MSG_CHECKING(for OpenSSL GOST support)
+ have_gost=""
+ AC_TRY_RUN([
+#include <openssl/conf.h>
+#include <openssl/engine.h>
+int main() {
+#if (OPENSSL_VERSION_NUMBER >= 0x10000000L)
+ ENGINE *e;
+
+ OPENSSL_config(NULL);
+
+ e = ENGINE_by_id("gost");
+ if (e == NULL)
+ return (1);
+ if (ENGINE_init(e) <= 0)
+ return (1);
+ return (0);
+#else
+ return (1);
+#endif
+}
+],
+ [AC_MSG_RESULT(yes)
+ have_gost="yes"],
+ [AC_MSG_RESULT(no)
+ have_gost="no"])
+ case $have_gost in
+ yes)
+ OPENSSL_GOST="yes"
+ AC_DEFINE(HAVE_OPENSSL_GOST, 1,
+ [Define if your OpenSSL version supports GOST.])
+ ;;
+ *)
+ ;;
+ esac
CFLAGS="$saved_cflags"
LIBS="$saved_libs"
OPENSSLLINKOBJS='${OPENSSLLINKOBJS}'
@@ -667,9 +726,34 @@ AC_SUBST(USE_OPENSSL)
AC_SUBST(DST_OPENSSL_INC)
AC_SUBST(OPENSSLLINKOBJS)
AC_SUBST(OPENSSLLINKSRCS)
+AC_SUBST(OPENSSL_GOST)
DNS_CRYPTO_LIBS="$DNS_CRYPTO_LIBS $DNS_OPENSSL_LIBS"
#
+# Use OpenSSL for hash functions
+#
+
+AC_ARG_ENABLE(openssl-hash,
+ [ --enable-openssl-hash use OpenSSL for hash functions [[default=no]]],
+ want_openssl_hash="$enableval", want_openssl_hash="no")
+case $want_openssl_hash in
+ yes)
+ if test "$USE_OPENSSL" = ""
+ then
+ AC_MSG_ERROR([No OpenSSL for hash functions])
+ fi
+ ISC_PLATFORM_OPENSSLHASH="#define ISC_PLATFORM_OPENSSLHASH 1"
+ ISC_OPENSSL_INC="$DST_OPENSSL_INC"
+ ;;
+ no)
+ ISC_PLATFORM_OPENSSLHASH="#undef ISC_PLATFORM_OPENSSLHASH"
+ ISC_OPENSSL_INC=""
+ ;;
+esac
+AC_SUBST(ISC_PLATFORM_OPENSSLHASH)
+AC_SUBST(ISC_OPENSSL_INC)
+
+#
# PKCS11 (aka crypto hardware) support
#
# This works only with the right OpenSSL with PKCS11 engine!
@@ -677,21 +761,37 @@ DNS_CRYPTO_LIBS="$DNS_CRYPTO_LIBS $DNS_OPENSSL_LIBS"
AC_MSG_CHECKING(for PKCS11 support)
AC_ARG_WITH(pkcs11,
-[ --with-pkcs11 Build with PKCS11 support],
- use_pkcs11="yes", use_pkcs11="no")
+[ --with-pkcs11[=PATH] Build with PKCS11 support [yes|no|path]
+ (PATH is for the PKCS11 provider)],
+ use_pkcs11="$withval", use_pkcs11="no")
case "$use_pkcs11" in
- no)
+ no|'')
AC_MSG_RESULT(disabled)
- USE_PKCS11=""
+ USE_PKCS11=''
+ PKCS11_TOOLS=''
;;
- yes)
+ yes|*)
AC_MSG_RESULT(using OpenSSL with PKCS11 support)
USE_PKCS11='-DUSE_PKCS11'
+ PKCS11_TOOLS=pkcs11
;;
esac
-
AC_SUBST(USE_PKCS11)
+AC_SUBST(PKCS11_TOOLS)
+
+AC_MSG_CHECKING(for PKCS11 tools)
+case "$use_pkcs11" in
+ no|yes|'')
+ AC_MSG_RESULT(disabled)
+ PKCS11_PROVIDER="undefined"
+ ;;
+ *)
+ AC_MSG_RESULT(PKCS11 provider is "$use_pkcs11")
+ PKCS11_PROVIDER="$use_pkcs11"
+ ;;
+esac
+AC_SUBST(PKCS11_PROVIDER)
AC_MSG_CHECKING(for GSSAPI library)
AC_ARG_WITH(gssapi,
@@ -731,6 +831,9 @@ case "$use_gssapi" in
AC_MSG_ERROR([gssapi.h not found])
fi
+ AC_CHECK_HEADERS(gssapi_krb5.h gssapi/gssapi_krb5.h,
+ [ISC_PLATFORM_GSSAPI_KRB5_HEADER="#define ISC_PLATFORM_GSSAPI_KRB5_HEADER <$ac_header>"])
+
AC_CHECK_HEADERS(krb5.h krb5/krb5.h kerberosv5/krb5.h,
[ISC_PLATFORM_KRB5HEADER="#define ISC_PLATFORM_KRB5HEADER <$ac_header>"])
@@ -775,7 +878,12 @@ case "$use_gssapi" in
# -L/usr/local/lib to LIBS, which can make the
# -lgssapi_krb5 test succeed with shared libraries even
# when you are trying to build with KTH in /usr/lib.
- LIBS="-L$use_gssapi/lib $TRY_LIBS"
+ if test "$use_gssapi" = "/usr"
+ then
+ LIBS="$TRY_LIBS"
+ else
+ LIBS="-L$use_gssapi/lib $TRY_LIBS"
+ fi
AC_MSG_CHECKING(linking as $TRY_LIBS)
AC_TRY_LINK( , [gss_acquire_cred();krb5_init_context()],
gssapi_linked=yes, gssapi_linked=no)
@@ -839,6 +947,7 @@ esac
AC_SUBST(ISC_PLATFORM_HAVEGSSAPI)
AC_SUBST(ISC_PLATFORM_GSSAPIHEADER)
+AC_SUBST(ISC_PLATFORM_GSSAPI_KRB5_HEADER)
AC_SUBST(ISC_PLATFORM_KRB5HEADER)
AC_SUBST(USE_GSSAPI)
@@ -1304,6 +1413,65 @@ case $use_libtool in
esac
#
+# enable/disable dumping stack backtrace. Also check if the system supports
+# glibc-compatible backtrace() function.
+#
+AC_ARG_ENABLE(backtrace,
+[ --enable-backtrace log stack backtrace on abort [[default=yes]]],
+ want_backtrace="$enableval", want_backtrace="yes")
+case $want_backtrace in
+yes)
+ ISC_PLATFORM_USEBACKTRACE="#define ISC_PLATFORM_USEBACKTRACE 1"
+ AC_TRY_LINK([#include <execinfo.h>],
+ [return (backtrace((void **)0, 0));],
+ [AC_DEFINE([HAVE_LIBCTRACE], [], [if system have backtrace function])],)
+ ;;
+*)
+ ISC_PLATFORM_USEBACKTRACE="#undef ISC_PLATFORM_USEBACKTRACE"
+ ;;
+esac
+AC_SUBST(ISC_PLATFORM_USEBACKTRACE)
+
+AC_ARG_ENABLE(symtable,
+[ --enable-symtable use internal symbol table for backtrace
+ [[all|minimal(default)|none]]],
+ want_symtable="$enableval", want_symtable="minimal")
+case $want_symtable in
+yes|all|minimal) # "yes" is a hidden value equivalent to "minimal"
+ if test "$PERL" = ""
+ then
+ AC_MSG_ERROR([Internal symbol table requires perl but no perl is found.
+Install perl or explicitly disable the feature by --disable-symtable.])
+ fi
+ if test "$use_libtool" = "yes"; then
+ AC_MSG_WARN([Internal symbol table does not work with libtool. Disabling symbol table.])
+ else
+ # we generate the internal symbol table only for those systems
+ # known to work to avoid unexpected build failure. Also, warn
+ # about unsupported systems when the feature is enabled
+ # manually.
+ case $host_os in
+ freebsd*|netbsd*|openbsd*|linux*|solaris*|darwin*)
+ MKSYMTBL_PROGRAM="$PERL"
+ if test $want_symtable = all; then
+ ALWAYS_MAKE_SYMTABLE="yes"
+ fi
+ ;;
+ *)
+ if test $want_symtable = yes -o $want_symtable = all
+ then
+ AC_MSG_WARN([this system is not known to generate internal symbol table safely; disabling it])
+ fi
+ esac
+ fi
+ ;;
+*)
+ ;;
+esac
+AC_SUBST(MKSYMTBL_PROGRAM)
+AC_SUBST(ALWAYS_MAKE_SYMTABLE)
+
+#
# File name extension for static archive files, for those few places
# where they are treated differently from dynamic ones.
#
@@ -1320,6 +1488,54 @@ AC_SUBST(LIBTOOL_ALLOW_UNDEFINED)
AC_SUBST(LIBTOOL_IN_MAIN)
#
+# build exportable DNS library?
+#
+AC_ARG_ENABLE(exportlib,
+ [ --enable-exportlib build exportable library (GNU make required)
+ [[default=no]]])
+case "$enable_exportlib" in
+ yes)
+ gmake=
+ for x in gmake gnumake make; do
+ if $x --version 2>/dev/null | grep GNU > /dev/null; then
+ gmake=$x
+ break;
+ fi
+ done
+ if test -z "$gmake"; then
+ AC_MSG_ERROR([exportlib requires GNU make. Install it or disable the feature.])
+ fi
+ LIBEXPORT=lib/export
+ AC_SUBST(LIBEXPORT)
+ BIND9_CO_RULE="%.$O: \${srcdir}/%.c"
+ ;;
+ no|*)
+ BIND9_CO_RULE=".c.$O:"
+ ;;
+esac
+AC_SUBST(BIND9_CO_RULE)
+
+AC_ARG_WITH(export-libdir,
+ [ --with-export-libdir[=PATH]
+ installation directory for the export library
+ [[EPREFIX/lib/bind9]]],
+ export_libdir="$withval",)
+if test -z "$export_libdir"; then
+ export_libdir="\${exec_prefix}/lib/bind9/"
+fi
+AC_SUBST(export_libdir)
+
+AC_ARG_WITH(export-includedir,
+ [ --with-export-includedir[=PATH]
+ installation directory for the header files of the
+ export library [[PREFIX/include/bind9]]],
+ export_includedir="$withval",)
+if test -z "$export_includedir"; then
+ export_includedir="\${prefix}/include/bind9/"
+fi
+AC_SUBST(export_includedir)
+
+#
# Here begins a very long section to determine the system's networking
# capabilities. The order of the tests is significant.
#
@@ -1703,10 +1919,13 @@ AC_TRY_COMPILE([
[struct addrinfo a; return (0);],
[AC_MSG_RESULT(yes)
ISC_LWRES_NEEDADDRINFO="#undef ISC_LWRES_NEEDADDRINFO"
+ ISC_IRS_NEEDADDRINFO="#undef ISC_IRS_NEEDADDRINFO"
AC_DEFINE(HAVE_ADDRINFO)],
[AC_MSG_RESULT(no)
- ISC_LWRES_NEEDADDRINFO="#define ISC_LWRES_NEEDADDRINFO 1"])
+ ISC_LWRES_NEEDADDRINFO="#define ISC_LWRES_NEEDADDRINFO 1"
+ ISC_IRS_NEEDADDRINFO="#define ISC_IRS_NEEDADDRINFO 1"])
AC_SUBST(ISC_LWRES_NEEDADDRINFO)
+AC_SUBST(ISC_IRS_NEEDADDRINFO)
#
# Check for rrsetinfo
@@ -1793,6 +2012,53 @@ AC_TRY_COMPILE([
ISC_LWRES_NEEDHERRNO="#define ISC_LWRES_NEEDHERRNO 1"])
AC_SUBST(ISC_LWRES_NEEDHERRNO)
+#
+# Sadly, the definitions of system-supplied getnameinfo(3) vary. Try to catch
+# known variations here:
+#
+AC_MSG_CHECKING(for getnameinfo prototype definitions)
+AC_TRY_COMPILE([
+#include <sys/types.h>
+#include <sys/socket.h>
+#include <netdb.h>
+int getnameinfo(const struct sockaddr *, socklen_t, char *,
+ socklen_t, char *, socklen_t, unsigned int);],
+[ return (0);],
+ [AC_MSG_RESULT(socklen_t for buflen; u_int for flags)
+ AC_DEFINE(IRS_GETNAMEINFO_BUFLEN_T, socklen_t,
+ [Define to the buffer length type used by getnameinfo(3).])
+ AC_DEFINE(IRS_GETNAMEINFO_FLAGS_T, unsigned int,
+ [Define to the flags type used by getnameinfo(3).])],
+[AC_TRY_COMPILE([
+#include <sys/types.h>
+#include <sys/socket.h>
+#include <netdb.h>
+int getnameinfo(const struct sockaddr *, socklen_t, char *,
+ size_t, char *, size_t, int);],
+[ return (0);],
+ [AC_MSG_RESULT(size_t for buflen; int for flags)
+ AC_DEFINE(IRS_GETNAMEINFO_BUFLEN_T, size_t)
+ AC_DEFINE(IRS_GETNAMEINFO_FLAGS_T, int)],
+[AC_MSG_RESULT(not match any subspecies; assume standard definition)
+AC_DEFINE(IRS_GETNAMEINFO_BUFLEN_T, socklen_t)
+AC_DEFINE(IRS_GETNAMEINFO_FLAGS_T, int)])])
+
+#
+# ...and same for gai_strerror().
+#
+AC_MSG_CHECKING(for gai_strerror prototype definitions)
+AC_TRY_COMPILE([
+#include <sys/types.h>
+#include <sys/socket.h>
+#include <netdb.h>
+char *gai_strerror(int ecode);],
+[ return (0); ],
+ [AC_MSG_RESULT(returning char *)
+ AC_DEFINE([IRS_GAISTRERROR_RETURN_T], [char *],
+ [return type of gai_strerror])],
+[AC_MSG_RESULT(not match any subspecies; assume standard definition)
+AC_DEFINE([IRS_GAISTRERROR_RETURN_T], [const char *])])
+
AC_CHECK_FUNC(getipnodebyname,
[ISC_LWRES_GETIPNODEPROTO="#undef ISC_LWRES_GETIPNODEPROTO"],
[ISC_LWRES_GETIPNODEPROTO="#define ISC_LWRES_GETIPNODEPROTO 1"])
@@ -1807,6 +2073,7 @@ AC_CHECK_FUNC(gai_strerror, AC_DEFINE(HAVE_GAISTRERROR))
AC_SUBST(ISC_LWRES_GETIPNODEPROTO)
AC_SUBST(ISC_LWRES_GETADDRINFOPROTO)
AC_SUBST(ISC_LWRES_GETNAMEINFOPROTO)
+AC_SUBST(ISC_IRS_GETNAMEINFOSOCKLEN)
AC_ARG_ENABLE(getifaddrs,
[ --enable-getifaddrs Enable the use of getifaddrs() [[yes|no]].],
@@ -2140,6 +2407,8 @@ AC_SUBST(ISC_PLATFORM_USEDECLSPEC)
ISC_PLATFORM_USEDECLSPEC="#undef ISC_PLATFORM_USEDECLSPEC"
AC_SUBST(LWRES_PLATFORM_USEDECLSPEC)
LWRES_PLATFORM_USEDECLSPEC="#undef LWRES_PLATFORM_USEDECLSPEC"
+AC_SUBST(IRS_PLATFORM_USEDECLSPEC)
+IRS_PLATFORM_USEDECLSPEC="#undef IRS_PLATFORM_USEDECLSPEC"
#
# Random remaining OS-specific issues involving compiler warnings.
@@ -2461,6 +2730,61 @@ case "$enable_fixed" in
esac
#
+# Enable response policy rewriting using NS IP addresses
+#
+AC_ARG_ENABLE(rpz-nsip,
+ [ --enable-rpz-nsip enable rpz-nsip rules [[default=no]]],
+ enable_nsip="$enableval",
+ enable_nsip="no")
+case "$enable_nsip" in
+ yes)
+ AC_DEFINE(ENABLE_RPZ_NSIP, 1,
+ [Define to enable rpz-nsip rules.])
+ ;;
+ no)
+ ;;
+ *)
+ ;;
+esac
+
+#
+# Enable response policy rewriting using NS name
+#
+AC_ARG_ENABLE(rpz-nsdname,
+ [ --enable-rpz-nsdname enable rpz-nsdname rules [[default=no]]],
+ enable_nsdname="$enableval",
+ enable_nsdname="no")
+case "$enable_nsdname" in
+ yes)
+ AC_DEFINE(ENABLE_RPZ_NSDNAME, 1,
+ [Define to enable rpz-nsdname rules.])
+ ;;
+ no)
+ ;;
+ *)
+ ;;
+esac
+
+#
+# Activate "filter-aaaa-on-v4" or not?
+#
+AC_ARG_ENABLE(filter-aaaa,
+ [ --enable-filter-aaaa enable filtering of AAAA records over IPv4
+ [[default=no]]],
+ enable_filter="$enableval",
+ enable_filter="no")
+case "$enable_filter" in
+ yes)
+ AC_DEFINE(ALLOW_FILTER_AAAA_ON_V4, 1,
+ [Define to enable the "filter-aaaa-on-v4" option.])
+ ;;
+ no)
+ ;;
+ *)
+ ;;
+esac
+
+#
# The following sets up how non-blocking i/o is established.
# Sunos, cygwin and solaris 2.x (x<5) require special handling.
#
@@ -2780,6 +3104,9 @@ LIBBIND9_API=$srcdir/lib/bind9/api
AC_SUBST_FILE(LIBLWRES_API)
LIBLWRES_API=$srcdir/lib/lwres/api
+AC_SUBST_FILE(LIBIRS_API)
+LIBIRS_API=$srcdir/lib/irs/api
+
#
# Configure any DLZ drivers.
#
@@ -2947,37 +3274,115 @@ AC_CONFIG_COMMANDS(
#
AC_CONFIG_FILES([
+ make/Makefile
+ make/mkdep
Makefile
- make/Makefile
- make/mkdep
+ bin/Makefile
+ bin/check/Makefile
+ bin/confgen/Makefile
+ bin/confgen/unix/Makefile
+ bin/dig/Makefile
+ bin/dnssec/Makefile
+ bin/named/Makefile
+ bin/named/unix/Makefile
+ bin/nsupdate/Makefile
+ bin/pkcs11/Makefile
+ bin/rndc/Makefile
+ bin/tests/Makefile
+ bin/tests/atomic/Makefile
+ bin/tests/db/Makefile
+ bin/tests/dst/Makefile
+ bin/tests/hashes/Makefile
+ bin/tests/headerdep_test.sh
+ bin/tests/master/Makefile
+ bin/tests/mem/Makefile
+ bin/tests/names/Makefile
+ bin/tests/net/Makefile
+ bin/tests/rbt/Makefile
+ bin/tests/resolver/Makefile
+ bin/tests/sockaddr/Makefile
+ bin/tests/system/Makefile
+ bin/tests/system/conf.sh
+ bin/tests/system/filter-aaaa/Makefile
+ bin/tests/system/gost/prereq.sh
+ bin/tests/system/lwresd/Makefile
+ bin/tests/system/rpz/Makefile
+ bin/tests/system/tkey/Makefile
+ bin/tests/tasks/Makefile
+ bin/tests/timers/Makefile
+ bin/tests/virtual-time/Makefile
+ bin/tests/virtual-time/conf.sh
+ bin/tools/Makefile
+ contrib/check-secure-delegation.pl
+ contrib/zone-edit.sh
+ doc/Makefile
+ doc/arm/Makefile
+ doc/doxygen/Doxyfile
+ doc/doxygen/Makefile
+ doc/doxygen/doxygen-input-filter
+ doc/misc/Makefile
+ doc/xsl/Makefile
+ doc/xsl/isc-docbook-chunk.xsl
+ doc/xsl/isc-docbook-html.xsl
+ doc/xsl/isc-docbook-latex.xsl
+ doc/xsl/isc-manpage.xsl
+ isc-config.sh
lib/Makefile
+ lib/bind9/Makefile
+ lib/bind9/include/Makefile
+ lib/bind9/include/bind9/Makefile
+ lib/dns/Makefile
+ lib/dns/include/Makefile
+ lib/dns/include/dns/Makefile
+ lib/dns/include/dst/Makefile
+ lib/export/Makefile
+ lib/export/dns/Makefile
+ lib/export/dns/include/Makefile
+ lib/export/dns/include/dns/Makefile
+ lib/export/dns/include/dst/Makefile
+ lib/export/irs/Makefile
+ lib/export/irs/include/Makefile
+ lib/export/irs/include/irs/Makefile
+ lib/export/isc/$thread_dir/Makefile
+ lib/export/isc/$thread_dir/include/Makefile
+ lib/export/isc/$thread_dir/include/isc/Makefile
+ lib/export/isc/Makefile
+ lib/export/isc/include/Makefile
+ lib/export/isc/include/isc/Makefile
+ lib/export/isc/nls/Makefile
+ lib/export/isc/unix/Makefile
+ lib/export/isc/unix/include/Makefile
+ lib/export/isc/unix/include/isc/Makefile
+ lib/export/isccfg/Makefile
+ lib/export/isccfg/include/Makefile
+ lib/export/isccfg/include/isccfg/Makefile
+ lib/export/samples/Makefile
+ lib/export/samples/Makefile-postinstall
+ lib/irs/Makefile
+ lib/irs/include/Makefile
+ lib/irs/include/irs/Makefile
+ lib/irs/include/irs/netdb.h
+ lib/irs/include/irs/platform.h
+ lib/isc/$arch/Makefile
+ lib/isc/$arch/include/Makefile
+ lib/isc/$arch/include/isc/Makefile
+ lib/isc/$thread_dir/Makefile
+ lib/isc/$thread_dir/include/Makefile
+ lib/isc/$thread_dir/include/isc/Makefile
lib/isc/Makefile
lib/isc/include/Makefile
lib/isc/include/isc/Makefile
lib/isc/include/isc/platform.h
+ lib/isc/nls/Makefile
lib/isc/unix/Makefile
lib/isc/unix/include/Makefile
lib/isc/unix/include/isc/Makefile
- lib/isc/nls/Makefile
- lib/isc/$thread_dir/Makefile
- lib/isc/$thread_dir/include/Makefile
- lib/isc/$thread_dir/include/isc/Makefile
- lib/isc/$arch/Makefile
- lib/isc/$arch/include/Makefile
- lib/isc/$arch/include/isc/Makefile
lib/isccc/Makefile
lib/isccc/include/Makefile
lib/isccc/include/isccc/Makefile
lib/isccfg/Makefile
lib/isccfg/include/Makefile
lib/isccfg/include/isccfg/Makefile
- lib/dns/Makefile
- lib/dns/include/Makefile
- lib/dns/include/dns/Makefile
- lib/dns/include/dst/Makefile
- lib/bind9/Makefile
- lib/bind9/include/Makefile
- lib/bind9/include/bind9/Makefile
lib/lwres/Makefile
lib/lwres/include/Makefile
lib/lwres/include/lwres/Makefile
@@ -2990,44 +3395,6 @@ AC_CONFIG_FILES([
lib/tests/Makefile
lib/tests/include/Makefile
lib/tests/include/tests/Makefile
- bin/Makefile
- bin/check/Makefile
- bin/named/Makefile
- bin/named/unix/Makefile
- bin/rndc/Makefile
- bin/rndc/unix/Makefile
- bin/dig/Makefile
- bin/nsupdate/Makefile
- bin/tests/Makefile
- bin/tests/names/Makefile
- bin/tests/master/Makefile
- bin/tests/rbt/Makefile
- bin/tests/db/Makefile
- bin/tests/tasks/Makefile
- bin/tests/timers/Makefile
- bin/tests/dst/Makefile
- bin/tests/mem/Makefile
- bin/tests/hashes/Makefile
- bin/tests/net/Makefile
- bin/tests/sockaddr/Makefile
- bin/tests/system/Makefile
- bin/tests/system/conf.sh
- bin/tests/system/lwresd/Makefile
- bin/tests/system/tkey/Makefile
- bin/tests/headerdep_test.sh
- bin/dnssec/Makefile
- doc/Makefile
- doc/arm/Makefile
- doc/misc/Makefile
- isc-config.sh
- doc/xsl/Makefile
- doc/xsl/isc-docbook-chunk.xsl
- doc/xsl/isc-docbook-html.xsl
- doc/xsl/isc-docbook-latex.xsl
- doc/xsl/isc-manpage.xsl
- doc/doxygen/Doxyfile
- doc/doxygen/Makefile
- doc/doxygen/doxygen-input-filter
])
#
diff --git a/contrib/bind9/doc/arm/Bv9ARM-book.xml b/contrib/bind9/doc/arm/Bv9ARM-book.xml
index 0013c2e..c351784 100644
--- a/contrib/bind9/doc/arm/Bv9ARM-book.xml
+++ b/contrib/bind9/doc/arm/Bv9ARM-book.xml
@@ -2,7 +2,7 @@
"http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd"
[<!ENTITY mdash "&#8212;">]>
<!--
- - Copyright (C) 2004-2010 Internet Systems Consortium, Inc. ("ISC")
+ - Copyright (C) 2004-2011 Internet Systems Consortium, Inc. ("ISC")
- Copyright (C) 2000-2003 Internet Software Consortium.
-
- Permission to use, copy, modify, and/or distribute this software for any
@@ -18,7 +18,7 @@
- PERFORMANCE OF THIS SOFTWARE.
-->
-<!-- File: $Id: Bv9ARM-book.xml,v 1.380.14.28 2010-08-20 01:38:26 marka Exp $ -->
+<!-- File: $Id: Bv9ARM-book.xml,v 1.478.8.2.2.1 2011-06-09 03:17:11 marka Exp $ -->
<book xmlns:xi="http://www.w3.org/2001/XInclude">
<title>BIND 9 Administrator Reference Manual</title>
@@ -31,6 +31,7 @@
<year>2008</year>
<year>2009</year>
<year>2010</year>
+ <year>2011</year>
<holder>Internet Systems Consortium, Inc. ("ISC")</holder>
</copyright>
<copyright>
@@ -69,7 +70,7 @@
</para>
<para>
- This version of the manual corresponds to BIND version 9.6.
+ This version of the manual corresponds to BIND version 9.7.
</para>
</sect1>
@@ -644,9 +645,9 @@
<para>
ISC <acronym>BIND</acronym> 9 compiles and runs on a large
number
- of Unix-like operating systems and on NT-derived versions of
- Microsoft Windows such as Windows 2000 and Windows XP. For an
- up-to-date
+ of Unix-like operating systems and on
+ Microsoft Windows Server 2003 and 2008, and Windows XP and Vista.
+ For an up-to-date
list of supported systems, see the README file in the top level
directory
of the BIND 9 source distribution.
@@ -680,10 +681,13 @@
// Two corporate subnets we wish to allow queries from.
acl corpnets { 192.168.4.0/24; 192.168.7.0/24; };
options {
- directory "/etc/namedb"; // Working directory
+ // Working directory
+ directory "/etc/namedb";
+
allow-query { corpnets; };
};
-// Provide a reverse mapping for the loopback address 127.0.0.1
+// Provide a reverse mapping for the loopback
+// address 127.0.0.1
zone "0.0.127.in-addr.arpa" {
type master;
file "localhost.rev";
@@ -703,13 +707,18 @@ zone "0.0.127.in-addr.arpa" {
<programlisting>
options {
- directory "/etc/namedb"; // Working directory
- allow-query-cache { none; }; // Do not allow access to cache
- allow-query { any; }; // This is the default
- recursion no; // Do not provide recursive service
+ // Working directory
+ directory "/etc/namedb";
+ // Do not allow access to cache
+ allow-query-cache { none; };
+ // This is the default
+ allow-query { any; };
+ // Do not provide recursive service
+ recursion no;
};
-// Provide a reverse mapping for the loopback address 127.0.0.1
+// Provide a reverse mapping for the loopback
+// address 127.0.0.1
zone "0.0.127.in-addr.arpa" {
type master;
file "localhost.rev";
@@ -719,7 +728,8 @@ zone "0.0.127.in-addr.arpa" {
zone "example.com" {
type master;
file "example.com.db";
- // IP addresses of slave servers allowed to transfer example.com
+ // IP addresses of slave servers allowed to
+ // transfer example.com
allow-transfer {
192.168.4.14;
192.168.5.53;
@@ -881,7 +891,7 @@ zone "eng.example.com" {
</para>
<para>
For more detail on ordering responses, check the
- <command>rrset-order</command> substatement in the
+ <command>rrset-order</command> sub-statement in the
<command>options</command> statement, see
<xref endterm="rrset_ordering_title" linkend="rrset_ordering"/>.
</para>
@@ -1162,7 +1172,62 @@ zone "eng.example.com" {
</varlistentry>
<varlistentry>
+ <term><userinput>sign <replaceable>zone</replaceable>
+ <optional><replaceable>class</replaceable>
+ <optional><replaceable>view</replaceable></optional></optional></userinput></term>
+ <listitem>
+ <para>
+ Fetch all DNSSEC keys for the given zone
+ from the key directory (see
+ <command>key-directory</command> in
+ <xref linkend="options"/>). If they are within
+ their publication period, merge them into the
+ zone's DNSKEY RRset. If the DNSKEY RRset
+ is changed, then the zone is automatically
+ re-signed with the new key set.
+ </para>
+ <para>
+ This command requires that the
+ <command>auto-dnssec</command> zone option to be set
+ to <literal>allow</literal>,
+ <literal>maintain</literal>, or
+ <literal>create</literal>, and also requires
+ the zone to be configured to allow dynamic DNS.
+ See <xref linkend="dynamic_update_policies"/> for
+ more details.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term><userinput>loadkeys <replaceable>zone</replaceable>
+ <optional><replaceable>class</replaceable>
+ <optional><replaceable>view</replaceable></optional></optional></userinput></term>
+ <listitem>
+ <para>
+ Fetch all DNSSEC keys for the given zone
+ from the key directory (see
+ <command>key-directory</command> in
+ <xref linkend="options"/>). If they are within
+ their publication period, merge them into the
+ zone's DNSKEY RRset. Unlike <command>rndc
+ sign</command>, however, the zone is not
+ immediately re-signed by the new keys, but is
+ allowed to incrementally re-sign over time.
+ </para>
+ <para>
+ This command requires that the
+ <command>auto-dnssec</command> zone option to
+ be set to <literal>maintain</literal> or
+ <literal>create</literal>, and also requires
+ the zone to be configured to allow dynamic DNS.
+ See <xref linkend="dynamic_update_policies"/> for
+ more details.
+ </para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
<term><userinput>freeze
<optional><replaceable>zone</replaceable>
<optional><replaceable>class</replaceable>
@@ -1271,6 +1336,19 @@ zone "eng.example.com" {
</varlistentry>
<varlistentry>
+ <term><userinput>secroots
+ <optional><replaceable>view ...</replaceable></optional></userinput></term>
+ <listitem>
+ <para>
+ Dump the server's security roots to the secroots
+ file for the specified views. If no view is
+ specified, security roots for all
+ views are dumped.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
<term><userinput>stop <optional>-p</optional></userinput></term>
<listitem>
<para>
@@ -1383,6 +1461,65 @@ zone "eng.example.com" {
</listitem>
</varlistentry>
+ <varlistentry>
+ <term><userinput>addzone
+ <replaceable>zone</replaceable>
+ <optional><replaceable>class</replaceable>
+ <optional><replaceable>view</replaceable></optional></optional>
+ <replaceable>configuration</replaceable>
+ </userinput></term>
+ <listitem>
+ <para>
+ Add a zone while the server is running. This
+ command requires the
+ <command>allow-new-zones</command> option to be set
+ to <userinput>yes</userinput>. The
+ <replaceable>configuration</replaceable> string
+ specified on the command line is the zone
+ configuration text that would ordinarily be
+ placed in <filename>named.conf</filename>.
+ </para>
+ <para>
+ The configuration is saved in a file called
+ <filename><replaceable>hash</replaceable>.nzf</filename>,
+ where <replaceable>hash</replaceable> is a
+ cryptographic hash generated from the name of
+ the view. When <command>named</command> is
+ restarted, the file will be loaded into the view
+ configuration, so that zones that were added
+ can persist after a restart.
+ </para>
+ <para>
+ This sample <command>addzone</command> command
+ would add the zone <literal>example.com</literal>
+ to the default view:
+ </para>
+ <para>
+<prompt>$ </prompt><userinput>rndc addzone example.com '{ type master; file "example.com.db"; };'</userinput>
+ </para>
+ <para>
+ (Note the brackets and semi-colon around the zone
+ configuration text.)
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term><userinput>delzone
+ <replaceable>zone</replaceable>
+ <optional><replaceable>class</replaceable>
+ <optional><replaceable>view</replaceable></optional></optional>
+ </userinput></term>
+ <listitem>
+ <para>
+ Delete a zone while the server is running.
+ Only zones that were originally added via
+ <command>rndc addzone</command> can be deleted
+ in this matter.
+ </para>
+ </listitem>
+ </varlistentry>
+
</variablelist>
<para>
@@ -1488,7 +1625,8 @@ zone "eng.example.com" {
<programlisting>
key rndc_key {
algorithm "hmac-md5";
- secret "c3Ryb25nIGVub3VnaCBmb3IgYSBtYW4gYnV0IG1hZGUgZm9yIGEgd29tYW4K";
+ secret
+ "c3Ryb25nIGVub3VnaCBmb3IgYSBtYW4gYnV0IG1hZGUgZm9yIGEgd29tYW4K";
};
options {
default-server 127.0.0.1;
@@ -1514,7 +1652,8 @@ options {
<programlisting>
controls {
- inet 127.0.0.1 allow { localhost; } keys { rndc_key; };
+ inet 127.0.0.1
+ allow { localhost; } keys { rndc_key; };
};
</programlisting>
@@ -1641,14 +1780,27 @@ controls {
<para>
Dynamic update is enabled by including an
- <command>allow-update</command> or <command>update-policy</command>
- clause in the <command>zone</command> statement. The
- <command>tkey-gssapi-credential</command> and
- <command>tkey-domain</command> clauses in the
- <command>options</command> statement enable the
- server to negotiate keys that can be matched against those
- in <command>update-policy</command> or
- <command>allow-update</command>.
+ <command>allow-update</command> or an <command>update-policy</command>
+ clause in the <command>zone</command> statement.
+ </para>
+
+ <para>
+ If the zone's <command>update-policy</command> is set to
+ <userinput>local</userinput>, updates to the zone
+ will be permitted for the key <varname>local-ddns</varname>,
+ which will be generated by <command>named</command> at startup.
+ See <xref linkend="dynamic_update_policies"/> for more details.
+ </para>
+
+ <para>
+ Dynamic updates using Kerberos signed requests can be made
+ using the TKEY/GSS protocol by setting either the
+ <command>tkey-gssapi-keytab</command> option, or alternatively
+ by setting both the <command>tkey-gssapi-credential</command>
+ and <command>tkey-domain</command> options. Once enabled,
+ Kerberos signed requests will be matched against the update
+ policies for the zone, using the Kerberos principal as the
+ signer for the request.
</para>
<para>
@@ -1660,7 +1812,7 @@ controls {
</para>
<sect2 id="journal">
- <title>The journal file</title>
+ <title>The journal file</title>
<para>
All changes made to a zone using dynamic update are stored
@@ -1814,7 +1966,7 @@ controls {
and <filename>site2.example.com</filename>, to the servers
in the
DMZ. These internal servers will have complete sets of information
- for <filename>site1.example.com</filename>, <filename>site2.example.com</filename>,<emphasis/> <filename>site1.internal</filename>,
+ for <filename>site1.example.com</filename>, <filename>site2.example.com</filename>, <filename>site1.internal</filename>,
and <filename>site2.internal</filename>.
</para>
<para>
@@ -1927,26 +2079,32 @@ options {
...
...
forward only;
- forwarders { // forward to external servers
+ // forward to external servers
+ forwarders {
<varname>bastion-ips-go-here</varname>;
};
- allow-transfer { none; }; // sample allow-transfer (no one)
- allow-query { internals; externals; }; // restrict query access
- allow-recursion { internals; }; // restrict recursion
+ // sample allow-transfer (no one)
+ allow-transfer { none; };
+ // restrict query access
+ allow-query { internals; externals; };
+ // restrict recursion
+ allow-recursion { internals; };
...
...
};
-zone "site1.example.com" { // sample master zone
+// sample master zone
+zone "site1.example.com" {
type master;
file "m/site1.example.com";
- forwarders { }; // do normal iterative
- // resolution (do not forward)
+ // do normal iterative resolution (do not forward)
+ forwarders { };
allow-query { internals; externals; };
allow-transfer { internals; };
};
-zone "site2.example.com" { // sample slave zone
+// sample slave zone
+zone "site2.example.com" {
type slave;
file "s/site2.example.com";
masters { 172.16.72.3; };
@@ -1985,15 +2143,20 @@ acl externals { bastion-ips-go-here; };
options {
...
...
- allow-transfer { none; }; // sample allow-transfer (no one)
- allow-query { any; }; // default query access
- allow-query-cache { internals; externals; }; // restrict cache access
- allow-recursion { internals; externals; }; // restrict recursion
+ // sample allow-transfer (no one)
+ allow-transfer { none; };
+ // default query access
+ allow-query { any; };
+ // restrict cache access
+ allow-query-cache { internals; externals; };
+ // restrict recursion
+ allow-recursion { internals; externals; };
...
...
};
-zone "site1.example.com" { // sample slave zone
+// sample slave zone
+zone "site1.example.com" {
type master;
file "m/site1.foo.com";
allow-transfer { internals; externals; };
@@ -2187,9 +2350,8 @@ allow-update { key host1-host2. ;};
</para>
<para>
- You may want to read about the more powerful
- <command>update-policy</command> statement in
- <xref linkend="dynamic_update_policies"/>.
+ See <xref linkend="dynamic_update_policies"/> for a discussion of
+ the more flexible <command>update-policy</command> statement.
</para>
</sect2>
@@ -2453,12 +2615,23 @@ allow-update { key host1-host2. ;};
<para>
To enable <command>named</command> to validate answers from
- other servers, the <command>dnssec-enable</command> and
- <command>dnssec-validation</command> options must both be
- set to yes (the default setting in <acronym>BIND</acronym> 9.5
- and later), and at least one trust anchor must be configured
- with a <command>trusted-keys</command> statement in
- <filename>named.conf</filename>.
+ other servers, the <command>dnssec-enable</command> option
+ must be set to <userinput>yes</userinput>, and the
+ <command>dnssec-validation</command> options must be set to
+ <userinput>yes</userinput> or <userinput>auto</userinput>.
+ </para>
+
+ <para>
+ If <command>dnssec-validation</command> is set to
+ <userinput>auto</userinput>, then a default
+ trust anchor for the DNS root zone will be used.
+ If it is set to <userinput>yes</userinput>, however,
+ then at least one trust anchor must be configured
+ with a <command>trusted-keys</command> or
+ <command>managed-keys</command> statement in
+ <filename>named.conf</filename>, or DNSSEC validation
+ will not occur. The default setting is
+ <userinput>yes</userinput>.
</para>
<para>
@@ -2471,7 +2644,14 @@ allow-update { key host1-host2. ;};
</para>
<para>
- <command>trusted-keys</command> are described in more detail
+ <command>managed-keys</command> are trusted keys which are
+ automatically kept up to date via RFC 5011 trust anchor
+ maintenance.
+ </para>
+
+ <para>
+ <command>trusted-keys</command> and
+ <command>managed-keys</command> are described in more detail
later in this document.
</para>
@@ -2484,45 +2664,59 @@ allow-update { key host1-host2. ;};
<para>
After DNSSEC gets established, a typical DNSSEC configuration
- will look something like the following. It has a one or
+ will look something like the following. It has one or
more public keys for the root. This allows answers from
outside the organization to be validated. It will also
have several keys for parts of the namespace the organization
- controls. These are here to ensure that <command>named</command> is immune
- to compromises in the DNSSEC components of the security
- of parent zones.
+ controls. These are here to ensure that <command>named</command>
+ is immune to compromises in the DNSSEC components of the security
+ of parent zones.
</para>
<programlisting>
-trusted-keys {
-
+managed-keys {
/* Root Key */
-"." 257 3 3 "BNY4wrWM1nCfJ+CXd0rVXyYmobt7sEEfK3clRbGaTwSJxrGkxJWoZu6I7PzJu/
- E9gx4UC1zGAHlXKdE4zYIpRhaBKnvcC2U9mZhkdUpd1Vso/HAdjNe8LmMlnzY3
- zy2Xy4klWOADTPzSv9eamj8V18PHGjBLaVtYvk/ln5ZApjYghf+6fElrmLkdaz
- MQ2OCnACR817DF4BBa7UR/beDHyp5iWTXWSi6XmoJLbG9Scqc7l70KDqlvXR3M
- /lUUVRbkeg1IPJSidmK3ZyCllh4XSKbje/45SKucHgnwU5jefMtq66gKodQj+M
- iA21AfUVe7u99WzTLzY3qlxDhxYQQ20FQ97S+LKUTpQcq27R7AT3/V5hRQxScI
- Nqwcz4jYqZD2fQdgxbcDTClU0CRBdiieyLMNzXG3";
-
-/* Key for our organization's forward zone */
-example.com. 257 3 5 "AwEAAaxPMcR2x0HbQV4WeZB6oEDX+r0QM65KbhTjrW1ZaARmPhEZZe
- 3Y9ifgEuq7vZ/zGZUdEGNWy+JZzus0lUptwgjGwhUS1558Hb4JKUbb
- OTcM8pwXlj0EiX3oDFVmjHO444gLkBO UKUf/mC7HvfwYH/Be22GnC
- lrinKJp1Og4ywzO9WglMk7jbfW33gUKvirTHr25GL7STQUzBb5Usxt
- 8lgnyTUHs1t3JwCY5hKZ6CqFxmAVZP20igTixin/1LcrgX/KMEGd/b
- iuvF4qJCyduieHukuY3H4XMAcR+xia2 nIUPvm/oyWR8BW/hWdzOvn
- SCThlHf3xiYleDbt/o1OTQ09A0=";
-
-/* Key for our reverse zone. */
-2.0.192.IN-ADDRPA.NET. 257 3 5 "AQOnS4xn/IgOUpBPJ3bogzwcxOdNax071L18QqZnQQQA
- VVr+iLhGTnNGp3HoWQLUIzKrJVZ3zggy3WwNT6kZo6c0
- tszYqbtvchmgQC8CzKojM/W16i6MG/ea fGU3siaOdS0
- yOI6BgPsw+YZdzlYMaIJGf4M4dyoKIhzdZyQ2bYQrjyQ
- 4LB0lC7aOnsMyYKHHYeRv PxjIQXmdqgOJGq+vsevG06
- zW+1xgYJh9rCIfnm1GX/KMgxLPG2vXTD/RnLX+D3T3UL
- 7HJYHJhAZD5L59VvjSPsZJHeDCUyWYrvPZesZDIRvhDD
- 52SKvbheeTJUm6EhkzytNN2SN96QRk8j/iI8ib";
+ "." initial-key 257 3 3 "BNY4wrWM1nCfJ+CXd0rVXyYmobt7sEEfK3clRbGaTwS
+ JxrGkxJWoZu6I7PzJu/E9gx4UC1zGAHlXKdE4zYIpRh
+ aBKnvcC2U9mZhkdUpd1Vso/HAdjNe8LmMlnzY3zy2Xy
+ 4klWOADTPzSv9eamj8V18PHGjBLaVtYvk/ln5ZApjYg
+ hf+6fElrmLkdaz MQ2OCnACR817DF4BBa7UR/beDHyp
+ 5iWTXWSi6XmoJLbG9Scqc7l70KDqlvXR3M/lUUVRbke
+ g1IPJSidmK3ZyCllh4XSKbje/45SKucHgnwU5jefMtq
+ 66gKodQj+MiA21AfUVe7u99WzTLzY3qlxDhxYQQ20FQ
+ 97S+LKUTpQcq27R7AT3/V5hRQxScINqwcz4jYqZD2fQ
+ dgxbcDTClU0CRBdiieyLMNzXG3";
+};
+
+trusted-keys {
+ /* Key for our organization's forward zone */
+ example.com. 257 3 5 "AwEAAaxPMcR2x0HbQV4WeZB6oEDX+r0QM6
+ 5KbhTjrW1ZaARmPhEZZe3Y9ifgEuq7vZ/z
+ GZUdEGNWy+JZzus0lUptwgjGwhUS1558Hb
+ 4JKUbbOTcM8pwXlj0EiX3oDFVmjHO444gL
+ kBOUKUf/mC7HvfwYH/Be22GnClrinKJp1O
+ g4ywzO9WglMk7jbfW33gUKvirTHr25GL7S
+ TQUzBb5Usxt8lgnyTUHs1t3JwCY5hKZ6Cq
+ FxmAVZP20igTixin/1LcrgX/KMEGd/biuv
+ F4qJCyduieHukuY3H4XMAcR+xia2nIUPvm
+ /oyWR8BW/hWdzOvnSCThlHf3xiYleDbt/o
+ 1OTQ09A0=";
+
+ /* Key for our reverse zone. */
+ 2.0.192.IN-ADDRPA.NET. 257 3 5 "AQOnS4xn/IgOUpBPJ3bogzwc
+ xOdNax071L18QqZnQQQAVVr+i
+ LhGTnNGp3HoWQLUIzKrJVZ3zg
+ gy3WwNT6kZo6c0tszYqbtvchm
+ gQC8CzKojM/W16i6MG/eafGU3
+ siaOdS0yOI6BgPsw+YZdzlYMa
+ IJGf4M4dyoKIhzdZyQ2bYQrjy
+ Q4LB0lC7aOnsMyYKHHYeRvPxj
+ IQXmdqgOJGq+vsevG06zW+1xg
+ YJh9rCIfnm1GX/KMgxLPG2vXT
+ D/RnLX+D3T3UL7HJYHJhAZD5L
+ 59VvjSPsZJHeDCUyWYrvPZesZ
+ DIRvhDD52SKvbheeTJUm6Ehkz
+ ytNN2SN96QRk8j/iI8ib";
};
options {
@@ -2575,6 +2769,13 @@ options {
</sect2>
</sect1>
+
+ <xi:include href="dnssec.xml"/>
+
+ <xi:include href="managed-keys.xml"/>
+
+ <xi:include href="pkcs11.xml"/>
+
<sect1>
<title>IPv6 Support in <acronym>BIND</acronym> 9</title>
@@ -2653,7 +2854,8 @@ host 3600 IN AAAA 2001:db8::1
<programlisting>
$ORIGIN 0.0.0.0.0.0.0.0.8.b.d.0.1.0.0.2.ip6.arpa.
-1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0 14400 IN PTR host.example.com.
+1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0 14400 IN PTR (
+ host.example.com. )
</programlisting>
</sect2>
@@ -2831,6 +3033,19 @@ $ORIGIN 0.0.0.0.0.0.0.0.8.b.d.0.1.0.0.2.ip6.arpa.
<row rowsep="0">
<entry colname="1">
<para>
+ <varname>namelist</varname>
+ </para>
+ </entry>
+ <entry colname="2">
+ <para>
+ A list of one or more <varname>domain_name</varname>
+ elements.
+ </para>
+ </entry>
+ </row>
+ <row rowsep="0">
+ <entry colname="1">
+ <para>
<varname>dotted_decimal</varname>
</para>
</entry>
@@ -3224,7 +3439,8 @@ $ORIGIN 0.0.0.0.0.0.0.0.8.b.d.0.1.0.0.2.ip6.arpa.
<para>
<programlisting>/* This is a <acronym>BIND</acronym> comment as in C */</programlisting>
<programlisting>// This is a <acronym>BIND</acronym> comment as in C++</programlisting>
- <programlisting># This is a <acronym>BIND</acronym> comment as in common UNIX shells and perl</programlisting>
+ <programlisting># This is a <acronym>BIND</acronym> comment as in common UNIX shells
+# and perl</programlisting>
</para>
</sect3>
<sect3>
@@ -3439,6 +3655,17 @@ $ORIGIN 0.0.0.0.0.0.0.0.8.b.d.0.1.0.0.2.ip6.arpa.
</row>
<row rowsep="0">
<entry colname="1">
+ <para><command>managed-keys</command></para>
+ </entry>
+ <entry colname="2">
+ <para>
+ lists DNSSEC keys to be kept up to date
+ using RFC 5011 trust anchor maintenance.
+ </para>
+ </entry>
+ </row>
+ <row rowsep="0">
+ <entry colname="1">
<para><command>view</command></para>
</entry>
<entry colname="2">
@@ -3559,10 +3786,12 @@ $ORIGIN 0.0.0.0.0.0.0.0.8.b.d.0.1.0.0.2.ip6.arpa.
<title><command>controls</command> Statement Grammar</title>
<programlisting><command>controls</command> {
- [ inet ( ip_addr | * ) [ port ip_port ] allow { <replaceable> address_match_list </replaceable> }
+ [ inet ( ip_addr | * ) [ port ip_port ]
+ allow { <replaceable> address_match_list </replaceable> }
keys { <replaceable>key_list</replaceable> }; ]
[ inet ...; ]
- [ unix <replaceable>path</replaceable> perm <replaceable>number</replaceable> owner <replaceable>number</replaceable> group <replaceable>number</replaceable> keys { <replaceable>key_list</replaceable> }; ]
+ [ unix <replaceable>path</replaceable> perm <replaceable>number</replaceable> owner <replaceable>number</replaceable> group <replaceable>number</replaceable>
+ keys { <replaceable>key_list</replaceable> }; ]
[ unix ...; ]
};
</programlisting>
@@ -4031,32 +4260,30 @@ notrace</command>. All debugging messages in the server have a debug
</para>
<programlisting>channel default_syslog {
- syslog daemon; // send to syslog's daemon
- // facility
- severity info; // only send priority info
- // and higher
-};
+ // send to syslog's daemon facility
+ syslog daemon;
+ // only send priority info and higher
+ severity info;
channel default_debug {
- file "named.run"; // write to named.run in
- // the working directory
- // Note: stderr is used instead
- // of "named.run"
- // if the server is started
- // with the '-f' option.
- severity dynamic; // log at the server's
- // current debug level
+ // write to named.run in the working directory
+ // Note: stderr is used instead of "named.run" if
+ // the server is started with the '-f' option.
+ file "named.run";
+ // log at the server's current debug level
+ severity dynamic;
};
channel default_stderr {
- stderr; // writes to stderr
- severity info; // only send priority info
- // and higher
+ // writes to stderr
+ stderr;
+ // only send priority info and higher
+ severity info;
};
channel null {
- null; // toss anything sent to
- // this channel
+ // toss anything sent to this channel
+ null;
};
</programlisting>
@@ -4308,12 +4535,14 @@ category notify { null; };
<para>
The query log entry reports the client's IP
address and port number, and the query name,
- class and type. It also reports whether the
+ class and type. Next it reports whether the
Recursion Desired flag was set (+ if set, -
if not set), if the query was signed (S),
- EDNS was in use (E), if DO (DNSSEC Ok) was
- set (D), or if CD (Checking Disabled) was set
- (C).
+ EDNS was in use (E), if TCP was used (T), if
+ DO (DNSSEC Ok) was set (D), or if CD (Checking
+ Disabled) was set (C). After this the
+ destination address the query was sent to is
+ reported.
</para>
<para>
@@ -4453,7 +4682,13 @@ category notify { null; };
The log message will look like as follows:
</para>
<para>
- <computeroutput>fetch completed at resolver.c:2970 for www.example.com/A in 30.000183: timed out/success [domain:example.com,referral:2,restart:7,qrysent:8,timeout:5,lame:0,neterr:0,badresp:1,adberr:0,findfail:0,valfail:0]</computeroutput>
+<!-- NOTE: newlines and some spaces added so this would fit on page -->
+ <programlisting>
+fetch completed at resolver.c:2970 for www.example.com/A
+in 30.000183: timed out/success [domain:example.com,
+referral:2,restart:7,qrysent:8,timeout:5,lame:0,neterr:0,
+badresp:1,adberr:0,findfail:0,valfail:0]
+ </programlisting>
</para>
<para>
The first part before the colon shows that a recursive
@@ -4485,8 +4720,8 @@ category notify { null; };
<informaltable colsep="0" rowsep="0">
<tgroup cols="2" colsep="0" rowsep="0" tgroupstyle="4Level-table">
- <colspec colname="1" colnum="1" colsep="0" />
- <colspec colname="2" colnum="2" colsep="0" />
+ <colspec colname="1" colnum="1" colsep="0" colwidth="1.150in"/>
+ <colspec colname="2" colnum="2" colsep="0" colwidth="3.350in"/>
<tbody>
<row rowsep="0">
<entry colname="1">
@@ -4651,7 +4886,8 @@ category notify { null; };
</para>
<programlisting><command>lwres</command> {
- <optional> listen-on { <replaceable>ip_addr</replaceable> <optional>port <replaceable>ip_port</replaceable></optional> ; <optional> <replaceable>ip_addr</replaceable> <optional>port <replaceable>ip_port</replaceable></optional> ; ... </optional> }; </optional>
+ <optional> listen-on { <replaceable>ip_addr</replaceable> <optional>port <replaceable>ip_port</replaceable></optional> ;
+ <optional> <replaceable>ip_addr</replaceable> <optional>port <replaceable>ip_port</replaceable></optional> ; ... </optional> }; </optional>
<optional> view <replaceable>view_name</replaceable>; </optional>
<optional> search { <replaceable>domain_name</replaceable> ; <optional> <replaceable>domain_name</replaceable> ; ... </optional> }; </optional>
<optional> ndots <replaceable>number</replaceable>; </optional>
@@ -4718,7 +4954,8 @@ category notify { null; };
<title><command>masters</command> Statement Grammar</title>
<programlisting>
-<command>masters</command> <replaceable>name</replaceable> <optional>port <replaceable>ip_port</replaceable></optional> { ( <replaceable>masters_list</replaceable> | <replaceable>ip_addr</replaceable> <optional>port <replaceable>ip_port</replaceable></optional> <optional>key <replaceable>key</replaceable></optional> ) ; <optional>...</optional> };
+<command>masters</command> <replaceable>name</replaceable> <optional>port <replaceable>ip_port</replaceable></optional> { ( <replaceable>masters_list</replaceable> |
+ <replaceable>ip_addr</replaceable> <optional>port <replaceable>ip_port</replaceable></optional> <optional>key <replaceable>key</replaceable></optional> ) ; <optional>...</optional> };
</programlisting>
</sect2>
@@ -4741,17 +4978,21 @@ category notify { null; };
</para>
<programlisting><command>options</command> {
+ <optional> attach-cache <replaceable>cache_name</replaceable>; </optional>
<optional> version <replaceable>version_string</replaceable>; </optional>
<optional> hostname <replaceable>hostname_string</replaceable>; </optional>
<optional> server-id <replaceable>server_id_string</replaceable>; </optional>
<optional> directory <replaceable>path_name</replaceable>; </optional>
<optional> key-directory <replaceable>path_name</replaceable>; </optional>
+ <optional> managed-keys-directory <replaceable>path_name</replaceable>; </optional>
<optional> named-xfer <replaceable>path_name</replaceable>; </optional>
+ <optional> tkey-gssapi-keytab <replaceable>path_name</replaceable>; </optional>
<optional> tkey-gssapi-credential <replaceable>principal</replaceable>; </optional>
<optional> tkey-domain <replaceable>domainname</replaceable>; </optional>
<optional> tkey-dhkey <replaceable>key_name</replaceable> <replaceable>key_tag</replaceable>; </optional>
<optional> cache-file <replaceable>path_name</replaceable>; </optional>
<optional> dump-file <replaceable>path_name</replaceable>; </optional>
+ <optional> bindkeys-file <replaceable>path_name</replaceable>; </optional>
<optional> memstatistics <replaceable>yes_or_no</replaceable>; </optional>
<optional> memstatistics-file <replaceable>path_name</replaceable>; </optional>
<optional> pid-file <replaceable>path_name</replaceable>; </optional>
@@ -4776,8 +5017,9 @@ category notify { null; };
<optional> maintain-ixfr-base <replaceable>yes_or_no</replaceable>; </optional>
<optional> ixfr-from-differences (<replaceable>yes_or_no</replaceable> | <constant>master</constant> | <constant>slave</constant>); </optional>
<optional> dnssec-enable <replaceable>yes_or_no</replaceable>; </optional>
- <optional> dnssec-validation <replaceable>yes_or_no</replaceable>; </optional>
- <optional> dnssec-lookaside <replaceable>domain</replaceable> trust-anchor <replaceable>domain</replaceable>; </optional>
+ <optional> dnssec-validation (<replaceable>yes_or_no</replaceable> | <constant>auto</constant>); </optional>
+ <optional> dnssec-lookaside ( <replaceable>auto</replaceable> |
+ <replaceable>domain</replaceable> trust-anchor <replaceable>domain</replaceable> ); </optional>
<optional> dnssec-must-be-secure <replaceable>domain yes_or_no</replaceable>; </optional>
<optional> dnssec-accept-expired <replaceable>yes_or_no</replaceable>; </optional>
<optional> forward ( <replaceable>only</replaceable> | <replaceable>first</replaceable> ); </optional>
@@ -4788,12 +5030,14 @@ category notify { null; };
... }; </optional>
<optional> check-names ( <replaceable>master</replaceable> | <replaceable>slave</replaceable> | <replaceable>response</replaceable> )
( <replaceable>warn</replaceable> | <replaceable>fail</replaceable> | <replaceable>ignore</replaceable> ); </optional>
+ <optional> check-dup-records ( <replaceable>warn</replaceable> | <replaceable>fail</replaceable> | <replaceable>ignore</replaceable> ); </optional>
<optional> check-mx ( <replaceable>warn</replaceable> | <replaceable>fail</replaceable> | <replaceable>ignore</replaceable> ); </optional>
<optional> check-wildcard <replaceable>yes_or_no</replaceable>; </optional>
<optional> check-integrity <replaceable>yes_or_no</replaceable>; </optional>
<optional> check-mx-cname ( <replaceable>warn</replaceable> | <replaceable>fail</replaceable> | <replaceable>ignore</replaceable> ); </optional>
<optional> check-srv-cname ( <replaceable>warn</replaceable> | <replaceable>fail</replaceable> | <replaceable>ignore</replaceable> ); </optional>
<optional> check-sibling <replaceable>yes_or_no</replaceable>; </optional>
+ <optional> allow-new-zones { <replaceable>yes_or_no</replaceable> }; </optional>
<optional> allow-notify { <replaceable>address_match_list</replaceable> }; </optional>
<optional> allow-query { <replaceable>address_match_list</replaceable> }; </optional>
<optional> allow-query-on { <replaceable>address_match_list</replaceable> }; </optional>
@@ -4805,6 +5049,8 @@ category notify { null; };
<optional> allow-update { <replaceable>address_match_list</replaceable> }; </optional>
<optional> allow-update-forwarding { <replaceable>address_match_list</replaceable> }; </optional>
<optional> update-check-ksk <replaceable>yes_or_no</replaceable>; </optional>
+ <optional> dnssec-dnskey-kskonly <replaceable>yes_or_no</replaceable>; </optional>
+ <optional> dnssec-secure-to-insecure <replaceable>yes_or_no</replaceable> ;</optional>
<optional> try-tcp-refresh <replaceable>yes_or_no</replaceable>; </optional>
<optional> allow-v6-synthesis { <replaceable>address_match_list</replaceable> }; </optional>
<optional> blackhole { <replaceable>address_match_list</replaceable> }; </optional>
@@ -4816,12 +5062,12 @@ category notify { null; };
<optional> listen-on-v6 <optional> port <replaceable>ip_port</replaceable> </optional> { <replaceable>address_match_list</replaceable> }; </optional>
<optional> query-source ( ( <replaceable>ip4_addr</replaceable> | <replaceable>*</replaceable> )
<optional> port ( <replaceable>ip_port</replaceable> | <replaceable>*</replaceable> ) </optional> |
- <optional> address ( <replaceable>ip4_addr</replaceable> | <replaceable>*</replaceable> ) </optional>
- <optional> port ( <replaceable>ip_port</replaceable> | <replaceable>*</replaceable> ) </optional> ) ; </optional>
+ <optional> address ( <replaceable>ip4_addr</replaceable> | <replaceable>*</replaceable> ) </optional>
+ <optional> port ( <replaceable>ip_port</replaceable> | <replaceable>*</replaceable> ) </optional> ) ; </optional>
<optional> query-source-v6 ( ( <replaceable>ip6_addr</replaceable> | <replaceable>*</replaceable> )
- <optional> port ( <replaceable>ip_port</replaceable> | <replaceable>*</replaceable> ) </optional> |
- <optional> address ( <replaceable>ip6_addr</replaceable> | <replaceable>*</replaceable> ) </optional>
- <optional> port ( <replaceable>ip_port</replaceable> | <replaceable>*</replaceable> ) </optional> ) ; </optional>
+ <optional> port ( <replaceable>ip_port</replaceable> | <replaceable>*</replaceable> ) </optional> |
+ <optional> address ( <replaceable>ip6_addr</replaceable> | <replaceable>*</replaceable> ) </optional>
+ <optional> port ( <replaceable>ip_port</replaceable> | <replaceable>*</replaceable> ) </optional> ) ; </optional>
<optional> use-queryport-pool <replaceable>yes_or_no</replaceable>; </optional>
<optional> queryport-pool-ports <replaceable>number</replaceable>; </optional>
<optional> queryport-pool-updateinterval <replaceable>number</replaceable>; </optional>
@@ -4842,13 +5088,15 @@ category notify { null; };
<optional> transfer-source (<replaceable>ip4_addr</replaceable> | <constant>*</constant>) <optional>port <replaceable>ip_port</replaceable></optional> ; </optional>
<optional> transfer-source-v6 (<replaceable>ip6_addr</replaceable> | <constant>*</constant>) <optional>port <replaceable>ip_port</replaceable></optional> ; </optional>
<optional> alt-transfer-source (<replaceable>ip4_addr</replaceable> | <constant>*</constant>) <optional>port <replaceable>ip_port</replaceable></optional> ; </optional>
- <optional> alt-transfer-source-v6 (<replaceable>ip6_addr</replaceable> | <constant>*</constant>) <optional>port <replaceable>ip_port</replaceable></optional> ; </optional>
+ <optional> alt-transfer-source-v6 (<replaceable>ip6_addr</replaceable> | <constant>*</constant>)
+ <optional>port <replaceable>ip_port</replaceable></optional> ; </optional>
<optional> use-alt-transfer-source <replaceable>yes_or_no</replaceable>; </optional>
<optional> notify-delay <replaceable>seconds</replaceable> ; </optional>
<optional> notify-source (<replaceable>ip4_addr</replaceable> | <constant>*</constant>) <optional>port <replaceable>ip_port</replaceable></optional> ; </optional>
<optional> notify-source-v6 (<replaceable>ip6_addr</replaceable> | <constant>*</constant>) <optional>port <replaceable>ip_port</replaceable></optional> ; </optional>
<optional> notify-to-soa <replaceable>yes_or_no</replaceable> ; </optional>
- <optional> also-notify { <replaceable>ip_addr</replaceable> <optional>port <replaceable>ip_port</replaceable></optional> ; <optional> <replaceable>ip_addr</replaceable> <optional>port <replaceable>ip_port</replaceable></optional> ; ... </optional> }; </optional>
+ <optional> also-notify { <replaceable>ip_addr</replaceable> <optional>port <replaceable>ip_port</replaceable></optional> ;
+ <optional> <replaceable>ip_addr</replaceable> <optional>port <replaceable>ip_port</replaceable></optional> ; ... </optional> }; </optional>
<optional> max-ixfr-log-size <replaceable>number</replaceable>; </optional>
<optional> max-journal-size <replaceable>size_spec</replaceable>; </optional>
<optional> coresize <replaceable>size_spec</replaceable> ; </optional>
@@ -4884,12 +5132,25 @@ category notify { null; };
<optional> random-device <replaceable>path_name</replaceable> ; </optional>
<optional> max-cache-size <replaceable>size_spec</replaceable> ; </optional>
<optional> match-mapped-addresses <replaceable>yes_or_no</replaceable>; </optional>
+ <optional> filter-aaaa-on-v4 ( <replaceable>yes_or_no</replaceable> | <replaceable>break-dnssec</replaceable> ); </optional>
+ <optional> filter-aaaa { <replaceable>address_match_list</replaceable> }; </optional>
+ <optional> dns64 <replaceable>IPv6-prefix</replaceable> {
+ <optional> clients { <replaceable>address_match_list</replaceable> }; </optional>
+ <optional> mapped { <replaceable>address_match_list</replaceable> }; </optional>
+ <optional> exclude { <replaceable>address_match_list</replaceable> }; </optional>
+ <optional> suffix IPv6-address; </optional>
+ <optional> recursive-only <replaceable>yes_or_no</replaceable>; </optional>
+ <optional> break-dnssec <replaceable>yes_or_no</replaceable>; </optional>
+ }; </optional>;
+ <optional> dns64-server <replaceable>name</replaceable> </optional>
+ <optional> dns64-contact <replaceable>name</replaceable> </optional>
<optional> preferred-glue ( <replaceable>A</replaceable> | <replaceable>AAAA</replaceable> | <replaceable>NONE</replaceable> ); </optional>
<optional> edns-udp-size <replaceable>number</replaceable>; </optional>
<optional> max-udp-size <replaceable>number</replaceable>; </optional>
<optional> root-delegation-only <optional> exclude { <replaceable>namelist</replaceable> } </optional> ; </optional>
<optional> querylog <replaceable>yes_or_no</replaceable> ; </optional>
- <optional> disable-algorithms <replaceable>domain</replaceable> { <replaceable>algorithm</replaceable>; <optional> <replaceable>algorithm</replaceable>; </optional> }; </optional>
+ <optional> disable-algorithms <replaceable>domain</replaceable> { <replaceable>algorithm</replaceable>;
+ <optional> <replaceable>algorithm</replaceable>; </optional> }; </optional>
<optional> acache-enable <replaceable>yes_or_no</replaceable> ; </optional>
<optional> acache-cleaning-interval <replaceable>number</replaceable>; </optional>
<optional> max-acache-size <replaceable>size_spec</replaceable> ; </optional>
@@ -4902,6 +5163,10 @@ category notify { null; };
<optional> disable-empty-zone <replaceable>zone_name</replaceable> ; </optional>
<optional> zero-no-soa-ttl <replaceable>yes_or_no</replaceable> ; </optional>
<optional> zero-no-soa-ttl-cache <replaceable>yes_or_no</replaceable> ; </optional>
+ <optional> resolver-query-timeout <replaceable>number</replaceable> ; </optional>
+ <optional> deny-answer-addresses { <replaceable>address_match_list</replaceable> } <optional> except-from { <replaceable>namelist</replaceable> } </optional>;</optional>
+ <optional> deny-answer-aliases { <replaceable>namelist</replaceable> } <optional> except-from { <replaceable>namelist</replaceable> } </optional>;</optional>
+ <optional> response-policy { <replaceable>zone_name</replaceable> <optional> policy <replaceable>given</replaceable> | <replaceable>no-op</replaceable> | <replaceable>nxdomain</replaceable> | <replaceable>nodata</replaceable> | <replaceable>cname domain</replaceable> </optional> ; } ; </optional>
};
</programlisting>
@@ -4923,6 +5188,102 @@ category notify { null; };
<variablelist>
+ <varlistentry>
+ <term><command>attach-cache</command></term>
+ <listitem>
+ <para>
+ Allows multiple views to share a single cache
+ database.
+ Each view has its own cache database by default, but
+ if multiple views have the same operational policy
+ for name resolution and caching, those views can
+ share a single cache to save memory and possibly
+ improve resolution efficiency by using this option.
+ </para>
+
+ <para>
+ The <command>attach-cache</command> option
+ may also be specified in <command>view</command>
+ statements, in which case it overrides the
+ global <command>attach-cache</command> option.
+ </para>
+
+ <para>
+ The <replaceable>cache_name</replaceable> specifies
+ the cache to be shared.
+ When the <command>named</command> server configures
+ views which are supposed to share a cache, it
+ creates a cache with the specified name for the
+ first view of these sharing views.
+ The rest of the views will simply refer to the
+ already created cache.
+ </para>
+
+ <para>
+ One common configuration to share a cache would be to
+ allow all views to share a single cache.
+ This can be done by specifying
+ the <command>attach-cache</command> as a global
+ option with an arbitrary name.
+ </para>
+
+ <para>
+ Another possible operation is to allow a subset of
+ all views to share a cache while the others to
+ retain their own caches.
+ For example, if there are three views A, B, and C,
+ and only A and B should share a cache, specify the
+ <command>attach-cache</command> option as a view A (or
+ B)'s option, referring to the other view name:
+ </para>
+
+<programlisting>
+ view "A" {
+ // this view has its own cache
+ ...
+ };
+ view "B" {
+ // this view refers to A's cache
+ attach-cache "A";
+ };
+ view "C" {
+ // this view has its own cache
+ ...
+ };
+</programlisting>
+
+ <para>
+ Views that share a cache must have the same policy
+ on configurable parameters that may affect caching.
+ The current implementation requires the following
+ configurable options be consistent among these
+ views:
+ <command>check-names</command>,
+ <command>cleaning-interval</command>,
+ <command>dnssec-accept-expired</command>,
+ <command>dnssec-validation</command>,
+ <command>max-cache-ttl</command>,
+ <command>max-ncache-ttl</command>,
+ <command>max-cache-size</command>, and
+ <command>zero-no-soa-ttl</command>.
+ </para>
+
+ <para>
+ Note that there may be other parameters that may
+ cause confusion if they are inconsistent for
+ different views that share a single cache.
+ For example, if these views define different sets of
+ forwarders that can return different answers for the
+ same question, sharing the answer does not make
+ sense or could even be harmful.
+ It is administrator's responsibility to ensure
+ configuration differences in different views do
+ not cause disruption with a shared cache.
+ </para>
+ </listitem>
+
+ </varlistentry>
+
<varlistentry>
<term><command>directory</command></term>
<listitem>
@@ -4950,10 +5311,24 @@ category notify { null; };
When performing dynamic update of secure zones, the
directory where the public and private DNSSEC key files
should be found, if different than the current working
- directory. The directory specified must be an absolute
- path. (Note that this option has no effect on the paths
- for files containing non-DNSSEC keys such as the
- <filename>rndc.key</filename>.
+ directory. (Note that this option has no effect on the
+ paths for files containing non-DNSSEC keys such as
+ <filename>bind.keys</filename>,
+ <filename>rndc.key</filename> or
+ <filename>session.key</filename>.)
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term><command>managed-keys-directory</command></term>
+ <listitem>
+ <para>
+ The directory used to hold the files used to track managed keys.
+ By default it is the working directory. It there are no
+ views then the file <filename>managed-keys.bind</filename>
+ otherwise a SHA256 hash of the view name is used with
+ <filename>.mkeys</filename> extension added.
</para>
</listitem>
</varlistentry>
@@ -4973,19 +5348,33 @@ category notify { null; };
</varlistentry>
<varlistentry>
+ <term><command>tkey-gssapi-keytab</command></term>
+ <listitem>
+ <para>
+ The KRB5 keytab file to use for GSS-TSIG updates. If
+ this option is set and tkey-gssapi-credential is not
+ set, then updates will be allowed with any key
+ matching a principal in the specified keytab.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
<term><command>tkey-gssapi-credential</command></term>
<listitem>
<para>
The security credential with which the server should
authenticate keys requested by the GSS-TSIG protocol.
Currently only Kerberos 5 authentication is available
- and the credential is a Kerberos principal which
- the server can acquire through the default system
- key file, normally <filename>/etc/krb5.keytab</filename>.
- Normally this principal is of the form
- "<userinput>DNS/</userinput><varname>server.domain</varname>".
- To use GSS-TSIG, <command>tkey-domain</command>
- must also be set.
+ and the credential is a Kerberos principal which the
+ server can acquire through the default system key
+ file, normally <filename>/etc/krb5.keytab</filename>.
+ The location keytab file can be overridden using the
+ tkey-gssapi-keytab option. Normally this principal is
+ of the form "<userinput>DNS/</userinput><varname>server.domain</varname>".
+ To use GSS-TSIG, <command>tkey-domain</command> must
+ also be set if a specific keytab is not set with
+ tkey-gssapi-keytab.
</para>
</listitem>
</varlistentry>
@@ -5007,7 +5396,8 @@ category notify { null; };
should be the server's domain name, or an otherwise
non-existent subdomain like
"_tkey.<varname>domainname</varname>". If you are
- using GSS-TSIG, this variable must be defined.
+ using GSS-TSIG, this variable must be defined, unless
+ you specify a specific keytab using tkey-gssapi-keytab.
</para>
</listitem>
</varlistentry>
@@ -5106,6 +5496,84 @@ category notify { null; };
</varlistentry>
<varlistentry>
+ <term><command>bindkeys-file</command></term>
+ <listitem>
+ <para>
+ The pathname of a file to override the built-in trusted
+ keys provided by <command>named</command>.
+ See the discussion of <command>dnssec-lookaside</command>
+ and <command>dnssec-validation</command> for details.
+ If not specified, the default is
+ <filename>/etc/bind.keys</filename>.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term><command>secroots-file</command></term>
+ <listitem>
+ <para>
+ The pathname of the file the server dumps
+ security roots to when instructed to do so with
+ <command>rndc secroots</command>.
+ If not specified, the default is <filename>named.secroots</filename>.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term><command>session-keyfile</command></term>
+ <listitem>
+ <para>
+ The pathname of the file into which to write a TSIG
+ session key generated by <command>named</command> for use by
+ <command>nsupdate -l</command>. If not specified, the
+ default is <filename>/var/run/named/session.key</filename>.
+ (See <xref linkend="dynamic_update_policies"/>, and in
+ particular the discussion of the
+ <command>update-policy</command> statement's
+ <userinput>local</userinput> option for more
+ information about this feature.)
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term><command>session-keyname</command></term>
+ <listitem>
+ <para>
+ The key name to use for the TSIG session key.
+ If not specified, the default is "local-ddns".
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term><command>session-keyalg</command></term>
+ <listitem>
+ <para>
+ The algorithm to use for the TSIG session key.
+ Valid values are hmac-sha1, hmac-sha224, hmac-sha256,
+ hmac-sha384, hmac-sha512 and hmac-md5. If not
+ specified, the default is hmac-sha256.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term><command>session-keyfile</command></term>
+ <listitem>
+ <para>
+ The pathname of the file into which to write a session TSIG
+ key for use by <command>nsupdate -l</command>. (See the
+ discussion of the <command>update-policy</command>
+ statement's <userinput>local</userinput> option for more
+ details on this feature.)
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
<term><command>port</command></term>
<listitem>
<para>
@@ -5167,14 +5635,14 @@ category notify { null; };
<para>
DS queries are expected to be made to and be answered by
delegation only zones. Such queries and responses are
- treated as a exception to delegation-only processing
+ treated as an exception to delegation-only processing
and are not converted to NXDOMAIN responses provided
a CNAME is not discovered at the query name.
</para>
<para>
If a delegation only zone server also serves a child
zone it is not always possible to determine whether
- a answer comes from the delegation only zone or the
+ an answer comes from the delegation only zone or the
child zone. SOA NS and DNSKEY records are apex
only records and a matching response that contains
these records or DS is treated as coming from a
@@ -5223,21 +5691,46 @@ options {
<term><command>dnssec-lookaside</command></term>
<listitem>
<para>
- When set, <command>dnssec-lookaside</command>
- provides the
- validator with an alternate method to validate DNSKEY records
- at the
- top of a zone. When a DNSKEY is at or below a domain
- specified by the
- deepest <command>dnssec-lookaside</command>, and
- the normal DNSSEC validation
- has left the key untrusted, the trust-anchor will be append to
- the key
- name and a DLV record will be looked up to see if it can
- validate the
- key. If the DLV record validates a DNSKEY (similarly to the
- way a DS
+ When set, <command>dnssec-lookaside</command> provides the
+ validator with an alternate method to validate DNSKEY
+ records at the top of a zone. When a DNSKEY is at or
+ below a domain specified by the deepest
+ <command>dnssec-lookaside</command>, and the normal DNSSEC
+ validation has left the key untrusted, the trust-anchor
+ will be appended to the key name and a DLV record will be
+ looked up to see if it can validate the key. If the DLV
+ record validates a DNSKEY (similarly to the way a DS
record does) the DNSKEY RRset is deemed to be trusted.
+ </para>
+ <para>
+ If <command>dnssec-lookaside</command> is set to
+ <userinput>auto</userinput>, then built-in default
+ values for the DLV domain and trust anchor will be
+ used, along with a built-in key for validation.
+ </para>
+ <para>
+ The default DLV key is stored in the file
+ <filename>bind.keys</filename>;
+ <command>named</command> will load that key at
+ startup if <command>dnssec-lookaside</command> is set to
+ <constant>auto</constant>. A copy of the file is
+ installed along with <acronym>BIND</acronym> 9, and is
+ current as of the release date. If the DLV key expires, a
+ new copy of <filename>bind.keys</filename> can be downloaded
+ from <ulink>https://www.isc.org/solutions/dlv</ulink>.
+ </para>
+ <para>
+ (To prevent problems if <filename>bind.keys</filename> is
+ not found, the current key is also compiled in to
+ <command>named</command>. Relying on this is not
+ recommended, however, as it requires <command>named</command>
+ to be recompiled with a new key when the DLV key expires.)
+ </para>
+ <para>
+ NOTE: <command>named</command> only loads certain specific
+ keys from <filename>bind.keys</filename>: those for the
+ DLV zone and for the DNS root zone. The file cannot be
+ used to store keys for other zones.
</para>
</listitem>
</varlistentry>
@@ -5246,21 +5739,86 @@ options {
<term><command>dnssec-must-be-secure</command></term>
<listitem>
<para>
- Specify hierarchies which must be or may not be secure (signed and
- validated).
- If <userinput>yes</userinput>, then <command>named</command> will only accept
- answers if they
- are secure.
- If <userinput>no</userinput>, then normal DNSSEC validation
- applies
- allowing for insecure answers to be accepted.
- The specified domain must be under a <command>trusted-key</command> or
- <command>dnssec-lookaside</command> must be
- active.
+ Specify hierarchies which must be or may not be secure
+ (signed and validated). If <userinput>yes</userinput>,
+ then <command>named</command> will only accept answers if
+ they are secure. If <userinput>no</userinput>, then normal
+ DNSSEC validation applies allowing for insecure answers to
+ be accepted. The specified domain must be under a
+ <command>trusted-keys</command> or
+ <command>managed-keys</command> statement, or
+ <command>dnssec-lookaside</command> must be active.
</para>
</listitem>
</varlistentry>
+ <varlistentry>
+ <term><command>dns64</command></term>
+ <listitem>
+ <para>
+ This directive instructs <command>named</command> to
+ return mapped IPv4 addresses to AAAA queries when
+ there are no AAAA records. It is intended to be
+ used in conjunction with a NAT64. Each
+ <command>dns64</command> defines one DNS64 prefix.
+ Multiple DNS64 prefixes can be defined.
+ </para>
+ <para>
+ Compatible IPv6 prefixes have lengths of 32, 40, 48, 56,
+ 64 and 96 as per RFC 6052.
+ </para>
+ <para>
+ Additionally a reverse IP6.ARPA zone will be created for
+ the prefix to provide a mapping from the IP6.ARPA names
+ to the corresponding IN-ADDR.ARPA names using synthesized
+ CNAMEs. <command>dns64-server</command> and
+ <command>dns64-contact</command> can be used to specify
+ the name of the server and contact for the zones. These
+ are settable at the view / options level. These are
+ not settable on a per-prefix basis.
+ </para>
+ <para>
+ Each <command>dns64</command> supports an optional
+ <command>clients</command> ACL that determines which
+ clients are affected by this directive. If not defined,
+ it defaults to <userinput>any;</userinput>.
+ </para>
+ <para>
+ Each <command>dns64</command> supports an optional
+ <command>mapped</command> ACL that selects which
+ IPv4 addresses are to be mapped in the corresponding
+ A RRset. If not defined it defaults to
+ <userinput>any;</userinput>.
+ </para>
+ <para>
+ Each <command>dns64</command> supports an optional
+ <command>exclude</command> ACL that selects which
+ IPv6 addresses will be ignored for the purposes
+ of determining whether dns64 is to be applied.
+ Any non-matching address will prevent further
+ DNS64 processing from occurring for this client.
+ </para>
+ <para>
+ A optional <command>suffix</command> can also
+ be defined to set the bits trailing the mapped
+ IPv4 address bits. By default these bits are
+ set to <userinput>::</userinput>. The bits
+ matching the prefix and mapped IPv4 address
+ must be zero.
+ </para>
+<programlisting>
+ acl rfc1918 { 10/8; 192.168/16; 172.16/12; };
+
+ dns64 64:FF9B::/96 {
+ clients { any; };
+ mapped { !rfc1918; any; };
+ exclude { 64:FF9B::/96; ::ffff:0000:0000/96; };
+ suffix ::;
+ };
+</programlisting>
+ </listitem>
+ </varlistentry>
+
</variablelist>
<sect3 id="boolean_options">
@@ -5269,6 +5827,18 @@ options {
<variablelist>
<varlistentry>
+ <term><command>allow-new-zones</command></term>
+ <listitem>
+ <para>
+ If <userinput>yes</userinput>, then zones can be
+ added at runtime via <command>rndc addzone</command>
+ or deleted via <command>rndc delzone</command>.
+ The default is <userinput>no</userinput>.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
<term><command>auth-nxdomain</command></term>
<listitem>
<para>
@@ -5755,6 +6325,7 @@ options {
off
on a per-zone basis by specifying <command>zone-statistics no</command>
in the <command>zone</command> statement).
+ The default is <userinput>no</userinput>.
These statistics may be accessed
using <command>rndc stats</command>, which will
dump them to the file listed
@@ -5928,6 +6499,60 @@ options {
</varlistentry>
<varlistentry>
+ <term><command>filter-aaaa-on-v4</command></term>
+ <listitem>
+ <para>
+ This option is only available when
+ <acronym>BIND</acronym> 9 is compiled with the
+ <userinput>--enable-filter-aaaa</userinput> option on the
+ "configure" command line. It is intended to help the
+ transition from IPv4 to IPv6 by not giving IPv6 addresses
+ to DNS clients unless they have connections to the IPv6
+ Internet. This is not recommended unless absolutely
+ necessary. The default is <userinput>no</userinput>.
+ The <command>filter-aaaa-on-v4</command> option
+ may also be specified in <command>view</command> statements
+ to override the global <command>filter-aaaa-on-v4</command>
+ option.
+ </para>
+ <para>
+ If <userinput>yes</userinput>,
+ the DNS client is at an IPv4 address, in <command>filter-aaaa</command>,
+ and if the response does not include DNSSEC signatures,
+ then all AAAA records are deleted from the response.
+ This filtering applies to all responses and not only
+ authoritative responses.
+ </para>
+ <para>
+ If <userinput>break-dnssec</userinput>,
+ then AAAA records are deleted even when dnssec is enabled.
+ As suggested by the name, this makes the response not verify,
+ because the DNSSEC protocol is designed detect deletions.
+ </para>
+ <para>
+ This mechanism can erroneously cause other servers to
+ not give AAAA records to their clients.
+ A recursing server with both IPv6 and IPv4 network connections
+ that queries an authoritative server using this mechanism
+ via IPv4 will be denied AAAA records even if its client is
+ using IPv6.
+ </para>
+ <para>
+ This mechanism is applied to authoritative as well as
+ non-authoritative records.
+ A client using IPv4 that is not allowed recursion can
+ erroneously be given AAAA records because the server is not
+ allowed to check for A records.
+ </para>
+ <para>
+ Some AAAA records are given to IPv4 clients in glue records.
+ IPv4 clients that are servers can then erroneously
+ answer requests for AAAA records received via IPv4.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
<term><command>ixfr-from-differences</command></term>
<listitem>
<para>
@@ -5996,7 +6621,15 @@ options {
Enable DNSSEC validation in <command>named</command>.
Note <command>dnssec-enable</command> also needs to be
set to <userinput>yes</userinput> to be effective.
- The default is <userinput>yes</userinput>.
+ If set to <userinput>no</userinput>, DNSSEC validation
+ is disabled. If set to <userinput>auto</userinput>,
+ DNSSEC validation is enabled, and a default
+ trust-anchor for the DNS root zone is used. If set to
+ <userinput>yes</userinput>, DNSSEC validation is enabled,
+ but a trust anchor must be manually configured using
+ a <command>trusted-keys</command> or
+ <command>managed-keys</command> statement. The default
+ is <userinput>yes</userinput>.
</para>
</listitem>
</varlistentry>
@@ -6007,7 +6640,9 @@ options {
<para>
Accept expired signatures when verifying DNSSEC signatures.
The default is <userinput>no</userinput>.
- Setting this option to "yes" leaves <command>named</command> vulnerable to replay attacks.
+ Setting this option to <userinput>yes</userinput>
+ leaves <command>named</command> vulnerable to
+ replay attacks.
</para>
</listitem>
</varlistentry>
@@ -6057,6 +6692,19 @@ options {
</varlistentry>
<varlistentry>
+ <term><command>check-dup-records</command></term>
+ <listitem>
+ <para>
+ Check master zones for records that are treated as different
+ by DNSSEC but are semantically equal in plain DNS. The
+ default is to <command>warn</command>. Other possible
+ values are <command>fail</command> and
+ <command>ignore</command>.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
<term><command>check-mx</command></term>
<listitem>
<para>
@@ -6161,13 +6809,49 @@ options {
<term><command>update-check-ksk</command></term>
<listitem>
<para>
- When regenerating the RRSIGs following a UPDATE
- request to a secure zone, check the KSK flag on
- the DNSKEY RR to determine if this key should be
- used to generate the RRSIG. This flag is ignored
- if there are not DNSKEY RRs both with and without
- a KSK.
- The default is <command>yes</command>.
+ When set to the default value of <literal>yes</literal>,
+ check the KSK bit in each key to determine how the key
+ should be used when generating RRSIGs for a secure zone.
+ </para>
+ <para>
+ Ordinarily, zone-signing keys (that is, keys without the
+ KSK bit set) are used to sign the entire zone, while
+ key-signing keys (keys with the KSK bit set) are only
+ used to sign the DNSKEY RRset at the zone apex.
+ However, if this option is set to <literal>no</literal>,
+ then the KSK bit is ignored; KSKs are treated as if they
+ were ZSKs and are used to sign the entire zone. This is
+ similar to the <command>dnssec-signzone -z</command>
+ command line option.
+ </para>
+ <para>
+ When this option is set to <literal>yes</literal>, there
+ must be at least two active keys for every algorithm
+ represented in the DNSKEY RRset: at least one KSK and one
+ ZSK per algorithm. If there is any algorithm for which
+ this requirement is not met, this option will be ignored
+ for that algorithm.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term><command>dnssec-dnskey-kskonly</command></term>
+ <listitem>
+ <para>
+ When this option and <command>update-check-ksk</command>
+ are both set to <literal>yes</literal>, only key-signing
+ keys (that is, keys with the KSK bit set) will be used
+ to sign the DNSKEY RRset at the zone apex. Zone-signing
+ keys (keys without the KSK bit set) will be used to sign
+ the remainder of the zone, but not the DNSKEY RRset.
+ This is similar to the
+ <command>dnssec-signzone -x</command> command line option.
+ </para>
+ <para>
+ The default is <command>no</command>. If
+ <command>update-check-ksk</command> is set to
+ <literal>no</literal>, this option is ignored.
</para>
</listitem>
</varlistentry>
@@ -6183,6 +6867,34 @@ options {
</listitem>
</varlistentry>
+ <varlistentry>
+ <term><command>dnssec-secure-to-insecure</command></term>
+ <listitem>
+ <para>
+ Allow a dynamic zone to transition from secure to
+ insecure (i.e., signed to unsigned) by deleting all
+ of the DNSKEY records. The default is <command>no</command>.
+ If set to <command>yes</command>, and if the DNSKEY RRset
+ at the zone apex is deleted, all RRSIG and NSEC records
+ will be removed from the zone as well.
+ </para>
+ <para>
+ If the zone uses NSEC3, then it is also necessary to
+ delete the NSEC3PARAM RRset from the zone apex; this will
+ cause the removal of all corresponding NSEC3 records.
+ (It is expected that this requirement will be eliminated
+ in a future release.)
+ </para>
+ <para>
+ Note that if a zone has been configured with
+ <command>auto-dnssec maintain</command> and the
+ private keys remain accessible in the key repository,
+ then the zone will be automatically signed again the
+ next time <command>named</command> is started.
+ </para>
+ </listitem>
+ </varlistentry>
+
</variablelist>
</sect3>
@@ -6495,6 +7207,29 @@ options {
</listitem>
</varlistentry>
+ <varlistentry>
+ <term><command>filter-aaaa</command></term>
+ <listitem>
+ <para>
+ Specifies a list of addresses to which
+ <command>filter-aaaa-on-v4</command>
+ is applies. The default is <userinput>any</userinput>.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term><command>resolver-query-timeout</command></term>
+ <listitem>
+ <para>
+ The amount of time the resolver will spend attempting
+ to resolve a recursive query before failing. The
+ default is <literal>10</literal> and the maximum is
+ <literal>30</literal>. Setting it to <literal>0</literal>
+ will result in the default being used.
+ </para>
+ </listitem>
+ </varlistentry>
</variablelist>
</sect3>
@@ -7542,20 +8277,26 @@ avoid-v6-udp-ports { 40000; range 50000 60000; };
</para>
<programlisting>sortlist {
- { localhost; // IF the local host
- { localnets; // THEN first fit on the
- 192.168.1/24; // following nets
+ // IF the local host
+ // THEN first fit on the following nets
+ { localhost;
+ { localnets;
+ 192.168.1/24;
{ 192.168.2/24; 192.168.3/24; }; }; };
- { 192.168.1/24; // IF on class C 192.168.1
- { 192.168.1/24; // THEN use .1, or .2 or .3
+ // IF on class C 192.168.1 THEN use .1, or .2 or .3
+ { 192.168.1/24;
+ { 192.168.1/24;
{ 192.168.2/24; 192.168.3/24; }; }; };
- { 192.168.2/24; // IF on class C 192.168.2
- { 192.168.2/24; // THEN use .2, or .1 or .3
+ // IF on class C 192.168.2 THEN use .2, or .1 or .3
+ { 192.168.2/24;
+ { 192.168.2/24;
{ 192.168.1/24; 192.168.3/24; }; }; };
- { 192.168.3/24; // IF on class C 192.168.3
- { 192.168.3/24; // THEN use .3, or .1 or .2
+ // IF on class C 192.168.3 THEN use .3, or .1 or .2
+ { 192.168.3/24;
+ { 192.168.3/24;
{ 192.168.1/24; 192.168.2/24; }; }; };
- { { 192.168.4/24; 192.168.5/24; }; // if .4 or .5, prefer that net
+ // IF .4 or .5 THEN prefer that net
+ { { 192.168.4/24; 192.168.5/24; };
};
};</programlisting>
@@ -7772,7 +8513,7 @@ avoid-v6-udp-ports { 40000; range 50000 60000; };
DNSSEC signatures automatically generated as a
result of dynamic updates (<xref
linkend="dynamic_update"/>) will expire. There
- is a optional second field which specifies how
+ is an optional second field which specifies how
long before expiry that the signatures will be
regenerated. If not specified, the signatures will
be regenerated at 1/4 of base interval. The second
@@ -7877,7 +8618,7 @@ avoid-v6-udp-ports { 40000; range 50000 60000; };
<para>
Sets the advertised EDNS UDP buffer size in bytes
to control the size of packets received.
- Valid values are 512 to 4096 (values outside this range
+ Valid values are 1024 to 4096 (values outside this range
will be silently adjusted). The default value
is 4096. The usual reason for setting
<command>edns-udp-size</command> to a non-default
@@ -7885,24 +8626,36 @@ avoid-v6-udp-ports { 40000; range 50000 60000; };
firewalls that block fragmented packets and/or
block UDP packets that are greater than 512 bytes.
</para>
+ <para>
+ <command>named</command> will fallback to using 512 bytes
+ if it get a series of timeout at the initial value. 512
+ bytes is not being offered to encourage sites to fix their
+ firewalls. Small EDNS UDP sizes will result in the
+ excessive use of TCP.
+ </para>
</listitem>
</varlistentry>
<varlistentry>
<term><command>max-udp-size</command></term>
- <listitem>
- <para>
- Sets the maximum EDNS UDP message size <command>named</command> will
- send in bytes. Valid values are 512 to 4096 (values outside
- this range will be silently adjusted). The default
+ <listitem>
+ <para>
+ Sets the maximum EDNS UDP message size
+ <command>named</command> will send in bytes.
+ Valid values are 512 to 4096 (values outside this
+ range will be silently adjusted). The default
value is 4096. The usual reason for setting
- <command>max-udp-size</command> to a non-default value is to get UDP
- answers to pass through broken firewalls that
- block fragmented packets and/or block UDP packets
- that are greater than 512 bytes.
+ <command>max-udp-size</command> to a non-default
+ value is to get UDP answers to pass through broken
+ firewalls that block fragmented packets and/or
+ block UDP packets that are greater than 512 bytes.
This is independent of the advertised receive
buffer (<command>edns-udp-size</command>).
</para>
+ <para>
+ Setting this to a low value will encourage additional
+ TCP traffic to the nameserver.
+ </para>
</listitem>
</varlistentry>
@@ -8081,7 +8834,7 @@ avoid-v6-udp-ports { 40000; range 50000 60000; };
<para>
Named will attempt to determine if a built-in zone already exists
or is active (covered by a forward-only forwarding declaration)
- and will not create a empty zone in that case.
+ and will not create an empty zone in that case.
</para>
<para>
The current list of empty zones is:
@@ -8308,6 +9061,282 @@ XXX: end of RFC1918 addresses #defined out -->
</sect3>
+ <sect3>
+ <title>Content Filtering</title>
+ <para>
+ <acronym>BIND</acronym> 9 provides the ability to filter
+ out DNS responses from external DNS servers containing
+ certain types of data in the answer section.
+ Specifically, it can reject address (A or AAAA) records if
+ the corresponding IPv4 or IPv6 addresses match the given
+ <varname>address_match_list</varname> of the
+ <command>deny-answer-addresses</command> option.
+ It can also reject CNAME or DNAME records if the "alias"
+ name (i.e., the CNAME alias or the substituted query name
+ due to DNAME) matches the
+ given <varname>namelist</varname> of the
+ <command>deny-answer-aliases</command> option, where
+ "match" means the alias name is a subdomain of one of
+ the <varname>name_list</varname> elements.
+ If the optional <varname>namelist</varname> is specified
+ with <command>except-from</command>, records whose query name
+ matches the list will be accepted regardless of the filter
+ setting.
+ Likewise, if the alias name is a subdomain of the
+ corresponding zone, the <command>deny-answer-aliases</command>
+ filter will not apply;
+ for example, even if "example.com" is specified for
+ <command>deny-answer-aliases</command>,
+ </para>
+<programlisting>www.example.com. CNAME xxx.example.com.</programlisting>
+
+ <para>
+ returned by an "example.com" server will be accepted.
+ </para>
+
+ <para>
+ In the <varname>address_match_list</varname> of the
+ <command>deny-answer-addresses</command> option, only
+ <varname>ip_addr</varname>
+ and <varname>ip_prefix</varname>
+ are meaningful;
+ any <varname>key_id</varname> will be silently ignored.
+ </para>
+
+ <para>
+ If a response message is rejected due to the filtering,
+ the entire message is discarded without being cached, and
+ a SERVFAIL error will be returned to the client.
+ </para>
+
+ <para>
+ This filtering is intended to prevent "DNS rebinding attacks," in
+ which an attacker, in response to a query for a domain name the
+ attacker controls, returns an IP address within your own network or
+ an alias name within your own domain.
+ A naive web browser or script could then serve as an
+ unintended proxy, allowing the attacker
+ to get access to an internal node of your local network
+ that couldn't be externally accessed otherwise.
+ See the paper available at
+ <ulink>
+ http://portal.acm.org/citation.cfm?id=1315245.1315298
+ </ulink>
+ for more details about the attacks.
+ </para>
+
+ <para>
+ For example, if you own a domain named "example.net" and
+ your internal network uses an IPv4 prefix 192.0.2.0/24,
+ you might specify the following rules:
+ </para>
+
+<programlisting>deny-answer-addresses { 192.0.2.0/24; } except-from { "example.net"; };
+deny-answer-aliases { "example.net"; };
+</programlisting>
+
+ <para>
+ If an external attacker lets a web browser in your local
+ network look up an IPv4 address of "attacker.example.com",
+ the attacker's DNS server would return a response like this:
+ </para>
+
+<programlisting>attacker.example.com. A 192.0.2.1</programlisting>
+
+ <para>
+ in the answer section.
+ Since the rdata of this record (the IPv4 address) matches
+ the specified prefix 192.0.2.0/24, this response will be
+ ignored.
+ </para>
+
+ <para>
+ On the other hand, if the browser looks up a legitimate
+ internal web server "www.example.net" and the
+ following response is returned to
+ the <acronym>BIND</acronym> 9 server
+ </para>
+
+<programlisting>www.example.net. A 192.0.2.2</programlisting>
+
+ <para>
+ it will be accepted since the owner name "www.example.net"
+ matches the <command>except-from</command> element,
+ "example.net".
+ </para>
+
+ <para>
+ Note that this is not really an attack on the DNS per se.
+ In fact, there is nothing wrong for an "external" name to
+ be mapped to your "internal" IP address or domain name
+ from the DNS point of view.
+ It might actually be provided for a legitimate purpose,
+ such as for debugging.
+ As long as the mapping is provided by the correct owner,
+ it is not possible or does not make sense to detect
+ whether the intent of the mapping is legitimate or not
+ within the DNS.
+ The "rebinding" attack must primarily be protected at the
+ application that uses the DNS.
+ For a large site, however, it may be difficult to protect
+ all possible applications at once.
+ This filtering feature is provided only to help such an
+ operational environment;
+ it is generally discouraged to turn it on unless you are
+ very sure you have no other choice and the attack is a
+ real threat for your applications.
+ </para>
+
+ <para>
+ Care should be particularly taken if you want to use this
+ option for addresses within 127.0.0.0/8.
+ These addresses are obviously "internal", but many
+ applications conventionally rely on a DNS mapping from
+ some name to such an address.
+ Filtering out DNS records containing this address
+ spuriously can break such applications.
+ </para>
+ </sect3>
+
+ <sect3>
+ <title>Response Policy Zone (RPZ) Rewriting</title>
+ <para>
+ <acronym>BIND</acronym> 9 includes an intentionally limited
+ mechanism to modify DNS responses for recursive requests
+ similar to email anti-spam DNS blacklists.
+ All response policy zones are named in the
+ <command>response-policy</command> option for the view or among the
+ global options if there is no response-policy option for the view.
+ </para>
+
+ <para>
+ The rules encoded in a response policy zone (RPZ) are applied
+ only to responses to queries that ask for recursion (RD=1).
+ RPZs are normal DNS zones containing RRsets
+ that can be queried normally if allowed.
+ It is usually best to restrict those queries with something like
+ <command>allow-query {none; };</command> or
+ <command>allow-query { 127.0.0.1; };</command>.
+ </para>
+
+ <para>
+ There are four kinds of RPZ rewrite rules. QNAME rules are
+ applied to query names in requests and to targets of CNAME
+ records resolved in the process of generating the response.
+ The owner name of a QNAME rule is the query name relativized
+ to the RPZ.
+ The records in a rewrite rule are usually A, AAAA, or special
+ CNAMEs, but can be any type except DNAME.
+ </para>
+
+ <para>
+ IP rules are triggered by addresses in A and AAAA records.
+ All IP addresses in A or AAAA RRsets are tested and the rule
+ longest prefix is applied. Ties between rules with equal prefixes
+ are broken in favor of the first RPZ mentioned in the
+ response-policy option.
+ The rule matching the smallest IP address is chosen among equal
+ prefix rules from a single RPZ.
+ IP rules are expressed in RRsets with owner names that are
+ subdomains of rpz-ip and encoding an IP address block, reversed
+ as in IN-ARPA.
+ prefix.B.B.B.B with prefix between 1 and 32 and B between 1 and 255
+ encodes an IPv4 address.
+ IPv6 addresses are encoded by with prefix.W.W.W.W.W.W.W.W or
+ prefix.WORDS.zz.WORDS. The words in the standard IPv6 text
+ representation are reversed, "::" is replaced with ".zz.",
+ and ":" becomes ".".
+ </para>
+
+ <para>
+ NSDNAME rules match names in NS RRsets for the response or a
+ parent. They are encoded as subdomains of rpz-nsdomain relativized
+ to the RPZ origin name.
+ </para>
+
+ <para>
+ NSIP rules match IP addresses in A and AAAA RRsets for names of
+ responsible servers or the names that can be matched by NSDNAME
+ rules. The are encoded like IP rules except as subdomains of
+ rpz-nsip.
+ </para>
+
+ <para>
+ Authority verification issues and variations in authority data in
+ the current version of <acronym>BIND</acronym> 9 can cause
+ inconsistent results from NSIP and NSDNAME. So they are available
+ only when <acronym>BIND</acronym> is built with the
+ <userinput>--enable-rpz-nsip</userinput> or
+ <userinput>--enable-rpz-nsdname</userinput> options
+ on the "configure" command line.
+ </para>
+
+ <para>
+ Four policies can be expressed.
+ The <command>NXDOMAIN</command> policy causes a NXDOMAIN response
+ and is expressed with an RRset consisting of a single CNAME
+ whose target is the root domain (.).
+ <command>NODATA</command> generates NODATA or ANCOUNT=1 regardless
+ of query type.
+ It is expressed with a CNAME whose target is the wildcard
+ top-level domain (*.).
+ The <command>NO-OP</command> policy does not change the response
+ and is used to "poke holes" in policies for larger CIDR blocks or in
+ zones named later in the <command>response-policy</command> option.
+ The NO-OP policy is expressed by a CNAME with a target consisting
+ of the variable part of the owner name, such as "example.com." for
+ a QNAME rule or "128.1.0.0.127." for an IP rule.
+ The <command>CNAME</command> policy is used to replace the RRsets
+ of response.
+ A and AAAA RRsets are most common and useful to capture
+ an evil domain in a walled garden, but any valid set of RRsets
+ is possible.
+ </para>
+
+ <para>
+ All of the policies in an RPZ can be overridden with a
+ <command>policy</command> clause.
+ <command>given</command> says "do not override."
+ <command>no-op</command> says "do nothing" regardless of the policy
+ in RPZ records.
+ <command>nxdomain</command> causes all RPZ rules to generate
+ NXDOMAIN results.
+ <command>nodata</command> gives nodata.
+ <command>cname domain</command> causes all RPZ rules to act as if
+ the consisted of a "cname domain" record.
+ </para>
+
+ <para>
+ For example, you might use this option statement
+ </para>
+<programlisting>response-policy { zone "bl"; };</programlisting>
+ <para>
+ and this zone statement
+ </para>
+<programlisting>zone "bl" {type master; file "example/bl"; allow-query {none;}; };</programlisting>
+ <para>
+ with this zone file
+ </para>
+<programlisting>$TTL 1H
+@ SOA LOCALHOST. named-mgr.example.com (1 1h 15m 30d 2h)
+
+; QNAME rules
+nxdomain.domain.com CNAME .
+nodata.domain.com CNAME *.
+bad.domain.com A 10.0.0.1
+ AAAA 2001:2::1
+ok.domain.com CNAME ok.domain.com.
+*.badzone.domain.com CNAME garden.example.com.
+
+; IP rules rewriting all answers for 127/8 except 127.0.0.1
+8.0.0.0.127.ip CNAME .
+32.1.0.0.127.ip CNAME 32.1.0.0.127.
+
+; NSDNAME and NSIP rules
+ns.domain.com.rpz-nsdname CNAME .
+48.zz.2.2001.rpz-nsip CNAME .
+</programlisting>
+ </sect3>
</sect2>
<sect2 id="server_statement_grammar">
@@ -8327,8 +9356,10 @@ XXX: end of RFC1918 addresses #defined out -->
<optional> transfer-source-v6 (<replaceable>ip6_addr</replaceable> | <constant>*</constant>) <optional>port <replaceable>ip_port</replaceable></optional> ; </optional>
<optional> notify-source (<replaceable>ip4_addr</replaceable> | <constant>*</constant>) <optional>port <replaceable>ip_port</replaceable></optional> ; </optional>
<optional> notify-source-v6 (<replaceable>ip6_addr</replaceable> | <constant>*</constant>) <optional>port <replaceable>ip_port</replaceable></optional> ; </optional>
- <optional> query-source <optional> address ( <replaceable>ip_addr</replaceable> | <replaceable>*</replaceable> ) </optional> <optional> port ( <replaceable>ip_port</replaceable> | <replaceable>*</replaceable> ) </optional>; </optional>
- <optional> query-source-v6 <optional> address ( <replaceable>ip_addr</replaceable> | <replaceable>*</replaceable> ) </optional> <optional> port ( <replaceable>ip_port</replaceable> | <replaceable>*</replaceable> ) </optional>; </optional>
+ <optional> query-source <optional> address ( <replaceable>ip_addr</replaceable> | <replaceable>*</replaceable> ) </optional>
+ <optional> port ( <replaceable>ip_port</replaceable> | <replaceable>*</replaceable> ) </optional>; </optional>
+ <optional> query-source-v6 <optional> address ( <replaceable>ip_addr</replaceable> | <replaceable>*</replaceable> ) </optional>
+ <optional> port ( <replaceable>ip_port</replaceable> | <replaceable>*</replaceable> ) </optional>; </optional>
<optional> use-queryport-pool <replaceable>yes_or_no</replaceable>; </optional>
<optional> queryport-pool-ports <replaceable>number</replaceable>; </optional>
<optional> queryport-pool-updateinterval <replaceable>number</replaceable>; </optional>
@@ -8526,7 +9557,8 @@ XXX: end of RFC1918 addresses #defined out -->
<title><command>statistics-channels</command> Statement Grammar</title>
<programlisting><command>statistics-channels</command> {
- [ inet ( ip_addr | * ) [ port ip_port ] [allow { <replaceable> address_match_list </replaceable> } ]; ]
+ [ inet ( ip_addr | * ) [ port ip_port ]
+ [ allow { <replaceable> address_match_list </replaceable> } ]; ]
[ inet ...; ]
};
</programlisting>
@@ -8590,7 +9622,7 @@ XXX: end of RFC1918 addresses #defined out -->
</sect2>
- <sect2>
+ <sect2 id="trusted-keys">
<title><command>trusted-keys</command> Statement Grammar</title>
<programlisting><command>trusted-keys</command> {
@@ -8632,6 +9664,136 @@ XXX: end of RFC1918 addresses #defined out -->
in the key data, so the configuration may be split up into
multiple lines.
</para>
+ <para>
+ <command>trusted-keys</command> may be set at the top level
+ of <filename>named.conf</filename> or within a view. If it is
+ set in both places, they are additive: keys defined at the top
+ level are inherited by all views, but keys defined in a view
+ are only used within that view.
+ </para>
+ </sect2>
+
+ <sect2>
+ <title><command>managed-keys</command> Statement Grammar</title>
+
+<programlisting><command>managed-keys</command> {
+ <replaceable>string</replaceable> initial-key <replaceable>number</replaceable> <replaceable>number</replaceable> <replaceable>number</replaceable> <replaceable>string</replaceable> ;
+ <optional> <replaceable>string</replaceable> initial-key <replaceable>number</replaceable> <replaceable>number</replaceable> <replaceable>number</replaceable> <replaceable>string</replaceable> ; <optional>...</optional></optional>
+};
+</programlisting>
+
+ </sect2>
+ <sect2 id="managed-keys">
+ <title><command>managed-keys</command> Statement Definition
+ and Usage</title>
+ <para>
+ The <command>managed-keys</command> statement, like
+ <command>trusted-keys</command>, defines DNSSEC
+ security roots. The difference is that
+ <command>managed-keys</command> can be kept up to date
+ automatically, without intervention from the resolver
+ operator.
+ </para>
+ <para>
+ Suppose, for example, that a zone's key-signing
+ key was compromised, and the zone owner had to revoke and
+ replace the key. A resolver which had the old key in a
+ <command>trusted-keys</command> statement would be
+ unable to validate this zone any longer; it would
+ reply with a SERVFAIL response code. This would
+ continue until the resolver operator had updated the
+ <command>trusted-keys</command> statement with the new key.
+ </para>
+ <para>
+ If, however, the zone were listed in a
+ <command>managed-keys</command> statement instead, then the
+ zone owner could add a "stand-by" key to the zone in advance.
+ <command>named</command> would store the stand-by key, and
+ when the original key was revoked, <command>named</command>
+ would be able to transition smoothly to the new key. It would
+ also recognize that the old key had been revoked, and cease
+ using that key to validate answers, minimizing the damage that
+ the compromised key could do.
+ </para>
+ <para>
+ A <command>managed-keys</command> statement contains a list of
+ the keys to be managed, along with information about how the
+ keys are to be initialized for the first time. The only
+ initialization method currently supported (as of
+ <acronym>BIND</acronym> 9.7.0) is <literal>initial-key</literal>.
+ This means the <command>managed-keys</command> statement must
+ contain a copy of the initializing key. (Future releases may
+ allow keys to be initialized by other methods, eliminating this
+ requirement.)
+ </para>
+ <para>
+ Consequently, a <command>managed-keys</command> statement
+ appears similar to a <command>trusted-keys</command>, differing
+ in the presence of the second field, containing the keyword
+ <literal>initial-key</literal>. The difference is, whereas the
+ keys listed in a <command>trusted-keys</command> continue to be
+ trusted until they are removed from
+ <filename>named.conf</filename>, an initializing key listed
+ in a <command>managed-keys</command> statement is only trusted
+ <emphasis>once</emphasis>: for as long as it takes to load the
+ managed key database and start the RFC 5011 key maintenance
+ process.
+ </para>
+ <para>
+ The first time <command>named</command> runs with a managed key
+ configured in <filename>named.conf</filename>, it fetches the
+ DNSKEY RRset directly from the zone apex, and validates it
+ using the key specified in the <command>managed-keys</command>
+ statement. If the DNSKEY RRset is validly signed, then it is
+ used as the basis for a new managed keys database.
+ </para>
+ <para>
+ From that point on, whenever <command>named</command> runs, it
+ sees the <command>managed-keys</command> statement, checks to
+ make sure RFC 5011 key maintenance has already been initialized
+ for the specified domain, and if so, it simply moves on. The
+ key specified in the <command>managed-keys</command> is not
+ used to validate answers; it has been superseded by the key or
+ keys stored in the managed keys database.
+ </para>
+ <para>
+ The next time <command>named</command> runs after a name
+ has been <emphasis>removed</emphasis> from the
+ <command>managed-keys</command> statement, the corresponding
+ zone will be removed from the managed keys database,
+ and RFC 5011 key maintenance will no longer be used for that
+ domain.
+ </para>
+ <para>
+ <command>named</command> only maintains a single managed keys
+ database; consequently, unlike <command>trusted-keys</command>,
+ <command>managed-keys</command> may only be set at the top
+ level of <filename>named.conf</filename>, not within a view.
+ </para>
+ <para>
+ In the current implementation, the managed keys database is
+ stored as a master-format zone file called
+ <filename>managed-keys.bind</filename>. When the key database
+ is changed, the zone is updated. As with any other dynamic
+ zone, changes will be written into a journal file,
+ <filename>managed-keys.bind.jnl</filename>. They are committed
+ to the master file as soon as possible afterward; in the case
+ of the managed key database, this will usually occur within 30
+ seconds. So, whenever <command>named</command> is using
+ automatic key maintenance, those two files can be expected to
+ exist in the working directory. (For this reason among others,
+ the working directory should be always be writable by
+ <command>named</command>.)
+ </para>
+ <para>
+ If the <command>dnssec-lookaside</command> option is
+ set to <userinput>auto</userinput>, <command>named</command>
+ will automatically initialize a managed key for the
+ zone <literal>dlv.isc.org</literal>. The key that is
+ used to initialize the key maintenance process is built
+ into <command>named</command>, and can be overridden
+ from <command>bindkeys-file</command>.
+ </para>
</sect2>
<sect2 id="view_statement_grammar">
@@ -8746,11 +9908,12 @@ XXX: end of RFC1918 addresses #defined out -->
// This should match our internal networks.
match-clients { 10.0.0.0/8; };
- // Provide recursive service to internal clients only.
+ // Provide recursive service to internal
+ // clients only.
recursion yes;
- // Provide a complete view of the example.com zone
- // including addresses of internal hosts.
+ // Provide a complete view of the example.com
+ // zone including addresses of internal hosts.
zone "example.com" {
type master;
file "example-internal.db";
@@ -8758,14 +9921,15 @@ XXX: end of RFC1918 addresses #defined out -->
};
view "external" {
- // Match all clients not matched by the previous view.
+ // Match all clients not matched by the
+ // previous view.
match-clients { any; };
// Refuse recursive service to external clients.
recursion no;
- // Provide a restricted view of the example.com zone
- // containing only publicly accessible hosts.
+ // Provide a restricted view of the example.com
+ // zone containing only publicly accessible hosts.
zone "example.com" {
type master;
file "example-external.db";
@@ -8784,8 +9948,9 @@ view "external" {
<optional> allow-query-on { <replaceable>address_match_list</replaceable> }; </optional>
<optional> allow-transfer { <replaceable>address_match_list</replaceable> }; </optional>
<optional> allow-update { <replaceable>address_match_list</replaceable> }; </optional>
- <optional> update-policy { <replaceable>update_policy_rule</replaceable> <optional>...</optional> }; </optional>
- <optional> also-notify { <replaceable>ip_addr</replaceable> <optional>port <replaceable>ip_port</replaceable></optional> ; <optional> <replaceable>ip_addr</replaceable> <optional>port <replaceable>ip_port</replaceable></optional> ; ... </optional> }; </optional>
+ <optional> update-policy <replaceable>local</replaceable> | { <replaceable>update_policy_rule</replaceable> <optional>...</optional> }; </optional>
+ <optional> also-notify { <replaceable>ip_addr</replaceable> <optional>port <replaceable>ip_port</replaceable></optional> ;
+ <optional> <replaceable>ip_addr</replaceable> <optional>port <replaceable>ip_port</replaceable></optional> ; ... </optional> }; </optional>
<optional> check-names (<constant>warn</constant>|<constant>fail</constant>|<constant>ignore</constant>) ; </optional>
<optional> check-mx (<constant>warn</constant>|<constant>fail</constant>|<constant>ignore</constant>) ; </optional>
<optional> check-wildcard <replaceable>yes_or_no</replaceable>; </optional>
@@ -8821,6 +9986,7 @@ view "external" {
<optional> min-retry-time <replaceable>number</replaceable> ; </optional>
<optional> max-retry-time <replaceable>number</replaceable> ; </optional>
<optional> key-directory <replaceable>path_name</replaceable>; </optional>
+ <optional> auto-dnssec <constant>allow</constant>|<constant>maintain</constant>|<constant>create</constant>|<constant>off</constant>; </optional>
<optional> zero-no-soa-ttl <replaceable>yes_or_no</replaceable> ; </optional>
};
@@ -8832,8 +9998,11 @@ zone <replaceable>zone_name</replaceable> <optional><replaceable>class</replacea
<optional> allow-transfer { <replaceable>address_match_list</replaceable> }; </optional>
<optional> allow-update-forwarding { <replaceable>address_match_list</replaceable> }; </optional>
<optional> update-check-ksk <replaceable>yes_or_no</replaceable>; </optional>
+ <optional> dnssec-dnskey-kskonly <replaceable>yes_or_no</replaceable>; </optional>
+ <optional> dnssec-secure-to-insecure <replaceable>yes_or_no</replaceable> ; </optional>
<optional> try-tcp-refresh <replaceable>yes_or_no</replaceable>; </optional>
- <optional> also-notify { <replaceable>ip_addr</replaceable> <optional>port <replaceable>ip_port</replaceable></optional> ; <optional> <replaceable>ip_addr</replaceable> <optional>port <replaceable>ip_port</replaceable></optional> ; ... </optional> }; </optional>
+ <optional> also-notify { <replaceable>ip_addr</replaceable> <optional>port <replaceable>ip_port</replaceable></optional> ;
+ <optional> <replaceable>ip_addr</replaceable> <optional>port <replaceable>ip_port</replaceable></optional> ; ... </optional> }; </optional>
<optional> check-names (<constant>warn</constant>|<constant>fail</constant>|<constant>ignore</constant>) ; </optional>
<optional> dialup <replaceable>dialup_option</replaceable> ; </optional>
<optional> file <replaceable>string</replaceable> ; </optional>
@@ -8846,7 +10015,9 @@ zone <replaceable>zone_name</replaceable> <optional><replaceable>class</replacea
<optional> ixfr-from-differences <replaceable>yes_or_no</replaceable>; </optional>
<optional> ixfr-tmp-file <replaceable>string</replaceable> ; </optional>
<optional> maintain-ixfr-base <replaceable>yes_or_no</replaceable> ; </optional>
- <optional> masters <optional>port <replaceable>ip_port</replaceable></optional> { ( <replaceable>masters_list</replaceable> | <replaceable>ip_addr</replaceable> <optional>port <replaceable>ip_port</replaceable></optional> <optional>key <replaceable>key</replaceable></optional> ) ; <optional>...</optional> }; </optional>
+ <optional> masters <optional>port <replaceable>ip_port</replaceable></optional> { ( <replaceable>masters_list</replaceable> | <replaceable>ip_addr</replaceable>
+ <optional>port <replaceable>ip_port</replaceable></optional>
+ <optional>key <replaceable>key</replaceable></optional> ) ; <optional>...</optional> }; </optional>
<optional> max-ixfr-log-size <replaceable>number</replaceable> ; </optional>
<optional> max-transfer-idle-in <replaceable>number</replaceable> ; </optional>
<optional> max-transfer-idle-out <replaceable>number</replaceable> ; </optional>
@@ -8859,7 +10030,8 @@ zone <replaceable>zone_name</replaceable> <optional><replaceable>class</replacea
<optional> transfer-source (<replaceable>ip4_addr</replaceable> | <constant>*</constant>) <optional>port <replaceable>ip_port</replaceable></optional> ; </optional>
<optional> transfer-source-v6 (<replaceable>ip6_addr</replaceable> | <constant>*</constant>) <optional>port <replaceable>ip_port</replaceable></optional> ; </optional>
<optional> alt-transfer-source (<replaceable>ip4_addr</replaceable> | <constant>*</constant>) <optional>port <replaceable>ip_port</replaceable></optional> ; </optional>
- <optional> alt-transfer-source-v6 (<replaceable>ip6_addr</replaceable> | <constant>*</constant>) <optional>port <replaceable>ip_port</replaceable></optional> ; </optional>
+ <optional> alt-transfer-source-v6 (<replaceable>ip6_addr</replaceable> | <constant>*</constant>)
+ <optional>port <replaceable>ip_port</replaceable></optional> ; </optional>
<optional> use-alt-transfer-source <replaceable>yes_or_no</replaceable>; </optional>
<optional> notify-source (<replaceable>ip4_addr</replaceable> | <constant>*</constant>) <optional>port <replaceable>ip_port</replaceable></optional> ; </optional>
<optional> notify-source-v6 (<replaceable>ip6_addr</replaceable> | <constant>*</constant>) <optional>port <replaceable>ip_port</replaceable></optional> ; </optional>
@@ -8877,7 +10049,7 @@ zone <replaceable>zone_name</replaceable> <optional><replaceable>class</replacea
type hint;
file <replaceable>string</replaceable> ;
<optional> delegation-only <replaceable>yes_or_no</replaceable> ; </optional>
- <optional> check-names (<constant>warn</constant>|<constant>fail</constant>|<constant>ignore</constant>) ; // Not Implemented. </optional>
+ <optional> check-names (<constant>warn</constant>|<constant>fail</constant>|<constant>ignore</constant>) ; </optional> // Not Implemented.
};
zone <replaceable>zone_name</replaceable> <optional><replaceable>class</replaceable></optional> {
@@ -8891,14 +10063,18 @@ zone <replaceable>zone_name</replaceable> <optional><replaceable>class</replacea
<optional> masterfile-format (<constant>text</constant>|<constant>raw</constant>) ; </optional>
<optional> forward (<constant>only</constant>|<constant>first</constant>) ; </optional>
<optional> forwarders { <optional> <replaceable>ip_addr</replaceable> <optional>port <replaceable>ip_port</replaceable></optional> ; ... </optional> }; </optional>
- <optional> masters <optional>port <replaceable>ip_port</replaceable></optional> { ( <replaceable>masters_list</replaceable> | <replaceable>ip_addr</replaceable> <optional>port <replaceable>ip_port</replaceable></optional> <optional>key <replaceable>key</replaceable></optional> ) ; <optional>...</optional> }; </optional>
+ <optional> masters <optional>port <replaceable>ip_port</replaceable></optional> { ( <replaceable>masters_list</replaceable> | <replaceable>ip_addr</replaceable>
+ <optional>port <replaceable>ip_port</replaceable></optional>
+ <optional>key <replaceable>key</replaceable></optional> ) ; <optional>...</optional> }; </optional>
<optional> max-transfer-idle-in <replaceable>number</replaceable> ; </optional>
<optional> max-transfer-time-in <replaceable>number</replaceable> ; </optional>
<optional> pubkey <replaceable>number</replaceable> <replaceable>number</replaceable> <replaceable>number</replaceable> <replaceable>string</replaceable> ; </optional>
<optional> transfer-source (<replaceable>ip4_addr</replaceable> | <constant>*</constant>) <optional>port <replaceable>ip_port</replaceable></optional> ; </optional>
- <optional> transfer-source-v6 (<replaceable>ip6_addr</replaceable> | <constant>*</constant>) <optional>port <replaceable>ip_port</replaceable></optional> ; </optional>
+ <optional> transfer-source-v6 (<replaceable>ip6_addr</replaceable> | <constant>*</constant>)
+ <optional>port <replaceable>ip_port</replaceable></optional> ; </optional>
<optional> alt-transfer-source (<replaceable>ip4_addr</replaceable> | <constant>*</constant>) <optional>port <replaceable>ip_port</replaceable></optional> ; </optional>
- <optional> alt-transfer-source-v6 (<replaceable>ip6_addr</replaceable> | <constant>*</constant>) <optional>port <replaceable>ip_port</replaceable></optional> ; </optional>
+ <optional> alt-transfer-source-v6 (<replaceable>ip6_addr</replaceable> | <constant>*</constant>)
+ <optional>port <replaceable>ip_port</replaceable></optional> ; </optional>
<optional> use-alt-transfer-source <replaceable>yes_or_no</replaceable>; </optional>
<optional> zone-statistics <replaceable>yes_or_no</replaceable> ; </optional>
<optional> database <replaceable>string</replaceable> ; </optional>
@@ -8910,6 +10086,14 @@ zone <replaceable>zone_name</replaceable> <optional><replaceable>class</replacea
};
zone <replaceable>zone_name</replaceable> <optional><replaceable>class</replaceable></optional> {
+ type static-stub;
+ <optional> allow-query { <replaceable>address_match_list</replaceable> }; </optional>
+ <optional> server-addresses { <optional> <replaceable>ip_addr</replaceable> ; ... </optional> }; </optional>
+ <optional> server-names { <optional> <replaceable>namelist</replaceable> </optional> }; </optional>
+ <optional> zone-statistics <replaceable>yes_or_no</replaceable> ; </optional>
+};
+
+zone <replaceable>zone_name</replaceable> <optional><replaceable>class</replaceable></optional> {
type forward;
<optional> forward (<constant>only</constant>|<constant>first</constant>) ; </optional>
<optional> forwarders { <optional> <replaceable>ip_addr</replaceable> <optional>port <replaceable>ip_port</replaceable></optional> ; ... </optional> }; </optional>
@@ -9056,6 +10240,55 @@ zone <replaceable>zone_name</replaceable> <optional><replaceable>class</replacea
<row rowsep="0">
<entry colname="1">
<para>
+ <varname>static-stub</varname>
+ </para>
+ </entry>
+ <entry colname="2">
+ <para>
+ A static-stub zone is similar to a stub zone
+ with the following exceptions:
+ the zone data is statically configured, rather
+ than transferred from a master server;
+ when recursion is necessary for a query that
+ matches a static-stub zone, the locally
+ configured data (nameserver names and glue addresses)
+ is always used even if different authoritative
+ information is cached.
+ </para>
+ <para>
+ Zone data is configured via the
+ <command>server-addresses</command> and
+ <command>server-names</command> zone options.
+ </para>
+ <para>
+ The zone data is maintained in the form of NS
+ and (if necessary) glue A or AAAA RRs
+ internally, which can be seen by dumping zone
+ databases by <command>rndc dumpdb -all</command>.
+ The configured RRs are considered local configuration
+ parameters rather than public data.
+ Non recursive queries (i.e., those with the RD
+ bit off) to a static-stub zone are therefore
+ prohibited and will be responded with REFUSED.
+ </para>
+ <para>
+ Since the data is statically configured, no
+ zone maintenance action takes place for a static-stub
+ zone.
+ For example, there is no periodic refresh
+ attempt, and an incoming notify message
+ will be rejected with an rcode of NOTAUTH.
+ </para>
+ <para>
+ Each static-stub zone is configured with
+ internally generated NS and (if necessary)
+ glue A or AAAA RRs
+ </para>
+ </entry>
+ </row>
+ <row rowsep="0">
+ <entry colname="1">
+ <para>
<varname>forward</varname>
</para>
</entry>
@@ -9270,6 +10503,7 @@ zone <replaceable>zone_name</replaceable> <optional><replaceable>class</replacea
received from the
network. The default varies according to zone type. For <command>master</command> zones the default is <command>fail</command>. For <command>slave</command>
zones the default is <command>warn</command>.
+ It is not implemented for <command>hint</command> zones.
</para>
</listitem>
</varlistentry>
@@ -9335,6 +10569,16 @@ zone <replaceable>zone_name</replaceable> <optional><replaceable>class</replacea
</varlistentry>
<varlistentry>
+ <term><command>dnssec-dnskey-kskonly</command></term>
+ <listitem>
+ <para>
+ See the description of
+ <command>dnssec-dnskey-kskonly</command> in <xref linkend="boolean_options"/>.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
<term><command>try-tcp-refresh</command></term>
<listitem>
<para>
@@ -9569,6 +10813,84 @@ zone <replaceable>zone_name</replaceable> <optional><replaceable>class</replacea
</varlistentry>
<varlistentry>
+ <term><command>server-addresses</command></term>
+ <listitem>
+ <para>
+ Only meaningful for static-stub zones.
+ This is a list of IP addresses to which queries
+ should be sent in recursive resolution for the
+ zone.
+ A non empty list for this option will internally
+ configure the apex NS RR with associated glue A or
+ AAAA RRs.
+ </para>
+ <para>
+ For example, if "example.com" is configured as a
+ static-stub zone with 192.0.2.1 and 2001:db8::1234
+ in a <command>server-addresses</command> option,
+ the following RRs will be internally configured.
+ </para>
+<programlisting>example.com. NS example.com.
+example.com. A 192.0.2.1
+example.com. AAAA 2001:db8::1234</programlisting>
+ <para>
+ These records are internally used to resolve
+ names under the static-stub zone.
+ For instance, if the server receives a query for
+ "www.example.com" with the RD bit on, the server
+ will initiate recursive resolution and send
+ queries to 192.0.2.1 and/or 2001:db8::1234.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term><command>server-names</command></term>
+ <listitem>
+ <para>
+ Only meaningful for static-stub zones.
+ This is a list of domain names of nameservers that
+ act as authoritative servers of the static-stub
+ zone.
+ These names will be resolved to IP addresses when
+ <command>named</command> needs to send queries to
+ these servers.
+ To make this supplemental resolution successful,
+ these names must not be a subdomain of the origin
+ name of static-stub zone.
+ That is, when "example.net" is the origin of a
+ static-stub zone, "ns.example" and
+ "master.example.com" can be specified in the
+ <command>server-names</command> option, but
+ "ns.example.net" cannot, and will be rejected by
+ the configuration parser.
+ </para>
+ <para>
+ A non empty list for this option will internally
+ configure the apex NS RR with the specified names.
+ For example, if "example.com" is configured as a
+ static-stub zone with "ns1.example.net" and
+ "ns2.example.net"
+ in a <command>server-names</command> option,
+ the following RRs will be internally configured.
+ </para>
+<programlisting>example.com. NS ns1.example.net.
+example.com. NS ns2.example.net.
+</programlisting>
+ <para>
+ These records are internally used to resolve
+ names under the static-stub zone.
+ For instance, if the server receives a query for
+ "www.example.com" with the RD bit on, the server
+ initiate recursive resolution,
+ resolve "ns1.example.net" and/or
+ "ns2.example.net" to IP addresses, and then send
+ queries to (one or more of) these addresses.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
<term><command>sig-validity-interval</command></term>
<listitem>
<para>
@@ -9716,6 +11038,51 @@ zone <replaceable>zone_name</replaceable> <optional><replaceable>class</replacea
</varlistentry>
<varlistentry>
+ <term><command>auto-dnssec</command></term>
+ <listitem>
+ <para>
+ Zones configured for dynamic DNS may also use this
+ option to allow varying levels of automatic DNSSEC key
+ management. There are four possible settings:
+ </para>
+ <para>
+ <command>auto-dnssec allow;</command> permits
+ keys to be updated and the zone fully re-signed
+ whenever the user issues the command <command>rndc sign
+ <replaceable>zonename</replaceable></command>.
+ </para>
+ <para>
+ <command>auto-dnssec maintain;</command> includes the
+ above, but also automatically adjusts the zone's DNSSEC
+ keys on schedule, according to the keys' timing metadata
+ (see <xref linkend="man.dnssec-keygen"/> and
+ <xref linkend="man.dnssec-settime"/>). The command
+ <command>rndc sign
+ <replaceable>zonename</replaceable></command> causes
+ <command>named</command> to load keys from the key
+ repository and sign the zone with all keys that are
+ active.
+ <command>rndc loadkeys
+ <replaceable>zonename</replaceable></command> causes
+ <command>named</command> to load keys from the key
+ repository and schedule key maintenance events to occur
+ in the future, but it does not sign the full zone
+ immediately.
+ </para>
+ <para>
+ <command>auto-dnssec create;</command> includes the
+ above, but also allows <command>named</command>
+ to create new keys in the key repository when needed.
+ (NOTE: This option is not yet implemented; the syntax is
+ being reserved for future use.)
+ </para>
+ <para>
+ The default setting is <command>auto-dnssec off</command>.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
<term><command>multi-master</command></term>
<listitem>
<para>
@@ -9735,6 +11102,16 @@ zone <replaceable>zone_name</replaceable> <optional><replaceable>class</replacea
</listitem>
</varlistentry>
+ <varlistentry>
+ <term><command>dnssec-secure-to-insecure</command></term>
+ <listitem>
+ <para>
+ See the description of
+ <command>dnssec-secure-to-insecure</command> in <xref linkend="boolean_options"/>.
+ </para>
+ </listitem>
+ </varlistentry>
+
</variablelist>
</sect3>
@@ -9753,15 +11130,14 @@ zone <replaceable>zone_name</replaceable> <optional><replaceable>class</replacea
record of any name in the zone.
</para>
<para>
- The <command>update-policy</command> clause is new
- in <acronym>BIND</acronym> 9 and allows more fine-grained
- control over what updates are allowed. A set of rules
- is specified, where each rule either grants or denies
- permissions for one or more names to be updated by
- one or more identities. If the dynamic update request
- message is signed (that is, it includes either a TSIG
- or SIG(0) record), the identity of the signer can be
- determined.
+ The <command>update-policy</command> clause
+ allows more fine-grained control over what updates are
+ allowed. A set of rules is specified, where each rule
+ either grants or denies permissions for one or more
+ names to be updated by one or more identities. If
+ the dynamic update request message is signed (that is,
+ it includes either a TSIG or SIG(0) record), the
+ identity of the signer can be determined.
</para>
<para>
Rules are specified in the <command>update-policy</command>
@@ -9773,24 +11149,53 @@ zone <replaceable>zone_name</replaceable> <optional><replaceable>class</replacea
only examines the signer of a message; the source
address is not relevant.
</para>
+ <para>
+ There is a pre-defined <command>update-policy</command>
+ rule which can be switched on with the command
+ <command>update-policy local;</command>.
+ Switching on this rule in a zone causes
+ <command>named</command> to generate a TSIG session
+ key and place it in a file, and to allow that key
+ to update the zone. (By default, the file is
+ <filename>/var/run/named/session.key</filename>, the key
+ name is "local-ddns" and the key algorithm is HMAC-SHA256,
+ but these values are configurable with the
+ <command>session-keyfile</command>,
+ <command>session-keyname</command> and
+ <command>session-keyalg</command> options, respectively).
+ </para>
+ <para>
+ A client running on the local system, and with appropriate
+ permissions, may read that file and use the key to sign update
+ requests. The zone's update policy will be set to allow that
+ key to change any record within the zone. Assuming the
+ key name is "local-ddns", this policy is equivalent to:
+ </para>
+
+ <programlisting>update-policy { grant local-ddns zonesub any; };
+ </programlisting>
<para>
- This is how a rule definition looks:
+ The command <command>nsupdate -l</command> sends update
+ requests to localhost, and signs them using the session key.
+ </para>
+
+ <para>
+ Other rule definitions look like this:
</para>
<programlisting>
-( <command>grant</command> | <command>deny</command> ) <replaceable>identity</replaceable> <replaceable>nametype</replaceable> <replaceable>name</replaceable> <optional> <replaceable>types</replaceable> </optional>
+( <command>grant</command> | <command>deny</command> ) <replaceable>identity</replaceable> <replaceable>nametype</replaceable> <optional> <replaceable>name</replaceable> </optional> <optional> <replaceable>types</replaceable> </optional>
</programlisting>
<para>
Each rule grants or denies privileges. Once a message has
successfully matched a rule, the operation is immediately
- granted
- or denied and no further rules are examined. A rule is matched
- when the signer matches the identity field, the name matches the
- name field in accordance with the nametype field, and the type
- matches
- the types specified in the type field.
+ granted or denied and no further rules are examined. A rule
+ is matched when the signer matches the identity field, the
+ name matches the name field in accordance with the nametype
+ field, and the type matches the types specified in the type
+ field.
</para>
<para>
No signer is required for <replaceable>tcp-self</replaceable>
@@ -9817,7 +11222,7 @@ zone <replaceable>zone_name</replaceable> <optional><replaceable>class</replacea
</para>
<para>
- The <replaceable>nametype</replaceable> field has 12
+ The <replaceable>nametype</replaceable> field has 13
values:
<varname>name</varname>, <varname>subdomain</varname>,
<varname>wildcard</varname>, <varname>self</varname>,
@@ -9825,7 +11230,8 @@ zone <replaceable>zone_name</replaceable> <optional><replaceable>class</replacea
<varname>krb5-self</varname>, <varname>ms-self</varname>,
<varname>krb5-subdomain</varname>,
<varname>ms-subdomain</varname>,
- <varname>tcp-self</varname> and <varname>6to4-self</varname>.
+ <varname>tcp-self</varname>, <varname>6to4-self</varname>,
+ <varname>zonesub</varname>, and <varname>external</varname>.
</para>
<informaltable>
<tgroup cols="2" colsep="0" rowsep="0" tgroupstyle="4Level-table">
@@ -9863,6 +11269,28 @@ zone <replaceable>zone_name</replaceable> <optional><replaceable>class</replacea
<row rowsep="0">
<entry colname="1">
<para>
+ <varname>zonesub</varname>
+ </para>
+ </entry> <entry colname="2">
+ <para>
+ This rule is similar to subdomain, except that
+ it matches when the name being updated is a
+ subdomain of the zone in which the
+ <command>update-policy</command> statement
+ appears. This obviates the need to type the zone
+ name twice, and enables the use of a standard
+ <command>update-policy</command> statement in
+ multiple zones without modification.
+ </para>
+ <para>
+ When this rule is used, the
+ <replaceable>name</replaceable> field is omitted.
+ </para>
+ </entry>
+ </row>
+ <row rowsep="0">
+ <entry colname="1">
+ <para>
<varname>wildcard</varname>
</para>
</entry> <entry colname="2">
@@ -9950,7 +11378,7 @@ zone <replaceable>zone_name</replaceable> <optional><replaceable>class</replacea
</entry> <entry colname="2">
<para>
Allow the 6to4 prefix to be update by any TCP
- conection from the 6to4 network or from the
+ connection from the 6to4 network or from the
corresponding IPv4 address. This is intended
to allow NS or DNAME RRsets to be added to the
reverse tree.
@@ -9961,14 +11389,56 @@ zone <replaceable>zone_name</replaceable> <optional><replaceable>class</replacea
</note>
</entry>
</row>
+ <row rowsep="0">
+ <entry colname="1">
+ <para>
+ <varname>external</varname>
+ </para>
+ </entry> <entry colname="2">
+ <para>
+ This rule allows <command>named</command>
+ to defer the decision of whether to allow a
+ given update to an external daemon.
+ </para>
+ <para>
+ The method of communicating with the daemon is
+ specified in the <replaceable>identity</replaceable>
+ field, the format of which is
+ "<constant>local:</constant><replaceable>path</replaceable>",
+ where <replaceable>path</replaceable> is the location
+ of a UNIX-domain socket. (Currently, "local" is the
+ only supported mechanism.)
+ </para>
+ <para>
+ Requests to the external daemon are sent over the
+ UNIX-domain socket as datagrams with the following
+ format:
+ </para>
+ <programlisting>
+ Protocol version number (4 bytes, network byte order, currently 1)
+ Request length (4 bytes, network byte order)
+ Signer (null-terminated string)
+ Name (null-terminated string)
+ TCP source address (null-terminated string)
+ Rdata type (null-terminated string)
+ Key (null-terminated string)
+ TKEY token length (4 bytes, network byte order)
+ TKEY token (remainder of packet)</programlisting>
+ <para>
+ The daemon replies with a four-byte value in
+ network byte order, containing either 0 or 1; 0
+ indicates that the specified update is not
+ permitted, and 1 indicates that it is.
+ </para>
+ </entry>
+ </row>
</tbody>
</tgroup>
</informaltable>
<para>
In all cases, the <replaceable>name</replaceable>
- field must
- specify a fully-qualified domain name.
+ field must specify a fully-qualified domain name.
</para>
<para>
@@ -11381,7 +12851,7 @@ WWW.EXAMPLE.COM. CNAME MAIN-SERVER.EXAMPLE.COM.
</para>
<programlisting>$ORIGIN 0.0.192.IN-ADDR.ARPA.
-$GENERATE 1-2 0 NS SERVER$.EXAMPLE.
+$GENERATE 1-2 @ NS SERVER$.EXAMPLE.
$GENERATE 1-127 $ CNAME $.0</programlisting>
<para>
@@ -11396,6 +12866,32 @@ $GENERATE 1-127 $ CNAME $.0</programlisting>
127.0.0.192.IN-ADDR.ARPA. CNAME 127.0.0.0.192.IN-ADDR.ARPA.
</programlisting>
+ <para>
+ Generate a set of A and MX records. Note the MX's right hand
+ side is a quoted string. The quotes will be stripped when the
+ right hand side is processed.
+ </para>
+
+<programlisting>
+$ORIGIN EXAMPLE.
+$GENERATE 1-127 HOST-$ A 1.2.3.$
+$GENERATE 1-127 HOST-$ MX "0 ."</programlisting>
+
+ <para>
+ is equivalent to
+ </para>
+
+<programlisting>HOST-1.EXAMPLE. A 1.2.3.1
+HOST-1.EXAMPLE. MX 0 .
+HOST-2.EXAMPLE. A 1.2.3.2
+HOST-2.EXAMPLE. MX 0 .
+HOST-3.EXAMPLE. A 1.2.3.3
+HOST-3.EXAMPLE. MX 0 .
+...
+HOST-127.EXAMPLE. A 1.2.3.127
+HOST-127.EXAMPLE. MX 0 .
+</programlisting>
+
<informaltable colsep="0" rowsep="0">
<tgroup cols="2" colsep="0" rowsep="0" tgroupstyle="3Level-table">
<colspec colname="1" colnum="1" colsep="0" colwidth="0.875in"/>
@@ -11445,20 +12941,30 @@ $GENERATE 1-127 $ CNAME $.0</programlisting>
Available output forms are decimal
(<command>d</command>), octal
- (<command>o</command>) and hexadecimal
+ (<command>o</command>), hexadecimal
(<command>x</command> or <command>X</command>
- for uppercase). The default modifier is
+ for uppercase) and nibble
+ (<command>n</command> or <command>N</command>\
+ for uppercase). The default modifier is
<command>${0,0,d}</command>. If the
<command>lhs</command> is not absolute, the
current <command>$ORIGIN</command> is appended
to the name.
</para>
- <para>
- For compatibility with earlier versions, <command>$$</command> is still
- recognized as indicating a literal $ in the output.
- </para>
- </entry>
- </row>
+ <para>
+ In nibble mode the value will be treated as
+ if it was a reversed hexadecimal string
+ with each hexadecimal digit as a separate
+ label. The width field includes the label
+ separator.
+ </para>
+ <para>
+ For compatibility with earlier versions,
+ <command>$$</command> is still recognized as
+ indicating a literal $ in the output.
+ </para>
+ </entry>
+ </row>
<row rowsep="0">
<entry colname="1">
<para><command>ttl</command></para>
@@ -11497,8 +13003,7 @@ $GENERATE 1-127 $ CNAME $.0</programlisting>
</entry>
<entry colname="2">
<para>
- At present the only supported types are
- PTR, CNAME, DNAME, A, AAAA and NS.
+ Any valid type.
</para>
</entry>
</row>
@@ -11508,8 +13013,7 @@ $GENERATE 1-127 $ CNAME $.0</programlisting>
</entry>
<entry colname="2">
<para>
- <command>rhs</command> is a domain name. It is processed
- similarly to lhs.
+ <command>rhs</command>, optionally, quoted string.
</para>
</entry>
</row>
@@ -11668,9 +13172,12 @@ $GENERATE 1-127 $ CNAME $.0</programlisting>
</entry>
<entry colname="2">
<para>
- The number of RRsets per RR type (positive
- or negative) and nonexistent names stored in the
- cache database.
+ The number of RRsets per RR type and nonexistent
+ names stored in the cache database.
+ If the exclamation mark (!) is printed for a RR
+ type, it means that particular type of RRset is
+ known to be nonexistent (this is also known as
+ "NXRRSET").
Maintained per view.
</para>
</entry>
@@ -12639,6 +14146,13 @@ $GENERATE 1-127 $ CNAME $.0</programlisting>
<entry colname="3">
<para>
Mismatch responses received.
+ The DNS ID, response's source address,
+ and/or the response's source port does not
+ match what was expected.
+ (The port must be 53 or as defined by
+ the <command>port</command> option.)
+ This may be an indication of a cache
+ poisoning attempt.
</para>
</entry>
</row>
@@ -13106,14 +14620,17 @@ $GENERATE 1-127 $ CNAME $.0</programlisting>
</para>
<programlisting>
-// Set up an ACL named "bogusnets" that will block RFC1918 space
-// and some reserved space, which is commonly used in spoofing attacks.
+// Set up an ACL named "bogusnets" that will block
+// RFC1918 space and some reserved space, which is
+// commonly used in spoofing attacks.
acl bogusnets {
- 0.0.0.0/8; 1.0.0.0/8; 2.0.0.0/8; 192.0.2.0/24; 224.0.0.0/3;
- 10.0.0.0/8; 172.16.0.0/12; 192.168.0.0/16;
+ 0.0.0.0/8; 1.0.0.0/8; 2.0.0.0/8; 192.0.2.0/24;
+ 224.0.0.0/3; 10.0.0.0/8; 172.16.0.0/12;
+ 192.168.0.0/16;
};
-// Set up an ACL called our-nets. Replace this with the real IP numbers.
+// Set up an ACL called our-nets. Replace this with the
+// real IP numbers.
acl our-nets { x.x.x.x/24; x.x.x.x/21; };
options {
...
@@ -14756,8 +16273,12 @@ zone "example.com" {
</bibliography>
</sect2>
</sect1>
+
+ <xi:include href="libdns.xml"/>
+
</appendix>
+
<reference id="Bv9ARM.ch10">
<title>Manual pages</title>
<xi:include href="../../bin/dig/dig.docbook"/>
@@ -14765,15 +16286,23 @@ zone "example.com" {
<xi:include href="../../bin/dnssec/dnssec-dsfromkey.docbook"/>
<xi:include href="../../bin/dnssec/dnssec-keyfromlabel.docbook"/>
<xi:include href="../../bin/dnssec/dnssec-keygen.docbook"/>
+ <xi:include href="../../bin/dnssec/dnssec-revoke.docbook"/>
+ <xi:include href="../../bin/dnssec/dnssec-settime.docbook"/>
<xi:include href="../../bin/dnssec/dnssec-signzone.docbook"/>
<xi:include href="../../bin/check/named-checkconf.docbook"/>
<xi:include href="../../bin/check/named-checkzone.docbook"/>
<xi:include href="../../bin/named/named.docbook"/>
+ <xi:include href="../../bin/tools/named-journalprint.docbook"/>
<!-- named.conf.docbook and others? -->
<xi:include href="../../bin/nsupdate/nsupdate.docbook"/>
<xi:include href="../../bin/rndc/rndc.docbook"/>
<xi:include href="../../bin/rndc/rndc.conf.docbook"/>
- <xi:include href="../../bin/rndc/rndc-confgen.docbook"/>
+ <xi:include href="../../bin/confgen/rndc-confgen.docbook"/>
+ <xi:include href="../../bin/confgen/ddns-confgen.docbook"/>
+ <xi:include href="../../bin/tools/arpaname.docbook"/>
+ <xi:include href="../../bin/tools/genrandom.docbook"/>
+ <xi:include href="../../bin/tools/isc-hmac-fixup.docbook"/>
+ <xi:include href="../../bin/tools/nsec3hash.docbook"/>
</reference>
</book>
diff --git a/contrib/bind9/doc/arm/Bv9ARM.ch01.html b/contrib/bind9/doc/arm/Bv9ARM.ch01.html
index 4cdfb09..ff2c5ce 100644
--- a/contrib/bind9/doc/arm/Bv9ARM.ch01.html
+++ b/contrib/bind9/doc/arm/Bv9ARM.ch01.html
@@ -1,5 +1,5 @@
<!--
- - Copyright (C) 2004-2010 Internet Systems Consortium, Inc. ("ISC")
+ - Copyright (C) 2004-2011 Internet Systems Consortium, Inc. ("ISC")
- Copyright (C) 2000-2003 Internet Software Consortium.
-
- Permission to use, copy, modify, and/or distribute this software for any
@@ -14,7 +14,7 @@
- OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
- PERFORMANCE OF THIS SOFTWARE.
-->
-<!-- $Id: Bv9ARM.ch01.html,v 1.43.48.4 2010-01-24 01:55:26 tbox Exp $ -->
+<!-- $Id: Bv9ARM.ch01.html,v 1.49 2011-01-05 01:14:07 tbox Exp $ -->
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
@@ -45,17 +45,17 @@
<div class="toc">
<p><b>Table of Contents</b></p>
<dl>
-<dt><span class="sect1"><a href="Bv9ARM.ch01.html#id2563412">Scope of Document</a></span></dt>
-<dt><span class="sect1"><a href="Bv9ARM.ch01.html#id2564391">Organization of This Document</a></span></dt>
-<dt><span class="sect1"><a href="Bv9ARM.ch01.html#id2564531">Conventions Used in This Document</a></span></dt>
-<dt><span class="sect1"><a href="Bv9ARM.ch01.html#id2564712">The Domain Name System (<acronym class="acronym">DNS</acronym>)</a></span></dt>
+<dt><span class="sect1"><a href="Bv9ARM.ch01.html#id2564371">Scope of Document</a></span></dt>
+<dt><span class="sect1"><a href="Bv9ARM.ch01.html#id2564394">Organization of This Document</a></span></dt>
+<dt><span class="sect1"><a href="Bv9ARM.ch01.html#id2564534">Conventions Used in This Document</a></span></dt>
+<dt><span class="sect1"><a href="Bv9ARM.ch01.html#id2564715">The Domain Name System (<acronym class="acronym">DNS</acronym>)</a></span></dt>
<dd><dl>
-<dt><span class="sect2"><a href="Bv9ARM.ch01.html#id2564733">DNS Fundamentals</a></span></dt>
-<dt><span class="sect2"><a href="Bv9ARM.ch01.html#id2564768">Domains and Domain Names</a></span></dt>
-<dt><span class="sect2"><a href="Bv9ARM.ch01.html#id2567173">Zones</a></span></dt>
-<dt><span class="sect2"><a href="Bv9ARM.ch01.html#id2567250">Authoritative Name Servers</a></span></dt>
-<dt><span class="sect2"><a href="Bv9ARM.ch01.html#id2567422">Caching Name Servers</a></span></dt>
-<dt><span class="sect2"><a href="Bv9ARM.ch01.html#id2567553">Name Servers in Multiple Roles</a></span></dt>
+<dt><span class="sect2"><a href="Bv9ARM.ch01.html#id2564737">DNS Fundamentals</a></span></dt>
+<dt><span class="sect2"><a href="Bv9ARM.ch01.html#id2564771">Domains and Domain Names</a></span></dt>
+<dt><span class="sect2"><a href="Bv9ARM.ch01.html#id2567176">Zones</a></span></dt>
+<dt><span class="sect2"><a href="Bv9ARM.ch01.html#id2567253">Authoritative Name Servers</a></span></dt>
+<dt><span class="sect2"><a href="Bv9ARM.ch01.html#id2567426">Caching Name Servers</a></span></dt>
+<dt><span class="sect2"><a href="Bv9ARM.ch01.html#id2567556">Name Servers in Multiple Roles</a></span></dt>
</dl></dd>
</dl>
</div>
@@ -71,7 +71,7 @@
</p>
<div class="sect1" lang="en">
<div class="titlepage"><div><div><h2 class="title" style="clear: both">
-<a name="id2563412"></a>Scope of Document</h2></div></div></div>
+<a name="id2564371"></a>Scope of Document</h2></div></div></div>
<p>
The Berkeley Internet Name Domain
(<acronym class="acronym">BIND</acronym>) implements a
@@ -82,12 +82,12 @@
system administrators.
</p>
<p>
- This version of the manual corresponds to BIND version 9.6.
+ This version of the manual corresponds to BIND version 9.7.
</p>
</div>
<div class="sect1" lang="en">
<div class="titlepage"><div><div><h2 class="title" style="clear: both">
-<a name="id2564391"></a>Organization of This Document</h2></div></div></div>
+<a name="id2564394"></a>Organization of This Document</h2></div></div></div>
<p>
In this document, <span class="emphasis"><em>Chapter 1</em></span> introduces
the basic <acronym class="acronym">DNS</acronym> and <acronym class="acronym">BIND</acronym> concepts. <span class="emphasis"><em>Chapter 2</em></span>
@@ -116,7 +116,7 @@
</div>
<div class="sect1" lang="en">
<div class="titlepage"><div><div><h2 class="title" style="clear: both">
-<a name="id2564531"></a>Conventions Used in This Document</h2></div></div></div>
+<a name="id2564534"></a>Conventions Used in This Document</h2></div></div></div>
<p>
In this document, we use the following general typographic
conventions:
@@ -243,7 +243,7 @@
</div>
<div class="sect1" lang="en">
<div class="titlepage"><div><div><h2 class="title" style="clear: both">
-<a name="id2564712"></a>The Domain Name System (<acronym class="acronym">DNS</acronym>)</h2></div></div></div>
+<a name="id2564715"></a>The Domain Name System (<acronym class="acronym">DNS</acronym>)</h2></div></div></div>
<p>
The purpose of this document is to explain the installation
and upkeep of the <acronym class="acronym">BIND</acronym> (Berkeley Internet
@@ -253,7 +253,7 @@
</p>
<div class="sect2" lang="en">
<div class="titlepage"><div><div><h3 class="title">
-<a name="id2564733"></a>DNS Fundamentals</h3></div></div></div>
+<a name="id2564737"></a>DNS Fundamentals</h3></div></div></div>
<p>
The Domain Name System (DNS) is a hierarchical, distributed
database. It stores information for mapping Internet host names to
@@ -275,7 +275,7 @@
</div>
<div class="sect2" lang="en">
<div class="titlepage"><div><div><h3 class="title">
-<a name="id2564768"></a>Domains and Domain Names</h3></div></div></div>
+<a name="id2564771"></a>Domains and Domain Names</h3></div></div></div>
<p>
The data stored in the DNS is identified by <span class="emphasis"><em>domain names</em></span> that are organized as a tree according to
organizational or administrative boundaries. Each node of the tree,
@@ -321,7 +321,7 @@
</div>
<div class="sect2" lang="en">
<div class="titlepage"><div><div><h3 class="title">
-<a name="id2567173"></a>Zones</h3></div></div></div>
+<a name="id2567176"></a>Zones</h3></div></div></div>
<p>
To properly operate a name server, it is important to understand
the difference between a <span class="emphasis"><em>zone</em></span>
@@ -374,7 +374,7 @@
</div>
<div class="sect2" lang="en">
<div class="titlepage"><div><div><h3 class="title">
-<a name="id2567250"></a>Authoritative Name Servers</h3></div></div></div>
+<a name="id2567253"></a>Authoritative Name Servers</h3></div></div></div>
<p>
Each zone is served by at least
one <span class="emphasis"><em>authoritative name server</em></span>,
@@ -391,7 +391,7 @@
</p>
<div class="sect3" lang="en">
<div class="titlepage"><div><div><h4 class="title">
-<a name="id2567273"></a>The Primary Master</h4></div></div></div>
+<a name="id2567276"></a>The Primary Master</h4></div></div></div>
<p>
The authoritative server where the master copy of the zone
data is maintained is called the
@@ -411,7 +411,7 @@
</div>
<div class="sect3" lang="en">
<div class="titlepage"><div><div><h4 class="title">
-<a name="id2567303"></a>Slave Servers</h4></div></div></div>
+<a name="id2567374"></a>Slave Servers</h4></div></div></div>
<p>
The other authoritative servers, the <span class="emphasis"><em>slave</em></span>
servers (also known as <span class="emphasis"><em>secondary</em></span> servers)
@@ -427,7 +427,7 @@
</div>
<div class="sect3" lang="en">
<div class="titlepage"><div><div><h4 class="title">
-<a name="id2567393"></a>Stealth Servers</h4></div></div></div>
+<a name="id2567396"></a>Stealth Servers</h4></div></div></div>
<p>
Usually all of the zone's authoritative servers are listed in
NS records in the parent zone. These NS records constitute
@@ -462,7 +462,7 @@
</div>
<div class="sect2" lang="en">
<div class="titlepage"><div><div><h3 class="title">
-<a name="id2567422"></a>Caching Name Servers</h3></div></div></div>
+<a name="id2567426"></a>Caching Name Servers</h3></div></div></div>
<p>
The resolver libraries provided by most operating systems are
<span class="emphasis"><em>stub resolvers</em></span>, meaning that they are not
@@ -489,7 +489,7 @@
</p>
<div class="sect3" lang="en">
<div class="titlepage"><div><div><h4 class="title">
-<a name="id2567526"></a>Forwarding</h4></div></div></div>
+<a name="id2567529"></a>Forwarding</h4></div></div></div>
<p>
Even a caching name server does not necessarily perform
the complete recursive lookup itself. Instead, it can
@@ -516,7 +516,7 @@
</div>
<div class="sect2" lang="en">
<div class="titlepage"><div><div><h3 class="title">
-<a name="id2567553"></a>Name Servers in Multiple Roles</h3></div></div></div>
+<a name="id2567556"></a>Name Servers in Multiple Roles</h3></div></div></div>
<p>
The <acronym class="acronym">BIND</acronym> name server can
simultaneously act as
diff --git a/contrib/bind9/doc/arm/Bv9ARM.ch02.html b/contrib/bind9/doc/arm/Bv9ARM.ch02.html
index 5181a2a..a9fde32 100644
--- a/contrib/bind9/doc/arm/Bv9ARM.ch02.html
+++ b/contrib/bind9/doc/arm/Bv9ARM.ch02.html
@@ -1,5 +1,5 @@
<!--
- - Copyright (C) 2004-2010 Internet Systems Consortium, Inc. ("ISC")
+ - Copyright (C) 2004-2011 Internet Systems Consortium, Inc. ("ISC")
- Copyright (C) 2000-2003 Internet Software Consortium.
-
- Permission to use, copy, modify, and/or distribute this software for any
@@ -14,7 +14,7 @@
- OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
- PERFORMANCE OF THIS SOFTWARE.
-->
-<!-- $Id: Bv9ARM.ch02.html,v 1.38.56.3 2010-01-24 01:55:25 tbox Exp $ -->
+<!-- $Id: Bv9ARM.ch02.html,v 1.43 2011-01-05 01:14:07 tbox Exp $ -->
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
@@ -45,16 +45,16 @@
<div class="toc">
<p><b>Table of Contents</b></p>
<dl>
-<dt><span class="sect1"><a href="Bv9ARM.ch02.html#id2567587">Hardware requirements</a></span></dt>
-<dt><span class="sect1"><a href="Bv9ARM.ch02.html#id2567613">CPU Requirements</a></span></dt>
-<dt><span class="sect1"><a href="Bv9ARM.ch02.html#id2567626">Memory Requirements</a></span></dt>
-<dt><span class="sect1"><a href="Bv9ARM.ch02.html#id2567721">Name Server Intensive Environment Issues</a></span></dt>
-<dt><span class="sect1"><a href="Bv9ARM.ch02.html#id2567732">Supported Operating Systems</a></span></dt>
+<dt><span class="sect1"><a href="Bv9ARM.ch02.html#id2567590">Hardware requirements</a></span></dt>
+<dt><span class="sect1"><a href="Bv9ARM.ch02.html#id2567617">CPU Requirements</a></span></dt>
+<dt><span class="sect1"><a href="Bv9ARM.ch02.html#id2567629">Memory Requirements</a></span></dt>
+<dt><span class="sect1"><a href="Bv9ARM.ch02.html#id2567724">Name Server Intensive Environment Issues</a></span></dt>
+<dt><span class="sect1"><a href="Bv9ARM.ch02.html#id2567735">Supported Operating Systems</a></span></dt>
</dl>
</div>
<div class="sect1" lang="en">
<div class="titlepage"><div><div><h2 class="title" style="clear: both">
-<a name="id2567587"></a>Hardware requirements</h2></div></div></div>
+<a name="id2567590"></a>Hardware requirements</h2></div></div></div>
<p>
<acronym class="acronym">DNS</acronym> hardware requirements have
traditionally been quite modest.
@@ -73,7 +73,7 @@
</div>
<div class="sect1" lang="en">
<div class="titlepage"><div><div><h2 class="title" style="clear: both">
-<a name="id2567613"></a>CPU Requirements</h2></div></div></div>
+<a name="id2567617"></a>CPU Requirements</h2></div></div></div>
<p>
CPU requirements for <acronym class="acronym">BIND</acronym> 9 range from
i486-class machines
@@ -84,7 +84,7 @@
</div>
<div class="sect1" lang="en">
<div class="titlepage"><div><div><h2 class="title" style="clear: both">
-<a name="id2567626"></a>Memory Requirements</h2></div></div></div>
+<a name="id2567629"></a>Memory Requirements</h2></div></div></div>
<p>
The memory of the server has to be large enough to fit the
cache and zones loaded off disk. The <span><strong class="command">max-cache-size</strong></span>
@@ -107,7 +107,7 @@
</div>
<div class="sect1" lang="en">
<div class="titlepage"><div><div><h2 class="title" style="clear: both">
-<a name="id2567721"></a>Name Server Intensive Environment Issues</h2></div></div></div>
+<a name="id2567724"></a>Name Server Intensive Environment Issues</h2></div></div></div>
<p>
For name server intensive environments, there are two alternative
configurations that may be used. The first is where clients and
@@ -124,13 +124,13 @@
</div>
<div class="sect1" lang="en">
<div class="titlepage"><div><div><h2 class="title" style="clear: both">
-<a name="id2567732"></a>Supported Operating Systems</h2></div></div></div>
+<a name="id2567735"></a>Supported Operating Systems</h2></div></div></div>
<p>
ISC <acronym class="acronym">BIND</acronym> 9 compiles and runs on a large
number
- of Unix-like operating systems and on NT-derived versions of
- Microsoft Windows such as Windows 2000 and Windows XP. For an
- up-to-date
+ of Unix-like operating systems and on
+ Microsoft Windows Server 2003 and 2008, and Windows XP and Vista.
+ For an up-to-date
list of supported systems, see the README file in the top level
directory
of the BIND 9 source distribution.
diff --git a/contrib/bind9/doc/arm/Bv9ARM.ch03.html b/contrib/bind9/doc/arm/Bv9ARM.ch03.html
index 454fdd6..e01d69e 100644
--- a/contrib/bind9/doc/arm/Bv9ARM.ch03.html
+++ b/contrib/bind9/doc/arm/Bv9ARM.ch03.html
@@ -1,5 +1,5 @@
<!--
- - Copyright (C) 2004-2010 Internet Systems Consortium, Inc. ("ISC")
+ - Copyright (C) 2004-2011 Internet Systems Consortium, Inc. ("ISC")
- Copyright (C) 2000-2003 Internet Software Consortium.
-
- Permission to use, copy, modify, and/or distribute this software for any
@@ -14,7 +14,7 @@
- OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
- PERFORMANCE OF THIS SOFTWARE.
-->
-<!-- $Id: Bv9ARM.ch03.html,v 1.71.48.4 2010-01-24 01:55:25 tbox Exp $ -->
+<!-- $Id: Bv9ARM.ch03.html,v 1.83 2011-01-21 01:14:13 tbox Exp $ -->
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
@@ -47,14 +47,14 @@
<dl>
<dt><span class="sect1"><a href="Bv9ARM.ch03.html#sample_configuration">Sample Configurations</a></span></dt>
<dd><dl>
-<dt><span class="sect2"><a href="Bv9ARM.ch03.html#id2567764">A Caching-only Name Server</a></span></dt>
-<dt><span class="sect2"><a href="Bv9ARM.ch03.html#id2567780">An Authoritative-only Name Server</a></span></dt>
+<dt><span class="sect2"><a href="Bv9ARM.ch03.html#id2567767">A Caching-only Name Server</a></span></dt>
+<dt><span class="sect2"><a href="Bv9ARM.ch03.html#id2567988">An Authoritative-only Name Server</a></span></dt>
</dl></dd>
-<dt><span class="sect1"><a href="Bv9ARM.ch03.html#id2568007">Load Balancing</a></span></dt>
-<dt><span class="sect1"><a href="Bv9ARM.ch03.html#id2568361">Name Server Operations</a></span></dt>
+<dt><span class="sect1"><a href="Bv9ARM.ch03.html#id2568010">Load Balancing</a></span></dt>
+<dt><span class="sect1"><a href="Bv9ARM.ch03.html#id2568364">Name Server Operations</a></span></dt>
<dd><dl>
-<dt><span class="sect2"><a href="Bv9ARM.ch03.html#id2568366">Tools for Use With the Name Server Daemon</a></span></dt>
-<dt><span class="sect2"><a href="Bv9ARM.ch03.html#id2570006">Signals</a></span></dt>
+<dt><span class="sect2"><a href="Bv9ARM.ch03.html#id2568370">Tools for Use With the Name Server Daemon</a></span></dt>
+<dt><span class="sect2"><a href="Bv9ARM.ch03.html#id2570385">Signals</a></span></dt>
</dl></dd>
</dl>
</div>
@@ -68,7 +68,7 @@
<a name="sample_configuration"></a>Sample Configurations</h2></div></div></div>
<div class="sect2" lang="en">
<div class="titlepage"><div><div><h3 class="title">
-<a name="id2567764"></a>A Caching-only Name Server</h3></div></div></div>
+<a name="id2567767"></a>A Caching-only Name Server</h3></div></div></div>
<p>
The following sample configuration is appropriate for a caching-only
name server for use by clients internal to a corporation. All
@@ -82,10 +82,13 @@
// Two corporate subnets we wish to allow queries from.
acl corpnets { 192.168.4.0/24; 192.168.7.0/24; };
options {
- directory "/etc/namedb"; // Working directory
+ // Working directory
+ directory "/etc/namedb";
+
allow-query { corpnets; };
};
-// Provide a reverse mapping for the loopback address 127.0.0.1
+// Provide a reverse mapping for the loopback
+// address 127.0.0.1
zone "0.0.127.in-addr.arpa" {
type master;
file "localhost.rev";
@@ -95,7 +98,7 @@ zone "0.0.127.in-addr.arpa" {
</div>
<div class="sect2" lang="en">
<div class="titlepage"><div><div><h3 class="title">
-<a name="id2567780"></a>An Authoritative-only Name Server</h3></div></div></div>
+<a name="id2567988"></a>An Authoritative-only Name Server</h3></div></div></div>
<p>
This sample configuration is for an authoritative-only server
that is the master server for "<code class="filename">example.com</code>"
@@ -103,13 +106,18 @@ zone "0.0.127.in-addr.arpa" {
</p>
<pre class="programlisting">
options {
- directory "/etc/namedb"; // Working directory
- allow-query-cache { none; }; // Do not allow access to cache
- allow-query { any; }; // This is the default
- recursion no; // Do not provide recursive service
+ // Working directory
+ directory "/etc/namedb";
+ // Do not allow access to cache
+ allow-query-cache { none; };
+ // This is the default
+ allow-query { any; };
+ // Do not provide recursive service
+ recursion no;
};
-// Provide a reverse mapping for the loopback address 127.0.0.1
+// Provide a reverse mapping for the loopback
+// address 127.0.0.1
zone "0.0.127.in-addr.arpa" {
type master;
file "localhost.rev";
@@ -119,7 +127,8 @@ zone "0.0.127.in-addr.arpa" {
zone "example.com" {
type master;
file "example.com.db";
- // IP addresses of slave servers allowed to transfer example.com
+ // IP addresses of slave servers allowed to
+ // transfer example.com
allow-transfer {
192.168.4.14;
192.168.5.53;
@@ -137,7 +146,7 @@ zone "eng.example.com" {
</div>
<div class="sect1" lang="en">
<div class="titlepage"><div><div><h2 class="title" style="clear: both">
-<a name="id2568007"></a>Load Balancing</h2></div></div></div>
+<a name="id2568010"></a>Load Balancing</h2></div></div></div>
<p>
A primitive form of load balancing can be achieved in
the <acronym class="acronym">DNS</acronym> by using multiple records
@@ -273,17 +282,17 @@ zone "eng.example.com" {
</p>
<p>
For more detail on ordering responses, check the
- <span><strong class="command">rrset-order</strong></span> substatement in the
+ <span><strong class="command">rrset-order</strong></span> sub-statement in the
<span><strong class="command">options</strong></span> statement, see
<a href="Bv9ARM.ch06.html#rrset_ordering">RRset Ordering</a>.
</p>
</div>
<div class="sect1" lang="en">
<div class="titlepage"><div><div><h2 class="title" style="clear: both">
-<a name="id2568361"></a>Name Server Operations</h2></div></div></div>
+<a name="id2568364"></a>Name Server Operations</h2></div></div></div>
<div class="sect2" lang="en">
<div class="titlepage"><div><div><h3 class="title">
-<a name="id2568366"></a>Tools for Use With the Name Server Daemon</h3></div></div></div>
+<a name="id2568370"></a>Tools for Use With the Name Server Daemon</h3></div></div></div>
<p>
This section describes several indispensable diagnostic,
administrative and monitoring tools available to the system
@@ -463,6 +472,60 @@ zone "eng.example.com" {
<dd><p>
Retransfer the given zone from the master.
</p></dd>
+<dt><span class="term"><strong class="userinput"><code>sign <em class="replaceable"><code>zone</code></em>
+ [<span class="optional"><em class="replaceable"><code>class</code></em>
+ [<span class="optional"><em class="replaceable"><code>view</code></em></span>]</span>]</code></strong></span></dt>
+<dd>
+<p>
+ Fetch all DNSSEC keys for the given zone
+ from the key directory (see
+ <span><strong class="command">key-directory</strong></span> in
+ <a href="Bv9ARM.ch06.html#options" title="options Statement Definition and
+ Usage">the section called &#8220;<span><strong class="command">options</strong></span> Statement Definition and
+ Usage&#8221;</a>). If they are within
+ their publication period, merge them into the
+ zone's DNSKEY RRset. If the DNSKEY RRset
+ is changed, then the zone is automatically
+ re-signed with the new key set.
+ </p>
+<p>
+ This command requires that the
+ <span><strong class="command">auto-dnssec</strong></span> zone option to be set
+ to <code class="literal">allow</code>,
+ <code class="literal">maintain</code>, or
+ <code class="literal">create</code>, and also requires
+ the zone to be configured to allow dynamic DNS.
+ See <a href="Bv9ARM.ch06.html#dynamic_update_policies" title="Dynamic Update Policies">the section called &#8220;Dynamic Update Policies&#8221;</a> for
+ more details.
+ </p>
+</dd>
+<dt><span class="term"><strong class="userinput"><code>loadkeys <em class="replaceable"><code>zone</code></em>
+ [<span class="optional"><em class="replaceable"><code>class</code></em>
+ [<span class="optional"><em class="replaceable"><code>view</code></em></span>]</span>]</code></strong></span></dt>
+<dd>
+<p>
+ Fetch all DNSSEC keys for the given zone
+ from the key directory (see
+ <span><strong class="command">key-directory</strong></span> in
+ <a href="Bv9ARM.ch06.html#options" title="options Statement Definition and
+ Usage">the section called &#8220;<span><strong class="command">options</strong></span> Statement Definition and
+ Usage&#8221;</a>). If they are within
+ their publication period, merge them into the
+ zone's DNSKEY RRset. Unlike <span><strong class="command">rndc
+ sign</strong></span>, however, the zone is not
+ immediately re-signed by the new keys, but is
+ allowed to incrementally re-sign over time.
+ </p>
+<p>
+ This command requires that the
+ <span><strong class="command">auto-dnssec</strong></span> zone option to
+ be set to <code class="literal">maintain</code> or
+ <code class="literal">create</code>, and also requires
+ the zone to be configured to allow dynamic DNS.
+ See <a href="Bv9ARM.ch06.html#dynamic_update_policies" title="Dynamic Update Policies">the section called &#8220;Dynamic Update Policies&#8221;</a> for
+ more details.
+ </p>
+</dd>
<dt><span class="term"><strong class="userinput"><code>freeze
[<span class="optional"><em class="replaceable"><code>zone</code></em>
[<span class="optional"><em class="replaceable"><code>class</code></em>
@@ -536,6 +599,14 @@ zone "eng.example.com" {
specified, all
views are dumped.
</p></dd>
+<dt><span class="term"><strong class="userinput"><code>secroots
+ [<span class="optional"><em class="replaceable"><code>view ...</code></em></span>]</code></strong></span></dt>
+<dd><p>
+ Dump the server's security roots to the secroots
+ file for the specified views. If no view is
+ specified, security roots for all
+ views are dumped.
+ </p></dd>
<dt><span class="term"><strong class="userinput"><code>stop [<span class="optional">-p</span>]</code></strong></span></dt>
<dd><p>
Stop the server, making sure any recent changes
@@ -599,6 +670,57 @@ zone "eng.example.com" {
set to <strong class="userinput"><code>yes</code></strong> to be effective.
It defaults to enabled.
</p></dd>
+<dt><span class="term"><strong class="userinput"><code>addzone
+ <em class="replaceable"><code>zone</code></em>
+ [<span class="optional"><em class="replaceable"><code>class</code></em>
+ [<span class="optional"><em class="replaceable"><code>view</code></em></span>]</span>]
+ <em class="replaceable"><code>configuration</code></em>
+ </code></strong></span></dt>
+<dd>
+<p>
+ Add a zone while the server is running. This
+ command requires the
+ <span><strong class="command">allow-new-zones</strong></span> option to be set
+ to <strong class="userinput"><code>yes</code></strong>. The
+ <em class="replaceable"><code>configuration</code></em> string
+ specified on the command line is the zone
+ configuration text that would ordinarily be
+ placed in <code class="filename">named.conf</code>.
+ </p>
+<p>
+ The configuration is saved in a file called
+ <code class="filename"><em class="replaceable"><code>hash</code></em>.nzf</code>,
+ where <em class="replaceable"><code>hash</code></em> is a
+ cryptographic hash generated from the name of
+ the view. When <span><strong class="command">named</strong></span> is
+ restarted, the file will be loaded into the view
+ configuration, so that zones that were added
+ can persist after a restart.
+ </p>
+<p>
+ This sample <span><strong class="command">addzone</strong></span> command
+ would add the zone <code class="literal">example.com</code>
+ to the default view:
+ </p>
+<p>
+<code class="prompt">$ </code><strong class="userinput"><code>rndc addzone example.com '{ type master; file "example.com.db"; };'</code></strong>
+ </p>
+<p>
+ (Note the brackets and semi-colon around the zone
+ configuration text.)
+ </p>
+</dd>
+<dt><span class="term"><strong class="userinput"><code>delzone
+ <em class="replaceable"><code>zone</code></em>
+ [<span class="optional"><em class="replaceable"><code>class</code></em>
+ [<span class="optional"><em class="replaceable"><code>view</code></em></span>]</span>]
+ </code></strong></span></dt>
+<dd><p>
+ Delete a zone while the server is running.
+ Only zones that were originally added via
+ <span><strong class="command">rndc addzone</strong></span> can be deleted
+ in this matter.
+ </p></dd>
</dl></div>
<p>
A configuration file is required, since all
@@ -699,7 +821,8 @@ zone "eng.example.com" {
<pre class="programlisting">
key rndc_key {
algorithm "hmac-md5";
- secret "c3Ryb25nIGVub3VnaCBmb3IgYSBtYW4gYnV0IG1hZGUgZm9yIGEgd29tYW4K";
+ secret
+ "c3Ryb25nIGVub3VnaCBmb3IgYSBtYW4gYnV0IG1hZGUgZm9yIGEgd29tYW4K";
};
options {
default-server 127.0.0.1;
@@ -721,7 +844,8 @@ options {
</p>
<pre class="programlisting">
controls {
- inet 127.0.0.1 allow { localhost; } keys { rndc_key; };
+ inet 127.0.0.1
+ allow { localhost; } keys { rndc_key; };
};
</pre>
<p>
@@ -749,7 +873,7 @@ controls {
</div>
<div class="sect2" lang="en">
<div class="titlepage"><div><div><h3 class="title">
-<a name="id2570006"></a>Signals</h3></div></div></div>
+<a name="id2570385"></a>Signals</h3></div></div></div>
<p>
Certain UNIX signals cause the name server to take specific
actions, as described in the following table. These signals can
diff --git a/contrib/bind9/doc/arm/Bv9ARM.ch04.html b/contrib/bind9/doc/arm/Bv9ARM.ch04.html
index 7b8a200..77b74cb 100644
--- a/contrib/bind9/doc/arm/Bv9ARM.ch04.html
+++ b/contrib/bind9/doc/arm/Bv9ARM.ch04.html
@@ -1,5 +1,5 @@
<!--
- - Copyright (C) 2004-2010 Internet Systems Consortium, Inc. ("ISC")
+ - Copyright (C) 2004-2011 Internet Systems Consortium, Inc. ("ISC")
- Copyright (C) 2000-2003 Internet Software Consortium.
-
- Permission to use, copy, modify, and/or distribute this software for any
@@ -14,7 +14,7 @@
- OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
- PERFORMANCE OF THIS SOFTWARE.
-->
-<!-- $Id: Bv9ARM.ch04.html,v 1.87.48.6 2010-01-24 01:55:26 tbox Exp $ -->
+<!-- $Id: Bv9ARM.ch04.html,v 1.125.8.1.2.1 2011-06-09 03:41:07 tbox Exp $ -->
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
@@ -49,29 +49,59 @@
<dt><span class="sect1"><a href="Bv9ARM.ch04.html#dynamic_update">Dynamic Update</a></span></dt>
<dd><dl><dt><span class="sect2"><a href="Bv9ARM.ch04.html#journal">The journal file</a></span></dt></dl></dd>
<dt><span class="sect1"><a href="Bv9ARM.ch04.html#incremental_zone_transfers">Incremental Zone Transfers (IXFR)</a></span></dt>
-<dt><span class="sect1"><a href="Bv9ARM.ch04.html#id2570492">Split DNS</a></span></dt>
-<dd><dl><dt><span class="sect2"><a href="Bv9ARM.ch04.html#id2570510">Example split DNS setup</a></span></dt></dl></dd>
+<dt><span class="sect1"><a href="Bv9ARM.ch04.html#id2570823">Split DNS</a></span></dt>
+<dd><dl><dt><span class="sect2"><a href="Bv9ARM.ch04.html#id2570841">Example split DNS setup</a></span></dt></dl></dd>
<dt><span class="sect1"><a href="Bv9ARM.ch04.html#tsig">TSIG</a></span></dt>
<dd><dl>
-<dt><span class="sect2"><a href="Bv9ARM.ch04.html#id2571082">Generate Shared Keys for Each Pair of Hosts</a></span></dt>
-<dt><span class="sect2"><a href="Bv9ARM.ch04.html#id2571156">Copying the Shared Secret to Both Machines</a></span></dt>
-<dt><span class="sect2"><a href="Bv9ARM.ch04.html#id2571166">Informing the Servers of the Key's Existence</a></span></dt>
-<dt><span class="sect2"><a href="Bv9ARM.ch04.html#id2571203">Instructing the Server to Use the Key</a></span></dt>
-<dt><span class="sect2"><a href="Bv9ARM.ch04.html#id2571260">TSIG Key Based Access Control</a></span></dt>
-<dt><span class="sect2"><a href="Bv9ARM.ch04.html#id2571445">Errors</a></span></dt>
+<dt><span class="sect2"><a href="Bv9ARM.ch04.html#id2571342">Generate Shared Keys for Each Pair of Hosts</a></span></dt>
+<dt><span class="sect2"><a href="Bv9ARM.ch04.html#id2571553">Copying the Shared Secret to Both Machines</a></span></dt>
+<dt><span class="sect2"><a href="Bv9ARM.ch04.html#id2571563">Informing the Servers of the Key's Existence</a></span></dt>
+<dt><span class="sect2"><a href="Bv9ARM.ch04.html#id2571600">Instructing the Server to Use the Key</a></span></dt>
+<dt><span class="sect2"><a href="Bv9ARM.ch04.html#id2571657">TSIG Key Based Access Control</a></span></dt>
+<dt><span class="sect2"><a href="Bv9ARM.ch04.html#id2571706">Errors</a></span></dt>
</dl></dd>
-<dt><span class="sect1"><a href="Bv9ARM.ch04.html#id2571459">TKEY</a></span></dt>
-<dt><span class="sect1"><a href="Bv9ARM.ch04.html#id2571576">SIG(0)</a></span></dt>
+<dt><span class="sect1"><a href="Bv9ARM.ch04.html#id2571720">TKEY</a></span></dt>
+<dt><span class="sect1"><a href="Bv9ARM.ch04.html#id2563987">SIG(0)</a></span></dt>
<dt><span class="sect1"><a href="Bv9ARM.ch04.html#DNSSEC">DNSSEC</a></span></dt>
<dd><dl>
-<dt><span class="sect2"><a href="Bv9ARM.ch04.html#id2571644">Generating Keys</a></span></dt>
-<dt><span class="sect2"><a href="Bv9ARM.ch04.html#id2571792">Signing the Zone</a></span></dt>
-<dt><span class="sect2"><a href="Bv9ARM.ch04.html#id2571873">Configuring Servers</a></span></dt>
+<dt><span class="sect2"><a href="Bv9ARM.ch04.html#id2564055">Generating Keys</a></span></dt>
+<dt><span class="sect2"><a href="Bv9ARM.ch04.html#id2572189">Signing the Zone</a></span></dt>
+<dt><span class="sect2"><a href="Bv9ARM.ch04.html#id2572270">Configuring Servers</a></span></dt>
</dl></dd>
-<dt><span class="sect1"><a href="Bv9ARM.ch04.html#id2572110">IPv6 Support in <acronym class="acronym">BIND</acronym> 9</a></span></dt>
+<dt><span class="sect1"><a href="Bv9ARM.ch04.html#dnssec.dynamic.zones">DNSSEC, Dynamic Zones, and Automatic Signing</a></span></dt>
<dd><dl>
-<dt><span class="sect2"><a href="Bv9ARM.ch04.html#id2572172">Address Lookups Using AAAA Records</a></span></dt>
-<dt><span class="sect2"><a href="Bv9ARM.ch04.html#id2572194">Address to Name Lookups Using Nibble Format</a></span></dt>
+<dt><span class="sect2"><a href="Bv9ARM.ch04.html#id2607351">Converting from insecure to secure</a></span></dt>
+<dt><span class="sect2"><a href="Bv9ARM.ch04.html#id2563493">Dynamic DNS update method</a></span></dt>
+<dt><span class="sect2"><a href="Bv9ARM.ch04.html#id2563529">Fully automatic zone signing</a></span></dt>
+<dt><span class="sect2"><a href="Bv9ARM.ch04.html#id2563611">Private-type records</a></span></dt>
+<dt><span class="sect2"><a href="Bv9ARM.ch04.html#id2563649">DNSKEY rollovers</a></span></dt>
+<dt><span class="sect2"><a href="Bv9ARM.ch04.html#id2563661">Dynamic DNS update method</a></span></dt>
+<dt><span class="sect2"><a href="Bv9ARM.ch04.html#id2563763">Automatic key rollovers</a></span></dt>
+<dt><span class="sect2"><a href="Bv9ARM.ch04.html#id2563789">NSEC3PARAM rollovers via UPDATE</a></span></dt>
+<dt><span class="sect2"><a href="Bv9ARM.ch04.html#id2563799">Converting from NSEC to NSEC3</a></span></dt>
+<dt><span class="sect2"><a href="Bv9ARM.ch04.html#id2563809">Converting from NSEC3 to NSEC</a></span></dt>
+<dt><span class="sect2"><a href="Bv9ARM.ch04.html#id2563821">Converting from secure to insecure</a></span></dt>
+<dt><span class="sect2"><a href="Bv9ARM.ch04.html#id2563859">Periodic re-signing</a></span></dt>
+<dt><span class="sect2"><a href="Bv9ARM.ch04.html#id2563868">NSEC3 and OPTOUT</a></span></dt>
+</dl></dd>
+<dt><span class="sect1"><a href="Bv9ARM.ch04.html#rfc5011.support">Dynamic Trust Anchor Management</a></span></dt>
+<dd><dl>
+<dt><span class="sect2"><a href="Bv9ARM.ch04.html#id2607271">Validating Resolver</a></span></dt>
+<dt><span class="sect2"><a href="Bv9ARM.ch04.html#id2607293">Authoritative Server</a></span></dt>
+</dl></dd>
+<dt><span class="sect1"><a href="Bv9ARM.ch04.html#pkcs11">PKCS #11 (Cryptoki) support</a></span></dt>
+<dd><dl>
+<dt><span class="sect2"><a href="Bv9ARM.ch04.html#id2609524">Prerequisites</a></span></dt>
+<dt><span class="sect2"><a href="Bv9ARM.ch04.html#id2607678">Building BIND 9 with PKCS#11</a></span></dt>
+<dt><span class="sect2"><a href="Bv9ARM.ch04.html#id2607842">PKCS #11 Tools</a></span></dt>
+<dt><span class="sect2"><a href="Bv9ARM.ch04.html#id2607873">Using the HSM</a></span></dt>
+<dt><span class="sect2"><a href="Bv9ARM.ch04.html#id2609709">Specifying the engine on the command line</a></span></dt>
+<dt><span class="sect2"><a href="Bv9ARM.ch04.html#id2609755">Running named with automatic zone re-signing</a></span></dt>
+</dl></dd>
+<dt><span class="sect1"><a href="Bv9ARM.ch04.html#id2572490">IPv6 Support in <acronym class="acronym">BIND</acronym> 9</a></span></dt>
+<dd><dl>
+<dt><span class="sect2"><a href="Bv9ARM.ch04.html#id2572757">Address Lookups Using AAAA Records</a></span></dt>
+<dt><span class="sect2"><a href="Bv9ARM.ch04.html#id2572846">Address to Name Lookups Using Nibble Format</a></span></dt>
</dl></dd>
</dl>
</div>
@@ -113,14 +143,25 @@
</p>
<p>
Dynamic update is enabled by including an
- <span><strong class="command">allow-update</strong></span> or <span><strong class="command">update-policy</strong></span>
- clause in the <span><strong class="command">zone</strong></span> statement. The
- <span><strong class="command">tkey-gssapi-credential</strong></span> and
- <span><strong class="command">tkey-domain</strong></span> clauses in the
- <span><strong class="command">options</strong></span> statement enable the
- server to negotiate keys that can be matched against those
- in <span><strong class="command">update-policy</strong></span> or
- <span><strong class="command">allow-update</strong></span>.
+ <span><strong class="command">allow-update</strong></span> or an <span><strong class="command">update-policy</strong></span>
+ clause in the <span><strong class="command">zone</strong></span> statement.
+ </p>
+<p>
+ If the zone's <span><strong class="command">update-policy</strong></span> is set to
+ <strong class="userinput"><code>local</code></strong>, updates to the zone
+ will be permitted for the key <code class="varname">local-ddns</code>,
+ which will be generated by <span><strong class="command">named</strong></span> at startup.
+ See <a href="Bv9ARM.ch06.html#dynamic_update_policies" title="Dynamic Update Policies">the section called &#8220;Dynamic Update Policies&#8221;</a> for more details.
+ </p>
+<p>
+ Dynamic updates using Kerberos signed requests can be made
+ using the TKEY/GSS protocol by setting either the
+ <span><strong class="command">tkey-gssapi-keytab</strong></span> option, or alternatively
+ by setting both the <span><strong class="command">tkey-gssapi-credential</strong></span>
+ and <span><strong class="command">tkey-domain</strong></span> options. Once enabled,
+ Kerberos signed requests will be matched against the update
+ policies for the zone, using the Kerberos principal as the
+ signer for the request.
</p>
<p>
Updating of secure zones (zones using DNSSEC) follows RFC
@@ -215,7 +256,7 @@
</div>
<div class="sect1" lang="en">
<div class="titlepage"><div><div><h2 class="title" style="clear: both">
-<a name="id2570492"></a>Split DNS</h2></div></div></div>
+<a name="id2570823"></a>Split DNS</h2></div></div></div>
<p>
Setting up different views, or visibility, of the DNS space to
internal and external resolvers is usually referred to as a
@@ -245,7 +286,7 @@
</p>
<div class="sect2" lang="en">
<div class="titlepage"><div><div><h3 class="title">
-<a name="id2570510"></a>Example split DNS setup</h3></div></div></div>
+<a name="id2570841"></a>Example split DNS setup</h3></div></div></div>
<p>
Let's say a company named <span class="emphasis"><em>Example, Inc.</em></span>
(<code class="literal">example.com</code>)
@@ -275,7 +316,7 @@
and <code class="filename">site2.example.com</code>, to the servers
in the
DMZ. These internal servers will have complete sets of information
- for <code class="filename">site1.example.com</code>, <code class="filename">site2.example.com</code>,<span class="emphasis"><em></em></span> <code class="filename">site1.internal</code>,
+ for <code class="filename">site1.example.com</code>, <code class="filename">site2.example.com</code>, <code class="filename">site1.internal</code>,
and <code class="filename">site2.internal</code>.
</p>
<p>
@@ -373,26 +414,32 @@ options {
...
...
forward only;
- forwarders { // forward to external servers
+ // forward to external servers
+ forwarders {
<code class="varname">bastion-ips-go-here</code>;
};
- allow-transfer { none; }; // sample allow-transfer (no one)
- allow-query { internals; externals; }; // restrict query access
- allow-recursion { internals; }; // restrict recursion
+ // sample allow-transfer (no one)
+ allow-transfer { none; };
+ // restrict query access
+ allow-query { internals; externals; };
+ // restrict recursion
+ allow-recursion { internals; };
...
...
};
-zone "site1.example.com" { // sample master zone
+// sample master zone
+zone "site1.example.com" {
type master;
file "m/site1.example.com";
- forwarders { }; // do normal iterative
- // resolution (do not forward)
+ // do normal iterative resolution (do not forward)
+ forwarders { };
allow-query { internals; externals; };
allow-transfer { internals; };
};
-zone "site2.example.com" { // sample slave zone
+// sample slave zone
+zone "site2.example.com" {
type slave;
file "s/site2.example.com";
masters { 172.16.72.3; };
@@ -429,15 +476,20 @@ acl externals { bastion-ips-go-here; };
options {
...
...
- allow-transfer { none; }; // sample allow-transfer (no one)
- allow-query { any; }; // default query access
- allow-query-cache { internals; externals; }; // restrict cache access
- allow-recursion { internals; externals; }; // restrict recursion
+ // sample allow-transfer (no one)
+ allow-transfer { none; };
+ // default query access
+ allow-query { any; };
+ // restrict cache access
+ allow-query-cache { internals; externals; };
+ // restrict recursion
+ allow-recursion { internals; externals; };
...
...
};
-zone "site1.example.com" { // sample slave zone
+// sample slave zone
+zone "site1.example.com" {
type master;
file "m/site1.foo.com";
allow-transfer { internals; externals; };
@@ -491,7 +543,7 @@ nameserver 172.16.72.4
</p>
<div class="sect2" lang="en">
<div class="titlepage"><div><div><h3 class="title">
-<a name="id2571082"></a>Generate Shared Keys for Each Pair of Hosts</h3></div></div></div>
+<a name="id2571342"></a>Generate Shared Keys for Each Pair of Hosts</h3></div></div></div>
<p>
A shared secret is generated to be shared between <span class="emphasis"><em>host1</em></span> and <span class="emphasis"><em>host2</em></span>.
An arbitrary key name is chosen: "host1-host2.". The key name must
@@ -499,7 +551,7 @@ nameserver 172.16.72.4
</p>
<div class="sect3" lang="en">
<div class="titlepage"><div><div><h4 class="title">
-<a name="id2571099"></a>Automatic Generation</h4></div></div></div>
+<a name="id2571360"></a>Automatic Generation</h4></div></div></div>
<p>
The following command will generate a 128-bit (16 byte) HMAC-SHA256
key as described above. Longer keys are better, but shorter keys
@@ -523,7 +575,7 @@ nameserver 172.16.72.4
</div>
<div class="sect3" lang="en">
<div class="titlepage"><div><div><h4 class="title">
-<a name="id2571138"></a>Manual Generation</h4></div></div></div>
+<a name="id2571398"></a>Manual Generation</h4></div></div></div>
<p>
The shared secret is simply a random sequence of bits, encoded
in base-64. Most ASCII strings are valid base-64 strings (assuming
@@ -538,7 +590,7 @@ nameserver 172.16.72.4
</div>
<div class="sect2" lang="en">
<div class="titlepage"><div><div><h3 class="title">
-<a name="id2571156"></a>Copying the Shared Secret to Both Machines</h3></div></div></div>
+<a name="id2571553"></a>Copying the Shared Secret to Both Machines</h3></div></div></div>
<p>
This is beyond the scope of DNS. A secure transport mechanism
should be used. This could be secure FTP, ssh, telephone, etc.
@@ -546,7 +598,7 @@ nameserver 172.16.72.4
</div>
<div class="sect2" lang="en">
<div class="titlepage"><div><div><h3 class="title">
-<a name="id2571166"></a>Informing the Servers of the Key's Existence</h3></div></div></div>
+<a name="id2571563"></a>Informing the Servers of the Key's Existence</h3></div></div></div>
<p>
Imagine <span class="emphasis"><em>host1</em></span> and <span class="emphasis"><em>host 2</em></span>
are
@@ -573,7 +625,7 @@ key host1-host2. {
</div>
<div class="sect2" lang="en">
<div class="titlepage"><div><div><h3 class="title">
-<a name="id2571203"></a>Instructing the Server to Use the Key</h3></div></div></div>
+<a name="id2571600"></a>Instructing the Server to Use the Key</h3></div></div></div>
<p>
Since keys are shared between two hosts only, the server must
be told when keys are to be used. The following is added to the <code class="filename">named.conf</code> file
@@ -605,7 +657,7 @@ server 10.1.2.3 {
</div>
<div class="sect2" lang="en">
<div class="titlepage"><div><div><h3 class="title">
-<a name="id2571260"></a>TSIG Key Based Access Control</h3></div></div></div>
+<a name="id2571657"></a>TSIG Key Based Access Control</h3></div></div></div>
<p>
<acronym class="acronym">BIND</acronym> allows IP addresses and ranges
to be specified in ACL
@@ -626,14 +678,13 @@ allow-update { key host1-host2. ;};
was signed by a key named "<span><strong class="command">host1-host2.</strong></span>".
</p>
<p>
- You may want to read about the more powerful
- <span><strong class="command">update-policy</strong></span> statement in
- <a href="Bv9ARM.ch06.html#dynamic_update_policies" title="Dynamic Update Policies">the section called &#8220;Dynamic Update Policies&#8221;</a>.
+ See <a href="Bv9ARM.ch06.html#dynamic_update_policies" title="Dynamic Update Policies">the section called &#8220;Dynamic Update Policies&#8221;</a> for a discussion of
+ the more flexible <span><strong class="command">update-policy</strong></span> statement.
</p>
</div>
<div class="sect2" lang="en">
<div class="titlepage"><div><div><h3 class="title">
-<a name="id2571445"></a>Errors</h3></div></div></div>
+<a name="id2571706"></a>Errors</h3></div></div></div>
<p>
The processing of TSIG signed messages can result in
several errors. If a signed message is sent to a non-TSIG aware
@@ -659,7 +710,7 @@ allow-update { key host1-host2. ;};
</div>
<div class="sect1" lang="en">
<div class="titlepage"><div><div><h2 class="title" style="clear: both">
-<a name="id2571459"></a>TKEY</h2></div></div></div>
+<a name="id2571720"></a>TKEY</h2></div></div></div>
<p><span><strong class="command">TKEY</strong></span>
is a mechanism for automatically generating a shared secret
between two hosts. There are several "modes" of
@@ -695,7 +746,7 @@ allow-update { key host1-host2. ;};
</div>
<div class="sect1" lang="en">
<div class="titlepage"><div><div><h2 class="title" style="clear: both">
-<a name="id2571576"></a>SIG(0)</h2></div></div></div>
+<a name="id2563987"></a>SIG(0)</h2></div></div></div>
<p>
<acronym class="acronym">BIND</acronym> 9 partially supports DNSSEC SIG(0)
transaction signatures as specified in RFC 2535 and RFC 2931.
@@ -756,7 +807,7 @@ allow-update { key host1-host2. ;};
</p>
<div class="sect2" lang="en">
<div class="titlepage"><div><div><h3 class="title">
-<a name="id2571644"></a>Generating Keys</h3></div></div></div>
+<a name="id2564055"></a>Generating Keys</h3></div></div></div>
<p>
The <span><strong class="command">dnssec-keygen</strong></span> program is used to
generate keys.
@@ -812,7 +863,7 @@ allow-update { key host1-host2. ;};
</div>
<div class="sect2" lang="en">
<div class="titlepage"><div><div><h3 class="title">
-<a name="id2571792"></a>Signing the Zone</h3></div></div></div>
+<a name="id2572189"></a>Signing the Zone</h3></div></div></div>
<p>
The <span><strong class="command">dnssec-signzone</strong></span> program is used
to sign a zone.
@@ -854,7 +905,7 @@ allow-update { key host1-host2. ;};
</div>
<div class="sect2" lang="en">
<div class="titlepage"><div><div><h3 class="title">
-<a name="id2571873"></a>Configuring Servers</h3></div></div></div>
+<a name="id2572270"></a>Configuring Servers</h3></div></div></div>
<p>
To enable <span><strong class="command">named</strong></span> to respond appropriately
to DNS requests from DNSSEC aware clients,
@@ -863,12 +914,22 @@ allow-update { key host1-host2. ;};
</p>
<p>
To enable <span><strong class="command">named</strong></span> to validate answers from
- other servers, the <span><strong class="command">dnssec-enable</strong></span> and
- <span><strong class="command">dnssec-validation</strong></span> options must both be
- set to yes (the default setting in <acronym class="acronym">BIND</acronym> 9.5
- and later), and at least one trust anchor must be configured
- with a <span><strong class="command">trusted-keys</strong></span> statement in
- <code class="filename">named.conf</code>.
+ other servers, the <span><strong class="command">dnssec-enable</strong></span> option
+ must be set to <strong class="userinput"><code>yes</code></strong>, and the
+ <span><strong class="command">dnssec-validation</strong></span> options must be set to
+ <strong class="userinput"><code>yes</code></strong> or <strong class="userinput"><code>auto</code></strong>.
+ </p>
+<p>
+ If <span><strong class="command">dnssec-validation</strong></span> is set to
+ <strong class="userinput"><code>auto</code></strong>, then a default
+ trust anchor for the DNS root zone will be used.
+ If it is set to <strong class="userinput"><code>yes</code></strong>, however,
+ then at least one trust anchor must be configured
+ with a <span><strong class="command">trusted-keys</strong></span> or
+ <span><strong class="command">managed-keys</strong></span> statement in
+ <code class="filename">named.conf</code>, or DNSSEC validation
+ will not occur. The default setting is
+ <strong class="userinput"><code>yes</code></strong>.
</p>
<p>
<span><strong class="command">trusted-keys</strong></span> are copies of DNSKEY RRs
@@ -879,7 +940,13 @@ allow-update { key host1-host2. ;};
to validated the DNSKEY RRset that they are from.
</p>
<p>
- <span><strong class="command">trusted-keys</strong></span> are described in more detail
+ <span><strong class="command">managed-keys</strong></span> are trusted keys which are
+ automatically kept up to date via RFC 5011 trust anchor
+ maintenance.
+ </p>
+<p>
+ <span><strong class="command">trusted-keys</strong></span> and
+ <span><strong class="command">managed-keys</strong></span> are described in more detail
later in this document.
</p>
<p>
@@ -890,44 +957,58 @@ allow-update { key host1-host2. ;};
</p>
<p>
After DNSSEC gets established, a typical DNSSEC configuration
- will look something like the following. It has a one or
+ will look something like the following. It has one or
more public keys for the root. This allows answers from
outside the organization to be validated. It will also
have several keys for parts of the namespace the organization
- controls. These are here to ensure that <span><strong class="command">named</strong></span> is immune
- to compromises in the DNSSEC components of the security
+ controls. These are here to ensure that <span><strong class="command">named</strong></span>
+ is immune to compromises in the DNSSEC components of the security
of parent zones.
</p>
<pre class="programlisting">
-trusted-keys {
-
+managed-keys {
/* Root Key */
-"." 257 3 3 "BNY4wrWM1nCfJ+CXd0rVXyYmobt7sEEfK3clRbGaTwSJxrGkxJWoZu6I7PzJu/
- E9gx4UC1zGAHlXKdE4zYIpRhaBKnvcC2U9mZhkdUpd1Vso/HAdjNe8LmMlnzY3
- zy2Xy4klWOADTPzSv9eamj8V18PHGjBLaVtYvk/ln5ZApjYghf+6fElrmLkdaz
- MQ2OCnACR817DF4BBa7UR/beDHyp5iWTXWSi6XmoJLbG9Scqc7l70KDqlvXR3M
- /lUUVRbkeg1IPJSidmK3ZyCllh4XSKbje/45SKucHgnwU5jefMtq66gKodQj+M
- iA21AfUVe7u99WzTLzY3qlxDhxYQQ20FQ97S+LKUTpQcq27R7AT3/V5hRQxScI
- Nqwcz4jYqZD2fQdgxbcDTClU0CRBdiieyLMNzXG3";
+ "." initial-key 257 3 3 "BNY4wrWM1nCfJ+CXd0rVXyYmobt7sEEfK3clRbGaTwS
+ JxrGkxJWoZu6I7PzJu/E9gx4UC1zGAHlXKdE4zYIpRh
+ aBKnvcC2U9mZhkdUpd1Vso/HAdjNe8LmMlnzY3zy2Xy
+ 4klWOADTPzSv9eamj8V18PHGjBLaVtYvk/ln5ZApjYg
+ hf+6fElrmLkdaz MQ2OCnACR817DF4BBa7UR/beDHyp
+ 5iWTXWSi6XmoJLbG9Scqc7l70KDqlvXR3M/lUUVRbke
+ g1IPJSidmK3ZyCllh4XSKbje/45SKucHgnwU5jefMtq
+ 66gKodQj+MiA21AfUVe7u99WzTLzY3qlxDhxYQQ20FQ
+ 97S+LKUTpQcq27R7AT3/V5hRQxScINqwcz4jYqZD2fQ
+ dgxbcDTClU0CRBdiieyLMNzXG3";
+};
-/* Key for our organization's forward zone */
-example.com. 257 3 5 "AwEAAaxPMcR2x0HbQV4WeZB6oEDX+r0QM65KbhTjrW1ZaARmPhEZZe
- 3Y9ifgEuq7vZ/zGZUdEGNWy+JZzus0lUptwgjGwhUS1558Hb4JKUbb
- OTcM8pwXlj0EiX3oDFVmjHO444gLkBO UKUf/mC7HvfwYH/Be22GnC
- lrinKJp1Og4ywzO9WglMk7jbfW33gUKvirTHr25GL7STQUzBb5Usxt
- 8lgnyTUHs1t3JwCY5hKZ6CqFxmAVZP20igTixin/1LcrgX/KMEGd/b
- iuvF4qJCyduieHukuY3H4XMAcR+xia2 nIUPvm/oyWR8BW/hWdzOvn
- SCThlHf3xiYleDbt/o1OTQ09A0=";
+trusted-keys {
+ /* Key for our organization's forward zone */
+ example.com. 257 3 5 "AwEAAaxPMcR2x0HbQV4WeZB6oEDX+r0QM6
+ 5KbhTjrW1ZaARmPhEZZe3Y9ifgEuq7vZ/z
+ GZUdEGNWy+JZzus0lUptwgjGwhUS1558Hb
+ 4JKUbbOTcM8pwXlj0EiX3oDFVmjHO444gL
+ kBOUKUf/mC7HvfwYH/Be22GnClrinKJp1O
+ g4ywzO9WglMk7jbfW33gUKvirTHr25GL7S
+ TQUzBb5Usxt8lgnyTUHs1t3JwCY5hKZ6Cq
+ FxmAVZP20igTixin/1LcrgX/KMEGd/biuv
+ F4qJCyduieHukuY3H4XMAcR+xia2nIUPvm
+ /oyWR8BW/hWdzOvnSCThlHf3xiYleDbt/o
+ 1OTQ09A0=";
-/* Key for our reverse zone. */
-2.0.192.IN-ADDRPA.NET. 257 3 5 "AQOnS4xn/IgOUpBPJ3bogzwcxOdNax071L18QqZnQQQA
- VVr+iLhGTnNGp3HoWQLUIzKrJVZ3zggy3WwNT6kZo6c0
- tszYqbtvchmgQC8CzKojM/W16i6MG/ea fGU3siaOdS0
- yOI6BgPsw+YZdzlYMaIJGf4M4dyoKIhzdZyQ2bYQrjyQ
- 4LB0lC7aOnsMyYKHHYeRv PxjIQXmdqgOJGq+vsevG06
- zW+1xgYJh9rCIfnm1GX/KMgxLPG2vXTD/RnLX+D3T3UL
- 7HJYHJhAZD5L59VvjSPsZJHeDCUyWYrvPZesZDIRvhDD
- 52SKvbheeTJUm6EhkzytNN2SN96QRk8j/iI8ib";
+ /* Key for our reverse zone. */
+ 2.0.192.IN-ADDRPA.NET. 257 3 5 "AQOnS4xn/IgOUpBPJ3bogzwc
+ xOdNax071L18QqZnQQQAVVr+i
+ LhGTnNGp3HoWQLUIzKrJVZ3zg
+ gy3WwNT6kZo6c0tszYqbtvchm
+ gQC8CzKojM/W16i6MG/eafGU3
+ siaOdS0yOI6BgPsw+YZdzlYMa
+ IJGf4M4dyoKIhzdZyQ2bYQrjy
+ Q4LB0lC7aOnsMyYKHHYeRvPxj
+ IQXmdqgOJGq+vsevG06zW+1xg
+ YJh9rCIfnm1GX/KMgxLPG2vXT
+ D/RnLX+D3T3UL7HJYHJhAZD5L
+ 59VvjSPsZJHeDCUyWYrvPZesZ
+ DIRvhDD52SKvbheeTJUm6Ehkz
+ ytNN2SN96QRk8j/iI8ib";
};
options {
@@ -979,7 +1060,698 @@ options {
</div>
<div class="sect1" lang="en">
<div class="titlepage"><div><div><h2 class="title" style="clear: both">
-<a name="id2572110"></a>IPv6 Support in <acronym class="acronym">BIND</acronym> 9</h2></div></div></div>
+<a name="dnssec.dynamic.zones"></a>DNSSEC, Dynamic Zones, and Automatic Signing</h2></div></div></div>
+<p>As of BIND 9.7.0 it is possible to change a dynamic zone
+ from insecure to signed and back again. A secure zone can use
+ either NSEC or NSEC3 chains.</p>
+<div class="sect2" lang="en"><div class="titlepage"><div><div><h3 class="title">
+<a name="id2607351"></a>Converting from insecure to secure</h3></div></div></div></div>
+<p>Changing a zone from insecure to secure can be done in two
+ ways: using a dynamic DNS update, or the
+ <span><strong class="command">auto-dnssec</strong></span> zone option.</p>
+<p>For either method, you need to configure
+ <span><strong class="command">named</strong></span> so that it can see the
+ <code class="filename">K*</code> files which contain the public and private
+ parts of the keys that will be used to sign the zone. These files
+ will have been generated by
+ <span><strong class="command">dnssec-keygen</strong></span>. You can do this by placing them
+ in the key-directory, as specified in
+ <code class="filename">named.conf</code>:</p>
+<pre class="programlisting">
+ zone example.net {
+ type master;
+ update-policy local;
+ file "dynamic/example.net/example.net";
+ key-directory "dynamic/example.net";
+ };
+</pre>
+<p>If one KSK and one ZSK DNSKEY key have been generated, this
+ configuration will cause all records in the zone to be signed
+ with the ZSK, and the DNSKEY RRset to be signed with the KSK as
+ well. An NSEC chain will be generated as part of the initial
+ signing process.</p>
+<div class="sect2" lang="en"><div class="titlepage"><div><div><h3 class="title">
+<a name="id2563493"></a>Dynamic DNS update method</h3></div></div></div></div>
+<p>To insert the keys via dynamic update:</p>
+<pre class="screen">
+ % nsupdate
+ &gt; ttl 3600
+ &gt; update add example.net DNSKEY 256 3 7 AwEAAZn17pUF0KpbPA2c7Gz76Vb18v0teKT3EyAGfBfL8eQ8al35zz3Y I1m/SAQBxIqMfLtIwqWPdgthsu36azGQAX8=
+ &gt; update add example.net DNSKEY 257 3 7 AwEAAd/7odU/64o2LGsifbLtQmtO8dFDtTAZXSX2+X3e/UNlq9IHq3Y0 XtC0Iuawl/qkaKVxXe2lo8Ct+dM6UehyCqk=
+ &gt; send
+</pre>
+<p>While the update request will complete almost immediately,
+ the zone will not be completely signed until
+ <span><strong class="command">named</strong></span> has had time to walk the zone and
+ generate the NSEC and RRSIG records. The NSEC record at the apex
+ will be added last, to signal that there is a complete NSEC
+ chain.</p>
+<p>If you wish to sign using NSEC3 instead of NSEC, you should
+ add an NSEC3PARAM record to the initial update request. If you
+ wish the NSEC3 chain to have the OPTOUT bit set, set it in the
+ flags field of the NSEC3PARAM record.</p>
+<pre class="screen">
+ % nsupdate
+ &gt; ttl 3600
+ &gt; update add example.net DNSKEY 256 3 7 AwEAAZn17pUF0KpbPA2c7Gz76Vb18v0teKT3EyAGfBfL8eQ8al35zz3Y I1m/SAQBxIqMfLtIwqWPdgthsu36azGQAX8=
+ &gt; update add example.net DNSKEY 257 3 7 AwEAAd/7odU/64o2LGsifbLtQmtO8dFDtTAZXSX2+X3e/UNlq9IHq3Y0 XtC0Iuawl/qkaKVxXe2lo8Ct+dM6UehyCqk=
+ &gt; update add example.net NSEC3PARAM 1 1 100 1234567890
+ &gt; send
+</pre>
+<p>Again, this update request will complete almost
+ immediately; however, the record won't show up until
+ <span><strong class="command">named</strong></span> has had a chance to build/remove the
+ relevant chain. A private type record will be created to record
+ the state of the operation (see below for more details), and will
+ be removed once the operation completes.</p>
+<p>While the initial signing and NSEC/NSEC3 chain generation
+ is happening, other updates are possible as well.</p>
+<div class="sect2" lang="en"><div class="titlepage"><div><div><h3 class="title">
+<a name="id2563529"></a>Fully automatic zone signing</h3></div></div></div></div>
+<p>To enable automatic signing, add the
+ <span><strong class="command">auto-dnssec</strong></span> option to the zone statement in
+ <code class="filename">named.conf</code>.
+ <span><strong class="command">auto-dnssec</strong></span> has two possible arguments:
+ <code class="constant">allow</code> or
+ <code class="constant">maintain</code>.</p>
+<p>With
+ <span><strong class="command">auto-dnssec allow</strong></span>,
+ <span><strong class="command">named</strong></span> can search the key directory for keys
+ matching the zone, insert them into the zone, and use them to
+ sign the zone. It will do so only when it receives an
+ <span><strong class="command">rndc sign &lt;zonename&gt;</strong></span> or
+ <span><strong class="command">rndc loadkeys &lt;zonename&gt;</strong></span> command.</p>
+<p>
+
+ <span><strong class="command">auto-dnssec maintain</strong></span> includes the above
+ functionality, but will also automatically adjust the zone's
+ DNSKEY records on schedule according to the keys' timing metadata.
+ (See <a href="man.dnssec-keygen.html" title="dnssec-keygen"><span class="refentrytitle"><span class="application">dnssec-keygen</span></span>(8)</a> and
+ <a href="man.dnssec-settime.html" title="dnssec-settime"><span class="refentrytitle"><span class="application">dnssec-settime</span></span>(8)</a> for more information.)
+ If keys are present in the key directory the first time the zone
+ is loaded, it will be signed immediately, without waiting for an
+ <span><strong class="command">rndc sign</strong></span> or <span><strong class="command">rndc loadkeys</strong></span>
+ command. (Those commands can still be used when there are unscheduled
+ key changes, however.)
+ </p>
+<p>Using the
+ <span><strong class="command">auto-dnssec</strong></span> option requires the zone to be
+ configured to allow dynamic updates, by adding an
+ <span><strong class="command">allow-update</strong></span> or
+ <span><strong class="command">update-policy</strong></span> statement to the zone
+ configuration. If this has not been done, the configuration will
+ fail.</p>
+<div class="sect2" lang="en"><div class="titlepage"><div><div><h3 class="title">
+<a name="id2563611"></a>Private-type records</h3></div></div></div></div>
+<p>The state of the signing process is signaled by
+ private-type records (with a default type value of 65534). When
+ signing is complete, these records will have a nonzero value for
+ the final octet (for those records which have a nonzero initial
+ octet).</p>
+<p>The private type record format: If the first octet is
+ non-zero then the record indicates that the zone needs to be
+ signed with the key matching the record, or that all signatures
+ that match the record should be removed.</p>
+<p>
+ </p>
+<div class="literallayout"><p><br>
+<br>
+  algorithm (octet 1)<br>
+  key id in network order (octet 2 and 3)<br>
+  removal flag (octet 4)<br>
+  complete flag (octet 5)<br>
+</p></div>
+<p>
+ </p>
+<p>Only records flagged as "complete" can be removed via
+ dynamic update. Attempts to remove other private type records
+ will be silently ignored.</p>
+<p>If the first octet is zero (this is a reserved algorithm
+ number that should never appear in a DNSKEY record) then the
+ record indicates changes to the NSEC3 chains are in progress. The
+ rest of the record contains an NSEC3PARAM record. The flag field
+ tells what operation to perform based on the flag bits.</p>
+<p>
+ </p>
+<div class="literallayout"><p><br>
+<br>
+  0x01 OPTOUT<br>
+  0x80 CREATE<br>
+  0x40 REMOVE<br>
+  0x20 NONSEC<br>
+</p></div>
+<p>
+ </p>
+<div class="sect2" lang="en"><div class="titlepage"><div><div><h3 class="title">
+<a name="id2563649"></a>DNSKEY rollovers</h3></div></div></div></div>
+<p>As with insecure-to-secure conversions, rolling DNSSEC
+ keys can be done in two ways: using a dynamic DNS update, or the
+ <span><strong class="command">auto-dnssec</strong></span> zone option.</p>
+<div class="sect2" lang="en"><div class="titlepage"><div><div><h3 class="title">
+<a name="id2563661"></a>Dynamic DNS update method</h3></div></div></div></div>
+<p> To perform key rollovers via dynamic update, you need to add
+ the <code class="filename">K*</code> files for the new keys so that
+ <span><strong class="command">named</strong></span> can find them. You can then add the new
+ DNSKEY RRs via dynamic update.
+ <span><strong class="command">named</strong></span> will then cause the zone to be signed
+ with the new keys. When the signing is complete the private type
+ records will be updated so that the last octet is non
+ zero.</p>
+<p>If this is for a KSK you need to inform the parent and any
+ trust anchor repositories of the new KSK.</p>
+<p>You should then wait for the maximum TTL in the zone before
+ removing the old DNSKEY. If it is a KSK that is being updated,
+ you also need to wait for the DS RRset in the parent to be
+ updated and its TTL to expire. This ensures that all clients will
+ be able to verify at least one signature when you remove the old
+ DNSKEY.</p>
+<p>The old DNSKEY can be removed via UPDATE. Take care to
+ specify the correct key.
+ <span><strong class="command">named</strong></span> will clean out any signatures generated
+ by the old key after the update completes.</p>
+<div class="sect2" lang="en"><div class="titlepage"><div><div><h3 class="title">
+<a name="id2563763"></a>Automatic key rollovers</h3></div></div></div></div>
+<p>When a new key reaches its activation date (as set by
+ <span><strong class="command">dnssec-keygen</strong></span> or <span><strong class="command">dnssec-settime</strong></span>),
+ if the <span><strong class="command">auto-dnssec</strong></span> zone option is set to
+ <code class="constant">maintain</code>, <span><strong class="command">named</strong></span> will
+ automatically carry out the key rollover. If the key's algorithm
+ has not previously been used to sign the zone, then the zone will
+ be fully signed as quickly as possible. However, if the new key
+ is replacing an existing key of the same algorithm, then the
+ zone will be re-signed incrementally, with signatures from the
+ old key being replaced with signatures from the new key as their
+ signature validity periods expire. By default, this rollover
+ completes in 30 days, after which it will be safe to remove the
+ old key from the DNSKEY RRset.</p>
+<div class="sect2" lang="en"><div class="titlepage"><div><div><h3 class="title">
+<a name="id2563789"></a>NSEC3PARAM rollovers via UPDATE</h3></div></div></div></div>
+<p>Add the new NSEC3PARAM record via dynamic update. When the
+ new NSEC3 chain has been generated, the NSEC3PARAM flag field
+ will be zero. At this point you can remove the old NSEC3PARAM
+ record. The old chain will be removed after the update request
+ completes.</p>
+<div class="sect2" lang="en"><div class="titlepage"><div><div><h3 class="title">
+<a name="id2563799"></a>Converting from NSEC to NSEC3</h3></div></div></div></div>
+<p>To do this, you just need to add an NSEC3PARAM record. When
+ the conversion is complete, the NSEC chain will have been removed
+ and the NSEC3PARAM record will have a zero flag field. The NSEC3
+ chain will be generated before the NSEC chain is
+ destroyed.</p>
+<div class="sect2" lang="en"><div class="titlepage"><div><div><h3 class="title">
+<a name="id2563809"></a>Converting from NSEC3 to NSEC</h3></div></div></div></div>
+<p>To do this, use <span><strong class="command">nsupdate</strong></span> to
+ remove all NSEC3PARAM records with a zero flag
+ field. The NSEC chain will be generated before the NSEC3 chain is
+ removed.</p>
+<div class="sect2" lang="en"><div class="titlepage"><div><div><h3 class="title">
+<a name="id2563821"></a>Converting from secure to insecure</h3></div></div></div></div>
+<p>To convert a signed zone to unsigned using dynamic DNS,
+ delete all the DNSKEY records from the zone apex using
+ <span><strong class="command">nsupdate</strong></span>. All signatures, NSEC or NSEC3 chains,
+ and associated NSEC3PARAM records will be removed automatically.
+ This will take place after the update request completes.</p>
+<p> This requires the
+ <span><strong class="command">dnssec-secure-to-insecure</strong></span> option to be set to
+ <strong class="userinput"><code>yes</code></strong> in
+ <code class="filename">named.conf</code>.</p>
+<p>In addition, if the <span><strong class="command">auto-dnssec maintain</strong></span>
+ zone statement is used, it should be removed or changed to
+ <span><strong class="command">allow</strong></span> instead (or it will re-sign).
+ </p>
+<div class="sect2" lang="en"><div class="titlepage"><div><div><h3 class="title">
+<a name="id2563859"></a>Periodic re-signing</h3></div></div></div></div>
+<p>In any secure zone which supports dynamic updates, named
+ will periodically re-sign RRsets which have not been re-signed as
+ a result of some update action. The signature lifetimes will be
+ adjusted so as to spread the re-sign load over time rather than
+ all at once.</p>
+<div class="sect2" lang="en"><div class="titlepage"><div><div><h3 class="title">
+<a name="id2563868"></a>NSEC3 and OPTOUT</h3></div></div></div></div>
+<p>
+ <span><strong class="command">named</strong></span> only supports creating new NSEC3 chains
+ where all the NSEC3 records in the zone have the same OPTOUT
+ state.
+ <span><strong class="command">named</strong></span> supports UPDATES to zones where the NSEC3
+ records in the chain have mixed OPTOUT state.
+ <span><strong class="command">named</strong></span> does not support changing the OPTOUT
+ state of an individual NSEC3 record, the entire chain needs to be
+ changed if the OPTOUT state of an individual NSEC3 needs to be
+ changed.</p>
+</div>
+<div class="sect1" lang="en">
+<div class="titlepage"><div><div><h2 class="title" style="clear: both">
+<a name="rfc5011.support"></a>Dynamic Trust Anchor Management</h2></div></div></div>
+<p>BIND 9.7.0 introduces support for RFC 5011, dynamic trust
+ anchor management. Using this feature allows
+ <span><strong class="command">named</strong></span> to keep track of changes to critical
+ DNSSEC keys without any need for the operator to make changes to
+ configuration files.</p>
+<div class="sect2" lang="en">
+<div class="titlepage"><div><div><h3 class="title">
+<a name="id2607271"></a>Validating Resolver</h3></div></div></div>
+<p>To configure a validating resolver to use RFC 5011 to
+ maintain a trust anchor, configure the trust anchor using a
+ <span><strong class="command">managed-keys</strong></span> statement. Information about
+ this can be found in
+ <a href="Bv9ARM.ch06.html#managed-keys" title="managed-keys Statement Definition
+ and Usage">the section called &#8220;<span><strong class="command">managed-keys</strong></span> Statement Definition
+ and Usage&#8221;</a>.</p>
+</div>
+<div class="sect2" lang="en">
+<div class="titlepage"><div><div><h3 class="title">
+<a name="id2607293"></a>Authoritative Server</h3></div></div></div>
+<p>To set up an authoritative zone for RFC 5011 trust anchor
+ maintenance, generate two (or more) key signing keys (KSKs) for
+ the zone. Sign the zone with one of them; this is the "active"
+ KSK. All KSK's which do not sign the zone are "stand-by"
+ keys.</p>
+<p>Any validating resolver which is configured to use the
+ active KSK as an RFC 5011-managed trust anchor will take note
+ of the stand-by KSKs in the zone's DNSKEY RRset, and store them
+ for future reference. The resolver will recheck the zone
+ periodically, and after 30 days, if the new key is still there,
+ then the key will be accepted by the resolver as a valid trust
+ anchor for the zone. Any time after this 30-day acceptance
+ timer has completed, the active KSK can be revoked, and the
+ zone can be "rolled over" to the newly accepted key.</p>
+<p>The easiest way to place a stand-by key in a zone is to
+ use the "smart signing" features of
+ <span><strong class="command">dnssec-keygen</strong></span> and
+ <span><strong class="command">dnssec-signzone</strong></span>. If a key with a publication
+ date in the past, but an activation date which is unset or in
+ the future, "
+ <span><strong class="command">dnssec-signzone -S</strong></span>" will include the DNSKEY
+ record in the zone, but will not sign with it:</p>
+<pre class="screen">
+$ <strong class="userinput"><code>dnssec-keygen -K keys -f KSK -P now -A now+2y example.net</code></strong>
+$ <strong class="userinput"><code>dnssec-signzone -S -K keys example.net</code></strong>
+</pre>
+<p>To revoke a key, the new command
+ <span><strong class="command">dnssec-revoke</strong></span> has been added. This adds the
+ REVOKED bit to the key flags and re-generates the
+ <code class="filename">K*.key</code> and
+ <code class="filename">K*.private</code> files.</p>
+<p>After revoking the active key, the zone must be signed
+ with both the revoked KSK and the new active KSK. (Smart
+ signing takes care of this automatically.)</p>
+<p>Once a key has been revoked and used to sign the DNSKEY
+ RRset in which it appears, that key will never again be
+ accepted as a valid trust anchor by the resolver. However,
+ validation can proceed using the new active key (which had been
+ accepted by the resolver when it was a stand-by key).</p>
+<p>See RFC 5011 for more details on key rollover
+ scenarios.</p>
+<p>When a key has been revoked, its key ID changes,
+ increasing by 128, and wrapping around at 65535. So, for
+ example, the key "<code class="filename">Kexample.com.+005+10000</code>" becomes
+ "<code class="filename">Kexample.com.+005+10128</code>".</p>
+<p>If two keys have ID's exactly 128 apart, and one is
+ revoked, then the two key ID's will collide, causing several
+ problems. To prevent this,
+ <span><strong class="command">dnssec-keygen</strong></span> will not generate a new key if
+ another key is present which may collide. This checking will
+ only occur if the new keys are written to the same directory
+ which holds all other keys in use for that zone.</p>
+<p>Older versions of BIND 9 did not have this precaution.
+ Exercise caution if using key revocation on keys that were
+ generated by previous releases, or if using keys stored in
+ multiple directories or on multiple machines.</p>
+<p>It is expected that a future release of BIND 9 will
+ address this problem in a different way, by storing revoked
+ keys with their original unrevoked key ID's.</p>
+</div>
+</div>
+<div class="sect1" lang="en">
+<div class="titlepage"><div><div><h2 class="title" style="clear: both">
+<a name="pkcs11"></a>PKCS #11 (Cryptoki) support</h2></div></div></div>
+<p>PKCS #11 (Public Key Cryptography Standard #11) defines a
+ platform- independent API for the control of hardware security
+ modules (HSMs) and other cryptographic support devices.</p>
+<p>BIND 9 is known to work with two HSMs: The Sun SCA 6000
+ cryptographic acceleration board, tested under Solaris x86, and
+ the AEP Keyper network-attached key storage device, tested with
+ Debian Linux, Solaris x86 and Windows Server 2003.</p>
+<div class="sect2" lang="en">
+<div class="titlepage"><div><div><h3 class="title">
+<a name="id2609524"></a>Prerequisites</h3></div></div></div>
+<p>See the HSM vendor documentation for information about
+ installing, initializing, testing and troubleshooting the
+ HSM.</p>
+<p>BIND 9 uses OpenSSL for cryptography, but stock OpenSSL
+ does not yet fully support PKCS #11. However, a PKCS #11 engine
+ for OpenSSL is available from the OpenSolaris project. It has
+ been modified by ISC to work with with BIND 9, and to provide
+ new features such as PIN management and key by
+ reference.</p>
+<p>The patched OpenSSL depends on a "PKCS #11 provider".
+ This is a shared library object, providing a low-level PKCS #11
+ interface to the HSM hardware. It is dynamically loaded by
+ OpenSSL at runtime. The PKCS #11 provider comes from the HSM
+ vendor, and and is specific to the HSM to be controlled.</p>
+<p>There are two "flavors" of PKCS #11 support provided by
+ the patched OpenSSL, one of which must be chosen at
+ configuration time. The correct choice depends on the HSM
+ hardware:</p>
+<div class="itemizedlist"><ul type="disc">
+<li><p>Use 'crypto-accelerator' with HSMs that have hardware
+ cryptographic acceleration features, such as the SCA 6000
+ board. This causes OpenSSL to run all supported
+ cryptographic operations in the HSM.</p></li>
+<li><p>Use 'sign-only' with HSMs that are designed to
+ function primarily as secure key storage devices, but lack
+ hardware acceleration. These devices are highly secure, but
+ are not necessarily any faster at cryptography than the
+ system CPU &#8212; often, they are slower. It is therefore
+ most efficient to use them only for those cryptographic
+ functions that require access to the secured private key,
+ such as zone signing, and to use the system CPU for all
+ other computationally-intensive operations. The AEP Keyper
+ is an example of such a device.</p></li>
+</ul></div>
+<p>The modified OpenSSL code is included in the BIND 9.7.0
+ release, in the form of a context diff against the latest OpenSSL.
+ </p>
+<div class="note" style="margin-left: 0.5in; margin-right: 0.5in;">
+<h3 class="title">Note</h3>
+ The latest OpenSSL version at the time of the BIND release
+ is 0.9.8l.
+ ISC will provide an updated patch as new versions of OpenSSL
+ are released. The version number in the following examples
+ is expected to change.</div>
+<p>
+ Before building BIND 9 with PKCS #11 support, it will be
+ necessary to build OpenSSL with this patch in place and inform
+ it of the path to the HSM-specific PKCS #11 provider
+ library.</p>
+<p>Obtain OpenSSL 0.9.8l:</p>
+<pre class="screen">
+$ <strong class="userinput"><code>wget <a href="" target="_top">http://www.openssl.org/source/openssl-0.9.8l.tar.gz</a></code></strong>
+</pre>
+<p>Extract the tarball:</p>
+<pre class="screen">
+$ <strong class="userinput"><code>tar zxf openssl-0.9.8l.tar.gz</code></strong>
+</pre>
+<p>Apply the patch from the BIND 9 release:</p>
+<pre class="screen">
+$ <strong class="userinput"><code>patch -p1 -d openssl-0.9.8l \
+ &lt; bind-9.7.0/bin/pkcs11/openssl-0.9.8l-patch</code></strong>
+</pre>
+<div class="note" style="margin-left: 0.5in; margin-right: 0.5in;">
+<h3 class="title">Note</h3>(Note that the patch file may not be compatible with the
+ "patch" utility on all operating systems. You may need to
+ install GNU patch.)</div>
+<p>When building OpenSSL, place it in a non-standard
+ location so that it does not interfere with OpenSSL libraries
+ elsewhere on the system. In the following examples, we choose
+ to install into "/opt/pkcs11/usr". We will use this location
+ when we configure BIND 9.</p>
+<div class="sect3" lang="en">
+<div class="titlepage"><div><div><h4 class="title">
+<a name="id2607504"></a>Building OpenSSL for the AEP Keyper on Linux</h4></div></div></div>
+<p>The AEP Keyper is a highly secure key storage device,
+ but does not provide hardware cryptographic acceleration. It
+ can carry out cryptographic operations, but it is probably
+ slower than your system's CPU. Therefore, we choose the
+ 'sign-only' flavor when building OpenSSL.</p>
+<p>The Keyper-specific PKCS #11 provider library is
+ delivered with the Keyper software. In this example, we place
+ it /opt/pkcs11/usr/lib:</p>
+<pre class="screen">
+$ <strong class="userinput"><code>cp pkcs11.GCC4.0.2.so.4.05 /opt/pkcs11/usr/lib/libpkcs11.so</code></strong>
+</pre>
+<p>This library is only available for Linux as a 32-bit
+ binary. If we are compiling on a 64-bit Linux system, it is
+ necessary to force a 32-bit build, by specifying -m32 in the
+ build options.</p>
+<p>Finally, the Keyper library requires threads, so we
+ must specify -pthread.</p>
+<pre class="screen">
+$ <strong class="userinput"><code>cd openssl-0.9.8l</code></strong>
+$ <strong class="userinput"><code>./Configure linux-generic32 -m32 -pthread \
+ --pk11-libname=/opt/pkcs11/usr/lib/libpkcs11.so \
+ --pk11-flavor=sign-only \
+ --prefix=/opt/pkcs11/usr</code></strong>
+</pre>
+<p>After configuring, run "<span><strong class="command">make</strong></span>"
+ and "<span><strong class="command">make test</strong></span>". If "<span><strong class="command">make
+ test</strong></span>" fails with "pthread_atfork() not found", you forgot to
+ add the -pthread above.</p>
+</div>
+<div class="sect3" lang="en">
+<div class="titlepage"><div><div><h4 class="title">
+<a name="id2607573"></a>Building OpenSSL for the SCA 6000 on Solaris</h4></div></div></div>
+<p>The SCA-6000 PKCS #11 provider is installed as a system
+ library, libpkcs11. It is a true crypto accelerator, up to 4
+ times faster than any CPU, so the flavor shall be
+ 'crypto-accelerator'.</p>
+<p>In this example, we are building on Solaris x86 on an
+ AMD64 system.</p>
+<pre class="screen">
+$ <strong class="userinput"><code>cd openssl-0.9.8l</code></strong>
+$ <strong class="userinput"><code>./Configure solaris64-x86_64-cc \
+ --pk11-libname=/usr/lib/64/libpkcs11.so \
+ --pk11-flavor=crypto-accelerator \
+ --prefix=/opt/pkcs11/usr</code></strong>
+</pre>
+<p>(For a 32-bit build, use "solaris-x86-cc" and
+ /usr/lib/libpkcs11.so.)</p>
+<p>After configuring, run
+ <span><strong class="command">make</strong></span> and
+ <span><strong class="command">make test</strong></span>.</p>
+<p>Once you have built OpenSSL, run
+ "<span><strong class="command">apps/openssl engine pkcs11</strong></span>" to confirm
+ that PKCS #11 support was compiled in correctly. The output
+ should be one of the following lines, depending on the flavor
+ selected:</p>
+<pre class="screen">
+ (pkcs11) PKCS #11 engine support (sign only)
+</pre>
+<p>Or:</p>
+<pre class="screen">
+ (pkcs11) PKCS #11 engine support (crypto accelerator)
+</pre>
+<p>Next, run
+ "<span><strong class="command">apps/openssl engine pkcs11 -t</strong></span>". This will
+ attempt to initialize the PKCS #11 engine. If it is able to
+ do so successfully, it will report
+ &#8220;<span class="quote"><code class="literal">[ available ]</code></span>&#8221;.</p>
+<p>If the output is correct, run
+ "<span><strong class="command">make install</strong></span>" which will install the
+ modified OpenSSL suite to
+ <code class="filename">/opt/pkcs11/usr</code>.</p>
+</div>
+</div>
+<div class="sect2" lang="en">
+<div class="titlepage"><div><div><h3 class="title">
+<a name="id2607678"></a>Building BIND 9 with PKCS#11</h3></div></div></div>
+<p>When building BIND 9, the location of the custom-built
+ OpenSSL library must be specified via configure.</p>
+<div class="sect3" lang="en">
+<div class="titlepage"><div><div><h4 class="title">
+<a name="id2607687"></a>Configuring BIND 9 for Linux</h4></div></div></div>
+<p>To link with the PKCS #11 provider, threads must be
+ enabled in the BIND 9 build.</p>
+<p>The PKCS #11 library for the AEP Keyper is currently
+ only available as a 32-bit binary. If we are building on a
+ 64-bit host, we must force a 32-bit build by adding "-m32" to
+ the CC options on the "configure" command line.</p>
+<pre class="screen">
+$ <strong class="userinput"><code>cd ../bind-9.7.0</code></strong>
+$ <strong class="userinput"><code>./configure CC="gcc -m32" --enable-threads \
+ --with-openssl=/opt/pkcs11/usr \
+ --with-pkcs11=/opt/pkcs11/usr/lib/libpkcs11.so</code></strong>
+</pre>
+</div>
+<div class="sect3" lang="en">
+<div class="titlepage"><div><div><h4 class="title">
+<a name="id2607786"></a>Configuring BIND 9 for Solaris</h4></div></div></div>
+<p>To link with the PKCS #11 provider, threads must be
+ enabled in the BIND 9 build.</p>
+<pre class="screen">
+$ <strong class="userinput"><code>cd ../bind-9.7.0</code></strong>
+$ <strong class="userinput"><code>./configure CC="cc -xarch=amd64" --enable-threads \
+ --with-openssl=/opt/pkcs11/usr \
+ --with-pkcs11=/usr/lib/64/libpkcs11.so</code></strong>
+</pre>
+<p>(For a 32-bit build, omit CC="cc -xarch=amd64".)</p>
+<p>If configure complains about OpenSSL not working, you
+ may have a 32/64-bit architecture mismatch. Or, you may have
+ incorrectly specified the path to OpenSSL (it should be the
+ same as the --prefix argument to the OpenSSL
+ Configure).</p>
+</div>
+<p>After configuring, run
+ "<span><strong class="command">make</strong></span>",
+ "<span><strong class="command">make test</strong></span>" and
+ "<span><strong class="command">make install</strong></span>".</p>
+</div>
+<div class="sect2" lang="en">
+<div class="titlepage"><div><div><h3 class="title">
+<a name="id2607842"></a>PKCS #11 Tools</h3></div></div></div>
+<p>BIND 9 includes a minimal set of tools to operate the
+ HSM, including
+ <span><strong class="command">pkcs11-keygen</strong></span> to generate a new key pair
+ within the HSM,
+ <span><strong class="command">pkcs11-list</strong></span> to list objects currently
+ available, and
+ <span><strong class="command">pkcs11-destroy</strong></span> to remove objects.</p>
+<p>In UNIX/Linux builds, these tools are built only if BIND
+ 9 is configured with the --with-pkcs11 option. (NOTE: If
+ --with-pkcs11 is set to "yes", rather than to the path of the
+ PKCS #11 provider, then the tools will be built but the
+ provider will be left undefined. Use the -m option or the
+ PKCS11_PROVIDER environment variable to specify the path to the
+ provider.)</p>
+</div>
+<div class="sect2" lang="en">
+<div class="titlepage"><div><div><h3 class="title">
+<a name="id2607873"></a>Using the HSM</h3></div></div></div>
+<p>First, we must set up the runtime environment so the
+ OpenSSL and PKCS #11 libraries can be loaded:</p>
+<pre class="screen">
+$ <strong class="userinput"><code>export LD_LIBRARY_PATH=/opt/pkcs11/usr/lib:${LD_LIBRARY_PATH}</code></strong>
+</pre>
+<p>When operating an AEP Keyper, it is also necessary to
+ specify the location of the "machine" file, which stores
+ information about the Keyper for use by PKCS #11 provider
+ library. If the machine file is in
+ <code class="filename">/opt/Keyper/PKCS11Provider/machine</code>,
+ use:</p>
+<pre class="screen">
+$ <strong class="userinput"><code>export KEYPER_LIBRARY_PATH=/opt/Keyper/PKCS11Provider</code></strong>
+</pre>
+<p>These environment variables must be set whenever running
+ any tool that uses the HSM, including
+ <span><strong class="command">pkcs11-keygen</strong></span>,
+ <span><strong class="command">pkcs11-list</strong></span>,
+ <span><strong class="command">pkcs11-destroy</strong></span>,
+ <span><strong class="command">dnssec-keyfromlabel</strong></span>,
+ <span><strong class="command">dnssec-signzone</strong></span>,
+ <span><strong class="command">dnssec-keygen</strong></span>(which will use the HSM for
+ random number generation), and
+ <span><strong class="command">named</strong></span>.</p>
+<p>We can now create and use keys in the HSM. In this case,
+ we will create a 2048 bit key and give it the label
+ "sample-ksk":</p>
+<pre class="screen">
+$ <strong class="userinput"><code>pkcs11-keygen -b 2048 -l sample-ksk</code></strong>
+</pre>
+<p>To confirm that the key exists:</p>
+<pre class="screen">
+$ <strong class="userinput"><code>pkcs11-list</code></strong>
+Enter PIN:
+object[0]: handle 2147483658 class 3 label[8] 'sample-ksk' id[0]
+object[1]: handle 2147483657 class 2 label[8] 'sample-ksk' id[0]
+</pre>
+<p>Before using this key to sign a zone, we must create a
+ pair of BIND 9 key files. The "dnssec-keyfromlabel" utility
+ does this. In this case, we will be using the HSM key
+ "sample-ksk" as the key-signing key for "example.net":</p>
+<pre class="screen">
+$ <strong class="userinput"><code>dnssec-keyfromlabel -l sample-ksk -f KSK example.net</code></strong>
+</pre>
+<p>The resulting K*.key and K*.private files can now be used
+ to sign the zone. Unlike normal K* files, which contain both
+ public and private key data, these files will contain only the
+ public key data, plus an identifier for the private key which
+ remains stored within the HSM. The HSM handles signing with the
+ private key.</p>
+<p>If you wish to generate a second key in the HSM for use
+ as a zone-signing key, follow the same procedure above, using a
+ different keylabel, a smaller key size, and omitting "-f KSK"
+ from the dnssec-keyfromlabel arguments:</p>
+<pre class="screen">
+$ <strong class="userinput"><code>pkcs11-keygen -b 1024 -l sample-zsk</code></strong>
+$ <strong class="userinput"><code>dnssec-keyfromlabel -l sample-zsk example.net</code></strong>
+</pre>
+<p>Alternatively, you may prefer to generate a conventional
+ on-disk key, using dnssec-keygen:</p>
+<pre class="screen">
+$ <strong class="userinput"><code>dnssec-keygen example.net</code></strong>
+</pre>
+<p>This provides less security than an HSM key, but since
+ HSMs can be slow or cumbersome to use for security reasons, it
+ may be more efficient to reserve HSM keys for use in the less
+ frequent key-signing operation. The zone-signing key can be
+ rolled more frequently, if you wish, to compensate for a
+ reduction in key security.</p>
+<p>Now you can sign the zone. (Note: If not using the -S
+ option to
+ <span><strong class="command">dnssec-signzone</strong></span>, it will be necessary to add
+ the contents of both
+ <code class="filename">K*.key</code> files to the zone master file before
+ signing it.)</p>
+<pre class="screen">
+$ <strong class="userinput"><code>dnssec-signzone -S example.net</code></strong>
+Enter PIN:
+Verifying the zone using the following algorithms:
+NSEC3RSASHA1.
+Zone signing complete:
+Algorithm: NSEC3RSASHA1: ZSKs: 1, KSKs: 1 active, 0 revoked, 0 stand-by
+example.net.signed
+</pre>
+</div>
+<div class="sect2" lang="en">
+<div class="titlepage"><div><div><h3 class="title">
+<a name="id2609709"></a>Specifying the engine on the command line</h3></div></div></div>
+<p>The OpenSSL engine can be specified in
+ <span><strong class="command">named</strong></span> and all of the BIND
+ <span><strong class="command">dnssec-*</strong></span> tools by using the "-E
+ &lt;engine&gt;" command line option. If BIND 9 is built with
+ the --with-pkcs11 option, this option defaults to "pkcs11".
+ Specifying the engine will generally not be necessary unless
+ for some reason you wish to use a different OpenSSL
+ engine.</p>
+<p>If you wish to disable use of the "pkcs11" engine &#8212;
+ for troubleshooting purposes, or because the HSM is unavailable
+ &#8212; set the engine to the empty string. For example:</p>
+<pre class="screen">
+$ <strong class="userinput"><code>dnssec-signzone -E '' -S example.net</code></strong>
+</pre>
+<p>This causes
+ <span><strong class="command">dnssec-signzone</strong></span> to run as if it were compiled
+ without the --with-pkcs11 option.</p>
+</div>
+<div class="sect2" lang="en">
+<div class="titlepage"><div><div><h3 class="title">
+<a name="id2609755"></a>Running named with automatic zone re-signing</h3></div></div></div>
+<p>If you want
+ <span><strong class="command">named</strong></span> to dynamically re-sign zones using HSM
+ keys, and/or to to sign new records inserted via nsupdate, then
+ named must have access to the HSM PIN. This can be accomplished
+ by placing the PIN into the openssl.cnf file (in the above
+ examples,
+ <code class="filename">/opt/pkcs11/usr/ssl/openssl.cnf</code>).</p>
+<p>The location of the openssl.cnf file can be overridden by
+ setting the OPENSSL_CONF environment variable before running
+ named.</p>
+<p>Sample openssl.cnf:</p>
+<pre class="programlisting">
+ openssl_conf = openssl_def
+ [ openssl_def ]
+ engines = engine_section
+ [ engine_section ]
+ pkcs11 = pkcs11_section
+ [ pkcs11_section ]
+ PIN = <em class="replaceable"><code>&lt;PLACE PIN HERE&gt;</code></em>
+</pre>
+<p>This will also allow the dnssec-* tools to access the HSM
+ without PIN entry. (The pkcs11-* tools access the HSM directly,
+ not via OpenSSL, so a PIN will still be required to use
+ them.)</p>
+<div class="warning" style="margin-left: 0.5in; margin-right: 0.5in;">
+<h3 class="title">Warning</h3>
+<p>Placing the HSM's PIN in a text file in
+ this manner may reduce the security advantage of using an
+ HSM. Be sure this is what you want to do before configuring
+ OpenSSL in this way.</p>
+</div>
+</div>
+</div>
+<div class="sect1" lang="en">
+<div class="titlepage"><div><div><h2 class="title" style="clear: both">
+<a name="id2572490"></a>IPv6 Support in <acronym class="acronym">BIND</acronym> 9</h2></div></div></div>
<p>
<acronym class="acronym">BIND</acronym> 9 fully supports all currently
defined forms of IPv6 name to address and address to name
@@ -1017,7 +1789,7 @@ options {
</p>
<div class="sect2" lang="en">
<div class="titlepage"><div><div><h3 class="title">
-<a name="id2572172"></a>Address Lookups Using AAAA Records</h3></div></div></div>
+<a name="id2572757"></a>Address Lookups Using AAAA Records</h3></div></div></div>
<p>
The IPv6 AAAA record is a parallel to the IPv4 A record,
and, unlike the deprecated A6 record, specifies the entire
@@ -1036,7 +1808,7 @@ host 3600 IN AAAA 2001:db8::1
</div>
<div class="sect2" lang="en">
<div class="titlepage"><div><div><h3 class="title">
-<a name="id2572194"></a>Address to Name Lookups Using Nibble Format</h3></div></div></div>
+<a name="id2572846"></a>Address to Name Lookups Using Nibble Format</h3></div></div></div>
<p>
When looking up an address in nibble format, the address
components are simply reversed, just as in IPv4, and
@@ -1048,7 +1820,8 @@ host 3600 IN AAAA 2001:db8::1
</p>
<pre class="programlisting">
$ORIGIN 0.0.0.0.0.0.0.0.8.b.d.0.1.0.0.2.ip6.arpa.
-1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0 14400 IN PTR host.example.com.
+1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0 14400 IN PTR (
+ host.example.com. )
</pre>
</div>
</div>
diff --git a/contrib/bind9/doc/arm/Bv9ARM.ch05.html b/contrib/bind9/doc/arm/Bv9ARM.ch05.html
index b0339b4..3b60755 100644
--- a/contrib/bind9/doc/arm/Bv9ARM.ch05.html
+++ b/contrib/bind9/doc/arm/Bv9ARM.ch05.html
@@ -1,5 +1,5 @@
<!--
- - Copyright (C) 2004-2010 Internet Systems Consortium, Inc. ("ISC")
+ - Copyright (C) 2004-2011 Internet Systems Consortium, Inc. ("ISC")
- Copyright (C) 2000-2003 Internet Software Consortium.
-
- Permission to use, copy, modify, and/or distribute this software for any
@@ -14,7 +14,7 @@
- OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
- PERFORMANCE OF THIS SOFTWARE.
-->
-<!-- $Id: Bv9ARM.ch05.html,v 1.71.48.6 2010-01-24 01:55:26 tbox Exp $ -->
+<!-- $Id: Bv9ARM.ch05.html,v 1.93 2011-01-05 01:14:08 tbox Exp $ -->
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
@@ -45,13 +45,13 @@
<div class="toc">
<p><b>Table of Contents</b></p>
<dl>
-<dt><span class="sect1"><a href="Bv9ARM.ch05.html#id2572227">The Lightweight Resolver Library</a></span></dt>
+<dt><span class="sect1"><a href="Bv9ARM.ch05.html#id2572880">The Lightweight Resolver Library</a></span></dt>
<dt><span class="sect1"><a href="Bv9ARM.ch05.html#lwresd">Running a Resolver Daemon</a></span></dt>
</dl>
</div>
<div class="sect1" lang="en">
<div class="titlepage"><div><div><h2 class="title" style="clear: both">
-<a name="id2572227"></a>The Lightweight Resolver Library</h2></div></div></div>
+<a name="id2572880"></a>The Lightweight Resolver Library</h2></div></div></div>
<p>
Traditionally applications have been linked with a stub resolver
library that sends recursive DNS queries to a local caching name
diff --git a/contrib/bind9/doc/arm/Bv9ARM.ch06.html b/contrib/bind9/doc/arm/Bv9ARM.ch06.html
index d969e4b..3524348 100644
--- a/contrib/bind9/doc/arm/Bv9ARM.ch06.html
+++ b/contrib/bind9/doc/arm/Bv9ARM.ch06.html
@@ -1,5 +1,5 @@
<!--
- - Copyright (C) 2004-2010 Internet Systems Consortium, Inc. ("ISC")
+ - Copyright (C) 2004-2011 Internet Systems Consortium, Inc. ("ISC")
- Copyright (C) 2000-2003 Internet Software Consortium.
-
- Permission to use, copy, modify, and/or distribute this software for any
@@ -14,7 +14,7 @@
- OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
- PERFORMANCE OF THIS SOFTWARE.
-->
-<!-- $Id: Bv9ARM.ch06.html,v 1.201.14.21 2010-08-20 02:05:39 tbox Exp $ -->
+<!-- $Id: Bv9ARM.ch06.html,v 1.275.8.1.2.1 2011-06-09 03:41:07 tbox Exp $ -->
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
@@ -48,55 +48,58 @@
<dt><span class="sect1"><a href="Bv9ARM.ch06.html#configuration_file_elements">Configuration File Elements</a></span></dt>
<dd><dl>
<dt><span class="sect2"><a href="Bv9ARM.ch06.html#address_match_lists">Address Match Lists</a></span></dt>
-<dt><span class="sect2"><a href="Bv9ARM.ch06.html#id2573606">Comment Syntax</a></span></dt>
+<dt><span class="sect2"><a href="Bv9ARM.ch06.html#id2574290">Comment Syntax</a></span></dt>
</dl></dd>
<dt><span class="sect1"><a href="Bv9ARM.ch06.html#Configuration_File_Grammar">Configuration File Grammar</a></span></dt>
<dd><dl>
-<dt><span class="sect2"><a href="Bv9ARM.ch06.html#id2574305"><span><strong class="command">acl</strong></span> Statement Grammar</a></span></dt>
+<dt><span class="sect2"><a href="Bv9ARM.ch06.html#id2574944"><span><strong class="command">acl</strong></span> Statement Grammar</a></span></dt>
<dt><span class="sect2"><a href="Bv9ARM.ch06.html#acl"><span><strong class="command">acl</strong></span> Statement Definition and
Usage</a></span></dt>
-<dt><span class="sect2"><a href="Bv9ARM.ch06.html#id2574494"><span><strong class="command">controls</strong></span> Statement Grammar</a></span></dt>
+<dt><span class="sect2"><a href="Bv9ARM.ch06.html#id2575133"><span><strong class="command">controls</strong></span> Statement Grammar</a></span></dt>
<dt><span class="sect2"><a href="Bv9ARM.ch06.html#controls_statement_definition_and_usage"><span><strong class="command">controls</strong></span> Statement Definition and
Usage</a></span></dt>
-<dt><span class="sect2"><a href="Bv9ARM.ch06.html#id2574923"><span><strong class="command">include</strong></span> Statement Grammar</a></span></dt>
-<dt><span class="sect2"><a href="Bv9ARM.ch06.html#id2574940"><span><strong class="command">include</strong></span> Statement Definition and
+<dt><span class="sect2"><a href="Bv9ARM.ch06.html#id2575425"><span><strong class="command">include</strong></span> Statement Grammar</a></span></dt>
+<dt><span class="sect2"><a href="Bv9ARM.ch06.html#id2575442"><span><strong class="command">include</strong></span> Statement Definition and
Usage</a></span></dt>
-<dt><span class="sect2"><a href="Bv9ARM.ch06.html#id2574964"><span><strong class="command">key</strong></span> Statement Grammar</a></span></dt>
-<dt><span class="sect2"><a href="Bv9ARM.ch06.html#id2574987"><span><strong class="command">key</strong></span> Statement Definition and Usage</a></span></dt>
-<dt><span class="sect2"><a href="Bv9ARM.ch06.html#id2575078"><span><strong class="command">logging</strong></span> Statement Grammar</a></span></dt>
-<dt><span class="sect2"><a href="Bv9ARM.ch06.html#id2575204"><span><strong class="command">logging</strong></span> Statement Definition and
+<dt><span class="sect2"><a href="Bv9ARM.ch06.html#id2575465"><span><strong class="command">key</strong></span> Statement Grammar</a></span></dt>
+<dt><span class="sect2"><a href="Bv9ARM.ch06.html#id2575489"><span><strong class="command">key</strong></span> Statement Definition and Usage</a></span></dt>
+<dt><span class="sect2"><a href="Bv9ARM.ch06.html#id2575648"><span><strong class="command">logging</strong></span> Statement Grammar</a></span></dt>
+<dt><span class="sect2"><a href="Bv9ARM.ch06.html#id2575842"><span><strong class="command">logging</strong></span> Statement Definition and
Usage</a></span></dt>
-<dt><span class="sect2"><a href="Bv9ARM.ch06.html#id2577401"><span><strong class="command">lwres</strong></span> Statement Grammar</a></span></dt>
-<dt><span class="sect2"><a href="Bv9ARM.ch06.html#id2577475"><span><strong class="command">lwres</strong></span> Statement Definition and Usage</a></span></dt>
-<dt><span class="sect2"><a href="Bv9ARM.ch06.html#id2577539"><span><strong class="command">masters</strong></span> Statement Grammar</a></span></dt>
-<dt><span class="sect2"><a href="Bv9ARM.ch06.html#id2577582"><span><strong class="command">masters</strong></span> Statement Definition and
+<dt><span class="sect2"><a href="Bv9ARM.ch06.html#id2577841"><span><strong class="command">lwres</strong></span> Statement Grammar</a></span></dt>
+<dt><span class="sect2"><a href="Bv9ARM.ch06.html#id2577982"><span><strong class="command">lwres</strong></span> Statement Definition and Usage</a></span></dt>
+<dt><span class="sect2"><a href="Bv9ARM.ch06.html#id2578046"><span><strong class="command">masters</strong></span> Statement Grammar</a></span></dt>
+<dt><span class="sect2"><a href="Bv9ARM.ch06.html#id2578090"><span><strong class="command">masters</strong></span> Statement Definition and
Usage</a></span></dt>
-<dt><span class="sect2"><a href="Bv9ARM.ch06.html#id2577597"><span><strong class="command">options</strong></span> Statement Grammar</a></span></dt>
+<dt><span class="sect2"><a href="Bv9ARM.ch06.html#id2578105"><span><strong class="command">options</strong></span> Statement Grammar</a></span></dt>
<dt><span class="sect2"><a href="Bv9ARM.ch06.html#options"><span><strong class="command">options</strong></span> Statement Definition and
Usage</a></span></dt>
<dt><span class="sect2"><a href="Bv9ARM.ch06.html#server_statement_grammar"><span><strong class="command">server</strong></span> Statement Grammar</a></span></dt>
<dt><span class="sect2"><a href="Bv9ARM.ch06.html#server_statement_definition_and_usage"><span><strong class="command">server</strong></span> Statement Definition and
Usage</a></span></dt>
<dt><span class="sect2"><a href="Bv9ARM.ch06.html#statschannels"><span><strong class="command">statistics-channels</strong></span> Statement Grammar</a></span></dt>
-<dt><span class="sect2"><a href="Bv9ARM.ch06.html#id2586907"><span><strong class="command">statistics-channels</strong></span> Statement Definition and
+<dt><span class="sect2"><a href="Bv9ARM.ch06.html#id2589239"><span><strong class="command">statistics-channels</strong></span> Statement Definition and
Usage</a></span></dt>
-<dt><span class="sect2"><a href="Bv9ARM.ch06.html#id2587062"><span><strong class="command">trusted-keys</strong></span> Statement Grammar</a></span></dt>
-<dt><span class="sect2"><a href="Bv9ARM.ch06.html#id2587113"><span><strong class="command">trusted-keys</strong></span> Statement Definition
+<dt><span class="sect2"><a href="Bv9ARM.ch06.html#trusted-keys"><span><strong class="command">trusted-keys</strong></span> Statement Grammar</a></span></dt>
+<dt><span class="sect2"><a href="Bv9ARM.ch06.html#id2589379"><span><strong class="command">trusted-keys</strong></span> Statement Definition
+ and Usage</a></span></dt>
+<dt><span class="sect2"><a href="Bv9ARM.ch06.html#id2589494"><span><strong class="command">managed-keys</strong></span> Statement Grammar</a></span></dt>
+<dt><span class="sect2"><a href="Bv9ARM.ch06.html#managed-keys"><span><strong class="command">managed-keys</strong></span> Statement Definition
and Usage</a></span></dt>
<dt><span class="sect2"><a href="Bv9ARM.ch06.html#view_statement_grammar"><span><strong class="command">view</strong></span> Statement Grammar</a></span></dt>
-<dt><span class="sect2"><a href="Bv9ARM.ch06.html#id2587195"><span><strong class="command">view</strong></span> Statement Definition and Usage</a></span></dt>
+<dt><span class="sect2"><a href="Bv9ARM.ch06.html#id2589851"><span><strong class="command">view</strong></span> Statement Definition and Usage</a></span></dt>
<dt><span class="sect2"><a href="Bv9ARM.ch06.html#zone_statement_grammar"><span><strong class="command">zone</strong></span>
Statement Grammar</a></span></dt>
-<dt><span class="sect2"><a href="Bv9ARM.ch06.html#id2588600"><span><strong class="command">zone</strong></span> Statement Definition and Usage</a></span></dt>
+<dt><span class="sect2"><a href="Bv9ARM.ch06.html#id2591396"><span><strong class="command">zone</strong></span> Statement Definition and Usage</a></span></dt>
</dl></dd>
-<dt><span class="sect1"><a href="Bv9ARM.ch06.html#id2591216">Zone File</a></span></dt>
+<dt><span class="sect1"><a href="Bv9ARM.ch06.html#id2594660">Zone File</a></span></dt>
<dd><dl>
<dt><span class="sect2"><a href="Bv9ARM.ch06.html#types_of_resource_records_and_when_to_use_them">Types of Resource Records and When to Use Them</a></span></dt>
-<dt><span class="sect2"><a href="Bv9ARM.ch06.html#id2593378">Discussion of MX Records</a></span></dt>
+<dt><span class="sect2"><a href="Bv9ARM.ch06.html#id2596822">Discussion of MX Records</a></span></dt>
<dt><span class="sect2"><a href="Bv9ARM.ch06.html#Setting_TTLs">Setting TTLs</a></span></dt>
-<dt><span class="sect2"><a href="Bv9ARM.ch06.html#id2593993">Inverse Mapping in IPv4</a></span></dt>
-<dt><span class="sect2"><a href="Bv9ARM.ch06.html#id2594188">Other Zone File Directives</a></span></dt>
-<dt><span class="sect2"><a href="Bv9ARM.ch06.html#id2594461"><acronym class="acronym">BIND</acronym> Master File Extension: the <span><strong class="command">$GENERATE</strong></span> Directive</a></span></dt>
+<dt><span class="sect2"><a href="Bv9ARM.ch06.html#id2597574">Inverse Mapping in IPv4</a></span></dt>
+<dt><span class="sect2"><a href="Bv9ARM.ch06.html#id2597701">Other Zone File Directives</a></span></dt>
+<dt><span class="sect2"><a href="Bv9ARM.ch06.html#id2597974"><acronym class="acronym">BIND</acronym> Master File Extension: the <span><strong class="command">$GENERATE</strong></span> Directive</a></span></dt>
<dt><span class="sect2"><a href="Bv9ARM.ch06.html#zonefile_format">Additional File Formats</a></span></dt>
</dl></dd>
<dt><span class="sect1"><a href="Bv9ARM.ch06.html#statistics">BIND9 Statistics</a></span></dt>
@@ -193,6 +196,19 @@
<tr>
<td>
<p>
+ <code class="varname">namelist</code>
+ </p>
+ </td>
+<td>
+ <p>
+ A list of one or more <code class="varname">domain_name</code>
+ elements.
+ </p>
+ </td>
+</tr>
+<tr>
+<td>
+ <p>
<code class="varname">dotted_decimal</code>
</p>
</td>
@@ -461,7 +477,7 @@
<a name="address_match_lists"></a>Address Match Lists</h3></div></div></div>
<div class="sect3" lang="en">
<div class="titlepage"><div><div><h4 class="title">
-<a name="id2573372"></a>Syntax</h4></div></div></div>
+<a name="id2574056"></a>Syntax</h4></div></div></div>
<pre class="programlisting"><code class="varname">address_match_list</code> = address_match_list_element ;
[<span class="optional"> address_match_list_element; ... </span>]
<code class="varname">address_match_list_element</code> = [<span class="optional"> ! </span>] (ip_address [<span class="optional">/length</span>] |
@@ -470,7 +486,7 @@
</div>
<div class="sect3" lang="en">
<div class="titlepage"><div><div><h4 class="title">
-<a name="id2573468"></a>Definition and Usage</h4></div></div></div>
+<a name="id2574084"></a>Definition and Usage</h4></div></div></div>
<p>
Address match lists are primarily used to determine access
control for various server operations. They are also used in
@@ -554,7 +570,7 @@
</div>
<div class="sect2" lang="en">
<div class="titlepage"><div><div><h3 class="title">
-<a name="id2573606"></a>Comment Syntax</h3></div></div></div>
+<a name="id2574290"></a>Comment Syntax</h3></div></div></div>
<p>
The <acronym class="acronym">BIND</acronym> 9 comment syntax allows for
comments to appear
@@ -564,7 +580,7 @@
</p>
<div class="sect3" lang="en">
<div class="titlepage"><div><div><h4 class="title">
-<a name="id2573621"></a>Syntax</h4></div></div></div>
+<a name="id2574305"></a>Syntax</h4></div></div></div>
<p>
</p>
<pre class="programlisting">/* This is a <acronym class="acronym">BIND</acronym> comment as in C */</pre>
@@ -573,13 +589,14 @@
<pre class="programlisting">// This is a <acronym class="acronym">BIND</acronym> comment as in C++</pre>
<p>
</p>
-<pre class="programlisting"># This is a <acronym class="acronym">BIND</acronym> comment as in common UNIX shells and perl</pre>
+<pre class="programlisting"># This is a <acronym class="acronym">BIND</acronym> comment as in common UNIX shells
+# and perl</pre>
<p>
</p>
</div>
<div class="sect3" lang="en">
<div class="titlepage"><div><div><h4 class="title">
-<a name="id2573651"></a>Definition and Usage</h4></div></div></div>
+<a name="id2574334"></a>Definition and Usage</h4></div></div></div>
<p>
Comments may appear anywhere that whitespace may appear in
a <acronym class="acronym">BIND</acronym> configuration file.
@@ -792,6 +809,17 @@
</tr>
<tr>
<td>
+ <p><span><strong class="command">managed-keys</strong></span></p>
+ </td>
+<td>
+ <p>
+ lists DNSSEC keys to be kept up to date
+ using RFC 5011 trust anchor maintenance.
+ </p>
+ </td>
+</tr>
+<tr>
+<td>
<p><span><strong class="command">view</strong></span></p>
</td>
<td>
@@ -820,7 +848,7 @@
</p>
<div class="sect2" lang="en">
<div class="titlepage"><div><div><h3 class="title">
-<a name="id2574305"></a><span><strong class="command">acl</strong></span> Statement Grammar</h3></div></div></div>
+<a name="id2574944"></a><span><strong class="command">acl</strong></span> Statement Grammar</h3></div></div></div>
<pre class="programlisting"><span><strong class="command">acl</strong></span> acl-name {
address_match_list
};
@@ -902,12 +930,14 @@
</div>
<div class="sect2" lang="en">
<div class="titlepage"><div><div><h3 class="title">
-<a name="id2574494"></a><span><strong class="command">controls</strong></span> Statement Grammar</h3></div></div></div>
+<a name="id2575133"></a><span><strong class="command">controls</strong></span> Statement Grammar</h3></div></div></div>
<pre class="programlisting"><span><strong class="command">controls</strong></span> {
- [ inet ( ip_addr | * ) [ port ip_port ] allow { <em class="replaceable"><code> address_match_list </code></em> }
+ [ inet ( ip_addr | * ) [ port ip_port ]
+ allow { <em class="replaceable"><code> address_match_list </code></em> }
keys { <em class="replaceable"><code>key_list</code></em> }; ]
[ inet ...; ]
- [ unix <em class="replaceable"><code>path</code></em> perm <em class="replaceable"><code>number</code></em> owner <em class="replaceable"><code>number</code></em> group <em class="replaceable"><code>number</code></em> keys { <em class="replaceable"><code>key_list</code></em> }; ]
+ [ unix <em class="replaceable"><code>path</code></em> perm <em class="replaceable"><code>number</code></em> owner <em class="replaceable"><code>number</code></em> group <em class="replaceable"><code>number</code></em>
+ keys { <em class="replaceable"><code>key_list</code></em> }; ]
[ unix ...; ]
};
</pre>
@@ -1024,12 +1054,12 @@
</div>
<div class="sect2" lang="en">
<div class="titlepage"><div><div><h3 class="title">
-<a name="id2574923"></a><span><strong class="command">include</strong></span> Statement Grammar</h3></div></div></div>
+<a name="id2575425"></a><span><strong class="command">include</strong></span> Statement Grammar</h3></div></div></div>
<pre class="programlisting"><span><strong class="command">include</strong></span> <em class="replaceable"><code>filename</code></em>;</pre>
</div>
<div class="sect2" lang="en">
<div class="titlepage"><div><div><h3 class="title">
-<a name="id2574940"></a><span><strong class="command">include</strong></span> Statement Definition and
+<a name="id2575442"></a><span><strong class="command">include</strong></span> Statement Definition and
Usage</h3></div></div></div>
<p>
The <span><strong class="command">include</strong></span> statement inserts the
@@ -1044,7 +1074,7 @@
</div>
<div class="sect2" lang="en">
<div class="titlepage"><div><div><h3 class="title">
-<a name="id2574964"></a><span><strong class="command">key</strong></span> Statement Grammar</h3></div></div></div>
+<a name="id2575465"></a><span><strong class="command">key</strong></span> Statement Grammar</h3></div></div></div>
<pre class="programlisting"><span><strong class="command">key</strong></span> <em class="replaceable"><code>key_id</code></em> {
algorithm <em class="replaceable"><code>string</code></em>;
secret <em class="replaceable"><code>string</code></em>;
@@ -1053,7 +1083,7 @@
</div>
<div class="sect2" lang="en">
<div class="titlepage"><div><div><h3 class="title">
-<a name="id2574987"></a><span><strong class="command">key</strong></span> Statement Definition and Usage</h3></div></div></div>
+<a name="id2575489"></a><span><strong class="command">key</strong></span> Statement Definition and Usage</h3></div></div></div>
<p>
The <span><strong class="command">key</strong></span> statement defines a shared
secret key for use with TSIG (see <a href="Bv9ARM.ch04.html#tsig" title="TSIG">the section called &#8220;TSIG&#8221;</a>)
@@ -1100,7 +1130,7 @@
</div>
<div class="sect2" lang="en">
<div class="titlepage"><div><div><h3 class="title">
-<a name="id2575078"></a><span><strong class="command">logging</strong></span> Statement Grammar</h3></div></div></div>
+<a name="id2575648"></a><span><strong class="command">logging</strong></span> Statement Grammar</h3></div></div></div>
<pre class="programlisting"><span><strong class="command">logging</strong></span> {
[ <span><strong class="command">channel</strong></span> <em class="replaceable"><code>channel_name</code></em> {
( <span><strong class="command">file</strong></span> <em class="replaceable"><code>path_name</code></em>
@@ -1124,7 +1154,7 @@
</div>
<div class="sect2" lang="en">
<div class="titlepage"><div><div><h3 class="title">
-<a name="id2575204"></a><span><strong class="command">logging</strong></span> Statement Definition and
+<a name="id2575842"></a><span><strong class="command">logging</strong></span> Statement Definition and
Usage</h3></div></div></div>
<p>
The <span><strong class="command">logging</strong></span> statement configures a
@@ -1158,7 +1188,7 @@
</p>
<div class="sect3" lang="en">
<div class="titlepage"><div><div><h4 class="title">
-<a name="id2575256"></a>The <span><strong class="command">channel</strong></span> Phrase</h4></div></div></div>
+<a name="id2575894"></a>The <span><strong class="command">channel</strong></span> Phrase</h4></div></div></div>
<p>
All log output goes to one or more <span class="emphasis"><em>channels</em></span>;
you can make as many of them as you want.
@@ -1342,32 +1372,30 @@ notrace</strong></span>. All debugging messages in the server have a debug
used is described in <a href="Bv9ARM.ch06.html#the_category_phrase" title="The category Phrase">the section called &#8220;The <span><strong class="command">category</strong></span> Phrase&#8221;</a>.
</p>
<pre class="programlisting">channel default_syslog {
- syslog daemon; // send to syslog's daemon
- // facility
- severity info; // only send priority info
- // and higher
-};
+ // send to syslog's daemon facility
+ syslog daemon;
+ // only send priority info and higher
+ severity info;
channel default_debug {
- file "named.run"; // write to named.run in
- // the working directory
- // Note: stderr is used instead
- // of "named.run"
- // if the server is started
- // with the '-f' option.
- severity dynamic; // log at the server's
- // current debug level
+ // write to named.run in the working directory
+ // Note: stderr is used instead of "named.run" if
+ // the server is started with the '-f' option.
+ file "named.run";
+ // log at the server's current debug level
+ severity dynamic;
};
channel default_stderr {
- stderr; // writes to stderr
- severity info; // only send priority info
- // and higher
+ // writes to stderr
+ stderr;
+ // only send priority info and higher
+ severity info;
};
channel null {
- null; // toss anything sent to
- // this channel
+ // toss anything sent to this channel
+ null;
};
</pre>
<p>
@@ -1610,12 +1638,14 @@ category notify { null; };
<p>
The query log entry reports the client's IP
address and port number, and the query name,
- class and type. It also reports whether the
+ class and type. Next it reports whether the
Recursion Desired flag was set (+ if set, -
if not set), if the query was signed (S),
- EDNS was in use (E), if DO (DNSSEC Ok) was
- set (D), or if CD (Checking Disabled) was set
- (C).
+ EDNS was in use (E), if TCP was used (T), if
+ DO (DNSSEC Ok) was set (D), or if CD (Checking
+ Disabled) was set (C). After this the
+ destination address the query was sent to is
+ reported.
</p>
<p>
@@ -1723,7 +1753,7 @@ category notify { null; };
</div>
<div class="sect3" lang="en">
<div class="titlepage"><div><div><h4 class="title">
-<a name="id2576820"></a>The <span><strong class="command">query-errors</strong></span> Category</h4></div></div></div>
+<a name="id2577253"></a>The <span><strong class="command">query-errors</strong></span> Category</h4></div></div></div>
<p>
The <span><strong class="command">query-errors</strong></span> category is
specifically intended for debugging purposes: To identify
@@ -1754,7 +1784,15 @@ category notify { null; };
The log message will look like as follows:
</p>
<p>
- <code class="computeroutput">fetch completed at resolver.c:2970 for www.example.com/A in 30.000183: timed out/success [domain:example.com,referral:2,restart:7,qrysent:8,timeout:5,lame:0,neterr:0,badresp:1,adberr:0,findfail:0,valfail:0]</code>
+
+ </p>
+<pre class="programlisting">
+fetch completed at resolver.c:2970 for www.example.com/A
+in 30.000183: timed out/success [domain:example.com,
+referral:2,restart:7,qrysent:8,timeout:5,lame:0,neterr:0,
+badresp:1,adberr:0,findfail:0,valfail:0]
+ </pre>
+<p>
</p>
<p>
The first part before the colon shows that a recursive
@@ -1943,13 +1981,14 @@ category notify { null; };
</div>
<div class="sect2" lang="en">
<div class="titlepage"><div><div><h3 class="title">
-<a name="id2577401"></a><span><strong class="command">lwres</strong></span> Statement Grammar</h3></div></div></div>
+<a name="id2577841"></a><span><strong class="command">lwres</strong></span> Statement Grammar</h3></div></div></div>
<p>
This is the grammar of the <span><strong class="command">lwres</strong></span>
statement in the <code class="filename">named.conf</code> file:
</p>
<pre class="programlisting"><span><strong class="command">lwres</strong></span> {
- [<span class="optional"> listen-on { <em class="replaceable"><code>ip_addr</code></em> [<span class="optional">port <em class="replaceable"><code>ip_port</code></em></span>] ; [<span class="optional"> <em class="replaceable"><code>ip_addr</code></em> [<span class="optional">port <em class="replaceable"><code>ip_port</code></em></span>] ; ... </span>] }; </span>]
+ [<span class="optional"> listen-on { <em class="replaceable"><code>ip_addr</code></em> [<span class="optional">port <em class="replaceable"><code>ip_port</code></em></span>] ;
+ [<span class="optional"> <em class="replaceable"><code>ip_addr</code></em> [<span class="optional">port <em class="replaceable"><code>ip_port</code></em></span>] ; ... </span>] }; </span>]
[<span class="optional"> view <em class="replaceable"><code>view_name</code></em>; </span>]
[<span class="optional"> search { <em class="replaceable"><code>domain_name</code></em> ; [<span class="optional"> <em class="replaceable"><code>domain_name</code></em> ; ... </span>] }; </span>]
[<span class="optional"> ndots <em class="replaceable"><code>number</code></em>; </span>]
@@ -1958,7 +1997,7 @@ category notify { null; };
</div>
<div class="sect2" lang="en">
<div class="titlepage"><div><div><h3 class="title">
-<a name="id2577475"></a><span><strong class="command">lwres</strong></span> Statement Definition and Usage</h3></div></div></div>
+<a name="id2577982"></a><span><strong class="command">lwres</strong></span> Statement Definition and Usage</h3></div></div></div>
<p>
The <span><strong class="command">lwres</strong></span> statement configures the
name
@@ -2009,14 +2048,15 @@ category notify { null; };
</div>
<div class="sect2" lang="en">
<div class="titlepage"><div><div><h3 class="title">
-<a name="id2577539"></a><span><strong class="command">masters</strong></span> Statement Grammar</h3></div></div></div>
+<a name="id2578046"></a><span><strong class="command">masters</strong></span> Statement Grammar</h3></div></div></div>
<pre class="programlisting">
-<span><strong class="command">masters</strong></span> <em class="replaceable"><code>name</code></em> [<span class="optional">port <em class="replaceable"><code>ip_port</code></em></span>] { ( <em class="replaceable"><code>masters_list</code></em> | <em class="replaceable"><code>ip_addr</code></em> [<span class="optional">port <em class="replaceable"><code>ip_port</code></em></span>] [<span class="optional">key <em class="replaceable"><code>key</code></em></span>] ) ; [<span class="optional">...</span>] };
+<span><strong class="command">masters</strong></span> <em class="replaceable"><code>name</code></em> [<span class="optional">port <em class="replaceable"><code>ip_port</code></em></span>] { ( <em class="replaceable"><code>masters_list</code></em> |
+ <em class="replaceable"><code>ip_addr</code></em> [<span class="optional">port <em class="replaceable"><code>ip_port</code></em></span>] [<span class="optional">key <em class="replaceable"><code>key</code></em></span>] ) ; [<span class="optional">...</span>] };
</pre>
</div>
<div class="sect2" lang="en">
<div class="titlepage"><div><div><h3 class="title">
-<a name="id2577582"></a><span><strong class="command">masters</strong></span> Statement Definition and
+<a name="id2578090"></a><span><strong class="command">masters</strong></span> Statement Definition and
Usage</h3></div></div></div>
<p><span><strong class="command">masters</strong></span>
lists allow for a common set of masters to be easily used by
@@ -2025,23 +2065,27 @@ category notify { null; };
</div>
<div class="sect2" lang="en">
<div class="titlepage"><div><div><h3 class="title">
-<a name="id2577597"></a><span><strong class="command">options</strong></span> Statement Grammar</h3></div></div></div>
+<a name="id2578105"></a><span><strong class="command">options</strong></span> Statement Grammar</h3></div></div></div>
<p>
This is the grammar of the <span><strong class="command">options</strong></span>
statement in the <code class="filename">named.conf</code> file:
</p>
<pre class="programlisting"><span><strong class="command">options</strong></span> {
+ [<span class="optional"> attach-cache <em class="replaceable"><code>cache_name</code></em>; </span>]
[<span class="optional"> version <em class="replaceable"><code>version_string</code></em>; </span>]
[<span class="optional"> hostname <em class="replaceable"><code>hostname_string</code></em>; </span>]
[<span class="optional"> server-id <em class="replaceable"><code>server_id_string</code></em>; </span>]
[<span class="optional"> directory <em class="replaceable"><code>path_name</code></em>; </span>]
[<span class="optional"> key-directory <em class="replaceable"><code>path_name</code></em>; </span>]
+ [<span class="optional"> managed-keys-directory <em class="replaceable"><code>path_name</code></em>; </span>]
[<span class="optional"> named-xfer <em class="replaceable"><code>path_name</code></em>; </span>]
+ [<span class="optional"> tkey-gssapi-keytab <em class="replaceable"><code>path_name</code></em>; </span>]
[<span class="optional"> tkey-gssapi-credential <em class="replaceable"><code>principal</code></em>; </span>]
[<span class="optional"> tkey-domain <em class="replaceable"><code>domainname</code></em>; </span>]
[<span class="optional"> tkey-dhkey <em class="replaceable"><code>key_name</code></em> <em class="replaceable"><code>key_tag</code></em>; </span>]
[<span class="optional"> cache-file <em class="replaceable"><code>path_name</code></em>; </span>]
[<span class="optional"> dump-file <em class="replaceable"><code>path_name</code></em>; </span>]
+ [<span class="optional"> bindkeys-file <em class="replaceable"><code>path_name</code></em>; </span>]
[<span class="optional"> memstatistics <em class="replaceable"><code>yes_or_no</code></em>; </span>]
[<span class="optional"> memstatistics-file <em class="replaceable"><code>path_name</code></em>; </span>]
[<span class="optional"> pid-file <em class="replaceable"><code>path_name</code></em>; </span>]
@@ -2066,8 +2110,9 @@ category notify { null; };
[<span class="optional"> maintain-ixfr-base <em class="replaceable"><code>yes_or_no</code></em>; </span>]
[<span class="optional"> ixfr-from-differences (<em class="replaceable"><code>yes_or_no</code></em> | <code class="constant">master</code> | <code class="constant">slave</code>); </span>]
[<span class="optional"> dnssec-enable <em class="replaceable"><code>yes_or_no</code></em>; </span>]
- [<span class="optional"> dnssec-validation <em class="replaceable"><code>yes_or_no</code></em>; </span>]
- [<span class="optional"> dnssec-lookaside <em class="replaceable"><code>domain</code></em> trust-anchor <em class="replaceable"><code>domain</code></em>; </span>]
+ [<span class="optional"> dnssec-validation (<em class="replaceable"><code>yes_or_no</code></em> | <code class="constant">auto</code>); </span>]
+ [<span class="optional"> dnssec-lookaside ( <em class="replaceable"><code>auto</code></em> |
+ <em class="replaceable"><code>domain</code></em> trust-anchor <em class="replaceable"><code>domain</code></em> ); </span>]
[<span class="optional"> dnssec-must-be-secure <em class="replaceable"><code>domain yes_or_no</code></em>; </span>]
[<span class="optional"> dnssec-accept-expired <em class="replaceable"><code>yes_or_no</code></em>; </span>]
[<span class="optional"> forward ( <em class="replaceable"><code>only</code></em> | <em class="replaceable"><code>first</code></em> ); </span>]
@@ -2078,12 +2123,14 @@ category notify { null; };
... }; </span>]
[<span class="optional"> check-names ( <em class="replaceable"><code>master</code></em> | <em class="replaceable"><code>slave</code></em> | <em class="replaceable"><code>response</code></em> )
( <em class="replaceable"><code>warn</code></em> | <em class="replaceable"><code>fail</code></em> | <em class="replaceable"><code>ignore</code></em> ); </span>]
+ [<span class="optional"> check-dup-records ( <em class="replaceable"><code>warn</code></em> | <em class="replaceable"><code>fail</code></em> | <em class="replaceable"><code>ignore</code></em> ); </span>]
[<span class="optional"> check-mx ( <em class="replaceable"><code>warn</code></em> | <em class="replaceable"><code>fail</code></em> | <em class="replaceable"><code>ignore</code></em> ); </span>]
[<span class="optional"> check-wildcard <em class="replaceable"><code>yes_or_no</code></em>; </span>]
[<span class="optional"> check-integrity <em class="replaceable"><code>yes_or_no</code></em>; </span>]
[<span class="optional"> check-mx-cname ( <em class="replaceable"><code>warn</code></em> | <em class="replaceable"><code>fail</code></em> | <em class="replaceable"><code>ignore</code></em> ); </span>]
[<span class="optional"> check-srv-cname ( <em class="replaceable"><code>warn</code></em> | <em class="replaceable"><code>fail</code></em> | <em class="replaceable"><code>ignore</code></em> ); </span>]
[<span class="optional"> check-sibling <em class="replaceable"><code>yes_or_no</code></em>; </span>]
+ [<span class="optional"> allow-new-zones { <em class="replaceable"><code>yes_or_no</code></em> }; </span>]
[<span class="optional"> allow-notify { <em class="replaceable"><code>address_match_list</code></em> }; </span>]
[<span class="optional"> allow-query { <em class="replaceable"><code>address_match_list</code></em> }; </span>]
[<span class="optional"> allow-query-on { <em class="replaceable"><code>address_match_list</code></em> }; </span>]
@@ -2095,6 +2142,8 @@ category notify { null; };
[<span class="optional"> allow-update { <em class="replaceable"><code>address_match_list</code></em> }; </span>]
[<span class="optional"> allow-update-forwarding { <em class="replaceable"><code>address_match_list</code></em> }; </span>]
[<span class="optional"> update-check-ksk <em class="replaceable"><code>yes_or_no</code></em>; </span>]
+ [<span class="optional"> dnssec-dnskey-kskonly <em class="replaceable"><code>yes_or_no</code></em>; </span>]
+ [<span class="optional"> dnssec-secure-to-insecure <em class="replaceable"><code>yes_or_no</code></em> ;</span>]
[<span class="optional"> try-tcp-refresh <em class="replaceable"><code>yes_or_no</code></em>; </span>]
[<span class="optional"> allow-v6-synthesis { <em class="replaceable"><code>address_match_list</code></em> }; </span>]
[<span class="optional"> blackhole { <em class="replaceable"><code>address_match_list</code></em> }; </span>]
@@ -2132,13 +2181,15 @@ category notify { null; };
[<span class="optional"> transfer-source (<em class="replaceable"><code>ip4_addr</code></em> | <code class="constant">*</code>) [<span class="optional">port <em class="replaceable"><code>ip_port</code></em></span>] ; </span>]
[<span class="optional"> transfer-source-v6 (<em class="replaceable"><code>ip6_addr</code></em> | <code class="constant">*</code>) [<span class="optional">port <em class="replaceable"><code>ip_port</code></em></span>] ; </span>]
[<span class="optional"> alt-transfer-source (<em class="replaceable"><code>ip4_addr</code></em> | <code class="constant">*</code>) [<span class="optional">port <em class="replaceable"><code>ip_port</code></em></span>] ; </span>]
- [<span class="optional"> alt-transfer-source-v6 (<em class="replaceable"><code>ip6_addr</code></em> | <code class="constant">*</code>) [<span class="optional">port <em class="replaceable"><code>ip_port</code></em></span>] ; </span>]
+ [<span class="optional"> alt-transfer-source-v6 (<em class="replaceable"><code>ip6_addr</code></em> | <code class="constant">*</code>)
+ [<span class="optional">port <em class="replaceable"><code>ip_port</code></em></span>] ; </span>]
[<span class="optional"> use-alt-transfer-source <em class="replaceable"><code>yes_or_no</code></em>; </span>]
[<span class="optional"> notify-delay <em class="replaceable"><code>seconds</code></em> ; </span>]
[<span class="optional"> notify-source (<em class="replaceable"><code>ip4_addr</code></em> | <code class="constant">*</code>) [<span class="optional">port <em class="replaceable"><code>ip_port</code></em></span>] ; </span>]
[<span class="optional"> notify-source-v6 (<em class="replaceable"><code>ip6_addr</code></em> | <code class="constant">*</code>) [<span class="optional">port <em class="replaceable"><code>ip_port</code></em></span>] ; </span>]
[<span class="optional"> notify-to-soa <em class="replaceable"><code>yes_or_no</code></em> ; </span>]
- [<span class="optional"> also-notify { <em class="replaceable"><code>ip_addr</code></em> [<span class="optional">port <em class="replaceable"><code>ip_port</code></em></span>] ; [<span class="optional"> <em class="replaceable"><code>ip_addr</code></em> [<span class="optional">port <em class="replaceable"><code>ip_port</code></em></span>] ; ... </span>] }; </span>]
+ [<span class="optional"> also-notify { <em class="replaceable"><code>ip_addr</code></em> [<span class="optional">port <em class="replaceable"><code>ip_port</code></em></span>] ;
+ [<span class="optional"> <em class="replaceable"><code>ip_addr</code></em> [<span class="optional">port <em class="replaceable"><code>ip_port</code></em></span>] ; ... </span>] }; </span>]
[<span class="optional"> max-ixfr-log-size <em class="replaceable"><code>number</code></em>; </span>]
[<span class="optional"> max-journal-size <em class="replaceable"><code>size_spec</code></em>; </span>]
[<span class="optional"> coresize <em class="replaceable"><code>size_spec</code></em> ; </span>]
@@ -2174,12 +2225,25 @@ category notify { null; };
[<span class="optional"> random-device <em class="replaceable"><code>path_name</code></em> ; </span>]
[<span class="optional"> max-cache-size <em class="replaceable"><code>size_spec</code></em> ; </span>]
[<span class="optional"> match-mapped-addresses <em class="replaceable"><code>yes_or_no</code></em>; </span>]
+ [<span class="optional"> filter-aaaa-on-v4 ( <em class="replaceable"><code>yes_or_no</code></em> | <em class="replaceable"><code>break-dnssec</code></em> ); </span>]
+ [<span class="optional"> filter-aaaa { <em class="replaceable"><code>address_match_list</code></em> }; </span>]
+ [<span class="optional"> dns64 <em class="replaceable"><code>IPv6-prefix</code></em> {
+ [<span class="optional"> clients { <em class="replaceable"><code>address_match_list</code></em> }; </span>]
+ [<span class="optional"> mapped { <em class="replaceable"><code>address_match_list</code></em> }; </span>]
+ [<span class="optional"> exclude { <em class="replaceable"><code>address_match_list</code></em> }; </span>]
+ [<span class="optional"> suffix IPv6-address; </span>]
+ [<span class="optional"> recursive-only <em class="replaceable"><code>yes_or_no</code></em>; </span>]
+ [<span class="optional"> break-dnssec <em class="replaceable"><code>yes_or_no</code></em>; </span>]
+ }; </span>];
+ [<span class="optional"> dns64-server <em class="replaceable"><code>name</code></em> </span>]
+ [<span class="optional"> dns64-contact <em class="replaceable"><code>name</code></em> </span>]
[<span class="optional"> preferred-glue ( <em class="replaceable"><code>A</code></em> | <em class="replaceable"><code>AAAA</code></em> | <em class="replaceable"><code>NONE</code></em> ); </span>]
[<span class="optional"> edns-udp-size <em class="replaceable"><code>number</code></em>; </span>]
[<span class="optional"> max-udp-size <em class="replaceable"><code>number</code></em>; </span>]
[<span class="optional"> root-delegation-only [<span class="optional"> exclude { <em class="replaceable"><code>namelist</code></em> } </span>] ; </span>]
[<span class="optional"> querylog <em class="replaceable"><code>yes_or_no</code></em> ; </span>]
- [<span class="optional"> disable-algorithms <em class="replaceable"><code>domain</code></em> { <em class="replaceable"><code>algorithm</code></em>; [<span class="optional"> <em class="replaceable"><code>algorithm</code></em>; </span>] }; </span>]
+ [<span class="optional"> disable-algorithms <em class="replaceable"><code>domain</code></em> { <em class="replaceable"><code>algorithm</code></em>;
+ [<span class="optional"> <em class="replaceable"><code>algorithm</code></em>; </span>] }; </span>]
[<span class="optional"> acache-enable <em class="replaceable"><code>yes_or_no</code></em> ; </span>]
[<span class="optional"> acache-cleaning-interval <em class="replaceable"><code>number</code></em>; </span>]
[<span class="optional"> max-acache-size <em class="replaceable"><code>size_spec</code></em> ; </span>]
@@ -2192,6 +2256,10 @@ category notify { null; };
[<span class="optional"> disable-empty-zone <em class="replaceable"><code>zone_name</code></em> ; </span>]
[<span class="optional"> zero-no-soa-ttl <em class="replaceable"><code>yes_or_no</code></em> ; </span>]
[<span class="optional"> zero-no-soa-ttl-cache <em class="replaceable"><code>yes_or_no</code></em> ; </span>]
+ [<span class="optional"> resolver-query-timeout <em class="replaceable"><code>number</code></em> ; </span>]
+ [<span class="optional"> deny-answer-addresses { <em class="replaceable"><code>address_match_list</code></em> } [<span class="optional"> except-from { <em class="replaceable"><code>namelist</code></em> } </span>];</span>]
+ [<span class="optional"> deny-answer-aliases { <em class="replaceable"><code>namelist</code></em> } [<span class="optional"> except-from { <em class="replaceable"><code>namelist</code></em> } </span>];</span>]
+ [<span class="optional"> response-policy { <em class="replaceable"><code>zone_name</code></em> [<span class="optional"> policy <em class="replaceable"><code>given</code></em> | <em class="replaceable"><code>no-op</code></em> | <em class="replaceable"><code>nxdomain</code></em> | <em class="replaceable"><code>nodata</code></em> | <em class="replaceable"><code>cname domain</code></em> </span>] ; } ; </span>]
};
</pre>
</div>
@@ -2209,6 +2277,91 @@ category notify { null; };
be used.
</p>
<div class="variablelist"><dl>
+<dt><span class="term"><span><strong class="command">attach-cache</strong></span></span></dt>
+<dd>
+<p>
+ Allows multiple views to share a single cache
+ database.
+ Each view has its own cache database by default, but
+ if multiple views have the same operational policy
+ for name resolution and caching, those views can
+ share a single cache to save memory and possibly
+ improve resolution efficiency by using this option.
+ </p>
+<p>
+ The <span><strong class="command">attach-cache</strong></span> option
+ may also be specified in <span><strong class="command">view</strong></span>
+ statements, in which case it overrides the
+ global <span><strong class="command">attach-cache</strong></span> option.
+ </p>
+<p>
+ The <em class="replaceable"><code>cache_name</code></em> specifies
+ the cache to be shared.
+ When the <span><strong class="command">named</strong></span> server configures
+ views which are supposed to share a cache, it
+ creates a cache with the specified name for the
+ first view of these sharing views.
+ The rest of the views will simply refer to the
+ already created cache.
+ </p>
+<p>
+ One common configuration to share a cache would be to
+ allow all views to share a single cache.
+ This can be done by specifying
+ the <span><strong class="command">attach-cache</strong></span> as a global
+ option with an arbitrary name.
+ </p>
+<p>
+ Another possible operation is to allow a subset of
+ all views to share a cache while the others to
+ retain their own caches.
+ For example, if there are three views A, B, and C,
+ and only A and B should share a cache, specify the
+ <span><strong class="command">attach-cache</strong></span> option as a view A (or
+ B)'s option, referring to the other view name:
+ </p>
+<pre class="programlisting">
+ view "A" {
+ // this view has its own cache
+ ...
+ };
+ view "B" {
+ // this view refers to A's cache
+ attach-cache "A";
+ };
+ view "C" {
+ // this view has its own cache
+ ...
+ };
+</pre>
+<p>
+ Views that share a cache must have the same policy
+ on configurable parameters that may affect caching.
+ The current implementation requires the following
+ configurable options be consistent among these
+ views:
+ <span><strong class="command">check-names</strong></span>,
+ <span><strong class="command">cleaning-interval</strong></span>,
+ <span><strong class="command">dnssec-accept-expired</strong></span>,
+ <span><strong class="command">dnssec-validation</strong></span>,
+ <span><strong class="command">max-cache-ttl</strong></span>,
+ <span><strong class="command">max-ncache-ttl</strong></span>,
+ <span><strong class="command">max-cache-size</strong></span>, and
+ <span><strong class="command">zero-no-soa-ttl</strong></span>.
+ </p>
+<p>
+ Note that there may be other parameters that may
+ cause confusion if they are inconsistent for
+ different views that share a single cache.
+ For example, if these views define different sets of
+ forwarders that can return different answers for the
+ same question, sharing the answer does not make
+ sense or could even be harmful.
+ It is administrator's responsibility to ensure
+ configuration differences in different views do
+ not cause disruption with a shared cache.
+ </p>
+</dd>
<dt><span class="term"><span><strong class="command">directory</strong></span></span></dt>
<dd><p>
The working directory of the server.
@@ -2229,10 +2382,19 @@ category notify { null; };
When performing dynamic update of secure zones, the
directory where the public and private DNSSEC key files
should be found, if different than the current working
- directory. The directory specified must be an absolute
- path. (Note that this option has no effect on the paths
- for files containing non-DNSSEC keys such as the
- <code class="filename">rndc.key</code>.
+ directory. (Note that this option has no effect on the
+ paths for files containing non-DNSSEC keys such as
+ <code class="filename">bind.keys</code>,
+ <code class="filename">rndc.key</code> or
+ <code class="filename">session.key</code>.)
+ </p></dd>
+<dt><span class="term"><span><strong class="command">managed-keys-directory</strong></span></span></dt>
+<dd><p>
+ The directory used to hold the files used to track managed keys.
+ By default it is the working directory. It there are no
+ views then the file <code class="filename">managed-keys.bind</code>
+ otherwise a SHA256 hash of the view name is used with
+ <code class="filename">.mkeys</code> extension added.
</p></dd>
<dt><span class="term"><span><strong class="command">named-xfer</strong></span></span></dt>
<dd><p>
@@ -2243,18 +2405,27 @@ category notify { null; };
<span><strong class="command">named-xfer</strong></span> program is needed;
its functionality is built into the name server.
</p></dd>
+<dt><span class="term"><span><strong class="command">tkey-gssapi-keytab</strong></span></span></dt>
+<dd><p>
+ The KRB5 keytab file to use for GSS-TSIG updates. If
+ this option is set and tkey-gssapi-credential is not
+ set, then updates will be allowed with any key
+ matching a principal in the specified keytab.
+ </p></dd>
<dt><span class="term"><span><strong class="command">tkey-gssapi-credential</strong></span></span></dt>
<dd><p>
The security credential with which the server should
authenticate keys requested by the GSS-TSIG protocol.
Currently only Kerberos 5 authentication is available
- and the credential is a Kerberos principal which
- the server can acquire through the default system
- key file, normally <code class="filename">/etc/krb5.keytab</code>.
- Normally this principal is of the form
- "<strong class="userinput"><code>DNS/</code></strong><code class="varname">server.domain</code>".
- To use GSS-TSIG, <span><strong class="command">tkey-domain</strong></span>
- must also be set.
+ and the credential is a Kerberos principal which the
+ server can acquire through the default system key
+ file, normally <code class="filename">/etc/krb5.keytab</code>.
+ The location keytab file can be overridden using the
+ tkey-gssapi-keytab option. Normally this principal is
+ of the form "<strong class="userinput"><code>DNS/</code></strong><code class="varname">server.domain</code>".
+ To use GSS-TSIG, <span><strong class="command">tkey-domain</strong></span> must
+ also be set if a specific keytab is not set with
+ tkey-gssapi-keytab.
</p></dd>
<dt><span class="term"><span><strong class="command">tkey-domain</strong></span></span></dt>
<dd><p>
@@ -2271,7 +2442,8 @@ category notify { null; };
should be the server's domain name, or an otherwise
non-existent subdomain like
"_tkey.<code class="varname">domainname</code>". If you are
- using GSS-TSIG, this variable must be defined.
+ using GSS-TSIG, this variable must be defined, unless
+ you specify a specific keytab using tkey-gssapi-keytab.
</p></dd>
<dt><span class="term"><span><strong class="command">tkey-dhkey</strong></span></span></dt>
<dd><p>
@@ -2331,6 +2503,54 @@ category notify { null; };
described
in <a href="Bv9ARM.ch06.html#statsfile" title="The Statistics File">the section called &#8220;The Statistics File&#8221;</a>.
</p></dd>
+<dt><span class="term"><span><strong class="command">bindkeys-file</strong></span></span></dt>
+<dd><p>
+ The pathname of a file to override the built-in trusted
+ keys provided by <span><strong class="command">named</strong></span>.
+ See the discussion of <span><strong class="command">dnssec-lookaside</strong></span>
+ and <span><strong class="command">dnssec-validation</strong></span> for details.
+ If not specified, the default is
+ <code class="filename">/etc/bind.keys</code>.
+ </p></dd>
+<dt><span class="term"><span><strong class="command">secroots-file</strong></span></span></dt>
+<dd><p>
+ The pathname of the file the server dumps
+ security roots to when instructed to do so with
+ <span><strong class="command">rndc secroots</strong></span>.
+ If not specified, the default is <code class="filename">named.secroots</code>.
+ </p></dd>
+<dt><span class="term"><span><strong class="command">session-keyfile</strong></span></span></dt>
+<dd><p>
+ The pathname of the file into which to write a TSIG
+ session key generated by <span><strong class="command">named</strong></span> for use by
+ <span><strong class="command">nsupdate -l</strong></span>. If not specified, the
+ default is <code class="filename">/var/run/named/session.key</code>.
+ (See <a href="Bv9ARM.ch06.html#dynamic_update_policies" title="Dynamic Update Policies">the section called &#8220;Dynamic Update Policies&#8221;</a>, and in
+ particular the discussion of the
+ <span><strong class="command">update-policy</strong></span> statement's
+ <strong class="userinput"><code>local</code></strong> option for more
+ information about this feature.)
+ </p></dd>
+<dt><span class="term"><span><strong class="command">session-keyname</strong></span></span></dt>
+<dd><p>
+ The key name to use for the TSIG session key.
+ If not specified, the default is "local-ddns".
+ </p></dd>
+<dt><span class="term"><span><strong class="command">session-keyalg</strong></span></span></dt>
+<dd><p>
+ The algorithm to use for the TSIG session key.
+ Valid values are hmac-sha1, hmac-sha224, hmac-sha256,
+ hmac-sha384, hmac-sha512 and hmac-md5. If not
+ specified, the default is hmac-sha256.
+ </p></dd>
+<dt><span class="term"><span><strong class="command">session-keyfile</strong></span></span></dt>
+<dd><p>
+ The pathname of the file into which to write a session TSIG
+ key for use by <span><strong class="command">nsupdate -l</strong></span>. (See the
+ discussion of the <span><strong class="command">update-policy</strong></span>
+ statement's <strong class="userinput"><code>local</code></strong> option for more
+ details on this feature.)
+ </p></dd>
<dt><span class="term"><span><strong class="command">port</strong></span></span></dt>
<dd><p>
The UDP/TCP port number the server uses for
@@ -2379,14 +2599,14 @@ category notify { null; };
<p>
DS queries are expected to be made to and be answered by
delegation only zones. Such queries and responses are
- treated as a exception to delegation-only processing
+ treated as an exception to delegation-only processing
and are not converted to NXDOMAIN responses provided
a CNAME is not discovered at the query name.
</p>
<p>
If a delegation only zone server also serves a child
zone it is not always possible to determine whether
- a answer comes from the delegation only zone or the
+ an answer comes from the delegation only zone or the
child zone. SOA NS and DNSKEY records are apex
only records and a matching response that contains
these records or DS is treated as coming from a
@@ -2423,42 +2643,138 @@ options {
Only the most specific will be applied.
</p></dd>
<dt><span class="term"><span><strong class="command">dnssec-lookaside</strong></span></span></dt>
-<dd><p>
- When set, <span><strong class="command">dnssec-lookaside</strong></span>
- provides the
- validator with an alternate method to validate DNSKEY records
- at the
- top of a zone. When a DNSKEY is at or below a domain
- specified by the
- deepest <span><strong class="command">dnssec-lookaside</strong></span>, and
- the normal DNSSEC validation
- has left the key untrusted, the trust-anchor will be append to
- the key
- name and a DLV record will be looked up to see if it can
- validate the
- key. If the DLV record validates a DNSKEY (similarly to the
- way a DS
+<dd>
+<p>
+ When set, <span><strong class="command">dnssec-lookaside</strong></span> provides the
+ validator with an alternate method to validate DNSKEY
+ records at the top of a zone. When a DNSKEY is at or
+ below a domain specified by the deepest
+ <span><strong class="command">dnssec-lookaside</strong></span>, and the normal DNSSEC
+ validation has left the key untrusted, the trust-anchor
+ will be appended to the key name and a DLV record will be
+ looked up to see if it can validate the key. If the DLV
+ record validates a DNSKEY (similarly to the way a DS
record does) the DNSKEY RRset is deemed to be trusted.
- </p></dd>
+ </p>
+<p>
+ If <span><strong class="command">dnssec-lookaside</strong></span> is set to
+ <strong class="userinput"><code>auto</code></strong>, then built-in default
+ values for the DLV domain and trust anchor will be
+ used, along with a built-in key for validation.
+ </p>
+<p>
+ The default DLV key is stored in the file
+ <code class="filename">bind.keys</code>;
+ <span><strong class="command">named</strong></span> will load that key at
+ startup if <span><strong class="command">dnssec-lookaside</strong></span> is set to
+ <code class="constant">auto</code>. A copy of the file is
+ installed along with <acronym class="acronym">BIND</acronym> 9, and is
+ current as of the release date. If the DLV key expires, a
+ new copy of <code class="filename">bind.keys</code> can be downloaded
+ from <a href="" target="_top">https://www.isc.org/solutions/dlv</a>.
+ </p>
+<p>
+ (To prevent problems if <code class="filename">bind.keys</code> is
+ not found, the current key is also compiled in to
+ <span><strong class="command">named</strong></span>. Relying on this is not
+ recommended, however, as it requires <span><strong class="command">named</strong></span>
+ to be recompiled with a new key when the DLV key expires.)
+ </p>
+<p>
+ NOTE: <span><strong class="command">named</strong></span> only loads certain specific
+ keys from <code class="filename">bind.keys</code>: those for the
+ DLV zone and for the DNS root zone. The file cannot be
+ used to store keys for other zones.
+ </p>
+</dd>
<dt><span class="term"><span><strong class="command">dnssec-must-be-secure</strong></span></span></dt>
<dd><p>
- Specify hierarchies which must be or may not be secure (signed and
- validated).
- If <strong class="userinput"><code>yes</code></strong>, then <span><strong class="command">named</strong></span> will only accept
- answers if they
- are secure.
- If <strong class="userinput"><code>no</code></strong>, then normal DNSSEC validation
- applies
- allowing for insecure answers to be accepted.
- The specified domain must be under a <span><strong class="command">trusted-key</strong></span> or
- <span><strong class="command">dnssec-lookaside</strong></span> must be
- active.
+ Specify hierarchies which must be or may not be secure
+ (signed and validated). If <strong class="userinput"><code>yes</code></strong>,
+ then <span><strong class="command">named</strong></span> will only accept answers if
+ they are secure. If <strong class="userinput"><code>no</code></strong>, then normal
+ DNSSEC validation applies allowing for insecure answers to
+ be accepted. The specified domain must be under a
+ <span><strong class="command">trusted-keys</strong></span> or
+ <span><strong class="command">managed-keys</strong></span> statement, or
+ <span><strong class="command">dnssec-lookaside</strong></span> must be active.
</p></dd>
+<dt><span class="term"><span><strong class="command">dns64</strong></span></span></dt>
+<dd>
+<p>
+ This directive instructs <span><strong class="command">named</strong></span> to
+ return mapped IPv4 addresses to AAAA queries when
+ there are no AAAA records. It is intended to be
+ used in conjunction with a NAT64. Each
+ <span><strong class="command">dns64</strong></span> defines one DNS64 prefix.
+ Multiple DNS64 prefixes can be defined.
+ </p>
+<p>
+ Compatible IPv6 prefixes have lengths of 32, 40, 48, 56,
+ 64 and 96 as per RFC 6052.
+ </p>
+<p>
+ Additionally a reverse IP6.ARPA zone will be created for
+ the prefix to provide a mapping from the IP6.ARPA names
+ to the corresponding IN-ADDR.ARPA names using synthesized
+ CNAMEs. <span><strong class="command">dns64-server</strong></span> and
+ <span><strong class="command">dns64-contact</strong></span> can be used to specify
+ the name of the server and contact for the zones. These
+ are settable at the view / options level. These are
+ not settable on a per-prefix basis.
+ </p>
+<p>
+ Each <span><strong class="command">dns64</strong></span> supports an optional
+ <span><strong class="command">clients</strong></span> ACL that determines which
+ clients are affected by this directive. If not defined,
+ it defaults to <strong class="userinput"><code>any;</code></strong>.
+ </p>
+<p>
+ Each <span><strong class="command">dns64</strong></span> supports an optional
+ <span><strong class="command">mapped</strong></span> ACL that selects which
+ IPv4 addresses are to be mapped in the corresponding
+ A RRset. If not defined it defaults to
+ <strong class="userinput"><code>any;</code></strong>.
+ </p>
+<p>
+ Each <span><strong class="command">dns64</strong></span> supports an optional
+ <span><strong class="command">exclude</strong></span> ACL that selects which
+ IPv6 addresses will be ignored for the purposes
+ of determining whether dns64 is to be applied.
+ Any non-matching address will prevent further
+ DNS64 processing from occurring for this client.
+ </p>
+<p>
+ A optional <span><strong class="command">suffix</strong></span> can also
+ be defined to set the bits trailing the mapped
+ IPv4 address bits. By default these bits are
+ set to <strong class="userinput"><code>::</code></strong>. The bits
+ matching the prefix and mapped IPv4 address
+ must be zero.
+ </p>
+<pre class="programlisting">
+ acl rfc1918 { 10/8; 192.168/16; 172.16/12; };
+
+ dns64 64:FF9B::/96 {
+ clients { any; };
+ mapped { !rfc1918; any; };
+ exclude { 64:FF9B::/96; ::ffff:0000:0000/96; };
+ suffix ::;
+ };
+</pre>
+</dd>
</dl></div>
<div class="sect3" lang="en">
<div class="titlepage"><div><div><h4 class="title">
<a name="boolean_options"></a>Boolean Options</h4></div></div></div>
<div class="variablelist"><dl>
+<dt><span class="term"><span><strong class="command">allow-new-zones</strong></span></span></dt>
+<dd><p>
+ If <strong class="userinput"><code>yes</code></strong>, then zones can be
+ added at runtime via <span><strong class="command">rndc addzone</strong></span>
+ or deleted via <span><strong class="command">rndc delzone</strong></span>.
+ The default is <strong class="userinput"><code>no</code></strong>.
+ </p></dd>
<dt><span class="term"><span><strong class="command">auth-nxdomain</strong></span></span></dt>
<dd><p>
If <strong class="userinput"><code>yes</code></strong>, then the <span><strong class="command">AA</strong></span> bit
@@ -2863,6 +3179,7 @@ options {
off
on a per-zone basis by specifying <span><strong class="command">zone-statistics no</strong></span>
in the <span><strong class="command">zone</strong></span> statement).
+ The default is <strong class="userinput"><code>no</code></strong>.
These statistics may be accessed
using <span><strong class="command">rndc stats</strong></span>, which will
dump them to the file listed
@@ -3006,6 +3323,57 @@ options {
internally. The use of this option is discouraged.
</p>
</dd>
+<dt><span class="term"><span><strong class="command">filter-aaaa-on-v4</strong></span></span></dt>
+<dd>
+<p>
+ This option is only available when
+ <acronym class="acronym">BIND</acronym> 9 is compiled with the
+ <strong class="userinput"><code>--enable-filter-aaaa</code></strong> option on the
+ "configure" command line. It is intended to help the
+ transition from IPv4 to IPv6 by not giving IPv6 addresses
+ to DNS clients unless they have connections to the IPv6
+ Internet. This is not recommended unless absolutely
+ necessary. The default is <strong class="userinput"><code>no</code></strong>.
+ The <span><strong class="command">filter-aaaa-on-v4</strong></span> option
+ may also be specified in <span><strong class="command">view</strong></span> statements
+ to override the global <span><strong class="command">filter-aaaa-on-v4</strong></span>
+ option.
+ </p>
+<p>
+ If <strong class="userinput"><code>yes</code></strong>,
+ the DNS client is at an IPv4 address, in <span><strong class="command">filter-aaaa</strong></span>,
+ and if the response does not include DNSSEC signatures,
+ then all AAAA records are deleted from the response.
+ This filtering applies to all responses and not only
+ authoritative responses.
+ </p>
+<p>
+ If <strong class="userinput"><code>break-dnssec</code></strong>,
+ then AAAA records are deleted even when dnssec is enabled.
+ As suggested by the name, this makes the response not verify,
+ because the DNSSEC protocol is designed detect deletions.
+ </p>
+<p>
+ This mechanism can erroneously cause other servers to
+ not give AAAA records to their clients.
+ A recursing server with both IPv6 and IPv4 network connections
+ that queries an authoritative server using this mechanism
+ via IPv4 will be denied AAAA records even if its client is
+ using IPv6.
+ </p>
+<p>
+ This mechanism is applied to authoritative as well as
+ non-authoritative records.
+ A client using IPv4 that is not allowed recursion can
+ erroneously be given AAAA records because the server is not
+ allowed to check for A records.
+ </p>
+<p>
+ Some AAAA records are given to IPv4 clients in glue records.
+ IPv4 clients that are servers can then erroneously
+ answer requests for AAAA records received via IPv4.
+ </p>
+</dd>
<dt><span class="term"><span><strong class="command">ixfr-from-differences</strong></span></span></dt>
<dd>
<p>
@@ -3060,13 +3428,23 @@ options {
Enable DNSSEC validation in <span><strong class="command">named</strong></span>.
Note <span><strong class="command">dnssec-enable</strong></span> also needs to be
set to <strong class="userinput"><code>yes</code></strong> to be effective.
- The default is <strong class="userinput"><code>yes</code></strong>.
+ If set to <strong class="userinput"><code>no</code></strong>, DNSSEC validation
+ is disabled. If set to <strong class="userinput"><code>auto</code></strong>,
+ DNSSEC validation is enabled, and a default
+ trust-anchor for the DNS root zone is used. If set to
+ <strong class="userinput"><code>yes</code></strong>, DNSSEC validation is enabled,
+ but a trust anchor must be manually configured using
+ a <span><strong class="command">trusted-keys</strong></span> or
+ <span><strong class="command">managed-keys</strong></span> statement. The default
+ is <strong class="userinput"><code>yes</code></strong>.
</p></dd>
<dt><span class="term"><span><strong class="command">dnssec-accept-expired</strong></span></span></dt>
<dd><p>
Accept expired signatures when verifying DNSSEC signatures.
The default is <strong class="userinput"><code>no</code></strong>.
- Setting this option to "yes" leaves <span><strong class="command">named</strong></span> vulnerable to replay attacks.
+ Setting this option to <strong class="userinput"><code>yes</code></strong>
+ leaves <span><strong class="command">named</strong></span> vulnerable to
+ replay attacks.
</p></dd>
<dt><span class="term"><span><strong class="command">querylog</strong></span></span></dt>
<dd><p>
@@ -3104,6 +3482,14 @@ options {
(the owner name ends in IN-ADDR.ARPA, IP6.ARPA, or IP6.INT).
</p>
</dd>
+<dt><span class="term"><span><strong class="command">check-dup-records</strong></span></span></dt>
+<dd><p>
+ Check master zones for records that are treated as different
+ by DNSSEC but are semantically equal in plain DNS. The
+ default is to <span><strong class="command">warn</strong></span>. Other possible
+ values are <span><strong class="command">fail</strong></span> and
+ <span><strong class="command">ignore</strong></span>.
+ </p></dd>
<dt><span class="term"><span><strong class="command">check-mx</strong></span></span></dt>
<dd><p>
Check whether the MX record appears to refer to a IP address.
@@ -3166,26 +3552,86 @@ options {
The default is <span><strong class="command">no</strong></span>.
</p></dd>
<dt><span class="term"><span><strong class="command">update-check-ksk</strong></span></span></dt>
-<dd><p>
- When regenerating the RRSIGs following a UPDATE
- request to a secure zone, check the KSK flag on
- the DNSKEY RR to determine if this key should be
- used to generate the RRSIG. This flag is ignored
- if there are not DNSKEY RRs both with and without
- a KSK.
- The default is <span><strong class="command">yes</strong></span>.
- </p></dd>
+<dd>
+<p>
+ When set to the default value of <code class="literal">yes</code>,
+ check the KSK bit in each key to determine how the key
+ should be used when generating RRSIGs for a secure zone.
+ </p>
+<p>
+ Ordinarily, zone-signing keys (that is, keys without the
+ KSK bit set) are used to sign the entire zone, while
+ key-signing keys (keys with the KSK bit set) are only
+ used to sign the DNSKEY RRset at the zone apex.
+ However, if this option is set to <code class="literal">no</code>,
+ then the KSK bit is ignored; KSKs are treated as if they
+ were ZSKs and are used to sign the entire zone. This is
+ similar to the <span><strong class="command">dnssec-signzone -z</strong></span>
+ command line option.
+ </p>
+<p>
+ When this option is set to <code class="literal">yes</code>, there
+ must be at least two active keys for every algorithm
+ represented in the DNSKEY RRset: at least one KSK and one
+ ZSK per algorithm. If there is any algorithm for which
+ this requirement is not met, this option will be ignored
+ for that algorithm.
+ </p>
+</dd>
+<dt><span class="term"><span><strong class="command">dnssec-dnskey-kskonly</strong></span></span></dt>
+<dd>
+<p>
+ When this option and <span><strong class="command">update-check-ksk</strong></span>
+ are both set to <code class="literal">yes</code>, only key-signing
+ keys (that is, keys with the KSK bit set) will be used
+ to sign the DNSKEY RRset at the zone apex. Zone-signing
+ keys (keys without the KSK bit set) will be used to sign
+ the remainder of the zone, but not the DNSKEY RRset.
+ This is similar to the
+ <span><strong class="command">dnssec-signzone -x</strong></span> command line option.
+ </p>
+<p>
+ The default is <span><strong class="command">no</strong></span>. If
+ <span><strong class="command">update-check-ksk</strong></span> is set to
+ <code class="literal">no</code>, this option is ignored.
+ </p>
+</dd>
<dt><span class="term"><span><strong class="command">try-tcp-refresh</strong></span></span></dt>
<dd><p>
Try to refresh the zone using TCP if UDP queries fail.
For BIND 8 compatibility, the default is
<span><strong class="command">yes</strong></span>.
</p></dd>
+<dt><span class="term"><span><strong class="command">dnssec-secure-to-insecure</strong></span></span></dt>
+<dd>
+<p>
+ Allow a dynamic zone to transition from secure to
+ insecure (i.e., signed to unsigned) by deleting all
+ of the DNSKEY records. The default is <span><strong class="command">no</strong></span>.
+ If set to <span><strong class="command">yes</strong></span>, and if the DNSKEY RRset
+ at the zone apex is deleted, all RRSIG and NSEC records
+ will be removed from the zone as well.
+ </p>
+<p>
+ If the zone uses NSEC3, then it is also necessary to
+ delete the NSEC3PARAM RRset from the zone apex; this will
+ cause the removal of all corresponding NSEC3 records.
+ (It is expected that this requirement will be eliminated
+ in a future release.)
+ </p>
+<p>
+ Note that if a zone has been configured with
+ <span><strong class="command">auto-dnssec maintain</strong></span> and the
+ private keys remain accessible in the key repository,
+ then the zone will be automatically signed again the
+ next time <span><strong class="command">named</strong></span> is started.
+ </p>
+</dd>
</dl></div>
</div>
<div class="sect3" lang="en">
<div class="titlepage"><div><div><h4 class="title">
-<a name="id2581856"></a>Forwarding</h4></div></div></div>
+<a name="id2583480"></a>Forwarding</h4></div></div></div>
<p>
The forwarding facility can be used to create a large site-wide
cache on a few servers, reducing traffic over links to external
@@ -3229,7 +3675,7 @@ options {
</div>
<div class="sect3" lang="en">
<div class="titlepage"><div><div><h4 class="title">
-<a name="id2581914"></a>Dual-stack Servers</h4></div></div></div>
+<a name="id2583607"></a>Dual-stack Servers</h4></div></div></div>
<p>
Dual-stack servers are used as servers of last resort to work
around
@@ -3422,11 +3868,25 @@ options {
from these addresses will not be responded to. The default
is <strong class="userinput"><code>none</code></strong>.
</p></dd>
+<dt><span class="term"><span><strong class="command">filter-aaaa</strong></span></span></dt>
+<dd><p>
+ Specifies a list of addresses to which
+ <span><strong class="command">filter-aaaa-on-v4</strong></span>
+ is applies. The default is <strong class="userinput"><code>any</code></strong>.
+ </p></dd>
+<dt><span class="term"><span><strong class="command">resolver-query-timeout</strong></span></span></dt>
+<dd><p>
+ The amount of time the resolver will spend attempting
+ to resolve a recursive query before failing. The
+ default is <code class="literal">10</code> and the maximum is
+ <code class="literal">30</code>. Setting it to <code class="literal">0</code>
+ will result in the default being used.
+ </p></dd>
</dl></div>
</div>
<div class="sect3" lang="en">
<div class="titlepage"><div><div><h4 class="title">
-<a name="id2582420"></a>Interfaces</h4></div></div></div>
+<a name="id2584227"></a>Interfaces</h4></div></div></div>
<p>
The interfaces and ports that the server will answer queries
from may be specified using the <span><strong class="command">listen-on</strong></span> option. <span><strong class="command">listen-on</strong></span> takes
@@ -3878,7 +4338,7 @@ avoid-v6-udp-ports {};
</div>
<div class="sect3" lang="en">
<div class="titlepage"><div><div><h4 class="title">
-<a name="id2583691"></a>UDP Port Lists</h4></div></div></div>
+<a name="id2585362"></a>UDP Port Lists</h4></div></div></div>
<p>
<span><strong class="command">use-v4-udp-ports</strong></span>,
<span><strong class="command">avoid-v4-udp-ports</strong></span>,
@@ -3920,7 +4380,7 @@ avoid-v6-udp-ports { 40000; range 50000 60000; };
</div>
<div class="sect3" lang="en">
<div class="titlepage"><div><div><h4 class="title">
-<a name="id2583751"></a>Operating System Resource Limits</h4></div></div></div>
+<a name="id2585421"></a>Operating System Resource Limits</h4></div></div></div>
<p>
The server's usage of many system resources can be limited.
Scaled values are allowed when specifying resource limits. For
@@ -4082,7 +4542,7 @@ avoid-v6-udp-ports { 40000; range 50000 60000; };
</div>
<div class="sect3" lang="en">
<div class="titlepage"><div><div><h4 class="title">
-<a name="id2584173"></a>Periodic Task Intervals</h4></div></div></div>
+<a name="id2585912"></a>Periodic Task Intervals</h4></div></div></div>
<div class="variablelist"><dl>
<dt><span class="term"><span><strong class="command">cleaning-interval</strong></span></span></dt>
<dd><p>
@@ -4252,20 +4712,26 @@ avoid-v6-udp-ports { 40000; range 50000 60000; };
their directly connected networks.
</p>
<pre class="programlisting">sortlist {
- { localhost; // IF the local host
- { localnets; // THEN first fit on the
- 192.168.1/24; // following nets
+ // IF the local host
+ // THEN first fit on the following nets
+ { localhost;
+ { localnets;
+ 192.168.1/24;
{ 192.168.2/24; 192.168.3/24; }; }; };
- { 192.168.1/24; // IF on class C 192.168.1
- { 192.168.1/24; // THEN use .1, or .2 or .3
+ // IF on class C 192.168.1 THEN use .1, or .2 or .3
+ { 192.168.1/24;
+ { 192.168.1/24;
{ 192.168.2/24; 192.168.3/24; }; }; };
- { 192.168.2/24; // IF on class C 192.168.2
- { 192.168.2/24; // THEN use .2, or .1 or .3
+ // IF on class C 192.168.2 THEN use .2, or .1 or .3
+ { 192.168.2/24;
+ { 192.168.2/24;
{ 192.168.1/24; 192.168.3/24; }; }; };
- { 192.168.3/24; // IF on class C 192.168.3
- { 192.168.3/24; // THEN use .3, or .1 or .2
+ // IF on class C 192.168.3 THEN use .3, or .1 or .2
+ { 192.168.3/24;
+ { 192.168.3/24;
{ 192.168.1/24; 192.168.2/24; }; }; };
- { { 192.168.4/24; 192.168.5/24; }; // if .4 or .5, prefer that net
+ // IF .4 or .5 THEN prefer that net
+ { { 192.168.4/24; 192.168.5/24; };
};
};</pre>
<p>
@@ -4456,7 +4922,7 @@ avoid-v6-udp-ports { 40000; range 50000 60000; };
Specifies the number of days into the future when
DNSSEC signatures automatically generated as a
result of dynamic updates (<a href="Bv9ARM.ch04.html#dynamic_update" title="Dynamic Update">the section called &#8220;Dynamic Update&#8221;</a>) will expire. There
- is a optional second field which specifies how
+ is an optional second field which specifies how
long before expiry that the signatures will be
regenerated. If not specified, the signatures will
be regenerated at 1/4 of base interval. The second
@@ -4537,30 +5003,46 @@ avoid-v6-udp-ports { 40000; range 50000 60000; };
</p>
</dd>
<dt><span class="term"><span><strong class="command">edns-udp-size</strong></span></span></dt>
-<dd><p>
+<dd>
+<p>
Sets the advertised EDNS UDP buffer size in bytes
to control the size of packets received.
- Valid values are 512 to 4096 (values outside this range
+ Valid values are 1024 to 4096 (values outside this range
will be silently adjusted). The default value
is 4096. The usual reason for setting
<span><strong class="command">edns-udp-size</strong></span> to a non-default
value is to get UDP answers to pass through broken
firewalls that block fragmented packets and/or
block UDP packets that are greater than 512 bytes.
- </p></dd>
+ </p>
+<p>
+ <span><strong class="command">named</strong></span> will fallback to using 512 bytes
+ if it get a series of timeout at the initial value. 512
+ bytes is not being offered to encourage sites to fix their
+ firewalls. Small EDNS UDP sizes will result in the
+ excessive use of TCP.
+ </p>
+</dd>
<dt><span class="term"><span><strong class="command">max-udp-size</strong></span></span></dt>
-<dd><p>
- Sets the maximum EDNS UDP message size <span><strong class="command">named</strong></span> will
- send in bytes. Valid values are 512 to 4096 (values outside
- this range will be silently adjusted). The default
+<dd>
+<p>
+ Sets the maximum EDNS UDP message size
+ <span><strong class="command">named</strong></span> will send in bytes.
+ Valid values are 512 to 4096 (values outside this
+ range will be silently adjusted). The default
value is 4096. The usual reason for setting
- <span><strong class="command">max-udp-size</strong></span> to a non-default value is to get UDP
- answers to pass through broken firewalls that
- block fragmented packets and/or block UDP packets
- that are greater than 512 bytes.
+ <span><strong class="command">max-udp-size</strong></span> to a non-default
+ value is to get UDP answers to pass through broken
+ firewalls that block fragmented packets and/or
+ block UDP packets that are greater than 512 bytes.
This is independent of the advertised receive
buffer (<span><strong class="command">edns-udp-size</strong></span>).
- </p></dd>
+ </p>
+<p>
+ Setting this to a low value will encourage additional
+ TCP traffic to the nameserver.
+ </p>
+</dd>
<dt><span class="term"><span><strong class="command">masterfile-format</strong></span></span></dt>
<dd><p>Specifies
the file format of zone files (see
@@ -4705,7 +5187,7 @@ avoid-v6-udp-ports { 40000; range 50000 60000; };
<p>
Named will attempt to determine if a built-in zone already exists
or is active (covered by a forward-only forwarding declaration)
- and will not create a empty zone in that case.
+ and will not create an empty zone in that case.
</p>
<p>
The current list of empty zones is:
@@ -4873,6 +5355,260 @@ avoid-v6-udp-ports { 40000; range 50000 60000; };
</p></dd>
</dl></div>
</div>
+<div class="sect3" lang="en">
+<div class="titlepage"><div><div><h4 class="title">
+<a name="id2588025"></a>Content Filtering</h4></div></div></div>
+<p>
+ <acronym class="acronym">BIND</acronym> 9 provides the ability to filter
+ out DNS responses from external DNS servers containing
+ certain types of data in the answer section.
+ Specifically, it can reject address (A or AAAA) records if
+ the corresponding IPv4 or IPv6 addresses match the given
+ <code class="varname">address_match_list</code> of the
+ <span><strong class="command">deny-answer-addresses</strong></span> option.
+ It can also reject CNAME or DNAME records if the "alias"
+ name (i.e., the CNAME alias or the substituted query name
+ due to DNAME) matches the
+ given <code class="varname">namelist</code> of the
+ <span><strong class="command">deny-answer-aliases</strong></span> option, where
+ "match" means the alias name is a subdomain of one of
+ the <code class="varname">name_list</code> elements.
+ If the optional <code class="varname">namelist</code> is specified
+ with <span><strong class="command">except-from</strong></span>, records whose query name
+ matches the list will be accepted regardless of the filter
+ setting.
+ Likewise, if the alias name is a subdomain of the
+ corresponding zone, the <span><strong class="command">deny-answer-aliases</strong></span>
+ filter will not apply;
+ for example, even if "example.com" is specified for
+ <span><strong class="command">deny-answer-aliases</strong></span>,
+ </p>
+<pre class="programlisting">www.example.com. CNAME xxx.example.com.</pre>
+<p>
+ returned by an "example.com" server will be accepted.
+ </p>
+<p>
+ In the <code class="varname">address_match_list</code> of the
+ <span><strong class="command">deny-answer-addresses</strong></span> option, only
+ <code class="varname">ip_addr</code>
+ and <code class="varname">ip_prefix</code>
+ are meaningful;
+ any <code class="varname">key_id</code> will be silently ignored.
+ </p>
+<p>
+ If a response message is rejected due to the filtering,
+ the entire message is discarded without being cached, and
+ a SERVFAIL error will be returned to the client.
+ </p>
+<p>
+ This filtering is intended to prevent "DNS rebinding attacks," in
+ which an attacker, in response to a query for a domain name the
+ attacker controls, returns an IP address within your own network or
+ an alias name within your own domain.
+ A naive web browser or script could then serve as an
+ unintended proxy, allowing the attacker
+ to get access to an internal node of your local network
+ that couldn't be externally accessed otherwise.
+ See the paper available at
+ <a href="" target="_top">
+ http://portal.acm.org/citation.cfm?id=1315245.1315298
+ </a>
+ for more details about the attacks.
+ </p>
+<p>
+ For example, if you own a domain named "example.net" and
+ your internal network uses an IPv4 prefix 192.0.2.0/24,
+ you might specify the following rules:
+ </p>
+<pre class="programlisting">deny-answer-addresses { 192.0.2.0/24; } except-from { "example.net"; };
+deny-answer-aliases { "example.net"; };
+</pre>
+<p>
+ If an external attacker lets a web browser in your local
+ network look up an IPv4 address of "attacker.example.com",
+ the attacker's DNS server would return a response like this:
+ </p>
+<pre class="programlisting">attacker.example.com. A 192.0.2.1</pre>
+<p>
+ in the answer section.
+ Since the rdata of this record (the IPv4 address) matches
+ the specified prefix 192.0.2.0/24, this response will be
+ ignored.
+ </p>
+<p>
+ On the other hand, if the browser looks up a legitimate
+ internal web server "www.example.net" and the
+ following response is returned to
+ the <acronym class="acronym">BIND</acronym> 9 server
+ </p>
+<pre class="programlisting">www.example.net. A 192.0.2.2</pre>
+<p>
+ it will be accepted since the owner name "www.example.net"
+ matches the <span><strong class="command">except-from</strong></span> element,
+ "example.net".
+ </p>
+<p>
+ Note that this is not really an attack on the DNS per se.
+ In fact, there is nothing wrong for an "external" name to
+ be mapped to your "internal" IP address or domain name
+ from the DNS point of view.
+ It might actually be provided for a legitimate purpose,
+ such as for debugging.
+ As long as the mapping is provided by the correct owner,
+ it is not possible or does not make sense to detect
+ whether the intent of the mapping is legitimate or not
+ within the DNS.
+ The "rebinding" attack must primarily be protected at the
+ application that uses the DNS.
+ For a large site, however, it may be difficult to protect
+ all possible applications at once.
+ This filtering feature is provided only to help such an
+ operational environment;
+ it is generally discouraged to turn it on unless you are
+ very sure you have no other choice and the attack is a
+ real threat for your applications.
+ </p>
+<p>
+ Care should be particularly taken if you want to use this
+ option for addresses within 127.0.0.0/8.
+ These addresses are obviously "internal", but many
+ applications conventionally rely on a DNS mapping from
+ some name to such an address.
+ Filtering out DNS records containing this address
+ spuriously can break such applications.
+ </p>
+</div>
+<div class="sect3" lang="en">
+<div class="titlepage"><div><div><h4 class="title">
+<a name="id2588148"></a>Response Policy Zone (RPZ) Rewriting</h4></div></div></div>
+<p>
+ <acronym class="acronym">BIND</acronym> 9 includes an intentionally limited
+ mechanism to modify DNS responses for recursive requests
+ similar to email anti-spam DNS blacklists.
+ All response policy zones are named in the
+ <span><strong class="command">response-policy</strong></span> option for the view or among the
+ global options if there is no response-policy option for the view.
+ </p>
+<p>
+ The rules encoded in a response policy zone (RPZ) are applied
+ only to responses to queries that ask for recursion (RD=1).
+ RPZs are normal DNS zones containing RRsets
+ that can be queried normally if allowed.
+ It is usually best to restrict those queries with something like
+ <span><strong class="command">allow-query {none; };</strong></span> or
+ <span><strong class="command">allow-query { 127.0.0.1; };</strong></span>.
+ </p>
+<p>
+ There are four kinds of RPZ rewrite rules. QNAME rules are
+ applied to query names in requests and to targets of CNAME
+ records resolved in the process of generating the response.
+ The owner name of a QNAME rule is the query name relativized
+ to the RPZ.
+ The records in a rewrite rule are usually A, AAAA, or special
+ CNAMEs, but can be any type except DNAME.
+ </p>
+<p>
+ IP rules are triggered by addresses in A and AAAA records.
+ All IP addresses in A or AAAA RRsets are tested and the rule
+ longest prefix is applied. Ties between rules with equal prefixes
+ are broken in favor of the first RPZ mentioned in the
+ response-policy option.
+ The rule matching the smallest IP address is chosen among equal
+ prefix rules from a single RPZ.
+ IP rules are expressed in RRsets with owner names that are
+ subdomains of rpz-ip and encoding an IP address block, reversed
+ as in IN-ARPA.
+ prefix.B.B.B.B with prefix between 1 and 32 and B between 1 and 255
+ encodes an IPv4 address.
+ IPv6 addresses are encoded by with prefix.W.W.W.W.W.W.W.W or
+ prefix.WORDS.zz.WORDS. The words in the standard IPv6 text
+ representation are reversed, "::" is replaced with ".zz.",
+ and ":" becomes ".".
+ </p>
+<p>
+ NSDNAME rules match names in NS RRsets for the response or a
+ parent. They are encoded as subdomains of rpz-nsdomain relativized
+ to the RPZ origin name.
+ </p>
+<p>
+ NSIP rules match IP addresses in A and AAAA RRsets for names of
+ responsible servers or the names that can be matched by NSDNAME
+ rules. The are encoded like IP rules except as subdomains of
+ rpz-nsip.
+ </p>
+<p>
+ Authority verification issues and variations in authority data in
+ the current version of <acronym class="acronym">BIND</acronym> 9 can cause
+ inconsistent results from NSIP and NSDNAME. So they are available
+ only when <acronym class="acronym">BIND</acronym> is built with the
+ <strong class="userinput"><code>--enable-rpz-nsip</code></strong> or
+ <strong class="userinput"><code>--enable-rpz-nsdname</code></strong> options
+ on the "configure" command line.
+ </p>
+<p>
+ Four policies can be expressed.
+ The <span><strong class="command">NXDOMAIN</strong></span> policy causes a NXDOMAIN response
+ and is expressed with an RRset consisting of a single CNAME
+ whose target is the root domain (.).
+ <span><strong class="command">NODATA</strong></span> generates NODATA or ANCOUNT=1 regardless
+ of query type.
+ It is expressed with a CNAME whose target is the wildcard
+ top-level domain (*.).
+ The <span><strong class="command">NO-OP</strong></span> policy does not change the response
+ and is used to "poke holes" in policies for larger CIDR blocks or in
+ zones named later in the <span><strong class="command">response-policy</strong></span> option.
+ The NO-OP policy is expressed by a CNAME with a target consisting
+ of the variable part of the owner name, such as "example.com." for
+ a QNAME rule or "128.1.0.0.127." for an IP rule.
+ The <span><strong class="command">CNAME</strong></span> policy is used to replace the RRsets
+ of response.
+ A and AAAA RRsets are most common and useful to capture
+ an evil domain in a walled garden, but any valid set of RRsets
+ is possible.
+ </p>
+<p>
+ All of the policies in an RPZ can be overridden with a
+ <span><strong class="command">policy</strong></span> clause.
+ <span><strong class="command">given</strong></span> says "do not override."
+ <span><strong class="command">no-op</strong></span> says "do nothing" regardless of the policy
+ in RPZ records.
+ <span><strong class="command">nxdomain</strong></span> causes all RPZ rules to generate
+ NXDOMAIN results.
+ <span><strong class="command">nodata</strong></span> gives nodata.
+ <span><strong class="command">cname domain</strong></span> causes all RPZ rules to act as if
+ the consisted of a "cname domain" record.
+ </p>
+<p>
+ For example, you might use this option statement
+ </p>
+<pre class="programlisting">response-policy { zone "bl"; };</pre>
+<p>
+ and this zone statement
+ </p>
+<pre class="programlisting">zone "bl" {type master; file "example/bl"; allow-query {none;}; };</pre>
+<p>
+ with this zone file
+ </p>
+<pre class="programlisting">$TTL 1H
+@ SOA LOCALHOST. named-mgr.example.com (1 1h 15m 30d 2h)
+
+; QNAME rules
+nxdomain.domain.com CNAME .
+nodata.domain.com CNAME *.
+bad.domain.com A 10.0.0.1
+ AAAA 2001:2::1
+ok.domain.com CNAME ok.domain.com.
+*.badzone.domain.com CNAME garden.example.com.
+
+; IP rules rewriting all answers for 127/8 except 127.0.0.1
+8.0.0.0.127.ip CNAME .
+32.1.0.0.127.ip CNAME 32.1.0.0.127.
+
+; NSDNAME and NSIP rules
+ns.domain.com.rpz-nsdname CNAME .
+48.zz.2.2001.rpz-nsip CNAME .
+</pre>
+</div>
</div>
<div class="sect2" lang="en">
<div class="titlepage"><div><div><h3 class="title">
@@ -4891,8 +5627,10 @@ avoid-v6-udp-ports { 40000; range 50000 60000; };
[<span class="optional"> transfer-source-v6 (<em class="replaceable"><code>ip6_addr</code></em> | <code class="constant">*</code>) [<span class="optional">port <em class="replaceable"><code>ip_port</code></em></span>] ; </span>]
[<span class="optional"> notify-source (<em class="replaceable"><code>ip4_addr</code></em> | <code class="constant">*</code>) [<span class="optional">port <em class="replaceable"><code>ip_port</code></em></span>] ; </span>]
[<span class="optional"> notify-source-v6 (<em class="replaceable"><code>ip6_addr</code></em> | <code class="constant">*</code>) [<span class="optional">port <em class="replaceable"><code>ip_port</code></em></span>] ; </span>]
- [<span class="optional"> query-source [<span class="optional"> address ( <em class="replaceable"><code>ip_addr</code></em> | <em class="replaceable"><code>*</code></em> ) </span>] [<span class="optional"> port ( <em class="replaceable"><code>ip_port</code></em> | <em class="replaceable"><code>*</code></em> ) </span>]; </span>]
- [<span class="optional"> query-source-v6 [<span class="optional"> address ( <em class="replaceable"><code>ip_addr</code></em> | <em class="replaceable"><code>*</code></em> ) </span>] [<span class="optional"> port ( <em class="replaceable"><code>ip_port</code></em> | <em class="replaceable"><code>*</code></em> ) </span>]; </span>]
+ [<span class="optional"> query-source [<span class="optional"> address ( <em class="replaceable"><code>ip_addr</code></em> | <em class="replaceable"><code>*</code></em> ) </span>]
+ [<span class="optional"> port ( <em class="replaceable"><code>ip_port</code></em> | <em class="replaceable"><code>*</code></em> ) </span>]; </span>]
+ [<span class="optional"> query-source-v6 [<span class="optional"> address ( <em class="replaceable"><code>ip_addr</code></em> | <em class="replaceable"><code>*</code></em> ) </span>]
+ [<span class="optional"> port ( <em class="replaceable"><code>ip_port</code></em> | <em class="replaceable"><code>*</code></em> ) </span>]; </span>]
[<span class="optional"> use-queryport-pool <em class="replaceable"><code>yes_or_no</code></em>; </span>]
[<span class="optional"> queryport-pool-ports <em class="replaceable"><code>number</code></em>; </span>]
[<span class="optional"> queryport-pool-updateinterval <em class="replaceable"><code>number</code></em>; </span>]
@@ -5072,14 +5810,15 @@ avoid-v6-udp-ports { 40000; range 50000 60000; };
<div class="titlepage"><div><div><h3 class="title">
<a name="statschannels"></a><span><strong class="command">statistics-channels</strong></span> Statement Grammar</h3></div></div></div>
<pre class="programlisting"><span><strong class="command">statistics-channels</strong></span> {
- [ inet ( ip_addr | * ) [ port ip_port ] [allow { <em class="replaceable"><code> address_match_list </code></em> } ]; ]
+ [ inet ( ip_addr | * ) [ port ip_port ]
+ [ allow { <em class="replaceable"><code> address_match_list </code></em> } ]; ]
[ inet ...; ]
};
</pre>
</div>
<div class="sect2" lang="en">
<div class="titlepage"><div><div><h3 class="title">
-<a name="id2586907"></a><span><strong class="command">statistics-channels</strong></span> Statement Definition and
+<a name="id2589239"></a><span><strong class="command">statistics-channels</strong></span> Statement Definition and
Usage</h3></div></div></div>
<p>
The <span><strong class="command">statistics-channels</strong></span> statement
@@ -5130,7 +5869,7 @@ avoid-v6-udp-ports { 40000; range 50000 60000; };
</div>
<div class="sect2" lang="en">
<div class="titlepage"><div><div><h3 class="title">
-<a name="id2587062"></a><span><strong class="command">trusted-keys</strong></span> Statement Grammar</h3></div></div></div>
+<a name="trusted-keys"></a><span><strong class="command">trusted-keys</strong></span> Statement Grammar</h3></div></div></div>
<pre class="programlisting"><span><strong class="command">trusted-keys</strong></span> {
<em class="replaceable"><code>string</code></em> <em class="replaceable"><code>number</code></em> <em class="replaceable"><code>number</code></em> <em class="replaceable"><code>number</code></em> <em class="replaceable"><code>string</code></em> ;
[<span class="optional"> <em class="replaceable"><code>string</code></em> <em class="replaceable"><code>number</code></em> <em class="replaceable"><code>number</code></em> <em class="replaceable"><code>number</code></em> <em class="replaceable"><code>string</code></em> ; [<span class="optional">...</span>]</span>]
@@ -5139,7 +5878,7 @@ avoid-v6-udp-ports { 40000; range 50000 60000; };
</div>
<div class="sect2" lang="en">
<div class="titlepage"><div><div><h3 class="title">
-<a name="id2587113"></a><span><strong class="command">trusted-keys</strong></span> Statement Definition
+<a name="id2589379"></a><span><strong class="command">trusted-keys</strong></span> Statement Definition
and Usage</h3></div></div></div>
<p>
The <span><strong class="command">trusted-keys</strong></span> statement defines
@@ -5169,6 +5908,135 @@ avoid-v6-udp-ports { 40000; range 50000 60000; };
in the key data, so the configuration may be split up into
multiple lines.
</p>
+<p>
+ <span><strong class="command">trusted-keys</strong></span> may be set at the top level
+ of <code class="filename">named.conf</code> or within a view. If it is
+ set in both places, they are additive: keys defined at the top
+ level are inherited by all views, but keys defined in a view
+ are only used within that view.
+ </p>
+</div>
+<div class="sect2" lang="en">
+<div class="titlepage"><div><div><h3 class="title">
+<a name="id2589494"></a><span><strong class="command">managed-keys</strong></span> Statement Grammar</h3></div></div></div>
+<pre class="programlisting"><span><strong class="command">managed-keys</strong></span> {
+ <em class="replaceable"><code>string</code></em> initial-key <em class="replaceable"><code>number</code></em> <em class="replaceable"><code>number</code></em> <em class="replaceable"><code>number</code></em> <em class="replaceable"><code>string</code></em> ;
+ [<span class="optional"> <em class="replaceable"><code>string</code></em> initial-key <em class="replaceable"><code>number</code></em> <em class="replaceable"><code>number</code></em> <em class="replaceable"><code>number</code></em> <em class="replaceable"><code>string</code></em> ; [<span class="optional">...</span>]</span>]
+};
+</pre>
+</div>
+<div class="sect2" lang="en">
+<div class="titlepage"><div><div><h3 class="title">
+<a name="managed-keys"></a><span><strong class="command">managed-keys</strong></span> Statement Definition
+ and Usage</h3></div></div></div>
+<p>
+ The <span><strong class="command">managed-keys</strong></span> statement, like
+ <span><strong class="command">trusted-keys</strong></span>, defines DNSSEC
+ security roots. The difference is that
+ <span><strong class="command">managed-keys</strong></span> can be kept up to date
+ automatically, without intervention from the resolver
+ operator.
+ </p>
+<p>
+ Suppose, for example, that a zone's key-signing
+ key was compromised, and the zone owner had to revoke and
+ replace the key. A resolver which had the old key in a
+ <span><strong class="command">trusted-keys</strong></span> statement would be
+ unable to validate this zone any longer; it would
+ reply with a SERVFAIL response code. This would
+ continue until the resolver operator had updated the
+ <span><strong class="command">trusted-keys</strong></span> statement with the new key.
+ </p>
+<p>
+ If, however, the zone were listed in a
+ <span><strong class="command">managed-keys</strong></span> statement instead, then the
+ zone owner could add a "stand-by" key to the zone in advance.
+ <span><strong class="command">named</strong></span> would store the stand-by key, and
+ when the original key was revoked, <span><strong class="command">named</strong></span>
+ would be able to transition smoothly to the new key. It would
+ also recognize that the old key had been revoked, and cease
+ using that key to validate answers, minimizing the damage that
+ the compromised key could do.
+ </p>
+<p>
+ A <span><strong class="command">managed-keys</strong></span> statement contains a list of
+ the keys to be managed, along with information about how the
+ keys are to be initialized for the first time. The only
+ initialization method currently supported (as of
+ <acronym class="acronym">BIND</acronym> 9.7.0) is <code class="literal">initial-key</code>.
+ This means the <span><strong class="command">managed-keys</strong></span> statement must
+ contain a copy of the initializing key. (Future releases may
+ allow keys to be initialized by other methods, eliminating this
+ requirement.)
+ </p>
+<p>
+ Consequently, a <span><strong class="command">managed-keys</strong></span> statement
+ appears similar to a <span><strong class="command">trusted-keys</strong></span>, differing
+ in the presence of the second field, containing the keyword
+ <code class="literal">initial-key</code>. The difference is, whereas the
+ keys listed in a <span><strong class="command">trusted-keys</strong></span> continue to be
+ trusted until they are removed from
+ <code class="filename">named.conf</code>, an initializing key listed
+ in a <span><strong class="command">managed-keys</strong></span> statement is only trusted
+ <span class="emphasis"><em>once</em></span>: for as long as it takes to load the
+ managed key database and start the RFC 5011 key maintenance
+ process.
+ </p>
+<p>
+ The first time <span><strong class="command">named</strong></span> runs with a managed key
+ configured in <code class="filename">named.conf</code>, it fetches the
+ DNSKEY RRset directly from the zone apex, and validates it
+ using the key specified in the <span><strong class="command">managed-keys</strong></span>
+ statement. If the DNSKEY RRset is validly signed, then it is
+ used as the basis for a new managed keys database.
+ </p>
+<p>
+ From that point on, whenever <span><strong class="command">named</strong></span> runs, it
+ sees the <span><strong class="command">managed-keys</strong></span> statement, checks to
+ make sure RFC 5011 key maintenance has already been initialized
+ for the specified domain, and if so, it simply moves on. The
+ key specified in the <span><strong class="command">managed-keys</strong></span> is not
+ used to validate answers; it has been superseded by the key or
+ keys stored in the managed keys database.
+ </p>
+<p>
+ The next time <span><strong class="command">named</strong></span> runs after a name
+ has been <span class="emphasis"><em>removed</em></span> from the
+ <span><strong class="command">managed-keys</strong></span> statement, the corresponding
+ zone will be removed from the managed keys database,
+ and RFC 5011 key maintenance will no longer be used for that
+ domain.
+ </p>
+<p>
+ <span><strong class="command">named</strong></span> only maintains a single managed keys
+ database; consequently, unlike <span><strong class="command">trusted-keys</strong></span>,
+ <span><strong class="command">managed-keys</strong></span> may only be set at the top
+ level of <code class="filename">named.conf</code>, not within a view.
+ </p>
+<p>
+ In the current implementation, the managed keys database is
+ stored as a master-format zone file called
+ <code class="filename">managed-keys.bind</code>. When the key database
+ is changed, the zone is updated. As with any other dynamic
+ zone, changes will be written into a journal file,
+ <code class="filename">managed-keys.bind.jnl</code>. They are committed
+ to the master file as soon as possible afterward; in the case
+ of the managed key database, this will usually occur within 30
+ seconds. So, whenever <span><strong class="command">named</strong></span> is using
+ automatic key maintenance, those two files can be expected to
+ exist in the working directory. (For this reason among others,
+ the working directory should be always be writable by
+ <span><strong class="command">named</strong></span>.)
+ </p>
+<p>
+ If the <span><strong class="command">dnssec-lookaside</strong></span> option is
+ set to <strong class="userinput"><code>auto</code></strong>, <span><strong class="command">named</strong></span>
+ will automatically initialize a managed key for the
+ zone <code class="literal">dlv.isc.org</code>. The key that is
+ used to initialize the key maintenance process is built
+ into <span><strong class="command">named</strong></span>, and can be overridden
+ from <span><strong class="command">bindkeys-file</strong></span>.
+ </p>
</div>
<div class="sect2" lang="en">
<div class="titlepage"><div><div><h3 class="title">
@@ -5185,7 +6053,7 @@ avoid-v6-udp-ports { 40000; range 50000 60000; };
</div>
<div class="sect2" lang="en">
<div class="titlepage"><div><div><h3 class="title">
-<a name="id2587195"></a><span><strong class="command">view</strong></span> Statement Definition and Usage</h3></div></div></div>
+<a name="id2589851"></a><span><strong class="command">view</strong></span> Statement Definition and Usage</h3></div></div></div>
<p>
The <span><strong class="command">view</strong></span> statement is a powerful
feature
@@ -5274,11 +6142,12 @@ avoid-v6-udp-ports { 40000; range 50000 60000; };
// This should match our internal networks.
match-clients { 10.0.0.0/8; };
- // Provide recursive service to internal clients only.
+ // Provide recursive service to internal
+ // clients only.
recursion yes;
- // Provide a complete view of the example.com zone
- // including addresses of internal hosts.
+ // Provide a complete view of the example.com
+ // zone including addresses of internal hosts.
zone "example.com" {
type master;
file "example-internal.db";
@@ -5286,14 +6155,15 @@ avoid-v6-udp-ports { 40000; range 50000 60000; };
};
view "external" {
- // Match all clients not matched by the previous view.
+ // Match all clients not matched by the
+ // previous view.
match-clients { any; };
// Refuse recursive service to external clients.
recursion no;
- // Provide a restricted view of the example.com zone
- // containing only publicly accessible hosts.
+ // Provide a restricted view of the example.com
+ // zone containing only publicly accessible hosts.
zone "example.com" {
type master;
file "example-external.db";
@@ -5311,8 +6181,9 @@ view "external" {
[<span class="optional"> allow-query-on { <em class="replaceable"><code>address_match_list</code></em> }; </span>]
[<span class="optional"> allow-transfer { <em class="replaceable"><code>address_match_list</code></em> }; </span>]
[<span class="optional"> allow-update { <em class="replaceable"><code>address_match_list</code></em> }; </span>]
- [<span class="optional"> update-policy { <em class="replaceable"><code>update_policy_rule</code></em> [<span class="optional">...</span>] }; </span>]
- [<span class="optional"> also-notify { <em class="replaceable"><code>ip_addr</code></em> [<span class="optional">port <em class="replaceable"><code>ip_port</code></em></span>] ; [<span class="optional"> <em class="replaceable"><code>ip_addr</code></em> [<span class="optional">port <em class="replaceable"><code>ip_port</code></em></span>] ; ... </span>] }; </span>]
+ [<span class="optional"> update-policy <em class="replaceable"><code>local</code></em> | { <em class="replaceable"><code>update_policy_rule</code></em> [<span class="optional">...</span>] }; </span>]
+ [<span class="optional"> also-notify { <em class="replaceable"><code>ip_addr</code></em> [<span class="optional">port <em class="replaceable"><code>ip_port</code></em></span>] ;
+ [<span class="optional"> <em class="replaceable"><code>ip_addr</code></em> [<span class="optional">port <em class="replaceable"><code>ip_port</code></em></span>] ; ... </span>] }; </span>]
[<span class="optional"> check-names (<code class="constant">warn</code>|<code class="constant">fail</code>|<code class="constant">ignore</code>) ; </span>]
[<span class="optional"> check-mx (<code class="constant">warn</code>|<code class="constant">fail</code>|<code class="constant">ignore</code>) ; </span>]
[<span class="optional"> check-wildcard <em class="replaceable"><code>yes_or_no</code></em>; </span>]
@@ -5348,6 +6219,7 @@ view "external" {
[<span class="optional"> min-retry-time <em class="replaceable"><code>number</code></em> ; </span>]
[<span class="optional"> max-retry-time <em class="replaceable"><code>number</code></em> ; </span>]
[<span class="optional"> key-directory <em class="replaceable"><code>path_name</code></em>; </span>]
+ [<span class="optional"> auto-dnssec <code class="constant">allow</code>|<code class="constant">maintain</code>|<code class="constant">create</code>|<code class="constant">off</code>; </span>]
[<span class="optional"> zero-no-soa-ttl <em class="replaceable"><code>yes_or_no</code></em> ; </span>]
};
@@ -5359,8 +6231,11 @@ zone <em class="replaceable"><code>zone_name</code></em> [<span class="optional"
[<span class="optional"> allow-transfer { <em class="replaceable"><code>address_match_list</code></em> }; </span>]
[<span class="optional"> allow-update-forwarding { <em class="replaceable"><code>address_match_list</code></em> }; </span>]
[<span class="optional"> update-check-ksk <em class="replaceable"><code>yes_or_no</code></em>; </span>]
+ [<span class="optional"> dnssec-dnskey-kskonly <em class="replaceable"><code>yes_or_no</code></em>; </span>]
+ [<span class="optional"> dnssec-secure-to-insecure <em class="replaceable"><code>yes_or_no</code></em> ; </span>]
[<span class="optional"> try-tcp-refresh <em class="replaceable"><code>yes_or_no</code></em>; </span>]
- [<span class="optional"> also-notify { <em class="replaceable"><code>ip_addr</code></em> [<span class="optional">port <em class="replaceable"><code>ip_port</code></em></span>] ; [<span class="optional"> <em class="replaceable"><code>ip_addr</code></em> [<span class="optional">port <em class="replaceable"><code>ip_port</code></em></span>] ; ... </span>] }; </span>]
+ [<span class="optional"> also-notify { <em class="replaceable"><code>ip_addr</code></em> [<span class="optional">port <em class="replaceable"><code>ip_port</code></em></span>] ;
+ [<span class="optional"> <em class="replaceable"><code>ip_addr</code></em> [<span class="optional">port <em class="replaceable"><code>ip_port</code></em></span>] ; ... </span>] }; </span>]
[<span class="optional"> check-names (<code class="constant">warn</code>|<code class="constant">fail</code>|<code class="constant">ignore</code>) ; </span>]
[<span class="optional"> dialup <em class="replaceable"><code>dialup_option</code></em> ; </span>]
[<span class="optional"> file <em class="replaceable"><code>string</code></em> ; </span>]
@@ -5373,7 +6248,9 @@ zone <em class="replaceable"><code>zone_name</code></em> [<span class="optional"
[<span class="optional"> ixfr-from-differences <em class="replaceable"><code>yes_or_no</code></em>; </span>]
[<span class="optional"> ixfr-tmp-file <em class="replaceable"><code>string</code></em> ; </span>]
[<span class="optional"> maintain-ixfr-base <em class="replaceable"><code>yes_or_no</code></em> ; </span>]
- [<span class="optional"> masters [<span class="optional">port <em class="replaceable"><code>ip_port</code></em></span>] { ( <em class="replaceable"><code>masters_list</code></em> | <em class="replaceable"><code>ip_addr</code></em> [<span class="optional">port <em class="replaceable"><code>ip_port</code></em></span>] [<span class="optional">key <em class="replaceable"><code>key</code></em></span>] ) ; [<span class="optional">...</span>] }; </span>]
+ [<span class="optional"> masters [<span class="optional">port <em class="replaceable"><code>ip_port</code></em></span>] { ( <em class="replaceable"><code>masters_list</code></em> | <em class="replaceable"><code>ip_addr</code></em>
+ [<span class="optional">port <em class="replaceable"><code>ip_port</code></em></span>]
+ [<span class="optional">key <em class="replaceable"><code>key</code></em></span>] ) ; [<span class="optional">...</span>] }; </span>]
[<span class="optional"> max-ixfr-log-size <em class="replaceable"><code>number</code></em> ; </span>]
[<span class="optional"> max-transfer-idle-in <em class="replaceable"><code>number</code></em> ; </span>]
[<span class="optional"> max-transfer-idle-out <em class="replaceable"><code>number</code></em> ; </span>]
@@ -5386,7 +6263,8 @@ zone <em class="replaceable"><code>zone_name</code></em> [<span class="optional"
[<span class="optional"> transfer-source (<em class="replaceable"><code>ip4_addr</code></em> | <code class="constant">*</code>) [<span class="optional">port <em class="replaceable"><code>ip_port</code></em></span>] ; </span>]
[<span class="optional"> transfer-source-v6 (<em class="replaceable"><code>ip6_addr</code></em> | <code class="constant">*</code>) [<span class="optional">port <em class="replaceable"><code>ip_port</code></em></span>] ; </span>]
[<span class="optional"> alt-transfer-source (<em class="replaceable"><code>ip4_addr</code></em> | <code class="constant">*</code>) [<span class="optional">port <em class="replaceable"><code>ip_port</code></em></span>] ; </span>]
- [<span class="optional"> alt-transfer-source-v6 (<em class="replaceable"><code>ip6_addr</code></em> | <code class="constant">*</code>) [<span class="optional">port <em class="replaceable"><code>ip_port</code></em></span>] ; </span>]
+ [<span class="optional"> alt-transfer-source-v6 (<em class="replaceable"><code>ip6_addr</code></em> | <code class="constant">*</code>)
+ [<span class="optional">port <em class="replaceable"><code>ip_port</code></em></span>] ; </span>]
[<span class="optional"> use-alt-transfer-source <em class="replaceable"><code>yes_or_no</code></em>; </span>]
[<span class="optional"> notify-source (<em class="replaceable"><code>ip4_addr</code></em> | <code class="constant">*</code>) [<span class="optional">port <em class="replaceable"><code>ip_port</code></em></span>] ; </span>]
[<span class="optional"> notify-source-v6 (<em class="replaceable"><code>ip6_addr</code></em> | <code class="constant">*</code>) [<span class="optional">port <em class="replaceable"><code>ip_port</code></em></span>] ; </span>]
@@ -5404,7 +6282,7 @@ zone <em class="replaceable"><code>zone_name</code></em> [<span class="optional"
type hint;
file <em class="replaceable"><code>string</code></em> ;
[<span class="optional"> delegation-only <em class="replaceable"><code>yes_or_no</code></em> ; </span>]
- [<span class="optional"> check-names (<code class="constant">warn</code>|<code class="constant">fail</code>|<code class="constant">ignore</code>) ; // Not Implemented. </span>]
+ [<span class="optional"> check-names (<code class="constant">warn</code>|<code class="constant">fail</code>|<code class="constant">ignore</code>) ; </span>] // Not Implemented.
};
zone <em class="replaceable"><code>zone_name</code></em> [<span class="optional"><em class="replaceable"><code>class</code></em></span>] {
@@ -5418,14 +6296,18 @@ zone <em class="replaceable"><code>zone_name</code></em> [<span class="optional"
[<span class="optional"> masterfile-format (<code class="constant">text</code>|<code class="constant">raw</code>) ; </span>]
[<span class="optional"> forward (<code class="constant">only</code>|<code class="constant">first</code>) ; </span>]
[<span class="optional"> forwarders { [<span class="optional"> <em class="replaceable"><code>ip_addr</code></em> [<span class="optional">port <em class="replaceable"><code>ip_port</code></em></span>] ; ... </span>] }; </span>]
- [<span class="optional"> masters [<span class="optional">port <em class="replaceable"><code>ip_port</code></em></span>] { ( <em class="replaceable"><code>masters_list</code></em> | <em class="replaceable"><code>ip_addr</code></em> [<span class="optional">port <em class="replaceable"><code>ip_port</code></em></span>] [<span class="optional">key <em class="replaceable"><code>key</code></em></span>] ) ; [<span class="optional">...</span>] }; </span>]
+ [<span class="optional"> masters [<span class="optional">port <em class="replaceable"><code>ip_port</code></em></span>] { ( <em class="replaceable"><code>masters_list</code></em> | <em class="replaceable"><code>ip_addr</code></em>
+ [<span class="optional">port <em class="replaceable"><code>ip_port</code></em></span>]
+ [<span class="optional">key <em class="replaceable"><code>key</code></em></span>] ) ; [<span class="optional">...</span>] }; </span>]
[<span class="optional"> max-transfer-idle-in <em class="replaceable"><code>number</code></em> ; </span>]
[<span class="optional"> max-transfer-time-in <em class="replaceable"><code>number</code></em> ; </span>]
[<span class="optional"> pubkey <em class="replaceable"><code>number</code></em> <em class="replaceable"><code>number</code></em> <em class="replaceable"><code>number</code></em> <em class="replaceable"><code>string</code></em> ; </span>]
[<span class="optional"> transfer-source (<em class="replaceable"><code>ip4_addr</code></em> | <code class="constant">*</code>) [<span class="optional">port <em class="replaceable"><code>ip_port</code></em></span>] ; </span>]
- [<span class="optional"> transfer-source-v6 (<em class="replaceable"><code>ip6_addr</code></em> | <code class="constant">*</code>) [<span class="optional">port <em class="replaceable"><code>ip_port</code></em></span>] ; </span>]
+ [<span class="optional"> transfer-source-v6 (<em class="replaceable"><code>ip6_addr</code></em> | <code class="constant">*</code>)
+ [<span class="optional">port <em class="replaceable"><code>ip_port</code></em></span>] ; </span>]
[<span class="optional"> alt-transfer-source (<em class="replaceable"><code>ip4_addr</code></em> | <code class="constant">*</code>) [<span class="optional">port <em class="replaceable"><code>ip_port</code></em></span>] ; </span>]
- [<span class="optional"> alt-transfer-source-v6 (<em class="replaceable"><code>ip6_addr</code></em> | <code class="constant">*</code>) [<span class="optional">port <em class="replaceable"><code>ip_port</code></em></span>] ; </span>]
+ [<span class="optional"> alt-transfer-source-v6 (<em class="replaceable"><code>ip6_addr</code></em> | <code class="constant">*</code>)
+ [<span class="optional">port <em class="replaceable"><code>ip_port</code></em></span>] ; </span>]
[<span class="optional"> use-alt-transfer-source <em class="replaceable"><code>yes_or_no</code></em>; </span>]
[<span class="optional"> zone-statistics <em class="replaceable"><code>yes_or_no</code></em> ; </span>]
[<span class="optional"> database <em class="replaceable"><code>string</code></em> ; </span>]
@@ -5437,6 +6319,14 @@ zone <em class="replaceable"><code>zone_name</code></em> [<span class="optional"
};
zone <em class="replaceable"><code>zone_name</code></em> [<span class="optional"><em class="replaceable"><code>class</code></em></span>] {
+ type static-stub;
+ [<span class="optional"> allow-query { <em class="replaceable"><code>address_match_list</code></em> }; </span>]
+ [<span class="optional"> server-addresses { [<span class="optional"> <em class="replaceable"><code>ip_addr</code></em> ; ... </span>] }; </span>]
+ [<span class="optional"> server-names { [<span class="optional"> <em class="replaceable"><code>namelist</code></em> </span>] }; </span>]
+ [<span class="optional"> zone-statistics <em class="replaceable"><code>yes_or_no</code></em> ; </span>]
+};
+
+zone <em class="replaceable"><code>zone_name</code></em> [<span class="optional"><em class="replaceable"><code>class</code></em></span>] {
type forward;
[<span class="optional"> forward (<code class="constant">only</code>|<code class="constant">first</code>) ; </span>]
[<span class="optional"> forwarders { [<span class="optional"> <em class="replaceable"><code>ip_addr</code></em> [<span class="optional">port <em class="replaceable"><code>ip_port</code></em></span>] ; ... </span>] }; </span>]
@@ -5451,10 +6341,10 @@ zone <em class="replaceable"><code>zone_name</code></em> [<span class="optional"
</div>
<div class="sect2" lang="en">
<div class="titlepage"><div><div><h3 class="title">
-<a name="id2588600"></a><span><strong class="command">zone</strong></span> Statement Definition and Usage</h3></div></div></div>
+<a name="id2591396"></a><span><strong class="command">zone</strong></span> Statement Definition and Usage</h3></div></div></div>
<div class="sect3" lang="en">
<div class="titlepage"><div><div><h4 class="title">
-<a name="id2588608"></a>Zone Types</h4></div></div></div>
+<a name="id2591403"></a>Zone Types</h4></div></div></div>
<div class="informaltable"><table border="1">
<colgroup>
<col>
@@ -5583,6 +6473,55 @@ zone <em class="replaceable"><code>zone_name</code></em> [<span class="optional"
<tr>
<td>
<p>
+ <code class="varname">static-stub</code>
+ </p>
+ </td>
+<td>
+ <p>
+ A static-stub zone is similar to a stub zone
+ with the following exceptions:
+ the zone data is statically configured, rather
+ than transferred from a master server;
+ when recursion is necessary for a query that
+ matches a static-stub zone, the locally
+ configured data (nameserver names and glue addresses)
+ is always used even if different authoritative
+ information is cached.
+ </p>
+ <p>
+ Zone data is configured via the
+ <span><strong class="command">server-addresses</strong></span> and
+ <span><strong class="command">server-names</strong></span> zone options.
+ </p>
+ <p>
+ The zone data is maintained in the form of NS
+ and (if necessary) glue A or AAAA RRs
+ internally, which can be seen by dumping zone
+ databases by <span><strong class="command">rndc dumpdb -all</strong></span>.
+ The configured RRs are considered local configuration
+ parameters rather than public data.
+ Non recursive queries (i.e., those with the RD
+ bit off) to a static-stub zone are therefore
+ prohibited and will be responded with REFUSED.
+ </p>
+ <p>
+ Since the data is statically configured, no
+ zone maintenance action takes place for a static-stub
+ zone.
+ For example, there is no periodic refresh
+ attempt, and an incoming notify message
+ will be rejected with an rcode of NOTAUTH.
+ </p>
+ <p>
+ Each static-stub zone is configured with
+ internally generated NS and (if necessary)
+ glue A or AAAA RRs
+ </p>
+ </td>
+</tr>
+<tr>
+<td>
+ <p>
<code class="varname">forward</code>
</p>
</td>
@@ -5665,7 +6604,7 @@ zone <em class="replaceable"><code>zone_name</code></em> [<span class="optional"
</div>
<div class="sect3" lang="en">
<div class="titlepage"><div><div><h4 class="title">
-<a name="id2589104"></a>Class</h4></div></div></div>
+<a name="id2592085"></a>Class</h4></div></div></div>
<p>
The zone's name may optionally be followed by a class. If
a class is not specified, class <code class="literal">IN</code> (for <code class="varname">Internet</code>),
@@ -5687,7 +6626,7 @@ zone <em class="replaceable"><code>zone_name</code></em> [<span class="optional"
</div>
<div class="sect3" lang="en">
<div class="titlepage"><div><div><h4 class="title">
-<a name="id2589137"></a>Zone Options</h4></div></div></div>
+<a name="id2592118"></a>Zone Options</h4></div></div></div>
<div class="variablelist"><dl>
<dt><span class="term"><span><strong class="command">allow-notify</strong></span></span></dt>
<dd><p>
@@ -5752,6 +6691,7 @@ zone <em class="replaceable"><code>zone_name</code></em> [<span class="optional"
received from the
network. The default varies according to zone type. For <span><strong class="command">master</strong></span> zones the default is <span><strong class="command">fail</strong></span>. For <span><strong class="command">slave</strong></span>
zones the default is <span><strong class="command">warn</strong></span>.
+ It is not implemented for <span><strong class="command">hint</strong></span> zones.
</p></dd>
<dt><span class="term"><span><strong class="command">check-mx</strong></span></span></dt>
<dd><p>
@@ -5783,6 +6723,11 @@ zone <em class="replaceable"><code>zone_name</code></em> [<span class="optional"
See the description of
<span><strong class="command">update-check-ksk</strong></span> in <a href="Bv9ARM.ch06.html#boolean_options" title="Boolean Options">the section called &#8220;Boolean Options&#8221;</a>.
</p></dd>
+<dt><span class="term"><span><strong class="command">dnssec-dnskey-kskonly</strong></span></span></dt>
+<dd><p>
+ See the description of
+ <span><strong class="command">dnssec-dnskey-kskonly</strong></span> in <a href="Bv9ARM.ch06.html#boolean_options" title="Boolean Options">the section called &#8220;Boolean Options&#8221;</a>.
+ </p></dd>
<dt><span class="term"><span><strong class="command">try-tcp-refresh</strong></span></span></dt>
<dd><p>
See the description of
@@ -5926,6 +6871,78 @@ zone <em class="replaceable"><code>zone_name</code></em> [<span class="optional"
<span><strong class="command">statistics-file</strong></span> defined in
the server options.
</p></dd>
+<dt><span class="term"><span><strong class="command">server-addresses</strong></span></span></dt>
+<dd>
+<p>
+ Only meaningful for static-stub zones.
+ This is a list of IP addresses to which queries
+ should be sent in recursive resolution for the
+ zone.
+ A non empty list for this option will internally
+ configure the apex NS RR with associated glue A or
+ AAAA RRs.
+ </p>
+<p>
+ For example, if "example.com" is configured as a
+ static-stub zone with 192.0.2.1 and 2001:db8::1234
+ in a <span><strong class="command">server-addresses</strong></span> option,
+ the following RRs will be internally configured.
+ </p>
+<pre class="programlisting">example.com. NS example.com.
+example.com. A 192.0.2.1
+example.com. AAAA 2001:db8::1234</pre>
+<p>
+ These records are internally used to resolve
+ names under the static-stub zone.
+ For instance, if the server receives a query for
+ "www.example.com" with the RD bit on, the server
+ will initiate recursive resolution and send
+ queries to 192.0.2.1 and/or 2001:db8::1234.
+ </p>
+</dd>
+<dt><span class="term"><span><strong class="command">server-names</strong></span></span></dt>
+<dd>
+<p>
+ Only meaningful for static-stub zones.
+ This is a list of domain names of nameservers that
+ act as authoritative servers of the static-stub
+ zone.
+ These names will be resolved to IP addresses when
+ <span><strong class="command">named</strong></span> needs to send queries to
+ these servers.
+ To make this supplemental resolution successful,
+ these names must not be a subdomain of the origin
+ name of static-stub zone.
+ That is, when "example.net" is the origin of a
+ static-stub zone, "ns.example" and
+ "master.example.com" can be specified in the
+ <span><strong class="command">server-names</strong></span> option, but
+ "ns.example.net" cannot, and will be rejected by
+ the configuration parser.
+ </p>
+<p>
+ A non empty list for this option will internally
+ configure the apex NS RR with the specified names.
+ For example, if "example.com" is configured as a
+ static-stub zone with "ns1.example.net" and
+ "ns2.example.net"
+ in a <span><strong class="command">server-names</strong></span> option,
+ the following RRs will be internally configured.
+ </p>
+<pre class="programlisting">example.com. NS ns1.example.net.
+example.com. NS ns2.example.net.
+</pre>
+<p>
+ These records are internally used to resolve
+ names under the static-stub zone.
+ For instance, if the server receives a query for
+ "www.example.com" with the RD bit on, the server
+ initiate recursive resolution,
+ resolve "ns1.example.net" and/or
+ "ns2.example.net" to IP addresses, and then send
+ queries to (one or more of) these addresses.
+ </p>
+</dd>
<dt><span class="term"><span><strong class="command">sig-validity-interval</strong></span></span></dt>
<dd><p>
See the description of
@@ -6003,6 +7020,48 @@ zone <em class="replaceable"><code>zone_name</code></em> [<span class="optional"
Usage">the section called &#8220;<span><strong class="command">options</strong></span> Statement Definition and
Usage&#8221;</a>.
</p></dd>
+<dt><span class="term"><span><strong class="command">auto-dnssec</strong></span></span></dt>
+<dd>
+<p>
+ Zones configured for dynamic DNS may also use this
+ option to allow varying levels of automatic DNSSEC key
+ management. There are four possible settings:
+ </p>
+<p>
+ <span><strong class="command">auto-dnssec allow;</strong></span> permits
+ keys to be updated and the zone fully re-signed
+ whenever the user issues the command <span><strong class="command">rndc sign
+ <em class="replaceable"><code>zonename</code></em></strong></span>.
+ </p>
+<p>
+ <span><strong class="command">auto-dnssec maintain;</strong></span> includes the
+ above, but also automatically adjusts the zone's DNSSEC
+ keys on schedule, according to the keys' timing metadata
+ (see <a href="man.dnssec-keygen.html" title="dnssec-keygen"><span class="refentrytitle"><span class="application">dnssec-keygen</span></span>(8)</a> and
+ <a href="man.dnssec-settime.html" title="dnssec-settime"><span class="refentrytitle"><span class="application">dnssec-settime</span></span>(8)</a>). The command
+ <span><strong class="command">rndc sign
+ <em class="replaceable"><code>zonename</code></em></strong></span> causes
+ <span><strong class="command">named</strong></span> to load keys from the key
+ repository and sign the zone with all keys that are
+ active.
+ <span><strong class="command">rndc loadkeys
+ <em class="replaceable"><code>zonename</code></em></strong></span> causes
+ <span><strong class="command">named</strong></span> to load keys from the key
+ repository and schedule key maintenance events to occur
+ in the future, but it does not sign the full zone
+ immediately.
+ </p>
+<p>
+ <span><strong class="command">auto-dnssec create;</strong></span> includes the
+ above, but also allows <span><strong class="command">named</strong></span>
+ to create new keys in the key repository when needed.
+ (NOTE: This option is not yet implemented; the syntax is
+ being reserved for future use.)
+ </p>
+<p>
+ The default setting is <span><strong class="command">auto-dnssec off</strong></span>.
+ </p>
+</dd>
<dt><span class="term"><span><strong class="command">multi-master</strong></span></span></dt>
<dd><p>
See the description of <span><strong class="command">multi-master</strong></span> in
@@ -6013,6 +7072,11 @@ zone <em class="replaceable"><code>zone_name</code></em> [<span class="optional"
See the description of <span><strong class="command">masterfile-format</strong></span>
in <a href="Bv9ARM.ch06.html#tuning" title="Tuning">the section called &#8220;Tuning&#8221;</a>.
</p></dd>
+<dt><span class="term"><span><strong class="command">dnssec-secure-to-insecure</strong></span></span></dt>
+<dd><p>
+ See the description of
+ <span><strong class="command">dnssec-secure-to-insecure</strong></span> in <a href="Bv9ARM.ch06.html#boolean_options" title="Boolean Options">the section called &#8220;Boolean Options&#8221;</a>.
+ </p></dd>
</dl></div>
</div>
<div class="sect3" lang="en">
@@ -6031,15 +7095,14 @@ zone <em class="replaceable"><code>zone_name</code></em> [<span class="optional"
record of any name in the zone.
</p>
<p>
- The <span><strong class="command">update-policy</strong></span> clause is new
- in <acronym class="acronym">BIND</acronym> 9 and allows more fine-grained
- control over what updates are allowed. A set of rules
- is specified, where each rule either grants or denies
- permissions for one or more names to be updated by
- one or more identities. If the dynamic update request
- message is signed (that is, it includes either a TSIG
- or SIG(0) record), the identity of the signer can be
- determined.
+ The <span><strong class="command">update-policy</strong></span> clause
+ allows more fine-grained control over what updates are
+ allowed. A set of rules is specified, where each rule
+ either grants or denies permissions for one or more
+ names to be updated by one or more identities. If
+ the dynamic update request message is signed (that is,
+ it includes either a TSIG or SIG(0) record), the
+ identity of the signer can be determined.
</p>
<p>
Rules are specified in the <span><strong class="command">update-policy</strong></span>
@@ -6052,20 +7115,47 @@ zone <em class="replaceable"><code>zone_name</code></em> [<span class="optional"
address is not relevant.
</p>
<p>
- This is how a rule definition looks:
+ There is a pre-defined <span><strong class="command">update-policy</strong></span>
+ rule which can be switched on with the command
+ <span><strong class="command">update-policy local;</strong></span>.
+ Switching on this rule in a zone causes
+ <span><strong class="command">named</strong></span> to generate a TSIG session
+ key and place it in a file, and to allow that key
+ to update the zone. (By default, the file is
+ <code class="filename">/var/run/named/session.key</code>, the key
+ name is "local-ddns" and the key algorithm is HMAC-SHA256,
+ but these values are configurable with the
+ <span><strong class="command">session-keyfile</strong></span>,
+ <span><strong class="command">session-keyname</strong></span> and
+ <span><strong class="command">session-keyalg</strong></span> options, respectively).
+ </p>
+<p>
+ A client running on the local system, and with appropriate
+ permissions, may read that file and use the key to sign update
+ requests. The zone's update policy will be set to allow that
+ key to change any record within the zone. Assuming the
+ key name is "local-ddns", this policy is equivalent to:
+ </p>
+<pre class="programlisting">update-policy { grant local-ddns zonesub any; };
+ </pre>
+<p>
+ The command <span><strong class="command">nsupdate -l</strong></span> sends update
+ requests to localhost, and signs them using the session key.
+ </p>
+<p>
+ Other rule definitions look like this:
</p>
<pre class="programlisting">
-( <span><strong class="command">grant</strong></span> | <span><strong class="command">deny</strong></span> ) <em class="replaceable"><code>identity</code></em> <em class="replaceable"><code>nametype</code></em> <em class="replaceable"><code>name</code></em> [<span class="optional"> <em class="replaceable"><code>types</code></em> </span>]
+( <span><strong class="command">grant</strong></span> | <span><strong class="command">deny</strong></span> ) <em class="replaceable"><code>identity</code></em> <em class="replaceable"><code>nametype</code></em> [<span class="optional"> <em class="replaceable"><code>name</code></em> </span>] [<span class="optional"> <em class="replaceable"><code>types</code></em> </span>]
</pre>
<p>
Each rule grants or denies privileges. Once a message has
successfully matched a rule, the operation is immediately
- granted
- or denied and no further rules are examined. A rule is matched
- when the signer matches the identity field, the name matches the
- name field in accordance with the nametype field, and the type
- matches
- the types specified in the type field.
+ granted or denied and no further rules are examined. A rule
+ is matched when the signer matches the identity field, the
+ name matches the name field in accordance with the nametype
+ field, and the type matches the types specified in the type
+ field.
</p>
<p>
No signer is required for <em class="replaceable"><code>tcp-self</code></em>
@@ -6091,7 +7181,7 @@ zone <em class="replaceable"><code>zone_name</code></em> [<span class="optional"
contain a fully-qualified domain name.
</p>
<p>
- The <em class="replaceable"><code>nametype</code></em> field has 12
+ The <em class="replaceable"><code>nametype</code></em> field has 13
values:
<code class="varname">name</code>, <code class="varname">subdomain</code>,
<code class="varname">wildcard</code>, <code class="varname">self</code>,
@@ -6099,7 +7189,8 @@ zone <em class="replaceable"><code>zone_name</code></em> [<span class="optional"
<code class="varname">krb5-self</code>, <code class="varname">ms-self</code>,
<code class="varname">krb5-subdomain</code>,
<code class="varname">ms-subdomain</code>,
- <code class="varname">tcp-self</code> and <code class="varname">6to4-self</code>.
+ <code class="varname">tcp-self</code>, <code class="varname">6to4-self</code>,
+ <code class="varname">zonesub</code>, and <code class="varname">external</code>.
</p>
<div class="informaltable"><table border="1">
<colgroup>
@@ -6140,6 +7231,29 @@ zone <em class="replaceable"><code>zone_name</code></em> [<span class="optional"
<tr>
<td>
<p>
+ <code class="varname">zonesub</code>
+ </p>
+ </td>
+<td>
+ <p>
+ This rule is similar to subdomain, except that
+ it matches when the name being updated is a
+ subdomain of the zone in which the
+ <span><strong class="command">update-policy</strong></span> statement
+ appears. This obviates the need to type the zone
+ name twice, and enables the use of a standard
+ <span><strong class="command">update-policy</strong></span> statement in
+ multiple zones without modification.
+ </p>
+ <p>
+ When this rule is used, the
+ <em class="replaceable"><code>name</code></em> field is omitted.
+ </p>
+ </td>
+</tr>
+<tr>
+<td>
+ <p>
<code class="varname">wildcard</code>
</p>
</td>
@@ -6233,7 +7347,7 @@ zone <em class="replaceable"><code>zone_name</code></em> [<span class="optional"
<td>
<p>
Allow the 6to4 prefix to be update by any TCP
- conection from the 6to4 network or from the
+ connection from the 6to4 network or from the
corresponding IPv4 address. This is intended
to allow NS or DNAME RRsets to be added to the
reverse tree.
@@ -6245,12 +7359,55 @@ zone <em class="replaceable"><code>zone_name</code></em> [<span class="optional"
</div>
</td>
</tr>
+<tr>
+<td>
+ <p>
+ <code class="varname">external</code>
+ </p>
+ </td>
+<td>
+ <p>
+ This rule allows <span><strong class="command">named</strong></span>
+ to defer the decision of whether to allow a
+ given update to an external daemon.
+ </p>
+ <p>
+ The method of communicating with the daemon is
+ specified in the <em class="replaceable"><code>identity</code></em>
+ field, the format of which is
+ "<code class="constant">local:</code><em class="replaceable"><code>path</code></em>",
+ where <em class="replaceable"><code>path</code></em> is the location
+ of a UNIX-domain socket. (Currently, "local" is the
+ only supported mechanism.)
+ </p>
+ <p>
+ Requests to the external daemon are sent over the
+ UNIX-domain socket as datagrams with the following
+ format:
+ </p>
+ <pre class="programlisting">
+ Protocol version number (4 bytes, network byte order, currently 1)
+ Request length (4 bytes, network byte order)
+ Signer (null-terminated string)
+ Name (null-terminated string)
+ TCP source address (null-terminated string)
+ Rdata type (null-terminated string)
+ Key (null-terminated string)
+ TKEY token length (4 bytes, network byte order)
+ TKEY token (remainder of packet)</pre>
+ <p>
+ The daemon replies with a four-byte value in
+ network byte order, containing either 0 or 1; 0
+ indicates that the specified update is not
+ permitted, and 1 indicates that it is.
+ </p>
+ </td>
+</tr>
</tbody>
</table></div>
<p>
In all cases, the <em class="replaceable"><code>name</code></em>
- field must
- specify a fully-qualified domain name.
+ field must specify a fully-qualified domain name.
</p>
<p>
If no types are explicitly specified, this rule matches
@@ -6266,7 +7423,7 @@ zone <em class="replaceable"><code>zone_name</code></em> [<span class="optional"
</div>
<div class="sect1" lang="en">
<div class="titlepage"><div><div><h2 class="title" style="clear: both">
-<a name="id2591216"></a>Zone File</h2></div></div></div>
+<a name="id2594660"></a>Zone File</h2></div></div></div>
<div class="sect2" lang="en">
<div class="titlepage"><div><div><h3 class="title">
<a name="types_of_resource_records_and_when_to_use_them"></a>Types of Resource Records and When to Use Them</h3></div></div></div>
@@ -6279,7 +7436,7 @@ zone <em class="replaceable"><code>zone_name</code></em> [<span class="optional"
</p>
<div class="sect3" lang="en">
<div class="titlepage"><div><div><h4 class="title">
-<a name="id2591234"></a>Resource Records</h4></div></div></div>
+<a name="id2594678"></a>Resource Records</h4></div></div></div>
<p>
A domain name identifies a node. Each node has a set of
resource information, which may be empty. The set of resource
@@ -7016,7 +8173,7 @@ zone <em class="replaceable"><code>zone_name</code></em> [<span class="optional"
</div>
<div class="sect3" lang="en">
<div class="titlepage"><div><div><h4 class="title">
-<a name="id2592857"></a>Textual expression of RRs</h4></div></div></div>
+<a name="id2596301"></a>Textual expression of RRs</h4></div></div></div>
<p>
RRs are represented in binary form in the packets of the DNS
protocol, and are usually represented in highly encoded form
@@ -7219,7 +8376,7 @@ zone <em class="replaceable"><code>zone_name</code></em> [<span class="optional"
</div>
<div class="sect2" lang="en">
<div class="titlepage"><div><div><h3 class="title">
-<a name="id2593378"></a>Discussion of MX Records</h3></div></div></div>
+<a name="id2596822"></a>Discussion of MX Records</h3></div></div></div>
<p>
As described above, domain servers store information as a
series of resource records, each of which contains a particular
@@ -7475,7 +8632,7 @@ zone <em class="replaceable"><code>zone_name</code></em> [<span class="optional"
</div>
<div class="sect2" lang="en">
<div class="titlepage"><div><div><h3 class="title">
-<a name="id2593993"></a>Inverse Mapping in IPv4</h3></div></div></div>
+<a name="id2597574"></a>Inverse Mapping in IPv4</h3></div></div></div>
<p>
Reverse name resolution (that is, translation from IP address
to name) is achieved by means of the <span class="emphasis"><em>in-addr.arpa</em></span> domain
@@ -7536,7 +8693,7 @@ zone <em class="replaceable"><code>zone_name</code></em> [<span class="optional"
</div>
<div class="sect2" lang="en">
<div class="titlepage"><div><div><h3 class="title">
-<a name="id2594188"></a>Other Zone File Directives</h3></div></div></div>
+<a name="id2597701"></a>Other Zone File Directives</h3></div></div></div>
<p>
The Master File Format was initially defined in RFC 1035 and
has subsequently been extended. While the Master File Format
@@ -7551,7 +8708,7 @@ zone <em class="replaceable"><code>zone_name</code></em> [<span class="optional"
</p>
<div class="sect3" lang="en">
<div class="titlepage"><div><div><h4 class="title">
-<a name="id2594211"></a>The <span><strong class="command">@</strong></span> (at-sign)</h4></div></div></div>
+<a name="id2597723"></a>The <span><strong class="command">@</strong></span> (at-sign)</h4></div></div></div>
<p>
When used in the label (or name) field, the asperand or
at-sign (@) symbol represents the current origin.
@@ -7562,7 +8719,7 @@ zone <em class="replaceable"><code>zone_name</code></em> [<span class="optional"
</div>
<div class="sect3" lang="en">
<div class="titlepage"><div><div><h4 class="title">
-<a name="id2594227"></a>The <span><strong class="command">$ORIGIN</strong></span> Directive</h4></div></div></div>
+<a name="id2597739"></a>The <span><strong class="command">$ORIGIN</strong></span> Directive</h4></div></div></div>
<p>
Syntax: <span><strong class="command">$ORIGIN</strong></span>
<em class="replaceable"><code>domain-name</code></em>
@@ -7591,7 +8748,7 @@ WWW.EXAMPLE.COM. CNAME MAIN-SERVER.EXAMPLE.COM.
</div>
<div class="sect3" lang="en">
<div class="titlepage"><div><div><h4 class="title">
-<a name="id2594356"></a>The <span><strong class="command">$INCLUDE</strong></span> Directive</h4></div></div></div>
+<a name="id2597868"></a>The <span><strong class="command">$INCLUDE</strong></span> Directive</h4></div></div></div>
<p>
Syntax: <span><strong class="command">$INCLUDE</strong></span>
<em class="replaceable"><code>filename</code></em>
@@ -7627,7 +8784,7 @@ WWW.EXAMPLE.COM. CNAME MAIN-SERVER.EXAMPLE.COM.
</div>
<div class="sect3" lang="en">
<div class="titlepage"><div><div><h4 class="title">
-<a name="id2594425"></a>The <span><strong class="command">$TTL</strong></span> Directive</h4></div></div></div>
+<a name="id2597938"></a>The <span><strong class="command">$TTL</strong></span> Directive</h4></div></div></div>
<p>
Syntax: <span><strong class="command">$TTL</strong></span>
<em class="replaceable"><code>default-ttl</code></em>
@@ -7646,7 +8803,7 @@ WWW.EXAMPLE.COM. CNAME MAIN-SERVER.EXAMPLE.COM.
</div>
<div class="sect2" lang="en">
<div class="titlepage"><div><div><h3 class="title">
-<a name="id2594461"></a><acronym class="acronym">BIND</acronym> Master File Extension: the <span><strong class="command">$GENERATE</strong></span> Directive</h3></div></div></div>
+<a name="id2597974"></a><acronym class="acronym">BIND</acronym> Master File Extension: the <span><strong class="command">$GENERATE</strong></span> Directive</h3></div></div></div>
<p>
Syntax: <span><strong class="command">$GENERATE</strong></span>
<em class="replaceable"><code>range</code></em>
@@ -7666,7 +8823,7 @@ WWW.EXAMPLE.COM. CNAME MAIN-SERVER.EXAMPLE.COM.
Classless IN-ADDR.ARPA delegation.
</p>
<pre class="programlisting">$ORIGIN 0.0.192.IN-ADDR.ARPA.
-$GENERATE 1-2 0 NS SERVER$.EXAMPLE.
+$GENERATE 1-2 @ NS SERVER$.EXAMPLE.
$GENERATE 1-127 $ CNAME $.0</pre>
<p>
is equivalent to
@@ -7678,6 +8835,28 @@ $GENERATE 1-127 $ CNAME $.0</pre>
...
127.0.0.192.IN-ADDR.ARPA. CNAME 127.0.0.0.192.IN-ADDR.ARPA.
</pre>
+<p>
+ Generate a set of A and MX records. Note the MX's right hand
+ side is a quoted string. The quotes will be stripped when the
+ right hand side is processed.
+ </p>
+<pre class="programlisting">
+$ORIGIN EXAMPLE.
+$GENERATE 1-127 HOST-$ A 1.2.3.$
+$GENERATE 1-127 HOST-$ MX "0 ."</pre>
+<p>
+ is equivalent to
+ </p>
+<pre class="programlisting">HOST-1.EXAMPLE. A 1.2.3.1
+HOST-1.EXAMPLE. MX 0 .
+HOST-2.EXAMPLE. A 1.2.3.2
+HOST-2.EXAMPLE. MX 0 .
+HOST-3.EXAMPLE. A 1.2.3.3
+HOST-3.EXAMPLE. MX 0 .
+...
+HOST-127.EXAMPLE. A 1.2.3.127
+HOST-127.EXAMPLE. MX 0 .
+</pre>
<div class="informaltable"><table border="1">
<colgroup>
<col>
@@ -7728,8 +8907,10 @@ $GENERATE 1-127 $ CNAME $.0</pre>
Available output forms are decimal
(<span><strong class="command">d</strong></span>), octal
- (<span><strong class="command">o</strong></span>) and hexadecimal
+ (<span><strong class="command">o</strong></span>), hexadecimal
(<span><strong class="command">x</strong></span> or <span><strong class="command">X</strong></span>
+ for uppercase) and nibble
+ (<span><strong class="command">n</strong></span> or <span><strong class="command">N</strong></span>\
for uppercase). The default modifier is
<span><strong class="command">${0,0,d}</strong></span>. If the
<span><strong class="command">lhs</strong></span> is not absolute, the
@@ -7737,8 +8918,16 @@ $GENERATE 1-127 $ CNAME $.0</pre>
to the name.
</p>
<p>
- For compatibility with earlier versions, <span><strong class="command">$$</strong></span> is still
- recognized as indicating a literal $ in the output.
+ In nibble mode the value will be treated as
+ if it was a reversed hexadecimal string
+ with each hexadecimal digit as a separate
+ label. The width field includes the label
+ separator.
+ </p>
+ <p>
+ For compatibility with earlier versions,
+ <span><strong class="command">$$</strong></span> is still recognized as
+ indicating a literal $ in the output.
</p>
</td>
</tr>
@@ -7780,8 +8969,7 @@ $GENERATE 1-127 $ CNAME $.0</pre>
</td>
<td>
<p>
- At present the only supported types are
- PTR, CNAME, DNAME, A, AAAA and NS.
+ Any valid type.
</p>
</td>
</tr>
@@ -7791,8 +8979,7 @@ $GENERATE 1-127 $ CNAME $.0</pre>
</td>
<td>
<p>
- <span><strong class="command">rhs</strong></span> is a domain name. It is processed
- similarly to lhs.
+ <span><strong class="command">rhs</strong></span>, optionally, quoted string.
</p>
</td>
</tr>
@@ -7942,9 +9129,12 @@ $GENERATE 1-127 $ CNAME $.0</pre>
</td>
<td>
<p>
- The number of RRsets per RR type (positive
- or negative) and nonexistent names stored in the
- cache database.
+ The number of RRsets per RR type and nonexistent
+ names stored in the cache database.
+ If the exclamation mark (!) is printed for a RR
+ type, it means that particular type of RRset is
+ known to be nonexistent (this is also known as
+ "NXRRSET").
Maintained per view.
</p>
</td>
@@ -8037,7 +9227,7 @@ $GENERATE 1-127 $ CNAME $.0</pre>
</p>
<div class="sect3" lang="en">
<div class="titlepage"><div><div><h4 class="title">
-<a name="id2595458"></a>Name Server Statistics Counters</h4></div></div></div>
+<a name="id2598928"></a>Name Server Statistics Counters</h4></div></div></div>
<div class="informaltable"><table border="1">
<colgroup>
<col>
@@ -8594,7 +9784,7 @@ $GENERATE 1-127 $ CNAME $.0</pre>
</div>
<div class="sect3" lang="en">
<div class="titlepage"><div><div><h4 class="title">
-<a name="id2596931"></a>Zone Maintenance Statistics Counters</h4></div></div></div>
+<a name="id2600401"></a>Zone Maintenance Statistics Counters</h4></div></div></div>
<div class="informaltable"><table border="1">
<colgroup>
<col>
@@ -8748,7 +9938,7 @@ $GENERATE 1-127 $ CNAME $.0</pre>
</div>
<div class="sect3" lang="en">
<div class="titlepage"><div><div><h4 class="title">
-<a name="id2597314"></a>Resolver Statistics Counters</h4></div></div></div>
+<a name="id2600852"></a>Resolver Statistics Counters</h4></div></div></div>
<div class="informaltable"><table border="1">
<colgroup>
<col>
@@ -8900,6 +10090,13 @@ $GENERATE 1-127 $ CNAME $.0</pre>
<td>
<p>
Mismatch responses received.
+ The DNS ID, response's source address,
+ and/or the response's source port does not
+ match what was expected.
+ (The port must be 53 or as defined by
+ the <span><strong class="command">port</strong></span> option.)
+ This may be an indication of a cache
+ poisoning attempt.
</p>
</td>
</tr>
@@ -9124,7 +10321,7 @@ $GENERATE 1-127 $ CNAME $.0</pre>
</div>
<div class="sect3" lang="en">
<div class="titlepage"><div><div><h4 class="title">
-<a name="id2598332"></a>Socket I/O Statistics Counters</h4></div></div></div>
+<a name="id2601942"></a>Socket I/O Statistics Counters</h4></div></div></div>
<p>
Socket I/O statistics counters are defined per socket
types, which are
@@ -9279,7 +10476,7 @@ $GENERATE 1-127 $ CNAME $.0</pre>
</div>
<div class="sect3" lang="en">
<div class="titlepage"><div><div><h4 class="title">
-<a name="id2598842"></a>Compatibility with <span class="emphasis"><em>BIND</em></span> 8 Counters</h4></div></div></div>
+<a name="id2602384"></a>Compatibility with <span class="emphasis"><em>BIND</em></span> 8 Counters</h4></div></div></div>
<p>
Most statistics counters that were available
in <span><strong class="command">BIND</strong></span> 8 are also supported in
diff --git a/contrib/bind9/doc/arm/Bv9ARM.ch07.html b/contrib/bind9/doc/arm/Bv9ARM.ch07.html
index ce23cad..371f4a9 100644
--- a/contrib/bind9/doc/arm/Bv9ARM.ch07.html
+++ b/contrib/bind9/doc/arm/Bv9ARM.ch07.html
@@ -1,5 +1,5 @@
<!--
- - Copyright (C) 2004-2010 Internet Systems Consortium, Inc. ("ISC")
+ - Copyright (C) 2004-2011 Internet Systems Consortium, Inc. ("ISC")
- Copyright (C) 2000-2003 Internet Software Consortium.
-
- Permission to use, copy, modify, and/or distribute this software for any
@@ -14,7 +14,7 @@
- OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
- PERFORMANCE OF THIS SOFTWARE.
-->
-<!-- $Id: Bv9ARM.ch07.html,v 1.178.14.15 2010-08-20 02:05:39 tbox Exp $ -->
+<!-- $Id: Bv9ARM.ch07.html,v 1.242.8.1.2.1 2011-06-09 03:41:08 tbox Exp $ -->
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
@@ -46,10 +46,10 @@
<p><b>Table of Contents</b></p>
<dl>
<dt><span class="sect1"><a href="Bv9ARM.ch07.html#Access_Control_Lists">Access Control Lists</a></span></dt>
-<dt><span class="sect1"><a href="Bv9ARM.ch07.html#id2599016"><span><strong class="command">Chroot</strong></span> and <span><strong class="command">Setuid</strong></span></a></span></dt>
+<dt><span class="sect1"><a href="Bv9ARM.ch07.html#id2602626"><span><strong class="command">Chroot</strong></span> and <span><strong class="command">Setuid</strong></span></a></span></dt>
<dd><dl>
-<dt><span class="sect2"><a href="Bv9ARM.ch07.html#id2599234">The <span><strong class="command">chroot</strong></span> Environment</a></span></dt>
-<dt><span class="sect2"><a href="Bv9ARM.ch07.html#id2599362">Using the <span><strong class="command">setuid</strong></span> Function</a></span></dt>
+<dt><span class="sect2"><a href="Bv9ARM.ch07.html#id2602707">The <span><strong class="command">chroot</strong></span> Environment</a></span></dt>
+<dt><span class="sect2"><a href="Bv9ARM.ch07.html#id2602766">Using the <span><strong class="command">setuid</strong></span> Function</a></span></dt>
</dl></dd>
<dt><span class="sect1"><a href="Bv9ARM.ch07.html#dynamic_update_security">Dynamic Update Security</a></span></dt>
</dl>
@@ -80,14 +80,17 @@
Here is an example of how to properly apply ACLs:
</p>
<pre class="programlisting">
-// Set up an ACL named "bogusnets" that will block RFC1918 space
-// and some reserved space, which is commonly used in spoofing attacks.
+// Set up an ACL named "bogusnets" that will block
+// RFC1918 space and some reserved space, which is
+// commonly used in spoofing attacks.
acl bogusnets {
- 0.0.0.0/8; 1.0.0.0/8; 2.0.0.0/8; 192.0.2.0/24; 224.0.0.0/3;
- 10.0.0.0/8; 172.16.0.0/12; 192.168.0.0/16;
+ 0.0.0.0/8; 1.0.0.0/8; 2.0.0.0/8; 192.0.2.0/24;
+ 224.0.0.0/3; 10.0.0.0/8; 172.16.0.0/12;
+ 192.168.0.0/16;
};
-// Set up an ACL called our-nets. Replace this with the real IP numbers.
+// Set up an ACL called our-nets. Replace this with the
+// real IP numbers.
acl our-nets { x.x.x.x/24; x.x.x.x/21; };
options {
...
@@ -119,7 +122,7 @@ zone "example.com" {
</div>
<div class="sect1" lang="en">
<div class="titlepage"><div><div><h2 class="title" style="clear: both">
-<a name="id2599016"></a><span><strong class="command">Chroot</strong></span> and <span><strong class="command">Setuid</strong></span>
+<a name="id2602626"></a><span><strong class="command">Chroot</strong></span> and <span><strong class="command">Setuid</strong></span>
</h2></div></div></div>
<p>
On UNIX servers, it is possible to run <acronym class="acronym">BIND</acronym>
@@ -145,7 +148,7 @@ zone "example.com" {
</p>
<div class="sect2" lang="en">
<div class="titlepage"><div><div><h3 class="title">
-<a name="id2599234"></a>The <span><strong class="command">chroot</strong></span> Environment</h3></div></div></div>
+<a name="id2602707"></a>The <span><strong class="command">chroot</strong></span> Environment</h3></div></div></div>
<p>
In order for a <span><strong class="command">chroot</strong></span> environment
to
@@ -173,7 +176,7 @@ zone "example.com" {
</div>
<div class="sect2" lang="en">
<div class="titlepage"><div><div><h3 class="title">
-<a name="id2599362"></a>Using the <span><strong class="command">setuid</strong></span> Function</h3></div></div></div>
+<a name="id2602766"></a>Using the <span><strong class="command">setuid</strong></span> Function</h3></div></div></div>
<p>
Prior to running the <span><strong class="command">named</strong></span> daemon,
use
diff --git a/contrib/bind9/doc/arm/Bv9ARM.ch08.html b/contrib/bind9/doc/arm/Bv9ARM.ch08.html
index bb9ecc8..0681e47 100644
--- a/contrib/bind9/doc/arm/Bv9ARM.ch08.html
+++ b/contrib/bind9/doc/arm/Bv9ARM.ch08.html
@@ -1,5 +1,5 @@
<!--
- - Copyright (C) 2004-2010 Internet Systems Consortium, Inc. ("ISC")
+ - Copyright (C) 2004-2011 Internet Systems Consortium, Inc. ("ISC")
- Copyright (C) 2000-2003 Internet Software Consortium.
-
- Permission to use, copy, modify, and/or distribute this software for any
@@ -14,7 +14,7 @@
- OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
- PERFORMANCE OF THIS SOFTWARE.
-->
-<!-- $Id: Bv9ARM.ch08.html,v 1.178.14.15 2010-08-20 02:05:39 tbox Exp $ -->
+<!-- $Id: Bv9ARM.ch08.html,v 1.242.8.1.2.1 2011-06-09 03:41:08 tbox Exp $ -->
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
@@ -45,18 +45,18 @@
<div class="toc">
<p><b>Table of Contents</b></p>
<dl>
-<dt><span class="sect1"><a href="Bv9ARM.ch08.html#id2599442">Common Problems</a></span></dt>
-<dd><dl><dt><span class="sect2"><a href="Bv9ARM.ch08.html#id2599447">It's not working; how can I figure out what's wrong?</a></span></dt></dl></dd>
-<dt><span class="sect1"><a href="Bv9ARM.ch08.html#id2599459">Incrementing and Changing the Serial Number</a></span></dt>
-<dt><span class="sect1"><a href="Bv9ARM.ch08.html#id2599476">Where Can I Get Help?</a></span></dt>
+<dt><span class="sect1"><a href="Bv9ARM.ch08.html#id2602915">Common Problems</a></span></dt>
+<dd><dl><dt><span class="sect2"><a href="Bv9ARM.ch08.html#id2602920">It's not working; how can I figure out what's wrong?</a></span></dt></dl></dd>
+<dt><span class="sect1"><a href="Bv9ARM.ch08.html#id2602932">Incrementing and Changing the Serial Number</a></span></dt>
+<dt><span class="sect1"><a href="Bv9ARM.ch08.html#id2602949">Where Can I Get Help?</a></span></dt>
</dl>
</div>
<div class="sect1" lang="en">
<div class="titlepage"><div><div><h2 class="title" style="clear: both">
-<a name="id2599442"></a>Common Problems</h2></div></div></div>
+<a name="id2602915"></a>Common Problems</h2></div></div></div>
<div class="sect2" lang="en">
<div class="titlepage"><div><div><h3 class="title">
-<a name="id2599447"></a>It's not working; how can I figure out what's wrong?</h3></div></div></div>
+<a name="id2602920"></a>It's not working; how can I figure out what's wrong?</h3></div></div></div>
<p>
The best solution to solving installation and
configuration issues is to take preventative measures by setting
@@ -68,7 +68,7 @@
</div>
<div class="sect1" lang="en">
<div class="titlepage"><div><div><h2 class="title" style="clear: both">
-<a name="id2599459"></a>Incrementing and Changing the Serial Number</h2></div></div></div>
+<a name="id2602932"></a>Incrementing and Changing the Serial Number</h2></div></div></div>
<p>
Zone serial numbers are just numbers &#8212; they aren't
date related. A lot of people set them to a number that
@@ -95,7 +95,7 @@
</div>
<div class="sect1" lang="en">
<div class="titlepage"><div><div><h2 class="title" style="clear: both">
-<a name="id2599476"></a>Where Can I Get Help?</h2></div></div></div>
+<a name="id2602949"></a>Where Can I Get Help?</h2></div></div></div>
<p>
The Internet Systems Consortium
(<acronym class="acronym">ISC</acronym>) offers a wide range
diff --git a/contrib/bind9/doc/arm/Bv9ARM.ch09.html b/contrib/bind9/doc/arm/Bv9ARM.ch09.html
index c5bd994..fd53237 100644
--- a/contrib/bind9/doc/arm/Bv9ARM.ch09.html
+++ b/contrib/bind9/doc/arm/Bv9ARM.ch09.html
@@ -1,5 +1,5 @@
<!--
- - Copyright (C) 2004-2010 Internet Systems Consortium, Inc. ("ISC")
+ - Copyright (C) 2004-2011 Internet Systems Consortium, Inc. ("ISC")
- Copyright (C) 2000-2003 Internet Software Consortium.
-
- Permission to use, copy, modify, and/or distribute this software for any
@@ -14,7 +14,7 @@
- OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
- PERFORMANCE OF THIS SOFTWARE.
-->
-<!-- $Id: Bv9ARM.ch09.html,v 1.180.16.16 2010-08-20 02:05:38 tbox Exp $ -->
+<!-- $Id: Bv9ARM.ch09.html,v 1.246.8.1.2.1 2011-06-09 03:41:08 tbox Exp $ -->
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
@@ -45,21 +45,31 @@
<div class="toc">
<p><b>Table of Contents</b></p>
<dl>
-<dt><span class="sect1"><a href="Bv9ARM.ch09.html#id2599606">Acknowledgments</a></span></dt>
+<dt><span class="sect1"><a href="Bv9ARM.ch09.html#id2603147">Acknowledgments</a></span></dt>
<dd><dl><dt><span class="sect2"><a href="Bv9ARM.ch09.html#historical_dns_information">A Brief History of the <acronym class="acronym">DNS</acronym> and <acronym class="acronym">BIND</acronym></a></span></dt></dl></dd>
-<dt><span class="sect1"><a href="Bv9ARM.ch09.html#id2599778">General <acronym class="acronym">DNS</acronym> Reference Information</a></span></dt>
+<dt><span class="sect1"><a href="Bv9ARM.ch09.html#id2603319">General <acronym class="acronym">DNS</acronym> Reference Information</a></span></dt>
<dd><dl><dt><span class="sect2"><a href="Bv9ARM.ch09.html#ipv6addresses">IPv6 addresses (AAAA)</a></span></dt></dl></dd>
<dt><span class="sect1"><a href="Bv9ARM.ch09.html#bibliography">Bibliography (and Suggested Reading)</a></span></dt>
<dd><dl>
<dt><span class="sect2"><a href="Bv9ARM.ch09.html#rfcs">Request for Comments (RFCs)</a></span></dt>
<dt><span class="sect2"><a href="Bv9ARM.ch09.html#internet_drafts">Internet Drafts</a></span></dt>
-<dt><span class="sect2"><a href="Bv9ARM.ch09.html#id2603126">Other Documents About <acronym class="acronym">BIND</acronym></a></span></dt>
+<dt><span class="sect2"><a href="Bv9ARM.ch09.html#id2606462">Other Documents About <acronym class="acronym">BIND</acronym></a></span></dt>
+</dl></dd>
+<dt><span class="sect1"><a href="Bv9ARM.ch09.html#bind9.library">BIND 9 DNS Library Support</a></span></dt>
+<dd><dl>
+<dt><span class="sect2"><a href="Bv9ARM.ch09.html#id2608789">Prerequisite</a></span></dt>
+<dt><span class="sect2"><a href="Bv9ARM.ch09.html#id2608798">Compilation</a></span></dt>
+<dt><span class="sect2"><a href="Bv9ARM.ch09.html#id2608004">Installation</a></span></dt>
+<dt><span class="sect2"><a href="Bv9ARM.ch09.html#id2608035">Known Defects/Restrictions</a></span></dt>
+<dt><span class="sect2"><a href="Bv9ARM.ch09.html#id2608112">The dns.conf File</a></span></dt>
+<dt><span class="sect2"><a href="Bv9ARM.ch09.html#id2608138">Sample Applications</a></span></dt>
+<dt><span class="sect2"><a href="Bv9ARM.ch09.html#id2609111">Library References</a></span></dt>
</dl></dd>
</dl>
</div>
<div class="sect1" lang="en">
<div class="titlepage"><div><div><h2 class="title" style="clear: both">
-<a name="id2599606"></a>Acknowledgments</h2></div></div></div>
+<a name="id2603147"></a>Acknowledgments</h2></div></div></div>
<div class="sect2" lang="en">
<div class="titlepage"><div><div><h3 class="title">
<a name="historical_dns_information"></a>A Brief History of the <acronym class="acronym">DNS</acronym> and <acronym class="acronym">BIND</acronym>
@@ -162,7 +172,7 @@
</div>
<div class="sect1" lang="en">
<div class="titlepage"><div><div><h2 class="title" style="clear: both">
-<a name="id2599778"></a>General <acronym class="acronym">DNS</acronym> Reference Information</h2></div></div></div>
+<a name="id2603319"></a>General <acronym class="acronym">DNS</acronym> Reference Information</h2></div></div></div>
<div class="sect2" lang="en">
<div class="titlepage"><div><div><h3 class="title">
<a name="ipv6addresses"></a>IPv6 addresses (AAAA)</h3></div></div></div>
@@ -250,17 +260,17 @@
</p>
<div class="bibliography">
<div class="titlepage"><div><div><h4 class="title">
-<a name="id2599897"></a>Bibliography</h4></div></div></div>
+<a name="id2603507"></a>Bibliography</h4></div></div></div>
<div class="bibliodiv">
<h3 class="title">Standards</h3>
<div class="biblioentry">
-<a name="id2599908"></a><p>[<abbr class="abbrev">RFC974</abbr>] <span class="author"><span class="firstname">C.</span> <span class="surname">Partridge</span>. </span><span class="title"><i>Mail Routing and the Domain System</i>. </span><span class="pubdate">January 1986. </span></p>
+<a name="id2603517"></a><p>[<abbr class="abbrev">RFC974</abbr>] <span class="author"><span class="firstname">C.</span> <span class="surname">Partridge</span>. </span><span class="title"><i>Mail Routing and the Domain System</i>. </span><span class="pubdate">January 1986. </span></p>
</div>
<div class="biblioentry">
-<a name="id2599931"></a><p>[<abbr class="abbrev">RFC1034</abbr>] <span class="author"><span class="firstname">P.V.</span> <span class="surname">Mockapetris</span>. </span><span class="title"><i>Domain Names &#8212; Concepts and Facilities</i>. </span><span class="pubdate">November 1987. </span></p>
+<a name="id2603541"></a><p>[<abbr class="abbrev">RFC1034</abbr>] <span class="author"><span class="firstname">P.V.</span> <span class="surname">Mockapetris</span>. </span><span class="title"><i>Domain Names &#8212; Concepts and Facilities</i>. </span><span class="pubdate">November 1987. </span></p>
</div>
<div class="biblioentry">
-<a name="id2600023"></a><p>[<abbr class="abbrev">RFC1035</abbr>] <span class="author"><span class="firstname">P. V.</span> <span class="surname">Mockapetris</span>. </span><span class="title"><i>Domain Names &#8212; Implementation and
+<a name="id2603564"></a><p>[<abbr class="abbrev">RFC1035</abbr>] <span class="author"><span class="firstname">P. V.</span> <span class="surname">Mockapetris</span>. </span><span class="title"><i>Domain Names &#8212; Implementation and
Specification</i>. </span><span class="pubdate">November 1987. </span></p>
</div>
</div>
@@ -268,42 +278,42 @@
<h3 class="title">
<a name="proposed_standards"></a>Proposed Standards</h3>
<div class="biblioentry">
-<a name="id2600059"></a><p>[<abbr class="abbrev">RFC2181</abbr>] <span class="author"><span class="firstname">R., R. Bush</span> <span class="surname">Elz</span>. </span><span class="title"><i>Clarifications to the <acronym class="acronym">DNS</acronym>
+<a name="id2603601"></a><p>[<abbr class="abbrev">RFC2181</abbr>] <span class="author"><span class="firstname">R., R. Bush</span> <span class="surname">Elz</span>. </span><span class="title"><i>Clarifications to the <acronym class="acronym">DNS</acronym>
Specification</i>. </span><span class="pubdate">July 1997. </span></p>
</div>
<div class="biblioentry">
-<a name="id2600086"></a><p>[<abbr class="abbrev">RFC2308</abbr>] <span class="author"><span class="firstname">M.</span> <span class="surname">Andrews</span>. </span><span class="title"><i>Negative Caching of <acronym class="acronym">DNS</acronym>
+<a name="id2603627"></a><p>[<abbr class="abbrev">RFC2308</abbr>] <span class="author"><span class="firstname">M.</span> <span class="surname">Andrews</span>. </span><span class="title"><i>Negative Caching of <acronym class="acronym">DNS</acronym>
Queries</i>. </span><span class="pubdate">March 1998. </span></p>
</div>
<div class="biblioentry">
-<a name="id2600112"></a><p>[<abbr class="abbrev">RFC1995</abbr>] <span class="author"><span class="firstname">M.</span> <span class="surname">Ohta</span>. </span><span class="title"><i>Incremental Zone Transfer in <acronym class="acronym">DNS</acronym></i>. </span><span class="pubdate">August 1996. </span></p>
+<a name="id2603653"></a><p>[<abbr class="abbrev">RFC1995</abbr>] <span class="author"><span class="firstname">M.</span> <span class="surname">Ohta</span>. </span><span class="title"><i>Incremental Zone Transfer in <acronym class="acronym">DNS</acronym></i>. </span><span class="pubdate">August 1996. </span></p>
</div>
<div class="biblioentry">
-<a name="id2600136"></a><p>[<abbr class="abbrev">RFC1996</abbr>] <span class="author"><span class="firstname">P.</span> <span class="surname">Vixie</span>. </span><span class="title"><i>A Mechanism for Prompt Notification of Zone Changes</i>. </span><span class="pubdate">August 1996. </span></p>
+<a name="id2603677"></a><p>[<abbr class="abbrev">RFC1996</abbr>] <span class="author"><span class="firstname">P.</span> <span class="surname">Vixie</span>. </span><span class="title"><i>A Mechanism for Prompt Notification of Zone Changes</i>. </span><span class="pubdate">August 1996. </span></p>
</div>
<div class="biblioentry">
-<a name="id2600160"></a><p>[<abbr class="abbrev">RFC2136</abbr>] <span class="authorgroup"><span class="firstname">P.</span> <span class="surname">Vixie</span>, <span class="firstname">S.</span> <span class="surname">Thomson</span>, <span class="firstname">Y.</span> <span class="surname">Rekhter</span>, and <span class="firstname">J.</span> <span class="surname">Bound</span>. </span><span class="title"><i>Dynamic Updates in the Domain Name System</i>. </span><span class="pubdate">April 1997. </span></p>
+<a name="id2603701"></a><p>[<abbr class="abbrev">RFC2136</abbr>] <span class="authorgroup"><span class="firstname">P.</span> <span class="surname">Vixie</span>, <span class="firstname">S.</span> <span class="surname">Thomson</span>, <span class="firstname">Y.</span> <span class="surname">Rekhter</span>, and <span class="firstname">J.</span> <span class="surname">Bound</span>. </span><span class="title"><i>Dynamic Updates in the Domain Name System</i>. </span><span class="pubdate">April 1997. </span></p>
</div>
<div class="biblioentry">
-<a name="id2600215"></a><p>[<abbr class="abbrev">RFC2671</abbr>] <span class="authorgroup"><span class="firstname">P.</span> <span class="surname">Vixie</span>. </span><span class="title"><i>Extension Mechanisms for DNS (EDNS0)</i>. </span><span class="pubdate">August 1997. </span></p>
+<a name="id2603756"></a><p>[<abbr class="abbrev">RFC2671</abbr>] <span class="authorgroup"><span class="firstname">P.</span> <span class="surname">Vixie</span>. </span><span class="title"><i>Extension Mechanisms for DNS (EDNS0)</i>. </span><span class="pubdate">August 1997. </span></p>
</div>
<div class="biblioentry">
-<a name="id2600242"></a><p>[<abbr class="abbrev">RFC2672</abbr>] <span class="authorgroup"><span class="firstname">M.</span> <span class="surname">Crawford</span>. </span><span class="title"><i>Non-Terminal DNS Name Redirection</i>. </span><span class="pubdate">August 1999. </span></p>
+<a name="id2603783"></a><p>[<abbr class="abbrev">RFC2672</abbr>] <span class="authorgroup"><span class="firstname">M.</span> <span class="surname">Crawford</span>. </span><span class="title"><i>Non-Terminal DNS Name Redirection</i>. </span><span class="pubdate">August 1999. </span></p>
</div>
<div class="biblioentry">
-<a name="id2600268"></a><p>[<abbr class="abbrev">RFC2845</abbr>] <span class="authorgroup"><span class="firstname">P.</span> <span class="surname">Vixie</span>, <span class="firstname">O.</span> <span class="surname">Gudmundsson</span>, <span class="firstname">D.</span> <span class="surname">Eastlake</span>, <span class="lineage">3rd</span>, and <span class="firstname">B.</span> <span class="surname">Wellington</span>. </span><span class="title"><i>Secret Key Transaction Authentication for <acronym class="acronym">DNS</acronym> (TSIG)</i>. </span><span class="pubdate">May 2000. </span></p>
+<a name="id2603810"></a><p>[<abbr class="abbrev">RFC2845</abbr>] <span class="authorgroup"><span class="firstname">P.</span> <span class="surname">Vixie</span>, <span class="firstname">O.</span> <span class="surname">Gudmundsson</span>, <span class="firstname">D.</span> <span class="surname">Eastlake</span>, <span class="lineage">3rd</span>, and <span class="firstname">B.</span> <span class="surname">Wellington</span>. </span><span class="title"><i>Secret Key Transaction Authentication for <acronym class="acronym">DNS</acronym> (TSIG)</i>. </span><span class="pubdate">May 2000. </span></p>
</div>
<div class="biblioentry">
-<a name="id2600330"></a><p>[<abbr class="abbrev">RFC2930</abbr>] <span class="authorgroup"><span class="firstname">D.</span> <span class="surname">Eastlake</span>, <span class="lineage">3rd</span>. </span><span class="title"><i>Secret Key Establishment for DNS (TKEY RR)</i>. </span><span class="pubdate">September 2000. </span></p>
+<a name="id2603872"></a><p>[<abbr class="abbrev">RFC2930</abbr>] <span class="authorgroup"><span class="firstname">D.</span> <span class="surname">Eastlake</span>, <span class="lineage">3rd</span>. </span><span class="title"><i>Secret Key Establishment for DNS (TKEY RR)</i>. </span><span class="pubdate">September 2000. </span></p>
</div>
<div class="biblioentry">
-<a name="id2600360"></a><p>[<abbr class="abbrev">RFC2931</abbr>] <span class="authorgroup"><span class="firstname">D.</span> <span class="surname">Eastlake</span>, <span class="lineage">3rd</span>. </span><span class="title"><i>DNS Request and Transaction Signatures (SIG(0)s)</i>. </span><span class="pubdate">September 2000. </span></p>
+<a name="id2603901"></a><p>[<abbr class="abbrev">RFC2931</abbr>] <span class="authorgroup"><span class="firstname">D.</span> <span class="surname">Eastlake</span>, <span class="lineage">3rd</span>. </span><span class="title"><i>DNS Request and Transaction Signatures (SIG(0)s)</i>. </span><span class="pubdate">September 2000. </span></p>
</div>
<div class="biblioentry">
-<a name="id2600390"></a><p>[<abbr class="abbrev">RFC3007</abbr>] <span class="authorgroup"><span class="firstname">B.</span> <span class="surname">Wellington</span>. </span><span class="title"><i>Secure Domain Name System (DNS) Dynamic Update</i>. </span><span class="pubdate">November 2000. </span></p>
+<a name="id2603931"></a><p>[<abbr class="abbrev">RFC3007</abbr>] <span class="authorgroup"><span class="firstname">B.</span> <span class="surname">Wellington</span>. </span><span class="title"><i>Secure Domain Name System (DNS) Dynamic Update</i>. </span><span class="pubdate">November 2000. </span></p>
</div>
<div class="biblioentry">
-<a name="id2600417"></a><p>[<abbr class="abbrev">RFC3645</abbr>] <span class="authorgroup"><span class="firstname">S.</span> <span class="surname">Kwan</span>, <span class="firstname">P.</span> <span class="surname">Garg</span>, <span class="firstname">J.</span> <span class="surname">Gilroy</span>, <span class="firstname">L.</span> <span class="surname">Esibov</span>, <span class="firstname">J.</span> <span class="surname">Westhead</span>, and <span class="firstname">R.</span> <span class="surname">Hall</span>. </span><span class="title"><i>Generic Security Service Algorithm for Secret
+<a name="id2603958"></a><p>[<abbr class="abbrev">RFC3645</abbr>] <span class="authorgroup"><span class="firstname">S.</span> <span class="surname">Kwan</span>, <span class="firstname">P.</span> <span class="surname">Garg</span>, <span class="firstname">J.</span> <span class="surname">Gilroy</span>, <span class="firstname">L.</span> <span class="surname">Esibov</span>, <span class="firstname">J.</span> <span class="surname">Westhead</span>, and <span class="firstname">R.</span> <span class="surname">Hall</span>. </span><span class="title"><i>Generic Security Service Algorithm for Secret
Key Transaction Authentication for DNS
(GSS-TSIG)</i>. </span><span class="pubdate">October 2003. </span></p>
</div>
@@ -312,19 +322,19 @@
<h3 class="title">
<acronym class="acronym">DNS</acronym> Security Proposed Standards</h3>
<div class="biblioentry">
-<a name="id2600499"></a><p>[<abbr class="abbrev">RFC3225</abbr>] <span class="authorgroup"><span class="firstname">D.</span> <span class="surname">Conrad</span>. </span><span class="title"><i>Indicating Resolver Support of DNSSEC</i>. </span><span class="pubdate">December 2001. </span></p>
+<a name="id2604040"></a><p>[<abbr class="abbrev">RFC3225</abbr>] <span class="authorgroup"><span class="firstname">D.</span> <span class="surname">Conrad</span>. </span><span class="title"><i>Indicating Resolver Support of DNSSEC</i>. </span><span class="pubdate">December 2001. </span></p>
</div>
<div class="biblioentry">
-<a name="id2600525"></a><p>[<abbr class="abbrev">RFC3833</abbr>] <span class="authorgroup"><span class="firstname">D.</span> <span class="surname">Atkins</span> and <span class="firstname">R.</span> <span class="surname">Austein</span>. </span><span class="title"><i>Threat Analysis of the Domain Name System (DNS)</i>. </span><span class="pubdate">August 2004. </span></p>
+<a name="id2604067"></a><p>[<abbr class="abbrev">RFC3833</abbr>] <span class="authorgroup"><span class="firstname">D.</span> <span class="surname">Atkins</span> and <span class="firstname">R.</span> <span class="surname">Austein</span>. </span><span class="title"><i>Threat Analysis of the Domain Name System (DNS)</i>. </span><span class="pubdate">August 2004. </span></p>
</div>
<div class="biblioentry">
-<a name="id2600562"></a><p>[<abbr class="abbrev">RFC4033</abbr>] <span class="authorgroup"><span class="firstname">R.</span> <span class="surname">Arends</span>, <span class="firstname">R.</span> <span class="surname">Austein</span>, <span class="firstname">M.</span> <span class="surname">Larson</span>, <span class="firstname">D.</span> <span class="surname">Massey</span>, and <span class="firstname">S.</span> <span class="surname">Rose</span>. </span><span class="title"><i>DNS Security Introduction and Requirements</i>. </span><span class="pubdate">March 2005. </span></p>
+<a name="id2604103"></a><p>[<abbr class="abbrev">RFC4033</abbr>] <span class="authorgroup"><span class="firstname">R.</span> <span class="surname">Arends</span>, <span class="firstname">R.</span> <span class="surname">Austein</span>, <span class="firstname">M.</span> <span class="surname">Larson</span>, <span class="firstname">D.</span> <span class="surname">Massey</span>, and <span class="firstname">S.</span> <span class="surname">Rose</span>. </span><span class="title"><i>DNS Security Introduction and Requirements</i>. </span><span class="pubdate">March 2005. </span></p>
</div>
<div class="biblioentry">
-<a name="id2600627"></a><p>[<abbr class="abbrev">RFC4034</abbr>] <span class="authorgroup"><span class="firstname">R.</span> <span class="surname">Arends</span>, <span class="firstname">R.</span> <span class="surname">Austein</span>, <span class="firstname">M.</span> <span class="surname">Larson</span>, <span class="firstname">D.</span> <span class="surname">Massey</span>, and <span class="firstname">S.</span> <span class="surname">Rose</span>. </span><span class="title"><i>Resource Records for the DNS Security Extensions</i>. </span><span class="pubdate">March 2005. </span></p>
+<a name="id2604168"></a><p>[<abbr class="abbrev">RFC4034</abbr>] <span class="authorgroup"><span class="firstname">R.</span> <span class="surname">Arends</span>, <span class="firstname">R.</span> <span class="surname">Austein</span>, <span class="firstname">M.</span> <span class="surname">Larson</span>, <span class="firstname">D.</span> <span class="surname">Massey</span>, and <span class="firstname">S.</span> <span class="surname">Rose</span>. </span><span class="title"><i>Resource Records for the DNS Security Extensions</i>. </span><span class="pubdate">March 2005. </span></p>
</div>
<div class="biblioentry">
-<a name="id2600692"></a><p>[<abbr class="abbrev">RFC4035</abbr>] <span class="authorgroup"><span class="firstname">R.</span> <span class="surname">Arends</span>, <span class="firstname">R.</span> <span class="surname">Austein</span>, <span class="firstname">M.</span> <span class="surname">Larson</span>, <span class="firstname">D.</span> <span class="surname">Massey</span>, and <span class="firstname">S.</span> <span class="surname">Rose</span>. </span><span class="title"><i>Protocol Modifications for the DNS
+<a name="id2604233"></a><p>[<abbr class="abbrev">RFC4035</abbr>] <span class="authorgroup"><span class="firstname">R.</span> <span class="surname">Arends</span>, <span class="firstname">R.</span> <span class="surname">Austein</span>, <span class="firstname">M.</span> <span class="surname">Larson</span>, <span class="firstname">D.</span> <span class="surname">Massey</span>, and <span class="firstname">S.</span> <span class="surname">Rose</span>. </span><span class="title"><i>Protocol Modifications for the DNS
Security Extensions</i>. </span><span class="pubdate">March 2005. </span></p>
</div>
</div>
@@ -332,146 +342,146 @@
<h3 class="title">Other Important RFCs About <acronym class="acronym">DNS</acronym>
Implementation</h3>
<div class="biblioentry">
-<a name="id2600765"></a><p>[<abbr class="abbrev">RFC1535</abbr>] <span class="author"><span class="firstname">E.</span> <span class="surname">Gavron</span>. </span><span class="title"><i>A Security Problem and Proposed Correction With Widely
+<a name="id2604375"></a><p>[<abbr class="abbrev">RFC1535</abbr>] <span class="author"><span class="firstname">E.</span> <span class="surname">Gavron</span>. </span><span class="title"><i>A Security Problem and Proposed Correction With Widely
Deployed <acronym class="acronym">DNS</acronym> Software.</i>. </span><span class="pubdate">October 1993. </span></p>
</div>
<div class="biblioentry">
-<a name="id2600791"></a><p>[<abbr class="abbrev">RFC1536</abbr>] <span class="authorgroup"><span class="firstname">A.</span> <span class="surname">Kumar</span>, <span class="firstname">J.</span> <span class="surname">Postel</span>, <span class="firstname">C.</span> <span class="surname">Neuman</span>, <span class="firstname">P.</span> <span class="surname">Danzig</span>, and <span class="firstname">S.</span> <span class="surname">Miller</span>. </span><span class="title"><i>Common <acronym class="acronym">DNS</acronym> Implementation
+<a name="id2604401"></a><p>[<abbr class="abbrev">RFC1536</abbr>] <span class="authorgroup"><span class="firstname">A.</span> <span class="surname">Kumar</span>, <span class="firstname">J.</span> <span class="surname">Postel</span>, <span class="firstname">C.</span> <span class="surname">Neuman</span>, <span class="firstname">P.</span> <span class="surname">Danzig</span>, and <span class="firstname">S.</span> <span class="surname">Miller</span>. </span><span class="title"><i>Common <acronym class="acronym">DNS</acronym> Implementation
Errors and Suggested Fixes</i>. </span><span class="pubdate">October 1993. </span></p>
</div>
<div class="biblioentry">
-<a name="id2600859"></a><p>[<abbr class="abbrev">RFC1982</abbr>] <span class="authorgroup"><span class="firstname">R.</span> <span class="surname">Elz</span> and <span class="firstname">R.</span> <span class="surname">Bush</span>. </span><span class="title"><i>Serial Number Arithmetic</i>. </span><span class="pubdate">August 1996. </span></p>
+<a name="id2604469"></a><p>[<abbr class="abbrev">RFC1982</abbr>] <span class="authorgroup"><span class="firstname">R.</span> <span class="surname">Elz</span> and <span class="firstname">R.</span> <span class="surname">Bush</span>. </span><span class="title"><i>Serial Number Arithmetic</i>. </span><span class="pubdate">August 1996. </span></p>
</div>
<div class="biblioentry">
-<a name="id2600894"></a><p>[<abbr class="abbrev">RFC4074</abbr>] <span class="authorgroup"><span class="firstname">Y.</span> <span class="surname">Morishita</span> and <span class="firstname">T.</span> <span class="surname">Jinmei</span>. </span><span class="title"><i>Common Misbehaviour Against <acronym class="acronym">DNS</acronym>
+<a name="id2604504"></a><p>[<abbr class="abbrev">RFC4074</abbr>] <span class="authorgroup"><span class="firstname">Y.</span> <span class="surname">Morishita</span> and <span class="firstname">T.</span> <span class="surname">Jinmei</span>. </span><span class="title"><i>Common Misbehaviour Against <acronym class="acronym">DNS</acronym>
Queries for IPv6 Addresses</i>. </span><span class="pubdate">May 2005. </span></p>
</div>
</div>
<div class="bibliodiv">
<h3 class="title">Resource Record Types</h3>
<div class="biblioentry">
-<a name="id2600940"></a><p>[<abbr class="abbrev">RFC1183</abbr>] <span class="authorgroup"><span class="firstname">C.F.</span> <span class="surname">Everhart</span>, <span class="firstname">L. A.</span> <span class="surname">Mamakos</span>, <span class="firstname">R.</span> <span class="surname">Ullmann</span>, and <span class="firstname">P.</span> <span class="surname">Mockapetris</span>. </span><span class="title"><i>New <acronym class="acronym">DNS</acronym> RR Definitions</i>. </span><span class="pubdate">October 1990. </span></p>
+<a name="id2604550"></a><p>[<abbr class="abbrev">RFC1183</abbr>] <span class="authorgroup"><span class="firstname">C.F.</span> <span class="surname">Everhart</span>, <span class="firstname">L. A.</span> <span class="surname">Mamakos</span>, <span class="firstname">R.</span> <span class="surname">Ullmann</span>, and <span class="firstname">P.</span> <span class="surname">Mockapetris</span>. </span><span class="title"><i>New <acronym class="acronym">DNS</acronym> RR Definitions</i>. </span><span class="pubdate">October 1990. </span></p>
</div>
<div class="biblioentry">
-<a name="id2600998"></a><p>[<abbr class="abbrev">RFC1706</abbr>] <span class="authorgroup"><span class="firstname">B.</span> <span class="surname">Manning</span> and <span class="firstname">R.</span> <span class="surname">Colella</span>. </span><span class="title"><i><acronym class="acronym">DNS</acronym> NSAP Resource Records</i>. </span><span class="pubdate">October 1994. </span></p>
+<a name="id2604608"></a><p>[<abbr class="abbrev">RFC1706</abbr>] <span class="authorgroup"><span class="firstname">B.</span> <span class="surname">Manning</span> and <span class="firstname">R.</span> <span class="surname">Colella</span>. </span><span class="title"><i><acronym class="acronym">DNS</acronym> NSAP Resource Records</i>. </span><span class="pubdate">October 1994. </span></p>
</div>
<div class="biblioentry">
-<a name="id2601035"></a><p>[<abbr class="abbrev">RFC2168</abbr>] <span class="authorgroup"><span class="firstname">R.</span> <span class="surname">Daniel</span> and <span class="firstname">M.</span> <span class="surname">Mealling</span>. </span><span class="title"><i>Resolution of Uniform Resource Identifiers using
+<a name="id2604645"></a><p>[<abbr class="abbrev">RFC2168</abbr>] <span class="authorgroup"><span class="firstname">R.</span> <span class="surname">Daniel</span> and <span class="firstname">M.</span> <span class="surname">Mealling</span>. </span><span class="title"><i>Resolution of Uniform Resource Identifiers using
the Domain Name System</i>. </span><span class="pubdate">June 1997. </span></p>
</div>
<div class="biblioentry">
-<a name="id2601070"></a><p>[<abbr class="abbrev">RFC1876</abbr>] <span class="authorgroup"><span class="firstname">C.</span> <span class="surname">Davis</span>, <span class="firstname">P.</span> <span class="surname">Vixie</span>, <span class="firstname">T.</span>, and <span class="firstname">I.</span> <span class="surname">Dickinson</span>. </span><span class="title"><i>A Means for Expressing Location Information in the
+<a name="id2604680"></a><p>[<abbr class="abbrev">RFC1876</abbr>] <span class="authorgroup"><span class="firstname">C.</span> <span class="surname">Davis</span>, <span class="firstname">P.</span> <span class="surname">Vixie</span>, <span class="firstname">T.</span>, and <span class="firstname">I.</span> <span class="surname">Dickinson</span>. </span><span class="title"><i>A Means for Expressing Location Information in the
Domain
Name System</i>. </span><span class="pubdate">January 1996. </span></p>
</div>
<div class="biblioentry">
-<a name="id2601125"></a><p>[<abbr class="abbrev">RFC2052</abbr>] <span class="authorgroup"><span class="firstname">A.</span> <span class="surname">Gulbrandsen</span> and <span class="firstname">P.</span> <span class="surname">Vixie</span>. </span><span class="title"><i>A <acronym class="acronym">DNS</acronym> RR for Specifying the
+<a name="id2604734"></a><p>[<abbr class="abbrev">RFC2052</abbr>] <span class="authorgroup"><span class="firstname">A.</span> <span class="surname">Gulbrandsen</span> and <span class="firstname">P.</span> <span class="surname">Vixie</span>. </span><span class="title"><i>A <acronym class="acronym">DNS</acronym> RR for Specifying the
Location of
Services.</i>. </span><span class="pubdate">October 1996. </span></p>
</div>
<div class="biblioentry">
-<a name="id2601163"></a><p>[<abbr class="abbrev">RFC2163</abbr>] <span class="author"><span class="firstname">A.</span> <span class="surname">Allocchio</span>. </span><span class="title"><i>Using the Internet <acronym class="acronym">DNS</acronym> to
+<a name="id2604773"></a><p>[<abbr class="abbrev">RFC2163</abbr>] <span class="author"><span class="firstname">A.</span> <span class="surname">Allocchio</span>. </span><span class="title"><i>Using the Internet <acronym class="acronym">DNS</acronym> to
Distribute MIXER
Conformant Global Address Mapping</i>. </span><span class="pubdate">January 1998. </span></p>
</div>
<div class="biblioentry">
-<a name="id2601189"></a><p>[<abbr class="abbrev">RFC2230</abbr>] <span class="author"><span class="firstname">R.</span> <span class="surname">Atkinson</span>. </span><span class="title"><i>Key Exchange Delegation Record for the <acronym class="acronym">DNS</acronym></i>. </span><span class="pubdate">October 1997. </span></p>
+<a name="id2604798"></a><p>[<abbr class="abbrev">RFC2230</abbr>] <span class="author"><span class="firstname">R.</span> <span class="surname">Atkinson</span>. </span><span class="title"><i>Key Exchange Delegation Record for the <acronym class="acronym">DNS</acronym></i>. </span><span class="pubdate">October 1997. </span></p>
</div>
<div class="biblioentry">
-<a name="id2601214"></a><p>[<abbr class="abbrev">RFC2536</abbr>] <span class="author"><span class="firstname">D.</span> <span class="surname">Eastlake</span>, <span class="lineage">3rd</span>. </span><span class="title"><i>DSA KEYs and SIGs in the Domain Name System (DNS)</i>. </span><span class="pubdate">March 1999. </span></p>
+<a name="id2604824"></a><p>[<abbr class="abbrev">RFC2536</abbr>] <span class="author"><span class="firstname">D.</span> <span class="surname">Eastlake</span>, <span class="lineage">3rd</span>. </span><span class="title"><i>DSA KEYs and SIGs in the Domain Name System (DNS)</i>. </span><span class="pubdate">March 1999. </span></p>
</div>
<div class="biblioentry">
-<a name="id2601241"></a><p>[<abbr class="abbrev">RFC2537</abbr>] <span class="author"><span class="firstname">D.</span> <span class="surname">Eastlake</span>, <span class="lineage">3rd</span>. </span><span class="title"><i>RSA/MD5 KEYs and SIGs in the Domain Name System (DNS)</i>. </span><span class="pubdate">March 1999. </span></p>
+<a name="id2604851"></a><p>[<abbr class="abbrev">RFC2537</abbr>] <span class="author"><span class="firstname">D.</span> <span class="surname">Eastlake</span>, <span class="lineage">3rd</span>. </span><span class="title"><i>RSA/MD5 KEYs and SIGs in the Domain Name System (DNS)</i>. </span><span class="pubdate">March 1999. </span></p>
</div>
<div class="biblioentry">
-<a name="id2601268"></a><p>[<abbr class="abbrev">RFC2538</abbr>] <span class="authorgroup"><span class="firstname">D.</span> <span class="surname">Eastlake</span>, <span class="lineage">3rd</span> and <span class="firstname">O.</span> <span class="surname">Gudmundsson</span>. </span><span class="title"><i>Storing Certificates in the Domain Name System (DNS)</i>. </span><span class="pubdate">March 1999. </span></p>
+<a name="id2604877"></a><p>[<abbr class="abbrev">RFC2538</abbr>] <span class="authorgroup"><span class="firstname">D.</span> <span class="surname">Eastlake</span>, <span class="lineage">3rd</span> and <span class="firstname">O.</span> <span class="surname">Gudmundsson</span>. </span><span class="title"><i>Storing Certificates in the Domain Name System (DNS)</i>. </span><span class="pubdate">March 1999. </span></p>
</div>
<div class="biblioentry">
-<a name="id2601307"></a><p>[<abbr class="abbrev">RFC2539</abbr>] <span class="authorgroup"><span class="firstname">D.</span> <span class="surname">Eastlake</span>, <span class="lineage">3rd</span>. </span><span class="title"><i>Storage of Diffie-Hellman Keys in the Domain Name System (DNS)</i>. </span><span class="pubdate">March 1999. </span></p>
+<a name="id2604917"></a><p>[<abbr class="abbrev">RFC2539</abbr>] <span class="authorgroup"><span class="firstname">D.</span> <span class="surname">Eastlake</span>, <span class="lineage">3rd</span>. </span><span class="title"><i>Storage of Diffie-Hellman Keys in the Domain Name System (DNS)</i>. </span><span class="pubdate">March 1999. </span></p>
</div>
<div class="biblioentry">
-<a name="id2601337"></a><p>[<abbr class="abbrev">RFC2540</abbr>] <span class="authorgroup"><span class="firstname">D.</span> <span class="surname">Eastlake</span>, <span class="lineage">3rd</span>. </span><span class="title"><i>Detached Domain Name System (DNS) Information</i>. </span><span class="pubdate">March 1999. </span></p>
+<a name="id2604947"></a><p>[<abbr class="abbrev">RFC2540</abbr>] <span class="authorgroup"><span class="firstname">D.</span> <span class="surname">Eastlake</span>, <span class="lineage">3rd</span>. </span><span class="title"><i>Detached Domain Name System (DNS) Information</i>. </span><span class="pubdate">March 1999. </span></p>
</div>
<div class="biblioentry">
-<a name="id2601367"></a><p>[<abbr class="abbrev">RFC2782</abbr>] <span class="author"><span class="firstname">A.</span> <span class="surname">Gulbrandsen</span>. </span><span class="author"><span class="firstname">P.</span> <span class="surname">Vixie</span>. </span><span class="author"><span class="firstname">L.</span> <span class="surname">Esibov</span>. </span><span class="title"><i>A DNS RR for specifying the location of services (DNS SRV)</i>. </span><span class="pubdate">February 2000. </span></p>
+<a name="id2604977"></a><p>[<abbr class="abbrev">RFC2782</abbr>] <span class="author"><span class="firstname">A.</span> <span class="surname">Gulbrandsen</span>. </span><span class="author"><span class="firstname">P.</span> <span class="surname">Vixie</span>. </span><span class="author"><span class="firstname">L.</span> <span class="surname">Esibov</span>. </span><span class="title"><i>A DNS RR for specifying the location of services (DNS SRV)</i>. </span><span class="pubdate">February 2000. </span></p>
</div>
<div class="biblioentry">
-<a name="id2601410"></a><p>[<abbr class="abbrev">RFC2915</abbr>] <span class="author"><span class="firstname">M.</span> <span class="surname">Mealling</span>. </span><span class="author"><span class="firstname">R.</span> <span class="surname">Daniel</span>. </span><span class="title"><i>The Naming Authority Pointer (NAPTR) DNS Resource Record</i>. </span><span class="pubdate">September 2000. </span></p>
+<a name="id2605019"></a><p>[<abbr class="abbrev">RFC2915</abbr>] <span class="author"><span class="firstname">M.</span> <span class="surname">Mealling</span>. </span><span class="author"><span class="firstname">R.</span> <span class="surname">Daniel</span>. </span><span class="title"><i>The Naming Authority Pointer (NAPTR) DNS Resource Record</i>. </span><span class="pubdate">September 2000. </span></p>
</div>
<div class="biblioentry">
-<a name="id2601443"></a><p>[<abbr class="abbrev">RFC3110</abbr>] <span class="author"><span class="firstname">D.</span> <span class="surname">Eastlake</span>, <span class="lineage">3rd</span>. </span><span class="title"><i>RSA/SHA-1 SIGs and RSA KEYs in the Domain Name System (DNS)</i>. </span><span class="pubdate">May 2001. </span></p>
+<a name="id2605052"></a><p>[<abbr class="abbrev">RFC3110</abbr>] <span class="author"><span class="firstname">D.</span> <span class="surname">Eastlake</span>, <span class="lineage">3rd</span>. </span><span class="title"><i>RSA/SHA-1 SIGs and RSA KEYs in the Domain Name System (DNS)</i>. </span><span class="pubdate">May 2001. </span></p>
</div>
<div class="biblioentry">
-<a name="id2601469"></a><p>[<abbr class="abbrev">RFC3123</abbr>] <span class="author"><span class="firstname">P.</span> <span class="surname">Koch</span>. </span><span class="title"><i>A DNS RR Type for Lists of Address Prefixes (APL RR)</i>. </span><span class="pubdate">June 2001. </span></p>
+<a name="id2605079"></a><p>[<abbr class="abbrev">RFC3123</abbr>] <span class="author"><span class="firstname">P.</span> <span class="surname">Koch</span>. </span><span class="title"><i>A DNS RR Type for Lists of Address Prefixes (APL RR)</i>. </span><span class="pubdate">June 2001. </span></p>
</div>
<div class="biblioentry">
-<a name="id2601493"></a><p>[<abbr class="abbrev">RFC3596</abbr>] <span class="authorgroup"><span class="firstname">S.</span> <span class="surname">Thomson</span>, <span class="firstname">C.</span> <span class="surname">Huitema</span>, <span class="firstname">V.</span> <span class="surname">Ksinant</span>, and <span class="firstname">M.</span> <span class="surname">Souissi</span>. </span><span class="title"><i><acronym class="acronym">DNS</acronym> Extensions to support IP
+<a name="id2605102"></a><p>[<abbr class="abbrev">RFC3596</abbr>] <span class="authorgroup"><span class="firstname">S.</span> <span class="surname">Thomson</span>, <span class="firstname">C.</span> <span class="surname">Huitema</span>, <span class="firstname">V.</span> <span class="surname">Ksinant</span>, and <span class="firstname">M.</span> <span class="surname">Souissi</span>. </span><span class="title"><i><acronym class="acronym">DNS</acronym> Extensions to support IP
version 6</i>. </span><span class="pubdate">October 2003. </span></p>
</div>
<div class="biblioentry">
-<a name="id2601619"></a><p>[<abbr class="abbrev">RFC3597</abbr>] <span class="author"><span class="firstname">A.</span> <span class="surname">Gustafsson</span>. </span><span class="title"><i>Handling of Unknown DNS Resource Record (RR) Types</i>. </span><span class="pubdate">September 2003. </span></p>
+<a name="id2605160"></a><p>[<abbr class="abbrev">RFC3597</abbr>] <span class="author"><span class="firstname">A.</span> <span class="surname">Gustafsson</span>. </span><span class="title"><i>Handling of Unknown DNS Resource Record (RR) Types</i>. </span><span class="pubdate">September 2003. </span></p>
</div>
</div>
<div class="bibliodiv">
<h3 class="title">
<acronym class="acronym">DNS</acronym> and the Internet</h3>
<div class="biblioentry">
-<a name="id2601651"></a><p>[<abbr class="abbrev">RFC1101</abbr>] <span class="author"><span class="firstname">P. V.</span> <span class="surname">Mockapetris</span>. </span><span class="title"><i><acronym class="acronym">DNS</acronym> Encoding of Network Names
+<a name="id2605192"></a><p>[<abbr class="abbrev">RFC1101</abbr>] <span class="author"><span class="firstname">P. V.</span> <span class="surname">Mockapetris</span>. </span><span class="title"><i><acronym class="acronym">DNS</acronym> Encoding of Network Names
and Other Types</i>. </span><span class="pubdate">April 1989. </span></p>
</div>
<div class="biblioentry">
-<a name="id2601676"></a><p>[<abbr class="abbrev">RFC1123</abbr>] <span class="author"><span class="surname">Braden</span>. </span><span class="title"><i>Requirements for Internet Hosts - Application and
+<a name="id2605218"></a><p>[<abbr class="abbrev">RFC1123</abbr>] <span class="author"><span class="surname">Braden</span>. </span><span class="title"><i>Requirements for Internet Hosts - Application and
Support</i>. </span><span class="pubdate">October 1989. </span></p>
</div>
<div class="biblioentry">
-<a name="id2601699"></a><p>[<abbr class="abbrev">RFC1591</abbr>] <span class="author"><span class="firstname">J.</span> <span class="surname">Postel</span>. </span><span class="title"><i>Domain Name System Structure and Delegation</i>. </span><span class="pubdate">March 1994. </span></p>
+<a name="id2605240"></a><p>[<abbr class="abbrev">RFC1591</abbr>] <span class="author"><span class="firstname">J.</span> <span class="surname">Postel</span>. </span><span class="title"><i>Domain Name System Structure and Delegation</i>. </span><span class="pubdate">March 1994. </span></p>
</div>
<div class="biblioentry">
-<a name="id2601790"></a><p>[<abbr class="abbrev">RFC2317</abbr>] <span class="authorgroup"><span class="firstname">H.</span> <span class="surname">Eidnes</span>, <span class="firstname">G.</span> <span class="surname">de Groot</span>, and <span class="firstname">P.</span> <span class="surname">Vixie</span>. </span><span class="title"><i>Classless IN-ADDR.ARPA Delegation</i>. </span><span class="pubdate">March 1998. </span></p>
+<a name="id2605264"></a><p>[<abbr class="abbrev">RFC2317</abbr>] <span class="authorgroup"><span class="firstname">H.</span> <span class="surname">Eidnes</span>, <span class="firstname">G.</span> <span class="surname">de Groot</span>, and <span class="firstname">P.</span> <span class="surname">Vixie</span>. </span><span class="title"><i>Classless IN-ADDR.ARPA Delegation</i>. </span><span class="pubdate">March 1998. </span></p>
</div>
<div class="biblioentry">
-<a name="id2601836"></a><p>[<abbr class="abbrev">RFC2826</abbr>] <span class="authorgroup"><span class="surname">Internet Architecture Board</span>. </span><span class="title"><i>IAB Technical Comment on the Unique DNS Root</i>. </span><span class="pubdate">May 2000. </span></p>
+<a name="id2605309"></a><p>[<abbr class="abbrev">RFC2826</abbr>] <span class="authorgroup"><span class="surname">Internet Architecture Board</span>. </span><span class="title"><i>IAB Technical Comment on the Unique DNS Root</i>. </span><span class="pubdate">May 2000. </span></p>
</div>
<div class="biblioentry">
-<a name="id2601860"></a><p>[<abbr class="abbrev">RFC2929</abbr>] <span class="authorgroup"><span class="firstname">D.</span> <span class="surname">Eastlake</span>, <span class="lineage">3rd</span>, <span class="firstname">E.</span> <span class="surname">Brunner-Williams</span>, and <span class="firstname">B.</span> <span class="surname">Manning</span>. </span><span class="title"><i>Domain Name System (DNS) IANA Considerations</i>. </span><span class="pubdate">September 2000. </span></p>
+<a name="id2605333"></a><p>[<abbr class="abbrev">RFC2929</abbr>] <span class="authorgroup"><span class="firstname">D.</span> <span class="surname">Eastlake</span>, <span class="lineage">3rd</span>, <span class="firstname">E.</span> <span class="surname">Brunner-Williams</span>, and <span class="firstname">B.</span> <span class="surname">Manning</span>. </span><span class="title"><i>Domain Name System (DNS) IANA Considerations</i>. </span><span class="pubdate">September 2000. </span></p>
</div>
</div>
<div class="bibliodiv">
<h3 class="title">
<acronym class="acronym">DNS</acronym> Operations</h3>
<div class="biblioentry">
-<a name="id2601917"></a><p>[<abbr class="abbrev">RFC1033</abbr>] <span class="author"><span class="firstname">M.</span> <span class="surname">Lottor</span>. </span><span class="title"><i>Domain administrators operations guide.</i>. </span><span class="pubdate">November 1987. </span></p>
+<a name="id2605390"></a><p>[<abbr class="abbrev">RFC1033</abbr>] <span class="author"><span class="firstname">M.</span> <span class="surname">Lottor</span>. </span><span class="title"><i>Domain administrators operations guide.</i>. </span><span class="pubdate">November 1987. </span></p>
</div>
<div class="biblioentry">
-<a name="id2601941"></a><p>[<abbr class="abbrev">RFC1537</abbr>] <span class="author"><span class="firstname">P.</span> <span class="surname">Beertema</span>. </span><span class="title"><i>Common <acronym class="acronym">DNS</acronym> Data File
+<a name="id2605414"></a><p>[<abbr class="abbrev">RFC1537</abbr>] <span class="author"><span class="firstname">P.</span> <span class="surname">Beertema</span>. </span><span class="title"><i>Common <acronym class="acronym">DNS</acronym> Data File
Configuration Errors</i>. </span><span class="pubdate">October 1993. </span></p>
</div>
<div class="biblioentry">
-<a name="id2601968"></a><p>[<abbr class="abbrev">RFC1912</abbr>] <span class="author"><span class="firstname">D.</span> <span class="surname">Barr</span>. </span><span class="title"><i>Common <acronym class="acronym">DNS</acronym> Operational and
+<a name="id2605441"></a><p>[<abbr class="abbrev">RFC1912</abbr>] <span class="author"><span class="firstname">D.</span> <span class="surname">Barr</span>. </span><span class="title"><i>Common <acronym class="acronym">DNS</acronym> Operational and
Configuration Errors</i>. </span><span class="pubdate">February 1996. </span></p>
</div>
<div class="biblioentry">
-<a name="id2601994"></a><p>[<abbr class="abbrev">RFC2010</abbr>] <span class="authorgroup"><span class="firstname">B.</span> <span class="surname">Manning</span> and <span class="firstname">P.</span> <span class="surname">Vixie</span>. </span><span class="title"><i>Operational Criteria for Root Name Servers.</i>. </span><span class="pubdate">October 1996. </span></p>
+<a name="id2605467"></a><p>[<abbr class="abbrev">RFC2010</abbr>] <span class="authorgroup"><span class="firstname">B.</span> <span class="surname">Manning</span> and <span class="firstname">P.</span> <span class="surname">Vixie</span>. </span><span class="title"><i>Operational Criteria for Root Name Servers.</i>. </span><span class="pubdate">October 1996. </span></p>
</div>
<div class="biblioentry">
-<a name="id2602030"></a><p>[<abbr class="abbrev">RFC2219</abbr>] <span class="authorgroup"><span class="firstname">M.</span> <span class="surname">Hamilton</span> and <span class="firstname">R.</span> <span class="surname">Wright</span>. </span><span class="title"><i>Use of <acronym class="acronym">DNS</acronym> Aliases for
+<a name="id2605504"></a><p>[<abbr class="abbrev">RFC2219</abbr>] <span class="authorgroup"><span class="firstname">M.</span> <span class="surname">Hamilton</span> and <span class="firstname">R.</span> <span class="surname">Wright</span>. </span><span class="title"><i>Use of <acronym class="acronym">DNS</acronym> Aliases for
Network Services.</i>. </span><span class="pubdate">October 1997. </span></p>
</div>
</div>
<div class="bibliodiv">
<h3 class="title">Internationalized Domain Names</h3>
<div class="biblioentry">
-<a name="id2602076"></a><p>[<abbr class="abbrev">RFC2825</abbr>] <span class="authorgroup"><span class="surname">IAB</span> and <span class="firstname">R.</span> <span class="surname">Daigle</span>. </span><span class="title"><i>A Tangled Web: Issues of I18N, Domain Names,
+<a name="id2605549"></a><p>[<abbr class="abbrev">RFC2825</abbr>] <span class="authorgroup"><span class="surname">IAB</span> and <span class="firstname">R.</span> <span class="surname">Daigle</span>. </span><span class="title"><i>A Tangled Web: Issues of I18N, Domain Names,
and the Other Internet protocols</i>. </span><span class="pubdate">May 2000. </span></p>
</div>
<div class="biblioentry">
-<a name="id2602108"></a><p>[<abbr class="abbrev">RFC3490</abbr>] <span class="authorgroup"><span class="firstname">P.</span> <span class="surname">Faltstrom</span>, <span class="firstname">P.</span> <span class="surname">Hoffman</span>, and <span class="firstname">A.</span> <span class="surname">Costello</span>. </span><span class="title"><i>Internationalizing Domain Names in Applications (IDNA)</i>. </span><span class="pubdate">March 2003. </span></p>
+<a name="id2605581"></a><p>[<abbr class="abbrev">RFC3490</abbr>] <span class="authorgroup"><span class="firstname">P.</span> <span class="surname">Faltstrom</span>, <span class="firstname">P.</span> <span class="surname">Hoffman</span>, and <span class="firstname">A.</span> <span class="surname">Costello</span>. </span><span class="title"><i>Internationalizing Domain Names in Applications (IDNA)</i>. </span><span class="pubdate">March 2003. </span></p>
</div>
<div class="biblioentry">
-<a name="id2602154"></a><p>[<abbr class="abbrev">RFC3491</abbr>] <span class="authorgroup"><span class="firstname">P.</span> <span class="surname">Hoffman</span> and <span class="firstname">M.</span> <span class="surname">Blanchet</span>. </span><span class="title"><i>Nameprep: A Stringprep Profile for Internationalized Domain Names</i>. </span><span class="pubdate">March 2003. </span></p>
+<a name="id2605627"></a><p>[<abbr class="abbrev">RFC3491</abbr>] <span class="authorgroup"><span class="firstname">P.</span> <span class="surname">Hoffman</span> and <span class="firstname">M.</span> <span class="surname">Blanchet</span>. </span><span class="title"><i>Nameprep: A Stringprep Profile for Internationalized Domain Names</i>. </span><span class="pubdate">March 2003. </span></p>
</div>
<div class="biblioentry">
-<a name="id2602189"></a><p>[<abbr class="abbrev">RFC3492</abbr>] <span class="authorgroup"><span class="firstname">A.</span> <span class="surname">Costello</span>. </span><span class="title"><i>Punycode: A Bootstring encoding of Unicode
+<a name="id2605662"></a><p>[<abbr class="abbrev">RFC3492</abbr>] <span class="authorgroup"><span class="firstname">A.</span> <span class="surname">Costello</span>. </span><span class="title"><i>Punycode: A Bootstring encoding of Unicode
for Internationalized Domain Names in
Applications (IDNA)</i>. </span><span class="pubdate">March 2003. </span></p>
</div>
@@ -487,47 +497,47 @@
</p>
</div>
<div class="biblioentry">
-<a name="id2602234"></a><p>[<abbr class="abbrev">RFC1464</abbr>] <span class="author"><span class="firstname">R.</span> <span class="surname">Rosenbaum</span>. </span><span class="title"><i>Using the Domain Name System To Store Arbitrary String
+<a name="id2605707"></a><p>[<abbr class="abbrev">RFC1464</abbr>] <span class="author"><span class="firstname">R.</span> <span class="surname">Rosenbaum</span>. </span><span class="title"><i>Using the Domain Name System To Store Arbitrary String
Attributes</i>. </span><span class="pubdate">May 1993. </span></p>
</div>
<div class="biblioentry">
-<a name="id2602257"></a><p>[<abbr class="abbrev">RFC1713</abbr>] <span class="author"><span class="firstname">A.</span> <span class="surname">Romao</span>. </span><span class="title"><i>Tools for <acronym class="acronym">DNS</acronym> Debugging</i>. </span><span class="pubdate">November 1994. </span></p>
+<a name="id2605730"></a><p>[<abbr class="abbrev">RFC1713</abbr>] <span class="author"><span class="firstname">A.</span> <span class="surname">Romao</span>. </span><span class="title"><i>Tools for <acronym class="acronym">DNS</acronym> Debugging</i>. </span><span class="pubdate">November 1994. </span></p>
</div>
<div class="biblioentry">
-<a name="id2602282"></a><p>[<abbr class="abbrev">RFC1794</abbr>] <span class="author"><span class="firstname">T.</span> <span class="surname">Brisco</span>. </span><span class="title"><i><acronym class="acronym">DNS</acronym> Support for Load
+<a name="id2605755"></a><p>[<abbr class="abbrev">RFC1794</abbr>] <span class="author"><span class="firstname">T.</span> <span class="surname">Brisco</span>. </span><span class="title"><i><acronym class="acronym">DNS</acronym> Support for Load
Balancing</i>. </span><span class="pubdate">April 1995. </span></p>
</div>
<div class="biblioentry">
-<a name="id2602308"></a><p>[<abbr class="abbrev">RFC2240</abbr>] <span class="author"><span class="firstname">O.</span> <span class="surname">Vaughan</span>. </span><span class="title"><i>A Legal Basis for Domain Name Allocation</i>. </span><span class="pubdate">November 1997. </span></p>
+<a name="id2605781"></a><p>[<abbr class="abbrev">RFC2240</abbr>] <span class="author"><span class="firstname">O.</span> <span class="surname">Vaughan</span>. </span><span class="title"><i>A Legal Basis for Domain Name Allocation</i>. </span><span class="pubdate">November 1997. </span></p>
</div>
<div class="biblioentry">
-<a name="id2602331"></a><p>[<abbr class="abbrev">RFC2345</abbr>] <span class="authorgroup"><span class="firstname">J.</span> <span class="surname">Klensin</span>, <span class="firstname">T.</span> <span class="surname">Wolf</span>, and <span class="firstname">G.</span> <span class="surname">Oglesby</span>. </span><span class="title"><i>Domain Names and Company Name Retrieval</i>. </span><span class="pubdate">May 1998. </span></p>
+<a name="id2605804"></a><p>[<abbr class="abbrev">RFC2345</abbr>] <span class="authorgroup"><span class="firstname">J.</span> <span class="surname">Klensin</span>, <span class="firstname">T.</span> <span class="surname">Wolf</span>, and <span class="firstname">G.</span> <span class="surname">Oglesby</span>. </span><span class="title"><i>Domain Names and Company Name Retrieval</i>. </span><span class="pubdate">May 1998. </span></p>
</div>
<div class="biblioentry">
-<a name="id2602377"></a><p>[<abbr class="abbrev">RFC2352</abbr>] <span class="author"><span class="firstname">O.</span> <span class="surname">Vaughan</span>. </span><span class="title"><i>A Convention For Using Legal Names as Domain Names</i>. </span><span class="pubdate">May 1998. </span></p>
+<a name="id2605850"></a><p>[<abbr class="abbrev">RFC2352</abbr>] <span class="author"><span class="firstname">O.</span> <span class="surname">Vaughan</span>. </span><span class="title"><i>A Convention For Using Legal Names as Domain Names</i>. </span><span class="pubdate">May 1998. </span></p>
</div>
<div class="biblioentry">
-<a name="id2602401"></a><p>[<abbr class="abbrev">RFC3071</abbr>] <span class="authorgroup"><span class="firstname">J.</span> <span class="surname">Klensin</span>. </span><span class="title"><i>Reflections on the DNS, RFC 1591, and Categories of Domains</i>. </span><span class="pubdate">February 2001. </span></p>
+<a name="id2605874"></a><p>[<abbr class="abbrev">RFC3071</abbr>] <span class="authorgroup"><span class="firstname">J.</span> <span class="surname">Klensin</span>. </span><span class="title"><i>Reflections on the DNS, RFC 1591, and Categories of Domains</i>. </span><span class="pubdate">February 2001. </span></p>
</div>
<div class="biblioentry">
-<a name="id2602427"></a><p>[<abbr class="abbrev">RFC3258</abbr>] <span class="authorgroup"><span class="firstname">T.</span> <span class="surname">Hardie</span>. </span><span class="title"><i>Distributing Authoritative Name Servers via
+<a name="id2605900"></a><p>[<abbr class="abbrev">RFC3258</abbr>] <span class="authorgroup"><span class="firstname">T.</span> <span class="surname">Hardie</span>. </span><span class="title"><i>Distributing Authoritative Name Servers via
Shared Unicast Addresses</i>. </span><span class="pubdate">April 2002. </span></p>
</div>
<div class="biblioentry">
-<a name="id2602453"></a><p>[<abbr class="abbrev">RFC3901</abbr>] <span class="authorgroup"><span class="firstname">A.</span> <span class="surname">Durand</span> and <span class="firstname">J.</span> <span class="surname">Ihren</span>. </span><span class="title"><i>DNS IPv6 Transport Operational Guidelines</i>. </span><span class="pubdate">September 2004. </span></p>
+<a name="id2605926"></a><p>[<abbr class="abbrev">RFC3901</abbr>] <span class="authorgroup"><span class="firstname">A.</span> <span class="surname">Durand</span> and <span class="firstname">J.</span> <span class="surname">Ihren</span>. </span><span class="title"><i>DNS IPv6 Transport Operational Guidelines</i>. </span><span class="pubdate">September 2004. </span></p>
</div>
</div>
<div class="bibliodiv">
<h3 class="title">Obsolete and Unimplemented Experimental RFC</h3>
<div class="biblioentry">
-<a name="id2602497"></a><p>[<abbr class="abbrev">RFC1712</abbr>] <span class="authorgroup"><span class="firstname">C.</span> <span class="surname">Farrell</span>, <span class="firstname">M.</span> <span class="surname">Schulze</span>, <span class="firstname">S.</span> <span class="surname">Pleitner</span>, and <span class="firstname">D.</span> <span class="surname">Baldoni</span>. </span><span class="title"><i><acronym class="acronym">DNS</acronym> Encoding of Geographical
+<a name="id2605970"></a><p>[<abbr class="abbrev">RFC1712</abbr>] <span class="authorgroup"><span class="firstname">C.</span> <span class="surname">Farrell</span>, <span class="firstname">M.</span> <span class="surname">Schulze</span>, <span class="firstname">S.</span> <span class="surname">Pleitner</span>, and <span class="firstname">D.</span> <span class="surname">Baldoni</span>. </span><span class="title"><i><acronym class="acronym">DNS</acronym> Encoding of Geographical
Location</i>. </span><span class="pubdate">November 1994. </span></p>
</div>
<div class="biblioentry">
-<a name="id2602554"></a><p>[<abbr class="abbrev">RFC2673</abbr>] <span class="authorgroup"><span class="firstname">M.</span> <span class="surname">Crawford</span>. </span><span class="title"><i>Binary Labels in the Domain Name System</i>. </span><span class="pubdate">August 1999. </span></p>
+<a name="id2606027"></a><p>[<abbr class="abbrev">RFC2673</abbr>] <span class="authorgroup"><span class="firstname">M.</span> <span class="surname">Crawford</span>. </span><span class="title"><i>Binary Labels in the Domain Name System</i>. </span><span class="pubdate">August 1999. </span></p>
</div>
<div class="biblioentry">
-<a name="id2602581"></a><p>[<abbr class="abbrev">RFC2874</abbr>] <span class="authorgroup"><span class="firstname">M.</span> <span class="surname">Crawford</span> and <span class="firstname">C.</span> <span class="surname">Huitema</span>. </span><span class="title"><i>DNS Extensions to Support IPv6 Address Aggregation
+<a name="id2606054"></a><p>[<abbr class="abbrev">RFC2874</abbr>] <span class="authorgroup"><span class="firstname">M.</span> <span class="surname">Crawford</span> and <span class="firstname">C.</span> <span class="surname">Huitema</span>. </span><span class="title"><i>DNS Extensions to Support IPv6 Address Aggregation
and Renumbering</i>. </span><span class="pubdate">July 2000. </span></p>
</div>
</div>
@@ -541,39 +551,39 @@
</p>
</div>
<div class="biblioentry">
-<a name="id2602629"></a><p>[<abbr class="abbrev">RFC2065</abbr>] <span class="authorgroup"><span class="firstname">D.</span> <span class="surname">Eastlake</span>, <span class="lineage">3rd</span> and <span class="firstname">C.</span> <span class="surname">Kaufman</span>. </span><span class="title"><i>Domain Name System Security Extensions</i>. </span><span class="pubdate">January 1997. </span></p>
+<a name="id2606102"></a><p>[<abbr class="abbrev">RFC2065</abbr>] <span class="authorgroup"><span class="firstname">D.</span> <span class="surname">Eastlake</span>, <span class="lineage">3rd</span> and <span class="firstname">C.</span> <span class="surname">Kaufman</span>. </span><span class="title"><i>Domain Name System Security Extensions</i>. </span><span class="pubdate">January 1997. </span></p>
</div>
<div class="biblioentry">
-<a name="id2602737"></a><p>[<abbr class="abbrev">RFC2137</abbr>] <span class="author"><span class="firstname">D.</span> <span class="surname">Eastlake</span>, <span class="lineage">3rd</span>. </span><span class="title"><i>Secure Domain Name System Dynamic Update</i>. </span><span class="pubdate">April 1997. </span></p>
+<a name="id2606141"></a><p>[<abbr class="abbrev">RFC2137</abbr>] <span class="author"><span class="firstname">D.</span> <span class="surname">Eastlake</span>, <span class="lineage">3rd</span>. </span><span class="title"><i>Secure Domain Name System Dynamic Update</i>. </span><span class="pubdate">April 1997. </span></p>
</div>
<div class="biblioentry">
-<a name="id2602763"></a><p>[<abbr class="abbrev">RFC2535</abbr>] <span class="authorgroup"><span class="firstname">D.</span> <span class="surname">Eastlake</span>, <span class="lineage">3rd</span>. </span><span class="title"><i>Domain Name System Security Extensions</i>. </span><span class="pubdate">March 1999. </span></p>
+<a name="id2606168"></a><p>[<abbr class="abbrev">RFC2535</abbr>] <span class="authorgroup"><span class="firstname">D.</span> <span class="surname">Eastlake</span>, <span class="lineage">3rd</span>. </span><span class="title"><i>Domain Name System Security Extensions</i>. </span><span class="pubdate">March 1999. </span></p>
</div>
<div class="biblioentry">
-<a name="id2602793"></a><p>[<abbr class="abbrev">RFC3008</abbr>] <span class="authorgroup"><span class="firstname">B.</span> <span class="surname">Wellington</span>. </span><span class="title"><i>Domain Name System Security (DNSSEC)
+<a name="id2606198"></a><p>[<abbr class="abbrev">RFC3008</abbr>] <span class="authorgroup"><span class="firstname">B.</span> <span class="surname">Wellington</span>. </span><span class="title"><i>Domain Name System Security (DNSSEC)
Signing Authority</i>. </span><span class="pubdate">November 2000. </span></p>
</div>
<div class="biblioentry">
-<a name="id2602819"></a><p>[<abbr class="abbrev">RFC3090</abbr>] <span class="authorgroup"><span class="firstname">E.</span> <span class="surname">Lewis</span>. </span><span class="title"><i>DNS Security Extension Clarification on Zone Status</i>. </span><span class="pubdate">March 2001. </span></p>
+<a name="id2606224"></a><p>[<abbr class="abbrev">RFC3090</abbr>] <span class="authorgroup"><span class="firstname">E.</span> <span class="surname">Lewis</span>. </span><span class="title"><i>DNS Security Extension Clarification on Zone Status</i>. </span><span class="pubdate">March 2001. </span></p>
</div>
<div class="biblioentry">
-<a name="id2602845"></a><p>[<abbr class="abbrev">RFC3445</abbr>] <span class="authorgroup"><span class="firstname">D.</span> <span class="surname">Massey</span> and <span class="firstname">S.</span> <span class="surname">Rose</span>. </span><span class="title"><i>Limiting the Scope of the KEY Resource Record (RR)</i>. </span><span class="pubdate">December 2002. </span></p>
+<a name="id2606250"></a><p>[<abbr class="abbrev">RFC3445</abbr>] <span class="authorgroup"><span class="firstname">D.</span> <span class="surname">Massey</span> and <span class="firstname">S.</span> <span class="surname">Rose</span>. </span><span class="title"><i>Limiting the Scope of the KEY Resource Record (RR)</i>. </span><span class="pubdate">December 2002. </span></p>
</div>
<div class="biblioentry">
-<a name="id2602950"></a><p>[<abbr class="abbrev">RFC3655</abbr>] <span class="authorgroup"><span class="firstname">B.</span> <span class="surname">Wellington</span> and <span class="firstname">O.</span> <span class="surname">Gudmundsson</span>. </span><span class="title"><i>Redefinition of DNS Authenticated Data (AD) bit</i>. </span><span class="pubdate">November 2003. </span></p>
+<a name="id2606286"></a><p>[<abbr class="abbrev">RFC3655</abbr>] <span class="authorgroup"><span class="firstname">B.</span> <span class="surname">Wellington</span> and <span class="firstname">O.</span> <span class="surname">Gudmundsson</span>. </span><span class="title"><i>Redefinition of DNS Authenticated Data (AD) bit</i>. </span><span class="pubdate">November 2003. </span></p>
</div>
<div class="biblioentry">
-<a name="id2602986"></a><p>[<abbr class="abbrev">RFC3658</abbr>] <span class="authorgroup"><span class="firstname">O.</span> <span class="surname">Gudmundsson</span>. </span><span class="title"><i>Delegation Signer (DS) Resource Record (RR)</i>. </span><span class="pubdate">December 2003. </span></p>
+<a name="id2606323"></a><p>[<abbr class="abbrev">RFC3658</abbr>] <span class="authorgroup"><span class="firstname">O.</span> <span class="surname">Gudmundsson</span>. </span><span class="title"><i>Delegation Signer (DS) Resource Record (RR)</i>. </span><span class="pubdate">December 2003. </span></p>
</div>
<div class="biblioentry">
-<a name="id2603013"></a><p>[<abbr class="abbrev">RFC3755</abbr>] <span class="authorgroup"><span class="firstname">S.</span> <span class="surname">Weiler</span>. </span><span class="title"><i>Legacy Resolver Compatibility for Delegation Signer (DS)</i>. </span><span class="pubdate">May 2004. </span></p>
+<a name="id2606349"></a><p>[<abbr class="abbrev">RFC3755</abbr>] <span class="authorgroup"><span class="firstname">S.</span> <span class="surname">Weiler</span>. </span><span class="title"><i>Legacy Resolver Compatibility for Delegation Signer (DS)</i>. </span><span class="pubdate">May 2004. </span></p>
</div>
<div class="biblioentry">
-<a name="id2603040"></a><p>[<abbr class="abbrev">RFC3757</abbr>] <span class="authorgroup"><span class="firstname">O.</span> <span class="surname">Kolkman</span>, <span class="firstname">J.</span> <span class="surname">Schlyter</span>, and <span class="firstname">E.</span> <span class="surname">Lewis</span>. </span><span class="title"><i>Domain Name System KEY (DNSKEY) Resource Record
+<a name="id2606376"></a><p>[<abbr class="abbrev">RFC3757</abbr>] <span class="authorgroup"><span class="firstname">O.</span> <span class="surname">Kolkman</span>, <span class="firstname">J.</span> <span class="surname">Schlyter</span>, and <span class="firstname">E.</span> <span class="surname">Lewis</span>. </span><span class="title"><i>Domain Name System KEY (DNSKEY) Resource Record
(RR) Secure Entry Point (SEP) Flag</i>. </span><span class="pubdate">April 2004. </span></p>
</div>
<div class="biblioentry">
-<a name="id2603084"></a><p>[<abbr class="abbrev">RFC3845</abbr>] <span class="authorgroup"><span class="firstname">J.</span> <span class="surname">Schlyter</span>. </span><span class="title"><i>DNS Security (DNSSEC) NextSECure (NSEC) RDATA Format</i>. </span><span class="pubdate">August 2004. </span></p>
+<a name="id2606421"></a><p>[<abbr class="abbrev">RFC3845</abbr>] <span class="authorgroup"><span class="firstname">J.</span> <span class="surname">Schlyter</span>. </span><span class="title"><i>DNS Security (DNSSEC) NextSECure (NSEC) RDATA Format</i>. </span><span class="pubdate">August 2004. </span></p>
</div>
</div>
</div>
@@ -594,16 +604,481 @@
</div>
<div class="sect2" lang="en">
<div class="titlepage"><div><div><h3 class="title">
-<a name="id2603126"></a>Other Documents About <acronym class="acronym">BIND</acronym>
+<a name="id2606462"></a>Other Documents About <acronym class="acronym">BIND</acronym>
</h3></div></div></div>
<p></p>
<div class="bibliography">
<div class="titlepage"><div><div><h4 class="title">
-<a name="id2603136"></a>Bibliography</h4></div></div></div>
+<a name="id2606472"></a>Bibliography</h4></div></div></div>
<div class="biblioentry">
-<a name="id2603138"></a><p><span class="authorgroup"><span class="firstname">Paul</span> <span class="surname">Albitz</span> and <span class="firstname">Cricket</span> <span class="surname">Liu</span>. </span><span class="title"><i><acronym class="acronym">DNS</acronym> and <acronym class="acronym">BIND</acronym></i>. </span><span class="copyright">Copyright © 1998 Sebastopol, CA: O'Reilly and Associates. </span></p>
+<a name="id2606474"></a><p><span class="authorgroup"><span class="firstname">Paul</span> <span class="surname">Albitz</span> and <span class="firstname">Cricket</span> <span class="surname">Liu</span>. </span><span class="title"><i><acronym class="acronym">DNS</acronym> and <acronym class="acronym">BIND</acronym></i>. </span><span class="copyright">Copyright © 1998 Sebastopol, CA: O'Reilly and Associates. </span></p>
+</div>
+</div>
+</div>
+</div>
+<div class="sect1" lang="en">
+<div class="titlepage"><div><div><h2 class="title" style="clear: both">
+<a name="bind9.library"></a>BIND 9 DNS Library Support</h2></div></div></div>
+<p>This version of BIND 9 "exports" its internal libraries so
+ that they can be used by third-party applications more easily (we
+ call them "export" libraries in this document). In addition to
+ all major DNS-related APIs BIND 9 is currently using, the export
+ libraries provide the following features:</p>
+<div class="itemizedlist"><ul type="disc">
+<li><p>The newly created "DNS client" module. This is a higher
+ level API that provides an interface to name resolution,
+ single DNS transaction with a particular server, and dynamic
+ update. Regarding name resolution, it supports advanced
+ features such as DNSSEC validation and caching. This module
+ supports both synchronous and asynchronous mode.</p></li>
+<li><p>The new "IRS" (Information Retrieval System) library.
+ It provides an interface to parse the traditional resolv.conf
+ file and more advanced, DNS-specific configuration file for
+ the rest of this package (see the description for the
+ dns.conf file below).</p></li>
+<li><p>As part of the IRS library, newly implemented standard
+ address-name mapping functions, getaddrinfo() and
+ getnameinfo(), are provided. They use the DNSSEC-aware
+ validating resolver backend, and could use other advanced
+ features of the BIND 9 libraries such as caching. The
+ getaddrinfo() function resolves both A and AAAA RRs
+ concurrently (when the address family is unspecified).</p></li>
+<li><p>An experimental framework to support other event
+ libraries than BIND 9's internal event task system.</p></li>
+</ul></div>
+<div class="sect2" lang="en">
+<div class="titlepage"><div><div><h3 class="title">
+<a name="id2608789"></a>Prerequisite</h3></div></div></div>
+<p>GNU make is required to build the export libraries (other
+ part of BIND 9 can still be built with other types of make). In
+ the reminder of this document, "make" means GNU make. Note that
+ in some platforms you may need to invoke a different command name
+ than "make" (e.g. "gmake") to indicate it's GNU make.</p>
+</div>
+<div class="sect2" lang="en">
+<div class="titlepage"><div><div><h3 class="title">
+<a name="id2608798"></a>Compilation</h3></div></div></div>
+<pre class="screen">
+$ <strong class="userinput"><code>./configure --enable-exportlib <em class="replaceable"><code>[other flags]</code></em></code></strong>
+$ <strong class="userinput"><code>make</code></strong>
+</pre>
+<p>
+ This will create (in addition to usual BIND 9 programs) and a
+ separate set of libraries under the lib/export directory. For
+ example, <code class="filename">lib/export/dns/libdns.a</code> is the archive file of the
+ export version of the BIND 9 DNS library. Sample application
+ programs using the libraries will also be built under the
+ lib/export/samples directory (see below).</p>
+</div>
+<div class="sect2" lang="en">
+<div class="titlepage"><div><div><h3 class="title">
+<a name="id2608004"></a>Installation</h3></div></div></div>
+<pre class="screen">
+$ <strong class="userinput"><code>cd lib/export</code></strong>
+$ <strong class="userinput"><code>make install</code></strong>
+</pre>
+<p>
+ This will install library object files under the directory
+ specified by the --with-export-libdir configure option (default:
+ EPREFIX/lib/bind9), and header files under the directory
+ specified by the --with-export-includedir configure option
+ (default: PREFIX/include/bind9).
+ Root privilege is normally required.
+ "<span><strong class="command">make install</strong></span>" at the top directory will do the
+ same.
+ </p>
+<p>
+ To see how to build your own
+ application after the installation, see
+ <code class="filename">lib/export/samples/Makefile-postinstall.in</code>.</p>
+</div>
+<div class="sect2" lang="en">
+<div class="titlepage"><div><div><h3 class="title">
+<a name="id2608035"></a>Known Defects/Restrictions</h3></div></div></div>
+<div class="itemizedlist"><ul type="disc">
+<li><p>Currently, win32 is not supported for the export
+ library. (Normal BIND 9 application can be built as
+ before).</p></li>
+<li>
+<p>The "fixed" RRset order is not (currently) supported in
+ the export library. If you want to use "fixed" RRset order
+ for, e.g. <span><strong class="command">named</strong></span> while still building the
+ export library even without the fixed order support, build
+ them separately:
+ </p>
+<pre class="screen">
+$ <strong class="userinput"><code>./configure --enable-fixed-rrset <em class="replaceable"><code>[other flags, but not --enable-exportlib]</code></em></code></strong>
+$ <strong class="userinput"><code>make</code></strong>
+$ <strong class="userinput"><code>./configure --enable-exportlib <em class="replaceable"><code>[other flags, but not --enable-fixed-rrset]</code></em></code></strong>
+$ <strong class="userinput"><code>cd lib/export</code></strong>
+$ <strong class="userinput"><code>make</code></strong>
+</pre>
+<p>
+ </p>
+</li>
+<li><p>The client module and the IRS library currently do not
+ support DNSSEC validation using DLV (the underlying modules
+ can handle it, but there is no tunable interface to enable
+ the feature).</p></li>
+<li><p>RFC 5011 is not supported in the validating stub
+ resolver of the export library. In fact, it is not clear
+ whether it should: trust anchors would be a system-wide
+ configuration which would be managed by an administrator,
+ while the stub resolver will be used by ordinary applications
+ run by a normal user.</p></li>
+<li><p>Not all common <code class="filename">/etc/resolv.conf</code>
+ options are supported
+ in the IRS library. The only available options in this
+ version are "debug" and "ndots".</p></li>
+</ul></div>
+</div>
+<div class="sect2" lang="en">
+<div class="titlepage"><div><div><h3 class="title">
+<a name="id2608112"></a>The dns.conf File</h3></div></div></div>
+<p>The IRS library supports an "advanced" configuration file
+ related to the DNS library for configuration parameters that
+ would be beyond the capability of the
+ <code class="filename">resolv.conf</code> file.
+ Specifically, it is intended to provide DNSSEC related
+ configuration parameters. By default the path to this
+ configuration file is <code class="filename">/etc/dns.conf</code>.
+ This module is very
+ experimental and the configuration syntax or library interfaces
+ may change in future versions. Currently, only the
+ <span><strong class="command">trusted-keys</strong></span>
+ statement is supported, whose syntax is the same as the same name
+ of statement for <code class="filename">named.conf</code>. (See
+ <a href="Bv9ARM.ch06.html#trusted-keys" title="trusted-keys Statement Grammar">the section called &#8220;<span><strong class="command">trusted-keys</strong></span> Statement Grammar&#8221;</a> for details.)</p>
+</div>
+<div class="sect2" lang="en">
+<div class="titlepage"><div><div><h3 class="title">
+<a name="id2608138"></a>Sample Applications</h3></div></div></div>
+<p>Some sample application programs using this API are
+ provided for reference. The following is a brief description of
+ these applications.
+ </p>
+<div class="sect3" lang="en">
+<div class="titlepage"><div><div><h4 class="title">
+<a name="id2608147"></a>sample: a simple stub resolver utility</h4></div></div></div>
+<p>
+ It sends a query of a given name (of a given optional RR type) to a
+ specified recursive server, and prints the result as a list of
+ RRs. It can also act as a validating stub resolver if a trust
+ anchor is given via a set of command line options.</p>
+<p>
+ Usage: sample [options] server_address hostname
+ </p>
+<p>
+ Options and Arguments:
+ </p>
+<div class="variablelist"><dl>
+<dt><span class="term">
+ -t RRtype
+ </span></dt>
+<dd><p>
+ specify the RR type of the query. The default is the A RR.
+ </p></dd>
+<dt><span class="term">
+ [-a algorithm] [-e] -k keyname -K keystring
+ </span></dt>
+<dd>
+<p>
+ specify a command-line DNS key to validate the answer. For
+ example, to specify the following DNSKEY of example.com:
+</p>
+<div class="literallayout"><p><br>
+                example.com. 3600 IN DNSKEY 257 3 5 xxx<br>
+</p></div>
+<p>
+ specify the options as follows:
+</p>
+<pre class="screen">
+<strong class="userinput"><code>
+ -e -k example.com -K "xxx"
+</code></strong>
+</pre>
+<p>
+ -e means that this key is a zone's "key signing key" (as known
+ as "secure Entry point").
+ When -a is omitted rsasha1 will be used by default.
+ </p>
+</dd>
+<dt><span class="term">
+ -s domain:alt_server_address
+ </span></dt>
+<dd><p>
+ specify a separate recursive server address for the specific
+ "domain". Example: -s example.com:2001:db8::1234
+ </p></dd>
+<dt><span class="term">server_address</span></dt>
+<dd><p>
+ an IP(v4/v6) address of the recursive server to which queries
+ are sent.
+ </p></dd>
+<dt><span class="term">hostname</span></dt>
+<dd><p>
+ the domain name for the query
+ </p></dd>
+</dl></div>
+</div>
+<div class="sect3" lang="en">
+<div class="titlepage"><div><div><h4 class="title">
+<a name="id2608237"></a>sample-async: a simple stub resolver, working asynchronously</h4></div></div></div>
+<p>
+ Similar to "sample", but accepts a list
+ of (query) domain names as a separate file and resolves the names
+ asynchronously.</p>
+<p>
+ Usage: sample-async [-s server_address] [-t RR_type] input_file</p>
+<p>
+ Options and Arguments:
+ </p>
+<div class="variablelist"><dl>
+<dt><span class="term">
+ -s server_address
+ </span></dt>
+<dd>
+ an IPv4 address of the recursive server to which queries are sent.
+ (IPv6 addresses are not supported in this implementation)
+ </dd>
+<dt><span class="term">
+ -t RR_type
+ </span></dt>
+<dd>
+ specify the RR type of the queries. The default is the A
+ RR.
+ </dd>
+<dt><span class="term">
+ input_file
+ </span></dt>
+<dd>
+ a list of domain names to be resolved. each line
+ consists of a single domain name. Example:
+ <div class="literallayout"><p><br>
+  www.example.com<br>
+  mx.examle.net<br>
+  ns.xxx.example<br>
+</p></div>
+</dd>
+</dl></div>
+</div>
+<div class="sect3" lang="en">
+<div class="titlepage"><div><div><h4 class="title">
+<a name="id2608291"></a>sample-request: a simple DNS transaction client</h4></div></div></div>
+<p>
+ It sends a query to a specified server, and
+ prints the response with minimal processing. It doesn't act as a
+ "stub resolver": it stops the processing once it gets any
+ response from the server, whether it's a referral or an alias
+ (CNAME or DNAME) that would require further queries to get the
+ ultimate answer. In other words, this utility acts as a very
+ simplified <span><strong class="command">dig</strong></span>.
+ </p>
+<p>
+ Usage: sample-request [-t RRtype] server_address hostname
+ </p>
+<p>
+ Options and Arguments:
+ </p>
+<div class="variablelist"><dl>
+<dt><span class="term">
+ -t RRtype
+ </span></dt>
+<dd><p>
+ specify the RR type of
+ the queries. The default is the A RR.
+ </p></dd>
+<dt><span class="term">
+ server_address
+ </span></dt>
+<dd><p>
+ an IP(v4/v6)
+ address of the recursive server to which the query is sent.
+ </p></dd>
+<dt><span class="term">
+ hostname
+ </span></dt>
+<dd><p>
+ the domain name for the query
+ </p></dd>
+</dl></div>
+</div>
+<div class="sect3" lang="en">
+<div class="titlepage"><div><div><h4 class="title">
+<a name="id2608355"></a>sample-gai: getaddrinfo() and getnameinfo() test code</h4></div></div></div>
+<p>
+ This is a test program
+ to check getaddrinfo() and getnameinfo() behavior. It takes a
+ host name as an argument, calls getaddrinfo() with the given host
+ name, and calls getnameinfo() with the resulting IP addresses
+ returned by getaddrinfo(). If the dns.conf file exists and
+ defines a trust anchor, the underlying resolver will act as a
+ validating resolver, and getaddrinfo()/getnameinfo() will fail
+ with an EAI_INSECUREDATA error when DNSSEC validation fails.
+ </p>
+<p>
+ Usage: sample-gai hostname
+ </p>
+</div>
+<div class="sect3" lang="en">
+<div class="titlepage"><div><div><h4 class="title">
+<a name="id2608370"></a>sample-update: a simple dynamic update client program</h4></div></div></div>
+<p>
+ It accepts a single update command as a
+ command-line argument, sends an update request message to the
+ authoritative server, and shows the response from the server. In
+ other words, this is a simplified <span><strong class="command">nsupdate</strong></span>.
+ </p>
+<p>
+ Usage: sample-update [options] (add|delete) "update data"
+ </p>
+<p>
+ Options and Arguments:
+ </p>
+<div class="variablelist"><dl>
+<dt><span class="term">
+ -a auth_server
+ </span></dt>
+<dd><p>
+ An IP address of the authoritative server that has authority
+ for the zone containing the update name. This should normally
+ be the primary authoritative server that accepts dynamic
+ updates. It can also be a secondary server that is configured
+ to forward update requests to the primary server.
+ </p></dd>
+<dt><span class="term">
+ -k keyfile
+ </span></dt>
+<dd><p>
+ A TSIG key file to secure the update transaction. The keyfile
+ format is the same as that for the nsupdate utility.
+ </p></dd>
+<dt><span class="term">
+ -p prerequisite
+ </span></dt>
+<dd><p>
+ A prerequisite for the update (only one prerequisite can be
+ specified). The prerequisite format is the same as that is
+ accepted by the nsupdate utility.
+ </p></dd>
+<dt><span class="term">
+ -r recursive_server
+ </span></dt>
+<dd><p>
+ An IP address of a recursive server that this utility will
+ use. A recursive server may be necessary to identify the
+ authoritative server address to which the update request is
+ sent.
+ </p></dd>
+<dt><span class="term">
+ -z zonename
+ </span></dt>
+<dd><p>
+ The domain name of the zone that contains
+ </p></dd>
+<dt><span class="term">
+ (add|delete)
+ </span></dt>
+<dd><p>
+ Specify the type of update operation. Either "add" or "delete"
+ must be specified.
+ </p></dd>
+<dt><span class="term">
+ "update data"
+ </span></dt>
+<dd><p>
+ Specify the data to be updated. A typical example of the data
+ would look like "name TTL RRtype RDATA".
+ </p></dd>
+</dl></div>
+<div class="note" style="margin-left: 0.5in; margin-right: 0.5in;">
+<h3 class="title">Note</h3>In practice, either -a or -r must be specified. Others can
+ be optional; the underlying library routine tries to identify the
+ appropriate server and the zone name for the update.</div>
+<p>
+ Examples: assuming the primary authoritative server of the
+ dynamic.example.com zone has an IPv6 address 2001:db8::1234,
+ </p>
+<pre class="screen">
+$ <strong class="userinput"><code>sample-update -a sample-update -k Kxxx.+nnn+mmmm.key add "foo.dynamic.example.com 30 IN A 192.168.2.1"</code></strong></pre>
+<p>
+ adds an A RR for foo.dynamic.example.com using the given key.
+ </p>
+<pre class="screen">
+$ <strong class="userinput"><code>sample-update -a sample-update -k Kxxx.+nnn+mmmm.key delete "foo.dynamic.example.com 30 IN A"</code></strong></pre>
+<p>
+ removes all A RRs for foo.dynamic.example.com using the given key.
+ </p>
+<pre class="screen">
+$ <strong class="userinput"><code>sample-update -a sample-update -k Kxxx.+nnn+mmmm.key delete "foo.dynamic.example.com"</code></strong></pre>
+<p>
+ removes all RRs for foo.dynamic.example.com using the given key.
+ </p>
+</div>
+<div class="sect3" lang="en">
+<div class="titlepage"><div><div><h4 class="title">
+<a name="id2609047"></a>nsprobe: domain/name server checker in terms of RFC 4074</h4></div></div></div>
+<p>
+ It checks a set
+ of domains to see the name servers of the domains behave
+ correctly in terms of RFC 4074. This is included in the set of
+ sample programs to show how the export library can be used in a
+ DNS-related application.
+ </p>
+<p>
+ Usage: nsprobe [-d] [-v [-v...]] [-c cache_address] [input_file]
+ </p>
+<p>
+ Options
+ </p>
+<div class="variablelist"><dl>
+<dt><span class="term">
+ -d
+ </span></dt>
+<dd><p>
+ run in the "debug" mode. with this option nsprobe will dump
+ every RRs it receives.
+ </p></dd>
+<dt><span class="term">
+ -v
+ </span></dt>
+<dd><p>
+ increase verbosity of other normal log messages. This can be
+ specified multiple times
+ </p></dd>
+<dt><span class="term">
+ -c cache_address
+ </span></dt>
+<dd><p>
+ specify an IP address of a recursive (caching) name server.
+ nsprobe uses this server to get the NS RRset of each domain and
+ the A and/or AAAA RRsets for the name servers. The default
+ value is 127.0.0.1.
+ </p></dd>
+<dt><span class="term">
+ input_file
+ </span></dt>
+<dd><p>
+ a file name containing a list of domain (zone) names to be
+ probed. when omitted the standard input will be used. Each
+ line of the input file specifies a single domain name such as
+ "example.com". In general this domain name must be the apex
+ name of some DNS zone (unlike normal "host names" such as
+ "www.example.com"). nsprobe first identifies the NS RRsets for
+ the given domain name, and sends A and AAAA queries to these
+ servers for some "widely used" names under the zone;
+ specifically, adding "www" and "ftp" to the zone name.
+ </p></dd>
+</dl></div>
</div>
</div>
+<div class="sect2" lang="en">
+<div class="titlepage"><div><div><h3 class="title">
+<a name="id2609111"></a>Library References</h3></div></div></div>
+<p>As of this writing, there is no formal "manual" of the
+ libraries, except this document, header files (some of them
+ provide pretty detailed explanations), and sample application
+ programs.</p>
</div>
</div>
</div>
diff --git a/contrib/bind9/doc/arm/Bv9ARM.ch10.html b/contrib/bind9/doc/arm/Bv9ARM.ch10.html
index 6929485..7ff08e1 100644
--- a/contrib/bind9/doc/arm/Bv9ARM.ch10.html
+++ b/contrib/bind9/doc/arm/Bv9ARM.ch10.html
@@ -1,5 +1,5 @@
<!--
- - Copyright (C) 2004-2010 Internet Systems Consortium, Inc. ("ISC")
+ - Copyright (C) 2004-2011 Internet Systems Consortium, Inc. ("ISC")
- Copyright (C) 2000-2003 Internet Software Consortium.
-
- Permission to use, copy, modify, and/or distribute this software for any
@@ -14,7 +14,7 @@
- OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
- PERFORMANCE OF THIS SOFTWARE.
-->
-<!-- $Id: Bv9ARM.ch10.html,v 1.11.14.3 2010-01-24 01:55:26 tbox Exp $ -->
+<!-- $Id: Bv9ARM.ch10.html,v 1.20 2011-01-05 01:14:09 tbox Exp $ -->
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
@@ -64,6 +64,12 @@
<span class="refentrytitle"><a href="man.dnssec-keygen.html"><span class="application">dnssec-keygen</span></a></span><span class="refpurpose"> &#8212; DNSSEC key generation tool</span>
</dt>
<dt>
+<span class="refentrytitle"><a href="man.dnssec-revoke.html"><span class="application">dnssec-revoke</span></a></span><span class="refpurpose"> &#8212; Set the REVOKED bit on a DNSSEC key</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="man.dnssec-settime.html"><span class="application">dnssec-settime</span></a></span><span class="refpurpose"> &#8212; Set the key timing metadata for a DNSSEC key</span>
+</dt>
+<dt>
<span class="refentrytitle"><a href="man.dnssec-signzone.html"><span class="application">dnssec-signzone</span></a></span><span class="refpurpose"> &#8212; DNSSEC zone signing tool</span>
</dt>
<dt>
@@ -76,6 +82,9 @@
<span class="refentrytitle"><a href="man.named.html"><span class="application">named</span></a></span><span class="refpurpose"> &#8212; Internet domain name server</span>
</dt>
<dt>
+<span class="refentrytitle"><a href="man.named-journalprint.html"><span class="application">named-journalprint</span></a></span><span class="refpurpose"> &#8212; print zone journal in human-readable form</span>
+</dt>
+<dt>
<span class="refentrytitle"><a href="man.nsupdate.html"><span class="application">nsupdate</span></a></span><span class="refpurpose"> &#8212; Dynamic DNS update utility</span>
</dt>
<dt>
@@ -87,6 +96,21 @@
<dt>
<span class="refentrytitle"><a href="man.rndc-confgen.html"><span class="application">rndc-confgen</span></a></span><span class="refpurpose"> &#8212; rndc key generation tool</span>
</dt>
+<dt>
+<span class="refentrytitle"><a href="man.ddns-confgen.html"><span class="application">ddns-confgen</span></a></span><span class="refpurpose"> &#8212; ddns key generation tool</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="man.arpaname.html"><span class="application">arpaname</span></a></span><span class="refpurpose"> &#8212; translate IP addresses to the corresponding ARPA names</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="man.genrandom.html"><span class="application">genrandom</span></a></span><span class="refpurpose"> &#8212; generate a file containing random data</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="man.isc-hmac-fixup.html"><span class="application">isc-hmac-fixup</span></a></span><span class="refpurpose"> &#8212; fixes HMAC keys generated by older versions of BIND</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="man.nsec3hash.html"><span class="application">nsec3hash</span></a></span><span class="refpurpose"> &#8212; generate NSEC3 hash</span>
+</dt>
</dl>
</div>
</div>
diff --git a/contrib/bind9/doc/arm/Bv9ARM.html b/contrib/bind9/doc/arm/Bv9ARM.html
index 8c21270..7341705 100644
--- a/contrib/bind9/doc/arm/Bv9ARM.html
+++ b/contrib/bind9/doc/arm/Bv9ARM.html
@@ -1,5 +1,5 @@
<!--
- - Copyright (C) 2004-2010 Internet Systems Consortium, Inc. ("ISC")
+ - Copyright (C) 2004-2011 Internet Systems Consortium, Inc. ("ISC")
- Copyright (C) 2000-2003 Internet Software Consortium.
-
- Permission to use, copy, modify, and/or distribute this software for any
@@ -14,7 +14,7 @@
- OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
- PERFORMANCE OF THIS SOFTWARE.
-->
-<!-- $Id: Bv9ARM.html,v 1.193.14.16 2010-08-20 02:05:39 tbox Exp $ -->
+<!-- $Id: Bv9ARM.html,v 1.263.8.1.2.1 2011-06-09 03:41:09 tbox Exp $ -->
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
@@ -41,7 +41,7 @@
<div>
<div><h1 class="title">
<a name="id2563174"></a>BIND 9 Administrator Reference Manual</h1></div>
-<div><p class="copyright">Copyright © 2004-2010 Internet Systems Consortium, Inc. ("ISC")</p></div>
+<div><p class="copyright">Copyright © 2004-2011 Internet Systems Consortium, Inc. ("ISC")</p></div>
<div><p class="copyright">Copyright © 2000-2003 Internet Software Consortium.</p></div>
</div>
<hr>
@@ -51,39 +51,39 @@
<dl>
<dt><span class="chapter"><a href="Bv9ARM.ch01.html">1. Introduction</a></span></dt>
<dd><dl>
-<dt><span class="sect1"><a href="Bv9ARM.ch01.html#id2563412">Scope of Document</a></span></dt>
-<dt><span class="sect1"><a href="Bv9ARM.ch01.html#id2564391">Organization of This Document</a></span></dt>
-<dt><span class="sect1"><a href="Bv9ARM.ch01.html#id2564531">Conventions Used in This Document</a></span></dt>
-<dt><span class="sect1"><a href="Bv9ARM.ch01.html#id2564712">The Domain Name System (<acronym class="acronym">DNS</acronym>)</a></span></dt>
+<dt><span class="sect1"><a href="Bv9ARM.ch01.html#id2564371">Scope of Document</a></span></dt>
+<dt><span class="sect1"><a href="Bv9ARM.ch01.html#id2564394">Organization of This Document</a></span></dt>
+<dt><span class="sect1"><a href="Bv9ARM.ch01.html#id2564534">Conventions Used in This Document</a></span></dt>
+<dt><span class="sect1"><a href="Bv9ARM.ch01.html#id2564715">The Domain Name System (<acronym class="acronym">DNS</acronym>)</a></span></dt>
<dd><dl>
-<dt><span class="sect2"><a href="Bv9ARM.ch01.html#id2564733">DNS Fundamentals</a></span></dt>
-<dt><span class="sect2"><a href="Bv9ARM.ch01.html#id2564768">Domains and Domain Names</a></span></dt>
-<dt><span class="sect2"><a href="Bv9ARM.ch01.html#id2567173">Zones</a></span></dt>
-<dt><span class="sect2"><a href="Bv9ARM.ch01.html#id2567250">Authoritative Name Servers</a></span></dt>
-<dt><span class="sect2"><a href="Bv9ARM.ch01.html#id2567422">Caching Name Servers</a></span></dt>
-<dt><span class="sect2"><a href="Bv9ARM.ch01.html#id2567553">Name Servers in Multiple Roles</a></span></dt>
+<dt><span class="sect2"><a href="Bv9ARM.ch01.html#id2564737">DNS Fundamentals</a></span></dt>
+<dt><span class="sect2"><a href="Bv9ARM.ch01.html#id2564771">Domains and Domain Names</a></span></dt>
+<dt><span class="sect2"><a href="Bv9ARM.ch01.html#id2567176">Zones</a></span></dt>
+<dt><span class="sect2"><a href="Bv9ARM.ch01.html#id2567253">Authoritative Name Servers</a></span></dt>
+<dt><span class="sect2"><a href="Bv9ARM.ch01.html#id2567426">Caching Name Servers</a></span></dt>
+<dt><span class="sect2"><a href="Bv9ARM.ch01.html#id2567556">Name Servers in Multiple Roles</a></span></dt>
</dl></dd>
</dl></dd>
<dt><span class="chapter"><a href="Bv9ARM.ch02.html">2. <acronym class="acronym">BIND</acronym> Resource Requirements</a></span></dt>
<dd><dl>
-<dt><span class="sect1"><a href="Bv9ARM.ch02.html#id2567587">Hardware requirements</a></span></dt>
-<dt><span class="sect1"><a href="Bv9ARM.ch02.html#id2567613">CPU Requirements</a></span></dt>
-<dt><span class="sect1"><a href="Bv9ARM.ch02.html#id2567626">Memory Requirements</a></span></dt>
-<dt><span class="sect1"><a href="Bv9ARM.ch02.html#id2567721">Name Server Intensive Environment Issues</a></span></dt>
-<dt><span class="sect1"><a href="Bv9ARM.ch02.html#id2567732">Supported Operating Systems</a></span></dt>
+<dt><span class="sect1"><a href="Bv9ARM.ch02.html#id2567590">Hardware requirements</a></span></dt>
+<dt><span class="sect1"><a href="Bv9ARM.ch02.html#id2567617">CPU Requirements</a></span></dt>
+<dt><span class="sect1"><a href="Bv9ARM.ch02.html#id2567629">Memory Requirements</a></span></dt>
+<dt><span class="sect1"><a href="Bv9ARM.ch02.html#id2567724">Name Server Intensive Environment Issues</a></span></dt>
+<dt><span class="sect1"><a href="Bv9ARM.ch02.html#id2567735">Supported Operating Systems</a></span></dt>
</dl></dd>
<dt><span class="chapter"><a href="Bv9ARM.ch03.html">3. Name Server Configuration</a></span></dt>
<dd><dl>
<dt><span class="sect1"><a href="Bv9ARM.ch03.html#sample_configuration">Sample Configurations</a></span></dt>
<dd><dl>
-<dt><span class="sect2"><a href="Bv9ARM.ch03.html#id2567764">A Caching-only Name Server</a></span></dt>
-<dt><span class="sect2"><a href="Bv9ARM.ch03.html#id2567780">An Authoritative-only Name Server</a></span></dt>
+<dt><span class="sect2"><a href="Bv9ARM.ch03.html#id2567767">A Caching-only Name Server</a></span></dt>
+<dt><span class="sect2"><a href="Bv9ARM.ch03.html#id2567988">An Authoritative-only Name Server</a></span></dt>
</dl></dd>
-<dt><span class="sect1"><a href="Bv9ARM.ch03.html#id2568007">Load Balancing</a></span></dt>
-<dt><span class="sect1"><a href="Bv9ARM.ch03.html#id2568361">Name Server Operations</a></span></dt>
+<dt><span class="sect1"><a href="Bv9ARM.ch03.html#id2568010">Load Balancing</a></span></dt>
+<dt><span class="sect1"><a href="Bv9ARM.ch03.html#id2568364">Name Server Operations</a></span></dt>
<dd><dl>
-<dt><span class="sect2"><a href="Bv9ARM.ch03.html#id2568366">Tools for Use With the Name Server Daemon</a></span></dt>
-<dt><span class="sect2"><a href="Bv9ARM.ch03.html#id2570006">Signals</a></span></dt>
+<dt><span class="sect2"><a href="Bv9ARM.ch03.html#id2568370">Tools for Use With the Name Server Daemon</a></span></dt>
+<dt><span class="sect2"><a href="Bv9ARM.ch03.html#id2570385">Signals</a></span></dt>
</dl></dd>
</dl></dd>
<dt><span class="chapter"><a href="Bv9ARM.ch04.html">4. Advanced DNS Features</a></span></dt>
@@ -92,34 +92,64 @@
<dt><span class="sect1"><a href="Bv9ARM.ch04.html#dynamic_update">Dynamic Update</a></span></dt>
<dd><dl><dt><span class="sect2"><a href="Bv9ARM.ch04.html#journal">The journal file</a></span></dt></dl></dd>
<dt><span class="sect1"><a href="Bv9ARM.ch04.html#incremental_zone_transfers">Incremental Zone Transfers (IXFR)</a></span></dt>
-<dt><span class="sect1"><a href="Bv9ARM.ch04.html#id2570492">Split DNS</a></span></dt>
-<dd><dl><dt><span class="sect2"><a href="Bv9ARM.ch04.html#id2570510">Example split DNS setup</a></span></dt></dl></dd>
+<dt><span class="sect1"><a href="Bv9ARM.ch04.html#id2570823">Split DNS</a></span></dt>
+<dd><dl><dt><span class="sect2"><a href="Bv9ARM.ch04.html#id2570841">Example split DNS setup</a></span></dt></dl></dd>
<dt><span class="sect1"><a href="Bv9ARM.ch04.html#tsig">TSIG</a></span></dt>
<dd><dl>
-<dt><span class="sect2"><a href="Bv9ARM.ch04.html#id2571082">Generate Shared Keys for Each Pair of Hosts</a></span></dt>
-<dt><span class="sect2"><a href="Bv9ARM.ch04.html#id2571156">Copying the Shared Secret to Both Machines</a></span></dt>
-<dt><span class="sect2"><a href="Bv9ARM.ch04.html#id2571166">Informing the Servers of the Key's Existence</a></span></dt>
-<dt><span class="sect2"><a href="Bv9ARM.ch04.html#id2571203">Instructing the Server to Use the Key</a></span></dt>
-<dt><span class="sect2"><a href="Bv9ARM.ch04.html#id2571260">TSIG Key Based Access Control</a></span></dt>
-<dt><span class="sect2"><a href="Bv9ARM.ch04.html#id2571445">Errors</a></span></dt>
+<dt><span class="sect2"><a href="Bv9ARM.ch04.html#id2571342">Generate Shared Keys for Each Pair of Hosts</a></span></dt>
+<dt><span class="sect2"><a href="Bv9ARM.ch04.html#id2571553">Copying the Shared Secret to Both Machines</a></span></dt>
+<dt><span class="sect2"><a href="Bv9ARM.ch04.html#id2571563">Informing the Servers of the Key's Existence</a></span></dt>
+<dt><span class="sect2"><a href="Bv9ARM.ch04.html#id2571600">Instructing the Server to Use the Key</a></span></dt>
+<dt><span class="sect2"><a href="Bv9ARM.ch04.html#id2571657">TSIG Key Based Access Control</a></span></dt>
+<dt><span class="sect2"><a href="Bv9ARM.ch04.html#id2571706">Errors</a></span></dt>
</dl></dd>
-<dt><span class="sect1"><a href="Bv9ARM.ch04.html#id2571459">TKEY</a></span></dt>
-<dt><span class="sect1"><a href="Bv9ARM.ch04.html#id2571576">SIG(0)</a></span></dt>
+<dt><span class="sect1"><a href="Bv9ARM.ch04.html#id2571720">TKEY</a></span></dt>
+<dt><span class="sect1"><a href="Bv9ARM.ch04.html#id2563987">SIG(0)</a></span></dt>
<dt><span class="sect1"><a href="Bv9ARM.ch04.html#DNSSEC">DNSSEC</a></span></dt>
<dd><dl>
-<dt><span class="sect2"><a href="Bv9ARM.ch04.html#id2571644">Generating Keys</a></span></dt>
-<dt><span class="sect2"><a href="Bv9ARM.ch04.html#id2571792">Signing the Zone</a></span></dt>
-<dt><span class="sect2"><a href="Bv9ARM.ch04.html#id2571873">Configuring Servers</a></span></dt>
+<dt><span class="sect2"><a href="Bv9ARM.ch04.html#id2564055">Generating Keys</a></span></dt>
+<dt><span class="sect2"><a href="Bv9ARM.ch04.html#id2572189">Signing the Zone</a></span></dt>
+<dt><span class="sect2"><a href="Bv9ARM.ch04.html#id2572270">Configuring Servers</a></span></dt>
</dl></dd>
-<dt><span class="sect1"><a href="Bv9ARM.ch04.html#id2572110">IPv6 Support in <acronym class="acronym">BIND</acronym> 9</a></span></dt>
+<dt><span class="sect1"><a href="Bv9ARM.ch04.html#dnssec.dynamic.zones">DNSSEC, Dynamic Zones, and Automatic Signing</a></span></dt>
<dd><dl>
-<dt><span class="sect2"><a href="Bv9ARM.ch04.html#id2572172">Address Lookups Using AAAA Records</a></span></dt>
-<dt><span class="sect2"><a href="Bv9ARM.ch04.html#id2572194">Address to Name Lookups Using Nibble Format</a></span></dt>
+<dt><span class="sect2"><a href="Bv9ARM.ch04.html#id2607351">Converting from insecure to secure</a></span></dt>
+<dt><span class="sect2"><a href="Bv9ARM.ch04.html#id2563493">Dynamic DNS update method</a></span></dt>
+<dt><span class="sect2"><a href="Bv9ARM.ch04.html#id2563529">Fully automatic zone signing</a></span></dt>
+<dt><span class="sect2"><a href="Bv9ARM.ch04.html#id2563611">Private-type records</a></span></dt>
+<dt><span class="sect2"><a href="Bv9ARM.ch04.html#id2563649">DNSKEY rollovers</a></span></dt>
+<dt><span class="sect2"><a href="Bv9ARM.ch04.html#id2563661">Dynamic DNS update method</a></span></dt>
+<dt><span class="sect2"><a href="Bv9ARM.ch04.html#id2563763">Automatic key rollovers</a></span></dt>
+<dt><span class="sect2"><a href="Bv9ARM.ch04.html#id2563789">NSEC3PARAM rollovers via UPDATE</a></span></dt>
+<dt><span class="sect2"><a href="Bv9ARM.ch04.html#id2563799">Converting from NSEC to NSEC3</a></span></dt>
+<dt><span class="sect2"><a href="Bv9ARM.ch04.html#id2563809">Converting from NSEC3 to NSEC</a></span></dt>
+<dt><span class="sect2"><a href="Bv9ARM.ch04.html#id2563821">Converting from secure to insecure</a></span></dt>
+<dt><span class="sect2"><a href="Bv9ARM.ch04.html#id2563859">Periodic re-signing</a></span></dt>
+<dt><span class="sect2"><a href="Bv9ARM.ch04.html#id2563868">NSEC3 and OPTOUT</a></span></dt>
+</dl></dd>
+<dt><span class="sect1"><a href="Bv9ARM.ch04.html#rfc5011.support">Dynamic Trust Anchor Management</a></span></dt>
+<dd><dl>
+<dt><span class="sect2"><a href="Bv9ARM.ch04.html#id2607271">Validating Resolver</a></span></dt>
+<dt><span class="sect2"><a href="Bv9ARM.ch04.html#id2607293">Authoritative Server</a></span></dt>
+</dl></dd>
+<dt><span class="sect1"><a href="Bv9ARM.ch04.html#pkcs11">PKCS #11 (Cryptoki) support</a></span></dt>
+<dd><dl>
+<dt><span class="sect2"><a href="Bv9ARM.ch04.html#id2609524">Prerequisites</a></span></dt>
+<dt><span class="sect2"><a href="Bv9ARM.ch04.html#id2607678">Building BIND 9 with PKCS#11</a></span></dt>
+<dt><span class="sect2"><a href="Bv9ARM.ch04.html#id2607842">PKCS #11 Tools</a></span></dt>
+<dt><span class="sect2"><a href="Bv9ARM.ch04.html#id2607873">Using the HSM</a></span></dt>
+<dt><span class="sect2"><a href="Bv9ARM.ch04.html#id2609709">Specifying the engine on the command line</a></span></dt>
+<dt><span class="sect2"><a href="Bv9ARM.ch04.html#id2609755">Running named with automatic zone re-signing</a></span></dt>
+</dl></dd>
+<dt><span class="sect1"><a href="Bv9ARM.ch04.html#id2572490">IPv6 Support in <acronym class="acronym">BIND</acronym> 9</a></span></dt>
+<dd><dl>
+<dt><span class="sect2"><a href="Bv9ARM.ch04.html#id2572757">Address Lookups Using AAAA Records</a></span></dt>
+<dt><span class="sect2"><a href="Bv9ARM.ch04.html#id2572846">Address to Name Lookups Using Nibble Format</a></span></dt>
</dl></dd>
</dl></dd>
<dt><span class="chapter"><a href="Bv9ARM.ch05.html">5. The <acronym class="acronym">BIND</acronym> 9 Lightweight Resolver</a></span></dt>
<dd><dl>
-<dt><span class="sect1"><a href="Bv9ARM.ch05.html#id2572227">The Lightweight Resolver Library</a></span></dt>
+<dt><span class="sect1"><a href="Bv9ARM.ch05.html#id2572880">The Lightweight Resolver Library</a></span></dt>
<dt><span class="sect1"><a href="Bv9ARM.ch05.html#lwresd">Running a Resolver Daemon</a></span></dt>
</dl></dd>
<dt><span class="chapter"><a href="Bv9ARM.ch06.html">6. <acronym class="acronym">BIND</acronym> 9 Configuration Reference</a></span></dt>
@@ -127,55 +157,58 @@
<dt><span class="sect1"><a href="Bv9ARM.ch06.html#configuration_file_elements">Configuration File Elements</a></span></dt>
<dd><dl>
<dt><span class="sect2"><a href="Bv9ARM.ch06.html#address_match_lists">Address Match Lists</a></span></dt>
-<dt><span class="sect2"><a href="Bv9ARM.ch06.html#id2573606">Comment Syntax</a></span></dt>
+<dt><span class="sect2"><a href="Bv9ARM.ch06.html#id2574290">Comment Syntax</a></span></dt>
</dl></dd>
<dt><span class="sect1"><a href="Bv9ARM.ch06.html#Configuration_File_Grammar">Configuration File Grammar</a></span></dt>
<dd><dl>
-<dt><span class="sect2"><a href="Bv9ARM.ch06.html#id2574305"><span><strong class="command">acl</strong></span> Statement Grammar</a></span></dt>
+<dt><span class="sect2"><a href="Bv9ARM.ch06.html#id2574944"><span><strong class="command">acl</strong></span> Statement Grammar</a></span></dt>
<dt><span class="sect2"><a href="Bv9ARM.ch06.html#acl"><span><strong class="command">acl</strong></span> Statement Definition and
Usage</a></span></dt>
-<dt><span class="sect2"><a href="Bv9ARM.ch06.html#id2574494"><span><strong class="command">controls</strong></span> Statement Grammar</a></span></dt>
+<dt><span class="sect2"><a href="Bv9ARM.ch06.html#id2575133"><span><strong class="command">controls</strong></span> Statement Grammar</a></span></dt>
<dt><span class="sect2"><a href="Bv9ARM.ch06.html#controls_statement_definition_and_usage"><span><strong class="command">controls</strong></span> Statement Definition and
Usage</a></span></dt>
-<dt><span class="sect2"><a href="Bv9ARM.ch06.html#id2574923"><span><strong class="command">include</strong></span> Statement Grammar</a></span></dt>
-<dt><span class="sect2"><a href="Bv9ARM.ch06.html#id2574940"><span><strong class="command">include</strong></span> Statement Definition and
+<dt><span class="sect2"><a href="Bv9ARM.ch06.html#id2575425"><span><strong class="command">include</strong></span> Statement Grammar</a></span></dt>
+<dt><span class="sect2"><a href="Bv9ARM.ch06.html#id2575442"><span><strong class="command">include</strong></span> Statement Definition and
Usage</a></span></dt>
-<dt><span class="sect2"><a href="Bv9ARM.ch06.html#id2574964"><span><strong class="command">key</strong></span> Statement Grammar</a></span></dt>
-<dt><span class="sect2"><a href="Bv9ARM.ch06.html#id2574987"><span><strong class="command">key</strong></span> Statement Definition and Usage</a></span></dt>
-<dt><span class="sect2"><a href="Bv9ARM.ch06.html#id2575078"><span><strong class="command">logging</strong></span> Statement Grammar</a></span></dt>
-<dt><span class="sect2"><a href="Bv9ARM.ch06.html#id2575204"><span><strong class="command">logging</strong></span> Statement Definition and
+<dt><span class="sect2"><a href="Bv9ARM.ch06.html#id2575465"><span><strong class="command">key</strong></span> Statement Grammar</a></span></dt>
+<dt><span class="sect2"><a href="Bv9ARM.ch06.html#id2575489"><span><strong class="command">key</strong></span> Statement Definition and Usage</a></span></dt>
+<dt><span class="sect2"><a href="Bv9ARM.ch06.html#id2575648"><span><strong class="command">logging</strong></span> Statement Grammar</a></span></dt>
+<dt><span class="sect2"><a href="Bv9ARM.ch06.html#id2575842"><span><strong class="command">logging</strong></span> Statement Definition and
Usage</a></span></dt>
-<dt><span class="sect2"><a href="Bv9ARM.ch06.html#id2577401"><span><strong class="command">lwres</strong></span> Statement Grammar</a></span></dt>
-<dt><span class="sect2"><a href="Bv9ARM.ch06.html#id2577475"><span><strong class="command">lwres</strong></span> Statement Definition and Usage</a></span></dt>
-<dt><span class="sect2"><a href="Bv9ARM.ch06.html#id2577539"><span><strong class="command">masters</strong></span> Statement Grammar</a></span></dt>
-<dt><span class="sect2"><a href="Bv9ARM.ch06.html#id2577582"><span><strong class="command">masters</strong></span> Statement Definition and
+<dt><span class="sect2"><a href="Bv9ARM.ch06.html#id2577841"><span><strong class="command">lwres</strong></span> Statement Grammar</a></span></dt>
+<dt><span class="sect2"><a href="Bv9ARM.ch06.html#id2577982"><span><strong class="command">lwres</strong></span> Statement Definition and Usage</a></span></dt>
+<dt><span class="sect2"><a href="Bv9ARM.ch06.html#id2578046"><span><strong class="command">masters</strong></span> Statement Grammar</a></span></dt>
+<dt><span class="sect2"><a href="Bv9ARM.ch06.html#id2578090"><span><strong class="command">masters</strong></span> Statement Definition and
Usage</a></span></dt>
-<dt><span class="sect2"><a href="Bv9ARM.ch06.html#id2577597"><span><strong class="command">options</strong></span> Statement Grammar</a></span></dt>
+<dt><span class="sect2"><a href="Bv9ARM.ch06.html#id2578105"><span><strong class="command">options</strong></span> Statement Grammar</a></span></dt>
<dt><span class="sect2"><a href="Bv9ARM.ch06.html#options"><span><strong class="command">options</strong></span> Statement Definition and
Usage</a></span></dt>
<dt><span class="sect2"><a href="Bv9ARM.ch06.html#server_statement_grammar"><span><strong class="command">server</strong></span> Statement Grammar</a></span></dt>
<dt><span class="sect2"><a href="Bv9ARM.ch06.html#server_statement_definition_and_usage"><span><strong class="command">server</strong></span> Statement Definition and
Usage</a></span></dt>
<dt><span class="sect2"><a href="Bv9ARM.ch06.html#statschannels"><span><strong class="command">statistics-channels</strong></span> Statement Grammar</a></span></dt>
-<dt><span class="sect2"><a href="Bv9ARM.ch06.html#id2586907"><span><strong class="command">statistics-channels</strong></span> Statement Definition and
+<dt><span class="sect2"><a href="Bv9ARM.ch06.html#id2589239"><span><strong class="command">statistics-channels</strong></span> Statement Definition and
Usage</a></span></dt>
-<dt><span class="sect2"><a href="Bv9ARM.ch06.html#id2587062"><span><strong class="command">trusted-keys</strong></span> Statement Grammar</a></span></dt>
-<dt><span class="sect2"><a href="Bv9ARM.ch06.html#id2587113"><span><strong class="command">trusted-keys</strong></span> Statement Definition
+<dt><span class="sect2"><a href="Bv9ARM.ch06.html#trusted-keys"><span><strong class="command">trusted-keys</strong></span> Statement Grammar</a></span></dt>
+<dt><span class="sect2"><a href="Bv9ARM.ch06.html#id2589379"><span><strong class="command">trusted-keys</strong></span> Statement Definition
+ and Usage</a></span></dt>
+<dt><span class="sect2"><a href="Bv9ARM.ch06.html#id2589494"><span><strong class="command">managed-keys</strong></span> Statement Grammar</a></span></dt>
+<dt><span class="sect2"><a href="Bv9ARM.ch06.html#managed-keys"><span><strong class="command">managed-keys</strong></span> Statement Definition
and Usage</a></span></dt>
<dt><span class="sect2"><a href="Bv9ARM.ch06.html#view_statement_grammar"><span><strong class="command">view</strong></span> Statement Grammar</a></span></dt>
-<dt><span class="sect2"><a href="Bv9ARM.ch06.html#id2587195"><span><strong class="command">view</strong></span> Statement Definition and Usage</a></span></dt>
+<dt><span class="sect2"><a href="Bv9ARM.ch06.html#id2589851"><span><strong class="command">view</strong></span> Statement Definition and Usage</a></span></dt>
<dt><span class="sect2"><a href="Bv9ARM.ch06.html#zone_statement_grammar"><span><strong class="command">zone</strong></span>
Statement Grammar</a></span></dt>
-<dt><span class="sect2"><a href="Bv9ARM.ch06.html#id2588600"><span><strong class="command">zone</strong></span> Statement Definition and Usage</a></span></dt>
+<dt><span class="sect2"><a href="Bv9ARM.ch06.html#id2591396"><span><strong class="command">zone</strong></span> Statement Definition and Usage</a></span></dt>
</dl></dd>
-<dt><span class="sect1"><a href="Bv9ARM.ch06.html#id2591216">Zone File</a></span></dt>
+<dt><span class="sect1"><a href="Bv9ARM.ch06.html#id2594660">Zone File</a></span></dt>
<dd><dl>
<dt><span class="sect2"><a href="Bv9ARM.ch06.html#types_of_resource_records_and_when_to_use_them">Types of Resource Records and When to Use Them</a></span></dt>
-<dt><span class="sect2"><a href="Bv9ARM.ch06.html#id2593378">Discussion of MX Records</a></span></dt>
+<dt><span class="sect2"><a href="Bv9ARM.ch06.html#id2596822">Discussion of MX Records</a></span></dt>
<dt><span class="sect2"><a href="Bv9ARM.ch06.html#Setting_TTLs">Setting TTLs</a></span></dt>
-<dt><span class="sect2"><a href="Bv9ARM.ch06.html#id2593993">Inverse Mapping in IPv4</a></span></dt>
-<dt><span class="sect2"><a href="Bv9ARM.ch06.html#id2594188">Other Zone File Directives</a></span></dt>
-<dt><span class="sect2"><a href="Bv9ARM.ch06.html#id2594461"><acronym class="acronym">BIND</acronym> Master File Extension: the <span><strong class="command">$GENERATE</strong></span> Directive</a></span></dt>
+<dt><span class="sect2"><a href="Bv9ARM.ch06.html#id2597574">Inverse Mapping in IPv4</a></span></dt>
+<dt><span class="sect2"><a href="Bv9ARM.ch06.html#id2597701">Other Zone File Directives</a></span></dt>
+<dt><span class="sect2"><a href="Bv9ARM.ch06.html#id2597974"><acronym class="acronym">BIND</acronym> Master File Extension: the <span><strong class="command">$GENERATE</strong></span> Directive</a></span></dt>
<dt><span class="sect2"><a href="Bv9ARM.ch06.html#zonefile_format">Additional File Formats</a></span></dt>
</dl></dd>
<dt><span class="sect1"><a href="Bv9ARM.ch06.html#statistics">BIND9 Statistics</a></span></dt>
@@ -184,31 +217,41 @@
<dt><span class="chapter"><a href="Bv9ARM.ch07.html">7. <acronym class="acronym">BIND</acronym> 9 Security Considerations</a></span></dt>
<dd><dl>
<dt><span class="sect1"><a href="Bv9ARM.ch07.html#Access_Control_Lists">Access Control Lists</a></span></dt>
-<dt><span class="sect1"><a href="Bv9ARM.ch07.html#id2599016"><span><strong class="command">Chroot</strong></span> and <span><strong class="command">Setuid</strong></span></a></span></dt>
+<dt><span class="sect1"><a href="Bv9ARM.ch07.html#id2602626"><span><strong class="command">Chroot</strong></span> and <span><strong class="command">Setuid</strong></span></a></span></dt>
<dd><dl>
-<dt><span class="sect2"><a href="Bv9ARM.ch07.html#id2599234">The <span><strong class="command">chroot</strong></span> Environment</a></span></dt>
-<dt><span class="sect2"><a href="Bv9ARM.ch07.html#id2599362">Using the <span><strong class="command">setuid</strong></span> Function</a></span></dt>
+<dt><span class="sect2"><a href="Bv9ARM.ch07.html#id2602707">The <span><strong class="command">chroot</strong></span> Environment</a></span></dt>
+<dt><span class="sect2"><a href="Bv9ARM.ch07.html#id2602766">Using the <span><strong class="command">setuid</strong></span> Function</a></span></dt>
</dl></dd>
<dt><span class="sect1"><a href="Bv9ARM.ch07.html#dynamic_update_security">Dynamic Update Security</a></span></dt>
</dl></dd>
<dt><span class="chapter"><a href="Bv9ARM.ch08.html">8. Troubleshooting</a></span></dt>
<dd><dl>
-<dt><span class="sect1"><a href="Bv9ARM.ch08.html#id2599442">Common Problems</a></span></dt>
-<dd><dl><dt><span class="sect2"><a href="Bv9ARM.ch08.html#id2599447">It's not working; how can I figure out what's wrong?</a></span></dt></dl></dd>
-<dt><span class="sect1"><a href="Bv9ARM.ch08.html#id2599459">Incrementing and Changing the Serial Number</a></span></dt>
-<dt><span class="sect1"><a href="Bv9ARM.ch08.html#id2599476">Where Can I Get Help?</a></span></dt>
+<dt><span class="sect1"><a href="Bv9ARM.ch08.html#id2602915">Common Problems</a></span></dt>
+<dd><dl><dt><span class="sect2"><a href="Bv9ARM.ch08.html#id2602920">It's not working; how can I figure out what's wrong?</a></span></dt></dl></dd>
+<dt><span class="sect1"><a href="Bv9ARM.ch08.html#id2602932">Incrementing and Changing the Serial Number</a></span></dt>
+<dt><span class="sect1"><a href="Bv9ARM.ch08.html#id2602949">Where Can I Get Help?</a></span></dt>
</dl></dd>
<dt><span class="appendix"><a href="Bv9ARM.ch09.html">A. Appendices</a></span></dt>
<dd><dl>
-<dt><span class="sect1"><a href="Bv9ARM.ch09.html#id2599606">Acknowledgments</a></span></dt>
+<dt><span class="sect1"><a href="Bv9ARM.ch09.html#id2603147">Acknowledgments</a></span></dt>
<dd><dl><dt><span class="sect2"><a href="Bv9ARM.ch09.html#historical_dns_information">A Brief History of the <acronym class="acronym">DNS</acronym> and <acronym class="acronym">BIND</acronym></a></span></dt></dl></dd>
-<dt><span class="sect1"><a href="Bv9ARM.ch09.html#id2599778">General <acronym class="acronym">DNS</acronym> Reference Information</a></span></dt>
+<dt><span class="sect1"><a href="Bv9ARM.ch09.html#id2603319">General <acronym class="acronym">DNS</acronym> Reference Information</a></span></dt>
<dd><dl><dt><span class="sect2"><a href="Bv9ARM.ch09.html#ipv6addresses">IPv6 addresses (AAAA)</a></span></dt></dl></dd>
<dt><span class="sect1"><a href="Bv9ARM.ch09.html#bibliography">Bibliography (and Suggested Reading)</a></span></dt>
<dd><dl>
<dt><span class="sect2"><a href="Bv9ARM.ch09.html#rfcs">Request for Comments (RFCs)</a></span></dt>
<dt><span class="sect2"><a href="Bv9ARM.ch09.html#internet_drafts">Internet Drafts</a></span></dt>
-<dt><span class="sect2"><a href="Bv9ARM.ch09.html#id2603126">Other Documents About <acronym class="acronym">BIND</acronym></a></span></dt>
+<dt><span class="sect2"><a href="Bv9ARM.ch09.html#id2606462">Other Documents About <acronym class="acronym">BIND</acronym></a></span></dt>
+</dl></dd>
+<dt><span class="sect1"><a href="Bv9ARM.ch09.html#bind9.library">BIND 9 DNS Library Support</a></span></dt>
+<dd><dl>
+<dt><span class="sect2"><a href="Bv9ARM.ch09.html#id2608789">Prerequisite</a></span></dt>
+<dt><span class="sect2"><a href="Bv9ARM.ch09.html#id2608798">Compilation</a></span></dt>
+<dt><span class="sect2"><a href="Bv9ARM.ch09.html#id2608004">Installation</a></span></dt>
+<dt><span class="sect2"><a href="Bv9ARM.ch09.html#id2608035">Known Defects/Restrictions</a></span></dt>
+<dt><span class="sect2"><a href="Bv9ARM.ch09.html#id2608112">The dns.conf File</a></span></dt>
+<dt><span class="sect2"><a href="Bv9ARM.ch09.html#id2608138">Sample Applications</a></span></dt>
+<dt><span class="sect2"><a href="Bv9ARM.ch09.html#id2609111">Library References</a></span></dt>
</dl></dd>
</dl></dd>
<dt><span class="reference"><a href="Bv9ARM.ch10.html">I. Manual pages</a></span></dt>
@@ -229,6 +272,12 @@
<span class="refentrytitle"><a href="man.dnssec-keygen.html"><span class="application">dnssec-keygen</span></a></span><span class="refpurpose"> &#8212; DNSSEC key generation tool</span>
</dt>
<dt>
+<span class="refentrytitle"><a href="man.dnssec-revoke.html"><span class="application">dnssec-revoke</span></a></span><span class="refpurpose"> &#8212; Set the REVOKED bit on a DNSSEC key</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="man.dnssec-settime.html"><span class="application">dnssec-settime</span></a></span><span class="refpurpose"> &#8212; Set the key timing metadata for a DNSSEC key</span>
+</dt>
+<dt>
<span class="refentrytitle"><a href="man.dnssec-signzone.html"><span class="application">dnssec-signzone</span></a></span><span class="refpurpose"> &#8212; DNSSEC zone signing tool</span>
</dt>
<dt>
@@ -241,6 +290,9 @@
<span class="refentrytitle"><a href="man.named.html"><span class="application">named</span></a></span><span class="refpurpose"> &#8212; Internet domain name server</span>
</dt>
<dt>
+<span class="refentrytitle"><a href="man.named-journalprint.html"><span class="application">named-journalprint</span></a></span><span class="refpurpose"> &#8212; print zone journal in human-readable form</span>
+</dt>
+<dt>
<span class="refentrytitle"><a href="man.nsupdate.html"><span class="application">nsupdate</span></a></span><span class="refpurpose"> &#8212; Dynamic DNS update utility</span>
</dt>
<dt>
@@ -252,6 +304,21 @@
<dt>
<span class="refentrytitle"><a href="man.rndc-confgen.html"><span class="application">rndc-confgen</span></a></span><span class="refpurpose"> &#8212; rndc key generation tool</span>
</dt>
+<dt>
+<span class="refentrytitle"><a href="man.ddns-confgen.html"><span class="application">ddns-confgen</span></a></span><span class="refpurpose"> &#8212; ddns key generation tool</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="man.arpaname.html"><span class="application">arpaname</span></a></span><span class="refpurpose"> &#8212; translate IP addresses to the corresponding ARPA names</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="man.genrandom.html"><span class="application">genrandom</span></a></span><span class="refpurpose"> &#8212; generate a file containing random data</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="man.isc-hmac-fixup.html"><span class="application">isc-hmac-fixup</span></a></span><span class="refpurpose"> &#8212; fixes HMAC keys generated by older versions of BIND</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="man.nsec3hash.html"><span class="application">nsec3hash</span></a></span><span class="refpurpose"> &#8212; generate NSEC3 hash</span>
+</dt>
</dl></dd>
</dl>
</div>
diff --git a/contrib/bind9/doc/arm/Bv9ARM.pdf b/contrib/bind9/doc/arm/Bv9ARM.pdf
index 9fc0349..a8a88dc 100644
--- a/contrib/bind9/doc/arm/Bv9ARM.pdf
+++ b/contrib/bind9/doc/arm/Bv9ARM.pdf
@@ -321,738 +321,1062 @@ endobj
<< /S /GoTo /D (section.4.9) >>
endobj
220 0 obj
-(4.9 IPv6 Support in BIND 9)
+(4.9 DNSSEC, Dynamic Zones, and Automatic Signing)
endobj
221 0 obj
<< /S /GoTo /D (subsection.4.9.1) >>
endobj
224 0 obj
-(4.9.1 Address Lookups Using AAAA Records)
+(4.9.1 Converting from insecure to secure)
endobj
225 0 obj
<< /S /GoTo /D (subsection.4.9.2) >>
endobj
228 0 obj
-(4.9.2 Address to Name Lookups Using Nibble Format)
+(4.9.2 Dynamic DNS update method)
endobj
229 0 obj
-<< /S /GoTo /D (chapter.5) >>
+<< /S /GoTo /D (subsection.4.9.3) >>
endobj
232 0 obj
-(5 The BIND 9 Lightweight Resolver)
+(4.9.3 Fully automatic zone signing)
endobj
233 0 obj
-<< /S /GoTo /D (section.5.1) >>
+<< /S /GoTo /D (subsection.4.9.4) >>
endobj
236 0 obj
-(5.1 The Lightweight Resolver Library)
+(4.9.4 Private-type records)
endobj
237 0 obj
-<< /S /GoTo /D (section.5.2) >>
+<< /S /GoTo /D (subsection.4.9.5) >>
endobj
240 0 obj
-(5.2 Running a Resolver Daemon)
+(4.9.5 DNSKEY rollovers)
endobj
241 0 obj
-<< /S /GoTo /D (chapter.6) >>
+<< /S /GoTo /D (subsection.4.9.6) >>
endobj
244 0 obj
-(6 BIND 9 Configuration Reference)
+(4.9.6 Dynamic DNS update method)
endobj
245 0 obj
-<< /S /GoTo /D (section.6.1) >>
+<< /S /GoTo /D (subsection.4.9.7) >>
endobj
248 0 obj
-(6.1 Configuration File Elements)
+(4.9.7 Automatic key rollovers)
endobj
249 0 obj
-<< /S /GoTo /D (subsection.6.1.1) >>
+<< /S /GoTo /D (subsection.4.9.8) >>
endobj
252 0 obj
-(6.1.1 Address Match Lists)
+(4.9.8 NSEC3PARAM rollovers via UPDATE)
endobj
253 0 obj
-<< /S /GoTo /D (subsubsection.6.1.1.1) >>
+<< /S /GoTo /D (subsection.4.9.9) >>
endobj
256 0 obj
-(6.1.1.1 Syntax)
+(4.9.9 Converting from NSEC to NSEC3)
endobj
257 0 obj
-<< /S /GoTo /D (subsubsection.6.1.1.2) >>
+<< /S /GoTo /D (subsection.4.9.10) >>
endobj
260 0 obj
-(6.1.1.2 Definition and Usage)
+(4.9.10 Converting from NSEC3 to NSEC)
endobj
261 0 obj
-<< /S /GoTo /D (subsection.6.1.2) >>
+<< /S /GoTo /D (subsection.4.9.11) >>
endobj
264 0 obj
-(6.1.2 Comment Syntax)
+(4.9.11 Converting from secure to insecure)
endobj
265 0 obj
-<< /S /GoTo /D (subsubsection.6.1.2.1) >>
+<< /S /GoTo /D (subsection.4.9.12) >>
endobj
268 0 obj
-(6.1.2.1 Syntax)
+(4.9.12 Periodic re-signing)
endobj
269 0 obj
-<< /S /GoTo /D (subsubsection.6.1.2.2) >>
+<< /S /GoTo /D (subsection.4.9.13) >>
endobj
272 0 obj
-(6.1.2.2 Definition and Usage)
+(4.9.13 NSEC3 and OPTOUT)
endobj
273 0 obj
-<< /S /GoTo /D (section.6.2) >>
+<< /S /GoTo /D (section.4.10) >>
endobj
276 0 obj
-(6.2 Configuration File Grammar)
+(4.10 Dynamic Trust Anchor Management)
endobj
277 0 obj
-<< /S /GoTo /D (subsection.6.2.1) >>
+<< /S /GoTo /D (subsection.4.10.1) >>
endobj
280 0 obj
-(6.2.1 acl Statement Grammar)
+(4.10.1 Validating Resolver)
endobj
281 0 obj
-<< /S /GoTo /D (subsection.6.2.2) >>
+<< /S /GoTo /D (subsection.4.10.2) >>
endobj
284 0 obj
-(6.2.2 acl Statement Definition and Usage)
+(4.10.2 Authoritative Server)
endobj
285 0 obj
-<< /S /GoTo /D (subsection.6.2.3) >>
+<< /S /GoTo /D (section.4.11) >>
endobj
288 0 obj
-(6.2.3 controls Statement Grammar)
+(4.11 PKCS \04311 \(Cryptoki\) support)
endobj
289 0 obj
-<< /S /GoTo /D (subsection.6.2.4) >>
+<< /S /GoTo /D (subsection.4.11.1) >>
endobj
292 0 obj
-(6.2.4 controls Statement Definition and Usage)
+(4.11.1 Prerequisites)
endobj
293 0 obj
-<< /S /GoTo /D (subsection.6.2.5) >>
+<< /S /GoTo /D (subsubsection.4.11.1.1) >>
endobj
296 0 obj
-(6.2.5 include Statement Grammar)
+(4.11.1.1 Building OpenSSL for the AEP Keyper on Linux)
endobj
297 0 obj
-<< /S /GoTo /D (subsection.6.2.6) >>
+<< /S /GoTo /D (subsubsection.4.11.1.2) >>
endobj
300 0 obj
-(6.2.6 include Statement Definition and Usage)
+(4.11.1.2 Building OpenSSL for the SCA 6000 on Solaris)
endobj
301 0 obj
-<< /S /GoTo /D (subsection.6.2.7) >>
+<< /S /GoTo /D (subsection.4.11.2) >>
endobj
304 0 obj
-(6.2.7 key Statement Grammar)
+(4.11.2 Building BIND 9 with PKCS\04311)
endobj
305 0 obj
-<< /S /GoTo /D (subsection.6.2.8) >>
+<< /S /GoTo /D (subsubsection.4.11.2.1) >>
endobj
308 0 obj
-(6.2.8 key Statement Definition and Usage)
+(4.11.2.1 Configuring BIND 9 for Linux)
endobj
309 0 obj
-<< /S /GoTo /D (subsection.6.2.9) >>
+<< /S /GoTo /D (subsubsection.4.11.2.2) >>
endobj
312 0 obj
-(6.2.9 logging Statement Grammar)
+(4.11.2.2 Configuring BIND 9 for Solaris)
endobj
313 0 obj
-<< /S /GoTo /D (subsection.6.2.10) >>
+<< /S /GoTo /D (subsection.4.11.3) >>
endobj
316 0 obj
-(6.2.10 logging Statement Definition and Usage)
+(4.11.3 PKCS \04311 Tools)
endobj
317 0 obj
-<< /S /GoTo /D (subsubsection.6.2.10.1) >>
+<< /S /GoTo /D (subsection.4.11.4) >>
endobj
320 0 obj
-(6.2.10.1 The channel Phrase)
+(4.11.4 Using the HSM)
endobj
321 0 obj
-<< /S /GoTo /D (subsubsection.6.2.10.2) >>
+<< /S /GoTo /D (subsection.4.11.5) >>
endobj
324 0 obj
-(6.2.10.2 The category Phrase)
+(4.11.5 Specifying the engine on the command line)
endobj
325 0 obj
-<< /S /GoTo /D (subsubsection.6.2.10.3) >>
+<< /S /GoTo /D (subsection.4.11.6) >>
endobj
328 0 obj
-(6.2.10.3 The query-errors Category)
+(4.11.6 Running named with automatic zone re-signing)
endobj
329 0 obj
-<< /S /GoTo /D (subsection.6.2.11) >>
+<< /S /GoTo /D (section.4.12) >>
endobj
332 0 obj
-(6.2.11 lwres Statement Grammar)
+(4.12 IPv6 Support in BIND 9)
endobj
333 0 obj
-<< /S /GoTo /D (subsection.6.2.12) >>
+<< /S /GoTo /D (subsection.4.12.1) >>
endobj
336 0 obj
-(6.2.12 lwres Statement Definition and Usage)
+(4.12.1 Address Lookups Using AAAA Records)
endobj
337 0 obj
-<< /S /GoTo /D (subsection.6.2.13) >>
+<< /S /GoTo /D (subsection.4.12.2) >>
endobj
340 0 obj
-(6.2.13 masters Statement Grammar)
+(4.12.2 Address to Name Lookups Using Nibble Format)
endobj
341 0 obj
-<< /S /GoTo /D (subsection.6.2.14) >>
+<< /S /GoTo /D (chapter.5) >>
endobj
344 0 obj
-(6.2.14 masters Statement Definition and Usage)
+(5 The BIND 9 Lightweight Resolver)
endobj
345 0 obj
-<< /S /GoTo /D (subsection.6.2.15) >>
+<< /S /GoTo /D (section.5.1) >>
endobj
348 0 obj
-(6.2.15 options Statement Grammar)
+(5.1 The Lightweight Resolver Library)
endobj
349 0 obj
-<< /S /GoTo /D (subsection.6.2.16) >>
+<< /S /GoTo /D (section.5.2) >>
endobj
352 0 obj
-(6.2.16 options Statement Definition and Usage)
+(5.2 Running a Resolver Daemon)
endobj
353 0 obj
-<< /S /GoTo /D (subsubsection.6.2.16.1) >>
+<< /S /GoTo /D (chapter.6) >>
endobj
356 0 obj
-(6.2.16.1 Boolean Options)
+(6 BIND 9 Configuration Reference)
endobj
357 0 obj
-<< /S /GoTo /D (subsubsection.6.2.16.2) >>
+<< /S /GoTo /D (section.6.1) >>
endobj
360 0 obj
-(6.2.16.2 Forwarding)
+(6.1 Configuration File Elements)
endobj
361 0 obj
-<< /S /GoTo /D (subsubsection.6.2.16.3) >>
+<< /S /GoTo /D (subsection.6.1.1) >>
endobj
364 0 obj
-(6.2.16.3 Dual-stack Servers)
+(6.1.1 Address Match Lists)
endobj
365 0 obj
-<< /S /GoTo /D (subsubsection.6.2.16.4) >>
+<< /S /GoTo /D (subsubsection.6.1.1.1) >>
endobj
368 0 obj
-(6.2.16.4 Access Control)
+(6.1.1.1 Syntax)
endobj
369 0 obj
-<< /S /GoTo /D (subsubsection.6.2.16.5) >>
+<< /S /GoTo /D (subsubsection.6.1.1.2) >>
endobj
372 0 obj
-(6.2.16.5 Interfaces)
+(6.1.1.2 Definition and Usage)
endobj
373 0 obj
-<< /S /GoTo /D (subsubsection.6.2.16.6) >>
+<< /S /GoTo /D (subsection.6.1.2) >>
endobj
376 0 obj
-(6.2.16.6 Query Address)
+(6.1.2 Comment Syntax)
endobj
377 0 obj
-<< /S /GoTo /D (subsubsection.6.2.16.7) >>
+<< /S /GoTo /D (subsubsection.6.1.2.1) >>
endobj
380 0 obj
-(6.2.16.7 Zone Transfers)
+(6.1.2.1 Syntax)
endobj
381 0 obj
-<< /S /GoTo /D (subsubsection.6.2.16.8) >>
+<< /S /GoTo /D (subsubsection.6.1.2.2) >>
endobj
384 0 obj
-(6.2.16.8 UDP Port Lists)
+(6.1.2.2 Definition and Usage)
endobj
385 0 obj
-<< /S /GoTo /D (subsubsection.6.2.16.9) >>
+<< /S /GoTo /D (section.6.2) >>
endobj
388 0 obj
-(6.2.16.9 Operating System Resource Limits)
+(6.2 Configuration File Grammar)
endobj
389 0 obj
-<< /S /GoTo /D (subsubsection.6.2.16.10) >>
+<< /S /GoTo /D (subsection.6.2.1) >>
endobj
392 0 obj
-(6.2.16.10 Server Resource Limits)
+(6.2.1 acl Statement Grammar)
endobj
393 0 obj
-<< /S /GoTo /D (subsubsection.6.2.16.11) >>
+<< /S /GoTo /D (subsection.6.2.2) >>
endobj
396 0 obj
-(6.2.16.11 Periodic Task Intervals)
+(6.2.2 acl Statement Definition and Usage)
endobj
397 0 obj
-<< /S /GoTo /D (subsubsection.6.2.16.12) >>
+<< /S /GoTo /D (subsection.6.2.3) >>
endobj
400 0 obj
-(6.2.16.12 Topology)
+(6.2.3 controls Statement Grammar)
endobj
401 0 obj
-<< /S /GoTo /D (subsubsection.6.2.16.13) >>
+<< /S /GoTo /D (subsection.6.2.4) >>
endobj
404 0 obj
-(6.2.16.13 The sortlist Statement)
+(6.2.4 controls Statement Definition and Usage)
endobj
405 0 obj
-<< /S /GoTo /D (subsubsection.6.2.16.14) >>
+<< /S /GoTo /D (subsection.6.2.5) >>
endobj
408 0 obj
-(6.2.16.14 RRset Ordering)
+(6.2.5 include Statement Grammar)
endobj
409 0 obj
-<< /S /GoTo /D (subsubsection.6.2.16.15) >>
+<< /S /GoTo /D (subsection.6.2.6) >>
endobj
412 0 obj
-(6.2.16.15 Tuning)
+(6.2.6 include Statement Definition and Usage)
endobj
413 0 obj
-<< /S /GoTo /D (subsubsection.6.2.16.16) >>
+<< /S /GoTo /D (subsection.6.2.7) >>
endobj
416 0 obj
-(6.2.16.16 Built-in server information zones)
+(6.2.7 key Statement Grammar)
endobj
417 0 obj
-<< /S /GoTo /D (subsubsection.6.2.16.17) >>
+<< /S /GoTo /D (subsection.6.2.8) >>
endobj
420 0 obj
-(6.2.16.17 Built-in Empty Zones)
+(6.2.8 key Statement Definition and Usage)
endobj
421 0 obj
-<< /S /GoTo /D (subsubsection.6.2.16.18) >>
+<< /S /GoTo /D (subsection.6.2.9) >>
endobj
424 0 obj
-(6.2.16.18 Additional Section Caching)
+(6.2.9 logging Statement Grammar)
endobj
425 0 obj
-<< /S /GoTo /D (subsection.6.2.17) >>
+<< /S /GoTo /D (subsection.6.2.10) >>
endobj
428 0 obj
-(6.2.17 server Statement Grammar)
+(6.2.10 logging Statement Definition and Usage)
endobj
429 0 obj
-<< /S /GoTo /D (subsection.6.2.18) >>
+<< /S /GoTo /D (subsubsection.6.2.10.1) >>
endobj
432 0 obj
-(6.2.18 server Statement Definition and Usage)
+(6.2.10.1 The channel Phrase)
endobj
433 0 obj
-<< /S /GoTo /D (subsection.6.2.19) >>
+<< /S /GoTo /D (subsubsection.6.2.10.2) >>
endobj
436 0 obj
-(6.2.19 statistics-channels Statement Grammar)
+(6.2.10.2 The category Phrase)
endobj
437 0 obj
-<< /S /GoTo /D (subsection.6.2.20) >>
+<< /S /GoTo /D (subsubsection.6.2.10.3) >>
endobj
440 0 obj
-(6.2.20 statistics-channels Statement Definition and Usage)
+(6.2.10.3 The query-errors Category)
endobj
441 0 obj
-<< /S /GoTo /D (subsection.6.2.21) >>
+<< /S /GoTo /D (subsection.6.2.11) >>
endobj
444 0 obj
-(6.2.21 trusted-keys Statement Grammar)
+(6.2.11 lwres Statement Grammar)
endobj
445 0 obj
-<< /S /GoTo /D (subsection.6.2.22) >>
+<< /S /GoTo /D (subsection.6.2.12) >>
endobj
448 0 obj
-(6.2.22 trusted-keys Statement Definition and Usage)
+(6.2.12 lwres Statement Definition and Usage)
endobj
449 0 obj
-<< /S /GoTo /D (subsection.6.2.23) >>
+<< /S /GoTo /D (subsection.6.2.13) >>
endobj
452 0 obj
-(6.2.23 view Statement Grammar)
+(6.2.13 masters Statement Grammar)
endobj
453 0 obj
-<< /S /GoTo /D (subsection.6.2.24) >>
+<< /S /GoTo /D (subsection.6.2.14) >>
endobj
456 0 obj
-(6.2.24 view Statement Definition and Usage)
+(6.2.14 masters Statement Definition and Usage)
endobj
457 0 obj
-<< /S /GoTo /D (subsection.6.2.25) >>
+<< /S /GoTo /D (subsection.6.2.15) >>
endobj
460 0 obj
-(6.2.25 zone Statement Grammar)
+(6.2.15 options Statement Grammar)
endobj
461 0 obj
-<< /S /GoTo /D (subsection.6.2.26) >>
+<< /S /GoTo /D (subsection.6.2.16) >>
endobj
464 0 obj
-(6.2.26 zone Statement Definition and Usage)
+(6.2.16 options Statement Definition and Usage)
endobj
465 0 obj
-<< /S /GoTo /D (subsubsection.6.2.26.1) >>
+<< /S /GoTo /D (subsubsection.6.2.16.1) >>
endobj
468 0 obj
-(6.2.26.1 Zone Types)
+(6.2.16.1 Boolean Options)
endobj
469 0 obj
-<< /S /GoTo /D (subsubsection.6.2.26.2) >>
+<< /S /GoTo /D (subsubsection.6.2.16.2) >>
endobj
472 0 obj
-(6.2.26.2 Class)
+(6.2.16.2 Forwarding)
endobj
473 0 obj
-<< /S /GoTo /D (subsubsection.6.2.26.3) >>
+<< /S /GoTo /D (subsubsection.6.2.16.3) >>
endobj
476 0 obj
-(6.2.26.3 Zone Options)
+(6.2.16.3 Dual-stack Servers)
endobj
477 0 obj
-<< /S /GoTo /D (subsubsection.6.2.26.4) >>
+<< /S /GoTo /D (subsubsection.6.2.16.4) >>
endobj
480 0 obj
-(6.2.26.4 Dynamic Update Policies)
+(6.2.16.4 Access Control)
endobj
481 0 obj
-<< /S /GoTo /D (section.6.3) >>
+<< /S /GoTo /D (subsubsection.6.2.16.5) >>
endobj
484 0 obj
-(6.3 Zone File)
+(6.2.16.5 Interfaces)
endobj
485 0 obj
-<< /S /GoTo /D (subsection.6.3.1) >>
+<< /S /GoTo /D (subsubsection.6.2.16.6) >>
endobj
488 0 obj
-(6.3.1 Types of Resource Records and When to Use Them)
+(6.2.16.6 Query Address)
endobj
489 0 obj
-<< /S /GoTo /D (subsubsection.6.3.1.1) >>
+<< /S /GoTo /D (subsubsection.6.2.16.7) >>
endobj
492 0 obj
-(6.3.1.1 Resource Records)
+(6.2.16.7 Zone Transfers)
endobj
493 0 obj
-<< /S /GoTo /D (subsubsection.6.3.1.2) >>
+<< /S /GoTo /D (subsubsection.6.2.16.8) >>
endobj
496 0 obj
-(6.3.1.2 Textual expression of RRs)
+(6.2.16.8 UDP Port Lists)
endobj
497 0 obj
-<< /S /GoTo /D (subsection.6.3.2) >>
+<< /S /GoTo /D (subsubsection.6.2.16.9) >>
endobj
500 0 obj
-(6.3.2 Discussion of MX Records)
+(6.2.16.9 Operating System Resource Limits)
endobj
501 0 obj
-<< /S /GoTo /D (subsection.6.3.3) >>
+<< /S /GoTo /D (subsubsection.6.2.16.10) >>
endobj
504 0 obj
-(6.3.3 Setting TTLs)
+(6.2.16.10 Server Resource Limits)
endobj
505 0 obj
-<< /S /GoTo /D (subsection.6.3.4) >>
+<< /S /GoTo /D (subsubsection.6.2.16.11) >>
endobj
508 0 obj
-(6.3.4 Inverse Mapping in IPv4)
+(6.2.16.11 Periodic Task Intervals)
endobj
509 0 obj
-<< /S /GoTo /D (subsection.6.3.5) >>
+<< /S /GoTo /D (subsubsection.6.2.16.12) >>
endobj
512 0 obj
-(6.3.5 Other Zone File Directives)
+(6.2.16.12 Topology)
endobj
513 0 obj
-<< /S /GoTo /D (subsubsection.6.3.5.1) >>
+<< /S /GoTo /D (subsubsection.6.2.16.13) >>
endobj
516 0 obj
-(6.3.5.1 The @ \(at-sign\))
+(6.2.16.13 The sortlist Statement)
endobj
517 0 obj
-<< /S /GoTo /D (subsubsection.6.3.5.2) >>
+<< /S /GoTo /D (subsubsection.6.2.16.14) >>
endobj
520 0 obj
-(6.3.5.2 The \044ORIGIN Directive)
+(6.2.16.14 RRset Ordering)
endobj
521 0 obj
-<< /S /GoTo /D (subsubsection.6.3.5.3) >>
+<< /S /GoTo /D (subsubsection.6.2.16.15) >>
endobj
524 0 obj
-(6.3.5.3 The \044INCLUDE Directive)
+(6.2.16.15 Tuning)
endobj
525 0 obj
-<< /S /GoTo /D (subsubsection.6.3.5.4) >>
+<< /S /GoTo /D (subsubsection.6.2.16.16) >>
endobj
528 0 obj
-(6.3.5.4 The \044TTL Directive)
+(6.2.16.16 Built-in server information zones)
endobj
529 0 obj
-<< /S /GoTo /D (subsection.6.3.6) >>
+<< /S /GoTo /D (subsubsection.6.2.16.17) >>
endobj
532 0 obj
-(6.3.6 BIND Master File Extension: the \044GENERATE Directive)
+(6.2.16.17 Built-in Empty Zones)
endobj
533 0 obj
-<< /S /GoTo /D (subsection.6.3.7) >>
+<< /S /GoTo /D (subsubsection.6.2.16.18) >>
endobj
536 0 obj
-(6.3.7 Additional File Formats)
+(6.2.16.18 Additional Section Caching)
endobj
537 0 obj
-<< /S /GoTo /D (section.6.4) >>
+<< /S /GoTo /D (subsubsection.6.2.16.19) >>
endobj
540 0 obj
-(6.4 BIND9 Statistics)
+(6.2.16.19 Content Filtering)
endobj
541 0 obj
-<< /S /GoTo /D (subsubsection.6.4.0.1) >>
+<< /S /GoTo /D (subsubsection.6.2.16.20) >>
endobj
544 0 obj
-(6.4.0.1 The Statistics File)
+(6.2.16.20 Response Policy Zone \(RPZ\) Rewriting)
endobj
545 0 obj
-<< /S /GoTo /D (subsection.6.4.1) >>
+<< /S /GoTo /D (subsection.6.2.17) >>
endobj
548 0 obj
-(6.4.1 Statistics Counters)
+(6.2.17 server Statement Grammar)
endobj
549 0 obj
-<< /S /GoTo /D (subsubsection.6.4.1.1) >>
+<< /S /GoTo /D (subsection.6.2.18) >>
endobj
552 0 obj
-(6.4.1.1 Name Server Statistics Counters)
+(6.2.18 server Statement Definition and Usage)
endobj
553 0 obj
-<< /S /GoTo /D (subsubsection.6.4.1.2) >>
+<< /S /GoTo /D (subsection.6.2.19) >>
endobj
556 0 obj
-(6.4.1.2 Zone Maintenance Statistics Counters)
+(6.2.19 statistics-channels Statement Grammar)
endobj
557 0 obj
-<< /S /GoTo /D (subsubsection.6.4.1.3) >>
+<< /S /GoTo /D (subsection.6.2.20) >>
endobj
560 0 obj
-(6.4.1.3 Resolver Statistics Counters)
+(6.2.20 statistics-channels Statement Definition and Usage)
endobj
561 0 obj
-<< /S /GoTo /D (subsubsection.6.4.1.4) >>
+<< /S /GoTo /D (subsection.6.2.21) >>
endobj
564 0 obj
-(6.4.1.4 Socket I/O Statistics Counters)
+(6.2.21 trusted-keys Statement Grammar)
endobj
565 0 obj
-<< /S /GoTo /D (subsubsection.6.4.1.5) >>
+<< /S /GoTo /D (subsection.6.2.22) >>
endobj
568 0 obj
-(6.4.1.5 Compatibility with BIND 8 Counters)
+(6.2.22 trusted-keys Statement Definition and Usage)
endobj
569 0 obj
-<< /S /GoTo /D (chapter.7) >>
+<< /S /GoTo /D (subsection.6.2.23) >>
endobj
572 0 obj
-(7 BIND 9 Security Considerations)
+(6.2.23 managed-keys Statement Grammar)
endobj
573 0 obj
-<< /S /GoTo /D (section.7.1) >>
+<< /S /GoTo /D (subsection.6.2.24) >>
endobj
576 0 obj
-(7.1 Access Control Lists)
+(6.2.24 managed-keys Statement Definition and Usage)
endobj
577 0 obj
-<< /S /GoTo /D (section.7.2) >>
+<< /S /GoTo /D (subsection.6.2.25) >>
endobj
580 0 obj
-(7.2 Chroot and Setuid)
+(6.2.25 view Statement Grammar)
endobj
581 0 obj
-<< /S /GoTo /D (subsection.7.2.1) >>
+<< /S /GoTo /D (subsection.6.2.26) >>
endobj
584 0 obj
-(7.2.1 The chroot Environment)
+(6.2.26 view Statement Definition and Usage)
endobj
585 0 obj
-<< /S /GoTo /D (subsection.7.2.2) >>
+<< /S /GoTo /D (subsection.6.2.27) >>
endobj
588 0 obj
-(7.2.2 Using the setuid Function)
+(6.2.27 zone Statement Grammar)
endobj
589 0 obj
-<< /S /GoTo /D (section.7.3) >>
+<< /S /GoTo /D (subsection.6.2.28) >>
endobj
592 0 obj
-(7.3 Dynamic Update Security)
+(6.2.28 zone Statement Definition and Usage)
endobj
593 0 obj
-<< /S /GoTo /D (chapter.8) >>
+<< /S /GoTo /D (subsubsection.6.2.28.1) >>
endobj
596 0 obj
-(8 Troubleshooting)
+(6.2.28.1 Zone Types)
endobj
597 0 obj
-<< /S /GoTo /D (section.8.1) >>
+<< /S /GoTo /D (subsubsection.6.2.28.2) >>
endobj
600 0 obj
-(8.1 Common Problems)
+(6.2.28.2 Class)
endobj
601 0 obj
-<< /S /GoTo /D (subsection.8.1.1) >>
+<< /S /GoTo /D (subsubsection.6.2.28.3) >>
endobj
604 0 obj
-(8.1.1 It's not working; how can I figure out what's wrong?)
+(6.2.28.3 Zone Options)
endobj
605 0 obj
-<< /S /GoTo /D (section.8.2) >>
+<< /S /GoTo /D (subsubsection.6.2.28.4) >>
endobj
608 0 obj
-(8.2 Incrementing and Changing the Serial Number)
+(6.2.28.4 Dynamic Update Policies)
endobj
609 0 obj
-<< /S /GoTo /D (section.8.3) >>
+<< /S /GoTo /D (section.6.3) >>
endobj
612 0 obj
-(8.3 Where Can I Get Help?)
+(6.3 Zone File)
endobj
613 0 obj
-<< /S /GoTo /D (appendix.A) >>
+<< /S /GoTo /D (subsection.6.3.1) >>
endobj
616 0 obj
-(A Appendices)
+(6.3.1 Types of Resource Records and When to Use Them)
endobj
617 0 obj
-<< /S /GoTo /D (section.A.1) >>
+<< /S /GoTo /D (subsubsection.6.3.1.1) >>
endobj
620 0 obj
-(A.1 Acknowledgments)
+(6.3.1.1 Resource Records)
endobj
621 0 obj
-<< /S /GoTo /D (subsection.A.1.1) >>
+<< /S /GoTo /D (subsubsection.6.3.1.2) >>
endobj
624 0 obj
-(A.1.1 A Brief History of the DNS and BIND)
+(6.3.1.2 Textual expression of RRs)
endobj
625 0 obj
-<< /S /GoTo /D (section.A.2) >>
+<< /S /GoTo /D (subsection.6.3.2) >>
endobj
628 0 obj
-(A.2 General DNS Reference Information)
+(6.3.2 Discussion of MX Records)
endobj
629 0 obj
-<< /S /GoTo /D (subsection.A.2.1) >>
+<< /S /GoTo /D (subsection.6.3.3) >>
endobj
632 0 obj
-(A.2.1 IPv6 addresses \(AAAA\))
+(6.3.3 Setting TTLs)
endobj
633 0 obj
-<< /S /GoTo /D (section.A.3) >>
+<< /S /GoTo /D (subsection.6.3.4) >>
endobj
636 0 obj
-(A.3 Bibliography \(and Suggested Reading\))
+(6.3.4 Inverse Mapping in IPv4)
endobj
637 0 obj
-<< /S /GoTo /D (subsection.A.3.1) >>
+<< /S /GoTo /D (subsection.6.3.5) >>
endobj
640 0 obj
-(A.3.1 Request for Comments \(RFCs\))
+(6.3.5 Other Zone File Directives)
endobj
641 0 obj
-<< /S /GoTo /D (subsection.A.3.2) >>
+<< /S /GoTo /D (subsubsection.6.3.5.1) >>
endobj
644 0 obj
-(A.3.2 Internet Drafts)
+(6.3.5.1 The @ \(at-sign\))
endobj
645 0 obj
-<< /S /GoTo /D (subsection.A.3.3) >>
+<< /S /GoTo /D (subsubsection.6.3.5.2) >>
endobj
648 0 obj
-(A.3.3 Other Documents About BIND)
+(6.3.5.2 The \044ORIGIN Directive)
endobj
649 0 obj
-<< /S /GoTo /D (appendix.B) >>
+<< /S /GoTo /D (subsubsection.6.3.5.3) >>
endobj
652 0 obj
-(B Manual pages)
+(6.3.5.3 The \044INCLUDE Directive)
endobj
653 0 obj
-<< /S /GoTo /D (section.B.1) >>
+<< /S /GoTo /D (subsubsection.6.3.5.4) >>
endobj
656 0 obj
-(B.1 dig)
+(6.3.5.4 The \044TTL Directive)
endobj
657 0 obj
-<< /S /GoTo /D (section.B.2) >>
+<< /S /GoTo /D (subsection.6.3.6) >>
endobj
660 0 obj
-(B.2 host)
+(6.3.6 BIND Master File Extension: the \044GENERATE Directive)
endobj
661 0 obj
-<< /S /GoTo /D (section.B.3) >>
+<< /S /GoTo /D (subsection.6.3.7) >>
endobj
664 0 obj
-(B.3 dnssec-dsfromkey)
+(6.3.7 Additional File Formats)
endobj
665 0 obj
-<< /S /GoTo /D (section.B.4) >>
+<< /S /GoTo /D (section.6.4) >>
endobj
668 0 obj
-(B.4 dnssec-keyfromlabel)
+(6.4 BIND9 Statistics)
endobj
669 0 obj
-<< /S /GoTo /D (section.B.5) >>
+<< /S /GoTo /D (subsubsection.6.4.0.1) >>
endobj
672 0 obj
-(B.5 dnssec-keygen)
+(6.4.0.1 The Statistics File)
endobj
673 0 obj
-<< /S /GoTo /D (section.B.6) >>
+<< /S /GoTo /D (subsection.6.4.1) >>
endobj
676 0 obj
-(B.6 dnssec-signzone)
+(6.4.1 Statistics Counters)
endobj
677 0 obj
-<< /S /GoTo /D (section.B.7) >>
+<< /S /GoTo /D (subsubsection.6.4.1.1) >>
endobj
680 0 obj
-(B.7 named-checkconf)
+(6.4.1.1 Name Server Statistics Counters)
endobj
681 0 obj
-<< /S /GoTo /D (section.B.8) >>
+<< /S /GoTo /D (subsubsection.6.4.1.2) >>
endobj
684 0 obj
-(B.8 named-checkzone)
+(6.4.1.2 Zone Maintenance Statistics Counters)
endobj
685 0 obj
-<< /S /GoTo /D (section.B.9) >>
+<< /S /GoTo /D (subsubsection.6.4.1.3) >>
endobj
688 0 obj
-(B.9 named)
+(6.4.1.3 Resolver Statistics Counters)
endobj
689 0 obj
-<< /S /GoTo /D (section.B.10) >>
+<< /S /GoTo /D (subsubsection.6.4.1.4) >>
endobj
692 0 obj
-(B.10 nsupdate)
+(6.4.1.4 Socket I/O Statistics Counters)
endobj
693 0 obj
-<< /S /GoTo /D (section.B.11) >>
+<< /S /GoTo /D (subsubsection.6.4.1.5) >>
endobj
696 0 obj
-(B.11 rndc)
+(6.4.1.5 Compatibility with BIND 8 Counters)
endobj
697 0 obj
-<< /S /GoTo /D (section.B.12) >>
+<< /S /GoTo /D (chapter.7) >>
endobj
700 0 obj
-(B.12 rndc.conf)
+(7 BIND 9 Security Considerations)
endobj
701 0 obj
-<< /S /GoTo /D (section.B.13) >>
+<< /S /GoTo /D (section.7.1) >>
endobj
704 0 obj
-(B.13 rndc-confgen)
+(7.1 Access Control Lists)
endobj
705 0 obj
-<< /S /GoTo /D [706 0 R /FitH ] >>
+<< /S /GoTo /D (section.7.2) >>
+endobj
+708 0 obj
+(7.2 Chroot and Setuid)
+endobj
+709 0 obj
+<< /S /GoTo /D (subsection.7.2.1) >>
+endobj
+712 0 obj
+(7.2.1 The chroot Environment)
+endobj
+713 0 obj
+<< /S /GoTo /D (subsection.7.2.2) >>
+endobj
+716 0 obj
+(7.2.2 Using the setuid Function)
+endobj
+717 0 obj
+<< /S /GoTo /D (section.7.3) >>
+endobj
+720 0 obj
+(7.3 Dynamic Update Security)
+endobj
+721 0 obj
+<< /S /GoTo /D (chapter.8) >>
+endobj
+724 0 obj
+(8 Troubleshooting)
+endobj
+725 0 obj
+<< /S /GoTo /D (section.8.1) >>
+endobj
+728 0 obj
+(8.1 Common Problems)
+endobj
+729 0 obj
+<< /S /GoTo /D (subsection.8.1.1) >>
+endobj
+732 0 obj
+(8.1.1 It's not working; how can I figure out what's wrong?)
+endobj
+733 0 obj
+<< /S /GoTo /D (section.8.2) >>
+endobj
+736 0 obj
+(8.2 Incrementing and Changing the Serial Number)
+endobj
+737 0 obj
+<< /S /GoTo /D (section.8.3) >>
+endobj
+740 0 obj
+(8.3 Where Can I Get Help?)
+endobj
+741 0 obj
+<< /S /GoTo /D (appendix.A) >>
+endobj
+744 0 obj
+(A Appendices)
+endobj
+745 0 obj
+<< /S /GoTo /D (section.A.1) >>
+endobj
+748 0 obj
+(A.1 Acknowledgments)
+endobj
+749 0 obj
+<< /S /GoTo /D (subsection.A.1.1) >>
+endobj
+752 0 obj
+(A.1.1 A Brief History of the DNS and BIND)
+endobj
+753 0 obj
+<< /S /GoTo /D (section.A.2) >>
+endobj
+756 0 obj
+(A.2 General DNS Reference Information)
+endobj
+757 0 obj
+<< /S /GoTo /D (subsection.A.2.1) >>
+endobj
+760 0 obj
+(A.2.1 IPv6 addresses \(AAAA\))
+endobj
+761 0 obj
+<< /S /GoTo /D (section.A.3) >>
+endobj
+764 0 obj
+(A.3 Bibliography \(and Suggested Reading\))
+endobj
+765 0 obj
+<< /S /GoTo /D (subsection.A.3.1) >>
+endobj
+768 0 obj
+(A.3.1 Request for Comments \(RFCs\))
+endobj
+769 0 obj
+<< /S /GoTo /D (subsection.A.3.2) >>
+endobj
+772 0 obj
+(A.3.2 Internet Drafts)
+endobj
+773 0 obj
+<< /S /GoTo /D (subsection.A.3.3) >>
+endobj
+776 0 obj
+(A.3.3 Other Documents About BIND)
+endobj
+777 0 obj
+<< /S /GoTo /D (section.A.4) >>
+endobj
+780 0 obj
+(A.4 BIND 9 DNS Library Support)
+endobj
+781 0 obj
+<< /S /GoTo /D (subsection.A.4.1) >>
+endobj
+784 0 obj
+(A.4.1 Prerequisite)
+endobj
+785 0 obj
+<< /S /GoTo /D (subsection.A.4.2) >>
+endobj
+788 0 obj
+(A.4.2 Compilation)
+endobj
+789 0 obj
+<< /S /GoTo /D (subsection.A.4.3) >>
+endobj
+792 0 obj
+(A.4.3 Installation)
+endobj
+793 0 obj
+<< /S /GoTo /D (subsection.A.4.4) >>
+endobj
+796 0 obj
+(A.4.4 Known Defects/Restrictions)
+endobj
+797 0 obj
+<< /S /GoTo /D (subsection.A.4.5) >>
endobj
-709 0 obj <<
+800 0 obj
+(A.4.5 The dns.conf File)
+endobj
+801 0 obj
+<< /S /GoTo /D (subsection.A.4.6) >>
+endobj
+804 0 obj
+(A.4.6 Sample Applications)
+endobj
+805 0 obj
+<< /S /GoTo /D (subsubsection.A.4.6.1) >>
+endobj
+808 0 obj
+(A.4.6.1 sample: a simple stub resolver utility)
+endobj
+809 0 obj
+<< /S /GoTo /D (subsubsection.A.4.6.2) >>
+endobj
+812 0 obj
+(A.4.6.2 sample-async: a simple stub resolver, working asynchronously)
+endobj
+813 0 obj
+<< /S /GoTo /D (subsubsection.A.4.6.3) >>
+endobj
+816 0 obj
+(A.4.6.3 sample-request: a simple DNS transaction client)
+endobj
+817 0 obj
+<< /S /GoTo /D (subsubsection.A.4.6.4) >>
+endobj
+820 0 obj
+(A.4.6.4 sample-gai: getaddrinfo\(\) and getnameinfo\(\) test code)
+endobj
+821 0 obj
+<< /S /GoTo /D (subsubsection.A.4.6.5) >>
+endobj
+824 0 obj
+(A.4.6.5 sample-update: a simple dynamic update client program)
+endobj
+825 0 obj
+<< /S /GoTo /D (subsubsection.A.4.6.6) >>
+endobj
+828 0 obj
+(A.4.6.6 nsprobe: domain/name server checker in terms of RFC 4074)
+endobj
+829 0 obj
+<< /S /GoTo /D (subsection.A.4.7) >>
+endobj
+832 0 obj
+(A.4.7 Library References)
+endobj
+833 0 obj
+<< /S /GoTo /D (appendix.B) >>
+endobj
+836 0 obj
+(B Manual pages)
+endobj
+837 0 obj
+<< /S /GoTo /D (section.B.1) >>
+endobj
+840 0 obj
+(B.1 dig)
+endobj
+841 0 obj
+<< /S /GoTo /D (section.B.2) >>
+endobj
+844 0 obj
+(B.2 host)
+endobj
+845 0 obj
+<< /S /GoTo /D (section.B.3) >>
+endobj
+848 0 obj
+(B.3 dnssec-dsfromkey)
+endobj
+849 0 obj
+<< /S /GoTo /D (section.B.4) >>
+endobj
+852 0 obj
+(B.4 dnssec-keyfromlabel)
+endobj
+853 0 obj
+<< /S /GoTo /D (section.B.5) >>
+endobj
+856 0 obj
+(B.5 dnssec-keygen)
+endobj
+857 0 obj
+<< /S /GoTo /D (section.B.6) >>
+endobj
+860 0 obj
+(B.6 dnssec-revoke)
+endobj
+861 0 obj
+<< /S /GoTo /D (section.B.7) >>
+endobj
+864 0 obj
+(B.7 dnssec-settime)
+endobj
+865 0 obj
+<< /S /GoTo /D (section.B.8) >>
+endobj
+868 0 obj
+(B.8 dnssec-signzone)
+endobj
+869 0 obj
+<< /S /GoTo /D (section.B.9) >>
+endobj
+872 0 obj
+(B.9 named-checkconf)
+endobj
+873 0 obj
+<< /S /GoTo /D (section.B.10) >>
+endobj
+876 0 obj
+(B.10 named-checkzone)
+endobj
+877 0 obj
+<< /S /GoTo /D (section.B.11) >>
+endobj
+880 0 obj
+(B.11 named)
+endobj
+881 0 obj
+<< /S /GoTo /D (section.B.12) >>
+endobj
+884 0 obj
+(B.12 named-journalprint)
+endobj
+885 0 obj
+<< /S /GoTo /D (section.B.13) >>
+endobj
+888 0 obj
+(B.13 nsupdate)
+endobj
+889 0 obj
+<< /S /GoTo /D (section.B.14) >>
+endobj
+892 0 obj
+(B.14 rndc)
+endobj
+893 0 obj
+<< /S /GoTo /D (section.B.15) >>
+endobj
+896 0 obj
+(B.15 rndc.conf)
+endobj
+897 0 obj
+<< /S /GoTo /D (section.B.16) >>
+endobj
+900 0 obj
+(B.16 rndc-confgen)
+endobj
+901 0 obj
+<< /S /GoTo /D (section.B.17) >>
+endobj
+904 0 obj
+(B.17 ddns-confgen)
+endobj
+905 0 obj
+<< /S /GoTo /D (section.B.18) >>
+endobj
+908 0 obj
+(B.18 arpaname)
+endobj
+909 0 obj
+<< /S /GoTo /D (section.B.19) >>
+endobj
+912 0 obj
+(B.19 genrandom)
+endobj
+913 0 obj
+<< /S /GoTo /D (section.B.20) >>
+endobj
+916 0 obj
+(B.20 isc-hmac-fixup)
+endobj
+917 0 obj
+<< /S /GoTo /D (section.B.21) >>
+endobj
+920 0 obj
+(B.21 nsec3hash)
+endobj
+921 0 obj
+<< /S /GoTo /D [922 0 R /FitH ] >>
+endobj
+925 0 obj <<
/Length 240
/Filter /FlateDecode
>>
@@ -1060,32 +1384,32 @@ stream
xÚ•OKA Åïó)rl›N2Éü9ZªRA¡27ñ°´[)¸[ºÖïïlWË‚^$0ïý˜y[Š *Z—BTK
ÛÖXx+Þ½¡oFÔ¡Šsåð‡[ LÁ+T\@1M±_8±Eo=C¥BÈÌ~À—Ù,C yÄŠƒÂ•Ë»—Ùrý´š——ì,ãf׺Ãǹ¯ÏÇ~”ž›}Ó7ݶ™¿æ a$/¾äKc¼\óXwŸõûà›Û| §â1'p®äðqH'`Ô ð3‹zšüßÚ±y±n VG³1°™ž07l(%tî[þM^Xúendstream
endobj
-706 0 obj <<
+922 0 obj <<
/Type /Page
-/Contents 709 0 R
-/Resources 708 0 R
+/Contents 925 0 R
+/Resources 924 0 R
/MediaBox [0 0 595.2756 841.8898]
-/Parent 715 0 R
+/Parent 931 0 R
>> endobj
-707 0 obj <<
+923 0 obj <<
/Type /XObject
/Subtype /Form
/FormType 1
/PTEX.FileName (./isc-logo.pdf)
/PTEX.PageNumber 1
-/PTEX.InfoDict 716 0 R
+/PTEX.InfoDict 932 0 R
/Matrix [1.00000000 0.00000000 0.00000000 1.00000000 0.00000000 0.00000000]
/BBox [0.00000000 0.00000000 612.00000000 792.00000000]
/PieceInfo <<
-/Illustrator 717 0 R
+/Illustrator 933 0 R
>>
/Resources <<
/ColorSpace <<
-/CS0 718 0 R
+/CS0 934 0 R
>>/Properties <<
-/MC0 719 0 R
+/MC0 935 0 R
>>/ExtGState <<
-/GS0 720 0 R
+/GS0 936 0 R
>>>>
/Length 843
/Filter /FlateDecode
@@ -1101,7 +1425,7 @@ BqÕ•l9uš
!=§ ¨Œø†vGc £I#/'~<1‚ÀÔRPy±´ýl1½Ͷw1 чd }¡þa
Ë9b :žÎÞF" ‹>64”~0IGD˜Ë Ø°$ÙtMâ¯%Z½Gð¾¥Úñ§aÑÌ‘ I¼ ý—/øýzü+À
endobj
-716 0 obj
+932 0 obj
<<
/CreationDate (D:20100303120319-08'00')
/Creator (Adobe Illustrator CS3)
@@ -1110,24 +1434,24 @@ endobj
/Title (ISC_logo_only_RGB)
>>
endobj
-717 0 obj
+933 0 obj
<<
-/Private 721 0 R
+/Private 937 0 R
/LastModified (D:20100412113400-07'00')
>>
endobj
-718 0 obj
-[/ICCBased 722 0 R]
+934 0 obj
+[/ICCBased 938 0 R]
endobj
-719 0 obj
+935 0 obj
<<
-/Intent 723 0 R
-/Usage 724 0 R
+/Intent 939 0 R
+/Usage 940 0 R
/Name (Layer 1)
/Type /OCG
>>
endobj
-720 0 obj
+936 0 obj
<<
/OPM 1
/BM /Normal
@@ -1141,22 +1465,22 @@ endobj
/SA true
>>
endobj
-721 0 obj
+937 0 obj
<<
/RoundtripVersion 13
/ContainerVersion 11
/CreatorVersion 13
-/AIMetaData 725 0 R
-/AIPrivateData1 726 0 R
-/AIPrivateData2 727 0 R
-/AIPrivateData3 728 0 R
-/AIPrivateData4 729 0 R
-/AIPrivateData5 730 0 R
+/AIMetaData 941 0 R
+/AIPrivateData1 942 0 R
+/AIPrivateData2 943 0 R
+/AIPrivateData3 944 0 R
+/AIPrivateData4 945 0 R
+/AIPrivateData5 946 0 R
/NumBlock 5
/RoundtripStreamType 1
>>
endobj
-722 0 obj
+938 0 obj
<<
/Length 281
/Filter /FlateDecode
@@ -1167,10 +1491,10 @@ H‰b``2ptqre``ÈÍ+)
rwRˆˆŒR`?ÏÀÆÀÌ
ò‹KRS€j!îAˆBPˆi
endobj
-723 0 obj
+939 0 obj
[/View/Design]
endobj
-724 0 obj
+940 0 obj
<<
/CreatorInfo <<
/Subtype /Artwork
@@ -1178,21 +1502,21 @@ endobj
>>
>>
endobj
-725 0 obj
+941 0 obj
<<
/Length 981
>>
stream
%!PS-Adobe-3.0 %%Creator: Adobe Illustrator(R) 13.0 %%AI8_CreatorVersion: 13.0.2 %%For: (Brian Reid) () %%Title: (ISC_logo_only_RGB.ai) %%CreationDate: 4/12/10 11:34 AM %%BoundingBox: 247 367 366 413 %%HiResBoundingBox: 247.0869 367.5654 365.0859 412.583 %%DocumentProcessColors: Cyan Magenta Yellow Black %AI5_FileFormat 9.0 %AI12_BuildNumber: 434 %AI3_ColorUsage: Color %AI7_ImageSettings: 0 %%RGBProcessColor: 0 0.658824 0.8 (ISC logo blue) %%+ 0.372549 0.376471 0.384314 (PANTONE 425 U) %%+ 0 0 0 ([Registration]) %AI3_TemplateBox: 306.5 395.5 306.5 395.5 %AI3_TileBox: 18 33.1201 594 786.96 %AI3_DocumentPreview: None %AI5_ArtSize: 612 792 %AI5_RulerUnits: 3 %AI9_ColorModel: 1 %AI5_ArtFlags: 0 0 0 1 0 0 0 0 0 %AI5_TargetResolution: 800 %AI5_NumLayers: 1 %AI9_OpenToView: -381 793 0.92 1268 743 26 0 0 117 75 0 0 1 1 1 0 1 %AI5_OpenViewLayers: 7 %%PageOrigin:0 0 %AI7_GridSettings: 72 8 72 8 1 0 0.8 0.8 0.8 0.9 0.9 0.9 %AI9_Flatten: 1 %AI12_CMSettings: 00.MS %%EndComments endstream
endobj
-726 0 obj
+942 0 obj
<<
/Length 11082
>>
stream
%%BoundingBox: 247 367 366 413 %%HiResBoundingBox: 247.0869 367.5654 365.0859 412.583 %AI7_Thumbnail: 128 52 8 %%BeginData: 10932 Hex Bytes %0000330000660000990000CC0033000033330033660033990033CC0033FF %0066000066330066660066990066CC0066FF009900009933009966009999 %0099CC0099FF00CC0000CC3300CC6600CC9900CCCC00CCFF00FF3300FF66 %00FF9900FFCC3300003300333300663300993300CC3300FF333300333333 %3333663333993333CC3333FF3366003366333366663366993366CC3366FF %3399003399333399663399993399CC3399FF33CC0033CC3333CC6633CC99 %33CCCC33CCFF33FF0033FF3333FF6633FF9933FFCC33FFFF660000660033 %6600666600996600CC6600FF6633006633336633666633996633CC6633FF %6666006666336666666666996666CC6666FF669900669933669966669999 %6699CC6699FF66CC0066CC3366CC6666CC9966CCCC66CCFF66FF0066FF33 %66FF6666FF9966FFCC66FFFF9900009900339900669900999900CC9900FF %9933009933339933669933999933CC9933FF996600996633996666996699 %9966CC9966FF9999009999339999669999999999CC9999FF99CC0099CC33 %99CC6699CC9999CCCC99CCFF99FF0099FF3399FF6699FF9999FFCC99FFFF %CC0000CC0033CC0066CC0099CC00CCCC00FFCC3300CC3333CC3366CC3399 %CC33CCCC33FFCC6600CC6633CC6666CC6699CC66CCCC66FFCC9900CC9933 %CC9966CC9999CC99CCCC99FFCCCC00CCCC33CCCC66CCCC99CCCCCCCCCCFF %CCFF00CCFF33CCFF66CCFF99CCFFCCCCFFFFFF0033FF0066FF0099FF00CC %FF3300FF3333FF3366FF3399FF33CCFF33FFFF6600FF6633FF6666FF6699 %FF66CCFF66FFFF9900FF9933FF9966FF9999FF99CCFF99FFFFCC00FFCC33 %FFCC66FFCC99FFCCCCFFCCFFFFFF33FFFF66FFFF99FFFFCC110000001100 %000011111111220000002200000022222222440000004400000044444444 %550000005500000055555555770000007700000077777777880000008800 %000088888888AA000000AA000000AAAAAAAABB000000BB000000BBBBBBBB %DD000000DD000000DDDDDDDDEE000000EE000000EEEEEEEE0000000000FF %00FF0000FFFFFF0000FF00FFFFFF00FFFFFF %524C45FD1F52285252A8FD04FFFD05A8FFFFFFA87DFD4F52285252522852 %525228525252285252522852525228525252285252522852277DA8FFFFA8 %7D7D525227FD04527DA8FFFFA85252275252522852525228525252285252 %522852525228525252285252522852525228525252285252522852525228 %52525228525252285252522852525228525252285252522852525228FD21 %52A8FFFF7D7D525227FD0752275252A8FFFF7DFD215227FD2A522E522752 %2E5227522E5227522E5227522E5227522E5227522E5227527DFFFFA85252 %27522E5227522E5227522E5227522752A8FF7D5227522E5227522E522752 %2E5227522E5227522E5227522E5227522E522752277D7D7D275227522E52 %27522E5227522E5227522E5227522E5227522E5227522E5227522E522752 %2E5227FD1A52277DA8FFA87D2EFD11522E527DFFA853FD1D52A8FFFFFF7D %28FD285228525252285252522852525228525252285252522852277DFFFF %7D522752525228525252285252522852525228525252275252FFA8522752 %285252522852525228525252285252522852525228525252277DFFA852A8 %FF5227525252285252522852525228525252285252522852525228525252 %285252522852525228FD1852277DFFFFFD1B52FFA8FD1A527DFFA8275252 %FF7DFD265227522E5227522E5227522E5227522E5227522E522752277DFF %FF525227522E5227522E5227522E5227522E5227522E5227522E52275252 %FFA852275227522E5227522E5227522E5227522E5227522E522752A8A827 %522E527DA9275227522E5227522E5227522E5227522E5227522E52275227 %5227522E5227522E5227522EFD17527DFFA8FD1E527DFFA8FD17527DFFFD %0452287DFFFD155228FD075228FD08522852525228525252285252522852 %5252285252522852527D2752525228525252285252522852525228525252 %2852525228525252285252527DFF7D522852525228525252285252522852 %525228FD0452FF7D5228FD0452FF52522852525228525252285252522752 %2752527DA1A8A8FFCACFA8CAA17D5252275228FD3C52A8FFFD145228A8FF %53FD0652FFA82EFD0C527D7DCAFD04FFAFAF85AF85AFAFFFFFFFA87DFD05 %522E5227522E5227522E5227522E5227522E5227522E5227522E5227522E %5227522E5227522E5227522E5227522E5227522E5227522E5227522752A8 %FF275227522E5227522E5227522E5227522E522752FFA827522E5227522E %FF7D522E5227522E522752275252A8FFFFAFAF603CFD041413FD04143C60 %AFFFFF535227FD3A52277DFFA827FD11527DFFFD0852A8FFFD0952A8CFFF %FFAF3C3D1414141A141A141A141A141A14141461AFFFA8FD045228525252 %285252522852525228525252285252522852525228525252285252522852 %5252285252522852525228525252285252522852525227A8FF5227525252 %2852525228525252285252522EFFA85227525252285228A87D5252522852 %27527DFFFFAF603CFD07141A1414141A1414141AFD041460FFA8FD3D52FF %A8FD10527DFF7DFD0F527DFFFFA9611414141A141A141A141A141A141A14 %1A141A141A141A14143CFFA827522E5227522E5227522E5227522E522752 %2E5227522E5227522E5227522E5227522E5227522E5227522E5227522E52 %27522E5227522E5227522E527DFF525227522E5227522E5227522E522752 %A8FF27522E5227522E5227522852275252A8FFFF3C1413FD191436FFFD3C %5259FFA828FD0E52FF7DFD0D527DFFFF8B1414141A141A141A141A141A14 %1A141A141A141A141A141A141A141A141460285252522852525228525252 %285252522852525228525252275227522752275227525252285252522852 %52522852525228525252285252522852525227A8FF7D2752525228525252 %2852525227A8FF52275252522852525228522752A8FFA93CFD05141A1414 %141A1414141A1414141A1414141A1414141A1414141A1414FD1552285252 %7D527D597D527DFD065227FD1852FFA8FD0D52FFFFFD0A52277DFFFF601A %141A141A141A141A141A141A141A141A141A141A141A141A141A141A141A %141A142E5227522E5227522E5227522E5227522752527D7DA8A8FD09FFA8 %FFA8A87D532852275227522E5227522E5227522E5227522E5227522E527D %FF525227522E5227522E52275252FF7D522E5227522E522752277DFFFF36 %FD2314FD0E527D7DFD07FFA8A87DA87DA87DFD04A8FD05FFA87DFD15527D %FFA827FD0A52A8FF7DFD0952A8FFAF1414141A141A141A141A141A141A14 %1A141A141A141A141A141A141A141A141A141A141A145252285252522852 %525227527DA8FFFFFFA87D7D52522752275227522752275227522752527D %A8FFFFFFA87E52522752525228525252285252522852525227A8FF522752 %5252285252522752FFA8275252522852525227A8FF85FD05141A1414141A %1414141A1414141A1414141A1414141A1414141A1414141A1414141AFD07 %52275253A8FFFFFFA8FD045227FD0F522EFD04527D7DFFFFFFA87DFD1052 %7DFF7DFD0A52FF7DFD0852A8FF8B1414141A141A141A141A141A141A141A %141A141A141A141A141A141A141A141A141A141A141A1427522E52275227 %7DA8FFFFA85252275227522E5227522E5227522E5227522E5227522E5227 %522E52275227527DFFFFFF7D52275227522E5227522E5227522752A8A827 %5227522E52275227A8FF5227522752525227A8FF6113FD2714FD0652A8FF %FF7D7D28FD22527DA8FFFF7DFD0C5227A8FF7DFD0852A8FFFD06522EA8FF %61141A141A141A141A141A141A141A141A141A141A141A141A141A141A14 %1A141A141A141A141A141A14285227527DFFFF7D52522752285252522852 %525228525252285252522852525228525252285252522852525228522752 %52FFFFA8525228522852525228FD0452FF7D5228525252285252FF7D5252 %52285227A8FF611414141A1414141A1414141A1414141A1414141A141414 %1A1414141A1414141A1414141A1414141A141452277DFFFFA87D28FD2952 %287DFFFF7EFD0B52A8FFFD065227A8FF7D2752525227A8FF8B141A141A14 %1A141A141A141A141A141A141A141A141A141A141A141A141A141A141A14 %1A141A141A141A1428A8FFFF525227522E5227522E5227522E5227522E52 %27522E5227522E5227522E5227522E5227522E5227522E5227522E522752 %7DFFA87D275227522E522752277EFF52275227522852A8FF52522752277D %FF8BFD121413FD0F1413FD0914FFFFA8FD3352FFFFA8FD0952FF7DFD0652 %FFA8FD04527DFFAF141A141A141A141A141A141A141A141A141A14613C3C %141A141A141A141A141A141A143D3C3C141A141A141A14FF7D2752525228 %525252285252522852525228525252285252522852525228525252285252 %522852525228525252285252522852525227A8FFA8FD045228525252A8A8 %27522852277DFF7D27522752A8FFFD051461A9AF848B1414141A141436AF %AFFFFFFFAFAF36FD04141A14141461A9FFAFFFAFAF601A1414141A7D2EFD %3552277DFFFFFD0752A8FFFD05527DFFFD04527DFF3C14141A141484FFFF %FFAF1A141A141A85FD09FF841A141A141A14AFFD08FF841A141A1427522E %5227522E5227522E5227522E5227522E5227522E5227522E5227522E5227 %522E5227522E5227522E5227522E5227522E5227522E52277DA8FF52522E %5227527DFF52522E5227FFA852275252FF60FD061485FFFFFFAFFD041460 %FD0BFF36FD0414AFFD0AFF60141414FD3A5253FFFF7DFD04527DFFA85252 %527DFFA8285252FFAF1A141A141A141A84FFFFFFAF3D141A14FD05FF603D %60FD04FFAF141A1461FD04FFA96136AFFD04FF141A142852525228525252 %285252522852525228525252285252522852525228525252285252522852 %52522852525228525252285252522852525228522752A8FF5252285252FF %A8FD0452FF7D5227A8FF3C141AFD051485FFFFFFAF14141460FD04FF3614 %141460FFFFFFA91A141484FFFFFFA91A141414FD04FF611414FD3D52A8FF %FD0452A8FF525228A8FF7D277DFF8B141A141A141A141A85FFFFFFAF1A14 %1A60FD04FF3C141A1461FD04FF141A14FD04FF8B141A141AAFFFFFFF601A %142E5227522E5227522E5227522E5227522E5227522E5227522E5227522E %5227522E5227522E5227522E5227522E5227522E5227522E5227522E5227 %522752A8FF5252277DFF7D2752A8FF2752A8FFFD08141385FFFFFFAF1414 %1361FD04FF36FD04148584856014133CFD04FF60FD0414FD04FF851314FD %3D52287DFFFF525252FF7D5252FFA8527DFF3C1A141A141A141A141A85FF %FFFFAF1A141A60FD04FFAF141A141A141A141A141A3CFD04FF61141A141A %3C616061361A145252285252522852525228525252285252522852525228 %525252285252522852525228525252285252522852525228525252275252 %522752525228525252277DFF7E2752FFA82753FF7E27FFA914141A141414 %1A1414148BFFFFFFAF1414143CAFFD04FFAFFD091461FD04FF3614141AFD %07141AFD2B522852285227FD075227FD075227A8FF7D27FFA8527DFF7D7D %FF3D141A141A141A141A141484FFFFFFA91A141A1485FD06FF603C141A14 %1A14143CFD04FF61141A141A141A141A141A1427522E5227522E5227522E %5227522E5227522E5227522E5227522E5227522E5227522E522752275227 %FD04527D7DA8A8FFA8FFA8FFA8A87D7D52522752275227FFA8527DFF277D %FF52A8AF13FD0A1485FFFFFFAFFD0414138BFD06FFA860FD05143CFD04FF %36FD0B14FD2852A8A8FD07FFA8FFA8FFA8FD06FFA87D5227527DFF7D7DFF %7DA8FF7DFF3C1A141A141A141A141A141A84FFFFFFAF3D141A141A148BFD %07FF8B141A141A3CFD04FF61141A141A141A141A141A1428525252285252 %522852525228525252285252522852525228525252285252522752275252 %A8A8FFFFFFA8A87D7DFD065227FD04527D7DA8FFFFA87D2752A8FF52FF7D %A8A8CAA914141A1414141A1414141A1485FFFFFFAFFD071460A8FD06FF8B %1414143CFD04FF36FD04141A1414141A1414FD2252A8FD04FF7D7D525228 %5227FD0B52275252527DFFFFFF5253FFA8A8A8FFA8FF61141A141A141A14 %1A141A141A85FFFFFFAF1A141A141A141A141A60FD06FF85141A3CFD04FF %61141A141A141A141A141A142E5227522E5227522E5227522E5227522E52 %27522E5227522E5227522752277DA8FFFFA859522752275227522E522752 %2E5227522E5227522E5227522752277DA8FF7DA8FFFFA8FFFFAFFD0C1413 %85FFFFFFAFFD061413FD0414AFFD04FFA9141360FD04FF36FD051413FD05 %14FD1D527DFFFFFF7D7DFD1E52A8FFA8FD05FF601A141A141A141A141A14 %1A141A85FFFFFFAF1A141A143D363D141A141A14FD05FF3C1A3CFD04FF61 %141A141A60AF85AF601A1452522852525228525252285252522852525228 %52525228525252277DFFFFA87D2E52275252522852525228525252285252 %52285252522852525228525252285228527DFD06FF3C141A1414141A1414 %141A1414148BFFFFFFAF141414AFFFFFAF8BFD04143CFD04FF3C143CFD04 %FF60FD04148BFFFFFFAF1414FD1752285259FFFFA9525227FD2352A8FD04 %FFAF141A141A141A141A141A141A141484FFFFFFA91A141484FFFFFFA91A %141A1461FD04FF3C1414FD04FF8B141A141AA9FFFFFF85141427522E5227 %522E5227522E5227522E5227522E52275227527DFFA87D27522E5227522E %5227522E5227522E5227522E5227522E5227522E5227522E5227522E5227 %522752A8FFFFFF60FD0E1485FFFFFFAF14141485FD04FFFD041436FD04FF %3C141484FFFFFFA8FD0414FD04FF611414FD16527DFFFF7D5228FD275227 %A8FFFFFF3D141A141A141A141A141A141A141A84FFFFFFAF3D141460FD04 %FFAF363C3CFD05FF141A1461FD04FF853C148BFD04FF3C1A142752275227 %52275227522752275227522752275227A8FFA82852275227522752275227 %522752275227522752275227522752275227522752275227522752275227 %52275252FFFFAFFD0F1485FFFFFFAFFD0414A8FD05FFAFFD05FF36FD0414 %AFFD0AFF841414147D527D527D527D527D527D527D527D527D527D52A8FF %FF527D527D527D527D527D527D527D527D527D527D527D527D527D527D52 %7D527D527D527D527D527D527D527D527DA8FF853C363D3C3C363D3C3C36 %3D3C3C363D85FFFFFFAF3D363D3685FD0AFFAF3C363D3C3C60FD0AFF6136 %3D3CFD16FFA8FD49FFAFFD11FFAFFD09FFAFFFFFFF %%EndData endstream
endobj
-727 0 obj
+943 0 obj
<<
/Length 65536
>>
@@ -1466,7 +1790,7 @@ sÓ ·ÓíÑ·OÒ„ŸuMÊ’ÏyÒÁQÊ—*V€)-z=¦Hèªmƈœ~ÅñÓ×z…Sý[t¸c&4 ŽªªAj^råº;ņÜ(cçç
Dx^QÜ×}Ì
˜ØyY‰Ÿ‹© ¨zŽ…N¬V¥%™­‚¨™@“£=HU˜ü¢³l0¼Tq_PIÐ/u,dÆö¶fý"íŒØ¾MMæu [endstream
endobj
-728 0 obj
+944 0 obj
<<
/Length 65536
>>
@@ -1708,7 +2032,7 @@ qlÞ¯­ò×âô`>
¶“¬ûVG=# [ül&wJ΂fkíY”&{öñß1øÀ ÛÄ%'DSì
 F?؆Fß®U E2,„Ò -[‰Ðð~Eô׈bˆ¨<Þë‹uAhÜš:®—Ú[ɬëxÏ*}ñ
endobj
-729 0 obj
+945 0 obj
<<
/Length 65536
>>
@@ -1931,7 +2255,7 @@ uALŽk‹Š=ŽÉÀÇš?éì•ëðå0ƒ¨Ua¦7S“«ÙŽ®&éÀ­Ó˜çÈî¹m(‚4„Ћz35Ãùd2pnSø׸®÷—fSµNP™š
]×g1ͼ‘ôAÚF¥5³ò(ª®Í
endobj
-730 0 obj
+946 0 obj
<<
/Length 53114
>>
@@ -2128,1390 +2452,1811 @@ Y‘φ㧻Ç'ÇÕpV— ´Š›·§/ óü8
œ;ø# ñ<Ý°'€å‰íö Ð"W€­
Ö^IYïc­
endobj
-710 0 obj <<
-/D [706 0 R /XYZ 85.0394 794.5015 null]
+926 0 obj <<
+/D [922 0 R /XYZ 85.0394 794.5015 null]
>> endobj
-711 0 obj <<
-/D [706 0 R /XYZ 85.0394 769.5949 null]
+927 0 obj <<
+/D [922 0 R /XYZ 85.0394 769.5949 null]
>> endobj
-708 0 obj <<
-/Font << /F21 714 0 R >>
-/XObject << /Im1 707 0 R >>
+924 0 obj <<
+/Font << /F21 930 0 R >>
+/XObject << /Im1 923 0 R >>
/ProcSet [ /PDF /Text ]
>> endobj
-733 0 obj <<
-/Length 1059
+949 0 obj <<
+/Length 1063
/Filter /FlateDecode
>>
stream
-xÚµVËn«HÝç+XÆRh÷ƒWÏŽ`l3Âà|£ÑÜY›ÄH‰± ¹Vþ~ªéŒ‰f3ò¢«éãªS§ªDÃð#ši!‹S®ÙÜ@&&¦¶}¿ÃÚ+¬-îˆÂ&C¦ÁL¾XÕ #ÃâšÎ 䀳KÐ Øâȶlªé¶É‘Å(èÇìn:§Tãˆ[ÔÒ²Í6m8¦Ö£²Ý_÷^uü<•¯ûfòwö»fbdc¤ÃX¶ba:'Æ…'B@nkúî'$*¡£ „"HU¤)@cãa¢S ÓLk0íÁt“÷&ÁÒ
-Mq:œ¥ŸuS¼×râU‡º:5åÇûC‡Ý¢‰Îš&þI©¤ž`Jë;?ëõ$Œ"Ó²,Œ@!¹ù­ø=Z¿„ߪO˜ ·ùàõßä§ÿ§üx” &Lö¥ºÕKsÎOâÜ×£ký ³)ÅŽfS<-ç[ù:°~‰¾UÏtÅ” >E:ëâô^ÖuY$§¦’ãG]¨|¶ ï„r¯æïÕ®|}É»iu’ö®¬›SùüѨ›}©ª¾Éÿ¥ûS~ø”Æñãt¬jµ|.›½´:œøR}(=_
-…ƒ
-ÙiíôP5å¶è5¸Nøx%í~<¹ÊªTëùÛ›L„;ˆcËg±Ë¢nšsÄ %'6âŒÚ-$[úªÕâyö4áôÞMÔ— •ã:‰3&gb÷ºi‡3i»Ñ¬ûèIcVè+vÃP*JâFYà«Å§ [J+ñn2“ÛŽ`FÇ)eBýXB³eGñ ò‘nfA´¸
-¬ÖaÐåò“x.Ç•ŸxKX˜Øƽû„Aöç¨`g!n8vÇŽ´ìæAùiŠ:rŒ_ÿ‡þ$áåÀ¨ÓëQQ÷1Tö<Nº¨*|ºö½À :ßk9v'ntó \´ @0²Æbzq”úl€xTÝ•»èµ¸>Z}Zº"J–ÆXÒU/Ý„í×^úy¯Tbq:ˆ,(aãU7©ßå&Ý·óŽ¥Ó‡Ž‡]œŒ5w»ÑË‚8—ÒÎw¤Qä/Â`áGž?Ž·žWxP‡ŒË-›1™0ò7éeHåØM‚´—"Þdc&ñk`ùŒ‡mÑïSÐgTV±ñ9#c×~³r‡|æßm™›«„ n[p@šà•|{•ô`ý}{•PJ±ÞûD¿zL\_tmš”ÂvcÖXnª7‰·ÏOàHyiäù]4ªï-dûJ¡¤Ø«J¿^ÙŒ.'/+á¢9”yëÁ0ááÀnúÔ•î™pOÇÄöMsüm:=ŸÏBaTÖ[Tµ¤^§7·¶z´2‰gé~²þpz”¦endstream
+xÚµV]“ª8}Ÿ_ÁãX5D’0ûÆ *[.àÚÚ»ŒâHÕŒXÂ\kþývH
+c2Š˜I)Lî¬ê&#ˆB5šhÞ.Q7hf#Š)×t›qdQø ŸÓ‡ñŒ#nKKwšEáŒh*Ýþõè–ǯSñ¶¯G§¿kÌ@¶Á¢†!±0žaó“Nmq[Ó/p?!S ÅA®"O"†a>t a²Þ´zÓîÍIoòÎÄFobiù‡:?òZÎ’¯ªÎ?*9qËCUžêâóã©ÅnÐH§Ø
+Dá1F„Boè`pÛU¤·ÏeÀWàí”AQ¶Šø±Y,Û|ÛÒÍêÖRî³×òWÞK!;­™ʺØä× ¯¤ÀÇ<SYj={—‰ð â†Å†™@ì"¯šFæ58¢&…’cqJì’.<ÕjÑ,}qòèÄê‹ŸÈqG?ü©7•3±{¤Eˆ™´pÚ~t¥1+pü¥;A %vÂÔ÷Ôâ‹Ÿ.¤{s'žÊm §1%ÔR¡~$¡é¢¥x‡|èë©ί‚ûËUà·¹ÜcÍä¸ôbw #Û|tžýÀOÿìì,Ä͉ݲà »™Ÿ†^’ –ƒCÅ×ûá?IxÑ3jõzVÔßy”=‹â6ª
+Ÿ¬<×w‚§VãØsŽí‰Þ|M`YC1Ý(L¼?ÖÀ
+<*‡ÎÒ™wZ\¬¾,%M"H,n«—¬ƒæk'ý,Ž–*±(éE” ãU׉×æ&Ý7òŽ¥“§–‡]5wÚÑMý(–ÒNcg QèÍî…®7Œ5žWx –[6c<¢6ä­“ËʱûI'E´N‡L¢+ÖÀ,ô.÷Û¢Û§ Ï ¬bãsŠ‡"®¼:géôù̾Û27W ÁÂܶà€dà{•t`ý}{•‚¶'¼ó)ˆÞ{L\_tMšÞh&µ†úsf(ð>;#奖çw^«¾·í+…â|{.KuþºE=¸œÜì½€‹æPd“ÁÃÞô©#ÝSáž ‰íëúøÛx|>Ÿ…¨¨6¨lH½onmõ€¥ ‰'ê~¾þN!–Éendstream
endobj
-732 0 obj <<
+948 0 obj <<
/Type /Page
-/Contents 733 0 R
-/Resources 731 0 R
+/Contents 949 0 R
+/Resources 947 0 R
/MediaBox [0 0 595.2756 841.8898]
-/Parent 715 0 R
+/Parent 931 0 R
>> endobj
-734 0 obj <<
-/D [732 0 R /XYZ 56.6929 794.5015 null]
+950 0 obj <<
+/D [948 0 R /XYZ 56.6929 794.5015 null]
>> endobj
-731 0 obj <<
-/Font << /F22 737 0 R /F14 740 0 R >>
+947 0 obj <<
+/Font << /F22 953 0 R /F14 956 0 R >>
/ProcSet [ /PDF /Text ]
>> endobj
-743 0 obj <<
-/Length 2884
+959 0 obj <<
+/Length 2886
/Filter /FlateDecode
>>
stream
-xÚí]wÛ¸†ïó+tWûB(¾ ^:Ž“u·ÉæÄÎé×ö‚GflõX¤KQ¾ €# œÍn²±tr!ÙÒp&ó>Àf3jÿ±™Q„Š\β\E™š-V/èìÚ~öæsß‘J%…°?D>+aˆ2<›ÍáA^^¾øãkÎf\’Ìdlvùiô¥8á\ä³Ë«ÖU[VíúøŸ—ê r’k®»ïÓÙ\s"0ý7ÙñœQJΫ¶©¯6‹vYWÕ‹³ËŒ‚hÊäL›œd’².”áÃæz6¼ù°»ûþøØÇPv;D´ãÞ¥ IØ®Sœæö­±i×YF´d. ¤Ïƒ¢G‹ú®<žsû¶þ4¼¾ª›•Íæñ\™üˆØ›¯gù"ó/ùÿMRã3½#Ûç膻Bîÿ3ôDÂÀ(BŠ´êÎbí(⎢ŸšcfŽ®‹jùߢ?£¶€º¼Y®£%E¶?ÀL’â³™L
-0ÄHÙRkš”H)¨ó@Šï¥ô)‘bGê{ €eÄ!ñq]^ ï–Õ4.Bég È$>{Éd
-Á$† ê|Ä„e„)ª&ÜcÒ$îbRTWññÅ~.´|–TLâà3–Œ0Äp€Š 8DÂÀp@8P;ET\„ÃáïuÕ‹Mù³žÕ|ƒÑÅg<'`ˆáEpŠ„á„:8©œ“\ÉP®ôK‡Óɦ½©›ekg<÷åN¹R6÷eÓ_“²}¬KBÖR‘€†[ªˆI$ba HàΙ’$˲|¦ %F©±.*«Ø÷ÍrU4Ão [¼66g‚ïÕÀ•L0Ä(€B DÂÀ(@hC2•i@w\Ü÷ÅÍþ\)>Ç…O]2ÀãJƒp ãu>r¡4Ñ*€ á¹hËⶽyD†¦ù¡†YKFbH@U$"a`H ÎÇBJ¢4kåjˆÓbq³¬®'«aØÞ›“„ø$& 1B HršH!¨óqÐœHÍÇ’B…’âuÝü§èدzTäw2ùš×Ÿ½d4€!†TA#†ê|<8%B˱ÎÐnðˆÍ6À:úÛÍm»¼»u_ùPßv“ß\èç>óðéJfb,@9"a`,ì8‡;Ç~Ó[æÉ„ b˜[Ù/Ïß½r—ëzÓ,¼âå¿7˦\ùñh¶ÂŸºÅ -î­HÕd–àÑìì:m,H›&-„[«[Ü?¸ÁÓ ¢.;Ãû.Cý›!Ks# ?èÙrœzvACäìÚÒá&Æê<ð“ ¢„Ì?~sûôýGxBA\2j‹‡é ù<'3 1† ŽC‘00†Pç!m¯ÐB»•ï°íý¶\Õ~1h#™Ë8OÇ'7`ˆÅCÀ‰„ƒ:àÈœaÜ¥=ìŠ?®ñ†÷ç]»Û:,;ŸU÷Pu5´KôßY¯7]Å÷{jâúµÚ#B²’A
- ø]ll}ý}Š’õ†˜þPDÿH˜þ¨óñj@É8ED˜‹\,¯«b8ùÙ¡ ý2’¸!šS6&û‰$y»94Œ´sü¾¯cº­=†ÒŽ÷Øú!7‚P“K×Å0¬ž\ÝÛéŒ_bo²*‹vÓ”ëÉL…ƒ}få0dDVwŽÛghºiÉÌ®×X¡Î3Jòœ ¼ K‡ïêvùÉÎì홺Gw|«a À‹‘zBCäÜ#,Fê=¦ŒÖ…ͯ.¼z¨Š•/ë>Þ]­½š›L ú¿!ryNfh´Ã*b턹å
-€°u^-ÆÖNwãd˜QУ¦¨ÖŸB»iw3þù__îÆ×yöœÁ™DÅg3`ˆ¡ÕbÓ]§±80TPï;Þ¨ÜøŠÈ·¦\ÜÝ.[X*}¨…~ËáÈËÌ0ă2cŒEâÀC½×2F‰M_î! ײ³_À¦ýú1sÝïÊvsוHbŸáðéK†bp@y08"q`p Þý
+xÚí]wÛ¸†ïó+tWûB(¾ ^:Ž“u·ÉæÄÎé×ö‚GflõX¤KQ¾ €# œÍn²±tö´¥áÌÎû
+x6$a»N9pšÛCcÓ®³ŒhÉ\HŸE.õ]y<çö°þ4ü|U/6+›Íã¹2ù±?l¾žå™Éÿß$5>Ó;²}Ž`¸+äîù?CO$ Œ"Ôy H«î*ÖŽ"î(ú©9fæ躨–ÿ-ú+j ¨Ë›åú1ZRdûÌ$)>›É¤
+êœqNLžYç<'\_³È¾já6Vü„×›êªè†ˆâ¶3ŒØ»*䉘øL&c 1L R&‘00LPç#&,#LQ0á“~$q7“¢ºŠ/ös¡å³¤bŸ±d€!†TÁ!†ê|ÄÚ)¢â"à ¯«^lÊŸõ¬æŒ.>ãÉ8C '¨(‚S$ 'ÔyÀIåœäJ†r¥/X:œN6íMÝ,[;ã¹/wÊ•²¹/›þž”íc]²–Š4DØREL" AwΔ$Y–å3e(1JuÉP™Xžo–«¢y~y[Øâµ±9|¯†¨d
+€!F¡ Fê|¤@’©L
+¸£àⶸ<(nöçNñ9.|ê’¹
+¿Z×U½n— ÷Ð̈ƒ2fûHBÎ’
+‹µÁPá_ù™óœ˜ØûÆ»Õõ Î…~‰‰&Áº"15s_êb["_ø3yoÿ>ªendstream
endobj
-742 0 obj <<
+958 0 obj <<
/Type /Page
-/Contents 743 0 R
-/Resources 741 0 R
+/Contents 959 0 R
+/Resources 957 0 R
/MediaBox [0 0 595.2756 841.8898]
-/Parent 715 0 R
-/Annots [ 746 0 R 747 0 R 748 0 R 749 0 R 750 0 R 751 0 R 752 0 R 753 0 R 754 0 R 755 0 R 756 0 R 757 0 R 758 0 R 759 0 R 760 0 R 761 0 R 762 0 R 763 0 R 764 0 R 765 0 R 766 0 R 767 0 R 768 0 R 769 0 R 770 0 R 771 0 R 772 0 R 773 0 R 774 0 R 775 0 R 776 0 R 777 0 R 778 0 R 779 0 R 780 0 R 781 0 R 782 0 R 783 0 R 784 0 R 785 0 R 786 0 R 787 0 R 788 0 R 789 0 R 790 0 R 791 0 R 792 0 R 793 0 R 794 0 R 795 0 R ]
+/Parent 931 0 R
+/Annots [ 962 0 R 963 0 R 964 0 R 965 0 R 966 0 R 967 0 R 968 0 R 969 0 R 970 0 R 971 0 R 972 0 R 973 0 R 974 0 R 975 0 R 976 0 R 977 0 R 978 0 R 979 0 R 980 0 R 981 0 R 982 0 R 983 0 R 984 0 R 985 0 R 986 0 R 987 0 R 988 0 R 989 0 R 990 0 R 991 0 R 992 0 R 993 0 R 994 0 R 995 0 R 996 0 R 997 0 R 998 0 R 999 0 R 1000 0 R 1001 0 R 1002 0 R 1003 0 R 1004 0 R 1005 0 R 1006 0 R 1007 0 R 1008 0 R 1009 0 R 1010 0 R 1011 0 R ]
>> endobj
-746 0 obj <<
+962 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
/Rect [532.6051 688.709 539.579 697.4212]
/Subtype /Link
/A << /S /GoTo /D (chapter.1) >>
>> endobj
-747 0 obj <<
+963 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
/Rect [532.6051 676.5858 539.579 685.5919]
/Subtype /Link
/A << /S /GoTo /D (section.1.1) >>
>> endobj
-748 0 obj <<
+964 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
/Rect [532.6051 664.4876 539.579 673.4937]
/Subtype /Link
/A << /S /GoTo /D (section.1.2) >>
>> endobj
-749 0 obj <<
+965 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
/Rect [532.6051 652.3894 539.579 661.3954]
/Subtype /Link
/A << /S /GoTo /D (section.1.3) >>
>> endobj
-750 0 obj <<
+966 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
/Rect [532.6051 640.2911 539.579 649.1477]
/Subtype /Link
/A << /S /GoTo /D (section.1.4) >>
>> endobj
-751 0 obj <<
+967 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
/Rect [532.6051 628.1929 539.579 637.0495]
/Subtype /Link
/A << /S /GoTo /D (subsection.1.4.1) >>
>> endobj
-752 0 obj <<
+968 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
/Rect [532.6051 616.0946 539.579 624.9512]
/Subtype /Link
/A << /S /GoTo /D (subsection.1.4.2) >>
>> endobj
-753 0 obj <<
+969 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
/Rect [532.6051 603.9964 539.579 612.853]
/Subtype /Link
/A << /S /GoTo /D (subsection.1.4.3) >>
>> endobj
-754 0 obj <<
+970 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
/Rect [532.6051 591.7985 539.579 600.7547]
/Subtype /Link
/A << /S /GoTo /D (subsection.1.4.4) >>
>> endobj
-755 0 obj <<
+971 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
/Rect [532.6051 579.7002 539.579 588.6565]
/Subtype /Link
/A << /S /GoTo /D (subsubsection.1.4.4.1) >>
>> endobj
-756 0 obj <<
+972 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
/Rect [532.6051 567.6019 539.579 576.5582]
/Subtype /Link
/A << /S /GoTo /D (subsubsection.1.4.4.2) >>
>> endobj
-757 0 obj <<
+973 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
/Rect [532.6051 555.5037 539.579 564.46]
/Subtype /Link
/A << /S /GoTo /D (subsubsection.1.4.4.3) >>
>> endobj
-758 0 obj <<
+974 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
/Rect [532.6051 543.5051 539.579 552.5112]
/Subtype /Link
/A << /S /GoTo /D (subsection.1.4.5) >>
>> endobj
-759 0 obj <<
+975 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
/Rect [532.6051 531.4069 539.579 540.413]
/Subtype /Link
/A << /S /GoTo /D (subsubsection.1.4.5.1) >>
>> endobj
-760 0 obj <<
+976 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
/Rect [532.6051 519.3086 539.579 528.3147]
/Subtype /Link
/A << /S /GoTo /D (subsection.1.4.6) >>
>> endobj
-761 0 obj <<
+977 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
/Rect [532.6051 496.5559 539.579 505.288]
/Subtype /Link
/A << /S /GoTo /D (chapter.2) >>
>> endobj
-762 0 obj <<
+978 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
/Rect [532.6051 484.4775 539.579 493.4338]
/Subtype /Link
/A << /S /GoTo /D (section.2.1) >>
>> endobj
-763 0 obj <<
+979 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
/Rect [532.6051 472.3792 539.579 481.3355]
/Subtype /Link
/A << /S /GoTo /D (section.2.2) >>
>> endobj
-764 0 obj <<
+980 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
/Rect [532.6051 460.281 539.579 469.2373]
/Subtype /Link
/A << /S /GoTo /D (section.2.3) >>
>> endobj
-765 0 obj <<
+981 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
/Rect [532.6051 448.1827 539.579 457.139]
/Subtype /Link
/A << /S /GoTo /D (section.2.4) >>
>> endobj
-766 0 obj <<
+982 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
/Rect [532.6051 436.0845 539.579 445.0408]
/Subtype /Link
/A << /S /GoTo /D (section.2.5) >>
>> endobj
-767 0 obj <<
+983 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
/Rect [532.6051 413.5759 539.579 422.1635]
/Subtype /Link
/A << /S /GoTo /D (chapter.3) >>
>> endobj
-768 0 obj <<
+984 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
/Rect [532.6051 401.4527 539.579 410.3093]
/Subtype /Link
/A << /S /GoTo /D (section.3.1) >>
>> endobj
-769 0 obj <<
+985 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
/Rect [532.6051 389.3544 539.579 398.2111]
/Subtype /Link
/A << /S /GoTo /D (subsection.3.1.1) >>
>> endobj
-770 0 obj <<
+986 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
/Rect [532.6051 377.2562 539.579 386.1128]
/Subtype /Link
/A << /S /GoTo /D (subsection.3.1.2) >>
>> endobj
-771 0 obj <<
+987 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
/Rect [532.6051 365.0583 539.579 374.0146]
/Subtype /Link
/A << /S /GoTo /D (section.3.2) >>
>> endobj
-772 0 obj <<
+988 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
/Rect [532.6051 352.96 539.579 361.9163]
/Subtype /Link
/A << /S /GoTo /D (section.3.3) >>
>> endobj
-773 0 obj <<
+989 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
/Rect [532.6051 340.8618 539.579 349.818]
/Subtype /Link
/A << /S /GoTo /D (subsection.3.3.1) >>
>> endobj
-774 0 obj <<
+990 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
/Rect [532.6051 328.7635 539.579 337.7198]
/Subtype /Link
/A << /S /GoTo /D (subsubsection.3.3.1.1) >>
>> endobj
-775 0 obj <<
+991 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
/Rect [532.6051 316.6653 539.579 325.6216]
/Subtype /Link
/A << /S /GoTo /D (subsubsection.3.3.1.2) >>
>> endobj
-776 0 obj <<
+992 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [527.6238 304.6667 539.579 313.6728]
+/Rect [527.6238 304.567 539.579 313.6728]
/Subtype /Link
/A << /S /GoTo /D (subsection.3.3.2) >>
>> endobj
-777 0 obj <<
+993 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
/Rect [527.6238 281.9139 539.579 290.7706]
/Subtype /Link
/A << /S /GoTo /D (chapter.4) >>
>> endobj
-778 0 obj <<
+994 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
/Rect [527.6238 269.8356 539.579 278.9413]
/Subtype /Link
/A << /S /GoTo /D (section.4.1) >>
>> endobj
-779 0 obj <<
+995 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
/Rect [527.6238 257.7373 539.579 266.8431]
/Subtype /Link
/A << /S /GoTo /D (section.4.2) >>
>> endobj
-780 0 obj <<
+996 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
/Rect [527.6238 245.6391 539.579 254.7448]
/Subtype /Link
/A << /S /GoTo /D (subsection.4.2.1) >>
>> endobj
-781 0 obj <<
+997 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [527.6238 233.6405 539.579 242.6465]
+/Rect [527.6238 233.5408 539.579 242.6465]
/Subtype /Link
/A << /S /GoTo /D (section.4.3) >>
>> endobj
-782 0 obj <<
+998 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [527.6238 221.5422 539.579 230.5483]
+/Rect [527.6238 221.4426 539.579 230.5483]
/Subtype /Link
/A << /S /GoTo /D (section.4.4) >>
>> endobj
-783 0 obj <<
+999 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
/Rect [527.6238 209.444 539.579 218.4501]
/Subtype /Link
/A << /S /GoTo /D (subsection.4.4.1) >>
>> endobj
-784 0 obj <<
+1000 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [527.6238 197.3457 539.579 206.3518]
+/Rect [527.6238 197.2461 539.579 206.3518]
/Subtype /Link
/A << /S /GoTo /D (section.4.5) >>
>> endobj
-785 0 obj <<
+1001 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [527.6238 185.2475 539.579 194.2536]
+/Rect [527.6238 185.1478 539.579 194.1041]
/Subtype /Link
/A << /S /GoTo /D (subsection.4.5.1) >>
>> endobj
-786 0 obj <<
+1002 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [527.6238 173.1492 539.579 182.1553]
+/Rect [527.6238 173.0496 539.579 182.0058]
/Subtype /Link
/A << /S /GoTo /D (subsubsection.4.5.1.1) >>
>> endobj
-787 0 obj <<
+1003 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [527.6238 160.9513 539.579 170.0571]
+/Rect [527.6238 160.9513 539.579 169.9076]
/Subtype /Link
/A << /S /GoTo /D (subsubsection.4.5.1.2) >>
>> endobj
-788 0 obj <<
+1004 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [527.6238 148.8531 539.579 157.9588]
+/Rect [527.6238 148.8531 539.579 157.8094]
/Subtype /Link
/A << /S /GoTo /D (subsection.4.5.2) >>
>> endobj
-789 0 obj <<
+1005 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [527.6238 136.7548 539.579 145.8606]
+/Rect [527.6238 136.7548 539.579 145.7111]
/Subtype /Link
/A << /S /GoTo /D (subsection.4.5.3) >>
>> endobj
-790 0 obj <<
+1006 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [527.6238 124.6566 539.579 133.7623]
+/Rect [527.6238 124.7562 539.579 133.7623]
/Subtype /Link
/A << /S /GoTo /D (subsection.4.5.4) >>
>> endobj
-791 0 obj <<
+1007 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [527.6238 112.5583 539.579 121.6641]
+/Rect [527.6238 112.658 539.579 121.6641]
/Subtype /Link
/A << /S /GoTo /D (subsection.4.5.5) >>
>> endobj
-792 0 obj <<
+1008 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [527.6238 100.4601 539.579 109.5658]
+/Rect [527.6238 100.5597 539.579 109.5658]
/Subtype /Link
/A << /S /GoTo /D (subsection.4.5.6) >>
>> endobj
-793 0 obj <<
+1009 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [527.6238 88.3618 539.579 97.4676]
+/Rect [527.6238 88.4615 539.579 97.4676]
/Subtype /Link
/A << /S /GoTo /D (section.4.6) >>
>> endobj
-794 0 obj <<
+1010 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [527.6238 76.2636 539.579 85.3693]
+/Rect [527.6238 76.3632 539.579 85.2199]
/Subtype /Link
/A << /S /GoTo /D (section.4.7) >>
>> endobj
-795 0 obj <<
+1011 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [527.6238 64.1653 539.579 73.1216]
+/Rect [527.6238 64.265 539.579 73.1216]
/Subtype /Link
/A << /S /GoTo /D (section.4.8) >>
>> endobj
-744 0 obj <<
-/D [742 0 R /XYZ 85.0394 794.5015 null]
+960 0 obj <<
+/D [958 0 R /XYZ 85.0394 794.5015 null]
>> endobj
-745 0 obj <<
-/D [742 0 R /XYZ 85.0394 711.9273 null]
+961 0 obj <<
+/D [958 0 R /XYZ 85.0394 711.9273 null]
>> endobj
-741 0 obj <<
-/Font << /F21 714 0 R /F22 737 0 R >>
+957 0 obj <<
+/Font << /F21 930 0 R /F22 953 0 R >>
/ProcSet [ /PDF /Text ]
>> endobj
-798 0 obj <<
-/Length 3163
+1014 0 obj <<
+/Length 3289
/Filter /FlateDecode
>>
stream
-xÚí[wÛ¸Çßý)ôh?Åýò˜ûɶM²±÷¥Û}`dÆÖ‰$z%9©ûé Š8´À‘ÐÆili÷ìÚ‰9œñüÂ`@d#êÿe#¥‰vÜŒ“DQ¦F“ù ]ùŸ½9aí1ãpÐõüâä/¯…9â4×£‹Ï#©ájs2K¨µltqùûé‹÷ï.^½»8?ûãâ—“Wñ¬Ð3£¢>åŸ'¿ÿAG—>€_N(ΪÑ7ÿJ˜s|4?‘J%…3;9?ù5žütcšüM%\hžøU8¿JýCÅFF9¢›_DKØÙ˜qJOß”‹rY¬§‹«³1Wôô¯åÝêll5?%gcåx|_¤sßíd÷¥¦>ëFè.Ÿ[Ú,¯FÍ7¡ZÁn ·ÕÚ>­§[qõSq`¬ Þ+ÒM©Ž¬ð–•óéÕ"‚²¾.›oþQ-üw†ê#1(1!«ÙÄ
-9Îb
-eÉÅ)̳ËË峧åjÕò·ªúr{Óþá·Uzžùšï>–“jcs¹™ì˜Ç@À æ!/ÙšCLs˜w.†5OÄiŽzo5×Îi„‹šó!Í×Uóõ]1/q
-ÞM?}šµÇ¼®–ób3⸟]昊\™¡!"s/Ո̩8™·½3è½m´1„ù2²q®êÊàsqf˜½°‘vzu½þVÖÿŸçU5óÓŠáì>Œý² qow“55œ5p:,[[^S•TkE˜d¶ÉÖf¬+iÌ×pzÚZË;_N¥|Ê%s…¾ìO0Ä>IPŒ‰D¨÷Ȇ„1Ê[6xËÆÇÛE׺)*^å¼ò“.gÔÁͪI ÉÌ&b¤@±0Rq`¤lyOŽ¹‚K]ƒ©nÇÜ­¡¶ëàŠõ´Zr>—Ër1)‡3N¾÷x °ñÍÍpÆÀé°LmyM~¦˜%Æ´«€:Ž·ÉÔ¼ž†¹Å«Y9/k?QÌj¿2ÈGHiö' bŸ,(ÆI"ŒÔ{˜´RMŒÔ*à2ܨü½XO®CQ^Õ¨hÃ=í=TB:³Q†*P.n‡QIÄ¡‚zg\)˜)aÒv°lpõzÈÝb]üël,œ:.­îJLe.(Ð¥'J*Ü{ŠåD[Á
-
-0Ä@Ra $âÀ@A½w HM”íšʱ®l3²”Í
-©Í¦¦³Ã ÂaÌl!ƒ¹Äpωa2n'2³êêªÞI–(TÆyNíZÏQò vÆg£ 1v „<‰80zPï&ýáNwKô¡øÙc¢óÿÙeõÝîËlN€!Æ Ô
-ã$Æ ê=^e’”N¤Ô×#m»myM}W-ìwr],ejÕÏrR)Ý÷ázY¬< ZðÚՄôfà 1x |BÓˆƒõáÎÃb@;UŸ ?\UËÔLGR¢­¹¤ö *TLo.<Ч'ŸÐƒð¤â@àÁ½wðK˜”°FÕ·§î ÏŸ·åòn\.—Õ2µø§,q҆ſ4/´Ô r2™Í 0Ä8J‰áýu©80NPïíLÆ÷ê„1êÓî«š³oË2Å÷ó˜8¨ Mƒ¹Ò|}<¦;%`ˆ¡åÄPJÄ¡„z()I¨e¼C‰?J»gÄ’¹'T¥BZ³‘†2P61¼ +† ê= #9¡Ò©™ÝW4çÅj]&kRÝGI§wöáú°f9!ÇÙü
-Ê8¼U*ö¶+Ìuxo€"‚ƒ&Â>>û< ï)ôœm>óßÝÌÐ7·tZaïm¹Á"ñ]¿cî¼´É–øÿqJñÿýÕÂÝe}k‘ØžÅ-%J+5~þ*š±t:Eî‰ÙBÿíÈTìendstream
+xÚímS#7Çßó)\uo ê¬=K/ Ëæ’ì²ÜÚ{UwI^8f\ñ1ö&äÓŸÆ3­icMƒrû8©Z{ÚÝôÿçVK£±y¯ÿóž6Ìxá{Ö+¦ ®{ãÙAÑ» Ï}{À›súpRŸõÍðà/¥íyæ0½áûžÒš ½y1Ç
+çxoxñãáÉ›³áéÙppôóðûƒÓa|U왲zÉß~ü¹è]„
+½@$B5Dœ/'Bè¯n¯ýëâ?^l~^„&Ò:»o"ï éÌFR¨`¹(TqP¨Þ#™´®D4 "gƒNÿƒ YL§‹zža ±Ÿ’¦Ilf“‚ )R°ZÂv“’ˆƒ"…ô¤hΤjgÌìÛN WÙ CŠ¬ÅA"ŠÒ;p C‡Áu;¸Ø†ƒ;É_ËÛdõÐÊ퇔˜Äl@!‰$é
+D ¤w¸ü©µf…óŒªÁÐw¯x|UPÜáúfÕ\Ëúøõh>º,gå|UÉaŸ$/h@ö²Ñ@†X
+D¤w¨J²ÂÄ9H0nºŽW“ÏÑtrög½-oÓЋõ¥ÐûuÍ4,ÐlX! Œ‚% é`‘œ²P-,MWr¼^…J1YV>”x«MhI´Ú÷"w4f#‚ )D°LÂw#’ˆƒB„ô‡î˜÷Î#¼jÎ8iV»ÿV=TüTèâdy{½Zü: ÇÍ£7ëëëÅ2Œ2V=?p:‰¤fƒ )b°h1‰8(bHïPT
+ŠSÎa:¯g7õ¿¿­'7“UY­{ºG¼ÙóË Kål‚!EVQÝ%â "½sa˜’\õT`ÉË8ªª(r¡ž|³žL/bó溜¯š…hnãvâãÓó¸ýºlž]Ì럯&óõáE¥ú2mhü#s%Ć„„[I”¼SÂT„„´÷VB'˜/¤ÅŠ¿ áàä¸>0EQl 8XLGËI(!^Š/ZÎãßš­$2¤”Ť”LÄA)Izoʹ²sñÒ7çÐ"n‹øÍwg/ê#_ÿø}²ºªªN¡îŒzý ¤,›†ÖŽ‚ "»oæHA¡@¹nßÓÚ1§
+‰`€²œØœ¿ÃD|s7•W®}wŸVmHJ¶ÜÈÒ'<¥8齕\æ
+ÔþÉÅ_¼­ÕÂ<jµ!Ùj#CJmœoJíD”Ú¤w(õR1k‘ÔͲsb®7¬V“‹iÔnß±?„œ&»Ùà´v7H;
+›Ý (j(×
+¬œì¾+ é¨ §[.MK®©\—ãÉûÛ]tÊùåvîà >9^ÌfñŠØtsžü\”}ìY!d&[udH©Ž3/U·ê‰8(ÕIïêÒ;f÷­ê¦VýízÞÞ <ÍÊ‹»³ˆÎ»8î^2~¾v‰cr%Ɔ„Ä[i&$NÅAHL{‡õbé 3º#ˆz½ø»ó¦éaA¸ÞÕ’h½àû‚rœ 2¤
+¤3dH¡‚åRÝZRqP¨Þãe4¡-sº– .²Z¹¯Fõ¥×ûõð‡€©ÌR `©(PqP Þ[P”fÖŽ@ (/ÊjšOÚQ(.y¿»]–_ÉËÏqi$f)›dH1€UPÝnRqP Þa\‘’Y£ÚqEÄ»ˆgõýU íì¾j¨@:³QA†*X.
+•D*¤÷¶\άí¸"öãÊ_R™
+2¤@ÁRQ $â @!½· žÙ‚sÊ~\Ùe
+ª³FãisÎV ÒLðPŸês«ÑªlÛ˜H—ûFjsžÍ2¤xšªî?©8(žHïÀ“•ÌqbS ?Ÿ€§ûÇ2çùÓ«CÛln!Å ÖŽâ&Å é¸1œéЀDnä½ÜŒóÕ²Ú›º ô¬àRÜSŒ´{šŸ£ÐÉä8›dHñƒ5¤øIÄAñCz~”gZ‰vSŸŒŸ4ÒZ<\:9\fs‚ )N°Vª{ãZ*ŠÒ;p"-Ó¼žô½˜Læãéú¢LQb˜õü¾–Çqñ¼ºå&ÃÙð´v;H?
+Ý (r(×
+Ž¨¶+ïÒbŠ0VÐ环Fóy™Zì“Ž)­MsÞùÕrt 0R<«>¦Inþ7*€ù}
+Q8™Ývˆ‰_4Ûž%?Æ·ú—sæµÿÿ÷Ú¶_¿« ÎulÖ®`ÚhÝ“¡G—uñœLº·àÖg¡ÐÿÞÄ
endobj
-797 0 obj <<
+1013 0 obj <<
/Type /Page
-/Contents 798 0 R
-/Resources 796 0 R
+/Contents 1014 0 R
+/Resources 1012 0 R
/MediaBox [0 0 595.2756 841.8898]
-/Parent 715 0 R
-/Annots [ 803 0 R 804 0 R 805 0 R 806 0 R 807 0 R 808 0 R 809 0 R 810 0 R 811 0 R 812 0 R 813 0 R 814 0 R 815 0 R 816 0 R 817 0 R 818 0 R 819 0 R 820 0 R 821 0 R 822 0 R 823 0 R 824 0 R 825 0 R 826 0 R 827 0 R 828 0 R 829 0 R 830 0 R 831 0 R 832 0 R 833 0 R 834 0 R 835 0 R 836 0 R 837 0 R 838 0 R 839 0 R 840 0 R 841 0 R 842 0 R 843 0 R 844 0 R 845 0 R 846 0 R 847 0 R 848 0 R 849 0 R 850 0 R 851 0 R 852 0 R 853 0 R 854 0 R 855 0 R 856 0 R 857 0 R 858 0 R 859 0 R ]
+/Parent 931 0 R
+/Annots [ 1019 0 R 1020 0 R 1021 0 R 1022 0 R 1023 0 R 1024 0 R 1025 0 R 1026 0 R 1027 0 R 1028 0 R 1029 0 R 1030 0 R 1031 0 R 1032 0 R 1033 0 R 1034 0 R 1035 0 R 1036 0 R 1037 0 R 1038 0 R 1039 0 R 1040 0 R 1041 0 R 1042 0 R 1043 0 R 1044 0 R 1045 0 R 1046 0 R 1047 0 R 1048 0 R 1049 0 R 1050 0 R 1051 0 R 1052 0 R 1053 0 R 1054 0 R 1055 0 R 1056 0 R 1057 0 R 1058 0 R 1059 0 R 1060 0 R 1061 0 R 1062 0 R 1063 0 R 1064 0 R 1065 0 R 1066 0 R 1067 0 R 1068 0 R 1069 0 R 1070 0 R 1071 0 R 1072 0 R 1073 0 R 1074 0 R 1075 0 R ]
>> endobj
-803 0 obj <<
+1019 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [499.2773 758.4766 511.2325 767.4329]
+/Rect [499.2773 758.5763 511.2325 767.4329]
/Subtype /Link
/A << /S /GoTo /D (subsection.4.8.1) >>
>> endobj
-804 0 obj <<
+1020 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
/Rect [499.2773 746.445 511.2325 755.4012]
/Subtype /Link
/A << /S /GoTo /D (subsection.4.8.2) >>
>> endobj
-805 0 obj <<
+1021 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [499.2773 734.5129 511.2325 743.519]
+/Rect [499.2773 734.4133 511.2325 743.3696]
/Subtype /Link
/A << /S /GoTo /D (subsection.4.8.3) >>
>> endobj
-806 0 obj <<
+1022 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [499.2773 722.4813 511.2325 731.3379]
+/Rect [499.2773 722.3816 511.2325 731.3379]
/Subtype /Link
/A << /S /GoTo /D (section.4.9) >>
>> endobj
-807 0 obj <<
+1023 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
/Rect [499.2773 710.3499 511.2325 719.3062]
/Subtype /Link
/A << /S /GoTo /D (subsection.4.9.1) >>
>> endobj
-808 0 obj <<
+1024 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
/Rect [499.2773 698.3182 511.2325 707.2745]
/Subtype /Link
/A << /S /GoTo /D (subsection.4.9.2) >>
>> endobj
-809 0 obj <<
+1025 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [499.2773 686.2866 511.2325 695.2428]
+/Subtype /Link
+/A << /S /GoTo /D (subsection.4.9.3) >>
+>> endobj
+1026 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [499.2773 674.2549 511.2325 683.2112]
+/Subtype /Link
+/A << /S /GoTo /D (subsection.4.9.4) >>
+>> endobj
+1027 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [499.2773 675.998 511.2325 684.7301]
+/Rect [499.2773 662.3229 511.2325 671.1795]
+/Subtype /Link
+/A << /S /GoTo /D (subsection.4.9.5) >>
+>> endobj
+1028 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [499.2773 650.2912 511.2325 659.1478]
+/Subtype /Link
+/A << /S /GoTo /D (subsection.4.9.6) >>
+>> endobj
+1029 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [499.2773 638.2595 511.2325 647.1161]
+/Subtype /Link
+/A << /S /GoTo /D (subsection.4.9.7) >>
+>> endobj
+1030 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [499.2773 626.2278 511.2325 635.0845]
+/Subtype /Link
+/A << /S /GoTo /D (subsection.4.9.8) >>
+>> endobj
+1031 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [499.2773 614.0965 511.2325 623.0528]
+/Subtype /Link
+/A << /S /GoTo /D (subsection.4.9.9) >>
+>> endobj
+1032 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [499.2773 602.0648 511.2325 611.0211]
+/Subtype /Link
+/A << /S /GoTo /D (subsection.4.9.10) >>
+>> endobj
+1033 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [499.2773 590.0331 511.2325 598.9894]
+/Subtype /Link
+/A << /S /GoTo /D (subsection.4.9.11) >>
+>> endobj
+1034 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [499.2773 578.0015 511.2325 586.9578]
+/Subtype /Link
+/A << /S /GoTo /D (subsection.4.9.12) >>
+>> endobj
+1035 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [499.2773 565.9698 511.2325 574.9261]
+/Subtype /Link
+/A << /S /GoTo /D (subsection.4.9.13) >>
+>> endobj
+1036 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [499.2773 553.9381 511.2325 562.8944]
+/Subtype /Link
+/A << /S /GoTo /D (section.4.10) >>
+>> endobj
+1037 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [499.2773 541.9064 511.2325 550.8627]
+/Subtype /Link
+/A << /S /GoTo /D (subsection.4.10.1) >>
+>> endobj
+1038 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [499.2773 529.8748 511.2325 538.831]
+/Subtype /Link
+/A << /S /GoTo /D (subsection.4.10.2) >>
+>> endobj
+1039 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [499.2773 517.8431 511.2325 526.7994]
+/Subtype /Link
+/A << /S /GoTo /D (section.4.11) >>
+>> endobj
+1040 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [499.2773 505.8114 511.2325 514.7677]
+/Subtype /Link
+/A << /S /GoTo /D (subsection.4.11.1) >>
+>> endobj
+1041 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [499.2773 493.7797 511.2325 502.8855]
+/Subtype /Link
+/A << /S /GoTo /D (subsubsection.4.11.1.1) >>
+>> endobj
+1042 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [499.2773 481.7481 511.2325 490.8538]
+/Subtype /Link
+/A << /S /GoTo /D (subsubsection.4.11.1.2) >>
+>> endobj
+1043 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [499.2773 469.7164 511.2325 478.6727]
+/Subtype /Link
+/A << /S /GoTo /D (subsection.4.11.2) >>
+>> endobj
+1044 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [499.2773 457.6847 511.2325 466.641]
+/Subtype /Link
+/A << /S /GoTo /D (subsubsection.4.11.2.1) >>
+>> endobj
+1045 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [499.2773 445.653 511.2325 454.6093]
+/Subtype /Link
+/A << /S /GoTo /D (subsubsection.4.11.2.2) >>
+>> endobj
+1046 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [499.2773 433.6213 511.2325 442.5776]
+/Subtype /Link
+/A << /S /GoTo /D (subsection.4.11.3) >>
+>> endobj
+1047 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [499.2773 421.5897 511.2325 430.5459]
+/Subtype /Link
+/A << /S /GoTo /D (subsection.4.11.4) >>
+>> endobj
+1048 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [499.2773 409.558 511.2325 418.6637]
+/Subtype /Link
+/A << /S /GoTo /D (subsection.4.11.5) >>
+>> endobj
+1049 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [499.2773 397.5263 511.2325 406.6321]
+/Subtype /Link
+/A << /S /GoTo /D (subsection.4.11.6) >>
+>> endobj
+1050 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [499.2773 385.4946 511.2325 394.4509]
+/Subtype /Link
+/A << /S /GoTo /D (section.4.12) >>
+>> endobj
+1051 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [499.2773 373.4629 511.2325 382.4192]
+/Subtype /Link
+/A << /S /GoTo /D (subsection.4.12.1) >>
+>> endobj
+1052 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [499.2773 361.4313 511.2325 370.3876]
+/Subtype /Link
+/A << /S /GoTo /D (subsection.4.12.2) >>
+>> endobj
+1053 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [499.2773 339.111 511.2325 347.8432]
/Subtype /Link
/A << /S /GoTo /D (chapter.5) >>
>> endobj
-810 0 obj <<
+1054 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [499.2773 663.9862 511.2325 672.9425]
+/Rect [499.2773 327.0992 511.2325 336.0555]
/Subtype /Link
/A << /S /GoTo /D (section.5.1) >>
>> endobj
-811 0 obj <<
+1055 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [499.2773 651.9545 511.2325 660.9108]
+/Rect [499.2773 315.0676 511.2325 324.0238]
/Subtype /Link
/A << /S /GoTo /D (section.5.2) >>
>> endobj
-812 0 obj <<
+1056 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [499.2773 629.7788 511.2325 638.3664]
+/Rect [499.2773 292.7473 511.2325 301.4795]
/Subtype /Link
/A << /S /GoTo /D (chapter.6) >>
>> endobj
-813 0 obj <<
+1057 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [499.2773 617.7222 511.2325 626.5788]
+/Rect [499.2773 280.7355 511.2325 289.6918]
/Subtype /Link
/A << /S /GoTo /D (section.6.1) >>
>> endobj
-814 0 obj <<
+1058 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [499.2773 605.5908 511.2325 614.5471]
+/Rect [499.2773 268.7038 511.2325 277.8096]
/Subtype /Link
/A << /S /GoTo /D (subsection.6.1.1) >>
>> endobj
-815 0 obj <<
+1059 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [499.2773 593.5591 511.2325 602.5154]
+/Rect [499.2773 256.6722 511.2325 265.7779]
/Subtype /Link
/A << /S /GoTo /D (subsubsection.6.1.1.1) >>
>> endobj
-816 0 obj <<
+1060 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [499.2773 581.5275 511.2325 590.4837]
+/Rect [499.2773 244.7402 511.2325 253.7462]
/Subtype /Link
/A << /S /GoTo /D (subsubsection.6.1.1.2) >>
>> endobj
-817 0 obj <<
+1061 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [499.2773 569.4958 511.2325 578.4521]
+/Rect [499.2773 232.7085 511.2325 241.7146]
/Subtype /Link
/A << /S /GoTo /D (subsection.6.1.2) >>
>> endobj
-818 0 obj <<
+1062 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [499.2773 557.4641 511.2325 566.4204]
+/Rect [499.2773 220.6768 511.2325 229.6829]
/Subtype /Link
/A << /S /GoTo /D (subsubsection.6.1.2.1) >>
>> endobj
-819 0 obj <<
+1063 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [499.2773 545.4324 511.2325 554.3887]
+/Rect [499.2773 208.6451 511.2325 217.6512]
/Subtype /Link
/A << /S /GoTo /D (subsubsection.6.1.2.2) >>
>> endobj
-820 0 obj <<
+1064 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [499.2773 533.4007 511.2325 542.357]
+/Rect [499.2773 196.6134 511.2325 205.6195]
/Subtype /Link
/A << /S /GoTo /D (section.6.2) >>
>> endobj
-821 0 obj <<
+1065 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [499.2773 521.3691 511.2325 530.4748]
+/Rect [499.2773 184.4821 511.2325 193.5878]
/Subtype /Link
/A << /S /GoTo /D (subsection.6.2.1) >>
>> endobj
-822 0 obj <<
+1066 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [499.2773 509.3374 511.2325 518.4431]
+/Rect [499.2773 172.4504 511.2325 181.5562]
/Subtype /Link
/A << /S /GoTo /D (subsection.6.2.2) >>
>> endobj
-823 0 obj <<
+1067 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [499.2773 497.3057 511.2325 506.4115]
+/Rect [499.2773 160.4187 511.2325 169.5245]
/Subtype /Link
/A << /S /GoTo /D (subsection.6.2.3) >>
>> endobj
-824 0 obj <<
+1068 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [499.2773 485.274 511.2325 494.2303]
+/Rect [499.2773 148.4867 511.2325 157.4928]
/Subtype /Link
/A << /S /GoTo /D (subsection.6.2.4) >>
>> endobj
-825 0 obj <<
+1069 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [499.2773 473.2424 511.2325 482.1986]
+/Rect [499.2773 136.4551 511.2325 145.4611]
/Subtype /Link
/A << /S /GoTo /D (subsection.6.2.5) >>
>> endobj
-826 0 obj <<
+1070 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [499.2773 461.2107 511.2325 470.167]
+/Rect [499.2773 124.3237 511.2325 133.4295]
/Subtype /Link
/A << /S /GoTo /D (subsection.6.2.6) >>
>> endobj
-827 0 obj <<
+1071 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [499.2773 449.179 511.2325 458.1353]
+/Rect [499.2773 112.292 511.2325 121.3978]
/Subtype /Link
/A << /S /GoTo /D (subsection.6.2.7) >>
>> endobj
-828 0 obj <<
+1072 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [499.2773 437.1473 511.2325 446.1036]
+/Rect [499.2773 100.2604 511.2325 109.3661]
/Subtype /Link
/A << /S /GoTo /D (subsection.6.2.8) >>
>> endobj
-829 0 obj <<
+1073 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [499.2773 425.1157 511.2325 434.0719]
+/Rect [499.2773 88.2287 511.2325 97.3344]
/Subtype /Link
/A << /S /GoTo /D (subsection.6.2.9) >>
>> endobj
-830 0 obj <<
+1074 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [499.2773 413.084 511.2325 422.0403]
+/Rect [499.2773 76.197 511.2325 85.3027]
/Subtype /Link
/A << /S /GoTo /D (subsection.6.2.10) >>
>> endobj
-831 0 obj <<
+1075 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [499.2773 401.0523 511.2325 410.158]
+/Rect [499.2773 64.1653 511.2325 73.2711]
/Subtype /Link
/A << /S /GoTo /D (subsubsection.6.2.10.1) >>
>> endobj
-832 0 obj <<
+1015 0 obj <<
+/D [1013 0 R /XYZ 56.6929 794.5015 null]
+>> endobj
+1012 0 obj <<
+/Font << /F37 1018 0 R /F22 953 0 R /F21 930 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+1078 0 obj <<
+/Length 3422
+/Filter /FlateDecode
+>>
+stream
+xÚíYSIÇßùz˜xPmÝÇ>­m°ƒ íÁ8vcŽ…hƒb„ÄHÂÇ~ú­VwUeCuŠÚlˆ‰ËX©LåÿGYG³õÿ±U„
+'ÆI¢(Sƒñåœû{µÇÚ÷ Û†ð]ÏO÷þñR˜#Ns=8ý>Ëj-œžýºÿâí›Ó£7§ï~?ýqïè4~(t̨¨?ñϽ_§ƒ3ïÿÇ=J„³jðÙÿ…æ\îI%ˆ’B„ŸL÷Þïý?üëÚ4÷E”°DYn2ß„sðM˜’ÄãF9¢믢 ÷¡~àB÷O/ªú;yK,5%”IãÝÕãѪ:Ÿ/¾¶o„.$%Ú†÷½»XŒ–ÕÁPR»O†ŠÒú‡tîÿ±»¡½â–hNYJï-±çƒæÅ ”/Ø ¡ámùn~dioÅpÈÅÁƒzOðHC´fÂ#îÏŸ×Õâë°Z,æ‹e e‰“V´o~HóñGKM/'!“Åœ
+y-¦bÔ@Ýï§&F ê=QÃ1ÒH"5b#5—£åªÊöMÂs#½O¼2½ú»
+9.&bA 1‚2q`¡Þ#AÚ¹fØ ’÷EÐæ–Ç}Ÿ–§˜>Rb.KI†)­Rrq ¤àÞ)ÖKAS£6‚2¿ªµÎ‚¢ýg1³¡©±ŒíTSR\ÌO²Ãðbô܃sØ1ŠX¡Y‚Gß<wheŒ|Ô­LÈe1%ÀÃj¥T?'™80PPïqö­µ V+H!¬™}?ŸÏ§Õ¨õmK‡÷à¶rtGBºŠa
+ÝB& Ô{â×Ù€ðl<®–Ë‚óÙjÝ^̧u§±CÍD/!qÅX
+`ˆQÑÑ¥í/Fê=R¡¯×·¤Â4Tü2ŸU §Žî/F³åÇõ Bö„EL\)ÐÁ¢#ŒéŸ‡äâ@°À½',,%Tw¨° ß5P¼›/ÚÄëÉrUc!ŸZ‹˜¸b*’Åô´2A`H`®Úê,,h× ñöªZŒVëIézòñu¹ª.›×'Õr~½îPÆU€årRÓb¥z\«±1ÅÒCL[˜`LÜL˜º¨÷$¯Ò„qÓ­BQ?ˆ³ÉM‚¦·äW¼—€£b€!F
+M»uÛ¨ÿììl½Éi4 «Üãô+ýb4¾XwNëí)9Ät 1¥aºm•9¦5ê=‰--ÖuK®»^½Ž[Ü^ú_ûvH(„Øá±`ÌX1Àã*bû„äâÀx@½'„&’ÙÎÞ!OªåÕ|¶¬ÂâÃt2móê7ªèÉ»_ü,T+?/&MeZ2ùà»õðõ‹Å†˜¸0½¶¿Âœ‹õwÄJ.‰”—ÌƱí .S, ž ½ñà7Û<=èå(dº˜#`ˆq•´ýEÊ\G¨÷ÄãD JPöž8Ú¼±Úºm(<ÅŒó 1^ b¶¿d™‹ãõžx¡”(ª@áÉmæŃ0Y®&ãåp|1šÍªinW¾UD*ë64B’›-8Ù³XÌ0Ä*Ùþâd.ŒÔ{dDXo d*Bqú-ÙÜÀ(÷‘èc!f«”hˆ°ÐQa!Âî=±`4Q:AùæCî«ÅõrU ÿ¨¾öÝ€Àí¦ÁŠ•[; )-æ%Ùa¸
+‹á
+n~~­£ý;_s àîc/ÀêgÈpg#¼í'ËñuFïŸþ“i!$ÝÉg! C‹†"P#‘L "¨û„ˆ„ÖûÄ"¢Eä}µJ7«œž¾^ƒ ŸF˜å
+§èŽß}òoæVìðd$hØ&±‘d‡$B¹Ææ;á!a,^ï#ê‹!×|¼]]„S²7§¾ë¥”I3(¯&ŸêÉŠl—;¡Åb@€!FT‰Ñþò¹@0FP÷i¸* a2Þ
+bPAUQ¨2`P¡îTÜSd”Pñ¨~x{rüêøMîÁ„†/Œé4TC÷€Èú»vA=CB‹y†/P0”—L /¨ûÄ óó#*àE”ðrüæÅë‡G¹Õ~$®E0\l_wRYL
+0ÄHR¡¤dÁHAÝ'R(#\ H‘%¤øÙTng‰&VºJŒR»5 ).&bA í?¼‘ #uGÅÖ®y*ÏévPüüøÍa˜1Õþº9*>ú²ªfuÙæŸ~DÌèþ*‹3ÚƒªÂ6É^½9:yV×ýNsÍ“öó<*d<ýŠ?} „L•r
+endobj
+1077 0 obj <<
+/Type /Page
+/Contents 1078 0 R
+/Resources 1076 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 931 0 R
+/Annots [ 1080 0 R 1081 0 R 1082 0 R 1083 0 R 1084 0 R 1085 0 R 1086 0 R 1087 0 R 1088 0 R 1089 0 R 1090 0 R 1091 0 R 1092 0 R 1093 0 R 1094 0 R 1095 0 R 1096 0 R 1097 0 R 1098 0 R 1099 0 R 1100 0 R 1101 0 R 1102 0 R 1103 0 R 1104 0 R 1105 0 R 1106 0 R 1107 0 R 1108 0 R 1109 0 R 1110 0 R 1111 0 R 1112 0 R 1113 0 R 1114 0 R 1115 0 R 1116 0 R 1117 0 R 1118 0 R 1119 0 R 1120 0 R 1121 0 R 1122 0 R 1123 0 R 1124 0 R 1125 0 R 1126 0 R 1127 0 R 1128 0 R 1129 0 R 1130 0 R 1131 0 R 1132 0 R 1133 0 R 1134 0 R 1135 0 R 1136 0 R 1137 0 R 1138 0 R ]
+>> endobj
+1080 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [499.2773 389.0206 511.2325 397.9769]
+/Rect [527.6238 758.4766 539.579 767.5824]
/Subtype /Link
/A << /S /GoTo /D (subsubsection.6.2.10.2) >>
>> endobj
-833 0 obj <<
+1081 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [499.2773 376.9889 511.2325 385.9452]
+/Rect [527.6238 746.5057 539.579 755.462]
/Subtype /Link
/A << /S /GoTo /D (subsubsection.6.2.10.3) >>
>> endobj
-834 0 obj <<
+1082 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [499.2773 364.9573 511.2325 373.9135]
+/Rect [527.6238 734.5349 539.579 743.6406]
/Subtype /Link
/A << /S /GoTo /D (subsection.6.2.11) >>
>> endobj
-835 0 obj <<
+1083 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [499.2773 352.9256 511.2325 361.8819]
+/Rect [527.6238 722.564 539.579 731.5203]
/Subtype /Link
/A << /S /GoTo /D (subsection.6.2.12) >>
>> endobj
-836 0 obj <<
+1084 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [499.2773 340.8939 511.2325 349.8502]
+/Rect [527.6238 710.5931 539.579 719.5494]
/Subtype /Link
/A << /S /GoTo /D (subsection.6.2.13) >>
>> endobj
-837 0 obj <<
+1085 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [499.2773 328.8622 511.2325 337.8185]
+/Rect [527.6238 698.6222 539.579 707.5785]
/Subtype /Link
/A << /S /GoTo /D (subsection.6.2.14) >>
>> endobj
-838 0 obj <<
+1086 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [499.2773 316.8305 511.2325 325.7868]
+/Rect [527.6238 686.6513 539.579 695.6076]
/Subtype /Link
/A << /S /GoTo /D (subsection.6.2.15) >>
>> endobj
-839 0 obj <<
+1087 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [499.2773 304.8985 511.2325 313.9046]
+/Rect [527.6238 674.6804 539.579 683.6367]
/Subtype /Link
/A << /S /GoTo /D (subsection.6.2.16) >>
>> endobj
-840 0 obj <<
+1088 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [499.2773 292.8669 511.2325 301.873]
+/Rect [527.6238 662.7096 539.579 671.6658]
/Subtype /Link
/A << /S /GoTo /D (subsubsection.6.2.16.1) >>
>> endobj
-841 0 obj <<
+1089 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [499.2773 280.7355 511.2325 289.8413]
+/Rect [527.6238 650.7387 539.579 659.695]
/Subtype /Link
/A << /S /GoTo /D (subsubsection.6.2.16.2) >>
>> endobj
-842 0 obj <<
+1090 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [499.2773 268.7038 511.2325 277.8096]
+/Rect [527.6238 638.7678 539.579 647.7241]
/Subtype /Link
/A << /S /GoTo /D (subsubsection.6.2.16.3) >>
>> endobj
-843 0 obj <<
+1091 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [499.2773 256.6722 511.2325 265.7779]
+/Rect [527.6238 626.7969 539.579 635.7532]
/Subtype /Link
/A << /S /GoTo /D (subsubsection.6.2.16.4) >>
>> endobj
-844 0 obj <<
+1092 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [499.2773 244.6405 511.2325 253.7462]
+/Rect [527.6238 614.826 539.579 623.7823]
/Subtype /Link
/A << /S /GoTo /D (subsubsection.6.2.16.5) >>
>> endobj
-845 0 obj <<
+1093 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [499.2773 232.6088 511.2325 241.5651]
+/Rect [527.6238 602.8551 539.579 611.8114]
/Subtype /Link
/A << /S /GoTo /D (subsubsection.6.2.16.6) >>
>> endobj
-846 0 obj <<
+1094 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [499.2773 220.5771 511.2325 229.5334]
+/Rect [527.6238 590.8843 539.579 599.8405]
/Subtype /Link
/A << /S /GoTo /D (subsubsection.6.2.16.7) >>
>> endobj
-847 0 obj <<
+1095 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [499.2773 208.5455 511.2325 217.5017]
+/Rect [527.6238 579.013 539.579 587.8696]
/Subtype /Link
/A << /S /GoTo /D (subsubsection.6.2.16.8) >>
>> endobj
-848 0 obj <<
+1096 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [499.2773 196.5138 511.2325 205.4701]
+/Rect [527.6238 567.0421 539.579 575.8988]
/Subtype /Link
/A << /S /GoTo /D (subsubsection.6.2.16.9) >>
>> endobj
-849 0 obj <<
+1097 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [499.2773 184.4821 511.2325 193.4384]
+/Rect [527.6238 554.9716 539.579 563.9279]
/Subtype /Link
/A << /S /GoTo /D (subsubsection.6.2.16.10) >>
>> endobj
-850 0 obj <<
+1098 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [499.2773 172.4504 511.2325 181.4067]
+/Rect [527.6238 543.0007 539.579 551.957]
/Subtype /Link
/A << /S /GoTo /D (subsubsection.6.2.16.11) >>
>> endobj
-851 0 obj <<
+1099 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [499.2773 160.4187 511.2325 169.375]
+/Rect [527.6238 531.1295 539.579 540.1356]
/Subtype /Link
/A << /S /GoTo /D (subsubsection.6.2.16.12) >>
>> endobj
-852 0 obj <<
+1100 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [499.2773 148.3871 511.2325 157.3433]
+/Rect [527.6238 519.0589 539.579 528.0152]
/Subtype /Link
/A << /S /GoTo /D (subsubsection.6.2.16.13) >>
>> endobj
-853 0 obj <<
+1101 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [499.2773 136.3554 511.2325 145.3117]
+/Rect [527.6238 507.0881 539.579 516.0443]
/Subtype /Link
/A << /S /GoTo /D (subsubsection.6.2.16.14) >>
>> endobj
-854 0 obj <<
+1102 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [499.2773 124.3237 511.2325 133.28]
+/Rect [527.6238 495.1172 539.579 504.0735]
/Subtype /Link
/A << /S /GoTo /D (subsubsection.6.2.16.15) >>
>> endobj
-855 0 obj <<
+1103 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [499.2773 112.292 511.2325 121.2483]
+/Rect [527.6238 483.1463 539.579 492.1026]
/Subtype /Link
/A << /S /GoTo /D (subsubsection.6.2.16.16) >>
>> endobj
-856 0 obj <<
+1104 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [499.2773 100.2604 511.2325 109.2166]
+/Rect [527.6238 471.1754 539.579 480.1317]
/Subtype /Link
/A << /S /GoTo /D (subsubsection.6.2.16.17) >>
>> endobj
-857 0 obj <<
+1105 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [499.2773 88.2287 511.2325 97.185]
+/Rect [527.6238 459.2045 539.579 468.1608]
/Subtype /Link
/A << /S /GoTo /D (subsubsection.6.2.16.18) >>
>> endobj
-858 0 obj <<
+1106 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [499.2773 76.197 511.2325 85.3027]
+/Rect [527.6238 447.2336 539.579 456.3394]
/Subtype /Link
-/A << /S /GoTo /D (subsection.6.2.17) >>
+/A << /S /GoTo /D (subsubsection.6.2.16.19) >>
>> endobj
-859 0 obj <<
+1107 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [499.2773 64.1653 511.2325 73.1216]
+/Rect [527.6238 435.2628 539.579 444.219]
/Subtype /Link
-/A << /S /GoTo /D (subsection.6.2.18) >>
+/A << /S /GoTo /D (subsubsection.6.2.16.20) >>
>> endobj
-799 0 obj <<
-/D [797 0 R /XYZ 56.6929 794.5015 null]
->> endobj
-796 0 obj <<
-/Font << /F37 802 0 R /F22 737 0 R /F21 714 0 R >>
-/ProcSet [ /PDF /Text ]
+1108 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [527.6238 423.2919 539.579 432.2481]
+/Subtype /Link
+/A << /S /GoTo /D (subsection.6.2.17) >>
>> endobj
-862 0 obj <<
-/Length 3454
-/Filter /FlateDecode
->>
-stream
-xÚí[SÜFÇßùó°U túªîÞ}ØÅ€R1ö©lm’‡ñŒ *3™ Äûé·5R·Î0­3ô&&®Š1èèœ9ÿŸNßP÷‡ Œ"TX9ÐVE™Œ&;tpé~öf‡µ×ìû‹öáU¯.v¾y-ôÀ›ñlpñÜËj \ŒÚ=|wzq|zq¾÷ËÅw;Çá¦Ð1£¢¾ã¯;?ýBcçÿ»J„5jpçþA ³–&;R ¢¤þ;×;ç;ÿ
-7?]šÆ>ˆ†(Ãuä“p> 㜫]tÊ’Lp±ü(áÎqýAÜå \.1†J磾l6΋ټÍöGWò̯g­ _M–Tƶ6çÎ&Ÿäå|oŸ+ºûf:œL†Ó½}Éõ.ÙÛW”>â_ÒÚ‡]yObÅ É8e]×4™^š/ΠJÞn®«´~ÿ¥JÙZ^õX#¨÷Ž©‰R”F8ý39ʦ”—ż¨Êæ;ÃrÜ|ñÃlx™;Qì#"ÑË‚ÏV2 ÀcaE „…H ¨÷Žá$Ë `mda>]ÌæùxÿSþ92Är“m(FÒÇ/©õâÄøœ& 1bV4Cˆ‰Äƒzïˆá‚“±ŽþE‰Ù\6¸O““^@|
-“† +!€DâÀ
-º#D´„œçóyQ^¶­úÅ÷K䶙ÎÏp2?Àã*ˆñ‰ãõÞñ#9aîÚÀlù9)oó©ï¾ÞܘŠ¶æœ¼¿us#¶C‘ÅdF€!ÆTÉ°~F"q`Œ Þ;F%T‹ŽÕ2òn~•Oî~—K*EÓ-Í‹Ûz¸"${ÉíÏb2#Àcª„1‰cõÞõW™&Ö2Ñ1†/nHY±ËÜm™ô‹qÿŒ,×¹¯÷üLÎ÷gÅeé¾dõì
-Û¶M!ëÉLCŒ)¨*ÆT$Œ)Ô{ÇUÄR ™â LýåÝÙÉ›“ÓYR»®•ûNsÝJ™ÚÛ·O¬?xdHh2.ÀÃ
-†á‰Ãõp‘Vw=¸ˆ\NN¿ÿáè8¶Rš‰>^¸xvmUHe*(ÐeE*Ó¿j‹÷ÞbÑRAPd
-(n4Û]’#m$úq–z­CRœ 0Ä
-dD?‘80<Pï~XJ×°X¿ M¶ËÄu° çá —Ëß®ÿnšÚ„'ÃÔÙa,91”ÖƒÀHÂ\w=!ˆd~-Xº2¸^c©«8Öð—8.öùJ¡³Ã@
-꽫Ô®8@%ÓáÄW|z뻩ýIn¾j}&’u†˜Î0Ó¦3Z,LgÔ{ÐYXM˜¦èìgɺIù·ÃÂiYËQ¾IlWfžú<VøÈ©‚BCDЕ”šþ­±8Aqï õ‹-Œ‚
-°èú¬Éøó)Ó!ÉjCLm˜oLíH˜Ú¨÷Nm]ß3 Ôö“QçÕèSÞO:ùæÝ&ѳ?yyÿ ©íó‘¬60ÄÔ†ù6ý‡!cq`j£Þ;µ3J,—PmÕª}XMnœ´Šëbþ¹Ñö®˜_5>®ôµ3P<9é™ÔD„Ãnf ñÔz…½@ø”% 1  $¦ÿhc, ˆ5ï,ò¢#ᮚ7‹¶õä]™Eôóùh1 TVå¬çÓasܤ7oþÖ.€‡å ¬G¼~ße¾úwÄÁÛayZó›Jõù,KÛ<-;²õ\ÊÁh”ÏB!,ç˩ϪsûÞ•ÉåÏävb%ý©ó O~ê€!öÔAA1Š"q`4¡ÞMLN§)öº7à¶L²¶|^M«j)²BêÆcíeõûÈt¾%BiáçóE1ŽÝʸ޾4íe/üàÈÿC¬5™X`ˆ ¡±ýûôbq`Ä¢ÞÃÄ œ0ž lw$º„¤˜ãÒxæF½øº±b]{›ËŽËÛfñ¨*›sñ"/§ örå3ŸÌ0ĸ‚Êb\EâÀ¸B½®\±t¤ÈŽ+¿Ãü‡YØð_¥Ô™»ó¥oÖ[Ö(Ñ4¬¿^”£æ R¿„ƶªöT¨ !ÕŠ¬T±8¨pï¾yåZ×ßã-Sþ|dï‰Ø®{«U¶«Žãsš 0Ä€šaÀDâÀ€Yóq¥Hû>+ÓŽ.öc»Ójñá:Ÿ]¹Ö«®F½Éiì:Ðé.G†9 &Û¿Ø×Ý
-KÂ=ÑgF
-"xû¾8‡ÕdâÏø¼oÚf—I=€—r;žIŒ|š“#`ˆ=FPFŒ›HA¨÷®1¯ûsRˆB'ñdþ×v”\Ví„â]5ýäž©¿7ÿºªîš/FCº£ù«~)Òesø´­ÖÕÂßájn{×ö/ÿáŠ83O©¥õ9IVbŠÃœcŠGâÀG½‡ªáÆ–,kߊb–}·ºjœ”£F±ººqáø÷áÕ°¼\éÝùµÀÂïW:]L>ÔË "³Ï  Ò”Ì
-endobj
-861 0 obj <<
-/Type /Page
-/Contents 862 0 R
-/Resources 860 0 R
-/MediaBox [0 0 595.2756 841.8898]
-/Parent 715 0 R
-/Annots [ 864 0 R 865 0 R 866 0 R 867 0 R 868 0 R 869 0 R 870 0 R 871 0 R 872 0 R 873 0 R 874 0 R 875 0 R 876 0 R 877 0 R 878 0 R 879 0 R 880 0 R 881 0 R 882 0 R 883 0 R 884 0 R 885 0 R 886 0 R 887 0 R 888 0 R 889 0 R 890 0 R 891 0 R 892 0 R 893 0 R 894 0 R 895 0 R 896 0 R 900 0 R 901 0 R 902 0 R 903 0 R 904 0 R 905 0 R 906 0 R 907 0 R 908 0 R 909 0 R 910 0 R 911 0 R 912 0 R 913 0 R 914 0 R 915 0 R 916 0 R 917 0 R 918 0 R 919 0 R 920 0 R 921 0 R ]
+1109 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [527.6238 411.321 539.579 420.4267]
+/Subtype /Link
+/A << /S /GoTo /D (subsection.6.2.18) >>
>> endobj
-864 0 obj <<
+1110 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [527.6238 758.4766 539.579 767.4329]
+/Rect [527.6238 399.3501 539.579 408.3064]
/Subtype /Link
/A << /S /GoTo /D (subsection.6.2.19) >>
>> endobj
-865 0 obj <<
+1111 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [527.6238 746.3946 539.579 755.3509]
+/Rect [527.6238 387.3792 539.579 396.3355]
/Subtype /Link
/A << /S /GoTo /D (subsection.6.2.20) >>
>> endobj
-866 0 obj <<
+1112 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [527.6238 734.3125 539.579 743.2688]
+/Rect [527.6238 375.4083 539.579 384.3646]
/Subtype /Link
/A << /S /GoTo /D (subsection.6.2.21) >>
>> endobj
-867 0 obj <<
+1113 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [527.6238 722.2305 539.579 731.1868]
+/Rect [527.6238 363.4374 539.579 372.3937]
/Subtype /Link
/A << /S /GoTo /D (subsection.6.2.22) >>
>> endobj
-868 0 obj <<
+1114 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [527.6238 710.1484 539.579 719.1047]
+/Rect [527.6238 351.4666 539.579 360.4228]
/Subtype /Link
/A << /S /GoTo /D (subsection.6.2.23) >>
>> endobj
-869 0 obj <<
+1115 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [527.6238 698.0664 539.579 707.0227]
+/Rect [527.6238 339.4957 539.579 348.452]
/Subtype /Link
/A << /S /GoTo /D (subsection.6.2.24) >>
>> endobj
-870 0 obj <<
+1116 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [527.6238 685.9843 539.579 694.9406]
+/Rect [527.6238 327.5248 539.579 336.4811]
/Subtype /Link
/A << /S /GoTo /D (subsection.6.2.25) >>
>> endobj
-871 0 obj <<
+1117 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [527.6238 673.9023 539.579 682.8586]
+/Rect [527.6238 315.5539 539.579 324.5102]
/Subtype /Link
/A << /S /GoTo /D (subsection.6.2.26) >>
>> endobj
-872 0 obj <<
+1118 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [527.6238 661.8203 539.579 670.7765]
+/Rect [527.6238 303.583 539.579 312.5393]
/Subtype /Link
-/A << /S /GoTo /D (subsubsection.6.2.26.1) >>
+/A << /S /GoTo /D (subsection.6.2.27) >>
>> endobj
-873 0 obj <<
+1119 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [527.6238 649.8379 539.579 658.6945]
+/Rect [527.6238 291.6121 539.579 300.7179]
/Subtype /Link
-/A << /S /GoTo /D (subsubsection.6.2.26.2) >>
+/A << /S /GoTo /D (subsection.6.2.28) >>
>> endobj
-874 0 obj <<
+1120 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [527.6238 637.7558 539.579 646.6124]
+/Rect [527.6238 279.6413 539.579 288.747]
/Subtype /Link
-/A << /S /GoTo /D (subsubsection.6.2.26.3) >>
+/A << /S /GoTo /D (subsubsection.6.2.28.1) >>
>> endobj
-875 0 obj <<
+1121 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [527.6238 267.6704 539.579 276.6267]
+/Subtype /Link
+/A << /S /GoTo /D (subsubsection.6.2.28.2) >>
+>> endobj
+1122 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [527.6238 255.6995 539.579 264.6558]
+/Subtype /Link
+/A << /S /GoTo /D (subsubsection.6.2.28.3) >>
+>> endobj
+1123 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [527.6238 625.5741 539.579 634.5304]
+/Rect [527.6238 243.7286 539.579 252.6849]
/Subtype /Link
-/A << /S /GoTo /D (subsubsection.6.2.26.4) >>
+/A << /S /GoTo /D (subsubsection.6.2.28.4) >>
>> endobj
-876 0 obj <<
+1124 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [527.6238 613.4921 539.579 622.4483]
+/Rect [527.6238 231.7577 539.579 240.714]
/Subtype /Link
/A << /S /GoTo /D (section.6.3) >>
>> endobj
-877 0 obj <<
+1125 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [527.6238 601.41 539.579 610.3663]
+/Rect [527.6238 219.7868 539.579 228.7431]
/Subtype /Link
/A << /S /GoTo /D (subsection.6.3.1) >>
>> endobj
-878 0 obj <<
+1126 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [527.6238 589.328 539.579 598.2842]
+/Rect [527.6238 207.8159 539.579 216.7722]
/Subtype /Link
/A << /S /GoTo /D (subsubsection.6.3.1.1) >>
>> endobj
-879 0 obj <<
+1127 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [527.6238 577.2459 539.579 586.2022]
+/Rect [522.6425 195.845 539.579 204.9508]
/Subtype /Link
/A << /S /GoTo /D (subsubsection.6.3.1.2) >>
>> endobj
-880 0 obj <<
+1128 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [527.6238 565.1639 539.579 574.1201]
+/Rect [522.6425 183.8742 539.579 192.9799]
/Subtype /Link
/A << /S /GoTo /D (subsection.6.3.2) >>
>> endobj
-881 0 obj <<
+1129 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [527.6238 553.0818 539.579 562.0381]
+/Rect [522.6425 171.9033 539.579 181.009]
/Subtype /Link
/A << /S /GoTo /D (subsection.6.3.3) >>
>> endobj
-882 0 obj <<
+1130 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [527.6238 540.9998 539.579 550.1055]
+/Rect [522.6425 159.9324 539.579 169.0381]
/Subtype /Link
/A << /S /GoTo /D (subsection.6.3.4) >>
>> endobj
-883 0 obj <<
+1131 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [527.6238 528.9177 539.579 538.0235]
+/Rect [522.6425 147.9615 539.579 157.0673]
/Subtype /Link
/A << /S /GoTo /D (subsection.6.3.5) >>
>> endobj
-884 0 obj <<
+1132 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [527.6238 516.8357 539.579 525.9414]
+/Rect [522.6425 135.9906 539.579 145.0964]
/Subtype /Link
/A << /S /GoTo /D (subsubsection.6.3.5.1) >>
>> endobj
-885 0 obj <<
+1133 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [527.6238 504.7536 539.579 513.8594]
+/Rect [522.6425 124.0197 539.579 133.1255]
/Subtype /Link
/A << /S /GoTo /D (subsubsection.6.3.5.2) >>
>> endobj
-886 0 obj <<
+1134 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [527.6238 492.6716 539.579 501.6279]
+/Rect [522.6425 112.0489 539.579 121.1546]
/Subtype /Link
/A << /S /GoTo /D (subsubsection.6.3.5.3) >>
>> endobj
-887 0 obj <<
+1135 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [527.6238 480.5895 539.579 489.5458]
+/Rect [522.6425 100.078 539.579 109.1837]
/Subtype /Link
/A << /S /GoTo /D (subsubsection.6.3.5.4) >>
>> endobj
-888 0 obj <<
+1136 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [527.6238 468.5075 539.579 477.4638]
+/Rect [522.6425 88.1071 539.579 97.2128]
/Subtype /Link
/A << /S /GoTo /D (subsection.6.3.6) >>
>> endobj
-889 0 obj <<
+1137 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [527.6238 456.4254 539.579 465.3817]
+/Rect [522.6425 76.1362 539.579 85.242]
/Subtype /Link
/A << /S /GoTo /D (subsection.6.3.7) >>
>> endobj
-890 0 obj <<
+1138 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [527.6238 444.3434 539.579 453.2997]
+/Rect [522.6425 64.1653 539.579 73.2711]
/Subtype /Link
/A << /S /GoTo /D (section.6.4) >>
>> endobj
-891 0 obj <<
+1079 0 obj <<
+/D [1077 0 R /XYZ 85.0394 794.5015 null]
+>> endobj
+1076 0 obj <<
+/Font << /F37 1018 0 R /F22 953 0 R /F21 930 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+1141 0 obj <<
+/Length 3413
+/Filter /FlateDecode
+>>
+stream
+xÚímsÛÆÇßëSð]¥™êŒ{Ƶ/:–§J'•”éLÓ¼€HˆBM4AZã~úˆ»ãR<lt±[6ãÉ’°Øåþ·¸'€t”Ùt$Q†™‘6‚ÈŒÊÑx~”¦öoßQwÌ©?èuv}ôì%×#CŒbjt};R&7'ËI–çtt=ùåøüÇW×ß¼º¾:ùõú»£o®ÃY¡gšñî”oŽ~ù5Ml
+eŠNÅHKCg|óQìïˆu}rJ¹ÌŽ¯ïÊ“Sfß\­ŠUÕ®ªqÛÿü²šÙ¿˜œ““S™eŸÛ‹0æýÏò@Ma¬öÆæ)$l/ýËé¨s  v§Ðp_ýów‚ÐLïa厂ñ€ºï`‘t¤…¶¯ 4t,°lóf]¯Ê¥ý)ÏÌgŠÁ''Å'3™`ˆ‘Å¢Y>LJ$ŒÔý¶rpI„Ê+¡r¼*æ¾t”Ë·å2^F¶ –?½…ö™HbBÃL£BGÁ„FÝo…fœð\Q 4sBÿ»©Ð?•³.êqù[j->aõ9YQ`ˆ)
+SJ33¬h$LQÔýVQJ ÏT”;E/˶™=¢ÉæŠ=½‚=(·ÏG²ÜÀ“æ•;&7ê>È­Œ!ŒÁB-œÚWÍøu¹êµ½xöão‰®2ñ¨íÓ‘*6°C´†É¦4”:¢4ê{+t®‰}Ùê,ÎçÍ|aE½©fÕê]¯ê}µºë‚³c³s.M„É”  ;ÍÙÅ«ýQ;íAÜhwL¾‡ ÿܺ„ƒ(ô K&!˜a lÅ ”s°†ÁÇ8öãM¥l_>×ùƳ¶
+’¹E‡IîG¨›QÐõ‰‰/›õͬlïìõ«+HCù gxì` ƒÈ(^àçCò±ï6Ö‚¤2Ýâa?/‘‡ÁÎy3Ÿwųk4?õj››y7ˆâ0¶InT!Í©
+"jGFžH D¨{we—R¡h`(t/Vræºq³‰÷Íòµm]íºkîû7ãÂÁvÑ¿ü'ËØt½Ï•îfíÏpW„ÓÞ»>äôo¶¢ÓüP0(¸ÏI²àÀæ<&8ê>T ! ×Æ+Î\Õ¸¨Ç½d]Ÿ>t꺑j?krWÔÓ¾ž_ ¬
+7òj=¿é¬“'T
+!ðiJ†
+%Òþ.P {
+Âc&uKÆM} ¢ r}((2>«ÉÈ
+ u¿:“„Ë
+Ív„>-Úwõ8Yn-Žÿ¼³'Ó-v'»sû*›u;{×íÑbï)‘ÿ ÉCL"˜#ʆ7/ÅÁ$B݉˜á„©(Äwòs¶—7¬S˜ïZ-‹º-Æ~x‘gÕæ&)“ñOÓÄüL•Ø!êÁôaâE¢@´C}o¥Ë)¡¹Ò‰]é¦Eå$›–«n…¼ªo›nI«_ÎÚÙ,c¨‹y¹Ä*¬‘›‰•[rùñ5sŸ,Y³­¦ÈªÙ~˜f˜ï­fÊtON3@4¹+ÚzsÏÏpS›À„Öà!ßÒº÷‹¾N—ÅüäTï,[~¨ Âá“$‹ 1•`¦(~BP,L'ÔýV(©IÆ(J9¡êÖ¥÷ÆË4iæEU?«Ã3¢ZðŒ¨ñ]9~í¨jߪ–óvw'ÛåËóþÈ´H¿ËkP'ÿA’u†˜N0Q” o‹‚鄺w£ &1Ül/_ºmì,»ìl³I×™<l4³âÓ™Ì
+0ÄXr¡¬DÁXÙsÛ¨Í#<×}á?ë¶sðãŠzí÷.Š)²_;X?v¿64@ökïDEùðSUàù°\ì¹­c2{¼í!ö«bg›e)nŽ'ÕôËØñðäæ„‚É-b-êR £ uïi£&'ŒqOëi»kºž¥ÔÜþpÜ‚ ©¸AC·Á)žwˆ‚à†»¸åŠPáTu¶YúêŠ[ݶåøtÒÞö½·ùëÒvxžhúÝùD'c 1Œ ”b`¡îFZL‘ØÁÈÂã9š7åì‰?5ø°ã³›Ì0ÄØêQ1¼Ç4Æê>°£(1ZsÇŽ|Èδìömy¸®} š|¾“i†MPO*Ø0M‘@0šP÷&aHn¤§IíÐÔmß6¯»µWID} ¢|Γ‰†QPS*.R$Œ(Ô} Šk’Sî‰Ò;DµåjUuSY‡õápò OÆ b8AA©žÕŽ‚ᄺ81I4wô8#ù.NÕ´þßæ©êBðHï ’Ou2HÀ Ji‹É0H‘@0P÷$ʉƃdzº‰õÉéf"½ßm¤$;ô» ò9N&bA ©~fm,Œ Ô} (£D*÷03B³nôB®ÉCúýù$'# 1„ ˆTß´ CuïÊ ¹ Q@æy˜¡üø3”^ƒTÀ€ÂT˜ÊáÎR$
+„.Ô·‡Kk"2ßï¦ V§ÿ6ëe]Ì˪[ÇJðIÿÞ“>½ÉßzÌ°ï<ÙJGÕð„Ò~Ø÷ Ž·Oõ'~ŸE†;dZ¿ùCjq(Eó‰é}úÓŸðO~{ƒ&Cj?„=¤ÂW)ž2Cò<ú}öJŒ”ìý¿¹qû“Bž}ãÓ†°,Ó£î{¹Üè´z‹ÜÄ°9
+„þ¿í†endstream
+endobj
+1140 0 obj <<
+/Type /Page
+/Contents 1141 0 R
+/Resources 1139 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 931 0 R
+/Annots [ 1143 0 R 1144 0 R 1145 0 R 1146 0 R 1147 0 R 1148 0 R 1152 0 R 1153 0 R 1154 0 R 1155 0 R 1156 0 R 1157 0 R 1158 0 R 1159 0 R 1160 0 R 1161 0 R 1162 0 R 1163 0 R 1164 0 R 1165 0 R 1166 0 R 1167 0 R 1168 0 R 1169 0 R 1170 0 R 1171 0 R 1172 0 R 1173 0 R 1174 0 R 1175 0 R 1176 0 R 1177 0 R 1178 0 R 1179 0 R 1180 0 R 1181 0 R 1182 0 R 1183 0 R 1184 0 R 1185 0 R 1186 0 R 1187 0 R 1188 0 R 1189 0 R 1190 0 R 1191 0 R 1192 0 R 1193 0 R 1194 0 R 1195 0 R 1196 0 R 1197 0 R 1198 0 R 1199 0 R 1200 0 R ]
+>> endobj
+1143 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [527.6238 432.2613 539.579 441.3671]
+/Rect [494.296 758.4766 511.2325 767.5824]
/Subtype /Link
/A << /S /GoTo /D (subsubsection.6.4.0.1) >>
>> endobj
-892 0 obj <<
+1144 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [527.6238 420.1793 539.579 429.285]
+/Rect [494.296 746.3946 511.2325 755.5003]
/Subtype /Link
/A << /S /GoTo /D (subsection.6.4.1) >>
>> endobj
-893 0 obj <<
+1145 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [527.6238 408.0972 539.579 417.0535]
+/Rect [494.296 734.3125 511.2325 743.4183]
/Subtype /Link
/A << /S /GoTo /D (subsubsection.6.4.1.1) >>
>> endobj
-894 0 obj <<
+1146 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [527.6238 396.0152 539.579 404.9715]
+/Rect [494.296 722.2305 511.2325 731.3362]
/Subtype /Link
/A << /S /GoTo /D (subsubsection.6.4.1.2) >>
>> endobj
-895 0 obj <<
+1147 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [527.6238 383.9331 539.579 392.8894]
+/Rect [494.296 710.1484 511.2325 719.2542]
/Subtype /Link
/A << /S /GoTo /D (subsubsection.6.4.1.3) >>
>> endobj
-896 0 obj <<
+1148 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [527.6238 371.8511 539.579 380.8074]
+/Rect [494.296 698.0664 511.2325 707.1721]
/Subtype /Link
/A << /S /GoTo /D (subsubsection.6.4.1.4) >>
>> endobj
-900 0 obj <<
+1152 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [527.6238 359.769 539.579 368.7253]
+/Rect [494.296 686.084 511.2325 695.0901]
/Subtype /Link
/A << /S /GoTo /D (subsubsection.6.4.1.5) >>
>> endobj
-901 0 obj <<
+1153 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [527.6238 337.1969 539.579 345.9291]
+/Rect [494.296 663.4123 511.2325 672.2689]
/Subtype /Link
/A << /S /GoTo /D (chapter.7) >>
>> endobj
-902 0 obj <<
+1154 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [527.6238 325.1348 539.579 334.091]
+/Rect [494.296 651.3501 511.2325 660.4558]
/Subtype /Link
/A << /S /GoTo /D (section.7.1) >>
>> endobj
-903 0 obj <<
+1155 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [527.6238 313.0527 539.579 322.009]
+/Rect [494.296 639.3677 511.2325 648.3738]
/Subtype /Link
/A << /S /GoTo /D (section.7.2) >>
>> endobj
-904 0 obj <<
+1156 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [527.6238 300.9707 539.579 309.9269]
+/Rect [494.296 627.2856 511.2325 636.2917]
/Subtype /Link
/A << /S /GoTo /D (subsection.7.2.1) >>
>> endobj
-905 0 obj <<
+1157 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [527.6238 288.8886 539.579 297.8449]
+/Rect [494.296 615.2036 511.2325 624.2097]
/Subtype /Link
/A << /S /GoTo /D (subsection.7.2.2) >>
>> endobj
-906 0 obj <<
+1158 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [527.6238 276.8066 539.579 285.7628]
+/Rect [494.296 603.1215 511.2325 612.1276]
/Subtype /Link
/A << /S /GoTo /D (section.7.3) >>
>> endobj
-907 0 obj <<
+1159 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [527.6238 254.2345 539.579 262.9666]
+/Rect [494.296 580.5943 511.2325 589.3064]
/Subtype /Link
/A << /S /GoTo /D (chapter.8) >>
>> endobj
-908 0 obj <<
+1160 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [527.6238 242.1723 539.579 251.1286]
+/Rect [494.296 568.4873 511.2325 577.4934]
/Subtype /Link
/A << /S /GoTo /D (section.8.1) >>
>> endobj
-909 0 obj <<
+1161 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [527.6238 230.0903 539.579 239.0465]
+/Rect [494.296 556.4052 511.2325 565.4113]
/Subtype /Link
/A << /S /GoTo /D (subsection.8.1.1) >>
>> endobj
-910 0 obj <<
+1162 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [527.6238 218.0082 539.579 226.9645]
+/Rect [494.296 544.3232 511.2325 553.3293]
/Subtype /Link
/A << /S /GoTo /D (section.8.2) >>
>> endobj
-911 0 obj <<
+1163 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [527.6238 205.9262 539.579 214.8824]
+/Rect [494.296 532.2411 511.2325 541.2472]
/Subtype /Link
/A << /S /GoTo /D (section.8.3) >>
>> endobj
-912 0 obj <<
+1164 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [527.6238 183.3541 539.579 192.0862]
+/Rect [494.296 509.5694 511.2325 518.426]
/Subtype /Link
/A << /S /GoTo /D (appendix.A) >>
>> endobj
-913 0 obj <<
+1165 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [527.6238 171.2919 539.579 180.2482]
+/Rect [494.296 497.5072 511.2325 506.6129]
/Subtype /Link
/A << /S /GoTo /D (section.A.1) >>
>> endobj
-914 0 obj <<
+1166 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [527.6238 159.2098 539.579 168.1661]
+/Rect [494.296 485.4252 511.2325 494.5309]
/Subtype /Link
/A << /S /GoTo /D (subsection.A.1.1) >>
>> endobj
-915 0 obj <<
+1167 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [527.6238 147.1278 539.579 156.0841]
+/Rect [494.296 473.3431 511.2325 482.4488]
/Subtype /Link
/A << /S /GoTo /D (section.A.2) >>
>> endobj
-916 0 obj <<
+1168 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [527.6238 135.0457 539.579 144.002]
+/Rect [494.296 461.2611 511.2325 470.3668]
/Subtype /Link
/A << /S /GoTo /D (subsection.A.2.1) >>
>> endobj
-917 0 obj <<
+1169 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [527.6238 122.9637 539.579 131.92]
+/Rect [494.296 449.179 511.2325 458.2847]
/Subtype /Link
/A << /S /GoTo /D (section.A.3) >>
>> endobj
-918 0 obj <<
+1170 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [527.6238 110.8816 539.579 119.8379]
+/Rect [494.296 437.097 511.2325 446.2027]
/Subtype /Link
/A << /S /GoTo /D (subsection.A.3.1) >>
>> endobj
-919 0 obj <<
+1171 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [522.6425 98.7996 539.579 107.9053]
+/Rect [494.296 425.1146 511.2325 434.1207]
/Subtype /Link
/A << /S /GoTo /D (subsection.A.3.2) >>
>> endobj
-920 0 obj <<
+1172 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [522.6425 86.7175 539.579 95.8233]
+/Rect [494.296 413.0325 511.2325 422.0386]
/Subtype /Link
/A << /S /GoTo /D (subsection.A.3.3) >>
>> endobj
-921 0 obj <<
+1173 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [522.6425 64.1455 539.579 73.0021]
+/Rect [494.296 400.9505 511.2325 409.9566]
/Subtype /Link
-/A << /S /GoTo /D (appendix.B) >>
+/A << /S /GoTo /D (section.A.4) >>
>> endobj
-863 0 obj <<
-/D [861 0 R /XYZ 85.0394 794.5015 null]
+1174 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [494.296 388.7688 511.2325 397.8745]
+/Subtype /Link
+/A << /S /GoTo /D (subsection.A.4.1) >>
>> endobj
-860 0 obj <<
-/Font << /F37 802 0 R /F22 737 0 R /F21 714 0 R /F39 899 0 R >>
-/ProcSet [ /PDF /Text ]
+1175 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [494.296 376.6867 511.2325 385.7925]
+/Subtype /Link
+/A << /S /GoTo /D (subsection.A.4.2) >>
>> endobj
-924 0 obj <<
-/Length 885
-/Filter /FlateDecode
->>
-stream
-xÚíÙOOÛ0
-‚¶e›¶O?§Í+už(œ"„ ÏïÅï§`'Pòð¥6ÌxáKëÓt9]¼œ‡¿}. =§Š'Uø¬ãIqt*mé™7”“›RiÍ„Þ æwÊÉìrôéËùää|r1¾šœ'“4*Î \6Cþ,.¯x9 œœIïtù'üÀx/ÊE¡´dZIóP\_Ӏ诛Ðì•
-¤4á~ë§L!”&2}Ôd¼gNÕj2;šÖwóå¿Õ²n<ÉÒ!¥©î vZ ;!å
-! Ñé$g™ç·}v iy½¨gÕô¶žÞOWË›qe´½ZPœãÞ‚P %÷Àv ÊB "Ó'AV3¯LÜʹ=Aí­H÷ × ŠsÜ[
-¤át/«s…P‚ÈôI‘Ì{wg
-‹h¯‡ýÿûïÿSz C”0Üc¼[X¦J™> Ó‚q©ãÆ x˜Ô†Øú×ÙõSÝ<sR¯÷äЛ
-¤xრQ™B(^dúÄKqÆ{»°Øðz\ΦáÜðóýŎôö†)o¸ã ˆ%W¦Ê™>yŽÐq÷¢Itª
-·$±V˲‡*½¬®´ãÌJ+rï«Ã70¯5¼ýíøóK|e™tNä/WXÏ綔š…±¶{Ÿ»ßOCÅÿx3B*endstream
-endobj
-923 0 obj <<
-/Type /Page
-/Contents 924 0 R
-/Resources 922 0 R
-/MediaBox [0 0 595.2756 841.8898]
-/Parent 715 0 R
-/Annots [ 926 0 R 927 0 R 928 0 R 929 0 R 930 0 R 931 0 R 932 0 R 933 0 R 934 0 R 935 0 R 936 0 R 940 0 R 941 0 R ]
+1176 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [494.296 364.6047 511.2325 373.7104]
+/Subtype /Link
+/A << /S /GoTo /D (subsection.A.4.3) >>
>> endobj
-926 0 obj <<
+1177 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [494.296 758.4766 511.2325 767.5824]
+/Rect [494.296 352.5226 511.2325 361.6284]
+/Subtype /Link
+/A << /S /GoTo /D (subsection.A.4.4) >>
+>> endobj
+1178 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [494.296 340.4406 511.2325 349.5463]
+/Subtype /Link
+/A << /S /GoTo /D (subsection.A.4.5) >>
+>> endobj
+1179 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [494.296 328.3585 511.2325 337.4643]
+/Subtype /Link
+/A << /S /GoTo /D (subsection.A.4.6) >>
+>> endobj
+1180 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [494.296 316.2765 511.2325 325.3822]
+/Subtype /Link
+/A << /S /GoTo /D (subsubsection.A.4.6.1) >>
+>> endobj
+1181 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [494.296 304.2941 511.2325 313.3002]
+/Subtype /Link
+/A << /S /GoTo /D (subsubsection.A.4.6.2) >>
+>> endobj
+1182 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [494.296 292.212 511.2325 301.2181]
+/Subtype /Link
+/A << /S /GoTo /D (subsubsection.A.4.6.3) >>
+>> endobj
+1183 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [494.296 280.13 511.2325 289.1361]
+/Subtype /Link
+/A << /S /GoTo /D (subsubsection.A.4.6.4) >>
+>> endobj
+1184 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [494.296 267.9483 511.2325 277.054]
+/Subtype /Link
+/A << /S /GoTo /D (subsubsection.A.4.6.5) >>
+>> endobj
+1185 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [494.296 255.8662 511.2325 264.972]
+/Subtype /Link
+/A << /S /GoTo /D (subsubsection.A.4.6.6) >>
+>> endobj
+1186 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [494.296 243.7842 511.2325 252.8899]
+/Subtype /Link
+/A << /S /GoTo /D (subsection.A.4.7) >>
+>> endobj
+1187 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [494.296 221.2121 511.2325 230.0687]
+/Subtype /Link
+/A << /S /GoTo /D (appendix.B) >>
+>> endobj
+1188 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [494.296 209.1499 511.2325 218.2557]
/Subtype /Link
/A << /S /GoTo /D (section.B.1) >>
>> endobj
-927 0 obj <<
+1189 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [494.296 746.5215 511.2325 755.6272]
+/Rect [494.296 197.0679 511.2325 206.1736]
/Subtype /Link
/A << /S /GoTo /D (section.B.2) >>
>> endobj
-928 0 obj <<
+1190 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [494.296 734.5663 511.2325 743.672]
+/Rect [494.296 184.9858 511.2325 194.0916]
/Subtype /Link
/A << /S /GoTo /D (section.B.3) >>
>> endobj
-929 0 obj <<
+1191 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [494.296 722.6111 511.2325 731.7169]
+/Rect [494.296 172.9038 511.2325 182.0095]
/Subtype /Link
/A << /S /GoTo /D (section.B.4) >>
>> endobj
-930 0 obj <<
+1192 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [494.296 710.7556 511.2325 719.7617]
+/Rect [494.296 160.9214 511.2325 169.9275]
/Subtype /Link
/A << /S /GoTo /D (section.B.5) >>
>> endobj
-931 0 obj <<
+1193 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [494.296 698.7008 511.2325 707.8065]
+/Rect [494.296 148.7397 511.2325 157.8454]
/Subtype /Link
/A << /S /GoTo /D (section.B.6) >>
>> endobj
-932 0 obj <<
+1194 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [494.296 686.8453 511.2325 695.8514]
+/Rect [494.296 136.7573 511.2325 145.7634]
/Subtype /Link
/A << /S /GoTo /D (section.B.7) >>
>> endobj
-933 0 obj <<
+1195 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [494.296 674.7905 511.2325 683.8962]
+/Rect [494.296 124.5756 511.2325 133.6813]
/Subtype /Link
/A << /S /GoTo /D (section.B.8) >>
>> endobj
-934 0 obj <<
+1196 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [494.296 662.8353 511.2325 671.941]
+/Rect [494.296 112.4935 511.2325 121.5993]
/Subtype /Link
/A << /S /GoTo /D (section.B.9) >>
>> endobj
-935 0 obj <<
+1197 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [494.296 650.8801 511.2325 659.9859]
+/Rect [494.296 100.4115 511.2325 109.5172]
/Subtype /Link
/A << /S /GoTo /D (section.B.10) >>
>> endobj
-936 0 obj <<
+1198 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [494.296 639.0246 511.2325 648.0307]
+/Rect [494.296 88.3294 511.2325 97.4352]
/Subtype /Link
/A << /S /GoTo /D (section.B.11) >>
>> endobj
-940 0 obj <<
+1199 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [494.296 626.9698 511.2325 636.0755]
+/Rect [494.296 76.2474 511.2325 85.3531]
/Subtype /Link
/A << /S /GoTo /D (section.B.12) >>
>> endobj
-941 0 obj <<
+1200 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [494.296 615.0146 511.2325 624.1204]
+/Rect [494.296 64.1653 511.2325 73.2711]
/Subtype /Link
/A << /S /GoTo /D (section.B.13) >>
>> endobj
-925 0 obj <<
-/D [923 0 R /XYZ 56.6929 794.5015 null]
+1142 0 obj <<
+/D [1140 0 R /XYZ 56.6929 794.5015 null]
>> endobj
-922 0 obj <<
-/Font << /F37 802 0 R /F22 737 0 R /F41 939 0 R >>
+1139 0 obj <<
+/Font << /F37 1018 0 R /F22 953 0 R /F39 1151 0 R /F21 930 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+1203 0 obj <<
+/Length 660
+/Filter /FlateDecode
+>>
+stream
+xÚíØ;oÛ0
+Ü[PÍùü²Qˆg›ì-ZHßg9iïvEú‹/qÃCO~:×q0ê¤ (UHÎ[6ýàMYf¬…àMwé¯ïDc…`ªKÑ ê(²úµ}éG¾›Õ
+Û>U˜C·ŒG•($‡*›~@åËðç‘ ¨lªiÚÝ•3vÖt&Ma¿'kŠsšâ~‚ÁqM‰Brš²éM
+3»è'`hÀd^Q`ŽWÜ`°0Î+QHŽW6}àeü…ÓF^ØóògÔ¶j›×M÷ñgf_—€5lýTXq`Ö»Öæ`¥
+ÉÀʧ`9ËC¸¥¼‡õmWÓõ¦ªéWÎÅŸŸoÞÂ,êL¢ÂžOæDÅ=+ÆE%
+ɉʦDYÍP™pÓ( Õî–µ\W»õ‚¢”óQuXaë'Ês°âÖ‚•ã°…œÀžQ£8Ó !õÌÿC­Åÿ?’;>8ôwÒ9‘^®äŽ!KümD7W·Ø_£K= Š*ÿ ïK¿endstream
+endobj
+1202 0 obj <<
+/Type /Page
+/Contents 1203 0 R
+/Resources 1201 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 1216 0 R
+/Annots [ 1205 0 R 1209 0 R 1210 0 R 1211 0 R 1212 0 R 1213 0 R 1214 0 R 1215 0 R ]
+>> endobj
+1205 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [522.6425 758.4766 539.579 767.5824]
+/Subtype /Link
+/A << /S /GoTo /D (section.B.14) >>
+>> endobj
+1209 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [522.6425 746.5215 539.579 755.6272]
+/Subtype /Link
+/A << /S /GoTo /D (section.B.15) >>
+>> endobj
+1210 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [522.6425 734.5663 539.579 743.672]
+/Subtype /Link
+/A << /S /GoTo /D (section.B.16) >>
+>> endobj
+1211 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [522.6425 722.6111 539.579 731.7169]
+/Subtype /Link
+/A << /S /GoTo /D (section.B.17) >>
+>> endobj
+1212 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [522.6425 710.7556 539.579 719.7617]
+/Subtype /Link
+/A << /S /GoTo /D (section.B.18) >>
+>> endobj
+1213 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [522.6425 698.8005 539.579 707.8065]
+/Subtype /Link
+/A << /S /GoTo /D (section.B.19) >>
+>> endobj
+1214 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [522.6425 686.8453 539.579 695.8514]
+/Subtype /Link
+/A << /S /GoTo /D (section.B.20) >>
+>> endobj
+1215 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [522.6425 674.7905 539.579 683.8962]
+/Subtype /Link
+/A << /S /GoTo /D (section.B.21) >>
+>> endobj
+1204 0 obj <<
+/D [1202 0 R /XYZ 85.0394 794.5015 null]
+>> endobj
+1201 0 obj <<
+/Font << /F37 1018 0 R /F22 953 0 R /F41 1208 0 R >>
/ProcSet [ /PDF /Text ]
>> endobj
-944 0 obj <<
-/Length 2175
+1219 0 obj <<
+/Length 2174
/Filter /FlateDecode
>>
stream
@@ -3519,55 +4264,55 @@ xÚÝYÝoã6÷_áGXëø%‘ìãî¶ÅÅî’¢½>(c kK®>’ºý 9C[ŠåÍö6ÀE€ˆ¤†äpæ7¿Ê|Éà/M–2iÕR
ìn+×í 7Éz[­‹Žî‹º3k•¼iPÿ¦½1É°ó›ûE†Î•8þдØ(ÝÎmŠ¾ª7´ÏÐo›¶êAÍ#Ž4ŽdÃáh‡¢¦•h+F
žœˆ‡UûÃÎíÁEðëJ€¢ý¶ðîÒYR¬û¡ØíŽ8¾/¶¢)A$؆F~öË2XÂuëRPÂȼŠ¢eÑ(Vuqå
4¨joßñË`wÖj†Ž‚÷f|SHÚê~èÃ"Ùœ?ü¨ßü¾ZEÌs•J• B±b©È%bž§
-<ð|߬o¹ù`&͵KÞºö85ØÓNBƒÅp€ñs°o?||Oñ
-†A8Bs]ÜÖá®—0F4•Ò`„LC‹ÖîÐGî˜('˜NY.ÔœvâEí BÖÀ^Q1òc3 a2ZI-RÃa‹ šQö·¡ÂF¤- |Щ¦®1|¡O$ˆieòX´U3Ð<W?âbMVóaøj±8ùÒJˆ<WúÒ2‘WìÀu\.iS£x”è‹îÓ
-Ò (L¹^ŒùÉë¸sÕwhC%yª³\Omx ƒ¡„
-5
-(ÁÝîx‰kàXÛòä¾)Óò³B£:Ò96&'ȉj\@4@a&
-²MáÓŽ‚Ëx¿õŸC ®•’p¹gbçN"ùéß?¾AÉmÓõ#IàµPÏ|>Ø‘¢wI>Ü‚éž_»'‚€k÷ÓWT¾^Gôè”_g¸¢Ÿ[Ì3‡è‘徫~÷›ý>Ue¿½ÞWÓ÷/ÞèèWäB¡Êò—ÀËeʤˆëÏiX¥9ï0|?£^Ÿ+¯Ì,~ÆÊ
+<ð|߬o¹ù`&͵KÞºö85ØÓNBƒÅp€ñs°o?||Oñ
+FŠüäuܹê;´¡’<ÕY®§6<ÁG‰ÐB
+žD8^øú &®*‚îóSˆÏš|SXuYµ)©Ú„âüѳoSSiùS¯wUý•eg(£ãÜsÙºOëàïg7b¸„%Wð¡Ðñ€^Á;NÀNTÿ¯ÕâÛ»Ó÷›CHᙺQ
+ÿñæ·Å/¿²e¹`Ë,•ÖdË'è0°&TŠû…’Ðd™‰#»Åíâ_ÿ㬨ǨP¸ªÎc°5#º§K­â™V܇3üôEjŠfø
+–Q£­¢+O(Ÿèº³ß…Ù¤
+µ¾€Ð5༚ºÜ¸c3Í¡vÃH-Ôø·¿‹ß
endobj
-943 0 obj <<
+1218 0 obj <<
/Type /Page
-/Contents 944 0 R
-/Resources 942 0 R
+/Contents 1219 0 R
+/Resources 1217 0 R
/MediaBox [0 0 595.2756 841.8898]
-/Parent 954 0 R
+/Parent 1216 0 R
>> endobj
6 0 obj <<
-/D [943 0 R /XYZ 85.0394 769.5949 null]
+/D [1218 0 R /XYZ 85.0394 769.5949 null]
>> endobj
-945 0 obj <<
-/D [943 0 R /XYZ 85.0394 582.8476 null]
+1220 0 obj <<
+/D [1218 0 R /XYZ 85.0394 582.8476 null]
>> endobj
10 0 obj <<
-/D [943 0 R /XYZ 85.0394 512.9824 null]
+/D [1218 0 R /XYZ 85.0394 512.9824 null]
>> endobj
-946 0 obj <<
-/D [943 0 R /XYZ 85.0394 474.7837 null]
+1221 0 obj <<
+/D [1218 0 R /XYZ 85.0394 474.7837 null]
>> endobj
14 0 obj <<
-/D [943 0 R /XYZ 85.0394 399.5462 null]
+/D [1218 0 R /XYZ 85.0394 399.5462 null]
>> endobj
-947 0 obj <<
-/D [943 0 R /XYZ 85.0394 363.8828 null]
+1222 0 obj <<
+/D [1218 0 R /XYZ 85.0394 363.8828 null]
>> endobj
18 0 obj <<
-/D [943 0 R /XYZ 85.0394 223.0066 null]
+/D [1218 0 R /XYZ 85.0394 223.0066 null]
>> endobj
-948 0 obj <<
-/D [943 0 R /XYZ 85.0394 190.9009 null]
+1223 0 obj <<
+/D [1218 0 R /XYZ 85.0394 190.9009 null]
>> endobj
-949 0 obj <<
-/D [943 0 R /XYZ 85.0394 170.4169 null]
+1224 0 obj <<
+/D [1218 0 R /XYZ 85.0394 170.4169 null]
>> endobj
-950 0 obj <<
-/D [943 0 R /XYZ 85.0394 158.4617 null]
+1225 0 obj <<
+/D [1218 0 R /XYZ 85.0394 158.4617 null]
>> endobj
-942 0 obj <<
-/Font << /F21 714 0 R /F22 737 0 R /F39 899 0 R /F41 939 0 R /F48 953 0 R >>
+1217 0 obj <<
+/Font << /F21 930 0 R /F22 953 0 R /F39 1151 0 R /F41 1208 0 R /F48 1228 0 R >>
/ProcSet [ /PDF /Text ]
>> endobj
-957 0 obj <<
+1231 0 obj <<
/Length 3187
/Filter /FlateDecode
>>
@@ -3585,63 +4330,63 @@ H•²/hÊ
®£fw"®höx׺©;°Çn|>”°ÃÓ¶PˇýjÎÖzýÁ”rþ!È£+Œ­$üE™ Bö‘Q™…­Ê"ôãÇœ/Áò±r=?5M[ô°ÌÏ[€Ì°u¸Âz ÆmÜo<)¶ó=P¿+{’‘OíRzwdîØPÖ6ôV`0ÐhõðlÓã>§¦|êv=£lÁá“xý1‡š[ÚÍ„C9ßšÞ4â¦Å7ɵkù ’ß ÿe¬ˆ¦¯¸Çÿ¤ùâãý×þ{Ôñ¿Ä T0iª_ð‡)¶ˆÌ€
@Ÿ!þêó4Ï©Êendstream
endobj
-956 0 obj <<
+1230 0 obj <<
/Type /Page
-/Contents 957 0 R
-/Resources 955 0 R
+/Contents 1231 0 R
+/Resources 1229 0 R
/MediaBox [0 0 595.2756 841.8898]
-/Parent 954 0 R
-/Annots [ 963 0 R 964 0 R ]
+/Parent 1216 0 R
+/Annots [ 1237 0 R 1238 0 R ]
>> endobj
-963 0 obj <<
+1237 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
/Rect [272.8897 207.1951 329.1084 219.2548]
/Subtype /Link
/A << /S /GoTo /D (types_of_resource_records_and_when_to_use_them) >>
>> endobj
-964 0 obj <<
+1238 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
/Rect [190.6691 179.6723 249.6573 189.0819]
/Subtype /Link
/A << /S /GoTo /D (rfcs) >>
>> endobj
-958 0 obj <<
-/D [956 0 R /XYZ 56.6929 756.8229 null]
+1232 0 obj <<
+/D [1230 0 R /XYZ 56.6929 756.8229 null]
>> endobj
-959 0 obj <<
-/D [956 0 R /XYZ 56.6929 744.8677 null]
+1233 0 obj <<
+/D [1230 0 R /XYZ 56.6929 744.8677 null]
>> endobj
22 0 obj <<
-/D [956 0 R /XYZ 56.6929 651.295 null]
+/D [1230 0 R /XYZ 56.6929 651.295 null]
>> endobj
-960 0 obj <<
-/D [956 0 R /XYZ 56.6929 612.4036 null]
+1234 0 obj <<
+/D [1230 0 R /XYZ 56.6929 612.4036 null]
>> endobj
26 0 obj <<
-/D [956 0 R /XYZ 56.6929 555.4285 null]
+/D [1230 0 R /XYZ 56.6929 555.4285 null]
>> endobj
-961 0 obj <<
-/D [956 0 R /XYZ 56.6929 530.6703 null]
+1235 0 obj <<
+/D [1230 0 R /XYZ 56.6929 530.6703 null]
>> endobj
30 0 obj <<
-/D [956 0 R /XYZ 56.6929 416.0112 null]
+/D [1230 0 R /XYZ 56.6929 416.0112 null]
>> endobj
-962 0 obj <<
-/D [956 0 R /XYZ 56.6929 391.253 null]
+1236 0 obj <<
+/D [1230 0 R /XYZ 56.6929 391.253 null]
>> endobj
34 0 obj <<
-/D [956 0 R /XYZ 56.6929 164.815 null]
+/D [1230 0 R /XYZ 56.6929 164.815 null]
>> endobj
-965 0 obj <<
-/D [956 0 R /XYZ 56.6929 137.4068 null]
+1239 0 obj <<
+/D [1230 0 R /XYZ 56.6929 137.4068 null]
>> endobj
-955 0 obj <<
-/Font << /F37 802 0 R /F22 737 0 R /F39 899 0 R /F41 939 0 R /F21 714 0 R >>
+1229 0 obj <<
+/Font << /F37 1018 0 R /F22 953 0 R /F39 1151 0 R /F41 1208 0 R /F21 930 0 R >>
/ProcSet [ /PDF /Text ]
>> endobj
-970 0 obj <<
+1244 0 obj <<
/Length 3415
/Filter /FlateDecode
>>
@@ -3661,60 +4406,60 @@ txÕÁ(1Âùãqt0úØÇ‘C×µLm›§:ÂÄ$è’y¦
·o¾Àbº¦úž&\Õ=¯d‚Ó÷aŠKѨðÀæ@pð
–þvA•c«ÇøÀ†û,¤ÆAg€hCõoœ€}¼ew8ýš*çÐð‡#çô/œÿn1]/‚0Péú\í8 °ef´>+sŒBOD‡+^ .ùRéØ{
endobj
-969 0 obj <<
+1243 0 obj <<
/Type /Page
-/Contents 970 0 R
-/Resources 968 0 R
+/Contents 1244 0 R
+/Resources 1242 0 R
/MediaBox [0 0 595.2756 841.8898]
-/Parent 954 0 R
-/Annots [ 973 0 R 974 0 R ]
+/Parent 1216 0 R
+/Annots [ 1247 0 R 1248 0 R ]
>> endobj
-973 0 obj <<
+1247 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
/Rect [519.8432 463.1122 539.579 475.1718]
/Subtype /Link
/A << /S /GoTo /D (diagnostic_tools) >>
>> endobj
-974 0 obj <<
+1248 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
/Rect [84.0431 451.8246 133.308 463.2167]
/Subtype /Link
/A << /S /GoTo /D (diagnostic_tools) >>
>> endobj
-971 0 obj <<
-/D [969 0 R /XYZ 85.0394 794.5015 null]
+1245 0 obj <<
+/D [1243 0 R /XYZ 85.0394 794.5015 null]
>> endobj
38 0 obj <<
-/D [969 0 R /XYZ 85.0394 570.5252 null]
+/D [1243 0 R /XYZ 85.0394 570.5252 null]
>> endobj
-972 0 obj <<
-/D [969 0 R /XYZ 85.0394 541.3751 null]
+1246 0 obj <<
+/D [1243 0 R /XYZ 85.0394 541.3751 null]
>> endobj
42 0 obj <<
-/D [969 0 R /XYZ 85.0394 434.1868 null]
+/D [1243 0 R /XYZ 85.0394 434.1868 null]
>> endobj
-975 0 obj <<
-/D [969 0 R /XYZ 85.0394 406.5769 null]
+1249 0 obj <<
+/D [1243 0 R /XYZ 85.0394 406.5769 null]
>> endobj
46 0 obj <<
-/D [969 0 R /XYZ 85.0394 301.1559 null]
+/D [1243 0 R /XYZ 85.0394 301.1559 null]
>> endobj
-976 0 obj <<
-/D [969 0 R /XYZ 85.0394 276.6843 null]
+1250 0 obj <<
+/D [1243 0 R /XYZ 85.0394 276.6843 null]
>> endobj
50 0 obj <<
-/D [969 0 R /XYZ 85.0394 200.1512 null]
+/D [1243 0 R /XYZ 85.0394 200.1512 null]
>> endobj
-977 0 obj <<
-/D [969 0 R /XYZ 85.0394 175.6796 null]
+1251 0 obj <<
+/D [1243 0 R /XYZ 85.0394 175.6796 null]
>> endobj
-968 0 obj <<
-/Font << /F37 802 0 R /F22 737 0 R /F39 899 0 R /F41 939 0 R /F21 714 0 R >>
+1242 0 obj <<
+/Font << /F37 1018 0 R /F22 953 0 R /F39 1151 0 R /F41 1208 0 R /F21 930 0 R >>
/ProcSet [ /PDF /Text ]
>> endobj
-981 0 obj <<
+1255 0 obj <<
/Length 2457
/Filter /FlateDecode
>>
@@ -3733,39 +4478,39 @@ S¦…€Äüœºã2±öŠ 41ÑÍ–,÷úBäí]¨u›«˜úDOâ‚ÙLë–3žatÙ±º÷5vxnïH‘šªmÝóìAߌå
M­
 ZãŠÜƒ[æž.ÇñS!L%:P–ô˜¥Hé!”·i"®"!G­š¼ü…3Ãø(M¶æÒ?/ÕºðõwÕNïÉzê-çÕÃÿ­@úÂ?Dþ ÇD÷ÿï2ýý¥Ê2¹ü—ŠÌ OÕÈŠ%ºaÜÿ?sËùy;:»endstream
endobj
-980 0 obj <<
+1254 0 obj <<
/Type /Page
-/Contents 981 0 R
-/Resources 979 0 R
+/Contents 1255 0 R
+/Resources 1253 0 R
/MediaBox [0 0 595.2756 841.8898]
-/Parent 954 0 R
+/Parent 1216 0 R
>> endobj
-982 0 obj <<
-/D [980 0 R /XYZ 56.6929 794.5015 null]
+1256 0 obj <<
+/D [1254 0 R /XYZ 56.6929 794.5015 null]
>> endobj
54 0 obj <<
-/D [980 0 R /XYZ 56.6929 717.7272 null]
+/D [1254 0 R /XYZ 56.6929 717.7272 null]
>> endobj
-983 0 obj <<
-/D [980 0 R /XYZ 56.6929 690.4227 null]
+1257 0 obj <<
+/D [1254 0 R /XYZ 56.6929 690.4227 null]
>> endobj
58 0 obj <<
-/D [980 0 R /XYZ 56.6929 550.0786 null]
+/D [1254 0 R /XYZ 56.6929 550.0786 null]
>> endobj
-984 0 obj <<
-/D [980 0 R /XYZ 56.6929 525.2967 null]
+1258 0 obj <<
+/D [1254 0 R /XYZ 56.6929 525.2967 null]
>> endobj
62 0 obj <<
-/D [980 0 R /XYZ 56.6929 393.0502 null]
+/D [1254 0 R /XYZ 56.6929 393.0502 null]
>> endobj
-985 0 obj <<
-/D [980 0 R /XYZ 56.6929 363.1913 null]
+1259 0 obj <<
+/D [1254 0 R /XYZ 56.6929 363.1913 null]
>> endobj
-979 0 obj <<
-/Font << /F37 802 0 R /F22 737 0 R /F21 714 0 R /F39 899 0 R >>
+1253 0 obj <<
+/Font << /F37 1018 0 R /F22 953 0 R /F21 930 0 R /F39 1151 0 R >>
/ProcSet [ /PDF /Text ]
>> endobj
-988 0 obj <<
+1262 0 obj <<
/Length 2097
/Filter /FlateDecode
>>
@@ -3781,406 +4526,513 @@ hZã|jY/ýE‰áÝN6“dy 8xp]7b~{é0h”~’e±½„3×rÓ,Ã,*r¸2Ư{ë³½ŸØøÎê±×꛼cµ¬Ë"
Ìk
âþî^̲EÑÅk˜èP<sgÕ1B ÚÖP!žÅj˜K±dx ’;mêá6¨BÐ ¾I½Ÿp
endobj
-987 0 obj <<
+1261 0 obj <<
/Type /Page
-/Contents 988 0 R
-/Resources 986 0 R
+/Contents 1262 0 R
+/Resources 1260 0 R
/MediaBox [0 0 595.2756 841.8898]
-/Parent 954 0 R
-/Annots [ 994 0 R 995 0 R ]
+/Parent 1216 0 R
+/Annots [ 1268 0 R 1269 0 R ]
>> endobj
-994 0 obj <<
+1268 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
/Rect [519.8432 268.1131 539.579 280.1727]
/Subtype /Link
/A << /S /GoTo /D (acache) >>
>> endobj
-995 0 obj <<
+1269 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
/Rect [84.0431 256.1579 143.5361 268.2175]
/Subtype /Link
/A << /S /GoTo /D (acache) >>
>> endobj
-989 0 obj <<
-/D [987 0 R /XYZ 85.0394 794.5015 null]
+1263 0 obj <<
+/D [1261 0 R /XYZ 85.0394 794.5015 null]
>> endobj
66 0 obj <<
-/D [987 0 R /XYZ 85.0394 769.5949 null]
+/D [1261 0 R /XYZ 85.0394 769.5949 null]
>> endobj
-990 0 obj <<
-/D [987 0 R /XYZ 85.0394 574.3444 null]
+1264 0 obj <<
+/D [1261 0 R /XYZ 85.0394 574.3444 null]
>> endobj
70 0 obj <<
-/D [987 0 R /XYZ 85.0394 574.3444 null]
+/D [1261 0 R /XYZ 85.0394 574.3444 null]
>> endobj
-991 0 obj <<
-/D [987 0 R /XYZ 85.0394 540.5052 null]
+1265 0 obj <<
+/D [1261 0 R /XYZ 85.0394 540.5052 null]
>> endobj
74 0 obj <<
-/D [987 0 R /XYZ 85.0394 447.7637 null]
+/D [1261 0 R /XYZ 85.0394 447.7637 null]
>> endobj
-992 0 obj <<
-/D [987 0 R /XYZ 85.0394 410.3389 null]
+1266 0 obj <<
+/D [1261 0 R /XYZ 85.0394 410.3389 null]
>> endobj
78 0 obj <<
-/D [987 0 R /XYZ 85.0394 348.7624 null]
+/D [1261 0 R /XYZ 85.0394 348.7624 null]
>> endobj
-993 0 obj <<
-/D [987 0 R /XYZ 85.0394 311.223 null]
+1267 0 obj <<
+/D [1261 0 R /XYZ 85.0394 311.223 null]
>> endobj
82 0 obj <<
-/D [987 0 R /XYZ 85.0394 189.9853 null]
+/D [1261 0 R /XYZ 85.0394 189.9853 null]
>> endobj
-996 0 obj <<
-/D [987 0 R /XYZ 85.0394 156.0037 null]
+1270 0 obj <<
+/D [1261 0 R /XYZ 85.0394 156.0037 null]
>> endobj
-986 0 obj <<
-/Font << /F21 714 0 R /F22 737 0 R >>
+1260 0 obj <<
+/Font << /F21 930 0 R /F22 953 0 R >>
/ProcSet [ /PDF /Text ]
>> endobj
-1000 0 obj <<
-/Length 605
+1274 0 obj <<
+/Length 591
/Filter /FlateDecode
>>
stream
-xÚ¥TÛr›0}ç+x3EÕô˜ I;ŽÁÓvÒ<8FI˜bD¹8ÉßW “Ä}ê0 Ú=»«³GZ°‹ôƒ]ÂPáF"€ aænwr5vé`ãAþ4ê4u¾^ÐÈP„$tÓ‡I-çØM³[@ ƒž®€@²^.¯W@Ÿ{>a\/ãÕ‰ -.+ù™¤ñ<ñ|* ξ,Óxe b Î6'×ëÕY<Z7ëÙ*žÇ‹4ñîÒ+'Nßz˜ö‰íøãÜÞ!7Óí^9RÁ™û¬ ±ÄÝ9£”ŽžÂIœ›·‚tH=ªFÐŽ`œ*Ç$<"£ržÒštU¥êVfVµJÖ›6/­b¯M+wMß±®K&‚\ŸpF‚gÉ™–•P+ %ãت]•²1Ö¦ÌÌ¢ö8èJëU¥IÙ³ØÔæàQ³ìv÷²¶‘æ».ó¿ÈK“¨´{´±´ßoiv¡`‘zŒ?“u¾×}ëÞún0†‚1#Ï^ÖM®zv„Þ„S0Ï·/Õ¨‡Ö@ßûJy™©çÆÄ4ÝöÉ@ëù
+xÚ¥TKs›0¾ó+t3AÕtt’:3Nƒû˜4Ç()SŒ\ÀIóï+!°Iâž: ³«}|ì~Ú…
+ÕºÕõ«3uEó»$hô®ËZ«¤iëâa׺BÿÚ*Æ‘]…#;`ÞþÒþ{ã¿¡0FLzX¦ñÐS‘ŒÙ¾(Klô¡ða3?VþP%6endstream
endobj
-999 0 obj <<
+1273 0 obj <<
/Type /Page
-/Contents 1000 0 R
-/Resources 998 0 R
+/Contents 1274 0 R
+/Resources 1272 0 R
/MediaBox [0 0 595.2756 841.8898]
-/Parent 954 0 R
+/Parent 1277 0 R
>> endobj
-1001 0 obj <<
-/D [999 0 R /XYZ 56.6929 794.5015 null]
+1275 0 obj <<
+/D [1273 0 R /XYZ 56.6929 794.5015 null]
>> endobj
86 0 obj <<
-/D [999 0 R /XYZ 56.6929 769.5949 null]
+/D [1273 0 R /XYZ 56.6929 769.5949 null]
>> endobj
-1002 0 obj <<
-/D [999 0 R /XYZ 56.6929 744.7247 null]
+1276 0 obj <<
+/D [1273 0 R /XYZ 56.6929 744.7247 null]
>> endobj
-998 0 obj <<
-/Font << /F37 802 0 R /F21 714 0 R /F22 737 0 R >>
+1272 0 obj <<
+/Font << /F37 1018 0 R /F21 930 0 R /F22 953 0 R >>
/ProcSet [ /PDF /Text ]
>> endobj
-1005 0 obj <<
-/Length 1215
+1280 0 obj <<
+/Length 1159
/Filter /FlateDecode
>>
stream
-xÚÍWÉŽã6½÷W}’ˆæ¢}êt$‡ @ Ì!“-Ó¶0²¨H”N0ÿž"‹”í¶fæ0‡>ˆK±êÕ«â“Å~lQ¤„Š2YäeBRÊÒEu| ‹=ìýøÀ¼M’
-’&BÀdf7NEAÒ‚ç‹øÚÉ·ë‡Õœ-8%YÆÓÅz7ÅÊr8 àÀzû{ôrQý2æ)ÄòõÏx,!y‘3{ŒBˆŒ°R8û_äQ¡ñoª?…ƒ/º}O)ß½4µn½¾(I™ñÌ{É¡yž87?µp0g‘9ÔƒѨš€ÀòYá³ë—¬ˆô©Þ*´ôÑo ã~¯£¶8­nx§²ÑíÞ»¬ÍGûÜ5u«¼ÑN÷ŒªýpYÆ"çÑ»eÉ£KÌØæf³aŒ”iÊ]6áð*9èVnOÔI6£‹•†X0¨TodÝâDwŽ57”1u»ÈT –‘dܳ˜0’Ñ’¹¸‚°eÌ(…bÈcâ½¼¥br ;G‚žù.
-\·Ðš­lÀ0M#£í3q‘S ¿ï4B‡žÉx=7ÞòÏQõµ­½ì0#Îôh×ÖÖSív$6Np¼°[4¤Ñâ
-ê­½>k„’)œã¦U–~;9ûÅs=pdü)G%§ÂÚÉ®×GrÛ6H–¬šK¼K„ðÁJNXV„ÐOžnóëÅOsM‰Õš|Z ^’¢ÈË[»mÝC 4ÔßY>®”©Vörl76€] ½ÓýW;¹œËíª¯®³
-©ÞBg‘Íç°üÚ{áwÜ㣇fé¿vm˜Àº{íªuðÛÖÝFV¼ƒí¶Wƒg‹qà~l.³¿uë=<:°­ÛØž'²ïäã 7¯Ý„ÞPýl–»º Q]Éæ C ½Ç§9L­6õÎÝê/s:£÷ tÜ×IïyÐ{ÿâyÍA÷pëìÝþJÙwâÍJ'ôNåáêÞ«< aáU¤ß3h¬á$å`cÒàjˆçjoHüý‘)Î{ΓáHhJroEDõ—K (bؼ!¼E¿§„夼ð~\4¼Ökô:×È“zóßà"¥ãf«Óß„O`fPYJE0·{pÏc+JøO(®±Íi(„Lá¯H¨×RöÿRؾñÕö´ps/ºo°«ßé`cîÔ\VÕ$ AìÑûÌÅý”ðÉöõ*v‘\ÅÆ aGá9‰ÔVíäؘ¹@@ÃØk3ñÙœºkÉôçOá%× ®Ô¬t°7rÌ)Mþ9~ø~=}Ü„O‘û4÷ùLâ‹ ~û\w¼ %æ&G6¯üm°éCê>Ú¿x>—Ãendstream
+xÚÍWÉŽã6½÷W}’ˆæ¢}êt$‡ @ Ì!“-Ó–0²èH”NO‘EÊ›2sÈ%ðA\ŠU¯^-¤Ù‚Â-Š”PQ&‹¼LHJYº¨Ot±‡½ïŸ˜—IRAÒD˜ÌìÆ©(HZð|_+ùzý´úŽ³§$ËxºXï&[YXoÞjy4ª_Æ<¥‘Xþ¶þ%$/rfQ0‘V
+'ÿ“<(þEõ§pðMw)åû±—¦ÑWÃ%)3žy-#4ϧæ‡æ,2u3ت ,Ÿ~ý’‘>5[…Rƒ>ø­aÜïÕ`Ô§Õ-¯T¶ºÛ{•©q´A]ÛtÊ ítÀ¨ÆÇA‘e,r}X–<ºØŒ­oÖÆH™¦Üyc ¯’ƒîä¦õDd;:[i°ƒJõF6Nôѱæƃ2¦éö™bÁ"’Œ{F2Z2gW¶Œ¥ y8{o÷TLŠd§H0Â3Ÿ hRõêµÈª±îÚw\yýl”yj“ yY×p@d)¸Ý¶úÜØXØé
+¦ÝŽÄ$ Žw
+xfŒE_aNX0˜ÀSš¨¿S•/ŽJí‡/bƒ¦Nʯzßœ–±1—²éLœ¥åK­ˆÆV…BIØm
+JxI1|«ÄR{}Ö8!S8ÆM§,ývrö‹çf¨qdü)G%§ÀÚÉ®×r›6H–¬Ú‹½‹…¿ðÃJNXV„ÐO^nóëÅ¿_æ’£5é´¼$E‘—·rÁûºÿäøµ“mÓC\4&Å=î˦“}^)S­l9m7Ï.HÉhòd×.¿oýˆï`¢Ñy'øŸ{ ¸@েÌé¿v€F1yçŠÜ…®öÛ­ÖǬ>}ΆÜn{5xB‡ÀÍô§î¼Þg'²MÛóDöGùüŘ˜÷ã„.±~Ö÷]Ó+­®d[ëÁpúùeS§M³óôwzži~ÅôÌ•@2BIOWW‚¿›^GSë
+Ó–ÿ¼\g¥» ÜE
+¾qÂôrœº=ȘZ\ ö\FØÿxd²ó‘ód¦·$4%9‡‹{¦úÃ9šfؼ!¼‚¦ÿH ËI)xáõ8kØ;ߥo…­<©»çÃ¥ÛŽ›­>L/‰ÁÌ ²”Š,`îö$àžÇV”ðl×ØæÚ,˜Lá5]Ö·[öhLs&¾Ñ¡0ÌC/—U5U}hõö5¡æ^uº…®û]}á¦×=}»ž^êáý-Rb_ósoù _dð!AK"8YXù½±é_Á£µ
endobj
-1004 0 obj <<
+1279 0 obj <<
/Type /Page
-/Contents 1005 0 R
-/Resources 1003 0 R
+/Contents 1280 0 R
+/Resources 1278 0 R
/MediaBox [0 0 595.2756 841.8898]
-/Parent 1011 0 R
+/Parent 1277 0 R
>> endobj
-1006 0 obj <<
-/D [1004 0 R /XYZ 85.0394 794.5015 null]
+1281 0 obj <<
+/D [1279 0 R /XYZ 85.0394 794.5015 null]
>> endobj
90 0 obj <<
-/D [1004 0 R /XYZ 85.0394 769.5949 null]
+/D [1279 0 R /XYZ 85.0394 769.5949 null]
>> endobj
-1007 0 obj <<
-/D [1004 0 R /XYZ 85.0394 575.896 null]
+1282 0 obj <<
+/D [1279 0 R /XYZ 85.0394 575.896 null]
>> endobj
94 0 obj <<
-/D [1004 0 R /XYZ 85.0394 529.2011 null]
+/D [1279 0 R /XYZ 85.0394 529.2011 null]
>> endobj
-1008 0 obj <<
-/D [1004 0 R /XYZ 85.0394 492.9468 null]
+1283 0 obj <<
+/D [1279 0 R /XYZ 85.0394 492.9468 null]
>> endobj
98 0 obj <<
-/D [1004 0 R /XYZ 85.0394 492.9468 null]
+/D [1279 0 R /XYZ 85.0394 492.9468 null]
>> endobj
-1009 0 obj <<
-/D [1004 0 R /XYZ 85.0394 466.0581 null]
+1284 0 obj <<
+/D [1279 0 R /XYZ 85.0394 466.0581 null]
>> endobj
102 0 obj <<
-/D [1004 0 R /XYZ 85.0394 237.1121 null]
+/D [1279 0 R /XYZ 85.0394 201.2466 null]
>> endobj
-1010 0 obj <<
-/D [1004 0 R /XYZ 85.0394 206.4074 null]
+1285 0 obj <<
+/D [1279 0 R /XYZ 85.0394 170.5419 null]
>> endobj
-1003 0 obj <<
-/Font << /F21 714 0 R /F22 737 0 R /F41 939 0 R >>
+1278 0 obj <<
+/Font << /F21 930 0 R /F22 953 0 R /F41 1208 0 R >>
/ProcSet [ /PDF /Text ]
>> endobj
-1014 0 obj <<
-/Length 1863
+1288 0 obj <<
+/Length 1768
/Filter /FlateDecode
>>
stream
-xÚÍXYoÛF~ׯ üDÑz/’ËæɉíÔA⸲R£Hó@‘+‹…¤¬ºEÿ{gR”LÙnk öšùvvÃGÏG~HC'9ò0ñœ8açÖÞˆ¥™´D“>Õ›ÙèøœNˆBŸúÎlÑã%‚8³ä‹ËCcà€ÝË“gã õ°{}6{žû34züéêlz2¸;»øty=ž8äîÛO®f-ÅÓ<Þ~º<¿x÷yËgüuö~t6ë´èkJ0S*|}ùŠ~?ˆ…Âs60Àˆ„!uò÷ò8cíL6ºýÔ1ì­ê­ƒÈŒ(óé
-F!uÓ…šåî}9&îÚô—úÍ(ÚfiŽ–fáææÆÌwG 6i³4ë…l6eõÍL+£Ô›ëRëåÂ,™ 6YìÚ}Eb¨í4{5è£
-¶›ƒ¤%²‰ÒÌôK…#§[øtòFwÌ2N¥>‡©.?þf(¬…éªdû¨(ñÀ „ÑöVAV9)«ÄGû/#ÏÌÒÖëy­žBnLŽÐ×|ð(å ¦Üî.WM
-ÂœÂ|0ÜJÔ¡•RY¯<ô£Š„ù:˜•êÖ1éЯ¹-õaWci”өηõß·>ú{²qÌãAO˜¯£yT†}NJ4TWN 2õ}"ÔÏ3ä‹€¶¿m}i’Dý ÐþÐJ¬dõ¯€tQÅT›ÌfÂïþIËn6&„¸e™Õ{uØçöÝŒYàšÂ¨oüÃrœF2³.xaäÙߢ³eª«, Vr›A"ë¸JçÚ½ckÀ8ÊÌZZÀK\É¢Žæº6Uäit[€7Hcå婪Ôò´HëFaqg‰Œ/‡–6ee+$p_FkMsRó*]Ê=ÕëûºQ‘B»‰í‰-r„PV5&Æd™yÚ;~EÎ×··Ý|ǽ耭{À&Xtè±ÀõrÆ ;O&UÏýå»}n<@Lˆ¡b€Ê¶R)ÅÑÛòÿ\c¯endstream
+xÚÍXYSãF~÷¯Pñ$WáaáÉ Ë†kˆqB¥6û ¤1V­,y%ÇI忧ç’d#›JJsõôñMOwˆ…á#–ë!/¤¡å‡r1q­x9ÀÖ¬}M32D£.Õ»Ùàä‚ùVˆBzÖlÞá Äš%Ÿl†(l_]χ#êbûÝøj<9»œ|Žq©oŸ}?¾™½ŸªU¦é'ãïÕÌ-,¹®ý³¡8»ž\\~øi:úŽ=»¼ž ?Ï~¼Ÿ5w­"˜ u¿>}ÆVÆý0Àˆ…km`€ Cj-ŽËë0ff²ÁíàdžagUníE‰`D™G{`rH¦ÀCn€ËwCä1Ê$L''ч±=[¤•ê™¶^pÕIø<Zgµ°r(t]*wGYVlF_×¼Ü*Ú?TåÛSÕûó´oŸ‘z^¨6/jÕY•ÅcšhÁ%×e•>êaÅËÇ4æ»üÔakÊ"7ì”Ô Qøá®ðV%ÊP(Ž©«ÒMWƒÈ(òÈËJÏ-£Õ*ÍÔ`^”{heE±ºâ/Ï™%IÉ+3¡>Â𑾿¹æ{$i€6ÍGb?ŠÊUtdP[÷ŒUÈÔÛU£wUó²÷8æif¤dEe‹¢ª}ÔK ‡•Î·Ï#MöîCá΀\ò= •ªí©›~ƒ6ÿ-Z®2ŽâbùjÊ·«Ã%÷GÏZ{y³sö\Ÿ~1×ffQ×ÏÁÝ4¹¸a<Ñ
+tèErÆ)LÌ ìÔ)ÂpÉ!è©n½ˆ4ï8Ky^ëéMšezºÈsk¿²å‘µΔk1…éÔ‹T©¦ô0j }z¬¬Ó%ÿn¿ô¡ô1µ(Ô¾ç{¯ª$ ÔŠAìV’o—Ñ££ëA Ô> ¼t×ìØe526¨CP@¨Ó”©; `;³¨ã‚D&àñÑ0bÏfW£|Ï>»ߊ»êøÔžýr5»C¨gOyU¬%þ±¾/ÓÆWÔXÜÑé´½açQí€@Àó°kieÝn¿@š„PnþŠøìúì@åo e 9S˜n6xïøÔ±!Î %̾œÀ”CePò0%Í-> OGðÿ%Áž~xˆ ïFL0† ÒœÄÇ â죂Û`v•Ž¼·E…¼%*ØE¡ã¿
+¡¦cÞ+Aa‡AiŽ&í«ø¿Ž‹ÐÀˆ¬w dÝçù“g:õ¡°
+˜8I wÝöÇ?ób
+|HÜï\*“Iv‹LÖ»bF¼ÂS‘…Å@ ¢IG<\Û-MÚ„ÄÌ<Ï~w99Wë:ëÊ¢ŽjÞ0Yjé"qwä¯
+3!“£¢mõÙ΢z0«=9ðIF§~(K3ÑFªI ŒUñZÄy-*¨ŠÔ¥M)~Ë ö¥Þ,Õ]i–÷Å£¬Ž¿ÍübAa zð2JŠe¶Õ#¥ —hg¢_ãF¨Q®Tº’ã¾Ç=ÖÿŸNUÛŒuKô¼*šº º?ºÁöGx¶«™Ö&h› ·®tFT
+ÊTˆiivíÚÔ«×eΓ=5’´Š£.mÃU;GÝ©ÔE^à9"–JØCàxy¥™Zÿqdkà“µ› jÝ
+Na>¤¯xÁã/jY»—|‘´7ŠÂ-Ý M¤³•PQŽŠ2Q£ýëq€:Ž¦­Ö÷£J\„¥r8.ù ¬ "~AªíŪNAÕ1̃`àùFŒ!Mr¡äå‡~-zP©Ä¢VÊKu¦}?N[êÃFÓ=¦SYl‹3¼îb¿§ ”Cˆ¹Ê[öOÂ]Có¬ûœ„èéÌEc½â°õbz|í/×<ÇG,„i¸Ï(ôY«•P=x¢ºù7Û£û_`#~›endstream
endobj
-1013 0 obj <<
+1287 0 obj <<
/Type /Page
-/Contents 1014 0 R
-/Resources 1012 0 R
+/Contents 1288 0 R
+/Resources 1286 0 R
/MediaBox [0 0 595.2756 841.8898]
-/Parent 1011 0 R
-/Annots [ 1019 0 R ]
+/Parent 1277 0 R
+/Annots [ 1293 0 R ]
>> endobj
-1019 0 obj <<
+1293 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [55.6967 190.8043 126.3509 202.8639]
+/Rect [55.6967 61.5153 126.3509 73.5749]
/Subtype /Link
/A << /S /GoTo /D (rrset_ordering) >>
>> endobj
-1015 0 obj <<
-/D [1013 0 R /XYZ 56.6929 794.5015 null]
+1289 0 obj <<
+/D [1287 0 R /XYZ 56.6929 794.5015 null]
>> endobj
106 0 obj <<
-/D [1013 0 R /XYZ 56.6929 480.2651 null]
+/D [1287 0 R /XYZ 56.6929 372.6686 null]
>> endobj
-1016 0 obj <<
-/D [1013 0 R /XYZ 56.6929 441.7923 null]
+1290 0 obj <<
+/D [1287 0 R /XYZ 56.6929 334.1957 null]
>> endobj
-1017 0 obj <<
-/D [1013 0 R /XYZ 56.6929 373.7178 null]
+1291 0 obj <<
+/D [1287 0 R /XYZ 56.6929 266.1213 null]
>> endobj
-1018 0 obj <<
-/D [1013 0 R /XYZ 56.6929 361.7627 null]
+1292 0 obj <<
+/D [1287 0 R /XYZ 56.6929 254.1661 null]
+>> endobj
+1286 0 obj <<
+/Font << /F37 1018 0 R /F41 1208 0 R /F21 930 0 R /F22 953 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+1297 0 obj <<
+/Length 2693
+/Filter /FlateDecode
+>>
+stream
+xÚÕZK“Û¸¾Ï¯Ð%NÅDˆ9­×·*öÆ–³ÇUáˆÄ¬DjEjÆ“ÊO @$Žìò)5`³»ÑÏÀÐEt‘K’ðB,²B™P¹Xío’ÅÞýtC-Mìˆâ!ÕË›?¿æÙ¢ EÊÒÅr=à•“$ÏébY}Š^üõù/ËWïoc&“ˆ“ÛX¦Iôöùß^áÌx%eôGñâÝÛ×o~úøþùm&¢å›wooã,)|yýÛw¿¼:÷áöóòç›WK¿ŠáJiÂõ~¿ùô9YT°àŸo‹\.à!!´(Øb#$'Rpîfv7nþîÞšOC–“<'2gYÀtŒ.¨ \¤ld;Y
+ XݷǺÙàs«64÷e½3|As­«7èÚ·“¥w]¯ö8Ht–ó&\µM¼¥yÔîvFªù@«£•º;m6~Þso¼a»a+cXâ½;²,‡8Îr~v®wïKo!d3p÷¼2ë"F ’Hª£ZÓTõ&À‚¹<·4Ï\Éó¬°[Ð/Ä¥ <͘ç3Aõ.Ù1X?Ë…%mº]Ûþv:x
+ )E3Kx@çlŽå^G?Ï£ÒÌhósŠÝgWí~nƒð¤Â‘MŠ.‡9 ;ÁwøôûIÑÃðdË ëØÎxbe¤` G˜ÿѺ¾^k­Ö.êƆGÿ¸S“ jOýáÔû8Ü—=¹¨~ xJ²ÌÁÀI’†ë¼%Š‡T®X]ÖyO5Š¡Ì>É9{Z¦#
+ÈÅEá•
+9º4é“dQÕîKc!¨uƒ60õE¿Ü ÇÆ”ðüÏD&¡ ‚@´ñoˆràD‘§.lZxï4Úëø6#ítÐÆx (Ðk0vØ©ÞÒ·kÏ ³S6 ÍØ„t@V¤ÑËx[v6–$hžðtRÁZ]ç(¨ö/·± ,êj-ç릇B»rE qdBÌ•øÜA<»ÏL|›Š¢ë/®ÖÒè®ìWÛ)«‡mí&Õµ:õXç©cìØWTU®¶ã$(ñgWw6êõLñ´½C? gKÙ(m>N“èùîò}{À6ŠÜ}=Ы•êºúÎ%݃i?©ßçja¥]f €"–C6ˆŒP‘ñMIÁS ãPªØ
+q‡\1Äl3J2>²ŸÆ¦ãòS|ݸõf^PØ(¸ª¿Î-ÕôW]ö9P¯¡6
+ˆe“ÒÊ5°ÉòT°§18ƒ‚øŠzèR÷ÛÊHí€:ê[ýGu8eÒ¦^y‹™´m“D0ef «tNdô£%®Ôº<ízí|³ßÄYØBA\÷~u§ú¥|µEXÓX[ü#`ž&l\­|€½Ñ0§Q½ÛºUÖ]§\ÐÝ9ð\÷nC|j̵´K×áëâèÎF¨úÒ«¦RVÊÃåfyXD†¡> DƒŒ~Wò˜‡žê*4àEJ( ‡è×ê4ä1 <•Mlqù¢Ú5ÇnùpïzF¼
+u"yŸ ×çº(+`:mBñÛ«
+v‚_Ñ&-Ë÷–Ðùs’LŒ“é¨úc­º¯ç½¿ªîzWnBˇ¢—ålÊOøQ‚x# £cÇl»„“¬ðܯb¼ocàÁ
+° ‡åþßv×ùöKð_×^9ø>KRñt{RÍ·WO5=öµXFO2ö´dOuE4åv-¹œ—}yäøÐ9ézÌ2Ž[r=p[r.³ñ6\¿DçÁ i›xðV÷ÎÜö³!=îµÍ—»]ûàdmí$´¡#öÉ´ ”3ß'éù 3Ë4H„¶n6Äðd­`ds€F>ã¶<ËÎ1 ïLØÂ\yך^
+Ã{˜.u{²ßéh²C»ÀÔ‚V;‹|S¯ÐákÇ©glÀ„IÏ4px€P˜aúp+È
+#si¿Xô ªGfœ¥V˜ž2G·ð{Þ÷觑²†l=âà¶VfªÅß;ûFç­sIË«'eóÍ…–
+(>pGÊìéóÉ¥ñ7Þ“†>ïÏê‡]ùè¸Cø½Úø«‰CyìÇWþÔ
+p¬xJ´§¹=vrB þ²¡ðÙ£,ˆ†—
+N8çŒd¬`—·Àvÿ¤?í.îü›¾ü2õÃ%0'üµµQ†Ìè‘2ÂÒTúÄ„íû&·×ˆã<dÏÄŸ¼÷?²œÿ¿Gd„çùÌ9#×çŒ,ñJiõ‹©âþ^.5ÿ+Lendstream
+endobj
+1296 0 obj <<
+/Type /Page
+/Contents 1297 0 R
+/Resources 1295 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 1277 0 R
+>> endobj
+1298 0 obj <<
+/D [1296 0 R /XYZ 85.0394 794.5015 null]
>> endobj
110 0 obj <<
-/D [1013 0 R /XYZ 56.6929 167.4388 null]
+/D [1296 0 R /XYZ 85.0394 769.5949 null]
>> endobj
-1020 0 obj <<
-/D [1013 0 R /XYZ 56.6929 126.8733 null]
+1299 0 obj <<
+/D [1296 0 R /XYZ 85.0394 744.949 null]
>> endobj
114 0 obj <<
-/D [1013 0 R /XYZ 56.6929 126.8733 null]
+/D [1296 0 R /XYZ 85.0394 744.949 null]
>> endobj
-1021 0 obj <<
-/D [1013 0 R /XYZ 56.6929 98.4089 null]
+1300 0 obj <<
+/D [1296 0 R /XYZ 85.0394 721.0357 null]
>> endobj
-1012 0 obj <<
-/Font << /F37 802 0 R /F41 939 0 R /F21 714 0 R /F22 737 0 R >>
+118 0 obj <<
+/D [1296 0 R /XYZ 85.0394 672.3079 null]
+>> endobj
+1252 0 obj <<
+/D [1296 0 R /XYZ 85.0394 647.0603 null]
+>> endobj
+122 0 obj <<
+/D [1296 0 R /XYZ 85.0394 136.5325 null]
+>> endobj
+1304 0 obj <<
+/D [1296 0 R /XYZ 85.0394 113.5963 null]
+>> endobj
+1295 0 obj <<
+/Font << /F37 1018 0 R /F21 930 0 R /F22 953 0 R /F41 1208 0 R /F53 1303 0 R >>
/ProcSet [ /PDF /Text ]
>> endobj
-1025 0 obj <<
-/Length 2719
-/Filter /FlateDecode
->>
-stream
-xÚÕZÝsÛ¸÷_¡—NåéÅA°O—Ë%×ÜÌ%×ÄiÒÌ”– ‰w©);Îôï À$EJÎø©ãàrw¹Øf3
-l¦SBE.gY.IJY:[ì®èl Ï~ºbž& DI—ꇛ«¿¾Ù,'¹âjv³êðÒ„jÍf7ËOó—ñëÍ«÷× Oé\ë$UtþöÅ/¯på<JÓù?ÅËwo_¿ùéãû×™œß¼y÷ö:Éh.áÍËï¾ûõÕã{®?ßü|õê&~E÷Köþ¸úô™Î–ðÁ?_Q"rÎîaB Ës>Û]ÉTT
-V¶W®þvžºWÇ,—
-MRͳÓq6fº4'JpáLg¿™v0JéüDzXWuÓ– üÚ›kÆؼ®·ýRàÇ;üè,áŠä<˧›ñD]¡,'4eVWK³,×#Œ˜$¹ÚÓ|7ÂE­A l@Á1.9*ã‘KÂ%›Õr„‡ÝáZzÒªÙÖõïÇýO™‚õYæ ÷‡k¦çõúPì`/ô¼p+ÆNòy±Ýâê¢Þí¬`7Ù–•ÁQëìèHWõ×€îï=àì£9<”ÕgU±óœs¸3‡†X g ãXÂÎ3Fò4åÁü¸iËreµZ™ÎË
-›öakpˆÚÁ >¶ûc‹cPjW´äħ)ì šÒ98WÎÆ£×%]ªiŒT§èÊÌá-øy™hDfÏ/(¸—’i_¨õÖ„Ól¾¬w…³Õ`)´AYWøp;¾w¦„ù¿iJÇœ\JÞ&¾ÁËCžeƒÂÛ ÑÎú·ÙMmܮƒí·¦õôõ*2hü’wh7vnyçjþÆ3Þ÷¥4§Bõ}©½¯¯A¨²4Íß®Éø¼)­P\/«ÖŠE[Þ™GB9×K
-œ7àÏá5çß.¥@x
-&ñ‹ì“Û¢]l†¬î7eX4_ÌâØšgE—ýÚ×à \Ú–A7
-üÙ–÷zg=¬]lq‚œ=ee¬ù£óÛÓçõÞºKã¹Ç|`'‹…išò6Ý
-i‡3Ün<f /í4¡Ôq Ñ  ÊáH40ÈÄB¥0 P"º<Nã“QKõ(ÉZócS¬Í¤NB‘jõ,:<œNrT§@B,QàeŸ¾ÇPKEç‘­ÒÔ‡fO$ëqŠp[Oöy„Qp*ט*NIF´ѧF)ɳLyç=Iû°7#¼ 8gYª£Rø•cºA\÷x.¶EÓŒ0U)ÉR!Lÿ2• ’[äÒåŠ.>Â6c$=ûÍ!]Åïä§ä²qËõ´ q£üé¢þ6¶LÕ^ܲÏ#ùrcN$…µ ðõX7 RÍ1d‹qÙļ2R(¨¨¦óó…"#RÈà½÷eH:mñ»ä[®FÄ
-µSR¥ÎKT#bù ¯
-‹ª{r§Q<“ü<
-Ä”-À4ÿà‰—fU·­Ý|ªÅÕE][· ¾ukÚ{c*|´ALËU{ð#áÈ¥(©
- ìÅ8•ñÎY,—èÖMc‚ÓÝä\¶Þ;WÇjaݲðŸnÝ7øÑ­÷Pó¥5ÕÒx)÷e»u7…t]}¤”ª`'ŸQƒ»<¦qA¤ºˆ dÆ…CÖstêò˜Æ‘*º&V‡¤x¹ÜV‡ææþ.Œd1V†Ľ–¡8N•PžÃtX’·ÑGµ¬ÛI~ñL¶Nà†~á‹üþu™_¹3p |Bô,ß°„²¯‰Ê¹ì×ýƒi¥ižÎ{wQÝÕ¶X}>$½Ló!?Gj ßõ
-°Lªœ0Áù EàTÊ,D„ªîÃ0ó-+ù€ó?ÎñHže> ÏœÛÂZq[»R
-Ã;X.e}ôïYoòCÿÊCV¿Š|UTh€oÇ¥W|À‚ ‚È´×8Àâ@˜cø/Èþ³ùÛ¾Y‘Ðh]VÀnK9àIЖ~;6~䫽&³B1úÄC, Älnüê ØyèrÀþõ@<â±ÁÜCú“(Bdê {Šèò˜F‘ê"ŠŠ’”«gu<º<¦QD¤ê…¨¯˜ !PMŸ:KA¤êb䤭“U:Ðý“³&Œ†@ÿ/ÊI¼8 ÏãÕÒhªò^qèG¶ÎƒSÂÈ9%üKâ¼j‰ ÷‡Œs
-ÙW°uµ>ÚórÓ]ò¬ÖÀ¾Â¡í‚¢ÿÂÄCqœxgÖ¡eí…áFçâ.]tÄqÑ]£Š*"c+˜òºu_a¤ÃÌ]ôÂtó°G)ªüŸäϾëji\°u™7ÎËK¼‘Ür¯ƒ"!‚sT]uŽ#)¦sTfü Üh0a&ç$2r»ŽŒNò‘àihžÂÈ*l1ÙÔŽÜG®¼0»äº¶ðûxê±³ž²ŽlÕãVn©Æß[ÿĆPmCÉÊ+G³np- üE3ÃàqËíÓζ¸¡öýx†1êZ20‹›9xË?Ý›Ei9›¡8¿«0òû Ñ4\ªÁÎI>µÆÜø ûèè~<Z{1,ö×&í
-°L³ø<qu¹UJ
-?°ú4`ƒ‚À•°qâI[„4Ú´áb+Þ³œÆsì–Ä»ÀËíé Ü”ΞuU9œ¹¼Ešé0ô›-Rbÿ³hD wsÏþ¦ÇÿëWZóq'ö2‚Ó¨”U>*ÿÑéTóÿQ”mFendstream
+1307 0 obj <<
+/Length 3388
+/Filter /FlateDecode
+>>
+stream
+xÚÝ[ÝsÛ¸÷_¡·Ê3Ÿ$зÜ]rM;Í]m_;\h‰²™H¤N¤ìsþú.>Eˆ å4ÓéLÆÁåb¹Øß.h2ÃðGf"C™¢j–+Ž&b¶Ü^àÙ=Üûé‚8š…'Zô©¾¿½øî Ëg
+©Œf³Ûu—DXJ2»]½Ÿ3ÄÐ%pÀów¯þþúrAžß¼¾¾bþOø1×?ÿòúúÕeÎç·o~ws¹È±âóþòê—[OqžÇ?¿{óö§_|.?Üþõâõmx‹þ›Ìô+ü~ñþž­à…ÿzSRÌžà#¢m/¸`HpÆüÌæâæâaï®y4¥9.0‚‹Ù‚q$aýÉb™€qŠErIa ÊeAù”ô”/ J‰Y ÒÊÿµ-îË"€@’|–óeyN¾F¤ #OŠä©´Hu±-W‹åC¹ü´lêõå"Ãxþ~ñññó?î´Äß½¬Ç‹d´Ì% ¹¬ª}¹ìšý³%–eTG鹦xæð’Ô³\W›R —àòKŠ³ÀñT¡å„d³´&˜X҇ѢO5ÜÆ`¥žêDgŸ›z°¡„IP´àÓª„´¯fgy,ÂíƒSL$-Qˆd¹rŠIˆyÂ[rØDæ·f·¿$rÞÜï‹­õaóhkÇ…ýÙmWîíø7Œé¦´ãuã&Ûçº+þpÏÔ+Ǩ©Û
+¬—Ï—„9óLåˆq¦¾Âú,ÆÝ2PuËL
+Ĥ̿F¤‹q· T©½s®¸úøûãÁ1—I'‚/ÜŽ.7EÛ&ˆ* ©—\4 ~L@œžasèv‡.Á1&› 1é—GŽÅS‚)Äsýa¿„ %ýo¹:+òoXàê¾nöÎ¥ïÇ&‚$.õ1ÁŒ"ðf}àBR:)¾Ëº¨6 Ûjyú’õ7ø’C{þWÒP¨D9–Ü
+ùŸ¼î Mø¯³^KqŒÛlR¹T •çÙKSi~.•f @ãt:•ö©ÆSi êŹf»“É”CN#"Ÿ!P%dˆ’)8=V
+îU/KKõýÛw?Ú‘Bô*‰`Á‘%gÔ¹‡ÌÑv»fßµNžÍÆŒ>ô
+¯Ï+mxþôP]¨ìÃO.Ø«bÓj+ÊÙ¼n:'°Ý…reç«zÄø¥ÕSÊÔeŽ
+¹ëO­e¿|(êºÜXæÛfU‚q1°ú·kk³ÿe™Èâ´þÜløÚ_Êù!%ƒZ˜JqÆÞ( ™û©êšCçkF›ö W-UîîS¥­Ñ†Õv·)ž£P{0u‡­«ÊöxQ´>æ÷þóXiÕ "M£Ïb¼Z
+Tg«%‘‹jTý"õXŒWK*lÛDQ$Ê•ôö­ûÕ}ªˆÉgŒÂÈö,Xv!/É‘RNO9îÎrÔ®”~düžÏòûT¦J PX¨ìÅpÔEÒŽ”ˆE^ŠH'¬íÈBRá–Ih"×8Ò…TäÅ=‘há8æˆQêß´r.hq˜¬í¯Í²Á9«ú~àžÞ’y0]9mî}*kî2aîʘ{¹iŠÕ
+íf[4ª&VÈÁ4¦ÕÔ£šP“§ŠÕ¦(Fë¹^%Ç
+ç÷ .Æ S9ê…£l¼_<VåSJ–Øíe…,†Áʧu¨†ÊŒ³ÆJ’X›ý­Np_=–õq“Ç÷CšÅŒŸÙãÕÄ{*»Çk€5©MŽ*Û©MÒ£ÛóÞe0DApœÔf ªód—s
+)(.*°Mc*wÛliËüƒ\Fu+#ÀàÅÉ™@ôö¬ƒ}#×Ö°±¦1bƒÏ1}Ì¢ x²7÷÷3;¸Ž”îèýZð5Áätý:‡J€ì@ ‰Á‹:'Æ€›ï?éVN–éjÛ;æ4_ø¶€¾Ð•qU’jo‡»ÃݦZÇwÙ•ûªY]ÁPú÷¡ù[-åI/¸icÉ%lŠn`±<wfSÚ®tŸ@Á,ÿöúß–àúº-;<SÌJ÷ÝCyPZB;]9>ºßp_j91±¬N,ê$2žšŽZÅ¡k¶ðνN«UÕB‡¥råÝÃI¸¬!˜ñs¦ªßÂ/<FZ™‡²Æ\Øe~?8r$ÝC¡_Qf¾ÏwZ'q…¸ ±ªÛ¶L5DDîH£j±M·`cïJ»¬U±½‘(E ¼&}$4ÍT'&ŠËW F-ƒZŠÐŠ¢£ððÊÚ×ýsªsMÔøLUö„!ªBßh¹/‹.uÂ'
+ûO±PÓÀ¦O5Žl•–G×b&ë&EÔìú6
+mDM«3P õ‡PŒÆ
+õGq` ŽÂâÀ¬…8Šx× `XÏy/%}ˆs¤%¾§í#ÎNYðqØ&Ø&㺕óblÃ!f“lÛpŽ$Z
+ûÆŸÃ6ž~Ñ Uhžò± ¼bÛ@ˆ@4’f°ç–äŒ
+Ù¯›tôWÌUáT
+ Ѩ´<[7Œ.Z+|¹Ò Â} —¼÷ÉŒ€ X
+Ç Tç¦í2ÂV¸µ-VeÿŽý
endobj
-1024 0 obj <<
+1306 0 obj <<
/Type /Page
-/Contents 1025 0 R
-/Resources 1023 0 R
+/Contents 1307 0 R
+/Resources 1305 0 R
/MediaBox [0 0 595.2756 841.8898]
-/Parent 1011 0 R
+/Parent 1277 0 R
+/Annots [ 1312 0 R 1313 0 R 1314 0 R 1315 0 R 1316 0 R ]
>> endobj
-1026 0 obj <<
-/D [1024 0 R /XYZ 85.0394 794.5015 null]
+1312 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [219.3839 329.5541 281.1025 341.6138]
+/Subtype /Link
+/A << /S /GoTo /D (options) >>
>> endobj
-118 0 obj <<
-/D [1024 0 R /XYZ 85.0394 769.5949 null]
+1313 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [491.4967 274.4996 511.2325 286.5592]
+/Subtype /Link
+/A << /S /GoTo /D (dynamic_update_policies) >>
>> endobj
-978 0 obj <<
-/D [1024 0 R /XYZ 85.0394 749.3395 null]
+1314 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [102.5211 265.1945 156.7673 274.6041]
+/Subtype /Link
+/A << /S /GoTo /D (dynamic_update_policies) >>
>> endobj
-122 0 obj <<
-/D [1024 0 R /XYZ 85.0394 221.8894 null]
+1315 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [243.8464 219.4451 306.1963 231.5047]
+/Subtype /Link
+/A << /S /GoTo /D (options) >>
>> endobj
-1030 0 obj <<
-/D [1024 0 R /XYZ 85.0394 197.4323 null]
+1316 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [425.9845 164.3905 495.353 176.4501]
+/Subtype /Link
+/A << /S /GoTo /D (dynamic_update_policies) >>
>> endobj
-1023 0 obj <<
-/Font << /F37 802 0 R /F21 714 0 R /F22 737 0 R /F41 939 0 R /F53 1029 0 R >>
+1308 0 obj <<
+/D [1306 0 R /XYZ 56.6929 794.5015 null]
+>> endobj
+1305 0 obj <<
+/Font << /F37 1018 0 R /F21 930 0 R /F41 1208 0 R /F53 1303 0 R /F22 953 0 R /F14 956 0 R /F48 1228 0 R /F55 1311 0 R >>
/ProcSet [ /PDF /Text ]
>> endobj
-1033 0 obj <<
-/Length 3426
+1321 0 obj <<
+/Length 3086
/Filter /FlateDecode
>>
stream
-xÚå[Ý“Û¶¿¿BoáÍX>H‚lŸœÄN™Ú‰ïÒ´ãø'RwŒ)R©;Ë“?¾»øâ(y’δ“Î=€‹ÅbñÃîÇVþØ*ŠIœòt%ÓD”E«Íîá·o¯˜¡Y[¢õê«Û«/_
-¹JIóxu»ðJM¶ºÍß‚r hðúùß_\¯yDƒ›o¯£(ø|TýÍ÷/Þ>¿–apûêÍë›ëµ¤i|ý·çßßZŠË<¾~óúå«oìù\¿¿ýîêÅ­›Åp¦Œ
-œÂ¯WïÞÓUþ&Ñê *”°4å«ÝU …BØ–êêæêÇpð«êêÓ\QEa´Z‹$0¾ŠÅ$qe r³„C!JI,¸pÊÙ@ù #QšF+G…ʯ³]‘¯7Åæç¦.®×1¥Á»uþ˯߼·µ jêË—‘pcÖ %B.›*k[M4’§$Idj¨¿ÆÃOD0ûÈ2lŽÝþØy8ŽÉÇî"Ǽ<›®9œ<L£Ä<bS¦O¦°J¸¦L®ÖŒ‘4Šøïåþá¢È?Óˆ–÷us(4) ¤!#I(,×_<Ì8‘± ÁSv¨=\¸ )šúgrÙfeR±¥¥N¦“¬ÿ„“œÛóO^Cá ‘4 džòŸžîg
-êÙ¿F(M¡öþ%6ï<l"’J[Í•U€âáJ’p*‡ —ÉX¼’4"RJÿchÖ"…rœùŽC4
-Kïʺl»C'ŸnRæã“(b 5ª´6„Åf_
-
-yV™àHG©;¯¾h5ûÍCV×E¥™ïš¼
-èÁ¶dQAàæ°–ñ¼†TgTd©Æ:#Œ£·AD•,…Éï<\”)ûò*Éâþ[dcwÄcY<ùdoøYPÆáü¢`ßçué¨æÊŸsè]¤ ks¸ôÎüïËÇ¢îyqÔ@À »`Hµ¼ÆŽJ¯ñšß"âØs‹< ›—翼Ê!8 )ÀâYm:ª¹:'«  )ÁUéó"Ùühwð'|»¬ÄØ3S>¼‰¯-€¯ËS).Ø€êŒ-X*m àÔíÖžÁ£ˆ!Ä\ôOa0÷”Ãî<«PG5×èØ@A)&ÁF*}Û«ôìb›ÐänB»Ë 5¡à’MJDÄà 61 :c–J%ºEñÉ&Ëÿ”(á‰Ø°ô¼RÕ\«c»
-´6•ƒ‰tèÏͳ5m.l…J«…/rÌL°<Fåç%á ‘ÕÖÇÌp*ò²3Í:ow…þi—åÅðK\ÚJ5¦Ë0ņs¡ãÐTë zwÂ/C¥AÌmôuM„ÒÆêvšXßXÚdÇV©Ë ßë
-SÙ<l4IüÒuVéŠuÕ²3¬î a{ 7Rð7†Ê¤†èxÌþ^sn}>nóP|0&Vœ{e¥/ ¼3u›a{T ƒ#?¯L7gEXÑÚÐ}³®+v{µ6ÜÅÙœNxnA?F¬§‡²òN¡UgÖû7°ö©¨ñ 6‰’89_CªeürTZ¬ìi½Æˆò‡Ùÿð²>êYöžìL¥~Ov¤Óuv§Œ0Nzìâqª-3]í×]7÷V?,q¬° ¯›þ'ÝRƈeÊDB„Nn%Ë–I‡eÒb™Ëu‡mrˆm˜£Ç¹)dk·È–8ŒÀ&E,mÂB76šP33®þØâ™óÐ!/ÛÏ|Ц 
-}çŒAº!ŠÔÞ—ÆAÞªÆ4Œ 
-êÅDzíÊú¾ç1µ57Ì<äc¨*t0“¦A‰Xž&8“nyÈ ݦ}+…­Ql±û´ú÷­õƒ   ¦Ö­™nØ?æyI.8 cwK3LY4/„¯îþééÁÊ r:øOÍÍ™®VúlP7
-ÐZwwZÀ3™úš81gËÇ(hmêìßhdM™·˯‹Âæ‡ DM­;ÕǃM®Î»Í oØ•;;à,Ç:Æ,åòþ¢à%¾[RÙ_–Jåö»¬kçéVg¹ŒÎë¨æãŽ7‹Á
-¦ÐÄîʼ SÜ»·k£ÙãúpwdöC|wÙDˆÔ]ƒ™Uä
+xÚÕZKsÜF¾ëWÌ-£ª ÝO’]{òú‘(U+'–öU‰Ô Gâ†C*CŽd¥òã4ºùÒ[ÞË–Ë¥&6Ðhàk
+l¨"°¯6A(…lì«âŽ}9ƒ±
+W Ú·~Hž/7!cëŸqůÞkÝùDj fy/‹”˜zó
+ÄqdÓÔ4:0Q:†mžTÕÄ4}Y‹Ó<eéó”220¸=ÄôéÓ§á>ŠP–¿êkdÓ†klS!ºâ"Ø=¥tߨïŠä.OÁ«Âx}zÜ%uZáƒY×%zÜ/y¼.O "ï^Šämé%Z|V†áújO}E”ÌM\=¦Û .ÜAÆŠ¸çÑZX•²_éî[`7ìºGë$ÏiÐÓžQFåxì+”û¶h¦_ß>X €¾MN•ÿ
+)„›rCªUHã­-‘¡Ù|Hö5ê„LV6ÒH=$n‚myxÌÓÚ.U ½~í?¸}ø‡FÞÌMÑd, 6}­ ÑüⴾϙÝ
+Ùm†¿yYÜ[ëÁø.¥¿´Ô=Øô¸v¡‘‹`0]¶ópÑpYåË:Û¿LĦâA¬$ÿ?FŠ³@1kÍ(FÖœŠž9?¦UŠNŒ;{ýáöêý¿i|H«*¹÷ž±/P¨À€°áìö‡"1È]ØþÛÌö{.Ô÷˜nËbŸÝDë(ˆÂpI´ç‹îÙŠÃÛ”é‰þè!C†Î0
+žÓÏYUgÅ};GWjE,8º}¸JŸ,¶³ÎÏMŒëx!ÊCò”mû@Ô[|Õ¡ÇWü¦¢÷û¤²8„4€›‚¨ ö'Àëê‚÷\]
+ÇÌí¢]ñu /yéг=?x}AÏæ0îÐrB9÷)Q‹ÓáŽß“=D¨ÁÍÀ þˆ±ðfÏzÈjú›<•Ù®¸~‘¦.`j“ég@Ô"ðÊ=ó¶Þ3ðevðËýDH¹wn+gŒ#Çl)ë²Í˜çB“TuRW#¹pSJ³ ×såö£KA.Éa z‚ÿ‰‰ï1«5šƒÇ úü¶êÛ½1ÝìwÞ|:Š(ÁŸ7_—í¼ù.\Åo§ôø’—çñi^tƒO#Ñ“øÔ}{iĺ¼¿Gä‘<"Upd@ Ì#¸Xÿ4zAl1–‘šäUI¤»”(.çrD÷qúù1϶Y¿}—QŒnk7¥Å— 4˜F'Ô7³ èR§÷åñe#¢0EslZ_€’ 9<À='âZ‘æS¨|¬™1+hÆiÝEðXû ÂÛobÎð–H|¥t&7uç…˜`1Ç) 0uSÃæsÎýÔöh†YqW„Ô6‡ ©Õª+%A,bÿ©õ—´K0k,ù`OГmD½¤Õ_¦V qu-çârÒrÊ„>i*Ñ Õ™9G–#Ìœ´œVB}‰å DŠ"í<ƒŽ«X/å/]¶|ð\(sw:<îî\½»ÚçÍ6Ù>¤lþ?/„y2j–iSJËÁDn©"Øhæ8J-%´œ‡áüJ®ñJû;[Æ ¤Õ½¥¾…¥^n¸q8ê€ôßTD²«wã_˜f»tŸœò†œˆ@½BÇ1‘t 3 Åû¥ÍèdØY%Ú3á\>k£†*T" +¬~9£ê·S‘ñm¢P>ÿÖ¥¾–²9Z“Ã8ÍæJ(ái«ì²÷Á†Ë…Ô±,á”?ëlý8ù2_‹Îùš€:G ÆçWÔpWÔ/cDŒ<Õ_ùšT±+¨•ú¾ƒ…Ÿ Ãx¡'*ñ­]§3å°x·օú;.d]ÔÀA°ÚGÔ¯õ«v M1N
+öüúë½Î/nøR†Ôe›ñ>ÏE fùèñïqä,<”Ù(¹ €ç+0È“â z ÁÕ@2¿w,öξ‚­!ׇä×ì’¯mÃ`oOÞxÈ/4pùNZÔôL¥SE‡d—z1´O§û"´­!æûs4†ý£ÓÎ@ÛvíºÎÕ¿ÞDìôÃðÝãXÕø®+(ãvDG‡æ&òèBT¸ùrÂÝÈ–"øqÃI*¹y,èXN ôØñ,B€‹Øx
+¦´¡¢öY¨Ý†Ö§ca àPKW
+ X…ó®tØfpÅsÙœÿ˜lÓ³«y¹MÇj$wºcÕ|UP‚˜zõ„õñÊoÇÝÉõYì­Jú”ºôìÎåq³ÝtÉ@Bª»`º.ÛyÓ5\=ÓÍÞº’¾Cí"„ƨí<×X»¾c€é˜Å}õnÒºš´k“ÕÏ[ׇCRø>-5¬\jœä§9«+ªóE«wØf¬î¹ÜÖ¤ËAÅ${®±ä¾Eu5S}Ñÿ+‹²»!B³tõ×e›±›çBå÷ù©z8èór›@Éôžà÷(8ýÃÙfÆyÓð˜’EKm¥.ÛyÓ4\iÁ§Šù0qÜM£G
+p¥å‚‚žk¬`߆²X4œ¶á}FWRX£bTŶ—ï_io¨ B®—rÙ.ÛŒ½=—¿%9¯I”Æv¨^ì¹Æ‚Ì q_òÛ¬zÌ<6˜ðjر½Ob>µe¢SÓÚâM­¯ËÚ½ª’Ú©¹4ƒ)h*ÑÜHÁ0+¶ùi矚¯²¢ÍR†ÅŒŠ€|¯ù.+v¯Þ|?‘`àL𘸛óð½võ¨I8!ò$£™?¹‚WW×82S>ñyÈüéÝŠÌÚ˹n×Ä·eènöìÉâ»2ÃYÛËb;çLû…³ñÒý^—mÆs=—»@?+w;0Y€ÍËn
+°‘ìé¬'ümÓm¶2Ϫº!êï&V&6ñ•±ú=ƒe“Ù {aÕþ”ÅÛÃ%bç7%Š…K-±×Ì/à“í&y¶swĶ:.‹?Êý~î.@è@‹æbë+ïDl@(‘çÖ×0Ö×,(Ï„V¦·@ÿc4ìàûNþ.«ZâÛë››wohÜZâ#Ôšðñýëµ+ª*ݺß_MbŒÅ„\ÐE§¿ÔQw͹S7/ÆÆÅŸŠªæ2î%­¦ñFµ…Öpþtn¸Ç{®§Ôw†ëÐ 4k~w梾ãÏ:'öþ;ˆýê_¶?ªÿ’ñ9 ,ïƒDÊ)…à|¨¹–q cM¨þ'[–Cendstream
endobj
-1032 0 obj <<
+1320 0 obj <<
/Type /Page
-/Contents 1033 0 R
-/Resources 1031 0 R
+/Contents 1321 0 R
+/Resources 1319 0 R
/MediaBox [0 0 595.2756 841.8898]
-/Parent 1011 0 R
+/Parent 1277 0 R
>> endobj
-1034 0 obj <<
-/D [1032 0 R /XYZ 56.6929 794.5015 null]
+1322 0 obj <<
+/D [1320 0 R /XYZ 85.0394 794.5015 null]
>> endobj
-1031 0 obj <<
-/Font << /F37 802 0 R /F41 939 0 R /F53 1029 0 R /F14 740 0 R /F21 714 0 R /F22 737 0 R /F48 953 0 R /F55 1037 0 R >>
+1319 0 obj <<
+/Font << /F37 1018 0 R /F48 1228 0 R /F55 1311 0 R /F22 953 0 R /F21 930 0 R /F41 1208 0 R >>
/ProcSet [ /PDF /Text ]
>> endobj
-1040 0 obj <<
-/Length 3964
-/Filter /FlateDecode
->>
-stream
-xÚ­[ÝsÛ6÷_á·“g"Ÿ$x÷”¦IëÎ\ÚK|3mhŠ²x¡HW¤âúæþøÛÅIA’;½Éd‚ `±Øß.h~Íà¿6:a2W×Y®͸¾.·WìúÞ}wÅÍÒ-ÇTßÜ]½~/³ë<ÉS‘^ß­Gs™„ïïV?/Þ~ÿ槻wo–B³…Ln–:e‹oþúŽz>Á+­ÿðoüðþö»¿|s“©ÅÝín–ËŒ¼<öÇŸÞÆ}ºù|÷ÃÕ»»°‹ñN9“¸…_¯~þÌ®W°á®X"s£¯Ÿà%<ÏÅõöJi™h%¥ïi®>]ý-L8zk‡Æ$§¥I´YDtBŒDÇ%OL*Íu¦ó$•BZÙÕ«›¥LÕ¢îñW/v7Ü,ªa¿k«H#Õrq·ñ/‹¦éžzP´ÔWý6T»¶h¨÷ÑŽïʪwdCGd«
-ȶu[Q÷Ó¦jQzÀ#ñ(™NxÆì ™k‹mµrdã­H•¤B¥ŽjS¸=”Ýö±uì륔y’åéõ’ó$×ZXâ~èëö!™Ÿg
-æWÙuÆÓÄdŒG…¨–c2+leÆÂfÐ1Ú RÆ?/?1Ê$SJ^`ÀS30=íÔ$™Ð3>ÁîA‘…\ ›
-bÑW»¯ÕŽ:ë-È».†ªy¾áœ/@$ã‹UYµ‘”›¢}¨nø¢§çm±ªüŒtöû‡ u¬žáüê’–Ù?®`^zѹånÿõþ£;*à1åfzTé"ðÀõ¢íjôÅ×jEM«[\Ñ^°c[ôîÛ¿0&šªO’/î÷nøSÝ4Ôºwƒˆë¦ñ³®»Ý-½¢é×D±u‹úÅþÝíÞVsk rbÜ ó;£c2Ïrkx"3Îðú¡Ø Öòdž.nפüjl#`äF³Ì)ÿò1b\%™äŽ‚ÈýcUÖÈg0©ñ¬C&/Kò\zÃû“›ybô¸t*Ç{ N·FN‰¼SAÂâfÉ-µƒc±Âs‘(%fÖ<]ü3ªþŽÜ >žp7\ðDÈ‹ÞF&Ê(9ö68çÁÛØG4î³~%Õèâ³ô‚_“ö+
-YvEY­ ÞÏ€ ¼°®§:^w¦Q u¤>Yø¶-éh·äð
-™_7û~sÒÐϯ ýhݸ¡O~ W/\Y”›s*%Rhäæ’hFdgDã©‚hЃGŒA“Üüƒ9x5
--ˆ §w÷u»zýöûÀ
-›lDX{>uYÆ+QJ1碌GçЬm¯“ÏÀgÞqª|> cÝíÛÕ«Èa¢ô!gùTB§NÂe&<“®Bȸs‹Øjºî µê6"‰L%:åéÑ‘~©žc'
-¨–eÞeÿÂ4CÍÄÉŸÀl*tÇK¤€Ø¤òZÓ?÷¨.«z™?
-KAˆÜÖM±ß?ù‰=]¬¨h-ÑŠó1°>å‘uŽöe‚G^Ê\¸ ˜¾Õ)¤VïZŒÉ´ÅýÎi øFÉÓ|~?úŒåT¼¹iv"ZAr‘3>q«}ü¢L†MÅ¥†0’ùd1n†rS–e/ÄèÝÈsO†X#†f•‡páRîØ\)šòGp†ÐrP¨]HþðŸÕáR _>LVÑ÷]‰7_t6/Í0¹˜ø?ŠT&‚“¡àzzcþi6*ƒC¯‹¨ØÚÔå†(€ô™:¼Áö*Z7½ŸôÞ/€zZž;ø”Ý[Y„„6¡Äc!
-2<ÈóGÞ€©Ú ‘ç°m?ëc·bÓª$3ʳÄ\
-hᣣwêÈ}ÁS,/ÊC
-½È°uïèÀ1EIqm­
-¹ë"ž}éw71åe¬æÌLô-B9ä©Ç‰ÎŠÞ…ö(Ö~„°uõ: ÁÀ]kÍ5P=8wñ2 ÿÊŒ˜V~M*ÇÚ•(s‚Ç/Öµà³Û@=¸±ãcrI…
-”µFVU3íT¿Q1]õüZ›˜Õ[G×Êò¦ qÌjœ£Û¹)|6ÕC•@lO_»y<ûô´0Z:V1Tw"§—Tò[ F5ìé± ÒshP¨tž~!dØä@ ÂF¸UÚ¼àlsî'»ø¡†CåS#CçH‰²„‰`翯Ȃׇ<*_Ün³ý3¸½ß|®‚T³T£§ÔÜ“eË~œÂÝw2씄t”±”_:’Œ±È‘ØÕb)1Øaž…kˆß§qÓ9w90 =9X);Âù¥&?ïj +b"Üå{­;üî„>ú¡Ô{‹°(=#ã¯|NlÀ̬Våpœ0‹íÞFIá**Â~Í‚?¶”KÍU·-¬=MíÊeþ«©|a¯P€+±®Õ¹.yû¢±Õ½Ñ*›r`+ rƒgþª„ ›½M!¤ô|ôÃŽÔ7õ—*†BŪçIn¸œYÉüZI­ †B¬Lú’oÌjLüËÇe˜q9ž2r  £š²3j J)N´{–
-zô¦è\½*îÏrôßýËø3X€à.ºó§ŽzÎ]˜*U
-ÍC·³,ª2Èü‚Q̶¤é!&5U,¤Š„ûDiüsSû²œÿÈ ëÚä¹'*)륋Çb×[¤§Rï U”eõ8¸vûL ¶JQ>½Rém*—á/4•Ý~ eå“ùÜb‘ªôK,c³-Êåv¥ãçaDÈ9œêÙÏƼîµîN?û!YÐ:wý2Ê9GÈ p·(E_-Så/FÊnå?L òCâ>Vë„ïߺϨµ2.¼#,dâEÁÝà  ¹„&6¥Ž„d‡L¼'OUP7ExxãPèß»›Ky*¼Ù1²pOxÂDak¹–qŽ\Ö~àeò]dtþú]VXi@SÊ_˜—d©_ãJÁÇK¸À¿¸s©vPN€-[]F’Cª†ß¹ y¢,~d/
-ž‡WÔÚžŽ:îݵØãŠø™ßD¢=Ø—ti§tØ#lÚ˜èçÈ@ø*ò½I$¿ËÀ¢BîvB¼€º$Ëó™<7O£›_ÒG7»VdëçY¢3Zi
-â!@}ñæ|ÎQ~F×N.?1p”dmþÄ_}HàŸjDjçðßéãþ‹ÃÊ`„7FÄ‹ð’¥dÃŽ)Ü4çsÎߎ³þ?¡.ܯendstream
+1325 0 obj <<
+/Length 3852
+/Filter /FlateDecode
+>>
+stream
+xÚÝZÝÛ6ß¿Â(¨ˆU~Jdó”öÒÜöpI/Ù¶èZ[k ±¥­%g»-ú¿ß ‡¤$›Þ,zo?˜"G$çƒ3¿ŠÏüøLçYn…Vešq=[î.Øl c¯.¸§Y¢Å˜ê‹ë‹Ï¾’ÅÌf6ùìúv4—ɘ1|v½úi.3™] lþúÅ¿^^.„fów/ß^j=ÿþÜó›o^¾}qY¨ùõÕ›×ï.³jþå?^|s(>>Ç—o^uõêÛažË_®¿¾xy¹sÊ™D~½øé6[Ã__°LZ£g÷ðÀ2n­˜í.”–™VR†žíÅ»‹Ç G£îÕ”ä`8˹‚$·I¢"G Å3žÛ<ŠW™‘x Ï´µz©P¼åjõ{ÛTÈìg_i="WEf+` ¤ˆ&s
+›SXOôSbÙ¢È=Ár[v]b©3“ÃkOœæC]ݧ6#3‹š!¢_~ILËÌJaÂvÚæ¶^öe_·Í±¾¥
+Ž&ÛŒ¡ayy’cêú}ݬaÓhæ®ZÖ?3&*”jÁçŽÍÂë;™Cï¶n|·SɘŽ,
+‘S%sc3-lp›²Û$ØœúŒ¬ù=Å )Oô MKÀ ­èÈ$Ö–9¸Å(‘aéé¬E&0 Q`ܳ¸Ü?Üõíz_Þmê%„iÀ ¸raŠ©J×US(V­™ßºÝµ;z"ƒj’ZííÑs«VàÙØ4ÿ~S5 ' ˊܘ±e$¸ƒÀes>æ—ðN¦/÷°Ïg#ÿ†ƒA­Ø¾¯·[j9a‹ù¶-W·º!7¾Nª¬¬˜žMšLÛ±äZGÇéõv-ýûÓ¤ÉwÇ÷AÕî bf8:˲¡Æ]µïêΓ—·=úiפ¿ßY<Ž“sQûE»rw·M9_­³¼`ÁiMâöDð_„“Î-ødÃ{
+â!0Y Œ'—E¦Œ Æ_ýæö®`—X;7™PŠ{Ú¾=ZbUÝ–‡m?¨æóÄ‚`Ýà9¤”S ý-& `߬à äŒEÙ¸‡ñ†]ǧÐÿpçIveúzN·.îbë“Ñ«ÙêæOðçóOSAÂïe²çŸ™f¯Û¾:Ã;\¾¯z¯ð¨®ÚÕ‹e»m½I•t€MRS)£öt#2Xš#š€uQ@X†£ò(˜S“‘
+ù]UÛÿk09¦€
+^¸î7Ô"dTQi†ÅEÊ 7=¾Š<"™{3æV Š¾Äx)ìbÝ”ýa€óR†H£Ôí”ýÎe@oIݦôù©ª%=÷.eî}•›p0 t"‡ÿ¦¥áûò:zßqG¾ìC½òo„ÉÑ"4Òº¹Ã¶›)¿Þ!ôÓÆõ|y‰ûÈB?!
+̘"쉽C‚¶í2¾ æ·ížéö˜mjà `Йå£$óxcj€:Ю»D4E&u°üϪ~ù.v Ih."@uæ® 5å*ŸšÊÍùVvS¹…CSQ÷HÞ@w8rÓD¼*”$6ÅׂeJDزHÉ‹ƒ·QÑÕR–˜6¼º&?ñÔ`;œþ¦õŒÞb}–P¦ÃŽ&gv*¡sJ•™*DØ$ÁSÀá ?ÄØÚ¶í{j%ªBe:çúD¥ï«‡tæ\° H´{šüNN…Þât‰Òm©ÂKÝC‡æ²ª÷)×*0g †|_v4ùªBY6Îḵª†Z䪠ñÅÕë¿YH®ùô¾9Ôc¢»ÂYÅÄ·’wAp‚‘ˆ‰!AWÇ…†\)9:ggä¤À•¼ˆrò†à5.>N‹ ûæþ‡˜˜,th€¯àú ”åÅo/ÊÄ^@«p
+‰yi·Ü×7”$Ô
+
+Aîê4¶_Ϩñv4ùbLŠ3NfÅÅßUËáÈç™ÈÔñf8ÀÆe>ÙÍ Ø‰TÙÄél£ºA’犧ʹóÏ; 2—.ž> ž†p Šµ‚\Qh…ÿ®ÞÕÛrï_o‰"ö´·)G¦áü*Ο^±£zdÕÎóâô[XB:®Ž‘Ë/K ÌqyØ{kß(ùQ¢id_í
+|:ŽOˆ"±æ—>…’VOÄÃÄ^„Wë‹Í*u6m¦lŒ
+<ÊáfˆÂƒÌ0²hWì\íQŽÆðYùÄËÞPdí²ÆHIh˜6X_JTL>…5¦@Áu4â0þiáÅáG}@ÅÖ¦^nˆH¨sØ<쪲ñÓ‡IoÂòÊ¡£åÖ£ ô5B‡±€ÐUð…±€ŒPÉ1Ò¤¨Š@
+Ò¦QØ_?¹"δx’¬Û•±¡\öXìæyôìSma´TT~ZŒP6ÿ˜i@z«áÁÈh†=–ôGv
+•ÞSÀ?„ —4ØÄnÀT…6OЭåÁ
+ˬ•£{NÅìüª÷Ìvàö~ ©
+RM½Z¸8÷䶅i,ç„‚ýeÌéÖ e,çSIÁXB%nµTF¬±æÉô_¹b\(Ë}V
+ì´Ü ÎŸS!¬ß\
+!eØG¼Ô†—·õûäÕñÏB¨„˜!•3\’I “0¼Å— ÌIæú)ŸÐ¼ø7éhqÆÅxÊÓË
+Î 3Ãʘñä3Ç뤮TÒcP˜"%ùrUÚŸYôßõgÌ
+žðg°
+y¢,~O
+_ò†<¨u=-uÜøwÔb¯áj|‰çÁ Ò]¤›ÒW|€G`Ú¤ @øìè³…3ÅÇNTÌÝΈP—dÖÉcò]M¸xò ×kGþéöá(Ñ­4ñ Œþè½øœ“üŒn|~6ÚÀI’5>ó”ôiJWëŸ^8>ô!^7õÎ]àžû¨#ÞlŒÝºÿ§ÓÞ¥>¦a 5.l4K÷ Jà?ñé·ÝðùÅä` ø¾‰ áë“ç©
+z\ŽT0©ßerÚeê«r©3ü<q­Â¢(ÿç/·ñú#Î|ŒRüäK†Máι8Ù9g™¹Hlý¿Ñ7ëendstream
endobj
-1039 0 obj <<
+1324 0 obj <<
/Type /Page
-/Contents 1040 0 R
-/Resources 1038 0 R
+/Contents 1325 0 R
+/Resources 1323 0 R
/MediaBox [0 0 595.2756 841.8898]
-/Parent 1011 0 R
-/Annots [ 1042 0 R ]
+/Parent 1328 0 R
+/Annots [ 1327 0 R ]
>> endobj
-1042 0 obj <<
+1327 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [120.1376 318.9001 176.3563 328.1154]
+/Rect [91.7912 473.8206 148.0099 483.036]
/Subtype /Link
/A << /S /GoTo /D (controls_statement_definition_and_usage) >>
>> endobj
-1041 0 obj <<
-/D [1039 0 R /XYZ 85.0394 794.5015 null]
+1326 0 obj <<
+/D [1324 0 R /XYZ 56.6929 794.5015 null]
>> endobj
-1038 0 obj <<
-/Font << /F37 802 0 R /F22 737 0 R /F21 714 0 R /F48 953 0 R /F41 939 0 R /F55 1037 0 R >>
+1323 0 obj <<
+/Font << /F37 1018 0 R /F48 1228 0 R /F55 1311 0 R /F22 953 0 R /F21 930 0 R /F53 1303 0 R /F41 1208 0 R >>
/ProcSet [ /PDF /Text ]
>> endobj
-1046 0 obj <<
-/Length 1675
+1332 0 obj <<
+/Length 1516
/Filter /FlateDecode
>>
stream
-xÚÝXmoÛ6þî_!û`ÃQ$×Oi¦îдKœlmW Š¤ØBõâYr³`èßQ$eÙ–Û  ¶að‰Òñîx÷ÜsgÃx<D¡¢Ê*@îÅÅ{sxw6"VÆwB~_êÙltôœ O!ÒЛÝötI„¥$Þ,y?fˆ¡ hÀãóãW§Ÿr<¾<½˜p>¾†K»~ýæôâx"‚ñlúúürâ ¬‚ñÉ‹ã73'ñu'¯ÏŸOÏ®6z&f/G§³îý“Ìô~½ÿ€½ür„S’{w°Àˆ(E½bp†xÀ˜{’.G?u
-{oÛ­ƒ‘#QÒÐQÚ $ˆ+Å=Á
-emèŽÍÉê¨X橹/²2+¢Ü,âªüc:_¯¢&«JóP?qÒYm®‘½ÞVy^ÝÕ?èÐ=HÏìùT!)ekùcz?ñCŒÇ«2‰ëVêž•ó AŠs“å(ŸW«¬YFðÉ¢ˆb¿Hø“§íì¤i+]§ñ*m¬hÌ.îo(/§g×ëv]F'ÏŠ6¿½|Ö¼ý9˜¿-¯ñôŒ,Þ]Íßê~zv:O¨Òï~´êým—Œ‘Ï;¦£ÕR‡ª>|³9Io£uÞøuºú”®Œ4¡aø‘Á3¹m°hЋݠ¤çã\*„jef —F“Úïmnoíµ¬›(ÏÓ¤Kõ~r ÆHaÀ<n5¥M|¤½C€ Û$C¡Ðqkð®ZçΈ†‘¹m©cQDe2„-ŸHÀ¾ 9Ü ¤5 ûΊÊ>… %Dh k- Ó¼Š’O}»Á*í¾¦—×õQ¦qcîa—E³\V++ 837p
-»?Zשݽ°7eTØ;¾òÕ„Èqë«š$&KZç—v·¥Û7’W1Ôø
-Ç,-zÌööÒžwQÕÍS³þl.P;õ–ܦ¢Œ˜­¬Aó)-“i]D¹."‡p˦YaÉbǸ¦¸û!s!^ •ò§”ôá¼Ó”¨ £Jz”H²à!m‰"¥™d°)ùF¿¯²í8[ÎQ©#2ÜXvÄ¿6W\æÈòå(äDlõE‡A%Z@m}Ë\BTÀÞ&*¾æ¡yZ˜¢B:á¥î|ÆÂ]–ëÔ¨PãòSZf’üÞ¼‹My@¢ŒD4”"p†„aß™C¤óƒàÛ]›C:û­…ûj uÏ°²ÈÒFóº2ñb,D%b»$Y½Ì#í1¡–
-sÍqÉÁ *$—’ÚøçMº*a†ù”Bî!ÐrLÈ ûÁveG5“¹*5Ü75µ@‡Öîó£4?Üå¹ .øÔ–úzib šˆB¥ú`.(eMÛÅRK<–ÊÊ,ª$»½°&Uå {H C'5]G]кCS 0AL€ŸqD»IžN|&`úÎæe4ˆ6M±R1„r’®š(kãMÆWçÓ_Ì]m÷Âv}žÛq‚¸N©E]§Ô¯+³£‰>º·Ë4Ît
-‚°'Œ<Á³Ó‹W‡!ÜSùhÞssÂ}? á8OSvÔ0ý#kcìÑNúÿÆô %ÿ
-Æ(E\Äalz>; ±žÆGƒØž—Ãë»ù@ìÑNú_„cABÉ`VÛß(÷¾UÂ?U$¯)ü×ÁB ~ÒÄÞWQûШ›ïÊЙ”(Hæ#FaªAZ—F¡{ŸwÝ—V+Õsý/• gÀendstream
+xÚÝX[oÔF~ß_á‡>ìJx2÷KyJQ€ (YªJUÆv²^;];„¨ê½¶×¢ªBû°ž™3gÎùæ;›D~$Òafx¤ G¥ÛŽ.aíÙ‚™¸Š‡R¿¬GO™Š 2’Êh}1Ð¥ÖšDëìÝòÉóã×ë“7«˜
+¼dh ‰—gÇ/OüÌ9, ±ü­“xòêìéé³·oŽWŠ/ק¯ÎV±Â†Ãίï}õúd¿ï|õ~ýbq²î½zJ0³.üµx÷G8üb3ZD70ÀˆC£í‚ †g¬›)ç‹_{…ƒU·u9Á4šªè(@G0<s)ad”9èÖ›¢ñžý1-óG~P\„ÿªi“²Ì3?LëñÑSNFz12¼ÅNãQÞ¦G»*KQZW^~d‡fHjIƒx8ð¦¾.»Cʲ¾ñí&÷i½Ý&UöóÌñ1Ñൖž2Œj§÷§ ª¢¥d8Øš¸Š%ÆË]^ÖI6ci6ÅÊíkk0I 0©ªò´õƒn’P…0üˆ^Õ» `óàEØŸ\7yؽ U² OM¾û”ïÆÊw+¢—ÎV š&þ–¬Î/í®«É!e&¥õ€ˆ AFê<Û&馨â7¹?Îv+½¼®ª¢º «E»ñOµ½®~PiÝƺ ¼µù6¯ÚfîöÀjÖÊ8Üv·Õ^ÌßÎJ®¦Xm;[/´‡Ü
+S†Œ¼‘p`”Wéþ›ºiûñ?þïc~ÛŒä,Iþ„ÙNì±;$V)FºC|òkMÜó—oãªõÿ›¤#}2@ª°ä†pôÅõÝ\$jŒ(¥dÈðI†b„#© ú$‘ˆ(Lï“£(2Zëù ÷ã¡J—~FÆ1" QÚKY­‡¨uqìÝ@sJ’‚èq4¾éYi”£¸×6<Xh
+*^Ï%ÑqÙæ»*i‹O9Ü!ÊG îŸSÅLjy;mvëÂÔçÃ9² Ä(ãšÛ'3&*(ˆ¸¿i‡€ø<ÄúõUH3@ØÜ(Òi>¤Ä5!lÊ&—yB
+ªêpà¶ÎŠ‹Û™Ó4dZCÅ}`—Qí^4iûÒŽzÐz„¡ÐrLS !f‚¥Ûf2ºŠ¡Á€F¬¸¬’Y²ÙË¡³!Ü7ƒù®M
+‡7Y¾=;ýÝ?5a? h_{a>´¤«žV´«žv¹ö;Úäc·z•§…0õã$m‹ºjy¹¤ñ³YÞ¤»âƒoœ RW“ÓFeÓªÿPæh®(¯7ynjà€ŠºÕ¾8\7}9žÏˆXÊû8þhsÚL†®’aÞ»kÀдžÈþJ@ÎDHsŸzÂ\{,&åÛvu† `»Ó¿ƒ®ðØ혔´Þ©˜+(† ÚwÔ#)A„q
+a¨‘ÒÚ·Ôç§Ïž¿}=ŠbHYÊ×På÷™Ù«œ1sx“ÜᶙùÄÆ@3é³÷ÔÇ}"
+e-›ËÄAFàê2B—uöMíÄ”, Hšü€rÜæRðD’†VÐ6îß³~ ô^„¾Âa Íã²ã0¼P¿¼›Ä^%yPt~‰ÄC;ïMâ´Ì»„Ù×ÓŽ‚ùç¢ýËÌÕœeÐbpÃù×h&8Âá» °ìôl}7ÉŒdVΓl`åÁ±óôÿÂ1b(ŠHÀšF5þtuð ÞY‘2öµA!4gs_ºpÔ½o÷wµýçFè ™Ötž à ¼0DЕ‚.ÏÂî±û׉ ŒÿAáôendstream
endobj
-1045 0 obj <<
+1331 0 obj <<
/Type /Page
-/Contents 1046 0 R
-/Resources 1044 0 R
+/Contents 1332 0 R
+/Resources 1330 0 R
/MediaBox [0 0 595.2756 841.8898]
-/Parent 1011 0 R
+/Parent 1328 0 R
>> endobj
-1047 0 obj <<
-/D [1045 0 R /XYZ 56.6929 794.5015 null]
+1333 0 obj <<
+/D [1331 0 R /XYZ 85.0394 794.5015 null]
>> endobj
126 0 obj <<
-/D [1045 0 R /XYZ 56.6929 424.8255 null]
+/D [1331 0 R /XYZ 85.0394 556.3324 null]
>> endobj
-1048 0 obj <<
-/D [1045 0 R /XYZ 56.6929 397.5211 null]
+1334 0 obj <<
+/D [1331 0 R /XYZ 85.0394 529.0279 null]
>> endobj
-1049 0 obj <<
-/D [1045 0 R /XYZ 56.6929 368.0037 null]
+1335 0 obj <<
+/D [1331 0 R /XYZ 85.0394 499.5106 null]
>> endobj
-1050 0 obj <<
-/D [1045 0 R /XYZ 56.6929 356.0485 null]
+1336 0 obj <<
+/D [1331 0 R /XYZ 85.0394 487.5554 null]
>> endobj
-1044 0 obj <<
-/Font << /F37 802 0 R /F22 737 0 R /F41 939 0 R /F48 953 0 R /F21 714 0 R >>
+1330 0 obj <<
+/Font << /F37 1018 0 R /F22 953 0 R /F41 1208 0 R /F48 1228 0 R /F21 930 0 R >>
/ProcSet [ /PDF /Text ]
>> endobj
-1054 0 obj <<
-/Length 2369
+1339 0 obj <<
+/Length 69
/Filter /FlateDecode
>>
stream
-xÚ¥XKsã6¾ûWè¶TÕÁ‹
-D%턱 -¸îBYt.xj(´:þÆ©ò|"¥u# Lüá£èªW~ãž~ÁÂa¤kƦ=Ÿâò¤ñTtÞôÀ¢)sðjA/á]ÞÁmrèIújº}:£“Šûþ<‰Ž¼bÆî,µý–Îa„–½"–NÕH8 QÕCyjŽ“
-Wþóæ×ßù¦ýü|Ùʳtó>8Fh¹9Üh!Yž§:Œ´7·7ÿ‰Â2ÅŒOÖyÑ>¼<v,Yí‚t;¥9ÜL-,/»ßäˆ/¼YSRÓ›ý0Óqj´Ë4g),ð:þe»3"¹ƒÿ2y{©à©ˆ¦ ¦&ܽÒÍŸÁ¸ÎsE‹f´»ë¤7ðÝûƒÜ¼éáF›Ù¥ãÝœ³»”‘ дŒ[ d€5)÷¹:A–¹X?-·ÒV¦df“¯[àÞ;,(‹Îo€MÔ}=ca§° C£_ÒrœVN÷+Ò«QsP3
-ŸRéÄëÂ-|ÔøAWv8qùššéW5#ý¶}Q9Í
-¤B$·ø@÷OM÷°¦)y/—±Ðññ–
-­a­ ƒE9×ܪ``M¾6ãÿP}@’ ±ŒÐ.ˆ`•\?ô³â.ëîðÐ(yâ><¨b,ó)@+Ã6õáÕ5«þ ±Ÿg1»þ¦?¦,µS%ºêà‚e&ÕóÁ@D1f3¯kXJZ¾qÀÔ2B‹5xy-
-@ ¿Ž† ci:†/†a|n þy›Ö³ÐçÙ­Ý ÜìÔ|õ—9¨ßCðË0åº;E9­š‡[˜Ô€»ˆ%ÁÕë¿Žà“wëx- ½³’À±:AÕ¡†—2ô@eì‚Æ0öG>u! b jŸÉ°øœÒ‹].õ eŠí¼ª¦azцB­‰ý­4«)1™"—Û͆Ñ÷¹*š¤ÈhB+ÎL½MX<»‹ñwÁ¨--\—̆=3?†>¶jܹ㠕”$Šw:¸÷$ Ñ:@y¬»‹i<üä
->H±”ôu€;ŠON«@bî„×yæ­ƒ˜åà`~Ƥ`ë'š‹7Ià‹iŒ»ŽöyzÞñX‡4
-†}Ó(OënˆÝ"½ì'BMmMˆ©ìn-àaï8E¡s“x
+xÚ3T0
endobj
-1053 0 obj <<
+1338 0 obj <<
/Type /Page
-/Contents 1054 0 R
-/Resources 1052 0 R
+/Contents 1339 0 R
+/Resources 1337 0 R
/MediaBox [0 0 595.2756 841.8898]
-/Parent 1068 0 R
-/Annots [ 1058 0 R 1059 0 R ]
+/Parent 1328 0 R
>> endobj
-1051 0 obj <<
+1340 0 obj <<
+/D [1338 0 R /XYZ 56.6929 794.5015 null]
+>> endobj
+1337 0 obj <<
+/ProcSet [ /PDF ]
+>> endobj
+1344 0 obj <<
+/Length 2407
+/Filter /FlateDecode
+>>
+stream
+xÚ¥YKÛ8¾÷¯ðme RÄ·¸{ÚÍ ™:Øtïa03Z’»…±%Ç’“éüú­b‘²d«Ó ÄY,Ö‹U_±Ù*‡lU¨,V®Œ•™Ê™Z•û›|õ
+ «©E¦
+nVé”Éîo^¿çlÅóLk®V÷Ûñ,mT¦ )V÷կɛGwêã:å*Oäú÷ûŸh›ÌLanËá›å’I¿áßÕW×–uE;ÞÞÞÑà}í†Ó±îGLfBj8h“å $C2cë”åyžÜvC³}
+[øÊfVsv‘I%éLŠ:¹ýtÿñý/4nzü5‰£Ï}]>º¶é÷ô9<º!¬ïvÝ·>¹Þ+‹ã¾>~­aa舸%‰‹º‰´;÷µ¾Úf’nK“xôC}ÁË¡b¨
+c™UŠ{U¾wmý äB%•\´¹J>¶4u\³"©ûC×ö5Í 7üu£eÏfb\g‚™AÞÁ:×æ”,ÓR˜@¶õ‡tûÈ×ÿDËà˜T\™¼Â‰-VÈ8üÖìv4*ëò¹°}¥÷nÀQ3­ÑzMô¢‘Rb5H0ó’Ò¹]h5¡×ñw\*OG2Z;ÐÄ™?|¸¶z6né<gÚfhÜø¸Ë“†£kû-Ù!‹®ä,c… ¨|ßatä&Ùw$}5í¶;îÝàeÀ ·éN 1ܨ@g.ÍKn69ÌÙ+béMoTu_›ÃY
+W6©BpÂ
+¢I[ÃäÚ91Àáh‰(ü3Ò§Ó ×6¹æ;sªœc®D*°Z̺rM yIˆ N(‚ϱEr¿þPé´1ò/¤P#sÈ”B‡®ìv¤™ÏKàÂþP—ÍoyΡBúÌ&´«z^šŸ>¿Cf­Î.Í2Fã™Ö Ê_n~ý=_U`ŸŸnòLØB­¾ÁGž¾Úß ­µJÆ™ÝÍÝÍGŽÂ
+‘éœéçyѾx…!íP¬Ò(]*8à1÷Ȩìve1¿Àª°6“¹¥;{;±±ÒÒ# –gJðèŠOëT³äþçÉ»KË
+SDôçÃÃ@x´»'¡w˜+ "1f¼ù¤È,Üì£ù™0Ž–ïé3€>5áwâ„K¤`Á.ä›&‘¿——0*«í* {ÿvÖœ¦º3±ž¶X“N'ÒqåZ±ÐïðÐï¼}W6%eüÿ*Ÿ/7?ã&mã&?ö%~ýìëá±C
+ƒ·¡Å/øx#}o›žž‹$ͳ"·± z_?ǘ«ŒÉoˆazèvM¹„0Ò(SØ@]î|›‹=Ój(íjØåQï5k€cy!£~ý€rP• Œâv^RöÐ÷]8ƒ
+×j ¤‡
+΄£Màõ¿|ŒÜHÖôA-08×I@t98ÔÌÁˆÏùMã혽B†·Ã³å `æp„²Þ"°q—o—^ÇãsÇM´^„ |UÀ1øXžÆÛŒØ<âr“ü–«üû¦GŒ—¼{÷Ö-m»ðhŽ|€Jä¹ùç_4’ÏŸï>~xEë·°•z…)AÃK,¹pÝ׶½ÿ¬&TdÍ9³à¤Õ‚w:|d…êäÛ£dZK&œÈªVŸ±*Œ£_KSÐ=5m8#<ÌÁ,–JÍ#D±”îI—€-`ñcóÝÓ|Ä—×Ç:—üK³›”Œ üs
+ý1àÖº@TÿyÀp.ª…aGØ…~æII¨L>óznvFš¥Â¦ˆBE D¨3SÏ>º^÷µµ^endstream
+endobj
+1343 0 obj <<
+/Type /Page
+/Contents 1344 0 R
+/Resources 1342 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 1328 0 R
+/Annots [ 1348 0 R 1349 0 R 1357 0 R ]
+>> endobj
+1341 0 obj <<
/Type /XObject
/Subtype /Form
/FormType 1
/PTEX.FileName (/usr/local/share/db2latex/xsl/figures/note.pdf)
/PTEX.PageNumber 1
-/PTEX.InfoDict 1069 0 R
+/PTEX.InfoDict 1358 0 R
/Matrix [1.00000000 0.00000000 0.00000000 1.00000000 0.00000000 0.00000000]
/BBox [0.00000000 0.00000000 27.00000000 27.00000000]
/Resources <<
/ProcSet [ /PDF ]
/ExtGState <<
-/R4 1070 0 R
+/R4 1359 0 R
>>>>
-/Length 1071 0 R
+/Length 1360 0 R
/Filter /FlateDecode
>>
stream
@@ -4193,12 +5045,12 @@ qª„Ñ«ò^ÿï>‹«>÷— .13×…Óƒ!¶3¢SËAÕ”ih¥Å¨Š^…(€<Îm䦽ªšÛÆlLÊâ³ò7Ù
n*Œ1½÷¨¾x¥Æˆpîâ‹&XîÃœ§³±è\íD¤ßä0}#XŒûž˜‹¸À>#^V°¡|2Îi‰9ÊÎr)`˜¢Xh¡Ò& „hb—H°Œe"Ãê
þrÓGçX5¾ûû8‡´ÕªOª«t–Ô³$Ây°‰—BÒ›ÀÄ5©/¨vp÷o`kA“ôr ±ñœÓ4N.4Žæ
endobj
-1069 0 obj
+1358 0 obj
<<
/Producer (AFPL Ghostscript 6.50)
>>
endobj
-1070 0 obj
+1359 0 obj
<<
/Type /ExtGState
/Name /R4
@@ -4208,679 +5060,1180 @@ endobj
/SA true
>>
endobj
-1071 0 obj
+1360 0 obj
1049
endobj
-1058 0 obj <<
+1348 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [470.3398 477.3512 539.579 489.4108]
+/Rect [470.3398 467.2776 539.579 479.3373]
/Subtype /Link
/A << /S /GoTo /D (boolean_options) >>
>> endobj
-1059 0 obj <<
+1349 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [316.7164 465.396 385.3363 477.4557]
+/Rect [316.7164 455.3224 385.3363 467.3821]
/Subtype /Link
/A << /S /GoTo /D (zone_transfers) >>
>> endobj
-1055 0 obj <<
-/D [1053 0 R /XYZ 85.0394 794.5015 null]
+1357 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [304.6433 163.6578 373.3153 175.7175]
+/Subtype /Link
+/A << /S /GoTo /D (dynamic_update_policies) >>
+>> endobj
+1345 0 obj <<
+/D [1343 0 R /XYZ 85.0394 794.5015 null]
>> endobj
130 0 obj <<
-/D [1053 0 R /XYZ 85.0394 769.5949 null]
+/D [1343 0 R /XYZ 85.0394 769.5949 null]
>> endobj
-1056 0 obj <<
-/D [1053 0 R /XYZ 85.0394 580.0302 null]
+1346 0 obj <<
+/D [1343 0 R /XYZ 85.0394 576.3463 null]
>> endobj
134 0 obj <<
-/D [1053 0 R /XYZ 85.0394 580.0302 null]
+/D [1343 0 R /XYZ 85.0394 576.3463 null]
>> endobj
-1057 0 obj <<
-/D [1053 0 R /XYZ 85.0394 539.9341 null]
+1347 0 obj <<
+/D [1343 0 R /XYZ 85.0394 533.5444 null]
>> endobj
138 0 obj <<
-/D [1053 0 R /XYZ 85.0394 315.9171 null]
+/D [1343 0 R /XYZ 85.0394 299.6823 null]
>> endobj
-1066 0 obj <<
-/D [1053 0 R /XYZ 85.0394 282.0038 null]
->> endobj
-142 0 obj <<
-/D [1053 0 R /XYZ 85.0394 146.7217 null]
->> endobj
-1067 0 obj <<
-/D [1053 0 R /XYZ 85.0394 117.3479 null]
+1356 0 obj <<
+/D [1343 0 R /XYZ 85.0394 263.0631 null]
>> endobj
-1052 0 obj <<
-/Font << /F21 714 0 R /F22 737 0 R /F62 1062 0 R /F63 1065 0 R /F41 939 0 R >>
-/XObject << /Im2 1051 0 R >>
+1342 0 obj <<
+/Font << /F21 930 0 R /F22 953 0 R /F62 1352 0 R /F63 1355 0 R /F48 1228 0 R /F41 1208 0 R >>
+/XObject << /Im2 1341 0 R >>
/ProcSet [ /PDF /Text ]
>> endobj
-1076 0 obj <<
-/Length 3492
-/Filter /FlateDecode
->>
-stream
-xÚ¥Év¤Fò®¯ÐÍè½.H’„™“Ü’ÆígË=’fy^(n
-Ê@©ºúë'¶d©Böa^È%2222ö,ÿÒƒŸ©#7J‚äÒ$¡«=__fÛ ïòæþqá ÌÊ­¦Pß>]¼¿Sæ2q“(ˆ.ŸÖ\±ëűù”ÿâ„®r¯
-Öë›_ù¾ï\߸½á©›{Áqw{{=ýëáöñê·§ï/nŸ†CMî{
-OôÇÅ/¿y—9œÿû ÏUI¬/Ðñ\?I‚ËíE¨•«C¥ìHuñxñÏád––.2Ò÷Ü@EÁ'ƒ`‰“:q#(âäÓ¦€cEÆéŠöµh¹}(«Š[iÕ5Üj²,íʦN«ê(PmÙËbäë¯Aæûí¿Ì_œé-þ¬Ùzu_Ô}'¸×'Àû]žöEίMMÃ±Ó -¥]HSpÀˆ•ï»‰ÖêWÏ ª.3TŽX"x8ö[7=7rFSÛm‘—°).ñtÝ;`®H³Àët[fÜa"ßyó\dé¾dý&• ;Êá³lntUs¨MQs+]:M•¶W~ì¼ ‚ ±ü€¾#» ³&àâ=ðƒbì2ë®/Ò(T(Ìb/mŽ//ªôhñ=í&ü¥K€¯¯ù»-ë}_t„UÀÀ©Êú…çÒ</{šù¹X‹™ìŽ©`´ðM?]ÆÙUiVéʹٷ‚4¶„›ðØÙÑ™›¬è˜àr›Ö] ,`
-4•Îæþ^h¦ƒ+ 5»à´Îú‰kŒŠ„ÏŸÊMÐÒ0Ðß[¾röuβë; ,/ë´=²ˆe% eûmקuF7‡Ò§´ò+ J‚Ah™?Û敤b"²¾p•ƒ¯c¢gVçe<&§5ɨ§Åpè7hO0´]ºfm„vùRóIŠÜD)v/Ñ´æ?LN Aƒàæ †X¬µNÝŠ²D¤åpå­ô®Ûìû¼9ÂF&³6í6$]@NÏsV’"Á "{ä‘íüÞì[”ê°ò
-x ®Îšv×´i_ØžŠÉ‚=
-‚‰Á€aòOzjþ¶ãqgv)0 rº©E`| ËŽylÃú §Î†áNdñäØJ|Œ¾ìSàN_0:…r´ #è`SbHY5ζ¡kN¬¼fl ¡?ñlà‡ †ð熇ûMÃ"š¦f§iœ³ GéGLƒWáùlõ”'Õ€0¶{Ùháˆ1·b<JРiÐæëäbr‹ÓegUÉꎀ³bN ìL{ƒ©£<µÜ]ùÖt·u.»u}³[0âaà*å%ÖÒ³m¸^˜¹¨~ijÄÆ96{nlÒW$/
-#[ö ñô¡c§S†¹!-®÷$¾¨,醴 kÖÍèÝvðºù~‡xˆ±Õ´Ÿÿ¶?ÖÎMÙ¥ÏÕâ=”
-•sÜAÂp«:Ä fçáz–Àº§
-ÙX-¨×56ð„Ž¾U*tvE‹ÀvCq–Ãë=…**´F¦&¦ÆÑH^‹‘”‰ Å—ˆKDÄè@0,VÖ‚“Œ NíHÎÝ¥
-c×x¡0Ê/œ=­Öm³]å€:@T û‚CHP´ ËNÔ*ŒÜ0ð‚9OºbÈ%‰g±+D:LÇÅÝ|ã&`Cçñ*äòq¨ƒEÆÊ–Õa¬­u2ƺV`nfYÔF†•Ð
-¡û¾ØîzîPhˆE8Ò€ÅÆ¡7Ù¡ìy¶”~ñeW•Y‰…1êç–æ ±î‰$Ç·ÍÛyÇL—°és³ï¹ÉøXÌÄڼ㙮(¸Á²€°E—µånÄCN *°õ^œØ›i±Â×õ+’”ó+ÒÚÕ:±W”U’_þå.ÚÀåy6º”*Ê9zå¹¾¯­´v=Ø 9c"p> /Q˜œÆF¡ÄFp'ýXeÿ“p'f·Uô"K`%0]Ãï¨#tq˜×âðkY¨Âr%‡Çºò¹„=‡,G _”]¨Alt;ª()Úà,XÁ‰­²–
-ƒŠâKå;ÃŒ±5‘¦âȈ–Êwß±M\0^G‘’Ú¹PÂ]å°ý ¹VüþN%NEèÀ&3–±
-ý0#ä#›|7ótR °©ùŸ–y~"oÖ%·D™ÒÏsìl`¢³R†£D¡¨»ü„@Gð][*Œ’0Ùˆƒ0Šh0BÈ…|%±B„mž¼êÄÆÀÌPL[zí€õXšq)ÉOUò vËš›,ߟpIJ»ŠŒžÞ8Ζ²²k¶2’ÏF±àFÌ°¡rp¿¡ø7“/•¬š93Å
-Þ@"ìmOì.… GE‹´¨d¤Oâ)¨ŠôsÇM2Æ Äß-•I±#@è×_Ë”;„$²ÃÒ PU´ ‰âKŠ¥ly7„VyDN%5luéëëñ­ûç•fŸ³\N¨
- ¹VEè´­@c~Bž92|Mµ?ã*5á?Ìo ˆ`ðV•q¾k¨­6@ŽK2Ù£‚€•Àª4ÏÅZu§Ñ ƒG¬&¶{“¬/´%9¶òȽA©c«¥°
-5\$û¡è¿¡,
-Ÿ»@Eº:«µÚ[(ü*WùÆöâjÜŒý):í­ôˆÏg’7©=› ΰ3yYD ®äÒzbµ‰W’ä%dÿ¸
-›è$ŒNÓžá2Í ›Ü‘§r3<±ŠÊàˆS6±Ÿæ%6ÃŽøã'©Amu›l©Á߉S1˜?m1ˆOÛò«ÝL²xÚ›æ´ýé(íâ_kªZÞ ›ÿ÷?xÆÿ9…ÆUq,—Ç»a H„(丞QnÿêsNúÿ
+1365 0 obj <<
+/Length 3579
+/Filter /FlateDecode
+>>
+stream
+xÚ¥ZIw㸾ûWèú½‡.ÉÉÓmg:/ñLlgy³ ’²8M‘.V{~}ªP”ÙÓ‡<ˆµ
+6ÏÐ÷׫Çlí ­;êÛ§«oîd²Éü,ñæiïÐJý MÃÍSñ“ùÒ¿
+÷ñþýÃí?n“È»ùûõV¨Àûñûû[*==ÜÜ?ÞÝ><Rõç@ÿ{÷
+ì´ †wÐn Ð—ÝKÙQù|(›‹n\¼ëª®C/§úÄœ¡?®BñTë!²”¥0“Kíþb™ ¼`ÍpÚÅɾömw4lj2:¨>ʦ IA3‘†Bùy(›¾jÒ(t4$MSIŒªŠdý_›zED ÊIdÔdZ
+ÞÔ¡k.7-÷î˜hYT¤dP>êf4ûF˜ò'&~&EjvM›Œ“Yý |®Œ‘BI×}K¥6Ï5ÊUGuÕÀ“1"*Æã ¿„œØ3Xúy{<Õå0ÕЇ¡gÚû‹Á¤ÏUXNqJB‡–ÊN4]+š9p$•5àLxöK<ƒBA¤±ëª\Á¢ætYèéý`Ø}¥Î<~¨Ð&ß°ÜÏõØ3±á y3
+îlgÛR¡¯Û3"s‡’^ƒ’š`í ˆIo¡dÎß™]PÙ“®ÿ6'É›=~lú¡ÔìXȈ™-R…¶¤W”µ~µôŒe›Eèk„
+ÒÝÐ#XXDË+Ó”Ç~ÐMn$‡Ú§´úË ÊĤ´ÄŸ#`\±TÙ¹ƒÆAâpìÌÚ<¯@ø…íº!$¤§pè…ZX ëõž¬ò¹±ÎüÆ3ç?´¡ †Šx†3h"µV|8uÇÆ+‘w\£qýaŠöÌ[îÌ;ÝŒvÁv곚3mPÙWêaq ¨Là/8ÐÁÝ5àŸNmGÜ4PE*+vcc"ôÌŸÙ” Âðƒ¥¶ýD%cL<‰‘ÍŒä¶Z÷<e&Žò\õïçÈÍ]ŒÙ;Ö\' jÖÇ6pgj¬R`¢Ö5ÎKëÝ—¯á„uuI³_­­·»p£}u¬:Må¬W`â8A%§0JÊ…ÛS;è3»a¯Ða“Tl?Ð:;eÁ¡’ôìÏ]ç¡L4Æ“cKëç…÷<jàÎP9‰z´¢#è`µaHf#Þ,ñŽ­sfõ5'€Ì܆͡9ô€?O¨y8´„n  •¶!§™xoœµ?sÂêb.âùböÙOƦ
+ˆG—2È,Ò6ü  ]ØÞG<Kšx¯íH…ƒ~Áí¥ìA¡åH4uåÛ­iôÌ…t
+±Ìd'b|çJæìÛÙ»ÃØÉëã¤é=b©í>ý°?UÞ‡ª×»zΦ
+j=§’úq’IÇ¥kn5 . '·JíË4¶°AmÞò\y0SS•:5×R*ô5ãOÀ!O ´ .–d¬‡Ò, üÔïÖ ¡¢ ¥hÆcD<Ž#Ô”-r–QjÎð
+´Úl8 <ëfXžŒ (Ñq–zxûȦÐOžüö^þ‡9žï Ä'“’G³¡ÄÝ?õ‘³ŽÞj¶š %&êÀ*½ñâ Wð]Gjä]$’cä„D"é€ FoŸH¬a™ú™®¼Àè™2i+ê‚ó1/=Ó’ Ü|ꊞW°Òâ“I¿| À)%í6N”+qì­xfß¹¥(wF$Œà ÃpbrÁÃÁÄ'¸M¾
+Gg\ªà 8"À`xbílgC‹›d¬.â)h¨Ký©§¢cDߣɑb ÃЯ¿Tš*%„$¼Âî`ªˆ ™qÄgylþ;
endobj
-1075 0 obj <<
+1364 0 obj <<
/Type /Page
-/Contents 1076 0 R
-/Resources 1074 0 R
+/Contents 1365 0 R
+/Resources 1363 0 R
/MediaBox [0 0 595.2756 841.8898]
-/Parent 1068 0 R
-/Annots [ 1079 0 R 1080 0 R ]
+/Parent 1328 0 R
+/Annots [ 1369 0 R 1370 0 R ]
>> endobj
-1079 0 obj <<
+1369 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [464.1993 469.2511 511.2325 481.3107]
+/Rect [464.1993 393.2115 511.2325 405.2711]
/Subtype /Link
/A << /S /GoTo /D (proposed_standards) >>
>> endobj
-1080 0 obj <<
+1370 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [55.6967 458.3121 105.4 469.3555]
+/Rect [55.6967 382.2725 105.4 393.3159]
/Subtype /Link
/A << /S /GoTo /D (proposed_standards) >>
>> endobj
-1077 0 obj <<
-/D [1075 0 R /XYZ 56.6929 794.5015 null]
+1366 0 obj <<
+/D [1364 0 R /XYZ 56.6929 794.5015 null]
>> endobj
-146 0 obj <<
-/D [1075 0 R /XYZ 56.6929 535.4755 null]
+142 0 obj <<
+/D [1364 0 R /XYZ 56.6929 769.5949 null]
>> endobj
-1078 0 obj <<
-/D [1075 0 R /XYZ 56.6929 501.7295 null]
+1367 0 obj <<
+/D [1364 0 R /XYZ 56.6929 749.4437 null]
>> endobj
-150 0 obj <<
-/D [1075 0 R /XYZ 56.6929 345.0948 null]
+146 0 obj <<
+/D [1364 0 R /XYZ 56.6929 458.7525 null]
>> endobj
-1081 0 obj <<
-/D [1075 0 R /XYZ 56.6929 309.1395 null]
+1368 0 obj <<
+/D [1364 0 R /XYZ 56.6929 425.4132 null]
>> endobj
-154 0 obj <<
-/D [1075 0 R /XYZ 56.6929 120.0167 null]
+150 0 obj <<
+/D [1364 0 R /XYZ 56.6929 270.5184 null]
>> endobj
-1082 0 obj <<
-/D [1075 0 R /XYZ 56.6929 92.4013 null]
+1371 0 obj <<
+/D [1364 0 R /XYZ 56.6929 234.9696 null]
>> endobj
-1074 0 obj <<
-/Font << /F37 802 0 R /F22 737 0 R /F41 939 0 R /F21 714 0 R /F55 1037 0 R /F48 953 0 R /F39 899 0 R >>
+1363 0 obj <<
+/Font << /F37 1018 0 R /F21 930 0 R /F22 953 0 R /F41 1208 0 R /F55 1311 0 R /F48 1228 0 R /F39 1151 0 R >>
/ProcSet [ /PDF /Text ]
>> endobj
-1086 0 obj <<
-/Length 3046
+1375 0 obj <<
+/Length 3172
/Filter /FlateDecode
>>
stream
-xÚå]“Û¶ñý~…Þ¢ËD>LžÜøÒ8»I|m3M2SJ¢-Ö:Ry'_;ýïÝÅ HQÒ]3}êxÎÅb±ß»”˜qø'fF3®òd–å Ó\èÙêîŠÏÞÃÚ¯„ƒYx E õ‡Û«Ï¿VÙ,gy*ÓÙí»—aÜ1»]ÿ<ÿê›ßßÞüx½šÏv½Ð)Ÿ¿xù—k!ÄüÅ›¯n^ÒÒË7oiðõÍ‹ë,™ßþùǘ&Ñöùo¿ÿîÕm¿ã×Ûo¯nn¥ñmWHæoW?ÿÊgk¸Ô·Wœ©ÜèÙ^8y.gwW‰VL'Jù™íÕÛ«ÂhÕnâŽV†i#³ öH9ųTIeÙÓìé2¿H™4÷][­KÒd[®ºª©é¥yGÏ‚uÙšý‡Ïè­ÛªÖ=Õ¶XnKÐx@7±»_n«C‚óˆN>[ˆŒåY"-…7‹»Ý¶„ƒTbæ¯j¿gp·T°4K4ìÅ-‡¢î€ %óyE3¯ê®Ü×Å–¦WÛª 0H>—%ÕñÊþZ˜yÙ6ÛR~Œ±mš¶«‹»Òá+êu¼¡W›¢~ïÞcð
-³…§z!˵¦ûªn€i6ß•ÍÎRc”>-ÿì Ô2MåüÖO¯š»]Q?ÒK±myŽÀ°
-ƒž#ð]qï
-Fâ²Vp4 b]‚E(î„Ópgàé¶j7n~Sµ¨ŒR;aÀ\ÏuØp¨BœnËŽ¦îwnïÁ!…•–¦pœAýñ»ö(lbòùŸêr„Ìá‡ÑÒ-5îHϤŸL`¼dùü®yUÓ1Nˆ5½úžVÚ]±*a W«æ¸¶60Ú;X¤‰ZœZz¨šV–Eë¼ L¢ ![¥eÝT«;#h†!µ³ÍÇGë¥&.klU8'ÖÛC‡´lÐܬ·&µCmª<ª¡·«ê‘²½|ý·‘j1d–z`kðæ$Œ/Æ‹¦—xÕÔ¿p.ßßÓå×4kõžïšýز&…ßÿÛ}¹¯J«œ&A§SîºÁJ@@ô¿÷ `ÊL¥©w¡mÕ•‚²=®Q,5©tàŸM`\$Z0®10‘€DÀ,按L¨¥%E –8Rpð´Âäç"ÉH‘KÃ@Ùb>È'a!Gq%2%IÀY¡ã,jP´šöŽE21z¨Ö I-€Š<öløÐâ éŽÈgãÈz¯²+=xç`QÇ (Ä]A¦ˆÓúËaÒßÃõc¬˜¯(9ÉkÇ ÈZt³!7Nœ–áöìq¹)Î3‘ÂÏ´Ò$L©sž¡âîªR$,•`%CrË9š>OçÎùu–Ñ„sø#bRHWÓ4{ò5S–©;MßOÀPè'_ÏbôÜX7ñÔ3¹™iìá͇¿4rŽðrwߺ«.KÇ%1£¹:•c—)]þ…ÏuÕ‚“lôF  ‚W °ÊÒ‡†f·áôòŽxçp`°ÇAŸJ—Ú(¦Üoµ½_Wõ{‡ßÆ
-8 {~ÙÐ1J5çŽÍ†C¤´I«”øbxvI8_<•Eq ÑGšÊÚóGÈm\¶é<•8‡DâÚW#N(/¸_a‚3µÊ;¡aJ²4É%M3.žåÈÁrà
-n‹ÍU1 ãPnlac$ðç~»¦ˆKµƒiï)ó¢í/k—ù4Eü]¹´ÓítÎw†…'Ð¥GzNl&E
-†‚/˜ÊM¹•’{K<8ãYi~‰¯BçÞ;ëvpCª<<æÖB—@ñ¶"²£¾R’JØK½þÉeœŠOpìôÍ…Ö,ƒÒÙ_…Ý}t~6‘à}µN†Zyþ)$I".ñÒ+à¼ÀlÍÒ$(1^“yÙ+8Nš¡G°uŠ•Z¯+4f´`ÌÐWÔS„qÅôlJ1n¤<{GÉOŸkRrelRtvC†„¤»
-gwåª"gÇ篢É#¹ã¤Íî)$@­•Q㡶u©U5psëUÈšÑ=£ÚüýÓO¼r%SÊ•Ìw „)òá°‡bDâ}yùrXu¾¢•öîÀÃT—åÚÆ%ÜV®Š{e
-KùzIÅ1"F²ølTnyb|Âkë8·æ©öiÀTï©›¦ÊÓà ÏAŸ)ÝhPxQuèªÅzxΰõp:ÄãÈüÄ·ÌgQ“m·‘"k2|yöÅ„ñâñ9ËD–Úã?µ43̱U)X–¨„Í›ëEÊ 3>§§×ÔAÞ?Õ[x¤ƒë¾ASJ»ºœFå#°³´s³$^ÙŒÅ̦ؾssî šnC.½UuÀè'BÚo}ý®tÚõi¼¸Î]Vd7–ë)´ùÏçj{+ž“ý„Æ7½ýऻSXÎùoH‰IÉÑc[gØÂÔ t †¸¨¥ƒ#W"ìÊýöZÌm—ÛfÞIß­·ú|‰ç§:HGÓŽÍÏòiØXq
-<‘šGPÖÁž0ÓQ ÏVÔ–ö‰Y娮w4OZÞ!ó7Êa07fTÜÔÅEßÇR®…®¶=DŽWé’½!Æ>w—¹oŸÁt_†¸üÏÎFaÁ³˜’Œ§pÒFËó}Y¬>„öé ¾NÝÔ—¼h{²½*!DÚŒ¯tQ¡]9&R§ÖvÔÐÓu*a´»¶Y@•°˜£rÍ–RÅlØÐÛ·(ˆ)B{ Ð[6á†c PÚŠçqâ3$L™PÛ÷Dþ“3“*ŸïDTüRFÊ1ßḴhŸ¤ðN5]êa-*Û4oGfYbÛï»òªñPþ¸-~øypÈ›-ë2† M˜î®»¬Õůnà¶U˜¢õù
-½ór>æ¿Ðƒ
-Ögµýg"Äpâ3Ô~ødÔÇÝ¡ŸéÕgèà(=êÛúâÔ‡@Ë2ìÙÏš1”ýnEAT&ÀШU "Š¹vž&ÙùSÔñ±£ÌÆI:<ö;ÈéÒ”6rŸpò¿õÈ'J¥™N¹º\æ«Ìè'”]É3k¸]:,óOHPæ’%ôY ÆP§% .Jð쩽Ž”ààØÿ¥/ô!ñ4Ϩ ŸÒf”ù°ÍxZT¢2M.2‚:#HuYçN9>vZñ±Oä‘¿~eyZv§y¥SfÐQžçUu†Wê2¯Îñj|ì4¯âcoú¶Ò¨|ôÿúÏ€Ãh@Yšæq>†Ê~š÷{ Œ§é0íù¦Ï’OòÿTÞö¤Ð"%‡c!$ž—QuFF게ÎÉh|ì´ŒâcÿC —,—yvA‚Ô z¨Ë<wj$Áñ±ÓŒ½le Ѧ.Ÿ$E-dxÙ“¤˜>;ªü—R„œ NÌyžOwrð‡ µü²„ú9Yõsà%XѸ¯®8Oi}曋6
-o!ô˜òðÃÎcÒÿ’
+xÚå]sãÆíÝ¿Bo¡3'v¿¹LŸ®9§¹Lr¹äÜ6Ó$3¥%Þ™=™TDÚ:ç×Xì’KŠ’ìfúÔуö°
+ú[5w—<Ùµ_®‹»rMeaäøÎr ¨£çìÅå„‘¼®Wé N¯÷üÂ4# X€d*yЖ„6E®fðé4ÓR ø8ñ|[„Õå®ØÐdÕì¶Í®èJj«®ô`ÝmÑ…'JZ+j$b":Wz±ì´ªº+w5b™Nê²Û7»4ÙWÝ-v—Ü&e[î@‚nåµ{¬D­e&yë
+–³/êÕ+ò¤¢´†Ë«MUö0Èþß”JLÇ;^›ÍæÁƒ
+ÀíÛ¦íð®x|N]Ã㽺-êéÈ…ì+p=RÙ4Y²-wáqŒJÀ'>·@ºÏgŒH®Ã2\aRlÚ†FA"0¬úÁ ˜EGÜy€Î?ì/"\­ÊÖíÚ~wUªçl+PX6õæ‘´Ž†ÙNM¦ âÞ®šnÖ€zàÍÆÛ#I`lœ½yE·t0Ö´çr°¯×(YÎð"
+ ¶z[­n=Þ0,y¨-¹ÍOÎGÍÖ!šÚתð.¬+6Çîè¦q}©SP}]UOl üëœeÑ¥Ô£›3¯`œØ MX¾ñÀ«¦þ…1ñážÎ¾¦UgŽðÿ¾ÙíI*kBP„ç»/wUélÓ*t9å¶íôæ¯ÉRiLp yÚ³}èo­„„ÂþbãRiž2™O¬Ä,þæ,å—#NO§
+œŸå6ïq.UFö{ˆ\Øl-–ƒxö rT—†LD¯è•Ž«h@Ñ® üŠH%ä€Aj<XR  <ýÎz´8![Âyl9çUve
+ °®‚ê¯÷ȃrP1¡N^~8¢¸ƒP‰Áp_„5WÔÈdÓ4éP°ˆ•©ÃáÂ# :}]nª‡€Ãómwp^O4.´Å n’\jPG èújIŒÕ1"&ºx1)¶3!ßuUœß \‡,`®ï4¨MSÝé „²sT/Þ–~4ª»¨6ôµb=¦3î;ð_{.? Ý2¦Œ»¼“ŽÛÄŽ5Ýü‹ì‹™»‹M`ÁÂ’ÿܱ¾0ÇN8O3%5ù™7—KÃ3þsFÿÁPGYÿ\'nŽÜ×´/)uh·ºQùH#ì*mý*iG.aq÷å¶Ø¼÷kþ ÝE\šUu1,ôY“ÔQñ.µ€†¬&¾m€CŸ¹ËõÜ téË“µ;Ëéúô]#f‡ëƒ‹þLýv>Ê~û4p©¬!?=q7
+3ƒ¾ý4ÆEýùa[î6—<yt/Q\Þ­†VÕ´ÍÚG,?Ö>:¸/íôö99»*Þ€góÊù×#·tÒ¾sõu¤CÞC—rò¤?Þ=ò<¹x¤½ú¼ßJÁŽ¼˜•qC7CKú&zÚvùÜy¤ÿ>×cRw‘‡Þ,EˆOÿÜj<3Ë9Íg]aä°‚ÜoŠÕǾuzDîÑÛ¤HÐM}Ή¶ÇZ«AdÌ8¥srík1n¼U»QCÿ¾K £í¥Ë2(ƒy‚¶Ý¶2–2Àöm}‡‚dÂu0н“>ph =”vÚyœyAéF*m_»îöLö“§ÖÈ’èxTùR>Ê0ÛSöP³O²wo?)5€}âá.Õ)®_ÞNne‰=<ï*XÆCUr|åóà!Q6`×ç 3†pª±î£¾‡ îÚ™KÑ~Bt¥v1º„Á…5ϼ~ÔY
+åk~ðú1yAä! Qwìeë»7ÊùÅ/µ¾8ö–Y
+CEÕ0´2ÂE¥ϦD1ÑÎÊNSí¡ÉNÒv+3&û-¤thÊYÈ6ÙÈ[NÚã3õˆÔ©6Lž¯ñefõj.õÌ‚NgÆ5þ1 J“f"³g4AÐ`€:¯ÁST# NÉÎk0&û¿Ôà™~ ÏŒ}Fùü”# ÌÇ-Æ㊧Q÷œ"#¨Š PçyŠj¤È)ÙyEÆdŸ®Èw>B8*+µ<øIYÅPÇeÕC•ÕIªƒ¬ÈÎÊjDöjè)MjÇðÞox8Ž”£igc¡ÜKùдΘ1ãóë!G>*ÿcYÛ“B 7?¿1gtAÐQ€:¯£ST#MÉÎë(&ûÿZ¸Â¯¡Ä™êb¨ Pç5xŠj¤Á)Ùy ÆdÏß2Ð(}’t^‹Z¤áeOÒ¢yvTù/µ¸XJ ˜³<Ÿ\ö²ÿD!SÔïË”ÿNKEݘôµ4þ+®SVŸ…Îb¦ü—|n¸÷Kÿv¯Âp´.ÛÕ®º¡¯3€ÔMó€_A=’¼iº2 *º0
+L…ÿ1NÌÑlyÙó¨G¯‰ÿ<©EFoc§wòæPdNŠ-Z|lîwçAQÙQ†Î_[–S“V «¤]púÒô1'mî>,hðcdÜ=ü2~àиñ¢ ÞÅ_ÁÉ”pã>3sp¿Ð9¦¸¢WÄÒ²Tkk¦oâð4©ßÇ‚?QÀqâw¬3|³þÕ?ü¹ìàØÔoÖŠy HfR+ò,0…g<tjýwµ‡¬ÿíp~endstream
endobj
-1085 0 obj <<
+1374 0 obj <<
/Type /Page
-/Contents 1086 0 R
-/Resources 1084 0 R
+/Contents 1375 0 R
+/Resources 1373 0 R
/MediaBox [0 0 595.2756 841.8898]
-/Parent 1068 0 R
-/Annots [ 1088 0 R ]
+/Parent 1328 0 R
+/Annots [ 1378 0 R ]
>> endobj
-1088 0 obj <<
+1378 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [417.8476 169.1947 466.5943 181.2543]
+/Rect [417.8476 110.3446 466.5943 122.4042]
/Subtype /Link
/A << /S /GoTo /D (sample_configuration) >>
>> endobj
-1087 0 obj <<
-/D [1085 0 R /XYZ 85.0394 794.5015 null]
+1376 0 obj <<
+/D [1374 0 R /XYZ 85.0394 794.5015 null]
>> endobj
-1084 0 obj <<
-/Font << /F37 802 0 R /F22 737 0 R /F39 899 0 R /F41 939 0 R /F14 740 0 R >>
+154 0 obj <<
+/D [1374 0 R /XYZ 85.0394 769.5949 null]
+>> endobj
+1377 0 obj <<
+/D [1374 0 R /XYZ 85.0394 749.3028 null]
+>> endobj
+1373 0 obj <<
+/Font << /F37 1018 0 R /F21 930 0 R /F22 953 0 R /F39 1151 0 R /F41 1208 0 R /F14 956 0 R >>
/ProcSet [ /PDF /Text ]
>> endobj
-1091 0 obj <<
-/Length 826
+1381 0 obj <<
+/Length 735
/Filter /FlateDecode
>>
stream
-xÚÕW[OÛ0~ϯˆxjâø–Ûxê lCb4Û ð¥*¥I‰ÃmÓþûì¸IêJ'¤©Rë8Çß9þÎwÜcdCñA¶ç?‘Dxyv:· }-Þ}²ÐÒÆiŒÝêcl¹G$°#ùØ·ã+ +0 ‘OÏP0p09ýú%:؃ƒÃ“ÉÐA!õÂÁÁçÑi<>SóéèðÇ!4Œµ%rp4 :ˆ¿Ÿ'ÃËøØÇm¤ún$2Ì[ëüÚS±©c …žý  @Q„í¹E=<JH3“Yë[ ¨½­—ÙA`âc=iô„øP@^|‚IM
+xÚÅWMs›0½ó+˜œà Y€a|r§m¦“IcÚKšÅrÊ Gïɯ@ ܤNÓÉL‚–§ÝÕ{om›Hü`Óõ ÀtvÍ83y!Þ}4ð´QBctHÇf
+:=øncŒ­éñþì µ¥z8œMí±c…ßNgsû<<2faÓiû4ѪÍKãì™ q¨#Aø®y#â ff8.…®C©Š¤ÆÜøÚ$l½­·jÙÁê =ÖÑãУ„ÖôDqj!+Y•Œ¯¢´Ëù Ŀш8“M0¨‚>Äíàã¤"Ct…FN7=»Õ¥ÿe’¯@².ÀE~1ÎÒÉnóuorTU ` ×%5B¨¶Ë0Ö‡%z™ó›ˆ/dÖ|•ÞMt¨ÑH:è2ïO®
+Ư/t-lvWo{‡ Ý‚Zr*4ÐÂ'ºzªë"ÊÖ)“ÏQšæ7 äѪX2.c?‹V¹¢€‰%Ö‘ ÛºÑr%¶õÄÓÈYQò$.åêòŠñ»M_qÌ
+-k²l úðÌ´“g.û‹F8‹¯x!>÷d[z!¼§Â@ëcýè4Í„Y” ÷B ]­:^#öŠ¤d²Û:Œól¯mGµ©s€ònÝ©¥¥v™¨†ö²Q¿ÈV9¹2ÏÔ$‰ <*“kÖ(–§We£@åÚ§meg@ûšÀ-Vy[ãm™ž­úÏZ-Š4RÜõ]u® /uy抺ԟLQŒú5´ã"=6ôeD·Òü_Æo¤ð¶Áï °Êù^7½M…É»ÍÒî³óêÑéÍÀKˆÅ» À¯d÷ÿ MÞMÝ5šº°ºûj.½¨cç+öÓÎRß'Íí™Ö홌}èø"ɦ©ªsì÷:Wwñ~ë¿ÈUendstream
endobj
-1090 0 obj <<
+1380 0 obj <<
/Type /Page
-/Contents 1091 0 R
-/Resources 1089 0 R
+/Contents 1381 0 R
+/Resources 1379 0 R
/MediaBox [0 0 595.2756 841.8898]
-/Parent 1068 0 R
+/Parent 1383 0 R
>> endobj
-1092 0 obj <<
-/D [1090 0 R /XYZ 56.6929 794.5015 null]
+1382 0 obj <<
+/D [1380 0 R /XYZ 56.6929 794.5015 null]
>> endobj
-1089 0 obj <<
-/Font << /F37 802 0 R /F41 939 0 R /F22 737 0 R >>
+1379 0 obj <<
+/Font << /F37 1018 0 R /F41 1208 0 R /F22 953 0 R >>
/ProcSet [ /PDF /Text ]
>> endobj
-1095 0 obj <<
-/Length 1945
+1386 0 obj <<
+/Length 1364
/Filter /FlateDecode
>>
stream
-xÚ­ksÛ6ò»~…&Ÿ¤™&
-žÉI}hõPíØ—û—èËЉ˜ù<¦’Ø2È>«~U´4‡ªnôWû.K5aÛÊžê¶ÍÊ=mº#­›5<…˜*±Q
-u1<3ME¨­¦µkô®Ëé”ÂÈô},K,Å1U­ÆH¸ruM8Šû‰6CPÇ,Ôœâ>\xåPuyj•«Ê–RÞªñôÄg*?Œlå‡ñ™=bIQ:@²DC*x¢Ôµ„¾{ç؈á+ÈœL´Àì±kÙt¦À±¡$Ô7¸"ˆ!½I 0 >Ûj_«ãT™7¢u!'îËýºtJ˜í‰VŠBFHª­yÝQ×YeÒݨuúfô|sÉd„ô<5ÖI_>-žÏ"Ï(Z­À¨bhK{ªÚC¦˜8°ãHX¶Îo3’¹ÏB)zÉX–3cˆËÏØœfØ80zÀGSt1xc?šaž•¶ËVÇÖV&n옒•gŒõO=mÃí¬£aa‚»¾Õñœ¥ Ü0°4ì<ôú‚Üq´B†ÌRö“ãv6x£K]›LGuîªÖÖ¼‡ö¿ëMºQ‰mçïTVO-¹…«ybÊ€˜DÜ3²¡æ¥ô fÕùĽ¶Ö–ô)I¿·êY2S³°bÃA²K6[Ý>j]’2ÇF)Ý>è8òm…Çb7¾Ìž)'ü¢#1ÇÒ'Œâ!:Ž@Ã+IMUo3xd°çáãk
+xÚ¥WÝÓ8ï_ñÔJ$µóÛ§…]¸åqл@È›8mtiRâd—ºÿýf<N7-î‡*Õ“ñx>~3öØÜaðãNy,ÈB'ÉB/b<ròíŒ9k˜{9ãFÆ…Ü©Ô³Õlù"HœÌËb?vVåDWê±4åΪx?þûå›ÕõÛ…ëGlz 7ŠÙüòê¯ç|~ùúùõM]½~GÄ‹ëËEÎW¾½F÷3\™•«w7/W¯f׫ƒÓ8 йϳ÷™S@(¯fÌ ²4rîáƒy<Ë|g; £À‹Â 9õìÝìƒÂɬ^jÃ$
+R/JýÄŠïÛ@‰2/ü@ƒrý¥—]#jŠø‹Ø­P}Õ6ÄØ´ª&?AFÉîNvDçmó1ý‚±|ò‰Iæ¸ï± ü@c";1cóª!«Š>¿ÒÀßã±ÿl釆™!3õø”ùïCõ~àeˆô‘zùŦÞæV;å®[w#;yF]¨Õµ;?è@ ν,Š|Ç%‚êÊó¼qù8ÿ{¹$…Jlwµ$ZÔu{ïöhT‰°"SÑ´D·ÔI8RGÆmKM¼ ,û&@›+…,ÅP÷ôñyÝÞ¸•çR)ÛJ²:5&E³?c‘Yì¤ê»*7&s‘oäO˜t' ¾žÔÅIü
+¼¼Ý>y¤üÉÑ~¿3«·°Ádg ²¬Fžl—d¤l[màâ'ËúQv­ÎÚŽ
+غ–›ÅØ‹cQRtù†p9³e±•cg<îgþω¶’8/À¸ÃC/cߤú|4ºƒ…Ë{¸·XRÖxB[bµ© úü8ž£ AmÚ®G2š¯‡ªÄí[3+û¾jÖô1ìh\-àâ„õ'r“`‚è‡nÁÓ¹4&0+èžÉ$˜€Äɘ8Õ ð®ú½qÓpŸÝ¼¾òˆ¼ém°Rå]u‹6ÍóhÖㆡG,=k.7C'È02‘SaVÞ˺>álDo1!(bú *˜ˆ‚¸%Ö6EU"·-N7F_)€{j+•ªÉë¡ <L·ÁN/ju‹¥Rš;iýÚ#´ñ·Ü›E¢)ˆÔyqU­Ó ¼ûªßEIOb¸ùÂíG>H$¸ZmEWÕ{úTÃnu‡Š’˜JXó5TZ`¼‘&”ECނωC.·Û¡©rI(‘ Æ2Obƒ™vTPGÐÊƃ^O•úp±ê«r¯Ÿ O­'®(e&½úª€=Yæ΄$lg% .À•ñù[}
+ÑKL æ—Ä£´ïéãÓ©
+ñ¦lÌ.Ù´C]çÚ¦§‚7nœ¿\ê}Ÿ¤fß'Ùƒzä’£4>U¹„J9$iè‰}óÆ5 ÃÆž9ò'+eÆF z{ãq’W°»Š8ƒê&' €n¿ëÛu'vre‚íÙD¾-Dv¸ºüò“ôá &^¦¾ýµ°ØKý,B˜yvêùáíú­ëÿ¨6Eendstream
endobj
-1094 0 obj <<
+1385 0 obj <<
/Type /Page
-/Contents 1095 0 R
-/Resources 1093 0 R
+/Contents 1386 0 R
+/Resources 1384 0 R
/MediaBox [0 0 595.2756 841.8898]
-/Parent 1068 0 R
+/Parent 1383 0 R
>> endobj
-1096 0 obj <<
-/D [1094 0 R /XYZ 85.0394 794.5015 null]
+1387 0 obj <<
+/D [1385 0 R /XYZ 85.0394 794.5015 null]
>> endobj
158 0 obj <<
-/D [1094 0 R /XYZ 85.0394 418.0047 null]
+/D [1385 0 R /XYZ 85.0394 223.4026 null]
>> endobj
-1097 0 obj <<
-/D [1094 0 R /XYZ 85.0394 382.2497 null]
->> endobj
-162 0 obj <<
-/D [1094 0 R /XYZ 85.0394 223.9723 null]
->> endobj
-1098 0 obj <<
-/D [1094 0 R /XYZ 85.0394 195.8278 null]
->> endobj
-166 0 obj <<
-/D [1094 0 R /XYZ 85.0394 149.2124 null]
->> endobj
-1099 0 obj <<
-/D [1094 0 R /XYZ 85.0394 126.0612 null]
+1388 0 obj <<
+/D [1385 0 R /XYZ 85.0394 185.2496 null]
>> endobj
-1093 0 obj <<
-/Font << /F37 802 0 R /F41 939 0 R /F22 737 0 R /F21 714 0 R /F39 899 0 R /F48 953 0 R >>
+1384 0 obj <<
+/Font << /F37 1018 0 R /F22 953 0 R /F41 1208 0 R /F21 930 0 R >>
/ProcSet [ /PDF /Text ]
>> endobj
-1102 0 obj <<
-/Length 2252
+1391 0 obj <<
+/Length 2265
/Filter /FlateDecode
>>
stream
-xÚ¥ÛvÛ6òÝ_¡Ó—P'!‚ ÁKsúà:Nêî&›­Õ}iú@I”Ä”"‘²ëÝÓß
-÷õì·ßùd GùùŒ3•¥zr ÎD–ÉÉö,ÒŠéH)©Î®Ïþé öVÍÖQΤŠåˆR¤SŠÎX¬¤2J™m
-8èáâŽe‹_”5Í;‡ñ™sYxä×ï"Ñ#œ)&E„ò Å¿mš¶!þ/ÙK«—ÿ±Ý¾¼É;» ˜H5S\;`ƒH‰àcÓmÊzM¼—å~*Ò Xt•óЭЉL¾š†Šó`~èŽ
-Á2­¥a7ÏÛ"Œ#2nQ/še±¤IÛíI
-ˆ…àC^òŠÈ½/êbŸweSëLjŒÖžÊT2IÅ=‘hÝÂËíÎ ÀrúìÁEŒ ™m_àñ–h³"è¼ìZˆ!õÃà&!
-Á îÛJA—ŸÄ‰~ŽýC<,ñú©ê¦o›=¦%b+Q¾ÌçÔ»+iªbõ Žñ „/å]sd­{#ÝÛ€h:`¨ ÁµÐÄuPTB@íÕÁÓžßh‡}ãQíÀõ+I| QepXàQbom(MY“e]Ë¡­rpà°œ×uùo“æäh›æ5–¨„é {Wb©º„€cK°
-B#w
-èjó~¬ÇL%"{ªÇL'©Ã²­UyÚ]}ò³N|l–îsN!ñ(Ùïnä“ÝSàx§ej´¶«H°XëlXý±îºíÔvႧuHtoþ¯ÕòÙµúÃñ˜d–¥LÀKó;ÍíÒÎjµ LŒMµyj‚%{„Y¶£í÷­]7Šƒ¯uV•Å.-æIiC¼eSØuÓ8\—›«8@óÚ²;–}suÇƽÆ€ðy–®™wÃ{gY^‰Lµ ‡…òøÖ4z½ó®ŒE*UO·Î*’®Õ½.Í¡©È |‘I|ÅJì#,ç4%a¿ŠÖjÊDó`G/"Œ–¢£™<n˪¢ÑÜ.ûÒfVMû¸
-  vW,l!/TÐÿ¤\?ZŠ’à‰Ò?>ï’aÅ4… @çž
-é=ÉÝo.÷Eÿ/~¶ÕAendstream
+xÚ¥Y[wÛ6~÷¯ÐéK©“%
+@aQÔyµ£iïŠ8yÈ‹‚F»Ïx=M‹\$>hœ&W]sN³ë7‹Kÿöz!”}mԆݽMÖ®çÜkòU¶±Võ}fô‚íò[]í2 ±D¨¥‘Å+M
+Nƽ“š2:Š`
+„®ìNgx8»u+–ª‹8¶3й=¨©¶Õ;w"ßU„¨Ø~ŠŽRâ×êçSîˆ(•AHÅ
+€u¾}¤1¡
+/ ‚3ÉÝýsÑÿdiÙendstream
endobj
-1101 0 obj <<
+1390 0 obj <<
/Type /Page
-/Contents 1102 0 R
-/Resources 1100 0 R
+/Contents 1391 0 R
+/Resources 1389 0 R
/MediaBox [0 0 595.2756 841.8898]
-/Parent 1068 0 R
+/Parent 1383 0 R
>> endobj
-1103 0 obj <<
-/D [1101 0 R /XYZ 56.6929 794.5015 null]
+1392 0 obj <<
+/D [1390 0 R /XYZ 56.6929 794.5015 null]
+>> endobj
+162 0 obj <<
+/D [1390 0 R /XYZ 56.6929 726.8027 null]
+>> endobj
+1393 0 obj <<
+/D [1390 0 R /XYZ 56.6929 697.6944 null]
+>> endobj
+166 0 obj <<
+/D [1390 0 R /XYZ 56.6929 648.8841 null]
+>> endobj
+1394 0 obj <<
+/D [1390 0 R /XYZ 56.6929 624.769 null]
>> endobj
170 0 obj <<
-/D [1101 0 R /XYZ 56.6929 691.7741 null]
+/D [1390 0 R /XYZ 56.6929 472.4047 null]
>> endobj
-1104 0 obj <<
-/D [1101 0 R /XYZ 56.6929 668.7722 null]
+1395 0 obj <<
+/D [1390 0 R /XYZ 56.6929 448.2896 null]
>> endobj
174 0 obj <<
-/D [1101 0 R /XYZ 56.6929 579.8329 null]
+/D [1390 0 R /XYZ 56.6929 356.0575 null]
>> endobj
-1105 0 obj <<
-/D [1101 0 R /XYZ 56.6929 549.1878 null]
+1396 0 obj <<
+/D [1390 0 R /XYZ 56.6929 324.2991 null]
>> endobj
178 0 obj <<
-/D [1101 0 R /XYZ 56.6929 502.9124 null]
->> endobj
-1106 0 obj <<
-/D [1101 0 R /XYZ 56.6929 474.9173 null]
+/D [1390 0 R /XYZ 56.6929 275.4888 null]
>> endobj
-182 0 obj <<
-/D [1101 0 R /XYZ 56.6929 277.7919 null]
->> endobj
-1107 0 obj <<
-/D [1101 0 R /XYZ 56.6929 249.7968 null]
+1397 0 obj <<
+/D [1390 0 R /XYZ 56.6929 246.3805 null]
>> endobj
-1100 0 obj <<
-/Font << /F37 802 0 R /F22 737 0 R /F41 939 0 R /F21 714 0 R /F39 899 0 R >>
+1389 0 obj <<
+/Font << /F37 1018 0 R /F22 953 0 R /F21 930 0 R /F41 1208 0 R /F39 1151 0 R /F48 1228 0 R >>
/ProcSet [ /PDF /Text ]
>> endobj
-1110 0 obj <<
-/Length 3204
-/Filter /FlateDecode
->>
-stream
-xÚ¥Ùrã6òÝ_¡·•«" ;OžO29&Y²[©$´[ÌH¤BRöx·öß·/ð©8U[®2€Ðh4ú¦ôBÁŸ^¤6P&‹IVi»Øì/Ôâ澺вfå­Æ«^¯/¾|g’Edq/Öw#\i ÒT/ÖÅ/Ë7__ý¸¾¾¹\…V-£àrecµ¼zûÏK­õòêÛë·<õöÃGî¼»¾ºL¢åú§›k„¨ ÖEA,;×ß^ÿ|ùÛú›‹ëuOßøZ$î‹_~S‹®òÍ…
-L–ÚÅ# T ³,\ì/"kã!»‹ÿèŽfiëO¬I›†É SB½Ð:Ȭ '\±Y›ÐW`G`/WZ)¸ÒÇ÷_ñÕ¿uOÜy·®àîÕfãÚ–ûoêªkêÞN G¬W‹UY¤#Bÿúýdkª—ùnW?âö4\¾ÿQ`EÑ\êt x]+ ªàN“W÷NÖw5Ãn·íÁmÊ_•
-‰6XPV<qõæ;²+ëJ f¦Wè5‘”MR é%*W¼®0¬ Ó It&Ëîf0%A’F2ÿÇÑ5OsX²À$¡?ì÷,ð‰LwÀ‚öÎ53xàÉCE‚gYÛl±êE
-WÕ+f9£ƒ$Ó‰g [‡O^â·uÛéþƒyùÖIxDÜvUñ.÷9ßvŽõ·y5s|Šªœ$y¿Êä´8 Ré9®óþæнug Ñä¶:2A¨t
-z™išdÏÏ]Å üÿá†ø€ ò꿯Î(ü±ÞÞ+<ô‹§*ß—ð©2C’
-lㄤg>³_õ!Ï°!!AÏç‘w]EJYÚÅ
-liEiï_cñ¯×MS7íËN“mN–zäýnYÝ3ŒŒ‹Ž½½H/øÐßÃÒœý&Œ6yÅ‹ÅËwO¿Ä­îÁ5ùŽ®áã4èa–.ßßñD~öÁÖò)-‹
-@H‡U]‘O%ë9òFr‡¬úcÞ 4 [×
-ã/]²Ú㪊…â£gÞqlzÉ4±Ã}Ü&ž`xæ GKæ2!´(`:q76,-09–œðwƾ°Üa\2Ú=’XÚ!c}­«¸=VŸªú±â]è90?
-xLÙ’WOÜ!N'º/$»hÁ5/ÿ·vD 1kF Ñïk™µâø0VóA±; -?ü°F{{õÓúk‰ƒû5´ÓG ¨êÊ ¨bØF¡N!YJ¸b xÉ|„ãã_9 A1ºIƒ8ɸâ0Zž¤Æ6ò 6»Æˆöl¶yU¶{†ÞÕ ÃÞü?ÐËos÷®rè%)^Â%âзùÈÇ`ÌFBtœ¬Âd÷X3Jo•Æ¨l¢ŒâÓÇQûû›Lsƒ=<QKy¬ÉP6fòÿ(PJûôã ¯Œ
-´ê‹ "Í€‘üëݶ˜Yå… œA‡¸ ­ðŠx‚5¼!oIÛ/5Å,ȵ”q`M&0ÛÅÔ å-’±!’ʯ·X¥X Y™°Ãë¬#®Ú‡Þd«å[Hü€½¤\«¯Ýn·'mô—À%î3ÊĽó$Öh”øâ­'kx$€ûÔ±ì¸SË®üAÎÎ0O.GùóhC´”´+ßuÛúxÔ´Á%0¶åÁÜzhY)ÍÝ8MtŽ6°=ˆIà¶QŒo(þÁæßð0¬ÑäìÖ[7—ýBøe}x^U-VxÑ(Iá“$쎭7
-„Ð)í°v*>q¡ÐÖ %ÄçÜ ‡´'ö},ˆZf
-möùå«
-òO£½ƒ†œ’Ÿ€º(õ—è7“ò3áE€4qw”„Á k¢MÇ'ž*?ÈõMIÕA0
-hòZŽ.Œ¤÷†Ó{lˆ¦,\®Æ!/U†ôneµf…ÍP¿eÀ,B4ƒžÀDTøÃÙ²“X¶á²!!àXLûp5Á„¶ËÑò1y³ÁȤqV 4ô…Ϭ´Jå;ä
-ê!ä”o8‹µlª¦ÄË«»Ž¬˜Â4’ ô¼û‚+(·ìÄ`ã!o ¬)9¹X\Ê
-ç\%î eÅ%,ŒùèƒH–¹ O+@C›}é]tLôǽ¾¾Â„Ì +Ýç|#ÑÆÔðöHvëã
-0ÿþ†Mhb&C¼_—#ügWœBëÆJ·“gçP»× %àû¹Ÿ9—ò·ùÞIÈ«Šìºùv!ú/'í+ï—ˇrçúˆ£|HpÒõŸpTeÿUfø˜ìËøýÉ'šÙj (½áj$Xý)óq¢av¨C©´šh\x¡ê/†Û/‘*/,’\ÆHÙ Cž/èî¸eêM$Ô’"Q[ EðtéÒW#ûÓ€eî‰ÈG¾:áS_ßµ¾JCLëø®sûÃIο«Yºø›dñ¥_t›y
-®!μ Óå»áѧÏ=ÄÚ%¤ˆ«I9xýæGÙÓÉ'®};­Wôc€–ÀG|'Ÿ]מÖáKaW×;|–‡ƒ´!.–zÙi êÃK!bþŽ'îð™4Ê$A˜j³UíÙ¼àh”ísŽàÜJŒ ðW 3Ÿ²Tÿ êÿþ±Éðëš( Lšžù&Ùc†Yâ‰BÂuvJyÿ«”ç¤ÿWuJpendstream
+1400 0 obj <<
+/Length 2935
+/Filter /FlateDecode
+>>
+stream
+xÚ¥Z[sÛÆ~ׯà[©ÙnÍ“l˱’ÚI%º34‰ˆI@!@Ëj§ÿ½ç¶à‚„¬Étø°÷³g¿sö\Ô3?=ËâHÙÜÍÒÜE±Òñlµ=S³{ûáLËœ…Ÿ´g½^ž}÷Φ³<Ê“Ì–w­,RY¦gËò×ù›÷¿,/¯Ï&Vs/âDÍ/Þþã\k=¿øøæò-½ýxÕw—ç©›/?]_bÊaž‹Y¹üéòŸç¿-<»\ü…gÐÊ"sœýú›š•p”ÏTdó,ž=BCE:ÏÍl{æbÅÎZß³9»9ûû@0¥¥S˜Ä6‹â̤ =Ó:ÊãØŒP‰ó(±Æ*°"rç ­”š_5]¿Û¯úº¹gúuÅ•›j÷¥ÚIgË姮:šõSõ„ˆÀ¾&†šÁ`ät–Ò†7u³‚ùVeóÏÕSǵbw®³9uçón-Í’o«þ±ªnô-WÖm×Ëê¶Ù<‘_AÛXf:aëÛ}×3ý[íÛìð¸öäŸa©o=+\=pY<_Âfph<æ€5ó®ÝlÚÇɺã²(K<VˆcϾ{çt€šÖ„”€ä‰\SlaÇUÛÜM œ˜È$I,Sÿ¥”ÙˆDîÚÏ·y0ßêȦ:—ù¤ž jt§™ŸõJÎqw$ó«_†ƒ1`œ´½›Ø9Ë£Ôš,ØÙLíì"•äþ<: 7$2‘ýëZ ët”Äq5 [àR/ÿD–së?$3/°‘äXxЂ˜¸çûÿ~OëGØÐðàé-`Îršóa¿éëSšË–&--ž¸ëV†ÕªéQ p·ûž‡Hí©ÆÒ€å(û]'㔢¬6O@YkÙ¨¬™0Üö/²UÙV²¢i{ž
+×uýE#ÛuÕŠ÷ñ”Ì»v|ˆºgÉñ¡ r+JCQi¸xlw›rÁ$‹²¸õÚËš ¤³ÈÄ)[‘«)íÊ#g3û’Z»È:èQ¢!MI‡N‰”
+n2³ì«N¢Û<ZÜBÉÄ4Úã±Þl¸v+Ã]}ß• Ñ~-;¬eA÷P­jÄæZ¥™ŠOÔ˜lb4”wblò2RÁ56A,ÕW`@DË:9êCÛtU76pÃqPøäG3¼^„3åà¡­éÀrmt¸ÙÂLs«½Š$Äð_—®ÞÖ›b'¾è«-Ü%n²O KUq\7î
+ï~¿+úºm¸s0ÚT~bc ÇÎrû}}„4wN;ˆ$Fcª_6ÓàÕý6$KÂû¾©^â8ëåøæL©ÄÄÅVplÿÔ±EïÇ!p~Â*°Ø6€+uCK´¼¹úáÎPåuÑy­¼X­÷Œã®Ý¼ò¼¾úˆ±e¦ç$Þûr!°«)¹²+Fæ3ÀZTUÌ
+oþÆ•²Âá¦F5"HÙãà=`'З ž§]ˆp¥‡Àán‚R
+–ÈÉ8Èx÷4E%‡ðc~Ÿ ÒH½ZÝ]µ› q¯Ñ¹û…‹pŒaAè—ö%˜)Š¶§Þ,ÞO6=°6r¡zØØz›ÄóuAÃèkÕ×ü É &@¡—àæ.Q>蔀†»–ˆ;Š5¹ï¶%¯ K>“–Bßc»ß”~G++ðäU9‰ŒŽÒ\§§>ƒT{òLêwèŒ/ïŠíƒwÞí÷Ûg˜Ï¤éHßB©‡·™rz
+u?ðÉÉ“L†‡ÚÙÈ(ÃÃѾaÄG8|3ô{.ºc¢xzá¡^>A_¯¸Á»{Ê=˜oj$¼›
+ºOlècÑzÐÛ§Q”5—r ‰°ŒqSö G{0\­´!Ƭ3ö’Ü2\äÄ%cm¹©ªã¼Y+Ì•‹áJÛH¥Î`˃»ûW®ƒ”w˜¿pÊrvJ—X‰ãÈ À¬¹–’,Ê3ðBá'¹÷0ë%FR¹1‚Î7”PYw«}× ¼µÇr߶>)•ðØV_k —OE¨c°ÕÆx[Íê¶xh7õj*IOÐäZ!‡0iÚ‰ZÈ¥RK·éȉ&âD/w»v×½ìÙ éTâ®+çÌÐGÇ׉7ŠÐ3h7Ôƒ°Z«¢áÉâJ!½ârŠ¸´‚L°Øp£Úñv;´Ú&Ï0 âÙ}„ZÇ»H|=tu+›¶YL¥Br¦ûqxYÀ¦¤¨©£ ÛäDúßý|ýáòúš‚²l)µ€öÀ¿rÐ%á¹ã¥¤hûEhwüö‚£¬SŽˆp•=ø+È(9"‘uÏb“Y?)ÛTÆ›AÏ}Y„¬‰ ›$ å.À8:FÆ­:0{Æã€ñ!7ÈC I
+¨zÝ“ 5aÔퟖˆXëi5eÀ¡8â‰sNä2c.WyÎÄÜÄ|”Î&>]XCÙ%¬-Ö¤¡¶àÀð u¼Âà#Xh,­†±Žæ5\î›ÏMûØð*ŸRáš“lûÃÄŽ—±–ÁÊ’m&ã<ÎZ-$¡"dz*ˆ°Pkn®Ú²âi]Õ ‰–Ë×oñù•S@ê!¡,x…ßB„æ€ Ô´ŠWë
+»¾›m1½U*ÿVy‚3,œU*ÏŽÉgêÆhC!"dž®
+öÒ÷rÜò0F ;Ráû“Œ43€-Ȩ£ìæäÃÇ€q–ï"¥´O2žÁ
+Ò*­†'Qg Höî‰kÌŸ­òZ–ç’ìäò¥`E˜ C;^PttÝÏ5-[k`N.0§Å`¸ã%’—!‘¦
+7[døÙ/ÏŽl©\˜G¨Ð½7Þf«ù[Hï4?ÝW‹÷Õf³¥ëèSª¯¨÷•g±¥§Q:xçÙ: ú}‚XÒäfàªâ‹ì]pÇ4 8A„òípc´Œ®W±é×íþ¹³h„k
+ò-?ÎCño _iòvËõT‚du¹|Hyž¿ª1¾ð¤ Ká$î´ô‘…»‚H½R”hcð|æB±­=„” Wào8¦Í9}‚Aìie:l5œÑJ"eò£Ðú™›g 1O•Ñ/žÝ©tôÎç'ù‘‘ÉŽŒLîo*ÔØ»ù¤eø{”Ljeñðflðe]åÉø
+Ÿˆ_–œœž/Ëâ÷âñÌCysI/6ÝÑW‰}wüɶ¬6Uï?J„@>Žù콟㿇­ ™+Šü¥n÷ì UôÜ¿ ,$ÐÖN½G¨!Mÿ¿ÿypø«…K#›eÏ<lÀýŠ2“§ž)„Òèc·¿(œ²þ?G°±endstream
endobj
-1109 0 obj <<
+1399 0 obj <<
/Type /Page
-/Contents 1110 0 R
-/Resources 1108 0 R
+/Contents 1400 0 R
+/Resources 1398 0 R
/MediaBox [0 0 595.2756 841.8898]
-/Parent 1117 0 R
-/Annots [ 1113 0 R ]
+/Parent 1383 0 R
+/Annots [ 1404 0 R ]
>> endobj
-1113 0 obj <<
+1404 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [418.3461 611.3335 487.0181 623.3932]
+/Rect [101.3082 379.428 169.9802 391.3282]
/Subtype /Link
/A << /S /GoTo /D (dynamic_update_policies) >>
>> endobj
-1111 0 obj <<
-/D [1109 0 R /XYZ 85.0394 794.5015 null]
+1401 0 obj <<
+/D [1399 0 R /XYZ 85.0394 794.5015 null]
+>> endobj
+182 0 obj <<
+/D [1399 0 R /XYZ 85.0394 769.5949 null]
+>> endobj
+1402 0 obj <<
+/D [1399 0 R /XYZ 85.0394 749.2913 null]
>> endobj
186 0 obj <<
-/D [1109 0 R /XYZ 85.0394 769.5949 null]
+/D [1399 0 R /XYZ 85.0394 546.785 null]
>> endobj
-1112 0 obj <<
-/D [1109 0 R /XYZ 85.0394 749.4437 null]
+1403 0 obj <<
+/D [1399 0 R /XYZ 85.0394 519.0032 null]
>> endobj
190 0 obj <<
-/D [1109 0 R /XYZ 85.0394 597.4103 null]
+/D [1399 0 R /XYZ 85.0394 364.477 null]
>> endobj
-1114 0 obj <<
-/D [1109 0 R /XYZ 85.0394 573.0707 null]
+1405 0 obj <<
+/D [1399 0 R /XYZ 85.0394 339.5007 null]
>> endobj
194 0 obj <<
-/D [1109 0 R /XYZ 85.0394 410.9267 null]
+/D [1399 0 R /XYZ 85.0394 175.6792 null]
>> endobj
-1115 0 obj <<
-/D [1109 0 R /XYZ 85.0394 378.8211 null]
->> endobj
-198 0 obj <<
-/D [1109 0 R /XYZ 85.0394 204.765 null]
->> endobj
-1116 0 obj <<
-/D [1109 0 R /XYZ 85.0394 171.4256 null]
+1406 0 obj <<
+/D [1399 0 R /XYZ 85.0394 143.0963 null]
>> endobj
-1108 0 obj <<
-/Font << /F37 802 0 R /F21 714 0 R /F22 737 0 R /F14 740 0 R /F41 939 0 R >>
+1398 0 obj <<
+/Font << /F37 1018 0 R /F21 930 0 R /F22 953 0 R /F41 1208 0 R /F39 1151 0 R /F14 956 0 R >>
/ProcSet [ /PDF /Text ]
>> endobj
-1121 0 obj <<
-/Length 3252
+1409 0 obj <<
+/Length 3227
/Filter /FlateDecode
>>
stream
-xÚ­M—ã¶í>¿Â‡¾·ž×µBŠ¢H¥§ÉÎl²I»ig&=äã [ôX/¶äXòîN~}¤%[“M_û|‚$€ø -g~r¦ó$/ÒbfŠ,ÑBêÙjw%fOÐ÷õ•dšE Z ©¾z¼úâ­2³")ò4Ÿ=®sÙDX+gÕOó,±É5Ì æ·ïîÞ\/d¡µš¿ùææŸw÷׋T "’›Û_K)ç7ïßÜÝRŒ"àíÝ͵Éæ?Üß=\ÿòøíÕÝcäp¸ )²÷ÛÕO¿ˆY›ùöJ$ª°zö"‘E‘ÎvW™V‰Î”
-˜íÕÃտ℃^?tR*R$©ÊÓ ±¤r&³DeÐ9”‹.`R­ƒ\@BD¹À–``:§˜-Ò"‘R~Ä›Ãó¾oŸå~S¯@&E>/ýÆ5}½*ûºm×®ñ«Yp€¨›u{Ø (ꎾû¶ëêåÖQ«¿–óÍáZÚy{|Ú0nÃq²·:êþ™Z? -ˆqU WEž(e ì
- Ð>MMŠC’ã†6<æÂM¥…¬Ç“+IuÎÎ k*·]K¸%÷Áº»csŠd@–qÇU»ºc=” ´Ž:½É‰öå=ïä¿h¼Ì¦ÞVD†.G2/0mÓíê~Ê¡µâAÎ KÁà—ùñ¯|(UäN9,fà
-ËþÈ=¼gÀú¦n*ܦwòˆ~&4ÇZ5fŸ×¡žµß JjÇc¨U¹/9–+>x]»ýàxlqÂçô‡k;g¥ˆyíý
-™åÃPûÖ»,·>,(1ú\;Â{¿„ß(J$A Þû)ÀpÈLµä@Ÿ©›ã$t»:¬”Η“9ѦÀl¶Ûgj¯ÚÕGñŠ¦á‰üŒÖ{ÕMÙôïQ•¿"C=EMѵ5,”1]¹l?D V{ëæl˜à÷´—°¦!‡¼ú\XåÛg&V’óç¯]Ù@ï}?ÎóœÔ²i(cƒgŠË
-ÒíÜlPUÓÁ¹^À¾Ÿ\31cš!uåLòóÝøÀPúáwØÒ÷‰8>É•½çÂÚ$—fìCÑÛ@Z2LØ°Íòˆ=LŠ¾»ô£¡Fì÷*Eºvz<{6ˆ,^*½}¬}ºRŽJPPÁ
-£‡!tìF9ø™EIßȹG.é {cS{‹÷ЈËdÚÉD}]€(1B«ò”~ôAVÄzÃw¬òÅ|Ù—WÇ•«¾œžÌER@-ÆâønÌ×_…Е©Êt‚Ú˜È[Lž%‚ìQé €j/i ®´%¦c<­5ß´œ „=Éütí">Ê~°?
-«ðF­|¼§v°ôå? KjzóC /Ÿð2'AÅY²ùS?ГÐòì1xao?¤÷[öJ>Tevp56s™ÈtÚʧìǪ$·y:¸ÂLÍŒ<–n¸š¢…)Í2¡Þ¼&Œ$uX4òÜjžG_ôáàNׯ’áš¾>Ì KÈYz¥ËbØÊ,Gdx
-¾!'D ^6°zq_΃Åxrr%€Åéhù‚7‘Ö$& î,O‹D¤ú$a´ëGœv´4çL¸^Kß„ÅŽïþÖ$åzšö¶s\n!–Pv¯€Å\çeyɸÇ=f®M‡Zÿ…“æI&äÔæ&Âè£Gû!”þ*"Äb¿ £­ó 'ñ;”’) ºaÛA,—Õ†oÅù  ØóíÝ¡÷7|Ø‹¢Y!Zö甄¨ê5ŽZ»Aá:\‘}OJ­ÐÞ•<sacá
-°~\új“{ƒ- ¶e!÷e=]¹ä]lÅ‚_†„å”Uĸè/Š.·»ÀD5K³±õ¼Ÿ~oLñúK¨XB^N¶`Up8‹š’]š+ÿ0·›1:«÷÷ï¾~i"‘O^ïùÛÕ@ nOE¼]\b@7
-êÖ©ª‰5ê¬.xy©SÊÎ_|,ù:ú >ˆ·|qw‡¨›¨:i†á=Œ§ø“¨pAw~à—¡â­ªÐÑÿèo@ñ?áÒ–ØŸˆ&E>¬°±+llàqê¤Q˜`<(ٲ뎻8KmÅOçHè딂ÞCý;8\8tÕd0ÉÀ•ª|PC'Ÿ+»¡–Nt‘ŸbèÂ@ðGü ªˆ r¬çÊ­Ëã¶gu•áat‘ËRç·Nù–‹Ë<ÿýPB>‚N¥Áð–aôˆô¹›ÎqÖžL\ œeuçÑ„®Ú‰Ë
+xÚ¥]sܶñ]¿Bo¡&>ŒŸ[NœLÝÔRÛi>x$¤ã„GÒGžeå×w»À‘'ÚéLG3°X
+Y\æEk‘èËj!.`îû‹„q6i3Çúîîâ›7*¿,â"“ÙåÝýl/ c’Ë»ú×(óø
+vÑíÛïZø—\m¤ÈU½úáúç»›÷0ÔP ñúõ¿®’$‰®ß½ºyMS¯ßÝRçÍÍõUžFwÿ|s{õûÝ7wÎ9/‰PH䇋_—5°ôã…ˆUaôå# Dœ…¼Ü_¤ZÅ:UÊCÚ‹Û‹„ g³néªlK•ÉáH¹&]Ä™’Ê çng‘ @Mf¨vÔ:‡ýÎO7ÿa¤ù~JĹЊ‘†ÃUb¢¾²ãxµQºˆßvÍÔ”“­i¸}‚D\Ò°jÛMÔïÔŽöðÑ–製J¢®nº‡Åò±yè`çò,.„ÈþRFúp´‡'ÚͤéªöÈ'¨ìžp‡K˜Xgùå&IâBkéÖ– `8 ³°$É#8t$[ÃÑÔS[RãH*d´)K·”1÷`bhŒ`„¨¢ùŒëÓŠqè;Ëh_
+îšöttº(
+vDw’§Eá£ÐÕ&â,
+=pÖ˜ç áwoß½F‚²¨ Æ\¶­#ïô
+¶<wÁ†]0ûÈ/8_ºð¯OÃÔÃvME ÉÌõ4­3Ò`¡¹F(²E~A€‘Ú¡ÇfÛZMàˆväš(5AØŽ'Ãf·¶:šé‰F(f"\sùpl|ÊN n¶AÖ‹B@A‘{ ú0²ÒöKm–NÏ~šl7'£»ü8'¼Öì3¤ó™Øº˜ •ŠR¡£2L",e_m¹˜Ôà·•€ªŠr<Øb5‹0j;V‡fë,†ìBÀµó•8a†Ý!¤(gÅQø(ynªö×îÏ[ ep>ëòp¡)"xt9
+!šs
+9ÅZ˜oàwu¾€ˆZb¹óŒA.ÁÑ9'úè‚â6GlxÉ,föñùrûih¡0¡­²°Õ¾Ÿ#Az^6LØÖŸXU9N k v§¿bÄVgÖYqJ¹ÓEN›Æ2-|M³Ù­\'p<ºH}FÛlŒ™ÆàO…HFñšû£ ?ÐkÔ’ÌRrˆ^ ŒC­YŒÒ:z×»8“iïx3>³“e9 é»$™ÇÆ‹O‹03±¼ÞâÖŽt÷¡¦5©:KõqKCf$Y•Òp‚ €ÇþðÈ
+Þƒv‹è—•ýXªÐãgÛ9üø½.ôV©\çæòK¡7= Ü£áÌ(3"”S¿üýÝÍúƒ·’…w†/h;
+ü&„!èmù¤ãÈñÂøÀbÔYA‰ñN@ÞÊ+9ô»ßÛ®¶|
+/\øŽó8«úÁjÜ(,ÿñÃ=½•8 «þXÒЙv¦òsð \}6 óiÁ@È»Ÿ¾û¥ü%Èã;VÅ —A.T¥föµ4ó$N井¯™QqfÂWCd
+<Å^Ÿ"ßX=³°ŸDáS¢“+(}€¦þº7ILç©ð¯¿`yZÐ÷+/a´~¨EJG:š3&<¯§væa´üP„ÁNr9M|zvÜÎî!}Ì3-%Üeàñ³3×>e~æfC‚™Šd¹Õt0øè?ü¶ÏŸ,|(þ̯;”Žñ'+¿Å!}þ¿ùqúÉKšÇʹþ£™›85° å>µÉg”ûŸˆ<'ý¿w€=endstream
endobj
-1120 0 obj <<
+1408 0 obj <<
/Type /Page
-/Contents 1121 0 R
-/Resources 1119 0 R
+/Contents 1409 0 R
+/Resources 1407 0 R
/MediaBox [0 0 595.2756 841.8898]
-/Parent 1117 0 R
+/Parent 1383 0 R
>> endobj
-1122 0 obj <<
-/D [1120 0 R /XYZ 56.6929 794.5015 null]
+1410 0 obj <<
+/D [1408 0 R /XYZ 56.6929 794.5015 null]
+>> endobj
+198 0 obj <<
+/D [1408 0 R /XYZ 56.6929 678.9507 null]
+>> endobj
+1411 0 obj <<
+/D [1408 0 R /XYZ 56.6929 644.5195 null]
>> endobj
202 0 obj <<
-/D [1120 0 R /XYZ 56.6929 769.5949 null]
+/D [1408 0 R /XYZ 56.6929 514.5361 null]
>> endobj
-1123 0 obj <<
-/D [1120 0 R /XYZ 56.6929 748.4014 null]
+1412 0 obj <<
+/D [1408 0 R /XYZ 56.6929 481.3387 null]
>> endobj
206 0 obj <<
-/D [1120 0 R /XYZ 56.6929 549.4516 null]
+/D [1408 0 R /XYZ 56.6929 279.5586 null]
>> endobj
-1124 0 obj <<
-/D [1120 0 R /XYZ 56.6929 521.7105 null]
+1413 0 obj <<
+/D [1408 0 R /XYZ 56.6929 251.1623 null]
+>> endobj
+1407 0 obj <<
+/Font << /F37 1018 0 R /F22 953 0 R /F21 930 0 R /F39 1151 0 R /F41 1208 0 R /F48 1228 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+1416 0 obj <<
+/Length 3255
+/Filter /FlateDecode
+>>
+stream
+xÚ¥]sã¶ñݿ“éLèö„
+)·‡ù±éòR–UOÏC_4ZznÊ9=øúi°Ï«ŽFk¶›¬[uO{‡c›ÛÅ#=K^ØðQËCU»S·åñdð):ÍÇ1bÌOR†uÙƒÎk%ƒCO¦qèóMIÊA}µ«ê¼£ h†Àñ4Öá?Aíf8™$@h<­L%èp
+¤ž‹o¡3ì˺ZÑ÷8RA¿mxq„.yeÕô ¤eáÞ…¸vp¨~kxû“Û°ªEÕlŽ»ì ¢ñ…ÁÄ„–±vW`^ŸÜ3LEb€ïrÌp:åÐã 県p˜Þò‡¯ÿúíû›Ü‹HJaR™Mí ÀÈw`i½ðØýüCÇ°M‘‡@Ÿ‚”RwÕ¦±·¶RÞ²üyu~:à c¡•Ñ/™JR3UŠŽùmiš‚ÜgÍk¤Œl^¤‰¬ž›†F9==+•I„Ž„‰N½mžfD†PB§”¨b`¶çD‚CÎbcÎd*ø¦ŽŒ³ß·MQ_´J3Vá 88ûÕÀóþ°Dby¿WfÉÊ °=c‰‚¥F‰b‹€)VcI@oŽÐǪ®iÄ.ȘÓàEê…ÑÔ)|äÀwªÈZŒyté73è@2í|#bÑs¼ Eš)^„¾ëè Ä0‡èööîÃWÏ!’ΰˆEÀ}ë!QOŒ Ö-:,Ãfä×bM΋KdŽ
+•±,PMt|˜;a¡Y
+Žzâ4ž?*’j|dlvÇ#ßx§Á†øžó¬Û[0"ÞH¬û–±5à»cU|dXžü’×çEᦠüòº~²Û>“?NLÔÔuûH^^!­ØÙ`Š/hN= )f˜Ô)r6ïûÃÎï¬~ö´°jè=§‡0xPX³Ñ$‚
+ü¸ÕsXGëCîµø¿ÊÞf
+>é|Ê™ ½Ÿjµ†œÏIÞºFxçOF»Ž ';0ÞíÀ#¬¨–¤MûF‡=£m ¥|y¨rÜ~yMƒX*5%‚ nEtŸ|Yƒ*¼fU¾Ä•WÛ» ýß>ýl ãÔù„O{mŸ;JÈûUW-nTܼڵÓEC^±šÕÀ¼nºxðù~Ñ®;Û…§ˆ%"îuâÛ¦®~ædö݇øѼtÆù´ƒèÀÐDÑ–œ‘“k„çjýÄéð¤%F0Jž!L·yÁh{Nø¹‰“lA˜é·œÙƒˆ+ˆiÕ¯rV˜-Z!3ŸVŸoÀŽZÀ§ls-]Ÿ¸˜æû>Ó¯µôafM“QU˜à÷ÓžFPCB¡Qõ[ê9keÛ*!8å+<íÑFè}¼ýœ
+=º§u|ü¤ 3ìt¹§v½g¸”Óþ=!ãö"È‘ÞæK<‹Ã—xöôÃÐS_hŒ•HÙäMõóÅN·ô\–s7ôîSmìÃÄ»êDºvZl\Û8Ájô:笉oùìP ³2ñ
+dlVÕïóU9†ãÂ3ê
+¢èêuÏ$º¾Zrôô“‹‘ÛÚ–GÁbB„½žþ0séÄaeø¨(üTŽ=þ(W>€²Úí”hKæ½ý·VvU_º… /Ú21NÅÝP¶fèi²‘æŶ‹U O~šœXŠ0;탆þ[Œ˜É±•%…ŠŽÁ8zjÛtÿ¯=&JEÊ“¨ò…ÂFXŠiºH#M¬?Ú '›ÑÄ­-ºí7üdžض³ôÌvÆ;‚á{¨©<- >Ÿ⪩†*¯öÂ8¥ž<>{÷ñ‡è±û×ßTs½þúO×ß²ûîû§vírHû››õ7zUß.¿Êïïžû‘Žþ÷gæO?Ò· ÿï¿ÿUBÐYÎÿ{Hc54©#
+™êSÊý‘ÎIÿݳÊZendstream
+endobj
+1415 0 obj <<
+/Type /Page
+/Contents 1416 0 R
+/Resources 1414 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 1383 0 R
+>> endobj
+1417 0 obj <<
+/D [1415 0 R /XYZ 85.0394 794.5015 null]
>> endobj
210 0 obj <<
-/D [1120 0 R /XYZ 56.6929 231.5025 null]
+/D [1415 0 R /XYZ 85.0394 671.4386 null]
>> endobj
-1125 0 obj <<
-/D [1120 0 R /XYZ 56.6929 201.1114 null]
+1418 0 obj <<
+/D [1415 0 R /XYZ 85.0394 641.1061 null]
>> endobj
-1119 0 obj <<
-/Font << /F37 802 0 R /F21 714 0 R /F22 737 0 R /F39 899 0 R /F41 939 0 R /F48 953 0 R >>
+214 0 obj <<
+/D [1415 0 R /XYZ 85.0394 444.8166 null]
+>> endobj
+1419 0 obj <<
+/D [1415 0 R /XYZ 85.0394 417.1342 null]
+>> endobj
+1414 0 obj <<
+/Font << /F37 1018 0 R /F22 953 0 R /F21 930 0 R /F41 1208 0 R /F48 1228 0 R >>
/ProcSet [ /PDF /Text ]
>> endobj
-1128 0 obj <<
-/Length 3056
+1422 0 obj <<
+/Length 1913
/Filter /FlateDecode
>>
stream
-xÚµYI“«8¾×¯¨è˸¦º0’X£cÞž÷¯Ý}À€›Å¼NÌ-@Ùõ˜yýbbÂD*•ÊåËT
-ƒWÿÀ«"r<R…WY8‘â«á¿ð¯6žk¾€”ç#cúxäªj/åoH~U9U‚Ò«¶}¥p¼¢€WÍü½TkUFZcòöE¾$po¢Ä—*õù
-PEáuJº³Mµ·?µÎKCË5|´ðˆ¨w|ùýOþÕÄÆt^x©ŠøzÁ/<T¾ú/‚ˆ8Q@(£x/Ó—q.ða–.-òŠˆNT \àŠÜ"ªœ„ ¢n1ƒ8¶ŒØµƒ{XÄ ¼ >,“eNUïEø/®çaÿ(rI÷âÑPJ¡y2¬tŠ=öÖ-¶’”˜d ”Ì8§ýÁóгâ'¹7 tÏ»= 3½ó—…8%ͱâl_ªˆÅ6:Å–IÌÁnI-ø
-ˆ$?2&‹&O3Æ[ƒlc=ažDªÌ!QQŸ]ùévœ6Ô}d€auzœÀ~Œnlx]âTÊ~YF¼Ì¥º‚×|›-Vò‰âe–Ï$ÎKžçKµ0 °Oq3µ¢³ùËØnˆ}Läho*,% Â*êÏÊ7ˆ âp1©£ÝgÐú"! ¤\I*ô!P„
-8¨Bðý.áä…bÆMŠc‘HNP}–˜êKhTrŠ,dÅ%<|°´ð ‚ñ­|©X)nO,܃nÒ2‡i$ð„BR
-ê¹(q²$¡GPsXÏm‘p•“å\®@Ù¨âÆB’¤çìú±Ò2òŠT{ìà’¸gÈ–ÑØÇÆ“IÌ[rœ.RèS=`èèI&=Á)/VºØÏ–¤L$NQœ0>Ï öŒL@õÄgD·CÚ‘~p\ƒÁ>3ç õ†£“µPÔòÌpD„JÚa:õy.qgÁ{>AEù‹ØÀIêC Àš#,üûƒŸ’©/ÙM^?ÏübZ–ŸéF‹~ZW—B^M3‰Zà“ˆúòø ƒÂ—S>¯×¹±xœº€&uËC±ð= Ym5¿œ
-÷¸än0’‹:
-q;œ°òØ*ƒ½fõIJ¨fûãËœÖ4A)¥íÙ‰è•óîG}ê~ˆ§$¦W¦'©L[Ü{æ!RƒC6»±ŠNß¼(n©Ìv)/(x”Þ4EûƒÂN"}"Ƹž2¤†â3sâË[’Òh—r0©ô쌺a=Ò ã÷ÚKz 3Ý‹S³+§ôY
-‚HÚC²†vG¹ŧ'zz¹úzYÇ`?na}ös$„D¤ëû'Ú ,ÕÍýôÖá»±•1)““*“=[ñ7&âF¦pÊL/xnr˧iErøúýåðx¼Kg·¼˜+èrÈí ¿ ¸3ù®lHø®÷Oº ãö˜ÇWzˆ°Ÿx2—é”H®Ï¤¢r²€ØÄßéDº‡‰IH*&ÛµØá'Ò›*XžÊ} —3‹ENÄýÔ3¬á~a’¡(³zzüR¬„K´èƒ ¶í¼×–&Í—·•n9n4¶]dx“MS×.ÓÎ5jî¯E¸>ImytïœØÖ²ÌÉ<==\ÝPí«0«{³Òò–]³!ÜWíÃÄÑ«ÝàlÔàLõ×ÎÞœL0Ãr«bî–Òóû^p_¡" ßopyöÞbX©k£ûô¬Zº¿Sæ@µš»jOŸ'«ó¾ìâºrØ­lgû.m^ä÷ö¦~/ÊùþkA¥6Q€\ÿ&T«º<›”7V½u;ˆîB[.¦®´ôÃNoÓT§ÆÑ=™ïÖÞy9Aý"ËÞl6Ÿlö– Ú£ÎÔ5ý.ZßjžçËiw³³Ê‚8힌–\fâÎÚö“£$ÙÝÐïÞ %º*ÛÙÜ’Oªº¸k=ì£w­;×Õx ùocUž¾÷º3í06ŽPžÈ •ç¢3_§F»ÈêÁñbÜ…Ý긮ÃíØ´¯£®Õ¼_›TM×µn½þà¾l¢_~Ë¿[±ðþ4Èá#L ´)ähq$ƒð” ¢Ïj÷·8çºè‘É^²o‚¯©ä‹æO%”Ç$?{ÁºêþÛéÛ
-3DL3¤riT*úuÔ7&ðÊ·6ã¹°°ÖU)lÔ—ï?îKbwãh»hÖzeâœÆzÍÔp"/}¹Ñ¢•êníÆé(Ÿ×å{s=3ÍÁâöÞYßO1ïÍÉÅÞ5/Îl
-DQim„Nw¶Ùc¨}åpYz;¾á.QXÿ6÷w­¡ vo_2fÝÙ¶ì×äÖy{YµÊU ÂfP+B†¹A·s
-S—|K¢_ü6ŸGïnÏijÁ y@­p1îÍÚ÷nÔ™¯ÑݶohqhÒ~J_ð$¾¯Ž›äl8¾=®)µ{7ÜõË ¹R¿Y¶ôԧ͊]}hNù¢0߆m©jâËûjmÞ½U_owš[¡/˜·°Ûvîæú6†›Õ8ÚÝÆEJ½*ïÕd}ÄýÛªÛj­¬É™í<ºîÚã¥oía§y|?ã°ÉK…Öâ\íUÇQ£Z{ø In_{£&</µzyô–ïu¤¡Y¯È¹ÕYµ:Ne]{¢:?念xÝiYõÚì¶XEçÑÚŠ×õöäìÔëEû‹pÚ=oËÒ:3_j8ûû- àt JãÉ^ٕݶânrØFó_¿e’Y2 ô“]úU.o…Šþ~BÍýYÄçùò?ÿ5õùonÆ¢ÀÏžZTò7¾dJÑ$_5ÏÿÃú^õ<šv0endstream
+xÚ­W[“ªH~ï_aÌËê:B](.qbPlñ.
+^˜AQQؘÿ>¥h»³—8Ñ•·/³2³²` Ð?X"<ÃKH* Ç
+5kó}p‡Ö¡š¤ølV…×Âh,:ž7Úëp[·Úq¯½Q %s½†ÂŽÃÞ¼ª`=Aí,ÔŽ'›
+)ì Dš&›ÉèhvTGiél'#Ó9šEÌJ{œxŠBФ›,=ÇÑ;ÆŽozÛÂ>˜ž4H¼6ÞŠÖo‹þòYbc"ò¥ß~½Úò‹ö·«åßÝj¹4Ã0…÷lx<:«šZËàQp©süV„øÁšXoßï³/ìµB»9ê¢Qò½¼8þ¿šE!b$‰pų(*P¥@­+—T×cù”ø¬êû$/
+ 8îcbE裋ё•G”
+iÇ!€D.÷upsõÎ)1„§#.e¤#0l)ð;ÇÆ –uú•›_Cu T„b ¹3¥mj€“$œ3½¬ï®~Á}ƒmïPI‰¨C¥ŸžŠk¯šïNñèe §ÊEíC‘†FÌG§Ám>©!A*GëÛ¯X>ym²sûw›ªn¤À¿Y9ÕŸìþ1ßq*”óÙ$'YñCSRA¤|Ë+Úƒ1GÊí0ßß[ôFà@ùä¯Î]ÓGί_@ÄQtÊ·^à<<P…”£ õ_Œ~9Ž—$Jbé%~.«nùK$ž¦Õ÷çÒÏåüK¢òôò#Òk¢þøâäéý„€tw|æ9·ø"ñãÁy[¿Öõíû=ú›·;ÿ°Âû‚žL\"m>NTà=àts…ÿ
endobj
-1127 0 obj <<
+1421 0 obj <<
/Type /Page
-/Contents 1128 0 R
-/Resources 1126 0 R
+/Contents 1422 0 R
+/Resources 1420 0 R
/MediaBox [0 0 595.2756 841.8898]
-/Parent 1117 0 R
+/Parent 1424 0 R
>> endobj
-1129 0 obj <<
-/D [1127 0 R /XYZ 85.0394 794.5015 null]
+1423 0 obj <<
+/D [1421 0 R /XYZ 56.6929 794.5015 null]
>> endobj
-214 0 obj <<
-/D [1127 0 R /XYZ 85.0394 717.5894 null]
+1420 0 obj <<
+/Font << /F37 1018 0 R /F41 1208 0 R /F22 953 0 R /F62 1352 0 R >>
+/XObject << /Im2 1341 0 R >>
+/ProcSet [ /PDF /Text ]
>> endobj
-1130 0 obj <<
-/D [1127 0 R /XYZ 85.0394 690.1986 null]
+1427 0 obj <<
+/Length 2465
+/Filter /FlateDecode
+>>
+stream
+xÚ¥kÛ6òûþ
+¡Àò¡VDQÔ£p7›t›ë¦Íº=¤M?heÚÖU–\KÞ­s¸ÿÞÎP¢¥w@°Àj8g†ó"-¼þ„—© ”yì¥y¨P(¯Ü]…Þæ^] ¦™[¢¹KõõòêÙK™zy'Qâ-ׯ,³LxËÕ/þõ7‹ï—7ogóH…~Ìæ* ýÅ‹ŸfBqw}ó‚¦^ÜÝðòf1KcùãÛ›û™LR«r^D÷7×_òŠww‹ïn¯iðó›»›{žXÜ1ÏÅË™Èü7ßGK{ûêîöîÕì×å·W7ËAM×"”¨ãïW¿üz+°È·Wa óLyO0‘ç‘·»Š• T,¥ÅÔW÷W? Y³tÊ´JfÊ¢t¶Q4e[•‰Œ¤±mWm½b­;]¨®¦ñ‡¶ÑO۪ܸ.ªš ¾¥ïcQW«¢×̦hV¼¨ª™’¸öÇCÃöƒãTÊÿé%ZuqûÏs~ý–(ëJ7}€f]ç" D–§Fð·ºÛ·MgäËbWœ`é2EÜ
+„YT»ã•ôAžçST¬Ç”ekÖ²}_¨zöÀQVë­ÛöX³§m‹Gv™­›Ko>§
+–Ë¢t&BÿØ™Qâ—mó> #”§ ÅSÕoiÖh‰(âd‘³¦GQ‘à G($NUM+«¶)êúDóµ^3ƒc3Ÿ
+JÒJ¥”‰‹j«!á( ê÷0‹BÿD0Í«õ‰³"ÔÚǪ ŠÁ¸JÙê Üó³swPšŸá?Ic8Ïö°êP«/'³&Mš±W
+ë‹ï£(¶Å×DXbO?´¦u±þ
+^!õ™l¹a°iY+×j£6χؙlN(…)¬^U%„+f˜0£Äh[‰F“ãmƒ{C6‰eä¿Uø=ª
+>!­W"Êš°‰=æ:à>Ø Mgs&Š„6gIiÌÀ˜ØÚCèÛ‹bŠCÇäŽþSnDh*.«jœ§Ðt'Òs+úgv Ø‘¨<ɽùx;ø¼.æ¼ñP"kt$<2N"÷.'9ô‚, —,8Þ0¼¼dšbW•|ÉÂ+Åå=aqì[ha-Í=T ìÇ6ƦD8Ú6T EÑ¢£B…a åàF€7
+BB'TÅÄû÷‡ZÓ¬ñ@À–Û¢Ù0® ÔÊʃTcavlr ׳¶ØåhkÂFSœ|(ÊßµZ„wÒôŸòÛ©Ëߊ
+îpc4ô ú@0–O‚Z#yé+`À¦n/ ÛK膓<·‡>Î붫Q?ôæÜ?aw>¦§ggÜôù©@ŠŒÊæ5¸JIMUdõ„sòò³¬¸Ä“}
+cT‘öí/.v“;8¢[#‰'¤Ñum:ùÄ_4SÞ5ö¦É¸|~ààu“®˜;¹Þ­/½jª¾*˜Mǽ!-¢¡ÔÝ_¶4éÐÐD¶?u[Òág
+&‚©~þïfirÜØ Y-ÜdÅ*òkHè´æSÙd2(þFq×t,ì„›ýƒHú¾&@¿O=€‚yð×…‰ŸÂÁŸý#Æx«
+endobj
+1426 0 obj <<
+/Type /Page
+/Contents 1427 0 R
+/Resources 1425 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 1424 0 R
>> endobj
-1126 0 obj <<
-/Font << /F37 802 0 R /F21 714 0 R /F22 737 0 R /F41 939 0 R >>
+1428 0 obj <<
+/D [1426 0 R /XYZ 85.0394 794.5015 null]
+>> endobj
+218 0 obj <<
+/D [1426 0 R /XYZ 85.0394 486.5796 null]
+>> endobj
+1432 0 obj <<
+/D [1426 0 R /XYZ 85.0394 454.3582 null]
+>> endobj
+222 0 obj <<
+/D [1426 0 R /XYZ 85.0394 412.0822 null]
+>> endobj
+1433 0 obj <<
+/D [1426 0 R /XYZ 85.0394 381.7503 null]
+>> endobj
+226 0 obj <<
+/D [1426 0 R /XYZ 85.0394 150.1125 null]
+>> endobj
+1434 0 obj <<
+/D [1426 0 R /XYZ 85.0394 122.4306 null]
+>> endobj
+1425 0 obj <<
+/Font << /F37 1018 0 R /F22 953 0 R /F62 1352 0 R /F65 1431 0 R /F21 930 0 R /F41 1208 0 R >>
+/XObject << /Im2 1341 0 R >>
/ProcSet [ /PDF /Text ]
>> endobj
-1133 0 obj <<
-/Length 2753
+1437 0 obj <<
+/Length 3008
/Filter /FlateDecode
>>
stream
-xÚµ]sÛ¸ñÝ¿BÔŒÅàƒÉÉ“/¶{¾i×ö¥—{ EÈbC‘
-IY§Ìô¿w LgÚÉ]2c,‹Å~cñƒÿ|«Pe"›%YƌdzåæŒÍžaîogÜÒ,ѧúéñìݵLfY˜)¡f+W²4å³Çâ·
-³pXps÷IÍ"fÁïwwïç2  qsKãO7·—eóçŠÉàÃÏwW÷„,«‹ËOsÎypqûáÊ.¸¼} àúêbžDÁã¯÷Wóß9»z4ñµåL¢_Ï~ûÍ
-Pú—3Ê,g{ø`!Ï21ÛœE± ãHJ‡©ÎÎþ90ôfÍÒIëq
-©Ä„ù"î™3˜åRÍ’8 •ÒØ/ CÔXAÂ,Ž…Au×éåB×ùS¥ç ÅXpÐÝûï¾äUYä}ÙÔ'ä‹( SÁ·ŠüöŸ÷oO%iÈWÿ“õ¸³,Ž¦­‚&À4bâm^´Ž/ ºǬÆUŒ‡±àÑ`d!fƒ9V3%B™€ðJAdJNF¾E] eÆ
-¼bÜÆR€ä†â#c¸*\Zx²D$0²0ÉW³¯3²(Ë$y°Ñu´A¼»ÙˆÙeÍ<¥ã…ÏÙ(¥„9o@ûKT`m£SSC`ˆ$ šŽiЯ-âË\°@ãŸCGSUÙõº Ù²väeG=—,ø#ßl+MSyk9½ÌE``AbÊ(njÂoóv¾ˆXЗË]0äåù‰mÓô„òıX©j 8
-h
-MoÓGD* Eš¥3?~,®0‚ãLA`)þcQª\
-sE½*·&3BGàŠúh­òS×صP˜õ¶×VíEÊÈCÝ:
-šŸh{ŒnÓ¯ºxp­'´•+;ö4‚ÂptÙI+‹7=&
-~å]·ÛØÖ5w”N%jhGÑ‘_Cã“[Cƒõé3*@‡÷SUö.°§êNÀßÇuuØÂ7ÏCѨ۶1úOFˣ㠟uá/±êä.? ¹ƒ×¤W°aMüÊ VhztÔG²e†Á³k÷}«Ú¼g1eª>,ÕE¹„\ÅòÂRªj€v§0Âhrœ£mpo(%4³ŸYÌîP臚–ˆÐO¸ˆž‚³bBº¨D”3.°&BôXèà÷yua¡Ðt[Q$´8kwÉiµ1°uNè› eSÇ^Þ
-ASþæåÈ?Í°Cø+oG(¦ˆùx> >ãQ(#%üë‘Pq˜%‘r¯Mà^ÆðµéŽ6í¶Û¦ímW¿~iûWôÀp•æ1(†\-1Æ «9ÌSAGÜ;šÈÍM
-'-@È£i7ñ09(+3@unj @&sQØN×.¢äz=3.™TMóe·í&_’núÓ[R^u¶ëÝu¶­éíæ.e®GÞä_,ù×nËñÎæZávžÂ‘_ÍuS»›Úé.Ë|K[¦ƒ>t½Þ]¿ŒäצT ‰¦ÜS[^Âê{N·Pë>Àg4XŸÁå·#DS'tÿ"-Ý… Ã¼e<¸¿þ@ÓКH‚
-½N–Üv€¶7giˆ»¬ìjr‡ó)ï—Ufï ‹®,4!º!¬áƒ®“
-¾É¼é`rNBV€®T·S˜šøŒlÞ:¤}­ ÅcÃYw‚õ´ç¸ç9ºUBó2>eؤia»•Ù3 ä§tGÚÁ÷…òŸ2¼ðœxœ ;–M,å–¡¡5My©¢äàdó
-óv›OÔh¡ë]‹fF:·ïÙÐæÀIŸd’9oE°×&²9`ì*‚¦*¼pN1³ý´~--8tÐqæI ÷ aÞ‡‹/I‹Y”$ÁG³©ÙÝ6íH<ꬄó @MXŸP»à‰–*ë¼=]•?éʸØ…',L’T‡)öD¶à«8øR7ûš@ªÊrí»¾…ÄÓ[rð9U…§]OX¯0ŤŒƒ\À_Q4»Ýg‘†ÞL
-m,MµÏöêÞû•p ^Œä¯8剺?ÀAVºVê"„¾õUçÏX•kdýêWÊæ»ûŸr2¿P¾õ¬ :’rr;6<þðO°ã…!JB™¦rZr¨ç(¹¤BÑ…x%»û±vBøÿS½Íendstream
+xÚÝ]sÛ8î=¿Â/7µg׊HêƒÜ»Û7M³Ù¶iš8mÚÝ}-&ÖU–œHNšüúR–l¥íL÷á榓ŠA
+ˆÆ> RÔÙyˆÙ°. rŸäŸíœ‘V@J
+»îZú–4×Æ<˜³…yvA„†¤àyižiD
+d…§°GûCÄIVú ¬¶a4ssijt
+Ã<©jØðD•'vE½Hj7ÒÄ ½f•%E–U„ û_$Yá5f£Œ=¾™!j>”k0`³ZA2Bu•×4DÚ‚æ³¢ª5ÂË+žP¬o‘‰å:OiÞx8“b³@œŽNÎ&ohn[ëm®PÃ=n˜YµEjãKÍ _ÂcŽ¤± 8 Ñ7æ +&ÂŒ jŽž‹äNo-x{Ji ²—yŸe5aTÚ0dŸ
+c驆¬#ò§ï‹äÚz¼p§]aéðPÙÖ(6'ÞV"ºJôÈ#;É¥76ýƒâYQY%>òê:·aþû›üÿDšbÿiêû¤ s"SÂwÖ}ø–ÆEF±Tþß•'×àkè.z… rAËaÜMrá5í ð&5¸•ÿIEy¯ï ¢‚[6Ûuvh…|ܤ,žYZÌî[öùƒy1ð|Îd;1
+? Äˆƒ„†Š¹¦±‰…𜭳<Ý'†—å›]ØMäún„Y°nè`J
+6«Vå­( 0Ò¶ÙÛbÍ Ö§ s”­\gÚ¥)¿|XÕ– Aé¤=W®0ËgeAð?ýЯ´EžéÏÑ®€²-K—.ñ-Õu’å¬b˜œXDU®p +‘«¾PŸ¥´ŠoØ-vz,ßbÕ›y]ñ§\üV~+{)*
+¶ÎMQ‰E˺.—Àïœ^mQn$ßu ÌZ$é4ÅT‡ÉXò¡.’™Q¨Ê0e顇+[z Ø–[îÊ¢¯ZÊ:"’§EUéy?pi $wÕl¹²ÊGâ%±Bg
+î)ÚË{[²66CÇkÌéz’V¿ôÉÈ¥Ìñ•£ûöî*âæÆ
+cKðˆ:qjíÐrÙ¦¥*°(¸¨3_±-ÿ…!”h‹ur¼Œ³¨ÇB(¦<!ˆäÔnóŸ{‡žôcÕ>óþDÁ ßZ¬¹) a×J“ÂçX¾³ØÆ(˜ø¬hf6ìÖåí!Qœ$¤Š@à7óÕù
+ês‹þ¯Š±ÒYŠã\"‚ËI×!Ñz¶ÁHè7îøk©˜î’
+¶\‡?í:$š¹‘–IjŒbw_óÃo‰'[â=!˜L Âï—
+ `WëbŽ?ɳºi¶€j  « Ú%.ËA¬IN‰É„f2ýϺª·6B½=«¬ska×¹Ü-#ÛåjE@LFø¬æ ®10v›;4ã戀Îfž M<úg–-¼%PP1$à}xÅòë\ëíVjÀ¸ÆÁ@ÀéI'1_Ú¹Ûë ÎZMP‡>nã›h7voSÝäª1° Õ²#±¸ÛaHJO©(êp´ÓŒm°¾ÅˆžˆTÔå$¡ûM_K™+‰N¦¾¡‡¦ÏÞÆßÝ~‡jK•®±ö¤"˜€TÇÀãÚ[ì(¢Áú' Š<… ¼ÃŠÉ)XØljo¬z²&–¦<õ kã
+—s]U„NŸû‚|- K
+›>RÛØ-N ƒÆAzKè‘ê«d״̆wI¾¶CÇj†"@ßõúz/(\Ä!ðþâ„w
+æáp`Û 1ž`>)˜“» ÇAéæñOl (‹GŠJ%ÁÃ0g#ºS.@ÐèÛ@Ëym>x跰˧¸é‘÷~‘Í6¶s›¯B]æÂv› ^Ìþ]=š زmzƒœ‡î\
endobj
-1132 0 obj <<
+1436 0 obj <<
/Type /Page
-/Contents 1133 0 R
-/Resources 1131 0 R
+/Contents 1437 0 R
+/Resources 1435 0 R
/MediaBox [0 0 595.2756 841.8898]
-/Parent 1117 0 R
-/Annots [ 1139 0 R ]
+/Parent 1424 0 R
+/Annots [ 1443 0 R 1444 0 R ]
>> endobj
-1139 0 obj <<
+1443 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [349.4919 62.7905 408.4801 73.5749]
+/Rect [411.5778 307.0154 489.9929 319.075]
/Subtype /Link
-/A << /S /GoTo /D (ipv6addresses) >>
+/A << /S /GoTo /D (man.dnssec-keygen) >>
>> endobj
-1134 0 obj <<
-/D [1132 0 R /XYZ 56.6929 794.5015 null]
+1444 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [55.6967 295.0602 134.1116 307.1199]
+/Subtype /Link
+/A << /S /GoTo /D (man.dnssec-settime) >>
>> endobj
-218 0 obj <<
-/D [1132 0 R /XYZ 56.6929 285.3652 null]
+1438 0 obj <<
+/D [1436 0 R /XYZ 56.6929 794.5015 null]
>> endobj
-1138 0 obj <<
-/D [1132 0 R /XYZ 56.6929 250.4165 null]
+230 0 obj <<
+/D [1436 0 R /XYZ 56.6929 439.2963 null]
>> endobj
-1131 0 obj <<
-/Font << /F37 802 0 R /F41 939 0 R /F22 737 0 R /F62 1062 0 R /F65 1137 0 R /F21 714 0 R /F39 899 0 R >>
-/XObject << /Im2 1051 0 R >>
+1439 0 obj <<
+/D [1436 0 R /XYZ 56.6929 409.315 null]
+>> endobj
+234 0 obj <<
+/D [1436 0 R /XYZ 56.6929 215.0565 null]
+>> endobj
+1445 0 obj <<
+/D [1436 0 R /XYZ 56.6929 187.7252 null]
+>> endobj
+1435 0 obj <<
+/Font << /F37 1018 0 R /F41 1208 0 R /F22 953 0 R /F21 930 0 R /F11 1442 0 R >>
/ProcSet [ /PDF /Text ]
>> endobj
-1143 0 obj <<
-/Length 1018
+1450 0 obj <<
+/Length 2621
/Filter /FlateDecode
>>
stream
-xÚ¥VK“ÓH ¾ûWø°»
-÷öÓÜØP[!›ñ°àà;Äà×ÆÉ üûU·ÚÆ™1Ãû ~I-}ú¤jæRø™+BE"Ý(‘DQ¦Ü»Ú¡îgØ{ã0{&ÓS/SçÏ×"r’„<tÓýÄVLh37Í?x¯þZnÓÕθ¢ž$~ Bê-¯ÞûŒ1o¹yµºÂ­«Í5^¯–~$½ôf·‚ÆB*@/±šëíûÏ]ßl·ïv¾ˆ¼Ö”/×k3ñ?¥oU:F2–Q¡ÃøÏùð‰º9ýÖ¡D$±r`B KîÖŽT‚()Ä°R9×Î?£ÁÉ®QCO‰˜¨˜G3ðqæ2F¥ø~*!¡àÂà§Cg€¥
-žœµð|c
-‰”ŠÌ˜ x(`hÿ¼RrùÇä–ä ™™qr‘ÊÇ´`„>÷CùÅp“R÷ßpÚ~·éN§€"Jäq3Ÿ{@uë'ÅÌ[‚Žýà·_.?u2""ŽùGÉ{ACó$œ2Ù=Ÿ8O]ÿŽ|ƒKendstream
+xÚ¥Y[—Û6~Ÿ_á·•÷Ä*EêÚ7wâ¤iš™ìŒÓžlÛMÛ:‘%Ç’çÒ_¿
+Ò‹†Ú¿µW[îH´;;fÛœfÓº>²ù` ÜÖÇ¢Ýíé³:íï0&IœWjvõ©\“ˆJß[†üpÐ9÷‹êl¡óÁÛÅÇшíÙÌÖLÉ·[¹uú¬H‹`u±W4IJÚåÕÖ~·ž ¸‚œ¤cQ1_N‚éÃ(‚dÄ-›¨ÁÀQ©·ì+cÜ
+0®±5*¾Ÿf¢7ówcaŠ¨@"8JçÇõ¥FϘ¸Ôeicи{õAó¶¨y94¶@ÝÔÇ=ÇiÞh–áøÆV»+ÚƧ4ÐKv—³Pú
+ê‹Ù®xeë÷ËkÈ÷=“Ì“
+â¹¼YÌ—‹1³‰Çynï®ûdž«k4(§ªÀiÖå*Ô2õcɹ
++X4B³ä‚º,!-›‘¬‹ËDD‘1›Y
+ç¾Ýa/ƒjôêD^œµõ¬û"Nˆ Ni°0ŠŒ<KÕ–X¨ž’8(&¼„ɆHºcIëºÒvM¢@y!ÂCþÔüÒÓÐ;5NnNƒ6WŽØÒ•{“B5WnˆEÖ¸gø"ñ³0ƒrj$ä'Øóºj`Û#Ö‹b?ˆ2fýÛèOqŠAê{.ĺŸ*(3±Çœ'Ñu±uÍý=ÀB; þ^·»zýmo.ñ(Ö”êÜ!ÁSÒ]uáaH\ƒ’ó”tTIà=Õ'›?5gÒ–—É×–`Û;]J$¾ˆ£MöÖ8-ò³$‰Á4~*Òüß#›ËüP…áäŒ 3F©YïM}ìVfíÜv™©©-ä”羇ì'ý0IÂ~ô˜¹•òÓ Ix3& eªŒZv0\A™=$½’ÞGãÑ3•
+$Ó1‰(fHq§ú77 G!Å9Êœã(ds*Œý0RV÷û6Å
+™­Çj°~<$ÁŸˆü‘™2X±a,aD¹#C¹9rÐY•(Æø$* †ï®äžÑZ¨dÅæ‰äYi¥¦ƒˆÞ´€¹#oO]€xŽ5kw•õnU]ÄhŒŠqÄÑÅÈÈ…ˆoqT¥ñYnlUˆ9MFý"8éÇÞ‡÷/é½aáÓˆ)öù'MÃ+w/À1ʾ‘×ôŠŒ“Æ63ªõ‘³`K#܆U$‰ý,•ÙwT€
+ƒ*k+\~:("õ©¤žž›8½lu…›ÜîžÙ¦¶·ƒsŒ¸M«®sDekF3
+ÚÄs°–0X›>ÜÃd5Xð`nªkJEæ¾ áèLS6 òÕ΀ ˜Ã§€†U‹eÍ܉p€¶„=¼;çÌnÎ>vÀTÏ]*’ÊÌB»3X|K ~"€;²®­#é'Aö‚m±×#c)•Zv¼F#ÐŒà>»!µÇ‘:øDÄá9PçÀÂ!’~h}Ä+PV
endobj
-1142 0 obj <<
+1449 0 obj <<
/Type /Page
-/Contents 1143 0 R
-/Resources 1141 0 R
+/Contents 1450 0 R
+/Resources 1448 0 R
/MediaBox [0 0 595.2756 841.8898]
-/Parent 1117 0 R
+/Parent 1424 0 R
>> endobj
-1144 0 obj <<
-/D [1142 0 R /XYZ 85.0394 794.5015 null]
+1451 0 obj <<
+/D [1449 0 R /XYZ 85.0394 794.5015 null]
>> endobj
-222 0 obj <<
-/D [1142 0 R /XYZ 85.0394 769.5949 null]
+238 0 obj <<
+/D [1449 0 R /XYZ 85.0394 544.6974 null]
>> endobj
-1145 0 obj <<
-/D [1142 0 R /XYZ 85.0394 749.4437 null]
+1452 0 obj <<
+/D [1449 0 R /XYZ 85.0394 516.8643 null]
>> endobj
-226 0 obj <<
-/D [1142 0 R /XYZ 85.0394 622.33 null]
+242 0 obj <<
+/D [1449 0 R /XYZ 85.0394 467.6389 null]
>> endobj
-1146 0 obj <<
-/D [1142 0 R /XYZ 85.0394 593.7503 null]
+1453 0 obj <<
+/D [1449 0 R /XYZ 85.0394 439.6503 null]
>> endobj
-1141 0 obj <<
-/Font << /F37 802 0 R /F21 714 0 R /F22 737 0 R /F41 939 0 R >>
+246 0 obj <<
+/D [1449 0 R /XYZ 85.0394 266.4633 null]
+>> endobj
+1454 0 obj <<
+/D [1449 0 R /XYZ 85.0394 238.4748 null]
+>> endobj
+250 0 obj <<
+/D [1449 0 R /XYZ 85.0394 132.4384 null]
+>> endobj
+1455 0 obj <<
+/D [1449 0 R /XYZ 85.0394 107.4147 null]
+>> endobj
+1448 0 obj <<
+/Font << /F37 1018 0 R /F41 1208 0 R /F22 953 0 R /F21 930 0 R >>
/ProcSet [ /PDF /Text ]
>> endobj
-1149 0 obj <<
+1458 0 obj <<
+/Length 2222
+/Filter /FlateDecode
+>>
+stream
+xÚ¥YKsã6¾ûWèHUEX<ø<*¶&™lÙãÈò¦RI4 IÜ‘HE¤ìq~}ºÑ
+"¸wóëÝüöãõt&î­–+Îï®ü´¤ñíünþÃâvqk"’‘wýãü~µ°«¾•4¿ùßT;7´ts÷@ƒ‹ù4ò½Õãrñ0ýcõÓÕbÕÞ¤[Á^ãÏ«ßþà“.ýÓg*‰ƒÉ L8I"'û+?P,ð•r”ÝÕÃÕÏ­ÀÞªÙ:j=0€T¡1Ÿ!Xr`¿ a¡’ÊÚ ¶àœ{×Uù¬MQnèªëcµ§ÑÝÃÂÚµ©:ŠÂûÃ)²÷H|2“1‹’$2âWÓDzfKàåö·Ùõw8 ½×êD´ÿŸê†F¥Ö¹å³üin¾—–D0gߣäùr~K´ãTÄžÎ*ó›Ã;*x¿luéÎÔ4ÈÌ뢲 EíèûÃN7Ú*Öò››Ã5ñb­-ábÙ6-@„RÜ{)v;mÓgM£'­Íª°Ší«g¼.¥¥˜3pp~¤ ïóöA)ò—6Œç\¥›v,õ- [Й¢{¿îb¢1|c:GOš~7ºÔÇ´¡Bòš´ËÖj}¼ôÄ‘©¹—ëº!m_5èE Tò‹“P´ü] U—(ý M")üZ*žx§Z·Jv2ˆEQ‚,QÖ§C†9ÌÒ16V~ š§ÆÔ0¸
+àwMo¾ì³z„­ô ¿`l”V³K\p­üwàZ2Ha1¾@:›%•1RÚœHgãI¾ x:\°Yt É ƒ8… ’@MëºÊ
+ÂY»ÁºÇ2ô-‘Ïmc œ
+çö)`ô²-²­e:Õ±©iÖÆnœ#c¤òyDp´Û©>ƒÑÁjkˆ¡ô¬@„å|§îŸ;RŒQ'ýÐ++4¬ÙÊI=‘&r)­í/ñÚ qÚ5D®Öô[W{MmPÂMº£¢‡Šäír"튵nŠ½¶‡Ù§6ºYI9ÖóN©º¢Õ´ËH.¢Ô:ª›Ë!aW9@½‹²ÅÞ±§°³½©Ý“:4¦ŸU™éwWÊ‚°W˘…ƒO÷«O«÷:ƒ!áä­Êg¾Ï]yX•0þ
+
+h!jˆQÈØpCkÙÙ®§ Eô·6
+ŒÁÒ¡â®äùÌ€çÒ aÌ ÌwQ¾ílÓù±$í{ïœ>ØQãÃÌU:®3[W'W¢P?ÒÿP­bHQ‘/'aÀ „'øŘ֎› –½OÌ-û¬ÇO_˜Þw.¯ó ³NõIh‚εñȈ¡5êI¿øÌÝ2}]‡ Ym8ö¡^ ¿®œÇ[ïù×ñ»ÿoøЇƱ×\F1ócb•BÅe|¡¹ûÚ©úßúQyrendstream
+endobj
+1457 0 obj <<
+/Type /Page
+/Contents 1458 0 R
+/Resources 1456 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 1424 0 R
+/Annots [ 1467 0 R ]
+>> endobj
+1467 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [379.778 61.5153 440.978 73.5749]
+/Subtype /Link
+/A << /S /GoTo /D (managed-keys) >>
+>> endobj
+1459 0 obj <<
+/D [1457 0 R /XYZ 56.6929 794.5015 null]
+>> endobj
+254 0 obj <<
+/D [1457 0 R /XYZ 56.6929 769.5949 null]
+>> endobj
+1460 0 obj <<
+/D [1457 0 R /XYZ 56.6929 748.2119 null]
+>> endobj
+258 0 obj <<
+/D [1457 0 R /XYZ 56.6929 682.7685 null]
+>> endobj
+1461 0 obj <<
+/D [1457 0 R /XYZ 56.6929 651.6058 null]
+>> endobj
+262 0 obj <<
+/D [1457 0 R /XYZ 56.6929 598.1176 null]
+>> endobj
+1462 0 obj <<
+/D [1457 0 R /XYZ 56.6929 566.9549 null]
+>> endobj
+266 0 obj <<
+/D [1457 0 R /XYZ 56.6929 448.4378 null]
+>> endobj
+1463 0 obj <<
+/D [1457 0 R /XYZ 56.6929 417.2751 null]
+>> endobj
+270 0 obj <<
+/D [1457 0 R /XYZ 56.6929 351.8318 null]
+>> endobj
+1464 0 obj <<
+/D [1457 0 R /XYZ 56.6929 323.6339 null]
+>> endobj
+274 0 obj <<
+/D [1457 0 R /XYZ 56.6929 230.1472 null]
+>> endobj
+1465 0 obj <<
+/D [1457 0 R /XYZ 56.6929 190.6255 null]
+>> endobj
+278 0 obj <<
+/D [1457 0 R /XYZ 56.6929 125.8181 null]
+>> endobj
+1466 0 obj <<
+/D [1457 0 R /XYZ 56.6929 94.6554 null]
+>> endobj
+1456 0 obj <<
+/Font << /F37 1018 0 R /F21 930 0 R /F22 953 0 R /F48 1228 0 R /F41 1208 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+1471 0 obj <<
+/Length 3064
+/Filter /FlateDecode
+>>
+stream
+xÚ¥koÛÈñ»…€ÕD,—ä’Ëë'_ì\rn×òÝáp¹4I[D(R©(ê¯ï¼–™F-x‡³»³3³ó\E-<ø§F»^„‹8 ]í)½È¶Þâ æ~¸P²fe­Æ«¾¿¿øë» ^$nùÑâþqD˸ž1jqŸÿæ¼}y{}·\ùÚsBw¹Ò‘ç\^ý¼TJ9—ß^_ñÔÕÇ5ï®/—qèÜÿtw ˜8Ñ>lSJvÞÞ¼•uRŠÏžöÞÞ-ƒØùõö~©ŒóéæàdvýÓíí'š½_þ~ÿãÅõ}/×Xvå(Ô¿.~ûÝ[ä ‚/<7HŒ^áÃsU’ø‹íE¨W‡A`1ÕÅúâŸ=ÁÑ,mÓ¥Œ«Ï(ÓW 3ÑÚŸhS'nøiuýåJyhñÐmš}Ù¥]ùµi‹ý×b‚9t7Þbå×6ѹ_&¾Ó,WA;mÑ1pØñ˜Ö2Né#êßM-Ðc³gàîÝ[@ÅP·_çÐv–\¶±‹·iYwE ¨â `’Èy*êbŸvBµ;
+Sx©ý&
+Ÿ¸z
+(sáÀecàI ö„&rÓ*†Jü‚BÁ‘;/ÂPFQTù3XÊ:É[¸²”©t·+Ò=Î ¥Ý„I‰á3¯.¸¶ MzJ9±†|шJ)Àr”Э´­l) mÎKeK”NŒ“xqÖöÅ!•:tÞ7ÇB0ýLß/6ÂSÆ ];;.³‚ùÒp0Þý©mm8<xŒ‚öF½ñ&•ð#ÑðYIùp:ë”Ïú$¥…ÝZŠ‰Sksb²Cɼ áÍ©ëBŽá¾
+ W»¯=O¿Æ7o&º« vC†“¢ŽíöÚö¡ÚwéSÃÜ¡ ²?v¨$” ¨Öc{÷¨\7Š_×|c«DmRò$€>\½ð‘uÔˆº4Ʀ;ˆÔ¨V#m!"9¿©½:·clënl–
+S™åš0¶TÌÏ%ôhÚЭfÛ‰-J!•™ïú¾2óo…·¶­ºü¶$U!, G y×ëoÔš,pM–ö —ʺ—²:JYËRã÷F¤·/»Žì@)éŸÕÐ6·éVÖå¥48]³—cYˆ™¬·iªÜ†câä(M÷6®¹?‘ûõqÀåkßIgãæ§*'Š!äÊbßB&kù‹
+¿ÿðñŠ¡„‡œjÊÝFœ,Ô¶j m,À¬1;Êóïõ7~öÊÊV6È<”räAb+€l¡î¯o¶‘ź_ÔΧVßDαèoË oò9Rü6=Ë_ËæÐò #*öœ
+AÕ‘/=4TE‘1ýoXJ~Ázé×¼ýi×AÏ3üŠ×v»fÿrƒ%ÿ°%C_(€o銿oØe|‡y‚dC˜ÀYc=—Ú·¡"\ÀG^`ûV“)ÂgÊîJ;ˆ(Û–u^ì
+øC—·à°
+¹¹»²½ÎFX:N:!ÈG«'[;懪¯7@ä÷ë´ƒûv|!³A~ÒÍHÏR€~-³b¾œ”¨¹(áeSÓ—º9Öòô!9÷Øì¿0ƾÊ}ˆB6¿ÃWÅPr·>Ô¼jýö’1V_„:g“)ö,i3ÀÑ¥2MÑ¢gÏ$¨5Iʲ‚ò™ÊÜÄùf"ÜJׇó|k0w¹TÎõ-Ã`L;K .:u•vòXÁþð/=é“Ð`ÝÒže&DE°þªx(©]ìßËúðm¶ð¸†®Ï®û—¥ÆX’7Çvò 1Á¾çîK¿ŠCÅ?eÏü†íõ?Sÿß¿˜ÿµ ŒÝÀø1|ìä¹êË
+î'çœ÷?­?gý?û”ƒendstream
+endobj
+1470 0 obj <<
+/Type /Page
+/Contents 1471 0 R
+/Resources 1469 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 1424 0 R
+>> endobj
+1472 0 obj <<
+/D [1470 0 R /XYZ 85.0394 794.5015 null]
+>> endobj
+282 0 obj <<
+/D [1470 0 R /XYZ 85.0394 769.5949 null]
+>> endobj
+1473 0 obj <<
+/D [1470 0 R /XYZ 85.0394 750.8067 null]
+>> endobj
+286 0 obj <<
+/D [1470 0 R /XYZ 85.0394 180.7476 null]
+>> endobj
+1474 0 obj <<
+/D [1470 0 R /XYZ 85.0394 140.0669 null]
+>> endobj
+1469 0 obj <<
+/Font << /F37 1018 0 R /F21 930 0 R /F22 953 0 R /F41 1208 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+1477 0 obj <<
+/Length 2492
+/Filter /FlateDecode
+>>
+stream
+xÚ¥]sÛ¸ñÝ¿B3×™P3Mð›™¾ø_ãK›¸±Ò™Îå ’ØP$CRV”_ß]삤dÚÍ4£.‹Å~c‰™?1 B;LÜd%¾8"˜¥» g¶¹¿]¦Y¢Å˜ê×åÅÕo^4Kì$tÃÙr=âÛN‹Ù2ûÃòm!ì9°p¬ûw7ó…8Ö/BðÙ œ›s/²þ}¿œ‹Øúðîp<ûðéþþƒž]ÎaïÀµnÞ^ß/o?Ò´Ï|¯ßük.„°®ßßܾ¡©7ïy§ßn¯ç‘o-?}¼}˜ÿ¹üýâvÙë5Ö]8*õõâ?Y&øý±½$f8¶Hw¶»ðÏ|Ï3˜ââáâŸ=ÃѬ^:iKáØ®ºÆtÅ l•{bÍ ±CÏõk‚u„ã€=Õ¨¯û¼Í;Õ¢rÀÂùÙ-ÜÐvƒˆ<ñ Ô|á‹Èê¶ ¼}øªÌªáØʪt¿Se'»¼*izMs‘•—
+S€ Ì>_Ô‘HA… ňÿZÑ·LÕYtR/uøƉUË.Ý‚‰ô`+d
+FYKÌ4ü‚óÝ
+¦ëúB€¤:ŠÌÕ$'ù.”ÍmÎlÌWÒ§ÝJ3#¶E¾jdsä-WègL‚8Ï…Õ3§$z9e€¸€˜-0ªM¤{ŽËq
+¨¼ìT³–©"¼v )î
+‰×t‚Y¹gÏß%ɽ׆îO¿€4±g‡Qè?Ï‹Ö9À‹AZá±2¸&ڮ랜)£'–Ð…ÖE„3/ ì0ŒéPy?zI B_ ¡pìÀsArMña¾>I…®u{nàéDn4ó8±<_o=û:¶ã£4ÑÖº6Ј«»;{SF³‘R†ñbÌY+ŽÊ$¶
+ö@fdžàõô1C¾Ex¸Áàq7jÕ´úÈC„dªÎ,ÅV™ ·“)¾›ÔpÔê¾¥Á×±;.ôcÇ×~Àr¨ qX7Õ\ßâ=ÊdüîëLê6ÉsùöÌó-}¡€¹ÐPÒ`¤Ok©ÝÑU[¯mx›:ð l೘’´åþ ¶Ê9\ ö»•.B0ÎO9aú¡E¡U;Ð5:Â2h*P-¯lÇ3p¤ÆyUôMá…Öø<ÉJ?Ll¸ÀdzqÜÿ\*aÒ ô[‹áMóç}œ>ÔWߟîø ™çø6&©~Úã \x÷ya%L">!wIO_U“¾ï¾ä—‰Ž°:*5áŠ÷0]Б†Ú 8[j8Nöìèb
+Ö‰Êùª i.˜Ã3@Éáîôüêk5pÞ>ÿ:°8Bø¡× ó„ÝÃäÛÁ‡U'äƒî0 DM*çÉS´çØQì‘ÿµÓcoðµ¡m×Õ¯¯®‡ƒ §Ù¶…]5›«¶Ú7©ºbÔ‚ I'{ó}úÁ›v¡ªwû­k¤¹Ä÷vÕ+è:^”2K øþmMÀÿ)Ïu]S'}ê@ÓŠ<ótÄQPTθ;øqSó>.jÁ@6¥á> Ï×¾‡Û^ä‰Ófñ¯D³ÊËl¡Û–+
+endobj
+1476 0 obj <<
+/Type /Page
+/Contents 1477 0 R
+/Resources 1475 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 1480 0 R
+>> endobj
+1478 0 obj <<
+/D [1476 0 R /XYZ 56.6929 794.5015 null]
+>> endobj
+290 0 obj <<
+/D [1476 0 R /XYZ 56.6929 769.5949 null]
+>> endobj
+1479 0 obj <<
+/D [1476 0 R /XYZ 56.6929 749.1192 null]
+>> endobj
+1475 0 obj <<
+/Font << /F37 1018 0 R /F21 930 0 R /F22 953 0 R /F14 956 0 R /F62 1352 0 R /F41 1208 0 R >>
+/XObject << /Im2 1341 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+1483 0 obj <<
+/Length 2317
+/Filter /FlateDecode
+>>
+stream
+xÚ½koÛ8ò{~…; 21|è¹À~È&i/ÛÝ$׸·XlY–c¡²¤JrRÿû›á²ä(Û^‹;†Ãáp8oÒbÆáOÌ"Ÿq{³0ö˜Ï…?K·'|ö
+ßïs9·o¯gfïßßÝÝêÙÅüÏÅÏ'W‹þ\ó ®ðPŸNþø“ÏV ‚ŸO8SqäÏž`À™ˆc9Ûžx¾b¾§”Å'÷'ÿìfõÒ)]ö4 S æWm+$‹cߛޖƒaBÁ_Öqàe@»bÌê`ê ÌW\ô¦–rVˆ}_¢­cÎB&}ì­oPÚ2f~à $ØH\SÜÎÝ@€%Ü@:WÇö
+_Fˆíé>deÖä)ꑤQ ¡T >åiæÐ@…JŒmîºõG!\ÐQ™l³¿)cŽGâfë“ß}Vüâ¢&[çŸ÷žJמ`˜Î׶´çp³SÂ5óÈÙ•ë~þy 8Ü<"?4×¥mò1›Øº›˜¾!¢«2…¶ï%î
+dæž2×ëº <êù6žb*RÃm0ðˆRÁˇ
+ꂤ¯Ž
+]n¯Ëã›QßYjR2¼{ËcЃÏQ0žµg<ÿõ20ú°÷Èÿ[)kIBèV@¼Ã'M¿¡lÙZxß\®¦Lô¿¬[˜Ÿ^[ŸùBÕ_–1q¡¾@Y&ukkš¼3Y¹û‡¢ã6ÊÖÏÑÛÔOÝ0éú9U594Ø}¥z©j†ûCaˆPÄ N1S~èKúÿ‹¥ËƒÜeÈ)‚ðQ‚AzÆg»-S}“)¡#°I
+Üxx3‘m”Œ^lŸÉHÙ–!©ëöÌÄ
+¸¿×úJ«ÚMµ+V„_f„«JK¸&DgW^  ¬~~R¾·QPܪŸªŒ4f©È®W–b5í²Õ/ýÌ€}RS?
+ðþeý»‚8<ezàîQ$§»ÅÉ8´BáÔ³Ç[_EÌd8!ú
+endobj
+1482 0 obj <<
+/Type /Page
+/Contents 1483 0 R
+/Resources 1481 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 1480 0 R
+>> endobj
+1484 0 obj <<
+/D [1482 0 R /XYZ 85.0394 794.5015 null]
+>> endobj
+294 0 obj <<
+/D [1482 0 R /XYZ 85.0394 629.0401 null]
+>> endobj
+1485 0 obj <<
+/D [1482 0 R /XYZ 85.0394 603.8306 null]
+>> endobj
+298 0 obj <<
+/D [1482 0 R /XYZ 85.0394 304.8197 null]
+>> endobj
+1486 0 obj <<
+/D [1482 0 R /XYZ 85.0394 279.6102 null]
+>> endobj
+1481 0 obj <<
+/Font << /F37 1018 0 R /F22 953 0 R /F62 1352 0 R /F21 930 0 R /F41 1208 0 R >>
+/XObject << /Im2 1341 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+1489 0 obj <<
+/Length 1904
+/Filter /FlateDecode
+>>
+stream
+xÚÝX[sã¶~ׯФy fL^;³^­·Ùl²v×J;™Í>Pm±æEáÅ^å×÷€¦$:M“¶‡ÀpnøÎ@bÎáOÌý€±Œçaì1Ÿ ž–3>¿‡±¿Ì„™ãÚIîxÖëõlùV…ó˜Å æ뻑®ˆñ(óõö“ã1!ØTpçæýêváJŸ;‚?qŸ¯>.Tèüx³^ˆÈ¹~ÿdfôö‡››k=º^€m_:«o.oÖWiØ3z/ßüm!„p.?¬®ÞÐЛÆÒÛ«ËEè9ë>^Ý.>¯¿]­‡¸Æ± ®0¨ŸgŸ>óùRðíŒ3Gþü :œ‰8–óræùŠùžRVRÌngŽFõÒÉ\
+Τ
+äD2=1J¦à0*T0½aHÙÄ|íÒVÊRÀmZ±¥ÓŠ¬ºÏ«ŒÚm¿ß×MG\ßæ÷õêª8h=˜å[)Gæ]°IÎ]Å™'Á_4Ýü™æ¹:9õ?áiÚö]Mý$M³"k’®nþ-—?d_º ÀB9Í"rú
+Û ^JÏè‡âÃæÈ0€­ÂµÉ~ß.ë}VµmAˬ»Ø¦è¨ívÁî1ıц&±³Þå--|Ê £:麬ÜwÔÁ¨ñ›Wy—'Eþ‹±ÙíLÃÔRdk)èÛBÀŠLλ;£Ãè“àãÜQÀü8ô¡%Xìû„¬dSdT2Ú6|·æÛÚo[жw}Qt½]\ë÷‡P Õ`%g´—ºÊ¥T¸aÈüH„&?ŸÌF?&yAÞ`÷óDba]È£à(¯:4éûLÆPÊ$óLÍ`TàSî°Q÷ݾï°íaR´,­ò:E´¨ØЂ£/ E(ÉÂ0ôŒ#eò`,äUÛ%s×ý)ðïÙsZð´ËÓiê4jߌ–cïËz›ÿĹ̶Կ|ÞÞ~G¶Ï»ŒVÃ6ž§\*`(Øz²Øî–”9O*ø¾gAAÅC_öm3J Áû‘Ñņü
+ $íðˆÅ€™ç#A.\Áa_÷y±Íº)¯ß}0 [Pu;j!âëçŽpÜx*Iêÿ¾Ë`ÛD¬œÍ {¤[1"—›œ¢ ¨Ó¤Ëk³¬¾£¯öœ´o»ºtQ]GCCÒõê|Ó$Í:%Ì5ÖòvŸ¥ÃŽ¡à1OŒÞºBù}OÐcƒØ”©ƒÓä9uL˜ä­/gð®n¨ñ]^õ_þuúÖ‹X:¦ä‹¼z8Ý¢ ò8ßë@êÇ|›5xì^Ø%`²mI@IÂÖÆ(Ë*,ù­a”êÄÔYPzg©èùQ±¯õáYï„2ÞhØ'”RZ@ÚÙ—W74ô>;ì33ªydioø¡êŠ áéI-KY@¿FWÒš/­VÒÝhšÑ&¯Ð $P jGDÔ0ëÉ.&KfºÅ°uTžX%|´¢DàYAÑ®n5‘)©Õâ0%1v°fGË­“(ÒVI¼9˜Y[*%”!q¹¥’†À` é ;cpµ¢1`¨­–„ÖçÎÎB'…`éö9^ÚÜ´.ˤÚØ´ãVÌèüÿšŽ‘tK_Æ–°[x‰ñ©œšùl >Ýåà‘9‡V«W_ݧ)u0ö¯LÓ%èº
+¼)Xݾ­'§€·& }.´¹6;Y—V
+ѤR“¢éÊ$Fß÷ìà„þ5•ÈNÅ
+Ë}‘äÈDŽádSã-G†ã;Um¤Ouó
+vɣќÐGÉ¥å`-5nÕ,íFžÀ%!oˤKwlj ®|‡±Z«¡°VC¼ên­…>ºm €}¢ë E5}ŸÃ¸WÚsT²«û¬ßd'zÚ¤4-}ʇ`k‚½áppá i¦<Ü÷p¢¿;†Ò|vÏ3’Qï‹©óÿò®Ë ÞÒ1‡]Ø—‰yú/>÷W^4¾ÔŸÃ óÀ]ä/~]+Ì÷Ž
+:Ö¬z9zŠy*ˆŽž º„ìá÷‚%X$xpfæWÞ#~,NŸRgyÀ"¼¬ÄÔM^™3c‚´×úšS×Åo8 «X±ŠÞE¿ÍZ&$,áE\&ÉÚ¬#)ÞØQÐiS¦i†öø£Af„Z ýæöû ‘sÁ:M'ÇìØ]#ös²Ã=<0Îã bÅÊÎ&û±s"Š"vªì‰ž]
+ÒʽðäÙ&sàÐKrsëCÏ.”R ÔQL`Mø, ý.òI¨AP#¯Ñ„ž¬mÔ›
+endobj
+1488 0 obj <<
+/Type /Page
+/Contents 1489 0 R
+/Resources 1487 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 1480 0 R
+>> endobj
+1490 0 obj <<
+/D [1488 0 R /XYZ 56.6929 794.5015 null]
+>> endobj
+302 0 obj <<
+/D [1488 0 R /XYZ 56.6929 596.0056 null]
+>> endobj
+1491 0 obj <<
+/D [1488 0 R /XYZ 56.6929 566.6651 null]
+>> endobj
+306 0 obj <<
+/D [1488 0 R /XYZ 56.6929 532.1171 null]
+>> endobj
+1492 0 obj <<
+/D [1488 0 R /XYZ 56.6929 506.5445 null]
+>> endobj
+310 0 obj <<
+/D [1488 0 R /XYZ 56.6929 353.6477 null]
+>> endobj
+1493 0 obj <<
+/D [1488 0 R /XYZ 56.6929 325.2657 null]
+>> endobj
+314 0 obj <<
+/D [1488 0 R /XYZ 56.6929 132.6175 null]
+>> endobj
+1494 0 obj <<
+/D [1488 0 R /XYZ 56.6929 107.4872 null]
+>> endobj
+1487 0 obj <<
+/Font << /F37 1018 0 R /F41 1208 0 R /F22 953 0 R /F21 930 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+1497 0 obj <<
+/Length 2294
+/Filter /FlateDecode
+>>
+stream
+xÚ¥Y_oÛ8ϧ0° ¬|ˆ‰Ôß
+ìŒê¥}¾ d챈zœ)DŸ3ƒÄ ¥Ú™%ÆÖû«‹Ÿ¼ËËõêO×y‘ÕÇЉ¤ÕÜ«Z¿©ª¢&2]¡kÔv~CdU¤+ŸçÕÅÕ9Q 59‹˜Uå'×wk•÷)oîy·{E’> j¶gÙˇY­O
+øղɫÒÁs
+IÅL/ëñtŸÏîû
+‘ÚÁqñše6Dzºõ}Kð­k³¯¯›¼ÈL:á[Y¥¯J!µ±XIOç:r®Ã ÉuŸsù锾ºa{ŽV2O#(r(Í…ß“©43­÷–Â
+}s´B[x`}w¥¾hÑN©š—@ßý÷­Ä'þœ+¨ÛKSVµ[?«N[ÂÐârx]Po]þÍ!SaXƒ"À\®òGT˜Äñ@ƒõ‘ Ô‡á)‹g¹8B‘«9FŒ]8zÈ5ë}Yä¼E‰¥ya¶§–·=îýš ¯Z[ý¦IõmiÕ0{¹žùŒh‚{d³°C D–6)æ“í—$à¶Vc‡o›ýíøS’0_‚D´³ïáÒZëÚhÕgÔ¾ðFÅÍ龦 ¾EÇ è0–‹Ö'Ç'½
+¶ÿ©ø‘#ãXôñ”nèÄ"‰ŒRèV)÷5oÿS8Tý/Þn­™endstream
+endobj
+1496 0 obj <<
+/Type /Page
+/Contents 1497 0 R
+/Resources 1495 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 1480 0 R
+>> endobj
+1498 0 obj <<
+/D [1496 0 R /XYZ 85.0394 794.5015 null]
+>> endobj
+318 0 obj <<
+/D [1496 0 R /XYZ 85.0394 704.2027 null]
+>> endobj
+1499 0 obj <<
+/D [1496 0 R /XYZ 85.0394 675.9152 null]
+>> endobj
+1495 0 obj <<
+/Font << /F37 1018 0 R /F22 953 0 R /F21 930 0 R /F41 1208 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+1503 0 obj <<
+/Length 2284
+/Filter /FlateDecode
+>>
+stream
+xÚ¥koãÆñ»…€×\¾i¤ŸÜ»8‘]K ÐÜJZYÄQ¤Â‡\å×wfgø’ØË…?h8;;¯Ýy­åÄ‚?9ñ|áGv4 "Wx–ô&ëý•5yµ\I¦1"³OõýòêúÞ &‘ˆ|ÛŸ,·=^¡°ÂPN–›†+¤S`aOw‹©i{–ñ) øhyÖÝóÔ Œ=-§24ÞŽW??==êÕåd{¶q÷îöi9{¦e—ùÞ¾ýe*¥4nçw³·´ôvÎ’îg·ÓÀ5–??ÏÓOË®fËÖ®¾íÒrШ߯>|²&pÁW–p¢Ð›¼Â‡%dÙ“ý•ë9Âs§Á¤W‹«¶ {«zë¨/¥%lÇ·GœéÊ1gºðƒ€œùשé[–±ÉÊR­ÍÏêô¢2B©ÇûCªD¦*4óúÞ¶{̬‰éX“ž£Ù,wI95'2:=?&5•#SU2Rê"©NøÕ.ÎO¿¡ñnñ!@}oàNdUWÌ ÉÖª¥e®ëfûJ1Uš¿&/˜¤Þ¯TQæ{¦¨rZ¯KFlìDËà~EžgkË:…íÈ7´q*.ó¬DŬÀH*ZÙÇL‚*Ø‘gìs"&¬ÚâÇG˲׉ÊxêÐq-Uqä½Ú ¸^( Bõ4 F Ɉ¸Ú1‚¼¬‰‰ãïu+
+™eò’%ÙËÐJºùAq•ä™@wÃíÖ<ýÐø#ÏT»Qcð`4 nûY :ù4Uúîy
+‰vs( oæx•”ô€,ÇÍà‚è<©†N””Šæy¥nèóý–H³¼" .É©°‹·[†ÉY&?t:ƒ(
+äˆÀu<½ðm¡‡xš—Û¾p-ÉL1ô @ZÕÕ>ÓÐ>.+U4µ÷4~Ùv×™žÝ(t¹4Í”mÝÐ †ùr˜vÛSÓH¼# øüNÏ2­'R>½ŸßŒEõ/ªH¶'­%’ikèdñ¬n!„óק/9Èn_ÞŒ©1_ÌîœçÅíâÝ­c¿¶ÂZ—átª08F¿mdÞq_£~]<” Ê7ôûÐC±îë*9*^¶è§PÇü³Ú ‘egsu3 wM€ôÖ„cK¦ ¢ ·ØwÝ®Iñ¦¦´€ûâ ÖÍA ®Ê^’æâåÙEí÷ }¤ÉhPƒTÛ¡ßTa¬eÐÔ<B®\,~ħ‚ T(Ð…KT ï9&m\€y™ldè ÙÅRï['ôµq°ýp›£uG–1æ†i
+ajûvD +±“i«<OK6ïDø~÷„ÚÆGÛvÍq“ƒXu<0À3çÿÝX2…ä,—|ÉÐŽ„´dÿ3>¨V=·wôGG¯ÑT°º„•@jj("zìÄðsU'iEà+Ä-Òíóm>¯KÝ<·°6„X“êàp_[€j£¶qBn×Áõ„øg>Ó 6 ´I$
+ Ïð¹Îºf‰ªG«
+û>HuÀÕ‰~i¼æŠ@ÜGr
+ˆh¦¸‹ìãxX¦bm/›wœÄ’óþ*^åG5Èp0—©ÃƸ즫¹†H¸¦È¸®Ëâd^÷e_^$lž˜ÚAÄãFÙt%\Þ ð†•foz¾|sÕu$%}§Ñß9·(Z‹fDuxžÃíGUÉf£ü‰~! sâwdÇûñi6Ç*vö¾åD0R=±]pŠ÷U\¶ˆ ŽÆŸ·Ì–¡Ù㨟®†±EÂõýV,ºéîq~Oʪì˜P5ËöT‡Á”c\$&Ϭ®- K”ÃËÔU¤óÑŽÒêYÂ}XèksqÇ*Œ¡m¼ç7˜–·TeþF?Í´Zc#ɇK*ø4:¿è¢Zøî7¨9ú‚ÄÚ‡QÂÿ.¥)=!„2°ãŒpLH/ô$|÷ôãíݬ‚ x7{žõÚæèp²
+¦ã(N˼ôC"‚Ü9‡Ý<Bh:äMM¾ìï¢<©Å4E>(£º,š7(ˆ
+O§¬e³™4"’E=y5iŽ놕+Hÿù­ÿE…¢ëay½Ì}o›„»7£²ºx>jûXæfØÓµ½4h¹oŸNÆ^ÒOàó÷È»·Õö ÿ÷+{÷ï¸"NÚãY.ܘ°RèfǽмyŽ¿Tý?,{Cendstream
+endobj
+1502 0 obj <<
+/Type /Page
+/Contents 1503 0 R
+/Resources 1501 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 1480 0 R
+>> endobj
+1504 0 obj <<
+/D [1502 0 R /XYZ 56.6929 794.5015 null]
+>> endobj
+322 0 obj <<
+/D [1502 0 R /XYZ 56.6929 519.9229 null]
+>> endobj
+1505 0 obj <<
+/D [1502 0 R /XYZ 56.6929 488.8874 null]
+>> endobj
+326 0 obj <<
+/D [1502 0 R /XYZ 56.6929 326.6298 null]
+>> endobj
+1506 0 obj <<
+/D [1502 0 R /XYZ 56.6929 298.4037 null]
+>> endobj
+1501 0 obj <<
+/Font << /F37 1018 0 R /F41 1208 0 R /F22 953 0 R /F21 930 0 R /F11 1442 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+1509 0 obj <<
+/Length 2429
+/Filter /FlateDecode
+>>
+stream
+xÚ¥YKsã6¾ûW誥ª,/‚¤ošgœJ<^[“29Ð"d1C‘‘´âüúíFƒ%ÑÎV]e4€F£Ñ ZL8üŠI2®=‰ÍB.ÂÉrsÁ'0÷ñBxžYÇ4r½Y\üøAE“„%FšÉb53Çb²ÈþÞþ4¿]¼¿›ÎdÈͦ³Ðð`þî·©"˜ß¼}ÿŽ¦ÞÝÜñáý|é`ñùî=Œ
+Û0h›Ã½®¬Ä*Qª#m1‹¢(øä6uû£[À¦5©çàF½O€JhÂûÄt¨>Zþ!/ÓÝ3ñéƒ-œ;œYD…lËc€ù–ò˜oÂàkYíK" +Œ—ÚÔÍb;°B 9ø’Pá¡mht
+3¡“w„ßnˆLƒTB !6R„ØDSáæÑdHp;±Ô¨!åß#÷Ý)ÜõæÚ™·~¥T*»§Üî}oåAwm{¼%÷¸%¨!ıFY6-Ùùxí UÐ¥_kíiÉ­¢˜Åx3£á€PÌÒäîÑ¿ÚîÏåž6\Ð=HÀw&-p×YÞÕTs&™8{
+ÿCñçöŽë_´8—†Z0}bø€ž©'á RLnúz´¤Š}6¥Ôÿ…î$ê|®wg@ÝáÍúxõ®Y¢…v›,¨
+ ;÷5øñU^xrÒ˜{T᳑¬îÒ$¯Ëmp%/¶ÙxåIŒJuå…‹3Oµe‘µGBôéeCªšWäÕ[»Ì1“l=†}¬CÙ˜z4H¾
+AËwuø±
+ˆ­‚ÒÎþ"b_’C´8qHÂâ8JœZ?|º»þˆ ï—1ÀûÑçɺª!I# ¬
+øa/Íé{v»xÀ1`WÙC|u%^ŠŸ±øQJ»ÜVŠ8ËË™g6pY >yõàûl ì` 3Ïfcá¦ÈÜG;\¯¼jè8¸ÎÝyn¦¤–B§»!:‡!= ÌÁ/Þ Ã¿Ðýuð(Zì²{ò5ëw aàÝÞ—*WW+ø¹‚76&fÚãʉ}q7:ö‹ÒúngG©$Óa$FBŽ!D÷꼡çÃ+˜qãŠRÿ‰•Pÿ_Aãw÷hpsÕ1}ÿ‚N»¥6õ“G郹Ÿ(ýžH÷5’‘ÿ€5¶+¸ËÆ÷Ó.c±Sç%ÏD
+øÌI5Á_­ +®á½"c}ˆ1¯Þyç¾×PR‹DÔÞlÄ`!„B,:ÆNgH ~Ò]„£ý™ýÛ¢ñÕ®–€TÑ‘‡dë¡äØb«ª(ª}ï‹}Õ~#‚Íê _ÆTèrÍ bÔqeqüòÁÜèc‡Þ@ã/1ÊÙ>aÎps$ƒüÚ­#oבɄ,
+U÷Üa#âð]°öË8ÊÙñoÌX­p=ÉŽ\y‚ñ×~!ý…ÖÀ"ö
+endobj
+1508 0 obj <<
+/Type /Page
+/Contents 1509 0 R
+/Resources 1507 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 1480 0 R
+/Annots [ 1512 0 R ]
+>> endobj
+1500 0 obj <<
+/Type /XObject
+/Subtype /Form
+/FormType 1
+/PTEX.FileName (/usr/local/share/db2latex/xsl/figures/warning.pdf)
+/PTEX.PageNumber 1
+/Matrix [1.00000000 0.00000000 0.00000000 1.00000000 0.00000000 0.00000000]
+/BBox [0.00000000 0.00000000 31.00000000 31.00000000]
+/Resources <<
+/ProcSet [ /PDF ]
+>>
+/Length 557
+/Filter [/FlateDecode]
+>>
+stream
+xÚm”In1 EOPw¨u€$ÅIg0²Êľÿ6¤¤êV5 oʯÅésÀóή¯ƒÖ×O²Î Ž¢‘ÿ¨#h8Çùø:„5?ùÆ [ÄIÚL’~”F Ø PÈùYÌÀ¹dˆÐzZ8å±Ýƒ²ÙËò‘–Œ€f¾Å(ÌÀE#@x˜oL Û¹[ƒ±ñðù
+6\>RgÈbÏWÖ¹j[†›
+WŒÏ¢®{6;»²þFÃÇñ÷ø]š¨)Õ/Ô¬Mu;pk;Ì©Ëdh<åE–ñ¬AÏw³ð¬±±Nê¦ó¡Ä½t•‹ùD„™Â²]°Ä(‡;„ ·åŽ°Š­r²ÂÙÄLûˆ T¥Í¡誋ŠŽt’¹w_ =Î]ˆ‹=¦uSä÷—ä"ï±yl±‡µÃ-ËkHsŠöreOÚ³êvg›<7ºt,‡Ýe—;ãÒèЭ/I…B÷&ê(ýê³ö󻉨YÙ¹Ç,çkRÔšÚ'^ m" ^˜h±ÎW9AVªy­Â©/fýÆ"•œãûFy-Sng \Çdª¼˜©Æ¥†Í}B©•µŒÎ$âw1.¶&Øíþ²C¶O–ÃVç X×9g¹E{îÇ< •ãóP)!ÍZÜÅŸLÞª~ÑÔ'¯UâXLµüc“ÅXsЖõÚ¯½˜Ó’~òBL–§èªÆ¹O¦ºNZ_[Èü.øšŠû*]3QôçÇñ!Ö-žendstream
+endobj
+1512 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [377.8384 431.1147 436.8266 441.8991]
+/Subtype /Link
+/A << /S /GoTo /D (ipv6addresses) >>
+>> endobj
+1510 0 obj <<
+/D [1508 0 R /XYZ 85.0394 794.5015 null]
+>> endobj
+330 0 obj <<
+/D [1508 0 R /XYZ 85.0394 640.7425 null]
+>> endobj
+1511 0 obj <<
+/D [1508 0 R /XYZ 85.0394 609.2714 null]
+>> endobj
+334 0 obj <<
+/D [1508 0 R /XYZ 85.0394 416.9256 null]
+>> endobj
+1513 0 obj <<
+/D [1508 0 R /XYZ 85.0394 388.3459 null]
+>> endobj
+338 0 obj <<
+/D [1508 0 R /XYZ 85.0394 261.2322 null]
+>> endobj
+1514 0 obj <<
+/D [1508 0 R /XYZ 85.0394 232.6525 null]
+>> endobj
+1507 0 obj <<
+/Font << /F37 1018 0 R /F22 953 0 R /F62 1352 0 R /F21 930 0 R /F39 1151 0 R /F41 1208 0 R >>
+/XObject << /Im3 1500 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+1518 0 obj <<
/Length 69
/Filter /FlateDecode
>>
stream
xÚ3T0
endobj
-1148 0 obj <<
+1517 0 obj <<
/Type /Page
-/Contents 1149 0 R
-/Resources 1147 0 R
+/Contents 1518 0 R
+/Resources 1516 0 R
/MediaBox [0 0 595.2756 841.8898]
-/Parent 1117 0 R
+/Parent 1520 0 R
>> endobj
-1150 0 obj <<
-/D [1148 0 R /XYZ 56.6929 794.5015 null]
+1519 0 obj <<
+/D [1517 0 R /XYZ 56.6929 794.5015 null]
>> endobj
-1147 0 obj <<
+1516 0 obj <<
/ProcSet [ /PDF ]
>> endobj
-1153 0 obj <<
+1523 0 obj <<
/Length 1913
/Filter /FlateDecode
>>
stream
-xÚX_Û8ï§È£h\KòßÇöfoÑÅ]±èÎ>]ïA±•‰P[ÊFöäæÛ)JNœqºE€˜¦(Š"©)³M?¶©‹4M¾©š<-2VlÚá]¶y†±_ß± “"-r!àeet[ˆ:-j^m¶×J>=½ûðOÎ6<KË’›§ý¼VYÕi#òfóÔý'ùÇAGuzØò"KŠ‡ÿ>ýFÓò´ª+†Ó2X¢H«&«ý„§ƒ"áOŸ¿<ÕÐã_úù0žþã«r¶åQ+ËS‘—<h-EZ•™Q¤ìa˲,»è¿¯. ïNòôtóM“6%/ƒj^§eÕ2ø¡É’“ìô¨­‘}ÿ
- 5e"Ç^·™Ž8ù¢ª’R†x½6ßUGôY—Äpã´#êôÀêd6&’y^~<È1LQ¦s×sÚéä4­[&_þ  MꤕÃÍávK›¢à~;£¥ýKzô¶•=‘­lÚ<Ó‹‘Cð£S'´ªÊ“tÖWA@Æ ¾Ï¿¿”[«[Ó*¤ªD›Ñ[g»©ÅÝã¨QglípìÕÿôøJ lid<(bÍî˜Ð½Ä;’ÆV9÷þa 霸©=ÐDéHfoûÞžýý1Ö¤6.ˆšnÍ+_>þûØ/¯£_­v¸Üσá*qz˜úQe'Gzk¿OGµ{âWr¢æ‰ä(Ï꺰C§\
-veÒÖNϬ—ê¼g¸rÞÊ.ÎèŒÈ¢h¡Á¾¨îý<æBh%ÒËÞ:z³á˜èáhÓ»>HÅôÑhÇ L8[Ú,²j¼œ—D>Õ/…T¿—T„ ¬ñØ€0š&îm´Ù­4DÈÞY¢Bž¼è.ÈÜ&ò0§5¤RP¦†³à÷öÆ'çSʯ†í°ÓF^b ®Æû+ìY‰Óò¸ó†_Ž;oDHàJz+ÞI©!úê`Dñ:™Œ¡£ Q’â™ÞR-ÅãT!pº
-M&PÄqíèÙi7jÓŽ4¾§YyŸ"A¦͠ì‚d,"û©ì±‰kkÒ;¥)ÏR^Š:”&JÓ×9*—“²,Jן©IW؃È!6Š‚O
-q¿–D"mX• ‘¹ÈjmËúÿ@CH®2#¶¦È²&RØš8"u£
-:åô³¡&Ä«»Û†ý5é˜âB€û}Ye¡ødÉ °]B楖x¬†Í@”üizT(þ¶Úxe訳vTn3o-òÁa^¨ª1ü8Háã=ô6³¶µ{Ó‘¡š»hW”P·Šj‰v¢æwЮ„Z[Š´»ƒhM 5ƒ© º¡s?‡+ì
-ïp,'èñ+)jä‘jåQúk ©ï¯‘ÙYºÝÕ¡Eâ¦Á§âÛð´â·I-§Ñ;ÀÍÍ$b®»Ö¬Ý‰ÜQµ㩺›{JýÐà4;,ÿ‰f`¨º ‡W$‚7€Úù«1[Ë/¥nÆÏX «Eš Q S£»»·ž;šWïP{“øÄDN)ój=u”ö¬ÊùßC;»òÕ]Û Ñ_;Œ`ÝÄF
-q…7ÉGb†N0bèKNôJ… $ȳÈBÏ"g¥O Øêåýµ G’^—=Ys{}ñJE½Ó6l`‘“TÈ‹«Ã}%­JüŠÆ‹ŸêIÙmS:_Óß Р*çóýÃì(š´ªŠúºWy÷ËÓü-1~!EŠß×¾6F‘íE†>5.NF¸áb¼¸]mþpùv¹ÿ`)iendstream
+xÚXQÛ8~ï¯È£h\K²-û±½Ù[tqW,º³O×{Ple"Ô¶²‘=¹ù÷GŠ’gœn ¦)Š¢Hê#e¶ÉàÇ6U‘f¢Î7²ÎÓ"cŦéße›gûõ 2y!Ò"^VF·…¨Ò¢âr³½Vòéé݇r¶áYZ–¼Ø<íçµJY¥µÈëÍSûŸäuõéaË‹,)þûôMËSYI†Ó2X¢HeU~ÂÓA“ð§Ï_‰ªéñ/ó|Ïÿ‰ñU;Û½€ò¨•å©ÈK´–"•eFf){ز,Ë.úï« Ã»“:½Ý|S§uÉË šWi)kA?ÔYrR­T×½ÂBu™¨ã±3B¦#ÎA½h¤d²Óz ^g†ïº%úlÆ+b¸qÚuz`U2›GÉ</?Ô¦è¡u×sšéä ­[&_þ  Múd´ÃÍávKë¢à~;£¥ý+zt¶Q‘jfx¦—AõÁNŸÐ*™'é¬OB@Æ ¾Ï¿¿”[«Û¡ÑHÉÄ £·Î¶Sƒ»ÇÑAŸi°±ý±Óÿ3ã+ €°¥‘ñ ‰5»cB÷ïHíÜû‡-¤sâ¦æ@•#™½í:{ö{@öÇ`XsPfpAth×¼òøåã¿ýò*úÕúg‹‹qÁý<–‰3ýÔjÐvr4¡³öût¤Q»'x%'jžHŽò¬¶ ;tÚ¥`WÆ!míô| ñÞºq©Î{‰+ç­ì⌎À˜ü@-ÔÛݾŸÇ\­¢Qz9Ð[Ko6Ó­sfש˜>íèõΖY5^ÎKH"ŸêƒBªßK*ÂV{lÀM÷6ÚŒìF D¨ÎY¢Bž¼˜6ÈÜ&ò0§ ¤RP¦†³àwöÆ'çSʯ†m¿3ƒº(Ä@]wWس§åqç5¿w^‹2ÀUôþV¼UÒ諃Å«d:Ê )‰@ žyà ÕR<NÓØ^? ˆnšÄ‚¼qË 1¿!çÓ39Kþ|ü}»SNû=ÔѼÑ6¶ƒ LDCêäçùµ«üüån‘s­§ÐdE7Žž­q£š‘Æ÷4«§1ïS$ÈÔ t « ‹È~êB{lEâÚšôNiʳ”—¢
+¥‰‡ÒôuŽÊå¤,‹Ò#ÅõgjÄö rˆ&‚à€qéR¹q)p
+q¿–D"­Y• ‘¹ÈjmËêÿ@CH®FlM‘e‡Hakâˆ4A~ŒJ
+í,7 >ßš§’ß&µšF;Ønn 1ûpݵÃÚÈuc0žº½¹§T?
+¯“Ä `ÄЖœè•
+Hg‘…žEÎJŸ°ÕËûkŽ½.{²úöúâ-Tšz§mØÀ"'©3V‡+úJZ•ø?Õ“²Û¦t¾¦¿  ,çóýÃì(êTÊ¢ºîUÞýò4KŒ_E‘â÷Ƶ¯Qd{‘¡O‹“‘ä
endobj
-1152 0 obj <<
+1522 0 obj <<
/Type /Page
-/Contents 1153 0 R
-/Resources 1151 0 R
+/Contents 1523 0 R
+/Resources 1521 0 R
/MediaBox [0 0 595.2756 841.8898]
-/Parent 1158 0 R
+/Parent 1520 0 R
>> endobj
-1154 0 obj <<
-/D [1152 0 R /XYZ 85.0394 794.5015 null]
+1524 0 obj <<
+/D [1522 0 R /XYZ 85.0394 794.5015 null]
>> endobj
-230 0 obj <<
-/D [1152 0 R /XYZ 85.0394 769.5949 null]
+342 0 obj <<
+/D [1522 0 R /XYZ 85.0394 769.5949 null]
>> endobj
-1155 0 obj <<
-/D [1152 0 R /XYZ 85.0394 576.7004 null]
+1525 0 obj <<
+/D [1522 0 R /XYZ 85.0394 576.7004 null]
>> endobj
-234 0 obj <<
-/D [1152 0 R /XYZ 85.0394 576.7004 null]
+346 0 obj <<
+/D [1522 0 R /XYZ 85.0394 576.7004 null]
>> endobj
-1156 0 obj <<
-/D [1152 0 R /XYZ 85.0394 544.8207 null]
+1526 0 obj <<
+/D [1522 0 R /XYZ 85.0394 544.8207 null]
>> endobj
-238 0 obj <<
-/D [1152 0 R /XYZ 85.0394 403.9445 null]
+350 0 obj <<
+/D [1522 0 R /XYZ 85.0394 403.9445 null]
>> endobj
-1157 0 obj <<
-/D [1152 0 R /XYZ 85.0394 368.2811 null]
+1527 0 obj <<
+/D [1522 0 R /XYZ 85.0394 368.2811 null]
>> endobj
-1151 0 obj <<
-/Font << /F21 714 0 R /F22 737 0 R /F41 939 0 R >>
+1521 0 obj <<
+/Font << /F21 930 0 R /F22 953 0 R /F41 1208 0 R >>
/ProcSet [ /PDF /Text ]
>> endobj
-1161 0 obj <<
+1530 0 obj <<
/Length 69
/Filter /FlateDecode
>>
stream
xÚ3T0
endobj
-1160 0 obj <<
+1529 0 obj <<
/Type /Page
-/Contents 1161 0 R
-/Resources 1159 0 R
+/Contents 1530 0 R
+/Resources 1528 0 R
/MediaBox [0 0 595.2756 841.8898]
-/Parent 1158 0 R
+/Parent 1520 0 R
>> endobj
-1162 0 obj <<
-/D [1160 0 R /XYZ 56.6929 794.5015 null]
+1531 0 obj <<
+/D [1529 0 R /XYZ 56.6929 794.5015 null]
>> endobj
-1159 0 obj <<
+1528 0 obj <<
/ProcSet [ /PDF ]
>> endobj
-1165 0 obj <<
-/Length 3113
-/Filter /FlateDecode
->>
-stream
-xÚÍË’ã¶ñ>_¡K*šªŒ7ÍiýØd}p{o¶«Â‘8#ÖJ¤,R;ž|}ºÑ
-Waƒš)m%ÂÌ ™æLZEBµL€ap~ƽ¯Wq/¿£ÍïòI:pH^”ïÛÕª}Žòâäv -©YÕ]O½`ùÐV sø·ëª¨ý’XP»ëÓXu¬,óݤÔ_´ó.>¿Eúï¾û8øoAè…žh!™å^¢óÿíîç_ùd±âû;Δwfò 8
-h\±›f¢š%žfÊÁ¾x燈v œ0“)¥ÌDsͤæEؾr¾:–‘‚9«üð „$™wÎå™ gc”!:à€D´‰œ 8À‚¢|D]QÜxè¡Ê)ºØdlµÌ9íâìr±ØV]w,
-e5¨.·’DBxEÊLØcA€š/OHô³ÚÝ’Æ„ñ
-‘šC^¢@È º[”ÔsŸÄÝÑ-*4Ý}
-{Häí¶–Y@ªùîj
-&1èI Û§ u~M ð§4)Ú1^¤ç§j¾Ïˆ!чTÿX½`Œ(Ä=''$Ô*N± ÕH>ÀŽB×­l2¹/G™fœ °PÛx ±éJ€5 
-2Æ­®¯¶Â+Þ0¸/…Ö=gb”Œ»Á!hgAó1S:Æ/ ‰4¶¿BgK —â—PaÙó~]yÅ8™ßH@¾‹RÞ@"jÕX@ç"X™JÖNgC÷ šY¹Êðl3ÎúóÞp%º¶·âyÀw‘gÃj­óœuíà:<ÓÎeÏe³ø*ëà•cZ€EŸÛbé=D<n]k¦¡¦x½[Ogc”™mæPÞq m
-h4:‰[q=`¼Âµ®•úë3ö¼pÃåÀ Ô^VØiÝÌW»E…ŠiÎ|3‘]8~½ÑXQÎDzLe=HF}Ü7Pƒˆq6F™‰î*ÓÂíNòÈlATq®ðãcµ| …ˆ×EãJQß²R×À…,®2È…Ñ&ð¼h×eÝœD2åYám±‡}u,Kgc”¹h&!e0GTž;â–q<3â™ÔvúÛî^€‡SFøÛõ[:ªÔfú¼¬Ã ?×álù1ŒÄƒI/4]q@óí?Ñ8’ñ†Æ1b§ú½\ÏrGþ›t<ù‹”:cPÒ5رdŒ/¬¯ºží÷ãˆW°>ëlŠMˆó‚ºŽá{°!H€K}E]%L°Z‹¨®=nì9u`o§®c”ÔõÊj^¯ËÕuý{È®Àëâ%…¨V»-ÔM_=¡g ãŸËÕ.$ið…Ç)ûÓs‚‘ÆЗ®Ú”Û²'xØ
-”]—»Íùb¿؟¡©°¡k8<Óï2§r<¬3Ék
-©rŒjæµò‡•ñ
-'öuð8Z¿›· CHU™îá|éAæshQ‰P¼××ãÞÍcoY~®°ç¦åú¡~ÚÕý }À£/­ê-uÊüo<»ÓŽþ­w]D÷På¢à¢î;N-xœZ¼L¤v³¡»ÙÖ%¾4©h<,z¾¥™äut¼×
-Ÿ6ô’fŽ&û@d !{A¹I1ùO!&Ó
-²>Ÿ2˜ÄáÎG9ü)¿²ÁrÔ™½ã7àã~€ª;'è¼UðB4²nÃÑ2–'ÁN;ú3Þ*ü?ÚªŠª•YZêð€rõ\¾ÄE^í…
-¶ÍÍ^f"|-Ô—0zp™=Ÿ?¬†3©­ÒŠI®åÍØ^fSi Ó¿ŒËX9\+ÒGêý:ƒÑZ0)-Ø ºÈÙ"{Kšž‡ã$¾6Ï_Ôr i;B]œ°ž¤ïQ¥åþ_"ÑÔendstream
+1534 0 obj <<
+/Length 3198
+/Filter /FlateDecode
+>>
+stream
+xÚÍË’ã¶ñ>_¡K*šªŒ7ÍiýØd}p{o¶«Â‘8#ÖJ¤,R;ž|}ºÑ
+ŸiÇð€ÏͶz¬Ïpª ¹!åTE€O ³êÀí(NoÇjÂxUßkqä9êE.îF¿šØœY¨÷Úm†]Ì¥ÑÖô¡3Τâ*ÐÌ­ƒŽ‘¯f|À8£<e\€Ú¢™'° )Ä
+=XdJdßPÞÙUÕ‰…š‚I zcèåöiBG{ü)ÍGŠvŒéù©šï3bHô!Õ?V/X#
+q@ÏÉÉ
+»[ƒbä]Ža «”ç±|4šÄ­¸0^áZ×ÆJ}Èõû^¸áràj/+ì´næ«Ý¢Â‡bÚ†=ßLdNŸAo4V”3‘SY’Q@÷Å Ô bœQf¢»‡Ê´pû‰“<r[Uœ+üx[-ÈF!âuQç¸RÔ·¬Á5p!‹k rac´ </ÚuY7'‘LyVx[ìa_ËÆÙe.šIHÌ•çöƒ¸e÷L†x&µþ¶» Æa—»~K[•ÚLŸ—u8`€áç:ìíÂ`Ø7†‘¸1©ãღ#h¾ýá'G2ÞÐØ#ÆCìT¿—ëYnË“¶'‘Rg JBº+–Œñ…õU׳ýzñ
+ÖgM± q^Pב"Ü*ïJ¬}9ÊôÅ9u•½Ma®¨«„¬ÖbP„sÉ dKFè±2dw£CF:ñPïBFã!¤C‘Ÿ·(9˜p@Ê@èë‹òˆq6F™‰xT¨âTD_ZÈœW¡¸8öõëýGz<i=Ô°…¼¦BNƒñø¸ˆ=º†s/ÞÎß0^pw$Vóz]®®;¼¿‡ä‚6žq)^i·¥‘ºé«' Ìaüs¹Ú…ÞðøÉþð…`¤1ô¦«6å¶ì ÞÆÚ×åüÜ/Rü‹ý‘êb:ÅÅ#¡.³©k @;“‚®*kÌÌkå7V°
+*3ëÛk
endobj
-1164 0 obj <<
+1533 0 obj <<
/Type /Page
-/Contents 1165 0 R
-/Resources 1163 0 R
+/Contents 1534 0 R
+/Resources 1532 0 R
/MediaBox [0 0 595.2756 841.8898]
-/Parent 1158 0 R
-/Annots [ 1171 0 R ]
+/Parent 1520 0 R
+/Annots [ 1540 0 R ]
>> endobj
-1171 0 obj <<
+1540 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
/Rect [356.2946 363.7923 412.5133 376.6291]
/Subtype /Link
/A << /S /GoTo /D (address_match_lists) >>
>> endobj
-1166 0 obj <<
-/D [1164 0 R /XYZ 85.0394 794.5015 null]
+1535 0 obj <<
+/D [1533 0 R /XYZ 85.0394 794.5015 null]
>> endobj
-242 0 obj <<
-/D [1164 0 R /XYZ 85.0394 769.5949 null]
+354 0 obj <<
+/D [1533 0 R /XYZ 85.0394 769.5949 null]
>> endobj
-1167 0 obj <<
-/D [1164 0 R /XYZ 85.0394 576.7004 null]
+1536 0 obj <<
+/D [1533 0 R /XYZ 85.0394 576.7004 null]
>> endobj
-246 0 obj <<
-/D [1164 0 R /XYZ 85.0394 479.565 null]
+358 0 obj <<
+/D [1533 0 R /XYZ 85.0394 479.565 null]
>> endobj
-1168 0 obj <<
-/D [1164 0 R /XYZ 85.0394 441.8891 null]
+1537 0 obj <<
+/D [1533 0 R /XYZ 85.0394 441.8891 null]
>> endobj
-1169 0 obj <<
-/D [1164 0 R /XYZ 85.0394 424.9629 null]
+1538 0 obj <<
+/D [1533 0 R /XYZ 85.0394 424.9629 null]
>> endobj
-1170 0 obj <<
-/D [1164 0 R /XYZ 85.0394 413.0077 null]
+1539 0 obj <<
+/D [1533 0 R /XYZ 85.0394 413.0077 null]
>> endobj
-1163 0 obj <<
-/Font << /F21 714 0 R /F22 737 0 R /F41 939 0 R >>
+1532 0 obj <<
+/Font << /F21 930 0 R /F22 953 0 R /F41 1208 0 R >>
/ProcSet [ /PDF /Text ]
>> endobj
-1175 0 obj <<
-/Length 4063
+1544 0 obj <<
+/Length 4062
/Filter /FlateDecode
>>
stream
@@ -4911,3276 +6264,3737 @@ s–Ö*hîžm­™â‰µ
ÚŒ8‹Áµñ.pÃ\bŸ®šîN N!‚š æP³‡yãKΨ ©ÐCËxMU›U×ܯ°ÔùÒ¨0 D¬x/DyHvkͬ”ÚHI0×¥™¿bjïJÚMÿÖÅ º½8‹A¼¤_âÛ5±ŒêmšSØQ-1ØÅÇüͦé¦î²]K×Fm4PÕ]½H©0u?º‡ ŒŒyÏh)ÓánŤ ÷JìøßLŸÁc®ã‡âÃr F×Ѐӟƒs)Ýõçvg»ëR<|×?š_0ÃéÁBm!3Î5¿LñÄ},Øh‚«¶–) '%’¹
ÇÉ} ((º™dàâ^좀Ë*§2¤Ô™üuC{2

-›¬s짼h "”IŒ)%F*<zé“'â¡jÿÿÍ”àxÒ‡BvÉ
+›¬s짼h "”IŒ)%F*<zé“'â¡jÿÿÍ”àxÒ‡BvÉ
endobj
-1174 0 obj <<
+1543 0 obj <<
/Type /Page
-/Contents 1175 0 R
-/Resources 1173 0 R
+/Contents 1544 0 R
+/Resources 1542 0 R
/MediaBox [0 0 595.2756 841.8898]
-/Parent 1158 0 R
+/Parent 1520 0 R
>> endobj
-1176 0 obj <<
-/D [1174 0 R /XYZ 56.6929 794.5015 null]
+1545 0 obj <<
+/D [1543 0 R /XYZ 56.6929 794.5015 null]
>> endobj
-250 0 obj <<
-/D [1174 0 R /XYZ 56.6929 165.9801 null]
+362 0 obj <<
+/D [1543 0 R /XYZ 56.6929 165.9801 null]
>> endobj
-1172 0 obj <<
-/D [1174 0 R /XYZ 56.6929 136.242 null]
+1541 0 obj <<
+/D [1543 0 R /XYZ 56.6929 136.242 null]
>> endobj
-254 0 obj <<
-/D [1174 0 R /XYZ 56.6929 136.242 null]
+366 0 obj <<
+/D [1543 0 R /XYZ 56.6929 136.242 null]
>> endobj
-1177 0 obj <<
-/D [1174 0 R /XYZ 56.6929 106.2766 null]
+1546 0 obj <<
+/D [1543 0 R /XYZ 56.6929 106.2766 null]
>> endobj
-1173 0 obj <<
-/Font << /F37 802 0 R /F41 939 0 R /F22 737 0 R /F21 714 0 R /F48 953 0 R >>
+1542 0 obj <<
+/Font << /F37 1018 0 R /F41 1208 0 R /F22 953 0 R /F21 930 0 R /F48 1228 0 R >>
/ProcSet [ /PDF /Text ]
>> endobj
-1180 0 obj <<
-/Length 3096
+1549 0 obj <<
+/Length 3065
/Filter /FlateDecode
>>
stream
-xÚ­ZÝsÛ6÷_¡Î=Dn,˜øà×õ)uÖÖÉ%ÎÜÍ4”–`‹cŠTHÊŽçîþ÷ÛÅ.(R¢å~Üèàb±X,v¿%'üä$ E S3‰S#Â@†“ùê(˜ÜBß÷G’yfžiÖçúöêèôµŽ'©H#M®nz²$‰œ\-~™žýðêíÕù»ã™
-ƒi$ŽgaL¿½¸üŽ()=ÎÞ\¾¾øþûWDZ™^]¼¹$ò»ó×çïÎ/ÏÎáDÃxÉžðúâ§sjÿtþóùåÕûã_¯~<:¿êÓ_° 4®äóÑ/¿“¬ûÇ£@è4 'ð™¦j²:2¡¡ÑÚSŠ£÷GÿèözÝÐ1†:a¢â Ù³  ”Hc%'q˜ŠH+íLxggQ`ãS¾ öè‘Í‹Oe¶²⿹o±¨mÓ|Zeí|ù©È›–èÿ¥ÇÇ ”hÓת¯ÃLÆ"Õ¨«s±r: å¥PÇ3ÀÐïìÇ PeÞæUIæÎÊ5>4Ù­e±ª'6˜@7X(4NÞ+ÐíX&SÐÆÅzꔤ&jê¨jšÑ×u¾Êê¼x¤×McÔj+z.lkëU^Z<ŸwâçUÙ:YUA„›ª¦Æ=ˆ¬6<_cë{ËÕÚÖ®°ŸÓq:½ZÂFÀÊp-RŠ4 É6=%aÒ¢©¨µ9–SVQMó’žíÒŽØ<IÀ³"p!'×o˘vߌF‹ cæD«ïK“©c#™§©êÖíý¾0m„Ò‰Ö´YkW¶li½!®—”¶Ñéía™ÓNI´jÓæí¦õ‹çUfÃÝU¼»h»™„”I¼ e·fr yÆ.um½k=R£º¡g»äž›ª(ª‡¼¼ýûSQ™*Ž§µ>— JizVJ¡™èž,Ô÷c ãÝIaU0Èćgí¸ö§lŽ  m¢á´Þ6oÙ6C‡.¨ƒ‹·÷†-V{öûȇû¨™T,b&Ϙ©ÇuÀLžëy3šµg¦ÝiÇÍÔŸv×Lk2&­/[;åÌõÛé j”Uëþ ©`>“êôSõ¸˜Ês=oªC³öLµ;í¸©úÓf´twÆ8“}w®Åµ \o9¿_?nƒp$õ@î1FúÜsG sWrX¢wÓÎSS8xB˜æ Åû\O[¼ãzÖâgÝZ|oÚQ‹¦íÒÛýÌæýv/¬ýéÍm¦ÜÙ™‡¼]Ú¥ŒHbú³c^ŒíM(”TÉïÞ›Î#†Qö¦Çu`o<×ó{shÖÞÞìN;¾7ýi9J 'ðâì…-çEÕø1>³\×@:÷ÀúiEx
-e$EßùödÕš>h¸£O+Ðã6#E€Èû ­Œ…ÍpøÑ‹ý2/²UƈLã‘[ßQæºß¾zY c[GŒÖ ‹|Qoá—Ö~QÐBmHÚGð8ˆñádÄŽRV¥%Ò
-ÀQâÏŠæædXDùC=™(L„6Aô;Jn)B-=öÝÝØÎ`ƒ,ÐKØÀâq9cÁUµV"ƒd¸§œ “û„2®köÒ-І·$@ða¼=àÈŸma ž>íH,ǽøN¬ñë ;OŒ_Ø2·ÝøÙX¸ PÌÛ*<«Lºzõ‘SVôîäŸP»SªÇç&E\¡ƒÔË·ÍŒ6R‘ñ(—<ƒÂ1¿+uÂÊ¡8î¶{_ Â8 Òj<I›|ÔMc)àÌŠžhÆ’I!’‘£†¦ eÌaÜăù>ol=j¢DÉç„%ûÂÆc6„JÂäÏÈ›góåØ5e¢EFZ⸞iõvšþ1©pŽ”Í ¸ö¾¼È™$PKÚzeHËpxºnÖ~§+sÐÝB‘èáî“°ä^lóЭð0ÞúÐÑ×™*ÄÅxë]R¸[Vض&i¥[m0Q¤S‡›5dˆ`Á€AÓ]:#tÑô}¾Ê‹¬!¥ôÊ=qá‘D"Nõﹺ©…D“ÃÎWPS=@„ÖœÑ>4¹F‹¶—ÓH¬èÉ8 cF_¤
-/^,Ý "áfGä*Cða_ð€ž¼ Û ÍÏ ÙŽ]Ñ?U/¡=FÑÆñb1œ±°H71·eŽç< o¬¼à!«m)#
-§ßZöa§Ú Ÿ<A¤»–³¾6^“™79®í2»Ï«È3tÁ®íΠ/Zëî^Œefôh6×e^çnØ®L
-K徃ÿ° $V >)J¹•š·U †XÑ+gP©ºä„<.ÿÁ¨¢ªî6k"ÒÀ=½\b•j?¡ÉY©K- Ýtú¡¯BdÁ¹Ô]¼~EÜ[SΔJ¶‚G`N,’T›^°~qÙYÆìô
-œ…ËãkЈºÜE=<1z\y íþR8J«ùƒá=v6lLžá|â?Û‘$qºãçþÊ"ó7Õ¶€¡Ù¾¦¼™ñ5mÇÜ»üá:ù®~Ó‘lç?BûOÐgÕj[½Ç®/Ïuæ/šÆÿ&å[ªN¼4$Ž.–|Môî›1s7ý;(ƒw6cp¹‡^]ûü„-8R[Û¬éÆÃ}ú~Ü`ö®ATw?Å^}hÍñkU n7µ¿úç"ÞƒèHN¯ŽS<~\‡›  ‘Nkx²ãÜÖ¬©nˆèò (˜û.‡êþ„¾ú¶KwKÝt·ÝîÆžŠ­ebÎêKáì„Ÿ/_žP^ªê± k–¶(N׶î®Rq9£õ½,nÿ£ „déû„‘OûÄ©Ó€¿±Î¤ˆ&oûÚuxë÷:®Üq…¡ðÏŒ´-ØêÜÉõzî’žg$8%‡wçdezôSþ†¤B„b©ÓS’û—õzùrìŠñoÿéØYqûÃåÅ¿¨å¶ÚË+ù¿-nçŸøâ¤C¶ùòt{õ—ÿÓ³ýt%…N5þ ICbOT{¥ÐZ*ÝÕ¼ûóϾêÿ®4~»endstream
+xÚ¥ZÝsÛ6÷_¡>En,˜ø ^ŸR×iÝi“\âÎ=4”–`‹cŠTHÊŽ§wÿûíb’’(¹£
+éLxoŸNgIaåS¾ ú©Èæŧ2[Ù-â¾o±¨mÓ|Zeí|ù©È›–èÿ£âcs´Îùk1ÔaÆ5K%êª@iÎS§Zž3q:ã ýÎ~Œ"Qæm^•dî¬\På—&»³^¬ˆ&3‘0såä½ÝN¹™‚~0NË©S’ª¨©£ŠiFLD_×ù*«ó≚›Æ.¨ÖVT.lkëU^Z?x>ïÄÏ«²u²ª‚·UM•Ymü|­¬ï¨Ö¶Îp… øœÔéôz +õpÎÒ8n-%aÒ¢©¨¶9åS¯¢˜æ%•íÒŽØÜð¬\ÈÉÃõÛr¦Ý7£’,Jcí9ÑêûÒxÊb­¸çiªºu{¿/L*&¤ š6kíÊ–-­7Æõ’Ò¶ :µ—9íG«6mÞnÚ°x¿Êl{w…ß]´ÝŒÃ ä‘2Á†¼[39Ð<ó.ucƒk=Q¥º¥²]úžÛª(ªÇ¼¼ûסSž(ÎtªÓãamÈå%8io¥ªFd¡¾#®w'…UÁ ¥ÏÚqíO»µ9<‚ºJ¶§ ¶¹zçm³eèØêèê݃ò«ûCŽû¨™„`FjñŒ™\G̸ž7Ó±YfÚvÜLÃiwÍ´&#aÐúÒÛ)÷\¿Ÿ¿ JYµîÀ5U$™ÑÉ3å눩×ó¦:6ëÀT»ÓŽ›j8mFKwwŒ3ÙwgÞµ¼G-(Ö[ßožúC8z ö(ÅC칧€¹«G
+1ÌÈÝ°sÈâ±åñØ·øë°Å;®g-~tÖÞâ{ÓŽZ|kÚ.|ѽ=ŒlÁo÷Žu¸¡ÚGÊyÌÛå±½BÁ¶«8Üóblob&¸0zo’˜bøñ½pÙ›ÀõüÞ›u°7»ÓŽïÍpZJ 7ðâ¯ì…-çEÕ„1!²ÜÔ@º÷Àúi”$x‚ùÂe³Jé¯>¨¸«O
+Ðã.#E€è÷j…ÍpùQÃ~™Ù*óˆLâ•[ßSƺ߿zQ ϶L<Zƒ.òEÙÃ/)â †Ú´à=pcádhG)«Òi ù-„Ž¢šgŲjZ?P ?¹LyÏPÚ¶Á‘;8… ¹;Wh¢A³Ÿ«ž Í h.¬G…²…©½ ¿¬:3cåÆ÷ÝV› SÞ´cPoa›y¯{Ü»‡IðX¹JwvX'Èm¼v‚[Å ºW£/.â’—“)ìî¦ñÄU¶°;|!– tå Õš§²Íæm>§1Íù¾jeÓyÑ`pF¬«¼)¡Æ$Ë] fÚäå|Ô4oê¼õàôvÐOy§ÖÞ©¸]u¸ý!+òEF RmÁvôùjÓRƒ¶üŽücGDFºux¾õX¹“€¢ÃYFhî`®áÓ7àÄ`Ç&=·µ˜\xô€§á™¸@í¢A<"/¼slºPÑ.)-ÙÜù…iQÍ7¸WεGýè?K‹æ5d(îrXÛC :
+"è1þ(¹q$1o*?¾Íî­¹. Púù˱`’­IÓê 䀭ÅP
+>}‹±;¼æÚm¾²øB Äô‡êÑ>t®+eJgIŠh HCÃhŸ7yUPÖ2kCÍ“(4b 
+Š"?GÊMVg0­Û_lnJØuªfcÞålæÏß
+ –^P‘p»#r•!ø°/ü€‚ŒðÚ Õ…Ÿ¢Uº¤QïçKý³î(ÚxK žÀöÀBà ‹ xÃx€ !é¸+s¼ç!™
+¬_²Õº°n–Ô§X;‘LjÉRÓaXΓçB}ƒY™š~E•qùÍX|ë$Œ¤Ï\tc©ÕƒZN‰
+覷=èv/P>ÂQl­'æ^r) \œùòåË3ŠKU=ú”¸´Eq¾¶u÷”ú„ËÍïe‚€=éýƒqï!C§Pü°Sœ;bH›4†.¦•¤ÿ(|í:‚bƒŽkw_á(B™QAû‚µÎŸ\oà.©¼ ÁÒ¡ÈÁÁÝ9½2ú¹ÿˆ¥L
endobj
-1179 0 obj <<
+1548 0 obj <<
/Type /Page
-/Contents 1180 0 R
-/Resources 1178 0 R
+/Contents 1549 0 R
+/Resources 1547 0 R
/MediaBox [0 0 595.2756 841.8898]
-/Parent 1158 0 R
+/Parent 1520 0 R
>> endobj
-1181 0 obj <<
-/D [1179 0 R /XYZ 85.0394 794.5015 null]
+1550 0 obj <<
+/D [1548 0 R /XYZ 85.0394 794.5015 null]
>> endobj
-258 0 obj <<
-/D [1179 0 R /XYZ 85.0394 731.767 null]
+370 0 obj <<
+/D [1548 0 R /XYZ 85.0394 730.0812 null]
>> endobj
-1182 0 obj <<
-/D [1179 0 R /XYZ 85.0394 703.7216 null]
+1551 0 obj <<
+/D [1548 0 R /XYZ 85.0394 700.9798 null]
>> endobj
-262 0 obj <<
-/D [1179 0 R /XYZ 85.0394 229.6467 null]
+374 0 obj <<
+/D [1548 0 R /XYZ 85.0394 216.5924 null]
>> endobj
-1183 0 obj <<
-/D [1179 0 R /XYZ 85.0394 201.8883 null]
+1552 0 obj <<
+/D [1548 0 R /XYZ 85.0394 187.7778 null]
>> endobj
-266 0 obj <<
-/D [1179 0 R /XYZ 85.0394 144.1965 null]
+378 0 obj <<
+/D [1548 0 R /XYZ 85.0394 127.6814 null]
>> endobj
-1184 0 obj <<
-/D [1179 0 R /XYZ 85.0394 118.9605 null]
+1553 0 obj <<
+/D [1548 0 R /XYZ 85.0394 101.3894 null]
>> endobj
-1178 0 obj <<
-/Font << /F37 802 0 R /F41 939 0 R /F21 714 0 R /F22 737 0 R /F14 740 0 R /F39 899 0 R >>
+1547 0 obj <<
+/Font << /F37 1018 0 R /F41 1208 0 R /F21 930 0 R /F22 953 0 R /F14 956 0 R /F39 1151 0 R >>
/ProcSet [ /PDF /Text ]
>> endobj
-1188 0 obj <<
-/Length 2472
+1556 0 obj <<
+/Length 2310
/Filter /FlateDecode
>>
stream
-xÚ½koã6ò{~…~¨½>õh?ew“4Åí¶Í¦8Ú§È\[¨,¹’œ4ýõ7ä•(6¹"@ÄÇp8œ÷ŒÙŒÂ›©ˆD)Ogq*‰¢LÍòí­aïì€9˜¥Z†Po/ŽNE<KIñhvù9À•š$lv¹úyN€Îß}ÿñôü짋ãE,ç—çß\,¹¢óÓóàèìâøÇã‹Å’%ŠÍß}{üÃåÉnEÇÛóïq%ÅÏH/NNO.N>¾;YüzùÝÁÉeÿ–ð½Œ
-óß~þ•ÎVðìï(i¢f70¡„¥)Ÿm¤DI!üJyðéàÇa°kNòQÂEÄ'ÈÙUJ"Á…c rà
-¥tþ^ÿB)¯Š®¨+|jV­pðS›­µy/`åV:[rIRɤÅ÷®ÞnuÕµxh›Ý:4»Îòöf£›KæWºMÖáèfStºÝe¹~AáiÃÏ µ¼® ýë}“ /0+¥&†tC,‹I*x‚Ä.Û«„àpØS.„˜·]Öt¸qSt\ì6¶»©q%ßdM–wºiqãè ®ÿBmˬÝÂ\!:Xce™jÀ4Â;ÞáŠÅ
-Œ4žgžÑfoÜ•ºÓ¥Û\é²ØÇW8uTÐÈœoý™þ‰† _°y>Ï*\9p ÈaëêþRÃXœÔ•¿;ÃÏ®nPVv÷³ß½‰Û7•Eå´¢vŠ`n0_P'ìí¾ìŠ]éà̉öŽäã±äùHò\0ó¢ªîpçÊA
-ðö‰rü´û„V5~˺Zƒ³uDûGÜNPé€8ÿjî„‚%ç1a2HÄS’$qŠ¶öÕW½µÉ4´6˜9%1C§Á0B 6ãgí¡ÀÏšùÑ~C?kÑy‰SŒ^öR°©jïÑÖwîÑΨÕhg·¹m—S–WäYiüad½ŒñÈ"1X¿‹Þ‹˜±ufͱÂi–[#¯Ûçƒï23sñøŽöGý*¬m²k[WnPÖëáÌàwab]䄹M8ÌCë,ß «Þ½zw‚^+ô6V$ÊØhaƒ–ñ–Œ:oið¡·|Ž:Bí|™oY2nqhoŒ¸ö9¬ð×ö¦îÞŒ0âL_ëÊUï×w¶ãp˜7¡BþÂG¼Ú®Ñ×E½oï›ëDØܧ.ËÐꌡxIìtãöœÕNëo뽃ÀðóY7ƒ-=e·½.„æ:!lH!ˆŒÀPKéI
-ÞÍ'ŸÈŸ¿£÷±cÅ?«ö<¼õÓú/^ ôSµ–H"¢€£Ï*¶'iªät±„&œÄ)•ãÂsp¹¡?1F5µ1’„ªd¨ÉxŸi€
-Dœˆ˜E3 ÀÇ•eÑ¿›P¨
- Jv€‚ûeL¨ÀGþgÁ$<Ž¤C¼4c[$V!8hõ¶ÈëÒ” fj\¿ù½€Œ©õ7 0:ô9x¶vGM £¹Cž¹û|p´0{êìn‹ßÛ·´M„‰sQ½/MWÒúSœe8ýsÁ”‹Ç0ÃÚÓ,™!fh—f'x‘9]T+°(}q·ó`X €­Œ`Á]3TºöÙ®‚ÂB³Ó“ ˤÉ(%<I“™SÓôåšol ìTèY¼Ì.ÇÆ$i,ÓDȈ‡I õ-"×Ýx7Õ8-|òsÖdÛmÖ<\Å©ðÆÇÁÊ\ßF)~î·"aÛ¢µa@lœ¯“§‘ë Ž!ŠÈxþéœöp.蚣£W¨ð䃊`£¸òÑS‚»zf₺r¥»éRЮ{c°Ø2Ü ðÝJë½…0úœ—u‹µ1ì]A– í[i:ÿ`˳pg‚~é³;= «²Î‡òvµöý%ŸÕfa*+[Ÿèf[T™í‰ŒëjwUÀè‰ÆÂ¥O Â.€¢cß½½ÝïLD¯¾¾kŸ øKÏXœFUô[)Ø^léï
-"#°ÿXKóžð'î³{Ò’)pJL7+SAD"ÀºcJb¼ÍòrÂ8M èŒ]`\aÓ:Ò(µîâC•mmÕ+ç?àR¶Z¡ZºÍº|cåe¶K°YÓïJSdãå9BǶÕØaùVNéhß6­»nú’©½ï€A²
-ªîYÈŽ—1؈R±((z>Jâ!™IA¸¤ì ™Éˆ$<Š{kmê²}†äòÒYEÛ·s{ã²]¶ãîß•îùë˜~u;dóxmH&K©)@|*ÕT«|‚8¨RÒHxâö]QÝí‚16D†{^Æðÿ§ ƒ/Ó'd($Ib†©Z^{¿ÒOŠÐÁµ#ôߧ™ÐóZL{}gEcÈÓeôӌҰ³„ßôí“ kw:/ ƒ,Ï"j× $¯Àílû<‚¢2;Øy‰\
-ßlzÅoÞg5¾ñå6ëåTÛiоíCÕå§ó³GÄpâµüÈ×Wib$ùãÒJ¡b¡þ´P¯×æýM^"†|Âæ>0rÝûòƒæÚº|X¼6ó¾Qa ¿} ç,,"ØB1¿µ±y‹ >W˜ˆ3ídRïe°áuEõŠ–¥€V%žðF±"4UPÊ›F?MÂÉF”ûq@¦$Š"ßfÂá>ZðƒQ,m½šLÀ¦‹60¿
+xÚ½koã6ò{~…~8{3|èÙ~Êf“\ŠÛ´—õâîÐ8EæÆBeɵäMÓ_3R¢låÑf{ñ1ç=c1áð'&aÄ¢T¦“8 XÈE8É×G|r{—GÂÂÌÐ܇z»8:¹Pñ$ei$£ÉⓇ+a<IÄd±üq1Éf€OϾ¿¾¸ºüxs:‹ƒéâêûëÙ\†|zqõs]Þœ¾z3›‹$Ó³¿Ÿþ°8¿¡­Èâx{uýŽVRú<‚ôæüâüæüúì|öó⻣óE÷ÿ½‚+|ȯG?þÌ'KxöwGœ©4 '÷0áL¤©œ¬‚P±0PÊ­”GŽþÙ!ôvÍÑQþ ΤŠä1ÆÀ0e‘’Ê0ð«Ù<â|ºX Ü7£±Gy½^몵»ºê7k;þx}õo5+]– 2 ( ÁÒ0”þµYµ¤ÁFoK„;¹>ÉpJ)&D'mò– BgÞéŸ8—UÑx3ÊÅ ÃÁÇ&»ÓŸâ“K|gô¤†­³‹f³ÑÙÖ¡|¸_éíL$SM+í*kit¿*ZÝl²\? p´Ñ§W±¼®þ»Ý6ë_€+¥fËb–*™±ó¦}(á*¥¤Fƒ35mÚlÛÒÆ}Ñ®h±]YØö¾¦•|•m³¼ÕÛ†6NÞÐúO<äM™5«c˜‡„ÖA¦"˜¦Ç›Z1àš‰C‚ ÚV˜Lßê<Û5z¨ $V §x<Í£qoÜ”ºÕ¥Ý\ê²XÇ—4µTðÏ7îL÷D$CÂãgbڡϳŠ·²ØÚº»”´'uåîÎ賩·$+³ûÉí(xYTV+j«x~Aa¬°×»²-6¥…ÃÍžäã¡äå@òR |QU·´sk!
+LHE(ãÍã{¦˜…“«µš¼«á‰ï•ïÜClùÖœdC¶ïŽùøÿÌD
+̽·%1SA$ýfŒ)‹Eœ¸n–ímœ5.
+—ú\n³õ:Û>ZÅÖ:Áö$™í:À(¥Ïaó!R¸Ø š
+Œ[†,Šñ6ËËãgÛ¸¸¤þ¥q¤QjÜ%ć*[›š V®~ ¥l¹$4tµùÊÈ ·K°Yìv¥)Hrk‘å9AǦÑØRñVŽéh×4­Û•ÞvSsè€ãsqÏŽ×ñ%Š(î z9Jwâ‘AQ”<#2òqh›†M5µ«Ÿ‘[^Z›hºVnÇaZXAŽ ËfØù»Õw-ËoúLþ°û-RŽÅ‡Ë£¶Õ2!*”ÕŽ€vmQíÃL1}\‚w^Çî¿P‚ DC!¢§%˜@ôLÛä
+ós.ÔÓ‹c–Šš¿è‡g¹Õlt^ w Ã"nË ¯Àݬ»ü“÷Áê·D¶î„o¶ ‡’7ï²×î²›õhøß¿{éÏ®éBÔâÃÕåã²òøð:Æ`[‰â È*bI”¨±ßßøäYÕé¯}}öÄ ­Dú…˜gñq‚¨!.dU JN÷³ …òHÿ’ Q>endstream
endobj
-1187 0 obj <<
+1555 0 obj <<
/Type /Page
-/Contents 1188 0 R
-/Resources 1186 0 R
+/Contents 1556 0 R
+/Resources 1554 0 R
/MediaBox [0 0 595.2756 841.8898]
-/Parent 1158 0 R
+/Parent 1562 0 R
>> endobj
-1185 0 obj <<
-/Type /XObject
-/Subtype /Form
-/FormType 1
-/PTEX.FileName (/usr/local/share/db2latex/xsl/figures/warning.pdf)
-/PTEX.PageNumber 1
-/Matrix [1.00000000 0.00000000 0.00000000 1.00000000 0.00000000 0.00000000]
-/BBox [0.00000000 0.00000000 31.00000000 31.00000000]
-/Resources <<
-/ProcSet [ /PDF ]
->>
-/Length 557
-/Filter [/FlateDecode]
->>
-stream
-xÚm”In1 EOPw¨u€$ÅIg0²Êľÿ6¤¤êV5 oʯÅésÀóή¯ƒÖ×O²Î Ž¢‘ÿ¨#h8Çùø:„5?ùÆ [ÄIÚL’~”F Ø PÈùYÌÀ¹dˆÐzZ8å±Ýƒ²ÙËò‘–Œ€f¾Å(ÌÀE#@x˜oL Û¹[ƒ±ñðù
-6\>RgÈbÏWÖ¹j[†›
-WŒÏ¢®{6;»²þFÃÇñ÷ø]š¨)Õ/Ô¬Mu;pk;Ì©Ëdh<åE–ñ¬AÏw³ð¬±±Nê¦ó¡Ä½t•‹ùD„™Â²]°Ä(‡;„ ·åŽ°Š­r²ÂÙÄLûˆ T¥Í¡誋ŠŽt’¹w_ =Î]ˆ‹=¦uSä÷—ä"ï±yl±‡µÃ-ËkHsŠöreOÚ³êvg›<7ºt,‡Ýe—;ãÒèЭ/I…B÷&ê(ýê³ö󻉨YÙ¹Ç,çkRÔšÚ'^ m" ^˜h±ÎW9AVªy­Â©/fýÆ"•œãûFy-Sng \Çdª¼˜©Æ¥†Í}B©•µŒÎ$âw1.¶&Øíþ²C¶O–ÃVç X×9g¹E{îÇ< •ãóP)!ÍZÜÅŸLÞª~ÑÔ'¯UâXLµüc“ÅXsЖõÚ¯½˜Ó’~òBL–§èªÆ¹O¦ºNZ_[Èü.øšŠû*]3QôçÇñ!Ö-žendstream
-endobj
-1189 0 obj <<
-/D [1187 0 R /XYZ 56.6929 794.5015 null]
+1557 0 obj <<
+/D [1555 0 R /XYZ 56.6929 794.5015 null]
>> endobj
-270 0 obj <<
-/D [1187 0 R /XYZ 56.6929 769.5949 null]
+382 0 obj <<
+/D [1555 0 R /XYZ 56.6929 730.9277 null]
>> endobj
-1190 0 obj <<
-/D [1187 0 R /XYZ 56.6929 749.9737 null]
+1558 0 obj <<
+/D [1555 0 R /XYZ 56.6929 704.9004 null]
>> endobj
-274 0 obj <<
-/D [1187 0 R /XYZ 56.6929 282.0726 null]
+386 0 obj <<
+/D [1555 0 R /XYZ 56.6929 236.9993 null]
>> endobj
-1191 0 obj <<
-/D [1187 0 R /XYZ 56.6929 250.2286 null]
+1559 0 obj <<
+/D [1555 0 R /XYZ 56.6929 205.1553 null]
>> endobj
-1192 0 obj <<
-/D [1187 0 R /XYZ 56.6929 191.4593 null]
+1560 0 obj <<
+/D [1555 0 R /XYZ 56.6929 146.386 null]
>> endobj
-1193 0 obj <<
-/D [1187 0 R /XYZ 56.6929 179.5041 null]
+1561 0 obj <<
+/D [1555 0 R /XYZ 56.6929 134.4308 null]
>> endobj
-1186 0 obj <<
-/Font << /F37 802 0 R /F21 714 0 R /F22 737 0 R /F41 939 0 R /F62 1062 0 R >>
-/XObject << /Im3 1185 0 R >>
+1554 0 obj <<
+/Font << /F37 1018 0 R /F41 1208 0 R /F21 930 0 R /F22 953 0 R /F62 1352 0 R >>
+/XObject << /Im3 1500 0 R >>
/ProcSet [ /PDF /Text ]
>> endobj
-1196 0 obj <<
-/Length 2134
+1565 0 obj <<
+/Length 2383
/Filter /FlateDecode
>>
stream
-xÚÍYMsã6½ûWè¶òVˆàƒˆääx<§fœÄvN“©)Z¢$f(Ò+RV¼»ùïÛ$ʦ,;ÖTmù  4¯×´pøƒ4a\Ùx`lÌ.’Áh~ÄS{w$üœ(LŠº³~¸>úö­2ˬ–zp=éèJOS1¸žþxòËõÙåq$>Ôì8J4þp~ñ†$–~N¾x{þî·Ë“c¯Ï¾ ñåÙ۳˳‹Ó³ãH¤‰€õÒkرàíùû3j½»<ùðáäòøÓõOGg×ë³tÏ+¸Âƒüëèã'>ñ:âLÙ4¬ Ã™°VæGq¢X+$åÑÕѯk…Q·´¿X*&¥Uƒ(á,b÷®´‡]}VZ´s{ÓHˆ„©D¡Kâ˜qË7.‘¢ã!3Ò&“X¦•TÎ'ó¬ióEƒØÀ|ÙÏS&bƒûàÄqþ;ç²Ê›ãH™d˜áO<¬²y>&IÐä:eÑ´4cR/HTT£rÙuº4޴˯²òšš2»ËÑ"ØŽÇl’Hgÿë*'—®7ÃΨ̖MÞ°‡N¸a©ábÐæu`++Y"´DaÂ!ý'afÊå>ÿ©Â:HêÛ }†ÿFuÕ.ŽE:¬K„ͦÃiYßd%¶í°Éwù‚ä0]=].²Ö¹ '„}Ü ç)l4yÛÐø8Ÿd˲m¶ÝF÷Þ…
-üÍ©^ÔW½2:™Àö€¯­ei¢cBÒS1j¢Ñ,«ª¼|Vúƒ,ã@Ä ˜h N˜Ï—U1ò.p¢ ÎõÚš~§yKl4Ê7hpöìÚ+cÁ¸„ÌL{Rr}lZ´ž·uÍ6çÚíÕ.^ÿÇWJ -»ïNi“0k:~»X›0Ž¾ä÷/{Îð2@jL‡n=õß\\]R>hÇÔC]”¯¨ºÁcµQ Þ¶œÞ–»"_½IŸqÜZ+‡O
-Á‰‰`% ¤â"pT’¾«`¯ŸÙ|žyºwÏËñ-‚,`§@“¦_/êýÇ‘ÂðŽl1úl<^À›øyžµ£ÙgW5àÜèÁdÊð}ßw0°!†ÈÑþîáäž½¡›WlÈ1ZhüÖdÓ¾»ûऻCI¤!”p÷ž$
-¶.5 ³J·ñEÝ”xfV J;€P²e xcp ù‡ (/¯ãÆKBΓxU´³>gRfù:Ñï A‡p“c•„ÖÑF…ßx¬' 4?& Í|5#fŸ¥³Vµ¿?‚Õˆn-VDb}´Óډ׉%¼EÁ×)Ëz•{ñÆ{à&Mjœ…™ÓuÑI=ªn–EÙFEõÝÃNˆ˜c$dYÈGJ<ï5‚ª^óÒרoU°ƒ”|ù3E
-¨Ž0 vr‘(¯‚bFKŸK«ûž ±
-è{¡ÀkŸ•þ¾ÌꦷªFæ
-‚*oWõâ uŠªÍ“ Ž†Uß'¥6ä抶ùžë@òÚ‚7xèF*ùKjè°b§ç¤Ñ,NíÞhXð
-³q]•·Íó]'lì 4”‹y! ¢!!§º‘ý’Oqlí/OÂøjVàSŠœkPF®éûŽ;ËйBwrãwF߯jÇD`)ihÚ¸&aU·Ô¸%¢páRŒýŠŒ~VŽDC£…A¿nœÃ6ó¢êý¸L!%c¯Ô=ô’¤Ì+P2mg õ]£=@MôÐÚ
-zGºÄð¼¢±féØ$+A0Êšü›Þ/A†ià’ëªd·«£õÜ­²©æÝ„·¾8ÁvhzÛ·ùZÞ|C²? "Æö¥õJ,Neªº¶îÈ(1§ï54s÷­í^‡×]±Í­}I™{xb! æ‰Lð?@ npúÌ2W*°ß¨­”Þ)~Âÿ°D
-Utb75ò%ûìOŸü_XØ)°3ñdd£eSϸu‰>Ò ¸b-µ±{Ùíg^®ó_R!KLŒ™™X%NÅ?ý)í é§Õ~—ÛzÑ®uo:Ÿ| Š„4 Éy_µIk1´u$÷=1¨ÁøµØƒ¢ÔïêTà Oõö]|„
-clkïEqYú“fPgP µªåü&÷pÖ«*4»âé¢^Þ>¿èDûL{x_¤}¥{ß_UÂb
-€öÒÊçþgvóokp±JÓ_Ö×Î…–+ñ(K©”%©4=¦ÿüÑU&endstream
+xÚÍZ_sÛ6÷§ÐÛÉ7  }r'çNâö÷)Ídh‰–x¡HŸHÅõÝõ»ß.¤(‡’ìF7“ñ°Xì.v YŒ8ü‰‘3Œ+¯GÖkf¸0£éò„æ0öúDÄ9“vÒ¤?ëÇë“¿½Rvä™Od2º¾íñrŒ;'F׳÷ã?ûåúüêt" 'ìtb>þñâò%Q<}^ü|ùêâõ¯Wg§V¯/~¾$òÕù«ó«óËç§ጀõ2rرàÕÅ›sj½¾:{ûöìêôÃõO'ç×ÝYúç\áAþuòþÍàØ?p¦¼3£{èp&¼—£å‰6Š­TK)NÞü£cØ K‡ô§¥bRz5šδ»w¥8ì›°Ò£œÛ›N„0L…&ÑšqÏ7&‘¢g!³Ò›‘5ž%Jª`“¢šÏórŽºù²?Ÿ;&´Å}pb}—Móß8—Y ZUv|¿Hj5‹ n\g«ÏÙŠˆÀ¸þššÓrÖ.QáÆÙÖº0—,³S1®ëtN›¸qçƒx œ•yc$ ”• {lSÃ-s–‹Q__§_å%3"±£I;á˜&“0ÓqyÈdÊ@Cx2Ùý
+ÔsÐ`ÓªDsÍפÂvEŸ¿GH”é2› ðUš%VÅIMu:Q‰§E- Ö6‘TÇ/Ñ‹|¾h&÷~h
+RÁI2K³I°íÄi¦B\!SÀXV%Ýà߸áòKÃœ–>Šô2x
+F'ÏVMšÇÐ÷¥‰P»‰°‰)}î(ÇN:;í&­ó}ÚïëëTõÿ½4*aÚëCÊ7pq¤Tð=ˆOù´žLiYfÅ“â„™6kÄLÀËåºÌ§ÑÔ² =L‹øg 5Òé4«Ã ÅÁÜ¥ãRªÉwÒÍÛ?ݹöXu£®oùJI¨#”;”É &’FY­!'Ì&Ÿ²‡ç¥3¼ Ý8¬§þËËwïÎ_PîQhOÔoùšpÎ@]s‹H˜°\ElPè~ªF1å£6mO{Ví¯Rn2êÊîj­ïh„fp@€MF
+LçG« %´œ.Ú¼³„ÀÙd%²=†ìiè¾Æ9DÞ‡²¤ñ”m>çÙý³¯DÌa­—ãÝŠëKt¬Ðþc*Î&Ì
+w¨ª26áÚm
+¿oÊ2(3Ûʱì /eºúv7Ȇl기-Zë@mwZ4V´­étÝ¢aGt6„ëX'YÙnÑ¥%ƒŠ\Z&§BŸ¾ ,
+αú.ˆß»V øæµJ—Ë4ÂNÝ?/GLÁ¼¤àÀ !ND!ÔûO´mÔÛ·³ÚõÇeÚLCùJøG“©„ÿ㇡ƒ <'‰( $è%ݼ|‚©4Ưø`4`±G'ÝíJµ®„»P~¢ücÓãëÔ²uÏסVÆOý°¼©Š|J=Ò*¶BÖÃieü‚* g†õÉ8è”ÆP± ªdîÆq«9•ÐÊÛƆ÷-•|Ë-AîV9xÁu r&K)ͤ“nÛ¬ÕmTë–LÁµI&Ã)ñB >>‹7¼Ùn*N"¼‰!¾Ýœ½xSwï.!}C]«¤ _V”õ„'E¥’  ¤l ƒQCaþɤ¤.×uäq)mÌžù>oCxÜ:(µ»@¿ÃpZÝÆ€› Ë]zÏÄò¸ñ´•ž$HPñ3¢@Áu¯ ?àˆ—U¼?œÅõ=#ÑÛiímä¥ÍEÝÓ*vŠ¢ºÏfƒú¾^ÄI·Î"Ô]4Ò
+ÿ ¡ 6k „ÌjE¥Õ_ã1í è§Õq—»jÕt¼7[غã˶§˜ÉùP J E.z—Œëñ„¸{P¢öe°t^¼_GŒ±þ²¡ÿ+’]ÓSÙc_ᣃØë©ÿs²ù‡ÐrnÇÛJçœQ(<“V_\eðHã¤ý|[moendstream
endobj
-1195 0 obj <<
+1564 0 obj <<
/Type /Page
-/Contents 1196 0 R
-/Resources 1194 0 R
+/Contents 1565 0 R
+/Resources 1563 0 R
/MediaBox [0 0 595.2756 841.8898]
-/Parent 1203 0 R
+/Parent 1562 0 R
>> endobj
-1197 0 obj <<
-/D [1195 0 R /XYZ 85.0394 794.5015 null]
+1566 0 obj <<
+/D [1564 0 R /XYZ 85.0394 794.5015 null]
>> endobj
-278 0 obj <<
-/D [1195 0 R /XYZ 85.0394 585.0446 null]
+390 0 obj <<
+/D [1564 0 R /XYZ 85.0394 513.3136 null]
>> endobj
-1198 0 obj <<
-/D [1195 0 R /XYZ 85.0394 560.705 null]
+1567 0 obj <<
+/D [1564 0 R /XYZ 85.0394 488.974 null]
>> endobj
-282 0 obj <<
-/D [1195 0 R /XYZ 85.0394 491.9365 null]
+394 0 obj <<
+/D [1564 0 R /XYZ 85.0394 420.2055 null]
>> endobj
-1199 0 obj <<
-/D [1195 0 R /XYZ 85.0394 461.8226 null]
+1568 0 obj <<
+/D [1564 0 R /XYZ 85.0394 390.0916 null]
>> endobj
-1200 0 obj <<
-/D [1195 0 R /XYZ 85.0394 384.4846 null]
+1569 0 obj <<
+/D [1564 0 R /XYZ 85.0394 312.7536 null]
>> endobj
-1201 0 obj <<
-/D [1195 0 R /XYZ 85.0394 372.5294 null]
+1570 0 obj <<
+/D [1564 0 R /XYZ 85.0394 300.7984 null]
>> endobj
-286 0 obj <<
-/D [1195 0 R /XYZ 85.0394 206.4979 null]
+398 0 obj <<
+/D [1564 0 R /XYZ 85.0394 159.3 null]
>> endobj
-1202 0 obj <<
-/D [1195 0 R /XYZ 85.0394 171.8379 null]
+1571 0 obj <<
+/D [1564 0 R /XYZ 85.0394 131.3824 null]
>> endobj
-1194 0 obj <<
-/Font << /F37 802 0 R /F21 714 0 R /F22 737 0 R /F41 939 0 R >>
+1563 0 obj <<
+/Font << /F37 1018 0 R /F21 930 0 R /F22 953 0 R /F41 1208 0 R >>
/ProcSet [ /PDF /Text ]
>> endobj
-1206 0 obj <<
-/Length 4496
-/Filter /FlateDecode
->>
-stream
-xÚµ[_sÛ8’ϧÐÛ)W ó”Í$sÙÚÍÌ&žª½š™Z¢-V$Ò'Rñø>ýu£” Û[É•HP£Ñhtÿºæ |¡Ë¢tÂ-ŒS…f\/Öûlq }?½àaÌ*ZMGýõêÅ_ÞK³p…+E¹¸º™Ð²³–/®6¿-ËB/[¾ýùãû?ýúéÍK£–W~þør%4[¾ÿð÷wôöÓ§7ÿøÇ›O/WÜj¾|û_o~¹z÷‰ºÊ@ã¯>þH-Žˆ~z÷þݧwß¾{ùÇÕß^¼»Jk™®—3‰ ùŸ¿ýÁXöß^°B:«÷ðÁ
-îœXì_(- ­¤Œ-»Ÿ_ü3œôúŸfåÇY!d)2|Áyá´3 jW”RÈ$ABaŒ-×];º]O«ü<TC½¯Û>¬gL´ÍÐt-µTí†^~í«Ûe3ŠÉ–±ÅJ
-ú½X¤p…TÜF¹r$e"Ö‡CS­©¥íÚÕ?O»ûãnjzCrØ ?!)ÂÛTŠ8=è$·…qÜøiß´Ip]Xà8,²ië!# ¯–‹©Þ¦ IÝðÃ.›ž+ú¼zû }÷ÝúK=Ðûô«n›ö–ÆT¡™ú»zÝà„ÝÌœ"UÂÑבå»SË$•+³rQ:VaÄsl“€Z›·L«Dq5%ÍÎD­4ì²3|œ9¼ë9¡
-^0m?#ÏßZ./Š@i0Êt÷»‰ Q|BJ›‚—¥™‹ ÚlD yXÅ+X¸”Ëûm³ÞÒéQЯ™²s«²®PVÖz{&,hZøþðËWE-Ý!µ”ôæ𧩠£„¾pÀŽqaÔEÁ
-0òVXž“õäš®&ÏÅ
-ºQXî.ŽzLª²pLE±‚ÕõCÔl¼"7Ê £¤òÿ3CÊVƒUŸŒúiVÁé=4ýxç$^èAðM =wÁ¬ySŒ²ïéIº £âFÙå}³Û¬É‚oÂfŽõià´@–s
-F¨­×è\¼—ÓHÊ;%E~Zªõº¾È×i°·jBà ==[øB^ð?zGLz:#K5jOi ½tbÙQ?Y3úÍ2!J*×ÍóD¯'ÓÀQ\ 7ƒ†è#o”Õ梪ri ر„“kKðߪª‘àjJñ\U¹â`œ'~LWUÁx©ŸÐU6 yý:矂ip ZvCÂ{莠ZÎE ¦®Ý=Њø\´ÎRñ$<PÚê‰G‚¤ä0Û®[Waºm×iK½×;ÙÝ]Wë/a¯G5ú¯qWÊ+ˆç0#,YHn"O`É
-<Ã=
-€†1–8ÑcXföß‘õ8Ýxœðãîn×øæ!y:2dAûh¬O¿CǦ aÃÐþ©ExñMG$mƒ÷fèëÝ ‰‹ÃA!@£ÇO?ËÀQQºåÝ¡ÙWžGø¨ŽÃ¶;4ÿ›RÞn¹¯ñ 7ýžÒ”Y>ŸP÷p5|¤3þ|„¡¨‰¬»„ý2¾ 4ø!4Á B´R}‡$h¤¸š’̘` ¸Þ‚¤Ò°gc Ö
-0%ÿÁÄaTôð´ü[LÌXIL—ªœïpFHà,¬³r¡ ¼“ýÍ"ŠôV‚ç2àv0|‹ƒ.B üF+å †²ËwùÛ³Ô3X4æ.+fo¦o¾×bÁÇW‹Û±Ò=½\øB«2•"0;rÉ Þýõ†Q Ý÷[m$øøj
-ø˜T›à‹ÂÜ(,x1'€AÆ%(Ñ纾TÏUVLK‹ë£¾Ãí‚^>å*ÙÓñ$‘©d§Q¸Ôß>Õ{r{F,?RùÊÈå4·ÔúvÆ?tz²ö¦õ³¸@묓œñ~V;N£ž`¶¤à|ÏxnÚ³Y¯k.øs%–Æ?5ÿ]ïÎ)n'é@ÌW
-8u@ 7I "[ç6
-ð/õ5-å4!‹Y?ZÚñµÎP4*HÒ7žAån0¸9§_
-X½ŽwïÃÃN¢c¼ÓÇYë–ÞÂE.l‹×Çf7 ¡.è–N,Vbßšô³"÷Ë¢âÍø¦¢tiN"ÊÇ¥ !‰LâÁ]{+@vyŒb·S]ƒ9dÂpH|…ò¹Å…¬—«*WÆ|4sÏQ³RÏ|º‚¥N"v%íç(N9¦©o@bÇ"båº
-%ïQ ¡ÜMiM}=+|ÃË¡jûx«Ì:Š¡ò*àä€@WØ^x³¯Bs‹U
- ÁèM¦%£-Þ¨x¹V¥Ü|7Ím3Pe&†H7- ,3¡’iƒ±ff<ÔØ:–Kàc¿º?Lc†í14yî°És‡/dòüðl Å¥RO>˜í¸7ylÁ|ˆø¾úBlá:‚½6àkÁhŸØë®ï›kŸà’lKC•wlðwK$¢oð“ä%¡;l
-´[zŒ0' iÆÌ høKã¯]BñE‰ÞR¡Rºp7 :`:o}ahÜѳb®§o±A@"ÒÃûîð%,5Z^
-Ú¥[,><P›OÂ(
-}Hú*fOÔ˜=9·-<8þïÈO¥bvu3ø°j¦ƒ] ¾ß@ì«Í r iþ¦È°Û%È.}nÚuM)Ô!k¢¢Z‰g™(;^Vš™(¤îQé¶÷×s¨ ïgïèI…Êĉï>\VÉíï@¯ý)ÁQG–hßГ$„¿´Ô
-oD„«Tþp`J“FЕ±íŽ» 5¢É£·œOåë—0­×*<ù«!R&lußøÒ
-IX‘”2W‚`É(|ó? NêP3‚âBMÅØBY ˜Â•Ë³úIúïÂsÖÿb]+endstream
+1574 0 obj <<
+/Length 4330
+/Filter /FlateDecode
+>>
+stream
+xÚ­[_sÛ¸÷§Ð[åŽÅÃ_‚HžÒ\rõM›»&¾™vîn:´D[œH¤+Rçs;ýîÝÅ )A–;ÉøA$
+lþö‡ﯿûéã›K£æ7×?|¸\Íæï¯ÿòŽž¾ûøæ¯}óñrÁ ÍçoÿüæÇ›w©+÷4þtýá[j±ôs‚èÇwïß}|÷áí»Ë_o¾¿xw×2^/gò¯‹Ÿe³,ûû –I[èÙ#¼°Œ[+fÛ ¥e¦•”¡esñéâo‘à¨×}š”g™¹HPñ‘
+Ó‰4-sû“Á13Ó½lAÏJ/ÃÜÌÛ;ü-ÜG®¡)·5uÕî7P,8ŠÎ$P~ï›LŠŸ «Ãn/
+ꢥá.-Lv¼’.0Ž„wÍj™Ø!3.ãvíûzS÷OD%BŒ7~Âe»Ý‚–x® ßÉE
+›IÅ´5jñÞïêê·ŠZš¶Y|ûáÓ¸»Ûoz¯§w$ˆ­WJÿ ‰žÆbÄéA)¹Í”…5à´oš„(¸Î
+àØ/²nª>!  b .ÆŠwDD}×b^wÔXÒëÍÛé½k—Ÿ«žžÑ&TMÝÜÓ˜Ò7“f@C÷P-k<ƒ°‰c¤r0†:°üph«¥²c…œÕÈ
+åÖZÀ
+‹"m«‘âbLÒâ©^iØekø03røÐîRB<c6h—;$/o .OŠ@ipSÆ_O‘â(m2žçf*‚rµÚ §ð
+.åüq]/×tzôk¦Š©YY–(«¢pM iþýúÇßµ´»Ø’Ó“cÀ¦LŒúÄi
+&Ó`ÙG£~aš•p€wu÷ž9IØ{}Ý@σ·lΣø;ú%õ†Qa¯Šùc½Y-ÉŠ¯ü~{õšA€Ó×LæS3
+v¨©–è`œ§ÓHÊ9&E¾ZÊå²zèÉßiwÈ°·lž|Ãý:¶ð<á:GL::K*P^
+epc .ѯs±“YGþóêpŒÕr:q#"OÎr'tå-½ý"„JÈVÆr°‹ç¬¨Î€õ|bE‘¢£ ­i=k·ÕÀÑ ©„zÂ+ ?lžYSiàP&ùr (.Æ$ÈÂ3‡ÅÇaÏ` Þ…ÛáÔhÎÀ`ÎoyC*²Å·ˆ£±í½®»nïû$îL<"bºŽ&aŒð«£tÉçþ[Ÿ/£¹}¬{"°P`ïòx¦Êͦ}LÙ ‹»Ž †É` TØaZ'm§ÉU8ìî"ôÒÓ@âÄh¼;M¡%…2Zx[ Sx Þð!Þ‚L$Ô=yyx½-½Ö
+³H=8*l;š;oê&*œ
+¡ûW“A¤xFRÎñC¤†a™.
+ œEa ÀLf
+¥ b¾b/ƺsÈãøås û_‹2U™ÆÄ4SÏX³<Q<Hl6ì Ö¶_¢8ù¯¾‰íc¬ˆ%ìÒ×¾úº7å?,4uÕ¤»²é³ÂR`í”`ñGºüöÂSqåë™k,W¸H F¯j?-hqFÅÉÅ°L(up¤Võ}ÝS‰&†7. ,3¾¤YxcÍÌp¨±u¨›ÀË,~y>ŒcúõÞ79î°Éq‡dòÜðd-Åd¹Rç+ ÌvÜ™<¶à®{"¾-?[¸o¯ øZ0ÚSq<´]WߺL—ô`[*Ácƒ»g"}ƒŸ$/ Ý~S ½ Ÿæ$ÍBƒµ§¾4îR*4ì”è=U,¥õ÷Ä ¦sÖ††=ªº9\¦Î€"ˆHD¼ÑöØî>û¥Ë
+9ѽ1W·.ýU¥Q^^‡«ltsiçÛ×þzÖ`šX°ÏxÀíQºº¢¶ª;Ïòxš!ºÄ¢W‘ƒpÇ€~1\Má™$¿ »à…Kq˜x•Ò/Lå6I“«“4ý­€ûdè»"ÃÞ¿N©+Žåã8èð?aR‹ÌXéÊ™T~oñ?b´ÿ@"›ýªJþCÌw»¤
+kþï%A\uWo*´>¯O¦—u†ÿ•HL²Èüÿ£Õ†xB…8‘i5EAƒ Láj”:â<üGÖ1ëÿnI”endstream
endobj
-1205 0 obj <<
+1573 0 obj <<
/Type /Page
-/Contents 1206 0 R
-/Resources 1204 0 R
+/Contents 1574 0 R
+/Resources 1572 0 R
/MediaBox [0 0 595.2756 841.8898]
-/Parent 1203 0 R
-/Annots [ 1208 0 R 1209 0 R ]
+/Parent 1562 0 R
+/Annots [ 1576 0 R 1577 0 R ]
>> endobj
-1208 0 obj <<
+1576 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [55.6967 480.2482 256.3816 492.3078]
+/Rect [55.6967 387.5149 256.3816 399.5745]
/Subtype /Link
/A << /S /GoTo /D (rndc) >>
>> endobj
-1209 0 obj <<
+1577 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [268.5158 480.2482 332.4306 492.3078]
+/Rect [268.5158 387.5149 332.4306 399.5745]
/Subtype /Link
/A << /S /GoTo /D (admin_tools) >>
>> endobj
-1207 0 obj <<
-/D [1205 0 R /XYZ 56.6929 794.5015 null]
->> endobj
-290 0 obj <<
-/D [1205 0 R /XYZ 56.6929 769.5949 null]
->> endobj
-1043 0 obj <<
-/D [1205 0 R /XYZ 56.6929 749.0409 null]
+1575 0 obj <<
+/D [1573 0 R /XYZ 56.6929 794.5015 null]
>> endobj
-294 0 obj <<
-/D [1205 0 R /XYZ 56.6929 209.5509 null]
+402 0 obj <<
+/D [1573 0 R /XYZ 56.6929 692.9565 null]
>> endobj
-1210 0 obj <<
-/D [1205 0 R /XYZ 56.6929 183.9497 null]
+1329 0 obj <<
+/D [1573 0 R /XYZ 56.6929 660.5438 null]
>> endobj
-298 0 obj <<
-/D [1205 0 R /XYZ 56.6929 147.0778 null]
+406 0 obj <<
+/D [1573 0 R /XYZ 56.6929 112.3379 null]
>> endobj
-1211 0 obj <<
-/D [1205 0 R /XYZ 56.6929 116.7981 null]
+1578 0 obj <<
+/D [1573 0 R /XYZ 56.6929 85.6994 null]
>> endobj
-1204 0 obj <<
-/Font << /F37 802 0 R /F21 714 0 R /F22 737 0 R /F41 939 0 R /F48 953 0 R /F14 740 0 R >>
+1572 0 obj <<
+/Font << /F37 1018 0 R /F41 1208 0 R /F21 930 0 R /F22 953 0 R /F48 1228 0 R /F14 956 0 R >>
/ProcSet [ /PDF /Text ]
>> endobj
-1215 0 obj <<
-/Length 2349
+1582 0 obj <<
+/Length 2372
/Filter /FlateDecode
>>
stream
-xÚµ]sÛ8îÝ¿ÂÊLÅòC¥ÉS·›ô²w›½K½OÝNG‘[³¶äµäd|·ûß$HY²ä:½Î’ €
-ÞÿíÝ?7W!—4ˆÉU(cüpwÿ#ΤøyÿËýí݇_Þ]©(XÜýrÓ7·77÷ïo®B–Hû¹£pfÃíÝ?núððîçŸß=\}^ü4»Yt²ôåeTAþ˜}úLçˆýÓŒ‘&rþJXšòùfIAd$„ŸYÏ>ÎþÕì­Ú­Sú“"!2ájBœÍ#©”| A™’Xpa5h„V 
-” ö†‹»å‡žvøah_à1]#øG£ö G`ß#n¤$à½é€›‘“tX—xQ3<€"2àõÖ®œÞò\l£P”$ŒË¡5櫬ªôÍæŒNYÄà¶c5iJø%vØá},Ë)Í61`r8IAlóHz¤ÍçëçŸPòš$¨,Æ(Q±0ÊJH"hú Å È|Í_
-ÀK¢¨<•
-*žÊàïúÐà … ÆŠ€ECÄhaB—0œáä QÔ1wJÁ£rAãiDGo:ª€G_ˆ5$Äÿ5NáI€$N&‹ÖêªÀMc–£3”cJ»\I"˜Šspkí®^7RÀó™˜gæÔn¬6#0Rˆ røsb‘˜I5—qL"•$—ÜØã‡ý Ž4¢ûJW– ZÁ¬O~ìÌë#jÇÐhXØì÷jÚ ‡¯¤Ü‹™¹et%XÀ¡ J˜ q.*Hqb`îC(€sHˆâx.#xZ"•¾&#ã$M@¸É|,ì(†}’VYCÖ¸$Q*£ãɆŲ˜ò"ç¦(ÅcÒ <£©â*ø½ª_*³¿¨@³fÓU¶Ñv'J‡”áJQo²Òí7Xí«ò½^paªj˧dU¸ip
-I}*ÔèݳÞMy)dnŒOwÇ0BäY0í G(Ÿ¢·«Ì͸Sq¶îG-ØW.»À‰Iî-]ò*²êÇaâŠyiþ&kó• . zl^Ñ~lY—Èr¢•$ €7¸7‡LTV{à•ΉÀ°¾Êž5®=j]á\' ÀN˜Äff­
-û'!K°˜Ä0GxHâïŽXž^Ø#8XÌK¦,éŽÅ'ÔFŸÉtXÉDöb–Q+^kÊ-»P»kpë.Éï]ŒÛJûo¶n Õ6àzB¾Áb6Y"žç-”bd¾.ÛÌÆ4<Š…GDÉ™^ÊX”v½ Ôõ‚ÖõréÌùé„aÛ§#rì€1ÙªiÓõ¥ý„]‹ 7ø‚éZ€ÛwRØIŠHOåÚ¡o³v…»':o¬.d „GGZÞ_ ü'~öպܔö.Cèó”ƒ:úMùo=‚à…ëï 'år§6‡TÙ‡¿<ey¹†gpªMèwµ…Þí¦øúÓË·^å¸îóÁ¦Ñ& kGEå0„xº( N­‡j{ÉvUgþôvj?eÎvaf KY=Õƒm…~Ü;BŽ+ק@]PpýeÞ±¯ñáqA·à2mhÞpV'îA;ñ²Uõõå»GJCŽšSjKï—¨L[Ô_¯ày(·]òDÖoóõ¯—uvòÜ
-¸ucØ·uÃ}Eü?¶Ä©PþÝñL¾O\¤l¢-.T¯9‡5—™Åî¸0iÇè9Û•Úؤ˜|Ä`uBÛÉm‹qÑ °[.\ámpñÍ”+Ud²©LÜL5ûdJ 'ñ)£÷cñ }SDªääíj—amkÞ¿¦ÎK»Á^A½o·û×6º]ÕEókM`|“¹•N"Û^°W&úqÍŒl<q(/¦
-Ár“+Xw A»Ú™ù6ŸM„¥3;vNÌÕUž®4¡¬”Pé3æÎ%'Š(¯ÒNCÒ%%&Ðk;»]Õ/˜Ë¯÷.‡È× M혙%6Æ’}šqL‚Ñ3tAÎýñ'$1ÿÖM´Ùhç{ßý§àñS¨ÆD’œi¿ C­–*Ï”Q’§œwÿŽYÿ/%Ž\endstream
+xÚµËrã6òî¯ÐQ®
+<,Ÿ&ÛëìÆÙxœÓdjŠ&a‹>‘²W»É¿§)R¤,ﺶt`h4ºýB‹-(üØBKBE.TI™\¤å]<ÁÚõó8A‡ ±¾»?ûöJ¨ELâˆG‹ûÇ-M¨ÖlqŸ}^~üÛ‡Þ_Þ\ÒeDÎÑåw7·ßãLŒŸ?Ý^Ý\ÿr÷á\…Ëû›ŸnqúîòêòîòöãåyÀ´d°Ÿ{
+G6\Ýüã¡ë»?þøáîüËýg—÷½,CyVßÏ>¡‹ ÄþáŒk¹x%,Žù¢< ¥ 2¢›)Î>ýܬº­sú“B©¹šQ g ÆH,%iPÆ$\8 Z¡#P
+Îq³æ_I¹.Ì70âùrD÷ú±Dà’Š Wzg±óëMþ ˆ8øÍìÎÙ²éxIüÞÄÛ”‹Žo´“>y(¼÷ÕU±CèÁQU
+gRLöõ„ÝáÉC)’g~.™‘ R‹ë„zÎÍË\D€úQQy($-ËåßÍ®Á2x{Œ{ Çöˆ‘ÃU?–3ü‚¼Š:åN)"B®Ni<éDã RG•ð`ð qgÄ
+·Önꢙ+ƒ4x¿d»qÚ ÁH!>Èq;æÐ4$“j*A4„”SÝáà 3®4¡ûF‡– ZmH~êÐÖ).&ÔöaÒ²PnŸA|UÒ%,Ÿ=“ö ~AÀ¡ –8åÇ¢‚ö'¢)€sxE‘ ñ‘ŽÂ·¼Ã8‰µÖó¯° § I:eYƒz Œ¡êèÑ\-žÍy‘wS”âkÒ <£©âjù[U¿T& ~QvÍ•0<r• ÛÉña‘q%«Ë$÷û}½жÊßWXÂÂTÕæ;,¹y4>€1¶t®É—7-N£kðÐѳ®U:Ø!c|}^sT¸D!iWùBvÆK)¡ŒÏ=lÑ&}hÀdlºÇ`3AÇ‚ÜÎøSq¶F-Ø—?õ &Ü›û Õ©È©‹…QˆË2ä¥ñøeÒ¦+\@ôÈfÒal)rdžBŽ­—ÀÜŽŸC¦‚gG]úW’>ÖWɳÁµc*œë…Ø £]%i'К
+¢b-N‘Ò¤8gˆE·8½™/.££ÄäKLèYÎ kF}Yêýä€P…ò€ždü(½.ú‡#Ù]ÉTˆƒVÑÐb¶6îÏc
+q„Ìc–!l4+׬‘¢oT¸oFˆ'|7búz EF ˜öÉ],m“¨Ü–ˆTmË`aÁUÔr¢óþùêÈæ.~Áúçƒq\Á ™, c߉WÙaìÛÖ Ø½!OdFÙ1ÔÇLðC 4ѶbD‰®6´"ÈÍG¢Vy,ê3ö.B–`‰ `ΠryoÈêCŠÓ%lK0fz0fQ€f+b%µ„-«Y¼Ù˜: n¡ö7á×}?¸¿•Óvr Ú.æmµï·¸£m¡èÛbm_Jú…ÄœIc‚(Äm f"ÊøÖ¦Xì[CEýôä-úiŒaïhìûaLA½jÛóCa?#Fß0 ¾bÁ6 à÷<í$E¤Ç¼ðèë¤]áî£}8.Ô „„G{ZÇZøül«"/sw—!ôe.õ{úMþo3 Ç w³rùS›]ªÂ_}oz7º]mf6›9¾þèä+Š½C>ؼ Æ–aín¯¨ÔöžÓ¤) N­Çj{I6UoÝé5ì4Ý”=Ûš‘,yõX¶eæaë y®|§u9BÝÁõçéPÄ¡ÆÇÇ]ƒÇ´Íà«^ÜñÒÉVÕ§ï)÷fJlJ©Í;w8EeÞ¢þ|Ïc¹»Ñ)Odæß
+­ù|ƒAЊËXuLYÎÃIï·ÿ“sÊú_—0‰Äendstream
endobj
-1214 0 obj <<
+1581 0 obj <<
/Type /Page
-/Contents 1215 0 R
-/Resources 1213 0 R
+/Contents 1582 0 R
+/Resources 1580 0 R
/MediaBox [0 0 595.2756 841.8898]
-/Parent 1203 0 R
-/Annots [ 1219 0 R 1220 0 R 1221 0 R ]
+/Parent 1562 0 R
+/Annots [ 1587 0 R 1588 0 R 1589 0 R ]
>> endobj
-1219 0 obj <<
+1587 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [406.6264 617.3695 456.8481 629.4292]
+/Rect [406.6264 524.1437 456.8481 536.2033]
/Subtype /Link
/A << /S /GoTo /D (tsig) >>
>> endobj
-1220 0 obj <<
+1588 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [140.5805 606.0819 196.7992 617.474]
+/Rect [140.5805 512.856 196.7992 524.2481]
/Subtype /Link
/A << /S /GoTo /D (controls_statement_definition_and_usage) >>
>> endobj
-1221 0 obj <<
+1589 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [103.6195 562.6731 159.8382 574.7328]
+/Rect [103.6195 470.0794 159.8382 482.1391]
/Subtype /Link
/A << /S /GoTo /D (controls_statement_definition_and_usage) >>
>> endobj
-1216 0 obj <<
-/D [1214 0 R /XYZ 85.0394 794.5015 null]
+1583 0 obj <<
+/D [1581 0 R /XYZ 85.0394 794.5015 null]
>> endobj
-302 0 obj <<
-/D [1214 0 R /XYZ 85.0394 769.5949 null]
+410 0 obj <<
+/D [1581 0 R /XYZ 85.0394 769.5949 null]
>> endobj
-1217 0 obj <<
-/D [1214 0 R /XYZ 85.0394 749.0225 null]
+1584 0 obj <<
+/D [1581 0 R /XYZ 85.0394 749.3189 null]
>> endobj
-306 0 obj <<
-/D [1214 0 R /XYZ 85.0394 668.2594 null]
+414 0 obj <<
+/D [1581 0 R /XYZ 85.0394 679.8163 null]
>> endobj
-1218 0 obj <<
-/D [1214 0 R /XYZ 85.0394 636.8261 null]
+1585 0 obj <<
+/D [1581 0 R /XYZ 85.0394 652.1211 null]
>> endobj
-310 0 obj <<
-/D [1214 0 R /XYZ 85.0394 425.0299 null]
+418 0 obj <<
+/D [1581 0 R /XYZ 85.0394 573.4726 null]
>> endobj
-1222 0 obj <<
-/D [1214 0 R /XYZ 85.0394 396.4061 null]
+1586 0 obj <<
+/D [1581 0 R /XYZ 85.0394 542.9681 null]
>> endobj
-314 0 obj <<
-/D [1214 0 R /XYZ 85.0394 136.3155 null]
+422 0 obj <<
+/D [1581 0 R /XYZ 85.0394 335.1831 null]
>> endobj
-1223 0 obj <<
-/D [1214 0 R /XYZ 85.0394 104.8822 null]
+1590 0 obj <<
+/D [1581 0 R /XYZ 85.0394 307.4879 null]
>> endobj
-1213 0 obj <<
-/Font << /F37 802 0 R /F21 714 0 R /F41 939 0 R /F22 737 0 R /F53 1029 0 R >>
+1580 0 obj <<
+/Font << /F37 1018 0 R /F21 930 0 R /F22 953 0 R /F41 1208 0 R /F53 1303 0 R >>
/ProcSet [ /PDF /Text ]
>> endobj
-1226 0 obj <<
-/Length 3704
-/Filter /FlateDecode
->>
-stream
-xÚ­]sã¶ñݿ“—Ê3'†
-‹ÏÖZŽJࢮ:K:Ž›’{¼ ÞÊ)×YÔ©yÁ¦à}% ›0¼+öUa§t2¡ÝÉ„™ex2%gUO3G‹&¦Ô€&ô¬k-#Rÿ\Ë%ª/:œÕœ1¸’gf[Ý“cüóý˜YÞÁ¸+÷À2Iö©Ž nl¢HV&*ÁMö=‰þvÈ .
-ÈÙ¹9öíž½DKO8r³bª âɤ¿ÕúÄ­ü,eðÂHˆ™“×<$QG-±ˆˆ¨ÝÈ'Y‡‹”íÊe…§Gñ>W£¹H“Èh¢TI”«Lù¨ AK@,ŽÁæïÕÌúóãf_teØॎÒ$Î,²7Î=‚à™ÒC¿;ô4~hËnÊ̶)§\Þ¶l´v+•y¡1ŽÇ‚™á£QÀtkþ^â§öÀç*˜oÛâ‘7w äP‡ä 2ÜN×x<Ñ"²‘å‘ÐM¼þ-Ø¢3鈗Ƹ0[±az{èzš«še}X•.ÜúL¬–/ë‚7Mö›¢'hW<uoh#+áöFg•u¹ìK°õÖ-¯c×sÆ`M¦­5á³ç'˜684—<™ÎYoÓWËC]ìé?.¯‹eUWýÓbvò:¾057ØnlnviL±enbÈ?àϪꖌÅ:¿<á]OQ#Á’l \
-Q8ê‰SÙ¬®¶èåHtŒùLЮÙãÉh9ü«Ýr+.
-“yý·iDÐL„Ô&Äl•jÏl•"GˆªeßÑ$©&®r´ã2k3©õ™ø
-W¶ô\”ËvkÀI¸:(nj\a×±\០µç6d/i±Ó³+>¸Ëb¹áw­Fž%;èßÁ™¬‚úªJr
-Š$šäg2tc¢$VNsüùžë¨¹1&2yÂêSVŸÚ¡…¤Ö•5ýrÈ’/ùÎN¤œç Vân¤“}aÓikPh›8C2ÂÑ¢X>v4?È gÚõÀ ;=
-ä‚zÉ8=ñ“ËT*yc —²ýTr~…#.á`„r¨õi:{k5€Ëàámš¬¶I6BIB0XnÚ–ÌN²=ÉÙcYîÜ>´7/hë FGCðÚS…5ñ“Ü=>µ- ŠPžÏÅ ó(M}:Š‚MR,xÈlö›üáhQ®[_²ÂÿŠá¶Ø‚')l¨’
-tˆûF{ëñ¥5à¬\¢Ôuí²¢¼é;V[G™‘á‚7ª!îœÅ‘ŽOÒ²}H!N¢Ôš³HÃÍ.­¸FÖì"Æ)¢L/JÆbœ§°àòã²,WÝÉ‹U³ª–| X„œÁæ¬LgïZZá"
-»s;:ZH™iM¼"ð¥é¶øXm[çÀȹŠQwuÒ:X”›âCåûÇç .@Žk`ëÐN[–c_ô”·”KÓº÷­Npª¥Pc½èJEž¸E>;:uÉJ§ê"+G6Õº.xï&RbH²é9}•·YEó+׿Nà|!§¢o‰'ò\WÈ$\ô¿ŠÙÕ\þSô yàHÆÛ×Ák¤}ÕôsªXqÝSÙïêhÝôÆίɽäJîlÔ™o}p“62 °äâLŸIŽúLrÚú@
-¾aÖàÍÒLœvó_ õ­­ŽÏVü)$øIž¼È0Aþäj­mÁ8w`qXßÆföǦ=2”ûáö"ÿã«©¸¨”· Çrß„›‚ñi6m[DRGHnêv­šT^Še[TuØ+$žÜ³Hœþ­
-pÕ¡ÙÌDf—S öŸ#æâ#®Ì"P¢ôR<õ.È_}ò@ó?)À\gâ 9Lp iŠ$ ‘8½=–»™,É^ÂâÒ†å>(,Ðœ\êKIAYËû’zŽ¹Gr)¦u¿;ÇçX\Š¤n—Eª¢%¨ ‰åoÂ#þw<zŒG~&zÔg“|¦séÏD áÁ«Yß²:›$FecTé$Í¥QØß.ýÇIŒ½¾D~ºdC•p÷-bâé턯7àOwØíÚ=÷ÄŒ‚«ÄxF.·ÓvC”š}K=þÓ› W:R·OÅ÷ÌŸ›ï°DìUÍä¿+âk
-I;¥Ž©‡]n›$ÊÓL6|öEõ°ÁÝeNÚOTt5êÓœ}m‚Ë6–6ºáµiêšE"Kcre;7jöýà{dî-Qæã†+œÊϺ,:Ú
-W¹*
+1593 0 obj <<
+/Length 3489
+/Filter /FlateDecode
+>>
+stream
+xÚ­Z_“㶠ßO±“'ïÌYÿJê=]’½tÓæ’^6Óé$™ŒlË»êYÒÖ’ooÛéw/@€”ä¥ïÜöÆ"A
+@ø²¸Lá'.Ml!‹Ë¬Ð‰I…¹\7éåŒ}{!xÎÒOZNg}u{ñåk•]Ia¥½¼ÝNxåIšçâòvóËÂ&2¹éâëÞ¼¾ùöç·¯®2½¸½ùáÍÕRštñúæÏ×Ôúöí«ï¿õöj)r#_ÿñÕ·×oiÈ2¯nÞ|C”‚'˜¾½~}ýöúÍ××W¿Ý~wq}t™ê+R…Šüãâ—ßÒË ¨ýÝEš¨"7—ÐIQò²¹ÐF%F+å)»‹Ÿ.þNFÝ«Qû‰4‘Êʈ¥¸")Œ‘3 š"±Jª`A‘‚UÒ4]캻»º½#-Ê¡jªv î7Õ¯i*Ûz¨»–(e»¡ÆÏ}yW¡-`E9Ù²ô†“ãò°Ôí½Ÿ$&“dš¤*30çx ž3S9hYž×Â)•-Ö]‹ÒÝöW"_T=RóEIƒõ¦¢Öûr_WÃuº-Í
+J;âê×SgÛí©1ÜW4·-fÕWû÷Õý'“‹›¡h§ÀÖ*‹½¾/Û¶ÚEÔ[j‘%&ËÕå2l¼ðp¿/{XR*°wßwëôî±/Ýax8 4ÖTÃ}·é_`O£àMÉ#A#|…¶ ¨}Ò×h
+ìí ·ã)õ•
+09¤ …@Ã&tž™‰è¯øìÜáÀV¸ÚÕ½ .v`+ð…Ý­½od”O¸/yUÌfÆãZî{çÁ&ÍH3a¼fÂ.rÔLÉE=ÐÈ£ãsi@fÑwNŽ %Ï$z/¦í3r[*U$µÁ~™%ÃÁø
+›0©j‡òµ«½ìöüJÝÒ“ó¨Šl*Œ†M…ö]Çot³7u8\‘}öQŽƒ&ïYR ð±ÔD bR·ÞE•_¥Ô‘P!¬ •ûýZÆvÔËES#êa’JÎ4ýCµ®Q{Î0Gn´™N¬Á¸ª
+¨}ùÔ ‚¡Ë«Ä{Ä"8Éš
+Žú†šbƒ#ω³
+‡H¿nêˆ$'ÐØÎD¢âœP±ŸN°7÷8h+~©\¯«‡ÁA2_=-0îPMMFNÀ‘ºÂÆ<)„)øDÔí¶‹Åš<ÉEbMjÄ ro­³$SFÌ]ÃÁ?%²Ñß°ã-<ƒ'c§Œ!7a’\ûœ†•Á&v’Ó¤(” !²j+õ¯<Ô ¯
+Ð]’Fâ$F˜ü]¡PÐ^"…<­˜Æ1¤vDtþ ýÙƒ «dê6q(/@¡‹€Îy y˜
+’˜ÈT&ya—~&[a‹Ë7há¶Àtú,[¼vQÈÕïc€©ÀF*í4Ö÷]G§Nòq’‹wUõàסµyB·ÛPc¢’·A*l¨Y˜áöôøè4À(Áý|¾ ¦H²,@QÜXñM—’ùâïùakUm»P®B¿fº+´àIþ«"`§m–†+ úçò@P™÷AÏ<ìK¬@ºÈJŠ†,²ŽŒ­I‰ ösf (Ôœ™Ïð.Ø~~^q¡4æçš 8…ÒâH¡ô´BPNÈ3-7×̤\œ{Îê!‹b§Ÿv¨
+0sÈèi.AëÆò9¤}kÂé e5ð¬=Lò×å’oŸG\d¹Ø-ÆRˆoÍÒĤG †o¹=
+ˆÒ†–/º°µáúØpˆD ;&9^UÌÅúHáÈÕ‡uUmú£ëvS¯Y!˜„–Á{Y™-Þt4Ãg
+
+̉ˆµ·üƹ|Aƒ*ŒEN ( #Ëì§Ñ0Ai‡(ö*›•Ã~èÐx!”J´qŠ¯|½…„°Ð†X
+íISÓkè K¿ q:Ö©J”ÍåÜF‘#%ón·#w‘|×+±vXïëU ¯º÷üWÖÒ•ðh«Gj€¢‚ØJ8ñw‡Ã`aØ©äôs
+vk^)úåDa%“…KåãVYH13ø ŠmG+4ÝtÝM9”\k
+ü“Ål7·5Ú'}Á¯"´ú‚HcÀÀž¢í¶dÚ¼Œ~?Ú×í°¤jç=U}ô#Í›ª s—QqÏùw2Eš<\{ðõl$a@Z)ĉ+&9¹b’ók$0L’Óë#Ép2
+kî²Úc¯0¹¿C8_Pø;v! ¹(Éï3S|µŒ@x"BÉ_– IJ,Ç÷xc$†âÖ•Æ'Ëý н.ô' &
endobj
-1225 0 obj <<
+1592 0 obj <<
/Type /Page
-/Contents 1226 0 R
-/Resources 1224 0 R
+/Contents 1593 0 R
+/Resources 1591 0 R
/MediaBox [0 0 595.2756 841.8898]
-/Parent 1203 0 R
+/Parent 1562 0 R
>> endobj
-1227 0 obj <<
-/D [1225 0 R /XYZ 56.6929 794.5015 null]
+1594 0 obj <<
+/D [1592 0 R /XYZ 56.6929 794.5015 null]
>> endobj
-318 0 obj <<
-/D [1225 0 R /XYZ 56.6929 607.7662 null]
+426 0 obj <<
+/D [1592 0 R /XYZ 56.6929 769.5949 null]
>> endobj
-1228 0 obj <<
-/D [1225 0 R /XYZ 56.6929 584.6557 null]
+1595 0 obj <<
+/D [1592 0 R /XYZ 56.6929 749.2381 null]
>> endobj
-1224 0 obj <<
-/Font << /F37 802 0 R /F22 737 0 R /F21 714 0 R /F41 939 0 R /F39 899 0 R >>
+430 0 obj <<
+/D [1592 0 R /XYZ 56.6929 540.3599 null]
+>> endobj
+1596 0 obj <<
+/D [1592 0 R /XYZ 56.6929 517.4049 null]
+>> endobj
+1591 0 obj <<
+/Font << /F37 1018 0 R /F21 930 0 R /F22 953 0 R /F41 1208 0 R /F39 1151 0 R >>
/ProcSet [ /PDF /Text ]
>> endobj
-1231 0 obj <<
-/Length 2890
-/Filter /FlateDecode
->>
-stream
-xÚ½ZÝoãÆ÷_aäådà´ÙOry÷tIíä‚äÒ:îS4EÉD)R!©SÔ"ÿ{gvv)RZÛ)
-‡÷{çó73+‹kÿĵ5Œ«L_§™f† s]l¯øõæ¾¹~Í2,ZNW}õpõåJ¯3–%2¹~XOβŒ[+®V?/¾þöÃ_nïo–ÒðEÂn–&ዯ>~ú dôùúÇOw¿ùûý‡›T/>þø‰†ïoïnïo?}}{³ÖØ/ý Ïl¸ûøý-µ¾¹ÿðÃîo~yøîêöaäeʯà
-ùíêç_øõ
-ØþîŠ3•Ys}€g"ËäõöJÅŒV*ŒÔW?]ým<p2ë¶Æäg”eÆÊ4"@)c4K”TN€M;G%}û².‹¡\QoÝvÔžü|ñ”7MY¿§Þ¶ìû|SöÔk×ô}ª6OeÎû\vÕp¤^ ½Ú¯>Tu=¿;/Šrw3”+0jaIf¥£ô#®E¶8¶{jäÝ°‹’:û±è«fƒ;o1á;µLÉ Å…ÇôǾnò©x¤e©©_öŽM²ÝÐ(€Ë³µe6Qfv6+Úf¹À¦R.ýÚ]Wµ —
-e‡ç“4_ußbË.VåPvÛªñ<žòZ ÅfØçu}¤þ.ï{8¥¶”B0¥µé –CÒžœ´Úýæ l<±bq‡ªU`ßåïùvW—È17pç?8— ŠfÕ"§E^íÔYçEU;b/oV´ô¤j7ÜG䥸
-0^†,/rÐ,5:êó–J’2 JrN §zÈËv\e„\—×$€rz$—l,ÆâKR­çÎph÷µ
-ÿQüC“fôÂ~X•]³ÙŒ -Ó*zP’7ؾ(jòl¯*Oî€\$#uÙ ±ƒÖê¾a¶/»Ïó@oüÎ~
-‡Í›Ó=ôdÃP³ÙwùrÔø4d~ž5¸Wœ˜Š¼ñƒûݱËßAz=ØMMé€.\· v
-“…)RÑ\_­%@+Ò¬\u¤1ðŠÎc$ôâi•’I¥’×±P:8¿—÷éîÖñ|=K 9Ä0R±eìla˜< ?ªÊ=É붮ÛBÙ”­œ>»Â38ì¡÷‚´7'dV† &ÃΉ^Jb)!QÚª¹„»fUx
-Ï2.œ;­‚¾q8F‡Ö«¯’§ZO
-·{¡ÝdžØúø¹ÇŠK1d€RJœêÿfX:-Gä`™MÁÖhé“KÌ´
-êÙ$à¼ÇW ÿÀ¹Ïð2°/ÿž‚] ì‘«`·¯š"š¦¤‚q‘þ9:DHTè}Ï…ÕþŸ5f^aH) ç@ʤL7+¡–*;WMçlÚî¡&I™Hm£>ƒ[j0-ùYD!ðøm“«—1¯÷fÐBT§f1Þæzî05§iï=´É[ ?úi²:j;SO±j¯b¤›wP«¡fBÈÁ
-&&¥%³b|O 9œ=wÌä
-zk ép_ˆÓÊQØñ1Z~$xßRgÉ3õ®TS2Ñ3Ÿ)xù˜ýµ;¬qzOD~œ_ Ⱥ¢– &"!%ÚöÑWÊo=n&„)Hºç.êlr[¯\H5óú{uŠ†1Gné—ºTJ+YÊ«)ñ¢4Ù=vïè]Ý
-ÓeôNÿì^¡áù¥/AJ0lajçFÜ&´œÓ6º²³Z3œ3þ0≙-•‘¢Ÿ .¨¡ß&ætùŸ‹&ÛbÔÈ5yØìëL_ó`hPg ü1P$Bý¼Ô'uTTèâ¼>sNÊ
-/?/ü¿=9ög
+1599 0 obj <<
+/Length 3318
+/Filter /FlateDecode
+>>
+stream
+xÚ¥ZYoãF~÷¯ò220êôÁ£9ó4™µ“ 6“]Çû”-Q‰THÊŠv±ÿ}«ºªyÈm{‚…a°/v×ùUUSj&áOÍl,¤É¢YšE"–*ž-÷Wr¶¹o¯¯YøE‹ñªo¾5é,Y¢“Ùýz´—ÒZ5»_ý<ÿø݇ÜßÜ]/t,牸^ĉœóéóßh$£ÇÇ?ß~úö_w®Óh~ÿéÇÏ4|ws{swóùãÍõBÙXÁûšwxæ…ÛO¿¡Ö·w~øáÃÝõ¯÷ß_ÝÜ÷¼ŒùUÒ #\ýü«œ­€íﯤ0™g'èH¡²LÏöWQlDãGvW?]ý³ßp4ë^ É/6VÄV§j`œ‰ÄhãXÕp”©y¾ÛQc/Ë]Ù•EË͵²ó‚:íñp¨›®XQ·®&/Ëy}(š¼+« /?·]±oAªÀÃü»ú„²Ôˆ,Æ"†0ƒÁ+»zÃëÆä%+ý²SééÝæÕjÇä틶Í7žò¶¨˜¹®æç¶lqëÙÂÈTè4«SJdq¬Ý®Ìû•læ%îGóUÑ.›òÁ1Ã=»m`G©X¨46vIJ®Öž@»©V)¯Ýç¼óx
+eÓô¯É =UšùöÀÞ‘¬ž9 ŽðGù¹+ò–›õšÖ Õ»Þ0xåc±£æ¦|,˜„$ª4
+³ÒÔàÁbØžÛbW, Á¡·®›ÁÕÈöALU±{O½¢¢¯é¹á߯'zŽH^Í=:;_¢õx—‘SWA¨‹TFV^pØ9^ ‡Õ–n
+Ò‘'ö±ÌƒKÄÚD_fL„ˆÞZÉxf–ŒÔ#ßÄ ôM½ˆ&S|SrD¿iY­ëŸ(aMoòaÕ@
+$mR_
+8”\Rá°y3œC@6 5›c“/zõó¬)pÇL ”Yr êÒp,þéµå#¯Ó]¸fïí
+Sÿ&t«&b_­À’‰ÌG)MœJH•œÃBÇe^0CÉóèXè ùÂlÂd 0—AÎÚ¢#h-Jʯ‚£Î4^Ñ0FBï¹*YC g’×±Pº/“HÞ=¤»Sûý£IJ(!†Å> Y„öÆ:]Kþ`¨&g’×õnWŸÊÆlåô8Ô~œÁa½¤½ÙÄÙ0éß¹a ÂÖÀ˜h¨pÈ7šjµd
+ˆü"Š¤{'BEc„LåEiÇ3¢å Y=ˆ&Òñü¹D6u;iÖXûÖŽp5ów/ÖÂÙÁg¸:sNjYR0ß×Iµ|à†ÀË¢9¡\ˆy˜° õB^î|­ÝáØ¡æ•œ¤àå/Pú«—öP,Ë5Wgùh ¡yIýÞ@FÕœRjþö¢Fdôp¸ ïCi"= åò7wÎolƒ8óÇ«6‡]jw]b˜ÁE_­ëú«÷¡
+au–z¢³(½¤¼ÿµÕSÒÿ:[)Žendstream
endobj
-1230 0 obj <<
+1598 0 obj <<
/Type /Page
-/Contents 1231 0 R
-/Resources 1229 0 R
+/Contents 1599 0 R
+/Resources 1597 0 R
/MediaBox [0 0 595.2756 841.8898]
-/Parent 1203 0 R
-/Annots [ 1233 0 R ]
+/Parent 1562 0 R
+/Annots [ 1601 0 R ]
>> endobj
-1233 0 obj <<
+1601 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [173.6261 333.9221 242.2981 343.3317]
+/Rect [173.6261 273.4719 242.2981 282.8815]
/Subtype /Link
/A << /S /GoTo /D (the_category_phrase) >>
>> endobj
-1232 0 obj <<
-/D [1230 0 R /XYZ 85.0394 794.5015 null]
+1600 0 obj <<
+/D [1598 0 R /XYZ 85.0394 794.5015 null]
>> endobj
-1229 0 obj <<
-/Font << /F37 802 0 R /F22 737 0 R /F21 714 0 R /F41 939 0 R >>
+1597 0 obj <<
+/Font << /F37 1018 0 R /F22 953 0 R /F21 930 0 R /F41 1208 0 R >>
/ProcSet [ /PDF /Text ]
>> endobj
-1237 0 obj <<
-/Length 2569
+1605 0 obj <<
+/Length 2400
/Filter /FlateDecode
>>
stream
-xÚµ]sÛ6òÝ¿BÓ—H3B€ žŸÜÄιsIz®ûpÓv24IœP¤Ê»êÍý÷ÛÅüiÙ½äÆ‹Åb¿4ŸyðÇg2da,âYLz\ÎÒÝ™7ÛÀÚû3nq–i9ÄúþöìÍ•Íb‡"œÝ®´ó”â³ÛÕ/ó ¶
-Þüí§W×ï¾¹XDÁüöúÓÇÅRHo~uýK½¿¹øðáâf±äJòùÛ¿_üx{yCK¡¥ñýõÇw‰éç ¢7—W—7—ß^.~»ýáìò¶»Ëð¾Üóñ"¿Ÿýò›7[Áµ8ó˜+9{€‰Çx‹Ùî,>“ï;H~öÓÙ?;‚ƒU³uR~ÜcÂÅ„
-s’+j²ÒoT¿m­W†7i8šàçP¾L摈Ãvœ–Z‰4zeYBÓ%ÁF‚ .Ž‚G²n@M¡A0Å•25åv«¥r"4ž&ddüoc8ÊÚaäLCÍ ý@Ÿ¯ß½¦ÉÖ j¤óÕy‚7ºÐ•½D‡Ëò©ÀÒfŠ£¿Ä~f¹¯›¤j¬¡ªy»·â‹¤ø‘ø ã`äu“aÎÀaµ€]EA`n¤Yc-K¼IäÓi
-RšP± ËÍK
-(vžƒ‹ŒÁ³ÞÝG
-Y@°#ˆ®H´Õ‰À碋ÏD ¹ .Ê°ñ©H­ã–8ìóÂȵ$¨)Ö›)9 <ÜÒŽï4°œ» Ö ! ·–ie´9œ'y£|^Ñ̆/ Ùfy³47k5!õ²É)ˆ¾žÒÛ]kEGÇš`e½+WÙúp»]%@Ù¨Ülº¨}gQ÷eV44‡Ü”Uæ2Ob·x¾M:=öaÏh‹óAÝ‹eT\ÔE·[=:Ü2öã¶JjýD=°8ેœóø1ÄŸ~¢æ;„Ü_ tør^—´`FoE Jý
-E@‰4vAG Ç©1•²xÕ é“Œ)ÒÀªE‹z4[&ã@ YÂYm‰”둯Xƒ\Sžîð;íq‚ã„lÚN×u²Ñ–笘ºŸ-Ë„¨Ü1ˆ/ÂÑûBÅ6BŒ”ÒL–¿<PHÿq|œ'$‹]Ì®€ÕºÑ :¸Gi"”4çZi"¬“&‚uŽ†°G¢
-”ã¡8äc`uäØë2ÏˇÎ1œŽ|×Nú0ëêI,Jþ6Á½q`ìHGš£!ìs}¨A™çc Éáö’&åÝE@FŸá\ÿ‘ìö¹6²€2K7¯jZ¨“aZA‡Î±
-™=J;•®Ëü¾{²Z¼ï>þ´XJ(HÉaW‹b~ß}£yݦ[\¦×iD3qöE±áßkZËËòK»¯i}Oya2Ý`yëjO§RltóõØCÒ<£6|ø¨˜ôq©Sû£ gºå§t>æ×)(ð€’€šËN¡ääghoöl{éGïþ?‚ˆùJ rÕ¨U‹®ŠÜ}’w_Ç-Ö€õÿî@+(endstream
-endobj
-1236 0 obj <<
+xÚ­]sÛ6òÝ¿BÓ—H3B€ ^žÒÔιÓ$=ŸûpÓv2´IœR¤JRqÕ›ûï·‹]ðC¦ß%ã‹Åb¿?`9 àOÎt,âT¥³$„¤ž­öÁl {o/$ã,=ÒrˆõÝíÅË«0™¥"U<»Ý h#g·ë_æ±Pb‚ù›ﯮßþ|óz‘DóÛëïK¥ƒùÕõ—´z{óúÝ»×7‹¥4ZÎßüýõO·—7´3ï®ßO”~!zsyuysùþÍåâ·Û..o;Y†òÊ DAþ¸øå·`¶±¸D˜=»‡@È4U³ýE¤C¡£0ôââŸÿèvÝÑIýÉ@¨0V
+Ί@&q
+NØ5©q»°)$x ë±Ìöv-êc9¡qÈAʘ”1ó’/Ýñc¹‰¹ªþÝ~¬s'Ž]µU}ZH)ç‚´±ˆ’$öžž8úWÐRitWG
+kü"YS•Í· <Ê&À=b¿*MÈ*£P˜TJ–`yœÒ[ˆP!GrUí÷.áG‘—î& ^Ôæ_ïL¿ÇÆ®oÚq4Á‡Ë“±~žÎ•úhí,:¸mÅiíšYB×%Å&J(©¢±ße›–òçy^PÂH£†LM…” m¼
+]¤)¸øÛ:´a?L¼k˜yiï òóõ÷ßÒŠt {- ÒŃé" Á[[Úš¥Ópy1•Õ@Û"2iò?±Ÿ3÷M›Õ-;ª™¬¾HªHž©Ï1NÞ´9–\Ö 8U–D¾VvÖªBI’nè:oV™ÛZƒÝÁQŒš_ohïTiQZË÷8mÂï*;´G26Ñ£:‚[¤/Ô¬ zûcÓùcrÎ(È?Ç+®ïóv7®BTܺà~$¢”„”ú”°Ü>7 €b9:ðÎpt÷™‚3K ¬1‚@gáT[?‘ø|v …Š´ìË(²ñ¡\q
+ù§ÿ0ó½KBî›G¡ž7m8Y×)!Ô³"ˆJ?€@s òU†í®ÚŠ¶ËØ÷ž#†N1šßÓ ¯%‹€_ÐÕÊsê\¥*_´CzÎ%SÊ4°ËhIÆm’sÔÎ&RmF±Â¹¡:ÝáwÖ!ç„Àq
+* Ø$´½mšlk™ç¼œ’Û2e&U
+*ÁÄ‹pŒ>„P“§e€´“½¯Œ4t
+ª÷ .k}ü “sgó'í—<œ_÷§^G4ΞÅÄñÛ+‡ôÍð8‚¿yõ5§î!±×õæû ¯ò½šª†ç.;ÁÁ™O ðôÜ=4­³ªŸzºfKeÁ“Þ bœ–£æ<5LzÇD/µHÂ~šÃŒ‡ìB׎çæ)Ïù ±'2ÄŸ[/±< S½] ’À¹AÆ4 rb=Eáé4r5ÈŠAÔ×vü 0Bè§,/²».†ŒºÄpm(,î
+;Ízm×c?Ú¾@´€Ú6âÁÃOB¤3Ç"ÔÐÚ?ãéê–H‚äì¥ñÿ;åÁ^ju¬õãй
+endobj
+1604 0 obj <<
/Type /Page
-/Contents 1237 0 R
-/Resources 1235 0 R
+/Contents 1605 0 R
+/Resources 1603 0 R
/MediaBox [0 0 595.2756 841.8898]
-/Parent 1203 0 R
+/Parent 1609 0 R
>> endobj
-1238 0 obj <<
-/D [1236 0 R /XYZ 56.6929 794.5015 null]
+1606 0 obj <<
+/D [1604 0 R /XYZ 56.6929 794.5015 null]
>> endobj
-322 0 obj <<
-/D [1236 0 R /XYZ 56.6929 556.3324 null]
+434 0 obj <<
+/D [1604 0 R /XYZ 56.6929 520.4669 null]
>> endobj
-1234 0 obj <<
-/D [1236 0 R /XYZ 56.6929 531.5504 null]
+1602 0 obj <<
+/D [1604 0 R /XYZ 56.6929 495.6849 null]
>> endobj
-1239 0 obj <<
-/D [1236 0 R /XYZ 56.6929 214.5791 null]
+1607 0 obj <<
+/D [1604 0 R /XYZ 56.6929 178.7136 null]
>> endobj
-1240 0 obj <<
-/D [1236 0 R /XYZ 56.6929 202.6239 null]
+1608 0 obj <<
+/D [1604 0 R /XYZ 56.6929 166.7584 null]
>> endobj
-1235 0 obj <<
-/Font << /F37 802 0 R /F41 939 0 R /F22 737 0 R /F21 714 0 R >>
+1603 0 obj <<
+/Font << /F37 1018 0 R /F41 1208 0 R /F22 953 0 R /F21 930 0 R >>
/ProcSet [ /PDF /Text ]
>> endobj
-1243 0 obj <<
-/Length 2985
+1612 0 obj <<
+/Length 2418
/Filter /FlateDecode
>>
stream
-xÚÍZÝsÛ¸÷_¡™>=W±ø"@æͱåÔ7;µÝ™¶w÷@‹°Í EêDÊ>ß_ßv!Q
-e6M2“x&Xâc,»¿]ˆOüñIšÄLfjb2'Œ'“ùâˆM íݧ>ÓÐiÚïõööèoçÒL²8ÓBOnï{¼Ò˜¥)ŸÜ¿D§?ùp;»>žŠ„E:>ž&šEo/.Ï°&ÃâôêòüâÝ?¯OŽŠn/®.±úzv>»ž]žÎŽ§<M8ŒÄáÀ€ó‹ŸgH½»>yÿþäúø·ÛŸŽf·›½ô÷Ë™tùýè—ßؤ€mÿtÄb™¥Éä>X̳LLG*‘q¢¤ 5ÕÑÍÑ?6 {­~èüã1‰œLe«$IO‹S0˜–HÎã,Iögri€“qg’蘹9Á{g•ŒS)“‰I²XK!ý¡üqoWÇ<¦eícDo ˆÆ$ÊÀD®ïšÚ¢H»U^·0²¥ÏGªoíê øyº¤FÏÞÎmùTÖñþ)(8£µ˜ôÿe‘*%hˆ†:|M+³Œ%c2V&ÖÆð]7ëî ¹µuñºx{ëþžÅ+EÌe"ÇÄ+a[‚g^buÓ•÷/£‚½ ò»¼º½8ÿ7ÒK0M×Ì›êááªÔ÷.<=S&Æ„'¤ÛVê¥2¯J[kå”Óܶ-¨Ê®¹Ç’Xô.ûïkÛví+òì-ôkÉŒš1ŸeOȃòԚŊ)5&OX[ʹö‚Z׋¼›?ÚbT¤ïA–ùƒ… œp·;§ÐŸD;S kÁ!u¾d,ÁtfJP¯çœx®ëü®²Ä¿Á²°]-Ê:TÃ¥
-{Ÿ¯+bYúÀšw–Ôs7táý„ä>•P^PJÔw]UCâá± ÂyÌëÚ¾b‰ûWòË®ù7µÄ˜+•YbÀ  ZâÚvÏÍêã¨Ý¸¤~hƒ—v•weS¿bmû‹ùŽ½—+¦²1c«ƒˆ‚‘±]p3F%vö†³œ£ÄpÌkâÚ®ã{–X»D¦é˜¸œí`|¶âš¶v¾^•Ý8b:Y<zÊ+^^H¶.CeÀtŸú›øj²Ö&–
-Ö`2“mÍëb‰f5îå.j9Z}ò;— óäÖËÁ‡„=EfB4ÜßQkÛ,,ÖÜçeµÆŽ‡aFs_ fg¯f?aF>1>v
- !
-Þ¹WT´wö_KE!žŸåýiÄAåBÄàÜFUTdâjŠ—ÁgL Âéã†ÍGŸL÷ôé , úu¤@íèŸëÝ`_»¸Še•—Ô×Å=ž(ÖvÐîxŸE]¹°€ýœ]……474` ¾ê¾óóC•cåë6ƒQ©w¬ªïÐ3e™í”öÎR¢ÎóS$
-"ÇE :‹•~SP9Cщ¾i€jtïn0…ÍPgÿ
-e‡Ó=X„ó.©Ða¹=:}„j‡íihƒ%²eã£Ó楹Ÿ>#Æ;ˆ´hꨒ¶ 2Lç\‚¢½q©3²«RR:Ç |ÊÃy^#™GÝQ“×f)A‹A”H"ä Û6’î[KÑ){&{©TÁLõ„˜¡Ûðµ5Ø_Tu¨%U‡ê êóá‹Šò1½”£Î¨›
-™òm4uOyU@Â7=¬»ná9…2£Ä„ÜP÷à m£Ùý ‘~ìõp4¾õq¯ã}Ìòe8h ­¶?žû5žc˜Ùû5Þÿ7*,„ë _¦‰†nøŒ~Å÷ɯù„à±É
+xÚÍZKsã6¾ûW¨j+W"çæØò¬S3ö¬­­ÚÝ$Z„%ÖP¤"Rö8¿> 4(R2%Æe¹jì@
+CÜ÷+SÙ£YõB|q}[šŠ¡ÃÌJ­-Ô?Ú}Ëõtn«ƒa\b³jn°
+FÑu¾ˆ«éBU¤ŸËxflìcŒ;®µÐDYsA³º:@J¢€ûVO±ïsÇ÷–ö¸þ LS™Õ"Íëb0
+mGŒ‚nø«­¨;Íâ:^Û.Ç#‚Èd,xš§6â ôP¸|Mìeóe4vÿ¼\(§À¡Ê¯á15O å6
+«È7f­h4<ÃpЖ֡lL˶Agòa–Ö¹r½XÄ«güpþÒ8+ ß°˜ÍÓ5—"L»; „0ª7¸ï5%® “µ§qef ÏCÂSº Í·ÁŸÌÝä„ldàK ëÒ{02,)Ñþ ÌMÒ+6ÄŠ¬¾\ã*1+Gw~´Y4HÌC¼Î|—iÕÅÂZÑƼЧ—Ià—B°zû®³¬ FD Î<ÎssÈ·Lòmfþ¾ž˜q"µèõÄLRôĹ©žŠÕ×^¿qíÛ¡Îì:‡¼mk2ßs觔(®ûˆ•¢áÌ[÷z™€iôŸXžÁs¦S„ eáÕšÈwŒ—ÔoBôà%#N¸Œ¢^£ÒÂÒªŸ3-=AzŒ³sbò´.¬™€WÇ+˜@{GÃ:b„kþªý^‹ìE[D!ˆC|êA[Ã(4À“,~•B€ïCùni¦–Á:Üžšj?ë>Ðí΋u–Ô‡_L7áÊ9cÒåµÏÀWB€çWÕz n?ÐÐŽê蜭uÇ ›ÙD›Žˆ§Àø«Ýõþ
+MhÈ6Œ$ÇïúvaÖÇ<N„àr{ªÆSF¶÷S6Ä@¹u"õ„už{êš  ¸nMð$;f ƒ:2KY}ÏcG .“{rRi¡·©…ÐFX“tÂŽèÈͳv..´.Cu/‹Uå®jAdÿôÅW_p‚q’ø›_am²c|Û£ æïâÞ4!_z+Ü%ØfŽ¶5°LßÎó?[Úˆ</ 0/Ø劾íÐDÈð¾•ÙØÜŽ#º7¶ÍÜâU€ý¼0eŠ’ 
+iŽ› Ç|«º±ê(sÃ;‘t–;³ƒB;æݦ5Û²Ž¹¡0Ò™cº. flãº*p
+P>9ÿ‚™(ˆ$Ìd#Ã727M=Län|Ž}Þ|µ»Ô…˜“¶˜BF£¬ïÛV8®åv û}~Ñ´;Ÿ›éWg™¶æ"-­'n,×f·÷¥lƒnoõP¹Ë ·;‘ë²zŸÚóKY¥y}· 5ÛÖÐliÞliæჲš);j€à6;×÷O—AÛÏì X: ­ ¢ðÏþ¡¸êÃéˆqŠŽüùCç¶xz"æ[¼Xf†L‹öruéüaq—t{èpÐðРìÅ ¹©ö :ÂA;cw;$¾1ξ+0á@È>b)tD(ç¬ #8'«þø}•ÛÛézO±.¾·}.ÛÄoÆðïr~ËÂqË™3”8Ÿ
+"Òû|'¤ L*¼
+í¼{lñ ¢]@¤ÐDZRY7kMþ/ÌŠpendstream
endobj
-1242 0 obj <<
+1611 0 obj <<
/Type /Page
-/Contents 1243 0 R
-/Resources 1241 0 R
+/Contents 1612 0 R
+/Resources 1610 0 R
/MediaBox [0 0 595.2756 841.8898]
-/Parent 1245 0 R
+/Parent 1609 0 R
>> endobj
-1244 0 obj <<
-/D [1242 0 R /XYZ 85.0394 794.5015 null]
+1613 0 obj <<
+/D [1611 0 R /XYZ 85.0394 794.5015 null]
>> endobj
-1241 0 obj <<
-/Font << /F37 802 0 R /F21 714 0 R /F22 737 0 R /F41 939 0 R >>
+1610 0 obj <<
+/Font << /F37 1018 0 R /F21 930 0 R /F22 953 0 R /F41 1208 0 R >>
/ProcSet [ /PDF /Text ]
>> endobj
-1248 0 obj <<
-/Length 3540
+1616 0 obj <<
+/Length 2956
/Filter /FlateDecode
>>
stream
-xÚÍ[msÛ6þî_¡™ûpòŒ…
-F0c ¦,’ìÚKXÎùôæAÓ?®uý8Óu]Õ]‹¬Õ÷UýˆsÉ'™Ofb©ÊÈD!TÉï^¤, T •±Î@þ®D"mݹëy&E4ÍúmVzžÿÆy0ϊ••­.zA_wU‰pºÐ·ëûû¼¼§üÕº^UnÎOgJÓ›Ó4˜VVÀB—m~gÅml"+­È‡jƒ£Å¥f*HãÉL–†a`Ú –L…f’¹ÆõSÑ´>ÉT7뢥¼䯪²¡ª!ô›Ï¨4/9Ο
-2ÛFŸŠimš€_ÉÓé+Ý4Ù½“RÝQåö!·9ýBb~F=SQû éÍeGÓª,ŒÂQÅ4S²»¢º¿ÇeF`lòöaDßaÈB!«C£‚EKÁ‚’T«ÐŸtÑ0Zâ$bq"è8f© S㢥N[Tl’ÔšÒfòð+ìgM¿ù=N–ìŒ2tfVR¾¼‰ {3•æÕB{y L†Ó__¢ä‹«Ÿ(7·cñ+³ywUQT€ Y%†ÖD3Ž ýE˜<E`ž"ˆ‡ÿâ/‘y
-\èVÏ[có(¾¥â"/5嘱šj ›jMz´5Ðb °(=¢ ™( Ëd@[l>2w%X¢¤°õÀ ãPNªî Ë*ˆ˜JD<´¢eo¯˜¬½:@;,6µÊê6Ÿ¯‹¬FÖ3 ÖÅÊ"®£¯jçÙº9
-±wÎN Ñàïº}¨ê¼ÍÚü“•Ðèú“¶¬ã ²m ‘´Gª3PÈë ²Í@ / Ó1d 4ŠQ½ÒXm^Ãÿa»ÈKï†V•C™¦ùºnhÔ]VSk¬nÇÐ>dí àG=)DßïcèHÆÂÛJ!—VÝÛ
--ªêƒMåôçÓ­ûn‘ÉÐJÁ˜Á¦[GÎxkœ>¨ìv.~€ .(%Ðç"‘ŽsÚ| ŒpEµnŸ5ëù&KMß-ªe–—çžô³ZßdÅy
-Ét ‚ý©‘™ÉÁáCXãÈŽ˜9ìmˆC¾ªš&ï6h+šul—·gŽ}W~~UŽwo²èØÇWÛCÿPÏÅèÈø9^t¿ÃàcuÊ’´?àûœÅÜk7> ¿²Ý|MÆS¡8‘âi»‘
-f,¢ã”(ŽT¢·:ß²ã€%AœPb1ÐPHŽ’õÓG(ÅúÝB>©D+Åy=y9×_´£ºó¥Ìm^¾å?¥oâßòæq–ÄàÆŒê'T0‘XO˜ÒÍžYX óåGé¦ØbÂææEó‡ÍME,áB~ñt±ËÒÎÇŽÃÑý­Þž—Î{?üöqxÜ›—&ˆÜw!Ò»ÝvP‘Ž!üµ¬ªëÕЗÇ+Öô¯®ýbaÛº9dàÓgî·Å‹ßãÖùoÚwÛö(kàÚÍMÀô”5x0û–ÙJ%,q´‡­RÆU“ rEašŽÀ+
-X5±–ÀXͶº?ǃÓå¼Z—­ÕßV„7pt{ÜÓö$!JO¾Øž^;o Üù¥ó¤æóqóßv>‡•·Ž¶Bˆã8¾ÚåÕóW??!|+l·÷ OaÞÓ·Œy¡
-ÕZq<Û5ªµ×£Íã">*<Y—ú•G¦ÛWô–›¼ 0rŒïAâ\»=ÛS A\ugHÛ.ûÀ zÏîöñ ¢ž¶+˜¦"üºÎŸ§³oÙ¹Àà±<@§AÂÂT¶èÂid}D,X+·Ž/³¼X[] iΣõD÷™x[ãîýð¨k!ðÉŒŸO…{Û`çe”:@’»÷Öù¡awαš:¯ F•›{w`ý}êõq±uöX=|Ë<($P] ž<ó“"¢—
-æ6ØÞ‰Ž
-lªÆV ·H¡kùcTä„EþëMÌw/ #÷ gÜÓ‘«Ð.\07ì!9¯&µý^m]FÓkCø¶jK©RßÛGaøµå!cV³ÆƒfL™—z(æ/^¿º¸º¶¹Ý%:J«Z_Ð=ÒK^O‚7ò‘y¹ÃÑ»ìÏÕ°úk8ø¯iXuVã†ì_Jz{F•mÂÞ¯Iór¸±)óˆRuŤÄQêÍß´îô«úáKåže«„Ô„ØØŽ]o¢{µ1p÷„oýÅÜÅÕîtl‘ßaót»;Ær»ˆ÷Â8¿k1¼|ǘuï¡;­˜÷gR±$QýŸ.aßÝ›Úm™oÛ¬ÕË.Êû¡ÎðVü˜W÷»î·录1F _éCĪÂ.–¡q„¬1ëÅ6Ãû‹´»óÅàpÅN<ºú 6¯Ê»ñS*
-ѪÑY힇ÚÙ‘Ïñ;E[»ÙW|ä˜Ë[.ªÖꂼ}¿ÍØÛ p{ð^FþÚ…Oz×Çþm÷¦ÑœãþBçVØAá¼d²3r÷G8»Cÿ7?â[4endstream
+xÚÅYKsÛ8¾ûW¨jKWY Aðé=9;ë©ÄÙu¼sÉä@‘Å
+E*"Åóë§_àC¦wf6‡M*a£4€F?¾†Ôƒ¿jFn”úé"N7ôT¸È·gÞâúÞž)³´ƒ–ãQ¯Î^Ýèx‘ºiäG‹‡õHVâzI¢Å''r}÷$xΛw7·oÿsuÎÃ퇻ó¥zÎÍí»k¦ÞÞ_½u¾TI¨œ7ÿ¼ú×Ãõ=wE"ãõíÝOÌIùó‚Ðûë›ëûë»7×çŸ~>»~èÏ2>¯ò4äëÙ§ÏÞ¢€cÿ|æ¹:MÂÅž«ÒÔ_lÏ‚P»a µåTgÏþÝ õÒÔ9ýžr•êÅÒ¬Z{q]^Ãu…ôU„>Yv©¼ÔUðÜN軉'ý¥øjt)
+¦I¼ˆÃÔ´¯éRLQ·Ë¢l³Ue
+TLòG“@9qÄ°Ž~×<‚V½Èùz0ûÒ´Üè6Y‡Tèl²o†y+cj¦ÖÍþ\%NâytÃc­ ÝUY)cºûÈDq0¸Xv©”›ÂÁh}š¦NWnMsèZ°­CçaS¶ÜÁßÄiÖ­,E¼~òÆ0Aû2Û¦“­Ù3{‘T7ÝÜV¦¬QqèÜß¼a¬'@*ròf»«Ê¬î¸ãW/ôP5²ê˜=µLóÊÝa_‹´È¹ùp¿œ.È^óþú-ß×è¾Ó–Û²Êö̤CóšUœáj€Õ…L†SË|ótÓ–Mݾ¤b+Ö$XÇžsÜ J¥ï‰©ŒO :*Ž<Ôè±kš4 à’¢X;·2™w2³ò‘ ¥h/P#>¬B·ÅŽýv¼Ü£éȘ€C†ßáê¢ÄÚ#°×YYÉÔ†¿¼ßv×b"²Š­³6!| Ú„†&
+5€TÑÔ¦tîÎï íò|$‘(W'N……ÄÖ´mö(Ü<«™Èª¶aj%]dÍZƒŸƒ*™ÜeùÓYm;»úk#ŽˆÆžjQÄ®Ùwl‚i0R"ô¯ÉÜ€[7õ’M¸bêÀ¶¦ž›9ý‰~ÀÚMs¨H×)y¼ö²3-_$°è~à[ÀÝî·emxû*ðë ¼ÅnÚÍZæmfnzØ!† ¥ú0³`e>6¤—~‡Ð±ã5¾™Zî”´
+!#¬ìÞÀßöJM‹™4ð‡óÔ§<ˆ
+ˆ”à·Ü:n„ „Ħ9r$‹S7ðÓÓ@Öo =0eþ ²°áPuÜI€uàœhyhØû\€'*J<?wd2Ç€×ïi"jÌN^ê¼g R(y‘AÀ‰üxa!*lŽR<ŒijΧ! @Ç£‘„w,»ÍÌ}‡¡*åËÒÌååP‹dT™ª’t¶L"7N48£ŠÝTû ¸Г€'L$ÏžfN5ÎÁž³)ñ  ² f˜Œ4ݾ‡ÑÁ¦«qÒfºÊG(-ÃÐùå%_ݾc®…
+ceeÂ[7UÕÁI%šzŸ˜=4¯J‚¸§Âx
+z^ï À¦
+J”Kï¢Æ2oÄÜ=­²„ì.ÕEV¬xØR)FG ã2õù0ƒzMz,CÏI$ 2ÇFL>h©F Ó“²‡äMÕÈ“T‡Ç“w®Øɘqjª=ËšêðFÓ(BgŽ40É`Ü&¢šñΩid)
+†ãõ*¨^úëev «Ô¸6
+á :)rP3uV1wŒr°“ŒTeìÄÆv‰€çN…Ã(Àcw_ÏËü^ …x¤ÈœgLÊ»qÀÇ6ü¹h&n¤6Ø3Pã8LúxÏõ­‚£Ó<ˆëj-ÞÌ埬A‡µmã¦Fy Ù½’±1’Ú>Ñ “!Òfø>Á½ÓÑšµü¾ÞPõ” ìž”ÔÍ?¶Qr‡Â×¾Jj­œÞó±C^û4•©Ô=..i*ÈÞî:nXyÛ¬Àç°Q~ðÓJR"vŠACrÐ}ªÄpÈ4–“dc íl¶6A /”—œf•­¨¾
endobj
-1247 0 obj <<
+1615 0 obj <<
/Type /Page
-/Contents 1248 0 R
-/Resources 1246 0 R
+/Contents 1616 0 R
+/Resources 1614 0 R
/MediaBox [0 0 595.2756 841.8898]
-/Parent 1245 0 R
+/Parent 1609 0 R
>> endobj
-1249 0 obj <<
-/D [1247 0 R /XYZ 56.6929 794.5015 null]
+1617 0 obj <<
+/D [1615 0 R /XYZ 56.6929 794.5015 null]
>> endobj
-326 0 obj <<
-/D [1247 0 R /XYZ 56.6929 769.5949 null]
+438 0 obj <<
+/D [1615 0 R /XYZ 56.6929 510.1455 null]
>> endobj
-1250 0 obj <<
-/D [1247 0 R /XYZ 56.6929 749.9737 null]
+1618 0 obj <<
+/D [1615 0 R /XYZ 56.6929 482.5541 null]
>> endobj
-1251 0 obj <<
-/D [1247 0 R /XYZ 56.6929 433.0023 null]
+1619 0 obj <<
+/D [1615 0 R /XYZ 56.6929 117.762 null]
>> endobj
-1252 0 obj <<
-/D [1247 0 R /XYZ 56.6929 421.0471 null]
+1620 0 obj <<
+/D [1615 0 R /XYZ 56.6929 105.8069 null]
>> endobj
-330 0 obj <<
-/D [1247 0 R /XYZ 56.6929 173.1316 null]
+1614 0 obj <<
+/Font << /F37 1018 0 R /F21 930 0 R /F22 953 0 R /F41 1208 0 R >>
+/ProcSet [ /PDF /Text ]
>> endobj
-1253 0 obj <<
-/D [1247 0 R /XYZ 56.6929 148.792 null]
+1623 0 obj <<
+/Length 2444
+/Filter /FlateDecode
+>>
+stream
+xÚÍ]oÛ8ò=¿Âo§
+òÇÁåG>ÉáØ?p¦ÒÄL¾À€3‘¦r²<ÐF1£•
+ÅÁ‡ƒ¿w{³néØýi.˜FÁM bköoK[pØÖwMÊâØ$;»N…Š™61Ê„'LÊ­H´è‰DhÅ¥Ì$:VIåd².š6[·x7?HÙÇ[‰ŽaÄ»¸)§°KTm–WÅšúõ5µ³¯³EÑP¿½ÉÚÐóKÖ‡"‰Š¦^܆…íº,òþä²n äv›
+ÁRc¤Û¶)Ö°HÁ#$lxê;~ç³ ‹mj=¿y½ÌÊjäXš³TÃÚ¿ëª
+S?«0-gškõ0cnÄÒÁÛrYÔ›Ç
+bW'Lè;aˆ4mÊjæ‘Û°jG°dV”·èM•›Q7ºÈš–baßÜ#¬Þ-<—°‚i>c¼³œ3+“‡ž5"=¢«XŒvÂn£0í
+©»‡
+4i½~œQ)-;£Â¾“/´H
+gveÄìÁ´Ôö›UùˆDµ/¼§)ÄVÇtÌŒÏ'VìÕ1øÏ„µå>üŠ‰¥€•_=ÆQŸdåbãeEojœ«4)*—ÞS"¸ïwpü¢ö"p ‚ZŠSO. “$Mz¾<
+׎GÅ}!„
+G
+Sm8ÒÂo[Wø䉽›lµ**ê—cÙÈ4I>™?.>x¥$Nö«{_‘žË#nþú’€kbï|Iø¾UaS¦b ¥,KâD÷¿@Üù¡8 É4ž`>Î$Wº3©Á}†Ï$J@‡“A¹wÄà‰¬‰òâj3'Ø¢¸- ÉÁÚHQS¯ |SÎ1íćí˜oé4þåÙX 44Ê<Áö¦n<½eš°Ööy4åXñØ]­Žðz>wU L\SÀœKŠG¬³«\|ÁãRf×ûp|~:ûû åèôFµÍå„ÚR¯*æàn=|'/GP³Á‡xWP5žÌ?Þ¼wtzæ¡Ûç ㇎М&sgÑ=
+=ÎG<@xñ`aü?hÕ÷IXÿ%,˜„u'a=.a
+endobj
+1622 0 obj <<
+/Type /Page
+/Contents 1623 0 R
+/Resources 1621 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 1609 0 R
>> endobj
-1246 0 obj <<
-/Font << /F37 802 0 R /F21 714 0 R /F22 737 0 R /F41 939 0 R >>
+1624 0 obj <<
+/D [1622 0 R /XYZ 85.0394 794.5015 null]
+>> endobj
+442 0 obj <<
+/D [1622 0 R /XYZ 85.0394 220.329 null]
+>> endobj
+1625 0 obj <<
+/D [1622 0 R /XYZ 85.0394 191.1908 null]
+>> endobj
+1621 0 obj <<
+/Font << /F37 1018 0 R /F41 1208 0 R /F22 953 0 R /F21 930 0 R >>
/ProcSet [ /PDF /Text ]
>> endobj
-1256 0 obj <<
-/Length 1976
+1628 0 obj <<
+/Length 2008
/Filter /FlateDecode
>>
stream
-xÚ¥YKsã6¾ëWèHW­0Àçæ4™±'N%ή휗‹&! >’²ãd÷¿o7 D‰öj<5UÃf³Ñϯ€Ìç>üãó$d¾Lƒyœ,ôy8Ï«™?_Á·/3neNh±/õýíìÃ…Œç)K#Ío—{ºæ' ŸßwÞ§>þëöüúl!Bß‹ØÙ"Œ|ïûË«ÏÄIéñé—«‹Ë/¿^<‹ïöò—+b_Ÿ_œ_Ÿ_}:?[ð$ä°^X ¯,¸¸ü霨/×þùãõÙýí³óÛ!–ýx¹/1?fw÷þ¼€°œùL¦I8†Ÿñ4ój„’…”ŽSÎnfÿî}5K§òÊ„…‰ˆ'ð©†)‹¤&ÿýcøp!øœs–†¡@Q¾b–D24B˜. K¾ï{ås«:ÊÂMŸõªRuO¯ŸÕo¾/jÝë¦&NVDüÚe+e-‰=ŸÀ™Hyl Ý®ÕàÎNˆ§,‰ŒeÈþ±*°H¥°RÝÎ5)¸—75ú¶Ú¶g<ñÐäö`ÎuVÊ÷:Õ>©Ö~n處£r«/³2z”zµîŸþO k¦)­²A1à 1&¤÷›ú7JB(>K°LQ± Ž9“>¶«9×ûÕwò‹ý¦ú£ôëÅ4ݨ|@½eÈ’ùb
-Œ›ÖŽ³lM}¾º!7†ÎMÈ€!Æ…Ød¹ÂÜÉÄÃMB@#´…¹"ÂúµiêN‘¼/éåÑŠÁéúö,ñ¶9UÊ4…Ój…:³W!Ueumâľ숗ѣnÚ*³Ú)`@Ú·´Ï×f’ ׂ#”‰]!Sav,Ÿ[¬Vƒ1V¥çØ;tJéÛ]>j™Á˜&Ê>Rnv…é”Î æÛ`rÿû†¨ƒ}ÍrðÚšÏj’Q- Òv°:qßêÕÊš*¾bÖþyÆÛ*kóõD HÎDLÌZ$&(|B#맬ø¶Ajò8atFÑîÜó>Óv[Ãh·-|P}þ¡5Å
-…×ROMÑÝÞ1Ø5S,™w;¦¡}Š×i$˜ˆ"ç ®TÿœP 7aŸ…iäCb© qøÉRüj4‚îHo¤Ó{/pî„ã í©û©£‘]½nº~7 ÜÛéëéJ¼ÐÅþëƒ.ÞÔ0ò¿Ð­Êû¦µ³éúp‚q˜#‹oXnŠ¸øïí§¬yÝ£íU×e½È[U
+xÚ¥YYsÛ8~÷¯Ð#]µB
+G«æÓÙü ΤÊ™J±‚%A ' úÒ2($d…sî•O­î(Æ›>íu¥ëž^?ëß8—uÑMMœ´Î‰øµK×3öä¨`|ËL&*2†n7NHŒ„DÂâHa,(CöUI(y‚Y0RÝÞ5_
+/kjôm½kÏEì¡ÿÈíÁœ!ê´2÷:Ý>êÖ.7ôLËÎQ™Õ—Z )=Êb½éŸ4þ%†5Ó”VÙ 0‚@’¾÷øÖ‡ðP‰d*ñ‘¯˜ïG!Ö‰ÖÚõ‚ˆëQaør,Ou'çH+æèFgK4Zü€Åœƒ¾
+°Nu‰ò D‡~Æ1S!‘”Ì¥š…ZŽ¥Ž½;Ò…Ö$H
+nþ±ÓW›zÆ»\£nè‰ÁUXÑ}¢ò¿`·‡#™D
+²à„wÎ4Û, ¦QÈ€«ø(¶¦*úÞ˜ÂÑ:õ9OEY… bæ°‰TÛa즳˜0a5‘Ófk“â Xƒù¬’Ðbè±ÐOs ¦Ðÿèh2ö½‡¢Î;")Hío|¦ô(‹sá0¼i"ÇÞ(n&
+Œ›ÖŽ³lM}¾º!w…ÎMHÅT »3Í4æÎ=Ü!¤4B[k"¬_Û¦î4 AÀý’^¬ ™®oÏco—Q¥LS8­V¨3RUZ×&NìËŽx)=ꦭR«‚&
+'¾vþšöµM«
+Ì#
+ˆoƒAAÔVˆ1f×þûÃ\ê–ƒ*‚»%Wû ª2xâEW¼|ÑuÚgæ4\ö§)ÌœFY6OD"ΈG¬©*çI§­“æÄâf¢;ê´+Êg¢q ¶«–3Ü«Hs¿{8ˆ¶+S7SÿÕÔv|'Û†t ×À&»Ùb*O€ëë?n¨»h7Ö¹µÕ1IÌ ã&¿
+T` à<›)ŒK.æN´£me°1é³Ègo,v‚Cgå/ÍØP2†Î„]©ÿ:£îÉœ Üì'§•!±ÔŸØ|Ò‡"pzî¹#‰´ïÓl³ÌàmvCÞ£‹¶·¾Í 7û9^wMKŒ^îáP g;Þ4]¿Ÿ2îíÕï'ÎÓ}{Yäã×û"?݃¼huÖ7­08¢O ¦ÑòmŸO|‡Ó<Ì| jºåw¸a°´ü\xó·=Æ°îºt[ }úðö8Æ:²VçÐ^EŒ¨BVlÓòT_ÜömJcè·D’oÆ[ÅýYøÖ§§ Ê€¹*Jýölæ»jûÎOñ:l€pòçS,é
+§ìEf;ÿYw÷M{_7'XŸ|þζEþNçù;˜õú–Ow}î7yØ ð‡ô™Ÿ2ù°£}÷ïõûÿ̀ÇÇrþGQÁFƒëý ;ü°ìúÿ
endobj
-1255 0 obj <<
+1627 0 obj <<
/Type /Page
-/Contents 1256 0 R
-/Resources 1254 0 R
+/Contents 1628 0 R
+/Resources 1626 0 R
/MediaBox [0 0 595.2756 841.8898]
-/Parent 1245 0 R
-/Annots [ 1259 0 R 1260 0 R ]
+/Parent 1609 0 R
+/Annots [ 1631 0 R 1632 0 R ]
>> endobj
-1259 0 obj <<
+1631 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [519.8432 682.6714 539.579 694.731]
+/Rect [491.4967 730.5319 511.2325 742.5915]
/Subtype /Link
/A << /S /GoTo /D (lwresd) >>
>> endobj
-1260 0 obj <<
+1632 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [84.0431 670.7162 117.8035 682.7759]
+/Rect [55.6967 718.5767 89.457 730.6364]
/Subtype /Link
/A << /S /GoTo /D (lwresd) >>
>> endobj
-1257 0 obj <<
-/D [1255 0 R /XYZ 85.0394 794.5015 null]
+1629 0 obj <<
+/D [1627 0 R /XYZ 56.6929 794.5015 null]
>> endobj
-334 0 obj <<
-/D [1255 0 R /XYZ 85.0394 731.9325 null]
+446 0 obj <<
+/D [1627 0 R /XYZ 56.6929 769.5949 null]
>> endobj
-1258 0 obj <<
-/D [1255 0 R /XYZ 85.0394 701.4683 null]
+1630 0 obj <<
+/D [1627 0 R /XYZ 56.6929 749.3309 null]
>> endobj
-338 0 obj <<
-/D [1255 0 R /XYZ 85.0394 475.6865 null]
+450 0 obj <<
+/D [1627 0 R /XYZ 56.6929 523.534 null]
>> endobj
-1261 0 obj <<
-/D [1255 0 R /XYZ 85.0394 450.9966 null]
+1633 0 obj <<
+/D [1627 0 R /XYZ 56.6929 498.8411 null]
>> endobj
-342 0 obj <<
-/D [1255 0 R /XYZ 85.0394 393.3855 null]
+454 0 obj <<
+/D [1627 0 R /XYZ 56.6929 429.268 null]
>> endobj
-1262 0 obj <<
-/D [1255 0 R /XYZ 85.0394 362.9213 null]
+1634 0 obj <<
+/D [1627 0 R /XYZ 56.6929 398.8008 null]
>> endobj
-346 0 obj <<
-/D [1255 0 R /XYZ 85.0394 329.3761 null]
+458 0 obj <<
+/D [1627 0 R /XYZ 56.6929 365.2487 null]
>> endobj
-1263 0 obj <<
-/D [1255 0 R /XYZ 85.0394 301.8169 null]
+1635 0 obj <<
+/D [1627 0 R /XYZ 56.6929 337.6865 null]
>> endobj
-1254 0 obj <<
-/Font << /F37 802 0 R /F41 939 0 R /F21 714 0 R /F22 737 0 R >>
+1626 0 obj <<
+/Font << /F37 1018 0 R /F21 930 0 R /F22 953 0 R /F41 1208 0 R >>
/ProcSet [ /PDF /Text ]
>> endobj
-1266 0 obj <<
-/Length 1168
+1638 0 obj <<
+/Length 1135
/Filter /FlateDecode
>>
stream
-xÚ½XÛnã6}÷WèÑ.@V÷ ö)›:iÝlëzŸÒÀ %*&B‰Z’rìnößKYK‰ÝJŽ$J<3çpf8¦¡éêÏкh^`CG7-LFºö Þ]ŒêPÚ_}œ~¾²<-€kºÚ<naùP÷}C›Gwcšp¢ôñå—Û«›ë¯³‹‰gç7_n'ÀtôñÕÍoÓòîzvñùóÅl ß1Æ—¿^ü>ŸÎÊWn…ññæö—r$(/G@gÓ«élz{9ÜÏ?¦ó†K›¯¡[‘o£»{]‹íO#ZïhOêA‡F˜Z2² :¶eÕ#tôçè°õv7õ ~†MË5h-}ºº‚òœ
-CœIU3ÂqtBucü ñh¿¼å]‘%ÅŒ ²ùÊèŒy;ßËKdÙEQ¥ã]ƸlÆ‹‡ûò©2!¬íí.?úè“«2¥j]ø¨äæëÆ£¶¾ïÀL ŶÞa´×¥\­EQ¹þîyW£tàúq/d®U( À ¬’m#MWpG%M¸ÂJ•VõÝó;–Æ‘ºø·üì!
-†´RˆÐÎ
-z¶eïPê´ª­Mk ׃–gÚõßSlo1¯{a :žmT¶c¶½í¶nÏ•'¦38ÜÙV¢öRÂò íÛöpoŽZ,Nñßé â› ÷'©¶Zß7›s@Ólšž¯È)Ê©‚‚­¿ò¼>U|íú?ËØ̈endstream
+xÚ½X]s£6}÷¯à1~åÃØ0û”M4;ÝlëºOiÆ#ƒˆ5+ tÛÿ^§†xw2Œ@G÷]]d–ú³ ß3-7“`dz–ía2°Œgõìn`ï€ò%Pëã|ðÓ­;13;cc×°|Óò}Û˜GW7¿\ÿ6ŸÎ†Àñ¬«±9Þغúxÿð³n ôåæËÃíýÝŸ³ëádt5¿ÿò ›gÓÛélúp3Û÷lÕß)Nt¸½ÿuªÝÍ®?¾ž ŸæŸÓyÅ¥Î׶ܜÈ×Áã“eDŠö§eºï[uc™v8F2y®é\·l!ƒ?¿W€µ§/]Ûôó\ßô|gÒ"àÈ® h[¾Œ‚‰1ñsì:î‹‚C0¶¬«¿E@H(±8ºqÄ‚ñeôýSÎW
+lÛ <Ï©ÀL®
+ÔƒeÇÇI oÿÑ´K Ë -($âj
+ÉþŒ(9
+3.Tjv'ÈãÐq-È}Šìîô2¡ò<)c¤‡¸jmKõð.æ` êŽñÒ5æ,ŽcÄ ËiúËò¬vɵº&Aà©ö9Î@…@!@.I‹îHpe5k§ÃUfÈN‡Ö†M[C#t€>@•Ø9Šm¦b7iò¬Û®ä™Z‡†+V(Vú*,pŒØ^’C.Õ‘ç-zÚCM†(•ÊêSÌQÔÃ8ßBë•/ÀÆ\Ę y‚û ;×ȈiùM_ÊüM0Š
+eSÆeÕžß<é»bÓ4Ëñ^.ÿž£O¦PÙh¸VróMÆɱ¾½€9®ä5GC«ƒ.z¶¹)þ\™g:°F„çqÏe.U(2¬«’¦© håQH®R¥fì~§¢ÑRî+µ8[¤sŽ¤SÉ@›)1i4àgÊ8:µÀZጢ,U{^ÈxôŠ×;·ÞÐ1Ù}¯ÁZ(n1‰Âj½vñ Ý_m<è™c¹ïî%[]ü@΂o~ü˜xI0}î®R^oE[]Œ6¬ïh—;ÇÅ
+¸Z1U`å‚„X$PÍ ‚Ks>´V¥÷ôO`‚rg¿l¨ „jn¾ò;ÃnQCrHE\ÚéÅb>ªz/{y%²TU|—ž;
+Š:£Z­À/µ¬ÅºÇG´®ÎÔeö9Ä¡ êQäézH¦ü»^;ʇ· ¤Êsæd¬tYõu¶Íˆ=•+$°¸˜ÞK¢Ê´#—Ëüûl3Y”‚¼¤j†š·tMã SŸ{ïD|á¸^ÛI™ë™ùñV˹–U• ï>E;1Ž&¦ëûNu@æ8µ2×›¾LÊ rΞ{yuÜö:ôÿ
endobj
-1265 0 obj <<
+1637 0 obj <<
/Type /Page
-/Contents 1266 0 R
-/Resources 1264 0 R
+/Contents 1638 0 R
+/Resources 1636 0 R
/MediaBox [0 0 595.2756 841.8898]
-/Parent 1245 0 R
+/Parent 1609 0 R
>> endobj
-1267 0 obj <<
-/D [1265 0 R /XYZ 56.6929 794.5015 null]
+1639 0 obj <<
+/D [1637 0 R /XYZ 85.0394 794.5015 null]
>> endobj
-1264 0 obj <<
-/Font << /F37 802 0 R /F41 939 0 R /F22 737 0 R >>
+1636 0 obj <<
+/Font << /F37 1018 0 R /F41 1208 0 R /F22 953 0 R >>
/ProcSet [ /PDF /Text ]
>> endobj
-1270 0 obj <<
-/Length 1164
+1642 0 obj <<
+/Length 1187
/Filter /FlateDecode
>>
stream
-xÚµXMsÛ6½ëWðhu(>’˜œWviœVUOªFÆ"r¢4ýï?$‘e‘t<>˜¹oßb ` ™?ly "ÊmËå6d3+XuoÞÝŒpõ Ø}ê_½~¾¦®Å!wˆcÍV5,"ÏÃÖ,œ_\ýzùûl2ÂÐ…Ç€9èâííÝ/å/ÿ]}¸»¾½ùkz9ví‹Ù퇻rx:¹žL'wW“1ÀÃÆžT' ®o›”O7ÓË÷ï/§ãÅìÝh2ÛûR÷#š;òy4_ +4n¿!H¹Ç¬/悘sb­G6£Ù”îF¢ÑŸ£?ö€µ·…i›~ŒzyÄmÐÆ51%Ðs¶\Æ¡C -œƒÐEš(]>ý*Ÿdº< Ï}µ06|\ 0tmÊ
-ˆŸªW3†­Ú …KëÅ»x³ÏM¶9´)wÌSBêÔ>o„Ú‚,Ù¨@€Gç)Ë:_g釡jæ.$Ž Å)ÂäˆpÉÈ„’"ó¶Ñ0±ìSsÛíb}¯˜átÇ×™äîŠ,ë¤u¡íÙ¬è·èG­òãWÏ& XA9&ITŽoE¶LÔ2NX¨Uå¦=ÈŸ*ÉãÍú£PíäˆMúZÈX õèG=±ÖþW •g+¡€–kd|?‘lôKhÈ0êFã D' Wt‚ ’"î“9F~šÚ|̃Êä£è>}ƒ¸™\úQ¹82Ë¡çü5{)ú’ÏU‹d¦EœlD_ÑwA[%jíå~ `>ø"ö¨
-w¼­Æ% wa[M—K “^žîm¬­½mj|{‹¼S©Ü¼*ÉÔ>®Ï.‡”¸mõ™AîºN{mœŠlUq­5²ÜÏpžM¶Ã¦jŸ j£J…„º¼}Ë4è%k íd%ˆC‚k•µ…ëYi Á»Èy%ºÄ…ØöÈÉò¤¼}¶Ë8Ñrµ¡ˆüí®TIf-”Ú§Bè”6Ž ©KìS‚±—¥K!µ9?Ïò|Ò2ð’s Iq8®þ“xvŽ‰e (‘Ê÷¬®žc;`!l´ÿul,äוQr2ùM èþ1qÍ{0ÏŸ–Y*‚ ‚Ä´Ç–å6ý¡ßÓ¾áÁJF»¦ ÿä™öƒO/aDÂe|º·¸ öÂWú£ð5Ø#f+?CŒÚôG2Ȇú “41˯™-Õmiš¦àa™w`Õ¢^¼yŽŒIŠÃ·/‚R*$*ÜõfZ1räù³oŸ¦æ!COËùæ´¡õCOøÁÃPã¶Í6]Þ|J½m]
-•PåE÷“yeº/²$NÂf?%ÿïëê…OAém*ñY˨$é}˜Ê›¼`÷ØäS•<Ê°£ÓQ΂2=ÐZ«¼P
-øÈRÿ¨eêìD!žX™
+xÚÍX[“›6~÷¯àÑîŒT]‚Ù§ÍÖ»ÝL³i\÷ÉõxÈ»j08 oâ&ýï°Y v·Óñ–ÄùÎwnÒAØ@ú‡ fAË!ŽÁ2„™á­ÈxÔkw\¼v/ê[o¦ƒo)7èXÄ2¦Ë
+– ‘mccêφ$p¤ÐðæýÃíýÝï“ë7‡Óû÷#@ÞÞÿ2ÎÿÝM®ß½»žŒ
+ +  gk
endobj
-1269 0 obj <<
+1641 0 obj <<
/Type /Page
-/Contents 1270 0 R
-/Resources 1268 0 R
+/Contents 1642 0 R
+/Resources 1640 0 R
/MediaBox [0 0 595.2756 841.8898]
-/Parent 1245 0 R
+/Parent 1644 0 R
>> endobj
-1271 0 obj <<
-/D [1269 0 R /XYZ 85.0394 794.5015 null]
+1643 0 obj <<
+/D [1641 0 R /XYZ 56.6929 794.5015 null]
>> endobj
-1268 0 obj <<
-/Font << /F37 802 0 R /F41 939 0 R /F22 737 0 R >>
+1640 0 obj <<
+/Font << /F37 1018 0 R /F41 1208 0 R /F22 953 0 R >>
/ProcSet [ /PDF /Text ]
>> endobj
-1274 0 obj <<
-/Length 2424
+1647 0 obj <<
+/Length 1337
/Filter /FlateDecode
>>
stream
-xÚ¥]s›HòÝ¿Bo‡«af>*OÞÄÉyïÖ¹³½uI*‡ÐH¢‚@ÁŽr»ÿýº§ö*Žý@ÓÓÓÝÓ߃Ø̇6“¡&<™EIàIŸÉY¶9óg+X{wÆ,Û¹Cª_îÎ^¾Ñ,ñ’‡³»å€WìùqÌfw‹Nèqï8øÎë÷×o¯Þý~sqÎÝÕûës—Kßy{õÏK‚ÞÝ\üöÛÅ͹Ëbɜ׿ø×Ýå -…–Ç/W×o“Ðã¦7—o/o.¯__žºûõìò®?Ëð¼Ìx¯g>ù³û×3ßI,gðâ{,IølsHáÉ@ˆSœÝžý»g8X5['íÇ|‹O0`ƾúÀ*’‰
-.Œ?œ»¡ï;›¼tk¥ë«ó"\Ùnæª&ø=>áAªË˜—HÉG,Òo?Ëb[Õš |û_¦÷°ážt±Èu^•iá.ëj㦭^ÓÊN5Ÿ«úsY,ÿW–fkõ\fuZ.€ÇBÝç™e²Mõús™vÖ9áthT£…Ûäßí6„>7[•ý€kt¶v7év«.²VM£šƒƒâŸZ-U]“UÑZm>úÒ'è‚Ø7ø!®ß__ö[Ø gW‹²qÛÅvptŠ§ƒñ™[ëªÒàµB­RŒ·*‹­tz}ËŠvaÙþÏr§yc£÷ÏNÊ©nþÚªzWT«çÆÚ"oÒy¡Ü´XUu®×ë\À4/Gšö$¯F‡:D[Ýÿ<%k(@U‰*üÀ Ø“¬Pi™—+7/µªïÓâ~O>a²"W¥nÜ­ª]ã›SËÙqò>—ÓÁ±0Ç2/«ÒyŸ{Z}ÓÔé&ÕÉüÔf«wnî”ø¡ªDÛ³ªÔi¦OÛ?!þ{UªæÇÃf2ð÷ ÐUÚ类ܲr›*uµ.ž«Ð›S[ˆË…—0?ó„ìƒÅ—o9›õè%
-–Ì‹ƒ Ÿ€XS̪-–¬†¦”[jµè£×7ê£ïóÒ48Â@ƒ"à÷&])+Š&Ä#χÉȺ[«^Ÿ=‹½$I" FšNƒcff#!¤¥kÊ á4J7µ[z®ŠjŽéðþXð¢+|Î\Ù Z4ßÑÇ8À»un·ܤ–›bZ[9¦Ô”)rŒ”¨6;kªC'ÅGä@& mWm’uq 1…=B™8WKBê5$‹EQ9DCLL6Œ½8IØ_[6Ð-ûx'¼L²z#¢ÀyQe_|Èq`B
-±J8¢%\CËhxD亱1ë‡^,“dœO µLÛÂÝC^wÁÝåÍÍÌ‹ g‚^Gâ‘9—ˆÜ!•sGfëfðžÊ(•×*Ó”ßÉIä…A?-¹#š<ôó9ÄŠÏÇ¢1k\Á¥óPÕ_ µÑ (dâ
-à{ßU´¢M"´?1—1fŽ”0k ¤è"@€vjÂt=6U£ 2¦ãÙ…ªÕÛÖ.Ñ¡šîEúÊ[y”8£ÑA'@ã-¼º-'r îapñä6ǨÙrp‹)/QwN„&Ï)bnj
-¥~Q;÷ÑbÅXäÉ(xZzG4!}T¬8‡U)Æâÿ³6©Íà®ó&ŒšT°üÄYì =òŒÛí"5e`S³€ QYÛ÷6F#Xó‚j9—ùGÔà%›žtÛ΋NN*p>:(>ðTß“:‚;o®oo/_ Æ$`_Û,Ìí®eÕ–˜bB
-'_n
-6§‰»ó„;i ‚bZÄÒ‹DŽƒº‹áÅ5ˆ½PF]m5ÕâQ]Bü­‹wdz£EÑTãïÒÞc?ãÁdŒ¿½M¿ÿ ÷Ó?ñíÿÄæÇ|ºRñ<«ž+àÇEÚþx¬úÿ[@•¿endstream
+xÚ­Ûr›8ôÝ_Á£=³¢,.Ó§4uºél“nê>µ ²Í#Šd'ζÿ¾G08$ÁnœÉ ç~Ó‘°aÁ6|bZN06¼`l #\,c ß> p‰ƒ*$ÔÄz7¼¹p<#0×vé¢ÁË7-ßÇÆ4ú6<ÿûìótr3B6±†®9Bĵ†ï.¯ÞkH ç×W—¾Þœ¼ñpzy}¥Á7“‹ÉÍäê|2BØ'èí’×ÿLôêÃÍÙ§Og7£ÛéÇÁdZÛÒ´[Ž2äçàÛ­eD`öÇe:OŒ;x±L¶±Œ‰c’±ãTdðeðoÍ°ñµ íòq|“ø¶×áÀ1n8[¾ŒÏðH`ºŽíü6B®e E¼DðŸÆéÉ]Æ44ݬç,×ë·úq«lÁc3 Än2YÇ)Ê9—¢I݃n#Šï¥ 3žÏRþœ\ܤÏr¾£N=¤çìç† y"µÌ•(ÌHd4d§Q8-r&VHÆë#@ï_I¡‰ÌwG±Àõ8–EK‹ŒçR¯âl¦^zÐÐ(ŠeÌSš EÎ׈näêÔxò
+i¸:&¸í£i<"¶« ɨ\ÍRZy§gp - RXU·l&2®Ðšf‹ ¹"˜8>ñq"¤=üOÑv¬Áß-buzé—~Ì¡^~ (¡aM“§ÿÕqR&Ì
+»fI,ʬùÝà†[ê}ùyë¢ j'¾¯Ø+:Û1ÕÉ»4
+“˜¥U³;M›ƒøª˜¼šqì>L6{5õÄfQ;§ðVɬW‹ 7¹ˆ· 2%Ùõʵ–)“¦›u†«6îí3*©€Ë·UÚ×æ‹)„BžJÊÛý rå9á2Ù°Ãâ9kÍüZ€«ë«ÉQÕÃ@O´‰²Fëxn{~ÔÌû“¶Ó
+°ùÃùŒ žl«Ì)†V¾‘'åbÄÒ¢©¸SÃJ{¼zi>ìŒ,“ÅìÙ£;¾}6vM•’˜*ÔÉòõÕ
endobj
-1273 0 obj <<
+1646 0 obj <<
/Type /Page
-/Contents 1274 0 R
-/Resources 1272 0 R
+/Contents 1647 0 R
+/Resources 1645 0 R
/MediaBox [0 0 595.2756 841.8898]
-/Parent 1245 0 R
+/Parent 1644 0 R
>> endobj
-1275 0 obj <<
-/D [1273 0 R /XYZ 56.6929 794.5015 null]
+1648 0 obj <<
+/D [1646 0 R /XYZ 85.0394 794.5015 null]
>> endobj
-350 0 obj <<
-/D [1273 0 R /XYZ 56.6929 418.3076 null]
+462 0 obj <<
+/D [1646 0 R /XYZ 85.0394 122.4687 null]
>> endobj
-1276 0 obj <<
-/D [1273 0 R /XYZ 56.6929 386.0953 null]
+1317 0 obj <<
+/D [1646 0 R /XYZ 85.0394 92.1609 null]
>> endobj
-1272 0 obj <<
-/Font << /F37 802 0 R /F41 939 0 R /F21 714 0 R /F22 737 0 R /F39 899 0 R /F48 953 0 R >>
+1645 0 obj <<
+/Font << /F37 1018 0 R /F41 1208 0 R /F21 930 0 R /F22 953 0 R >>
/ProcSet [ /PDF /Text ]
>> endobj
-1279 0 obj <<
-/Length 3843
+1651 0 obj <<
+/Length 3032
/Filter /FlateDecode
>>
stream
-xÚµZ_sÛ6÷§ðÛÉsC
-@_ÌsëzH*bkÝvÓkÓ6óêkÝõÖ0‘±Û?†Êgëú÷Š ÃMoà=¿J™Er¡ÁÏ€!5¢çÈ^2Ê1Ó¹kîGœ‡CNÄ} L¨ü Ùm9Gˆcã°MF:ë8»?:²L»˜‡+ÇP,br0—¿´{j°Ð˾«›'Nö÷÷óÅýí‡oèµ_Õµž‹]]<¬ù‹Í [L)«_ãX6UÎÆ©Ž£<Ó¯¤ìëtÊö\‡Y¡Çû¬²(N“ó¢Ó„èaÆ–Q e(Ûfl Ñõº~D¢ªùwÕz½±öìB1²ì;Œ;Hz`Jï¾vÞ‚˜Þ‘æò3QÃÐ…½”ÇeΉÛòPôîœ4ÚÔܸ
-!tS¶U:Js˜Û0^€Ö[½1ÖØÌ¿´»ß½³” –}»óÞºFñ[.ƒ‰Q²ÂM§òœãh
-¤•Ç8éu:O£4ɲó^rö:Ïe¡B±\UsÒÖ‘ßÁ¦§ƒ/&ÏqMˆx˜m*ãl(áC“{ZàeÕðÑoRÛ¬{sݲÖÚÞE¿3ÚK¡PzE{×í9.Æ÷›íIåå‘I_‘í˜&dU—D&‘#á ‡‡¶E¿rp)=†K<¿xUHÄUt£Ê¢/ŠÎ}Ö2À¢Z
-¬-­%JW5ü}W?5źóÝ yjLJ/Òè™ÍYMC¸Â$3´Û:Àfè—"™ÝÓ‘²N fˆD™†:"[¬ ÊÝÉÊ[
-èN‡PÌËÑó!4à:B—ÅQÕr¿ÃÚñT Mt9&=?Ï51…A<€bZ©Ñ(Ýj¦[ÍV ÏþJ̇·Yíü@ëCÆ…6CÔAÿç=¨ïêÊw=µ‚c==ÐkÓ¯_ˆÄõ)ˆHÙRlÄcI3´‡ÚµÙ·u›Íx“Ÿ'Юˆ¡€NR—‚0×oÔô)¡ÎÂSÂÿÒ5hpnNUêÏO6¤©ÈdòùN¶ç²8èU$‰'<1lÜÙ)x®‰9 Ï‹R€ì©N‚2]œ„Þ,FˆÙD‘àó´=Ñcà,¶[Hgw˜Ñ~ÑÒ“«.`W]SÉO[uë¾›N\s<'KâQÀ#{T)Mb
-& ¤® ßk®ø !üvˆTlЯ¨ë€TRuÂAÓ"CK<5À÷*Ë|>hHKSãƒì Â
-v©öqäp‡@vÈeÕ-wõC%F+5 ‹JJ0¶”®C©s÷tIOízþyøÁ±í‹ó¿‡×mã. “ŠÑ£ÚV@Çb0£#ò\¯Ìãx´ó¡#N#€mœ×™Ðá¸,Hkéîk-°2Ò&=/ÕsMˆ•£³T£ ÐÈåhaf?_ÿôfñî'z±³ ýýæ‚«$ qˆaG¬öp Il»UýlS’,n£O›ÒS¯ïîéSFÙ}»l×,kWø3ã%â5@ŒÎøøb:²ü ›dlÝf¦æ%%ýI^6k·ÎÀÌÌÑðºƒÒ/–:=߃cŸ÷§çx)Ngƒ·TX7bð—™ë%}bŸ½z""`‚ÆÍÓ®+_‚°a:u§¶‡k—ê—íf³oê%I»\?
-ÑR‡3,Ò$nƃÕ=·»zSìê5“›ª*ݨ|µo7èþæÃ>øÌŒn£Û-ÞÝ€1ÛKX!gÝ~¹BçóèèiïKl Ü©é
-\;ºe„€7x½/ûmi-Û„¨”­˜ù?PuèŽ:g§²œ[X¹Kýù”AÛì‹\Â¥CÉ×l`б "ÂÁ z÷+öí˪¶‹…,È
-Î"°½ÂÝÃÞ,!kõuUì»ÞÖ®*ヹ̅†ìig®ÞClÌð–u½gI“PG%Y”àÙ0ÊÀþ¼á_#L@%‰C^¼{d±BGy’ŒªäƒÎh_e’;m$ùðÇ*–BÕ~’Såm[þêõç.'Œ w‰¹nôkŠ ‘Å‘Ö®”ñ¤õÅﶂƒfeÓÑ#
-=]ý‹Š j:›B®ÓIÀsY¤³««Ý®*çOh‰GY F\hÎË÷\f£Äpt¨-Ç.“û+_5[ã¯Aø¦·ÙòE0Zø[b Ÿ”ÈÙ[øÃÆ Tw¦å.˜Õ¬ÚàéUéˆÁ™ Â`
-Që@¾bQÂ9Äö†aYm¨ðºÍ¹7a8qK¬yÅ×±£ŠûvKäuõ\­ùsûžŽ³§áX_P²r·9?BìÉæø1ˆ,œMmCs«¾.×û’÷}&òI2C*éöïúžÊ4Àºâ†/ÕWpÅ£cƒîÝe5ìaðr`tó¥:üð{^øìÁk’ÏAHÐòX&S³{ÆN‡INà’*‡îƒË‘"XŽD´EX„V„½uô
-j«8ËXö–ÈÇ›.ãðR†@‡‡‰RuH›b wxá|û0B&wÿºþøãÛÛ»ã€Ð…Þ>×¥K'GÞݽýñæDx(ënÙ>Wƒ,äRš¯C‚@4ýÃW ë¬=á“ð÷åOÿ&üðƒy
+xÚ½]“Û¶ñý~…&/æ͘
+¡ ¯~ý/
+û§+΢,Õ‹'xáLd™\ì®”Ž˜VQä Û«_®þ:œÌš¥^ý ÎdK¥ô)Pg,ŽddX”ëü°íI®§j»¥Ñ²¤ç¡+ v"¥`‰ñ"‘NÂÏ!…S,bJø˜rXÈTÞ÷ùj®à_y¼¹’ˆâòî–gû©N€C–e±šï³Ý6OÝu¥q°íTûmIoUé&ú†žÝ&o¯EXŒÜB«ú½[Dr˜a‘÷ù2ïJ0¸ÖÜÁÌH˜F›ÜlUowjžê)!PÈ"Œ4Dœ¡¤,ÓZÒaZê€-¢`ùLO{Ä/áMfÁòиZÓs" ¼9a¸É-°ßØA—ïì¨Ù—mÞWMo °o¶ÕÊî¸nZÔ>©¨k¶\ddàsæóº
+œ˜hS>e@j&¤Eéú¼/weÝwh•B"]CÿiS€½WÆͦ==Aým[eG½ó©KeÏOàý¶Y‚qž² žžè$ûƒjKX*ѦG¦ Ó OÏœ”Ž¦JÄæÔRñǵˆ³4åbƒ4"ÉþPò,KÓÔŸ:Âb8%ibàœ¹(biœfãÎȤq]Ï)ÆŒK'ÈhhÂ.PH8Oçqk´´ïƒÇBbcM‚lÊz\î1¯²Z Ù”ŒÎ@
+!„Ãêʬ…È®š™|°nKü¸hdudK™f'qu 1ø?ì!:‡ÐV:Íâ–&Ô¨™VdÅ#<p€î—†OU¿±ähî‰Ú…V\o¢í ñÚÎîG™GÍzÀëJ_ÐB!†ÀdôÃÐ=¹±j´´õänc>ètVKt>·ÏÓõks2¸°9"o­v
+»`ÔVa¨&o|[›¨…ç½Ûap£±;ûœ"Mêæ³CÃWLÝ\ é OÍa[ÐpYÎ×æX# C¸äùÅ-&ùiØ‘ùNäaÈ”ñ&¥YÑÔå<«Y?OR‹×´‚L©ÿ&þå–™œ6ÄN²—;{²_@´¼]V}›·–S4^EÁ!/@5:;Ë›ºC2FeÉx¬<hõƒ`£pxwç"©HwXveOc´X3eŽ
+1ı¯þŸŠ—/&9A赟¿_k¸¶.þòžFÓ@¯9=†@Ç¡5ì,ªë3× fC/˜MZ?¨ÑkKeÌ»¹/oaMOqrÆ µ °cnÚ¦u¹ê}*±!ÆÇ(¦¢$Òi°:´$Gät†ýÚÖ´.O
+ aßû4CŸÅ#u®‚´4ôH®¾H/†¾Ç_CÈuÕg_¢‹SmüÈŸ-³
+_£ …^”º­?—mÖMØ5ù9Vá´t¤]}–\Î˳û¦7¥…r>|\(ëÒ
+î%y=][ÁÔ`M^Z``¨£ÏŽ
+‹rÂÀ,L$ ü]É„
+¿<9ñfžš_oÐ$}ŽH‚MCß3RkŠ
+K/(1ºäÒ[»+Îü(&Ò Éâ‘žŸÿófÆ_©„Ei*ýš”IÊT
+D,S¨IŸŽýeÍ)ëÿ)”o#endstream
endobj
-1278 0 obj <<
+1650 0 obj <<
/Type /Page
-/Contents 1279 0 R
-/Resources 1277 0 R
+/Contents 1651 0 R
+/Resources 1649 0 R
/MediaBox [0 0 595.2756 841.8898]
-/Parent 1282 0 R
-/Annots [ 1281 0 R ]
+/Parent 1644 0 R
>> endobj
-1281 0 obj <<
+1652 0 obj <<
+/D [1650 0 R /XYZ 56.6929 794.5015 null]
+>> endobj
+1649 0 obj <<
+/Font << /F37 1018 0 R /F22 953 0 R /F21 930 0 R /F53 1303 0 R /F41 1208 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+1655 0 obj <<
+/Length 3894
+/Filter /FlateDecode
+>>
+stream
+xÚµ[ÝsÜ8Ž÷_Ño×®KÓü”ÄÚ§Ìäc¼s›ÙM¼µu5³ê–l«Ò-9-u<þï H꣥öÜM]¥’¦@„@øTÄŠÃ±Ê ãÊêUj53\˜ÕîpÅWÐ÷ñJxžM`Ú ¹~¸»ºù Ò•e6‘Éêî~0WÆx–‰Õ]ñëúÇŸÞþýîýçë4|°ëIøú‡ÛOïˆbéçÇ_>}¸ýøÏÏo¯S½¾»ýå‘?¿ÿðþóûO?¾¿ÞˆÌ/ý >Üþ×{j}üüöo{ûùúßw½zßeø¾‚+|‘oW¿þ›¯
+xí¿^q¦lfVÏðÀ™°V®WÚ(f´R²¿úrõ8á × ÓŸQ3™Lg(å@‚C['«ÔX–(©œ«^Ȧ몥ßÆssüZÕø­‹êx-²u¹ëšã˵b ŠÒ ²Û.#zÌû‡l]7Dü^•Ïý*õd½ß8—ûzóA‹Ø2•,Y
+/‹ò:(‹Í×ò¥eÛª.hÈäMA©5~HƒÒ=WmG¬6*Mˆ'W!˜5F:Þ/?½•&¡M~ÌÛGj5÷ôKÒBß…Zu~ð4§Bø=µeA­çª{œy#a¦•â±¾ËÌkÀ¾*“HÏVþÞ•u[55ÍEY°3äŒ8©HAiJÎ8Ï´r‘½ˆ¹¸P
+|Ýbóû=l÷di¡RÆe/¯¹Îâ@GZ2®aSF«ß=¢’•ÊÖÍSçT¡Ù®£mÛf_v%›Ñ¥µLÂñðºD³ÅÏyKSО!©ªé—œöeDèúmŸÊ]uÿâ‰hÈô”wd
+C^ì&YF­ “J%^˜±J'rƒ™&,rb¦Oî€5ÇüÀp)½¾uv‘Eç—­íøM?xn˧ü˜ws 2¥Œø#8[ÖXÏ:„V¡S
+¦sY€Èt.Áȱ1(ŒE¸s6(’õÏŸ0Ôò’¸¶w¬®íì~O­#¤ëûæH”_¾lî¾Ü~ôýOJ‹ÑgëÛ{?šN´âéƒv µeGsæuáùQ7´} x<Îõ؈½Úv,Š²îª|û©%…V`»5@`±îТµAàÁEèñ²ÒÃsµ÷3lK¢äû}óì2C&rýB$‘(‡¼Û=RÄrNħcU盛(–_3˜%Û£s ¨ï
+Eóž¦ã‹ò>?‘‡}zŨƒNɽñØ©9à|¾Ì`¤Éɺ)»ÝÍ×ãÖ°ÞÉN#¼a‰!ÂÃN;õ¾1Ñë}ÔŽOÑ?B;úGh»wV‰rÞ ¨ãXÔòO­óØìÂÔó!`µ v‰<'¢gðcŸÂûƒU÷*­í<²C¡ÖÌlÐ{hìoRj¯Ålˆ4`ið[i¾ûôåfa+f1[!&²V4‡Üݹž6§< àvo“¬ï®­\7$Ù©õ"†³ôfuXÉŒ’a¦A´ÐÜ0—5·( Jel˜æpj½ýåû¶¡Ö6¢ßUÝ÷géÁoï†n{Œê) 'ñÁíÿÌ]¾‘œI V}Ñå¹–]~äŠêëu4òóZ1a^Y;0ͬ=òó:c€Æ'‹Ó1¼æpíüéÉ…éÂAkãQ±  1"à·–šhÛʤ®‰Ð>ú$Ò&¿Ž­‡².Ç4¢O²FJRR‚ ñ`w?¿ÿïÛ‘)ôNø—ËNÝ+øT1C›×vl»}ÞcM2Œ5.ú:‘ @ž@õŠH–ñ4ÉbÖ·{Ìëç1yâÒu\ï¿P£9Òr‘àì1OÁe µ(Û*êÕñ; -È›)2£×öɾ´Âá@$SD,[xû7¤ Á932MÆ
+¢}†ŒÛ'FÐrÛÒ~lŒ¶Ùf(°ƒ¶¶sU‘&´ KØ‹„ûÓ|_áŒøIO7W#
+Äã‚$‡“€mXf‚Ǻ©7åï` 4LdlOÛ~*»ÞW_}rĽPé#O. œ30 «µ•¤Â(™Í²l¾¾¸‰3n†SÎø}‘1# ãŒla˽‡˜À˜É`÷ÇXÀå&c
+¬Õ¡Ë‘Ü®_šâ`>¨,Õ£1¤÷8Ãõx,ßóc€5è€ûJQbà¯ËGBözª÷eëÇÆUƒ/¥$"c™L&¾î ‰ íÿ0hT<œáË€aȵ "W\qg+yúòÒifiy^ÇSãµïBÕ÷ 1ØO—3o~*÷ûƒ;M! ‹/§iû2©ÇtŸ@Z@D:Nì%áêÛ„Þ€‡bGV‹EïX{Rð
+ ƾ y&À™ÎHôã3µ6ŠÀùu`’õÞ'&­Á¼ñ½q5²èÌW<€â­ZN'гoòÂSÂO§í¾Úù.ÛDâ±úNªªW´î)Ý;øX¯ ¯± ÛØ[¹,Êc媞”ËûËÃç/œ²[?Œ¢å  F“`ƒÂ_ðå˜9§¾kúqnœcñÔA^.Ù¼R-r-ŸºÈå€J¾{,7ýeÇèÜÁ¦'£³/pÍ,?:y`¶‰äéx}ª ûœÚ
+UíNEŸ"l:¼˜n°Âë0ÈŒ\f—ªÄþiìgÜ §tæ0’NiÁ$j.²[d³
+öL+¶pJ¤…ÙRuù ˜–ÏH`rõòÐvy¸³ÚµKg=‚µö¢‘é\†ÑYI,K2!GBøHÅGŸ\+ –‘ñxTD1ˆn8ŽÕö¡ o†õOmþàÇõoëçiüb5ýï°BÅ)E­‹eˆ;•™Ü­ý9Kæ
+N™2ó[2—ce
+”78[K¦b8ËŒ~ÅTz¦ ¦â™ÜÝ]U,€5©tzqáÈt¾ò8ÑVLŠd´òÝüµ)¹Ò´÷š½+Íæ\iíÃÝÜvþ2×WìwÇ#áö]¸Ûż3•t£Î{¹9G{®Þ/÷Ü_5Ÿï¹æ˜ÇZÄ/bJÌꬤ#7ÇS}ã,ƒþe°sé7
+Yg2x Ô˜P˜˜«› ìÙ\_
+ ±ªÃaã.Š¹fd׈€é‰ A‘Žë!F€'‡¸7Q$ÄøÇuOŒ8ó§'g­ï E7¢¡_Ÿiû4Ó0þ×eZÜøbÑ\‰:e\s3—jáñÔB×øÛ!BHÇŽ‘Šsúþ"ºG*‰Z°Dдàbl‰KÒ
+fbÞèòpe–Çï¬Ç2ƒ‡ˆŽøI¿çûª omffÅŠ ™’/=
+8¾]^í[}µ¾"D_y}CºÑW,ø<´m/—n–¾Ù‡ ÚÏØ'üõ¾éOÏßÿgüâ6ËnMOX&m„BÁM:•<~ø.úÿ
+endobj
+1654 0 obj <<
+/Type /Page
+/Contents 1655 0 R
+/Resources 1653 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 1644 0 R
+/Annots [ 1657 0 R ]
+>> endobj
+1657 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [250.9056 335.8063 314.5963 345.2159]
+/Rect [250.9056 106.0844 314.5963 115.494]
/Subtype /Link
/A << /S /GoTo /D (statsfile) >>
>> endobj
-1280 0 obj <<
-/D [1278 0 R /XYZ 85.0394 794.5015 null]
+1656 0 obj <<
+/D [1654 0 R /XYZ 85.0394 794.5015 null]
>> endobj
-1277 0 obj <<
-/Font << /F37 802 0 R /F21 714 0 R /F22 737 0 R /F41 939 0 R >>
+1653 0 obj <<
+/Font << /F37 1018 0 R /F22 953 0 R /F41 1208 0 R /F21 930 0 R /F39 1151 0 R /F48 1228 0 R >>
/ProcSet [ /PDF /Text ]
>> endobj
-1286 0 obj <<
-/Length 3459
+1661 0 obj <<
+/Length 3489
/Filter /FlateDecode
>>
stream
-xÚ¥]sÛ6òÝ¿Âs/•g" Aœ>¹±“K¯qîlçz¶´YœP¤*Rv|7÷ßo»€@‰R’¹ñŒ ,‹Åb±_<ð'ÏÓ,ÊŠ¸8Ï ¥B¦ç³Õ™8„±·g’q¦ibýxöý›$?/¢"‹³óûE@KGBky~?ÿm’EqtÄäõ‡›7ïÞ~¼½¼ÈÕäþ݇›‹iœŠÉ›w?_Sëííåû÷—·S©S9yý×Ë¿ß_ßÒPÆ4~|wsE‚>GˆÞ^¿¹¾½¾y}}ñÇýOg×÷~/á~¥Hp#žýö‡8ŸÃ¶:QRèôü:"’EŸ¯ÎTšD©J©ÏîÎþá £vê¨ü¤ˆâ$‹GÇ
-ÙCðbs!õ¤]Ñ
-'{™aÇ*(¶Ìçu‡éõ í #V Xš—:]õèç>X=äräDYé©M"*;lBi=¹GBP¹í—í¦ê_³33¾}бwqè–d· „÷­›ÄÄp°7˜阧jnš™qHxê–Î’AîÂXZÝØžvç”ÄOŒµ¿ê
-úUo¡¬kh¨Â_™}ê<x§;dêðÛõrRÙ¹)Ù¨Ô™ºª®pð…`킾 8xC$kš¬…Å°vÍØñ”Ž¾8Þvl<¾ul´ç‘§¤#)‰ä®ZUu¹±æ_)Ç
-6cË,qƒYÙP£ÜT+87è™ÕÚj¸JàdænÞï"MK탫léõô%=ÃÉåÊÀ,Iઠ«Ð„‡­æ@(V¶E&n͆ñú—õžð¬^aãòæ× )ådOx´ÒMkUEÝ
-g.Ž²¼Œ"RqîŽqMþ#œŽÖ¡3‚ÆSYWó²·Ñ*tŸA/¨U2Ge 1HS’Í–“d휉´;¬œR+XXMáœf§‰‹ðm{$>M覤îV
-ù&¾‚HfC_ww³æíª¬˜Ðð.ÂtkGœ¦ÏtæƬMלä¨Bùûô'—C/³‚' ÇÊÕ.Eò+6ífUÖÔö¦ø<}¢¶´  ÔfÑÈÓød8‡Û6•è ¸+3ç‰N4‘è§äÞÎZ6³¥àEη:¨³²µAÖ±MyîꌖG:ÆwÈ%¡\‘ï&ØPaŽ-‰²5<º]‡Kgœ ˆœsœnøb6âÃY˜f„q
-o ]‘T&
-H™”ØóH­«Í]ÙçÌÛEÿÌä^ˆVÁ ³äœ³1û‘É.|éýÀˆÔðUHëäÔõh€Ž5´øÂ=°NÜs‡eíA70>m›©ù\õ‡I*šÛBæÁc01¬ƒØz‰rÁ50,Á®Ù[a&OÎØ@ÅC»CM(¨Ý-5MÃ5WöeWòqx¶fÕR­QBòR~r‹3uƒ-=HZˆj#ü„Œ‡*Åï•'µ|­÷êá~(„JwOn¶m6ÀÖj•µêƒÔ`± —:­!Öq}ðXÖ™fª®¯f‡%10‚™*ŠÓË{¬‘õª'Q–€D ü‚O¾*ù)òƒ'k ºo¶ïŽ›Kž‚A‡=ÿBíE!0øð2F
-é"s1À@S&7ÄÏ+wum
-)­¸}\ö4àæãû1~Å¢pÑç@|ôX5pçqCˆ<£á 런Ţ7Ž]Ùr›W–ü‚#›~,¯1Œ3ëí#±ÂDŠ/+1 [–/¿µ"Ä>ŒYt[Î’)>´Î` ×|¤{–ÌÃ(¾ÇHÐ
+xÚ¥ZÝsÛ6÷_¡·“g*š ~Ì=¹±’K¯qz¶Ò¹NÓŠ„,N)R%);î_»ØER”ÜÎ%“X,>¸ûÛ/PbæÂ_1SÄ^< cßQ®P³twåΞ`ìÕ`ž…eZô¹¾_]ݼ—á,vâÀ f«Mo­Èq£HÌVÙ¯óÀñœkXÁ¿û|ÿþã‡/·×¡?_}ü|½ð”;ÿñÇ%µ><Ü~útûp½‘ówÿºýiµ| ¡€×øþãýQbzœYôaù~ù°¼·¼þmõÃÕrÕ½Kÿ}…+ñEþ¸úõ7w–Ákÿpå:2ŽÔì:®#âØ›í®|%åKi)ÅÕãÕº{£fê¤ü„ëx2ð&è‹ž
+¡œØ­ °ÚjPºÏ÷I»-“éEójCÔvË>ßØèúY×DÌ»}cÉé¡ÎÛW¨¯¬ïHƒmEä—­.‰’—M[_GóCÚêŒw`¦¬âí¤¼Ý²û¢]Hß‘®¡,œX)ϼZ]f)ÚJy
+d€…îüã†æ•UË ìuš£töQHÐÈô&9Ì—ó`
+©œ@Ä!ïBÎœ GŠ¤D€÷70 <Nä‹70Ùç:ÉŽ‹0Ù4yU.ÀdΠÒóјåå#t\gàà("7ÂàR
+¯‡Kì!.ñÙÚa‹Klç%â[/Û<Ý2§%"™/¡ÇêñãjñS^›OºÔub0‰Ýõëò¤r·Ó•Qí„F2À—bÐM¶#•7?4š“{ø`®AÔÁ§9ì³¤å ‹b
+Ó^ùGL"0˜–J¦qêÓ2 Y¨0Ôa'ä×b> k_9®¿CÛÜ<'õM}(oŒnX¤èw'N(”r|zÃ#~u•û¨Oàf{xN,…@ÑXý4£ÆCw–}Ñç?…ÝɪxG¶O˜àëEŽ?râXÈÁNáo¹Þ8ÇéjxÔˆŒçI‰àóÚt¦}R·yz(’šè¤2Èò&=X{l(@G†SH‰0vÂгò'D-öU‘§Sê
+@]lZàÝé²ý‡EEÔÇžVßb¯¨Òd
+¡R:nìZèT{#t`CK‰È9µt°»Ê„ö½y »„T†„d]Zë ó†Z´šæ
+mŠ/€¥ÕM ¯ðOè=Á˜áИ7D2’<q¬!òší6)í9‡œLü%/ŠQɾÖ6%,¸e²x¦Õnw(óÔQH0·
+êþ©¨Ö / ¢?|¡Ïuß(Âû\n¹ÌåÀ Ú-2ýœ§“!! ÀÌ/nßqMì? !€fx
+9i^}®óA ã2iN­7º®u¶xB$žDt¡äåý;®‰ £@è(ÃۉƗ…^l 2’ó"oèÞØÚ×½¦"ü–Lb
+‘ž'Â{™hŽNZfOˆ¡ת1 ””Z]YŠeYŸW;jÓ[ bð6/2â;ÎÎ[~64B÷p8©xI^y}Z0Åö ÍáZ]ïòRO]ÄA‚Ãn^*€y¼š6”nFäÐ<&¹Ø#yA£ÿòØgp@‹Žohõh¿¤å2ù’š?~¾%–Þž J@€‚Ë… ¤p=OÞ*kx^‡< eî^#²=ZxfíF…1ôwI ç4°†^„Ä5rKc€é}š¥kb ¦÷!i„Æõ`?·óz–9eá|#
+̘oì}ùØ1^Ç–gØ^¿öNñ)'0ɨ‡ü™Ê-cÀæ–%²©÷‡v[ÑO³K-°CU“kÍ (Ç—@z[ÙI¼X¾!‚1ëøëhô2eª-jݬ³e’5³Ö¤wîˆ^low£ÎÖÆšR¾šßšåËk¶æcPòâ£UótºŽ(æ@¿¿aD7Âñq»È
+Ù‹‡Ëòý~Ô÷Ò¼üßóÒ\ÝA?··>‰É?©$i˜–nuú{ӑߙܴÝ]ûxrtyÊÛ×a>¹­s9V¿ôÜå XÌMà-±'a«±^»BÖšMŽ]v6ó]^$µqþ¾o‚M81¸p1§Ó %Eo‹¤Î-WOiÐÓ»½·_ù2;³ª²¢ö‰›õZzÈ|úúÈÉór0<ÈA&TÌ.s ®ŠÏÍcŽ}oïáûŽ áÝW'>8jÇ-J&=¿ïÑL Bc{ Ï§õéÓ‚vž†ø ónù•>Ž™ahþˆ_á~!~yÄÿyOªð‰ûÓ—Çå—OØ¢’ |ihòKjYJÉyìH |W@pÎýØO*¡7‘îÃ?^êÿþ!àñW’~èÈ(ò¦ëH?‚EøPø
+*:-˜øƒ§Gÿ—âƒhendstream
endobj
-1285 0 obj <<
+1660 0 obj <<
/Type /Page
-/Contents 1286 0 R
-/Resources 1284 0 R
+/Contents 1661 0 R
+/Resources 1659 0 R
/MediaBox [0 0 595.2756 841.8898]
-/Parent 1282 0 R
+/Parent 1644 0 R
+/Annots [ 1663 0 R ]
>> endobj
-1287 0 obj <<
-/D [1285 0 R /XYZ 56.6929 794.5015 null]
+1663 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [80.6033 659.1254 149.9876 671.185]
+/Subtype /Link
+/A << /S /GoTo /D (dynamic_update_policies) >>
>> endobj
-354 0 obj <<
-/D [1285 0 R /XYZ 56.6929 333.8409 null]
+1662 0 obj <<
+/D [1660 0 R /XYZ 56.6929 794.5015 null]
>> endobj
-1072 0 obj <<
-/D [1285 0 R /XYZ 56.6929 308.7186 null]
+1659 0 obj <<
+/Font << /F37 1018 0 R /F41 1208 0 R /F22 953 0 R /F21 930 0 R /F48 1228 0 R >>
+/ProcSet [ /PDF /Text ]
>> endobj
-1284 0 obj <<
-/Font << /F37 802 0 R /F22 737 0 R /F41 939 0 R /F21 714 0 R /F48 953 0 R >>
+1666 0 obj <<
+/Length 3661
+/Filter /FlateDecode
+>>
+stream
+xÚ¥]sܶñ]¿â&O§™ ‚ÄíNgYN•Ä²+«ít’<PGJbÃ#/Gž¥ÓÿÞ]ì‚_âIJk?ÜX,‹ý†Â…€ÿáª@DI¼0I(ªÅzs$·0÷íQÈ8+´b}suôæCdIh©W7Z6Ö†‹«ìÇåé_N>_]¯¤K¯”ËoÎ/ÞÓHB?§Ÿ.>œû·Ë“c/¯Î?]ÐðåÙ‡³Ë³‹Ó³ãUhUë%S8°àÃùg}{yòñãÉåñÏWß]ugž7ä×£‹ ŽýÝ‘¢ÄªÅ|ˆ L¹ØÅ*
+TE~¤<úrô׎à`Ö-“ŸŠl ¬43ŒÃ
+îç«,ÿêƒå}î›Üì›|¿ñŸÿyçv^M¶&ir$f àϪ#­†XN*2œQ« ·ÌŠ&½.óUZÞÖ»¢½Û4SB# Øϲà‘fXË1*0ÖFcÞ o:^¶wˆ–Í6_? !óŒfÞ_|ùrvJ“vÝ\Úòo•Âu^Ö/Q¬ÒMvE|Ü—m±¢»Ñ*°±ŒÆj±av"ÓPaœ  s"k©@´¤iÓ6ßäUÛ¹¥»ãÐ.sþ(áy†,†bùÉ)"ŽÓ‰
+ê„| ôwFô;Võn“–w®ø>!4ÐÜ]ÚÐD™ß´4ÔÑø%¤¹}ÕîŽírß´yÆ;"ÝhBÃMŽ®Ôã¯Òj}G2•UK¶ê­:¯2"ë‹òÊ
+:l·¹W`é”\HŸ¹Œsdä.|!×E•@~.c ¥ˆ¿ºwsÑ3Ðõi=M6C%Âøy,2pXÖ)3ßÞ¹2<§€4i×:Wƒ‡œÕôR”H&cU§;‡”$°I¤Æwþœ@z®bÍ@&lÒöf0ä ‚”ÞØ?dX„ÅzyBä×õö‘èc(ÆÒr
+LlM§¸¤ÆP-?ŠDX¯PMÈ“ãüž4,Œ}¶ ¥ÖoˆRÌ]k( S¯»W$2TC{ªUÍÞÔû
+=xoS08V|@'…„¿>-›šqëͶ SCn+í,|$QpD¼—Ü¡’$ÒcyÆëI=6µË¼|,\Ð1zé²Nƒ¾Ò…
+k¶á8YµÂ›5@ézoç„t¥jò]C®îµÎyÔNF&È K[!æÏ,EŽVzª¹TÒLj§‡v»vý +úþ…¥*ä8\úÔX8‡ŽCN×߀ä”ú†®«¥¨#IÁ(æj HE‡ª€ˆHbÍm,Ž
+é̵câçãV»seôêç´`KÖû{rzÓj#„’Wyg¿I«ôö0=š‘Šžt|¹¢œ¥¯
+mËçqó¦Ë_Æ&ç9Éf»=§ÿ‚—½öÔA+ôaâwé=ã•yuÛÞñ0µìÅ2’ìLbáË€Ò xÞ¹ÿ+– ï—2±­O›.?œò¡äl¯ñ$Ë
+¼_Ü4 f‚¯ôv 7.Î?ëàäò3fä'„B‰%ÎQXEèš[kZ™MP¿¯ï„Ø‘txª¦ßÁ ¡¦4Ž¶WPkdRÑÏ5i! N™ôRØH=bÕcƒý°oë*£ÈÅêäýûËÄöM‡Û<V@®)~wçâ§'Ï(uÅ$Ô9£€swŸïæBÔ¢QWeâÕÏø:(üc­†V¶n!dÌQŒ›aEr½7HØO$Ó]:|áçj茧ø,æç\l
+–ŸŽ±DÞîwÛšð‹?ÖtžˆT& ÕæNÎ:™ºq—c¥]Ó÷5“íþ¾f‡Éò¤z¤áª®V›´]ßu„§#w¶™2vÔ7w=®ý®on=IGë5Pì4»Kt(ܬ±ÛÝOúf·‘•w·³æ„z‡Ïè†
+KÕ©–sÐÄfÝR"§o0Ú7Ûµá×=4<v‰ Ó+œö €
+'ph—%¥UÚ?ãÃpW~Ìå—6ã‹À)¤ƒOW*Y~óÈ]*h=}-C—„¸d@æCR
+ø6«&Ï‚¿SS‡þ^WE³õ¾èNùÿ-iÿ‡¶±/jå|ã :°ÛÄ@%Sλ?:}Êú} ûendstream
+endobj
+1665 0 obj <<
+/Type /Page
+/Contents 1666 0 R
+/Resources 1664 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 1644 0 R
+/Annots [ 1668 0 R ]
+>> endobj
+1668 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [278.4002 485.7209 280.3928 497.7806]
+/Subtype/Link/A<</Type/Action/S/URI/URI()>>
+>> endobj
+1667 0 obj <<
+/D [1665 0 R /XYZ 85.0394 794.5015 null]
+>> endobj
+1664 0 obj <<
+/Font << /F37 1018 0 R /F41 1208 0 R /F21 930 0 R /F22 953 0 R /F48 1228 0 R /F11 1442 0 R >>
/ProcSet [ /PDF /Text ]
>> endobj
-1290 0 obj <<
-/Length 3312
-/Filter /FlateDecode
->>
-stream
-xÚÍ]sã¶ñÝ¿Bo•fŽ ñE—‹}u¦çkg:i’Z¢,6©ˆ”}î¯ï.° A‰’®éÍôÆãá
-\»‹ýØ$?6Ñ*N„‘“ÌÈX%LM曫dòïÞ_1‰<Rb}ûpõÍÈ&&6)O'Ë`.'Z³ÉÃâ—黿¾ýûÃõý,â*™¦ñ,Ri2ýööî;7bÜãÝÇ»›Û÷?Ý¿erúpûñÎ ß_ß\ß_ß½»žEL+ßsšáÄ7·»vÐûû·>¼½ŸýöðýÕõCÇKÈ/K2òÇÕ/¿%“°ýýU £Õä~$13†O6WR‰XI!üÈúêÇ«º ƒ·öÓ1ù)¡c¥y6"@β`™N2eâTpax»œEB«i»*ðïº"¨lÜ3wMÞ´Å®Gz3‹$3øau0ESìž=æK¹^ûÑjá zßf¾ûøp{ó³ƒw3¦§Åû¢!œ¶&\?O¿Ì:.ÜCÄXl”â–©_•,Še¾_·
-cÏHP0” _³hP/ý
-Ð(„@Ã\•Å3šƒ}uÏ}C}s#u¨ÍYóT^¶ : _&¡ÉâÄnsB®vŽà hUþT4oFW‡ð¥!ô„«;eOžÆ™éPnÛ¼iÀïŒÙšŠ¹Pì€B™ttIÖÓÞ.÷Æ*›ÅŒÁ¿tþ^V |ÖçàCê”Ø!ñ
-ßÄJi¯R;ø?;fäˆsrÄÌ18æICøˆ4¤`3‡ol¬À1˵ÑÉèäÇaâgn››˜wõߘ[Ô}4`:0¼7w¼SW©XkchÅ3J"c!D6Tœö_û†¢Ì¢lòÇuAÑÇ‹µ·Ó@288k|˜ø1Ü$‚MRðA@Åg¥~"3±fÊ S¿?÷•'$º')pß%0~+†SESQš0p“?‘Xró æIÈ?pÞli“  ½M½°I›Tç%-&œ"E¨I'°X&²#¬Þ¥…û9|ÈÁÿ&”¿dtü ¦'*3“³22x’71
-{&Ø…ࢊ3Ç€’¯Y` qÁÄ%A¼Ö,3¢ú }–û
-ùš-’C%™¥ý¿à±N©j lúÏ‹í¬a})¹õ­¬ÿG‚ÄL†ŠpÒ€ôÔŽzk‚ÿàú"iÀ j¦Ï·Ö$.-õoê¶ë²ôYJŸý„µáaÖvF`ƒ)'^"Ò²˜·g» J$(ƒý†Sv¬°µ:Ëtصô2A<J3È¥5ðfNôn )
-±Ž5×÷E;,ÛÈ/¢KŽ£´ ³Ôdçï°FV&Cà,®~‹Å<¤AÔ,Örª±ô0vËJ•[*úámQa¹°p/šr³_ç­Û*ß“D¬ú±©×…ÝwþîîG8&-Fûº¥··?üt}?ƒTöçc 6`@š*EŒ–8¨—ªÂõw°Ž©} Ìç:jDd]ÞÛ$Y’¤ö6À:³·ËîmÑÎWÑÓz_omŸBntvíkdñÁÖ
-[r‚«»N/Ou¿ƒØÌñc´GØÔL…S&Á¤G{P{J-|#`ª£äD ¾Pؽ·ßÌó}c5Ö Ö[ôê45–ô4oÛb³mÃn“v+R¯)Íb-ÌP'-Üh*˜šzoù`t^Û'vpûÐø\”‹ê/¯\ß j¸4¯«¦ÝÍôt?'­7ž
-r†9ùÄœ~Ãû¼o&XàèdhÔÊö¤Áy„I/8Ãë´ÁtX®FKľYEØtm¢ºŠšÕ¾]Ô/Õ!%B3—Üœ'¥Ã¡eÀl8 ‰ù‡;Ó‚ZbrÑ|Stç:ð¢øT¶{µØnŒ4¬(ŸÝ9¼ûñöýÃõý‡7˜t¯jšiQÓ
-æB,«êèË4*F^½RؤìáÇ®l‹æðЂJàN£FzþØ%eBvuó™=9tLÇ©‘¬Ï²FŠrbáBÀ‰Ž¥Ì.8å댎y,Û¡Ë‹õ"š¯Ë¢j’>‘±Á„à,Öf¡‚ìŠ I 3¸,í<3Â/9 –36­ÀE‘&µ¶çŒã›íºØ
-1
-§¶#çr7…ç»'“v)ùÁ2˘䂟 ±N[^‡e-¯¬ÊM¾ŽvTq{Ú („ |ž„k„†a Ncùà€ˆÛåˆð äœ:ýŒ°®ƒ°®2ñC)_§ô:¶ó •j¬Æ¡¿U—õ×´ð º…cPÕ9à¸r<§ˆÁtùžNô„°ßŸð:UnW5$å83¤ú®lX8
-î GÁ|áظqbPØhá'qd¹a·¢ì+Bán¦ñ“µ1ô4ëâÉöC¬ê f…¿mµ+øPVîÞØÙ¢t“¿v¡†nxÞª¢‹,y5/†÷¥úÛ[nÈÏ\,WŠÃÁD¢ä¨9Ô‹þ<áŒÙXgÌÎcY³JˆÄÑÜVÇ‘ŽÅÂpuž€k„‚³i‹Lè! ´c&èçì"„I}¬‚¡’^‘«H;«ëF¹xºe¿‹ò£:|ßIQæ»»·®±@•$9VS¡ŽŽ:ΧÏeíºznØj÷w¹`À59Þ;Ëik]ŠoÁëÐÕK>X(_¿ä¯ŸcWº2 ßÕ²¦žRs°jÏRrÈ‹žî»Ìñ±nWÃtÌ_+E
-nÞ¡vM›Å+H¶œS´Úâå³&>uóV¨¯ËŽhQ2¹xÀõ¹·rû+ËP"
-­OÜ‹ Ä
+1671 0 obj <<
+/Length 3076
+/Filter /FlateDecode
+>>
+stream
+xÚÍZÝsÛ¸÷_¡><"ø"
+™1-¹œXm™±–,˜ÏVç‰á|ºYÌD&Ýü›.‚¿t¯™I&Œ{)L°8ðRÈpÿŸ×h P)‘Še¸{?¯£‰ÁèWWWÙ›W¯^f&®‚3@'¹$B°,M¥Ÿ7[•EµmÚäÕÓÁZý9ëüþ¾˜¦ü!ìêõsÈÅÇÙj7/"új‡É¯^-àï‡?ÿ_÷d\±f·X”ã\bIF·Mó_^ÉþÁ%`i+­‚9)ãV©úÂ0€¦oêzUäôýý¶¬«æ
+´\#È>žUÆúÆ@…· ² v}Vð^äYžH³}q–eJÚÀóâ<QNL·ËLªR3¥ ™NgyEÄmA×|>GÜyrK×͹›îªm¹.húC™œ¬È8ãZé°è¦šÏZ‰¸àˆšÎ=ÓqF½!þy±*¶Q‡ñµ`¢PFô—"ræVfDxD•²Ìê,ÈÈ©ŸÞ, BÞ¼Xä»Õ–nÊfä,Œ_. ó«zì(‚"q‰c0Ö3­{ÅÓ &áÝv™Tçõ:/«K1 vjí–épñ!~Ó\êÁê£ð͘U­ÅO¡×õÐ+[ôr‡Ô$ œHm#$..Æä:–YnK„7·x²þš¯ó§@7Å–«+¸þûwïß]¼½¦»Í¹pÓ¢¹‡¸T4AÁ⡼傮¨¨Ò›‡bÓ®æ¡*´`Òº½˜YÕ7—A*Ûî =…;8Çz
+ pÊò¡
+o˜ªfù¶Hê*)>ÂŽr•e
+ªÓ:´\#J ö«%ÓNf Å á,Yû„Môcîœq<2<ê
+TG,ˆîšÈ¢ÊoW!
+Ï–ÅìWÜ-0Kø³-Öõæ‰Ø¡Xø5.¤£|<´Ç”áÌ!‡.Êãò®ªƒ[@Ä4ÐßO^…]Ä`ô}±µÖûó¼âÍq<hÀ–2ö<ô¸Nà!rùÒ±X7[Ͷœ–-βÓË·\#ë 
+%ÁÔ÷tð_VöNÂó÷Ñøù]¤4ŠYë>³‹œ$Ò¦ÐL)¬gB¡B¬íÎ!¡»ØwuAr¿!–Ìé,6´m哹PKc8 ÃÐmA×½ í(Å„è5¢Jê ~l»æ‡²xÑD¦Lp—ö
+¬y}¢+½y1e-“F?ïøY¡mpcÉ ‚épÂ]7D¶è5 *¿Ã·›c«s¦œ6ƒÕCnTÐEÙlÿü}Þ4wÆ|-eR¥bOCÍ[½´èôÒ¼Õ‹žP ­ù~¹çRüÖ]‡ƒÄÔ‚˜€Çö
+s ÝkSð¦â´Ãì\ôw$²Cq,ª†ôj8’Í æ„V-¼…òÉFG'·Ž‰7¡«äGÜMiÇRןänI;iØuŽ÷¢{qvhÜ4eÎe±*=Í”RvûÏ]²Ì¼lðasX¸XÆ¿³˜õà5E¦àЙƒH—Ÿôõ[Y(GEš ¿~ÿ¾YQ^ì=ªÍã +qÆPT÷”@ƒ~Íù™e”ÝD*ÊzxßþÔs_±éô´™Ì&%£#\Â*{ÀÕųþ¡h+ñsݤ¯ÿÿf4¾Vw.û­¬ ”ørüÕUkdÍO9ùžPˆˆü½B?®@áŒo–Ç¡ý vDAÔ¨ñ:µ¾¬í¾(B±iÆ=c<éð—)úÄë5üˆÔUr­y:‹=~Ùo-ÕSâ+6I©æSá¯+´“§«…¡µF`uÊZ==¾bkqÎ 7úkqpºL=“ðŸÅÖ '$5Ò¯ÛXÎ1“
+uÚV™„úÍfÏ$ð#¶ú„xÕSâëµ”Å/Fœ¶”ãLºÐ6†’ù÷ì„'ö”ùRë~±÷ÿ(‚ð³‚3ʘB~½á“gõS¨ØýŠS[¨þœ/”¤…2Ä)‰¿"Òñ‡lüðƒWøEcàê©þ_ì¶Aendstream
endobj
-1289 0 obj <<
+1670 0 obj <<
/Type /Page
-/Contents 1290 0 R
-/Resources 1288 0 R
+/Contents 1671 0 R
+/Resources 1669 0 R
/MediaBox [0 0 595.2756 841.8898]
-/Parent 1282 0 R
+/Parent 1675 0 R
>> endobj
-1291 0 obj <<
-/D [1289 0 R /XYZ 85.0394 794.5015 null]
+1672 0 obj <<
+/D [1670 0 R /XYZ 56.6929 794.5015 null]
>> endobj
-1292 0 obj <<
-/D [1289 0 R /XYZ 85.0394 625.316 null]
+466 0 obj <<
+/D [1670 0 R /XYZ 56.6929 636.8504 null]
>> endobj
-1293 0 obj <<
-/D [1289 0 R /XYZ 85.0394 613.3608 null]
+1361 0 obj <<
+/D [1670 0 R /XYZ 56.6929 609.3387 null]
>> endobj
-1288 0 obj <<
-/Font << /F37 802 0 R /F22 737 0 R /F21 714 0 R /F48 953 0 R /F39 899 0 R >>
+1673 0 obj <<
+/D [1670 0 R /XYZ 56.6929 172.736 null]
+>> endobj
+1674 0 obj <<
+/D [1670 0 R /XYZ 56.6929 160.7808 null]
+>> endobj
+1669 0 obj <<
+/Font << /F37 1018 0 R /F41 1208 0 R /F21 930 0 R /F22 953 0 R /F48 1228 0 R >>
/ProcSet [ /PDF /Text ]
>> endobj
-1296 0 obj <<
-/Length 3798
-/Filter /FlateDecode
->>
-stream
-xÚ­]sÛ6òÝ¿Bo•g"Ÿ8÷”&N΋sg»3½iû@S´Í‰,*"×÷ëo Pü’äN;™1A`¹»Xì71ãðOÌLÂ’T¦3›jf¸0³üéŒÏ`íÓ™0‹´èBýx{öö£²³”¥‰Lf·÷\ŽqçÄìvùë<a’>ÿåêã姟¯ß[=¿½üru¾†Ï?^þë‚FŸ®ß}þüîú|!œó÷ÿ|÷ïÛ‹kZJŽ/¯>ÐLJH¯/>^\_\½¿8ÿýö§³‹Ûv/Ýý
-®p#ßÎ~ýÏ–°íŸÎ8S©3³gxáL¤©œ=i£˜ÑJÅ™ÕÙÍÙZ„Uÿé”ü´qÌHÌJ3ô§¥,˜€¬IY¢¤j¥,Å””#Jy]5åýËp³N3•87ë"‘@de‡¬K™‚£ï“½¼G’o?jלIcSÀŽ /EM0=lR0#Œ 0¿qÛÇâ|¡àˆ—Å}¶[50'ÞÀŒ³óW700éüêËíåÇÿØSQ×Ù ÷+Ùö\¸yÀPë†FÏÅ:
-NYG‡ËÐOñBÒpê«x,Èâ6Zé ›
-ÏeþHÃ<«?eCÏ
-tc .¦>ÆÍã:}Í¢­£ø]zX\‰e­î´,¢Ó–Éü²¡Ÿ«ÝjICÒjéœÇ\äèÒ·/ôŠÞ —›Ýv>¹Ç“¿Ëeà(ž —aµ ólW{½‡µz•}/ê¹WbºçÞòmV?²Qž’©LÏ}<áê
-&PyñÙB`¨Åçõu]4ôuö•ëº
- Š³øIÈÜ$xÕ˜ûá8¤ôâÕ
-ž´6JHIÙÎ0 `21ð·ó_®/?]^ap¦÷, /›>±z·ÙT¤©ˆ¿"zy”Å<óB’*Zí> ÓŽP¨
-ê×z¦0ˆÑ~o]hoXˆ¢YôNFÙ
--Ž»§.ÔaÿÔBᦶE¾ÛÖèf”S¶\Úã”#ÐåžsâšI§û”ä‡ÆqsÔ9K•tŒ «|©ôj
-ªñýÛ®ðq†”^ÀDÝÔ²~À›¶ X<Q*Ûd?y&•AJ DB,pÚkL.Ó´"’çjû5dËØ°ƒª"2WÒ
-ݲä6yU5JpH\GÑ4ÓɶŒó¥m礛N’ …m b—1ÞÂ`C;ÿŽáŠÊ¨å…4j߬J€ðÎÔÌïý7Õ½=vá%™/³&›
-žÓ´Z
-?µµ#Ú¬CÊrt=ªúºÛÔ¡»)Šzêj²ô€ìÈɨ‚÷E“?.V»©D;¦Eô¥ÙCÆžHG Ðá
-ˆ]Ì~SIß’K`Ï3e$KdêhSUHÀ_Î%Ÿá¥|Ú¬|¿ äöá~Féèèu’Bºx»Âýkç¥à ’”ƒ“Øß¾ü5m‚Œ‹9‡†$ 0)’㎊2`LÉãž±…B‰‚ËX”ËŦªV#ÇÈ!gàÖ̺hÇž1B©«´g‰p ¸Ñù[êÀ‰·}2wš»««UÑLÅ›6É ƒ8ºËVÏÙKÝÖPU¥Zx9; /?„¹Nö€ÐEs0^IKEÇÑcé
-lÙ:— z–á:'£¤YøÅ"Ü×ÁÌ]V—áèî%Ü !Õû—ÝqP­ÙéÔvØ#˜ `œ1Æu¯™&:ÓŽAš.Ntƒ5XŸvZ±Çä¯ÈRŒÀu¼îpˆ‰-uËÁ‹ki½Oߊ5vžåØŠ¥fDrðÂÀ;èXì—9}D§´K+¦S©»m~»Öø]Ð) ¸Ü=mhäôF­…–ˆõ7_«‚&÷½z'‡zÜ’C¬å"íÈ´ø&*/x‰éz*Õ¦×I›^Oe%RùÄÙœ¸œmÓ„.üÄ•ùkïj–~Ö _Ï
-¼L­íñ3ö7êcl“™Yë`Aೌã¶uÄÅF¨6ðýØ’hDî8á4&Ü‹yi‚7/¢O˜Bž²û«·s‡C^*™Ý—¤Ö·c”ãÔ²DëÂßYºÁ粬³;Tu|¹üåãu9£Ç&Û‚ïVÙ–‚óP<À«¿á´ñ÷ ØñÕBøŸ²Ð[†t
-ûÜl«ïårVC벶Ìàš-4A‡¿3€šUƒÓ‚Ê}êG|Ñ…Ÿø½Áë„]I&Üp~,I„é±3Ò´êcl¼hTÌ÷øH lhþj±´ð§8á F35JË…÷ OH¥…:ÁÃÛQg>sRŸh?t¡;›jJ‰ûýH ØõQê-Ôù~Á Ú˜@1Ø£ß*@³/¯ë|[vÌ¥ºŸ0Äü–ÔÊ“}ª24?ˆ@ Mo£Çì/ŸØòïk-P &l÷¬&-0B`cŒí¸®)É ‡ü縮u ŽèZ„¢n°¿}˜Ö5õ$@§ÞBMïëšfÖ[W—þߣkÃ] u ¼°yX׬
-ÃcNœ{ u‚1¶ãºÆA5]bNèZꈮE(¤Øl‹¬YäTeõ¢Þdùødž2…4(ÇÙh¡&øè)ÒÌHnúŒ„>‚û
-0…çÕ-=ýÖàùáË žüíݺùe
+1678 0 obj <<
+/Length 3726
+/Filter /FlateDecode
+>>
+stream
+xÚ­ZÝsã¶÷_á·È3' LŸ.ßÕž¯ñ9ÓI“<ÐeqŽ"‘:û×w @¤DÉÉ´ãñÀûõÛ%Å5‡?qm4ãÊ&×™M˜æB_ë+~ý c®„§™¢ùêûÇ«¿¼WÙµe6•éõãr°–aÜqý¸øeöîooÿùxûp3—šÏRv3×)Ÿ}wÿõXúy÷éþý݇ŸÞÞdÉìñîÓ=u?ܾ¿}¸½w{3F ˜/ý
+g&¼¿ûÇ-µ><¼ýøñíÃÍo¿º}ŒgžWp…ùýê—ßøõŽý÷+Δ5úzœ kåõú*ÑŠéD©ÐS_}¾ú1.8uS§îO
+ˤµÙõ\%̤°Æ€ê„Z!µQpÛÚ²TIo[ÊÁm í$½ÎTIânû¾íK:¿Ê{j5ív×Ô¾ÿôx÷þgjo¶7ÂÌڢ캪y¦¾ª süä|‰D˲èËõ<½à3bÀŒL4KlšÁ E•×»§2--3Yf<;‘g\ƒâdÎdD2­žh>¤¢ûSÚ¨pÇeþ¥œW¿ïÊíËñÞB&RÒÅÍ#ÕÄî#é$Š -Æ»ß5p…Fõ7É̼_›€´ÜÍÃX»é«¶¡Ñ²ÉŸjwï0ÐUë]÷$*xîW%QµO][—NîÐýÃýgjÐ!Eÿ²ñ£w?þ¶¨²ÙÏ7BÀˆ æ·*¨˜äN+˜ÕZ:æ›òk¹%X´¥×“Ázî90Ù6ge›¦–e™’—e;¤:/ÛHåd[öÅjþ\ïÊSÑr˜ššË{Gª‰ÍG¢U oxÜý‘$˜šƒÓlû¼ŒàÂUªH Û_<´@œµ$f¸“«2*õæ28à<å|öR851“2¥Ñ¹9E¾ëœÁ¤1ÀUWnI–ØÙÒoÞ÷åzÓAèt;’J@73ÊŽu‚x‘ÖÌœ/)»vçŨ·hÝΪ§ßEµh¾óíUþÕOٯʆZEÛtýöÆÌv…×zÎ
+Æ­ûôi¶%g‰Œv‡"œØÞB,ÍB,Ý. ©¸™#œS—%™‰w5m \¿¶ž¤‚øVæ‹óF ,Þ|) ©.e rro»~Þõ€Óº¾*N232ir™H5ÁÁØ(Ai–Yp2ºCttPz<†Á_ ¿”åÆ»]AQ~gpDËvë§~%ð M<ì8%E`,†ã—
+˜ÚhYÛ¼ ‹
+NÎ7D½?[÷†žw]9U8€
+œH¨l¶íWÀФ°§VV2Iú:௞D&L¥ /ÛÛ€ê‚Å*gsUS­óz¾õYÆ©wÍ€CÄ—YˆT<ŒƒoÊ bÀwˉ˳€3MúB¹„r¡³tÆ Cn­gбm(Fèt”WuDâ}¬xVX¡ªkšÑ6õ õA&GÓlèHË廹‡é€ñ¬=ªRô«€8® ðžr0%ÆÉ"¦”,*’ÅŽúý•‹ab‹º©ýû®:d@ò+×¼dÏÎÆÐÓÔ峫8ÕWÌ
+Ÿ]† Ô£»‚©‚MÙä!]ç/1¼PÉîk¬ñ•!'Ù.±Ê×ÁR—G^Þϼš¢ŒG‚=(®“ÿCž¡2Î4W¯„¹!Õy³‹TÎìàDßyá²ÆÓ'˜²R_f RMp0:lš2•)3fÁKÌjxЦaÓ« «òCÞÕCˉÓuxÌëÚ°I?ñ:*Y 7Їꉎ×@”ïîß~¼%cÌ(‘˜A uìÔà¤"}­ZªäQ·Ó(è&‚*4B€°f‘û5œ DX£àuüÍ>m”×ûü¥ kl+J½p¤l–­¯#uG»ŽtT¸q…¢ˆŸÚ~5†`ëÀ¶/»@’-#i,Ô,^àf«ÂG« øÌçÏ)²HYª¬}E‘T9P‘uõ˜7ë¯,Z]Þ7RMl<6ÖŒ¥6MÇ;O ÁÄ
+]4¸}¾¦ÆÃP.~>œ0!—“u‘¯Ï¡ž‰¼%LœTç‡Ùš7§Õ¹@õ
+§«y
+ÃÕ‰·"XI¥MÔ‘csù[á0¹RI()&Ñ `ûPZL°nÛôúÇ’¢„b4õó§·Ôøè\kº õ"¨7¢“ÆÏw‡‡_W7<l×ÑC<üÑN§
+CÌ
+G°»½žHŸ1aW”tº(¾ì•ÉÏ„op ›—ß6uUTý—IÆŒäÙŸà2ð&#¿J¾'tŒå¥‹Á#ðR{à¤Mi‚æ‰RØ]¦3êQåœ@TÕI6ÈŽÑMßRb” czÞzÄÁñš\´ŒhX“oöê…EýLÈ ^Ö#¢É”³TêdgΨq1Òe8(Àˆ±—D­§’~]Ù1š±ÇZ80m\XBÄô›¸€2ß4ÓJN°æäR^,þ*wدªbEÍ«,®…ïºð ûv N¦»Ä $ìŠñ$㸪£siìùëJ3ô1‹è¶eJu˜¼owõ‚š>ý2Æ][¹Ä/rzgl [Âp¿Û6~
+U˜ý°am/¬Í¬ò£•ß0¾}„±®”ÚÅÅÖÓ#C*¶y·: »D†…(þJItHuvEªƒÎûvÞµùiA_æssyûH5±ÿ¸l˜@2b`Òz \—Á:ú6|¯%¹ñŸo@£X•ÅlZ¡q0¾Vë¨ÃAdnÙÃïÃCWö4;ÆTDèb"6\Ld~¶ûÞ„â¾K‡ø,_¦ª_£ ï'DA•‡ýtŽ,0pzyȤç>.cãìÿôp÷áîc4=ç~ñªoÖí6›–Ô×oi¿¢m° HÙ—TÁtã²OÊTJ‰’J=ƒ*›aJ¶vï:°ÛǸPðÓ³Ïíº‚’Šv¶j÷¥OÕ}ON3QÓ± K×øòÊÇxt';lú»F¸E¯±xU-
+Ó!mŒÔÎ&ð“4´‰óþ‰
endobj
-1295 0 obj <<
+1677 0 obj <<
/Type /Page
-/Contents 1296 0 R
-/Resources 1294 0 R
+/Contents 1678 0 R
+/Resources 1676 0 R
/MediaBox [0 0 595.2756 841.8898]
-/Parent 1282 0 R
-/Annots [ 1298 0 R 1299 0 R 1300 0 R 1301 0 R 1302 0 R 1303 0 R ]
+/Parent 1675 0 R
+/Annots [ 1680 0 R ]
>> endobj
-1298 0 obj <<
+1680 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [154.2681 743.8714 203.5396 755.9311]
+/Rect [182.6146 300.8791 231.8861 312.9387]
/Subtype /Link
/A << /S /GoTo /D (notify) >>
>> endobj
-1299 0 obj <<
+1679 0 obj <<
+/D [1677 0 R /XYZ 85.0394 794.5015 null]
+>> endobj
+1676 0 obj <<
+/Font << /F37 1018 0 R /F22 953 0 R /F21 930 0 R /F48 1228 0 R /F39 1151 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+1683 0 obj <<
+/Length 3742
+/Filter /FlateDecode
+>>
+stream
+xÚ­]sã¶ñÝ¿Bo¥gŽñA|tîìÔž¯µi:IhŠ²9G‘ŠHYq}w±
+o¿Ü]†"Ž‚›Û^Sí‡û«ÏŸ¯î/Cnb|üûÕ¿¯ïiH»9¾¿½ûD=)'&½¿¾¹¾¿¾ûx}ùëã?.®ûµ ×Ë#‰ ùíâç_£Å–ý‹ˆÉÔÄ‹=4"ÆÓT,Ö*–,VRúžêâáâßý„ƒQûé,ÿxÄ„Ôb†B h8‹Ó4^$qÊ´Ò20«aI2ŠÕ%7ÁªÈ;lë YQ^•Eíú~Û—<Ø–E ü’‘>fùKY?ä:{£JÛ•UåfÉóÝ–z³Ö•5 ÆA÷RÐ@[l_ ø8þ7÷MYwŶÎ*j5›b›ueSÀv´»ü7¸rÎÒ8´´–vëîËãíÍ©ž-—[Ä[´n°jš¯»]‚‡¢ppUÛàœÀB>`!ך¥F(@…VE—¿„Ïð…`‡ìV†)n¸Ížš×‚Mä…³„s½H8Ì+sb (BÑöò9ýðPˆv»Ê…ŒLؽm
+~Œó„E\Ëóè{¨üÃõr¼O=&à¡è:+"2J`ËÖÕw•Ì Kt;Ž½í WEú Ø[Ià ól×KAâé%É!´e[ÔKªÝ=PIò7¶\¶ôiV5žè}Ù½Œ&N‚‡/W6þÖ
+aÈ…f\%éXWÍ–$«.žAx_½œÕí¾Øzñ{|qÝËb•íªŽe;Ã+JœðÔ‹WÝÌðÊã'‰ðy{ ÁŒ0ú[¬•4Öøšyk¡Œ0éøô\ô]s¹ªÿb<Uè© uÄ™ ê©ë9 V-a kb¡!1è¦]ëÝ€±VÜr#b±ìU÷Ëe¨yðÿE01ãléBó˜)­¢^ü¶à,Ri* hP·k=ðÀv|w»‹O ¬h1\”›8Îl¥Çª$ÁB+¹ÐB€AÆÙE5(‰ Þ.E®Q®7U±],]GM¥sfPK'[¯tÊ„IÍbÈÜ?·_6B§àóƒ«úsÒŠ”ƒŠ$À0$<9oãD³(æéyëØC!GÁd„å2Ü4M5±‘aI”Ä‹á´SÛ衦Øe:ÒDØP\èý£5‡¨âÍýY¯îÔ÷Ô6UÑ͹`›ŠµéÛIð’Uûì­õõªÉ³®pMðäÛ7ªÞ~r}+kÄšµû€
+dÍI¯«˜ÉHèwöe
+ö/eþBß¹  Xîà<°ÞP6dM
+–äI¶{IŸÎ
+n·6„8Äûý"¶„nÞéÀª¤Œ ä$¸Ùˆ7”‡G)S2±‘·Ïέß­‹‡‡ÌX—ɼ烯0œM¢s¡$ÈØ›!‚‰•ë¡Þ¡c:ÛlLè­¶J 8¬÷$C¨Ó¦½‡ê]îïàkŽ§îÅÜœG즈GÞ6ÕéI>FLÎV&iïl±Þ÷v¶©`’­NôñDÁ[³£ êÂ
+5Ô¬ôC¹,ÛìÉJ=4nº¹gTl²-ˆò®Ê¶4akØtl&žŒ<G ʨ8‡–›Ö)"Ç‘“²†cÇ:;ˆš/çÎĹun¶Ík¹<ìÕ±‚:£¼M…/õDáЬbA§ãLnøŒfyðp?#ÐdzÎè•`ÜS#Áúƒu‹GäL$­‡z‡Šélßjp¤6,VÑ7³¥‡¢É¼Æ(&'8@ñWz¨wh˜ÎvÞØÈõR¾clPgŒ‡šâqò ³½>‹½‡šA?öð NŸ#ü½
+oAŒ$¦ÂØ*Ë˪Ä3-µ«&[Ò Ì`ou “NñX£#”Cm7I¡âǻ۟¹oph[/YèѽÐþÀB(CPP빨ñ–†dÁå. ;såÝ#•viP~úò@•µ½R*ì“ n¸!¤¨|j0+5G%ÔNí?O(Ùùû_Ïì?ìªéS[ÎÒ¯ç;·„øIÌàØ•þA)¯d(…Ñ:\.B2påGLJºØWeís†Y¿½Ç¹Å</6°Óü•ÆòÈÍe7ËçšnMŠåi[
+‡£Óô[:€:cK=”½Œ[.K$)«ÂÕ¶Y‡Ù®{ùÐ_Ž†rlj™1¸¥DšóöP3$ŽO2–ù|L£O¥Êñ¯¥FÞÔdL¤ÒeYRL ½d¯¥=1âG+*Qãl kl¶hðò‰F°(ÆHo¸ëÞ+YŸ¢ÆwUÖà
+\Ó‡£‘¡<Ø•0ÚoòQ¤j;{ãA76‰ ý.mOÅœ`XVQš;¥$5.7j»|>Ý /< „RóæHUìhŸj7ξAßð{ã“üi`-ø/Çä¿ ¯mÖn´-»]æÄ>³1M]vùøî†`¾Üb&ÉÞ&Hzî
+q#g´
+¼›Ý^k³ÿ€ªIŸhÌwÛ–>˜d)œœØø±â°{å‡(iÛÅàQÅ€‡ÓeϧH˜´Ž“£pø >ÃókÕ<ÞÂì³mM±4Ö`ÿ²çbV˜ÎqCf¸ö'‚ùã&DºâÔK‚„qÝÛÇ,‡h’xÀ•U^ ¡B,SÂÅÖƒ‘¶ÎÕ~:RLå™tóÄ“g3…—®3'á¨
+ï<Uö­¸˜&ÜËéâÿ ëpendstream
+endobj
+1682 0 obj <<
+/Type /Page
+/Contents 1683 0 R
+/Resources 1681 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 1675 0 R
+/Annots [ 1685 0 R 1686 0 R 1687 0 R 1688 0 R 1689 0 R ]
+>> endobj
+1685 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [80.6033 237.2629 144.294 246.4782]
+/Rect [180.4479 508.2615 244.1386 517.691]
/Subtype /Link
/A << /S /GoTo /D (statsfile) >>
>> endobj
-1300 0 obj <<
+1686 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [265.4578 191.3384 326.6578 203.3981]
+/Rect [265.4578 462.9269 326.6578 474.9865]
/Subtype /Link
/A << /S /GoTo /D (server_statement_definition_and_usage) >>
>> endobj
-1301 0 obj <<
+1687 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [367.5441 191.3384 416.2908 203.3981]
+/Rect [367.5441 462.9269 416.2908 474.9865]
/Subtype /Link
/A << /S /GoTo /D (incremental_zone_transfers) >>
>> endobj
-1302 0 obj <<
+1688 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [280.9692 160.0192 342.1692 172.0789]
+/Rect [280.9692 432.1776 342.1692 444.2372]
/Subtype /Link
/A << /S /GoTo /D (server_statement_definition_and_usage) >>
>> endobj
-1303 0 obj <<
+1689 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [277.6219 128.7 338.8219 140.7596]
+/Rect [277.6219 401.4283 338.8219 413.4879]
/Subtype /Link
/A << /S /GoTo /D (server_statement_definition_and_usage) >>
>> endobj
-1297 0 obj <<
-/D [1295 0 R /XYZ 56.6929 794.5015 null]
+1684 0 obj <<
+/D [1682 0 R /XYZ 56.6929 794.5015 null]
>> endobj
-1294 0 obj <<
-/Font << /F37 802 0 R /F21 714 0 R /F22 737 0 R /F48 953 0 R /F62 1062 0 R /F39 899 0 R /F14 740 0 R >>
-/XObject << /Im2 1051 0 R >>
+1681 0 obj <<
+/Font << /F37 1018 0 R /F22 953 0 R /F21 930 0 R /F48 1228 0 R /F62 1352 0 R /F39 1151 0 R /F14 956 0 R /F41 1208 0 R >>
+/XObject << /Im2 1341 0 R >>
/ProcSet [ /PDF /Text ]
>> endobj
-1307 0 obj <<
-/Length 3849
-/Filter /FlateDecode
->>
-stream
-xÚ¥Ërã6òî¯ðm媈!
-“Ûæ×0ÔƒßÇ«Cãt(±ôà™¾º™
-ÈŽ4§Äã!ç€w<ÖÏ ?Wµ,°±K’dÖ5Q˜#…øÍVCG|Cì À‘_A±Ç¹®Ð(²¢“ÑFŸÎÏ„`
-.Å$Éê¶îZ”Nð…ÅS[mY4w… J$Ûb4ôwpÜY“»Ëô\¸3å„ FD^Ö-‘ÀáÈ_gkq¸=Ú“ \²ç/Ƕë*Û?Ž¶édˆ®êÚ›é…kpšËÕµõ“èÛyO;c«ê­h%
-Ö¹ê¬W=úYž*¾+€TÍTíg•û¢ìKöú=
- p¶âp$y×!èÅ¡ZE«ˆÍ¢ûÒqk×Þ¨•ÌF‡ßþÃ_‘ìÖ ®µs[íÛ®Û> ´1Ašå©Øí]ÛBTP‚¿´óY$‰É_('ÁÅ]ˆ¸ïKZöÁበXm•âù•ýªu´@k䙊dg<t†+ò÷PTµ'½±ýéÊ(SG;îBôëUÓžE]·CwºR‘šŽóS ýÈ­Làó…«[øc‡=ѪKÖkp«©óª3ú…9q¤1„–3]\>¬Ž×"º¨"`ø^0@ȦÂ÷lëÙ
- ‚¾4í¹˜}"“ PpÃ#Ú EõY–ñf:MÛs£òsdd*T@“°gølûMÚä‹S£=1,®Ì"áT&ÓFXÑ´K’:‚|…Q¶U‡^§ã ÄÖÁêcœ‰p1ÎnêˈkæíRØ 'èÔºjVF˜Ù
-+š›!6d DÈ l`Û2Æ+•˜0’:î8=·=Q>‹·™„ÐBƒdô¶!QÁÑ¡óãøÛ`˜ìšCâ(ÑÆìFÊÍ<òð³ÌꩲçIŒ;9ümßÛñÇ#꘭ºN8r%ÀÞüÐK¡Pa¤Æ¼-˜…ys®Pàeõ<©lx´eµ{y]ؚΚžl9œ:Žø`‘ÅM!LáâçŠ ÈeAÌÆ-ùÚæ¥l€ê±i½
-2D‘2d^zꋹÂFÝ>
-Dbqj8X€ÎÌ_ñh…éó[܈² S‰K –Nuõ+·¡Ò@%ÊÙÇ¢„p²æàXOU6rj fY¤%¸žŒÌvë©q˱bF¢˜ Ȭ›œU$q§šÈ
-kd]ûe8¢Å§¡¼ ”å[²â brR` ŒÈIRâË`“ƒžR.C•¬>tÂú‰5ûì‰Óã„ã^I©–Ôƒ‘4Š“ÆP{𼌥]V3ÃBÆog™PÌGb týnX–0ÎmÉÓ°ëiŠƒøO¤’€<P³ªPõž,8BßÇ÷ ÐBfÉšèØ
-çÂ:ÙÏù´…ÔÝ»?¡éhÿàWlž'Ôm—˜ŽÖÍ¢ÉÈ|NìycŽ´CÌ_ \†ã¹ðQùÐ;{:5ÅO
-%¹;B¦¿cdN„ÈOœÀkî$áÈÅóQ'3ÊÒ©l†ÐvæBŒÈ ¶º¶ü‚™LÏ]©§ÊûH®– ÏxIT{‹²Ø…oaƇÞr{&V&ô²‡c(V2cºÇ†'å«ÐCÎ9ÌŸB6®øÝUÍcBk
-ß·gûÄqåWKÞ$Oƒ$2.ÈF¼]ôo^Š xÍ+VÕ¼À»ànb†]ͬ‘¢8G)…®Q!&¤b™]Õm "ÝR£p±#ä
-s¶"1Ä‘‚˜<èä”ÈsH±«ÔãÈtñÍ3à S #x«y
-.a\N(αºÉ±xHF@‡XÔ…Å˵v˹žOIµ7ùˆÆZf!ã:rä=!eQ—C]ôÎP~õƒ>³#_bÌA{IÖ,NcÖÑWPdͱ|”³g^0”uûøÈojR"Œ\‰0Š‰ÿèø_Pl®ŽAÇÝ ¶%”ŒbçUÆ"|!m­,Q²ÁFÖ§Ë9T}ï( Gß-¤+ûI[d‰Ž'Ýr´éŒÚ…HÌ tS‘Xôàß`IJè_†±÷rU/hz"ht[þnd˜Nq¾Û(ÀÛg°ñUÉhô,…Á”ñÏs¨SÎÖ¢f`ö¤i½Äˆsµ¥ 54ô”ƒ_NhøÇÊK}hƳâÍêÝÇŸd…F {h)3„6DÝp²ö‰œáêI”äô‰ô †²ïuR¥Xç^z(b?¤Yñ°á;ì”4GÚß°D9汶=Wb3ª
-½ØÀ¶Øhzœ<©ÆzÜz®Ì´-Õ
-fH\óô$™e¥D2: 6fã·Ý,àëª?-‡{l£8“ÆŒBCŽ›ªq!¥›8®(ˆøë TºèRØ;¾º{ '™¥Çô»å¨|áLZÞE\FæßêíáØžŠSåªZ¨b%YA®k²„M§ì[÷8Æî^]ÔqÉkW1냅
-±wÞˆjžB2È×¥µ•Wa|0ŠÔÅ{Ä…UBÊSŒ»Ë=Xiú=äÄ‹ÕüUfœü½òË‚Ý Œò¯X¯¥‘ø[ƒX_¼u™\aKSy‡JSÇòÔY’_úNUá& ‡ ñÚíqL6°M÷‹ s‡Ðä%d­ÀV†ñø²Ã®‘~òò|:cèöÞ8`”Eî€åpr×á<оè.³^Ñ;¯¡ ¿¿BfôæÛ¥£¯ý¾Õ@êh)ôKüß¿}¥É2½¬’&„쌽#
- ÒKÊc÷üÐéÿÝÁ’endstream
+1693 0 obj <<
+/Length 3806
+/Filter /FlateDecode
+>>
+stream
+xÚ¥Ërã6òî¯ðm媈K
+Bã…1R]}¹úÏ°àd”¦®ñ/4‰&:^a Ö*ÚAt‡©mˆEÖe7[g®šæ©?¶Ð ÓÍCß14«Ú†[ç½­y1Ëú‘Áý‘ÝÞÊŒº=Û2˜™ts¿/[*eõ¾í³ªzaà0±°myºQÉÆB„ÝgÏes’ɵ[¹Gß*å¥a¨éYßí›SÙe]ùl·M«ãEµöô ÔPNÀës—6ÆFÞœžwµm[6»%V–ï‘2l3×°U
+:P%ý¶·Þ@aâÜ Rø ñO«`ƒS•ÙÔÙÁ2`  ´ Àê¦Þ
+Uý©…Cщ
+›3Þ#`Á{2KSƒ';Ä?úÑÜ"”mÉÔä šªÇ›™‘”ƒ¡ô.ÜŸïù!xf°úž¯ýxÝÝ ÒvŠÅÞJ­¸û sȺ|¿=dÇ£-¶ 1' .aA†ö}/J‚ôm:¬B¦‚¦ýЋ¢ÈÌ)¹Û±LÉ”f/ ý@ú… [:áØKN%P“b’kHØÀ÷îÓs çD@Š€HPàØ|/-Dn‰ØãzaØú©*ÛŽäo«´†ÈÁ„sekç„ÜwZn…UJZCÑ‚ñ"‰#«îqÔ•æè¤ Î– °RHðŠ>gM­<7§'FgqoúZ02þ<ÙSm+§¸%c§d~I9rš´µ½Q›|
+¼ î&fX¢¼º‘¢8G)…®Q>pÊYæÖ.ƒH·Ô(ÜcìX”mÞô§ìÔ+&5 ´gT¾mR§X¯›Ô ŽŽ±ê80ÞfðÁó®fA‡
+QWMô6!Ö
+%3+/ÀöÎH`ôÈ%h3 ‡cz€dÏ )œ`—lIâ­”ç¸õ j:–Ù œÀîÚh4-̸ŽS/H#gÈ·[[ãnÛ]‰ŒÚ²Å4F{iš…ÁߊØéÈK “‡Ó¥ÁÆ}ÙBC^0x-=«GÁ8ç8ddÜ S•5†™DHwƒè¼øù¬ +ˆd'á»·Õq±›r$gŒ)±'Ö; q :µ;ÈÒä¡oò£ÍÞK¤€Çò™M)´Z<73<H4Â÷»_'¯Jp?2Ú×û/èÀˆì­l ¢e”‰‘<Y‘Ï:ÛÿŽÔ×vÞš {êûr`ºà/A¸‹@G¶³
+–(W£™ã¤ì4˜‰HEl&p´°»¬¯ºa³KI4*
+¤h¬Ïº‡¦¼Î«¾°b†B ÅÓxn‡€_nßÃe'ñÃŽ¬ŠçÓiäâlÎ(d†Æ;øã–Sî1¥B¼!‚Na+Kv&–z,dÃ*|4ÎZ;·ƒŽwlqùã±*—q$k—f¦tLÆhå¡èT,2»±ð5+ˆ­¬°„¿"ŸqªŒ\æÃÉfOÛ¢˯i„òâ!Ë×\T?e„ßغà7~cgà7¤úþd )D"“AíRV`_™~&›wmûÇGÛvõnå…Z/|79¯HÉ]J‡j à`ô=Ùv†¨LSéB`LQ¹có/K=XÎûç{ ² @ 7»&o*)QÈŽc8s
+àNÞ­%!Ä9t…o¦ZÑæ`ó}V—-…µ!ø5Ã-'s“4}ËmÙ€(52„µ5ì°Ð†NÉÿ[n‰¢Áॢ 3IEKYY¬dK_k¸Ì5=™ÔHI«ô¤œ
+m‰õ õи–x³é!Ò„’Oê`TèÀe€Ð @Ð!¾áz¢t@´Ó;€
+=+ÄKR6Of—âƒ+Ì–¹´«TN¶°uéü«ã´¿Æi_‰±d'¥s ÎL““ ‰È·…@EÓ Ñ íXIt`¶sÅ´˜¨–Šð\ɲuµ©æ@¬ˆ_ÌQËCâ ¤‹ïxÎà±VI'Y¹…I˜Ë× -Ž¤$C, v2Ђ¡¡ãÈÙé4.u€tOðE}P[®)]Sšáô- ]¼Ž¢Í$®fp#Á“Ð(ßÛüiQî[–UËñ…+%jð›€zI½šúMø¸C+ Ê¥¾Å1Îp)hUoWWÇÂjš¾6ݽy,öMNp%¶NÊÒKÛ¹bû†G­YõÔ¶NoFV¾­z´å³»—™r¿šüƒÛðT¬ÞÎý'H¯§þ ZþÉ1 ×Û °ÐÙÙ“­óËšª‚},~¾EË€tIÌ,šj_ψùex$˜§â)ÖøÍ›Á±V­…s˜JHfÂd|í
+é2„€s£(ÐòKUÃL4•Œ–G2`ò ?’P"Ï!U¨( Æ‘éâÐ L°Ð~BÍ[aÚDoJ0.'W{ä*›‹‡äÈDTLqúµ¸rXŸ8ÒÓ)éRí3éˆÆÑŽ}.AÝxHÈI\Ê€åÖ*ï+ÈöÎЖj›Ðgv¤›Q†ù­.§"f‡’s¯£ÈšCäÉÄ­¾2W „‘¨ºAÀ¶*pµ” $6þ£eà›ëƒÜqw‚myA
+_3®
+ö\Ρì:GSø͹n¹<n³ƒìƒ"ÑòĬ]dréøB$È"Ažc"«>á[ªÊ…ìo8V€Þ媃 é‰ µÒmøû Ã\gÆ)®dŒmàâ¢ò2g4\r;”+)†“â!h†pf?€4m×.õ\ô0íN–}ydžýóh9+õùeÃÙ2)‡›ÍûO?Ë
+µ@öÐЃ0´!Œlûƒµ²Oà ÿh"ˆÀà &hZW¢ì: >¬Ü½ªxšªNgn Š‡®Ek~Ñà K5ä")&\ìǫ́*7dÅJã:œ¤¿®¹2Ó¶ôéíH’YWJD £³"»î½f7{çiË¿,¿ò°’ñä©HhHᡬÝK’›8®(ˆpÄʽ%¹G%ao:°p°pò <`»¿BIWÎ$›]k=›Sv*‡(T,'+ÈyKØtÊ^Èæî^ÝcÃ’×î‡2\] eÿÛ˜aá›ÓÄ3c%HŠƒi,Xíʆa©yèJž¢— ã™4Š&N¥rÁƒJŠì$WkóÚ7‹ãWÐU"¡%ÞAl`ZîTOUÒ>ïK²îi<y \¶ÈxzóÛÿjÆÆ^»Rn·(¹J dœfÕZñ3I½X 7ô:¿µ—êÈmØœÖØ­¼$
+ƒ¿cwèÅƸˆŽ,ø¼:…ù6ýÚiò²v·HJfœúÅåÀTN5Š†“j£ÌÛQôéõ(Ú!Ç`Ër;òm4Æ‹’$ysëérïYÐ$^ûj¶ùýP–~`i„Y)BÉ ´^šžqäá Zx€cåzt–‘XtТñG Þ`âܯš²xÓÊb;2|‘Þ°Ò¯ƒÅ ìÒ,!å1ÞùÌ4U€RõJ}2»‹¾îg+vÇ3*2ó| ª‡C:"e˜Ø½wŘ_<rCX;KS¥¬ÌÜ„þð@|v3G³ lÓýâÂüþEhò È­[é‡ñâ5îŒqåÊãO
+!D!á‘YR>ü<÷’ôÿÚßÌtendstream
endobj
-1306 0 obj <<
+1692 0 obj <<
/Type /Page
-/Contents 1307 0 R
-/Resources 1305 0 R
+/Contents 1693 0 R
+/Resources 1691 0 R
/MediaBox [0 0 595.2756 841.8898]
-/Parent 1282 0 R
+/Parent 1675 0 R
>> endobj
-1308 0 obj <<
-/D [1306 0 R /XYZ 85.0394 794.5015 null]
+1694 0 obj <<
+/D [1692 0 R /XYZ 85.0394 794.5015 null]
>> endobj
-1305 0 obj <<
-/Font << /F37 802 0 R /F21 714 0 R /F22 737 0 R /F48 953 0 R /F41 939 0 R >>
+1691 0 obj <<
+/Font << /F37 1018 0 R /F22 953 0 R /F21 930 0 R /F48 1228 0 R >>
/ProcSet [ /PDF /Text ]
>> endobj
-1311 0 obj <<
-/Length 3367
-/Filter /FlateDecode
->>
-stream
-xÚÅZÝsÛ6÷_áGy&B‰/|t§çN㤶{×™¶ŒDٜȤ*RqÜ¿þv± Š” )¹væâ™\,°‹ÅûRž'ð'Ïm*Ò\åçYn„M¤=Ÿ=%çÐ÷Ùdži`š¹¾¿?ûî­ÎÎs‘§*=¿_ ær"qNžßÏ›¤B‰ ˜!™¼~óöú‡_n//23¹¿~s1U6™¼½þéŠZ?Ü^¾{wy{1•ÎÊÉë]~¸¿º¥®”çøþúæ Qrú90éíÕÛ«Û«›×WÜÿxvu߯e¸^™h\ÈŸg¿ý‘œÏaÙ?ž%BçΞ?ÃC"dž«ó§3cµ°Fë@YžÝýÜO8èõCcö3Ö «L
-–ÔB¥RÇ­,E&%0eF
-eÕ[Yɘ•Zy^·m9›–uñqYî®YªD¸L†ÄÄ÷\ùj _*+œÕj¬ÀIž*§&onîî®^S»Ý¬Vͺ£‡ªFÕvÖ#•&»&~¢ºx*çÌ6«‘ç
-=WD‡ÑrÉyë) ­uÖCÛ­üsÕ :ý
-°ì¢ÚfrrÓtedJ
-þ¹)×/ËæaWpž‰Ôºü¸àÀ<Ú£D‰3‘ä»U9
-ÌfŸiÎÑ)åœöm”1oÚâá&m
-<𙚼… ö±%PÞ¦–!ˈ"’\ýÕÔ>}ÏÂaÊ!©U,Ú8Å“ .kQTËXð³Âärj˜;®º‚Ó–gµ]B‹%fò¢Ôýƒš?ë:&<²Qͽ¢nŸËuËàK¡:ÎíŽOƒ}Ò<#¿ÅàáhŸØ$Zc*(ÿ\ÈÆ׌Ә+÷e|pZ0ÜÍOG°ÔÜúGÈ”šut+r•y6tç0iÎ5ÁÂÏ"Š= ÊNØÄM6þªTOÞš@^–Å’hMÛñùÆï þ„øò$ò<
-îGNƆ‡±ïöík"Ã6ñÈš¹KOœ’,”'jæÕt|*[£Ý8RÑ4Р±j22ÉŽoß­} vÆ› .~V«%¹ŽÌ·Í4û 4ϵwr@ Ž© ú½|E]—ð(äsôîW"0PÙ!aB‘:9¹îˆ‹+/¸UC³Æ«á7>¨<2TðÚ*³A9lŸY;¹}C×_øß%‘|x‡ß›»WÔ¸{É­w¿rƒöûn/¬ü›ö×£õëñcüzT–âz.ä„–„Ï>ó=­UÄK¸Ç[>³'šˆÏ˜62JM˜¼qØDÛP«ªçæ.óÀ\tÜ~yÖb(*–'X6ͧ͊%,F¼álÑzš]"Pg~,zë9'kgw×7ÓË7onÅå퇋\y¨yò‡t—ä:w]ßÜ£W:˜Ne ÷s4rN§z®í‘{ú²WHäÂYÈyŽ
-LÁãB€û]F’_£d´€”VŸLGÇø!À´,Ö-h†Œ‹~"&ôsýçsÎjü)y¸¥ÐÃ( 9 ×ý½É8]¶‰È·×›_.AÚ{¿TŠ‘P‰i·›¡­š¶­úÒós±Ü”Œ±àØ#ÑR
-ÓßžÊ;2A00¡ŸˆÄTˆ_6ÓÿC˜‹ÁVgNäRGí€é0hÓ³ÏÕr>+Öû÷/*ªÆc²Ͼ쑽´„íQz$œ
-
-úA‡¦>|p%L˜»¯´†\GŽnàڞݪîÊØÝ—ýà ÅybËLùãã›åR=VàC¹ÛzT%èj=ž!ãiŠ9Ñ ÔÚjéY¼ê-uùs¿BØ „»Æ^8¶£dH\€êcüò¹}²FG؉ԥ.Z:mÓ(¼‡„<­_þËaŒ#‚÷’šTãKŸüqdtvÊŠuP[ËMI#ödD§(¿T-%Hk,I°¶éè6o÷4÷¬C•¥KÉ\.csa›Ûu?ÁŽ¦^¾PwUOyO<,¥pÂÞgAŸß*ï¿¡-¶ò›M7mý4Ù`šHz¸ic!¢o"¥ÞfN½D?ë¾Ópþí•8 |-˜¶J"'xI£’ÈÞa'¯ºÃrø±\6ÏDíš3.ˆÀ‹ƒÖÖ(‰z¶FÁ£xØâk6©óý\9¤/Áˆü$ì
-¯"Ò"K•þ¶
-Êt€é:Î!ö:÷qDÆUßM¸B‰ ‘÷peånÞþÿƹ²Ù \ ¸Žà*p pe.&ü{ïqœ è{T|Ï‘?~£Eâ ^ŒøíºI'+J©ð0Ù(ë3œ´¯¨ïÉ RuÓû †õx29 ûˆ2ÃP\
+1697 0 obj <<
+/Length 3567
+/Filter /FlateDecode
+>>
+stream
+xÚÅZÝsÛ6÷_áGy&BñMðÑMœž;'g»wiûÀH”­‰Dº"Çýëo ðC‚¤xz3Ï„àb],~ûˆâœÃŸ87–Ù\æçY®™áÂœÏÖgüüú~:g™¦C®ïÏ~x¯²óœåVÚóûÅ`.Ǹsâü~þÛÄ2É.`>yûñæýõO¿Ü^^dzrýñæb* Ÿ¼¿þçµ~º½üðáòöb*œ“·ÿ¸ütuK]6ÌñãõÍ;¢äô80éíÕû«Û«›·WÜÿ|vuß­e¸^Á.äϳßþàçsXöÏgœ©Ü™ógxáLä¹<_Ÿi£˜ÑJEÊêìîì_Ý„ƒ^?4e?m3R[°¤b™i# – <™æ,s¼72 H9r¡‘çUÓ”³iYŸWåî’…äÌeb0$%¾ãJÈ—ùB挒c®HòT:9ywswwõ–ÚÍöé©Þ´ô²¬Pµõ©™æ`Vî'ªŠu9lC±Š³<´ As;ù¥Z•M$•AJ[ÓpííaÆä* )›„‘±\É(âMBWÃT–ŸRT1Ç¥\ŸËÇâkT,Âs¹Ï ñ¼ŽUÝâ”çS%%LM…`¹1ÒÏÕÛ
+êíB
+¡2sî¸WBÑ’-ØÅr1VäÒk€QUL¼rŸ4ˇªhšbz~,+êýZn–‹Âtô Hì ĤÕ²ßCìíý^’{U<³âóAßM\îʶõŠ!JÚG@¡U?… ŠÔT,È¡©»œt0sh©b’[•¾xÚ÷™³ÌºÓ•˜v:BõëvU•›P¥’ŠþIf|Z/ô^´m1ûÒD­É
+þ¹-7/«úaWpž1k\~\pdJí'—Ìjˆ¤#ÉwOå Àë×!yaƒI*'ˆš=Ю½y¬·«9uø¼Ž´¶Ø´å¼›%UI ELÎÅéSŽë>\mÚÆçe‹i'eÓÖF˜ ¹31ˆW¦+l=rAY¬ºi `ˆiH9à$Fíæœ%f
+’ÒLÊ?·>ŒKK c$1ê¤t
+‘Ç«?5¬–T8­ª4Bá8+é~°ûn„‚4B(Õ’ygüÝ“Ì
+ªõ¦¥NF‡ÆpÅDYíì‘nv¼jõfÙ>®I
+ðràÈ&UKÿE@ãÕo>>¬Åß•x¸ŒÍó+Фâ€óݽ†®VâqL2+L>ÎÜdtük¶!¨ôÀ°¦>ì¾àæ:ß;î¾®#î¹z÷]Vmù
+|*7`[*Ž×ãNu1'ý쇭^KÏâUo¨‹~>å„°?Bw-D àèG‰XäÕg8x¿ÝÁ†\Š g]ò¢aP%*1L|JÉð£¶f:" x/©I7b Š829; UT[«mI#öd$§(¿-›0” ­ðüŽ-Ý}ï±:GëÐ=Œ³d.—s¡?uÿ0uåËU‡_(LÞyxï€v1 úüVùø =h±E”_oÛi½è¦ÉÓ$Ò¶I˜ãBèáÝÿÔKô³î ç¿Ê0ƒ eu®ƒU¸˜à•¦ä‰½Ãΰ~èŽËâçrU?µ­Ÿã‚aqÐêÂÅÀ(ÐÓŒâa›C'T¾®ŒELŒG"_W
+æ õ…{dhÅò\w1ˆq%ž}ÝCÕ`<P
endobj
-1310 0 obj <<
+1696 0 obj <<
/Type /Page
-/Contents 1311 0 R
-/Resources 1309 0 R
+/Contents 1697 0 R
+/Resources 1695 0 R
/MediaBox [0 0 595.2756 841.8898]
-/Parent 1282 0 R
+/Parent 1675 0 R
>> endobj
-1312 0 obj <<
-/D [1310 0 R /XYZ 56.6929 794.5015 null]
+1698 0 obj <<
+/D [1696 0 R /XYZ 56.6929 794.5015 null]
>> endobj
-1309 0 obj <<
-/Font << /F37 802 0 R /F21 714 0 R /F22 737 0 R /F48 953 0 R >>
+1695 0 obj <<
+/Font << /F37 1018 0 R /F21 930 0 R /F22 953 0 R /F48 1228 0 R >>
/ProcSet [ /PDF /Text ]
>> endobj
-1315 0 obj <<
-/Length 3178
+1701 0 obj <<
+/Length 3339
/Filter /FlateDecode
>>
stream
-xÚ¥ZÝsÛ8Ï_á·Ufj­ø¥Çn›ö²½íöœtnvv÷A¶e[YÊZrr¹¿þ
-à¹&$Ö˜P $¸¿Î¢à
-¹?RìÕ! ]š
-7>q]€ÂmA¾äu†Ü;Ï»rµ£.ã®Ë{ m)@'?š‡²Ï~b~B}ƒª.ÆìVÙÃåóº}öË×Üv<ÑÚðE7* `ËëÞçºŒàž õDN»>Cn)B“ˆìõ=×ÄÎP’qh ¤‹ƒ­)p«LÍcWZÇÍDàitÁ@Ùy 6°9V4b:s€„ð
-KúÒœ?#9¦×e8[ëbù£
-M¬å‰ƒçŸ÷'LDí³u‡©ˆFŠ±<FAÆ(Ù_þ |=×R¸ Ò4Œ£ÌklÄE——U;´á>Èõ}ÂÖ›ÛØQ—a¼í.~ì
-¬7žéû\—£™ç²NŒeÀrG”pÇÀItš¼±»çšØ~øü §£ý‡ÅŸþñMJ˜zú èVf*{¸„–`ø&éßF8[ÆçDâh+
-•P†™÷ù ­Î¯Å)‡Ah{D°‰Ëv.ƒP2Œ´v? X¹'ÞHL¨g‚ˆÈ
-õ˜.ƒc:Ù<=YžA|*ô«;{¦ó­‡
+xÚ­]sã¶ñÝ¿Bo•g"–
+oùO»mu³h›bÑuÕøÔBÇQ–‹lÖ_új‚Ùã@heF‰! ÿ~´5\½óí¹Èæ¶Ûmëò\Ìë»î±Ù–]Ñ•ÏQñ¼¶áÍOkŸšºµ-¡º†o?^âÝ–4Ï[Û1Ù#/xw÷aš5!xD¸àRPQ. žVD¹ÖÄ;m½lÜsE
+t<…eLYÓ“Àé@¯­]veã‰z‚dp¡ôV!‡~îÊ®‹]ÕñÊ-27´4I$Q!bÇãÁz¢,’(OTÆ4Ñ ugJó4Jóܼ®x}ªÓŠ¨&o±,–p±ú™ŒMg¯³¨&ø9KÀ½1d„ÔOäÉY(QëD®æ᎚†o}M#2”Ž0¹Ó7Ä£¾ç´ '~tÚæ0<»'k™ ’5⽬‚TE"‚’—œT€<JEmÝLI_D
+wÜ=­ŠÎ.@äËO‹Oí§‚OÁSˆô Õ ƒÓš82¹ñ@‚WŠ%¤”vò@„“ÁØpô¹¨vŒ7á.5“Ê"£Ó7ìÎD¹’†i¾‚å´ž»{`üÖßß~OÀ}Éû—Ì®=%è“= _ÙÎn7emIe¤4cb9tZÍ~äÜ:Î=6»Š½Ö=îZïÇöä©z°µÝ‚a8ñöæöêCKð¼!y¹àÝvd8ìØšÚ:ƒ;
+ G:Õú/øë¬ç¯3§9GÿÌ7»¶£ ï-= Þ·²…êö -)¡Àqï¥4yMÐV4ZT˜%>nh„¶|Z‚A„’bÙDBÚ‚èËÊŠ™i
+¸ÁÇwÃù” çˆ9Æw7Ãé)ŽóŽ †²A7b‚IŽ«†¸0Åu7^t£ÝÙ“D‘|Â@$e2÷IB½ì%ïe`øB[äœ!@Ì{MrÄqžÀäªËM öWeP”õ
+ý¢\Mߧ¡dl"K»ßu#wRäpq.ÛNC]#i¯šŸŽ¤Ô,Ε8Iaæâó”€zšÜG®¿@1êG±‘é0~AW!•‘Îý%U¥» «õÄb"‰L’¤_dö=Nì«^.-ºpÍ/í\A†(Sùv†({f~201ÃÁig/$°go8ûÕ+ÎÞS!‡Ýö°è–O‹­]omû8Õ®S
+üñ« ª Æí:%ôƒ»ó­KP—C>ü®9ùxäAªŒ|U \)Éœ˜ß½û‰
+)…4â=eH‚›À8'#èÿ£÷e…-µP7†üÕ5ïTšý×Û*Ùj"ÒôÿÑGSie(ÎW5¢OuZ#Ußg`‘m]³(k‚ÇœÈXDª’×Y T¼ô-ã4’ñˆ—‹ªÂÖ‚9ÖþJ‚[9ÔŦ\Žõ@Pí‰Ãݶ¨Û’óvÀ“5í7Â,xò ýPb¸)#¡Ø¹ré¯ôža¶ÈSì‰5`W%—ý™™ß£bgèFe©»Ø#Íš†9—6½\ÚŒzÁ-&¿R’‡¥%QÝ Ôîè}Rã\–e_æeqʱ W<Èb3¥Ð ¬4d[E¡áFXžÓ~*\ñ,KÈ_Ülˆ–R…4@—fHÉQU*Ÿfà¤9G O'»B§,3’-w{õ縘Àõíå;Zy$æTBr*!C–Ð<[^á¨yøæO7ÑÄá|ŸƒÁÞVÕd…zåZ©ï1¤¡5âò´–pȶrm Úéœz)÷ «Ú†0µ]Ú¶-¶^›ÑtQƒý4­ýÓy.ç7?Ò —€½ó¾àrªé|ªà££Jýµ"´,vØGL#í]qÁDÎxàY„YÍöØP_‘µ¥$LÕ_£oR)·Æ®:¢ ^’¹ýü¦e—Tö¦ ×fÄ™ÚøL'kÆ—% ­ §«]sgðA‡;œë]7èpŒu´œo(ˆÛüºA‰a+†S²-ÀôÊî¨nˆº·®ï¨eSÿÇòa*SweÄDšKìEy—Qì LPÜ Å0[îàoÊÄqdâØ»ò±oSÖOÛò¹ðgáv i¸O?!ÓñèóY±D….ï±
+õ*|Ö­¨J
+võ¢ä“"ÒFä¯o¨&v¸{™FZ+5Üšz
+r‰ÐdÏé;Ñ€³±6ƒÖ»ŠF\@Ë}%ˆžã!3
+í«iãCªL¹ÎŸÿdÚ'¥
endobj
-1314 0 obj <<
+1700 0 obj <<
/Type /Page
-/Contents 1315 0 R
-/Resources 1313 0 R
+/Contents 1701 0 R
+/Resources 1699 0 R
/MediaBox [0 0 595.2756 841.8898]
-/Parent 1322 0 R
-/Annots [ 1318 0 R 1321 0 R ]
+/Parent 1675 0 R
>> endobj
-1318 0 obj <<
+1702 0 obj <<
+/D [1700 0 R /XYZ 85.0394 794.5015 null]
+>> endobj
+470 0 obj <<
+/D [1700 0 R /XYZ 85.0394 227.0652 null]
+>> endobj
+1703 0 obj <<
+/D [1700 0 R /XYZ 85.0394 197.3345 null]
+>> endobj
+1699 0 obj <<
+/Font << /F37 1018 0 R /F21 930 0 R /F22 953 0 R /F41 1208 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+1706 0 obj <<
+/Length 2753
+/Filter /FlateDecode
+>>
+stream
+xÚÍZKsã6¾ûWè¶rÕC<’ÇÉŒ'ëÔffÖã=l%9Ðm³†"Q²×ûë÷k4@ñ%;µIªR®2ÁF£Ñht÷×
+ÏjDYì“L…ŽmæX?TÅ *^®óšyÕ6Ür‹¥®¦&{ÝØ*¦6Ÿk¸i¶yé»nò¶lß ­#ˆ­š§n6¶l4îªæ&¯ºÞ‰~ÍþlêÖjÜꢡœ¾V/›Çb·+7›‚Ô°féÔ=çÇc¾+ gnô5·L|ÊŸ[ì™F8þûoLg³€±-öLyÈwûr}¨ò¿ó‚[ær~"üÃ÷–·´Ž[¶NQ·B„™ÈÚ¥³ :ïóÇb¸>ÎN9§‹©HðŽâÎ$"Aˆ@B/àxxSWÏoi?wmÙšT k2éGÞP¦„bHXoüø?ëfÏÞZ˜ûl¹ÓÅ8Ôµ¡ EÁÅÂDYF1Ì»»7®zAßñ¯ú¦A?•ë‚¾X“û„ü¬„J&
+eø(4É=×kjL¤‘bf«°2E¹T»„k£¤¤´B`¢(Z~8äÕªÝçëo¼†¯ÅîÑ'ÐÑÌp‹Øãäôjm±x.—ëÞyç
+~á´¦5¢ºí±3oì‚…ˆUN9Š(>O6»=÷ÿý©Ù}ëËoõ†ßhnGº©Š­Ÿ…"”ž,._ßç7eURŒ’°ÍÁ«GÉb&î«Î*.šÉßN'ïŸÜ(JðíË/fèÏ Ø!üäÜ„Æ}ÓzY[èVÖ…˜ µ‡Cii^ÆÌ>×iÌì¸h›nWíqëØ©3!í/ª˜fT §AÁCÈ©Mìí¢]Öù6Éžô¡(q9ÿA—·¢ð„máþ|½7S'vÓpoì·Ì‰v΄N·g笱4éÐ1ö»¼nÉ(µÛ ü¤@’R&ÕIæô'Í™H¨LT
+ä-#=@SÛœû··jPo
+¦äpe¦8­A qQ=†Ž{Ïæ£yJÄá½QZæÖ /ïOLÕ²ôÏûœg¢Ä-Ž(ì¶hx3{þ–ŸäHÔÒKçMn©*sÎ^ÇOÓ¼_d:UæýqŒ%±P± C¬¹\Uƒgálí×r¨+Ú·¡ˆw!ÓÌŒ Ð{ˆ ÏÆÃŒíÙ‡b6÷l7EQàli§6'¢|Ýl·Î³è¥báEeX!îæR·JQW&‘õ ¤­õÃWfÆñŸê`Ž®H›à€¶
+ Ê`úáPÉåÓ}¹¾§¦rˆà©]aDt§2Ÿ|üaO¿Ç°¿/ý8G¾`V àÔòŸ'¹(
+ñùIц•Îõ8#âÔ«”¡Nð I­-ª4ä幓¥"K2ŸˆÆÛ1²¡„–:%¶ù3Kçc"µnü|mg× \Uçu›ê µBia‚`§÷tv¤/›Ä3ppä!|†Â ~©¹FVòöBºL2™ V:ìVá芼îųj&(Îm´ìN¡4æÃÁÈÒÚ‰êTŠ$¨f¼¥ð°]ä5Ráí¡¢wÃàæã‡s$n’Ñ‚¼[&ѱÌ-_&Ø”nú
+Úa+$*g«úqØy!¼)*Ÿk•¡÷×ÁŸz†BYº­ŽPwiyÃ>#ÁÊå5þ«åäŠ>µ„¤Gº¥î&zñëBÚ²L3S¯íÖz´#¼½ÜªÅ‡+Zôå¯ú’Ý¢Iz^©´°ØD±6VIÃçGkç“tdX>¯ÖùúàÜvpRËè»@H·ph­Y¿ø+oÈ¥ç±È¤#u8[ôØCå5š5ñ,c3T•.ú{÷ûÜAcŸm! Ž_9~Ÿ³ú ÷Ì]§km^)‰•ÞhýÊ'‘Žk”tW\ï ðH‘3@»¾ä)®x¤6’C †x¤x„fլݥN&ßFtê‹š]àaÏíÂ`=0ÂÏ.¯¹tÖT±~ BK/ç¡iýG8¢S±âJ[â@ÿ†*ãë$Cu'rl½t¾IÊB&¤f— é…Qô,k*‹]W«Û|íN£ž^ì@ü7‡=7è>á(ξ
+,þ³gis×9a®˜ŠÖ'uº k>—×ÅT¾+CAõ­ßPúùß)XçU´§Û×Pb 6lþ£á·¡©'ŽÜ±‘É 
+endobj
+1705 0 obj <<
+/Type /Page
+/Contents 1706 0 R
+/Resources 1704 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 1712 0 R
+/Annots [ 1708 0 R 1711 0 R ]
+>> endobj
+1708 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [367.5469 410.6007 428.747 422.5009]
+/Rect [339.2005 701.7636 400.4005 713.6638]
/Subtype /Link
/A << /S /GoTo /D (zone_statement_grammar) >>
>> endobj
-1321 0 obj <<
+1711 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [483.4431 196.7586 539.579 208.8182]
+/Rect [455.0966 503.2689 511.2325 515.3285]
/Subtype /Link
/A << /S /GoTo /D (address_match_lists) >>
>> endobj
-1316 0 obj <<
-/D [1314 0 R /XYZ 85.0394 794.5015 null]
->> endobj
-358 0 obj <<
-/D [1314 0 R /XYZ 85.0394 649.9934 null]
->> endobj
-1317 0 obj <<
-/D [1314 0 R /XYZ 85.0394 622.3077 null]
+1707 0 obj <<
+/D [1705 0 R /XYZ 56.6929 794.5015 null]
>> endobj
-362 0 obj <<
-/D [1314 0 R /XYZ 85.0394 392.0307 null]
+474 0 obj <<
+/D [1705 0 R /XYZ 56.6929 686.5799 null]
>> endobj
-1319 0 obj <<
-/D [1314 0 R /XYZ 85.0394 366.8157 null]
+1709 0 obj <<
+/D [1705 0 R /XYZ 56.6929 663.4862 null]
>> endobj
-366 0 obj <<
-/D [1314 0 R /XYZ 85.0394 245.2415 null]
+478 0 obj <<
+/D [1705 0 R /XYZ 56.6929 548.1865 null]
>> endobj
-1320 0 obj <<
-/D [1314 0 R /XYZ 85.0394 220.1859 null]
+1710 0 obj <<
+/D [1705 0 R /XYZ 56.6929 525.2522 null]
>> endobj
-1313 0 obj <<
-/Font << /F37 802 0 R /F21 714 0 R /F22 737 0 R /F41 939 0 R >>
+1704 0 obj <<
+/Font << /F37 1018 0 R /F21 930 0 R /F22 953 0 R /F63 1355 0 R /F62 1352 0 R >>
+/XObject << /Im2 1341 0 R >>
/ProcSet [ /PDF /Text ]
>> endobj
-1326 0 obj <<
-/Length 2907
+1716 0 obj <<
+/Length 3489
/Filter /FlateDecode
>>
stream
-xÚÍËnãFòî¯Ð-20êôûœ&OÖÁÆÉ:ÞS’-Ñ#b$Ò©qœÅþûVu5)’¢d“2FÅêêêêêz6)fþÄÌXfƒ 343\˜Ùr{Ág`ìÛ ‘h-Ñ¢OõõÝÅ—ï•›¬´³»‡/ϸ÷bv·úyn™d—ÀÏ¿ùáæýõ·ÿ¾}{éôüîú‡›Ë…4|þþúŸW}{ûöûïßÞ^.„7bþÍ?ÞþxwuKC6ñøúúæaýœ`z{õþêöê曫Ë_ï¾»¸ºëöÒ߯à
-7òÛÅÏ¿òÙ
-¶ýÝg*x3{‚ÎDr¶½ÐF1£•j1›‹Ÿ.þÕ1ìÆ©SúÓÒ3«¬È3)€Ç+–U>jÑO/Ëá0³ÚêÓ¼h^ lg Y-¼`&3[X§ANºã•r& ÆH<_ï˜tØ(Å8¢àxoPÁ‘00cµ@:Á™QRs¤øáraÅüþ—ó£ãð–8Š™…ÍáqáÙo3Á¸AMŽ;=h "¾¼ÞÊÙ»
-ö3ëo)ñ]ôÇYÕ3X!ìW«™ † "£ÀÙfS]
-3Zü¶Ïw`|þ¼XfËK
-üÁr1”à'<Ì_8—9¢òó§u±\¸©–ÙA7ÏV«Ý¥ðs8ë–p™•  <6W‘jU”Ùî™0ïn~"°Ëº)ª²†€¨¸ß­‹Äi›}l™‰ÏcU/P ^87ËA½;ƒÔuq¿Éß
-~«OùnW¬¢¡Áã iœeÆ@•@ UÑ`Éä]%kÏS¼ZoÎY;Óv4…ŠD×éH«d=¾Á*Èö›DW¤Ã€ÌÁÎôÉðºñSÖ2Hu)Ë •TÓ@ƒ2pò…À(΂Rê¯,4
-Ä`APŒ‰abí”8Nži®}϶•‘Z¨ó€€å„4ÖaÛèÂìòå~WÓá^ƒá„0ZŽ\ ¡â¡[7Ö) !Xy÷TÔ“ùb‘2Îëbbiã™7\½fiÔ|_nЃ—…2†3εæºÃ¾À€¿šÂjð«.UG)€–Ö ˆ“mgk€Š¹úXˆÀ™oõXBY0µ¸)§àÚ_ ·ŒÊµ¡§Ü8BVËwi±¿p甯
-~0Û(£<(ä…@t 9†ÍdšjBŒ)ý¹õ;š#QÈB¬uc{ Û¶ýàÇíŒRûcŠO9¡ºðƒèCøÁ!JL€nà –ê,¤: uÕgž§íÐþtñE±éLV>Õao&,RB !ß-rÂ
-¡¸|mÒäÚœ]šŠ¨=çb ’@èʇDsº?;•ht& Î:›h¢XVM?M)ÒCû`Õ I¥OuÚ_;ª ›J+œLx}^†ŽjBˆaëXÁ ¥º¬ì’‹’]rAì(¹àhL.q,Ým!rì®ÒµîŠå¬æ1Ÿ !—r”ObÝ‘®fà³P–òQ ûÚ|2’äsûûÎ44«ØŸ7‡Õsh©æ°\eÍqŸ#”šPîŸ]½£šX^Ž®“‚wn¸þ¨Ê8\rBÎO±±]ìŽmìF¢x€¬÷÷Ûx¡ð»ç2ÛK" [NÀÒ&Û¯&»Íê&O0^qÕ©¹kÍ,DyÊ ’¥Ð”ÌžWy,
-{u~l+Þ0‡©E‚9(°Ñhp÷!]©Üö­¦¥_ô'LXÍßh5ù²)ZWrL¥‘J2í¥Hsd¹Õ 2H¥¡«EÏéË@óH“›Ó¾+ ‡BwoÏûnŸê´ïvTcß]€8OÙn…†2>'0?ªó‚tT’ÈÑ=¬óým»±Uغ1€7ƇÎá|GÜàƒãCtc
-ßѳñ¸Òèµã­8<“â⻑( ^8T‰thR šN £Céå…¶…üò½ö}ë‘¥nkùÿ@QÈyj›#øß©ÚG1 nšó†Ø·:Er訒°)
-S`’„BÒõÄÐz8“
- õXôÿ@««hendstream
+xÚ­ZMsã6½ûWè¶rUÄà‹
+ÅTåGkQ¹RÌwÝ@¾ñ Pp—ÑFô ;Rfß,û¾ív™éŒ*ªÊÚÉt‡ÞÙ ZíCœ÷ h°̼iû&3;ç
+‚ ã© KsB£uëˆ5èZÖÙµ[€j°ã®Û5¹É„-˜ÿO†KFãj›×Ý!Âô«æ¡>l¼N¿²’åŒ/¡]É0ú¦[Ö›]3ô_ÁSVÒ5úIN1P^0 pz¨í Ê«BTb‚aT¼8 >Îh€–àçB~F©Ôù`¥²ÁhAÈÅ£
+",à²Q*£Æ(U`™ë1ŠG‚™€$cSo½ZQDê{Ô€ Ý{lŸꊡ»¡o9`wEÂj Eî¦ x³Ú
+Œó¦®b,ƒfÈ›Ð<æM¼ˆy.\Þ„ßmý»¿M¢nEϾ+‚Ã=±&ס£õ·úfÿÜì‘V’µ.óIuQÂJJ-Çàý¬tÆ*e’
+c.§O \2ñ¹é“©òâÔD? xUŒñ±)½BèÈÇ”ãB@6@œK9\;å*“rð©‹)Ç©¥Å(失èbrvÄ°¼’\R©óÞ¥2Ë¥à ©¡]Ô!Je”S]ÇùX‹±ËŠ˜Z¤ˆ©{'©ïºÔâî-—ÍÓ@Sw…ÛÞ]‘Ø*æ²
+Í“lâÈ@ø‡¡èNŸ›M&šœÏ*›ÍIVAmÏÁAÂvK”W‚w*uAê‡ÃÓªN÷<ª„$ìåÙ£TfúJ ÎR‰ñüŽQ9† ±{cìv!v£{ÐÙî·í@ío_wõ¶]’À·>Q/-20nO½Ûºßþ°ÚÞó»
+y¢†½Š¨ÌH›äF©k:hYHŽž“ê@ryd¨ÛÍyßUÆBª·WBy*uÞw£ÔÔw ÎK½_!P¦Æ` ˆ©®.+¥2šŒŒÁJðÞtY§n¬etch7†æÑñ"º1\ïÈ£CûèÆxá܉O%mêgï¯ô«Ä$|;ÏÆ×å]÷}C×d8Ôkå”ÁÒCçE×^Æ ât’Ü$/„Íä—ï +&º`\&ÿo …Œù ´kþ'Ç}dal¸Ã4|°)*ÔÀ~Ê+K‘:w^mÍÝ]D),ÍWj¼³
+b︌–OAFA2n]pR zžš=Œ´E²ÌÎïn­˜w$Óìêû—‹S+“Fþ‚„]Þ}xÍÙÉÂþ©rÄ ³à†uÙÑKö¦… [°ìWgM+ãvif ü>¼: `%í¹Þ¨
+çù£/°­ë]Fu,L0#Ì_{Å‹¼AxM™qE¡µš ›,/7*XvZ€‘H5`ÏWºXv‡ ù‰ÒÑê° e<–‘'ûià1È8Y»[⻵Á3
+’÷~-Ú릃n¹©ýÒDHM…'¿jžüî‚’¯‘²iq4°úø M/ÀmJû.
+GÞàgÓöµºcZ­ ›3j5ÔˆLO¿Ñ–/LŠ¤¬)’#¸HŽïqN?ÂÁñCAÛZìðt›ç&¨K[&XšÕjì³TzçœÏ=˜~Nk•I6%…úôÄÏEü€ˆÃû&-‰âaòÃÐùùîÎ!ót3$Á ”a&9>ãìø]Ê•Ã0á"ø•ô’J]
+¦Ã†3ÐxåôÌ…¢ 4¹yˆ)¼~€ṁÕ¬F­}÷ñ+nŽ¨£—Á–Ñr–MYK(ŽŽãØC˜d[ÿÙnÛ “زˆ…™Á¯òXƒ‚U|joC˜¤ü¬]f|-
+XB@~n‹5Ú ‚i<œ“õÞDš>þáæxö%³šÒˆ ‡_÷Mdññsz¸ ÉÆ2­‘ë
+ˆdÞH9&OF^ãzÂÙÌQ¸”SÂxfþ{ŠX +ð#ãLNe1ÿÏß2?ôV†óeKàj•°&(å‚£™j^ʪ(+a2ªÿ‡endstream
endobj
-1325 0 obj <<
+1715 0 obj <<
/Type /Page
-/Contents 1326 0 R
-/Resources 1324 0 R
+/Contents 1716 0 R
+/Resources 1714 0 R
/MediaBox [0 0 595.2756 841.8898]
-/Parent 1322 0 R
-/Annots [ 1328 0 R 1329 0 R ]
+/Parent 1712 0 R
+/Annots [ 1718 0 R 1719 0 R ]
>> endobj
-1328 0 obj <<
+1718 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [184.7318 214.5925 233.4785 225.3769]
+/Rect [213.0783 507.6843 261.825 518.4687]
/Subtype /Link
/A << /S /GoTo /D (dynamic_update_security) >>
>> endobj
-1329 0 obj <<
+1719 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [369.8158 92.1907 418.5625 104.2503]
+/Rect [398.1622 385.1227 446.9089 397.1824]
/Subtype /Link
/A << /S /GoTo /D (dynamic_update_security) >>
>> endobj
-1327 0 obj <<
-/D [1325 0 R /XYZ 56.6929 794.5015 null]
+1717 0 obj <<
+/D [1715 0 R /XYZ 85.0394 794.5015 null]
>> endobj
-1324 0 obj <<
-/Font << /F37 802 0 R /F22 737 0 R /F63 1065 0 R /F62 1062 0 R /F21 714 0 R /F48 953 0 R >>
-/XObject << /Im2 1051 0 R >>
+482 0 obj <<
+/D [1715 0 R /XYZ 85.0394 131.4374 null]
+>> endobj
+1720 0 obj <<
+/D [1715 0 R /XYZ 85.0394 107.8521 null]
+>> endobj
+1714 0 obj <<
+/Font << /F37 1018 0 R /F21 930 0 R /F22 953 0 R /F48 1228 0 R /F41 1208 0 R >>
/ProcSet [ /PDF /Text ]
>> endobj
-1333 0 obj <<
-/Length 2684
+1724 0 obj <<
+/Length 2819
/Filter /FlateDecode
>>
stream
-xÚ­]sÛ6òÝ¿B÷&ÏDñAHžÜœºsIS×{hú@I´¥‰D:"m×wsÿ½»ØER”ã›fô@p±Xì.ö”œ$ð“—ŠD{3±Þˆ4‘éd±=I&·0÷þD2Î,"ͺX?\Ÿ¼¾Ðvâ…ÏT6¹¾éÐr"qNN®—¿Oßýxöéúüêt¦Òdš‰ÓYš%Ó.?þ“ žï~þxqùþ·«³Sk¦×—?$ðÕùÅùÕùÇwç§3éR ëS8²àâò_ç4zuöáÃÙÕé×?œ_·²t啉FA¾žüþG2Y‚Ø?$B{—Ná%Ò{5Ùž˜T‹Ôh!›“_O~i vfÃÒ1ý¥Ú‰Ô);¢@¥:
-” ŒM6±©™V:(ð³R¦\Ï盳Ùt“Ï‹MPzo*|Úé|]滧.¨J;?ý±z,Š*êL;=­×å‚©Í«fE£³Œžy¹<FÆ@Kº)hVEIøËâŽ&yS,_¡æAü™”§©
-²4«uMÇSÝ5몤ñcÎÀ|SW4êÓBAd2½lh2Ò(«GÜ–¡/™â:H£ºÚq—]¹.oée[Ôu~[€Š†ö‘ˆ$Óµ26MŽø#ͺXtœrÌ"ª ßlªÇY³ËËú9Ø^/”rÏo‘F¶ïYSj„J¼îïÿë]±XNU€J§«õbEÃUU7
-VÏágÔ-¾ ½á“ϧX?0Öª’GQ:¦uP«-O®«.vl–áÊÓi*2ô”¤£¶`S3í½p™qÛê¨t  mÄ$Ϥ¶9µöÑÜ`4/èY·ÊY`]Ò™>äQ*-¤ÑŠ îHÞJÉHu½-Ê}ÑÈv>.òù1`Ø A*PÔn½Ä#{†ë„J]ÔyXEí¨/®­´Q}òêó‰5C¢WÞDod÷ì(ñA‘“[ßä÷›7UôþMtèŽ 0h õ¨ïf>½ÔÙó¾ÛÅ:î»-Š>ßä‹/«jS¸­B‹üÆÎidçžÛj#œQƒ­{n«•šæôجë†FÕ O,—äšuq›UÞÄQAv¾0~\£^qÎ0Y,Š;½/vëHjïËaO¦p_²:œ˜ƒjóPDvƒí)Íg¦ï¹¸ÁÓ©”rÊ&õKÜÏz¿#›RÍÆ4”â~´ÖçŒÍ¨wU¹ŒY¢©x¿ëcö|MÇÀŒM,;CyÜ屺 ¤±ð™Šg3 gÂkKÉ ™‰ê$ß*›bw“/ŠzdÈ­
-<SgäÀ$„LjÒ.‚wÅ &îª]SÓ,g›¸,ZŽYaqý¡­!àKçX
-mô±Nùé–ÿ„ÿ|#Ñ.|®—PI"ß,çîÍ›×Z½ßá%í„NҶР7¤vA­4˜%ÀøÚ XŸ"$X€ °/ÁÜЗ`#-}d Ä+2Ò‹k4ì'ºÀéÆ„¸Q(ñý>«Oz,!ÄŽ¼!Eœ\3$dÑ
-dæ §3ñÖÓtn=ìt¤K
-ª/!´¦Fã¹’ÏŒÐÖ?+âYâ¤{ÉM+G_“éCãg¥u/b?ޱƯv­„0Ž€
-ù§HÔå¼ýÿÂ!ëd¤$endstream
+xÚµ]sÛ¸ñÝ¿B}:¹!ø$€äÉ—8©o_Îu§Ó¹»Z¢-Ž%R'Jöe:ýïÝÅIÑŽÓkG‹Åb±ß¢˜pø‰‰ÉX楟X¯™áÂLæë>¹ƒ¹'"âÌÒ¬‹õýõÉëÊN<ó™Ì&×·ZŽqçÄäzñó4c’>}÷ã凋¿:;µzz}ñãåéL>ýpñ×s}¼:ûôéìêt&œÓw9û|}~ESY¤ñýÅå{‚xz<AôêüÃùÕùå»óÓ_¯89¿nÏÒ=¯à
+òÛÉÏ¿òÉŽýà gÊ;3y„΄÷r²>ÑF1£•JÕÉßN~j vfÃÒQù ΤÊäˆ
+NšSTùÍ
+`Õt·,XåëjŠíC±%(ò…0â !F䶎(-…‹Ï4“/$⦉KH¯ðÍOójñm:3Âê[‚äÕ4i1í>"Öu>_–U¼ä²¢gUìh
+£p]™<-»øü “xvÅö6Ÿ v–f-zÀŽ†_/ÇlRxÆ3}tØÙC6r^4x¡r½Ù•)…¯ütß ‚ìj‚iÜ~‰À Ý嘰H¥Z € 
+”>…é.¿àîsJ‡cA´s a?O¯%$ZQ°®ÂJBÅ£s„DjÑI°0‘ =QƳ,!-C…„!íž7Å2@_–¹>?±¡\@y3v°CØ¿MjϨ[>ÃÔP’ÑÂH„Ô! ü»r¾_
+’æo¾ s¡ xý“ÿe ñ¤×´¢E&¯™ ·Ø*R|ÿ¶Â[¦´r}MëñÓÍü;Ñþù¢]ø\!9o7îÍ›×J¾ßá%•„⦭$u
+%t+eMHjUÛðˆÈ,.©)·@hŒ:-͘”u‘­yJ³¦ÞoçÅÈg-z?ijU/%‹E”ÊLßq†â â¥õ8FqÍ>¤y0Û ð™±”J BÛUØ¡«€Ø5‰`1qV_RƒqÊÄIZ|H5¤{Ê®lƽ_j‡t½£+5U­w긡0´%Ë´'tL JmLÄøókŒk“8ÚƒnËæ>;¨Uð ^.ƒø¾.w;òÒ$.œì§ˆšœÙ°!
+?®(ÊÛÔF *UuP ¨v*ª:šÜ‚M×kBØ„"tG/Õ~}SD
+·A7Z\¾”ÿè=îö‡
+€î]ÑßSB‚· Ø~iUE  ›Øà•4`bKÕ§F‰·©¾yR‡»ÕF…./ñe‰¯ÐÙˆ¶Ó2hS ~¥ˆ(UB)F“Ô˒U
+–@„Túàö&I¹;mgSzÈê¬Y…-i›uQb&¬bÏŽÙÓŠiücøÿËÝ0‹‚¡“ö¨
+‹;F8ñM^ T´?F”E2)Ú
+%zž—Ó¤Þ&¤U¯”ñpY×£>Y¨(¨ÜÚ?b òóe1¿ÇaFÝjgR¿Õôºç0߶|aŠBZ]™7T‹‡rÜ›2! U©óQßmó5ýs†sXé@8 $Ôð$Ùm±å[<¤Éev`fý]Ü$z†¸œ+.£7òÓ0(6Ëby2Ô\ ·¾»ÐTÙ
+¿‡ù‚·Zý‡?»8|“‚>Ñ99þE…´Rg ™
+…ž;â<}ŸqÌú
endobj
-1332 0 obj <<
+1723 0 obj <<
/Type /Page
-/Contents 1333 0 R
-/Resources 1331 0 R
+/Contents 1724 0 R
+/Resources 1722 0 R
/MediaBox [0 0 595.2756 841.8898]
-/Parent 1322 0 R
+/Parent 1712 0 R
>> endobj
-1334 0 obj <<
-/D [1332 0 R /XYZ 85.0394 794.5015 null]
+1725 0 obj <<
+/D [1723 0 R /XYZ 56.6929 794.5015 null]
>> endobj
-370 0 obj <<
-/D [1332 0 R /XYZ 85.0394 625.1831 null]
+486 0 obj <<
+/D [1723 0 R /XYZ 56.6929 291.4983 null]
>> endobj
-1335 0 obj <<
-/D [1332 0 R /XYZ 85.0394 599.8772 null]
+1726 0 obj <<
+/D [1723 0 R /XYZ 56.6929 263.1273 null]
>> endobj
-1331 0 obj <<
-/Font << /F37 802 0 R /F22 737 0 R /F21 714 0 R /F48 953 0 R /F41 939 0 R >>
+1722 0 obj <<
+/Font << /F37 1018 0 R /F22 953 0 R /F21 930 0 R /F41 1208 0 R >>
/ProcSet [ /PDF /Text ]
>> endobj
-1338 0 obj <<
-/Length 2990
+1729 0 obj <<
+/Length 2567
/Filter /FlateDecode
>>
stream
-xÚµZßsã¶~÷_¡·È‹ß${ONâKiœÄufÚIò@IÍ9‰TDÊεÓÿ½»ØEÊ”ÎwiǤ `±Øýöh9ð''Ö%.Wù$ÍMb…´“ÅæBL í› É:³¨4ëk}yñçw:äIܯzce‰È29¹_þ<u‰J.a1ýêûÛw7ßütwu™šéýÍ÷·—3eÅôÝÍß®éí›»«ï¾»º»œÉÌÊéW½úáþúŽšñåÍí×$Ééqbлëw×w×·_]_þzÿíÅõ}·–þz¥Ð¸ß.~þUL–°ìo/D¢óÌNžá‡Hdž«ÉæÂXX£u”¬/þ~ñc7`¯5tõŸ‰ÒN8PÉ1Ú<qZéÎÀ-Bˆé{¿û@‹¼Z.w¾ip‰0ê $&3•'&•4ÄÍêr¦¡Cûèé¥ñ»'¿Ãw9]Ö¾©¾h©á}U?éUóLº ¬©OA?Ûû¦-ëê üLí´äAžËõºS@c±K ò(U±ØÑ$¼„¾/4xJ+›ÃZp a¤YSïw ?²àY§>“2É­U¡W³õ‹ò!”o`BçxUÎN ðݥ̦è¿ÐRTKzÙÖ»–tögÙªÞÑK³_<R#Tz0}æl:}XÌÚ¾â¡jr7Èn~xrè¯ÜNƒGÐÒ)£%±ó¶Ø­ñˆ«”/|3{r#îImâÒ4c_Ö[Ü´„¶
-wÖõ†¶—€B˜Ûø£ÚoæžGX…ðˆjÜsK13[ÔÈÞ~/I Æ}ðÃù·åâ=5gÓý–ǪXÀ.ÑÜóVdI®­î!N°‰–—N}ˆƒ"S ‹ƒÔ…²3½d¶¼¬”ìÂøn8}:S€›¢%Éy¶²Š*cp£
-øY(cMÑJ(&S´RŒŠ ÆΧþ÷Åz¿,«j¤º}‚ƒ܈èƨ=âF …<‹–Ou¹ü˜s©ÕùqÜYàáòt8lç.HªÐå(ÌÎù ’L‚¤_*Ð) £°ì¶|òëŒ4÷ÀE(ô\úU±_· ýªWô÷à\j¥|]áw€+";ë ™'Ú¦fd¼“ÅÒvØÉ {©¼ø¿P'ÓŸdÈœ
-¦R¹†Ý2 »Ôß$nW¯!"ë¨]–¥ùH/›äiêúÞÒîÈT'ÇQp쉗æd­ÿ_뎩œÌ¡ f*R…3•î\å±2“Ÿ„K¤½
-2-*Q2͇Øóú1ØfÀ«:¼Ã8×ÇT¤ÄË1†¥“L»ß\E`øÅ£_¼ÇW7-W$
-…/õÖo Ð…íÍ Tj¢¢V38€“›‡ÅS¹
-x¸*0²Qð¤$iw%4û§ØøÈ/ÁhÙ|Á“04p_€WìF¿©áÅoýÉò´X“$ìF8:Þ€LÎÑð*’—~™@“Ù^§Å°Upl)žŠr]Ì×~l›rÈÐÔÙoSª23Ü&˜‡æ ÍÉ¢ÞE­+ª/ØÞm¨tÁ†PoÞâî¥t„z.pœ‰pÞB‘ùJ
-UX?¤£æè\T?WC\ƒ´#ê÷"½^ü›̇ðUB¹¥7g­¶oéý?o‡;¢ÆÓë3Æ|yôíÃÆmÝ^mpÓMñãJ¤(ݹKdš";ÔvxŸ³¬Ù¯PóxQÂqnýäkª<"E*êûÅ~W¶ž–™é5AZaJì0ÔX¹ü—m[_-yçS±+ë= ·Ål̃“¢:Th#§ó=Æð—g V€k4Å´îE½Ùø@MA£ä@tÛ"Aø˜"4®=ÇH$Î ½ò^¡*ÉâyIÒœ
-<´‚Ã;¶há‘S¸°'<ͺ©é-Ó‘œ¥Ä‘Æ4
-c0»\ûEÂhùqô‘*í rw Ǫ„AôPµfZùgV‰fÐ\ÓbßÖ¨ ŽPsßb»]—«}5z\
-¼®é².œ¥‹ŠÞ„
-"ã FÆG<‚Ú¡¨•=ıVÀü*<ÜVX>µ›˜Röø\oB‘£K¤«-ý2^
+xÚµY_sÛF÷§ÐÛÑ3§íþ'Ù<¥‰“s§ur®2s3m(‘²9•HE$íúnî»°
+•¦z²>³Îgé)«³_Îþ¹8˜ KÇüçL"\¢ãj=æ@—
+o´ ,«¶Ø.³Eû‚½– ~]”Ýeå*›¯Š¿ãAJp±· %Tٺșk¨Îë¤çº/W+RÑ5éhoYé¢ÞnÏUͦ®ò²º¡ùæ¡i‹5±äÅ2ëV-Ml³ê¦xã$Žj²½/0~˨dž}eÛ ™“©Ò©0Ò&0R"uN ëûŠÎ–u5ßÓ¦ìpër2ÕZèD§a ÈžÞÙi—o¦›z ò§^Êè?ô fÒPImiä3î ÿû&Ø#í2ýëdh0Vh“Wu[|>µÚGëìfd5þJèhpô54ž3­é–Èú›”zQU»z ú* "nXâ²Þ2±è¶eûp®”Š Álb£·4•My®@ D3—ÿ.ú¹MQ嬻®è{—m˺câ&›Ž9p  AÝ`DXÍ; “F÷ ¬Šm¶B³‘Lû^Ôë5¨#Ž’W,êªÍÊŠ~d-M®Š¬áyåMbiÈG… ¿IÈA&ÏK¢¦Q½¤YpXÐXo€Q ÜŠgÂjVMM£öTì0òFyN¿¡R¦8N~[TD„ÈÊi´Îhr΢ں&B³ÎBâ
+ïcÇ 0,Fœ …ôÎ…úõ¼ øü¼( l` o‡BF v˜ãl¿KÀ@e„Ñq|˜Ncp†e`
+kRÓ‚,\W`¸*AÐW4Â& ”].yÏÝâ–û¯„(?p 4Úí#ÙhèüªÅªË - WªˆÊIÍئX”?ÄaC• &s¨·‹¶È± ÑlS´4…ÇŠ„¯]±} R°
+Ôø„7kèÐÈpQì/ðȼ
+¡ôšš««P¦½&J° Ç:ðvèÍ Hòê3Üä+À27Ö´âKz¸>…‘гÅxëÝ°LºÎæDÞíàQžÚ4Ìš SáuÙ…iìRŸN¦û?•¼:õš<îý[ÈŠ½ð1ÄÞËwÚ¯8…#)^C ðŸ†åbaµÖßF”‚~<Iô·‡‘¡ä'`Di‡ºƒþR‡ÖTQïoA(EÃðn‡ƒ‚y ‹¶DÉë‚ùCÓŽº¹ôy(EËï1?[*u±¤¡/ü±ƒ
+üI7òZÑÔ Ìø?ð¿¢å,=•!ƒC~]Øü_Äá;YbÇê¿Üã«ÿ
+ºy 3ŒŽÃç8éE¢Óš-²Ð×>=öìîÏ¥Ì50ý9”©
+endstream
endobj
-1337 0 obj <<
+1728 0 obj <<
/Type /Page
-/Contents 1338 0 R
-/Resources 1336 0 R
+/Contents 1729 0 R
+/Resources 1727 0 R
/MediaBox [0 0 595.2756 841.8898]
-/Parent 1322 0 R
->> endobj
-1339 0 obj <<
-/D [1337 0 R /XYZ 56.6929 794.5015 null]
->> endobj
-374 0 obj <<
-/D [1337 0 R /XYZ 56.6929 769.5949 null]
+/Parent 1712 0 R
>> endobj
-1340 0 obj <<
-/D [1337 0 R /XYZ 56.6929 748.5275 null]
+1730 0 obj <<
+/D [1728 0 R /XYZ 85.0394 794.5015 null]
>> endobj
-1336 0 obj <<
-/Font << /F37 802 0 R /F21 714 0 R /F22 737 0 R /F41 939 0 R >>
+1727 0 obj <<
+/Font << /F37 1018 0 R /F22 953 0 R /F21 930 0 R /F41 1208 0 R /F62 1352 0 R /F63 1355 0 R >>
+/XObject << /Im2 1341 0 R >>
/ProcSet [ /PDF /Text ]
>> endobj
-1343 0 obj <<
-/Length 2667
+1733 0 obj <<
+/Length 3302
/Filter /FlateDecode
>>
stream
-xÚÝZÝsÛ¸÷_¡·£f">Iâ1—8©ozvêè¦ÓÞÝ-Q'©ˆ”}¾¿¾»X€"eJN›tzÓÉL¸
-7òùâ—ßød Ûþñ‚3eS3y„gÂZ9Ù\h£˜ÑJ…™òâãÅß:½·né˜ÿ:°Œ)nÄ©’Ykô¸Z§¢X¬•=-‹ÖqåÉ°b(êp¼1PÆÈÃñJ9‚Y˜Ãóµœ%Ž51Î<¦ó½F;NËL¬2
-ÎŒ’`¹ã¸™ÎbÍá]ŸÈÔLK@Oª¤óÌäóD0®­UÄÔ£Ý^>pß_määm ;šô6Ïú’ݦbÙì ã‰6í,ž¯óéLKeËå.o¨¨Ùæ‹âWÎe¾¤·EEÏØbÕ—¬4‹ÁíÞ Ÿ÷ùPÌ£§YSïwSÉ£EXÖ7(N˜T:ø®Þ¶EíÕÞŽ} XMê îêvMÔÏo?gV-QÀŽƒ
-³|î*èùRš@³¥ã°ÖÃã*m!ªÏÑV¬^ªÏ€®Œ_q:<ú'üu ùöá1Ä¡äú
-È™mÖæ4õ‡3Å1uV¸!eZ eQ›¢õok¯„R(²oê}åë•_PgKÒÒ®³v,wöt¢7¼ÉH¢|RDóÔ´ù
-ô[¾$Ž°~ ï;¯éúãX0é‹Ú=—
-L®‰ÏwEVÎð7¹§Ù¿°£*æLÚØœÕß1=7`€©Ø0™@CÕ·àc™= ¿”<|˜€—!™Àôl¬—ÅÂ]ËÝ;g.½ÜdMëR•ýõ’î·ðtŽ–ÄP»ß8a²XÑ„OŠ¤»È¼Âj¿¹ó_6'3c˜R‡&‹Pµ&›SáwÌ{‡/-ãè/ûn¾Ù* 価Ÿ<­û¤
- Ø‰Ä‹?Kã-XŠðçÀc{"›#™W$Ý«{\ãuqᢇèÇ`d ߆pÐÐUV†»rS€økeþùÅHy÷³ËWÿ%Hï«zÂTšÊq¸+³TÚ$…î7êØr£RWõdÄôfŽ¢õendstream
+xÚÝZQoã6~ϯð[e fIJ”ÈÇm7ÛKqÍövs(îÚ>(¶ kK^ËÞ4ýõ7ÃÒ’-{³×îpRä3œùf8$­&þÔÄä"wÚM
+— #•™Ì×Wrò}ß_)¦™¢YŸêÛ»«oÞ¤ÅÄ —ë|r÷ЛË
+i­šÜ-~Ir¡ÅfÉwooßÜ|ÿ÷w¯¦E–Üݼ½Î´‘É››¿^Síûw¯~üñÕ»éLY£’ïþòꧻëwÔ•óßÞܾ¦GÅ™Iß]¿¹~w}ûÝõô·»®®ïâZúëU2Å…|¼úå79YÀ²¸’"uÖLžàC
+圞¬¯2“
+“¥ihY]½¿ú[œ°×뇎é/Ò€l"•F½ˆ­ÒÂ9“³•` %ò\eçç¢qæâj1œê`Þܤëj=QJ8c4š7×"-T>)Œ“çdÞ[T°§tÂä™BB%a ‚{Š·ÓY®’;ø¯“sÀœ²ÐH¦„M5rž|œ(!3çR¢éÕýJð ßܬõäu ë™ô–æõ&öKÊu°€S BîP±yîå}_U€¡Â&åªkiuyÚ”)XàžV·Û–M÷0U2©¶S-“Y×î}e^ñØ>ÃÌŸ[6‹‘ù•© Ó7í®~x¾<)¬ÕI°Ç*Îr'´uvÒ³îŸÃ "Ó¸
+ ©!‚`Q$«ö¾\QÓªîvTó†„Þ›Ÿ˜x±ØN•Mª®£ñ“ؤ)×Õºjû‰P¤Ùð4–FòÆ-OÐU ܾ½»yóª¯CùXy‡
+OIR|• W£En\1ÔGX2¸ L¹ÅªEƒ5ÔÈlÀòÕC¹_Òj„ä 4.]ró@0ìT*·Bk“¿T…–ŠiÉçqæº#–õ§Še«j*GxÂþ {ØÙ½WòÒ™&¨ÃÝg ~ÿ5M[3gÂ"¶´€ªm½¨HŸ©2È#º *lD…ÐJ†Ô$ni¦zê€-pL#’£N¤Ä´Þêäç%ª#Í䨬Y!]_ žéyõç yÂŒFá&ÍRÓî •];Æ6ƒm(‰ØPÔÞ1ºå)G˜ÔöLvÒzKÒ:¢ØÇ5f€
+o§¢IR¦_†ELÛõ‹89G'¨ÁPªÜ{¾:ìÐ÷ ¨ü¿Úm¶db´ 4s–rl‹‡uwX ×/8OBú;ÐCµÞì8·`×Ú¯`ц3°¡b×m^ÒVF½:›~
+IûP˜¤R •J9ˆTR"•T© ‰T0ÐG*°Ec}¤’„­)bˆ{8RI‚—Å*a€å¢€ø5Lòÿ­´ƒ¤[js`}ªó
+ð~U~B¥úp%¡ÓN y"¶‹zîä¾ÏKKë²Ûù`•ªþxM'[(ý•Ñ‚Ðo|cý@ ‰w]2Ãf¿¾ç+MP®O€-{€«%Él]‚˜a°§'×xÌ÷íÝ>Ô‚°PÝû»'¬•T鹉¯!µ¥Û+l££5N·Ši•ÓY‘%_ñlMµ{j·èã¾lOõb·½Û¸›: j`«÷·¢Xå l‹R@ÝK©A˜‘haxפµ
+F@ãzSvGszXÑìÌîi‰çÄ9OˆòW>ž$Ü
+áGG‡XÎ<HM.6r åÅ•úÌñ2.ãÂ9mõGp-à<ž›ÁqW­Tâ·D`T7»
+wJ°÷xŸ—|ˆ$‡à ®ˆ"{X»T|2ÄæM ëªyÛ,¼2¯:ÙÉTXcŽ¶ÓÑ°¦åù ¢@'ºø̮էºTÕ‘zk:”"Š²"ÿ w¦a>ˆ(:y†¥ÏýÍ£]
+²‡» Ã]ÿ 3gªâÈsãSÑa¹ø
+C!>">°¹ Y =‡,èsßÅ·¤sŒVPÉ—ÅÀ"+ì‘B΄K“²P—ÃIŸê|8‰Tý§6Ÿí=´ÛuyšþjÓô²‘jDŠa¦"E^dùP zúTÎô^üœã†€•{î'[aâ=µTYà5®MxA‘”Ö}=¶w¥…°. »È1ž`‚‘ É ŒlÔñ#ø‘_+]¸àÄœ›çu
+[Mt
+J*ü=‡ÊŽîµïÆaç ^FÎØòwJ˜ÜžÄXcy[+|B-¡‡}ÈRBSÄdÉ´T.*0m˜œœÓS³<ĈK|N¡g¢£u¥
+b{6aÕH‹P7C?k/HŠµŠ·é”!¦~YþùªH^ß¾§¾!¦VŸ `+‡Á–^Óü³yl /r4$¨žúckÒà öBd8‘©ø€²)çXvÿ¾ýiŽ®äñ'#x§>PÊ©ìZǯ‰ÔXr¹i»®¾_1)d`-÷SÁ:£8ÔÂZõRÔ[!U^Ejæ¾nÙi‘TÞýõxÍoB:Mîý!CqPÛøs ÔºýßÒªï¹5ô¢ûg:`§U¹ƒíØ?nJLôŸ¨“ϾJ§|ÑŸ;°ÝA†4[œ§‰[9ôYñ;Óý£ìõe CmóTÞv38dŒ»zêÄŠÌöUÌö§7æcêO!îÚ­è—˜twTÒ;¼–iO«¾õ‡%Ã(¦Ô?Ösº„èÚnúyj `hÑ>u4þ ¾ Ç”ÛÓ’kbdõ`Î"wÙ`õ…E|
+³¦p_S3§T”Žß€îïVèárQ5Ã_±”üûžþPahÙ…SÆýó “ ñ.5ñ¹‘§Q*ǯދæ™_¦FàO
+WPÈÓ´I
+Іý_ãe˜$endstream
endobj
-1342 0 obj <<
+1732 0 obj <<
/Type /Page
-/Contents 1343 0 R
-/Resources 1341 0 R
+/Contents 1733 0 R
+/Resources 1731 0 R
/MediaBox [0 0 595.2756 841.8898]
-/Parent 1322 0 R
+/Parent 1712 0 R
>> endobj
-1344 0 obj <<
-/D [1342 0 R /XYZ 85.0394 794.5015 null]
+1734 0 obj <<
+/D [1732 0 R /XYZ 56.6929 794.5015 null]
>> endobj
-378 0 obj <<
-/D [1342 0 R /XYZ 85.0394 460.4475 null]
+490 0 obj <<
+/D [1732 0 R /XYZ 56.6929 672.8271 null]
>> endobj
-1073 0 obj <<
-/D [1342 0 R /XYZ 85.0394 437.5053 null]
+1362 0 obj <<
+/D [1732 0 R /XYZ 56.6929 648.9121 null]
>> endobj
-1341 0 obj <<
-/Font << /F37 802 0 R /F22 737 0 R /F62 1062 0 R /F63 1065 0 R /F21 714 0 R >>
-/XObject << /Im2 1051 0 R >>
+1731 0 obj <<
+/Font << /F37 1018 0 R /F22 953 0 R /F62 1352 0 R /F63 1355 0 R /F21 930 0 R >>
+/XObject << /Im2 1341 0 R >>
/ProcSet [ /PDF /Text ]
>> endobj
-1347 0 obj <<
-/Length 3382
+1737 0 obj <<
+/Length 3226
/Filter /FlateDecode
>>
stream
-xÚ­]oã6ò=¿Âoç
-d›ÿQn[êT‡í€ˆˆ,¢P¼¬)ª–†w®)–uµ¦*l£›ÍÀ‘Y ‚&¥ðÖª€äªXç‡MKŒ ¨ÀS%ℵR8)Ó™“VèL¹3¬  EŠ8!§D9BÈ‹w/e&ÒNg˜‰Ãû,’J‹ÔH=<ý#²Gù¨*›gÈ­ÏHFjE¢ev*ŒûèÐÔeŒØ-G쇑#ûa´c?LöÃ0wyØï¯e6'Þ‡mƒnÍ‚Yî¤@,ûiÅHk?Ï7›ú©XÑL[Óó® g}h›6¯VeuÏÐ-MäÕ35îËÇ¢¢¹¶ÜhPœej⼧Ǫ¦ó
-x!½íj¨»D‡€;ž'^a‹™=ÕÔX•k¼ _¨¥‹5o¦|—v"ó&z/Àc<Á§,³à7¥ ¨1Sz!²4ÁlAóy¿I¥°àj:¥$ÆÜ© ùvZì<ØË¡3¼Ëø÷4;±±6c·æ€°$÷`Ðx†u(ƒû€ªî „ü‘Úd ñ¹*`z[V NÊ :ˆŸÀËU#&î¥%2%ëñ„I“d(êv¨ágù¥!îÃøŠ¶k¡Q ×B
-H½ÿô#l‹¦Éïy48Êf°>„Ʋè.ÉH®hI$=Í­¦î¤@ÿ
-|ç…Ç’áˆ0+‡¹LüÁÀèY±qœ3 Kƒuõ”37ÀšÌŸQuí=Ø
-“õIÌü§?¥Sä×£N´:½Ä »¡g¾iõ‰îQ5L ýðÉbÔ…Ôß—Ë0T7õš‡þ{m-ÈЪ~jh«*"zöBî
-ÔA ‰Þi-Àç!›¾x|5qþPN¼pκ!AƒŒìeã؉dT˜†c€ «öH…°ÕS!'‰ BظcȾ
-!è"ÍÉ„t©rž’ŒÀÃhÕC¶€d­i›(ô,þXBÐÃü_ùO96ŸÊÍfhòiÏ5†Ò‚ým\7(%±sUéTƒµÕfw‘Õ«Tøœ§V/Haê‚F¨¡FOV¦T&ŒÑò2ÔÃ$R ™Ï¢°Lz¥!è+ƒ\’ÉÑœc‡d[=Y Ý
-ŒXqèŽ!Odo°~ÏF35SãàdM±âç)€W†°IÛnëPê€>FNÔb— µò|eß**F¨”Oe4ßjÊf ï\Úó
-:y•W
-‹±0Ñ\£Æ®¤ƒV¬@¬éèc¤å<_­¸âÁÈ%j¶™ød“ С²€åó£¡Öí»ÏÔ
-YRÂo݈®©œß¿šŸ|Ù‚µq¨„ÍᲡ7û}rd|ˆö’A;ÜõHƒ0ðÍÇ­š½¯áF³þ¥xãEçp©ôä«môLRY˜„òÇzƒVU†*ÄM~®„’šTž‡FÁ0›2ÄÀ0¯á¡E¯á¡Aqȇ@tx¤h[R=è±ÆQÒ): >{謯!Èa»:r-9Œ"–×*™ÿ†hè
-ß‘õ¹ü×GiSŸ€•?~Fô×Ä29`fn*`©^x- ê4¤ËãêêŒ![<¦'¡µÎðuZ:ëŸpZG¨ DBÉ‹önˆHWÞi([§ &räT@hþUf8E‰ïª¸oŽ¥©‘þ<)lM}å
-ñ¥3…C°®Âd° #…w°æTôùSÉSÔÿ%´)endstream
+xÚÅ]sÛ6òÝ¿Bo'ÍD ¾>¦©ÓsçšäR÷á®í%Q6§©Š”]÷×w ЄDÉɤ77™˜ `,û ñ ƒ|âtÆd®&6W™f\O–Û+6¹ƒ±ï®xÀ™G¤ùë›Û«×ï¤äYn„™Ü®k¹Œ9Ç'·«Ÿ§oÿùæãíõ§Ù\h65Ùl® ›~sóþ[êÉéóöÃûw7ßýôéÍ̪éí͇÷ÔýéúÝõ§ë÷o¯gsî4‡ù"¬pf»›]ôݧ7?üðæÓì×Ûﯮoû³ Ï˙ăü~õó¯l²‚cÅ2™;=y„Ëxž‹ÉöJi™i%eìÙ\ýxõï~ÁÁ¨Ÿ:Æ?¥]¦…2“¹T™3°Æ(—YÆ4pmnuž)dÏeÁǸ±Ëݾ¨Ûu¹oçU}|d.mf·“áº'»÷X#Û‹Áö\‰L;™n{_ÎæR¨é¶ø£Ú¶Ô¨ÛE¹'¸YÓ·ªÍ¡^QãϦózúCó¾èZ5‹€¹Ÿ¹é¡®«ú. 4õò°ßϸ›–u·yšqΧ($Rx²€Àv´ÂÑ8Ïr­…§yU®‹Ã·azúPl%U‹s^¿SC¦[ž9©,°
+§rF()cÂÚ„(Ì›zI¤-RL³† k9&M˜u|G[
+¤dÆs—·ï±FöOÈe\@WB€× Åóg ÂFÔ %˜¿4ìƒ
+a‹T¡
+!:©xB`0‡*„¨gTˆ4ˆµF¤7ÿ_¿©¿Ã°)µh‰ßeÛµQ è[þ±,ÛЇIï¿Ú‚¤yð±ÚIX”Ã5ׇ¶\e(žŒX…C½c#h°ßtLƒ%Øi–sñ%*|F
+a™`O.Jáë¼öX©îHgçu{"ŒÚdÖåæ2=Öɉ ϬeyJq˜³gaÄFFÁrºCΞÍ96HÈ¢ozYÄy^±k0Od/™¿Fs2×`€…ÊS9\ûy Ò—³iAŸ»ê¡¬ ¤e·MWR».¶jË=šE°Ðh¨EŽœ…*ªüŒP ¥2kxô bÌfg¹µfà$û,¯
+i¦Õš)î´ª¥ðùËêÆÍÓüX´Ý4d, Œû É wúȽhöëCmÒ'Ø  ;&bà@ ±"»ã #„:äÿ܆ŽÄc;ŒÔŒø¡*žâH(:ÀHôÌ>„(›ÃŠ¼3t£B¡2-¾”#<c¨c÷e‚厂ÛǪ»¯©ò)%ÊfV³ÈfâÓD…ÂFj›ýÈ:°«3:çù3º³y dà°~KS¼>Óƒ¢wwؤ
+W>ƒ›ü>IR¹øXûÓ>sÁw¼¾ÙŠÉ· œi2<V\y>\ÚŸË$É!œ&w (à9D>Œ"Ÿ› Vî+eEæS‘éŒèý eÀÙT>†žUS|ôvh»ª§é =eבöAƒì5ö’ZÑ`óÉÞCc=ƒ8'˜Ö#ïBaÅ@b9lúþA[Dˆ¡Ê-äNo/úëd2±ÌäLNæυᯓlÈæ2}Šs~!´Æè^@À®øåȺÇ:cÉææD,”Vîp\G¬BÃh•<¢¤¯ð´”°TŒùgm2.rþE–|´s}%÷Õsyj
+Iž·B݊º0ÞüÚ¶ 5ÍÑ!ª9›IÈ£Œ/¤EC¬ —±(6é染áñA>.Ò‘FèHï<·ë“òý±µHP¹¯ bY3(âà0¸Ç62ø%tòÑг© ¦]¬z,Uæ gƺ/uÇFÆ)ë¢Ú´èz5æg!ÊU4Ú(Ì‘ÛÁwç*s¹ÔãņÃ$i{¿[1xÖM
+¸{kùßã&VÔX:?ìÎ9/) TäÂò—¼¤
+sL%HÝ
+H#¤$Òç0$³2¥å—6tLؼ`A+©:YN¶Ée!Õ¶¬wL;&¡$ï³àól8¢Þ) ÉEêœ<áãÎ l¥evàœH/Xe'¬:~³=&“ÖõuåKÎ)†-\ŠÌ‚¼Ú .ÈP@:5@—ƒ¼wƒ÷~’é””D†r5åLBËOþUÛEûàòD˜œ
+“ËÂÔÒpÀ¤ùg'M@Áä½ Köa&ô
+94ÚQǹa)û›±?è‹e¤2P7cOŸ
+„5JQçÛƒoŠï©]òÞDatGÎdfEË OåØ“DlòGœ_˜f¡ä:üa‹Å„í®èªEµ©º'@ågÅÏå™\^¿Òyñ‹HĬ®Z?8J‚űK{÷H—7çÌ·‚ ôâîÇɌ̤6|ä}k~¡È‹¿äï Ø›ÄÞ0””Óýï?(‰ÔaÛ¾nŽsBÝ‘©|Œ£‹ðc/ZæcÏ Ò“Åo[R±ÀN߸½y÷êÝů#c±Òb/bR±‡b±×8*öš˜Jà6áÁÒôïs«¦ãõ^“ãO3ž_ÿÀÄ>ºIü=—G3ª§¥MZÝ]nŠƒ”“Šª‘R™Xs@†2Ü$eg…±æRµ‰öò?’ã‘y°Ý è뛾è‹Ðxe‘+ˆ™ó¾^ùb¶Ò 뽸¶¯÷"Ð?k*»’~ÙuæÇyRgø‹ºmb}BñÕ?Ü{þU#Äí&‰qG
endobj
-1346 0 obj <<
+1736 0 obj <<
/Type /Page
-/Contents 1347 0 R
-/Resources 1345 0 R
+/Contents 1737 0 R
+/Resources 1735 0 R
/MediaBox [0 0 595.2756 841.8898]
-/Parent 1322 0 R
+/Parent 1712 0 R
>> endobj
-1348 0 obj <<
-/D [1346 0 R /XYZ 56.6929 794.5015 null]
+1738 0 obj <<
+/D [1736 0 R /XYZ 85.0394 794.5015 null]
>> endobj
-1345 0 obj <<
-/Font << /F37 802 0 R /F22 737 0 R /F21 714 0 R /F41 939 0 R /F62 1062 0 R >>
-/XObject << /Im2 1051 0 R >>
+1735 0 obj <<
+/Font << /F37 1018 0 R /F21 930 0 R /F22 953 0 R /F41 1208 0 R /F62 1352 0 R /F63 1355 0 R >>
+/XObject << /Im2 1341 0 R >>
/ProcSet [ /PDF /Text ]
>> endobj
-1351 0 obj <<
-/Length 3017
+1741 0 obj <<
+/Length 3298
/Filter /FlateDecode
>>
stream
-xÚÅZÝ“›Fß¿BoÇV2ßÀùÉqÖ¾M9kßzýp•ä ´¢Œ@håêþ÷ëžžA !¯SÎÕ%U¦™izzzúã×£å3ÿóY¢#&S5‹SiÆõl±¾b³G˜{{ÅOè™Â!×÷Wß½‘ñ,R#Ììa9•D,Iøì!ÿ9xýWnî¯C¡Y`¢ëP|{÷¤ôxýþîÍíÛO÷¯®c<ܾ¿£áû›77÷7w¯o®Cžhß 'áÂonßÝõöþÕO?½º¿þõáÇ«›‡~/Ãýr&q#¿]ýü+›å°í¯X$ÓDÏöðÂ"ž¦b¶¾RZFZIéGª«Wÿìfí§SöS"‰Œ4ñ 4‹$Óük–•‰µb2½,ƒS‘‘Q2½,‹¾c Ë‘þ‹±¨38Cef¡ëh-ŽÇ+ÄŒó(…1<_Îud„Šg±Öpè†øMlYÓHÅ-'‹´
-Ä#ÇûëÐðàþÁÍé P)t2‹a¥D
-k›Ùo31•¦’¸´ÝíÑ
-và»Ûµ˜ýÐÀžfÃmyÉáP´Ý—·å¶˜0Ð@2`SVçÛåu( ׂÍŽ^òŸ<¨›Žöe»"ª[DdUWlу:ëÜX·½æ0S·ËkÉœF)m³Û.<GCϹ{ßµEþI3Ö ]5»*wtÑ‘éì†áÆÝ‘Á>@P*…ÝÖ.Ïíò 0ÄÕ‘
-¥±–ÓÙ›E £À'ñ1ºùDòî¹ìÁ÷žÆâ yÍ¢ŸÌY'öffÃEÎ4ñLªŒ¼/1‘‰c9Öå•õ`[øÚ«g߬Wƒ¢ ;˃ré¸VŽ½©Q•mWäD—µËaCƒ–D¼ÓÅÀe3œhŸ¨Hqå?[feÕ:ÅÁùÏ—Q*cæ# ÕâBARND¬Æá|á@¦ÔÀJcs&~W¶T!gœy:ùŸGU¹ìD@ ¹¾àEžë<)>v#8zƒGÿ%ez® mFŽ”‚¿©ÄŒÕùÔ¢ $>K$éÈ¥püèR0yt©–¦7‰-Âl¦m±À™§²Ø·N¤ýÆ l7Å¢ÄTdf»Ué„åÅ2ÛUû
-ò×¹‡„51zä u3qè@ ÷¾ÔÀþ¶P¡
-:ú²£ç`EͦW`Å"ÕNÐv>±V)©<Ï/L³¥µŒ»„‹f½Éºr^Vew
-ºè4‚ºçcŠÖ² ÷ƃåÚ2Õº¨;÷ZtnÍ4Ì
-àsj¼!¾Â !e&¾|ù=fÖ3€@YçÒà%;§Ã"shÌ€XZŽÑÜÜ¡±Nl[æyá
-Ÿ˜k¬K»m†éq¤*ÎR´o¶Î©RI#Ô­¿\û/.5±
-
-“<y®‰UPMRÛ¯þ…M¬’ZÈÿA {ü…V©$ŠS`G…?6UæZ6›dÓ@D:âDRY
-¦¶qüƒ) ”ºÜ” ùÛüæÿÜ”ÉTD\%_2Ž‰Ÿg¬©N Šˆ`²ú¯&±Œç
-‡lÚ@°'`è‘ïÊÏSÙN
-wù&Dx5;b€Ï&IûíOt†éK²§¦ÌŸ“ ®¬ ÷üZ™VKó§´ …L/4²X¼u¢ï—¥'
-—b´¬°l–lœ
-Bëÿ¥c†ŽŠõI¿w»ÎbÕ4-Å!¬fS,Œ–6Þa
-”Hã1šecEÙ˜(,(* ¸
-
-îš®€œ ¹pÁ|^´%i䤹ŒŠ¤ $²ªmˆ}î¦è˜
-ýçM]¹•íQL'“_éžK ÚÖ‰]€`&þxg¯zìQðKWJD‰ã<3æ°=Žhº}lIn_¶ñÅ™}Wç™õc²‰ž{Œ†#`Û¶xéŽwUÆr(kÐ+IDZAGÓ<•y‘ûRï@Á<[|Þ“„|â’ú$Áû¬¾iÚ¶œWnº-WôI'6}ƒÐ_üSh_(MGꚎ÷›AˆG&mW¬ÝßF¾Ý¦Vd]NñIgò°r w|êpoöèf-Ú4»Îêƒã÷Kí~ôà SÂé
-•"<†hw‘U=?eÕÎvDqø‚œ¸Ò`¿*œD× !&Rà©>¸ž Õj+c â¯î=œ¨ Pš¸îo|øÛ©_=ÊÄrX2q­¹[ÓÝŒUÖ`¯Ì½€9§~e‘<^÷qËXñD¨©‹a :棉þZ@;&|É»¦­Z|„«×N»Çò1›ºó«½”ëÿ”eß³þí›ÿbæøçD*Žd’ˆéFA2è½±À;¥pãZ_nNÎTÿ/`å÷endstream
+xÚ¥Z_sÛ6÷§ÐÛÉ3Šÿ.OiâäÜiœã>õú@I´Í‰Dª"eÕ½¹ï~»X€¤$ÊI&íL‚‹ÝÅb÷·»Å„Ãÿbb,³^úIæ53\˜Éb}Á'ðíý…ˆ4³D4Rýtwñã;•M<óVÚÉÝý€—cÜ91¹[þ>µL²KàÀ§o>ܼ»~ÿÛíëËLOï®?Ü\ΤáÓw׿\Ñèýíë_}}{9Έé›½þxwuKŸläñÓõÍ[šñô8ÃôöêÝÕíÕÍ›«Ë?î~¾¸ºëö2ܯà
+7òçÅïðɶýógÊ;3Ùà gÂ{9Y_h£˜ÑJ¥™Õŧ‹w _ÃÒQû Τ²rÄ€R è3Þ›If<³Jª`Ày[ÊÜ´~*¶Ûr¹,ªøžÙ4§×M±½n:û»®Ò‚íá—§²ØÓ’yÞ” }œ?Ó³¬«Ý²¬è5G»vb ÌÀdFg°'Ô«ªÛòþyÖÔ»í¢ˆäÃÍXŸç&R7mÞë¢j‰ÿ¾l˸ö±‘6S*cR0ŸÌ#Ÿ°½SaR3žy…ÁÎOgŽ$Á£|¬Ì’ÒóU½øL”…'*‹ºúçòa·ÍÛ²Ž_qfU°c§ëÎU†qñN§\ˆ!7ît< 9¥Ïò¢uxÅaZqÈj–”›Yå™äN}³3=8'Gæ€ —Ìnƒ…n64V‹`hÎŒ’ÉÐ.gVLïà_9=‰Fg™‡˜Xã˜6ìfòçD0®½WD4‡½ö6?^¯åäm ;š 7φœÃ¦ìð¸…ThZMlÆ™v 4ªü©^å;ÂL1J”õSÉ 4Ì«% ŠH³*!¾Â̲."=Ä šÝfƒq¨ÁsâLѶ!Ìð%xS˜¥(" Ëå¶h"§ûKÅ£?ã©CáîÍG
+¦¦^\J>ýŒÿms J¸ ¶p¸Î»Éð”¿Ïqx„õ€¡³ú¾Ï­gÒC|dh µTî š²L g+4SΊÞaÅH6ê¨N@ködÍ$g@bÈúDD4¢Às)ˆveÔ¡¿”ŸÇàN¦¾[Á¶R%ê|æ»–ùfNÙDÀªéI,i¼÷ÊEC¨< ½þ–!Và‹˜<`AÑ°1˜V0i‡Ò¸]Ûe}a™ƒáœO{û‘ø}¬·QÖ/e®ÝZ8«¸t×ÀÁèÙn¹™AèÍÑö³Œië|·ýSµ@ëd$ÈŸêrù%žàÌZ ýµ<ƒ–ö›´œIEð1rú¾œ>Ò÷eîγÌó”ñšM± ãU6TðX…qd¦õ=ÍÀ¹ê`r€üçúQ¶Ié’HO¦H0ló–Fûrµ"ºP¥À Ø%òå<"Iÿ)ŒÐ¿Ñ»Q dܧåÉi¡T\M?Å ÆiŲ ÂÂhÈõÞg—ôqû3Æí Ž;úÙpÁi Ÿò Y¢XÄÄÊE?Á“®òJx¡>|Y‘ipÒkmèÐæu
+üÇzT¥äOy¹Êç«øš Œ_(®éeY´Åv]VÅ­+ (æ‡/Å_ùz³*"Ä`Ùv$á¾^­ê=Ž#eQp\=ôuwÀOÍ…¤™Àø/=¶yõPÐPÉÌ:Zc”yEãÿ½:Lâ\ ÙjÀ$þêD„Áé(b@A"ŽŽâhÁK•ì,¬¤Q‡SL8Óã.Îîâü}8‹z=VµBò…¼p©Ê×ÅrDÀ^ᬊT–(Ã%`ùŠï¡9*GêП#γ4ÿ„ÊZ±h{$Ãß•‡ÿ~ 0‘à¾:3Ù!˜ ‘Åa^Ñ´ˆü/`!SÑ…Ë6xÌpÚÊo
+rìäÂôcþ BxÓ,èò‡¼¬vqzzS·`‚2jß—ES’F‘[DT†°ÀA¾jj"ŸÇO´$BaZ^W«(9Å8 Üö+êEÇ¡«ï‚ëL †!a³ï(ï”Òñ(ĹK -™“ÒàÌX˜Ãö´H¬ëMpmâÛ¥m|‰fßUË<ø1L ©FðmS¼ŠÇûX<ò!
+•¢z «ÝE¾JÕóS¾Ú¥e}‡/˜Á‰ÊO÷Eä{4Ä8ëƒò$IÇR[[KÅ ‚dÒƒ#R“0Ý­x?bN¥Lv2QÖ<Ê$ÇQY½òøæÇ%Sý…Ÿà½µpRˆEç–<ES@8`ÛuLø’vM[ õJ¯¢våC>n‹Ñ&Xqͬæòд»*âˆR:ch•¢C
+HÏš.àœKåœ ÆÍôCìqDò
+éªÞcá“Â|Ap"<ôeï
+*°Ìgæ› )«cØé%Ëœ•G7kHd cìªß—
endobj
-1350 0 obj <<
+1740 0 obj <<
/Type /Page
-/Contents 1351 0 R
-/Resources 1349 0 R
+/Contents 1741 0 R
+/Resources 1739 0 R
/MediaBox [0 0 595.2756 841.8898]
-/Parent 1356 0 R
-/Annots [ 1354 0 R ]
+/Parent 1747 0 R
+/Annots [ 1744 0 R 1746 0 R ]
>> endobj
-1354 0 obj <<
+1744 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [471.1233 313.2012 539.579 325.2608]
+/Rect [442.7768 538.094 511.2325 550.1536]
/Subtype /Link
/A << /S /GoTo /D (query_address) >>
>> endobj
-1352 0 obj <<
-/D [1350 0 R /XYZ 85.0394 794.5015 null]
+1746 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [361.118 266.807 409.8647 278.8666]
+/Subtype /Link
+/A << /S /GoTo /D (configuration_file_elements) >>
>> endobj
-382 0 obj <<
-/D [1350 0 R /XYZ 85.0394 371.6561 null]
+1742 0 obj <<
+/D [1740 0 R /XYZ 56.6929 794.5015 null]
>> endobj
-1353 0 obj <<
-/D [1350 0 R /XYZ 85.0394 347.7805 null]
+494 0 obj <<
+/D [1740 0 R /XYZ 56.6929 595.1873 null]
>> endobj
-386 0 obj <<
-/D [1350 0 R /XYZ 85.0394 119.9702 null]
+1743 0 obj <<
+/D [1740 0 R /XYZ 56.6929 572.1218 null]
>> endobj
-1355 0 obj <<
-/D [1350 0 R /XYZ 85.0394 93.6238 null]
+498 0 obj <<
+/D [1740 0 R /XYZ 56.6929 347.8106 null]
>> endobj
-1349 0 obj <<
-/Font << /F37 802 0 R /F22 737 0 R /F62 1062 0 R /F63 1065 0 R /F21 714 0 R /F41 939 0 R >>
-/XObject << /Im2 1051 0 R >>
+1745 0 obj <<
+/D [1740 0 R /XYZ 56.6929 322.2744 null]
+>> endobj
+1739 0 obj <<
+/Font << /F37 1018 0 R /F22 953 0 R /F21 930 0 R /F62 1352 0 R /F41 1208 0 R >>
+/XObject << /Im2 1341 0 R >>
/ProcSet [ /PDF /Text ]
>> endobj
-1359 0 obj <<
-/Length 3265
+1750 0 obj <<
+/Length 3299
/Filter /FlateDecode
>>
stream
-xÚ¥ZKsã6¾ûWè¹jĈÉÚÓÌÄ3;©d’µµ•C6Š‚lîP¤"Rvœ_Ÿn4@‚%e²år&ºtý øŒÁŸ)é,ÎfI&#ŸšÛ6{„¹7ÜÑ,<Ñ"¤z·¼ùÇ‘̲(Ó±ž-7ÁZiÄҔϖë_æ:Š£[XÍßÿøùçÿ¹{›ÈùòÓŸo±b󟾿£ÖÇû·?üðöþvÁSÅçïÿõö§åÝ=Mi·Æ»OŸ¿¥‘Œg½¿ûpw÷ùýÝí¯Ëïnî–ý^Âýr&p#¿Ýüò+›­aÛßÝ°Hd©š½@‡E<ËâÙöF*))„©nnþÝ/ÌÚW'ϳ(:ž8À˜O Ê"-baðPWå¶ìÌ·/ÄÁ 2‰Îà‚”û[žÎÍoÓv-ƒPÁ»ÔmÍl¥ófO#Ý“¡Æ6ÿ½Ü¶ÔÉŸó²ÊW•›Ë·Í¡î"Ç?8Ö<JµTN€µÙ䇪›TÈ(KSOr´Gü­œ~,w­—Ü‘•5®9[ ǧAéœG™R±]nÓ؆îþåÉÔÔ¢Õ¡Ñšý³Ù»i»(vùŽ4Kp60æ襵i‹}¹ëÊÆ-×l¦Ž@±H‰Äo­-ÿ0Ç:'b$<™%p_:Iø_Ѻ,Ö¹E¿â"\òT¡DœF*fjàleÜ™bâŽâ8’Len#tä£mè8â\ŠÑ6hrÿ8£Æ} õ=ý„#Ý8Yù?˜b8yñci$KAõR9’æÄòzª+2œ®†2DNë˜(Z—EŠsš\’ê
-P¿ªj^Êú‘ºÕ«¸¯ó£fŸw=QûÚvfKm2Û¶9 Z oZƒh=‡=5:ϳηÆspª £;»BS˜¶E­frþÐxºA
-ƒE‘1Ú5ºsçÛ¨íÇöt‰¦z¥>¨Ýæ€Ø­Å<w49=^rGcý…vn‚0_{ïäÎBREŽÅš¬àj_©yƸc‚ìÀ†¾Ù|upÑ%Å›z^ä55p1CMâ€-{œ@½ÏËÖMzú‘OWO×Þ^¡å 6 quâjrGô6£ßæVMPžWšsFh]ºF}Ÿ¸»×æ
-J€³!h¾è“Bªó>©§B)þËX\™ö˜oq?ƒÄð"_O4Á7ÜvÊ"™
-=æë¢Ú$L“y}Ø®(ÈLH]àé%´Î¿6„£‰4È6Ÿ½ðåÍÍ U45ÜAGÝx@\=·*®!i•ˆH¢ÿeW“e…ž-× Åà>T¦¯\i@uáJ=•E¢./¾LÆr€Ï¼ÌÙMp7ÉYi߈õtô׃@ÿY!­Çƒs™4Ý/ÅÒ_
-Á¢”©ôGÇ Yä¹Z+´}ȥݗž8¤ŽìvÁÃýÞ&\¾dð=%[§¼eã$ŠƒSqf|aˆs6ãÆOà,EMc_Á# è7îÅ> /Ôg‚8–ÒB
-Ôãv6;ÿÙ–ˆQBä3'HÑdÌ#-!<g°;WlÃP=ñA4°ÀZâ6ˆÆ¸;Œ–Sáªh8h]nøZS­MÛ¹Á}^·yáCQ±F’÷cÇ%—ÐZ¹éüÐ5[
-ÎÁF©½t4í>AB+§ÉM^îi`Uvá®ú’+†UÄÓþ`¸Ãðt¬ÙäS¸ýÊŠåM<eÁ ðq8fÔÿRVÍêµ3øDø¡8ñœW¿Ä††¦k+<Å`”é“BÈùbG’@¤g£b±²@Œ¼(]Ç!4nY¹þÚt®9UàpSî(b é–j¬$"­×±î)øã­>8ܳ֎Ûdq&.[{HuÞÚ{*{SÅî¬C ‘0ˆ˜/2ï©&¸Óò4Òi¢Æì—¾–Ôÿõ`çЦ³>¶sé•ÚË÷?¹Á¦®M4d}¡q¨'£ºñP’¦Ä}ð„”—¥GJý±Ž!1êÀ'M™'QIëµb —2Ò,¹R_ ©.ܼ§"S±ç°^´MñÅLÃ|¦.ów4ì!>\ŒùÛã„
-ºn^&2ª¾ráoÞ&Pþ´ÿ÷Oë†ßÊ®%§Ž?d/”Õc}êQÜoðNEÿ˜"0Ûendstream
+xÚ¥]sÛÆñ]¿‚o¥fBä¾
+Ö>lýa•’÷(é%ÚÄ5›–_\ÓtÕônß”uýLãå3%%èIJê1y»ûÐûpýes¢íÎ…—€ó¹ëÝ6yaÌl1™‰²Ö^6«!Õy³ŠTÈ:(ô¢ú¶ñ§^ÔíýbÒÄ2™äV—ÙˆT|ŒL,Ë’<Ôˆ‘»‡
+¯±Ð¬ «yÄ-»¶v½ûëõÂdf^õãérµr»Þ_Žš5Oß7tŸa¯×äž‘ÆbÕnwp˪®úçk)%Ê"×Ö«,^9øäÄÊLožy}iRZ&Z¨`t(僽€&EŸH%·`xlèPàuÛ±£a{¨KV©Í¡Y‘œ¼‡àç ìœÕ¥‚—RÆ\Ö¥!Õy]ŠTçNyªFF(s™ƒH5Á©i«í˜‡/Î{ ã…†è±qà¹òi
+Wûj×·ûŽÜ,ð' ×|I€S¨ ŠýïhØõëªE8Íç®_Ë´"ãäËoíÜšA´u|.-¹¬îÙû§‰Ö§>Î5íáíÙJ Ö¡¤Yˆòê@Ôf˜÷Ú 8ߘؔ+×Mº4•EZCM¹L*µNŒAU é‰óJË·Íwëš,ɲ;N ÿ´~(cD`¡äuŸœ·8HÀÐÁÍœKÇj툀Æí–+ ¡„[”¿2¥áÊý}KAJcà?ÇY |[
+âxfNÚRÙ©/ PVáÚH &¸33t渳IÏd²ÀD&¬ö¿ìX»® [ú>í܆c½øÂå%nÎÅ L…øJ¯=°dÞ!ªæx:Î/hN~’ym=õ]ë: ¶4£¨Mwl²<”]¾}_³/w\e!c\fýz‚›uût¾¦RøA毸æ!ÕyשB'f…Uõt{ô…Î/ï©&iu
+³y*ÇP§×Øaÿ¥ˆsœðYp›ç}®8Ÿ‹"ÀmšÐ÷ÌißPþ¤˜ÿåÚ_?â|Nª”‰…NEqT
+w­
+yÒýüLq§æë²/ òŠO®þmK 'tÜÆÈ$y‚)Ÿ¨aÊ›¥ÇWc0'~AÊÁã‚+N~y)*ÕÜ}ÛU¡mãATzºW±¤„S^’’š9u¥ÓùÇÛ_ˆ4ÂÞ¾ìÝý3MP[Á„l( ‡ÀŸfÉj $¶Lä¾­ :RsD™ù" >9ÙÐSŒð5wY£ÜR°zW6è¯'[モoäK‘!òØÞ7 §øaàÞgÞ€¢Æw»%jV2®Á¶ñ½€žX<]µ§îî>òVÇ[ñ 2=Rð_
+Š©£®6¤ól¨‰
+ªË¥Õbºé‡¦«îê•KŸaÜ»=/ˆþY|#_wù?ôá˜-©$Vùæªçã™jBC#ð>®u¨l²¡©@WnºZ£;Ƨ ‡¯Á,ü«‡
+®ºq]Xªä7ºÃn×îy°m£rØð‰!­è¹¤O–:þàªp©$_ø@¸éÉÏB»¶«úŠê@MÂǥለÔsÒ›!ÔOo xBþÑ-à€
+Gsò5Cê˜Âö¼TKhX%!ÌMC˜’†Áë Š*IÄbUTíêÀe垨–Ñ[ž+Ú»ÀnMù•ï4îJtuøæÙž|ò
+sÐ{á^@¸ñ5èÇkmTÿgCª´&QJ¾Ò¦R©‘*d»”"/ «<¸©ž–ÌEq™ƒH5ÁÂiOK¦Axà Zp®N0q³Ð^V»þÁ={¤ôØ f›šÅŠHÍïÞlFA·
+v8ÉÉ4’S2 f†(“ð23U åÙ™OeÕa`žø9€2I!²lú×
+‹Š÷Ù“€2RX}qÿHô’±æ‰±E6â€?c[5,Ј±ÇÁg€ä¯Ûàó)¢dóϤ.U{èêØ6õ-Š‹Çá§öP¯ <D¼aLKÖ1î¦FgSß±ð'ñwi1‘Rr2¥ÁE
+cþ†ôh¼K
+OœëSÎSm“Ôª|‚õÿÿ²½)endstream
endobj
-1358 0 obj <<
+1749 0 obj <<
/Type /Page
-/Contents 1359 0 R
-/Resources 1357 0 R
+/Contents 1750 0 R
+/Resources 1748 0 R
/MediaBox [0 0 595.2756 841.8898]
-/Parent 1356 0 R
-/Annots [ 1361 0 R 1363 0 R ]
->> endobj
-1361 0 obj <<
-/Type /Annot
-/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [361.118 743.8714 409.8647 755.9311]
-/Subtype /Link
-/A << /S /GoTo /D (configuration_file_elements) >>
+/Parent 1747 0 R
+/Annots [ 1753 0 R ]
>> endobj
-1363 0 obj <<
+1753 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [347.1258 350.3535 404.2417 362.4131]
+/Rect [375.4723 594.4187 432.5882 606.4783]
/Subtype /Link
/A << /S /GoTo /D (journal) >>
>> endobj
-1360 0 obj <<
-/D [1358 0 R /XYZ 56.6929 794.5015 null]
+1751 0 obj <<
+/D [1749 0 R /XYZ 85.0394 794.5015 null]
>> endobj
-390 0 obj <<
-/D [1358 0 R /XYZ 56.6929 484.9636 null]
+502 0 obj <<
+/D [1749 0 R /XYZ 85.0394 722.9644 null]
>> endobj
-1362 0 obj <<
-/D [1358 0 R /XYZ 56.6929 460.3339 null]
+1752 0 obj <<
+/D [1749 0 R /XYZ 85.0394 700.3281 null]
>> endobj
-1357 0 obj <<
-/Font << /F37 802 0 R /F21 714 0 R /F22 737 0 R /F41 939 0 R >>
+506 0 obj <<
+/D [1749 0 R /XYZ 85.0394 132.4925 null]
+>> endobj
+1754 0 obj <<
+/D [1749 0 R /XYZ 85.0394 107.2061 null]
+>> endobj
+1748 0 obj <<
+/Font << /F37 1018 0 R /F21 930 0 R /F22 953 0 R /F41 1208 0 R /F48 1228 0 R >>
/ProcSet [ /PDF /Text ]
>> endobj
-1366 0 obj <<
-/Length 3380
+1757 0 obj <<
+/Length 2635
/Filter /FlateDecode
>>
stream
-xÚ­Ërã6òî¯Ðm媃'G'ñdJ&³Ž³{Èæ@KÅŠÔˆ”=Ê×o7ºÁ‡DiR•-W™F£Ñhô €äLÀŸœ¥6:3³$3‘ÒΖÛ1{¾n$Ó,ÑbHõíÓÍ7ïu2Ë¢,Vñìi=à•F"Måìiõûü»Þ}|º¼](+æqt»°±˜ûðá{Âdôùî—ï~øíñî61ó§‡_>úñþýýãý‡ïîo2µÆ+æpaÀû‡Ÿî úáñîçŸïoÿxúñæþ©[Ëp½Rh\Èç›ßÿ³,ûÇé,µ³7hˆHf™šmoŒÕ‘5ZLyóëÍ¿:†ƒ^?tJƦ‘U&ž-´‰ÒxLjYD‚։͢X+ÝiYÉ)-*Ôò6ÿ²XæË[4ÅŸîtÑdìÕóÙüÕ„
-ñe2åPJØ7£ÐX±Ü9ŽÄMû`}´ØMþŠ¦‚W
-ú Qãw ›WÀVW® ¬rÑv»zÏmÝñx­è za^Y8"„*dµË—¸Ó‰°ÓÇ)ÛÜÕMÑ~AR“ò‘¡4óÒ5 µÔÏ õ󷼡ü°ñìè {ïˆ#5×2«šÐÀ%"ÌCE˜œš!ê ê­h7„ÝʶؕAʽ5Kµè¢å‰Avþ;°Û•…yÐhÜ.ÇQ©íÕ!Pˆ.`ZÁn/|Ì$'¾ûð¢ ʈ_¹uR£à©Dt–È9[ÆÆD‰òzJR]N©•4ËÝ¢,šÖU‹Ïw˜HªY$‘]— £ša”Tc¨G,äÒ‘ œT³9 B0I³Ð^W»vã“^ÚÓv
-ô ¸Z°-*Ž ¬VDjû°%Ý Ö¾r%ÁìC í2ª5‘±>ɨË%ˆ„“@ªl½ýaK)ƒ¹•3çêˆê¢Ü‰P^bÚAhYW-…ê’û6õÛ¼:ôôÝÇŽº‚(QÔUXæ,e[„¼[¥)éoE8ÈñV¯¤$·'ð-ä¾Pñõ–û¹t
-¦Zw±{ž]7n—7”qö_Òì…Ê’ù¿Ñ)8t`'…Oî#Bš¢JÂOÈÂ¥«Úr2:íó¢ÁÄLYehÿ e¢LÄXŸ&T׉§Çb[Æ‘”P| zݾ¨WÅ’<òéV¢äÍ'j>@òØCÄk.ù©Õ*26Ö×ýtHuÙO;*sYR±°(X„3GZR}]„ŽjB†±£&‘I³x,Ä›°šwRP‹±}&ƒôàë @ÖÏM]B0—sÊ+ñü#ÍkQ B cf•6dǾ’Dø­>”+¹"¬_™¬/NV]ö…cJ|b”Pj*’–>ªd… …“ €P8è@®ã„uÉÄFʘŒ‹–Éý:Qr*#abÊœ¢:pq¯>;â„}*
-3Iòs’ ƒàûã}3³\ƒ@W_ƒ@#ŒŽµþ c]ÞÔUþ\òЮl¸?ÍÁpX
-Ø34… /§jƒ±aWd{@ tØåòpÝqÇU¦¿r5¤ºì‰Êèc ÕÒOÔQ,ÍuÑ„ã<œF6³z,Ÿ"²Á…K¯À.é$  ²‡káhþ‰(»%PVÝ]ÊmJ H«P ˆ+*8OnÒ¦g¹Mkªá}ÊÒ‰ˆ´³±Mw^%³ØÛ'~Ñ«ðÛsRP@zExt0o µ%›÷p8š7~ɼ˜÷€/›7òFóÆoÞ y#{oÞž|>í4‰=¨øó6´=iÆW/* fì‘t ƒí
-1ÀÓÁÉ;ÙžÝKÁ3ñ©pj-”¼µå{L
-´_‰yª+1/Pá²›–‹•as5è EˆŽjBŠÓ°'dr"ƺ2Ôî„Ãvw†žg¦.ëºéåò=ƒ:'S!`]XñDk{äLª¹H}‘@O›Èª$9ñ'6€Xœ^õiï’ÂýrcäÓ6^‘PÚ¶b”¶‘Á8mï‡u¨qÛñ…–x7®’‡Š[ö3KAŠ=³G)@E&ž©ÄDq&ì_y~BišN??Aü‚4ñ^4N
-„´Q¬L2S±ŒL,h§> ¬ÀÆFzJHŽZ¶‚_ Þ“ó'ø¯æ÷gš¦ZAZT*Wû¬?û<Ã`–i¢À~±½<⛇­š}_Ã’fÃU΋!k¿®xü¬KLH  öÂвüÃT›Ç[Ç#nÛ]鶮òÇA¨èË›
-‡ú×»5=µÄšoð ²r“3qhHŲú‘º–%.¬ ýLß6®\ãÑÊtåäi²`56 ÷1íå 2vy÷½Éó|øŠñɱty51§‰“àýùjÁ/±:ƒú79¹8^íñšs"\Ì RêHÿWàÅWÍÛp–éYžÛ·”*‚NÛÏL¯ìírs&¤à(Bý… ¿&¤“RœÉ±Þ<Ï÷b_¢U¸R£++P¥Åé¯ø׆>üÆþN šý‹&4ú’ka9¿÷Ï:Øæ´(¡–(i,9 v¸2˜²æ©ò¦{Ä} nñ L÷]‹$Ž 0JÇõ懺ZTî…/ä” ì‘/êÿF¦¼Ïb;°$$?z#è+r%º^@Ñ+^èðJPá©XQÉêßËüѤ+¸UxÁZï™û$‹f*ZxÖ)
+xÚ­YÝsÛ6÷_¡{:y&bðE˜<¹©“sçêܹ¾§¶´IœP¤"Òqtûßo P D)í$“q,‹ðÛ/ˆOüã“4K2#Ì$7*IO'óÍ›¬`ìý÷<³À4‹¹~x¼zýN擘Ld“Çe$K'Lk>y\ü:Í‘\ƒ6}ûáþÝÝûÿ<Ü\çjúx÷áþz&R6}w÷Ï[j½¸ùù盇ë×)Ÿ¾ýÇÍ¿oh(ó2~¸»ÿ‘(†>g„>ܾ»}¸½{{ýûãOW·ý^âýr&q#Ÿ®~ýM°íŸ®X"N'/Ða 7FL6W*•Iª¤ ”êê—«÷£Q7uôü8K„ÌÄÈ
+ æIjL:ÉS“dRHw€»ivûë™LÍ´¼æÓšš}`ìšë©Åžž¶Ív]¶]9/:»ð E]Û µ'.Û©n:"‘˜jOäƯҭ½ä­Ý•Í¢œy^Ù¢.ëU»*“à©ÃÖgœ'&M…ÛÇ/[;/—{7 ¯¨M©Õl»$ª%Ë~cH^ž·nèk—8º´óÎË8̧FkwŸqß
+a:l€Ôièˉ¼(öC» ù‡ ,)ò4, DËJ“ªn¨øRnž7ØÉhq¢;3’ÐÔ‡u<E+&ÅÙÙônIŒ­íˆUF{_-ÈÜ€NPÀ‘
+#VîÐà ±õ¦èñ€MBš3Øùüù²%f©
+pìˆèŒ¨EWySÿƘX=ï
+ã`
+R*ÏàŒ¾US,ìÔVBOo–ÝIB½@iÉXD ÈÁÅ{Ýžìªô+!*l=s;½eJ‹OÏãC“Š
+\nžˆ\ °®<Ñ©!F H3År 4J¡<>@¾Ç§ð¿˜ž:K Tq•Ë$n/“O8$eà”OÔv;=œ€#¼¾ÛˆÉ ìgoÉËE‚ÝŽ²Q •¡’¥Y’g>©¿o\ú¦§ûk¥‘ï”›me7¶v¥ #ÔôõE4´Ìɽ«Ì$Dô$>Ùo»,HbÁA­=;”Èߥáý3­äeG¨D
+ •ö<K¸€xÏ š>:‡Ül°„ýˆƒ
+•Å•›~㪜áJUh
+¬;êUKä'ëb’í§ç¢ƒT)÷¹1[âì+0 Î×MÓZ/¢ Oí\%Ž8¹³t¤a´ÞiIqvÍ>!tŠ.‰âäd$½ÅäÂði‰µ
+Ï\:Ær}OCó
+7Ö…qÏßµ¶Zb]¥úLò8Ð3@Mæ-²;=J%Lù|‡y¿¤wÅGëµ+ê‘u
+sxš_,(Yš)ˆ^"×QZ»³m;â*™æb"ó,Ñê’Åð-sÝNà,–xŠn ;Ï«ºðUtóõIXçJl©¿Ÿ‚½Ä¯hÈ9dí’™§‰¯Rðpî©Jæ”`y0v­§ua ¿™{ ƒn‹/L®æ‡Î!Ó‚<…Oo 87
endobj
-1365 0 obj <<
+1756 0 obj <<
/Type /Page
-/Contents 1366 0 R
-/Resources 1364 0 R
+/Contents 1757 0 R
+/Resources 1755 0 R
/MediaBox [0 0 595.2756 841.8898]
-/Parent 1356 0 R
->> endobj
-1367 0 obj <<
-/D [1365 0 R /XYZ 85.0394 794.5015 null]
->> endobj
-394 0 obj <<
-/D [1365 0 R /XYZ 85.0394 590.4054 null]
+/Parent 1747 0 R
>> endobj
-1368 0 obj <<
-/D [1365 0 R /XYZ 85.0394 563.4931 null]
+1758 0 obj <<
+/D [1756 0 R /XYZ 56.6929 794.5015 null]
>> endobj
-398 0 obj <<
-/D [1365 0 R /XYZ 85.0394 179.4044 null]
+510 0 obj <<
+/D [1756 0 R /XYZ 56.6929 439.8265 null]
>> endobj
-1369 0 obj <<
-/D [1365 0 R /XYZ 85.0394 153.6629 null]
+1759 0 obj <<
+/D [1756 0 R /XYZ 56.6929 416.0359 null]
>> endobj
-1364 0 obj <<
-/Font << /F37 802 0 R /F21 714 0 R /F22 737 0 R /F48 953 0 R /F62 1062 0 R >>
-/XObject << /Im2 1051 0 R >>
+1755 0 obj <<
+/Font << /F37 1018 0 R /F22 953 0 R /F21 930 0 R /F62 1352 0 R /F41 1208 0 R /F63 1355 0 R >>
+/XObject << /Im2 1341 0 R >>
/ProcSet [ /PDF /Text ]
>> endobj
-1372 0 obj <<
-/Length 3131
-/Filter /FlateDecode
->>
-stream
-xÚ­]sÛ6òÝ¿B÷tôLDŸ'Oiâ¤î´NëøæÚ>Ðes"‘ŽHÅñdúßo P Ù¹I&ãàk±Xì.ö‹b³ þ±™Ò©.x1Ë ™ªŒ©Ùbs’ÍnaíÝ s0s4¡~º>9{+òY‘šëÙõ*ÀeÒÌ6»^þ™è”§§€!K^¿¿|{ñî?W¯Ns™\_¼¿<s•%o/~=§Þ»«W¿ýöêêtÎŒbÉëŸ_ý~}~EKÚáøéâò ÍÔAzuþöüêüòõùéß׿œœ_w ïË2ùtòçßÙl ×þå$KEaÔìYÊŠ‚Ï6'R‰TI!üÌúäÃÉÂ`Õnòe)šG(YŒªHµàÂ2°oïÛu{ûx:×Y–|Š͸H –ÉÙœ±´PŠ[@–™—v9/ü‹ Ä—“UÐWB 0gL¿¤@L¶÷í™GO¤Å³·œ—@ôyZn,ÌC½^ƒL Kî·§Ì$ÕªÚÒ¸«¶Ÿ«m‡ž´ M6UÿÐn?Ò€eÔöwAmÚ®Ý"YµëuûP- âæ‘Ú;
-]¿`”–PAÝ1™
-K®ážX;À™å :%ÀHe™Á£gŸf,ÍdQ
-úö®{؉³‹ Ÿ½iáF³àRñ<Äl/¥C[
-ÞoYõÞÄI³î^@NĽá}nvˆ/ËêŠ:½³cõb©QÊÛ¡í蘷[‡x¢2
- Ƹƒíå²èîÉ3Ûj]¨™
- ³
-N‹Û[g›®‚
-èäMÙyàÖá€éÿîhH­"G?Sw~«åñjúiW;X‡iàq <ÅšÔ¨A¶¹Ä r^$_
-c]„꽑٠nÍZKoæ/yhã¤vÌèC'ÀÍ¢aµö7¤.Î5 ¼ò#ÞWÊ&F
-©Ü”=$#XVˆFÌ£qÀø Ä(s¡ÇD‘$(…Ђy~cʇ©!–Ü:ÓÔ;Õ=ÉìMC3›Ö[u÷Õ¢Fu^XOO†×
-ƒiÅ7¥Ùw‹J ‹<#¨—"Çóµ€{ÙÚgÉjä¡ßÍ d4 C
-E
-øžó»~nˆùÝ)ޱ߼ßå‡zÍArW‡GDü®ƒzŽ’lß1Ÿ—6‡F1´÷ÔYƒp×Ä´ 7ë'%Æ$èQ1d+O›&¤Üì:¿ïªõŠ´Ff€-“z¬5hËEÎmÌécR}¹_׋º£e
- ÚŠ0H”lEHˆÎåw¿Ðã<DyøB™‚7Wùþä£f„™Ò@0ˆ?ŽHñ9"±ÄÀyÌŒH’‡@µ!”UÛT$,Œ#p¢h©SQÆŠ>SçŠb@D²E¥€üŠÊ\Ý×l6…·“ô‚'¿“1ÅS,kŒc¾½·* °ÛTÛlë¬Òñeòêõ¯Ô¡t{ö^ЖØ@J^u=Už¦Žƒc)C=ãØ 8NµR<ðà4Æyˆ2æ4TŠ2 Ž;60º…
-!]:‚!ù˜°<
-w8rø®t@7•  gé©–øX4¤æãÍÜñWÎÅ’„Œ0„8¸GƹãmÔŒ[Ñ|D’gð@î‚xÁ€=‹~‡iƒ`˜VÕ›º¯?W4Ü–¹Ì§å4ðŒøÃØ„?Œ‘B
-¬¾ÚÒ¤\—Õ—žà6örøáÒì+n8XÎcvtLlf_Úu%P“°sM“²3.iÉQ„¦ši§×
+1762 0 obj <<
+/Length 3018
+/Filter /FlateDecode
+>>
+stream
+xÚÅ]oÜ6òÝ¿bßN²
+?%
+yJS;qÑ:­ãÃ=´}we[ˆVr$m£è¿©¥´ZÛwñá`’Ãáp8œ/-_0øã £c&3µH3kÆõbµ9b‹˜{ÄÎÒ#-C¬.^ŸÊt‘ÅY"’Ååu@ËÄ̾¸\ÿ½ûðö×Ë“‹ã¥Ð,Jâã¥NXôÃÙù4’QóîãùéÙû^¼=NUtyöñœ†/NNO.NÎß/¹ÑÖ GáÀ‚Ó³ŸOzñö—_Þ^ÿyùÓÑÉåp–ð¼œI<È—£ßÿd‹5û§#ËÌèÅ=tX̳L,6GJËX+)ýHuôéè·`0k—ÎÉOKk#Ò
+>'@ʼnÒ
+ÏÌ“˜Kc,º¼-è„]ÓöUÙõÔûÔç}±)êO tE@—-–ÂÄ™I´¥H¤ŠÚcn¢¢»kêΎȨoh&§î矨ÿe[´nòš\Á2ÚF›kÜl«¾¼«Æ4[ ¬F£«Æ¶ëŽþÁ4»¸è á„uÝ´›²¾¡Ùü?¡À#sgZ {ä®@>3å·)zÜtI)éä“u¾qPW´_‹–àû²ªÜ<°”WÕõhÛ~ÛÖÔŽ€¾_Ùß–ãYÙÝ ôsyM ËcÕë¢/ðäp4êÎìŒFÏ ÏsµEz,® p3RƒP½àÀFkÐT»²meÓ:•Ñ,œ{ÜnP.Køž<+¡dÌx²HY§R[ý¦¹öfAÀEð <ú2ħ÷2±GyùT¬ú²©‰ÿ8Ô”!ÉU,”s´÷0¬'Ù§æd*$²Ä©0´ªÊAL^[+R%œmÖ¯»m¶Õ:ÄËÛ6¯o‚ ´
+ß$Ž–I'»€N^åGn­™ÎðŽzÁ­ IèdÊÎ/µò1^M¿lK‡ë( R# „»X{:k‘U«’à¹è~ û ÷.ŽØ¦ÁâÄ$jðbû6ŽƒçL”òvË»È}'ÁCL±oà$øX´ªÖ˜b窨š{ç—2¸¼ü3žgòzŽpö&ËGe rÝ·O6¤&]$€.„QωDøpcæãå@q’Ü2$ØK¤z·3²¹ÉûÕí“JÅFrñ‚LzŠO1©ÒØÆÇL¸JžÆ2‘Ü ¼^Óí”58Rg›zwceO—§¦‘MãÍöº»bU¢>¯¬Ÿ'Ëkà,Jš±ƒmÅG•ðε@e©cªo¹y˜á}œ
+ó‹òU¿Å¬Ar̪ÊMÙ—_ êî, g.±ÃaÇ9u:#ùp>‘礀¸í†µ µàÄÀÏûm®¯çNE—/²iaId” B»i¾NF†EWÅMY×”ERóÑ|HÔæf2:›â„>_Þc›Sãªe!ñ{Ç…·æ¯¨¤ÔSÒçHÏ$¥]7nEg«1N²&ê]Vß“€S/LHúÈö”{ÜùĘ8UL>aqY ÐÚ…–Ë;/`Ì<ÅeHr.‘
+a0#‡·u¬öÏœ¢F×)çë 8ÞÝ6÷5W@¢)£Î¡PV!y(o­eôÛ ˜€?QLÀz95NÃ$Uq-u«|@a$͹R«?®Ô©×I€‚ƒÙ¾+è"8UyMwˆS.HÑ阬 4´÷‡zz–¨õ¬zz!”ŸxùÌ\ÄNZ:›JKžñ.áqÒ¸º¦ÇX6ì®Üî>YšAÑSiÚ‹Ðøˆp—ž9afN˜3§™¾e4ˆõ`Ë–Àu9ªccÑ4xÁX^ %öúTñɇÁÀzî¾(&ŒEY¦„Œ3üP:bíõkB9;¥ÖÊWõFÐ
+vFÇüÚË'ç]—­ßóºt
+ÙÚWâ
+SiÔ•›²Ê[´E í™Ó#æ¡G K0=©“%ÖÅ]›nÁˆÿ-T©8‹¿9..‚X—QÎp0¤,Hkˆl%WLz9"èCÄ!B‘å_mxƒ”áHWj”ÙŽÆX´8DØ ã×4 ³t K±¡v—yA' g‰‹™gàM`äp÷F¸/ÜôC!h&*
+¿_?ü*¨V:÷Ó6©c5ÿÝ þÝÎßý³·ÝoñÙ1âÀ<–€¡ÌRÏž8ÕS·ßÇí³þoòÒ!endstream
endobj
-1371 0 obj <<
+1761 0 obj <<
/Type /Page
-/Contents 1372 0 R
-/Resources 1370 0 R
+/Contents 1762 0 R
+/Resources 1760 0 R
/MediaBox [0 0 595.2756 841.8898]
-/Parent 1356 0 R
-/Annots [ 1375 0 R 1376 0 R ]
+/Parent 1747 0 R
+/Annots [ 1765 0 R 1766 0 R ]
>> endobj
-1375 0 obj <<
+1765 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [213.6732 432.1255 286.8984 444.1851]
+/Rect [242.0197 702.9298 315.2448 714.9895]
/Subtype /Link
/A << /S /GoTo /D (rrset_ordering) >>
>> endobj
-1376 0 obj <<
+1766 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [209.702 354.4169 283.4678 366.4765]
+/Rect [238.0484 622.4676 311.8142 634.5272]
/Subtype /Link
/A << /S /GoTo /D (topology) >>
>> endobj
-1373 0 obj <<
-/D [1371 0 R /XYZ 56.6929 794.5015 null]
+1763 0 obj <<
+/D [1761 0 R /XYZ 85.0394 794.5015 null]
>> endobj
-402 0 obj <<
-/D [1371 0 R /XYZ 56.6929 498.9148 null]
+514 0 obj <<
+/D [1761 0 R /XYZ 85.0394 769.5949 null]
>> endobj
-1374 0 obj <<
-/D [1371 0 R /XYZ 56.6929 477.595 null]
+1764 0 obj <<
+/D [1761 0 R /XYZ 85.0394 751.153 null]
>> endobj
-1370 0 obj <<
-/Font << /F37 802 0 R /F41 939 0 R /F22 737 0 R /F62 1062 0 R /F63 1065 0 R /F21 714 0 R >>
-/XObject << /Im2 1051 0 R >>
+1760 0 obj <<
+/Font << /F37 1018 0 R /F21 930 0 R /F22 953 0 R /F41 1208 0 R >>
/ProcSet [ /PDF /Text ]
>> endobj
-1379 0 obj <<
-/Length 2398
+1769 0 obj <<
+/Length 2587
/Filter /FlateDecode
>>
stream
-xÚÅÛrã¶õÝ_¡Ù'¹Á¸Ø<9[{ãLãmµÎd:›} %Êæ„"‘Z¯Òé¿÷àF‚e«u2† xpn887˜L0ü‘‰3Í'‰æH`"&‹õž<À·÷gÄÃÌÐ,†úîîìâš%´¤rr·Šp)„•"“»å§é»ï/ÿ~w5?ŸQ§Ï„ÄÓïnnÿêf´{¼ûp{}óþ§ùåy§w7nÝôüêúj~uûîê|F” °žz G\ßüíÊÞÏ/üñr~þù«»V–X^‚™ä·³OŸñd bÿp†ÓJLžà#¢5¬Ï¸`HpÆÂLqöñì-Âè«]:¦?ÁŠ&#
-ä$R % î„F’Qf5ø¯ó™ÄxJ4ED*D/(ÿ¶?ź©>A“O¢8 i!è3˜á&/.ÜÇ›k£{T¥›Xi]»á»ÁzKŠ2¤ Èp
-%©"Jwß_ݺѮÎÜ
-¢ý³º†)G‰úSffêtõ°‚ð÷÷>‚ÈψÑ;ÚRx‚QY5npŸ¹§±¡l‰Ü1íÅÒö˜&·,òº È—%‚{\k!F©ßFï SÝ÷sxÔužlÌ€{™JÂ\
-`ò"—G0 œÏëÌkâÃv ª¯3ê©($N¸Eòócf½‚˜®wE“·ÎÉ›GeŸËÚ¤n6†hvÛÒÚ |ÎËà{<xY?Ù½3ß¼_Z§{7qïÑ@xZí
-7gÏ.<ÁÁ˜>ìbzÞ߉©ç)ó~Ðú³øñë#[²)Ò…åš3àÚ’åÜc€)oÒÖ8¿[5ýpG#œüív ;0«ŒòG4/0 Õ¶nÒ&[;·$7ÙvÛÃ
-Œtò§MnÏ@X9áÙrÙêÁ…Xw
-H@„a=ÃÎÝbë àY¼õñÄs’ž~Ì<|ZÔ•5ãzS äÇ\]„sx¨4Ɔ‰Î¾fðLp$1á&©š˜TÚ}Û>LÜ`åÞ|ÃÛÔ»O|ˆÕ0ñ¼¤Û[»¸3Ȇ q*cBõ8:¨Z¨9Äf8An?#Ô’÷SËrLïÒ:‰Wgk¨1ã„0
-N1‚e'UCi¥Ôx-4k1Îb”NÈsTÃ^óŽ°ÝòM¶1 JÇ"œ»ÜÇ„efŽóGÆ
-ý´KÂê·Þß‚*5æýHðÉ%â–`1!‰ ²$žP ÕÓ§PÙaŠ¤fòõ g1J«±sĆ޶隉¶#ó¹¬ä³Ó̧f¿ÉF¤·F$ v€b¡)iÜé&t‹ñ¡)MäL¿Bê¸/µ€!úͲZ§yyàiÀJµÐú¼Åø‚àŒh3&¹FJ%º/y:G¤§ˆ*%cß0žAWoÌS÷ÎÉ…d¸&s*”¶f*?'S?4ç97§4[BeÆ”ëfÁ2[¥uü’zÔ}÷“I8ö—·ÿw Ró`»È¡sÌ)Ϥ×{`i“µ´ìÇ£¼é˜7u„·„!NÛöoòyÞ¬uF„@á.™"²ŸÄôÙ ÁÖ;BÏ®y Þñ8acŒc–Òž‘¿Œ°ÍA2ÈP€EãbÓº;©…1ññˆ†fÉXI «Šì!õ™û—´Øe­“ÞŽ0§`ìe£„˜è6¹ò‰êÛWÍÄxL¨ŸP‚µ:åð2®
-²ž H\Þg è«+ü*…ÂÄÚšSé¼W pœ ‹ølóIl@â´ÝÍïõC8,`ÁÓß«2Ëèͪ"Ci˜HI'±j^§n³±P¨.}>eXq|1ìçì¥Ä°€aíªŽ´\ºÖƱ"Ö{›Í·(p[ÔÕ:À8BƒH’ðé3jäyŽ:µ‡.âé(Ê£j‡RÏ(ðŽ«jx"\ʸØ/Š|ñ§©Ý×ažJ\íÊåÌîìáf ǯ }3Í”½öÓa­í‹â§¼yÔ’ÆïÃOf¶59ó~cfk^LQº +¦£ÍÕEµÞ䶰dp®Mj°ÎLüb¶
-aBe_§iñ”îë~‹ø¸ß}&ÈÙ×eh;GéC5žîçcÄGFnýxÜž;L™¹p~rKRš³7h¯ 6›,µ¼tõÅ~D¸¶û
-1)H;˜ |'XT3p¸@¤È³»“‡¢Ü\¤tÏðäÅìÔûú©´=Ò Í3e”&ôóöbÿõÿ
+xÚÅksÛ¸ñ»'Ÿ¨Î Á›Àå“/g§¾é9­£N§“ËF¢cN)R'Rq|7ýï]¼(ð!;©¯ÓÉ$„€Åbw±o„$þDH$5ÕI¦9˜ˆd½=ÃÉ'X{sF<Ì2
+|zóx9:Ð]­[|yIc
+:ض˻b[Ô;rWì·e×:BŽüç]ÙÔÂò ßžÊ^æ¢í¾ Èœ(À¤¨Î†g/T'wŸHà×O<wÁé»ÂÃçUÛ¸Q7/7•esdìp*4Ɔ‰‘̾ûF%b|„¤)N”ñnqÿ)qƒ›ÈmôðËxƒuÃã'x ¿ë?² M:CZi6 iâÀz¨§(™`3” w¥Œƒjiœ@Ávñ¼ž½Dpy‰öº'I¥²DýÀúk9Ú”šwãË€o!t ÃÉ,ý±öÆwÅzF+(E‹`JeënbS«qîÈ(¡Ÿ¾mªª¹o¿÷î.Tc$•Y ï×UÞ¶î Áâƒ$‚ØHüA=T,-BÊ°'4C:“ìÙòê1.c”VbâÜeFAb=˜!²Î·ÅœÈ
+a¹.»Ò†
+†Çµ.,ÛZ7†í˜»/«ÊMnón}7'–>VâtýO‡÷уþÖÃ>åob¥zž¢uÿØûD,"5b$ŸP:#%é 7)ji¦Àló"PÀsÁæ‹ÚЕc¦e¨¸ói—ÍÞI¹ø’ow• ã£vž¹MHp%V“ÆKÔË ùéàæ}bj ®®Ý×8vtî>.3£¦Ý‡<%4ø…›Îr®ñÕœÆGPÎœ}Ïo–°¾ç7j×A1¦ˆpñÚk¶”é:?´Eè·=Ä/×’±-»ÌæU®}fy4£ó“>Ù·ð¼ÌÐÉ`êîrßûË?{TÇœrp;TSPò¶±gØ„P!MKrcÖ<¹û´‡[C­õ@ÆsdÄô }’¬6áf Ó¼ºÏ¼ûýø¤ç}$ÈÙþÖyå3×|Â~®5ömž>vñ'<¹UòìèÉãÖÜ4_æÕŽì“íHÉ´·Ö»]‘[ZŽÅÅà suãË ¸WˆJC¸Álä=A£º‘Ë…Cª²hÑ©—È¡2ÙW=%(²µà'nÅ@Řþ—vŒ\rÿd”A>lØõÊÙ€5 U¸p%\îpÝ„
+08:ù5!àcµf([^2°/¯¶4ù±Ž’ˆ©€xc¶LÉ*ÓqÊŠ@ù‡ˆ+PgNLÞ¤f´/ª"7îÉü0‘Ú|]bFtŠs}lËAƒ‡c„©Ô½/`‹ÓäÅÇîÅ€0Á!)îK먹nÎÛ4…'̪«´‡ÝθFS]¸›åDz€ ¢Ø×flpĬk'æÙä$R§ yn %¸ÁcÊpã< ˜¹,=f0³íN´Ñ©I¸ Î*lrXG™üèÊm1%À¦3·¾\§?qJçNXF¼R» òÍÚ}-ÃÀ,ÓÇâ „mÁ‰ºøswÓ< ’ ª´Jb zžQó”æò¤Ç]ÆÐÎ…yu›- ŽÁôos¿ͭ²ÑCí¯càìh.¸‰,C4“äÄ+§ƒYF@§) @†
+2™e×U“?Ø»†xìÔ
endobj
-1378 0 obj <<
+1768 0 obj <<
/Type /Page
-/Contents 1379 0 R
-/Resources 1377 0 R
+/Contents 1769 0 R
+/Resources 1767 0 R
/MediaBox [0 0 595.2756 841.8898]
-/Parent 1356 0 R
-/Annots [ 1381 0 R ]
+/Parent 1747 0 R
+/Annots [ 1771 0 R ]
>> endobj
-1381 0 obj <<
+1771 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [353.6787 434.7534 427.332 446.813]
+/Rect [325.3322 626.0361 398.9856 638.0957]
/Subtype /Link
/A << /S /GoTo /D (the_sortlist_statement) >>
>> endobj
-1380 0 obj <<
-/D [1378 0 R /XYZ 85.0394 794.5015 null]
+1770 0 obj <<
+/D [1768 0 R /XYZ 56.6929 794.5015 null]
>> endobj
-406 0 obj <<
-/D [1378 0 R /XYZ 85.0394 505.3435 null]
+518 0 obj <<
+/D [1768 0 R /XYZ 56.6929 696.6262 null]
>> endobj
-1022 0 obj <<
-/D [1378 0 R /XYZ 85.0394 477.7522 null]
+1294 0 obj <<
+/D [1768 0 R /XYZ 56.6929 669.0349 null]
>> endobj
-1382 0 obj <<
-/D [1378 0 R /XYZ 85.0394 352.0635 null]
+1772 0 obj <<
+/D [1768 0 R /XYZ 56.6929 543.3462 null]
>> endobj
-1383 0 obj <<
-/D [1378 0 R /XYZ 85.0394 340.1083 null]
+1773 0 obj <<
+/D [1768 0 R /XYZ 56.6929 531.391 null]
>> endobj
-1377 0 obj <<
-/Font << /F37 802 0 R /F41 939 0 R /F22 737 0 R /F21 714 0 R /F53 1029 0 R >>
+522 0 obj <<
+/D [1768 0 R /XYZ 56.6929 132.8855 null]
+>> endobj
+1774 0 obj <<
+/D [1768 0 R /XYZ 56.6929 106.4421 null]
+>> endobj
+1767 0 obj <<
+/Font << /F37 1018 0 R /F41 1208 0 R /F21 930 0 R /F22 953 0 R /F53 1303 0 R /F62 1352 0 R /F63 1355 0 R >>
+/XObject << /Im2 1341 0 R >>
/ProcSet [ /PDF /Text ]
>> endobj
-1386 0 obj <<
-/Length 3099
+1777 0 obj <<
+/Length 3335
/Filter /FlateDecode
>>
stream
-xÚ­ZÝsÜ6÷_±Ú™Já—HñÑMœ{=çÎöÝÌMÛy—v4Ù•6’6Žû×H€úØ·½Ôž±(@ø€Ì ~ù"×™¶Â.ŒUYÎx¾Xm/Øâ ÆÞ_p¢I#Q:¥úþþâÍ;i6³ZèÅýã„W‘±¢à‹ûõωÎD¶,yûáæÝõûß^.Jî¯?Ü,S‘³äÝõOWØz{ù\Þ.S^ä<yû·ËÞ_Ýâ&ß_ßü€=g˜Þ^½»º½ºy{µüõþÇ‹«ûa-Óõr&ýB>_üü+[¬aÙ?^°LÚ"_<à ˸µb±½P¹Ìr%eìÙ\Ü]ük`8 SOíß@ºe’åü‰å"³6W§Å²EZÈL+iÏóÂy xQ3Θ³Wy–çb<^!œgúüùj‘IÃõÂä9œ¹Æó½ñ;(m–kÅ=!gY.h(>,SÍ“{ø+’£ó
-
-_×ËTñ<é?V¶Z·qeçð¥yÄ'Ú¢oÙïà©,Lp¸ZNDpÅ2&´¥íhÛ%Lé\Ÿ6íR°díZš4Õ+W™áJÓœ®/{·uuòÖ#ÅꆺºýnüRÅêùEõ câëR²Ä­ý«—³H9˜¾
-hųMëIabU?i›<xõ^°½vžO¹ßôàŠRñä]Eœ‘àÄüUY#‡OW—ç&N*{¢l¶»jCT}µuÇ
-t;·ª_<s¿
-µG+ ‹BÒÉÚÓ¶…ý;
-S$MO^¡á‡VMí§<í[7R‚bÛ²^ã˦ª?»ìЈ•¶™(l±˜:зù¤÷þ܂Ѥ#®|bÌÝœÙàåüˆkNÎß#ˆs “à€càÌ\Ød_ÓiÌ
-«¸
-|NçòÀó`t‘i> G°!“}¬Pí%ê9‚ô¡Æ=X%ú”Ÿ‡ž­Ç¦¥®®£>Z¾Tõ0eÅýˆƒjfþ&F­gk%P5¨oä|Äò?²96|Üœc<´™.”‰hÈNᄹQìÄå ‚#6?6ûvDÆÍ Q˜ÿŸæP†€×Kq_W!Æ$†ö«|!m¼ý"*CÔÂü=6»Ðž« ÊAMÑgÝo^GÚeÑ \ć fèº#I#h¡R‰'rŸ>B¼˜Îâ‘Ò
-À„¿G¢óh‰â6ŸÇ"Ø"k!cyMö@t,|ŽD€ŒžI§¸)×ÙõôªÎ£‹A7º4ž?V«³9tñãt€z¼Lt‚€³®ê²}Áo”»¦«ú
-B¥/.zÄŸTŠp¢µ@¢&MÁçî8†6Ý“ðlj/´È“gç>a—f°éÍ
-º×aöox 7Ø»-_°±*÷Q–a¡@úyï誄ޞf`íÛßï®n—°Uÿyç«!—×?}‡sr<‘8yM¤„ܦézß²¸£öâ¨ôûݺuvŒ#··]8Vßö+ïöþÀ<mI½7wø w‰x
-Ë÷]—ðóæÛ1¸Äã
-•Iuè„åjåv=F¯¿Ÿw³ýÒY‘›‚®qâ’ɳàÈp
-‰8\z2„õÅÉÄe* ÅÙÚ¦Æò?Q'ÀGI}ÔüœÃMW˜3µ»Ò‰,8XÉÿŠÚ]w‚dQؘËü/«ÝEÆé”óqíÎÇÇZ*p,& ™c÷Þ+3`ÄÛÝ&ÍÕo**ûPZö|)gºŸßvDö^[&ÿL)çu‚}ÉŠÂØPOVpżfp{f‚öu0¨BlW=¥!½¬ú—4 ?¼›2^ºYL[¤:¡Çì4Á¿ ùŸëqç«~>1 7Ÿ‰á€1#¶AgÀ63€Ð*7ØG ¸Ø÷û!å5>Æp5’ 95ôÂÂ벟dÑ0^îûf Ù fÄ©aY!äAùtµ¿½•Nž\íZ
-áµìè‰⌠¥Hwx®_êr[­ðe¿ƒ¼ÞÑD½n=X; š3U2¾Ú
-ò€Àopšgʘhû4+Üý†>­çªÿ8ªÝ36 püûÕ—œ‡q¾çO|˜Z.†’ëIð6™•¢8—šuÈäɳcCøÍÿè2~?†[ò“3ŸN!­ÊTLH)üØwlö l²¹cÕÿ¿íîendstream
+xÚ½]sä¶íÝ¿bß*Ïœt")Šâ£sçK&¾Öv:ÓIó Ý¥mÍi¥=IkŸóë ¾Vk§s3µ‚ ‚
+ÇT?ܽÿ$ÔJG:åéêî~4WÅYÆVwÛß‚¿øçÝåÍyÈe¤Ñy(Ó8øáêú#b4~>|¾þtõã¯7ç* î®>_#úæòÓåÍåõ‡Ëóe’ÁxN3œðéêçK„~¼¹øå—‹›óßï~:»¼ë÷2Þ/‹…ÝÈ׳ß~W[ØöOgq$t&WÏЈ#¦5_íÎ)"™á1åÙíÙ¿ú G½nè’ü¤È"™qµ @ÎGd1ÀIºRRG©à ðç|g®+a[Iäe[#´©«®9gYP—­ÅÈ {4D´«U‡p}ß®ØQïÇëÛÛË?åe±Í»¢®pŠû¼(nVÓÒ\Ø¢5óÍ£Ùˆ8 î͸¯ðp¦]Q¡•>ˆ d,ÒRr·ŸÝa‡'ä8ƒ¯ˆñÛØÒ¶ÅF¾ß—…Ùb£«ñ»Î áø@Ѐ
+C£
+š²ó½å <ÛÝú•ºéÄ¥i[?2¯ÙŠŽ4)Žb J®Xi.Õ²åQ8¦ÂƒgK–ã©œ òoaåvêv0[žI%\ë××縉hžL£„11åàî\óÀŠˆË
+ôGÆÁÇúдÐfK'œñHÇ ÿß8gD¾É«ªîpómcÐ˨@‘¼òâƪ°°
+õ\”äWÖämÚ¢„ƒ/_È•4çYp
+Û·´¨þýÉFXW?¿Ã±kƒ3Nnvt9–!² ¬ÛÎB%Ú"{5¸1ÐâÙ ÍØssÓºcµ°Ýy{°fisÂ^ßâ×]*¶ãÁmߢ.àïý¸… ^‹g„k"S
+¿”̤<Ñ
+2¹T¬Æ"ý¾SL©!u ‡Œóût(wa;­¹(%^ @† 2êvÚ›õT.Ä+B—hÝKèÜ?´ŽÎ_ÉHe_8ölžjÉY»*… sÂÈíÞl
+›£¸»Où€@©Á»Òy7Õ‚€žkÄÑ
+¦d“‚÷
+¶¤_Ä÷úÅÀÛ'IüÆãÙ˜ê´~õTsýê^öæøùLC*§¯sÐS-°0Ùmš@¢Ã§, ª¥ñU>û¦xBM€ÆÍG|½vVD9V²JK|[€6½CD§EÏ]%ÁC«b®d^µU"†BµLlMäTú”$°Qðát¾ë¹ ®°Ð×Ëè¹
+´GĉœFWv1FEq&íMi":ãÄ›•ƒ<Å>oòÁX›ù‚7
+øL2xè¶UD¼Ÿ™­ÉoŒ_ÐŒ©põ~’¶ƒ»#PZÅžàiu d¡Þ(©^QwOÕŒÍ=¸ÐÇÐïðèì{ÍÚQwÍË1­G%噶ohÙë[è©ö0IÊ5¤"áÓMÜá«(åÖ-6F¿t@„»ñ-àßqÀ€þFá>Ï`jW!+ôÚ<æO… Ñ„Ü) ÿX{ï½=ZŒÀ‡]ø#øóõ`C…æ…¨Šø€£I
+Hà†D=À¬¥uÙ
+,Ðv‡5¢,S--OÝ`-e¾ÛŸú}–‘ýQÕ‚“‰ûØâ»»5ü°-Qdü„·²Ï>\+Ï”½RsÎûy³þ'oPÑÂendstream
endobj
-1385 0 obj <<
+1776 0 obj <<
/Type /Page
-/Contents 1386 0 R
-/Resources 1384 0 R
+/Contents 1777 0 R
+/Resources 1775 0 R
/MediaBox [0 0 595.2756 841.8898]
-/Parent 1356 0 R
-/Annots [ 1389 0 R ]
+/Parent 1747 0 R
+/Annots [ 1779 0 R ]
>> endobj
-1389 0 obj <<
+1779 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [289.8576 239.4581 338.5646 251.5177]
+/Rect [315.1789 427.0782 363.5077 439.1379]
/Subtype /Link
/A << /S /GoTo /D (dynamic_update) >>
>> endobj
-1387 0 obj <<
-/D [1385 0 R /XYZ 56.6929 794.5015 null]
->> endobj
-410 0 obj <<
-/D [1385 0 R /XYZ 56.6929 661.3973 null]
->> endobj
-1388 0 obj <<
-/D [1385 0 R /XYZ 56.6929 635.5371 null]
+1778 0 obj <<
+/D [1776 0 R /XYZ 85.0394 794.5015 null]
>> endobj
-1384 0 obj <<
-/Font << /F37 802 0 R /F22 737 0 R /F62 1062 0 R /F63 1065 0 R /F21 714 0 R /F41 939 0 R /F48 953 0 R >>
-/XObject << /Im2 1051 0 R >>
+1775 0 obj <<
+/Font << /F37 1018 0 R /F22 953 0 R /F21 930 0 R /F41 1208 0 R /F48 1228 0 R /F62 1352 0 R >>
+/XObject << /Im2 1341 0 R >>
/ProcSet [ /PDF /Text ]
>> endobj
-1392 0 obj <<
-/Length 3978
-/Filter /FlateDecode
->>
-stream
-xÚ¥ksã¶ñ»…¿Už91xò1ÓéÌ%çK¯m.©ÏéL'ÉZ¤dö(R'Rö9¿¾»ØDR”œNçƧ°
-,˜Í‹GX3gªÐeÚ¨ñ!@#;`3ܶE»ëA5VmÓ“µ¬©£d´®Ü?¡ÀýùSGÊ¥RX:MÕXŸÊÇü©jQW´^8)Ã/ víÍ<]èÏé‡-¨6‹_…_7rQî_ È/÷éÇ·¬ófSv€-y£ýp£>LÖ‹u^ÕN1î÷yÓ­Aýàfja?w¸!5
-Ú ëÔ…Du¼=Ãe©óínNê½AH³8á–‹eÜBaÔqËɸÅÚâ\¨Ç;ôÈ¿
-¡JžKú}F7' œµÁi°±÷Œ æ»]à y¿¡©–ÚF&•)»¿©‘žñ—à àöñ’‚¶éÀ{7°ðtÑÑùú-&n Q›’<A™©É6dHµµQb¦Á'ZBÃaeY~v¶nŽ,aúøáɇ¾eBTœEƤžQ ròòç?Ý)Ì‘Ç'^l²S^VÄ]*‘œݨU“ƒžõëVšH
-Ý{ ¨ó¹B/^SãwèÀÿ7½óí¸yñŸC‡ç) R4w)äc8nØfÍù·u*­ä Í+@ß¡;ä5tμsQ´Éˆ
-± Mf QH
-cƒ¯0‚´e4£ß´$Êl‘Z$l;‹„À‹¤’(M@yĬ6N ’‰¬MìÀ"áê9ýŒ,vøãpº¿~Š³HNá"l‘FhÎö8™BtOÒÑ‘EBÿ5´HJ˜S‹„H\At².-Î F½EÍ1ÞOë1òqù£ ä¡ šq:ç-pë‰UªHôÛån ÐÌiÛz¥Œà;çÎ à ŽÕftÂç(ƒ õG½Vð¼×ºîiGVëì²Qb7ª‹Ôsg~].álÉGŒlk¬£Xéô2k†ŠqÙÒ¢‘ñ)¤IN¯¹Š€
-¿ð—¤í2øauÓ Ávd¶$wœ–Ã}Α¿x¸Ô,ÞW$}\·¡ß–Ê’ît´3!§ÕÞéDůœ4‰B\zt•HêË®Z¹‡k–_—>¯£8=¼É-…js•÷„+ïI¨²Ó°¥ŠWêq'9¿ƒŸŒâ‡åªÝî€îvœ!³‘z§¶Fã™êÅÇÖ½$áA) Åÿ„^‹ ƒ {Ðá/'öVc¤¢
-9Ôô>‚N#›™l¬þb«DŸ“ \°,É+¢FkíSmgÿaÅºÍ ¬9ÎÔ ÀKC)ãlä¥ñEÇÿB˶ۊ9ÔµÛ’ûÖþÌ•Õc¹úÌt°â;ž¶Xp­Yü<{Wî‘^+0(!—‹(QÉ$JÃÜLE`8Õåë4ÃA¥2”-ÎsPã¹pnøWßåà*W‡:ç’ë)[3é£Áp,X"s»9(ÁyélˆÛÑ>EK§jÚž:¨ôåÀµ¯)ÎU*‰yš¿ûüyî¨"Ò:™;© !èê&pe“*q™»:¥¥Â½UáéSå°“‡Õçˆ6Jc“½F¤±ÂŽ¨¤E·˜¾»Íx»¡Õ€¦„õe èêò-CŽÑÖåSYbÞy‚ý.Ãú%é¢Ó;)Ò‘æé3
--¦Íâׯ™‘6hBÛඛÃ>'ŠËsCé¸âb1x¾ÜRxg\u¼»DŽLñ9P x³!ÐLSÄuáÚ3UYÆgz×ÀŠs΄?ð˧V„¥‡ˆ¯ûª(œ™Õ ?¥ô(”Ž
-팰¸z»yÈ;*¥ä4 «jVõ¡àg \tF>6‰ {RÿC Ե‹k(Øu¯âcÌ a v:&‘ã«uÆa)‰$hÙÅ©T%Ü&민cÉì:±
-ŽÏ'(.G˜¤§úgEп3Q:–‡2 fçb”>Ä:¥,wê
-_”–^à_åþeðŠ:;>¥RÅÀ‚^&3`ÍÐ9Ž‚¸0Ü#BýsŽˆù½NX_TÇU_¹š )/öc¬Î/Xü)ü« Œ†W,lðç0ì‚8™„Îc5”R¸Ã¾£$Î@·óæMÙøŽ0ßh˜_W3Øú…€ Lm$Ž†r,©–]"Ðg›„2Οç^¢äøäðíà›/øzÿæ˪æü}²h
-Æ6Ê_έ™ rH®"“×þ™Tž?áà®CÉ€‡Á‡ñqMpµ*w΀!)×í±D˜-
-ªìvüýØ”¢¨ð’8ÙÚÀÖÙ*8Q|´½|CÍŸ4áN=X"Œ+å_†ë5Aý¡a"¹,nCvãfÓ^æŸÍ}H* k’“"˜ß“ëçøÜn6Xëç*ÃÜWK¡JoŸ¬*Åä Q
-1ÿHŸ{Äl
-{&øáëÙÿûcïã—ð’?ü:n¾n*â(U®béˆr_vÊ)åC«T%3¤ÿšY$Vendstream
+1782 0 obj <<
+/Length 3921
+/Filter /FlateDecode
+>>
+stream
+xÚ¥ksÛ6ò»…?Ê3‹'s77“¦I››kÚKÜûÒö-B6/©ŠT÷×ß.v‘e·sO„Çb±Xì”×þÉk›&i¡Šë¬0‰Ò^ovWâúæ¾»’ ³@ë1Ô7·W_¿ÕÙu‘©J¯o·#\y"ò\^ßV¿¬ÒD%7€A¬^ÿøþí»ï~þðê&3«Ûw?¾¿Y++Voßýë µ¾ûðê‡^}¸YËÜÊÕëï_ýtûæM¥Œã›wï¿¥‘‚~. ýðæí›oÞ¿~sóÛí?¯ÞÜƳŒÏ+…ƃü~õËo⺂cÿóJ$ºÈíõ#tD"‹B]ﮌՉ5Z‡‘æêãÕ¿#ÂѬ_ºÈ?)¥SµÀ@¥F Ìeb‹Â^g¶HR­´gàðàèL|EÃÌWnK?ý –m5žOÔêë¹ÙñoÀØïݦþUåxíç²9º>A¦åp‰ÉÒ“q‹‹´ÈVÛ®iºÇº½ÇnºªÜ¶<6CO“å~ß<ÝH)W œOŽÎ'µML. À(wu»>À9à k$“WL8"«ŒäZÚ¦w›®­ú¯ö°y’ZkÂå—· ¬*l›j¶gÇZ[›dF`‹L
+k•‡ÿUXaˆyÎ}ê¡/—È2i’ c&'‡;ºDTZ$Æä9ƒ[$È_X8w¼òó2ØÉœxìðÌN™H„H3—Jél7êàAÕì É™vÉ$“2òó$KÁ,k­ÇP¤ rÁšD(¤ÏUm¿>Vûu_ÿáæ»ñIžÉâùí#ÔÂþcÆHe“Üj5%à£CQWB±A£¬>»ÃP÷^‰ ÿæÛ÷©õó·?Qãî¸E­ÜºöõÊSïgê–!žwô ̼2wÍlÇÓònK÷åæS¤Œ,ÀÆÕŸ]Eº¼6&QŒõDvÿsS
+¼c×–ÍɼÒCéŒR±¹£¡ œÃÂE
+ý{׺CÉÓÛ3؃[,liðU™‡>ëM·Û?¼vœ¡
+;¡’î ʧÍïx»±Ù€îc=<
+M¦-Ò—õÌH%¡kqÛ{ˆ´È‰"zb®¿¥<©0 ncp;
+M±KÁñErd®A>£¸-”êOµj–?¸B%ÀÇ ì#S²)™ð;Çò‚Èg® ƒðïPW•·³:[ùÓêÜËüìɆ®YÆà0ù\»Gš¹+{Ϙô^†êvÓ+
+z=Ò…û±dë©úk 0ÝŠp]ã+€MQöj>Æò%¬ÁP'Âd³Êá¥L"²(Adç·*A›âã‹gÉ"žTEÏ’+ŸßÌ"ósù³"Êß…0Ÿià†ŸÒG@—ƒô
+. úIÄD=Tðw0¹;î0L¥yzM„Y¬ ùÂvÚãîÎE‡¨à®³™UöÎW‡rÝæxàœÆ²ÞÂݲuݱ§‘ ¸_âõI¡¡Q¶OÔ¸‡Õ-5‰£¾yJZåDƒ@˜m&ƒ`ý}é±+ÉL¬|üŽFð«ß!d„ÿ7 fHs°´i OþñNæ .‚ùÖß
+‰ÊâZ(­Tà—ÌØŽy ¿$é’žà'È94ÛrLòƒ:NñÎCùÉ1¹þ."}}×|^,Œ‡¨Bú</ÕêÝ–†ØðÊ è£"“ÉJ__§GŽJ8žeKÁ(ªfžG›ÿ\ôQħø
+SÝiÃD=3¬g:Mƒû0ÜŸÕÁ„ù¼hçØê|ÄÔU,ØÒ(Y…½ÂM`ÕèåàÏòX
+ƒ_@xlTN<6Š¾+ÀM¦‚è©|ÌcìmGë{Ï(ºëŽÈlré‰Ö—-Ö»}çëãøi)*–Ò‚?R³×¤Cg¡—bmó"°‹1ªL}œœ>¤Ž¡.G©ŠßuëíÓºrMùtþ¸¨[€v<»{„ZØ~r¡2ƒ` réÉþä”3üP)ÀïÀP]rNótüSŽU—áѹ8ÕrŠ”e!„ÕsR>ñs$? “7…á’~ÐxûbZ1&(D Љ•›Ù¼6ŠùEx.ÁHÓrLwú j)¬‚ 3)DŠ¹4t®ãÇ2…¿›5Äbõͱn†uÈsb<èsJòbšãsÙ=Uø!šÈG‚ù ¾šRu¶û\WŽßz©<†­×ì·Ç†
+?‹óg¾œú¡ÅT)§Æ
endobj
-1391 0 obj <<
+1781 0 obj <<
/Type /Page
-/Contents 1392 0 R
-/Resources 1390 0 R
+/Contents 1782 0 R
+/Resources 1780 0 R
/MediaBox [0 0 595.2756 841.8898]
-/Parent 1398 0 R
-/Annots [ 1394 0 R ]
+/Parent 1787 0 R
+/Annots [ 1784 0 R 1786 0 R ]
>> endobj
-1394 0 obj <<
+1784 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [353.2799 352.7282 410.176 364.7879]
+/Rect [324.9335 477.5927 381.8296 489.6523]
/Subtype /Link
/A << /S /GoTo /D (zonefile_format) >>
>> endobj
-1393 0 obj <<
-/D [1391 0 R /XYZ 85.0394 794.5015 null]
+1786 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [55.6967 61.5153 116.59 73.5749]
+/Subtype /Link
+/A << /S /GoTo /D (view_statement_grammar) >>
>> endobj
-1390 0 obj <<
-/Font << /F37 802 0 R /F21 714 0 R /F22 737 0 R /F41 939 0 R /F11 1397 0 R >>
+1783 0 obj <<
+/D [1781 0 R /XYZ 56.6929 794.5015 null]
+>> endobj
+526 0 obj <<
+/D [1781 0 R /XYZ 56.6929 131.3071 null]
+>> endobj
+1785 0 obj <<
+/D [1781 0 R /XYZ 56.6929 107.529 null]
+>> endobj
+1780 0 obj <<
+/Font << /F37 1018 0 R /F22 953 0 R /F21 930 0 R /F41 1208 0 R /F11 1442 0 R >>
/ProcSet [ /PDF /Text ]
>> endobj
-1402 0 obj <<
-/Length 3086
+1792 0 obj <<
+/Length 2818
/Filter /FlateDecode
>>
stream
-xÚ­Z_sã¶÷§Ð[陈%þ’hžœ³/U¦ñ]mµ“išZ¤-NhR);î§ï.  š’ÜIÇç°XìbØ Ù,6S:Ö†›Yjd¬¦f«ç‹dö}ß_0Ç3÷Lóë»åÅŸ?‹tfb£¹ž-YYœd›-‹Ÿ#óø$$ѧ/·Ÿßÿãîê2•ÑrñåörÎU}^üí†jßß]ýøãÕÝåœeŠEŸþzõuysG]ÚÉønq{MCÅ¡w7Ÿoînn?Ý\þ²üáâf9ØÚˆüvñó/ɬ
-Ÿ€*˜¶’ÇE¶&2m¶—,‹Ú—ª@ÙÞöÙñ­Ëz󸫉±¨ò§¦íújE³@B¿&Q»§5ȉÞìž¼6\ ¤= Æa‹æovM¼èñäÐÕ½¼H£MWîŠvÞ·›y]¾”õ¼hŸsdÍ—¡Ÿ™à±Vi¢PÂCÕNâiÌS&“hAuïWŽ›˜~+ Í—û 2‰M–y®UwBQÊq:g…7YdQnÝæ­Ë·=Õ¬«°›šÇ õR•¯ÔÛ®+Ëc ¥¥ˆS-,|PßöiF•»)¸ùßGò;©há}¹r[‘»‹¹x'
-øCñxâ¸ÎÌâ½4ŠEz0‹PZ×O¬¢0±H3}f+c\:®×uµZ“ت£²+a±òß'Ñ#mþgê³»+{,­Ú0EulŠ<Éb {×i_ÜNLЗ¥’;–oÅ´è°Dôä:Ê›7bxªÛ‡¼ö˜–Å©`©4:~¨1`Ï—¶£F·³.0
-’LûØ눎g´-é¾. ’é1t+8NVëª xé¼ YühÜ}”Kcfó ’­Lzæ±…«¸T¦ö4åÒã(žÊÞO Óo—yÇã®±¹0˜ø% Øl«çÜnl춛Öf2Òa4]n%3…D®\iÓè„$¢qW[ ú¤”ä\š(•Ã½óxr³ 5­N(!'\å]O ò ªK2R‹«~çó›çï^an?  ×–jp@6uà`oñŒ«Ñ'9ˆpßN9æ«ÌÃû€l”Ã'2IWïÿ‚wRJ8·åi¸ ˜Ž£g
-Òk˜Þ¼*Þå:6 òSª=Ï{Õ|œCý˜¥ÑâšÊÞ”úG¹l„rî8û3ô¬Êꅜѓ
-·´žP»¤.ìÎÅtÔS0tnï×.|€B˜é_‚ %Ï$Ù®5Obnöíq´ÌÐë3n…‘ph9óع¸Žïoîþys7uMQ°€ú0ÙAÁÇ’Ó!ÿ¸¢¸£yMŠ{ûcàª÷àŠ"—äƒd=H°{È]ÌaR<ö·µŒ¹4£ÌBv ¤¡Ü#¶"aÕÂ4”9ôz ÂÆ€AV°+÷Düa“0k{ ’ú ^–
-ž[¡u÷ù ã,scìjïûT$ÜUè
-”ª¾ls¶©ð Ž¢„¼nk¿í¿ .u~€a ¾€:#zç윊rùÎbûЯŒU…<ªœtþÒ/Þj·% RW]x9érû êþrìÃT#5ìô_„\ö®§^V±X È¢ï9pŽ”¦ ÁEð¤RÏô^éáó œåƨC¥I¼¸_]_ßÅWw_ñÿê¨Ý)äæJŸùë‡ë„Ýžë¬Ý§”îí+¶;TÊà¦ñaËU7JaÎXp°Üsµü”Ò½åc¥Ó–‡J¹‚ÄO›[o¿ 2qÆú€ë„õžë¬õ§”î­+¶>TÊcü þqë!føqû´õ× ë=×YëO)Ý[?V:m}¨_Ž!Ge&û¸+¼(v@Àužë¬N)Ý;`¬tÚ¡RØ°x">l?Üú´ùÓqë=Ó9ãOilkœ4=ÔÈ•ŠÃßÚ¯U,ø™Õßó·Þñœ3þ„ºÁö‘ºIÓuIüÇ~_õY/á}VL¢üºÔóÿÝÞápYƧ]ÀS|Ý!nRöŽÍß¿ùBÍ'¦þ_å/*endstream
+xÚ½]oã¸ñ=¿"ou€3ËO‰jŸ²›äêC7»MÒâÐÛ{Ple#¬#û,ysé¯ï ‡”)E–²¸¢’£á|q¾ÈDœrø§Ö0®2}šfš.Ìéòé„Ÿ~o?ž3HóëÝÝÉŸ¯Tzš±,‘ÉéÝCDË2n­8½[ý2{ÿ·óOw—7gsiø,ags“ðÙ»ÅõA2Þ¼¾ZüøÏ›ó³TÏî¯ |syuysyýþòl.¬°_z
+G6\-þ~I³oÎ?|8¿9ûõ˻V—X_Á*òÛÉ/¿òÓ¨ýÓ g*³æôœ‰,“§O'Ú(f´R²>¹=ùGK0úê¶ÙÏ(ËŒ•é€¥2 ÉX¢¤r¬‹Ý·bJev¶Ù6妪iQï—8Kgyj1\0+­L¾^ožç¿í‹Ý‹GŽ9Ë·™Ç]mˆCµih’o·ëâÕ<ƒIí§ÿÙTE ¶˜-ö²ÙÓä¡(Öí¢QÅʃ<§UYç÷ëeòt.0ºJÁrB°Ìéäsü~8›«ÄÎö(„Òš¨ã¤5’Òfv_€Úg™œ9ôt¶Ùü±\õ÷ÝïËu3/«[J©YªD°%øôÇÛ+jÁ¸IÖ·²xö”_ˆéªø̹¬Êê ÁóŠÆâ÷íº\– ­Â>3Û<d¹Îë¡#žËÄ°ÔfI×<GÅ[ŠLyñšÇ¼¡PyÊ›%˜œà'4Y®Ë¢jàXûÄAIî”&u¢†3†GšÇXäðbÈá–³[±«á
+­`:MB]  C°7y'‘ÉpΕ…h²FuÃéMÑ{ÍÑÀSœe’«ï< yG!b“y5Á±L»Ñ…žÁ.Ÿ T”åcYE¸Tòb”°ûpž¥N<×2mu×2›}…G­SWP¥Y
+TOÌ,¼›×ÜÙ©L1®y¯LüO²Áª˜@ˆŽf»ëx¶k±¢&$œ—«×)ZèßÇÙ·Xü»I3©2Ó€Ó¦³ÅM
+ÓÐM¦‘”©‘ãRJÎÔÖÎ!C4¿•Yë¶ë5mYæûúH› ´¢{ÖH}¨Ž*:ø°ó„LûKr¦‚¶:.à
+Q§Á &ß=ù:û‚FÊ ŽüŠ ëÍ2 ’¡¡Ê’¨ëÊ¢>æþUê@¼†4G3zN2á¥)™-ª¦ØUEó'O‡A à“&&hØÐq:6H°«ã²Ä»¦T*jÍ”neørCEU©öy ¦2õ6_~Ù¡Ùï*ú~ýóÅÇç‹kZÑ×z»©jÚ H-¥cš‡l¥¸5 a›ïšr9:—ý:w7^,ßV¶¤RÓ
+»Á„„@= Õ— yÂóÕÊ LÒèŒüD«›«÷´Ê™õ{Üi¾™™RÐÑm
+L­Šh¡ÔŸ9ÔÀþ-‰Cë‘@eåÚb½fÛmÅ9ÌuÒeËÙâz~~qqÃÎo>á£þùQÍye;±šGX#š¬iÍǸFš÷Ùk³pÝx«îp+ƒ{屇ù {Œu\÷kR÷Q®Ý_±Ô½ÃVèÿ’ìíú.‡örBÿkDÿ€5­ÿ×Hÿ>Ûaýc¶’áåÛõ7ò‹ÑúGX#ú¬iýǸFú÷Ùë³…VZ{0}» Oü1;B1€GšÖ„e¤~ç°öOWMÎ$Wo×vh dÆ•°F´XÓêqôï³6@ÌV|W;ü¾Õ"sLŸb¬ãvh±&í0Êõ`‡WlíÐaËÙûY|J¦m–&Lk•NØ,±YÀš¶Ù×Èf}¶Ã6‹ÙŠÿ‡ÍLÊ2Ù ›EX#6 XÓ6ãÙ¬ÏvØf1[ËÞ± ,9Îòm6PÓ\N´[1Öˆ Ö´ ƸF6賶AÌö‚]¡¾oÓ]rf­œh·b¬ÝÖ´îc\#Ýûl‡uÙZvù=ÚsÉT"&š­kDû€5­ý×Hû>Ûaíc¶Ùwio³ZLtZÒqÝÒ¤êc,š÷y*ó<ÿ.½Ôœ¨¬œãZ{œI¥Gøtî1T9bøî»4V†á?ù H
+"rX¼Z™¥A(Ô&Íú’·ÿtøZôÿÃóîendstream
endobj
-1401 0 obj <<
+1791 0 obj <<
/Type /Page
-/Contents 1402 0 R
-/Resources 1400 0 R
+/Contents 1792 0 R
+/Resources 1790 0 R
/MediaBox [0 0 595.2756 841.8898]
-/Parent 1398 0 R
-/Annots [ 1405 0 R ]
+/Parent 1787 0 R
>> endobj
-1405 0 obj <<
-/Type /Annot
-/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [55.6967 639.9582 116.59 652.0178]
-/Subtype /Link
-/A << /S /GoTo /D (view_statement_grammar) >>
+1793 0 obj <<
+/D [1791 0 R /XYZ 85.0394 794.5015 null]
>> endobj
-1403 0 obj <<
-/D [1401 0 R /XYZ 56.6929 794.5015 null]
+530 0 obj <<
+/D [1791 0 R /XYZ 85.0394 496.0455 null]
>> endobj
-414 0 obj <<
-/D [1401 0 R /XYZ 56.6929 710.1097 null]
+1794 0 obj <<
+/D [1791 0 R /XYZ 85.0394 467.7701 null]
>> endobj
-1404 0 obj <<
-/D [1401 0 R /XYZ 56.6929 686.1175 null]
+1790 0 obj <<
+/Font << /F37 1018 0 R /F22 953 0 R /F21 930 0 R /F41 1208 0 R /F14 956 0 R >>
+/ProcSet [ /PDF /Text ]
>> endobj
-418 0 obj <<
-/D [1401 0 R /XYZ 56.6929 367.6759 null]
+1797 0 obj <<
+/Length 3233
+/Filter /FlateDecode
+>>
+stream
+xÚ¥]sÛ6òÝ¿BÓ—£f"” ’¸{J§u§uîßô¡íEQ6ç(R);]ì‚%Êé]&3¸X,‹ý†å"„r¡‘˜È,R J½(vWáâæ~¸’Œ³rH+ë»û«oß«ta„I¢dq¿õhe"Ì2¹¸ßü$"K ß¸}óÿïÞ.Ó8¸¿ùp»\E: Þßü|M£îÞþòËÛ»åJfZßÿøöŸ÷×w4•0ïnnßÄÐÏ¢w×ï¯ï®o¿¿^þqÿÓÕõýpÿ¼2TxOW¿ý.6p쟮B¡L¦Ïð
+iL´Ø]ÅZ +å õÕÇ« ½Y»tV~2‘J¢FÑœ
+xŸö©<ªÍì‰ ¨æx
+ø¨«®gð–~=^áË2ø†Æ/í‘EÞLpécØ€dÖö#åý "ÙÀñ6Ûö@ƒòs¾Û×åßñ4ß¾¥§¨©©ÅV¡HCðx@ffeÅ»¢m“0 ¾ßüƒHLt}5¥‘Y7(“ðQðq\Ê «šú¢c ÎfCXV-pÈ›‡’ÇÞ‰ÝÀ©Ë¼¾tÜ©{l5ãä5áäÔ£ƒÇü‰7£  Ù1À©ÛkÂߌxÜâ:¥câÇ®­J"Ü4Ùò¢¯Š’¾úÇŠ—€©–ù?ÐXñ·Á;ÇÁÚâ³ê" È;=Wý#vyóB£OG`Û1³.í cSú;èó3‘¯ší!ïúÃ2 ŽEî,…û*(,ú Õ‚A“ïJ†U ýéέÙÃEçEÙ¡‰¥*øØœ8ömA:nyΣ./Ö‹*¯g˜x.}þš²ÜXÕ@íÜ…­ÙZ6å¾n_œaZ‰¶ø˜7õ©¾e¡D_Ø´Úœ—äÏ9Ã<·æ¯º$F˜âˆKá, ¡ô_Œg2Æèx>žÁé3ˆh)ØûEZ´.Z<¤§¤Æ¼AG‘HS€^Ød¼]$‘P©LÚ(!Iê·žËÐ 0hEµŠ€o‹ñ,E‚û{ ÎÂ<P Ó(]è8&Kpßŧ…alŒ"ol:
+À¾½ÙE‹w-gáÈÑ]y„íß·AþH°{’
+#3:ѽ½æ4 %é¥ öù¡lz‚ £G
+ž–„(RÖ,Ø.DVcFÉ‚?—6r—Œ68/À²~x¡S§É¼®ià ¹õ4ql6冼ÖÀi¦ýµ¹Øì…¾¦§@D´á$ÞÉ\H…‹G°ÎH€ €†¦,eÿ‡Hî—ΖÛB&ŽUݯ¬oÈÆ0ïqÜC3ìž(ƒ
+ÛǺ,ìëB¥w&ìDd²¶Wy°f˜˜
+[Š,…È3áâÝ X…Á¦zª6G›NÀ÷PãËQ¾aLò˜'_Û&h˜Œ×=C%n×*—"¨+x09(âé“ÊqX°¦Ôi•†"Jµ™fÓþ\ߨöCõ^íJJïOn
+9ë×Dzè‰Aì‘åÅ#uçE8dAPQ,†UÅ‹ÔœŠcˆrL' gËçsË®%”tŽv~
+FhìQŒ¶…*ˆˆIé“\f0“§‹ü$ éü$¤j¬Œ€ MЉÿt­×¼Ïg•óCÃo3íú©jÝøܳycÏÜôœ¤
+…‰#õ¢P¤ÂÈB*q–ˆ/QüKwõéX±["èîhc%ŽÚ1»Äßü Eö®’ñ­É‹mðe9ãg©Q+™(!Óñr\Ÿñˆ/F
+’|#SIèÞÎbLM­3Šva@pk½µû„C#Î:þ¥;îö¬” ÅM‹doi ‡· À÷U1¾¹ôR6s[‰ÐFFá²-kLl‡­péÒš[nÞ[|­¹7zÙHÈì³ØL™ðêÍ^’DÄa¬^õ"RÄI¨_õ"Xó$ŽŠ ½á®1u- çáÙ·]W­‡žeËg^B :;µîã~ïR•ºÚU'F>è­>¹÷ÉÛaîYïúÅuæ¥Ay§±„æKË?¯X²]õçœ\S%B¥ÓA"t¨“tbÔåtÊKB(ÚÌ°•‹¬Š¢/|惘ì3öâ?¿H7“ŒDSÆD°iÂd³Œfò¢Ÿ¤HÚqÇÉɯK .¿\Í>™ûYiª²ÿµÔ:'ù¹L\ü+^Šº*æèdBÃ9ÍÏBC>
+~lŸñÿ¦Ä–ÉIlóIûŠ3˜i~¶Þ_;Å
+¦µ36odr5—·œ?G%£RÇe‘QAGýJs¦Á&vE¨¡'füý­pdµé‹¢,m ì–ùa§ã ö@—MÍ÷1ù™‘ŸxpÇnö ¨Òÿ
+g¦ÏO_ýÇ>ã‹&$X*Ë¢ù†8Yg@„™Â+ÈÂó>ÿUÐ9ëÿ ù«_endstream
+endobj
+1796 0 obj <<
+/Type /Page
+/Contents 1797 0 R
+/Resources 1795 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 1787 0 R
>> endobj
-1406 0 obj <<
-/D [1401 0 R /XYZ 56.6929 339.2505 null]
+1798 0 obj <<
+/D [1796 0 R /XYZ 56.6929 794.5015 null]
>> endobj
-1400 0 obj <<
-/Font << /F37 802 0 R /F21 714 0 R /F22 737 0 R /F41 939 0 R /F14 740 0 R >>
+534 0 obj <<
+/D [1796 0 R /XYZ 56.6929 349.7668 null]
+>> endobj
+1271 0 obj <<
+/D [1796 0 R /XYZ 56.6929 323.7864 null]
+>> endobj
+1795 0 obj <<
+/Font << /F37 1018 0 R /F22 953 0 R /F41 1208 0 R /F62 1352 0 R /F21 930 0 R >>
+/XObject << /Im2 1341 0 R >>
/ProcSet [ /PDF /Text ]
>> endobj
-1410 0 obj <<
-/Length 2656
+1801 0 obj <<
+/Length 3598
/Filter /FlateDecode
>>
stream
-xÚ¥]sÛ¸ñÝ¿Bs/¥f"„ @lŸœØN}ÓsRÇ>\˜3©ˆ”}¾_ß],@‚%%Ídæ´\,°ØÅ~øø,„|¦bŠLÎÒL²8äñ¬X_„³¯°öá‚[š…#ZøTï.ÞÞˆt–±,‰’ÙÃÊ;K±P)>{Xþ¼ÿç姇ëûù"ŠÃ aóEœ„Á»Û»+ÂdôóþãÝÍí‡ÿÜ_ÎS<Ü~¼#ôýõÍõýõÝûëù‚«˜ÃþÈžpdÃÍí¿® úpùÛo—÷ó?~½¸~èuñõå¡@E¾]üþG8[‚Ú¿^„Ld*ž½ÀGÈx–E³õ…Œ‹¥S]|¾øw ·j¶NÙ¯§YÉTgœ¶rœ±DD¢·2—ž•3
-t'ÛEßgƒhc~ÆÑ X¢ó8ÁÒÓç´úÏ+vƒš~ŸÖ!Ø' ŵ=ªz;ªóŠŸâêi¾ÏvZuŸ­b×? }¢B&“,=­½Ou\ûžê¬ö'¹Ú°Ô~Ä6û1í“%ivÆå}ªÚ;ªóÚŸâêi¿ÏvZ{Ÿíåi/C¦”’g´÷¨Nhï¨ÎkŠ«§ý>Ûií}¶ïŽj?[Dpn˜$À!c)@fÃõzÓ½B"çqðWSëAäÛ9W&|«».¬ìWÞI÷dÏ¥~!¨ÒϺ²ÔKÂ5ueÏ7ao3lm-ÝŠ–Š*o-êöŽpU¶ÈIzB⸗5 AEβ8ŽŒŠVeý¤·egNI°2{š5-6›®lê––Ê!AËÞ€ìkuCÈå `x°àÄl»ÑEù% #ÇÛ˜‘šQX3‚ê"Œƒ¼?˧yÖÛm¹ÜÓ‘¼žŽjlÐ>ª²í,zE¿ž¬ðe|Cðk³# Èë-}ô ÈfM7œ@PÞíZ…P TȲY5[ôŸùzSé¿£6oo$÷<;å, ~eœ­0 cÞ±MÂ0ø…ýò:b‹ñÊœq‹FÈ«jæ_g»¶¬¿žt@‚å’HŒOb›×_µ… ¼³º$„ó•7xwéÀ¦}jv•¥É+¢É—¯Äö)¶ÌhÎl-Âùã5’o <iqŸˆ%É€À®ÕàRI$‚Ûš0›m^te¡é«{*íˆSoíF*þÖxá<zë·ˆ(òÖB/e÷DÐ:¯_ ú¶±0Úh@Kísˆu¢à-ëÕ6o»í\»¢Ûõ–rx—¶h,ú ¿ Î×ÚâÊš~áèÖíÙÌyºÅøJEð¹!<IìoZuÜöÜBm^lMe^Mñ¢}ùj­—Æ5ðŒfJ¹G*K½©šW•æuÄ@|ÊëÚ<¨~X¡E_m\5¹Ý’¿äç½iþ®cf„%«;–"e"Y¢2õ]X–Årºƒíôg©ŒŽŸEûB8Ë‚nÇø¨!7 Åçñ¨1èm É9d)WØ=ro eÉ;ïňx{L:e±ˆ@rCñb…Ãë \ï[ΔD“aÊD›ü<û6ƒ>Cf™ "6º60ˆ··ëhvÕ€F3O)wðÂ?Ù(•Œ2”²m"#èÓã”2ùƒ¹ëT[MΙ›|«ëŽ°pÍø,Ïó’y¬
-Vs@QèdCœ¨à¯¹ÉÝÚ’õ/P™—xá³N‹yUàR¹ý´°«—zKà‘0ï%U±¿WÑ»
-W ˆ;xèQ ‰§OjÇaÃ#N‹ÄMã½×w<_€ë[ƒ
-<êBD4AÄ¿þð„q5_ðšìËå²Ä±Bnýë³.:ÿ¢”OØ×6áPA¥š¤¡W 
-cŸÚ'¤„gÃÅŽ3t‚•eÛI¾ ª*À•d<RÂÖí¹Ù>!K9+…G•Èìù¦åEjâRÖÞZ±¬$´`šT@•ë õWÏV•ÎQØÆ{ÓÔ­]‚JlEïèÂÎ߸da•üèæ ó,4ÍfH£ú?Ú&CïÈTð_z!a mîÑ߆
-óáŽÂÞ†YAÊ–@ζÐõ8ÐË¡Ó‘¹=s0‹a÷Ôl»E±ë&çPX‰F©Í5
+xÚ­Z[wÛ6~÷¯ÐÙ—ÊçD@€ Øì席Óu7I»Ž»ûÐö)›ŠTEʲ»gÿûÎ`
+”(;mb?àB\ƒ¹|3˜pø3.S5IRÅb.âÉbuÆ'·ðíÛ3áÆÌü Y8ê«›³—¯e2IYª#=¹YkÆ“›ü§é׿øáæòú|Å|ªÙù,Ö|úÕÕ»o¨'¥âëïß½¾úöÇë‹óDMo®¾GÝ×—¯/¯/ß}}y>&0?r+œ˜ðúêÍ%Õ¾½¾xûöâúü—›ïÎ.oú³„ç\âA~=ûé>ÉáØßq&SOvÐàL¤i4Y©X²XIé{ª³÷gÿì ¾Ú©cü‹¥a±‰’FbŒqÊ´Œ¤eàfÓݬÙäÅS¢`Š2L(c`‹Ìáéôæ®8ŸI¡§Åò\˜é²XtØN¦Í’ú»»²¥žö®ÙV9õÎݬUY7äë hK9½kvÅ}ö´e½(h¬¦I××@&UËš>užŒ,ÏË®lꬢv AÓz\Ïð`“™?ËL–ÆqdT.²ªz„¡ȯ}mÑÔ]VÖ-µ2*Ú ¥j½]Íbšµ¤(¤ÊÏ<æYSà å*«ýÚY[¸‘e÷q—õmUø]`yñb¸øî®\ÜÙCòáép/’WË,¬
+° :f°ûÕr„o):ÖŽpÕÇ,Š¥Jz–½p×h•½G¯UØÀc]8:g¨x|/y±Ì¶•“¬û¬Úý´‘[Ö‚¡RGKÝŒ‘+ÔÔ³7ÇLƒ¾?}ÃûAOÜ°Üð¢*²80+kÐ8ÕÑe§1¨ŠÔO’Ñ:¦c ÒœÃG`JHñ7Jáb6÷VY¡¾+ÑDa”jÕÜûQ]†6$’ty®·¨»MY´xå`wç`.rú`/ÊÌ•o®¤ÉÁ˜¬ºm6ew·zA6å,‘&š 4í£Í Wñ@›Ç¹ztû3‘ð3Á›l»¢¡‹Rçš"ð{¡`:5§öpÎÕ’¾ZƒŸÁüØŽl‰
+¡m¯Áh6y¹ QžV:»)
+¥?;飻 ´w‹ÅÖz¸ÓÒÊBégÄ5õ„¼úQ–AÙÃ̱·-;6J1 ©$~†€~ÔƒËÑ(Õ$`ài)WÛ5²U³­;ª“… ±›Gª“w©|ìÈaJ{3Xn[·à²Ù¸/~ ¯ Àë/Ü,:=ܶÒéôßwE½ŸbïL©\ åÖSÅÊy-5ͳ.£ZYSéܪòîÈÖIõ°ÝúQ¥«Uåªì¬÷s{†ºEòEÕ9m¿Õí-5Û¶¼/ªG·Hã÷ʺ=mL@BiIÀÂîÈû}1-E‘;®¦W5ugTì錀ÎîŽzW fåÚÚhÝ—ÅΚã(Â-³õº*‰/¸à:Û€Û§3D¤xÐßOÜs5ÂKA8ÈfçY`çó4š>é~¼ÏQb`Q“‘ˆœEúí˜ÙIX*£¬8Ð>P
+˜uR‘t X5õ‘'nsB
+L‹6‘údõïWœ…K«¿R€¼ÀØ~ØS꟰(N½úU±?ßÚŒ¢±QFÀÐb1ˆbGµØ>CF¥pñF”¦*ñtP*
+í˜c"Špõ1  Ú çŒ†Wÿ;Î šrÛ‹í±®Íü—ñ$·¿Ûí˜;'
+´Uõè>½eéOí•—íÂá¿?J
+ÎýË
+ƒ€¹÷¥Ko)Ã|±è€cþWskª6Ò™'ï™t¥bè˜^Û¥eÆe–.©$‡*¤mŠ ;´û(U’É©! `.QÞ1ЊnÇ@je`$pô–ÙÒ½+ËÔç¿á›3ÒhÚÆ„Q
+ä_y{ç˜dcÈåãÇ~¢²97ÓmU´_ŽÀ§`ì
+Xù'?åÕØ¡»»xöãV:;%gZ˶X]¬©Ü¿í†z‹…­ªèZ×O…5¼X^ì(Ýr$ v2Ù%¬ö‚@ý«m×CRH lO莬ÕqTÛlsàtÙAxübô½i¨<Á1vZ0pT{Ÿ— úwì©Êý/®Ê§å‹Õ“3’X¸Ê—x>›`µŠÂŠ7“ƒw3mÌô½û]8š`¢}…“î]Ž¾[xÕ¿ ùÔõaz¿_nÏ=Ê»Ë$ ²|á¶ÃÌ$tüSàŸØÇîä‡Âû±Ÿpʘáï.G~ Á'ž˜Oþyçþ·¯*aÒ˜hüg’kÑMâ‰B&qHyÿ;ÐcÒÿbTü,endstream
endobj
-1409 0 obj <<
+1800 0 obj <<
/Type /Page
-/Contents 1410 0 R
-/Resources 1408 0 R
+/Contents 1801 0 R
+/Resources 1799 0 R
/MediaBox [0 0 595.2756 841.8898]
-/Parent 1398 0 R
+/Parent 1787 0 R
+/Annots [ 1804 0 R ]
>> endobj
-1411 0 obj <<
-/D [1409 0 R /XYZ 85.0394 794.5015 null]
+1804 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [91.7919 217.2504 93.7844 226.8901]
+/Subtype/Link/A<</Type/Action/S/URI/URI()>>
>> endobj
-422 0 obj <<
-/D [1409 0 R /XYZ 85.0394 201.4944 null]
+1802 0 obj <<
+/D [1800 0 R /XYZ 85.0394 794.5015 null]
>> endobj
-997 0 obj <<
-/D [1409 0 R /XYZ 85.0394 173.9833 null]
+538 0 obj <<
+/D [1800 0 R /XYZ 85.0394 548.0867 null]
>> endobj
-1408 0 obj <<
-/Font << /F37 802 0 R /F14 740 0 R /F22 737 0 R /F41 939 0 R /F62 1062 0 R /F21 714 0 R >>
-/XObject << /Im2 1051 0 R >>
+1803 0 obj <<
+/D [1800 0 R /XYZ 85.0394 519.5161 null]
+>> endobj
+1799 0 obj <<
+/Font << /F37 1018 0 R /F21 930 0 R /F22 953 0 R /F41 1208 0 R /F11 1442 0 R >>
/ProcSet [ /PDF /Text ]
>> endobj
-1414 0 obj <<
-/Length 2658
+1807 0 obj <<
+/Length 3771
/Filter /FlateDecode
>>
stream
-xÚµËrÜ6ò®¯˜Ûr¶D„x‘Dåä8²£TlïÊJåà¨\Ô FÃ
->$MvóïÛ@rDI–][:h4ýîFtÁ]ȘĊ©E¢‘•‹Uy-n`íí u8¡G
-ÇX?\ž|÷†' ETÌâÅåfD+%QšÒÅåúSF–@!
-^xÿæüí¯¯–‰.Ï?¼_†LFÁ›ó_ÎpôöâÕ»w¯.–!M% ^ÿôê_—g¸;?œ¿ÿ!
-?½8{svqöþõÙòêò瓳ËA–±¼4âF?O>]E‹5ˆýóID¸Jåâ&¡J±Ey"$'Rpî!ÅÉÇ“G«vë¬þhDÙŒ›S T$æŒ[žW˃pu³¤i°Ö N»Ú¯»,w(ÝVã Ìîó²/q²ÓͦnʬZ¹Õ¼ÜYZõ­.uÕ!pƒ ·'[¯ó.¯«¬0s´zÕåKÔÎWÙj›W7§ËPDfµë`ft Ñ‘DÑ"¤”()™•å@6Ü4u2Úm+‚F‚Ä‚+Øo¶¬ISFbªR‡RÕsd$‘2õ(y ¼+XAõª.Aøµ^8 Úõ£¼sÕ7ˆl•
-
-šˆ˜œê±ÝÖM®ú½X°ß±ÕÌÜZÍði&ye½à
-oi ÂÛ 8Ê*+N½QÇtƒ&ÖŠ‰T”}±bIV©WÛ¬Ê[ãcI
-j4®—¨àZ#À8Êua5 ³ë=®>žNh‘T¨)¡® ‘^☈Hð'³%"Žä“Y„y*ô¼Cž­7ÏYÑÖÙÕm›~쬫L;½Ê7{DÍ-B)"ÓƒaPõ»±¶ ¼"/ó£ üVÙÝÆtí6f£è½vØ};¯U&)‘œÇÞhÙ}è4ÛæÍé5á$â24‚²0(m±â>A /½§$.F)‰UWœ¼ÍZÂy™WŸ"ÐãÄ ‚KHIø¸•ÁÅx†‚9‘»sö´Ì™DZ1”µß–R~· 炤î»Y%IÂÓç‚„)’&‰G;!$IBc_ÿVûU‘¯æè¤D‚mÜ!D
-s
-~¤v²‹ŽÒ.Š)÷S“–Ú;0¦(3è;(Ty·h¢*Ô’TQ5u{s^kTÏxðS}§o´"§Æyã£Ú6v$9v$Xù=ŠØ½ÍþÒ; y,ÝmµÛŽ!†;›¶;ÐÔÐò´8µ© p¼ƒÈÛèÃ䬷 œ«óSt2«,滦xÐf¥FÐÏ
-êèü‘Â1^éÌpÀšísƧS7O&èÓÇX3çOš& d1eà|.ꡱôMà >Ó: hðù¡Î=KeòƒÙQð5ÁR38ÉZo²¾pþu›½¶ÍØ:†šC…zI§÷ˆE›«'ÚÎc¬Çí<`ì¼*44ÍÕMh/! Ø“Ç þ‹=ÍÉ€5ÃÊDê„ÎS9åµÌLÕnnmàÂØ•æ/2e}뱺̶¼üpo(Ü”›ÜV9øRǬ¹™Âª
-ß_.~ÅÍ#œ¬¸1ÍöÄKJ¨"­•š¦#“æ÷³æ&i$äô¢0«Ø>ÀH欧 •¥ï´iK˜reŠA=8¸Ôë¦
-M8tÁ³fŸðø¼2–ù?(“*JXÊ’YeB"k¦ºt †Gûp3 M—¶ÇÜ3F¡LDs^ëœeÿjrÞA–Éa°SOˆH…xñaSð”Kñ¬NÛ½\-ÐWC›ó=ï0³Î÷-j‘/>lªED¨”Îú4´®¡U9<ÜÕuqT¿¾ ñO÷‡f4© /'Ñï ·Õíë1ZálCñ÷÷ýˆÏ%1¿¼ÏÜ(¢ÁѾùþÃ?ÈSiÊæ¯&,IÁ¸@Ä1e{3ñð:æþà!ëÿ:šš¡endstream
+xÚ¥]sÛ6òÝ¿ÂôMÄ’
+Û~weB‡ÃHDê›$Έ8K=(YÞœ›0S>ÈÍWŒg$©<e‡gÕÞ±¬*î-
+nóå²ØuD¹R^[ÖK9iPÍLÕ^oø öj„µÜ퀋itϪUä«D§@,ÒX|AJfûf;q P=ű[Û¢îPµTJÄ 3’ãL§¡ŸèÀŒåéPè÷òvXtÓt…[Žì2ô¬©HÝt®Ôóªzá¼fxÞuùò‰ûMmÑæ7Ÿ²#Ž’"€Lux×2÷1_Ò±X}x—W$lzµ<²Ñ'®n¯%‡YÃÖB™Ðt–ªÿ„Š«“ˆ”¿·ùn‡ª03ÞKsØsñYKdÁã¼ë;ÍW+±™–Íž'¬šm^Ö ³[GÞ#d+„l„âŽïØJ=rû\¬€`©ñ®»ñáؽoËõE§ êÝAgl
+öe†9ÖšqÚöÐ
+âݶݗ¨Iø¹<"<7HfBÉ­$6.$¡ǪÊeÞ•ä)’Þõ@ïÐ2¿ÙL:‚®X*i(ŒT9m½.Ú–kgämšcñìÈ=¹ÀÓî,ý
+"4 ù#Ôò
+/'D➟¸ÔÒ²í|š<–>¡¢'ù),ÔÆÏtªû‹bÿpÿ ý¾ÝîÀõÂýßšZ Qp÷4¡ÜûŠã¢œn2g‡Œ81AJûñ¥’d¼4h‘º^V‡jñ°Ørí'V嶤”Ç·Ånae»åOJã`ζÿÂ0N² ã^rZžGf2Œ-û¶Dw3€þ<m7™©´@†&p¯F|räýU “-gí.ßò'+LYTà”ª°¢*EÚ›W²âäc¶"|‡u_ï­ BFDú»b8YulÞº‘ÀÍ!úÉ^všÉ&¯E6ëWŒÁàgßØß(oå ‚u–ÛÆ&ôý¬uÕ,¬¿e|ö*òøöõ
+±ß¢
+­É$xQP’IA
+Òö×"Û´2Ì«-g»}¹´#›†ÍO ¼Å ›ÜÃØao©ðY•O“æ4¦h *gˆQL-4n ó-s'ЯNa O¨Ñ?L hžFi$³Öo¡±ûü0UŠ€0Ðûˆf?yŸ&£cqiÂ(ã'IÝÅ[GV™ÄAúGNÀ6-ûl¢NÛ(_›P}ëØæ/Ž­|“¶
+ &½_næŸ.Ç#{ #à™ÕÔŨ ëø–˜#©W“7ÓFìÔ^¼¬áÒY ý $~dHs`ÛTÏDa(4(ñÄØ‘ Î’ (n¾tt½ãèW¸>ÜS s]ã”·ÀAÕsºÂeþ û·Rv[Õ󺵲É(ù\~ew¥„mÎR¹Ï½‡Íháˆ]J˜£,ic9%ÐñÂŽsÃù»©´}ÿÞr»+–¥¾$ËVfpv6Û”û3•Ü$Àv/;qIÓÖþ
+Û\^>„U5>´ÂÍe&ï*NEÖ E#²¹‚Ù”À¬ˆ8…#Þ‚¨[û6pÛÉ—&’9NP¢R®íRdÈü¤Ç¸ÀŒÒ䞙صNM*0¢˜éiYp`C=öúk`ëDÒjy¨ FU~XB ?Û™´8²F`¾éˆ3# Xf8Ë"yr^ ð…ÛA§23ºG-a2s¥ héf†o®Ô#?ô'Û /MÈÌ8(dÌœ‹BŸrPÀ•ÝT‰|~€‹6ä¸xpqÀ­’g¬mkHp°öЈ‰ âÜ|_öåb-†‚Æ(Wy—'°¦`yØ[cè·oe_9L—6
endobj
-1413 0 obj <<
+1806 0 obj <<
/Type /Page
-/Contents 1414 0 R
-/Resources 1412 0 R
+/Contents 1807 0 R
+/Resources 1805 0 R
/MediaBox [0 0 595.2756 841.8898]
-/Parent 1398 0 R
+/Parent 1787 0 R
>> endobj
-1415 0 obj <<
-/D [1413 0 R /XYZ 56.6929 794.5015 null]
+1808 0 obj <<
+/D [1806 0 R /XYZ 56.6929 794.5015 null]
>> endobj
-426 0 obj <<
-/D [1413 0 R /XYZ 56.6929 362.9244 null]
+542 0 obj <<
+/D [1806 0 R /XYZ 56.6929 511.0366 null]
>> endobj
-1416 0 obj <<
-/D [1413 0 R /XYZ 56.6929 327.7284 null]
+1809 0 obj <<
+/D [1806 0 R /XYZ 56.6929 485.4552 null]
>> endobj
-1412 0 obj <<
-/Font << /F37 802 0 R /F22 737 0 R /F21 714 0 R /F41 939 0 R >>
+1805 0 obj <<
+/Font << /F37 1018 0 R /F22 953 0 R /F41 1208 0 R /F21 930 0 R /F14 956 0 R /F48 1228 0 R >>
/ProcSet [ /PDF /Text ]
>> endobj
-1419 0 obj <<
-/Length 4207
-/Filter /FlateDecode
->>
-stream
-xÚ¥;]wÛ¸±ïù~”ωXâ‹
-4žxPs\Ó “(z“8á§ÊЋ¥RÞ[ÐÑr_7ƒÖj›†ÃhÀC Ö—Æm8¢n–øc-Og^ÁŸÌ;¹Ä%,í ™ìm¾–ЉtZþÖµøvgËà–¸©À2€Svn‹]~®º6é OÐz: µY=5gjlË–ÌcøêîQQ•Î0¶þøm!¶Ñ¼âï¾|(ë=µ›3Ï¿Ë·¼@Þåȹ̯ùéK?²ìè7g,wÍþÌÍDzª¨Å.ä!h¢ÝO w§%›ú¯3xº`ŽÁ’‚A Ú+Ò`î„ÙCyuŽ–x·¨RS¤–χh\<E‘eqTÙ.`¿-zûÓ‹§œˆL-5³Ý€R¿ÆvË4Ѻïã©y
-Rúi%?zó°f¢ôÌŒƒµžQF©9>Âî-w§qÜùxlNÜ; fQX~îšä1 ”|êÕŽL´îò°¡Ñºï
-Å4–w¼7ßt”ë~ÔDÆÚûæ\!•„æÕcþÔRû±9}AÍÉ2Žv<ŸŽ”ödž$óÏ™s'­”yµ9×VÆ ¹¶h(î•èe³ÞOì$ï«äßpÒ!ðþ6äBÔvɽGѤɠ33Ç)BNC]<=hôV™\^/óÐ*È9ÅñŽºkB] `l´B›dÁúÒHØIyàÅîí%>Jò¿bµkKñ5?`èi,™"2ÀNõ$ò1ÎUeò‘A¹;ï÷O³
-ßæ”·÷1ňVjÓœN×nu>vܵxûÐbæÌ Ö¢QzÖ…:-¢-.¶uûLaA÷òØõ¡Â4¸NLb‡ˆ^8Ž…#z€õ‰´9NÇÜ·ƒüôØñ´†~y»zÿãÇÏ<ƒâlåŒÃá\ƒÑ Ž—ü€†œÊÌÜ
-‹°«{É&”±Å¡ÙØ‚c”Há>|U$Eû ¢PÀÿ¾DÆ­È!ÿúMýæ[¨™~§>ê·Hc]ô×òp>ÐG4¤)+;öm¸^¢ùÂӌ[&Bû²>§¶×z–û@U*­ÎM•1ÊÈEG0rNÎSÄþ`¥$•’/›
- ƒŠ"tª¢°'ÁJÐÇŒDòÅüF¥Ä~S€>£_êæq.jß/Ñ¿]LYÉbò¸pü†*ÓלŸ=þ4ñ^eS/§Ò,QÚ.ÜA^9TVÔŒ¡
-HZ„zFK«ô4‘Br¢ÁÇ‘+É`àU"¬XrYmsMˆ•ãE߆/î–ö;î¯+,‡„Ãéïw!õzâM-"™KtŸU@fØÒÒ!³…åt½Òómg“Ç‘?–3(G K[ÄMüYÚˆ^$Îr«—·"û»Ë òö—Xð%!­ÅpáZ‚6£ÛÐãM¦I2ÞK5±&` ^s‘¾ÏõèèšfËð'‚ó[€xÆ?@\ò•aèÃðcÞmîcQŒ·0Ù5æ TÀ‚(æøK8±‘db@æ3¯WÿÆ48z藣ط̻'úàÔ9TɃ¾P;øq#lh‹œ‘D½D\/wÏ•sø#Où,z-Þ¯ïìÒBBÝÏš¨Sv7‹é:VñÒï[ÌÊ$uý½h]ROôBÓJêg6ê<æÿÅÊ£…ˆ”¢è­/׳
-4[뉟_¼%²‰ò=ÿG×¾¸Dðm\ÂO!*·³kŽ»b–6Έ˜%‘CÉñ’ 6SI7ÖIÛÐ,{m€Tå!” lŒ¿ QŸwTbç7àzs> ñ(ÂÊú®9m‚X ÓJh:©„Ž™ð§M3?º ¦T’·2ÎåË_0]²Øð{”Jݼþ<òس§)ãø4òl<º`@¾‰&¹÷öñšrY°$ä“C…§§y}dq^”2«©{Å‹ŠÊ¡›HRî‹_“Ê
-##¿¾OÏÔLšÉy½ACÚ³Q µYz6áT¢Za‘ùC2‰M4„4Âò
-¨„LÜpLñÖ–¶L‡~®‚®Å)3cÀœÉ)Ú&77hùR,¬ÃŒçWÐ"_K£ààÍGH?4ú ¯ ¦bõÄ×>Ó§^ÎJ2 ß~¾ùéíüT„È „̲pŸ¥¬·ÈBê<í¯¨ñiô2¯¿O žOoçx‘ŒÏE$ÝYð«æ‚šÌ$B¨ 1ã —(˜ãb>Zw—­º¼â§ x ×ð/·vZìpÙÔ~Y™®þ—ÙàÈû|ϤønŽ¦ÖÝ7WÁ›z^ÈN.ŠÂÉ:8X«²©Ä5Ÿ­i0­Ü×ywî«-¦/ý0øÝuq¢÷‚øyn‰ &V`Ê1!œ8R
-¹jóØR;lÎUW+‚81ÙRøB +ïOIv£LŒ†R½õ2±]rUAd:±/ÃFaEÅ\äìó¢vþBÕF@b¿bê´Y*Þ@ª¤w/ÝÖ(°YÏã]?d ¨!¢ßÍ/nðyUL
-¤Ž7Ã
-üQ’:g¦Þd[tyYµo£ñ,fæu[´›SyÌ/¿´Ã7tø¿ß«¤Ãƒ×ç•ÔXõ”T
-QÓ†qÔÆ+‘NÙ+ˆ,øí¨½†_Fsœ“è‡þ³C‚éHì1N™’#b." ~Ì·I˜aêK„KÿÞ¡ ^/­–öÿoñ_ÿëÇð1qçä2áXÀt"6&*üOÇE¬ØÿÈ%éÿ*[h”endstream
+1812 0 obj <<
+/Length 2026
+/Filter /FlateDecode
+>>
+stream
+xÚµY[oÛ¸~÷¯0çÁ9X±"© Õ¾¬7MÚ,Ú¤ëø
+Ù¦m¡²¤•ä$Înÿû9¤,9jšlpàñ23œùæ‘L‡.üèPøÄå‘7 #ø.õ‡óÍÀ®`ïÝ€Ç9mª_§ƒW§<F$
+X0œ.[²q… Ãéâjtü~üiz29r˜ïŽräø;úõìü-®Dø8¾8?={÷ŸÉø(ôFÓ³‹s\žœœžLNÎOŽ*|
+üÌHøÃéÙ‡½›Œ?~OŽ®§¿ N¦-m{©Ë•! ®®ÝáÌþmà x —Ð(bÃÍÀó9ñ=ÎíJ:¸üÞlíjÖ>ü|.ˆ/XØ c}
+±ÔVØ}žYIY¼±ú¤q-ëµTˆƒ]´e”.ÄŠ«-*eUäY%­ãÎ0´p‡Rù>ÓŒyQ'yÀ©;š®%zúü¹ø„C#P“
+Ÿò®Ð&Ë
+„¥™!‰Mð?š¨¹Mêug¯¶xÕ8ŸƒâIU'Ù
+çùÒÐYmnâ2‰g©™qY?$ƒŠ®i·™Æ’3ðÏjŒªí\©Ãù(®pS9ZÞÅ›"•džoˆq<ì ‹)Î7VÁJy$F[­¬çå^e‚Pâ²°‘Å­,6Š3\8û„s#I¹Àõ´ zÛ£K#ãmD·ÇÇ ëEãBÁÑ…‚Ù€BY¤<Z¤ñ\š ?ÐN&•¬+\Ô˜7Ôt ºçŠÑwâÌÇGÔ®¶e ÿÍ)›¼ªñÀ~“gB@Ïå6m4íqó<.êm#Q…Yf¢ô&Iq´È7qbVíÓãmœ¦6†W¨ØBf?› ÞÖVäΆbšêJ„acb+SŠ¼ª’™ò®Õ\/b¾Ö|œ*ýÜ%À‡A«ÒÀL«ìhÌ'Ÿþ‡ƒ¹]™¾üF–e²
+¾ÒÛt‡TÀ˜tYi«ztƒ aT ŒúðêÀMÝ9ˆÛ¿õŽ…> †­ub2”QBÕu×Ñr/:ç¥ Àê1…Œ‹œ@ƒðy]þ±js¦¸€ƒ¾f¯_#¹sH¦å_;ÇEîý=8œ‘7LQÁÖ‘ï‰ùpA{ÐŽ ØçmÕªî]Cy[&س›Ü1ƒ¬º•¥!Ò=¯Ž0¾8”wsYÔÍr ߃ðÄmÚè¤0Žy$r zÚa èP<âç—o÷A®‹®vÁè‹ûªíÁ²¸w²jEŸŠ§D?\î÷÷ðZ®âÉð+KtD>`Öwes¼®%Àqʨ×{ƒŠ³J–7ÒÜ—M…Åwû2Þl Ãé-NÌ'aÀ1ú¬ AR|‰‹òêUQÊer—ÊìÚÞ :G ¨t®b–¯¶&Jv²ú’—_²§þë>d sQæ7Ð:Éݲ|†ŒŽ¥„J_Õ/’!Ù?¶Añ:ÛEáTɽ¹“²íff¡}Âé›øîeê²uÙdë¹i·Y¾‰ëýí‚#(Dœÿe•ÎvN§H蛦sèc:•»ªÓTuÙT!#àêû;„k£ßž“SåÛr.÷–&…§ÀZ¨o‰0"œ©BªK³wX²ýak}oûU‘—u“UjrÝ£Ÿúd]68âQ žÎMÐV5x¨jh[Ÿv‰>[U¯fÐ'G½Â;V²Ü= Ðý5Ú hð2@Cõ>òc æÞ3ÿ5#
+ïà,ìõ»nY;Xš ¥£~[í¦¦)Ûmí[½Ña(XdzcÁªçEÄãQЋãÞÂŽ
+ûe ô8~èõhmîEðú0ì"͡׫J©Æ£Ï‹GêC·÷lMûÁ¢/ëéþjƒÕ÷ŸûD}yïùäî6’_üÿ-ëÿvÏÝ€…V)ÝòCÍ›ªþ7öNl¤endstream
endobj
-1418 0 obj <<
+1811 0 obj <<
/Type /Page
-/Contents 1419 0 R
-/Resources 1417 0 R
+/Contents 1812 0 R
+/Resources 1810 0 R
/MediaBox [0 0 595.2756 841.8898]
-/Parent 1398 0 R
-/Annots [ 1421 0 R 1422 0 R ]
+/Parent 1787 0 R
>> endobj
-1421 0 obj <<
+1813 0 obj <<
+/D [1811 0 R /XYZ 85.0394 794.5015 null]
+>> endobj
+546 0 obj <<
+/D [1811 0 R /XYZ 85.0394 314.8075 null]
+>> endobj
+1814 0 obj <<
+/D [1811 0 R /XYZ 85.0394 286.8362 null]
+>> endobj
+1810 0 obj <<
+/Font << /F37 1018 0 R /F22 953 0 R /F21 930 0 R /F41 1208 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+1817 0 obj <<
+/Length 3838
+/Filter /FlateDecode
+>>
+stream
+xÚ¥:Ûr㸱ïþ
+?ÒU#‚
+çäåÍæ—$OUzDòýOÞ_ÿøóÇ·W6Kn®úpµRF$ï¯ÿðŽZ?~|ûÇ?¾ýxµ’ÎÈäûß½ýÓÍ»4”3Žß^ø žþžAúñÝûwß}øþÝÕ¯7¿¿xwÓŸe|^)4ä_¿ü*.7pìß_ˆT{g. #R齺<\dF§&Ó:BöŸ.þ¯G8 Kù'Eªt®˜ÉHs¨¬ñi®• üåj• ‘œÛrõ¯syz<6§nulš=ÁËöÍéuóõÅö+)SoŒ㘮_a«¥‘ú|¸-Oߎâ|Ü]YÕ]yº/öÏâZ)z)²ˆ’Dãÿ¿ÃÁß¼Wò²ßi‹û‘z¯³^~¤™€­…mÊ]ñ§v>”uGÝÊ¿ ¡êª«šš E½¡ÆÏm±+y+5b7ì¤@òœNxsWöô “¤Ks'r˜Œs˜€§¸ܘáài#Ú„L6D[ÙRw}WœŠ5°¬j»jÍÀ®¡ÿÛ’þ‹¶mÖ ÙPÿ¡êîx„þNWÒ%å¡é•ÔÅ—2‘  5Êëäz;Yy¤¥HÓZ»/¯dRï`‡p[™Kµñn*
+­NÖEMf½>Ÿ¨Yð$¦kŽÙ—÷åžço'“
+€ÉËâÕe"uÖ¼æîT&Ÿlߢ’[Í€½º»¦åíQÒ#´!K°£SÒ,2„<©9®è‚I½IôS.5Á^iBÂg ZíêfÐÙÌŠpaM¸¯À–àÖØ؆3êf‰?Ö‚éÏù2rïÔ´´t6Üdr¶ù^2K•ËÔ»×?ÀêlÜ75Ø0ŸrjY6å¶8ï»6íÍ*½ cƒ™I›356UK¶1ôº;TSåÅ
+-=³Ü&€N¿Ær+‘fY/ÝÇSsqU}Ù.Ƀå&î}š¹MÙ¡«L©%€îÊÀõÐ j¯­KöÍ1„ q
+dâ4X¨×,¤ $‘'ÿf[Dí6Ð. ¤føO
+ôub?füÄKT’Îê,¬î¨‡F:=‹‚¢fÃÓ»åØÊšÔHã_©¢à­ŒŽúÜ9
+£Ív aÁ2
+šêâíA£·Êäòz™‡VI†ÌiŽ·pÖmŠJ
+F*‚’øù"¯œ ·É·Oþ.Œ£hÎÕq°»«Ìåc²#šHbµ‡ýc bóÏ3® `–éRýᆰfb¸Jí“%Ùž÷c”Ë0`)ªöŽñ21Ü`Kð‚À0nÀŒ-{~ª‹@ðæâ:ìE|ÐÞ‘GhÁÄ‘te}$’´`#{rÆ¡ðFBÿ†`Ûhƒ=Þ—oæFpˆW&–%VuiøÂ"ê^² Ulqh6¶à%R¸½=IÑn‚(Tï¿Í
+[ã£9_¾ªßü
+Vv/Ûð¶Dë‡ §·JefìËú,†'–û@U
+­ÎM•QDeäš#9§æ)b±J‘Š*Å/M
+H™ õŒ–véi"…
+äD=‚Α+É`àu*­\rYmsuˆ•ã+ßš_í&ú÷¯ –CÁåÓ[Žú‘µˆä.Íú¬2Ö¶™-lw ×•ž˜¯“8[<Žü±œA9½Ø"nâÏÒ@4ðq–[½|È0†ÊxHû7,è)Hk±^[+ÐftdÄø’€“i‘ŠÏR
+ôaú±èÖw±(ÆG˜Ì¨QÌ/ðŸpb "ÉÔ€Ìç>Kþ†Æ48zO£ØOÌÛGêpêªäA_¨ü¸64‚‹ÅFÁH¢^"®—»çÊ9ü„§|½–ïW€÷
+endobj
+1816 0 obj <<
+/Type /Page
+/Contents 1817 0 R
+/Resources 1815 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 1820 0 R
+/Annots [ 1819 0 R ]
+>> endobj
+1819 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [116.0003 171.5741 166.1092 183.6337]
+/Rect [87.6538 85.4256 137.7628 97.4853]
/Subtype /Link
/A << /S /GoTo /D (tsig) >>
>> endobj
-1422 0 obj <<
+1818 0 obj <<
+/D [1816 0 R /XYZ 56.6929 794.5015 null]
+>> endobj
+550 0 obj <<
+/D [1816 0 R /XYZ 56.6929 693.8729 null]
+>> endobj
+1690 0 obj <<
+/D [1816 0 R /XYZ 56.6929 662.0342 null]
+>> endobj
+1815 0 obj <<
+/Font << /F37 1018 0 R /F41 1208 0 R /F21 930 0 R /F22 953 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+1823 0 obj <<
+/Length 2987
+/Filter /FlateDecode
+>>
+stream
+xÚÅÉrÛFö®¯àm¨©°§÷%>9Žœ(•8™99®DB*$@ ÍLþ}^÷ëÐ2NÕ”ìõõÛ7ˆÍ(ü±™U„
+'gÆI¢(S³ÕöŒÎnaï»3Ï,Ò¡E÷Ô7˳¼fæˆÓ\Ï–7X–PkÙl¹~?õýË·Ë‹«óWt®ÉùBi:ÿæòÍ·¸âðçÕÏo^_~÷ËÕËs#çËËŸßàòÕÅë‹«‹7¯.ÎÌ*÷y„0qáõå8úîêåO?½¼:ÿ°üáìbÙÒÒ¥—Qá ùxöþ­ìÎ(ΪÙg˜PÂœã³í™T‚()DZÙœ½;ûg °³®ŽñO K”åf„œ1P9¢/7Í]u¸½;_HJçÍ]ŽƒÛ}¶Ýf{œT7Ç] À²X&1Zi@Æü=¿¯ã©îãgZÄC«Mv¨ãSÙfS}®q|SÅ'·‡MSì6ñˆ‡ù …Wå9›oîý:›g¸]åmç(vyUçûOi\Ôf ¦%1–91â”âˆÕa¿?gvž—Á˹>ìvÕ¾É×$\¤³§„jƒÌ[Ž3ÄÆx$µÙge}“À‹º:ìWù{ È—;ïdåz®`LOÃ]|Ò# -¨¢6¶Çy`7—j^ïòUqãI•eïW/ß~’¸äñHK:^—ü“«<Y¯‘gu„ÙT¸q¡ÁkëÈtljLö™D.¨œÿ«*s?RGÒÂú碹‹ëw9.á‹Ûª‰¢ˆÁVAKìE”€¼¦ø”ƒ0cs°miÄü5>¨€:„†ôú•>\9„[•
+øDŽ7•Ðžn˜
+úÛ6kVw¿m€ò¸ñgû¢ žö5q@7!äEÀ.ÓÇæÏcÂØsª\+dNŸ)äos¯Meq̱0ìÃà„GT´/ýÉÌÇX‘Ìt ™‘¼‘¦s'â ÑRið¶Ñ3áʪÚne±Êu(GçGJýàíà7xOøÅ\ÄŸ»¾Ç•ú¾†7pœ­·E Hî³EUÄ*{¢MµŒ ÙüÞæ‘•Ùj…yPgóH9΋œÌ6ëUýš¡Ì¶3Qð(Ó]VùiQ6y¹Ž{fÐÀ¤-ò?ŠëMÞÝש¹€“cÇÃÏNí—vAUS­ªM^
+ýj}¿\¾ÅQËhñ·ÓñÅìü2äŒ)Ô}<­îøÓÍ]Öà(öç`äð'0
+~ê]± Ù+Ì°ð÷£MqýÇvÃÁh¹µm(ɨ/ ÔPýc”Jû=ßð€iHA¸älhÜjd…8ß› .y횀<läŸò2½‰¿ îàUŸ‡b—<¥Õ!‚FaÂ*P½ÏöÇhéT'ìeå=žŽŠï×u˜°ºb9å»HOOô‘Çø›c¬š6‚—å˜óÃåÚ¶,è¥à¡œemaT• ¾åqå. ÃO,² 3œ._½Åy]­~Öcò²(oñL—‘ƒ°Ð‰Ücy‚ÔDѤ0Åî´ÀP4 %íL
+}!¬ùŠÊÿ¢/ нË6c È~­íÆPb!Æ´94öÚ~ {Õu’áÙêø|û½F{>ô\Q<g#yþ#.Îc‰“]¾ß Rè €ÊP½œÅ¼–š‰&%%†Ë¤g±]0Hè àB:!ò}y>—
+˜ø6îI2ˆ><Ä: Σ-ÇÝ,Z¶q/Tb~ÐÍ6°ÕQ”ᣠl¢Â o Ôà¾}³ÉŠø X¾ì§S!oØa3ô3&‹yltÄXSœD£»âö.ýk"ë y¹N^<õPºþæ¤YÒûÕé¦ô˜Ö‚øx
+endobj
+1822 0 obj <<
+/Type /Page
+/Contents 1823 0 R
+/Resources 1821 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 1820 0 R
+/Annots [ 1825 0 R ]
+>> endobj
+1825 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [399.2874 61.5153 467.9594 73.5749]
+/Rect [399.2874 687.9386 467.9594 699.9982]
/Subtype /Link
/A << /S /GoTo /D (zone_transfers) >>
>> endobj
-1420 0 obj <<
-/D [1418 0 R /XYZ 85.0394 794.5015 null]
+1824 0 obj <<
+/D [1822 0 R /XYZ 85.0394 794.5015 null]
>> endobj
-430 0 obj <<
-/D [1418 0 R /XYZ 85.0394 769.5949 null]
+554 0 obj <<
+/D [1822 0 R /XYZ 85.0394 580.7887 null]
>> endobj
-1304 0 obj <<
-/D [1418 0 R /XYZ 85.0394 748.8663 null]
+1826 0 obj <<
+/D [1822 0 R /XYZ 85.0394 553.3134 null]
>> endobj
-1417 0 obj <<
-/Font << /F37 802 0 R /F21 714 0 R /F22 737 0 R /F41 939 0 R >>
+558 0 obj <<
+/D [1822 0 R /XYZ 85.0394 453.4945 null]
+>> endobj
+1827 0 obj <<
+/D [1822 0 R /XYZ 85.0394 420.245 null]
+>> endobj
+562 0 obj <<
+/D [1822 0 R /XYZ 85.0394 160.4691 null]
+>> endobj
+1828 0 obj <<
+/D [1822 0 R /XYZ 85.0394 130.029 null]
+>> endobj
+1821 0 obj <<
+/Font << /F37 1018 0 R /F22 953 0 R /F21 930 0 R /F41 1208 0 R >>
/ProcSet [ /PDF /Text ]
>> endobj
-1425 0 obj <<
-/Length 3036
+1831 0 obj <<
+/Length 3468
/Filter /FlateDecode
>>
stream
-xÚÅËrÛFò®¯àm©-;/`fâ“cˉS‰í•™“ír$$¢L4
-´F¯&¬|€Ç(ŠNÎyј¡ÿùxêe™KP"m™j_T°o|Ñg™S"oò²Š¾ÁÁï.àN¨ãÉSŸMs´$“U‡1b^_·Š^w„J.æ› \+¹!\Y—ûý±È×)Ò.Áh;V€wmðõ®¾˜x8¸Õ®Ôw5Üãt³Ï ²Jô,ŽLlN^°)+’¤O=à{›‘,Óõ“žÞfÇ9Îó<Ê>íÄ]ÞÐ-Ùs‘îGã";‡¹CÊ“¾¨Ü4/š¬ØО'„kt0‡ç–Ùùj—õ÷Çñ€fà&ûã®ÉäDÐnéà_¢lÊu¹«Ã­„Ð37ÞŒe™ó‡ÞáØàÎ×-W=ù≢ÙùÄ/F'êG?/—¯qÔ
-Æ9}‰~ôærVŸ †¸ö阷ºã ›mÚàˆ
-YüxAÁ¸>ä;ŸªÂìKÞlq´ËWìw¬Vã¹k¿‚ºÁ&2«?…¤°?°ò{LCÉH(ÁǦ!L‚"0Ô›|·Ã%'¡C㉇ìsVè }ÜÁ£+ùŽ–§å‘PãcÂ*p]¥UmLÏ {iq‡ÐôBt]„ª›4ß…äù<=ɸl³
-õì¼<)¦œ®HBÂéíX¤€ÅÞVAeÑà]ŽVaÃc¸‰A1ÁbŠÓåÓ×8¯ËõGoý0v!+òâaRZF ÂB/NO%*ú2(L~8-¥²càŒ\6£$dÓ_Q
-½¯ UðˆÙàõ½³øzh8kÚœo,C寵ùëDÐb|@*ÖO=ÏH¦E ƒ¥:S‘rþe›¯·!åðÐÊ U³:ð'Þû;s*FaÅ'¢¸’à¨W€ÓS">c pîYÁº„ÔHÇ‘ÒIòÝ‚m1.ú(Ç‚íˆ çqwó}‚•P¼© Yˆ›ã,Dš@ºK9¡êrÂÓL;Ó³”Ë5S0à*¯?b²è$ŒîÑúˆZaÌËÈ«‚øë.x¨ðVƹ¼Í³• ½g÷VQ ‚"ÈäDJð:kh} “÷”àÿ°â‹{¾]úøˆ»Þ û…üR½S’ó·áBõ9hÔdN£æËK+æ%î£CÃSxKi¨Xã!¯ƒ€Î»×Äk¨.‚<¬uócuM@%´>ï ¹O©…Ic îKäwkk‹qÑG9ÖVõSœpÝÝ|¿¶Æ= ­Bé¦~øa*H‘ $
-¥ÐaåI{ä%’ež”͹œ³UŠNa ÂR“®_St‡QHT¨p^†Ô5ÎÞ ¡&¸–P¸©„ÙqávÚT¬†ª¾_Å9ŒHP6ÃBxHòX±,¸Ñü||Ñ:’pB‚
-Áù÷‡B¸ècœˆ.03kº‹ï °\·b¨J÷” ÷Ë|ôI°ÿCƒ_oH0òCHV~Å
-Ì»ä´HÆÜTù]!¬¹zÊ}ÑzìÎ…¥»©Þä¾ÆÊÐ`ÃJ{Â~t¤u›Ac[ÍéSó§}é¯-»ë±(Mñú¤t°g ±wÉç;œSy‰“CVíó9´P>¥¨]Ö`ZKÍ™~$‹´hÃu F!×
-ðrÞ\B½/ }wÈ }”!×BrìÆ-˜#Ó75F9'd;\$ê¯#²Åø
-ùØïUI›ËȘÈì\žcâ©n›oBß©ƒé³—oÞ\=Åq­UÞÜá M·l|ñËø
-Z&â5£ÿJh¡¢a„-HД'A¤‹îW2ÁlrÒ’ ò–¼•7Î0äísùLÍ¿l½3‘!ÂÀàp\íò5ŽA!p€U Rüe±HͶ„ûR
-4°ü¯²Èq¸ïcQ~ñÑD†$,¶å
-JUcÄ´#.“5€„ˆòa'QþYjLú­£Éendstream
+xÚµZÝsã¶÷_¡·Ò3C
+!<TPÂzˆèˆpVK¼²vÌ<Ð
+#‡Lm½®KîÊÊGte›­m‡ŒbÒ9 ¾ÍÀ÷Æ!5èŒv|«a7ŒAøeÍ$<—‘Å |Aø»]¶6Nž6[9²2Dz°×g¢3عÎöûc¿^¶‡½²Þ^í«ºóCøkÅÑ¡0D^0øÕ“A½ß í6{_³+ ¶ÇÃÎ-×2¯)@ËîÒŸ±È‰Ù¾n’Z’M’
+Sžtc€°ˆ:C‚Ž¶ÞQš'S 'gWG7D®$³z´´Üu<ÌHCd¦ÂÁÊžØÁ®¬ÖQz<æx®¥Ç·ÿæº –ÖOCñiºöVu»¡ž]Éd7³1ÏŒ4¡ÕõØ`&½,Ï ŒØ¾F îqNŽBÃP±Ê¤S™t*“½Êä˜sQAàU0LKoõÌŒJŒ»&‘Ç‚@¼°¾ä=KRM>YSvÏ„‹ŒÓ,YýÖž3¶Ïþœ ò6à¥ÀSÑç¼RqƶÍ*¸z¿“±½ßgÛ-ÈxjJ.1K5[ëS ¼ÿiw"Úôĉ6
+pz¬FwÜé!IB ™ÔeÞs³¢¶•`ÆÖTúIFo®`¥Q8¹Z©êƒ[zeèpUŒ‰ŒŸRe+Œ_–KjzöÑ¿íÝؤº«„ •UÏD”uõhöß î%åÔÐéwÐ/GÛeô¸»º="ïï×h…—7? gafÙð‚ë:Ǥ:ŠB¸ÑNZg.˜„p½¨.}€Fùöë`[ö(é‚rÀM?=6©
+Z@Mv@«KG±žTÑsÎLE, zTñ›F„s…V» ,™å½„¼ìŒ¬|Ù‘\“}Yùò| (hEBò—¤b’*IÂÊU¾\=#=Éܨ^ö™+ùiÏ%cYþ”Ëðg“tå $Ã`zF`$
+s8ÅWY7mÝ2º´0õœÀ½°Î „‚ý>ô»bç`"$}E••ýDRMûQyÅèþ[ø•q8€ÈübÎ… _ê4~}“±ŒâÉ&»õ|ð$°AÊ*=†£Þg³ÿ‚þf Þ{c‹Ý(F$è:ÄáŸÁgy7-uÖÌʦîm]ƒÿùÍð²ìîKÂ=
+åØbºD—\&.ã塇+˜]ê̺Ðû\{m²†Yò~0•ÝeŸHSÑ
+;àk³å.iÃ\·¼n‹ß˜M—Ž'6l9ü›BaŸ òÞ‘£dÌîra0RÏ—ç.ð•êj.¯AÄ›aW©z®8p¥–†Z=J[ÈCÊV"bÞ ,Û®šž+~ÃR îÒ¬¡¶j‹Ê"UTÏl]¡×[aheí" ü¿±:V1\t™t¹F>Ý5†nk¸ ><9í
+ï0Xûõ@ç¾Ì„Él‘„¾TòÍ`!d:w~j·3Ù¾¡FC•÷!œ¦óŒJ!î*lÿi>Š»ê³Icªgá“A9õúRêÚ…à°°J§æCÎM Ìhkë? AÁ”ÄÀ~ØJiÍ~JŠæq¤0"Ÿ«÷éÄ—ˆeðv* \h.Æþ¢a~•5“m1RCGš–ÄÊT: KlÜ¥åüñûÐJ½9KR=. -é&ÁÓÞ$-Fß±ß%ZR5’$êî®véà¶~¢)¢Ï¾OCSŒ3ÞPs¡“$J&À¬’ È@Oâ©8œ0žÔ*º¸>âxžsz #ò«·Ãj†z.ÑTS';¬Ø}¾=ž;ø¯®•Å£î;`ÍWf²¨€íié}M׌iLŸxqUrôv—ÜS°\möÙp–YÔ«†Q\»S£ŸCüž|„Áï +áªq ý4캽æ¼Q Ä$è¯>­©2ªJá'3²£µiš¿|A‡ìƒl`Ð0s°`NQ«×bwüƒF÷%ÌžºaäK“°÷Ñ>: 6?Kœ~ÈÖ^ç)~Gì6È ´GŠÜL»Þ–³uZá•–¦oŒt?dè ¡&_rvokŠ•âtXC‹]Z§…1úóå‚Â.:sès{CMksqê¢þ#:w šY♉½ŸñK’è »¿8½~E#¥NJµŠ@NtãBð q,&øÛY­ÓääkmÑ þ¬P²ÓB.:»çŠd1™ÓÆȚɫäF=¸RL6©ƒ ®gàõ¥rwý—þN§"?œÿ7SÐèÿë¿ÚõÿC tõrþoQp†>¸Uå„B•§ñ‰äî?y§¢ÿ‚Çqendstream
endobj
-1424 0 obj <<
+1830 0 obj <<
/Type /Page
-/Contents 1425 0 R
-/Resources 1423 0 R
+/Contents 1831 0 R
+/Resources 1829 0 R
/MediaBox [0 0 595.2756 841.8898]
-/Parent 1398 0 R
-/Annots [ 1431 0 R ]
+/Parent 1820 0 R
+/Annots [ 1834 0 R ]
>> endobj
-1431 0 obj <<
+1834 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [432.8521 109.336 481.8988 121.3956]
+/Rect [432.8521 729.0977 481.8988 741.1573]
/Subtype /Link
/A << /S /GoTo /D (DNSSEC) >>
>> endobj
-1426 0 obj <<
-/D [1424 0 R /XYZ 56.6929 794.5015 null]
->> endobj
-434 0 obj <<
-/D [1424 0 R /XYZ 56.6929 671.1595 null]
->> endobj
-1427 0 obj <<
-/D [1424 0 R /XYZ 56.6929 644.745 null]
+1832 0 obj <<
+/D [1830 0 R /XYZ 56.6929 794.5015 null]
>> endobj
-438 0 obj <<
-/D [1424 0 R /XYZ 56.6929 559.2968 null]
+566 0 obj <<
+/D [1830 0 R /XYZ 56.6929 769.5949 null]
>> endobj
-1428 0 obj <<
-/D [1424 0 R /XYZ 56.6929 527.1081 null]
+1833 0 obj <<
+/D [1830 0 R /XYZ 56.6929 748.873 null]
>> endobj
-442 0 obj <<
-/D [1424 0 R /XYZ 56.6929 273.3583 null]
+570 0 obj <<
+/D [1830 0 R /XYZ 56.6929 537.7045 null]
>> endobj
-1429 0 obj <<
-/D [1424 0 R /XYZ 56.6929 243.979 null]
+1835 0 obj <<
+/D [1830 0 R /XYZ 56.6929 505.9624 null]
>> endobj
-446 0 obj <<
-/D [1424 0 R /XYZ 56.6929 161.4956 null]
+574 0 obj <<
+/D [1830 0 R /XYZ 56.6929 424.1332 null]
>> endobj
-1430 0 obj <<
-/D [1424 0 R /XYZ 56.6929 129.3069 null]
+1468 0 obj <<
+/D [1830 0 R /XYZ 56.6929 392.2318 null]
>> endobj
-1423 0 obj <<
-/Font << /F37 802 0 R /F22 737 0 R /F21 714 0 R /F41 939 0 R >>
+1829 0 obj <<
+/Font << /F37 1018 0 R /F21 930 0 R /F22 953 0 R /F41 1208 0 R /F39 1151 0 R >>
/ProcSet [ /PDF /Text ]
>> endobj
-1434 0 obj <<
-/Length 3304
-/Filter /FlateDecode
->>
-stream
-xÚ­ÙrÇñ_ò‹—UÂj®½¢'Ê¢lÚ1íPtR‰¬R-¹%`Æ.H1©ü{º§{ö
-ì-G{Ë"‰³"KbܵÛíqÁÜmJ³Ç”&9L.üä’ ìKk7~§®¡¯ý ÛHS¯iÉrm[æ©YÑ÷î¦ä™[F[wHÀ NdWdj6—2.’D¹½Ÿ°À¤Q[ÞK)#P-Šè]µ©Öån}O£«fG@é
-
-Ø-ƒÝ4ÝrÜ!¤S±H’âùR“©W©¶¦7xöÀ_-Ê´½îʪ¦ÞÍ~ÝUÛµ¥à%
-êºn¨½äŽš¾×8:
-Ðr\ƽFö‡µBfuÃuγèP”ï"„ˆn+{Gëß´}É®Ül€q‡ÏŒ5Ð)™$[MRÆõlj¶ÌÓä@mÞ/ÖeÛ~ ùÿ™ÍØ”Ýâf¾XW@Iëç¹O¹\îÀt~t3>®uÅþÿ¾
-)áYZÔ}'á߇lLÔÎ.ö»¶ºµs²o8ÿÞ¶›ÝǺ¡fpõû‘xš-ÒòŠzâ8þ¢ ™ÿØ…Ã5󠀉þ€˜,–Ú
-`žR€7õ³®í$÷ À/-Þ•‡æì@35J’mžÛþ!&@“îdlðV-}Kúl›;»[íý΢•_*£ýpeÙÏÂL‚¥‚¡E)çÚvS¬NÝêÖîníŽëö®‡én‰€ßövwOà²Záö+먘Óy .++¦çL9W™ùµ[ëƒh:©Ã÷î¦!À± ß²ý“ÐÍ::릃àíºj±÷1
-#@Fgu?ÖGn{eH)oìâûê‚|Á!ž«`©²\èçJOÇF õEéb“$ÿôr\¢zKTzF×-3וŸBñ&„IÚƒ@ù‘ŒÏÄxõ»»©0‘Ö©ñ)îmµÄ ‘ê À]Ü”uÕn¨éB,§›=Þ#ìÎ[»¶ ßç'ºx¤PXËI A›ÊQ
-"ò[Ï]11£›ÀSB9÷Ü=Ü´Ò†>"Ǭ6K½|T&A ¥K—3é£êLø:ô‘‚ñã.ˆšÛŽ®HÆÆèï‚CÕg„8Äå?i´­»7LêäÖŒ„«EÂå!D”Ë/]PÍ}»`îRäq£Oæ.h›Ñ–ðVüm«ëÚjG]¿*•!d\d}äðHXÔÁ"
-,«z˜Pl“Æ21þîy$ø"E­T¨¢½Õ½Õ\xÔ¾*ŸŒîÎ ‘‚ï"y¦ž6I€õt¸ã1þ ·µ}R#Ô¡ân·î…¿Ž
-j8Vyî$qÔðÚ0»óDC¾“ÔÆžåQÆõQ.°·ì¹Öä‰d¾Õ.f¤g"ŽPìÒÖ îk¸î'úg¬ƒrÀ'*ÌæŒzÖÅòA˜À~Pç# 35#?N¬õ8Ï’Œž% eËýËì0q§ÑÓ¹½ò*iÆÃgçÓi0°ßà{˜Ã{Þt¼»wrþ¥ÑmVÏýòÛèÍÞE0H?kŒ7Y°;lcQ%ýKJ5œ™€ñ³ÊÙ¹·ÝÄb)[ÿä²ÙVk»œû#Ô—7kƒÖÛ‰/Á⟪Êrü*¤P´ÔXËgXFcŠP¼x‰ToP Ã¿Q AvrŠ¤¦Æ\©¾¼ßGåÐ7”úpy&9D›¸«Üw Ì®pª÷¤™yŽ™ÛY^(J÷ , "[ÒvÇœÔ÷ÁPÍÄ
-ëÀ¢â rËâá»
-,Pñ,ß!Š"ôÆ’÷â
-p8Æ%o#‹õ¼X{±°ÙãИ ]MâÚî~‹·ý‰ —ñúG$ÿ¾o9ï8Ìk o†Øê÷ñù—@q¸Ö±ÈM2}>ž¢¿òÁþWã§æƒS’ÕË—4åÒ]>„Ú›f¿^Ì9‚ø’â
+1838 0 obj <<
+/Length 3726
+/Filter /FlateDecode
+>>
+stream
+xÚ­Zmܶþ~¿â¾uðªâ«(ä““Ø©ƒÆIí
+4 ݮ֧X+m—Ú»\Šþ÷Îp†”´ÖùÜ68–¢È!9óÌ+%.sø—Îd¹*õeQêÌäÂ\nöùå{x÷Í…à1ë8h=õåõÅŸ_ªâ²ÌJ+íåõnBËe¹sâòzûÓê«¿<ÿáúÅ›«µ4ùÊfWkcóÕ—¯^M=%ý|õýë—¯¾ùñÍó«B¯®_}ÿšºß¼xùâÍ‹×_½¸Z gÌ—Lá‘ /_ýõµ¾yóü»ïž¿¹úåúÛ‹×é,ÓóŠ\áAþyñÓ/ùåŽýíEž©Ò™Ë{xÈ3Q–òr¡ÊŒV*ö´o/þ–NÞ†©Kü3ÊeÆÉbR.1Д™UR¾<^ ·ê÷Wk%óÕp[ Ô:ôMÇ;{ åV÷·uWßÕG<5ÐÚB™ÚÀŽjWíë-›nA[œ’<êxåV§Î3õ†—óuíãnê…¥
+•Ik
+¦±¯ºê}½]¨ü‚¶Ìr#ã‚~¨†z_w/¹¹­7âb=ýî«5oäxöp¹VBgJ{¹"+‘â›—_Á`­VÀv-¹‚P×¾Ö]Õmj긭< ©Z¢\myèM]wôªéš¡©Úæwà_xµëÔ@n„!þPošŸó\Æ!Û—Â3Y»ªº-SÚÑ[ßó›À`ìhö‡ö!œ*ŸŸfßßÞ BUÐe¹ºËB óõ¡£éèwY^Âæ
+ Q€Ût†ôûƒ©Á™žD+©¹+¶6Ø66Sru×ÚÚ¾{_3vo˜¤^ØÚEX“Kð f&[ÊT?aýGÙõ]‹ö$/hóð:š;„özàu[SWâ¾ Nawäj»² ÇÎ×ÿ<„²b…vOJÀuÛ|X“23¢Œ
+ôz‹Ø/lœ•óÆbu: ÛÜòBÏy:Š‘ZU÷@{ r$¦MÎ`¼}
+:Ø üú¾ïhdì9ôÞ77iúâ{ÚÎ -(Þ’e\âXB´úÝlý©é„ 9ó1JãèÆ/ŃìÛÄþX ‡~:JͤõÐV9ýú ÈÖ#O¥Y½ÅðS–ŧ²©HÃ>±8«Å$4¤‘S†fuÀE ˆD|$ïèÜ4{Á÷žãz°Zåbéá¾'K2óäR7U7uõåªþ bá!ú𡽨+ð¦(G§ß?¤(bÛÌ6`“ÈeÓT‰FÆä/ƒ.X:
+g ¾çmTûžH•¤¤žc^­L«-Èv¾6¹“ÛþÔnç.¦jï«ŸÆ>TÜ* ”#ㅠߤ[ñ”Hó¬,Uôt[°TÀEäéG_áÈW
+ßqüCíßõÇw˜ˆáãâV~š°‡,ÓÔ“eÙ/Ÿ˜€Šú.¥ºçsÖ‹ ¦ýŸ#èk°½:·#ìSøºFð¡zö1ˆHÿуýY
+!êC=©KÄÈàþ–ã—†«
+•Ç@ „jõj˜¿<TGp!§¶:F²`s‰9ÐÞÅ@„1X<-çmôèDØW§ƒÅˆ´NÃ’zÜVwDÆäl×s®BqìÔÍ¡M™.²Ó/VÆ^T›Û¥p@C\gž@ŒÉ¤åLjQBk–©"Jy ôô±bm!8Ö†ŽÀìAøCµá~®ªC‹“ ÁIôx®HÊPaœ¬ãO7!ú˜®Ä.TfÍê9#«ùö !4£Á‚ Qaá¡¢øÐN: X)ÆwÍÀƒ|Ošœ'<¿ú'ƒ â}Œ¬'¤STöQ‚&dòûlCÏ/N”ÝÍ•©Oyñ9W'2+ƒº/]œ¬Åõ”d¸™íOA¤jJ©Ç•“ñ>ߤA©Ü&Å'6©%„<Ûdð@  ¶YQˆˆü~7J'4ÀòKå«2+l>fÒè¾bRfÆ„hü#Œùåh8w
+6•©BÉKŒuµ1æ
+ËF¯n y^¼ÓOˆÙ&½Õ™°eŒþ«Tä›áDãÌœâG+qJrQÛzWZ>I(6)Etbša;˜‰XœºÛ*dŒÀ‰ZÕž³°Pƒ¥w)r‹ÙVI·¤ì«Kòçt–Ž
+þ·p)ó}’{€5•ËOr€©ÿ ÷N‘ÉUñ ­çà ÕâÕ
+?Žf6׬æ:9W «¹~¬ì YzauñÄve&”Ü.IÈ ¾| 5˜A£ ãg´g5+4"Þ$ٜܽ 4|HñUÇ-A—všÏa/î2|øãÜYÞËVo\G„Û
+"ÂÆŒÓ'èx†»ÈJŠerÉ„5Ë`pŠ(õoæ¸|· º¥±Œˆ÷PØ>+h`èÅÙëQŒ“/?øB4¦ËX(¡@NéòY^Kþ.ÜÀI£¸¡¢z)®U{z``³éÆ ÀÖ6FÛYÁÛ/—áÔÇ_Mmv¢*9QŵK•*µÃqK[1
+Àfp@ØÆ‚§íb샗ôò¸‡CP²Œê­ûp³Š­Ñ’߀.¬Ê4Á|àÈp%J×FA+¡oâ´)øš_„¯+xÀ:9Ø wVí©¦fÃăðžM
+ çãº%œ>ö¥UVè¤ãŸo‘É%ÃUjÞ–Ž’,5Ý—ä^JP<·–«ç-}]¾‘oÈaÈÎ’ÃlÜVwõŒ=„£òØY<vÃs—»6
+ò[.¸ì§<Ê´@ÊßMøzüha.8¼j§-³V‡˜1´¡ÔÛšo¨€©ö‘êô°Ÿ(1›Óò³3… Ùcß¡*H”Zúj4O¥ÞÿûÕñ^]d`Ðåòç§*·xÓUÄMá \q¾óô1ëÇ[ÿÎ};endstream
endobj
-1433 0 obj <<
+1837 0 obj <<
/Type /Page
-/Contents 1434 0 R
-/Resources 1432 0 R
+/Contents 1838 0 R
+/Resources 1836 0 R
/MediaBox [0 0 595.2756 841.8898]
-/Parent 1437 0 R
+/Parent 1820 0 R
>> endobj
-1435 0 obj <<
-/D [1433 0 R /XYZ 85.0394 794.5015 null]
+1839 0 obj <<
+/D [1837 0 R /XYZ 85.0394 794.5015 null]
>> endobj
-450 0 obj <<
-/D [1433 0 R /XYZ 85.0394 675.8159 null]
+578 0 obj <<
+/D [1837 0 R /XYZ 85.0394 500.2755 null]
>> endobj
-1407 0 obj <<
-/D [1433 0 R /XYZ 85.0394 651.4464 null]
+1789 0 obj <<
+/D [1837 0 R /XYZ 85.0394 475.2167 null]
>> endobj
-454 0 obj <<
-/D [1433 0 R /XYZ 85.0394 522.8339 null]
+582 0 obj <<
+/D [1837 0 R /XYZ 85.0394 345.3976 null]
>> endobj
-1436 0 obj <<
-/D [1433 0 R /XYZ 85.0394 492.6901 null]
+1840 0 obj <<
+/D [1837 0 R /XYZ 85.0394 314.7239 null]
>> endobj
-1432 0 obj <<
-/Font << /F37 802 0 R /F22 737 0 R /F21 714 0 R /F41 939 0 R >>
+1836 0 obj <<
+/Font << /F37 1018 0 R /F22 953 0 R /F21 930 0 R /F39 1151 0 R /F41 1208 0 R /F48 1228 0 R >>
/ProcSet [ /PDF /Text ]
>> endobj
-1440 0 obj <<
-/Length 1169
+1843 0 obj <<
+/Length 1604
/Filter /FlateDecode
>>
stream
-xÚµXKsÛ6¾ëWpr’:˜ïÇä串ëLí¤ŠzR5Šm4$Á€ e%ê/H
-X¼bWSi7˜ žÈ£¯ vd™„ÿÒ}Ò|—„8ÝỜPÄÇŒž¤—³Ç×ÃOá68£ÊlºEåŠÐU—ªS_ºw³íÀ`«b¦UÑm¯HÁÚ+b€!û<X_ *y-2E½$„r—ß3Ëx&ÝÑpsÒýMªý5ø².F_—G ÷ƒWñÖª,P4@:7aÓdmC}}íLKv’Ñ~ñð?ÆMü˜P°Ë×i³;¡$1NxÆDy¤âïßn`XV€S|ëà<qSL€{NÚ3”Üu\#¯²µº¢¨kà˜»<©ØP$ãY$†³“z:uSù/;UÂüÊÀ¬7(Â쫳Á¢@ŒÒp«*Y^îÅå`³%# $áéÅ+ȯhû”¦çÚ'ú½Ô®äDUçu
-À…Ý ×]`¸´<Óæ8г-»ù¥™r`ày®ÖßgŽ—b}ùÜ£›×˜õKùÈYoëËŸ~ïÿ­àEªåûfûÖ6ÍNÕiz>´}"•j*Yÿ‰æêåþTõDäƒ7endstream
+xÚ­XKsÓH¾ûW¸8ÙUh¢½7§
++‘oV±ß×€%4wunP¨\hÑk…¼À•”ßðçòõ`í nJ]©@¤Qî/wWI, #F(óˆ· kºäóÍÉÇg–5JÂñ¬7-ð~¿0½
+¼%·Ð7WpþªQE@–äJÕ¥Žì©Ä`ñ}8žC ú1T&zÄÐê1Ú³¨›^ ã6¨
+\·ûKÊ<¸É™„â(ûÔ» ‰£e¸Ý­âð()w õm÷PBZeáV/Ú›ðå
+Úøʤù¼dv­î—?fí¿ôÙ±|Ÿé¿S1.÷>(‘N‰(}ÿÀsõÕëÐõÿ82Z[endstream
endobj
-1439 0 obj <<
+1842 0 obj <<
/Type /Page
-/Contents 1440 0 R
-/Resources 1438 0 R
+/Contents 1843 0 R
+/Resources 1841 0 R
/MediaBox [0 0 595.2756 841.8898]
-/Parent 1437 0 R
+/Parent 1820 0 R
>> endobj
-1441 0 obj <<
-/D [1439 0 R /XYZ 56.6929 794.5015 null]
+1844 0 obj <<
+/D [1842 0 R /XYZ 56.6929 794.5015 null]
>> endobj
-458 0 obj <<
-/D [1439 0 R /XYZ 56.6929 469.1685 null]
+586 0 obj <<
+/D [1842 0 R /XYZ 56.6929 267.6943 null]
>> endobj
-1323 0 obj <<
-/D [1439 0 R /XYZ 56.6929 441.8256 null]
+1713 0 obj <<
+/D [1842 0 R /XYZ 56.6929 239.3021 null]
>> endobj
-1438 0 obj <<
-/Font << /F37 802 0 R /F41 939 0 R /F21 714 0 R /F22 737 0 R >>
+1841 0 obj <<
+/Font << /F37 1018 0 R /F22 953 0 R /F21 930 0 R /F41 1208 0 R >>
/ProcSet [ /PDF /Text ]
>> endobj
-1444 0 obj <<
-/Length 1176
+1847 0 obj <<
+/Length 1107
/Filter /FlateDecode
>>
stream
-xÚÅXßsâ6~ç¯ðcèŒTK¶lkò”KIš›^îJéeʼncû,‘„÷¿Wþ†@°L‡ñ ËÞÏ»«ow¥E†©Èð4-j.µ!11üiÇ4îõ³ë*ßÕK þÖ§Aç×+Ë5(¤vŒÁ¤†åAÓó1†g—¿_|ôú]€‰yæÀ. Žyöéæö·b†—_o¯n®ÿî_t]ûlpóõ¶˜î÷®zýÞíe¯ G–Ç%«›?zÅèºñåËE¿;|îôK[êö"ÓÊ ùÞŽL#Ðfî˜Ð¢1žõ ¥Ø˜vlbAb[V5vþêü¹¬=ÍE·ùX$v·8ÐF5"ÓƒÔ¦®á
- [¹‡]à˜æY+1™ÏRŸƒ'§˜ýÇ$¦Hœ1 ‚´˜Yd&Ú]Ð2‰þ8‚®m‘é—üÔu£6¯AP!<LâTC‘Œ³›Qqw^ür€(‚87!H ÁuE_㈩˜R _“s.Çq:Žâ-pæV)îÁ E ÔˆHñTß•®˜Mïxiî°¸½‡‹6qõ‰èDqÀå[̆ÚU(Ù?S³ôPjžð¦ kVL±;&Ka©RÖXƒ©ˆ@Ê'Ú€ Ä”dÆ”½‚Þj¢Òù±zñÈç )÷UœÎ‹©„©‡qĦ¼¯<5µt¨2 T¸?
-÷Z¤Gc™p¿Á×ËèXÙGá|1©T­¬(qx*×èø [s„x™¤ààòœKOÒxª‹ÒD'"ù\¶êFMІ[ë©÷aúö´ßÜ,•{<þcµîkbµ|¸h³‚C]Ø—~´_§ÑP/p‹ä‘q<wGß×HÞvߣQª:D ƒWDï~Öâ™:)ÛJµP ½t¨Jõ‚²Á¹’ü% …/ÖÉQ°d©£å§@ÀCV
-IîÇQ ›]"¨|Ø>Z“ÙÝ’­u7í·Ì)Ë)Γõäýö0éRha—”‡I{ÇaÒ>ð0¹:ª¾õ↞ûϽԅØÉ÷¼pîŦ±åÒ»EZ¹µ†ö!ºRˆ!MuÝëZŒD®é| 0v!²=¼•3ÉÁN÷¶‰ªµ&ÊÒ;.´\lïZr\ŵ eSº_˶­žSGçF«}@«çi^ S4/ð¡Í‹m=I‹À¬‘¸¥ƒ¨¯òsG÷+WÍ\[óÛóð²‰q­i™ô0u+¥23º©ù²±ùVõÿ
+xÚÍX[Sã6~ϯð#éŒTËwÏ>±4Pvºì6MŸh&#lTË+)Ðô¿Wò%qˆ;¡³;äãèÓ9Gç*d˜ê‡ŒÀ…¦:†:Ð5‘kDóiܪoTýÔÍ}œ ~>·}#„¡gyÆ$i`Ð dLâ듳_O¿NFã!°\óăCàzæÉÇË«_JJXg_®Î//þŸ}çdrùåª$Gç£ñèêl4(p‘ZoU/,8¿ümTÎ.ƧŸ?ŸŽ‡ÓɧÁh²‘¥)/2m-È·ÁõÔ4b%ö§ í0pGõbB†–18® ]ǶkJ:øcðû°ñµXÚ¦?× X~‹ÔP 2:¡oøn=Û² ^gš' MI9’Ó출(‡©–Sm‚¡ëZÍ…s,$áz9HŸcY’ÿ2]S’¥\sü¨æ¨3ÞßlÁ3œvåíò²Õz èS-šÍDN¢»+1·2°,]­Ê…ì%E…C¸(ßÿ)‡ê+Íg8ŽyEË—º~™îl!¬÷+†;(‚.n°8ìH‹Õ gsÓ$!œd©äX1c|–±®0ržƒ>¶õì<i&՞ɳᢇ•.K”Ý6L#[Ìoï…"9΄R
+ ±2y¶]‘ЋH’Î{!íð”1I“U«^Öå@–yJ#*wˆ¥ÛmÞ=·1IqµHˆe±è,v…  ÷·¨|qsOVûjziÞÓî+î„Š Ù†
+¨x@øCšg}]¾L;Û¢ÆUO¦,d,®#\O÷k¢èË(¹ÊÉA%Æøç*Ôr’(tp<ís"ùêX>Ž‚PÁF¥@N"Éxvr,ïfž“Bà…
+tq&T”¬iÊ×uV[Gœ`IÖ,I:ðòD8Svª'2}Û›€eÃP¡;hªz¨ö¨?kªvÕ­ÓòU^¥Xˆi]Ä襭°[{)~ ^ÓŠVh¦­ª8Ò¡‹1S5dt7KUÔxµà±öA¿-ÿ_0Už<¶Eþ:ù¿3·‹\€¢×åçÆ÷ß¿BŽîHtîÅ}§ì½š
+OСýJAl‹>E@£iu)A³r~h‚)BD”×A«¿`8¬Í »–ù9°¡xV{!ý~íxmŸòlµó‹mQ¡ì(['˜¦k•š'oµA»GNqºÈ›óË%­½©K#õûRtD_jý0})ú¾}©õ#ô¥èè¾Ô:²/m»%²]¨¯vZîtÔSízô ÒözÍQ-KX›Ë!Ëj\Ù¦+ôk¦´´AøœóÍUÓ>ëÿ7ò>×endstream
endobj
-1443 0 obj <<
+1846 0 obj <<
/Type /Page
-/Contents 1444 0 R
-/Resources 1442 0 R
+/Contents 1847 0 R
+/Resources 1845 0 R
/MediaBox [0 0 595.2756 841.8898]
-/Parent 1437 0 R
+/Parent 1820 0 R
>> endobj
-1445 0 obj <<
-/D [1443 0 R /XYZ 85.0394 794.5015 null]
+1848 0 obj <<
+/D [1846 0 R /XYZ 85.0394 794.5015 null]
>> endobj
-1442 0 obj <<
-/Font << /F37 802 0 R /F41 939 0 R /F22 737 0 R >>
+1845 0 obj <<
+/Font << /F37 1018 0 R /F41 1208 0 R /F22 953 0 R >>
/ProcSet [ /PDF /Text ]
>> endobj
-1448 0 obj <<
-/Length 1031
+1851 0 obj <<
+/Length 1084
/Filter /FlateDecode
>>
stream
-xÚÕX[sÚ8~çWøvFŠ.–eOi
-Y:[ºKéK)Ã8XOM-±)-ýï+_1‡Ûfgvò`ùÈúôOs‚ ¤ÿ°Á,h9Ä1¸cB†03¦‹2æzî¾óo@ñ¨~õfظéRn8бˆe g,"ÛÆÆÐ5-H`K# æ݇~·wÿipÛâfsØûÐoÂP³Ûû£“î·ïßßZ
-™Iia •€•ÙtéAý0‚„Z䀀&®h#h! Å™-Jh*à¨,„š ÷;ˆ…Š×@ù ‘ÙÂÕâAÄÙ¸=ƉÃzW€1t#;«@ù`áJU,Z 9‰âIŒñCÄ# #(‡„B#³@Ë¢âW»Ø£˜N¬?¢0÷,MB·pt4 \)ÇÙËÏtéAXµ^æ+ýPµù1óƒü©b?œ”ë]öD æ®ò£Da°>C9\…™>ŠéWø$3ÃÄГ‡›™ëF±Ð6¼ƒxs“=û‘ʽÅ2 *áÁ—t&u¦×êLžé,Õêá%ñÜ ˆžÀ·•ˆ×jf÷¼XH9Y¸jú8 |™»÷ë%+˜úD®%×ÐKˆžï«eu<‰–I 4—ÇÞ‘º ?~e¤—E²Ì¢X«ºUF‰ïj»OÇÙñGƒhE½-JâÕfæÇR¥lŽ#b¹süù¬¿œ$Û–Q¬J{ò2ÞÙÂòwtr¨d²È#üܺ¹³¬—›s¾Š<ô`\‚ïª6ÒþŒOÿ-%iEÅn(g"¾§ÏÙ/K.U $E]
-´\=”~V—ÖGôŽÃ%G­â©Ø‘¿4+‡°I!0w %œi$ÈMÊR ßÒ)Î-£bßűËol]æ@ª”áOð·U¥jíSu8$ºzxªQ]Áp§æŽWà,Y+h '³†«y)WÌXMîØãzTZB0ÄY¯$-á›69(íJ
-P+o™N©Ût¢RéT"•?•—1ž«ÜW^˜LüP—°3 ¯(bÓ:ø|¼Ïäºbú¿®ÇË
-îU
-iZWH癶}<ÿ“úuµÖóùwKnZWr?ãÙ>Êå¦K°Qšg 5 A›sZvèD_åì²ú£¾,ÒF#{}«K_DB?+_‹zÙà“tç¢ÜhÛÎ&0È™Å+û@œïô¹ÜiØr´ÐK]v×4ë”Á¤Ã>ÐZ£Ò¯«ùí9L©m“²G'¤âá64m ’“J<ãhyÑñïSÿnQ{Àendstream
+xÚíX[Sã6~ϯðcÒ ],Ëš}biزÓeÛ4}J™ŒIЬcg%e!þ{å ‰ ˜$Û}h‡a"ëòéÓ§sŽt„=äþ°Ç"<.|ÈfÞdÞAÞ•kûÐÁeðØ T{½vŽN)÷ ¼á¬‚B†ØNGÝ
+ίR¿q¬­!à‰{… R7¨Q†'<Á· J5xNUpH\„ú>T ¢.JrÑH5Š-x“¬´Œ“¿…«¿+W‰ ]ÛßÀõUi Ás´—6çÁ9ä( ^ÜM¦á èS4ê½4lÕüWkòõVžpH9ñ·iÀöóN!õ…x)ž´õƒS}—’ðF¢wi"±‘u繚˜ÆpÝbW¦‘.##Û†·ú™£ åLKs9;\»€àçL¬^íËc?ˆel(Â]7äNê$ùq¬_‡„BóX\aä.WåÍYmf4ó'ÑãBG“82f}wÌQ¬]-Ê×*±ïš´˜©¸Ñš^°AË+gÈiR¹=´R®¦þäZN¾€lMfãµ7‘Nîg‘ŠïÕU’jùìBZ®ùè¨ø=OKÇ<›/b9—‰•Sø#u6vyù’xQ§7àëRêUí柅*iÌxÙÉuåÖÿÐBÉ
+¦Û‘ƒÁîºA/XŽŠâå¢Z§‹ÌZÍlo›Ñ·¸ÿgÁ"f©vªn”±òÖÞëèæ5EêDRínP²UÝÏ”6vœu¢Ynÿ¨ž3¶:Í\ÆWsµ‡Ö²ü“Üç§û$•ÿ§GÿRz´ÿž0Ȉ mó7åLÏïê9ù!9SÓc uÞIiÓÓû/¹îýP¸yEõ]š†dýHHå ðú¡)IeÜzÆüñEñ9õ
endobj
-1447 0 obj <<
+1850 0 obj <<
/Type /Page
-/Contents 1448 0 R
-/Resources 1446 0 R
+/Contents 1851 0 R
+/Resources 1849 0 R
/MediaBox [0 0 595.2756 841.8898]
-/Parent 1437 0 R
+/Parent 1853 0 R
>> endobj
-1449 0 obj <<
-/D [1447 0 R /XYZ 56.6929 794.5015 null]
+1852 0 obj <<
+/D [1850 0 R /XYZ 56.6929 794.5015 null]
>> endobj
-462 0 obj <<
-/D [1447 0 R /XYZ 56.6929 121.4768 null]
+1849 0 obj <<
+/Font << /F37 1018 0 R /F41 1208 0 R /F22 953 0 R >>
+/ProcSet [ /PDF /Text ]
>> endobj
-1450 0 obj <<
-/D [1447 0 R /XYZ 56.6929 90.5476 null]
+1856 0 obj <<
+/Length 2052
+/Filter /FlateDecode
+>>
+stream
+xÚÍXÝsã6Ï_¡GyfÅ%©ïÉSv›ì¥s›¶Y÷åÒL†¶èX­,¹’¯Ûëÿ~
+¥ÞMÏÞ^…©—³<‘‰7]èÊÏ2áM‹;ÿý¿.~œ^ÞNs?a“ N¸ÿîúæ;âäôyÿÃÍÕõ‡Ÿo/&iäO¯¸!öíåÕåíåÍûËI ²XÀzi5|eÁÕõ¿/‰úp{ññãÅíä~úýÙåt8Ëáyñ ¿ŸÝÝs¯€cÆY˜g±·…g"Ï¥·:‹âÅQ:Nuöéì§AáÁ¬Y:æ¿8ÌXœÉtÄ‘8p Œ%‹„H½4ÎYÊÐxðnÝ´ý$H8÷ËõîitNŸ{<£ˆ(dQ",cIkIdÓé@U}зªîº ºfÓÎ5Mît÷дus¤*ú£©uÐõª/»¾œw'
+FÌÔˆC5…êÕLuÖ€®oËúñ¹ÅG6¬Ê:hõ¢ÕÝ2èË•URoV3ݾ\‰úü”ˆ/-éÛÝkíxŠMÕ—ÁJu½[ô\@²‘t ¿ÎÝ4.F{÷‡Z9 ïæ•ê: Ã?ÍÒQµýn=Ä03èlfçÏœEUU³ ~ßèv甿( TÝÃJõóåCè#þ_/ðO§Û'€¼U¡»#ÅwCbáü‘¿cNùs{‰‘½ÐS£ûàÄÞúû—âo'ÞiœåhœÃ×ÆYžÄyÑ´[ÕçÏøÈŠÐàó¦®vÿ]”m×ÃH¼÷Vn¿Ño•Ð†úhûBWúâÑÔàÿ6óNì<ÿ&:Þ^Iá ìšíˆKRŒ-Xfй5ŽÚí'€¦^麧áwúÎe]â¶ÄQuAÄÏzÔÃ>û懈X‰è`&ìNÿvšNrðóò뤵 Áaâ…"ƒÃÉüEÍCûÎããÞþ93rë«ûÓ:ª,éV«
+†#2‡‹ O^°÷Ë,Ëàèn#¹Ð¶rµ<O#–Š<ƒ=PlºDÏæ®x½TU2Ë}Ec×^ž7ëQÍ‚„z§;QD s,¨Ó`XÛ²ªˆšé±TS³ÊF½oè»n'"󛧲°jÓ/›¶ÄÊøäXu·5UdeÏN p›ð}ûºx!0DžÀMYŠ¨¿»â«Hs–ñü«€„IÓÄ“YWG@W©'=ÁÒPØð_`LR+kH¨Ì/;â(úßëuUÎÍSü‡ù$V ÕHJ°/ó]òœ¥QY3hm7bm˜²T:k©yƒ×z^¶šE)Ü}³è=X‚´AêÛò&·ÄX5t]ÿH³¦e ›.
+fåÂ.p‡1Ê+Ð/Uï(»‰s&ðæPwÇša¯æ½S`°ø›5¤]VÒdâ’m0$q» .Cî´Þ3ÖG ¥k²S¥jb«ªkÆÒ ’0Áµöú‚$nj¾°k‹d6DÊðq¯Œ€ùïvÄ+ôBÁô Eß½9ìåÜÀ£y¿ ,_¹©ð©yËTúqHÓTàK®
+bye™îZxdqz°|ß`Nm1~EBP3”—
+|}¿
+á)ÑöXŸ“ndnÕ­±Ï©—\P_tÍ›T™ÂØ.$cYÏ`Oßfaœ‡k >ºèˆ=@i´h³&!º!
+PE{Å#Ú¤`ðHtî°
+¡Ãð ™4úØ8e ÀzÁ! »dóªCÔL/•»ú?™?Žêªf[Yº\Ðw×lì+bc³ß–œMѲՃbéŠ êSÜc¤(máëØN@Éc&sÇŸ÷ö×="|§žQÄÂ4ý³™{Î7¯þk{ÿ¿?\¯áæ'‡§Çñýœ',“yê…1]”üKo¸?ÁØñÿôZ<»endstream
+endobj
+1855 0 obj <<
+/Type /Page
+/Contents 1856 0 R
+/Resources 1854 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 1853 0 R
>> endobj
-466 0 obj <<
-/D [1447 0 R /XYZ 56.6929 90.5476 null]
+1857 0 obj <<
+/D [1855 0 R /XYZ 85.0394 794.5015 null]
>> endobj
-1451 0 obj <<
-/D [1447 0 R /XYZ 56.6929 65.321 null]
+590 0 obj <<
+/D [1855 0 R /XYZ 85.0394 385.7919 null]
>> endobj
-1452 0 obj <<
-/D [1447 0 R /XYZ 56.6929 65.321 null]
+1858 0 obj <<
+/D [1855 0 R /XYZ 85.0394 355.678 null]
>> endobj
-1446 0 obj <<
-/Font << /F37 802 0 R /F41 939 0 R /F21 714 0 R /F22 737 0 R >>
+594 0 obj <<
+/D [1855 0 R /XYZ 85.0394 355.678 null]
+>> endobj
+1859 0 obj <<
+/D [1855 0 R /XYZ 85.0394 331.2666 null]
+>> endobj
+1860 0 obj <<
+/D [1855 0 R /XYZ 85.0394 331.2666 null]
+>> endobj
+1861 0 obj <<
+/D [1855 0 R /XYZ 85.0394 319.3114 null]
+>> endobj
+1854 0 obj <<
+/Font << /F37 1018 0 R /F41 1208 0 R /F21 930 0 R /F22 953 0 R >>
/ProcSet [ /PDF /Text ]
>> endobj
-1455 0 obj <<
-/Length 3466
-/Filter /FlateDecode
->>
-stream
-xÚ¥]sÛ6òÝ¿BôŒÅ
-H È+’3Rs­U¬tâ@'’4ÎŒ.‚NX=Ò m“Øäy>ËRú‚J±)û¡Ú¡lÞÝ3šžÙ8ÓE{à´‡uÂ,TÔW»g˜OðºìÈ‹¨äßB‹àE·=0Ô­xÒàI,ËA¬:™ÆþìÚJh¶KF½ÔMÃÐc…çDæiijèhåcS±¢ ·»KGÝs½”r?¬»]=”CýìQmÿRízþÁç
- JÏö„f9iù+¶ó 7ÓѶÛá}2¥ cº–¿Ì
-
-½±
-ÇJKs[ž[NIo[Ѻypä©ËžX`¹<V4ÈŠÚŸì‰
-²|Ž4,}¨‰Û¸¬;[~ 1çL"¾'Ú±ªDÊ¥A;ÈóRk†ÎŽ¸‡Ï·ú½:à±RUD·+!˴С†÷Ä/ɇLy5ixp/˜éïÀ‰_ï)‘ ‡eÊ ™!,ì<Ú p\ T|ñ&ìUªû)ñ‰f¢ÄuÊA2QFÎÖt`)‚9þ’3
-|Kþ¾‚ýPîôÏÎE¿ô~Õʯšà›'o”æ¸h-º x™%Ýh0ƺ]ø‰»1×€|ªeÏè ªã‰ö[žÄ9`«¦ÞÔ“´_)QÃ-¢7 ÂŒ|Aåd<'Lx²/õrX£’kÝu~†÷á>c€É {ª'™ÁV=)¹/*U52Ü{¤$ŠUÛ3ŠŒ0ë}+V¶ô#+™»îö=œ­Jz<¤Ikzžµ% g‡I9ºX¥ˆË8p®XF¼:‡ƒD ØDû¾bDÉ¿‡—nÞ€Ê6Œ÷OÞ ‡úÅBã%™2>A
-hÞ.÷^>—})A8M~ íÍ ëS„ê+íƒZNdÊ„47>먟Öï²mÊEåãG%y$]65É©¼Å’Á/Cp8¾â¯º%Ç
-é&¬šÃ”ÿfŸmŠèî3~óÖèKÎÉ#¶møéËD‰C
-Ù ¬ÃÄƺè³ðñ\¹Åÿc( ™³—ßvYKþ ѳ]ò ‰œÛ’²f%áOy?
-ˆî>Pƨ¢«ªöc|È­“™U烩ØɱU£CÃR„ÒÉxJ
-Ä`‹ 1Ϥ’GÉÃ
-@*$ÙyVÉH"
-漓å‹nß,|ª$¡-‘Ñ„’Z‘æM7TD8cÈß
-Á”®Ú3–å‹PÝò ôܱÁƒ+¼Í
-­UHùnÅXÉÇ<üˆ?¨àO`™a7ÃÌ?.8aT”q‡ÙˆòMöYX?•=Þ+Ù<RTq&Ò¿Q^˜°Æç *õt
-¹)Œ¼n“IåI‘eÜ—>& !öõâUPDDòRWwú«è¨òU.Ñ
-8õëÇ¢ TÆúkÛ@§­Œ$ÎŽ“  ¨â· †¶SQÀ7HwYû6“<vYèñ낦°4È]\TNЇÙå".×?^e&Ίô¬ÙòÆ0sƧ^å«€wÞœìGoš6?½ÏôóZ
-Ö’æ¯Øv%y׺^ ÿ±Î7Å*·[ʒѹvŒúc_íêJò{­S`ìrz#ðdÄ#å_Ê ž%P!| øxàa™Þ$Uvì9z T7õ¾n ŽÿtœgAüÄ/—Æ6IÒSÕÝHý—È«C"/ÓU/†»¾˜š´ü­6ÛáÀ ¼ýhsôÞæ´øÒ äôoÜĶ–BûŽ6 F^…惜€¹„Ó6v:)ΞÜÎŒ9±ÙHâ£lx¼±’#Jž´$äcÁ{ÅÉ;XÇŠsOLæAt–ä•Þ?q䜢=HÙr<G*Ž…ÏkylrçŸÝ–ÊÃ)kvqø4sb—BN¼÷›­x3n:t\±4)YõÁòL¦íy‡©–0Fþ‡ÞºÕ1<Í&ù%hœOâÛv9kýân>aϵ{„P<a p&›ž+Ô?ŠXU¾ec›g¯ëò.h 5n%*[|„À¤ÜÚ×aG¥aÌ‘MODQ‰ÞÔB,Üp@ˆó+ŽžkjÚÃ*LÊÉ¿Çý Ž\ jî0â—3í|×ÆIÞNPHbЩû×ÅJ(<5Èm8?Ù
-2“BÅi–Ú©?¸‚Ââoþó®ãß¾Ù,NòüØ€>ÕN…=©"Ãà†´{Ùë¦;„è47aÖèèÿ@y"Bendstream
+1864 0 obj <<
+/Length 3279
+/Filter /FlateDecode
+>>
+stream
+xÚ¥ËrÛFò®¯àª2áÁ`0
+³ !’…@[¿2
+œ*´VYjÉÃ1VG êÇ<|ˆ?¨äG`™f7ÃÌ?L8bT”­\Ï
+'qLˆ?Ø¢Û8>Eä‡#åÓåÓ ¾[ïÑ¿†Y§sèëòè¹yA‚à¢Ã0‡pA\BÜ#¡áXŠÌPšjOi¾S à x4¢Û«n×`ÒðR{椵Ýqœ·yæLæ3DA·ŽýÀº§f¯ S¶»æER ˜R¯Ýî~Ù÷óét×·6z¸û”IÁ/£°+˜¼ñ ‰ ž§zÀXq|6äÖ°ìœÎÃ÷É¡7í»ÝÖMÄð2!j'Ã)µ² ,…8àø”J|À'$2õ®uk¦–¡g©¤`Rsø÷›'4Dz&k † /l¸™ò1 Ö±ø´23…‰ ›ÚÙ¸žùÆɨl¹K–Ä*ãúì¯.ê§\*¼4”~¥.ìtáUXffJÈš bæÊ/(­MóQùU˜£)€H½§ƒ!ÊÕ
+N°éütžg¼T”“ˆW‚Zvëu÷Ê
+)ZEÛµ#zHƧ9ÞÁûq¼ÓÊ·OS¨wï˜6‰°ã²,Kçy] è輸¨O·hª©c‰Ä„ë¨?
+Ráa¨7[ìn¤:¸(Hr[žv)¥Jli5K©·6趞k`Ù
+6ß±ùO]¡"LHK1Oâ—mÝÂûì%?ï~ÄO7¿<þ0YIÞ:vn' ÄI[šÞ5‰.½5Q¿]¹÷¡„z®ÛŒÝÓ‚3Ÿ*[©ˆ½kGøصJ €nä–R°3§/4ýÅ
+`œXc²~¨
+-$ŸÞxXèòЙË)Ÿ%M±Ñ§¥ º©d9Iã ÷þ+<€,7â'xáØ,†”;;VÝ|’lž[‰2 9ó¤:‰Ÿ8Þ\7½-'…—Xp !üúÁ5ú8ÿýņù.|€”0—fX‹Å6IË“êêĘS“$N‘Ê`k¢„‘Î8¢8©2ÒöÃ^ï¸_aø_‡Å„ÎBTåv5ô<r¡¯Ø¾É§‹ÃÉ8£¤O ‡ç ,‹¿¯¥¤ ™²f—ÏAó1­°¤Ð{¿Ù’7{ëö ¼:þ(ÃþQK·ŒU,Oç‰9ù:ºò…(ùŸ¹6eˆÙ‡ÊËw”+H‘ŸzÊ@þT¯ÜKãC ŸZÎÏXèwOn=e p&“*Ô?J(%Tø”‰M^š“ÄÓ}é·´+LJˆÙ—1çaG1Šìú#N:"OEQi½©‰øñdqb _Ja¶ Ý»)MzÚüm•å†¹­ÄJ—3±þË­•Þ=A¡‘‰N½÷HYáyÜ^K¾‚Räëóhv“Q>«cžx"N’¥ï~ŽôÿrËsœG|cn‚¿5jBR&RS¿HÿÂäoþýËáÇA&Ó¢Ð!:~y›IÉ)ÿJ}öëœDÅP–hO5:úÿ
endobj
-1454 0 obj <<
+1863 0 obj <<
/Type /Page
-/Contents 1455 0 R
-/Resources 1453 0 R
+/Contents 1864 0 R
+/Resources 1862 0 R
/MediaBox [0 0 595.2756 841.8898]
-/Parent 1437 0 R
+/Parent 1853 0 R
>> endobj
-1456 0 obj <<
-/D [1454 0 R /XYZ 85.0394 794.5015 null]
->> endobj
-1457 0 obj <<
-/D [1454 0 R /XYZ 85.0394 769.5949 null]
+1865 0 obj <<
+/D [1863 0 R /XYZ 56.6929 794.5015 null]
>> endobj
-1453 0 obj <<
-/Font << /F37 802 0 R /F41 939 0 R /F22 737 0 R /F21 714 0 R >>
+1862 0 obj <<
+/Font << /F37 1018 0 R /F41 1208 0 R /F22 953 0 R /F21 930 0 R >>
/ProcSet [ /PDF /Text ]
>> endobj
-1460 0 obj <<
-/Length 3003
+1868 0 obj <<
+/Length 3218
/Filter /FlateDecode
>>
stream
-xÚµZ[wÛ6~÷¯Ð[és"WxtS'uOcw÷ì¥í-Q6»©Š”Sï¯ß H‘"E¥›îÉq8ƒ¹| Š‡bfb;éf‰ÓÌpaf‹ÍŸ=Aßû xæ Ó¼ËõÍÃÅ×ïT2sÌÅ2ž=¬:²,ãÖŠÙÃòç(f’]‚½½»}wóþ§û«ËDG7w·—sixôîæ‡k¢Þß_}øpu9ÖˆèíwW?>\ßSWd|ssû-µ8zœzýîúþúöíõå¯ß_\?´¶tí\¡!¿_üü+Ÿ-Áìï/8SΚÙ'øÁ™pNÎ6Ú(f´RMËúâãÅßZ^?tÌZZfbxF*‘œž–¦à0m Á%Ž&[Áâ8"vààØÙ6"Zt""$gÄÌãX¬¤ò!y΋ýòõ;);̱e‰–892=<gàJ!¢¼Èë<]Ó*«‰(Wø”ÑîRب,Ck‘n²†q÷’íª "<«m¶Èá\fKjØWyñD‚RjùEJíõó¿þS¶0T› Áœ1Òkø÷ç¬@6Õ¤« ³ºNwuEô~ûi¢¼ UVíZ⼎’ž¨x±$:ã­Q´Õ*Ž£ÔK
-r‚Xk½Eí²*Œ½vDÖÏiAÔÍm•¾dÔ‚ÞÁçã>_ר܈>AÕŠ²K˜ñ(µh«™U<ë®É/Zåš+èŽ ä Ãb-ÔŸØŒ8™88g±´f<qXÈàZIÈ s\¨à„uö”ÖyYÌËbý:’Bñº6‡x<5O
-*ì„vŠÉ^t›ÒÙ@5«c§Úò^°¦9$@¿ÿŽ¬!ŽÓ0c…=—ÂÑ*ýª"šª¤6é+å“®×á÷c`X•ëuù‰r´†Þ”¾Bñ™…û
-踋ȼ™•²ï–<>õËÀ=Ì
-vk'E2T#;¡bV'&°ànƒë{(Kàþ*“FTQg»"«Îu¬äÉA xC™BÃæ¤4ýT‡Åì7Ù BÁÛ ™·ý‹rSH¯TèaJ}Éä%­Bß&ý-l,ø«\5ɦÊ:ùÈA%ÃEæ“ä¦ñÞsVåårÄ`åwʶ9%µWŸˆ—%‘^i$üFŠ<XUlš]°ḇÄðì‡Ä ¿>Ü<|DþH¿Q&‡†+ðB‘â˧’ÑMÝW€Š¤pûQðzQ=§êcn,sÎé£ÈtUCŒ¦Xøð%Ýå¥/o¯Um*êY¦uúˆŽl‚{£j¿xÃh³£^=‘ûmþÝå­ ™^B`LUÒ³,ÀD­Dx냖g¯ŸhCZžßC¿û8¶4ÓÚ4ñkñHêµ(‹×Íä ¥y3> Šfº*BQÙ‡„† ñ%[—Û ½0AŸ žoŸÓ²‚õ„ ª”Z¸º¥q[rS].Ê5u-ºõ—T+­hØäKÐ(á˜a´ÐÑ¿èÝ z0DÄLÙðº‰bÓb¬ÚjJ™þÛ4`©xX…CÿCu`xãÚ·ß]Ý
-‚wÆä Ø:\`k¸qú}ŸíF°&WÚMOÞrÌÞÇàCĪ?ý_ ¶Öˆc¬AA¡ÚÊc kŠñX$=;'±øÏX<”ûùXÓ°h!§]ßrQd(mkª>ÃâœÄZ—ë4ÖZ®£0Á»Ñ
-j û´Å©Ÿ4xõÖJ«I¿·Lg´8–52ÕŽKÎì¡]® œ5\‡í·PgÃMÂÉc=={Ë52}hÕ,ôöæÿ2¤¹ÒVãL2˵8½‹B©Î¹î»yjmøϘ<”û'*6ÈBtžô}ËuF‘¡´I´‰$fFÈ3I­Ëum-ÎHšoËu¾©Ù`«OŒ›ž¾å™¿7 «<Q}>¶/qýW]¼¿üˆGø„£æŠÂÿþÉ+Ž\ô;X „ˆÂ© ù8†°Ãv¯{M密ÿŒiC¹£°’c°rx,˜œñqËuN‘´iXiͬ<“Ã:L 
-LÇk/õŸÒÝ/¬Ñ»¹å\MjÑ2 Õèa ÌMlÇ¢ÿO&;²fä¥Ä8{:«i.Aš®ÅèkÙ§mHý씦cï¯ÂMF e:£Å±¬iàù3 ¦‘× ^ÃEѪÊS§Ü@= ™vrò–kdö~°9Ì~G®ÒE›,-
+xÚµZYsã6~÷¯Ð[䪃“$‰gâTÆžxœÚ#É-Q‰THÊŽ÷×o7 x‰šìdËå"4ÐׇFãà3|ë€I£f‘Qf\Ï–» 6{‚¶÷ÜÑ,<Ñ¢MõÍÃÅ×ïd43 E8{X·ÆŠÇ|ö°úyþö»«×÷— ¡Ù< .:dóonn¿¥CŸ·w·ïnÞÿtu©ùÃÍÝ-Uß_¿»¾¿¾}{}¹à±æÐ_¸NtxwóÃ5•Þß_}øpuùëÃ÷×.m}9“¨È?ÿÊf+Pûû HëÙ ü`7FÌvJË@+)}ÍöâÓÅÍ€­VÛuÌ~JÄ ”À2Bòè4[bÁ€­+F<ˆ$ï1]pÎÆe8[„Œš¸q‰â-—pe 5}µ B)¤õÉ&Ëk4Ì×ï„h‡q)Ü‘èa“‚%9ŸgyVgÉ–~TiM…b_1//y</
+W›'»Ô–ÏiY¹!Ü·Ú§ËìÆDº¢ŠC•åO4PB5¿¡¬|ö׊<Åš
+ ôpFئOIù¢È·¯#!„3„Ü4!ÄÂI‹¹ÿ&VT²“
+¾iŽÈß.BÚc ZúÜl%Lêúà³sÏ×eRÕåe<?,ëMž1'"̱/ƒ0Ã4K/ù<xà£`Aùð†šn¯pQ±¿Øüîþ=Ðò€Ú®òWªNòêÅYlÕT›¹ÑýüÍž…Õ*_²zSFÑn±©¢yúç~›-1FIh/©6Ûµkfq­îkí†Éø”YýJõUºôÄ1È°ÝRõc:j’<©Qhn`êVø•óÛ~{÷áêæ6 jò,–VEêHrœœ¶Ï~îÂ"zÛ¬pXA‘†¨Ò?­í96À^ÛM9;:Sú"—,u­„&6ߦɚJÖ×A´íÁÄ>‡i³PK¿,nÐ"Ò
+Dßt&[ƒ•ñ7œê !Žø”kÖÐvÔÉÍ…µÂÂsì¸æ%±$+ÝGŒõ)u†YB`K|¤¢hÖŽR"æ¥X< ™‚Œ€˧î[ÉKC¿hw°!C´í:¥*!d/FlÜ–HF
+Zmƒ$ª¡‘£í®áh(ÇÉ`Ý
+ƒ_ZÑú˜ žM-¡6º›YþO¼ Aóý¦A¿H´m9´)ja¢ÙBGsûÖgÍZ‰@† š“qHlLg±Ï®¼#Ó`
+ù›Q\ÓJnh‚~UQ™ò,í’W*{ÄK²ÝºßŽ`]l·Å …'¨u­ }lnbƒ
+³¹O¿‰Š™çJ‹µ“õ…£ +µ<tÁ
+I€wóˆÊPdÚ›f“VY±QXš€é³ç9)”¿ˆ—­ÐX°k(Ò`B±ó $T`®˜avaÉa~}¸yøÊ ù‘~£8W`…<Áí¦ó›º+
+›Ù _«:ÝUÔ²Jêä Ø”GT‡åÆuw MI­lþDzöž|_f-72m? OUзÈAE%¹ÛïAÍïéë -G«óËçwŸÆf€
+”Ò±ó_ƒGúT¯y‘¿îz#,”¾QW¹Kç!Z£ã° `9|N·Å~G[%h±Üàûv“Ì'œÐ€$TûÃÕ-õÛ“™êbYl©iÙN}ìH9‘Òl€Š]¶‚p1Œ0Îæÿ¦]´ ‹ˆ˜ŠÝF‡Mò±DËg1Ý}T`–xœ…CûCn ™7íÛï®îÆ !LGqØž@.ê„õ‡E"ŽCØ@P)ÙìÒv§&Htgcr58S=xK†°Þ‚&ãGHD³h^g*›cÀ_€÷³õ uà
+"`ñiæ Õû.nÃ@…q“X5aq•VË2Û»yLñph]L(ÅúZôXc¼ÀÙM™AÖ&aUUØQt"kkèϨ<—T^•C8ÀvP DŸ
+cÎؾ¡:'È`´Ñ´pTR’‹)°!ËÕÚ<ÕÑOÒrlŽÅ\M3o¨F¸wÁ¦!—‚õ¿Ãþï[£DkOÈ&ñÃLÖ3ò$Öý‡ã~>Ö"<RŽÂiÓ7TçŒ65ØH(¡ä¬µ¨&°æ©zn‚Ñ
+ËÁ´íªs‚ F›Fìï¢ȧÑÖ¢š@›§BŽä¡Å¾ØfË‘ì-`©WÓìªþ]¸I¼?Žº|jvsÝ=/^a~Âc|B𑿦°¿²‚#ývpÎçîøÜ÷!¬è\BÎ×–t
+VžþŒjÃqGa;Äá¢)ðôV·I7TgŽ6 +« ŽÄXµ©Nê¡êOÿlð_’r…×Öýƒuvƒíã´ Õˆ$måÓ
endobj
-1459 0 obj <<
+1867 0 obj <<
/Type /Page
-/Contents 1460 0 R
-/Resources 1458 0 R
+/Contents 1868 0 R
+/Resources 1866 0 R
/MediaBox [0 0 595.2756 841.8898]
-/Parent 1437 0 R
-/Annots [ 1462 0 R 1465 0 R 1466 0 R 1467 0 R 1468 0 R 1469 0 R 1470 0 R 1471 0 R ]
+/Parent 1853 0 R
+/Annots [ 1870 0 R 1873 0 R 1874 0 R 1875 0 R 1876 0 R 1877 0 R 1878 0 R 1879 0 R ]
>> endobj
-1462 0 obj <<
+1870 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [251.8681 599.6322 347.399 612.3694]
+/Rect [280.2146 599.6322 375.7455 612.3694]
/Subtype /Link
/A << /S /GoTo /D (root_delegation_only) >>
>> endobj
-1465 0 obj <<
+1873 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [284.2769 331.1334 352.9489 343.193]
+/Rect [312.6233 360.3945 381.2953 372.4541]
/Subtype /Link
/A << /S /GoTo /D (access_control) >>
>> endobj
-1466 0 obj <<
+1874 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [282.0654 299.4481 350.7374 311.5077]
+/Rect [310.4119 330.5066 379.0839 342.5662]
/Subtype /Link
/A << /S /GoTo /D (access_control) >>
>> endobj
-1467 0 obj <<
+1875 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [311.9531 267.7627 380.6251 279.8223]
+/Rect [340.2996 300.6187 408.9716 312.6783]
/Subtype /Link
/A << /S /GoTo /D (access_control) >>
>> endobj
-1468 0 obj <<
+1876 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [299.7586 236.0774 368.4306 248.137]
+/Rect [328.1051 270.7307 396.7771 282.7904]
/Subtype /Link
/A << /S /GoTo /D (access_control) >>
>> endobj
-1469 0 obj <<
+1877 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [292.0084 204.392 360.6804 216.4516]
+/Rect [320.3548 240.8428 389.0268 252.9024]
/Subtype /Link
/A << /S /GoTo /D (access_control) >>
>> endobj
-1470 0 obj <<
+1878 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [330.7921 172.7067 399.4641 184.7663]
+/Rect [359.1386 210.9549 427.8106 223.0145]
/Subtype /Link
/A << /S /GoTo /D (dynamic_update_policies) >>
>> endobj
-1471 0 obj <<
+1879 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [401.5962 141.0213 470.2682 153.0809]
+/Rect [429.9426 181.067 498.6146 193.1266]
/Subtype /Link
/A << /S /GoTo /D (access_control) >>
>> endobj
-1461 0 obj <<
-/D [1459 0 R /XYZ 56.6929 794.5015 null]
+1869 0 obj <<
+/D [1867 0 R /XYZ 85.0394 794.5015 null]
>> endobj
-470 0 obj <<
-/D [1459 0 R /XYZ 56.6929 548.1995 null]
+598 0 obj <<
+/D [1867 0 R /XYZ 85.0394 560.3013 null]
>> endobj
-1463 0 obj <<
-/D [1459 0 R /XYZ 56.6929 520.4385 null]
+1871 0 obj <<
+/D [1867 0 R /XYZ 85.0394 535.1807 null]
>> endobj
-474 0 obj <<
-/D [1459 0 R /XYZ 56.6929 391.3968 null]
+602 0 obj <<
+/D [1867 0 R /XYZ 85.0394 416.2201 null]
>> endobj
-1464 0 obj <<
-/D [1459 0 R /XYZ 56.6929 364.0541 null]
+1872 0 obj <<
+/D [1867 0 R /XYZ 85.0394 391.5178 null]
>> endobj
-1458 0 obj <<
-/Font << /F37 802 0 R /F41 939 0 R /F22 737 0 R /F21 714 0 R >>
+1866 0 obj <<
+/Font << /F37 1018 0 R /F41 1208 0 R /F22 953 0 R /F21 930 0 R >>
/ProcSet [ /PDF /Text ]
>> endobj
-1475 0 obj <<
-/Length 3204
+1883 0 obj <<
+/Length 3164
/Filter /FlateDecode
>>
stream
-xÚ­[msÛ6þî_¡é—Ê3J¼>¦­ÓKçšÜ9îÜÍ´ý@K”Íš"U’Šëûõ·ÀßD&SOÆ#xˆÝ, „®"øGW*&×b•hAâˆÆ«íá*Z=@ÛWÔa6´é¢¾»»úö-OVšhÉäênßéK‘H)ººÛýºþþoþuws{½aq´–äzËhýÝ»÷?`ÆŸï?¼ûîÇ_nß\'b}÷îÃ{¬¾½y{s{óþû›ë U1…÷™ëá oßýóK?Þ¾ùùç7·×¿ßýtusléÚK#n ùóê×ߣÕÌþé*"\«xõ ¡Z³ÕáJĜĂs_S\}¼úwè°Ój_?+3!W
-l·•íi——®¯ÊZyp®ý¯*3dûrÌ NaJÀ»€°HJQš@ÛÖýÜœÍ$s0Óã<:IAk†_|,J%DpJ]û4/&јô™UNŠKmŠôS6Ñ!‹IÂÍ´|5ÍŸÓºœÄ ì¬ùÐá¸Y-¡3šH:?õ»¨ËS? ÎSÿð×hÞ3þ*aó’jBtïûpð\‰’}Ù³l4¨Í¶Î`8?Ç«1¡Ü˜u-ˆ1‘¼*qþvd  ‰ê‰õÃ
- ·s~ÁÜq¿hîöl˜Y‹¨$t¨ŸPÍçÇ= ÷6ϲX„˜.j†euþFÏy±Û¦õnĵXD$ñ¼ü€šP ï 4øg¥ú¼&׺v „'ðUµRÇ„"b=Sgð FûýlƉH“x~ôjA‘qoóŒc‚xɯuP3Œó¨ó—ÊË6{¨óöeL9XbEg¨ ú”ƒ°†3ÕWá5)×3dÈ9
-±(›áOˆŠ÷lãœÇ/X=î÷ 8'ˆdI2?üµ È¸·YÎÅZÁ–Âè.ê2çêü©šü¾0‘Ö(¤€%pV|@MÈï3ŽB«Ö}þãtq3²%'Jk}™oÌìiXßÒ9¾yü‚Íã~?UÕaÐÙìØ{Ð’þæÉ¡2…ÝÎÙ:¨²y”I³ºÚ”Õ¦©ÒMÛcÁW¢j^€šÐ O·˜¨„Ó¾
-¯C· C†„S„ >ãß|¥{¦Îú7‡_0zÜïðMƒOVb~ôjI‘Qoó”ã1¬¼|É¿uP3”ó(#ñtÜ¥m¶AÿðÔ<8'%T.hP*ô8—D$ÑÉ@‡×YT§,ˆW°1“ ý"ë$#°æˆž±s¬óø³Çý~þª
-»1K=?þµ È¸·yÖE°ÙJøéΠÎ9×Ö/›v{ÜÔپΚÇ)/ÛôdVz
-Ó æ£C}cúãþØzÖ__Óuƒå2móON|^nÙ¡ª_ðGa·¹/RZ|ôš:ËL®9JÜëMR «2/§j‘FÚ¦ˆdØÛôÉ RïƒNŽÖ^;ÁÅúSZœ0ÏÏÏT1 Ǫ1¸ ›ò=Ö¦»]n¼{Z`}סˆõ®†¨]o&/n«ï³¬Ä:Ø>áá„0<©°Ö9,±n²Þ7'jöl‚®?V‡IŽ5éáXx†x¡gÛ3OºmqÚy
->çíã\¹ñU÷§óze,”á(£×¥7 Ëéû—^>ÿâÊÃ…"*ŠVž.êòÊPÖSæð£u‡
-𪠛—P‚{ëøheÎ{’_'º9ë?>ýár.û.#" Âï™8—}÷øcÇý~~`ÃBc½0굠ȸ·Ù؆Ã$ vÍðËìçÉŠì!5¦oª²˜H„J¢a;'ÜcÆÂ{“0ÅÍÙnW:zvmÏDyú`ÊñÚêakÓã±Èqù”na’ëÇÃØ/—‚’Ó=–ìQø!’õ»½kÍÏ5+ã°{ÔŸø½dÍÔ"¡<äP¿A§Ó¢tªy3Ü)Èz΋ÂQ4Ns·¤š¥žDæ ïãÑ¥aYMÛ3îÙþžO±;>/¼ÃoVU,å&WŒ0Ñ·àÕÓ¶ pH†B“ÑeJ‰¥ð›î c^Žû5ZÕUÕnèɤ$Rɤ§Ñˆ 5¡Gß3 {›,VPó²º<!=ÈaWõóÔ!£$N¨ž•@c±ým†„ÈyOîËÎãõ!KKê÷§Â­å{¬w+yv€«RüAåm„êBaƒp»â ;Ý'ŽÜažDÒmþ;OÂMüq¹lPæ6=¹[â¬bQUO°ê Þ6úË0:šjÎÞ{0ÝÛ+,‰Ì–ÜnkXBÝäN¢‘q¦]4>dm^)+¬LËæCc&Òl?Šé! À<哘~Ë11
-ö"P¸4P
-'?5[1§Ö”U}0‘œ©òÃam«°Î{#–0))ú4²ÝeêG&ÉÏÙ÷;¨ò{T‡ýf|‡€Ã¾Ô¬hšÝ¿o
+xÚ­[[oã6~ϯ0úR¨¸â|œv3ÝÛ™n&Å.ÐöA±åD,¹–Ü4ýõ{x“u35EƒA`‰<:òã¹¼Já^q„&z%5C<Å|µÙ_¥«Gèûö
+{š$%}ª¯ï¯þñžÊ•FZ±ºßõx)”*…W÷ÛŸÖt Òõ7?¼¿ýöÇ»w×’­ïo?~¸NO×ïoÿ}ãž¾½{÷ý÷ï8^ó¯w?Üßܹ.áy|}û៮E»Ÿ LïnÞßÜÝ|øææú—ûï®nî;[úöâ”C~»úé—tµ³¿»JÕŠ¯^à%EXk²Ú_1Ng”†–òêÓÕ:†½^ûéìøá*ÈÌ
+º $Ês7~v’ÍÃ6o6ÇâÐuåêÝÜDK”¦ü°õõ‰e ¦"Šjl"á
+„²®óø¸rw=k;ús§|¹›³aÆ{bðX%J8¢’, {Gµ È”›CýŒ %–Ç1Ö§ºŒ±Žê<G/E¹ÝdÇíX<†ÕÏRˆfÄFaA)ð°ùiz€´¾#áÒx %/â‚‘šª¥¼uô FOù~>Þ¤BLRüŽjI‘ ·8Þ¸uû >­OÁ[ :ÏxÜüñX´¯SÀÁ²Hy\~ š‘?¤
+I¦Ð tT3* @Çb<éð6uÎ’qÉ…¢ô2ê(”†lΓ/=áúÙciŠ†|%:øÕ‚SnqÈQÁ—.¹¹UrÊHÜVM“oøyÎ_ÍLÕU9Mç,TªÔè¨fôàNhdÊöoãë.Z3)—¡¬¦’]¤×) êÀâúý‚íS¾Ÿ?N‘ä1±I訙r‹ã/…J_Òø‰"èóDF\{|MÚÍ!9æ»cÞ<Mc,FP푨ôŽh*~a!{J ä¿ èf¬X‰¤â‘øJ€*œžÑðêÉãO¸þ…„jÆUtÜ;¢-Ƽ¢0c’Cü%<Ž³>Õe uTÖ1dmö5ùdN N)‹ D3‚‡N#Ž™JþtÈ7Åîõ:¡,l¶Rm7¤]
+µ$M[M Ñc ~Ïú C³÷¯Òõ}Û´çOvuYÖ/S¤'ž1'aOFsìW(”XiXà…_@_¬ÖF{"Ý°ù…’ûx°=¹Ýå¥D­3ß™¹Ÿ²hZ÷dÇ^žŠ6oÙ&O¶yYì ÿ©\)±˜o1tüœ¦äøŒtÙæU[$n#:è=؇6›}r¢¥wðpž(Û ùÕµ)ë×YµumYõêšÓC“ÿv1î½ÓÒÓ9ûÝË!kìÛŽÁãÉl…5ê¸:¾ûÁÎ ÌÂp_}<êÆ Þdîç%{u®÷‘õØWž%ópÄ„*¥[ìv*ÃçóÀ‹öü$A§a³å‹ãCûÅÜŽ>Än%C¦ù•áGÃñpÖ_^ãuãž«¬-~÷â‹*Ùçûúøê^Ý(l“‡2ƒµu¯ASo2+Á‚Âò˜lÈê<È çöˆ¢Ì`ØÛìÙÒ`BgGë# ¯]àlý{Vžì) ¥g¨˜ŽCݘ „Üu;ךm·…ñíYéÚû…­·Gˆ£çödΈlóCžW®­,ªg»š pR»Vï°ØºÉð½9*´ç‰xý©ÞÏb¬ÉÌáGHz¶= Û”§m€àKÑ>ÁU_õp:G+xv•uq–Á€>¦^CX·Ð»w(SH¥|!îô©.ÇŽÊzÊ&ñ0«  HÀyTl šÛ_ ‚Ž9þˆ}£lºS~rꨈ$40Àg``l“*Ð/Ø:åûÙ9 Ñð&*>æÕ’"nÑ´†Â
+ç‹è:EÀå‰ìôäeþ˜Ó“Ù¢(ȼH\zG4?܃§H:”ï»&LÒìÑ<óµÕĶf‡CY¸è)|\îÖúh) '9=¸'>›0&×·;ß›{zà0   ‡È×¼™+ö$TüDã…ñé°0*¯Z0Ã¥NFÖKQ–Þˆ²ñšûˆj7ðS­F™‚YU3ïõŒw¶¿ÞyÁ:Æç¸;žÍ.¨º'£ÜlÀè–úœzÖ6Ã1@*V+¢¢)[Z“}Òÿ`ŠÌ)_£Õ±®Ûd „š}Ç” 4š.É@5£ÇÐ7Œ¹E—¤9AN9‹/ÉÑå%ˆìmŽúø2sþª)"æòELh ™
+x{˜ùT¨Ð.”òõ>Ï*Hèw§ÒÇñk÷QœwÕƒ qM™ûqšÛìÔ§ Ì&à6Ú3»Ög®žðÉT„„íÂf ¡à+eØ^¶Y“¹É ¬ñ²:˺~† ãô®]g¸$c4†€ñpõe;s]'!æ:ËñÕ–4Db¿²e:1Ît:ÿyÛvŸTµk̪æÅ¥;&¿””åü`$Tw%(”3£`o9…Qx©O¥—Ÿ™2ÌëäZªú¸7Yœi
+Ãam«][pED”*Á†Å¤Mùö2îSsÀDÉð{TäªôÍøŽ=OjîéøÇdwT3ÂÞleÊ,¾ô]í„}3]Cæy„Ï·>ùWTš'STÂDz~°£ mC  ãùµ EÐYø­ “ôÛ†®R
+:Øô(2÷êK'ÓU3`¢\#I wÃÎÞd²«‚8%¢ i®„%÷°QíQÕÝ ª`™{/m»„Ún. òÆ?ÏÉvµõu#gÒI›ZÎ¥ún˜¸ÛøˆK,Ì:’ 9RŸê2.;*›þ±³Ú$¶(§:.=ÍHoÿ€Ó"Cñÿ½ÖÄ&ò
+·‹ƒ5³1-®l5OÊuøš×&l™;⦷Êö¹k2HêuÁÃ|Væ3aC[Ö®ç甧¿Ö§#T†ðˆCcJJÏÕκiܾ‚€b㕵G8ZpI¹y] (oÿ÷þ¹G_† wËŠÇÊmzØLP§,b\cÇj‚\J­O›vü3Þ4ÙetîÂkož£ ¦™[
+±KKÎYryͤöÔxáP¨OY3j°fÚý!ñÃ9¹q‘b|A‰ŽjF‹¡SH1R£[;Îýx/RmëÍ©9´îUµ¡ð?ßvVf§ëÛˆÛK¤úòÝP‰Èâµ½Qäf¨'²ò¨ïhˆk)Ä„š©ÐA¶©¹Ôl ôO7TX>ŠôvæT·–¾lÜ«›~W µHV6 ±¿>ÎnóÊTn)÷e¡ÂC®6Ö˜ÏC¯Aù%v?È9ÈŠ¥Öà çÒêE0"áHͯOÈEµ¹¼>^ŸÎ?˜ødÁâwüúõš©f7ÙCØÚ
+å訒H¶|œ }óÆùÍðÒuºãñ‹×º98fÊâœÃÞGæ¶ý œàÏ{¶¿}©ÿü?`,¨R²8bî1*³“ã”2Úk6]~þöÿTõÿaØ—Úendstream
endobj
-1474 0 obj <<
+1882 0 obj <<
/Type /Page
-/Contents 1475 0 R
-/Resources 1473 0 R
+/Contents 1883 0 R
+/Resources 1881 0 R
/MediaBox [0 0 595.2756 841.8898]
-/Parent 1486 0 R
-/Annots [ 1477 0 R 1478 0 R 1479 0 R 1480 0 R 1481 0 R 1482 0 R 1483 0 R 1484 0 R 1485 0 R ]
+/Parent 1853 0 R
+/Annots [ 1885 0 R 1886 0 R 1887 0 R 1888 0 R 1889 0 R 1890 0 R 1891 0 R 1892 0 R 1893 0 R 1894 0 R ]
>> endobj
-1477 0 obj <<
+1885 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [286.0435 683.3704 354.7155 695.4301]
+/Rect [257.6971 713.6209 326.3691 725.6806]
/Subtype /Link
/A << /S /GoTo /D (boolean_options) >>
>> endobj
-1478 0 obj <<
+1886 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [339.144 653.1199 407.816 665.1795]
+/Rect [310.7975 683.3704 379.4695 695.4301]
/Subtype /Link
/A << /S /GoTo /D (boolean_options) >>
>> endobj
-1479 0 obj <<
+1887 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [336.952 622.8694 405.624 634.929]
+/Rect [308.6055 653.1199 377.2775 665.1795]
/Subtype /Link
/A << /S /GoTo /D (boolean_options) >>
>> endobj
-1480 0 obj <<
+1888 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [322.5463 592.6189 391.2183 604.6785]
+/Rect [294.1999 622.8694 362.8719 634.929]
/Subtype /Link
/A << /S /GoTo /D (boolean_options) >>
>> endobj
-1481 0 obj <<
+1889 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [331.4327 562.3684 400.1047 574.428]
+/Rect [303.0862 592.6189 371.7582 604.6785]
/Subtype /Link
/A << /S /GoTo /D (boolean_options) >>
>> endobj
-1482 0 obj <<
+1890 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [361.2812 532.1179 429.9532 544.1775]
+/Rect [332.9347 562.3684 401.6067 574.428]
/Subtype /Link
/A << /S /GoTo /D (boolean_options) >>
>> endobj
-1483 0 obj <<
+1891 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [330.3165 501.8674 398.9885 513.927]
+/Rect [386.0748 532.1179 454.7468 544.1775]
/Subtype /Link
/A << /S /GoTo /D (boolean_options) >>
>> endobj
-1484 0 obj <<
+1892 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [259.4835 344.9998 328.1555 357.0595]
+/Rect [301.97 501.8674 370.642 513.927]
/Subtype /Link
/A << /S /GoTo /D (boolean_options) >>
>> endobj
-1485 0 obj <<
+1893 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [231.137 344.9998 299.809 357.0595]
+/Subtype /Link
+/A << /S /GoTo /D (boolean_options) >>
+>> endobj
+1894 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [172.152 284.6583 267.6829 296.4589]
+/Rect [143.8055 284.6583 239.3365 296.4589]
/Subtype /Link
/A << /S /GoTo /D (root_delegation_only) >>
>> endobj
-1476 0 obj <<
-/D [1474 0 R /XYZ 85.0394 794.5015 null]
+1884 0 obj <<
+/D [1882 0 R /XYZ 56.6929 794.5015 null]
>> endobj
-1473 0 obj <<
-/Font << /F37 802 0 R /F21 714 0 R /F22 737 0 R /F48 953 0 R /F41 939 0 R >>
+1881 0 obj <<
+/Font << /F37 1018 0 R /F22 953 0 R /F21 930 0 R /F48 1228 0 R /F41 1208 0 R >>
/ProcSet [ /PDF /Text ]
>> endobj
-1489 0 obj <<
-/Length 2563
+1897 0 obj <<
+/Length 2840
/Filter /FlateDecode
>>
stream
-xÚµ[]sÛ6}÷¯Ð£=añýñ˜¦NÖmºëxŸº}P-:áÆ–¼’œÔýõ{!@òTžLFuxqîá%
-/äg¿þFgKýÓ%ÂY5û_(aÎñÙÙT‚()D8söéì_1`òëþÒ±þ“ÊÅ¥†žDXíÆ{™Ã€Œd„1€‡^æl¬—Ê÷òÃâù×O›Õâ~¾mÿl†²™„*=KCh„
-ïÿˆª1)¢y&¤°zï'Ã(Ñ’ÕL— ÓTHÖn³XmïšÍ³çó]ûÐÌËŒ0E‰²83B#³žRDi&r§³Þ”š èa bA ¥B±\2fÁ€¯È/ãNYÐ )I®‰ŒãYˆ¨
-‘2ê@m·v w`Ššv`Dæ¬]Þ:PbU8“ˆ¡’»ã —Wra¢hèBA4µ|Ú…J͸ÉDc. øŠü2î \Èw ÍCDUˆ”ÑpJÒ²âÂ…¸0 ¦+ÇúiWBx80à‰R‰¨.™ 5TêM’yÍbØKò Œ8èþi#È“ ¹l̈_é€2îñF†8ê*¦ˆ¨
-‘2nDæçBWŒ˜ #Ôtñ5"ŒC¥«P‰¨.y=´D: ó׌èÐz8nDç”p<–ñU"Uƒ>•;xE}õ&ä0Žð70–…ˆªð(£¡&TÖ£¨ÅM˜¢¦MQ¾ÅÕz×Þ=›µ’m-Þl
-À0ëöÂi±p‹Á­a©%(Äd•¤h·žo׋ÒfRàÍGÔHû¹Ñ1V™œÀIv1h&“šr†XÍ
-"úІ¹0¡ÒÜ|)jÚ|Òåë8<ðæ«õ²)Ë^÷‚Œã"j„Cf<)eVå$N3D•2œmCò…DV÷„"Tk–©Å\ðÝeܸŽj˜5k‡g ¢*LÊh¸ñ„ƒÉ£ª¼oKQˆñj˜­0qŸ‚G›(ˆ!’/2ÃÃV39½ûr=Å
-³ F!ëË0ÙrZdŠÑõå_Ñ^Æ}% ½•ax"ªÂ¤Œ†;:ÿªºò¾-E! ¨aÆvÏ#Û `(ã3œADPÈ7À€+•s8½÷‚’áFݽڜÞh
-xeOAÂó˜=ÔVÔQ_º§@ 9ˆ œE w˜ÇWy—¢ÿ”oñiÛÌ­‚Þ5Ü÷F&¢FØäs_°*…SÓ<ˆ+¢Š °$ŒYLÁ0ðìÌ„£Sà_é‚2îñN”à&ðTP…F w"N~³îÄ…81 ’7ªÞƒMk­ÐHëùüƒçŒÈ›?å—i¯iN,Cö×s' œ°™PìµpÀW4—qŸz(G N ¼ï#ªB¤Œ†ºÍ)bœ¨,3' i¯P‘¥Ñ%&ˆXëS¶^¬²%²æ_ÁjãÏW¿È¢˜ÁYœ³©ÐÚ‹‡ãš‹¨Ç[ ….A;>‚*,†±ð]£0æµ-ôƒìí0ûÍ•íj¾iî6ÍöË~ƒï›N»ßs9vzÞmžKl8YŽŽÑTKŒ|Äìó‘&Ê“Òß›”¹Þ¤þ 3©?QJú]ÓÚoÞ­!~Šh”Ü0fæ&Ocr½NÁ‹ûQ–Ý€A9 #{),ê*âÿdm¤5øß¿jþËwø³A >·vb”éx¤… =)OÜÈò. „ ÍG¨ÿ(¾endstream
+xÚÅZKsã6¾ûWè(W
+œ–êŽÕ³$ ø3ö×ý $ä,éü>DÐ5kÍ’Pƒ wól¦)A(®¬ÅÃë€nB‚f:™Ú€†R;d)’ÒtÄ~®”ïo0\÷ ˆœ"„>㩶mûfxÕÀç-¬:yÕ]‚+õ7 y-kͳJ+f„<sÙh£fxQ§½Ymòm6¤\ƒ\â’yé jD|‡`JÃE„›®ü/É°“=ÑÚ²Äq=À D´„ wÛ‚¹ñgL®;I5=,1ƒrÅÌ;¿AÓd°Ú<Ý$ÀÂœ¹U´Q3t‹¨ÖFªU]eC¾%ànçÅ7¨ù]¾Y¸JHÑUàËÔp3z²áÄ0\ŠÂæ°¾l›0K¸€?cópÝÏÏmpÿ7ø`Öù êœ"ƒÕfù¦œ”;sh£¦ùÖ Pâóñþc>rnÂ4nõ¼Ü5"¸C4©˜µ0Ú‘|ƒþNUü -ûžV
+f9=ºW§ž2eÊšXLœvf…áµû¢®Sº™±ÉHÁ‚t+{,k\Ó0®ž¤ÞR#ÎÜxÛ¨iÒ5(o)Ãl³Ùçu©§Üä¼ jDî þºÓÑãÇr‹1mõr—g%$¿‡#ÂÆý‡¿k‘ã=øô™C ³¼#r
+ÿ:s<!`(²
+º~?B¾ ¹e…ŸlµÔ‘EôÃAýT·¸É*%êÁ³ÎK”ª m;ô¨õq_ŸòvW]míÐGÖªAŠ¬ôéÑ-¯h¨Œà|÷|x¥f0S™ö
+ÞÐjŽh‡ „ž?øûÐöu,q®«éûxl’x›»ÙsþµÞ?/†Ÿ%_ŠÃSÀÔuµ.²C €Çí1̾
+¤ä¿‚ÿâ"^Ǹ¤Ì;„
+§—ùÙîy‹ÁŒeñ€½jù œa„­«¾€Ïž1êÍÂhFä×¥X6Ã>:i±EvaKÀéϱ¸
+³Ë°œ„üòõæÞ~ýµ‰óiLÙH¶–íbÝ9–ýŸðR¦ ‡¶ùMo«ªí¶z¡r‚\7ÊZ÷yÌP !ü{ßk,mµWêLiUÜ/:KZ›Ô5œh‚ÏÎHÇEbbæ=N^qìÈ,Ï)l ·¥çÄ×îžò’¤IŒYª65u6U ¾´]†ïÇÉ…-L%§5 È?…)e¶ËÃRG(ÿöþä‡Õ€…I¨÷ЮÔQ$d@–k ņˆ_hU%š³ÛÁªòPM==0Õ½RÓ'l`,½¼¼\:¹dƒC
+vNØ´›9O™§›]fëØðüN—ÙñðTí TØG! Åõü‹Ï@Ï´gŒÄäI“ 7ê
+ÍHbë³iÒ>Ý?ù”€ËWôÄÄ«·Y1½[•HCw«á‰a“IóÛ%ê²ûôš0©Tü¦_æù&¬ê#Aš(Ò´¥5Œ>Áx`ï6_È妅€Ûeó8£kÔÇgÈ;¨…|u=½õ» e ² lÇ õq½
+ÊvÉ›²]Æ\ˆ£T¶Kúš²]6ÕšpÝ*Mò‘B@¤¯l
+uèò…º …:¼‡B]ÆX€®îöÊilŒ¡±­Š\ î+ò$MÇ+r„{ÂÃsX‘coF3Z¥ËøÔ†r[¡ìH#ïÅ~¡r3¦=Í‘#j]ÔG«t.™4Zÿ%F›D™ÿg‰Ç;sôñ£ÅÊé½çMöy÷i¶Ìû«ÑD3üSÏ‘Úþ’þö_”žþÜV¥,±“ŽÃ ä—F¥ÐB7ø¥F'–i+ÓÕÿ­™õendstream
endobj
-1488 0 obj <<
+1896 0 obj <<
/Type /Page
-/Contents 1489 0 R
-/Resources 1487 0 R
+/Contents 1897 0 R
+/Resources 1895 0 R
/MediaBox [0 0 595.2756 841.8898]
-/Parent 1486 0 R
-/Annots [ 1491 0 R 1492 0 R 1493 0 R 1494 0 R 1495 0 R 1496 0 R 1497 0 R 1498 0 R 1499 0 R 1500 0 R 1501 0 R 1502 0 R 1503 0 R 1504 0 R 1505 0 R 1506 0 R 1507 0 R 1508 0 R 1509 0 R 1510 0 R ]
+/Parent 1853 0 R
+/Annots [ 1899 0 R 1900 0 R 1901 0 R 1902 0 R 1903 0 R 1904 0 R 1905 0 R 1906 0 R ]
>> endobj
-1491 0 obj <<
+1899 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [324.1075 737.309 397.7608 749.3686]
+/Rect [352.4539 736.7854 426.1073 748.845]
/Subtype /Link
/A << /S /GoTo /D (server_resource_limits) >>
>> endobj
-1492 0 obj <<
+1900 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [359.1555 706.8362 427.8275 718.8959]
+/Rect [387.5019 705.7889 456.1739 717.8486]
/Subtype /Link
/A << /S /GoTo /D (zone_transfers) >>
>> endobj
-1493 0 obj <<
+1901 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [353.6164 676.3634 422.2884 688.4231]
+/Rect [381.9629 674.7925 450.6349 686.8522]
/Subtype /Link
/A << /S /GoTo /D (zone_transfers) >>
>> endobj
-1494 0 obj <<
+1902 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [370.2338 645.8907 438.9058 657.9503]
+/Rect [398.5803 643.7961 467.2523 655.8558]
/Subtype /Link
/A << /S /GoTo /D (zone_transfers) >>
>> endobj
-1495 0 obj <<
+1903 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [364.6948 615.4179 433.3668 627.4775]
+/Rect [393.0412 612.7997 461.7132 624.8594]
/Subtype /Link
/A << /S /GoTo /D (zone_transfers) >>
>> endobj
-1496 0 obj <<
+1904 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [226.7331 584.9451 295.4051 597.0048]
+/Rect [255.0796 581.8033 323.7516 593.8629]
/Subtype /Link
/A << /S /GoTo /D (boolean_options) >>
>> endobj
-1497 0 obj <<
+1905 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [283.1811 554.4724 356.8344 566.532]
+/Rect [311.5276 550.8069 385.1809 562.8665]
/Subtype /Link
/A << /S /GoTo /D (tuning) >>
>> endobj
-1498 0 obj <<
+1906 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [287.6042 523.9996 356.2762 536.0592]
+/Rect [315.9507 519.8105 384.6227 531.8701]
/Subtype /Link
/A << /S /GoTo /D (boolean_options) >>
>> endobj
-1499 0 obj <<
+1898 0 obj <<
+/D [1896 0 R /XYZ 85.0394 794.5015 null]
+>> endobj
+1895 0 obj <<
+/Font << /F37 1018 0 R /F21 930 0 R /F22 953 0 R /F48 1228 0 R /F41 1208 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+1909 0 obj <<
+/Length 3202
+/Filter /FlateDecode
+>>
+stream
+xÚµ[Ksã6¾ûWè¹j…àIÉi2ñd'•L²ïe“8msW"'"eóë·ñ4AP S™”Ë%üØèFhtSYaø#+Q BQµ*G±Ú.ðêî}wAfãA›1ê››‹/ß°r¥*h±º¹É’KIV7»_Ö¢è$àõëŸÞ½yûÝ¿¯_]–|}óö§w—*ðúÍÛ®lë»ëW?þøêúrC¤ ë×ÿ|õóÍÕµ½U8ß¼}÷­íQöãŒÐë«7W×Wï^_]þvóýÅÕM°el/ÁLòûÅ/¿áÕÌþþ#¦¤X=ÂFD)º:\pÁàŒùžýÅû‹£»æÑÙù#QVЙ ¤t4’ ¡”X•B¡‚Qf&ðæ¾îk°ª$ëã%‘ëzÛ™Ï]o;+Ûk/šv¨mµß?ÙëS_ïlkèÆ2únÿài«CíDÚ]}tð{w»ª¡ÙnúáôÁvüѵ5xƒ•lý¦;úaÖnëèËrÝÜ> ù‡IØ‚”ÔXÔ×Ç3Ž*½Iuó`”Pr]Ù¿Ÿêã“mÞvü+¥üñññRÑ5ª?U‡ûm»ƒî¶Ï>6ý…Zý¡qý­ýüÐ Óµ %Ãê2Ö§i›¡©†Úbv§cúÍ™fó44VpQÄSÌ83z·= :·õ`uÖ7«v÷¥6qê€t¨=¨?ßþìÜíÜH}Ý»¡A˜ß×­mõ5ôEªÛ…©'¸1“ëÅ°>Ń텙vø<tbº÷@Ä=æ¸ ÍH”,;‚JBŠ¬=$eyf•XÌf²k„Ì2„jî6Õ¾Ù5ÃÓÆ,¸šª@x‰8'eV‡
+‘Û!H*D¬Ãççž·d2| 3ÀI&ðQŒ
+‰IdlŽv¿`v*÷å´c°32ŽUÞµ¤I"-K;Q(Ä
+¨þ²´£ÎÓ. ôˆÃ±jûÛÚd™›¾;·)ó(”We¹ D@Íh1*Xo->ñÎØ2åÔ”¥È$yX"ÈXIdnŽ{¿`x*÷÷ÊÙ(L ‘÷@@-)’HËS’).%_ Þ•¡žGq×桘Ëø8 zÔŒ"ÓŒ©2VäocŸ3gšõqD ãÙ¬ORF"‹²>ƒ_°=•ûbrL‘ÀTäP Š¤ÒòÄ%*ðR};FeèQzÄj?l^ÿD,BD^‘€šÑ$f G\Q«òyêÜŒAS
+Ä°¢BE¸ŒlÎrÐá¬Oåþ rð!gy7Ô‚"©´,y©ë”…¬o:Ï@Êøk.
+
+ˆ[\‰¬"”j¿g‘ˆÁn©ò·p>*¥÷à  S6Òs‚ž·>‘úr2HÙJ̲> ¼‰¬<û8Dn ô¡2üó(=⩯7/‚š5TÏ[N™€šÑ&®}ªº"u>ÏF¼`TR
+‘xþ&vɬ´²€"“e* À*N"˳¥…Ã/ÌA*7"¤¶Ö2-.JÈ „Ì;# I¥Y>n
+ÁÍq„wÝS Ö3î`ÉÄÀ|Йè¯tÆg4^àXѾ%C­w¨úòòÔq ªQxXeÏXL$˜Ò;·ßWs©–©¯BV¿½ïš­?–Q^Àêzªf_}Øû“Ãd{þ#œàØ×õ™ógÖ7-‚:|á•éu~}”¶ãõÌõÕŸæ²dQòüè43zœ%S$$-ÑðŸ§>KŒ˜fÉP–Df²d¨Øìãc²Y²Ã/ØœÊ=“±Ì a¼dù™¨5RiÙ½æ|¸6Be¸æQfõ†n³kû¾Þ¦LÃò–< fF¸FL‹xøÿÀzƒË `m»öWŒéÝÉ.Üí5Øtc÷ÔV‡fk/¾}÷^7Ę'ÛSíûζNúX•n ÷ÝùH÷vþ}÷h›Õñ©iï¬Äý%Yë¥ßÛKËtýêÁöHâð¨'ï ÏøYÞ€Vï¯^Û6ÐßgsmuWêvÐ'ÿևǡ)ŠS·âÛÖǮúz@Ãþ«™e§Ï¦I¤(‰CAkf ýzîí0øAgv~¬‡fèí3 ½i¹é‚žµý<}ÜUƒqcîÈãn߇?uëödNRê»ÖBóm±òñ¾nksrP_…ÇÁwG;ß^¹x;êûS8vçƒÓ¶;Â$x´ ±Ý9?iE,\ˆè ’”øùЖèó3Ça—£Ø[hn;%P…@þ-¼oŠÔ7” GÓðÿõì++“çüf»?íŒõÔŸ1¥@Ÿ݃)h¹þpì]»LË3ÔkÕOìþ{ê‡XŽ=šú…ë <¦Ø2Áx$è…41“Òu¿½¯w§½W¥Úú£¶faiÄÐECR#ú ××îPp¬²W:éë´
+‚ªœêº“”)L¿¾õøÍø¹o.¦rµ‘ÖePø®nµFr./°§œ(t:sf
+P šp ÄaÀ²HGôøt DCJþ©ø%¹£©0éPŸ 9$?µ J*M«¢ÇE–›Iå$\Ü؃Ø4" üåD–qˆ€'Î…¨t9DŒU^ÀÖÏ Ïì‰Ä@ZÖn.Ë…½SŸåÚÓèt½ïªmÙh­[6[ïöjðöÛÍ(œ`‡½¥1Y™¹i‚øØæ•^Á`'p/šN'®ðI2´Ü¡qhA|±ؽ2…«9ÌÍçsöp™ÖC=5I!(Â'Þ(Œ©>M<TŒ/óH#e="™xGxx?g=R£I±Yh¡0ŸÄP™óå©Ÿ¨ÛlõMj'Ϙ½¬‡ÒÌÞýµµqž»àËÖÝvk2 èjZÛåF‡Të4¸ÜËqå÷¶6çÿ±ëìþÃ\A¥•ñ¤ÁsdÑ)ÍÉ0#ª­šL«þ©
+±*&kÔóEJ“bé–‚qê]½ƒô“Saß ütsõ•Eݘ$Y£|’¬{mŸtn†›OõàîèWèl¶Þ}­ "ªp«‚\æÓX
+endobj
+1908 0 obj <<
+/Type /Page
+/Contents 1909 0 R
+/Resources 1907 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 1927 0 R
+/Annots [ 1911 0 R 1912 0 R 1913 0 R 1914 0 R 1915 0 R 1916 0 R 1917 0 R 1918 0 R 1919 0 R 1920 0 R 1921 0 R 1922 0 R 1923 0 R 1924 0 R 1925 0 R 1926 0 R ]
+>> endobj
+1911 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [352.879 396.7158 426.5323 408.7754]
+/Rect [352.879 689.0814 426.5323 701.141]
/Subtype /Link
/A << /S /GoTo /D (tuning) >>
>> endobj
-1500 0 obj <<
+1912 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [334.0699 366.243 407.7232 378.3026]
+/Rect [334.0699 658.2017 407.7232 670.2613]
/Subtype /Link
/A << /S /GoTo /D (tuning) >>
>> endobj
-1501 0 obj <<
+1913 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [373.9 335.7702 447.5533 347.8299]
+/Rect [373.9 627.3219 447.5533 639.3816]
/Subtype /Link
/A << /S /GoTo /D (tuning) >>
>> endobj
-1502 0 obj <<
+1914 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [319.6839 305.2975 393.3372 317.3571]
+/Rect [319.6839 596.4422 393.3372 608.5018]
/Subtype /Link
/A << /S /GoTo /D (tuning) >>
>> endobj
-1503 0 obj <<
+1915 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [307.1508 274.8247 375.8228 286.8843]
+/Rect [307.1508 565.5625 375.8228 577.6221]
/Subtype /Link
/A << /S /GoTo /D (zone_transfers) >>
>> endobj
-1504 0 obj <<
+1916 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [334.8268 244.3519 403.4988 256.4115]
+/Rect [334.8268 534.6827 403.4988 546.7424]
/Subtype /Link
/A << /S /GoTo /D (zone_transfers) >>
>> endobj
-1505 0 obj <<
+1917 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [337.0185 213.8792 405.6905 225.9388]
+/Rect [337.0185 503.803 405.6905 515.8626]
/Subtype /Link
/A << /S /GoTo /D (zone_transfers) >>
>> endobj
-1506 0 obj <<
+1918 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [364.6945 183.4064 433.3665 195.466]
+/Rect [364.6945 472.9233 433.3665 484.9829]
/Subtype /Link
/A << /S /GoTo /D (zone_transfers) >>
>> endobj
-1507 0 obj <<
+1919 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [374.6372 152.9336 443.3092 164.9932]
+/Rect [374.6372 442.0436 443.3092 454.1032]
/Subtype /Link
/A << /S /GoTo /D (zone_transfers) >>
>> endobj
-1508 0 obj <<
+1920 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [292.0276 122.4608 360.6996 134.5205]
+/Rect [292.0276 411.1638 360.6996 423.2235]
/Subtype /Link
/A << /S /GoTo /D (zone_transfers) >>
>> endobj
-1509 0 obj <<
+1921 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [319.7036 91.9881 388.3756 104.0477]
+/Rect [319.7036 380.2841 388.3756 392.3437]
/Subtype /Link
/A << /S /GoTo /D (zone_transfers) >>
>> endobj
-1510 0 obj <<
+1922 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [460.1655 61.5153 533.2211 73.5749]
+/Rect [460.1655 349.4044 533.2211 361.464]
/Subtype /Link
/A << /S /GoTo /D (tuning) >>
>> endobj
-1490 0 obj <<
-/D [1488 0 R /XYZ 56.6929 794.5015 null]
->> endobj
-1487 0 obj <<
-/Font << /F37 802 0 R /F21 714 0 R /F22 737 0 R /F48 953 0 R >>
-/ProcSet [ /PDF /Text ]
->> endobj
-1513 0 obj <<
-/Length 3476
-/Filter /FlateDecode
->>
-stream
-xÚµZ_sã¶÷§ÐäIž±
-åÚSNpÁtªPˆW©µ'Kš2.Täg×ûšÃ±Hq=Òœ·3jÜö ПكC¾´ y¯."WÄL실bèŒetú0ÕA¹¡ `2±Vó_¸æ7MN&ëèhðŒbiYÄ°¦,ÕZ¾öH”IÂL"݉¬³¶+¶ÁþéØ“eõr‚“H&ñ‡ÛVÙS1ÅI²(1±£Ê›å²!³‚ôR7ë}ÊÊ*»¯\æº-p±ñï¦v­ªx**»xpˆÞtaǙѱ:mßCªãö¨PÅ ìõ
-p=´Ã@Å.õéTçä8àvj
-†Çg 6 :5OÕG„_8—U±X5Û5øß}ÄW€fN ¨&¤!.Äqf#1þ÷vD™= ÀÈy¢O
-JÎùü›—:[—9éðÓf™uîlª2/'óD>[HÅ Ï$ëªÛjín³i¶æ
-2¥ç†º³
-Ž·Îºò© ŽuÑ=6Ë–^
-Ú„Äçœy•íZLŸy2n¶[jR6[ûÑì…™£)± àñ|CZ<•ÍÎ<Û”to"|"$5ßwô´¸rd°55=ºì>°¾Ÿ²ŸøZ—m,Þ ž»ÕdõËp»óÆ>—ÁŽ‰j«1¶Êz"of¡çOÅ°4 …Â+`5gºw.2ŠæeKϺxv(X$½‘COJ„+5nÚº E¼¡ùÔÅv¾¬ G VÕYš¦"Æ œ =Û’
-[½½"Ç’NHä\ŒOÈJP,ñÀe4ƒ¨çmaKåv]Á‰˜ù®¢jF“¢Ð‹Q¢ ÅÒJ b€ó)úbGÏ‹,ñpÝ%œÖ–<ºì‚[_uY¸¾;®cå©\}ÔO {8áž0ÈÀhBŸQóû‚ÞiÏ–®ó…:‰96¶408 è-AÄ®ì@JØ;pçó÷+"#EïFÃDAl~ÛmGƒ X›=¸ÑÒ Ù–tòÐÆúÙVÍ#½((•­óReçí!¯vK_zö; ÆC»ïß9«rÐKp[aNØ ö_íY™Û€—±}†a+¾cŸgÎDïCŠÓá¡Ö¼‘«Ò­ÃZœ *gx
-(ÆØ\F‹¬ö†\Z9X”VN˜õÇÂÖªéj¨%µ0¢£XˆL×C5nRhlRht<à\leÇ2zÜ}wýOjŸòǬ~pS­Æ% i€b¥¦—= à™ÓaIǶ}ÌzÃ@A GYÓ1+Ôøf‹mÅûá[5d릷nÈæPÑ­¬Ýcwf5ÚxÔVT‘[V; ‚¹9)>œewtBG¿¿Q±Ûxé\ŠÔXæ¶ õ8“€,¥xhºÒ2´F{¡Em’
-[te$çï>|X ¾®èõù±$#“ÿtÙ}U¶ÎoBbä.¢}£_Ø¢ƒ )ú£÷~Wl煮mZêH_çå&«è÷ŸaÝ„ p܆÷GêΦ~–&aqî¹¾
-*ŒO›¬n]%–Â|7Å¥ÃÜÍ`Œ®*ê/OYPV±¿Ïl<é°’Ÿ@÷ÝäÞŠª’þŸØ\ÍY$BUÑ;òQÐÀ›ÌÇr—eÛôpñÛ.«FŸ@Òß¹kÈÎ:±¹þÔ}×XtÃtª¯¹LãB„Ñ.89QlIϧ¬g<•õŤ 9‚‡Ka©‚ßÄÑÕüú'òBvÜ>Llx…™y5+´å”þ 3øÊk…šÎVH5õ{¸€zSâfT {#Tîóû¸½×Gs±³»½P‰dJ&ñجÖí1–¯Ñ35Á¤Hº€0øƒpøÂã,?ì·D°äõÂJ‰­cPžˆ£žœÌ‰Gçpðkª€,Váo!Bkë×|{)Þì}{ö¿Íòb`Ýí,ý¨4/×ô3ƬA%hᙤIøÕo¼‡*‚
-Ý(qw9Øåß5÷…­GúF–ã‹
-39¦!ÃQBaÄýÞ·w%{$,,ûËÑc~9fý—
-ÃÂeô+-ÞºÅ`aÃø¼ÃEE¿âøà…£ÿKÕ9¼Hûœ8qÆ ñ÷gbxO&†µ½ð—¾`ņÿ=Kô(Cˆ¹g›ÑÃJ´˜‚QŸ 4««ñEÿ‚®>BÂÆ•T(„góGA(ÒÌÄZÿ–~ÆQAHã(=ƒ ’2üEûLž±ŸIsiU¸@9¶ÕP%$z?_‹bªãñ’î(¦¤;mÒqÒ=ä ;ÜeAP‡M“ýb—ÊT9p‡jè•ôîPI_WJ}¤tÐÇÎ
-endobj
-1512 0 obj <<
-/Type /Page
-/Contents 1513 0 R
-/Resources 1511 0 R
-/MediaBox [0 0 595.2756 841.8898]
-/Parent 1486 0 R
-/Annots [ 1515 0 R 1516 0 R 1517 0 R 1518 0 R ]
->> endobj
-1515 0 obj <<
+1923 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [397.3443 737.8938 467.1586 749.9535]
+/Rect [368.9978 318.5246 438.8121 330.5843]
/Subtype /Link
/A << /S /GoTo /D (boolean_options) >>
>> endobj
-1516 0 obj <<
+1924 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [321.49 696.0508 382.69 708.1104]
+/Rect [293.1435 275.6898 354.3435 287.7494]
/Subtype /Link
/A << /S /GoTo /D (options) >>
>> endobj
-1517 0 obj <<
+1925 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [329.3035 171.0954 407.7186 183.155]
+/Subtype /Link
+/A << /S /GoTo /D (man.dnssec-keygen) >>
+>> endobj
+1926 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [317.0267 666.1628 385.6987 678.2225]
+/Rect [427.0093 171.0954 505.4243 183.155]
+/Subtype /Link
+/A << /S /GoTo /D (man.dnssec-settime) >>
+>> endobj
+1910 0 obj <<
+/D [1908 0 R /XYZ 56.6929 794.5015 null]
+>> endobj
+1907 0 obj <<
+/Font << /F37 1018 0 R /F22 953 0 R /F21 930 0 R /F48 1228 0 R /F55 1311 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+1930 0 obj <<
+/Length 3378
+/Filter /FlateDecode
+>>
+stream
+xÚ­]sã¶ñÝ¿B“—Ê3 ì½Ô¹ø.N_j;Óé$y EZb"u"eÇiûß»‹]€¢ä뤓¹X,û]Èr&à?9ÓÊAÎâ$ô”j¶Üœ‰Ù
+Ö>œIÆYX¤Eëëû³7ïƒx–xIäG³ûÇ-í ­åì>ûyþîÛËï¯nϾóÈ;_¨HÌ¿¾¾ù† }Þ}¼yýá§ÛËó8œß_¼!ðíÕû«Û«›wWç ©•„ý>S8²áýõ_¯hôáöò‡.oϽÿîìêÞÉÒ—WŠ
+¤† 1Ï+ U¾
+>£ª[v)?ð|?d8ÚTæO)ªc®qÞ­Û_ý…Uæ"Ëé’šª£ lÖ¡«µ¾@‘:ö­7w…Æ‹­0ˆ¶YDsoó\´ËµÉ0«y€¼‡;ëÍfºÞó}(ÚÃ@c*P{‹`¨Â²^¦åÛ Q€žˆÅôÌ]›Ìï £…)±1HS™
+;«ÈC’¡—h9AÒèqâuMx
+¢æ zÁð&¨uŠÇÄëBj†æH3ˆå”í…£f‹óXq·Dc“"ªŠ’H¬(‰À—oE)‰†Í ÔS$ÚŠ l¥[ÊáõvWpU:(³ÍN¸†Ò{6òŸföÄ”yrу4í1¦¹±œMTŸÆ¡r xÒÈ4¾8Çɹ©“Mµ$smT ó?5ãm ¥n3~.Ê’FLÔt;ý³m¢ X0:àp¹N«@ݤcеœGÂàH§i¢ê²iö2hƒóÜ _mè{˜\UnQœzÛ ×( œÉ—L+ýç‰T7*‡wá"‚fñ_ô1  ;fhn*ÛýM@UoiôŸ·ÓïZðÈB®Óæ— c·5Ö±Ú¦Óªé¿,ʉT
+“<qõ }¸ËDÝýf{‡Ø  Õ(?J³åöMÛ³áÉG«S†¹Ÿòí¤ïšºçìË)!užl )M¡"É–N6(¸¸ÁŸ‚Kþ©à‚öñ½Žl ÃepÈãh‰»·Þùƒ¾cEXP½e4Â[Ù¢òÌ@觃Ä]Ÿ8î]Ÿ˜x ¹˜-³–rÑöýÕ?h”ÿfK)œ™4ŒG<`g6I1æ
+endobj
+1929 0 obj <<
+/Type /Page
+/Contents 1930 0 R
+/Resources 1928 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 1927 0 R
+/Annots [ 1932 0 R 1933 0 R 1934 0 R ]
+>> endobj
+1932 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [317.0267 736.8562 385.6987 748.9158]
/Subtype /Link
/A << /S /GoTo /D (boolean_options) >>
>> endobj
-1518 0 obj <<
+1933 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [356.8967 636.2749 430.5501 648.3346]
+/Rect [356.8967 705.9305 430.5501 717.9902]
/Subtype /Link
/A << /S /GoTo /D (tuning) >>
>> endobj
-1514 0 obj <<
-/D [1512 0 R /XYZ 85.0394 794.5015 null]
->> endobj
-478 0 obj <<
-/D [1512 0 R /XYZ 85.0394 622.0858 null]
+1934 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [432.0945 675.005 500.7665 687.0646]
+/Subtype /Link
+/A << /S /GoTo /D (boolean_options) >>
>> endobj
-1118 0 obj <<
-/D [1512 0 R /XYZ 85.0394 597.3039 null]
+1931 0 obj <<
+/D [1929 0 R /XYZ 85.0394 794.5015 null]
>> endobj
-1519 0 obj <<
-/D [1512 0 R /XYZ 85.0394 168.0037 null]
+606 0 obj <<
+/D [1929 0 R /XYZ 85.0394 658.3825 null]
>> endobj
-1520 0 obj <<
-/D [1512 0 R /XYZ 85.0394 156.0485 null]
+1318 0 obj <<
+/D [1929 0 R /XYZ 85.0394 632.0762 null]
>> endobj
-1511 0 obj <<
-/Font << /F37 802 0 R /F21 714 0 R /F22 737 0 R /F48 953 0 R /F41 939 0 R /F53 1029 0 R >>
+1928 0 obj <<
+/Font << /F37 1018 0 R /F21 930 0 R /F22 953 0 R /F41 1208 0 R /F53 1303 0 R /F48 1228 0 R >>
/ProcSet [ /PDF /Text ]
>> endobj
-1523 0 obj <<
-/Length 2578
+1937 0 obj <<
+/Length 2611
/Filter /FlateDecode
>>
stream
-xÚÍZKsÛ8¾ûWèHmYž$pôø‘õÔ®œ•5µµó8P±"‰ŠHÅñ¿Ÿn4HQ6í8R®ÀÆ»ñáCwÃbÀáO LÊR'Ý sš.Ì`¾>áƒPöþDÄ:£¦Ò¨[ë—éÉ»+• s©LÓ»N_–qkÅ`ºø#I™bCè'¿ßŒ/‡#ixruý/È ¥LÎÿyöaz9¡‚4Výåz|AGÉùÍøêúýo“³a¦“éõ͘ē˫ËÉåøürø×ôדËi;åî²W8ßÏ'üÅ Xݯ'œ)gÍà>8ÎÉÁúDÅŒVª‘¬NnOþÓvØ) MûÔ¤¹`B5 ØÔ>?.ÁaܘµŠ¥6}<ìHpÇ 7Ð}j5SBg­îµèè^ôÍ™q,URÝW~u‡šyw%e§nÆ™“
-GÇJÓeQÁf¸,Ù m²_yüH“u^Ï—>–Ü/ý†rõ2–oòµ'ÑÌ›$Üoyí$?êÛÁL`LPsÆÈ0ø¼ÜÔ~SC%%uRÞQ+¿»]¦:&…Èâ´‹´+ꇞõÁ¸v*Vü“séW D–’°Ú¾®uÊÓM‹°´§ÝÊŒ åŽ{¥ùqþÅÇM¹
-›øÅiX-,]3‹=­z¶¯¡Aj’jYîC'ŸyLiñT4Œ¹¼¢´_/Bsf Àê5ŠÑ8‡ÇŠI>(æVÐdzfÑÏài$5_¤Í*E«Æúa‹kЂt¤e².«š$ûÊßíW$%€¡4_­Êû
-®$˜·bNpý]R õ1§œi®ÕËÄœf†9Šö UûÙ+¹YÂØr3(>i„U±.VùŽ„
-~ô#l6cô7‘â`©ú HÁ\¹Y=ÄA;˜ %}˜ ©™ËÌ£+ò¨rÇoózœ6à­`&“ ¹ïè³mò,P´Ë˜´Ö|)Ò¢½I,]Ï·£WÙ{gxÁ¢Q梾‚…fã¢x™ñ”›y²û,ìÇ&–~)rÊLÏ?P&ß,¨ÒX?Ar¿,æKÊ>s?V5´ÊÃEî#æâv.{ü¸ %åš¾ÂE +€¤¨‹¼n«] 4_,èN¯*›º<j uǣ㉟]\LØÙäÃÐÉä,®3×Òn‘váZ¯¶ùÜÇ ,ظͭQ¯~•}KÿZÁq
-í¸·æïnÇÏó·ràW‚7ÿSòww[~rþvoÊ߯Ÿ$¶Éxö(Rûÿµj‘™:¦2 ^€$sÜu#¼O"½° &µT·N™î)zW°»–\ëæ®Aêô@8=‘OC ùðd×5jÓÁHÝW5åBèî!N€’»=
-¸á  ö‡•B ­¤õa
-íJA—b£ ÖˆÔi%EŸL*g³Ä+d›l¬ŠFíbpr\Ö±,†ƒ 6ÅkQF]Ù$¯k¿S1@Âu¾hš–$Yø•oº£å02§Øù¢Š¥UUÎ zNCõ2–<p=}rk E_í
-¤Å˜a7p—²!Q, wŠþ¦HCðÖ·=Óe|¿¢Á!×¢opÍ»ƒÇ—±!â7b(¡d›ïÀnÝSœ¾£ÞÚÇ7`½r ÆlÓA3~å¡ep%ñ 0ˆo¥ Éø*Õ÷®®ÀóUJô=ƒóAsº~øÑýð:cÊZÙoeµÖX3+Tw–>™;¾TyÝ7ù¿ùë`endstream
+xÚÍZKsÛ8¾ûWè(m¼ ìÍ;YOmœ¬Ç[{˜%Ñ17’¨i;ž_¿Ýh"%ê‘Ø©šr•`èþúC7(1àð'Æ2ë¥$^3Ã…Lg|ðúÞŸ‰8f\·Gý|{öæJžy+íàö®%Ë1îœÜÎ~Z&Ù$ðáÛ×ï®Þÿûæ|”èáíÕÇëÑX>|wõÏKª½¿9ÿðáüf4ΈáÛœº½¼¡.eü|u}A-žŠ=Bo.ß]Þ\^¿½ý~ûËÙåm³—ö~W¸‘?Î~ûf°í_Î8SÞ™Á<p&¼—ƒÅ™6Š­TÝ2?ûõì_ÀVoxµW‚3©¬ìQ ”}
+4žY%UPàí}†›xóΨÖPá˜I8΀c–é"«žWq`G¦ö,ÊÆÿå\fó¨Øóá}ZRE(*ÓùCVþ¤hÑ’â4“R™Öt=SIÅ<ê”ýÔ#7¯êE—“Y±Hóe(P* èdQOù|6M׳¾ý'ÌIžœ¼¨l~·wkú[¤Àöú–#˜Ó͸“áæ^¾±/ë‰ïÙÝqmu"™–‰Œ…`Þ†.Ê}"OÙ§wBuVw
+¼}‘.«|ZÂigêÏKêYÜðažÑCx#‹=O÷ÙkzXÝÇþzrÔFÛ['Y¾üLpxXÍÒ*›ÑNÊY†³
+S…ÀP?ÓSƒMHÊ”Š·„G„¾ÒÈD]t§'…2f×É ôd[ÃV0ádM]´”ñª˜çÓç[Ëœ·õ±\V0x §¹ÒÕ*K×Èç w5ŸC{1yÌɽÆBÐ/ºº)8TF'Vt•…H²L(1äï
+›MQµØù”O30žR>Ä¡1[¦“9ÍÑèaÛ`%:®6äªP¦TÀ&—3€‰pÃYþ
+ت>V6¢/¯¶#«±QrãÎ5äGO¨]¿ƒõæqýùçeÀ†DKï5°Hî xò|#`zr^jIJN…°“ÜjiIåÚÖœÙÍIŠÑ¨ùmÅX£7Šé¦í€>8à_0Á¹Q‡[,ÍÅø…Öœ±(ÊŠZà<º{˜wù‚øù¼xŠü€cª à
+ɸãîÉØÚ3žSaB˜'ÎY®²i%BÖ¤¨víí! ä É­L÷·^“ϸÑ»prK‚”ái$ã´¬²u^~6ãƒ8eš–Ù~^n3Þk… ? iÖ@¹‰çGRà}•”GîX{SfÛ‰èü°nlRl°÷Ø3$òÈ1DtÞšæ&R$Ù¤H(½I\âÔÅ]ÏlB8Tÿ·ÒyÌ´μŒ·7“¬sãs
+ÖŠåü9NÚMèé $‘šùĨ.‹Àj“}49(- ¼P (`’û 2ã+r žkm@ÔaxÒ‘«þ.TÎñˆÅ°ÌG……ÍEbó}ú˜Qm’QäIEHl±í1O©rûöUBfŽƒîð> [âEV÷„~D¼ 3ˆÕŠnøàá.ô z¢ˆâ·|™W9$Ãõ°«OT¦³êeI ù2ÜoÞ…±×½·‚ç7ìüæÓÈËáùæ‹C¨\}²í.íÃÁ^®Òi°xÞI;ê+K=m;88Wá
endobj
-1522 0 obj <<
+1936 0 obj <<
/Type /Page
-/Contents 1523 0 R
-/Resources 1521 0 R
+/Contents 1937 0 R
+/Resources 1935 0 R
/MediaBox [0 0 595.2756 841.8898]
-/Parent 1486 0 R
->> endobj
-1524 0 obj <<
-/D [1522 0 R /XYZ 56.6929 794.5015 null]
->> endobj
-482 0 obj <<
-/D [1522 0 R /XYZ 56.6929 237.323 null]
->> endobj
-1525 0 obj <<
-/D [1522 0 R /XYZ 56.6929 204.9886 null]
+/Parent 1927 0 R
>> endobj
-486 0 obj <<
-/D [1522 0 R /XYZ 56.6929 204.9886 null]
->> endobj
-966 0 obj <<
-/D [1522 0 R /XYZ 56.6929 174.9041 null]
+1938 0 obj <<
+/D [1936 0 R /XYZ 56.6929 794.5015 null]
>> endobj
-490 0 obj <<
-/D [1522 0 R /XYZ 56.6929 117.7253 null]
+1939 0 obj <<
+/D [1936 0 R /XYZ 56.6929 746.113 null]
>> endobj
-1526 0 obj <<
-/D [1522 0 R /XYZ 56.6929 95.1854 null]
+1940 0 obj <<
+/D [1936 0 R /XYZ 56.6929 734.1579 null]
>> endobj
-1521 0 obj <<
-/Font << /F37 802 0 R /F41 939 0 R /F22 737 0 R /F53 1029 0 R /F62 1062 0 R /F21 714 0 R >>
-/XObject << /Im2 1051 0 R >>
+1935 0 obj <<
+/Font << /F37 1018 0 R /F22 953 0 R /F53 1303 0 R /F41 1208 0 R /F21 930 0 R /F62 1352 0 R >>
+/XObject << /Im2 1341 0 R >>
/ProcSet [ /PDF /Text ]
>> endobj
-1529 0 obj <<
-/Length 3258
+1943 0 obj <<
+/Length 2894
/Filter /FlateDecode
>>
stream
-xÚÍ]sÛ6òÝ¿BôLÄâ“ îž\$nSÇg»3w×ö–h›SŠÔ‰Tœô×w R¤,ŠéÙž:ž ÁÅö{Ÿ0øã“X‡LZ51V…šq=™-ØäúÞp3m¦]¬ïo¾;“fbC‰hrs×™+YóÉÍü—àøÃÑåÍéÕáThDááTG,øþüâ„ –ÇŸ.ÎÎßÿ|uthTpsþé‚ÀW§g§W§ǧ‡S.•0ôSü÷ÓÅ)!<=üí懃ӛvÉÝmq&q½ÿ;øå76™Ãî~8`¡´±ž< ¹µb²8PZ†ZIÙ@òƒëƒµvzÝÐ]dÒ2u,Ì: ±‹NÚ†‘ÒÑ©\ò8˜§«Ã©d6(ïèyuUQ#+è™Àƒ³ Jk÷ýEéUv_d¿2&fIáAI1÷Hi:ßB¿Mé¹tßO«tõÙáÀ7n¿zÜdá‘\ïªzoB~D™w`e³þú¶\ÒL9­ÖÂís™¬jX²`±Û£
-³¢4ÀÄ‚› *WuVÜ÷G.Öy-s?ÜÑJxš `™®Y]ã~ðõ‡ýå²ÎÙI•…Ç\¯–e•Vþc-fú%YÀüïví¤.Iþªe:Ëî¾ÒKýÔÔJèûÍfë<YÑ{‘&«[Lä¤6òÁM°ÊÜz¡‰L\UuHܸNÓm)—J„<âfb¤àå:W÷j\u´ÅŸv<Чóâ~¯Ó™'˜ÓdD ¹Ü^“â2Œ…P½5=Q•kd%
-¾!¹äý• <oú#Ãô·’¢Å[À“yI¡¶×¤™ ¥äb?)Z¬‘•< W:Éœ*!Bay jB+Áaç̓ªY¹X–EZ8̓w§?½%^;mž¥ dæ ’G$]ÿÇö¹4¡Ò¸ÍD åßbi¥ŠCÃÌ–¥ýÿF5 éèæà
-hƒ¹|³ÑŸjÚnjY†ÜàW ÄRêIæ^h£É?N“á±5VÌËE’½~h=¢µD
-7V¤áƒwœ™gÜ]¹.æááb¢HLºë} Úœød*dh÷ºÐ'S6#†ÉE°^‘5°0ÎÚ~]M"éàÉg£ -fåÜK«Mo³š:>'ù:¥¦·Ç€àÌ4šÔ´jº75â8½èvS¦NÉb‰”â}'°­84 Qž=œêàydÝpJ°©Ìü…)›Ãœâ1˜;ª
-Pz*WJ×&p/w|5ب|âÝó¼1ÇžÁgÇÔ
->DhIîA]áT '<I8¡!b Ç°pv¸þ<IzÕ¸Jqà)hL8% •Šbγë“ïA»Ê嬩¢jéB `|t›T)}õé+ø’hCòA“ûÔFp®†ÙÐÙß[¶±àø¬M³Ä;ZFÞÆ^B’¨µäÁQ_³YO’gmy›î; ùù )FÓ´‡Ìõ¿”)~2KËBk•!³ÄÓ›Ø'~ǧW‡Ò߸ ‚Ê|^õò¬yvŸÕ‘¥«Ú¾Ô鈗r7Ôxt4HÝî²ßpUOF²ÇjÌÑAn„•bRçã‹£ŸNL‘‚(®Ÿ CÚÖ–†Àv—E6sT¸¯›_°ˆ³íXʳĘXõè(™GA‘4/û#¶îßp²,Ôܨ1£.5$\“Q?ùp|~2ÎlœùáK¾Ö)‡ñ¶ˆq÷ÕeKx|ÈfÔ„).©5˳ÏÝ?âå,KjšfõÃ0ê6¶A^c¸¨ ã{˜×¡Ê®¸
-«C©å¨IÆL“+8ñZ¤Aê¯ÒežÌ¨Äd‚Œ Õ²ÍæäÚ^ƒ µ)‹Ï àãZ tîwkwƒ|s§ÉVyYþ­ ÖËw.ZRdÞa ø9Å‚*b:uâäÞ
-ƒRÖ†‰
-¿M =×ñvÊ!5ÆIJ+1,Þ]¹yõWa8D’rÌ6 Hül¬¼mº¸þñô?Àop„Áuí«ÖÈåîCàc¹¾Í³µOýùz×æ`‡íÍ(¼+ÑоBÀ?Êbcq¦Ã²>bŒ˜Ü“tÉð²žD½(·@D4ž&p+’!3Ê£kÌ]…îqŠ[¯%Üêà!©¨…zÏ„0&"È1Ñõõ‡òLlGé–‰ØF&2¬ÇØgq¯C–7œUˆe´1zŒ{Ò†<Rd©Þ_~þ©ÜëÞi×zÝçåmñ.Ë*à °¹¥²^b±‚С=hòÚøñÓñ’ÒZ£—q_V!à£Øá1’
-
-FuÌçgŸ€¤<Û!.7ž¦Ð8¾ü™Tu½AF À9räÈéà^±$Ò‰QWž¡ÇÉ3 >#Öíîô Ǻ<6¡ÑÑXæ Î96ŽÜÆÏ/¯OGFªà’Ê>Cl[õÌÑ"­JoX| Ö¬š~5ÌT¥{Õ‚`­V®ð†oÈ o›Âá:Ú¸E{¸Õ%Ãö'˜–1‹Ä eS~~}rq8ÕLŒm›[ŠEíëNZPµPcõžPE¯\˜b>È9ÄŸ[•{†‡ß_yênõ¥8ò
-Õi–ÊÆcá×:TÍÁŒÓ Q?4w ÆcÛ¹q××qãøNn¼3ÊÅ_ØðŸŽtðsÕ g{JР÷YáÍêýOz¡å¹ŒhNº¶¡Û RÐä¡·™» "ãàv]ïJ.ª:˽÷ó¶opQl ­ëó÷XœfXz 7ª¶
-º·ŽDJ
+xÚÅZKsÜ6¾ëWÌ‘ªò xñ•=9Š”(IÉÞѤvó:P$¤a… É‘¬üúíFR¢,;>lé@ Ñ
+ýCKæÖt´ü°3ž–—}Ù6Ôkoiøag€£#"L‡@!<-j -ÁÒ–ÇÅ­ ä}îÊ{ÓPó°/²ÁP¥°\nlÔ황ۆÙø|‡-ʪÃ4¨A¨¶€6x!JŠ´¼­ëCSæÙP6wDz(‡1 ~&­NmT7ö{“¯çûQà”¿s.A­ëXª lè‹KY=ƒ—õ ®“rí­Q¦ÊáqÁ !„…”Â1Ú ªâÍé:Ñ‚¤Ä=nÛ®Îjãùðû°+ó6%
+Nv 8P<WÒïRjÚwæœè¸B¹m«6Ϫ¯Ž¡B–DaèØöèïù$œ#šûüa*ÐYºS‘K
+Ò!KãqÒK+§Lˆ(òZû„NãÐVìÁºhèƒÔŒº?_]þwíô¢R–@èÏôR´u†6Ô: ú6ÿÓ ÆR®À!?;t$y3T§Bˆ
+-Í;Ö·-&
+kÛt–XRTeš;<û²8$ñG¶~n{RÀuy×LOÙªj ö®Ë&C‡²ýÐ~b^AÖ_’ñ“Øž½wí¡Ë×ÊŠ¢3}ÿ™’mÐ_–Î9<îÍg®õ£yü²Cþxþ µ†öOã¼Ê™ñ…uÿ‰Q÷ZÐ
+¿*0x~µ>bß×À4ΉyüLÿ³Y^ð0‚ðšÀM¦ üW<b‰LŸè8ª“7ÏÛW
+:„E•$ \º»P%5ò¬·±èïœ –
+$ÖY᧶D)Leürt<•¸äž»tÛ»ÑÐZI—ŸÝ’€Ž,YÊ)|Üœ¹$wtE º©+ز|çK·²FÈ7Ðí6acõ*4Sr#"Çj²‚¢àˆ˜:…Âá׶q»_”•9Nõ§°SgQ,Æ©L¸ÉSO ébµ¯Æ× ÞÆIúŸ/V}úsï&À][/äCBŽ\=-ࡲ„y"ȱTAçN¢ "­ÞŒiä¸i©àhP»*L‚[ê×4¾¹8#2ZÚ-R˜>ïÊÓÓUî¶òmÈÙ‘j ÷­o»tp\9wÜ›‰ãj³!c'>½¥{ÆØWépo!c+¡œ/ ­tc‡ÞŒª§kjCT’&ì7Uéë8±׎ d FV<HoÌ-±Ù¸­vÙ½[þÆx¨övÉf Ïz{—õ¾250{ÿöy| Œo¯®Ùè
+³? êYA#Àx©g2=y÷\¯H¢aHÓb.‰»tfÛª®x~ª*Fþ×x¶î‹ªÐOe
+y 
+”UÅÈõŠ$ÏWCI\¡¥d2„3+!¶þj²ª,ÿèdS¼ãÓäx±Lp™»Æ¾~zÄñÇ¡¡Ž¹þÕš“ØüôÚç¥Áp'"|Á"ã/8v)%ò‡ÆÇ4%N(%â£)ž–€ît| ŸcŠÍÆ¿xP}hŠ—¦ò~™Žoô~ÿY¿Œ¹ÿ—ÕÊSúýãµÊiÅÓ—@…Á[T_¦É‹Ø- D´¾±ï,0࣠éò10«ÊÞy»4òظ˜‘Qè <Qä_³ëìiàÌ‹šXj¢‚/SëÑR:†œÊ£ÏX’f|ä'ÌH2žèWýŸ ªÈÕ5ÛŸð 1åÎçcPgY›5\—"XWå½#Z]Ç^×q¾ÎˆB•’Ž/.@öÄŒºJ:ƒ©X~g£ùš—ÍuhJ›Tüö`­¦°7¿öõKǶïÊ:ëJûºÝCoãÌP‘l½³€}à¨8)‚jà´¡&!C¸r¾€dUˆI ‡ÝýÅ4âAÕZ$YJ‹øujܘ%Èb·-<à¸m§9Ç?Rö»öPsPR”}ž9€ú§žxË—9 æœÅ2Âì±(„Koáæä«W3þ§þ³Àñ&@ •$ò\äŸ(àZ¨Ò4}ví«„…‰¹&¢ÿikwendstream
endobj
-1528 0 obj <<
+1942 0 obj <<
/Type /Page
-/Contents 1529 0 R
-/Resources 1527 0 R
+/Contents 1943 0 R
+/Resources 1941 0 R
/MediaBox [0 0 595.2756 841.8898]
-/Parent 1486 0 R
-/Annots [ 1531 0 R 1532 0 R ]
+/Parent 1927 0 R
+/Annots [ 1947 0 R 1948 0 R ]
>> endobj
-1531 0 obj <<
+1947 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [341.1654 731.9163 414.8187 743.9759]
+/Rect [341.1654 175.0606 414.8187 187.1202]
/Subtype /Link
/A << /S /GoTo /D (the_sortlist_statement) >>
>> endobj
-1532 0 obj <<
+1948 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [434.6742 731.9163 508.3275 743.9759]
+/Rect [434.6742 175.0606 508.3275 187.1202]
/Subtype /Link
/A << /S /GoTo /D (rrset_ordering) >>
>> endobj
-1530 0 obj <<
-/D [1528 0 R /XYZ 85.0394 794.5015 null]
+1944 0 obj <<
+/D [1942 0 R /XYZ 85.0394 794.5015 null]
>> endobj
-1533 0 obj <<
-/D [1528 0 R /XYZ 85.0394 714.9798 null]
+610 0 obj <<
+/D [1942 0 R /XYZ 85.0394 385.3709 null]
>> endobj
-1534 0 obj <<
-/D [1528 0 R /XYZ 85.0394 703.0246 null]
+1945 0 obj <<
+/D [1942 0 R /XYZ 85.0394 353.2653 null]
>> endobj
-1535 0 obj <<
-/D [1528 0 R /XYZ 85.0394 522.9001 null]
+614 0 obj <<
+/D [1942 0 R /XYZ 85.0394 353.2653 null]
>> endobj
-1536 0 obj <<
-/D [1528 0 R /XYZ 85.0394 510.9449 null]
+1240 0 obj <<
+/D [1942 0 R /XYZ 85.0394 323.4096 null]
>> endobj
-1527 0 obj <<
-/Font << /F37 802 0 R /F22 737 0 R /F39 899 0 R >>
+618 0 obj <<
+/D [1942 0 R /XYZ 85.0394 266.7517 null]
+>> endobj
+1946 0 obj <<
+/D [1942 0 R /XYZ 85.0394 244.4404 null]
+>> endobj
+1949 0 obj <<
+/D [1942 0 R /XYZ 85.0394 158.1241 null]
+>> endobj
+1950 0 obj <<
+/D [1942 0 R /XYZ 85.0394 146.1689 null]
+>> endobj
+1941 0 obj <<
+/Font << /F37 1018 0 R /F41 1208 0 R /F22 953 0 R /F21 930 0 R /F53 1303 0 R >>
/ProcSet [ /PDF /Text ]
>> endobj
-1539 0 obj <<
-/Length 2765
+1953 0 obj <<
+/Length 2922
/Filter /FlateDecode
>>
stream
-xÚíZMsã6½ûWèªjÄà‹
-F—Ÿ®¨yx~q><¿:;ïÿ>úñä|TO¹¹,Î$Î÷“_g½ ¬îÇÊØF½G¸a!cÑ›Ÿ¨H†‘’²j™Üœü³~a㩺&ÅxÈE${iCEöðÏÒO0øY/rÆQ´û«ÎâÃ?€–ÄTdjè…h@Ïy*kz&ŠC-…tÐ_²
-qð%gÁû´¯²ÛtB²…Ǻσ‹3’EÌ#P ŒØÁ&*ãD6Ó}RÙP‚9¾Ã1QU*d1‹:PU&ÔÆA_Ýœ^¨Æêà”ÐX¤åc¾úB7EºzÈÆÖãqZ  w HwQ® æ†éxó>¼B†q«¯|õÊjÄaxô´LtÀ+£Ð{xû͵ FSQšÚ`“2{ðM ²fn°^'ßåN°AY äó$[ è,Ú²k舺€$Áâ­‹t¼Ñƒ¹ÖBcy/ƒl£05+Ø·øM5â ´¡Œâ.#
-þ) ƳŒ
-Äõ(ýÅõÏWbUq½RÂëÝÆ2
-‹¨6¯ªq™¬J’ò;ßÍ‘#”n‘LFR±ýaa”ý>vœvµ§b͵‹×^aÃùr­;R1Q¹a–P¹þ »ØgpM¡ÐC6AOÖód¹'ów·iù˜¦ º!Ø@°Bà¨
-­5ÄuÃáÍåØ…€î‚³|QRüÄÑ ÿ”A‘Ý/’r]mƒØ4IÊàål»Ž„(Æ߃jÏ›‹9æ@–VGßâsÕˆƒ˜C®¨²ŽðÈ%ŒñéG_š`„NbÁóu™Ê)ñØú~Š…¸(¸ÅØÄ…
-RW5<Ló¢,H¤H %Œˆðê""×+¡’ vJ3?°ÃT6ÉH¯c ¤$Æt“”$÷`„¦E]÷h›'¶rÌçYcëÝ}Ó¾ÖêŽMÌ_¦Ç×5 i ¨Pî(uý¹q¨8gŒl7œÑ`Zëcu”w<›*OD™‚IãËÂá:˜<è‰u€)y´`JN&>ñdM.¢¦š%ÞÁ½ä¾T
-n®/ÐeÓ³AÙç*å›t1q)1È×ù,?‘|±‚$Á³,ÃjL#ˆÂç5($‡q¿ÏRï1)„M37!ÔsJäð‡U×Ää G¯¸ÕZÙÁÀÒ$á©nØ¢à_˜
-óqÙÍÏ£ë>qðΗê)OÁÍ]ÈŸ Y/—ùª¬Tû1+Jˆ;Ƙ;Tà™73p d˜­nW ôŒ©TÿYD3D&¦sµ÷XI¥E¸~±+J›Ýnvó1Ãâ|ìpüÿ¢êHs±ÇÒÉæDY×5c˜Ù9¢öÿª&ÂuJ#$؆ ™Ù>ÚöÕ7Ø€A1T™×µWçï¸Ô¡±¾ZF'z
-ÒД¹Óz³¢ûåzµÌ‹— ÕA°™^¸çExœ÷»b_]ävÍÊA½GV‡ùœÏ5+êЀ¹{áwÚ4¼ß)€ÈP*Ð ‘¼«€á!÷0ˆá°#qß·åßFÕ/³,ŒP;, çû³^§ï>÷Èòæض2¡´öÀ‡ Oé§ïB4Œýê@5gÀ·ZT½Sÿ©„·‘endstream
+xÚÍZÝsÛ¸÷_¡Gz&Âá`ûäØrâkNq%g¦íÝ=Ðms"‹®HÛqÿúîbA‰’-1©•©“c øÛïDÃÑ3–ÙT¦=—jf¸0½Éíï]û"Žé7ƒúíQï/~9U®—²ÔJÛ»¸j­å÷^ô.¦¿'–)v+ðä_Ÿ‡ƒÃ¾4<9=û”PÚÈäøãÑùÅ`D/lúþlxB=)5ÇŸ‡§g¾ŒŽN.Î>©{48ŒÃãÁ៿ .–[n–à
+÷ûïƒßÿä½)|ݯœ©Ô›Þ#<p&ÒTön´QÌh¥šžÙÁøàïË[oÃÔ—`Ò\0!À8ÓBlÿUú¿I©XŠû\ÿѾà)ðךñ”¯—²…¼†iïzΤÌ*©ò“YVU‡}«´NŽæ
+Ù‚âuð*í™Iíõ›û䘄‘žËŽ)Ãœi
+ö VU[ä£1`Öiæ×þÀaDúªœÍÊÇb~Õ‡dA“œ¶–ñ¸e;ó‘ÓZû1@ØHaã¨F)Á$ÓhgGÕ_6Yº”t‹F‡;ýÿb
+N¶½ÀÚî±woqc|]')èÉÛ_PH@ ½*ïçSÄ’§ÉàÛ]¾
+ÃÇ|öD#ƒ¶a
+Osšƒ2¶ ¡¿º¿¬é9§!,L),\ üHz–ßÊU³sÇ]ªcйÈâ§q41YšÅq°ŸY3"Ú2´SzŸUôŽ~¡±QÐ1Áç…8´Iûë¦ÈmåÿŒˆ.á–ÖÉÂݛ׉âϵK’C©;„[YÆáË¢pÿ6ø'p[¥<×e r0ôN๻¿œ¢¿æOÑ5·ì ¾ˆ‚½šU×ómøêüO9_Y›þvûÔaˆ¸Ú‘´@د Ù«+W©…8Su¤Ø3¡L4DcÌV¥Yã“H£†ˆÔ$7YuCê¶hXˆ]…áÝšËБ…ËYfÉB¤‘…[ Ó[_û6*ûM%öäBðìò€òž»H¢?œöiíxéª Ãu=+/›8÷®¬
+Lú"®ãû»ÜÍb†Û˨ŠŸ>ï@´µÕ7Ù*Ë™“^t ê,“6¥3‡gÃÓÏ
+Äñù"¨ÌjƒŒÀŠ¿
+H
+:$‚G,€2:j‹3¼ â _⶿ô ‡¸
+¼„®#[V”*“ÚðÝgçãÁqð&Ò)œÓ™ØÄ´Õš1ºÍë›2š•ù‚­›£^+UùÊZ-»oÁV-B¡ ŸÑ2½¢p¬¹ÜŬ
+o™Yà&Rîºì‘ôLC˜NÌŸ û†‡Amt'X° B“‘T4X©§¡r­:˜c(žŎзŹËïpî»KMí/ÝC~B-Z:1VÇ ªâšåÉš½„Ö£0¥‚Ö`Ó¸p¤ƒ ïZ.ŸÉ…·f…È ‰˜çk’/U3¼˜oç¨ãu1ÞˆÖåþ+=ÐöB&4¥ž`@i
+<ø õ’eº‘
+Øm8Ú_÷†²6í’q ã¥p‘ ƒãPòM@®b¡]ÆÌôîy@ Y1]¢¤˜0-ð 4Ž `‘âÔ˜
+öçÈb-ï¡Áýáf°'£^3ê“ËQ" ¦íó\f\¥¬‰È¿U½¹Þ á?–ñÅR¬ŽDëÛà鑾 ¨ÑˆZº¤[Þ# ý­l–:‚ÔÒÒÔ†Mõ_òË›‰?r.¶³¤Ù׉#æ ¬Ç;ÕL*ºp±yO“÷:Mø÷Þ_Ýž‡ )ï·¤³Ò“-ºl\‹J`üÙÅvÁqÓ²ÖÚû€ÊÜendstream
endobj
-1538 0 obj <<
+1952 0 obj <<
/Type /Page
-/Contents 1539 0 R
-/Resources 1537 0 R
+/Contents 1953 0 R
+/Resources 1951 0 R
/MediaBox [0 0 595.2756 841.8898]
-/Parent 1486 0 R
+/Parent 1927 0 R
>> endobj
-1540 0 obj <<
-/D [1538 0 R /XYZ 56.6929 794.5015 null]
+1954 0 obj <<
+/D [1952 0 R /XYZ 56.6929 794.5015 null]
>> endobj
-1541 0 obj <<
-/D [1538 0 R /XYZ 56.6929 133.9784 null]
+1955 0 obj <<
+/D [1952 0 R /XYZ 56.6929 671.961 null]
>> endobj
-1542 0 obj <<
-/D [1538 0 R /XYZ 56.6929 122.0233 null]
+1956 0 obj <<
+/D [1952 0 R /XYZ 56.6929 660.0058 null]
>> endobj
-1537 0 obj <<
-/Font << /F37 802 0 R /F22 737 0 R /F39 899 0 R /F41 939 0 R >>
+1951 0 obj <<
+/Font << /F37 1018 0 R /F22 953 0 R /F39 1151 0 R >>
/ProcSet [ /PDF /Text ]
>> endobj
-1545 0 obj <<
-/Length 3132
-/Filter /FlateDecode
->>
-stream
-xÚÍZÝsÛ6÷_¡·“g"ð wO©c7ê¤nÏQï2×öi‰ EªeÅýëo» (™Š“6½éd&Àb±Ÿ?@–£
-5‘êx ”úñ|Ç{ÏýƤ]oÃ{6åŠÍ Ç›S“—=r¨d9.&t¢NðË™§‘Ý ›
-cØÚrY;á€ê$1áG–Cžƒ0€4èr•áì€K6¢Ös%—ßíõ$P責³Ö¥ƒbå?«²L”AJ”ÚR˹6æ} ` ͆_x]þVø ÔŸƒ.Æg,
-TøüFâ6Ý6ÔØuUÎËÖñáÄ(ÙRYU¶eÁ3]DÂwêÒr1耛bë€I½` bwËea™PôS«°<]ÈòäU³«øÌy˜
-üf†=O‘NóÝ‚ÀAìD²Æy=6,LoÐô<
-.C€–s²“Q=@‡Ú. wzC¥ 't†1ÊcB£xÔ{‹Atµx_´¼ƒ“˨Ã(ŸæsNl›ESa,öy,×Îî‹žÒ‰1à«r¹rKc3†pÔ˜S‡å‡Ú¸§šmNÔ/™žÑ‡1k0Z&jÃ_“*8ADÝiMK8–ŒGæ–z¬„‡2?ÝôîæŠVÊ@‡/†r>fÏ
-¥¥¦·Õifç«8×Øj—û¤N°î†“åÙ¼Üõèríà]ææP^1¶ÉÉ¡AJ Ç<fâñžéUéX* ”L¢k$Îwyiî>É<ïOVÒ%W‡IÝBdF­-N®ëbÝÔåÂÞ\
-Œûº«ÑóæÁGì³qìalte=ãÚë(ÈÐÆ÷M§÷>z Ù°Åw;<G()5bÝ?$7½!röД^*@
-ËšæŸ@°Y†Ð袸̀Ò1t蕋̓J\÷à/ÐÉKû –xd«SU8ÅGwv6¡ScƒNÝÛ {é¹U{‡œ± ‚!4ÖAÈÉæMoûRŸ=¸/™ÇÁgB lÛE
-@Æí™À9JyáÐcP=ô ¹š†OgØGœ!g=¯n\pGßù¡ƒ©“ø Í÷u³¯Š|YœaÕÝZ÷ðU‡áJu¢1<Ö :nüÔÃ3öö¼n  …s!UÔ#®Tú¢>¸î™‹Q'€\›-»ûÓ·`©¥“Ž” D"õ§½Üƈc}æËíà*/HO‰ŸþíW<ùm‚…¿ˆ¤ÿ®ö¡6þ†‘F‘©T †Æeúv*®_ý€>: Æß¾»œ$:Q€¿€üß×·×w/E7íôuÝH‘„4ÚÛû5>øçh(ŽEh9¬!¡B…‡MRCnûT%/ßu
-9¯ÞN_Tò‹ê#
-E¦Ï9L”ŠP‡ôKÀ±C¸Ÿ LV‰A©T©óŠ9lùö“P‰Ô¨ô9? c\@×ËN° ¨ úˆ
-zÜÿÂ:Ðäî$~Î9tg ©…€¼¾k€¤ •œWKoÿpÈHpñTEϹ†R"Š<v ú¼zì¿>ãGÊ?¡ÔÉ$‚jcÌçþH)A#QEÿ‘R&ZDIoáÏИ²µ
- 4 a•=ð½’>ZîÇkµ°Ã?eáT~÷dVô¬é7Ëx2w?X
+1959 0 obj <<
+/Length 2986
+/Filter /FlateDecode
+>>
+stream
+xÚíZÝsã¶÷_¡·P3'_$ÀöÉñÙwNî|®¬´7Mò@I°ÅF"U‘²Ïý뻋%Jч/öMýÐñŒ¹X|ØÅþ°»€èpø3®RÝ1©f1qg4;á;¨{w"B›^Ó¨×nõÃàäû e:)K™t·­±,ãÖŠÎ`üKtöþôzpÞïödÌ£„u{q£.¯Þ'¥ÏÙ§«‹Ëw?÷O»FGƒËOWÄîŸ_œ÷ϯÎλ=¡t,a
+·€ÙHÙÌ!%ýd“ÑgäuF<¹j% Uí÷Ù”øã2ŒRÖD¸/yUo‡óà›3øOYà"âæ9&¢µ6(=ÐÚ€ê÷é[?ή26QFR!þœ
+•+B‡ÛrÑ M_?©Þæ4È&òâ'Éýa?[ U9Îoqì[·¨ˆqë«œQéª+"hLZ.Jñœð ¼‡ VdöæŠåÌ- ?ȹ,ˆ7\ÖDøÝaT4+W«͗uVCûlê· 4q_殨ò{·ëçüÀ —aé·ŠŸ²#VªÅ4éˆPË£Ñ4'{f†Aq1jðÖU£E>t¡c^ìyÿâŒÐ"q̶áB^˜¬¯mdÏ3\0¦
+\ƒ?5ž¨ë–Ÿ§˜µ®|‰¿÷›ûuÍ9K¤é:–päÁ@^ºŸpJj¡‚†µM )l£aâ¡Hñ» ùÔºEߎÐ(ùHä#õÈ*äËT7¯µ ºA¦ß¹©ŠÀžîò׌\ÒÔ_©@¿=Ÿf£¦Óð‘¾W^a˜X™ô­<˜CVÓÚŽÏÛâÛ©^!c“0#¬<b5q*™ŒÓÔ êzÐGßR¥Ñ):3:š—~RÜ# º†¬aγEMTyšy|b\Î2ò´tØÕHUsP º° í·®·ßrëÖ~@GíÅ¿²}ƒS –Ê,7ö˜Ž˜ƒNÒÑg8¹`‡F×äÝçc´UiM4Ëæs0³PºúÁ¹‚
+$7 ¬”Dx0@â3œ<ðÆã`á•«Ø~Õ5 ‘¨Êi­úe•ó²$-³©9vìÄZ3­RLÿÚ+GF—@ãÌ»‡ #£æ;Ÿ¶ô‡=‚°çÀÈ锦ÇT Þ¤7$ä!!xƒéûí4€µ3@èlúD¸ÂÒVK ¯Y[aÍQ¸“œÁŠîúý›ËwpâEgeQ“¦­h;ÚʨÊ^6G!²ÆY|çq[ÀXE~†ôÞkBš+}@è­Õ¼”Ð/m›{…®“â}q,"èb‰°„_ý®2Ñ
+»±#*8?è¦iˆUPËÅï¡j*{¶1͵íYcW'Ü–3ôƒl ýyŠü¶{C)p,’c©!1±"±xsŒmš¶ÌÑ`€<v¤·lY-"M.¥ ‰Nñʥܜ5n¦ñ–› ¡°w3±&À²¼[¬N¼²!i
+Ñàˆƒç Üóop IÊÌ™Cf€0$W†-{s SµÄá¼3ܳ›ƒë®iô&dî)^Áí£ˆèj9Ÿ—‹ºQîû¼ªÁûa ±W…-Ù¼bL“p®€pDƒà¸2e¹ñ²ü,côbõ]+ÝÜ@VQž¾Ÿ6Ej}ä@a;03<Ý
+ÌþtZëp\ÖZìK©d}Õ~ìîûn¶îîÿ\¯f"Me¤B=2n6ïüÿp÷¯x¬LMEÅÔ¾À¯y— •dZ†´Ù`n¸nËé´|ÀФüýHsÝ3Ñ0I«á×°Ëhš¡‚©ÝÆ/ ¬*˜µó>ý
+H«’δ‘Û ¯;®àà¤bQûÓX÷Ù4ßÚ"u³
+@_ð¸“<fJs1%iDTÊåU·—àuÑJñ—xÍ
+ù©ÚC:ç5U|¼ÃoÐæÒ‰Y>î‰ÔðCéý~Ör…¢ PMnX¹ÏÄ1YVTž/ó²r¸É)‚lpÇ@øê»jW~d¸Ì§uouH†›u²ºvrÂWá¨u쎽!XТ-{z@!X€±*èÎ0Ó¸C ¯J„¶û÷d[Û¯8'”bGS*Â$nB øܨDÀþyï@Lc­Õþ’b­-ù›U˜G…±»wÓrN‰K—´ÆoI4
+õMØ
+u÷Ù"/—a¤ê±Ú™¡­Ý,˜]fÕjƒýÑÛƒÙ,šÚ»Êž7 þø‡LÙº*¼å€=¸{­ôöR›ëÕ8 ãÂè':‚&-{Ï}¡Ö>
+Ï/TxjFí"¨¼­]X³ù4åµÏãÚh‘…nzXá–ò×Xh˜¨Ý»Â–Âu¸|㑸‘ýð\ë¢ #»/ü¬ ¿9ËŠÇ];‘æöG¢{¿«ÂÛ3¬ÄÉU“!8j縓Œ|ˆì¡–£&‰^­ý'¡kë—ñÒþ =ÑÇšž-QKÿ(y%=Ü£BQŽ½ ®…öÙñ4ƒf€±Ý÷há¡H-½(+b­=2ݤtÀÜÃ3Ðzâ2ŸM¤Š˜ãœ°Vä*z0ø€‰%jâ@잇_áUlUû.X&¡@ƒÌ'?üôš±HÚ?ãÁ&ˆ+þ±Öž§¸
+S†Jìz9Ë;GóO}§»~«¬ „Uû€(®ñ8aV!]-¶ç+ $MÓ¬5÷ÿY¨—lendstream
endobj
-1544 0 obj <<
+1958 0 obj <<
/Type /Page
-/Contents 1545 0 R
-/Resources 1543 0 R
+/Contents 1959 0 R
+/Resources 1957 0 R
/MediaBox [0 0 595.2756 841.8898]
-/Parent 1552 0 R
->> endobj
-1546 0 obj <<
-/D [1544 0 R /XYZ 85.0394 794.5015 null]
+/Parent 1927 0 R
>> endobj
-494 0 obj <<
-/D [1544 0 R /XYZ 85.0394 513.3136 null]
->> endobj
-1547 0 obj <<
-/D [1544 0 R /XYZ 85.0394 488.6113 null]
->> endobj
-1548 0 obj <<
-/D [1544 0 R /XYZ 85.0394 303.0671 null]
->> endobj
-1549 0 obj <<
-/D [1544 0 R /XYZ 85.0394 291.112 null]
+1960 0 obj <<
+/D [1958 0 R /XYZ 85.0394 794.5015 null]
>> endobj
-1550 0 obj <<
-/D [1544 0 R /XYZ 85.0394 122.9426 null]
+1961 0 obj <<
+/D [1958 0 R /XYZ 85.0394 229.6198 null]
>> endobj
-1551 0 obj <<
-/D [1544 0 R /XYZ 85.0394 110.9875 null]
+1962 0 obj <<
+/D [1958 0 R /XYZ 85.0394 217.6646 null]
>> endobj
-1543 0 obj <<
-/Font << /F37 802 0 R /F22 737 0 R /F21 714 0 R /F41 939 0 R >>
+1957 0 obj <<
+/Font << /F37 1018 0 R /F22 953 0 R /F39 1151 0 R /F41 1208 0 R >>
/ProcSet [ /PDF /Text ]
>> endobj
-1555 0 obj <<
-/Length 2939
+1965 0 obj <<
+/Length 3016
/Filter /FlateDecode
>>
stream
-xÚÍ]sã6î=¿Â÷ Ì¬Y~I¢î-ÝÍöÒÙÍö²éÌε}e%ÖT–|–¼Ùܯ?€
-á:§ŽÐ—íäQzw Nm•Æ%uJüH |ѵõ®/©·.óöL8?k8 胠
->AæÅÉFObY!ýrK>}‹Ž'dü²Ž‡=D¥¨<ø­î›v¯:tþªk;÷NnöYpD0å)‘ $yŒç`p½ØÞŒ®IÏEóÂj~ÿÙ„Ö
- ´%„Z«
-bÙ¢(}
-íkŸ{¹Æò„ØУ²±ØöþsJj‚Ð9Žcæ0rgu¢¸š(¬ÞÚ§ÅUÃÅÕeßSVÔnoß½ ŒzKqZõÕºœ÷í¼¦, $£4„r W†î—õ’:”PP]£ç‹ªç!ïIâ Ç“NMJŽ#=Ø5UßWN r- 7ïü‘„€~X2Áœyo+Ÿ‰"¬.
-IG%Ûš‹¾K™ˆ ™/´Š¼ \
+xÚÍ]sÛ6òÝ¿BôŒÍ
+÷ïï®Ï/ex7·o*Œ¤wõÝ«Ÿî¯çÔóÐ×·wo£éçêÇ»›Ûož¿:OBïþöÇ;Bϯo®ç×wW×ç¿Ýv}?°<Þ–òûûÙ/¿³v÷ýYà+F³4_h-gë³0R~*å0ÕÙ»³ G½vꤘDàKË 9I9%§Hû±’ÊÊi“m;ÚÔ¯AÌßÐNñß+@êêVÙ0(]ë°%uYŒkŽú¶ç"õʶé-3vQšzI`Q¶ùÖ,ÊÂGaÂŽ.Eâk%SËÞ=ÒQÀͺÌj;G%‘]‘õFÞýý[ eUPôԛñh³æá•Y›ŽMM¿«fÇ} ­zYM˜ùœÚyÆcLæC¹a*¦>X)ÏòU 6§
+vàØ UÝ&…¯£HÚMMi‡¯n,ÁÀË6›ê‰p]è¾[5[Óey,©«ÈºŒ b ðþhê²ýûùe¨
+B6}wÃá-z^{á&é:>°*W¬ámšÊäÆñþÐl7GŽHTthY™$¡`­Žô¦YUZyYÛšem™¬åD‡{Y±6µi»mÖÁjõ@€:\ˆ Ýª$¦È('7@@—¦Îº²µ¬Iï_+S•SJjAøè©@®[‚¬I €&¿}‹¼#„jÃ_dxmþ(Ý„åw- ƃ3úùƒØm†eØve¦k§è·šv›U¦³jA”õHø½­»r[—“¸)· ÆuV£*)½¶_.˶£y?AeË#ЄZ¼jzër
+b·O¼L‡‚uk¦T4ëÌ1Ygktý ‰ß»ÝÃ1ÓeÖê­\d±’£Æï}Yw·×šÈxʯR†›Æ #¶j§éVN',̈…9ÖÅ›»w–]Èíb”Ûy¥|!FÕð%;A€ä…^ù±ëÑ›Jùq³-!Ô6õaÚFqyH\†¾Eh‰“ž´‰
+jÆgôƒ¦CSÚrûh5 ؆]™Taø „:'´i
+ûpñ1[o*kƒ±vBx4Åñ¢ó›+š Uhx11z¼»§ªd¢T•m©aƒW0ÿÀ¥6ÄÙb~×D1…—å »Œ˜mžŽçsÁ°”À<²s‹2K*!NvLÍ& øù„qlåCL;¥@›Õ°À‘2òÖ f4 K“ =²øÁõk­_Òö@©JBU¦¶qXB5RAEÖ/WÔ¼šºw! ¦áЖÀÑB ¶\oQñ²}K;xXmm{º"–±ÍQé Å>åÌDÙ•’ÞŠÅö¨¶Iö71s>÷ ¸åžŒè8Š
+ò"TLLrgºÕhtVYýÅÊáìtbeÃ$ âë±*wZ8
+‚-ùÒ(´îO(ÏN ìí¦é[å|^#·:]Göæ¡åت/\P·õÊþ„“ÙÂ@Ýõdcí¤ænöé}›Œ
+8=Æ1{;ÆWÆV`ã¡P¥\0êiSòx÷—W L¦ùp4Óî«ý a"#¨oË£‰ëº\7µÉÛ) %ú}=äèEóh#vÑ8ve,C"æ4¾½$s@?4ƒÜÇÕñ†Ÿíp¡ ÐˆyLìð†ÐÙccWP),{TÍA}ÎÖr &ŠËLDÚ†
+pÜ‹Ä6÷ö´ÿÁdUêŽ
+Ç£xë­•ì¡]#@»-†­ˆdˆÔª­œÆ°4VAÈÁÆÝÞ¹>¹/0_R+?á œ`»Á(û¬]I1d¦©ºÅV=”亣»àq{ÂqŠÌpê2°®ô 9›†Ï+Îp\q†õœ¸qÂœ~÷û††Nžàb4€êfW•Å²<Aj8µìÕ”¦3Õ‘Äp[“â¸qCYä|*Øñ¼5- )£P¥Ô‹ë‘º¸ê„"·Í–CˆýÛñ5¾PJÍ”Ö~˜Fñç\t©8ðãXF‡]n–cdŽNr@ó Å û!©ËaS—*MüHûk´p\j‹@ûQ Cؼ€Š;¡HxûîÖ¿~ó3^ú¨4ð~x~™¨DBý¨Áÿy}w=åÃŽ$Æ
+N@¢£µÿÚ~Pr`ƒ{3û’J"?J"5-!)?Õ1l&Ѿˆ…¶z.’WÇh¥¯XÀn,ñ)‹‰_1¹ñ¡E`µvÑ*Ñ(#™úÚ–äiÉКò+—L$À£OJù2±Ì XD½ ‚=ñ¯XJûI ÓOÙF¨|©c:b¸ycË
+?Hß‚ž½ A0Älå ±$ÉËoB2•@=Ô£G©lÈV2¤¢«ì‘»è–ôY©…]C©…ÝÊä+Ê÷žLŠn€Ý↞ˆ/öÁPu¿^ÐE±â;Iºzå7I WsØ…÷+/_äeEÁ…X{T ÙSϨþ£u]P-ÈÒíO'hÐ ÃáMÞdG%•’´¿¡Æ«øc’/T¿Ÿ®*¿}•ÇÜ´æã°5WÒÙÛ5GûvŒ—Y¾:>=O§î@'¸ïèÉ]€N¤eù¬˜Ô©+ΤоŠ…ü<ÓÊÁôçÔ’_ ̹=]Ê ñà >û#?t[| Féïý{ÿíÕ;ÿ‡Û{.(¥Nè@‡EøX ›ð/ ŸGÀ"gòÜ/ýW þÂY`БFAz* „¾°2Ðò•Pn¼ún, áí…XÊà¤HÆË}!™ü/IáËÛ¬€;uIA)`èó’‚
+wà”pÏ*
+fŸŒÿŸûUÓþË®ÂVšÊé8$¡äµi‘™BuˆàÙq¿R¼ÿVÁfendstream
endobj
-1554 0 obj <<
+1964 0 obj <<
/Type /Page
-/Contents 1555 0 R
-/Resources 1553 0 R
+/Contents 1965 0 R
+/Resources 1963 0 R
/MediaBox [0 0 595.2756 841.8898]
-/Parent 1552 0 R
+/Parent 1973 0 R
>> endobj
-1556 0 obj <<
-/D [1554 0 R /XYZ 56.6929 794.5015 null]
+1966 0 obj <<
+/D [1964 0 R /XYZ 56.6929 794.5015 null]
>> endobj
-498 0 obj <<
-/D [1554 0 R /XYZ 56.6929 723.7047 null]
+622 0 obj <<
+/D [1964 0 R /XYZ 56.6929 622.0858 null]
>> endobj
-1557 0 obj <<
-/D [1554 0 R /XYZ 56.6929 699.3651 null]
+1967 0 obj <<
+/D [1964 0 R /XYZ 56.6929 597.3835 null]
>> endobj
-1558 0 obj <<
-/D [1554 0 R /XYZ 56.6929 499.5106 null]
+1968 0 obj <<
+/D [1964 0 R /XYZ 56.6929 411.8393 null]
>> endobj
-1559 0 obj <<
-/D [1554 0 R /XYZ 56.6929 487.5554 null]
+1969 0 obj <<
+/D [1964 0 R /XYZ 56.6929 399.8842 null]
>> endobj
-502 0 obj <<
-/D [1554 0 R /XYZ 56.6929 352.0214 null]
+1970 0 obj <<
+/D [1964 0 R /XYZ 56.6929 231.7148 null]
>> endobj
-1560 0 obj <<
-/D [1554 0 R /XYZ 56.6929 324.7169 null]
+1971 0 obj <<
+/D [1964 0 R /XYZ 56.6929 219.7596 null]
>> endobj
-1561 0 obj <<
-/D [1554 0 R /XYZ 56.6929 283.2444 null]
+626 0 obj <<
+/D [1964 0 R /XYZ 56.6929 131.5008 null]
>> endobj
-1562 0 obj <<
-/D [1554 0 R /XYZ 56.6929 271.2892 null]
+1972 0 obj <<
+/D [1964 0 R /XYZ 56.6929 107.0349 null]
>> endobj
-1553 0 obj <<
-/Font << /F37 802 0 R /F22 737 0 R /F41 939 0 R /F21 714 0 R /F39 899 0 R >>
+1963 0 obj <<
+/Font << /F37 1018 0 R /F22 953 0 R /F21 930 0 R /F41 1208 0 R >>
/ProcSet [ /PDF /Text ]
>> endobj
-1565 0 obj <<
-/Length 2487
+1976 0 obj <<
+/Length 3209
/Filter /FlateDecode
>>
stream
-xÚÅYÝoã6Ï_¡‡{Šå‡(REqhšuö\l>.ë6‡n÷A±•X€,y-9Ùô¯¿!‡”%[Ùlo X1Cr83œßÐ, ðZ*Ò8PiL$e2X¬Ohð
-R’&< æ÷=^šP­Y0_~Ïþuz=ŸÞL".i˜I$þ<»|ƒ”?gW—ç³·¿ÞœNTÎgW—H¾™žOo¦—gÓIÄD,90ŽÅïW—S\t>{7|œÿr2w"÷ÕbTy?|øHƒ%h÷Ë %"Õ2x‚?(aiʃõI,‘±žRž¼?ùwÇ°7k·Ž™I
-M¤æjÄNœŒ‘TJ>0”LI"¸°†2ªÅ '¥4œUù¶ÉQ¿‹l³)ªü£¨ð;»~ŒÒÀš÷®€I³Øò¼É‘Ò°ÊÖf¤Óp;a:Ì›ºÜµE]áìTÒv•µ¸¢h¾›D1—a»Íª¦ÌÜ:˜¹·›ë5îš]#5[.Ó'Ú'Ì¡Àš!µhÜòŪ
-Ë©Ý°¬×YaõQaV)t^Ïop€Š,jû]6àoŠÓpZµÛ"opnN¬xŽp ‚œƒlqb-ó!§2Ïš6jëh]7­QÀ¸ÊìtÅpjŠ‡ªøƒR¾È*¸+®yèÍíépm<eN‡l‰+ÊüÞ®öZ e[<¬ZÐ,¦*œ¯Ìµ*~ªeYo6uS´9’÷ÙIÏË­áSöŒãæÛóŠÜ±îÌ`æwÍ.+Ëg·{[´‘ÕüàzÛ¼2’r ’îŒ_
-ˆÌl—1žTvà,OE»BrV!9pOîüËL0v‰p ê]¹Ä‰Uö踺“À‹M]-1G]<w^ß4¢’€3$&r¸‚û+‘Ús’*lVN: :通!Á:¯ùÛ‡öÎ9N]W>­êÆM/³6C¢ñ¬ÜŸ‚2(wÁa¬ý€ââs¯ziïZ¬¢c
-j<ʤ{ëŒ1¤Šp½+ÛbSº ¨ "‰Å=~Q*ØÃ&,ôç­2·r]wÎf×£W€ ~¥ÑǸ–HÂóz‹´üs¶Iœ`žc¹r©ùƒ[Mõú#’0æ8,HŒAZ–*’X•&úkJ’HQT”¤ÿm—¤§Ê‹à>
-¼ÜÐﲊ:¥¢DH¢c–t/f½ìË8#B$"%ÈhÅ\ÝÌÞΠÒK&h8 ˆ.÷m(©&<IxÐ?íÛ40¶€Uöîûw… ¢u"_3
-W$V#2‘V`c—òœ3¸¯kÒó6ò²qz§þ]ÆÙƒžÿ‡Ë²”­
-zXÆ»°¬ª¡½SoqìX‚<´¶7
-Ô' ¨´¹ò¢-<b7€‹•½';‹[oÎÏ
-ˆ;5¯Œ¨È?GœP7™W˜Ë¾¯Ë²~²'ñ Ìšr›e÷Ø·¬[ãd$h
-Þ í×0Ù~!3‚<ö¾Úä6%ó±Âº·>.y÷NÂ<,‚ÑS%…¹rÀ-ˆ3eέ¬ñ›UÏ8ØUŸ
+xÚÍËrãÆñ®¯àÁ¨ÊDæ |“m­C—W»‘•*Wl Q†
+Á[ Æ¹Œ<Ë{Òâl[ì?Ð.±Œ-7Më9Ú{ v³­Î¥”ÑhÕ #ö8ÂÞésd© ¬§üÄe'vš9¢Ý5õª¬ïð¼™âk8Ñ®ƒÃÔ¾£n~WxÙv(¶ìsj™è6_þ›×5ü (ëâ#ã¨è wø&~ª?4ßßH½ïY—Ð;µ¾j¦x²n›rÑ&ÿ€[ª ˜ø†òÛ¶©]A½m‘×pg‚ùM©”†á¤¼'
+ðí©‰âˆj !p´YØß?+À±xMñ+ ›R,lÖ…Ú8O-æ lzI±†åÁâë.7^!úц¾AæÆ€^ölxll݆mII‘ó™^ÈÀ¤fSf"&EƒWØZ†@"KˆÞ·É‰À`m’ž°tÛ6Ë2ï¼)e fƒßd¤½ŠÇ~V\PÓÓ¾ðÃ’ˆ'Ц_]¼½Ûâ3h´‡5"Eµ±,‹GÆ!õ|ãwHHT“£¨B“Þ %/UQ¹¦AÏ4Ì|Ðõ›Â÷¶ñ&2Ižp°Ä=¾"îV÷ úz|Ì›“Œ> 5<
+éhì{Òé{tw<"í·àZÖ™ð̃ßò®nŽ¬c€ç5ØìÜ+q°$¬5² ˆ`Éc$#¤!Ò:¯‡^õf'fÒŸ¢æU ±ÃO‚l‚q`l×”u7ØjB Ý>sÐÅìåv+>æÛ]U|sêòei,-¤!UŸäó©,¶©LÇ>ßÿ·*œcð~Ož€Ö ÀÅÍ°bŒjî4·. V½?iä@üÁÁzf3¥K<5™Nñ²Ù¢†Ñàµ-À­ÖJ
+²,y‰-„‰“àPRy÷\áTG—9&X•²4©,ÛBh„œµõÔ„Qû-}I¡)ËÎ
+EÝ㟩„<mÿ,êX„Ó9Š~8ÿ'ð£:Ú‚ò/w/ Ë@ãqI:ãbdÿs
+´@¢à¯•¼ `cÝ4Ï×Äe{¾eþ\GݤLbо¥IÒ©ŸŠÙ‹¯÷©?@<þB{í¯7ò$0ŽÒàUÎÀwC\Þúѳ„Ÿ*2ØàìÿR¥'ùendstream
endobj
-1564 0 obj <<
+1975 0 obj <<
/Type /Page
-/Contents 1565 0 R
-/Resources 1563 0 R
+/Contents 1976 0 R
+/Resources 1974 0 R
/MediaBox [0 0 595.2756 841.8898]
-/Parent 1552 0 R
+/Parent 1973 0 R
>> endobj
-1566 0 obj <<
-/D [1564 0 R /XYZ 85.0394 794.5015 null]
+1977 0 obj <<
+/D [1975 0 R /XYZ 85.0394 794.5015 null]
>> endobj
-506 0 obj <<
-/D [1564 0 R /XYZ 85.0394 769.5949 null]
+1978 0 obj <<
+/D [1975 0 R /XYZ 85.0394 613.3608 null]
>> endobj
-1567 0 obj <<
-/D [1564 0 R /XYZ 85.0394 749.4437 null]
+1979 0 obj <<
+/D [1975 0 R /XYZ 85.0394 601.4057 null]
>> endobj
-1568 0 obj <<
-/D [1564 0 R /XYZ 85.0394 660.1505 null]
+630 0 obj <<
+/D [1975 0 R /XYZ 85.0394 465.8716 null]
>> endobj
-1569 0 obj <<
-/D [1564 0 R /XYZ 85.0394 648.1953 null]
+1980 0 obj <<
+/D [1975 0 R /XYZ 85.0394 438.5672 null]
>> endobj
-510 0 obj <<
-/D [1564 0 R /XYZ 85.0394 449.4639 null]
+1981 0 obj <<
+/D [1975 0 R /XYZ 85.0394 397.0946 null]
>> endobj
-1570 0 obj <<
-/D [1564 0 R /XYZ 85.0394 424.0768 null]
+1982 0 obj <<
+/D [1975 0 R /XYZ 85.0394 385.1395 null]
>> endobj
-514 0 obj <<
-/D [1564 0 R /XYZ 85.0394 352.0618 null]
+634 0 obj <<
+/D [1975 0 R /XYZ 85.0394 216.4249 null]
>> endobj
-1571 0 obj <<
-/D [1564 0 R /XYZ 85.0394 323.4047 null]
+1983 0 obj <<
+/D [1975 0 R /XYZ 85.0394 186.4354 null]
>> endobj
-518 0 obj <<
-/D [1564 0 R /XYZ 85.0394 272.2519 null]
+1984 0 obj <<
+/D [1975 0 R /XYZ 85.0394 97.1422 null]
>> endobj
-1572 0 obj <<
-/D [1564 0 R /XYZ 85.0394 246.3845 null]
+1985 0 obj <<
+/D [1975 0 R /XYZ 85.0394 85.1871 null]
>> endobj
-1563 0 obj <<
-/Font << /F37 802 0 R /F21 714 0 R /F22 737 0 R /F39 899 0 R /F41 939 0 R /F62 1062 0 R /F63 1065 0 R /F11 1397 0 R /F53 1029 0 R >>
-/XObject << /Im2 1051 0 R >>
+1974 0 obj <<
+/Font << /F37 1018 0 R /F22 953 0 R /F39 1151 0 R /F41 1208 0 R /F21 930 0 R >>
/ProcSet [ /PDF /Text ]
>> endobj
-1575 0 obj <<
-/Length 2175
+1988 0 obj <<
+/Length 2116
/Filter /FlateDecode
>>
stream
-xÚµMsÛ¸îž_áCöLÍò[âÞ²‰Û—ÔéK½;;ÛíA±éF3¶åZr³ý÷ H[ªÕ®û:Ì„‚
-
-âüñߎ‰ƒ•‹d‰}½õó%
-Z´8_òò)AÕ’Fo×ÎBBäœÄ+|Bmê†ÎmïÄ»ˆä ?R½Ë‚LÏ»&oJ4ÌòárW­
-΄
-ý6´.u
-&ýÄ{Zg—Sg¶Ð»s•ê{ëlVu_¯%YÎå¹ÁÑaé¿óº¶*ê>‰¤cp!rí0ûò>
-"çIææó6*¸ëUPÃyCüÿ”ðÿâ àFå  sɯ³¯X7?I–«Ú.M¸šji‡óØÀ6žð µß•>.
-
-#QÖÕ>
-/Pãþ€R·Ã«Ž½TR¤£ý¯ü‡•C’«ç»òáINd1 ]a0­è…f ÿ¼¼¾¾g—÷oИ—‰_Ú€õ¼Yð/Ü6ÞZÇr"´
-ÐMHÖâ{ÉúÚ¬x‚˜ÿpËÈ€†é[ßNîÿ˜Ü?c“?/_¿¹œÇJÈŒÀg4\M/_ÇÉgŒ÷gضF©và)–ê'=|ÃTœÐ
+xÚµXÝsÛ6×_Á‡{ fJßnn:u9§N,÷µ¾i’Z¢mÎP¤"RqÜ¿þ_)ÓqziÇ3æ
+X,v±»¿]€DþH$$’šê(Õ LD´ÞNpts¯'Äó$)ésý´š|ÁÒH#-©ŒV·=Y
+a¥H´Ú¼‹%bh
+püûÕb6M¨ÀñÅü P„qAãóŸý²š-Ý„ô¬?ͯ܈vŸó«ÅÅüõ¯Ë³iÊãÕüjᆗ³‹Ùr¶8ŸM?¬~žÌVÊ}³fFß“wp´ë~ž`Ä´ÑüÀˆhM£í„ †g,Œ”“·“ÿt{³véØ1QFP*X”0ŽlßgzÊLYcÃÍÕZ~•Ž„"­×G‰b°3œü³²Ü: ²<V E].9E\rÙ¹œÒˆ¤… Æç’"–¥„ÁASn}¾0î°œ ɉa$ óØr\MIâü§ñçLœÒ4’RAl)n¶Ž>Fa®5sL=ÚÚz<;ðý|K£W5XõŒ
+‚“¾dk”¤½8†ð.Ø_¥(å0e4^ÝçÎ*Éz¬àD,H°êWËùë¹·~ ’CD,=_YTy3M˜ÆqQ¹o â-‘OŽ?gÛ]X²½Ÿº5SõÞýØíë)ñ§bSTwnh]W­[Þz¡õ—„ƒ–piL£¤s)¨WWå#ð¿§4u”AqìÇ7µûVuë‰|7MºNEXžív¹c„8CIÐÅL®ÛCV:úÐdw¹1òŸslû¸›;
+„–¡GDú6øæ<–’sžôs>ð é­
+8”¦“œti—P¥âË Žzïh/Jéø¢Þo­Gaô!kQTE[d¥‰ós“¿Ç˜VÖOvÖ-]^œ»¨ÂQYåyî(7‡›&ÿxÈ«6H»ÉóÊQùç6¯6ùÆÄ,ÄÈõ½Ñj$&]´€Ý ƒÓèL
+Hòr\ßÛ°cÔAPÌùFœ£€(³›¼tsfƒHf¸ÿÙ]ü ¦y¹1¶2Ö²8kvùÞ%
+ñ¦ÚB˜vå‡Ä…«'Ä×j;8Sã<gí¾YõèˆCõz¸ÂBÊÆ­8©DÈôk,À—‘èV†œ%>=‰ÍÝ}Ó:L ¦ @Á‰ÎìFÂW7‹`nÂ7î›ÙiÐØ뢫7$p6 ƒÜ1ÚHF¿ "\DEÊ"©Êû 0"HLú"G@B¤
+Ñ#kó˜8àÉÿSÜÜóææù¥_ΖÐY¸}±4v=dm^ÜŒo!•ïïFÂ…@¬
+ÎÕWQTg~›_°µÍ/øýp¬)fÖ]Y¼zEe!bD/;µa²ðÂw5,1Іe<¿»Z†°ê@óy7A—Ç™ölA|“\ñÄæµI§Ï\C;e{8Ò;ò€lE{?Z4Á‹ŒÒ? iÐœÂk¸ôBÏ^›jþP4ù ¿TÀû)ÿ³:ãÍÊßåXšBË…Õ0F(p<ci®<D×'˜é*оßÊñ|Ê÷žËžÈQŽrÒ8™0øèFï3¿ßn_ØëÙÉÒ¼‘¥©øŠ[0à ç!®êjÄšÇ&i
endobj
-1574 0 obj <<
+1987 0 obj <<
/Type /Page
-/Contents 1575 0 R
-/Resources 1573 0 R
+/Contents 1988 0 R
+/Resources 1986 0 R
/MediaBox [0 0 595.2756 841.8898]
-/Parent 1552 0 R
+/Parent 1973 0 R
>> endobj
-1576 0 obj <<
-/D [1574 0 R /XYZ 56.6929 794.5015 null]
+1989 0 obj <<
+/D [1987 0 R /XYZ 56.6929 794.5015 null]
>> endobj
-522 0 obj <<
-/D [1574 0 R /XYZ 56.6929 769.5949 null]
+638 0 obj <<
+/D [1987 0 R /XYZ 56.6929 617.17 null]
>> endobj
-1577 0 obj <<
-/D [1574 0 R /XYZ 56.6929 751.488 null]
+1990 0 obj <<
+/D [1987 0 R /XYZ 56.6929 591.42 null]
>> endobj
-526 0 obj <<
-/D [1574 0 R /XYZ 56.6929 529.8403 null]
+642 0 obj <<
+/D [1987 0 R /XYZ 56.6929 518.3317 null]
>> endobj
-1578 0 obj <<
-/D [1574 0 R /XYZ 56.6929 507.5641 null]
+1991 0 obj <<
+/D [1987 0 R /XYZ 56.6929 489.3118 null]
>> endobj
-530 0 obj <<
-/D [1574 0 R /XYZ 56.6929 426.6253 null]
+646 0 obj <<
+/D [1987 0 R /XYZ 56.6929 437.3327 null]
>> endobj
-1579 0 obj <<
-/D [1574 0 R /XYZ 56.6929 399.4643 null]
+1992 0 obj <<
+/D [1987 0 R /XYZ 56.6929 411.1024 null]
>> endobj
-1580 0 obj <<
-/D [1574 0 R /XYZ 56.6929 191.6116 null]
+650 0 obj <<
+/D [1987 0 R /XYZ 56.6929 208.889 null]
>> endobj
-1581 0 obj <<
-/D [1574 0 R /XYZ 56.6929 179.6564 null]
+1993 0 obj <<
+/D [1987 0 R /XYZ 56.6929 179.8493 null]
>> endobj
-1573 0 obj <<
-/Font << /F37 802 0 R /F21 714 0 R /F22 737 0 R /F53 1029 0 R /F41 939 0 R /F62 1062 0 R /F63 1065 0 R >>
-/XObject << /Im2 1051 0 R >>
+1986 0 obj <<
+/Font << /F37 1018 0 R /F22 953 0 R /F62 1352 0 R /F63 1355 0 R /F21 930 0 R /F11 1442 0 R /F41 1208 0 R /F53 1303 0 R >>
+/XObject << /Im2 1341 0 R >>
/ProcSet [ /PDF /Text ]
>> endobj
-1584 0 obj <<
-/Length 3620
+1996 0 obj <<
+/Length 1853
/Filter /FlateDecode
>>
stream
-xÚåZKsÛȾëWðàªPUâd^À
-®p÷ÿºøø‰ÏR8ë/œ©8
-fOð™ˆc9Û]è@±@+å)ÅÅýÅßÛ {_íÐ)¦i©X(5[ˆX±È¼°,-ÁaYסaÊH=Zv!„fq`@!ç0{ÔIBŠž$„L)ÌL³PIeEQlkä ô•½¾§ p ì³ÜæõåB >O³z}ÈW™}óf›½z*³ÑÊd牛Q¯Ã¥ˆæY]mcÑg¢®+ûLÝBMEÏ•ë´¦^I“¥ ÷ ;ƒƒã&¥ÝâuyÂŽz^çåC‘¹#õ¦6îHo&D‘ëð'xZErðó>”@îí´[UEM/Oy³ÍKjãYŸ¯-t¢ ¤›{šç"Äã®OÝà$4iB‡§jï‹d¥– )%‹…–CŽ¬€!ÒDÄ}iÌ<o²CÒ
-^¢`~ªŽô¹Ì`Sö{ãæ…IöY7ø9sZIŠ$#C®gŽ51FƸG|¬’õçºHê- º?T°( =çˉÉAÕ#¡\8Òñ<clb22#d4šLŒ'Ó/(Ù`5ô[Ú€}MñEs®_TØ[vɉ¸Q훼*“¢pïÖ„à¹m®žP>–z"åA¯k-†Ê³«ÒüOÎev¨‰!OÛ|½Å&Øí6)2"“iClÔrS£öàûƪiµ£!m·VÁ/#«šÛeŠÔ-“§Í–šI™Nú*©Qm øøß`“—bÞí36=S‰CPÚ†¶‘×öÜÐÍ¿%â†3
-¯,›I–ÇJ„=Qd›†f\À$‹€…òÝ.KspX…[ø¿p<70M z4P|ŽUl©åKÑ1 Dð’F@„ÀK’zÊ 'TÃ9\hè朎ûà?^Yé}¼B}ú41s k‡wÁß`Š›ù;ë²€)Ù—d·/²«‰-…ªõgO¥¿õT ɯÔU:åb¦Ô 'H >®œÈeÞ] 3TæT¦Í•\Î%ǧêYRÉßy}<j— }±ý¯ó=Ä
-?O;ÂEÛcá$®CBŸÓlï’‚hÖ½wß¾f´‰Å”î“4µ^L°5^|ÁxOgÄ2sÅ(Œ_c„yLò"Y™ëmµ7ÕaWS³5`ÞíÑ®ðI7‰ Gx–§2 yÑ­¸r[X709ÉÇ€kç‘šä™%SÂxe«& X bÙ[]š±.ÍúÃ-¨r{6ürf¡(fZµóeÒiÝZ3Ê„ÁKusüs
-x
-u“Í2ÿJ0'°NŸy™æ>úBâq¨†'_ÃlôED¢ç}ÞÐÃ:Ê>ƒÈ±qvpg€;û9Ù&z
-p"ç¥OûìUµ½nHÇö.i°Y†>s‡/UióX Õ
-̈D«·Õ‘.TÌüÁbïÐapã½µ±'¤IÅFÈ_Òö¦!ë„óB²=R°¦ÕŸP#o=c{È¿­˜¦sÔS×mÊ0!ÙÒ\~''…
-†œtý
-šŒªZ Üè\Åa,8 y–= ï¸3µT»
+xÚµX[oã¶~÷¯Š
+õ}î}üÄ£X÷k3•g&úœ‰<—Ѳ§bF+ÕÌ,zw½í
+ÉòÜèn±<JrŤLó·±h¬@6;¡öQL­˜åû(J Árc$†1çÌ
+ˆž5È–RGèaÏ™3“jŒ‚3£$hî9nûI*â ü—ñ«x
+O• MBYƒMBA_ëMÞ¯ëG¢ÖsA½eØ;y,Û”Ôð;\3µªjŠÛÖÍ»ì 3×W<þ\äz~èòºD÷H›ÅóÍzI”O&$0™~ ²LˆåŠz»q}1spD;ØËzѹe©‚´h×ê·•?6PQ²oaßÖœ;Š±bßPDDZ
+ÔiÓ¡<¸g2íz“)ËtÞ”ÛÌÍ‹í¢NêzÑ!9͘Ժ)ªh
+ÛšÀ0]/—X'¯À™V Ð'ª
+ØȬ…ã
+(–+™‘y
+MæœÊ‰ #}LúJx隯\Æk¢oÐ{žú“Æà hbj{_¹ç­/füÞôE»éÚ³Š&¿”XjHmW3‡íq…uãåMn*¨9 þ;Š.ek)JÓX¬1¥z@±z¹À)´Õ™Jµ¥™
+[Í*Öi~è³}¨¼N¡n¼Ž-aÛ&Á'ö2ùð „Tp¶ìd¶NʤÁK Ñ„àé.µÓØû‹Îû¢òmßßX Ñ5ü«v«
+ÚÉÐwDb,„«áh×!pédø·WD“Ÿ‡R^'sª窩ŸVlU‡F²ŒËS‹£»Âš(6…áÅuaåLHc›B[U—F2gYfóv™½€1 rÖè\}
+n: Ôo¨ÿ¤ü_*Q<g
+Tymß
+Øa’ÌšTµ\Â)WùܪÆÖ ÓxJ%YÔŽæ *·)]Øä Fâ¬Ö[OL¼îˆî/K~ójñ•¨Y9G–¹Ï}øžûþÔWLúf y¶+K(œN~|tÕ~ÒX}pHÿWWÁË Ýݦ(L¥)]R|†3è3]¤¯D?¸êx}ÕâtåêŠ('¥W~ÂEš|Þ–DȱВŸžÖ›: nï‰x'u{óg·©Â]ª1äÀú™[¸‡/*»&WM7åý‘&'lhBçXL W…pÿ\\ŒÙ`ü9hð!$º³‡´½__]ã.…žÈÞ&$káX×5+Dûî‰$â'Fw4Þ Ç¿ÇgløÇàý‡›áiPð òŒ†óÑà}X<c¼»Ã¶-jÎŒâç‚îÍø A<â :œÐ].è°J¼a•ø_äQ÷ˆc@-×߉á“'‚ÊÓ@Édƺ À÷Ýi&Î7äuœ«áA1W»²—ôVÀ¡ò÷3K5ƒ°¼šñþ_ôÐMei<Z7xtøû ßW ¬ð¶| wU9 ¼>÷Ê<onFìðÈ)W^Œ Wì†#À)‹.wÞ‡SžžšžoÁÐ5v×”MPÈ î"å°Ë„*y¢¦?…ž‚Ï»Î
+iûù _üuýËíÝ$ Å=h²WÂÕì¬+­NÃÁ@âø§‘}w¬QdßÐ(¨ÉxÙ­ˆŒ¬rgŽèrK÷ÆFýFû7wÊã"e—»7ž,R©Nßx\äÑ.Bnƒ±‡L_;2ãô½]Ú´úBÀµÝXYxð[•ò*Wð·ܾñK%R.2xðKx«ò¬ë§J¾{Å|ó£û´e*ËdûWÅÖ½˜k¦<•à‚X¾isóÒFeÌdþ­¥û
endobj
-1583 0 obj <<
+1995 0 obj <<
/Type /Page
-/Contents 1584 0 R
-/Resources 1582 0 R
+/Contents 1996 0 R
+/Resources 1994 0 R
/MediaBox [0 0 595.2756 841.8898]
-/Parent 1552 0 R
+/Parent 1973 0 R
>> endobj
-1585 0 obj <<
-/D [1583 0 R /XYZ 85.0394 794.5015 null]
+1997 0 obj <<
+/D [1995 0 R /XYZ 85.0394 794.5015 null]
>> endobj
-534 0 obj <<
-/D [1583 0 R /XYZ 85.0394 408.8853 null]
+654 0 obj <<
+/D [1995 0 R /XYZ 85.0394 655.4043 null]
>> endobj
-1399 0 obj <<
-/D [1583 0 R /XYZ 85.0394 384.5457 null]
+1998 0 obj <<
+/D [1995 0 R /XYZ 85.0394 633.1281 null]
>> endobj
-538 0 obj <<
-/D [1583 0 R /XYZ 85.0394 174.3152 null]
+658 0 obj <<
+/D [1995 0 R /XYZ 85.0394 552.1893 null]
>> endobj
-1586 0 obj <<
-/D [1583 0 R /XYZ 85.0394 142.2096 null]
+1999 0 obj <<
+/D [1995 0 R /XYZ 85.0394 525.0283 null]
>> endobj
-1587 0 obj <<
-/D [1583 0 R /XYZ 85.0394 79.8825 null]
+2000 0 obj <<
+/D [1995 0 R /XYZ 85.0394 90.0274 null]
>> endobj
-1588 0 obj <<
-/D [1583 0 R /XYZ 85.0394 67.9273 null]
+2001 0 obj <<
+/D [1995 0 R /XYZ 85.0394 78.0723 null]
>> endobj
-1582 0 obj <<
-/Font << /F37 802 0 R /F21 714 0 R /F22 737 0 R /F14 740 0 R /F41 939 0 R >>
+1994 0 obj <<
+/Font << /F37 1018 0 R /F22 953 0 R /F62 1352 0 R /F63 1355 0 R /F21 930 0 R /F53 1303 0 R /F41 1208 0 R >>
+/XObject << /Im2 1341 0 R >>
/ProcSet [ /PDF /Text ]
>> endobj
-1591 0 obj <<
-/Length 2761
+2004 0 obj <<
+/Length 3601
/Filter /FlateDecode
>>
stream
-xÚÝZÍsÛ¶¿û¯ÐQžD,>H€|ï”8vëÌÔNm÷òÚ( ¶8‘HE¤ä8ýÛÅhQrÒèÉd‚‹°Øýí@ñƒ|¨He"è,ŽÆ“ÁdqÂÐ÷ë w<#Ï4
-¹ÞÞür!õ ‹2%Ôàî>˜+XšòÁÝô¯¡Šâèf`÷—Wï²Ó‘HØðöîTÇÃ7øßÝåíÝåÙíé(ËR1<ûí͇»óâRÁ@¢¸ág×W—¿þyã&¸¾"òÍùÅùÍùÕÙùé?wïOÎïÚ „›äL¢ôŸNþú‡ ¦°×÷',’Yš á…E<ËÄ`q'2Jb)=e~r{òG;aÐk‡ö)-ND¤D¬#G)¬ÿuËòH3Õ¿*Œ„Œ2ÎâýSÑ8S¹&Ϧ%:RœƒpZ&‘<kM*D`R£S­ä
-¬&½,'Õ¢(œÖͧµ©›ú¹Ò%ÓQ¢’x®ð}B·S¾ µä0>˜vľ›XgÃr½›¶ÓauO´b»'x{wuKÝ«Sžým×}µÂ¢18²$vr“Of¤ëg×ïΣ ²ö”ñ#ªÁ*I£- ÿÀŽƒJyLT‚nc.ù ¨
-,g=¨ücmV…9
-[ØÂPÆìÐ`ÙYîÖi{óu3«VEóÔ‡˜Ç™±• ¨€*:â:N€™PŒQÝñ­ç.
-*SʱÛ&|X{ÿl*ö Ü"‰’Øy2}³Z3)RÇ‘YBd†dT·@¨bXgëCØK'
-Ïê´ \E3#"¨¨XuÞ Ð°±ÝvÚC9#ÑYòLv3Í¥›»®ü5Âr‰«ñiÿÙŒîx²N1‹¢i|ÍF6'˜šû|=ozrµk
-’¹û
-Z.›º!|“höï€Ìô\έãŽ8; ©åzAŠÝÙl<´µñ®õàx ›šeÅ rþÛ6äÐÓgŒ9v+&û~Qô"«>ˆ×L×ï62YGuÁ
-•¢à³IÑU©56…¿¡ñq˜YÌÂcåökßühþÓ³·gQîÕ«WýÛx׮ز n2-u–fq¨N쟞>x1½ýàÅ4Å-gÜQLHµëtÏœ ˆrên¶hÔŸeñRéÓÜÍÜš|±„KÁ‡ “×ëí¡FänÊÚ€kLýKa/¾°ù>/×ùꉘùë¾sÏ ’A5¼€ê£z¤Ï=1_k3™YåSËú*<sb¡,ï¶ÜgǺÀP”˜¨@të°hÀx[¦óM "<@!òÅú~ì.æ cjêɪ[2®;®6&¢ÍïùLS‡.xtPû‹Ÿ¾^ÆÑ9}pç:›cÉ_Ö}¬wçi|¢À5J,¤ÿRTàÅã(ÖÖ¹îZƒ·çêÜäóµã»·†·:.›ZøÕÑ‘×xÑ„/deÿ¥’Oc¨›Æ`6ScS»šhù&/æùxîX|iæ†^x¶1a}ƒå)ç|ˆ×<¬ä”ö(öY¾1Dˉàw¨œÄC[W­¬¢ú:P)J=Jû¸{yÐ54å }ÅzoÚ#…v{ ¹.СH£ÊGhç{Hz ʶ£ @‚*¤Sˆ=ÅÄÞ
-ªÜxa:cÀ?ËÎœ)¹ET™Q¤ÿ>+CÍgˆSóÃ.Dºû[ýR`Þòì‹Ì˜FDv 9¬Íe>“=_àÌ#ç@K«I<[ÍA=>,"¥AàÚogPÉ®‹£uuL,yçC›pHE:ý iÜ·´ ˜ ½ Iòd!?G.bz$²ým…ôUu+×ë^¿´<¢œ¹oUbpo¾^”ÔcÃ}Å ù¸u?ˆÍ ƒ)Ñë§Å¸š3]gcËJùß#oÏ[î.:θ?œa'MR»•ZTcù ©ôsšÞ0ß1nF©fÑ–ÕÌÕÆt`Ê\ Üuÿvw÷(™ Ç²Ždêë™l¸*fN{–Ë"Ã*_Šq’¸“Û+y+)žÑO·|™» p¨:òt›1µ«–;Ÿ×Q|Ør :Su¶¦ù¶XÖºÖxÝØ%T0´p¼Ój²Æ*ÝÉ°¬ìAã‰:].…õõ²·äN"ü}aO…ËZþîŸ1n+v<€§û.°Û;'š!w$ç,R‰Ñÿó2Dendstream
+xÚÝËrÛÈñ®¯àÁUªDì¼€rÓ:’£-GNl¥*¯ ’(ƒ
+·ûí‚ù2Ž‚Ù ˜ÏãX̶*~ ¤t3ÅŇ‹´
+,ŠcÏ í¡ÎÒ+
+
+»!± jÒl™o“‚Æ}™o*÷5#”æ»$M}‡„¡U[rc2§¾ØÅD*î]£oyLò"Y™]m\-3Á(u[ÕÅ5-vtVÀ¦ ¤I5Z—žNp#„´H‹N]ù±C2Œ¨øH«ec"õÉ#5HpìĨš81ðO„„"ö6 ½Éetêú: û2i‚¤jtcBÇ…¯e«gÿšŠ5ÀÐnNPÃðևݎx½¶¦LÚ¿—ùÂpñ …¸
+ås,¡àû’qWŽ?Bþ[ S+­-¦¹§¼°&da?6]êBŒ!†ùŠÆyCã'ú …††ö=BlC;#4"ó©ì§gYL.ìRfršÍÀÁÜÐÁ§4_à[b3»Ä‚Êv l6ž˜ƒI·1ëØW8ô= òrYÒ¬Ñß@¤®=ŠbÃÉÏRÞ²Úî’&_äEÞ˜ W¹{ÂÇ,Ù¹IFa‰Áp=3p­ý(nù«©xŠKÓÿN¦ð„º! Õæ®ë2ÿJ‘u@$„6/ÓÜ|ù°8TÃû,á&àC9µô0²¥È+GºÑÈž.Vô‹
+ÐHŸcîg FS|³Vña’mDϘ$[}0|›Í›j^ävÆ„-ŠuKÖY‰ù‰1êYeÂÆ£d;¹³u $í‘©;’|Âså(,k™ãí&Ûç³O6µš(ˆœD<<¼ìKÊ¥]µ¿Œ¼C‘Õþ·ì%dÊS](0€±‹¡mú5Öˆ~íTfšÀ1¥¤ã&{W#OÎ6K‡ò
+ŸŠ"N$Ï:c0)é}úYe¹ÿ «È×±>_”Sj¬¢³,:'êp2#í~3gd¼ÿ­/ã0?!ã\»Â2,·µSX¹Mšå†&H»¼¯Xiž°Ö-Ì8:Ó6¶µó=Å9+·üÿNn{ñ³äÖÑþå ÝŽ“r+C?Rã•[Å|a5ö¸ûö£…)Õ"± jÊ]`Ï«‡ÈÝmL.þ3É‚E:<O.ašTd‘õ<d3½‰L¤Vñ®2i$¬«îqÐì쇪u"þ¡fÏŸEÍîî¿{}û±7; ¯ Í—(²|F¼ÿXøìÑPh`AŠ>—J$Ä01ñ¶
+v`ZÃ<]©ëÂCݦ(onîoÞ›ºÇÃÍTMBBî--Jsk
+KzæÑÆ„ÝÓlö¥ÉJŒgí÷2u!‚5¬AÛ^µ…5 )•X쮯ôDh#õÂö± “46'Š øÒ;Î…ÀªÙៈš´rq}‹H )uåpéW+»£`¦½Çë·×> ’‡^<Óúã0)ÔP»o}9çŒ1ï:Móþ!·¹»Ø­¹Ø”šá“/ಗóZ̃”d.çÔ|þ¨¼ãèhŠ?Ž…8ÛÍDŸz3iSšÞ‰6}´‡P©ˆ~Øî†ëˆŸØ#~N† ¦ÐÉIE> »„)zþ@„«„3æ3Õ>£ì“§)GÌQZº’ @µ™Íˆzy>=N@²Ô•û¹SbÑLzììpµ¨ÞÀ'Ô,ò2Ùûëmø ®G¾}N³ÅRÀ¬À{‰ø“ d0he+Mš¤5¹/›C[ÃÄï­jµ!=~X]ðŽ£m²ÿ ”°sù–pªŸ§E•¤ÝlîJl¨§T7+”P³ÛCÆ„1&öûǬ}†aí"k ×è›P'î=K …CKˆœ¸>/ÌdŽ¤Ã
+åx!‹«ƒ“—±É¸òVÄr`x3]ê¿jß°j”α
+ÖÅÅ¿ã"'f&ÂYyX»sá­‰3B¤± 
+ú&Ú7JƒV¯¡ïæ 0N˜G¶Pžz cüO“n.kÐ*âмSØq,$|Á"·‡<‰­PÃOø‡’‰g!L Úö ÐXŵ{ÕEÃjïEv:mŽcB‰h”šT`Ì Œñg«ÆåmöIY¯zy‚iŸè0T¨,Ž­Rƒ®º%‡Ø›Øw*nË“èå Sî4¦:å…¾QÞn‘3ØoÕúøt_SD•tû¶ÚŪªD)㒤̳¯íÀfŠx„9ëtå#ÈN¶'…¥ŠºNa->ÄqÊ{'üsEøÊÙ«‰÷”4ˆþfh È2«k¢ ‡„ ¹zS¨Â©½µ©-‡¶Æ¬µÖæ†Ô#®/¹õÒN¸/„œ£—©¦•—Ž"ma§*Û-›mLggݲ)Å„ðY1ñ”ä2RÒJô:ÉKß=F~H=ôP×E7_cáVòÎ%~Kþ­ÀlŸG
+1— àŸgB‡R³ðêœQÅîÿ13TÆendstream
endobj
-1590 0 obj <<
+2003 0 obj <<
/Type /Page
-/Contents 1591 0 R
-/Resources 1589 0 R
+/Contents 2004 0 R
+/Resources 2002 0 R
/MediaBox [0 0 595.2756 841.8898]
-/Parent 1552 0 R
-/Annots [ 1593 0 R ]
+/Parent 1973 0 R
>> endobj
-1593 0 obj <<
+2005 0 obj <<
+/D [2003 0 R /XYZ 56.6929 794.5015 null]
+>> endobj
+662 0 obj <<
+/D [2003 0 R /XYZ 56.6929 306.3415 null]
+>> endobj
+1788 0 obj <<
+/D [2003 0 R /XYZ 56.6929 275.1221 null]
+>> endobj
+2002 0 obj <<
+/Font << /F37 1018 0 R /F21 930 0 R /F22 953 0 R /F14 956 0 R /F41 1208 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+2008 0 obj <<
+/Length 2796
+/Filter /FlateDecode
+>>
+stream
+xÚÝZÝsÛ6÷_¡{“§ƒ ïžòa÷œ™Ú­íÎÜ\ÛJ‚-N(R);Î_»X€%ZNÍ\&“q-‹Åâ·‹Å1øÇGi1™Å#ÅQÂx2š-OØèê~<áŽgâ™&!×ÛÛ“×çR²(SBnïYiÄÒ”nç¿ßýûÍÏ·gק‘°±ŠN'‰bã·—ÑçÝÕåùÅ¿^¿9Õñøöâê’È×gçg×g—ïÎN'Y–
+h\Û›[läZÞÜ^¼»9ýãöÃÉÙm7€pœIÔþÏ“ßþ`£9Œõà ‹d–&£GøÁ"žeb´<‰%±”žRžÜœüÒ jmÓ!£%2’Tè« >âq$c%zfK2š$Öl0ÒÓ g¬?Ò6o‹¦-f ŽäˆÀúl4i¤t&­
+`Lo©&çyQæÓr‘~Õ¬ÜÌ=oYsÍêMu
+’®@hyK¥GcG>Ü[QÑ×YR"Ý°àZ niòª¨îï6%Mµ–ô<å}Ij0ÈÚs‡S§2V5ôÕUóE8 0ÐaÔ飣L`Q2)ðô¬3ÔU×AÞšûz]|öÒµ×Æ »«Ë²~„q:Ùf†ršhÀa³$)-£T}™»òH3Õ÷Ö¿ÕÈ«€î$£ì`¸ v D¹¢oÑ5qÙ¨Ü5Îô6„œ‰Hʘ”J¢8㱇‹jV/;ƒ]›?7¦i›]{I =pžÂ¾NçNä ZËXD"MûZzt6®6Ë©©N)Îhë…~Hðëýå U2ÝølÆW1ùlAæ¸úùÝÕû³=ô$RGB%êˆÖ@¨H¦Õh²øÿGLÆGĤH"³ôLÆ<â)Òö0ùËƬ s
+37$S nê²9̧£¡^~r‰¤_çW> y(Ìãi&ÆÏ{Áñ&à ÈGLXHÙKN¤,R,£\í2_ºüêƬülô7 Ãþ°íêX‘ù öÞzÚz‚eÓoʽñW>‡ b¤¥
+Ó…>HiÛé¶(¸§€&y,|Ç€ŒY{Sñ"ãg™µþëÊ!Ò SåÕÌ|9,ƒ†Ëƒƒè€¢LÕ¦òø»§-Ýœ`©ôø³92Øý¶™ EÐÀ5DO»™r»¨fã“ÛÜQ>w¶l×yÕÜà|4Ó}Çi‹a§’¼„g – Š&×~Müb}-Ó8¨wáPﱊÇ*ñ±+*»„ ±K6v‹?€^@,àò/5·'R J)ˆàS
+üµŸRL|0.L†÷ßÍ,Žfðoø©ŒTªþʈ|‹g€ Åœ%‡VŒ´ð§·iºèóþ­;ƒ¸n̈°“¯S{‹üÊ{ä÷§;K¶9v¦(Çš‚¥­¨2±É3~)yÆ*<iŠÞ?WÙÔZ3f¤© Ïëî„ «Ð9n 3kÐÜÏó6Ÿæ l!a¾ØøU•îè æÓ¬Ìý¹–ùú#•~g ûüÇ©iÑ zíý+õ'²PÈéc÷°ðűã1cšŽ‹–Hx0Ù¸Z:T„Ò*_CP\Û6en7ÌÚRº“¤X»S±h¨êcU?VŽ¿&ÒÔÐokçÁá/ ¾]Xq‚#ñ›— J¼ë@Њj›_þçúúæì‹h¹cotŽçßo^)3qÆ_8 aFT,é\ñ¦ž}4î`ûâõÕ/ÇaWÇÊ(«ß¥žúárœ…eœén9†ŠÊ´µuo S@)sôÞ¡ãÐð…)áñÆþm@Q€k¥Æ3:✫ðömïN2¥¶š“§Q’ûþ|ùK8™ÀÖ4ÖtPó
+l?f›5ý¬Úò IÐÃcMux-K¥ðæVº[Zdµ·´2¸¥ÝV:HÊÞ2&ù±_U®¦h¼|×µo²*s¢á}ë'× ]0źùf¹²–R©»Av©~gL”®Ü¬Ì¬@qgãé“kEÙ×ô9ìû5WûÛLœÐ}œ&Y¤dæ[Ìê
+9ï7ëî¾Òž–°¯¢+1ÐÄ_Ûƒu対–ukÊ'b";SêBW‘„`Þóã‡"²8Ñw ÏyU™’*­Ó»4nÐ1,lxô±g'fÈY!jj-TÐÆ,mf†ýØÑ¡Z½¹H XA3‡ŠîYj»éLòcž{×!´ˆ2hƒ¡êÖ÷#*\=c ùŸ_
+:.»tÓUµÆ"`eÚÕ†Çq$b•õÔÙ[:®´Ø—fã¡Mó÷gopL'˜ D|û†$‚%Ô½#énôov"èy1pLùb
+{hˆÅyµÉ×OÄÌ_ EJžiæ^Çœ.b¼fA㻧+î¥KN,´ˆÃo›íì>‘‰Ý#SPÝú+N`¼ÍRyý7!±;Ô„Š¹ifëbjüØiý`"ÜÙÞåE»&ôÀ£ƒŠØ_¼IqøzGgôHë@o®è=p€*k^ø¢Â j,¤Ý
+ÎË]ÓsÏ6%¬?`v
+ùû®y˜È)íQ
+ì‹üÁ-'‚¡rs ]Z´ªn‰êÓ@¥håQÚ/»N³Äh z.×BïM{m¤Ð.ða!×!i”øí|IAÖrtH¤îXæn±§˜Ù³UA)’[¯L¯ øgÕ“™’ÛXD ŒUú×Nj>Aœ*É…†V^HèñäÀBNöW¿¶Ü.ܘ‡§Ï­˜’Å‘”÷JÙ0ÈôþÆؽËÜ×ý U\endstream
+endobj
+2007 0 obj <<
+/Type /Page
+/Contents 2008 0 R
+/Resources 2006 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 1973 0 R
+/Annots [ 2013 0 R ]
+>> endobj
+2013 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [55.6967 389.5558 116.8967 400.9478]
+/Rect [84.0431 269.7901 145.2431 281.1822]
/Subtype /Link
/A << /S /GoTo /D (statschannels) >>
>> endobj
-1592 0 obj <<
-/D [1590 0 R /XYZ 56.6929 794.5015 null]
+2009 0 obj <<
+/D [2007 0 R /XYZ 85.0394 794.5015 null]
>> endobj
-542 0 obj <<
-/D [1590 0 R /XYZ 56.6929 374.4628 null]
+666 0 obj <<
+/D [2007 0 R /XYZ 85.0394 769.5949 null]
>> endobj
-1283 0 obj <<
-/D [1590 0 R /XYZ 56.6929 350.9179 null]
+2010 0 obj <<
+/D [2007 0 R /XYZ 85.0394 748.5408 null]
>> endobj
-546 0 obj <<
-/D [1590 0 R /XYZ 56.6929 144.4344 null]
+2011 0 obj <<
+/D [2007 0 R /XYZ 85.0394 686.2137 null]
>> endobj
-1594 0 obj <<
-/D [1590 0 R /XYZ 56.6929 119.2896 null]
+2012 0 obj <<
+/D [2007 0 R /XYZ 85.0394 674.2585 null]
>> endobj
-1589 0 obj <<
-/Font << /F37 802 0 R /F22 737 0 R /F21 714 0 R /F48 953 0 R >>
+670 0 obj <<
+/D [2007 0 R /XYZ 85.0394 255.5751 null]
+>> endobj
+1658 0 obj <<
+/D [2007 0 R /XYZ 85.0394 232.5802 null]
+>> endobj
+2006 0 obj <<
+/Font << /F37 1018 0 R /F21 930 0 R /F22 953 0 R /F48 1228 0 R >>
/ProcSet [ /PDF /Text ]
>> endobj
-1597 0 obj <<
-/Length 2948
+2016 0 obj <<
+/Length 2917
/Filter /FlateDecode
>>
stream
-xÚÍ[[sâ8~ϯàÑT ZÝeí[º“ôfj&é&ôl×Î̃N·§Àf°I:ÿ~.6L ÓEñ`Y–ŽŽ>«$HÃôb0Ó¼§4GÑÏÎpï+|ûpF|›AÝh¶z7:û×S=´¤²7zhÅÇ1é&¿Gïÿsþqt9ì¨À‘Dý8zw}sáj´{¼¿½¹ºþðyxÞW<]ßÞ¸êáåÕåðòæýe uL¡?(ø¾w#ÓÉ÷¼]¿¿ëÿ9úùìrÔL œ$ÁÌpÿ÷ÙïâÞæúóFLÇ¢÷/­iovÆC‚3V×LÏîÎ>5ƒ¯¶kh‚ÅHÄTµ FijB#É(³¨ÍŠIöÆtœTY‘÷L°è¡X¸Â}ZU©//ú$ŽÒd’ÜgÓ¬zþ I¢£óÉ$3“©k™UZºâ,yv…dZ5M÷œ[‚Åc6I'®&óÃWß2ß}\L—³Ü Cqôßo©oØaîB‚º‰d“ÉhSª|?WN¿geUº2Ìç)Mí ä¥o_=aÇò'xc4Ê*Wû5{L˦SÝrá)çE>Éò¯uõ2·™—<™ùÖѨînå²e±“´²‚å(«llYŠìÁ=“ù|š“ûiŠLwXa¬0c â5Â1A¤? ãèÆqcä8]<ZM¹É뇛@¹)Ùƒ¦õdÌ–t?Áæ qI×åúUj¬vŽïúa å‹uuR7ŸT
-³DœÉ^8öÛ&cPÃH‚Ø"ý¢áÙ"Y÷ØWÐLÆ+‹BÚð‘)|†éßË´¬yÀãÑð“—ÔБXƒ¥c„mŸë®9÷fÆR(-_3NA '`
-tL¢°0ÿ½±0휉14¬–®œ»XÉŽS `ñìÖ-í^¬
-!:"hSj€½ÿhRmGþ‘yí\Ûg3 8HŽNOÖ.0HÔ1îŒObˆL .çËêÛ§Åó0ý ‘˜‹høyˆÎô*™IÓ•
-ñÒvÇâb÷d˜D`À¥oøla°Ç:? s¬{ìBA(h—-dPÇu£©ß‹2­QMª6Uj2Afå{WÍš ª¼ó5÷Yü-ÈþÔ&*N®ˆÞ–+[i$É>[% GL4î5ß9MXa®Ù”$CÙHˆy®K’©1^ j`ÙƘÁR¯…¯µ`ß&ÿ WÀq-»¼æК5^áîrhÌÆoWfcþüú€"Æà®’lz4ß`ò0ˆ¹]wýË @“8U÷KãÒÒ±'G5E„Ƹºþ
-jh
-ð½\,Ž†¯§½ÖåSu®Tr$éØRéDD1ÚØÊ/·¿ž_߀ °¸Âû!~–°M?K¼Ÿ…/5mä^½O%¬%µ ÖöíH—Z,¡D Dz1„“b–dy ãà⸹Éó£|j¸§êS)!s†Ô QIãUfbì X³q;¼zš|:PT|žkE Y–N^˜K‰M¡ô×.meážótñP,f¡¬ÕŒ´ˆ‹=¦Íy2´œXb;bPmîñæ_gG­+]$ˆ7"AU§ô¦Ý¶Ô:Ê-éö>R»ç±)¶ŒùÛ@$ŽåŸ…FJt ¢îÑ.¶DÆHkÜ
-RjPÛ¸XÚëÀæ0†Q&¢!T"¶Têf{Šn÷
-µ¨šrRUéliS¸çJX}Ÿûeå
-“¬´Iï¸ðA˜Û’ îi¯hÛ+ÔæÍìõIôìÞ\ôiJ–9S(íEfSºþè M&^vËŸÚÖÜʲwºy³/Eut}aë°½§í?WÏóÔ}MŒ&™¯ãiR–¾nZß‚vßîSwó›Õ[´Ï³÷!¥nö T›Ê)‡¯}¶+˜|)¥ò 9iÖ¿Eˤ¹@¦6µÌÐíqa°sÆ×¹=ªî…rý6EYép-ùA^ÈõØ[(H<xܱ‰‘¤¤ /Å|¾Ï1UpÊÏTpÊo^Ü?-i|‡ª-·Â+eЩ5õ1}’V‘~7Òæ†c4Ê—³{K„»p¦n¥oæmír‡k¸â¾;¡à%rs@§Ž‚ÊZ„^L¥Õ#Sðz´V÷ägäÞÊå}iŽ’ójúܦÆNÉ-ì K„N™ T?-|¦PÏÜ”ÍÌÍ3 `*V3m™×déwŸÝ]ím{#Pº=-ƒç|
-š‹»W»Õt§£y“¬VÌi.sŸ :Õ²©\w[cÒ Ù²)CPLIíŠgÉ÷Á¾£H
-Ý’ûbYm Æ8dô”õ ‰5¶± û¶øÚs…að§¦ù h¿­¸[T_D;ä‡C>Ï°ŽC~¶þuÕ4ÚæbÍ
-oÒ2\ w†Å÷l Ùò¦ÒÊž‡{{-Ü ã†äî4MÜÜY?.a,ëÛ,5¿²IÍö6$Bµ­ îu&óûþïnõOD®‹Ãºµ­(,AÓ´2ñ¢¡eÿÂ%¶áðÐó­Öÿ؆QÃendstream
+xÚÍ[ÝsÛ6÷_¡Gj&Âá“ îÍíÔÖId¥×¹¦´HÇìH¤JRv}ý-° EÉ’iÙjFã\‹Å‹ý
+£„‹oA³m¨)CBÁ…Cí+çÚCUÇuVÕÙ´Â÷³å|¥U¯TQ£àn¤fpÝ0FŒRÜöC#¡cT·ó†#FéÓ>Þ˼NËʳái —ÄH&—É]: ÁƒÛb6dÁ¬xÈòoH©ã›YZa¹ZÂÇù<.³ÿùúU§K!X0mºÄ¶wqtœ{K3HX”CÅ}–¤•Õ¥‚‹¢Ä*i<½ÃZXéÉÅ-ëFXíž‚„êŠu fém=/*+³âÍ–ó¿d>}UÄ77®¿ô>‹ëFš ½zœß
+'ñM6ËêG»Øü™à4I2Û8žaͼ¨Ýòƒâ<~Ä"<ñÙYN R2ß=ŽÎ–Pùm7œÿ¹K}…xÛ\ͳ$q¨qÝ.[Nÿl+,ÃxÒÔ}-þ•¯_?݆•EVkV#µQlÔÔ,‘jQ䉳=HFµp/¸ôlÉ©í¨iî¬Ë–QDhW*ñ Ù->ãÅb–M­!­©]³‘B€¥íx@ÖÚÚ+”ÆZö´¼w2ªç-pד…Œh!ÂÒ`Ê#¾È•IA$ø¡5OöªF´vöí(°òŦÅ:«Q3"ðôü¥”«ØÂt0 #ðÜFƒ· IÄØko_Ci¸›J?m ]pɃ34,nYm†Tm´V]¿m46
+^Ról¬ñ„eÓb'@ÂÛF´
+mzU†p.UǼI;³ü>žeÉjŸd¥®EùöôUö-ë%ÎÀ3ØwFuÄØï0â=±ˆ”šðЈÖ.¼ÿd7àtŒ‡Jöµw\›ÍØ`/eîˆzÄæA@‰ëžhA
+E“-œ.ë»Ïåã8ý2“Hª`üåámU”™MïÓ•çÞk í>]i¯ Ò²t ø?Óiý,ð!±&3C´æ}!B51Å´]*Æö—„ÕãÓ×ãÙ‘ôˆñ„€6bº/b
+Œ~»-š¡‚müå·‹q?œÿ-rd]ÆyuÛì{ì²½àvÄ>^pD¶Q؃­0†H ¡¼ÅéË"‰ë•5äàJ?¼gy<Ϧ>ðu<Þ†¯—üÈC
+¬¡aOH!"M¤MHaw
+íŽ#Ø\ŸæÕKŒ6òVi^?]G¨#†NÛ
+¬'"ZjQ˜¸´¬\æÓØæUýáÀÐX•‹‚¦EG÷Á´#íc
+±«1¡êÁ4DE‚µ˜Ú¼”î­„Ïn"ô ‰r¹§‡•P{Îø<šŠ‘G+}a¶°ËUvÐaG¸#†P„„ö; aH¨;¾4‹ÝáÓ4¶ËŽ”‡Â2™ˆÓ}ìEÓb–<Š 9R}‹›k¢™FgaçõÒ¬ö£ù¹ 0!hìãræ,¦¤þ€¾Äø¨ííræÉyõÐ Û½Ý îíBËy£‹{rªŠ‡µbµ¡+ÚÃSŽ
+N¨E»\ÿ.Ë*­÷YŸ\o®O dþ2Íʯªµ±¼¶w_üš$®c²M[Pµ˜yªZŽh•É=·*€ë¥ÏwS"µb›Êd9[%±Ïue²{9Hx%lÄ@!#³½N¼ZÛ:óø6Õø'3’Ù㘥Êhë®ÏÇÖvüza7íO/0"
+>â"Îfs¶`Ø‹¼—?;ˆãõÃ,¢$ìÛIb‘£¨Z_pñqü ¬D‹H¨àó²<Àž÷3¸®$>^ËTH éÙfbšA©jíåog9½¼Úö
+Y„è3v
+|®´Õ·¹YÖXH²jëüiác1ÜŽ
+ÝìÓÝêv·®í›ÝH²àß0µ%'œ-Tîî³-]~òŒ’Ä+ïöŸcØû[î¸l·©¸ .Ï Uá?׋¿Æv)Ù¯ÓY\Už6k.Î?â·›/‹‹Fe‹í#w?‹°WßM»%¥·­9øºçöU†+ Cí'2içË2ƒ©Ã'©—å Ë£a{gÎþ
endobj
-1596 0 obj <<
+2015 0 obj <<
/Type /Page
-/Contents 1597 0 R
-/Resources 1595 0 R
+/Contents 2016 0 R
+/Resources 2014 0 R
/MediaBox [0 0 595.2756 841.8898]
-/Parent 1603 0 R
-/Annots [ 1602 0 R ]
+/Parent 2022 0 R
>> endobj
-1602 0 obj <<
-/Type /Annot
-/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [333.4761 85.0848 413.3061 97.1444]
-/Subtype /Link
-/A << /S /GoTo /D (clients-per-query) >>
+2017 0 obj <<
+/D [2015 0 R /XYZ 56.6929 794.5015 null]
>> endobj
-1598 0 obj <<
-/D [1596 0 R /XYZ 85.0394 794.5015 null]
+674 0 obj <<
+/D [2015 0 R /XYZ 56.6929 741.8766 null]
>> endobj
-550 0 obj <<
-/D [1596 0 R /XYZ 85.0394 717.7272 null]
+2018 0 obj <<
+/D [2015 0 R /XYZ 56.6929 717.2979 null]
>> endobj
-1599 0 obj <<
-/D [1596 0 R /XYZ 85.0394 695.4159 null]
+678 0 obj <<
+/D [2015 0 R /XYZ 56.6929 609.8545 null]
>> endobj
-1600 0 obj <<
-/D [1596 0 R /XYZ 85.0394 695.4159 null]
+2019 0 obj <<
+/D [2015 0 R /XYZ 56.6929 587.5432 null]
>> endobj
-1601 0 obj <<
-/D [1596 0 R /XYZ 85.0394 683.4608 null]
+2020 0 obj <<
+/D [2015 0 R /XYZ 56.6929 587.5432 null]
>> endobj
-1595 0 obj <<
-/Font << /F37 802 0 R /F22 737 0 R /F21 714 0 R /F39 899 0 R >>
+2021 0 obj <<
+/D [2015 0 R /XYZ 56.6929 575.5881 null]
+>> endobj
+2014 0 obj <<
+/Font << /F37 1018 0 R /F21 930 0 R /F22 953 0 R /F39 1151 0 R >>
/ProcSet [ /PDF /Text ]
>> endobj
-1607 0 obj <<
-/Length 2370
+2025 0 obj <<
+/Length 2524
/Filter /FlateDecode
>>
stream
-xÚÍ›[s⸀ßó+x4U‹Žî—ó–I`[;ÉØSS{yð€™xàÄ6IeýiY6VÀ8ÉÖºRŒ­–ZŸZênY†?ÒICMOŽ&¢7_ŸáÞwxöã)Ë ªB¿Ô§ÙÙ¿FLõ 2’ÊÞléÕ¥Öšôf‹ß‰8êC 8ø4¾º4ý8˜ÎúŠçößl</¦ý1šÿ9ÿ2N\)é º;¥øÅõÕhüã/“²‚ë+w{2 'ë‹aÿÙOgÃÙ®~' fVûû³ßþÀ½ôõ§3Œ˜Ñ¢÷_0"ÆÐÞúŒ †g¬º³:›žÝì*ôž¢û q®Jáôp³® Í–—F É {Ñê@¤ƒ¥¢ˆ S%Þ8H ½4ª§„A’QVŒÃMú4
-ãÕ6, žÑt5š±e¯óÛ(í˜Áý6JŸì¥ –…xŸè Ê`d¤Áì6Î\¹y’–î’Í"syâBue£¾š”`¤$7e£ËƒÚ v%„ #-æÉv“[=a ‚di?ipç´xˆ“mæž<Di'›Ì=wåXiSöŽ¾h¡ƒ«$þ ÝRV_èèšío‘)=WU‹ÉC¼ˆîÉ:Œ7«'÷t™”Å¿…óÿ=†EÙ…{4OÖwa‹Wƒç¹‰ç¶
-ƒÇ8¿uW–cqñ¼—ŒÔ½´SSèLºW«²†Ð}¬'æ¾ýŽ1ÝDƒ}ýüžBlo¨RU§3÷-ÛÎoÝU˜íSB(’T†t¾ÍoÁð&ÑŸ{†¬“b­Ê¢áf±¯>°`ªDYfÍÖ6 †À„RòyWòÛ0·«ƒ“íÊvI
-3èi+çœ-ÖJO·Û$Æ…è†h[B§()½~i“o5ÈìDôë.>¡5’pyŸ0QaŒ‡ïS¸ø’Fitÿ†n½ü3šïœûb[ùöÄ}–Ñtå¥â,Þ- uÊsxüþ}Ô(Ôyec¢
-2\Òçyꛄ*5(,ŠÃ ¨A
-k駷¯Ò\ªÀEkèý@Hx¥<RT9¸ \ºÞí Dû‚1~Ý]Ÿ!ýÈ£M¸™—7¦9$Jıå ^T9É‹1KBþÁàd°<‰ ƒ CaÅÚ!Ü/U)‚?p"í:5àÂ[Aê™ÄÌ³Ü ÈB>CnI¹™4}ZK Åì™—Q6Oã»Å—ä¸Pˆc¥ë6Þ§·%Ä0¸Çsj
- %Ì!cÛ¡Ðü uÖ ~¼|ºÞæ|Ï‚b`6 ^e£ã/P¨05ÈÊb›*WëImrt˜ž§ÖÇÒûXCRŒrÒ
-¦¯5÷ÊÖe{‚žrFˆ!žäR6 „jc´<¡áÞy[«âXª`2ic„{^›Ý ªzªvwR#1¤á%T…„*fî€Êv@å;úªv×B‰†˜“Ɇ—–D+$)užùêëåõçóñx ÆE0ïÍ@k¡=Ý:LPQ„5! !¶‘R•žx8±'zÿ;ê œîÛÍvLN{n¥A¤íÙb+Ý©§l‡g¹„‚´aÕ$’!eKY&£ëÉç!Ll»W &9¦i3ÈP ~µf¶Há ç ü”Š×'¡š=ÅË!Áä$‚åjË/r碓´Ý"é©Úa LÚ#/MÉ Ò˜:7>¼¼šâÓæ³-ú;Ã?RBO¯ŽfdG8zvx^SŽ¨ÄMÞ›*¤¹rÞûsœ­ÃÜž æF€ï¾ÜÞà¾k©÷¹pOß['¡6‹&NÒ†8>ë˜ãév3íq¡Fž³¾±ÌtPI¼“«§q‡¹b¸É±c† “αÿ®£þ@a»€×dDq\+ZEßÃÜý„£KOËî²Ôd¹9ŽÒ@%fµçv,PNaÒŸGÞÔ‹¦C—×Éä]”.“t} d¡bǧº’ˆƒðqŒ#L¥—ŸKÒü4~;`¡•9x’ð~›äauúu“;Ï¿:ÌÖÓû½pm'9µïb†lnßOÒp¯Ñuú¸ú'v'Mkï–Or·Ñi·“˜;\¬å+ö%-“»Ržêÿf3Šâendstream
+xÚÍ›[Sã8€ßùy4Uc­î—}£˜ejº³Õ5—‡˜Æ³‰Žhö×ï9–+äâÒU)"˺}::G:2¬Gáõ¬"T8Ù3NE™ê ''´÷Þý|Âê2qS(K}¸;ùÇ¥0=Gœæºw÷´e µ–õîFDÿuöéî¢sE#MNc¥iôáêúÜç8ÿóñæúòêçßúg§FFwW7×>»qyÑ¿¸þxq;g9Ô—A uÝÛ;¬T×¼½»úx{ú×Ý/'w‹„ƒdT ôßNþø‹öF0Ö_N(ΪÞ3<PÂœã½É‰T‚()D“3>¹=ù¼h0x[U]MJ ¬¸éÅŒsÂ$ßÜ­ï‚B·uÒ)¢%¯z®½XN„rí,pÌ‚HJ³žQŽhÁE5 Ÿg/ç³|:MFÈjð ³$>´*ÛO†óY‘>%§±04ú6OfiRø‡‡|† =?¦ÃGŸW>Ö%‹dö”Ì|z”ߘ ÓªÎ ÃΡ—˜1â”âUwÉ÷aRÔÝ eóÉ}Õˆ`Qþàó’ïiQ¦ÙWÿäÛle„‚­ŒðÞË lM‡Å`Õ×Q©Ÿ éTT¾LëÌA6ò‰áxP¯òžëù§b~_$ÐwVŽ_–{òº?ª
+WØAmw)¶ „šß
+&š‘cGŽ¿A ˜ÑŽt͸Fó„ˆÊýø« /ó È3ÿ"ù>Ò ÛÄ×ÏiùØÖðújÓ‚-jõŽSpO=Š%zY£UqSmIH$¹ÚgÄr¦ë&ƒïñ®½0*‰ãÕêÁªù´Ló ÈJg¢?©¢E’àƒõ00w”ÃY:+„0)š…«*œ8lˆ@µÁ}>/_Û!$‘––¶†8Ê*‹â_ξö|¢˜‚Eù8¬°ºtWÛÝ
+<I2° ÔÙ%‘VmRSj !ÕÕÖP@@T²Vc4Ìg^½ŠižêÌJk諳]AR¾RÑF%áB5s<ÌçY‰ ?.üz!žÒ|^ø0>…×…°\àyÈk†J°ÓBõBû>‹ ƒ$TC“qSàPN@P\fùv' a :G]ã.éx>KºÀ LšQ­"¯oÔÑCUÝO7X4­t­ XnE°j¾\¯ œQb´tu§¥‹%—Tf¡
+à‹«)–`ö—Uß´ª€ï}9Q«æ€*ÀÇF×y™ü†ePÞ´XgÒ=¢C«Fnšó§tÔ¸º ˜×ñ‹»ð™÷ƒáŸUÙ‘5Ì'ÓA™Þ§ãxEOKl‚ÉÚBcÊ;[H,R°v”¸C¢3› Æ㺅ÿ™äÿ§?)åY²¶ë¯³ÆAÓ ºðOÅ=?¦Å:o¶T¯Q¤³yùŠ×Oþ^3­°EáÔšºèzßÀ`Ãj7'[‹™c°œŒ~eÌ%.y=çóqåó€Ç¸È}æ@òyiVÖy¥7oJ…Æ*5ððM8é?a–n°²áÀ5@›V1Õj]H…É,/}â>ñ¿Õ~'sAu”ž²¨ª[­´²ÎÌ|±él0\;e:L6ۻЖÊÞ5½ïÞdScƒ½Ó €ØnàXœ®ÆüåaÖO¾çY²Ëž¬\Qúþ‡•ªT9dŃ×}xÄ;NJÜÏm„Ù
+ú¾ÿ@–ŠK퀩ÀK;)+@¿MGƒ2L—Ï;!|iÌkj…·†±1ƒ[AR-II‰…£@I û:áøÉbúF”è^‹dO–œ‡eÉÇ’[bé8Ö*Á‰´’p€#îkºYž¿À‰/zró
+æpÚ4Lt¹e\¥l‰ß>*¸7¿P°#Ö?nà@£l—Cæ–ã}­wÈWoп«½ù‚3?ØïY*º\17Љuf‰ß>ú·?¿@°c^¿°Ó³g:®,‘B.nunçCüd¨“ßï+·8›n$
+l1m%ÚŠzÌ
+ ›>ëx'Q©‰4N6D7D,ߊsC
+Àzo€z€pG«Õw…ªãJ’1î¹úË ß*%©6Q¿¿®¹2ß jq¢-N
+Uí¸¡dT'êë—N½Ný^œ¨ÇŠÓZüÞÅm§é  ˼+¾þr~óëÙÕ5~n.UÔ‡çn˜m¥ÝéU’õÊ6¿péø¢ÈBY®kÏ{ÑÇÿØøÏå©RÑÙÕ¿ñ»b+£þn—çXêAmü׬½;Ì@Ôc¥©%~ãÒᨵ%Ô0ï§/oú¿^ÀRŽe¥ˆ—³Y7ÄE¥ÝÙ‚½—ì—¨äÕ†™*¦×}¯N{`wýö˜¤³xøÝtHHPI„p¬'Á¶£n•‡%ÊrÓ dÿ?ýÿendstream
endobj
-1606 0 obj <<
+2024 0 obj <<
/Type /Page
-/Contents 1607 0 R
-/Resources 1605 0 R
+/Contents 2025 0 R
+/Resources 2023 0 R
/MediaBox [0 0 595.2756 841.8898]
-/Parent 1603 0 R
+/Parent 2022 0 R
+/Annots [ 2027 0 R ]
>> endobj
-1608 0 obj <<
-/D [1606 0 R /XYZ 56.6929 794.5015 null]
+2027 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [333.4761 684.0956 413.3061 696.1552]
+/Subtype /Link
+/A << /S /GoTo /D (clients-per-query) >>
>> endobj
-554 0 obj <<
-/D [1606 0 R /XYZ 56.6929 543.3808 null]
+2026 0 obj <<
+/D [2024 0 R /XYZ 85.0394 794.5015 null]
>> endobj
-1609 0 obj <<
-/D [1606 0 R /XYZ 56.6929 518.2602 null]
+682 0 obj <<
+/D [2024 0 R /XYZ 85.0394 447.7394 null]
>> endobj
-1610 0 obj <<
-/D [1606 0 R /XYZ 56.6929 518.2602 null]
+2028 0 obj <<
+/D [2024 0 R /XYZ 85.0394 422.6188 null]
>> endobj
-1611 0 obj <<
-/D [1606 0 R /XYZ 56.6929 506.305 null]
+2029 0 obj <<
+/D [2024 0 R /XYZ 85.0394 422.6188 null]
>> endobj
-558 0 obj <<
-/D [1606 0 R /XYZ 56.6929 293.2416 null]
+2030 0 obj <<
+/D [2024 0 R /XYZ 85.0394 410.6637 null]
>> endobj
-1612 0 obj <<
-/D [1606 0 R /XYZ 56.6929 268.121 null]
+686 0 obj <<
+/D [2024 0 R /XYZ 85.0394 197.6003 null]
>> endobj
-1613 0 obj <<
-/D [1606 0 R /XYZ 56.6929 268.121 null]
+2031 0 obj <<
+/D [2024 0 R /XYZ 85.0394 172.4796 null]
>> endobj
-1614 0 obj <<
-/D [1606 0 R /XYZ 56.6929 256.1658 null]
+2032 0 obj <<
+/D [2024 0 R /XYZ 85.0394 172.4796 null]
>> endobj
-1605 0 obj <<
-/Font << /F37 802 0 R /F21 714 0 R /F22 737 0 R /F39 899 0 R >>
+2033 0 obj <<
+/D [2024 0 R /XYZ 85.0394 160.5245 null]
+>> endobj
+2023 0 obj <<
+/Font << /F37 1018 0 R /F21 930 0 R /F22 953 0 R /F39 1151 0 R >>
/ProcSet [ /PDF /Text ]
>> endobj
-1617 0 obj <<
-/Length 3227
+2037 0 obj <<
+/Length 3512
/Filter /FlateDecode
>>
stream
-xÚÍ[Ýoã6Ï_áGW³üþÀØf³½hv7v8´}Ple#¬-§–tÿû›)‰JdËÙ8AàI9äÌü8_”ـ ¬"T890NE™Ì–'tðÞý|ÂBŸqÕi÷úizòãaŽ8Íõ`zѲ„ZËÓùïÃÓÿ¼û4=»¹¢CMFc¥éð§ó‹÷¾ÅùËéÇ‹ç?ÿvùndäpzþñÂ7_ž}8»<»8=³ÆˈB;™â 0r2=?Œþœþrr6­ˆ™dTàêÿ:ùýO:˜¯¿œP"œUƒ{x „9ÇË©QRˆªeq29ù\ŒÞ–C»„&¥Yq3kN„Ö|÷´~
-
-Ó†[¡ˆÕJ=˜uì(È´ 8aB‰Z œEZp $¥ÙÀ(G´à¢ÔÂçmºþ6Y;~H²Šñh³ "¢ewìµ]˜¦™²a–ûëê6ͳü >Ðá_HÕ·@;Ý îäðcžúæÙj¹\…¡ž^RÀ3,
-5ˆ5÷<(H)Õ@2¬›=dÅétqèf)ïAÄhmtMGJ ³eºÚnúö9 ·ñcöI-ZÑóX|(5~<©QK8W=B–1]ŠàçÅ6ýnf7wr4FÈádò­øÜ/»óO8Ew1 0ÏÃ6)|Ã5ÒMÃC–ß­¾¦ó=òmÖþVÅ«A„\;»_¾Ú9b•–ä«Ÿ,_}TùÆ‹?®€·ëµ•D0izl q”‰‡
-Üp 4÷J5Zñ›…­ׯ\YÐF'5{Ûƒ¥ª(ÕhÅoVªšIeOü£µ ÎQW
-é¿#ÆØ0Y¼ÛlÒåíêýÅdrvêev—,²yäþOd¯£%¾Ù-ª”®ÇÑkÅ!xV¶%Æ_Ÿ'Aˆñfi:ß+ÁhuÇ’ Ä,ŽQù’~„Ø%Aé°}^Iboª[¼H¿<EˆFº–MˆB±=O¿@ë]ê[³"éeÔ d=îŠq{1÷<i½ „'ÊŠ>¯Å4a†Š–3®û@ÜkJ£ÅÍPC”ÓO2ÏÕn**‰³¦Ï
-@/ΔwQŸ×ß.1ØŸNóü€\Òû"Èó†üum’«2mÂL-÷cÙiµÍ硤RáÒƒÂßþA½ 
-c3Ööøi¾Á⨰bXܬ¶‹9ÞKOÚü&¿ ¡tNC‡¤è”/l½ÆïtÉ‚KˆÙ på`$;‚|ÅqL²K¾·€1lf.}É?º6²$¶Ž(Á™HfÀfXÕ@‘,Ó$–ð³BwXðoµåÊø¨Új‹ÁÀb{ÛÀâËÚÀâkˆË’…o÷çÀ®Ãõæx¬‹éc]pg1`ËKRf_îp .jŠã˜d‡Q¡Œ®e3ó.¿
-HÑ6ösð4ïWË$Ë=ñ2
-ȲÂ÷;Ö͉¼ÜØp“ÜÞ.²îò~¨±âÖZ5[¬ÃpH^8;ÄJC(Wqä­ÌNXEúz^V §šõÁŠ3¢”±¯ «Gmhµ?ÕÔ…ºm>‚ÂÆæû,˜#À ;ÕðÂNY P ߾UxEz;¼^À‚s'!U¡®^-zMx.0Ë=Ülzg8d¾[)1·Çr%/¡Ë £Êô)ØÒ.|=ùJJù)Ëçß±çË/¯ýõ* OMhVìQY$‹·¬2ˆ¹™¢ªOeF`Ä^u­òü™*›‰t¶y‚Ö¼8ô[×$ÜÌ©¾˜kLùk+­Wa§A-u“˜fÅM•¹tÄn;UÉâX*«> ~ö§Ä‘Ê8'ºõ:,éˆåúUã¡w3L'¿c«)!Ë­¦„&%‘r§as–ÏVËúiV+Ü?קöŦûƒ‚£3YQ#6ôa:<Wí>LgÂÇQUÈ/Ê Ú»C&¦4qN˦TÕ]áZTâ鮿0ëÏ/úb/ü˜Ÿp%E»€R¦ó{@¡åy|QP3«i½vˆA„¨™x}P÷ú¼Æ©&Âi ¶¶C€Àҕꯙ4܃µ+Ž¯âi|ü×·x㟷åunÖÂÝ~ܶiý1M7n!ßÒ¢–Ò±qâX¸}ä”iÈœ”ìKN™±„:õªÆx’æó³õº¸gþ{¨Ö…e­OY× ±­Hñ›/¼ƒ|u]~^‡Yª¶´ÊRáU“¥Ù|fÕ™˜–ß^ufú˜¬qWÕ¾'Ý|€i“LURkj0>në jˆÐ¬äñïm‡ šÖª°{©þXùíKXVØËÚZ݇P% ³êUóÛËtv÷T„r*ÂßÜšÿˆa›Û,-?±Å—- âg‡!(ÇÏÛyžÒ†zR}`ÂÀ|C8PçáØÙ_‚åOCo´¯ž@]‚7hºýljóö”Þ2^…ÿ\%¡´~~úë§ÝVKõKp(É—=%˜X÷Ç2¢‡è¾DŸiG„Œ¬) Å±½Gº|”q°áð
+xÚÍ\[oÛ8~ϯðÛ*Ø5Ë;EìbN.³ì&mâY`13Š­4Bmɵì¤ý÷{ŽHI´#[ÎØ-‚j‰"Éï|<’6 ð(M´åv`¬$Š25ÏNèà|ûù„ù:úÒ0¬õÓèäÝ¥0K¬æz0zdÅ„Æ1Œ&¿EšHr
+hôÓÕõ¹=rE£»Ñ©‘Ñ{ügtu7º:»;Zóèì_ï?Œ.n]-4t%¾ùÙÍõåÕÏ¿Þz7×®øöâòâöâúìâôÑ/'£fá$8ú/'¿ýA˜ë/'”«Á3¼P¬åƒÙ‰T‚()D]2=¹;ùØ ¾VM»@“2¬
+E g¶ç?Y9K–ãG ¥U&º=_Íoû!m[qÃ<Ëy‘—)²Ól²s( F©ûêpí®ÎÿöRÀ_Jìúñ<sê. §£1Ê,J&ߨDBEI>ywÊ"\`XaùèknÈ®Ê6¥Í‹ÅÒ=MŠt£^õŸXA먞6<>?&¾ð9)ÝCúužŽ—nÊ*ŽunÚðÍw‚2V¥º¯¾™H ÷^,º:¯¤[MÒß)åy:ÁWÝsÅ8U§±PÛƆ^À)¬êü¥Z90‡‰r•Šù2+râ–‰4FYéúš%¾³jÄð›äîC–O²q2¬†=d”K©\×
+uk­xp¿‰û'ã
+xœYYäYþÉWX.ÓÙ|¹}=†L?lñ|O»¦ 'BÙ»¦"VjÖè”wX¬òq<ê_‰£S‹«-ŽêshWäÞþ"ñÛõZS"©=¸jA¬¥ÎÎý;™Õ E×[=÷"ëZ t“tš~JƯÃ2åq±dÇÄ%)-ïÁRqBÁ¤UÈܦKôž˜wà0>öƒù±u¸¼å"«™9OÅb¶Ê`o˜–Âm˜òn$%…ðœê–÷÷Ýƹ³ÛÔ«}²òD]uxS,k[äK8NwÀÛüXèBŒkõ;R·ØŠ.8Íã>cÊá+ÙÂ{WŒ?ï(^¡  GÑ»¹ßbžzçDÛà‘b 1þœ.!n_(£›<uÅãb6+|S'/ïÖåÚ0^aVDå
+fùZ@ê¾e¥û’¸× ‚+G·ŠšQ•óôÙ½»¡ºB$LGUÓÇSgšÍ²exoÿ‹AÈ´1åx‘Í—–ì W ¹ÃÈð=W¯ŠcH/DSQ–®¬mù5:U*Êfi±Z¾Ê.]›¸…#z»D AdÜã@T ]PéÈÏÓUz™B ý$172º»ûVîáF®>` D¯Ê!«m"àó9”[›É,*>ïr,áàß®cQ†«û˜ BZ½°~5Âú¸·cÃ
+ê1Ì>ýúbö³l:ÍÊt  ÷s•Ñ¥;L¦­c²–h*͆cJ>#Ó´;ßÄ_ò”æ™÷VPðìëÜ.K'A¡Úèíd„>µÔ$ø—‡“±–8 Ev‘Aä(ahM5!í4uªn'ã¤ïýä)À
+Tr°`š”Kp¬FglØ4¯Î™D,¢ò±XM'ø,<(sk|îC ¨œú
+IÙ‰¯$¼u;]øÂ, W‰§Øh™Ç×K†"»ð…5¦ahMµÊ•üµk!Ó›ˆ| 4K˜áîB2K“ÜÛWf$šq¾±ÅïÜãƾ‚÷Çòqk_±ÐÛW,_·¯ø±±¯øâ²dêÊÝ BìnaàïSºèÐÅæ劺àÁf`]Œ˜_îÕ‰ÃPäK]pHÀô4•¶9u?øìšMëÆc[*¦¦-m.ÔÞë½Tm Ä_èO5jÔÄÀµKH‹ éÀ´È„Wñ^\Éã&†é @6‚u« ¾/(Àkq¥š{ŒŒÈS¼bB£;–…ùçÕ»«ϪÊe6ö›~gE-ÓEÙ¡<ภë³~×yqøPâð}\‹«Þ’öümí^¾ÎÓ…È]~›§ÕU%ÊëÊéˆM,þèÚñþzþAv]ౘñ°ÀµAÅw¸ÕŒž­+¢V VXÕŠÕ¯«·‰KÙ¡0ñúÒuÛ@ÖmL *î¶.Ô.*ë×HÕ{Iý5ϾvI¦è8„ë 98šób–d¹^åßÝ!”eÄĵW¼<®®u¤Eâd#ƒžüñ²ë Ow«|^-Ël’º—6mæ1o^«‹ŠfÅd5­‚ q¸®Ro®tíTôPL§Å³¿ˆ¥ýE5V¶æMÑœª&,üG×40 qÛè.:Äpˆ¿µ¬­è?»#W
+ë;™ßN[>nœ¬gá±{:}¹Óƨ% þ`FÅ÷sbjÄë|Aw«zôˆÍœ†œsÜ|h½µ°k^Ø%pˆd!ˆtæüÛ쾘b¬iytÀ¸ðÁê—Ìbë¶ÃÆ ŠµÛ–‡o·P0ð0ÞöÐg}EÖP
+¡Þ¡ü@Rm9žX'Öúµ-A­ß0¢í…(,lïj[òäÂJ ¹°Ræ%Tä¯o•\ÖŽE®£LäÒ0w%{¸¥5aÒ߈üAä:›bv»¿É›”Ød²C%í\åD¾ƒ?e
+·cÛ£éVìs¯¤’Ÿ²|ò'Ö{øw÷™?nj#²r‡Â(Ž«±ã®!›¦Gc’.èuûgEž¨±1ˆHÇËW(-@ã-+k¢ã¸'Vc°qócÝ**­Wag^-MÚ’–˜ fåc¯tm[U`q,•ízy«2ˆpâà"P·Â €ùÛ¿?HaïǘAþ‰u¦„¬Ö™"J*!Õ2Ãâ,³æmÜhÛ½7çôå²û
+Ì™¬‚§S¹àÞërœ3áâ§:T‚U¨åÝ¡SšX«e»;Õ½!õ¨wº·\@OÖÊþ˜ /ô®äF~_eðÛÝRå0ò}W>ƒ ·ÊôX ˜©üÖÊç^._5ÕÂ-± nì¯2AU¡cyõç—LVršuþ5iòKãB~ü­(‹!eñ)[ýn¡,ío»›²xW ¹9ÓMYÎÌ!þN” ØpàŸ`@ï†kt›–(.;ÿüžz}ê¾ìßþï¤!€Op†¶¾÷«`ÅÃ3 eU§áŒ¾8‹ÁýD<óÕ‚±ÿóÿ
endobj
-1616 0 obj <<
+2036 0 obj <<
/Type /Page
-/Contents 1617 0 R
-/Resources 1615 0 R
+/Contents 2037 0 R
+/Resources 2035 0 R
/MediaBox [0 0 595.2756 841.8898]
-/Parent 1603 0 R
+/Parent 2022 0 R
>> endobj
-1618 0 obj <<
-/D [1616 0 R /XYZ 85.0394 794.5015 null]
+2038 0 obj <<
+/D [2036 0 R /XYZ 56.6929 794.5015 null]
>> endobj
-562 0 obj <<
-/D [1616 0 R /XYZ 85.0394 459.6946 null]
+690 0 obj <<
+/D [2036 0 R /XYZ 56.6929 328.1878 null]
>> endobj
-1619 0 obj <<
-/D [1616 0 R /XYZ 85.0394 434.574 null]
+2039 0 obj <<
+/D [2036 0 R /XYZ 56.6929 303.0671 null]
>> endobj
-1620 0 obj <<
-/D [1616 0 R /XYZ 85.0394 378.1456 null]
+2040 0 obj <<
+/D [2036 0 R /XYZ 56.6929 246.6387 null]
>> endobj
-1621 0 obj <<
-/D [1616 0 R /XYZ 85.0394 366.1904 null]
+2041 0 obj <<
+/D [2036 0 R /XYZ 56.6929 234.6836 null]
>> endobj
-1615 0 obj <<
-/Font << /F37 802 0 R /F21 714 0 R /F22 737 0 R /F11 1397 0 R /F39 899 0 R >>
+2035 0 obj <<
+/Font << /F37 1018 0 R /F21 930 0 R /F22 953 0 R /F11 1442 0 R /F39 1151 0 R >>
/ProcSet [ /PDF /Text ]
>> endobj
-1624 0 obj <<
-/Length 951
+2044 0 obj <<
+/Length 1362
/Filter /FlateDecode
>>
stream
-xÚ­V]oÛ6}÷¯Ð£ L,¿E>¦™ÝºÀ’ÆÖ€]d‰i8–kÊ5öï{)Q
-íÈΊ ’:¼çÞÃÃaø#‘Hjª£Ts$0Qñ<ÁÑ7øöaB<&éAIˆzŸMÞÍYi¤%•QöÄR+E¢¬üKÄÑ"àøýâîw=M¨Àñ*›¦<¾q?Ùb•-nWÓDkEãÛ7Ÿ³Ù²CÉ`b7â§ßÞßÍþ\ú
-
-Œ1ËÚø<«ˆó²Þùœ·úU½íÚõc›é0Næ\øèõ>é\ ›ÁZëSWó}Ym¿%)Îú3$·cÕ‚´Z’ëÅR8ô°:;‹Êª¼ì6h`ÌÓ7Ü ®¸­Gµn»ùkþÊg
-T"T]gíA#¬'–Ä`INNYßr¸5‚cÏu¯{R#¡Hú+'î¯*sN[œ\‚ÁÍ·øìoÀ[-{a¡ÿƘ²Ûä…A—ž‹L ÷ÆÑGý)ùŸŸ’/kO¥èøJÑT!® ˆOª=-ÕkGú7çëÔ6&ÉÁendstream
+xÚ½XmoÛ6þî_¡60±|§ ÒÔn] y±]`C׊Ì$Âɵäý÷;Š”,Ù²³,à "¥ç^x÷Ü`ø!A$fšJs$0Aò4ÀÁ|û8 Ö °z¿¼›0h¤%•Áâ¾¥+B8ŠH°X~^~º¸YŒg£
+<”h
+‰‡ï§WÜí—×W“éǯ³‹‘âÃÅôúʽž'ãÙøêr<
+µŽ(Èó–/;_X!/9_L/ç£ï‹Ïƒñ¢9@û3ëýÁ·ï8XÂY?0b:Á6­ið4à‚!Á«ß¬óÁm£°õµí Ç*X
+Œ8!§­: ¬ú%eH[?»FCÂâBÙ<pŽ°Æû<€ú}g(bLJh$eU"~µQy7¡m¤BŠG
+´[Àâ›±Ãt´Q¸ä̃~;¥%ò€¹É–ãÍÆÃh 1Sšj³ óM1
+™bÃ4³O>,òä/Sºwèr«|m6q™æYù—.S/˜äÛ¬4'äN­ ­`*$i!he³XçÙ²p¬)óž“p8+­rQ¥ÿ”B:EµÆ¼Ušß÷)UˆIRǧ¢~RÈnR¡C
+sà°’’íÔ¿NŒGˆAÂJ HŠ×¨¬%N3GˆÒ
+z%úÿ$èÌ$ϯ%(ÅŽ Ó† öãZbÒgã>vxJ5÷<uòÉj»4~göÚ{ˆ
+<>)_
+jgaåeú'Æ@“®OßýtŽ3÷œ^~¹q«ÆU·}2E?˜3 ݧþmlÚtßf_êÛVFauзÿTí‘1m4¤
+aÕí÷G}Ÿa‰"ªU`û”%^SNÖ3IB{T»°ó 1
+ Æ0ó§5äü.]¥¥ÏÎ.-se{òpÌ&ò¨Åtê$B‚ÀÒ·?x]û*zÊ!$B",™„ss¤9á•à—¼°í™B%”à]Q¦‰íĔԭ°p_ËÇØãvÆÕ‰CÅÏqºŠïVÆ}„²êqÛž)ÅùžÉ •”îÏcÕÅS«"÷®n×ë|SÕÇI£Ç9£¯0ª½Q€â1ßeSU›NÐYÔ-ôø.¯Z‡H6&¶m0‚‡ŸšU5ÙÞ@?Ã@z[úɆ|îÓP©­Ò`W˼QàÅ×k{¡4«á¦8pèð2…p¹°ˆ¸àý7F
+Û¨ÓEРª=Ù-g¿ÌíïCÛD€
+¡´d\w¹¹‹7Ë4{èsRœÕc9.úNKÔ’¼êÒãiš.OsŽiŒ½À¹ê çjTŹ‹ß'Çl#Ð÷%æçÍ6¨»¶Aeœ¨®a?Ø—­/Ǻ“ÆmZu˃2õc:Kò'›¥jw»5›´î\€§ƒ‰5"„¿TÀ-Ô™`Ö¨*˜ÓÛ£Pbè~XÊóFTÕN(á+‹”îšýoC93?¶¦(ÿa,¹Òpç‘â|,Û¨Ó±lPU,¯×eqLL ’€{ÊY³ ªÇn'š–Àö®á¢Ù ‘Vÿ³Û3ýnQõš– ëÉeÍ&™Ø„Sk…þXß–{rmïÁ›Â‹¬Wqr|Ÿ­Ó—Sû—~O„qP·Ë7ÿCaÿ/û×bÑþT1(Æ4©²1"„º× 5U=¾ÿ 16.Éendstream
endobj
-1623 0 obj <<
+2043 0 obj <<
/Type /Page
-/Contents 1624 0 R
-/Resources 1622 0 R
+/Contents 2044 0 R
+/Resources 2042 0 R
/MediaBox [0 0 595.2756 841.8898]
-/Parent 1603 0 R
+/Parent 2022 0 R
>> endobj
-1625 0 obj <<
-/D [1623 0 R /XYZ 56.6929 794.5015 null]
+2045 0 obj <<
+/D [2043 0 R /XYZ 85.0394 794.5015 null]
>> endobj
-566 0 obj <<
-/D [1623 0 R /XYZ 56.6929 769.5949 null]
+694 0 obj <<
+/D [2043 0 R /XYZ 85.0394 665.5626 null]
>> endobj
-1629 0 obj <<
-/D [1623 0 R /XYZ 56.6929 749.9737 null]
+2049 0 obj <<
+/D [2043 0 R /XYZ 85.0394 637.9713 null]
>> endobj
-1622 0 obj <<
-/Font << /F37 802 0 R /F21 714 0 R /F67 1628 0 R /F22 737 0 R /F39 899 0 R >>
+2042 0 obj <<
+/Font << /F37 1018 0 R /F11 1442 0 R /F21 930 0 R /F22 953 0 R /F67 2048 0 R /F39 1151 0 R >>
/ProcSet [ /PDF /Text ]
>> endobj
-1632 0 obj <<
-/Length 1321
+2052 0 obj <<
+/Length 69
/Filter /FlateDecode
>>
stream
-xÚ•WÝoÛ6Ï_aäÉ*Z$EJZžÚtÝ2ðfOëh™¶…È¢¦¦ÙÐÿ}<)[±à.0 Çßï‹]ÄöG™ 1Ï“Eš'DÄT,ŠÃU¼ØÙµŸ®¨—I'"áÜNfV#Á3"2–.¢SwW«Œ.XL¤dbñ°uÉ4%”³lñ°ùsy·WM¯Û›ˆ‰x™Þüõð nKHš¥¶ÅVEJDÎr·áÝý¯ïQ:Çá“.†¶ìŸqvgê®ÜèVõ¥¥F<šžHæñ¤ BrgM¹‰hÇË·E¡»nDé[SáäcÙõ‰-r’K&=§„3)RØϹÄý74[0Ã’bù9ñÛ»).*'ªýd³ÁiÀ:¨¾Ø#YQú½ê‘ùl$
-U#Ñi¿44(¬ê 2ê²x¬ÕÁ«ÚšÖC?œÚ0tÎ '¤”äB0w²ýyô‚ˆ9eVDTU™§¨6}¹}žq™$IÒÔ ¿™KH&äìïA·³X†”½*2õ Z–‰ü;p£
-CÅó“P±œ°1R;c6~ËF«¹¢$ËSêÅ! ­Ã8ë$žæ¾ýˆd*&í¬ ½ÓÒ(”x?çèurIšÛnz({—" x¾™Ÿovôú“ÎÖ&• Ædžnth£Ú¾ ÁÀô€XèʱAwÑuŒ®1Æ¥ž¦;3]—ªš† l* â.â÷æ^nkßÛÊõºÕN•u׿LS—L¢ô³í„ˀ塿ªCSé©M{ó„„+©ñˆ¦ÑmåïVÕ4„èþ€I‘г;Q¢«• W 7t”
+xÚ3T0
endobj
-1631 0 obj <<
+2051 0 obj <<
/Type /Page
-/Contents 1632 0 R
-/Resources 1630 0 R
+/Contents 2052 0 R
+/Resources 2050 0 R
/MediaBox [0 0 595.2756 841.8898]
-/Parent 1603 0 R
+/Parent 2022 0 R
>> endobj
-1633 0 obj <<
-/D [1631 0 R /XYZ 85.0394 794.5015 null]
+2053 0 obj <<
+/D [2051 0 R /XYZ 56.6929 794.5015 null]
>> endobj
-570 0 obj <<
-/D [1631 0 R /XYZ 85.0394 769.5949 null]
+2050 0 obj <<
+/ProcSet [ /PDF ]
>> endobj
-1634 0 obj <<
-/D [1631 0 R /XYZ 85.0394 573.0962 null]
+2056 0 obj <<
+/Length 1238
+/Filter /FlateDecode
+>>
+stream
+xÚ•WKÛ6¾ï¯0öä"š¤ÞÝS²iÚ-‚¢h¶§¦®L[ÂÊ¢*QÙ8Eþ{9R¶lÁ­aR3ß¼‡[Póc‹,&4Ì£EšG$¦,^»ºØšg?Ý0ÇÅ!‰£04›™§Af$ÎxºŽAÞ=ݬ>p¶à”$ O›QW’¦Äe‹§õŸË‡R´Zvwé2½ûëé‹Hš¥ ĨQ‘šç¹x÷øë{äÎqù$‹¡«ôwªé«µì„® 5ⱈ„QÂ^b,I^JØ]À(¥Ë·E!û~„Ѫqó±êµ‡â‹œä ORhÜ£<²H^> ”¿cÙ0à
+Ñ ÑK÷hh‘Y4k<hªâ¥;§j£:G z8¶aè%ø 2Fò8fÖêzˆ‚a !ã†XD]«× QºÚìgB'$ŠÒÔ1¿™‹H'°¿ÙÍbÅ&§üz¨@53h)%<‹óÿ€¯ƒÚë«y@FÂŒ%WÙ7âÍÛ˜%$äqô?!ŸkQ¼”ª–3H‘aäìº<ØŠ"hÍÔ4¹« n9t'š~cúø\U“ˆ%U¶¥¤.âùÇË N…?úªÙÎÄt¥é¤¬Ž¶5„V¸–â‹Dê3¥¼±%aËÂÄ‘-­gê >¥Ë×ÒIÛα:ü @Ž;¨^v FÖ‘$\¾VºTƒv0õ Í0Û'݃1‚fß®¡Œu`íw@ÖÒ ÀEª¶)×ý@ª ®¿áz44dOFíG!}„‘‡ËªÇU`ªÂü(UÜð™Ú*µv"k)æjˆ‘,O™c‡D
+—˜´¶P‡Ý³ìNsǦ¹óVøÔÙå+±?ôésßg©Z|—=*ÿxÂGȬQgÇüìÝêØJoúE“Nß~®
+endobj
+2055 0 obj <<
+/Type /Page
+/Contents 2056 0 R
+/Resources 2054 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 2022 0 R
>> endobj
-574 0 obj <<
-/D [1631 0 R /XYZ 85.0394 573.0962 null]
+2057 0 obj <<
+/D [2055 0 R /XYZ 85.0394 794.5015 null]
>> endobj
-1635 0 obj <<
-/D [1631 0 R /XYZ 85.0394 542.127 null]
+698 0 obj <<
+/D [2055 0 R /XYZ 85.0394 769.5949 null]
>> endobj
-1630 0 obj <<
-/Font << /F21 714 0 R /F22 737 0 R /F39 899 0 R /F41 939 0 R >>
+2058 0 obj <<
+/D [2055 0 R /XYZ 85.0394 574.0823 null]
+>> endobj
+702 0 obj <<
+/D [2055 0 R /XYZ 85.0394 574.0823 null]
+>> endobj
+2059 0 obj <<
+/D [2055 0 R /XYZ 85.0394 543.8373 null]
+>> endobj
+2054 0 obj <<
+/Font << /F21 930 0 R /F22 953 0 R /F39 1151 0 R /F41 1208 0 R >>
/ProcSet [ /PDF /Text ]
>> endobj
-1638 0 obj <<
-/Length 3450
-/Filter /FlateDecode
->>
-stream
-xÚ¥ZëoãFÿž¿ÂßÎbYóÐcŠÃé>®é»½]wEÛ²¬Äº•%W’“ºý‘CÎX²•fb±Ñˆq8>~¤,f!ü³(b#Í,1:ˆBÍòÝU8{„gÿ¼<gá&-†³¾]]-ß«dfËx¶zðJƒ0MÅlµùyž2¸þuõýò}"seDR{œóæ»O?®hÖˆ£N-RÉÓn?¼âR Ís>¿[Ýß½`%¥Uì—¼ýqõîÓõBF!Èx { çßÞÁ
-–bèòùÝ›ûOw«ŸèîÍÇŸïÞ¾ût{èùêîp«w+¯©¡6E¨PM¿]ýük8Û€R¿¿
-eÒhö 7a Œ‘³Ý•ŽTi¥¥ºú|õoÏpðÔ¾:y:" Ärâx¤œ:žÈ±å£Þ7-mn‘Î º+뇦Ýe}ÙÔDp×móLƒ¾¡ë¡ãWnßüÐí-Ǧ/òžÇæÀ«uEûT´¨ÇG`6ý¶àÓ3Ù•A’wz·÷ŸßÀáEÑœ­f´Q© ÏÍ6Oe×´GbŸõßÐbhC ƒN“Ì`&"J"ûêßÏÏ7ÖÖ"™%Z:Ñ =ý2s£Îƽ°¾aF×¿à‹«?ôûo–Kød‡./Ú>hÚG/÷‡õ’IK·»åí 0âpFd‚0ÔÁ¦îÎÅ×
-Œ, åHþ× T&MÓió\xŽ¯lLÔjÆÜ4—F"Í…†Ï,ÞϺ\ut¬—ÜpٰɈ™ÐÒà8ÖÀw`ó)p‡—D»èu½aοm›†í8«7ŠþPn&L0œ-$ƒ!CúˆÞ“FóûwÿÅQÌСõ=/{¢–ÍÛ7]W®«‚¨ÖŸ€Ú^§óCM4U@-™w6á6R$žyB¾%‡œ’YÅAd7¹¨ŸJš^§5~ £ðЕõ# æ|Uµ.Â8Hµî¹U¾ ÿÅÔºi ãÐðô‡Ccر“í¢ë#¾„'dJ >*E”_º}‘—G+“Ò‰• éü)5­6²ÄDBúà°è'"öN–eÝì)"w[‡›ÆIÊoÖÙnZÑa`ŒÏD{âPÎW[<|dg5­·-ª=ÊÇÒ'Þ\wìúbG»"?´e¤»õ‘fì«,÷J!k±œXþŒt
-¾€(‰Ó©ô[îÀÈ×Íï8äý¼-ó-˪¢QUîÊþ¹í`“í²G7nj—RØyF€qâÈ·Ï]Ù‹Е†1ù¶n`!|QÛäóp@I´˜?Yð9L‡äð€ä{pe1ï(»Á}ó@3Ø«€bEÒnS@ÈÖee•l© ]½G—ÙdÅÎ1ΘMÆ÷‡zß–OeU<’eØÝ 4b ÃL˜¯„ˆ¤@l¾š©¡ùb2‰œ?YŽ—6¨I{/@_3T"œÿçÚHºÃãcÑñéÒVkò}<ÆÎÅBÆÃ9dÐ:Ë)ܬÎ3˜2‰ ߈t<¦|H2‘õ Î>à`|”Jã±ñ|W8QÂØ3Æ«õ7¸¿g»}ÅÁw6ÎãMUÖLÆ“·”&ãgì[À¶d>ÙÔ¾
-ñªÅ€!(Ÿm/Ò6rG]ãrÏMû…(f÷E[éYY;IhBÖöe~¨2–tC\Ê[(S0Bù °ïÜL„,f’zbÁÙ
-â(:Kè/Y1à©4MÌ d¡%'«
-Êi”•pTh 8²Ö ³èipà”šq"¼P˜}k›ñ¨¬óê°)858Žý–ój:È«¸b7^’ʦw=Ïyvîö2rdö7ŒªÆ
-
-Òeì".†Å HkuRÚ¾Ü,HSîqŸ¹,Ï›CÍãÁ•Ü`H]àpÄhq–­îkÞ&
-PÑ’nhhÃB–㾄hY?8¨‰‚AƒøF8ùëɈ#`Nâó 4" FEãÊê…S‰dô*>VP‰ù‚ ë³~(yÝ´ßÁ#Úð°Ó(>ËEÛŒÂJ˜`_·Y[ZƒK³ØHŒOÈÂS´Ûg¢8O@`dÒùwÍs1hY¤ Dñ}QoÏÀ| ùRßä@
-„Wª¥1û •Nt.@ÝeGšÍzL-ºACáò*g̽7Ÿú±;÷‚q±)D¸Œ»ÜOË?Š¶™‚*HŒo´M…°LYµà+ÐÎCL!Féט©!³ªy|¡“#Ãä„\\õ=Œ5á=æYô9Áƒ¾ÜM¹iªÐM¥¯Á&
-D§D¸¦ÀýÎracñ¿çböÏ
-ã¯q)ã*!7ð`½iþ TRžÚjÀ‰ä ‡.ˆz_+ Ü–òmV?Žn#¨¥C|,ºŽK&Û\â®Ù”8)wmHÔœfçú APa¢ôy¦hÿ´Â€ëCy¾mž§NGÉÀÈX]ì‡ 3×½OúÓ?ÁYg°Ÿ¥“è‘‚ŠóàrÃ]ŽAƒ•3츓:(½)p -s åÔ¶öóÛ²§Jhª;­@kÚÈè«ÚÓ4a
-ØA{à–
-ˤ2¥=5½IÚÁQa…(lÚñ°ò‡5¬f/bA|†P¶|†±€¹wtk‘=HÉìE¨î±Ú·“N%¿%£õƒýÝP3¡d©*ÔPØÁº`àBæQJ=8[_KHjèS j¼B·S *‡yÏtÓ]ÏBå}Á3÷¶@ÏèèÞv¡Ã–™[U
-­ùt%ú²b7†8LûM¬oûw6ø¹ØÁ/l—Ûr"å­nÖÌ=oû¾yl³ýÖõðqv
-wf Éݯ‰.Eÿ?€ž¦ùendstream
+2062 0 obj <<
+/Length 3283
+/Filter /FlateDecode
+>>
+stream
+xÚ¥ZëoÛFÿî¿Bߎ,Šû ¹,¸‰su¯Hz‰»¢íZ¤-^(RáÃŽú×ßÌÎ,EJt b.g‡³¯yüfVbÀ?±#?Jd²ˆí‡›ÝE°x„¾^æY9¦Õ˜ëûÛ‹õ;/?‰d´¸}É2~`ŒXÜf¿z±/ýåï·?®ßÅbÄ+?”
+Ä#Ï›>~øpK\‰ÚøZÉlWïßÎIŠ|©„fžO×·w7ogD “Ò*†¼úùöúãr%Ã
+°+!ü$ ¥]Wz_æ™?ô?ÒØžwuCǹ«I$½ÕCÝìÒÎÎ î¹­Ÿ©ÑÕôì[þäêÍOí´‹&Ywù¦#¡îy4Þ!ÐœKG`1¸C¤¯Éè´”~l§¯WwŸÞ€º†¡Çv29Zû& ó¦ÙSÑÖÍħÝwô…[ÍJE q»ÍIì§?ÕèHûZ‹xƒ’éÌÌj õ~^¸Ö¿ŽÚè>X¿°Ê¨ÇãŸÉÅѺýwë5üõÓ¾ÝäMç×Í#´×ûþ~ͤµ[Ýú꧘màÙ$~h?«ÚÓékfr2ÿ×LRú‰1fÞ WƒÄWFë‹0™.0«Ïg
+?HÎvøÄÆ®óQ'Çz. ‡ý«ŒXí+ ®Âj
+¶ëÃTâi¸À%· ä÷õWl²‹~Þ›-7‹²¤VYìŠîè¹m#Kwé£kו )l<“@]86µ[ç®h_XWU á‡ÚŸ‡g¢…÷§]?Ä0a@Í l}@‘!lRtƒwŒàÈÁV;%í„ô¾(í&[jMÏÁ"ÇÃdi¾s‚S“ò{_í›â©(óGÒŒÓ@ â=Aƒ™Q_ IÅ¡SßžXB5V_ &¡³'+ñ\'êÁ
+ÐÖ|D÷Ÿe"hûÇǼåÓ¥¥VdûxŒ­ó…ŒÆ+sÈ qš“;®v0ï<dB¼fâ<ælHø2–çŽÎÞggr”2ÑTy~È‚(‘x„õ»|æ_ÓݾäNÐÅõóøR“ñä-¥N¹m Ä,'[—‚phõ ëJÂÄ/áåŒ@­ü@NÞú)mÖ/ù8\ibÇ
+Ö¬Tä ks+b]žuj¡1êÔ©a „H©“çѾÁíÅŽYÎ?²–È@26Óf‚Íø»ÉI®û¶Y—õ&-×í}QñÚÁ“hö ò˜ÐÑól“Äàê)d«ØW&Œ†LMpì¿užm3× 98Î
+ñªÆ€"¨!Úž…m”Ž{Ã=×Íg¢°›Ýç ¦ØWTn&Ä6]±éË”gšœ˜tJ# z¨al;—3.Kš˜„ØCpú£ü( õT^ÒbÀSÆÄÉÈe¡&dz
+Ši•°Uå¨ Ø²Ú3ï¨ÑsHM9žm˜ýj›r«¨6eŸåšs‡nËqÕŒâ*ŽØN‡$ƒ²á]{ï\hWîÖ2A2(ìoèU“
+´ÝÆ€tŸ¶”)òí‰vi”òn~&Bše„O[þˆ.å8µ·­)erƒ_ [bH9f£»dëâI–ÅÀª©N÷ÂÐ3+¥ˆ…6ÖQÕ@†•.N²ý%Åï¯D·•Öмxû:NÖ²7«+>êÙüÔ˜Á‹ýÁåcÃé‚qr±É»¼ÛÖOƒi r×™`æÆçÇ9Zî¶&×1= ñáX#Wd-“lå˜Ai±}÷w7ÄòÉæ3a3L+OÛÂ&1!]ÀXVaÁzWe[óŽ×Ý0ÕÔ‰x˜L>¦SœN:çaìþR Ö*¼x2*Q¾”,|ådVûL^ÃØ"’­–Ð MÓ‚Õrì G[¦OÌ:Ü
+`µŠAV£@ßò¯¤["@ó™R;NÀFR—‚/´{ϦÄqJ»r±fNñ7TÐ&7#C0Z,ksú ä´ëðl3ê¼gj;d‚¡3óPTC34s& »êKjøN W+z¼Fꢋ–Q¼þÞ
+B¼T<±lR\¼^'°N§†
endobj
-1637 0 obj <<
+2061 0 obj <<
/Type /Page
-/Contents 1638 0 R
-/Resources 1636 0 R
+/Contents 2062 0 R
+/Resources 2060 0 R
/MediaBox [0 0 595.2756 841.8898]
-/Parent 1603 0 R
-/Annots [ 1643 0 R ]
+/Parent 2071 0 R
+/Annots [ 2067 0 R ]
>> endobj
-1643 0 obj <<
+2067 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[0 1 1]
-/Rect [63.4454 738.9144 452.088 749.0762]
+/Rect [63.4454 707.8911 452.088 718.0529]
/Subtype/Link/A<</Type/Action/S/URI/URI(ftp://ftp.auscert.org.au/pub/auscert/advisory/AL-1999.004.dns_dos)>>
>> endobj
-1639 0 obj <<
-/D [1637 0 R /XYZ 56.6929 794.5015 null]
+2063 0 obj <<
+/D [2061 0 R /XYZ 56.6929 794.5015 null]
>> endobj
-578 0 obj <<
-/D [1637 0 R /XYZ 56.6929 723.0302 null]
+706 0 obj <<
+/D [2061 0 R /XYZ 56.6929 690.9391 null]
>> endobj
-1644 0 obj <<
-/D [1637 0 R /XYZ 56.6929 689.3491 null]
+2068 0 obj <<
+/D [2061 0 R /XYZ 56.6929 656.5891 null]
>> endobj
-582 0 obj <<
-/D [1637 0 R /XYZ 56.6929 552.677 null]
+710 0 obj <<
+/D [2061 0 R /XYZ 56.6929 517.028 null]
>> endobj
-1645 0 obj <<
-/D [1637 0 R /XYZ 56.6929 525.9649 null]
+2069 0 obj <<
+/D [2061 0 R /XYZ 56.6929 489.6469 null]
>> endobj
-586 0 obj <<
-/D [1637 0 R /XYZ 56.6929 411.5673 null]
+714 0 obj <<
+/D [2061 0 R /XYZ 56.6929 373.2709 null]
>> endobj
-1646 0 obj <<
-/D [1637 0 R /XYZ 56.6929 383.9327 null]
+2070 0 obj <<
+/D [2061 0 R /XYZ 56.6929 344.9674 null]
>> endobj
-590 0 obj <<
-/D [1637 0 R /XYZ 56.6929 225.6356 null]
+718 0 obj <<
+/D [2061 0 R /XYZ 56.6929 184.6919 null]
>> endobj
-1330 0 obj <<
-/D [1637 0 R /XYZ 56.6929 193.4614 null]
+1721 0 obj <<
+/D [2061 0 R /XYZ 56.6929 151.8489 null]
>> endobj
-1636 0 obj <<
-/Font << /F37 802 0 R /F71 1642 0 R /F22 737 0 R /F39 899 0 R /F11 1397 0 R /F41 939 0 R /F21 714 0 R /F53 1029 0 R /F48 953 0 R /F62 1062 0 R /F63 1065 0 R >>
-/XObject << /Im2 1051 0 R >>
+2060 0 obj <<
+/Font << /F37 1018 0 R /F71 2066 0 R /F22 953 0 R /F39 1151 0 R /F11 1442 0 R /F41 1208 0 R /F21 930 0 R /F53 1303 0 R /F48 1228 0 R /F62 1352 0 R /F63 1355 0 R >>
+/XObject << /Im2 1341 0 R >>
/ProcSet [ /PDF /Text ]
>> endobj
-1649 0 obj <<
-/Length 533
+2074 0 obj <<
+/Length 846
/Filter /FlateDecode
>>
stream
-xÚ¥TM›0½ó+|©¸6Æ`³IÚ²RÓ4a«ÕxT‚Ó@6ÊþúšŒ“ -{ZEóÆo>Þx€"b~ Ž “!Šeˆ9¡å[‡ µ9ûîPËñ/$¿ÏºK¯ßXŒ$–Q¡ô¥—K`"Eiñ䎌æétáù'nŒ=ŸGĽKfðHx,§ã‡E’>ÿš-“Ét1òâÐMƒ<?D˜xf3Lg£ŸÉøó P§ï²=§÷Î4½
-é‹¥„u*þ:OÏFó½C0“‚££S)´uBÎ0»x*géü¾&ìžC‡†Ç™À\ñÀô‚`hz\âˆì<½¥ÞªNSä6e«0óÖu·º{r÷R;ðdUFqª³m™|ò»"kU“nžgFÖf`•5¤±°9¬
-½ÍÀkRÖ6²P•Z›D¶ö&k{|¿·ÑìSŠ%çÁY€MÂtÊ乄Úe{HeЛ®•¹YF"7Ý” 0ÙÉ£”º_ ‰)§Àßê_©WUÝbÁÊuÝšze½¶x_¶Ý
+xÚ¥UMÛ6½ëWè(KŠ¢,7k'u€n·kå$9Ðc ‘DU¤ã¸¿¾C ½ënÝSaœ>ÎÇ›!Åb
+?—‚P.óx)s"(qÝG4ÞÃÞûˆLz¥×¨·UôË;¾Œ%‘EVÄÕ·+_%¡eÉâªùœÜÿz÷X­Ÿi&h²$‹T4y»yX¡Eâ²]ß|ÚTŸP»ÿýa»Y­ŸîË<©6 -Ò¼¤%œçÁÃêÓÃÝo›{Ä|\!týÊÛ×êC´®ž ¹.–Qî«ø3úü•Æ Ôü!¢„ËRÄ'P(aRfqå‚‘s~±tÑ6úãÙáÕî|ôy‚—D”Ùò{Yv‹=!IÁ3>³÷ÎL‹”Ó"qmµ—É´`e¢•5ƒ}–Œ&' ëæ=3ì»ó5¶6}¯‡æâI9”Žc£œ¶¨ì‚÷z:Îì'5ÚZuè¨HÔ2˜œŽv!F¯Õ`=ÕPoÊ‘Bdsòæ´£È7@Õ®5ƒ7°Ä¶ûA¹#&gô…
+Zm7ïaeaÕœ©ßl}¥Y‘{|$ Ž]QÇdAòd:Ç…¬Í)Åêúšè"#’É2€ÍxÉ+KìÁ»ƒw­ ÁÍàI˜‚üÐö]ŸQ,Q‹”%=ÓÉ`ÜLL£$¼Èò³yÄ9UM8°3 `òýöë ÝÉLßQõ…Ò짶Àg4¹ëœž€Æö‡†ücÉD{Ž‚Ó ²²\ZpêGšÒÑtm}¾Å– bÉ‹×lûZaâ­nÖÍYC\Àг%‘¦ßŸÞš~†Â¤¶+.’ú`Œ fgü*€^=¢z‰BsTZÛàÆÊ¿3B9…R; › Úã®1½B+¸ÂÉFwzïgcã´]ðé­‰Nx‰™r9‡
+´¿Ì  ^’êÐZDžÔK—òK—Àî̘všør¥Ú âµÃ>èSëï_‡ÇBµ>ö±> ¤B¨à»ÄAó¯ 0p9o8w0ØΓޅ1E¨/¿CÉê釞ìeÎt
+¢F/%b^°ä¿^j.ˆ^o¼«ðyÿïWüåû–æ,³Û4§9á\²KRž/ÆÄëÔŸßûçþ7rà_endstream
endobj
-1648 0 obj <<
+2073 0 obj <<
/Type /Page
-/Contents 1649 0 R
-/Resources 1647 0 R
+/Contents 2074 0 R
+/Resources 2072 0 R
/MediaBox [0 0 595.2756 841.8898]
-/Parent 1651 0 R
+/Parent 2071 0 R
>> endobj
-1650 0 obj <<
-/D [1648 0 R /XYZ 85.0394 794.5015 null]
+2075 0 obj <<
+/D [2073 0 R /XYZ 85.0394 794.5015 null]
>> endobj
-1647 0 obj <<
-/Font << /F37 802 0 R /F22 737 0 R >>
+2072 0 obj <<
+/Font << /F37 1018 0 R /F22 953 0 R /F21 930 0 R >>
/ProcSet [ /PDF /Text ]
>> endobj
-1654 0 obj <<
+2078 0 obj <<
/Length 69
/Filter /FlateDecode
>>
stream
xÚ3T0
endobj
-1653 0 obj <<
+2077 0 obj <<
/Type /Page
-/Contents 1654 0 R
-/Resources 1652 0 R
+/Contents 2078 0 R
+/Resources 2076 0 R
/MediaBox [0 0 595.2756 841.8898]
-/Parent 1651 0 R
+/Parent 2071 0 R
>> endobj
-1655 0 obj <<
-/D [1653 0 R /XYZ 56.6929 794.5015 null]
+2079 0 obj <<
+/D [2077 0 R /XYZ 56.6929 794.5015 null]
>> endobj
-1652 0 obj <<
+2076 0 obj <<
/ProcSet [ /PDF ]
>> endobj
-1658 0 obj <<
-/Length 1964
+2082 0 obj <<
+/Length 1965
/Filter /FlateDecode
>>
stream
@@ -8191,206 +10005,210 @@ i ·¥Ý3éÀ–yíˆùðŠ&Â8K<æcø¡›‚hïCû™<»úÐŒ­êhüýÔï Æס\@•‰ó÷w= vV
ýf3GÕ51b‘æi‘diNŒ‘Œâ±ˆ±0·"ð0àâÄßZÕ7’\sÂw"ó‡&0ÍåþF—?$cRÍZº”í(õåŠ:éH^04g¢°û(½À ÙWáÓ7˜¿S,[>°úŒ¹…;î3`ô¦'bÕÀ¤Ö^ ïöEy˜]¹œ­Þv‹íçÞa¯Úák@n@þzh|ÇütÓOÓ0J¿mºã—¿ÞeÚâš(°ÁiÇEðá êÍâÀz҃ѣm§žæˆ§çOŒ$
­è×ØÚ:‰óÎÐÃBYn?z·XdÌqâd¾©Üä¤ÚNí:ørðï»QÕaáƒL·CÕMucVìâªV.Wª4 Û8Hü»Uoy)”@»Zìo+B)ˆ×­©ôD9ƒ©;B.ÊõTyåvÂ)Î6™îZds§¡ÁÓÏMí­µ°r=¶öä&vÓž®é^/yr€¡¶¯ÓP;«y Â1{9B€FãŸà{ËוÂM>p\×-ž‘7>å èWˆÌ¨W
¥Ìrcø-Š¼ûãËü
-“¤%œ¡i±Iæ² —â~ÚøÑŸ/¯6³Âv¡ámÒ¥ß;»è½‡CÀê/aïoãã<,EQ^Çsór4 ÝÅpµö;[ÃïVÎy7G)JΑOü©5­¿|hW°hpk·IQ„"é5¶ÏÍŽûª‡]Ù)C™‹_Ú‘Âõ%KÄQXDñ¯oʬ±]ªÜïʽe×SX{üâññ|>‡¼+¾,}w¸ÉÀdñ:Æ›š¥îãºÊǽµÿ¶Uø]5èTíŠË°ç§ð6hÿ˜ÈŸ%×"ö"Û‹ ½H.ƒ€k(,â2÷†0”2¹õ6¿oÞ»ûq0Œâendstream
+“¤%œ¡i±Iæ² —â~ÚøÑŸ/¯6³Âv¡ámÒ¥ß;»è½‡CÀê/aïoãã<,EQ^Çsór4 ÝÅpµö;[ÃïVÎy7G)JΑOü©5­¿|hW°hpk·IQ„"é5¶ÏÍŽûª‡]Ù)C™‹_Ú‘Âõ%KÄQXDñ¯oʬ±]ªÜïʽe×SX{üâññ|>‡¼+¾,}w¸ÉÀdñ:Æ›š¥îãºÊǽµÿ¶Uø]5èTíŠË°ç§ð6hÿ˜ÈŸ%×"ö"Û‹ ½H.ƒH"h<H# a(Bä·îæÎ{ÿúhendstream
endobj
-1657 0 obj <<
+2081 0 obj <<
/Type /Page
-/Contents 1658 0 R
-/Resources 1656 0 R
+/Contents 2082 0 R
+/Resources 2080 0 R
/MediaBox [0 0 595.2756 841.8898]
-/Parent 1651 0 R
-/Annots [ 1665 0 R 1666 0 R ]
+/Parent 2071 0 R
+/Annots [ 2089 0 R 2090 0 R ]
>> endobj
-1665 0 obj <<
+2089 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[0 1 1]
/Rect [348.3486 128.9523 463.9152 141.0119]
/Subtype/Link/A<</Type/Action/S/URI/URI(mailto:info@isc.org)>>
>> endobj
-1666 0 obj <<
+2090 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[0 1 1]
/Rect [147.3629 116.9971 364.5484 129.0567]
/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.isc.org/services/support/)>>
>> endobj
-1659 0 obj <<
-/D [1657 0 R /XYZ 85.0394 794.5015 null]
+2083 0 obj <<
+/D [2081 0 R /XYZ 85.0394 794.5015 null]
>> endobj
-594 0 obj <<
-/D [1657 0 R /XYZ 85.0394 769.5949 null]
+722 0 obj <<
+/D [2081 0 R /XYZ 85.0394 769.5949 null]
>> endobj
-1660 0 obj <<
-/D [1657 0 R /XYZ 85.0394 576.7004 null]
+2084 0 obj <<
+/D [2081 0 R /XYZ 85.0394 576.7004 null]
>> endobj
-598 0 obj <<
-/D [1657 0 R /XYZ 85.0394 576.7004 null]
+726 0 obj <<
+/D [2081 0 R /XYZ 85.0394 576.7004 null]
>> endobj
-1661 0 obj <<
-/D [1657 0 R /XYZ 85.0394 548.3785 null]
+2085 0 obj <<
+/D [2081 0 R /XYZ 85.0394 548.3785 null]
>> endobj
-602 0 obj <<
-/D [1657 0 R /XYZ 85.0394 548.3785 null]
+730 0 obj <<
+/D [2081 0 R /XYZ 85.0394 548.3785 null]
>> endobj
-1662 0 obj <<
-/D [1657 0 R /XYZ 85.0394 518.5228 null]
+2086 0 obj <<
+/D [2081 0 R /XYZ 85.0394 518.5228 null]
>> endobj
-606 0 obj <<
-/D [1657 0 R /XYZ 85.0394 460.6968 null]
+734 0 obj <<
+/D [2081 0 R /XYZ 85.0394 460.6968 null]
>> endobj
-1663 0 obj <<
-/D [1657 0 R /XYZ 85.0394 425.0333 null]
+2087 0 obj <<
+/D [2081 0 R /XYZ 85.0394 425.0333 null]
>> endobj
-610 0 obj <<
-/D [1657 0 R /XYZ 85.0394 260.2468 null]
+738 0 obj <<
+/D [2081 0 R /XYZ 85.0394 260.2468 null]
>> endobj
-1664 0 obj <<
-/D [1657 0 R /XYZ 85.0394 224.698 null]
+2088 0 obj <<
+/D [2081 0 R /XYZ 85.0394 224.698 null]
>> endobj
-1656 0 obj <<
-/Font << /F21 714 0 R /F22 737 0 R /F11 1397 0 R /F41 939 0 R >>
+2080 0 obj <<
+/Font << /F21 930 0 R /F22 953 0 R /F11 1442 0 R /F41 1208 0 R >>
/ProcSet [ /PDF /Text ]
>> endobj
-1669 0 obj <<
+2093 0 obj <<
/Length 69
/Filter /FlateDecode
>>
stream
xÚ3T0
endobj
-1668 0 obj <<
+2092 0 obj <<
/Type /Page
-/Contents 1669 0 R
-/Resources 1667 0 R
+/Contents 2093 0 R
+/Resources 2091 0 R
/MediaBox [0 0 595.2756 841.8898]
-/Parent 1651 0 R
+/Parent 2071 0 R
>> endobj
-1670 0 obj <<
-/D [1668 0 R /XYZ 56.6929 794.5015 null]
+2094 0 obj <<
+/D [2092 0 R /XYZ 56.6929 794.5015 null]
>> endobj
-1667 0 obj <<
+2091 0 obj <<
/ProcSet [ /PDF ]
>> endobj
-1673 0 obj <<
-/Length 2543
+2097 0 obj <<
+/Length 2544
/Filter /FlateDecode
>>
stream
-xÚuYYsÛ8~ϯð[誑ÂûØ7[ÎádìrYÎNÕnö"! k’`ÒŠæ×O7ºyØéTJ@£hôñuƒö.\øç]¤ÑÚ ²ð"ÉÂuäzÑE^½s/°öùÇ<a¬£0`²°ºŠ‚t¥~r±šorýôîÃ'ß»ðÝuûÑÅÓ~<+N’µ¥OÅ«¦‘u¡~]®üÈu®.ÿ÷ô•ÄÂu’&Š¹pD²ã$žKäÒŒÌ^¸ÂØgæ8Z‡A’óÚ»\y® [çϵ>•²8T²îf²Þ:‹¢A6Ö^yƒì$Mú]·JîiøE™N·gšh&vGIƒ›û- D]°èíý ê_dë,öc>Ӈ˹!ë[vGÝŽ d¼ ~ø~gx©óÃuý\‰)´¶»ôyPu­êQ¬6sñ] UÓø^TLÝžM'+Éó¾mñ
-\Ó±8 ØãràÔòD3h Ä“0D,¤É[µ³:Ýê dÐ9 QÔ€EÒÔ'{)Áúrø®óɪ¢«q—µÑ$”ÄêY_ÝÔ'ÿ=>\f¾sUË"' Á_‘k/ƒ“†®
-¦6pkK­é·ç÷'‘s[w²…-@Ø£åÌ­ßp,XBšÎÞ'h7ü•¿Ù*Œpv
-÷Ãa…|‘¥nl Ø-H±ÈZyá6µ¨€÷ƒ(
-RÜŠ1ÏuL~”6`l ¿‚~ZѨ¢<ÓCƒÚ̓
-’ r”OœBç=Á 1j"«¢ºÑpQɧUäzý"GöÄÙ G,ØÝfS6ä ÐBdz˜€z²Ó„Q™DÏ B0q
-ã”U#7Cã@Q²€.ÿ¾ô
-ÝD‘øñðñ^=:\è±æí
-®o¬ƒñ+ñ'E\2}8Ç’;i %Ò‡ï&ª°Wõ\~jÀaÛÍ{³˜¢GË!zeoA_^†NmÞxš^Xð”Ð;’ù‚Ïr{z8Ø'"Hóȃ…×UØNÑô
+xÚuY[sÛ¸~ï¯È[•™µ««e·Äé%í&“‰Ó³3çô<ÐmóDUQŠëýõ  ¤dµÓé˜Äå¨>ü .ÖÉÒ²ø"ÍâeâÉE^½ó/°öù]À<q-“8Š`2³ºH¢õ2Y‡éÅbºÉõÓ»ŸÂà"ô—«U˜\<퇳Viº “õÅSñ_ïªid]¨_—‹0ñ½«Ëÿ=}%±x™®Ó
+#œ‚Ľ;¬/²Ô »)–X+Ïܦð~EAŠC1øžÉÒŒ­‘áWÐO+U”gš€B`hC»  ŸUM”Ä
+FXЭ‚dƒ\#åS¯ÐyOpBŒšÈª†¨n4\Tòi¹^¿È=õvÂÀ3v·Ù”¹<ƒZˆLPO–`š8I9³€øQ &ŽÀ6 CÆg”ñf±Ñu.{4ÐÈ,0ø$rUªNIƒb¼Ã°:Ý>±‹átûÕé°Ûª)å$
+£ÄÁ¶‘¹µ/!. N…Ùzê°Wâ.pl „ÓÁº°â…!R߸“OG•y—²œ ™®Õ+Å cøˆP¾·ëU é6É–+?£ÂôD˜•ZŒnMG“Ñu Æ »Æ51ŒŒl_àêiìYpɼÔ$LK­¹¿JH\ç d`
+¼
+–a“p¯Gkଯ ëÃá5³îǪÿêÄ- ÜȽ¬Í|µ/^ÄwxÒH‚
+D¤<ÐÎÿ—yÇ‘sU@E…ÎqÌ*Š‘×8P”Ì Ë¿/@f4áRÊ}^º¦ÖÒRº#›Úv°/×ˈÖFtÅŒ‚þ[åSr Òéú@Øèªé)ŽL½"Ÿûæ¢@ù<ñpJµÙ>~æÜpËLtGY­Fgá±[A —(-̃ÅÙ¶Ä ˜Þ°)Ëx™AaíF¼¨‚ÕáPâ¥V)§8·º>@ÌÔ4ûôÜÄP‰BÍÞ(dv P&máªëæßFD3zœ`·“¢ÂEàÛ=ÃBj{ †rh®ÔÐq½ ‘®³«zß&Å(uùJ¸8…B×ò5ø?Š²9Òp#ªf'Ë’•ú&_æ ùM_—¢±J6iðU£ª#E}ïãÏ^5X*‰eÃÏÖJ©>KF\¢P¯SSŒo&Œ>Ï! ·LÝ–è@±¸ˆ¤ægH@Ä9³ZI( Ž:ž()6Sq
+UŸiQc¢õFêƆEiX*×5ÔÏ]OÕ-ãÖXXE p³Í‚¥¢o¹‡šMÔºõÁùˆ4òs®øbðج–×
endobj
-1672 0 obj <<
+2096 0 obj <<
/Type /Page
-/Contents 1673 0 R
-/Resources 1671 0 R
+/Contents 2097 0 R
+/Resources 2095 0 R
/MediaBox [0 0 595.2756 841.8898]
-/Parent 1651 0 R
+/Parent 2071 0 R
>> endobj
-1674 0 obj <<
-/D [1672 0 R /XYZ 85.0394 794.5015 null]
+2098 0 obj <<
+/D [2096 0 R /XYZ 85.0394 794.5015 null]
>> endobj
-614 0 obj <<
-/D [1672 0 R /XYZ 85.0394 769.5949 null]
+742 0 obj <<
+/D [2096 0 R /XYZ 85.0394 769.5949 null]
>> endobj
-1675 0 obj <<
-/D [1672 0 R /XYZ 85.0394 573.5449 null]
+2099 0 obj <<
+/D [2096 0 R /XYZ 85.0394 573.5449 null]
>> endobj
-618 0 obj <<
-/D [1672 0 R /XYZ 85.0394 573.5449 null]
+746 0 obj <<
+/D [2096 0 R /XYZ 85.0394 573.5449 null]
>> endobj
-1676 0 obj <<
-/D [1672 0 R /XYZ 85.0394 539.0037 null]
+2100 0 obj <<
+/D [2096 0 R /XYZ 85.0394 539.0037 null]
>> endobj
-622 0 obj <<
-/D [1672 0 R /XYZ 85.0394 539.0037 null]
+750 0 obj <<
+/D [2096 0 R /XYZ 85.0394 539.0037 null]
>> endobj
-1677 0 obj <<
-/D [1672 0 R /XYZ 85.0394 510.2426 null]
+2101 0 obj <<
+/D [2096 0 R /XYZ 85.0394 510.2426 null]
>> endobj
-1671 0 obj <<
-/Font << /F21 714 0 R /F22 737 0 R >>
+2095 0 obj <<
+/Font << /F21 930 0 R /F22 953 0 R >>
/ProcSet [ /PDF /Text ]
>> endobj
-1680 0 obj <<
-/Length 2810
+2104 0 obj <<
+/Length 2811
/Filter /FlateDecode
>>
stream
-xÚ­koã¸ñ{~…¿ÕbEõô²Ù$Í]/—&.Zàö€Òm«+K>QJ6÷ë;Ã!õ°•½ÚäƒÉáp8/΃b3þÙ,0ñ’Y”øNà²`–îÏÜÙÖîΘÁYX¤Åëãêìò–G³ÄIB/œ­6Z±ãÆ1›­²_æWŽçœw~wópótõ·ó…¸óOÏ4xº¹½yºy¸¾¡éýÃíÏO?]Gþ|uÿóÃù"Ž’`~õøxóðéþ_„s…]×B¯ožÏ]ýpv³ê8JÅ\Žìþvö˯î,á~8sžÄÁì&®Ã’Ä›íÏü€;Ϲ…gÏgïVõÖI-1×ñxèM¨Éó¦Ô$NÈ=®ÕôñþáHçÅóY«¼*q’Ì‚½
-EƒúœÅsYH¡dFyI+ÏòÐÈýZÖ4õ\×%QfÊ Að½øOU©¾Öy#i­ÚÐB)E]¼™mEaªƒLCÌb6;³µ-3©é-Ð( ™cNž³xËË-YÑH #¡ñÓŸ6-1ãØÝžë¸Q4Ôì0:R4óáÇ·‚Â<’•4>aòÙu½4IÞhK&„”ŠFfàVœ¹ó‡Êìϲ¼SDAóL¾È¢:ìeÙ@+©T¥=¥<–­·¦ftB%Úï¡ Θâþüµª¿Ð’f~÷"“´v¨”Ê×…$xSeâ†ë7B +@@»U­vùV´qΫµF`’Võ¡ª*I] (2F8"9!u“[WVÆŠ†qIm«MU7ª3žþ-Û=ùVÕš•¼Ìò—<kE¡´žàª±óîÃ=„»§ú‘ãã­4Áè|ÁàjÌïdiä#¹‘µ,ScÎû˜ØkùzâVMœs'öXÜE:fÈß?¾„Õ £4 v÷
-þà—šÃØ€f†à™0Š
-†Li2Za†TüÖ™/ÖyC+yîŸ3íïàLÝhOܼld½iGHÛ ”Ô‡‘Ö8R¡Fó×]žîÌPöçkD²LÖ¦2³çÐÚ‰ Pf ­G 8"ýÂ9y‘7BG!˜«T‚Üf÷ÈJ)š7h œàµM¢ùj×3b8iv4³Ó·ƒ(2‘чú]’ex2° ?Ë 2ÿ2O…j&LÈ™ñ¯E‚Šé² ™Å VAå,xÃF6¾&«¹Ïæ
-ÄD=pßíMòa‚ËØsxÌ=søUùö“ðü“<äšI<mÌ$B´ëàá–4P}#¦Ô
-÷ ×&
- ¶™ìLtÑâÏ©®ÄAÝ€}ºÚòaÁpÙ"âÖ‘ôª» è&~¯ ¡”)üaª »OÕ^XjO]4ƒ “ëûOOE. húÃ|[JúóÇÕÓ”$¤Qx²hº ÀDXækвN‰NÉØ/í
-¹·ÚÖ5 ”FE³Ã¼`Pó«è·c'ƒv51y~+PqgjÍäF@9I“Þ@H{C¿¥„«®Dýv΀¬Å‚x~5Š ?ÈS[ŸŒ[¹QµÏ·;SRUeº×"ÿ"—]»8(GBè9·µ¯çºl™­ã¥¿ÉR¸.Œ¨ñ]ndÌ–Þš{ mÑÑ™(Ù’ã( }¾Öh'J©Q'´jÓèxš`V é»— ËÚâ9Ô BCD‡
-÷ Ín©äIM AïoV·&÷&¶µHâA–ù6ý禟Åó;Óh‘è?ß!}‡0P¥´øε·²Zc¬ÜÌܾý¾ä¦T½]=š;Ù,'²ý¦9,//___QN®rGfíe^.´•.±Õ×®ðaòð¸V¡íŸ¿ÂßÄñ¸“0×"9ÍWó°ÂÆyÈ YdÛâ?:ñ߉’ Ö-; Ÿ¾uÐò—™ýØ÷èv,†[ôwxð)å‘:†ªÀï;äµ—ÇüùÈGGü}‹é°Ny)ã”òô—©¼Ë˜h1ÆDWzíOíÑÐcû³…ŽïZœ\ÙDvÞkÛ–Ø'–n¼Åz1ÍÔÄ·Q(ûIãEäöIuè²½¢SÊõÈT¶ÀÏV,d#=œ¸Qè;¾Ï@¯Œ;. þØ‹ì†ÅpÇ©ÐÕuBÓ;‘l6NUo/ëMzâ;ž9‰Ë¹:ò딕‘"N©½ç;‘ùq4|à9NÏà¦1›$°iš›Œ`¾G¨÷¾pòÀÁÏ’r¸]bþŸ¿~ö€9ÇÞô‡M/ŠJSËJ„'œÛϤ§¬ÿ¤ð endstream
+xÚ­koã¸ñ{~…¿ÕbEõ̲»É6w½\š¸hÛ*K´­®,ùD9Ùܯï g¨‡­ì-Ð&L‡Ãyq”˜¹ð/fA脉—Ì¢ÄwW³lwæÎ6°öéL0ÎÂ"-†Xï—g—·2š%Nzál¹Њ7ŽÅl™ÿ2¿v<ç(¸óO7÷7×;_x;ÿxÿDƒÇ›Û›Ç›û74½»¿ýùñ§ëóÈŸ/ï~¾?_ÄQ̯nî?Þý‹p®‘ ëZ臛§ó_—?œÝ,;Ž‡R W"»¿ýò«;ËA¸Î\G&q0{‰ëˆ$ñf»3?NàKi!åÙÓÙß;‚ƒU³uRKÂu<zjò¼)5‰JO5½¿»ÿÒyñüY5º¨+œ$ó„`/©¦As.â¹*UªUNEE+OjߪÝJ54õ\×%„´Ê T0”à»ô?u3¤úÒ­¢µzM •J›ò•·•%Ô{•µLÌb¶[Þz¨reè-Ð( ™…Nž³|-ª Y‘%†Qjð³-ŸµbƱ»=×q£h¨#ØÁ:Ò4óáÇ·‚Â<’U4>aòÙu½¬
+dþU‘¥º0¡N$;<¼q*¦cÈ2d¬‚ÊYÈ(†b|M VK_Ì5ˆ‰z¾Û›äÝ—±çÈXz|øuõú“ðü“2”†I<mÌ$BŒëàá–4P}#¦ô;
+h»zxXÑGWø ŸøxûpdGS—é³çùŸ˜Œ3;¦`²ƒ€[sƒ›&²K¼C*Ç!@þ®Û(Nê'¨u|6çfÀéà&€S2Z÷ë„c€‹»ÞÐ1Þ<Ós l³ˆú°¢àYcè>§'„)ŽN°ÕEZME‡È ¡äå-W}×q‘t¼@Ú½”î¾ç;~ 7eh˜%¥ç¤×ŸŒô‹#ýU1¯Ô0Mˆ†ÊÒ‰Müñü°×ÈUº’3›‚˜<¸wOçJ¾ sêOLŽc®6ÛòÕ¤:³êö (/rÍG×= …8£?¡prmRXÖ”aÄwâ ´QCɵµÇ¥«°¥«7¾µhÒjƒ—VBF_Z¬Î‘`|΢‰(%[
+KÌÄ­tg¹Ñä äh&ÆZéI¥”»
+À¡ìLLÑâÏ©®ÄA Ý]
+ûLµ³òa¹lIëÈ
+»õ.µÔ»h &î>>b¹`:&Ðô‡ù¶”ôçËÇ)IH£5xrÚv €‰°*V e“ œ’1/ã
+ItdöW9€°;˜
+#";"2ôoÆG‰Fõ
+EЙ­OƭܨŒÚ›-—e]s÷Z_ÔU×.Ê‘zE)míë¹®¸ÊWñ•¿ÉUêº0¢Æ÷j­bqå­¤7‘Љ’-9ŽÂÐákq¢ŒuB«×­‰§ fe°¹{ º ©-žC
+â”mÖöÑëC½Ã
+cåàföí÷¹àRõvùÀw²½šÈöëvuyùòò‚*p
+]8*?\ÕÂXé[}ãú&?kÚþù+üM\O:‰p-’Ó~å‡1ÎCN("ÛÿùøÓ‰øN”±iÙE˜øô­ƒ–¿ÌìèÇþ»G·c1Üb¾{øÃO)Ô1T~ß!¯½<æÏGþã8:âïè[L‡uÊÓH§Ô§¿Lå]ÀĈ90&ºÒK÷ðxj7ˆ†žÄ˜-t|×âÚv ª{ô^Ù¶Ä>±t‹à-Ö‹i¦'¾}¤¥¶Ÿ4žÓÂ>©]¶£÷OtJµùï‘ÊøÙJ„b¤‡7
+}Ç÷èUHÇÁ{‘Ý°î8u¢º¦Nh{'RíÚ©›Íe³ÎN|Çs#'qå1WG¾Óa²2RÄ)µ·|'r"?Ž†<ÇéÜ4†`“6MKÎü=B¿õ…S~–œÃíóÿüõ³ÿ
endobj
-1679 0 obj <<
+2103 0 obj <<
/Type /Page
-/Contents 1680 0 R
-/Resources 1678 0 R
+/Contents 2104 0 R
+/Resources 2102 0 R
/MediaBox [0 0 595.2756 841.8898]
-/Parent 1651 0 R
-/Annots [ 1684 0 R 1685 0 R ]
+/Parent 2112 0 R
+/Annots [ 2108 0 R 2109 0 R ]
>> endobj
-1684 0 obj <<
+2108 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[0 1 1]
/Rect [253.7995 149.3637 417.685 161.4234]
/Subtype/Link/A<</Type/Action/S/URI/URI(ftp://www.isi.edu/in-notes/)>>
>> endobj
-1685 0 obj <<
+2109 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[0 1 1]
/Rect [63.4454 110.455 208.8999 120.6168]
/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.ietf.org/rfc/)>>
>> endobj
-1681 0 obj <<
-/D [1679 0 R /XYZ 56.6929 794.5015 null]
+2105 0 obj <<
+/D [2103 0 R /XYZ 56.6929 794.5015 null]
>> endobj
-626 0 obj <<
-/D [1679 0 R /XYZ 56.6929 662.0717 null]
+754 0 obj <<
+/D [2103 0 R /XYZ 56.6929 662.0717 null]
>> endobj
-1682 0 obj <<
-/D [1679 0 R /XYZ 56.6929 624.1661 null]
+2106 0 obj <<
+/D [2103 0 R /XYZ 56.6929 624.1661 null]
>> endobj
-630 0 obj <<
-/D [1679 0 R /XYZ 56.6929 624.1661 null]
+758 0 obj <<
+/D [2103 0 R /XYZ 56.6929 624.1661 null]
>> endobj
-1140 0 obj <<
-/D [1679 0 R /XYZ 56.6929 593.0972 null]
+1515 0 obj <<
+/D [2103 0 R /XYZ 56.6929 593.0972 null]
>> endobj
-634 0 obj <<
-/D [1679 0 R /XYZ 56.6929 294.2701 null]
+762 0 obj <<
+/D [2103 0 R /XYZ 56.6929 294.2701 null]
>> endobj
-1683 0 obj <<
-/D [1679 0 R /XYZ 56.6929 255.4568 null]
+2107 0 obj <<
+/D [2103 0 R /XYZ 56.6929 255.4568 null]
>> endobj
-638 0 obj <<
-/D [1679 0 R /XYZ 56.6929 255.4568 null]
+766 0 obj <<
+/D [2103 0 R /XYZ 56.6929 255.4568 null]
>> endobj
-967 0 obj <<
-/D [1679 0 R /XYZ 56.6929 226.1045 null]
+1241 0 obj <<
+/D [2103 0 R /XYZ 56.6929 226.1045 null]
>> endobj
-1686 0 obj <<
-/D [1679 0 R /XYZ 56.6929 53.5688 null]
+2110 0 obj <<
+/D [2103 0 R /XYZ 56.6929 53.5688 null]
>> endobj
-1687 0 obj <<
-/D [1679 0 R /XYZ 56.6929 53.5688 null]
+2111 0 obj <<
+/D [2103 0 R /XYZ 56.6929 53.5688 null]
>> endobj
-1678 0 obj <<
-/Font << /F37 802 0 R /F22 737 0 R /F21 714 0 R /F39 899 0 R /F53 1029 0 R /F11 1397 0 R /F41 939 0 R >>
+2102 0 obj <<
+/Font << /F37 1018 0 R /F22 953 0 R /F21 930 0 R /F39 1151 0 R /F53 1303 0 R /F11 1442 0 R /F41 1208 0 R >>
/ProcSet [ /PDF /Text ]
>> endobj
-1690 0 obj <<
-/Length 2825
+2115 0 obj <<
+/Length 2826
/Filter /FlateDecode
>>
stream
@@ -8407,191 +10225,192 @@ Zî–ÁÅ“ž„N(ËEHq¤;#UO«E;õ4:É$£ÇgöHm)7™FJ“>2½Ð-™'ØÃdvÀ›
À´jP'Ïå±îí0ô¾ˆpØ!f
ã3­¤%ä¶B-dU™Ï}¸­ ö‡MÐFžŒ¯ -3wÊ,Ÿw¢^ [ÖŒ*…ÅÈ´<Øû©ÍØ/cŒ ­±ïÖÙN­>Ë^vå›~¾Ñó
åçú«d>C¶K¡`Œidå7ÆÁâU<2³û»I_å Cæœ:& ôÚäLcjKy¨ÖRמZ/´EvÛÁ¶ >-÷{¹ëŠõfëÀ·@09—¬–‡JÊH…‰Åq³N¬é„`ü]þmøèœÆ(æØ>F¢aóù XäýqŸêSW±ïÚôy°Úc +ïÔàT >d mâŒ^·Ãs§÷œ¥ÅùÆgîóÝÎœø~ŸIð‘0Šüa ¹ B µT$žƒnk}àak°‘Ù!×G%ǶÚ4[Y¯†ªLÆ,<=5G±Žö\×~ïGI ¶àÏÔÿ–[áZ¨Íø¾Ï¾|¸­ÂûÀÃ
-·‘÷AŸWÏÙ6}ÍE5#P}m kkôÓÒ9áBŸÔ6"²€ÑÛÇ×H^MÖêD2ì #FEÐ|X|Ö~ѼJyÈ«m^§DRãKá%Jæ./öY®P¯ÙÙC²7Ü…¤jñ î€j“Ûÿò—¾ÖÎaŒh’8Óh¡„ðX¿”ø<ù$øôÕÿ Æ¡bxendstream
+·‘÷AŸWÏÙ6}ÍE5#P}m kkôÓÒ9áBŸÔ6"²€ÑÛÇ×H^MÖêD2ì #FEÐ|X|Ö~ѼJyÈ«m^§DRãKá%Jæ./öY®P¯ÙÙC²7Ü…¤jñ î€j“Ûÿò—¾ÖÎaŒh’8Ó(4Ÿ”r¬_Jü
+LN>D6ߟ¾û#ïbendstream
endobj
-1689 0 obj <<
+2114 0 obj <<
/Type /Page
-/Contents 1690 0 R
-/Resources 1688 0 R
+/Contents 2115 0 R
+/Resources 2113 0 R
/MediaBox [0 0 595.2756 841.8898]
-/Parent 1747 0 R
+/Parent 2112 0 R
>> endobj
-1691 0 obj <<
-/D [1689 0 R /XYZ 85.0394 794.5015 null]
+2116 0 obj <<
+/D [2114 0 R /XYZ 85.0394 794.5015 null]
>> endobj
-1692 0 obj <<
-/D [1689 0 R /XYZ 85.0394 752.3015 null]
+2117 0 obj <<
+/D [2114 0 R /XYZ 85.0394 752.3015 null]
>> endobj
-1693 0 obj <<
-/D [1689 0 R /XYZ 85.0394 752.3015 null]
+2118 0 obj <<
+/D [2114 0 R /XYZ 85.0394 752.3015 null]
>> endobj
-1694 0 obj <<
-/D [1689 0 R /XYZ 85.0394 752.3015 null]
+2119 0 obj <<
+/D [2114 0 R /XYZ 85.0394 752.3015 null]
>> endobj
-1695 0 obj <<
-/D [1689 0 R /XYZ 85.0394 746.3107 null]
+2120 0 obj <<
+/D [2114 0 R /XYZ 85.0394 746.3107 null]
>> endobj
-1696 0 obj <<
-/D [1689 0 R /XYZ 85.0394 731.5461 null]
+2121 0 obj <<
+/D [2114 0 R /XYZ 85.0394 731.5461 null]
>> endobj
-1697 0 obj <<
-/D [1689 0 R /XYZ 85.0394 728.1497 null]
+2122 0 obj <<
+/D [2114 0 R /XYZ 85.0394 728.1497 null]
>> endobj
-1698 0 obj <<
-/D [1689 0 R /XYZ 85.0394 713.3851 null]
+2123 0 obj <<
+/D [2114 0 R /XYZ 85.0394 713.3851 null]
>> endobj
-1699 0 obj <<
-/D [1689 0 R /XYZ 85.0394 709.9887 null]
+2124 0 obj <<
+/D [2114 0 R /XYZ 85.0394 709.9887 null]
>> endobj
-1700 0 obj <<
-/D [1689 0 R /XYZ 85.0394 651.9592 null]
+2125 0 obj <<
+/D [2114 0 R /XYZ 85.0394 651.9592 null]
>> endobj
-1083 0 obj <<
-/D [1689 0 R /XYZ 85.0394 651.9592 null]
+1372 0 obj <<
+/D [2114 0 R /XYZ 85.0394 651.9592 null]
>> endobj
-1701 0 obj <<
-/D [1689 0 R /XYZ 85.0394 651.9592 null]
+2126 0 obj <<
+/D [2114 0 R /XYZ 85.0394 651.9592 null]
>> endobj
-1702 0 obj <<
-/D [1689 0 R /XYZ 85.0394 648.8377 null]
+2127 0 obj <<
+/D [2114 0 R /XYZ 85.0394 648.8377 null]
>> endobj
-1703 0 obj <<
-/D [1689 0 R /XYZ 85.0394 634.0731 null]
+2128 0 obj <<
+/D [2114 0 R /XYZ 85.0394 634.0731 null]
>> endobj
-1704 0 obj <<
-/D [1689 0 R /XYZ 85.0394 630.6767 null]
+2129 0 obj <<
+/D [2114 0 R /XYZ 85.0394 630.6767 null]
>> endobj
-1705 0 obj <<
-/D [1689 0 R /XYZ 85.0394 615.9121 null]
+2130 0 obj <<
+/D [2114 0 R /XYZ 85.0394 615.9121 null]
>> endobj
-1706 0 obj <<
-/D [1689 0 R /XYZ 85.0394 612.5156 null]
+2131 0 obj <<
+/D [2114 0 R /XYZ 85.0394 612.5156 null]
>> endobj
-1707 0 obj <<
-/D [1689 0 R /XYZ 85.0394 585.7959 null]
+2132 0 obj <<
+/D [2114 0 R /XYZ 85.0394 585.7959 null]
>> endobj
-1708 0 obj <<
-/D [1689 0 R /XYZ 85.0394 582.3994 null]
+2133 0 obj <<
+/D [2114 0 R /XYZ 85.0394 582.3994 null]
>> endobj
-1709 0 obj <<
-/D [1689 0 R /XYZ 85.0394 567.6349 null]
+2134 0 obj <<
+/D [2114 0 R /XYZ 85.0394 567.6349 null]
>> endobj
-1710 0 obj <<
-/D [1689 0 R /XYZ 85.0394 564.2384 null]
+2135 0 obj <<
+/D [2114 0 R /XYZ 85.0394 564.2384 null]
>> endobj
-1711 0 obj <<
-/D [1689 0 R /XYZ 85.0394 549.5337 null]
+2136 0 obj <<
+/D [2114 0 R /XYZ 85.0394 549.5337 null]
>> endobj
-1712 0 obj <<
-/D [1689 0 R /XYZ 85.0394 546.0774 null]
+2137 0 obj <<
+/D [2114 0 R /XYZ 85.0394 546.0774 null]
>> endobj
-1713 0 obj <<
-/D [1689 0 R /XYZ 85.0394 531.3128 null]
+2138 0 obj <<
+/D [2114 0 R /XYZ 85.0394 531.3128 null]
>> endobj
-1714 0 obj <<
-/D [1689 0 R /XYZ 85.0394 527.9163 null]
+2139 0 obj <<
+/D [2114 0 R /XYZ 85.0394 527.9163 null]
>> endobj
-1715 0 obj <<
-/D [1689 0 R /XYZ 85.0394 513.1518 null]
+2140 0 obj <<
+/D [2114 0 R /XYZ 85.0394 513.1518 null]
>> endobj
-1716 0 obj <<
-/D [1689 0 R /XYZ 85.0394 509.7553 null]
+2141 0 obj <<
+/D [2114 0 R /XYZ 85.0394 509.7553 null]
>> endobj
-1717 0 obj <<
-/D [1689 0 R /XYZ 85.0394 483.0356 null]
+2142 0 obj <<
+/D [2114 0 R /XYZ 85.0394 483.0356 null]
>> endobj
-1718 0 obj <<
-/D [1689 0 R /XYZ 85.0394 479.6391 null]
+2143 0 obj <<
+/D [2114 0 R /XYZ 85.0394 479.6391 null]
>> endobj
-1719 0 obj <<
-/D [1689 0 R /XYZ 85.0394 464.8745 null]
+2144 0 obj <<
+/D [2114 0 R /XYZ 85.0394 464.8745 null]
>> endobj
-1720 0 obj <<
-/D [1689 0 R /XYZ 85.0394 461.4781 null]
+2145 0 obj <<
+/D [2114 0 R /XYZ 85.0394 461.4781 null]
>> endobj
-1721 0 obj <<
-/D [1689 0 R /XYZ 85.0394 446.7135 null]
+2146 0 obj <<
+/D [2114 0 R /XYZ 85.0394 446.7135 null]
>> endobj
-1722 0 obj <<
-/D [1689 0 R /XYZ 85.0394 443.3171 null]
+2147 0 obj <<
+/D [2114 0 R /XYZ 85.0394 443.3171 null]
>> endobj
-1723 0 obj <<
-/D [1689 0 R /XYZ 85.0394 428.5525 null]
+2148 0 obj <<
+/D [2114 0 R /XYZ 85.0394 428.5525 null]
>> endobj
-1724 0 obj <<
-/D [1689 0 R /XYZ 85.0394 425.156 null]
+2149 0 obj <<
+/D [2114 0 R /XYZ 85.0394 425.156 null]
>> endobj
-1725 0 obj <<
-/D [1689 0 R /XYZ 85.0394 355.0758 null]
+2150 0 obj <<
+/D [2114 0 R /XYZ 85.0394 355.0758 null]
>> endobj
-1726 0 obj <<
-/D [1689 0 R /XYZ 85.0394 355.0758 null]
+2151 0 obj <<
+/D [2114 0 R /XYZ 85.0394 355.0758 null]
>> endobj
-1727 0 obj <<
-/D [1689 0 R /XYZ 85.0394 355.0758 null]
+2152 0 obj <<
+/D [2114 0 R /XYZ 85.0394 355.0758 null]
>> endobj
-1728 0 obj <<
-/D [1689 0 R /XYZ 85.0394 352.0499 null]
+2153 0 obj <<
+/D [2114 0 R /XYZ 85.0394 352.0499 null]
>> endobj
-1729 0 obj <<
-/D [1689 0 R /XYZ 85.0394 337.3452 null]
+2154 0 obj <<
+/D [2114 0 R /XYZ 85.0394 337.3452 null]
>> endobj
-1730 0 obj <<
-/D [1689 0 R /XYZ 85.0394 333.8889 null]
+2155 0 obj <<
+/D [2114 0 R /XYZ 85.0394 333.8889 null]
>> endobj
-1731 0 obj <<
-/D [1689 0 R /XYZ 85.0394 309.8192 null]
+2156 0 obj <<
+/D [2114 0 R /XYZ 85.0394 309.8192 null]
>> endobj
-1732 0 obj <<
-/D [1689 0 R /XYZ 85.0394 303.7727 null]
+2157 0 obj <<
+/D [2114 0 R /XYZ 85.0394 303.7727 null]
>> endobj
-1733 0 obj <<
-/D [1689 0 R /XYZ 85.0394 278.3282 null]
+2158 0 obj <<
+/D [2114 0 R /XYZ 85.0394 278.3282 null]
>> endobj
-1734 0 obj <<
-/D [1689 0 R /XYZ 85.0394 273.6565 null]
+2159 0 obj <<
+/D [2114 0 R /XYZ 85.0394 273.6565 null]
>> endobj
-1735 0 obj <<
-/D [1689 0 R /XYZ 85.0394 246.9367 null]
+2160 0 obj <<
+/D [2114 0 R /XYZ 85.0394 246.9367 null]
>> endobj
-1736 0 obj <<
-/D [1689 0 R /XYZ 85.0394 243.5403 null]
+2161 0 obj <<
+/D [2114 0 R /XYZ 85.0394 243.5403 null]
>> endobj
-1737 0 obj <<
-/D [1689 0 R /XYZ 85.0394 173.5556 null]
+2162 0 obj <<
+/D [2114 0 R /XYZ 85.0394 173.5556 null]
>> endobj
-1738 0 obj <<
-/D [1689 0 R /XYZ 85.0394 173.5556 null]
+2163 0 obj <<
+/D [2114 0 R /XYZ 85.0394 173.5556 null]
>> endobj
-1739 0 obj <<
-/D [1689 0 R /XYZ 85.0394 173.5556 null]
+2164 0 obj <<
+/D [2114 0 R /XYZ 85.0394 173.5556 null]
>> endobj
-1740 0 obj <<
-/D [1689 0 R /XYZ 85.0394 170.4341 null]
+2165 0 obj <<
+/D [2114 0 R /XYZ 85.0394 170.4341 null]
>> endobj
-1741 0 obj <<
-/D [1689 0 R /XYZ 85.0394 144.9896 null]
+2166 0 obj <<
+/D [2114 0 R /XYZ 85.0394 144.9896 null]
>> endobj
-1742 0 obj <<
-/D [1689 0 R /XYZ 85.0394 140.3179 null]
+2167 0 obj <<
+/D [2114 0 R /XYZ 85.0394 140.3179 null]
>> endobj
-1743 0 obj <<
-/D [1689 0 R /XYZ 85.0394 113.5982 null]
+2168 0 obj <<
+/D [2114 0 R /XYZ 85.0394 113.5982 null]
>> endobj
-1744 0 obj <<
-/D [1689 0 R /XYZ 85.0394 110.2017 null]
+2169 0 obj <<
+/D [2114 0 R /XYZ 85.0394 110.2017 null]
>> endobj
-1745 0 obj <<
-/D [1689 0 R /XYZ 85.0394 95.4372 null]
+2170 0 obj <<
+/D [2114 0 R /XYZ 85.0394 95.4372 null]
>> endobj
-1746 0 obj <<
-/D [1689 0 R /XYZ 85.0394 92.0407 null]
+2171 0 obj <<
+/D [2114 0 R /XYZ 85.0394 92.0407 null]
>> endobj
-1688 0 obj <<
-/Font << /F37 802 0 R /F21 714 0 R /F22 737 0 R /F39 899 0 R >>
+2113 0 obj <<
+/Font << /F37 1018 0 R /F21 930 0 R /F22 953 0 R /F39 1151 0 R >>
/ProcSet [ /PDF /Text ]
>> endobj
-1750 0 obj <<
+2174 0 obj <<
/Length 2889
/Filter /FlateDecode
>>
@@ -8609,484 +10428,742 @@ id„ý4¦Õ0m¥Ñ¡¥
¾šÈÖϺ`]Ë4OòJv‰šU N«µƒiqLË2í«ÿ
ŒÛÏiueK×±ôƒƒæÏBŽãŒÄaÓj˜¹¶jÞLpð0s«tÃüD»—yK[ÏÇ"ß»ø+Vý,/MÓ­ ~‚é;üd'DÄñCK˜ýl~h½u Äë!ÍTò'/Ø‹PˆÇª¦•…’²j(ÙöK«´A©«ÝOÉÔ^³ïÇTìq{–«íPo‘Í#/þéºÐ湚»×,Ý…ô¦¬+#wŸ[<¹ÂùÅ!Ù±r¹
…º#õ:ÓÊEYi(^ds›´¥«ÝÅÔOï7ÕḭD˜d™7žmôl‘‡ü€ºíÉÿ ã
-.Wçñ|¾FñZD—øw¦~TЙìkUUIw9SAèJ6î$Í«z꾅щlÍ£ü~dÃÏu1dwGÛ›VdÊJ# ‰å4i•6uµû‘™ÚËøBm¼DÁ¶Ï9„§L½Î´ç1NîC݇MyúýȺ‡ лéz~ÐÛ–±DÇÊŽ§^I§‚ö;•“~f8ö–…a4LK5eb©TÛtV]á^T¦°Žqn¨bœñ7ƒ´ºsnÔ©b‚å2^Åâêr…tÇÉÐû¼¤é“ÖÓ?±N©áv3¥†f#¥æÒè¢.lå¹x òüßµ·eYšìÕ‹Z¤uö×ÎÚyÍnð i©³xˆ¿OÛ3ùŽ>“þϯíUñ
+.Wçñ|¾FñZD—øw¦~TЙìkUUIw9SAèJ6î$Í«z꾅щlÍ£ü~dÃÏu1dwGÛ›VdÊJ# ‰å4i•6uµû‘™ÚËøBm¼DÁ¶Ï9„§L½Î´ç1NîC݇MyúýȺ‡ лéz~ÐÛ–±DÇÊŽ§^I§‚ö;•“~f8ö–…a4LK5eb©TÛtV]á^T¦°Žqn¨bœñ7ƒ´ºsnÔ©b‚å2^Åâêr…tÇÉÐû¼¤é“ÖÓ?±N©áv3¥†f#¥æÒè¢.lå¹x òüßµ·eYšìÕ‹Z¤uö×ÎÚyÍnð i©³xˆ¿OÛ3ùŽ>“þϯíUñ
endobj
-1749 0 obj <<
+2173 0 obj <<
/Type /Page
-/Contents 1750 0 R
-/Resources 1748 0 R
+/Contents 2174 0 R
+/Resources 2172 0 R
/MediaBox [0 0 595.2756 841.8898]
-/Parent 1747 0 R
+/Parent 2112 0 R
>> endobj
-1751 0 obj <<
-/D [1749 0 R /XYZ 56.6929 794.5015 null]
+2175 0 obj <<
+/D [2173 0 R /XYZ 56.6929 794.5015 null]
>> endobj
-1752 0 obj <<
-/D [1749 0 R /XYZ 56.6929 748.5056 null]
+2176 0 obj <<
+/D [2173 0 R /XYZ 56.6929 748.5056 null]
>> endobj
-1753 0 obj <<
-/D [1749 0 R /XYZ 56.6929 748.5056 null]
+2177 0 obj <<
+/D [2173 0 R /XYZ 56.6929 748.5056 null]
>> endobj
-1754 0 obj <<
-/D [1749 0 R /XYZ 56.6929 748.5056 null]
+2178 0 obj <<
+/D [2173 0 R /XYZ 56.6929 748.5056 null]
>> endobj
-1755 0 obj <<
-/D [1749 0 R /XYZ 56.6929 743.7078 null]
+2179 0 obj <<
+/D [2173 0 R /XYZ 56.6929 743.7078 null]
>> endobj
-1756 0 obj <<
-/D [1749 0 R /XYZ 56.6929 719.6381 null]
+2180 0 obj <<
+/D [2173 0 R /XYZ 56.6929 719.6381 null]
>> endobj
-1757 0 obj <<
-/D [1749 0 R /XYZ 56.6929 711.8197 null]
+2181 0 obj <<
+/D [2173 0 R /XYZ 56.6929 711.8197 null]
>> endobj
-1758 0 obj <<
-/D [1749 0 R /XYZ 56.6929 697.0552 null]
+2182 0 obj <<
+/D [2173 0 R /XYZ 56.6929 697.0552 null]
>> endobj
-1759 0 obj <<
-/D [1749 0 R /XYZ 56.6929 691.8868 null]
+2183 0 obj <<
+/D [2173 0 R /XYZ 56.6929 691.8868 null]
>> endobj
-1760 0 obj <<
-/D [1749 0 R /XYZ 56.6929 665.1671 null]
+2184 0 obj <<
+/D [2173 0 R /XYZ 56.6929 665.1671 null]
>> endobj
-1761 0 obj <<
-/D [1749 0 R /XYZ 56.6929 659.9987 null]
+2185 0 obj <<
+/D [2173 0 R /XYZ 56.6929 659.9987 null]
>> endobj
-1762 0 obj <<
-/D [1749 0 R /XYZ 56.6929 635.929 null]
+2186 0 obj <<
+/D [2173 0 R /XYZ 56.6929 635.929 null]
>> endobj
-1763 0 obj <<
-/D [1749 0 R /XYZ 56.6929 628.1106 null]
+2187 0 obj <<
+/D [2173 0 R /XYZ 56.6929 628.1106 null]
>> endobj
-1764 0 obj <<
-/D [1749 0 R /XYZ 56.6929 601.3909 null]
+2188 0 obj <<
+/D [2173 0 R /XYZ 56.6929 601.3909 null]
>> endobj
-1765 0 obj <<
-/D [1749 0 R /XYZ 56.6929 596.2225 null]
+2189 0 obj <<
+/D [2173 0 R /XYZ 56.6929 596.2225 null]
>> endobj
-1766 0 obj <<
-/D [1749 0 R /XYZ 56.6929 569.5028 null]
+2190 0 obj <<
+/D [2173 0 R /XYZ 56.6929 569.5028 null]
>> endobj
-1767 0 obj <<
-/D [1749 0 R /XYZ 56.6929 564.3344 null]
+2191 0 obj <<
+/D [2173 0 R /XYZ 56.6929 564.3344 null]
>> endobj
-1768 0 obj <<
-/D [1749 0 R /XYZ 56.6929 549.6297 null]
+2192 0 obj <<
+/D [2173 0 R /XYZ 56.6929 549.6297 null]
>> endobj
-1769 0 obj <<
-/D [1749 0 R /XYZ 56.6929 544.4015 null]
+2193 0 obj <<
+/D [2173 0 R /XYZ 56.6929 544.4015 null]
>> endobj
-1770 0 obj <<
-/D [1749 0 R /XYZ 56.6929 529.6968 null]
+2194 0 obj <<
+/D [2173 0 R /XYZ 56.6929 529.6968 null]
>> endobj
-1771 0 obj <<
-/D [1749 0 R /XYZ 56.6929 524.4686 null]
+2195 0 obj <<
+/D [2173 0 R /XYZ 56.6929 524.4686 null]
>> endobj
-1772 0 obj <<
-/D [1749 0 R /XYZ 56.6929 500.3989 null]
+2196 0 obj <<
+/D [2173 0 R /XYZ 56.6929 500.3989 null]
>> endobj
-1773 0 obj <<
-/D [1749 0 R /XYZ 56.6929 492.5805 null]
+2197 0 obj <<
+/D [2173 0 R /XYZ 56.6929 492.5805 null]
>> endobj
-1774 0 obj <<
-/D [1749 0 R /XYZ 56.6929 467.136 null]
+2198 0 obj <<
+/D [2173 0 R /XYZ 56.6929 467.136 null]
>> endobj
-1775 0 obj <<
-/D [1749 0 R /XYZ 56.6929 460.6924 null]
+2199 0 obj <<
+/D [2173 0 R /XYZ 56.6929 460.6924 null]
>> endobj
-1776 0 obj <<
-/D [1749 0 R /XYZ 56.6929 436.6227 null]
+2200 0 obj <<
+/D [2173 0 R /XYZ 56.6929 436.6227 null]
>> endobj
-1777 0 obj <<
-/D [1749 0 R /XYZ 56.6929 428.8043 null]
+2201 0 obj <<
+/D [2173 0 R /XYZ 56.6929 428.8043 null]
>> endobj
-1778 0 obj <<
-/D [1749 0 R /XYZ 56.6929 414.0996 null]
+2202 0 obj <<
+/D [2173 0 R /XYZ 56.6929 414.0996 null]
>> endobj
-1779 0 obj <<
-/D [1749 0 R /XYZ 56.6929 408.8714 null]
+2203 0 obj <<
+/D [2173 0 R /XYZ 56.6929 408.8714 null]
>> endobj
-1780 0 obj <<
-/D [1749 0 R /XYZ 56.6929 382.1516 null]
+2204 0 obj <<
+/D [2173 0 R /XYZ 56.6929 382.1516 null]
>> endobj
-1781 0 obj <<
-/D [1749 0 R /XYZ 56.6929 376.9833 null]
+2205 0 obj <<
+/D [2173 0 R /XYZ 56.6929 376.9833 null]
>> endobj
-1782 0 obj <<
-/D [1749 0 R /XYZ 56.6929 350.2636 null]
+2206 0 obj <<
+/D [2173 0 R /XYZ 56.6929 350.2636 null]
>> endobj
-1783 0 obj <<
-/D [1749 0 R /XYZ 56.6929 345.0952 null]
+2207 0 obj <<
+/D [2173 0 R /XYZ 56.6929 345.0952 null]
>> endobj
-1784 0 obj <<
-/D [1749 0 R /XYZ 56.6929 321.0255 null]
+2208 0 obj <<
+/D [2173 0 R /XYZ 56.6929 321.0255 null]
>> endobj
-1785 0 obj <<
-/D [1749 0 R /XYZ 56.6929 313.2071 null]
+2209 0 obj <<
+/D [2173 0 R /XYZ 56.6929 313.2071 null]
>> endobj
-1786 0 obj <<
-/D [1749 0 R /XYZ 56.6929 298.5024 null]
+2210 0 obj <<
+/D [2173 0 R /XYZ 56.6929 298.5024 null]
>> endobj
-1787 0 obj <<
-/D [1749 0 R /XYZ 56.6929 293.2742 null]
+2211 0 obj <<
+/D [2173 0 R /XYZ 56.6929 293.2742 null]
>> endobj
-1788 0 obj <<
-/D [1749 0 R /XYZ 56.6929 267.8297 null]
+2212 0 obj <<
+/D [2173 0 R /XYZ 56.6929 267.8297 null]
>> endobj
-1789 0 obj <<
-/D [1749 0 R /XYZ 56.6929 261.3861 null]
+2213 0 obj <<
+/D [2173 0 R /XYZ 56.6929 261.3861 null]
>> endobj
-1790 0 obj <<
-/D [1749 0 R /XYZ 56.6929 199.468 null]
+2214 0 obj <<
+/D [2173 0 R /XYZ 56.6929 199.468 null]
>> endobj
-1791 0 obj <<
-/D [1749 0 R /XYZ 56.6929 199.468 null]
+2215 0 obj <<
+/D [2173 0 R /XYZ 56.6929 199.468 null]
>> endobj
-1792 0 obj <<
-/D [1749 0 R /XYZ 56.6929 199.468 null]
+2216 0 obj <<
+/D [2173 0 R /XYZ 56.6929 199.468 null]
>> endobj
-1793 0 obj <<
-/D [1749 0 R /XYZ 56.6929 191.7053 null]
+2217 0 obj <<
+/D [2173 0 R /XYZ 56.6929 191.7053 null]
>> endobj
-1794 0 obj <<
-/D [1749 0 R /XYZ 56.6929 176.9408 null]
+2218 0 obj <<
+/D [2173 0 R /XYZ 56.6929 176.9408 null]
>> endobj
-1795 0 obj <<
-/D [1749 0 R /XYZ 56.6929 171.7724 null]
+2219 0 obj <<
+/D [2173 0 R /XYZ 56.6929 171.7724 null]
>> endobj
-1796 0 obj <<
-/D [1749 0 R /XYZ 56.6929 157.0677 null]
+2220 0 obj <<
+/D [2173 0 R /XYZ 56.6929 157.0677 null]
>> endobj
-1797 0 obj <<
-/D [1749 0 R /XYZ 56.6929 151.8395 null]
+2221 0 obj <<
+/D [2173 0 R /XYZ 56.6929 151.8395 null]
>> endobj
-1798 0 obj <<
-/D [1749 0 R /XYZ 56.6929 137.1348 null]
+2222 0 obj <<
+/D [2173 0 R /XYZ 56.6929 137.1348 null]
>> endobj
-1799 0 obj <<
-/D [1749 0 R /XYZ 56.6929 131.9066 null]
+2223 0 obj <<
+/D [2173 0 R /XYZ 56.6929 131.9066 null]
>> endobj
-1800 0 obj <<
-/D [1749 0 R /XYZ 56.6929 117.2018 null]
+2224 0 obj <<
+/D [2173 0 R /XYZ 56.6929 117.2018 null]
>> endobj
-1801 0 obj <<
-/D [1749 0 R /XYZ 56.6929 111.9736 null]
+2225 0 obj <<
+/D [2173 0 R /XYZ 56.6929 111.9736 null]
>> endobj
-1802 0 obj <<
-/D [1749 0 R /XYZ 56.6929 97.2091 null]
+2226 0 obj <<
+/D [2173 0 R /XYZ 56.6929 97.2091 null]
>> endobj
-1803 0 obj <<
-/D [1749 0 R /XYZ 56.6929 92.0407 null]
+2227 0 obj <<
+/D [2173 0 R /XYZ 56.6929 92.0407 null]
>> endobj
-1748 0 obj <<
-/Font << /F37 802 0 R /F21 714 0 R /F22 737 0 R /F39 899 0 R >>
+2172 0 obj <<
+/Font << /F37 1018 0 R /F21 930 0 R /F22 953 0 R /F39 1151 0 R >>
/ProcSet [ /PDF /Text ]
>> endobj
-1806 0 obj <<
-/Length 2545
+2230 0 obj <<
+/Length 2542
/Filter /FlateDecode
>>
stream
-xÚ¥ZKs㸾ûWè(U€ øÈM¶l&3¶#y²IÍî–`™ŠTHʳ³¿> âA" É¦|0 4ñýu7º›ÂxS‘$˜DIàQ„éd{¸B“=ÌÝ_a)3WBsSêúùê/w$š$^úáäùÕX+öPãÉóîÛtñôtû°\ýs6÷)š.¼Ùœ"¤Fon7³y&|‚ð©M¯WןW÷ëÅÓlj‡~E-–âfóõþþvó|+o×·‹åêáDðì·çOW·ÏúµÍ­aDø;ÿçêÛoh²ƒ~ºBIb:ù7ÈÃIâOW% Q#ùÕæêïzAc¶}tLU”ÄýhDW>ž`ì%”ú=eÑÄ ‰OZe-6b[GV¥MVµuWÃ[\ KˈðÇÈ2ýÛúîE~bbŠ¼8÷w€j™!*\v¨˜R/Ž5a—å!Í
-±ïtwÈŠ¬n`óeU‹±²ÓE{¿?e;æñwl ‡Ô â0†âë~â_<ñÿsÙÀš³(På;;¼°JÜá$Ž<«²8_ÚC݆”CáJJ«œ’È¡r´¡ô!¶Eí&øMy8”RñÚò–i“Š«»,gâê¦,~EÈߟbð¶ªf8žršF¨
-i’|œ8Hrà €-È_k©îòuà8‹<KkV˜z`Í÷²úwGQ¶eã…±ùA0~’|LYÞ(§Ó$­åô/ܪlÿÖXŠd/!˜û$ñ(…¼bø¼ˆ°ÂU6WH;Ìþ`Ì<4¹ÙYó%^Œð…LÁ”²³®¥4í±Oí´;¡;Þϰljï/`ça8}žaŒ}Þê%Œ@ù>š²—¿Îæ$𧫺>µV
-)ÒI8² ×à|
-ý¨ŸF,<•Âÿ”³Ÿå ØÅ%È<Aœˆê„YмbyÚ¨dµæœ!4ò/䦔Ì””®¦ t˜‘ Ú0£!¶ÅŒLð¯ukâ ‡*«suÈLn~
-örÚï9 # <‚ÍÄÃ^yÞ,¡´t’À®â
-¬¸ulH9”¬¤:-'WqBjb[ôl‚k}nNÇcY5u.ÓjðÃÊ¢oxaLýžg^ ©C•Õ[¥ôűÊr­qj׸{(Š/´zL)‡Æ•TW³Ž<Ö mh|ˆmѸ ¾še{ÕY¸NëìÌΞ*lóR¤³£­×´O£n$þ4=íßDR:fúö(Al8¾PN˜R"””&‚Ž*Ò m1Ķa‚ë!Ô9
-.¤¦”ƒ(%¥™‚³ÙÁ” Ú jˆmáÊ_ò/o<“mÝ$ átqjÞ@å œ8ïL ‰8ȯd“›ßDÓwÞoGßD!Ë~Ï«²´näz»˜¬ëQ§" s Ì8 :Ô’¯ðQ¬¾kÛß|Rä¢y¦žîB Ò· U”P¾ì™R"•”&2A.—sAD±-Dšà:§[=½‡*ãGG•u—ä}á¸çŸVó¬`ãßô—ð£s4§^ž*í©úB¹ÚêM°®œmÃŽ‘z
-Æâ¶SÊn Zʨ¢‡¢º³…3ìq[è [ðÃém×4»6zÂÿ{Vî«ôøNš‹‘ÏŽ3ô½˜ÒÄlŽâé'¼KÅ÷G–çr¦ýbâCµ¼};å09º‘òO9Ëš‚éïŽK.an)e èØ•EöAf:
-¿×ùJ8Œx ½àƒb%¥óž0rÊNhƒâ!¶…bü:+ô±õ9}aªfÎÎNÚÑšB¶@,õD$ãŸÁnªôû«è‘ìT08íOu£yH¬<@(A@¤›CÈ΂ê>IEŽ:Ú…Ûq0§ÀDNc8 Ï*D²÷MÉÿ›Å5 ʨ WÆy(ö{1°Wßõcå°Êš'néãE8›@Qd6=âDÐ÷éê–•ç¦|°çV7êsç)3~§ñé”ÿÌç'žVQ[G:Àÿß?È2ú“‘Gb[Ï… 2õ$R/Å7—$Ã7׿Ü:õÿo÷±endstream
-endobj
-1805 0 obj <<
+xÚ¥Z[w£º~ϯð£½Ö˜Jqé›'Og’ÔÎô´kÎy ¶â°ŠÁœ9s~}·Ð‘<=]yH>Øß¾c<Að‡'1õI‚I”E˜N¶‡+4ÙÃÞý–2s%47¥®Ÿ¯þrG¢Iâ%¡Nž_{ÅŠc<yÞ}›.žžn–«Îæ>EÓ…7›S„ÔêÍíf6„o¾¢éõêúóêñ~½xúø/qѯˆ¢ÅÃRœl¾Þßßnžoåéúv±\=܃žýöüéêöY?¶ùjþÌÿ¹úöšìà ?]!$1|‡äá$ñ'‡«€„¨•üjsõw}Cc·½tLU”ÄýhDW>ž`ì%”ú=eÑÄ ‰OZe-6⵬J›¬,jë[ Oq.-#À#KÈpôoë»Pùmˆ‰)òâžßªe†¨pØ¡bJ½8"Ô„]–‡4+Ä{§»CVdu/_VµX+;]´çûS¶cÆÁ+ázAÆð@ü¾„øOüÿ\6pÏY¨‡ò^X%ÎpGžUÙ@œ/mÈ¡nCÊ¡p%¥UNIäP¹ ÚPúÛ¢vü¦<J©xmyË´IÅÑ]–3qtS¿"äïO‚±x[U3O9M#T€2ƒ0 }*žfØO¦’kƪ†R¹÷¸mJƒŒ„XÉ èB¨2¥ìdh)MF‚};N莌3ìq2zà£dè0æÒ?ŠÝŸ¥ÄÇÔ ãØïS²Tl¤•éw쥚ÅÓSZýÐŒ„vF"xsŠâ ŒRF””bÄG9qAŒ ±-Œ˜àgÊ¿©²†U™t×Rëº,QÒƒô˜ «ÞYUF©(ŒÃ>×’‡/iQdÅ~ÀvÏqþ1£tšýž1‹ç8x}„¾@S'ä`I
+i’|œ8Hrà €-È_k©îòuà8‹<KkV˜z`Í÷²úwGQ¶eã…±ùA0žI>¦‡,o”Ói’ÖrûîGU¶k,E
+²WÌ}’x”B]1|DXáª
+)ÒI8² ×à|
+D}`k°ùzH‹v;–<óç‘<k˜¹mP7,ÏKÍt ²}Ó|Û«"
+éÿBp7¥Œ+)ƒrì Ümp>Ķn‚sF…‹±#ø4¥ w}vÓT`j¯K‚^ñÒ•‹µ±ŸïÄQ¾¯Ì‡‹è8:4‰8Œmúp€ÂŽq~ƒqq¯–p¾óE®nÒ#ü:O‹íkþáAL ƒº”ÍM);áZÊ ÜQ;¡;ÂÏ°Ç ï?ŠÛrÇx
+ÈLíª¯ÝƒïüÂÙ)óWy~„{¹ÿý_ýò£ Šòr,4æ0[ÄV>ýˆzQx)]˜Rv>µTÇ'uNèŽÏ3ìq>{à =}gE7½S.%«‚ó©êÏrjÇtå¬Q„Gõ1þYoÓm»›x1xé„´H!]Ò£ÈÑùp RÀN ä5ƒnŒ°­Q3+ZÄpEdôºP•:¢ þ0yCA»/ÁóêÁЯ%k”"J¼8 õ÷'IQ猣o(À±&B½
+endobj
+2229 0 obj <<
/Type /Page
-/Contents 1806 0 R
-/Resources 1804 0 R
+/Contents 2230 0 R
+/Resources 2228 0 R
/MediaBox [0 0 595.2756 841.8898]
-/Parent 1747 0 R
+/Parent 2112 0 R
>> endobj
-1807 0 obj <<
-/D [1805 0 R /XYZ 85.0394 794.5015 null]
+2231 0 obj <<
+/D [2229 0 R /XYZ 85.0394 794.5015 null]
>> endobj
-1808 0 obj <<
-/D [1805 0 R /XYZ 85.0394 748.4854 null]
+2232 0 obj <<
+/D [2229 0 R /XYZ 85.0394 748.4854 null]
>> endobj
-1809 0 obj <<
-/D [1805 0 R /XYZ 85.0394 748.4854 null]
+2233 0 obj <<
+/D [2229 0 R /XYZ 85.0394 748.4854 null]
>> endobj
-1810 0 obj <<
-/D [1805 0 R /XYZ 85.0394 748.4854 null]
+2234 0 obj <<
+/D [2229 0 R /XYZ 85.0394 748.4854 null]
>> endobj
-1811 0 obj <<
-/D [1805 0 R /XYZ 85.0394 743.3452 null]
+2235 0 obj <<
+/D [2229 0 R /XYZ 85.0394 743.3452 null]
>> endobj
-1812 0 obj <<
-/D [1805 0 R /XYZ 85.0394 728.6405 null]
+2236 0 obj <<
+/D [2229 0 R /XYZ 85.0394 728.6405 null]
>> endobj
-1813 0 obj <<
-/D [1805 0 R /XYZ 85.0394 723.1655 null]
+2237 0 obj <<
+/D [2229 0 R /XYZ 85.0394 723.1655 null]
>> endobj
-1814 0 obj <<
-/D [1805 0 R /XYZ 85.0394 708.4607 null]
+2238 0 obj <<
+/D [2229 0 R /XYZ 85.0394 708.4607 null]
>> endobj
-1815 0 obj <<
-/D [1805 0 R /XYZ 85.0394 702.9857 null]
+2239 0 obj <<
+/D [2229 0 R /XYZ 85.0394 702.9857 null]
>> endobj
-1816 0 obj <<
-/D [1805 0 R /XYZ 85.0394 688.2211 null]
+2240 0 obj <<
+/D [2229 0 R /XYZ 85.0394 688.2211 null]
>> endobj
-1817 0 obj <<
-/D [1805 0 R /XYZ 85.0394 682.8059 null]
+2241 0 obj <<
+/D [2229 0 R /XYZ 85.0394 682.8059 null]
>> endobj
-1818 0 obj <<
-/D [1805 0 R /XYZ 85.0394 668.0414 null]
+2242 0 obj <<
+/D [2229 0 R /XYZ 85.0394 668.0414 null]
>> endobj
-1819 0 obj <<
-/D [1805 0 R /XYZ 85.0394 662.6262 null]
+2243 0 obj <<
+/D [2229 0 R /XYZ 85.0394 662.6262 null]
>> endobj
-1820 0 obj <<
-/D [1805 0 R /XYZ 85.0394 599.7666 null]
+2244 0 obj <<
+/D [2229 0 R /XYZ 85.0394 599.7666 null]
>> endobj
-1821 0 obj <<
-/D [1805 0 R /XYZ 85.0394 599.7666 null]
+2245 0 obj <<
+/D [2229 0 R /XYZ 85.0394 599.7666 null]
>> endobj
-1822 0 obj <<
-/D [1805 0 R /XYZ 85.0394 599.7666 null]
+2246 0 obj <<
+/D [2229 0 R /XYZ 85.0394 599.7666 null]
>> endobj
-1823 0 obj <<
-/D [1805 0 R /XYZ 85.0394 591.7571 null]
+2247 0 obj <<
+/D [2229 0 R /XYZ 85.0394 591.7571 null]
>> endobj
-1824 0 obj <<
-/D [1805 0 R /XYZ 85.0394 565.0374 null]
+2248 0 obj <<
+/D [2229 0 R /XYZ 85.0394 565.0374 null]
>> endobj
-1825 0 obj <<
-/D [1805 0 R /XYZ 85.0394 559.6222 null]
+2249 0 obj <<
+/D [2229 0 R /XYZ 85.0394 559.6222 null]
>> endobj
-1826 0 obj <<
-/D [1805 0 R /XYZ 85.0394 534.1777 null]
+2250 0 obj <<
+/D [2229 0 R /XYZ 85.0394 534.1777 null]
>> endobj
-1827 0 obj <<
-/D [1805 0 R /XYZ 85.0394 527.4872 null]
+2251 0 obj <<
+/D [2229 0 R /XYZ 85.0394 527.4872 null]
>> endobj
-1828 0 obj <<
-/D [1805 0 R /XYZ 85.0394 502.0427 null]
+2252 0 obj <<
+/D [2229 0 R /XYZ 85.0394 502.0427 null]
>> endobj
-1829 0 obj <<
-/D [1805 0 R /XYZ 85.0394 495.3523 null]
+2253 0 obj <<
+/D [2229 0 R /XYZ 85.0394 495.3523 null]
>> endobj
-1830 0 obj <<
-/D [1805 0 R /XYZ 85.0394 420.5376 null]
+2254 0 obj <<
+/D [2229 0 R /XYZ 85.0394 420.5376 null]
>> endobj
-1831 0 obj <<
-/D [1805 0 R /XYZ 85.0394 420.5376 null]
+2255 0 obj <<
+/D [2229 0 R /XYZ 85.0394 420.5376 null]
>> endobj
-1832 0 obj <<
-/D [1805 0 R /XYZ 85.0394 420.5376 null]
+2256 0 obj <<
+/D [2229 0 R /XYZ 85.0394 420.5376 null]
>> endobj
-1833 0 obj <<
-/D [1805 0 R /XYZ 85.0394 412.5281 null]
+2257 0 obj <<
+/D [2229 0 R /XYZ 85.0394 412.5281 null]
>> endobj
-1834 0 obj <<
-/D [1805 0 R /XYZ 85.0394 388.4584 null]
+2258 0 obj <<
+/D [2229 0 R /XYZ 85.0394 388.4584 null]
>> endobj
-1835 0 obj <<
-/D [1805 0 R /XYZ 85.0394 380.3932 null]
+2259 0 obj <<
+/D [2229 0 R /XYZ 85.0394 380.3932 null]
>> endobj
-1836 0 obj <<
-/D [1805 0 R /XYZ 85.0394 365.6884 null]
+2260 0 obj <<
+/D [2229 0 R /XYZ 85.0394 365.6884 null]
>> endobj
-1837 0 obj <<
-/D [1805 0 R /XYZ 85.0394 360.2134 null]
+2261 0 obj <<
+/D [2229 0 R /XYZ 85.0394 360.2134 null]
>> endobj
-1838 0 obj <<
-/D [1805 0 R /XYZ 85.0394 345.4488 null]
+2262 0 obj <<
+/D [2229 0 R /XYZ 85.0394 345.4488 null]
>> endobj
-1839 0 obj <<
-/D [1805 0 R /XYZ 85.0394 340.0336 null]
+2263 0 obj <<
+/D [2229 0 R /XYZ 85.0394 340.0336 null]
>> endobj
-1840 0 obj <<
-/D [1805 0 R /XYZ 85.0394 325.269 null]
+2264 0 obj <<
+/D [2229 0 R /XYZ 85.0394 325.269 null]
>> endobj
-1841 0 obj <<
-/D [1805 0 R /XYZ 85.0394 319.8539 null]
+2265 0 obj <<
+/D [2229 0 R /XYZ 85.0394 319.8539 null]
>> endobj
-1842 0 obj <<
-/D [1805 0 R /XYZ 85.0394 295.7842 null]
+2266 0 obj <<
+/D [2229 0 R /XYZ 85.0394 295.7842 null]
>> endobj
-1843 0 obj <<
-/D [1805 0 R /XYZ 85.0394 287.7189 null]
+2267 0 obj <<
+/D [2229 0 R /XYZ 85.0394 287.7189 null]
>> endobj
-1844 0 obj <<
-/D [1805 0 R /XYZ 85.0394 272.9543 null]
+2268 0 obj <<
+/D [2229 0 R /XYZ 85.0394 272.9543 null]
>> endobj
-1845 0 obj <<
-/D [1805 0 R /XYZ 85.0394 267.5392 null]
+2269 0 obj <<
+/D [2229 0 R /XYZ 85.0394 267.5392 null]
>> endobj
-1846 0 obj <<
-/D [1805 0 R /XYZ 85.0394 252.7746 null]
+2270 0 obj <<
+/D [2229 0 R /XYZ 85.0394 252.7746 null]
>> endobj
-1847 0 obj <<
-/D [1805 0 R /XYZ 85.0394 247.3594 null]
+2271 0 obj <<
+/D [2229 0 R /XYZ 85.0394 247.3594 null]
>> endobj
-1848 0 obj <<
-/D [1805 0 R /XYZ 85.0394 223.2897 null]
+2272 0 obj <<
+/D [2229 0 R /XYZ 85.0394 223.2897 null]
>> endobj
-1849 0 obj <<
-/D [1805 0 R /XYZ 85.0394 215.2245 null]
+2273 0 obj <<
+/D [2229 0 R /XYZ 85.0394 215.2245 null]
>> endobj
-1850 0 obj <<
-/D [1805 0 R /XYZ 85.0394 149.4956 null]
+2274 0 obj <<
+/D [2229 0 R /XYZ 85.0394 149.4956 null]
>> endobj
-1851 0 obj <<
-/D [1805 0 R /XYZ 85.0394 149.4956 null]
+2275 0 obj <<
+/D [2229 0 R /XYZ 85.0394 149.4956 null]
>> endobj
-1852 0 obj <<
-/D [1805 0 R /XYZ 85.0394 149.4956 null]
+2276 0 obj <<
+/D [2229 0 R /XYZ 85.0394 149.4956 null]
>> endobj
-1853 0 obj <<
-/D [1805 0 R /XYZ 85.0394 144.3554 null]
+2277 0 obj <<
+/D [2229 0 R /XYZ 85.0394 144.3554 null]
>> endobj
-1854 0 obj <<
-/D [1805 0 R /XYZ 85.0394 120.2857 null]
+2278 0 obj <<
+/D [2229 0 R /XYZ 85.0394 120.2857 null]
>> endobj
-1855 0 obj <<
-/D [1805 0 R /XYZ 85.0394 112.2205 null]
+2279 0 obj <<
+/D [2229 0 R /XYZ 85.0394 112.2205 null]
>> endobj
-1856 0 obj <<
-/D [1805 0 R /XYZ 85.0394 97.4559 null]
+2280 0 obj <<
+/D [2229 0 R /XYZ 85.0394 97.4559 null]
>> endobj
-1857 0 obj <<
-/D [1805 0 R /XYZ 85.0394 92.0407 null]
+2281 0 obj <<
+/D [2229 0 R /XYZ 85.0394 92.0407 null]
>> endobj
-1804 0 obj <<
-/Font << /F37 802 0 R /F21 714 0 R /F22 737 0 R /F39 899 0 R >>
+2228 0 obj <<
+/Font << /F37 1018 0 R /F21 930 0 R /F22 953 0 R /F39 1151 0 R >>
/ProcSet [ /PDF /Text ]
>> endobj
-1860 0 obj <<
-/Length 2121
+2284 0 obj <<
+/Length 2928
/Filter /FlateDecode
>>
stream
-xÚ¥YIs㸾ûWèª*B°pÍM¶ÔŽ»=¶cy*™t÷¦`‰eŠÔˆ”»5¿>x J$5•”Äòà}x 6¢ðc#Ï'~Ä£Q¹Ä£Ì%›+:ZÁÜí34“šhbS]¿\ýí“F‰|î^Þ,Y!¡aÈF/˯Δ2 Ô¹¾»¾¿{¼}ž>ýã·ñ„{ÔùF=:}˜agñëíí|ñ27Ýçùtv÷p $l< üˆ:Ó§§ùÃìîß8?URi3z3_Œ¿¿|¾š¿4˶·Æ¨Pkþýêëw:ZÂ?_Q"¢Ðý€%,Šøhsåz‚x®õHvµ¸úg#Кլ¦b”páó[q6bŒDžÇ[Æò"â .´±_Ë"“•\âg c™ìwiu0¦ùtSönV¸Ð Ñ-*\ﱦRKû
-Z9õ½ï§šç`/VÝPë‘¥›ñ€x<hëž›8ÍÇ—Sç!ÞHÕbÎâPVrƒ£G©™ùÏJæeZäÚL'»c!%Aø°.%û¯Àâ gF k\VYü.Ç g\GìÆ,t–¨'ÎMãÆЉ÷o›87R>Çù>Þ”VØr­hÒÀúà\¤=ê’ê
-›ª‹†ªÃ~4¨úˆÆ™îN8Zº/Û¿h†ý($Š¼ÿƒ_bÝMÖ Q?~H"\ÈK6Õ
-¸÷‹Š{Jð/qYÊŽéZA/‰E©¢
-\§Il‡·îLx‹j
-aÜo汆ÆÙ3¨¢sõd¥Ë*^ÉÛXxùÎR~ȬتýÁŠüˆ9w›m&U¿Øé½cïU¢Àâ,pò¢2ª‹ö6°L@ÎU\¿²q8.€6býN}×I?âL¥°Ž ®üHU®‹}fFµVÕx•øý}_à»*ê¬cIj†\m­17ÂÞÔ©ÏpÐƺû<3ú$)6“.|¶qžjéŒ:¯ü≀Æ2-“,N7:‡ê‰¸jH ññBçç®:s%võrá‹(+$-K¢èp
-uüa„ÄøÉÒ7YÂò°§O+|Ëô'66E^­ /œ÷z‰?Ö)\6;6jVìÙ+†ÎRZ/ÙÉT[?뙉WÃ
-BRSOÄú1£ì ô<(AD]­Xx©°óZìM¬¸¾{˜åºP¬ú\J"VßCÞäN¹Qï3;¡Ô»pý²©Î“ ì‚
-ÓÙ„õç‘A­Ç<r¦¶3´´b¡žq+êÛ–²íC@ …ñç)ÞgÈ4ÍàÂõlj¤8Nš¼ëøýût¯™ çö°KWk\F,an¨þ^¡æ9Á%@?.aÂIàG°O‹îe^×å€ÃúúdQâÚò5.«b[èhAöfúwœyüË3¤™yÂçžÒur¥kª‘)\+’ÎrÙ[tÀaUuàE›cýÿ/eU/aßU„f¿^”6 ¥gK¯ÿÁ:_ûl«½endstream
-endobj
-1859 0 obj <<
+xÚ¥ZKs㸾ûWèºjÅ
+<ÃL[µFÛ„¦2q¦âØ—r“§Ôùm»”m6dÂ]ßK, Õ\—¾HMÖ(êÞl[ç5Gñcᆰñq<l®Óxt\ñ¦QÕ<ÞéÄ£§ûüù÷Ã͸7EÂM’àÀàW©ºéºÃ!9Cè»O£38X\#8.ƒƒ`,ÁaLµ…ñîalÝÇlT»ÃAÄ‘ó 2Ââæ
+Z\sä«2/WÔ™íÚu¥øßãä…’Vb=Ïs>¸4ñŸ—^³¢
+>4°îëEáz—S×綹e¦%]×ò¹*©^a ÆT6Z³âÀÌ‚6•}·×>”Ý!AGµ«Ýj=]â"¾Uõ‹*Aqþ²Jw¨LÿªúÄñ¾æ›r•—YVëéú°eóBÌpÜäÂøÚÄatÑãë{‘^£*abG]*£ÈÉ 
+-S¢&ôjô°§Š[š^@-]âó•"6­\e µ©ü
+eöšÕ÷+
+îÜn¶E†ýªÖÒ»ó‰©Üa¢ -rʪժ«þ6š¹’æÅÍs,¨!ÕW8æÆ“¿Êm)61!Rõÿž¸šuµ+4UiÅÆSFß?v½±£Êj@KsMòÕù(¥öŒV_Ñƺ»²€cÖüiZm¦Cøle™+éœ9O{ú’E@c™7i!óÊ¡j@¶‹f>!t¾yž6×PW-¾„bµ"Ö¦q‘†è¡±–¯Zˆ¤O‘?g ,zÊZáÛä?¨±©Êv­ç‚½›%¾­s¸rlT¯8°W ef½jwG†mõ¸§žôT’ëzBª'f08°÷AAè p"Lµbá…aç©ÚéX¡~èäÂÄ;¹ž véëÈsV£|s÷"Ïeqäg›ë}6᜹À&ÂT:á§ɨÖC"y§v0‘ô´R"aö+ÚGe/:„ì +äÃœ¹+hÒ¬€{ןG’®À,œ<}Qú_òNä>”œÛ}¯Ö*»LxÃükaú‘Ò
+¥ë,ž'šž^¦°ƒŽ_R‡­„>+²(»¡°Ä¼Õ2r•´0b¯P+Ê3=ØTô¥¸E-ŒØJ¥VŒ¡—'/ôvEÙæœâýt+ëVåv[äôzÖ Å™MÕ…À)“M^à 1ÊßošžÊ¢ *¬hC´ÃFuxZ‘ƒQv{BŠŠ© ÓvÞ÷±0Àª& •kã^.õS…RUiªÑ½‘ÿQIh
+® ,¸è«ª íEšN¡hKÂsÚZ–LµYÃÈ[Þ®©%éƒÞš§»BÖÔo²úõPá óAÖ²û9Ø(ããûÃ÷VSì¡Á ø9-]@ öné>Ã
+\˜šE©º¬ôxéæ‚Þ¯ý¿Ô! Jendstream
+endobj
+2283 0 obj <<
/Type /Page
-/Contents 1860 0 R
-/Resources 1858 0 R
+/Contents 2284 0 R
+/Resources 2282 0 R
/MediaBox [0 0 595.2756 841.8898]
-/Parent 1747 0 R
+/Parent 2112 0 R
>> endobj
-1861 0 obj <<
-/D [1859 0 R /XYZ 56.6929 794.5015 null]
+2285 0 obj <<
+/D [2283 0 R /XYZ 56.6929 794.5015 null]
>> endobj
-1862 0 obj <<
-/D [1859 0 R /XYZ 56.6929 749.4437 null]
+2286 0 obj <<
+/D [2283 0 R /XYZ 56.6929 749.0089 null]
>> endobj
-1863 0 obj <<
-/D [1859 0 R /XYZ 56.6929 749.4437 null]
+2287 0 obj <<
+/D [2283 0 R /XYZ 56.6929 749.0089 null]
>> endobj
-1864 0 obj <<
-/D [1859 0 R /XYZ 56.6929 749.4437 null]
+2288 0 obj <<
+/D [2283 0 R /XYZ 56.6929 749.0089 null]
>> endobj
-1865 0 obj <<
-/D [1859 0 R /XYZ 56.6929 746.6461 null]
+2289 0 obj <<
+/D [2283 0 R /XYZ 56.6929 745.2843 null]
>> endobj
-1866 0 obj <<
-/D [1859 0 R /XYZ 56.6929 722.5763 null]
+2290 0 obj <<
+/D [2283 0 R /XYZ 56.6929 721.2146 null]
>> endobj
-1867 0 obj <<
-/D [1859 0 R /XYZ 56.6929 716.7581 null]
+2291 0 obj <<
+/D [2283 0 R /XYZ 56.6929 714.4694 null]
>> endobj
-1868 0 obj <<
-/D [1859 0 R /XYZ 56.6929 701.9936 null]
+2292 0 obj <<
+/D [2283 0 R /XYZ 56.6929 699.7048 null]
>> endobj
-1869 0 obj <<
-/D [1859 0 R /XYZ 56.6929 698.8254 null]
+2293 0 obj <<
+/D [2283 0 R /XYZ 56.6929 695.6096 null]
>> endobj
-1870 0 obj <<
-/D [1859 0 R /XYZ 56.6929 684.1207 null]
+2294 0 obj <<
+/D [2283 0 R /XYZ 56.6929 680.9049 null]
>> endobj
-1871 0 obj <<
-/D [1859 0 R /XYZ 56.6929 680.8926 null]
+2295 0 obj <<
+/D [2283 0 R /XYZ 56.6929 676.7499 null]
>> endobj
-1872 0 obj <<
-/D [1859 0 R /XYZ 56.6929 656.8229 null]
+2296 0 obj <<
+/D [2283 0 R /XYZ 56.6929 652.6802 null]
>> endobj
-1873 0 obj <<
-/D [1859 0 R /XYZ 56.6929 651.0047 null]
+2297 0 obj <<
+/D [2283 0 R /XYZ 56.6929 645.935 null]
>> endobj
-1874 0 obj <<
-/D [1859 0 R /XYZ 56.6929 636.3 null]
+2298 0 obj <<
+/D [2283 0 R /XYZ 56.6929 631.2303 null]
>> endobj
-1875 0 obj <<
-/D [1859 0 R /XYZ 56.6929 633.072 null]
+2299 0 obj <<
+/D [2283 0 R /XYZ 56.6929 627.0752 null]
>> endobj
-1876 0 obj <<
-/D [1859 0 R /XYZ 56.6929 609.0023 null]
+2300 0 obj <<
+/D [2283 0 R /XYZ 56.6929 603.0055 null]
>> endobj
-1877 0 obj <<
-/D [1859 0 R /XYZ 56.6929 603.184 null]
+2301 0 obj <<
+/D [2283 0 R /XYZ 56.6929 596.2603 null]
>> endobj
-1878 0 obj <<
-/D [1859 0 R /XYZ 56.6929 579.1143 null]
+2302 0 obj <<
+/D [2283 0 R /XYZ 56.6929 572.1906 null]
>> endobj
-1879 0 obj <<
-/D [1859 0 R /XYZ 56.6929 573.2961 null]
+2303 0 obj <<
+/D [2283 0 R /XYZ 56.6929 565.4454 null]
>> endobj
-1880 0 obj <<
-/D [1859 0 R /XYZ 56.6929 558.5914 null]
+2304 0 obj <<
+/D [2283 0 R /XYZ 56.6929 550.7407 null]
>> endobj
-1881 0 obj <<
-/D [1859 0 R /XYZ 56.6929 555.3634 null]
+2305 0 obj <<
+/D [2283 0 R /XYZ 56.6929 546.5857 null]
>> endobj
-1882 0 obj <<
-/D [1859 0 R /XYZ 56.6929 540.5988 null]
+2306 0 obj <<
+/D [2283 0 R /XYZ 56.6929 531.8211 null]
>> endobj
-1883 0 obj <<
-/D [1859 0 R /XYZ 56.6929 537.4306 null]
+2307 0 obj <<
+/D [2283 0 R /XYZ 56.6929 527.7259 null]
>> endobj
-1884 0 obj <<
-/D [1859 0 R /XYZ 56.6929 510.7109 null]
+2308 0 obj <<
+/D [2283 0 R /XYZ 56.6929 501.0062 null]
>> endobj
-1885 0 obj <<
-/D [1859 0 R /XYZ 56.6929 507.5427 null]
+2309 0 obj <<
+/D [2283 0 R /XYZ 56.6929 496.911 null]
>> endobj
-642 0 obj <<
-/D [1859 0 R /XYZ 56.6929 477.5928 null]
+770 0 obj <<
+/D [2283 0 R /XYZ 56.6929 464.7873 null]
>> endobj
-1886 0 obj <<
-/D [1859 0 R /XYZ 56.6929 453.2532 null]
+2310 0 obj <<
+/D [2283 0 R /XYZ 56.6929 439.0859 null]
>> endobj
-646 0 obj <<
-/D [1859 0 R /XYZ 56.6929 369.7201 null]
+774 0 obj <<
+/D [2283 0 R /XYZ 56.6929 352.4521 null]
>> endobj
-1887 0 obj <<
-/D [1859 0 R /XYZ 56.6929 345.3805 null]
+2311 0 obj <<
+/D [2283 0 R /XYZ 56.6929 326.7507 null]
>> endobj
-1888 0 obj <<
-/D [1859 0 R /XYZ 56.6929 310.6805 null]
+2312 0 obj <<
+/D [2283 0 R /XYZ 56.6929 290.6891 null]
>> endobj
-1889 0 obj <<
-/D [1859 0 R /XYZ 56.6929 310.6805 null]
+2313 0 obj <<
+/D [2283 0 R /XYZ 56.6929 290.6891 null]
>> endobj
-1890 0 obj <<
-/D [1859 0 R /XYZ 56.6929 310.6805 null]
+2314 0 obj <<
+/D [2283 0 R /XYZ 56.6929 290.6891 null]
>> endobj
-1891 0 obj <<
-/D [1859 0 R /XYZ 56.6929 310.6805 null]
+2315 0 obj <<
+/D [2283 0 R /XYZ 56.6929 290.6891 null]
>> endobj
-1858 0 obj <<
-/Font << /F37 802 0 R /F21 714 0 R /F22 737 0 R /F39 899 0 R /F14 740 0 R >>
+778 0 obj <<
+/D [2283 0 R /XYZ 56.6929 241.4457 null]
+>> endobj
+2316 0 obj <<
+/D [2283 0 R /XYZ 56.6929 201.7704 null]
+>> endobj
+2282 0 obj <<
+/Font << /F37 1018 0 R /F21 930 0 R /F22 953 0 R /F39 1151 0 R /F14 956 0 R >>
/ProcSet [ /PDF /Text ]
>> endobj
-1894 0 obj <<
+2319 0 obj <<
+/Length 2294
+/Filter /FlateDecode
+>>
+stream
+xÚ¥]sã6î=¿Â9yf­"õÕ·ìn¶“¶—Ë9éLov÷A–¨˜]Yrõa×ÿþ
+S ÃH:t Eô[óRít¦2pRîú´VZìKE–
+NP˜d»¤L•%ÎUÒvVž%Íi¯93"(èŠéA·¨û M—®iKb1i’®AÐÆ„žº >y¨OøÆ&™sgg$rjñÍØ°r?„Z.ÒªL»šø”-úbQæ~­Jz#aÿÈÏìi’î÷h+¾+'¯¤ÙªTaÌSjã¾”~‚X¸’ þz"S½œª7Á«R‰àBìd"8{ƒF |GýµUµÆ8N
+Âä5DÒ¾ª¿ákà´¡›n»­0iàKï¡È`{ »î\'VˆuJ€â4hHuÙ˘À®¤ù6åuÍ¡iÕÆÜè6ê/1Ÿ-<0 ÈÖÓ†PˆÀ;9ƒ2õP«ZýÙéF·Êr[Dy¾x>íüéþ78‹' U}Có<ò"ÀŸ'2ÂÁsÕiÌ°œp``2Àc ºsoIX¥œŒ‰jxZ»iLˆÔX€¦ÕEAK+un÷ïµ 5ädØOø}{Øâ1¼( 
+
+(„bzØŽàr^CWbøà5sr
+|4
+bsب–
+7™06— z[_ÚT(c›¹$³­4;E+X& ›%‡"óÀÐ 5Ô H²RÏu‡l»‘ ù© èj$5.’û4-È¡ƒì1á<k´“Žˆôã;%Lטn ©Íyåi_„xr0\HŠ¦"he%ØÌj8ÑÝöœ&RÐÈþ9eCñzzÇ…®Û(E/+UTû¡ùŽ 6¨ïJ輋ÿ1ªÓŒž¯ûå8X ¤IÖ÷F®çÖ°õ›ÍK©æ¥Zýv!˜œÌlö{s#žÊ
+²y<ChR µJH%âWÇ«jØb€;WP§ªbu8›ZÎURC—iÑÁ„&L^š
+P#¢ &6æ0wV}-±b]íO«–í%9µ2¶žTû¾Ò“žAäíEÑѣ̀~ãÊ»Ì^¹¾'åe ±)ìúŸ`ÖnqaSx¿áÄ«¶´¥$ÓÕå„á#áQàY1Ó½|Os‘ï¤Íw¿”Æ
+惒ÊáNšë¥jÚZÓ‡„—8@Ääܘêån zs€{Uêq€»;9Àˆýp2ßh0á–ÂCP˜XÃg‰±ˆ€âLî€×Û Èwƒã´‚ðYÝ26iàÞ.‘ØO|)Úˆ8ñKD˜‰••@Åt"'%M_ñX¨Ù«9÷}WúL¾qŸ#ªWzû>_“:ºÏs±Ó÷9K^"áÐtÀ¼¿TF¹ ‘Ë¥é:$ã˜b¯¦m‹ì›ýpG'ßNìWšèäúÍÖ’žm/zèᢋÛYìÜå´dF+ö‰™Ú¡¾™ 8¢oX/dîpŠ³:áØ8Ò WÐBi:–Ž™ .Ó>÷7ŠCßfœÈ²‰œ#„‰¸§Ú¯ua‡H;B£x“kéƒÞqàõÁûxÁÏD‚…¶êÚ³IÙªJ¹’Ì Exêìc…±dÐż³@©ß•%±3Hqøñ….oÔ~½9»åη¨ks“ÓÛ;‚W%0þ5=ÿ}Ï ÷Âòÿ?]¾}¾‘Ž_§œòÕVx*åW1ùQž %ìoÿ{☻dèŠ(ò¦sˆ€\Sï…
+qÏ??º/ PG^8qöÿIì»äendstream
+endobj
+2318 0 obj <<
+/Type /Page
+/Contents 2319 0 R
+/Resources 2317 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 2112 0 R
+>> endobj
+2320 0 obj <<
+/D [2318 0 R /XYZ 85.0394 794.5015 null]
+>> endobj
+782 0 obj <<
+/D [2318 0 R /XYZ 85.0394 662.3711 null]
+>> endobj
+2321 0 obj <<
+/D [2318 0 R /XYZ 85.0394 634.4781 null]
+>> endobj
+786 0 obj <<
+/D [2318 0 R /XYZ 85.0394 566.8617 null]
+>> endobj
+2322 0 obj <<
+/D [2318 0 R /XYZ 85.0394 536.3186 null]
+>> endobj
+790 0 obj <<
+/D [2318 0 R /XYZ 85.0394 411.7882 null]
+>> endobj
+2323 0 obj <<
+/D [2318 0 R /XYZ 85.0394 386.7645 null]
+>> endobj
+794 0 obj <<
+/D [2318 0 R /XYZ 85.0394 230.2565 null]
+>> endobj
+2324 0 obj <<
+/D [2318 0 R /XYZ 85.0394 203.9874 null]
+>> endobj
+2317 0 obj <<
+/Font << /F37 1018 0 R /F14 956 0 R /F22 953 0 R /F21 930 0 R /F41 1208 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+2327 0 obj <<
+/Length 2527
+/Filter /FlateDecode
+>>
+stream
+xÚ¥koÛ8ò{~…±8àd bùгßÒ6=d»Èöììí.Ú~-Ù*K^INâýõ7Ã!eÉ–®*r8œçI‹ ‡?1ñÄ2ž„±Ç|.üÉr{Ã'kXû×08®ErûXïoÞ~Rá$fq ƒÉãªG+b<ŠÄä1ýêÜ2MwÞß?|œºÒçNLŸsürÿ~v;›ªÐù“
+íp_¦Y]ô>œÓš,“’8Naväí,ö- €Á ˜Ýee–÷e²èv—mV¯’¥™¶'ë¡t²­²¤ÝeY°KFÄ!SxòU«êc]6«ë5»ºÊ´3¬3¦£–5`:û·+Eà€÷ ù¤Q€h‹@€±ˆ,%x^˜4
+¦Â¡[
+Žù¡FÏ -iÇ(Êš¤OU²Ôœ Vσ¢D;3 NŠ„® uú‚…Ö
+A! zBΪª zÊaÄwIl3H’ ²R7IK#«pˆ1‚¾‡JʤM.“]²È‹¼=Ð<QÊF,\zÔya`,öºu1ƒâA\R ²¾ræ»l™#d ^Eæ
+ÑPùB‡w䟛a
+‡P€bPœÆD”µO†mÇhJS¾N°ò,§&§Í“íÎ64·ý*íÕ„6¯Ð
+×–¡ià¸WéÀDÆ5·† ¶ûã]ÈÒï ÷†€u½Þf «)AôÑq@h+ÓÑA‚Ę$M˜EQ=w¬ˆ‘À"§‹:ÏVcy-ÍšeïŽ×lm¡±¾ÑSñt © S’Ü?ê› £qÒÖ;2éÄøO~¼S€Ã¨>ö?Ø·”+_½˜{ôBJ7È^ ‘ ôáí)
+)‚Mþ//€’ÅQ¿ÿ¹E·Oò<8Â
+ävXíÐð0Išõ›  ±ÕFM-‡ÇJ ðk¿ãètw«é¬÷˜Øšwg=§
+
+H¨ã
+e0ì>Ùr${ÑÁãÍðÍtÜŠzéÙüDñùîÏ¡9rP#nßÔ“±ÏOè(µ”GµMo£g~ÿÑèþ¾–Ž¥4úøôyyyI´î KyÅK¶˜¦C7c§±¯ë)ÆãØ£‘8hyøíÎ,|¦ïO ðOcŸõ;²2ˆm–h CnÚwš‡i3ÁE HèówUfÿ4ûðU‚ð`¡É×%Ý(í6O!•î‰%[VÏ¥!Ø£Ò``Û.X»+ÛÚÐÝUù‡ž×]DÎïa38îÈË­-Õ6oé+ª&i6‰ ‰yÊÄ_ì E\áê⃣òþR5âѼ«ÃÿïÄŽ/—T•Ñ¥^A†Ð±Ä06B¡„ Î#©ùéì\öÿ=- endstream
+endobj
+2326 0 obj <<
+/Type /Page
+/Contents 2327 0 R
+/Resources 2325 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 2333 0 R
+/Annots [ 2330 0 R ]
+>> endobj
+2330 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [344.9397 501.3201 406.1397 512.7122]
+/Subtype /Link
+/A << /S /GoTo /D (trusted-keys) >>
+>> endobj
+2328 0 obj <<
+/D [2326 0 R /XYZ 56.6929 794.5015 null]
+>> endobj
+798 0 obj <<
+/D [2326 0 R /XYZ 56.6929 609.3932 null]
+>> endobj
+2329 0 obj <<
+/D [2326 0 R /XYZ 56.6929 583.208 null]
+>> endobj
+802 0 obj <<
+/D [2326 0 R /XYZ 56.6929 484.1849 null]
+>> endobj
+2331 0 obj <<
+/D [2326 0 R /XYZ 56.6929 454.463 null]
+>> endobj
+806 0 obj <<
+/D [2326 0 R /XYZ 56.6929 405.4622 null]
+>> endobj
+2332 0 obj <<
+/D [2326 0 R /XYZ 56.6929 378.8348 null]
+>> endobj
+2325 0 obj <<
+/Font << /F37 1018 0 R /F41 1208 0 R /F14 956 0 R /F22 953 0 R /F21 930 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+2336 0 obj <<
+/Length 2458
+/Filter /FlateDecode
+>>
+stream
+xÚÍZ[oÛ:~ϯðÛq€c–w‰yKÛì"»9Ù&vÑöA±åD¨,¹’œË¿ß!‡TD[¶Hv±(ZÓähøif8ó k6¡ð‡MRE¨0r’Iej2_ÐÉ=¬ýõ„y™Yš ¥>Þž|ø‹H&†Íõäv9Еš¦lr»ø6=¿¾¾¸ú|ùÏÓWtzNNgŠÒ0ûéâætÆdb8¬H»¦éôãåÕg”6øñùê»üøåüË©H¦ÿ‰›¯×׺‰ÛÓ·œ\Üö ‡/ƨ°ˆ|ûA' x¿?N(&U“'øB 3†OV'R ¢¤a¦<¹9ùG¯p°ê3”T)Q\êÉ „ÁNlÜœ”Pæ™%’™jÙ›“³1s)kÎY‹o¾¨WYQee·ýâLJ’JÀ0Ô~ìÕ91išŽ¿ø¬×x08’¤B¨q›7y³ƒ2Ñà–„½#Ê ñÊÄj”‰Qf‹E“·í6LÎ1JšæŽC{©‘­ù`kÎRb„[Zçóbù~fšÁ‡¤`´uÖd]Ž“Í)K§ù|Ó´Å£ŸòVu»“h[\\Ö º‡Üë³{|§”Ïqá;çCÈŽàà šL/žgöýÁ”p843ÆàÅG­Öe~¢Œöa˜?»Y2¯WgœRv¶¸KÏÎrç<ú ×Æ)ð@î?C©ý'£—:gàÁD´íÛÂÌ+<‘1MeiŒqO”A¢ LÓô°qz©‘­‡QÆ SñÖzìòú;UôQ~xÔ0`8GLÔKüÄ
+‡P¡‹¾¶Ù}ÈœC¡‰¿…d:žÁ8gD =QüL¾=}³Â‘RU˜Œé· é˧‰{‡ƒ/_vpJ©Ìû
+ 7‚$B¦òîe{ÈEµÞì&!ç“wÛ+< VHM4$ì¬QWŠ¹o%š‡€2NâÏuWÔUÈ­.Œ-¹vι߬ ¿¶gû¬Œ¤F¡¦C©ý ¶—RÓ=…˜[ú,U´ÿÛ*qÐx,ãˆ{„v_){ Ãåa3õR#[Gõ@ H IŠ·¶9Kj(ÅGqý• f=XðNïÔ_©0ÁL s¡þÂðµþÚ úúë´õ(ŸqY`è¹tÁÄBò$‰aUûÐnÖëºéòE8g¡ª>0\²Á™Ùèuy|OŒÊÔ@3æpŒ¥öÇh/åbtoºbÔÀù‚`j}[|G€2Æ ‰Ž‘ÚŒµƒQpB5OÛ§—Ù7&+ ¡R²xß×ndÈHÀ^8aQ3DoËÜmÏyòe¶)½ÙC$ôõ{ù ¤<Hçé±PH… e_t´0Fm®ÐѶoì¼Æ#m_¡ êÆ _KAœKbh*§—Ù9ŽNÒÔ¤ñΞ5z"6pø6‰mãà.j§Zø˜È³Ð”EåÅæPÆ`‹­¶£§¬Õ}¹‡;{Ͼ-uÌTFl,ŽË p ÅÜûôôDMë³[=; ¨ò.@UKžŸŸƒš1ž.4I5³'P‘$õi‰ºˆ‰z“ùi»ýT½¿üꚬj³¹MÞte¹ô8%¿td6í/œ9îÃ|Ÿá†è¾~¥¿/ÀlÎC±I$v ,°>]7E…þcá\³àý5x7G±§¢{ÀµUQ«¬Ä/kdÐs(9àlçTÕ#^Ôy[ýæ¿À«{ˆã|ÜòuŽ­v7ðm„]3s£§E‡ËmW¯[zÂÏ·
+¤px—í¾¾ã bzéQ×Nñˆk¡!µíïÛŒbÓeÑùbq¥‘Gåþ`…¸Þ=·,M‰N(
+É)´ ½ n»v—?dEÈ€Ò‰£~v›.û™±)8±sY©F)á ¨
+endobj
+2335 0 obj <<
+/Type /Page
+/Contents 2336 0 R
+/Resources 2334 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 2333 0 R
+>> endobj
+2337 0 obj <<
+/D [2335 0 R /XYZ 85.0394 794.5015 null]
+>> endobj
+810 0 obj <<
+/D [2335 0 R /XYZ 85.0394 650.8348 null]
+>> endobj
+2338 0 obj <<
+/D [2335 0 R /XYZ 85.0394 625.7398 null]
+>> endobj
+814 0 obj <<
+/D [2335 0 R /XYZ 85.0394 378.0874 null]
+>> endobj
+2339 0 obj <<
+/D [2335 0 R /XYZ 85.0394 350.2627 null]
+>> endobj
+818 0 obj <<
+/D [2335 0 R /XYZ 85.0394 153.7325 null]
+>> endobj
+2340 0 obj <<
+/D [2335 0 R /XYZ 85.0394 128.6375 null]
+>> endobj
+2334 0 obj <<
+/Font << /F37 1018 0 R /F21 930 0 R /F22 953 0 R /F41 1208 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+2343 0 obj <<
+/Length 2393
+/Filter /FlateDecode
+>>
+stream
+xÚÅY_sÛ8ϧðtîAž]sùWsOé5·“Ý6—xgî¦ÛÅV]m˵”¦î§?€ eÊ–Îv(Aø€ÅˆÃ12)K­´£Ìjf¸0£ÙòŒ`îç3áy&is½žžýôw•,³©LGÓûHVÎxž‹Ñtþ>¹`šAO^_½}3žHÃK7ooiðÛÕ뛋›±Ê’áö÷ëëwŽ0O„άL.®¯/ß¾¹ú'1\ LÎõo—·ãÓ_Î.§ÒñÆW¨ñ§³÷øhûûåŒ3es3z†΄µr´<ÓF1£•
+”ÅÙíÙ?:ѬûtÐP‚3©R9`))‡,e,K•TÎR¿7ÅCy>ž(Á“¦X®å䡨h¿uÓ®Še‰»Y"’ÅG¥™ÍyÚÙ;eÌÆy'çi=/Ú » ‘M…S4žoAx5£b¦ñlQ•«–ÆëMý°)–^ÙWA›¡\á©NŠÙ¬\· ¾(·*КjõàV…q·ŒgõrY¬æž·ñzs“EµòÜÅf,òäái Êýˆ¤,iÊÕ<|¶"1±|÷Aùé©l¼r˲A{ÓK[ã®pB0kŒtûhaZ©4)žÚÇzSµE[}ö¤¦Ü|.7ãL'°¾2Yâ”w3õsCÃN
+ùÔi߽3¬XÂu…xìœxyiu¿ï´û Îî‚£é¾1vâž«Ù㞬ØýûeTDP~µÇãA@6¯sõB<D\'â!p¹xøJ«còÊã~ú @™eö´×€
+=GƒjÁ‘žÓ`§y½„´ÏŸV‡;äf‘9}¢Øƒ"Ÿ26Ç ¨rÅR®ÒÓŒ¹Ž°ãBåW`’CØ+¹W€‰o(À΀3+2qz×À.úg`XŽÖÛÆ-Þ(AÐn×{‡»r½.7…OQ0£¸¬¨Äå#˜ÅUŒÄMø­vs˧ !V£ îhL(£˜0ù ÙdÌuâH—;Ò¥o?ÕàPÀʜԤãP¥Ÿj(ØSÓ×¥;%C“¨‘'Õô¼ó3¤÷K È.<Óv]ÍŠ½”_
+j[á ëÉϾh’Y²¨¡ò«?ú—ê£çE›Ì€ÈWL+¸½zØ;þF6¼¹ÙùÒÍ› ¬¦øç…°c­GÈ\™Jõ7ÝÁZÀ-l¾…¡pqÇeÑwdùaøbïBïš¹Òõì²^ u»¿Ám¤2ðAiS&”²Î"o£FŒIáÎuU3J xõ«À¶m*“Ë}Ë€LžÉlW ìÖ:_} @S,ìS4v{ÝÙÀ~ºZÊÑ›v4Š6ObÉnSi쥬Ÿq@ß÷q-6ž»¼³Á¶š•c¸½±½&²¤ô¸€,ØÁg½¡ºdâéKüÒÁ
+ÔGÏ^¬×›zí¿éú¨ ™"ù<–&qp‰¬¡që?ÖÉW4`Vö·!ŒîÇÊé@5Nßfy
+—„oÍ98ŒÍ již–î•.¡UÔèj”ëй^ÖQ›ENj¾×¡ËÚB-3s½h˜£üG®ù…ßQ‹GC.ý9òÃtRr.Îçwùù9”ªúG ½ÿ«dZgNÂ_
+endobj
+2342 0 obj <<
+/Type /Page
+/Contents 2343 0 R
+/Resources 2341 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 2333 0 R
+>> endobj
+2344 0 obj <<
+/D [2342 0 R /XYZ 56.6929 794.5015 null]
+>> endobj
+822 0 obj <<
+/D [2342 0 R /XYZ 56.6929 740.3318 null]
+>> endobj
+2345 0 obj <<
+/D [2342 0 R /XYZ 56.6929 714.7319 null]
+>> endobj
+2341 0 obj <<
+/Font << /F37 1018 0 R /F22 953 0 R /F21 930 0 R /F14 956 0 R /F62 1352 0 R /F41 1208 0 R >>
+/XObject << /Im2 1341 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+2348 0 obj <<
+/Length 1890
+/Filter /FlateDecode
+>>
+stream
+xÚ­ÉrÛ6ô®¯Ð‘š‰l\Оœ&í¸ÓI\Çi'ñ"!‹.*Iyé×÷ H‰¶;“Ú>oß
+‰ÖRíŠ%®š{Ý¡viY"p}íV¶Më†äOuZÑiµ/5Éš
+7]Qß!Øï4wŽ®ü¦ŸVŒ±€“`l$]®… ŒyçS"(8­îöm³Ñ?¬Ö‚Ñ oª´¨ß‚ ŽE§Û{íäËv:ûæŽq¯ÛÊ)Òlf?ÿ„€¤±tòð©<\%™´ò\öÀ;
+‘|‡pj>¸»=CÚ|Q>‡Ô7K»…P~¡ü"z*Þ„ÜFïÒ{·‘5-z.ëË'<l¶‡Qá±TFaPÓ(ÆQaÈ­bF}©dp³+ÌÆü2 —•‡\çþî¢d°€šÃŠåal< ¼·²5wmZ9ªÖk×< ä€Iý¸oZGµ,6mÚ>áF–Öl4îºS¹Ò9ý …×h¥2íÍ ßû}Ydi_45ÅD H sè.½óÑfbÏj²qÑöeßzèþØÀ&äö}Yg. Sˆ™ÓÁÈP‰eysÿ—*Á‰J’d¾F¬Šë1ÉóÀa—Š9…Ó<G#u×­¨÷‡þTnÁ#’Êþ?¹Š¯È-¸" KÔTòRßZB¾JÇ*ô¾L,ʧ½qswV¥)¡!›È UóÝÇá¬GH(›)©É0]ç§ü *K)_æçqÎù-¡‘<œòkWIp¨OŠž¯À_9—¹Þî €KU“k‚úPô; ðEÒÚ á³ø(|wÈÕ! õëé¤e=~]ÒÐ:òœ wÊ{Ùc¬ç1`YOÜŸyBDE¯°ôH3,'¾HHÇ',¡j¢ÎiçLÖÙ4]Ñ?M{P.rªnÚ*uf-×C+HG(DóÔÍà[ à}ÒíuV˜dð®:”}ak±õl¤ž5}È ‚¿búÖ ¦÷XÖô/U@Æ)‰£pÊþ»*É@ñY$Od5¬}&e˜ˆ‰—mä‘føŽc…E0Æ))¦Œ­ç¶¶É©Àö8NƒË+÷ûX–qÃ6Zø¦¸ïRëÐv…
+`ç+ ©18 b
+‰ù<Û¡#ÓD¾lœk†ó$“'I¢’)g“Ty,ì}5¨©{ˆ/{=1;¹,º!‘ð=Æ!æÒ?M­]"9‚‚6äá»q¼†4ÊM€%Ið°3÷K»*z;{Ús;'RקõÚM.à)’“HL-E[Ð#ç| ú¹ò™œ…ô2Œaê >ؤ2ëeQ; l9‘
+&ô¼ÅxŽI‡›)~ÌÅ®tG½‰ ì/a€qð\SwÔŒ抸žæ6Iwo48Vl\Z’jH­[ì…r˜I䈫¸Jès]kíOh\H÷ú—Žèht_qW|Gã’qû¡.‹oî·ëÍ3ÅÂH¿k¬Šap¸KQoØ°¯Ù{xxX)ŒïÎfÙ„˜‰ÁO.s ÜÑ"¨C¹®û£‡`Àj¢èPÍÞÛÇXxŸ«|>ò9ºõ €2rÅÖ:]ç¶ĶóÑ–«Å°ó÷A·…MX¶)ÂmÐu÷W]XÇbmH7•Û·&í…–ÛÈÎѤfÓo&šuî'©aì5ýñd<ÊÒ²Ä7ˆ7î&˜çÓ…sÏqJ¶úùm¿?îÍΘ¹Id<>p Þâ{ ®Š@‘‡‡ŽØ=süæ/¼vŽÖ[Ýê:C…_~¸0ÞXÄÌ×e€"Ô=(h´•6pd@´Â«üný
+®UZÒÒi=!ïà üíèëÇLï{$àe0%5;Tµi§St–ðźó?Bj#aÆÁ~dÖî­É%É=ËxA÷~ÊÎ5TüÒÄúq_¦µ½òw&ÙÞœ¸Ø?]œ<LxÙ· òÜ{xÕ<ÒÍ46:„Áw¿_DeLD’<3k
+*¡1*æ…2&d\Š>¼žËþ/+bHÐendstream
+endobj
+2347 0 obj <<
+/Type /Page
+/Contents 2348 0 R
+/Resources 2346 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 2333 0 R
+>> endobj
+2349 0 obj <<
+/D [2347 0 R /XYZ 85.0394 794.5015 null]
+>> endobj
+826 0 obj <<
+/D [2347 0 R /XYZ 85.0394 741.6375 null]
+>> endobj
+2350 0 obj <<
+/D [2347 0 R /XYZ 85.0394 716.9352 null]
+>> endobj
+830 0 obj <<
+/D [2347 0 R /XYZ 85.0394 420.5643 null]
+>> endobj
+2351 0 obj <<
+/D [2347 0 R /XYZ 85.0394 393.2598 null]
+>> endobj
+2346 0 obj <<
+/Font << /F37 1018 0 R /F22 953 0 R /F21 930 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+2354 0 obj <<
+/Length 69
+/Filter /FlateDecode
+>>
+stream
+xÚ3T0
+endobj
+2353 0 obj <<
+/Type /Page
+/Contents 2354 0 R
+/Resources 2352 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 2333 0 R
+>> endobj
+2355 0 obj <<
+/D [2353 0 R /XYZ 56.6929 794.5015 null]
+>> endobj
+2352 0 obj <<
+/ProcSet [ /PDF ]
+>> endobj
+2358 0 obj <<
/Length 1945
/Filter /FlateDecode
>>
@@ -9102,44 +11179,44 @@ FU—¨UÙ‘[¢–õ„/
c˜"v¨¯]¿x /¨¦zŠ©,ƒ‡“jì^MÈ=n´B$ŽÌÿ/Š™AÃozrm@ £óÀ’O#°ã—_ØäƒcÒú:ƒÄl²«Ö2[PCçB‡A|ßöÀ7z WQ@x©k†ÿˆŽ=]LÈw›{Šh( Ï`žÙ±¥|ßd³ø)¼Áº.4h@õ
Ôζ–ú‘*ÁŽ––nU@€u´ŽÂMô©…2&ô5»XžG»<•Å”?
iô¦?ÿûãçOþóšÞn1˜)f3+NAÍï7QUÊñ§êgCí r õ(G§ÀM¡É\3-äY=òaoø‰ëà¤m!.cÖAs/ç˜S¤à¬“içÞ7˜P²nïèK]- Þ}¤/ýÞà[fÌ)Qˆéªhij;Œú«p}ÓXåž\E4z%d˜^§ÙüCIMÒ©s gLü¬
-§g=42¾ûùÁC#j*u[ø a;xs»icŸì½‡ÁKØù;üø<fø³ìäC;°$GúEöÔfГ/U\œ7üÀûò¼ÿSçžqendstream
+§g=42¾ûùÁC#j*u[ø a;xs»icŸì½‡ÁKØù;üø<fø³ìäC;°$GúEöÔfГ/U€Îâü¸áÞ—çýTnžtendstream
endobj
-1893 0 obj <<
+2357 0 obj <<
/Type /Page
-/Contents 1894 0 R
-/Resources 1892 0 R
+/Contents 2358 0 R
+/Resources 2356 0 R
/MediaBox [0 0 595.2756 841.8898]
-/Parent 1747 0 R
+/Parent 2333 0 R
>> endobj
-1895 0 obj <<
-/D [1893 0 R /XYZ 85.0394 794.5015 null]
+2359 0 obj <<
+/D [2357 0 R /XYZ 85.0394 794.5015 null]
>> endobj
-650 0 obj <<
-/D [1893 0 R /XYZ 85.0394 769.5949 null]
+834 0 obj <<
+/D [2357 0 R /XYZ 85.0394 769.5949 null]
>> endobj
-1896 0 obj <<
-/D [1893 0 R /XYZ 85.0394 573.0107 null]
+2360 0 obj <<
+/D [2357 0 R /XYZ 85.0394 573.0107 null]
>> endobj
-654 0 obj <<
-/D [1893 0 R /XYZ 85.0394 573.0107 null]
+838 0 obj <<
+/D [2357 0 R /XYZ 85.0394 573.0107 null]
>> endobj
-1897 0 obj <<
-/D [1893 0 R /XYZ 85.0394 538.4209 null]
+2361 0 obj <<
+/D [2357 0 R /XYZ 85.0394 538.4209 null]
>> endobj
-1898 0 obj <<
-/D [1893 0 R /XYZ 85.0394 504.6118 null]
+2362 0 obj <<
+/D [2357 0 R /XYZ 85.0394 504.6118 null]
>> endobj
-1899 0 obj <<
-/D [1893 0 R /XYZ 85.0394 432.7569 null]
+2363 0 obj <<
+/D [2357 0 R /XYZ 85.0394 432.7569 null]
>> endobj
-1900 0 obj <<
-/D [1893 0 R /XYZ 85.0394 303.3232 null]
+2364 0 obj <<
+/D [2357 0 R /XYZ 85.0394 303.3232 null]
>> endobj
-1892 0 obj <<
-/Font << /F21 714 0 R /F22 737 0 R /F41 939 0 R /F53 1029 0 R >>
+2356 0 obj <<
+/Font << /F21 930 0 R /F22 953 0 R /F41 1208 0 R /F53 1303 0 R >>
/ProcSet [ /PDF /Text ]
>> endobj
-1903 0 obj <<
+2367 0 obj <<
/Length 3825
/Filter /FlateDecode
>>
@@ -9159,29 +11236,29 @@ bÎDü…îR
”®DXð9I;܉
ô½¿ù@„0È•œåñú¹X¶åçbã?^¡€™ À° õW¶ÖƒMw›gÂW%fèÂphðRØ.]¡Ã‰h¾,¤ª\,6<ÏËe³8´Z9ÿký¾ÅEÓèâ}ÂÆLÁ©—îÀS7ØQóëEÚP8d½¡é“löá»—)Rú±-Ú5˜³Àe’ù¸Ÿ9.¯nè­NmÆÇácÕyW­ µãrâÖK…zº÷¿
"BV˜ñI§ë†¾xÀfHÏqàÛw/çï^%cÁ8`–Y(bOud)ú O¨&y¢álD ×Tˆc÷Âà)†Ì‰HÉ´ õ0QÉÓÁù âþ“I‘r5Æ|Äï4K‹0ANEÞóTS_Q-ëÁ'ï Ñþ´ôŸõnx’»¢ÂK2œvE”'0«
-‚ÕrœÀ4d‹VM}­°¢Æ¾ÌáK‰ÿù{éã×àÚDÊÚ‰o|b‰amfÊ¡Ÿ~ËÄ_VŸòþ_dsÈkendstream
+‚ÕrœÀ4d‹VM}­°¢Æ¾ÌáK‰ÿù{éã×àÚDÊÚ‰o|b‰amfÊ¡Ÿ~ËÄ_VŸòþ_dúÈnendstream
endobj
-1902 0 obj <<
+2366 0 obj <<
/Type /Page
-/Contents 1903 0 R
-/Resources 1901 0 R
+/Contents 2367 0 R
+/Resources 2365 0 R
/MediaBox [0 0 595.2756 841.8898]
-/Parent 1747 0 R
+/Parent 2371 0 R
>> endobj
-1904 0 obj <<
-/D [1902 0 R /XYZ 56.6929 794.5015 null]
+2368 0 obj <<
+/D [2366 0 R /XYZ 56.6929 794.5015 null]
>> endobj
-1905 0 obj <<
-/D [1902 0 R /XYZ 56.6929 752.1413 null]
+2369 0 obj <<
+/D [2366 0 R /XYZ 56.6929 752.1413 null]
>> endobj
-1906 0 obj <<
-/D [1902 0 R /XYZ 56.6929 501.191 null]
+2370 0 obj <<
+/D [2366 0 R /XYZ 56.6929 501.191 null]
>> endobj
-1901 0 obj <<
-/Font << /F37 802 0 R /F21 714 0 R /F22 737 0 R /F41 939 0 R /F48 953 0 R /F53 1029 0 R /F11 1397 0 R >>
+2365 0 obj <<
+/Font << /F37 1018 0 R /F21 930 0 R /F22 953 0 R /F41 1208 0 R /F48 1228 0 R /F53 1303 0 R /F11 1442 0 R >>
/ProcSet [ /PDF /Text ]
>> endobj
-1909 0 obj <<
+2374 0 obj <<
/Length 3111
/Filter /FlateDecode
>>
@@ -9199,26 +11276,26 @@ X&dÜ‘Lr­2KU=Æ
Í©ßpª'uÆ©Vª³nuÞ©ç”{NjŸpª¯ÞdÁRÇÄ£X0<Š…¦hï©dЇ…ëúÅèæžà¨j•·9=ÿá×CɃ”Õ`ÀóP‡|èÆ&ô²Ol¦²öÅÛþ:sày]|Y¦pªÇ#mÈ—ò!¿“š{ oÊ+’Ââ«Û‘ê½{}ø¢«F#F£âÓªy³„ÒK¾)WL˜!=Ë¢$Œpp‰"Ö/—|wJ¡-ªIôä¹@òûŒÀe³]½¹‚d|yôg•u³b¯¥‘¹ 
ÖïIMeµÂÇÓ¢±]Ìm¯ï#ÞåxoÖ“ÍüÉ‚qÞ|³Î³o=†hI9üRX‡‚÷à¬)ö@å—Û¾®Í¿|]PÅ>¯žð 9Rf¶‚ãÙÒOV»ç¨Ûå{Öc¼¨%{
¾U¯ycGôsd*ö6Åe%ÎK“ƒ÷¦€}žb|©iŠqRŽb–ç)æ¬òŽbN´SLO½¡ؘœªevM3Ƀ%ò6>ÜÐ/RÌr],Ÿik@ͪlðD¸â?2€Ã2X0aÒ¥Ç2 ŸX›ú,fa×Ë=äãPõVæšôqóùîîã‡Þr»býØK,ébh
-p2£·RKOhV¨ÃÁfòÞöœÖîÚv¨vüÖÖ×{C¸Sù:¿ñÞ2¿\ßÝÙ;ò¢ò^F]Þîdû\5éVˆõ*|ãY¥“™v*Ët7½-,ö‰[!wÉ$
+p2£·RKOhV¨ÃÁfòÞöœÖîÚv¨vüÖÖ×{C¸Sù:¿ñÞ2¿\ßÝÙ;ò¢ò^F]Þîdû\5éVˆõ*|ãY¥“™v*Ët7½-,ö‰[!wÉ$
endobj
-1908 0 obj <<
+2373 0 obj <<
/Type /Page
-/Contents 1909 0 R
-/Resources 1907 0 R
+/Contents 2374 0 R
+/Resources 2372 0 R
/MediaBox [0 0 595.2756 841.8898]
-/Parent 1912 0 R
+/Parent 2371 0 R
>> endobj
-1910 0 obj <<
-/D [1908 0 R /XYZ 85.0394 794.5015 null]
+2375 0 obj <<
+/D [2373 0 R /XYZ 85.0394 794.5015 null]
>> endobj
-1911 0 obj <<
-/D [1908 0 R /XYZ 85.0394 679.319 null]
+2376 0 obj <<
+/D [2373 0 R /XYZ 85.0394 679.319 null]
>> endobj
-1907 0 obj <<
-/Font << /F37 802 0 R /F22 737 0 R /F41 939 0 R /F21 714 0 R /F48 953 0 R /F53 1029 0 R >>
+2372 0 obj <<
+/Font << /F37 1018 0 R /F22 953 0 R /F41 1208 0 R /F21 930 0 R /F48 1228 0 R /F53 1303 0 R >>
/ProcSet [ /PDF /Text ]
>> endobj
-1915 0 obj <<
+2379 0 obj <<
/Length 2837
/Filter /FlateDecode
>>
@@ -9236,119 +11313,112 @@ arFáàJ6ò±´Ð‚c9<™‘m›î} Œåºn0ÝzE½ÂA¨=Ÿ‘Ð Hãœ/çˆÇVt°RÈ=UA‚©Z€Æ-Ä»`>cÝ{ÿ
^f¢óá^žÜ¥›õl(š˜9{™a–f9]Ü&QÎÖ¶I<åLø‡ùtgÚ(0v{$W©Ã´:ÇÃÓæx@  8ùø`zÍ|º© cZFhûß ©Ó†Óª\€ ¯Å&åtsÈÖ¨]-¯3ZÈYZÐŒÇé±×v‹ÞwgÍmïšÆ¸‚ @Æ4ªåL£cßÃtÂÅôzÝ·Zö5í¶kžz/rz!‘†Tžä¨ÆDjbo¿îI[ìOšò_ñ¤P€°†Ž´2nk%GY¢©[ÙÇ!Êm²çÿBÖí•(¿`€jÃŽjÌ1°åìWsÌ&ï1Ç̘/瘈»MÇ4÷ÉšÎÉU{ðuzÑj…FP÷(úóT«¨û¡Þ÷V§9L… ¨~ÚÉÇ'S‚BãPVòµÚŒâ‘®¯JÏ`}Oã`œøؼL¼¸·æîÚMtÜK¨^j·Íý#)3¨‡Æ¥¯"ˆŠ,eŒ\È!Õ:‚<•GÐ÷Ó”o‘§œ^`kiæ\'U1…ê¶ÀÛ›Q#_*«%“½ºîÖõå¶õÄ5{pBk¥wqõ÷z}2÷qÌ}ãtÒ,ÅPåo[b$Ú0„%í 2˜òžµÈºÅ{ ¬SæËq5äîÌ¡*mW™ø}Š2‡ ãN‹ªßz¹_ÌN†êÐPj]CÓ¾Â<¥¥õ…#´µ%„ÛþçSk
Vh§[/Vþër5^Ãf?¾8l•Qh_2¯@èB¦ ©Öáà©<Æ2-¾ë àH‚n3÷Tsî“ÐnI`Û±¦Ó¹‡Úl{·± ˆ´êr9 ¶öã§Ý(Ï׆,(»rCª Ã8ªÑ0ö¬w¾›`(¥Y·ù{ª¹
gÚGXûkŸÌÛGSQ¤Í'цÑpAR$.ĺ€hÝdŽh´XÓ¬Îm±Ïæ¦|—æBÆŸ¤1®lÛ7²´M%Ï<Þ|Eˆ–ëUê
-éVìÍ)OHjŽ}>«CŸ¦þ¶tê ž€Òœ4>¦5qféø™«ÿß8Oð˜th«:9Ýü×í¾9WÓÃE}ç þýjåwÀWý[nhçœëÿþSÞø—C–AÆÌÉ2žHÆSøX8¡”&
+éVìÍ)OHjŽ}>«CŸ¦þ¶tê ž€Òœ4>¦5qféø™«ÿß8Oð˜th«:9Ýü×í¾9WÓÃE}ç þýjåwÀWý[nhçœëÿþSÞø—C–AÆÌÉ2žHÆSøX8¡”& Ï¥„BÚËþ'ƒþ‡endstream
endobj
-1914 0 obj <<
+2378 0 obj <<
/Type /Page
-/Contents 1915 0 R
-/Resources 1913 0 R
+/Contents 2379 0 R
+/Resources 2377 0 R
/MediaBox [0 0 595.2756 841.8898]
-/Parent 1912 0 R
+/Parent 2371 0 R
>> endobj
-1916 0 obj <<
-/D [1914 0 R /XYZ 56.6929 794.5015 null]
+2380 0 obj <<
+/D [2378 0 R /XYZ 56.6929 794.5015 null]
>> endobj
-1913 0 obj <<
-/Font << /F37 802 0 R /F48 953 0 R /F22 737 0 R /F21 714 0 R /F53 1029 0 R >>
+2377 0 obj <<
+/Font << /F37 1018 0 R /F48 1228 0 R /F22 953 0 R /F21 930 0 R /F53 1303 0 R >>
/ProcSet [ /PDF /Text ]
>> endobj
-1919 0 obj <<
-/Length 3266
-/Filter /FlateDecode
->>
-stream
-xÚ­]sÛ6òÝ¿B3}¡§‚O~<äÁ©ÝœÛ4Ik§w7m(‰²9¥HU¤œº¿þv±
-9ùýâç_ùl|{Á™ÊR3û ÎD–ÉÙæBÅŒVʯTw?„½·vë”
-%Ys1ëãQPcÒRöH •°T‹#ÚwEw9W*‰ºÇ‚õ~³(v8Ž£fMkÈŸË݆ÇüÉíèzæÛmq)¢|GӲƽúƨ’g,NµÞ‘|o
-‚ð*&ãX8 À?F$$ãZ9ˆë S
-I
-`â¨nH*É@‰àèNdçŽU™Ë*œÆq‹+¥{³…eo¡Ž´ðì\k½p ŸËîG:ZŸQqÑãÖ¨Xx;mÝ»-­t(J áÑr•wåSAoꕼvП˪¢¥…UBÄàjÛ‚(.-~pWVp
->ý¼Kö ¡Ô²> z˜°‘0­´‡°²ÝŸv® :…âæîAÑitz—Õ¸:„ÔQ%ñyÒjLû(QïdCÚ×X$i(EšŽ:¥öÚWÅî][ìžlݨ]Ù
-›e⛜w7?^ýôÍe¢£«ÛwŒ–ï=úCQHl%¥]í6Á–/ž
-W
-¡»-–£ë4*™ž' ÆÔ‡× iM’h1$ÿcÉG‹w$ j†€wó5GÁKPYmŸ­mØ•g¿âr%œX8Føá;·£t[á†_€ÿÍ12Š,>ìþðñ~ŠºsmÀ­¥G½›QŸ¯Ve©K°m,8šzQz‰¥ü'AehR.Ï+Bê´"¨ mù°|ÌÛ‰LG²pœ¥îÆÔ‡Š
-+±·Ù–•5´Æàh~=ÑÖ©d:SzpÒ—ZÂ’eišN7„çã bÑp+
-†±<#úsêT}ÿéV¥÷·ßÝš>Ýüx{s7á}Á+ʘ)‘¾xJ(²ßܾG†ue´Pn¶•ýò—»¬YÛ
-ÿt>Å5#¸öüYŽìúô÷>ô¾†û:Ÿút&4Ë’ÌËf‘w˜• L.E„§Äi³E.° Â/©‰pù ·ßí¤{´ÍB\
-2Áõeî¸_î«Ò~‘†Uò0¸n‹ñsí íˆ HÄŒcÀxUùCû•K{,«­·†Õ¨‘í
-xƒ~iG`°ºßVn¼´Jƒ
-!4]§ãmÛ¡éI _ôtf¤’\ždŽ;?õK1UºšüÐÃCˆüÇ¿";üFNC€_Þ'óðžLáïÇS(vÁÍ1ëcc*“ Þÿ:ÇÀTendstream
-endobj
-1918 0 obj <<
+2383 0 obj <<
+/Length 3255
+/Filter /FlateDecode
+>>
+stream
+xÚ­Z[sÛ6~÷¯Ð̾ÐÓ
+!®òàÔNÖmš¤±ÓíNÛJ¢,N)RI»î¯ßsp)Rr§Ýx2ÀCœà;WˆÎbø£3-IÌS1KRAdLål¹½ˆgðîÝu4sO4ïS½¹¿xõ–'³”¤Š©Ùýº7—&±Ötv¿ú9ºúôéæÃõíO—s&ãè ¹œË8Ž¾¿úðåê½ût™²èêÝÍt•ŒQ$Sqt}ûîò×ûo/nîƒ0}iÌQ’ß/~þ5ž­@îo/bÂS-gOЉ MS6Û^ɉœû‘òâîâ‡0aï­ùtj„ÔD2¡fs ¦\&ÓÛ“X²牠„+©Ã6 =µMž
+·é«jU·ÍëëãåRΈV1õçqTcÖŒõXSž-èﻼ½œsžDí&·ªÛ.ò=¶UT¯íÊçÉ2÷Á&{t_´µ}f»]~I£lo»E… zõVòž,N‰Ò‚ìȾʶ¹¥ÈÊ”¢ŽæOD‰w×s¤„s&ÁºöBµ}™U´pkXÖUS¬`ÝTGùÊ­gÑÔe×ægŸÍ™V„1Š[NI*%33ß›}“°Gù:ëÊÖv³²sãEcŸnç å/qÌ*ú]SÀ®UžÌ}W¹M‡fÓfm¾Í+÷½ßXAû[¦a€-·àWy»|µÏaÖ¶žÚ I” ~ ¿†¹µˆÌ>êX!
+Ø>,Y³³8-Ÿ/)¥Šœ&ÑB ¹õ\»-ù€µŽ£}ûG /è ›vÝU«|5eºU ¯û«úÉé48<ûín_€…îÉEã¡\ø9`aïmAæføÓzœÚöœA‚Ö2맙}à©ÛÖï]¾v¹ŽÖšÕSºÆ(¡B½¤k=ª3ºæ©Œ®å«ªyý¯‘¢1E
+ƒnñ±jžDÐŒ(T°³(èSFA 
+(XgE9®h<,užu ó>Šf9D½é÷5¦ÊÒºµÝΆ™Wùî]“ïMõ@¸äžÏugéÝ6æ&×À7™}ÜÝ|¾”2úñíe"¢«Û÷Äßûé©5Lbòiá2ø ±|
+ ¤F,¸Âº>4^TymŠ¥H1íðЩåCÓR¡½-=šºEŸs#?ù"ßd€Vw:"&B‹s :Gp³È!]ƒ¢µ#ô$œ?Ï=Ø™KSÙ‘þWm›ow¨´Êz
+¦@“‹fWfÏnÐl34 ‘lÑéX³Ç0êÒ¥Æöü1)Ú‹É*+ÑŽä+ƒç±ðÅÁh@§hœ„”k9´>”2p2a~:·Íàáäaò²ì2¬³§Ù§:}œ*œ'„nM¾<é Î2?xƒ÷io0`ÿ9‡à³Á3¢©Œ à»»ùƶGÁ µeólL1ÈŒ<û+cÇ@àxÂß¹/
+÷):šëÖÅPS
+bXœç¨Æì%‰¤Éÿljnw2W5 éÁ™Á‹cgF½3³m—»ÚNf?‡Í]y˜šb±ÊZS
+“Ã >pú
+¹9%:–G˜ý{£XëÓfœ0moµÿÆüŒóþ”­–‚Éç¿„1šr+¥Ïc¬Ouc*` ¯uO&ÍgY’æïɤyÀû¶Z–Ýʇ•Õq‰ÔÜ{»ó…Þ^÷SHjûô4¯B…÷PŸÈ&ãP㠌ր- Š¾zÎñÛâÿû/ï1½¿ýôþÆÎòכϷ7wÆŒ"xyÁir¸ñf^¿¹ý€‹4Jí@±Ý•ææ7sQ³0—@c§…[+£/Ößhê½VÓívÁ6–Scëþv'€‹)…îJ'nHaT ¨ì õ0€ÕM[î:²ÕSla~Q8¡1pÞ¡TS~”-šõñ˜Û2D,¼|F"3>}ßSÀsì]ê|êê”
+’&©ß›EÖbT‚,0¸¤®»õ¥À„oÒêâdn~·$íÆ‹q(ì Ž/3'ý"?H_æ 0j- Ž›ÀÅÌøT9JóƒËÃnU$F‡?0] +Ïš¯]ØcDmŽJm½‹ G0á¡pîïò µ„ gæÊ–šÇw ‰$2öA‘å3qJ¬ýFÛ‚ÂCç~¹
+endobj
+2382 0 obj <<
/Type /Page
-/Contents 1919 0 R
-/Resources 1917 0 R
+/Contents 2383 0 R
+/Resources 2381 0 R
/MediaBox [0 0 595.2756 841.8898]
-/Parent 1912 0 R
+/Parent 2371 0 R
>> endobj
-1920 0 obj <<
-/D [1918 0 R /XYZ 85.0394 794.5015 null]
+2384 0 obj <<
+/D [2382 0 R /XYZ 85.0394 794.5015 null]
>> endobj
-1921 0 obj <<
-/D [1918 0 R /XYZ 85.0394 179.5067 null]
+2385 0 obj <<
+/D [2382 0 R /XYZ 85.0394 147.4749 null]
>> endobj
-1917 0 obj <<
-/Font << /F37 802 0 R /F48 953 0 R /F22 737 0 R /F53 1029 0 R /F41 939 0 R /F21 714 0 R >>
+2381 0 obj <<
+/Font << /F37 1018 0 R /F48 1228 0 R /F22 953 0 R /F53 1303 0 R /F41 1208 0 R /F21 930 0 R >>
/ProcSet [ /PDF /Text ]
>> endobj
-1924 0 obj <<
-/Length 1913
+2388 0 obj <<
+/Length 2054
/Filter /FlateDecode
>>
stream
-xÚ¥X[sÛº~ׯÐCgJ͉`Üx;oJlçøLŽãFÊ´Ç4 YœP„BRVÔNÿ{X¦$jt:=
-?6öÄ<‡±$>eþ8]èøæ>Ž˜[3mMû«Þ/FW·"Ç$x0^,{º"B£ˆÙ£÷žp2 Ôûíó|1™r?àÔ›=<ÜÜ_ßýÃŒ)¬”zÌî¿Î>¡ìasoöñf>yZü>ºYtÖô-fTS~ŒŸè8ÃQ"âÈï`@ ‹c>^¤/ˆ/…h%Åh>ú[§°7kÿ:ˆ
-©^¯“2Ci‘—
- 4òfå¼ú9)pþÇVUN¬7M®ËåߨOÕÏTmœ4Úµ«[Éz¶ñ(&”q<2VýòXê§táÊC/ÀY?n!n{0grâœxv>èWUUy–©ÒèO…ˆ ¢h<eŒÄ¾Ï­šç=6ÁÆú2­7*Í¿QÊS”ÖªÁŽ^ö–9ºl
-ÑJwñCÈTU&&“"ÿV—éu’»‹ºLÖª½¿¯Þn6ºjÞáÈFÚîVOÒ¶¼®2ÉòzS${”–ºœºø*#ÿðÈÌæîîÌñ‚rkDMb¨²æVq@Ûü&ÂË 26iT±ÇíR]÷75n˜®’*IœTeª³¼|Á‘½ ,Dé³Zb2ºq­JûW$
-N 놇Imø!ˆ]*Ã9©Ø{5ˆ¼k›ì ¨Uõjl2}íZ/¼èÛÍ°w§Ýö r§î^‚÷áÝ'özû× ¹½Ø;“ ÝV%.4@íò@kìÒ̘Œcݧ‡n#ír×.49©uin
-Þ)˹ªÆ•ÃÕ)ƒ*€†]ujö>*ü9…ãûñØç>
-‰}¨¤ŽØ¶Ý y-¯
-mËã÷ ÔdŒ_ä/)d±jyÛ²>Cµ€ •!R-ãØþåöî¾ïNëö½^©&½ªT­‹W'|Ù¦!à ²+þòïß>ÿqóŸ+vVéôpãùÍ z?û4ÿ|‘ßWºn Ó2áïð†+2#Œz¬¬k•N¿«ý‹*{“v÷¡  “v_n?ÀSÖ* "úݺap9¨ÏÞ®±÷_?Î/º9×rœ}—õŽ^Ÿ!qÜë«Ñ;kûF:÷6ëìSdÐaxew&ðn2¸¶Á?ááìÛ÷†‡Ï=§B&ã.*¸ù7ÎCì]·E[÷›þ¶É‹¼ÙŸO Äl¾/õ¦†óqD;‚‘0‚ÇpAE•ÇÀçFrß\NÃßÀh§²§á”cº/nÑ›‹æ‰ù8M>dEYÕ‹ÝëS+J‡
-Maž²½LÓ"©ëÁW ±´hu
-ï
-ŸDß&`™é款0>Vøå²ÂíúY >¹dÇ›‹›ýfðë‡ 1£òXßß/êÛ%ysVŸèôáƒ,‚·‚Ãø8]ìrhвH^†v‘D†Ñ
-²ë®‡µ‹•a1ðtî»xg>v d*íŽÆÿýMíí“¡4Enć?—ñÐ'ðç 5Ê8ÉhpbzûõíÔöÿB"endstream
-endobj
-1923 0 obj <<
+xÚ¥XKsÛ8¾ûWè°UK×D0^|ÍMŽíŒ§2Ž7rjwËñ&!‹ŠTDÊŠvkþût£Z²¨r¶¶x Ðh6ýøºA1âðˆQ±(•é(N5 ¹Gùâ„ž`íÉp<cÏ4Þå:¿;9»Rñ(ei$£ÑÝlGVÂx’ˆÑ]qœ3ÉNA~û4½;Ë0’<˜ÜÞ^Þ\\ÿ çx€ƒóàÉÍ—ÉG¢Ýž¦2˜|¸œž>Üý~ry×k³«±à
+Uù~rÿÀG(þû g*MÂÑ&œ‰4•£Å‰ µRžRLOþÑ ÜYµŸZ@p&U$L å ”EJ*k‚ œHEÁSÕ<fŽã 5›½¿¯ÍjëHË®lêöÎÒ`3/ó¹ûhÞ¬«‚˜ ½³å²*MA ]ãˆUõ"µ4^TžÕ~½mè /¦]“p„âap77­!§58,1‚¥a(í±œÊŠ ¯2Nd°X·‘—«S‘&7…¡¥nnhå+çrEl@]/+GGs ©Î´VBy•µ­wÛ%‘Ã+áÈSÙ“ŸeuAbŽ©ÇÉÛRë A[éTFBÞ,V0R«²6ÖVI0©·ÄÐûÖ½;Qßé_yÈÍÜ,;ZDé ÇÙ•;Q$“”q!CPµúå¾nòEAœûñaFÊ1ÒV°‡p*gîî ͳY­Ê¢0µ=ýX©”É(I¼(e·”‚½ìYÆíÒä%º-'*E0 l{6G¢#£®š‘ÍlžþuàÄàˆ„2¦(ŸNÇ Â/ßW4Øl6¬lsÖ¬ÜJ†fÇÁø½…Œ‡GÐtÍoÅÕ <4c¿=…$Úë
+
+ÕîN ïa`0t¥€P½Î$ÌU4¹´kˆÚͳn ˜ɤ?Α`N<Ë’ihPÖeWړäÇ] wô^d…ã$_ÁÀdXÙpDÎKêDcñAjl‹D½/ÒSD!H—ûq8Ï0e•|UMNÕö%â•îMnÇC&ö¨Q†’LŠ— ñ5’ÒdµÓ㘹!¢ÞÂHÏÈ‹/+wºéh°\•uç·14è=ðêÈ›¹±VÖdšæ›SRÎÚTꘅ±ŠömJ²º1›ð}MHF+­¹üŸ³É[¬×c:IÍd‚ÈÜ)©å½¾¸!¦_no?}> ¡qwÀ‘: új6à”” ù6ž«$õ.§hÓЈ
+
+úî¤(Ûe•m‰Z7õØù8bÐdžû.žLß__cŠ©^ ߀µlÀR‚\@ä¼e«4â>ƨÀAÔf©¶´]ÞÔ€ÿkÉòy¶Êr0-š:oŠ²~¢µ…‡õÑÌ( ݼ5µý”ÀBrDÞxÿÔˆQêÂr[Q$ØÚ%Á… x ´fõŒ:á¸qog^PDODÚ“·Äât§®£l›L ÜÉ„ú˨&^ÏhaÛ¬ÿ^sUÚâÞ«ïõª&6°ˆíIM]˜¡Ê1ûý-‚^) $XãAq •³¶©±ZÀ-¡0wMKœÃª€N€Ç}‡Š{¿º¦I)›†)´¨ÓØØýÄEM²4ntðš6î%ŽwEÚ;Ø~瀞‰Ž_vF/®§“ó—C
+q‚Ž:#ª3(8& ¡›z…¸~'¶²}Õl[,¨)З ù&~i¥½ÇV§I°®Û#p ä:öpKš]]¤Ëøaë¾ ¯g¦ËÏV¦mªg>ëÿ Wüí¿¿}úãòÏ3Š®ò! øÞÎÓËK:ýäãôÓÛ
+$&;Ä¢n[“¿™í“©wí lÇv4bº7Þç«÷‚«p¨/HXö|ÃÖ•€ :M÷ŽxþåÃôí“AÜyœ³÷³Ý‰ƒØGw 뚆 {W:vGëUÔLé¨7?D€Gs&O!&àþ„¦õUp¿Q©¶7ˆÅÇ®UQ$’Þ1´ùW)c]øÎÂ÷ÿ8^weUvÛŸˆŒmÝ,[È’Wà»Æ D[œ@o¼¿t0eˆ%jø‹…€ÜÜ‘pˆ4ýßÇôrH¼lÞ³÷EU¯Ú»Íóƒ'åC-§ÂËö%Õþð¼Ÿ0 Ž–©x3 P…,‰B…uÑtGåÅékŸß¸^<šÁ‹cĤÔâµÄîM‰ø_gHCwr®_Ëûç›ò6YÙ•§zyt5KÁÑë¶è~¼Øe_¡Y•= í¢™Ž“+è~¹u0–F-Áñp:üA9©¼OŽÿû?èËo^­n"‡qÊ8dðqä•ÂC
+¨îÿ˜êþŽâšendstream
+endobj
+2387 0 obj <<
/Type /Page
-/Contents 1924 0 R
-/Resources 1922 0 R
+/Contents 2388 0 R
+/Resources 2386 0 R
/MediaBox [0 0 595.2756 841.8898]
-/Parent 1912 0 R
+/Parent 2371 0 R
>> endobj
-1925 0 obj <<
-/D [1923 0 R /XYZ 56.6929 794.5015 null]
+2389 0 obj <<
+/D [2387 0 R /XYZ 56.6929 794.5015 null]
>> endobj
-1926 0 obj <<
-/D [1923 0 R /XYZ 56.6929 581.7741 null]
+2390 0 obj <<
+/D [2387 0 R /XYZ 56.6929 562.0317 null]
>> endobj
-1927 0 obj <<
-/D [1923 0 R /XYZ 56.6929 460.6765 null]
+2391 0 obj <<
+/D [2387 0 R /XYZ 56.6929 444.3852 null]
>> endobj
-1928 0 obj <<
-/D [1923 0 R /XYZ 56.6929 366.7195 null]
+2392 0 obj <<
+/D [2387 0 R /XYZ 56.6929 354.5963 null]
>> endobj
-1929 0 obj <<
-/D [1923 0 R /XYZ 56.6929 293.4426 null]
+2393 0 obj <<
+/D [2387 0 R /XYZ 56.6929 284.7704 null]
>> endobj
-658 0 obj <<
-/D [1923 0 R /XYZ 56.6929 247.3727 null]
+842 0 obj <<
+/D [2387 0 R /XYZ 56.6929 241.0985 null]
>> endobj
-1930 0 obj <<
-/D [1923 0 R /XYZ 56.6929 211.2315 null]
+2394 0 obj <<
+/D [2387 0 R /XYZ 56.6929 206.0104 null]
>> endobj
-1931 0 obj <<
-/D [1923 0 R /XYZ 56.6929 172.539 null]
+2395 0 obj <<
+/D [2387 0 R /XYZ 56.6929 168.371 null]
>> endobj
-1932 0 obj <<
-/D [1923 0 R /XYZ 56.6929 96.3402 null]
+2396 0 obj <<
+/D [2387 0 R /XYZ 56.6929 95.6233 null]
>> endobj
-1922 0 obj <<
-/Font << /F37 802 0 R /F22 737 0 R /F41 939 0 R /F21 714 0 R /F53 1029 0 R /F39 899 0 R >>
+2386 0 obj <<
+/Font << /F37 1018 0 R /F22 953 0 R /F41 1208 0 R /F21 930 0 R /F53 1303 0 R /F39 1151 0 R >>
/ProcSet [ /PDF /Text ]
>> endobj
-1935 0 obj <<
+2399 0 obj <<
/Length 4190
/Filter /FlateDecode
>>
@@ -9373,1103 +11443,1652 @@ p˺ëæ‚[À‘ r8ô >ð >­EðI‡<ãt
ì`WAŠõÉóõ82ÒþÀ˜Ï9Ì7ÏÜÌÞ¶óMŒŒ® N“:å“ÄÔgÚ_ó€Íu2±@0°_¹šT‡ÉÙ’›ê’o:æ¤ËHÐŒoi!Ž,«ë4¸«Tz²ézVÿ–N{ÖJf†Nb‡÷ûW³¦nòD&3çMg,Âù²×/‹op…}ŽRcpõ7+z›@
‰PÍ}n@© rüƒva¢ ±}qM›ï9îîþ@™3}]}9O!£…ìX"B¾gøzPТZ†C1ÿ8ú|ãOù7›úyü]Wï
DrÐYúûé8ÆEôȵî9'ÝȇH¥ã$5öäq2U*tìJ, ÕÔ>çÎh¾P@N WNœq‚Gbˆ¦š³CÔUK–iC'vbÂ×<Ítþ”¨È¤q8`ûùÄ9‹íÎY&ñUfÂ0ϧ†!»³{i' k’fŸAÛ‘ÖñÉ¿T‚“L?óVÜHi‹ðæäÊŸ¤‹t˜™„Ã{ì=mtÀNr§”¯rŠ—$Ùtõ)Ñ’u×*?gT2ez¶aóäjkA3;ê•Pݺ\©ú‰ÌÃ4¿¦kn ÿÉgêù.—Ö'ë¡I¤cm?%%˜EE‰µ£"]x•r(`Nß겑LSs>ÛSbxW/V¨6+*gS8`¼jÚÔG¸UáúäôÜé*ß,ˆeÆZXë¡E„ã¡Óv;ÐþÆSi8¤KÝÆ8Ù‰ⵑ¸ú”ú“EE@zp~ü„q\ó5
-¾NQü­ñ—ÿ(·‡-_às¤þ*o‡Q¶ýô`“«¶»€qâ§ÏÍôÔDømÂ_þ™D÷+Ø
-Æendstream
+¾NQü­ñ—ÿ(·‡-_às¤þ*o‡Q¶ýô`“«¶»€qâ§ÏÍôÔDømÂ_þ™D÷+Ø
+Éendstream
endobj
-1934 0 obj <<
+2398 0 obj <<
/Type /Page
-/Contents 1935 0 R
-/Resources 1933 0 R
+/Contents 2399 0 R
+/Resources 2397 0 R
/MediaBox [0 0 595.2756 841.8898]
-/Parent 1912 0 R
+/Parent 2371 0 R
>> endobj
-1936 0 obj <<
-/D [1934 0 R /XYZ 85.0394 794.5015 null]
+2400 0 obj <<
+/D [2398 0 R /XYZ 85.0394 794.5015 null]
>> endobj
-1937 0 obj <<
-/D [1934 0 R /XYZ 85.0394 751.6872 null]
+2401 0 obj <<
+/D [2398 0 R /XYZ 85.0394 751.6872 null]
>> endobj
-1933 0 obj <<
-/Font << /F37 802 0 R /F21 714 0 R /F22 737 0 R /F53 1029 0 R /F41 939 0 R >>
+2397 0 obj <<
+/Font << /F37 1018 0 R /F21 930 0 R /F22 953 0 R /F53 1303 0 R /F41 1208 0 R >>
/ProcSet [ /PDF /Text ]
>> endobj
-1940 0 obj <<
-/Length 1972
+2404 0 obj <<
+/Length 2028
/Filter /FlateDecode
>>
stream
-xÚ½XKsÛ8¾ëWè6RÕÁƒ £ËYÍdl¯¥líV&Z„$ÖP¤†¤œñüúm
-Ù/veÝ&&ûš)’,tb‹²ñ©ŽãØò4¥Q[«"µÀžÚÁŸGU½XZ9X““BýÕR‘ìU­ªgU™y¶1ï¤xq’O‹Õ”ˆ‰ªe‘Ö†ò-kvömë8 T"΄€A’sÚš¹œ?N9Ÿüëv‡“ÙÂfÒI\­~6¤o»l½3ì6ïÖè;S[B¹1öInÆus|H/óÖ|MyR»ä9++mjÍÅ`¦@àYz%ˆD$Š»|Øû‚¢0ä.pë¤p
-ÍûX«Ôn¦´fªælw{µ/u¼ ²µäT=·Û¬Øšéï³dkŒ³~î°r2r‰Q©uY¥SG"âܲýì‘B¦fŒ)1±¸Ëç¤H=‚ÀqŒÇNRS%kŸ$H!œëPW:]úlÆ“ E„@¹Ã&C†Mõ.nîŒS–ŸîÛ[yäCŒ)‡6¸ØxªS@MaqQœC; $6#Ž)ÑéIbˆ±Òц\{:fycˆ¦,4Ñ ¤ß1ÇYѨªH4Z$yöw›°”–û$³Bt=+1+õñp(«F '™•nò ˜“õZ,Q‡ÀHËêCž¼Xqe˜Âd
-õ§ŽÂ»m“ pFÒ"àdÝB[‘Ї£!8ðÓãÒ¾­Á2ÙÒ@Þ¡Ý!L7fÛ{+»-ô¨ÔƒÅ:#Û…—òøSj˜óìÕ7 ÞǪ0là »H•6Ï´É&e:xëE[û)`\Tjç1J­ÉI]cŒÁî û0-Tm8?"BÍâ˜:ѺÏzŠCD%—ãXád–ßÓ P}D
-/tƒ¾Èö ?;½cDá„<iÖ&Þ,–³÷Ÿæžd 9ÂaHíVTñœ™°{U4Æ Ï dîS®t3e¸ÚYçµ>oýi}ÞN²Ú¬BžèRKݪu(FrhD¢ab:Mð;,¾í
-eþ=Þ{)ÊCÕç%È‚šÁê€ø/°$)×'´¿·ÖBŠöE\Vœk­;®3gXGDàë/Á³¯O º–®QÈ¡ÇË}}¹nº þê$’nD»QâÑ¢ë-ìúš$ßú€MÀGC`ý&ËÕ«þÅ.XšðoOÄÿ:®×ý —•k~ÒÕðnÿw/ ÖqÃnu'uýý™‘¾)0°÷ÚG% ;q¦…P‚CÀ†0'lÂ(…Fú aµÞÌ—«ÅýÉÏ‘ÎMg$8‚s]iylǶ§¢Üö4šÜ¨\m°ÀÂ2ÛmWc š7KÛq¯»5ÛÁZ.C]›>+=}ùøè@>M¬^×BX¾¶cƒåÇÛ†À".ÌÈ^ÆÛÅ ]1
-n1{wïäøħ6É1oήéew×µ—ß²Ù]ê,Òò¨ •7
-endobj
-1939 0 obj <<
+xÚµËrÛ8ò®¯Ðm¥ª!‚A‚G%–³šÉØ^SÙÚ­L´I¬¡H I9ãýúm<H‘,';µ¥ƒ€F³»Ñï™bø‘)PÑhF>â˜ðéæ0ÁÓœ}œ‹ãµH^ëýzòî–…ÓE ¦ëm–@X2]§_fïCs €g7wq¼üàÝÄ·÷¿þ²ü÷Ü#¡ÀÑlñð°¼»YýkîQŽ°1žýº¸û¼ød`óˆÎ—ñüëúçÉrÝIÖ—ž`¦Äúcòå+ž¦p‰Ÿ'±Hðé7Ø`D¢ˆNŸ3Ä}ÆZH>‰'ÿèöNõ§NmŒ( ¨C”ºÔÁ#0Ê´:Ö{©.ñîÖ'=T
+}?ú
+Ç« Ê€áˆS*,Jyl²²˜{Œ‹Y#ó¼ý¢O® Ø/öeÝ$õ9S1¿%[”‹u€„†§) ÛZ©
+š¥WüDˆaç—Q|äû¼5Ü&)Z†æÿTËÔ^¦´bÊft»ƒ<”Ê^?ÙYp*ŸN»]VìÌö7ŒY²³ÆYßwX>´ŽQÉMY¥QG"àÜ¢ýä äƒ§fŒ(2±°óç¤H„@qŒ‡-¥¦J6.Jà0B´ªC]ètî³z,b( Â.é3l¢wusg”~x¸×¶vÐS;lRàjëˆN1…ÅEpå$àØŒ´H‰rO‚¥²6øÚÓ)Ë4a¡€FH
+È¡'‚1Š|ö–¦(ÂA—¢’ãQ‡by¬²Òã‹á±) ̦¶»}îÑèH…­,6ejœv:Î"šÕ“Ü–&ÖÍ^¥Bõ©MG aEÁ^Ûø@˜Ad3äɺ1
+òÌY‰x³Šï?-Îês„}ŸÚ«Èâ93f+²hŒžðܧ\ªfÂp½·ÊÓ:×ú´:×›¬6§à'ê£ÔB·j
+†‰84"ÁÐ1[NÃ
+Ø‹o{È5Žì- ¡o§/Á»*VÍÅìTÔît ™ù!‡éövõÉô|#…òë;ÙlÞUºî"ˆñ­‹RŽ—Ks¿Å§øþí žf;•L‰J“¶mPÙ U@¡€½[ùˆùAËÓ§ˆ ÆÛNZ^ ½mZÔµÜxi½­ÊÃïò¥(”AÈ}§²[0Ð}$Œ\gB&ð1Sµ) ÍÊ´Ýv›ÿÇGó¿“…¬ÓJš^¡Ì¿G{/Ey¬³z‚Œ (Ð þ!ˆ{˜€£ˆrU¡Ý½µú\´Oâ2âÚÖºÃ)Ã*"
+9ôx¹«/WBçÁ_[Š¤[Ñn•8¸¨xó»¾&Éw®Ä&`„ÀÁ˜Eî 7ì£liº¤8D³AÛ,—¯Z ÙÀØÁb=W,Öb½n1~PÏ3˜È:;ý¢y[Ñt¶ê”/‰rZyNþßÖûâÕÝjã ­&,„9ó‡¹}“'uýýn½}SêÖ…Æô`ÒTã÷ˆÞâëµ 8
+9ãÿK‚ßçô8¬$TMç„Œ*ÉÍ2þð¸zX¯îïÕlœíéy”†G&$ô0~jŽ'ÝVRnÛ#Ìnd.wmn…ƒ8Ûº±ƒµª7±mº·Oz±‘Ë@7¦ÕLÏ_>>¶u>M,߶‹²xºi…ãÇÛÀ.ÌÊNNSÏ^bа|(>Ç‘-uº‰LŽ»ìYÚ’úQ2Õ£*øjí¸×F¸|ɱi„0¸"ºžkúXæáÅ•k:,=D“1Ë
+ ='ùIœrë¬É!
+ê¼áø55D$¤m¥=œZÞO–UYœé
+endobj
+2403 0 obj <<
/Type /Page
-/Contents 1940 0 R
-/Resources 1938 0 R
+/Contents 2404 0 R
+/Resources 2402 0 R
/MediaBox [0 0 595.2756 841.8898]
-/Parent 1912 0 R
+/Parent 2414 0 R
>> endobj
-1941 0 obj <<
-/D [1939 0 R /XYZ 56.6929 794.5015 null]
+2405 0 obj <<
+/D [2403 0 R /XYZ 56.6929 794.5015 null]
>> endobj
-1942 0 obj <<
-/D [1939 0 R /XYZ 56.6929 684.0716 null]
+2406 0 obj <<
+/D [2403 0 R /XYZ 56.6929 684.0716 null]
>> endobj
-1943 0 obj <<
-/D [1939 0 R /XYZ 56.6929 572.8605 null]
+2407 0 obj <<
+/D [2403 0 R /XYZ 56.6929 572.8605 null]
>> endobj
-1944 0 obj <<
-/D [1939 0 R /XYZ 56.6929 509.4701 null]
+2408 0 obj <<
+/D [2403 0 R /XYZ 56.6929 509.4701 null]
>> endobj
-662 0 obj <<
-/D [1939 0 R /XYZ 56.6929 470.2699 null]
+846 0 obj <<
+/D [2403 0 R /XYZ 56.6929 470.2699 null]
>> endobj
-1945 0 obj <<
-/D [1939 0 R /XYZ 56.6929 433.5878 null]
+2409 0 obj <<
+/D [2403 0 R /XYZ 56.6929 433.5878 null]
>> endobj
-1946 0 obj <<
-/D [1939 0 R /XYZ 56.6929 401.47 null]
+2410 0 obj <<
+/D [2403 0 R /XYZ 56.6929 401.47 null]
>> endobj
-1947 0 obj <<
-/D [1939 0 R /XYZ 56.6929 335.1577 null]
+2411 0 obj <<
+/D [2403 0 R /XYZ 56.6929 335.1577 null]
>> endobj
-1948 0 obj <<
-/D [1939 0 R /XYZ 56.6929 244.1508 null]
+2412 0 obj <<
+/D [2403 0 R /XYZ 56.6929 244.1508 null]
>> endobj
-1949 0 obj <<
-/D [1939 0 R /XYZ 56.6929 168.8052 null]
+2413 0 obj <<
+/D [2403 0 R /XYZ 56.6929 168.8052 null]
>> endobj
-1938 0 obj <<
-/Font << /F37 802 0 R /F22 737 0 R /F41 939 0 R /F21 714 0 R /F39 899 0 R /F53 1029 0 R /F55 1037 0 R >>
+2402 0 obj <<
+/Font << /F37 1018 0 R /F22 953 0 R /F41 1208 0 R /F21 930 0 R /F39 1151 0 R /F53 1303 0 R /F55 1311 0 R >>
/ProcSet [ /PDF /Text ]
>> endobj
-1952 0 obj <<
-/Length 1659
+2417 0 obj <<
+/Length 2162
/Filter /FlateDecode
>>
stream
-xÚ¥X[wÚ8~çWð'±ª»å¾™„´i“4èžîiûà`A}jì,†¤Ù_¿#KœÐ=›<X¶G3ŸæòÍÒÇðOúJ Ì"Þ#Ž&¢?[öpïÞõˆ“ ¼PДM{o.XØP$©ìOç ]
-a¥Hš~Ä··ã›óË/À
-<¡a 0\Ç7Ÿã+ûìvÑAün<D(%Aˆ1‰ç7“Éø,ø8þëâîÓõU<_ ¿O?ôÆÓ-¸æfÙß½¯ßq?…s|èaÄ"%úOpƒ‰"Ú_ö¸`HpÆü“¼7éý±UØx[oír
- Êe?`•cÕí6Œ°
-)˜¥¯çDCèå”ðBuF̺ª#Ê€ÃlÍò¤ª«H ÃE¯ÂÚ
-âj×6AZÀ&z–÷ëýRª£iX½ü†Nõ<Ùäkç\÷âò^‘S{³©ô|“¿gÀ'Àñ0ŽB*Ø‘˜4¤^ Š—ª£’vs›Š„ç¶4[éÙº\=DF`9¿
-Î u€kEFÎÚè®Êò'”–ƒy¹²@yóH(1‚B±@7k±–r¦PD€%¬˜­´Êê…ªeÀBDŠ®óïi).C'™8¥–`[ e¸í„AÍ) ‹¢´¯R+ùôCvU”ë-´¶¶Ýùú% 艞#l*os¨ýöÍä9Š°„&Ã"$”%Ìñ—øúöjÜq, $lpsÃÔL¥IS2¸ßdyj–Ô§1LÞÇp•öéùÄ>¼»³÷óúœåÒ>5{¬ÃU3úR!…¡bÇä¿’å°á¬\¢ŒÙ ¶Ç@!ª(RQ´Ë
-Áà"ö<š©­Ï§r“»å½ö¥_mtú¶ã@à@A[j«S¨¨*= Òj¾*—
-¦×ã)]»Ž‘VÊÀí,1ͨ1<HuÅjÊÔÜÝ?Û뺱Ý.²¦‚ºÌÓ™;hÄÜóÊÇþÐI’$'™ùë
-‘
-Uزo“Ÿ“É0Tí‘c‡ ™sâS‘Pªý™ÜZèB¯’µöÕ⺟+Ц*Ó0
+xÚ¥Y]{›8¾Ï¯ðÝâ§c„$$z‡§“Išvã´;;ÄÈ O1d N&ûë÷è &Nf·½@Wç¼çC™`øO&’#Lc61C>YmNðäÞ}<!Nfæ…f]©ùÍÉgTLbGa4¹Ywö’KI&7ÙoAòåËâêôü—é,ä8˜£éŒc|J®¾&—víË4ƒäãb9!q BT‹E88½Z.f§Ë³ëÏŸ.ÿžþqóóÉâ¦EÖEO0Õ°þ<ùí<Éà?Ÿ`DcÉ'O0ÁˆÄq8Ùœ0Ng”ú•âdyòÏvÃÎ[óé˜5—ˆ‡,šÌ@8b8·F˜ƒ f‚a$#µ6 ɘͼ”¶ÙìBôÇ3Î;’ñ6×Y¾U«¦Ú>-BxÈ£hÒU{
+ycumÒçÖ,ÆÀReÄHè-lKBµÉ›Fe/SÄ9bq$SWêå`j¥L0%C•quCˆã*½ÐˆÊ^˜`e/î«</WÅ.ÓD¤qðëòâµ>ãéÑ*Õ6mòòÎÎO—öi)µªÌ3«‘¶¬þ5å
+ipsïö¬Ô*×N
+—W×p ÅD_!©€æ0²wÃÅ/ɧ/—‹‘$'Ð|#"¨¼ÑùÑ4$¸Ýå…Ƀ¡ÇA‚åO <#»j;â’h§¿6«ú[{d¯Ñ†æ3_U.Ô_éæ¢uUmÐ;èpÞ…ŠðPtŽeï/ž{‘}’i±œª(ª'g3¸T›™/HPÙbƇ ßó<U»"ë÷Py]ïTö~ä@`@¸¯ A¬³²®Õj–Õëmµ1÷ïã`ÚçÛ;ض-zðá(PÓ§¹RYm´Ÿ-Wòïê À»È¦À_¬£Ý¢Ö~ÖO‹Õ ¹[±šEršˆD°¹<ÅóDF"ŒæøCŠ$‘<™Ëùü4œÃ¦ Zx-ÎÎ̹ ŽŽ>ðE‚ç1#7î³úìür±<Æiѱ%=ÎPw[ ©½-ê(þù]ij?ÌnŸí³é|nÐf”ɦ+Û_ŒµXztæóþE ÿл4Mßåúßh¨Â1kãÂdÌ®rÈ´…EkŽ0%²SSH¤¢§ß²Ÿ©FÈþåo ésâ“Ú¢‘ÿ='u ÊÝ’|¿t늀‹Ø t5‘¶n
endobj
-1951 0 obj <<
+2416 0 obj <<
/Type /Page
-/Contents 1952 0 R
-/Resources 1950 0 R
+/Contents 2417 0 R
+/Resources 2415 0 R
/MediaBox [0 0 595.2756 841.8898]
-/Parent 1961 0 R
+/Parent 2414 0 R
>> endobj
-1953 0 obj <<
-/D [1951 0 R /XYZ 85.0394 794.5015 null]
+2418 0 obj <<
+/D [2416 0 R /XYZ 85.0394 794.5015 null]
>> endobj
-1954 0 obj <<
-/D [1951 0 R /XYZ 85.0394 575.4191 null]
+2419 0 obj <<
+/D [2416 0 R /XYZ 85.0394 463.2352 null]
>> endobj
-1955 0 obj <<
-/D [1951 0 R /XYZ 85.0394 427.1073 null]
+2420 0 obj <<
+/D [2416 0 R /XYZ 85.0394 318.8302 null]
>> endobj
-1956 0 obj <<
-/D [1951 0 R /XYZ 85.0394 329.3834 null]
+2421 0 obj <<
+/D [2416 0 R /XYZ 85.0394 224.0131 null]
>> endobj
-1957 0 obj <<
-/D [1951 0 R /XYZ 85.0394 262.8864 null]
+2422 0 obj <<
+/D [2416 0 R /XYZ 85.0394 159.9229 null]
>> endobj
-1958 0 obj <<
-/D [1951 0 R /XYZ 85.0394 196.3893 null]
+2423 0 obj <<
+/D [2416 0 R /XYZ 85.0394 83.8775 null]
>> endobj
-666 0 obj <<
-/D [1951 0 R /XYZ 85.0394 155.0304 null]
+2415 0 obj <<
+/Font << /F37 1018 0 R /F21 930 0 R /F55 1311 0 R /F22 953 0 R /F41 1208 0 R /F48 1228 0 R /F39 1151 0 R >>
+/ProcSet [ /PDF /Text ]
>> endobj
-1959 0 obj <<
-/D [1951 0 R /XYZ 85.0394 117.4002 null]
+2426 0 obj <<
+/Length 2546
+/Filter /FlateDecode
+>>
+stream
+xÚµßs›ÌñÝ…fúPy&û \Þ[Iü%±]K™6Mò€²#P²ëþõÝ»½C€”Nç=°ÜííîíïEtDàGG2ðÅÔ(T—„ÊÑbuFF°÷ñŒZÏ!ym¬÷ó³·x8R¾
+X0š/[´"ŸDÍ“ã÷¾ðÏ_^ÏfÓ ïóôû‡»›¯_&ï§_Î=*£(Ono§×—Wÿ8÷˜$p2þ:¹þ6ù‚k·çŠ'§³ó_ó?ΦóF¸ö(áZ²ýøEF Üã3âsÉÑ ¼Ÿ*ÅF«3!¹/çn%?›ý­!ØÚ5GB‰ÏxÀ4Âèˆ
+Ÿ Øl«D*ŸE!s*‹¸aRTUºðžÒ×å¦\åñ}šëûK_­W8p¯R½ÔYK߀Ŕ/‰šn;§ÑØ4úûÉXˆšaÀEà!-ÒM\geïuYæ–#܇úJJfYòÀ”Š ËÙkQ®«¬ê…S?Œ>
+4 AÚ%R¸“ æöCJƒ‘×&a,è€Ë5X}E4J@Ýž½pÝ‘ <ôE$ðÕ‡#ô8=¢@J‹õÃã¿æ/
+>QÀ-vœ?”›¬~\ ÐL%ÂÀb6D'D»"$q¾-—Ë*­ÈôÁEŸìb€,¸ZèGâÕk, gy\U”Áå¢(ê¾üsäž$›Y‘ž4XCqy’â2†î-|F¬Oïc] Pî^ëSNWRçRѵÍï©aûù¤û%Ù&]ÔåæuÈý„0Iû·*Nj©€œT¿®‡4/À û4oÿYŸ$»Þ”u¹(óßõn0LBHT„Îô·eÞsÂú¤ÌTË [è*×£÷|’^ž>¦µáh~µP±+<2à1ø4R•eÎ_NgwW·ó«›ëæT·\:XHféý­Dgô‡´®Î!_Q]¹,ô‰¡ú1Eà!{N 2›Îͪ«Šøãc±y]×%±ÁH^ði‰ÅE‚Àý6Ë“{~Âò´BfËrƒQë¤îm»ðþ$’ÌÒÅÖ1²…–é|‹+|&©fQ¤ ¾f¶@ß}°” „J{¢Hz{‚ph¾lCA#hB¬óÇ!ç‚ŠL¹ˆZ>`ø<p8å‰5ÏD`
+XÉ*|Vët‘é˜
+žÓëùÕü;îîdPXõÛtãª*™uox·=©¢ˆÉÆ¥¹éN„ïvïÛlz§/ËÚ7G®³\ƒ× áP‡ …zÓ㇎âÍüS›ÓN->.â°hÀf<ÔŒ›ñ^ìxû×ÖÌ8²aè³0 Ç#¶…t8`’‰×‹½Îv Gù9œ}~m?™O#uø]tg]fWe’¾Ãßµ¶ˆm.óÄ«ê×ÜÖv×;j—$hÑr[»#ŽjZÇ0|Ķڿ·Ëͼÿ•´È]€þÞgTý­Ògj÷?^ÓN¦¦¿b‘o“_lù2ŸóþZáÚýÄþG¨WÓ8ãáÞ9w+\®`¶2‡|·_lw$Ô®ìÙ’ ÚŠãÜ}€¤óŠFIŒöü¬ÿ:僟¯Hóîÿþ›x÷§¸}ElعX=„Ø
+¥µNÙû‡ò¾ìÿ‚Ê¿Áendstream
+endobj
+2425 0 obj <<
+/Type /Page
+/Contents 2426 0 R
+/Resources 2424 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 2414 0 R
>> endobj
-1960 0 obj <<
-/D [1951 0 R /XYZ 85.0394 84.3344 null]
+2427 0 obj <<
+/D [2425 0 R /XYZ 56.6929 794.5015 null]
>> endobj
-1950 0 obj <<
-/Font << /F37 802 0 R /F21 714 0 R /F55 1037 0 R /F22 737 0 R /F41 939 0 R /F48 953 0 R /F39 899 0 R >>
+850 0 obj <<
+/D [2425 0 R /XYZ 56.6929 769.5949 null]
+>> endobj
+2428 0 obj <<
+/D [2425 0 R /XYZ 56.6929 744.4739 null]
+>> endobj
+2429 0 obj <<
+/D [2425 0 R /XYZ 56.6929 712.5891 null]
+>> endobj
+2430 0 obj <<
+/D [2425 0 R /XYZ 56.6929 647.0402 null]
+>> endobj
+2431 0 obj <<
+/D [2425 0 R /XYZ 56.6929 551.5126 null]
+>> endobj
+2432 0 obj <<
+/D [2425 0 R /XYZ 56.6929 446.5077 null]
+>> endobj
+2424 0 obj <<
+/Font << /F37 1018 0 R /F21 930 0 R /F22 953 0 R /F41 1208 0 R /F53 1303 0 R /F55 1311 0 R >>
/ProcSet [ /PDF /Text ]
>> endobj
-1964 0 obj <<
-/Length 2625
+2435 0 obj <<
+/Length 2973
/Filter /FlateDecode
>>
stream
-xÚ¥Z]oÛ¸}ϯ0p_ fù!RÒ¾¥MÚdÓ:¹µ Ün·Š­ØBdÉ×’dý9¤$ʲ³À"¤ÈáÌs8<¤ÃFþØH*¢bÂ8 ’29ZlÎèh}ŸÏ˜•™8¡IWêÃüìý'Žb+®FóÇŽ®ˆÐ(b£ùòçø È9h ãËélvõqr{õãÓ·»¯_.>\}9Ÿ0Ej|q5½¼ùßù„K
-C`
-&BDA
-Ãá,±}€ƒxg¤8QÿUZWç!Ù†ÙÚ l¬Õë+«ì9-t•ŒŸ³qŽ_»sË Š%X,v¯ÛºÄú:1Ë,­¾¤XbåaŸåËÖ¬üI)ÏÓÊZ(wz£‰sÜæfÌ´RIgébï é6è‡fö¿’
-ËeªMé?³ËoŸ¬&ÈSÒŽ(–½¾€
-8BHýÐÝ™¨f}›è¤ŠHL!ŸÌ†])—¤³a#eÒ”Kz²›¦($èXå¼®sŒ3Â#€ÓIï©÷ºHcœÐé¹7Kót¡1Ç9G|é
-"fµK¶ëlM“p¦
-ÊÆs'ûœä{[-‡¶äd Ùi8Á{ÂRƬàf_Õ¨öÁ©/Z;¦ü6»øz)ß!‹Ø
-}@‚ÈìúBNDl|9»Ð5)ÇS€©èvrlj%°“KeÇâ·d»a˜òòKöËìQc]ƒÙl,5¾Nó|bü£Î/d3›¤ÐA/&£z1+»CÌrÚ}‘t·Î"q"YQ¥E•ÕH£;" ‘Üèå £qQê2î,¹iÎ*l®¶é";Çí.õ–(PÌ.ʾdyŽÍ&Pî+³]¡ïá[–éc²Ïk«h_@ʨ°GãjàbRæNŒ‰@ HÈ›¤]në¬,g1±Ppz
-*}dÍüªLn¡¿
-ŽœvÌ 8æçP˜@,Bß³›b ÇOmV4îÀ5µ+ ]á͈ ;eQ'Y‘«Þ(Tªu¹Ï­ô:yN=9Þe V£^s‘ˆ­B[QZ§Œ´¥t\¿¬Ì°ÇepIMõfjs¿ýÖê( ô?T‘8 ƒ®Ôq4Rƒ')t«ÞÛÀI¤¢Ón9¡·¼' ÷¼ˆùnÍRC†ì#‚®øQ ™åºÎñüìJ·öÆÛQ&·w%Ûœ‡ª|H騇¦{=¼0¬jNnUd ºdY.D©Hù˜¸Ý¶§ømj‰Ö,[YØ´ڤ„ÚA<€ŽADÄ„êלÓéH€ˆ“2Y÷M*¸ùÆá&ЀÉnøCFhõLÞï²Â‘ÎIJÐu¹³×€j¿Ù$»WŸL5Ô ¯]Uïóòj¯i¶£fåÀ«‡k\Öl_ÅVi1phÃ$c¹„y<64Ò kûv¤NÄÆI™Ø<Í)“mlLƦkòs
-”)q÷Ü7’öö]bCî‚׸ÂCóа£+ÈÂðœƒ]©ã+ØH™ܾI]»ÏȃÔõ¤s-u=ônºzîÍð‰•Åö9•SpǼš¢K¦Ë’PÝi‘'¾²ñZbûSKd%¨™×jnöÜl@ýYì7:–ºé!­_Ró¦ ÔŠÁVCúáN{/[\Js‚R÷ÇÜ ~˜SJ¡ ê(VG¹ ï΂ ªÛ²ª²‡Üjj˜[
-ß­.™ã.KÃRî 3æ6·=´ÐÃÛ”V-¢ :ø-Æs„+¨ì=ÌÚG"ÎÜÃlkúâûüúãÝô“þ­õ6Mï™m´î‡¦Q´}ÆÃiOïÜXƒ]åP¯º¨WõÊó€´Mº&mŠ|LwVؼ påVL“æe«Ó›ìõãhmßZNêD;/ì/(ºÍ€tsš&ÝW3÷"‘æ}¾;€Ú£pWÜÂipí¡ã`wBëÏÃ9[aÐÿYÍ£­!‰yÄOzåd½òo.œÄ4–ž[³Ã‡²eú°_­Rg¼"Ç~Ë’è༢ÍOEÿúwþö¿‚öRtäy‹‡’À`åœÒócŒÆÙþGÀ¡ï;úendstream
-endobj
-1963 0 obj <<
+xÚ¥ZKsÛ8¾ûWèfºÖb€à£öäÄvâqüØس»S“9Pe±B‘‘²ãùõÛ(€¢è­Ýä
+¥ðe(„)ŽþÑmhͪ¥C‘"ñeÂã‰pnI„УI,S?\(‰¬³7¸¸H¼YNm“·Ø‰½v•oNXâéñ¬¡ö5/Kê}dð¼•Å<k‹º¢ÁEÖæ§Ð /›·ÅËðTÞÎa5ÁŠ ò®ó7½y»ÊôéE5/·‹Ü M·GF=›qЈbʘŸJÉÕ½`}½~†ÓgeNš}-ÚõêrWSÝ—|Ó
+ ÕË©‰î‘0çµj49¯«6+ª¢zê­ú‘¿Q§YÕÛRS¯²—Ü¡ã^óœÏ‹ïAÀs³#JBA6ñ®–4VÕš)E=UHœr4å¹€¤NIÛ$TÕ½º¥¶Ð¿·M¾8„(æ¾dà%F`SBG¥€°
+bì|
+ Ynêu™Íòr V§¨ȈhÍa EÒ‡ì)}GCÕˆ† •ÒÐõP†ÔO¦æÅ&Ÿ·5­ïƒ%‡Ô0ŠÆ™ë¨¸sÌN‚ãÄå\pÓÓ°C.O±¤Í@ƒUÌW=òÆŸ¡.MÎãø¿V›ëÌØЦhÛ¼:¬ br½£ ‹jD†JéâÇAk;rg-{GZ‹}¤ë×TôÁŽ}´Ð€ne²Wȉ´ÐMÐXvX‚„Y¿“LØT#4TJ‚ÏChf˜1{ÞÔm=¯Ë=4‡!àN†ãÌuTܹ)xêÇ"Š]öÎÂäzr=JÇ5Kjê%+·9u—#J“‹.ä`a˜$:!€ñþ6\Ŝɨ©¶ëY®w›åíkžW4h2ôvØáRZ›«BÀ]Ò vSˆE¾Ì¶%fH@ªKROÐOL$¨f5µÌÝzpþ¹nŠY8¡.ÜÐ Ý©ðÂ!ÛýÒ\g½8 µU‰L¨ ƾ]~¢.…Ô»T†¦mܪêóf;ŸCQTo£6 c?¥G­Muµ•Bm;˜CcbIûöœ¥ÀP²„ã|uTŒõSà@`ÎìJˆ¯Ê–
+4¢Bèn&°
+€eÇ${ç`ûöάõ‘<";ÃN‡zü¡Ò0híÃüÝö¤ö‰K¨öiFElÍ–Ù¬(‹öÍͶ0_µJøúä¬ÍyÁtfcêÐ0wÑo··çòj¾y{6¹*l{ñ"e¾"G¼Muñ•BüË°ŸPåhÍ—ùK¾ï¤<†Bm”³Žj€5·úg>—‘ËÚPʑ϶OO]1¤8;,3 ¾#3‹jDf†JÉl/K¶è# ÑÀ‘NvøI÷Ž<+ËúÝp ô$ö9%U8Ø%U8ŠøÂÁYNí“Î-4 R«h¢Xê+MÙíwuN3¯ô>‚CÐÊb‘ëqUÞà0=Êà•ÒÁ¨ÍBD@e¡a
+†öjÌTŠ©ô¶ªòó—º|ɨ7S8uYN¦<ôÓ
+"êI=áW˜j5~n1xýenFñÎ"o†öÁbça@‹ÅšMh¶j[ô=?•®aò,ÚS2â¡w¼®©+¼ã×®·èz+ÓSwÂÕë aØ¥côy±{ ¦E-¾½lIæ,&$Áè[žm4Sè9òYÕ€I’žOD’:<œ®êí†~,²·F‰´üTÕ2_˜(óì™zê0´*M·®«v¥7uOWCÝyÁ㬭 BøaŽ·8AzÓ×ITO뢩4§vIˆ§ma³«^ðqë_'®Ö–­û^c)ø´ÿDc+Ãz
+³”a½4PŒV#…(KŸ§é;)½Mu8XwT*Xß¿[ˆâG©õR]¥ŸæDÜ’÷øë¨tÒœ(ö£fuž“ÙBi´ d†ÔCcº{QÁ¢‹F(øaeV×ÔÎô&ú­Sišîù Ÿ³yê-[=Ô´rºš‰SŒäf>T¥ë2öc.¤kE¯…ú.síè¹ù„·0¿¨Õ~Ž+ô…¼XX{У­µÙ¶1©»@«_lqkõN žü¿µ´zª®2|,{|L?SÛ=íBE6Jßw¬k¦
+wó¹æt/S5å‰eßÁ'Võ+6‡ Ap?Nâw2}›jÄ •2„³wßÇì ô…dÉ8{Õ
+IÌ\ØÁ]‚;¶´î8D Â`ZQÕÔ¦‘\aZJÂ4N)Lã aZÈn#Êï#Lck0}…ig'B±áDm*Ìï>âÿgLÇ1TPùŒºÞ|¹ÖD
+Ð߆Œÿ7ˆ~lí8Œg¢ÙçÍEsâÇ1D›9 æD»ìh0'äÔ±5`¶©rI _òÈo#(gøÕ’ºnƒƒ6ˆNŒ7‚FCÆ÷¶gÑI°C4ž<.¢é æ“ çYc'»*+ð®ZS“(ÿm½â[1ÀJ:O©c€ýgíú­·“ÝÇ:4“ƒ#¤83 Û «zþï¿ÏÙý5RƒOH<D‹
+¥ËBÖg½ûKž}Þÿ¢Êòƒendstream
+endobj
+2434 0 obj <<
/Type /Page
-/Contents 1964 0 R
-/Resources 1962 0 R
+/Contents 2435 0 R
+/Resources 2433 0 R
/MediaBox [0 0 595.2756 841.8898]
-/Parent 1961 0 R
+/Parent 2414 0 R
>> endobj
-1965 0 obj <<
-/D [1963 0 R /XYZ 56.6929 794.5015 null]
+2436 0 obj <<
+/D [2434 0 R /XYZ 85.0394 794.5015 null]
>> endobj
-1966 0 obj <<
-/D [1963 0 R /XYZ 56.6929 749.0289 null]
+2437 0 obj <<
+/D [2434 0 R /XYZ 85.0394 287.1527 null]
>> endobj
-1967 0 obj <<
-/D [1963 0 R /XYZ 56.6929 675.7286 null]
+2433 0 obj <<
+/Font << /F37 1018 0 R /F22 953 0 R /F41 1208 0 R /F21 930 0 R /F55 1311 0 R >>
+/ProcSet [ /PDF /Text ]
>> endobj
-1968 0 obj <<
-/D [1963 0 R /XYZ 56.6929 599.4635 null]
+2440 0 obj <<
+/Length 2099
+/Filter /FlateDecode
+>>
+stream
+xÚµYKsÛ8¾ûWè°©f…àI
+?ÊÂz³âöñJþéœY©(ý«¿l[‹v³öYgEXŽèì9“h8üubõµŽ3«Ój©u¡±µ#ßB­AFøëáuZ‘øöÈÅ 5¹ c¥ÌC‚c—•,»(¥]{Zmê­…õ¥{¶©€E “›¦eÃ$°Ê™°”
+žl’©ŠØõY©ð–ó²x#ŽS°1 â>§ ÞÀ-ÁãoXàkÏ¡uúâWë4,<0àbì47e5eõ2Ú{Ò®ÊgóÁJ>Fà„8
+S¥mÝ9z…ÂHRybjèkµ½€ð@’ „%=[Ÿo˜È¡S öˆ¢¯; J‡N÷ò¨ ÿh-öÚdF2HÄ1ñðbY¤ks¨#¡4;TOë ‚ÖI ^sºjè4Tß)ð=†Fœvõy
+¶|j§òÖ¦½…ûäh‘„ÝJ×ÊÝšøF‡b­ZÀh£¤<Òª‘;»áÜFšr¾x[@œw°6+†¹ØlòÀrk¦wC‡ÄIìÉKŽE ›}²3Ða4„ ˜Êáøõ{ñø½SM Ý év{¿_™X”ÚöÉà (k¯ä2mG®¤ý”Ú‡´B÷¹*¬àX3/Ã9hß¹­5bÏ<+´—0
+Ñ$ M?4EB?º½ºp9f<b®\Ôž3žfÑK
+&!û£Q’„Šƒ²ü£“>ÿ Ùœ„dS•M9/ÿ$vÒíÿ8h7b‚`ûuZE|Q蟇õ\ ÊõÂ<Áâ÷–Nã®w}ÒŒ1Pø0¿íæ¤Í#]ÛÆöžNÚËÍ“ÉuP5´÷ÃK…Ÿ!b¿+€}û÷ È‘Œ»1à¿þ³Óî
+@’)Eã¿™S ÷= ²Ên†pzøg˜J V‡±ÿÑÉkendstream
+endobj
+2439 0 obj <<
+/Type /Page
+/Contents 2440 0 R
+/Resources 2438 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 2414 0 R
>> endobj
-1962 0 obj <<
-/Font << /F37 802 0 R /F21 714 0 R /F41 939 0 R /F53 1029 0 R /F22 737 0 R /F55 1037 0 R >>
+2441 0 obj <<
+/D [2439 0 R /XYZ 56.6929 794.5015 null]
+>> endobj
+2442 0 obj <<
+/D [2439 0 R /XYZ 56.6929 632.7441 null]
+>> endobj
+2443 0 obj <<
+/D [2439 0 R /XYZ 56.6929 393.4246 null]
+>> endobj
+2444 0 obj <<
+/D [2439 0 R /XYZ 56.6929 322.7553 null]
+>> endobj
+854 0 obj <<
+/D [2439 0 R /XYZ 56.6929 278.4974 null]
+>> endobj
+1446 0 obj <<
+/D [2439 0 R /XYZ 56.6929 239.5941 null]
+>> endobj
+2445 0 obj <<
+/D [2439 0 R /XYZ 56.6929 205.2551 null]
+>> endobj
+2446 0 obj <<
+/D [2439 0 R /XYZ 56.6929 131.664 null]
+>> endobj
+2438 0 obj <<
+/Font << /F37 1018 0 R /F21 930 0 R /F55 1311 0 R /F22 953 0 R /F41 1208 0 R /F14 956 0 R /F39 1151 0 R /F53 1303 0 R >>
/ProcSet [ /PDF /Text ]
>> endobj
-1971 0 obj <<
-/Length 2140
+2449 0 obj <<
+/Length 3022
/Filter /FlateDecode
>>
stream
-xÚ¥YKsã6¾ûWè] <<jlÍÄÉŒfÖÒÔnÊ™MA+©ˆ”§œ_¿EÊ•­9F?¾î†ÉÃ2‘a–%“4KÇ„OŠíž<ÁÚ‡+âhbO©Þ-¯~~ÏÒI†2AÅd¹ð’KI&ËÕC4ýòe6¿½ûÏuL9ŽÞ¡ë˜c}šÎ¿N?Ú¹/צf‹ë˜d’g@Ä5™ÀÑí|±˜ÝÄ¿Í~ÿ0›_[þz5[öb E'˜i™þºzø†'+¸Á¯W1à6ù‘,£“íUÂâ c~¦ºZ\ý«g8X5[CªàL".iÐ%BPÆ9)ƒgH0ÊŒ2à³û©¾ïrvkow³ƒ÷wApGàDZÅXF)IÃâßU;*2 ¢è
-Ò2îöÍvW©Nµ N*£öPªmׇªz¹&„D?Á¼äQÙÙõݾ¬;C›E¹ÛÒÁÜ“7kûÛm”¬›ýÖÊŒäfÉDP'Äo5üC?æyþc©ÿ¤Ž¹1Ľ¶ac×X-Úó`Ðvy½Ê÷×DF+;ӺݡÏbGËMÙÚiÿ›×î{¥ê®ücZä]ÙÔž»Œá*'‡¢í@o«”çÜÙßMî&žT­öy§Vè¬/cpA Qõv¨Œë‘dhVJ6à¥õó&éé¡'°)Iß>µ§z}ìÈ’Ã8ãcµ96¤%˜8›{¼ÖfoÕYU =H’ ªRWUOuQUožzTÕ«cƒª >ÒF  Ϩª>lÕ¾,ì‡qvµ³?-xñÀM<wæÕS³/»Íö¼‚…
-£ˆ¥R\ôÆ#0¨½vŽ=¬›¦3˜“:Ø
-ÈI(ø 9'%\ö´†$¦éqÜþ‘<îî4#`mAœµ¥5÷r£BRf(¥½2Ñ âÌYKC*Ãb þÊõOª+'ûmê =°^S4>%ê¹n“wŽ‰Nzð¨,`¨öÆô,xE3à/¢¿›Ú?EĪt'uP8V:DôªuÈ“îæ±UW"ƒ#O¹ùøõvÖgóNmÕ ºt]4¤°fÁ«0`€×ìyƒSJúŒÔ_)ÁCí&ÔÔŸ$jwª°¥‚]6àP­Z]¾J(éÌÍ®y|† +›Cëö©â
-ž~]þòùþ²fï
-¥kšêMO´â,^êf×BxœZ:ˆM%(‹ê
-\_€bcWÎq6*LDz?ÂÉkìâFXßÅ!nб>KÁámùw“IŠ=]\Ÿe%‰.º—]ˆôÈÐß{±â"ÀŒ2ȺØ7£E•·mœ3$¥?ñ›UÚC¬úÑ:ÀY@(ð¾LXWùSˆq‚’T’ž³Í0,''Pù?]”ß9*àK@Pq‘^bÓþìG»ÀAG"éÑe·oº¦ðQ° 8=gà ±+÷]ý
-£f»RÏaáî=¬gÚ^d
-x«ê'Hæ—\­çÙxÆL_ßÖHÆ$öÁèŒßmÒ3~¾(l¥žUõݯ>bÝ´ )Oq2Æ¢ÛÙâæþîËòîó<Pð¿•€*2ÄiFÇNgËvibÛŽÜダª4u×B×&ïõë}Ò•Q”®(j[âK¨ëì¯Kl2¢œq·£^¬é¤§ŸOî:;¥ËF^^ú‘)óªmÆ/}hOžR­[ó] Ž–‹»Ç>kyaíÍm^sÆjˆ¼s×n5†q]»ëâc§*ý\NBþ iÞu81B¡Î‰7£i»q= lúƒé3=–FFX0wn)šíÖ>ª²VÚ ³Õ¥fÑ{‚åoú?‘¸"ROnmçFyWlNø›{Ø£×+Ám3ðññ ›o{lé?²Þ÷MYlÎöÍΪA?„]¨=?›
-endobj
-1970 0 obj <<
+xÚ¥Évã6òî¯Ð-ô{ƒ[æäØN·ÓwOKyo²(
+¶ù"KŠIµã|ýÔŠ”hõaì
+@U(Ô
+JOüëIžÄÊn’.N”N&ÕÓ™š<ÀÜ»3-8Ó€4íc}??ûö›MŠ¸HM:™ß÷öÊc•çz2_þ]~útsw}ûßó©ITô}|>M”Š~º¼ûùòß<öé¼0Ñå»›ÙùTyR
+`‡ÆgEÁË},|½~`0hã2gèp΀ÃÈø:>’uÏŽœ•ŠU.1)l¬ŒÊÆý¬ MûXÁ·ûÙ éNKf.IúZ bP‚à#ÊÕÃæìåé9íÀG™ì+ÜuX#ìõµJ'.NøÏ3¿òU‹ÂÍ­ˆ=wQõüºm7Ïåî„ç:.AoœV¢7€ÛéMn;½È!{ÙèK¹Úɶ¬&aÈ-Kõ˜4Ž¤pR¬‡ô‘5M¥±MÕ[ /Ò@uM€%KÂϳ˟®Ñ]XS`göþ’ü«…È6»¼`ä;8”NÒЃ'M’Ê4÷ÁrǼ»û"º¹ºz÷q6?¯‰˜‰ q
+=å·äµÀ‡D<HbD4#Ž±!"´Éë÷ÜGßv]ߣe@£ïýj¶ÂH#?]^MYÂ>u‡\³åð¦ÈÏkÜáIÀi7bó€ÃJ’ã ø&š¡
+‹.²!ÍÈøt ã–þFø©ÊÆGÜøuS·õ?ê~oÑkfy´Þ`[ôÔŠ†ÉÀ0¹NàŒ¤µD¦óe¾f4¹Æ}©W+F±c ánÉs‹WYúûr·je£Ýz囆gÚÑx`Áx3¥sQé©Ñzíâ dÂÁV"ÖÁ)øþà¾]ììÞXuw>Œ!zŠÃE‹P_ïC,Çs#´ð]˜_rä‡kh}¹Ät"ç;fãÀ~œ%úä)“8-””ºRJ$! ¤%ÝRJЈ
+1e+¡¾§†øš)Öp[=úêÏtá
+ê¶lëE½ªÛ×°´•
+&&!Å‚¢ý#©0d Pr[Ø‘Bž41Q¿Î>|*p˜d_
+„©Í‹ÿn ,ႇ.ÌjÖ[;Ì ¬D2hýßÛU]Õ-Æì/ÖK`Õ9ŸIllUÑå|åÛr0F%/åÃR ¬Q²kUOul(¡‹T "”f±.²l¨4弑®B’–&¡
+a Ÿ8hý#W˦{ÀQÓ]mB­)LÐ
+ÕÄIMîc½­ÉiòÕ‘&'qâŠâ4É€4Br””Š«ÍæÕÁGuÈfé¿~ ’§cJš Ý¬–Ó¦}]ùîA8¼f¢SEG·Ùµa í
+e‡oËeÙ–x½ªˆ¾bÝ[Úñ'9ÐâX!rí‹ÄDÐï,7C%‘w-Ÿ“ªÕné¹#…bŠ¼ÓðXŪPŠyÁÈ’ UË·¨þºpnÚ /^r_¾Œí$Ñö¹þ"Û¥}‰Y«CúDŽ³ˆ²$±UG%¥z‰¡eû´Ù0aÌùë´/žlÏr¤Þî`ÝrHDBxsŒ¡j‘ɱ)ßVy¬Jñ+šl.oZ@½“/×M·GÉPŸñ‘úÖ‹.®üáK(œ—°é| ŠùR’„߶oï®ÿu*©5*Á<0ä6lj£Ym~ø {6»íV>[6¾éè<½é#ò"†lÜžv=¤·=D@"®«ñïL€ʧjyÇQvk’X'y~’­阯,ÖNéc·ë%ê‰ÆÙ .|lrô…Ó=<R»äÉj³nËšKÊÁ*N¦
+©ÝQâÔýÀâ˜÷ÿº ˜endstream
+endobj
+2448 0 obj <<
/Type /Page
-/Contents 1971 0 R
-/Resources 1969 0 R
+/Contents 2449 0 R
+/Resources 2447 0 R
/MediaBox [0 0 595.2756 841.8898]
-/Parent 1961 0 R
+/Parent 2414 0 R
>> endobj
-1972 0 obj <<
-/D [1970 0 R /XYZ 85.0394 794.5015 null]
+2450 0 obj <<
+/D [2448 0 R /XYZ 85.0394 794.5015 null]
>> endobj
-1973 0 obj <<
-/D [1970 0 R /XYZ 85.0394 752.1618 null]
+2451 0 obj <<
+/D [2448 0 R /XYZ 85.0394 751.3869 null]
>> endobj
-1974 0 obj <<
-/D [1970 0 R /XYZ 85.0394 531.002 null]
+2452 0 obj <<
+/D [2448 0 R /XYZ 85.0394 624.8718 null]
>> endobj
-1975 0 obj <<
-/D [1970 0 R /XYZ 85.0394 468.4168 null]
+2447 0 obj <<
+/Font << /F37 1018 0 R /F21 930 0 R /F22 953 0 R /F41 1208 0 R /F55 1311 0 R >>
+/ProcSet [ /PDF /Text ]
>> endobj
-670 0 obj <<
-/D [1970 0 R /XYZ 85.0394 429.776 null]
+2455 0 obj <<
+/Length 3191
+/Filter /FlateDecode
+>>
+stream
+xڥ˒Û6ò>_¡ª=X³kÁxð…ÍiÖžØÎÄŽcM6»•äÀ‘ Ë©ˆ¤'“¯ßºA%¥jKÐhô?1‰–h©'©ŽXÌE<Yl®øäÆÞ^ ™y¤Yˆõ¯û«Wߪt¢™Nd2¹_keŒg™˜Ü/™þ‹ÅìVàÓ7çóÛ׳»Ûÿ¾½ýx=:‹õôæÓ§ÛoÞÿçz&cÈ€ÊùôÃÍÇŸn¾Gاk-§7ooç׿Ýwu{ß“’.¸²4ý~õËo|²„|wÅ™‚&OÐáLh-'›«(V,Ž”òòj~õc¿`0ꦎ±"Š3Ë(™ÌTÄ2Øœa‚¥B
+¿Ÿç7Þįà3w#fE@1}‰Ý®14?%Jå#AÍÛº2U{’‘I*YÄùN†X§YÙc9^®Ft,S é÷ªÌÉÒœÉ,ÉΓå‘FÈ
+9®c&°Ï²æ¦µº¡ÐÚF³5‹âWÎ¥ÕÅcPe®€27XTØûA‡(¯ÅÔ”4±^ ƒxþ
+›Û]aý°m®=6ò°“?ûÁ2V[OEYbë¦
+©šbOi-¿3÷H’rÎ 1 ÑÉÇ8{pï ­›‚eîO¯ŠÞ}2Zi¥¹}2.•…Nh`ÇœÇSš¥š§C'ã˜aæëv”RÎ:ÎyÀWÙƶXo±,ñ¬O¦÷VØóÎYzX :wÛ
+ k¡ÙåµÝ¥ÕRRá×ùQÛ
+—sÅétS/Í?A¢¤šÎ»-™€‹-0ÜU•±œq.QÅÉ´îÚm×Úà&³©Ø¢ì–ÓÁIâ£_—(ªe±ð%B’Ÿ¯ãX¿®;¢¢9h¡}éîJpK~P¹:̈gM‰ø«ŽU3•öᱶHA†—Áq± ¨Þ¢-¾+dÏÅJ‹ê{9Íù<¿± ‰i
+íMŒÄt»‹µ6KnLLçb¶h
+ÓVµ’SñýLÀÜîSr»Ð3øÒ -k¿+±ØaR÷¯Å’¦ç#FA´ ´ôØ+`Ö+\d,²ì@È{•>4A6îO}ª„±X™ß»bØ–/Æz#ÕK®ÞÇ'vÊ€=ö
+tì>¦l$qtFšèŒˆÎÈ.²¡Õ`chãˆ6‘ƒ“Øaûæh´}j´ÕöE¿˜ó±¬þ D$Y“þ1`STÝaÁ‡2•!%NÉÁ4‚‘yyTü ^MƒòŽâ4š?ŸÎýDbÿ}]¨î„X§µ¿ÇrÚߌi?D¶¶äåƒô©Ûõq #
+p–¸k„ºAÌ! ÷—I4$ï èàÞ=qK•ã¿£ÌA|)ƒsrv¨ ÷
+=¶J±ä·Ÿð1~_º€ïè±!b÷¯‚bFÆ„LôP¦ÝŽvlK
+818ž¹—Æž¸ò5°m·ÛÖþE×Ä°ÂqZ^ ÒË´¼ð댼x,'/÷cò"íÿ*¼çÜíœ;ú‹FÌøEÒz¬Úÿ¢¡ˆJ‹ì+YÚÿß ŒÄz¨zµ°Œì³›\ã—Þ|4ÈÂe¹ÂA<Y.p%JŽ¸rgŠÈónÓ5-.ý@[˜KW¶Ý?ø˜RƦ3} fû¢(˜må¿
+
+gÐq©|ý²RGô7 ír%X@<9…îÏÆm_”¾‹œÖy ­ë¯êË¥_=™{ó(+_ïíÿÌ°÷œ¿k«| |~2Øgô_ào¤f÷0‹@žöýcø»7¯g>Ú¾y· _Õ$8½{³õ&ýtIÚ—ßbfÿl5¢|â¯ñÿþO×þ¿kQÊT–P%™ÆV•O”埈¢cËbB"Ghÿîÿ“Îendstream
+endobj
+2454 0 obj <<
+/Type /Page
+/Contents 2455 0 R
+/Resources 2453 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 2457 0 R
>> endobj
-1976 0 obj <<
-/D [1970 0 R /XYZ 85.0394 393.3396 null]
+2456 0 obj <<
+/D [2454 0 R /XYZ 56.6929 794.5015 null]
>> endobj
-1977 0 obj <<
-/D [1970 0 R /XYZ 85.0394 361.4675 null]
+2453 0 obj <<
+/Font << /F37 1018 0 R /F21 930 0 R /F55 1311 0 R /F22 953 0 R /F41 1208 0 R >>
+/ProcSet [ /PDF /Text ]
>> endobj
-1978 0 obj <<
-/D [1970 0 R /XYZ 85.0394 295.9604 null]
+2460 0 obj <<
+/Length 2936
+/Filter /FlateDecode
+>>
+stream
+xÚ¥Z_wÛ¶ϧð[”ÓZERΞ²%í²Þ¤½Kvv{Ö=ȶœèÔ–<KNš}ú  MÙ²“³µ¤I
+ØðdÁ»—‡ùy[ò⹡o–;{·Öq*wÕ²„ Ê, Þ[U¦MýXÖ8CiTŠƒjN3ífúp\nµ³}º÷æÍbÑ<ÝELÐëDÊñ
+L¼‚RÚaû5Šâïæ¬aò¢g`l«àtÙPW§O®7s½Û3{ÂÕËÊaø 1,/íïB°é¡6ËÕ†lT/{.‹5+õ5ÒѬD=k 8x:§,‰¦N¬ÆÍfM?fÅskL §|_7kr$˜X”ÅŠzFˆL·lêî™ö¥›!'/: ÎcõT–߬xO¤·}¾ v6µ¬j°Š¡ÇeH­ÊiWûÛKn,Eü~¦ak°ä ZPãðÛ˜Ò; ø]qÐñGkæT\gíÁ@ ™S¨âô…Ôħ:¨• ÔŸ‡u–k¨á)ß5s³•ÝpÄa’½¤Ÿ£P°®“4L’\÷5äx[Ûf¹Ñˆ†ššÚ§‡Êø4L4‚yŠù]ÙÕ µf²ÚLUû`N›vBþdžóWqœÏ!vÙitY 8tÙ5,Ô¤: ÓXêÝð¹X „cô‘êéb3#ÔÇãcçb£/0ÈK¥Ç£nº>³Mk™½@Û‚;2ë¡ ‘â¿·Nõ-;]mõ˜ïè1þ@m³êª†9>JÃi XNÊ’±z½Ý»qmšå¹ÆWˆ‰uó„ÍaGˆ4<W’ìGð¨Ž8‚¥2Žp>äðzÐùkü@…R‹ì¸zŽj@¿¾ä¡”Rô$?šïAì`OEjeý Ge<;•]ßP;a‚C°šF¸–îÄáne!ÜájßçL¨džä
+aÚâ:³aÜ
+„sU"Þc/,®³h‹kÈûã\öq €,îïí¥^´~Ja5ÀDâŠÑÁQ\ómdwxi‹—| ózvˆ_
+Ê®o¨¥úX ×Ì¢¤»ZFÂ¥¦†…IMY’y&f|ù”cÌܨ]4õ}¹v÷vPÜÍå^¤8Ðá›Î»eñìÇÃeaî1 åªi«®YÓSŒAû
+£≢Àoð•YhdÊ"èù…“’
+d04¥3a\ÃœI3.LÂïòû
+¤™ :3…ËiÙ¶ÆUaÒ½!n@Úz+ÎÆËÜ• }…¶ðÉ£Ã
+ê ;ù'UÑa íìï@]tïc <©óhû1† úáòæò×süRwwyAL>^~yÅ™ßñ4¬ïk%ÜíB'6«¬[Pi Nvï¨}ž ¦ÊN±Ô‹¹š)”åÖ{ç›Å6xÆYJNOÌլô µ-¦çôyÁ>‚q
+ Ý#Õpw¬«iï ²ýÒèÕ¸¢¿²XÜ7k…˃¦Mt‰úqËni–i^´ëy[³î´ª'ðPü1>K^ÄÞÖóm2…ÏDëìó¦éLÄgÝA;JâŸó ì+rwÿþ«¡í‘¨4”Yv ¨$ÁRB¤e¥p÷Bé]Õ5\O:‹ÓÝÿ×LDòendstream
+endobj
+2459 0 obj <<
+/Type /Page
+/Contents 2460 0 R
+/Resources 2458 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 2457 0 R
>> endobj
-1979 0 obj <<
-/D [1970 0 R /XYZ 85.0394 212.4297 null]
+2461 0 obj <<
+/D [2459 0 R /XYZ 85.0394 794.5015 null]
>> endobj
-1980 0 obj <<
-/D [1970 0 R /XYZ 85.0394 107.4752 null]
+2462 0 obj <<
+/D [2459 0 R /XYZ 85.0394 658.0977 null]
>> endobj
-1969 0 obj <<
-/Font << /F37 802 0 R /F21 714 0 R /F22 737 0 R /F41 939 0 R /F14 740 0 R /F39 899 0 R /F53 1029 0 R /F55 1037 0 R >>
+2463 0 obj <<
+/D [2459 0 R /XYZ 85.0394 153.2806 null]
+>> endobj
+2458 0 obj <<
+/Font << /F37 1018 0 R /F21 930 0 R /F55 1311 0 R /F22 953 0 R /F41 1208 0 R /F14 956 0 R >>
/ProcSet [ /PDF /Text ]
>> endobj
-1983 0 obj <<
-/Length 2949
+2466 0 obj <<
+/Length 1723
/Filter /FlateDecode
>>
stream
-xÚ¥ZKsã6¾ûWè(Wh
-dzéãç›pâšs>þ@ƒí‹¢Îk^îMw³oZêÍõˆß=Ðó™dwÅꚧÐeÂàTYnò
-&9®Çã‡/·'_î¤û8}¸¥é„ž‘³p¼ çA&¥Ð´FˆP"äÝ[BÆz„u#aj1x6!;H.à6C&ƳÕ(šÔGk¨Ÿïx3±È-¤¨U5E[¼ª #, @¨RMØSÝ"2ÉÆü'<CŒË[Yi" C²†”¥lümz‹'¦™¢¡6§˜µÌÛz÷Nж6¨Í¶TU™uór]ïŠöe£WLÆð’Ùgzë, Йõ戩¤ °âR-‘-œ‘4 „£4| ®½-zÒ‹B{ Åeˆ+
-­| ±œ4:Õ~3W;ê×+jçEk`E…-·×|Lop<†¹ÜI”1TÂ.^êb¡ü•«;úືT[-³~m×·‹tâ«%g†AÊCîëû¾!Ádê ªt¨yK=²C"ŒÆs Z™®jß”ªêN’4è¥Ô㛵}“…“ÆdÛ‘,µÎv\¤Dn×£iËbÔLÞmžDV[¹Ý&vÄ)ÛÚmàN8£ñ|Ì™ˆ SÏL"ŠÔ_ùÂ,»Ù—mÆ„žð
-b„$…ZKiHÓÔcˆ … …se[K!<ð#ý&Š%3ç>£±2‹ƒDr>¬±.ê¼Æv(­±ÕE­òjß·=*K³aâ:TužÊ
-^œ Ÿ<OeEœSú­BèO8\y¨lü¥¿ÓÔ0–¤©8e¼¶yM3!rÙ%xð.õ” G¤K0JYhÙeî–U ÂDcJ²
-~TaRw»+6Šº+MO½¡—¿}úHÃB†õÞŠ²¤Þܼ‚vàÅʬW7M1/Õ?P ýÃ(ñ­h U©'ÚXR€áû qV|CcøAñuQçÅ·Ciñ}9qqÀ²ä–Ô³¥+’ X’mùuWT6²2\øÎð¢Ùo6ùÎè|½:ªˆÔ[ ¯š£¤Ë¸‹=VŒ!Eö^e R"1z¹¬šF-& ã M=‰
-£PÚZpvÐ |ÅcOM…9sØCãEÓ©÷¼Îmv¬gªížò¢ãÃÂ¥Œ¥}âqt¬Íš
-endobj
-1982 0 obj <<
+xÚ¥XM{ÚF¾ó+8ô
+F š{lÁ™Ï*&ZpQÛ"ÍËÒ̃ofwkr«lâM!ðŽb 'YêùfÈ¢I*S!ä z(ì@ ¾PÊW¦| 3¥YµD‚<Y#­Ü$¥IqµÈq©²ÁÒàøn“åUCPV0»%(ìjÁµ !åÌIt–üI’äMf4ñ¨L‰cöÆH¬G}Š¼J²¼D·VV;¸ÛÞ¬²9Ž-?ÆØà-N“<õŸ$ñ³"f÷`2XL*†‡yŸÇí?§¶M?àà H‡€S"y¨kF³¥ñI“‡ÍaÏXŠkÒØ¡[Á'Tw¤³³Ä>B›A8?ÿ ‘yQ?S\«–Iå˜$9n 2
+ŽÏ?žŒÑºe†^›¼‚š˜þˆi‚†L4¦}ÞãÀ•3=6¯d]óJˆ³Õm±=ÖAygæ™%œ#šUZZ\Šøà]­5¬7÷Y±uÛ!§·°}‡¯\Ö–E^'¨à¬Ü³kDH ãöçE… AÞH³Cƒ-“{
+n²ÊN (OG¸ŠÂÂJmk»‚šÂJZ¬!WœÛ£·3›‰Ò¹Óü•¬ïV†Ì‹µG`­H¨DCkmlKÚÒɶ(V«âÊ ,ÖhTx÷PlW)®ß8rˆõ­IñÈp­IÄaÍe@è)½†&#HðY› ^¸Á'È-8Ê?/'c½¬¢½j—ïµI£ FK^¹i qƒ6€q±xqà™µOåGÇžu„$o(o¸fš¾$/Úè´®ªÁ+*u߶ÚéU$‘T4eøµÎFÃ0ޗރΦ>Ñà "<…ÀFÊâ«žÑñc„…ÎêE ƒ‚Ó¶· VˆʹTìqGspø ­‡
+è¢ K‘Å»ü
+ñº¸¯¤¯ÖÊé./îʬ||O„´
+#°"“1"’¾{M~ˆ;û/}$dÌ6²õOúî|-U×<Î4¶ˆ|–›¯Íðƒ³»7ÐJ7-×
+‘•¯éŠI5ÙÛò;óðwZ5Ø ½<ôñÅfçá©$Ѽ ã–éøU¦&¿Ír_³~HÖr\¸xv‘­Œ?_`¯
+­Ý;^>O¯O¯f§—OUò£á>Ä—¥Õ¶£MKmÓJcj¶CÝtt0À:e›èïKS¹-áºáÀ#\»ï’9~¬nOíBj,çÜö½vš¹ ˆ>@§(cõ©¼©bý Qâ°4uKl'«róàz$Ûöm»Ú¶åØ»Ô7¥¶+i“8/:IŸz.̾5àRû…Å“e´õýÿþ³ÿ`%Á6QÄ÷ßho6Êv%ºÊÚIýDôæ“ÏSÙÿ2®Çìendstream
+endobj
+2465 0 obj <<
/Type /Page
-/Contents 1983 0 R
-/Resources 1981 0 R
+/Contents 2466 0 R
+/Resources 2464 0 R
/MediaBox [0 0 595.2756 841.8898]
-/Parent 1961 0 R
+/Parent 2457 0 R
>> endobj
-1984 0 obj <<
-/D [1982 0 R /XYZ 56.6929 794.5015 null]
+2467 0 obj <<
+/D [2465 0 R /XYZ 56.6929 794.5015 null]
>> endobj
-1981 0 obj <<
-/Font << /F37 802 0 R /F22 737 0 R /F21 714 0 R /F55 1037 0 R /F41 939 0 R >>
+2468 0 obj <<
+/D [2465 0 R /XYZ 56.6929 598.7685 null]
+>> endobj
+2469 0 obj <<
+/D [2465 0 R /XYZ 56.6929 432.9509 null]
+>> endobj
+2470 0 obj <<
+/D [2465 0 R /XYZ 56.6929 360.8886 null]
+>> endobj
+858 0 obj <<
+/D [2465 0 R /XYZ 56.6929 315.6627 null]
+>> endobj
+2471 0 obj <<
+/D [2465 0 R /XYZ 56.6929 279.8921 null]
+>> endobj
+2472 0 obj <<
+/D [2465 0 R /XYZ 56.6929 241.5703 null]
+>> endobj
+2473 0 obj <<
+/D [2465 0 R /XYZ 56.6929 166.5861 null]
+>> endobj
+2474 0 obj <<
+/D [2465 0 R /XYZ 56.6929 97.4887 null]
+>> endobj
+2464 0 obj <<
+/Font << /F37 1018 0 R /F21 930 0 R /F22 953 0 R /F41 1208 0 R /F48 1228 0 R /F39 1151 0 R /F53 1303 0 R >>
/ProcSet [ /PDF /Text ]
>> endobj
-1987 0 obj <<
-/Length 2192
+2477 0 obj <<
+/Length 2079
/Filter /FlateDecode
>>
stream
-xÚ¥YM{›H¾ûWè°ùÉÐÛMÓìMv”Ä“XñFʳ³›ä€¶˜A ÈϯßjúCHj„g×>Ð4EUõ[߈Œ0ü“‘dÓ8‰8B 6Z®/ðèž½¿ †&°DA—êjqñ÷wTŒbó^a)Éh‘~Oî·7¿\!Ãã+t0ŒÇ·“Ù×É'½ww‡ãÉûéü2 RD\‘q<~;›Ï§×Áüæýì?ŸgÓË‹Ÿ/¦ §XWy‚©Òê÷‹o?ð(…3ü|%=à F$ŽÃÑú"b±ˆR»S\Ì/þévž¶¯úÀ`T"&CáA#$#BPÌXx
-`™¬³^¨¸äQtª.U?TŽjª³R÷PˆõBu œÞ‡w { *wël›/õMëßÙF_jp܎˶Ù}3)«mÞ¬Öý
-ÙVÑ.¼Q'5õ&[êê¯éÚà/ÒZ5¤2¿kO ûÕýS^íÌëÏ;xýE?2[Weœœ‚AòzÏΪV™y¿¬ ˜
-pû}ÑèŒ `9ÊÚ6]i3ýer{÷i:<,ÔL¡zcJ4x—D$7°Èô~¢/‚Ëà¾mU)ŒXó‰ÞÕÊRÛßÂŽ>)ì¤ÕbŘ]˜¨H´ÍJöG¢F
-“…oø€S1×Ø(Œm=Rª¢¨žu“ "ÅZƒ
-Ïž«]‘êý{C¾¾ËÒxt
-BΑ aïLÙ 8 ¡A¢¯-íƽ¾@fÃP¶Ãg»:DOöjM¾? ÜØÓ03S94N:85RùŽ|$öcGIôcú&ä„ãa}oÚjÁl¾Â‘=îOžîFDÐÑSòúÉÆmáíjZ‰™h3ÂiŠÜˆIlsUÏ{Rá ,tUgsì»Zìè\Ac5:3rÜÑ?ÓzPÈ{˜ÛJä üÀ™ {>5Õròiþy8CÔùc©ª¹ªÝR•WcBw?ØH$cf•ºº™™/±˜®ó2LÛó~É2m»riœò6)wP“| Ã`Î9wª
-endobj
-1986 0 obj <<
+xÚµYÛrÛ8}×W¨j_äÊÁ… ‰Ý'ÅV²ÊÅöXJíVeò@KÄ
+/‘²ÇóõÓ
+»RïY4H„4.Ö]1ÂqL†‹Õ·Ñäþ~z{3ûïÕ˜r<z‡®ÆãÑ—Éí×Ég=w%èhòa:¿
+B‘ ñèæv>Ÿ^çÓÅböezõ}ñq0]´~u}'˜)§~|ûŽ‡+x…Œ˜ˆùð0"BÐa>8C<`ÌÎdƒùà×VaçÛf© ÎbÄcyÀ dHœS .PÈ(kи»_Ìînç'o‚æ
+(æi­|¨’ÔÃ\VLJ¤Xéü#­Ñ9LBA ‚ð2&]©ó˜´R &Ÿ”É·ï9ïHÈ
+!LF@4{ÅUòŸð‡£ëäP59êøO0(‰CjKXQUr9Þ˧ò‡4â]Ûaˆ"N#Ýà ÖKz¨‡©áD˜Ñu»$Ýë‘l²OÒµ–Nô£æ<=N2ædeÖCÙ¯šˆÃ8OêåVmú&…HH µ‚Ô19DÜJ² Ðl½Í{}D[ñf7†Œ×=rÑ(,:K!#ÔBÙiáÆ4@«Û‘Nåùtª×N>Ïï<bXÇÕˆº
+ÀÉ×Å¿ï^GnV@™.lùœ¿TµÌ A\—EÜ”ò£Ý
+ZHž
+:(7ÑáˆQUxUÕÁãËÔÙUÑðXà£ÎVÊUaø6^·#Û„³nª G
+ëvá=“<@!m“°UzïQ
+QŽC(KFiRË·åz­º³Sµ!VdA_íäç¨}ð¨…Ȇ( 1sËèÿ¥ösܾù9j·íèÉc@/âý¶µ§öjG¢¯zê: Ôù<tkͱ¹ë©vßШ† º†~ÊË°ý"8»x3_?ÌšË
+ˆð6GË]B¹TWj4-š‚öN¸ài™j@UX
+=õh¡Ñ\éï_| §ˆéìy“¬é¦ø³,¼ÙAS…í¾WeOY)Áð^›QkÛVAWGaì&DU®ëgïUÆJBÓ«½k.FdáÔÕ¶§•»ðѬس´ÚÊÕ/­íZ÷`RmËC¶rjœœZnߤë€BŨ–õÙ&„ĈDßýÌ m…îŽ=ê5˜jÿÍ xRÙ)V=ŸšÏ没ù¶hè 8òåzWÃl–6>0Ât¼O£
+'u8¥³°Õ³Â›Ušï²m Ȧ¨+í„ñÆD¡™Ñ¢C­nbN\&vÛ$÷¡ ®õAÉbooĜޫíðûHë#1¥ÂäíÒ˜šn˜+S\ªžŽËmRltš06z,Õ!Z)8ÞPsQ+{VÌÙ©±À±o›Cý0±øTÀz“$É›Tý¡cOèì|uË°]åghöHÀ]Í:‰PE½ÍÖ±j+‡Ç2œ;¹m¨3DXt0Sz ! §¹NŠx4úr¤"Ñ…œ‰Ø]Þ ¶zVÁVŸ:¯`p¬lFQ&‰žÛ`ŒÍ)Óºìä›Í¯ä1ko¤ªå>m¶Û™c¥›£–Y’¬2ܲ˒e?AÕ†”E{ãQ\¾½Eç~ü€~DýbáiÛq[Uþö#Ç_€‚±8¦þ‹ †á ƱN)8¡åé»Þþ„rêû_·Ïj¤endstream
+endobj
+2476 0 obj <<
/Type /Page
-/Contents 1987 0 R
-/Resources 1985 0 R
+/Contents 2477 0 R
+/Resources 2475 0 R
/MediaBox [0 0 595.2756 841.8898]
-/Parent 1961 0 R
+/Parent 2457 0 R
>> endobj
-1988 0 obj <<
-/D [1986 0 R /XYZ 85.0394 794.5015 null]
+2478 0 obj <<
+/D [2476 0 R /XYZ 85.0394 794.5015 null]
>> endobj
-1989 0 obj <<
-/D [1986 0 R /XYZ 85.0394 752.3199 null]
+2479 0 obj <<
+/D [2476 0 R /XYZ 85.0394 752.123 null]
>> endobj
-1990 0 obj <<
-/D [1986 0 R /XYZ 85.0394 504.8188 null]
+2480 0 obj <<
+/D [2476 0 R /XYZ 85.0394 500.7908 null]
>> endobj
-1991 0 obj <<
-/D [1986 0 R /XYZ 85.0394 359.3246 null]
+2481 0 obj <<
+/D [2476 0 R /XYZ 85.0394 437.8079 null]
>> endobj
-1992 0 obj <<
-/D [1986 0 R /XYZ 85.0394 298.3625 null]
+862 0 obj <<
+/D [2476 0 R /XYZ 85.0394 398.8908 null]
>> endobj
-674 0 obj <<
-/D [1986 0 R /XYZ 85.0394 260.8495 null]
+1447 0 obj <<
+/D [2476 0 R /XYZ 85.0394 365.8909 null]
>> endobj
-1993 0 obj <<
-/D [1986 0 R /XYZ 85.0394 224.9084 null]
+2482 0 obj <<
+/D [2476 0 R /XYZ 85.0394 330.3396 null]
>> endobj
-1994 0 obj <<
-/D [1986 0 R /XYZ 85.0394 193.5316 null]
+2483 0 obj <<
+/D [2476 0 R /XYZ 85.0394 264.4348 null]
>> endobj
-1995 0 obj <<
-/D [1986 0 R /XYZ 85.0394 129.6476 null]
+2484 0 obj <<
+/D [2476 0 R /XYZ 85.0394 180.5065 null]
>> endobj
-1985 0 obj <<
-/Font << /F37 802 0 R /F21 714 0 R /F22 737 0 R /F41 939 0 R /F14 740 0 R /F48 953 0 R /F39 899 0 R /F53 1029 0 R >>
+2475 0 obj <<
+/Font << /F37 1018 0 R /F21 930 0 R /F22 953 0 R /F55 1311 0 R /F39 1151 0 R /F41 1208 0 R /F53 1303 0 R >>
/ProcSet [ /PDF /Text ]
>> endobj
-1998 0 obj <<
-/Length 2985
+2487 0 obj <<
+/Length 2923
/Filter /FlateDecode
>>
stream
-xÚ¥Z[wÛ6~÷¯Ð£|qq%‰î“[{Ótc'»Ýí¶} EÚæ‰Dº"×ýõ;ƒ ‚¢¤œ³öÁÁÌåà >cðÏg:MR#Ì,3*ÑŒëÙr}ÆfÐ÷öŒ;ž…gZ ¹¾»;ûÛ?d63‰IE:»{Œ•',Ïùì®üuþ]’&ç0›_ÞÜÞ^}¿¸}÷öæ¿n®Î<Ïx6¿øøñêæòÝÎB3`fÆæ×7?]¼'ÚÇs#æo¯nÏ¿ûñìê.6ž3‰RýqöëïlVÂ~<c‰4¹ž½À K¸1b¶>SZ&ZIé)«³Û³…½öÓIep–™Š m>ã<1Z‹HÚ$©ÒªãòêöûOï>Þ½ûpƒ«±ßì4Èf ‘&J
-Ë[6]W-]ýØüÕ6•ãþ,K¤P|‡üÈØÊR5/ð!çø(Tj>×é±jªMÑWŽñLBESéÓ'0Ñ6ç<ŸWËÖ>K?61Êù³%·åvYÅÓ¢ •íKµé궡Žöšsr/‚º@üþ©.¤VÒÔ@*V]K­¡üØAZQC-r‘3áÔò¹zíª~1¡>¥’,å^}¿1&VN„eÛôEÝÔÍ#½Ù`0kЃ£SëÔ3ãBÞ€ú™×.ÐêzúA¬>x&ÀsãB¡ƒÚ̹…Z/Oõò‰šNÀŽÞÊjU==è¹{ƒ3¯{ÇW ês1oŸ±»X­^©Ãë‘Þ.oé¹op Ò A ÃQŸêU¹“Îó‘?¬iB`®7Öa±ÕZGJ[§KBÔ "máY2‡ˆT¹ý⃲}ÐàIÆy:KK”‚øœrbZ ¹|Œï#^àÂyÅxÊT%Æðüø”žibÊ¡VRhf’ÇSþ|Î9ŸW›úá• ìL oæ’^ÑëŠ~Kf&eNéFçp‰ãºrÖM಺Y’ý´Æ+*À(z¹*ºn,˜I“œ u\0Ï4!˜ˆ¦ƒð–H²ÛçjY£“YoU‘³k»oQƒ$³ÍöaÄD˜uH:‡ KO¨sÀuDžËªóó”:y’-wè7+O c•ÊñL5T¥án°³EBÝ怤
-cÁÐãÓ\ñã’® ÑâøÙR­bÙÞîöŸèùå{LÝ~&À<QëÆ1•eÝ»Ü@Ïû–¨RаVŞߘf„ÿ¼úZ<JB4í\4zgS´{E}N¶¿îˆV<?WMéM-tÂRmF‰H;
-î¦XWâ~´aô ;¼'
-bûKE\:ã󋆘‡Ÿ*²ËŽ—ZV>;~YŸc1JkÊý«›ŸÍv}ïE«Ýø¿Àßõõå"öV
-ÈË~¸¾¾?—<›7moQèïtÒ!ü¾q¥4cȪ¬€ ù¹úVéo}×Ow Ù÷Ô¶9"p\Û’õOXÁKe‡ÅÄ’‹ùqÅZBvR„¼^%¹SInUô‘;}äóonš„ µþà“ztàMéhì€7ò0h,·’®é]·Ÿ$ RÓNnŸ°…03lãJ6•§ŽÕ 9Ȧß/Ê,K´†â rÆ°ÑÆ¢ºäšZëºÙº}™Óã©Ýn¨…I¡OÔ Úm_v©†+ÖÚ¥K?ºÏÕ‹Ë1kp#n»cÇòDåPfG¸×„ó\áªi„Ë esš„ôtßÀ4`?~\¸À5!]œ²¬æJÅâ|ãÆåBØ |ÖÅ7Ûg„-·ˆ€oøêð¶oH¬þ|vÉ–66¿p/
-‘æÒGd»íŸ·ýâ¡^탘 =cŽ‹¸&ä‹“´,ᜋX@[ÿKžºº# ¤%`E$¢?øGúðàß{?–¿ÓÀö_-ø´½£Ð,ÛMç,BZ«âŒ-½Ó¹Ãš¥°•y/KDAáj3Êàœ‡ªd_öî`Ô],훸XÔÌAÏáyŠ'`'6¿!×aÏ \ÖsžöªÚ4a&;1¥gš˜2ªjyÂ`§ü¸©›Þíø…KžÚSF·]¯‹Íë³:5ô7îjÙÇíº
-÷íÄ]žPÐC„“¹Ó—y
-TÅøÀ&­£ubÌ©3‡!×ëx.kúÔé"¨²Ú@²Ÿ™À†,<.[àš.
-jž')T\±tÿiFAº}¬¾Ôí¶[Ñ¥œO8èä[µË$ž‹®ó½…£Ù À‘‰é¼Äžcã¾f/4“KU0ø'blo„Rz-ªPðV:v;`gÔÝ8Ë]®|Y᧰o…ã,ÜàÚ ùÀŽªãœUÔž,¨…wÝD5fÕ¶ª¡ª(h_Ó%ÖíÔÙÃ.t7‰ÅC_íÝ9ºÅæ<,ÖÞuæ᮳˜ãÖL
-jžXù¾Ô]uàXMW—îÌÊÝlZÍÝ© <­”tÈo]Û6hÊɌŌ;ÿÑltÆò¼*–®±Ÿæà™Úí`Ò£°¥p#¼¾3·}ëˆÁ¹½œÿ±…<5ˆ/ˆkØÛ‡Akr·Üféè÷UÿRQ” ¸£+C"UT_„Ô›»»‘±Bn[ú€½‡´©qûñƒŸsõ^‚†ÓÃÉcf”Àä_[Ñú9‹p|‰¿gÕ´#4MAˆLñ¯züõƒô~ôƒŒ‘º;%Rô®–¶Ø(ÒX±;aeF'DØL]1 4LP‘€ *:­b¾:
-endobj
-1997 0 obj <<
+xÚµZÝsÛ6÷_¡™{°<±@ðcú”Önê¶N|'wînÚ>Ð$qB‘ªHÙqþúÛÅ. R¢ä¤7—<\,‹Ý÷´…ð_ŒtÄ™ÌFI:z4[_„£%̽»Ì3qL“.×wßü ’Qd±ŒG‹Ž¬4ÓTŒæ¿¿ ’à
+$„ãë÷ÓéÍ÷“éÍÃÃíÝÍÕDd©ã·÷÷7ï¯oÿ}5‘:nà ÃñÝÛ÷¿¾ý…h÷W°½»™^ýñðÓÅ̓׫«»*õçÅo„£9᧋0PYªGÏð"Ëäh}ièH)G)/¦ÿð;³vé -DHËcH1"È´–=kè,ˆ•TÖîn?¼?>‰!âQ"E #-NìLL“.—ÛxÀ Ž ÷,·ŒU¦:=¿¥cØRv¶ŒÓ Ñßò‡z{%ÒñÌ€³tœWø›Œw›yÞ2­^æ๜Oõv·ôüѼÃsÑ®ˆTÕDY›6A9QCiÊyèŽÿu¥õ–Ô;Ô®Š†ÖÕ›¶¨«7h»©$
+"&prT^5™MÓ¶ÅÚ0÷Ð °tªFïuX÷\”åÕD©h¼È ;Òãç•©ˆ–·­Yƒ
+Õ’fÚšèÎ*HˉTše>{!B1¶o’=_4.®Ä­bÅØóá*w¾‰Ò1Í~½vÚéñ£!Šu’™Ñè0§é¢Â#ƒ-øpäS+P&ñ¸2Ï8Ðcrì'S9~´ö†iöW¢÷+êm±,ª¼$2yÈìC ‘m^TfçTi2~p‹ý²!6¯)Ó‹04G§CÚ#SÀ}D@CÛߕ錼¶!©©Z
+:èôàÔkk€J’œK;L§_RÇdßÑŸ eZwD$9L[3këíË¡bBFA¨CyV3Ït¬Z×BfA¨ ¬uu›š¶aÃXŸÀ
+ö(æþç蓼ÈÍn³©·-=-qÌÍ"ß•è4»MÔÍÇY#Ä·60C”RvëÅgï^ÌžHª|mzÃÁ½O. TüëŽã’§Z›@pÌÂ8´žBUQ؃Bõöý;ZÜ)ݬ ¹DÆ`gRõÒ‘ËU¶°I"ŸŽÌ'—h´NÙ˜¹O”.£ÒäàßÝÝõ5Í@AÕ£þøãÝÝtÐäí‚&½
+­ËÝšrZ‚)Žß ¥¿}¾æd|ù÷K—¶™0¹´I^qa¦àCUk¶|¬–Nbx2çÓA¥ó ŸŽ–¿^œ½Ÿ†qƦaðIlëI²j]Z SÍ ×Å‚³ýn¶:¿o1xüE]–õ³Õ]@í€øP*V†¶L©)ÚV,f²OÖ×0yùr *$£ñ庶æ’j|ùìGs?Z¹‘=®^ŽÔÚ× ·áý’þ)›^Ð{¸#›WÁË^L¾e¥~‡|?7¨'UCù)«XÓ@F(›·ô0Ï_kbðò²‚
+ÎFU˜(M¾¡‘Ý ¶Ì·®«vÅBû»[’ß/<±]GÔ³1ÝöMßÁ|î\XÅòìƒÃ
+ˆr¥/¤•Ì´ôÓuð›ƒÓs:gtJ!è!êÊ6&¸ß¶²Œv•Á»b!ûÆU¼Ûe0¼<™À¢0„VÙùÖå:À<—M`÷¯&0T÷›za-q˜ÅTÕHÎëç¹ìe1•Ø@÷äÔŸ9Ϥ™k€d[ƒl_ˆÂdN*Cá¹p«kú}d!›ÝcY4+ëÇδßäsmb$³ñÛD>7mC6+íWèÖð¦6·é$H¤Š†:Ftö£qà™•»ù!”<?Sd·{UÝö…í'È¥Ã^f—(O"KAï/³ø•Ò¨ËuYžË"ëí«mÎ9`A¡Ϫç¹ôë+
+ƒ,…¤ßS%÷ÏZ3²p„ÈRÐ}3²z\ÔecDqëkú}d†CöØ
+rmEÍ ¸¶Â–-'¥¯­º\T]Á pëkúµ®€EsSÊ*¾€²"lÅ;ÙV(Ë^†QŒ˺Zš­Ï…Þvô0õqŠcö-.Þ­ó—nH\çná‘
+endobj
+2486 0 obj <<
/Type /Page
-/Contents 1998 0 R
-/Resources 1996 0 R
+/Contents 2487 0 R
+/Resources 2485 0 R
/MediaBox [0 0 595.2756 841.8898]
-/Parent 1961 0 R
+/Parent 2457 0 R
>> endobj
-1999 0 obj <<
-/D [1997 0 R /XYZ 56.6929 794.5015 null]
+2488 0 obj <<
+/D [2486 0 R /XYZ 56.6929 794.5015 null]
>> endobj
-2000 0 obj <<
-/D [1997 0 R /XYZ 56.6929 751.9327 null]
+2489 0 obj <<
+/D [2486 0 R /XYZ 56.6929 751.9327 null]
>> endobj
-2001 0 obj <<
-/D [1997 0 R /XYZ 56.6929 651.1304 null]
+2490 0 obj <<
+/D [2486 0 R /XYZ 56.6929 503.6095 null]
>> endobj
-1996 0 obj <<
-/Font << /F37 802 0 R /F21 714 0 R /F22 737 0 R /F41 939 0 R /F55 1037 0 R >>
+2485 0 obj <<
+/Font << /F37 1018 0 R /F21 930 0 R /F22 953 0 R /F55 1311 0 R >>
/ProcSet [ /PDF /Text ]
>> endobj
-2004 0 obj <<
-/Length 3048
+2493 0 obj <<
+/Length 2264
/Filter /FlateDecode
>>
stream
-xÚ¥ZKsã6¾ûWè¶tUÄÁ“ã¼k’]3öÔnm’%R63©ˆ”=ίßn4@IÕÔ–€F£Ñ/˜/üñE¢C&SµˆSjÆõb½»b‹èûxÅ-fé@Ë!êÍýÕ«2^¤a‰hq¿Ì•„,Iøâ>ÿ-x}{ûþæݧÿ\/…fÁ›ðz© þõúæëëíö:Áëïï®—<‰y  a ÞÝÜݽ»¼ûôñæ¿ŸoÞ_ÿqÿóÕûûŽ±!óœIä꯫ßþ`‹öðó ešèÅ3|°§©Xì®”–¡VR:Êöêîê×nÂA¯:& ¥“P -–Z…RK5.22 "XÆ
-VRÐr"|Ld…"[~¾ú õ
-˜ìãȲ‘­êŽ#â¦Ïv£;Ã3ñ(0bhÌÍPÃ;N#29»'ú,“0¹³ú΀H.‚f_¬KÔO³+8ÞŒèv*Ó~.«¼~¦6™W>—FZ@3Û†_²ÜUæ
- *†B†ãÙYv˜så Ú*²ÓŒÉÓ[„ÔŽæVuÓU=»¢â‰(,û®v™Mg–órsj–2RRDÊh†2B`8#&°di‡tARØŒ°jRCüZ¨­Œ.°`A#ø•&<V> Ÿ†ñÓHÌ´M‡}ùð–<M„u’ÈŽv)­›á‚¥Ñb¢n7î
-LÚ&Èx ߆•.jíæp|Mì/RâBÄ8DÍœŸC™óû|)®€üb¦bCHcgùs þ¼3L8Þ#é3HõÚ˜õõÚ˜S˜»ÜÄ$µÝ! Ðï®y`Ì’º1.ÈÀ¶ 2"èv»U:dÄdCÀpdÌ×wÙty×èÎhT S¸ú?ZÞÓ/‘ª²Ï CÔ´~u(£_ûÓ%¡W)uaIYr¸»²u¡O–üŠuO`$Ø7Å1¯—TŸ@D÷Y›Q糩óI[k&íH•Õ[uÆ°SI[÷–¶Ö¨MÖ´]Q œj°2ÊJC†Ú–,†òPì²Îñ6I¡Ô–£ÿ8Tû"†}´]qìŠñ±ìKÅ
-êDÄ#¼ÿ.áŠQendstream
-endobj
-2003 0 obj <<
+xÚ¥ÛrÛ¸õÝ_¡7Ó3! € ¶OŽíõj»+»–2í4ñ-A7©);Ê×÷à*R‚"§ϘàÁá¹á\!2ÀðGœ!eñ ÍbÄ0aƒéò ^`ïÐ"…]¬“³Ë_¢t¡,¡É`2ïÐâsN“Ùçàêáávt3ü÷EH>¢‹aüq5útõ»†=\d4¸º»_„„§$$.ÑÜŒÆãÛëp<¼ýç~t{ñ4ùíìvâë
+Op$¥úëìóÌ@‡ßÎ0Š2Îoð‚É2:XžÅ,B,Ž" )ÏÆgÿt;»êSŸ1XÄã4õXƒÒŽ5†uœ R–¡$¢‘²Æp~F4 Ú…‹4ø*¶R4ð,ŠêEƒÑìÚîé÷¼ÒïâÛª,.H0-Z h6Ó©hšzÝÿ.¯j`h€’#!$ø
+ÏÐÓºš5Š?Ä 8kÎ!Q†“dÆq–eJª‡Çáh2Ýéïï&ÃûÑØ}¾ aP†¦(N}2³ª^!øX[,…Áï†|’¡˜f2SHôinÌ˦֫g£â¦±J´fgµ.ªvÏÀEå­~›ƒ·óåãÓœßPÑѱ¯ rt21 Rs‚!erz$ߤ°‹¥3ñä{‡%µ7û,!KÆq|‚¥Eò°ìZ8“f{,:¶ƒƒiúîñid‹XÕSc¦y½^æíQë°”"–2þcët±Ž[Ça)무Û0Ö­ñŒEÆm®/.¯./‡—7—yYî‹Hx‚˜¬M?”Ñay„ì©ŒÀnÆûRZƒÊÒ!<±^ÈhjpÇa‚u#ô†J²‰VïÉäyä Ù0Â4˜,L0Å]ûQˆ&ãÔ˜ÅZ®/~Œ(ÅÜ Ô+Už4»|«9=+Úƒ0JJ¤•{ùi—ù!nUæ—O•ùi†µ6
+z¸…1‰XFúÇ¥ùöËgOGÕ~I®ºýZû¸e’`ËýÆ«kœpÚÓµËs&Àç{üdhLdoXâd^ÓòÌ÷(Ù4ñÁJ_jˆ¨8Þ¥(šê¡èC<|«qý]B ežÇ„Ø6A§Áñí­–âê÷ñ½‡²¿=€Òû"ª/˜aÿˆQÄöÅKõÒKg[Ѳîy¤Ñ,³iíãpt£‰dFœôEÓ®ó֞ģ˜ëÎYTScÉ?òj“û BŽh’ØxõI
+QÝ}t'1sñßì&
+K/îçöâÑw…#ºË3àÑòZÈ3¢q±Äæ=yÍT
+wOgîîr{ugÍbZjtìG!H\ò—OË‹],ýß?í~ƒúqNý×l†™$‚ÙÝ%Õ„6x_t÷ÓÒ¡ìÿ§ìÕÅendstream
+endobj
+2492 0 obj <<
/Type /Page
-/Contents 2004 0 R
-/Resources 2002 0 R
+/Contents 2493 0 R
+/Resources 2491 0 R
/MediaBox [0 0 595.2756 841.8898]
-/Parent 2006 0 R
+/Parent 2457 0 R
>> endobj
-2005 0 obj <<
-/D [2003 0 R /XYZ 85.0394 794.5015 null]
+2494 0 obj <<
+/D [2492 0 R /XYZ 85.0394 794.5015 null]
>> endobj
-2002 0 obj <<
-/Font << /F37 802 0 R /F21 714 0 R /F55 1037 0 R /F22 737 0 R /F41 939 0 R >>
+2495 0 obj <<
+/D [2492 0 R /XYZ 85.0394 655.2256 null]
+>> endobj
+2496 0 obj <<
+/D [2492 0 R /XYZ 85.0394 487.8207 null]
+>> endobj
+2497 0 obj <<
+/D [2492 0 R /XYZ 85.0394 419.4946 null]
+>> endobj
+866 0 obj <<
+/D [2492 0 R /XYZ 85.0394 376.8649 null]
+>> endobj
+2498 0 obj <<
+/D [2492 0 R /XYZ 85.0394 338.6766 null]
+>> endobj
+2499 0 obj <<
+/D [2492 0 R /XYZ 85.0394 305.0527 null]
+>> endobj
+2500 0 obj <<
+/D [2492 0 R /XYZ 85.0394 233.8048 null]
+>> endobj
+2501 0 obj <<
+/D [2492 0 R /XYZ 85.0394 108.6677 null]
+>> endobj
+2491 0 obj <<
+/Font << /F37 1018 0 R /F22 953 0 R /F21 930 0 R /F55 1311 0 R /F41 1208 0 R /F39 1151 0 R /F53 1303 0 R >>
/ProcSet [ /PDF /Text ]
>> endobj
-2009 0 obj <<
-/Length 2546
+2504 0 obj <<
+/Length 3157
/Filter /FlateDecode
>>
stream
-xÚ­YÝsÛ6÷_¡—Nåi„â‹ùè6n.uëäFδwMh²8‘Hפì¸ýíbˆ¤h%sw£‚‹%v±Ÿ?@bÆá'fIÊÒ\æ3“k–p‘ÌV»3>»ƒ¹7gÂó,Ó¢ÏõÃÍÙ÷?)3ËYžÊtv³î­•1žebvSþ1ÿ¥ìVàó××Ëåå‹åÛ7×ÿ~w}y¾™f~ñþýåõë·¿Ÿ/d˜9Ÿÿzqýá⢽?ÏåüâÍåòüÏ›ŸÏ.o¢b}åW¨Õ_güÉg%ìáç3ÎTž%³'xáL乜íÎt¢X¢•
-”íÙòìŸqÁÞ¬ûtÊ:ÉX"u
-fÑL›4Ÿ6™`F`2š3ŽìÁdRL™,p¡É7šj–ç"›õ;˜&DʞȆF‰¡È·wuóp.²¹%“_-¯hð‘sUÜѸ©éùÉ>Óàic=©´}ØUuUß…©¢£Q×г­îjväAo&Ã3¦SPþ´-{\'l¸œ-Šüþ§$éq
-ÎL–'°:²´Å¶ë• 
-Áò$‘nÁ.†MÂõp£ªÔ­U’4ŒÇ;2o Gg9xãЙøňL1´úBDö¹^ŽÈÈå"òS‰Ìx«VÓ½©Û±rBq–˜$;­]äšP¯ïK¡–$F õûíE#Ó&Œ^¦ŽÚµ/U·Q©Ÿß‡”v]ìÇ.œ¿ì¥˜‚ærÚ/¦nñLÎ+G5×0“
-uR^à9–×·³‘Ìh™ä‘••ÌVÆ÷‚ÞÊ8ôVÆak;¸€ÆÁ»÷7X·ß}¸¡÷P°qÜø¯ŠíöhQªö+ªúeëë’eCϺéZRòf,KÌ0q{Aq´2×ðêC¡µ«}¿×”vkïBp¼àô$ËY–ªÓNï1½ìôÀ„JÿÝÔì%·ö¨þK–¦&?)7ðËTÃR @£/7¿N¹ÔÔ]Ñë ±d¡–Ó•[ª-_6 ¾`µ× ³.ÔÀH¦Q8ý™iBæ _2&31’¹¼·«jõ$…–¸©V‚.-ÚM³ß–4v‚§ï )u!Ç6ó”gBcYJ²ùÛ5‘êf¼zCAeÐy¶|ã¼å–5Ãe½º& × ì Ì(ƒìç
-o÷Õc(|¸-´à«ú£È†:@kÖ¾þ—•ßb×<<Ÿ !æ¯â'‡C§ñf„±Þ ¿AOæ± ôРÜz¶Ð÷x
-dyî%”u åzKÀÇú,¢ÆLçC§#ļêí„}]é;a¤6!&ÈÉ~°€ÛÇ·Ø‚2Úž‹ù³ÙíÛŽXn=«k„™Ï2$슰C9E†ÊÕýý)e y[Þ²ÓöÎK³TöànÔ½j Èj)ą̀E°
-ÎC‡G×â‹ôûY„.„q@÷4óX5ûvûLSÞÖnv(CoZï¬ °¨½t¤ÓÕŠˆ›GP(ø
-§ýjeéŸò^vû[Cþ•RS@ãˆh¡Cf¨ìyC/tq¹7»ë‘Ja<tÁÌßw†o ”Їp„“ힺqo¶£Bá‡5º©ºÊtt]4F‹TŸ”Ñz’°=<û‡öêð=ÜICHòÝ!¼D
-™„ùåýOñmëÒ«D7#>ãjApOq 1%'Ú ~”õ`T„_»€Bâ[Çt{ú@‚Z?´½6žV„ë‹€‘ó¬ÿÃ…>çê{éÿO•0üÓrâÊG@ð?ÿ7zøXþ̲.ï¤I|œ¥Ð”B¤Çw”œI'ëcÝÿ&,±&endstream
-endobj
-2008 0 obj <<
+xÚ­Z[wÛ6~÷¯Ð9û"ŸV(n$öÉMÜ4Mâd+·ÝnÛZ¤mžH¤*RqÝ_¿3€"$JÊž]û 0ƒ™o.˜pø“$e©•v’YÍ.’ÉbuÁ'0öêBxšY š ©¾½½øê;•M,³©L'·÷ƒ¹ ãƈÉmñÛô[fØ%ÌÀ§/oæóë³ùëW7ÿ~s}9&ÙôêÇ뛗¯ÿu9“ r æ|úîê槫·Ô÷áÒÊéÕ«ëùå·?\\ßöŒ ™\!W^üöŸ°‡.8SÖ$“'xáLX+'« (–h¥BÏòb~ñÏ~ÂÁ¨ûtT‚3©R9" )&B0›$2GbYª¤râxÿáöõû›Ã– ‘N2)X*„9²2͆Taá‘cT¸î,ß_2ÕÌZ=¹d YR–L¡™)/ùó¥bZnªûg:Ç|¹¤ÆCY—›¼+ zm«‡:ﶛKa¦eËŽÉ&µdk²Ó²R—MOåd³À%¿ú.I”î”ál¹#Y,ó¶Ýg̦Ì©O3ˆF“Ñr° æq6_—‹êwÎeÙ’¨ºÇ’`LÔ Î\³¹ß#ú»©ËãâLAÉyrNœªâ TNœ/T-c’+}zÉ@4²äPP™dÂh/ù¢Y­ó®º«–UʦR1]5Eù5`‰ÓW^Ýh §ÃÖÃ} m•„ÓþX>·e7óZ¡„Z0£•ðt(ß:_•D± Ô" „x„K¿~U{>Š¢êªÆ½Á™5#lÉŒµÖOR´G˜R 3iÏüg3õôXÖH4™i®@ç,Ⱦ‡/G³¬êo»;ú’š÷͆ÛÖ«Û·ófY”~ìS¹ia;%¦"Ù[Á„«¢†m.f¸8.6²‹LƒÒ³D\¿EtYrF¿T'ô;P9ý.ÆàéøMT›rÑ5›ç}æ„”LÁa殧a/ ™1•f&æïmÓ|ÜÑ¡Vip}Ù˜REs+ÃT^ŽÈF'Â=§‰3šh*­™R
+CªãªÐS9U¸>«
+eýP‘GzÀ5ƒ`Ãœf­§á-v–i†1÷Së¤ NWØébó¼œq]¹s·Å=K¢ø'üýº¬çó·DFÜC· w2z $=»Ií´Y#Îz{‡±ª£g»]¯›M×"rÈd7IU·]^/JB!PfƒìAHÄ ¤¸˜>UÝ#µÖ›ê!:¼ æQëÞm¦YÑ[N€“mؤ'÷ U®bNªé/ˆndþ¤Zb|/ûáÍ‹ù?„ÀvE#•¥³
+"I+ÎÃdÂ2ž%L‚ffRO¯ÿªÚŽÌ
+„“ÒX
+Êï=EN`—ñ캜mr
+Ø—¯!>+ÂQË„ñ4±ñYØþ.8(ìù£:¡R ‘%„Ú'ubHu\'z*§íÙâ ‰›n†:{è Rð™\f¯§á/R L<Ìp³} †à>.4
+R®üIâXµòƒ.³Ò«¨äý?þ8ýŠš^;ï cå?ý”/«Â9‡ÄCR,ò:’*$œqƒ7T…BW—‹KT9ÿ¼k›åÖ±ÁxãG‰%„ïŸJêÁý0Šj¯j"~ªé\v´ÔrüI4’¢º„HÚïz\y@’mÁ£Þ®îk•ŸÿWø{÷îå^Míå÷ß¿{7ÇÐ< 8G—h|ƒ#¦’ÊBë„s$Q–@ä"= úk|†~ºÎ^PÛÁ*P¼s°
+Šwàg•ÒnZÄb!§WDK ÉI#!‰ñ"1N$½<Œ—‡™~qãò" jS¹ aðÉ = …iêÂ÷í’|# ƒFìàq$œŸ¢˜ºêf4݆PœÛQcÛ¯ó:»H=i`2
+Pœ.ª,ƒX.K÷$r4ñ²‚Öªª·>Éôxl¶¾˜„8°-_.›§½BÔbÙ,|å£ýX>y°Åt©í+Uǃ]i þÌô™zÑê8ÂõTáÊq„Ë Êé‹Å8¾ÁÑÀù‰ÓÌõT#ÜÅÁ.ÀªÑ:f¯Ç7a½_Àᶾ¹1wHØ"|‹èø†¯ß„å‡ø†å_ëªÏ½%t\ù—k訂t ´ÏPÒR²¬O$¼FjH !ÎP±F:HüàZ"{m^qDd¹@PùÏ<\õÈ„}™ÐòD‚¸½»)÷p—k<Í£' ¸XCǘÕcVùJ¨`—롺nèu*Ð7
+«™6É^EÞç}lÌ@RHš„üŒ r¦„ÙÕjÛz¾ó
+Ú7`‹X„ø0Û-ç5‰>tÚˆ+6ôN)ƨ’Át_¢bZ¥„4ÊŠÃÛ£²8z±Êa¹JU»Í’¿ÇÍ¢dŽjŽ€ˆD[y¦21¤:®9=•ÓœÇƒ¢fʸÍÎ,ˆF–ŒÊš‚qpÿñ’6U
+¼þº­}l6^ívµÊ7ÏGÒ8*„k±N…§‡íª¬ÅçÃ+8©- Þ®Øùÿº‚ÄÊ({&¤R8@åN§:WH
+aã®F]´’±ÐøGl¯¾¥Ö#rÛÛìL™”Y½»¡!Cµ©8h÷³“çÅ2¤Ca ÷–{ÊÜOª÷LTlÙËvðÚ à¬¤öhÂC-̪:Ê0`tq²¡œæ ¹¸Ü¯¨^»Àù6à¸ïÉ_šÀA#lÖˆ~³xxÆ߈Xš "Œ»cÒ«½ÇŒý©jË#ŸÀnÚ
+/Øñ˯ÜÐóί긤»{xk›¦þ’j×y]ŒFZdèò`ø
+ø2_øÔÉ}jð¶Ùî<˜€°®w)ÂÊ ìß·{k‰À«½šþ¹…ø%ˆ/ˆk8Úõ“V¤~»xWèúïÊî©$+PG?$¢®’²Ò˜>¤Åæ® º/¹+æ»÷T}«}!åÐ~’„Y#ôg^ZksæBÝZó¹™xXswƒ ïçâ{hš™þ/~k‘1%Upø!ÉkýZÑï¶Bõ3ïŽýLO% [7¸¼ÿÝÜÿü¾Ý5ðnŽÕúd熞×3…Û ?ôdþÇ~‡¼ÿŸD
+endobj
+2503 0 obj <<
/Type /Page
-/Contents 2009 0 R
-/Resources 2007 0 R
+/Contents 2504 0 R
+/Resources 2502 0 R
/MediaBox [0 0 595.2756 841.8898]
-/Parent 2006 0 R
+/Parent 2507 0 R
>> endobj
-2010 0 obj <<
-/D [2008 0 R /XYZ 56.6929 794.5015 null]
+2505 0 obj <<
+/D [2503 0 R /XYZ 56.6929 794.5015 null]
>> endobj
-2011 0 obj <<
-/D [2008 0 R /XYZ 56.6929 485.757 null]
+2506 0 obj <<
+/D [2503 0 R /XYZ 56.6929 752.0497 null]
>> endobj
-2012 0 obj <<
-/D [2008 0 R /XYZ 56.6929 207.615 null]
+2502 0 obj <<
+/Font << /F37 1018 0 R /F21 930 0 R /F22 953 0 R /F55 1311 0 R /F41 1208 0 R /F53 1303 0 R >>
+/ProcSet [ /PDF /Text ]
>> endobj
-2007 0 obj <<
-/Font << /F37 802 0 R /F21 714 0 R /F22 737 0 R /F55 1037 0 R /F53 1029 0 R /F48 953 0 R /F41 939 0 R >>
+2510 0 obj <<
+/Length 3243
+/Filter /FlateDecode
+>>
+stream
+xÚ¥ÙrÛHîÝ_¡·¥«FLŸ<ö-wef×ÉÆNíÖÎÌ-R6'©©8š¯_ æ!‘r¥¶üàÝ@h\M¹ð'‰ …NÍ"NMh…´‹ÕöJ,`îý•dœ¥GZ±^Ý]½x§ãE¦‘ŠwëÁ^I(’D.îò_ƒ—Ÿ>½½yóá?×KeEð*¼^Z!‚¾¼ùòòûtªàåû··×K™Ä2¤Ñ"¼¹¹½}ûzyûáýÍ?Þ¼½þýîç«·wcCæ¥ÐÈÕŸW¿þ.9œáç+ê4±‹'ø!B™¦j±½2V‡Öhí!›«Û«ufÝÒ)aX„6Qñ„4”HC
+›hÛ4Œ´ÒNÙþZ&A×qð-Û”9£`]ï ¦òìØüC#‚§²}$`F8«ãjS¤¬ÚbûÐD½&hZà. J-¢àî±`ÚÒQÃ!(yYViYñ½lÚ²z ðçÏ š e+Zž7ôg倄–R†©µÊ7?¤ã¶¦ÿÅ÷]Ù‰
+ãH(–ÅoJ™¶øÞâÆ@àR+=²°"/ÖÙaÓÂP2©*Ÿ Ip=Ú ¨ì³§9"q(eâ9r³X…ÒDrlÈw%Úgjƒz×–uEcÛíËm¶/7GÃ¥¬ò"§_ÎôÓˆ¬~?C—ù±Ê¶åŠ~4åCå1PL£©y»GÔxÇü°ÝÑŠˆT6º‰’Eˆ
+ÄûÓ¥3äNàgUWKTýò¶ãU]µYY‘'€‡]žµŽ!œt÷÷¼mÇ8`æ|ËW-EJ8/”’ "2HÎgÁŠ–$Œ/açµ'WÕ픇Ùf_ùöo«G5EÕ0D <d/f
+²ZÑfÛîÉÆ]
+Ðú[±ïé…bÀ %”)ÜžleÒîÓ//>eЪ\lhËÿ›ÚãAXi|l &Ú†~»ô7kë}ÃûT9/‡”¶Ø3Öý‘'R
+¸–­:ÍW=û*VŽ}ôZqì;ò±îûÅ€°ÍŽ4p®&¡jZÀð7ô“Nƒ¾ 5
+XÌÐc9;ü4k‡—Hö†xFrÒ‡$ß”MvïCÁ®nÚ¾SÅmHÐS­í©¶hZJ˜Ñ÷¦È¦ UÚa§û! ÷£QQ5ƒ',änLQ=Œ8T§Ø×z¨]G¸%owh˜þ Mƒ?KÞÓï¸)2O—Js˜«êjÊ$¸%\¥f·„»³Áð©þQ ¿ÜþBÀ¯øˆKÝj ÐQ÷*HÜ\W~SÀôû*¿ƒ„Ž úé]9hbG–;s‘œ'3jÜKzaŠ¨!:ѹêS…lØ­ìΊ©ÁiÝÒiƒ³¾ÿ˜4ìzÛi¾–»î!¹ð¯@½EM]8iL¨°×qñ ±æ/\‡å.Üþ¹aòm9hé¬^Ä[$Õeæ:¬ îF9~Ö ”³7îK Ÿˆ±#à —hßî߈0ŒëÑJÀܹN³óî¸ÑâÄ–¦è)G.ÑÄijéÖßÊœ—gO
+È{òÞ5ÖªèBsîŽ Ò§qo!ðoõ˜í³=‡
+endobj
+2509 0 obj <<
+/Type /Page
+/Contents 2510 0 R
+/Resources 2508 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 2507 0 R
+>> endobj
+2511 0 obj <<
+/D [2509 0 R /XYZ 85.0394 794.5015 null]
+>> endobj
+2508 0 obj <<
+/Font << /F37 1018 0 R /F22 953 0 R /F21 930 0 R /F55 1311 0 R /F41 1208 0 R >>
/ProcSet [ /PDF /Text ]
>> endobj
-2015 0 obj <<
-/Length 1499
+2514 0 obj <<
+/Length 2925
/Filter /FlateDecode
>>
stream
-xÚ½X[sÚ8~çWøfŠª»íÇ”Ð6Ý–dÙÝ™6.ˆÄ-Ø]Û$¥¿~,ÉØ `ÛÙÉLÆ–?sô+"†?Daó Œ9˜ˆ`¾îá྽é‹:аz5ë½|Í F±¤2˜-[²"„£ˆ³ÅÇþÅÍÍxryõ×`Hî¿Bƒ¡À¸ÿábrwñÞ¬Ý bÚ¿x3ž†$”Œ(Ô0‰û“‹ãËáèíxôÛèzòzp?{×ÏÃÚÆÌ´U÷>Þã`gx×Èőžá#Ç4X÷¸`HpÆÜʪ7íýÞl}­·úÈ,B"¢¡‡ JBP,íÐ!b$e5ÓñØœúâýôZŸvч8€¯H
-Êkø"+K5~UÛ•}ÂGð¼0YÜ&Ÿ ê@€Þ÷êjriôÄVÝbfiYI•féV-U1 Q_ese–>$Ù&YyÌ"2BTJiÅû à(Ž³€Û×##lbyœ ʱhdú†4(Še ™D!COw³·×·ç™»Ê*Udª2fL·e¥Ö¥yåY™UºYïôrĸ¤VXE46L¢âCÌfÉZ-†óG5ÿ:ϳ¥Þ«ÁL &Cž
-Ö’NqŒ(©m¬Ó)-Ô`k CG’6!i¥.Ó•ÒÆ8?îý¡*Š8]n/ÇÓÑíÕÍìêzÒìòÄ«ÿȇQQ-šZk¤ èê±/ÌËç þ,¯öqjdU:/-4·A˜üLú³ÖYÙaâº&azP¿mˆ0 ™®œŒ£6Ê•ÛÃ8jPZïðq_%”lÎù•äQÙvH#®ã¿£ò¦H³}º7eòà˜ß¬× ÄŸ¡;³,«ïi…Ž²†GŒa§…:ÁŽCÕ츌íC!BEèË—¶m„‡°äœ4®Ay¬ëtAQ̹ìš7z¬»S®£—á*š'k¹€f,C~w”‰¢°9Y™[¡‰ŸfóÕf¡Ì ª;ã¼JŸTiÒÏÜ.‹;H½è
-´~NŒóòÍh® ©/êþÁ‰¥æÊå—ؼNmZƒ¨¿±¹÷yÛIÕ2]§«¤Xm]pœ¹®sùhlј!"ä™Ìk£ŽÇVƒªcëé ó˜îægT:Ge'ó"ðe¸§Ò—yOª(›²åªœþzXa€„¬ÇnÄùÙzl}ûP$ëŸIn*AJÄÏ9 …:á
-ñ®Û¦Y%Õ¦ì#Ò qU˜z^Xسr\¿-T£k±M¥ÇV$„Añœ–ÿnBå^ &¥u°kõ†)“Ý'® ×…žðÿç¾
-endobj
-2014 0 obj <<
+xÚ­ZÝsã¶÷_¡·Ð3?Ú''q®—Kík¬›k›ä–h‹=‰tEÊ>ç¯ï.vA")·¹ŽgLp±Ø]ì.?€’3rfâ0ÎT6K²(4BšÙr{&fÐ÷öL2ÏÜ1Í}®ogo~ÐÉ, ³XųŽ'+ EšÊÙbõKðm˜†ç Aß_ßÞ^}7¿}÷öúŸ7×Wçs™&2 .?|¸ºþþÝßÏçÊ`f!‚¿^^¼ü‰hÎ3\¾½º=ÿmñãÙÕ¢3Ì7^
+Výûì—ßÄlsøñL„:KÍì^D(³LͶg‘Ñ¡‰´v”ÍÙíÙß:^¯:ê )B¥c5â ¥<o¤24Yff‰ÉÂX+m½ñi]T0)9>tð¹x¡÷²¡ç}½¯VØ΂²mˆ«-·eõ@ Û¢ÍWyËãÝ°âK,ÅŠÞÚšzWE[ìNäuýÌÊZêoÖõ~Ãcî˜ißN¾\Ö»s™«9ºæ?—2ÌŒQv2dȪÃ纠Æ}½ÙÔÏ]ÿî< ö›¢Øj)‚«|¹¦Žf¿\MS>=F––.j>îÊzW¶/ôV?»#…–{«¢ùÓq¦$)2U³DÆáD`#èùÑ »`Î=#!C“Š¬Ó‚Nzwf%2¨jzv¡„¶Jx[ç 5î
+›$Ðj
+ T‚Ýñp;ch`âH) U÷é¶Q²´ÇýݦlÖ65\ ú½®¸•W̃)À\luS>T6pf:6ýD耲Â)ßÇIj$Üù¾„)ï§=ûýLÿ|ã²
+=³ÌÛ²®ˆ
+’ªâ™(
+q]²Çr¦/ëí£Ý`«iˆ8Œ²W¶é„?˜Éºc?pGŠ,9­Ïñ õùÎH$î*}} Ej×·Wß½Áß“`¹Î-V€.®@Ðâåp(DÀ˜S/•§²Þ7›¢!Ÿ-ÀF°l«,øtn`¯h×ÄÔR9„•C,F©&±4Œ ‡q¿zt
+Ra "µpÔZæ5ìf+³yF<YO£èìÆhÄA’a.cêâ-,'ÔéQ}õÙ%ƪFª ð˪EVÓÓÉ…&+ƒÖ
+êøùž‹¦2’ó]¾Å #¼§1‘ì|Œ[I%7£v3í
+~NjØ9²à+m «ªiŠ¥¶ ÃqR%0H=⧊ƒ*ȸ3ÈÖ~ª0“i4Q½òŠË2ŠaQù…ÏeÞäºÔŒ‹dtzaú\Ó+³ã²Kói ïÉPGIÄÓßOÅ
+8„ô,»-ÚæU¯Š»ýÃCçPkØ´ËDª(Ó¯¸Ìã:á2Çe]öePÍ ½ N«tL#*{Åš‰–}•7•-=ÒðYCKEÔahÿü3 Ÿ×–´PÔ+mH€ZQ¼4íè äz[¶-y»§älHž‡%áß#¡ ‘p!¤Læè4…×#„{wYå¶Üä»á•ípgÎJõ×0<pvŸ›Ïµu)š?AC•|T†ÀŠC«ŒV†šc!‘®zTPV#ò5^zhW3B{ƒ3‘š
+¶68⼂;|®éÔì¸ljþ>•š'Uv©9T9–š=•ï: Jàøýí{lDp¡ó>0Ò§8tÀ¿ûÀ
+zó¹NDÆqÙÈ\¶ÈpÔ§U:¦•½ƒƒ
+¡êÆ}•ììL÷m¯¯‰îœ $wJ
+endobj
+2513 0 obj <<
/Type /Page
-/Contents 2015 0 R
-/Resources 2013 0 R
+/Contents 2514 0 R
+/Resources 2512 0 R
/MediaBox [0 0 595.2756 841.8898]
-/Parent 2006 0 R
+/Parent 2507 0 R
>> endobj
-2016 0 obj <<
-/D [2014 0 R /XYZ 85.0394 794.5015 null]
+2515 0 obj <<
+/D [2513 0 R /XYZ 56.6929 794.5015 null]
>> endobj
-2017 0 obj <<
-/D [2014 0 R /XYZ 85.0394 752.1815 null]
+2512 0 obj <<
+/Font << /F37 1018 0 R /F22 953 0 R /F21 930 0 R /F55 1311 0 R /F41 1208 0 R /F53 1303 0 R >>
+/ProcSet [ /PDF /Text ]
>> endobj
-2018 0 obj <<
-/D [2014 0 R /XYZ 85.0394 689.7995 null]
+2518 0 obj <<
+/Length 1899
+/Filter /FlateDecode
+>>
+stream
+xÚ¥X[—Ó6~Ï¯È §Î ]më1ìX.Ë–¤ç´xð:ήKb§±³~}g,ɱAK{òYÍM3ߌÄÆ~lœ(B…–ãXK¢(Sãl3¢ã;X{1b–&tDaŸêÙbôô¹ˆÇšèˆGãŪÇ+!4IØx±üLonf×—W¿OB®hðŒLBEiðvzýÛô™»™hL_Ìæ“Å‘@¤‘,¢Áõôíì2¼x9»x}ñîúùäÓâÕh¶èë+Ϩ@­þ}øDÇK°áÕˆ¡5þ”0­ùx3’J%…p3ëÑ|ôkÇ°·Únõ9Cª„(.£qÄ’j¿Ç(¡
+<Æ’ªùÑcœù<æ¨ÐcŸóé¡Œ2ÉxÜçv&ÓydòžLF#ñD …ηyV¬p"Q|¹/²{3ej3ªï«ýziÆ·¹ùß×¹i*KUÜ•væÞ}«ÊÎS¨$¸Z™©²:åžî&, 쎕ùH)Ï—O`&¦È¬eÙZu‹õºÓ <7D°ÁÑJñÖÀükº)ÊV]AƒUµƒ×Áåõüõì3iTȪöY‚´1‹F. ¬\\Úæ_Ñ0*a0Tµ¥;Zó«j_ZÑ©
+²j³1N„5”_›!ÚÝ2•I?Ü!K9M$pwa°]ç˜x4ˆ"’HYZa\ÑÜáSêr>5L×vp——ùŽii(oOzÚDà’Dk+aYÖuž…À6{ô A¢©‡±ü‘*úºg yL©xÌb.cXbž<
+žåYºÇÃœ3TGN1«L8÷hÀ8‰-IµmŠªDŽ<(jó_VÜæí¡4 -!m4â2zó»Çä=Ž6ûºÛnù–!&(èÀéI>oÒºÉ15 *Ö¹+jào©â$Vw~¿%?„D(éÈ­S¥`”h7
+*ʇ*K?ð{]UŸífǹ
+ŒC½H˜ó厾ñˆ )´N4š†).¨MqíR\³“×ßIqÜZWnkÚX¿jD…ÊåÜ$ö9"¢¤åŠÍ¶Ú5*´ÄàP%vt<“aôʼn¹Š\üÝù‚$*ŠçpîÙA!U GS 8CénÉMÂ,·I†Ha2'A˜ù¯Ì?Ì®aˆ´s™C6±ø\ôáõ-A¥À{žü
+ë>‹ö¢+}—ëŽÊë!LÓáý'7zèFv#Û¦)ÑãΩ&œ©®†;‹MžÞSBÿÚ¤åº*Ö9*ãdl;iß>ùC6$‘T ½|9›_¼¿ºY\½»öÔù“Àõ„Ùyß«så«¥ÄF]0ÛÇ ØUb¥Ý7fÖÜt9ÜÒš"«-iµ2©GOèî Ã7•^ÙôµÆ’ð¤ëBN#™·Œ-Þ -Œ6¬ mÔÌÄ$øï§òØ
+&Ð «MüÌMͪv­É<ÒuÕÞˆ˜«°H•â­§lko>Š2[ï—NÜÍlƒ×µï ¸NŽ{-‘e1x59B ×Huû4o²§ÆÝÊ àýDïâú1ÛZˆ¹=ØÒmZ
+ò½×;@9|ród:íà¿ìß0%´VIÂýc‚Z ÍœRhSâTu%¼oÄÝÿ$_Éendstream
+endobj
+2517 0 obj <<
+/Type /Page
+/Contents 2518 0 R
+/Resources 2516 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 2507 0 R
>> endobj
-678 0 obj <<
-/D [2014 0 R /XYZ 85.0394 651.2999 null]
+2519 0 obj <<
+/D [2517 0 R /XYZ 85.0394 794.5015 null]
>> endobj
-2019 0 obj <<
-/D [2014 0 R /XYZ 85.0394 618.4832 null]
+2520 0 obj <<
+/D [2517 0 R /XYZ 85.0394 672.6222 null]
>> endobj
-2020 0 obj <<
-/D [2014 0 R /XYZ 85.0394 583.1153 null]
+2521 0 obj <<
+/D [2517 0 R /XYZ 85.0394 403.8925 null]
>> endobj
-2021 0 obj <<
-/D [2014 0 R /XYZ 85.0394 517.8114 null]
+2522 0 obj <<
+/D [2517 0 R /XYZ 85.0394 340.9183 null]
>> endobj
-2022 0 obj <<
-/D [2014 0 R /XYZ 85.0394 458.3941 null]
+870 0 obj <<
+/D [2517 0 R /XYZ 85.0394 302.0073 null]
>> endobj
-2023 0 obj <<
-/D [2014 0 R /XYZ 85.0394 396.012 null]
+2523 0 obj <<
+/D [2517 0 R /XYZ 85.0394 269.01 null]
>> endobj
-2024 0 obj <<
-/D [2014 0 R /XYZ 85.0394 145.9047 null]
+2524 0 obj <<
+/D [2517 0 R /XYZ 85.0394 233.4614 null]
>> endobj
-2025 0 obj <<
-/D [2014 0 R /XYZ 85.0394 83.5226 null]
+2525 0 obj <<
+/D [2517 0 R /XYZ 85.0394 167.5653 null]
>> endobj
-2013 0 obj <<
-/Font << /F37 802 0 R /F21 714 0 R /F22 737 0 R /F39 899 0 R /F41 939 0 R /F53 1029 0 R /F55 1037 0 R >>
+2526 0 obj <<
+/D [2517 0 R /XYZ 85.0394 107.556 null]
+>> endobj
+2516 0 obj <<
+/Font << /F37 1018 0 R /F21 930 0 R /F22 953 0 R /F48 1228 0 R /F41 1208 0 R /F39 1151 0 R /F53 1303 0 R >>
/ProcSet [ /PDF /Text ]
>> endobj
-2028 0 obj <<
-/Length 2089
+2529 0 obj <<
+/Length 2010
/Filter /FlateDecode
>>
stream
-xÚÕY[sÛ¶~÷¯Ð#=¢¸À£ë¸­{N·v§¦y %ÚfB‘ŽHÙU}7Š¤H)N|δã –{ùv±ØÉ Ã™‰%šê™Ô LÄl¾<³;Xûþˆxš8Å]ªo¯¾ùŽÉ™F:¡Éìú¶ÃK!¬™]/ÞEß"…ŽŽ.NÞœ½ŽO8;ýÏïo/ÎŽc"J¢“Ë˳‹×ç¿ÇT` bŒ£7'¿œü×Í]k|vuüþúÇ£³ëV±®ò3£Õ§£wïñl6üx„ÓJÌžà#¢5-¸`HpÆÂLqtuôSË°³j_ƒ`DYBGРdFÒBÐB£„Qfá8ùåú‡·?C€œvÀó˜&ˆ
-Gv^6ÙªÌÀÕ¦n²eíN«²®VM¾^z. ”#ÆêÙpl0èÎ
-²“H&Ní]ëµ@”$a+;pAL¾Ì‹ÔZO ÷)@Q®?e0Ó\L«Tt³nœ¼¼q¢Òâ)Ýxë僺Єõ
-Îg Tc†EÛ3œ
-d
-q @6Öš…óÓ^=ÑèW›
-»„c¤ÙF¬ëô.„èz¹LWþÂÏ×8ÊþÌ›iD°¹ŽÕô
-#{¥Œâ„¨ÝMí¿^ïêþ7Ü°Mendstream
+xÚµYÛrÛ6}×WèQš‰\yé›ã¨­ÛÄvc¥í4ÍMBŠtI*Žûõ]
+)£‹ÍØžç!úÇíY™}{t&?Ú».Ó¼Ö ëÁ®ŠîÌ°Úm·Qù¨'Š?šüšÖè .´S_œ
+›´B“ƒpªƒ`C“¿mdÞAŸæwƒÀ(œíV£w Ûù(ðS±+s[6÷Ӻ妪®ƒ  sŸÈí¾Ô0­”Z™ö[Å{l:Ψü¸i+ä0MGÐóü¡íUƒ ó›tS£@ç3<Ñ Áƒ½}]½mÁæè
+6¦ÿendstream
endobj
-2027 0 obj <<
+2528 0 obj <<
/Type /Page
-/Contents 2028 0 R
-/Resources 2026 0 R
+/Contents 2529 0 R
+/Resources 2527 0 R
/MediaBox [0 0 595.2756 841.8898]
-/Parent 2006 0 R
+/Parent 2507 0 R
>> endobj
-2029 0 obj <<
-/D [2027 0 R /XYZ 56.6929 794.5015 null]
+2530 0 obj <<
+/D [2528 0 R /XYZ 56.6929 794.5015 null]
>> endobj
-2030 0 obj <<
-/D [2027 0 R /XYZ 56.6929 751.9898 null]
+2531 0 obj <<
+/D [2528 0 R /XYZ 56.6929 681.0754 null]
>> endobj
-682 0 obj <<
-/D [2027 0 R /XYZ 56.6929 712.1227 null]
+2532 0 obj <<
+/D [2528 0 R /XYZ 56.6929 404.8182 null]
>> endobj
-2031 0 obj <<
-/D [2027 0 R /XYZ 56.6929 678.7055 null]
+2533 0 obj <<
+/D [2528 0 R /XYZ 56.6929 344.3155 null]
>> endobj
-2032 0 obj <<
-/D [2027 0 R /XYZ 56.6929 642.737 null]
+2534 0 obj <<
+/D [2528 0 R /XYZ 56.6929 283.8129 null]
>> endobj
-2033 0 obj <<
-/D [2027 0 R /XYZ 56.6929 575.4649 null]
+874 0 obj <<
+/D [2528 0 R /XYZ 56.6929 246.6193 null]
>> endobj
-2034 0 obj <<
-/D [2027 0 R /XYZ 56.6929 435.4781 null]
+2535 0 obj <<
+/D [2528 0 R /XYZ 56.6929 214.3762 null]
>> endobj
-2035 0 obj <<
-/D [2027 0 R /XYZ 56.6929 292.5265 null]
+2536 0 obj <<
+/D [2528 0 R /XYZ 56.6929 179.5818 null]
>> endobj
-2026 0 obj <<
-/Font << /F37 802 0 R /F21 714 0 R /F22 737 0 R /F41 939 0 R /F53 1029 0 R /F55 1037 0 R >>
+2537 0 obj <<
+/D [2528 0 R /XYZ 56.6929 116.1573 null]
+>> endobj
+2527 0 obj <<
+/Font << /F37 1018 0 R /F22 953 0 R /F21 930 0 R /F41 1208 0 R /F55 1311 0 R /F39 1151 0 R /F53 1303 0 R >>
/ProcSet [ /PDF /Text ]
>> endobj
-2038 0 obj <<
-/Length 3060
+2540 0 obj <<
+/Length 2741
/Filter /FlateDecode
>>
stream
-xÚÝZKwã¶ÞûWhÑ…|ÎÅ“
- Eå€4(mHƒ`hód&…F £ÌJã¶Xef@K´T#"$…¢”òõq»5¿ž˜¶‰µæÄ/7Ùò×òrÁ¸˜W›´2->¿ýÉ.‰šgËÂþ®Êæà:;8ÚªpÃW®[|þ†&qT±ÀEµqù~ñßbŸ¹Nº÷4űZk÷–¢3Ë$l¶ i!¨]À¦(«}ºËJ˜’À¾3‚ÇĤ8l U 1m‹e:&'Æ4µØo¿8¼‰™ö­ÇeONfðy“/7ÍçVd¦kDf~ãºM'.¹Õ¢§qÅÉ$
-TK@E2_eÛìSZåÅÞ=¹»w¿ íÕ%~uÖ2˜ŸÂ;Tô'qc5*L¯!˜Ä¡ÂΨðpˆI,Úp€6¸fó÷•{–n˵¢@Ûë´>m~–tµrÌ–ž¨¯0˜ïà ö5:¯ÙØ¥•Á€{Z”qÚÏÙ¡ÊËle—ƒÃ:Ü?z´Ùéìòíê¾’\’á›LâÛíø+CÛu‹@ëá†çe±Ëê5’\lkkÝG~;æ®±ro¹}2­ì÷¼¬Ê7ÝióÈn¶ïÈÔ²“>¾iî Ó†è]Ó,Åý:K'1Dz£“‹2ÜæûO#;“pDçþ%ƒüþÄðm¢xo¯OͬÁDˆÀÎ*/ÓÇ­‘csÿ¢éÐ TŽh€ÑÇcåS·nô5;<ç¥Á ×LÂui9°€Q6™ëö&Ÿ6[`#Ô)Ñ0!ù2ó^ÑŸ²e•Î@%hª·ÅŠ"Î1?Û“& {
-˜À4XÇè°ƒ÷]Áúí ¯ÇËôXfAI¼Âgk#Ö5XjO}Üomˆf=¸quÜ=•£6`Yì«l_M˜UÌP¢‰:¡( ª E TVQ~V¥EP”÷,-5¡).¦ù
-D|µ”„
-H§’c²ƒïÀ.sX.¡MŸf÷xáìaIp™¤WnPdþœÛÜOÑ k¤©Sn`æÛcˆ4Ì€‘ˆQ7Ì[êæ”nº s-9RR‰f,_á|ÁA*€ÿ®ÎÔZ}Åͽ†¨¢­Åî)ßf#:¡AR´ÎMA£ß EøˆjÕÌðžÓÃ~<¬HtÒ·/æû¤&‹×Sž
-êDx2ÍX¤ଭ¥ðh¡Û¬Õ® “ؘÜt¨«Þá¡ËMq4™Œi?f™´µC˜ù§ùÚ?Ødþk1ö·:56% XKK5a§š.«S(áºïë+HÃßyê
-Ðâ‚×.eÀ|"ìëTç¼P¼ àü$ÀIb´ì„jRM
-¶‚7„ތٗ՗í€ç5›Mr©Xk°
-„¶S.´ô#å1¯Üq‰§u'+¢b ^ØŸ˜±ôX0S¾L·æTÍ =úßÔO–=¥‡´ò“•ËCþdPŠù{7XíKûŒÐ}ƒÐÞ
-Ñ\ÂØ$g‘¨ÏZ ŸRh.©ÉÛõƹ£½ ëá(• $T2Èl7¦4ñl\–½ìb&u\ •ï—Ûã*s•¿Ta½KO
-endobj
-2037 0 obj <<
+xÚÍZmsÛ6þî_¡ôLˆâ• >º‰Ósï⸵ïÚ¹\>Ð"e3¥HG¤â¸¿þo)‚’fæ®™©@`¹X<û`± š,0ü#‹T Ì_HÅ‘ÀD,–뼸ƒ±ŸNˆ“‰½P<”úñæ䇷L.R M7«®á4%‹›üCtvuu~ùæâ÷Ó˜
+ýˆNcqôîìòŸgÿ°}W§ŠFg?_ŸÆDJ@ˆ`-—àèòìÝù›øõßÎ_ÿýßï/ÏO?Þü|r~Ó[6´ž`¦Íú|òá#^ä°ˆŸO0b*‹GxÀˆ(Eë.œ1ßS\ŸüÒ+ŒšWChp™".1ã(M@C@†
+Щ½`˜7…Vžòèñ¾¨m«j²¼¬ïôƒ]Fj—¦sB£›û²µcëì"d‘@:BÒ¡IÇ —TyVmÛbµ­ì¼
+a"“c(1ÄSÞ.–l7™&œÕïczèÌb˜êJJùC‹5ïÍyu=)s\Á 0ƒÂŠŠÃUÅPÊT4TUôRzÞ8ߟ
+*Ñðð”^(0å(„)8;ÅÞ”çuv[9åÅíöî-š[9—‘DòÃ+Jͯ¼—2+¿Ÿ[ùÁ)û•O§ ­|4å)ÝŽ¦±m³;O×ízmžkÇÙâkÙͣà ll[G@g u
+˜6Ÿ@B8&cÛ®õQ¾zڃњ3¡ï]U]¸±ºé&‰Á+ç3(•..õÿ/ZŸU@T.òyg‰„:aB\á„Œ'Ê€'Ôs@ÊqÅ>òTX
+~Ш^hjÕÈ Pûc‘È‘YW¶*P9”¨MÛÅz+ØG—™òQá«l¥ª“ÉTEWMÛ–æô×’z­•Ê\}ÈÊdY©ò Ô.‚2°2®š†-
+M¹Æ»„šäU@=ç™(¶§=ÖVŸ™%|.‘¤/™¦j¡®N€ÆÉ^Ò«õUÍ2›3J"Á‰8 ˜#•>0ר;f/Ä1æ+Bº„BLÈ¡â<:g&…
+PIʦI0*¡ ø„•¶¬—
+˜6.e‰’cÛÂ¥¬³g¾–ß,›€º«¦v|Ý:_OAÅÃñhswÅ×î sU¸žÚ]¾BA,Tb˜ào²Ç¹I$‚Œ ˉ[¤DP ¹÷ÍsÅ ª¼ ÝzÄxÿÑwŽ+T_^ÒƒvõBSÃÆLQäZÖ…¥ÜÐ)뉢;5QtŸä»oL)Û}!JGk€;¢Ã Vxž; ƈzw`—°”ÌrÇLäN ÂxW7‘g“ˆî>^éò¶Ù„¶
+endobj
+2539 0 obj <<
/Type /Page
-/Contents 2038 0 R
-/Resources 2036 0 R
+/Contents 2540 0 R
+/Resources 2538 0 R
/MediaBox [0 0 595.2756 841.8898]
-/Parent 2006 0 R
+/Parent 2507 0 R
>> endobj
-2039 0 obj <<
-/D [2037 0 R /XYZ 85.0394 794.5015 null]
+2541 0 obj <<
+/D [2539 0 R /XYZ 85.0394 794.5015 null]
>> endobj
-2036 0 obj <<
-/Font << /F37 802 0 R /F22 737 0 R /F21 714 0 R /F55 1037 0 R /F41 939 0 R >>
+2542 0 obj <<
+/D [2539 0 R /XYZ 85.0394 677.5149 null]
+>> endobj
+2543 0 obj <<
+/D [2539 0 R /XYZ 85.0394 533.7824 null]
+>> endobj
+2538 0 obj <<
+/Font << /F37 1018 0 R /F41 1208 0 R /F53 1303 0 R /F21 930 0 R /F22 953 0 R /F55 1311 0 R >>
/ProcSet [ /PDF /Text ]
>> endobj
-2042 0 obj <<
-/Length 1827
+2546 0 obj <<
+/Length 2753
/Filter /FlateDecode
>>
stream
-xÚÝXKoÛF¾ëWÈEÌ;¹{tb'u‘(®%§Ò‰’‰ðáòaÇýõå.)RZÉŠ^
-8¤†3³ß¼I¦~d*$’šêi¨9˜ˆé*›àéþ{?!Ž'蘂!×›åäõ;N5Ò’Êér3¥VŠL—ë/³7H£3€gó‹W—gåœÉÙÅÍÍÕüòú¸˜€ãÙÇ‹ùÝÅûìæLÓÙÅû«ÅÙ×寓«eoÎÐd‚™±å¯É—¯xºË`Ä´Ó'¸ÁˆhM§Ù„ †g¬{’N“ßzƒÛW}p¡ \NÆ‘ý~ 
- ¦Ph$e=P”ø€ê¸ PÁïæ ¯ß 1à$…!V Ý°dÅ:ÞGCKÄBN¦CvuL»èP&ˆ Ádž-âU²y> ˜–³§û¸¾K{SöººWß Î6…û//ò ŽË,É£Ô½š¤ëUTž5[Wàð«Ùü4—}dïb« J³¢ª
-Ó€h
-¡€ H A[s£ô)z®LœÑ˜j +¡jÒÚÞ{ìe%iÓii_,ìµÉ×qYÕQ¾Þ84Ó>É¢zuŸä['8ÝeRßgööO,ðí»·ö‚–Ã0¬f7EU%ßÒÖ³à®ÑaŒÇ+›
-mŒÂ‰‡HÌ]üI)ŠÊÜ\óÐÇL@ìÉŽÌZÇ›p19EpØC%¡d $ÙæES£Ã@–ä°K”C61Á^Ȧ׉l긌ƿ‹<Σì ]
-µ/¿~Ù‰I ¥»(Ÿ}B!©8€·yQhSu·ï.*0}üj'h&M½R¤sÝÙ¾Ÿ{ÎÅ°/ÁŽG»H Ü t‹ÑN¿¯hSÇ¥áòjñööúfyýiþ“ Ú7†B°rÜådb
-.ÍÔo.—®vº-ˆ-eË®¥Mûºœ/ìll¸Ârè? ñì!‚Ðkÿ2MÜ\ÛAŶJÛËÚ4Ÿä[S'…Óº± Þi»^¼E–z×nQ@dÅnêoWÏö4£lJrع`ùh…¶­?ß›˜àç]]v ×V}³eç=ÉÏ÷Æ Ó‹Q¿™(Cƒí ¿ßÇ­ <ßmŸP°Õ÷ESÛìʲm²8¯«s‰Sa×SzöówA«Wjå[l"§ÚWÏÜFco ›9qÛ”=DÊMŽžp%!Fœõ5ãu\¯^·V!SÏ}s,Ê’©áPb>„ÝsÔÐZƒð³›öò¤N¢ÔµÓ¨Žö]BØÄΧ›nrù«‰Ë$®ÐOôØOm-Ž-Z"ŠÁ'›è€éøÑ1µ_3ø¾> Ó™&ꤾŽçPßs dÈÈHß]å"ûúæ‘wy:ˆ¡[æãѺÏ{ó1¡¥²È¬ïîqâ²c=Df5é B"_©f÷ »ÚøöbbR¸ïýª=BØEØͱ<*¦Ëˆh¸dM lô«´©’Çøø")wž^#{žK¤åÙ™ìsþ e½ï÷•ù\?P6ô¼üï=Ïÿžïf^ÌWO3p_NþõÇÕÝÇcnj½¢~ÇÒÔ@;£ÌáŇA‹e°ôÚþàEqendstream
+xÚÝZKw£FÞûWh1 tNT©'Uµtlw¦3ÝNOÛäL’¸Åi 8ž_?·^$@î´É-(.—ª[·¾ûDdáG"F±¦z!5G±XoÏðâ#<ûöŒxžU`Zõ¹¾¹=ûú“ tLãÅí}o.…°Rdq›þ}ƒFK˜G×ço¯.Wÿ¼ºø×¾¿¾Z®ˆ$”DçïÞ]]_¾þi¹¢?0c½=¿þpþÆÑÞ-5ο½ºYþzûÝÙÕm'Y_z‚™ë·³ŸÅ‹6ñÝFL+±x„ŒˆÖt±=ã‚!Á ”âìæìßÝ„½§öÕ1mp¡ <½ĤœÐA’`’L#By§2JÆT晌ÆVŸÌ6¿~%D‘¤´
+õ.«ï«zë$lc„ ^²_(åëM¶þ´*“mÖ˜[ÿN râ_±ìÍrʼnóvcF4j7™#5Ù:ÿcš¥ŽpŸäÅ®^y£ @Ä<zW5M~Wô4nºÄ¿p,?•)©ú0+LH¾â˜!¢([¬àH´Ô½…N³ûdW´² ¬‘µE 3ê—2JWëjûÙ«2YÏœ¥*‡ùjd^…¨Vª·ƒÇ¤.'vÀ@.ÞOø§å6Ç6!µÕà=&@j7{R¦c' ‰Eÿ
++Rô¦‡æ4m­$~ž¦88rÏ<f3iEØ—ÙÌ)d ¤äóÍO"[Àé«Xž@vkÙË"ûí²’«9dÇ9™—+0È5D6AL
+½áû|pMÜåæýRˆèwsÔp à± æþý®á" ÑU¦–w¦á›/ /Øp¡‚ñg7\$éæqÃÅ>Ýpa„‹ãzú%ê:(³ ¸<U×õ¹fи,:ÛÑÄ—P”æ5ø“ñÕu “XÏ ×qH7¬ë8ZÑ¡xOŒ CR<^Âq„Šã1y .Sì‰Pf4•ŸÔ&Ïf”—ëb—fî&rØ7Á£ñ àçËð–çÏgrˆ;ˆ`y基¬Â{MsÝYêcØ
+ݬ
endobj
-2041 0 obj <<
+2545 0 obj <<
/Type /Page
-/Contents 2042 0 R
-/Resources 2040 0 R
+/Contents 2546 0 R
+/Resources 2544 0 R
/MediaBox [0 0 595.2756 841.8898]
-/Parent 2006 0 R
+/Parent 2549 0 R
>> endobj
-2043 0 obj <<
-/D [2041 0 R /XYZ 56.6929 794.5015 null]
+2547 0 obj <<
+/D [2545 0 R /XYZ 56.6929 794.5015 null]
>> endobj
-2044 0 obj <<
-/D [2041 0 R /XYZ 56.6929 627.8052 null]
+2548 0 obj <<
+/D [2545 0 R /XYZ 56.6929 85.6141 null]
>> endobj
-2045 0 obj <<
-/D [2041 0 R /XYZ 56.6929 562.9454 null]
+2544 0 obj <<
+/Font << /F37 1018 0 R /F21 930 0 R /F55 1311 0 R /F22 953 0 R /F41 1208 0 R >>
+/ProcSet [ /PDF /Text ]
>> endobj
-2046 0 obj <<
-/D [2041 0 R /XYZ 56.6929 498.0856 null]
+2552 0 obj <<
+/Length 2176
+/Filter /FlateDecode
+>>
+stream
+xÚÝY[oÛ¸~ϯ0Їã
+“«+»ÙóO“[½øŠvL‡G¡Rö"]g³oX` ÿÈ™ýÔ FÓe6}š–ż3mä1Õ‘G8AŒ€4läݼ°2À\"°<pS.ˆã äHIÂÇë›K+O¹]ÍÖy‘Wõ6­Ë­ºÏæÙö”ÈqVL3;ô9-štXžÄÑ8ŽxäXzf˜H¢€J€à±…×—‡_oï[ôº¨³m‘ÕV“ÉkUgëʾ\”EUnë¼Y¿­Ëã1ur8©‰´[lžFcwúÍÃ@9ιṉ=)$ãX¾±Õॉ¥újÎÊušo§o©*Û>ƒi6Â}ÛL^‹rSåÕÐbpHæ*FŠ%<„wzSÁŒ°
+é :I„ʯ%ßfSu¯!¡ÅT¼YÕœ"üJ
+ß»S$î›ÀRv×þìšÊûúðìh¼céç–ú£¥~–Pż çÓ’Ê>g²6RÝíì„fJ!7bFúáçòjrq}÷p}{Ó~u8ã‚&ŒrìýbYyœÚÇ¥‹š6A×P6¸[Z'ÉË›‰N“vÀÏ„C–mñx“ôÌT9·ÏzéÙ4§)e3âòǦÎK·êܤ¸Ò­v=¹@–ú¨Ó &Ö¥M‚ΙÝnz¾œór»N­PàýÓ(¢ ØÁ™ýn2zÕ¦tvÖ’Ü‘i1{ËøÈg)"Q‰ߟË̬£@çòÉæ"9~ÉëeÙÔv&5Ê/šuVÔÕYà‰H“‰ÏÜ{Oê«{½ä«••om“º¥Ý~ÄáyÚ¬œë¿aLͶ5‘ë‘ \I‚gmÌxŸÕÓ÷F+¤sF@5 UZÌd·ôwTW[máWK@åSçéÊ¥ì´N‡G°ØdîLç¾>ú»É¶yV¡ŸÈã·Æ‡&;e°KÂTa$ã‡3u—ËW­»™ºåÒëF|¸¤bˆ1I/é™Kv M#Jô—üR9|_ß=sï +ghÈËΊù|à!˲r5Ó‚d[Çç|dšnÒÇ•,çí1
+…V(4•L|·VV¬Ú‘ÛÌ¡O:
+-ù†‚%ƒ(è.ÙEAü¿Gÿ?B”`„C¤=Œ‚×x.£¸¯ÊEWqŒ(#"\”wÕ#1ÄSÊÙaýZ®€‚ýv1F‹¤¯¡M ˜ÂZ·½}COn ©@Bvç k %\9 øn"Ò³.:/ Îëô ¹M5ÑýÜ%µ³ÖHŒ¸PÉnÒò=
+cP±Ô•%´t£«~ªÜlÀVæv¨É,¡Õé>SûØ”U•?+ Ê0RÇá’¿gr(‚HÒ6åÆÁC+êž,PÍèAkƳ
+÷´Jíu%ˆ-ŒéÞxö»‘ã1N4ßé(‡”Z̳ì,ÖëD ‹»‹Ý7Ã_GØp2˜œ;X,,šß—k'É‘F #ú²ÝÛÐß¾›0ŸÿÇx Ú÷#HÿrØn[úüÕÛ/p\ß·H6Ú.H0N)m+"’¡êíOY»ºÿ%Ǧendstream
+endobj
+2551 0 obj <<
+/Type /Page
+/Contents 2552 0 R
+/Resources 2550 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 2549 0 R
>> endobj
-686 0 obj <<
-/D [2041 0 R /XYZ 56.6929 457.8644 null]
+2553 0 obj <<
+/D [2551 0 R /XYZ 85.0394 794.5015 null]
>> endobj
-2047 0 obj <<
-/D [2041 0 R /XYZ 56.6929 424.2917 null]
+2554 0 obj <<
+/D [2551 0 R /XYZ 85.0394 752.0294 null]
>> endobj
-2048 0 obj <<
-/D [2041 0 R /XYZ 56.6929 388.1677 null]
+2555 0 obj <<
+/D [2551 0 R /XYZ 85.0394 688.0859 null]
>> endobj
-2049 0 obj <<
-/D [2041 0 R /XYZ 56.6929 320.386 null]
+878 0 obj <<
+/D [2551 0 R /XYZ 85.0394 648.5014 null]
>> endobj
-2050 0 obj <<
-/D [2041 0 R /XYZ 56.6929 234.5807 null]
+2556 0 obj <<
+/D [2551 0 R /XYZ 85.0394 615.2083 null]
>> endobj
-2051 0 obj <<
-/D [2041 0 R /XYZ 56.6929 126.8791 null]
+2557 0 obj <<
+/D [2551 0 R /XYZ 85.0394 579.3639 null]
>> endobj
-2040 0 obj <<
-/Font << /F37 802 0 R /F21 714 0 R /F55 1037 0 R /F22 737 0 R /F39 899 0 R /F41 939 0 R /F53 1029 0 R >>
+2558 0 obj <<
+/D [2551 0 R /XYZ 85.0394 512.4986 null]
+>> endobj
+2559 0 obj <<
+/D [2551 0 R /XYZ 85.0394 427.6096 null]
+>> endobj
+2560 0 obj <<
+/D [2551 0 R /XYZ 85.0394 321.0146 null]
+>> endobj
+2550 0 obj <<
+/Font << /F37 1018 0 R /F21 930 0 R /F22 953 0 R /F39 1151 0 R /F41 1208 0 R /F53 1303 0 R /F55 1311 0 R >>
/ProcSet [ /PDF /Text ]
>> endobj
-2054 0 obj <<
-/Length 2977
-/Filter /FlateDecode
->>
-stream
-xÚÅZmÛ8þ>¿"À}8¨]½ÛLÛÙbÛÙÞvŠ[`w?xeâ«_ÒØî´÷ëÔ‹c;N2@ \ Œe‰¢(Š|HÊ¡ ÿé"‘á©XÄ©ˆ$¡r±*¯ÈâÆÞ^QGz¢pHõêþêåO<^¤Qª˜ZÜo¼’ˆ$ ]ܯÿ®ß¿¿¹{sûû2d’¯¢e( Þ]ß}¼þÅö½_¦,¸~{ó^…à
-ˆR$S$¸»~wófù×ýÏW7÷½8C‘)á(Ëç«?þ"‹5Hþó‰xšÈżˆ¦)[”WBòH
-Î}Oqõáê_=ÃÁ¨™:§!“H2¡!'°ßY=‘ˆHØw ©XôÄ蜞<ê)\á>_þ¯JJ"ÆAÝĬêj“?†›¼ÐSPE#Â_ W>’¯§š —U*"DÆc ?6ډȴ )’x^Ä _•F*‘ÌÑfÍ2ä© Ú­Æ†ÀÉ»}ÖæueG±§Ð¶WM«³µ¥®7“ék½Éº¢}aC3ª"!S/åKÝ®^VY©×/B®X”$`!¥Q*AD¿™™]0¥hw–Xj¢DpF\/CÁe «¦Û/ihûÞn³["°½E­óêÑ:ª£Ýc§ß=N‚6¯:ݸ‰nµ§zÿÉd›Vï'\½ÿâ;· q³]¿·[먫mV=jT.Oƒ¼ml¹YñeÛ ¬ÚzÿÍuuÚ6Pœá3³]Ý4ùƒ·†ñ¡p¥„(§H`î«\ÆE3´”õΙ
-êžÖ
- qlDÐiÕøbÆ|C–
-³è2¤:.=•A—õºP Þ×ú¡{ ýEÇèÂÀq/É×SÍ8F—8R*•c ?h𖺓ÄÆ:Óe]ý½qo(žmZCq¬íøL©
-@@á1`SdG'I!F+
-ùæYÁzªÉFË {Me: rt{Œ‘‚&V
-”`Ó&ºC_×dÚ6×LD*ˆ¨<{l0O&ï}”7¤n̾d¶f2GE¢ãZ-صfÒ­R3ÀEK5ÃUDEÏÆ€õ)6És¹@*Rï×Íé"ŸÀád
-)†\ 0œzÈDì!¡«Ì„¸4â2ö ÊUûõ9‰*‚ØýVû¸[´‡Óìjïm=qáÛ¯§¶É!ÁÐ!/c©žQ±(5꟫¿Âža8àxlÅ,²„ Ö¯‹Ûzwón*ýI•ü8ùz†çåãàÖ@0–ïÍÍ«o‡>¢8ß°qºYíó½îáóçÀ˜P4oPÿÈ›ÕKpÑhûÏgd3§À, r ìTgÀÎS°«.¦™[íºæíÕ@~V²žjF´ÚA"‰h¯]îÓÎALˆ©ˆ§"gn„Ÿßae„SÞⸯõ¨°UdŸ´íÉÖ_²ªµp
-¦z…g k¾+Ñë÷wCrëL²cÍN¯r,dôúÅLö‰6J¹”}B¥ Ù·à“zç)7‘ðºEì7ÚÜÇ€‘BUYæ•vÝ[רºòÁ~awƒ´(¿íÙ9dÑUk;lȇÆêpfN}àì•èXxîÀ5²´·Û“;¦¹[­«2}Æf  †Ñ‡»Â[¿ h›]ÀwñÂ%$.ɸW¸þÜ-›È8–ûÆ‚‡Ý®Oº£ˆ^hœœwÇ!Õiwì©Œ;î.ºã®Þ·ÇÞH¢DÈóry¢¹Æ™‡Ä벉`¿äM««C
-hŸ;½ÏµƒÆÚzù¦ñ –|ñ@u9
-⮃É49À$´û¯ Ð6Ï®ªôJ7M†åˆÅ7èÝ Öä‚w«žX”Ë ”Â[™ý)
-ªð>
-{'„¾cæ<vTæþ‡Óà¡sr>èÍá,¼û{änÌ›
-¼B&bí]ûäg î2<&:õ'.#Ág „ôiÒwÿøéðã.8W0ÝSwÛ³Ô”z¡ps”Ñ©è*w™°xFöÿs ÿendstream
-endobj
-2053 0 obj <<
+2563 0 obj <<
+/Length 2873
+/Filter /FlateDecode
+>>
+stream
+xÚÅZëÛ6ÿ¾…ûpZ VøÒƒ¸Ã›d/Ø¢ÙË5[\¶´2½V#K®Ùäþú›á²dËv‹äЈ)r4Îã73Ôòƒÿù"ŠÃX ½H´
+#Æ£E¾½b‹'X{sÅÍÒ-ÇT/®^üS& êXÄ‹‡õˆW²4勇ÕOÁËóðX°àþæííëë¥ZÆÁÍ»w·÷¯ï~„çˆ0¼½¹ÿáæ;š{w­Epóæöýõ/ß^Ý> òŒeæL¢0¿]ýô [¬@ôo¯X(u-žá…\k±Ø^©H†‘’ÒÏ”Wï¯þ=0­ÚWçt ¢4Œ„ŠA ƒ4ç5ÅÄs J$è…ƒ^S‚ÏiÊS¡¦–O‡#KÇ‹1³£-=ÑÌ–b´eÂÂH²ƒ-¿ï+Òu·14hMóÑ44.×usÍÓÀ<ÙŸº¯V4Ÿù#È}V–4(맧¢zrìj<狪±FhŽÅQgBÁÚneš†è&ÇQ˜îÉÂ#×púOX
+™ª FQ1’§²FÚ’P ž’«0Ž•vB­ËìÈ’:
+E qV.O4#×Xœ±P(­¦‚=\kô ˜L*ÔöW[³­›Ï4×·Ù“¡áÊ<öÎ"Hõ3c2{j1É»ºm‹ÇÒ‘º5zÈÈþNrl¿X‡—±Óíul>¡Ã4M¼¦¾™a‡\ lº&ËO²I/—Æäu³ºèLù´Åg…‘PL¹
+2lâ"+¶YQ•ŸÝúÚ­U€Û¦íè‰
+Ô$xywÿšÞÑ4±2×’¯E˜²†Ìá¶qf¼‘à3½Dàœ@¿­¯yäÞ[Íå ‹N t¨›¬z²u<Ø>~3úY÷]ß7¦4ÔØÀõÈW„—Huº{×9˜ω5”ùËýMÄ—¹ÿÒw\ !`}¡DT
+’C zÁ*‹`ï/—ˆÛìÓ²­óG`Ç@ÆÂxã#ñªù&.
+T‘š
+xS–õóL…ŠIö­è© XªTù“øŽª÷mW¿›Âã$­A'$åÐ^NµpˆÔZÿx¸ý
+:r Y"êxïðÊ)|q « ø(µÈŠ¸ËK3ø á ù‹ŒßÛï-VÞ c¼9…˜‹ó$qˆÉ
+†²­q„¡’u4猋y×ã‘p à\li[šË€Ïdk˜¯7g%7–ý”Eו³AdÍjPÎgäjÛM«€¬ò#Cƒ‰*¨ÂÇ
+³ýp7ÚŠÝÖÉQoDÞ…p<v!
+½¥€T”b*šºõ/[L p……V×úŠ«£ž;°>…Sý¥*kœS¾0OýÙe–PP¥ìÂÇ¡Ê–YÝL™¥Cu¯³äªhLÞa/wXdq åi<b8[dyªé¦YMA’‡ä=ïݜԶ ñ|=„7ŸRè9y60•zÊlMÞ|éªÆ´Hß“„ÃOäõvK<”t9„ÑcßyêªìEäÁcï}4þ£=û änœ+¼LfjŠ=â3ß13'Ë7®ã0âè«”oÚ¨úD…ãTñ†®2á—š[žâ½¬Hÿ¿Å—”òšýâmÌùLñÆcª8M'ÅÛ¨áÕñ¨xK\ñ– œ¹™ÂQ§üÚW¹- ž‹nC#ô¦™O¢iB ÿ¥`ÙÏ`9W î/H¨oÎ9TƒÄ<ß4–ƒ? ÀD±wg÷aŠ.§w,z  ‡"”>ÂLæWjºÄÁª6mõ׎¦Mù,wâ­ÉûQ jïÈ+wG^·î *°Ú¿aIǼÓü3¦WúÍ(‰…Œ%þn‰Îú3‹˜€øŒÂ
+hMfdÿþ½¿Ïendstream
+endobj
+2562 0 obj <<
/Type /Page
-/Contents 2054 0 R
-/Resources 2052 0 R
+/Contents 2563 0 R
+/Resources 2561 0 R
/MediaBox [0 0 595.2756 841.8898]
-/Parent 2056 0 R
+/Parent 2549 0 R
>> endobj
-2055 0 obj <<
-/D [2053 0 R /XYZ 85.0394 794.5015 null]
+2564 0 obj <<
+/D [2562 0 R /XYZ 56.6929 794.5015 null]
>> endobj
-2052 0 obj <<
-/Font << /F37 802 0 R /F21 714 0 R /F55 1037 0 R /F22 737 0 R /F53 1029 0 R /F41 939 0 R /F62 1062 0 R /F63 1065 0 R >>
-/XObject << /Im2 1051 0 R /Im3 1185 0 R >>
+2561 0 obj <<
+/Font << /F37 1018 0 R /F21 930 0 R /F22 953 0 R /F41 1208 0 R /F55 1311 0 R /F53 1303 0 R /F62 1352 0 R /F63 1355 0 R >>
+/XObject << /Im2 1341 0 R /Im3 1500 0 R >>
/ProcSet [ /PDF /Text ]
>> endobj
-2059 0 obj <<
-/Length 2424
+2567 0 obj <<
+/Length 2383
/Filter /FlateDecode
>>
stream
-xÚµYÝsÛ6÷_¡·R3Šâkúä\œœ;‰“Kœ»›iû@KpÌF"]‘²ãÿ¾»XP"%J¹^’ñŒ‰Åb±ØÝßb%&þÄDf¼ôës¦¹Ð“ùêŒO>ÂÜË3‘hfѬOõìúì§ÊN<óFšÉõm—cÜ91¹^üš=cžMÏ®Î__<ŸÎdž+“¿}{qõüò¿Ð׈€„óìõùÕ‡óW4övêevþòâýô÷ë_Î.®·âôE\¡,žýú;Ÿ,@ò_Î8SÞéÉ#t8ÞËÉê,׊é\©ndyöþì_[†½Ù¸tL¹tÌ(c' S\‹ÿe[å¢"Üø¶|2óŠå.÷ÇyÑ:¼R³[1d5s‚iïõdf¬fVônHʉÌk-ñŠœeÒ:9±ȼ´ñŠþƒŽ”ži“ $„5ÚÂ<çÓ™‘Ù»øÿ
-þ‹ìrÛ–ÙËýr†y¸‰å–9í£®&‚¼€ËDýv<ýN+qà§Ë•š<¯áŒ“þ1ãYŸs<¦‘=CRÁew«$sÜÑ1¯ïÊLËÛ¬¾o˺¶ɚ»z³\ÐøM ï¦ i¤LTóºúcSÍ»e6{,Û;jµwôŠÛ‰ eΤ‡6)p¶!š¡˜9(A䉄„úq:S\dE’t~·®ë¶¬>âr°=å™äpþí•Â–•Ý¯ëyh꬧3¡³MUáÒ8Rt3À[2[Ô¡©~hi8TwE5ÔiÂ|CÊö‰†ðÜø]ÕMZÑ<5mX5?COñN hÔ$yÿã˜S xSgœ[™@gýk.áŸQx¾Î¹Hôñ6­Îá7Îe¯ ºÅrYã®qÚ zpx«ì¤Ûƒ©ƒèÄå2| iq[ÓdhæÅ=pfQ
-«.+Úå’í»Fnàw“¾£~ï+pjã!Îvñëë"˜sÎúì„´~À@ÌÑÀÅé3J1‚
-[ª¾?hÝ÷Áœ×*]/8áz_{^²Ü;3éïx WG4"Wߘ¼e¹õ{r½í¦Œ¾/ñîIFÕ[•KfûžŒ{¬¥aNø.x·-PE–ózu¿ ÑŸcÿ~Ì-mY߇ua ‰q@fÍf~GST6_O…ËBÑNE–ø€/ÖóOÚDÔÞ--[–à¥Uâ^‘;ÍòN>0à(
-ïÒLkkw¶ßkŒý±ñi*ym]gUXþ0;J4>‹›rIxýU˜à”Í
-»6ÆY^¬ë{jA§F ¨d· ®t€0aΑDœÏópßRŸ$4>ÛÉ€£õ& ¦¡ò”nÊjq
-’rÐÉÃã1€sAŸ¡l k:Ë1iµ FÚnU=£ ‡ÑF›¡§Œa½M½Y#jçÊ‚«¯J
-P4/ª.àè³Ë«çÔòôYÎOÕÃ…ÍXq…¢ˆuÙ*UXb'±à»«ùÄ%Qb’AuŠ¢úØ Æ"—u] ãvÓnÖ[&ËP4’ÊcHÝ7¨¯2Ñï€Ó=«çÌA0ìÊžÕw‘RB`•NP2óþòåÕù«÷#Ánù–Þ—¨? éx SxÞØ>ç1ì+©ÜǪÀ$ '·…G™Œ
-oÒÊT”©%c²¥ –´†bÌ`âÛ„5ÀÑÏIÒ>(ÆVº.K^W‹ùXÅÀ¢c"Ú‰v(ÚpÓ†bq¶Ö©ðÕr·úTÇkK•®ãŸÞÔ„,ã^ˆÓÛvD#Û¢—Œ[xîö}QGÅÏ$T¢:Ìr‹W˜Aw2µyv\U
-+š§UÕ£:¡ªŽ*©êòêA*e0p}ñîõžÃûÕ;›Ÿ–dK5"Ê@}b¶_Êr·IÀ¹¨«ÓJ‚›Ê~4§
-7øbSŽ,ã[.'D‚±¶®©A•ÈÏ4Û¦ÁEhæëò¦[Su£ð\Rõ‰7À°~Àô‘2•5CŸËýNÚ<ÇW'ƯTÜÀw 0CD{(]ý±ìYJ<>ÀEÏè5Ë1™§ã~"µ§ÏùbUVeÓ‚:êt­ïÂm’½êùuQmŠåˆr…q˜+šcoÔÎåH¡Ô˜Ëð­¥|õ¯“»__s ¯['Ç}œ†yüÁ) …‚ )#‡¤ÛÈÙÿŸäendstream
-endobj
-2058 0 obj <<
+xÚµY[sÛ¸~÷¯à[©™ˆÁý2}r'õN⤉Òvfwh²Ù•H­HÚοï9
+e'¿'4#ÂZ¨Fcoí³üÄëë KÞÖ`R2¶ªç<³öf)6Ê=*ÁBCL¢Ñ ŒË t5›s¡Òe5£$íž^;-*3\™hg•o\©Æ¸Ì¤Ô:RukëöÞ…Áo3FR·ÃœN+·þÓ R;Ò,óm~[®Ëö{x߸å}^•Í_uÚÖaºØÕÛ0Ê×ë0ØÕu‹ÊÀdB¢Gb(A-ˆ£2-ʵ»ó)“º'éÓÒmÛð4T6}Ögë`$ÄzäE®3Æ‹VÞ–Uñ ‘„Á?:á>¡´ÏopÎÃc_·"¨°­aV4ª–WE4®íWÕó`0‹µjßâ¥kÀLUb皺Û-¾ét]nʶ™@¨†Úô[µB?ôòº*oÝú;dI_Á”–à—² ‹7.¯"×ö>oû‘›ðS°+ˆQÑæy7áÜ „ÑHRoÛ²®Ϻ¼uLCÖQ¢{ëB±|Ä,­ƒã~Ãp2›>Þ»j"k¥Êµâå¬å†õ¹]F–A@‡›ƒ™´®ÂìA‡,c5
+“” ó ,0à™µóíÎñ`¹¥™!PhöÂêYºÏšè´)+Œ0¸2Ã'öCYwM >g‹² ªº 3°›jÌŒÇðz¼i`Ò'/,ºuá}çÚ¼¬|Ú"‡ªuœ dß
+Èâ®<»c Ñ@wä1ÙaVc“áɸ†ÿ`_àxZh“óçîöc}kŽÊÁÇ94@ ŸÆ š –m"°0‹çnD' Ã@å7Õá_,o(šŒ™Iì‰&DŽC
+»S 
+'oãJL«0òµ
+žËºjƒ€uX
+|Aܸ4¦?G]Ç­€3i6 ¯]U,',bp쀉žU;Ö³¸i]^œl`œßxf=ÝÀÆT§Ø@ò×oŸÊ „Î3ê¼ÜjBð^iàŽ€ö$¿«½ë—±%Äæäç`‡ömë¨u„¨Ì´HO; 2TùB·SqVOu}³À^ÑL,®¾|<r Æž×d šPeÏ}Ú‚Mµ¯Ë}ûgQ?Vç ê‰Æ"NM&ѱ8»±Ó›¡#÷No\U”Õ]´¾Ç¯ &â³ç͇Òëi-ü¸ŒD]U¸_a• É~X5  pAŸ
+ù/ŸnÞ]¿ÿö徸þts®rÈÁªã-K-ÔA;q7³Ç
+Ê.¡ª¿µ€ò€ªÞu¡àà Ž§8³ög;º̵uËz³]»§ðµ“…k–»ò¶_Sõ³p.\‡1ú#á}ÁÞ”YëÆ\¶ÏŠáO¡XÁâež éÁUÇCY¸¸ÊQ¦xó!ýF‡JØÏŠöe-ôP¤¶áqYlʪlZpGÃúÅ­¢îU¿‘?æU—¯'œK•AȨÆgÖƒ(A-ý™¶û‰z2\<“Dòƒ‚ñîÔ`'n]$ƒJ$zºMÞü6ůÈ
+2€S•^¯Â— ¶9‚ÉÒÛïS½ N]zîK™hÐòé¿
+É#
+àŠ8ïŸÑiÿôDÞ?ùîõ®«‚¢§¶eq¨cgÕˆŽô؇Ÿ>™`3™vÔ(ÑæeqÞO=.Bè7yaG†ýáŸÓž/:ƒcɉ”
+endstream
+endobj
+2566 0 obj <<
/Type /Page
-/Contents 2059 0 R
-/Resources 2057 0 R
+/Contents 2567 0 R
+/Resources 2565 0 R
/MediaBox [0 0 595.2756 841.8898]
-/Parent 2056 0 R
+/Parent 2549 0 R
>> endobj
-2060 0 obj <<
-/D [2058 0 R /XYZ 56.6929 794.5015 null]
+2568 0 obj <<
+/D [2566 0 R /XYZ 85.0394 794.5015 null]
>> endobj
-2061 0 obj <<
-/D [2058 0 R /XYZ 56.6929 243.4864 null]
+2569 0 obj <<
+/D [2566 0 R /XYZ 85.0394 388.8031 null]
>> endobj
-2062 0 obj <<
-/D [2058 0 R /XYZ 56.6929 96.2114 null]
+2570 0 obj <<
+/D [2566 0 R /XYZ 85.0394 246.2919 null]
>> endobj
-2057 0 obj <<
-/Font << /F37 802 0 R /F22 737 0 R /F62 1062 0 R /F41 939 0 R /F21 714 0 R /F55 1037 0 R /F53 1029 0 R /F63 1065 0 R /F39 899 0 R >>
-/XObject << /Im3 1185 0 R /Im2 1051 0 R >>
+2571 0 obj <<
+/D [2566 0 R /XYZ 85.0394 128.907 null]
+>> endobj
+2565 0 obj <<
+/Font << /F37 1018 0 R /F22 953 0 R /F62 1352 0 R /F63 1355 0 R /F41 1208 0 R /F21 930 0 R /F55 1311 0 R /F53 1303 0 R /F39 1151 0 R /F48 1228 0 R >>
+/XObject << /Im2 1341 0 R /Im3 1500 0 R >>
/ProcSet [ /PDF /Text ]
>> endobj
-2065 0 obj <<
-/Length 2296
+2574 0 obj <<
+/Length 1411
/Filter /FlateDecode
>>
stream
-xÚ­YKsܸ¾ëWÌ-£ª/‚äÞdKöjË–\•Š×Š¤4ŒfÈY>¤(•ŸºÁ!)JV*©9àÕh4úñuƒ#~bŒ«X/ÂX³€‹`‘îŽøâÖ> ¢Yy¢ÕêýõÑ»*\Ä,6Ò,®o¼"Æ£H,®³ïË“Ë˳‹Óó¿¯dÀ—ïÙñ*à|ùåäâÛÉgœ»<ŽåòäÓÙ†R+D‚[:×ëo—§'Ç¡^^Ÿÿ¸þýèìºk(ºàÊÊôçÑ÷|‘Á ~?âLÅQ°x„g"Žåbw¤Å­”ŸÙ­þÚ3¬º­sªTÄ‚H†3ºbNAÌŒ’Êé¢Lvyf¯Är@¬à\H8ÁRå&¯‹¶±Ú‘Ëv“ã=dH¦…iG·Kšû9¾.DõøœËmŽœÓúXDË<i‹ªÄ™]•ÑšeôG·Ž²Ú$‚ŽZîäP‹eKSH™æMTÂ,ÏoqžÜLŽu¸‰›'xIÅ UlHþµÇY+Oõ‹¥X¬t ¨Ô,VB°8
-–ÿ¨ººL¶8I2þ£X-ËÜIóm…Ä›ä!Ç™´kZ§èïózW4 hÑ™4’ÅÜÄ?7Z(¹7m³©º-‰q“£MÞâDþÏý¶H‹vû„ã¢D´L4i]ì[ÔˆŒfd8ÑH×  8^Ú¦Mê–¦ü=Ff ~fÅt¤Qü³ì帙¸a&ŒâÅJ(’îãùg€…iÜs°, ‹1‚£_€,"Z ©\˜êh&L{*{껼Mß¹{±´*o§ç‹P³«ŸÐS=—`¤'@D°:ácŒ/³ü6é¶dƺè]W÷AËÉiÙ‹ZR‚©
-"edqR¿.IOõ\”‘º¤ó+Àß‘,óê8ݪȞië¹êˆi‹ÿ#\ŸáÖ“Ï미Oʼn8°À $W?¯DÌ—‘ÔLXhÎŒ6Ѭ&ülVQ‚†ìôÿ—]ðv+É%Fø*Ýäé½ ›F"›ž/ÿ«*óér]fétnûˆøßd³Ì˜?&À•ç—Z úÚLÀìýùÅ)Ú*&“e»¢,š⥪qê*¿Í)m¥ä4_’²ƒð\ÂDLãSË ^ã‰F^sòíú·¯W3<Çîr^¶y]æä°ë§¦Íw >@>©ê¶èv‡c5SÚHb£/¢HãÍ¡Ër(­Ê¦ÛgYê™
-˜Œ$Âʨ÷™b¦8õ 0`¤ ±wúÖ)R\¬±3¤íÚb[´Osjâ“ z*«}S4S°0P˜)ˆn% ‹„Œç°B€à2ÐÐÒ†,Òæ곞j|sŠü¾Ê~øÞiß»Ãο±YUã!Ý=PC/ŠCpîSá÷Í.IýqŸ[uæ¿6yZçíL¹
-|0œž­?\_^Ÿ½˜)ÄÆP2Œû)¬ÃIkíß`÷¥Ÿ ÒÚ¦»Ù-öÑ.|´Cç›vè#ŠþÙåMKj³Ü¦ÙÒ³we)´}¤Pf|f‚Õ ‘×€Ððäc¶š!¹#N
-§>Ë ñ†Ä'`ÿPEJƶ.G•ï0;ã5i;œê=Bž¨“6»Á ­l«¦5–«±UϘû0;2;IV…ÞÁª0 Y1<”á>øìšS}Ï‚ÏN¸«Î}$€
-72úM&62ö¨oy'd…í mÈ ð4ÑPÕdk)Τ0jŒ@6ŒmèòªË>Ä´<\Zj®S¶8íT®ý‡X² þB{v Ô€5öGPhÙ;(tKØŠe‘Û‡)í>¥¸â.—_.N¾œa×Ñ9_‚êv$†ôbÌ€ÏúëÉ‚Úô~2SÍØnÿ‘f5÷Å@Ø>ÕV{|â*”Üû<>²½QÌÄaô&Ó+XçµÃOË» 3²ü¦»£ãªÌÚ3Ð1)ÜNÒcòN3ðªH¦#›ÛªÞѳ\Ipø—
-á†Ü’—½â$½€æM·ëɆwI–O»݌˜ì·…G
-ª\þº“ioF[Þû, 'z Oq¨)›$%lj'Š»2i;BYœs9ÝvFA‹µ›í9ô‚6éÀŠ
-L»SŒ»€2€3Pí[Ü m’ÅX´tÑ'Ø4
-kbgŸƒnÜâvÊ Ž’Ê Ç3'–¯¶½/«G⌞;÷O <fìç­™g3ïÝöþåðo‘™Š"9ÿ!ÏæmÎå…²ŠRMEïÿoy.û
+xÚÅW[oÛ6~÷¯Ð£ T/º>º‰Û%H,v€m‰¶ÕÉT&Éͼ_¿Ã›,ÅJ[l
+yÎáá¹~$‰‡áG¼0BQJS/NbzÙ~‚½-ðÞOˆ•ñß—z»žüòŽÅ^ŠÒˆFÞzÓÓ• œ$Ä[ç§o¡h*ðt9ÿ°¸ô¯oî—ó›»û«åzæ“0ŽÂéüîn±¼¼ú}æÓÃÇxúa¾|˜ßÚÝ,¥ÓùûÅjöy}=Y¬;ãúÌ”eN>~Æ^~\O0bizÏ0Áˆ¤)õö“ d( s”r²šüÖ)ìqõÒÑ€Œ(‹èHD(ñAiÒAHÂEŒ2’Õbaœšß¬n•?Ç´Gìù4BZ§Äïß]@œR<÷˜§´'`QË”ô›…ÊDF¬@_]ðÿª @O1J¾¹ŸíDöGVÉÍ'âþÈ9ûïJŠ—ìZæÙKZù\ÏH2M>ª ¹mBÃ9wÊ' £4ˆ"¹ü©ò½Z^šd¥6gù¾EÓÖ¼­jCºav—™0¤\x9%ˆF°‹‰²"ƒ¢ñ;!Ÿ%=iÙùÃú×Ûû/êåJ¶¢–¢5–¬ŽM+ö™\T²©ê¶8ìOûˆµz†â4Š»Î…ÔbèD“/Õ¡–¼|ª Ùªõj‹ÅI ,AjÜ<¦ÚóFtiÛ>Q›Q¨ÒoFv™Ò|w‡=—¾‰=Ïùci…7U½‹,v M#eõÔÍKLaÅIļ âC6†¤À¯
+±ièâmñUcPºÜ¨‰ËÃÞUoÅH½%dÄŒL‹8¼´VB²Ð ¬Š°,¤p­°-¤òdú\´–‡x
+)íendstream
endobj
-2064 0 obj <<
+2573 0 obj <<
/Type /Page
-/Contents 2065 0 R
-/Resources 2063 0 R
+/Contents 2574 0 R
+/Resources 2572 0 R
/MediaBox [0 0 595.2756 841.8898]
-/Parent 2056 0 R
+/Parent 2549 0 R
>> endobj
-2066 0 obj <<
-/D [2064 0 R /XYZ 85.0394 794.5015 null]
+2575 0 obj <<
+/D [2573 0 R /XYZ 56.6929 794.5015 null]
>> endobj
-2067 0 obj <<
-/D [2064 0 R /XYZ 85.0394 691.7632 null]
+2576 0 obj <<
+/D [2573 0 R /XYZ 56.6929 751.9132 null]
>> endobj
-2068 0 obj <<
-/D [2064 0 R /XYZ 85.0394 587.392 null]
+2577 0 obj <<
+/D [2573 0 R /XYZ 56.6929 674.8216 null]
>> endobj
-2069 0 obj <<
-/D [2064 0 R /XYZ 85.0394 513.3346 null]
+882 0 obj <<
+/D [2573 0 R /XYZ 56.6929 634.4081 null]
>> endobj
-690 0 obj <<
-/D [2064 0 R /XYZ 85.0394 475.0295 null]
+2578 0 obj <<
+/D [2573 0 R /XYZ 56.6929 597.1931 null]
>> endobj
-2070 0 obj <<
-/D [2064 0 R /XYZ 85.0394 438.8551 null]
+2579 0 obj <<
+/D [2573 0 R /XYZ 56.6929 564.5425 null]
>> endobj
-2071 0 obj <<
-/D [2064 0 R /XYZ 85.0394 407.0157 null]
+2580 0 obj <<
+/D [2573 0 R /XYZ 56.6929 496.4842 null]
>> endobj
-2072 0 obj <<
-/D [2064 0 R /XYZ 85.0394 341.9916 null]
+2581 0 obj <<
+/D [2573 0 R /XYZ 56.6929 434.3126 null]
>> endobj
-2073 0 obj <<
-/D [2064 0 R /XYZ 85.0394 270.8991 null]
+2582 0 obj <<
+/D [2573 0 R /XYZ 56.6929 259.4673 null]
>> endobj
-2063 0 obj <<
-/Font << /F37 802 0 R /F21 714 0 R /F22 737 0 R /F41 939 0 R /F48 953 0 R /F39 899 0 R /F53 1029 0 R >>
+2583 0 obj <<
+/D [2573 0 R /XYZ 56.6929 194.3308 null]
+>> endobj
+886 0 obj <<
+/D [2573 0 R /XYZ 56.6929 153.9173 null]
+>> endobj
+2584 0 obj <<
+/D [2573 0 R /XYZ 56.6929 116.8171 null]
+>> endobj
+2585 0 obj <<
+/D [2573 0 R /XYZ 56.6929 84.0518 null]
+>> endobj
+2572 0 obj <<
+/Font << /F37 1018 0 R /F21 930 0 R /F39 1151 0 R /F22 953 0 R /F41 1208 0 R /F53 1303 0 R >>
/ProcSet [ /PDF /Text ]
>> endobj
-2076 0 obj <<
-/Length 3928
+2588 0 obj <<
+/Length 3959
/Filter /FlateDecode
>>
stream
-xÚ¥ÙrÜ6ò]_¡·¥*š
-OðzÇaœF)l‚€E³ÃÇ&èo*4ÅžF:èªã‡êˆ\f™( ~8* ª¦ßÝ^(¥‚o2^nXà—O‡C{ì+A_5åñöÐ×mÃÏÅîº=ÖýÍž·í‘_»º|þ#OÕÿþýÅãVxŽó•#}¥T˜[«é/žX¢" >ÞÔå sy9 6ÕoQ¤¦" ê†_?ûZE1.~iÊŠ'[8Α‡žLÁWðù‘Ë2:÷LGq8ìêòB½ãÉõnÇM/ãÑ¢é™úÖ³¸ÖüŽY†|¾å•®ÚUeÏcæ~†»ÁNz¡=k”?Ϙÿ~¬ˆÀëf<¦÷¼ò´jä­¬6}]ÂQšk¡¯ †gŽg¬*±NƒgÀŒÉÁØFë¦ë `4°Ç
-ïøY¸Ýv¡rÆÑ@ߘsScu˜©4^"Ñe6ÌL<Kwò1-øRµ£å e2°Ý¥/‡+œ9H
-åL Ü™
-N¨†ÁHÈÖ[^¥8Ï(;òFÙ}š–e¡ÖÚ<L‹|Ý4|Ëk¾!¸ǵֿ¨K)^Úm/a,…Ü-2z*|N4!Ôiê(ŠDàTìu‹rû•KÒ㥜‹A©¯Ê)!5“"q¿yò
-)L@±á¯î0;V÷)<ë0LHÔ#Ü!!$ÍŽZz˳CÊŽÓm˳;q¯~žÑ„½¹ S¨L§Üe¯'¦ɉôÄDyºæ¢acäÉ«ä5iéiçr"§u&2÷™$©܇e~ÃÌ‚n³/ÞWÝ‚l&¹1_%[c’‘l'üðƒŠ½©JnÔ°£²I˜gY:ûWÞS±¶3~%ÍÜBÇq 椫h)žpÑw­¤?Xñ;M‚ñL“F.n_lª©¨bŠÎ\ò³êï‰)Q2Ï3@X ¡´¹qê ƒ}ñ©ÞŸö2[ïeº7ߟÌ &JÕƒ(y´®¶­Wrx®”klP¬©£.¡ãÊQ1TÂ6 8 YÀñÜÉÓÚfÓI«å?ÒOq±¦™JP‚Ÿ•è ¿j Âô 
-wjd{oŠ~7gŠ°(â‚¥uå&Óóˆ|××<ÄA•ù&Ð륚 j1¨£\φêúMµlB—ÏYmõ(ùëx¢ù–ëiºÔ‚gV -»4_ÉøSæ¡ÕNá
-¯ã>Ôt³˜«ˆ²‘þÀ+¦` ´e )RÉ/dÈë¶ð}zM7ˆ*8ˆ“›wuÆžÌ/‰seò<Lc«f^y"Kãê:ãó$“1É0SðO ÕlQödYÆñ€—ˆOfTÄ!xK5 ׸ƒóˆ å'•\&óÕOJ÷wØüç ¶*=¯Ã¥zP|ṅ,Ä=‚üNK¶“‚r$>#1l–Ò˜<̬ï¢AºLYÇ[q¥€ûÌ kuÃ…2zzÉæqz-TJúÆÑÂE†!úÄ’çxOª0ßÿV*ŸõïöÀ ú°9÷Ñ……Ü"û°cA⊯=ùêÍ¿óì—×/ã-×ÕBþ¯i nÙ¦_‘
-;åNß±ñ{Oï „”ç±Û/^þö |ƒLÜ®”ÝDÁS¾ZFcu½‡î >‘Pð
-ˆ¤70ZO°ý
-;² \HËÝaq µVî>Î/.+®Œ¸± ¨Û¢^n>…Ú»(éP4™4ž}Ç2ÄeRUøý\]HV×Ê‘÷¾œÂ——¨LܢÏÕ]<Éëq e'Y.áìvجY,vSí>w¡ƒšIqÃ
-endobj
-2075 0 obj <<
+xÚ¥ÙrÛFò]_¡·@Æ8&oŠå$ÞÄŽ×R*»ëø$ e`P
+“Í¿o÷t. eUm©J˜³§§ïî¡8àOœgq)£ÏS£Ã8ñùj{ßÁÜ÷g‚×,Ü¢ÅxÕ·7g/¿Sé¹ M"“ó›Û¬,Œ²LœßƒË÷ï_¿»z󯋅Œ£àÛðbGQðöòÝ/—?ÑØû #ƒËï__CWj•À"¡p]ï®yuy‘êàæõŧ›œ½¾éÑ£."…8ý~öñSt^À þq…Êdñùt¢P#Ï·g:Va¬•r#›³ë³ö
+"5‡ºT ð¾*Û“P³9Ô_„ºÏë¢Ù彨“(–s ÷Ls¥Sâ,ÓœÌÅGäŠÄ'‚8Uª…Ô¡‰’v' Á´åêõõ«oÞß¼ùù]¿gÀ"‚MÀ\·›È:­”c†Å¡:a|AI ’Á¡- leA×ÐH{Xn«ŽÆ®P|«M\½»¦Ñ_Xpp!² üýP¶]K³9C.ÊߢHÖ> ªš¦?|÷Š¤PÉô䜺HF¥Üß—{4! 2ßa"Ç7k{‘ùfÓ<p›k›ƒm¬Êñ誱߂—Úóá»´‹â /
+‹5 ÁÂѾmsï&níH³åƒéógSó9U·F ·m^
+j× c¿dÄ‘á%O.ôÊ1|U'é”ïo­Ìù@ëiÏaž‚p¨jÅÌF‘£VOžA@x;œê$ŸWç]>ƒ%Ïlš¶ó2ëÆJml|JÖŽ• ™«Ð¸
+Æ•Õ#‰zåƒ9KúžS>°W}ÌbAÈ’%úY,N¤qnfß36ÖÀwÉ}k´,ò<Тm"ûGb¨)ÛPQY£4ø0¨˜–Ã¥¥ :uGÖäø]óøŠ÷ló¶C ÃöØZðdõpŠ¾"¨
+
+¹Ù°g
+í¸LÚœSAìÚDD³ `C
+ˆÜðr&ø¹¶I 6™höh2¼Q0õ8ß!³wxAxä;ð€« Pk¼zKƒÕfC+ë²,|rjƒ³Ì
+žk“{»‹°Ö `#oÛfE\®Î…fÊCœì[bY(H,Û¸Œ]rÂÀoÞóÊ¢`“ßÒ
+^&šPƒ•w¨ýå¡Ód¨Øy2)ÆIê4Ê=°<ÅdÄj1NüŒíÌ$À´ÅÁQ€ ób¸9‚we튰‚ë‹l aàQ4³·ìÏB¦a¬Ò™{3¤+¶ƒé
+6úBƒ1“BƒÄT·ùaÓÑ<eزA Dz]Ä™Ërp†¨ÕRgÏ ³=tTüö8­òÕœÓ}éÍç~¥ ‡ËR!ÖÐ4âIÁСJú¼OŽû¢™´Ú÷bdôå4cœ.vãòÚ¨r½¾Ç40IŸœÛ7A–“—½O¾G©P‰4žþFoŠ\ äA Tš4Ó£wŸIA{>ÖiæB.-Ud´RW„ÆÈYËÔØÀç1Æà‚’Ø©Òøõs‚›}lŽ&¨Á‰„Ïk>}™·e¢é`H^«D81V8œ)’fÁ/-ãKP'„HF@ü4ý‚%éðà„(•=ÆEÕ® mÏï8X¨8 ÓLÅS¢.KWvÏ\M6“Ó›dbb:pÞ‚ãŒ
+щ˜£Þÿúú1îÿ´qãendstream
+endobj
+2587 0 obj <<
/Type /Page
-/Contents 2076 0 R
-/Resources 2074 0 R
+/Contents 2588 0 R
+/Resources 2586 0 R
/MediaBox [0 0 595.2756 841.8898]
-/Parent 2056 0 R
+/Parent 2549 0 R
>> endobj
-2077 0 obj <<
-/D [2075 0 R /XYZ 56.6929 794.5015 null]
+2589 0 obj <<
+/D [2587 0 R /XYZ 85.0394 794.5015 null]
>> endobj
-2078 0 obj <<
-/D [2075 0 R /XYZ 56.6929 258.0612 null]
+2590 0 obj <<
+/D [2587 0 R /XYZ 85.0394 749.2922 null]
>> endobj
-2074 0 obj <<
-/Font << /F37 802 0 R /F21 714 0 R /F22 737 0 R /F41 939 0 R /F53 1029 0 R >>
+2591 0 obj <<
+/D [2587 0 R /XYZ 85.0394 666.7399 null]
+>> endobj
+2586 0 obj <<
+/Font << /F37 1018 0 R /F21 930 0 R /F41 1208 0 R /F53 1303 0 R /F22 953 0 R >>
/ProcSet [ /PDF /Text ]
>> endobj
-2081 0 obj <<
-/Length 3216
+2594 0 obj <<
+/Length 3279
/Filter /FlateDecode
>>
stream
-xÚ½]oÜ6òÝ¿Âo]Y–Ÿùè"iâšËÅ.z@šÙ+ÛBvWîJ¶ãþú›á׊ZJë4‡Â€E gÉá|ÏPì”Â;ÕŠPaäii$Q”©ÓëÍ =½…¹·'Ìã,ÒrˆõÓåÉ?‹òÔSðâôòf°–&Tkvz¹ú´8ÿðáÍû×ïþ{¶äŠ.~"gKEéâ×ó÷¿ÿËÁ>œ¾8ûæ^¹ 1Šx]¼¿øíÃëó³R..ßœ}¾üåäÍe$kH:£iúóäÓgzº‚ürB‰0Z>Á %Ì~º9‘J%…õÉÅÉ₃YûÓ+”ÐDi^fxÁù€ŒÂX§¥2¤\X^üÕnk8˜”Åâò®†ãšbñëûó_ßàP-þ ”×땃·7ØßU½ƒà¯èôâßç¸;czQ_·ö¹r“OÍzíf›U½í››ç°”ßsSu}½sÀ®Þ=ºq±¸iw¹M rþÇŸ•œž.#F)nOvßîz‡•pDJÈˆÓ í*û#ÉÅöase‰
-ͽօÓj§dDKÁ<j,ÿû]½uY}ŠûXP×K§\B€r+ôÄCåÚ€^ÂBLZÙ &÷ö4í#Ø?è–£"'’»ÜvžjaeLɺÜ aå6r¿ìØ3 ‡ÕÖÍ##,c».L¬ÜÀ)3â\ßµ]½uЫg³ ·[=ƒ«Úä<Ð’ñ’(S^°#ŽÈïqm‰£–¸¦oÚ-(dzƒ\ÕãF}랛ꋟKEP¹¸n7~îÆñ}ã×whç×îIÄ(PëF´m÷Sâ-ÇMç¤ï‘ˆ~Ƈ8ι±h—]×Ün½çð®=ç
-Q% €Ízˆ!Ö´‹ˆX!ºíq|xâ”"“rž†ˆ•!"ñ -Q:¥â"ò ½ˆ¯ÞU
-!çÍgˆ5m>Ë:¯u¢ªN*¥˜§"beÈ80 ¥Š”k@6±œÌ[,}¨°Œú|‰æ– AŒ ¶àNx¨-úJ­’dòåIÔ€oM—¥¡ %Ó/ÿî}†‚` Á§d/ $«\‘ý
-dÈYês`Õëu]í&NåS/àÂA^"™Ö
-JÇ|À
-ÙDR­m”ñÀÁ…¬mäç’õÖMH¯›Ê‘"Yb% B{¬¤—Yr%8x
-&z¸ ðE*„îå—¿ï-%è-]ûfÚJ†XÓV±pÇÛôæöÀ&XA(‡‚rv㈕Ù99$‡Ü€J–ný[çeðöâb‰Jí%Öz‘Æ <ÊÐÙÈÊGËË»¦K‹y¨7p|¶ÐK–rî­$#k£@JE¬ËÛ㲞Ð-Ôªi
-JÀbŽø¹!ÖŒ–¥f½š¢ÀTN6»wÄÊlžF:
-àÙ“Í ¥ô¼jñû™Rö­Ú§ÎÍpJ©›#îË<
-…¿Œµ!øˆÔaMê$~Z„}ÙNª…ùµ2*#ŽökZ-"R³««µ¯k?¹ñX;$d8…)Žµ†91’lcxW<B/“kR)Á’2Ý/ a”«y>E¬ÌÆiÿË¢:ÝØõ•„Ø·fÄP-ÝD.¬2ΉÆÞ6p|t
- ¼ÂØùiÍdŸz&ÚÈãPõ`¿uY/NM·Šè>+K~ÄŽX3v°lÒµ«wõŸþŒ_Wí¦j¼Ÿqãe®¶…˜ ²¶Î’±2t¥|Æsð› aÑáú¦ÀÙ’™Õâ…O?Ý>ØÁu=„îoc†á
-ü˜ ¯r$’BÈHFh¶½j¬'3i!B•â<<i™U%JYþ­ö_»iú>¶þÞ½wO4»fÛ×»mÝ£î§AÖØÌ<Î%áZ¹bÍDÀ:tŠßmŒ‚Hg‰XjÇA¡žOÉu…ˆ¤4^yíÍCÒ`8_ цֱ‡î­ŠsÖ"ppÄ"$pݨY„|EŒZùÿ˜IhHEeè9m:/~ë+æ,c‘Q/2â0ƒ¢ÐG dˆ5m ë{ ÄáU}EÈáÜ@Y&ÔÊ#V†ô„єɊí—ùþ$T:Ì߆äåK¡x@Ü!Ëröë;á×'½¡ñ ÀÝÃÕÑ8»ÆÝÄPzk¹iwŸ7È%&Ý]µs%"^vâÃÞko²_ãèKõ½æì¦úص7DëØ_=˜BemïÇiü\áˆ-‚ÝêØàˆ]i<=ûª±-hd‚ý
-endobj
-2080 0 obj <<
+xÚ¥Z_sÛ6÷§ÐÛÉ35C
+ÏÓ©êŠýd‘Lœó¼€c¿ ÑfNŸBé+rÉèE2C Ö
+Uk —<åS½®Ð”ó;KuþŸL”ïV)À4*…è5??VÏ«Žê­’8¡:˃ÜÑ”„LêżdÎeL”%
+ã–ìp¾Ñ&nW[ÝÄË»ÂÖǬ]ÓP¦CεÛÖS­Qð
+ªq-µl ¦úaó·;ìw]oó.hÝéD˾§‚Õ䲪q†Æ.[‘X°ð5!Ñ“Ø’^£Jwópù­îk»Txë§jý±'.T>mØÚI
+Š„S$èqOU_Ñt¸"¤{¿RYs­Ok³B…+øíNûñóÄ *A±kN ;M˜º¦zÙº-°þëøí[X‚HN­vü¥¦û|ß1­æO‹UO™æ‚J f¸„QNJÇNH ÏŒïÍ¡çeVÌÑTﵡ‰ê…c3Âþµ/ÿk£ŽjÃrÃÓb5<ûÃz]YÌJ”Y¾³Ÿ2 —70ZMVû/ÜËl͸Ã ž0¤»\89ïh8hcæ„›¢ÞÎÖ wpóƒ°UÙxiRY6=5NÂò=Ù§­«ÂókuÍU]Ç{z6þ:…ÏIÍ+Y|Až¯Õé:éd×òÁÈNsÃéÁ.²ÝvŸû9W.J©C=À½É<î
+×áSX­v4C‰œ)m/Â÷´“PÅéD$>
+·ãNÑ$H*ÉðÜ˹.¼Hò(ÁÞþ·[µ:R2v’Rú"!,LÃèàò¾ ,#)MÑ^Ø@pªôÌÈÐÇÈ­s½s)Õ4®t%®éfÒåëûÛ×wtA°@k/@·U‹Ñîîüúo=Q~½%âziÒåét *„Ä°yvKñžî\Hô
+êp
+˜&å‰#„*Xþ7úmFÖ«ü>–d±òÆ5ÁÅõñs ¤"! ê›@šË(æ»`TdÙEaFQ¡‰S‹–æQTÿõn¢¤¹4ò¬Ÿà–ÛuõL4¾:&Ü;œÃ!ÛÑ&†Ûy8Ë7+\l…³ pŽg¢¬*zR»
+G”R•ýñF§iwMU3Ì…«]Ÿ>Ú×ôŽ"b.H$µÝ8ÅŽs×®d´‡8Óï;A’±ëêÛÓ¶îêë­/%Ï„Èt”ƒo^†‰ë<Lx.— i{9$Ÿ@ƒÄÖ]~YÇ4# `$Vî&]ÒÔg=¸XP¤zôl|KWdîÂ˹¶MýpÆå`±‡A % <ñ?„Š8À,Êeœp¡9¥6ͬm"øÀKχƒNüïµ¾#ŒÉ5Nši\ÙÜwÕo! Ø\HºÜ<4Ê—ì °A1€0»^Ê
+ª•†¯sÆݭ̤ê²ö*äéèé±Æ«‚ÚϹ¡>_¸Ã¯cS*OSR$”üø?!\ÿ~6tdi°ÀåÈ™.3YÔÚ.£ÚáÙÈ‘™¹(‚g:•á$rb#'BØÀÙ<_ªY¬pü«ð+.PfU(¼
+endobj
+2593 0 obj <<
/Type /Page
-/Contents 2081 0 R
-/Resources 2079 0 R
+/Contents 2594 0 R
+/Resources 2592 0 R
/MediaBox [0 0 595.2756 841.8898]
-/Parent 2056 0 R
+/Parent 2597 0 R
>> endobj
-2082 0 obj <<
-/D [2080 0 R /XYZ 85.0394 794.5015 null]
+2595 0 obj <<
+/D [2593 0 R /XYZ 56.6929 794.5015 null]
>> endobj
-2079 0 obj <<
-/Font << /F37 802 0 R /F22 737 0 R /F53 1029 0 R /F21 714 0 R /F41 939 0 R >>
+2596 0 obj <<
+/D [2593 0 R /XYZ 56.6929 507.1706 null]
+>> endobj
+2592 0 obj <<
+/Font << /F37 1018 0 R /F22 953 0 R /F21 930 0 R /F41 1208 0 R /F53 1303 0 R >>
/ProcSet [ /PDF /Text ]
>> endobj
-2085 0 obj <<
-/Length 2191
+2600 0 obj <<
+/Length 2967
/Filter /FlateDecode
>>
stream
-xÚíY_oã8ï§p/ ¶ÑXÿlùå€ì43×ݶÛf=Ì΃+‰1‰Ý‰vzŸþ(QreÇMwïîñP –(š¤ÈŸHÊ¡£þèHÆ$NY:JRAdDåh¹;‹FkXûxFÏÔ3MC®gï>ðd”’4fñh±
-d))EG‹üóøGB#2Ñøæî·Û‹Ù$ãÅ|2eLðx<»½ß\\þs3pFÑøzvóÛì
-i·“”gçw“/‹ŸÎæ‹Ö¬ÐtqcÓ·³Ï_¢Q;øé,"<Urô“ˆÐ4e£Ý™œHÁ¹§lÏîÎ~m«öÕ!W©ˆd"M¹
-ô;Œ’„R`JdJbÎxë0F‡湌ÃyÖhÜ{–ç8È«]V”Ó2Û¹•¦Ùâàór›ÕõG}~pë ##„ô}ÆbE¸€Ð„†™ßr ØÏûY g©èn`–çõdÊ!Ì>Jýdr¼ŸP5Öuu°ƒ¥Æe¤.+ûÌ‘öT45ÇV?èeñG1›]½û yh
-‰P\ÀŒ Æ=–©c/MHÊ™r<çb¦‚Å„šðRJR)™å´.Çá
-yç´'®žð\6ƒéûÃúÈ€ŽD¤§µz¦­GDDȘuµ.&i4>ìKÜåžÖ–5€…à åœ$1Ôï)U„&˜k®
-ûšž€“ÁîSŠua)PÏv[»Å`?[ÈÜvÁæpKtɼJ**”¸
-SÖ®Ë8V-L[“ø¹¬ÛUÜkTp¨µ£Ø# ”¢¬õ¾Az¹Þêƽr\÷ G·î»=­ì¬Ú9 >÷R•!˜ìf_ç²´üÐ`ü«*mÆQñø¦j
-LáÄd9RQ>\•)J$él¹q#”‹WvjœeNÎ>+¶m%òé LzÂQ]õ•gȽÆ-ìÖ¢î–l-sxËÚ4ÛYÝæ̬öçÁw}ÏÐ!Kœ„¤/…ºî¥Û6§ì ’AN±ã—6ûè©«Ê ·;œ Ú/‡þšÅx
-ÔnŸ§v)Äæ‹‘†¶ñÐv©™ú[Í3 w;ü#’‘ âŽk^•þO¡ù°×{ýͱÇÛ˜›˯æ¼tÜøWa9$£Ë÷7³ë¹ƒ]µÓG¡ûÏQÊ‚"óJ÷ܦ¼h
-[ M"ÓM¿…w™Ã¤?Ÿ9Ìråü^~õo)¹Ín¦A'¥{q €´×É°€—Ì:«É܉œãÒ™ô¾-ãK›ÓŽð†³ÑÜKâ6…ª áª~ÂUãŒÚŠ•N¬‚7ñ¤¨6ãÂ>*íi•{U/êÆ)ËÐ Ã
-Î`ãž5>ýYõݸ2Ýv}pÎE‚‹ Œž6ÚÄYQ·AÕBðH¬½ ©Vå2+Ñv3®J¸Wñbé¥bÓ¥¼Û@<4\ëiÝ@µ3u`Oû øÖ”cš*[­išŒ?}x7fD´Ú3$ ? aw¨G«õ'ÒLš±¯´BeCmiý¼dÙ,fµX9{B¡uO*N­ÛŽM¾²' 53)o
-™¾á¬€ë„·<—±ögŒ"!#I“$vƒ•«®¡$AREýG,»…c!ø¥Ë[¿%…ü`œùÀ A‰œþYsö€^,’=9€KKù–AÞbòU?}TàºÉ$=Ž–ë8Ýo”Å¢û¬ÖÓXøo$Ë*oï±þÊðëÙûéõ…Ä™±oxH]ê0×`¸²†vi
-Œk]Ú>ªm›±Æb"é[ß°B®Xó\ÿÇÚ)¬=ì‹G×—vðƉ¸§CÒrǤ÷í9!U7(-ÞhâÍ̪>_ðffofÐÁ›!Ü»…xë× È¯ጧÝ/&wó9Bwvu÷ËÛŸML¤<>Çw`Æ£(y™1ÀF0SB¾ÌLk¬A1 f)§ç/y:o·rþ×Ε; °Aó›Ó@£Ö%ÿõO[/?á ¨MJ±×~Ðo§0vF/,ŽSBD‡{ñíÿT#æôendstream
-endobj
-2084 0 obj <<
+xÚÅZ[oÛ8~ϯÈÛ:@ÍáU¢3h§è St›3@'Š­$Bm)•ä¤Ù_¿çðfI¦ä´ì"@DQÇäá¹~‡$;¥ðÇNµ"Tdò4Í$Q”©ÓÕö„žÞ··'ÌÑ,=ѲOõëåÉ/¿‰ô4#Y“ÓË›ÞXšP­ÙéåúËâüãÇ7^¿ûëlÉ]üJΖŠÒÅç>Ÿ¿·}Ï2¾8ûæ^¹ 1t ]|¸øüñõùY*—oή.?ysØê³Î¨@ž¾|¹¢§kXÁï'”ˆL«ÓGx¡„e?ÝžH%ˆ’BøžÍÉÅɿÀ½¯æ§1QH¥‰â29]
+ItcDF U €eª2’.‚À8‹ ÌS¡À¾OV.U¾-l«-VMÑ×ÏTJ( ?Ç'ž( ïqÂNÓ#V.î‹Uù7¥¼hMÝ]ÞÙV¾ÙØÆî~wþ{Þœ1½(qmŸ×îýòâÝÛe[ÞVÅÚý´-«[?pËûå7%z\q¥ש†¥8É8™À/àe/–ñj(#œSæ~wŸ— šARP!ÍÀ<Á`–Œ‘L)nˆ.= ±Œ°$Íö Äfƒá2-ͪÞnójmW?MS®xà5¯œjƒŽÛ aÿ‹Ê>Q ¦1oSV®û¡Ì-+²Ï.× ,˜y^–Qv%‘`ÅŽ¤n"À\t¢¤åkl':KB|Ó9@ÊR" 5ï%=ª/ñT8ãmÛv`K>ÁB9×óªÈ̃ErF(•l8õçÖéàíÅÅÚi¬v* éÐúÈbš`àw¥³ÿ,¾íʇ|STÝh(´Ž›'ô’ˆ®3ZJ¯¥Û㺞°-´ªI &:%\=¯Á>Õ´•áf³žR¢ ðSXÙìÜ*2ù@B‘LêáäV‡R:YHµøóL©EY­ëÇÖ~á”Rû œ¸-ð »¾±=åã0µíuÊïÜS>Õ^ù@`Ÿj¨üþP¨ü¥ Yì•òaÀš´ E”†ˆïÌ¢ž4‹ìEf!A§*ÉŽ˜EjÆ,<rÓùfkùøbÛcë‚È$K,KüœdZëxÚ_†ðËdQ
+°mtbÆs?è‡ìˆ£‹ J´ÔWN^³)ãUdœ¥PÈp#bPÔ‘ñ ÷ŠTûZëÉ,ȈP©ø$RZdT ‰Rú:ÏŸ÷GŸÀêmÙt~eßÞ}°Ot»²êŠ¦*:´ýaÒƒñwÛ™„I›
+ Í:DŸjÚ!ÕaP|±C0
+*e6PE¸;…z~È®-D$õi­ï’z÷ÀïyŸ¬ïûÞ½wàOÑ#ð›ñlñ RÏÔ³<B>Ã#ØÿÉ%4@Qé÷œ¶»Ö©ßÄŠ9Á\”©g9Hò¿p¨rOTv}ªñT/uK—w9!Œó Ê2¡Žp¨"¬M‘,ñ~ߟ„J‡e>¶!{ñE(î‰nŒ£ÔXuÈ0ûê[Pí£0° ;î­gçlK³ËÚ'éŒ cÏMÝln€%&í]ÞØ1QèÏ"‘¦Ê¯«ÈªtŠ¥z©;‚¸i0Ø)³æ
+v,BE}œ;£iú<_¿Õaƒ#ìJãêaÙ×¥Ù‚F!àf öšžÜvX}@Ãú?}jÁ‰%mä´Â–|>ÉÚ˜u–Y`
+Ú}éE
+ ç-?fáöHËä*ɇ®EB1;åê áLˆcȈ%GSŸHöA ÔGÖòë‡rm‘‹€ [a0Ä&Úðö̊̌ʥ9‘„Ïײmýà6ߥ æ“GGö-Ä*cé
+Ê•¡“ƒSP.£RÿT±SÕµ»ûûMÙ;.ŠE¯ŒNiHÒÝ&&~¨ùPüÈømU»]ÁW~7a=„ˆNÊóÖ~É$ÃÁ=­ërSvOg "øt\a7p¯j>®ô¨f⊧Ç•|½ž*(˜Ÿ„”I&Õ<û*ÂÿR&©ÒÃœ¯ÑtEj!<ªâ*bõøy\iaŸÝVÄ–Ýä†Æ‘Z‹,ÓbÞnXJ2ës6Ø?]iMÄ“蜴9ž2’¦É‘¿O5msÊÂèúñइ"ÖD3;k ŠL;<V—Dà­’Á¼¯Ëö~“?¡w¦‰ÃÐXíkæè:¶EÛæ·ºµxÑ7Ø`
+_í•ÔÖƒ&j ó# ±¿ç/ÃS ì(«U±Õ&%Œ>£CËMîËb
+–†]
+¡ÞÞÞoì-5ËPc?˜ˆn:]h?8òç}.¬Z;§–x0 ëU½Û¬íöúdzx×c/Æq@¡mÑt¶Ï
+¡F‚Xñ'"ðH÷ûJfƒ™N¡$䣒Љƒ¬ = Ü5À°£“Ňº+m(Wþˆ$U>Uà9ùýÎeSôB—ÝÄ2-;®}q駵o¹§É4úŒäc|p7Û ÕÖãÉsK}k—¸»7K£CìáOÆÜÝ•6bemœyÀ¹âÅÂrÕ¿­Õ?Yÿ¶+ÚQÌ ae ­hol6¾7ÀæžØÉÔeVæ½ÊIƒG¼ø¢ëþB¯L–LEW(™ˆóL¡œY"Ƭ+¡‰Òàœ‡¼ÿ•³¥endstream
+endobj
+2599 0 obj <<
/Type /Page
-/Contents 2085 0 R
-/Resources 2083 0 R
+/Contents 2600 0 R
+/Resources 2598 0 R
/MediaBox [0 0 595.2756 841.8898]
-/Parent 2056 0 R
+/Parent 2597 0 R
>> endobj
-2086 0 obj <<
-/D [2084 0 R /XYZ 56.6929 794.5015 null]
+2601 0 obj <<
+/D [2599 0 R /XYZ 85.0394 794.5015 null]
>> endobj
-2087 0 obj <<
-/D [2084 0 R /XYZ 56.6929 553.8035 null]
+2602 0 obj <<
+/D [2599 0 R /XYZ 85.0394 107.2827 null]
>> endobj
-2088 0 obj <<
-/D [2084 0 R /XYZ 56.6929 216.683 null]
+2598 0 obj <<
+/Font << /F37 1018 0 R /F21 930 0 R /F22 953 0 R /F53 1303 0 R /F41 1208 0 R >>
+/ProcSet [ /PDF /Text ]
>> endobj
-2089 0 obj <<
-/D [2084 0 R /XYZ 56.6929 83.2768 null]
+2605 0 obj <<
+/Length 1792
+/Filter /FlateDecode
+>>
+stream
+xÚíX_oÛ6÷§0°Rõçe€›8YÖ&ËjØÐöA‘èX¨,¹¦œ4ß~G¥H²ìtkæ‘<w?ÞɆ~l(<â…N8ôC—ÊÄ0^èðæ.ÌòL*¦I“ëíbpzÁýaHBÏñ†‹eCV@h°á"ù4zK˜KÆ ‚Ž>ÜœŸ'Ž„îhz{;»9¿ú ú‚pP:ºžÞ|œ¾Ç±Ûq茦—³ùøËâ÷ÁlQ«ÓT™Q®uù6øô…Ðü÷%< Äð:”°0t†ë+8.çÕH6˜þ¬6fͧ½&`”8Üszlà²>¸>ñ|mðËxâÁîrµÛ$Q)õ†@ê„1
+á–_‘Å2:‘™¬è"KV…*‰ü­7™$q±Æ‰i[;$,J«„|ì—x.¥•PÓ0ß!Ì#Œ°#+™'zúôÂqv
+Íš6[¹•ß,û÷¤XGin{iü5Ö²eÆÃø3,ûdtqyv3½žYØk¹çºŸE):È÷`¯Æ!øÿm—ª´43b¤m›–i‘#ã½,Reõ­Þò*¹}
+5ÂXÕ²+ÛÌ
+¸½ž›0‰wt'µ34… ӱܫb9ŒžßÌç³3¤SËi,¤ Gp”>ˆº²¬xDF-Õž^EÒÊø0¿º<©×x7ûÛ
+È­7zÙvÎ&ÑÙÆ 6¬·h‚ u‰.eôgWï{jF|Ƽ¡Ë)€¨QiÒäÂ%è)Qj.½ê©,ãÓ-Ä—ì¾ì*À„C ðãÔ\û*´â.>áLxmvªÊ‡&Zê,šÈ¼L—6ã%rí²ÒæP.hfXŒ‡!qXý¨Åš\‡-Vs‹=DÛÓí.?Õš$§
+JH ä«|êªâ0G»—×¥æÚW¦e;‡ù„†Ìmk£0‰:w̵
+…FØ#)}“ÌͽÆM‰úÝÂŒîf$½êª÷-ã|¾°%Nz·¶ÝJ(­Š¨xû´)‹ûm´Y¥±Íq ªC‰§Nì»Ln³Ùºz’‰WQ~ß©¥–»r÷|q®žz2 !N5çîzµãq<.ê÷Sa”§yW›‚hûlqS§Ÿ½Ç ¨®}7Ĭ ¿Æ#ÇñѸ"/šEf Ä2ÍÒòéÐC,¤ýzÚ“hÈŸ~¤}~„vácRw´UJïœyî~EaŸs÷uÿ¡©Ÿendstream
+endobj
+2604 0 obj <<
+/Type /Page
+/Contents 2605 0 R
+/Resources 2603 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 2597 0 R
>> endobj
-2083 0 obj <<
-/Font << /F37 802 0 R /F21 714 0 R /F22 737 0 R /F53 1029 0 R /F41 939 0 R /F48 953 0 R /F14 740 0 R >>
+2606 0 obj <<
+/D [2604 0 R /XYZ 56.6929 794.5015 null]
+>> endobj
+2607 0 obj <<
+/D [2604 0 R /XYZ 56.6929 462.0323 null]
+>> endobj
+2608 0 obj <<
+/D [2604 0 R /XYZ 56.6929 288.682 null]
+>> endobj
+2609 0 obj <<
+/D [2604 0 R /XYZ 56.6929 209.4795 null]
+>> endobj
+890 0 obj <<
+/D [2604 0 R /XYZ 56.6929 155.6441 null]
+>> endobj
+2610 0 obj <<
+/D [2604 0 R /XYZ 56.6929 121.3428 null]
+>> endobj
+2611 0 obj <<
+/D [2604 0 R /XYZ 56.6929 84.4903 null]
+>> endobj
+2603 0 obj <<
+/Font << /F37 1018 0 R /F41 1208 0 R /F22 953 0 R /F21 930 0 R /F48 1228 0 R /F14 956 0 R /F39 1151 0 R >>
/ProcSet [ /PDF /Text ]
>> endobj
-2092 0 obj <<
-/Length 2606
+2614 0 obj <<
+/Length 3314
/Filter /FlateDecode
>>
stream
-xÚ¥YKsÛF¾ëWðª*σ£ly½J­m$§¶ÊÉ"Ae`ЊþývÏÀ€ åªÌ4zzz¾~’Í(üØÌ(BE*gI*‰¢LÍ–»+:ÛÀÚ§+æih1¤zÿtõî_"™¥$Õ\ÏžÖ^†PcØìiõu~óððñþöî× ®èü=¹^(JçŸoî¿ÜüÇÍ=\§|~óéã#¼J“J b é4ÿvûáúϧ_®>>uâ EfT ,]}ý“ÎV ù/W”ˆÔ¨Ù ¼PÂÒ”ÏvWR ¢¤a¦¼z¼úoÇp°j?R†(Ó p6yS¥x¤•-¸°JxÿåÓ#ˆù@at
- išpKõ´ÍA Œ§k6¼ûä^¾å¯8`ó¢q‡kfæùêX­²ª-ýbÓÖ~Þ•{¶Àê¥vã&ßg‡¬õ›üA)/sXn@×R(Ø>ìàžlž¹×e]5ù_ǼZæn¾^»…ª9îWž!››¢Úø]á$p\< SÃÂíã“»ò²x>d‡W÷²Éí h7X^÷m½9dûm±tSõ>Ñ äg7‘U+7ØežÏr›U›Ü³ª<ïc{tzqïn\æY“ñÝÀõI"¤æþJ$'Z'Æ]@ñzÁ(@öP­–áPB‘„ä>Ûågî6%‰P–È~l%øƒóÄ*üÐŽšüð=÷J
-#u7¦eêÓ_\8©&Nc}ž¹ù¢i_KËÊŒU`çlR+t64½ÛÀ'6äÔMëy„•ŽÞƒ^'èÁÿÔ ¿oö˜™£üp›²Œ6j¦2ðÆÁͽË8;‡€ t•û´swl<åsp/€óà[ž}ιÇTì7 ¤šÍ„[¢&üãØ8.†,] Ù„”Ê´ßÙÇ~'jU¿øâ ­G
-†ËSÂèä²´rsx–4¤jî¾2猻W¶°Â*lsì‚9¬ùºÌ8 Å|•·ùaçB Loë7ïÖ-£6[¶~rëÉB!®™.ánüâB5.wVêLÙ#BQ\mjK7¯Ám},ýâ¡y©jq‰Ó¯6gz<©ò}ÉÁƒ™œ¹\— ©BQ~Z—tT¸oWŒ¨¡ŸdĤJœ-F†2Ø]sš^±£š1ΣѦ"!¿4ùDâÍ)$ Z](™"Ö`7¨P‡d6ê±]¹ýá¹ÌÝ2rîÅS:_–ðð 8OÏ«Œ, Õ
-#R'£Ê!ÿ»hڳdžCù†Á ©Î\Ge ®yÓûöºÈÜ# ªŽË¢uT§²Å&$4a,Ibá†=¸ŽhËÎâ\O# …\’B¹EÇ{»°}Óƾ>Ãá.k—ÛÜ”’B4oó/xSÿ—Ä€-`eá®]ƒú™Jã[ݾ0½ÛÆ%%§9ºaD'o”Ë ÄDô¶œP… $Ë[<¸Q×f0îo;uoYØÒÞœH!‹2ƒ®ÎbWû,41`n[ÛZÏp_ÛI¬£p*üa²`”&GïÉÑÿeÿÛÑå8Q/gx ƒÔèLËO@]&Å*„¢@‹¤7ùqCU ®jPJ¢«:kÏ©")wÝóæ< :oÍÈóþÍèzã‘)sl#ª‹BšS¡¢¨É¡zä:–ê1¯&»u!¿µ--›ÿv}ûØ7𔈤ëÚôTñ}i"iðÐ}ЀÁ6]í(ýÉ‹àAwæ_©¨W€Ûú¿å@›g/¬\ð7’äžæüµz{«¿7KÁYRp–6 $'›E×E!-6ép³Uß-;|®ƒý•õf¥9÷O5$ÌøÁ„,´+Œÿñ¿Øý¿ôë=çÏ% gfƒPx0Æ“±èÝÿݧ²ÿÌdòyendstream
+xÚ­]sã6î=¿ÂoufÖ\~K|Lw·½tn·{MÚ¹™^[Ž5kK®%'—
+#g™‘DQ¦fËÝ=ÂÜWÌã,Ò"Æúþþêí"›b4׳ûuD+'4ÏÙì~õûüæóçŸÞßþûzÁO®ŠÒùÇ›O¿ÞüÓÁ>_>¿ùñÃ<ÊÜH@bñ4ÿòéý»ë?îºúpß³³Ì¨@^þ¼úý:[ç?]Q"L®fÏð@ 3†ÏvWR ¢¤²½º»úWO0šµ¯N‰@‰œ¨œg2àlÆ1JñDÊ-¸°B¸{©›}[µã­hàG
+ä;÷ÂþPÐ㹟vƒæigÛ#¬rxñäÖN"™$\Pâî>§pÅÁ¡¢y[ÎU¯Ã­{ràG/žŠj[<lýãÀÿ»:xX¼2­ä,#Fðü¢ÈaŒ‰^Éw»c]-‹UQdÊ G–S‘i¯Ðò
+mÇM?*ÜÏý»Ï,§.—]uÍæM R—4ƒ7ëUU?:ÌA4öõ#¬Tw–‰•W=Ïd"è 
+r¾ª«®ØâðT=ÖEwtziURŠùmí0´ky<8Œºs3À}FùÛ8žkùªKªƒ@c¯Y©!AËQ˜« 2‚cz?huUö%ÈqûâF±–™Dxè¼áj"s-RÃ-¶ÍD¸ÒZXkÃß|¼y·øø^ኆ͟7ÕrãfŽméq
+÷ÓnœâÚö¹\ºçÎ=£?Äß²$ÊÚ¢Jë"àt
+AGšNLK3¿ßŽ"'eïj«ØÑFîïn\´ÝËÖ’ÊÇ"°°5z
+ѧVò¥„4XÈUHB
+{å±pµrû>ªç²tHÈùé`úWXä9=­f„0²$\Qy.SEúxÜvÕ>„UÝvE½,Û8Øðs{Ôÿ®l‚éÛ­³4Þ®³·»umkï¤{_ÇF~ûùIŽ"
+ ;“Ó&
+ª¡\ŠËüõX &
+ª5¡Ô(ápZA1#РógÒî„®Î
+«G–(Öwp¡¾Æ
+Éõˆ±»²ž,Ø…(×VµlÜ—îS™ÈúÂÍ€•žš&’?=\‘Jغ«™ï< ^õw}9z¢\€Ë¾ñ¯Ã­wöx5'
+«à—7ºp¼Ëïoã% 8N
+Žóâ’ibÉää(„ɹI—üPÅS°Ì‡&Xä¶y|„dä¼'Z õŠ"¬ BXV/Ó:.Ÿ7Q©aLÂÅœñ„¯o*ÕôO71b BªÓM¸&Mjƒ†äšñË‚ë±&$—œ¥ØP骿ÚÃӡǃ>K»•¤IÕ…ž…x‘ õ÷I³§8!Í$ƒè$£\L‰ó$ˆ'Êèo¯YïF8uí
+‡oš)‰Q`¬\X \­#_­æ;ˆïŠG¿âS±­Výu­üMƒMÁå²Ä»y!¸ ‹
+aÑD¿Ú(Â4çç[qȘEþ.Gmrñ͇ÝS\Ä$O[Á]§y¦†•Ï6i€›³Q“ÜF}‚§}¹¬PãËÕ›©#z¹¯è0Ê!\rÑÒF²R¼1š/.±tå6j+ëøcóK„ÇxüøëÂKʆ•&>ÚÆÇ€K܇ҵĀFeo|—1‡€BÂP—0H—廡2ŠùUóKŸ~„¦oÙöNOMß!ÈCÏ)mžõÙüÂeÛØM °ñ¹¿QQ¯jèÄzžSmdÔ¶ÅõüScsdjúžušífÂÂlâ:„®¨ì‚07©pv°c’(˜ªœ
+VÊÓ# ¢;\ƒnÔ{€l²¾øòUéÞOͱ›hè§zâvi{;~fSn÷¾3èî’Éö8ipá4O»<ÿ¼ýx{o¿¿Ã}ÇçÿýF&Ú¯"ÅjùRvÉç}¯`ÜíL $NŒGéP>™)kbxßá;óiŒÁÅèÓÆXè‹pð´&g,Õþû`wXX4΋ÂoômÅÈú`ø}.< ó€¨ƒ€àÌ`&ñNܤQ<;×̱¤3Q4W"L¥/…x‚ÀÕ«ðÛ0ûö
+endobj
+2613 0 obj <<
+/Type /Page
+/Contents 2614 0 R
+/Resources 2612 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 2597 0 R
+>> endobj
+2615 0 obj <<
+/D [2613 0 R /XYZ 85.0394 794.5015 null]
+>> endobj
+2616 0 obj <<
+/D [2613 0 R /XYZ 85.0394 749.4437 null]
+>> endobj
+2617 0 obj <<
+/D [2613 0 R /XYZ 85.0394 680.7174 null]
+>> endobj
+2618 0 obj <<
+/D [2613 0 R /XYZ 85.0394 501.4297 null]
+>> endobj
+2619 0 obj <<
+/D [2613 0 R /XYZ 85.0394 100.9714 null]
+>> endobj
+2612 0 obj <<
+/Font << /F37 1018 0 R /F21 930 0 R /F41 1208 0 R /F53 1303 0 R /F22 953 0 R /F55 1311 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+2622 0 obj <<
+/Length 2462
+/Filter /FlateDecode
+>>
+stream
+xÚ¥Y_sÛ8ϧðÌ=œ³[³ü#RdßÒ4ÝËÎnÚkÒ™›ÙÝÅVbÍÊRÎ’“Í·_€ eYfšÞÜt¦¦@ü
+;o·ô¹)»®¸/;úZ¶»zEÃÛ2ê²ð+ÊíižÍƒ¤˜ ÁœÖwå³…oiÚíâ‚Vžýrý)pUfp›T@Döm³Z²eÛÜýÎ5×ðŸxCËqb÷eƒsv4×›r•$&E¤3‡‡•Œsð%ÇûË«´Ð…“¬6USuý¶è£Ý¾”w%™¥YKýZ4;°òñ‰…±Lc‚ø¤ ™æÈäÈ”™s§_oþõéËëV¼lúrÛ”=irýÜõå&øô¼mºvÛW»Í~ߌ©ÌD×eŠI®ö@#¶ÌŽÙ2Ál–çáƒÏR‘w¡4s8À%Wàœ XLŽ_9—IÁ“ЖÖF
+{%Xn´æ̘̥`*@[©1ŒÒ† $ ºz/ÂCøÀ$Â× ?‚_<Á‡‹ëó/—Ÿo.?]½`ñüRÏ™t<ZLó~]â anœ æö w
+WBF/57‘Jù GÍnsëãep¨ßì&R"€4P†éùÚ°Áå]êÝ yéŠq3<œ}ÓÒ|â¦^JêÊð&êÊgêº#Ãaæð$Jà8º L!_¡¼¦ëË"|x‹Ç&Þï! ctŒ¿}«ùEáÝv¸¹î "ã°Q¾”`ÊâÏ’FDÑX¿¡j@ ÷¯4@@»ûm„ïoʘš»ÛWKˆÕ̉Á¤ñ òP$öÂC|W½àŠY=ÜÚ ðØ9¾4ÈܤÉ'•Cy–ö$ñï,ÁS£²wáI<…aHÕeüüª .Wd™Äˆæߨ#©?rA9Æ¿L%ž³ùðýÿlÿ§Á,gÊZ™þÛ–Ì5ÞÄLT
+­'Œ9R=þ©ìX÷¿òzWqendstream
endobj
-2091 0 obj <<
+2621 0 obj <<
/Type /Page
-/Contents 2092 0 R
-/Resources 2090 0 R
+/Contents 2622 0 R
+/Resources 2620 0 R
/MediaBox [0 0 595.2756 841.8898]
-/Parent 2100 0 R
+/Parent 2597 0 R
>> endobj
-2093 0 obj <<
-/D [2091 0 R /XYZ 85.0394 794.5015 null]
+2623 0 obj <<
+/D [2621 0 R /XYZ 56.6929 794.5015 null]
>> endobj
-2094 0 obj <<
-/D [2091 0 R /XYZ 85.0394 752.0715 null]
+2624 0 obj <<
+/D [2621 0 R /XYZ 56.6929 713.9465 null]
>> endobj
-694 0 obj <<
-/D [2091 0 R /XYZ 85.0394 700.8318 null]
+2625 0 obj <<
+/D [2621 0 R /XYZ 56.6929 649.6644 null]
>> endobj
-2095 0 obj <<
-/D [2091 0 R /XYZ 85.0394 667.6704 null]
+894 0 obj <<
+/D [2621 0 R /XYZ 56.6929 609.8446 null]
>> endobj
-2096 0 obj <<
-/D [2091 0 R /XYZ 85.0394 631.9578 null]
+2626 0 obj <<
+/D [2621 0 R /XYZ 56.6929 576.4481 null]
>> endobj
-2097 0 obj <<
-/D [2091 0 R /XYZ 85.0394 565.5242 null]
+2627 0 obj <<
+/D [2621 0 R /XYZ 56.6929 540.5004 null]
>> endobj
-2098 0 obj <<
-/D [2091 0 R /XYZ 85.0394 493.0222 null]
+2628 0 obj <<
+/D [2621 0 R /XYZ 56.6929 473.2964 null]
>> endobj
-2099 0 obj <<
-/D [2091 0 R /XYZ 85.0394 308.5213 null]
+2629 0 obj <<
+/D [2621 0 R /XYZ 56.6929 411.9792 null]
>> endobj
-2090 0 obj <<
-/Font << /F37 802 0 R /F21 714 0 R /F22 737 0 R /F41 939 0 R /F53 1029 0 R /F55 1037 0 R >>
+2620 0 obj <<
+/Font << /F37 1018 0 R /F53 1303 0 R /F22 953 0 R /F21 930 0 R /F39 1151 0 R /F48 1228 0 R /F41 1208 0 R >>
/ProcSet [ /PDF /Text ]
>> endobj
-2103 0 obj <<
-/Length 2134
+2632 0 obj <<
+/Length 2068
/Filter /FlateDecode
>>
stream
-xÚ­Y_oÛ6ϧ0°e‹’"%±oišnÚ´k\`ÀºÅ–ca²”Yr2ûÝñHY²™fÅŠ5u<ïïwŠ˜pø'&:a‰‘f’Å4z2_ŸðÉ=ìý|"ÏÔ3M‡\¯g'çoãtb˜Id2™-²2ƳLLf‹?¢×LHvúçì×ó·:0K`\ÂÈõéæÍ%»üpó–8Gbeš²TÄƱ^|üxuóæú÷Ó©ÔÄŸN5çÑû‹›ÏïˆöñÔÈèâç«[vr5ë +xŒVü}òÇŸ|²
-`Jg&S¢w±!{.ôÈtçü«œB°XÁaä´¿ŠÝ¡3²„锧“á/yCg–…}1õM)–¦µIÆ&”‹Cõà-5ÖïÈm=WÀorè ž0e1>õs[@Æ$:êVnáüt«Z/¹~Þ—"5,N¾£/½À€/‡Š‰L²¼ræ¡ rMâ‹h¹9YԬ̟7õÎåýv“weS)Uªa!áxaÒçÇ)Ë Ò¾›c¼Àáb©Ù7;f½m;2ûΧDÝ<9OÜíð7‰ê|],ˆôTv«½Aúd*Ó˜¥™Á(
-f´–Vp ï <é(¯î› ¼¶võ‚m1·Q):÷ÜmÊúžÖ%j UÔXŽE±!ò²q \G!­ˆ°.Ú6¿w'>æU¹ð…ç®q'lçó¢X
-󜋧¾»~=³­8þ7»þps0rZjfæ_´Çƒê¢)ÚƒÄÜ>›)œ­UÕçu¨Dl. ·]Xa•…(Ntß>ª
-ƒÃO mWVe·;BD>ýk ^W.ÿ©˜g¾òàxiGáw¾Ý¸êª‘,
-ÃïSî#æ6åÂ
-ñp;#|’fÜjÀ33,r2H¬Ö†¥\'_ëòú¦“ î>n¾C—G§C‰öâi†Í i¶?øk]ž Ô˜¼m©ËBGzÃ?}ð¯:qÄÛâqŠEδ+ Öça¹w>5«ÂEisšª(XiÜ—XJç]]Ñ»ïn?¬Û–_¸æþgl`cŠ€ê¸— öl³$E¤3Móf˜M0²pÎ}}ì Î8KpH‡8
-¤=ŽÆ2Zté0\)Í‘ÉŒñêâóì—Ÿ^öâuÝ›ÚãÍí®…þÇEõZ
-¼r>nmiª´|UY¡ã?×å?Çâ~øÒŽ`¨éKÛ¡íþT­·vjTó†¡ ‘a`­§AKg½ŒoËêNŠ¯2ûAWÙ µ%j·¢º}V½¢×óšøö£øëŒ6}‘C>¨8Eî¿+èÑ' ÛÉ{çôC_†|칯ý8fÅqèšà=²ÿï¿ìÿF¢RˆB&Ãß¡ejïƒÄ+…V ™©.8¶«2 û¿’Zendstream
-endobj
-2102 0 obj <<
+xÚ­X[sÛ¶~ׯÐø¥ôœÅ•
+BÔ]eÕr³¿oóºÂ…ƒP?]Õ› }¨ÓŠ0Ù(~S¥Ë©3D˜Ú%‚ma¤e´Ün6§Ì€
+m±ÇźÂ¾º<{º¸|¦ÐQÜ*kÁÇžÊÁ.ã¨ÙÞß×›6Ká
+Ù‰*ól*ý¦‚‹#T¹Ë`æèºØ¢ë4í\ï:ø¸Ö“ÀÞ‡}laë+4±Ä•Î(æÕý¶%†ñXeãOò¥„q`LkW?äªnqïfß# o7Âu«6h¾mÑ!‚$°|ªŽAR&o“¼HúíÊ@™Tûëû.”&Ôƒ×Y`l»Âpþæìòú›óÀœ-¥Äg˜§&å}·KbGœy•5GÌY²\Ü׫¼r%C(Âö8ý»m'.,EL¬pÇð-Çó¯}‰ƒ½b@@xÇt¢GnI³U²-ÚE“mÞBIZ0üE½LŠuÝ´§*h÷‰Ë,(´³æÈ¿˜Üé¯^˜dÄjE„}ãá¶Ñšõø`Àÿok¨Óípþù½¹ õ;9)IÓMÖ4YSº GJ(ñ‡ýsK¼JñÐzp
+L»¼(P®‡[°UHN$"¶G´y¯Uà¥#ÿL¡¡àšPø1˜0äÂ6”…‰
+Ö ~6ÈG¢
+endobj
+2631 0 obj <<
/Type /Page
-/Contents 2103 0 R
-/Resources 2101 0 R
+/Contents 2632 0 R
+/Resources 2630 0 R
/MediaBox [0 0 595.2756 841.8898]
-/Parent 2100 0 R
+/Parent 2597 0 R
>> endobj
-2104 0 obj <<
-/D [2102 0 R /XYZ 56.6929 794.5015 null]
+2633 0 obj <<
+/D [2631 0 R /XYZ 85.0394 794.5015 null]
>> endobj
-2105 0 obj <<
-/D [2102 0 R /XYZ 56.6929 605.5421 null]
+2634 0 obj <<
+/D [2631 0 R /XYZ 85.0394 627.5418 null]
>> endobj
-2106 0 obj <<
-/D [2102 0 R /XYZ 56.6929 504.7499 null]
+2630 0 obj <<
+/Font << /F37 1018 0 R /F53 1303 0 R /F22 953 0 R /F41 1208 0 R /F21 930 0 R /F48 1228 0 R >>
+/ProcSet [ /PDF /Text ]
>> endobj
-2107 0 obj <<
-/D [2102 0 R /XYZ 56.6929 441.2539 null]
+2637 0 obj <<
+/Length 2488
+/Filter /FlateDecode
+>>
+stream
+xÚ¥Y[oÛÆ~÷¯Ð£DÛ½_pžÜØÍqÑØ9¶sp€$2E[D%R)»î¯?³W‘ÒÊrQ×ËÑììÌì7ß,ÉÃ?2ICÍHŽ&bT¬Îðè Þ}:#Af…¦}©ŸïÏ~ú…©‘AFR9ºìéÒkMF÷óo㟑h*ðøöúâãôãÍõ/Ÿ.¯'Sb¸âãó/_.¯/®þ7™RA$1>¿þzþ›Ÿû21t|þéònòãþ׳ËûdVßt‚™µé³o?ðh;øõ #f´½ÀcèhuÆC‚3g–gwgÿI
+{oÝO³® Q&iÆ”ŒAF:p†0H2Êœ3®Ï?_ú]Ý]ÞN`ûÿ…‡ûÛºåêÓ×Ûs»Ûû«›k»[ÐI{þÅ#E˜3í”Ý/ÊÉ”9®g+7ã¶Ü<—?»Ú¶=„·ESǘ>m7¢ÇåÜ¿íÿœE¹î¼ä¦ž~~S—EW5uÄê¹—‰¿óÊŠæ©®þ
+u‹°âïå«Ÿi×eQÙÅãªUm7h·ä}æ“ÅþÐ훓޾! “„­Œµ YÓ Q4HÚõ–åXšñ¶­ê'»6‹æ1»¹Î™ß,[?Óv³®\•uçÿôV˜ù!tXÄ:~Ôƒ”J¢Üܘñ]YîÙÑö<ÌÆM½{Yü¥:ݬù‡‹O9HQª¢©ûEo‹6ñ`‹îéŒqgðêúÂŒœÏWU]µÝfÖ5?u[>–>îu~öyVogK?~Œró²›UËëBÏb ÄšuwNÆùow7§“ßfÁw,°†ÿÈÿK;7µ‘x*ëýw+ØqÑÌK;Oü¼[ƒ™¾o•BBÁØûöŸyâp DjD¥”)2^™2.f€Mÿ÷Ííi·\Õ]¹©ËÛ»×BÝ„k6]µ]íÖå°‚ŒÑàq#uBm€hŒ‡^g–q¸0Í¢OÞ0”&*Å+iqö|‡ÌÜÅÍ^ØH•à媉ÙÙ4Ë÷$Ñkݬ۪Ý/ ÎŒ–lÄÁW\é²0
+Àþ#°!œ´Óà@p6#æG¡ÃKpè·éìG=øMÁº½4kNx>i-²B'HsF‚\ÒYdt‚“´b§ò±Zþ •‹4ú=£\ÌÆwÊë”ïQ¾>iïò6£2@{Ìöõm2ú¦Ì@m§œ±pÕ¬Yñż“úö¤¹³ù|S¶íû=ÐTY,6MÓÍ«MÎN ?"¥KRº=©t t!çV(µS—)B)éáỸ¼ûx{õ¥G^H¨2xpˆ’!ŠiL©€¥E2mz<&"Lúb$l:4p†6´G$2KS€AÅz%›ªñUVž…Õ,¥²OpáÜfaéY²ñ¹¬+_fíôÒ3Øû~ié“}¾lªnêpu
+€ˆ˜ær˜£Ž¶P#ð‡ÀqÖ÷#Å©#¯Ùq:jD ÆÒ¾¯jíº©çÖ„Œ;ÁSTsš‰0ƒ¸T1ííjmiBèDrÔ ðJÔ“ˆLëmÎ’5 'Îhú²&)°¥'¯^ëÌE>>ÜÖKÃÍ0>ç»È._'@ÏÆ–rp°Ç†žó4\ø¤‰ÍD·aî¥ê~6…wè¡Ñ\«¦³œ[00B oÖáPpÏÑ­îÖ1˜Ø®ýÄ,ã*¥‘Á„ô3)aã¾Ç²½zŸHVÿsS̓ ‹°íº,Ôç‡GÌ
+e–œ,*({ƒ%/
+à”’’‘§ˆ“|Gê
+ìkÓ/
+¨Wu¹ôoÒ,œ± Cøà˜E΄ÃõŒ\.›—|•g8#7âd$61\®ì˶µ]² >jƨ{™Wås
+ÈHtŒÜ¬eL½MnûRÇÉm’r.·lbèrmRÀ{—l}Ó¤g„½m[’Ê7Œ20IBÕк»D·lºs> À õT`Ô<‚>¨ævÎlA&ª®µÔ€9~öƒìdŸÝKYI´ºdƒ Ô˜Sñ/ê”Ùc :uF†¼fÇHì7…vBõÑhK8º7c½“9é ãâ\äâl¿×‘ÌÍç ÎÐŒ) ¼ä «’ÌYÃ3Ëúv} µ_£ò8ýS \6û:ѱÔì÷*œãﯱÛM-©»¥èÑ¢Ý/ÓuÙðÔkh¬ÞÑöp «þWÜgZhsí=UƵ85ÆÿøîîS5·wiúHC
+W£¬áDêÃ\ {mÿ?»³· endstream
+endobj
+2636 0 obj <<
+/Type /Page
+/Contents 2637 0 R
+/Resources 2635 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 2647 0 R
>> endobj
-698 0 obj <<
-/D [2102 0 R /XYZ 56.6929 401.9804 null]
+2638 0 obj <<
+/D [2636 0 R /XYZ 56.6929 794.5015 null]
>> endobj
-2108 0 obj <<
-/D [2102 0 R /XYZ 56.6929 368.8669 null]
+2639 0 obj <<
+/D [2636 0 R /XYZ 56.6929 752.3759 null]
>> endobj
-2109 0 obj <<
-/D [2102 0 R /XYZ 56.6929 333.1161 null]
+2640 0 obj <<
+/D [2636 0 R /XYZ 56.6929 668.0781 null]
>> endobj
-2110 0 obj <<
-/D [2102 0 R /XYZ 56.6929 266.6983 null]
+2641 0 obj <<
+/D [2636 0 R /XYZ 56.6929 607.6906 null]
>> endobj
-2111 0 obj <<
-/D [2102 0 R /XYZ 56.6929 206.1673 null]
+898 0 obj <<
+/D [2636 0 R /XYZ 56.6929 570.577 null]
>> endobj
-2101 0 obj <<
-/Font << /F37 802 0 R /F53 1029 0 R /F21 714 0 R /F55 1037 0 R /F22 737 0 R /F41 939 0 R /F39 899 0 R /F48 953 0 R >>
+2642 0 obj <<
+/D [2636 0 R /XYZ 56.6929 534.8112 null]
+>> endobj
+2643 0 obj <<
+/D [2636 0 R /XYZ 56.6929 503.6098 null]
+>> endobj
+2644 0 obj <<
+/D [2636 0 R /XYZ 56.6929 440.3004 null]
+>> endobj
+2645 0 obj <<
+/D [2636 0 R /XYZ 56.6929 370.9227 null]
+>> endobj
+2646 0 obj <<
+/D [2636 0 R /XYZ 56.6929 274.6697 null]
+>> endobj
+2635 0 obj <<
+/Font << /F37 1018 0 R /F21 930 0 R /F22 953 0 R /F41 1208 0 R /F39 1151 0 R /F53 1303 0 R /F55 1311 0 R >>
/ProcSet [ /PDF /Text ]
>> endobj
-2114 0 obj <<
-/Length 2593
+2650 0 obj <<
+/Length 2259
/Filter /FlateDecode
>>
stream
-xÚ¥]sÛ6òÝ¿B“—ÊsŠo‚—郓8©ÓÆqßM¦½>ÐeñB‘®HYãtúßo P¤LÛÉÜèÀØ]ì÷BbÂá'&Î0®R=IRÍ f2_ñÉ5¬½=aÏ,nšõw½¼<úþJ&)K­´“Ëe—cÜ91¹\ü>=¹¸8=}öéx& Ÿ¾dÇ3ÃùôýÉù¿N~&ØÅq*§'oO?ÂTêÄÂ&!Ùñ—ï¾cT¿JS–hƒl!æ_Ï_¿b¯>œ¿Á­G§—¿ý; ®Ù?~ÿƒOpµwGœ©Ô™É&œ‰4•“õ‘6Š­T„”G~éöVýÑ1å˜q2’”cB2)³J*•ËUN÷Õ¢·UÀu••áºõM[ÔUCû(µf)—q_Ófm¾Î«öx¦x2×U›pÎÏþù¼ÍÃJ™m›¼h'bÁjÆ5÷"_fÛ²5ùæ6ߌ°â,j(²BˆZ8XÖeYïòÍ®îèۮ¶*[{>&3% Óšƒh…`©¤^
-Ø'Å4[,6ÇÂMó¦!@½ ôñxüSÏn¢§h~RÁe‹plU7-vEYÒè*œÞam•W/ «ï“ðøý8"¾.nã™,€²8÷œ_oƒ’
-' Šq¤7Ez¾[óÕg±
-uR´ÖNÏq W©GˆË N¨=íb1B]AÜ0iôM›No¼þëÛliáo
-Àº¢/IÈz}{м^¯³jAನòç0LA¢U8;Ê¡ K¸IžåZêp³ô¼dŠŠ@M×Y;_a‚Ž˜³Â M¶¨®Çb
-dÙiä¡H¢ <'ƒ\] Ròü9í˜&d\ŽGgvÁ™]çÌ°ÖÖɶ k°·9 &ɶD‡†ˆñ] ”f$zØIA(HÁ$̺ä b57µ)Ì&É®iæ}àš7õ¦‘L¢Y’Ü÷MnCŒ5ƒkCŒ51ÆÚ©ÇëGmˆf0„<Qåó¯éˆ7JœÓQ®»®Û€*¸9Œ‚È|ŒõÂÊ2ÍÝн¼Oñ|JB®Ñ*¨n/Áñ w’"ጦs/ò-X‰;º,| @{ßâ{ß’rÚÁàT]Øý*V÷Šr½d¸tŠÀcF+Þ¹Æý3 ÞG.ù¤'¨GÆ< *±àI ïyÆ(²‘¤s%yW‚op¥$¸|ÉxÀ˜|ìÀì<U]×Uõv3Ïg˜Ò1ß¿PÊ2ýu3" g1 Ä2NdvkÇèÉ„5ÃpÒ‘`Õ!]ÉDMç˜È†A
-ÏJ Ü=ák…°wL˜Š«Û'S´Ý©èDZoÆPb-ÜÙ÷Wå ®˜3]P†ûÊñ êF¤&C:!'Q ¤gyP9{M™˜jqä;Þd—w¸
-ûBveÙp¤Ÿ]pËþ yäÌΡ—Òòñ^C2ÎSwÿ™Bs4ÍkÿHã]Ñ®°ÌçÞLBáòÎ'P²À&¦„RðÀªtKÈÝi–8Gq ØðÑí®Žm"K¬>0èørr_Xl9Í2+¯ë Üf=æ䜅Š¶Ók}1¿¨Š”’Ó¼šoîb {¤~ºŒÆ<x< ”L®ëŸz<€¾ßä«9åË™X×éé|»!˨ÚòŽëŠFrúãû“W³÷¯ ÉI¦ª/%‡²·õ.ž/¼o§áFê¤Û±ïYŠ= B3š6ùœøh Ü…DwµBÿ­ BÅ
-º ÁT“ð»—‚×=7Bë5£~ŸÓ”ªÍd_A}.uLò®+\¯½­åc¾/™t<Ñ=ñ:YÙ?Wõ®
-ì5c49Ø…ÒÕºx„¨bBuDŸÁ¸Ágë¾Û’èl¨º–!T¥}ÑÁz¶wfo{=¬/éŠkZ‰—òoJ7Û–\LZÃL—°—¥N»WòEM¥>ŠµD»Y7¢Ä‚#2Q\MçÛ6>;;ÆS)^²‚Ûf·YQfÆ0°Îª‘›;(¨ÖMˆóü QŸ~:yñóiØŒé6âðæ¡Ùú&èž'p‚ÏÍÁæj±½ø:–ýë1”H©£?"Ù‘„„Åöê2Æ࿆™å|ú—LD=Þ\‡BQHØ_Öó¬Ä.íÅXí¿;Cpàñ¾0:Ý!%²È¿;d5¾öºTÏfGö®EWž@ð4i9JÚÝ# qºíÏ‘µ1:ê(iß|c7¤GFõ‚†»=K¶/'oÑ+A4ª|µÎæ³õ¼k†0QäÄ)Ÿ>³oÞ/ÿ«Õ‡æ‹.ﮤþp–Ëâíé—´\Š²|÷áå—gß®Žé Õo¹}ørp¯¶g¿ªÏÜ…}ùÓ.ým÷iw®þýÛOÛ_~ø¸û\ ÿ<ù×wÌýßÿQîÿ¤Õ SÎÉñ¿!0¥R™Âû ™²Þý›yŸ÷ÿf¹Öendstream
-endobj
-2113 0 obj <<
+xÚ¥Y[oã¶~ϯð£Ô\ÞE>f»éž»ÙœM(ÐöA±äXXYr%yƒô×wx“%™¶{p ¢©19œù曚,0ü‘…3Í©æH`"«í^¼À»WÄË,ƒÐr,õþéêÝ/,]h¤%•‹§õh-…°Rdñ”ÿžÜ<<ÜÞ¸ûízINÞ£ë¥À8ù|sÿíæ“›{¸Ö4¹ùxûx½$Z
+B$5r'>Ü?.þrÿËÇÛûë?Ÿ~½º}Ô«N03:ýuõûŸx‘à ~½Âˆi%¯ð#¢5]l¯¸`HpÆÂLuõxõßaÁÑ[ûÕ˜)¸PHP.KN ‹Û #,àüË”c”*u°%1{)c¯åf~N8çœ,Æ‹m„"[ÒÑ–Z#NÅlˇ¶¬ûÎ9#snÓ´½î·Û¬}sšµ{ö›ÂOìú²©Ã—ëÜÚk¢’—ý¶îs®™(׈RšÂŒ"m¯–«¦^¿µ—+/Á/”Q/ŒŽðà­žbøŠÒò‚kFRg\¤¬k¾;¥„I‚”Ì+õ½x«³m1W0…Ò4Uçu¤"Êí@8@Oh2ÕîqW¬Ê?0¦…µ¸ >’F)7°ªÙ‘óãHƘ޲=LÖ}¹ÊŒg+BÀæKFUò´)ýÛ}׻ѳ_(sYUæn˜7Û¬¬XÇ-–Œ!E˜96A&ìí!ž®òbí+AØÍž]$)Š‹1tŒšÇ°á)RËK°‘2E”‰ °K†Í ea³»›‰¶9f(Fæ|gõ
+B½&ˆ¡l gŠMôGƒ¬ˆyÌL‹dµÉ꺨Ü«©½n
+åE,®1F0 Ç3^Ï#žai–©ªìú¢öª¬›6¨›¯<ÉuÖv×fÙ–0àuÌù‘]Ád|ØreqgQÉ1E˜>…åö î; &
+|¬N¥ÓL#©3`
+RLmLIņH
+ñ³Ì"^ÇÑT×»6Î/Ù¸§%³õ›û`øR¿”ÎY«¾iý›³ˆ‡N.#^§$4v¯eU¹¥Ûk•ì½V`y‹ã¦7,}¸Lnü«,_ú–‚0ˆbSºLؾ4gs¬Ì >voã„É&œf; M•ÒQh x{aHš áꕇe]JaÉk[ö×@×Eí>;cUP—üð. El¬˜D?33¼ì!Gû,)ý¶„õg»®›½¥3õvÈ„
+&u¡×KŽàAÊB}±×‚4מêµÎê5ôZÇzE{­‰b>v­»lìJ~*v9JSAÎÆ.X™=ÝJ<éŠþ
+$ðЗî^W!ÀkˆA,ɪ.œrÈϹ'
+endobj
+2649 0 obj <<
/Type /Page
-/Contents 2114 0 R
-/Resources 2112 0 R
+/Contents 2650 0 R
+/Resources 2648 0 R
/MediaBox [0 0 595.2756 841.8898]
-/Parent 2100 0 R
+/Parent 2647 0 R
>> endobj
-2115 0 obj <<
-/D [2113 0 R /XYZ 85.0394 794.5015 null]
+2651 0 obj <<
+/D [2649 0 R /XYZ 85.0394 794.5015 null]
>> endobj
-2116 0 obj <<
-/D [2113 0 R /XYZ 85.0394 420.6717 null]
+2652 0 obj <<
+/D [2649 0 R /XYZ 85.0394 390.6346 null]
>> endobj
-2112 0 obj <<
-/Font << /F37 802 0 R /F53 1029 0 R /F22 737 0 R /F41 939 0 R /F21 714 0 R >>
+2653 0 obj <<
+/D [2649 0 R /XYZ 85.0394 257.7108 null]
+>> endobj
+2654 0 obj <<
+/D [2649 0 R /XYZ 85.0394 193.2733 null]
+>> endobj
+902 0 obj <<
+/D [2649 0 R /XYZ 85.0394 153.3455 null]
+>> endobj
+2655 0 obj <<
+/D [2649 0 R /XYZ 85.0394 116.3439 null]
+>> endobj
+2656 0 obj <<
+/D [2649 0 R /XYZ 85.0394 83.9066 null]
+>> endobj
+2648 0 obj <<
+/Font << /F37 1018 0 R /F21 930 0 R /F22 953 0 R /F55 1311 0 R /F41 1208 0 R /F48 1228 0 R /F39 1151 0 R >>
/ProcSet [ /PDF /Text ]
>> endobj
-2119 0 obj <<
-/Length 2226
+2659 0 obj <<
+/Length 3141
/Filter /FlateDecode
>>
stream
-xÚ¥Y_sÛ6÷§Ðô¥ôL„ÿàú¤ÚNêNí¤¶rÓ™$´[œP¤*Rvss÷Ýo)R¢-g:z ¸\,‹ÝßîBtÃNdBÃÌDAdLåd±:‰'ðíÝ <Ó–iÚçúe~òÓ[®&†˜„%“ù}O–&±Öt2Ï>E¿ÊÉ)ˆˆ£›ëó³éÙûë·ï.®O§Ô%¢Ù‡×ç—žN™Œ8ã8ºš]œýŽ´§†E³w·§_æ¿\Ì;µúªÓ˜;þ:ùô%žd°ƒßNb–“'x‰ 5†MV'Br"ç-¥8¹=ù£Øû꧎š‚Æ„ñ„ØBО- #Rj1QÒ„3îmñ¿ŸÝ~zËXsÊ%щ”0ˆ‰H˜ô¬—%ì^ÄQ³´0à&JïªG‹4ûwºZöM6XVE©
-ŒD:a
-äƒPÈÔÊ´0jßÓ!ã².úŒÈ1„KÕò8ÌÙTE=fWpÐ;0vZ£·ÝW›በPi´¡æÀ:{îØFX’´¬h­ÖÙ1ëÀh½ÉIBÐp¦¡úRô;ƒf ß5 ‘Z« ž;
-Yùßððﮎ½|÷ñfæ¬9¿|=ÄL¥e0¼÷wš„¤Ì©ìÐÓQ±Šp£»ðu—úý døÕ‡<ÓÅ®äÄäᨤ¡R¨[™!O;…-ª‡2ÿOP#x<;J½¶‹Ü-Þ®š—c92”1û!“Ãó,Nª°ˆ3ÓfNy«Çèsê»ô”^¥â^órTˆL©_dP­Cæk5¤ÆD·ÖîéQ÷,Ì}Úk?á%Š u@¦"oað2¬CzÅX¯ðÀ´éš¦Ëës|̲U^æuí¢Á‘nì½Ås/aÚUZnÓbNXÍX¨¨
-,aŽ„ÆíEˆŒÙï·ï;¿ó×h×¼ Ù¹—÷¿µAê[ ¤û5¸éÛV¹\ÆZPüg–8ÜM´Ãܤs‡«L¹€þ Êè¡uf翾¿yÉ,"ôyÝ”-¸Þ~«á¨CÆ8ƒÊ)ß®vë
-(‚’ö4ƒºBʮ͆ž:ŽãƒÊÂœ…>ÊcšCŸqÅ ‘ŒÔ'^ŸÏÐõìÎ GX²í 6(Î;«ªx}+«u×û½=‡˜Ñ ‡–0jä‘^³aÒåÛñFÝuÂ.”z"ûôö¡ã:Ü»KŸ¦é—vt‡û‚•{ž
-˸ƒ<0KíÀõ ue{ xÌňÌö^ yŸß!rÙ¾Ž‡rZÉ®òáe篾>ª¯/úå1€ó}y›yЛrðGÁ†pˆ%ý3¶@üÖûâë£ê¦Y¶±uýz 4GE.–›ªj²|¬îƒ>ŒÊÎ]:¡Û£B¡Ã“Ç
-佺’v¤c…:^ñ^Öf*ºlÂÊiXÍßÈhÓ6É0JÃÒi§ã£-sÌ´Ž\8l}ÃLßójìf `"áZì¥lìmMòLIÀ!ü=ãkê#%ºb¹»õ1¡¬cF†:À¸Êoƒ‰­^W¥oâFÌ –bÒ˜ãÅ7D$]eÖµFl¯5Ò”²[,à«Ð±®È$ãõZg4{eS¤X'þ¤.AÝÐ —2Ø»AœíN¶Ø]ê ÐÇ_3‰à4B¢Ó
+xÚ½ZÝoÛ8Ï_áGX³ü%Þ=u·i‘ÅnÚÝä€Ú>(– kK®%7›Åþñ7Ã!eI¦8©(j4g~ó!‹‡b–f¬´³Ôj–p‘Ì–› >{„g.„§Y¢ÅêÇ»‹7ïU:³Ìifw^ãY&fwÅçùL¤ìXðù»w7·‹Ÿ>Þ¼ÿpus¹6Iäüí§OW7ï®ÿ}¹ b ä|þëÛ›½ý…æ>]Z ûpu{ùõîç‹«»^¬¡è‚+”éÛÅç¯|VÀ~¾àLÙ,™=Á gÂZ9Û\èD±D+fÖ·¿õ OÝ«QUΤ22¢ )fB0ÜÕH‰eFIå”qû\7Û¶j§[Q‚¥™Q³TiÆ…6±¥(Z& Ü ¹X*„±,œXZÄŽ(P¡TEQ·‹eS?<–õå€þ?/rñÍ{Xïð²à‚‘YX_Ë×Í®êV"¯£˜Õ©ñ”_×U?ú#Âß$,M”ö/ýQ>×ù¦Œ0ׂeZ‰)ó]„¥JXf’Ä“îòºh6Õ:ÆÎ)M“lʵ}‘ë )¥eYØýMìE¸-”IØÙ9Î_Me šEkŸˆù-ŒPš¯ôÞØ :c™0àÅ
+Œ á‰cðîêö§ß¯?Ý]¼é_:,Ægà‚pæiÄPˆZŽÏO؉4å.ïÊÜ8Óó/
+O•îš ömIîŸ#‘±$ÕÁ’êv¿-€idu­Y–fA1pÒ1n–ÌÿppE„“âÌZ–HÒB̯;·­6Ûuõ…sI;SsPÞ>îa·USYó@׸Zâ* ËÔdpZö¬¬E¸«×]U?Ò}NRÞÃî`Í·»K‘Í›ïUÑÓv«2²sÉ%À‡¯Ðc¸â/ê1Ó:ê‘¡]DØâ¨, NÝ>×]þg4ïhôT­×^%]ë²,ÊÂÓ5¤=%ç35Ñ™ĉªûÁêåzïõ·yM×òÏN.¦! Ø„2’‘4³Ø6ëjù7óuÛñ¦¬;FR
++™Ð°áX®²„û×` J¦xŽJš9€P^Õ4åÐÃÍBXp3í¶\’ô ñ¤x²n°l6gøt]Õ%ì\iàÐÑé)ïý %O^™™^€ÔÙ,Îôë.èÍ÷ÈÇ'@’€#8Öp¥÷39oOi<3 ¬7}•ý¤LJ¥Fö.™òlþ!ôGûCìl!f ^GºÁ«°ú&²¸ˆÌ6 ýS³_û½ÕÐ]î-4Õ þ’±~Èk [¾^;£6Ùü‹”ÚIs)
+r+ð_%/c»bÆôØ^um¹~ð›Îë°û€çˆ­~Ñœ.둆˜ÍÒÈpæ7%<A~;0ˆâ*µS0v¯,Ö±S°¹Tô!阥aþe1;"˜ä:,¸ƒ 7õšü{¡á xªÕØŽ{LÎøüiUº@'(®óù¦éµwå:¿oÈ=ð6!- é½oûŠÅ?À¥Ò` HWÄÖKÄ8™eóê!²y%“Ff¯ËtŸN ĸµî½ÀÞÔaô@vCwÁÏ h›;Œè‡äß‚e·Ï-DËÅxH´{ó£Ë¿Ž ŸÓk8/n!5=›ø©B=rœø÷T¸nŸå'#Ä„Z¤‡¼Q’?N Ê3žž—®§Šˆ''!p,Þmñ˜TÀ¤¢ù†®äv*8âð»Ûë8Jh vÆÍü-–—ßó
+,víi—«¦Z†5s:V´J®ç«M¾\lŠQ ºõ>£XäÄ$ÚU.|VâHáÞãúp&1“•é»ã'P% Ü‚ÏïVÞÌŠò!߯;Ÿû´G¼ÙI³’’¥D>oVª3f¨œY­¦K‚¿p›¾°d Š,94•T
+l¶JíDãtî{Líü3JD§P®-$(2}%òJ–¨d„ã±£QDj ußÙ£R>šžÊÍ1‡zÚ&ê¸îù;àÝê¼l=UD¸‘¿‹„iZI7rx%´Ï$aàB¬IÈVUX#
+ÈH”ïa²îª¥7ƒwû„+rœïÝoª6Rq+¨v„Õ£ØêSái”†Â1}¶¸"
+>T,¨;ªXˆ©±çœÔë Ü̽,9±nËmî3q˜/×>JkÈŠEbÇ©èC³^7O®¤I\ÏÁ]Ij Ýžfœ IH5¸ÝÔÎKöÈ~ˆµixŠ}B;ÙÜ0Åg±CP¼Ö„üä.¬Iöoÿ0ÚìÛÎoTeÌ*51¯Uþ½œ „ÅMÞaУå÷|]yä Õ)Žq9œ
++qŒ„ÿM^…E ø‚#0Â=á:ŒpÎÙ$L´¥'¢oƒ²#|ÀçýW
+Ò
+þ¡BÒúãõÍ;zÓzÁŠ d˜m·Ã‘¦~/c±“M  S¿æõ>}l‚4’>cNv)Cq0üµT4x¯ÆÿùGY‡Ÿé”)¨Ýâð#SÀ c/
+.R~ŒÄþç[Dzÿ!ºãendstream
+endobj
+2658 0 obj <<
+/Type /Page
+/Contents 2659 0 R
+/Resources 2657 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 2647 0 R
+>> endobj
+2660 0 obj <<
+/D [2658 0 R /XYZ 56.6929 794.5015 null]
+>> endobj
+2661 0 obj <<
+/D [2658 0 R /XYZ 56.6929 749.2278 null]
+>> endobj
+2662 0 obj <<
+/D [2658 0 R /XYZ 56.6929 677.9694 null]
+>> endobj
+2663 0 obj <<
+/D [2658 0 R /XYZ 56.6929 495.229 null]
+>> endobj
+2664 0 obj <<
+/D [2658 0 R /XYZ 56.6929 83.499 null]
+>> endobj
+2657 0 obj <<
+/Font << /F37 1018 0 R /F21 930 0 R /F41 1208 0 R /F53 1303 0 R /F22 953 0 R /F55 1311 0 R /F39 1151 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+2667 0 obj <<
+/Length 971
+/Filter /FlateDecode
+>>
+stream
+xÚ½VMoã6½ûWèhË‘"ÎÚÝz±q\Û Èæ µäD€Ey-9Aúë;IYr”EŠÂIÃÇáðÍã3I€áGÉf*
+b!Ž vÅ0öyD&ô °‹ºÙŽ~ýÅBJPl÷\a)I°MïÇÓÕj¾œ-þœ„”ãñ š„ãñítùmúÕÆVEÇÓÏó |G
endobj
-2118 0 obj <<
+2666 0 obj <<
/Type /Page
-/Contents 2119 0 R
-/Resources 2117 0 R
+/Contents 2667 0 R
+/Resources 2665 0 R
/MediaBox [0 0 595.2756 841.8898]
-/Parent 2100 0 R
+/Parent 2647 0 R
>> endobj
-2120 0 obj <<
-/D [2118 0 R /XYZ 56.6929 794.5015 null]
+2668 0 obj <<
+/D [2666 0 R /XYZ 85.0394 794.5015 null]
>> endobj
-2121 0 obj <<
-/D [2118 0 R /XYZ 56.6929 513.8248 null]
+2669 0 obj <<
+/D [2666 0 R /XYZ 85.0394 751.5568 null]
>> endobj
-2122 0 obj <<
-/D [2118 0 R /XYZ 56.6929 427.0967 null]
+906 0 obj <<
+/D [2666 0 R /XYZ 85.0394 708.6012 null]
>> endobj
-2123 0 obj <<
-/D [2118 0 R /XYZ 56.6929 364.279 null]
+2670 0 obj <<
+/D [2666 0 R /XYZ 85.0394 670.3846 null]
>> endobj
-702 0 obj <<
-/D [2118 0 R /XYZ 56.6929 325.4767 null]
+2671 0 obj <<
+/D [2666 0 R /XYZ 85.0394 636.5029 null]
>> endobj
-2124 0 obj <<
-/D [2118 0 R /XYZ 56.6929 288.9693 null]
+2672 0 obj <<
+/D [2666 0 R /XYZ 85.0394 564.786 null]
>> endobj
-2125 0 obj <<
-/D [2118 0 R /XYZ 56.6929 257.0263 null]
+2673 0 obj <<
+/D [2666 0 R /XYZ 85.0394 498.9559 null]
>> endobj
-2126 0 obj <<
-/D [2118 0 R /XYZ 56.6929 191.2867 null]
+2674 0 obj <<
+/D [2666 0 R /XYZ 85.0394 418.2058 null]
>> endobj
-2127 0 obj <<
-/D [2118 0 R /XYZ 56.6929 119.4786 null]
+2675 0 obj <<
+/D [2666 0 R /XYZ 85.0394 349.4108 null]
>> endobj
-2117 0 obj <<
-/Font << /F37 802 0 R /F41 939 0 R /F22 737 0 R /F21 714 0 R /F48 953 0 R /F39 899 0 R /F53 1029 0 R >>
+910 0 obj <<
+/D [2666 0 R /XYZ 85.0394 306.4553 null]
+>> endobj
+2676 0 obj <<
+/D [2666 0 R /XYZ 85.0394 268.1239 null]
+>> endobj
+2677 0 obj <<
+/D [2666 0 R /XYZ 85.0394 234.3569 null]
+>> endobj
+2678 0 obj <<
+/D [2666 0 R /XYZ 85.0394 162.6401 null]
+>> endobj
+2679 0 obj <<
+/D [2666 0 R /XYZ 85.0394 96.81 null]
+>> endobj
+2665 0 obj <<
+/Font << /F37 1018 0 R /F21 930 0 R /F22 953 0 R /F41 1208 0 R /F53 1303 0 R /F39 1151 0 R >>
/ProcSet [ /PDF /Text ]
>> endobj
-2130 0 obj <<
-/Length 3036
+2682 0 obj <<
+/Length 2018
/Filter /FlateDecode
>>
stream
-xÚ¥Z[Û¶~ß_áG/pÌð.ç)iÒ E»ÙÓlm´– ±%×’³ÝþúÎð"KZÊNqàQÒˆÎ|s¥Ù‚Â-Œ"TX¹È¬$Š2µXïoèâ3¼{ÃÍ*­†Ton^}/²…%Vs½xØ æ2„ÃÅoË×÷÷ïîÞ~øõvÅ]¾!·+Eéò§×w¿¼þÑ?»¿µ|ùúý»O·+fe&ˆ ¤ÓtùóÝÛïVß}¼ûþý»»Û?~¸y÷г5dQ<ýyóÛtQÀ~¸¡DX£OpC ³–/ö7R ¢¤ñÉîæÓÍÿú oݧ)Q(aˆ2<KÈ‚³cÄ*ÅGÂP–hÁ…ÆÇû‡ï>½Ø %T¼2Îà#˜<©„@´RÅ…JˆT¸î*Ÿ.iÂðËKF¢Ä’|°$¨[0«ÆK¾m@»F/óS×ìó®Z#^5'&“Ã/Žu‰†³s`‚sˆÖMý;¥üóés65ÀD2³|ØV­_n}¼…û2ïÊð ÷ühWúéå&‘™æ&È—ò9Áˆ¢DgTªNMÆ
-¦Î÷e‘˜IpbÏâkÂ6Û.?v§€ˆƒ zئð²äzˆQ‚T e€}&ÍDÊiè0öL,®8•Ë¢Ä»Ú¡•*‡V÷t“Ÿv¿Y7û=îݬ·y]—;ÿ¦
-FvË– >°3gþ12ã w»æ©ª?'ä'˜"FZuUŠÚ¨®®9svªqÉ2ÈD+à™Š2ñ!à©Jc€ƒü¤¼¦9A¤‘b 9Œݶôƒ]³Îw~¸mÚÎÜ‚nT7þº9á“£¿yáCïJÎ 8vPµÜ³þó©®Ór“àëTï–Pl+4ÉÏ¥ã0 .w²™LLdLN+­'÷Ç•^Zÿ vLj¥®zL*ÀüÊ‚ K?ÿ©E»wK„µ gºÍaUÞ½)vùºÜ¦Zÿáƹ©¯ÙÒxÑq.!àë‰)ÌØ«%BeQŸé 0M”Ͳ@óŸ9¥¢-|v–ƒˆh&È(ÿªÚuçÀ3õ<Oýv\e½\ ª3Á-ðjdËB<Ëñ1„>lp]ëL2š}ã¥ë–»ü±9¢ý¸Û 2ýCpµçQçg˜•øYá_<>§ìKZ’Y!f jç!j²VÔóüç©òƒu¢y„ìã¯|ØE/
-yeÉH”XrTÆZ"¹š,y¬BD]G©o›c0„ö©ù1( ÙL2¯²øq‘;WùùÔgVNŸéðÍ9Ͼ1dQH¼¿¦™Ib3qÅ©æUÓS9Õ|ùŒ¡eÖ_äíìƒ_2—ôÁ#îF>sÙ #J$8ÖÜÈëq@ã3MÝrœóâÃvhEÀ‹ýÉ×#ºO½sùšïªÂ‹fŸWõ™rÁ?D\M}q¢h…rÍÈa™°ºdÑú*lð‘Q{6ª °‰T6‡«°9 µM1Ã)Áý]ä+%ø!†+¬ð'Œ£¶ hÀA_Ž ;(ÇñãÔž°ÖtY~®)¤p\‹ku/ÀWôuÒj™²¬¸¬Û³‹¯ƒ“Av6¾’Û§ê.A £}¹=W:R"ûEÑ™4±/r¤ó8ÆÆ«™¨oLl`7D]ÓjL=•Ó1&K´½%€âš}27P$¬1—¹ë©ì0¥ –ÊÆü1¥$ú¡Ô²mNNoëÒ?vÙ \=·ž¦È»Ü?õÚ‡A¨]‰‹$¡8-x©æXý;¤š W…â»@¤ 8Žn-QBN<Nû ¨ÛûR¯hœïÔ ÊïÎ?:x´}­ŠÒ?È“-QC„õÇ«¢üú*ì+Ä€T÷VW[¬Xv‚Ë¿ëׇ)ªué*аiÇ_C J_:—W¿r]¶­ß53£Å¤_8¸ÌÇƇë஫úpêHb—OÎíL· ð™®Ç„ÌúFîl`zBô
-Ò”GíŒÊùˆBLh„èåYøT-xÚ‰9; ¡]–©©^pGð¤ªyá{ÙÆ´ÇéÇi‚øRÃG-’U׫Ðç)ÕmåÒ@}9LäQEº/™îûuáÚ¢çFÉD‡ðÎé0ôk¬jÚˆ êCCýØc¹¸÷y‡Æе^Ëw‡TZ¤r­½ZêäEq pN•:YëK—¬%Ko㔊Gýs¶üpï k.¶âRTdï¨dÙõn03FO£"Îî{Q°þ¹_Îé _Îé8^ºoæã%dE„[ñïâ¥w¥\&õ7&oÓvvsxÌ×_B©0’ +¸¡Ø„›Å"×@aap‹Cªy,öT‹]2¸Böu¶Þ›¦ gR#0B–i5¤â™ë©Üc+'V‚|Gì…ÊÛÚXy[;WyCº'ŒºÒ®ã™–Óʧlüõ\y[ßÙµfÐkŽáÍEÄCŽ@™d×o3Æû^än秭N7É;7®ý¶’àæ_‡Wy±
-%(-3uE…{ó^Y€}ž‡SœE8Žvà6MömG¦Rô昇i}H˧c…WëHýÖò’¯Â!dÄÙ
-ú‰˜áeÛy·/–U¸Â’0ÿdÕMsrî=Ÿ#!@yr‚Ñ›åPÀ©öo†‡™W}%ÖŠ«µgÜǵh2¤º`Á‘ÊAýtµÖ‚0wœ«µ.òÕ×Z/ùJÖZ#Æ‚í:u9ÛÕr¾k–eŠ]éšYÎìÔv{(Ißiàvƒæ©vé7“õÇɬà/RûmÈèOO|a…þè$ÀÖ‡Mb£™"Šöuyô½ãv¼òá9 LžïÚ¸ËÁ)8›ÅŸNÒ½¦Þ=ObÐ9{¤ËjzÞz¶„a7« ­±m<¨bk+Š¶?®+H¿ÝÁ¿eVÊ]ª5VÄb„GæÞýúú§ûß}Jìžb˜ Ï]xÅÿ5±ºkžR'¶7…½þ—BÙèìtœÎFBÎqŠGÑ“s¼p‚9<’fx¬£!­¡ÜŒÇvšÒ4àéø«( A5hM8Ìý¥íé¦.!F¸ž?O2rŠk·‚ë‰P¬8Ž!k94–'OÏu.qþWOwlvmÊkj3./ÿ†LŠ†ô_0ôùŒ«íÀCyî‚ÄÃf¼2Ñ4ð®ªcå S»InN³‹¸
-+³ötfþ6'‘éf+í-óÿþKÝù¯ƒÝ cx:.*~,2…{`‚MYïÿ|÷’÷
-endobj
-2129 0 obj <<
+xÚ¥XÝ—·ç¯à­pOpý1Ÿd—$´Íf»°÷ôž4³ƒ9e†ú×W²ìa`g7͹‡‡‘eÙ’eé'Ñçðý0bQ*Ó~œ,ä"ìçÛï¯`î}O8™‘µ¥ÞÎ{?¾Sq?ei$£þ|ÙÚ+a<ID¾ø<xË$gCØ‚¦³›Ñ‡ã›Ñ»éo÷ÑH%ãûûÉÝíô·áH†ÄA–óÁÇñÝãøâÝS{?™ ¿ÌêMæamãWhÕŸ½Ï_xgø©Ç™J“°„g"MeÛ BÅÂ@)ÏÙôf½_› [³vi§3gRE²ÃRô…`iÊ w„)‹”TÖã‡÷'wóçg,"êÇR°(”É ºIhÔ–òª;.ÂK¡æ‘A•?¾ Ö$˜›¤!œ×Š˜ÃöIï¯-<`à˜äuÓ©Ûd[#OY BqiÜÔÀU'ñ`·Érd4(—ÄZi£÷Y]˜Kã~ç\nô¤‘—Ò2h»C$’…‰
+ŸòÊ4•00*qb¿ó/÷C‘ Ê-i–¤·.i˜‚„ ’L©œ-Ùn§Í î°EIÈ(ù>[@%ˆôG
+Öåa³ úÉ-?ֆ¹Ð¾
+!Ë•"—+™’Ë-'¥^7N`ÖâR€ˆÂ䛃­F× YDÄ:s¢‰<V4γCE ÌhöaüšÏ¦ïi‚â)B
+¿í
+uÔ63¢t°)ÍÊÐõ:3žrÓ‹b¥«Ú‰j³ª×DÛhk ®³ÊM¹KŠÞ r0ù ¦"C ÀnA.Ú_4CDœˆ§¢®Î«euÌíçÝ‚Ðï\\fY~7 u»ÎEK´¸ ßCe³fàÞÊ=¹-¯7'
+n‡‹–Æ­ÝêªÊVn£ì
+Q
+.ò+úÇ…ã»À
+ _ *|( iw®QÖõ…B;’ßf'"0žµßÕŸ¯ØõÉQ;ê!‰¹ÔqùFéÆã6.®u.šü†ÈãZšt)…LŒ¢0ŽÎµò RH(•±Ãž®Rq… QÂ’ ‘nÁ¶\(kAÔÔë²Òd†ÜØ…`< X«ê²ÉUs^Qÿ)
+™GDÛe8,6šA@EN«§AvIZT8¶õô¼1•dx—ž…¤õw”¾ù=[ƒ/ȹÓëgÉÅ5c#]¸å¦tšþóP4™L°Ü¡Ì›fC÷¦)jÑxúv¾ÛCïû9Dðòàd=4P}`ÿ²OžMn¦óÿ¹–÷ÓÝlz;yc‚cK3ûv=kN‘Æ•/EÖùiâQ5@ŠNMGÀ[=u
+.ÚÙ"_bgæt̤T*´×Ž3‹Òæ,±d…—¨v !æû3HCìïnhR
+4ëíÃX©
+endobj
+2681 0 obj <<
/Type /Page
-/Contents 2130 0 R
-/Resources 2128 0 R
+/Contents 2682 0 R
+/Resources 2680 0 R
/MediaBox [0 0 595.2756 841.8898]
-/Parent 2100 0 R
+/Parent 2647 0 R
>> endobj
-2131 0 obj <<
-/D [2129 0 R /XYZ 85.0394 794.5015 null]
+2683 0 obj <<
+/D [2681 0 R /XYZ 56.6929 794.5015 null]
>> endobj
-2132 0 obj <<
-/D [2129 0 R /XYZ 85.0394 751.8648 null]
+2684 0 obj <<
+/D [2681 0 R /XYZ 56.6929 752.0628 null]
>> endobj
-2133 0 obj <<
-/D [2129 0 R /XYZ 85.0394 153.4294 null]
+2685 0 obj <<
+/D [2681 0 R /XYZ 56.6929 603.3016 null]
>> endobj
-2128 0 obj <<
-/Font << /F37 802 0 R /F21 714 0 R /F22 737 0 R /F41 939 0 R /F55 1037 0 R /F48 953 0 R >>
+2686 0 obj <<
+/D [2681 0 R /XYZ 56.6929 539.7009 null]
+>> endobj
+914 0 obj <<
+/D [2681 0 R /XYZ 56.6929 500.3546 null]
+>> endobj
+2687 0 obj <<
+/D [2681 0 R /XYZ 56.6929 463.723 null]
+>> endobj
+2688 0 obj <<
+/D [2681 0 R /XYZ 56.6929 431.4263 null]
+>> endobj
+2689 0 obj <<
+/D [2681 0 R /XYZ 56.6929 364.9038 null]
+>> endobj
+2690 0 obj <<
+/D [2681 0 R /XYZ 56.6929 304.268 null]
+>> endobj
+2691 0 obj <<
+/D [2681 0 R /XYZ 56.6929 107.6861 null]
+>> endobj
+2680 0 obj <<
+/Font << /F37 1018 0 R /F21 930 0 R /F55 1311 0 R /F22 953 0 R /F41 1208 0 R /F53 1303 0 R >>
/ProcSet [ /PDF /Text ]
>> endobj
-2136 0 obj <<
-/Length 438
+2694 0 obj <<
+/Length 1217
/Filter /FlateDecode
>>
stream
-xÚ¥SMo›@½ó+öR™îì»GbÇQ‚]C¤Ji–Á‘¥°V1QÕßlg£8Ê¡BBìÌ›·oÞ H¨{HÊ0C#@R”dÓ”<»Ü,À#&>buU߯yB Å)·—ª5’²z ¯
-h #M $)8?E^‚"øq&ô²CéE+ãŠ]ð‚!A#%{g†4 8ãƒE–M¥wÅ¢ïÇU1ÏAJb&À¼µÕæ•T»~+ûlövÛ'¤—°ë¦®<ôÀÎÇŽ‚j©Ý5Ãdæùt,5GQU³³»C×®»};†Võ¶n#Ôam7õº_Û×õËñ¨40¥Ô‘Žw®ÄÜù'$îK"U6}(o«¯ ™Û®nmÝJŠ¿‡®nãa²·‡}Ûí^›ÏöÄ]Ø÷ÂTéYâïÐÛ¿"àZ³·õðûb‰W¬N¢úæ³ÒOÛöQû?prÕ¿endstream
-endobj
-2135 0 obj <<
+xÚÕWKoÛ8¾ûWè(5˧D¢''q““`n²%[ÂZ’kÉ-Ò_¿C‘’%Ev{Ù…“"‡óøøÍ$†q¤@˜)îøŠ#‰pÖé;[˜»+3©…&m©«åèãgæ;
+)zÎrÓÒ%–’8Ëð›;}zšÍoîÿO¨ÀîOÆîÃtþ2ýjƞƊºÓÛÙ>‰ÏQ¢å<ìγkv7]Ü¿/¿ŒfËƧ¶ß3íÐÑ·ïØ Áý/#Œ˜’Âù¥¨“Ž¸`HpÆê‘Ýh1ú£QØš­–á ˜DBR
+yŒ²
+‰Ålfž~]<êx
+Å:¯ÚÐfR’™60M‘l³Êèÿγ]$®ÍççÛ—‡Ù|¹xS£-ï˜ç!åS~™œm©º¤¾%g#ÕP®g”`‚°¯Þ±ÚH ˜íMì!ìážÝel³Üp^÷öªùÏ$¬á«6P·µð©h4 ‚ÎBÆ|8B¹x²–ÔÈj)íú)7û¸Q…¤åeÓÔ€ínPX¥ ¤k|
+á+áfÇtéLqà_˜¬¡:d[3gЂ ‹ µÐšpÎÝëãÁžyåîµ·*Ïê¡â¸ßÃQíÆ°:ó¹|¨’JWì‘nRÙôaXº:gu»¸›NÈèSæþŠ“uܶi»úsõjÚÊCÝ©ƒ×}òi¬qt×P£Gžc…ý×UÞh1qêTŒÍqgúPŽQ}´™0Ì%lS_JSz4+ ·Ç¬ž¥!• Q §êE¶¥ÎÓ°‘ҵ΄7<”p=óß±ÝH ïò!âËžõ&&¶*fBÏàe KÒ¨8›ÊEœw6ãWvv
+Ïã
+—M¸e²wpmI]Àµ–Ò‘ÎÖ¦ú~€%¿l·‘0ÜÁ2EJåw-7˜Z ¾úJÕ©†«‚ 7·
+endobj
+2693 0 obj <<
/Type /Page
-/Contents 2136 0 R
-/Resources 2134 0 R
+/Contents 2694 0 R
+/Resources 2692 0 R
/MediaBox [0 0 595.2756 841.8898]
-/Parent 2100 0 R
+/Parent 2647 0 R
>> endobj
-2137 0 obj <<
-/D [2135 0 R /XYZ 56.6929 794.5015 null]
+2695 0 obj <<
+/D [2693 0 R /XYZ 85.0394 794.5015 null]
>> endobj
-2138 0 obj <<
-/D [2135 0 R /XYZ 56.6929 752.4085 null]
+2696 0 obj <<
+/D [2693 0 R /XYZ 85.0394 752.4085 null]
>> endobj
-2139 0 obj <<
-/D [2135 0 R /XYZ 56.6929 692.3565 null]
+2697 0 obj <<
+/D [2693 0 R /XYZ 85.0394 692.3565 null]
>> endobj
-2134 0 obj <<
-/Font << /F37 802 0 R /F21 714 0 R /F22 737 0 R /F39 899 0 R >>
+918 0 obj <<
+/D [2693 0 R /XYZ 85.0394 655.476 null]
+>> endobj
+2698 0 obj <<
+/D [2693 0 R /XYZ 85.0394 623.3704 null]
+>> endobj
+2699 0 obj <<
+/D [2693 0 R /XYZ 85.0394 588.7135 null]
+>> endobj
+2700 0 obj <<
+/D [2693 0 R /XYZ 85.0394 525.7396 null]
+>> endobj
+2701 0 obj <<
+/D [2693 0 R /XYZ 85.0394 468.6524 null]
+>> endobj
+2702 0 obj <<
+/D [2693 0 R /XYZ 85.0394 396.6452 null]
+>> endobj
+2703 0 obj <<
+/D [2693 0 R /XYZ 85.0394 211.0639 null]
+>> endobj
+2704 0 obj <<
+/D [2693 0 R /XYZ 85.0394 151.0119 null]
+>> endobj
+2692 0 obj <<
+/Font << /F37 1018 0 R /F21 930 0 R /F39 1151 0 R /F22 953 0 R /F41 1208 0 R /F53 1303 0 R >>
/ProcSet [ /PDF /Text ]
>> endobj
-1604 0 obj
-[706 0 R /Fit]
+2034 0 obj
+[922 0 R /Fit]
endobj
-1472 0 obj
-[706 0 R /Fit]
+1880 0 obj
+[922 0 R /Fit]
endobj
-1212 0 obj
-[706 0 R /Fit]
+1579 0 obj
+[922 0 R /Fit]
endobj
-2140 0 obj <<
+2705 0 obj <<
/Type /Encoding
/Differences [ 0 /.notdef 1/dotaccent/fi/fl/fraction/hungarumlaut/Lslash/lslash/ogonek/ring 10/.notdef 11/breve/minus 13/.notdef 14/Zcaron/zcaron/caron/dotlessi/dotlessj/ff/ffi/ffl/notequal/infinity/lessequal/greaterequal/partialdiff/summation/product/pi/grave/quotesingle/space/exclam/quotedbl/numbersign/dollar/percent/ampersand/quoteright/parenleft/parenright/asterisk/plus/comma/hyphen/period/slash/zero/one/two/three/four/five/six/seven/eight/nine/colon/semicolon/less/equal/greater/question/at/A/B/C/D/E/F/G/H/I/J/K/L/M/N/O/P/Q/R/S/T/U/V/W/X/Y/Z/bracketleft/backslash/bracketright/asciicircum/underscore/quoteleft/a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q/r/s/t/u/v/w/x/y/z/braceleft/bar/braceright/asciitilde 127/.notdef 128/Euro/integral/quotesinglbase/florin/quotedblbase/ellipsis/dagger/daggerdbl/circumflex/perthousand/Scaron/guilsinglleft/OE/Omega/radical/approxequal 144/.notdef 147/quotedblleft/quotedblright/bullet/endash/emdash/tilde/trademark/scaron/guilsinglright/oe/Delta/lozenge/Ydieresis 160/.notdef 161/exclamdown/cent/sterling/currency/yen/brokenbar/section/dieresis/copyright/ordfeminine/guillemotleft/logicalnot/hyphen/registered/macron/degree/plusminus/twosuperior/threesuperior/acute/mu/paragraph/periodcentered/cedilla/onesuperior/ordmasculine/guillemotright/onequarter/onehalf/threequarters/questiondown/Agrave/Aacute/Acircumflex/Atilde/Adieresis/Aring/AE/Ccedilla/Egrave/Eacute/Ecircumflex/Edieresis/Igrave/Iacute/Icircumflex/Idieresis/Eth/Ntilde/Ograve/Oacute/Ocircumflex/Otilde/Odieresis/multiply/Oslash/Ugrave/Uacute/Ucircumflex/Udieresis/Yacute/Thorn/germandbls/agrave/aacute/acircumflex/atilde/adieresis/aring/ae/ccedilla/egrave/eacute/ecircumflex/edieresis/igrave/iacute/icircumflex/idieresis/eth/ntilde/ograve/oacute/ocircumflex/otilde/odieresis/divide/oslash/ugrave/uacute/ucircumflex/udieresis/yacute/thorn/ydieresis]
>> endobj
-1641 0 obj <<
+2065 0 obj <<
/Length1 1628
/Length2 8040
/Length3 532
@@ -10479,7 +13098,7 @@ endobj
stream
xÚíte\Ôí¶6Ò ˆtÃÐÝÝÝÝ¡Ä0 00Ì ÝÝÝÝ’‚R"‚´t ÒÈ‹>ïÞûüž³?³?½¿w¾Ìÿ^×Z׺î7¶‡Œ5Ü
¬‡¹rðpr‹ t´P(ÐWç…C­fL9g0ЇÉ]Á¢
-Äü{fXE
+Äü{fXE
0Üú÷äè¹aÖÃöOÃoäæìüØã?ûÿxýœÿŒ=ì a.ÌÁAb¡ö™9Y® Ä£ò/z{xÂœ*Þè—ÖÁ»2#×Dj,ïêÃ8›ÇEµyÍî;Ýoª²n öA™ºÓÁß‹(üèX>ã.3v±ms™W`gÅúϨ¯"›
rn­êèš—ß¡RŽwð9£_²Ò¹Ð_8=óe4%v>oFÀk(Ù?`LÙ½¼`êú4ð±ûåÃ&9[~ƒ˜;26cLà«|r)Sƒj…×Íl(ßÛ
b¬Å7ÎßÊçÏVð™h9Žù,¢I‚°RÊ• e®äß·RÆ%=²ìÙ êt›œ(†Ì%³LÇî)®Ž>1Ù¥‘„µ…^Ñ2¼éˆO£Ý %õ‰>•pjÕr{2–ÂwÍ<–g¬™-j—!3cäáakIè,AŒ$ÁLˆÇÆ‹J¯³nöùU»Ïm›Þ‰D3
@@ -10502,35 +13121,35 @@ $OíœàÅ€DÈ
t‡Í=žÝbóÆÃwî6ß"£“˵?”JËOP2RÐ oQo+†â1)©w†¦ÜèådîI½ÈZ¿VÍ­(e÷åû È"QÔüFØs(úF$'‘qL ®/¶!õÔ ¤HvkÖ‰Œh¼È‰¬ê؉á¶o?Ùa:Šÿ±qêcŒ° gã!_QÇ~ÏWê¡1üaœ¯UÝGmã§Yñmn%ìRãr9÷¬ß0qˆ5†/‚E…(êÚ“†,W‚˜$Ù½ï¶åçLxËÎÔ|ú奕£w†Z|ÂV€ãž÷,éOd
ÞyŠGÝ ŽÎ¨Ý3lÍ4©¿Î\×T2Zª½Ag—.7Ù#ÏPæï™v¼eŦQLÞ»±Oþ¼Ô\’ ¬ÿĵJÅñ¾(š3Ç].Å*,MÎ>ÛBx(ÃSÃó|D³uû‚Þ¡ï†{:Ò‘Á¨2G9¡Cê{É•<|?ÒK áéá@F)Ø,êw÷ó?È ¸¢Ëa„Çh%Ù±o^Œñ{‹6™Ý @¥-«ä%Å~jÉwXjz1îi´·î¬%uÕ3^¿±g¸`d+ÎK[ŽDe—„]âò†YèÖýÇ?Ï>£³HjË,èkѸÍhÔ8Š” ™v_Å [ªJÖ®²9m=·âú?\‹k>¼à¬‡¤*³Ñ³ž,Y ê<‹ý¹uÓ Z/ZV$S·é#ƒmNOš¨5M@¿§rãÝ0Hõ7¬&7[àçŽAØñêOõƧÈêÚ5±pE6~d»Ž^.x¨T1¬µ¤$£Í7¿ÿ4òÆêüj§‹G1¬èípoóÌ3³QýÐZ:œNÍÆéç,0½‹Š‡Zg‹ðâ£à)‹Q©¯³‹X""œÛÆ0ÏÁ¾äBvFA‚)Y9(ÎYÖý…ì¬S…|¸Ôü¾“qbæÇN.LÔX§…_ï‚¿œ%%½¥åŒìé|°D>W²7}C–Í#—ZR¸­$º`bÛGο…a¿9gÝS%\”Á/œîñhC|?s§ Ø…šg¯ÎÙÈ)ª¬m}ÐvÖËk†Ÿ.bÉ&O
üõí+uqfº`Îa‡„°£â,I§ã¯½/‘˜÷ÇÝ›Á¤'P6ߢH‚Ú?÷›½šÙ¹˜Žà9¦ŠmHr7:pMRYŸ#£ 'æW¥¿ðKCß|-¡mWÝ躖nᲶË0–«ÞÐ3äÛÙ=j’¸Ë-,n–³e±€¢üb½iÙ;‘˜Hâ°l<)žL.ßÐYÖÿ°Ú·)wL=(‚Œ£± L|)=å'ÀÆ-Å@²öò¾µ<ÃNrä³6îµEôʃ3±d¶kÓ»¬ÿ‹%ôµøü·(kD~ô(¬_yñ‡Í; ¯åä²fùOî{&*‰äyÒ¯9ÛB±T¨d>è.<Sâ¢éX3p7«Á~ª"럽Ÿ“lË´ÍÔDQÿfŒ°Ì
-*s"}Y ;Ò‰¢ú{YÌÝÇí]p¶Òݯ€Ž¶Xo³êÙ}
+*s"}Y ;Ò‰¢ú{YÌÝÇí]p¶Òݯ€Ž¶Xo³êÙ}
endobj
-1642 0 obj <<
+2066 0 obj <<
/Type /Font
/Subtype /Type1
-/Encoding 2140 0 R
+/Encoding 2705 0 R
/FirstChar 67
/LastChar 85
-/Widths 2141 0 R
-/BaseFont /QJGZXQ+URWPalladioL-Bold-Slant_167
-/FontDescriptor 1640 0 R
+/Widths 2706 0 R
+/BaseFont /LBYYIR+URWPalladioL-Bold-Slant_167
+/FontDescriptor 2064 0 R
>> endobj
-1640 0 obj <<
+2064 0 obj <<
/Ascent 708
/CapHeight 672
/Descent -266
-/FontName /QJGZXQ+URWPalladioL-Bold-Slant_167
+/FontName /LBYYIR+URWPalladioL-Bold-Slant_167
/ItalicAngle -9
/StemV 123
/XHeight 471
/FontBBox [-152 -301 1000 935]
/Flags 4
/CharSet (/C/D/E/H/I/O/R/S/T/U)
-/FontFile 1641 0 R
+/FontFile 2065 0 R
>> endobj
-2141 0 obj
+2706 0 obj
[722 833 611 0 0 833 389 0 0 0 0 0 833 0 0 722 611 667 778 ]
endobj
-1627 0 obj <<
+2047 0 obj <<
/Length1 1630
/Length2 6133
/Length3 532
@@ -10542,7 +13161,7 @@ xÚíVuTÔí¶VA!¤†n†n”.IéΆ˜f(‘N)én$†FJ Á!¤[:%•$.úÝï|g}÷üuÏùë®;kͬ߻Ÿ½Ÿýìø½
Òy¦§aáèha …«pJí•Ž H
±@Bá0Y $D¤±ÉB¬@¼¼ 
µµC‚XnxXÙÙ9þ²ürYzý‰ÜD" ¶0Ó̓;Äîì!o(þ×ZiÙ@! u %5‹‚šHƒ¸Þ¡áf鵩@­ 0„dw9þq
-³rt³þ%àÆnÿ-ÈÙ~ãátƒÝiÀH„•+Ô ºÉª!+ÿ‡N¤òWnôÁmn<­áVn¿JúÝÐÜ H ( BB<‘¿rYB@ÖP„³£…×Mî2gWèon(Ìö/ Wˆ­…«µ#¸¡¹áþÕ¿êýSõÎÎŽ^¿£á¿½þ¡ŠD@m¸
+³rt³þ%àÆnÿ-ÈÙ~ãátƒÝiÀH„•+Ô ºÉª!+ÿ‡N¤òWnôÁmn<­áVn¿JúÝÐÜ H ( BB<‘¿rYB@ÖP„³£…×Mî2gWèon(Ìö/ Wˆ­…«µ#¸¡¹áþÕ¿êýSõÎÎŽ^¿£á¿½þ¡ŠD@m¸
ÿóü{é!Oˆ`zn%lŸš‘†¬"Ïéé—5úÐÁƒÑâ\\£ý:ß¿Þî—¾(Rf~QÂU;(zÕä5¾í|¹ªÌ¶ÖÛAæÈÜž ÙË£ò¡g}ŸO4ÏôNˆ}-lZŒŸöU/Ê{LeÓP[wm©_ó™iÑÅ=àà;>WìýSVz÷|R†g_«”·¯´ÖÞ"®*ØþÊ”°yzÂÜÕ÷±§»ýðîûUJöìW8Œbî˜øL‘þ.Ù”O uJåÊߪݎË;BbubÁï<_^Ë¿Å`i¢KÙÅy¨yc@–‰Ÿ'\;ø$·®Q;S-”âs/, 9D¦Ô#,9ƦïKv²±SÐúê¿»èçö‰%…÷²õ-âÁ]3ëãÝ“±Ñ][™CæºÊlëŠÑLü‹¦ëÀ¢€5‘ؽrô›ìç3üÜ°˜üDÑSjÛðôä)Wï8Ž*öÜŸèž“3@'}~+ÏÝ6‘žˆ•Ø\Žpµ<züuÚ>AbåPóبLbZ÷a3ÒYÍEœVÁ= ¾‹­{·^®2<¿}5aq€©ÿ_5¹Ûðòµ÷>›À¥´ê$C}ÀXŠ¹­œÕ÷ji—û­€G‡/§Œdû-!j¹;Ë6#ÔÜŠ.Oé­×ôÎc´¼$z¾I(ñØÇ/ Wj®½"¹ßKÒÿ¾ð{Lš¿ÞH¥hԻí:iÓFRF<g] Û39}—ÞÞF™8|à0­‰å
b݇a›yKÜ£%t×TcaÖËF˨?B:äÐ 3ÚZP ‚ÌÆŠ} fñφôˆƒTU‡J鉽žj:»«Ï‹ºôN)/ÂÕ äE½¬^gº‹ ^/«k¯&6Ö7%³"”-ήQËòÍ“ ñÆ‘r¾“'#
ñÀèHvo»Vüy½¼Òç³³”ÎjÁÕŸ,_Âh^§–p³/â#Ó„HÊÀç„»ûÄŒ[‡¤Ê»B8Ò¬’%PË ™#¹&}Ô7uo(à–îu•úµÒ95ÀŒ¾?ËêcÕ8—ÄñâθÑ,™ê:f”†.‡Ðà¡ÝõÁ41hÀ›3):«;Ícƒ·ú‘¶Þ,èðY½:Nç5u…QEð ‰rŸ–²ÌûŠ!&.ÜYâü×É ú;á$¤`×yme~b©@{•3*¹
@@ -10560,129 +13179,133 @@ d ¯òˆ¦:ôw
ÕB¾ª\h~8©$‰¼¼·ý˜7!g;É¥ƒ\®cf>}7›ùâžÐÙZسãÁÖ–Ü^-Už&(
ÖËÓ»ÜIFÙØS­˜õOV_ºhýÐn-®
X{$¢½‰¼û£@–rlZ™âɞˊ1o(­¶¨mèö¡Ðé»÷ÝõäIŒ]Œ_-ô‹ ¸Þû ò'zŸT¶n76Gت–·& úìIĆ‹7ÎÔ‰‰f¾<B‡›&ª½úŒ×ž´)„Æc+¤ œ?µÆ(_¹à™ñ0áNZ¬/ˆ_c24íŒË¢—'{.ö¥dÖî§Çz̓¯ÛKÃ{u`‡:s±¹ Á<º'—0— HMq±LåRnC@x›ôs̈W6ß>uä3¾õˆ;)EO4,Źk&l‰#õŽ¾„˜¬Ù¶³ ½höâiF] ‹œx'´ÅfÊb\ñê{Ý?¬¹¶=ê3¤XTÕW©*®§‰\Ee¶©x‘@†Dz:ƒ!¡X¾ÂK ”G½èß>c{BŒÍCŒ±¹0šUÕ¼ƒ¿ªÝ•5xfœéÉU“Nhèòã»Z–$8û훎·òБÞåú¸;ß¾2~%~QÍ÷*|6οÀ.©ó¶H&l]ážçµÐ[èù%¥κƬ!ÙrOxÆ!.B˜“zuW,Ôêr‹9å™ÊT°CHÖ‘_e‘‰ÿð:û5r€û3.ñ4v—W”ò]ª[)ïó–äÙÀ—݈H¾ÌûùSŽ¸+¹ºfS4çHõ¿ÞzyàÂ*/ç%Šâ׻͠Ï8ôæãmº'7…\ì°Å÷K)8ÐÁ@£bÅî\ç±ÄÝÊ‚×[g“©»5é«ÅÖ¡’'¯ÔíÌ¥ºégˆ<‚â¢Ï8TŠqùœ_U å=¢¦#fœÞ*ª6í¶²*æ›\oi›–•`ûlj[ÛW*ˆ»ºœ2Ž(ËtŒp{ˆ¥6Í]š†}„¯>{?'CÆà§5zíEëÝÚÓÞ&vø¾öŠ ÷dYcØL‰8àÇÉu°à•GËÝšÎñtûëV²­ˆ’eÓëû­&KÅàჃ‘oS*.m•»8ÕîŒWQì3ÊDÌûj OpHY²ï®f>×¼ù‰_ôŸö‘Ƥ‰´»ø|EÀ’=PzêîXDƒ%½+C£ˆ1_ù¶‡=AýYœ:&Aaú;æ¬U¾öÝ*“ÍXJ·=à²ùˆ1¦¬ý<ð»©,|# O'Cƒµë“M]í¼æf°ºÜS4‡AÇ÷Mj€“Ò·ÐökxõÊáž™ËG‡ÞÕéú,óÔ92‚¬ ߸gp0o9)ÁM£«&ChVF=Vv¯ñõ­Åž¡üÜÈT·Žïvä(Ê´ãé¿7jzä­ ¾¹Â6]E³ÚŸÉÞeIGOIùç…&˜+ÊZ Sl©
-Í`ƒ©c½G¯Lsé:JθÿÍàÿ þOX9B,\‘p' WÀk yªendstream
+Í`ƒ©c½G¯Lsé:JθÿÍàÿ þOX9B,\‘p' WÀ^CyÆendstream
endobj
-1628 0 obj <<
+2048 0 obj <<
/Type /Font
/Subtype /Type1
-/Encoding 2140 0 R
+/Encoding 2705 0 R
/FirstChar 66
/LastChar 78
-/Widths 2142 0 R
-/BaseFont /ZEMYJB+URWPalladioL-BoldItal
-/FontDescriptor 1626 0 R
+/Widths 2707 0 R
+/BaseFont /ZMEPZW+URWPalladioL-BoldItal
+/FontDescriptor 2046 0 R
>> endobj
-1626 0 obj <<
+2046 0 obj <<
/Ascent 728
/CapHeight 669
/Descent -256
-/FontName /ZEMYJB+URWPalladioL-BoldItal
+/FontName /ZMEPZW+URWPalladioL-BoldItal
/ItalicAngle -9.9
/StemV 114
/XHeight 469
/FontBBox [-170 -300 1073 935]
/Flags 4
/CharSet (/B/D/I/N)
-/FontFile 1627 0 R
+/FontFile 2047 0 R
>> endobj
-2142 0 obj
+2707 0 obj
[667 0 778 0 0 0 0 389 0 0 0 0 778 ]
endobj
-1396 0 obj <<
+1441 0 obj <<
/Length1 771
/Length2 1151
/Length3 532
-/Length 1712
+/Length 1711
/Filter /FlateDecode
>>
stream
-xÚíRkTSW‘ª¡¬òRIÕzX%2yj   `,žò˜{CnIH@Ä•TeYÄF—<EE©°ªÔJ-±
-SÀiaËqªUð5¬««ôç̯YsΟ³¿ý½¿óMóˆ’1D¶ÅP‚Áar„ X*•pØ€<³Ù-‡å‚¡!rŽ@à"´jÀ]Ø|!o…ǧÐ@0–¡Ç‘4¼‚é“$>i`QÈQ •*XCÖPÈÕ@†)˜Ð3H­ë&od‚up&ŒgÁ“Âá
-9DdÄ@PÖXG*f1QŒ ¯
-¼]µ~´rÂÿn÷„6ßõÊHQç/gVH•Ò7‰²½©ó•Ùz]×¼ìæî²Nº`†×Ö3Ÿ¾ä~uÚØ´Ùf¾F}g«êØ~Ýõjx¬£†³%N ã>?ßY`÷~nQ•új\Z?¦Û_^fí?ºóRv̇…æ»^±îeâÒ׶ ±õC¶åI‡¹B—&ESƒqÏŪÇcÕÁxYt¢ývÊ–ˆai}ã‰Ý;8‡T9%Ýs [f-ܹùg·Ç˲d•_¯8Ï/ÈŠ=Êëœó½çâb¥äž*×L»'î ÏyøÃÐ{ö!£KžÄ5¾°ªúÎøV”H†¯t‰nµí¡Õu«›kÊ
-÷HçÖºlx/ÌépÇá5'ÿÝ%¼ÏÚǩˈ—¯O-wûVŸZÌ é1>
-k] ¡GZ±Ç5}M.íÌü|QYP÷]#ª”ÆÎëåù¿ 1²FêD{õþ9œ˜|V@û,|±ÀnÖý®&|þ]j p삸5ùZï—£kwò_Z’Yôäb†œXÕÛgÙø4;êpA5µn€ý.Êÿ üOP¨a9N`9žNù7pQŒ‘endstream
+xÚíRiTSבª¡¬2©¤j=,Œy5„„1 ó$1÷†Ü’ÜK/7”AÄJª²,b£KFQQ*¬*u@©%Váp"­"<ÂòY¤jUœzÁººJ¶¿Þzçü9ûÛßÙû;ßÙ4·Caà` %&G¥R ‡ È3›M¡ÑqXN $'`!à^`µV ¸+
+9
+¤rBkÈ
+¹È0z&©Õ`Ýä °΀ñLbR8
+l€S”šÔ$A•à¿!múÛT&Œg¢€Ç”L: EBªÖVRXáÙ &µü²¦ÖªÕárÍdù)§þ’—kµþw¦I×0¤ãètj üFœ†­fzVBÈÕˆB„¦ªaÀà¬d²W¾Á‘Œ`DC¡P¥\Oá0
+MWBú7¥ƒâùû×N%#äJDêÓaÀþƒ=sþˆI“pDØL6›CÉýö”4­™U`‚¦.Ï Èq\®§CDF<Í
+Á:
+-ŽÃ(15>¤Aoc%Bz
+Ã:XA1ßÀ>[>Þ{j[mž¸ºë¨-=c¡ñð–Žs[O}˜Ã}>N×ð¦"á~uÜêø1rÌ¡t$ì+¤äõSO‰rLÙ2ÖÖ^G“½ ½rŸlÖÅpbòŒKåímïil¿k^lIoò|ð£ûÓ;™çlë×Üãð«¨#E3koÞxù8/mcg¿ÙîKÈ}¨”’T~zÍ8ú¿wŠ¯LÜÁª1sÍ¥ù‰ûž:¿2SÛn÷¤Ý²7
+ åR›ëFßsØtr “ÂÙŸ¶Ø[&X-Î^èu-ºÂ¬Þ÷u3Æúµ4‡I™=ØM ºßí‘ä–†ÆH¢F­tRÔ.Pû†ÔP­á†¶øVz¡ÐÒ°¶À)­¡‹ë[ÂIoÚC[—2þ’öë’3Ÿ$=Þ÷ìµÚú@‘ífåz|FŒ§÷~ÿLÏaz›j{õ3“[œ\õÅ]BäÚg·ÊЮù·ÿ@N˘Ä
+®ç»Ü8ò™»™K¹'×ì­ø—4ÞóëfÓîD±ÎJwýp êáÏ[ û¹ÉÁ })g"oz^ªk<_ä\W83ÉÔ\½¤y6Ö;0ßÍÏy¡Ï\Q¢%¨vš/ôèŠï«Îæ8ñ&Æzèyá3ôCi”©iä°×¢<Û¡Í Òv2ïG.ÏöþÅæ\X]Š¾Ë»î„éûyËöB‘9Œµ{ÓŽÕ†ÕnÓè æì9*hxȱ©È9ûDÔü²/õaŸ.§·ÓÖ_®{D8G<¯JaâqþgZÛPµÏÎäžùh=Ï'1õUßáuk²wm|ðèæÊEÛ×S„v½ƒjºøÓÒ¼×[F{C´vŽâæŽ3z÷¨ñö÷ýˆ`póÙƒŽZwßد–úµRëÏÿglÕZ×Q™ÍVÇyYLР–*M r±\
+§z˜]MRço%O\QSKºa[0A;ôòDui4+Ïһꤗ±f¬JˆÊ–JN©—[͸=sìq©«å)¾éÀÕP~cÅNÈÿVeDühå„ïî m¾ó呢ΟN¯*¥¯d{Ræ+³ôº®yYÍÝe *t -§?ÊþœûÅ)CÓ&«yx¸$úÆZÕ±íšó•Ðh{ gsŒ@Ç}v$¶³ÀæÝÜ¢ÕTê'¨aiý˜n_}h™¥ÿÈŽ‹YQïšîxD»–‰K_YÇE×uX—'â
+šM †ÝªJì?ŒVâe‘Šö[É›WKëï²ÛÎ9¨Ê)éž[Ø2káŽM?º<Z–)«ü2Þï¿ 3úl0¯ßηU”œ{b¨X\s õ®¸74ç™ÿwïAïØ.ysÆXTøÜ¢ê;í]Q"¾Ü%ºÙ¶›V×­n®)+Ü-[ë´þ‡C—…W|wu”tð>i§.#^¼J8¹Üåk}J1'¨Çð0¤uM„nÅ‚ìÃûšœÚý™ùù¢²€îë;GTÉ×ÊóB£dÔ‰öê}s8Qù,¿öYøbͬ{\‰ûô›”þàØyqkÒÕÞÏG×îà¿0'±èIÅ 9±ª‡7ϼáIVÄ¡‚jjÝ
endobj
-1397 0 obj <<
+1442 0 obj <<
/Type /Font
/Subtype /Type1
-/Encoding 2143 0 R
+/Encoding 2708 0 R
/FirstChar 60
/LastChar 62
-/Widths 2144 0 R
-/BaseFont /UYGAJA+CMMI10
-/FontDescriptor 1395 0 R
+/Widths 2709 0 R
+/BaseFont /KPZHNG+CMMI10
+/FontDescriptor 1440 0 R
>> endobj
-1395 0 obj <<
+1440 0 obj <<
/Ascent 694
/CapHeight 683
/Descent -194
-/FontName /UYGAJA+CMMI10
+/FontName /KPZHNG+CMMI10
/ItalicAngle -14.04
/StemV 72
/XHeight 431
/FontBBox [-32 -250 1048 750]
/Flags 4
/CharSet (/less/greater)
-/FontFile 1396 0 R
+/FontFile 1441 0 R
>> endobj
-2144 0 obj
+2709 0 obj
[778 0 778 ]
endobj
-2143 0 obj <<
+2708 0 obj <<
/Type /Encoding
/Differences [ 0 /.notdef 60/less 61/.notdef 62/greater 63/.notdef]
>> endobj
-1136 0 obj <<
+1430 0 obj <<
/Length1 1199
/Length2 2269
/Length3 544
-/Length 3057
+/Length 3056
/Filter /FlateDecode
>>
stream
-xÚíWi<”k2ed_â!˳ØMe['ŒÆNeÌ<3†1Ã,–¬ÅÉV–É’#[Ñž%ÑbJ¡Ñž’(EY¢SïC§zO¯oï·÷÷>χ羯ÿuý¯ëúß×ýáÑTÃô­ÉÌ@ОÉàèch,àB ä² DÆVým •ëÄ!Ò0&Â55Ýi:¸¬ Ú²@"‡ÆdàˆÈÇ=ˆ 8Y€À ±h3¬Z£ ¿;2YX
-Táò™[fX4‹F â
-'/úâ)D;2³Ø6€âp°(T…B6$›‚d€”T¬ƒlË ]$`ÃõÃÑX j,µœ†! f$#fYˆBc—Ú#sÃP Z8tÂý
-¶»(„œP2*6Ë+ÆáoYÔû­t^)š­d—abnÓ‚\-%"%蘦øyz“ víû5ˆžIt‡bÎ~…‚’׶Ñ×ß©ÕÌøhZØÞ–"¤2eÖÍù¾ w…)©Ô”× »Žè˜ËÍ'M¸:ÒãÝ°°{¼V:8ioÈ–Ëçî~ÒÞâ+rîͬt]‹T@ÿÀUQã„{©pNãû@%Ÿ¦ØÖÛ— 惪›(ó§xaåÆ[ ·‡=Ðë>í…Èx—Ôj£{Xæ÷Õ…dïÝ5êíqÕmUJoŸÕÑļÔR¹¿Ð¶·MTŠßÒ&$ ¨Ù×Oš+¼œ:RçlâpÆ›¬çm
-„‚“Çý+QùXP W±
-V+î²ïÌêÔ`_ðŒw8O /L(î³¼ªWÔûlÜ{óZÍiáË>™1u
-W»Gí'oÝ\%7rƾöö:¡ŠÊ¤©œ³?„b&TáüqD!Ï¡øtí).ÍñòÌû%
-wV¶šØÍú6‰” ÜÜkì¨0
-Ön»Úd(Ážú…XjwTêÝÙFÙçþÀùñ€L´²ÁEÙ¼f} ¹H=±î…žàÕ¥êŠc ûy:W|Ôf"yÕ=Û{ØÚ¸—£ôpæ IE´˜ýæ|vb.›ûÂ[Û÷c<îõµ3‹0™p2hàª×*?÷Z˜Í>Ó(yF:þúÖþCêãñtÿ
-)å?ÿTsr0ðõ—F›™VF×Ï9~Ðzèt#p¶¯‘ýEñ^Âjd0  |7•ˆ/®Îœø˜“ä+¶BÌ뼤:œVb61Ò’¬ühM÷®Âª0r<¾tþo/VŸ4,RtÈǘƒÇÓíéè[¾Y)Éy;àá„€C‰6{‡„ïÞzӌ؈èMWy° æ½/óÂ]†9Á+¤l¨ØŒÑûË$¯P2A>”šˆ‘˜l¶Ùår÷œuedÇhç%±¼`EP¼>8·E}Ç`Md@xº•hÌo#­<uÓ™SåG.ùU¥çË]Ÿ™£âÝæ_Z(_È!O/ ïð—(³Áöô¥Å(&×—0¤€wgzåaÂ×^ Ú˜³2’‹î Þ.ý¬îbyŽ?¡.Ýo´ý,“på rÂõ*©Í
-‡7ñT_;´K°V%Áh]§ï%Çùqú»†Ý--®u8õŠn½ØüX¿/Ò9­QjñXÔû¬°) ¡,LzÌÓ\`dîÐÆ_Ñ43ƒšnjSnq<#æ¢ »¼WƆ´†YÞX3?Ó>–eëÄ»7Tÿͯ=ƒ¿\,sÒÒäÉÎÁa° _ÂÒO`sÚÃÓÙ¶ÔÂ×+¿Rv|Ö\öù%dÓR„ƒì±ybîQlk«@¦ª9â³ð#ÇC\F?Ÿ=à"0‹ÍcÞ,Øåu0ÏBssz¿Æ®ÃWì|úøòupSЖkúÛCA›‡½olF‡ ž€g¸u~îìº$Ù÷Ž¯ëÙQíz­-=ÕcÁþ¬>—yÒÂ*¹ë(ù#/¾ÊWûöü»ÊP$á`ûPéŠVV²ùýÛÒ/Ÿìžg¥\)9Ä ¼\›¦¶æ×;µJg;gQ‰šëºÓ
-L[ô̸ iö±•b^=“¼täçÒRyéÍ}G®‹±a¥0á VšÚxGßûÇ[5DH›vlx®¡’qÂîM5·:{›Ví–Jì‚A[DùñÛ¨¦UˆeÞî,žÃý‚ÀȳÖcZÄ£*Márn“JVéÍ>œ£€|¼§øÄÒ »«âhÓ°¬ÚÛL­§ „c_Q®>³þ®âÆ"„B#0¯mWø"û¬úv>¼ë.@SÄP&v^îÌ52
-Ý5›õ‰·Çícüžf„„ËMÄö
-E¯ÙÚÉŠ{}$³OÔ¯—X@|Y}ÓÈdLÜ\9a,]ÊÒ5‘,!¸¡˜Ý)¼.Ñ^¦„%§º)¦ÿþþm‰­ x›|wrŸCóÅQ‚£ØÜšž{—ׇH˜²«q+!¾ïfO¤—”É $ártÌX±õù¹±Î…® )ýõ¾+ܪ‚m‡7|(KÐ/¶²d(å¾7*c¥ÉÝ’xPjrè±FžêÞ R*3S/·Ù]ûNÔªdÎX–-Ï2ejßP(Ù­BÐ/mò~ÓÑyA!/÷º/ˆSšB~|£—d—:ùR¹ßšõº±Ÿ=Ëï8Hàm³O=Q«ôPö¡é¹>?j¿Ö¹2Q‹µðjîšõÙUÂgñ7Õ2…úK»äÑÿåÿ?Áÿ‰Yf(‘alè‡rñß þ/h‘@²endstream
+xÚíWi<”k2e$²ÄC–ÆŒ²Ò £±S3ÏŒaÌ0‹}‹(N¶²”H–{¥Ý–h1!²†RQ*Z,Y¢SïC§zO¯oï·÷÷>χ羯ÿuý¯ëúß×ýáQ”ÃâÔ͈toЊNc©£‘(CÀŽâïÍfâð´½êû@2Û†…§ ƒ‡+*:RXTpM´`€x…NÃàY£°Å3
+T¬%hA÷_!`ÂWôÃP j,Tc- ýhô`Zøš‰B#®¶Gdh8Ñ(lÐów
+ „>ðp&>X 6þïÀ?wp4 R,À$CGò“2ƒ¤o{[<‹A <PH
+  VÞ«ýÐáé4jèOw;¼?hØ¹íµ±pQ]«ÿžæætˆV­§¨kêkh4Ô§ŽÖ¯¬?ôø®Åª‹§ü]+ê'¥ D ¾µiù½­ Á„f@¬Ž¶
+ðO~;:‹B
+béLÊʇBtп`Ž>‚ d2¡CY…@ñ—¤–4H¡‘ Q<ƒøðØ ¤ÓêIA±ß÷$
+T"†€ø`?°ó°oÍáúÅ fRÁê/hµè:ÍeËjÓ©\cHîf; ¿2)í‚9ýÌ< ¶ÍǸÚc½íz®„4)Ëd½`?óäF!áx!î݉’o‘—vÙnžÚ„èšFµH¦“ÈÎczw÷¹Šy7Ec‹!\]4zÛ¢û«×ö0)™Š¢*^û×ý*bK±ïíwS£ a½œF Ê7öH6ßž›W~RÞãÎwõí‚pUƒW_ÿms~èÞk8«fÊ[Ê­LÏ°±ã¦æ’Oyié' HgÖþ€aµÎK.ˆä±æª§D.°_½•ˆs=T!ß\Y^ü¾©ôIAÇEôK%™GËMGšø…šxD¡ÕÿúIq«„MK¢y$Fg—Ù’y6R—}þœç9‰Ó2³óa2¦¾ryíV­©­
+ÌëÎQÖ×pÄå÷’GMn«åv?ŸtÝf»YqŽ÷¦NdB@×fÁ¦£ŒmÐ}𻕪„@©-ñ%mã_•ñÖ¶dÝŒ¡KG`‰üDù¶šË§šZsÂf$áîOœtCUñWxò9ÍÇ97Ç¿{ä± þE*ËeÇÛͺÇ3S£Å†7«Ã¬koO «·jøðiUå¹ei4û‚ð ·›e±|zæ/#& õ§öm 9­aÐÆCîo`4Õñzx½;;k|¦󇮕R…SRö Ÿ Ó6ûaíJ¯Ž¦¿:4÷$ õÍ•ÁÜf¯Ð4Õé‰Ãžwßr˜CGƒòjëÛe#0—.n×ÜõÅËUÛõɵ¬bÓ(‰Û¯­¦ïåÞß 6~Ùª²cOqIìñÖ²þymÂßËÂ'9ƒ‡ŸòD%)Ïèrµ+N¥<Ê—x°¾Q×rÁ½Ž¯°ÿþ«³Ÿ@‰×`®ÃÞ<ÕK
+öÌÃÏD¹¥DíÁ>ÒQÇaÛ‘~‘PiÍYIÑÌzuc±`µ-Ë]¾ ä%'–qUn¹]”›æ”ÿõüÈ)3n–ÔãùË$Ñ ÿ›ímXÙb²aÆ We÷Qd¸Ë×>ôB÷½fZ£|³ô¨ËòBÚåš­—…ƒáo^ZÕÒ„>žKò,’îÿóO9Û!k},Û^ûz žnª}÷êîY•‰¡á›{Þ =5Ì/’½Ñ‘¾‚ôE@O0*¯<uàýǸðX÷-붸\Û*§äë¿oˆSó}r¬¢3,çÀp)ZŒ3(œõÛ‹çµr%­ÓÀ úÀ¹$+ª7ªÍ=5>.ó
+ÚÅQÿåÿ?Áÿ
+â,º?žág€Lè‡råß þ/uÔ@³endstream
endobj
-1137 0 obj <<
+1431 0 obj <<
/Type /Font
/Subtype /Type1
-/Encoding 2140 0 R
+/Encoding 2705 0 R
/FirstChar 97
/LastChar 110
-/Widths 2145 0 R
-/BaseFont /DYYCRJ+NimbusSanL-ReguItal
-/FontDescriptor 1135 0 R
+/Widths 2710 0 R
+/BaseFont /NYLICW+NimbusSanL-ReguItal
+/FontDescriptor 1429 0 R
>> endobj
-1135 0 obj <<
+1429 0 obj <<
/Ascent 712
/CapHeight 712
/Descent -213
-/FontName /DYYCRJ+NimbusSanL-ReguItal
+/FontName /NYLICW+NimbusSanL-ReguItal
/ItalicAngle -12
/StemV 88
/XHeight 523
/FontBBox [-178 -284 1108 953]
/Flags 4
/CharSet (/a/c/n)
-/FontFile 1136 0 R
+/FontFile 1430 0 R
>> endobj
-2145 0 obj
+2710 0 obj
[556 0 500 0 0 0 0 0 0 0 0 0 0 556 ]
endobj
-1064 0 obj <<
+1354 0 obj <<
/Length1 1608
/Length2 7939
/Length3 532
@@ -10693,7 +13316,7 @@ stream
xÚívgPTݶ-HPPÉ™&çÐÉ™–œƒº–††î&K(HÎQÉH ’sÎ 9#$ˆ€øÐïžsn}ïüº÷üzõvÕ®ÚkιÆsŽ¹VmVF-]^Yª„p@óùž4`ö–Î(]°ƒ¯ÜEXYå‘P0†pP
G8ÚCзÿãºP(
²BÂÑ€Û¬Z
-JñDÛ‚Ñ¿s£`·n
+JñDÛ‚Ñ¿s£`·n
uƒZ|™BX‰¼LLIB—Qdt (<okbu:æ}Ò{ŸíûÑ쓼,Vôâº4¯rèéMûäŽãÏõg\=-äpöæxèA­3gkö£¶Qî ~ó<¤]ÃpÏà µ%l“Ç+Ú:æ¹×w醄x‡ß9}™]²}IYΉ¼­*"ÉVb—åìì²Å|ý~ÎÞÑÛÝÕÙ|ŒÓºNÉÏ*î‚MÈæë”N#m¢_äa™ ŒéøÛÔªÏ!´0sL^µ$0ÙÂÿTh5ë¹[­Fúù{ª\™ÏíßÉúÐâ¦Ùé%üföC ~–fí*!Î:‰EvýÔzð­´÷Û6гßÕ•Ü 곺£Âgü«e‰;}ƒv©b]ùßÖÒï6”‡ùÚ}sø.Gj¢T«$Kñ£•I âQ–®‹Â~ÒìEÛ1w.ì*Çbr|¬½}$oÖ‡·Gs]> Ã?V1ñŸx£+w¿³^õ9’e‡Ð†ŠÚ¥ÍäÊu””7œœ¸äN­Ñ÷ˆ¨/ùŠõ.‹ú…'Ð)á0äPùÝÚ…ke
¸éÛR§ö
]8sô&sß±­|*åŸî#>cÕ¯‡‹úœ‚ œEëÑymeê÷AÆ€>8m„ 1œ4¬jõõr¦XÜâd8„²³¤¿V>M¼çÀ7ÁÜ&N\€*ÄJÒÜOµøï8•^Ýçôáö¼J%qõ‡ ‘®.µ&у;ìXBÒ0ÊÚcVKŸ0-SÛ·ߌG?óí·Eƒòñ(€(§¸Ëš’=´øô•ú+y\J6.æꔋ‚œÞ»ó^eúÞ‚·V„(õb*$Ã=AÁžéÌmEéïa9žoñ€Rý3™ÙÑS×!÷8ÎãÒ9‹ÅÕçÜrƒÅ£‘C™Äù\‹-ÕÕ²k±ò¡øáÃÍ8
@@ -10725,361 +13348,356 @@ QH;ǘ¢&šùŸe“ô¿žUÙ|µ°Sc0R2YE]¨
‡á{__bçâ.°ßþ
LóÃI8GU–¿Bã¡\‚–Ÿˆ{éõ´Sû›7M‹Š–…;ûÛ䃵h¹0GQœ&÷ <‹"œ_ý¼ÈAze‰ÀN2ÿPÜJ"u]©¶ÕLòs.}æQùü‰iõHö5¨ñ‹‚‘öqLðëƒýUj[’ =Á®…1Ñè²YÆHOŠåoq ’„!¿‡RÒ¯¸ð%ê«~u¯ ³¿0Š×·6î;>nE=m½aÔ\{\ÄcïQq”&T/bµ^þü‹}m“¹ò A’ü陈×O/ÍI>c×b%ÒÌ&ìýºªú· ¶mJ;û7žb{ª6eC‰Æô_è<@ÀbW’+Q'‘šäçÚU›‚ݧ/ˆ+ƒË°a
<¤þdÑ _IÒõ.˜ê¢Ï\9¾§é-xÚÖ-9?›ìÐv_ wóý}¾éH`…Ñ'>Êß4¬>äŽT‹¬ÌÛúGäµGÔà…$Í ï‚7LI›u`žUJ2ì„΃79ç¯~f´lá­ÊΚìïW 5?|¸':U—.ûrJo ÇÓlÔË5áAÜçxE ³º×ا‰3Ç•ÚTñ#åKþtâ•.iKW@ö/É›ÔÑ÷ ûj&Q ¦Œ²È˜¥t°Èð§Äh-ؤ1íý b?e¾™F Š– ÉXrÙ/&Šjz©¨rAÁM°re.2Òe%ÉÍ£™6"5[¹(H4 :\mdb“™[i:ýP½2“¿Ýä÷ö0JÑ»pÕh¯QšQ¨ý±Qó_»Ã7;mþã«÷Aú^ÁÐ; Ó èvñ¡Õñ¥ã«*’Hóß¹,QëtT½}…ÁbWý€g”ùxÔ$Ó¬GÞ×™®'}¡uÞói õ´’D§ùõ; ¼xðÞÔ¡Æ°~. °öâ%ÅÅ4O”˜»ª¡ Þ»Bï­\ÿÆÈæ 
-†ìvm…$t§³ÎLd?莑ˆ+í–«I&VñZ"-¿35MGöÊìä§7À Ñ4‰>ÅauA×W¯½r‚…`Hã×W{Ûw1Û®­¹E¥^["W¬%BŽ… >«íÜMÑ#nNCuy‹¼Hû %Tž,TÜþ0]4.ïdîžk0œPañœ„5ðY ÓëF–?ªU'?Õ‹«žäfü¸Š·Ö¤qCr®až1j,†º¿÷2Ó“=²õáÿ¶D4ÏØeÊÀ¿I Üóv¼vþ´b„dîÿ¼ø)xý)\+"oÜ´¦ÜD1å[|)h$úØûeGUeŸ?õ¾†Ó<åízznKB†Éd–¬ö…Àÿò!øÿ
+†ìvm…$t§³ÎLd?莑ˆ+í–«I&VñZ"-¿35MGöÊìä§7À Ñ4‰>ÅauA×W¯½r‚…`Hã×W{Ûw1Û®­¹E¥^["W¬%BŽ… >«íÜMÑ#nNCuy‹¼Hû %Tž,TÜþ0]4.ïdîžk0œPañœ„5ðY ÓëF–?ªU'?Õ‹«žäfü¸Š·Ö¤qCr®až1j,†º¿÷2Ó“=²õáÿ¶D4ÏØeÊÀ¿I Üóv¼vþ´b„dîÿ¼ø)xý)\+"oÜ´¦ÜD1å[|)h$úØûeGUeŸ?õ¾†Ó<åízznKB†Éd–¬ö…Àÿò!øÿ
endobj
-1065 0 obj <<
+1355 0 obj <<
/Type /Font
/Subtype /Type1
-/Encoding 2140 0 R
+/Encoding 2705 0 R
/FirstChar 36
/LastChar 121
-/Widths 2146 0 R
-/BaseFont /FUNHRG+NimbusSanL-Bold
-/FontDescriptor 1063 0 R
+/Widths 2711 0 R
+/BaseFont /GAUYBT+NimbusSanL-Bold
+/FontDescriptor 1353 0 R
>> endobj
-1063 0 obj <<
+1353 0 obj <<
/Ascent 722
/CapHeight 722
/Descent -217
-/FontName /FUNHRG+NimbusSanL-Bold
+/FontName /GAUYBT+NimbusSanL-Bold
/ItalicAngle 0
/StemV 141
/XHeight 532
/FontBBox [-173 -307 1003 949]
/Flags 4
/CharSet (/dollar/hyphen/semicolon/C/D/E/F/G/I/L/N/O/R/T/U/Y/a/c/d/e/f/g/h/i/l/m/n/o/p/q/r/s/t/u/w/y)
-/FontFile 1064 0 R
+/FontFile 1354 0 R
>> endobj
-2146 0 obj
+2711 0 obj
[556 0 0 0 0 0 0 0 0 333 0 0 0 0 0 0 0 0 0 0 0 0 0 333 0 0 0 0 0 0 0 722 722 667 611 778 0 278 0 0 611 0 722 778 0 0 722 0 611 722 0 0 0 667 0 0 0 0 0 0 0 556 0 556 611 556 333 611 611 278 0 0 278 889 611 611 611 611 389 556 333 611 0 778 0 556 ]
endobj
-1061 0 obj <<
+1351 0 obj <<
/Length1 1166
-/Length2 8686
+/Length2 8911
/Length3 544
-/Length 9500
-/Filter /FlateDecode
->>
-stream
-xÚízUX\[ÖmàÜ¡pww—à.…+ pªp‚— Á58„àN°àîî—
-ìhùgK–nÎì:Ž`7Ð[™ÿ ~Pþ…Yƒ\¼\‚\
-ò[^(>P3wÀâòõù߉ß¡pr,Á®
-{ 9Ø888Üÿ\¿¨¥“£½×¿ÂUÍ@
-òrÿ]ñŸ^üåߨºøêäø—ä[G+'€à?Úyññ¯–ÜAèËlþcFÀ¿ë«:¹‚-@
-ähù·”²ŽN–`Gk€–ëËTšA,ÿ üA[¸A /öüy@/ïþµ·¿y‚,Pçœ,„ƒmk‚[oª$I<XwƸ»ùt®žÝ(xP¢ía¶Ø`»T íJIxr $eɨÛˆU©ÀÁ„Æ‘ÈFó{Ø Jµ±!bã„`Ã*D³ÕŠ¨
-¡!1Lüâè&ŽÿH˜’s íÕ§pJYve@+&=Š­ê„çOvÜÛwQC !/Ë/GVÛŸcÄ¿ <QS°÷ÓB˜l—á° KAUìh˜¼¥W¢6_ã”·a›ÎÎõH¡óúÏ„Ê£¸Öœ™“”ò µvpÝÙ|ùfuW5èœÏ«Èmì¼ÌÒ›ˆj˜·Ù«ÿ¸ØÊl燅ð©·$Ú·ŒM”¼Õ8P!B ¸éXèC•ÔÑtÆ<ÛV¦Ò«³.ŸU¿"ïVtÇåþ´Q«¢ÓeYóŽbÒ¿ÙZƒxS›§ñZ§í\O2~«{E3
-\ßâ»Ü&âéy.ßSÇÊë<c×CÜw*⚤Kø0ݪ¥¾ÀU×”s—¯ÜŒÊr¯Øn g
-èØœvèkwyþÚ‘72çٛ斥‹ÚaGæ¬å`[B×Óà‰ññÓš goø$ÝöeßOáj@³pLñõ[>(™eÔ]Gþm!2¢ë!D
-[D« “-Á'u™¯nòŽ<'Xð"Yeð&­ øc‘#Ñô,åKXÈm®_l™Y¢o׃GÐoR:©‡;Ѧ¯êJ³Š÷ѧ‰mŠoâºë•Bå‚n‚‘7Cj¹sD¼˜<îcØGÌàwÛlÞ—q+Z/½²Í"^Ø|$Go-ÅlêØTåPÛû2oT cÚÝŠùýüÌ yÚô~8!4}"–öj6ä äkÝ8x>9"¡EVj› Y
-˜ñ)l¾ÍkU¾q¥DÚÌå¼S2³òOyÍR¥vHDShÛ!¤ÍÙaæÙþá¿U ¿ë-¿ku§zIúèçÝ ‰ŒPËi‹.7
-‹\÷+í°Zû²Æß5eEmüØyò£ ¿×Sewœ•õ‹k†­bטUÊA-”Šß »,ÎCz7†–#œ$%Ïɶ$¢Å*:ú8¬û¼!Ì·ì«%×ç[âÁÄeÂ[³6æÂîŠî×ÙšÀ³õðù‹Åôm›Ÿi8e>Hg33nlGº®3có€_ê0µihù¡gÊÀäxFnPê¤ëηk,4K§ͯ_MKíkû ß 6ÚÀx.a¾+íÌå”o·gKR™¥ Œ’H!ÚèE=é_–9ºã4? kûŒê‰Z*¬ wøŸOV#•3Ul# 2µÕ¾Aé£ßÚ¿d›K€–¤–g§$ýæªâ'ÚG÷nAüùuÊnûF¼‚›*ñƒ5_ /NŒšrþj{|í lÎC¤r è·Ív¢âr‡"¡þßù¦…µš6#qØFn²‹³9ôgåÉŠEg€+Á öÊL–¡ÀN,@‹%8]è:ÔÊñ»¤>$5o5Ò"“a£ø0ªÃ4v~Ý«¿~õðõ@÷܃3/qviùk'´-âzÞ<öë#n×
-yíó»Ñ€:+ÅIÄA=ÁÅqÇR&…{Åšý ÈÉô\‘Ñ›ll„%Ós@÷j¢¥”¾ì{P¡
-“þ¡•Æí‰÷@@P‡‘»‹©ÝeÓ¸­
-ÜÜŒ”9rƒéÔ˜OÓ[¬™ï!)-oB€û³}‡rñ.ïÞ%¸ÂÙõ@
-º" "†9ûˆÄ«@ŽŠê&z
-§/ÔÂŒV‚¦¢PŠ\Ký`a0Œ¸É0òç?æˆn8Ô&Òm†_Ž'{•ƒ
-ÈxìúYxU‚Äb/Ö[áNŒe­pŠÞŽéPS{Dí÷æØ*÷¤ë½þ[@ìŠô`ŒJ´ÝŒ I¢ömu:¶>ÿC˹@â!±S „Á‚Å5ä!4ˆ •ï¯ÞÄü65ûö£¢M#·Dž^ëgœÒ–óÖp|Ø.õw®òž‚ö§E¨=z¥åÆU²ƒ¬]!áß9Ø)'ª’,4в¨XûrYuPÖJÙ35S1CKX{ûºE†å™ªwïÃ(aÁÛè|êÍ tþ MLªe
-ÕS”Åzo¢É-Ê–¯‘®xg`ùÕ56b]¿¶Ù0-÷9§ä:Э4•/
-‹ÔÈN¨ÆÈ›ÚM„XÉåxÔʈ•xšê®c€‘˜ç$KÁT@üäÛk? ÎT˜þ‹[ìöÀØ”†©´ý²Û7Ç´c¿ÆäâÛê̈GŒŠÈ9ob»ÊŒ¡˜‚üDò÷à-:=N&”b¬Ö,áämŠJ-)¸‡0&Ù{Þ‹zîoHª¿^ûûqN:zá¹HÏâxFbq‡Ô›–wˆ­)ÔµîNØUOíãõ¿ÊwáõAKŒðÉõñL
-ˆ°S‘bð(b¬Ùj›_äá~5BWg<÷7©<Z;‹‰qfvèrBÙW†×KïIl¸)ý1·—$^‰ü“ªND ³(çiºVœV÷ù'±/ö³Æ”ù¸÷¦‰0‘1úµë4/‰[&W£„Xó<ÍÜ áÌzêMë"a
-ú¡ÖMz*xù³Ù™Mœ%˃­ÚUºîC<GëÀ/j °ïÐ’žSäsݹɑ²ò<;/Â& Ü#Í ÐfW8­U†¸ãCWÓV³Êô8½dmÏɭÇ{cÅ®]0­V’/|hÐþX×›fWÐó¢‹×ºö•­‘Î(ª
-!›Ý RŽ_hJK`*twé½Âð!……܇î[ ‹–4  ÚohëðåŽF(]F< Æ©—G©_
-Äê~¢)cGB‹/U¸sP8®mØÇúÒ¢¶`¶Tø`M»"²€œ<Tûh«¤×èÜN%’ŸÆ
-!èµí{8]$W.ú ±ŽRç@¢¨xÀ‰–äð-Aì®°° ˜¶VPPyéëÒ$ò±œpxÚ¯ JÌ‚vÔÀ¢æø“µ$ߣ6ÌK2´ÅŽfPiŒœ™åϪÆG:+-4!8`†©7¬þÀîºNíÑú‘m„~µ5I*0ÿ;¼aƒ°Ü“ÆŒœV:ò³iuxQ‘ÀëéÐ
-ó6-UNy"Œ‹4°™L;ù4±IKpVƒœÀÞ¤ºT ±ØâigÆ%^gÞg¢¹ÃXGÌs§v
-å-òý0òe [¿½Uey Z ŠÜƒ‚¢½šý~Îƹ©Íëw·ï ‡rø;)¶loXë[–ˆ;<ªœ‰¦u†¸,‹#ˆ¯ ±Ê4#Æ–LkžE{èä" Þ{WMÅoão~ªJ(â¼þíÈ?ÙíÛqLºdØmM¢1ö?kæQáo•d‰e ùbÓ
-mUm‡·Ã—ó»@}[ñ½óþw8u"n‰m´ýºß­>?¦ƒé\Wm ázCFàS©þ|í™1ú¦
-(ÿC–MsÕXAr^Ó17êLÙÌžlõ­$/xš®X;õi¢¥=bøŸ1_mb|L½dò¦Üw'>z²ò‹O¼#Ìÿ(€5¸ÒC¬Tpy½’kô:Fd‚yÛ¶±Þ4ÙÏi#¦ôâ^ÑpdѵˆÂú#¬áæË”CbëÁÃ%1“}`5^'\[v¬j ‰vý¿ÆÒ›Û'5\ë±IN"(Û D\ã 4˜Øa.O/;ç÷g™¥XêÄêÜŠ¡šWOWÈVå黤{ýg›ß¢‘ÕR÷w¶¦ô$Ÿ2Így0iƒCif0kgÓm0qÎS.Gp·Â‹' è§ûŒ”nÔ,=&‚,bœ”ËUƒ­üøèpß.Z®¨È À¼®¢O6àøŠÏtó¾I›¿Å˜ÑdGŒW ;VÞ`š#L†ÑšøòtÄ’Ö‰àŹ|Ì’ûÎëžµ¾H°gˆGEŒ²/l“9—w^e ™A]9|LÕX/öU)­;tT#é³/‹ñ«¨ƒ0\Í!ñO¼É|®Îiæ*¿ªV#”±Þ.g)óøá¬]Ú­Å„‹©(üŠý8zËÞ³e”R|6T…HP£l_›UÔbyv˜{²M6öJxEuÕ5½µlŸ!rl‘ĬïD+«<]á¶Z†«×ÇåmT 'j½‘3~jÇxݸç'3Úµ&ÒE…ˆ.š§.ÿ÷| Êu´Jë*‹Ä6·W,
-mCC$³%ɺ¿¾rš³övž]%ØZ™r˜äkЄäªUºN %U+þ÷Š¶[÷þå°GgÍýÉçà¸çaÿ¬Q9®èB€¨¢â&vÚSó
-­s3uÇ…u’Õõ ®]Ãý=rY˜NÊåGÔdÞi<Ô+ßoÆ‚’ôó"hßÇàÀ¿sUòrE© Ñ{zØÞkpO‰(b„ær >_e”iqÎÑ ipemë…¦Ôobæa-Ƹ±.Õ=ò’ó”èÐÅã?0Ábxºœ{ö¥]æÁèo‘êËä¯dŸt
-½Ä»¹MmÎG“¯ä7ñ“Z4š-W!ׂçØù{Öe–”7ÁRš5\ÀÜQ^jRòR©éLYÐ9)˜ÀUnoꃶ:6Јàn!_¾]‹¨'­B xÒƒÅv{FWÚ„3¡jì¨cn$“@¼y\ D,B@nš¬ôÇÈpiÍèïï°FÙ|w‡4D<=Ãa§w&ª
-,;.Q39œŸ£K÷Uʃ™/!Œ
-j6ïàѲËY[M'㣩ëÓ3ëK)ÎdâˆE~=‰ÓÐâZ1ŠY±SÍçw¿
-à¿(žÃÙÁY>P
- Ã{Q”(õ¦ú`í|ª[]˜’·.YMðÉÆ–™“ƒ]ZÜ•[NgN»Ã‹¨×ê-Tt×n9ÑB{^Ù¤â¡?Á’#]ü–KÝcôƒvÖoÚS)ãPß7cï·Ž
-_™v5Ìh­a6ÃŒmäs\mµ1;×Û,¤æ‚pVƒ?Qñ:7i‚ð,yK%Ô‰‚/²Þ4?à'…ÒpV¥ú®”ÊYøÖåw»:/û 0JpaäÒ´øm'v¼ÝŽ[#}é<‚ú$OY°ÒÃ^;W ‹ƒô <
-3M©VÞM` €o³z˜ ™Z`¦›E?É÷c¤«?\ejÆö>îÆø°Ü·M• BöºI@;xl¨Sã0¨ ûŸFTWIƒìg#YNßÙð~+\ @O,¨­ ¦ñåiA7Th¡†QüÅö«a¿8ý ¥Ù¨ó³8Œ±g±ÂC…ì/¿õNìññáß$d×.†”Ó‘µ¡DÅ$!Œ˜%eÜ''¶¢
-ïË»6ä½ã¬#Q2Ï EèÈMmaYEÞêÆ´¼F_wKßûLãqq‡ÿeO-âùgk=þIh®.íéÖ9ûr‹ÕÑÅ)­µ–aJ_Ü’ÁæG&Sb÷~ã‡gŽÝoûé ·ÃAAWQLÆ|C¦Ä,hèÓ×Ê›'jý1ÃʱåwôF5
+/Length 9724
+/Filter /FlateDecode
+>>
+stream
+xÚízU\\kö%‚»înA‚»»;PHî®!x 8 îîîîîÁƒ<$ýý¿ÝÓ·{žæm~Sõp¾o­}ÖÞ{}ûœz)
+U 1Kˆ9Pveá`e
+„8
+l)qøCÀùÏ$AÎ@‹×¦¼Øþî›âöùØ
+¶ü³%K7G6-0ÈÉ ('ù?Á¯ò¿0k +€‡“Ÿ
+qýñ$X8x8þÆiÚ€,ìÀ@—׳ø“‚-ÿ–R
+l±­®¯SiælùOàÚÂÍÙùÕž?èõÞ¿öV ×@O òÊ"ÄB0Ô¶6´ý¡ZŒØƒe’«Wëî·97rŒ=ô7V˜^e»bîÜÛwŸ³$UÇl„+ `•`¡Ã㉥bø<ìøÅ;X°°Ã°`d#‰NYë„”P/駯Øûˆ¢ R¾Kx Ê^P”ÝéÑKL`i„CpHôœTà‰ÉÊò+TŽøñž‚ÏUdíýÕàçG:%Ùmƒ#RPä»géäõQOï±+:°LûÅÑxæÃe]k/͉õJø:'º8ŸlJÛ¬žªGóy乌טòQK6‡ Ñ+íLvþ˜ð‰Å16(ÎñkX„Éßš†+…¨pœº–QÄ´Ôß^î)RêÔ[W,,¨Þ‘õÉ»ãp%n×)iuGYÖǚπñZ¬Õˆv4¹›îµ:®uľõ­«GZýÖ:„<=Ÿ@‡ª˜yÝ—l:GBÎÚOAs½À:rÁUuiw™ª¨,w‘ʽVç±ÌwZ6ç]ºš½žWßÆe ͹„縤h£öÙ8âØYWÑtÔ¸c}ü5æ?°5&Jt”ùËÞ¨—OÉËÛòÁHÌîZ‚pr_‘\OœÅ±„4šß²~òIÝbâí‡y"ûÊ“¬4òŽZ¦¿;‚Àždz™RÑ t[^cíÆ=ðàæ÷Ÿ‘øÜÏ•ä =X}§^ÍóâÓÌ:Ë;}ß %[µ, ýÉЛ>µÞܱ^4AXç%ä#¬wÛ±W:eÅNã¥S¶SÈ“H f÷ÖϦŠKuP ·}.óF!Ö§•"k¯“/ågö«ÉФÁ
+ ê2³Õ°"Ý ÝkÇÃñJ
+¬°PÙÜHyCOÍbñ¶ªß+óN)$Ñd®å]šU$浈—DÚ!΢ê퉆‘´dGGü4Éøp«lУ³LdÒîJ Ò-¹¢TÓÞœl-t=ª²ÃlÌš2iΊÚÞÝÿåOóáQDWX™ ¼ åßSͦ¶ ðå«xÂAÄ¢<ÄQ“IÔ/‚ŸÅe8XW…4XÞO¼ŒiÿÞä]óÓ̇ô+ö`dsaÄÝ´6âÄêÒú6këás‹ƒÉضÇÇ8–²"‹½ö6~r_¢¾;cç˜Oü$µytégÿ¬žñé¼ôˆøy! æ“_;ædx–Vªÿ`©«m%sÝ8Kçïˆ&êîvp§ ïfæZJÛãåªxfÉ°E#ƒb˜&Zazé{_¼ÚH☦τÎ{KÙu¤®€ë™IJSÆÊ=x4ÆŽ: äAºýá£,ñ‹iÃ01bT2l$qm®JþïiÏ`—Õü@;å³v{"•X”IAÖ¼Á~ر*ŠexATöxšÛX'ˆè.m;„E…ÛC·ù¦_ëÔmÆ㱠ݤV¾¨Ñ]V$Ë:\îøCت2™Gƒ»1­– dT4ûp+p˜®s,JÞÆG‹Lúí¢“¨.Ó¸¥-¯¡†“7Ã}‹?ñýˆ²K*Þ@P¿5ðä±Ýçr tWïËßSzy×SìX…»|Û;PRàFá/x˜ìbúðYM¤+#d!&»À¸&æ*I˶ ‘U‘ëQ2ÛañáË5Z#ЛÞöWLAjÔÙ¯é>@“"˜»põ‚Öã;$8¿†²NXæÜG°ìVFPüãï§3‹!ao|n›ôØ\–`Ä9Ù©¦Y"]°Ý1I`¡ØQ²¯ô9WfD$ë%bJ=ÓBM·–Еõ„|}GC¶;%ýkȃ_Â[]Õ¸QJ•)MÓ?¡×(ür ~é9[m;3l }“}Æp%gˤ¿!ríS-Q‡‰<=•]»Å©É¤LˆógψæÌþÍ)j‡Ÿm‹{¢R××ãÑQædÙœNæ<#C=$V㙃gú±rÃÜ+…>ºJäå28´(”ø±ºød•Ø²3/áUFIÏú€.Cw'S»Ռ۠ŽjXPK bæøÃ[HS>õ@‘z¾‡˜„Œ1>ÎYçÑ>ÅÊSÞ³Sh¥£#ʱ¸Ëú;!á· 0/xßydÉPPÜÞ_Àê$…´2¡V]Ò.)„îÅw™é "E2 øNÙ‡cO4 µ[àÖH¡¾ 
+Яªh 0/Dý-å€ÈŒcæ½]‡KºðÂý!¢½ž¿ ÎÐçê!ù‚nÝÇ
+Å øÓhaeÜ1ºÛôȇ>ì0x;J Û”†Ôáz©ò]É”çQÓ
+Ëlå6¹hèÏû©Ü)sýüµéð´ÊçzïüR|Gz”ñEß@«M†!»0µç‘“þ¢Â5Ï;©Ó÷›|3Òáž4!Âð…ßÄo+Õ{w¸Šý\Wá )rtÏŠ“¡÷FŸ¯3]¾ Лù ËŸ’n´3–? ,õŽzíFÞMÎ_6uÑ‘—‰òµRçW¾J
+}­ØüN²îé_ßDЄIxúÆfÛ´Âçš‚óX»ÊT¦
+cú»â«Ì;ìãàc B$æàO|‡féã«îèB¹·öÅÓ¶6›$Xu %áIEœŸ·ºÉò%F
+žP4a€ã¶VØ:!+¤»×¶×î‡ûl ´0j;¥÷oŽâVA[…Îá‰`‘Ú1dËíæ;Õ6áŸïÍ&6ò3ÅŽ Þí·³ÕíëJèþ:g×A6ÉÚ›Ò®œtјûSÓ­&‡£sO1Äõ7d% YIe*sÇ~ö]/ê¬nojÉw«ùèjh~í”®>ŒäXzÖ»Œ¼Q÷R©¬
+)XOAlþ莻ªÇÁCžòšvšÈÊ—\mKéÂáçÞ7Œƒ;vAʼnš„}¢ûŒ–4Yä-ÅŸ³×{#+Hm ~±s8Ì9µp/¾{Ô.Ï9m«ŸÅ%²2궩xWEGÖg=Ñaœ‡ý‘*þ3ì[ã¼"EÉ<˜÷ðê¥pÉJâ‹Zô¹X¤.«‹fÛk V–séGk´#¸ß=ìk×O+n¨A%¶ ¶b§èôÊÆ;Šü$\Ž°èêÂD˜‰Î¸.Jñâ<YÔï€A׌œË¹/?ÒÊÈ« brrG Â­ÐìZêÅæ˜Î92¹sJ3JÞ¿iÅŠ9|Œ@”‡Ê <‰Up‡Eˆ{’`®ÏY•åªØÊ£Œß±7­px|$ÚBg¤”l®¹Ñ…šÏý| !nâKÜQ $?õúŤ&ái²ç£×“4èÚ§´ø†ë|.­8† ׃ò¬WÍÏ,´dUÈJݦ‹04ÞP …M—âåÙ>¬ïFÍ]‘\Jdì?QÞàÒ!—ÇÚó‰
+eªYÜÕ›«<l Í㟮ùÀŸi÷yû\'-f"e¸ÌB‹4UtêïÔ&üú)ÀGML]§Åš¹c™©ÜÜ–e"I3S4››k`ÈçÕþÀaø•ïDáWʸ)ËüÈÐ¥°»&; ­º1­En âÇצWÎW_ŽÉs„¥vƒvžhâן2²g+•Ñ¯ú¢IÌÖ{¸æ®¾Õ©í.׊$9Ã]$ƒD3Icc §Ëþ4žZFW—C™×¯é•Ýƒ¹ÉóD¸_7Ú’ì9›/z¶§ìmZ›ƒñ“¨‘Ð)IOòMq×ð¡Ñ£Œ&Ùñ†*q]O[Å枯ÐÄ£4°Ž4LØO¦šåæm‹Ä
+n²&†°*¼j«€e2x£ŒM}-ZNòCMxOC½…ã¡¡—•¹äå£føæK²2?‚ÀÝo5Ð6CœgÄô,›¤ä’`p%oL¬9l'…•èa¥—4ïõ>Èâƒ[®Tþ{7†¨@×V@õî±9¥ú墑-7!¼çì«=pÕ0:Ý/s¼h 1(šïr’»&Çí4D
+òÊ¢rÈY*caVøõÈ€ØV¤®M'êÞ1V>?®#n>¿ƒñ—þ«ÉÒ£!SÆ€j–©Nj5J6Dä„oÔ¨µ8廿J¨‡Õ+QiÛz¯éØä-³Ö³Uéh±«û
+ÄU¼\4Èòá ÜÞ¯Jý¨»}
+ûIøR1\ÏKÌj‚MM ÔÖ[èÛ ã`R°tžLIþÀbÀrgÎˬ!ÔÆ{qÒrÖðú3<?€<ÓÞ»# tºI¥}Âþu5Pq'žT|Û9<}ù±„K|£ÂZìªB24ý½€·ùž+tEræ¬n¬[t8 šmœc/@=CD˜ùxVúKŒÑ"Õ¥júøý‰Àw j˜Òú¨`Uá›e|©¹…5F:ŠNÈïÁyLŽ»g[âM!2…òÚÞcÊ«˜+6Mx<Ò…ÓñI‚³[x$g¦°ÞŠ¬,³QVûÎëzGË\öí®jÝ«;Ç—“Ío°ˆÄg˶ü,æ0ûD$g7^çZf\‹ÐÛJhÖNžñJY%mÛñ‘”wó8E-7{‹BîRw~_ìZR£ßØu*ò¦§–a ç— ­Ž)
+ʤÕ"57Ié=J ÎüF¦2$hó®4A³¾H+²|Ç”£Ó ë-Ó/ëGÅ?¹¬ÌÏ=£tÀŒ/§¥ô‹RÆb³Æÿׄp1¤|ZÍ&6;CÌ¢ùC/²^úXI=!A]Ñç3ã´Uï/‹H˜-EΰÔ!OÛO˜}-ðùL,¸_`¥Ég­üT’gMtÊì¹8¦ßwb/17 ÷à .ÆHÊ
+E è3‹$-,¶Æ¾+:̆µÔeyø¡úSí™»‰È÷?ÎV›ßõw=€ý$ÿïk~²o™HŸƒIßÙÉŽX`
+‡UžSØ,áµàé|=
+g~nM"up^ÅÃÓíÓêè” ,{!5ÿ8¿UËn
+÷&w?Øú&aÅ/ê?1ê0Öù½úر6é÷&Üþ0†£,Æu;m· uÚä‚úí&º‘ï^C“u"Ëe_(w´#øÕd5J, ;çaÌ3EßÁ,EÕ–¸™zèBeò³ æ:-ÀåøJÜë¥Óbb½¿j‡%Úˆ!í«û0ê®.>h~÷ycLWÜØɱ¢n©.È£sr´nÕVÆöÍZŒˬ‚²ÔÂUŠÀö|¥¿Î¥åÚþ ‹Ç=É7÷N„ V—|¡°ƒw¤¢&닱¿•Èè ñ}¯ö㳂ÌÅïø^ŽOu” Ï™r•‘¿½Lyk¬«P9~gë(ïòZð틆GªDöž;Nþ¬œo™ÍI¥âÉl᧢åЪ!ÔÞ˜ìb‚uh*²Òˆ&úË'cÔns®~Af=çRhÈâ2,š9tX¥Üä]œË1Â&Û'©AX™»ãp …-ζmmˆ¢ðÔýa¨òó=“d£q !³“Nγ
+>Íýøee‘þ„1~ž¹Lèdéק‰˜§òUPG;K‰SH9÷µóO9)ÖÃdøì)Só̇”ùdؾh€vå× ?9kèd¢^—Û1ÊÖ¤Gœ¯¯¢Ö —ü2@vùÈ}˜ÞIæ,h~‰:ߺ$HÖìgù@ÃÔîO¹Óp*@û8¼ÏÙ©zF64¡Ësó"î@­,íþždb©d\‰œ=ãhŸ#§ˆ‘øíÍ-”Un`ÌÔg­ñ3“HR\»q=éí­pȸ¤Šø(âög=:À£³¦Ä'ƒ}ÞXºÝ^ýb©¯-øo¸óÁ‘
+ÌÄŠvu
+˜ȧ„P겄A• ]fv/‚Í–~H;ô„¾u oRùxoù}‰fí0æóÞÕj[+uñêN†Ã¶¤P!%8¼ÿH|›‘]@^Kl!@^) <8›Ž·n|,ÝyŠâOÉ6MýZîzq´:}1üä$?ÃÃJž<Žñ èix±ÿ«]×»+ é´ UÖzNYTm_ ~É­m.7,Db nuM±ŽÂϺaW! Ó‡gÒx 4*Hzé·<Ì04,%ÿ£ëzŠ¦ˆÕÔg”ó¹f÷é8¶Ñéî)¡¸<‚¤ðöù½ã™·t"ú_9ËÙ؉5|ó»9Ä ×Q§XÍþÔn{2θI™ÕŒg$=A.u‰÷›ÚjÁ†û…浉MO´÷ I~b $tdIî~AáB"Ð9ÍÙü97d'ŠÚ >Šªï7¡1 ¹Q\cHj?רQâX!ó¢KÌó= í Cä üë‡]¢U+(}µÌ}‚önB-ý²ä‡¥­pÖã‚–Ÿ8½5üÕ±]‚bɶ[Ò}ûs~3L±Xw’žrº_o=af—'œ=s‹¸à8Fag£Ð|ýæŸÛ†><¦¥ª˜œ:¨¡Ó”¦ iåSât)Ñ °¢$3ÕnÙþŠÞΖú•·_›GJí¤·Ž\ÑÂ¥T§h¯9´KÕª-ŸÝ²»ñu—©Óe¦IùFÆwòÅ'3½=Ê
+™œzŸŠôÍ‚í ÌN†ÊŒ»*ž;+[åñ­ŸB–{Œ~g+bò¡zü*É =x¯Îc9GØý}]e ìq§ZŸµ`)¡µ-MêìÒ¯x5«9Ù©s‡(‰žObõÝ@wk›«`må¹£x!WOŸ§LÐ[óÔ4"–:ëêô—ƒ[°‘»g10Å«š5íÂssÌv³ïÈÌ<S3[‘zÔPE+ é:ûåÁ«JùéüJøc‚u–¹©¦h½”l~þ·œž.â,>œ¤ObŽÐW½E´«iÚ^7êµÈA·ã,»ßô͘O”¥ÍœÓï[§9õÓf¶ô9°åÂ#Ÿ×–6l¦G“š˜Þ1ÊÓdQqÆÞË®sÀ¨„JÉøï}ˆ °Ü,€‘;`aÖ5!€bä¯àbÖl§ÍS*Köì„¢Gµ„ î’Ø̯üLXz¨ÈµÌAí!gßÚF÷¤Iè¢MnÞã?µ-§¹éÏʨNm*°ô²èîˆéE1ô+[çD•½Ì‰Ðö|® 
+ÕÛŸX%`z¼Lõƒ™±î¤Þ1{È‘HÓ#ýEENð=’ôGž»‡.>iîS ®Eò€R‰ÁÞâ–ì–.£aÍIÖÛ^š}²iø/ÕÈ䆪wÅL~4?O¤#V΂öOØ”%';Ãê!“Üd·p²…q!oceZ³sbØàß
+Ðú‡ä9¬PjK¢!zóÙ!ñHaŸ´Þãïÿ¼£êOß,?€úVÐz¾’¢Œ¤ñ¸gTW-Š«XÑèƒðN¨PÊ94X}chAc~‡^ÅûI8Y½-°Ji ¾á.˜<®¯ÇIâšo,¦ÙNì¥#ÊͽÊûÊàùk¤lùnýh2³ÒþÝu<Aíâ$FŒþ¦ÏD!þ:ƒêj%FDõŠ‚QúPÀ„´èÖ#מbG¡³°ï\ùe%mËf›‘g'CÕ䦨 Ñ)Ê$‰‡x`A%*›H«¶#Ì'å;…p‘ûÚ9ß/iÔ¤N…ï#‰yàE×Óz˜8ƒÄÛ¼êpXe€N®Ñ †µ§r%ç˜û7¯¼Çé&ï`Foùª’׬ó›}tW™ë',4Ó‘õÊ™‘8‘À`Z*\-šðú[Ü‚JåÕ®{i!Ux„T û•ˆ¼‘‡ômÙ85û)îÛ¼e¢ý¾KµÔÌ;¨žè{ÜÈ¡¾è{´Ñe¼Žò»~!–±l˜×R¡^n`žTG?ÂŽÎCMž—û[©s¬ ;ZWÀá¤ì`±3iSw-iUÉCW
+ÚVâ>xj„E‹ŒwêIo³}‚üH—ã
+Örú ãkÑnT‚e¿S< ¢x K»«- 1…‹54ËÆa«÷-ÕÜ@ÚUóªîÐsL/}8ÀѶ›Ñl¡ò‰ó9È+ß©O¹È¨qD‹£RKˆ7hëÀûÚë,l³Ž[‹x³#‹³ÆÒ4
+¶ÿÚ®½–ZJS•ñ~´õÓp+S!¨yWC6Æjy.Lä“X5­ ^g˜Â£˜ýÿòƒüÿþŸ°°š9»BÌœí}œ.®ç?þ€‡ü¿
endobj
-1062 0 obj <<
+1352 0 obj <<
/Type /Font
/Subtype /Type1
-/Encoding 2140 0 R
+/Encoding 2705 0 R
/FirstChar 2
/LastChar 151
-/Widths 2147 0 R
-/BaseFont /SYOHHS+NimbusSanL-Regu
-/FontDescriptor 1060 0 R
+/Widths 2712 0 R
+/BaseFont /HNLRUX+NimbusSanL-Regu
+/FontDescriptor 1350 0 R
>> endobj
-1060 0 obj <<
+1350 0 obj <<
/Ascent 712
/CapHeight 712
/Descent -213
-/FontName /SYOHHS+NimbusSanL-Regu
+/FontName /HNLRUX+NimbusSanL-Regu
/ItalicAngle 0
/StemV 85
/XHeight 523
/FontBBox [-174 -285 1001 953]
/Flags 4
-/CharSet (/fi/quoteright/parenleft/parenright/comma/hyphen/period/slash/zero/one/two/three/five/seven/eight/nine/semicolon/A/B/C/D/E/F/H/I/L/N/O/P/R/S/T/U/W/Y/quoteleft/a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q/r/s/t/u/v/w/x/y/z/quotedblright/endash/emdash)
-/FontFile 1061 0 R
+/CharSet (/fi/quoteright/parenleft/parenright/comma/hyphen/period/slash/zero/one/two/three/five/seven/eight/nine/semicolon/A/B/C/D/E/F/G/H/I/L/M/N/O/P/R/S/T/U/W/Y/quoteleft/a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q/r/s/t/u/v/w/x/y/z/quotedblright/endash/emdash)
+/FontFile 1351 0 R
>> endobj
-2147 0 obj
-[500 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 222 333 333 0 0 278 333 278 278 556 556 556 556 0 556 0 556 556 556 0 278 0 0 0 0 0 667 667 722 722 667 611 0 722 278 0 0 556 0 722 778 667 0 722 667 611 722 0 944 0 667 0 0 0 0 0 0 222 556 556 500 556 556 278 556 556 222 222 500 222 833 556 556 556 556 333 500 278 556 500 722 500 500 500 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 333 0 556 1000 ]
+2712 0 obj
+[500 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 222 333 333 0 0 278 333 278 278 556 556 556 556 0 556 0 556 556 556 0 278 0 0 0 0 0 667 667 722 722 667 611 778 722 278 0 0 556 833 722 778 667 0 722 667 611 722 0 944 0 667 0 0 0 0 0 0 222 556 556 500 556 556 278 556 556 222 222 500 222 833 556 556 556 556 333 500 278 556 500 722 500 500 500 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 333 0 556 1000 ]
endobj
-1036 0 obj <<
+1310 0 obj <<
/Length1 1624
-/Length2 8579
+/Length2 9769
/Length3 532
-/Length 9445
-/Filter /FlateDecode
->>
-stream
-xÚíwePœë–.Npwkîî îNpo Fº¡iÜ‚ \Ü!Á îî4¸CȽï™3uîüš9¿nÝ®ê®ï]ÏZÏÒw}ÕLôÚ¯¸dl¡Ö E(ÎÅÇÍ+лX{¸k@!ê\²Pg[-kg0à Âdb’ƒ€p0"„ƒÄ† [€<ÈÀÏàÃdÈA]}``{8€U_׃ƒóŸ’?*
-ÿ†‡;bÿÏ80=fë rw¢yâþSæ ø/Ù]]}þ²†þ¥õŸ1€áî g;nL>þ'Ÿ6ð'ßö`&ÏŸaQØA|¼Ëm=\ÿy‚`ˆõÏÌ°=´…Bœ}
-«_5Ücâ->³ß]¶UÙwºHY:Ó@'ÔÏÙ¾¬2·‰pì„òX”àdÆùΨ¯£˜óìlŽèèZ|ø…F3Ö&
-qh<ë/=íq|ÜÞ>“f¾WV “Ž]m(;Íe J[<ÃaÃlœùb\¾¡ æúžè×}#-#ÈÉq©¾çeÏ[9Já¼ù¢_¸ØWaøáÖß
-ié”ç-ÚX'ÕE1xãÕ^r%LSõ)çœ+眛 Ë
-<Hh–~H{ úýÖ¨¿®_#ø{Öq»†ŒRÞ}ËêàáõwuÈ­5/‘ùfXo0º²ÙȨ~qÑÔ2š^¿—•tËLg¶M–-‰—
-K1<›@T¨p\¤’‹¤«oë¤Á‰Ý3´Ž'öä÷6Ƶ"n^Þ#‘µÓ‰4Kל‘(_§.‹Ué¾°PµÏ9iil­\ «|¥Wñ¬=ò7>õÞÇÂ[&Zêy#ƒ0Xæ]&òCO#ÅÛ¤ø²¹2Eí úIlºgÌéÝ·akÃÎÇáòû¥Næ ´ÃöÚ™5ÍËÓV¾“/M,-±çDÇZÛ>Wk˜DCÏ7rRIÝŸ’¬ð1È‹diøÚ¿Sü€Ar%çÎ{*“AèÊôŽÙ.… ®mÏ«Í–ÐW®ýkD -ca¥ˆ:ÚŒás#ñ€îÀpolí›ò¾°ÍDŠNsíò2¸‚Ö#Œe
-·&üÖ!Bë}àBA¨ÛÀΡXÐm|¢]æpvKºXKõ‹•‚Eí3MâɤáÝìdtÉa~´K_\ â4HÎý**iœ·É\Ìe:ŸHÄ6]«W•}]¿­ÑêS%S´w< Ü‹åîOìkkQ^¸ù‹Kû`ïJí¦¼W&MÕ½%)–›D6Bc<\ë¿ï’+8H„
-uŸ1Í‹K
-|TúÁ.øó-x{dœñØZWäû¬eÙ—n¶R^v&ëgD& Ê&>2P&õ£±•_aG*Þëýï°`eNNAU{yßÅi\îÓÇê#‹0xðØï†×c¥•¾\ûõL$ü•ü¦ð·ÒæªØ,ªl'<]ÔLI½à†ž­Ñ¦°¥ú_Ûµtk2aÁŽ§ØÚC~4¶âµm1²¯I+ðí^a ¤Ft(†VP É Ç[è>C×ÿ:_!yà»uµ ÎVfVúôz–ÙÀOX¨{ëµW°{מQcVõª)ÝŠ…?÷dɱ8~EÎHo<O?µÉ1Q›? N7öÙ; ~­Î6Ä“´Õ"ݾ2.A;Á
-ùzòÖ€Ç'éö±i©Ým¼…Vk%ßÕ’·3ÉÄ궋åË+Üt ¢ 'ÙèÚßF¦TÓ'ß{öÛR?SƒÒÚ-búpVûȯ×Ó^D .P?ÎöMF,½Ö—BåIψWcâ·å}eâ²ÔèÙ7lÄŽÓ$•F/
-Wòí\Mߢ[œ¸ò³FŒ$¯áƒc9Iý|Ù—r d ž…C"ÝÛúÎmÌÔϧ>)3'ï÷*Ò]_™¾ÓÄÔ~Ÿ®vx¥ÞòÊ¡
-wøvÄü¸61vø'6çlò=n¡íˆc–¾Å[확;ýQ3Z¦Á„äô™Ò+~Yq"§÷p1_—Ï<!Õí;âæ§né© 6×ÞË!ôÝ*?Ö‚/Ø\ò`r*ËšúÑtØ´Yó&×NŸ·d0êë„«’k{%Ø!£ÖŒ¯ª=~ s‹úŒÍc|Ÿóç}¶wý>.pÔáò[ ¥`«Ë„‰ä9“2Cƒ‘i‡“žÆáWö.—6Æ™ÖE(}Ruã̱«˜10Ë _S0-ÏkH“¢JéG³ÂÌV³ßz/gѺÇ;Öö#ejö¨0Øt5¤^yE½mqÝ(X q(Ú2”*n#œ³tWtV¡èžã`Yõ±Á±º l/W¢Ù©kü:e·´\úö†K+=à7éë¥ý7§B´ÌYUÄØŒbTáœü"¡ o–ãú£ùwh rU ‡¾á%y›?qp©V«?e4¯Ue iPŽ—YFüF$Má…­s¥E>œŸ²G»ˆÏIÝ®6‰"t:Jí¿Sy“]Åá·IߠȼhåiÖ'«šÜÝ_Û¯Abí±šŒbuQç“:)õ
-ýL?ë´êpUn¿TöùVnEÁê?Ø×_¾´pãúâ`(ý”b z@¾‡ínüºSw©õÙ,"ÃeçÝ4b‹x™-R†ÁÊÚî™â “”„üKKëšÄ¶´Ÿ­äü”Fõ.Ÿ1´c~¯U¹¯M]p¤)ûIoΰ2$Z`8+B5®Óµ³ÎJ}ô²?ä\ –³[¢›.ü ¤Æ°Yd¶SêZDh»¹áYºœü€~IÒG>\ {áxÊ/õÉ®[ávÅË/¡‡')Ù®oº«;ùqÄuj 4Ö„bùàgÈ•ÝçOñsÆJŠwí^ùÏõ £†þè©ÿj/(xý¬Úñõôó//]ÈÝÅüæOë~Ó×ʶ•àt`e/ûïè ãûcOû) …WU/“Ñ‚¯Í–Þ´Gù­ÙïÜwTîÏW.¼)ð—«{žÿE4%ŽxôÕ×ñO‰Ö¡ìѱüBú®^?² Ò7Ú‡6i–”“´šü»;ÈÂœ{Ô¯6-®dó7
-DŽãlÀŸ_¶—s@“Mú§„ây¬ödæº/ŠP‡}øe(x¿ÔR^¾ŠÎæ
-5ËéZôO±N>%¨ˆ¹aâôOZ3)€å}íÖN¤§fQrÍ›d²~©d›Ã«°]µmä_—–õo‡öé´6š·§¯t`0ˆ'¬bXšz˜g­âA;Ìƺ‡:ÄŽ/0´ ³’YÍ“Ó^O¬œ.~èÿé“1 m«ð(¦Ìÿ#~+ÿÄ@è…†–1‡¬üþÖZš‡ÑÏMŽc…#ë,…põ «—½ ãQ›q„~ݶDwRÉ­±­ðç}ˆãêЀlqâÂmƒéN¡òºât»ÉÒy•qÝGŽó©6ƒïXd,7DýiF}/JáP*Z°ýƒ[ïÊñåx´NÞl¾d¯÷ÝêèïM‹Í¼:,ýdÅx#µÅøÇ—ÄæÂч7jèÜÛÓáöâ¡Ï˲¬¸x›·wê¾Â'_=Sz<Ï,NîË!É.öš«çY¢¬-j=-¨¦a”%m].'Û¦œ|ó+êçÞ Û!)Žoh\ð(~r£hc*o±q× q+fõ³ïóäÒå62†™·«ª vVij^×Lb‰—'ä¦ÜÌÖR8ˆ
-à–¨ÞÏÙCãr±`Í1º'Þ3©$.GæEHÇçʚʗrhüúŸ·Òb¥éuž!&¨qΉ6öQnªÒ$:ZC}˜i%¹Ê­»ßàÅË]¡;J¤ü¥íÄáÈ¡¥æê?^0ß-±9,ƒÖ?¾oŠ¯*4ë™XÏ¢ÔVúåœó5Ë%`*fÝÓ áõ €¹Jx¬ŸÁ«|ÉÜ-MW¸Æ1–Máù*ȼRé¹!;vúŽËE”¨Km
-ÓD‘ˆy“ìÆæQj})ó½¤dï=¿èèWh£‹q>9Öžc蛫w¿YøIoÇÑÛ>;V;Íúå¥~$»Ï¨AÒIK(¢Û³@Õ0¦Ô£20¸Ê )$çÔ*í> Lª×5z(Ro,ÙõÝ#ÿ}àQàÉçÙÛy\1°Èöºc.FÚËcuÉÎÎý D­P”0Çj XS;ióé,¶hqPÞQ×I®y² Y%Ó&tÅú­;ôþþ ¹„ÙsQdÐ+-\yª×¹L&¯Ÿc݇)ùÈ69ëzTê|øÚÞo–ÖÕwÙY\9C
-¹oú•ÿ™„WÀ ßóÇÓNV]UÅw¥Uf]F}å'Æ ~’Ò›Xœ#Ëçž¾cvB¯W/¤™iÐÂò:Èû°?¥Zï³ÚÜt!r¨±w(P¶¨^á ô Û}3e/¹N \J¡ñ¢ufý\˜‘ãLT(1 „™YÍdãºIé;o¤äú9oÒ>ÒçMªá8rCŒuÁÀ߉DL6¦ëÕŸ¦D¹í[v¿ 8½£ÉICxY'ž%¸)4ãl¤Ã!þ"2J)/E¼4²%º㉜Ɵ1gr P
-×¢<Ð;’A m
-b&c,±í™Ðò´6@ýMãÇlå‚¢Ý+§¤õþŠ´JX)Ò~Ú ®~_òŒ`|µ*ÊOw`à™]ÃtíÓ?³Ý…‰ÎZÖz¾xï¥<QFöè>ÝQøP&_DFáî?¸jÂÎóï¨Ùšø•À„¯çäHËlÅוäÀŸ/¢p«·ýj/
-¿¼I-*-]‚×X![0O²h¾µuí©±°njî¼Ùõˇix6·ÇüvàÁ~ó©O‘Àù‚˜lMT(Ûf™)Ea¡
-«f\‡Ð¦¡$ƒ±È=Ñ3{UvŽyo{VîÏë ù P`üñŒT¶Ve¤âZ­²<§EnÚâ)ÚQû´%¾ ¦¸7ïI¸tƒæ¹H)w)I¿¯r8Ú'‰uŠ‘VäaÊ^äZ¬Øy·ºÉ’ðô`ù³d^z¸)Æ6Â:F´lÙGNŒî;T“Aß<68açÛœ\Í„˜P&-‰*Tù–†‚û9n‰ƒMŠ.Ö _®¾˜ì»[tTç5u|e±ô(z¿‘1­ÄE¤m½9FGyü…Çݲýu %b«º&Ü“k®[“Jf—õvbè,úS0ëò£KvæOìÂT€l,Jc§wyÛezŠJ{ÍG¿+Ö¤²)¹¶Ú¯ã5ßõzÕ~^Ñ™,UËÜíj4¤fÒØÜÔ–Ÿ"^£Î|ÏvDÿpï2®ÀžDrng/ÿ¨F1}ël†±ùÝ/àíÀÈ/þ€%À!yjå—rG?v’ŠÁ÷ão¿1ÎÞVlJq§FÅã®|‰ú^òñ{¾°ì¤&>M†J|)§C'[¸@wÑ„¾»üë’N¨€‘ÇA,‰MÒ[PÊqu RÏëgì N™*>rˆÞÌþs“°Š¶ì×,¹v¸5½âz*¬Çsu€yÂ
-wñÈ6úà ”mÕé²ÂþYTñ0¶ŠŠn˜ÄVûÄ*ª¾“z<ÓËåoœÈ-ÜÌ€9ð®Éü̸˭ojÊÁª&ÁU/ðޭ목;íNˆ"ç}%éÁ´ä}£‹>òΰLžž4^ùÂí°Ä`üÃ\½[s!ªÝÎLð.ó¦ŠÜlµ ò"±Úu
-Ú匓$S¢’ 6CSûT ßé3çDIЩ49VTÑÞê_Eb:ÚÃæšúa,M[a¥1a=“Ûÿ³6]<·1Š\KŒŒjì…¹¯ònð /u Än锊ê&½7Sl x±*#Á ÆxpC‚yC[ >F=ÂT@Dæ©F ¨j`ŒT-Fbj ×t0ÿJ"Ã.c0@mY{PJ 5¤Ì'¶WŠô(æ
-w:©ÿrŠ®­|¢©Â¸¦z$:S÷5ýe!Óné³úÇÈ‚®¥kîciqç`“&"Œ»ñ¯[’¿ +Þ^aæ’W~Þ¸‡ï¼¾L¥ [þ¼RB ¶¸¦ÓP?¸O/Kch™iÆìɶ69eý«Æñ0C¯zÚV»\€3ÓF6F’×PK(Â}<….õñG¢7uª–íöx?Q:¢/³«¡ÝUf7ù0ýÖgß´—-hyŽéT¤ÂpÕ äX´Ùð!Gf“$~°Úù‡A—ñÃ0¦é!Áy[<mÒƒýÇ×?^Dtú¹Pi(‹Å¼¬ŒfB)…iã™Àòfr°.Á}ã4<åòXFj¨ž‰.<P?ó°-—RJF6Žr¤•ææ\’è¬ìÔô51^ßúkÔkÝ ¢ø²ÊáuÑ„ªE¿…û¾ ] +9Z@ÖñííwÍ®¸!Å4¢mee&®PÖªñÙÊ\;ÒAª{Ä-h'æ!z}²¨ª5)äZ呆π$‚~WÏOLŠSá+óÉ'½-±sꨙø˜\I¯m!÷²ïY½’똟“Ù¨*Bqä¡*¯¨ß$7”ïæç]J…î%~ÌNoÖûšÁþ•_6låÅùÝukA³ Ê–‚ŠBûþCñÑß‹?{šØ+/øxõš/c#MÎE ¢ˆ$YN?Œönˆy•»ndvúv¬í´4• à éºñt½~¸õ¦'dFX¼ü8a
-É]g¤ÌÒìÃ<¥)7‚Ñì¦aìnd0² ã‹ï»¡.{tm)«ÿÚ;ðÅû¥™¢ËÀOû&*‘8$nÎ ¢7ï A
-/TÍ®vi6Ð9¸Í>4â|ßï½@G_C )$œôÀÁ¡S霿<+sK…¦–s5KÃóøêÄ寶Pþ}JýHgëeC÷ÁUf2‹ïU ¦(^9g­5Þ’‡®?¯¸ËÎïPrtAFžÕŸþzo…‡“Œ:¾æ$žýf¾ ÙéÝ›S”¦]¾‘õÉŒ·‡¶3­×žÂBR­Ì]þ
-诮ñqÂmdàÔ`7nƒ¨RWºÓE[œ–™Ù6‘9¶?`ƒ=p®ç3Lã,oئDLß÷˜¯ÙTýŽ§Ý¯eW‘öîònQÆ—a)ähF%ö¤5ÙÍqXÒÜâDÍPá±S)ô|ÒÞôÔŽUYïÃÛ›ær¬f~0?rén#º«mH¼Ÿú„Âl#¦u¬…85ˆ#FìEeU§ ¼¹Ô_ k<ÿk¦°ÙbA%R7@"ÿÔ÷»Â2aë}ñó± Í„½![/©¬‡DpÙn/Éo ´=ý!"o×Ï¢ðœoâ}Nó’Ïúýk'´$ó ’;ŠTÅã8æWÌuTš+Èó
-^õ,mÝ>µsªÇÍóQ™“™:…&ÚÞ0Å(ÛHj…`ÌðSòèí$¬=Ý3UÊõú”ûµ̒yæMŸ"¦*lÊKÓã)¯ý¼ð^lØb$vÖˆH 0癥l{<
-ø_Ê'Œ.ÌGöª‹é–Q}é•.t(f2‰ûjéŲ¼[Õ
-§m#dì^Àz#ÎHc3ŒÕA›Þ@4ýÆaù ÃM¸gGs´+l®ºhXÉ¿N5ÙbHË5toï<Ÿ¶¤UxÑ£(½¶§b^j
-Ûó–ÊŠEVÛ*l‘(¯;Ä¢føqOóÊE½WÇçT(ÝkEfAó¼žýÂ
-rW²tˆjêÏé
-¼õ¥¦Ø[?°qI„Kõ⬟5~•)ž¢7StûŒ•_ÑባûŒÒOLû-ˆè•ÕóåÉú¹@¡dÉE’]_VJDù»ýõW……¿].²dt~ˆ˜ˆ ëM„í[z:ð1¼meãðÎW &If° ânË5èŒqJ ùHçq$?HÒàºN÷œ³ÄtÉÕ¶øhÎ=øi2Ó1\‡>ÆQºO€Iep3ó¡5_€lª§~—å6í×ðnþ4à ;h·M±VH½r4­ÊvV & ¯Ž¼ ml߇K€#×?xÇ”³îL3sÆ™¸Ö‹ô¥{Îcj+;ó÷ˆ™¢à#ÃZIü7£aÛG+ˆñøÝÔ›QEíÀ’¢#­ƒ™)­ìÕ¼`¤øÍíø´) ’J±4ŽL_$/Ö.,ÇÑYéácòwjÖlžvÉ[ÓáþhÉðþð‘æó|[×L.6y¾WLMèJÕ€¯ŒþØ;©>âÏ  ‘Y‰è4‚ïÓ+Å·®‚›m=Ø”°YXÓIp}å°ñ YÙ߉ŽqûN<Ëúæ=´ûÔg·>ÚܼŽq9ºT†¸ÃèGSyçm÷p0ðÞû[  ‡s‰³3 Éî%ø¥/ÝðúµnAi•wÖ,[é5SõˆcÜÕ°Öº×èÏÕÇFÍ,Œ;nòAï-´´€Ä߬ug¬À!ˆ <*’Ïã´ñ—Ü›£D•îÔO/ý-?*¹Ww×%sUc‚ö6a u¤´ƒ·¶ªVq«ù|4F;2¤¬«šßh1Î2éj˜ô÷8æºÚÀ¤¨Ä•½š:q‘— 8roBÎJìÞÉK<<æÓ?6tð4)=Oö¹nÝ úy33ç4ç«"s_ʯrXZœ´¿":¿y€Ø`eóúþèÇi™f*õÀdP[S Ú^D$24³ªSpÙçr«u +¯X£ð\½àá)™—Úùìû.¹ò‰¬vY·S‹È¸w´þÓÄœŸ£ãì/âìœb†Î#aÂ]ôG1ë-ñÒ8;iµ¡ø LÃ,c¥&]#¨£V¥¨wʈտ™f_ŒWi—²]Šã—â¬3—ÄGBßèòQB]Pö½!FUßs³Ó¨ú­™¼‘JÂÀFGíÂ
-†Þ[ÕñºòŽABjÙhaLMô\¸©·UÇ2lucJQ¹ô@!5@ç;*>ƒìïâ _\Hñà‹Ea{¢ê’7ÎV[ˆso'Ƈ.–¼{èãrœÇ<˜Ê¢©5û&/gý©~ò†…p´F7Û,‹™éÞ& ƒ–PvZœÆé<ÙX<Ç~ÚñDRx›±Î°mé¿,œÏxIÀBµüïgE/Hý£öÓçVB[1úüû¼×+,(ëÈj‘õ8¶DšÈ1éV%á*>ºÑÌÏ-ÉbW®V§…* ßcoÃÉ«Šx›B¶>GžÀ>­š-QFÜHÑÃâ•°8ð8—ÿTO¼VJ›Jfo!ŠËKÌ4,pB@<ɵŒhÛ*ô¬W¤ˆ¿™Ù³[¯6€œÚ§óªE:§…¼L¤åê•B¼¦aíe®7·víÀe™4U8Žm]èÝÜA±ÁYažr}‰Í#1ã™Ûµ*j”ÿ ÑŒáè+àu–L _#Ƶö»Ìñ˜S}­—qmm(›1öÑà kªuÊ}$ìL„_hH÷,½ÔtÚšw½álœADöâ‹Ctkôq¶ÁîV1)Òö" Ô»gFbØ_ p(xÿ—ÌÿOðÿ3ƒC]€0'Ìÿ
+/Length 10632
+/Filter /FlateDecode
+>>
+stream
+xÚíveP\í–.î xÒ¸»;ww4t5Æ5¸Á=×àÜÝ‚»k°>äûî™3uîüš9¿nÝ]Õ»ö»žµž¥ïª¦£ÒÐf“A-ÀrPG;§0@ â`áê¢
+uTa{µ©[ØC
+ÈÉú¬áðŒ=“i@]`.–Î'àÙ«†ŒÜßqÂl€°?¾] Ï0
+ÃÕâhýÏXÎ`k 3ÈìâòLóÌý§:ÿÌð_²:9Ù{þe ýKë?c€À\ÀöVì\ÜÏ>-aϾ­!Ž†EÑÑ
+
+àâü[ruúævþ«@Œf†é9 êhï
+ktòó* íþ)áëB¥æ÷•!ìµcÂMž3‡NÛJÌ;/íÚ“À'¹¾4Lyø+ô-,;¦…Ø©GúÑÞ§ßUÖŒø9õv6F4µL îQ(ÇZxœÑN¯™hÜòi¯œpü,“¿Æ}ë…{Qõùðˆ>aÿúŠ¡g°¿¯·ý¹s›œ%+NÄ ›>*à]¹„‘n©w­¸ìà0>¦I‚Ôõ’7¶_„›üë%^ÍœKüÉâWöIñ‘ë¨âx&CêŒm
+ä¿àh×ñ€F3>ÒaáÓ®GÀÇíí3IúYbɘ¨•šâÓ,&ÿ$ˆ)66ï7¿ï†%ër¾Ê_îoj_Yüíl§¾v‹w'J‘ñwÛàÎ}¾ÇÁú„l±•÷êµÂœé7ƧøêjܪŸl±Óä½
+™ç
+™zçFˆoxDÔŠ
+’ÆýŸ ò¸K`º•ü~O3¶Û•Äd2.›ïÈ"oÓª›+sÅ¡9&˜qèLÄä÷,Ä”U´Æ—ÀÃâÂ.©éÔ–ÉâEƒ€"~ j´ xÙ
+ÛrɱÐ×_[Ú)±£öô-bݸ= ñÍ —öˆÞXi†šÄʨ}— )Y§(ŽRìº0U²Î<©¨m.[*ÓÖ)EûšÆŽG±W_óâšîÅœ^sÆ•U*âCw-ib|Lñl±œt‚z•ìqz«ç£©•´:lÿ#Xæb¿ÈîmÍ«akÔÊÆ¥is¯Iq8?#33¬YÁ±æ–Ö
+U£p¨íùz槗÷7§DË\Ô2éª^ €4¹œ¢Ë0i΃@©”NtiôV øÑ-{î- ^ÒßúCŠQRæ—?S„›P·Öh ÷DUÅ•ôm| m«QR¬Û|Œ¾ÄCún§¯yè…Å>p>7ðÝÀoì#O!ÿë˜V©Ã¥ ÉBMb˹ ëgj„“ñ¹ü·]Ìį?y¿ZìtpKqtŸáçí¨84Îd‹Syþ¾¬Ÿtv­´‰ß®U—^òȧò ²®4-íÌ’ÏŸDáYÜ›wöjt¿Âî}Ä{µóÉŸü^9ƒ›‚'¦Ežbõè>ÝL»âï¹8j¯(¸¿Ò10#·ŸÞy¨”¯_Q˜qÊýªRM­¶#_ì<Ð'Þ:^ìö³¾#ý½¨¡&QZz±ÆÓnš
+0L_ÅÈ™a攣×w¾js¾ƒ¯kc‰ÓoÌòAoÔH”¾•Ým<ìè·WpÔ Ç>£E/óMæ¨
+¢Ãü)Ä‘‹™”!‚¬QMžZVçü£ÅÙ?f t˯f'+jÉ 2& Ÿí¬1~»3Ù]*¦eæPˆÁÃ
+´(®×áú7¾õu³°XDsÎФ-ßæ ‚ä< ]¤UO_CÑ÷ßC}Þ„©Õ7ã«$³$~©T)*üſתŒ?p3Q©}ÇéÉ“h†Ì ?‡'²½KµƒgòëÎA¸t,´ïG—½Æ2ÕqJv¶"ùÄÓ/$zÀ¨Âo>Óxùå„?æe“`µl˜&eo^äkbMšn«Ä6-ý…ù.Ìúo$KÅž =_Í@Ÿq¿úܳ}ïð¾) î†QZ}GN޾Ȁ"Ÿ× k¾Åš{7&H¢ñ©5ÞbTü®ãÔw6”ˆø×g¬F¼×ØNF´b¸ú ¢L¥p1–Eñ‹
+[=@{TÌÏ à¹ä„á£úVBØW
+e?«ïÀï9Ìüï†LßÓ;Rñ÷†yá ZEåÍ´% ¢ ÕÚeªÄ&Ù—dwàšÂ#ºŸ1X*Bè$XË5Qt*Ñ"ŽNÙ²”äÞÆx©º…”éÙ)Ÿà7,5Í<²wážÿð€¿($ò/ öý²ÉG
+©^0?J¹Þ%S0F½¹a[A3ª_NáÒŸ5VÿBÏ~
+þm!u‚±Ý.óû<¥X¸L-åÀ£~Næ;9äWh·¤ý/"Ù+‹bˆJú;ò®Ùf—ùMØÅÆ©ƒ’™Š”µÔ›ãÂYO±"X{6´¸8ÑO YÊd–`+…þµQ¦ÞáÍ–éŒÕae±ÁwmÚÉlSäæøFBîÕÛ‘GšR™Áëxù¯Ÿ<ýö‡é/ûR#¶*w ©"/@€P+JcÞ‹¯_¨L$¿mìS ©—áV瘛hòÈüÀÊ[†;{Øå\I±Ú>k¸ŸÍ6ò®LèWhÊÛ§d¨n%ôÛB%ÎK÷7­8äÇ© )ˆ¹S‘£ª/OjÛœSNÕ[7’•ªq®÷ç„ñ'Æ °88<ÉŽê Æóß>q`™“a Î*($}RÚTžPÐio £·f›oa?ÖxXž“`gôß%î;P»®ùÜ°R>)5Ë5)ÀÚPoX`¢ø`*7…ÛÄ»'´«®5ùÇ+Öúuïno¬ﮟ9`Ó<´»ÐÜëOÌÄpâ’ÞÀæO!&vœÝTéR~býî¤á’ŠWQ|Œ\!EÐ:¸ çB«eV>*EÔOþÂÁs º
+µ‚ˆVžÍ¼Jæs=Q‹•]28m*~)„2…ß<òY§ó‘˜
+D츜£/3à¹LÜZ‚(1±»wéµM ÓyKMØjY,XpjuG£äŠ3UMx9½gèOl´zÛ~‰ïß4û/}è´÷tUj»^É0Ô.½¤ÄÍ6fø¨·ÏÇ´ÉöH¯ƒÔ³˜-«Eƒµ™6y]Î(.öˆCŒú›
+þbXïýÖî——UçN âô7&#ú³yź)¤µ¤*›= A+Õ/µwªY|§î«Itô^¨œÞýøŠ kc!@Ìâ×Îoé–TÐÂKª¦ÅY&ÉŒåʹÃI
+“Z#ω,VÚ(œ”MÕÛ‚apa®šR虶¡#ÖqW3¹©aþHï«Û‹P>koQÙYvÓ}y»´7ˆP%¤o&Ê5ëÉFpJX¿šG™sÈè’ºñÑ Ìã‹AøÖzŽcøáC ô5slì‹vRuÆê=|aOLÙ!ePÇyL­Ÿ< ïíïaàŠ)æ¥:K,…_îãþ+t2†:Šu’&½ïë‰ÚxÀCÒÄüTœîS$°#géDèxúl+ÍãÌÍqä]‡çÏsº÷=5¸Ù³˜–ŸÎÕ{À¥pYqBx;µ Dj/YØ—ý–3¿¯&„¬¥d±ìTâ”qÙ+W{|°[TNôƒñ—SÿP¶§Äh™ïE?ÐC–Êt#½l
+Ëc$9h
+XGô.£Œ1Õ“MáX<´¼¢y¢ѽâ ÞÃÐÓò™wN7¾·ªûTÂW¤ .Î/ Dxh!Öw·%ãTÜHævŒMië„»t*‰‡Šm-õ'œ¨²Exz/s…‘e³Œ£ë›'>À&­.`Å:¡Äíy¶*9Âï¼s*q$x°ë®L˜L}ÍÏ3û„ýÆæ—Âo¼–N#Õ¨åc¸ „iÞY·S÷¡#ÕÎt@
+æ@à§ÃÍ[tW a¦Oc³%r"|”É åoxªn‡8àÅ•Ô6úÞwuÉ^ oG„$®Ðè{9³IÈêÊ£¦9]ÏÛ/FVÊ,‡2§Kv¥mLA†Ü`£ùvÒÞä«ß>ìÌTF”‡OhÏ‹#¬É}D¡j«Ä>ÔwLæEUý•œSm×òm Õ˜_©C=D4É"Û†,QVJ;2IÖ 'ËÆ°jW?EçÆpë«iœŸëÔÊ(ŒlÉ—km?\æ ]«ü+ô»¯òOõRÑÜhImV‚ÜÖvÞžÓJ–¬«i†˜’®ü9~.Åò?AEWðZQ†ú2Šo]’˧Ž¦¯F$PEy¸>¦ëD’à€q’_Ï•o[¤KƒægK+Óq¥õ{MÁŸÚyª¡WÎT°ÞW
+ÛÚy—ÚnvI]Íd¤L%úk(““¬Àj@bÙñó0µ§ÕŠ)'ýÇŒ³Rf•±åE*Ýç-å®}€)W ùR Wôœj»•ð±Cÿð81fôêôq®úø×'DÎßÃîÓ.©Â¹U´ûÅKmM™úŒÜÒ¹d¬âyd”„è™Y~¿ôÊ@=/jÉR½è¥ö.5SØGäšl‡e‘ÓŒm
+ÈOâÙ~Ù'V«™S0‡xÓ™8C‰œ†d£Çýsûž"¯¸±]¸ê´î>œ³æÐ|ñ‡™
+Jünqèèרô§Ty½šƒÊ¿¥I·Aq—õá‹Z%9?)¥§üŠp¢#^lÌáŒðÖ„„I’³ÑÉ!´ðKˆ«åWü–¾UÇCÛ¹†’º‹×®z*®éhíç&îÝÔˆ¦ÒpXNƒéÁc¾ù."”ôÃmPU›AJÒàäÝ
+Uf’å¤<k}Ì 8’„›åy1eª«‡¤7óÈu’p¬®¥s(OeTh—{ÀbÿýßS.…ˆKÞ”PJ=ËjgóÜê-Ô_h®*!Ô†—óXÒûìfÈ“7æÂ4{í]ùÉÚÒ‚oyâߟ0EY.Fœ ÍKŠô@ LUOŠi^w/Üê7¼C(˜ÞÚ÷‰éƒÛ~õ¨ºØØÕÔë’K‚qbHØÔX˜‡+…Ù¹=€ž£Zgk·„¹ž³gú²¹ÕpW-;ÏùzƒÎñ7°eO›âðy~⢾ï´m*Œê30V.o ¼/ƒ«ëŒF¨±L¡Ø65<_w¦âchĨGN Œ}tƒ®ÛzIXÈŽ«‡ü¦³ÅƒP†P^è2Õ(È—ÖÖL:u¹6—qéÍq‘Æ”7œ·Ö“íû“¢Œ—oŽ£å†më/û6ª9r~¼xtM—ÙlЮƳ ¤Ë4¯†‹30ËI(o³ÔIäÈ@¶Ô„Î<©´U'T9Eí”㦷™{²ÿ|Ð\¢ˆ÷4ÊNó> ÏÒê(HvÏÆ-nÂíÌìä`Þ0DEâÌ
+ð¥ªT Žºù&¡‰àëvHìÅÎø—â—¨|2#‹ÈûjàÍ­~ v ]_¤sË–¸÷£dLý¶‰¬óªl?@7~ÕìÁf/Ôý]ŒéB¾ˆúT-êS“H¾Zª[Ã,›ìÁD#wÛL­øÍ”PÀ68I…ûs—t5\œB¦Ïq G)fŠ…î ÇÂŒ}”ðª4,m¶Ï]ÍŒš£±éŽ@·Ç"4BËý˜ïÎ÷oŸ¿ˆ9uK…é‚V¨‹Q2dY’㇠•oÐXë\\ÁT7ôéL§ æ“Å=„«ßKì»×…ãåÞB^¼ïñ:e:ºûA¾ºÖˆ…Ø×%YäÜ´évJ÷\«æØYûùJV},6>Þšv½øÈÏi÷°6™’^¸OøM–!kÚ^Ù»<l‚'ƒvØCÜZ{óâË!3’î‚UDpì廚ŽgŒ}ÞLªzî…’b_V©ò-DÔ7™h~úÐcÅn»aV¼þŠäãôî´­Ô8Të/Añ^»»£öQÁ*I9ŒëMö|±s£[CËÈP¿Üù†«Ëeõ+tÐÍ ^‹$¾qobC!,cˆqÕÇ_ÎÌuMÔÌß`ÒÔ0Ù˜ú¦BÃညàŸJ}!éGs19lÏñ»Ö—³˜ZéGÓ*HËH"$o—¿Ub-;¶e;žÑœôGé?Õ¥AÉP§ãè}/¸½B °}¬<‰6Çz«ë=ƒS`ü¤4#\žÀÁhRoÜ;½¡ó”sTocíLÀä¤MøX÷ÓÃQ‰
+½å>V·.—
+ÒÜîªQè]‹*ðåVäIw8¶ñÂi›M‰œÌ¿$a| ÙòȱV¼ó i×6\…¼“Dýð¹¢\ý£¡J©ÔK•¹¡áXl¥ÝöVƒoÓÞ$âbÌegž#ñò¢ïF’pÌ ¯Úè‰Ñ^rÅ
+¥›S+YÊ;Ūìâ?¬_§IÅ>Ø7!ÒÇÏ£ûQ
+aÑF"$²¯Ö­|3ß!i#ÌT<ÆK[tô p;w»Ô.Š[°
+ £M~Ñg<ÇÿšâNÜ~¬Š$’
+œ\7±?·-ï¿ý÷¥“ MEo,ÖA„&±}â÷ÂE¥§Þ[:Ö¢•P’º‹qݼ¡©Ù¾u¾1b’0W—¦‡WG&Ù¼2ª¡t7· ,Îĸ—Áw¾Î”…uÑÎŽÕý9f8xºH]*ùY=ŤÔ\">_xÞä¾dB²a×/Ë—œ{íÓ›ã¾p‹Ä#åN³Œ„„×ÙZ¿5ð
+‹¢T4ƒ %ŠÑÔfj ÂÅ4L7¹ág¿«“qàïÖÈ@¨DDF‰šO`„®vÓ(…dE^€É0Þ±½ß­O{_õÌ¢„Îú‡Rô¤ê quâat¼ÉXe²Ì¾ÎKä£^´¹î¯é,’Ôªy–„ø<œ§c9\`9[B½‹º‰¬ÍDªc£ø,̅ò=åÃÄ3ª"&‚Œ™ž :XKdÓNBl|ÂX y‘|$F¿¼EcL;×Sü¾g*›EHç8’‰¾óűŸôûNYµ]¿FiS_q³;¾‚AiœôÂÑÅúÈÝÃNÞ‹Üwæ¬J¯@Ï“¡–ËG±M· 3% ÍÀ·°XÄ óv¦18+M“wÉâý÷8K‡ó–ŒÀ:ÉÉ/Œ-y$"£âµ°S]{:‘)EÜYíkN
+Ä¢ƒ7Ó*e¿§Ô¥Ä‚¦o‚¶n»éPà:m;Zd%«xc¥Nâ™aÔŸ?¥=€ýZuxçY+¤ó^¡Supã}ÏC£Õ,ô\r”xW)<çK qm’E+Ëç‘‘DÂó_ïŸÃñÆ@V7³îÒ³3›”a¤)dÚ?·Ý‰@xäÄÀc”´Ï0̓ºÏó"óâ½û™µrJóòZ˜JÅ›=2Ónñgkù"áz@éóa⵬å½µ?ÝæöP¤!}•-ҾфýG¨ÈVËs­Rñ²aTRïäËâ‚k\Ãb¿U¶.ÁãgößvQ¼h-aó•âœrfAÞ€ÊUÁèDZ$ù('€»¯LM£/hj¸ÒRöâfòg ¶ËŽ§ÝÞ»'ûêºn ³XÍw‡W×6>y~ëF—Æ”§üŽÓúÝ—HÒN•Ûë{Bk}ÒLþo†ô&‰¨¶ßgÎ~Á¼Ù„¨;¥rÁΑ½‚ãi?:±{Êc<ű26ÏÞSˆS¯ÉIy¸z/´Oœ*kYi‰ÙË6lRºQÜqà
+8¾÷z³ž“pTÞC»e1—´}FyèAò%Ó¼&Té³ ÌPæsî'éÄÕH]†ÌBøÓõöa"unáQaÝ,«N”:FÝÑû£i'Ñ£1»Ö[¤$ëêj€þFuÙ¡dò–MÏ~Ÿõ½bœ¶¹k½žØMƒGµ*‰ÃG”0õé ™ØЀBBVÅBZ_Âë /y LæBÀkˆß–œ2}Â)<ª2{2nUb^=èΗx¨oDÒš6ž_›ÊXÒÙÜêÚÐ×x¢–ÌnM¢É'¦WÍäŽî$ 9Jœ )o¥ÇH—ð“ q\£ÍÃ/Ïîí3
+†µËÏú蟥çf³ÖõÄ›M÷|!¶g#=êŒ.wtCìz¶u¥'}ò°˜_¦*›­PtÜaŽw’ëöR\v^ èTª(Õ:¢_ àT·Q¥´æd…úê’ƒŽCð×F³î>{ÄÉúÌÕ‰&Ž]bÑØ›Ë+jžÅýr¨gt2fÄêÚ+ÏÞ›í–j_€âY^
+ë1£äª .WÁPxjSÞI#Üʪ֊ çtûuiš!Çî½ÝSo·×íÓ8€+zqõSÈ¡,È!ë*T¶CÌ]ˆX­9v]&8S/¤ê`諺aÄcmHê–ELL.&Í·c_ƒ²ÍçˆSÈ<:~¦¹OÅ;E¥5Íq˜ÙŽà¶?ñv— nŽÓŽQ|oyèNÕïo磞YHºÜÈ÷”L¨·½ÛìC$?Màc¡"ÇN7ÎâbLnÙq:
+§¬ì:9§ËY×ûM¹6­È"Ù~ÝßïJ™uz¢ƒÏCz ©aÞÉ!âÚª8µs¨•<Ä× Òð쳯†²Å³XcÄ*3å²›Ëj†Gˆ4£j2Æ÷Q@\}’Tyž¸¢i¼á8t‚ê·ý†ó`gh‡M£ïBD¸ëÙ›0Âp^*•-ºkjÚ·Z»æãÜd¨ ÅüîÇ&n»$q‡˜,[ijK„½½­%¡“îe6eS. âú˜ˆfÄ®ý>e¾î–â ¹¶« ŠØ£>;–¢‚/MòI”¡øi1-ƒ
+¯‹3ÿ²]inÁàÞËDÒ>{ÓЈ dx—v³©lò9 ‰N‰+¶¦zöÍñÔ#é)ó\M£[s@Z›ÉR'õRÇ}ËAÕNQ¹IuÒ.8þÌÀˆ‚;a?ú“‡ö8ζÜ8ùx ÐxoAy橵"wðõçÆÛƒã)ï¼àì…ŒÞ Ί@ÌcKÚ_Ù¼Z‚{+ˆ•\£\hr‹v·ñjÉæǸ((%Õn¹ð· V•BòÃ{9y¦gN°œ fµv*Ûï›s**o™^þ(Ú‘r)`lV3°ð‘öTÇãèή hYmš´0”ÚÊ÷8K¯6ù€›§vóÉy“Æ 7D倷»ò§1 \eÌ}¯ø§5ˆòþ[%fvÄÕ'œbÛ©ö¦&©"ò­ƒõ4ìË*Ã5[Dô`1käý¶Õ•Ï ê`•rM<4{áôUC÷­øwݲðãT5cï¨ûët©„U0í ¶»©kµG#G”Ä~}±yôd¹üÄI!ß©¬ÐGÀEîn‡NOí¬PË$‰šÍµÃ‡WgÞú©é!q@¥{ß®ê7ö$¹UÔî¸ò¡Pšè¾Ð›ÍA©a•bg¿fD(s ¥ùv®gZÙZP€=NÕòä9èÕ&çýw…$H›Àì×Eg—ó¹-}>LÁ•Ó¦4üF¸pâX•*À¢„ƒ0¸LM­+ª[‹Àãco®OóbÖŽÓ% Hé.. Ê X;éôN~'R‘`&‹¤­óH–$Ѹ½¤[*¶–›< ZG„‹m8Blà ‚`•‰
+& ùf¾±<£>W†2<퀔ã*õˆ¦¸ïÞºÑbï)£(]|Ͳ7.ÅBêOo_™íí—I>Ĺ=à[väÍ$ø¸ºBÎk[œ y¸;ª$Ô¶VÔ¶¨ì+Qý †$·fø‰AÙu­õ€•ô퇚|ÄS)¬ß©ãb
+ÞëÇáØ(>§"´Ô?"¸ÔvÂj“øÓ‹©OïDkº§«wèKêfhÔu­ÐàÕ–®L~vsÜLðw~ùŽø›f÷ÀGY¯y²™)¿ÓbOú©ogɺeÁ]ñ¡—êÅÇêá0 ·H—c<ØÔrZ :ÁÀ]>Ùã‚!ååÅÈؤüð¹‘c›€ù«ð#®QÆÂùOsYŽ\$yÓ&ˆ³±Ò„} ÏK÷ØÈó¢ä(ä&&¶¬SÊŠ¡ÊÛË4öË(d®NÏpT¸ #;®±õæü_>ÿŸàÿ K{0Ðu
endobj
-1037 0 obj <<
+1311 0 obj <<
/Type /Font
/Subtype /Type1
-/Encoding 2140 0 R
+/Encoding 2705 0 R
/FirstChar 35
/LastChar 122
-/Widths 2148 0 R
-/BaseFont /VVVFYL+NimbusMonL-BoldObli
-/FontDescriptor 1035 0 R
+/Widths 2713 0 R
+/BaseFont /PUDZPM+NimbusMonL-BoldObli
+/FontDescriptor 1309 0 R
>> endobj
-1035 0 obj <<
+1309 0 obj <<
/Ascent 624
/CapHeight 552
/Descent -126
-/FontName /VVVFYL+NimbusMonL-BoldObli
+/FontName /PUDZPM+NimbusMonL-BoldObli
/ItalicAngle -12
/StemV 103
/XHeight 439
/FontBBox [-61 -278 840 871]
/Flags 4
-/CharSet (/numbersign/hyphen/period/a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/r/s/t/u/v/w/x/y/z)
-/FontFile 1036 0 R
+/CharSet (/numbersign/hyphen/period/slash/A/C/D/I/P/R/a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/r/s/t/u/v/w/x/y/z)
+/FontFile 1310 0 R
>> endobj
-2148 0 obj
-[600 0 0 0 0 0 0 0 0 0 600 600 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 0 600 600 600 600 600 600 600 600 600 ]
+2713 0 obj
+[600 0 0 0 0 0 0 0 0 0 600 600 600 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 600 0 600 600 0 0 0 0 600 0 0 0 0 0 0 600 0 600 0 0 0 0 0 0 0 0 0 0 0 0 0 0 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 0 600 600 600 600 600 600 600 600 600 ]
endobj
-1028 0 obj <<
+1302 0 obj <<
/Length1 1630
-/Length2 10814
+/Length2 10888
/Length3 532
-/Length 11687
-/Filter /FlateDecode
->>
-stream
-xÚíteT\ë–-w‚-Ü ®ÁÝ-h h…KáîîÜ¡p'H ¸;—àÜýqÎíîÛã¾þÕÝ¿Þx5Æ®±¿5ךKæÚ5¹Š:³¨©1PÊÎÌÌÆÂÊPÙ;;)ÚÙ*0«Í•­A€7€ ™šZÜhÙÙJü
-  ­`fç°þÇ`bgk
-ú«5'–7.Q'€ÀÉhz º™
-k°ºÜ¬š;£ªj_!Oð$ã­Žˆ§·ô~”.ù~8T7öè>&)u±¸m˜ PX5‡G4‰û·7´½Cý}çp]ÛDŒÙ±HÔ.°h4‘~ÙDºåžáŒ[ïjwÈbºr¸°ÌN¤î“ƒðÆüSgÊrUm4>_pû´e{eÊóÀ@’ªí!B¾^gYâ¶fˆ^FT{ônRçz[âœ5Zóì3ŠìŒ—*J–>#
-sÁx§¼*o.á_g}wýœñl^îkÝŠÔ'Ø’(Mô{Ä'’WuçÙ>`·pòdèŸoR[ÌÒö! íë&XôÕFZü¦½ê>ì%Ü}g·û[˽æb6J¸uq ÖDP»}"ßžo«/2åKžxÊ$©ü&Ú6|I²k¢QᲪÖÒß(Fà"A=PÎ2íܘ??ý@²å·‡•Hki–óº‚i¦
-Û#Ò¾ç‚u¨Öåºp³àž\¢4hS ©–Eéf< ¢sj`ß®›ÌFpï(üÊæú|k-è=‹ãEâï°ü‹üTvalÝ´X\0X¿Ù¦?˜|ew…­K£KòÉäÃïÚجäÊŠíŒ]Ý: %¢˜~¡¨ç7GÊÎÉÃÄ} .Íâ<!˜ !†As¥»˜ö”ÌÔš(;¯3á‘7ÅÆÊ0]²Q|Â^ÿg×C´U´raáfùgzfÊeÑE=n«d?8!j¨¤WR-å…D¡œÊ¯mh$¦œa—C½Þæþ©ƒ®Cä¶wk!FËèIØßaNó4dý6x^z/ë„:Ž ºøÒÈQgæAÊN6æ ž›pP¬Š?¼û‰DÜÄÐ9Ó,4(E#´Íô;Õð¬ŸIaê‚«{Š‰ÏU–¦/ƒH»9ì’Újà(XW†ôí¦Ëø­Œ¶ù¸ä»Ü_Cþ[uë†LFq ­Æ!ü
-[ù^®bÓ7£‘“Äh'–y¥QT¼æ ÇÄÏy±a£üNåM ¾¦‰ÀUOE_Û±Õ©Ù÷œDS±&(Y¡ô{iàÇ¢r_žv¤Ñ«8¤Ab1è±M-„ïÞHHºrßÀb¿Oæ[‹h×èiy¯øÉƤ¢¶­„':çÄE·tzUÿbË–È.ØÖ;̶€ƒ¡</­DuR‘ZoOdNÔjFÂi/_ZŽ 2f€ÕõAц‡($k}ÍåcTsí1R»°$ˈR÷k»=ÍÈ~€íãÙ3¦èýÅ;ÂÝ'ÁP¦µ ƒ·ù]DS°3Ýø¢$;è›<£…!sÂÁé,ìÚ t4aê\D.ÐÒ/Ýöƒá4$ÌrQàK,T†õ˜zv"ÓÕ3(²Ö«ñ}Ìsjnv4ÛÏ÷†NÙPJý‡ÆT+Ëç@f4eËâ¹×pƒÏ˜—yUz„P•Í=ðˆñÚ
-5ú\¾“8¡E8¢ž/›ÿš{¡ ç³cƽžÃ ­þ©mÀeô¤]§¸ýÏTn)ª¥3½Ù¬Y gÁQ hñ}7Ú_»U;ü‚ h@Øùû3Â)Y#+³RÌ \pgùGÝq÷pÜAiµßBwànÊfµ„FGjœJnBáð걌¿YâYQì Wqò0ƒ¿ÉA–®îUH&@O ¾UÒé“̾„ï”®¦¤ö¨b×SHôôò¸Q™°‹É•è‰G|)¹½žqt绦_jF7øÝ¡Ôš×Ïi¨£ÿÉ@HRòÎjûioÎI­ÍëÖÄ°2…tZg¦¶à]Qˆ¢¦ž:µ.;›#ôªßt0±ÎlÌ{ÏàQüÛvü«¥´®å€
-ª/ªœ{Äøø>º$ÉvŽÏÊ~{ÞÏ>ÐQµßS°Ââ¡v»Út`{æÙ°¨ï•›( wJÝ$ÒTùœÖ’F™yˆç·é›Öõ¸ÇÐv‰øoµBï:>ï2ýôK-ó»}—®ÒÁ//Ä€fHÓªQÒBÉÈÏâÏñIW]1NúX˜ðCk“L2 Ö¸V2ûØ/‰.®#G`1¼6ü~fÔ R–|Imd¬²ôðh„{üÑš¤‚™Ë»äË´ÿeÓ.ÿ…Kµla°.
-‹jm“Ÿ˜=~ͼ”øh0IzÖ¦ú·O%_Ã% óa:¢hšP³
-S¹ÏÉÝÌŸÜü¾ØœQlq¸†=žà~pFÛÝÓ³0Ú=î,ùƒ272ï‘,n&£#:$Š¯JÚ0ˆ/ŠRžåe\ßoeEÄ`µ^×!Üæª-î¶ÿš¼îKÜ¥8ÈT?ß÷£G§
-÷glü2®® O!ÝèCÖ½93ìôÙÆ_*©a …õD¼3»–èâ/ˆ’Ö®¼à–tõÊC¼z]îú¾¢(ñÏ~½ŸM¹ã±ÿ.#à:ônÓJÆê|ošAb%¬Äiªê3 M°úá]@’œïjoj'õÙ{˜D—ÚëF*‹/‡?Éå'Å!\˜ˆeÄ£
-ëŽ,/µs¡*/m¥$±¸§Þ˜¾§Û›§pnBÌHé”S*û0uœd²Â©èyÁ„Sçx"ŽšÓð§ÍïB½þôÁü{Y‹ð"ÂÏ1·¾Ú½IRA®ÙÜà‘=$Aê[ž„ÍŸþ媓D¸“§B1·ø ¼•"Höû÷Åj·Â¡Tˆû\ÑiÀ´G¿åG»xÿtÊí|ú?Ã4fÓmƒŒŠ% 2ôÝLTW¦‹Å&wË…j•¯?CÈÆ6X™-ù» "zQ׶Ó6å[g#Yóñäúd[†’°‘ã‹’È®óÐË" 6Ç”wue# ¬ MË%òG¦ìü) T sbw^˜¯ž«TMZ‰âK_5¤÷ýÈ¿“ÕÌß/ëâ¸|cÐùò{ý†VðÌSÛ¯Ã9rFòâý±6„ëhˆ·u^òö´g?›õ¡çxu) ìEºéµ5B=]× ;¥Â’Ë0¶§s7ÁjèSƒè‰#Jws¬Á¦ôE`"¨€:¾2̯sû6Œ¹cÌy!¤¬èb‘߸¬ÉZæc¼`ãû”mÍ—áM*ÛM&½{Rù³®óL–/ìœËG¬¤Á‰ß/é0™'
-ϲiSÛz´­õ…¡I§ `~œm5é—ÀyyB‘Áƒ"[{ÁûqâoÓÐåºïªðRBøœ
-;Øw3øGæüõù¤…Þì€E
-ªõVÖ>ß"‰Ï
-žzÊ6âÄ:gÒ¬?yéM|â(¦‰RÕùr ði­æp2¤ˆp(â 1¤¸£œ¡æ1Rᨅ 59©ðÏ~J{ÖÜñÙôu³Y+ÂJàå)$Müà¹kMˆz,ª.hÚU ñ…1FÑÖÅ*§, /+CÅe+ÅàãïG›},{S&›1ê’™l8ÈÏ›òIø°°€¸¤•·©x€*Ú§wH™^kŽ6ìÔZ$Hq¼Æ!Ü Oý#$*%UˆÜGP õi±}&ÌKá6ºÙÍ(ô@€ØuzZ Ý^ˆà>ªR|­ fö*9 Ÿ}&R°ýgFÝ^å†áÞõ°(|õA~øo,"ÊŠöjes>@vôfK=²ŸßýÄý¥¹£ì“ã§.WòÞNBtÎáÂLå*B±Æ5“¢MÔ®øÙûè¡Cž)øð nßúB¦€×~µ_ƒ8c“Îãš(‚×'ÏÙ¿²6¬iÓкõ°T«¥‰;kÔ4¥ÒªÐÞ™bä® 5˜Ò´íEXŠC†q)6ôfWº‘d0¥àl‚$8ç<
-Ì“ ¦Nó”-ü¨(Û–7 .\2Q0¼[ã>ÞÞc¼9&‹+LÄ@¸J°aiÆ—23Äoâ+Åçu%•!·îÐ èä™G—!WùIŽ‰ó¢fÌŒp V[ºÁ);A Ž+Pc¹ÚY¨N7ÓfH¡RÜõªv¸¯Î_ÛüdE…Ð鼦‰ˆzèže.7-„ê½NϨ?iœ¢}U'ÓÁ¦çÿ
-Úóž¨e6[x5±IœG·6ünñ>ìlu ¬YØÐâBZ *7VU?Átr T1[¸™w¯ËÖj6Ó”äê#ŒSÔ\D¾y¶¢yÂw” k7ÏC¤Î‹ b‡døé’|7ÝÖè¯:9so³h2ûñ¸î–¾ÈUªû—rl’9å'sÙ°Q@ýBîå6Õ:íkX‹(­ió¼·õUðW¼ÕÂîcŠ˜-¹¤ƒ¾-Nyˆ®:RjQ4KàŒTÇc—ûÜœï¥&)ëdQb¼‘– ˜hïáœ#±»¬žS£`KXÓK5S°]Ħ~ WUðã?É g7ÚX¿~p™ÑðÎu=*•ÝGK;t·Ú›iC¢­Õc‘n6=‡˜ñtÄY9ÉæU¹¿«õ¸² êvæão?32y ÊÂEò^‚iYk»QD}ÔÓp>ÌÔ>¨[ÑeØØÙÎGuncáTçÊÅGP½L`.عjÝVͳ…U16–!]!•PN‘âñ³ª^{[T´^Þ•tBÅ.‘¿˜ç‡n\¾„a ªáàïëðõGn‡ ÜÌÂí?¨‘‘å²cýP'}¿ô51iå0¦Tz4½‹Úç=Á‹º£ë°½„ª&koMæ!ø\ß"g*ãÐu»r £6„ŽÑm­³šÞRAàÐ,H¶ëUõ@=ÒØೞTÄ2–‰ÆŽ÷ã3él~ éÅ»{ º;j•ÜvÓœ:Ý×I“ª]:³Í~ÿòYŒ“o4|l‘E½&$è0¼¾Mi4p˜òÈK]Pào½Ö§Y[5¯…ˆDEì¬h.«POýéµû’%
-‚¤=Úd!³ãdêÉ‚Îl4ls~…ŠÆAQŽŒr÷î XøT¼m­97bZâ¼é2œÄ‚M<µ/¬Àoþ´ùŸ“EF:oÏƵ¸rÎrs_€Ezùã\D¯Ð2ï]‚㓼BG­+¯£x»oÞ#‹MÞ¢•ÿiœD|!# R­þ ­1*׶àN ]püPÞ2'¥ò¦H˜f)–ó¦ŽWv§Ä…© :V"å‹G’v
-ÎÒOVYrX¢ïàwJŒSôm‡¯)&`WfXñï³’Ò‚‰oRâ­‘cƒ'ò­–c^ÎlïŽOF–õ×Ùgäëf>MÅ·+(çÑ£ø½fM•ÝiïJÍ+lÉÎ$›©Øȧi‹ Kº¢»»þYÆa´á+“Ðã)ÕÕ;{¶
-{郎£¼Ã/ô‰ï-˨–ÞëijNg°ÐMë"@þ0ƒ[ ®x<Ey3ºs ¸I=t¾0fÌдƒ
-Þk—Ç|¶=pÅ^„°·Õ`›óû ŸRy£!«#ª£þ²s`<5…µ1Î}¿äóè-É`Js_!ñ ®èë媌D›å(:>žd/mý€p @{ m·bÊ3ö£±™W€¯>š‰øç_ìŒïyž"ÿÜßXvܺ†FŽ• -+›5Æô™6ì{ˆñéŽzÔOBz>1%Α}}mBl*î Èà+’?îÍ6 ±3™þ™^\É;<·ør ø»(YËV¼5,{n½@Ø`2Ÿ<Þ#‡æé6~p/Ø t+—¢44bOT§UŸPʲÁ%Ï™Ý×êmŠ¿¶kš¹ÒÍ»¿^Q6R|Vœ=¡ÒÝ03ÉX­®/Õ¨îmˆÔ-gN
-^Á?g½Ç[eœ[T.¸;8Ëñ1S¢ÒŠs¹£ìãíÃ.õy‡¸MnÕ\v¡.Tü©Ä%ñõdaÑÉ•%úh¡æÍ".‰„%{O÷0+íøHæ
-7³”rÁ©£håIËC3L—ÏÝ| á`
-4T¨Tç
-ç!ÙYê‘éó`þiîcînÿ)£×„ø6RÜX†™éЩÉ^ÚŸnà×–,&ªn¢r‰þ¥»GB=àðÇïÄ‚†v|q”Z¾~½êÓ¾j¹ú–RýÇÕ? ô¨´xË™»ýñpŽ~Îe|E£PñÎPB´*Žm…ÃÂ9}zùµ‡ìDy?¹8h•))^Çj¹~žn+TêóÈ÷Ð=ƒ,¼¡a"란)¾®‰£¶:—J¿ŠúD4$ç›mÈXfjfÆ¡ñy%[¸"6¾ÒxB)•®ÅÿÊŠqÎ>¨×l´—틧¡{¥»¬ëe˜R™ÏJñ­j}Ú§ÝoìU¿ë à{™ä–\©†õ6Ü:ƒ·¬ct5I/« €,¸Eð=÷ Â8i¢+~[‰2ðL~¿%˽ΨEdµÄ3C}®éX…VÇÝ?àëV!CŽä‚à`D2Òé4Û%‘çÖ9¿×õH„)¥ð„ÁúO”P7tt1iU~½&=I¾òèÏF}=шû\XUêÅá[&¹î3=ûŠ†ž2¦8Š¼á"GĘ›À[pClC½ÆXÊÉÍÿQi¶Qk bºmj‹df$Àw =õ´åƒ‡”]·¨¼þÑØŸKƒ©ÄøÄ[¨žúÝðq*ø!y›%Å…øØLÏ?×-+Ù‚õ´RGÒX I†ÿI±`dìÚhZN¹Í"VÛ‡ûô2_®ËâÈ«Rßó!«r
-2¯å²vƒêõj:¨¿Q<¯%C/õ±c“I+úI~ŠøwØc`µÝµýƒ§¡þŽ¤ûJâ˜ô ]8 SÆ/¸÷E.ƒa©4Íî¢gb‹òéž7î;‹f"pçìÏðB]u±¿‘ßó‡èãb·4îžiÀ[.þB&Òva­¬7*l?TГ„ræÝÜnàœ`á'r¬Ó¦Ló1&9¿å8ƒÓG§~p…QxcÃÒ=´Z‘ðŽ±Ä5ä‡Ø×n™ù VbY§©àùÏ"§Ñœ}úþZ–§75’¿@-[Ë›œ1=u˜Oÿa"&¦u¶|Êê;ÏõåÅÆŸ'?Hl4ëE\³Üà#ï<Æ—
-¹`†\ÿ¥¨ª1¡Õ–£ªø«¤\Å'GË'²RSƒbzûÀ…´ãé‘!©¼?ôdFÕ±EÜ%üÝtk'õð‹äpNA‹Ûº†‘ã«óµýñÙyõ)¶'Þ¸$—( ºI‰fÞê¢*)
-£ÖöQðŠ,$ªõ@˜Ôáö%Õóø*(lŒl>9h¼à˜áxJ¹öÅþãn ˆï§šxíWE¦º²Úa2”b÷^+BBF¶-c¬>À‡ ïç ›Ô„üR¸²ý³áìKE±®èÕ'¥Åq5/ÃÊÛËÑ»ï-ï'{+Z‚"Ìô”{9…Öñ›‰ò¥YnY’8ùUú³­^dËÈæõqàÝÝÚJÌ7C)[yðîñïÆ^3>@–cÉã1ùé
-NaãLïñ˾œ[{Uy<-Þ€-§Žà@÷ÎG{|Ñâ'ú*&MËDß×°‚ÚKÆí¹W!¡ÏN¤µ‘ÖÅe<Ò}øÖÐÇÞfnÑ»…³µêmºŽ5Y ’8&€ù³js¬†]ea^å(Þ¦14üŒ`pË{B/{ã“ÜŘÊgþ6<ÔÆGE§Iwuy³¯<¡= 7…ýÉ̸¶ä3…}€ÉüR4{Ò^ø<zN‚‚!y™ÃÛíÃáxVRο0,¹V‡}’Op7A7!ÐTÑQP˜ùT™ÜÞl,P½ÙTE™>>™åÝ°^ûþR›„»¸8'n¤-ìJk®²QC
- ¦Ô"ZñwOòï™»ÏöP÷ê¨.ÐJî~&Ö>zm^B¦[s°'òYøš×Y­D˜¾
-¨ÿKuß!å"|ÐÙEÆVÌð}†ô¡¿ O'®ÖÎþ€å&-¸ùhì8ö²0ËüÀëèæy€ôõ«`o­$‡Rš´y?…|¨ç>K/µ^¸°«l/J¿í§öÙÄ¿Ñ׶ݶëÒ“<‰âïŒçî*O©ÍTK?5;º(›o³ÇUJN¤P3
-øÍæ6?ÅÖ%X<²˜6˜ü” èýÇÓ·55ιbÏ(L853ïáˆÕë¡›íÐêº/ÂÐ7q‹^¿_5
-r•ŽQ¾¹42"ÒQyܽ…8[E~*ï\ºÊYòÃå«&R½n<NÁŽ¨ÎŒóöÀ8mÈpf0 <«±Ìœ/Fµ{ —·î9ýöÝ„PœÒÄ@cÅÿ4¦; ™«×”¯ü¨K­ À$çdLÎð©»$?ÊCîYÇF¢á‰á&Ø,ØÏ<Ú#@Ë%® ]g‰hƦÌäÒ†F`{&(]ž·/iÇÕÜ\p±"Ëbö>¸M¸  ý¡$úu}ÞÕ*äW˹ÑwçQ
-®ŽW_hi+yñ¸âÅ‹…†
-ë‰f m…ÚÐJï¬ùÏ¥‹û ´¤ešÌiûFt& ß–³´Ó²ë“´›>Y`™å³{ëéÄ2 û“°dõ>sf gz s‘žI Ï¡¡Æá÷”êK“VeùÞÉÄ;NIN² -ÅêàÒ[xŽø?‹¬ !¼Ž”xí°åJ¦v<x¬/ OKÁ5
+/Length 11760
+/Filter /FlateDecode
+>>
+stream
+xÚíteT\ë–mpw÷‚àÜÝÝ-@€
+(\
+www4Xp×àNp×à®yœs»ûö¸¯u÷¯7^±kìo͵撹öGC©¦É"nî`
+’q°‡°°³²
+°
+˜Î K ³¹-ÈÅåæû¯éü³OÀêèèhëùw´Ãß^ÿQâ²µ`EfçxËiyËm ¶GþðײÈÛ[8
+Œ»C]ø¶ti ÓRß÷ Ý…X«´m¼L»AŒJÑ2uc¼Ïf•ÖaõyØtv7GÕ5ŒJžáÉÆÛ8ÏîÞ»àRß:¢û™¥×Åãµc6¼Ãþöåè˜6ùàî–®oxp ¿ó®{‡„)7‰FÐ 6:À)—DT_»Â;’iºv—"®;)ˆmq*ó‚?˜1û5_ÝN[ë’ǯ=×ç³"/LIê}Ä£›k¼¶lBñ«¨¯¾-š|oRkÜó&[Þ&±ÝñreéòDQnßô?ª[K79Ð7/Ù/–_!ýmÛÑŸ ·¥Ê“žHÕ]Çy÷A8­\¼ÙŸ.¶h¬æèú†ô“­Bj£­Öè®{ŽúÈ£÷ öÖt=¿ !æ¢DÚ–¶bO„t8&óïû·ù#¿-L.Ii§¼µ\’îžhRºª® xïN
+®°V
+(Š0¢™PÁ´i—µ…½g` äÒWDWN=%&j c6–K…Á×M囑êæ>vEÂëÁ|Ž¹Eʯ#«îu€U•ý9å™x¼.­dávÈ!ý:8ò¾€Ù€;pñJ#WT ¢Âª^Ûà'áHðmAFr4”,=gK3M¨Ì(R
+ª¦S0†¶5§(ƒç•ÒÃòÙ#ÀÀîœj›Ó=âéÈmoßÐ
+¸wÛõeä7ÊüÈ‚Wª¤I„ÜGñaquÂŒ†!q”ŠÂÓúF›ºNÑvw=É€ˆ ø?©þ¤ÝÊCÌõ ýß{?~µCâ¤ÝXœì†q&ç1j;¯ãI¢™Ô§U$´ö2s«Q6·oÛ†±Œ•°ëãä'n¢ªÌ(" iÅ ÚPV Ý£BªÎµqt¸Ö•Ým™Y•d>Ã[¶‰’¿¦ÛV­¸‰õ»ë+WÓP¬Å`,kE}±_Ys™°
+ä’Þ›«+;Wœ‹ò,ïV‘äîIº9^Ü¡U½0~˜ðâÝ^ ^ñܤOgn}Â]^¿¡%K(îù˜§½ÉõUÙó˜×òÁ
+îÑâ§Ó/ÆÔ€P +°-¼ÝyתžVý(/}_#™mѱ¦€*¥f~[ópÏ8V†ÉÑ8ï„$gÿ" N:<3Uwñò›ðžÂp6­Ö‚ËI&Rü¬ÜŠÊ“‹pžÓo/8)Ô+~Û Js§\¢­öÊlöí»i{UŸÈ»Ã»4´½ÌM_˜š?Å]FÌ©•A·Ö_\"Óƒ‚’Þ}#FG ïK}g|ÿñÌàë":ŠEù×%ñ’õ.C!+6‹¼R±ˆà!Qê˜_};¼È#Ëö]¿?Ü~d'My*½{·8¿á+ínßû·/ŸuG«ø0¢ß§ÒÍéÌ–àb“'¥ÿî¤ûm>‚ÿ«?‚´Q õÞ([ºÁfMÛÿŠƒ´–?Â…?¬Žžš.Tùô+ª©ãJ¦eUq8jrÜ…Yp?Á ½Y~H…#úò=*Ïqí·Ï™‚T蓦ò¡E‡üA‚⫘Lm=ÏÊ72Ø÷]‹Õ™+eÉ¥½õ¦ ½=¾¼Eó@•3.¹w¹Gãd“•.Å/‹f\OFJ$Qó:Ñâ
+ýò­Ã)8ȉÅ)7è_£Œ·ÆT÷ô壌mMÌœ+¤
+G¦©J¨ç­$î}0ÿx¯R7ë&K.iËP6RÔ.<,ë㺥1~4XÛ¸¥>÷Æ ètž•>¢Â:Ñ#)á>æk[¾»ïÛ'Îåõž¬Ž"¥à P¼Ê!B5ÿi‹ÒÌÒ÷ÀI¯´æ6‰ïíÚK²j?uFéi‰W!Ü’½ NÒ.TEtmúÖF°tŽ¹.†}-¾ü%`úµÙVîC¢p?VúŽÎëÏ-jû-fÃrÅó$î‹Ï„¬\AËÇlä¡NÉWô˜,
+Ÿ`bêTèÖ6çCÅx+Äèô@›þ`ÙvªlÐTw»J·ô+²ùøp4Tâî]” ðâú>êóXÿfßdO¤Ï£\Ï”H:[PC‹Ä²¡-‰­Çó|—ÕÏñÊŸ0ï³iov%§Ž=Æ‘»ñfLu³$ŒX«Dm|BØxz’‘: ÍDï¾T–[&n'îóšZ) ¶L`z˜÷Î(1ܦ—Éc¥œ˜*`ï3Ÿ+F(ò¿gVà/_JcÄh‡ÛÑ|¢Üm:rGæ-Ãì]07‰±?×›­‡¶­0RK4åÀí+—‚`îŽDÕÐLºÎ’ùˆ9>ñ¯ëwe£¯ÓÑ©<Ôº:n;=]7¶cm$Ïjô¨âÉåx¸Õ8>Ãp:'`=2’¬~'¡·:é'î•üc|±#úvN<
+É‹|9
+PÙ·åI,™ËúP5—ã´"ªYžBRÒ!¿Ñ)ÑEï…ÅEUÁO»« Ñ ¾ 0Å)Û»9Q‡‚áT¥áååh°¹íeýè²bOäo¿*Þeº}N5à„M=*,".}º.ØÒ >Dï7¼¤O¯·Äštéþ"Ìs¾Á%ÞÌø-".#S„ÚOXõNèWÇl„Ò]8T‹0üPÔ}zZÝ^„ð!¦Jr½fî:5…€c6Z¸ãGvÝ~Õ¦ÉþÍOqøÛÃÂÈ5Bl’÷eÆT5ª–ü€ÜØ­Özä€üÛ W–ÎòÏÎBÝî”}]Äè»vµ}V­&–h Ô0;5#ÙB탟{ˆ>â‚ éñ¯/bú3 13„;6é:®ƒ"|sjü”;“ã´iK—‰Öcˆ­^#kJÚ•üMCG&³ Ú#©Áœ¶}äe-Yò
+iÓpn¥ISÖÎ.DŠkÞë‹eªñÔY’ªU
+{&p–è°ÌO@¤)ˆ
+á(ÉÐ'k‚ï¾}ZuqåÙaÕa àuß+•?®Ò ,ç<Ü¢p)Lå¶c§z7ƒÜÇc®{Öß°Uþ­ÝûÁÞ_)Pùîã0Nh_4SÌbÉ- Œ”²:ã%¹îL¯EÑ)ƒªÇ7D.÷{¸>ÈL¾¯“G‰óEZ:|ÇL÷
+ƒÉ/¡¤èïiÔò;ÌóêôÿLšUïÑ[læQÎaœ¦Ñ>ñ³G÷™=}!C‡áóoΤ…ÃTD^ê~÷Yñ5l{ž³×(᳓* ŠŸÏgé­?»ñ\²Àå'Ç…îñµþ@vǸŒ‡¨óÀ9šæ‚Ã?ŸŸ¾èxŠBœZ÷ö´köö†dqÏ‘"$!ˆ íxðÿ"` £þmÍÓK›ë.¿ôe|ê:Ÿ†›%u@éœo('_
+¸=Äõ¹Â¨ìW|ÝóúõyÆ壹Œ O<ã–H¦¾kû»TCT•3SQú˜8EŠ9·[Éi{ªðãá²Çäve=§ûïŸ$)e Ù(ïöyï6bU_>`R¨ÿ™2Qt˜çR?=ÝIêbĉ& ¦yÍèZ÷;Ø%U¼å͇⌌àÊ·«6ŠnËLJ˜S2tqŠç+ÚóKÄ0H ûÓ'­½ª~Ï”aLø˜±ºÙ‰l½,£ ;ˆ$ùubq¹ñÝ8cC¨.b /άKÌJáÖR7£¸§ôŵRì`çzËb“³Z'º½$ éëý€Õ÷ÒÞù¡À.(?ü<Óo' ÂX£¹
+½‚ü\Oãl}çÏ rÉ^Ü ëcërhÁÄ{£ x.;9¹ž³¸#ÛO}+ö H‡Gzøå% Æ®¼ð§AjS2kí;<)Ÿ@ZÍÆ»È`n#çPglv<C[HÀB
+ó>çxž–HhÑo°þ¦¯£mÉ،Ģo­»L£ÇQ“0íñÅùuâ#ø2†Nü®{Q[V¯Àj¿¢»þ?ƒNWô¨?ƒt›á%¦qGGö:¼®*x¼ÃÀÌžÙÍÙ^?£õgf‰•çûúpïîLÂTÅ7^\ý?0[ÅÃèQÄè$†À×}ÝŠIÃP±ªÇdYvgä‰e¦w©Þ$àŒ¢_™ ×¹Žéß™†Ø'DÂ9ËŒ?h2ó¸%¹ß̆Ó6UÖ¾—õ„¯m“±(ò¨øÈþ­ÉæD¥«‘÷§½ºwõ¦$MMó:2ž“ú©‘ƒ=‡3Ït]ÆF±°i\Çã“%N¥ŠaÿÝ£ÛEK¼ôÑ×îŒ6y.G­†(®AM†<ï¹Ö~Êyõ.‹ï—²À.õ8'_e#åBâ[7Q:¿žßämø"mƒbìS ƒŽÆZá 4¨YŒ•{t¿Op¡Æ¨à‹!| ‘õj—/™§ÐLve§eŸ(ú]<Žqž(Á¨ð칄…ÏÀßù¨;ïAJGZ0ý7ùˈ¾†[(-®P+Uìp¤ëñ|\—;ï<?ÿTlX8ÎíDò§ ê÷ç·ÐÄßÇð“QÛ¡ª›¾ž[,d‰É;´Š±¦IÄW
+² ðêwòoÀ
+=+Ñ ºEg¢ŠÖyé5,˜bQÚ¥x®Û:>ùÝ27r¤v¨x©t¯½ <¢íæVþ–(ù’]”Û­®ÂãBB²ßâ ïE›Üä ?•ïd
+ž¥ ̺”k®ÖPú-F3{^.|àƒM],¿Òck&Ïý"§^{9D_o·äË•ÄgDwŸÇ>B_6õ¦F§zJ­ïf¬E§9åGÆŠ(IK6na mü¹¢äßúta\‘±+O|oÛn™ÔĺàÙ_ $üÔ>­Šäkës±7¡{^´2ÐX úñ©ã³¼€¥=Š&I×}µîäØsU5u¨ÿ’àï"VB”—~²rön‰Ã/A“¯>k]苬’)ŽÄìÂèÌ?vYèäF8ìúš
+M,b?Sœ†è‚-\ ì‰ûdVwÑIôœúá~Ö7ŽÄkeAø€›ÂG9”¬™C:¶œ<_}9TïrTÒ^%M…íŒC,[E
+tÓÎ@½*¯g :_‹»o]Ÿ°’cü‰·ÑcM
+}­+^ÂÂí¯e‚³é)À+-[‚fß7 j5$‡=á›®bÖ;tZs<u%/é*¶Èø²EÌèÁþRå´6*Fõ0N纄Z Ä4÷€4rð¿_ÓktV{zd¨%Î`n »Ú3NrÁ'ÉHŠ¡Q1Â\®©9à
+$2ÊÓ‰Ÿ (¹
++ä—JEšÇ—éáJÝËÅGq­¥½oP—Z{@LŠõÈ_
+L„³”%$6$n”%  I1YÈcó³:Áì/÷HÅ
+uÎÂüÕÏÍ{1T¨—t+jªNìpC4ç@ÖîÅfÙä:)0ýôðt<P‹b¥7ŠÔÒ·š‚ù(23¬õÙMö+&c Ól.^85^Z£ Luü‰
+EªÊqÓëTéCòâ¯yÇõ•+«ûv©FZpÇZòU1ì´‚îâD¨4ùÓ£Bªg9Œ¤ÁÆ{¾Púé™S›vÑ$ ‡¾\ñxllË5çÍiéõ$éTlFÚ—}GÈØf<ü È -ü%ë2bh{açògôCÿ£ÜïW{e1¯éF¾'GŠ)Æa.¨³BG=(”ˆüªCÞÛjHk_×iêPtkºé7ïze›¶ý“tå9¬)U1M¯ž6¾¬ 4*k?¦‘<ꮢ±²àN|×P’.n¹||£ÜU+¶3F”MhÆœ ¡¦9Ÿ?hHû›ç—nr Þ-ä0±Å‡ÝÖà’U·¢PA7ÄÜFwæ°'ŽÁìÓÖ‘–º@çPú)B²àFpéœ=ç(®é…àÎÂL„N·Í-þÄYØÒ.ŽF¹ÏîÀ1­ÇN4.ì—{œH¶/ªB¥0¿N­æ%@»&ZëÑ»BhÙœæ¹áí„WèºÑ$Kí[Êit9œßë;*ø¢FÜíƒPk—×xøOyŒüøŠ¼ÂÛ/¯OwÙóp»B"6àl:ˆ›ŠÕ‚U‘eP
+Ç^; áµ³†˜¸ÔÕñXðÞŸÀ»b’¨®k€*G/·O3(|ýhÉ›ÐÅØ%§Yæ6ÈËM‘~OŽ¿Æñÿü ½}»—%Kƒï¦|º9W¼ø+[Xìè¤P˸—úòbhê~ƒÐT¥:J‹ìÛÔ
endobj
-1029 0 obj <<
+1303 0 obj <<
/Type /Font
/Subtype /Type1
-/Encoding 2140 0 R
+/Encoding 2705 0 R
/FirstChar 34
/LastChar 122
-/Widths 2149 0 R
-/BaseFont /RRMWZR+NimbusMonL-ReguObli
-/FontDescriptor 1027 0 R
+/Widths 2714 0 R
+/BaseFont /KALSPG+NimbusMonL-ReguObli
+/FontDescriptor 1301 0 R
>> endobj
-1027 0 obj <<
+1301 0 obj <<
/Ascent 625
/CapHeight 557
/Descent -147
-/FontName /RRMWZR+NimbusMonL-ReguObli
+/FontName /KALSPG+NimbusMonL-ReguObli
/ItalicAngle -12
/StemV 43
/XHeight 426
/FontBBox [-61 -237 774 811]
/Flags 4
-/CharSet (/quotedbl/numbersign/parenleft/parenright/plus/hyphen/period/four/six/colon/B/C/D/F/I/N/O/R/T/bracketleft/bracketright/a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q/r/s/t/u/v/w/x/y/z)
-/FontFile 1028 0 R
+/CharSet (/quotedbl/numbersign/parenleft/parenright/plus/hyphen/period/slash/four/six/colon/B/C/D/F/I/N/O/R/T/bracketleft/bracketright/a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q/r/s/t/u/v/w/x/y/z)
+/FontFile 1302 0 R
>> endobj
-2149 0 obj
-[600 600 0 0 0 0 600 600 0 600 0 600 600 0 0 0 0 0 600 0 600 0 0 0 600 0 0 0 0 0 0 0 600 600 600 0 600 0 0 600 0 0 0 0 600 600 0 0 600 0 600 0 0 0 0 0 0 600 0 600 0 0 0 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 ]
+2714 0 obj
+[600 600 0 0 0 0 600 600 0 600 0 600 600 600 0 0 0 0 600 0 600 0 0 0 600 0 0 0 0 0 0 0 600 600 600 0 600 0 0 600 0 0 0 0 600 600 0 0 600 0 600 0 0 0 0 0 0 600 0 600 0 0 0 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 ]
endobj
-952 0 obj <<
+1227 0 obj <<
/Length1 1606
-/Length2 17112
+/Length2 17262
/Length3 532
-/Length 18022
-/Filter /FlateDecode
->>
-stream
-xÚ¬µct¦ÝÖ%ÛvîضY1+¶mÛ¶Y±mÛIŶm[õÕsNw¿=Î׿ºß×מ síµÉˆ”è„Œí MÄìlé˜è¹r6†.N²v¶2tÂvÖÆ€¿J622Gg ;[Qgn€š‰1@ÔÄÀÌ `âââ‚!ˆØÙ{8Z˜™;(U~ªQÑÐÐþ—怡Çÿ´ü=édaf ÿûãjbmgocbëüâÿú ’‰ ÀÙÜ`jam‘WДPŠË©
-.†ÖF
-¢bÿÎÓÙÜÀùŸØNÍ
-à gçü7$€òÿŽeúÿ>’ÿ(þo!ø¿…Þÿ7rÿ“£ÿíÿ¿Þçÿ„s±¶–3°ù;
-FzÆ+-œÄ,ÜMŒ,œÌ¦Ö{ô/½Š­±‰£µ…­É_.ÿÕF
-Ð÷ª-KCºæì¢]•ß@e›‡á±Í R©e7ãÝ8æ¥X¼Ý ú^¯bª¿fiWã¦Ç6hé("ôæ?ü…$ØVS̓÷â¹-Àõæ}DJš2½œœ$~T’D™ˆ‡…:Nq®ó#5ßì" 󧈼ˆÎQჶL–­Èµðc“Êç؉/WöýîŸX2ŸÈÈðxª©-“[¿F7žsWÆ{4B
-pÇ€úâLV›‰¨ÛE°¼õ`K«Vá½Öž\ºÍªk:K?>1ÁÆy9ãd™5 @P2ƒ÷Í°]öþ6Í(9Ð`®¦ ~ Ì¢ß +¹9y´Æ¢]’ˆåþJ¿*ú¨ gÒöK“]?e’CÌ(m
-D\ïN¤Ô´|˜Ǧ¡‹Uf¥—øŒÉïÀúÒáè
-ûÙ £)¨Ž&‹"º–Qª86Æ…‡â9xV6jƒxlˆÊù†º’2–^ù
-|Ò Ä;c g¯lt_´û•jP°– ¼ãT³mê=-ŽÙ
- ËÖ /¨é?&§ Ã­¤oø
-%Ñ]µÃ³V‹Éµ‡†#hižrX£2¾K±²Å?²©Ç‹t3V<«×üHl'}µ“œ7ÂnhJ권buKÉ)O^Œ Z5‰OßöÚÖ?ý<ÿs88z™l­; %ÔVæ ËŒõ”ððßEôÌH«íjÚ ~öÖ´Öb}ë­MùñÍê+GÝq’Yµ£[N¢+C1¸Ë¯ö
-RÚ8Ýw>SÓ¯S®A˜Ç©ó-×;%¾À˜úe
-ß$TAÂrü—ÇDUËx,¬mCFË„vh”V¬èæÝod%·Ýͼc‹ò¡R´©kð97Aa¸ö<ër Ñ¿5{ßîRÖÀª—Öì
-(ÙóŸAuÂ)¡¦HŸÞ OØV";M¸’…ܶRýd°2auÒ/3ߘ–¿AjqBGÎÓÙ1\æ›+>€y¥&0•²jmÚqý[„ìÑL6Qb~´+¹PÄ-sÙø¿µ$ÈÑ*ªï ¥ ðÈOÓ…¦JûèY[éýSækŒ¹©[üm}ÿ˜Ð6L÷èO³[²ò½¼ƒëÆÐNOp:„ùHïä7CĬ“ü]½yî´¶ïïÃ>Õ“·aý'×M½®qê äîbà_w– ž]4ðÚÀˆ²öÒøÞó¬n +: § Ìô 8û›cÑJR[2£mXÅw‹}y7ˆ×ÅLeD$ç,?Yh{³ÛÆBÅΙki¿ŽøК¿ Ø1ò°ºŸ;eó‚T›n|˜)94µ9uæÐ¥x´ ƒã½R
->ç³]æoM%„£¬ÎG)³‘4°ký‡ïbZ~ø ¼`_[hã»8ë<¾4²}$.îÁ³Ö
-Œ(iýŽà-º 7~õSLcüýkÅ!.0Yü:7— `hPêoˆÜä¦ójÂlƒG¥v‚j»8Ç«Á¨›ÕäÅÆ6nÂN'éú3ÑX®ÐH¨Ïü%›zl½ ýƒ©´
-)‡¿ ÕÖÏéÛNÄD]*¾ÔŸæ›õ· ­‡.kÙõ£a ü:ræ\e·ûá&ÈÉDŽ¿Œ™%_$$3}9šü• Š8$½¬€È¢þàÎg×™„¿ZuÎÚ8רË=~³a#›L]gŽyiðÎ+.ÐÇå‹6{™jšSksÀ›ø¥qéD¾ ~Èͯõ{Ó·Æm'¤v;?«A%qÐ7ú"úpM°!(ïx[„Ô]Ä,…u‹0~‘—Ý›°ùot…ÿ‘vm¸oŸÓÔ/˜àyÝSÝñ}Ó"‡ÍÿImñ@ü
-åÚ`qÈoa’:Üà}ÒË’àóI¡ Å¡H±`í ¾‹¢R¯u²Í3}›’«˜Œ(-ž ŒßD<Akº z³,¼u˜Kí mÇkûL”4iH!±¡wÅE•Ô›ß¶ÑËf½Ä¯Z8_‚vŸªÙÿMÞW'n%Õ‡óyï+ kpKx®˜XnÝÅçel\¶êaºÆ§#§ˆA³K ES÷éüT¶È
-Œ¾ˆeD;õ›‘ æB,º„5µ³äé
-IEVx[i©ó•û MCá–‚C÷=…ÐÈÏ ½~ÀÕõó)Þ7ƒNòw8>Çîwëôêé‚t­»Ìt«Ã<EÀ ‚†Å5#²üd ¡,º%¯BBç;¦é.lãWœ›ÜûÜÝ<’ÂÚ9a¨Äƒ.vKž
-q›ÅßZV¶¸Œ&®äò®Å©ði¬Ÿa•ÌF/wø†¤°•|ÒÎmyÒd`Í\º¯*ÚßDw§Ìw °)eG8ïÂ5´B¼Hc†µÙt¢ùš^¨3€6ŸoÈ:W¦ z´˜˜éÁéä’*ëÔ£Ÿ@îàâp¯_© ¥ì%Šcga>¯W¹4#UâRwXPƯY“4ìg·FRß vßû<ÔxP>†uÂËe&+
-Dì2Çüߢ¿¢‚IÔnèEYÒÒÇe)ü²:V ùUš>иɚúq:…mɲ¶þUñNžY±B§Ýêƒ&³Ã¼]Rý*ÃŽûý=*n…ѽKv„hf0ó;!ØÅ .&f«RÚ„ Ï‹ë&e¤ãe}|“x$Ó½ââ;£kgž=çyÅg©Þ+a…¶’û.Î)†Ú`NËiߜʼnW«Uäç*i¼/W 6æø>±§“ <?;dPy\Ÿêd汉ä»tóñ#+|þ­1qÕqVø‚¥Éh¢‹P³Á4>t6ó –p2/ÉõÚzî„øÑ=h>±`
-n5TÁšëÑ”’ÐX"GEÉ.4–ú&µ¼ ØØ…'Àú|€PÜLêar ¾0N1fo÷í¼Á¶Uå" ‹*0âù$]s¨>ÓΆ”'â¾ÞÑØèÝf6qì©)¡}mZ€šÍûIÄN§
-Îþ@PD # V{¿Ö%þVõ|3ùÈ”JE3)&Níð{_’ Ê m3™Î1 oåñ S“•/bì~O«¸8/*™Œ²éëíZφä(.Pÿ§žÏdÔö¤¾X<é§îrî9YJÛ)E抰z6Ø/v0 ¡ ªD °¾T㹋˜€7ýP“Ú¡ûµ¿^¶û°iDØF…ṳ̈9Ô\ðØDˆ“Ï%Ë;¥Ø—qëŒà2ß œNý.¶8bWÉI0Uy®ƒÎÈfPw³‘ Õ8ŒÌ" Çsäs
-ZmØFÐÃʶÞïPhzI÷™ð€*qaBrÒ·Ø^ðƒMâÝàí-Õ¨ô¡À˜å®™ÂÞžÑÉö>u¼ ‰ŠÏãonŒ{óæâ<ŠéU¿˜f);›Íp±OË,¾†ª™ŸÔL~‡(ÂJšW
-`þ* ÎŒÔÀh0±ì$(]J+?!uR[LGÓOÁ
->DGÓyØ}—(l ø &‰åSß}fÄ †ù©»7«ôÖÞ •ŸÑ;!)îüP_©cEìì_Ï“Á’TYj¥àê§ïS({ çÑd
-± éÇ¥µ¨ÿ‹0Ò±«ö¡`¢/³I Ph¦€ZhtDįcÅxBkô¹õ¾z힢Uˆ1áû-C^­î@\’ž¶Ê#f„†µ]òOÍÕ5 Ñôh‚˜CGÚc(hƼ<@žðŒe/ºˆ¾]úyèŸãgT —–B„W‹:ƒÅ‹"p+EŒŒûE|ë7p<*6~¾R—”{N f.]Æ&‡•è…MÀNsr'=d/UMzW¿¨8ûÎ=ªŽ´n¸ÚvDôÓM=×ArY8sœ‹ªf(ú²"’å®êvj×;¥ôŠË7/“æÖö¹]Ë\Ù”7Ùë•azgòá¶gÌ)RàÞ%H}!³¡i°Re<Ñ 7¡%ý¿¹a¢d:£gteµIˆ­¨*’
-‡–oü‘éO' °xd"뙂T¯·3z ^‡ø~LËÿ¡IÖBcP/giй.^ÿâ×úÔ¡/jƒX©ÛQÕ ­€ÒÆ-Ô¦4Ê{Ù·hïgZ¼'ªF§ó.²$2ÈÙB Æúž07êÅÌJFØ “|Àmv®å·Ìù´"Ëæn0jª8xB¯QÎïïˆþ”âÞþÐßÙ«À|˜­jiu›¡lQæ5ý%ßzÅŒãÎv¥ú…>GïÀ•Nv.óY‹=Šð ðô"¦k ¿E)û›™,$i{;vÓSë œ†œSW¿BPPúËj…+ýá{ÛÏáûg¬ššLœ/
-¹,6:üâƒ^ÔX'€å9U¿œ‹fkM6¼¿tî˜è^‚(Ò2g¡I›yÕ²˜RôÓ(.ãcÃÿBM¶SaÓv¨‚/uø¹!&jìdR¥ *ÿ!´BSJ‡ã !DË¢FT=B–žýÏm+›ä’…0Ñ
- ’¦ž~o8LÃć4»DÜ϶ÒlÊô‰'´:Y'ϵ:X–¹ȃKKÖr97…ü dé2
-{¡„Fuœ·3žÍÇoÕ‹Ü2C7§jy¸-Í@Šæ,dL//¢„KàôÌ°FYîÊ„³Ýþ9Å™
-*–÷oz ×PýÚúŽÇä–G”30¢ ò ¡€?Žê)^¿)’£Êw8:B-sìFDò±û¹Õ.¯ýaËmwñ¶ÀBUôz8sš3&¥JÎ|ñ$¡9ê
-¿’ƒ½[žBš´¾™Kåd H*ž±yÈ"ýƒß ýzêXê>ªµÌWÕŽ“Ѥi$&N“yu°BIsŒŒÓoLª¸IòD·»ñŸ’ÆãÇ•ÑlèE)÷—¡OŠÌ:˜¶O-h/_cÂ:u* ý ‚(ÖÛõî9ç}y}F)ß×]>9]¾¬šæù%†­Ž8[pµŠ Úˆììˆ4eAäÙoÀÄÜ# Ò¹äY¼I©[ˆˆu÷Ìp•)ÁæDÚøõ l¡ù})¼ºjoÌa %h1•l­õíP”Eöd¡‹#ò!Œí±Y‡q4NaB¢#@÷3ÁÜ´*ìåFÖ‡ù–[>¼üózëþ2‰ØMÌDn…Þ ÜwKØ¢Y(i£X‹ßüƒd¤ú9ò ¯L,ÿì“^^ñëàö­ÂóY%)µ4ÙZ\ÔötôÕW¯ù­i ¢7,qK“ñâ”-Ç?ÑúE@•àë#¼‰&+ƒÄ0¸Ø¡¸04ºœ5Ö–›ÿë“WåÔ/¶fLƉèß‹›¥0³<IíºÛ‹ÉÄ[t>Å¡u±yØ°Ðu:¯Û{®[’ĸ2Ï}’ cu¶Þ÷²' )¦Z`‡`\… c¬—ÖÙ±{OÑØD°Çré ám;€¸LÐl} JÜ„Ž6 ‘nþ‹‚>°§nºxŽPc=‰6pÊè)L[‡+»†%ª}'¿P°aŽ‘45¨lG½>(ÅûE&-#Èkií·jEüÅ×Ö "ŸûmUó˜SvL „„§=ªA2Ÿ¶_5J¶Ôø¿ÒU‹‡_O·V°mîl=
-æ7ÒÁÒq3‚`¦ t.Ó„c‰Nä•×wíÝZKGº¦Ô›.(ðÔà^æÕ—w[.,ÕZåŒ
-cGM}!;4šÍCnœ®2'ÖÊïìù®? Œå¯@9ÖË'Ñ®æp]CÖ-C¼Dû]QPÓ-}yhÎëzqã©Ýcô‚®ËÚ+›ß™A;tocšn’Éæ¤-O‹ÛÃWÓ•ºžÛóÛž:]‚é#Â_fbÈ°g‘øÌÇ õPŠ€Ú†ÑPÅŽO£ªõdU “ï6dÍpŒ‹bçÆ©\¦©Þ÷Œ­;£&{"ÿÚé,–ŒO_»ÔÇÐ9V¼47M=ÍaÍ]:mÎïGAã›P.4”ªþ3€ãd—&•É–è*HfÅ„÷‚¼M:ÞÌk(g
-4–·öÈZýjH sóG··»èV üY).üjcPÌ¥’»nÞÝtïw¼RÓTÔBÇ
-ŠéÑ:kÅÖ ›r}’õéŽVbbérªïHÎ7Õã³ßêí¥‹_©¼“×2[ëAõ°çô­JCRz!»‘<ùq3mÔ¢W[M0hÒ VÊíaL¦3zb¥ÿÐCNãú?O“lVŠšßÍÒ4Øë>Rj•·•ÛéD[÷87ž
-vÚÑKâåÅíÍÓ¿½Í~¬?קS§ÎªôÉžµè6.¤K±“H?R‡yþnv8Âax9™:¯¼&ýµêo<çßb%ðórÿDí;Ú%§1M–UΗUÈÁXÒ6G«NJ"€Ùíì£â%Àì”w¶ðtý—_7×¾`!—
-;ÜÆŠF¸*Cb&Znf]C¡ÈN‹×6Á.þÂÑ, èW91£ðà«iK;m+úbTèSpïGsÊuÊkÏ&ALH^Ö™FV{ð$ ÝkúÝMbxáñå6ÿa˜ƒØÅYå›a¹5°þ¦J0Ëšëö“©¾é™ý¡
-Ó†©"S—Ïz_¥¬Sþ@Î lÀ£ì†D/®¨÷þ¹B­c0ˆb( º
-ƒËsˆŸ.ÍÏxP£þþ\ næèJµõN*·ƒ7A—^…¯f£èïnò˜Øc#ï|<ÐŒ¹a=íÂèœL¹Çt}N9@œí2ò“º¬ð;ŒÔ’`Ÿš瘓gÛ–» “(kw“Hˆ«fz# ü«TU5aQW.;ì§øtÁTK!bñ6Û¨Ú±A2®Èü„è-£þ|âáŒMÍU5j2~áúˆ^]i‘åe-·¨^žÿWeoÙ~äèžÞÊ„×Cô®ïw= ý² {ì}Åï÷šNå)àÒ„½\Š*‹Jò|±WŽMí¡±Òøòo- kÈ“èZ±Õ6"Ù™þ\W7ϧGÂ}VÁc§Úª4ØXoM7ùwÂá›P«cþÕ’Ûl{lY B‰©Ù/šÌÝÖíü¾ì–­˜T¡ÁÜ?ï°êšš+‰¾Å’Ñs­êŠGô†äv5¶ÈÍÌ?ÈÖ§éBÄ<wsÕÆصŸ×ŒD¦¤9 ߥKòã_Ý»›’«á`Ž]} ‰µñnÃáhDÜÀÂ\É&*NNk…¤û0œ†»™¥ ›ýÔº˜Å9}­Q}lêœDª0ŸœÛj2wü“¯µJ÷‹¡œéÃvµvz¬,Æ}úè"öìijƒŠyñý›·î ’±¼cæOˆq¸Ìpãd:3ö¬Õ¹$c¿_W#ò4ºÑ1¬ç¥†Á z,8ÚÈÕD-æ h•’ö5Cº ͧáƒ_%wÒªu¿ â#¤Ç”g!]7¾ô/BŒ]eh©IKôŠ2¦WTŸuÊÊŒk84æÍ¥0Ç‚AÞÈ;b•1b°mÍH;í>nôÏ¢ÖR /#NìqHºà0gÚ…>tí°§Vûa¶ ˜/æöŸñü |¥sçYà¨q³Ý,ÙŽÆ™(®” ¿œ^õÏ‚~¢­Ö>ʧÐÃwHv«;ø´þâÎMÌÿ$ìe ™´´_ÚژтX–KµÆ
-Ú…W¨•fI•M@ï±–KÉ­7‹û)Cc¢ïS`…,8'Îl[stÂ<¡\nc<BU¿Q×ÓãäKüŸþ<¬ÍŽÙ»¯ÅƒúÉM€^ÆÃT»Ì«ÓË4 §¤Š1´\Ï"µÒˆÊ®ˆéâ]x µŒ'ƃÙIÏKXPõ}BÎè‚YÓÝ2Ä6å¶ a«í™TÙÀô&†’–Àiû‰Ÿº¾îpÆ4
-~[ØÝñ°Lå ¸ ¡©Ûa¨Ë=‘yÿn¬%YçYt½¿Ëú7R¬lN%mÄQ$: QŒ²›DµØ†È¨Ð¬)¦ÃºÊìH%Ûß ^>«¡T&8Ñew‹¹ƒã'}'ÅrW÷ ŸMì7#X1nfœ÷ ~¸ŒÓ2Û*¡U§ %›ˆÁÇ:èDMÂ|Ò.Ž«ªˆàc:š®)IËü*ŠÎ¿žê³Â:
-ºâreA5n!Ñ…êì]Œ¨ÁºØ»‚õOWìõHƒ:Ô…—‡uÀÏk2Q:ú†Édf¬š¢ µ‡$EÏÐï8f±æ™€âNØÔ@Gœ¹}\=ñõ°¨öˆ¨‹¼_W/nÀÄbÛíÿ¸¯ß0^8U¤>¾û=O?°g›¾U̧[aý;óþÓSX¦ä”gÚLÁ´·¹‹.võ@/Ò&ÿ”i:dÏk0G£u¨ð“rÏBž7gO‚w üúàü•–”À‰KY&j øœ7¼r 2–á°WNÎxëh“õÒ¿Í7§LŽ„×VC@]ÒÖóºÁ*óë-Å ÃA;}üvñïiCU…—.úZl¬ õå?²ŠcHÕ¸´Ôu½ö!» »†ó±œW‚Ñ/ðó\Hvq•bf€úOÕy3¹;¾Ð¤ ² ÜŒ°š'ÿˆêIܯE|Ÿ¹ š­p:ÔC9èc
-gŽ}“ú£qÍòÛ¨ù›ÂN•¥•îÉ/­„¼Ÿ¿¨ÎwýéN­ъ”⃞êöÉ(ú˜i.ŽJÓY{Ê…ë߃ˆêo&ãX
-Ë|åT¬N!{¶ L•„«a` K=ETBÔSEÐATMb§œ
-Q‡Æ~ËJlQ‹Rü¶×ZB§©{g¯ ^x™‡¾m€ï¨LŽ1p%õïø×ké\¤~}ôO½Ü8Ûu·×çqÏÜV»ì*æGj¸ÙÛ9ýèOâ÷Ž<M×mÆô|UíZ0¥—¶µ™r'·>û’VuûtñCv.¯ÉÞ¯²”ì U=Ú·rèöI3 Í¢¹ØO7( S~ãÈ”‡ «ÒÛšt”š®`½öÈl/ÅY¦37›„Û¦š ;ŠôÑ à<‹ÆN–T‘Z.!`ßêã…”´I¼M%0,(`Y³¡mm¡ §<!È’WÏX®l‘«oÎFž5Ô¥ÕÂYe%13ð}‡yBjú$·¢³-71 \4oà'!¿¾¡Þ­«’[É2@2´F´‚ø„ö€ñг…ǬÜÄ#ºÅ[i©R(|˜.Èm‚F x¼HÃ>&ymr¦-åɽ.§æo·œ¢ŒEŸ¼B91Œâƒ!ÈD4B\\ò.½ Ÿ†‡b.ô¾=ƒq™“s,|Ö?¼´~8£»»³­
-Ñÿž¶l ÷ö" •äjÓ`Zo…hbµÌ}åÏ0—ŸùoÎ*˯µŸÞµöñæ/~ úÕ'Kü@Tƒ¯k5{<‹i»ö—ROBz@-+µyÚª«1èûŒÂ·–µZë¿ÊnòEp7âPi«ú€pV¢;g.Oã­pÈTA3V.ÀÙòV…I’]UAÍÊ&¯æwú{¥,¿f
-ý’OP\h{†!Ë/:9*ÁþNª‘À„y†Ý¢›¼~¸®<rÍ¥Ø.k¹áR\ÄKÀõ=™Ê³ô¤µéšàš)É 
-Ìó¬¤^©êzX-Ta’•éÔUÚjLØ–‡ÁPϲ ‘ Ú €,j%‚‹Bè_|³yŒß]¶to7ɹ¿"Á¡ÒW¾7ÉÔ9NÙbdÌ÷Î2s—O‹D"—MêÓ†l›Ñc,Å=Æ/¿ÎWDk¿þ-ţø¬‰tF%ÿÐjwÕïS;ù^É£ ñšo?ñ
-ÆQ'?ßœ†*×3;ùQhþà“R¿«A±FÌb<\gÜÝ@ƒ×oìfg,ÙS¿´íw*0=a{ æŽ!Ù5"OBŃð4ûbü[ïR«r‰2Ó'VìÖĵv\PjÐÝh «»Œd ­ªÌ'3çÜŸ¬ô£uªü”.ø¡×cšÎO
-DSmÝ÷dU«TòȨr7)z¡mYÅÀX˜Ä5ê¦[Ø÷ËÅŸ"f ‰@êéqD„ç™Õ'~ñHA[€‹Vû¤“õ^C
-ݓ׀-xú€°šNce<Pdc–0`RôA˜‹¬ß”™…r8HXÞú§Ó•~ «÷®tOý08em_¦;nÒB0ÕüYÂð-'y©_‰ôÛº@Á=¬È*ÃE\ŽKδ¿ÅÿØÙ½/™‰HíMâÑÁ8g7m‘ÿ{<Q-u·´å´_;M;S1Dá[ñ7;žŒØ‚†ò”ÎD!m÷í¯`èhpÚh16jä¬Ö’ØŸ¸*¿v/¯`%–ëekáÍ?LhÎ=”v‹…}éƒíý8ÔµÑ89riL&òëcO ý‰„iŽý†àÁ¸¬Go›‹Í²fÂɘz(¸—¡3
-ßÜ}º^hîëgŒÛ·S~¢Y 
-ÄSä–5“˜{'Ë¡esøücl\î½gˆî*š1ŽšÈõ¼3ª¶è:ÃegMvc¦‚Ê癚ËÖ¢&§,€íIš®Ø1¤¯à
-©*É&;jDú`çsÞ#)„Ê4s‡oEcà &ßÙIÉ;qÝ#K¸n›å¯ý´Y|”àŒmãø•6ŒÊÑé>Ÿ[å˥ߺŽ1½é˜Ê®aYÝ«ÀF5PYåaÉ|3ãä¡ïbøM@©Nyav.åh­nî×ņ®ô²¡RŠÅ—ȬŒWyŸ¦Þtƒ7×ÔÀOkB¬œC@ƒž©êo´dÏ “I¿ü“Z©þä}\žÅ’gÎBT…bM+5êõHzJžìfy<p!uš/ÃúZÇÉ vc&Bãž³'˜3{âC"Ã^z| 8m§¥ØÛ#¦ÔjÞ¿øËú½:¡(Èn‡óÐ)˜âq—4Ù¶³dÑåÚ³;AúGòùVQ°!‡®´$ú>®âq
-C¸ÎÞ•¡‡›û/ìë aLãdU±Å,[g¯úWСÖX·V7~æQÈ¢%+ð?éצµ!ùUè³Êk5ãø&Z£Q‚É [äxŽ-b÷uP…#Ïñ¾†E@qIÀ$ä;®ŽVçæ$#ÜíkôëtJ€\¶p5žr„º‘¢€$|H{U¡øæòƒK]N}¬ò†Ÿ€E×D°
-FÏ-¶ 6© †Â ߸ŒçânVä^… ]šMg\Ô<C‰é>KÇ·ä 9·/£‡õü7o¼¾¾Ð¼­ÎÉSö'ž”Q®¬þ´òB†‡Òe|°ià”¸[‹_Ý‘†6ùŒë.'¸cä½M½åÕr\S>‚K䃔t§C稶h5uREæ‹LU§­Òƒ˜Oôz VÇ‹;¬¤'áS™ÇOXñË€¿®›¦™;µWEƒeÔ #:0츜BøUª,ØÞèb
-Òó…2pÈ^Ù†:0|&e¦Õ,?‚HFkJæU'ý!qÆYµwß³HžÿÔ«œ;…ª»ž–3ª[œé@—hžÏuãrnL‘;®ˆ=bªy7¥E>°áíîä=HøŠõzŒ³šâs|Ó߶ª`KA
-Œõ_P-ç'„HS
-Л¨'ÁÚæãy¿ˆ Re†êi[‘¯²2Ê2ýQ%™ÒZâû®žm-c¢‰LPe³o“=ÒÜi:èÑ'Ðr^ùÑ­ßÔ{?z$É&aM%*Æð®iÞ ïÚ‹š%4Üôí#6¼±
-´!;h¾þGáÁj2Á|O¸D ‡?ûµ“îw¹´`ªÓ¢¿¸‚’cçÅò¢†‰‡Î·¤ÌaŸŒÄÆ툗62A»wÆÕ(†“Øs/A'viÙ.Ü]Á‰µ‚7*‹4¥'O ¢ °vŒ÷øF34§¡Æág¢O¿u¬.t¼“®rõ–s}/¸šä”ôÛºö˜#=ÕdrõÔVL­WVŒªÙÄKã‰éS.“ (Õ;ãh"’€}R>•lÏs¯ì³²Ô!¶‹lAËE:ßy&ôœh»Æ2©×Äë2+Ù®HѳÁŸ¨0An´ë‡Lš@°ƒy‡ß[q8^:ZËÄc hjð-¦B _¦–¨ñº€ÛJT§ûš5j9È«>Ú)¢Û»nSÑj=³ÕXër÷Hl_—rß:¯0)]F: ”Ùtë,,pQ£î÷s²•õÒœúåx.Þ!ª±…» šMdÙŽ%󌥢À>­×בtÍýh;ÑN}ÅO™~ìx[ôÒ[ ô)Ò`Ç™[z€Ð¥Ç;ÿµbä¸ ý· ZÛ±ýW=mVùD×®9, «Ÿ³e,ëKj}Ü üï J¼,®bðýÂò3Þ2¼ ­h=Á‰U,jï%
-ìé×¾ Ä92¯kƒG`µÕÂKþ{|*Œ”)ÎêÒˆÁÄRéAîCêD´Ó®ïÒ‰svѬµ>cj
-6müÍpHr£\Ik[xi×$¼šÉH$S<ÂÐ]­H;"þÏ] …h!ÎK Ùç wœÙƒaƒ!Wo§têQ‘21¸¦e}œDó—ýªM¢Ê&ëÅ"þçÍÜ1IpÅQè—{ØAÛ»kJ‡³÷4°6ŒíîO«Ö*“YŒÝ*³A"Õ±«Ì Õ r¤eKãùŒ©$a^Hœ›Œ×ý‰ÞFïNûé)•7µ»‹i?¦: ¤®ý§"×ñ—á
-¦y¼5âéx Î?8€†,ÄÙ%š¼ø*%q$GÐ]È%\íðÀ¸¯±ÆLÆø¤z*­Ë"7›U0ž$¥¨ ×”€ïøq*櫸×\~ghL[ü ¢rñY{âkây9‘ä¹_­-¡„­“ߣ|ÒœZ¿€ë˜û.†zžÜbé><ZwúµžËtÄw/*‘ê}5Tö4[Ï*ùaÅ6y¡W;åRÊØŸ7¦½jJAºjæ”ÅhÜU–Fî¦|ð¥Ûê:]Ù+ärå’ß±¯µíju:Ûdí>1aNÓßø–à—ÒK!5hI¾?K3²< áŸ,ÞÅÁ¸²Ü$j:=úzåmÈ_N4ƒ˜Fäûq
-°’胱«T«þÃ5jíaƒ"¯‹¬Î×Эô'7kˆ]ú†A§òuSà‰epÀƒZ˜%ÆÅ…¹­Â¬¾=úð¤´~¸Pù*€üÕÝ+àŒVd˜¥ódqɈÎEX—dÓJHÁ+°:ƒÊ}Ð)#ôø@ײ!R»ÿ©€£ì–ù
-;\ùˆ¹¥e7ÍHÖx³¡l½ [sÉHù[êƒáëXôËUNÑõ¢i X–Ø«c4ë7û\Aº0«<{ Evg]8xp[lZщ5õè¹r÷ûGâÈm*Nêê:Q+|‡gµ}ÁÞ\d„äO¾>hžDä¡GXnöº +b¸¬óÇ;½<nõ ÄߺƶrEiO8võÞH•kö}aq²2ß5|LÇŽ´Fa
-ÐQk|/Û9¾ÑxÜÜúÙP7˜ªl©¼å© 敱<ý6œÍ¶Â=Ÿù …3ñTI‡@TƒÌ07ƒI`5¼áô‡lcoƒ|áþü]¤ãÏ(^¡¥µºÈÕ6ÿCÞŒ Ú롾—lšÒÚ´ë÷aµ1Óþÿ×Îœÿ3¡
-šþˆ/KnèEKØ(xÆÈìƒww¦\3¥kÔ!›ùÑÆlð›Qe8‚nÛh’8¯tãær|BUw•Q“)€gÏ£ŽWºè¥@Pñ„¥¾‡LZð7×(fÐlç9¬Œ bf r·Ñá·šPæ}p
-øš*›íßyýá“ãûB/1;Aì2ÕÙ3ÕSs±‘woÃñÕ“VÝÝíßv¼¯å¹ÜÆ{¯’XcÇú9'*:ÞÒˆVÂ)BSzŠ)Xý_ƒÓŠÖpm{§z¼¸—±u±)ôc¹ÿÕ)€+H2Qi·'Âڱ׉×b@akÊE¿¢vÉÃBakR‡å:›ñ†‡Fˆ~¨êÈ’Ìm®g4šv~\œI©¸
-^ýì¶<[7Û-ú%çq´Å5mââËÊž¶t“Bdc;|WÝÚú7–xSyåÈ4ØÇÖv´¦×Åõ Q«´˜„2ã¹Rwr\Œ¨ÇÂCÀVD
-­`Ú5øy÷»é@k"¢™5)Ï1·ØRù-DÒH Ö»¼ÍDdM†o3w»5Gv`LÐ2îä¯uÈoêb—r›[ˆv^Ð^P€ó]üQ¨‹ÔS^?¨Ïóè_û³£ 'C2T5ÍyÅ [<;ËÛÜ}‹hLé4mMmÖéҎ/À}"ÑçB0%’éVE~µb(e’ ”峕UòïiN“ýië€ëÜ„{X#Œ=dÓ[娽 ÿÆOƒHð”£Vê ªëvGJMGÚêåÄLX^9ymiZPpù˜B5«¬Âø#…sW+* ¨)¨OñD¾Ë_*Ïøy81¢ÎsY×/NI„8wÖ¦.¶v.rþ÷¥äïûˆÍžá¹ˆ“¤;éë7¤{®ÈEÕîÄìø‘VYƒÉïÌ|ÝWN`ÄþÅW‡Ù¾—›º‚ÔÂâsh™ËúÊIÆ(ˆxó^m¸ƒž²Ê+»O':QGrçÉ×æ[XFRž;j¸±·ùI•šà5A
+/Length 18167
+/Filter /FlateDecode
+>>
+stream
+xÚ¬µc”¦ÍÒ%\¶»Ì»ªË¶mÛ¶m]¶­.vÙ¶mÛ¶ñõsÎ̼³Î7¿fÞ×ZWFDîØ;2“„P^‰FÀØÎÐDÔÎÖ™†–ž kacèâ$cg+M#hgm økd!!r41p¶°³6p6ᨙ„MŒ
+Ú¹¼h˜™
+ÿß­tþFÄÖÈÎøŸ)Qr6°5þ;XÿËðÛÈÅÑñ¯žÿ:ë þŸë¸‰‰»‰Ìê’W°eZfºs FîЄ°V_èPˆ}I½rQ•]·_Ú¯Ž
+ýêÚ†)ίVÅ3ûÏIÊÑtk²î“«|\ŸŸ½È›¤ílT‡tº%ðéçjQ^× ÒÛ`š¬ôª‡»
+Šº¿? ð¦Ú™¡®Ÿ)üºø£?Ù#ø¥ÖÅ¢u 5
+p¼¹'M/&&ˆ”$PÆã`¡Ž’küˆÀ7:~†ù“EœGå¨ð@[&É—çZø±Hæ³mÇ•)û~õŽ/š§§{<V U—Ê®]¡Ϻ+ã>!¸£C}²§ªM‡×Žì ÀòYÞx°¤þQá¾ÒžX¸Éªi8M;:6ÂÂ~>egš1 âCP2ƒ÷M·]òþ2Mÿ½ Áø‡Œò!0‹v'¬tHèúøÁ“zQ<†ó3í²è½*샶_Z¬ÌòØ ƒ,bzLC âZˆ`R u„¦åý´ØMŒ23­øGt~æ§Æ[G˜bCŒ¦8¢:f˜8,Šðjze¨ÂÈ.ŠCFÿ9Xé°ÍÀ#Ãì¯?–@FÒ*^€ë¸§­áì•îŠv>S
+Vs£€·Ý‚ª M½§Ä0š!a9QÛáù5ýGdõ÷u8•ô _ Ä;+·¹V«18önQ±ù-Í“ªT†ã~í-oò„lèq#]Ïè5>ÙI]n'„ç ±š»-¡ØÃF޳ˑ#¨VFFàѶ|Â0§öN=Í}åÌ_$
+t•úÂ2"ÄB=Ž‡Ãýw=ÓS«;vbƒŸ¼5­µX@_»«“E¾˜}e)Û.B2*·µcÊ~êJ“õïðªÝ
+HÅ”7dv“Ÿ¼uAeR§Οµ~·" ‰š~(w·äpÍÂØV±Ð¹ÔškYòV¢¤‹|B>æ¾s²œ¿­m@e¼É¿ý†‰K¯ã+ aØFÁå0~¨¥?V· £f@;ÔK)”wrïÕ3“ÚîdܲDúP(ØÔÔøœ™ Ð]yžv8Pé¿]Ú½ýÚêPÖÀ¨Ôl6À·¿ÔÅ ÷.Îe‘š»¸‡³ÉˆÎà'Ãf9õ›e
+ÿÂøkÄ×\²)1]8ƒ‹h¥OmfÈßaÃé“ÆS“Vò ùëRç«W <³˜&ДÏÖád­y¡¹,˜÷r¢ógoº1Fî×ô ;Ë•˜,ÓÚ»W,¦j?úÑsvÕàÚž.fê"Sp/2²+hÁä.èö ú¤ õ´ÙUÏÕŠ<J@öÜGP`rèº)Ò¾7Ý#‚•ÐvN D!§-„d/ ¬tXzzÔót߆å~à(H5vèÐéA+ºË\ƒcù;0·ä8†RVµM+Ž“€=ªIÝJ´H«’ Yì‡ÿ3IS¼,µ‚úî@r—ÜMhŠ”žµ•ŽÑ·X˜2O}ôuͨõ0ÿL˜îáw£[’òœƒëúÀvWp„ù-H$÷Ä]øŒ“Üm­yïèúAêñë þ£ë†‡^Çe:rg1pæ­eg¼60¢Œ½ž÷s¸Ûü²èIü#-(öÞÆHTŸÒƒä¦ôp fñíBOÞµ âU1C)áÏ3&E&>êîì–‘PÑS~†þjêÏCÔÆ…O(Vô|:ÌΧ¶™¼ Õ†kFr6MmvY4I.m‚à8¯ä‚Yúl—¹SqÁH«³a²þìz$ ¬jÿÁÛè&”—
+]Ké<#
+ç©^–v©K}³ÆëY‡ŠA%E FÉ‹PßƲÍDäÖ›‹ÄÖ¤ÓMÕ"]™¾ÒÀ‘;Z H·Fh ÀÕQK-‡a³ýý¥¬ÝÒŸ%¥1”NTæ¹$Å#¤aîáÅ3Áë•F?Ê·ØcªjÇc_Y0Zì÷–PÒLÕÃ(
+-wã0!sž-,¼‹¦Ò—t]§Xü²Eùh€ˆ
+ñ~–Ä-®ŽÈ$`òôtMÐJS]âÁîâÙö,se, -+©ûцò½Šs`Ü&—lÁ8å²£âDÊVÜ´È”'ãÈŒžTFû"ìçÀp‡LÒýêÒÊl
+Ê^þ¾Œ* Ð,Ú!4\õËs¾‡Vn Ý ‘^gnaž](+P>—[¡õöã¹Z¾Áxš.¼—Gü3“Û\+\™~ó–F]µêß+IU½*7»àd#ØÖbãBî *m‹'g¹D²m)•SA‘X¬0Ñ<HX°‹aXtͤlýaIG™V~¼#) $IœÀÖŸôv"Sóy3¦³NUáÒ0鼯k‚%(jJ0g.3¦JR¿£°ø¡Z€®ûÆÔŠxI t¢J){CXí 9Í^<ß&p3Ü5’¬*|$õ/Š¤³†ÐXjšÁ
+¿ÑÙã]šÑI‹óC’(¸-E\ôHˆ.çÎoBŒT…ž®5:@¬PNkþùò§r¬‹G³ï%馒ü“8™¹/qî1ðBÅWXBÕ½¿ý¢†Ùј©µ?‚\Jík.ê}êS¥Ë€¶‡ÕØâÚL> $©Ärå`\í ww¤ƒ¢¶óŠŸÀe
+p‰ïå¬tpy(¶ÅŽ²Wå+\FEÝÔóG9 _AóÃDYß=N¿×€õÙ]EÒ8çÍŠ£…<M®Ó";\ÿÐæŸÜræ¹”ÏY`¸0oÜ{sêËXsïrìjƒx—d½+øh¯µ%â!\êR-±COÑà9ñ^
+n
+t^B… ’ y‰ÜD·@µ˜¾Ó ÷¡°_z¶2µ$㱘Jó¢a“ÖóƒTp;ÕTšeIM•t¾Õ5Šñº u4¦ù>†ð<î>Õj Úhá:â—À–Ü;Æ¤ß ïáî¶ô„¯²Óyú6±¯ê«¤­—e\>‹.Ò¼Ãz@Š=ü¹v³œ¬àr†¸/„:΂1“³r_ûÖ‰½^oa~sïªÌ(¸dœúvüa$ OÐU¯Õ’
+Œ:¡G=ñ›– æ@,º€5µ³äj²é49èC’Fˆ´d|cp¢ˆC«°'»M~”
+3¤î§Æ¦ÊgZÉSe–¤õÕo0§Œ"N%¢.ZV×¾(ÜÊ1*”ë´Z½Se´™·Jè¢]¦Ûq¾½EÆ.Ó»wÈ N÷§`|Å»x¡ÃEGoVH™à÷˜brÂ$µ=¯m ec¸—Ÿ¥wlÏÓ²æ<-û,ÖzÅ/SwCþĺuŠ¦4˜U…ÇtÚ3grâÖjR\!ŽóãâhÂÂÛ#²3ðtâ‡çe… *‹ÍãQÈ8òù)ñ&Õxô€Ä ŸcŒDTyÔ€ùkÞÒd8ÁE Ñ`Š:›±ŸS°J™ûçÕ
++fÃS뜊”]W¿œŸ_êÓj™#íþkËÏáK±7FMM:Ö—
+ß\ ~á^/r$ŒÀô”¢_ÆAµ¹*ó«·töˆðNœ0Â2g¾I›qŲ˜\øÃ(6ý}Ýÿ\M¦]~Ãv œ'eð©.&räxR¥*ÿ>´BSR‡í
+’†ž~÷/˜ºñwhVñTÞp8Åx–’lò´ñGÔ'ÏÕX¦ÙeÈý KæpRY7ùüsd©R2{øzuì×S®‡/Õß¹Ç$†nN×”rp›šdYÈ6^^„ñÀiaõ2œñ§;½³
+Ó”ͼ“¹hÕ®û\,´§É4.O65%FMuCC\ŸìO·­:›’Ï)_7><›[ü}e‹'\Jöè@Lˆ¨kÜóqY b½âõ~ÙM¹®¬e|IóÎj+”ÏÕcb8-šÎr`FžËÁ
+?“‚ø½›Cäãµ¾Kd¥¡~–?aÒs‘Dûó¿øuÕ0Õ¼ÿÑ2_QW#¡JÕHH˜"ñjc†"”â,à9¢]ŸúPq“à9Øjuã<!ŽÃ‹-¥Z׋Tî-E›šv0mœ×^ºÂ€ujWâ#¡€(ÖÛñî:ã~~y
+AÙF˜/¬³cv ¢
+°adÓ@µl¯b3@³õ5ÈqâÛZÐ…DÜöýø}`OÜtq¡FºlàÐ’6!–wÈ «ög¢ÈcÁ!ÅkjòQØ{½“‹õ
+MX†“VSÛoV ù‹­®áG<>ôÚªæ1&×m›NyüÉxÜz®×ø½©Æû™@ Z<ør²¹Œ‰HoskëQ0·ž–v€“3…¯»‘ê ðCx,§¼¶cïÖü»~¨cR½áœ W-îyN}i§éÜR­YÖ¨P!fØÔ²M£Ñ<äÚé2c|µìÉž7àòàÊXî4Ó±V.‘z%‡ã
+²f â9Êï’Œ’f1èÓCsî\׋Wí¦½tM.Ð^ÙüÖÌÚ¡xÃÃtƒD&'íÈx`iêHÌþM‰ë™=¯í‰Ó˜>"üEº4kÖOŸ¹Ø.r!PÛ0*J ˜± øj]YåȤ;uYÓlcÂX¹±*©§ªw]#kÎ?úÀ=‘3·;û %âÒV/ôÑuŽ. äLSN„󅆘sOó{QA~ÄòŒ+JþùîÃv²ÇM•Ì`Ipå'±b@{FÞ"kä6”5š Ë[{`þóbHsý­ÛÝÙJx£
+þ¤ûër½ŸÌ©‚³fÎÝtw4N©á*r¾‹m€ œ* í³3Íõ±(‘V[‹.[³ïäÙ“ÄƇGhÀÜF~pðmï­ÒÎ ŽCeG±üAÒó¤>ò(wnB#Ñ6±Ø#fV‰è·Ú¸ù0 e/ù:Ò!î^Í­A[£¸ ª ñmD04µ3NDԺɌ-~zÏ_ÔªçõIÈq#"u2íõªîð¸ç…¬Gûó„ZY5ÿs«^ÉpAþqêÆè§ÜÆ œÐÓxwwå£jåhZ3 5Q««Ü‰k«²Ÿ9O8²škVä™Úh˜R¯‹åã *LãBÊP³‘³]OA¡P†´¢ÖŒúK•»ù –É›ýøR ÒÍXäôõ*B ÅCòýÚbŸ.v[¥Þy#½0oÆo}5št+zÀ˜²³JA1-Z_{µè*DBC®O’>Íárt MΟ;#âø³ õ¸ì×Z{©â
+ï¤ÕŒæZP=¬Y}«’änzÈN$OÞzœ Ûyµ¨•f“ytªT¨å2û“©ô®©oZÈ)ß৩Ÿ›§ Âæ·3TuöºäZ¥T^--Ýú£ÛzµI8çu`##Pô9ðQ£¦‰*²J3ŒøoÙÛjûÜ÷øË ¹{ ¥ïÑómÕå}j*$ õž$Ó;¶£B
+·K=‚'h²@ßóh‹•ÊŒ7¯µŽà8X€› šÞÇvÐkÊ]àŸSü=Η]äÖ¥ajË+*¤¾o²ë”¤0K>ûÊV$öåÄgÞ·y[ФÈèYW5")JÍì!h¼¿di|!6]$ÄÕXT}|
+È›`”¸5² å!4/VqT,ù’ºÄ÷·Ýg¡»Ý?€¸Ò?FE£tK´²uÀü,…LÁ‹VoùÅöÔ©:Ë\ݯÓ&§¶*á—sÉB½hšYiÉÐlóƽ"΢N
+ióÜG4ƒ˜Y8åË
+²á²‰Š.²%§:‹™»‰A{okÂÏM›—ßçB/Èñé”ïÓ²fOk¬ù]ìŸá©Ú$UGÏ y›j‰Âx0NùSîg3V8BCúZqœh‘à­ÃÜ8#ìêLÂÃ-]ñ0OŠÕMærÏø¸MÉ“h Z&ÙÒ¬­¦Qõ5eJí"oëÙ¤è ]yƒ³ÏãRÒu?åþ>®Ó(žR‘²LŽA†»vÐnØz²)‰Ä "’xœìd‚W[f¸$àµF]ˆl,1 ‚Y_jžæ$Rå›:ˆGlå)^ÕÈÓ;3ò šã«ÔJ˜+͘ŸVlkˆšu‰ýÍA¼ fO""©íˆ&&L}sjÖü¢|åõI™m)ýïÃkDÒ…~@XpY>+À8cæ¾8©=<VMò­/<@Üš©í½éëõéØS1CöJEï5Öb“QÛ0o·e­árÀ¼ð6Ý)#/ ÎyMð„½%tFhSTD¸ €>_£Öý‘Dbws»÷³KøbíBw§ªi†#sXꇈz¶Óe¹M„[ÎûÑzjÇT¦o𨉱Wr§'Kýeö<¥„v³;¼(§ŠÝ™]
+Gzߦ@ª9L惣}r#f9£¬÷B/o´þç~B3l?9uB¢˜”ìÎé‡v’ëƒó¢²‚»ß02=·2IL./4í ²ã…±>…SùÇÕðý|žO`s}ëë ˆ“yúóŽzè7§@„¹‡ÊòÙ ntæÌYv‹\¡¸Î&Ê™º4¼XObæŽ{´N¢ý)­< ‡¨ï ûß‹TºA|夯¾Ø†ôak×J¥0 SPÆÐ>*®á7—æµTå`ƒ_j¿iþ <ßB
+,«ÁË&^“V—[*%
+LãDÉæú5š³YèûÜw'Dà†<ÖP²?iȯb2‘sÓ'Þ»ÈDcûˈ‹b˜\]ƒgLâ1Ú÷sâÖ³þé|Í+Gæxïô’RÉÝ8V³-ÑiÉJëÑbÄq5¸kr‡¾éÃø}$ªÎaunj”M*qœsÎàFi7pîßp¥ŠF2çØÀOªAŠv’/|(¹ï~ g$dß¼¡ïñâG*†ètÛ*»_xö«|l‡|¤¯<ÒQ’…µ·BÏÒbˆÈçSæ|UX¥¤³ƒö‡kmƒK.¢^>^XK¶Z“–—õ"Ùj‰\O__y¿U2N3•ÆúÁÝùæ²v3©aþêâVùóìM $EÆs^+îÉ%ºœ¶ÉP.LY…Ätï'FøHÜvq¡ÉoV'¬ûˆÇÕÝ3Òm¹Sì¾ÀÌÅEKð'í~Þ*žÓñžÒ­CȶvZÕJ^õA4m²\ƒKýa Ž³7_‰ˆþÚÁvdª®”ÄÇ0=£m"=®b."nÈ_§XŒH/zþóÕ›Uí MígOV,¤yU—.* ±™\QšcÀü˲²>^å„ ÀüÏvÁbÀ ï q[QFÐhXô.q±îõ_=B’¿Bƒ0qù™àú9Ã@ß\1É2Xü¡öaã4réZ¿¬î…ý`$Wü‡ž††˜ño§Iì¹÷ZŠfåmñÕwû‡òk%¥g©Á®j¢´ç¿¢Dù¥ÐÐÈáFyßÄOt‡á¾<1‹©Mq.Ú¼}-æöáA*zw*üË3{È%äè‘x¢¢ÒÉe)õµ–—òð€ÃŒÎ~£'ÜÜ$Ëÿ¾±†å‘?`âÕa+ºéòw¢äp¨3ÒÍVèe=å’vˆó\pSìy÷X²ud;oª7Ím²óù+÷góuÆ'â«‚â´d|ÇÕÝ S>ÿ>\í8âUö¼­´Œ¶G=Ù\ݘîÂqX¢¨
+œ_ðÀ,9°(öhgû¡o¯jÌÖ o4çþ‚‰f…]Ó좙žÅm)ÜUþµÞíQSßïקãW m‚dôåvqMàÙkN‹u¶üû‚‰L£R©i nAÝt]«¬9éT±fNûh}¼#ô ÃHNº *Tñ³WÅ.}*ZùöA0ô‡©Áše¶`v¢ °ªC <Î<š”¯Šì6-MÂÁr¹Èhݾ’ÎHR=­/«ƒ<öí€i"@[®/“pR¯óùwUëz¡••zÌÌ%»Æq
+ÁoP! ~}(™ü5ÌÅ9Æ;Õ±Û´[H.¯Ÿ³ìdÔÑ`“ ÍÙJ¦S1<šH ë¸ÙìÛ ¼°Å˺Ì}Fµó¢¨(*XÎò~¸‚„Ø€gؤqÀìSUhyxZœª.
+YwBæ­‘03ÐÞŒ}NÔ‚‹hÀWºœÌ+wßÑl“1Ë’CQС6]áÐw\‘’¦…Sqpi& â?sv«=ë¨zøÅ£ðí½;Ω\º c=EB/›´™ý‘“5eª~D§ãƒŽ&Þ)^LQézåÚÈ»„` ¼'8ÌçvŠ ÔPææV•Ìz(ÞjrHOZªî,ôÏz­Ã7í,₸ t!>Õ¸¢¯Ò»ûÄ&MÌ6ª!ÛaÏãJñ¼oÖ{aA¡
+XúoLaùÐÚt¦@a³Ð"—„S ½ÍϹÎóSß©×C¬ÞML[IÁÄL¢Jð>¥lg¼‚v›ddÆ0¬Åü!½ÈœKis÷ŽúÃ’bk\¿È†€ŒsF
+ˆ;övû.Õæzi”Áí¹œä`f “s(éA¶R¼¨2á^: Ä!=Žfý¾‰;ŽW§c~µÁïnS¿‡ï9âÉLšß<Úφ¹Rëä0Gc­vѽ I±¦€¥('§q 9õŒË
+ªþ® æ¶Â´]›†fŸÔd:šþ‡|B<ƒ?X2¾6ñIãpËxCCMS?ILÑE[¤Ÿï9 _ýïNòsª¿pÜÜ E²A™µ,¦/ŽAd-ÝÌ¥®T[c—[Œ”ƒAN‘í녻ͅOXUÅÑã¾3ýªõwåߣ ¨çïSR ™¶µTJ]íy©:­ˆÍsÆ[@¥*sÑÓSyKÃOhÏ»E'”ˆÛ?ˆf’‹¶2楄pL’
+»BÕ=Hv1eÛ¦š¤ÎûÂÊt Û>–¶,úÅÌÞ$¬Ü¸éì}-160ŠðÿàÏ“t¶û»i$¶ñ@]¥4‹µyñahïwn
+F×Ë0Gn‹ÄŽÕmâ믔õÜ“T^-ú 9]5pšzxë½!‘ PÊ Ü§`;¿¼TŽÌN®aÒŽà C›½/Qð
+¤}V£×ÑÈv®_`Î…,$ ò£3¶â[ Þ¦¶J,‰Ìߺ‡ÃFŸ°¾ÖÀªÄ‘˜qhíÖ Ö˜5/$æD*ÔU›Þ‹]áÙ´*Ìz6£¹©2Êõs+ÈÓ#'R”±(d…ã½ït"-HúGÏ\!j´çzóPêû7žœF´Áë¼&·æ›Á™\} 6tê¿ØÎ9Ðe4¨Í´ô• ±B’}¿O„,/±²X1Én·ñ8o'’¤¾5Ð-±„'j#^)\ ³¼ÃŠ–Ì?äNªŸ²$+ïц Žñê…‚Ýxš™C>b1¯):ÉÃÐ]|¾ÇÊìóÂý=(eѼmoL=Ë ÈŒžÙíÏÕ*9Jö–à7J’GKé/cLò L>[úHAÆÞª©µÄŒ'°‰i5b¸ «‚ݧß=ˆ†ÅïJŒ"J¥É±K¢>Úûˆ_1]@hünH%|Ñ:²¸ew·ý¸90ôBK&×åw5Bzh¦’æ¸YdÜóæg}D
+V;Ü#R™'Ž5ž%g|!@1žG½Gø†aU!Ðs…R÷+‰µ\[€gÙ]gÑŒ:)
+Ô‘LN¤@ÉÌh"OîD½’(ko]¬cúÔ=Òü¸…&TΨD´mÊE%JƒÉÞ›’~9Dªô˜21xBou×,ÚÔ ™Q
+Z®ËoÛ4ëŠ*s³°ütg†©NeÔú#‡ßìF¹¤¹K¸]C•f/ZЪ}¿@ôFêbM̼¦K´ØËJ®?L›^ëåɼo¬àÜ^Såõš¾qD¬E¨ÁOÙC¦ª†#¢HGd ·ó¡Æ‰APHöʬãÒ_I
+Þ°S, LqÎ*™C •–ëüðÓ¨Ájl>ækøƒó
+þ„ÑŸœ¥*´ƒÃÜ! Àr™27lÛNâøò,% @/üùjÇëf­„@´RÛÛ¹Õ:#Dô­N tAÊ_‹+fQ$'ß“_­9ËW„~cŒ“üŠ¶aÀ-Í<Õçxî~)Bfvd%¦Zýd4Â*Œ^ÓÐÎõ(“nÖ•Á7†Îr{S¦æ”‹ÏF/h8“¤s$ÁN…t´æzi›
+¡â¸0Çø$øÖ;¬šƒyëMŸžü tý LïXºªA- ø]·ö•9£ö˜À[æË#­oÏ}ô<°F—ŸA¤Ì Èúë…¾KUÇÅÎ}Žøv^¸úͺÛá´„W…Qo;,@o˜ùQ@&×_}=. š×Š˜c¯(¬t\™z±g¹8§Ú±ŽŽÞ¦LiR™‘KÇ>\
+
+“;·!iÍ1w4!Iõþˆ÷Ûû¼ïðy¤’2¶
+¼–I㊙•oh†ÿ9œ¡–Îí°Å`û>C¼]ûÖ ãP[iéº5o™òS·ÍÚ¦b¸ùP7xÊp]_x+Rl¥Ã×z/CUO² âRÀ¨lX ;²
+VÍ]êAy³XH±ÔŒèyÒLåýkoù"-Õ6_XŸs(GÕjØwOÎÃIÕÕ\‘›"NÚGvB<dÎ2æUøõÇͨa'nœ"dáõj›K†·…éÀaµ*»Üz^YCOs´’âUerÕ3“®©¿*̶^qèåSømÄ“—´¿Ìm+V#.MïäîuS³°¢º ½7Rz·Ú•DÊ£{ót§UYEzØ”Qù-t²y˜’…[ O[UÜW¨‡³!¨ï5ý ¹yK=n¸±u».5®°Rë¡fð¨,¸V2›è>ÓˆŽ…¤Yô·ØfàÄØ(ßÁx‰!´à‰%žM>¯Z)
+å"UØð;z¯Ãg«Ô«¼L’"¤Ú-Û‚ Ÿ‚xwÒ×~ e]bþL‚¸=V›Ïóð¨-ÁÅû”Cª³;ÓÖoä®Í ¨ÐÒ&CdÊÜÞ<_}9Ížsßú–M©’£ê˜Eä‡S+ø{ðåÅ1Kg¥V£2¾ÒÁ5«È–­eéýê õÏŠ½SÅöÁ…®ÙK¼TùГ®°zc†\wír,Ö™yÆTôfDÇãF^±–ýtÚ|¶«w]’ÂйP
+¿,:Fp\îŽr|0`Ï!ÛÍéy¾.Nïè^(%×½ñ>Ü0Ø]^ÒC ‘$®Çž5~<ðrpÊÃz>ŠPãuÍx{¿šècAÊûß·™ÍZÆ~œe·9^|Ø™ª´:öÛ9½0 *ÿ}ôõW'¼D>½³}=à -zžûcêÈ^‡õsa`ÔúþçBº&¿¯ÈÀ}Ü–#üÝ×õ,¶…ð€5nXœ`KÃ|Úªup´ëqª£¦Ws•³Fþ»‰ûë»ÕnË·+1§!NqM;Ú¦”+1Åôä@2Z œXÞ%ÉŠû:bj
+XãÙS9´½ AÄŠ›˜ì \¿j‹Gq‘ñ YÔ4Ûûª2x"…þ€¦Æ">5IåñOù¼Ðù)þþbZòZj÷Ö›ŒEŒ×©8Œ†–BY‡tç÷]Ü þ×™¢Ë€9£ýd%ut o¥tÃØ_‹Òs¼#Žp9Ä RsˆNóÊ Aα›‘my_êB[öéNU9Wɶ¿~›ê?
endobj
-953 0 obj <<
+1228 0 obj <<
/Type /Font
/Subtype /Type1
-/Encoding 2140 0 R
+/Encoding 2705 0 R
/FirstChar 34
/LastChar 125
-/Widths 2150 0 R
-/BaseFont /BNCTYM+NimbusMonL-Bold
-/FontDescriptor 951 0 R
+/Widths 2715 0 R
+/BaseFont /TENLLE+NimbusMonL-Bold
+/FontDescriptor 1226 0 R
>> endobj
-951 0 obj <<
+1226 0 obj <<
/Ascent 624
/CapHeight 552
/Descent -126
-/FontName /BNCTYM+NimbusMonL-Bold
+/FontName /TENLLE+NimbusMonL-Bold
/ItalicAngle 0
/StemV 101
/XHeight 439
/FontBBox [-43 -278 681 871]
/Flags 4
-/CharSet (/quotedbl/numbersign/plus/hyphen/period/slash/zero/one/two/three/four/five/six/seven/eight/nine/semicolon/equal/at/A/B/C/D/E/F/G/H/I/K/M/N/O/R/S/T/W/Z/bracketleft/bracketright/a/b/c/d/e/f/g/h/i/k/l/m/n/o/p/q/r/s/t/u/v/w/x/y/z/braceleft/bar/braceright)
-/FontFile 952 0 R
+/CharSet (/quotedbl/numbersign/quoteright/plus/hyphen/period/slash/zero/one/two/three/four/five/six/seven/eight/nine/colon/semicolon/equal/at/A/B/C/D/E/F/G/H/I/K/M/N/O/R/S/T/W/Z/bracketleft/bracketright/a/b/c/d/e/f/g/h/i/k/l/m/n/o/p/q/r/s/t/u/v/w/x/y/z/braceleft/bar/braceright)
+/FontFile 1227 0 R
>> endobj
-2150 0 obj
-[600 600 0 0 0 0 0 0 0 600 0 600 600 600 600 600 600 600 600 600 600 600 600 600 0 600 0 600 0 0 600 600 600 600 600 600 600 600 600 600 0 600 0 600 600 600 0 0 600 600 600 0 0 600 0 0 600 600 0 600 0 0 0 600 600 600 600 600 600 600 600 600 0 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 ]
+2715 0 obj
+[600 600 0 0 0 600 0 0 0 600 0 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 0 600 0 0 600 600 600 600 600 600 600 600 600 600 0 600 0 600 600 600 0 0 600 600 600 0 0 600 0 0 600 600 0 600 0 0 0 600 600 600 600 600 600 600 600 600 0 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 ]
endobj
-938 0 obj <<
+1207 0 obj <<
/Length1 1612
/Length2 18760
/Length3 532
@@ -11088,7 +13706,7 @@ endobj
>>
stream
xÚ¬·ctåßÖ&›£’Û¶mWœT²cÛ¶m§bÛ¶]±*¶­[ÿsºûíqnß/}ß{Œßšxæ3ç3×c“)ªÐ ÛþŠÛÚ8Ñ1Ñ3räÍ­:;ÊÙÚÈÒ)Mlpdd"@C's[QC' 7@h ˜™L\\\pd
-ŠšRò
+ŠšRò
üªm{|ÓÂv¸* Þk‚駹?ÛÜ—Ní>ö¥©F{1­(zR€—ùøÞ$T}¨›ä4 z%ˆégQžW‹²ÛZìŒê»“JÊzÅïPߧ;X`®ž¨üH\
üÐIí|ŒRëc1:QA¾Õžž‘'?=R Ž õÜ@öíãÑäÄÂ’ñ¸@ ’GúÙçà h©Ux†SA¥7!àÝ´_}jt{êå‘‘â’FX˾*šæ¯Ù´Ë¾'A¦· ð&Ê9H¶îWþÀ¼žŸŽäJœæšËýZw&sÄâmŸ
쿵$ œÉ„®'~
@@ -11169,35 +13787,35 @@ i¿5xÑ@>,Ïu> w?tiÓ¶0ûôIÏä#%(ù‰ö
^hâŒð·¹ œ£“hZ™Í/øÅ_à7œÀ+P¸¸&&êåî$+Nȶp®Ô ~I(–»c¹ÚŸYªÓÅg¶%ø¥p%ö>­’H¾iL¿\ÚõÐß(¦µâ_«8Cƒ—R{‹
Žµrð¦ëØíû‹0Ê{‡˜ÊQê¸2‰«Zœa‰ƒ†*7Äc¹äJî„I›ÏüìÒ]©æÁ 1=Š¡å©òñS€MX¡¥GMøªéþP¢‹:*½ÙOT9†ÜD¨*ÀzÞÃ*Úž“¬ÿ°Ë_hg
‚œ«ê9ŸjˆŠ"J7Þ®(ðhT(ìâ ª¦¼ÜðÊ™§Ä‹V¬áÝq
-oò]ç }£¯9B‘7õ· öœH{È­’ëæi`T&éVÇãs"¹‡‡ªÃßÛçVMo¼iá÷׈â{C„^×;¿_g¿`,·÷þ2 Ún“ R ɫǶ]ÅjÍuib°ƒãÏV!QÏÆ>²¦aO<ö”ñOÁxƒªH²$áófe°§Åû›ê¥úКxÇÑiêÅà>ò$­–Ìy"-Ú-ŵ ôý‰¤Ëq ¸ŠÖˆÕ"™[Ø m¥cA¸¶¹"t8Q+PK¥ìó÷Ñ”¶ëÛãh_“ ®$+ƒº‡¼S¾ÎúÜþµ$áØ™éezv~7EhÅZÞ‚¥ÓªãHÝåûm®Ý‘(ãŸÄ"Þïòwnúê›»ÉÕ”^«¦
+oò]ç }£¯9B‘7õ· öœH{È­’ëæi`T&éVÇãs"¹‡‡ªÃßÛçVMo¼iá÷׈â{C„^×;¿_g¿`,·÷þ2 Ún“ R ɫǶ]ÅjÍuib°ƒãÏV!QÏÆ>²¦aO<ö”ñOÁxƒªH²$áófe°§Åû›ê¥úКxÇÑiêÅà>ò$­–Ìy"-Ú-ŵ ôý‰¤Ëq ¸ŠÖˆÕ"™[Ø m¥cA¸¶¹"t8Q+PK¥ìó÷Ñ”¶ëÛãh_“ ®$+ƒº‡¼S¾ÎúÜþµ$áØ™éezv~7EhÅZÞ‚¥ÓªãHÝåûm®Ý‘(ãŸÄ"Þïòwnúê›»ÉÕ”^«¦
endobj
-939 0 obj <<
+1208 0 obj <<
/Type /Font
/Subtype /Type1
-/Encoding 2140 0 R
+/Encoding 2705 0 R
/FirstChar 33
/LastChar 125
-/Widths 2151 0 R
-/BaseFont /KKBRQL+NimbusMonL-Regu
-/FontDescriptor 937 0 R
+/Widths 2716 0 R
+/BaseFont /WYLIPG+NimbusMonL-Regu
+/FontDescriptor 1206 0 R
>> endobj
-937 0 obj <<
+1206 0 obj <<
/Ascent 625
/CapHeight 557
/Descent -147
-/FontName /KKBRQL+NimbusMonL-Regu
+/FontName /WYLIPG+NimbusMonL-Regu
/ItalicAngle 0
/StemV 41
/XHeight 426
/FontBBox [-12 -237 650 811]
/Flags 4
/CharSet (/exclam/quotedbl/numbersign/dollar/percent/quoteright/parenleft/parenright/asterisk/plus/comma/hyphen/period/slash/zero/one/two/three/four/five/six/seven/eight/nine/colon/semicolon/less/equal/greater/at/A/B/C/D/E/F/G/H/I/J/K/L/M/N/O/P/Q/R/S/T/U/V/W/X/Y/Z/bracketleft/backslash/bracketright/underscore/a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q/r/s/t/u/v/w/x/y/z/braceleft/bar/braceright)
-/FontFile 938 0 R
+/FontFile 1207 0 R
>> endobj
-2151 0 obj
+2716 0 obj
[600 600 600 600 600 0 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 0 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 0 600 0 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 ]
endobj
-898 0 obj <<
+1150 0 obj <<
/Length1 1620
/Length2 20127
/Length3 532
@@ -11205,7 +13823,7 @@ endobj
/Filter /FlateDecode
>>
stream
-xÚ¬ºct¤]·.Ûv*I§cul'[£b§bÛ¶mÛ¶­Ží¤cwý¼ï·÷>cŸóëœý£jÜk^s^×Zë5FQ’)ª0›Ø%ìlA ,ŒÌ<
+xÚ¬ºct¤]·.Ûv*I§cul'[£b§bÛ¶mÛ¶­Ží¤cwý¼ï·÷>cŸóëœý£jÜk^s^×Zë5FQ’)ª0›Ø%ìlA ,ŒÌ<
šþô­¯œtGLz¥ÈéQž7K²;P?8˜Õö¦””õJ>`ˆg:Yánžiü(\
ü°¾<Ù£ø§6Äbw¡5aÔž_|M<}~¢î½…î?$¤Ë‰…§äuBþéçC(øC­B¼ªùÕi{Ju ¡glŸÏÏìC(»ƒ¢ÈbÓËZÁçjð§fÌÁpC@¶
¦éÂú”/é„ÐaF)¹ìÉT_Äü AÇDF@’_²– z¿IÂ>^"ò“£œŸpÖj×Ñm¡HNZ¬¹Šù—;Ão{ô«OŠ—©š}¾ŽÈïqM gÀÁõ@‰Î
@@ -11279,136 +13897,130 @@ K› ÀöYt^¬evQ&57Ñ„t9Æ©‘;ØQLV2²ûËI2­U^¹¨%Ô~ŸŒ×ˆzW
p
íSß»bò7+֘ߠáænÍwˆ'£#µE°nx‹¢PšL~|ö4KQ¦–!¯jn£ÕªîØãVBGE”}œœ Žý­Ð{ƒéV³”Vã0¾ô.¶Tv‚Ì|` °SU[¸U!&ýø7 >hI£YÉì0…òÇ*껪¦úݳj€í¨ž¨ß`Ù?8sGx9g3ÎîèñÙt÷:n:—SúluHx‹œ›ÍÉPo·«ÃJAüÕh€ß¾ÅW'ˆÃô´B ¶q…¡Jˆ`“ý kaæ®´bg>–MO”¶æB8uk—ÄþÙ7)Çê®Ü¿5GVQ(ë¿P­m-FG*åTA¸¡WK2z)· Ž×?3Ì›QOl
-¹ƒ%ÔÕÝÙêjý2öáýendstream
+¹ƒ%ÔÕÝÙêjý'óâ
endobj
-899 0 obj <<
+1151 0 obj <<
/Type /Font
/Subtype /Type1
-/Encoding 2140 0 R
+/Encoding 2705 0 R
/FirstChar 2
/LastChar 151
-/Widths 2152 0 R
-/BaseFont /BGSVOO+URWPalladioL-Ital
-/FontDescriptor 897 0 R
+/Widths 2717 0 R
+/BaseFont /FITVGS+URWPalladioL-Ital
+/FontDescriptor 1149 0 R
>> endobj
-897 0 obj <<
+1149 0 obj <<
/Ascent 722
/CapHeight 693
/Descent -261
-/FontName /BGSVOO+URWPalladioL-Ital
+/FontName /FITVGS+URWPalladioL-Ital
/ItalicAngle -9.5
/StemV 78
/XHeight 482
/FontBBox [-170 -305 1010 941]
/Flags 4
/CharSet (/fi/fl/parenleft/parenright/comma/hyphen/period/slash/zero/one/two/three/four/five/six/seven/eight/nine/colon/A/B/C/D/E/F/G/H/I/K/L/M/N/O/P/Q/R/S/T/U/V/W/X/Y/Z/a/b/c/d/e/f/g/h/i/k/l/m/n/o/p/q/r/s/t/u/v/w/x/y/z/emdash)
-/FontFile 898 0 R
+/FontFile 1150 0 R
>> endobj
-2152 0 obj
+2717 0 obj
[528 545 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 333 333 0 0 250 333 250 296 500 500 500 500 500 500 500 500 500 500 250 0 0 0 0 0 0 722 611 667 778 611 556 722 778 333 0 667 556 944 778 778 611 778 667 556 611 778 722 944 722 667 667 0 0 0 0 0 0 444 463 407 500 389 278 500 500 278 0 444 278 778 556 444 500 463 389 389 333 556 500 722 500 500 444 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1000 ]
endobj
-801 0 obj <<
+1017 0 obj <<
/Length1 1630
-/Length2 15892
+/Length2 16214
/Length3 532
-/Length 16775
-/Filter /FlateDecode
->>
-stream
-xÚ¬¹cx¥]³-Ûv¯ØfǶm¯$+6:ìض“Žm;éØè°culãëç}ÏÞû\ûœ_çÛ¿Ö=kTªY£æ¼îûZ”¤ÊjŒ"æ¦@I{WFV&^€†ª–²‰­­‰9ÈAžQÕÁÎð×̉@I)æ 4q9Ø‹›¸yZ@s€8Ð ÀÆ`ýúõ+%@ÌÁÑËdiå
- ùËAKOÏð_–\
-ø›UY\òßuºZ™¸þ“Ûô8Xüõ4w0sûgKÿÂþÒüE]M@ö.
-`abû·Wÿ²kØ›mAöÀ¿šþ«
-™**À)—PHW£B¢ªU³m·WÛÔOrí]VÉ• $«ùqyĤ"õÂzŒf<0ëûë£Îðf}/Ÿí¤>bêFè,VØUd‹ÕƒæÔJlNÍo’©+¬OXÏ1Ï-¼§c-NÂ1ipÝ›í\AÖ
-úêì`uvdé,RHžê$žkK‚>&Y ¤ºÛ”OØ&â„o™kâÆœm§Ù WëÙÉ
-¨œ/û«Ð[BÒó´`Ûtä¯äÍN¿GfáĈHªýmVéDÇÏ“Ÿ”Ä÷¦Y_kÉóÍ+èü1pÇÒ¨åÁ³ñÂjD•jÊ
-Ga1Ã8‘¯YÛ«Ÿãн>½l•ê!¾™Ç”œ±Rš¶?àW'‡Ù_NÄåƒÆY4!aÔ„ø‰¥–
-/ÓLòFºVÕa¥¹òÞ+sTe˜1‘G·G]<ÖlI¯7E³±+’Ò=‚,Cš«OÒØor.¹kÕ /ÁÓŒ’ÍU±Hi~|ŒÖwÚkµqš‡~ƒ¸Ö£7ö³"ÄÇYæ…ÅO k_ã1fo4,ëIoböm5¹‹²O½k‚uÒ¥2ƒÞ¡úd‹j¨7W})“Þ‹¤ÐϾÑdT¥wÇ„{•ü¦ÒfËç«Ø™#K˜€Nƒh çuÏÏ%¢>ÞØXñÿàÛñÝ%rá§_&ωbksà£uÂÑj£«ÓEŸ
-ö:çkØ¥»ãÆðòvÏ5ÅΰÂÜ0p!.ZÍ2§.•`Õé;ûòÒŸ¾´E 'ôòL‹~­'"Bδ •RÛ…ê뚀ÄÌË1ú€Þ‚`0ýzл»-õ®‰ÑÆöø$·«|Â9˜ ühˆô`´6GÞ£h‹º¢:"ÎÙ;¾M¯_­µJ%îo%ÒÌnck—ý'y¾‘ýαšm¡‹¦ƒ”õíÞ*{ iwQ[™¤kžç Ë tîF!cö8äÞŠNßãÇx´ ’Ü!Ä’¥¼Ö¢¦¥Š—Î~_ó©àH¶ýÛ±1%Š–±Ú¹ Ͼº¦á¢Õ>ÝMÐAŸdZ˜Ê51Ýb1ܤɬUð/
-‡Ø
- օݧ{ÌæßÖRáï›I“¬ïØÃ4†ºéd`ðe'¢ò›KþÈé•ëÀ0 xö¯´ØQ¤Î]åhÓJ;ZL½"7Ò–ñà|êTñÌãço2R°×%‚¬Xs­üòc–>`pȸÔ¢D…Üo½I[«4uÉG ‡äÇ]F?bo÷ ¦"1I[#– x%‡x‹¹žÆɬ²×Á>Эs*´Ïühd&Cîx3Ôà9‹œkMŒ™"SàÈÕÍŠL€''ƒ™C¦eòœÿ@ËÞÀ4:%½BÔ‡?Ö´OH6c{h¦5/çÕ
-5’QÄ„Qƒœqó™0=l­\αç
-¥×$á_~Т:ò›l
-Û…úMÚ„m>ô‹'Á†ž§MýO³qÎCÄ]´5CXá*\•MN£dtWî
-BJ!•l!~X‡’Õ É•aó’1Ë"/°E©ø!Jü÷™oó§KDMk§Èéw“F±§Ûˆ{¹g,˜6Q4²«lía¤WÈw©4q’7_úU0"¾B` Ï"ø?(±*ë2­³G€ ¡fÓêQXŽŠJ5úºîÚ ñ%èÐäíb¡Ê¡ÓYÉ_c¸p'vÿЮ/]·mÐøD‘ /³îwòŸÙ|&æ>¡®GSÜ° ¯d9{¶£IóJŠK÷9fã¢éŠ ©þäÁõ@ñ¼9xŒi,P¾*=cùüà‰µNm6O—^ E› ªÖž©ÁôЮº
-M2tÉ»bqJCgª`AjI@vr]Ú@Ö *Ó ä½è¼‰_‰ä”/ú¼æ/
-¨á"R’´‰öÆ$ä ÚU W=ŽgY·'æýÕ ±M‘‚‡{}•ÜÿöA®ô5±ò½U<b´Iïqç·3Áì\³ù«çsÿ^«Qº×I?^s2XÉOzG÷6vïáæàæiðŠáãAûÍ6ü‘îav-œ2æ¯Krʃzs_4/“íBào[çç3r„¸)_&x†·¦3‘ÂÓeX’9iÏiëxêל-9ˆ‡sA\U Û=$˘¹¦G ÐñSÅ¿%ÂßR2õ«&öòôtÈZ¡EÇ£ÚùÌ.êòhnSm»Ä³=£Dý”Çõ6àÆœêk0¼îSF£4pºJÆßú „c¦…QØÉG‹Ìû,\…RXÒ<5µ[ŽwÂ×ó é ‰ªš Rš,¯þþ’\™mÄT0쪃ó‚×sõ`ÃO4â„W…¾lï‹Ãë"Z2µ0lÁ¬{¦'( zñ.9_ÄzÎãБ²þãbîÂÑëwS*ú[­FspÛúÛߤ_é~} ‹s\±š“fÿ{ô÷ÁÑ#ŽÊ‡/°² V LlQ9áŽ%Ã¥€T… h(£Œ"Îå
-Þ_#þÍ:ÑdŒ´r@SÓ^É2çQ›¨ô]´à8UY¦âq¿½Ÿžj_'åm~²˜O±ö òà –,®ùé‹‘c^·Úû…ç C)¾ Êt%E—fã$‘P9¼žˆã4yo(¢‘d9mšjW˜/¢qge>KмÎf6ÞÎ'2¦g¯,5ƒŽh­óçü¨6à«ÈÇ
-g!ò)#îLI•eÇO~,EbÛà ¢.ÈÁî=íõÙL(Bćơ=²a~¡Ž LÌjSȤk²5ž€ŸH½ºFŒ§WiWམXøwÖýï… \#A†%ñ³‘Ë2‘j Ç´½Û¡õ´„P2’åíC¶²‹’³o K,\QÛ²ÔŽ‹¼Ü3WÚ ‰SÁ™Û3èF#ëšlËñ°ÁºÌ¬§T{ô?êu5DZ—b!⺂Æn9Š#M‘y^Qi$ë\Êo#£ :“ÐÇÏq`{‹!ˆC%oÝË|°¢’N½`^¾VÄ:z´ßÂØÚ˜Å,Žž”\uyFÌOàø6ëÞÀ…?z†t+A×ÜéEî>VµÝ´çröt'ˇÅ<Ë9¶]ÄöýÞCðò—|fŒK¨ª£µ®ß( ­Â‹%SrÜ3ÀðYÙ%ŸT<RÎm*ˆæ“SÞÑ-ÏaŠC!)wȨÊ;ý&NÀêpêüôÈtöÅ;ÉÈ]¶ÇŒQÉŽ_@q²Óa–Û÷Ý n}ù‘Ûü¤ŸZù“íÓúY»hy5}îê]5P×*»a$G(®‹uý"»ÊÏc9‹z›”­
-Qm®­.
-_ Hf³ÚU;ì­^º~ÁÀÝ3µ5é øÚ¡ºø[\Ù¡&÷Ú;Mo9E*Ûí¬ E Õm¹lê·šÒqd‹¸þýà¡xZ¯ïvô£æQ¤䨟JêÅcFv£1Xc:bv´æQ43ÜËg¡ã6jÄK¸ú¡|R¹š“øÃ÷N7œô±°ÆDL³ ÒYTmN`ÄÔŠÓi
-öYˆ=~åÇk8¨ehúRZ^±V<£‘x–@#”"s•ýÇÚdÔIðP…®÷­•úz8*uÝKœdÕY…®Ùð.Ó©¬á.‚ºuÆTaˆVÇñŸC—nXЫç«j”«žŠçµS¹ Í[džN–üèÇæz ôÛ¶IµWV€A¶šéÝØNQõÆ6W
-ÿ·^]Ä“†[#"‡6]”ý¬…Xí=ïóñhé¼ÜmÄ%ýÖF¢WÛþª†Úû—tµdý
-á;¬/¨`>‘DÉF•X8)RŒ(êe+QBöìøYýú$ø𙨗wš4ÉAÑåFç[/Ìï(=Š|ú11ǹÌYfFã–s»Ø'ú[þµwù|¼ŽÇÛ,ë¢39i¯æ¼Žõšm!¸«uEÖê†î .>Pr˜áËóOªbeå£/Ï”£à?cÛ^0ô²³Ë«Lâ9}IÍv#VSgzºŽÙÑ‘ðîàê)˜¶©£p.´ÊI*ðwgÚË&)ƒâ²oUÌäšH€+ßÞÉ¥al‘BéiWŽÎG^ç˜ÀØl8„¬~ÇH/«æ5Àc/ý
-q,‘ô¡ÇúGåKco IÛ³ø©‚Ž Nv#j»£)Ÿ—“Ì·‘¶ý¤C±Œmm§
-ÄáÛì‡VJ@ÂyÜ4A“ß(9,”÷-mZË)é‹ò8ÕªÇ+“lvÕcÊž|:"Ú!ý XjñÕ,NÛO¤y|¯aëŸÚaƒ™z
-ùΦ*-Ír»b3‚Ë1<]#°Õ¤pX%'Lèw²ƒIýohZrI ®ìñõQ„è1šØ—×¾˜I×ì —UHð¢îq‡G[Y(|#8°ˆ ¾«ü Ì¡"@áBÔóѳ{¾¨'™†V æŒþžßˆ)Iª‡ýE«HÞË]~@wt<ª7çqÄEÔË̬´¥!yšj½7§ßÀÛ*«4øÑ?rê9ðgÅ£ŽÈKj…4HÍD}LÂà=™òâ1å7Ü4S¨r/êö,m@Í H΋pø^T*õg´ ²è‚V e™'&¯F€™ámyÛvîÃQŠ€X¿6~pl“È3ÍeôÆ`âå=õïÒ3(¬•éq7¥sšçWÐ)¿Ÿ•µ®K¬1¿!qÄI b^B,Ësb¬@¼ ‰ja¦•0?8ì@?N©¶ôÚo s¬y¡¸TF3ÎRer9IÎÊè7?°0x?Dtebv
-"q‚x”Ad€Äœˆ®wÒ4°ÈJÙ¼­Ì8ø¿Wöwm B\ëê ìáQïÞÌæºÙ2çŠ'=|J¸^Ö{~ %ÒffÞ2*„ÿ¹UU£î[œRnÖûÎ ç äà/︊»æÕµ±úøÖ[²@“¬½¡Í—5NCCOQ~Ù/N»ùÞq¾!ê ‚„ÙHÔÚä5Ôû3õíya÷UTE‡3BŒýóGN½Ü‡ÄlXþÔGõ“) Âå§aow;é5’-Vy3Å„§J%™èvsQ¾ó\¥Æ0wW˜jS4ÂÒlêWbØ9z%ò¶;,_*EéÃŒ¯ïw1wÙ=ò^D%IßïÿèÀ ‘´ÃΉ™ûÆk¸ß‰y(@ÞqH·DêÇÊQsfT+Û©Õ©s>ÁK@BªB¥¦¤¹já»AÙSg(c¯Ì^¹Ÿˆ<H|…vøuMgÌ[¸åßÎ e7wjrò2DüÛ6dlœ H.)=í:{˜;œ5vrUå(è
-«°;‡5Î9ø%ÏçL¿ôw_†hÝ¥‰’ 6°V…
-^”ØD>#û|ïzïÔ>Œ_ƈP‰ÌäFY„“ðÉQ[ÜȾo £zsT¸8ŽZv?=ªÅHAÓB[LÒÒâvl.èÆí“ÚGÆv‹7"E‰†O¥Ojn(`²¯—½Wb°¡vs÷;îù+®{¿ÈýÀX°«§º½[ŽÓì1˜'½Û6ˆUÊYø“÷dÌe`3ºæç³¼6àHÅ©ÜÁ­ ¾ØÅú(n°ƒù‹"uY»¦·[F’¼3  J
-ÓdŠ®ÂlÀZ(”ŸRO¹Œ»“69Û€Ìà†ûŽDQäìUJE5ý*rÍ@
-(§[$$Òè,ŠÕ%%yÔ »´Æ”V°ß{Ó(±3· Z„Ö= (0ÜHnƒ«%1œÍBz;¦ßŽÚsÌ9û=u›UÛþígàÑv±Ú9Ž{â’®0Ý
-ø%IÆãа¬"£H_|B
-DÈôZ¨K~¡ºy±'§«š—˜Â2ZSŸÄ*_Žs°¬¿áüy­•4á’DˆìG„V!3ÆÓä.¦ŸõÒÀ~Yx²ÚQ3æ0ËÉ*À‚äêJÛnïPýúúx ëW11u‚:Ow aA” ^†’ÃÆ„fÚÒRW—Ø(˜¾àBß|d9™eŸÇì x¹|nzç¥üí’]áÍOúåð;={É—êž/Ý„x_ ?à^ÊÃxVòWû‚¼%uÅ ºs+§iTO˜²ýôˆí^êÓqFÆï;ëá[1IÑÇ@ÑIÍEÃÎXq{tUå½ÊZ$ÊÈ/.·Ë3¨-Î ï_ßa?›@ñÅPlTÁLþŒ?iy1s•ÂyK°€[å>su ñ-UXr§m;¨:ª•Kó£*gò¤Åú‰᪠Y&–Ì1Z°ÏÚ¬½ÙQ‘~r"¬JÅÌ`\Š}‰rí&–¡[@²¦Ú»Eû($:¥ºøeÖÌÈ|½C¾Ö(ß~™„¡
-ö99'(ÜÛG(#?‚iÎä²q
-[(†ºÍ öt bÚ[·ö-
-HÉU
-’7ø“’ðüÅšŽ,<ëÀ¢ Ò½è ¥;KY±7¨n’7qÍþL3Œ8Œ@×SÿCŠtv‰jáY²Ž¶bb»¸iS
-ÕL;&ÜÚ社Q²;»UjNN{)òèÈù¥@Ã:è0>nOG"ýya,.ÉàÙ zi™TÄë:q!$*nK\Â)÷.¬’í8>‹ –Éîu¾J~&Õ†»M[oȳ©žJ´2Ëxy˜3Ÿ‰“ýÖ.¿”©tü.ó–5”Ï8Až «Z¦´´òÏn‘Kœ'‘[àõ•úV‡54›»Ü,eW~o§5X9mó‹jœkÑ$'<àYœ@ªùA-G-_ÚmVó ` «ú„£ù”Ó¹×”Šó“$È»²™©CÕr1¹"ÄÃ$AŠíŽ)й¦?¤Í0HÝÅŸàcËÉ&<j ©C@×Þ¶ÃtH.‰ŸkèA™ÎÿÎ!á
-u­WfH´‰6çÈPG
-.g4“Mâ'M¦ï(ŠMÑ|éÖˆð…õ²›ÓĘ#5Ç´=È•ò~u¦5Vê£R¯/®£­óHÄ®f§ŒŠN¿:¿lŒTmoú_ ˆ[O»1Â̤§ké&èIN†‹v@‹þH,€tŒt¦á>Õ'R¥•K.zgóJ˜ë(+Á5¯2ìkÚ Ý϶¨Â[ú3Änè^ þ^×ÌæQ¡T d`v+f<ñ'yжj~›q)ž\k,°ý”škQí—½`µ‰OÒ«cìÔ\,& šîJ
-íiW‡ fÈ“$#Ò±"÷qHÀŠJ\èWxZ'dô•ÿ
-'î»ìØ•Ë#>¼ºê£Z*¶ ?fôÑ1sm%$¥ž
-aþ2rž¯Y"`¿
-E¢Ì®_Q²HL‰@Zá~fNS^ÿœí^®<+9;ÚyÜúMtéÔtßæN9ïJAñÀئ{½ùMÌJXQ—DÎ+vûÔÕ†|bs”F-Ë•§EJ òó8}]ÕzÙeRéÀd.Ly’ö|ÿDl>Åõ]Ãh­W[®!ûÄT‡‡ÞuýÝ!"ƒgúˆ.’FHD•‘õÝÖÚšgì$Ð6MNâjpx#2ì,y]®“ê™ _ŽwrÀ% Oqp¶,Ô†´}–úy.Ì0ØÖ³pßãOS*³ã‡ïwâE †ó0m‘¨ü…YiEµ ‹X‚EiyÂ’“ F/ɪô¶­‚´J´ž—‡@%aHøèÕ?7ôÝŽ¨Â'’J‡ˆ2LäÍÝDœŒŸh¸Ì¢±·,Žh¶è„CYö]Ñß´­úgmkôfÆ#ÔíÈä¡J¸Umßý¶ªæö1ãïÕâ•Æ»Å†-eQCÕsoŸ½Ø‰ Í™ªLlmwÓšÞ—Jš¶9¾!&5#é»~kÃÓ•±9wX§Mk‘ŠHg¥éÌÐ6ÓÂx̱Ùõr>%Cçñ#ñ“(ž¢Rm|™$×B\µÉ AvV7Áû¯…00À(ä1˵ÕÝÝK¦Ü¹Ù~éo»T9z˜~Yã{òÑ=Mq0ûJA «ø}/£1Äí«e—Ѧn/*ómF¿Äxù q¬äyJS*\€d­-†:¯Ø]yÜÔåTƒ‡¿øƒØE@ÍfvTü6íÁ2~lW=_xãSeþ<ùBÐÊÒm"¿‹g|£žŽ/>¡„ïn‡œ0'OK_5b«F¾ìؽ°`‚ýÔš´ú&¯Ï¸?`;ãõð æzâŠ×=k-"c ª)k¡@2×Ül SÕs'tÜ«f€p!Ó«‡¢¤H|ö‘¾×Á[ú 4ô‹ê9_¹ªÒSGUPâI%¸5–
-qQ)[‡ŸäW=Òлe~ÙŒB‘»ëó´#âý mω;y»Š%üŽ@D$zfªéA%OÕtØ9ø»«óu 6’RáÞŠxƒ„ï”
-2:RÒ]š¡¸\•´²DÊ™º´^-;nðÇY~þ0Ÿ1Í»PÒø¤0«¬}¦“?f0­úÙq†cŒ¶[ú¾;¶96Ø/
-P„ é*Ë~fûiöðÐÁ± y;§‹¸Ãà’ßÐpù<3A,
-HG€BÊ!´q<6õûœp—-HM¶Ýu'¯ýôhË)
-Ûs'&ÞHË¥Á§õŒñ¾QNç—‰Ÿ8[/»'ÚýtÐMs¾Z!Å7ÃFjA¡;Pì;ÎÓ<Ø:ô‹hX[ÇñxWÓ·MéxWÕòћӼaç~ݯJürÎÇû®³`ù²ÏÉF™m¨1£áú§U, Å€ÎÌ÷;:ÖÇ9½èyÄÂ1žìPUºÝS‹QRUib3íWëA(W×â“ÙÅ€µ†„äõ6ú¡Q{I–àÆ/Š†#¿I¨
-RW¥Ï
-Òd<—ñ*õ/^›žˆu“ ”Ö†´06f¾Dx>É3ÓÐ6 $cºŽ~{V
-´.ÎlTÖ±ð`­çÐÖátžë¾±ÉŸÜÖR)z’ºª^ Å}bû»Îd7
-Á~‡+Ò«‡´¬©Bcá#šUQˆµ»ž2ßÓ5:a]C>+×­ 7ø×B
-lwÏÍ ¤Á;e£“/~Å©ô6€bDPö€Àì5 ßhàdÓ'±1ãŽÔH®—äI¯Ãz£íFR… R꿧ù‰´Ôö~ZB‹µü|†šïs>vŽ(B¯)ˆä<µ¢+þ‰>wÓ*>‰v»P°ÈÒÕìn݇32B‰;¾}0ñ\d3í•©Þlýöu>Ø5¹¿ å'Všµ«7ŽìòÂn@ÐŒ_÷ u,c!Üy&iÏ6I¿ÓpǾ
-I3qn»#q.¢+j¨lx¥šÏw$àmE8L/ëÄŸ4
-i}ü8c©+V\‚ØH}Hȧ¿`$¾³O4Waˆ©þ«ùůµbâbõê¿Þ™þz[›aó¬^QÅç¿o¹59ô>Ÿ%{q‡óx§òêÕ/ ìŸ)¨1£7i-ɉ<ô–Îy×`áÌ~)/B,ÔŒÄ ’$¯üÈà‡Š} Ðqƒq\­¸Ôä9XÇÊ&Y Ä~ÛÙ?FÑ«âÖ7AhnzräÍç$"wÅ:XÞ#uq^ß>\xb1Ò»Ïtá6J•ßOõ;‹ŽÉ–a¨Ûß„f {âe# zP$ü®)И'´³ýyòÓûÕn&såÚd´‘ôòh0×Qš>™ÒsA”>2Ì„8¹º—£q}ªé·Lm¯‚Ódx¯N›GQðLÚþ‡Yô2V÷«½ 1±ÅµXè*ýõ ÷q¦69+ÛÞ¥Ÿá0ë8õ¯Ü§Xî´ÏÚæs>Þ¡v5js+¹¢ˆ´Qaïe÷
-á°âÐÑÄÕ—bJŽãû—"oRc¸°€~:ƃKÚX^ªðTp—£™#›2¾&úÑj±7ÊLåzm-5?ø± %;7Ü'GÈav&³}.uƒîãÑ-ÏAmixûÞ ¢²c
-MIª\ÂuTØjGI-gýÂÓ–GâydføæÅxÃÃ,oÛ.رÌ*_ùSÕúƒóØCkëÚ™­¨·>]ÙrÿÅ:K¥ÓS%œx
-æ¨5-lçÖwŠ?v¹Í“!‰P£C´é¹2üÇ6$í.ªM¬—¿òÔöž8ü¨=Cî<:6¤Ò*À8€Ëi¾‚’¬ˆ§eœxÁ7gSL¥]ü÷MÁl϶É_LÎ[¯>7‘~KÔC¿ bÖ¡ùMÙDSG„l,Ô±ÿ…ô4¨·ÕõvOój˜ývXÚ‹>N]'#èØÌ×!óþÇ7îð*xîG™õñÌþÀ!%aóЦ_èõ\{¸®qf__ÌjävU“j3ùêEo/ž4 16ìž-AXðIŸsþã¹ßZI‚–>ÛýNA¸­s´Kp‹²ê˜"ÏGx ™?þ³Kl\jß»¬“aÒۗ샜+€uÊtC—hÇîá•
-¿n$rÝ XðD˜t ÎõÓ…”2§—n„sÞmOÆ„ ˆ;²ÃßshuåU9ñÖ&;y-sõP~K*ªÅz4rnp´}ª÷œõ)RB—+«å—>¢cI£Ž¹w× éhz€Ì\mm £MúHþ×<×|Ìï­&‰ Ÿw³s£Üë+\?VË´<=yò‹ØH»M'²ñÑ67Cøoí+A5x5½·x¯'_Ë
-c!vÜ~óÓ4¶bIpµP]ãH^ŒúÀnkLßYßÙ„æÀ,•‰)tCœrÀ‘ Çi†Ï±m$hýÈn.ÿ¶»öO¿ªWÂ[–{OFChÓ'žWùÆ*6L‡1±’g^H]u Ââa3ð¸g@—TÕL_1@d7¾ùÁ“†µ‹Œ:…‘XF.ÿ§Òfb1\ÄñSÙ£Ö®TÁIS ÒŽã{9.´ v´ôPš_$ ƒºÃ™.T€Áj”¤RÚ.zàÂiXÎ^;-”ûkwå0HMKyÃûSc-‘tkâôk'a.*bí Û¶4ŠdÇ&ž*qÉŸX‡ÒÝÓä"c°4 *+9‚3£
-cáE¢Lg%ãŸïÁó§KíÚï©=ëg‡~Q)œu‘Še7@ô`­¥¡c˜„s2¬ìe/ï´Ã÷5ØI*·[ÔrHîD4;"«hntRÉ´c¬¥ŸýÝ„u å{ÿÁØ }hë …
-¯41¶{ºQµÚâl·Pãg;‹($@QQ~:ú4¥ /麞e„¼æª't“Ê>~œÍÆTÂ={š÷ÈcW ä­ë6Å͆ÇIjË‚¶{Al ¸¸ ²œís è¹”Lª £ÈàýÞùqœöÇ=*Y€þK
+/Length 17112
+/Filter /FlateDecode
+>>
+stream
+xÚ¬¹eTœm“-Œ»kðÆÝ‚{pw×Æ¥qwwwBpwwwwn‚÷/Ïûž™9kÎùu¾ùÕ÷U»jW]µë®^½š’TI•QÄÌÁÄ\ÒÁÄÈÊÄÂPWÑT2¶µ56:È1ª8Øþš9()ÅœÍA@{qc9@ÓÜ nn
+`c°òòò"PÄ=–V
+R
+ššÛ»˜Ó,œ¶ÿ>
+üfîajîøÄ
+hjcÿOó9ÿ ™Û›ý÷úÿÊô¯ê™åU¤eµ5èÿ½Ê¨jûw¾ Y¹¸ÿ¡ôw@jžŽæ€ÿ•NSÞÁì?ÿð‰Š:x
+2¶7û;nÿiø6uuvþ«ò¿6ÀßëÿÇù_ƒonîanŠ°¾â`Êb‘ ªÃÍ™×èc… u,mT+* ¨qèõψØå­4z« ejšáûh÷\>s|?üFw4Ö‡cKÝ›f~ùЗœ¶¿ý'U'7ýQ³A)ræ¹fŒ÷Õ’Ü”‹ÆÑÞ”²ŠAÉ ÑL'»3ÜÕ#m
+‰ªV¶ý^]n?É÷oŠ üÐìæÇÕQÿÑŠ´Këñ¯0AÙ¬ŒÚ#Ûõ½ü¶Sz_“Ò¶Âæ°Â¯£Z¬4¦×âÚpj~¿H]c}jÇyŒ{ì|yz0Òä$·‘×ù³›'È úKåWµ0wïèåóä»÷ ¦¤†®ßëÓôäNg@«ÔËfR~7øX3X¯§º<†ž‡:;D݇Y‹’‡±ÇƲ ¾qv"©Î.嶱8Á[Ö†¸gÛyŽ
+‡Ø
+œQdÓžˆo¥j›*÷ú*yèõA®È›ŠØùÞ*9Ö¤û¸·ÂÃmÈŒ¿Åû ×táú9ÂÌ¿×jŒîuÊOà7¬ä'½£[»÷HsHs¢4xÅÈé ývÞh÷»&N™3ï²,ä¯òàÞ¼«»PøÛÖ……Ì\!nÊ—Iž‘Ýù™,dsa‹™2,ÉÜïéÏé›_Ôn8Zr烹ªv{ˆW1óLN¡¦‹JD¼¥"eéUMäãëj“µB‹ND·ó›^ÖåÓܦÙv‰çxD‹ú)MènÁ Œ;Õ×`xÞý¤ŒAhàI%Üú áG`¦‡SØÉň,ø,^‡QXÒ<5µ[OtÂ×{ù…Žö„F×Ï+N•W¾¤Tær U Œ€´q^¾tÆ^?Ø|%uÂŽ¯B_µ÷Åás-™^±`Ö¹Ðü|ñ.ù½„õœÏ¡-eýËÅÌ…£×ïO©èOÕRÁ]k¯þ)¿ÒÃú çøbU'þ÷˜ÀÁ±CŽÊ|Øo‹VÀ,÷QYáŽeƒTÅ€4ù`hõhÃÌ"ÎÕ
+¾•Qÿfí2FZ Ys“^É2ç1›èŒ}´x•oøLÅ~êú¼Sr6Ã,f“Å$ÖÁ~¸!’Åu£Ã¾¹fu[¨½$|8GŠ XP&k©:Ä0[gIJõ„ç)C‘ ŒÄ«é3TûÂü‘ë8‹( Ù‚.àu6s v>ñ±=ei™t„à cþ9
+ËžŸÜxªÄ®»~dÿ|°ƒÝ{ú볩P¤ˆC{TÃÂb ~3˜˜ Ô¶q-ÖTkþWBµRè1
+œ^Å}÷b"áŸÙ÷?'q ‰–Å/F?®ÊD¨%·ŽÐrm‡6ÓÃȈWw[ ØÊ.K.¼€–X¸¢¶ei—ùy¦ ÚI‰sÁÙÛ èFCëšˉ°Áº¬Âì§4{ô_ju5§qWb¡â:‚F®¹‘
+£MQùžÑéÄ›—\Jo£c ÚSAЧÏñ`K¡ˆC%oÝ«ü°¢’N½`ž¾VDÚº‘´^álmÌb'OŠ žQS‚sxCþíº7pážÄ!Jà wF‘›UíG7íoY{º³ÕãbžÕ\Û."{Š~ï!x¹Î+~SÆeT•±ZЯÆ7
+«ˆbÉ4‡\·L0<Vö†GÉ'e÷Ôß6ˆ'„ )©oè–¿aŠC!*uȨÈ9ý$JÄêpêütÏröýr–™·j«œ'“°ˆâd§Í,=~è»EÔúò#¯ùI/­r˜íÓúY«hu=}þú]%HÇ*»a4W(¾‹uó2§ÊÏ}5›z—”í»¹8NÒ7“;ðѨ
+›ˆu61j&všQÌ/‚·bénx;Á8G̾
+Xþ®qp…rÆm`‘ /Iï¨ë‚‘;ýR¨•å)’Ô`m ^f©>¬OÛÎ3[~½›ÍÄŠ
+x¯°&ù.±óh|-ö¤² K¶ÉÉ6 N¿È¿ð.·ÐøSýAH×ú¤ÅÌÞ°—‘,ŠeV®D’R¹ÏÎ_ƒ¢‡):?¨\)Ì/
+ásÆ#ûÝaØü¾C-(^Ÿ¼,•}3Ûð–VG¼:Žˆpöø ‡~fê"¡€«ËöDñqšû„\ãL={,Y6èsÓö&ÿRžéã ÎvøüÆ’ ©—2[<Â]*ŽUÍö~Fº*Äe¤A¬
+‰&$_׉<%@v©Ç1‰4~å¢få¶_±Eû´½ó*`,ÇÂÍ“)‡D7^[#¨eNÄî]›Ä|ccÌ.g‰æRuõ~êP„¨ö­þ²øwâ¯Ú ¬9ˆÆo Dà{éøk JPÔ箫¾<àØ¡{ÒŽƒ£H ˆš9Û¾>,v§ßÚˆ37ïegiZØÃÎ’~92ïc¾q`¼„¹WËmÞ/ŸªÈ"Ëùtþù¡Î T¼ 1¨3
+ŸáG®o4± ÖQÓo$øµì;ÑbV!ûykAžÔ^¶ª¡/©ƒÁ7ÙÈS÷ƒœÔdíMèSAˆ2xî^vΨÊXdºo{g@½ËZǃ¤ÃMp¦|€…¤}øí«š
+¹˜%AÇ©OOûØ+VÄ‹~{HŠ¹l…¥mß,+?(òÖÜþòHaöjZ<Dgº¢(ˆSN÷jÖI€µž„*m÷5eÉ ø;ë'{ª´äú\U·®¿nâ8¬÷Ó‘àfä
+,"õRbzR_'Ï4\ÎG-M
+ælSŒNÃ Ëù}ì3½ÿÚ»~¾-ÇÓ]–Í
+ÑÙÜôW3>Çz¶P\üõº"kw5·D
+(ÙüՅ'•±²ò±—gÊ1HðḶ Ýœœò*ãN_RÓýÈõ´Ùž®Svt¤/wpõL;AÔÑ8—šåÄx{K³íeS”Áñ9UMe›ŽˆÍ×ßÉ¥al‘Âèi×N~¾Î3±ÙpYbdÕŽðéa/å…8•H þÐeý%‚BÒØdÎö¬/~.¯mŒ“Óø5­ÝÑ„ßÓIÆk´í0ùX,ãHKKÙ©qä6ç¡•ø;~¿Éo Šœç”÷-mzË9é‹.òÕºû+Ó·œª7ÆÔ¹ D´!úÅA±´âë9œ¶a¤<Ïë­á_í°Á‚L=€@°ù¶NM¹•íô™gFNó®äìS!à{ù²gâA}*ßZ¬¾"L;¡!&{SºGÚõvÿáIt˜h<Êo`Ð W•˜÷¨º=áp¬ ]3#"ŒBŸtª”‚¥‡˜QðëÿDŸ°Xüù§—K`!6ïH©/ôyþËZ»ùc¥ÏÇÖ™„ÚÝ"ØÑ6Ølšä–ãNdn>‘W¨f4Ý…ÊðB÷=Iâ¹²ÞDŠ¡éóñL—eMåu/÷r5ÒÄØù?¶ßíž;> #ØŸ#J¬ïíýwÅ\á0NJ]þî\wL‰ËW) á«jû콪:‚ÄŒq˾t/eÖ’Ÿn…‡þàObë·¶tóÅ@Ý—†v9p%Z§ P4n¦khÛ%ý®äÇ=v±¯l8E45)ÂcŸfÕ‡³QùâïsÊ9 YbÜ„ƒlï^ë)ý—$ÕŽþ9%AÊf|(—À»‚††î^müu¹ƒŸŽC©¢p°°ð(3ïû{TªÓýᓘï,îÍÔ}»ŸÇ4¼ékv× Ð·5™\Å«ñNKå'®ÌhüMÁüúîVµü~¦@Œ1ÙYЯx¹éœI¶ä¹O¹˜ N‡6õqéà/ð¸7^–@€OÜslDåÓîjßËVS!V6U%áÇÔaDšò“£u»7Z3c‚8p€È3˜£Iº¾œˆ²#>‘¿ŒRý­Š˜–—œ-¤®ÐáZhOÑŒfuð4± wCóÀ:t²YÆ
+àé nرn¢YoIêŸ<vIS Y°ÆÒŽ5G­æå0Mö½Aˆß„«ÿ/kZâ üÂz×bAdð)9Å’6Îö‘Ðk¿Ý§Ä7#ÀjhD(ÅêùÒÓ|[Cªé¶w€áàrÏxéÈsCptE’÷$eŸ‘ƒcö2o¬ÝœSaTS¹/]v¶Ag`æÆ¡¦Á§GlÀ¢?væͶuŽ+¨Î_¸¤ k1¡v=œ°úš§¼›:ܵÍ2¯·^&,ˆ(:˜Kw²´.Ðf‚fr:=P]_ðµW2Vƒ4‹"úCñSðåÙâ­°¬Ø «õÏR ,{zvþÉ ûÕ™€”{uuVœ¬už‡ìNŸûâˆl,
+_… Q×G×züù²žxZ5„3&° S&áŠT›D«HÎÓMn@gl"º7÷qÔEÔÓÔ´´¥!e†j³7·_ßÛ*
+«4èÑ?jú9‘`¸âQ[è)µF¬j,>.¡ÿžByù˜únŸ‚)L©uwŽ6 f
+(ëI0r/*•6#ˆ,º¨YCYæɧàIfðcWζ{À`Œ" ίí+¸6¶qÔ…Æ*zcÑêZ ô,
+keFüŸÒù
+d§'¬ö ¬Âõ=¹»+¢Ûžß›-°6Ç´mQ@hbQîÀ@¾<˜õJšBHçJÑ#ëµmVi¸×0®*YEáœ
+ÒÇ™¼ïw±w9=rž„%É÷¿´á …ˆÛaçE„Ì|ÔÝîÄOÜå!ƒî8$á[¢ôbIe©93«•ìƒUëÔ8Ÿà% !U ÒRÓAšx®PöÔ™JØkóÇ×ng"¼Ð+7tF|…;þí|PvùçÆg/CD?Aæ`CFF9€”’Ò󮋇ùã9#H…Kà{p”¦§ó×XzƒÐhÃƧ ×´;{ØÉ…OÅY“óç"÷
+ãÊÅF_ÕXƒÖw_¡ØKèJVDËXcïEhÛ‹Ô— –ÙR¡pŠÔ€V§éêÆÎ~'%œjeö¯´!ç˜ö: cf f(æ’"äËèÁØ\ûÖôùiÁ<„îvÔÏ:¥•F²,ÎÒ$£ÞzvbsÓÚqÂQ V-/°í-2vŃäƒHì£ ß¬«&ÍÀµÓ©ê^; çÞÇóó~ì/ŒŸ ðþh¿ÂÞ Á†ž^tW÷´]þ¿À·Õw2tIW1‹*íàNk-ûÈȯÃîoÕ8çâ•<ÿfZÑÛu1¤u“&LÑßÂZ*4|Qdù ˆêó½ë½Sý0z'D%4•cŠHÆ#Gmqu ÜFu7â¨pq³ì~zS•>¦…¶˜¢¥‡EíØ^þ®Hj×-Þˆ-11e ±%ɾYö^‰Á†ÚÍÝïx௰éý"ûcÑ®žêön=F8^£GônW?&L1wñWþ“—¾Í؆ŸÏêÆ€#§R·¼ÚR룸þæ
+EÚªVMo·Œ$yg@;”¦ñ4] „逵PØWJ]¥0îNÚ”}0ý?ÜwüÄ
+"¯RÊ*×Qú(­À4ö³)FO›’ ‚äêàþ(ÇÀN-ÅBÁÚc·}2«Õëé¢~ÒR¯ÛûÇDã]ÛÁ›75ÑâÛ?}’^¸Ã/T89B"j':up·ýÁÀËuŠwX¨ôN,[œZÕz¡jð^[éÐÒÊB¬ ?ùéˆ&µ_8èè¯\¿T~+¯þzF¹­õ ã+¹6sÕétäïøë÷’ç6é¢MLqý/V‰{k˜ÖtᎭ 5Â3r;þªOé‹-ò°Yüeå‰4Š\uÔ®¾O½ÜlMÀ¢€rº%bABõ΢8ò1âGÝð+kLiyûƒ7õ;3»à%h#üï[)ÍápµÄsÙHObgÐô»ÑŽ¹?§Çe×ĵ{ ì«þ&ÄqKZÖ¦ ¿ðÒ;qÛª47·‘)<´ 2‰Ç-Ò¸6,éó}›‰Êá]Â?…®ù6Çœb„5ÂxÀ ž^èvíÙœþÉ ã…~È’Õ*Epב~솳ŸP§Í!ðœÚ ^*ŽÒ¹\ÝMÙàvu¸2ÈL].ÍàE´”NDJösö–êä*\Ðqeùšß±œ²ƒ¯êrýrxÍ!¸ï%ծΟÖòÄͱœ·qšZ%ªæé»V7äÌ¿%þ_ÿVš*Ý\„ÊÒ$ǬÇ™Va ÖÃVáÙàYú#gXõÜ¿Œ²ÕÞ·èêµÁ),|d œ¢Û¶†ñ;îìSJh"¬t§?ßyiKYLÚ´pØŠG?'â{âÁ:ì&~&¨*Ir‰OŽŠÜô«þaÀäOÀÝ 0ØÔ››Uñ@t°'Âÿ}û¨ÃšA0IùúL{—p.ðZ¦{xyYOÛ–©Äï´+Ü sHuOŒ¨ÎU G£–@¬Èo`ñý"qà‘±îø•¢†>MÅ€žQg¯¦ün(Nß_äz[ òô:ÕK œ­²S—|vîc50ð>rá*˜RLZr§±æ¨F÷ÓËÅRè¯%ùdÏÌnw°GAš¤’€\êÌp½{ë;îÿ©£1ö§¤Z…(Œ£ŸâÓlXzøÓ£g®éË7âE–$M@òŠŒ!‘ø„~!Óm¡.YAuõdOÉP)$0+17`´¦>‹Sºšà`Ù|ÃùõZ+iÌ%‰Õ-Ž­Lf„1®Á]L?ç©Žý²ødµ§jÄaš›ý ’«+}W¸½C…÷ .ìñHÖ¯b sú =l!î‚0Q­ %— ̤¥¥®.©Q0cÑ…2¡ùÄr*Û>ŸÙ8ðrõÜôÎGùÓ%'§Â5æ+)Éñ;wF$ö’/=Ô=†1Ñ¡*^À½”»ÑœäJû¢œ%uÅ,ºs+§ItO¸’ýôí^êÓqVÆ/õø­˜¸èc è¬æ²ao¼¸=¦ªò^y#et…Ëõêj‡sKÆÝ{%&é³ ˜P ÅFU1ÂäÿÈ8Lˇ™§”ÁW‚e¾Sî3_×ÐR…%«~Þ¶‡ª­R¹¼0Ö¡|!GZ¬7™D¡ÂmlÉ« û¬ÅÚ›å'û!ªXÌ Æ¥Ð‡Ÿ$Ûn¬ßi¶cNÖT{·d­ìD§Xw¿§ÄšU ~pÌßíÛ/“8
+—[«R^i52)úIí 8Ž?œðí•(Hù%‚¶§q‹©[&H…U½3È’PǃjÞX¡(ìÁõJ[Ú(y4\9{1¯€kÒ‰X)×'Ùʱiüƒ²{æxŠH.ž?–… Ý®CÚS‹|¦iŸÎ+—^Pcª(¿œ($&:W§||RÏä|ó­„Ñgx^­ˆI4¿,]…ѧ <‘å ãÜ5u@܉Ü Š4
+î~%³€8Áj·ÌÓ¥í©ªf‰¾„ö§Ï‰óçô$zƒ1Ž¤PP9*'+p9øx3T.Œh“öJ™¿Âõæbo¸ó¾4¯íò¯ý ~µbàÜÄÆÅëº
+ÅïBú¦·bF3‘¿Rm«v—¾NhŽµŸSs-©®Ø Vû$ß±:ÆMÏÇa£é¬¥Òžwu¸`†>I2"m)pŸ†¬)LJ-sE¤wBÆ\ûàx¼uÁ ìàà)†ý®?w-þÄÛóS*‡Û×wün>òîº佇1©úìIn\@Áû‚#–ÊI£óþmü€Êå^MåQ5Û†ì+fÌÉ)sm%$¥®2AÁ*r¾¯i`ƒÿë÷/Éf×(’eŽpý
+’EbŠøÒò÷³órrx¿Ùî…Ía"”æ$çÆ:O[½D—ÏMmî”ó¯åŽŒlº7›ßÔÁ¬„dp‰e=ãvÏA6ä“Ûc4ªÙ ž)ÊÏÓŒMëU—)Å#ãùp¥)~Ø߇gºte © wuÃ^-Ù†œ3m6vxÐ.ú»Cd&ÏÌ ]ˆ
+%"ë»­µ 4-ÎøYmº¬<ÄÕàÈVTøEʦl'‡U3ž,3îÔ€K6:á…Á ز0ÒöuXêçùpƒ$ó¶žÅûšR™=?ì¿3OZ0œ‡‹œ$%fÅ5•.," ÅÕIKfL&Ýd«ÒÛ¶
+Ò*Ñz>~|åÄ!á“;Tÿ¼°wc8Â
+Ÿ(*mBÊp‘77cq²¯„#eµˆ½eñ”æ¦KN84e
+þ&mÕõ­1Û™P·£SÓ<òÊVµ}÷Zê§@ÞMë€<€¬åË&ûqÝA_ÁXRz½–¬X;w3ª¹BË?#,d?¥®‹#{œhï1»D‰LÄшÔ]Lª0‹G€~8îK‹žo H]¤äë®ü²þ“’Bö¾w€Ö:8Y2Ÿo¸È£Ç}ÜÕV%$Á½ôK”t³ 15^@$N5k›¿W²àéîJXɺÝh‡ŒqÇ^èð ^—ÛÁîHú¸5<ºL~_ÜOùoÝ#ãP ÷C(oqZo~„Øq}·wy™søÈ
+Îs!V •ãrMLñ<'šP¾ÔŸ@¸WYÒ‘wçÿò¾Òç–Ö–V.wÚº7qËw ¾y2obW}ËÐë£ ~W·Àg¸sbj„ȳBMt èi(\­ùê“í&×ÙzzÁð4#C®­x@åHCK‚[ÐÚ¤[Þ#Ç©rÖ{°“ÈÕ84S’cmáË“áôÚ¤È*§6MM*sËY$:_Îñ¤C“Ø“›Ó¬ªc¾ìi'õs1z³vØhæ:¬—µ¼ÙùÆLå†Ò–³i]¨W@†–M˶ڧ‰I܉U¡€G‡•
+ª'>Ûf4C¸MvtrZnàyTÉZÕ$KËýaGåEìÝ¿krÀ‡~fµŽúî„ÙGé¦éåGa5ÜÓ1ƒÌZ[\ U¶…\Ðר·ü¥ÀæêÛ‚Rèmà>ñº4ëµ÷VyG~ü½m4ø0QÍÏ<5&6,Å*Ô" €öºàÏ`]M$¥¹¼$ûË«>Sîy
+i¢§£ !㺲”ÐÙmPžY1áÈU—¬h…øƒß'p¿X²0«Åû×N¿”UVÀzÔvƒÜšýâ„å®ðÕæjæ–Ä9Þr`òٷ…Zî¢ôÃ5†Q¯„ÿÖež&Zç:€âÜ3ùO7î•r+B«(ô]gþÒ¦ÈÑH=Fˆez u±!DÓÆQfl³C%q§Kõ¯ÏÖZ®^®¹Nˆ;–¤ßÀ¨ZÕS¡…ÄñÎ_\‘닼‹óDo®Fø>¦R°ÝÍj‘~É÷¯[÷oìÄæò n?[Œá)m’@©—‘Œ1´bÖ9Í­n8-MŠÝšá_jÂå­êÀ:BÝ{8J4 4q†ea: ý>F‘-¼ªø¬Oð…àŽóMA1bÒvBŽ0{«i~n"É(ãUeAqò`Z(سRl8ì|–½v:øŸ”‚'Š’^ÄÏlÇ7…·}¡…4íKœç:©ú,X…¥­­¡bt‡~Wî¥öÕcE«ÃÝS‹†=@å ´Ê×æåóÞ=hj3áRe*ý¸
+Cà ê8ÎÉ]Özá·}6ù\ø*ø1B%[3DŽG
+ŸH¡ó5q¤Ã·i±‚”p³×S“š¡¬p£“ ¿ EûÙc¡ó,ßlÁ5Á²È¬íŽÏl©-fͿ궘SOpø¼5Sy˃øú¶(û
+.3Ÿ– §ï¢Uí,?H-ýÖÒzÆ¥¨>#uQ4ŸÕÃJE,°NN•SONãó‚©;0ãb°^‰Uåª<& ²Nåð I[•Æ«çº´ÉQì\ïåºÞïñ8+ìNH‰\¶¥S‰)½0@ÌJ,yßÙ ?3FçÐi®“©
+X%Ž…¾‡¸ÝëÄìk|ßâðmbØ|¶®¶LïÄì†Ùû¸ä¡›¿å4žUt§Í-Ú'ÏxñwÓƒhÜ£¬N¦ú€·$:–©<©?æÌ"7{•åQιv – YRÀ¯Téœ'Ob­²)7_ùÖÊ$ùÐGDËky—Ý·¢ÉŠ†Ý¡í¸ sx¸ ìqŽ#cßê©Ê±•góf©õÏ)mé¼³_«´`—¦„j?ùÁ“³Û)„„)F'ÏÔJL%%›«Éw‚¦¤‰¡g¸ ¢̪Bé±¢W>"BYÉ:VS=e=X|ùÁ±¨Þw ö¼Ž”ò°=èäÚD¢z*•(J":“–ÝæÜ\ÒËâ¦òUàñ+º¡îîñ,XbAeL¼Ásg]ÔPŠûÕ!‘I´+SdDÞÀð®¼b–ŠÇêqüÆŽ·ß0º¯¬÷Y®M»®¡J±˜|‡à6RBÃðšÍØøæU÷¹¨E— 9Ò­êÿ„l™– ÅÚÎÔƒ™­GÝê™ "âX[zq3H³Üé[‹ãq»©¦-ÚÞ,ÈŒ3:I{r¼â:Ü?#©+²÷%g² X6F~“K0'Òöé½0r=ŸËH“¢“éÞiŒúR7a´Böj»å¸’CêOm‹FE „m&V”'TKõœ
+
+¿*,‰Hç[`öR{w…ÝƸ5¹¾ŠÇŸÉz¼ÃWDgãX°+>BÃ]‹BámƒéIÜ_<©œ+V§UžÌGT Æ‚(ø‡Þv9N{ Óü
+Óúš"ýSz×âת 2\Ö´ÝõØŽHhKÌ´¥sšùíio=¶ïÇ·‡¾Ü⪧–AL!¾ëø ãt¾tblkMÀé¹7AÑ|e·šáfa$|”?²Å0ËvœÁ×°(Õ‚î)=í†þ ±T1ß<” î³ PÔÚƒÞzçäu™»Óƶ»]÷so›w~ª°äƒ]ÛG…,¡ñó!XúÆ‘ŽÝo-*d~}áóÖö2 §Cv¿*ìiëÕÎøˆIXrg]é‡ ³Yèîã`"ùÞW×·sÔ¿A^nÒÕùIÖÇZˆ‹ÕúMºpnc1à€ôC…M¯³ùmlU”Ø—Xz ­ìS;ÒÁ’½yXžMÈð›’]h|¹ ˆü¬a^6ÕévH£ÊšÈØDuöGÑwdp7™õñàéÖd“ó?¢Ñ>;ô¥:žu ôÍáS>3ÞÒ÷“ÉU·ák&½þ½e|‘ÝÛZuFÒ0  ¬±üÕ¸¢
+iÑ$Œ.ÞoŠárò"~ÖùôÕ³zUF•=GÉÝ©‚~éRÜ×h4ÖÀeiâw±žRü/dRÁŒTkÍ#wƒ0&§šžh,Gë±Ãñ°`¿pLsî'úm¯=±çɱe—~–¯#\‡zó,ªÊÃã•ì9»^Bü¹“ÿC=u°cDk þD8œ/'V¶4¥? a¶d»Ø\ñQ­mÓõ:F,ÇÇÔ²\ñÎ<šr9oâ\è‰ñÓ­b]Å»¦f;Uˆ#e2S> xV¥˜ÃŽ­ˆ†ê§—jŠP™­¸¡.!‘#È÷©voÔ`ÒSº’ûþž}°S
+T S!õ\¶ZãÒJ)¡#¢:sÌæÀŽ_îR·è¢#Ô¦Bò
+êOqÚô¡9U¤ $Ö=6Ððü|Hò‹°s%nS,{¨üˆ&õÊ’—8$²cå’6¿p[Žx7íj£\k@?®ð¶ "Ü<4s=3Ña½BÚ_Z¼–âç0h^×IÓ¡gÀDFÌû"O,v}V%t ïæûüH¦¼¯¸Êi¹ò¢Œ
+Vº<3ÿiúü`+zв±ƒõ¤âBy¿e5m¨á^[ÄyaS©aŠ€()ÞŸíÆÜ=7w3ÔV³Md& ðÑÈå’½Teöä´þe¢QŽh¬õ äØîαÿ”øg´>»6¹”¼g´(>\PóÔkºßo†‘vÝ8‹¥‡HZR¯±˜(rÔs•Ì7R¶s×»LíªøŠæüz!ÁÈ U[–Õ²69§QŽƒ.[¿’6çÏhüS—Wse®÷±dßbfïyîI‡dÁFbNþ%ÕgÔÆGœ¢,bœrü(šÙÂ%+'‹ Òl£g"îuªrC`Wro¦1€5ÇCÈ…çpû¶šÍÄ]sG¹ÑOnäàrqœìZI=…M}…)äCQÊ~ ê!µŸ¾Dz9·%eÞ!­û©ÆÁ”,Ý,>׿¿âb‰lGûrs RøV0' uV·ƒÔ) É ²;^%!#úㆹå"à÷È“µ‚i4Í p#Öo·¤_Œä%±!¥Óæ`…(`¢ix¸ü={Pìr {[£3þÝɶ*\ÔvµvÈÆe~0{zŠJ"É®Ñc
+µÄÀ‹í_~ …U¢÷íýwõœÅ6o¸JÚè¨OÊÿ7E®Õ?ÿm]~»úàD¾?œñŽ¹,à¾$ôƒc2‹™‹ãé¸æß‹M|&ìšp{³×Ó\Ì «e •Œ¤·Æý:®s”CrªÞr±[G^…_x[´?ÒØæå'®Öܬž ¥Škv5‰GlŸ뽺>QÄè5ó†…¼~šÒÙŽÝ  ÙvnÂ|*ÑÐaòÝ¥ÉÿÞ^á=tønÚÖ•_ÎïxPðdòùCß•b­RæwWbgÖJ?~årοþC¬[BýädƯ{ñ h§úÍwÓ‰Ï'}2~Ñ]Ø6å°âÙŒ9û ²&ÜÔîNÖñûö¡î±`luî‹)G2O=ßùEßCùä”Õùù[
+¹ÓÏ™wŸ˜sìÇÆâ@•»¯M·åöMXvºóEÿÿu9~Û¤k²¹¶…ê¼ ª?yÉg“º”òÌÜ{ç;OÛ«YŸ$3iÕæ#ÛÏn•8²oväóŽ7¯ã}ËÏëÕýÜá?÷þ¹ësÿ„æÕäÈ©Ù÷pö.Õ`¹fýO©a›K<­ÛNîêè=|ˆuÖïD©â¹µßýÝ^Ú(šDªM?T¹CÂxÝ;)ñ´g¥ÙENÓ/Û¾}õ%×ÊÛJ®Q†…É9©‰E%ù¹‰EÙ\
endobj
-802 0 obj <<
+1018 0 obj <<
/Type /Font
/Subtype /Type1
-/Encoding 2140 0 R
-/FirstChar 40
+/Encoding 2705 0 R
+/FirstChar 35
/LastChar 90
-/Widths 2153 0 R
-/BaseFont /XYWDPB+URWPalladioL-Roma-Slant_167
-/FontDescriptor 800 0 R
+/Widths 2718 0 R
+/BaseFont /MRHKYV+URWPalladioL-Roma-Slant_167
+/FontDescriptor 1016 0 R
>> endobj
-800 0 obj <<
+1016 0 obj <<
/Ascent 715
/CapHeight 680
/Descent -282
-/FontName /XYWDPB+URWPalladioL-Roma-Slant_167
+/FontName /MRHKYV+URWPalladioL-Roma-Slant_167
/ItalicAngle -9
/StemV 84
/XHeight 469
/FontBBox [-166 -283 1021 943]
/Flags 4
-/CharSet (/parenleft/parenright/hyphen/period/zero/one/two/three/four/five/six/seven/eight/nine/A/B/C/D/E/F/G/H/I/K/L/M/N/O/P/Q/R/S/T/U/V/X/Y/Z)
-/FontFile 801 0 R
+/CharSet (/numbersign/parenleft/parenright/comma/hyphen/period/zero/one/two/three/four/five/six/seven/eight/nine/A/B/C/D/E/F/G/H/I/J/K/L/M/N/O/P/Q/R/S/T/U/V/X/Y/Z)
+/FontFile 1017 0 R
>> endobj
-2153 0 obj
-[333 333 0 0 0 333 250 0 500 500 500 500 500 500 500 500 500 500 0 0 0 0 0 0 0 778 611 709 774 611 556 763 832 337 0 726 611 946 831 786 604 786 668 525 613 778 722 0 667 667 667 ]
+2718 0 obj
+[500 0 0 0 0 333 333 0 0 250 333 250 0 500 500 500 500 500 500 500 500 500 500 0 0 0 0 0 0 0 778 611 709 774 611 556 763 832 337 333 726 611 946 831 786 604 786 668 525 613 778 722 0 667 667 667 ]
endobj
-739 0 obj <<
+955 0 obj <<
/Length1 862
/Length2 1251
/Length3 532
@@ -11417,889 +14029,1331 @@ endobj
>>
stream
xÚíUkTgnõJÀ+Å€€¸
-æ2@ Š,Ë%€
-‚T†dBI& (—
-A@0¨P¹TZ)­`åb°¢àY#BAn¬\uÝôØ¥?wíÙ™?ó>Ïó½ß3Ïûó™™0½ Nl$vA„bHi€³›÷a €D2ÎÌÌ…!1îÄ0
-…•çˆSË=•ò˜>{~½Gz“¿ô©qªiŠÙóVïréLZ¬aôo·Â4ñwSÇ2Šg¾öÐÂ5ӯܑ'ÝP’2ã÷6»µ=²æ¾ÚÜfå.û$˜<h½êÒH­A{ÈヿT)oTš›Ëb_”C¡5¹Æ{žF…_¿sî >#†øeõéÃÏJëåÚÝõz î®{½Î™/ µÜ;4Ò(n’«³²Zî‰1~xܦ£ûÎÞÒGñ‚t ¾ûÚ3 —á¹¼ÖÈh<~=Œ¢e*ë²32ÿêÐ+Æêòµ¢‹M¢’Kñc‰´þc`ÕÍÎ.ðj<ãHN,c’‘¦—|-Æ‘ãí«,›7ÊêôzjÎÊä}:Æšýʬ(=…‰¬RÈãœÑžÍLÏ`¸{ú~©w¤9/)À#à¹ZÝ÷¢âYrvÇØ–„1u2ãDëËÁ «)Ѹ·6íRW©oŠ¡y$|©ÁÑf¦@Ó©üìzCä´ß¤û^<ÐÅ-LÎæFM¥žû‡é˸Áß'¿ßXBø)ÚrhB¹µ/{&nÄÍàd÷¹Ò£Î¡ºÌØ„Øk?n—ÔsDeIíÊ5Oñ7­;ýö= ‡Çe 3ajèz”Ë®8h'$Ô\×-”…ÌîЉМV*¦…­FÔO™àšÞ­;öL~¬}¹ÀkäÔŽŸÔKIëw5ئ«nz“yèy]?÷“пéÎúª_…çÍVWyÈúä—qæ7Jüþ—¡ÒÉðõù×nɯɉ.„Ö‰Öþ[E¶Tű‡“Êë•7Æ$ 7Ìe$åmÊÁ„3YlÿÒ<Ÿ‹?ª="YWT«š{êæSE aÐ=EÕ§´y”óÌe¼Âa²²ÔŸö¹÷¾_ã¨bÎI§?Ez“ØýB£®UjTæC¯J™š.Ñj}³•™Õ>ä1¨'›³²¤Sª×Hö5€4ûÝý†;öpæ.ü&µoY7î£HŒ¶×ñ
-ntÆY~¬óôç»Í»_sóŸ׈N‘Ññ‰ëüï«V©Ô§Âh÷åcĺ´ ¿ºï*T¦$ÏGlɺÞX±ëP£Ù»å¡Ýñ ³M¯-TßfV1MW÷-”TômÃÅê‚Hâíenáú„Qkâ󢄆ŽpæÀ\—$§!7!Ç]~%Šœù¤)ömµÑ)Ç÷D_uo€£ŒÚjîü5ÕñX׺™»÷àÔúBÙ˜«jU´fŸîÝN—²QÝÖ…Zöî–Û£Ž!CN×´$Aü6ÍŸd~M ÁÏ'/]sÆfC"b’“0Þ]°]ßp]¶Ñ^‡ïkšÇ?¡>œÝê9h;>•MsÊo:Â(žGŸ7ùñ›¨£ªÿµá£¿ôµè«êꎞîìJö‰u5k—¦œQNmÜÙÞM8±+Ûã1ãdß~ºëþ9¹Öê¤òXvGH½ wXÒ“í¥Ñ+㬠ìÍ­à| CþÜÿüO4À®n# Åý ¥]þjendstream
+æ2@ ŠMË© É„’ L P. (‚€`P¡r¨´RZ/ÀËÅÄŠ‚g¹iL@°rÕtÐc—þÜýµggþÌû<Ï÷~Ï<ïwÎgfâéCpb!Á° "@"HœÝ|d
+å†pD€…óg‹";À‰£\&$
+B
+Õ€PŠÂa'«¨@ p,XÀÌ1‰(@DØ
+¬Åez@.¯52[‡_§h™J»ìŒÌ¿ò}ÅX]±VXj±IXz)a,‰Ö ¬¾ÙÙ>PgÉcL2ÒõòB®%Â8r‚}µeËFi½^OíY©¬OÇX³_™­§0‘V‰‚¸ì3Ú³Y™žî^þ_jÄiÉOô|®V÷½¨|VŽœÝ1¶%qÌOÂ8!98a5%÷Ѧ]ê*óO54‚/5:ÚÌj:Uœ]¯b(Üö›tÿ‹º8E)9œè©´sÿ0}?øûä÷‹C ?ÅXMh ·öçÌĸœ,ç<WzÔ;Ô”›{íÇí’{B#qŽ¨4¹]¹æ)þ¦uPçáý(ÆñÙG#ÆL<5t=*¤W´ùjŽëÊBVwØDXî?«Ó¹õSÏLpMïÖ{&?Ö¾\è=rjÇOjŠ¥Xþ]íVЃ隃›Þdù>ï ëç}ö7ÝYõ«ˆüù£Ãêã*iŸì2îÂ&Éüßÿ2T6±¾àÚ-Ù5Ñ… Ÿ÷ß*¶¥*Ž=œT^¯º1&n¼é`.%)oS&žÉf”åû]üQíż¢²x\ÝÜÔS?Ÿ4(\‡î)ª?¥Í£ìg.ã•“Ue´Ï}öÿO±O:½øû)Ò›¤îõr‰Q¹½:ujºTKþf«gvûÇ žtÎÊ’N©Y#ÞßB
+§Ý—VŽë‹Ò/ü꾫H™š2¹¥`èzSå.ß|F‹OëC»ãf›_%Y¨¾Íªö4]m\Ò·PZз —¨ >"‰¶—¸EèFỉϋ;"<æºÄ¹y‰¹î²+Ñä¬'eH‰¿ÜF§_ÒsYؽŽ6j«m ¼ó×4Çc]ëfîÞƒÓŠ¤c®ªU1š}ºw;]ÊGuå u¬Ý­·GC‡œ®i‰ƒymš?/H7‚„Ã~ùš36’“ÜŒÀñîÂíú†ërŒö‘ؼ
endobj
-740 0 obj <<
+956 0 obj <<
/Type /Font
/Subtype /Type1
-/Encoding 2154 0 R
+/Encoding 2719 0 R
/FirstChar 13
/LastChar 110
-/Widths 2155 0 R
-/BaseFont /JMBPRZ+CMSY10
-/FontDescriptor 738 0 R
+/Widths 2720 0 R
+/BaseFont /VXRNEQ+CMSY10
+/FontDescriptor 954 0 R
>> endobj
-738 0 obj <<
+954 0 obj <<
/Ascent 750
/CapHeight 683
/Descent -194
-/FontName /JMBPRZ+CMSY10
+/FontName /VXRNEQ+CMSY10
/ItalicAngle -14.035
/StemV 85
/XHeight 431
/FontBBox [-29 -960 1116 775]
/Flags 4
/CharSet (/circlecopyrt/bullet/braceleft/braceright/bar/backslash)
-/FontFile 739 0 R
+/FontFile 955 0 R
>> endobj
-2155 0 obj
+2720 0 obj
[1000 0 500 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 500 500 0 0 278 0 0 0 500 ]
endobj
-2154 0 obj <<
+2719 0 obj <<
/Type /Encoding
/Differences [ 0 /.notdef 13/circlecopyrt 14/.notdef 15/bullet 16/.notdef 102/braceleft/braceright 104/.notdef 106/bar 107/.notdef 110/backslash 111/.notdef]
>> endobj
-736 0 obj <<
+952 0 obj <<
/Length1 1616
-/Length2 25334
+/Length2 25435
/Length3 532
-/Length 26225
-/Filter /FlateDecode
->>
-stream
-xÚ¬ºc”¤]°%\]î²,Û¶mÛvuÙ¶mÛ¶m£ËU]¶í¯ß÷Î;ëÎüšo~äZωˆ³cGìsb­'3Iä•hŒí MDílhhé9*ŠjòÖÖÆvÒ4Šv6€¿f(!' ;[a'N€š‰1@ØÄÀÈ`ààà€"ÙÙ»;X˜™;ÈÿbPPQQÿ—埀¡ûzþît´0³þ}p1±¶³·1±uú ñ½QÉÄàdn0µ°6ÉÉkHÈŠÈÅdU
-üPˆŸìá|ŒRbQ»š€ê
-ÏÎIOžŸÈ†ÆGG†{oÁú°©rb’p¹€Â’FúýÊÁæÓT©©jUmÛëÕb3ô]ÿ””sÂ
-Îl~^õ­H¹²çŸÈôÿbاÑÙ®ï岞ÒæNHÙ ™C ½‰h1R^iC«ÙÂ{»AùÖˆqwÛÁxyÒWcÁ·ÿ¡y÷'‡—ÁOéTñ´šŸ­wôêuòÓsPMTUËçýNÀ(5±†ÅÄ ö¶‘ÛMüc,‚¨×]EI[™Y… ¸îˆ0^ ÆMÏm}™× Ë 3ž@óÉ ª0öGƺ°>KÛyE‡“åÜTh6þÁØŸøÐJ¢w¢§æ_[c ³öB8xÕ¾Vk”Ô‚—I¯¿ä„÷gÞk‰òŒ+(}‘²Å+åýdä„P9Œ,U•äD¡&w("Z·´U¾D£|yÛ)Õ‚þ0ŽÖ)¹` Á6l¬NÒµ½žŒÍ&²˜ W
-€gÍý¬ÌV” C†û3æèºnMp»-˜…Z‘˜æj¤¯gÜ\}–ʈ}—}ÍšP«¤{}ò#U/ÉXÑ…€¼ðk¬¾ëÜV­Ð<´eÁºµýt.<Á0œ7Íw©~‹A“1²Ù°¢%îßD?âÝjÑä¤[,È4ý©
-ÔI™Èüíç‘,ª!Û^ó&I|ú,~C¼ð O¯JëŽs/)'UgL—æªöÛ'ŒŸKnõætÉËÁ!;ÙÜ\õýâÚõþ#ˆ%æÈMµB”j!ˆªÎŒ o¢†PU&ø’¿ß¹PÃ$Þ;Ž‘»w©*t!Šꌄ|Õj”1íw-¡LÕÙ—›ö‚ߎ…>ßË>#ÈQƒ›a"¦´Ú×5ù“97Û
-Ïþu¿^ù5cÔÃ[î˜4mô–CÌb^Ûe m¦Ýìž88ç}gõi.Ó 6Û²¡{ÇÙº[·:±’‚~s¼r^®µ{×y"j¾À`UŠ2f5?+ún ¸ ¼â@œî׿…@“%5£shàî‚Œš¶{++¬#ÂЙH¼GH–T l™!Ñ+PH­ÞPË9­«·Ä[ZYIçi\eyr*–¨Ö{Gnðx*yçK ’„èD2JG«L¸Vä±èG6<… †Žçð9‡X¹;‹X‡ã$]Hñ8ÇR™¿}t%بêŸZ¥
-´êÄÐÓ
-Þkvßèåà?`Hdò8Ÿáz„û%u•$õAºu™\<bxÂ0×í°–h¹ÚU\£ÑÈÖ{¥ß\«E²È²æx,3wר•Ù.$UÚr¸kÀrJ“»Ü$œ)»
-'Þõ¹TÒktÊ1 ÊYµœóý–,‚Å w†Åáù.Ûå•OسÐ-Ž^ö}ÃÊÔ§4¼°…ï¿•U;hŒIv@™È8Too?â.i¾NFNû²O *¿‹Ÿ9áäu7é8ã›
-|V뛚¢”ø±W’\úyëªb™=)ÎþWà öûI¢¥Í|ûBŸx§/i¾Úæ3“"¬ì!óYº&4«?©eL:ˆ˜¨^lHëž|´XÁSº)7x}:Z=n¸Ö‚žäQÊü˜‚>›+Gr*|wݨWÔÐæ>zuÚÐÜHq…ȃŠ0?‰Ù“]¢¨=+ûfUˆb9TV¶54ç,Te5®Åj
-–€íÖ—ݯUÛˆ¢¿ß$»Zµg-SÃ]‚.(#º™‡`¿ Ât´Üæ 6¿mà¯ò™9M}§’ˆù'WÃÙð´£ÜNæÜ‚é§$# ÁIÀq¯¹
-ýl…;œë‚$#¥Rј'ûBYâSö JLj N·—“\ð“ë¨zå0y¥~Сª{úë#Òsa¢¸²ÆfÙà´ñéöªðc~ßâ} ]˜ V42lï
-T ›+=Ý"N¸F{VwÜ«Ýê'O¼o3Mk¹‘)& Y)‘-ÍÇaÊgþÆ®
-˜r ]w9jr‡šØ[O§ÎéåMÍÏÞ@Í?éÀ0ÕíµDJF„rFhS[ͺ.ÆŠz¤9dR’XL
-fÎ$Ë\nÞq94e#q0r±MnJïù» 1ç5Gö>
-ª *Aº\Õ@^¿>V1Ö†ÑîçhµäÀɱ~°ìj-ýflâÉL8D¼ÈV©§p¤‡Ekc4²îþÝc=´BªÔ"–¹² + „›šíwp ‹ÚjOI­{4°ؘ…‹VxáOR¡®TÈGA ì³+ ®À©„”À3ã×ËbÀõøϬ¸»eéj .5ß?.4?‚w1¤ÉÙ,ðà_–yC Qöê¶9›«¾_¼­pJ-G¥™Ñx¨^ð5xŽ“L¼<k -Ÿ>ðh¼D°A€'áO¶0„0²8t³˜¡hÀ~AÛ{ˆ&î)'`Gï^¦‰m ½\‹HBõoW"Þ<y]7}rÈ“!Vý, U4.Ð"‹¹ Üw9… ÆžîôÀjìS›•ó™…)å’æøUOí›|XÚr
-j«ˆ•Úý¶”À´.u-EaAB´=?`Š)/ æúÂÆ=šöÌé×K¼xX¯·ÎŸÙ5½È}áÍŠ•ÛìŸZñf6nŸÛ2£‚õ¥­¥gÕv/ð^€ ax e¦÷Êcé…|Q*íÎÅ>t.Äñ˜êò[Ê&G>¬šX>­|¶F‹ÿF9ÈG:
-}ˆÀu‰‡FëOðѾÒ`g!ë˶’Si™Ûs„×dŒìΈ”’G‹ŒÒ÷¤úPXŸ‘ÊX*òp¾š£µô†;pšX ¯»Õ䄾ÐÐÅ·.ÊÆ™³õK· ó§r±çÌg<¢åûœs§0œRÁãýËdò3‹Lqø%$ØDë=+¶X—¥ˆÚHï´m%¾”+pÔg­2œÐSíÛ&ÛÆ’ú
-ˆ!Ýkk»†“×ÉÇ.¾á®ì6Ëq_6…áNÝ«—6™T¶Sµ–F¦›–‰0;4Kÿ½26aþ2+Ai};bŸÀ‰ŒIu)I£YÅï“y¨)õ‹—­VïEeõ–œ+e"ÑèËF ÏèwéV¹Õ> ^;"ZÀÌ}¯å®I„
-ÚŒW?ð9ÉšjgÄO¤¨Ê£%Oy-¨Ê¾ÆÃt­ŠÉ2¶”êy (6eÅF~!²×9ÞÕ=¨NdÔ_Èí]Þ[‰+£øþþ>»`.‡`ÔŠk™½¼CæêU¬ùôÃÅN²3Ë
-Ú¬wî‘ê"¹¼|=’4v§Ù:¬)ÈÝ%¿Ÿë°yÔÅ)aÆÃ=Ax•qÊ8úçUûƒòM[iñÊŽBËE7ø·džŒ¿_SMé)7ç \=aY„2Ǹ,DôÝØÌ¿ðÿtöÒãž¿â K‚7Ö–ªëÏ«wV÷ž®a@¡ §¶¦Û£;4É™ÕÖYYøuzD×/e£*)£‘ò9fS$ 6úÀ÷ÒlE;ûrðã`Û¸ËCë*‰{•mÖƒºàÊ–Mx¥PJÇn7ß7Á±^m©Þ®;±ùM6ÂqN;Me.”·k–ü¸¿mF²jkÁÒ⥠êv„,Î8½Õ­Mþk´«Á5­ ÜªUô æ^NÁ&ºg3w‘²X4YeWn)•#~…¼qòõh¯jH¨Åö¤Tpû÷ؾö|]–öÎ…¸GxÖÀ´K<$L
-ÔUñ`•5Þ
-¶¾¨1&µwÉù|ì9UÛ39TQ÷䆹í| ¡Ã(=̨º; GLâ§6ÿãì¸Ì¡"¾Ž•w…B|(iïˆ'Å'º¬ú[7ô ¹r+£²*iÌÆä;¹E}—ûOþÊF\]¦l{YåAF=AD
-»÷I¦aôIãÔ'§»ÞÄû✨œùZzñ
-´afÓ´s!(ˆ)§é‡¸˜Š  Mí0Âß<_°7;3s]˜(ª¬Þ)JÁsTæû°€½F’§Ò“_íç#¹ÏïЉ¯"#(àÖ!È¢‹ù£áõDóòöÔfÆë"S§ÔtN'Þf~¥ê:#Ï¡Ú®“×5¬'9/ŠŲ
-1«¬Ù]͊¼аŽÎžl_ø)J%r˜#sŽ-Àë÷­Ýà,Ó’µÿV¨ðyºoèLLe·rÝLû—‚ f{ûc†lî %Gä·Ú÷<{­ëk†¯¹­ey4X«Þ>¹×¢ìØÀª"¬‰åLóp å4I»{lî5<o„îÌû4%s‹_?Y sP[ϱ0Êh5è²ÀEÎÀ—B] X´sd«3*8w†çñOSDŸkâHÅkd/t$æÕû9ÃÝpš®²èwm·Ù`×E¦mSû™ªf.þÝ‘¤ÐjõmïòïË`m•œyò§oURl»î*8
-©~ó lP}EH¦à%ÄM¼·¾t›t‡¥âÐ{cöÞBÑP ,Ì6@–0®ª7ëSB¢sÐãiÃ]î“
-á¹×»­còh¹ÂY!Ä÷­Kο™x¤õbVÑÄŠéw‘q¢†BŸíú·\¦å!ÎïÖt–N´AGsƒaÃ6ö¥¬0%˜Y—½ãX*íUϼ.;ÆëÚBØåŸÕ$’a’ÉÅ/KáKv2zQü ÜIDîÔ”´Ö# ­w±Bl*sA™vœFûô¹êH¨ËWŠeÍ6«T¬GK¨´gÙ¯Æ#&¤'E¶ÞèÛƒbmAФMÞùpþÀx¼(³L½†^PÅ”‡¤•ã°Ò'_ÊsGÈxh4ÒçÝ06‰½`}‡­¹Gî‡)U¦5u†=¹‰€®qäXZ`”…*ƒ}^­Ý›ZÆËYÝ…Ô ÀüF0j ÉؽoÑuo·àd¶lŠôæ¦|•À|ÒM ÒÐ$<tÒ;¹–®ö¿¾Þ~<€·j4uuþe»ñW¥”ñƒ£D9ovˆ<Õ¹çp¶Ö\g‡=–ã;`×_LtZ±É'òãó2MiBE‹À¿×jö
-rÂWf¯(¾ Ê.Tsûœ$rG~‡ÌR)G…-ú²O2cl?ÂBüX CÇäd"iXćÏà÷ÈÏ:ŽDN
-ä¶Ôñ{mƸM¯ýœîdßË
-‹¬)Ì Ÿž6Ö=jÖdÃ;í¡Ô¶„µ¼n:_>;y""¸ü,߸藵’ðȲd Ëd¨Q TÇëìÙÚÏÜ­•ïØ`.ø|Mõíº$õ´#É*šö7 ´¢Z•—Ã^SúëVa=žBžk#UõuƒKVQVQJÕÞL§Q¶Å¡ïºÜöÞÖøMØ¥b]k®Ûý7>ݳd«,B?.ÿ@uÏD®3uçæM ‰0).WòòÉÈhW' Vws˜‡×ˆ¢ƒ•\
-=;3؇ZÑíx§fÇu1{©‚qnˆé%Ñ)(Û+Ë*jóºpd±NãÎH¶›áóú E‹´Ø*ë_ªŒ®MuL¡Q°­èlq±ô¦‡³ý4ýCÂ4Š
-õgðeµ™ ýÙabÎbg›iÏRZkaPC+ˆrÖƒŒF&õ*4¥vè°½4ü`o²O¹Û•{6oŽ;ǧ5M²*ËË»mýæAd/œvH&TvןŠ•×èë§fè"W"Ô ˜_©§D´ß-ê{IU#\Ôw€18_1mGwÃI&Ùj™6j%µΑ4»o»R.*Z¼Ê…jº…i7“—n+2{'oœnó„É^*½mp`6id¢ýU•DoPþO z¯@@W7Q!˜ã¯º| —qu ËNƒò,ÖÆ8þÉòê’xÅ“œ-LÂæ“š¤Ö,Q‘ݾŠY]ò:ú©s¸÷8UsÞ ð„Œ)ü<²oD¹B2Â
-Q9ÁïÕ@[E£©ë|å»Þ¡–åq¡¢ pȫУá'¨h æl¥ËˆxKw,Š–Z=S÷z ë‹TgÔèŸ)¸ yXɶÚj"С~Ù·©y¾Wjǵ­
-)˜Y?þÄô‰H;§#ËaY‹zv,„krÇ)Æ-¼›è™«Ÿg\VÆAÜ®ô ×f-²”x éH9ØM±·‘úÕ¿)ÇDEðHÅ#Àë-WΈbe8Ôç˜y•ÛaÈÓ¶#„ŠB€s¨Ô[¿Ñ¬å=%*žÞ$ŠÞµmu|6$)!¨z°ŸøǸô†áîÊMÌ]Ê„hf⃕ðH!
-Z_!ÎØÏ™P°‚ž§TÙ s§ÌÛ ˆo{V®!(H”4o|ؤvIÒ†¹./ÔPÒùä³L6ŠH±ÞNÛ¯9s=N­ âkûrë¡¡ #Ž™.|eìÀ‡Ú½ìðâ+}(|ô’‹Ñ<w–ãÇûpÌ'ä çEFeÆZ
-O>´?ˆw]°÷¨Ãæ'²€n]*¼½ZX6ÏvJgv’‚¶Á =£;–ðO ½‘*-ŸâÝx>G( †Væ3ÀamÔ­{b|¥ %D~!Ù;'½Xï×>Å{2\ôsA¢›åÖOUiCYxm]¦ý,+“+ÎLïûôcK”¿´ãOn¶Ó†2pÖh¿EßµWê¼Ý†a#’Á°ImǨÐ5<,”ç'—ÇI$º¬ªêßbŒ>"1^ÓZ-âáÛÝ-ƺ%·£¹¤“—Í¥’IÙ ÕÛzbÑéš}¶~Ä©âLÄ6 ãaÕÁqðP2´6GðâPx,ro½sayjñ¥\Mó8Ë49öÑ~q|¾^þZ:@MSAÜÓÕ}$\æý¸ú†
-ÔSßõ}FÆúcþ„"Ã\|¯*)ÕI ÓÔ–,õ†˜¥I"
-n½ü.ñø*ì AÆtþØãR‰øæåUçÙ +KùMg”m{·Hn-dðƒ­
-'´ ‡úÃi©šTâ¦a4ÛÀór4C{$ÐI™}ø¢Ù>a‘Z(žxSomgìY/àOêÛ–·Go<Ü;œö£~NCbŸPT{ŸíþBÎÞ×pR½P¤ä¹ÃV‹»MÿpžíÜ*¨‚]”Yè=¡zéêÛCœ£LŸ3t7_>&IZoômG‘f~•¤Ôóþ{àMßq;:Š»Åu ¦€©ÓZOk˜ˆ<´XmümŸãT`»u6J+kŽ¦‡+Ö3ê~ªdô›™Ò]þAO†ðq†Â…“”ÈH®è$#c*ÿ1^ïÉ’^‹ÍR¹aéc‚ç'JžÂF°úÝŽH18LVÙë`¨çòö«;nQRGí\vß]"zÊ°¼~Ë *¬‰@ÔàÀ°··¹K
-ª`Ί‹šXN”ÀU?Ž¢®ºëÈ5ËXrB0n9½âà!§æ®»u*PSçoiyµÚÒLNöolU®/'²ºNl¾+
-z·ô̇oŠ%ž}Áwiô[ªÙ׶K¸pWâ^­níåÛiíèf.\«™CÐ f¤: l©N}Vâk¿3 Ê[‹æ+>C²W97û&Î_lûnú6±pÎÈè?9+Ì^?…ö z×û±·ÝIÉ*ð¸ãEu…nÄsA´Ç×ñ^dŒ–kC2^FvBñ§ Ó¬Yƒ¸†|óIÔµ%y$¥Í•Èƒ’¬¿BPÞƒúuÓ?fÒrJZÔø¯e¢ú
-WL©,ãõ®<ò ¼z8ØAÚBeåŽýAf!Òç.P£MX“mtŠž¼ßZ‰^`«-Þè|‘ ª<:´N†„¥,ûP£—ærÌö)ìÆFSuê‘Ù-Qà‘×®
-õó"KŒŸIF€¥%(³–_@k°„
-j-éù•_"R§‡7D.àúœµÁK`RŠcàÅRÓ¶µËê‘V¡€Â‚¾±Ð ‡‰ŸV':–ðê$íôÃDgènº¾Í·ìM‡k/‡&ŽNYúÞVÆ3‚tӾݭæ;["Û‰`Ëk•¬‡~bŒók-<ÓLÄHsH‡X®¡Ê%¨};É„ÞÌ“Äo·ç™HV²[]û:ûýã÷ön±Út‹©¯¼€ x-0å­ ¤ò3(×|–¤á#¸Úª$xœ£“µ[=~©øwBˆ¢ÞЦîx´-«’Â@iaéLß
-–qÇÙ¶â(ŽÇwû',»_eßùÈvôÕÝU]wùd}ðy0=˜$IyO›ÍÈ€œ=»U9e~5ÉŒœ¼uo{´Ñä¬nEhÕkPía˺OoÑQ2úˆ9Ôì&\`}ÕGÈÔ³ktð´bÖ¬5‰\5 °ÀÃbC“
-8×Ù¾]“’h·À¯6æâYn%«çŒò2Ã>¾õúŒP?$8uŽÁp
- ™ðˆfd;®"¤¹dA¾£B·KµAPùsF_óuª†. áŠD*Aü¨ÊiðÔ•Çð—3+¥]ª„kyÕ£dfÕp¥ß†ÜŒ&è tÝøgXÕ€Š¢ ãŸ6MªE×ôR¦™–/œÅOtÞÖôÝýÙbE€(àºè±GÑ@…¸A¦½¹ûÆŽJÉìÁÚ ˜‘êæ§p„¼a¦ÎïbH—@$ÕflÕ?îTù×7íÛ|¯œ1¿T({i•ò¡Òj[T b>J°ÿ܃>Ž.èh‹æ
-v¡=å ze׶)ö\à˜¯y€Š|É) Àµêú<`I@Nw¦éŠHræ­Ôóºƒuy.)ø·Û‰Ýê‚í\üèG®øÜè 8tÏ»ôanퟒJRo╨,ëE…cc!U!ž¤ºõN±“¤×[zçQ¤QC"5ä ã‚Ê|7ù9s0˜L½I½\ðî §¼õq·aø‹_®sÅ$Ö꩜Ė]dyé=t°P‚Ö¦—3YoÝçÒ2Ëp•ç]Lò2†ÎïOñfÊäNªQJUfî‰8¶÷$ý›°‰¯öOv¢8ÉæòLvViÊZã¬à¥Wf¥
-<”â׭Ҫܹçò3¼+çÓ2> $´‰G£éœ'¹’Ž¼ˆÔ
-ªwQå\T1‡`ï–*!7Ñb¬§¤ƒÌ%©©Â+¨÷|¸M·äv×·vã„z²Žç§ñN4És÷ôq€ÔüY ÐW<o9tƦ7°6UL¡y¶s-ýsŒ,ÓÁDHHZiÝwà¾8›5‘ÊK×>8­-²¼
-!STlÕȇ=f¿lOtÀGF­FTØÌ]¾Žr»j€¨7mÞ±Ï[Üû)ѢÈõ|ÿ`yzŠöÒé±<‡‡a^!½Ì=UÆø×ÈÂúa¤Î†¯=Æ%L€®"¿ý%âwQ˜H_éwõ#"ÜH„-»Ö0PõºÞ¥@°lÛt´+Ã=¼~•¬Z>ñ~)E‚®8¿’…@ Å²!tiv6diü•â¨n© J@u˜$íoá}ÝÉ–i3Áñ§EÊ®äK„o«9 ‘9Px¶:lrÔpÊÕ²²`¸uÓ/µo­î’h±†™º¤Õá¤Üôƒa30 ?GÝf× k!{h¢Ræ×;ì]OËÄ(«‹ž<üÓÎÃijW$Ä,= B‘Å)HS†b@‚ÕIw´«–¨;¬Ùlͨn³]]CþÃzÃÅH4¯9¦d˜«çï¡~¬ˆÊ \ES ·Â>VjPÈ7³ßtë™LËYýUå€(ÉxpЋØÁß`›¿ÃTdߢ}éøO Éñ¬1°y°‰¼wx;l¦"–SH{ïÚË“°ØéÆÛ'µ‚ ‰œõO
-‘xÑ6@·î“ü <SË~m!¾áº™Àƒøu’°ag¥Þ¼ÃæÚ ñŠw­“ë•Î2z­B•CÜ.7 `˜Uy̨²Bzx’qê/›ä?º—d¾¨¢ ѧcŠA×<38æª"<ž ‚õÆ—½
-;i÷¤ð =¨?³F‰%dr,¯Ô=wxŽ$Ì„½‹eÐQ˜ } èax>,¢RÔ÷ÕüMoÖ+&Dù ={ùfs9 µ¨<|ó\¡Ð’0së·§!Æì¡K^j1®!çóã7ƒÂF!2ùš/ÞQ ýW…!dHc±g±Ä{«£Pa,†S™"GÂd¯Íçe䶬ÍöáÇþ°ËV¼Èˆ€CaDÜøçf:*ºXþÉÁŽ)2Å·áV׫ÂPHLVz륚íä«Ÿ96? Í2åÈÕZrÍ­Í »È»Tn¢"Öhd T3‡½:¬&™t0M ;Éà¡?„R„ùHÌ÷ŽlߪeÌ—cN^Žaî[¦|©"ÏP%]Éúí9F{ ,R˜,wÃy'kÊ?Ázï×J#ů§¼¶7èÑf[ØÖ¸Ü8m>é,Õ£ñgsöèîǼ–Ÿ >¢’mƒ»šz¶‡–œµýdïŽf[¹öEódd@â?õ–ûn±áH¬‘YÄ.·äÈ"R½¨³® ®c41V8;MmàZË¢ò·ÝHu0”`QMĦ‹Â‘.;¢¯|í/âcbÇóŽ—GÛR>BŒÛb}7krê«<Hú€·Ïg†Îq¯Kîý \—|XY¿k˜ôÆñÚ.ŠÖ§ rõy£çu‚dàlríÝ‚KWe >À¡꓃ BÓwè‰)YXP›Ålè•1«€KDà©)ÎýâÌ2~eœM=¤®%Õ3– Cu^yQ ä7ô£¿˜ e*²»ž¬js»¯ù‘1'¡Û~POœÓü T™æ·UFaØ­ŸsA?Áè¼³Þïê/Ã×›Ý/ˆ' xû:ï+#™>ãàiýƒžþˆ¶ âh1CJi•ÅĨ 0+íˆ ªä›Ò¼fÓjæ®3„":b^¿’ž¾>œ ÒGßzHűI ŠÍ2‚W<—ø­î±aj4Dµ“ 5«\6†3Ÿ‚ c½Fbá¯8çÒIzTp…!‡ˆ­W@Ö…•Le2ˆm¿MߨC8Žžç¾|à̤ÞBÂîÞÄx˜1=WUTw.ÒB²è¾Ôç+Sïj©zx¡Ê-iSŒÌ¥ŠvÔ¼+ù$zÁÏ™FK0&}–ã㪼¬Y‡~9M+Ã¥SÐ%Ì.äÛ¼­=éšâÒá™>uMÎWÐ_Jú±Å("3²8Bwú÷7Ôm´pJ°B4¥”Nƒk[‰urÙÍù¤†sH÷Ö°aÍúFŒÆ]bføÓy<;X†4Ò²RÖ:’êa“‘qXL¢e9G膥`ÓC®%…›ëTÕ“PnòDXup­<§Û­Èž¤ODZ‹ø5­¦/»#øí>¹Ý¨€º ~'–®y×âSï2ˆÊ²„´` l—Ú-|Us¡o(ШUó4¶ƒ¼&‘níüÅçcè¯7Lçdk~Üæî…MTx€iÊL1ĺŠœŽõ‰4Ábͯ†Á¬R=ÐFÿ‡ hC(íú6IÙÇ0”¬ aúÊBJiÞþv£¬zh7ùp¢wÉ×é–WŠ|WXva,qkOæê¸ü¢AÂLR¿i9ßv«!Uno¿¾Ó7…­EýØé2CGÊHß soo¹°®âîç´ÃÓ.·ü‰XÝ[ä
-sŽ[ò¯ÆºŽÏ ZªT˜Fu醭aw;ôfI´ª|fÜÚâñ‚ÑîB5ç:ô›C]Åt)´¨ [³')Öá(Ö²Xý” ©A8çŒFŠƒ9'™ûkóm Áh%žºË!]Çqf°pPŠpÛh T€[LœPv?çM4™£nÓMZw ×Ð]ÚUå)nÆ<DíÃÐ0ŸJç!pº­µB‡#_JÔ&bƒfç×M2ÇjH@§ùåAßÄt
-Ópd½Ô[`çCDîãY`=O¨ã<IÅÿò‹I‡ªF< óPZä„N|£Ñkÿh!Jž¾”Ú§x¼¬ÃÇ`3´üµj¥mÛ*õ·ÒÝ“$Á³a†£òÑ*ààw¥+}ü[=5êÔ;ºžiþÜÉzÇS^ dSuœÏóÿüÿ,.Ä2lsŽ¸@î³ñÀH²Ç¦¸c;däýHŽˆEpcæ2®ªÉ'ýœ²( HñíÀfº6¢~ãÍè’6yÏØlêÖ¿Œ·ð‘®ª_0°—j†BƒLgxN†N¼¸4tãr&ð$Òá“×⳦\׬#RdBÚsdz/¬Ôü(Lš]ÓÄ>º
-Á¸ç‡ÂúIo>¢ž Y†¬ƒ;¢+A²neçΚ[czýMµm/p5@?¶~t€pð’ºF°‹[Ç
- }W—ÔÖ¤í®dÏê3Æ­­Ò‡¿$ºÕVP› øÅVc%3¥@¡íä&žH˜.ÀýÁ6vÀáõ£…z…BqÛNÉš›2•TûD:½õ®àxü\Æ/(tùDѦ$C‹%Ð}B–ÌCÀèçQÅÞ §ŠµHËÅL9Ú~[[f︙¼mZŒ=6% Ù]NÐu¤s0E‚ÿYð»\I'T‹p>̵†ƒ"H= ‘ª-ùQLO*I!P9RÖ° ´
-tE$ úoÜK‚†¥ocÙÙ E/¥ïµ
-žž3¬ªA9^éH_ˆÊ3ìšæدÙnà‹)áâm>À}ÐhàÄšŒ åø3ÓÝŸ•Tw²•ä!l}òrû´žMßÁž}µe¤Ä¨(ÔvÇ µþ«Š ÉpÝ8})Z¯ìfä8»8Iƒ~±žH.<³»k—Ã¥ÌdÕ¹<™Xð’hɤbÕs!÷Müÿ´/$¥nŒñIpƒR{Ä„'âcêRIÙ=\XÌDçl„ñÙ7<²´-œà SæÞ’ÇVûñâ¸bå#É^e‚ÏÙþ*Y¥µ
-÷5bóWŸüÕôt³C9D$š)I®«K$j tR(PPÀ"“‰ìXjÄrÍq=L7Dã`f*n^˜ÑééÍz˜`ÕîÊ_Òºn°u|ù5Öe3Œ?Ä‚! ×J„·LR8“*'²¸¢hŽ•ˆã€AŒe~ô"ž^'Ô®qiÙ&­´fˆÄãow^xvÁoóÏRvÎ?îè†÷ÖlùÑ2ú«4Nc|mOdòpÝ.#8£²#îK²nd¹!6Hßçw¿Mï;ž†‚ìÞ BUuו€‚CTl®´ÔZ¡ØlAi!Lëö.¨N«¬œÏÂðNÕ ÷?õaØÞ&.8ï †‹Gq2x4Sâ@ò~ê–œ%´Æ­j¤«¦³úN‚Ó˜N SˆWVµêYkÇ°¬5²¥áŽ¥ôbûz\séeñ½kQZy¤h*Z–E(ÚRˆ3 Fè~˜;ã|$ªÓÃ[®ÍÖ-˜N]ˆÉáÙP<|Å:³èôFÎõSº6¾Ï,)£Tÿ¨²š
-ÑåêB:­ÃÖŠ Êx$To9@H¸%±.¨Ì~jô&+A 7—ê³Óê®ãO ºQœß ÝÓ¼UëªðKŒGf´Â8Jý?âá~«¦°,i´KRQFÈ:çZÔ²öhÚO>Oɽfx‡2ȪA™`dµjg ÞqÚþæb[{e=?_)ºüDÁêÊl[TÌ37Æ8)Ñn+àAíMõ­¨Š"z´CE'h˜¹BÅQqzïªö0|#aÄ—loàÊ—v’³XfŒ´xè@—zÁÄJ/Ÿa‰¹­2ŸÝ¥1%~¬uÂ…ÚÐ63íè4(ÖOHv´Éã‡6ø‚æ *ñ;yŸÄp+íKÈG?üþúI‹À7 \sNw%Ø’‰î;J¸To•Ö!NÉSenéN†£²p¬î“‹
-4­úWM‹~©¡CÏßÊÿU-Ÿ}ìŽY¾†¢á_±@Yh€íu›øbÔnW,ø”=ízt<îKfp¥]“ŸqæÅÞ-3Æn’aZ|ìŠï|=AW?~†ŠŠ¬‘-šë\ïb;üšsî¶j÷Žmùé4§xßîh&ô¥ü"{kƒ³é|‡l#g nl+Ï7#R±´Ö>õŒ™Y©âeë:@³Í¿xçc…/}RÖ¸g´µõIßârÎëýM•4yþ^Ú'ȇ·ø§–ýͬ&‘^×Á7È:6'ó'r2!LÇ1¤Abw>ñg²*¯Ž¾O‚Gk(9ïu
-%¶íV,ÜQòQÛÆtäf‡ÅuZý~J´A{3’ÀJ™‰&Ð0M\ý\¶XÀö1S¤³ô;5¯EaÏôJ0·/›Í4j³}
-eOLÌq3©¶Ô}ÅÂù„×
-³ÝMB®Oá÷£…ˆ¾b4Ûm5Ðo{\ˆciÿ™ÇWáÿ3Î%üg©çŽŒ¸Û¹J…QÒ‚Q ]¢À›ÿБ:™¾††4§VõÏ_$2}Y뤩ØÝððÙ ÿ¶cÚ¨"yog2ÃŽ‘} º8SJ)ì"Ko™†øžJ/ Æ´“+b<7H @,U¸)‹}ȼŒë§ü`J†g¹÷ûŠ¡tm
-…™¡é*®ïÏZžx;À-Ïåìƒ"ïÚ†ùòù·)*¤¥3ËÚ^ý=äÜúP~Ø.†ÜT Ë ‹ùæ(Õ¯ ^þkΛ±¢é ¤TrÌ°íåZãÒm5Xî3·#xæÓÄ·¼+»b{ÿÃ0œ}-å1˜Ë¾•áQÎÁz‰Â¬ÊÞ¹tEpyIêY`à7¢K KÀ½1«Òâ
-+aëØ “)¯[L’ïµ' ò+Ÿ°Ÿl‘\ñ™ÛtôÍ<ÌÖëwÊ¢bð59Ð*ßCdŠã•Q¦T¹/®¬“¯}%%§º/»ï³t.fÌ fMÚ˜Õ]Õ4}/ ÃÆѾ9ÿ5$ÉýÓ\úP/eë1WÞ³…Óv`ÓHT»Š@NùÛèjÔø«Â2¬ËXì^â{ËÆmô«—Ä 3¥è)Ç UGø:ÿ‚|…o?W6Á~ÇÈ!]ØâgÆ®±ê3_áoxFP²¾Nµ¢CŸs|’u(ÙR«ãòâü)ÞNcZöÒ¼°nPF›‘úâP‰6úÓ(1êv¾o*ï›”|QÐù#$!4SzâS#Ž·uþI6Då%3פx{ˆé´¯KKÁçÌ®CÌ|HuæË‚Þ
-mèLj¿I¼Äyê4¢“xC‹´¾}í_dšÈb‡a¼Ð˜,ÇÁ”jÿ»¡|
-ôÏ™¶ôúû¿
-h?IOø¿{EÁk–X4~Ôåqp „DuNLi’ã¨L’¸œKŒ}ƒ—Öxåp·UÚ¡e=.L,¾uêÀ±Ó>Ø6¶Ëh ¾­I ©¥2ÈæýkæYל2oíˆ6KîØà|ž °
-4£|í 4öî #a`ãåƱÂcJN¿$DÁäÊ:ß÷”¶Sù¿š0'x\n)|”"<jÈàlZñL|ìó “ ¨EëhÈ`TdÈægòㄲ'{°›ö…`*ÌñN¦ÈKìí111—Q'ÁX¢‡^¡8fŽ$°}d+xÑW_Ìñ÷õ•Â  Rö>ü?ëáˆò$ƒ‚EÍ›z`…Ó.´ïîÞ9C˜Lö*¸`b@åMlå½/O‹EW9
-¦?Ä›Q‰ìó
-€u“¶o-ռζÈFE£ð.åƒÊŠë>{‰*¨òwµš°s÷ãÁ±A
-Ä¡gK°–jྤvÖ?”lMöV([®™4úÊáD3p½$V¶Å,t‰#”ò·k¼Í_y´©¡4A{;D9"š;ó;ée$X|9T7N®åüok½µÏÝ3äñ= àŠŸœó ,çPzìýªk,AUóÚd¢`VX¬@a!G»¸¬³^„žÍdSïÄâzy’_W}T kÓˆ}¯µj,BMðî´¥{¦XS~§aN·¶®žc“£Ô‘«8³s&ëÊ‹·Å &èñÜ”?äý«>ÀÞ×]Q´®óP™Øk`ßäÕÝf û®‹Y×Z«ruì=È3€1\&ÀHCNXùlu[80ëFÝŨïØìNÄ]©
-˜%0œÒAJ^ý´¼%¤w}/ ö‡î²òAæìQæãžûnúéùÎÕŽÙPÒòçÌÃzÈ/Z;ž)\x‘ÚìëÖÞ9”U.‰Ó_>ò_øá5Uûc-­@6 QEæ*D}X2a/GúGc1§OMc-Œ¾2å\¶ý„ÆP¶ó2¥‡`1”{݆àYšU!²TQŒywµÄB´¶BSÒhឤ2šA1±3_oyPüTIŠ¼û«õ[»TW”—¡6ŠÅ~u‘#·ëõpmðI„#³ZÕY$Øóyø2XõþÇ0†¸-{ñÍ·¾ªå¼2ñåÐèœ/ûY-T !ÓXÈ`lgÀðß‹Ù§¦ß
-_ÃýS‡µ )1ŒÊOesLQ²
-Ôqµwˆlød {ŽÞ‹t¢ Þâ+ïí[^.\1} )ÃÌÚtú¢à›%×ùRO|cÇŠˆ?ô€L]£µúem˜m…pRn7+o“Þ«¶›4s·Í –çë:yÊtôÒ² ê+ã\æ—‹HöɈD#|q™eѺTÀ?È6@å¦}Òú”¶¢§†ñ®ÐJÛ?ûÝ(
-!N™<‘cÞšó¬1¬
-Jµ¸Q
-¸* ÞNK
-Ä'Εo äNïçÊòHª,—üw*»ú.|¶0ÚIÐ ž4[Vƒç›-Gy2½ û{(b'óXèŽïÝÕˆYzåeø’ºkSoðÕzN
-…Ï\{¥?!݈¿Q 圲,é“Ó{Ü™Óó½%·‡ƒR™ØKY,áëÎú¤ÌLŠšàßÎÐc+t_5ñ‡^€ ¨aà¹3n<‰¨ t6.ôÌö›Šûƒì-w\£ÐZÆ.ž(¯íôúDÀëôèT!þYÑPêÒ•m‘Q•ôƒMƒhØ›‹Öš– Z¿,ÃCó
-ËÝ@Á¢gßqìöD€¶þ¸µÿO™ë&Ñsu€r“·NŽ¸¬¸Ü/½à=Nº&F¼«F_ L-C§ˆ}yï=]Ií˵¦² †¤Ä,Õmza­®4@Aĺ@q‘s “†D(7–Øuç´qçGªw=cP Ïú#ÆÅ·¹ªËPl²Uø¾d¤GË^ôë/mŠ¯,¾RÁ
-¶Èãé©t²„4å¼н”n_0gþZXßåì…×bKÀ!È*Š¢Só±[¸ùq]²Q¨ù
-R㻯ÙQôÏŽ}Ô Z—7“Á ¬¤jžé ñ"FOiŠ>?ÎyÛ!änQT)Æd§ Õ©Jü[—p1}àn‹߯¶ñˆ#ªU{¹SV}¿W†yT¼"~,*0W‰™ý.ÜXxäݾw‚”ÕÏ#hïyª ?N8,¬Ÿ¢Ò‚÷†—ó]ÅŒPpFÅKÕ~G‹kýj Ý¿þKIÕ$õºÁÞº©‰uVé¡OýC±ÉåMìi ž2C´gyƒ?’ËvH4åËÌŠJ ÂCéØK!ÄÕãþIêf|ÐÝþs/ô³@Ä:÷8=]׆ËlÙím1qGoi{tÒ-3î.¡¡¡)òË“–š1®”9c¿X;È:Œ5ð4‘t# `bK)qA¢ ©˜æš ›c´­5ÁzZ1ŠÞÖª)\“²1ì×±u27Õ@}}·f RÙáÝoW9Ç\P¦0»EÆ}UB%×/y×—¶¤^â¡26ýù,bÍŽóPI2ƒM<¦éË:ª‚ »û­h¡1¢Yâl8.ì4„ãGóqj#ÊÑY
-bJÁœ>ZÔ¶X-wJÂp²u©âÆ0S§±sª3KÅæóì“#‹yžÇ­¶÷ âÙØn¼ú}åÔ\C"…}ñõkRO‘"ÆÉصCŸ°Ç&î—»ýl#˜LV¢n÷‘¡ÈÀ)5~ÁrioΟeÓH²ƒ'¨ŠÒc~1GÙÏVÛÔ&¶b®Æz†­(óÞçy]µu9Û³·ºSß<ñ‘¨¥ÔÆúµ•†Š·ý]n>+`½÷£¯´¢w¬lŤŸÊPh;w#7Ž®vUs Ë0 ÒÕ1©HÖW¦Bü0%Ï x4î/ƤúEGû ¤y+Ë(§ÛH·ïv²x¹1= ›uBCpƒÉŒ5¾ÂÇ™Ò{A•0žÑ5'†:]+³ lYô9²Ÿo Û;O%í§æe½;ió]…J.Å*¸½ÚWféë]šÆ¨’IFD>’!(š 9$˜Õ{è{W»‰êå|rg,fi©†Yœž›V™êkS3ððŠ³Œê£s(h"ñÞJÚ¹‚ërG×ȃ®Ÿ¦Ô\ãûö! ]aX
-=ÄWDe1ˆ¦H”L9ʳ‹Šâ(ÉLU~f 3Š^ùž©DÃUBAB´m0Ap ÿØÁ÷4@-ð³ÅÌO­‰D^¯-;<BÖ6÷¨qs LâãÔ#½×ÄoQ ,Lñ¹½
-A™âõ2ѶŠŸÓ¶Äøí÷w6Ê+–IºÓœnµq×oúWïkN)ï‡mÖ8/1aÀÈ[­ø'! ´ŒÄPxÉ¢rB<–ðœØEÔ?Pr|7°™2­²3Dá ÄWUOš9¬hÓÄ5@)NI´°›s0ÇÖnŸ[fö½U¹fHɸ>›»|¾¸¬{ü*ÄØ*X‰À¤ø‹Ã’mdñ„]8Î̱r¯éúë$Ÿ5îyôÅ 1™ú&àv(WØáñªLŽe½pò‰õTàb{´ŠÄB!ð¸YRE!ɾdä\ÁÔ|
-Äôò} 0á·Ï<ðx­×³5(©²ÓÇXõ̼‰h8L©m¢Í°]ºÓŒx$“
-­u|Ðí8t^ˆš/€‹MÝp­_’<{*ñ>Jn ÐÅ—6¹s²R¯aÆ‹úr×€]9ä¯:²(`\‰áÉlA7¾ĦK”ž·†9z8nb64Ë¢jE¢$µ1V|·ZBËÐöX#Y»ͪföWßqYûlf/ö»­8Fj…›ë_X1¡ÁèínÕ (N1©þ¢CÑð´ýÆ9(AÄEêÞ–«ôáÃÉ€ÖÜÑf}_¢£J¾:¤ íéJ$<ÂBÿˆSUÅöìMø›Yr¤˜¾ÃÈ×`Qíå?›Ù±VƒÝŽˆ½¸ÂˆÚÖñhÃÙƒXÔ‡7Ó¶,Í!Á•FÿÁEè^F ¸¯xÀÁ¦ÿàB*·ÛvªR&¤N<•ê`¢µ+çN¼é¬
-g¤£Ê¾2f~mû„m}…i
-'óP4I×¥ŸÐ?`b¬FH. ÷R}ÿÀ#] «iÀAñ7FÌÐ5øùq6O‰ Ç/êúWbõÑFåq-¢´ð §]xžök%˜Ã–td˜¯‘ŒÎ¼r¿
-ä&oH[œ¯A•9f
-endobj
-737 0 obj <<
+/Length 26323
+/Filter /FlateDecode
+>>
+stream
+xÚ¬ºc”¤]°%\]î²,Û¶mÛvuÙ¶mÛ¶»lW—mÛúú}ïܹ³î̯ùæG®õœˆ8;vÄ>'Öz2“„@^‰FÀØÎÐDÔÎÖ‰†–ž ¢¨&o`mm`la'M£hgc
+áàUûZ­RR Ž_&½þ’ÞŸfx¯%Ê3® ôEþsÈC®” ô“‘Bå0²TU’?…šÜ¡ˆhÍÒVùòýåm»T úÃ8Z§ä‚Û°ý ³:I?Ôöz"6›Èbœ^%
+yá×h}×¹­Z  ypÓ‚u=jëé 3\xœa(74nŠïRýƒ&cx£aYKÜ¿‰~ػբÉI·XiêS¨“2ø ú›G²¨†lkÕ›$ñé³øI ñƒ<½*­;:̽¤PœT1]š«ÚowŽ0~,A¸ÕO˜Ó%/‡ìdccÅ÷‹k×{GKÌ‘›j™(+ÔBUÞD# ¡6ª:Mð%¿s¾†I¼;v #wïRUèB&%Ô øªÕ(cÊïZB™ª³/7í¿ '|8¾—}Z£6Ã*DLi´¯kâ'/rn¶èXÐ60µ!~Èaïގا*\Dxc(uè³?^NWù ±CVØñ Áá´ÅÚQ[´¬5üŠvȈ0Kïø^•vµÚ*V¦°cœ (p3“¸µMÖiÒ|#Óƒ}5ãByE¦Ç•yÖÌÞ¢º<^×<;>3ý
+ÎÈ;V<g5j‡ùôIH›C„ÿæaTÓ€
+úÍòÊix¹Öî]牨ùƒU)ʘÕü¬è»à&ðŠqº_Eþ>Mv–ԌΡ» :0jÚê­¬°ŽCgþ!ñ!YBRÕ¿i†D¯@!µrC!,ç´¦Üoieq$wj¤q•M4räMÈ©X¢Z_ì¹Îãi¨ä/JF y Ètp(¬2îZ‘Ç¢Ùð‚:–ÃOxäb=ê:äH@,bŽ“t!ÅãKMdþöÑ•`£ªj•*ЪC[L+x¯Ù}£C”‚ÿ€!‘Éã|†ëuî—ÔU’ÔézÔerðˆá Ã\·ÍZ åjWqFW [ï•~s­É"Ëšã±ÄÜ]£Vf;ŸTiËá®
+X z‚G)gàcúl¶É©ðÝu½^QC˜ûèÕi]s]°?Å"*Âü$fOv‘¢ö¬ì› T!ŠåPXÙÖÐœ³P•Õ¸« "è ƒ7käþkÂ[ŸŠÐâÓn¥% „¸rñƒ‹3!ö†¿wqŠ+÷-×}ñ¨C}3X¶[G\v¿Vl=Šþ~ƒìBjÅžµ@L wº Œèf‚ý.ÓÐr›'<Òü¶Ž¿Âfæ4ùJ äŸt^ gÃÓŒr;‘s ¦ŸVhŒ@€'ǽêdòÉ,·œ
+lô³î@p® ’Œ”JEcžì e‰;LÙƒ*#.P8Ý^NrÁO®w¢êåÃPäåú‡ªî©¯HÏùñâÊ›%ƒÓÆ{¤Û«Â¹}‹÷þta2XÑ`È°½W(Pl®ôt‹8áníÝ1¯v«Ÿ<ñ¾Í4­åF¦˜4d¤Dr´4J„)Ÿùë¸L²µ% ç?·ëÚUA§tkݱxèL ë…3kà N,ˆÛ3«QÉĸǹ‰–B´‚7’ûÄL³_ËgƒÕ ñŽ1Ü
+˜šæ}›Û}}<‘3°2èRÍp´$ðʧFu(#6A<x•)Ÿö·QÜ´Ç
+å,´,œ6ˆå|ëÒtлå$3ÊŽ¢¨'‚±×ÄŠé›v#c5ÉÇâÔǤwÐÛµ0ÁoãiÙíà°Añòœ¥µ¢Ã® DSêá ©ó,zé6A²”VèFšxzGˆâJæls¬>ìFÏÊ2/ÕÐ:C
+Ífg4ÎS" >ˆö—H¨äµ>8h¡Š¡3lÒ
+{%ྼ¿#‡«BÈ,>‚^@Ò¬Ç0nÓCížU½šÂZ ^u»éên®p% À#d_Ðby¾ÅéZDzl€÷„R%ìS¢Ù+L}êPS«‰$1Ád8Ç2cæÃJœ¸Lx™ Š¬3µ”êR'1ãø
+ø—I›&ÃX9!«<O |è¥5©ÓÑ
+ÕMêÔž5…ÅÉmW¶Ä!ßCXéží´*m¤ÈjÏCB€5BŒÏ)Õ‡d"ZÕጼ B^moJ ¡ì‘×Y±øRAD%HX—«Èë·ÀÇ*ÆÚ0Úýé –ì?9Ö–]©e¢ßÄŒB<ÙÁ„CdÀ‹l•z
+GzX°ö0F!ëþ½{¬‡VH•ZÄ2[t”€pS³õ.aQ[í)©u3Ñ
+/üI*Ô•ª"ù(T€}vÄ8™xfüzY X¥û™w·$]-aÁ¥æ»ãBó!xCšœÍþe‰7Ä…`¯n‹³¹êûÅÛ
+§ÔrDš‡ê_ƒç8ÉÈ˳f^‘±Ðòé£ÆK$xþdC#‹C7‹Úˆì´½‡hâžrvôîešxÐÖðà˵ˆ$Ôï­JÄ›'¯ë¡¦¯Cy2äÀªŸå‚¡ŠÆZd1”ûÎçÐ"ÁØSX}j3r>“¢0¥\Ò;QõԾɇ¥-§ ¶ŠX©Ýo‹ LëèR×R$A[sã¦ø—òÂ`®/lÜ#ùhŸÁœŽq½Ä 'õzkü™]sÑ ÜÞ¬(Q¹Íþ©iv`cöù¸-Óz X_ÑZzVm÷ïȆ·ÐQfúq¯<–^È¥Òî\èƒçB©.ô lräê‰åÓÊgj´øod‘ƒ|¤ˆ¡Ð \yh´v‚öµ:ãY_¶”œJË”(Øž#¼&bd·‡¥”<Xd”¾×!}ÔÃúŒT†‰ÀR‘‡òÕ­¥×Ý“ÐÄJxÝ­&Æõ…/¾uQ~4NŸ­]º›?•‹=gæ8ã +ßçœ;…!à<
+>î]&“ŸYdŠÃ/"Á&ZïY±Åº,nGÔ®Gz§õk+ñ¥\£>k•á„žjß6Ù6–Ô8tµÄO§&¢„œ´bú‰|uTè@ ê^[Û5œ¼N<vñ•we·!XŽù²) uê^½´É¤²ªµ42Ý´Œç€Ù¡Yú ó—Y Jë Ø ûŽgL¨KqHÍ(~ŸÌAMª_¼lkµz/(«·ä´X)‰F_6JxF¿K·Ê­ôñÚѦï{-wM"TШ`¼~Ÿ“¬ªvFüÔAŠª<Zô”ׂªìk<Lתø˜(cK©ž³€bSVlä"{å]Ùó€ZïDFý…ÜÐå½™¸<‚ïïï³{
+„,Î8½Õ­Mþk¤«Á5­ ÜªUô æ^NÁ&ºg#w²X4YeWn1•#~™¼qâõh¯jP¨Åö¤TpëÏè¾ö\]–öö<…¸GxVÿ”K<$L
+ÔUñ@•5Þ"
+¶¾¨1&µwÉù\ì9UÛ39TQ÷亹í\ ¡Ã=̈º; GLâ§6ÿãì˜Ì¡"¾Ž•w…B|(iïˆ'Å'º¬ú[7ô ¹r+£²*iÌÆÄ;¹E}—ûOþÊF\]¦l{YåF=AD
+»÷ ¦!ô ãÔ'§»ÞÄû✨œ¹Zzñ
+‡™r@ŸZo_ß±¼AÚ
+êú<V{VIÚÝLná_ïÞ‡¾’õ™”÷Õ.
+óBÂ:2s²uá§(•ÈaŽÌ9:¯Ü·2tƒ³DKÖ<ôG¡Âç龡31•ÝÊt#íg\
+.˜íu6îi²ÙJŽÈoµïxöZ×× _s ZËòh°V5¼}r¯ÙÑþ3DXÿ8Ëé6æQàÊ)’v÷ØÜkxÞÝé÷)Jæ¿ßd%ÌAm=ÇÂ(#Õ KY8ý_
+u1`ÑΑI¬ÎP¨@àÜžÇ?M}®‰# ¯‘½Ð‘˜W–íg wÃ!hºÊ¢ßµÝf‚]\@˜¶Lyìodªš¹øw‡“>B«Õ·¼Ë¿/K€µUræÈŸ¾UI±íº«à
+g…ß·.:ÿaâ5’Ö‹AZiD+¦ßuFƉ }¶û½é2™¸ (ùp~·ª³x¢ :’3 ¶¾/e…)ÁÌ
+¼äÇRi¯z>ïuÙ1VÏм ÿ¬&‘ 3ŸL.~Y
+_²©Ð‹âOàvH"r§¦$ µé
+º'7$c²ÐˆÐ!•ÎݧC½¬ç$Ê?bï¨þìl"OâŽK±¾'˜w
+bx—‰Üêüj¹£O@ÿÙ,s[»6ýªícávÑY¹hd_æ“,VŒ œb¨
+‰ð#"^ÆÃg¶µ¸!ÿÉ#i/“ªñd—ÁÐRD4ìŒ-%…·#àrþvf"I(&!QƒÑCG¨swEe`Ff÷Ëڌ札RC†×Ëîï+ZsÃãØHz–Xf--¦¼…”N)±;±shs{£•aVXAת]¾b9ï"Áúpœä•Ôm90$j®„ÎxLYxCÀ8ÏB¿Ãí¼ìùìéÒeEá…i˜U ê#‘ÕA¤’¯ÍŒ’a
+«Ç­´©¾T#$5? éŸè¯¡³präZè<§ ÑM{å«¡x¦¯¡É! ‚)±6¿Up‚Ó¼ÌÑÜŒ0+ü9r×óÕ>ÞYãÃô d3–Ò_`gbת}û
+rÂWf¯(¾ Ê.T³ûœ$rG~‡ÌR)G…-ú²O2£l?ÂBüX CÇäd"iXćÎà÷ÈÏ:ŽçEN
+} ö&Õ>­o´×ã®æ¬Ñ@z-Ã=é÷îÛƒîø»^]bÄËŠ¬N -IýJ€°ÀjDM;©ËœU×ô™Ã|ÁÊȳ5Ã
+¶!yJ6Ü#½ºø5ÒÇ-u ´–Otÿ‹Ê‡ßk§]Ã3¤¬„0¥`áÊ“êí~©/^Cë÷•µp­Éü7scË Oó‹¿£hˆ-Þ€îi î¸[jÄ'Õƒ´§!¶—7žÝÔY¿EΜީÊËi`µêm£¢>TÓñ1Z`NŸ‡ ¤'ü±i“’Jbÿ€‰9XêÊÚ—µp,½ÓW¥ÂÔr×!KšÂÎèü`‡ž„Õà@l®/­Øúæ.z”ÈÙä+ö<7›ƒ\i0zlý£b©UÐ{S›|€h•Yƒ‘æ>…mL0 ‹¾¾„,qÊdnï#çK{êºýÂI_r(®¬µ׉Òõv/ˆÏñó÷†ÙÈBDßÑÑ#…iâ·d‡W¸ˆ½÷šЛ­ðƒ‹_
+ä¶Ôñ{uÚ¸M¯ýœîdßË
+‹¬)Ì Ÿž6Ö=jÆdÝ;í¡Ô¶„µ¼n*_>;y<"¸ü,߸藵’ðð’d ËD¨Q TÇëÌÙêÏÜÍåïØ`.ø|Mõ­ºí$õ´ÃÉ*šö7 ´¢Z•—C^“úkVa=žBž«ÃUõu‹VQVQJÕÞL§Q¶Å¡ïºÜöÞÖøMØ¥b]«®[¿o:}ºûg<$ÈVX„~\î@uOG®1uçæM ‰0). UòòÉÈhW' Vws˜‡×ˆ¢ƒ•\
+=;3؇ZÑm{§fÇu1{©‚q®‹é%Ñ)(Û+Ë*jóºpd±NáNK¶›áóú E‹´Ø*ë_ªŒ®NvL¢Q°-ëlr±ô¦‡³ý4Ý!aA…ÚxYGmfBv_C…³ØÞbšÅ³”ÖšÐÐ
+¢œñ £‘I½…
+M©:l/ ?Xå›èSîvåžÉ›åÎÁñiM„ED“¬Êòòn[»yÙ §” •Ýõ§âCå5úú©:‰È•5
+.¨CAV²­¶šH't¨_ömjAžï•Úqm«B
+fÖ˜>içtd9,kQÏŽùpMî8Åx¢Ew=sõóŒ«ÓjÀ˜#ˆÛ•¾€áꌳE–o!)»)öÒoõoÊQQ<RñðzËå3¢XõYf^åvò´­¡b†à*õÖo4kyO‰Š§7É_#¢wm›Ÿ IJªì'þq .½aø°+rã³—2!š™ø`%<Rˆ‚ÖWˆÓö³&¬ ç)UvCÜ)s6(âÃÂ[ž•«
+%Íë6©]’´a®Kó5”t>ù,bR¬÷„Sö«NÁ\S_+Ç‚øÚ¾‡Üzh(èˆÃA¦ó_Ûð¡v/Û¤¼øAÇJ
+½dcb4Çåøñ¾
+™1ü˜|Þ_"UZ¤l€¹y%N
+ENc­wî ¬ O-¾”+ÉagÙ€ÆAÇ>Ú/ŽÏ×Ë_‹¨i*ˆ{ºº„˼WÐPºb껾ÏÈXÌP@d˜‹ïU%¥:©a:ƒÚ’¥Þ³4IDÁ­•ß%_…=!ȘÎa\*ß¼¼ê<»áae)£éŒð"0£míÉ­¦€ |°Uá„6ÁâPx0-öQ“ŠCÜ4Œdx^Ždh:)³]4Û',P Åoè­noƒ=ë줾mz{ôÆøÃi?ê—á4ô!ö åðA5±÷ÙîÏçì} %Õ EJž;l¶¸Ûü
+³]AQ°ë±€2 ½'T/]y{ˆs”és†îæëqÀÇ$Ië¾í(Ò̯³’”šeÞ¼é4nGGq·¸Ä0uZí‰b óÑ£€‡« ²``ƒ¿ísœ l·ÎF)peÍÑôpÅzFÝO•Œ~3SºË?¨àÉ>î#À€B8 p’Ù)À`¤cLå?Æë'DÒk±G*7,}LðüDÉSXV¿;Â)‡É*{õ\Úz5pÇ-Jêè Íî»KDO²‘×oyAƒ5ȃèòö6w  Q¼RxÜ^ÏGçÊÕÛ·Ì9Ö=øÕ!ކ˶±€ü©¦âù)X“`I:qSŒÄ¸Œ)>]K!@ÌYqQ Á‰¸âÇQÔUw¹jKNFÀ-§W<¬
+<òÚU¡~^d‰ñÓÉ°´eÖòóh –PB­åÃ=¿ò‹BDêôðÉ\Ÿ³Öy LJq ¼X*`Ú6wY=Ò*PØC2À×ç»á0ñÓ
+òDG^d£~‚ÈâÌ
+øZŠ.V«‡§G¯Kb)¤ž†¤Œ,]1ccQ­ÎO2œ…á´ÒåÇh‚ TÓ÷ã φ»™¼u‹gÂö<†¤|d±‚Z5Úd¥ÇøG?fIiÿÑPU=Ý <G þ`GCp”vö©.W¯Ò*³À}%)ÒÓ/“çÀy:P‚N§ÓX&O2ÌœÂ6ç
+êh»c±ƒI%+¸3“-_†éqí¢BfÑ?X¢=¦ú<=U¶ 8hÎA/*Ï ÌI¥ÍÝHÑÐ[ælÄ•éînx™60ª_{tžõš“KFÏ)`¶Ïß*‚Ó±¹‹ë.V˜o—“ñ,C±±7'Š´Œã"œKýóG:ÃJ‹¶;êF'þ-­Ö×RñI±+Æ·êûVÍb|‰(Ñþ£`wœa+ŽâX|G°Â’ûUölG_ÝQÕu—OÖŸ‡Óƒy@’”÷TÀ±Ù´ ÈÙ³[•ãqPæW“ÌðÉ[çñ–GMÎÊf„V½Õ¶¬ûÔ&`¥?£˜CÍnÜÖW}˜L=»FO+fÕZsÈUÉ
+qÎèÁ(/3ìã[¯ÏõC‚Sçü°b¤
+BšKä;*t»Tåà™Ÿ1gô5_§jè’®H¤²Ī<‘&
+:þÙiÓ„ZtM/e*iùüYüxçmMßÝÎú +D×Åo{ TˆdÚ[»o쨔̬u‚i9¡n~p
+GÈfêìð.†t DRmfÀ&Qý3áv•}Ó¾}À÷òóK…²×™V)*­¹Eµ é£ûÏ=è㨡‚€¶h®`ÚS΀Wvm›bÏŽù2‘¨È—œR?\«®Ï–äTgš®ˆ$gÞr=¯;˜QW碂»Øí¡.ØöÅßÈŸë}‡îy—>Ì­}¢à“RIêM¼•e½¨pl,¤3*ÄT·þÑ)0v’ôz‹ïü1Š4jH¤†¼a\P™ï&?§’©7¨—
+Þ=á”7?îÖ ñËu.›ÄZ=•“ز‹,-~ ‡JÐÚôr&ëm û\Zæâo®ð¼‹I^†ÀÐùío¤Ll‡ ¥TeæN"‘ˆc{Oп ›Xñjÿd'ÚŽ“La.Ï4ag•¦¬5ÎÁ
+^|eV
+ ó8BгMðöŽ5·krÌ¡¦É‰†Î*óî˜E”
+}Åó–CglxkSÅšg;×rÑ?ÇÈ8Œ‡„¤•Ö}Y©¼tíƒÓÚ",É«2EÅV€|ÈÑcþ–í‰øȨՈ
+›¾Ë×±BnWMèõ¦Í;öy‹{?%Zp¶þï,OOÑ^:5šçð0Ä+¤‚¹§jÀøÿ™BX?„ÔÙðµÇ¸ˆ ÐUä·¿Dü.
+é+ý®ÞfDäƒ[䉰eתG×»–m»Ñ€Žve¸‡×o òƒUËG#Þ¯3¥HÐçW²Ðh´XÖ….ÍÎ-€¿BÕ 2µA ¨“¤ý­"¼¯;Ùò mf"8vzP¤ìúH¾Iø6[‘#aЙ…gªÃ&F ']-+ †Z7üRûVë^ ‰j˜©KZNÊýA?6~ç¨Û욃áqÍgŽWÊüzǃ½+àIcauÑ“‡Úþ`öŠ„˜¡‡€ A(¡8ÅiÊP H°:)âŽvÕu‡5›„­™±Àíc¶«kèÑXËa¸Žæ5Ç” sõü3øE +¢2WÑÅÈ­°•òÍ,äÃZ&ÓRÖïªr@”ä4¼ 8è ‹EìÀ°?a*²oѾtü§ ÐäxÖØ<ØDÞÛ<Ž6“K)¤½wíåIXìtcíZÁGPŽDÎú'…H¼hë ›ý÷I~žŽ©e¿6ßpÝLàAü:IØ°³ƒŒRoÞasmÐxÅ»ÖÈõJg½V Ê!n—ú1̃*<¦UY!=<É8õ—LòÝK2_TÑéÓ1Å kžsÕ
+OÁúFbáË^€ á–ßô¶Ø<ˆ’*¦®ôÚÚ[ªO@/iMô—±™µÈÕò ¶¹j‡ƒ9GMzOUõ~<m€ÄÊ“ÅÚŸF—ë*ú·¿…¶ˆç%cíЬòré!’½œÎ-'š!ÈJ¥¾±MFÿÕ“úå: ¦©at4g$©\-ið1¤r§å}êëŠëC¡ˆ
+.“Ÿ²l8mdÇÄ×ÕB„¾É•‰ ¿eI¹Q!b'ìž´ô§W)±„LŽå•ºgÏ‘„™°w‘£ :
+3¡= ϧ‘¥QTŠú¾šèÍzÅ„(¿¡gÎ"ßl®3‡ ”‡îoÞƒ+Z¦oáöà4Ę=tÉK-Æ4ä|~üaPX/D&_õÅ;*¡ÿªð!„ i,ö,–xou*Œ…Â0c*SäH˜èµù¼ŒÜ’µÙ:üØr9Њ6p(ŒˆÿÔLGEË?9Ø6E¦ø Cø6ÜìzU ‰ÉJo½TÓ xõ3ÇÂæ´Yæ ¹ZK®ºµdy—ªÀWÄ ÷—Jbæ°W‡Õ$“¤)!`'<ü¡a¾ó=¤#Û·jõ嘕Wqo˜ý–)_¬HÅ3ÔAIW²~{ŽÑÇî/‹&Ëß]wÞÎZƒòO°^åûµÁHñë)¯­ÿ z¤ÙÖ¶5.7N`‹O:KõhìÙœ=ºû1¯å'ˆ¨d[àÀ®¦ží¡¥gío²wG³Í\û¢922 ñŸzK}·Øp$ÖÈ,b—›rd)^ÔYW† ×1š Ëœ¦6p-eÑù[n$„:J°¨&bSEa‡H—‚ÑW¾öqŽ11ÀcyÇK#m)!Æm±¾59õU$}À[çÓƒç¸×‚%÷‚~H®‹>¬¬ß5LzcxíEk“ˆ¹ú¼Ñs:A²óp6¹önÁ¥+²àP õÉA¡‚éÛôÄ”,,¨Íb6ôʘŽUÀ%"ðÔ”ç~qf?2ÎƉRW‹êKС:¯¼(Pò~£¿˜ e*²»ž¬hq»¯ù‘1'¡Û~PŸÓìªLqŒÙ*£0ìÔϺ Ÿ`tÞYïwý.Ã×›Ù/ˆ' xû:ï+#™:ãàiÝAÏDÛ
+ÛÁ@^“H·vîâó1ôצs²5?ns÷ü*<À´eºbME„NÇúDš`¡æWÃ@V©h£ÿÃ8´¡ ”v}‰¤ìcJVÐ}e!¥´ï »QV=´›|8Ñ»äëTË+E¾+,»0–¸µ'su\~Ñ
+ò$7c ¢öázh˜O¥ó 8Ýúæj¡Ã‹‘/%j±A³Àóë™c5$ Óür’ o|*…i(²^j”-°ó!"÷ñ,°ž'Ôqˆ¤âùŤCU#‰†y0-Hr\'¾Ñè5‡¤%O_JíS<^ÖácP°ZþZ5‚Ò¶m…ú[éîI’àÙ0ÃQùÎÇhpð§Ò•>þ‰­žuê]O‰´öd­ã)/P2‚©:Îçùþ– b ¶9G\ 
+,IŒ¿&˜^ý¾"Ï ¦¢Øqr,Íß®Ê>î&x콋Ád@ÜhìÒZtES·Úå«\¹ž@mú
+eî$Âjp¥dJºlw Äì³j
+Ü5Ç+Iö*|Îü®’UZ­p_%6opõÉ_IO7;”Cô@¢™”人D@2¡B'…õ,0™ânN-ÖkƒS[7p,sÍ >­ëÝ]àÚt¶Ÿ¾ÿòM5nڛē ìhT?]ÙÅ+e@Ch@JH$ êÏ&>2ýã°£­ YúDXQÕ¾ŠÈ‰Õ ŠÃÒâ¦Æ\x+¿`2eÉ µ^´ôB|iCEÊ·\=Ùü*7CRLžÜt›x,3¶J%A ~†Ó`®*w‡Zý.¨#WÈáˆêS‹“É*&ÖLL~'Ñ;¶M'&% ê"×[*moº¿ôH^ú‚ nM6)•U«¬¢WVg§Ä&x Kí{Ç¿]zÉ
+¹º˜X£fÜ<#}ôÞœl:\ ö%\á·Ñ–Ôõ<Eña›ýE>WYŠd÷ŒÂ[‹¡Þ äº\œÚ9IxúIÞpÌšäµBÔ:¶—³ìôxÅÚQn¸ÌÄ/„ÂœõÞwŠëÂ\Ó ùÐÈ/ç:køTqjNÅë“j…㜸\—³†g›d8¤¤ŽšÚ’ãLZ¾Ã¸]âì´¶Ï T&¬ï66ªÌ½*|¥0w« vî&‹®l5fÙšEÉÿô̹ñ$\wñ£O*9ÑÔ
+MpÂœ(i¹p—ÂMœ;Uk>$×,>c§ˆa&¼(öBŽ“,Ÿe£Ü
+ýG±ýN;ã8ñsø¨ï牑1 \°Q“âæZbgxÁqÚŸ¦)1â­Ûw!hK{…Ñh­¯\¾ò–§¢,ˆOÀ°h|ÎÞØéjn‰‘£#ÍúÅ4|ÑÓ²qÔÑÁ¹õ1³Gï¶&dðb<àËVOÇW­R‰<­¦*›¸!ôøP_1[,±Œv÷~Î Š¾rŠ€¹³¶fúÎÒ6Ð…i„ €ƒC#ÂuÃè÷Ê­¢‘i˜=ÒL\™¼æÕÙ¢'¯Æ’•Â835PòîL±ÇSÌÍQýí–Ór& €cÛ¶9±&¶mÛ¶mÛ¶&úbÛ¶mÛÉþï°w[ÛÐ7]§ê´sÐç eˆ%Ó29§b²øǦ+îäò3ÎøÅ/åÚ¬¿ÛŒS¾\æDéH¶ÎÇhyvÿ9ž^¹þS”s9õsꔜ\ÊP[ ãÇcƺîÄJ¡Cr‰ŠÂéå»N,à] 5ý…–
+ý¿'¾-ØGŸs¶Ö¶
+48§4î²Gá0>¾Wlx{O..ʼn6mD¸—ÚµQ¤]ä]Ž.†Ø0k–:3ê‘M}úf¸âH]*Ñ|ïâ |@…Òï‡H ™ÂÖ„ Æ;¾晜åâÈÑ¥¹Ìx0»°WäîÎ{Þ~
+ƒÐ ñ2×"ËOÿi"4§^¦"ˆËoå<ð­áÏ'¸ä[ÓÄõ* wX¼ê `؆ ÅuŒÕ×´$¦0o±ƒ¢ã ÿnlkÄ=³÷0ú@TÓ~"Ó,àçÜñOÞ\à}ü½ mxTÀÈ ²?+Ÿðwíxª¬ò“ÞcÄ1¨+EâyT;°O
+”¼´„Ì•4YHU†Ûî: À’´6c§ŸL<ôwÐvbif”” èAÆ1`Ï”yþ–b“àÂ…–WƒÌà.šžîý˜ìãObéFv©rüh€ÕÌ} §¾ FUStŽüõ¥¶£ŽÆÝAï¥i’h Õj=úè@ÂÅðÂÅþ°•¼Sá"ŸÎîÓb¸®"úáÀT°îJƒôúïë&n‹™Ë‚'ÊøOIµé„o„œrÃîä8й+óu¯é¬¦ÎuܬȔ
+ AˆÄÒŒS€w¢3"cöèF‘þH™ÿU¬þ›€ªb;6ý@>œãžÊß7)Sz'Ìä­Cs"Oõ«—$Ö‡Xž|ê#ϳ݀¸®3Éþ¸x0±Ý¾Æ@ÁJ&íæ×jJ¨µjÃ[ä-ÙL˜N`žFšxóMCÜÞ ›³R_Óf·âéÛßVç v¡>  $àdã<#OG1Û¢F7û™m@`ƒ“rº”®½C><ªˆF[·ŽI<.f$#Ðüõ‰F¼ úóÓZ—zð}‚4JÚ‡©‚­oI†yjø[xWûêJ¢rédªM.<T¬¬š–âà˜.LVÙÓÔ¸û‘P·ïëÂ1ÌfŸ@@¯1yO~CnÅŸædçn$»2âç
+J’8±ûüÙM’æ”[¼®Á'Á„SbS
+¸âÆ°ŸË_¯h jŸ*5Îþ¤.D#gÃQ‡wÏEœ l,›^BŠLg<$¼]àÂñõøzGÖÀùš>£ é¤+ÿÖÁHc4àÎ’» KA(‰ÔÎH$<!%È…ë5 ªÇ„÷ØÑ
+ü}«Ò@ÕAšêïÚX²aÒ
+˜=–ú™ˆ©hi$BnÛÕYoÊcFTNŸûìèÍ2õë”™Ûøà§{¢Ið§!U/M眼ԴŒÈRgªÛOCº2Èz –æÅ/ñŠvqü0kZÎ$‘T.R©fÇ­Ðêƒ
+MhÚÿ„¤BMsß{€ðÕí,UtËm YÅk¦X—|Žª…Ò/M½l=¸0Ó-R1ˆ¯
+f_iz,©”›6]% ¼5¦D–Së:I™›&ziŠ…D¦>ƆÑåϨÓ})mŒ=TmñyDÊö7©ÏîEx×$Ž¾—6êñUÙªû®'.•ÁÛ|uKuË 5y¢¼qžYàΈf'«|~ÁÅ Þ°Mœ6Qï¥ùTú‹­K¸«ÿ*èžø’ªq7
+ìÎ[ ¶ ÿøVfÄX#Û;Á7å‰
+SCsìtLÑp|† _VçuÞEª¡ôx7?Ž ëDäMvŽCÛp—àŒCˆ~xeÇè ñ„E ©Vš‡Ûé¥ÀÜpŒc1C xnÏÛppÔnÆÀŒ:ݨ¬}tS4ÎÕº´ÐûKÜ^ÅÝbh6˜,•áNfÊm×A˜ªŠ ·×鶠™‚mƒpÞÄÄ%å˜swÃÕö)
+5n V¨~vu²H§<mUv€[A„!‘#%2‹ä
+Lø9Ñ{ýœË å¦ÑMj]3þ
+ƒÄ(}®™˜/—BÅeUx
+Sêò Uµ°W¦+­¨SÒÇp§-ÿDjë3Ž sneé6O¾ÍlY¡¸;ãß¿Ç5ú˜Lý:àÑ0Š[5´q!‹:Ms<”ýñÊ’º?ú„
+›Ü«¨Ö5"sVÚGZò×gkïá.W
+ÈMBU7{:ãKIÐ
+ˆ—ˆw›&(8Ü“æ½Ì±ñ1ÑÔ^Ú¯Ãàrð£0ë[kf÷Õ*}¹ß@„Æäö}7YÃê¨Æz'·KeªÛ$Ó²bI EÙ#ßï{†,’æÕ~ExT.!Ì.ѸqGhý9p2À@Êp_Œ^Šòû»âÑ@Æëøæn ^ãÂÍ’ºñjQ‘ãj韹ԤíÌw/®xáúÄ3@ŽKÑå=µ…T¯à™ªFãõÏ'‹J.ô'¤w£1’ñú8ŠCå#ðóÔ†,éx‘ï6ÓÆ/Hi4’&ÕM~ÿh/ˆGðvâ2•øÃ:jp} ¤gIp;pƒRM1¸ÄÜo¡\
+rGþ@Lrêjhx%8ŸÚ>l«Ý^=é⪲ F+©d€†µ‰¼½¾B`o%冴ržÊ7.Õ…þÓ”.ÓÃOçkÀîöHÐ?šnü\ûÊ—–ò¦þIØcl6_å?2aZòEô‡C8žF~Ôè,KzŒoŒ‡JO*·ÒÄh^–R…{Q '!²·¤äõì‰
+ás(;Í9r£aC¶Ê`:ðY;ÛQ™!¾4Ê——rÌ|¸’¢Î_”àvî‰ÐRëX.üfvÜd¢9=‚Ð]·b>ùÆÿÌÎë'Ãè¢9"¶•†³¡Õ—lS-†ÜZAqªïÙØÕèúD žÓ”5Š•sAŽª¤{ žç?˜X{.ú:„bíò·ëÕÊÝEhâ.ÍúB_ƲÁæSË<hS†–èð¦‚ÅóX0áJ÷¤æoHÖ^'‹¹.W‚…¶‡{¶Éxl‹¶gœJ„fž²Díâ*ÔpÞõ‚Þ3¢3ÿ7v¸œ=¡kÖè6zø+òᶑþhóf …Y>vçô]þŸê7Xà…ÕÒ— Î  UÕD”7¥OªˆÆr#\¿»õe]©ôwÞ#Ê q°ŸuMÙþ›Šü$ÔÍÈͨ­ÎÜ°é´=•qð#çgþÕPäŒÏ´áÏûójb2Žû‡¤S°RY«Ã€…rSðûÁ2ïü‘lãïPi5v\?%•–ì|]‡?jßSšaõæ…à ·ŸâK‹âS7§xÐhît²­ííXÌ÷»øñ½QYM·õÉÛ*02÷—'(~@÷*cx.ag$Ì.6ÊÎ0~zGóÓþZ²¿o­xä²&ËN‰U]œPÄZ/ú~Q¶Îö\[Ö$ñãR[öé–’t—/)$¯h´<¤ŽcéýÃÄð±9>Z|É ˆÞ¨¬ghH€ñj~…îç °QÏšd"ÄÙdž>É×¥‚–ÉsJ¿öãô5BíìÀ½Ã¾DÑYÁß9TFÛiô…H¿=~!µ”_£ÿÕhz Ûé³RÇ=@QXÚ›$ùQŸ2laŽ(ðvºQ„ ]jŠÖ-`ëÇ8öJ•§ä.?N*êh âÚ2T
+êÙ©ï•×`±–¼ì«í‚ú{}Xíl\ER«êb{E,ìêlÁ¨ž¶`Ë eFõÌÔøÜ ¤ó¼ Ú˜Â_‹Ú}L݇yûCö=z´©Å¯ž.ÉÔQ;¨iœ„ 6J†b<YÔþKKv”x–•L@ªžZþä&$'
+ûÛÎ ´*5R]‹ŽÅ^ØÕB¹*ú[wD„¶ù×Wàaͳ®nNo<cÂQÝ~;ž™>j ‘ýÎn¤‘M©l"cÊ9Ѷ›|îÄó¯”ííU}]íbÐn ܮфôK¤‰þ䯸¡§ÚŠ±[ÂãÏ.åð¢X Øm‘yLpÅì•\’ho;¶ÓèïÙ±Zظ¿‘+ÿ¼÷£Ì®Î2é€_zñÌ·^ioůW'<ßf(àÂÏ›¡‹"Ç™·Åô%O™Îr(ÊQzΩDP±pH*u`ب#_çß!×Vê´P2âý/ˆ|ð ‹„oçš>“ÇCü±ð+5ëã(w8ëÉ,4ë1Ù|†U_5Y}6bïü§a…«JhÛà’;îdÁq¤Ÿr(ÂkVU˜U”UH3~Ì cs_lŽ+ä¨<L¦Oy§ÞŸZ6Œ"ès~fûQ6ƒ›™J÷WãIø²ó`ø9„Q3¼j9p¬ð<еó¥ËbÖm–à%»Ã p¸«C’ø|' yܹ·ñyYð'µ
+»°fp¾bDºi7n©•7¶·tišy‚‹Å„ïÕ­i-šyç<á‹™ãžG”2š$M…8†]æœxÝ™+ì—ƒIÂ48
+PÔ3)lmŒ;œ¸—ü“5|—î”+ÀTÅv‰¼Ô_òF^›b QãLT?yÇ¥ðb²èewïA© !ÅdYò]mÝ ÏÈÍ[ŸC9Év%?Ó8|
+\°l{ˆ<­û$\Û5•/—»ì…ñVT~B
+‡)Í1p’}l‹ÈÙ¤û¨¯šð1ônQ“Öü:”ƒ‘96êì(…+õƒ<“4Ã7Q|ÿF1°²¨üñ#\õl1ï,äÝ?7Âeì7®Œ½nØ<É„3ÄÓ›rhNBRòÂÑC
+^[ÜÀ!ÄŠxMcOÝ—ÙPFt>l¿‹JF¢‡ßÂöð1’£†°åïxDÑv hÇÚ
+¥åã—r¢fY—òU·zifÁUÆz*JfU¤ËÞ ½ ýä|ÿ:Ð(Pk<’¥WÝìo*Á]ö…gP³Šþ,ÚFjî¶%™;ɘ¹á9L9.DœÇǦÝ@sOµhòÚ³BãtÑsÒ~ˆ®›×)-ÉA
+ÇГöÞVMýͲ:“®³m›ÓWBÖþü/ùÁÿ ±©¡“‹½­¡“5Ìÿ
+endobj
+953 0 obj <<
/Type /Font
/Subtype /Type1
-/Encoding 2140 0 R
+/Encoding 2705 0 R
/FirstChar 2
/LastChar 216
-/Widths 2156 0 R
-/BaseFont /GEHCPQ+URWPalladioL-Roma
-/FontDescriptor 735 0 R
+/Widths 2721 0 R
+/BaseFont /NGRKNU+URWPalladioL-Roma
+/FontDescriptor 951 0 R
>> endobj
-735 0 obj <<
+951 0 obj <<
/Ascent 715
/CapHeight 680
/Descent -282
-/FontName /GEHCPQ+URWPalladioL-Roma
+/FontName /NGRKNU+URWPalladioL-Roma
/ItalicAngle 0
/StemV 84
/XHeight 469
/FontBBox [-166 -283 1021 943]
/Flags 4
-/CharSet (/fi/fl/exclam/numbersign/dollar/percent/quoteright/parenleft/parenright/asterisk/plus/comma/hyphen/period/slash/zero/one/two/three/four/five/six/seven/eight/nine/colon/semicolon/equal/question/at/A/B/C/D/E/F/G/H/I/J/K/L/M/N/O/P/Q/R/S/T/U/V/W/X/Y/Z/bracketleft/bracketright/quoteleft/a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q/r/s/t/u/v/w/x/y/z/circumflex/quotedblright/endash/emdash/Oslash)
-/FontFile 736 0 R
+/CharSet (/fi/fl/exclam/numbersign/dollar/percent/quoteright/parenleft/parenright/asterisk/plus/comma/hyphen/period/slash/zero/one/two/three/four/five/six/seven/eight/nine/colon/semicolon/equal/question/at/A/B/C/D/E/F/G/H/I/J/K/L/M/N/O/P/Q/R/S/T/U/V/W/X/Y/Z/bracketleft/bracketright/quoteleft/a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q/r/s/t/u/v/w/x/y/z/circumflex/quotedblleft/quotedblright/endash/emdash/Oslash)
+/FontFile 952 0 R
>> endobj
-2156 0 obj
-[605 608 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 278 0 500 500 840 0 278 333 333 389 606 250 333 250 606 500 500 500 500 500 500 500 500 500 500 250 250 0 606 0 444 747 778 611 709 774 611 556 763 832 337 333 726 611 946 831 786 604 786 668 525 613 778 722 1000 667 667 667 333 0 333 0 0 278 500 553 444 611 479 333 556 582 291 234 556 291 883 582 546 601 560 395 424 326 603 565 834 516 556 500 0 0 0 0 0 0 0 0 0 0 0 0 0 333 0 0 0 0 0 0 0 0 0 0 0 500 0 500 1000 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 833 ]
+2721 0 obj
+[605 608 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 278 0 500 500 840 0 278 333 333 389 606 250 333 250 606 500 500 500 500 500 500 500 500 500 500 250 250 0 606 0 444 747 778 611 709 774 611 556 763 832 337 333 726 611 946 831 786 604 786 668 525 613 778 722 1000 667 667 667 333 0 333 0 0 278 500 553 444 611 479 333 556 582 291 234 556 291 883 582 546 601 560 395 424 326 603 565 834 516 556 500 0 0 0 0 0 0 0 0 0 0 0 0 0 333 0 0 0 0 0 0 0 0 0 0 500 500 0 500 1000 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 833 ]
endobj
-713 0 obj <<
+929 0 obj <<
/Length1 1614
-/Length2 24766
+/Length2 24903
/Length3 532
-/Length 25647
-/Filter /FlateDecode
->>
-stream
-xÚ¬zSm]³eÙ¶]uʶmÛ¶mÛö)Û¶mÛæ)ó”«ëû¯:n÷S÷}Xkfæ92GÎ{G,RBy%c;CQ;[gZzNE5ykkc ;iA;kc‚3 )©£‰³…­°³ 'š‰1°‰##)½‡£…™¹3ùõYþ !0ôøÏÏN' 3[²ŸWk;{[çˆÿçJ&&Îæ&¦Ö&Brò²bäb²*b&¶&ŽÖò.†ÖFÒF&¶N&¦vŽÖÿ¶ 0²³5¶ø§4'Ú,''{#‹Ÿm&îF&öÿ¸¨ ìMm,œœ~Þ ,œÌ lzàlG`akdíbü»©Ý¿Ù;ÚýDØüø~Àä휜Œ-ì ~²Ê ‹þOgsçr;Yü¸ ìL"íŒ\þ)é_¾˜¯³…­³‰»ó?¹ MŒ-œì­ <~rÿ€Ù;Zü‹†‹“…­Ù1 &p413p4¶6qrúùÁþ§;ÿU'ÁÿV½½½µÇ¿vÛý+ê?9X8;™X›ÒB10þä4rþÉmfa E÷ϨHØšÚ0Ðÿ›ÝØÅþ?|®&Žÿjù?3CñCÂÀØÎÖÚƒÀØÄŠNÖÎù'%ùÿ›Ê´ÿs"ÿHü?"ðÿˆ¼ÿâþwþ·Cüÿ{žÿ;´¨‹µµ¬É¿6üÇC MðÏ%óØXX{üßÂÿ{¤šÉ¿qü¿¡H8ü4BÀÖìG zZú3Z8‰Z¸›Ë[8™˜Xÿté_v[cGk [“5ÿÕHzúÿæS6·0²²ý§í,ÿæ2±5þïÔúq:95uEYªÿóFýWœüòÎÊö?Ôþ½;ãÿ\üƒ"(hçNàEÃÀÂH@ÃDÏðsà~øp0±øü_2þ ˆá¿Ö2ÎŽîZ?eÿìü§øþk¥óß`DlìŒÿ™%g[ãŸñúOÃ?n#GÇUÿuâŠþõ¿ÝÄÄÝÄj}ÅΈ+Ø2ýw†szîÈ”°Ö@ðHˆ}i£rQ]¯_zøG¥þGmmÓ çW»ÇòûÏ#IÊã±>4ë_½©&×ù8>ÄýˆÛdlTÇtº¥°jÑ^7KÒ» š¬ôªÇûS
-Šº%`¸3LŽ7)ü‰] üQHžíá|ÒâP»š
-ÿ\%ý}þ54>:2Ü{Ú„M•IÊå
-KåïƒÍ§©R!RÕDzÝžeÌ}øØ"œ³\ʤ!g?5íµ Îk“T $f}QìŒ}}œ7Ãë–aI­zQ£Ø`{1®ËÊ›¡9sõ‰ór5úË<#¤=ø…ˆ´±36…è4Ó+òŽÇ¾a‘Ïp:‰é"“|:[5P6“Ó<M`IÍÍÍLÕ‘˜‡‰ŠŒDa_gÁ¡Ãœá½]é–§ 9ç8sêÓšÆô e¬bô:miØ*N±«z|+hytHOÛV77Ùa‰
-×Nä&ýâ3­çï²E@\æYzm¾~D9šru] ƒR¢á×0u+»Y}Îî+\·¤èƒ˜`Ixï|P>½«D¡;MMM¬:NNIˆ0þŒÞû+âÝzzÜðà\
-Š—€’»qt‰ÿß)âxô0EBå)¦d4Ôà,Y=2€Ä„ÖÈ=ðK86iÓ·½µS(ç óQôx;”ˆwMÒÝ\]°Ň„ŒŒÄŽ¸¼'Ž‚ŒHè¬|Ûd@I¹²‘E —çê‰xERµÆ[ºª–ØÞ÷6µt×Ûô”Uâ£ÀíÇÏcí—‡²áŠù¥t/ëE½N r…5õƒ‡À}[ÖvÞbO¿öxî3–^üX³~ݱÚtX”·úbÛ»Ze¦B}Dþ¡¥±{dyÉÞâþÝbæZR4ŠR`s§Ú1w p˜aºÃVÒ}ŽÔŠ'X7zÉ(S†Å£À¥AKÝÁÆçr&ì椫û\šì‘F­ÆLu×c¶X‡YÈnT<)—l%WªzÈ
-Ì0Lo”2´“4c×±¢»ò“÷é·%¶œìÔr÷«rOxRæ@oÑ[#OóÐY„ý‹UՈʼn%?¼H»@yÖÞãLùbùÛq÷›c}DNCýŸoì sÑr?áƒÔÝÛóŠJx>æ?¤å‘]ò;ÔHbÓ‘¾tTï¨)Âm"È|Ó\¹¢óCÁ†e`ç'(Ël-zÝÇ.æf ì„©ƒ5 /Â/‘˜ÅÓSþÃEÞW;mdu‘ýêØ®=)À6li»ÙæüÖEÍX»Æn–ç]6
-Ȇ§yð»Ô™6üÏ2Röv•ŽQvvåôTÂ*¦(?ç)m¶5”OVÀ#8”¦Ú•4áîPñ"!Ýa¶é]\yc™··sãAZPU6gbß+:*(¥Þ'V­PÜ…¥Û)+#®¦.ráýô[yÞ]²ÅÕ¦<×µAÅÊ|…ø Ý&Û¦ÖŒß,`ÄÆ
-\w­wñ0‹²R§ËJ†H®oQSÓâ(b½,íµ‚9¹/#Ýýo ¹|Êq3d›p+¯º>2£~ìîšzµ´[=1#„ãW*Ža†Æ4õ
-|\4YÍùô\VŽAò¡iÙœÐV
-'Œ†Ý¥ýrˆøœ]E ‚ˆó(‚ƒ+c[€Éj‹®¦Qíä¼_Þâgˆí44U÷“É;2–×LC
-JOÉÒ4WÑœž:óû\™Ñ™ïÞ! ×yÖ\3Ûø=«/Τ€çÞ¸ ¯æŸ/8ˆÇîc+Š GI1(yBª5ŠÝ
-ˆÐ÷™êq¥@ûÏ|åRøíçÒ¨Zqé1#.²[Â^%â”(:^ŒD”ÚPØ•/ð
-ÐJºN$†¦ædœÆak¯n¡mk5¼{n
-©.׬nà'' 2‘î3ˆ2?g‚Ó<ûeZ‘™a÷­6™'zOÁt­:ñÕBzÚFÑ£AjÅ6©²}Ôq”‹ðü¬fŠ™ðaNõRäm€É€e‰aS—š=ø„PD‹ Å©?Κ-Év“Ü*.ºå„í_óÄpçÂ’EJ-Mn’†´#Îó¿?JýjÌàUàTƒ*
- dªÑ‹ï­M1–7°¤*’±¹+DÞÄZ·íøjâ?å
-”;çÙßëÀÓùÙ—8Ç!‚Kùz.Áøò¯Xñ€¯ÈHêKŠ\M(€Á½µBO8 çXE_æsÃYZ·èp6aaLÞ5f(wS;áKéªOÙÓzôx
-Õ§µ÷YÍÛž—™®Î燸-f: sôqó957ì>\Ç´¶ ¬C½}8$;DPì…eªì¢V¼'­ØíÄ<È“½Ü¾NO(߈]øé¦ÛÅr_[Þ*ʇ¡ÆËÆ<Òx ç˜î®l
-Ä’£×¬÷°zJmp¤0ZgôìuáÜí™ô!F…ªä Œb“Ð.ƒ ‰¢9wØhQÝ+âGùTjx­~wtñ».^jËð‘g&rÖ̹V§#KÚý®Œ¿çqÑHºö”Å~àlsLÓfH9áNjn£W4`oÑ£:»Øš^ÀÅK¥ŽÒúƒòL9ôlÊ0Û‰B˜ÚÔ#k|yË¢\Ÿ=*XˆÕ<d0 ¢‰úJkáÜ«mµuˆ„‘¯H`Ž6彋EÖùñïùBÅ«/hüî#Ô^†§ö¬i(]‘×Z]°&ÈC˜ìö¶ãíöù{Ùj+à€Ú‘ZQ[){¤iZ_Âì“à=Fº(s!:T KØ;XžZÆ#›DÂ,vÌ4ÐüQD~ô¡²ôå *×BêbŠµÊ´è˜:³pu þ§þ9rK28]±„»]Êö]– ÌiŽ rÆf§>Ä óRi× à¦H~&¸·—ϲSz…€ÕhßÝ0Ö/äH—Ì-Z‘m®Ûû <€úQ³Õ0zÒבß8r¨tIÏ'Õ`™@*ØÆ®@fÃ&€IѪ¥v%QÏ:®Á:.s&ŸëF­¤ƒQüʸúW ›_!Ò0sI"A4ªØ¼D×Ä÷¨C!n†Ñðú;+‘Öº{ýŠ÷ÊdÒ”üÝz/176ßÆÊê0l®«ßCヤb£s0 N­÷ä?‰ X! ¦œ´Î`ÿ¾‰$ý:Š¾]‘µß«kw#+‡üåj$P®¶½¬6>žæØñ^70•öKú€ø$ˆ]ïï­óÝo¸@g\³°G
-9ÅùbW<-—Ô9âEjRœáÖÚîö©ÝRËâG^ì sJ¬¾bíÇAÂxÙýeØ­ÒæÊ>•¸jÀ ,WÐs
-ñÝ‹¼I2ˆô|ß{1¦[y#²š‹9ö_ÀSƒæŸ’™fyf+(ý
-K#Îø/÷2ž;¼£§Zç$Êò^Mú½0)íN(ïó‘µ<‘Š6lþ;9ÅуŸ)Ðæ¦óF}»ºÐ=À¸¶V Û˜Å/éGŽIÌYW¯µ=·ŒìŶÑ;˜vìbs¯+YÈý/âwåáNV­&Þ÷¥0óŸ7¯Â$6/ ÈÉa…Ø藺¢ z|£>†²ª
-«Mˆí&/·}Î I Ø%΄%0W¦É·¤¬´{âI\5d§1ÖÙA)£7½¡TDƒÖcÆãM~ÉÛ0l4ÚÔÕÝ„ùäˆ÷)—h7¿d~aùruÖ[l¡F÷è\)ãƒ|<kz?D \]ò7ï2¤ÎÐdåÛTª³ WdDmI!÷Ï€S‚'#Q~ On )vE6ün¡Öi¢ Ó€(IIŠ?´ëôWÞbÚ¼%­ÂbAP­`6D
-–fçÚïC%ÇÎbl·Å$ûÄÒéæÅÇDÙdÿ
-Ÿýpô¯°0TO@,{i`·Î¶ÍÆ¢ãÚâ×Kܬ ¾yOàï–<ÀQ–
-ðÕ Ž£èÈp¬­°"M¸p‘)š!(´Æ[É⯻¹ÑòsŸûùWÅʨBP¨h Ù'“¨¿ ÞÞÀOԫøŠ½â{Ë eÊdëô¹Kx5QªÎ™6!â–­a˦½ë}2 ¨Ýˆð+0ö|3k³Ÿr™eÈ[A˜ýl\ÊŠ}óÃ\&Ñ[Ããóqt“´ú8ûy :µlõUñ®¥"„KЯ¬’Cpeªb•^¶¨¦oÀªs'ª¹þ¯cÙKñ]ùw+VuN|äáù s.…¸¦Ÿn ª4—&Ðøš{«î‹½±é
-uW–ÿðžZ—â9«ÞËÛråŠi~Û0¿<€G<æÀ›3¦?›(íPÒá“~šGÁqFëÝŽíƽHšJ+3"Ê«F…@™'›ñ‡îIŸŒ‰õ‰ZêÀ7Y
-gìзt@Š™+[Ñ3²/*;œ÷Q¿.ønÐDâ]ñê “R£Þ?*ã]£_×êCék~Á3A¬
-$1üf¡
-‰¾É%|¾Uůx¯¸;%ÒŠƒ}5]åD„¢J›œ)h#?yºâþ-^ø*#G„ Ú”¢‘üÀÄi;IÑÉ2çŽÌ/~é)Ñu 죯ã3noዯ78]P³]nÃ|¾g
-6ψ6o‘PBšP'̧AFæêdf?P0dGC×´rW›çB¼¼6&³SÊr¥Ü •¬SS‰ÓòñÞõT9Žú¼K)Œ\û)°bç¶Õ†3´$ZÞ#&†×ææjsmÂCf‰àS4XäHF Z”ÔzϘ(Pt
-|ÿÖc2›#á¦$'j‡ß|c›xß3ÃlÞ“”3Bm€Ü9ºš?¨
-LÈJ„5(µ
-S|ØHˆGð—Ã=>ôԑʇÞw1®V®Áç€R=äŽK‚uW—e“ 4¤µZ^ öçý†Ï#ÃÎDžâØmwp#ŸT-Œä{Mô§SqêßÑZ!¯È¥û;Åcï¤ág´SƒqÑq/V1aŶõrR€ñùòdfN51©é‹å=túúöp›˜Ùøfqû— áoœ
-#‘%‘Ï+0{—¹Vx³½û³IÏßç@ ›AÖå]d˜± ÜšfÓ 3.ˆ•Lçû^«ªwkFOpªÍm“é éâKL§.ã¬f0æµ2x‘$âGÈÛ~Í…†ÙgpèÙzœlŸTêŸß'Ah7‹#m¢(´â'Z %åÝa&˜P[&W)íýyÝaHÄrÇxg+Ešê»ÎÑû ^äŽ(úÖß `–ºr¶jºù7Yþsß›ûPDS"äÊ"pqšQ¦Mê´šsËÚ‰ÉöR'  )Ú0çöÌzlšºð•`^•¼ßÖ ——úq2‹ãqÙ•ÚüŒmÄàðr²ÉEh
-¤á¾}˜D'N+nš~¯Ðß0’ƒo™¬WOÜs:¡ðwaz;A³cJ©ÚäA çÖûÈ<’+UȯÉCvL¥ºøPô‚Û²sùô* ze-£Šü;2 «ù«#_š¤£s¾þ vêÄ‹úñe‡Î‡CØ“¨Ï>¼»,æñ’peàùhôm2’ÏÝ°MÍ[®¼¬Ý’‹÷ €"_o UÅôh£ ÖB57„ý^æÛT'kiWCEÏr§ó•
-©ØWÚ¿\N[Ž”ÀöŒÍ&nâáµ9vdµÍ¢–£¡!Šã5iAÅ@ñ/*w.¸Ã(:³›Åå×Î6îu1Ü3î᪾ûõW¤®48ð“ã‹KÓ^¥3Tòte:ëù`Ë"‰‹º‚p­,»iAX/†HÛ˜?äµÞ)RR«Y?êxjÒ/½)‚P8ñ“—»C>Är–BŒ!†¬gÝ@¯kîÚ“èNü½?DÆF¹U<þ5”I.:´s¾Ÿj-p“Ã䊰"ŸªcÂ#Œ:B +?/P— wég&åoï²û×!æ9œa pñ|Š®¥Þ²K5lïøŠÑ9„CF †ºž/õ¬;¿G@!íxc|ȹD¤.׎n^H$ßÄÛÂÓq]Èõ+É{¸i™’
-“*ÅûÖ€H-eëpg,eƒ|ÍaJtžŒ/dŒú*Λ¢ 6ºK2;”‹x'.QŸ[å ÌñÚ:ŸÄTß $$¯µ“Í¥¤·4UA
-~:Š0NÇŽŸÂy¨r“Ñ$85¿Aš«`!¨WÄF'*nNÁbt*Ú*¼ëëÂæ;ŠEôû”ÕaÇòõT~ÔÖ“S4Ÿò3<5×Ø\ÛJ´Æß&æ–“O=P©[¨P$“Óµãñ€ èiªš_`Ž.Šó{h/"•"v¥¯CŸ)-FßE¶ÛA<Ýï KF‡é9 ‚'ýøa¢4*$'=ÝèO áequGf0[éÒ´ò¢ïÑÞ7™Ë©4€ÐóØxâ%%Ì:¼ã/º.@ªã#)NˆÈÌaÀSt–k ’»´jˆ5b;¦¿J;÷Ò±C°7·ä°ƒÂKŒwA¹5S‚é%8.nN`ºê9_Žû¡ôÓ;Sæüê\g|¢Häae#§û×çÛu¦;¯ºÖÈÊXšŠäo+7×m4”°‹ª0Ýë#4åâ8hù‚˜RË9«»åì{°S©ã£›ªˆ¿z rª“ÊûýÎœ•VØÖi!z_)õ¸¨VS[i²sõq£Ë%®µe?åw«ìbØ-…97Á |Êš aü’Þ[
-4%Å5k£½02ƒÁw¿b¶8y<•«ápÁÒ*Á–Èp«¯,”&«‚rÃæG€Tëƒç¦£¤å¿”X{Š”ùH;_ÕZ ¼ë/i)ï1Èû£.5n仯ðå9 =)ÂéÌW%^}@|Ѧ{P`Áíea°,pS L§Ü”üÚ®Û7CÖÄbÀtÝzÏ3$rX§5Ø¢Pü–„˜jW~\\{ 7NìySE¼9 ]ºž½"„i5¿ÓúÅXôxBää\„“y”\á¼¼!‡k(MÂÖL]*/öðéžä§FJ{Y<Á&eš¯lõ‰Ïƒï…Ì‚+üŽŠ<Ù@9vOŽ’¤ä[RY·ZßUMZûp4–DagPcZ‚%V_©Þ\;=MåWÛ¾ÖG
-›¶ƒ¯ñ¦¯<¢—h¸E“;Ukê ñ
-J±&éù雈‹˜9›âÆæZue)äG $ LË#[|íÕϬ4ÈÝÕbO
-€£AÚ¤x8mw›þÖµÔ„±ßxèÍ#ºaýªU!˜ù´TßN.ÓÙÇ-É™Q‚«iy@ŒWc²8qá/øç ‹ïåqYw'`:ÓN·ˆ=
-*¥6©!bÆ¥$ž)ÈFå¨3Çx=H3/xR ÎWGzÊt¡Dc€Ê'ÒHD´öXM-®ÁöpáØîÐÌ’!#ŠÅø*ÒÕ Íè/<Ô¢8>§Ð†ó÷‰rŠeÀìåtѦ’ ¾Lñp m… U?ˆ+
-½ŽîÏ>¿ÇrøKKíùƒrÍAfjxy‘ ^W_ª^ø‘UŠäNGReÈ\®v/ÖVö†¶Rú׌hÉýy3˜Œßc¼b'óÑl«ð‘Ä›k,¢°§ƒ.ˆkx„Kªý( 9×^ÅÈ
-…d«…œ#£}þÂÀÑÜÂG( ÑhQ/Um+‹|“·^±OI$ѸÙ0ãÆVèþ )ÆJ3ÍLJ_ñ·ÿÑLÖ÷¥Ÿn­Þo”vÒJáØêqmìíçâ%Á­Ãcœ~ªzVÈ‘søqÕ g%ŽQÌ4³æ`£E–/T““?§púyÂå[uïлJ÷ödhºHÐÈÜlM
-Å s?Òr&Fd¿Ä6ë&>N´.Š ¦¾1:¹rP1ûØ——k¡f)ØdQmŸèÄI BÐä5Mþ¦1T¿`m[;­z!î_µ±=ñp)ä5^Išõ@ÑðÈ š¢žAò'tG<ÞÊÁæa¯šm-mn(Ø
-‰|¿"]ˆnŸ†GhS”C£ãžä.%^=‰Â žš| È%ÿÅ%Ÿ/†5¥ntnt I-¿ÊÍÈ.-ÚŠ
-˜4ƒ¿à†tæ-ws(›¢ü À.}!Ë•™ª^‘ 805D|~ØfÌWŸ½æ°›ã‰Å9ãqÀy[eN ù~TÒ€J…gD›¼à%HõŽN´W¤Vê Ü©&QXS²;^Æ#~o ÄSÙÄòQ¯¹Omº¿kÊ–»{.
-àé%.@”ØÀÄZPÑ}ú¥ÄÝØÇ<†,2xˆá+„P À:І¢€XH‚9É2¯!I‰¥“–mõ놀)ÓLvÒÀªÊŠ‘¤®­‰ŠI¾ž´ÀJ€-um~5SµÏ?¼‘ÞËxXkDZÎS§ꊿʥ'ÿâA“EÈz©Ltª=ø½¿ˆÀ¯’ëÊ›2{@?ï5ºûšõ¨N …&øºòȨŽ3HKãGš‹6hXle¡ïÿ–kMžÍMxßqhìàV…Ú¤ki1IƒË‹ë°ª¶ƒÊ9UFmwY¥YññW>èYM Ð7u
-Ç:êhפ­ߛ֙C9߇¬o“‚/¶z>‡”8Õ"¬pÔ"8f@xk©óí…f¸®söšË‚ý(†'ï »Úƒ½pLjt:1[ɘú‚ËHâûŠK¥Q¹ÞAH)†3W.‡å¬ÉüÖÀU7¹þ"ݨ²_mz$(®$åÔ^ÕìÊÆŸ‡EÄÆvPºÄ¤7/' ìl\du#vتç¾½ììÄ“QP‹qH{Ä$5ƒlíÛóyïd? 2$yá9MLºG%[!/J™Í2an¶ÁœÞOz~ØŠ9@5ꎥ;V7ÎF FsÕàd—ûãת?siÜ5$$éD_j(¯Ü‡ËOÒðBO¿šq€îôN»#.Æ/8ZëùkVŒè‚¹ép›ÆjÕGpéÎØzÇöÛI9´HÓ®"!ÕJˆá«OY¢Úîµ5¤=.J×ø2yØPK0úÍÙÃPI¼ ÌIñ$GÈ^˜ÆºÌ‚cý%úE˜òï„cijñ¼•9‹ž9Ñ’l{ˆ‰$ 0¢w¯¡&jjia>’4\¸ KDÃ{pÊŒ#?ÓA þ0›9 °ñ-D>"ª:c?ܺÚ~†‡^e55¸l
-:kb¾ÉLQÒcèâåSŠÛ€ …l±Ã{Y14¯ŸË#Y‘·IUHš6‰·'&:,q[ÞÀÑçºËÔg+ñA¼dÖ/LŒn”•ÿRÔ
-ˇ—ÕøêMCEýŒw·òÞPðÃ]ï-¼5L-§Ô²%\ðd*]®K¬qtmpMó¹{Â6Dm1Ð[2m¢ºûw*QÝd‹Q“÷\ÒBq¶˜™2<ôÜå `ve¹¿*9GiÐÍ
- .ÓÐ']ÒÀ^Od°â®D—üå„,?#ÞWÖ³bRªv×èSž¼˜Î§ÁØ$ôÊ`mñ 2D=ón“þ´ÁžD㔹=õk½IPïÅvƒJ<¨±ÏÞtݘÍZ´G U^W0äõ¬’”¤¡ÌšÙ=JéSQŠT#’åOµŸ>]žAß÷åʇȆ³Z!“Œ®Íïå>÷Ô‹fÜ.å¾Ó;ö§h gXUãÿ‚yXÛ%…6,˜Ä™T¸«úÊ*1²ö°Ò”"‚ï3Y¶m"ˆ†s¸µÌ· Rþ;ÕõµU§é±8fŠ•ì0A¾Ç¤‘oxZ¼ÒÀá¸+ÊNVkú÷#$ Ë£6\4Štó V·‘D^2'lRw‚ fÈ2Ñ[£Ø߇`Ÿk5Ñs kÜË·g¤Ãs© ÛÂÍÝÍŸ¬B?1 |k6*yf¡3ñÚP‘|Büu+ÁËNõ8XÄôÈä‘¡ù EUQÊFÿµð¥¸ËôiÔ2¼ð`Næ}ïT´?AËÒiÎâ ú[¼5¿«-ŠCLÓÇUY$ÐÀéëh¤®WNÉJB-þ¾ÜaìÚvvÚT¤‡dŽò[µ>Æ–ø|sÔrèCd `¦Ÿü^†ÕÁÊãDÃ*ã%­ã»òýÏŸ‚«ˆ›óñÚ àfX¡6øvçŽÒ]©Â—ñV¤M"BÝèù£=&w>8Kºä*¯+– ¡ oèKᣵ4æx( =¾$h%H
-£VâRÑ
-ï82Ö&)°"¶E;Ü´”ŤUYvƒÜìVZ9M*­µjQSJ­)‡Ÿï@LH§Ò5Èþ¥
-½~ÒoÍdW)(Ö€çÜÀæP»€Zø¦ÂP³¢½OU®æ’mèß´¨§raäÓw@„&7ìVÛÌyå\çøiÃH47+ù׉L
-µQu-W€»×4~Q.£ÎÐ)ÅÈLHQ-Û(èÖü¥> ø|kúÜ„X`Ž×¾®º] #.ëwx+«;.ñml3ÁѪ۰çµs
-:Ê(׸B®Ó'=êû’ýeÅ9,†`óÙ‡{ß%€ª ¢0<ý}õ¬YâÁ}‹
-ˆ¬BÙp:©Ñx”Mî§?ó}¢Ø×4¹„“ùïüGßßaWGÄð«à
-«1,u6AS£áx\|czíR¢€oÀbÐ.P³¦‹Ý=Öö+<µU ZäÍ&zÐÑÅReu–
-[5ÖðÆê_ka‘¢Þ÷£ø‘*q¥=¡R4Ð/@™jÂHµ0M’$Ùþz„
-˜É¦p8çˆC¡·š•òÏq0ÞSGD¼ÆSâT2J¹Ôi­¸É½°½äA iÎáDµ9)î“>oâÚàЂ,®DOͺ؀¢À¨&¯¬±ßŸ“ãùí„í½O Ä[¢:&ßQC—Ýåy˜1ŸÜ¨^Nò`ϯȌ)†¬!îÍÓ¤~»,˜7Õ$á/°Ûº¤zé5"™4¾bø–ˆÛM]üè»o~E®5p‰ñðJÌs¨{•moœäÜ%Ö¡A;›<Ñíô¦óñÜý¦¦@=®Ð@ZR¸ôGv Ö}¬ÇàƒO³þ›§—ÙA´|:÷©‡ž™Ï @pmðïÑçñ€R Àw<—a°Ý½7#øSBG8-(v> Û žq<]ùÞÚÖÁPdöÙò @JÞâõ•WÑ2|¥ —Ê„s’¨Ê‘i% Ìî3² °6“NP&0ž>>ÀI2åOø®¾Ój¬ŠÛ¯)ÒÀŠÜÚJ8¯Öß*fzU;.ÏZÜ$Úùd
-×D½í¤»a £ªâ*¶‰ÂÀÜÙš*û(Œõ¤qÁÃåäÌ°[¨.xÔŒHhý {§ú·–æýy澡:ÔuÓçg¦¨÷œ4k ÜÀ=ñïElD+Ž9Ó{û¤Î=£n„ÉÐE:xª»n½†í·ô
-é4NÈŠóv É.Õƒ_Þn$`¬ÓÖ)<ËEŠþê°õç@‘q6I„òÝäŽO¦ù¬R²Ôg-£d–‚îAúô>l¿ 3)VÐñ,ÿ²8Änd2€ø»Ì@צÍ*€]ÉãhsÀž”nä¦(ºÎõ§ÕŸW‘ÉÒî#ÐósD–&ôؤžm<[ã Xp.7ôâ(5%ö‘ì>B8‘'ÇÏÉÄ-ŽM%f+ùo0à8}¤{+Ãþ/®ò ¡‹pp… ‚óìô½ÙW¬ÒCF8fÎÞßòä6ŽÓ‘æBVÎÒP,-{DÞBЪðß“úé,¢îN`:¹ ¾ÔŒ/™t>¯‘¾ÀýÝ«9Ñ>á…‡]`5TæÑ’zûvyWX2FüºþbfO–f§>}al÷¨\ÔMê—´ìù¥ìâVPÇsp¥²oøâÇШ›x¨³N O_Ž»N=𣳧ND˜ÿ«ýzZ¯@(5Ic{Çv³cÛ¶mÛ¶m۶ƶm»Ñ™w8wóÍz€ÿ~eŸYçÞ*D+_—‚#ioÛçT¢{?Ø Ï|Xž!ÃS)Ëb×ß[ñ_ˆ
-ï%,3”1•äœJñÙwG¯üûñšøoeüªyDhéNÁÁϹݎÓRþ ~¯›GßB‚\ÌŽ™;؆r•R-ŸEGT±ùø°ãѶ÷Žz ‡¤/z”Þ‰…3 ¿µf!KÜt[¢áqQ‰(¤Õþˆg§þ¬EÒudV;~_€dr‡çI;17 a £ƒžq”„)b±¿²‡s(…0
-IfLt´&
-¸Õ‰]ª¼ÖÀ·ü´¨ˆúWÓž•N€ÓáÚ îËè ¥·I­Ñ—Øü:k b-F”ÛÈØyŒÔLúcÙY># S·ÿý¢žæãþx5
-ŽsU ? ë{x[òq=4£øŠÉTññbEK'òmç±v§9ˆçì‘È$“CXcþ©\“±>ÊG˜m@>¥¼lX1 ©ô¸dwO AþŠEÒÖ’±Sc¸I/cK+–5>¶V‘+"zg
-*»åMì•¡p_ÐV—+}¤ªÞTžY!æĹ(K§i"üÇ(*wOzŒF®¯’«X`Ž¡ÿ­Š¢É
-™*r[¶Â—n³î+ˆm•€Î êËÜun2qÄi"P6h£.ü·T”•OdÉ_ùüånµ~ ‡q#$i5’2ÍçšuÛOÖL[˱ÙE¶IkQñßå:¢_é²w«®º!É·Õ7ˬÞýóÌlÒλª> ^ØH•€ þfuĶgŽÍÆm4N}Ò
-žº²Üà9UwgÒBkÙãƒËÚž½Gr˜u)Ôë
-èòÔAé›ðöÖ_ß5Xuïwo%~’KG`4÷B9MXÄ—›Ý*¬â=cÉwú¦¶­r±¼§˜½ïÙ ÌèÀXmgsÌ{ná>³.ëÀS±¾ü¾ºÈÙ”¦ŠQ®Ÿ6È4ȤÍzÚ9Ú—¦Å÷K\ ìkCì«›!ê;àú¸èy¢Å
-
-"¿‘©ÜŒ˜%(–PL•„àà}çô—ìd¸A4HVs_™c‚Ò„µÜÅ‘nÜŠ¡Vz*-‰To­”â 7*úï #{y‚íl¤â:n\Æ>‡áos.ø¨ŠsýE×õ©É¡Ã<äm¶ E±¸@ˆx²îkrŸËÁ}G=1ôƒNl.&·´Mf‰2À4îۯ0ö€6Ñð G¥í¤B§R“Bt•¯º%õĪÜ~ç$`XÞ(ÿ¶ˆphíÒ[, ²·wÄ.„ˆØeæÒ$HÃù”±åá<€;]vÛàr Öù›–ÞpuU“J¯ÐœA£½<ÚÓ¤ïõV1r¿Â¥“e8Õè7Þ)h(²¼Eð¥GðЖ„ñ˜WÒMæ _Y£õ‡æÒËfcØŠ¡ÌõCÒ0—£Û²u—§§äùp3¦~ùÌ[yÔ5!Áy˜Ý Ð-¹9¨ÉŠ%Q-} /DšC¦—jn¦%>HLgùh:âî…¶Bldš½üuô݈°½‹IÖ#o½¿ùði9žìtå‰ò2¯̉ê³æÖ®Ê2VÂ^­.îÔ
-ëÿ8±²
-òo·Ä‰è8²{ãqÍED§G×æë±ÆöåÜbùÜß°”\&Ü‘ù­òÏ2qsÈÆ°Ûy¾>bò´ÌOX(oÁYÓ‹Þ"4Ù†w7 «~Lé'ƒ]‰v }Oä8ÝMª)Ž–X’EÀ,3bQ*ÞWAš 0 N5<_8%)FľJVßr”[‰=Wÿ:¯&,o/ÑQƒ+"%N†êémü‡*VtŸ_-’È°”´sPàkX‹'ÙÊ‘FâbMüzyixûŸGG1SÝ(&¦F›Å8'Ç
-mÁR!/¤ïmYz'Úò”¦ÀÀh'¨1I ÌѨõéI¹;b ’@\Öq×Ü[¤µ*ýôF£½™ÃØ»ÚRqõ¶›0ý×nD%ŒãßÉ€¦ ]:bĨvÿŽ“U®ïqî{Ĥ
-Èù#†ð÷†(£ÃÐw¾áR¼­ñ¿ø; h@À‘Ä8~©Lp©™¦¿RÒtª3ª5/0Ò¡S0±nÍ&9=Ó ÷-Áz;¢IrH©3©Òpdl²l[‹}B¿p“šÌN2ùòw Д˜…¥UhpO· 
-FÖ—bowÖç'<{†Ëe/>w¤ìºO Óyf4,%[n‹¦ó<ÑȲ’Dø¯7XQ`õì¹;ðkgýÑt{D¯VC|n$è_
-5±)Ä;À†íkPAs~6wD¦l¹Y²˜'À&>)Ž:•„ΊÙtAʘxñI…Å©Ñ’"Vï·´—Á}“Ôl—Üœ2Ê?«RÙª¦» Ñ2ø¡†LŠ¶Ð*¥ÕùÏ•Õz¢W¯íPO!Zñšâ:¡••3ìv{´3:9¨;8 ~†»Gcã–XÇ*ؾƔrõFÉ×<ͤŸ”WSs¤ù€ûñúóRXÙlN|PLò4ŠÒñ£l8¯´Àøî[ë†4 Àñɽ.zšcF­{ý†ÄT¢¸ˆŽ¾‘Ð[™()ä ‡¦f¾ÆF£ðÝ´Z"gº…´>Ôæ5âµlÏâ,¥÷y”¦Ä“1Êe]#¾{Gš!ÓK±¾„OÍ÷¢ü¤ïï!Œ^{ßðÉ‘F'U0BBo÷LÉ7„ob¨AÏqØ5ƒ£&ÜçîYd5K­ÜeíO%:Ó 6™zD-߹̫\šM0
-¯'l­Õ_‡2›.vèKâÔ€fïø¯âˆÚ\ŸÙÊ¡òËà.¶¸iAìU„‹Åss*’ñªÛ
-ó Ë.ºÞJy'k<¬¾T¨u®rï p¦±2Äéyš˜¾Á0^øÓí ›H v,¥wó!éùž1ÄVûr#Âp_JI´¿4ŽÎ¸6ú˘ì{2{ã• <[—)¾Íj°xÔo~y‘S¿mäó¼—¯ùh§NWp¡Q2¬ð‚‰>÷ËgCX ÀõVUé³½æ·ÝbM†Ðñù6 kh*†4¬† ·ÚTã’#­Ò<÷òwHÜ2ÈAœS¼WR¬v"«¡™Ô1í2•¢¨¡;ŽÞuE@L ±Âà‘Œ”ª^4þÕŒl«áÇü̺-€¾¨“\Z™Òçtä %p´§”î–©ÚËjKûr¦ä¦¥Æ¢[~ÕÇÆ
-eÁ½õiÐGÓ8¿ÙñCÊI´‚¥º]u¯˜Ôjù -JtáBÊk(WI)Í’ˆÇ ¨kFîÈJi…Õ FS„Éãâ…—¹l;£—¬(¯cgHÖ5§ýUj®¦›¤ÞNX*1a"˜…J[å?x¯5Mï@ 7‰íɳ't"Mrmc §Õnœ€rÍÖÔ<.ïo°öÝヲk¶åÎM¾×ÅŸ“p40¶Y¤ÉçŠÀ^s ëµ¬d>Rõ~YîZ_Ä둹v0§Gm‡‡N®3çï7G$*›½th•ëùý¹¡Òg)ˆ, &ƒM€¶ïÎ3«yÔ&o¹Ù›ïu–ž4«ô,öZÎOkÜ÷ªÔD%«†Déz¡v?ò‡/óÀ; Š'?§îºËcšý‹Üè
-µ(à\èaª
-E‰7jŨi¥oòƒŒ:½úþ·cêSJo*>»u+Æ#@Ä«áb\[k!s&D “‹Ãd`È<HØò†T¦EÚdò:±CíkE
-j!H·îà3ÁE.
- ø!{mž/ƒòZú+p%Œ«u–}Fcí¿ èýˆ/ì…Ƶ1>§ÌM)ÔÐ O%Sýù8½î×Ç
-dˆür4îŠ$#œ™/à·Ñw $–+3¸]Ì„5¼T87Å]ý—‰Ø¥–…ZPŽü¢ X¥Ì[šÿ8™XpÉþCi€ó`KpmMƒ*­y¨À&ÕÇ*é\—l¹ïˆü° xr#L?)¨ù¹kvü¯â|V{þ–aÀB$ÇÉÎàj`ñh›Îëæîõ­QUdj5Ë$k>7¦|©™¬âÃöõÚ¾¤,ˆÇSÎbÎ=¯ 6¢ŽIÛž‚2üúð?÷ò)CÎ|æ¡î0)ukt ùþîo#‘Æ$÷s‡³Wgª~„ŸÙñôÀԥ;ºaâlèQÌãæƒhË›ƒÌð`
-Z®§Ñœ8Îeä¾ÏFþ±Ã,ô\5ˆI.èÑaM 4Ž´mÇÕ‹èqWM‘±•î·egcØøí «\[þT
-¿Á…æËU¨—xÙLDÞsäÓš
-Iö×~pºóE¦f}^!˜tQ°Ù’‹ƒEäì>‰ n|'ÆV²5D9_äå‹7â̬FJvõ˜2È­ÛŒ’ý;Û£K¿>Z&ú‰Àš¤þØɉ,-¯,Yت–=–ÏÞáÆX8?¸#…m èÓð¥žçßèðž–u¤<5åÑwÒ6¨´ÍÔ™­×#0±q“²Qý‰±ÀåÙëã=¥—;1Â&<
-| f Ég¬,=‘¥vp‘·xMŒé‰_b¬5
-µœóû¿ µ§öÈ4¿À#è¸?§ß7LíXʳŒ”ñkÌ€Zî»vSLR‡û 4 ƒ?&4 =cwÓ™7mÿ­8 ‡L¡ž~šËmé0Rƒù]N9ÄO:;e0vÈ(©6‘÷ôŒ÷ÃæÓ=ÔèÖ‡7œŠ?­)Í'á ž àÇ38ƬpYBà³Â|ƾC¬D?ÖD‡§-QÊ(6ò˜¤>Œö)€*#£˜òDUdùªé³ÓvU
-[`÷QìÿY¨OÖØJæÒ2‹„a¤.‡yMÙB.½T›.¡
-¥í’bWWž^¿§M?¼ªßªéë;ëš<™áh ±Kñŵž¢¨ÚÆóV1îcÖOÏ "ž³x4tÅ:l¼t@i×uÅ«»‡‹Á0“öë]RϺM'Ü>Á™?#ÉABlž=fÌì…ïé ÚiózõÔ¨¿!…+°2Ô’Ýzôµ¥Îb—B
-y‘üP'càÜ^M#R°·ñÃ4 {LJ B«œ»×ën¾HïŸMc–9|þ*S5ïV®ñKãÁ“üvÚJ¦‰‡’à°áR‹ÁPKw©ä;ÉͳðåH-ºOÖ²ÉâØÉ*Wü—¼éýšö•p…+èó®a7AÔºº;˜âR·~4ÿÕ|S®‘mƒ®W•~ ©Ãâ‡}DL×WF5J‰åéØ|¨i÷>#\2®˜
-šÒ30D”€`Ÿ†§¾ç4}&1xÒ¤Ö¥ ÎdP•Ý‹$ȾCO‡Ù’jÛvëö?`C&W'aÔCJ•I'sŠFðìM˼k©¡¨»°+X ŠcAÐÀ«á¥£ùr!<s%!ÈbˆÀNÑ* d3³Ê6†Ø0´+3ïÍNYÀ8îj•ÛP³7Þ¨VäÎc=$0€Ž9€òõ «£…WCÒ¸1å Ô²9L±ž±~óŸ –äWÚyüInÐäöÀ'¼I3 ú]`+ò7vÃÝ!’ÔËö—k«Zœ–(&4¨j„¸`é+àpôxÿÅë«SüWâ$åM7ƒ[IZÒýš®ê~‚VƒÍ:Ø\é«…Œ€Øy_à£öý
-.ÈëÃ6‹û¯™ÅSßcŽ¾Q&É5 fd
-ön’“,6"”@K;\ÿŸÁüø¯
+/Length 25789
+/Filter /FlateDecode
+>>
+stream
+xÚ¬zcteß³mlÛN:¶“ŽmÛö‰mÛN:¶mÛ¶ŽÙq^ÿþWoÜ÷>½w?ì1öªª5kVÍZkœ3Æ&'VP¦4™Šìœé˜è¹‰T•Ô ml M,2tB
+Ѫ&ðëöÜ(ÞÃÇ‘œåRMyû©i¯MH>c¸¤bq›‹bgÜë㤸>· +Zµ‹¥{ü‹q=v¾ ­™«O¼—«Ñ)X!íÁ/$ä±)$§ÁØ^‘w?í¦‘ù]€§“X.2)§©Êer[¤ .©»¹™ ;þÄýI‰ŽBà A¦¸¯»àÐaÁôÞ®|û³ 5ï8sêÓ†
+"ŸÍëã-ö .TÞ;”Ïè*Yp§«© ‹ÕÀKÀk" !œÑE¾[OžKA3æTv7‰.ѧü™"Ç S"V™bIÆ@Ζӧ
+
+áê¡טÞO¿UæÝ¥šÑ<ÑmËs]T­+¤O˜¶1¸¶ðææ#¶V0BøkÅø‹‡ÙÔ•º]Ö²$ò}‹ZZ–$ëe1¯¥P¬É}éîjÀ(RŽ›¡ÛDZù4 P™ bw×4ªeÜêI™A ¿RñŒ24§iÒƒo•æ7…j,;Ù:Œq«úÑNèHåÊÓBuNí|ÚÌ
+6q!#z~`i# VEô yA ã
+5?Ä…J‰¡?‘–x°Š:p´xî@ŸË*£WƒõNQŠÃómƒË@bÙ‚ÄÛ6=_ïc¨Å¨üÐIûVs/D–)h=[¿°J›ÔðV]èB¨öK6J‰ôÍî=®µ5ðç"YAr1äc¶Ð ô¢.é1ÄéÀy²†_Õ-ÿ)¥º*™ïH €Ò°@¿¿ßå|Ç1SsüîóFXF¢ÙB¤þŽ0¶m粿R‚žPï[#@U4K£»åí8c¨tÜÙÇUmÌ ƒz‘HÌkËKÙœ¨ÈÏC—ÝœÏÈcí¤šö‹›ê
+Ú 1ËÔå
+Éqž— êhËÏFÇ=êO”ù+Š<cÁ·.üIƒF&Tfj%v}Hæ®»º/Þ‹:€…tq>ÆSþRL|žíl}„¨IVâMˆ³¹¬|övW£UEqݲ–^`)d_„¯×aå0áï'
+µãJc 0Οó•wê(á·ŸK£êÅ¥Ç<ÌDø¨n {AVÈSb˜1’Qêg aW¾ ¿á¨À+:Q˜šš“ñ‡m¼º…·mÔ îy©¤»\pºAŸœ,)üE»Ï Êüœ‰Nó í—éEgB†Ý·ÚdŸu5C
+<…:0µo$V éÅŽi•Ú¤ËöÑÇÑ.f ó³X©f‡¹5JQ·&– %CDÌ\jö˜B‘u/‚§~;kµ$&yU]ôʉۿæIÎE¤Š”[šÜ¤ŒèGœç³>JýjˆÌUÔ‚*
+ e«1‹ïmÍ°–7p¤+’qy+EßÄ[·ü5ñŸòÀ^îF „}fá•Iû~c”sÄŸ[&ž¼‚Ÿ?/žaÑvãEÎY\T{‚ëv<ŠtcûpÚ¥AgÒg ]`ÃʉJÛv§ltê- \5©1&딠丯¡¨Mٰ݈?T™ðï.™mëßýߘVý4ÄK/Ññ“ê4„ T²(óìï@
+ŠuüìKœã!¥}=—à|ÖÀ¬B®ÈJH‰^M(B ¼µÂN8`æXG_æó"XÙ´èr6á`MÞ5f¨tÓ:JëiLÙÓ{ôx
+קµ÷YÏÛP–™­Î›ä‡¸-f: ƒrõñò;57ì>\ǵ¶ ®Ã¼}8&;DPí…eªî¢W¼'­
+aèqÁr1t˜9f»+ (*‘³-ÃòèRö£½gè–ß~n)véâlOŠeøÝܨë?PÃ-L¿Ol‚€qäµê=¬ŸR©Ì…×9°­zGB¸w{&=GHÑa*ù£8uÊBâŸèÎ6ZÔöŠ¸ÇÑ>Õ‡žC«ß]ü®A‹—Ú!2|XIœµr®5è (’v¿+ãïùF\4“®=åpß¹ÛÓt8RÎÀàx“š›„ÇÕL9[ôiÎ.¶¦ð Ri£´c=S‚<›1ÍÆv¢§6õÈ™\Þ²©Ôÿª
+Æi2ÐÓB¥·åÒ îÕ±Þ:D!€ÊW"²À˜òÞÅ¡èüxÈ÷|¡á3 2y÷n/D #PÖ2’©Èk­.؇Hd†£Lv{ÛñöûüŠ½lµt@ïH­¨­”;áBÑ2«C¬aCõIð#_”½ª†'î,ÏG¯ û)—DÆ*~Ì2ÐüQDyô¡ºôå &ßBêf†³Ê²è˜:³ tu ñ»þ9rK*8]©„·]ÆîCŽÜiŽJÆf§Ô 0ëRi× ð¦h a&¤·—ϲSz… õhßÝ0ÎÔH—Ì-zÑmžÛû S úQóÕFòב,<yt†¤ç“jˆLU\WóaSà¤hµR$@IÔ³®kð†®ËÅœéçºq+¹¤å`”
+þƒÁUÂæWˆÌ#Ü\Ò€h®&ŸÉ5é=úPȆ›Q4¢ÁÎJG¤Þ^¿Ò½
+…Œµ@w‡þKLàí÷‰ŠÆŸ
+çÈz%ÿjv꡼½ŸY/fyŸ&ž<tj«öÒlò?ÖŸÑqÕMêÕA•Ž—ÅïƼQa¸á; d:…­Ö`‡-^uI&¯,ªÆ‘ÜÏÆ¢VÚ57Ç´Ú¬3W'¿/ ÊŒ£Œ¤Ðyû°n~œ?xÿ棄ïr6ßÛS+#ÆB£Ï=¯Ui ƒ¢‰w5ô,·
+Cà—qžàî´Ô›‘õÔÛ÷5ÇPÍrÃ#Ä^ÄïŒå—“¢¡“ôâm‡{£ÊÛìF^¿¬¥V
+ÖY¢ï㸂çõ(‚Ê7º¦šßaYY®ƒµ‘î¯
+Z[Ä…‘ÇÌ® g{S”v
+…€˜!0"ªó:¤¢¯“‘
+£{t¯TÁ>žµÁ½¢¯.šIw™Rçè²óm+5؆+2¢¶¤Qûg ©!“Q¨¿E&·„•º"²Zhu‚è (4¡JRE†âþ [,›·äbU8ì`Hj¬F(Á2"Lã<û}蔸ÙÌívØ_ƒ8Z¢Ý|„Àh›œ_á³bŽ¾–F Èe/í‚œ6¿ì~á0€l è'oÖßN‹¾'tKà©H øêÇQud8ÖVX“'K \¸ÈÍ€‘•Û¬d Ô‹ßÜhû¹ÏýýWÅάJT¨dÝ'›h° ÙÞ @Ò«û3pw+Ä÷–ÆŒÅÎés—øj¢:\ƒ;mBÔí—¦‡Î®÷É€’N#ÒÀØóÍìÍ~êe¶!oEγqi{ÎÍ ÙDoM¬ÏÇEðMFðêã_Ïã8°©ý«¯Jw-!<À~e•\B+SÝP3èŒ"ð= 5}Ö;QÍõË^ŠïÊ¿[qªsâ#Ï·ÈXs© Å!µüôÕdx´@Æ×<8[õ^ìMÌVhx²ýç@÷Ô»¤‘ÏÙõCYÝ–«<PµÈØ…„ùå=°Üœ±üÞ¤Bk‡‘ ŸôÓ:
+Ž3^ïîtl7éEÐR^™UY5.ÔÉ<ÙŒ?tLúdN¬OÔÖ
+Ô>Ä*â-æ6Ò}É›@CÌ=ÒžæPÛÏÓUmeX†0>¥Š;qA0hºxôÌ%šæ¡îËÀ÷·]³c^þå˜[¶Iî4÷,_#5é¡ñ;X“g+É1¨ê#=µmuþm^G˲K‹c¦éÆ3 =U_²Ÿ}{óÉɶ=éÜ~Ã*Ly¾•µ1hÌâÇ„'Šƒ{ŸôHrHOðŸûû“7„æ ¿Z6ÐL4Ó÷€»Qª4™Ö®ÍåY»s¿¥¤Ò'w²¸q;F¸5ûfå9$X†/ñ‘2—¹nl¡-'jU¦wíû E¿•¡¥\H[‰Úû¦ËÞSŒâ¼ @¹8>Üp¼îf©óXŠ+6§Ú ¡¥0”j9Ímp\`Y¥¢«§
+–0@JèÝõ5@9>ÐmçæsS£pð\OÏJðôEXŠ±É¬Uâ”Û͆B¨Ç—ùYʦ˜nà^`nn$ÛLÆ®¬ÂÇýã?µòÔ5™ŒQË™Jƒ­×C‰½Ñ=´³q™»môûrlîÆ"HµÕÿý·”TÑ Ð)§^nL¾”¦–ãiõ@¨­Î~†+ÆÂÆkinuyÄMò.-ÛŃ«×åÝ,>áa•¬
+…>èc‹ÿµï"¨ÈIÓè ÛÝÔÆ./>À"¸x»øÙ^ªç-RR¨¥ñR-Åå\-‡´¤DoÞå±($ú&—øôV°â½âî”Ä`(f þQ̤Ön•W†&mr¦ òäéŠ7K¢ðUVž¼)(E3ô9€…Ûn’ª“mÎU@âÒS²ëÔÇ@×gÜÞÒ—Ppþ
+¶¨f»Ü–õ|Ï bžcÞ2¡„<¡N„_“‚ÂÕÉÜ~ `$@ÇдvW›çBº¼6&»SÊv¥Ü “¬[S‰×òñÞõT9Žþ¼K”)‚Zû)¸pÛjCŽÚN+ï'hssµ½6ýIa…äS4XäHA
+^”Ô~Ïœ(Xt
+zÿÖc:›#é¦,‹  l¾1M¼ï™áŒ ¶èIÊ¡5Díœ ]ÍT%f'Á”^…+>l$& úÃåú[úHõCÿ»_»ßðsÀG¹zÇ%Á¦«ËªIš ÚF=/÷ó~Ãç‘iç*Oéâ¶;¸‘_ºNê½&úÓ©8õÏh­°WäÒýÒ±wÒð3Æ©á¸X‰„»¸ˆRÛz99Ðø|y2+·º¸ôôÅò‹>&cc{¸mÜl|³„ýˆÈ7^€§;{í:`ØÏÓpÏ>ø0#Çù^|V”ñÚÀUéé,±[ý&¸¤h«¸YÊArÇó×J{D†:ðëÒÚ&ˆßæée¼ü×+[ŠÔ;¾ Ç-áTWQßmtÖUüÇ^ÒlÆ‘jpnå) Vi²+b¨¤ïëìl÷ØéØaK´x4èD0ž}Ó$Óï<¯l<>~ÚXvŒ‘¶5ÙüF;¼RåÅ-NSÎÖÏ)P¶’ maKËîf×èËÀÊX4ø®ó·œè—ôÑ–`9dfÍ·µÄÉmbc°k›íŽ¾¶‘nªºtw³­ ¢íÛŠ­²ÞY®%ÈBV¥*(<=Èn®±ˆ¢8w#Ðù÷–ºÒÑ$1wBú,1AjÕÅ#)K¼kòãùmË¥4ÚHkÛM\áfyÉ7ϽfšWp…ŸDÇÛ8ªÝYqRyœ:+äóÞ™? HÔošÃ»ÎJÅi5ÍERP†\¤äbchÚJé
+n‡¤˜o|YÇœ! ¾ÿ|`VÓsÕ'6¾ZÃ:‘ˆ†XµX–Oß•vnwspÙDbE:Þ]Õ–
+ÊлwB…È1ƒþ”¯úäUoà.ó+i‘ =ÈÕýŠN¬m·þÃxí.=Œ­5®óš®H¿><ǤíÅ6‰W¢óÕ³NPùg›ÊXtItàó
+ÂÞeî£Ñ|ïÁþlÒ3ë«a3È2À¦¼‹¢;œWË|ºaƹ’å|ßkõ@Rín-Àø A­©mr#<]b‰åô÷eœõ,ÖœvŠdüeÛ¹0ð0û .};“Íá“Jƒóû$(f ”-b4ÅVÂDk᤼;àSZR«ä*å½ß¯;l@‰8îXïLÁa¥(S}×9ú´‹¼EYaý ‚Æ©+g«¡f›"P>ç =pyEµ$C®,s§™eÛ¤O«¹·lœXì.ÅðÚP¢rnÏlƦi _‰æÕ(ûíÌñùh'³¹Ž‘Q]i-> 8F /'›\„@Hù½Ü{\dß—§S"Ç i8<hÀîÛÇAÉtã´¦÷
+m 3¡¹ø—)zõ%<§
+ÓÛ‰šSNÕ— =·ÞGæQ\iB~Lrb+×ŇbÄÐÙ•+¤Wi2ªhWä.
+oÉ1Ê0웘àÍk.sD•}?*åVMVÇp%:h¦·ˆú]9RG®å3/¥ñÛ@f 3öÁª®‘ÙµÿxTº‡W†×qNë#èô‡F0ôxƒO =­E:5½´è.Ü&>Sï$§ØrY§r–¹qJ
+i8WÚ¿\N[Ž”!öL,Œ'nâu¸våtÌ¢–£a¡ŠãµèÁ%œÀ /*w.ˆxé:”~5K(¬mg}îu1Ý3ï㫽ûõW¤®48P‚JÈÐ_¥3UþìÊtÖ÷Á•C3s-ãYYvÓ‚²Y ±µxÈk½S¢¦U·yÔ5ôÔb\z34V£r ,w‡~ˆå.…CYϾ5„]×Úµ'Ó›øs+qˆ)‚‹v«tüc(“Rlh
+ï|?ÕFð &‡Åi%DáWª®)slŒAè-¾Â¼`]‚þ¥Ÿ¹´¿½Úçp¦ÀÅó)†–z«.µ°½ã+fç.Ye8ÚzF‚ô³îüAÅ´ãñ!GÔ~0Ѻ<|
+#æk›\B23/°|‚ÖN—’ÞÒXtEiÄé(â8]€
+\J®=EÊ~¤¯€k/Pßõ—´”÷æýÖ7öÝ× øòœ†eô毒¨> ¾hÓ;(°äõ²4\–¸©? ePiJ~m×뛇£hb3d¹n½gŠŠ=¬ÓˆlQ,~KBN”†WÅ^"Œ“zÞT‘nNÖ®ÿZƶžßiýb.z<!qr.ÂË<J®p^ÞG5’!ãh¦- UøŠ‡vOòÓI#§¿,žà6ËW±þ$ä‹!ôBeÃyGGl »§ÄMIRö-©¬[­ïª¦Œ@¯}8K¢ÖĘ•àˆ×Gj4×NOÓøÕ¶¯õ‘†Â§íj¾¨Œ(Æ%mÑåÎDÕš9h> þ$®…Î\“©ªm´‚ŠÆ¨Îò&aa.òä^çšàu~{ •q¯2 ]}‘G@åŠä×aÑU®ó:`’PX@h&õx†HˆâóÒf†Bz˨¨_ïI@B&f4Mš¬.aƒ¢KBzê«!ªÿ3NP‰É¥9*š1zÆ\–|wQS…59f¶Øinµ¼IîË
+ýÑ ×òÈ_ûAówVäïjq'!1 mS<œ¶»Í² À­ "áì7zóÇHnØ¿jU‰f~-Õ·SÊvöñÀJqg”`ÇjYÔ˜.N\ø ý>èây\ÖÛ ˜ÎôAЫXÀþPË#-Ęéý†õ¾ð¥20ÄÙß‹„i=óYÃ$¢5Â'5D̸”ijÙªu昬iåOjãa!øêÊL™-ƒ c ÐøD‹ŠÕ««Ç•c#Ù=
+n®±ˆÊž¶ ®áJ<©ö; €îÜ x+ø÷­µ –'IטáŸoŒY™(±¦¬óÓE_3µ#d1š‘jsÅû³Rñüä~
+«…ÛÁ0|ØÛ¨rž[ñÅ
+n£Œˆàwƒm5†‰u“ Ž°‘£óq
+/U¼;Ö}â$X…ÚÓ´Kç«fàÓ*MM‘9Œ}ì‹À@ÄèßSš³« <Gëw²¾×+TR­–òŽÌöQ„ g@Gs ¡ÀÆ£E½4µ­l
+MÞúÅ>Hd‘$ã^ÃÌ[¡û/äX+Ít~ÅßþS$3Ùß—~z]ôúYhí²ä!Ô"'ðÕã:t¸ÛÏÅK`ƒ[‡Çxý4õìÐ!#çˆ/jÎpÊ\£ØiæÍÁÆ‹‚- ^è‚…''¿O òD¹Ê·êÞaw•ïí)0 õP`Q?x9š ü°šhx‰?·Ø c~ûZ6ÒQ@
+keG
+
+Ÿ‚„¨Õ/k‡ ]Ñ º/ÍxÂp¬\>™Lê}û(ù'™y ^d1] ÀGò¤­K\ÙL·(Û×9Ʀ i‹cÝ›õN ™¹n,:m$øçhÚV‡.¬
+ÈÙ!z»[úœD¸¡\™V\aü<I'bÜšÄÎgw—ì£;ÞüÒÙ ¤#~™6HùYS’‡•å蓳6Ò9f|Ðl}çšß‚¥/d¥Þ…vXËpd&—H~T §ÅÔ—s¬:×÷öÚèžnžŠÕ¥á¢ý\ñóÖr4íô+³»¥XÐvel›¢žŠEJ&vÚw·ðÌ:˜6WG'K9¯ j—‚l¦xÃ逖LÖ^Žqþƒ='\ŽAï é/*‹`~&Ë}UïV…ÆMlƒÙ÷‰x^³CI“=_k<S_óØÝîDÍæªê.úõ ®3[ù;ìÛ. $šÓžæSá2ZЯ
+ß¼'ýPb€XÑFM¿ÊœJ» '“ˆ¸Î„J‡ÄÜg*Ÿµ¤õµ§C*•ñ
+¦Çƒç†«4 yãöæšã§>Κüè¯>šbºØýúÅP¬
+ælî tV¸û‘–3qû%ŽY7‰‰p’u1$q…ˆÑÙÈ  ƒŠÙǾ¼\‹uûK¡&˺hûD'n"Q¢&¯iÊ7Í¡ú»šØiµ ÿҨ퉇Ka¯Ñðò(`hò쪆G6XðMÈ ²ß±à;ñÖ¶{õ°”H$3isCÁ†`Ã#: ^üëäçÔ{T\žCÙì¥öD.íðbU'çMPä Î“&.A0(œ”ûéò ût?…7Ÿ4;î¹ÁîRâUÀ0cQ¨œi)‚\ò_\òùÁ±§Ôí"‘Ïn¡¨çW¹@
+4mbA‘., +ù3ÞräÉ7zz¸xº„vFà5Åï÷`>ƒ¿ Ê3¢jÐ1 _òÿMšÎQ1Y©à$SÁÎꨄó‘ð,?/øŒ#q¹,•Mþ@š7Èlf§¯•1NK¨æ×$£`ÈxEŠÕ 6èr%ò1+Éà÷ †Cp³pÜo†WiÎë*$•FxO.†@Mñ¹™å«i;Lg{ã v
+„,˜›"óšœT&iÙÎà±n”:Èt' ¢ª¬õA©AúÚ†ô ˜ìëI¢ÔJÏöG)MûüÅÁù½¬‡f¤Õ<mÊ¡žÄ«|d‚ÉŸr¨Ù/•‰NµÇYû‹Hª¹®|)³Œó^£»¯Ù¤0B¯+Ìxƒôt~乃FÅÖ–þo¹6”¿x‰ï;MܪðXB“ô¬,‡C#)bðùðVÕwЙ"§Êh—UZ‚žÕë}S§ðl¢@vM 9Jà½é¹Tò}(ú¶±©Øb«çsÈIS-(
+G-ƒcD¶–:ß^è†ëÚ8¹g¯y,9b~¦œáV{pî“O'þ’G1¡½à1–ü¾"ÃQíFV©wVŽ¡ÂΕÏa;k²„¼5tÕK®¿ÈÄ´
+&{b¾é\QÊcèâåKŠ¡Û€•\±"Ó{E),ŸŸË#E‘·iUHš™·'6 &<i[ÞÀÑçºËÔg+éA¼Töl¬n´•ÿRÔ—œÄù²4ˆ/åÖƒ ZÓoíضSG‡EŸÃqÉÛ³í±FÁéÛn´!19÷÷. ý¥+õh¨Üíïs´q×0 2|—…ÃtBƧ´ä ¾œJ3›n`m$Ä;Pž=Ì!·þö»$Q¯I cQÞò>u¯_«÷–¤ËÜ‘ÛàÐðÔKÛ?¼ û©)ÑQTóQUm`¦iø<uè¿>:Ñ[—§sø®á›)% ¤ç7 óD¨×K×F´XÖŒAHØú¸a—/« 5:›†Šú™ïn¼#`‡+»Þ[øjXZNiåJx)T»\—ØãÚšæs÷DlIÚb`·:eÛÄôöïT£º)£&ïyd„ãì°3e2ò–/@
+ .Ó0']Ó _Odqâ®Ä–üå…­>#ÞWÖ³cRªv×Sž¼XΧ!8$õËàí 3D=ón“~·ÁŸD㕹=’ô™h¿IÒîÇvƒK>A¨sÎÞtݘÏZ¶G U^W0åõ®’•¤¡Íš’
+/<˜“}ß;ëOжrš³<ˆþ–hMèj‹â×òų@W 4tú:©ë•×`±–T¿/à#]ÛÍN›‰öÍQ«ÕÇØÑ£ƒžoŽzB}ˆŒ¢ÁõSÞ˲ÛA!YÛahZg¼¤u|W¾qþ~âWt`us2yX‚
+¨El* Å3/ZÑÿTãi.)ÑÍ¢G÷8•{ðp œ¾!î4½á´ÞfÍ+ç9'LF¡»^É¿Nd*¹ÆhÇŽ g¥n)ZR¾œ2/@KŒµK¨øXI6ÇRÉ ëaµ$ÅîN»-¢'¼%+iâ?h%Fbs„òj\¥­¡uËøÄ âÂêáÄí(- ¯!Ö0\÷è|žÀ
+¶ ƒ ¢E2Ltãæâè¾I;Æ|ˆ»µ]0ÊÈ!çÛJ¢b^ûÙ­&×à}»'0qT[}yë&P½1ÞAæá^™0qŒk7Ù¥±ßbª0Äüh«N±D3Gˆ¾_²ßý&±UG·b`üÂO|=ÇÎYדnj‡üG tÆδ/Œ±§ÚÖ%t}šøhPÀgz͆ª©d•î2^G¡¥o¯¡Óü‘UC‹)Ö”ÖSˆ*Ñ’È:k@o‹ý})f°+LXnÅ@ê_ ß2Åiâ(ªt…Þ¨¶–+ÈÛk¿(ŸQg䔈Šfl.¬¤þË8èÖâ¥> ø|gúÜ”
+TpŽ‰ß¾®º]+.;+¼•ÝŸô6¶èhÕmØóÚ¹ ˆÿwkÍn‹ØÖæaðÙFu—k\!Ïé“>í}Éþ²ÒS°ÅìC½ïPUÈÉÁ¾Fö,éà¾eö4°Gñeá ºÑ¢Å"w)œçzO§$#g^†¾I†b¡lì4e—8&áâÄ«ðÔc‰þo˜iw¨ ={€õôI=wlº·(n'˜}ü;h|-Pn%Xª²ˆ~~»'›ò!é@Õ]͹à*îªDÝ*õæO͵˜ý¨¡Ò-s‡˜ÐIò3)‘™{¦_ÇWu†ùµ°\°%ßï7iåÜG¥DÞ ñ?’|%ÆüiG—lGê¾L‹`1îDx,½‹ŒÊp—š‚D~e'K™…V,u¤>ŸâìçF» nLFäè”.1°FÖˆ-oË”pÊøcó;6³ùFma7A­CÕW'éÞ¼<«1„6œ&³ƒF5Ì7Òo`¥dº%<‡|W¹[õTú'ÿX'3§ ]…±åvR§ó(›ÜOæÿD³¯ir §ðßù¾¿¡Â¯ŽˆV!"ñ/Ô­‚VcYén‚§ F#ütñé¤DÞ@Ä`] gO»{¬íWxj+.ª¶(XNô`bŠ§Êé.WQT2³Ù‡y©X¦Ž(÷|Α‘Ýv*¤†Õ¤D˜Ï‹ÏâM[E Ó
+ëá0íá3õFt;ÉÁš¼‘Þ<ÅyÕê©–ze¢lÒft£?ÿF%݇¤G[dÊ°ó2¯|?s‡·‚ÁÆ9—¸,k/KÁØÖI_ GÂ+Š$ý v$¡G|7FiÃoÑLØS‰µ¶‰V6bBš×F¬zÓä·Wè߆Û#¢š»°žq"® ¦<I6Ãèýñ4
+Û–åÃ{>;³Ä¬²ÔÙþSXqå§%Œo… Š¥]ôêûæ‰ÁyP;Bi)Omq”©{‡+™ Y=Ëv—0ÒË+AŸ´ë Ó&5Š÷ÓP„R'ë-â+ „ÛƵq›Ý“<–áC“Þ®›8ÔÁhîÏ#íÞ^tG†°QbŲ)N#†·î ?±°ù¦„•›£æˆa$(H쵄…PZsÑ&†®é¶àb’ã°¤Œ0‹§§ï»§óD‡~3:+éØÕä}÷ 8ñ`î©?ßÓo›wºFWÐéO´© 0Èò¹½¶BÄÛp =d²ÿP-âëÅèTÊÏÞg~®ýú=£g­l´þC}—&³¯ÁŒÊ÷ššIîä™é9©±ùÉ•àõ+#ž¢˜£ºþ\Öƒ#ÞkÝŒë&t0ÊÝá¦7Ö¶¡ä”5jÌÔ²ÉwvxÙ–î›à`¬ç÷ì¡"a¡f*í`–zL©b¤5Þ+6=jô{zÌ9ùŠ÷´zû¤dI7ý¢éaùgÌ]rä–ºúhl=M(jtn˜3à ¯L2èféòÞ¹’IPË—~/+$c ª‰Á½ˆã+Z ºù­
+Ï{ªsåšU#ô½V¼oØ6‚ž€‚êƒ37•(S¸nÛ\+5ˆððr~ÉžLO5Ÿ?žUaÂCs`~I®úb®E»IÏZ0<LPÛ~²|gUkìFÒ`×0ÖþÈÙ [Â3䀳ýÜ;ߢšìµèÓxƒÊ 'ÉÇWõ©>¸y‡(.Uôë ´ŸG}µ‚wëN<heÕn']D³C‹u„̯ä?O V†w9àÊHýžt;ƒÀv7vŸT¸[xNø%²OfpIø_$§é5.¾‰ìZÌ
+çßQ-<F_¾Aºtï=Wxi¿'SŸ{Ç4 ¡†[PǦØÊv±­o*SÚ®²2WÿWûæ°À(ÐضÕØnÒÆnl6lc[íL&ÎÄæÄFcÛžØNcÜ»¹Opwÿ÷Ÿ8«³=ÝÃR.ÅE…E‹UöÁÎtZ‹¸»4Àâ)³SdÖÑ´S p@E‹iɳ×aBk®$^‘½ùèVŒ× µæv1’qpVnªra\KJÃ02øÏQ?”KñµyTˆ"\ºg‘K®™Ö„Ê›Tc/¾-ª«1ïkÄó çôç%E ׿ÖÃŒ±Læ‹ØÞ¨€áýf¡g·/7Å¢¼R[õâ7ï™Æz’ø/Nzoàû¬åäckƒÇ›˜Äù˜Võð:)ÿýãµüþéJ
+ 3n
+ÿýûAL”2àC¼IÑ2VÃ$:9Ûö¹o„rcl¼Î]üÉ%ä[&=ë6…ï¾ëiÈ¥øOŒ‚ã$K¿h«•uÕ6Iå/8dÉwMNNX’ÔZ1(Ö¥ô¤`ÑkÙ°Ô‚7U%bŸMWž•:+úa™šíù´Ïè΄Ÿ,^Ç0Š!qù«N6@ñË«µ°¤”¯S©iÝÆ{ÝÇ>_À
+ÿ?!Cçcæ^‘O}ÿƒ5 “Cü!ØÉ»®?í|”+¨4ÂöªlØå½û$†,øá¾/ùt£ËzÒ~ج¡1ш—~DÕ1ˆ%ÀlÑ„A·ïª©þ5c ŽŒ·(ˆèß…®tÞ6ž«¨ý+>ù¤" µÕØ®¦?¤Fn®¤ðÂÀ¯BˆCÍoä ÛV ü¾‘«`$¸+°"¤u¡%f ?ýãŽVãüZékK ²}_î™ééË@©éŸ­z™xzWáQ&gvL®ÎØÕÏƉÈP¨î¬/uâ¤á£ §XdýÿÖ•fB]
+:À€•áŽ±¿X8Ñj‡Œ˜>Ág{ZÐ×Ø°i«‡ºyDj"Å jµK–D¥«œ.¯üç”äàd7X‘7æ<¶’Û*¢†ED6 
+” ]´±1Ü?“¹FÁ&¦¡l—FJÐs²!½‹Dãpù!/dÔˆOÄŽ]{TÖƒ:_IîÖáíŒãH%#ˆ1`@®Ö|Èuåñ¢O¾.$YP'jŸ?¿5×^Ü‚îY%’ >É,MŒ20 HÒV ™H³ÊÎÒ—àýŽ³Ñ]E}Tyƒ¿Õ´9•&ÝÝ
+¾²Sî¹”s¬ ¨Ë¶´óEñźA/Me‘Å
+é >Ÿ¼Ã<»ê
+8‚ã*[KEUè)ùa$¿N¢µ øïÍÇ>:Ç4Ø-,¾Ÿò>Þ¤¹µÀžSƒ…n5É¡è7»~²§bí–L
+•¡–¸CŒ#¶ž©Þ.ίè¿·zÆQè}ÛÌŒ6™Äò"ò¼h÷üõ2ÿ²,›û}‹0~77_J¼­SÕdj 1ø7nÅëH‘óx>/'7ÅWWâ7'Žú yÒ>;Fç:ä{g'àÉ.C»4H%ì²õ8ÃñÒj MæúmÒ“<ïPѤ}RÐQ­}Gý.\Ìûþïã Ú/X…$Ѧ{ЗÝØMÉaúèÜch¨$D
+‹ÁcB
+AàÃÐ> 4.Ðt’ÁýŽ`¡ õ1uĬS‰aÏ çF^V-š>¡ýØN ñ‡0åT¯Ù
+·è‡7ëéBñ(9™ÀcY+k$þŶ«Œ=ðµ¢QwL ä<(ró`,XeG÷¦ÝY–‚®ùÕKé÷ÈÞHC°£ää$=üæ…q
+_Ñ=d´)î`Åœ¬~sÙ:Uµ ´§ÞV¶_K!Ô¦`‘EùcTñYŽdÊæÎx¹ÓÀÏÕ7s,|äºS†ííRN]exÀq”›ý-Ë`ë`‰¨ÖÄc±¸.u¹g9ºBµfœ:îïæ2HV1ÒÎ<lš”¶Øµ±HiœQ‘5ü»ž¹Rª»ôB€î.VÂ˵ävŽí®)üfÄ?æˆ,ÞÄoà¤È Íæ
+ôéeÉþ&‡2"$8¬íÛãO˜ˆ7SÆ,é
+±õñ¨E'Oƒ¦ò¸Žœ­²„Œ¨ISŽ§ìº2!²³’D‡H¶ê;”|‹!¶jè²_rDꀩžÖ¸Øã}ˆ8——T²|+Å׋8¾ûW÷šo
+†?Å, Ô±™x¬ç¥\3*Ï©C¶q0ëß½«™Ž>­jâÄ>Kt¤)¦k>(ªK·#:›xMµ–Ð2²ßñ®ÄýRò¡ì‘wz!î,±•ÁÌõ
+DŒ–¯ØØ®0o´×\Ú²{löjâ­°C¨õ3Lu3¤RLyz§ 1ÛÁÂË6».} À|?ò{,j¢:µæû#-ÝÑ"åHbˆGžaæÀ~À_tݶÛàE•
+ócÆ
+ݲ+‡S?èoJ£K¤
+ÓþL5ºÐ$p•ü›yBÃ|5»w^þl23(ËÛô€åµm‘ï7ì·5v°“’._ô]ÕDO¸XR6ö}ÇÉÉ
+Û7Ñ8úŠßî7;°”—\&›ˆÏæÄeâê.s¤ÆÑŽ…Y0´ÊéÞÀ âžì ‹x4ÜÁw\•fèöê°¼Ÿ3pÇOy³Í4ù”-†¢£À ÂN¿ËþÙP³z[´‹üò®¯˜ Æ®-×I£+”–öH34PçM÷|´wÁ°Qv@2vºŒR¶f¼Ÿ4È,²,BÓœ“Uêä~ó‚ù·•6oáéA+K?ó FC¤h¼ÍRÚ_±L²"çªÒÍ“÷û³ÔBKŒÃ(¼shEŽmä_ÞÙSI f8¢lEúKAfð²ÜeM¥ ÐŽ™Ü*ÝS‰§d#…$3u}!jÌïƨCaô‚”¿•Ú Q,Ü4ŒT=AÅ?AUJ” e –×S<)UÇ‘¡„cc lÛ mvØsÖË(?ú¸D˺¯xì/Pç/·‡ðbÞ
+ËÚ."dšñãí·<ÈAmMãsåýëà½Æ™ûÓKæPú iìЇÖó!œi "
+RY,ÀrÚ° ݧ-¦£<@$•N\×:6EwFàC´Y«Uvvµ×çên¿ò\Vê6â~òT¥•½IýA<_½µ™íb+ö@ö­xž>o´x(°‹àšƒû‹ÿ'õeÓloZK’8´†á'ÔpøºÔfžni(|"¨,ÿ°®u ¨‹êûÔˆ,Фè¾9 {+¸$°w/ž‰’&3RÀ¯„„cÁ šOmÏHµ] Ú!ÝÕJ$Žá
+V‘<}6j]'»EVîhû‚}6¡ÝÀ6àÛ·o÷CfÀ¿ièﬕò1e·)(+‚§l¦…ãƒÖˆç\àíÈìk}/y»—ìǸoÕóÑ#Žuo'i”FG œpÖCfïÌŸ¢7j½W¨évôœ­FaÇ¢~®|Z][pÔÖù(Ž¥å –pÖ– œL®€î2Ÿd#FñD§ðïƳK“UðIó‘½ØÒ^¿ºýO4Jh%9rCØ\\ú+Þüæ8[…}Ú ôu¨›ÔV¤J»ˆ¢<#¡%ÁtÇ2å 7ÙIŸÔ®O™oßpÙêÈ—µ9 §.†*iTáŠNG‚÷Yk(ÅiJÌÇgÖ'gOZU\òo®\9F®hÛŽ²v@›”PN•ªþ|z¥»"^‘—ËN§³$Ë'‡kWØœ.Þe#ÄÚä/ª«:I!îò@F.Ù§N,X!Ϫ%µpºDÖEÐ’6å5eFÙ™ÂôÛ’EöqäœØ+R²Ÿ]C~=ëÿÖxP„»w(ŠÉTn ý£êöÅëGÏ!_/Ä!„ûݸЩîçCs›äJ §±üð@ÔÖfË4á ü%å/«‚ÎüTï;MKð"3¢Îæc7 
+Ú–þb$ˆF›š×4ÌGÂw6 JBÊA©­R"±#ªvw>!*3ûLß´ÖaxqUR±™^3îjÕƪ®vOÍ+ê] N nìþù‡Õ¨¸®âƒÑ±ÕÉíÍU
+`õØ i:ey/ÓT“îüÃg{qª}ŽTr 3ý\:×îY6Ò°’Ù<eÚCÈ_üiš–Qm–›#öïÎTº9\œëyíŽ&$ÞñeÞ I4ðúl#ÿ¿{ 2/ô)™®#0„ÇB_ò l•û©¥×ë¥ê:&T‡í¨9WÚ!’q¨ÿÁTˆÛ¥â«×™a9¦ˆRPÕ½¤Ô_i&U—M“X<ÜôYÈ«¶ª&v@¤àÆ2˜1j 9
+ƒÖù9üÞë%CßšAÛ±·ÁÿxHí´ËúD®Ãn6j­°øc„-± ‘F®mð€äÓz#ìA;L {&a0%­j8ÊÔó£{Gµ¢=4‰¤)Ú[ôÐÓ°ÏOw¥Ç÷MªºA:X¹Í¶Âv4ihìä×s¾ø,‚ÆP’㉖ Õù™\†@¯Á±ÆÎßC —èœFì§M¹"â“Êonn_Ö³ÿLBfFÄ  >;xŒoù3‡ý%¤àö.ÜÍ‘8iòzÍ´ÎÈéÕCùÔîÉ(ŒŒ«ªû-äd˜6í‹(ÇJT*L_4¥öÍü…°í¡M¶¤íâ‹1Ö`×xÜe²lÜá†Ö/®;Gæ+àÆÛÔÜÞ釾{å
+2K(¾àÈrG€éI^ݯ§ËœE;ÉëZ$„)½J%† * ÷%„.Jr–&*¹Ü¯Ms¶°_k„îš ¿NÆS»‚wX*ÿï­fƒ=ºðW=›±7Zx‰’d­#ó’1ãZ˜5'`N @­@Ótq¶¥ÙƉ›–îà—%Š7ûÙ¹%.Ìx¤D—ãðÁ³b‰C5ø Idõk/ÅQŠ?èxãê5³¯ÄÖ>Òðuowõ=–è9­Y'àã« Õ‚zɦ±¶Ô‚>N ;}`÷*Ž¿ÃÞƒ$“ƒ†Ï|£ã·Ä#@ºêÊͪ²Æ.ˆX³¤ ¾àŽG¿¯ö„«‡w‚MšZögsÎÙQ1ª¡ï±ª;_þSì?“áx´ Ÿ‚^¯I«˜E2•“§–κÛw!l¾:‡_¼sªÔNÿ˜~ù™Û݃[²3ùULiµeižÀìe%¥½˜¨üß’O¬/°”:¿èx>D@þ¦ùòá=9'»|»Ä½Œ©L²Ä/–ê-‚½ÎìÃsœ” ~(áà,åpƒ¡ËRs,Õ:Ž±ÿÃ6hÆËÔDÞï^ÑêI¬'k𽠱ĞÙþ÷ŸøŸ…ÜÈ Æ› ;™l+ä­ñy̼Ú(g`ý s}ÔÖ’×åù$Ï–c†ƒvjlHM»kœÄ^ý08ùqS}ã!<¢¥mPYm¼ÑјÃs:öhª6¯!Û(sD¹16äÑ?«r.o™Éûòˆ ¾SšÉí³•õP1K²EreS‘(§AðÖ?žÔo§G,C<òΔ½kuló µkX“ÁñÓ—WOGˆ‹v$ÔÃÁ×a¶D´­ƒæé<xç x÷DÉ ºBõoÙòQ3ª‘GÞŠgMyÎëæ:ç èWƒ’¥oáµ=£öb2ð»±K<6ö%J{
+‹ÅK0}´zc?¹ L£Z^ FªËï;—þ d%CºŸüÂ¥ü¨)0óšâ5µû|#ñÊ1¤Šµ– Pgm _R„®z1ÙïO,îSò[³ÃY[Z…-¶2
+{å]­è«X• ²ßæF]T%9FáTâþ¥}qÚxo‚{w;w+h|ŠÏíaq ˆíX7ŒÒz¡î±vñ¨ˆæK܉bs6Ÿ±™"‚¬|;¯mš®u˜4bƼý¦þ 7õ™•»Ð¯l(hõ)&I—¼¸óÝ ô#Fê%yDôêWÖëÏäôD‡߂ù‘|}Å99Q}â> uôÒ§«h†:úVLãÖzBžÅŒå’F'üÕÆQÓ/9ÎFÝҰɵ#6snœjGöXã~ÃéPóLpJýœ&wB˽óÂób17aªÓHj;è•ßÐðS½]þÅÝpÌÚò“ ­ªAë8Kžpªä¦<ëñ-ùS¢äëÊõ&}9c­àÒo˜òt3aëc` StŒÔDr3œ–ic#Ñ‘x"£ž7ý³–þl­ÊêIF)^ˆ×LÌŠ[h£IµA _#ƒc«¬LÔ'PŒ ö–Tñ™»,Š x´År
+‹;dTx¢CŠÚµ'x^3$|ÀȽ¬4ì^ᜥ$0ý'©´s ác@ÓAÙouÖŒÎ@@‹Ù[¨ñÄ#rµì‘ö9s¤Nè2êš>8*û@‹hËçESæIh’V\ºw+›øYET Žë楋ÆEêæcfCoŠåÚM¬·Ôþáéw„IiD¤^‹J­÷T¹J†a±kãÂú ôꟶÊçÆck€-T ÿŠ×Ý¥èÝû
+¥`M/\oõÛþJXSù6”¿ü'ŽOØLaà¨oÍZNõµáø÷P³¬æ#À«-’·^=èCp§“´ñ»wÓ^»±òž,àìÎ-3à rg‡lÖ:G>
+‡û$Ëú*Ï[¾'е5Ø̽þ^¿‚@rG{XÎN3?Ü&Óvj½ìÖfl3O­ˆÐ¥\á" ÝJ)P\°7À«J&zgT‘š|†ñhÝh^r×X&âhŒç]CŠÒ÷ˆÂú%#ÅŸß’ïçUUÒÙ$ïRDäü¾Rk¤zwŒñ­ã—Z
+UßD„j%‘{7¹’&LoÅLó´T0‰*
+Ë—ÌF+uå| ã_ìŽ'¬gk"¸qáD]²
endobj
-714 0 obj <<
+930 0 obj <<
/Type /Font
/Subtype /Type1
-/Encoding 2140 0 R
+/Encoding 2705 0 R
/FirstChar 2
/LastChar 151
-/Widths 2157 0 R
-/BaseFont /QOWXRN+URWPalladioL-Bold
-/FontDescriptor 712 0 R
+/Widths 2722 0 R
+/BaseFont /NSYDKZ+URWPalladioL-Bold
+/FontDescriptor 928 0 R
>> endobj
-712 0 obj <<
+928 0 obj <<
/Ascent 708
/CapHeight 672
/Descent -266
-/FontName /QOWXRN+URWPalladioL-Bold
+/FontName /NSYDKZ+URWPalladioL-Bold
/ItalicAngle 0
/StemV 123
/XHeight 471
/FontBBox [-152 -301 1000 935]
/Flags 4
-/CharSet (/fi/fl/exclam/dollar/percent/quoteright/parenleft/parenright/asterisk/plus/comma/hyphen/period/slash/zero/one/two/three/four/five/six/seven/eight/nine/colon/semicolon/question/at/A/B/C/D/E/F/G/H/I/K/L/M/N/O/P/Q/R/S/T/U/V/W/X/Y/Z/bracketleft/bracketright/a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q/r/s/t/u/v/w/x/y/z/quotedblright/emdash)
-/FontFile 713 0 R
+/CharSet (/fi/fl/exclam/numbersign/dollar/percent/quoteright/parenleft/parenright/asterisk/plus/comma/hyphen/period/slash/zero/one/two/three/four/five/six/seven/eight/nine/colon/semicolon/question/at/A/B/C/D/E/F/G/H/I/K/L/M/N/O/P/Q/R/S/T/U/V/W/X/Y/Z/bracketleft/bracketright/a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q/r/s/t/u/v/w/x/y/z/quotedblright/emdash)
+/FontFile 929 0 R
>> endobj
-2157 0 obj
-[611 611 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 278 0 0 500 889 0 278 333 333 444 606 250 333 250 296 500 500 500 500 500 500 500 500 500 500 250 250 0 0 0 444 747 778 667 722 833 611 556 833 833 389 0 778 611 1000 833 833 611 833 722 611 667 778 778 1000 667 667 667 333 0 333 0 0 0 500 611 444 611 500 389 556 611 333 333 611 333 889 611 556 611 611 389 444 333 611 556 833 500 556 500 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 500 0 0 1000 ]
+2722 0 obj
+[611 611 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 278 0 500 500 889 0 278 333 333 444 606 250 333 250 296 500 500 500 500 500 500 500 500 500 500 250 250 0 0 0 444 747 778 667 722 833 611 556 833 833 389 0 778 611 1000 833 833 611 833 722 611 667 778 778 1000 667 667 667 333 0 333 0 0 0 500 611 444 611 500 389 556 611 333 333 611 333 889 611 556 611 611 389 444 333 611 556 833 500 556 500 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 500 0 0 1000 ]
endobj
-715 0 obj <<
+931 0 obj <<
/Type /Pages
/Count 6
-/Parent 2158 0 R
-/Kids [706 0 R 732 0 R 742 0 R 797 0 R 861 0 R 923 0 R]
+/Parent 2723 0 R
+/Kids [922 0 R 948 0 R 958 0 R 1013 0 R 1077 0 R 1140 0 R]
>> endobj
-954 0 obj <<
+1216 0 obj <<
/Type /Pages
/Count 6
-/Parent 2158 0 R
-/Kids [943 0 R 956 0 R 969 0 R 980 0 R 987 0 R 999 0 R]
+/Parent 2723 0 R
+/Kids [1202 0 R 1218 0 R 1230 0 R 1243 0 R 1254 0 R 1261 0 R]
>> endobj
-1011 0 obj <<
+1277 0 obj <<
/Type /Pages
/Count 6
-/Parent 2158 0 R
-/Kids [1004 0 R 1013 0 R 1024 0 R 1032 0 R 1039 0 R 1045 0 R]
+/Parent 2723 0 R
+/Kids [1273 0 R 1279 0 R 1287 0 R 1296 0 R 1306 0 R 1320 0 R]
>> endobj
-1068 0 obj <<
+1328 0 obj <<
/Type /Pages
/Count 6
-/Parent 2158 0 R
-/Kids [1053 0 R 1075 0 R 1085 0 R 1090 0 R 1094 0 R 1101 0 R]
+/Parent 2723 0 R
+/Kids [1324 0 R 1331 0 R 1338 0 R 1343 0 R 1364 0 R 1374 0 R]
>> endobj
-1117 0 obj <<
+1383 0 obj <<
/Type /Pages
/Count 6
-/Parent 2158 0 R
-/Kids [1109 0 R 1120 0 R 1127 0 R 1132 0 R 1142 0 R 1148 0 R]
+/Parent 2723 0 R
+/Kids [1380 0 R 1385 0 R 1390 0 R 1399 0 R 1408 0 R 1415 0 R]
>> endobj
-1158 0 obj <<
+1424 0 obj <<
/Type /Pages
/Count 6
-/Parent 2158 0 R
-/Kids [1152 0 R 1160 0 R 1164 0 R 1174 0 R 1179 0 R 1187 0 R]
+/Parent 2723 0 R
+/Kids [1421 0 R 1426 0 R 1436 0 R 1449 0 R 1457 0 R 1470 0 R]
>> endobj
-1203 0 obj <<
+1480 0 obj <<
/Type /Pages
/Count 6
-/Parent 2159 0 R
-/Kids [1195 0 R 1205 0 R 1214 0 R 1225 0 R 1230 0 R 1236 0 R]
+/Parent 2724 0 R
+/Kids [1476 0 R 1482 0 R 1488 0 R 1496 0 R 1502 0 R 1508 0 R]
>> endobj
-1245 0 obj <<
+1520 0 obj <<
/Type /Pages
/Count 6
-/Parent 2159 0 R
-/Kids [1242 0 R 1247 0 R 1255 0 R 1265 0 R 1269 0 R 1273 0 R]
+/Parent 2724 0 R
+/Kids [1517 0 R 1522 0 R 1529 0 R 1533 0 R 1543 0 R 1548 0 R]
>> endobj
-1282 0 obj <<
+1562 0 obj <<
/Type /Pages
/Count 6
-/Parent 2159 0 R
-/Kids [1278 0 R 1285 0 R 1289 0 R 1295 0 R 1306 0 R 1310 0 R]
+/Parent 2724 0 R
+/Kids [1555 0 R 1564 0 R 1573 0 R 1581 0 R 1592 0 R 1598 0 R]
>> endobj
-1322 0 obj <<
+1609 0 obj <<
/Type /Pages
/Count 6
-/Parent 2159 0 R
-/Kids [1314 0 R 1325 0 R 1332 0 R 1337 0 R 1342 0 R 1346 0 R]
+/Parent 2724 0 R
+/Kids [1604 0 R 1611 0 R 1615 0 R 1622 0 R 1627 0 R 1637 0 R]
>> endobj
-1356 0 obj <<
+1644 0 obj <<
/Type /Pages
/Count 6
-/Parent 2159 0 R
-/Kids [1350 0 R 1358 0 R 1365 0 R 1371 0 R 1378 0 R 1385 0 R]
+/Parent 2724 0 R
+/Kids [1641 0 R 1646 0 R 1650 0 R 1654 0 R 1660 0 R 1665 0 R]
>> endobj
-1398 0 obj <<
+1675 0 obj <<
/Type /Pages
/Count 6
-/Parent 2159 0 R
-/Kids [1391 0 R 1401 0 R 1409 0 R 1413 0 R 1418 0 R 1424 0 R]
+/Parent 2724 0 R
+/Kids [1670 0 R 1677 0 R 1682 0 R 1692 0 R 1696 0 R 1700 0 R]
>> endobj
-1437 0 obj <<
+1712 0 obj <<
/Type /Pages
/Count 6
-/Parent 2160 0 R
-/Kids [1433 0 R 1439 0 R 1443 0 R 1447 0 R 1454 0 R 1459 0 R]
+/Parent 2725 0 R
+/Kids [1705 0 R 1715 0 R 1723 0 R 1728 0 R 1732 0 R 1736 0 R]
>> endobj
-1486 0 obj <<
+1747 0 obj <<
/Type /Pages
/Count 6
-/Parent 2160 0 R
-/Kids [1474 0 R 1488 0 R 1512 0 R 1522 0 R 1528 0 R 1538 0 R]
+/Parent 2725 0 R
+/Kids [1740 0 R 1749 0 R 1756 0 R 1761 0 R 1768 0 R 1776 0 R]
>> endobj
-1552 0 obj <<
+1787 0 obj <<
/Type /Pages
/Count 6
-/Parent 2160 0 R
-/Kids [1544 0 R 1554 0 R 1564 0 R 1574 0 R 1583 0 R 1590 0 R]
+/Parent 2725 0 R
+/Kids [1781 0 R 1791 0 R 1796 0 R 1800 0 R 1806 0 R 1811 0 R]
>> endobj
-1603 0 obj <<
+1820 0 obj <<
/Type /Pages
/Count 6
-/Parent 2160 0 R
-/Kids [1596 0 R 1606 0 R 1616 0 R 1623 0 R 1631 0 R 1637 0 R]
+/Parent 2725 0 R
+/Kids [1816 0 R 1822 0 R 1830 0 R 1837 0 R 1842 0 R 1846 0 R]
>> endobj
-1651 0 obj <<
+1853 0 obj <<
/Type /Pages
/Count 6
-/Parent 2160 0 R
-/Kids [1648 0 R 1653 0 R 1657 0 R 1668 0 R 1672 0 R 1679 0 R]
+/Parent 2725 0 R
+/Kids [1850 0 R 1855 0 R 1863 0 R 1867 0 R 1882 0 R 1896 0 R]
>> endobj
-1747 0 obj <<
+1927 0 obj <<
/Type /Pages
/Count 6
-/Parent 2160 0 R
-/Kids [1689 0 R 1749 0 R 1805 0 R 1859 0 R 1893 0 R 1902 0 R]
+/Parent 2725 0 R
+/Kids [1908 0 R 1929 0 R 1936 0 R 1942 0 R 1952 0 R 1958 0 R]
>> endobj
-1912 0 obj <<
+1973 0 obj <<
/Type /Pages
/Count 6
-/Parent 2161 0 R
-/Kids [1908 0 R 1914 0 R 1918 0 R 1923 0 R 1934 0 R 1939 0 R]
+/Parent 2726 0 R
+/Kids [1964 0 R 1975 0 R 1987 0 R 1995 0 R 2003 0 R 2007 0 R]
>> endobj
-1961 0 obj <<
+2022 0 obj <<
/Type /Pages
/Count 6
-/Parent 2161 0 R
-/Kids [1951 0 R 1963 0 R 1970 0 R 1982 0 R 1986 0 R 1997 0 R]
+/Parent 2726 0 R
+/Kids [2015 0 R 2024 0 R 2036 0 R 2043 0 R 2051 0 R 2055 0 R]
>> endobj
-2006 0 obj <<
+2071 0 obj <<
/Type /Pages
/Count 6
-/Parent 2161 0 R
-/Kids [2003 0 R 2008 0 R 2014 0 R 2027 0 R 2037 0 R 2041 0 R]
+/Parent 2726 0 R
+/Kids [2061 0 R 2073 0 R 2077 0 R 2081 0 R 2092 0 R 2096 0 R]
>> endobj
-2056 0 obj <<
+2112 0 obj <<
/Type /Pages
/Count 6
-/Parent 2161 0 R
-/Kids [2053 0 R 2058 0 R 2064 0 R 2075 0 R 2080 0 R 2084 0 R]
+/Parent 2726 0 R
+/Kids [2103 0 R 2114 0 R 2173 0 R 2229 0 R 2283 0 R 2318 0 R]
>> endobj
-2100 0 obj <<
+2333 0 obj <<
/Type /Pages
/Count 6
-/Parent 2161 0 R
-/Kids [2091 0 R 2102 0 R 2113 0 R 2118 0 R 2129 0 R 2135 0 R]
+/Parent 2726 0 R
+/Kids [2326 0 R 2335 0 R 2342 0 R 2347 0 R 2353 0 R 2357 0 R]
>> endobj
-2158 0 obj <<
+2371 0 obj <<
+/Type /Pages
+/Count 6
+/Parent 2726 0 R
+/Kids [2366 0 R 2373 0 R 2378 0 R 2382 0 R 2387 0 R 2398 0 R]
+>> endobj
+2414 0 obj <<
+/Type /Pages
+/Count 6
+/Parent 2727 0 R
+/Kids [2403 0 R 2416 0 R 2425 0 R 2434 0 R 2439 0 R 2448 0 R]
+>> endobj
+2457 0 obj <<
+/Type /Pages
+/Count 6
+/Parent 2727 0 R
+/Kids [2454 0 R 2459 0 R 2465 0 R 2476 0 R 2486 0 R 2492 0 R]
+>> endobj
+2507 0 obj <<
+/Type /Pages
+/Count 6
+/Parent 2727 0 R
+/Kids [2503 0 R 2509 0 R 2513 0 R 2517 0 R 2528 0 R 2539 0 R]
+>> endobj
+2549 0 obj <<
+/Type /Pages
+/Count 6
+/Parent 2727 0 R
+/Kids [2545 0 R 2551 0 R 2562 0 R 2566 0 R 2573 0 R 2587 0 R]
+>> endobj
+2597 0 obj <<
+/Type /Pages
+/Count 6
+/Parent 2727 0 R
+/Kids [2593 0 R 2599 0 R 2604 0 R 2613 0 R 2621 0 R 2631 0 R]
+>> endobj
+2647 0 obj <<
+/Type /Pages
+/Count 6
+/Parent 2727 0 R
+/Kids [2636 0 R 2649 0 R 2658 0 R 2666 0 R 2681 0 R 2693 0 R]
+>> endobj
+2723 0 obj <<
/Type /Pages
/Count 36
-/Parent 2162 0 R
-/Kids [715 0 R 954 0 R 1011 0 R 1068 0 R 1117 0 R 1158 0 R]
+/Parent 2728 0 R
+/Kids [931 0 R 1216 0 R 1277 0 R 1328 0 R 1383 0 R 1424 0 R]
>> endobj
-2159 0 obj <<
+2724 0 obj <<
/Type /Pages
/Count 36
-/Parent 2162 0 R
-/Kids [1203 0 R 1245 0 R 1282 0 R 1322 0 R 1356 0 R 1398 0 R]
+/Parent 2728 0 R
+/Kids [1480 0 R 1520 0 R 1562 0 R 1609 0 R 1644 0 R 1675 0 R]
>> endobj
-2160 0 obj <<
+2725 0 obj <<
/Type /Pages
/Count 36
-/Parent 2162 0 R
-/Kids [1437 0 R 1486 0 R 1552 0 R 1603 0 R 1651 0 R 1747 0 R]
+/Parent 2728 0 R
+/Kids [1712 0 R 1747 0 R 1787 0 R 1820 0 R 1853 0 R 1927 0 R]
>> endobj
-2161 0 obj <<
+2726 0 obj <<
/Type /Pages
-/Count 30
-/Parent 2162 0 R
-/Kids [1912 0 R 1961 0 R 2006 0 R 2056 0 R 2100 0 R]
+/Count 36
+/Parent 2728 0 R
+/Kids [1973 0 R 2022 0 R 2071 0 R 2112 0 R 2333 0 R 2371 0 R]
>> endobj
-2162 0 obj <<
+2727 0 obj <<
+/Type /Pages
+/Count 36
+/Parent 2728 0 R
+/Kids [2414 0 R 2457 0 R 2507 0 R 2549 0 R 2597 0 R 2647 0 R]
+>> endobj
+2728 0 obj <<
/Type /Pages
-/Count 138
-/Kids [2158 0 R 2159 0 R 2160 0 R 2161 0 R]
+/Count 180
+/Kids [2723 0 R 2724 0 R 2725 0 R 2726 0 R 2727 0 R]
>> endobj
-2163 0 obj <<
+2729 0 obj <<
/Type /Outlines
/First 7 0 R
-/Last 651 0 R
+/Last 835 0 R
/Count 10
>> endobj
+919 0 obj <<
+/Title 920 0 R
+/A 917 0 R
+/Parent 835 0 R
+/Prev 915 0 R
+>> endobj
+915 0 obj <<
+/Title 916 0 R
+/A 913 0 R
+/Parent 835 0 R
+/Prev 911 0 R
+/Next 919 0 R
+>> endobj
+911 0 obj <<
+/Title 912 0 R
+/A 909 0 R
+/Parent 835 0 R
+/Prev 907 0 R
+/Next 915 0 R
+>> endobj
+907 0 obj <<
+/Title 908 0 R
+/A 905 0 R
+/Parent 835 0 R
+/Prev 903 0 R
+/Next 911 0 R
+>> endobj
+903 0 obj <<
+/Title 904 0 R
+/A 901 0 R
+/Parent 835 0 R
+/Prev 899 0 R
+/Next 907 0 R
+>> endobj
+899 0 obj <<
+/Title 900 0 R
+/A 897 0 R
+/Parent 835 0 R
+/Prev 895 0 R
+/Next 903 0 R
+>> endobj
+895 0 obj <<
+/Title 896 0 R
+/A 893 0 R
+/Parent 835 0 R
+/Prev 891 0 R
+/Next 899 0 R
+>> endobj
+891 0 obj <<
+/Title 892 0 R
+/A 889 0 R
+/Parent 835 0 R
+/Prev 887 0 R
+/Next 895 0 R
+>> endobj
+887 0 obj <<
+/Title 888 0 R
+/A 885 0 R
+/Parent 835 0 R
+/Prev 883 0 R
+/Next 891 0 R
+>> endobj
+883 0 obj <<
+/Title 884 0 R
+/A 881 0 R
+/Parent 835 0 R
+/Prev 879 0 R
+/Next 887 0 R
+>> endobj
+879 0 obj <<
+/Title 880 0 R
+/A 877 0 R
+/Parent 835 0 R
+/Prev 875 0 R
+/Next 883 0 R
+>> endobj
+875 0 obj <<
+/Title 876 0 R
+/A 873 0 R
+/Parent 835 0 R
+/Prev 871 0 R
+/Next 879 0 R
+>> endobj
+871 0 obj <<
+/Title 872 0 R
+/A 869 0 R
+/Parent 835 0 R
+/Prev 867 0 R
+/Next 875 0 R
+>> endobj
+867 0 obj <<
+/Title 868 0 R
+/A 865 0 R
+/Parent 835 0 R
+/Prev 863 0 R
+/Next 871 0 R
+>> endobj
+863 0 obj <<
+/Title 864 0 R
+/A 861 0 R
+/Parent 835 0 R
+/Prev 859 0 R
+/Next 867 0 R
+>> endobj
+859 0 obj <<
+/Title 860 0 R
+/A 857 0 R
+/Parent 835 0 R
+/Prev 855 0 R
+/Next 863 0 R
+>> endobj
+855 0 obj <<
+/Title 856 0 R
+/A 853 0 R
+/Parent 835 0 R
+/Prev 851 0 R
+/Next 859 0 R
+>> endobj
+851 0 obj <<
+/Title 852 0 R
+/A 849 0 R
+/Parent 835 0 R
+/Prev 847 0 R
+/Next 855 0 R
+>> endobj
+847 0 obj <<
+/Title 848 0 R
+/A 845 0 R
+/Parent 835 0 R
+/Prev 843 0 R
+/Next 851 0 R
+>> endobj
+843 0 obj <<
+/Title 844 0 R
+/A 841 0 R
+/Parent 835 0 R
+/Prev 839 0 R
+/Next 847 0 R
+>> endobj
+839 0 obj <<
+/Title 840 0 R
+/A 837 0 R
+/Parent 835 0 R
+/Next 843 0 R
+>> endobj
+835 0 obj <<
+/Title 836 0 R
+/A 833 0 R
+/Parent 2729 0 R
+/Prev 743 0 R
+/First 839 0 R
+/Last 919 0 R
+/Count -21
+>> endobj
+831 0 obj <<
+/Title 832 0 R
+/A 829 0 R
+/Parent 779 0 R
+/Prev 803 0 R
+>> endobj
+827 0 obj <<
+/Title 828 0 R
+/A 825 0 R
+/Parent 803 0 R
+/Prev 823 0 R
+>> endobj
+823 0 obj <<
+/Title 824 0 R
+/A 821 0 R
+/Parent 803 0 R
+/Prev 819 0 R
+/Next 827 0 R
+>> endobj
+819 0 obj <<
+/Title 820 0 R
+/A 817 0 R
+/Parent 803 0 R
+/Prev 815 0 R
+/Next 823 0 R
+>> endobj
+815 0 obj <<
+/Title 816 0 R
+/A 813 0 R
+/Parent 803 0 R
+/Prev 811 0 R
+/Next 819 0 R
+>> endobj
+811 0 obj <<
+/Title 812 0 R
+/A 809 0 R
+/Parent 803 0 R
+/Prev 807 0 R
+/Next 815 0 R
+>> endobj
+807 0 obj <<
+/Title 808 0 R
+/A 805 0 R
+/Parent 803 0 R
+/Next 811 0 R
+>> endobj
+803 0 obj <<
+/Title 804 0 R
+/A 801 0 R
+/Parent 779 0 R
+/Prev 799 0 R
+/Next 831 0 R
+/First 807 0 R
+/Last 827 0 R
+/Count -6
+>> endobj
+799 0 obj <<
+/Title 800 0 R
+/A 797 0 R
+/Parent 779 0 R
+/Prev 795 0 R
+/Next 803 0 R
+>> endobj
+795 0 obj <<
+/Title 796 0 R
+/A 793 0 R
+/Parent 779 0 R
+/Prev 791 0 R
+/Next 799 0 R
+>> endobj
+791 0 obj <<
+/Title 792 0 R
+/A 789 0 R
+/Parent 779 0 R
+/Prev 787 0 R
+/Next 795 0 R
+>> endobj
+787 0 obj <<
+/Title 788 0 R
+/A 785 0 R
+/Parent 779 0 R
+/Prev 783 0 R
+/Next 791 0 R
+>> endobj
+783 0 obj <<
+/Title 784 0 R
+/A 781 0 R
+/Parent 779 0 R
+/Next 787 0 R
+>> endobj
+779 0 obj <<
+/Title 780 0 R
+/A 777 0 R
+/Parent 743 0 R
+/Prev 763 0 R
+/First 783 0 R
+/Last 831 0 R
+/Count -7
+>> endobj
+775 0 obj <<
+/Title 776 0 R
+/A 773 0 R
+/Parent 763 0 R
+/Prev 771 0 R
+>> endobj
+771 0 obj <<
+/Title 772 0 R
+/A 769 0 R
+/Parent 763 0 R
+/Prev 767 0 R
+/Next 775 0 R
+>> endobj
+767 0 obj <<
+/Title 768 0 R
+/A 765 0 R
+/Parent 763 0 R
+/Next 771 0 R
+>> endobj
+763 0 obj <<
+/Title 764 0 R
+/A 761 0 R
+/Parent 743 0 R
+/Prev 755 0 R
+/Next 779 0 R
+/First 767 0 R
+/Last 775 0 R
+/Count -3
+>> endobj
+759 0 obj <<
+/Title 760 0 R
+/A 757 0 R
+/Parent 755 0 R
+>> endobj
+755 0 obj <<
+/Title 756 0 R
+/A 753 0 R
+/Parent 743 0 R
+/Prev 747 0 R
+/Next 763 0 R
+/First 759 0 R
+/Last 759 0 R
+/Count -1
+>> endobj
+751 0 obj <<
+/Title 752 0 R
+/A 749 0 R
+/Parent 747 0 R
+>> endobj
+747 0 obj <<
+/Title 748 0 R
+/A 745 0 R
+/Parent 743 0 R
+/Next 755 0 R
+/First 751 0 R
+/Last 751 0 R
+/Count -1
+>> endobj
+743 0 obj <<
+/Title 744 0 R
+/A 741 0 R
+/Parent 2729 0 R
+/Prev 723 0 R
+/Next 835 0 R
+/First 747 0 R
+/Last 779 0 R
+/Count -4
+>> endobj
+739 0 obj <<
+/Title 740 0 R
+/A 737 0 R
+/Parent 723 0 R
+/Prev 735 0 R
+>> endobj
+735 0 obj <<
+/Title 736 0 R
+/A 733 0 R
+/Parent 723 0 R
+/Prev 727 0 R
+/Next 739 0 R
+>> endobj
+731 0 obj <<
+/Title 732 0 R
+/A 729 0 R
+/Parent 727 0 R
+>> endobj
+727 0 obj <<
+/Title 728 0 R
+/A 725 0 R
+/Parent 723 0 R
+/Next 735 0 R
+/First 731 0 R
+/Last 731 0 R
+/Count -1
+>> endobj
+723 0 obj <<
+/Title 724 0 R
+/A 721 0 R
+/Parent 2729 0 R
+/Prev 699 0 R
+/Next 743 0 R
+/First 727 0 R
+/Last 739 0 R
+/Count -3
+>> endobj
+719 0 obj <<
+/Title 720 0 R
+/A 717 0 R
+/Parent 699 0 R
+/Prev 707 0 R
+>> endobj
+715 0 obj <<
+/Title 716 0 R
+/A 713 0 R
+/Parent 707 0 R
+/Prev 711 0 R
+>> endobj
+711 0 obj <<
+/Title 712 0 R
+/A 709 0 R
+/Parent 707 0 R
+/Next 715 0 R
+>> endobj
+707 0 obj <<
+/Title 708 0 R
+/A 705 0 R
+/Parent 699 0 R
+/Prev 703 0 R
+/Next 719 0 R
+/First 711 0 R
+/Last 715 0 R
+/Count -2
+>> endobj
703 0 obj <<
/Title 704 0 R
/A 701 0 R
-/Parent 651 0 R
-/Prev 699 0 R
+/Parent 699 0 R
+/Next 707 0 R
>> endobj
699 0 obj <<
/Title 700 0 R
/A 697 0 R
-/Parent 651 0 R
-/Prev 695 0 R
-/Next 703 0 R
+/Parent 2729 0 R
+/Prev 355 0 R
+/Next 723 0 R
+/First 703 0 R
+/Last 719 0 R
+/Count -3
>> endobj
695 0 obj <<
/Title 696 0 R
/A 693 0 R
-/Parent 651 0 R
+/Parent 675 0 R
/Prev 691 0 R
-/Next 699 0 R
>> endobj
691 0 obj <<
/Title 692 0 R
/A 689 0 R
-/Parent 651 0 R
+/Parent 675 0 R
/Prev 687 0 R
/Next 695 0 R
>> endobj
687 0 obj <<
/Title 688 0 R
/A 685 0 R
-/Parent 651 0 R
+/Parent 675 0 R
/Prev 683 0 R
/Next 691 0 R
>> endobj
683 0 obj <<
/Title 684 0 R
/A 681 0 R
-/Parent 651 0 R
+/Parent 675 0 R
/Prev 679 0 R
/Next 687 0 R
>> endobj
679 0 obj <<
/Title 680 0 R
/A 677 0 R
-/Parent 651 0 R
-/Prev 675 0 R
+/Parent 675 0 R
/Next 683 0 R
>> endobj
675 0 obj <<
/Title 676 0 R
/A 673 0 R
-/Parent 651 0 R
+/Parent 667 0 R
/Prev 671 0 R
-/Next 679 0 R
+/First 679 0 R
+/Last 695 0 R
+/Count -5
>> endobj
671 0 obj <<
/Title 672 0 R
/A 669 0 R
-/Parent 651 0 R
-/Prev 667 0 R
+/Parent 667 0 R
/Next 675 0 R
>> endobj
667 0 obj <<
/Title 668 0 R
/A 665 0 R
-/Parent 651 0 R
-/Prev 663 0 R
-/Next 671 0 R
+/Parent 355 0 R
+/Prev 611 0 R
+/First 671 0 R
+/Last 675 0 R
+/Count -2
>> endobj
663 0 obj <<
/Title 664 0 R
/A 661 0 R
-/Parent 651 0 R
+/Parent 611 0 R
/Prev 659 0 R
-/Next 667 0 R
>> endobj
659 0 obj <<
/Title 660 0 R
/A 657 0 R
-/Parent 651 0 R
-/Prev 655 0 R
+/Parent 611 0 R
+/Prev 639 0 R
/Next 663 0 R
>> endobj
655 0 obj <<
/Title 656 0 R
/A 653 0 R
-/Parent 651 0 R
-/Next 659 0 R
+/Parent 639 0 R
+/Prev 651 0 R
>> endobj
651 0 obj <<
/Title 652 0 R
/A 649 0 R
-/Parent 2163 0 R
-/Prev 615 0 R
-/First 655 0 R
-/Last 703 0 R
-/Count -13
+/Parent 639 0 R
+/Prev 647 0 R
+/Next 655 0 R
>> endobj
647 0 obj <<
/Title 648 0 R
/A 645 0 R
-/Parent 635 0 R
+/Parent 639 0 R
/Prev 643 0 R
+/Next 651 0 R
>> endobj
643 0 obj <<
/Title 644 0 R
/A 641 0 R
-/Parent 635 0 R
-/Prev 639 0 R
+/Parent 639 0 R
/Next 647 0 R
>> endobj
639 0 obj <<
/Title 640 0 R
/A 637 0 R
-/Parent 635 0 R
-/Next 643 0 R
+/Parent 611 0 R
+/Prev 635 0 R
+/Next 659 0 R
+/First 643 0 R
+/Last 655 0 R
+/Count -4
>> endobj
635 0 obj <<
/Title 636 0 R
/A 633 0 R
-/Parent 615 0 R
-/Prev 627 0 R
-/First 639 0 R
-/Last 647 0 R
-/Count -3
+/Parent 611 0 R
+/Prev 631 0 R
+/Next 639 0 R
>> endobj
631 0 obj <<
/Title 632 0 R
/A 629 0 R
-/Parent 627 0 R
+/Parent 611 0 R
+/Prev 627 0 R
+/Next 635 0 R
>> endobj
627 0 obj <<
/Title 628 0 R
/A 625 0 R
-/Parent 615 0 R
-/Prev 619 0 R
-/Next 635 0 R
-/First 631 0 R
-/Last 631 0 R
-/Count -1
+/Parent 611 0 R
+/Prev 615 0 R
+/Next 631 0 R
>> endobj
623 0 obj <<
/Title 624 0 R
/A 621 0 R
-/Parent 619 0 R
+/Parent 615 0 R
+/Prev 619 0 R
>> endobj
619 0 obj <<
/Title 620 0 R
/A 617 0 R
/Parent 615 0 R
-/Next 627 0 R
-/First 623 0 R
-/Last 623 0 R
-/Count -1
+/Next 623 0 R
>> endobj
615 0 obj <<
/Title 616 0 R
/A 613 0 R
-/Parent 2163 0 R
-/Prev 595 0 R
-/Next 651 0 R
+/Parent 611 0 R
+/Next 627 0 R
/First 619 0 R
-/Last 635 0 R
-/Count -3
+/Last 623 0 R
+/Count -2
>> endobj
611 0 obj <<
/Title 612 0 R
/A 609 0 R
-/Parent 595 0 R
-/Prev 607 0 R
+/Parent 355 0 R
+/Prev 387 0 R
+/Next 667 0 R
+/First 615 0 R
+/Last 663 0 R
+/Count -7
>> endobj
607 0 obj <<
/Title 608 0 R
/A 605 0 R
-/Parent 595 0 R
-/Prev 599 0 R
-/Next 611 0 R
+/Parent 591 0 R
+/Prev 603 0 R
>> endobj
603 0 obj <<
/Title 604 0 R
/A 601 0 R
-/Parent 599 0 R
+/Parent 591 0 R
+/Prev 599 0 R
+/Next 607 0 R
>> endobj
599 0 obj <<
/Title 600 0 R
/A 597 0 R
-/Parent 595 0 R
-/Next 607 0 R
-/First 603 0 R
-/Last 603 0 R
-/Count -1
+/Parent 591 0 R
+/Prev 595 0 R
+/Next 603 0 R
>> endobj
595 0 obj <<
/Title 596 0 R
/A 593 0 R
-/Parent 2163 0 R
-/Prev 571 0 R
-/Next 615 0 R
-/First 599 0 R
-/Last 611 0 R
-/Count -3
+/Parent 591 0 R
+/Next 599 0 R
>> endobj
591 0 obj <<
/Title 592 0 R
/A 589 0 R
-/Parent 571 0 R
-/Prev 579 0 R
+/Parent 387 0 R
+/Prev 587 0 R
+/First 595 0 R
+/Last 607 0 R
+/Count -4
>> endobj
587 0 obj <<
/Title 588 0 R
/A 585 0 R
-/Parent 579 0 R
+/Parent 387 0 R
/Prev 583 0 R
+/Next 591 0 R
>> endobj
583 0 obj <<
/Title 584 0 R
/A 581 0 R
-/Parent 579 0 R
+/Parent 387 0 R
+/Prev 579 0 R
/Next 587 0 R
>> endobj
579 0 obj <<
/Title 580 0 R
/A 577 0 R
-/Parent 571 0 R
+/Parent 387 0 R
/Prev 575 0 R
-/Next 591 0 R
-/First 583 0 R
-/Last 587 0 R
-/Count -2
+/Next 583 0 R
>> endobj
575 0 obj <<
/Title 576 0 R
/A 573 0 R
-/Parent 571 0 R
+/Parent 387 0 R
+/Prev 571 0 R
/Next 579 0 R
>> endobj
571 0 obj <<
/Title 572 0 R
/A 569 0 R
-/Parent 2163 0 R
-/Prev 243 0 R
-/Next 595 0 R
-/First 575 0 R
-/Last 591 0 R
-/Count -3
+/Parent 387 0 R
+/Prev 567 0 R
+/Next 575 0 R
>> endobj
567 0 obj <<
/Title 568 0 R
/A 565 0 R
-/Parent 547 0 R
+/Parent 387 0 R
/Prev 563 0 R
+/Next 571 0 R
>> endobj
563 0 obj <<
/Title 564 0 R
/A 561 0 R
-/Parent 547 0 R
+/Parent 387 0 R
/Prev 559 0 R
/Next 567 0 R
>> endobj
559 0 obj <<
/Title 560 0 R
/A 557 0 R
-/Parent 547 0 R
+/Parent 387 0 R
/Prev 555 0 R
/Next 563 0 R
>> endobj
555 0 obj <<
/Title 556 0 R
/A 553 0 R
-/Parent 547 0 R
+/Parent 387 0 R
/Prev 551 0 R
/Next 559 0 R
>> endobj
551 0 obj <<
/Title 552 0 R
/A 549 0 R
-/Parent 547 0 R
+/Parent 387 0 R
+/Prev 547 0 R
/Next 555 0 R
>> endobj
547 0 obj <<
/Title 548 0 R
/A 545 0 R
-/Parent 539 0 R
-/Prev 543 0 R
-/First 551 0 R
-/Last 567 0 R
-/Count -5
+/Parent 387 0 R
+/Prev 463 0 R
+/Next 551 0 R
>> endobj
543 0 obj <<
/Title 544 0 R
/A 541 0 R
-/Parent 539 0 R
-/Next 547 0 R
+/Parent 463 0 R
+/Prev 539 0 R
>> endobj
539 0 obj <<
/Title 540 0 R
/A 537 0 R
-/Parent 243 0 R
-/Prev 483 0 R
-/First 543 0 R
-/Last 547 0 R
-/Count -2
+/Parent 463 0 R
+/Prev 535 0 R
+/Next 543 0 R
>> endobj
535 0 obj <<
/Title 536 0 R
/A 533 0 R
-/Parent 483 0 R
+/Parent 463 0 R
/Prev 531 0 R
+/Next 539 0 R
>> endobj
531 0 obj <<
/Title 532 0 R
/A 529 0 R
-/Parent 483 0 R
-/Prev 511 0 R
+/Parent 463 0 R
+/Prev 527 0 R
/Next 535 0 R
>> endobj
527 0 obj <<
/Title 528 0 R
/A 525 0 R
-/Parent 511 0 R
+/Parent 463 0 R
/Prev 523 0 R
+/Next 531 0 R
>> endobj
523 0 obj <<
/Title 524 0 R
/A 521 0 R
-/Parent 511 0 R
+/Parent 463 0 R
/Prev 519 0 R
/Next 527 0 R
>> endobj
519 0 obj <<
/Title 520 0 R
/A 517 0 R
-/Parent 511 0 R
+/Parent 463 0 R
/Prev 515 0 R
/Next 523 0 R
>> endobj
515 0 obj <<
/Title 516 0 R
/A 513 0 R
-/Parent 511 0 R
+/Parent 463 0 R
+/Prev 511 0 R
/Next 519 0 R
>> endobj
511 0 obj <<
/Title 512 0 R
/A 509 0 R
-/Parent 483 0 R
+/Parent 463 0 R
/Prev 507 0 R
-/Next 531 0 R
-/First 515 0 R
-/Last 527 0 R
-/Count -4
+/Next 515 0 R
>> endobj
507 0 obj <<
/Title 508 0 R
/A 505 0 R
-/Parent 483 0 R
+/Parent 463 0 R
/Prev 503 0 R
/Next 511 0 R
>> endobj
503 0 obj <<
/Title 504 0 R
/A 501 0 R
-/Parent 483 0 R
+/Parent 463 0 R
/Prev 499 0 R
/Next 507 0 R
>> endobj
499 0 obj <<
/Title 500 0 R
/A 497 0 R
-/Parent 483 0 R
-/Prev 487 0 R
+/Parent 463 0 R
+/Prev 495 0 R
/Next 503 0 R
>> endobj
495 0 obj <<
/Title 496 0 R
/A 493 0 R
-/Parent 487 0 R
+/Parent 463 0 R
/Prev 491 0 R
+/Next 499 0 R
>> endobj
491 0 obj <<
/Title 492 0 R
/A 489 0 R
-/Parent 487 0 R
+/Parent 463 0 R
+/Prev 487 0 R
/Next 495 0 R
>> endobj
487 0 obj <<
/Title 488 0 R
/A 485 0 R
-/Parent 483 0 R
-/Next 499 0 R
-/First 491 0 R
-/Last 495 0 R
-/Count -2
+/Parent 463 0 R
+/Prev 483 0 R
+/Next 491 0 R
>> endobj
483 0 obj <<
/Title 484 0 R
/A 481 0 R
-/Parent 243 0 R
-/Prev 275 0 R
-/Next 539 0 R
-/First 487 0 R
-/Last 535 0 R
-/Count -7
+/Parent 463 0 R
+/Prev 479 0 R
+/Next 487 0 R
>> endobj
479 0 obj <<
/Title 480 0 R
/A 477 0 R
/Parent 463 0 R
/Prev 475 0 R
+/Next 483 0 R
>> endobj
475 0 obj <<
/Title 476 0 R
@@ -12324,328 +15378,338 @@ endobj
463 0 obj <<
/Title 464 0 R
/A 461 0 R
-/Parent 275 0 R
+/Parent 387 0 R
/Prev 459 0 R
+/Next 547 0 R
/First 467 0 R
-/Last 479 0 R
-/Count -4
+/Last 543 0 R
+/Count -20
>> endobj
459 0 obj <<
/Title 460 0 R
/A 457 0 R
-/Parent 275 0 R
+/Parent 387 0 R
/Prev 455 0 R
/Next 463 0 R
>> endobj
455 0 obj <<
/Title 456 0 R
/A 453 0 R
-/Parent 275 0 R
+/Parent 387 0 R
/Prev 451 0 R
/Next 459 0 R
>> endobj
451 0 obj <<
/Title 452 0 R
/A 449 0 R
-/Parent 275 0 R
+/Parent 387 0 R
/Prev 447 0 R
/Next 455 0 R
>> endobj
447 0 obj <<
/Title 448 0 R
/A 445 0 R
-/Parent 275 0 R
+/Parent 387 0 R
/Prev 443 0 R
/Next 451 0 R
>> endobj
443 0 obj <<
/Title 444 0 R
/A 441 0 R
-/Parent 275 0 R
-/Prev 439 0 R
+/Parent 387 0 R
+/Prev 427 0 R
/Next 447 0 R
>> endobj
439 0 obj <<
/Title 440 0 R
/A 437 0 R
-/Parent 275 0 R
+/Parent 427 0 R
/Prev 435 0 R
-/Next 443 0 R
>> endobj
435 0 obj <<
/Title 436 0 R
/A 433 0 R
-/Parent 275 0 R
+/Parent 427 0 R
/Prev 431 0 R
/Next 439 0 R
>> endobj
431 0 obj <<
/Title 432 0 R
/A 429 0 R
-/Parent 275 0 R
-/Prev 427 0 R
+/Parent 427 0 R
/Next 435 0 R
>> endobj
427 0 obj <<
/Title 428 0 R
/A 425 0 R
-/Parent 275 0 R
-/Prev 351 0 R
-/Next 431 0 R
+/Parent 387 0 R
+/Prev 423 0 R
+/Next 443 0 R
+/First 431 0 R
+/Last 439 0 R
+/Count -3
>> endobj
423 0 obj <<
/Title 424 0 R
/A 421 0 R
-/Parent 351 0 R
+/Parent 387 0 R
/Prev 419 0 R
+/Next 427 0 R
>> endobj
419 0 obj <<
/Title 420 0 R
/A 417 0 R
-/Parent 351 0 R
+/Parent 387 0 R
/Prev 415 0 R
/Next 423 0 R
>> endobj
415 0 obj <<
/Title 416 0 R
/A 413 0 R
-/Parent 351 0 R
+/Parent 387 0 R
/Prev 411 0 R
/Next 419 0 R
>> endobj
411 0 obj <<
/Title 412 0 R
/A 409 0 R
-/Parent 351 0 R
+/Parent 387 0 R
/Prev 407 0 R
/Next 415 0 R
>> endobj
407 0 obj <<
/Title 408 0 R
/A 405 0 R
-/Parent 351 0 R
+/Parent 387 0 R
/Prev 403 0 R
/Next 411 0 R
>> endobj
403 0 obj <<
/Title 404 0 R
/A 401 0 R
-/Parent 351 0 R
+/Parent 387 0 R
/Prev 399 0 R
/Next 407 0 R
>> endobj
399 0 obj <<
/Title 400 0 R
/A 397 0 R
-/Parent 351 0 R
+/Parent 387 0 R
/Prev 395 0 R
/Next 403 0 R
>> endobj
395 0 obj <<
/Title 396 0 R
/A 393 0 R
-/Parent 351 0 R
+/Parent 387 0 R
/Prev 391 0 R
/Next 399 0 R
>> endobj
391 0 obj <<
/Title 392 0 R
/A 389 0 R
-/Parent 351 0 R
-/Prev 387 0 R
+/Parent 387 0 R
/Next 395 0 R
>> endobj
387 0 obj <<
/Title 388 0 R
/A 385 0 R
-/Parent 351 0 R
-/Prev 383 0 R
-/Next 391 0 R
+/Parent 355 0 R
+/Prev 359 0 R
+/Next 611 0 R
+/First 391 0 R
+/Last 591 0 R
+/Count -28
>> endobj
383 0 obj <<
/Title 384 0 R
/A 381 0 R
-/Parent 351 0 R
+/Parent 375 0 R
/Prev 379 0 R
-/Next 387 0 R
>> endobj
379 0 obj <<
/Title 380 0 R
/A 377 0 R
-/Parent 351 0 R
-/Prev 375 0 R
+/Parent 375 0 R
/Next 383 0 R
>> endobj
375 0 obj <<
/Title 376 0 R
/A 373 0 R
-/Parent 351 0 R
-/Prev 371 0 R
-/Next 379 0 R
+/Parent 359 0 R
+/Prev 363 0 R
+/First 379 0 R
+/Last 383 0 R
+/Count -2
>> endobj
371 0 obj <<
/Title 372 0 R
/A 369 0 R
-/Parent 351 0 R
+/Parent 363 0 R
/Prev 367 0 R
-/Next 375 0 R
>> endobj
367 0 obj <<
/Title 368 0 R
/A 365 0 R
-/Parent 351 0 R
-/Prev 363 0 R
+/Parent 363 0 R
/Next 371 0 R
>> endobj
363 0 obj <<
/Title 364 0 R
/A 361 0 R
-/Parent 351 0 R
-/Prev 359 0 R
-/Next 367 0 R
+/Parent 359 0 R
+/Next 375 0 R
+/First 367 0 R
+/Last 371 0 R
+/Count -2
>> endobj
359 0 obj <<
/Title 360 0 R
/A 357 0 R
-/Parent 351 0 R
-/Prev 355 0 R
-/Next 363 0 R
+/Parent 355 0 R
+/Next 387 0 R
+/First 363 0 R
+/Last 375 0 R
+/Count -2
>> endobj
355 0 obj <<
/Title 356 0 R
/A 353 0 R
-/Parent 351 0 R
-/Next 359 0 R
+/Parent 2729 0 R
+/Prev 343 0 R
+/Next 699 0 R
+/First 359 0 R
+/Last 667 0 R
+/Count -4
>> endobj
351 0 obj <<
/Title 352 0 R
/A 349 0 R
-/Parent 275 0 R
+/Parent 343 0 R
/Prev 347 0 R
-/Next 427 0 R
-/First 355 0 R
-/Last 423 0 R
-/Count -18
>> endobj
347 0 obj <<
/Title 348 0 R
/A 345 0 R
-/Parent 275 0 R
-/Prev 343 0 R
+/Parent 343 0 R
/Next 351 0 R
>> endobj
343 0 obj <<
/Title 344 0 R
/A 341 0 R
-/Parent 275 0 R
-/Prev 339 0 R
-/Next 347 0 R
+/Parent 2729 0 R
+/Prev 131 0 R
+/Next 355 0 R
+/First 347 0 R
+/Last 351 0 R
+/Count -2
>> endobj
339 0 obj <<
/Title 340 0 R
/A 337 0 R
-/Parent 275 0 R
+/Parent 331 0 R
/Prev 335 0 R
-/Next 343 0 R
>> endobj
335 0 obj <<
/Title 336 0 R
/A 333 0 R
-/Parent 275 0 R
-/Prev 331 0 R
+/Parent 331 0 R
/Next 339 0 R
>> endobj
331 0 obj <<
/Title 332 0 R
/A 329 0 R
-/Parent 275 0 R
-/Prev 315 0 R
-/Next 335 0 R
+/Parent 131 0 R
+/Prev 287 0 R
+/First 335 0 R
+/Last 339 0 R
+/Count -2
>> endobj
327 0 obj <<
/Title 328 0 R
/A 325 0 R
-/Parent 315 0 R
+/Parent 287 0 R
/Prev 323 0 R
>> endobj
323 0 obj <<
/Title 324 0 R
/A 321 0 R
-/Parent 315 0 R
+/Parent 287 0 R
/Prev 319 0 R
/Next 327 0 R
>> endobj
319 0 obj <<
/Title 320 0 R
/A 317 0 R
-/Parent 315 0 R
+/Parent 287 0 R
+/Prev 315 0 R
/Next 323 0 R
>> endobj
315 0 obj <<
/Title 316 0 R
/A 313 0 R
-/Parent 275 0 R
-/Prev 311 0 R
-/Next 331 0 R
-/First 319 0 R
-/Last 327 0 R
-/Count -3
+/Parent 287 0 R
+/Prev 303 0 R
+/Next 319 0 R
>> endobj
311 0 obj <<
/Title 312 0 R
/A 309 0 R
-/Parent 275 0 R
+/Parent 303 0 R
/Prev 307 0 R
-/Next 315 0 R
>> endobj
307 0 obj <<
/Title 308 0 R
/A 305 0 R
-/Parent 275 0 R
-/Prev 303 0 R
+/Parent 303 0 R
/Next 311 0 R
>> endobj
303 0 obj <<
/Title 304 0 R
/A 301 0 R
-/Parent 275 0 R
-/Prev 299 0 R
-/Next 307 0 R
+/Parent 287 0 R
+/Prev 291 0 R
+/Next 315 0 R
+/First 307 0 R
+/Last 311 0 R
+/Count -2
>> endobj
299 0 obj <<
/Title 300 0 R
/A 297 0 R
-/Parent 275 0 R
+/Parent 291 0 R
/Prev 295 0 R
-/Next 303 0 R
>> endobj
295 0 obj <<
/Title 296 0 R
/A 293 0 R
-/Parent 275 0 R
-/Prev 291 0 R
+/Parent 291 0 R
/Next 299 0 R
>> endobj
291 0 obj <<
/Title 292 0 R
/A 289 0 R
-/Parent 275 0 R
-/Prev 287 0 R
-/Next 295 0 R
+/Parent 287 0 R
+/Next 303 0 R
+/First 295 0 R
+/Last 299 0 R
+/Count -2
>> endobj
287 0 obj <<
/Title 288 0 R
/A 285 0 R
-/Parent 275 0 R
-/Prev 283 0 R
-/Next 291 0 R
+/Parent 131 0 R
+/Prev 275 0 R
+/Next 331 0 R
+/First 291 0 R
+/Last 327 0 R
+/Count -6
>> endobj
283 0 obj <<
/Title 284 0 R
/A 281 0 R
/Parent 275 0 R
/Prev 279 0 R
-/Next 287 0 R
>> endobj
279 0 obj <<
/Title 280 0 R
@@ -12656,101 +15720,95 @@ endobj
275 0 obj <<
/Title 276 0 R
/A 273 0 R
-/Parent 243 0 R
-/Prev 247 0 R
-/Next 483 0 R
+/Parent 131 0 R
+/Prev 219 0 R
+/Next 287 0 R
/First 279 0 R
-/Last 463 0 R
-/Count -26
+/Last 283 0 R
+/Count -2
>> endobj
271 0 obj <<
/Title 272 0 R
/A 269 0 R
-/Parent 263 0 R
+/Parent 219 0 R
/Prev 267 0 R
>> endobj
267 0 obj <<
/Title 268 0 R
/A 265 0 R
-/Parent 263 0 R
+/Parent 219 0 R
+/Prev 263 0 R
/Next 271 0 R
>> endobj
263 0 obj <<
/Title 264 0 R
/A 261 0 R
-/Parent 247 0 R
-/Prev 251 0 R
-/First 267 0 R
-/Last 271 0 R
-/Count -2
+/Parent 219 0 R
+/Prev 259 0 R
+/Next 267 0 R
>> endobj
259 0 obj <<
/Title 260 0 R
/A 257 0 R
-/Parent 251 0 R
+/Parent 219 0 R
/Prev 255 0 R
+/Next 263 0 R
>> endobj
255 0 obj <<
/Title 256 0 R
/A 253 0 R
-/Parent 251 0 R
+/Parent 219 0 R
+/Prev 251 0 R
/Next 259 0 R
>> endobj
251 0 obj <<
/Title 252 0 R
/A 249 0 R
-/Parent 247 0 R
-/Next 263 0 R
-/First 255 0 R
-/Last 259 0 R
-/Count -2
+/Parent 219 0 R
+/Prev 247 0 R
+/Next 255 0 R
>> endobj
247 0 obj <<
/Title 248 0 R
/A 245 0 R
-/Parent 243 0 R
-/Next 275 0 R
-/First 251 0 R
-/Last 263 0 R
-/Count -2
+/Parent 219 0 R
+/Prev 243 0 R
+/Next 251 0 R
>> endobj
243 0 obj <<
/Title 244 0 R
/A 241 0 R
-/Parent 2163 0 R
-/Prev 231 0 R
-/Next 571 0 R
-/First 247 0 R
-/Last 539 0 R
-/Count -4
+/Parent 219 0 R
+/Prev 239 0 R
+/Next 247 0 R
>> endobj
239 0 obj <<
/Title 240 0 R
/A 237 0 R
-/Parent 231 0 R
+/Parent 219 0 R
/Prev 235 0 R
+/Next 243 0 R
>> endobj
235 0 obj <<
/Title 236 0 R
/A 233 0 R
-/Parent 231 0 R
+/Parent 219 0 R
+/Prev 231 0 R
/Next 239 0 R
>> endobj
231 0 obj <<
/Title 232 0 R
/A 229 0 R
-/Parent 2163 0 R
-/Prev 131 0 R
-/Next 243 0 R
-/First 235 0 R
-/Last 239 0 R
-/Count -2
+/Parent 219 0 R
+/Prev 227 0 R
+/Next 235 0 R
>> endobj
227 0 obj <<
/Title 228 0 R
/A 225 0 R
/Parent 219 0 R
/Prev 223 0 R
+/Next 231 0 R
>> endobj
223 0 obj <<
/Title 224 0 R
@@ -12763,9 +15821,10 @@ endobj
/A 217 0 R
/Parent 131 0 R
/Prev 203 0 R
+/Next 275 0 R
/First 223 0 R
-/Last 227 0 R
-/Count -2
+/Last 271 0 R
+/Count -13
>> endobj
215 0 obj <<
/Title 216 0 R
@@ -12921,12 +15980,12 @@ endobj
131 0 obj <<
/Title 132 0 R
/A 129 0 R
-/Parent 2163 0 R
+/Parent 2729 0 R
/Prev 91 0 R
-/Next 231 0 R
+/Next 343 0 R
/First 135 0 R
-/Last 219 0 R
-/Count -9
+/Last 331 0 R
+/Count -12
>> endobj
127 0 obj <<
/Title 128 0 R
@@ -12995,7 +16054,7 @@ endobj
91 0 obj <<
/Title 92 0 R
/A 89 0 R
-/Parent 2163 0 R
+/Parent 2729 0 R
/Prev 67 0 R
/Next 131 0 R
/First 95 0 R
@@ -13038,7 +16097,7 @@ endobj
67 0 obj <<
/Title 68 0 R
/A 65 0 R
-/Parent 2163 0 R
+/Parent 2729 0 R
/Prev 7 0 R
/Next 91 0 R
/First 71 0 R
@@ -13147,2213 +16206,2779 @@ endobj
7 0 obj <<
/Title 8 0 R
/A 5 0 R
-/Parent 2163 0 R
+/Parent 2729 0 R
/Next 67 0 R
/First 11 0 R
/Last 23 0 R
/Count -4
>> endobj
-2164 0 obj <<
-/Names [(Access_Control_Lists) 1635 0 R (Bv9ARM.ch01) 945 0 R (Bv9ARM.ch02) 990 0 R (Bv9ARM.ch03) 1007 0 R (Bv9ARM.ch04) 1056 0 R (Bv9ARM.ch05) 1155 0 R (Bv9ARM.ch06) 1167 0 R (Bv9ARM.ch07) 1634 0 R (Bv9ARM.ch08) 1660 0 R (Bv9ARM.ch09) 1675 0 R (Bv9ARM.ch10) 1896 0 R (Configuration_File_Grammar) 1191 0 R (DNSSEC) 1123 0 R (Doc-Start) 711 0 R (Setting_TTLs) 1560 0 R (acache) 997 0 R (access_control) 1320 0 R (acl) 1199 0 R (address_match_lists) 1172 0 R (admin_tools) 1030 0 R (appendix.A) 614 0 R (appendix.B) 650 0 R (bibliography) 1683 0 R (boolean_options) 1072 0 R (builtin) 1404 0 R (chapter*.1) 745 0 R (chapter.1) 6 0 R (chapter.2) 66 0 R (chapter.3) 90 0 R (chapter.4) 130 0 R (chapter.5) 230 0 R (chapter.6) 242 0 R (chapter.7) 570 0 R (chapter.8) 594 0 R (cite.RFC1033) 1811 0 R (cite.RFC1034) 1695 0 R (cite.RFC1035) 1697 0 R (cite.RFC1101) 1793 0 R (cite.RFC1123) 1795 0 R (cite.RFC1183) 1755 0 R (cite.RFC1464) 1833 0 R (cite.RFC1535) 1740 0 R (cite.RFC1536) 1742 0 R (cite.RFC1537) 1813 0 R (cite.RFC1591) 1797 0 R (cite.RFC1706) 1757 0 R (cite.RFC1712) 1853 0 R (cite.RFC1713) 1835 0 R (cite.RFC1794) 1837 0 R (cite.RFC1876) 1759 0 R (cite.RFC1912) 1815 0 R (cite.RFC1982) 1744 0 R (cite.RFC1995) 1702 0 R (cite.RFC1996) 1704 0 R (cite.RFC2010) 1817 0 R (cite.RFC2052) 1761 0 R (cite.RFC2065) 1865 0 R (cite.RFC2136) 1706 0 R (cite.RFC2137) 1867 0 R (cite.RFC2163) 1763 0 R (cite.RFC2168) 1765 0 R (cite.RFC2181) 1708 0 R (cite.RFC2219) 1819 0 R (cite.RFC2230) 1767 0 R (cite.RFC2240) 1839 0 R (cite.RFC2308) 1710 0 R (cite.RFC2317) 1799 0 R (cite.RFC2345) 1841 0 R (cite.RFC2352) 1843 0 R (cite.RFC2535) 1869 0 R (cite.RFC2536) 1769 0 R (cite.RFC2537) 1771 0 R (cite.RFC2538) 1773 0 R (cite.RFC2539) 1775 0 R (cite.RFC2540) 1777 0 R (cite.RFC2671) 1712 0 R (cite.RFC2672) 1714 0 R (cite.RFC2673) 1855 0 R (cite.RFC2782) 1779 0 R (cite.RFC2825) 1823 0 R (cite.RFC2826) 1801 0 R (cite.RFC2845) 1716 0 R (cite.RFC2874) 1857 0 R (cite.RFC2915) 1781 0 R (cite.RFC2929) 1803 0 R (cite.RFC2930) 1718 0 R (cite.RFC2931) 1720 0 R (cite.RFC3007) 1722 0 R (cite.RFC3008) 1871 0 R (cite.RFC3071) 1845 0 R (cite.RFC3090) 1873 0 R (cite.RFC3110) 1783 0 R (cite.RFC3123) 1785 0 R (cite.RFC3225) 1728 0 R (cite.RFC3258) 1847 0 R (cite.RFC3445) 1875 0 R (cite.RFC3490) 1825 0 R (cite.RFC3491) 1827 0 R (cite.RFC3492) 1829 0 R (cite.RFC3596) 1787 0 R (cite.RFC3597) 1789 0 R (cite.RFC3645) 1724 0 R (cite.RFC3655) 1877 0 R (cite.RFC3658) 1879 0 R (cite.RFC3755) 1881 0 R (cite.RFC3757) 1883 0 R (cite.RFC3833) 1730 0 R (cite.RFC3845) 1885 0 R (cite.RFC3901) 1849 0 R (cite.RFC4033) 1732 0 R (cite.RFC4034) 1734 0 R (cite.RFC4035) 1736 0 R (cite.RFC4074) 1746 0 R (cite.RFC974) 1699 0 R (cite.id2506284) 1890 0 R (clients-per-query) 1604 0 R (configuration_file_elements) 1168 0 R (controls_statement_definition_and_usage) 1043 0 R (diagnostic_tools) 978 0 R (dynamic_update) 1066 0 R (dynamic_update_policies) 1118 0 R (dynamic_update_security) 1330 0 R (empty) 1406 0 R (historical_dns_information) 1677 0 R (id2466560) 946 0 R (id2466583) 947 0 R (id2467290) 1081 0 R (id2467308) 1082 0 R (id2467474) 948 0 R (id2467483) 949 0 R (id2467723) 960 0 R (id2467745) 961 0 R (id2467779) 962 0 R (id2467863) 965 0 R (id2467956) 958 0 R (id2470261) 972 0 R (id2470284) 975 0 R (id2470382) 976 0 R (id2470404) 977 0 R (id2470502) 983 0 R (id2470537) 984 0 R (id2470564) 985 0 R (id2470598) 991 0 R (id2470625) 992 0 R (id2470637) 993 0 R (id2470731) 996 0 R (id2470742) 1002 0 R (id2470774) 1009 0 R (id2470790) 1010 0 R (id2470812) 1016 0 R (id2470829) 1017 0 R (id2471235) 1020 0 R (id2471240) 1021 0 R (id2473016) 1048 0 R (id2473028) 1049 0 R (id2473683) 1098 0 R (id2473700) 1099 0 R (id2474421) 1104 0 R (id2474439) 1105 0 R (id2474450) 1106 0 R (id2474554) 1107 0 R (id2474680) 1112 0 R (id2474728) 1114 0 R (id2474742) 1115 0 R (id2474791) 1116 0 R (id2474859) 1124 0 R (id2475006) 1125 0 R (id2475156) 1130 0 R (id2475394) 1138 0 R (id2475524) 1145 0 R (id2475545) 1146 0 R (id2475578) 1156 0 R (id2475862) 1169 0 R (id2476724) 1177 0 R (id2476752) 1182 0 R (id2476957) 1183 0 R (id2476972) 1184 0 R (id2477070) 1190 0 R (id2477213) 1192 0 R (id2477656) 1198 0 R (id2477699) 1200 0 R (id2477846) 1202 0 R (id2478275) 1210 0 R (id2478292) 1211 0 R (id2478315) 1217 0 R (id2478339) 1218 0 R (id2478498) 1222 0 R (id2478624) 1223 0 R (id2478676) 1228 0 R (id2479437) 1239 0 R (id2480103) 1250 0 R (id2480163) 1251 0 R (id2480548) 1253 0 R (id2480621) 1258 0 R (id2480685) 1261 0 R (id2480729) 1262 0 R (id2480744) 1263 0 R (id2483230) 1292 0 R (id2485002) 1317 0 R (id2485061) 1319 0 R (id2485635) 1335 0 R (id2486906) 1353 0 R (id2486966) 1355 0 R (id2487320) 1368 0 R (id2487822) 1382 0 R (id2489986) 1428 0 R (id2490140) 1429 0 R (id2490192) 1430 0 R (id2490410) 1436 0 R (id2491952) 1450 0 R (id2491959) 1451 0 R (id2491964) 1452 0 R (id2492318) 1463 0 R (id2492352) 1464 0 R (id2494048) 1519 0 R (id2494430) 1525 0 R (id2494449) 1526 0 R (id2494537) 1533 0 R (id2494706) 1535 0 R (id2495944) 1541 0 R (id2496072) 1547 0 R (id2496093) 1548 0 R (id2496388) 1550 0 R (id2496524) 1557 0 R (id2496542) 1558 0 R (id2497015) 1561 0 R (id2497140) 1567 0 R (id2497155) 1568 0 R (id2497267) 1570 0 R (id2497289) 1571 0 R (id2497305) 1572 0 R (id2497434) 1577 0 R (id2497504) 1578 0 R (id2497676) 1579 0 R (id2497738) 1580 0 R (id2498169) 1587 0 R (id2498604) 1599 0 R (id2498610) 1600 0 R (id2500077) 1609 0 R (id2500084) 1610 0 R (id2500529) 1612 0 R (id2500534) 1613 0 R (id2501479) 1619 0 R (id2501648) 1620 0 R (id2501989) 1629 0 R (id2502163) 1644 0 R (id2502312) 1645 0 R (id2502440) 1646 0 R (id2502588) 1661 0 R (id2502594) 1662 0 R (id2502605) 1663 0 R (id2502622) 1664 0 R (id2502753) 1676 0 R (id2502993) 1682 0 R (id2503180) 1687 0 R (id2503182) 1693 0 R (id2503191) 1698 0 R (id2503214) 1694 0 R (id2503238) 1696 0 R (id2503274) 1707 0 R (id2503301) 1709 0 R (id2503326) 1701 0 R (id2503351) 1703 0 R (id2503374) 1705 0 R (id2503430) 1711 0 R (id2503457) 1713 0 R (id2503483) 1715 0 R (id2503545) 1717 0 R (id2503575) 1719 0 R (id2503605) 1721 0 R (id2503632) 1723 0 R (id2503706) 1726 0 R (id2503714) 1727 0 R (id2503740) 1729 0 R (id2503845) 1731 0 R (id2503910) 1733 0 R (id2503975) 1735 0 R (id2504040) 1738 0 R (id2504049) 1739 0 R (id2504074) 1741 0 R (id2504142) 1743 0 R (id2504178) 1745 0 R (id2504218) 1753 0 R (id2504224) 1754 0 R (id2504281) 1756 0 R (id2504318) 1764 0 R (id2504354) 1758 0 R (id2504408) 1760 0 R (id2504446) 1762 0 R (id2504472) 1766 0 R (id2504498) 1768 0 R (id2504524) 1770 0 R (id2504551) 1772 0 R (id2504590) 1774 0 R (id2504620) 1776 0 R (id2504650) 1778 0 R (id2504693) 1780 0 R (id2504726) 1782 0 R (id2504753) 1784 0 R (id2504844) 1786 0 R (id2504902) 1788 0 R (id2504926) 1791 0 R (id2504934) 1792 0 R (id2504960) 1794 0 R (id2504982) 1796 0 R (id2505005) 1798 0 R (id2505051) 1800 0 R (id2505075) 1802 0 R (id2505125) 1809 0 R (id2505132) 1810 0 R (id2505156) 1812 0 R (id2505182) 1814 0 R (id2505209) 1816 0 R (id2505245) 1818 0 R (id2505286) 1821 0 R (id2505291) 1822 0 R (id2505323) 1824 0 R (id2505369) 1826 0 R (id2505404) 1828 0 R (id2505431) 1831 0 R (id2505449) 1832 0 R (id2505472) 1834 0 R (id2505497) 1836 0 R (id2505523) 1838 0 R (id2505546) 1840 0 R (id2505592) 1842 0 R (id2505616) 1844 0 R (id2505642) 1846 0 R (id2505668) 1848 0 R (id2505705) 1851 0 R (id2505712) 1852 0 R (id2505769) 1854 0 R (id2505796) 1856 0 R (id2505832) 1863 0 R (id2505844) 1864 0 R (id2505883) 1866 0 R (id2505910) 1868 0 R (id2505940) 1870 0 R (id2505965) 1872 0 R (id2505992) 1874 0 R (id2506028) 1876 0 R (id2506065) 1878 0 R (id2506091) 1880 0 R (id2506118) 1882 0 R (id2506163) 1884 0 R (id2506204) 1887 0 R (id2506282) 1889 0 R (id2506284) 1891 0 R (incremental_zone_transfers) 1078 0 R (internet_drafts) 1886 0 R (ipv6addresses) 1140 0 R (journal) 1067 0 R (lwresd) 1157 0 R (man.dig) 1897 0 R (man.dnssec-dsfromkey) 1945 0 R (man.dnssec-keyfromlabel) 1959 0 R (man.dnssec-keygen) 1976 0 R (man.dnssec-signzone) 1993 0 R (man.host) 1930 0 R (man.named) 2047 0 R (man.named-checkconf) 2019 0 R (man.named-checkzone) 2031 0 R (man.nsupdate) 2070 0 R (man.rndc) 2095 0 R (man.rndc-confgen) 2124 0 R (man.rndc.conf) 2108 0 R (notify) 1057 0 R (options) 1276 0 R (page.1) 710 0 R (page.10) 1034 0 R (page.100) 1861 0 R (page.101) 1895 0 R (page.102) 1904 0 R (page.103) 1910 0 R (page.104) 1916 0 R (page.105) 1920 0 R (page.106) 1925 0 R (page.107) 1936 0 R (page.108) 1941 0 R (page.109) 1953 0 R (page.11) 1041 0 R (page.110) 1965 0 R (page.111) 1972 0 R (page.112) 1984 0 R (page.113) 1988 0 R (page.114) 1999 0 R (page.115) 2005 0 R (page.116) 2010 0 R (page.117) 2016 0 R (page.118) 2029 0 R (page.119) 2039 0 R (page.12) 1047 0 R (page.120) 2043 0 R (page.121) 2055 0 R (page.122) 2060 0 R (page.123) 2066 0 R (page.124) 2077 0 R (page.125) 2082 0 R (page.126) 2086 0 R (page.127) 2093 0 R (page.128) 2104 0 R (page.129) 2115 0 R (page.13) 1055 0 R (page.130) 2120 0 R (page.131) 2131 0 R (page.132) 2137 0 R (page.14) 1077 0 R (page.15) 1087 0 R (page.16) 1092 0 R (page.17) 1096 0 R (page.18) 1103 0 R (page.19) 1111 0 R (page.2) 734 0 R (page.20) 1122 0 R (page.21) 1129 0 R (page.22) 1134 0 R (page.23) 1144 0 R (page.24) 1150 0 R (page.25) 1154 0 R (page.26) 1162 0 R (page.27) 1166 0 R (page.28) 1176 0 R (page.29) 1181 0 R (page.3) 971 0 R (page.30) 1189 0 R (page.31) 1197 0 R (page.32) 1207 0 R (page.33) 1216 0 R (page.34) 1227 0 R (page.35) 1232 0 R (page.36) 1238 0 R (page.37) 1244 0 R (page.38) 1249 0 R (page.39) 1257 0 R (page.4) 982 0 R (page.40) 1267 0 R (page.41) 1271 0 R (page.42) 1275 0 R (page.43) 1280 0 R (page.44) 1287 0 R (page.45) 1291 0 R (page.46) 1297 0 R (page.47) 1308 0 R (page.48) 1312 0 R (page.49) 1316 0 R (page.5) 989 0 R (page.50) 1327 0 R (page.51) 1334 0 R (page.52) 1339 0 R (page.53) 1344 0 R (page.54) 1348 0 R (page.55) 1352 0 R (page.56) 1360 0 R (page.57) 1367 0 R (page.58) 1373 0 R (page.59) 1380 0 R (page.6) 1001 0 R (page.60) 1387 0 R (page.61) 1393 0 R (page.62) 1403 0 R (page.63) 1411 0 R (page.64) 1415 0 R (page.65) 1420 0 R (page.66) 1426 0 R (page.67) 1435 0 R (page.68) 1441 0 R (page.69) 1445 0 R (page.7) 1006 0 R (page.70) 1449 0 R (page.71) 1456 0 R (page.72) 1461 0 R (page.73) 1476 0 R (page.74) 1490 0 R (page.75) 1514 0 R (page.76) 1524 0 R (page.77) 1530 0 R (page.78) 1540 0 R (page.79) 1546 0 R (page.8) 1015 0 R (page.80) 1556 0 R (page.81) 1566 0 R (page.82) 1576 0 R (page.83) 1585 0 R (page.84) 1592 0 R (page.85) 1598 0 R (page.86) 1608 0 R (page.87) 1618 0 R (page.88) 1625 0 R (page.89) 1633 0 R (page.9) 1026 0 R (page.90) 1639 0 R (page.91) 1650 0 R (page.92) 1655 0 R (page.93) 1659 0 R (page.94) 1670 0 R (page.95) 1674 0 R (page.96) 1681 0 R (page.97) 1691 0 R (page.98) 1751 0 R (page.99) 1807 0 R (page.i) 744 0 R (page.ii) 799 0 R (page.iii) 863 0 R (page.iv) 925 0 R (proposed_standards) 1083 0 R (query_address) 1340 0 R (rfcs) 967 0 R (rndc) 1212 0 R (root_delegation_only) 1472 0 R (rrset_ordering) 1022 0 R (sample_configuration) 1008 0 R (section*.10) 1820 0 R (section*.100) 2106 0 R (section*.101) 2107 0 R (section*.102) 2109 0 R (section*.103) 2110 0 R (section*.104) 2111 0 R (section*.105) 2116 0 R (section*.106) 2121 0 R (section*.107) 2122 0 R (section*.108) 2123 0 R (section*.109) 2125 0 R (section*.11) 1830 0 R (section*.110) 2126 0 R (section*.111) 2127 0 R (section*.112) 2132 0 R (section*.113) 2133 0 R (section*.114) 2138 0 R (section*.115) 2139 0 R (section*.12) 1850 0 R (section*.13) 1862 0 R (section*.14) 1888 0 R (section*.15) 1898 0 R (section*.16) 1899 0 R (section*.17) 1900 0 R (section*.18) 1905 0 R (section*.19) 1906 0 R (section*.2) 1686 0 R (section*.20) 1911 0 R (section*.21) 1921 0 R (section*.22) 1926 0 R (section*.23) 1927 0 R (section*.24) 1928 0 R (section*.25) 1929 0 R (section*.26) 1931 0 R (section*.27) 1932 0 R (section*.28) 1937 0 R (section*.29) 1942 0 R (section*.3) 1692 0 R (section*.30) 1943 0 R (section*.31) 1944 0 R (section*.32) 1946 0 R (section*.33) 1947 0 R (section*.34) 1948 0 R (section*.35) 1949 0 R (section*.36) 1954 0 R (section*.37) 1955 0 R (section*.38) 1956 0 R (section*.39) 1957 0 R (section*.4) 1700 0 R (section*.40) 1958 0 R (section*.41) 1960 0 R (section*.42) 1966 0 R (section*.43) 1967 0 R (section*.44) 1968 0 R (section*.45) 1973 0 R (section*.46) 1974 0 R (section*.47) 1975 0 R (section*.48) 1977 0 R (section*.49) 1978 0 R (section*.5) 1725 0 R (section*.50) 1979 0 R (section*.51) 1980 0 R (section*.52) 1989 0 R (section*.53) 1990 0 R (section*.54) 1991 0 R (section*.55) 1992 0 R (section*.56) 1994 0 R (section*.57) 1995 0 R (section*.58) 2000 0 R (section*.59) 2001 0 R (section*.6) 1737 0 R (section*.60) 2011 0 R (section*.61) 2012 0 R (section*.62) 2017 0 R (section*.63) 2018 0 R (section*.64) 2020 0 R (section*.65) 2021 0 R (section*.66) 2022 0 R (section*.67) 2023 0 R (section*.68) 2024 0 R (section*.69) 2025 0 R (section*.7) 1752 0 R (section*.70) 2030 0 R (section*.71) 2032 0 R (section*.72) 2033 0 R (section*.73) 2034 0 R (section*.74) 2035 0 R (section*.75) 2044 0 R (section*.76) 2045 0 R (section*.77) 2046 0 R (section*.78) 2048 0 R (section*.79) 2049 0 R (section*.8) 1790 0 R (section*.80) 2050 0 R (section*.81) 2051 0 R (section*.82) 2061 0 R (section*.83) 2062 0 R (section*.84) 2067 0 R (section*.85) 2068 0 R (section*.86) 2069 0 R (section*.87) 2071 0 R (section*.88) 2072 0 R (section*.89) 2073 0 R (section*.9) 1808 0 R (section*.90) 2078 0 R (section*.91) 2087 0 R (section*.92) 2088 0 R (section*.93) 2089 0 R (section*.94) 2094 0 R (section*.95) 2096 0 R (section*.96) 2097 0 R (section*.97) 2098 0 R (section*.98) 2099 0 R (section*.99) 2105 0 R (section.1.1) 10 0 R (section.1.2) 14 0 R (section.1.3) 18 0 R (section.1.4) 22 0 R (section.2.1) 70 0 R (section.2.2) 74 0 R (section.2.3) 78 0 R (section.2.4) 82 0 R (section.2.5) 86 0 R (section.3.1) 94 0 R (section.3.2) 106 0 R (section.3.3) 110 0 R (section.4.1) 134 0 R (section.4.2) 138 0 R (section.4.3) 146 0 R (section.4.4) 150 0 R (section.4.5) 158 0 R (section.4.6) 194 0 R (section.4.7) 198 0 R (section.4.8) 202 0 R (section.4.9) 218 0 R (section.5.1) 234 0 R (section.5.2) 238 0 R (section.6.1) 246 0 R (section.6.2) 274 0 R (section.6.3) 482 0 R (section.6.4) 538 0 R (section.7.1) 574 0 R (section.7.2) 578 0 R (section.7.3) 590 0 R (section.8.1) 598 0 R (section.8.2) 606 0 R (section.8.3) 610 0 R (section.A.1) 618 0 R (section.A.2) 626 0 R (section.A.3) 634 0 R (section.B.1) 654 0 R (section.B.10) 690 0 R (section.B.11) 694 0 R (section.B.12) 698 0 R (section.B.13) 702 0 R (section.B.2) 658 0 R (section.B.3) 662 0 R (section.B.4) 666 0 R (section.B.5) 670 0 R (section.B.6) 674 0 R (section.B.7) 678 0 R (section.B.8) 682 0 R (section.B.9) 686 0 R (server_resource_limits) 1362 0 R (server_statement_definition_and_usage) 1304 0 R (server_statement_grammar) 1416 0 R (statistics) 1586 0 R (statistics_counters) 1594 0 R (statschannels) 1427 0 R (statsfile) 1283 0 R (subsection.1.4.1) 26 0 R (subsection.1.4.2) 30 0 R (subsection.1.4.3) 34 0 R (subsection.1.4.4) 38 0 R (subsection.1.4.5) 54 0 R (subsection.1.4.6) 62 0 R (subsection.3.1.1) 98 0 R (subsection.3.1.2) 102 0 R (subsection.3.3.1) 114 0 R (subsection.3.3.2) 126 0 R (subsection.4.2.1) 142 0 R (subsection.4.4.1) 154 0 R (subsection.4.5.1) 162 0 R (subsection.4.5.2) 174 0 R (subsection.4.5.3) 178 0 R (subsection.4.5.4) 182 0 R (subsection.4.5.5) 186 0 R (subsection.4.5.6) 190 0 R (subsection.4.8.1) 206 0 R (subsection.4.8.2) 210 0 R (subsection.4.8.3) 214 0 R (subsection.4.9.1) 222 0 R (subsection.4.9.2) 226 0 R (subsection.6.1.1) 250 0 R (subsection.6.1.2) 262 0 R (subsection.6.2.1) 278 0 R (subsection.6.2.10) 314 0 R (subsection.6.2.11) 330 0 R (subsection.6.2.12) 334 0 R (subsection.6.2.13) 338 0 R (subsection.6.2.14) 342 0 R (subsection.6.2.15) 346 0 R (subsection.6.2.16) 350 0 R (subsection.6.2.17) 426 0 R (subsection.6.2.18) 430 0 R (subsection.6.2.19) 434 0 R (subsection.6.2.2) 282 0 R (subsection.6.2.20) 438 0 R (subsection.6.2.21) 442 0 R (subsection.6.2.22) 446 0 R (subsection.6.2.23) 450 0 R (subsection.6.2.24) 454 0 R (subsection.6.2.25) 458 0 R (subsection.6.2.26) 462 0 R (subsection.6.2.3) 286 0 R (subsection.6.2.4) 290 0 R (subsection.6.2.5) 294 0 R (subsection.6.2.6) 298 0 R (subsection.6.2.7) 302 0 R (subsection.6.2.8) 306 0 R (subsection.6.2.9) 310 0 R (subsection.6.3.1) 486 0 R (subsection.6.3.2) 498 0 R (subsection.6.3.3) 502 0 R (subsection.6.3.4) 506 0 R (subsection.6.3.5) 510 0 R (subsection.6.3.6) 530 0 R (subsection.6.3.7) 534 0 R (subsection.6.4.1) 546 0 R (subsection.7.2.1) 582 0 R (subsection.7.2.2) 586 0 R (subsection.8.1.1) 602 0 R (subsection.A.1.1) 622 0 R (subsection.A.2.1) 630 0 R (subsection.A.3.1) 638 0 R (subsection.A.3.2) 642 0 R (subsection.A.3.3) 646 0 R (subsubsection.1.4.4.1) 42 0 R (subsubsection.1.4.4.2) 46 0 R (subsubsection.1.4.4.3) 50 0 R (subsubsection.1.4.5.1) 58 0 R (subsubsection.3.3.1.1) 118 0 R (subsubsection.3.3.1.2) 122 0 R (subsubsection.4.5.1.1) 166 0 R (subsubsection.4.5.1.2) 170 0 R (subsubsection.6.1.1.1) 254 0 R (subsubsection.6.1.1.2) 258 0 R (subsubsection.6.1.2.1) 266 0 R (subsubsection.6.1.2.2) 270 0 R (subsubsection.6.2.10.1) 318 0 R (subsubsection.6.2.10.2) 322 0 R (subsubsection.6.2.10.3) 326 0 R (subsubsection.6.2.16.1) 354 0 R (subsubsection.6.2.16.10) 390 0 R (subsubsection.6.2.16.11) 394 0 R (subsubsection.6.2.16.12) 398 0 R (subsubsection.6.2.16.13) 402 0 R (subsubsection.6.2.16.14) 406 0 R (subsubsection.6.2.16.15) 410 0 R (subsubsection.6.2.16.16) 414 0 R (subsubsection.6.2.16.17) 418 0 R (subsubsection.6.2.16.18) 422 0 R (subsubsection.6.2.16.2) 358 0 R (subsubsection.6.2.16.3) 362 0 R (subsubsection.6.2.16.4) 366 0 R (subsubsection.6.2.16.5) 370 0 R (subsubsection.6.2.16.6) 374 0 R (subsubsection.6.2.16.7) 378 0 R (subsubsection.6.2.16.8) 382 0 R (subsubsection.6.2.16.9) 386 0 R (subsubsection.6.2.26.1) 466 0 R (subsubsection.6.2.26.2) 470 0 R (subsubsection.6.2.26.3) 474 0 R (subsubsection.6.2.26.4) 478 0 R (subsubsection.6.3.1.1) 490 0 R (subsubsection.6.3.1.2) 494 0 R (subsubsection.6.3.5.1) 514 0 R (subsubsection.6.3.5.2) 518 0 R (subsubsection.6.3.5.3) 522 0 R (subsubsection.6.3.5.4) 526 0 R (subsubsection.6.4.0.1) 542 0 R (subsubsection.6.4.1.1) 550 0 R (subsubsection.6.4.1.2) 554 0 R (subsubsection.6.4.1.3) 558 0 R (subsubsection.6.4.1.4) 562 0 R (subsubsection.6.4.1.5) 566 0 R (table.1.1) 950 0 R (table.1.2) 959 0 R (table.3.1) 1018 0 R (table.3.2) 1050 0 R (table.6.1) 1170 0 R (table.6.10) 1534 0 R (table.6.11) 1536 0 R (table.6.12) 1542 0 R (table.6.13) 1549 0 R (table.6.14) 1551 0 R (table.6.15) 1559 0 R (table.6.16) 1562 0 R (table.6.17) 1569 0 R (table.6.18) 1581 0 R (table.6.19) 1588 0 R (table.6.2) 1193 0 R (table.6.20) 1601 0 R (table.6.21) 1611 0 R (table.6.22) 1614 0 R (table.6.23) 1621 0 R (table.6.3) 1201 0 R (table.6.4) 1240 0 R (table.6.5) 1252 0 R (table.6.6) 1293 0 R (table.6.7) 1383 0 R (table.6.8) 1457 0 R (table.6.9) 1520 0 R (the_category_phrase) 1234 0 R (the_sortlist_statement) 1374 0 R (topology) 1369 0 R (tsig) 1097 0 R (tuning) 1388 0 R (types_of_resource_records_and_when_to_use_them) 966 0 R (view_statement_grammar) 1407 0 R (zone_statement_grammar) 1323 0 R (zone_transfers) 1073 0 R (zonefile_format) 1399 0 R]
+2730 0 obj <<
+/Names [(Access_Control_Lists) 2059 0 R (Bv9ARM.ch01) 1220 0 R (Bv9ARM.ch02) 1264 0 R (Bv9ARM.ch03) 1282 0 R (Bv9ARM.ch04) 1346 0 R (Bv9ARM.ch05) 1525 0 R (Bv9ARM.ch06) 1536 0 R (Bv9ARM.ch07) 2058 0 R (Bv9ARM.ch08) 2084 0 R (Bv9ARM.ch09) 2099 0 R (Bv9ARM.ch10) 2360 0 R (Configuration_File_Grammar) 1559 0 R (DNSSEC) 1412 0 R (Doc-Start) 927 0 R (Setting_TTLs) 1980 0 R (acache) 1271 0 R (access_control) 1710 0 R (acl) 1568 0 R (address_match_lists) 1541 0 R (admin_tools) 1304 0 R (appendix.A) 742 0 R (appendix.B) 834 0 R (bibliography) 2107 0 R (bind9.library) 2316 0 R (boolean_options) 1361 0 R (builtin) 1785 0 R (chapter*.1) 961 0 R (chapter.1) 6 0 R (chapter.2) 66 0 R (chapter.3) 90 0 R (chapter.4) 130 0 R (chapter.5) 342 0 R (chapter.6) 354 0 R (chapter.7) 698 0 R (chapter.8) 722 0 R (cite.RFC1033) 2235 0 R (cite.RFC1034) 2120 0 R (cite.RFC1035) 2122 0 R (cite.RFC1101) 2217 0 R (cite.RFC1123) 2219 0 R (cite.RFC1183) 2179 0 R (cite.RFC1464) 2257 0 R (cite.RFC1535) 2165 0 R (cite.RFC1536) 2167 0 R (cite.RFC1537) 2237 0 R (cite.RFC1591) 2221 0 R (cite.RFC1706) 2181 0 R (cite.RFC1712) 2277 0 R (cite.RFC1713) 2259 0 R (cite.RFC1794) 2261 0 R (cite.RFC1876) 2183 0 R (cite.RFC1912) 2239 0 R (cite.RFC1982) 2169 0 R (cite.RFC1995) 2127 0 R (cite.RFC1996) 2129 0 R (cite.RFC2010) 2241 0 R (cite.RFC2052) 2185 0 R (cite.RFC2065) 2289 0 R (cite.RFC2136) 2131 0 R (cite.RFC2137) 2291 0 R (cite.RFC2163) 2187 0 R (cite.RFC2168) 2189 0 R (cite.RFC2181) 2133 0 R (cite.RFC2219) 2243 0 R (cite.RFC2230) 2191 0 R (cite.RFC2240) 2263 0 R (cite.RFC2308) 2135 0 R (cite.RFC2317) 2223 0 R (cite.RFC2345) 2265 0 R (cite.RFC2352) 2267 0 R (cite.RFC2535) 2293 0 R (cite.RFC2536) 2193 0 R (cite.RFC2537) 2195 0 R (cite.RFC2538) 2197 0 R (cite.RFC2539) 2199 0 R (cite.RFC2540) 2201 0 R (cite.RFC2671) 2137 0 R (cite.RFC2672) 2139 0 R (cite.RFC2673) 2279 0 R (cite.RFC2782) 2203 0 R (cite.RFC2825) 2247 0 R (cite.RFC2826) 2225 0 R (cite.RFC2845) 2141 0 R (cite.RFC2874) 2281 0 R (cite.RFC2915) 2205 0 R (cite.RFC2929) 2227 0 R (cite.RFC2930) 2143 0 R (cite.RFC2931) 2145 0 R (cite.RFC3007) 2147 0 R (cite.RFC3008) 2295 0 R (cite.RFC3071) 2269 0 R (cite.RFC3090) 2297 0 R (cite.RFC3110) 2207 0 R (cite.RFC3123) 2209 0 R (cite.RFC3225) 2153 0 R (cite.RFC3258) 2271 0 R (cite.RFC3445) 2299 0 R (cite.RFC3490) 2249 0 R (cite.RFC3491) 2251 0 R (cite.RFC3492) 2253 0 R (cite.RFC3596) 2211 0 R (cite.RFC3597) 2213 0 R (cite.RFC3645) 2149 0 R (cite.RFC3655) 2301 0 R (cite.RFC3658) 2303 0 R (cite.RFC3755) 2305 0 R (cite.RFC3757) 2307 0 R (cite.RFC3833) 2155 0 R (cite.RFC3845) 2309 0 R (cite.RFC3901) 2273 0 R (cite.RFC4033) 2157 0 R (cite.RFC4034) 2159 0 R (cite.RFC4035) 2161 0 R (cite.RFC4074) 2171 0 R (cite.RFC974) 2124 0 R (cite.id2511436) 2314 0 R (clients-per-query) 2034 0 R (configuration_file_elements) 1537 0 R (controls_statement_definition_and_usage) 1329 0 R (diagnostic_tools) 1252 0 R (dnssec.dynamic.zones) 1432 0 R (dynamic_update) 1356 0 R (dynamic_update_policies) 1318 0 R (dynamic_update_security) 1721 0 R (empty) 1794 0 R (historical_dns_information) 2101 0 R (id2466563) 1221 0 R (id2466586) 1222 0 R (id2467270) 1411 0 R (id2467406) 1413 0 R (id2467477) 1223 0 R (id2467486) 1224 0 R (id2467726) 1234 0 R (id2467748) 1235 0 R (id2467782) 1236 0 R (id2467866) 1239 0 R (id2467959) 1232 0 R (id2470264) 1246 0 R (id2470288) 1249 0 R (id2470386) 1250 0 R (id2470407) 1251 0 R (id2470505) 1257 0 R (id2470540) 1258 0 R (id2470567) 1259 0 R (id2470601) 1265 0 R (id2470628) 1266 0 R (id2470709) 1267 0 R (id2470734) 1270 0 R (id2470745) 1276 0 R (id2470777) 1284 0 R (id2470793) 1285 0 R (id2470816) 1290 0 R (id2470833) 1291 0 R (id2471238) 1299 0 R (id2471243) 1300 0 R (id2473326) 1334 0 R (id2473338) 1335 0 R (id2473765) 1371 0 R (id2473851) 1377 0 R (id2474284) 1393 0 R (id2474301) 1394 0 R (id2474340) 1395 0 R (id2474358) 1396 0 R (id2474369) 1397 0 R (id2474405) 1402 0 R (id2474531) 1403 0 R (id2474580) 1405 0 R (id2474594) 1406 0 R (id2475200) 1418 0 R (id2475281) 1419 0 R (id2475706) 1433 0 R (id2475744) 1434 0 R (id2475780) 1439 0 R (id2475862) 1445 0 R (id2475899) 1452 0 R (id2475912) 1453 0 R (id2475945) 1454 0 R (id2476040) 1455 0 R (id2476050) 1460 0 R (id2476059) 1461 0 R (id2476072) 1462 0 R (id2476178) 1463 0 R (id2476187) 1464 0 R (id2476224) 1466 0 R (id2476314) 1473 0 R (id2476484) 1479 0 R (id2476648) 1485 0 R (id2476786) 1486 0 R (id2476891) 1491 0 R (id2476900) 1492 0 R (id2476931) 1493 0 R (id2476986) 1494 0 R (id2477085) 1499 0 R (id2477420) 1505 0 R (id2477466) 1506 0 R (id2477521) 1511 0 R (id2477651) 1513 0 R (id2477672) 1514 0 R (id2477705) 1526 0 R (id2477921) 1538 0 R (id2478882) 1546 0 R (id2478909) 1551 0 R (id2479115) 1552 0 R (id2479130) 1553 0 R (id2479160) 1558 0 R (id2479303) 1560 0 R (id2479837) 1567 0 R (id2479880) 1569 0 R (id2480027) 1571 0 R (id2480455) 1578 0 R (id2480472) 1584 0 R (id2480496) 1585 0 R (id2480519) 1586 0 R (id2480678) 1590 0 R (id2480804) 1595 0 R (id2480856) 1596 0 R (id2481481) 1607 0 R (id2482215) 1618 0 R (id2482345) 1619 0 R (id2482666) 1625 0 R (id2482808) 1630 0 R (id2482872) 1633 0 R (id2482916) 1634 0 R (id2482931) 1635 0 R (id2486190) 1673 0 R (id2488442) 1703 0 R (id2488501) 1709 0 R (id2489121) 1720 0 R (id2490256) 1743 0 R (id2490452) 1745 0 R (id2490806) 1754 0 R (id2491308) 1772 0 R (id2492919) 1803 0 R (id2493178) 1809 0 R (id2494065) 1827 0 R (id2494273) 1833 0 R (id2494320) 1835 0 R (id2494745) 1840 0 R (id2496290) 1858 0 R (id2496297) 1859 0 R (id2496302) 1860 0 R (id2496774) 1871 0 R (id2496875) 1872 0 R (id2499008) 1939 0 R (id2499554) 1945 0 R (id2499572) 1946 0 R (id2499660) 1949 0 R (id2499829) 1955 0 R (id2500999) 1961 0 R (id2501195) 1967 0 R (id2501217) 1968 0 R (id2501579) 1970 0 R (id2501716) 1972 0 R (id2501734) 1978 0 R (id2502206) 1981 0 R (id2502331) 1983 0 R (id2502346) 1984 0 R (id2502458) 1990 0 R (id2502481) 1991 0 R (id2502497) 1992 0 R (id2502694) 1993 0 R (id2502763) 1998 0 R (id2502800) 1999 0 R (id2502875) 2000 0 R (id2503386) 2011 0 R (id2503821) 2019 0 R (id2503827) 2020 0 R (id2505363) 2028 0 R (id2505369) 2029 0 R (id2505814) 2031 0 R (id2505819) 2032 0 R (id2506768) 2039 0 R (id2506800) 2040 0 R (id2507209) 2049 0 R (id2507520) 2068 0 R (id2507601) 2069 0 R (id2507660) 2070 0 R (id2507740) 2085 0 R (id2507746) 2086 0 R (id2507757) 2087 0 R (id2507774) 2088 0 R (id2507973) 2100 0 R (id2508213) 2106 0 R (id2508401) 2111 0 R (id2508403) 2118 0 R (id2508411) 2123 0 R (id2508435) 2119 0 R (id2508458) 2121 0 R (id2508494) 2132 0 R (id2508521) 2134 0 R (id2508547) 2126 0 R (id2508571) 2128 0 R (id2508595) 2130 0 R (id2508650) 2136 0 R (id2508677) 2138 0 R (id2508704) 2140 0 R (id2508765) 2142 0 R (id2508795) 2144 0 R (id2508825) 2146 0 R (id2508852) 2148 0 R (id2508926) 2151 0 R (id2508934) 2152 0 R (id2508961) 2154 0 R (id2508997) 2156 0 R (id2509062) 2158 0 R (id2509127) 2160 0 R (id2509192) 2163 0 R (id2509201) 2164 0 R (id2509226) 2166 0 R (id2509294) 2168 0 R (id2509330) 2170 0 R (id2509438) 2177 0 R (id2509444) 2178 0 R (id2509501) 2180 0 R (id2509539) 2188 0 R (id2509574) 2182 0 R (id2509628) 2184 0 R (id2509667) 2186 0 R (id2509692) 2190 0 R (id2509718) 2192 0 R (id2509745) 2194 0 R (id2509840) 2196 0 R (id2509879) 2198 0 R (id2509909) 2200 0 R (id2509939) 2202 0 R (id2509981) 2204 0 R (id2510014) 2206 0 R (id2510041) 2208 0 R (id2510065) 2210 0 R (id2510122) 2212 0 R (id2510147) 2215 0 R (id2510154) 2216 0 R (id2510180) 2218 0 R (id2510202) 2220 0 R (id2510226) 2222 0 R (id2510272) 2224 0 R (id2510295) 2226 0 R (id2510345) 2233 0 R (id2510353) 2234 0 R (id2510376) 2236 0 R (id2510403) 2238 0 R (id2510429) 2240 0 R (id2510466) 2242 0 R (id2510506) 2245 0 R (id2510512) 2246 0 R (id2510544) 2248 0 R (id2510589) 2250 0 R (id2510625) 2252 0 R (id2510651) 2255 0 R (id2510669) 2256 0 R (id2510692) 2258 0 R (id2510717) 2260 0 R (id2510743) 2262 0 R (id2510766) 2264 0 R (id2510812) 2266 0 R (id2510836) 2268 0 R (id2510862) 2270 0 R (id2510888) 2272 0 R (id2510925) 2275 0 R (id2510932) 2276 0 R (id2510989) 2278 0 R (id2511016) 2280 0 R (id2511052) 2287 0 R (id2511064) 2288 0 R (id2511104) 2290 0 R (id2511130) 2292 0 R (id2511160) 2294 0 R (id2511186) 2296 0 R (id2511212) 2298 0 R (id2511249) 2300 0 R (id2511285) 2302 0 R (id2511312) 2304 0 R (id2511338) 2306 0 R (id2511383) 2308 0 R (id2511425) 2311 0 R (id2511434) 2313 0 R (id2511436) 2315 0 R (id2511524) 2321 0 R (id2511533) 2322 0 R (id2511558) 2323 0 R (id2511589) 2324 0 R (id2511734) 2329 0 R (id2511829) 2331 0 R (id2511837) 2332 0 R (id2511928) 2338 0 R (id2511981) 2339 0 R (id2512045) 2340 0 R (id2512060) 2345 0 R (id2512260) 2350 0 R (id2512392) 2351 0 R (incremental_zone_transfers) 1368 0 R (internet_drafts) 2310 0 R (ipv6addresses) 1515 0 R (journal) 1367 0 R (lwresd) 1527 0 R (man.arpaname) 2670 0 R (man.ddns-confgen) 2655 0 R (man.dig) 2361 0 R (man.dnssec-dsfromkey) 2409 0 R (man.dnssec-keyfromlabel) 2428 0 R (man.dnssec-keygen) 1446 0 R (man.dnssec-revoke) 2471 0 R (man.dnssec-settime) 1447 0 R (man.dnssec-signzone) 2498 0 R (man.genrandom) 2676 0 R (man.host) 2394 0 R (man.isc-hmac-fixup) 2687 0 R (man.named) 2556 0 R (man.named-checkconf) 2523 0 R (man.named-checkzone) 2535 0 R (man.named-journalprint) 2578 0 R (man.nsec3hash) 2698 0 R (man.nsupdate) 2584 0 R (man.rndc) 2610 0 R (man.rndc-confgen) 2642 0 R (man.rndc.conf) 2626 0 R (managed-keys) 1468 0 R (notify) 1347 0 R (options) 1317 0 R (page.1) 926 0 R (page.10) 1308 0 R (page.100) 1954 0 R (page.101) 1960 0 R (page.102) 1966 0 R (page.103) 1977 0 R (page.104) 1989 0 R (page.105) 1997 0 R (page.106) 2005 0 R (page.107) 2009 0 R (page.108) 2017 0 R (page.109) 2026 0 R (page.11) 1322 0 R (page.110) 2038 0 R (page.111) 2045 0 R (page.112) 2053 0 R (page.113) 2057 0 R (page.114) 2063 0 R (page.115) 2075 0 R (page.116) 2079 0 R (page.117) 2083 0 R (page.118) 2094 0 R (page.119) 2098 0 R (page.12) 1326 0 R (page.120) 2105 0 R (page.121) 2116 0 R (page.122) 2175 0 R (page.123) 2231 0 R (page.124) 2285 0 R (page.125) 2320 0 R (page.126) 2328 0 R (page.127) 2337 0 R (page.128) 2344 0 R (page.129) 2349 0 R (page.13) 1333 0 R (page.130) 2355 0 R (page.131) 2359 0 R (page.132) 2368 0 R (page.133) 2375 0 R (page.134) 2380 0 R (page.135) 2384 0 R (page.136) 2389 0 R (page.137) 2400 0 R (page.138) 2405 0 R (page.139) 2418 0 R (page.14) 1340 0 R (page.140) 2427 0 R (page.141) 2436 0 R (page.142) 2441 0 R (page.143) 2450 0 R (page.144) 2456 0 R (page.145) 2461 0 R (page.146) 2467 0 R (page.147) 2478 0 R (page.148) 2488 0 R (page.149) 2494 0 R (page.15) 1345 0 R (page.150) 2505 0 R (page.151) 2511 0 R (page.152) 2515 0 R (page.153) 2519 0 R (page.154) 2530 0 R (page.155) 2541 0 R (page.156) 2547 0 R (page.157) 2553 0 R (page.158) 2564 0 R (page.159) 2568 0 R (page.16) 1366 0 R (page.160) 2575 0 R (page.161) 2589 0 R (page.162) 2595 0 R (page.163) 2601 0 R (page.164) 2606 0 R (page.165) 2615 0 R (page.166) 2623 0 R (page.167) 2633 0 R (page.168) 2638 0 R (page.169) 2651 0 R (page.17) 1376 0 R (page.170) 2660 0 R (page.171) 2668 0 R (page.172) 2683 0 R (page.173) 2695 0 R (page.18) 1382 0 R (page.19) 1387 0 R (page.2) 950 0 R (page.20) 1392 0 R (page.21) 1401 0 R (page.22) 1410 0 R (page.23) 1417 0 R (page.24) 1423 0 R (page.25) 1428 0 R (page.26) 1438 0 R (page.27) 1451 0 R (page.28) 1459 0 R (page.29) 1472 0 R (page.3) 1245 0 R (page.30) 1478 0 R (page.31) 1484 0 R (page.32) 1490 0 R (page.33) 1498 0 R (page.34) 1504 0 R (page.35) 1510 0 R (page.36) 1519 0 R (page.37) 1524 0 R (page.38) 1531 0 R (page.39) 1535 0 R (page.4) 1256 0 R (page.40) 1545 0 R (page.41) 1550 0 R (page.42) 1557 0 R (page.43) 1566 0 R (page.44) 1575 0 R (page.45) 1583 0 R (page.46) 1594 0 R (page.47) 1600 0 R (page.48) 1606 0 R (page.49) 1613 0 R (page.5) 1263 0 R (page.50) 1617 0 R (page.51) 1624 0 R (page.52) 1629 0 R (page.53) 1639 0 R (page.54) 1643 0 R (page.55) 1648 0 R (page.56) 1652 0 R (page.57) 1656 0 R (page.58) 1662 0 R (page.59) 1667 0 R (page.6) 1275 0 R (page.60) 1672 0 R (page.61) 1679 0 R (page.62) 1684 0 R (page.63) 1694 0 R (page.64) 1698 0 R (page.65) 1702 0 R (page.66) 1707 0 R (page.67) 1717 0 R (page.68) 1725 0 R (page.69) 1730 0 R (page.7) 1281 0 R (page.70) 1734 0 R (page.71) 1738 0 R (page.72) 1742 0 R (page.73) 1751 0 R (page.74) 1758 0 R (page.75) 1763 0 R (page.76) 1770 0 R (page.77) 1778 0 R (page.78) 1783 0 R (page.79) 1793 0 R (page.8) 1289 0 R (page.80) 1798 0 R (page.81) 1802 0 R (page.82) 1808 0 R (page.83) 1813 0 R (page.84) 1818 0 R (page.85) 1824 0 R (page.86) 1832 0 R (page.87) 1839 0 R (page.88) 1844 0 R (page.89) 1848 0 R (page.9) 1298 0 R (page.90) 1852 0 R (page.91) 1857 0 R (page.92) 1865 0 R (page.93) 1869 0 R (page.94) 1884 0 R (page.95) 1898 0 R (page.96) 1910 0 R (page.97) 1931 0 R (page.98) 1938 0 R (page.99) 1944 0 R (page.i) 960 0 R (page.ii) 1015 0 R (page.iii) 1079 0 R (page.iv) 1142 0 R (page.v) 1204 0 R (pkcs11) 1474 0 R (proposed_standards) 1372 0 R (query_address) 1726 0 R (rfc5011.support) 1465 0 R (rfcs) 1241 0 R (rndc) 1579 0 R (root_delegation_only) 1880 0 R (rrset_ordering) 1294 0 R (sample_configuration) 1283 0 R (section*.10) 2244 0 R (section*.100) 2576 0 R (section*.101) 2577 0 R (section*.102) 2579 0 R (section*.103) 2580 0 R (section*.104) 2581 0 R (section*.105) 2582 0 R (section*.106) 2583 0 R (section*.107) 2585 0 R (section*.108) 2590 0 R (section*.109) 2591 0 R (section*.11) 2254 0 R (section*.110) 2596 0 R (section*.111) 2602 0 R (section*.112) 2607 0 R (section*.113) 2608 0 R (section*.114) 2609 0 R (section*.115) 2611 0 R (section*.116) 2616 0 R (section*.117) 2617 0 R (section*.118) 2618 0 R (section*.119) 2619 0 R (section*.12) 2274 0 R (section*.120) 2624 0 R (section*.121) 2625 0 R (section*.122) 2627 0 R (section*.123) 2628 0 R (section*.124) 2629 0 R (section*.125) 2634 0 R (section*.126) 2639 0 R (section*.127) 2640 0 R (section*.128) 2641 0 R (section*.129) 2643 0 R (section*.13) 2286 0 R (section*.130) 2644 0 R (section*.131) 2645 0 R (section*.132) 2646 0 R (section*.133) 2652 0 R (section*.134) 2653 0 R (section*.135) 2654 0 R (section*.136) 2656 0 R (section*.137) 2661 0 R (section*.138) 2662 0 R (section*.139) 2663 0 R (section*.14) 2312 0 R (section*.140) 2664 0 R (section*.141) 2669 0 R (section*.142) 2671 0 R (section*.143) 2672 0 R (section*.144) 2673 0 R (section*.145) 2674 0 R (section*.146) 2675 0 R (section*.147) 2677 0 R (section*.148) 2678 0 R (section*.149) 2679 0 R (section*.15) 2362 0 R (section*.150) 2684 0 R (section*.151) 2685 0 R (section*.152) 2686 0 R (section*.153) 2688 0 R (section*.154) 2689 0 R (section*.155) 2690 0 R (section*.156) 2691 0 R (section*.157) 2696 0 R (section*.158) 2697 0 R (section*.159) 2699 0 R (section*.16) 2363 0 R (section*.160) 2700 0 R (section*.161) 2701 0 R (section*.162) 2702 0 R (section*.163) 2703 0 R (section*.164) 2704 0 R (section*.17) 2364 0 R (section*.18) 2369 0 R (section*.19) 2370 0 R (section*.2) 2110 0 R (section*.20) 2376 0 R (section*.21) 2385 0 R (section*.22) 2390 0 R (section*.23) 2391 0 R (section*.24) 2392 0 R (section*.25) 2393 0 R (section*.26) 2395 0 R (section*.27) 2396 0 R (section*.28) 2401 0 R (section*.29) 2406 0 R (section*.3) 2117 0 R (section*.30) 2407 0 R (section*.31) 2408 0 R (section*.32) 2410 0 R (section*.33) 2411 0 R (section*.34) 2412 0 R (section*.35) 2413 0 R (section*.36) 2419 0 R (section*.37) 2420 0 R (section*.38) 2421 0 R (section*.39) 2422 0 R (section*.4) 2125 0 R (section*.40) 2423 0 R (section*.41) 2429 0 R (section*.42) 2430 0 R (section*.43) 2431 0 R (section*.44) 2432 0 R (section*.45) 2437 0 R (section*.46) 2442 0 R (section*.47) 2443 0 R (section*.48) 2444 0 R (section*.49) 2445 0 R (section*.5) 2150 0 R (section*.50) 2446 0 R (section*.51) 2451 0 R (section*.52) 2452 0 R (section*.53) 2462 0 R (section*.54) 2463 0 R (section*.55) 2468 0 R (section*.56) 2469 0 R (section*.57) 2470 0 R (section*.58) 2472 0 R (section*.59) 2473 0 R (section*.6) 2162 0 R (section*.60) 2474 0 R (section*.61) 2479 0 R (section*.62) 2480 0 R (section*.63) 2481 0 R (section*.64) 2482 0 R (section*.65) 2483 0 R (section*.66) 2484 0 R (section*.67) 2489 0 R (section*.68) 2490 0 R (section*.69) 2495 0 R (section*.7) 2176 0 R (section*.70) 2496 0 R (section*.71) 2497 0 R (section*.72) 2499 0 R (section*.73) 2500 0 R (section*.74) 2501 0 R (section*.75) 2506 0 R (section*.76) 2520 0 R (section*.77) 2521 0 R (section*.78) 2522 0 R (section*.79) 2524 0 R (section*.8) 2214 0 R (section*.80) 2525 0 R (section*.81) 2526 0 R (section*.82) 2531 0 R (section*.83) 2532 0 R (section*.84) 2533 0 R (section*.85) 2534 0 R (section*.86) 2536 0 R (section*.87) 2537 0 R (section*.88) 2542 0 R (section*.89) 2543 0 R (section*.9) 2232 0 R (section*.90) 2548 0 R (section*.91) 2554 0 R (section*.92) 2555 0 R (section*.93) 2557 0 R (section*.94) 2558 0 R (section*.95) 2559 0 R (section*.96) 2560 0 R (section*.97) 2569 0 R (section*.98) 2570 0 R (section*.99) 2571 0 R (section.1.1) 10 0 R (section.1.2) 14 0 R (section.1.3) 18 0 R (section.1.4) 22 0 R (section.2.1) 70 0 R (section.2.2) 74 0 R (section.2.3) 78 0 R (section.2.4) 82 0 R (section.2.5) 86 0 R (section.3.1) 94 0 R (section.3.2) 106 0 R (section.3.3) 110 0 R (section.4.1) 134 0 R (section.4.10) 274 0 R (section.4.11) 286 0 R (section.4.12) 330 0 R (section.4.2) 138 0 R (section.4.3) 146 0 R (section.4.4) 150 0 R (section.4.5) 158 0 R (section.4.6) 194 0 R (section.4.7) 198 0 R (section.4.8) 202 0 R (section.4.9) 218 0 R (section.5.1) 346 0 R (section.5.2) 350 0 R (section.6.1) 358 0 R (section.6.2) 386 0 R (section.6.3) 610 0 R (section.6.4) 666 0 R (section.7.1) 702 0 R (section.7.2) 706 0 R (section.7.3) 718 0 R (section.8.1) 726 0 R (section.8.2) 734 0 R (section.8.3) 738 0 R (section.A.1) 746 0 R (section.A.2) 754 0 R (section.A.3) 762 0 R (section.A.4) 778 0 R (section.B.1) 838 0 R (section.B.10) 874 0 R (section.B.11) 878 0 R (section.B.12) 882 0 R (section.B.13) 886 0 R (section.B.14) 890 0 R (section.B.15) 894 0 R (section.B.16) 898 0 R (section.B.17) 902 0 R (section.B.18) 906 0 R (section.B.19) 910 0 R (section.B.2) 842 0 R (section.B.20) 914 0 R (section.B.21) 918 0 R (section.B.3) 846 0 R (section.B.4) 850 0 R (section.B.5) 854 0 R (section.B.6) 858 0 R (section.B.7) 862 0 R (section.B.8) 866 0 R (section.B.9) 870 0 R (server_resource_limits) 1752 0 R (server_statement_definition_and_usage) 1690 0 R (server_statement_grammar) 1814 0 R (statistics) 2010 0 R (statistics_counters) 2018 0 R (statschannels) 1826 0 R (statsfile) 1658 0 R (subsection.1.4.1) 26 0 R (subsection.1.4.2) 30 0 R (subsection.1.4.3) 34 0 R (subsection.1.4.4) 38 0 R (subsection.1.4.5) 54 0 R (subsection.1.4.6) 62 0 R (subsection.3.1.1) 98 0 R (subsection.3.1.2) 102 0 R (subsection.3.3.1) 114 0 R (subsection.3.3.2) 126 0 R (subsection.4.10.1) 278 0 R (subsection.4.10.2) 282 0 R (subsection.4.11.1) 290 0 R (subsection.4.11.2) 302 0 R (subsection.4.11.3) 314 0 R (subsection.4.11.4) 318 0 R (subsection.4.11.5) 322 0 R (subsection.4.11.6) 326 0 R (subsection.4.12.1) 334 0 R (subsection.4.12.2) 338 0 R (subsection.4.2.1) 142 0 R (subsection.4.4.1) 154 0 R (subsection.4.5.1) 162 0 R (subsection.4.5.2) 174 0 R (subsection.4.5.3) 178 0 R (subsection.4.5.4) 182 0 R (subsection.4.5.5) 186 0 R (subsection.4.5.6) 190 0 R (subsection.4.8.1) 206 0 R (subsection.4.8.2) 210 0 R (subsection.4.8.3) 214 0 R (subsection.4.9.1) 222 0 R (subsection.4.9.10) 258 0 R (subsection.4.9.11) 262 0 R (subsection.4.9.12) 266 0 R (subsection.4.9.13) 270 0 R (subsection.4.9.2) 226 0 R (subsection.4.9.3) 230 0 R (subsection.4.9.4) 234 0 R (subsection.4.9.5) 238 0 R (subsection.4.9.6) 242 0 R (subsection.4.9.7) 246 0 R (subsection.4.9.8) 250 0 R (subsection.4.9.9) 254 0 R (subsection.6.1.1) 362 0 R (subsection.6.1.2) 374 0 R (subsection.6.2.1) 390 0 R (subsection.6.2.10) 426 0 R (subsection.6.2.11) 442 0 R (subsection.6.2.12) 446 0 R (subsection.6.2.13) 450 0 R (subsection.6.2.14) 454 0 R (subsection.6.2.15) 458 0 R (subsection.6.2.16) 462 0 R (subsection.6.2.17) 546 0 R (subsection.6.2.18) 550 0 R (subsection.6.2.19) 554 0 R (subsection.6.2.2) 394 0 R (subsection.6.2.20) 558 0 R (subsection.6.2.21) 562 0 R (subsection.6.2.22) 566 0 R (subsection.6.2.23) 570 0 R (subsection.6.2.24) 574 0 R (subsection.6.2.25) 578 0 R (subsection.6.2.26) 582 0 R (subsection.6.2.27) 586 0 R (subsection.6.2.28) 590 0 R (subsection.6.2.3) 398 0 R (subsection.6.2.4) 402 0 R (subsection.6.2.5) 406 0 R (subsection.6.2.6) 410 0 R (subsection.6.2.7) 414 0 R (subsection.6.2.8) 418 0 R (subsection.6.2.9) 422 0 R (subsection.6.3.1) 614 0 R (subsection.6.3.2) 626 0 R (subsection.6.3.3) 630 0 R (subsection.6.3.4) 634 0 R (subsection.6.3.5) 638 0 R (subsection.6.3.6) 658 0 R (subsection.6.3.7) 662 0 R (subsection.6.4.1) 674 0 R (subsection.7.2.1) 710 0 R (subsection.7.2.2) 714 0 R (subsection.8.1.1) 730 0 R (subsection.A.1.1) 750 0 R (subsection.A.2.1) 758 0 R (subsection.A.3.1) 766 0 R (subsection.A.3.2) 770 0 R (subsection.A.3.3) 774 0 R (subsection.A.4.1) 782 0 R (subsection.A.4.2) 786 0 R (subsection.A.4.3) 790 0 R (subsection.A.4.4) 794 0 R (subsection.A.4.5) 798 0 R (subsection.A.4.6) 802 0 R (subsection.A.4.7) 830 0 R (subsubsection.1.4.4.1) 42 0 R (subsubsection.1.4.4.2) 46 0 R (subsubsection.1.4.4.3) 50 0 R (subsubsection.1.4.5.1) 58 0 R (subsubsection.3.3.1.1) 118 0 R (subsubsection.3.3.1.2) 122 0 R (subsubsection.4.11.1.1) 294 0 R (subsubsection.4.11.1.2) 298 0 R (subsubsection.4.11.2.1) 306 0 R (subsubsection.4.11.2.2) 310 0 R (subsubsection.4.5.1.1) 166 0 R (subsubsection.4.5.1.2) 170 0 R (subsubsection.6.1.1.1) 366 0 R (subsubsection.6.1.1.2) 370 0 R (subsubsection.6.1.2.1) 378 0 R (subsubsection.6.1.2.2) 382 0 R (subsubsection.6.2.10.1) 430 0 R (subsubsection.6.2.10.2) 434 0 R (subsubsection.6.2.10.3) 438 0 R (subsubsection.6.2.16.1) 466 0 R (subsubsection.6.2.16.10) 502 0 R (subsubsection.6.2.16.11) 506 0 R (subsubsection.6.2.16.12) 510 0 R (subsubsection.6.2.16.13) 514 0 R (subsubsection.6.2.16.14) 518 0 R (subsubsection.6.2.16.15) 522 0 R (subsubsection.6.2.16.16) 526 0 R (subsubsection.6.2.16.17) 530 0 R (subsubsection.6.2.16.18) 534 0 R (subsubsection.6.2.16.19) 538 0 R (subsubsection.6.2.16.2) 470 0 R (subsubsection.6.2.16.20) 542 0 R (subsubsection.6.2.16.3) 474 0 R (subsubsection.6.2.16.4) 478 0 R (subsubsection.6.2.16.5) 482 0 R (subsubsection.6.2.16.6) 486 0 R (subsubsection.6.2.16.7) 490 0 R (subsubsection.6.2.16.8) 494 0 R (subsubsection.6.2.16.9) 498 0 R (subsubsection.6.2.28.1) 594 0 R (subsubsection.6.2.28.2) 598 0 R (subsubsection.6.2.28.3) 602 0 R (subsubsection.6.2.28.4) 606 0 R (subsubsection.6.3.1.1) 618 0 R (subsubsection.6.3.1.2) 622 0 R (subsubsection.6.3.5.1) 642 0 R (subsubsection.6.3.5.2) 646 0 R (subsubsection.6.3.5.3) 650 0 R (subsubsection.6.3.5.4) 654 0 R (subsubsection.6.4.0.1) 670 0 R (subsubsection.6.4.1.1) 678 0 R (subsubsection.6.4.1.2) 682 0 R (subsubsection.6.4.1.3) 686 0 R (subsubsection.6.4.1.4) 690 0 R (subsubsection.6.4.1.5) 694 0 R (subsubsection.A.4.6.1) 806 0 R (subsubsection.A.4.6.2) 810 0 R (subsubsection.A.4.6.3) 814 0 R (subsubsection.A.4.6.4) 818 0 R (subsubsection.A.4.6.5) 822 0 R (subsubsection.A.4.6.6) 826 0 R (table.1.1) 1225 0 R (table.1.2) 1233 0 R (table.3.1) 1292 0 R (table.3.2) 1336 0 R (table.6.1) 1539 0 R (table.6.10) 1950 0 R (table.6.11) 1956 0 R (table.6.12) 1962 0 R (table.6.13) 1969 0 R (table.6.14) 1971 0 R (table.6.15) 1979 0 R (table.6.16) 1982 0 R (table.6.17) 1985 0 R (table.6.18) 2001 0 R (table.6.19) 2012 0 R (table.6.2) 1561 0 R (table.6.20) 2021 0 R (table.6.21) 2030 0 R (table.6.22) 2033 0 R (table.6.23) 2041 0 R (table.6.3) 1570 0 R (table.6.4) 1608 0 R (table.6.5) 1620 0 R (table.6.6) 1674 0 R (table.6.7) 1773 0 R (table.6.8) 1861 0 R (table.6.9) 1940 0 R (the_category_phrase) 1602 0 R (the_sortlist_statement) 1764 0 R (topology) 1759 0 R (trusted-keys) 1828 0 R (tsig) 1388 0 R (tuning) 1774 0 R (types_of_resource_records_and_when_to_use_them) 1240 0 R (view_statement_grammar) 1789 0 R (zone_statement_grammar) 1713 0 R (zone_transfers) 1362 0 R (zonefile_format) 1788 0 R]
/Limits [(Access_Control_Lists) (zonefile_format)]
>> endobj
-2165 0 obj <<
-/Kids [2164 0 R]
+2731 0 obj <<
+/Kids [2730 0 R]
>> endobj
-2166 0 obj <<
-/Dests 2165 0 R
+2732 0 obj <<
+/Dests 2731 0 R
>> endobj
-2167 0 obj <<
+2733 0 obj <<
/Type /Catalog
-/Pages 2162 0 R
-/Outlines 2163 0 R
-/Names 2166 0 R
+/Pages 2728 0 R
+/Outlines 2729 0 R
+/Names 2732 0 R
/PageMode /UseOutlines
-/OpenAction 705 0 R
+/OpenAction 921 0 R
>> endobj
-2168 0 obj <<
+2734 0 obj <<
/Author()/Title()/Subject()/Creator(LaTeX with hyperref package)/Producer(pdfeTeX-1.21a)/Keywords()
-/CreationDate (D:20100910020422Z)
+/CreationDate (D:20110609034043Z)
/PTEX.Fullbanner (This is pdfeTeX, Version 3.141592-1.21a-2.2 (Web2C 7.5.4) kpathsea version 3.5.4)
>> endobj
xref
-0 2169
+0 2735
0000000001 65535 f
0000000002 00000 f
0000000003 00000 f
0000000004 00000 f
0000000000 00000 f
0000000009 00000 n
-0000328752 00000 n
-0001011409 00000 n
+0000347882 00000 n
+0001171649 00000 n
0000000054 00000 n
0000000086 00000 n
-0000328876 00000 n
-0001011337 00000 n
+0000348009 00000 n
+0001171577 00000 n
0000000133 00000 n
0000000173 00000 n
-0000329001 00000 n
-0001011251 00000 n
+0000348137 00000 n
+0001171491 00000 n
0000000221 00000 n
0000000273 00000 n
-0000329126 00000 n
-0001011165 00000 n
+0000348265 00000 n
+0001171405 00000 n
0000000321 00000 n
0000000377 00000 n
-0000333388 00000 n
-0001011055 00000 n
+0000352551 00000 n
+0001171295 00000 n
0000000425 00000 n
0000000478 00000 n
-0000333512 00000 n
-0001010981 00000 n
+0000352678 00000 n
+0001171221 00000 n
0000000531 00000 n
0000000572 00000 n
-0000333637 00000 n
-0001010894 00000 n
+0000352806 00000 n
+0001171134 00000 n
0000000625 00000 n
0000000674 00000 n
-0000333761 00000 n
-0001010807 00000 n
+0000352933 00000 n
+0001171047 00000 n
0000000727 00000 n
0000000757 00000 n
-0000338040 00000 n
-0001010683 00000 n
+0000357230 00000 n
+0001170923 00000 n
0000000810 00000 n
0000000861 00000 n
-0000338165 00000 n
-0001010609 00000 n
+0000357358 00000 n
+0001170849 00000 n
0000000919 00000 n
0000000964 00000 n
-0000338290 00000 n
-0001010522 00000 n
+0000357486 00000 n
+0001170762 00000 n
0000001022 00000 n
0000001062 00000 n
-0000338415 00000 n
-0001010448 00000 n
+0000357614 00000 n
+0001170688 00000 n
0000001120 00000 n
0000001162 00000 n
-0000341386 00000 n
-0001010324 00000 n
+0000360599 00000 n
+0001170564 00000 n
0000001215 00000 n
0000001260 00000 n
-0000341511 00000 n
-0001010263 00000 n
+0000360727 00000 n
+0001170503 00000 n
0000001318 00000 n
0000001355 00000 n
-0000341636 00000 n
-0001010189 00000 n
+0000360855 00000 n
+0001170429 00000 n
0000001408 00000 n
0000001463 00000 n
-0000344566 00000 n
-0001010064 00000 n
+0000363802 00000 n
+0001170304 00000 n
0000001509 00000 n
0000001556 00000 n
-0000344691 00000 n
-0001009990 00000 n
+0000363930 00000 n
+0001170230 00000 n
0000001604 00000 n
0000001648 00000 n
-0000344816 00000 n
-0001009903 00000 n
+0000364058 00000 n
+0001170143 00000 n
0000001696 00000 n
0000001735 00000 n
-0000344941 00000 n
-0001009816 00000 n
+0000364186 00000 n
+0001170056 00000 n
0000001783 00000 n
0000001825 00000 n
-0000345065 00000 n
-0001009729 00000 n
+0000364313 00000 n
+0001169969 00000 n
0000001873 00000 n
0000001936 00000 n
-0000346148 00000 n
-0001009655 00000 n
+0000365390 00000 n
+0001169895 00000 n
0000001984 00000 n
0000002034 00000 n
-0000347859 00000 n
-0001009527 00000 n
+0000367049 00000 n
+0001169767 00000 n
0000002080 00000 n
0000002126 00000 n
-0000347986 00000 n
-0001009414 00000 n
+0000367176 00000 n
+0001169654 00000 n
0000002174 00000 n
0000002218 00000 n
-0000348114 00000 n
-0001009338 00000 n
+0000367304 00000 n
+0001169578 00000 n
0000002271 00000 n
0000002323 00000 n
-0000348242 00000 n
-0001009261 00000 n
+0000367432 00000 n
+0001169501 00000 n
0000002377 00000 n
0000002436 00000 n
-0000350787 00000 n
-0001009170 00000 n
+0000369881 00000 n
+0001169410 00000 n
0000002485 00000 n
0000002523 00000 n
-0000351046 00000 n
-0001009053 00000 n
+0000373219 00000 n
+0001169293 00000 n
0000002572 00000 n
0000002618 00000 n
-0000351175 00000 n
-0001008935 00000 n
+0000373347 00000 n
+0001169175 00000 n
0000002672 00000 n
0000002739 00000 n
-0000354406 00000 n
-0001008856 00000 n
+0000373475 00000 n
+0001169096 00000 n
0000002798 00000 n
0000002842 00000 n
-0000354534 00000 n
-0001008777 00000 n
+0000373604 00000 n
+0001169017 00000 n
0000002901 00000 n
0000002949 00000 n
-0000365183 00000 n
-0001008698 00000 n
+0000388343 00000 n
+0001168938 00000 n
0000003003 00000 n
0000003036 00000 n
-0000370204 00000 n
-0001008566 00000 n
+0000393969 00000 n
+0001168805 00000 n
0000003083 00000 n
0000003126 00000 n
-0000370333 00000 n
-0001008487 00000 n
+0000394098 00000 n
+0001168726 00000 n
0000003175 00000 n
0000003205 00000 n
-0000370462 00000 n
-0001008355 00000 n
+0000394227 00000 n
+0001168594 00000 n
0000003254 00000 n
0000003292 00000 n
-0000370591 00000 n
-0001008290 00000 n
+0000398736 00000 n
+0001168529 00000 n
0000003346 00000 n
0000003388 00000 n
-0000374998 00000 n
-0001008197 00000 n
+0000398865 00000 n
+0001168436 00000 n
0000003437 00000 n
0000003496 00000 n
-0000375127 00000 n
-0001008065 00000 n
+0000398994 00000 n
+0001168304 00000 n
0000003545 00000 n
0000003578 00000 n
-0000375256 00000 n
-0001008000 00000 n
+0000402912 00000 n
+0001168239 00000 n
0000003632 00000 n
0000003681 00000 n
-0000382582 00000 n
-0001007868 00000 n
+0000405926 00000 n
+0001168107 00000 n
0000003730 00000 n
0000003758 00000 n
-0000382711 00000 n
-0001007750 00000 n
+0000408706 00000 n
+0001167989 00000 n
0000003812 00000 n
0000003881 00000 n
-0000382840 00000 n
-0001007671 00000 n
+0000408835 00000 n
+0001167910 00000 n
0000003940 00000 n
0000003988 00000 n
-0000385631 00000 n
-0001007592 00000 n
+0000408963 00000 n
+0001167831 00000 n
0000004047 00000 n
0000004092 00000 n
-0000385760 00000 n
-0001007499 00000 n
+0000409092 00000 n
+0001167738 00000 n
0000004146 00000 n
0000004214 00000 n
-0000385889 00000 n
-0001007406 00000 n
+0000409221 00000 n
+0001167645 00000 n
0000004268 00000 n
0000004338 00000 n
-0000386018 00000 n
-0001007313 00000 n
+0000412890 00000 n
+0001167552 00000 n
0000004392 00000 n
0000004455 00000 n
-0000389940 00000 n
-0001007220 00000 n
+0000413019 00000 n
+0001167459 00000 n
0000004509 00000 n
0000004564 00000 n
-0000390069 00000 n
-0001007141 00000 n
+0000413147 00000 n
+0001167380 00000 n
0000004618 00000 n
0000004650 00000 n
-0000390198 00000 n
-0001007048 00000 n
+0000413275 00000 n
+0001167287 00000 n
0000004699 00000 n
0000004727 00000 n
-0000390327 00000 n
-0001006955 00000 n
+0000417044 00000 n
+0001167194 00000 n
0000004776 00000 n
0000004808 00000 n
-0000394104 00000 n
-0001006823 00000 n
+0000417173 00000 n
+0001167062 00000 n
0000004857 00000 n
0000004887 00000 n
-0000394233 00000 n
-0001006744 00000 n
+0000417302 00000 n
+0001166983 00000 n
0000004941 00000 n
0000004982 00000 n
-0000394362 00000 n
-0001006651 00000 n
+0000421100 00000 n
+0001166890 00000 n
0000005036 00000 n
0000005078 00000 n
-0000397957 00000 n
-0001006572 00000 n
+0000421229 00000 n
+0001166811 00000 n
0000005132 00000 n
0000005177 00000 n
-0000401403 00000 n
-0001006454 00000 n
+0000426552 00000 n
+0001166678 00000 n
0000005226 00000 n
-0000005272 00000 n
-0000403004 00000 n
-0001006375 00000 n
-0000005326 00000 n
-0000005386 00000 n
-0000403133 00000 n
-0001006296 00000 n
-0000005440 00000 n
-0000005509 00000 n
-0000405940 00000 n
-0001006163 00000 n
-0000005556 00000 n
-0000005609 00000 n
-0000406069 00000 n
-0001006084 00000 n
-0000005658 00000 n
-0000005714 00000 n
-0000406198 00000 n
-0001006005 00000 n
-0000005763 00000 n
-0000005812 00000 n
-0000410382 00000 n
-0001005872 00000 n
-0000005859 00000 n
-0000005911 00000 n
-0000410511 00000 n
-0001005754 00000 n
-0000005960 00000 n
-0000006011 00000 n
-0000415203 00000 n
-0001005636 00000 n
-0000006065 00000 n
-0000006110 00000 n
-0000415331 00000 n
-0001005557 00000 n
-0000006169 00000 n
-0000006203 00000 n
-0000418952 00000 n
-0001005478 00000 n
-0000006262 00000 n
-0000006310 00000 n
-0000419080 00000 n
-0001005360 00000 n
-0000006364 00000 n
-0000006404 00000 n
-0000419209 00000 n
-0001005281 00000 n
-0000006463 00000 n
-0000006497 00000 n
-0000423146 00000 n
-0001005202 00000 n
-0000006556 00000 n
-0000006604 00000 n
-0000423275 00000 n
-0001005069 00000 n
-0000006653 00000 n
-0000006703 00000 n
-0000426095 00000 n
-0001004990 00000 n
-0000006757 00000 n
-0000006804 00000 n
-0000426223 00000 n
-0001004897 00000 n
-0000006858 00000 n
-0000006918 00000 n
-0000426482 00000 n
-0001004804 00000 n
-0000006972 00000 n
-0000007024 00000 n
-0000431831 00000 n
-0001004711 00000 n
-0000007078 00000 n
-0000007143 00000 n
-0000431960 00000 n
-0001004618 00000 n
-0000007197 00000 n
-0000007248 00000 n
-0000432089 00000 n
-0001004525 00000 n
-0000007302 00000 n
-0000007366 00000 n
-0000435541 00000 n
-0001004432 00000 n
-0000007420 00000 n
-0000007467 00000 n
-0000435670 00000 n
-0001004339 00000 n
-0000007521 00000 n
-0000007581 00000 n
-0000435799 00000 n
-0001004246 00000 n
-0000007635 00000 n
-0000007686 00000 n
-0000435928 00000 n
-0001004114 00000 n
-0000007741 00000 n
-0000007806 00000 n
-0000440159 00000 n
-0001004035 00000 n
-0000007866 00000 n
-0000007913 00000 n
-0000446716 00000 n
-0001003942 00000 n
-0000007973 00000 n
-0000008021 00000 n
-0000454268 00000 n
-0001003863 00000 n
-0000008081 00000 n
-0000008135 00000 n
-0000454527 00000 n
-0001003770 00000 n
-0000008190 00000 n
+0000005294 00000 n
+0000426681 00000 n
+0001166599 00000 n
+0000005348 00000 n
+0000005408 00000 n
+0000426810 00000 n
+0001166506 00000 n
+0000005462 00000 n
+0000005513 00000 n
+0000430749 00000 n
+0001166413 00000 n
+0000005567 00000 n
+0000005621 00000 n
+0000430877 00000 n
+0001166320 00000 n
+0000005675 00000 n
+0000005721 00000 n
+0000434027 00000 n
+0001166227 00000 n
+0000005775 00000 n
+0000005817 00000 n
+0000434156 00000 n
+0001166134 00000 n
+0000005871 00000 n
+0000005922 00000 n
+0000434285 00000 n
+0001166041 00000 n
+0000005976 00000 n
+0000006025 00000 n
+0000434414 00000 n
+0001165948 00000 n
+0000006079 00000 n
+0000006136 00000 n
+0000437328 00000 n
+0001165855 00000 n
+0000006190 00000 n
+0000006245 00000 n
+0000437457 00000 n
+0001165762 00000 n
+0000006300 00000 n
+0000006356 00000 n
+0000437586 00000 n
+0001165669 00000 n
+0000006411 00000 n
+0000006472 00000 n
+0000437715 00000 n
+0001165576 00000 n
+0000006527 00000 n
+0000006573 00000 n
+0000437844 00000 n
+0001165497 00000 n
+0000006628 00000 n
+0000006671 00000 n
+0000437973 00000 n
+0001165365 00000 n
+0000006721 00000 n
+0000006777 00000 n
+0000438102 00000 n
+0001165286 00000 n
+0000006832 00000 n
+0000006878 00000 n
+0000441694 00000 n
+0001165207 00000 n
+0000006933 00000 n
+0000006980 00000 n
+0000441823 00000 n
+0001165075 00000 n
+0000007030 00000 n
+0000007087 00000 n
+0000444830 00000 n
+0001164957 00000 n
+0000007142 00000 n
+0000007182 00000 n
+0000447718 00000 n
+0001164878 00000 n
+0000007242 00000 n
+0000007315 00000 n
+0000447847 00000 n
+0001164799 00000 n
+0000007375 00000 n
+0000007448 00000 n
+0000450309 00000 n
+0001164667 00000 n
+0000007503 00000 n
+0000007561 00000 n
+0000450438 00000 n
+0001164588 00000 n
+0000007621 00000 n
+0000007678 00000 n
+0000450567 00000 n
+0001164509 00000 n
+0000007738 00000 n
+0000007797 00000 n
+0000450696 00000 n
+0001164416 00000 n
+0000007852 00000 n
+0000007896 00000 n
+0000453505 00000 n
+0001164323 00000 n
+0000007951 00000 n
+0000007991 00000 n
+0000456304 00000 n
+0001164230 00000 n
+0000008046 00000 n
+0000008114 00000 n
+0000456433 00000 n
+0001164151 00000 n
+0000008169 00000 n
0000008240 00000 n
-0000457350 00000 n
-0001003677 00000 n
-0000008295 00000 n
-0000008358 00000 n
-0000457479 00000 n
-0001003584 00000 n
-0000008413 00000 n
-0000008465 00000 n
-0000457608 00000 n
-0001003491 00000 n
-0000008520 00000 n
-0000008585 00000 n
-0000457737 00000 n
-0001003398 00000 n
-0000008640 00000 n
-0000008692 00000 n
-0000463748 00000 n
-0001003265 00000 n
-0000008747 00000 n
-0000008812 00000 n
-0000472151 00000 n
-0001003186 00000 n
-0000008872 00000 n
-0000008916 00000 n
-0000493407 00000 n
-0001003093 00000 n
-0000008976 00000 n
-0000009015 00000 n
-0000493536 00000 n
-0001003000 00000 n
-0000009075 00000 n
-0000009122 00000 n
-0000493665 00000 n
-0001002907 00000 n
-0000009182 00000 n
-0000009225 00000 n
-0000500581 00000 n
-0001002814 00000 n
-0000009285 00000 n
-0000009324 00000 n
-0000504097 00000 n
-0001002721 00000 n
-0000009384 00000 n
-0000009426 00000 n
-0000507277 00000 n
-0001002628 00000 n
-0000009486 00000 n
-0000009529 00000 n
-0000514841 00000 n
-0001002535 00000 n
-0000009589 00000 n
-0000009632 00000 n
-0000514970 00000 n
-0001002442 00000 n
-0000009692 00000 n
-0000009753 00000 n
-0000519163 00000 n
-0001002349 00000 n
-0000009814 00000 n
-0000009866 00000 n
-0000523056 00000 n
-0001002256 00000 n
+0000460499 00000 n
+0001164033 00000 n
+0000008290 00000 n
+0000008337 00000 n
+0000460628 00000 n
+0001163954 00000 n
+0000008392 00000 n
+0000008453 00000 n
+0000460757 00000 n
+0001163875 00000 n
+0000008508 00000 n
+0000008578 00000 n
+0000463625 00000 n
+0001163742 00000 n
+0000008625 00000 n
+0000008678 00000 n
+0000463754 00000 n
+0001163663 00000 n
+0000008727 00000 n
+0000008783 00000 n
+0000463883 00000 n
+0001163584 00000 n
+0000008832 00000 n
+0000008881 00000 n
+0000468153 00000 n
+0001163451 00000 n
+0000008928 00000 n
+0000008980 00000 n
+0000468282 00000 n
+0001163333 00000 n
+0000009029 00000 n
+0000009080 00000 n
+0000472974 00000 n
+0001163215 00000 n
+0000009134 00000 n
+0000009179 00000 n
+0000473102 00000 n
+0001163136 00000 n
+0000009238 00000 n
+0000009272 00000 n
+0000476695 00000 n
+0001163057 00000 n
+0000009331 00000 n
+0000009379 00000 n
+0000476824 00000 n
+0001162939 00000 n
+0000009433 00000 n
+0000009473 00000 n
+0000476953 00000 n
+0001162860 00000 n
+0000009532 00000 n
+0000009566 00000 n
+0000479805 00000 n
+0001162781 00000 n
+0000009625 00000 n
+0000009673 00000 n
+0000479934 00000 n
+0001162648 00000 n
+0000009722 00000 n
+0000009772 00000 n
+0000483004 00000 n
+0001162569 00000 n
+0000009826 00000 n
+0000009873 00000 n
+0000483132 00000 n
+0001162476 00000 n
0000009927 00000 n
-0000009980 00000 n
-0000523185 00000 n
-0001002163 00000 n
+0000009987 00000 n
+0000483391 00000 n
+0001162383 00000 n
0000010041 00000 n
-0000010079 00000 n
-0000527219 00000 n
-0001002070 00000 n
-0000010140 00000 n
-0000010192 00000 n
-0000530375 00000 n
-0001001977 00000 n
-0000010253 00000 n
-0000010297 00000 n
-0000534314 00000 n
-0001001884 00000 n
-0000010358 00000 n
-0000010394 00000 n
-0000542730 00000 n
-0001001791 00000 n
-0000010455 00000 n
-0000010518 00000 n
-0000542859 00000 n
-0001001698 00000 n
-0000010579 00000 n
-0000010629 00000 n
-0000546041 00000 n
-0001001619 00000 n
-0000010690 00000 n
-0000010746 00000 n
-0000549267 00000 n
-0001001526 00000 n
-0000010801 00000 n
-0000010852 00000 n
-0000554329 00000 n
-0001001433 00000 n
-0000010907 00000 n
-0000010971 00000 n
-0000558052 00000 n
-0001001340 00000 n
-0000011026 00000 n
+0000010093 00000 n
+0000488573 00000 n
+0001162290 00000 n
+0000010147 00000 n
+0000010212 00000 n
+0000488702 00000 n
+0001162197 00000 n
+0000010266 00000 n
+0000010317 00000 n
+0000492179 00000 n
+0001162104 00000 n
+0000010371 00000 n
+0000010435 00000 n
+0000492308 00000 n
+0001162011 00000 n
+0000010489 00000 n
+0000010536 00000 n
+0000492437 00000 n
+0001161918 00000 n
+0000010590 00000 n
+0000010650 00000 n
+0000492566 00000 n
+0001161825 00000 n
+0000010704 00000 n
+0000010755 00000 n
+0000496584 00000 n
+0001161693 00000 n
+0000010810 00000 n
+0000010875 00000 n
+0000496713 00000 n
+0001161614 00000 n
+0000010935 00000 n
+0000010982 00000 n
+0000503534 00000 n
+0001161521 00000 n
+0000011042 00000 n
0000011090 00000 n
-0000558180 00000 n
-0001001247 00000 n
-0000011145 00000 n
-0000011222 00000 n
-0000558309 00000 n
-0001001154 00000 n
-0000011277 00000 n
-0000011334 00000 n
-0000558437 00000 n
-0001001061 00000 n
-0000011389 00000 n
-0000011459 00000 n
-0000562254 00000 n
-0001000968 00000 n
-0000011514 00000 n
-0000011563 00000 n
-0000562383 00000 n
-0001000875 00000 n
-0000011618 00000 n
-0000011680 00000 n
-0000564065 00000 n
-0001000782 00000 n
-0000011735 00000 n
-0000011784 00000 n
-0000567156 00000 n
-0001000664 00000 n
-0000011839 00000 n
-0000011901 00000 n
-0000567284 00000 n
-0001000585 00000 n
-0000011961 00000 n
-0000012000 00000 n
-0000576166 00000 n
-0001000492 00000 n
-0000012060 00000 n
-0000012094 00000 n
-0000576295 00000 n
-0001000399 00000 n
-0000012154 00000 n
-0000012195 00000 n
-0000592451 00000 n
-0001000320 00000 n
-0000012255 00000 n
-0000012307 00000 n
-0000595699 00000 n
-0001000188 00000 n
-0000012356 00000 n
-0000012389 00000 n
-0000595827 00000 n
-0001000070 00000 n
-0000012443 00000 n
-0000012515 00000 n
-0000595955 00000 n
-0000999991 00000 n
-0000012574 00000 n
-0000012618 00000 n
-0000607186 00000 n
-0000999912 00000 n
-0000012677 00000 n
-0000012730 00000 n
-0000610897 00000 n
-0000999819 00000 n
-0000012784 00000 n
-0000012834 00000 n
-0000611156 00000 n
-0000999726 00000 n
-0000012888 00000 n
-0000012926 00000 n
-0000614299 00000 n
-0000999633 00000 n
-0000012980 00000 n
-0000013029 00000 n
-0000614558 00000 n
-0000999501 00000 n
-0000013083 00000 n
-0000013135 00000 n
-0000614687 00000 n
-0000999422 00000 n
-0000013194 00000 n
-0000013239 00000 n
-0000614816 00000 n
-0000999329 00000 n
-0000013298 00000 n
-0000013350 00000 n
-0000617602 00000 n
-0000999236 00000 n
-0000013409 00000 n
-0000013462 00000 n
-0000617730 00000 n
-0000999157 00000 n
-0000013521 00000 n
-0000013570 00000 n
-0000617859 00000 n
-0000999064 00000 n
-0000013624 00000 n
-0000013704 00000 n
-0000622193 00000 n
-0000998985 00000 n
-0000013758 00000 n
-0000013807 00000 n
-0000622322 00000 n
-0000998867 00000 n
-0000013856 00000 n
-0000013896 00000 n
-0000625918 00000 n
-0000998788 00000 n
-0000013955 00000 n
-0000014002 00000 n
-0000626047 00000 n
-0000998670 00000 n
-0000014056 00000 n
-0000014101 00000 n
-0000629692 00000 n
-0000998591 00000 n
-0000014160 00000 n
-0000014219 00000 n
-0000632705 00000 n
-0000998498 00000 n
-0000014278 00000 n
-0000014342 00000 n
-0000632963 00000 n
-0000998405 00000 n
-0000014401 00000 n
-0000014457 00000 n
-0000636831 00000 n
-0000998312 00000 n
-0000014516 00000 n
-0000014574 00000 n
-0000638438 00000 n
-0000998233 00000 n
-0000014633 00000 n
+0000509939 00000 n
+0001161442 00000 n
+0000011150 00000 n
+0000011204 00000 n
+0000513027 00000 n
+0001161349 00000 n
+0000011259 00000 n
+0000011309 00000 n
+0000515884 00000 n
+0001161256 00000 n
+0000011364 00000 n
+0000011427 00000 n
+0000516013 00000 n
+0001161163 00000 n
+0000011482 00000 n
+0000011534 00000 n
+0000516141 00000 n
+0001161070 00000 n
+0000011589 00000 n
+0000011654 00000 n
+0000516269 00000 n
+0001160977 00000 n
+0000011709 00000 n
+0000011761 00000 n
+0000521189 00000 n
+0001160844 00000 n
+0000011816 00000 n
+0000011881 00000 n
+0000541024 00000 n
+0001160765 00000 n
+0000011941 00000 n
+0000011985 00000 n
+0000562621 00000 n
+0001160672 00000 n
+0000012045 00000 n
+0000012084 00000 n
+0000566256 00000 n
+0001160579 00000 n
+0000012144 00000 n
+0000012191 00000 n
+0000566385 00000 n
+0001160486 00000 n
+0000012251 00000 n
+0000012294 00000 n
+0000570803 00000 n
+0001160393 00000 n
+0000012354 00000 n
+0000012393 00000 n
+0000574151 00000 n
+0001160300 00000 n
+0000012453 00000 n
+0000012495 00000 n
+0000580978 00000 n
+0001160207 00000 n
+0000012555 00000 n
+0000012598 00000 n
+0000588866 00000 n
+0001160114 00000 n
+0000012658 00000 n
+0000012701 00000 n
+0000588995 00000 n
+0001160021 00000 n
+0000012761 00000 n
+0000012822 00000 n
+0000593028 00000 n
+0001159928 00000 n
+0000012883 00000 n
+0000012935 00000 n
+0000593157 00000 n
+0001159835 00000 n
+0000012996 00000 n
+0000013049 00000 n
+0000596321 00000 n
+0001159742 00000 n
+0000013110 00000 n
+0000013148 00000 n
+0000600259 00000 n
+0001159649 00000 n
+0000013209 00000 n
+0000013261 00000 n
+0000603551 00000 n
+0001159556 00000 n
+0000013322 00000 n
+0000013366 00000 n
+0000603809 00000 n
+0001159463 00000 n
+0000013427 00000 n
+0000013463 00000 n
+0000612635 00000 n
+0001159370 00000 n
+0000013524 00000 n
+0000013587 00000 n
+0000615981 00000 n
+0001159277 00000 n
+0000013648 00000 n
+0000013698 00000 n
+0000619742 00000 n
+0001159184 00000 n
+0000013759 00000 n
+0000013815 00000 n
+0000624070 00000 n
+0001159091 00000 n
+0000013876 00000 n
+0000013923 00000 n
+0000628370 00000 n
+0001159012 00000 n
+0000013984 00000 n
+0000014052 00000 n
+0000630938 00000 n
+0001158919 00000 n
+0000014107 00000 n
+0000014158 00000 n
+0000635461 00000 n
+0001158826 00000 n
+0000014213 00000 n
+0000014277 00000 n
+0000639146 00000 n
+0001158733 00000 n
+0000014332 00000 n
+0000014396 00000 n
+0000639275 00000 n
+0001158640 00000 n
+0000014451 00000 n
+0000014528 00000 n
+0000639403 00000 n
+0001158547 00000 n
+0000014583 00000 n
+0000014640 00000 n
+0000643560 00000 n
+0001158454 00000 n
0000014695 00000 n
-0000640286 00000 n
-0000998100 00000 n
-0000014742 00000 n
-0000014794 00000 n
-0000640415 00000 n
-0000998021 00000 n
-0000014843 00000 n
-0000014887 00000 n
-0000644614 00000 n
-0000997889 00000 n
-0000014936 00000 n
-0000014977 00000 n
-0000644743 00000 n
-0000997810 00000 n
-0000015031 00000 n
-0000015079 00000 n
-0000644871 00000 n
-0000997731 00000 n
-0000015133 00000 n
-0000015184 00000 n
-0000645000 00000 n
-0000997652 00000 n
-0000015233 00000 n
-0000015280 00000 n
-0000649267 00000 n
-0000997519 00000 n
+0000014765 00000 n
+0000643688 00000 n
+0001158361 00000 n
+0000014820 00000 n
+0000014877 00000 n
+0000643817 00000 n
+0001158268 00000 n
+0000014932 00000 n
+0000015002 00000 n
+0000648072 00000 n
+0001158175 00000 n
+0000015057 00000 n
+0000015106 00000 n
+0000648201 00000 n
+0001158082 00000 n
+0000015161 00000 n
+0000015223 00000 n
+0000650348 00000 n
+0001157989 00000 n
+0000015278 00000 n
0000015327 00000 n
-0000015364 00000 n
-0000649396 00000 n
-0000997401 00000 n
-0000015413 00000 n
-0000015452 00000 n
-0000649525 00000 n
-0000997336 00000 n
-0000015506 00000 n
-0000015584 00000 n
-0000649654 00000 n
-0000997243 00000 n
-0000015633 00000 n
-0000015700 00000 n
-0000649783 00000 n
-0000997164 00000 n
-0000015749 00000 n
-0000015794 00000 n
-0000653222 00000 n
-0000997031 00000 n
-0000015842 00000 n
-0000015874 00000 n
-0000653351 00000 n
-0000996913 00000 n
-0000015923 00000 n
-0000015962 00000 n
-0000653480 00000 n
-0000996848 00000 n
-0000016016 00000 n
-0000016077 00000 n
-0000657161 00000 n
-0000996716 00000 n
-0000016126 00000 n
-0000016183 00000 n
-0000657290 00000 n
-0000996651 00000 n
-0000016237 00000 n
-0000016286 00000 n
-0000657419 00000 n
-0000996533 00000 n
-0000016335 00000 n
-0000016397 00000 n
-0000657548 00000 n
-0000996454 00000 n
-0000016451 00000 n
-0000016506 00000 n
-0000681573 00000 n
-0000996361 00000 n
-0000016560 00000 n
-0000016601 00000 n
-0000681702 00000 n
-0000996282 00000 n
-0000016655 00000 n
-0000016707 00000 n
-0000684433 00000 n
-0000996162 00000 n
-0000016755 00000 n
-0000016789 00000 n
-0000684562 00000 n
-0000996083 00000 n
-0000016838 00000 n
-0000016865 00000 n
-0000702386 00000 n
-0000995990 00000 n
-0000016914 00000 n
-0000016942 00000 n
-0000709874 00000 n
-0000995897 00000 n
-0000016991 00000 n
-0000017031 00000 n
-0000712670 00000 n
-0000995804 00000 n
-0000017080 00000 n
-0000017123 00000 n
-0000718853 00000 n
-0000995711 00000 n
-0000017172 00000 n
-0000017209 00000 n
-0000725478 00000 n
-0000995618 00000 n
-0000017258 00000 n
-0000017297 00000 n
-0000737861 00000 n
-0000995525 00000 n
-0000017346 00000 n
-0000017385 00000 n
-0000740957 00000 n
-0000995432 00000 n
-0000017434 00000 n
-0000017473 00000 n
-0000747237 00000 n
-0000995339 00000 n
-0000017522 00000 n
-0000017551 00000 n
-0000757049 00000 n
-0000995246 00000 n
-0000017601 00000 n
-0000017634 00000 n
-0000771281 00000 n
-0000995153 00000 n
-0000017684 00000 n
-0000017713 00000 n
-0000774411 00000 n
-0000995060 00000 n
-0000017763 00000 n
-0000017797 00000 n
-0000780649 00000 n
-0000994981 00000 n
-0000017847 00000 n
-0000017884 00000 n
-0000018257 00000 n
-0000018379 00000 n
-0000283180 00000 n
-0000017937 00000 n
-0000283054 00000 n
-0000283117 00000 n
-0000990433 00000 n
-0000964490 00000 n
-0000990259 00000 n
-0000991458 00000 n
-0000019688 00000 n
-0000019881 00000 n
-0000019961 00000 n
-0000019998 00000 n
-0000020079 00000 n
-0000020203 00000 n
-0000020462 00000 n
-0000020821 00000 n
-0000020853 00000 n
-0000020947 00000 n
-0000021980 00000 n
-0000033116 00000 n
-0000098706 00000 n
-0000164296 00000 n
-0000229886 00000 n
-0000284604 00000 n
-0000284419 00000 n
-0000283280 00000 n
-0000284541 00000 n
-0000963269 00000 n
-0000936748 00000 n
-0000963095 00000 n
-0000936063 00000 n
-0000933918 00000 n
-0000935899 00000 n
-0000296307 00000 n
-0000287653 00000 n
-0000284689 00000 n
-0000296181 00000 n
-0000296244 00000 n
-0000288187 00000 n
-0000288341 00000 n
-0000288498 00000 n
-0000288655 00000 n
-0000288812 00000 n
-0000288969 00000 n
-0000289131 00000 n
-0000289293 00000 n
-0000289454 00000 n
-0000289616 00000 n
-0000289783 00000 n
-0000289950 00000 n
-0000290115 00000 n
-0000290277 00000 n
-0000290443 00000 n
-0000290605 00000 n
-0000290759 00000 n
-0000290916 00000 n
-0000291073 00000 n
-0000291229 00000 n
-0000291385 00000 n
-0000291542 00000 n
-0000291697 00000 n
-0000291854 00000 n
-0000292016 00000 n
-0000292178 00000 n
-0000292335 00000 n
-0000292490 00000 n
-0000292651 00000 n
-0000292818 00000 n
-0000292985 00000 n
-0000293147 00000 n
-0000293302 00000 n
-0000293459 00000 n
-0000293616 00000 n
-0000293778 00000 n
-0000293935 00000 n
-0000294092 00000 n
-0000294253 00000 n
-0000294410 00000 n
-0000294572 00000 n
-0000294739 00000 n
-0000294906 00000 n
-0000295068 00000 n
-0000295230 00000 n
-0000295392 00000 n
-0000295554 00000 n
-0000295716 00000 n
-0000295871 00000 n
-0000296026 00000 n
-0000309682 00000 n
-0000299635 00000 n
-0000296392 00000 n
-0000309619 00000 n
-0000933367 00000 n
-0000916286 00000 n
-0000933183 00000 n
-0000300225 00000 n
-0000300388 00000 n
-0000300550 00000 n
-0000300712 00000 n
-0000300870 00000 n
-0000301033 00000 n
-0000301196 00000 n
-0000301351 00000 n
-0000301509 00000 n
-0000301667 00000 n
-0000301823 00000 n
-0000301981 00000 n
-0000302144 00000 n
-0000302312 00000 n
-0000302480 00000 n
-0000302643 00000 n
-0000302811 00000 n
-0000302979 00000 n
-0000303136 00000 n
-0000303299 00000 n
-0000303462 00000 n
-0000303625 00000 n
-0000303787 00000 n
-0000303950 00000 n
-0000304112 00000 n
-0000304274 00000 n
-0000304437 00000 n
-0000304600 00000 n
-0000304763 00000 n
-0000304931 00000 n
-0000305100 00000 n
-0000305269 00000 n
-0000305433 00000 n
-0000305597 00000 n
-0000305761 00000 n
-0000305925 00000 n
-0000306089 00000 n
-0000306253 00000 n
-0000306421 00000 n
-0000306590 00000 n
-0000306759 00000 n
-0000306928 00000 n
-0000307097 00000 n
-0000307266 00000 n
-0000307435 00000 n
-0000307604 00000 n
-0000307773 00000 n
-0000307943 00000 n
-0000308113 00000 n
-0000308282 00000 n
-0000308452 00000 n
-0000308622 00000 n
-0000308790 00000 n
-0000308959 00000 n
-0000309129 00000 n
-0000309296 00000 n
-0000309457 00000 n
-0000322857 00000 n
-0000313314 00000 n
-0000309780 00000 n
-0000322794 00000 n
-0000313888 00000 n
-0000314051 00000 n
-0000314214 00000 n
-0000314377 00000 n
-0000314540 00000 n
-0000314703 00000 n
-0000314866 00000 n
-0000315029 00000 n
-0000315192 00000 n
-0000315360 00000 n
-0000315528 00000 n
-0000315696 00000 n
-0000315864 00000 n
-0000316021 00000 n
-0000316181 00000 n
-0000316347 00000 n
-0000316514 00000 n
-0000316676 00000 n
-0000316838 00000 n
-0000317000 00000 n
-0000317162 00000 n
-0000317329 00000 n
-0000317496 00000 n
-0000317663 00000 n
-0000317830 00000 n
-0000317992 00000 n
-0000318154 00000 n
-0000318311 00000 n
-0000318478 00000 n
-0000318639 00000 n
-0000318806 00000 n
-0000318973 00000 n
-0000319140 00000 n
-0000915397 00000 n
-0000894066 00000 n
-0000915223 00000 n
-0000319307 00000 n
-0000319473 00000 n
-0000319628 00000 n
-0000319784 00000 n
-0000319940 00000 n
-0000320102 00000 n
-0000320264 00000 n
-0000320421 00000 n
-0000320576 00000 n
-0000320733 00000 n
-0000320895 00000 n
-0000321052 00000 n
-0000321209 00000 n
-0000321365 00000 n
-0000321522 00000 n
-0000321684 00000 n
-0000321841 00000 n
-0000322002 00000 n
-0000322157 00000 n
-0000322319 00000 n
-0000322480 00000 n
-0000322640 00000 n
-0000326277 00000 n
-0000323933 00000 n
-0000322968 00000 n
-0000326214 00000 n
-0000324171 00000 n
-0000324328 00000 n
-0000324485 00000 n
-0000324641 00000 n
-0000324798 00000 n
-0000324955 00000 n
-0000325112 00000 n
-0000325269 00000 n
-0000325426 00000 n
-0000325582 00000 n
-0000325740 00000 n
-0000893100 00000 n
-0000873133 00000 n
-0000892927 00000 n
-0000325898 00000 n
-0000326056 00000 n
-0000329377 00000 n
-0000328630 00000 n
-0000326375 00000 n
-0000328813 00000 n
-0000328938 00000 n
-0000329063 00000 n
-0000329188 00000 n
-0000329251 00000 n
-0000329314 00000 n
-0000872339 00000 n
-0000854022 00000 n
-0000872166 00000 n
-0000991576 00000 n
-0000333885 00000 n
-0000332768 00000 n
-0000329501 00000 n
-0000333262 00000 n
-0000333325 00000 n
-0000333449 00000 n
-0000333574 00000 n
-0000333699 00000 n
-0000332918 00000 n
-0000333111 00000 n
-0000333822 00000 n
-0000595891 00000 n
-0000657612 00000 n
-0000338540 00000 n
-0000337504 00000 n
-0000334009 00000 n
-0000337977 00000 n
-0000338102 00000 n
-0000337654 00000 n
-0000337816 00000 n
-0000338227 00000 n
-0000338352 00000 n
-0000338477 00000 n
-0000354470 00000 n
-0000341761 00000 n
-0000341201 00000 n
-0000338664 00000 n
-0000341323 00000 n
-0000341448 00000 n
-0000341573 00000 n
-0000341698 00000 n
-0000345190 00000 n
-0000344049 00000 n
-0000341872 00000 n
-0000344503 00000 n
-0000344628 00000 n
-0000344753 00000 n
-0000344878 00000 n
-0000345003 00000 n
-0000344199 00000 n
-0000344351 00000 n
-0000345127 00000 n
-0000546105 00000 n
-0000346274 00000 n
-0000345961 00000 n
-0000345275 00000 n
-0000346084 00000 n
-0000346210 00000 n
-0000348371 00000 n
-0000347668 00000 n
-0000346372 00000 n
-0000347794 00000 n
-0000347922 00000 n
-0000348049 00000 n
-0000348177 00000 n
-0000348306 00000 n
-0000991694 00000 n
-0000351303 00000 n
-0000350414 00000 n
-0000348470 00000 n
-0000350722 00000 n
-0000350851 00000 n
-0000350916 00000 n
-0000350981 00000 n
-0000350561 00000 n
-0000351110 00000 n
-0000351239 00000 n
-0000530439 00000 n
-0000354663 00000 n
-0000354215 00000 n
-0000351415 00000 n
-0000354341 00000 n
-0000853347 00000 n
-0000841358 00000 n
-0000853168 00000 n
-0000354598 00000 n
-0000358487 00000 n
-0000358296 00000 n
-0000354789 00000 n
-0000358422 00000 n
-0000840817 00000 n
-0000831071 00000 n
-0000840638 00000 n
-0000363097 00000 n
-0000362698 00000 n
-0000358653 00000 n
-0000363032 00000 n
-0000362845 00000 n
-0000431895 00000 n
-0000365442 00000 n
-0000364992 00000 n
-0000363236 00000 n
-0000365118 00000 n
-0000365247 00000 n
-0000365312 00000 n
-0000365377 00000 n
-0000368173 00000 n
-0000370720 00000 n
-0000368017 00000 n
-0000365567 00000 n
-0000370139 00000 n
-0000370268 00000 n
-0000370397 00000 n
+0000655852 00000 n
+0001157871 00000 n
+0000015382 00000 n
+0000015444 00000 n
+0000655980 00000 n
+0001157792 00000 n
+0000015504 00000 n
+0000015543 00000 n
+0000664901 00000 n
+0001157699 00000 n
+0000015603 00000 n
+0000015637 00000 n
+0000665030 00000 n
+0001157606 00000 n
+0000015697 00000 n
+0000015738 00000 n
+0000685657 00000 n
+0001157527 00000 n
+0000015798 00000 n
+0000015850 00000 n
+0000692639 00000 n
+0001157395 00000 n
+0000015899 00000 n
+0000015932 00000 n
+0000692768 00000 n
+0001157277 00000 n
+0000015986 00000 n
+0000016058 00000 n
+0000692897 00000 n
+0001157198 00000 n
+0000016117 00000 n
+0000016161 00000 n
+0000703499 00000 n
+0001157119 00000 n
+0000016220 00000 n
+0000016273 00000 n
+0000703888 00000 n
+0001157026 00000 n
+0000016327 00000 n
+0000016377 00000 n
+0000707742 00000 n
+0001156933 00000 n
+0000016431 00000 n
+0000016469 00000 n
+0000708001 00000 n
+0001156840 00000 n
+0000016523 00000 n
+0000016572 00000 n
+0000710774 00000 n
+0001156708 00000 n
+0000016626 00000 n
+0000016678 00000 n
+0000710899 00000 n
+0001156629 00000 n
+0000016737 00000 n
+0000016782 00000 n
+0000711028 00000 n
+0001156536 00000 n
+0000016841 00000 n
+0000016893 00000 n
+0000711157 00000 n
+0001156443 00000 n
+0000016952 00000 n
+0000017005 00000 n
+0000713609 00000 n
+0001156364 00000 n
+0000017064 00000 n
+0000017113 00000 n
+0000713738 00000 n
+0001156271 00000 n
+0000017167 00000 n
+0000017247 00000 n
+0000718053 00000 n
+0001156192 00000 n
+0000017301 00000 n
+0000017350 00000 n
+0000721558 00000 n
+0001156074 00000 n
+0000017399 00000 n
+0000017439 00000 n
+0000721817 00000 n
+0001155995 00000 n
+0000017498 00000 n
+0000017545 00000 n
+0000725249 00000 n
+0001155877 00000 n
+0000017599 00000 n
+0000017644 00000 n
+0000725378 00000 n
+0001155798 00000 n
+0000017703 00000 n
+0000017762 00000 n
+0000728733 00000 n
+0001155705 00000 n
+0000017821 00000 n
+0000017885 00000 n
+0000728992 00000 n
+0001155612 00000 n
+0000017944 00000 n
+0000018000 00000 n
+0000733149 00000 n
+0001155519 00000 n
+0000018059 00000 n
+0000018117 00000 n
+0000735170 00000 n
+0001155440 00000 n
+0000018176 00000 n
+0000018238 00000 n
+0000737334 00000 n
+0001155307 00000 n
+0000018285 00000 n
+0000018337 00000 n
+0000737463 00000 n
+0001155228 00000 n
+0000018386 00000 n
+0000018430 00000 n
+0000741498 00000 n
+0001155096 00000 n
+0000018479 00000 n
+0000018520 00000 n
+0000741627 00000 n
+0001155017 00000 n
+0000018574 00000 n
+0000018622 00000 n
+0000741755 00000 n
+0001154938 00000 n
+0000018676 00000 n
+0000018727 00000 n
+0000741884 00000 n
+0001154859 00000 n
+0000018776 00000 n
+0000018823 00000 n
+0000746483 00000 n
+0001154726 00000 n
+0000018870 00000 n
+0000018907 00000 n
+0000746612 00000 n
+0001154608 00000 n
+0000018956 00000 n
+0000018995 00000 n
+0000746741 00000 n
+0001154543 00000 n
+0000019049 00000 n
+0000019127 00000 n
+0000746870 00000 n
+0001154450 00000 n
+0000019176 00000 n
+0000019243 00000 n
+0000746999 00000 n
+0001154371 00000 n
+0000019292 00000 n
+0000019337 00000 n
+0000750440 00000 n
+0001154238 00000 n
+0000019385 00000 n
+0000019417 00000 n
+0000750569 00000 n
+0001154120 00000 n
+0000019466 00000 n
+0000019505 00000 n
+0000750698 00000 n
+0001154055 00000 n
+0000019559 00000 n
+0000019620 00000 n
+0000754380 00000 n
+0001153923 00000 n
+0000019669 00000 n
+0000019726 00000 n
+0000754509 00000 n
+0001153858 00000 n
+0000019780 00000 n
+0000019829 00000 n
+0000754638 00000 n
+0001153726 00000 n
+0000019878 00000 n
+0000019940 00000 n
+0000754767 00000 n
+0001153647 00000 n
+0000019994 00000 n
+0000020049 00000 n
+0000779610 00000 n
+0001153554 00000 n
+0000020103 00000 n
+0000020144 00000 n
+0000779739 00000 n
+0001153475 00000 n
+0000020198 00000 n
+0000020250 00000 n
+0000780128 00000 n
+0001153357 00000 n
+0000020299 00000 n
+0000020349 00000 n
+0000782950 00000 n
+0001153278 00000 n
+0000020403 00000 n
+0000020441 00000 n
+0000783079 00000 n
+0001153185 00000 n
+0000020495 00000 n
+0000020532 00000 n
+0000783208 00000 n
+0001153092 00000 n
+0000020586 00000 n
+0000020624 00000 n
+0000783337 00000 n
+0001152999 00000 n
+0000020678 00000 n
+0000020730 00000 n
+0000786573 00000 n
+0001152906 00000 n
+0000020784 00000 n
+0000020827 00000 n
+0000786701 00000 n
+0001152774 00000 n
+0000020881 00000 n
+0000020926 00000 n
+0000786829 00000 n
+0001152695 00000 n
+0000020985 00000 n
+0000021051 00000 n
+0000789815 00000 n
+0001152602 00000 n
+0000021110 00000 n
+0000021198 00000 n
+0000789944 00000 n
+0001152509 00000 n
+0000021257 00000 n
+0000021332 00000 n
+0000790073 00000 n
+0001152416 00000 n
+0000021391 00000 n
+0000021476 00000 n
+0000792981 00000 n
+0001152323 00000 n
+0000021535 00000 n
+0000021616 00000 n
+0000795442 00000 n
+0001152244 00000 n
+0000021675 00000 n
+0000021759 00000 n
+0000795571 00000 n
+0001152165 00000 n
+0000021813 00000 n
+0000021857 00000 n
+0000798400 00000 n
+0001152045 00000 n
+0000021905 00000 n
+0000021939 00000 n
+0000798529 00000 n
+0001151966 00000 n
+0000021988 00000 n
+0000022015 00000 n
+0000816495 00000 n
+0001151873 00000 n
+0000022064 00000 n
+0000022092 00000 n
+0000824044 00000 n
+0001151780 00000 n
+0000022141 00000 n
+0000022181 00000 n
+0000830319 00000 n
+0001151687 00000 n
+0000022230 00000 n
+0000022273 00000 n
+0000836854 00000 n
+0001151594 00000 n
+0000022322 00000 n
+0000022359 00000 n
+0000850093 00000 n
+0001151501 00000 n
+0000022408 00000 n
+0000022445 00000 n
+0000853117 00000 n
+0001151408 00000 n
+0000022494 00000 n
+0000022532 00000 n
+0000859767 00000 n
+0001151315 00000 n
+0000022581 00000 n
+0000022620 00000 n
+0000873231 00000 n
+0001151222 00000 n
+0000022669 00000 n
+0000022708 00000 n
+0000876250 00000 n
+0001151129 00000 n
+0000022758 00000 n
+0000022798 00000 n
+0000885745 00000 n
+0001151036 00000 n
+0000022848 00000 n
+0000022878 00000 n
+0000894551 00000 n
+0001150943 00000 n
+0000022928 00000 n
+0000022971 00000 n
+0000895005 00000 n
+0001150850 00000 n
+0000023021 00000 n
+0000023054 00000 n
+0000909263 00000 n
+0001150757 00000 n
+0000023104 00000 n
+0000023133 00000 n
+0000916463 00000 n
+0001150664 00000 n
+0000023183 00000 n
+0000023217 00000 n
+0000922445 00000 n
+0001150571 00000 n
+0000023267 00000 n
+0000023304 00000 n
+0000925715 00000 n
+0001150478 00000 n
+0000023354 00000 n
+0000023391 00000 n
+0000931198 00000 n
+0001150385 00000 n
+0000023441 00000 n
+0000023474 00000 n
+0000931651 00000 n
+0001150292 00000 n
+0000023524 00000 n
+0000023558 00000 n
+0000934599 00000 n
+0001150199 00000 n
+0000023608 00000 n
+0000023647 00000 n
+0000936747 00000 n
+0001150120 00000 n
+0000023697 00000 n
+0000023731 00000 n
+0000024104 00000 n
+0000024226 00000 n
+0000289027 00000 n
+0000023784 00000 n
+0000288901 00000 n
+0000288964 00000 n
+0001144529 00000 n
+0001118444 00000 n
+0001144355 00000 n
+0001145567 00000 n
+0000025535 00000 n
+0000025728 00000 n
+0000025808 00000 n
+0000025845 00000 n
+0000025926 00000 n
+0000026050 00000 n
+0000026309 00000 n
+0000026668 00000 n
+0000026700 00000 n
+0000026794 00000 n
+0000027827 00000 n
+0000038963 00000 n
+0000104553 00000 n
+0000170143 00000 n
+0000235733 00000 n
+0000290455 00000 n
+0000290270 00000 n
+0000289127 00000 n
+0000290392 00000 n
+0001117208 00000 n
+0001090589 00000 n
+0001117034 00000 n
+0001089904 00000 n
+0001087759 00000 n
+0001089740 00000 n
+0000302181 00000 n
+0000293506 00000 n
+0000290540 00000 n
+0000302055 00000 n
+0000302118 00000 n
+0000294052 00000 n
+0000294206 00000 n
+0000294363 00000 n
+0000294520 00000 n
+0000294677 00000 n
+0000294834 00000 n
+0000294996 00000 n
+0000295158 00000 n
+0000295319 00000 n
+0000295481 00000 n
+0000295648 00000 n
+0000295815 00000 n
+0000295980 00000 n
+0000296142 00000 n
+0000296308 00000 n
+0000296470 00000 n
+0000296624 00000 n
+0000296781 00000 n
+0000296938 00000 n
+0000297094 00000 n
+0000297250 00000 n
+0000297407 00000 n
+0000297562 00000 n
+0000297719 00000 n
+0000297881 00000 n
+0000298043 00000 n
+0000298200 00000 n
+0000298355 00000 n
+0000298516 00000 n
+0000298683 00000 n
+0000298850 00000 n
+0000299011 00000 n
+0000299166 00000 n
+0000299323 00000 n
+0000299480 00000 n
+0000299642 00000 n
+0000299799 00000 n
+0000299956 00000 n
+0000300117 00000 n
+0000300275 00000 n
+0000300438 00000 n
+0000300606 00000 n
+0000300774 00000 n
+0000300937 00000 n
+0000301100 00000 n
+0000301263 00000 n
+0000301425 00000 n
+0000301588 00000 n
+0000301744 00000 n
+0000301900 00000 n
+0000315699 00000 n
+0000305636 00000 n
+0000302266 00000 n
+0000315634 00000 n
+0001087171 00000 n
+0001069750 00000 n
+0001086985 00000 n
+0000306286 00000 n
+0000306450 00000 n
+0000306613 00000 n
+0000306777 00000 n
+0000306936 00000 n
+0000307100 00000 n
+0000307264 00000 n
+0000307428 00000 n
+0000307592 00000 n
+0000307756 00000 n
+0000307920 00000 n
+0000308084 00000 n
+0000308248 00000 n
+0000308412 00000 n
+0000308577 00000 n
+0000308742 00000 n
+0000308907 00000 n
+0000309072 00000 n
+0000309232 00000 n
+0000309397 00000 n
+0000309561 00000 n
+0000309721 00000 n
+0000309886 00000 n
+0000310056 00000 n
+0000310226 00000 n
+0000310391 00000 n
+0000310560 00000 n
+0000310729 00000 n
+0000310894 00000 n
+0000311059 00000 n
+0000311223 00000 n
+0000311388 00000 n
+0000311548 00000 n
+0000311713 00000 n
+0000311878 00000 n
+0000312034 00000 n
+0000312193 00000 n
+0000312352 00000 n
+0000312509 00000 n
+0000312668 00000 n
+0000312832 00000 n
+0000313001 00000 n
+0000313170 00000 n
+0000313334 00000 n
+0000313503 00000 n
+0000313672 00000 n
+0000313831 00000 n
+0000313995 00000 n
+0000314159 00000 n
+0000314323 00000 n
+0000314487 00000 n
+0000314651 00000 n
+0000314815 00000 n
+0000314978 00000 n
+0000315142 00000 n
+0000315304 00000 n
+0000315466 00000 n
+0000329835 00000 n
+0000319302 00000 n
+0000315799 00000 n
+0000329770 00000 n
+0000319970 00000 n
+0000320139 00000 n
+0000320307 00000 n
+0000320471 00000 n
+0000320634 00000 n
+0000320798 00000 n
+0000320962 00000 n
+0000321126 00000 n
+0000321290 00000 n
+0000321459 00000 n
+0000321627 00000 n
+0000321796 00000 n
+0000321965 00000 n
+0000322133 00000 n
+0000322302 00000 n
+0000322471 00000 n
+0000322639 00000 n
+0000322808 00000 n
+0000322978 00000 n
+0000323147 00000 n
+0000323317 00000 n
+0000323487 00000 n
+0000323657 00000 n
+0000323827 00000 n
+0000323997 00000 n
+0000324167 00000 n
+0000324337 00000 n
+0000324507 00000 n
+0000324676 00000 n
+0000324840 00000 n
+0000325003 00000 n
+0000325167 00000 n
+0000325331 00000 n
+0000325495 00000 n
+0000325659 00000 n
+0000325823 00000 n
+0000325986 00000 n
+0000326150 00000 n
+0000326314 00000 n
+0000326477 00000 n
+0000326641 00000 n
+0000326809 00000 n
+0000326978 00000 n
+0000327147 00000 n
+0000327316 00000 n
+0000327473 00000 n
+0000327636 00000 n
+0000327804 00000 n
+0000327971 00000 n
+0000328134 00000 n
+0000328296 00000 n
+0000328459 00000 n
+0000328622 00000 n
+0000328790 00000 n
+0000328958 00000 n
+0000329126 00000 n
+0000329293 00000 n
+0000329454 00000 n
+0000329614 00000 n
+0000342999 00000 n
+0000333429 00000 n
+0000329935 00000 n
+0000342934 00000 n
+0000334061 00000 n
+0000334229 00000 n
+0000334392 00000 n
+0000334560 00000 n
+0000334728 00000 n
+0000334896 00000 n
+0001068859 00000 n
+0001047525 00000 n
+0001068683 00000 n
+0000335064 00000 n
+0000335231 00000 n
+0000335387 00000 n
+0000335545 00000 n
+0000335703 00000 n
+0000335866 00000 n
+0000336029 00000 n
+0000336187 00000 n
+0000336343 00000 n
+0000336501 00000 n
+0000336664 00000 n
+0000336822 00000 n
+0000336980 00000 n
+0000337136 00000 n
+0000337294 00000 n
+0000337457 00000 n
+0000337615 00000 n
+0000337778 00000 n
+0000337935 00000 n
+0000338097 00000 n
+0000338260 00000 n
+0000338423 00000 n
+0000338581 00000 n
+0000338744 00000 n
+0000338907 00000 n
+0000339070 00000 n
+0000339233 00000 n
+0000339396 00000 n
+0000339559 00000 n
+0000339727 00000 n
+0000339895 00000 n
+0000340062 00000 n
+0000340228 00000 n
+0000340395 00000 n
+0000340562 00000 n
+0000340725 00000 n
+0000340882 00000 n
+0000341040 00000 n
+0000341198 00000 n
+0000341356 00000 n
+0000341514 00000 n
+0000341672 00000 n
+0000341830 00000 n
+0000341988 00000 n
+0000342146 00000 n
+0000342304 00000 n
+0000342463 00000 n
+0000342620 00000 n
+0000342777 00000 n
+0000345400 00000 n
+0000343854 00000 n
+0000343113 00000 n
+0000345335 00000 n
+0000344064 00000 n
+0001046557 00000 n
+0001026587 00000 n
+0001046382 00000 n
+0000344223 00000 n
+0000344382 00000 n
+0000344540 00000 n
+0000344699 00000 n
+0000344858 00000 n
+0000345017 00000 n
+0000345176 00000 n
+0001145688 00000 n
+0000348523 00000 n
+0000347756 00000 n
+0000345501 00000 n
+0000347944 00000 n
+0000348072 00000 n
+0000348200 00000 n
+0000348328 00000 n
+0000348393 00000 n
+0000348458 00000 n
+0001025770 00000 n
+0001007305 00000 n
+0001025595 00000 n
+0000353060 00000 n
+0000351919 00000 n
+0000348651 00000 n
+0000352421 00000 n
+0000352486 00000 n
+0000352613 00000 n
+0000352741 00000 n
+0000352869 00000 n
+0000352075 00000 n
+0000352269 00000 n
+0000352995 00000 n
+0000692832 00000 n
+0000754831 00000 n
+0000357742 00000 n
+0000356684 00000 n
+0000353188 00000 n
+0000357165 00000 n
+0000357293 00000 n
+0000356840 00000 n
+0000357003 00000 n
+0000357421 00000 n
+0000357549 00000 n
+0000357677 00000 n
+0000373539 00000 n
+0000360983 00000 n
+0000360408 00000 n
+0000357870 00000 n
+0000360534 00000 n
+0000360662 00000 n
+0000360790 00000 n
+0000360918 00000 n
+0000364441 00000 n
+0000363275 00000 n
+0000361097 00000 n
+0000363737 00000 n
+0000363865 00000 n
+0000363993 00000 n
+0000364121 00000 n
+0000364249 00000 n
+0000363431 00000 n
+0000363584 00000 n
+0000364376 00000 n
+0000619806 00000 n
+0000365518 00000 n
+0000365199 00000 n
+0000364527 00000 n
+0000365325 00000 n
+0000365453 00000 n
+0001145813 00000 n
+0000367561 00000 n
+0000366858 00000 n
+0000365618 00000 n
+0000366984 00000 n
+0000367112 00000 n
+0000367239 00000 n
+0000367367 00000 n
+0000367496 00000 n
+0000370140 00000 n
+0000369510 00000 n
+0000367661 00000 n
0000369816 00000 n
-0000369978 00000 n
-0000830173 00000 n
-0000820377 00000 n
-0000829999 00000 n
-0000819813 00000 n
-0000810727 00000 n
-0000819638 00000 n
-0000370526 00000 n
-0000370655 00000 n
-0000991819 00000 n
-0000369645 00000 n
-0000369703 00000 n
-0000369793 00000 n
-0000472215 00000 n
-0000507341 00000 n
-0000375384 00000 n
-0000374449 00000 n
-0000370876 00000 n
-0000374933 00000 n
-0000375062 00000 n
-0000374605 00000 n
-0000374771 00000 n
-0000375191 00000 n
-0000375320 00000 n
-0000661639 00000 n
-0000379043 00000 n
-0000378663 00000 n
-0000375536 00000 n
-0000378978 00000 n
-0000378810 00000 n
-0000380266 00000 n
-0000380075 00000 n
-0000379168 00000 n
-0000380201 00000 n
-0000382969 00000 n
-0000382391 00000 n
-0000380365 00000 n
-0000382517 00000 n
-0000382646 00000 n
-0000382775 00000 n
-0000382904 00000 n
-0000386147 00000 n
-0000385440 00000 n
-0000383107 00000 n
-0000385566 00000 n
-0000385695 00000 n
-0000385824 00000 n
-0000385953 00000 n
-0000386082 00000 n
-0000390455 00000 n
-0000389557 00000 n
-0000386272 00000 n
-0000389875 00000 n
-0000390004 00000 n
-0000389704 00000 n
-0000390133 00000 n
-0000390262 00000 n
-0000390390 00000 n
-0000991944 00000 n
-0000592515 00000 n
-0000394491 00000 n
-0000393913 00000 n
-0000390580 00000 n
-0000394039 00000 n
-0000394168 00000 n
-0000394297 00000 n
-0000394426 00000 n
-0000398086 00000 n
-0000397766 00000 n
-0000394629 00000 n
-0000397892 00000 n
-0000398021 00000 n
-0000401532 00000 n
-0000401032 00000 n
-0000398198 00000 n
-0000401338 00000 n
-0000810452 00000 n
-0000807094 00000 n
-0000810273 00000 n
-0000401467 00000 n
-0000401179 00000 n
-0000657354 00000 n
-0000403260 00000 n
-0000402813 00000 n
-0000401714 00000 n
-0000402939 00000 n
-0000403068 00000 n
-0000403195 00000 n
-0000403713 00000 n
-0000403522 00000 n
-0000403372 00000 n
-0000403648 00000 n
-0000406327 00000 n
-0000405749 00000 n
-0000403755 00000 n
-0000405875 00000 n
-0000406004 00000 n
-0000406133 00000 n
-0000406262 00000 n
-0000992069 00000 n
-0000406767 00000 n
-0000406576 00000 n
-0000406426 00000 n
-0000406702 00000 n
-0000410769 00000 n
-0000410003 00000 n
-0000406809 00000 n
-0000410317 00000 n
-0000410446 00000 n
-0000410574 00000 n
-0000410639 00000 n
-0000410704 00000 n
-0000410150 00000 n
-0000415267 00000 n
-0000415459 00000 n
-0000415012 00000 n
-0000410868 00000 n
-0000415138 00000 n
-0000415394 00000 n
-0000419338 00000 n
-0000418761 00000 n
-0000415584 00000 n
-0000418887 00000 n
-0000419015 00000 n
-0000419144 00000 n
-0000419273 00000 n
-0000422155 00000 n
-0000423534 00000 n
-0000422029 00000 n
-0000419476 00000 n
-0000423081 00000 n
-0000423210 00000 n
-0000423339 00000 n
-0000423404 00000 n
-0000423469 00000 n
-0000426611 00000 n
-0000425904 00000 n
-0000423689 00000 n
-0000426030 00000 n
-0000426159 00000 n
-0000426287 00000 n
-0000426352 00000 n
-0000426417 00000 n
-0000426546 00000 n
-0000992194 00000 n
-0000432218 00000 n
-0000431300 00000 n
-0000426723 00000 n
-0000431766 00000 n
-0000431456 00000 n
-0000431607 00000 n
-0000432024 00000 n
-0000432153 00000 n
-0000785720 00000 n
-0000436057 00000 n
-0000434786 00000 n
-0000432356 00000 n
-0000435476 00000 n
-0000435605 00000 n
-0000435734 00000 n
-0000434951 00000 n
-0000435103 00000 n
-0000435289 00000 n
-0000435863 00000 n
-0000435992 00000 n
-0000440288 00000 n
-0000439968 00000 n
-0000436183 00000 n
-0000440094 00000 n
-0000440223 00000 n
-0000443763 00000 n
-0000443384 00000 n
-0000440413 00000 n
-0000443698 00000 n
-0000443531 00000 n
-0000446780 00000 n
-0000446975 00000 n
-0000446525 00000 n
-0000443875 00000 n
-0000446651 00000 n
-0000446845 00000 n
-0000446910 00000 n
-0000450344 00000 n
-0000450153 00000 n
-0000447087 00000 n
-0000450279 00000 n
-0000992319 00000 n
-0000454655 00000 n
-0000454077 00000 n
-0000450456 00000 n
-0000454203 00000 n
-0000454332 00000 n
-0000454397 00000 n
-0000454462 00000 n
-0000454591 00000 n
-0000457866 00000 n
-0000456824 00000 n
-0000454767 00000 n
-0000457285 00000 n
-0000457414 00000 n
-0000456980 00000 n
-0000457132 00000 n
-0000457543 00000 n
-0000457672 00000 n
-0000457801 00000 n
-0000459418 00000 n
-0000459227 00000 n
-0000457978 00000 n
-0000459353 00000 n
-0000460953 00000 n
-0000460762 00000 n
-0000459517 00000 n
-0000460888 00000 n
-0000463877 00000 n
-0000463557 00000 n
-0000461052 00000 n
-0000463683 00000 n
-0000463812 00000 n
-0000468308 00000 n
-0000467939 00000 n
-0000464015 00000 n
-0000468243 00000 n
-0000468086 00000 n
-0000992444 00000 n
-0000625982 00000 n
-0000472280 00000 n
-0000471960 00000 n
-0000468420 00000 n
-0000472086 00000 n
-0000476118 00000 n
-0000475798 00000 n
-0000472405 00000 n
-0000475924 00000 n
-0000475989 00000 n
-0000476053 00000 n
-0000481414 00000 n
-0000480122 00000 n
-0000476243 00000 n
-0000481349 00000 n
-0000480314 00000 n
-0000480468 00000 n
-0000480623 00000 n
-0000480808 00000 n
-0000480982 00000 n
-0000481167 00000 n
-0000554393 00000 n
-0000485716 00000 n
-0000485525 00000 n
-0000481595 00000 n
-0000485651 00000 n
-0000489480 00000 n
-0000489289 00000 n
-0000485841 00000 n
-0000489415 00000 n
-0000493794 00000 n
-0000492851 00000 n
-0000489592 00000 n
-0000493342 00000 n
-0000493471 00000 n
-0000493007 00000 n
-0000493600 00000 n
-0000493729 00000 n
-0000493176 00000 n
-0000992569 00000 n
-0000564129 00000 n
-0000497456 00000 n
-0000496894 00000 n
-0000493906 00000 n
-0000497391 00000 n
-0000497050 00000 n
-0000497221 00000 n
-0000645064 00000 n
-0000500710 00000 n
-0000500390 00000 n
-0000497625 00000 n
+0000369945 00000 n
+0000370010 00000 n
+0000370075 00000 n
+0000369657 00000 n
+0000603615 00000 n
+0000373733 00000 n
+0000373028 00000 n
+0000370254 00000 n
+0000373154 00000 n
+0000373283 00000 n
+0000373410 00000 n
+0001006622 00000 n
+0000994560 00000 n
+0001006443 00000 n
+0000373668 00000 n
+0000378400 00000 n
+0000377330 00000 n
+0000373861 00000 n
+0000378335 00000 n
+0000993987 00000 n
+0000983054 00000 n
+0000993808 00000 n
+0000377513 00000 n
+0000377668 00000 n
+0000377839 00000 n
+0000378010 00000 n
+0000378165 00000 n
+0000521253 00000 n
+0000685721 00000 n
+0000381927 00000 n
+0000381736 00000 n
+0000378569 00000 n
+0000381862 00000 n
+0000386399 00000 n
+0000386002 00000 n
+0000382069 00000 n
+0000386334 00000 n
+0000386149 00000 n
+0001145938 00000 n
+0000488637 00000 n
+0000388602 00000 n
+0000388152 00000 n
+0000386555 00000 n
+0000388278 00000 n
+0000388407 00000 n
+0000388472 00000 n
+0000388537 00000 n
+0000389071 00000 n
+0000388880 00000 n
+0000388730 00000 n
+0000389006 00000 n
+0000391766 00000 n
+0000394356 00000 n
+0000391601 00000 n
+0000389113 00000 n
+0000393904 00000 n
+0000394033 00000 n
+0000394162 00000 n
+0000393409 00000 n
+0000393571 00000 n
+0000982148 00000 n
+0000972128 00000 n
+0000981974 00000 n
+0000971564 00000 n
+0000962478 00000 n
+0000971389 00000 n
+0000394291 00000 n
+0000393733 00000 n
+0000393238 00000 n
+0000393296 00000 n
+0000393386 00000 n
+0000541088 00000 n
+0000581042 00000 n
+0000399123 00000 n
+0000398187 00000 n
+0000394527 00000 n
+0000398671 00000 n
+0000398800 00000 n
+0000398929 00000 n
+0000398343 00000 n
+0000398509 00000 n
+0000399058 00000 n
+0000758863 00000 n
+0000403041 00000 n
+0000402532 00000 n
+0000399279 00000 n
+0000402847 00000 n
+0000402976 00000 n
+0000402679 00000 n
+0000404189 00000 n
+0000403998 00000 n
+0000403182 00000 n
+0000404124 00000 n
+0001146063 00000 n
+0000406055 00000 n
+0000405735 00000 n
+0000404290 00000 n
+0000405861 00000 n
+0000405990 00000 n
+0000409350 00000 n
+0000408515 00000 n
+0000406169 00000 n
+0000408641 00000 n
+0000408770 00000 n
+0000408899 00000 n
+0000409027 00000 n
+0000409156 00000 n
+0000409285 00000 n
+0000413404 00000 n
+0000412508 00000 n
+0000409492 00000 n
+0000412825 00000 n
+0000412954 00000 n
+0000413082 00000 n
+0000412655 00000 n
+0000413210 00000 n
+0000413339 00000 n
+0000417431 00000 n
+0000416853 00000 n
+0000413545 00000 n
+0000416979 00000 n
+0000417108 00000 n
+0000417237 00000 n
+0000417366 00000 n
+0000421358 00000 n
+0000420909 00000 n
+0000417573 00000 n
+0000421035 00000 n
+0000421164 00000 n
+0000421293 00000 n
+0000423671 00000 n
+0000423480 00000 n
+0000421486 00000 n
+0000423606 00000 n
+0001146188 00000 n
+0000426939 00000 n
+0000426361 00000 n
+0000423815 00000 n
+0000426487 00000 n
+0000962203 00000 n
+0000958846 00000 n
+0000962024 00000 n
+0000426616 00000 n
+0000426745 00000 n
+0000426874 00000 n
+0000431006 00000 n
+0000430199 00000 n
+0000427110 00000 n
+0000430684 00000 n
+0000430813 00000 n
+0000958491 00000 n
+0000956494 00000 n
+0000958326 00000 n
+0000430355 00000 n
+0000430519 00000 n
+0000430941 00000 n
+0000836918 00000 n
+0000853181 00000 n
+0000434543 00000 n
+0000433836 00000 n
+0000431134 00000 n
+0000433962 00000 n
+0000434091 00000 n
+0000434220 00000 n
+0000434349 00000 n
+0000434478 00000 n
+0000438230 00000 n
+0000436960 00000 n
+0000434657 00000 n
+0000437263 00000 n
+0000437392 00000 n
+0000437521 00000 n
+0000437650 00000 n
+0000437779 00000 n
+0000437908 00000 n
+0000438037 00000 n
+0000438166 00000 n
+0000437107 00000 n
+0000643881 00000 n
+0000441952 00000 n
+0000441503 00000 n
+0000438358 00000 n
+0000441629 00000 n
+0000441758 00000 n
+0000441887 00000 n
+0000444959 00000 n
+0000444639 00000 n
+0000442066 00000 n
+0000444765 00000 n
+0000444894 00000 n
+0001146313 00000 n
+0000447976 00000 n
+0000447527 00000 n
+0000445129 00000 n
+0000447653 00000 n
+0000447782 00000 n
+0000447911 00000 n
+0000450825 00000 n
+0000450118 00000 n
+0000448133 00000 n
+0000450244 00000 n
+0000450373 00000 n
+0000450502 00000 n
+0000450631 00000 n
+0000450760 00000 n
+0000453634 00000 n
+0000453314 00000 n
+0000450939 00000 n
+0000453440 00000 n
+0000453569 00000 n
+0000459347 00000 n
+0000456562 00000 n
+0000456113 00000 n
+0000453748 00000 n
+0000456239 00000 n
+0000456368 00000 n
+0000456497 00000 n
+0000460886 00000 n
+0000459200 00000 n
+0000456690 00000 n
+0000460434 00000 n
+0000460563 00000 n
+0000460273 00000 n
+0000460692 00000 n
+0000460821 00000 n
+0000754573 00000 n
+0000461398 00000 n
+0000461207 00000 n
+0000461057 00000 n
+0000461333 00000 n
+0001146438 00000 n
+0000464012 00000 n
+0000463434 00000 n
+0000461440 00000 n
+0000463560 00000 n
+0000463689 00000 n
+0000463818 00000 n
+0000463947 00000 n
+0000464453 00000 n
+0000464262 00000 n
+0000464112 00000 n
+0000464388 00000 n
+0000468540 00000 n
+0000467774 00000 n
+0000464495 00000 n
+0000468088 00000 n
+0000468217 00000 n
+0000468345 00000 n
+0000468410 00000 n
+0000468475 00000 n
+0000467921 00000 n
+0000473038 00000 n
+0000473230 00000 n
+0000472783 00000 n
+0000468640 00000 n
+0000472909 00000 n
+0000473165 00000 n
+0000477082 00000 n
+0000476504 00000 n
+0000473358 00000 n
+0000476630 00000 n
+0000476759 00000 n
+0000476888 00000 n
+0000477017 00000 n
+0000480192 00000 n
+0000479614 00000 n
+0000477223 00000 n
+0000479740 00000 n
+0000479869 00000 n
+0000479998 00000 n
+0000480063 00000 n
+0000480127 00000 n
+0001146563 00000 n
+0000483517 00000 n
+0000482813 00000 n
+0000480349 00000 n
+0000482939 00000 n
+0000483068 00000 n
+0000483196 00000 n
+0000483261 00000 n
+0000483326 00000 n
+0000483452 00000 n
+0000488830 00000 n
+0000488042 00000 n
+0000483631 00000 n
+0000488508 00000 n
+0000488198 00000 n
+0000488349 00000 n
+0000488766 00000 n
+0000937473 00000 n
+0000492695 00000 n
+0000491424 00000 n
+0000488971 00000 n
+0000492114 00000 n
+0000492243 00000 n
+0000492372 00000 n
+0000492501 00000 n
+0000491589 00000 n
+0000491741 00000 n
+0000491927 00000 n
+0000492630 00000 n
+0000496842 00000 n
+0000496393 00000 n
+0000492823 00000 n
+0000496519 00000 n
+0000496648 00000 n
+0000496777 00000 n
+0000500748 00000 n
+0000500369 00000 n
+0000496970 00000 n
+0000500683 00000 n
0000500516 00000 n
-0000500645 00000 n
-0000504226 00000 n
-0000503906 00000 n
-0000500835 00000 n
-0000504032 00000 n
-0000504161 00000 n
-0000507406 00000 n
-0000507086 00000 n
-0000504338 00000 n
-0000507212 00000 n
-0000511216 00000 n
-0000511025 00000 n
-0000507562 00000 n
-0000511151 00000 n
-0000515098 00000 n
-0000514469 00000 n
-0000511371 00000 n
-0000514776 00000 n
-0000514905 00000 n
-0000514616 00000 n
-0000515034 00000 n
-0000992694 00000 n
-0000519292 00000 n
-0000518613 00000 n
-0000515267 00000 n
-0000519098 00000 n
-0000518769 00000 n
-0000519227 00000 n
-0000518943 00000 n
-0000523314 00000 n
-0000522865 00000 n
-0000519404 00000 n
-0000522991 00000 n
-0000523120 00000 n
-0000523249 00000 n
-0000527347 00000 n
-0000526681 00000 n
-0000523469 00000 n
-0000527154 00000 n
-0000527283 00000 n
-0000526837 00000 n
-0000526999 00000 n
-0000530634 00000 n
-0000529995 00000 n
-0000527516 00000 n
-0000530310 00000 n
-0000530142 00000 n
-0000530504 00000 n
-0000530569 00000 n
-0000534443 00000 n
-0000533940 00000 n
-0000530760 00000 n
-0000534249 00000 n
-0000534378 00000 n
-0000534087 00000 n
-0000539058 00000 n
-0000538684 00000 n
-0000534625 00000 n
-0000538993 00000 n
-0000538831 00000 n
-0000806739 00000 n
-0000804741 00000 n
-0000806574 00000 n
-0000992819 00000 n
-0000622257 00000 n
-0000542988 00000 n
-0000542351 00000 n
-0000539184 00000 n
-0000542665 00000 n
-0000542794 00000 n
-0000542498 00000 n
-0000542923 00000 n
-0000562318 00000 n
-0000546169 00000 n
-0000545850 00000 n
-0000543113 00000 n
-0000545976 00000 n
-0000549396 00000 n
-0000549076 00000 n
-0000546337 00000 n
-0000549202 00000 n
-0000549331 00000 n
-0000554458 00000 n
-0000553796 00000 n
-0000549508 00000 n
-0000554264 00000 n
-0000553952 00000 n
-0000554104 00000 n
-0000558566 00000 n
-0000557687 00000 n
-0000554570 00000 n
-0000557987 00000 n
-0000558116 00000 n
-0000558244 00000 n
-0000558373 00000 n
-0000558501 00000 n
-0000557834 00000 n
-0000562512 00000 n
-0000562063 00000 n
-0000558678 00000 n
-0000562189 00000 n
-0000562447 00000 n
-0000992944 00000 n
-0000564194 00000 n
-0000563874 00000 n
-0000562624 00000 n
-0000564000 00000 n
-0000565754 00000 n
-0000565563 00000 n
-0000564306 00000 n
-0000565689 00000 n
-0000567473 00000 n
-0000566965 00000 n
-0000565853 00000 n
-0000567091 00000 n
-0000567220 00000 n
-0000567347 00000 n
-0000567410 00000 n
-0000571388 00000 n
-0000571132 00000 n
-0000567585 00000 n
-0000571258 00000 n
-0000571323 00000 n
-0000576424 00000 n
-0000574584 00000 n
-0000571500 00000 n
-0000576101 00000 n
-0000574794 00000 n
-0000576230 00000 n
-0000576359 00000 n
-0000574961 00000 n
-0000575122 00000 n
-0000575284 00000 n
-0000575446 00000 n
-0000575607 00000 n
-0000575768 00000 n
-0000575939 00000 n
-0000785687 00000 n
-0000581569 00000 n
-0000579821 00000 n
-0000576536 00000 n
-0000581504 00000 n
-0000580040 00000 n
-0000580203 00000 n
-0000580364 00000 n
-0000580524 00000 n
-0000580687 00000 n
-0000580849 00000 n
-0000581012 00000 n
-0000581174 00000 n
-0000581337 00000 n
-0000993069 00000 n
-0000587912 00000 n
-0000584338 00000 n
-0000581694 00000 n
-0000587847 00000 n
-0000584656 00000 n
-0000584825 00000 n
-0000584987 00000 n
-0000585149 00000 n
-0000585311 00000 n
-0000585473 00000 n
-0000585636 00000 n
-0000585789 00000 n
-0000585952 00000 n
-0000586105 00000 n
-0000586258 00000 n
-0000586409 00000 n
-0000586563 00000 n
-0000586725 00000 n
-0000586887 00000 n
-0000587049 00000 n
-0000587210 00000 n
-0000587372 00000 n
-0000587534 00000 n
-0000587695 00000 n
-0000592710 00000 n
-0000591581 00000 n
-0000588024 00000 n
-0000592386 00000 n
-0000591755 00000 n
-0000591918 00000 n
-0000592069 00000 n
-0000592232 00000 n
-0000592580 00000 n
-0000592645 00000 n
-0000596083 00000 n
-0000595508 00000 n
-0000592849 00000 n
-0000595634 00000 n
-0000595762 00000 n
-0000596019 00000 n
-0000600404 00000 n
-0000599591 00000 n
-0000596252 00000 n
-0000600079 00000 n
-0000599747 00000 n
-0000599917 00000 n
-0000600144 00000 n
-0000600209 00000 n
-0000600274 00000 n
-0000600339 00000 n
-0000603670 00000 n
-0000603349 00000 n
-0000600503 00000 n
-0000603475 00000 n
-0000603540 00000 n
-0000603605 00000 n
-0000607574 00000 n
-0000606995 00000 n
-0000603782 00000 n
-0000607121 00000 n
-0000607250 00000 n
-0000607315 00000 n
-0000607380 00000 n
-0000607444 00000 n
-0000607509 00000 n
-0000993194 00000 n
-0000611415 00000 n
-0000610706 00000 n
+0000503598 00000 n
+0000503793 00000 n
+0000503343 00000 n
+0000500862 00000 n
+0000503469 00000 n
+0000503663 00000 n
+0000503728 00000 n
+0001146688 00000 n
+0000506597 00000 n
+0000506406 00000 n
+0000503907 00000 n
+0000506532 00000 n
+0000510197 00000 n
+0000509748 00000 n
+0000506711 00000 n
+0000509874 00000 n
+0000510003 00000 n
+0000510068 00000 n
+0000510132 00000 n
+0000513155 00000 n
+0000512836 00000 n
+0000510311 00000 n
+0000512962 00000 n
+0000513090 00000 n
+0000516398 00000 n
+0000515358 00000 n
+0000513269 00000 n
+0000515819 00000 n
+0000515948 00000 n
+0000515514 00000 n
+0000515668 00000 n
+0000516076 00000 n
+0000516204 00000 n
+0000516333 00000 n
+0000517919 00000 n
+0000517728 00000 n
+0000516512 00000 n
+0000517854 00000 n
+0000519479 00000 n
+0000519288 00000 n
+0000518020 00000 n
+0000519414 00000 n
+0001146813 00000 n
+0000521317 00000 n
+0000520998 00000 n
+0000519580 00000 n
+0000521124 00000 n
+0000524735 00000 n
+0000524544 00000 n
+0000521431 00000 n
+0000524670 00000 n
+0000529206 00000 n
+0000528838 00000 n
+0000524863 00000 n
+0000529141 00000 n
+0000528985 00000 n
+0000721881 00000 n
+0000533299 00000 n
+0000532918 00000 n
+0000529348 00000 n
+0000533234 00000 n
+0000533065 00000 n
+0000537534 00000 n
+0000537169 00000 n
+0000533427 00000 n
+0000537469 00000 n
+0000537316 00000 n
+0000541282 00000 n
+0000540833 00000 n
+0000537676 00000 n
+0000540959 00000 n
+0000541153 00000 n
+0000541217 00000 n
+0001146938 00000 n
+0000545583 00000 n
+0000545217 00000 n
+0000541410 00000 n
+0000545518 00000 n
+0000545364 00000 n
+0000550667 00000 n
+0000549534 00000 n
+0000545711 00000 n
+0000550602 00000 n
+0000549717 00000 n
+0000549873 00000 n
+0000550058 00000 n
+0000550232 00000 n
+0000550417 00000 n
+0000635525 00000 n
+0000554943 00000 n
+0000554752 00000 n
+0000550865 00000 n
+0000554878 00000 n
+0000558896 00000 n
+0000558705 00000 n
+0000555057 00000 n
+0000558831 00000 n
+0000562750 00000 n
+0000562430 00000 n
+0000559010 00000 n
+0000562556 00000 n
+0000562685 00000 n
+0000566514 00000 n
+0000565698 00000 n
+0000562864 00000 n
+0000566191 00000 n
+0000565854 00000 n
+0000566320 00000 n
+0000566449 00000 n
+0000566024 00000 n
+0001147063 00000 n
+0000650412 00000 n
+0000570932 00000 n
+0000570241 00000 n
+0000566671 00000 n
+0000570738 00000 n
+0000570397 00000 n
+0000570567 00000 n
+0000570867 00000 n
+0000741948 00000 n
+0000574280 00000 n
+0000573960 00000 n
+0000571060 00000 n
+0000574086 00000 n
+0000574215 00000 n
+0000577233 00000 n
+0000577042 00000 n
+0000574394 00000 n
+0000577168 00000 n
+0000581107 00000 n
+0000580787 00000 n
+0000577404 00000 n
+0000580913 00000 n
+0000584762 00000 n
+0000584571 00000 n
+0000581264 00000 n
+0000584697 00000 n
+0000589124 00000 n
+0000588312 00000 n
+0000584933 00000 n
+0000588801 00000 n
+0000588930 00000 n
+0000588468 00000 n
+0000589059 00000 n
+0000588628 00000 n
+0001147188 00000 n
+0000593286 00000 n
+0000592661 00000 n
+0000589281 00000 n
+0000592963 00000 n
+0000593092 00000 n
+0000592808 00000 n
+0000593221 00000 n
+0000596450 00000 n
+0000596130 00000 n
+0000593414 00000 n
+0000596256 00000 n
+0000596385 00000 n
+0000600387 00000 n
+0000599720 00000 n
+0000596621 00000 n
+0000600194 00000 n
+0000600323 00000 n
+0000599876 00000 n
+0000600038 00000 n
+0000603938 00000 n
+0000603169 00000 n
+0000600501 00000 n
+0000603486 00000 n
+0000603316 00000 n
+0000603680 00000 n
+0000603745 00000 n
+0000603873 00000 n
+0000607913 00000 n
+0000607539 00000 n
+0000604123 00000 n
+0000607848 00000 n
0000607686 00000 n
-0000610832 00000 n
-0000610961 00000 n
-0000611026 00000 n
-0000611091 00000 n
-0000611220 00000 n
-0000611285 00000 n
-0000611350 00000 n
-0000614945 00000 n
-0000614108 00000 n
-0000611540 00000 n
-0000614234 00000 n
-0000614363 00000 n
-0000614428 00000 n
-0000614493 00000 n
-0000614622 00000 n
-0000614751 00000 n
-0000614880 00000 n
-0000618118 00000 n
-0000617411 00000 n
-0000615155 00000 n
-0000617537 00000 n
-0000617666 00000 n
-0000617794 00000 n
-0000617923 00000 n
-0000617988 00000 n
-0000618053 00000 n
-0000622579 00000 n
-0000622002 00000 n
-0000618301 00000 n
-0000622128 00000 n
-0000622386 00000 n
-0000622451 00000 n
-0000622515 00000 n
-0000626176 00000 n
-0000625546 00000 n
-0000622704 00000 n
-0000625853 00000 n
-0000625693 00000 n
-0000626111 00000 n
-0000629951 00000 n
-0000629317 00000 n
-0000626288 00000 n
-0000629627 00000 n
-0000629756 00000 n
-0000629821 00000 n
-0000629886 00000 n
-0000629464 00000 n
-0000993319 00000 n
-0000785654 00000 n
-0000633220 00000 n
-0000632514 00000 n
-0000630063 00000 n
-0000632640 00000 n
-0000632769 00000 n
-0000632834 00000 n
-0000632899 00000 n
-0000633027 00000 n
-0000633091 00000 n
-0000633155 00000 n
-0000637089 00000 n
-0000636640 00000 n
-0000633332 00000 n
-0000636766 00000 n
-0000636895 00000 n
-0000636959 00000 n
-0000637024 00000 n
-0000638567 00000 n
-0000638247 00000 n
-0000637215 00000 n
-0000638373 00000 n
-0000804460 00000 n
-0000797176 00000 n
-0000804280 00000 n
-0000638502 00000 n
-0000640543 00000 n
-0000640095 00000 n
-0000638693 00000 n
-0000640221 00000 n
-0000640350 00000 n
-0000640479 00000 n
-0000645129 00000 n
-0000644186 00000 n
-0000640655 00000 n
-0000644549 00000 n
-0000796855 00000 n
-0000787642 00000 n
-0000796669 00000 n
-0000644333 00000 n
-0000644678 00000 n
-0000644806 00000 n
-0000644935 00000 n
-0000646171 00000 n
-0000645980 00000 n
-0000645366 00000 n
-0000646106 00000 n
-0000993444 00000 n
-0000646598 00000 n
-0000646407 00000 n
-0000646257 00000 n
-0000646533 00000 n
-0000649911 00000 n
-0000648685 00000 n
-0000646640 00000 n
-0000649202 00000 n
-0000649331 00000 n
-0000649460 00000 n
-0000649589 00000 n
-0000649718 00000 n
-0000649847 00000 n
-0000648841 00000 n
-0000649013 00000 n
-0000650365 00000 n
-0000650174 00000 n
-0000650024 00000 n
-0000650300 00000 n
-0000653609 00000 n
-0000653031 00000 n
-0000650407 00000 n
-0000653157 00000 n
-0000653286 00000 n
-0000653415 00000 n
-0000653544 00000 n
-0000657804 00000 n
-0000656586 00000 n
-0000653695 00000 n
-0000657096 00000 n
-0000657225 00000 n
-0000657483 00000 n
-0000656742 00000 n
-0000656921 00000 n
-0000657676 00000 n
-0000657740 00000 n
-0000664691 00000 n
-0000660863 00000 n
-0000657957 00000 n
-0000660989 00000 n
-0000661054 00000 n
-0000661119 00000 n
-0000661184 00000 n
-0000661249 00000 n
-0000661314 00000 n
-0000661379 00000 n
-0000661444 00000 n
-0000661509 00000 n
-0000661574 00000 n
-0000661704 00000 n
-0000661769 00000 n
-0000661834 00000 n
-0000661899 00000 n
-0000661964 00000 n
-0000662029 00000 n
-0000662094 00000 n
-0000662159 00000 n
-0000662224 00000 n
-0000662289 00000 n
-0000662354 00000 n
-0000662419 00000 n
-0000662484 00000 n
-0000662549 00000 n
-0000662614 00000 n
-0000662679 00000 n
-0000662744 00000 n
-0000662809 00000 n
-0000662874 00000 n
-0000662939 00000 n
-0000663004 00000 n
-0000663069 00000 n
-0000663134 00000 n
-0000663199 00000 n
-0000663263 00000 n
-0000663328 00000 n
-0000663393 00000 n
-0000663458 00000 n
-0000663523 00000 n
-0000663588 00000 n
-0000663653 00000 n
-0000663718 00000 n
-0000663783 00000 n
-0000663848 00000 n
-0000663913 00000 n
-0000663978 00000 n
-0000664043 00000 n
-0000664108 00000 n
-0000664173 00000 n
-0000664238 00000 n
-0000664303 00000 n
-0000664368 00000 n
-0000664433 00000 n
-0000664498 00000 n
-0000664563 00000 n
-0000664627 00000 n
-0000993569 00000 n
-0000671337 00000 n
-0000667773 00000 n
-0000664803 00000 n
-0000667899 00000 n
-0000667964 00000 n
-0000668029 00000 n
-0000668094 00000 n
-0000668159 00000 n
-0000668224 00000 n
-0000668289 00000 n
-0000668354 00000 n
-0000668419 00000 n
-0000668484 00000 n
-0000668549 00000 n
-0000668614 00000 n
-0000668678 00000 n
-0000668743 00000 n
-0000668808 00000 n
-0000668873 00000 n
-0000668938 00000 n
-0000669003 00000 n
-0000669068 00000 n
-0000669133 00000 n
-0000669198 00000 n
-0000669263 00000 n
-0000669328 00000 n
-0000669393 00000 n
-0000669457 00000 n
-0000669522 00000 n
-0000669587 00000 n
-0000669652 00000 n
-0000669717 00000 n
-0000669782 00000 n
-0000669847 00000 n
-0000669912 00000 n
-0000669977 00000 n
-0000670042 00000 n
-0000670107 00000 n
-0000670172 00000 n
-0000670237 00000 n
-0000670302 00000 n
-0000670367 00000 n
-0000670432 00000 n
-0000670496 00000 n
-0000670560 00000 n
-0000670624 00000 n
-0000670689 00000 n
-0000670754 00000 n
-0000670819 00000 n
-0000670884 00000 n
-0000670949 00000 n
-0000671014 00000 n
-0000671079 00000 n
-0000671144 00000 n
-0000671209 00000 n
-0000671273 00000 n
-0000677513 00000 n
-0000674075 00000 n
-0000671449 00000 n
-0000674201 00000 n
-0000674266 00000 n
-0000674331 00000 n
-0000674396 00000 n
-0000674461 00000 n
-0000674526 00000 n
-0000674591 00000 n
-0000674656 00000 n
-0000674721 00000 n
-0000674786 00000 n
-0000674851 00000 n
-0000674916 00000 n
-0000674981 00000 n
-0000675046 00000 n
-0000675111 00000 n
-0000675176 00000 n
-0000675241 00000 n
-0000675306 00000 n
-0000675371 00000 n
-0000675436 00000 n
-0000675501 00000 n
-0000675566 00000 n
-0000675631 00000 n
-0000675696 00000 n
-0000675761 00000 n
-0000675826 00000 n
-0000675891 00000 n
-0000675956 00000 n
-0000676021 00000 n
-0000676086 00000 n
-0000676151 00000 n
-0000676216 00000 n
-0000676281 00000 n
-0000676346 00000 n
-0000676410 00000 n
-0000676475 00000 n
-0000676540 00000 n
-0000676605 00000 n
-0000676670 00000 n
-0000676735 00000 n
-0000676800 00000 n
-0000676865 00000 n
-0000676930 00000 n
-0000676995 00000 n
-0000677060 00000 n
-0000677125 00000 n
-0000677190 00000 n
-0000677255 00000 n
-0000677320 00000 n
-0000677385 00000 n
-0000677449 00000 n
-0000682091 00000 n
-0000679827 00000 n
-0000677625 00000 n
-0000679953 00000 n
-0000680018 00000 n
-0000680083 00000 n
-0000680148 00000 n
-0000680213 00000 n
-0000680278 00000 n
-0000680343 00000 n
-0000680408 00000 n
-0000680473 00000 n
-0000680538 00000 n
-0000680603 00000 n
-0000680668 00000 n
-0000680733 00000 n
-0000680798 00000 n
-0000680860 00000 n
-0000680924 00000 n
-0000680989 00000 n
-0000681053 00000 n
-0000681118 00000 n
-0000681183 00000 n
-0000681248 00000 n
-0000681313 00000 n
-0000681378 00000 n
-0000681443 00000 n
-0000681508 00000 n
-0000681637 00000 n
-0000681766 00000 n
-0000681831 00000 n
-0000681896 00000 n
-0000681961 00000 n
-0000682026 00000 n
-0000684886 00000 n
-0000684242 00000 n
-0000682216 00000 n
-0000684368 00000 n
-0000684497 00000 n
-0000684626 00000 n
-0000684691 00000 n
-0000684756 00000 n
-0000684821 00000 n
-0000689225 00000 n
-0000688905 00000 n
-0000684999 00000 n
-0000689031 00000 n
-0000689096 00000 n
-0000689161 00000 n
-0000692825 00000 n
-0000692570 00000 n
-0000689378 00000 n
-0000692696 00000 n
-0000692761 00000 n
-0000993694 00000 n
-0000696073 00000 n
-0000695882 00000 n
-0000692964 00000 n
-0000696008 00000 n
-0000699802 00000 n
-0000699546 00000 n
-0000696199 00000 n
-0000699672 00000 n
-0000699737 00000 n
-0000702643 00000 n
-0000701935 00000 n
-0000699941 00000 n
-0000702061 00000 n
-0000702126 00000 n
-0000702191 00000 n
-0000702256 00000 n
-0000702321 00000 n
-0000702450 00000 n
-0000702515 00000 n
-0000702579 00000 n
-0000707309 00000 n
-0000707053 00000 n
-0000702782 00000 n
-0000707179 00000 n
-0000707244 00000 n
-0000710261 00000 n
-0000709488 00000 n
-0000707435 00000 n
-0000709614 00000 n
-0000709679 00000 n
-0000709744 00000 n
-0000709809 00000 n
-0000709938 00000 n
-0000710003 00000 n
-0000710066 00000 n
-0000710131 00000 n
-0000710196 00000 n
-0000712863 00000 n
-0000712154 00000 n
-0000710414 00000 n
-0000712280 00000 n
-0000712345 00000 n
-0000712410 00000 n
-0000712475 00000 n
-0000712540 00000 n
-0000712605 00000 n
-0000712734 00000 n
-0000712799 00000 n
-0000993819 00000 n
-0000716107 00000 n
-0000715721 00000 n
-0000713015 00000 n
-0000715847 00000 n
-0000715912 00000 n
-0000715977 00000 n
-0000716042 00000 n
-0000719241 00000 n
-0000718468 00000 n
-0000716247 00000 n
-0000718594 00000 n
-0000718659 00000 n
-0000718724 00000 n
-0000718788 00000 n
-0000718916 00000 n
-0000718981 00000 n
-0000719046 00000 n
-0000719111 00000 n
-0000719176 00000 n
-0000722628 00000 n
-0000722437 00000 n
-0000719407 00000 n
-0000722563 00000 n
-0000725737 00000 n
-0000725027 00000 n
-0000722754 00000 n
-0000725153 00000 n
-0000725218 00000 n
-0000725283 00000 n
-0000725348 00000 n
-0000725413 00000 n
-0000725542 00000 n
-0000725607 00000 n
-0000725672 00000 n
-0000729289 00000 n
-0000728968 00000 n
-0000725902 00000 n
-0000729094 00000 n
-0000729159 00000 n
-0000729224 00000 n
-0000732735 00000 n
-0000732544 00000 n
-0000729415 00000 n
-0000732670 00000 n
-0000993944 00000 n
-0000735807 00000 n
-0000735488 00000 n
-0000732861 00000 n
-0000735614 00000 n
-0000735679 00000 n
-0000735743 00000 n
-0000738378 00000 n
-0000737540 00000 n
-0000735960 00000 n
-0000737666 00000 n
-0000737731 00000 n
-0000737796 00000 n
-0000737925 00000 n
-0000737990 00000 n
-0000738055 00000 n
-0000738120 00000 n
-0000738185 00000 n
-0000738249 00000 n
-0000738314 00000 n
-0000741345 00000 n
-0000740701 00000 n
-0000738531 00000 n
-0000740827 00000 n
-0000740892 00000 n
-0000741021 00000 n
-0000741086 00000 n
-0000741150 00000 n
-0000741215 00000 n
-0000741280 00000 n
-0000744817 00000 n
-0000744626 00000 n
-0000741485 00000 n
-0000744752 00000 n
-0000747625 00000 n
-0000746851 00000 n
-0000744943 00000 n
-0000746977 00000 n
-0000747042 00000 n
-0000747107 00000 n
-0000747172 00000 n
-0000747301 00000 n
-0000747366 00000 n
-0000747431 00000 n
-0000747495 00000 n
-0000747560 00000 n
-0000751027 00000 n
-0000750836 00000 n
-0000747778 00000 n
-0000750962 00000 n
-0000994069 00000 n
-0000754063 00000 n
-0000753743 00000 n
-0000751238 00000 n
-0000753869 00000 n
-0000753934 00000 n
-0000753999 00000 n
-0000757373 00000 n
-0000756664 00000 n
-0000754287 00000 n
-0000756790 00000 n
-0000756855 00000 n
-0000756920 00000 n
-0000756984 00000 n
-0000757113 00000 n
-0000757178 00000 n
-0000757243 00000 n
-0000757308 00000 n
-0000761790 00000 n
-0000761534 00000 n
-0000757525 00000 n
-0000761660 00000 n
-0000761725 00000 n
-0000765404 00000 n
-0000765213 00000 n
-0000761916 00000 n
-0000765339 00000 n
-0000768186 00000 n
-0000767802 00000 n
-0000765530 00000 n
-0000767928 00000 n
-0000767993 00000 n
-0000768058 00000 n
-0000768122 00000 n
-0000771670 00000 n
-0000771025 00000 n
-0000768338 00000 n
-0000771151 00000 n
-0000771216 00000 n
-0000771345 00000 n
-0000771410 00000 n
-0000771475 00000 n
-0000771540 00000 n
-0000771605 00000 n
-0000994194 00000 n
-0000774735 00000 n
+0000612763 00000 n
+0000612086 00000 n
+0000608084 00000 n
+0000612570 00000 n
+0000612242 00000 n
+0000612699 00000 n
+0000612405 00000 n
+0001147313 00000 n
+0000718117 00000 n
+0000648136 00000 n
+0000616110 00000 n
+0000615790 00000 n
+0000612891 00000 n
+0000615916 00000 n
+0000616045 00000 n
+0000619871 00000 n
+0000619551 00000 n
+0000616237 00000 n
+0000619677 00000 n
+0000624199 00000 n
+0000623707 00000 n
+0000620028 00000 n
+0000624005 00000 n
+0000624134 00000 n
+0000623854 00000 n
+0000628499 00000 n
+0000628179 00000 n
+0000624327 00000 n
+0000628305 00000 n
+0000628434 00000 n
+0000631067 00000 n
+0000630747 00000 n
+0000628640 00000 n
+0000630873 00000 n
+0000631002 00000 n
+0000635590 00000 n
+0000635100 00000 n
+0000631181 00000 n
+0000635396 00000 n
+0000635247 00000 n
+0001147438 00000 n
+0000639531 00000 n
+0000638772 00000 n
+0000635704 00000 n
+0000639081 00000 n
+0000638919 00000 n
+0000639210 00000 n
+0000639339 00000 n
+0000639467 00000 n
+0000643946 00000 n
+0000643194 00000 n
+0000639645 00000 n
+0000643495 00000 n
+0000643624 00000 n
+0000643341 00000 n
+0000643752 00000 n
+0000648330 00000 n
+0000647881 00000 n
+0000644074 00000 n
+0000648007 00000 n
+0000648265 00000 n
+0000650477 00000 n
+0000650157 00000 n
+0000648472 00000 n
+0000650283 00000 n
+0000651970 00000 n
+0000651779 00000 n
+0000650591 00000 n
+0000651905 00000 n
+0000653427 00000 n
+0000653236 00000 n
+0000652071 00000 n
+0000653362 00000 n
+0001147563 00000 n
+0000656238 00000 n
+0000655661 00000 n
+0000653528 00000 n
+0000655787 00000 n
+0000655916 00000 n
+0000656043 00000 n
+0000656108 00000 n
+0000656173 00000 n
+0000659903 00000 n
+0000659712 00000 n
+0000656352 00000 n
+0000659838 00000 n
+0000665159 00000 n
+0000663316 00000 n
+0000660017 00000 n
+0000664836 00000 n
+0000663526 00000 n
+0000664965 00000 n
+0000665094 00000 n
+0000663694 00000 n
+0000663856 00000 n
+0000664018 00000 n
+0000664180 00000 n
+0000664342 00000 n
+0000664504 00000 n
+0000664675 00000 n
+0000937440 00000 n
+0000670438 00000 n
+0000668518 00000 n
+0000665273 00000 n
+0000670373 00000 n
+0000668746 00000 n
+0000668909 00000 n
+0000669072 00000 n
+0000669235 00000 n
+0000669397 00000 n
+0000669560 00000 n
+0000669722 00000 n
+0000669885 00000 n
+0000670044 00000 n
+0000670205 00000 n
+0000675059 00000 n
+0000673487 00000 n
+0000670566 00000 n
+0000674994 00000 n
+0000673697 00000 n
+0000673866 00000 n
+0000674028 00000 n
+0000674190 00000 n
+0000674352 00000 n
+0000674514 00000 n
+0000674677 00000 n
+0000674831 00000 n
+0000681361 00000 n
+0000678470 00000 n
+0000675187 00000 n
+0000681296 00000 n
+0000678752 00000 n
+0000678904 00000 n
+0000679058 00000 n
+0000679209 00000 n
+0000679363 00000 n
+0000679525 00000 n
+0000679687 00000 n
+0000679848 00000 n
+0000680010 00000 n
+0000680172 00000 n
+0000680334 00000 n
+0000680496 00000 n
+0000680649 00000 n
+0000680812 00000 n
+0000680967 00000 n
+0000681131 00000 n
+0001147688 00000 n
+0000685786 00000 n
+0000684948 00000 n
+0000681489 00000 n
+0000685592 00000 n
+0000685113 00000 n
+0000685276 00000 n
+0000685430 00000 n
+0000688940 00000 n
+0000688620 00000 n
+0000685928 00000 n
+0000688746 00000 n
+0000688811 00000 n
+0000688875 00000 n
+0000693156 00000 n
+0000692086 00000 n
+0000689111 00000 n
+0000692574 00000 n
+0000692703 00000 n
+0000692961 00000 n
+0000692242 00000 n
+0000692412 00000 n
+0000693026 00000 n
+0000693091 00000 n
+0000696607 00000 n
+0000696287 00000 n
+0000693284 00000 n
+0000696413 00000 n
+0000696478 00000 n
+0000696542 00000 n
+0000700096 00000 n
+0000699775 00000 n
+0000696708 00000 n
+0000699901 00000 n
+0000699966 00000 n
+0000700031 00000 n
+0000704017 00000 n
+0000703308 00000 n
+0000700211 00000 n
+0000703434 00000 n
+0000703563 00000 n
+0000703628 00000 n
+0000703693 00000 n
+0000703758 00000 n
+0000703823 00000 n
+0000703952 00000 n
+0001147813 00000 n
+0000708258 00000 n
+0000707421 00000 n
+0000704131 00000 n
+0000707547 00000 n
+0000707612 00000 n
+0000707677 00000 n
+0000707806 00000 n
+0000707871 00000 n
+0000707936 00000 n
+0000708065 00000 n
+0000708130 00000 n
+0000708194 00000 n
+0000711285 00000 n
+0000710583 00000 n
+0000708386 00000 n
+0000710709 00000 n
+0000710836 00000 n
+0000710963 00000 n
+0000711092 00000 n
+0000711220 00000 n
+0000713995 00000 n
+0000713418 00000 n
+0000711484 00000 n
+0000713544 00000 n
+0000713673 00000 n
+0000713802 00000 n
+0000713867 00000 n
+0000713931 00000 n
+0000718182 00000 n
+0000717862 00000 n
+0000714180 00000 n
+0000717988 00000 n
+0000721946 00000 n
+0000721186 00000 n
+0000718309 00000 n
+0000721493 00000 n
+0000721622 00000 n
+0000721687 00000 n
+0000721752 00000 n
+0000721333 00000 n
+0000725637 00000 n
+0000725058 00000 n
+0000722060 00000 n
+0000725184 00000 n
+0000725313 00000 n
+0000725442 00000 n
+0000725507 00000 n
+0000725572 00000 n
+0001147938 00000 n
+0000729251 00000 n
+0000728356 00000 n
+0000725751 00000 n
+0000728668 00000 n
+0000728503 00000 n
+0000728797 00000 n
+0000728862 00000 n
+0000728927 00000 n
+0000729056 00000 n
+0000729121 00000 n
+0000729186 00000 n
+0000937407 00000 n
+0000733408 00000 n
+0000732958 00000 n
+0000729365 00000 n
+0000733084 00000 n
+0000733213 00000 n
+0000733278 00000 n
+0000733343 00000 n
+0000735299 00000 n
+0000734979 00000 n
+0000733536 00000 n
+0000735105 00000 n
+0000956213 00000 n
+0000948929 00000 n
+0000956033 00000 n
+0000735234 00000 n
+0000735782 00000 n
+0000735591 00000 n
+0000735441 00000 n
+0000735717 00000 n
+0000737592 00000 n
+0000737143 00000 n
+0000735824 00000 n
+0000737269 00000 n
+0000737398 00000 n
+0000737527 00000 n
+0000742013 00000 n
+0000741070 00000 n
+0000737706 00000 n
+0000741433 00000 n
+0000948608 00000 n
+0000939395 00000 n
+0000948422 00000 n
+0000741217 00000 n
+0000741562 00000 n
+0000741690 00000 n
+0000741819 00000 n
+0001148063 00000 n
+0000743372 00000 n
+0000743181 00000 n
+0000742254 00000 n
+0000743307 00000 n
+0000743813 00000 n
+0000743622 00000 n
+0000743472 00000 n
+0000743748 00000 n
+0000747127 00000 n
+0000745901 00000 n
+0000743855 00000 n
+0000746418 00000 n
+0000746547 00000 n
+0000746676 00000 n
+0000746805 00000 n
+0000746934 00000 n
+0000747063 00000 n
+0000746057 00000 n
+0000746229 00000 n
+0000747582 00000 n
+0000747391 00000 n
+0000747241 00000 n
+0000747517 00000 n
+0000750827 00000 n
+0000750249 00000 n
+0000747624 00000 n
+0000750375 00000 n
+0000750504 00000 n
+0000750633 00000 n
+0000750762 00000 n
+0000755024 00000 n
+0000753805 00000 n
+0000750913 00000 n
+0000754315 00000 n
+0000754444 00000 n
+0000754702 00000 n
+0000753961 00000 n
+0000754140 00000 n
+0000754896 00000 n
+0000754960 00000 n
+0001148188 00000 n
+0000761915 00000 n
+0000758087 00000 n
+0000755180 00000 n
+0000758213 00000 n
+0000758278 00000 n
+0000758343 00000 n
+0000758408 00000 n
+0000758473 00000 n
+0000758538 00000 n
+0000758603 00000 n
+0000758668 00000 n
+0000758733 00000 n
+0000758798 00000 n
+0000758928 00000 n
+0000758993 00000 n
+0000759058 00000 n
+0000759123 00000 n
+0000759188 00000 n
+0000759253 00000 n
+0000759318 00000 n
+0000759383 00000 n
+0000759448 00000 n
+0000759513 00000 n
+0000759578 00000 n
+0000759643 00000 n
+0000759708 00000 n
+0000759773 00000 n
+0000759838 00000 n
+0000759903 00000 n
+0000759968 00000 n
+0000760033 00000 n
+0000760098 00000 n
+0000760163 00000 n
+0000760228 00000 n
+0000760293 00000 n
+0000760358 00000 n
+0000760423 00000 n
+0000760487 00000 n
+0000760552 00000 n
+0000760617 00000 n
+0000760682 00000 n
+0000760747 00000 n
+0000760812 00000 n
+0000760877 00000 n
+0000760942 00000 n
+0000761007 00000 n
+0000761072 00000 n
+0000761137 00000 n
+0000761202 00000 n
+0000761267 00000 n
+0000761332 00000 n
+0000761397 00000 n
+0000761462 00000 n
+0000761527 00000 n
+0000761592 00000 n
+0000761657 00000 n
+0000761722 00000 n
+0000761787 00000 n
+0000761851 00000 n
+0000768563 00000 n
+0000764999 00000 n
+0000762029 00000 n
+0000765125 00000 n
+0000765190 00000 n
+0000765255 00000 n
+0000765320 00000 n
+0000765385 00000 n
+0000765450 00000 n
+0000765515 00000 n
+0000765580 00000 n
+0000765645 00000 n
+0000765710 00000 n
+0000765775 00000 n
+0000765840 00000 n
+0000765904 00000 n
+0000765969 00000 n
+0000766034 00000 n
+0000766099 00000 n
+0000766164 00000 n
+0000766229 00000 n
+0000766294 00000 n
+0000766359 00000 n
+0000766424 00000 n
+0000766489 00000 n
+0000766554 00000 n
+0000766619 00000 n
+0000766683 00000 n
+0000766748 00000 n
+0000766813 00000 n
+0000766878 00000 n
+0000766943 00000 n
+0000767008 00000 n
+0000767073 00000 n
+0000767138 00000 n
+0000767203 00000 n
+0000767268 00000 n
+0000767333 00000 n
+0000767398 00000 n
+0000767463 00000 n
+0000767528 00000 n
+0000767593 00000 n
+0000767658 00000 n
+0000767722 00000 n
+0000767786 00000 n
+0000767850 00000 n
+0000767915 00000 n
+0000767980 00000 n
+0000768045 00000 n
+0000768110 00000 n
+0000768175 00000 n
+0000768240 00000 n
+0000768305 00000 n
+0000768370 00000 n
+0000768435 00000 n
+0000768499 00000 n
+0000774738 00000 n
+0000771300 00000 n
+0000768677 00000 n
+0000771426 00000 n
+0000771491 00000 n
+0000771556 00000 n
+0000771621 00000 n
+0000771686 00000 n
+0000771751 00000 n
+0000771816 00000 n
+0000771881 00000 n
+0000771946 00000 n
+0000772011 00000 n
+0000772076 00000 n
+0000772141 00000 n
+0000772206 00000 n
+0000772271 00000 n
+0000772336 00000 n
+0000772401 00000 n
+0000772466 00000 n
+0000772531 00000 n
+0000772596 00000 n
+0000772661 00000 n
+0000772726 00000 n
+0000772791 00000 n
+0000772856 00000 n
+0000772921 00000 n
+0000772986 00000 n
+0000773051 00000 n
+0000773116 00000 n
+0000773181 00000 n
+0000773246 00000 n
+0000773311 00000 n
+0000773376 00000 n
+0000773441 00000 n
+0000773506 00000 n
+0000773571 00000 n
+0000773635 00000 n
+0000773700 00000 n
+0000773765 00000 n
+0000773830 00000 n
+0000773895 00000 n
+0000773960 00000 n
0000774025 00000 n
-0000771810 00000 n
-0000774151 00000 n
-0000774216 00000 n
-0000774281 00000 n
-0000774346 00000 n
-0000774475 00000 n
-0000774540 00000 n
-0000774605 00000 n
-0000774670 00000 n
-0000777831 00000 n
-0000777575 00000 n
-0000774901 00000 n
-0000777701 00000 n
-0000777766 00000 n
-0000780973 00000 n
-0000780264 00000 n
-0000777957 00000 n
-0000780390 00000 n
-0000780455 00000 n
-0000780520 00000 n
-0000780585 00000 n
-0000780713 00000 n
-0000780778 00000 n
-0000780843 00000 n
-0000780908 00000 n
-0000784563 00000 n
-0000784242 00000 n
-0000781125 00000 n
-0000784368 00000 n
-0000784433 00000 n
-0000784498 00000 n
-0000785542 00000 n
-0000785221 00000 n
-0000784702 00000 n
-0000785347 00000 n
-0000785412 00000 n
-0000785477 00000 n
-0000785753 00000 n
-0000797097 00000 n
-0000804686 00000 n
-0000806986 00000 n
-0000806955 00000 n
-0000810672 00000 n
-0000820112 00000 n
-0000830619 00000 n
-0000841105 00000 n
-0000853729 00000 n
-0000872794 00000 n
-0000893681 00000 n
-0000915824 00000 n
-0000933719 00000 n
-0000936550 00000 n
-0000936320 00000 n
-0000963857 00000 n
-0000990968 00000 n
-0000994319 00000 n
-0000994443 00000 n
-0000994569 00000 n
-0000994695 00000 n
-0000994812 00000 n
-0000994904 00000 n
-0001011519 00000 n
-0001030788 00000 n
-0001030829 00000 n
-0001030869 00000 n
-0001031003 00000 n
+0000774090 00000 n
+0000774155 00000 n
+0000774220 00000 n
+0000774285 00000 n
+0000774350 00000 n
+0000774415 00000 n
+0000774480 00000 n
+0000774545 00000 n
+0000774610 00000 n
+0000774674 00000 n
+0000780257 00000 n
+0000777861 00000 n
+0000774852 00000 n
+0000777987 00000 n
+0000778052 00000 n
+0000778117 00000 n
+0000778182 00000 n
+0000778247 00000 n
+0000778312 00000 n
+0000778377 00000 n
+0000778442 00000 n
+0000778507 00000 n
+0000778572 00000 n
+0000778637 00000 n
+0000778702 00000 n
+0000778767 00000 n
+0000778831 00000 n
+0000778896 00000 n
+0000778961 00000 n
+0000779026 00000 n
+0000779091 00000 n
+0000779156 00000 n
+0000779221 00000 n
+0000779286 00000 n
+0000779351 00000 n
+0000779416 00000 n
+0000779481 00000 n
+0000779546 00000 n
+0000779674 00000 n
+0000779803 00000 n
+0000779868 00000 n
+0000779933 00000 n
+0000779998 00000 n
+0000780063 00000 n
+0000780192 00000 n
+0000783466 00000 n
+0000782759 00000 n
+0000780384 00000 n
+0000782885 00000 n
+0000783014 00000 n
+0000783143 00000 n
+0000783272 00000 n
+0000783401 00000 n
+0000786958 00000 n
+0000786201 00000 n
+0000783593 00000 n
+0000786508 00000 n
+0000786637 00000 n
+0000786348 00000 n
+0000786765 00000 n
+0000786893 00000 n
+0001148313 00000 n
+0000790202 00000 n
+0000789624 00000 n
+0000787085 00000 n
+0000789750 00000 n
+0000789879 00000 n
+0000790008 00000 n
+0000790137 00000 n
+0000793110 00000 n
+0000792790 00000 n
+0000790316 00000 n
+0000792916 00000 n
+0000793045 00000 n
+0000795700 00000 n
+0000795251 00000 n
+0000793280 00000 n
+0000795377 00000 n
+0000795506 00000 n
+0000795635 00000 n
+0000796141 00000 n
+0000795950 00000 n
+0000795800 00000 n
+0000796076 00000 n
+0000798853 00000 n
+0000798209 00000 n
+0000796183 00000 n
+0000798335 00000 n
+0000798464 00000 n
+0000798593 00000 n
+0000798658 00000 n
+0000798723 00000 n
+0000798788 00000 n
+0000803193 00000 n
+0000802873 00000 n
+0000798967 00000 n
+0000802999 00000 n
+0000803064 00000 n
+0000803129 00000 n
+0001148438 00000 n
+0000806796 00000 n
+0000806541 00000 n
+0000803349 00000 n
+0000806667 00000 n
+0000806732 00000 n
+0000810047 00000 n
+0000809856 00000 n
+0000806938 00000 n
+0000809982 00000 n
+0000813767 00000 n
+0000813511 00000 n
+0000810175 00000 n
+0000813637 00000 n
+0000813702 00000 n
+0000816752 00000 n
+0000816044 00000 n
+0000813909 00000 n
+0000816170 00000 n
+0000816235 00000 n
+0000816300 00000 n
+0000816365 00000 n
+0000816430 00000 n
+0000816559 00000 n
+0000816624 00000 n
+0000816688 00000 n
+0000821421 00000 n
+0000821165 00000 n
+0000816894 00000 n
+0000821291 00000 n
+0000821356 00000 n
+0000824431 00000 n
+0000823658 00000 n
+0000821549 00000 n
+0000823784 00000 n
+0000823849 00000 n
+0000823914 00000 n
+0000823979 00000 n
+0000824108 00000 n
+0000824173 00000 n
+0000824236 00000 n
+0000824301 00000 n
+0000824366 00000 n
+0001148563 00000 n
+0000827345 00000 n
+0000826830 00000 n
+0000824587 00000 n
+0000826956 00000 n
+0000827021 00000 n
+0000827086 00000 n
+0000827151 00000 n
+0000827216 00000 n
+0000827281 00000 n
+0000830708 00000 n
+0000830128 00000 n
+0000827501 00000 n
+0000830254 00000 n
+0000830383 00000 n
+0000830448 00000 n
+0000830513 00000 n
+0000830578 00000 n
+0000830643 00000 n
+0000834160 00000 n
+0000833904 00000 n
+0000830850 00000 n
+0000834030 00000 n
+0000834095 00000 n
+0000837112 00000 n
+0000836468 00000 n
+0000834288 00000 n
+0000836594 00000 n
+0000836659 00000 n
+0000836724 00000 n
+0000836789 00000 n
+0000836983 00000 n
+0000837048 00000 n
+0000840705 00000 n
+0000840384 00000 n
+0000837281 00000 n
+0000840510 00000 n
+0000840575 00000 n
+0000840640 00000 n
+0000844296 00000 n
+0000844105 00000 n
+0000840833 00000 n
+0000844231 00000 n
+0001148688 00000 n
+0000847762 00000 n
+0000847441 00000 n
+0000844424 00000 n
+0000847567 00000 n
+0000847632 00000 n
+0000847697 00000 n
+0000850416 00000 n
+0000849707 00000 n
+0000847903 00000 n
+0000849833 00000 n
+0000849898 00000 n
+0000849963 00000 n
+0000850028 00000 n
+0000850157 00000 n
+0000850222 00000 n
+0000850287 00000 n
+0000850352 00000 n
+0000853441 00000 n
+0000852732 00000 n
+0000850572 00000 n
+0000852858 00000 n
+0000852923 00000 n
+0000852987 00000 n
+0000853052 00000 n
+0000853246 00000 n
+0000853311 00000 n
+0000853376 00000 n
+0000856922 00000 n
+0000856601 00000 n
+0000853597 00000 n
+0000856727 00000 n
+0000856792 00000 n
+0000856857 00000 n
+0000860091 00000 n
+0000859381 00000 n
+0000857036 00000 n
+0000859507 00000 n
+0000859572 00000 n
+0000859637 00000 n
+0000859702 00000 n
+0000859831 00000 n
+0000859896 00000 n
+0000859961 00000 n
+0000860026 00000 n
+0000863741 00000 n
+0000863485 00000 n
+0000860247 00000 n
+0000863611 00000 n
+0000863676 00000 n
+0001148813 00000 n
+0000867398 00000 n
+0000867207 00000 n
+0000863883 00000 n
+0000867333 00000 n
+0000870723 00000 n
+0000870532 00000 n
+0000867526 00000 n
+0000870658 00000 n
+0000873552 00000 n
+0000872845 00000 n
+0000870865 00000 n
+0000872971 00000 n
+0000873036 00000 n
+0000873101 00000 n
+0000873166 00000 n
+0000873295 00000 n
+0000873358 00000 n
+0000873423 00000 n
+0000873488 00000 n
+0000876509 00000 n
+0000875799 00000 n
+0000873708 00000 n
+0000875925 00000 n
+0000875990 00000 n
+0000876055 00000 n
+0000876120 00000 n
+0000876185 00000 n
+0000876314 00000 n
+0000876379 00000 n
+0000876444 00000 n
+0000879808 00000 n
+0000879487 00000 n
+0000876665 00000 n
+0000879613 00000 n
+0000879678 00000 n
+0000879743 00000 n
+0000883039 00000 n
+0000882784 00000 n
+0000879950 00000 n
+0000882910 00000 n
+0000882975 00000 n
+0001148938 00000 n
+0000886134 00000 n
+0000885424 00000 n
+0000883167 00000 n
+0000885550 00000 n
+0000885615 00000 n
+0000885680 00000 n
+0000885809 00000 n
+0000885874 00000 n
+0000885939 00000 n
+0000886004 00000 n
+0000886069 00000 n
+0000889435 00000 n
+0000889244 00000 n
+0000886290 00000 n
+0000889370 00000 n
+0000892497 00000 n
+0000892112 00000 n
+0000889648 00000 n
+0000892238 00000 n
+0000892303 00000 n
+0000892368 00000 n
+0000892433 00000 n
+0000895198 00000 n
+0000894230 00000 n
+0000892738 00000 n
+0000894356 00000 n
+0000894421 00000 n
+0000894486 00000 n
+0000894615 00000 n
+0000894680 00000 n
+0000894745 00000 n
+0000894810 00000 n
+0000894875 00000 n
+0000894940 00000 n
+0000895069 00000 n
+0000895134 00000 n
+0000899701 00000 n
+0000899380 00000 n
+0000895340 00000 n
+0000899506 00000 n
+0000899571 00000 n
+0000899636 00000 n
+0000903445 00000 n
+0000903189 00000 n
+0000899829 00000 n
+0000903315 00000 n
+0000903380 00000 n
+0001149063 00000 n
+0000906877 00000 n
+0000906621 00000 n
+0000903573 00000 n
+0000906747 00000 n
+0000906812 00000 n
+0000909456 00000 n
+0000908878 00000 n
+0000907005 00000 n
+0000909004 00000 n
+0000909069 00000 n
+0000909134 00000 n
+0000909198 00000 n
+0000909327 00000 n
+0000909392 00000 n
+0000913457 00000 n
+0000913006 00000 n
+0000909611 00000 n
+0000913132 00000 n
+0000913197 00000 n
+0000913262 00000 n
+0000913327 00000 n
+0000913392 00000 n
+0000916787 00000 n
+0000916142 00000 n
+0000913599 00000 n
+0000916268 00000 n
+0000916333 00000 n
+0000916398 00000 n
+0000916527 00000 n
+0000916592 00000 n
+0000916657 00000 n
+0000916722 00000 n
+0000919348 00000 n
+0000919092 00000 n
+0000916943 00000 n
+0000919218 00000 n
+0000919283 00000 n
+0000922833 00000 n
+0000922059 00000 n
+0000919490 00000 n
+0000922185 00000 n
+0000922250 00000 n
+0000922315 00000 n
+0000922380 00000 n
+0000922508 00000 n
+0000922573 00000 n
+0000922638 00000 n
+0000922703 00000 n
+0000922768 00000 n
+0001149188 00000 n
+0000925908 00000 n
+0000925329 00000 n
+0000922989 00000 n
+0000925455 00000 n
+0000925520 00000 n
+0000925585 00000 n
+0000925650 00000 n
+0000925779 00000 n
+0000925844 00000 n
+0000929734 00000 n
+0000929286 00000 n
+0000926064 00000 n
+0000929412 00000 n
+0000929477 00000 n
+0000929542 00000 n
+0000929607 00000 n
+0000929671 00000 n
+0000931972 00000 n
+0000930942 00000 n
+0000929890 00000 n
+0000931068 00000 n
+0000931133 00000 n
+0000931262 00000 n
+0000931327 00000 n
+0000931392 00000 n
+0000931456 00000 n
+0000931521 00000 n
+0000931586 00000 n
+0000931715 00000 n
+0000931780 00000 n
+0000931845 00000 n
+0000931910 00000 n
+0000934986 00000 n
+0000934213 00000 n
+0000932114 00000 n
+0000934339 00000 n
+0000934404 00000 n
+0000934469 00000 n
+0000934534 00000 n
+0000934663 00000 n
+0000934727 00000 n
+0000934792 00000 n
+0000934857 00000 n
+0000934921 00000 n
+0000937265 00000 n
+0000936426 00000 n
+0000935128 00000 n
+0000936552 00000 n
+0000936617 00000 n
+0000936682 00000 n
+0000936810 00000 n
+0000936875 00000 n
+0000936940 00000 n
+0000937005 00000 n
+0000937070 00000 n
+0000937135 00000 n
+0000937200 00000 n
+0000937506 00000 n
+0000948850 00000 n
+0000956439 00000 n
+0000958738 00000 n
+0000958707 00000 n
+0000962423 00000 n
+0000971863 00000 n
+0000982598 00000 n
+0000994293 00000 n
+0001007010 00000 n
+0001026244 00000 n
+0001047140 00000 n
+0001069288 00000 n
+0001087544 00000 n
+0001090391 00000 n
+0001090161 00000 n
+0001117809 00000 n
+0001145075 00000 n
+0001149313 00000 n
+0001149438 00000 n
+0001149564 00000 n
+0001149690 00000 n
+0001149816 00000 n
+0001149942 00000 n
+0001150043 00000 n
+0001171759 00000 n
+0001195784 00000 n
+0001195825 00000 n
+0001195865 00000 n
+0001195999 00000 n
trailer
<<
-/Size 2169
-/Root 2167 0 R
-/Info 2168 0 R
-/ID [<0C97D45D411E72A60BD825BAD36788D6> <0C97D45D411E72A60BD825BAD36788D6>]
+/Size 2735
+/Root 2733 0 R
+/Info 2734 0 R
+/ID [<1DE9D6805D55864A9314F6997A97E945> <1DE9D6805D55864A9314F6997A97E945>]
>>
startxref
-1031261
+1196257
%%EOF
diff --git a/contrib/bind9/doc/arm/Makefile.in b/contrib/bind9/doc/arm/Makefile.in
index 5098528..d9eb8fe 100644
--- a/contrib/bind9/doc/arm/Makefile.in
+++ b/contrib/bind9/doc/arm/Makefile.in
@@ -13,7 +13,7 @@
# OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
# PERFORMANCE OF THIS SOFTWARE.
-# $Id: Makefile.in,v 1.20.332.2 2009-02-12 23:47:22 tbox Exp $
+# $Id: Makefile.in,v 1.22 2009-02-12 23:47:56 tbox Exp $
srcdir = @srcdir@
VPATH = @srcdir@
diff --git a/contrib/bind9/doc/arm/dnssec.xml b/contrib/bind9/doc/arm/dnssec.xml
new file mode 100644
index 0000000..a678b8c
--- /dev/null
+++ b/contrib/bind9/doc/arm/dnssec.xml
@@ -0,0 +1,268 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ - Copyright (C) 2010 Internet Systems Consortium, Inc. ("ISC")
+ -
+ - Permission to use, copy, modify, and/or 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 ISC DISCLAIMS ALL WARRANTIES WITH
+ - REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+ - AND FITNESS. IN NO EVENT SHALL ISC 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.
+-->
+
+<!-- $Id: dnssec.xml,v 1.4 2010-08-16 22:21:06 marka Exp $ -->
+
+<sect1 id="dnssec.dynamic.zones">
+ <title>DNSSEC, Dynamic Zones, and Automatic Signing</title>
+ <para>As of BIND 9.7.0 it is possible to change a dynamic zone
+ from insecure to signed and back again. A secure zone can use
+ either NSEC or NSEC3 chains.</para>
+ <sect2>
+ <title>Converting from insecure to secure</title>
+ </sect2>
+ <para>Changing a zone from insecure to secure can be done in two
+ ways: using a dynamic DNS update, or the
+ <command>auto-dnssec</command> zone option.</para>
+ <para>For either method, you need to configure
+ <command>named</command> so that it can see the
+ <filename>K*</filename> files which contain the public and private
+ parts of the keys that will be used to sign the zone. These files
+ will have been generated by
+ <command>dnssec-keygen</command>. You can do this by placing them
+ in the key-directory, as specified in
+ <filename>named.conf</filename>:</para>
+ <programlisting>
+ zone example.net {
+ type master;
+ update-policy local;
+ file "dynamic/example.net/example.net";
+ key-directory "dynamic/example.net";
+ };
+</programlisting>
+ <para>If one KSK and one ZSK DNSKEY key have been generated, this
+ configuration will cause all records in the zone to be signed
+ with the ZSK, and the DNSKEY RRset to be signed with the KSK as
+ well. An NSEC chain will be generated as part of the initial
+ signing process.</para>
+ <sect2>
+ <title>Dynamic DNS update method</title>
+ </sect2>
+ <para>To insert the keys via dynamic update:</para>
+ <screen>
+ % nsupdate
+ &gt; ttl 3600
+ &gt; update add example.net DNSKEY 256 3 7 AwEAAZn17pUF0KpbPA2c7Gz76Vb18v0teKT3EyAGfBfL8eQ8al35zz3Y I1m/SAQBxIqMfLtIwqWPdgthsu36azGQAX8=
+ &gt; update add example.net DNSKEY 257 3 7 AwEAAd/7odU/64o2LGsifbLtQmtO8dFDtTAZXSX2+X3e/UNlq9IHq3Y0 XtC0Iuawl/qkaKVxXe2lo8Ct+dM6UehyCqk=
+ &gt; send
+</screen>
+ <para>While the update request will complete almost immediately,
+ the zone will not be completely signed until
+ <command>named</command> has had time to walk the zone and
+ generate the NSEC and RRSIG records. The NSEC record at the apex
+ will be added last, to signal that there is a complete NSEC
+ chain.</para>
+ <para>If you wish to sign using NSEC3 instead of NSEC, you should
+ add an NSEC3PARAM record to the initial update request. If you
+ wish the NSEC3 chain to have the OPTOUT bit set, set it in the
+ flags field of the NSEC3PARAM record.</para>
+ <screen>
+ % nsupdate
+ &gt; ttl 3600
+ &gt; update add example.net DNSKEY 256 3 7 AwEAAZn17pUF0KpbPA2c7Gz76Vb18v0teKT3EyAGfBfL8eQ8al35zz3Y I1m/SAQBxIqMfLtIwqWPdgthsu36azGQAX8=
+ &gt; update add example.net DNSKEY 257 3 7 AwEAAd/7odU/64o2LGsifbLtQmtO8dFDtTAZXSX2+X3e/UNlq9IHq3Y0 XtC0Iuawl/qkaKVxXe2lo8Ct+dM6UehyCqk=
+ &gt; update add example.net NSEC3PARAM 1 1 100 1234567890
+ &gt; send
+</screen>
+ <para>Again, this update request will complete almost
+ immediately; however, the record won't show up until
+ <command>named</command> has had a chance to build/remove the
+ relevant chain. A private type record will be created to record
+ the state of the operation (see below for more details), and will
+ be removed once the operation completes.</para>
+ <para>While the initial signing and NSEC/NSEC3 chain generation
+ is happening, other updates are possible as well.</para>
+ <sect2>
+ <title>Fully automatic zone signing</title>
+ </sect2>
+ <para>To enable automatic signing, add the
+ <command>auto-dnssec</command> option to the zone statement in
+ <filename>named.conf</filename>.
+ <command>auto-dnssec</command> has two possible arguments:
+ <constant>allow</constant> or
+ <constant>maintain</constant>.</para>
+ <para>With
+ <command>auto-dnssec allow</command>,
+ <command>named</command> can search the key directory for keys
+ matching the zone, insert them into the zone, and use them to
+ sign the zone. It will do so only when it receives an
+ <command>rndc sign &lt;zonename&gt;</command> or
+ <command>rndc loadkeys &lt;zonename&gt;</command> command.</para>
+ <para>
+ <!-- TODO: this is repeated in the ARM -->
+ <command>auto-dnssec maintain</command> includes the above
+ functionality, but will also automatically adjust the zone's
+ DNSKEY records on schedule according to the keys' timing metadata.
+ (See <xref linkend="man.dnssec-keygen"/> and
+ <xref linkend="man.dnssec-settime"/> for more information.)
+ If keys are present in the key directory the first time the zone
+ is loaded, it will be signed immediately, without waiting for an
+ <command>rndc sign</command> or <command>rndc loadkeys</command>
+ command. (Those commands can still be used when there are unscheduled
+ key changes, however.)
+ </para>
+ <para>Using the
+ <command>auto-dnssec</command> option requires the zone to be
+ configured to allow dynamic updates, by adding an
+ <command>allow-update</command> or
+ <command>update-policy</command> statement to the zone
+ configuration. If this has not been done, the configuration will
+ fail.</para>
+ <sect2>
+ <title>Private-type records</title>
+ </sect2>
+ <para>The state of the signing process is signaled by
+ private-type records (with a default type value of 65534). When
+ signing is complete, these records will have a nonzero value for
+ the final octet (for those records which have a nonzero initial
+ octet).</para>
+ <para>The private type record format: If the first octet is
+ non-zero then the record indicates that the zone needs to be
+ signed with the key matching the record, or that all signatures
+ that match the record should be removed.</para>
+ <para>
+ <literallayout>
+<!-- TODO: how to format this? -->
+ algorithm (octet 1)
+ key id in network order (octet 2 and 3)
+ removal flag (octet 4)
+ complete flag (octet 5)
+</literallayout>
+ </para>
+ <para>Only records flagged as "complete" can be removed via
+ dynamic update. Attempts to remove other private type records
+ will be silently ignored.</para>
+ <para>If the first octet is zero (this is a reserved algorithm
+ number that should never appear in a DNSKEY record) then the
+ record indicates changes to the NSEC3 chains are in progress. The
+ rest of the record contains an NSEC3PARAM record. The flag field
+ tells what operation to perform based on the flag bits.</para>
+ <para>
+ <literallayout>
+<!-- TODO: how to format this? -->
+ 0x01 OPTOUT
+ 0x80 CREATE
+ 0x40 REMOVE
+ 0x20 NONSEC
+</literallayout>
+ </para>
+ <sect2>
+ <title>DNSKEY rollovers</title>
+ </sect2>
+ <para>As with insecure-to-secure conversions, rolling DNSSEC
+ keys can be done in two ways: using a dynamic DNS update, or the
+ <command>auto-dnssec</command> zone option.</para>
+ <sect2>
+ <title>Dynamic DNS update method</title>
+ </sect2>
+ <para> To perform key rollovers via dynamic update, you need to add
+ the <filename>K*</filename> files for the new keys so that
+ <command>named</command> can find them. You can then add the new
+ DNSKEY RRs via dynamic update.
+ <command>named</command> will then cause the zone to be signed
+ with the new keys. When the signing is complete the private type
+ records will be updated so that the last octet is non
+ zero.</para>
+ <para>If this is for a KSK you need to inform the parent and any
+ trust anchor repositories of the new KSK.</para>
+ <para>You should then wait for the maximum TTL in the zone before
+ removing the old DNSKEY. If it is a KSK that is being updated,
+ you also need to wait for the DS RRset in the parent to be
+ updated and its TTL to expire. This ensures that all clients will
+ be able to verify at least one signature when you remove the old
+ DNSKEY.</para>
+ <para>The old DNSKEY can be removed via UPDATE. Take care to
+ specify the correct key.
+ <command>named</command> will clean out any signatures generated
+ by the old key after the update completes.</para>
+ <sect2>
+ <title>Automatic key rollovers</title>
+ </sect2>
+ <para>When a new key reaches its activation date (as set by
+ <command>dnssec-keygen</command> or <command>dnssec-settime</command>),
+ if the <command>auto-dnssec</command> zone option is set to
+ <constant>maintain</constant>, <command>named</command> will
+ automatically carry out the key rollover. If the key's algorithm
+ has not previously been used to sign the zone, then the zone will
+ be fully signed as quickly as possible. However, if the new key
+ is replacing an existing key of the same algorithm, then the
+ zone will be re-signed incrementally, with signatures from the
+ old key being replaced with signatures from the new key as their
+ signature validity periods expire. By default, this rollover
+ completes in 30 days, after which it will be safe to remove the
+ old key from the DNSKEY RRset.</para>
+ <sect2>
+ <title>NSEC3PARAM rollovers via UPDATE</title>
+ </sect2>
+ <para>Add the new NSEC3PARAM record via dynamic update. When the
+ new NSEC3 chain has been generated, the NSEC3PARAM flag field
+ will be zero. At this point you can remove the old NSEC3PARAM
+ record. The old chain will be removed after the update request
+ completes.</para>
+ <sect2>
+ <title>Converting from NSEC to NSEC3</title>
+ </sect2>
+ <para>To do this, you just need to add an NSEC3PARAM record. When
+ the conversion is complete, the NSEC chain will have been removed
+ and the NSEC3PARAM record will have a zero flag field. The NSEC3
+ chain will be generated before the NSEC chain is
+ destroyed.</para>
+ <sect2>
+ <title>Converting from NSEC3 to NSEC</title>
+ </sect2>
+ <para>To do this, use <command>nsupdate</command> to
+ remove all NSEC3PARAM records with a zero flag
+ field. The NSEC chain will be generated before the NSEC3 chain is
+ removed.</para>
+ <sect2>
+ <title>Converting from secure to insecure</title>
+ </sect2>
+ <para>To convert a signed zone to unsigned using dynamic DNS,
+ delete all the DNSKEY records from the zone apex using
+ <command>nsupdate</command>. All signatures, NSEC or NSEC3 chains,
+ and associated NSEC3PARAM records will be removed automatically.
+ This will take place after the update request completes.</para>
+ <para> This requires the
+ <command>dnssec-secure-to-insecure</command> option to be set to
+ <userinput>yes</userinput> in
+ <filename>named.conf</filename>.</para>
+ <para>In addition, if the <command>auto-dnssec maintain</command>
+ zone statement is used, it should be removed or changed to
+ <command>allow</command> instead (or it will re-sign).
+ </para>
+ <sect2>
+ <title>Periodic re-signing</title>
+ </sect2>
+ <para>In any secure zone which supports dynamic updates, named
+ will periodically re-sign RRsets which have not been re-signed as
+ a result of some update action. The signature lifetimes will be
+ adjusted so as to spread the re-sign load over time rather than
+ all at once.</para>
+ <sect2>
+ <title>NSEC3 and OPTOUT</title>
+ </sect2>
+ <para>
+ <command>named</command> only supports creating new NSEC3 chains
+ where all the NSEC3 records in the zone have the same OPTOUT
+ state.
+ <command>named</command> supports UPDATES to zones where the NSEC3
+ records in the chain have mixed OPTOUT state.
+ <command>named</command> does not support changing the OPTOUT
+ state of an individual NSEC3 record, the entire chain needs to be
+ changed if the OPTOUT state of an individual NSEC3 needs to be
+ changed.</para>
+</sect1>
diff --git a/contrib/bind9/doc/arm/libdns.xml b/contrib/bind9/doc/arm/libdns.xml
new file mode 100644
index 0000000..8861f2c
--- /dev/null
+++ b/contrib/bind9/doc/arm/libdns.xml
@@ -0,0 +1,530 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ - Copyright (C) 2010 Internet Systems Consortium, Inc. ("ISC")
+ -
+ - Permission to use, copy, modify, and/or 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 ISC DISCLAIMS ALL WARRANTIES WITH
+ - REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+ - AND FITNESS. IN NO EVENT SHALL ISC 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.
+-->
+
+<sect1 id="bind9.library">
+ <title>BIND 9 DNS Library Support</title>
+ <para>This version of BIND 9 "exports" its internal libraries so
+ that they can be used by third-party applications more easily (we
+ call them "export" libraries in this document). In addition to
+ all major DNS-related APIs BIND 9 is currently using, the export
+ libraries provide the following features:</para>
+ <itemizedlist>
+ <listitem>
+ <para>The newly created "DNS client" module. This is a higher
+ level API that provides an interface to name resolution,
+ single DNS transaction with a particular server, and dynamic
+ update. Regarding name resolution, it supports advanced
+ features such as DNSSEC validation and caching. This module
+ supports both synchronous and asynchronous mode.</para>
+ </listitem>
+ <listitem>
+ <para>The new "IRS" (Information Retrieval System) library.
+ It provides an interface to parse the traditional resolv.conf
+ file and more advanced, DNS-specific configuration file for
+ the rest of this package (see the description for the
+ dns.conf file below).</para>
+ </listitem>
+ <listitem>
+ <para>As part of the IRS library, newly implemented standard
+ address-name mapping functions, getaddrinfo() and
+ getnameinfo(), are provided. They use the DNSSEC-aware
+ validating resolver backend, and could use other advanced
+ features of the BIND 9 libraries such as caching. The
+ getaddrinfo() function resolves both A and AAAA RRs
+ concurrently (when the address family is unspecified).</para>
+ </listitem>
+ <listitem>
+ <para>An experimental framework to support other event
+ libraries than BIND 9's internal event task system.</para>
+ </listitem>
+ </itemizedlist>
+ <sect2>
+ <title>Prerequisite</title>
+ <para>GNU make is required to build the export libraries (other
+ part of BIND 9 can still be built with other types of make). In
+ the reminder of this document, "make" means GNU make. Note that
+ in some platforms you may need to invoke a different command name
+ than "make" (e.g. "gmake") to indicate it's GNU make.</para>
+ </sect2>
+ <sect2>
+ <title>Compilation</title>
+ <screen>
+$ <userinput>./configure --enable-exportlib <replaceable>[other flags]</replaceable></userinput>
+$ <userinput>make</userinput>
+</screen>
+ <para>
+ This will create (in addition to usual BIND 9 programs) and a
+ separate set of libraries under the lib/export directory. For
+ example, <filename>lib/export/dns/libdns.a</filename> is the archive file of the
+ export version of the BIND 9 DNS library. Sample application
+ programs using the libraries will also be built under the
+ lib/export/samples directory (see below).</para>
+ </sect2>
+ <sect2>
+ <title>Installation</title>
+ <screen>
+$ <userinput>cd lib/export</userinput>
+$ <userinput>make install</userinput>
+</screen>
+ <para>
+ This will install library object files under the directory
+ specified by the --with-export-libdir configure option (default:
+ EPREFIX/lib/bind9), and header files under the directory
+ specified by the --with-export-includedir configure option
+ (default: PREFIX/include/bind9).
+ Root privilege is normally required.
+ "<command>make install</command>" at the top directory will do the
+ same.
+ </para>
+ <para>
+ To see how to build your own
+ application after the installation, see
+ <filename>lib/export/samples/Makefile-postinstall.in</filename>.</para>
+ </sect2>
+ <sect2>
+ <title>Known Defects/Restrictions</title>
+ <itemizedlist>
+ <listitem>
+<!-- TODO: what about AIX? -->
+ <para>Currently, win32 is not supported for the export
+ library. (Normal BIND 9 application can be built as
+ before).</para>
+ </listitem>
+ <listitem>
+ <para>The "fixed" RRset order is not (currently) supported in
+ the export library. If you want to use "fixed" RRset order
+ for, e.g. <command>named</command> while still building the
+ export library even without the fixed order support, build
+ them separately:
+ <screen>
+$ <userinput>./configure --enable-fixed-rrset <replaceable>[other flags, but not --enable-exportlib]</replaceable></userinput>
+$ <userinput>make</userinput>
+$ <userinput>./configure --enable-exportlib <replaceable>[other flags, but not --enable-fixed-rrset]</replaceable></userinput>
+$ <userinput>cd lib/export</userinput>
+$ <userinput>make</userinput>
+</screen>
+ </para>
+ </listitem>
+ <listitem>
+ <para>The client module and the IRS library currently do not
+ support DNSSEC validation using DLV (the underlying modules
+ can handle it, but there is no tunable interface to enable
+ the feature).</para>
+ </listitem>
+ <listitem>
+ <para>RFC 5011 is not supported in the validating stub
+ resolver of the export library. In fact, it is not clear
+ whether it should: trust anchors would be a system-wide
+ configuration which would be managed by an administrator,
+ while the stub resolver will be used by ordinary applications
+ run by a normal user.</para>
+ </listitem>
+ <listitem>
+ <para>Not all common <filename>/etc/resolv.conf</filename>
+ options are supported
+ in the IRS library. The only available options in this
+ version are "debug" and "ndots".</para>
+ </listitem>
+ </itemizedlist>
+ </sect2>
+ <sect2>
+ <title>The dns.conf File</title>
+ <para>The IRS library supports an "advanced" configuration file
+ related to the DNS library for configuration parameters that
+ would be beyond the capability of the
+ <filename>resolv.conf</filename> file.
+ Specifically, it is intended to provide DNSSEC related
+ configuration parameters. By default the path to this
+ configuration file is <filename>/etc/dns.conf</filename>.
+ This module is very
+ experimental and the configuration syntax or library interfaces
+ may change in future versions. Currently, only the
+ <command>trusted-keys</command>
+ statement is supported, whose syntax is the same as the same name
+ of statement for <filename>named.conf</filename>. (See
+ <xref linkend="trusted-keys" /> for details.)</para>
+ </sect2>
+ <sect2>
+ <title>Sample Applications</title>
+ <para>Some sample application programs using this API are
+ provided for reference. The following is a brief description of
+ these applications.
+ </para>
+ <sect3>
+ <title>sample: a simple stub resolver utility</title>
+ <para>
+ It sends a query of a given name (of a given optional RR type) to a
+ specified recursive server, and prints the result as a list of
+ RRs. It can also act as a validating stub resolver if a trust
+ anchor is given via a set of command line options.</para>
+ <para>
+ Usage: sample [options] server_address hostname
+ </para>
+ <para>
+ Options and Arguments:
+ </para>
+ <variablelist>
+ <varlistentry>
+ <term>
+ -t RRtype
+ </term>
+ <listitem><para>
+ specify the RR type of the query. The default is the A RR.
+ </para></listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>
+ [-a algorithm] [-e] -k keyname -K keystring
+ </term>
+ <listitem><para>
+ specify a command-line DNS key to validate the answer. For
+ example, to specify the following DNSKEY of example.com:
+<literallayout>
+ example.com. 3600 IN DNSKEY 257 3 5 xxx
+</literallayout>
+ specify the options as follows:
+<screen>
+<userinput>
+ -e -k example.com -K "xxx"
+</userinput>
+</screen>
+ -e means that this key is a zone's "key signing key" (as known
+ as "secure Entry point").
+ When -a is omitted rsasha1 will be used by default.
+ </para></listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>
+ -s domain:alt_server_address
+ </term>
+ <listitem><para>
+ specify a separate recursive server address for the specific
+ "domain". Example: -s example.com:2001:db8::1234
+ </para></listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>server_address</term>
+ <listitem><para>
+ an IP(v4/v6) address of the recursive server to which queries
+ are sent.
+ </para></listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>hostname</term>
+ <listitem><para>
+ the domain name for the query
+ </para></listitem>
+ </varlistentry>
+ </variablelist>
+ </sect3>
+ <sect3>
+ <title>sample-async: a simple stub resolver, working asynchronously</title>
+ <para>
+ Similar to "sample", but accepts a list
+ of (query) domain names as a separate file and resolves the names
+ asynchronously.</para>
+ <para>
+ Usage: sample-async [-s server_address] [-t RR_type] input_file</para>
+ <para>
+ Options and Arguments:
+ </para>
+ <variablelist>
+ <varlistentry>
+ <term>
+ -s server_address
+ </term>
+ <listitem>
+ an IPv4 address of the recursive server to which queries are sent.
+ (IPv6 addresses are not supported in this implementation)
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>
+ -t RR_type
+ </term>
+ <listitem>
+ specify the RR type of the queries. The default is the A
+ RR.
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>
+ input_file
+ </term>
+ <listitem>
+ a list of domain names to be resolved. each line
+ consists of a single domain name. Example:
+ <literallayout>
+ www.example.com
+ mx.examle.net
+ ns.xxx.example
+</literallayout>
+ </listitem>
+ </varlistentry>
+ </variablelist>
+ </sect3>
+ <sect3>
+ <title>sample-request: a simple DNS transaction client</title>
+ <para>
+ It sends a query to a specified server, and
+ prints the response with minimal processing. It doesn't act as a
+ "stub resolver": it stops the processing once it gets any
+ response from the server, whether it's a referral or an alias
+ (CNAME or DNAME) that would require further queries to get the
+ ultimate answer. In other words, this utility acts as a very
+ simplified <command>dig</command>.
+ </para>
+ <para>
+ Usage: sample-request [-t RRtype] server_address hostname
+ </para>
+ <para>
+ Options and Arguments:
+ </para>
+ <variablelist>
+ <varlistentry>
+ <term>
+ -t RRtype
+ </term>
+ <listitem>
+ <para>
+ specify the RR type of
+ the queries. The default is the A RR.
+ </para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>
+ server_address
+ </term>
+ <listitem>
+ <para>
+ an IP(v4/v6)
+ address of the recursive server to which the query is sent.
+ </para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>
+ hostname
+ </term>
+ <listitem>
+ <para>
+ the domain name for the query
+ </para>
+ </listitem>
+ </varlistentry>
+ </variablelist>
+ </sect3>
+ <sect3>
+ <title>sample-gai: getaddrinfo() and getnameinfo() test code</title>
+ <para>
+ This is a test program
+ to check getaddrinfo() and getnameinfo() behavior. It takes a
+ host name as an argument, calls getaddrinfo() with the given host
+ name, and calls getnameinfo() with the resulting IP addresses
+ returned by getaddrinfo(). If the dns.conf file exists and
+ defines a trust anchor, the underlying resolver will act as a
+ validating resolver, and getaddrinfo()/getnameinfo() will fail
+ with an EAI_INSECUREDATA error when DNSSEC validation fails.
+ </para>
+ <para>
+ Usage: sample-gai hostname
+ </para>
+ </sect3>
+ <sect3>
+ <title>sample-update: a simple dynamic update client program</title>
+ <para>
+ It accepts a single update command as a
+ command-line argument, sends an update request message to the
+ authoritative server, and shows the response from the server. In
+ other words, this is a simplified <command>nsupdate</command>.
+ </para>
+ <para>
+ Usage: sample-update [options] (add|delete) "update data"
+ </para>
+ <para>
+ Options and Arguments:
+ </para>
+ <variablelist>
+ <varlistentry>
+ <term>
+ -a auth_server
+ </term>
+ <listitem><para>
+ An IP address of the authoritative server that has authority
+ for the zone containing the update name. This should normally
+ be the primary authoritative server that accepts dynamic
+ updates. It can also be a secondary server that is configured
+ to forward update requests to the primary server.
+ </para></listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>
+ -k keyfile
+ </term>
+ <listitem><para>
+ A TSIG key file to secure the update transaction. The keyfile
+ format is the same as that for the nsupdate utility.
+ </para></listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>
+ -p prerequisite
+ </term>
+ <listitem><para>
+ A prerequisite for the update (only one prerequisite can be
+ specified). The prerequisite format is the same as that is
+ accepted by the nsupdate utility.
+ </para></listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>
+ -r recursive_server
+ </term>
+ <listitem><para>
+ An IP address of a recursive server that this utility will
+ use. A recursive server may be necessary to identify the
+ authoritative server address to which the update request is
+ sent.
+ </para></listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>
+ -z zonename
+ </term>
+ <listitem><para>
+ The domain name of the zone that contains
+ </para></listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>
+ (add|delete)
+ </term>
+ <listitem><para>
+ Specify the type of update operation. Either "add" or "delete"
+ must be specified.
+ </para></listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>
+ "update data"
+ </term>
+ <listitem><para>
+ Specify the data to be updated. A typical example of the data
+ would look like "name TTL RRtype RDATA".
+ </para></listitem>
+ </varlistentry>
+ </variablelist>
+
+ <note>In practice, either -a or -r must be specified. Others can
+ be optional; the underlying library routine tries to identify the
+ appropriate server and the zone name for the update.</note>
+
+ <para>
+ Examples: assuming the primary authoritative server of the
+ dynamic.example.com zone has an IPv6 address 2001:db8::1234,
+ </para>
+ <screen>
+$ <userinput>sample-update -a sample-update -k Kxxx.+nnn+mmmm.key add "foo.dynamic.example.com 30 IN A 192.168.2.1"</userinput></screen>
+ <para>
+ adds an A RR for foo.dynamic.example.com using the given key.
+ </para>
+ <screen>
+$ <userinput>sample-update -a sample-update -k Kxxx.+nnn+mmmm.key delete "foo.dynamic.example.com 30 IN A"</userinput></screen>
+ <para>
+ removes all A RRs for foo.dynamic.example.com using the given key.
+ </para>
+ <screen>
+$ <userinput>sample-update -a sample-update -k Kxxx.+nnn+mmmm.key delete "foo.dynamic.example.com"</userinput></screen>
+ <para>
+ removes all RRs for foo.dynamic.example.com using the given key.
+ </para>
+ </sect3>
+ <sect3>
+ <title>nsprobe: domain/name server checker in terms of RFC 4074</title>
+ <para>
+ It checks a set
+ of domains to see the name servers of the domains behave
+ correctly in terms of RFC 4074. This is included in the set of
+ sample programs to show how the export library can be used in a
+ DNS-related application.
+ </para>
+ <para>
+ Usage: nsprobe [-d] [-v [-v...]] [-c cache_address] [input_file]
+ </para>
+ <para>
+ Options
+ </para>
+
+ <variablelist>
+ <varlistentry>
+ <term>
+ -d
+ </term>
+ <listitem><para>
+ run in the "debug" mode. with this option nsprobe will dump
+ every RRs it receives.
+ </para></listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>
+ -v
+ </term>
+ <listitem><para>
+ increase verbosity of other normal log messages. This can be
+ specified multiple times
+ </para></listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>
+ -c cache_address
+ </term>
+ <listitem><para>
+ specify an IP address of a recursive (caching) name server.
+ nsprobe uses this server to get the NS RRset of each domain and
+ the A and/or AAAA RRsets for the name servers. The default
+ value is 127.0.0.1.
+ </para></listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>
+ input_file
+ </term>
+ <listitem><para>
+ a file name containing a list of domain (zone) names to be
+ probed. when omitted the standard input will be used. Each
+ line of the input file specifies a single domain name such as
+ "example.com". In general this domain name must be the apex
+ name of some DNS zone (unlike normal "host names" such as
+ "www.example.com"). nsprobe first identifies the NS RRsets for
+ the given domain name, and sends A and AAAA queries to these
+ servers for some "widely used" names under the zone;
+ specifically, adding "www" and "ftp" to the zone name.
+ </para></listitem>
+ </varlistentry>
+ </variablelist>
+ </sect3>
+ </sect2>
+ <sect2>
+ <title>Library References</title>
+ <para>As of this writing, there is no formal "manual" of the
+ libraries, except this document, header files (some of them
+ provide pretty detailed explanations), and sample application
+ programs.</para>
+ </sect2>
+</sect1>
+<!-- $Id: libdns.xml,v 1.3 2010-02-03 23:49:07 tbox Exp $ -->
diff --git a/contrib/bind9/doc/arm/man.arpaname.html b/contrib/bind9/doc/arm/man.arpaname.html
new file mode 100644
index 0000000..8f0d98c
--- /dev/null
+++ b/contrib/bind9/doc/arm/man.arpaname.html
@@ -0,0 +1,91 @@
+<!--
+ - Copyright (C) 2004-2011 Internet Systems Consortium, Inc. ("ISC")
+ - Copyright (C) 2000-2003 Internet Software Consortium.
+ -
+ - Permission to use, copy, modify, and/or 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 ISC DISCLAIMS ALL WARRANTIES WITH
+ - REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+ - AND FITNESS. IN NO EVENT SHALL ISC 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.
+-->
+<!-- $Id: man.arpaname.html,v 1.33.8.1.2.1 2011-06-09 03:41:11 tbox Exp $ -->
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
+<title>arpaname</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.71.1">
+<link rel="start" href="Bv9ARM.html" title="BIND 9 Administrator Reference Manual">
+<link rel="up" href="Bv9ARM.ch10.html" title="Manual pages">
+<link rel="prev" href="man.ddns-confgen.html" title="ddns-confgen">
+<link rel="next" href="man.genrandom.html" title="genrandom">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<div class="navheader">
+<table width="100%" summary="Navigation header">
+<tr><th colspan="3" align="center"><span class="application">arpaname</span></th></tr>
+<tr>
+<td width="20%" align="left">
+<a accesskey="p" href="man.ddns-confgen.html">Prev</a> </td>
+<th width="60%" align="center">Manual pages</th>
+<td width="20%" align="right"> <a accesskey="n" href="man.genrandom.html">Next</a>
+</td>
+</tr>
+</table>
+<hr>
+</div>
+<div class="refentry" lang="en">
+<a name="man.arpaname"></a><div class="titlepage"></div>
+<div class="refnamediv">
+<h2>Name</h2>
+<p><span class="application">arpaname</span> &#8212; translate IP addresses to the corresponding ARPA names</p>
+</div>
+<div class="refsynopsisdiv">
+<h2>Synopsis</h2>
+<div class="cmdsynopsis"><p><code class="command">arpaname</code> {<em class="replaceable"><code>ipaddress </code></em>...}</p></div>
+</div>
+<div class="refsect1" lang="en">
+<a name="id2616630"></a><h2>DESCRIPTION</h2>
+<p>
+ <span><strong class="command">arpaname</strong></span> translates IP addresses (IPv4 and
+ IPv6) to the corresponding IN-ADDR.ARPA or IP6.ARPA names.
+ </p>
+</div>
+<div class="refsect1" lang="en">
+<a name="id2616645"></a><h2>SEE ALSO</h2>
+<p>
+ <em class="citetitle">BIND 9 Administrator Reference Manual</em>.
+ </p>
+</div>
+<div class="refsect1" lang="en">
+<a name="id2616659"></a><h2>AUTHOR</h2>
+<p><span class="corpauthor">Internet Systems Consortium</span>
+ </p>
+</div>
+</div>
+<div class="navfooter">
+<hr>
+<table width="100%" summary="Navigation footer">
+<tr>
+<td width="40%" align="left">
+<a accesskey="p" href="man.ddns-confgen.html">Prev</a> </td>
+<td width="20%" align="center"><a accesskey="u" href="Bv9ARM.ch10.html">Up</a></td>
+<td width="40%" align="right"> <a accesskey="n" href="man.genrandom.html">Next</a>
+</td>
+</tr>
+<tr>
+<td width="40%" align="left" valign="top">
+<span class="application">ddns-confgen</span> </td>
+<td width="20%" align="center"><a accesskey="h" href="Bv9ARM.html">Home</a></td>
+<td width="40%" align="right" valign="top"> <span class="application">genrandom</span>
+</td>
+</tr>
+</table>
+</div>
+</body>
+</html>
diff --git a/contrib/bind9/doc/arm/man.ddns-confgen.html b/contrib/bind9/doc/arm/man.ddns-confgen.html
new file mode 100644
index 0000000..0155dbf
--- /dev/null
+++ b/contrib/bind9/doc/arm/man.ddns-confgen.html
@@ -0,0 +1,180 @@
+<!--
+ - Copyright (C) 2004-2011 Internet Systems Consortium, Inc. ("ISC")
+ - Copyright (C) 2000-2003 Internet Software Consortium.
+ -
+ - Permission to use, copy, modify, and/or 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 ISC DISCLAIMS ALL WARRANTIES WITH
+ - REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+ - AND FITNESS. IN NO EVENT SHALL ISC 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.
+-->
+<!-- $Id: man.ddns-confgen.html,v 1.69.8.1.2.1 2011-06-09 03:41:11 tbox Exp $ -->
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
+<title>ddns-confgen</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.71.1">
+<link rel="start" href="Bv9ARM.html" title="BIND 9 Administrator Reference Manual">
+<link rel="up" href="Bv9ARM.ch10.html" title="Manual pages">
+<link rel="prev" href="man.rndc-confgen.html" title="rndc-confgen">
+<link rel="next" href="man.arpaname.html" title="arpaname">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<div class="navheader">
+<table width="100%" summary="Navigation header">
+<tr><th colspan="3" align="center"><span class="application">ddns-confgen</span></th></tr>
+<tr>
+<td width="20%" align="left">
+<a accesskey="p" href="man.rndc-confgen.html">Prev</a> </td>
+<th width="60%" align="center">Manual pages</th>
+<td width="20%" align="right"> <a accesskey="n" href="man.arpaname.html">Next</a>
+</td>
+</tr>
+</table>
+<hr>
+</div>
+<div class="refentry" lang="en">
+<a name="man.ddns-confgen"></a><div class="titlepage"></div>
+<div class="refnamediv">
+<h2>Name</h2>
+<p><span class="application">ddns-confgen</span> &#8212; ddns key generation tool</p>
+</div>
+<div class="refsynopsisdiv">
+<h2>Synopsis</h2>
+<div class="cmdsynopsis"><p><code class="command">ddns-confgen</code> [<code class="option">-a <em class="replaceable"><code>algorithm</code></em></code>] [<code class="option">-h</code>] [<code class="option">-k <em class="replaceable"><code>keyname</code></em></code>] [<code class="option">-r <em class="replaceable"><code>randomfile</code></em></code>] [ -s <em class="replaceable"><code>name</code></em> | -z <em class="replaceable"><code>zone</code></em> ] [<code class="option">-q</code>] [name]</p></div>
+</div>
+<div class="refsect1" lang="en">
+<a name="id2645803"></a><h2>DESCRIPTION</h2>
+<p><span><strong class="command">ddns-confgen</strong></span>
+ generates a key for use by <span><strong class="command">nsupdate</strong></span>
+ and <span><strong class="command">named</strong></span>. It simplifies configuration
+ of dynamic zones by generating a key and providing the
+ <span><strong class="command">nsupdate</strong></span> and <span><strong class="command">named.conf</strong></span>
+ syntax that will be needed to use it, including an example
+ <span><strong class="command">update-policy</strong></span> statement.
+ </p>
+<p>
+ If a domain name is specified on the command line, it will
+ be used in the name of the generated key and in the sample
+ <span><strong class="command">named.conf</strong></span> syntax. For example,
+ <span><strong class="command">ddns-confgen example.com</strong></span> would
+ generate a key called "ddns-key.example.com", and sample
+ <span><strong class="command">named.conf</strong></span> command that could be used
+ in the zone definition for "example.com".
+ </p>
+<p>
+ Note that <span><strong class="command">named</strong></span> itself can configure a
+ local DDNS key for use with <span><strong class="command">nsupdate -l</strong></span>.
+ <span><strong class="command">ddns-confgen</strong></span> is only needed when a
+ more elaborate configuration is required: for instance, if
+ <span><strong class="command">nsupdate</strong></span> is to be used from a remote system.
+ </p>
+</div>
+<div class="refsect1" lang="en">
+<a name="id2645959"></a><h2>OPTIONS</h2>
+<div class="variablelist"><dl>
+<dt><span class="term">-a <em class="replaceable"><code>algorithm</code></em></span></dt>
+<dd><p>
+ Specifies the algorithm to use for the TSIG key. Available
+ choices are: hmac-md5, hmac-sha1, hmac-sha224, hmac-sha256,
+ hmac-sha384 and hmac-sha512. The default is hmac-sha256.
+ </p></dd>
+<dt><span class="term">-h</span></dt>
+<dd><p>
+ Prints a short summary of the options and arguments to
+ <span><strong class="command">ddns-confgen</strong></span>.
+ </p></dd>
+<dt><span class="term">-k <em class="replaceable"><code>keyname</code></em></span></dt>
+<dd><p>
+ Specifies the key name of the DDNS authentication key.
+ The default is <code class="constant">ddns-key</code> when neither
+ the <code class="option">-s</code> nor <code class="option">-z</code> option is
+ specified; otherwise, the default
+ is <code class="constant">ddns-key</code> as a separate label
+ followed by the argument of the option, e.g.,
+ <code class="constant">ddns-key.example.com.</code>
+ The key name must have the format of a valid domain name,
+ consisting of letters, digits, hyphens and periods.
+ </p></dd>
+<dt><span class="term">-q</span></dt>
+<dd><p>
+ Quiet mode: Print only the key, with no explanatory text or
+ usage examples.
+ </p></dd>
+<dt><span class="term">-r <em class="replaceable"><code>randomfile</code></em></span></dt>
+<dd><p>
+ Specifies a source of random data for generating the
+ authorization. If the operating system does not provide a
+ <code class="filename">/dev/random</code> or equivalent device, the
+ default source of randomness is keyboard input.
+ <code class="filename">randomdev</code> specifies the name of a
+ character device or file containing random data to be used
+ instead of the default. The special value
+ <code class="filename">keyboard</code> indicates that keyboard input
+ should be used.
+ </p></dd>
+<dt><span class="term">-s <em class="replaceable"><code>name</code></em></span></dt>
+<dd><p>
+ Single host mode: The example <span><strong class="command">named.conf</strong></span> text
+ shows how to set an update policy for the specified
+ <em class="replaceable"><code>name</code></em>
+ using the "name" nametype.
+ The default key name is
+ ddns-key.<em class="replaceable"><code>name</code></em>.
+ Note that the "self" nametype cannot be used, since
+ the name to be updated may differ from the key name.
+ This option cannot be used with the <code class="option">-z</code> option.
+ </p></dd>
+<dt><span class="term">-z <em class="replaceable"><code>zone</code></em></span></dt>
+<dd><p>
+ zone mode: The example <span><strong class="command">named.conf</strong></span> text
+ shows how to set an update policy for the specified
+ <em class="replaceable"><code>zone</code></em>
+ using the "zonesub" nametype, allowing updates to all subdomain
+ names within
+ that <em class="replaceable"><code>zone</code></em>.
+ This option cannot be used with the <code class="option">-s</code> option.
+ </p></dd>
+</dl></div>
+</div>
+<div class="refsect1" lang="en">
+<a name="id2646569"></a><h2>SEE ALSO</h2>
+<p><span class="citerefentry"><span class="refentrytitle">nsupdate</span>(1)</span>,
+ <span class="citerefentry"><span class="refentrytitle">named.conf</span>(5)</span>,
+ <span class="citerefentry"><span class="refentrytitle">named</span>(8)</span>,
+ <em class="citetitle">BIND 9 Administrator Reference Manual</em>.
+ </p>
+</div>
+<div class="refsect1" lang="en">
+<a name="id2646608"></a><h2>AUTHOR</h2>
+<p><span class="corpauthor">Internet Systems Consortium</span>
+ </p>
+</div>
+</div>
+<div class="navfooter">
+<hr>
+<table width="100%" summary="Navigation footer">
+<tr>
+<td width="40%" align="left">
+<a accesskey="p" href="man.rndc-confgen.html">Prev</a> </td>
+<td width="20%" align="center"><a accesskey="u" href="Bv9ARM.ch10.html">Up</a></td>
+<td width="40%" align="right"> <a accesskey="n" href="man.arpaname.html">Next</a>
+</td>
+</tr>
+<tr>
+<td width="40%" align="left" valign="top">
+<span class="application">rndc-confgen</span> </td>
+<td width="20%" align="center"><a accesskey="h" href="Bv9ARM.html">Home</a></td>
+<td width="40%" align="right" valign="top"> <span class="application">arpaname</span>
+</td>
+</tr>
+</table>
+</div>
+</body>
+</html>
diff --git a/contrib/bind9/doc/arm/man.dig.html b/contrib/bind9/doc/arm/man.dig.html
index 6afc34b..73b2b88 100644
--- a/contrib/bind9/doc/arm/man.dig.html
+++ b/contrib/bind9/doc/arm/man.dig.html
@@ -1,5 +1,5 @@
<!--
- - Copyright (C) 2004-2010 Internet Systems Consortium, Inc. ("ISC")
+ - Copyright (C) 2004-2011 Internet Systems Consortium, Inc. ("ISC")
- Copyright (C) 2000-2003 Internet Software Consortium.
-
- Permission to use, copy, modify, and/or distribute this software for any
@@ -14,7 +14,7 @@
- OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
- PERFORMANCE OF THIS SOFTWARE.
-->
-<!-- $Id: man.dig.html,v 1.93.14.17 2010-08-20 02:05:39 tbox Exp $ -->
+<!-- $Id: man.dig.html,v 1.162.8.1.2.1 2011-06-09 03:41:09 tbox Exp $ -->
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
@@ -52,7 +52,7 @@
<div class="cmdsynopsis"><p><code class="command">dig</code> [global-queryopt...] [query...]</p></div>
</div>
<div class="refsect1" lang="en">
-<a name="id2575940"></a><h2>DESCRIPTION</h2>
+<a name="id2609278"></a><h2>DESCRIPTION</h2>
<p><span><strong class="command">dig</strong></span>
(domain information groper) is a flexible tool
for interrogating DNS name servers. It performs DNS lookups and
@@ -98,7 +98,7 @@
</p>
</div>
<div class="refsect1" lang="en">
-<a name="id2576035"></a><h2>SIMPLE USAGE</h2>
+<a name="id2609373"></a><h2>SIMPLE USAGE</h2>
<p>
A typical invocation of <span><strong class="command">dig</strong></span> looks like:
</p>
@@ -144,7 +144,7 @@
</p>
</div>
<div class="refsect1" lang="en">
-<a name="id2576146"></a><h2>OPTIONS</h2>
+<a name="id2610167"></a><h2>OPTIONS</h2>
<p>
The <code class="option">-b</code> option sets the source IP address of the query
to <em class="parameter"><code>address</code></em>. This must be a valid
@@ -248,7 +248,7 @@
</p>
</div>
<div class="refsect1" lang="en">
-<a name="id2630214"></a><h2>QUERY OPTIONS</h2>
+<a name="id2662324"></a><h2>QUERY OPTIONS</h2>
<p><span><strong class="command">dig</strong></span>
provides a number of query options which affect
the way in which lookups are made and the results displayed. Some of
@@ -517,6 +517,12 @@
each record on a single line, to facilitate machine parsing
of the <span><strong class="command">dig</strong></span> output.
</p></dd>
+<dt><span class="term"><code class="option">+[no]onesoa</code></span></dt>
+<dd><p>
+ Print only one (starting) SOA record when performing
+ an AXFR. The default is to print both the starting and
+ ending SOA records.
+ </p></dd>
<dt><span class="term"><code class="option">+[no]fail</code></span></dt>
<dd><p>
Do not try the next server if you receive a SERVFAIL. The
@@ -573,7 +579,7 @@
</p>
</div>
<div class="refsect1" lang="en">
-<a name="id2631283"></a><h2>MULTIPLE QUERIES</h2>
+<a name="id2663338"></a><h2>MULTIPLE QUERIES</h2>
<p>
The BIND 9 implementation of <span><strong class="command">dig </strong></span>
supports
@@ -619,7 +625,7 @@ dig +qr www.isc.org any -x 127.0.0.1 isc.org ns +noqr
</p>
</div>
<div class="refsect1" lang="en">
-<a name="id2631436"></a><h2>IDN SUPPORT</h2>
+<a name="id2663424"></a><h2>IDN SUPPORT</h2>
<p>
If <span><strong class="command">dig</strong></span> has been built with IDN (internationalized
domain name) support, it can accept and display non-ASCII domain names.
@@ -633,14 +639,14 @@ dig +qr www.isc.org any -x 127.0.0.1 isc.org ns +noqr
</p>
</div>
<div class="refsect1" lang="en">
-<a name="id2631465"></a><h2>FILES</h2>
+<a name="id2663452"></a><h2>FILES</h2>
<p><code class="filename">/etc/resolv.conf</code>
</p>
<p><code class="filename">${HOME}/.digrc</code>
</p>
</div>
<div class="refsect1" lang="en">
-<a name="id2631486"></a><h2>SEE ALSO</h2>
+<a name="id2663474"></a><h2>SEE ALSO</h2>
<p><span class="citerefentry"><span class="refentrytitle">host</span>(1)</span>,
<span class="citerefentry"><span class="refentrytitle">named</span>(8)</span>,
<span class="citerefentry"><span class="refentrytitle">dnssec-keygen</span>(8)</span>,
@@ -648,7 +654,7 @@ dig +qr www.isc.org any -x 127.0.0.1 isc.org ns +noqr
</p>
</div>
<div class="refsect1" lang="en">
-<a name="id2631524"></a><h2>BUGS</h2>
+<a name="id2663579"></a><h2>BUGS</h2>
<p>
There are probably too many query options.
</p>
diff --git a/contrib/bind9/doc/arm/man.dnssec-dsfromkey.html b/contrib/bind9/doc/arm/man.dnssec-dsfromkey.html
index 245d387..133bfbc 100644
--- a/contrib/bind9/doc/arm/man.dnssec-dsfromkey.html
+++ b/contrib/bind9/doc/arm/man.dnssec-dsfromkey.html
@@ -1,5 +1,5 @@
<!--
- - Copyright (C) 2004-2010 Internet Systems Consortium, Inc. ("ISC")
+ - Copyright (C) 2004-2011 Internet Systems Consortium, Inc. ("ISC")
- Copyright (C) 2000-2003 Internet Software Consortium.
-
- Permission to use, copy, modify, and/or distribute this software for any
@@ -14,7 +14,7 @@
- OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
- PERFORMANCE OF THIS SOFTWARE.
-->
-<!-- $Id: man.dnssec-dsfromkey.html,v 1.6.14.16 2010-08-20 02:05:40 tbox Exp $ -->
+<!-- $Id: man.dnssec-dsfromkey.html,v 1.74.8.1.2.1 2011-06-09 03:41:09 tbox Exp $ -->
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
@@ -47,18 +47,18 @@
</div>
<div class="refsynopsisdiv">
<h2>Synopsis</h2>
-<div class="cmdsynopsis"><p><code class="command">dnssec-dsfromkey</code> [<code class="option">-v <em class="replaceable"><code>level</code></em></code>] [<code class="option">-1</code>] [<code class="option">-2</code>] [<code class="option">-a <em class="replaceable"><code>alg</code></em></code>] {keyfile}</p></div>
-<div class="cmdsynopsis"><p><code class="command">dnssec-dsfromkey</code> {-s} [<code class="option">-v <em class="replaceable"><code>level</code></em></code>] [<code class="option">-1</code>] [<code class="option">-2</code>] [<code class="option">-a <em class="replaceable"><code>alg</code></em></code>] [<code class="option">-c <em class="replaceable"><code>class</code></em></code>] [<code class="option">-d <em class="replaceable"><code>dir</code></em></code>] {dnsname}</p></div>
+<div class="cmdsynopsis"><p><code class="command">dnssec-dsfromkey</code> [<code class="option">-v <em class="replaceable"><code>level</code></em></code>] [<code class="option">-1</code>] [<code class="option">-2</code>] [<code class="option">-a <em class="replaceable"><code>alg</code></em></code>] [<code class="option">-l <em class="replaceable"><code>domain</code></em></code>] {keyfile}</p></div>
+<div class="cmdsynopsis"><p><code class="command">dnssec-dsfromkey</code> {-s} [<code class="option">-1</code>] [<code class="option">-2</code>] [<code class="option">-a <em class="replaceable"><code>alg</code></em></code>] [<code class="option">-K <em class="replaceable"><code>directory</code></em></code>] [<code class="option">-l <em class="replaceable"><code>domain</code></em></code>] [<code class="option">-s</code>] [<code class="option">-c <em class="replaceable"><code>class</code></em></code>] [<code class="option">-f <em class="replaceable"><code>file</code></em></code>] [<code class="option">-A</code>] [<code class="option">-v <em class="replaceable"><code>level</code></em></code>] {dnsname}</p></div>
</div>
<div class="refsect1" lang="en">
-<a name="id2604158"></a><h2>DESCRIPTION</h2>
+<a name="id2611192"></a><h2>DESCRIPTION</h2>
<p><span><strong class="command">dnssec-dsfromkey</strong></span>
outputs the Delegation Signer (DS) resource record (RR), as defined in
RFC 3658 and RFC 4509, for the given key(s).
</p>
</div>
<div class="refsect1" lang="en">
-<a name="id2604172"></a><h2>OPTIONS</h2>
+<a name="id2611411"></a><h2>OPTIONS</h2>
<div class="variablelist"><dl>
<dt><span class="term">-1</span></dt>
<dd><p>
@@ -72,34 +72,54 @@
<dt><span class="term">-a <em class="replaceable"><code>algorithm</code></em></span></dt>
<dd><p>
Select the digest algorithm. The value of
- <code class="option">algorithm</code> must be one of SHA-1 (SHA1) or
- SHA-256 (SHA256). These values are case insensitive.
+ <code class="option">algorithm</code> must be one of SHA-1 (SHA1),
+ SHA-256 (SHA256) or GOST. These values are case insensitive.
</p></dd>
-<dt><span class="term">-v <em class="replaceable"><code>level</code></em></span></dt>
+<dt><span class="term">-K <em class="replaceable"><code>directory</code></em></span></dt>
<dd><p>
- Sets the debugging level.
+ Look for key files (or, in keyset mode,
+ <code class="filename">keyset-</code> files) in
+ <code class="option">directory</code>.
+ </p></dd>
+<dt><span class="term">-f <em class="replaceable"><code>file</code></em></span></dt>
+<dd><p>
+ Zone file mode: in place of the keyfile name, the argument is
+ the DNS domain name of a zone master file, which can be read
+ from <code class="option">file</code>. If the zone name is the same as
+ <code class="option">file</code>, then it may be omitted.
+ </p></dd>
+<dt><span class="term">-A</span></dt>
+<dd><p>
+ Include ZSK's when generating DS records. Without this option,
+ only keys which have the KSK flag set will be converted to DS
+ records and printed. Useful only in zone file mode.
+ </p></dd>
+<dt><span class="term">-l <em class="replaceable"><code>domain</code></em></span></dt>
+<dd><p>
+ Generate a DLV set instead of a DS set. The specified
+ <code class="option">domain</code> is appended to the name for each
+ record in the set.
+ The DNSSEC Lookaside Validation (DLV) RR is described
+ in RFC 4431.
</p></dd>
<dt><span class="term">-s</span></dt>
<dd><p>
Keyset mode: in place of the keyfile name, the argument is
- the DNS domain name of a keyset file. Following options make sense
- only in this mode.
+ the DNS domain name of a keyset file.
</p></dd>
<dt><span class="term">-c <em class="replaceable"><code>class</code></em></span></dt>
<dd><p>
- Specifies the DNS class (default is IN), useful only
- in the keyset mode.
+ Specifies the DNS class (default is IN). Useful only
+ in keyset or zone file mode.
</p></dd>
-<dt><span class="term">-d <em class="replaceable"><code>directory</code></em></span></dt>
+<dt><span class="term">-v <em class="replaceable"><code>level</code></em></span></dt>
<dd><p>
- Look for <code class="filename">keyset</code> files in
- <code class="option">directory</code> as the directory, ignored when
- not in the keyset mode.
+ Sets the debugging level.
</p></dd>
</dl></div>
</div>
<div class="refsect1" lang="en">
-<a name="id2604302"></a><h2>EXAMPLE</h2>
+<a name="id2611600"></a><h2>EXAMPLE</h2>
<p>
To build the SHA-256 DS RR from the
<strong class="userinput"><code>Kexample.com.+003+26160</code></strong>
@@ -114,7 +134,7 @@
</p>
</div>
<div class="refsect1" lang="en">
-<a name="id2604407"></a><h2>FILES</h2>
+<a name="id2612114"></a><h2>FILES</h2>
<p>
The keyfile can be designed by the key identification
<code class="filename">Knnnn.+aaa+iiiii</code> or the full file name
@@ -128,22 +148,23 @@
</p>
</div>
<div class="refsect1" lang="en">
-<a name="id2604449"></a><h2>CAVEAT</h2>
+<a name="id2612155"></a><h2>CAVEAT</h2>
<p>
A keyfile error can give a "file not found" even if the file exists.
</p>
</div>
<div class="refsect1" lang="en">
-<a name="id2604458"></a><h2>SEE ALSO</h2>
+<a name="id2612165"></a><h2>SEE ALSO</h2>
<p><span class="citerefentry"><span class="refentrytitle">dnssec-keygen</span>(8)</span>,
<span class="citerefentry"><span class="refentrytitle">dnssec-signzone</span>(8)</span>,
<em class="citetitle">BIND 9 Administrator Reference Manual</em>,
<em class="citetitle">RFC 3658</em>,
+ <em class="citetitle">RFC 4431</em>.
<em class="citetitle">RFC 4509</em>.
</p>
</div>
<div class="refsect1" lang="en">
-<a name="id2604494"></a><h2>AUTHOR</h2>
+<a name="id2612204"></a><h2>AUTHOR</h2>
<p><span class="corpauthor">Internet Systems Consortium</span>
</p>
</div>
diff --git a/contrib/bind9/doc/arm/man.dnssec-keyfromlabel.html b/contrib/bind9/doc/arm/man.dnssec-keyfromlabel.html
index 4a28c5e..670c85a 100644
--- a/contrib/bind9/doc/arm/man.dnssec-keyfromlabel.html
+++ b/contrib/bind9/doc/arm/man.dnssec-keyfromlabel.html
@@ -1,5 +1,5 @@
<!--
- - Copyright (C) 2004-2010 Internet Systems Consortium, Inc. ("ISC")
+ - Copyright (C) 2004-2011 Internet Systems Consortium, Inc. ("ISC")
- Copyright (C) 2000-2003 Internet Software Consortium.
-
- Permission to use, copy, modify, and/or distribute this software for any
@@ -14,7 +14,7 @@
- OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
- PERFORMANCE OF THIS SOFTWARE.
-->
-<!-- $Id: man.dnssec-keyfromlabel.html,v 1.31.14.19 2010-08-20 02:05:37 tbox Exp $ -->
+<!-- $Id: man.dnssec-keyfromlabel.html,v 1.110.8.1.2.1 2011-06-09 03:41:09 tbox Exp $ -->
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
@@ -47,26 +47,30 @@
</div>
<div class="refsynopsisdiv">
<h2>Synopsis</h2>
-<div class="cmdsynopsis"><p><code class="command">dnssec-keyfromlabel</code> {-a <em class="replaceable"><code>algorithm</code></em>} {-l <em class="replaceable"><code>label</code></em>} [<code class="option">-c <em class="replaceable"><code>class</code></em></code>] [<code class="option">-f <em class="replaceable"><code>flag</code></em></code>] [<code class="option">-k</code>] [<code class="option">-n <em class="replaceable"><code>nametype</code></em></code>] [<code class="option">-p <em class="replaceable"><code>protocol</code></em></code>] [<code class="option">-t <em class="replaceable"><code>type</code></em></code>] [<code class="option">-v <em class="replaceable"><code>level</code></em></code>] {name}</p></div>
+<div class="cmdsynopsis"><p><code class="command">dnssec-keyfromlabel</code> {-l <em class="replaceable"><code>label</code></em>} [<code class="option">-3</code>] [<code class="option">-a <em class="replaceable"><code>algorithm</code></em></code>] [<code class="option">-A <em class="replaceable"><code>date/offset</code></em></code>] [<code class="option">-c <em class="replaceable"><code>class</code></em></code>] [<code class="option">-D <em class="replaceable"><code>date/offset</code></em></code>] [<code class="option">-E <em class="replaceable"><code>engine</code></em></code>] [<code class="option">-f <em class="replaceable"><code>flag</code></em></code>] [<code class="option">-G</code>] [<code class="option">-I <em class="replaceable"><code>date/offset</code></em></code>] [<code class="option">-k</code>] [<code class="option">-K <em class="replaceable"><code>directory</code></em></code>] [<code class="option">-n <em class="replaceable"><code>nametype</code></em></code>] [<code class="option">-P <em class="replaceable"><code>date/offset</code></em></code>] [<code class="option">-p <em class="replaceable"><code>protocol</code></em></code>] [<code class="option">-R <em class="replaceable"><code>date/offset</code></em></code>] [<code class="option">-t <em class="replaceable"><code>type</code></em></code>] [<code class="option">-v <em class="replaceable"><code>level</code></em></code>] [<code class="option">-y</code>] {name}</p></div>
</div>
<div class="refsect1" lang="en">
-<a name="id2604823"></a><h2>DESCRIPTION</h2>
+<a name="id2612785"></a><h2>DESCRIPTION</h2>
<p><span><strong class="command">dnssec-keyfromlabel</strong></span>
gets keys with the given label from a crypto hardware and builds
key files for DNSSEC (Secure DNS), as defined in RFC 2535
and RFC 4034.
</p>
+<p>
+ The <code class="option">name</code> of the key is specified on the command
+ line. This must match the name of the zone for which the key is
+ being generated.
+ </p>
</div>
<div class="refsect1" lang="en">
-<a name="id2604837"></a><h2>OPTIONS</h2>
+<a name="id2612805"></a><h2>OPTIONS</h2>
<div class="variablelist"><dl>
<dt><span class="term">-a <em class="replaceable"><code>algorithm</code></em></span></dt>
<dd>
<p>
Selects the cryptographic algorithm. The value of
- <code class="option">algorithm</code> must be one of RSAMD5,
- RSASHA1, DSA, NSEC3RSASHA1, NSEC3DSA, RSASHA256,
- RSASHA512 or DH (Diffie Hellman).
+ <code class="option">algorithm</code> must be one of RSAMD5, RSASHA1,
+ DSA, NSEC3RSASHA1, NSEC3DSA, RSASHA256, RSASHA512 or ECCGOST.
These values are case insensitive.
</p>
<p>
@@ -84,10 +88,23 @@
Note 2: DH automatically sets the -k flag.
</p>
</dd>
+<dt><span class="term">-3</span></dt>
+<dd><p>
+ Use an NSEC3-capable algorithm to generate a DNSSEC key.
+ If this option is used and no algorithm is explicitly
+ set on the command line, NSEC3RSASHA1 will be used by
+ default.
+ </p></dd>
+<dt><span class="term">-E <em class="replaceable"><code>engine</code></em></span></dt>
+<dd><p>
+ Specifies the name of the crypto hardware (OpenSSL engine).
+ When compiled with PKCS#11 support it defaults to "pkcs11".
+ </p></dd>
<dt><span class="term">-l <em class="replaceable"><code>label</code></em></span></dt>
<dd><p>
- Specifies the label of keys in the crypto hardware
- (PKCS#11 device).
+ Specifies the label of the key pair in the crypto hardware.
+ The label may be preceded by an optional OpenSSL engine name,
+ separated by a colon, as in "pkcs11:keylabel".
</p></dd>
<dt><span class="term">-n <em class="replaceable"><code>nametype</code></em></span></dt>
<dd><p>
@@ -96,8 +113,17 @@
zone key (KEY/DNSKEY)), HOST or ENTITY (for a key associated with
a host (KEY)),
USER (for a key associated with a user(KEY)) or OTHER (DNSKEY).
- These values are
- case insensitive.
+ These values are case insensitive.
+ </p></dd>
+<dt><span class="term">-C</span></dt>
+<dd><p>
+ Compatibility mode: generates an old-style key, without
+ any metadata. By default, <span><strong class="command">dnssec-keyfromlabel</strong></span>
+ will include the key's creation date in the metadata stored
+ with the private key, and other dates may be set there as well
+ (publication date, activation date, etc). Keys that include
+ this data may be incompatible with older versions of BIND; the
+ <code class="option">-C</code> option suppresses them.
</p></dd>
<dt><span class="term">-c <em class="replaceable"><code>class</code></em></span></dt>
<dd><p>
@@ -107,12 +133,21 @@
<dt><span class="term">-f <em class="replaceable"><code>flag</code></em></span></dt>
<dd><p>
Set the specified flag in the flag field of the KEY/DNSKEY record.
- The only recognized flag is KSK (Key Signing Key) DNSKEY.
+ The only recognized flags are KSK (Key Signing Key) and REVOKE.
+ </p></dd>
+<dt><span class="term">-G</span></dt>
+<dd><p>
+ Generate a key, but do not publish it or sign with it. This
+ option is incompatible with -P and -A.
</p></dd>
<dt><span class="term">-h</span></dt>
<dd><p>
Prints a short summary of the options and arguments to
- <span><strong class="command">dnssec-keygen</strong></span>.
+ <span><strong class="command">dnssec-keyfromlabel</strong></span>.
+ </p></dd>
+<dt><span class="term">-K <em class="replaceable"><code>directory</code></em></span></dt>
+<dd><p>
+ Sets the directory in which the key files are to be written.
</p></dd>
<dt><span class="term">-k</span></dt>
<dd><p>
@@ -120,7 +155,7 @@
</p></dd>
<dt><span class="term">-p <em class="replaceable"><code>protocol</code></em></span></dt>
<dd><p>
- Sets the protocol value for the generated key. The protocol
+ Sets the protocol value for the key. The protocol
is a number between 0 and 255. The default is 3 (DNSSEC).
Other possible values for this argument are listed in
RFC 2535 and its successors.
@@ -136,10 +171,65 @@
<dd><p>
Sets the debugging level.
</p></dd>
+<dt><span class="term">-y</span></dt>
+<dd><p>
+ Allows DNSSEC key files to be generated even if the key ID
+ would collide with that of an existing key, in the event of
+ either key being revoked. (This is only safe to use if you
+ are sure you won't be using RFC 5011 trust anchor maintenance
+ with either of the keys involved.)
+ </p></dd>
+</dl></div>
+</div>
+<div class="refsect1" lang="en">
+<a name="id2613241"></a><h2>TIMING OPTIONS</h2>
+<p>
+ Dates can be expressed in the format YYYYMMDD or YYYYMMDDHHMMSS.
+ If the argument begins with a '+' or '-', it is interpreted as
+ an offset from the present time. For convenience, if such an offset
+ is followed by one of the suffixes 'y', 'mo', 'w', 'd', 'h', or 'mi',
+ then the offset is computed in years (defined as 365 24-hour days,
+ ignoring leap years), months (defined as 30 24-hour days), weeks,
+ days, hours, or minutes, respectively. Without a suffix, the offset
+ is computed in seconds.
+ </p>
+<div class="variablelist"><dl>
+<dt><span class="term">-P <em class="replaceable"><code>date/offset</code></em></span></dt>
+<dd><p>
+ Sets the date on which a key is to be published to the zone.
+ After that date, the key will be included in the zone but will
+ not be used to sign it. If not set, and if the -G option has
+ not been used, the default is "now".
+ </p></dd>
+<dt><span class="term">-A <em class="replaceable"><code>date/offset</code></em></span></dt>
+<dd><p>
+ Sets the date on which the key is to be activated. After that
+ date, the key will be included in the zone and used to sign
+ it. If not set, and if the -G option has not been used, the
+ default is "now".
+ </p></dd>
+<dt><span class="term">-R <em class="replaceable"><code>date/offset</code></em></span></dt>
+<dd><p>
+ Sets the date on which the key is to be revoked. After that
+ date, the key will be flagged as revoked. It will be included
+ in the zone and will be used to sign it.
+ </p></dd>
+<dt><span class="term">-I <em class="replaceable"><code>date/offset</code></em></span></dt>
+<dd><p>
+ Sets the date on which the key is to be retired. After that
+ date, the key will still be included in the zone, but it
+ will not be used to sign it.
+ </p></dd>
+<dt><span class="term">-D <em class="replaceable"><code>date/offset</code></em></span></dt>
+<dd><p>
+ Sets the date on which the key is to be deleted. After that
+ date, the key will no longer be included in the zone. (It
+ may remain in the key repository, however.)
+ </p></dd>
</dl></div>
</div>
<div class="refsect1" lang="en">
-<a name="id2605316"></a><h2>GENERATED KEY FILES</h2>
+<a name="id2615114"></a><h2>GENERATED KEY FILES</h2>
<p>
When <span><strong class="command">dnssec-keyfromlabel</strong></span> completes
successfully,
@@ -151,8 +241,7 @@
<li><p><code class="filename">nnnn</code> is the key name.
</p></li>
<li><p><code class="filename">aaa</code> is the numeric representation
- of the
- algorithm.
+ of the algorithm.
</p></li>
<li><p><code class="filename">iiiii</code> is the key identifier (or
footprint).
@@ -163,8 +252,7 @@
on the printed string. <code class="filename">Knnnn.+aaa+iiiii.key</code>
contains the public key, and
<code class="filename">Knnnn.+aaa+iiiii.private</code> contains the
- private
- key.
+ private key.
</p>
<p>
The <code class="filename">.key</code> file contains a DNS KEY record
@@ -173,14 +261,14 @@
statement).
</p>
<p>
- The <code class="filename">.private</code> file contains algorithm
- specific
+ The <code class="filename">.private</code> file contains
+ algorithm-specific
fields. For obvious security reasons, this file does not have
general read permission.
</p>
</div>
<div class="refsect1" lang="en">
-<a name="id2605410"></a><h2>SEE ALSO</h2>
+<a name="id2666203"></a><h2>SEE ALSO</h2>
<p><span class="citerefentry"><span class="refentrytitle">dnssec-keygen</span>(8)</span>,
<span class="citerefentry"><span class="refentrytitle">dnssec-signzone</span>(8)</span>,
<em class="citetitle">BIND 9 Administrator Reference Manual</em>,
@@ -188,7 +276,7 @@
</p>
</div>
<div class="refsect1" lang="en">
-<a name="id2605443"></a><h2>AUTHOR</h2>
+<a name="id2666236"></a><h2>AUTHOR</h2>
<p><span class="corpauthor">Internet Systems Consortium</span>
</p>
</div>
diff --git a/contrib/bind9/doc/arm/man.dnssec-keygen.html b/contrib/bind9/doc/arm/man.dnssec-keygen.html
index d775f56..3d63f8e 100644
--- a/contrib/bind9/doc/arm/man.dnssec-keygen.html
+++ b/contrib/bind9/doc/arm/man.dnssec-keygen.html
@@ -1,5 +1,5 @@
<!--
- - Copyright (C) 2004-2010 Internet Systems Consortium, Inc. ("ISC")
+ - Copyright (C) 2004-2011 Internet Systems Consortium, Inc. ("ISC")
- Copyright (C) 2000-2003 Internet Software Consortium.
-
- Permission to use, copy, modify, and/or distribute this software for any
@@ -14,7 +14,7 @@
- OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
- PERFORMANCE OF THIS SOFTWARE.
-->
-<!-- $Id: man.dnssec-keygen.html,v 1.97.14.19 2010-08-20 02:05:37 tbox Exp $ -->
+<!-- $Id: man.dnssec-keygen.html,v 1.179.8.1.2.1 2011-06-09 03:41:09 tbox Exp $ -->
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
@@ -23,7 +23,7 @@
<link rel="start" href="Bv9ARM.html" title="BIND 9 Administrator Reference Manual">
<link rel="up" href="Bv9ARM.ch10.html" title="Manual pages">
<link rel="prev" href="man.dnssec-keyfromlabel.html" title="dnssec-keyfromlabel">
-<link rel="next" href="man.dnssec-signzone.html" title="dnssec-signzone">
+<link rel="next" href="man.dnssec-revoke.html" title="dnssec-revoke">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
<div class="navheader">
@@ -33,7 +33,7 @@
<td width="20%" align="left">
<a accesskey="p" href="man.dnssec-keyfromlabel.html">Prev</a> </td>
<th width="60%" align="center">Manual pages</th>
-<td width="20%" align="right"> <a accesskey="n" href="man.dnssec-signzone.html">Next</a>
+<td width="20%" align="right"> <a accesskey="n" href="man.dnssec-revoke.html">Next</a>
</td>
</tr>
</table>
@@ -47,14 +47,15 @@
</div>
<div class="refsynopsisdiv">
<h2>Synopsis</h2>
-<div class="cmdsynopsis"><p><code class="command">dnssec-keygen</code> {-a <em class="replaceable"><code>algorithm</code></em>} {-b <em class="replaceable"><code>keysize</code></em>} {-n <em class="replaceable"><code>nametype</code></em>} [<code class="option">-c <em class="replaceable"><code>class</code></em></code>] [<code class="option">-e</code>] [<code class="option">-f <em class="replaceable"><code>flag</code></em></code>] [<code class="option">-g <em class="replaceable"><code>generator</code></em></code>] [<code class="option">-h</code>] [<code class="option">-k</code>] [<code class="option">-p <em class="replaceable"><code>protocol</code></em></code>] [<code class="option">-r <em class="replaceable"><code>randomdev</code></em></code>] [<code class="option">-s <em class="replaceable"><code>strength</code></em></code>] [<code class="option">-t <em class="replaceable"><code>type</code></em></code>] [<code class="option">-v <em class="replaceable"><code>level</code></em></code>] {name}</p></div>
+<div class="cmdsynopsis"><p><code class="command">dnssec-keygen</code> [<code class="option">-a <em class="replaceable"><code>algorithm</code></em></code>] [<code class="option">-b <em class="replaceable"><code>keysize</code></em></code>] [<code class="option">-n <em class="replaceable"><code>nametype</code></em></code>] [<code class="option">-3</code>] [<code class="option">-A <em class="replaceable"><code>date/offset</code></em></code>] [<code class="option">-C</code>] [<code class="option">-c <em class="replaceable"><code>class</code></em></code>] [<code class="option">-D <em class="replaceable"><code>date/offset</code></em></code>] [<code class="option">-E <em class="replaceable"><code>engine</code></em></code>] [<code class="option">-e</code>] [<code class="option">-f <em class="replaceable"><code>flag</code></em></code>] [<code class="option">-G</code>] [<code class="option">-g <em class="replaceable"><code>generator</code></em></code>] [<code class="option">-h</code>] [<code class="option">-I <em class="replaceable"><code>date/offset</code></em></code>] [<code class="option">-i <em class="replaceable"><code>interval</code></em></code>] [<code class="option">-K <em class="replaceable"><code>directory</code></em></code>] [<code class="option">-k</code>] [<code class="option">-P <em class="replaceable"><code>date/offset</code></em></code>] [<code class="option">-p <em class="replaceable"><code>protocol</code></em></code>] [<code class="option">-q</code>] [<code class="option">-R <em class="replaceable"><code>date/offset</code></em></code>] [<code class="option">-r <em class="replaceable"><code>randomdev</code></em></code>] [<code class="option">-S <em class="replaceable"><code>key</code></em></code>] [<code class="option">-s <em class="replaceable"><code>strength</code></em></code>] [<code class="option">-t <em class="replaceable"><code>type</code></em></code>] [<code class="option">-v <em class="replaceable"><code>level</code></em></code>] [<code class="option">-z</code>] {name}</p></div>
</div>
<div class="refsect1" lang="en">
-<a name="id2605897"></a><h2>DESCRIPTION</h2>
+<a name="id2614215"></a><h2>DESCRIPTION</h2>
<p><span><strong class="command">dnssec-keygen</strong></span>
generates keys for DNSSEC (Secure DNS), as defined in RFC 2535
and RFC 4034. It can also generate keys for use with
- TSIG (Transaction Signatures), as defined in RFC 2845.
+ TSIG (Transaction Signatures) as defined in RFC 2845, or TKEY
+ (Transaction Key) as defined in RFC 2930.
</p>
<p>
The <code class="option">name</code> of the key is specified on the command
@@ -63,37 +64,56 @@
</p>
</div>
<div class="refsect1" lang="en">
-<a name="id2605917"></a><h2>OPTIONS</h2>
+<a name="id2614235"></a><h2>OPTIONS</h2>
<div class="variablelist"><dl>
<dt><span class="term">-a <em class="replaceable"><code>algorithm</code></em></span></dt>
<dd>
<p>
Selects the cryptographic algorithm. For DNSSEC keys, the value
of <code class="option">algorithm</code> must be one of RSAMD5, RSASHA1,
- DSA, NSEC3RSASHA1, NSEC3DSA, RSASHA256 or RSASHA512.
- For TSIG/TKEY, the value must
+ DSA, NSEC3RSASHA1, NSEC3DSA, RSASHA256, RSASHA512 or ECCGOST.
+ For TSIG/TKEY, the value must
be DH (Diffie Hellman), HMAC-MD5, HMAC-SHA1, HMAC-SHA224,
HMAC-SHA256, HMAC-SHA384, or HMAC-SHA512. These values are
case insensitive.
</p>
<p>
+ If no algorithm is specified, then RSASHA1 will be used by
+ default, unless the <code class="option">-3</code> option is specified,
+ in which case NSEC3RSASHA1 will be used instead. (If
+ <code class="option">-3</code> is used and an algorithm is specified,
+ that algorithm will be checked for compatibility with NSEC3.)
+ </p>
+<p>
Note 1: that for DNSSEC, RSASHA1 is a mandatory to implement
algorithm, and DSA is recommended. For TSIG, HMAC-MD5 is
mandatory.
</p>
<p>
- Note 2: HMAC-MD5 and DH automatically set the -k flag.
+ Note 2: DH, HMAC-MD5, and HMAC-SHA1 through HMAC-SHA512
+ automatically set the -T KEY option.
</p>
</dd>
<dt><span class="term">-b <em class="replaceable"><code>keysize</code></em></span></dt>
-<dd><p>
+<dd>
+<p>
Specifies the number of bits in the key. The choice of key
size depends on the algorithm used. RSA keys must be
between 512 and 2048 bits. Diffie Hellman keys must be between
128 and 4096 bits. DSA keys must be between 512 and 1024
bits and an exact multiple of 64. HMAC keys must be
between 1 and 512 bits.
- </p></dd>
+ </p>
+<p>
+ The key size does not need to be specified if using a default
+ algorithm. The default key size is 1024 bits for zone signing
+ keys (ZSK's) and 2048 bits for key signing keys (KSK's,
+ generated with <code class="option">-f KSK</code>). However, if an
+ algorithm is explicitly specified with the <code class="option">-a</code>,
+ then there is no default key size, and the <code class="option">-b</code>
+ must be used.
+ </p>
+</dd>
<dt><span class="term">-n <em class="replaceable"><code>nametype</code></em></span></dt>
<dd><p>
Specifies the owner type of the key. The value of
@@ -104,11 +124,36 @@
These values are case insensitive. Defaults to ZONE for DNSKEY
generation.
</p></dd>
+<dt><span class="term">-3</span></dt>
+<dd><p>
+ Use an NSEC3-capable algorithm to generate a DNSSEC key.
+ If this option is used and no algorithm is explicitly
+ set on the command line, NSEC3RSASHA1 will be used by
+ default. Note that RSASHA256, RSASHA512 and ECCGOST algorithms
+ are NSEC3-capable.
+ </p></dd>
+<dt><span class="term">-C</span></dt>
+<dd><p>
+ Compatibility mode: generates an old-style key, without
+ any metadata. By default, <span><strong class="command">dnssec-keygen</strong></span>
+ will include the key's creation date in the metadata stored
+ with the private key, and other dates may be set there as well
+ (publication date, activation date, etc). Keys that include
+ this data may be incompatible with older versions of BIND; the
+ <code class="option">-C</code> option suppresses them.
+ </p></dd>
<dt><span class="term">-c <em class="replaceable"><code>class</code></em></span></dt>
<dd><p>
Indicates that the DNS record containing the key should have
the specified class. If not specified, class IN is used.
</p></dd>
+<dt><span class="term">-E <em class="replaceable"><code>engine</code></em></span></dt>
+<dd><p>
+ Uses a crypto hardware (OpenSSL engine) for random number
+ and, when supported, key generation. When compiled with PKCS#11
+ support it defaults to pkcs11; the empty name resets it to
+ no engine.
+ </p></dd>
<dt><span class="term">-e</span></dt>
<dd><p>
If generating an RSAMD5/RSASHA1 key, use a large exponent.
@@ -116,7 +161,12 @@
<dt><span class="term">-f <em class="replaceable"><code>flag</code></em></span></dt>
<dd><p>
Set the specified flag in the flag field of the KEY/DNSKEY record.
- The only recognized flag is KSK (Key Signing Key) DNSKEY.
+ The only recognized flags are KSK (Key Signing Key) and REVOKE.
+ </p></dd>
+<dt><span class="term">-G</span></dt>
+<dd><p>
+ Generate a key, but do not publish it or sign with it. This
+ option is incompatible with -P and -A.
</p></dd>
<dt><span class="term">-g <em class="replaceable"><code>generator</code></em></span></dt>
<dd><p>
@@ -130,9 +180,13 @@
Prints a short summary of the options and arguments to
<span><strong class="command">dnssec-keygen</strong></span>.
</p></dd>
+<dt><span class="term">-K <em class="replaceable"><code>directory</code></em></span></dt>
+<dd><p>
+ Sets the directory in which the key files are to be written.
+ </p></dd>
<dt><span class="term">-k</span></dt>
<dd><p>
- Generate KEY records rather than DNSKEY records.
+ Deprecated in favor of -T KEY.
</p></dd>
<dt><span class="term">-p <em class="replaceable"><code>protocol</code></em></span></dt>
<dd><p>
@@ -141,6 +195,20 @@
Other possible values for this argument are listed in
RFC 2535 and its successors.
</p></dd>
+<dt><span class="term">-q</span></dt>
+<dd><p>
+ Quiet mode: Suppresses unnecessary output, including
+ progress indication. Without this option, when
+ <span><strong class="command">dnssec-keygen</strong></span> is run interactively
+ to generate an RSA or DSA key pair, it will print a string
+ of symbols to <code class="filename">stderr</code> indicating the
+ progress of the key generation. A '.' indicates that a
+ random number has been found which passed an initial
+ sieve test; '+' means a number has passed a single
+ round of the Miller-Rabin primality test; a space
+ means that the number has passed all the tests and is
+ a satisfactory key.
+ </p></dd>
<dt><span class="term">-r <em class="replaceable"><code>randomdev</code></em></span></dt>
<dd><p>
Specifies the source of randomness. If the operating
@@ -153,12 +221,37 @@
<code class="filename">keyboard</code> indicates that keyboard
input should be used.
</p></dd>
+<dt><span class="term">-S <em class="replaceable"><code>key</code></em></span></dt>
+<dd><p>
+ Create a new key which is an explicit successor to an
+ existing key. The name, algorithm, size, and type of the
+ key will be set to match the existing key. The activation
+ date of the new key will be set to the inactivation date of
+ the existing one. The publication date will be set to the
+ activation date minus the prepublication interval, which
+ defaults to 30 days.
+ </p></dd>
<dt><span class="term">-s <em class="replaceable"><code>strength</code></em></span></dt>
<dd><p>
Specifies the strength value of the key. The strength is
a number between 0 and 15, and currently has no defined
purpose in DNSSEC.
</p></dd>
+<dt><span class="term">-T <em class="replaceable"><code>rrtype</code></em></span></dt>
+<dd>
+<p>
+ Specifies the resource record type to use for the key.
+ <code class="option">rrtype</code> must be either DNSKEY or KEY. The
+ default is DNSKEY when using a DNSSEC algorithm, but it can be
+ overridden to KEY for use with SIG(0).
+ </p>
+<p>
+ </p>
+<p>
+ Using any TSIG algorithm (HMAC-* or DH) forces this option
+ to KEY.
+ </p>
+</dd>
<dt><span class="term">-t <em class="replaceable"><code>type</code></em></span></dt>
<dd><p>
Indicates the use of the key. <code class="option">type</code> must be
@@ -173,7 +266,78 @@
</dl></div>
</div>
<div class="refsect1" lang="en">
-<a name="id2606397"></a><h2>GENERATED KEYS</h2>
+<a name="id2667657"></a><h2>TIMING OPTIONS</h2>
+<p>
+ Dates can be expressed in the format YYYYMMDD or YYYYMMDDHHMMSS.
+ If the argument begins with a '+' or '-', it is interpreted as
+ an offset from the present time. For convenience, if such an offset
+ is followed by one of the suffixes 'y', 'mo', 'w', 'd', 'h', or 'mi',
+ then the offset is computed in years (defined as 365 24-hour days,
+ ignoring leap years), months (defined as 30 24-hour days), weeks,
+ days, hours, or minutes, respectively. Without a suffix, the offset
+ is computed in seconds.
+ </p>
+<div class="variablelist"><dl>
+<dt><span class="term">-P <em class="replaceable"><code>date/offset</code></em></span></dt>
+<dd><p>
+ Sets the date on which a key is to be published to the zone.
+ After that date, the key will be included in the zone but will
+ not be used to sign it. If not set, and if the -G option has
+ not been used, the default is "now".
+ </p></dd>
+<dt><span class="term">-A <em class="replaceable"><code>date/offset</code></em></span></dt>
+<dd><p>
+ Sets the date on which the key is to be activated. After that
+ date, the key will be included in the zone and used to sign
+ it. If not set, and if the -G option has not been used, the
+ default is "now".
+ </p></dd>
+<dt><span class="term">-R <em class="replaceable"><code>date/offset</code></em></span></dt>
+<dd><p>
+ Sets the date on which the key is to be revoked. After that
+ date, the key will be flagged as revoked. It will be included
+ in the zone and will be used to sign it.
+ </p></dd>
+<dt><span class="term">-I <em class="replaceable"><code>date/offset</code></em></span></dt>
+<dd><p>
+ Sets the date on which the key is to be retired. After that
+ date, the key will still be included in the zone, but it
+ will not be used to sign it.
+ </p></dd>
+<dt><span class="term">-D <em class="replaceable"><code>date/offset</code></em></span></dt>
+<dd><p>
+ Sets the date on which the key is to be deleted. After that
+ date, the key will no longer be included in the zone. (It
+ may remain in the key repository, however.)
+ </p></dd>
+<dt><span class="term">-i <em class="replaceable"><code>interval</code></em></span></dt>
+<dd>
+<p>
+ Sets the prepublication interval for a key. If set, then
+ the publication and activation dates must be separated by at least
+ this much time. If the activation date is specified but the
+ publication date isn't, then the publication date will default
+ to this much time before the activation date; conversely, if
+ the publication date is specified but activation date isn't,
+ then activation will be set to this much time after publication.
+ </p>
+<p>
+ If the key is being created as an explicit successor to another
+ key, then the default prepublication interval is 30 days;
+ otherwise it is zero.
+ </p>
+<p>
+ As with date offsets, if the argument is followed by one of
+ the suffixes 'y', 'mo', 'w', 'd', 'h', or 'mi', then the
+ interval is measured in years, months, weeks, days, hours,
+ or minutes, respectively. Without a suffix, the interval is
+ measured in seconds.
+ </p>
+</dd>
+</dl></div>
+</div>
+<div class="refsect1" lang="en">
+<a name="id2667847"></a><h2>GENERATED KEYS</h2>
<p>
When <span><strong class="command">dnssec-keygen</strong></span> completes
successfully,
@@ -219,7 +383,7 @@
</p>
</div>
<div class="refsect1" lang="en">
-<a name="id2606505"></a><h2>EXAMPLE</h2>
+<a name="id2667955"></a><h2>EXAMPLE</h2>
<p>
To generate a 768-bit DSA key for the domain
<strong class="userinput"><code>example.com</code></strong>, the following command would be
@@ -240,7 +404,7 @@
</p>
</div>
<div class="refsect1" lang="en">
-<a name="id2608814"></a><h2>SEE ALSO</h2>
+<a name="id2668080"></a><h2>SEE ALSO</h2>
<p><span class="citerefentry"><span class="refentrytitle">dnssec-signzone</span>(8)</span>,
<em class="citetitle">BIND 9 Administrator Reference Manual</em>,
<em class="citetitle">RFC 2539</em>,
@@ -249,7 +413,7 @@
</p>
</div>
<div class="refsect1" lang="en">
-<a name="id2608845"></a><h2>AUTHOR</h2>
+<a name="id2668110"></a><h2>AUTHOR</h2>
<p><span class="corpauthor">Internet Systems Consortium</span>
</p>
</div>
@@ -261,14 +425,14 @@
<td width="40%" align="left">
<a accesskey="p" href="man.dnssec-keyfromlabel.html">Prev</a> </td>
<td width="20%" align="center"><a accesskey="u" href="Bv9ARM.ch10.html">Up</a></td>
-<td width="40%" align="right"> <a accesskey="n" href="man.dnssec-signzone.html">Next</a>
+<td width="40%" align="right"> <a accesskey="n" href="man.dnssec-revoke.html">Next</a>
</td>
</tr>
<tr>
<td width="40%" align="left" valign="top">
<span class="application">dnssec-keyfromlabel</span> </td>
<td width="20%" align="center"><a accesskey="h" href="Bv9ARM.html">Home</a></td>
-<td width="40%" align="right" valign="top"> <span class="application">dnssec-signzone</span>
+<td width="40%" align="right" valign="top"> <span class="application">dnssec-revoke</span>
</td>
</tr>
</table>
diff --git a/contrib/bind9/doc/arm/man.dnssec-revoke.html b/contrib/bind9/doc/arm/man.dnssec-revoke.html
new file mode 100644
index 0000000..1c9ba5a
--- /dev/null
+++ b/contrib/bind9/doc/arm/man.dnssec-revoke.html
@@ -0,0 +1,126 @@
+<!--
+ - Copyright (C) 2004-2011 Internet Systems Consortium, Inc. ("ISC")
+ - Copyright (C) 2000-2003 Internet Software Consortium.
+ -
+ - Permission to use, copy, modify, and/or 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 ISC DISCLAIMS ALL WARRANTIES WITH
+ - REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+ - AND FITNESS. IN NO EVENT SHALL ISC 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.
+-->
+<!-- $Id: man.dnssec-revoke.html,v 1.62.8.1.2.1 2011-06-09 03:41:09 tbox Exp $ -->
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
+<title>dnssec-revoke</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.71.1">
+<link rel="start" href="Bv9ARM.html" title="BIND 9 Administrator Reference Manual">
+<link rel="up" href="Bv9ARM.ch10.html" title="Manual pages">
+<link rel="prev" href="man.dnssec-keygen.html" title="dnssec-keygen">
+<link rel="next" href="man.dnssec-settime.html" title="dnssec-settime">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<div class="navheader">
+<table width="100%" summary="Navigation header">
+<tr><th colspan="3" align="center"><span class="application">dnssec-revoke</span></th></tr>
+<tr>
+<td width="20%" align="left">
+<a accesskey="p" href="man.dnssec-keygen.html">Prev</a> </td>
+<th width="60%" align="center">Manual pages</th>
+<td width="20%" align="right"> <a accesskey="n" href="man.dnssec-settime.html">Next</a>
+</td>
+</tr>
+</table>
+<hr>
+</div>
+<div class="refentry" lang="en">
+<a name="man.dnssec-revoke"></a><div class="titlepage"></div>
+<div class="refnamediv">
+<h2>Name</h2>
+<p><span class="application">dnssec-revoke</span> &#8212; Set the REVOKED bit on a DNSSEC key</p>
+</div>
+<div class="refsynopsisdiv">
+<h2>Synopsis</h2>
+<div class="cmdsynopsis"><p><code class="command">dnssec-revoke</code> [<code class="option">-hr</code>] [<code class="option">-v <em class="replaceable"><code>level</code></em></code>] [<code class="option">-K <em class="replaceable"><code>directory</code></em></code>] [<code class="option">-E <em class="replaceable"><code>engine</code></em></code>] [<code class="option">-f</code>] {keyfile}</p></div>
+</div>
+<div class="refsect1" lang="en">
+<a name="id2614277"></a><h2>DESCRIPTION</h2>
+<p><span><strong class="command">dnssec-revoke</strong></span>
+ reads a DNSSEC key file, sets the REVOKED bit on the key as defined
+ in RFC 5011, and creates a new pair of key files containing the
+ now-revoked key.
+ </p>
+</div>
+<div class="refsect1" lang="en">
+<a name="id2614291"></a><h2>OPTIONS</h2>
+<div class="variablelist"><dl>
+<dt><span class="term">-h</span></dt>
+<dd><p>
+ Emit usage message and exit.
+ </p></dd>
+<dt><span class="term">-K <em class="replaceable"><code>directory</code></em></span></dt>
+<dd><p>
+ Sets the directory in which the key files are to reside.
+ </p></dd>
+<dt><span class="term">-r</span></dt>
+<dd><p>
+ After writing the new keyset files remove the original keyset
+ files.
+ </p></dd>
+<dt><span class="term">-v <em class="replaceable"><code>level</code></em></span></dt>
+<dd><p>
+ Sets the debugging level.
+ </p></dd>
+<dt><span class="term">-E <em class="replaceable"><code>engine</code></em></span></dt>
+<dd><p>
+ Use the given OpenSSL engine. When compiled with PKCS#11 support
+ it defaults to pkcs11; the empty name resets it to no engine.
+ </p></dd>
+<dt><span class="term">-f</span></dt>
+<dd><p>
+ Force overwrite: Causes <span><strong class="command">dnssec-revoke</strong></span> to
+ write the new key pair even if a file already exists matching
+ the algorithm and key ID of the revoked key.
+ </p></dd>
+</dl></div>
+</div>
+<div class="refsect1" lang="en">
+<a name="id2614398"></a><h2>SEE ALSO</h2>
+<p><span class="citerefentry"><span class="refentrytitle">dnssec-keygen</span>(8)</span>,
+ <em class="citetitle">BIND 9 Administrator Reference Manual</em>,
+ <em class="citetitle">RFC 5011</em>.
+ </p>
+</div>
+<div class="refsect1" lang="en">
+<a name="id2614423"></a><h2>AUTHOR</h2>
+<p><span class="corpauthor">Internet Systems Consortium</span>
+ </p>
+</div>
+</div>
+<div class="navfooter">
+<hr>
+<table width="100%" summary="Navigation footer">
+<tr>
+<td width="40%" align="left">
+<a accesskey="p" href="man.dnssec-keygen.html">Prev</a> </td>
+<td width="20%" align="center"><a accesskey="u" href="Bv9ARM.ch10.html">Up</a></td>
+<td width="40%" align="right"> <a accesskey="n" href="man.dnssec-settime.html">Next</a>
+</td>
+</tr>
+<tr>
+<td width="40%" align="left" valign="top">
+<span class="application">dnssec-keygen</span> </td>
+<td width="20%" align="center"><a accesskey="h" href="Bv9ARM.html">Home</a></td>
+<td width="40%" align="right" valign="top"> <span class="application">dnssec-settime</span>
+</td>
+</tr>
+</table>
+</div>
+</body>
+</html>
diff --git a/contrib/bind9/doc/arm/man.dnssec-settime.html b/contrib/bind9/doc/arm/man.dnssec-settime.html
new file mode 100644
index 0000000..19e467e
--- /dev/null
+++ b/contrib/bind9/doc/arm/man.dnssec-settime.html
@@ -0,0 +1,247 @@
+<!--
+ - Copyright (C) 2004-2011 Internet Systems Consortium, Inc. ("ISC")
+ - Copyright (C) 2000-2003 Internet Software Consortium.
+ -
+ - Permission to use, copy, modify, and/or 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 ISC DISCLAIMS ALL WARRANTIES WITH
+ - REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+ - AND FITNESS. IN NO EVENT SHALL ISC 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.
+-->
+<!-- $Id: man.dnssec-settime.html,v 1.58.8.1.2.1 2011-06-09 03:41:10 tbox Exp $ -->
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
+<title>dnssec-settime</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.71.1">
+<link rel="start" href="Bv9ARM.html" title="BIND 9 Administrator Reference Manual">
+<link rel="up" href="Bv9ARM.ch10.html" title="Manual pages">
+<link rel="prev" href="man.dnssec-revoke.html" title="dnssec-revoke">
+<link rel="next" href="man.dnssec-signzone.html" title="dnssec-signzone">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<div class="navheader">
+<table width="100%" summary="Navigation header">
+<tr><th colspan="3" align="center"><span class="application">dnssec-settime</span></th></tr>
+<tr>
+<td width="20%" align="left">
+<a accesskey="p" href="man.dnssec-revoke.html">Prev</a> </td>
+<th width="60%" align="center">Manual pages</th>
+<td width="20%" align="right"> <a accesskey="n" href="man.dnssec-signzone.html">Next</a>
+</td>
+</tr>
+</table>
+<hr>
+</div>
+<div class="refentry" lang="en">
+<a name="man.dnssec-settime"></a><div class="titlepage"></div>
+<div class="refnamediv">
+<h2>Name</h2>
+<p><span class="application">dnssec-settime</span> &#8212; Set the key timing metadata for a DNSSEC key</p>
+</div>
+<div class="refsynopsisdiv">
+<h2>Synopsis</h2>
+<div class="cmdsynopsis"><p><code class="command">dnssec-settime</code> [<code class="option">-f</code>] [<code class="option">-K <em class="replaceable"><code>directory</code></em></code>] [<code class="option">-P <em class="replaceable"><code>date/offset</code></em></code>] [<code class="option">-A <em class="replaceable"><code>date/offset</code></em></code>] [<code class="option">-R <em class="replaceable"><code>date/offset</code></em></code>] [<code class="option">-I <em class="replaceable"><code>date/offset</code></em></code>] [<code class="option">-D <em class="replaceable"><code>date/offset</code></em></code>] [<code class="option">-h</code>] [<code class="option">-v <em class="replaceable"><code>level</code></em></code>] [<code class="option">-E <em class="replaceable"><code>engine</code></em></code>] {keyfile}</p></div>
+</div>
+<div class="refsect1" lang="en">
+<a name="id2614556"></a><h2>DESCRIPTION</h2>
+<p><span><strong class="command">dnssec-settime</strong></span>
+ reads a DNSSEC private key file and sets the key timing metadata
+ as specified by the <code class="option">-P</code>, <code class="option">-A</code>,
+ <code class="option">-R</code>, <code class="option">-I</code>, and <code class="option">-D</code>
+ options. The metadata can then be used by
+ <span><strong class="command">dnssec-signzone</strong></span> or other signing software to
+ determine when a key is to be published, whether it should be
+ used for signing a zone, etc.
+ </p>
+<p>
+ If none of these options is set on the command line,
+ then <span><strong class="command">dnssec-settime</strong></span> simply prints the key timing
+ metadata already stored in the key.
+ </p>
+<p>
+ When key metadata fields are changed, both files of a key
+ pair (<code class="filename">Knnnn.+aaa+iiiii.key</code> and
+ <code class="filename">Knnnn.+aaa+iiiii.private</code>) are regenerated.
+ Metadata fields are stored in the private file. A human-readable
+ description of the metadata is also placed in comments in the key
+ file.
+ </p>
+</div>
+<div class="refsect1" lang="en">
+<a name="id2614615"></a><h2>OPTIONS</h2>
+<div class="variablelist"><dl>
+<dt><span class="term">-f</span></dt>
+<dd><p>
+ Force an update of an old-format key with no metadata fields.
+ Without this option, <span><strong class="command">dnssec-settime</strong></span> will
+ fail when attempting to update a legacy key. With this option,
+ the key will be recreated in the new format, but with the
+ original key data retained. The key's creation date will be
+ set to the present time.
+ </p></dd>
+<dt><span class="term">-K <em class="replaceable"><code>directory</code></em></span></dt>
+<dd><p>
+ Sets the directory in which the key files are to reside.
+ </p></dd>
+<dt><span class="term">-h</span></dt>
+<dd><p>
+ Emit usage message and exit.
+ </p></dd>
+<dt><span class="term">-v <em class="replaceable"><code>level</code></em></span></dt>
+<dd><p>
+ Sets the debugging level.
+ </p></dd>
+<dt><span class="term">-E <em class="replaceable"><code>engine</code></em></span></dt>
+<dd><p>
+ Use the given OpenSSL engine. When compiled with PKCS#11 support
+ it defaults to pkcs11; the empty name resets it to no engine.
+ </p></dd>
+</dl></div>
+</div>
+<div class="refsect1" lang="en">
+<a name="id2615323"></a><h2>TIMING OPTIONS</h2>
+<p>
+ Dates can be expressed in the format YYYYMMDD or YYYYMMDDHHMMSS.
+ If the argument begins with a '+' or '-', it is interpreted as
+ an offset from the present time. For convenience, if such an offset
+ is followed by one of the suffixes 'y', 'mo', 'w', 'd', 'h', or 'mi',
+ then the offset is computed in years (defined as 365 24-hour days,
+ ignoring leap years), months (defined as 30 24-hour days), weeks,
+ days, hours, or minutes, respectively. Without a suffix, the offset
+ is computed in seconds. To unset a date, use 'none'.
+ </p>
+<div class="variablelist"><dl>
+<dt><span class="term">-P <em class="replaceable"><code>date/offset</code></em></span></dt>
+<dd><p>
+ Sets the date on which a key is to be published to the zone.
+ After that date, the key will be included in the zone but will
+ not be used to sign it.
+ </p></dd>
+<dt><span class="term">-A <em class="replaceable"><code>date/offset</code></em></span></dt>
+<dd><p>
+ Sets the date on which the key is to be activated. After that
+ date, the key will be included in the zone and used to sign
+ it.
+ </p></dd>
+<dt><span class="term">-R <em class="replaceable"><code>date/offset</code></em></span></dt>
+<dd><p>
+ Sets the date on which the key is to be revoked. After that
+ date, the key will be flagged as revoked. It will be included
+ in the zone and will be used to sign it.
+ </p></dd>
+<dt><span class="term">-I <em class="replaceable"><code>date/offset</code></em></span></dt>
+<dd><p>
+ Sets the date on which the key is to be retired. After that
+ date, the key will still be included in the zone, but it
+ will not be used to sign it.
+ </p></dd>
+<dt><span class="term">-D <em class="replaceable"><code>date/offset</code></em></span></dt>
+<dd><p>
+ Sets the date on which the key is to be deleted. After that
+ date, the key will no longer be included in the zone. (It
+ may remain in the key repository, however.)
+ </p></dd>
+<dt><span class="term">-S <em class="replaceable"><code>predecessor key</code></em></span></dt>
+<dd><p>
+ Select a key for which the key being modified will be an
+ explicit successor. The name, algorithm, size, and type of the
+ predecessor key must exactly match those of the key being
+ modified. The activation date of the successor key will be set
+ to the inactivation date of the predecessor. The publication
+ date will be set to the activation date minus the prepublication
+ interval, which defaults to 30 days.
+ </p></dd>
+<dt><span class="term">-i <em class="replaceable"><code>interval</code></em></span></dt>
+<dd>
+<p>
+ Sets the prepublication interval for a key. If set, then
+ the publication and activation dates must be separated by at least
+ this much time. If the activation date is specified but the
+ publication date isn't, then the publication date will default
+ to this much time before the activation date; conversely, if
+ the publication date is specified but activation date isn't,
+ then activation will be set to this much time after publication.
+ </p>
+<p>
+ If the key is being set to be an explicit successor to another
+ key, then the default prepublication interval is 30 days;
+ otherwise it is zero.
+ </p>
+<p>
+ As with date offsets, if the argument is followed by one of
+ the suffixes 'y', 'mo', 'w', 'd', 'h', or 'mi', then the
+ interval is measured in years, months, weeks, days, hours,
+ or minutes, respectively. Without a suffix, the interval is
+ measured in seconds.
+ </p>
+</dd>
+</dl></div>
+</div>
+<div class="refsect1" lang="en">
+<a name="id2615598"></a><h2>PRINTING OPTIONS</h2>
+<p>
+ <span><strong class="command">dnssec-settime</strong></span> can also be used to print the
+ timing metadata associated with a key.
+ </p>
+<div class="variablelist"><dl>
+<dt><span class="term">-u</span></dt>
+<dd><p>
+ Print times in UNIX epoch format.
+ </p></dd>
+<dt><span class="term">-p <em class="replaceable"><code>C/P/A/R/I/D/all</code></em></span></dt>
+<dd><p>
+ Print a specific metadata value or set of metadata values.
+ The <code class="option">-p</code> option may be followed by one or more
+ of the following letters to indicate which value or values to print:
+ <code class="option">C</code> for the creation date,
+ <code class="option">P</code> for the publication date,
+ <code class="option">A</code> for the activation date,
+ <code class="option">R</code> for the revocation date,
+ <code class="option">I</code> for the inactivation date, or
+ <code class="option">D</code> for the deletion date.
+ To print all of the metadata, use <code class="option">-p all</code>.
+ </p></dd>
+</dl></div>
+</div>
+<div class="refsect1" lang="en">
+<a name="id2615678"></a><h2>SEE ALSO</h2>
+<p><span class="citerefentry"><span class="refentrytitle">dnssec-keygen</span>(8)</span>,
+ <span class="citerefentry"><span class="refentrytitle">dnssec-signzone</span>(8)</span>,
+ <em class="citetitle">BIND 9 Administrator Reference Manual</em>,
+ <em class="citetitle">RFC 5011</em>.
+ </p>
+</div>
+<div class="refsect1" lang="en">
+<a name="id2615712"></a><h2>AUTHOR</h2>
+<p><span class="corpauthor">Internet Systems Consortium</span>
+ </p>
+</div>
+</div>
+<div class="navfooter">
+<hr>
+<table width="100%" summary="Navigation footer">
+<tr>
+<td width="40%" align="left">
+<a accesskey="p" href="man.dnssec-revoke.html">Prev</a> </td>
+<td width="20%" align="center"><a accesskey="u" href="Bv9ARM.ch10.html">Up</a></td>
+<td width="40%" align="right"> <a accesskey="n" href="man.dnssec-signzone.html">Next</a>
+</td>
+</tr>
+<tr>
+<td width="40%" align="left" valign="top">
+<span class="application">dnssec-revoke</span> </td>
+<td width="20%" align="center"><a accesskey="h" href="Bv9ARM.html">Home</a></td>
+<td width="40%" align="right" valign="top"> <span class="application">dnssec-signzone</span>
+</td>
+</tr>
+</table>
+</div>
+</body>
+</html>
diff --git a/contrib/bind9/doc/arm/man.dnssec-signzone.html b/contrib/bind9/doc/arm/man.dnssec-signzone.html
index 42bf068..05cea6e 100644
--- a/contrib/bind9/doc/arm/man.dnssec-signzone.html
+++ b/contrib/bind9/doc/arm/man.dnssec-signzone.html
@@ -1,5 +1,5 @@
<!--
- - Copyright (C) 2004-2010 Internet Systems Consortium, Inc. ("ISC")
+ - Copyright (C) 2004-2011 Internet Systems Consortium, Inc. ("ISC")
- Copyright (C) 2000-2003 Internet Software Consortium.
-
- Permission to use, copy, modify, and/or distribute this software for any
@@ -14,7 +14,7 @@
- OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
- PERFORMANCE OF THIS SOFTWARE.
-->
-<!-- $Id: man.dnssec-signzone.html,v 1.94.14.25 2010-08-20 02:05:39 tbox Exp $ -->
+<!-- $Id: man.dnssec-signzone.html,v 1.179.8.1.2.1 2011-06-09 03:41:10 tbox Exp $ -->
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
@@ -22,7 +22,7 @@
<meta name="generator" content="DocBook XSL Stylesheets V1.71.1">
<link rel="start" href="Bv9ARM.html" title="BIND 9 Administrator Reference Manual">
<link rel="up" href="Bv9ARM.ch10.html" title="Manual pages">
-<link rel="prev" href="man.dnssec-keygen.html" title="dnssec-keygen">
+<link rel="prev" href="man.dnssec-settime.html" title="dnssec-settime">
<link rel="next" href="man.named-checkconf.html" title="named-checkconf">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
@@ -31,7 +31,7 @@
<tr><th colspan="3" align="center"><span class="application">dnssec-signzone</span></th></tr>
<tr>
<td width="20%" align="left">
-<a accesskey="p" href="man.dnssec-keygen.html">Prev</a> </td>
+<a accesskey="p" href="man.dnssec-settime.html">Prev</a> </td>
<th width="60%" align="center">Manual pages</th>
<td width="20%" align="right"> <a accesskey="n" href="man.named-checkconf.html">Next</a>
</td>
@@ -47,21 +47,21 @@
</div>
<div class="refsynopsisdiv">
<h2>Synopsis</h2>
-<div class="cmdsynopsis"><p><code class="command">dnssec-signzone</code> [<code class="option">-a</code>] [<code class="option">-c <em class="replaceable"><code>class</code></em></code>] [<code class="option">-d <em class="replaceable"><code>directory</code></em></code>] [<code class="option">-e <em class="replaceable"><code>end-time</code></em></code>] [<code class="option">-f <em class="replaceable"><code>output-file</code></em></code>] [<code class="option">-g</code>] [<code class="option">-h</code>] [<code class="option">-k <em class="replaceable"><code>key</code></em></code>] [<code class="option">-l <em class="replaceable"><code>domain</code></em></code>] [<code class="option">-i <em class="replaceable"><code>interval</code></em></code>] [<code class="option">-I <em class="replaceable"><code>input-format</code></em></code>] [<code class="option">-j <em class="replaceable"><code>jitter</code></em></code>] [<code class="option">-N <em class="replaceable"><code>soa-serial-format</code></em></code>] [<code class="option">-o <em class="replaceable"><code>origin</code></em></code>] [<code class="option">-O <em class="replaceable"><code>output-format</code></em></code>] [<code class="option">-p</code>] [<code class="option">-P</code>] [<code class="option">-r <em class="replaceable"><code>randomdev</code></em></code>] [<code class="option">-s <em class="replaceable"><code>start-time</code></em></code>] [<code class="option">-t</code>] [<code class="option">-v <em class="replaceable"><code>level</code></em></code>] [<code class="option">-z</code>] [<code class="option">-3 <em class="replaceable"><code>salt</code></em></code>] [<code class="option">-H <em class="replaceable"><code>iterations</code></em></code>] [<code class="option">-A</code>] {zonefile} [key...]</p></div>
+<div class="cmdsynopsis"><p><code class="command">dnssec-signzone</code> [<code class="option">-a</code>] [<code class="option">-c <em class="replaceable"><code>class</code></em></code>] [<code class="option">-d <em class="replaceable"><code>directory</code></em></code>] [<code class="option">-E <em class="replaceable"><code>engine</code></em></code>] [<code class="option">-e <em class="replaceable"><code>end-time</code></em></code>] [<code class="option">-f <em class="replaceable"><code>output-file</code></em></code>] [<code class="option">-g</code>] [<code class="option">-h</code>] [<code class="option">-K <em class="replaceable"><code>directory</code></em></code>] [<code class="option">-k <em class="replaceable"><code>key</code></em></code>] [<code class="option">-l <em class="replaceable"><code>domain</code></em></code>] [<code class="option">-i <em class="replaceable"><code>interval</code></em></code>] [<code class="option">-I <em class="replaceable"><code>input-format</code></em></code>] [<code class="option">-j <em class="replaceable"><code>jitter</code></em></code>] [<code class="option">-N <em class="replaceable"><code>soa-serial-format</code></em></code>] [<code class="option">-o <em class="replaceable"><code>origin</code></em></code>] [<code class="option">-O <em class="replaceable"><code>output-format</code></em></code>] [<code class="option">-p</code>] [<code class="option">-P</code>] [<code class="option">-r <em class="replaceable"><code>randomdev</code></em></code>] [<code class="option">-S</code>] [<code class="option">-s <em class="replaceable"><code>start-time</code></em></code>] [<code class="option">-T <em class="replaceable"><code>ttl</code></em></code>] [<code class="option">-t</code>] [<code class="option">-u</code>] [<code class="option">-v <em class="replaceable"><code>level</code></em></code>] [<code class="option">-x</code>] [<code class="option">-z</code>] [<code class="option">-3 <em class="replaceable"><code>salt</code></em></code>] [<code class="option">-H <em class="replaceable"><code>iterations</code></em></code>] [<code class="option">-A</code>] {zonefile} [key...]</p></div>
</div>
<div class="refsect1" lang="en">
-<a name="id2607637"></a><h2>DESCRIPTION</h2>
+<a name="id2616507"></a><h2>DESCRIPTION</h2>
<p><span><strong class="command">dnssec-signzone</strong></span>
signs a zone. It generates
NSEC and RRSIG records and produces a signed version of the
- zone. It also generates a <code class="filename">keyset-</code> file containing
- the key-signing keys for the zone, and if signing a zone which
- contains delegations, it can optionally generate DS records for
- the child zones from their <code class="filename">keyset-</code> files.
+ zone. The security status of delegations from the signed zone
+ (that is, whether the child zones are secure or not) is
+ determined by the presence or absence of a
+ <code class="filename">keyset</code> file for each child zone.
</p>
</div>
<div class="refsect1" lang="en">
-<a name="id2607661"></a><h2>OPTIONS</h2>
+<a name="id2617346"></a><h2>OPTIONS</h2>
<div class="variablelist"><dl>
<dt><span class="term">-a</span></dt>
<dd><p>
@@ -71,6 +71,38 @@
<dd><p>
Specifies the DNS class of the zone.
</p></dd>
+<dt><span class="term">-C</span></dt>
+<dd><p>
+ Compatibility mode: Generate a
+ <code class="filename">keyset-<em class="replaceable"><code>zonename</code></em></code>
+ file in addition to
+ <code class="filename">dsset-<em class="replaceable"><code>zonename</code></em></code>
+ when signing a zone, for use by older versions of
+ <span><strong class="command">dnssec-signzone</strong></span>.
+ </p></dd>
+<dt><span class="term">-d <em class="replaceable"><code>directory</code></em></span></dt>
+<dd><p>
+ Look for <code class="filename">dsset-</code> or
+ <code class="filename">keyset-</code> files in <code class="option">directory</code>.
+ </p></dd>
+<dt><span class="term">-E <em class="replaceable"><code>engine</code></em></span></dt>
+<dd><p>
+ Uses a crypto hardware (OpenSSL engine) for the crypto operations
+ it supports, for instance signing with private keys from
+ a secure key store. When compiled with PKCS#11 support
+ it defaults to pkcs11; the empty name resets it to no engine.
+ </p></dd>
+<dt><span class="term">-g</span></dt>
+<dd><p>
+ Generate DS records for child zones from
+ <code class="filename">dsset-</code> or <code class="filename">keyset-</code>
+ file. Existing DS records will be removed.
+ </p></dd>
+<dt><span class="term">-K <em class="replaceable"><code>directory</code></em></span></dt>
+<dd><p>
+ Key repository: Specify a directory to search for DNSSEC keys.
+ If not specified, defaults to the current directory.
+ </p></dd>
<dt><span class="term">-k <em class="replaceable"><code>key</code></em></span></dt>
<dd><p>
Treat specified key as a key signing key ignoring any
@@ -81,18 +113,6 @@
Generate a DLV set in addition to the key (DNSKEY) and DS sets.
The domain is appended to the name of the records.
</p></dd>
-<dt><span class="term">-d <em class="replaceable"><code>directory</code></em></span></dt>
-<dd><p>
- Look for <code class="filename">keyset</code> files in
- <code class="option">directory</code> as the directory
- </p></dd>
-<dt><span class="term">-g</span></dt>
-<dd><p>
- If the zone contains any delegations, and there are
- <code class="filename">keyset-</code> files for any of the child zones,
- then DS records for the child zones will be generated from the
- keys in those files. Existing DS records will be removed.
- </p></dd>
<dt><span class="term">-s <em class="replaceable"><code>start-time</code></em></span></dt>
<dd><p>
Specify the date and time when the generated RRSIG records
@@ -113,6 +133,8 @@
the start time. A time relative to the current time is
indicated with now+N. If no <code class="option">end-time</code> is
specified, 30 days from the start time is used as a default.
+ <code class="option">end-time</code> must be later than
+ <code class="option">start-time</code>.
</p></dd>
<dt><span class="term">-f <em class="replaceable"><code>output-file</code></em></span></dt>
<dd><p>
@@ -247,35 +269,119 @@
<code class="filename">keyboard</code> indicates that keyboard
input should be used.
</p></dd>
+<dt><span class="term">-S</span></dt>
+<dd>
+<p>
+ Smart signing: Instructs <span><strong class="command">dnssec-signzone</strong></span> to
+ search the key repository for keys that match the zone being
+ signed, and to include them in the zone if appropriate.
+ </p>
+<p>
+ When a key is found, its timing metadata is examined to
+ determine how it should be used, according to the following
+ rules. Each successive rule takes priority over the prior
+ ones:
+ </p>
+<div class="variablelist"><dl>
+<dt></dt>
+<dd><p>
+ If no timing metadata has been set for the key, the key is
+ published in the zone and used to sign the zone.
+ </p></dd>
+<dt></dt>
+<dd><p>
+ If the key's publication date is set and is in the past, the
+ key is published in the zone.
+ </p></dd>
+<dt></dt>
+<dd><p>
+ If the key's activation date is set and in the past, the
+ key is published (regardless of publication date) and
+ used to sign the zone.
+ </p></dd>
+<dt></dt>
+<dd><p>
+ If the key's revocation date is set and in the past, and the
+ key is published, then the key is revoked, and the revoked key
+ is used to sign the zone.
+ </p></dd>
+<dt></dt>
+<dd><p>
+ If either of the key's unpublication or deletion dates are set
+ and in the past, the key is NOT published or used to sign the
+ zone, regardless of any other metadata.
+ </p></dd>
+</dl></div>
+</dd>
+<dt><span class="term">-T <em class="replaceable"><code>ttl</code></em></span></dt>
+<dd><p>
+ Specifies the TTL to be used for new DNSKEY records imported
+ into the zone from the key repository. If not specified,
+ the default is the minimum TTL value from the zone's SOA
+ record. This option is ignored when signing without
+ <code class="option">-S</code>, since DNSKEY records are not imported
+ from the key repository in that case. It is also ignored if
+ there are any pre-existing DNSKEY records at the zone apex,
+ in which case new records' TTL values will be set to match
+ them.
+ </p></dd>
<dt><span class="term">-t</span></dt>
<dd><p>
Print statistics at completion.
</p></dd>
+<dt><span class="term">-u</span></dt>
+<dd><p>
+ Update NSEC/NSEC3 chain when re-signing a previously signed
+ zone. With this option, a zone signed with NSEC can be
+ switched to NSEC3, or a zone signed with NSEC3 can
+ be switch to NSEC or to NSEC3 with different parameters.
+ Without this option, <span><strong class="command">dnssec-signzone</strong></span> will
+ retain the existing chain when re-signing.
+ </p></dd>
<dt><span class="term">-v <em class="replaceable"><code>level</code></em></span></dt>
<dd><p>
Sets the debugging level.
</p></dd>
+<dt><span class="term">-x</span></dt>
+<dd><p>
+ Only sign the DNSKEY RRset with key-signing keys, and omit
+ signatures from zone-signing keys. (This is similar to the
+ <span><strong class="command">dnssec-dnskey-kskonly yes;</strong></span> zone option in
+ <span><strong class="command">named</strong></span>.)
+ </p></dd>
<dt><span class="term">-z</span></dt>
<dd><p>
- Ignore KSK flag on key when determining what to sign.
+ Ignore KSK flag on key when determining what to sign. This
+ causes KSK-flagged keys to sign all records, not just the
+ DNSKEY RRset. (This is similar to the
+ <span><strong class="command">update-check-ksk no;</strong></span> zone option in
+ <span><strong class="command">named</strong></span>.)
</p></dd>
<dt><span class="term">-3 <em class="replaceable"><code>salt</code></em></span></dt>
<dd><p>
- Generate a NSEC3 chain with the given hex encoded salt.
+ Generate an NSEC3 chain with the given hex encoded salt.
A dash (<em class="replaceable"><code>salt</code></em>) can
be used to indicate that no salt is to be used when generating the NSEC3 chain.
</p></dd>
<dt><span class="term">-H <em class="replaceable"><code>iterations</code></em></span></dt>
<dd><p>
- When generating a NSEC3 chain use this many interations. The
- default is 100.
+ When generating an NSEC3 chain, use this many interations. The
+ default is 10.
</p></dd>
<dt><span class="term">-A</span></dt>
-<dd><p>
- When generating a NSEC3 chain set the OPTOUT flag on all
+<dd>
+<p>
+ When generating an NSEC3 chain set the OPTOUT flag on all
NSEC3 records and do not generate NSEC3 records for insecure
delegations.
- </p></dd>
+ </p>
+<p>
+ Using this option twice (i.e., <code class="option">-AA</code>)
+ turns the OPTOUT flag off for all records. This is useful
+ when using the <code class="option">-u</code> option to modify an NSEC3
+ chain which previously had OPTOUT set.
+ </p>
+</dd>
<dt><span class="term">zonefile</span></dt>
<dd><p>
The file containing the zone to be signed.
@@ -291,14 +397,15 @@
</dl></div>
</div>
<div class="refsect1" lang="en">
-<a name="id2659554"></a><h2>EXAMPLE</h2>
+<a name="id2671803"></a><h2>EXAMPLE</h2>
<p>
The following command signs the <strong class="userinput"><code>example.com</code></strong>
zone with the DSA key generated by <span><strong class="command">dnssec-keygen</strong></span>
- (Kexample.com.+003+17247). The zone's keys must be in the master
- file (<code class="filename">db.example.com</code>). This invocation looks
- for <code class="filename">keyset</code> files, in the current directory,
- so that DS records can be generated from them (<span><strong class="command">-g</strong></span>).
+ (Kexample.com.+003+17247). Because the <span><strong class="command">-S</strong></span> option
+ is not being used, the zone's keys must be in the master file
+ (<code class="filename">db.example.com</code>). This invocation looks
+ for <code class="filename">dsset</code> files, in the current directory,
+ so that DS records can be imported from them (<span><strong class="command">-g</strong></span>).
</p>
<pre class="programlisting">% dnssec-signzone -g -o example.com db.example.com \
Kexample.com.+003+17247
@@ -320,39 +427,14 @@ db.example.com.signed
%</pre>
</div>
<div class="refsect1" lang="en">
-<a name="id2659694"></a><h2>KNOWN BUGS</h2>
-<p>
- <span><strong class="command">dnssec-signzone</strong></span> was designed so that it could
- sign a zone partially, using only a subset of the DNSSEC keys
- needed to produce a fully-signed zone. This permits a zone
- administrator, for example, to sign a zone with one key on one
- machine, move the resulting partially-signed zone to a second
- machine, and sign it again with a second key.
- </p>
-<p>
- An unfortunate side-effect of this flexibility is that
- <span><strong class="command">dnssec-signzone</strong></span> does not check to make sure
- it's signing a zone with any valid keys at all. An attempt to
- sign a zone without any keys will appear to succeed, producing
- a "signed" zone with no signatures. There is no warning issued
- when a zone is not fully signed.
- </p>
-<p>
- This will be corrected in a future release. In the meantime, ISC
- recommends examining the output of <span><strong class="command">dnssec-signzone</strong></span>
- to confirm that the zone is properly signed by all keys before
- using it.
- </p>
-</div>
-<div class="refsect1" lang="en">
-<a name="id2659726"></a><h2>SEE ALSO</h2>
+<a name="id2671882"></a><h2>SEE ALSO</h2>
<p><span class="citerefentry"><span class="refentrytitle">dnssec-keygen</span>(8)</span>,
<em class="citetitle">BIND 9 Administrator Reference Manual</em>,
<em class="citetitle">RFC 4033</em>.
</p>
</div>
<div class="refsect1" lang="en">
-<a name="id2659751"></a><h2>AUTHOR</h2>
+<a name="id2671907"></a><h2>AUTHOR</h2>
<p><span class="corpauthor">Internet Systems Consortium</span>
</p>
</div>
@@ -362,14 +444,14 @@ db.example.com.signed
<table width="100%" summary="Navigation footer">
<tr>
<td width="40%" align="left">
-<a accesskey="p" href="man.dnssec-keygen.html">Prev</a> </td>
+<a accesskey="p" href="man.dnssec-settime.html">Prev</a> </td>
<td width="20%" align="center"><a accesskey="u" href="Bv9ARM.ch10.html">Up</a></td>
<td width="40%" align="right"> <a accesskey="n" href="man.named-checkconf.html">Next</a>
</td>
</tr>
<tr>
<td width="40%" align="left" valign="top">
-<span class="application">dnssec-keygen</span> </td>
+<span class="application">dnssec-settime</span> </td>
<td width="20%" align="center"><a accesskey="h" href="Bv9ARM.html">Home</a></td>
<td width="40%" align="right" valign="top"> <span class="application">named-checkconf</span>
</td>
diff --git a/contrib/bind9/doc/arm/man.genrandom.html b/contrib/bind9/doc/arm/man.genrandom.html
new file mode 100644
index 0000000..c9ecc8e
--- /dev/null
+++ b/contrib/bind9/doc/arm/man.genrandom.html
@@ -0,0 +1,112 @@
+<!--
+ - Copyright (C) 2004-2011 Internet Systems Consortium, Inc. ("ISC")
+ - Copyright (C) 2000-2003 Internet Software Consortium.
+ -
+ - Permission to use, copy, modify, and/or 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 ISC DISCLAIMS ALL WARRANTIES WITH
+ - REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+ - AND FITNESS. IN NO EVENT SHALL ISC 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.
+-->
+<!-- $Id: man.genrandom.html,v 1.34.8.1.2.1 2011-06-09 03:41:11 tbox Exp $ -->
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
+<title>genrandom</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.71.1">
+<link rel="start" href="Bv9ARM.html" title="BIND 9 Administrator Reference Manual">
+<link rel="up" href="Bv9ARM.ch10.html" title="Manual pages">
+<link rel="prev" href="man.arpaname.html" title="arpaname">
+<link rel="next" href="man.isc-hmac-fixup.html" title="isc-hmac-fixup">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<div class="navheader">
+<table width="100%" summary="Navigation header">
+<tr><th colspan="3" align="center"><span class="application">genrandom</span></th></tr>
+<tr>
+<td width="20%" align="left">
+<a accesskey="p" href="man.arpaname.html">Prev</a> </td>
+<th width="60%" align="center">Manual pages</th>
+<td width="20%" align="right"> <a accesskey="n" href="man.isc-hmac-fixup.html">Next</a>
+</td>
+</tr>
+</table>
+<hr>
+</div>
+<div class="refentry" lang="en">
+<a name="man.genrandom"></a><div class="titlepage"></div>
+<div class="refnamediv">
+<h2>Name</h2>
+<p><span class="application">genrandom</span> &#8212; generate a file containing random data</p>
+</div>
+<div class="refsynopsisdiv">
+<h2>Synopsis</h2>
+<div class="cmdsynopsis"><p><code class="command">genrandom</code> [<code class="option">-n <em class="replaceable"><code>number</code></em></code>] {<em class="replaceable"><code>size</code></em>} {<em class="replaceable"><code>filename</code></em>}</p></div>
+</div>
+<div class="refsect1" lang="en">
+<a name="id2649447"></a><h2>DESCRIPTION</h2>
+<p>
+ <span><strong class="command">genrandom</strong></span>
+ generates a file or a set of files containing a specified quantity
+ of pseudo-random data, which can be used as a source of entropy for
+ other commands on systems with no random device.
+ </p>
+</div>
+<div class="refsect1" lang="en">
+<a name="id2649462"></a><h2>ARGUMENTS</h2>
+<div class="variablelist"><dl>
+<dt><span class="term">-n <em class="replaceable"><code>number</code></em></span></dt>
+<dd><p>
+ In place of generating one file, generates <code class="option">number</code>
+ (from 2 to 9) files, appending <code class="option">number</code> to the name.
+ </p></dd>
+<dt><span class="term">size</span></dt>
+<dd><p>
+ The size of the file, in kilobytes, to generate.
+ </p></dd>
+<dt><span class="term">domain</span></dt>
+<dd><p>
+ The file name into which random data should be written.
+ </p></dd>
+</dl></div>
+</div>
+<div class="refsect1" lang="en">
+<a name="id2649523"></a><h2>SEE ALSO</h2>
+<p>
+ <span class="citerefentry"><span class="refentrytitle">rand</span>(3)</span>,
+ <span class="citerefentry"><span class="refentrytitle">arc4random</span>(3)</span>
+ </p>
+</div>
+<div class="refsect1" lang="en">
+<a name="id2649549"></a><h2>AUTHOR</h2>
+<p><span class="corpauthor">Internet Systems Consortium</span>
+ </p>
+</div>
+</div>
+<div class="navfooter">
+<hr>
+<table width="100%" summary="Navigation footer">
+<tr>
+<td width="40%" align="left">
+<a accesskey="p" href="man.arpaname.html">Prev</a> </td>
+<td width="20%" align="center"><a accesskey="u" href="Bv9ARM.ch10.html">Up</a></td>
+<td width="40%" align="right"> <a accesskey="n" href="man.isc-hmac-fixup.html">Next</a>
+</td>
+</tr>
+<tr>
+<td width="40%" align="left" valign="top">
+<span class="application">arpaname</span> </td>
+<td width="20%" align="center"><a accesskey="h" href="Bv9ARM.html">Home</a></td>
+<td width="40%" align="right" valign="top"> <span class="application">isc-hmac-fixup</span>
+</td>
+</tr>
+</table>
+</div>
+</body>
+</html>
diff --git a/contrib/bind9/doc/arm/man.host.html b/contrib/bind9/doc/arm/man.host.html
index 990d67e..7322353 100644
--- a/contrib/bind9/doc/arm/man.host.html
+++ b/contrib/bind9/doc/arm/man.host.html
@@ -1,5 +1,5 @@
<!--
- - Copyright (C) 2004-2010 Internet Systems Consortium, Inc. ("ISC")
+ - Copyright (C) 2004-2011 Internet Systems Consortium, Inc. ("ISC")
- Copyright (C) 2000-2003 Internet Software Consortium.
-
- Permission to use, copy, modify, and/or distribute this software for any
@@ -14,7 +14,7 @@
- OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
- PERFORMANCE OF THIS SOFTWARE.
-->
-<!-- $Id: man.host.html,v 1.93.14.17 2010-08-20 02:05:40 tbox Exp $ -->
+<!-- $Id: man.host.html,v 1.160.8.1.2.1 2011-06-09 03:41:09 tbox Exp $ -->
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
@@ -50,7 +50,7 @@
<div class="cmdsynopsis"><p><code class="command">host</code> [<code class="option">-aCdlnrsTwv</code>] [<code class="option">-c <em class="replaceable"><code>class</code></em></code>] [<code class="option">-N <em class="replaceable"><code>ndots</code></em></code>] [<code class="option">-R <em class="replaceable"><code>number</code></em></code>] [<code class="option">-t <em class="replaceable"><code>type</code></em></code>] [<code class="option">-W <em class="replaceable"><code>wait</code></em></code>] [<code class="option">-m <em class="replaceable"><code>flag</code></em></code>] [<code class="option">-4</code>] [<code class="option">-6</code>] {name} [server]</p></div>
</div>
<div class="refsect1" lang="en">
-<a name="id2603383"></a><h2>DESCRIPTION</h2>
+<a name="id2610368"></a><h2>DESCRIPTION</h2>
<p><span><strong class="command">host</strong></span>
is a simple utility for performing DNS lookups.
It is normally used to convert names to IP addresses and vice versa.
@@ -202,7 +202,7 @@
</p>
</div>
<div class="refsect1" lang="en">
-<a name="id2603897"></a><h2>IDN SUPPORT</h2>
+<a name="id2610882"></a><h2>IDN SUPPORT</h2>
<p>
If <span><strong class="command">host</strong></span> has been built with IDN (internationalized
domain name) support, it can accept and display non-ASCII domain names.
@@ -216,12 +216,12 @@
</p>
</div>
<div class="refsect1" lang="en">
-<a name="id2603926"></a><h2>FILES</h2>
+<a name="id2610910"></a><h2>FILES</h2>
<p><code class="filename">/etc/resolv.conf</code>
</p>
</div>
<div class="refsect1" lang="en">
-<a name="id2603940"></a><h2>SEE ALSO</h2>
+<a name="id2610924"></a><h2>SEE ALSO</h2>
<p><span class="citerefentry"><span class="refentrytitle">dig</span>(1)</span>,
<span class="citerefentry"><span class="refentrytitle">named</span>(8)</span>.
</p>
diff --git a/contrib/bind9/doc/arm/man.isc-hmac-fixup.html b/contrib/bind9/doc/arm/man.isc-hmac-fixup.html
new file mode 100644
index 0000000..bff6e91
--- /dev/null
+++ b/contrib/bind9/doc/arm/man.isc-hmac-fixup.html
@@ -0,0 +1,122 @@
+<!--
+ - Copyright (C) 2004-2011 Internet Systems Consortium, Inc. ("ISC")
+ - Copyright (C) 2000-2003 Internet Software Consortium.
+ -
+ - Permission to use, copy, modify, and/or 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 ISC DISCLAIMS ALL WARRANTIES WITH
+ - REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+ - AND FITNESS. IN NO EVENT SHALL ISC 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.
+-->
+<!-- $Id: man.isc-hmac-fixup.html,v 1.31.8.1.2.1 2011-06-09 03:41:11 tbox Exp $ -->
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
+<title>isc-hmac-fixup</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.71.1">
+<link rel="start" href="Bv9ARM.html" title="BIND 9 Administrator Reference Manual">
+<link rel="up" href="Bv9ARM.ch10.html" title="Manual pages">
+<link rel="prev" href="man.genrandom.html" title="genrandom">
+<link rel="next" href="man.nsec3hash.html" title="nsec3hash">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<div class="navheader">
+<table width="100%" summary="Navigation header">
+<tr><th colspan="3" align="center"><span class="application">isc-hmac-fixup</span></th></tr>
+<tr>
+<td width="20%" align="left">
+<a accesskey="p" href="man.genrandom.html">Prev</a> </td>
+<th width="60%" align="center">Manual pages</th>
+<td width="20%" align="right"> <a accesskey="n" href="man.nsec3hash.html">Next</a>
+</td>
+</tr>
+</table>
+<hr>
+</div>
+<div class="refentry" lang="en">
+<a name="man.isc-hmac-fixup"></a><div class="titlepage"></div>
+<div class="refnamediv">
+<h2>Name</h2>
+<p><span class="application">isc-hmac-fixup</span> &#8212; fixes HMAC keys generated by older versions of BIND</p>
+</div>
+<div class="refsynopsisdiv">
+<h2>Synopsis</h2>
+<div class="cmdsynopsis"><p><code class="command">isc-hmac-fixup</code> {<em class="replaceable"><code>algorithm</code></em>} {<em class="replaceable"><code>secret</code></em>}</p></div>
+</div>
+<div class="refsect1" lang="en">
+<a name="id2650556"></a><h2>DESCRIPTION</h2>
+<p>
+ Versions of BIND 9 up to and including BIND 9.6 had a bug causing
+ HMAC-SHA* TSIG keys which were longer than the digest length of the
+ hash algorithm (i.e., SHA1 keys longer than 160 bits, SHA256 keys
+ longer than 256 bits, etc) to be used incorrectly, generating a
+ message authentication code that was incompatible with other DNS
+ implementations.
+ </p>
+<p>
+ This bug has been fixed in BIND 9.7. However, the fix may
+ cause incompatibility between older and newer versions of
+ BIND, when using long keys. <span><strong class="command">isc-hmac-fixup</strong></span>
+ modifies those keys to restore compatibility.
+ </p>
+<p>
+ To modify a key, run <span><strong class="command">isc-hmac-fixup</strong></span> and
+ specify the key's algorithm and secret on the command line. If the
+ secret is longer than the digest length of the algorithm (64 bytes
+ for SHA1 through SHA256, or 128 bytes for SHA384 and SHA512), then a
+ new secret will be generated consisting of a hash digest of the old
+ secret. (If the secret did not require conversion, then it will be
+ printed without modification.)
+ </p>
+</div>
+<div class="refsect1" lang="en">
+<a name="id2650584"></a><h2>SECURITY CONSIDERATIONS</h2>
+<p>
+ Secrets that have been converted by <span><strong class="command">isc-hmac-fixup</strong></span>
+ are shortened, but as this is how the HMAC protocol works in
+ operation anyway, it does not affect security. RFC 2104 notes,
+ "Keys longer than [the digest length] are acceptable but the
+ extra length would not significantly increase the function
+ strength."
+ </p>
+</div>
+<div class="refsect1" lang="en">
+<a name="id2650600"></a><h2>SEE ALSO</h2>
+<p>
+ <em class="citetitle">BIND 9 Administrator Reference Manual</em>,
+ <em class="citetitle">RFC 2104</em>.
+ </p>
+</div>
+<div class="refsect1" lang="en">
+<a name="id2650617"></a><h2>AUTHOR</h2>
+<p><span class="corpauthor">Internet Systems Consortium</span>
+ </p>
+</div>
+</div>
+<div class="navfooter">
+<hr>
+<table width="100%" summary="Navigation footer">
+<tr>
+<td width="40%" align="left">
+<a accesskey="p" href="man.genrandom.html">Prev</a> </td>
+<td width="20%" align="center"><a accesskey="u" href="Bv9ARM.ch10.html">Up</a></td>
+<td width="40%" align="right"> <a accesskey="n" href="man.nsec3hash.html">Next</a>
+</td>
+</tr>
+<tr>
+<td width="40%" align="left" valign="top">
+<span class="application">genrandom</span> </td>
+<td width="20%" align="center"><a accesskey="h" href="Bv9ARM.html">Home</a></td>
+<td width="40%" align="right" valign="top"> <span class="application">nsec3hash</span>
+</td>
+</tr>
+</table>
+</div>
+</body>
+</html>
diff --git a/contrib/bind9/doc/arm/man.named-checkconf.html b/contrib/bind9/doc/arm/man.named-checkconf.html
index 8bf240b..d6eff94 100644
--- a/contrib/bind9/doc/arm/man.named-checkconf.html
+++ b/contrib/bind9/doc/arm/man.named-checkconf.html
@@ -1,5 +1,5 @@
<!--
- - Copyright (C) 2004-2010 Internet Systems Consortium, Inc. ("ISC")
+ - Copyright (C) 2004-2011 Internet Systems Consortium, Inc. ("ISC")
- Copyright (C) 2000-2003 Internet Software Consortium.
-
- Permission to use, copy, modify, and/or distribute this software for any
@@ -14,7 +14,7 @@
- OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
- PERFORMANCE OF THIS SOFTWARE.
-->
-<!-- $Id: man.named-checkconf.html,v 1.92.14.22 2010-08-20 02:05:39 tbox Exp $ -->
+<!-- $Id: man.named-checkconf.html,v 1.174.8.1.2.1 2011-06-09 03:41:10 tbox Exp $ -->
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
@@ -47,17 +47,30 @@
</div>
<div class="refsynopsisdiv">
<h2>Synopsis</h2>
-<div class="cmdsynopsis"><p><code class="command">named-checkconf</code> [<code class="option">-h</code>] [<code class="option">-v</code>] [<code class="option">-j</code>] [<code class="option">-t <em class="replaceable"><code>directory</code></em></code>] {filename} [<code class="option">-z</code>]</p></div>
+<div class="cmdsynopsis"><p><code class="command">named-checkconf</code> [<code class="option">-h</code>] [<code class="option">-v</code>] [<code class="option">-j</code>] [<code class="option">-t <em class="replaceable"><code>directory</code></em></code>] {filename} [<code class="option">-p</code>] [<code class="option">-z</code>]</p></div>
</div>
<div class="refsect1" lang="en">
-<a name="id2608468"></a><h2>DESCRIPTION</h2>
+<a name="id2617782"></a><h2>DESCRIPTION</h2>
<p><span><strong class="command">named-checkconf</strong></span>
- checks the syntax, but not the semantics, of a named
- configuration file.
+ checks the syntax, but not the semantics, of a
+ <span><strong class="command">named</strong></span> configuration file. The file is parsed
+ and checked for syntax errors, along with all files included by it.
+ If no file is specified, <code class="filename">/etc/named.conf</code> is read
+ by default.
+ </p>
+<p>
+ Note: files that <span><strong class="command">named</strong></span> reads in separate
+ parser contexts, such as <code class="filename">rndc.key</code> and
+ <code class="filename">bind.keys</code>, are not automatically read
+ by <span><strong class="command">named-checkconf</strong></span>. Configuration
+ errors in these files may cause <span><strong class="command">named</strong></span> to
+ fail to run, even if <span><strong class="command">named-checkconf</strong></span> was
+ successful. <span><strong class="command">named-checkconf</strong></span> can be run
+ on these files explicitly, however.
</p>
</div>
<div class="refsect1" lang="en">
-<a name="id2608482"></a><h2>OPTIONS</h2>
+<a name="id2617852"></a><h2>OPTIONS</h2>
<div class="variablelist"><dl>
<dt><span class="term">-h</span></dt>
<dd><p>
@@ -65,8 +78,7 @@
</p></dd>
<dt><span class="term">-t <em class="replaceable"><code>directory</code></em></span></dt>
<dd><p>
- Chroot to <code class="filename">directory</code> so that
- include
+ Chroot to <code class="filename">directory</code> so that include
directives in the configuration file are processed as if
run by a similarly chrooted named.
</p></dd>
@@ -75,6 +87,11 @@
Print the version of the <span><strong class="command">named-checkconf</strong></span>
program and exit.
</p></dd>
+<dt><span class="term">-p</span></dt>
+<dd><p>
+ Print out the <code class="filename">named.conf</code> and included files
+ in canonical form if no errors were detected.
+ </p></dd>
<dt><span class="term">-z</span></dt>
<dd><p>
Perform a test load of all master zones found in
@@ -92,21 +109,21 @@
</dl></div>
</div>
<div class="refsect1" lang="en">
-<a name="id2608598"></a><h2>RETURN VALUES</h2>
+<a name="id2617987"></a><h2>RETURN VALUES</h2>
<p><span><strong class="command">named-checkconf</strong></span>
returns an exit status of 1 if
errors were detected and 0 otherwise.
</p>
</div>
<div class="refsect1" lang="en">
-<a name="id2608885"></a><h2>SEE ALSO</h2>
+<a name="id2618001"></a><h2>SEE ALSO</h2>
<p><span class="citerefentry"><span class="refentrytitle">named</span>(8)</span>,
<span class="citerefentry"><span class="refentrytitle">named-checkzone</span>(8)</span>,
<em class="citetitle">BIND 9 Administrator Reference Manual</em>.
</p>
</div>
<div class="refsect1" lang="en">
-<a name="id2608915"></a><h2>AUTHOR</h2>
+<a name="id2618030"></a><h2>AUTHOR</h2>
<p><span class="corpauthor">Internet Systems Consortium</span>
</p>
</div>
diff --git a/contrib/bind9/doc/arm/man.named-checkzone.html b/contrib/bind9/doc/arm/man.named-checkzone.html
index aeaf7d3..e7d9dc1 100644
--- a/contrib/bind9/doc/arm/man.named-checkzone.html
+++ b/contrib/bind9/doc/arm/man.named-checkzone.html
@@ -1,5 +1,5 @@
<!--
- - Copyright (C) 2004-2010 Internet Systems Consortium, Inc. ("ISC")
+ - Copyright (C) 2004-2011 Internet Systems Consortium, Inc. ("ISC")
- Copyright (C) 2000-2003 Internet Software Consortium.
-
- Permission to use, copy, modify, and/or distribute this software for any
@@ -14,7 +14,7 @@
- OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
- PERFORMANCE OF THIS SOFTWARE.
-->
-<!-- $Id: man.named-checkzone.html,v 1.98.14.22 2010-08-20 02:05:37 tbox Exp $ -->
+<!-- $Id: man.named-checkzone.html,v 1.183.8.1.2.1 2011-06-09 03:41:10 tbox Exp $ -->
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
@@ -47,11 +47,11 @@
</div>
<div class="refsynopsisdiv">
<h2>Synopsis</h2>
-<div class="cmdsynopsis"><p><code class="command">named-checkzone</code> [<code class="option">-d</code>] [<code class="option">-h</code>] [<code class="option">-j</code>] [<code class="option">-q</code>] [<code class="option">-v</code>] [<code class="option">-c <em class="replaceable"><code>class</code></em></code>] [<code class="option">-f <em class="replaceable"><code>format</code></em></code>] [<code class="option">-F <em class="replaceable"><code>format</code></em></code>] [<code class="option">-i <em class="replaceable"><code>mode</code></em></code>] [<code class="option">-k <em class="replaceable"><code>mode</code></em></code>] [<code class="option">-m <em class="replaceable"><code>mode</code></em></code>] [<code class="option">-M <em class="replaceable"><code>mode</code></em></code>] [<code class="option">-n <em class="replaceable"><code>mode</code></em></code>] [<code class="option">-s <em class="replaceable"><code>style</code></em></code>] [<code class="option">-S <em class="replaceable"><code>mode</code></em></code>] [<code class="option">-t <em class="replaceable"><code>directory</code></em></code>] [<code class="option">-w <em class="replaceable"><code>directory</code></em></code>] [<code class="option">-D</code>] [<code class="option">-W <em class="replaceable"><code>mode</code></em></code>] {zonename} {filename}</p></div>
-<div class="cmdsynopsis"><p><code class="command">named-compilezone</code> [<code class="option">-d</code>] [<code class="option">-j</code>] [<code class="option">-q</code>] [<code class="option">-v</code>] [<code class="option">-c <em class="replaceable"><code>class</code></em></code>] [<code class="option">-C <em class="replaceable"><code>mode</code></em></code>] [<code class="option">-f <em class="replaceable"><code>format</code></em></code>] [<code class="option">-F <em class="replaceable"><code>format</code></em></code>] [<code class="option">-i <em class="replaceable"><code>mode</code></em></code>] [<code class="option">-k <em class="replaceable"><code>mode</code></em></code>] [<code class="option">-m <em class="replaceable"><code>mode</code></em></code>] [<code class="option">-n <em class="replaceable"><code>mode</code></em></code>] [<code class="option">-o <em class="replaceable"><code>filename</code></em></code>] [<code class="option">-s <em class="replaceable"><code>style</code></em></code>] [<code class="option">-t <em class="replaceable"><code>directory</code></em></code>] [<code class="option">-w <em class="replaceable"><code>directory</code></em></code>] [<code class="option">-D</code>] [<code class="option">-W <em class="replaceable"><code>mode</code></em></code>] {<code class="option">-o <em class="replaceable"><code>filename</code></em></code>} {zonename} {filename}</p></div>
+<div class="cmdsynopsis"><p><code class="command">named-checkzone</code> [<code class="option">-d</code>] [<code class="option">-h</code>] [<code class="option">-j</code>] [<code class="option">-q</code>] [<code class="option">-v</code>] [<code class="option">-c <em class="replaceable"><code>class</code></em></code>] [<code class="option">-f <em class="replaceable"><code>format</code></em></code>] [<code class="option">-F <em class="replaceable"><code>format</code></em></code>] [<code class="option">-i <em class="replaceable"><code>mode</code></em></code>] [<code class="option">-k <em class="replaceable"><code>mode</code></em></code>] [<code class="option">-m <em class="replaceable"><code>mode</code></em></code>] [<code class="option">-M <em class="replaceable"><code>mode</code></em></code>] [<code class="option">-n <em class="replaceable"><code>mode</code></em></code>] [<code class="option">-o <em class="replaceable"><code>filename</code></em></code>] [<code class="option">-r <em class="replaceable"><code>mode</code></em></code>] [<code class="option">-s <em class="replaceable"><code>style</code></em></code>] [<code class="option">-S <em class="replaceable"><code>mode</code></em></code>] [<code class="option">-t <em class="replaceable"><code>directory</code></em></code>] [<code class="option">-w <em class="replaceable"><code>directory</code></em></code>] [<code class="option">-D</code>] [<code class="option">-W <em class="replaceable"><code>mode</code></em></code>] {zonename} {filename}</p></div>
+<div class="cmdsynopsis"><p><code class="command">named-compilezone</code> [<code class="option">-d</code>] [<code class="option">-j</code>] [<code class="option">-q</code>] [<code class="option">-v</code>] [<code class="option">-c <em class="replaceable"><code>class</code></em></code>] [<code class="option">-C <em class="replaceable"><code>mode</code></em></code>] [<code class="option">-f <em class="replaceable"><code>format</code></em></code>] [<code class="option">-F <em class="replaceable"><code>format</code></em></code>] [<code class="option">-i <em class="replaceable"><code>mode</code></em></code>] [<code class="option">-k <em class="replaceable"><code>mode</code></em></code>] [<code class="option">-m <em class="replaceable"><code>mode</code></em></code>] [<code class="option">-n <em class="replaceable"><code>mode</code></em></code>] [<code class="option">-r <em class="replaceable"><code>mode</code></em></code>] [<code class="option">-s <em class="replaceable"><code>style</code></em></code>] [<code class="option">-t <em class="replaceable"><code>directory</code></em></code>] [<code class="option">-w <em class="replaceable"><code>directory</code></em></code>] [<code class="option">-D</code>] [<code class="option">-W <em class="replaceable"><code>mode</code></em></code>] {<code class="option">-o <em class="replaceable"><code>filename</code></em></code>} {zonename} {filename}</p></div>
</div>
<div class="refsect1" lang="en">
-<a name="id2609661"></a><h2>DESCRIPTION</h2>
+<a name="id2619464"></a><h2>DESCRIPTION</h2>
<p><span><strong class="command">named-checkzone</strong></span>
checks the syntax and integrity of a zone file. It performs the
same checks as <span><strong class="command">named</strong></span> does when loading a
@@ -71,7 +71,7 @@
</p>
</div>
<div class="refsect1" lang="en">
-<a name="id2609712"></a><h2>OPTIONS</h2>
+<a name="id2619514"></a><h2>OPTIONS</h2>
<div class="variablelist"><dl>
<dt><span class="term">-d</span></dt>
<dd><p>
@@ -195,6 +195,14 @@
write to standard out.
This is mandatory for <span><strong class="command">named-compilezone</strong></span>.
</p></dd>
+<dt><span class="term">-r <em class="replaceable"><code>mode</code></em></span></dt>
+<dd><p>
+ Check for records that are treated as different by DNSSEC but
+ are semantically equal in plain DNS.
+ Possible modes are <span><strong class="command">"fail"</strong></span>,
+ <span><strong class="command">"warn"</strong></span> (default) and
+ <span><strong class="command">"ignore"</strong></span>.
+ </p></dd>
<dt><span class="term">-s <em class="replaceable"><code>style</code></em></span></dt>
<dd><p>
Specify the style of the dumped zone file.
@@ -257,14 +265,14 @@
</dl></div>
</div>
<div class="refsect1" lang="en">
-<a name="id2660557"></a><h2>RETURN VALUES</h2>
+<a name="id2672646"></a><h2>RETURN VALUES</h2>
<p><span><strong class="command">named-checkzone</strong></span>
returns an exit status of 1 if
errors were detected and 0 otherwise.
</p>
</div>
<div class="refsect1" lang="en">
-<a name="id2660571"></a><h2>SEE ALSO</h2>
+<a name="id2672660"></a><h2>SEE ALSO</h2>
<p><span class="citerefentry"><span class="refentrytitle">named</span>(8)</span>,
<span class="citerefentry"><span class="refentrytitle">named-checkconf</span>(8)</span>,
<em class="citetitle">RFC 1035</em>,
@@ -272,7 +280,7 @@
</p>
</div>
<div class="refsect1" lang="en">
-<a name="id2660604"></a><h2>AUTHOR</h2>
+<a name="id2672693"></a><h2>AUTHOR</h2>
<p><span class="corpauthor">Internet Systems Consortium</span>
</p>
</div>
diff --git a/contrib/bind9/doc/arm/man.named-journalprint.html b/contrib/bind9/doc/arm/man.named-journalprint.html
new file mode 100644
index 0000000..11d98a1
--- /dev/null
+++ b/contrib/bind9/doc/arm/man.named-journalprint.html
@@ -0,0 +1,112 @@
+<!--
+ - Copyright (C) 2004-2011 Internet Systems Consortium, Inc. ("ISC")
+ - Copyright (C) 2000-2003 Internet Software Consortium.
+ -
+ - Permission to use, copy, modify, and/or 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 ISC DISCLAIMS ALL WARRANTIES WITH
+ - REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+ - AND FITNESS. IN NO EVENT SHALL ISC 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.
+-->
+<!-- $Id: man.named-journalprint.html,v 1.33.8.1.2.1 2011-06-09 03:41:10 tbox Exp $ -->
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
+<title>named-journalprint</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.71.1">
+<link rel="start" href="Bv9ARM.html" title="BIND 9 Administrator Reference Manual">
+<link rel="up" href="Bv9ARM.ch10.html" title="Manual pages">
+<link rel="prev" href="man.named.html" title="named">
+<link rel="next" href="man.nsupdate.html" title="nsupdate">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<div class="navheader">
+<table width="100%" summary="Navigation header">
+<tr><th colspan="3" align="center"><span class="application">named-journalprint</span></th></tr>
+<tr>
+<td width="20%" align="left">
+<a accesskey="p" href="man.named.html">Prev</a> </td>
+<th width="60%" align="center">Manual pages</th>
+<td width="20%" align="right"> <a accesskey="n" href="man.nsupdate.html">Next</a>
+</td>
+</tr>
+</table>
+<hr>
+</div>
+<div class="refentry" lang="en">
+<a name="man.named-journalprint"></a><div class="titlepage"></div>
+<div class="refnamediv">
+<h2>Name</h2>
+<p><span class="application">named-journalprint</span> &#8212; print zone journal in human-readable form</p>
+</div>
+<div class="refsynopsisdiv">
+<h2>Synopsis</h2>
+<div class="cmdsynopsis"><p><code class="command">named-journalprint</code> {<em class="replaceable"><code>journal</code></em>}</p></div>
+</div>
+<div class="refsect1" lang="en">
+<a name="id2613314"></a><h2>DESCRIPTION</h2>
+<p>
+ <span><strong class="command">named-journalprint</strong></span>
+ prints the contents of a zone journal file in a human-readable
+ form.
+ </p>
+<p>
+ Journal files are automatically created by <span><strong class="command">named</strong></span>
+ when changes are made to dynamic zones (e.g., by
+ <span><strong class="command">nsupdate</strong></span>). They record each addition
+ or deletion of a resource record, in binary format, allowing the
+ changes to be re-applied to the zone when the server is
+ restarted after a shutdown or crash. By default, the name of
+ the journal file is formed by appending the extension
+ <code class="filename">.jnl</code> to the name of the corresponding
+ zone file.
+ </p>
+<p>
+ <span><strong class="command">named-journalprint</strong></span> converts the contents of a given
+ journal file into a human-readable text format. Each line begins
+ with "add" or "del", to indicate whether the record was added or
+ deleted, and continues with the resource record in master-file
+ format.
+ </p>
+</div>
+<div class="refsect1" lang="en">
+<a name="id2638550"></a><h2>SEE ALSO</h2>
+<p>
+ <span class="citerefentry"><span class="refentrytitle">named</span>(8)</span>,
+ <span class="citerefentry"><span class="refentrytitle">nsupdate</span>(8)</span>,
+ <em class="citetitle">BIND 9 Administrator Reference Manual</em>.
+ </p>
+</div>
+<div class="refsect1" lang="en">
+<a name="id2638581"></a><h2>AUTHOR</h2>
+<p><span class="corpauthor">Internet Systems Consortium</span>
+ </p>
+</div>
+</div>
+<div class="navfooter">
+<hr>
+<table width="100%" summary="Navigation footer">
+<tr>
+<td width="40%" align="left">
+<a accesskey="p" href="man.named.html">Prev</a> </td>
+<td width="20%" align="center"><a accesskey="u" href="Bv9ARM.ch10.html">Up</a></td>
+<td width="40%" align="right"> <a accesskey="n" href="man.nsupdate.html">Next</a>
+</td>
+</tr>
+<tr>
+<td width="40%" align="left" valign="top">
+<span class="application">named</span> </td>
+<td width="20%" align="center"><a accesskey="h" href="Bv9ARM.html">Home</a></td>
+<td width="40%" align="right" valign="top"> <span class="application">nsupdate</span>
+</td>
+</tr>
+</table>
+</div>
+</body>
+</html>
diff --git a/contrib/bind9/doc/arm/man.named.html b/contrib/bind9/doc/arm/man.named.html
index 9a5617f..ac45d41 100644
--- a/contrib/bind9/doc/arm/man.named.html
+++ b/contrib/bind9/doc/arm/man.named.html
@@ -1,5 +1,5 @@
<!--
- - Copyright (C) 2004-2010 Internet Systems Consortium, Inc. ("ISC")
+ - Copyright (C) 2004-2011 Internet Systems Consortium, Inc. ("ISC")
- Copyright (C) 2000-2003 Internet Software Consortium.
-
- Permission to use, copy, modify, and/or distribute this software for any
@@ -14,7 +14,7 @@
- OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
- PERFORMANCE OF THIS SOFTWARE.
-->
-<!-- $Id: man.named.html,v 1.99.14.22 2010-08-20 02:05:37 tbox Exp $ -->
+<!-- $Id: man.named.html,v 1.185.8.1.2.1 2011-06-09 03:41:10 tbox Exp $ -->
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
@@ -23,7 +23,7 @@
<link rel="start" href="Bv9ARM.html" title="BIND 9 Administrator Reference Manual">
<link rel="up" href="Bv9ARM.ch10.html" title="Manual pages">
<link rel="prev" href="man.named-checkzone.html" title="named-checkzone">
-<link rel="next" href="man.nsupdate.html" title="nsupdate">
+<link rel="next" href="man.named-journalprint.html" title="named-journalprint">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
<div class="navheader">
@@ -33,7 +33,7 @@
<td width="20%" align="left">
<a accesskey="p" href="man.named-checkzone.html">Prev</a> </td>
<th width="60%" align="center">Manual pages</th>
-<td width="20%" align="right"> <a accesskey="n" href="man.nsupdate.html">Next</a>
+<td width="20%" align="right"> <a accesskey="n" href="man.named-journalprint.html">Next</a>
</td>
</tr>
</table>
@@ -47,10 +47,10 @@
</div>
<div class="refsynopsisdiv">
<h2>Synopsis</h2>
-<div class="cmdsynopsis"><p><code class="command">named</code> [<code class="option">-4</code>] [<code class="option">-6</code>] [<code class="option">-c <em class="replaceable"><code>config-file</code></em></code>] [<code class="option">-d <em class="replaceable"><code>debug-level</code></em></code>] [<code class="option">-f</code>] [<code class="option">-g</code>] [<code class="option">-m <em class="replaceable"><code>flag</code></em></code>] [<code class="option">-n <em class="replaceable"><code>#cpus</code></em></code>] [<code class="option">-p <em class="replaceable"><code>port</code></em></code>] [<code class="option">-s</code>] [<code class="option">-S <em class="replaceable"><code>#max-socks</code></em></code>] [<code class="option">-t <em class="replaceable"><code>directory</code></em></code>] [<code class="option">-u <em class="replaceable"><code>user</code></em></code>] [<code class="option">-v</code>] [<code class="option">-V</code>] [<code class="option">-x <em class="replaceable"><code>cache-file</code></em></code>]</p></div>
+<div class="cmdsynopsis"><p><code class="command">named</code> [<code class="option">-4</code>] [<code class="option">-6</code>] [<code class="option">-c <em class="replaceable"><code>config-file</code></em></code>] [<code class="option">-d <em class="replaceable"><code>debug-level</code></em></code>] [<code class="option">-E <em class="replaceable"><code>engine-name</code></em></code>] [<code class="option">-f</code>] [<code class="option">-g</code>] [<code class="option">-m <em class="replaceable"><code>flag</code></em></code>] [<code class="option">-n <em class="replaceable"><code>#cpus</code></em></code>] [<code class="option">-p <em class="replaceable"><code>port</code></em></code>] [<code class="option">-s</code>] [<code class="option">-S <em class="replaceable"><code>#max-socks</code></em></code>] [<code class="option">-t <em class="replaceable"><code>directory</code></em></code>] [<code class="option">-u <em class="replaceable"><code>user</code></em></code>] [<code class="option">-v</code>] [<code class="option">-V</code>] [<code class="option">-x <em class="replaceable"><code>cache-file</code></em></code>]</p></div>
</div>
<div class="refsect1" lang="en">
-<a name="id2610009"></a><h2>DESCRIPTION</h2>
+<a name="id2638058"></a><h2>DESCRIPTION</h2>
<p><span><strong class="command">named</strong></span>
is a Domain Name System (DNS) server,
part of the BIND 9 distribution from ISC. For more
@@ -65,7 +65,7 @@
</p>
</div>
<div class="refsect1" lang="en">
-<a name="id2610040"></a><h2>OPTIONS</h2>
+<a name="id2638089"></a><h2>OPTIONS</h2>
<div class="variablelist"><dl>
<dt><span class="term">-4</span></dt>
<dd><p>
@@ -97,6 +97,14 @@
Debugging traces from <span><strong class="command">named</strong></span> become
more verbose as the debug level increases.
</p></dd>
+<dt><span class="term">-E <em class="replaceable"><code>engine-name</code></em></span></dt>
+<dd><p>
+ Use a crypto hardware (OpenSSL engine) for the crypto operations
+ it supports, for instance re-signing with private keys from
+ a secure key store. When compiled with PKCS#11 support
+ <em class="replaceable"><code>engine-name</code></em>
+ defaults to pkcs11, the empty name resets it to no engine.
+ </p></dd>
<dt><span class="term">-f</span></dt>
<dd><p>
Run the server in the foreground (i.e. do not daemonize).
@@ -238,7 +246,7 @@
</dl></div>
</div>
<div class="refsect1" lang="en">
-<a name="id2612619"></a><h2>SIGNALS</h2>
+<a name="id2640076"></a><h2>SIGNALS</h2>
<p>
In routine operation, signals should not be used to control
the nameserver; <span><strong class="command">rndc</strong></span> should be used
@@ -259,7 +267,7 @@
</p>
</div>
<div class="refsect1" lang="en">
-<a name="id2652264"></a><h2>CONFIGURATION</h2>
+<a name="id2640126"></a><h2>CONFIGURATION</h2>
<p>
The <span><strong class="command">named</strong></span> configuration file is too complex
to describe in detail here. A complete description is provided
@@ -276,7 +284,7 @@
</p>
</div>
<div class="refsect1" lang="en">
-<a name="id2652313"></a><h2>FILES</h2>
+<a name="id2674514"></a><h2>FILES</h2>
<div class="variablelist"><dl>
<dt><span class="term"><code class="filename">/etc/named.conf</code></span></dt>
<dd><p>
@@ -289,7 +297,7 @@
</dl></div>
</div>
<div class="refsect1" lang="en">
-<a name="id2652357"></a><h2>SEE ALSO</h2>
+<a name="id2674694"></a><h2>SEE ALSO</h2>
<p><em class="citetitle">RFC 1033</em>,
<em class="citetitle">RFC 1034</em>,
<em class="citetitle">RFC 1035</em>,
@@ -302,7 +310,7 @@
</p>
</div>
<div class="refsect1" lang="en">
-<a name="id2652427"></a><h2>AUTHOR</h2>
+<a name="id2674764"></a><h2>AUTHOR</h2>
<p><span class="corpauthor">Internet Systems Consortium</span>
</p>
</div>
@@ -314,14 +322,14 @@
<td width="40%" align="left">
<a accesskey="p" href="man.named-checkzone.html">Prev</a> </td>
<td width="20%" align="center"><a accesskey="u" href="Bv9ARM.ch10.html">Up</a></td>
-<td width="40%" align="right"> <a accesskey="n" href="man.nsupdate.html">Next</a>
+<td width="40%" align="right"> <a accesskey="n" href="man.named-journalprint.html">Next</a>
</td>
</tr>
<tr>
<td width="40%" align="left" valign="top">
<span class="application">named-checkzone</span> </td>
<td width="20%" align="center"><a accesskey="h" href="Bv9ARM.html">Home</a></td>
-<td width="40%" align="right" valign="top"> <span class="application">nsupdate</span>
+<td width="40%" align="right" valign="top"> <span class="application">named-journalprint</span>
</td>
</tr>
</table>
diff --git a/contrib/bind9/doc/arm/man.nsec3hash.html b/contrib/bind9/doc/arm/man.nsec3hash.html
new file mode 100644
index 0000000..9f1fa6c
--- /dev/null
+++ b/contrib/bind9/doc/arm/man.nsec3hash.html
@@ -0,0 +1,113 @@
+<!--
+ - Copyright (C) 2004-2011 Internet Systems Consortium, Inc. ("ISC")
+ - Copyright (C) 2000-2003 Internet Software Consortium.
+ -
+ - Permission to use, copy, modify, and/or 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 ISC DISCLAIMS ALL WARRANTIES WITH
+ - REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+ - AND FITNESS. IN NO EVENT SHALL ISC 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.
+-->
+<!-- $Id: man.nsec3hash.html,v 1.34.8.1.2.1 2011-06-09 03:41:11 tbox Exp $ -->
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
+<title>nsec3hash</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.71.1">
+<link rel="start" href="Bv9ARM.html" title="BIND 9 Administrator Reference Manual">
+<link rel="up" href="Bv9ARM.ch10.html" title="Manual pages">
+<link rel="prev" href="man.isc-hmac-fixup.html" title="isc-hmac-fixup">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<div class="navheader">
+<table width="100%" summary="Navigation header">
+<tr><th colspan="3" align="center"><span class="application">nsec3hash</span></th></tr>
+<tr>
+<td width="20%" align="left">
+<a accesskey="p" href="man.isc-hmac-fixup.html">Prev</a> </td>
+<th width="60%" align="center">Manual pages</th>
+<td width="20%" align="right"> </td>
+</tr>
+</table>
+<hr>
+</div>
+<div class="refentry" lang="en">
+<a name="man.nsec3hash"></a><div class="titlepage"></div>
+<div class="refnamediv">
+<h2>Name</h2>
+<p><span class="application">nsec3hash</span> &#8212; generate NSEC3 hash</p>
+</div>
+<div class="refsynopsisdiv">
+<h2>Synopsis</h2>
+<div class="cmdsynopsis"><p><code class="command">nsec3hash</code> {<em class="replaceable"><code>salt</code></em>} {<em class="replaceable"><code>algorithm</code></em>} {<em class="replaceable"><code>iterations</code></em>} {<em class="replaceable"><code>domain</code></em>}</p></div>
+</div>
+<div class="refsect1" lang="en">
+<a name="id2651073"></a><h2>DESCRIPTION</h2>
+<p>
+ <span><strong class="command">nsec3hash</strong></span> generates an NSEC3 hash based on
+ a set of NSEC3 parameters. This can be used to check the validity
+ of NSEC3 records in a signed zone.
+ </p>
+</div>
+<div class="refsect1" lang="en">
+<a name="id2651088"></a><h2>ARGUMENTS</h2>
+<div class="variablelist"><dl>
+<dt><span class="term">salt</span></dt>
+<dd><p>
+ The salt provided to the hash algorithm.
+ </p></dd>
+<dt><span class="term">algorithm</span></dt>
+<dd><p>
+ A number indicating the hash algorithm. Currently the
+ only supported hash algorithm for NSEC3 is SHA-1, which is
+ indicated by the number 1; consequently "1" is the only
+ useful value for this argument.
+ </p></dd>
+<dt><span class="term">iterations</span></dt>
+<dd><p>
+ The number of additional times the hash should be performed.
+ </p></dd>
+<dt><span class="term">domain</span></dt>
+<dd><p>
+ The domain name to be hashed.
+ </p></dd>
+</dl></div>
+</div>
+<div class="refsect1" lang="en">
+<a name="id2651149"></a><h2>SEE ALSO</h2>
+<p>
+ <em class="citetitle">BIND 9 Administrator Reference Manual</em>,
+ <em class="citetitle">RFC 5155</em>.
+ </p>
+</div>
+<div class="refsect1" lang="en">
+<a name="id2651166"></a><h2>AUTHOR</h2>
+<p><span class="corpauthor">Internet Systems Consortium</span>
+ </p>
+</div>
+</div>
+<div class="navfooter">
+<hr>
+<table width="100%" summary="Navigation footer">
+<tr>
+<td width="40%" align="left">
+<a accesskey="p" href="man.isc-hmac-fixup.html">Prev</a> </td>
+<td width="20%" align="center"><a accesskey="u" href="Bv9ARM.ch10.html">Up</a></td>
+<td width="40%" align="right"> </td>
+</tr>
+<tr>
+<td width="40%" align="left" valign="top">
+<span class="application">isc-hmac-fixup</span> </td>
+<td width="20%" align="center"><a accesskey="h" href="Bv9ARM.html">Home</a></td>
+<td width="40%" align="right" valign="top"> </td>
+</tr>
+</table>
+</div>
+</body>
+</html>
diff --git a/contrib/bind9/doc/arm/man.nsupdate.html b/contrib/bind9/doc/arm/man.nsupdate.html
index 597b2f1..c5d983a 100644
--- a/contrib/bind9/doc/arm/man.nsupdate.html
+++ b/contrib/bind9/doc/arm/man.nsupdate.html
@@ -1,5 +1,5 @@
<!--
- - Copyright (C) 2004-2010 Internet Systems Consortium, Inc. ("ISC")
+ - Copyright (C) 2004-2011 Internet Systems Consortium, Inc. ("ISC")
- Copyright (C) 2000-2003 Internet Software Consortium.
-
- Permission to use, copy, modify, and/or distribute this software for any
@@ -14,7 +14,7 @@
- OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
- PERFORMANCE OF THIS SOFTWARE.
-->
-<!-- $Id: man.nsupdate.html,v 1.22.14.24 2010-08-20 02:05:38 tbox Exp $ -->
+<!-- $Id: man.nsupdate.html,v 1.110.8.1.2.1 2011-06-09 03:41:10 tbox Exp $ -->
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
@@ -22,7 +22,7 @@
<meta name="generator" content="DocBook XSL Stylesheets V1.71.1">
<link rel="start" href="Bv9ARM.html" title="BIND 9 Administrator Reference Manual">
<link rel="up" href="Bv9ARM.ch10.html" title="Manual pages">
-<link rel="prev" href="man.named.html" title="named">
+<link rel="prev" href="man.named-journalprint.html" title="named-journalprint">
<link rel="next" href="man.rndc.html" title="rndc">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
@@ -31,7 +31,7 @@
<tr><th colspan="3" align="center"><span class="application">nsupdate</span></th></tr>
<tr>
<td width="20%" align="left">
-<a accesskey="p" href="man.named.html">Prev</a> </td>
+<a accesskey="p" href="man.named-journalprint.html">Prev</a> </td>
<th width="60%" align="center">Manual pages</th>
<td width="20%" align="right"> <a accesskey="n" href="man.rndc.html">Next</a>
</td>
@@ -47,12 +47,12 @@
</div>
<div class="refsynopsisdiv">
<h2>Synopsis</h2>
-<div class="cmdsynopsis"><p><code class="command">nsupdate</code> [<code class="option">-d</code>] [<code class="option">-D</code>] [[<code class="option">-g</code>] | [<code class="option">-o</code>] | [<code class="option">-y <em class="replaceable"><code>[<span class="optional">hmac:</span>]keyname:secret</code></em></code>] | [<code class="option">-k <em class="replaceable"><code>keyfile</code></em></code>]] [<code class="option">-t <em class="replaceable"><code>timeout</code></em></code>] [<code class="option">-u <em class="replaceable"><code>udptimeout</code></em></code>] [<code class="option">-r <em class="replaceable"><code>udpretries</code></em></code>] [<code class="option">-R <em class="replaceable"><code>randomdev</code></em></code>] [<code class="option">-v</code>] [filename]</p></div>
+<div class="cmdsynopsis"><p><code class="command">nsupdate</code> [<code class="option">-d</code>] [<code class="option">-D</code>] [[<code class="option">-g</code>] | [<code class="option">-o</code>] | [<code class="option">-l</code>] | [<code class="option">-y <em class="replaceable"><code>[<span class="optional">hmac:</span>]keyname:secret</code></em></code>] | [<code class="option">-k <em class="replaceable"><code>keyfile</code></em></code>]] [<code class="option">-t <em class="replaceable"><code>timeout</code></em></code>] [<code class="option">-u <em class="replaceable"><code>udptimeout</code></em></code>] [<code class="option">-r <em class="replaceable"><code>udpretries</code></em></code>] [<code class="option">-R <em class="replaceable"><code>randomdev</code></em></code>] [<code class="option">-v</code>] [filename]</p></div>
</div>
<div class="refsect1" lang="en">
-<a name="id2610983"></a><h2>DESCRIPTION</h2>
+<a name="id2638810"></a><h2>DESCRIPTION</h2>
<p><span><strong class="command">nsupdate</strong></span>
- is used to submit Dynamic DNS Update requests as defined in RFC2136
+ is used to submit Dynamic DNS Update requests as defined in RFC 2136
to a name server.
This allows resource records to be added or removed from a zone
without manually editing the zone file.
@@ -88,10 +88,14 @@
report additional debugging information to <code class="option">-d</code>.
</p>
<p>
+ The <code class="option">-L</code> option with an integer argument of zero or
+ higher sets the logging debug level. If zero, logging is disabled.
+ </p>
+<p>
Transaction signatures can be used to authenticate the Dynamic
DNS updates. These use the TSIG resource record type described
- in RFC2845 or the SIG(0) record described in RFC3535 and
- RFC2931 or GSS-TSIG as described in RFC3645. TSIG relies on
+ in RFC 2845 or the SIG(0) record described in RFC 2535 and
+ RFC 2931 or GSS-TSIG as described in RFC 3645. TSIG relies on
a shared secret that should only be known to
<span><strong class="command">nsupdate</strong></span> and the name server. Currently,
the only supported encryption algorithm for TSIG is HMAC-MD5,
@@ -108,44 +112,59 @@
record in a zone served by the name server.
<span><strong class="command">nsupdate</strong></span> does not read
<code class="filename">/etc/named.conf</code>.
- GSS-TSIG uses Kerberos credentials.
+ </p>
+<p>
+ GSS-TSIG uses Kerberos credentials. Standard GSS-TSIG mode
+ is switched on with the <code class="option">-g</code> flag. A
+ non-standards-compliant variant of GSS-TSIG used by Windows
+ 2000 can be switched on with the <code class="option">-o</code> flag.
</p>
<p><span><strong class="command">nsupdate</strong></span>
uses the <code class="option">-y</code> or <code class="option">-k</code> option
to provide the shared secret needed to generate a TSIG record
for authenticating Dynamic DNS update requests, default type
- HMAC-MD5. These options are mutually exclusive. With the
- <code class="option">-k</code> option, <span><strong class="command">nsupdate</strong></span> reads
- the shared secret from the file <em class="parameter"><code>keyfile</code></em>,
- whose name is of the form
- <code class="filename">K{name}.+157.+{random}.private</code>. For
- historical reasons, the file
- <code class="filename">K{name}.+157.+{random}.key</code> must also be
- present. When the <code class="option">-y</code> option is used, a
- signature is generated from
+ HMAC-MD5. These options are mutually exclusive.
+ </p>
+<p>
+ When the <code class="option">-y</code> option is used, a signature is
+ generated from
[<span class="optional"><em class="parameter"><code>hmac:</code></em></span>]<em class="parameter"><code>keyname:secret.</code></em>
<em class="parameter"><code>keyname</code></em> is the name of the key, and
- <em class="parameter"><code>secret</code></em> is the base64 encoded shared
- secret. Use of the <code class="option">-y</code> option is discouraged
- because the shared secret is supplied as a command line
- argument in clear text. This may be visible in the output
- from
- <span class="citerefentry"><span class="refentrytitle">ps</span>(1)</span> or in a history file maintained by the user's
- shell.
+ <em class="parameter"><code>secret</code></em> is the base64 encoded shared secret.
+ Use of the <code class="option">-y</code> option is discouraged because the
+ shared secret is supplied as a command line argument in clear text.
+ This may be visible in the output from
+ <span class="citerefentry"><span class="refentrytitle">ps</span>(1)</span>
+ or in a history file maintained by the user's shell.
</p>
<p>
+ With the
+ <code class="option">-k</code> option, <span><strong class="command">nsupdate</strong></span> reads
+ the shared secret from the file <em class="parameter"><code>keyfile</code></em>.
+ Keyfiles may be in two formats: a single file containing
+ a <code class="filename">named.conf</code>-format <span><strong class="command">key</strong></span>
+ statement, which may be generated automatically by
+ <span><strong class="command">ddns-confgen</strong></span>, or a pair of files whose names are
+ of the format <code class="filename">K{name}.+157.+{random}.key</code> and
+ <code class="filename">K{name}.+157.+{random}.private</code>, which can be
+ generated by <span><strong class="command">dnssec-keygen</strong></span>.
The <code class="option">-k</code> may also be used to specify a SIG(0) key used
to authenticate Dynamic DNS update requests. In this case, the key
specified is not an HMAC-MD5 key.
</p>
<p>
- The <code class="option">-g</code> and <code class="option">-o</code> specify that
- GSS-TSIG is to be used. The <code class="option">-o</code> should only
- be used with old Microsoft Windows 2000 servers.
+ <span><strong class="command">nsupdate</strong></span> can be run in a local-host only mode
+ using the <code class="option">-l</code> flag. This sets the server address to
+ localhost (disabling the <span><strong class="command">server</strong></span> so that the server
+ address cannot be overridden). Connections to the local server will
+ use a TSIG key found in <code class="filename">/var/run/named/session.key</code>,
+ which is automatically generated by <span><strong class="command">named</strong></span> if any
+ local master zone has set <span><strong class="command">update-policy</strong></span> to
+ <span><strong class="command">local</strong></span>. The location of this key file can be
+ overridden with the <code class="option">-k</code> option.
</p>
<p>
- By default,
- <span><strong class="command">nsupdate</strong></span>
+ By default, <span><strong class="command">nsupdate</strong></span>
uses UDP to send update requests to the name server unless they are too
large to fit in a UDP request in which case TCP will be used.
The
@@ -156,6 +175,10 @@
This may be preferable when a batch of update requests is made.
</p>
<p>
+ The <code class="option">-p</code> sets the default port number to use for
+ connections to a name server. The default is 53.
+ </p>
+<p>
The <code class="option">-t</code> option sets the maximum time an update request
can
take before it is aborted. The default is 300 seconds. Zero can be
@@ -187,7 +210,7 @@
</p>
</div>
<div class="refsect1" lang="en">
-<a name="id2611378"></a><h2>INPUT FORMAT</h2>
+<a name="id2639349"></a><h2>INPUT FORMAT</h2>
<p><span><strong class="command">nsupdate</strong></span>
reads input from
<em class="parameter"><code>filename</code></em>
@@ -475,7 +498,7 @@
</p>
</div>
<div class="refsect1" lang="en">
-<a name="id2667517"></a><h2>EXAMPLES</h2>
+<a name="id2677944"></a><h2>EXAMPLES</h2>
<p>
The examples below show how
<span><strong class="command">nsupdate</strong></span>
@@ -522,19 +545,23 @@
If there are, the update request fails.
If this name does not exist, a CNAME for it is added.
This ensures that when the CNAME is added, it cannot conflict with the
- long-standing rule in RFC1034 that a name must not exist as any other
+ long-standing rule in RFC 1034 that a name must not exist as any other
record type if it exists as a CNAME.
- (The rule has been updated for DNSSEC in RFC2535 to allow CNAMEs to have
+ (The rule has been updated for DNSSEC in RFC 2535 to allow CNAMEs to have
RRSIG, DNSKEY and NSEC records.)
</p>
</div>
<div class="refsect1" lang="en">
-<a name="id2667568"></a><h2>FILES</h2>
+<a name="id2678062"></a><h2>FILES</h2>
<div class="variablelist"><dl>
<dt><span class="term"><code class="constant">/etc/resolv.conf</code></span></dt>
<dd><p>
used to identify default name server
</p></dd>
+<dt><span class="term"><code class="constant">/var/run/named/session.key</code></span></dt>
+<dd><p>
+ sets the default TSIG key for use in local-only mode
+ </p></dd>
<dt><span class="term"><code class="constant">K{name}.+157.+{random}.key</code></span></dt>
<dd><p>
base-64 encoding of HMAC-MD5 key created by
@@ -548,20 +575,22 @@
</dl></div>
</div>
<div class="refsect1" lang="en">
-<a name="id2667637"></a><h2>SEE ALSO</h2>
-<p><span class="citerefentry"><span class="refentrytitle">RFC2136</span></span>,
- <span class="citerefentry"><span class="refentrytitle">RFC3007</span></span>,
- <span class="citerefentry"><span class="refentrytitle">RFC2104</span></span>,
- <span class="citerefentry"><span class="refentrytitle">RFC2845</span></span>,
- <span class="citerefentry"><span class="refentrytitle">RFC1034</span></span>,
- <span class="citerefentry"><span class="refentrytitle">RFC2535</span></span>,
- <span class="citerefentry"><span class="refentrytitle">RFC2931</span></span>,
+<a name="id2678146"></a><h2>SEE ALSO</h2>
+<p>
+ <em class="citetitle">RFC 2136</em>,
+ <em class="citetitle">RFC 3007</em>,
+ <em class="citetitle">RFC 2104</em>,
+ <em class="citetitle">RFC 2845</em>,
+ <em class="citetitle">RFC 1034</em>,
+ <em class="citetitle">RFC 2535</em>,
+ <em class="citetitle">RFC 2931</em>,
<span class="citerefentry"><span class="refentrytitle">named</span>(8)</span>,
+ <span class="citerefentry"><span class="refentrytitle">ddns-confgen</span>(8)</span>,
<span class="citerefentry"><span class="refentrytitle">dnssec-keygen</span>(8)</span>.
</p>
</div>
<div class="refsect1" lang="en">
-<a name="id2667776"></a><h2>BUGS</h2>
+<a name="id2678203"></a><h2>BUGS</h2>
<p>
The TSIG key is redundantly stored in two separate files.
This is a consequence of nsupdate using the DST library
@@ -575,14 +604,14 @@
<table width="100%" summary="Navigation footer">
<tr>
<td width="40%" align="left">
-<a accesskey="p" href="man.named.html">Prev</a> </td>
+<a accesskey="p" href="man.named-journalprint.html">Prev</a> </td>
<td width="20%" align="center"><a accesskey="u" href="Bv9ARM.ch10.html">Up</a></td>
<td width="40%" align="right"> <a accesskey="n" href="man.rndc.html">Next</a>
</td>
</tr>
<tr>
<td width="40%" align="left" valign="top">
-<span class="application">named</span> </td>
+<span class="application">named-journalprint</span> </td>
<td width="20%" align="center"><a accesskey="h" href="Bv9ARM.html">Home</a></td>
<td width="40%" align="right" valign="top"> <span class="application">rndc</span>
</td>
diff --git a/contrib/bind9/doc/arm/man.rndc-confgen.html b/contrib/bind9/doc/arm/man.rndc-confgen.html
index 523ad92..f441b93 100644
--- a/contrib/bind9/doc/arm/man.rndc-confgen.html
+++ b/contrib/bind9/doc/arm/man.rndc-confgen.html
@@ -1,5 +1,5 @@
<!--
- - Copyright (C) 2004-2010 Internet Systems Consortium, Inc. ("ISC")
+ - Copyright (C) 2004-2011 Internet Systems Consortium, Inc. ("ISC")
- Copyright (C) 2000-2003 Internet Software Consortium.
-
- Permission to use, copy, modify, and/or distribute this software for any
@@ -14,7 +14,7 @@
- OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
- PERFORMANCE OF THIS SOFTWARE.
-->
-<!-- $Id: man.rndc-confgen.html,v 1.102.14.24 2010-08-20 02:05:38 tbox Exp $ -->
+<!-- $Id: man.rndc-confgen.html,v 1.189.8.1.2.1 2011-06-09 03:41:11 tbox Exp $ -->
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
@@ -23,6 +23,7 @@
<link rel="start" href="Bv9ARM.html" title="BIND 9 Administrator Reference Manual">
<link rel="up" href="Bv9ARM.ch10.html" title="Manual pages">
<link rel="prev" href="man.rndc.conf.html" title="rndc.conf">
+<link rel="next" href="man.ddns-confgen.html" title="ddns-confgen">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
<div class="navheader">
@@ -32,7 +33,8 @@
<td width="20%" align="left">
<a accesskey="p" href="man.rndc.conf.html">Prev</a> </td>
<th width="60%" align="center">Manual pages</th>
-<td width="20%" align="right"> </td>
+<td width="20%" align="right"> <a accesskey="n" href="man.ddns-confgen.html">Next</a>
+</td>
</tr>
</table>
<hr>
@@ -48,7 +50,7 @@
<div class="cmdsynopsis"><p><code class="command">rndc-confgen</code> [<code class="option">-a</code>] [<code class="option">-b <em class="replaceable"><code>keysize</code></em></code>] [<code class="option">-c <em class="replaceable"><code>keyfile</code></em></code>] [<code class="option">-h</code>] [<code class="option">-k <em class="replaceable"><code>keyname</code></em></code>] [<code class="option">-p <em class="replaceable"><code>port</code></em></code>] [<code class="option">-r <em class="replaceable"><code>randomfile</code></em></code>] [<code class="option">-s <em class="replaceable"><code>address</code></em></code>] [<code class="option">-t <em class="replaceable"><code>chrootdir</code></em></code>] [<code class="option">-u <em class="replaceable"><code>user</code></em></code>]</p></div>
</div>
<div class="refsect1" lang="en">
-<a name="id2613082"></a><h2>DESCRIPTION</h2>
+<a name="id2641044"></a><h2>DESCRIPTION</h2>
<p><span><strong class="command">rndc-confgen</strong></span>
generates configuration files
for <span><strong class="command">rndc</strong></span>. It can be used as a
@@ -64,7 +66,7 @@
</p>
</div>
<div class="refsect1" lang="en">
-<a name="id2613148"></a><h2>OPTIONS</h2>
+<a name="id2641110"></a><h2>OPTIONS</h2>
<div class="variablelist"><dl>
<dt><span class="term">-a</span></dt>
<dd>
@@ -171,7 +173,7 @@
</dl></div>
</div>
<div class="refsect1" lang="en">
-<a name="id2624525"></a><h2>EXAMPLES</h2>
+<a name="id2642384"></a><h2>EXAMPLES</h2>
<p>
To allow <span><strong class="command">rndc</strong></span> to be used with
no manual configuration, run
@@ -188,7 +190,7 @@
</p>
</div>
<div class="refsect1" lang="en">
-<a name="id2628541"></a><h2>SEE ALSO</h2>
+<a name="id2642440"></a><h2>SEE ALSO</h2>
<p><span class="citerefentry"><span class="refentrytitle">rndc</span>(8)</span>,
<span class="citerefentry"><span class="refentrytitle">rndc.conf</span>(5)</span>,
<span class="citerefentry"><span class="refentrytitle">named</span>(8)</span>,
@@ -196,7 +198,7 @@
</p>
</div>
<div class="refsect1" lang="en">
-<a name="id2628580"></a><h2>AUTHOR</h2>
+<a name="id2649715"></a><h2>AUTHOR</h2>
<p><span class="corpauthor">Internet Systems Consortium</span>
</p>
</div>
@@ -208,13 +210,15 @@
<td width="40%" align="left">
<a accesskey="p" href="man.rndc.conf.html">Prev</a> </td>
<td width="20%" align="center"><a accesskey="u" href="Bv9ARM.ch10.html">Up</a></td>
-<td width="40%" align="right"> </td>
+<td width="40%" align="right"> <a accesskey="n" href="man.ddns-confgen.html">Next</a>
+</td>
</tr>
<tr>
<td width="40%" align="left" valign="top">
<code class="filename">rndc.conf</code> </td>
<td width="20%" align="center"><a accesskey="h" href="Bv9ARM.html">Home</a></td>
-<td width="40%" align="right" valign="top"> </td>
+<td width="40%" align="right" valign="top"> <span class="application">ddns-confgen</span>
+</td>
</tr>
</table>
</div>
diff --git a/contrib/bind9/doc/arm/man.rndc.conf.html b/contrib/bind9/doc/arm/man.rndc.conf.html
index f454cf4..456ac38 100644
--- a/contrib/bind9/doc/arm/man.rndc.conf.html
+++ b/contrib/bind9/doc/arm/man.rndc.conf.html
@@ -1,5 +1,5 @@
<!--
- - Copyright (C) 2004-2010 Internet Systems Consortium, Inc. ("ISC")
+ - Copyright (C) 2004-2011 Internet Systems Consortium, Inc. ("ISC")
- Copyright (C) 2000-2003 Internet Software Consortium.
-
- Permission to use, copy, modify, and/or distribute this software for any
@@ -14,7 +14,7 @@
- OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
- PERFORMANCE OF THIS SOFTWARE.
-->
-<!-- $Id: man.rndc.conf.html,v 1.103.14.24 2010-08-20 02:05:38 tbox Exp $ -->
+<!-- $Id: man.rndc.conf.html,v 1.190.8.1.2.1 2011-06-09 03:41:11 tbox Exp $ -->
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
@@ -50,7 +50,7 @@
<div class="cmdsynopsis"><p><code class="command">rndc.conf</code> </p></div>
</div>
<div class="refsect1" lang="en">
-<a name="id2608299"></a><h2>DESCRIPTION</h2>
+<a name="id2640419"></a><h2>DESCRIPTION</h2>
<p><code class="filename">rndc.conf</code> is the configuration file
for <span><strong class="command">rndc</strong></span>, the BIND 9 name server control
utility. This file has a similar structure and syntax to
@@ -135,7 +135,7 @@
</p>
</div>
<div class="refsect1" lang="en">
-<a name="id2612294"></a><h2>EXAMPLE</h2>
+<a name="id2640590"></a><h2>EXAMPLE</h2>
<pre class="programlisting">
options {
default-server localhost;
@@ -209,7 +209,7 @@
</p>
</div>
<div class="refsect1" lang="en">
-<a name="id2612416"></a><h2>NAME SERVER CONFIGURATION</h2>
+<a name="id2640780"></a><h2>NAME SERVER CONFIGURATION</h2>
<p>
The name server must be configured to accept rndc connections and
to recognize the key specified in the <code class="filename">rndc.conf</code>
@@ -219,7 +219,7 @@
</p>
</div>
<div class="refsect1" lang="en">
-<a name="id2612714"></a><h2>SEE ALSO</h2>
+<a name="id2640806"></a><h2>SEE ALSO</h2>
<p><span class="citerefentry"><span class="refentrytitle">rndc</span>(8)</span>,
<span class="citerefentry"><span class="refentrytitle">rndc-confgen</span>(8)</span>,
<span class="citerefentry"><span class="refentrytitle">mmencode</span>(1)</span>,
@@ -227,7 +227,7 @@
</p>
</div>
<div class="refsect1" lang="en">
-<a name="id2612753"></a><h2>AUTHOR</h2>
+<a name="id2640844"></a><h2>AUTHOR</h2>
<p><span class="corpauthor">Internet Systems Consortium</span>
</p>
</div>
diff --git a/contrib/bind9/doc/arm/man.rndc.html b/contrib/bind9/doc/arm/man.rndc.html
index 0a6c65c..58fa67e 100644
--- a/contrib/bind9/doc/arm/man.rndc.html
+++ b/contrib/bind9/doc/arm/man.rndc.html
@@ -1,5 +1,5 @@
<!--
- - Copyright (C) 2004-2010 Internet Systems Consortium, Inc. ("ISC")
+ - Copyright (C) 2004-2011 Internet Systems Consortium, Inc. ("ISC")
- Copyright (C) 2000-2003 Internet Software Consortium.
-
- Permission to use, copy, modify, and/or distribute this software for any
@@ -14,7 +14,7 @@
- OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
- PERFORMANCE OF THIS SOFTWARE.
-->
-<!-- $Id: man.rndc.html,v 1.101.14.24 2010-08-20 02:05:38 tbox Exp $ -->
+<!-- $Id: man.rndc.html,v 1.188.8.1.2.1 2011-06-09 03:41:10 tbox Exp $ -->
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
@@ -50,7 +50,7 @@
<div class="cmdsynopsis"><p><code class="command">rndc</code> [<code class="option">-b <em class="replaceable"><code>source-address</code></em></code>] [<code class="option">-c <em class="replaceable"><code>config-file</code></em></code>] [<code class="option">-k <em class="replaceable"><code>key-file</code></em></code>] [<code class="option">-s <em class="replaceable"><code>server</code></em></code>] [<code class="option">-p <em class="replaceable"><code>port</code></em></code>] [<code class="option">-V</code>] [<code class="option">-y <em class="replaceable"><code>key_id</code></em></code>] {command}</p></div>
</div>
<div class="refsect1" lang="en">
-<a name="id2611614"></a><h2>DESCRIPTION</h2>
+<a name="id2639501"></a><h2>DESCRIPTION</h2>
<p><span><strong class="command">rndc</strong></span>
controls the operation of a name
server. It supersedes the <span><strong class="command">ndc</strong></span> utility
@@ -79,7 +79,7 @@
</p>
</div>
<div class="refsect1" lang="en">
-<a name="id2611665"></a><h2>OPTIONS</h2>
+<a name="id2639552"></a><h2>OPTIONS</h2>
<div class="variablelist"><dl>
<dt><span class="term">-b <em class="replaceable"><code>source-address</code></em></span></dt>
<dd><p>
@@ -151,7 +151,7 @@
</p>
</div>
<div class="refsect1" lang="en">
-<a name="id2612026"></a><h2>LIMITATIONS</h2>
+<a name="id2640254"></a><h2>LIMITATIONS</h2>
<p><span><strong class="command">rndc</strong></span>
does not yet support all the commands of
the BIND 8 <span><strong class="command">ndc</strong></span> utility.
@@ -165,7 +165,7 @@
</p>
</div>
<div class="refsect1" lang="en">
-<a name="id2612057"></a><h2>SEE ALSO</h2>
+<a name="id2640285"></a><h2>SEE ALSO</h2>
<p><span class="citerefentry"><span class="refentrytitle">rndc.conf</span>(5)</span>,
<span class="citerefentry"><span class="refentrytitle">rndc-confgen</span>(8)</span>,
<span class="citerefentry"><span class="refentrytitle">named</span>(8)</span>,
@@ -175,7 +175,7 @@
</p>
</div>
<div class="refsect1" lang="en">
-<a name="id2612113"></a><h2>AUTHOR</h2>
+<a name="id2640341"></a><h2>AUTHOR</h2>
<p><span class="corpauthor">Internet Systems Consortium</span>
</p>
</div>
diff --git a/contrib/bind9/doc/arm/managed-keys.xml b/contrib/bind9/doc/arm/managed-keys.xml
new file mode 100644
index 0000000..f1e06f3
--- /dev/null
+++ b/contrib/bind9/doc/arm/managed-keys.xml
@@ -0,0 +1,100 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ - Copyright (C) 2010 Internet Systems Consortium, Inc. ("ISC")
+ -
+ - Permission to use, copy, modify, and/or 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 ISC DISCLAIMS ALL WARRANTIES WITH
+ - REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+ - AND FITNESS. IN NO EVENT SHALL ISC 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.
+-->
+
+<!-- $Id: managed-keys.xml,v 1.3 2010-02-03 23:49:07 tbox Exp $ -->
+
+<sect1 id="rfc5011.support">
+ <title>Dynamic Trust Anchor Management</title>
+ <para>BIND 9.7.0 introduces support for RFC 5011, dynamic trust
+ anchor management. Using this feature allows
+ <command>named</command> to keep track of changes to critical
+ DNSSEC keys without any need for the operator to make changes to
+ configuration files.</para>
+ <sect2>
+ <title>Validating Resolver</title>
+ <!-- TODO: command tag is overloaded for configuration and executables -->
+ <para>To configure a validating resolver to use RFC 5011 to
+ maintain a trust anchor, configure the trust anchor using a
+ <command>managed-keys</command> statement. Information about
+ this can be found in
+ <xref linkend="managed-keys" />.</para>
+ <!-- TODO: managed-keys examples
+also in DNSSEC section above here in ARM -->
+ </sect2>
+ <sect2>
+ <title>Authoritative Server</title>
+ <para>To set up an authoritative zone for RFC 5011 trust anchor
+ maintenance, generate two (or more) key signing keys (KSKs) for
+ the zone. Sign the zone with one of them; this is the "active"
+ KSK. All KSK's which do not sign the zone are "stand-by"
+ keys.</para>
+ <para>Any validating resolver which is configured to use the
+ active KSK as an RFC 5011-managed trust anchor will take note
+ of the stand-by KSKs in the zone's DNSKEY RRset, and store them
+ for future reference. The resolver will recheck the zone
+ periodically, and after 30 days, if the new key is still there,
+ then the key will be accepted by the resolver as a valid trust
+ anchor for the zone. Any time after this 30-day acceptance
+ timer has completed, the active KSK can be revoked, and the
+ zone can be "rolled over" to the newly accepted key.</para>
+ <para>The easiest way to place a stand-by key in a zone is to
+ use the "smart signing" features of
+ <command>dnssec-keygen</command> and
+ <command>dnssec-signzone</command>. If a key with a publication
+ date in the past, but an activation date which is unset or in
+ the future, "
+ <command>dnssec-signzone -S</command>" will include the DNSKEY
+ record in the zone, but will not sign with it:</para>
+ <screen>
+$ <userinput>dnssec-keygen -K keys -f KSK -P now -A now+2y example.net</userinput>
+$ <userinput>dnssec-signzone -S -K keys example.net</userinput>
+</screen>
+ <para>To revoke a key, the new command
+ <command>dnssec-revoke</command> has been added. This adds the
+ REVOKED bit to the key flags and re-generates the
+ <filename>K*.key</filename> and
+ <filename>K*.private</filename> files.</para>
+ <para>After revoking the active key, the zone must be signed
+ with both the revoked KSK and the new active KSK. (Smart
+ signing takes care of this automatically.)</para>
+ <para>Once a key has been revoked and used to sign the DNSKEY
+ RRset in which it appears, that key will never again be
+ accepted as a valid trust anchor by the resolver. However,
+ validation can proceed using the new active key (which had been
+ accepted by the resolver when it was a stand-by key).</para>
+ <para>See RFC 5011 for more details on key rollover
+ scenarios.</para>
+ <para>When a key has been revoked, its key ID changes,
+ increasing by 128, and wrapping around at 65535. So, for
+ example, the key "<filename>Kexample.com.+005+10000</filename>" becomes
+ "<filename>Kexample.com.+005+10128</filename>".</para>
+ <para>If two keys have ID's exactly 128 apart, and one is
+ revoked, then the two key ID's will collide, causing several
+ problems. To prevent this,
+ <command>dnssec-keygen</command> will not generate a new key if
+ another key is present which may collide. This checking will
+ only occur if the new keys are written to the same directory
+ which holds all other keys in use for that zone.</para>
+ <para>Older versions of BIND 9 did not have this precaution.
+ Exercise caution if using key revocation on keys that were
+ generated by previous releases, or if using keys stored in
+ multiple directories or on multiple machines.</para>
+ <para>It is expected that a future release of BIND 9 will
+ address this problem in a different way, by storing revoked
+ keys with their original unrevoked key ID's.</para>
+ </sect2>
+</sect1>
diff --git a/contrib/bind9/doc/arm/pkcs11.xml b/contrib/bind9/doc/arm/pkcs11.xml
new file mode 100644
index 0000000..23bf5fd
--- /dev/null
+++ b/contrib/bind9/doc/arm/pkcs11.xml
@@ -0,0 +1,390 @@
+<!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN"
+ "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd"
+ [<!ENTITY mdash "&#8212;">]>
+<!--
+ - Copyright (C) 2010 Internet Systems Consortium, Inc. ("ISC")
+ -
+ - Permission to use, copy, modify, and/or 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 ISC DISCLAIMS ALL WARRANTIES WITH
+ - REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+ - AND FITNESS. IN NO EVENT SHALL ISC 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.
+-->
+
+<!-- $Id: pkcs11.xml,v 1.3 2010-02-06 07:42:02 marka Exp $ -->
+
+<sect1 id="pkcs11">
+ <title>PKCS #11 (Cryptoki) support</title>
+ <para>PKCS #11 (Public Key Cryptography Standard #11) defines a
+ platform- independent API for the control of hardware security
+ modules (HSMs) and other cryptographic support devices.</para>
+ <para>BIND 9 is known to work with two HSMs: The Sun SCA 6000
+ cryptographic acceleration board, tested under Solaris x86, and
+ the AEP Keyper network-attached key storage device, tested with
+ Debian Linux, Solaris x86 and Windows Server 2003.</para>
+ <sect2>
+ <title>Prerequisites</title>
+ <para>See the HSM vendor documentation for information about
+ installing, initializing, testing and troubleshooting the
+ HSM.</para>
+ <para>BIND 9 uses OpenSSL for cryptography, but stock OpenSSL
+ does not yet fully support PKCS #11. However, a PKCS #11 engine
+ for OpenSSL is available from the OpenSolaris project. It has
+ been modified by ISC to work with with BIND 9, and to provide
+ new features such as PIN management and key by
+ reference.</para>
+ <para>The patched OpenSSL depends on a "PKCS #11 provider".
+ This is a shared library object, providing a low-level PKCS #11
+ interface to the HSM hardware. It is dynamically loaded by
+ OpenSSL at runtime. The PKCS #11 provider comes from the HSM
+ vendor, and and is specific to the HSM to be controlled.</para>
+ <para>There are two "flavors" of PKCS #11 support provided by
+ the patched OpenSSL, one of which must be chosen at
+ configuration time. The correct choice depends on the HSM
+ hardware:</para>
+ <itemizedlist>
+ <listitem>
+ <para>Use 'crypto-accelerator' with HSMs that have hardware
+ cryptographic acceleration features, such as the SCA 6000
+ board. This causes OpenSSL to run all supported
+ cryptographic operations in the HSM.</para>
+ </listitem>
+ <listitem>
+ <para>Use 'sign-only' with HSMs that are designed to
+ function primarily as secure key storage devices, but lack
+ hardware acceleration. These devices are highly secure, but
+ are not necessarily any faster at cryptography than the
+ system CPU &mdash; often, they are slower. It is therefore
+ most efficient to use them only for those cryptographic
+ functions that require access to the secured private key,
+ such as zone signing, and to use the system CPU for all
+ other computationally-intensive operations. The AEP Keyper
+ is an example of such a device.</para>
+ </listitem>
+ </itemizedlist>
+ <para>The modified OpenSSL code is included in the BIND 9.7.0
+ release, in the form of a context diff against the latest OpenSSL.
+ </para>
+ <note>
+ The latest OpenSSL version at the time of the BIND release
+ is 0.9.8l.
+ ISC will provide an updated patch as new versions of OpenSSL
+ are released. The version number in the following examples
+ is expected to change.</note>
+ <para>
+ Before building BIND 9 with PKCS #11 support, it will be
+ necessary to build OpenSSL with this patch in place and inform
+ it of the path to the HSM-specific PKCS #11 provider
+ library.</para>
+ <para>Obtain OpenSSL 0.9.8l:</para>
+ <screen>
+$ <userinput>wget <ulink>http://www.openssl.org/source/openssl-0.9.8l.tar.gz</ulink></userinput>
+</screen>
+ <para>Extract the tarball:</para>
+ <screen>
+$ <userinput>tar zxf openssl-0.9.8l.tar.gz</userinput>
+</screen>
+ <para>Apply the patch from the BIND 9 release:</para>
+ <screen>
+$ <userinput>patch -p1 -d openssl-0.9.8l \
+ &lt; bind-9.7.0/bin/pkcs11/openssl-0.9.8l-patch</userinput>
+</screen>
+ <note>(Note that the patch file may not be compatible with the
+ "patch" utility on all operating systems. You may need to
+ install GNU patch.)</note>
+ <para>When building OpenSSL, place it in a non-standard
+ location so that it does not interfere with OpenSSL libraries
+ elsewhere on the system. In the following examples, we choose
+ to install into "/opt/pkcs11/usr". We will use this location
+ when we configure BIND 9.</para>
+ <sect3>
+ <!-- Example 1 -->
+ <title>Building OpenSSL for the AEP Keyper on Linux</title>
+ <para>The AEP Keyper is a highly secure key storage device,
+ but does not provide hardware cryptographic acceleration. It
+ can carry out cryptographic operations, but it is probably
+ slower than your system's CPU. Therefore, we choose the
+ 'sign-only' flavor when building OpenSSL.</para>
+ <para>The Keyper-specific PKCS #11 provider library is
+ delivered with the Keyper software. In this example, we place
+ it /opt/pkcs11/usr/lib:</para>
+ <screen>
+$ <userinput>cp pkcs11.GCC4.0.2.so.4.05 /opt/pkcs11/usr/lib/libpkcs11.so</userinput>
+</screen>
+ <para>This library is only available for Linux as a 32-bit
+ binary. If we are compiling on a 64-bit Linux system, it is
+ necessary to force a 32-bit build, by specifying -m32 in the
+ build options.</para>
+ <para>Finally, the Keyper library requires threads, so we
+ must specify -pthread.</para>
+ <screen>
+$ <userinput>cd openssl-0.9.8l</userinput>
+$ <userinput>./Configure linux-generic32 -m32 -pthread \
+ --pk11-libname=/opt/pkcs11/usr/lib/libpkcs11.so \
+ --pk11-flavor=sign-only \
+ --prefix=/opt/pkcs11/usr</userinput>
+</screen>
+ <para>After configuring, run "<command>make</command>"
+ and "<command>make test</command>". If "<command>make
+ test</command>" fails with "pthread_atfork() not found", you forgot to
+ add the -pthread above.</para>
+ </sect3>
+ <sect3>
+ <!-- Example 2 -->
+ <title>Building OpenSSL for the SCA 6000 on Solaris</title>
+ <para>The SCA-6000 PKCS #11 provider is installed as a system
+ library, libpkcs11. It is a true crypto accelerator, up to 4
+ times faster than any CPU, so the flavor shall be
+ 'crypto-accelerator'.</para>
+ <para>In this example, we are building on Solaris x86 on an
+ AMD64 system.</para>
+ <screen>
+$ <userinput>cd openssl-0.9.8l</userinput>
+$ <userinput>./Configure solaris64-x86_64-cc \
+ --pk11-libname=/usr/lib/64/libpkcs11.so \
+ --pk11-flavor=crypto-accelerator \
+ --prefix=/opt/pkcs11/usr</userinput>
+</screen>
+ <para>(For a 32-bit build, use "solaris-x86-cc" and
+ /usr/lib/libpkcs11.so.)</para>
+ <para>After configuring, run
+ <command>make</command> and
+ <command>make test</command>.</para>
+ <para>Once you have built OpenSSL, run
+ "<command>apps/openssl engine pkcs11</command>" to confirm
+ that PKCS #11 support was compiled in correctly. The output
+ should be one of the following lines, depending on the flavor
+ selected:</para>
+ <screen>
+ (pkcs11) PKCS #11 engine support (sign only)
+</screen>
+ <para>Or:</para>
+ <screen>
+ (pkcs11) PKCS #11 engine support (crypto accelerator)
+</screen>
+ <para>Next, run
+ "<command>apps/openssl engine pkcs11 -t</command>". This will
+ attempt to initialize the PKCS #11 engine. If it is able to
+ do so successfully, it will report
+ <quote><literal>[ available ]</literal></quote>.</para>
+ <para>If the output is correct, run
+ "<command>make install</command>" which will install the
+ modified OpenSSL suite to
+ <filename>/opt/pkcs11/usr</filename>.</para>
+ </sect3>
+ </sect2>
+ <sect2>
+ <title>Building BIND 9 with PKCS#11</title>
+ <para>When building BIND 9, the location of the custom-built
+ OpenSSL library must be specified via configure.</para>
+ <sect3>
+ <!-- Example 3 -->
+ <title>Configuring BIND 9 for Linux</title>
+ <para>To link with the PKCS #11 provider, threads must be
+ enabled in the BIND 9 build.</para>
+ <para>The PKCS #11 library for the AEP Keyper is currently
+ only available as a 32-bit binary. If we are building on a
+ 64-bit host, we must force a 32-bit build by adding "-m32" to
+ the CC options on the "configure" command line.</para>
+ <screen>
+$ <userinput>cd ../bind-9.7.0</userinput>
+$ <userinput>./configure CC="gcc -m32" --enable-threads \
+ --with-openssl=/opt/pkcs11/usr \
+ --with-pkcs11=/opt/pkcs11/usr/lib/libpkcs11.so</userinput>
+</screen>
+ </sect3>
+ <sect3>
+ <!-- Example 4 -->
+ <title>Configuring BIND 9 for Solaris</title>
+ <para>To link with the PKCS #11 provider, threads must be
+ enabled in the BIND 9 build.</para>
+ <screen>
+$ <userinput>cd ../bind-9.7.0</userinput>
+$ <userinput>./configure CC="cc -xarch=amd64" --enable-threads \
+ --with-openssl=/opt/pkcs11/usr \
+ --with-pkcs11=/usr/lib/64/libpkcs11.so</userinput>
+</screen>
+ <para>(For a 32-bit build, omit CC="cc -xarch=amd64".)</para>
+ <para>If configure complains about OpenSSL not working, you
+ may have a 32/64-bit architecture mismatch. Or, you may have
+ incorrectly specified the path to OpenSSL (it should be the
+ same as the --prefix argument to the OpenSSL
+ Configure).</para>
+ </sect3>
+ <para>After configuring, run
+ "<command>make</command>",
+ "<command>make test</command>" and
+ "<command>make install</command>".</para>
+ </sect2>
+ <sect2>
+ <title>PKCS #11 Tools</title>
+ <para>BIND 9 includes a minimal set of tools to operate the
+ HSM, including
+ <command>pkcs11-keygen</command> to generate a new key pair
+ within the HSM,
+ <command>pkcs11-list</command> to list objects currently
+ available, and
+ <command>pkcs11-destroy</command> to remove objects.</para>
+ <para>In UNIX/Linux builds, these tools are built only if BIND
+ 9 is configured with the --with-pkcs11 option. (NOTE: If
+ --with-pkcs11 is set to "yes", rather than to the path of the
+ PKCS #11 provider, then the tools will be built but the
+ provider will be left undefined. Use the -m option or the
+ PKCS11_PROVIDER environment variable to specify the path to the
+ provider.)</para>
+ </sect2>
+ <sect2>
+ <title>Using the HSM</title>
+ <para>First, we must set up the runtime environment so the
+ OpenSSL and PKCS #11 libraries can be loaded:</para>
+ <screen>
+$ <userinput>export LD_LIBRARY_PATH=/opt/pkcs11/usr/lib:${LD_LIBRARY_PATH}</userinput>
+</screen>
+ <para>When operating an AEP Keyper, it is also necessary to
+ specify the location of the "machine" file, which stores
+ information about the Keyper for use by PKCS #11 provider
+ library. If the machine file is in
+ <filename>/opt/Keyper/PKCS11Provider/machine</filename>,
+ use:</para>
+ <screen>
+$ <userinput>export KEYPER_LIBRARY_PATH=/opt/Keyper/PKCS11Provider</userinput>
+</screen>
+ <!-- TODO: why not defined at compile time? -->
+ <para>These environment variables must be set whenever running
+ any tool that uses the HSM, including
+ <command>pkcs11-keygen</command>,
+ <command>pkcs11-list</command>,
+ <command>pkcs11-destroy</command>,
+ <command>dnssec-keyfromlabel</command>,
+ <command>dnssec-signzone</command>,
+ <command>dnssec-keygen</command>(which will use the HSM for
+ random number generation), and
+ <command>named</command>.</para>
+ <para>We can now create and use keys in the HSM. In this case,
+ we will create a 2048 bit key and give it the label
+ "sample-ksk":</para>
+ <screen>
+$ <userinput>pkcs11-keygen -b 2048 -l sample-ksk</userinput>
+</screen>
+ <para>To confirm that the key exists:</para>
+ <screen>
+$ <userinput>pkcs11-list</userinput>
+Enter PIN:
+object[0]: handle 2147483658 class 3 label[8] 'sample-ksk' id[0]
+object[1]: handle 2147483657 class 2 label[8] 'sample-ksk' id[0]
+</screen>
+ <para>Before using this key to sign a zone, we must create a
+ pair of BIND 9 key files. The "dnssec-keyfromlabel" utility
+ does this. In this case, we will be using the HSM key
+ "sample-ksk" as the key-signing key for "example.net":</para>
+ <screen>
+$ <userinput>dnssec-keyfromlabel -l sample-ksk -f KSK example.net</userinput>
+</screen>
+ <para>The resulting K*.key and K*.private files can now be used
+ to sign the zone. Unlike normal K* files, which contain both
+ public and private key data, these files will contain only the
+ public key data, plus an identifier for the private key which
+ remains stored within the HSM. The HSM handles signing with the
+ private key.</para>
+ <para>If you wish to generate a second key in the HSM for use
+ as a zone-signing key, follow the same procedure above, using a
+ different keylabel, a smaller key size, and omitting "-f KSK"
+ from the dnssec-keyfromlabel arguments:</para>
+ <screen>
+$ <userinput>pkcs11-keygen -b 1024 -l sample-zsk</userinput>
+$ <userinput>dnssec-keyfromlabel -l sample-zsk example.net</userinput>
+</screen>
+ <para>Alternatively, you may prefer to generate a conventional
+ on-disk key, using dnssec-keygen:</para>
+ <screen>
+$ <userinput>dnssec-keygen example.net</userinput>
+</screen>
+ <para>This provides less security than an HSM key, but since
+ HSMs can be slow or cumbersome to use for security reasons, it
+ may be more efficient to reserve HSM keys for use in the less
+ frequent key-signing operation. The zone-signing key can be
+ rolled more frequently, if you wish, to compensate for a
+ reduction in key security.</para>
+ <para>Now you can sign the zone. (Note: If not using the -S
+ option to
+ <command>dnssec-signzone</command>, it will be necessary to add
+ the contents of both
+ <filename>K*.key</filename> files to the zone master file before
+ signing it.)</para>
+ <screen>
+$ <userinput>dnssec-signzone -S example.net</userinput>
+Enter PIN:
+Verifying the zone using the following algorithms:
+NSEC3RSASHA1.
+Zone signing complete:
+Algorithm: NSEC3RSASHA1: ZSKs: 1, KSKs: 1 active, 0 revoked, 0 stand-by
+example.net.signed
+</screen>
+ </sect2>
+ <sect2>
+ <title>Specifying the engine on the command line</title>
+ <para>The OpenSSL engine can be specified in
+ <command>named</command> and all of the BIND
+ <command>dnssec-*</command> tools by using the "-E
+ &lt;engine&gt;" command line option. If BIND 9 is built with
+ the --with-pkcs11 option, this option defaults to "pkcs11".
+ Specifying the engine will generally not be necessary unless
+ for some reason you wish to use a different OpenSSL
+ engine.</para>
+ <para>If you wish to disable use of the "pkcs11" engine &mdash;
+ for troubleshooting purposes, or because the HSM is unavailable
+ &mdash; set the engine to the empty string. For example:</para>
+ <screen>
+$ <userinput>dnssec-signzone -E '' -S example.net</userinput>
+</screen>
+ <para>This causes
+ <command>dnssec-signzone</command> to run as if it were compiled
+ without the --with-pkcs11 option.</para>
+ </sect2>
+ <sect2>
+ <title>Running named with automatic zone re-signing</title>
+ <para>If you want
+ <command>named</command> to dynamically re-sign zones using HSM
+ keys, and/or to to sign new records inserted via nsupdate, then
+ named must have access to the HSM PIN. This can be accomplished
+ by placing the PIN into the openssl.cnf file (in the above
+ examples,
+ <filename>/opt/pkcs11/usr/ssl/openssl.cnf</filename>).</para>
+ <para>The location of the openssl.cnf file can be overridden by
+ setting the OPENSSL_CONF environment variable before running
+ named.</para>
+ <para>Sample openssl.cnf:</para>
+ <programlisting>
+ openssl_conf = openssl_def
+ [ openssl_def ]
+ engines = engine_section
+ [ engine_section ]
+ pkcs11 = pkcs11_section
+ [ pkcs11_section ]
+ PIN = <replaceable>&lt;PLACE PIN HERE&gt;</replaceable>
+</programlisting>
+ <para>This will also allow the dnssec-* tools to access the HSM
+ without PIN entry. (The pkcs11-* tools access the HSM directly,
+ not via OpenSSL, so a PIN will still be required to use
+ them.)</para>
+<!--
+If the PIN is not known, I believe the first time named needs the
+PIN to open a key, it'll ask you to type in the PIN, which will be
+a problem because it probably won't be running on a terminal
+-->
+ <warning>
+ <para>Placing the HSM's PIN in a text file in
+ this manner may reduce the security advantage of using an
+ HSM. Be sure this is what you want to do before configuring
+ OpenSSL in this way.</para>
+ </warning>
+ </sect2>
+ <!-- TODO: what is alternative then for named dynamic re-signing? -->
+ <!-- TODO: what happens if PIN is not known? named will log about it? -->
+</sect1>
diff --git a/contrib/bind9/doc/misc/Makefile.in b/contrib/bind9/doc/misc/Makefile.in
index 5a671b8..6468176 100644
--- a/contrib/bind9/doc/misc/Makefile.in
+++ b/contrib/bind9/doc/misc/Makefile.in
@@ -13,7 +13,7 @@
# OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
# PERFORMANCE OF THIS SOFTWARE.
-# $Id: Makefile.in,v 1.7.252.2 2009-07-11 23:47:17 tbox Exp $
+# $Id: Makefile.in,v 1.9 2009-07-10 23:47:58 tbox Exp $
srcdir = @srcdir@
VPATH = @srcdir@
diff --git a/contrib/bind9/doc/misc/options b/contrib/bind9/doc/misc/options
index a6b2dcd..673abf7 100644
--- a/contrib/bind9/doc/misc/options
+++ b/contrib/bind9/doc/misc/options
@@ -44,6 +44,9 @@ lwres {
view <string> <optional_class>;
};
+managed-keys { <string> <string> <integer> <integer> <integer>
+ <quoted_string>; ... };
+
masters <string> [ port <integer> ] { ( <masters> | <ipv4_address> [ port
<integer> ] | <ipv6_address> [ port <integer> ] ) [ key <string> ]; ... };
@@ -52,6 +55,7 @@ options {
acache-enable <boolean>;
additional-from-auth <boolean>;
additional-from-cache <boolean>;
+ allow-new-zones <boolean>;
allow-notify { <address_match_element>; ... };
allow-query { <address_match_element>; ... };
allow-query-cache { <address_match_element>; ... };
@@ -68,11 +72,14 @@ options {
alt-transfer-source ( <ipv4_address> | * ) [ port ( <integer> | * ) ];
alt-transfer-source-v6 ( <ipv6_address> | * ) [ port ( <integer> |
* ) ];
+ attach-cache <string>;
auth-nxdomain <boolean>; // default changed
avoid-v4-udp-ports { <portrange>; ... };
avoid-v6-udp-ports { <portrange>; ... };
+ bindkeys-file <quoted_string>;
blackhole { <address_match_element>; ... };
cache-file <quoted_string>;
+ check-dup-records ( fail | warn | ignore );
check-integrity <boolean>;
check-mx ( fail | warn | ignore );
check-mx-cname ( fail | warn | ignore );
@@ -85,15 +92,31 @@ options {
coresize <size>;
datasize <size>;
deallocate-on-exit <boolean>; // obsolete
+ deny-answer-addresses { <address_match_element>; ... } [
+ except-from { <quoted_string>; ... } ];
+ deny-answer-aliases { <quoted_string>; ... } [ except-from {
+ <quoted_string>; ... } ];
dialup <dialuptype>;
directory <quoted_string>;
disable-algorithms <string> { <string>; ... };
disable-empty-zone <string>;
+ dns64 <netprefix> {
+ break-dnssec <boolean>;
+ clients { <address_match_element>; ... };
+ exclude { <address_match_element>; ... };
+ mapped { <address_match_element>; ... };
+ recursive-only <boolean>;
+ suffix <ipv6_address>;
+ };
+ dns64-contact <string>;
+ dns64-server <string>;
dnssec-accept-expired <boolean>;
+ dnssec-dnskey-kskonly <boolean>;
dnssec-enable <boolean>;
dnssec-lookaside <string> trust-anchor <string>;
dnssec-must-be-secure <string> <boolean>;
- dnssec-validation <boolean>;
+ dnssec-secure-to-insecure <boolean>;
+ dnssec-validation ( yes | no | auto );
dual-stack-servers [ port <integer> ] { ( <quoted_string> [ port
<integer> ] | <ipv4_address> [ port <integer> ] |
<ipv6_address> [ port <integer> ] ); ... };
@@ -105,6 +128,8 @@ options {
fake-iquery <boolean>; // obsolete
fetch-glue <boolean>; // obsolete
files <size>;
+ filter-aaaa { <address_match_element>; ... }; // not configured
+ filter-aaaa-on-v4 <v4_aaaa>; // not configured
flush-zones-on-shutdown <boolean>;
forward ( first | only );
forwarders [ port <integer> ] { ( <ipv4_address> | <ipv6_address> )
@@ -121,6 +146,7 @@ options {
listen-on [ port <integer> ] { <address_match_element>; ... };
listen-on-v6 [ port <integer> ] { <address_match_element>; ... };
maintain-ixfr-base <boolean>; // obsolete
+ managed-keys-directory <quoted_string>;
masterfile-format ( text | raw );
match-mapped-addresses <boolean>;
max-acache-size <size_no_default>;
@@ -168,13 +194,22 @@ options {
request-ixfr <boolean>;
request-nsid <boolean>;
reserved-sockets <integer>;
+ resolver-query-timeout <integer>;
+ response-policy {
+ zone <string> [ policy ( given | no-op | nxdomain | nodata
+ | cname <domain> ) ];
+ };
rfc2308-type1 <boolean>; // not yet implemented
root-delegation-only [ exclude { <quoted_string>; ... } ];
rrset-order { [ class <string> ] [ type <string> ] [ name
<quoted_string> ] <string> <string>; ... };
+ secroots-file <quoted_string>;
serial-queries <integer>; // obsolete
serial-query-rate <integer>;
server-id ( <quoted_string> | none | hostname );
+ session-keyalg <string>;
+ session-keyfile ( <quoted_string> | none );
+ session-keyname <string>;
sig-signing-nodes <integer>;
sig-signing-signatures <integer>;
sig-signing-type <integer>;
@@ -189,6 +224,7 @@ options {
tkey-dhkey <quoted_string> <integer>;
tkey-domain <quoted_string>;
tkey-gssapi-credential <quoted_string>;
+ tkey-gssapi-keytab <quoted_string>;
topology { <address_match_element>; ... }; // not implemented
transfer-format ( many-answers | one-answer );
transfer-source ( <ipv4_address> | * ) [ port ( <integer> | * ) ];
@@ -242,6 +278,7 @@ view <string> <optional_class> {
acache-enable <boolean>;
additional-from-auth <boolean>;
additional-from-cache <boolean>;
+ allow-new-zones <boolean>;
allow-notify { <address_match_element>; ... };
allow-query { <address_match_element>; ... };
allow-query-cache { <address_match_element>; ... };
@@ -258,8 +295,10 @@ view <string> <optional_class> {
alt-transfer-source ( <ipv4_address> | * ) [ port ( <integer> | * ) ];
alt-transfer-source-v6 ( <ipv6_address> | * ) [ port ( <integer> |
* ) ];
+ attach-cache <string>;
auth-nxdomain <boolean>; // default changed
cache-file <quoted_string>;
+ check-dup-records ( fail | warn | ignore );
check-integrity <boolean>;
check-mx ( fail | warn | ignore );
check-mx-cname ( fail | warn | ignore );
@@ -270,17 +309,33 @@ view <string> <optional_class> {
cleaning-interval <integer>;
clients-per-query <integer>;
database <string>;
+ deny-answer-addresses { <address_match_element>; ... } [
+ except-from { <quoted_string>; ... } ];
+ deny-answer-aliases { <quoted_string>; ... } [ except-from {
+ <quoted_string>; ... } ];
dialup <dialuptype>;
disable-algorithms <string> { <string>; ... };
disable-empty-zone <string>;
dlz <string> {
database <string>;
};
+ dns64 <netprefix> {
+ break-dnssec <boolean>;
+ clients { <address_match_element>; ... };
+ exclude { <address_match_element>; ... };
+ mapped { <address_match_element>; ... };
+ recursive-only <boolean>;
+ suffix <ipv6_address>;
+ };
+ dns64-contact <string>;
+ dns64-server <string>;
dnssec-accept-expired <boolean>;
+ dnssec-dnskey-kskonly <boolean>;
dnssec-enable <boolean>;
dnssec-lookaside <string> trust-anchor <string>;
dnssec-must-be-secure <string> <boolean>;
- dnssec-validation <boolean>;
+ dnssec-secure-to-insecure <boolean>;
+ dnssec-validation ( yes | no | auto );
dual-stack-servers [ port <integer> ] { ( <quoted_string> [ port
<integer> ] | <ipv4_address> [ port <integer> ] |
<ipv6_address> [ port <integer> ] ); ... };
@@ -289,6 +344,8 @@ view <string> <optional_class> {
empty-server <string>;
empty-zones-enable <boolean>;
fetch-glue <boolean>; // obsolete
+ filter-aaaa { <address_match_element>; ... }; // not configured
+ filter-aaaa-on-v4 <v4_aaaa>; // not configured
forward ( first | only );
forwarders [ port <integer> ] { ( <ipv4_address> | <ipv6_address> )
[ port <integer> ]; ... };
@@ -300,6 +357,8 @@ view <string> <optional_class> {
key-directory <quoted_string>;
lame-ttl <integer>;
maintain-ixfr-base <boolean>; // obsolete
+ managed-keys { <string> <string> <integer> <integer> <integer>
+ <quoted_string>; ... };
masterfile-format ( text | raw );
match-clients { <address_match_element>; ... };
match-destinations { <address_match_element>; ... };
@@ -338,6 +397,11 @@ view <string> <optional_class> {
recursion <boolean>;
request-ixfr <boolean>;
request-nsid <boolean>;
+ resolver-query-timeout <integer>;
+ response-policy {
+ zone <string> [ policy ( given | no-op | nxdomain | nodata
+ | cname <domain> ) ];
+ };
rfc2308-type1 <boolean>; // not yet implemented
root-delegation-only [ exclude { <quoted_string>; ... } ];
rrset-order { [ class <string> ] [ type <string> ] [ name
@@ -395,6 +459,8 @@ view <string> <optional_class> {
<integer> | * ) ];
alt-transfer-source-v6 ( <ipv6_address> | * ) [ port (
<integer> | * ) ];
+ auto-dnssec ( allow | maintain | create | off );
+ check-dup-records ( fail | warn | ignore );
check-integrity <boolean>;
check-mx ( fail | warn | ignore );
check-mx-cname ( fail | warn | ignore );
@@ -405,6 +471,8 @@ view <string> <optional_class> {
database <string>;
delegation-only <boolean>;
dialup <dialuptype>;
+ dnssec-dnskey-kskonly <boolean>;
+ dnssec-secure-to-insecure <boolean>;
file <quoted_string>;
forward ( first | only );
forwarders [ port <integer> ] { ( <ipv4_address> |
@@ -440,6 +508,9 @@ view <string> <optional_class> {
nsec3-test-zone <boolean>; // test only
pubkey <integer> <integer> <integer>
<quoted_string>; // obsolete
+ server-addresses { ( <ipv4_address> | <ipv6_address> ) [
+ port <integer> ]; ... };
+ server-names { <quoted_string>; ... };
sig-signing-nodes <integer>;
sig-signing-signatures <integer>;
sig-signing-type <integer>;
@@ -449,13 +520,14 @@ view <string> <optional_class> {
transfer-source-v6 ( <ipv6_address> | * ) [ port (
<integer> | * ) ];
try-tcp-refresh <boolean>;
- type ( master | slave | stub | hint | forward |
- delegation-only );
+ type ( master | slave | stub | static-stub | hint | forward
+ | delegation-only );
update-check-ksk <boolean>;
- update-policy { ( grant | deny ) <string> ( name |
- subdomain | wildcard | self | selfsub | selfwild |
+ update-policy ( local | { ( grant | deny ) <string> ( name
+ | subdomain | wildcard | self | selfsub | selfwild |
krb5-self | ms-self | krb5-subdomain | ms-subdomain |
- tcp-self | 6to4-self ) <string> <rrtypelist>; ... };
+ tcp-self | 6to4-self | zonesub | external ) [ <string>
+ ] <rrtypelist>; ... };
use-alt-transfer-source <boolean>;
zero-no-soa-ttl <boolean>;
zone-statistics <boolean>;
@@ -475,6 +547,8 @@ zone <string> <optional_class> {
alt-transfer-source ( <ipv4_address> | * ) [ port ( <integer> | * ) ];
alt-transfer-source-v6 ( <ipv6_address> | * ) [ port ( <integer> |
* ) ];
+ auto-dnssec ( allow | maintain | create | off );
+ check-dup-records ( fail | warn | ignore );
check-integrity <boolean>;
check-mx ( fail | warn | ignore );
check-mx-cname ( fail | warn | ignore );
@@ -485,6 +559,8 @@ zone <string> <optional_class> {
database <string>;
delegation-only <boolean>;
dialup <dialuptype>;
+ dnssec-dnskey-kskonly <boolean>;
+ dnssec-secure-to-insecure <boolean>;
file <quoted_string>;
forward ( first | only );
forwarders [ port <integer> ] { ( <ipv4_address> | <ipv6_address> )
@@ -517,6 +593,9 @@ zone <string> <optional_class> {
notify-to-soa <boolean>;
nsec3-test-zone <boolean>; // test only
pubkey <integer> <integer> <integer> <quoted_string>; // obsolete
+ server-addresses { ( <ipv4_address> | <ipv6_address> ) [ port
+ <integer> ]; ... };
+ server-names { <quoted_string>; ... };
sig-signing-nodes <integer>;
sig-signing-signatures <integer>;
sig-signing-type <integer>;
@@ -524,12 +603,13 @@ zone <string> <optional_class> {
transfer-source ( <ipv4_address> | * ) [ port ( <integer> | * ) ];
transfer-source-v6 ( <ipv6_address> | * ) [ port ( <integer> | * ) ];
try-tcp-refresh <boolean>;
- type ( master | slave | stub | hint | forward | delegation-only );
+ type ( master | slave | stub | static-stub | hint | forward |
+ delegation-only );
update-check-ksk <boolean>;
- update-policy { ( grant | deny ) <string> ( name | subdomain |
- wildcard | self | selfsub | selfwild | krb5-self | ms-self |
- krb5-subdomain | ms-subdomain | tcp-self | 6to4-self ) <string>
- <rrtypelist>; ... };
+ update-policy ( local | { ( grant | deny ) <string> ( name |
+ subdomain | wildcard | self | selfsub | selfwild | krb5-self |
+ ms-self | krb5-subdomain | ms-subdomain | tcp-self | 6to4-self
+ | zonesub | external ) [ <string> ] <rrtypelist>; ... };
use-alt-transfer-source <boolean>;
zero-no-soa-ttl <boolean>;
zone-statistics <boolean>;
diff --git a/contrib/bind9/lib/bind9/Makefile.in b/contrib/bind9/lib/bind9/Makefile.in
index e37d524..ffc2ad9 100644
--- a/contrib/bind9/lib/bind9/Makefile.in
+++ b/contrib/bind9/lib/bind9/Makefile.in
@@ -1,4 +1,4 @@
-# Copyright (C) 2004, 2007 Internet Systems Consortium, Inc. ("ISC")
+# Copyright (C) 2004, 2007, 2009 Internet Systems Consortium, Inc. ("ISC")
# Copyright (C) 2001 Internet Software Consortium.
#
# Permission to use, copy, modify, and/or distribute this software for any
@@ -13,7 +13,7 @@
# OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
# PERFORMANCE OF THIS SOFTWARE.
-# $Id: Makefile.in,v 1.11 2007-06-19 23:47:16 tbox Exp $
+# $Id: Makefile.in,v 1.14 2009-12-05 23:31:40 each Exp $
srcdir = @srcdir@
VPATH = @srcdir@
diff --git a/contrib/bind9/lib/bind9/api b/contrib/bind9/lib/bind9/api
index f3b0f9f..78dd0b4 100644
--- a/contrib/bind9/lib/bind9/api
+++ b/contrib/bind9/lib/bind9/api
@@ -1,3 +1,3 @@
-LIBINTERFACE = 50
-LIBREVISION = 4
+LIBINTERFACE = 80
+LIBREVISION = 1
LIBAGE = 0
diff --git a/contrib/bind9/lib/bind9/check.c b/contrib/bind9/lib/bind9/check.c
index 76ca510..6fa9aa9 100644
--- a/contrib/bind9/lib/bind9/check.c
+++ b/contrib/bind9/lib/bind9/check.c
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004-2010 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004-2011 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 2001-2003 Internet Software Consortium.
*
* Permission to use, copy, modify, and/or distribute this software for any
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: check.c,v 1.95.12.6 2010-03-04 23:47:53 tbox Exp $ */
+/* $Id: check.c,v 1.125 2011-01-07 23:47:07 tbox Exp $ */
/*! \file */
@@ -103,7 +103,7 @@ check_orderent(const cfg_obj_t *ent, isc_log_t *logctx) {
isc_buffer_init(&b, str, strlen(str));
isc_buffer_add(&b, strlen(str));
tresult = dns_name_fromtext(dns_fixedname_name(&fixed), &b,
- dns_rootname, ISC_FALSE, NULL);
+ dns_rootname, 0, NULL);
if (tresult != ISC_R_SUCCESS) {
cfg_obj_log(obj, logctx, ISC_LOG_ERROR,
"rrset-order: invalid name '%s'", str);
@@ -202,7 +202,7 @@ check_dual_stack(const cfg_obj_t *options, isc_log_t *logctx) {
dns_fixedname_init(&fixed);
name = dns_fixedname_name(&fixed);
tresult = dns_name_fromtext(name, &buffer, dns_rootname,
- ISC_FALSE, NULL);
+ 0, NULL);
if (tresult != ISC_R_SUCCESS) {
cfg_obj_log(obj, logctx, ISC_LOG_ERROR,
"bad name '%s'", str);
@@ -265,7 +265,7 @@ disabled_algorithms(const cfg_obj_t *disabled, isc_log_t *logctx) {
str = cfg_obj_asstring(obj);
isc_buffer_init(&b, str, strlen(str));
isc_buffer_add(&b, strlen(str));
- tresult = dns_name_fromtext(name, &b, dns_rootname, ISC_FALSE, NULL);
+ tresult = dns_name_fromtext(name, &b, dns_rootname, 0, NULL);
if (tresult != ISC_R_SUCCESS) {
cfg_obj_log(obj, logctx, ISC_LOG_ERROR,
"bad domain name '%s'", str);
@@ -352,7 +352,7 @@ mustbesecure(const cfg_obj_t *secure, isc_symtab_t *symtab, isc_log_t *logctx,
str = cfg_obj_asstring(obj);
isc_buffer_init(&b, str, strlen(str));
isc_buffer_add(&b, strlen(str));
- result = dns_name_fromtext(name, &b, dns_rootname, ISC_FALSE, NULL);
+ result = dns_name_fromtext(name, &b, dns_rootname, 0, NULL);
if (result != ISC_R_SUCCESS) {
cfg_obj_log(obj, logctx, ISC_LOG_ERROR,
"bad domain name '%s'", str);
@@ -407,7 +407,7 @@ check_viewacls(cfg_aclconfctx_t *actx, const cfg_obj_t *voptions,
static const char *acls[] = { "allow-query", "allow-query-on",
"allow-query-cache", "allow-query-cache-on",
"blackhole", "match-clients", "match-destinations",
- "sortlist", NULL };
+ "sortlist", "filter-aaaa", NULL };
while (acls[i] != NULL) {
tresult = checkacl(acls[i++], actx, NULL, voptions, config,
@@ -418,6 +418,106 @@ check_viewacls(cfg_aclconfctx_t *actx, const cfg_obj_t *voptions,
return (result);
}
+static const unsigned char zeros[16];
+
+static isc_result_t
+check_dns64(cfg_aclconfctx_t *actx, const cfg_obj_t *voptions,
+ const cfg_obj_t *config, isc_log_t *logctx, isc_mem_t *mctx)
+{
+ isc_result_t result = ISC_R_SUCCESS;
+ const cfg_obj_t *dns64 = NULL;
+ const cfg_obj_t *options;
+ const cfg_listelt_t *element;
+ const cfg_obj_t *map, *obj;
+ isc_netaddr_t na, sa;
+ unsigned int prefixlen;
+ int nbytes;
+ int i;
+
+ static const char *acls[] = { "client", "exclude", "mapped", NULL};
+
+ if (voptions != NULL)
+ cfg_map_get(voptions, "dns64", &dns64);
+ if (config != NULL && dns64 == NULL) {
+ options = NULL;
+ cfg_map_get(config, "options", &options);
+ if (options != NULL)
+ cfg_map_get(options, "dns64", &dns64);
+ }
+ if (dns64 == NULL)
+ return (ISC_R_SUCCESS);
+
+ for (element = cfg_list_first(dns64);
+ element != NULL;
+ element = cfg_list_next(element))
+ {
+ map = cfg_listelt_value(element);
+ obj = cfg_map_getname(map);
+
+ cfg_obj_asnetprefix(obj, &na, &prefixlen);
+ if (na.family != AF_INET6) {
+ cfg_obj_log(map, logctx, ISC_LOG_ERROR,
+ "dns64 requires a IPv6 prefix");
+ result = ISC_R_FAILURE;
+ continue;
+ }
+
+ if (prefixlen != 32 && prefixlen != 40 && prefixlen != 48 &&
+ prefixlen != 56 && prefixlen != 64 && prefixlen != 96) {
+ cfg_obj_log(map, logctx, ISC_LOG_ERROR,
+ "bad prefix length %u [32/40/48/56/64/96]",
+ prefixlen);
+ result = ISC_R_FAILURE;
+ continue;
+ }
+
+ for (i = 0; acls[i] != NULL; i++) {
+ obj = NULL;
+ (void)cfg_map_get(map, acls[i], &obj);
+ if (obj != NULL) {
+ dns_acl_t *acl = NULL;
+ isc_result_t tresult;
+
+ tresult = cfg_acl_fromconfig(obj, config,
+ logctx, actx,
+ mctx, 0, &acl);
+ if (acl != NULL)
+ dns_acl_detach(&acl);
+ if (tresult != ISC_R_SUCCESS)
+ result = tresult;
+ }
+ }
+
+ obj = NULL;
+ (void)cfg_map_get(map, "suffix", &obj);
+ if (obj != NULL) {
+ isc_netaddr_fromsockaddr(&sa, cfg_obj_assockaddr(obj));
+ if (sa.family != AF_INET6) {
+ cfg_obj_log(map, logctx, ISC_LOG_ERROR,
+ "dns64 requires a IPv6 suffix");
+ result = ISC_R_FAILURE;
+ continue;
+ }
+ nbytes = prefixlen / 8 + 4;
+ if (prefixlen >= 32 && prefixlen <= 64)
+ nbytes++;
+ if (memcmp(sa.type.in6.s6_addr, zeros, nbytes) != 0) {
+ char netaddrbuf[ISC_NETADDR_FORMATSIZE];
+ isc_netaddr_format(&sa, netaddrbuf,
+ sizeof(netaddrbuf));
+ cfg_obj_log(obj, logctx, ISC_LOG_ERROR,
+ "bad suffix '%s' leading "
+ "%u octets not zeros",
+ netaddrbuf, nbytes);
+ result = ISC_R_FAILURE;
+ }
+ }
+ }
+
+ return (result);
+}
+
+
/*
* Check allow-recursion and allow-recursion-on acls, and also log a
* warning if they're inconsistent with the "recursion" option.
@@ -493,6 +593,78 @@ check_recursionacls(cfg_aclconfctx_t *actx, const cfg_obj_t *voptions,
return (result);
}
+static isc_result_t
+check_filteraaaa(cfg_aclconfctx_t *actx, const cfg_obj_t *voptions,
+ const char *viewname, const cfg_obj_t *config,
+ isc_log_t *logctx, isc_mem_t *mctx)
+{
+ const cfg_obj_t *options, *aclobj, *obj = NULL;
+ dns_acl_t *acl = NULL;
+ isc_result_t result = ISC_R_SUCCESS, tresult;
+ dns_v4_aaaa_t filter;
+ const char *forview = " for view ";
+
+ if (voptions != NULL)
+ cfg_map_get(voptions, "filter-aaaa-on-v4", &obj);
+ if (obj == NULL && config != NULL) {
+ options = NULL;
+ cfg_map_get(config, "options", &options);
+ if (options != NULL)
+ cfg_map_get(options, "filter-aaaa-on-v4", &obj);
+ }
+
+ if (obj == NULL)
+ filter = dns_v4_aaaa_ok; /* default */
+ else if (cfg_obj_isboolean(obj))
+ filter = cfg_obj_asboolean(obj) ? dns_v4_aaaa_filter :
+ dns_v4_aaaa_ok;
+ else
+ filter = dns_v4_aaaa_break_dnssec; /* break-dnssec */
+
+ if (viewname == NULL) {
+ viewname = "";
+ forview = "";
+ }
+
+ aclobj = options = NULL;
+ acl = NULL;
+
+ if (voptions != NULL)
+ cfg_map_get(voptions, "filter-aaaa", &aclobj);
+ if (config != NULL && aclobj == NULL) {
+ options = NULL;
+ cfg_map_get(config, "options", &options);
+ if (options != NULL)
+ cfg_map_get(options, "filter-aaaa", &aclobj);
+ }
+ if (aclobj == NULL)
+ return (result);
+
+ tresult = cfg_acl_fromconfig(aclobj, config, logctx,
+ actx, mctx, 0, &acl);
+
+ if (tresult != ISC_R_SUCCESS) {
+ result = tresult;
+ } else if (filter != dns_v4_aaaa_ok && dns_acl_isnone(acl)) {
+ cfg_obj_log(aclobj, logctx, ISC_LOG_WARNING,
+ "both \"filter-aaaa-on-v4 %s;\" and "
+ "\"filter-aaaa\" is 'none;'%s%s",
+ filter == dns_v4_aaaa_break_dnssec ?
+ "break-dnssec" : "yes", forview, viewname);
+ result = ISC_R_FAILURE;
+ } else if (filter == dns_v4_aaaa_ok && !dns_acl_isnone(acl)) {
+ cfg_obj_log(aclobj, logctx, ISC_LOG_WARNING,
+ "both \"filter-aaaa-on-v4 no;\" and "
+ "\"filter-aaaa\" is set%s%s", forview, viewname);
+ result = ISC_R_FAILURE;
+ }
+
+ if (acl != NULL)
+ dns_acl_detach(&acl);
+
+ return (result);
+}
+
typedef struct {
const char *name;
unsigned int scale;
@@ -524,6 +696,12 @@ check_options(const cfg_obj_t *options, isc_log_t *logctx, isc_mem_t *mctx) {
{ "statistics-interval", 60, 28 * 24 * 60 }, /* 28 days */
};
+ static const char *server_contact[] = {
+ "empty-server", "empty-contact",
+ "dns64-server", "dns64-contact",
+ NULL
+ };
+
/*
* Check that fields specified in units of time other than seconds
* have reasonable values.
@@ -620,7 +798,7 @@ check_options(const cfg_obj_t *options, isc_log_t *logctx, isc_mem_t *mctx) {
isc_buffer_add(&b, strlen(str));
tresult = dns_name_fromtext(name, &b,
dns_rootname,
- ISC_FALSE, NULL);
+ 0, NULL);
if (tresult != ISC_R_SUCCESS) {
cfg_obj_log(obj, logctx, ISC_LOG_ERROR,
"bad domain name '%s'",
@@ -666,14 +844,24 @@ check_options(const cfg_obj_t *options, isc_log_t *logctx, isc_mem_t *mctx) {
element = cfg_list_next(element))
{
const char *dlv;
+ const cfg_obj_t *anchor;
obj = cfg_listelt_value(element);
dlv = cfg_obj_asstring(cfg_tuple_get(obj, "domain"));
+ anchor = cfg_tuple_get(obj, "trust-anchor");
+
+ /*
+ * If domain is "auto" and trust anchor is missing,
+ * skip remaining tests
+ */
+ if (!strcmp(dlv, "auto") && cfg_obj_isvoid(anchor))
+ continue;
+
isc_buffer_init(&b, dlv, strlen(dlv));
isc_buffer_add(&b, strlen(dlv));
tresult = dns_name_fromtext(name, &b, dns_rootname,
- ISC_TRUE, NULL);
+ 0, NULL);
if (tresult != ISC_R_SUCCESS) {
cfg_obj_log(obj, logctx, ISC_LOG_ERROR,
"bad domain name '%s'", dlv);
@@ -701,19 +889,32 @@ check_options(const cfg_obj_t *options, isc_log_t *logctx, isc_mem_t *mctx) {
if (result == ISC_R_SUCCESS)
result = ISC_R_FAILURE;
}
- dlv = cfg_obj_asstring(cfg_tuple_get(obj,
- "trust-anchor"));
- isc_buffer_init(&b, dlv, strlen(dlv));
- isc_buffer_add(&b, strlen(dlv));
- tresult = dns_name_fromtext(name, &b, dns_rootname,
- ISC_TRUE, NULL);
- if (tresult != ISC_R_SUCCESS) {
+
+ if (!cfg_obj_isvoid(anchor)) {
+ dlv = cfg_obj_asstring(anchor);
+ isc_buffer_init(&b, dlv, strlen(dlv));
+ isc_buffer_add(&b, strlen(dlv));
+ tresult = dns_name_fromtext(name, &b,
+ dns_rootname,
+ DNS_NAME_DOWNCASE,
+ NULL);
+ if (tresult != ISC_R_SUCCESS) {
+ cfg_obj_log(obj, logctx, ISC_LOG_ERROR,
+ "bad domain name '%s'",
+ dlv);
+ if (result == ISC_R_SUCCESS)
+ result = tresult;
+ }
+ } else {
cfg_obj_log(obj, logctx, ISC_LOG_ERROR,
- "bad domain name '%s'", dlv);
+ "dnssec-lookaside requires "
+ "either 'auto' or a domain and "
+ "trust anchor");
if (result == ISC_R_SUCCESS)
- result = tresult;
+ result = ISC_R_FAILURE;
}
}
+
if (symtab != NULL)
isc_symtab_destroy(&symtab);
}
@@ -743,38 +944,29 @@ check_options(const cfg_obj_t *options, isc_log_t *logctx, isc_mem_t *mctx) {
}
/*
- * Check empty zone configuration.
+ * Check server/contacts for syntactic validity.
*/
- obj = NULL;
- (void)cfg_map_get(options, "empty-server", &obj);
- if (obj != NULL) {
- str = cfg_obj_asstring(obj);
- isc_buffer_init(&b, str, strlen(str));
- isc_buffer_add(&b, strlen(str));
- tresult = dns_name_fromtext(dns_fixedname_name(&fixed), &b,
- dns_rootname, ISC_FALSE, NULL);
- if (tresult != ISC_R_SUCCESS) {
- cfg_obj_log(obj, logctx, ISC_LOG_ERROR,
- "empty-server: invalid name '%s'", str);
- result = ISC_R_FAILURE;
- }
- }
-
- obj = NULL;
- (void)cfg_map_get(options, "empty-contact", &obj);
- if (obj != NULL) {
- str = cfg_obj_asstring(obj);
- isc_buffer_init(&b, str, strlen(str));
- isc_buffer_add(&b, strlen(str));
- tresult = dns_name_fromtext(dns_fixedname_name(&fixed), &b,
- dns_rootname, ISC_FALSE, NULL);
- if (tresult != ISC_R_SUCCESS) {
- cfg_obj_log(obj, logctx, ISC_LOG_ERROR,
- "empty-contact: invalid name '%s'", str);
- result = ISC_R_FAILURE;
+ for (i= 0; server_contact[i] != NULL; i++) {
+ obj = NULL;
+ (void)cfg_map_get(options, server_contact[i], &obj);
+ if (obj != NULL) {
+ str = cfg_obj_asstring(obj);
+ isc_buffer_init(&b, str, strlen(str));
+ isc_buffer_add(&b, strlen(str));
+ tresult = dns_name_fromtext(dns_fixedname_name(&fixed),
+ &b, dns_rootname, 0, NULL);
+ if (tresult != ISC_R_SUCCESS) {
+ cfg_obj_log(obj, logctx, ISC_LOG_ERROR,
+ "%s: invalid name '%s'",
+ server_contact[i], str);
+ result = ISC_R_FAILURE;
+ }
}
}
+ /*
+ * Check empty zone configuration.
+ */
obj = NULL;
(void)cfg_map_get(options, "disable-empty-zone", &obj);
for (element = cfg_list_first(obj);
@@ -786,7 +978,7 @@ check_options(const cfg_obj_t *options, isc_log_t *logctx, isc_mem_t *mctx) {
isc_buffer_init(&b, str, strlen(str));
isc_buffer_add(&b, strlen(str));
tresult = dns_name_fromtext(dns_fixedname_name(&fixed), &b,
- dns_rootname, ISC_FALSE, NULL);
+ dns_rootname, 0, NULL);
if (tresult != ISC_R_SUCCESS) {
cfg_obj_log(obj, logctx, ISC_LOG_ERROR,
"disable-empty-zone: invalid name '%s'",
@@ -950,6 +1142,12 @@ check_update_policy(const cfg_obj_t *policy, isc_log_t *logctx) {
const char *str;
isc_buffer_t b;
+ /* Check for "update-policy local;" */
+ if (cfg_obj_isstring(policy) &&
+ strcmp("local", cfg_obj_asstring(policy)) == 0)
+ return (ISC_R_SUCCESS);
+
+ /* Now check the grant policy */
for (element = cfg_list_first(policy);
element != NULL;
element = cfg_list_next(element))
@@ -965,24 +1163,28 @@ check_update_policy(const cfg_obj_t *policy, isc_log_t *logctx) {
isc_buffer_init(&b, str, strlen(str));
isc_buffer_add(&b, strlen(str));
tresult = dns_name_fromtext(dns_fixedname_name(&fixed), &b,
- dns_rootname, ISC_FALSE, NULL);
+ dns_rootname, 0, NULL);
if (tresult != ISC_R_SUCCESS) {
cfg_obj_log(identity, logctx, ISC_LOG_ERROR,
"'%s' is not a valid name", str);
result = tresult;
}
- dns_fixedname_init(&fixed);
- str = cfg_obj_asstring(dname);
- isc_buffer_init(&b, str, strlen(str));
- isc_buffer_add(&b, strlen(str));
- tresult = dns_name_fromtext(dns_fixedname_name(&fixed), &b,
- dns_rootname, ISC_FALSE, NULL);
- if (tresult != ISC_R_SUCCESS) {
- cfg_obj_log(dname, logctx, ISC_LOG_ERROR,
- "'%s' is not a valid name", str);
- result = tresult;
+ if (tresult == ISC_R_SUCCESS &&
+ strcasecmp(cfg_obj_asstring(matchtype), "zonesub") != 0) {
+ dns_fixedname_init(&fixed);
+ str = cfg_obj_asstring(dname);
+ isc_buffer_init(&b, str, strlen(str));
+ isc_buffer_add(&b, strlen(str));
+ tresult = dns_name_fromtext(dns_fixedname_name(&fixed),
+ &b, dns_rootname, 0, NULL);
+ if (tresult != ISC_R_SUCCESS) {
+ cfg_obj_log(dname, logctx, ISC_LOG_ERROR,
+ "'%s' is not a valid name", str);
+ result = tresult;
+ }
}
+
if (tresult == ISC_R_SUCCESS &&
strcasecmp(cfg_obj_asstring(matchtype), "wildcard") == 0 &&
!dns_name_iswildcard(dns_fixedname_name(&fixed))) {
@@ -1020,7 +1222,8 @@ check_update_policy(const cfg_obj_t *policy, isc_log_t *logctx) {
#define HINTZONE 8
#define FORWARDZONE 16
#define DELEGATIONZONE 32
-#define CHECKACL 64
+#define STATICSTUBZONE 64
+#define CHECKACL 128
typedef struct {
const char *name;
@@ -1033,7 +1236,7 @@ check_zoneconf(const cfg_obj_t *zconfig, const cfg_obj_t *voptions,
dns_rdataclass_t defclass, cfg_aclconfctx_t *actx,
isc_log_t *logctx, isc_mem_t *mctx)
{
- const char *zname;
+ const char *znamestr;
const char *typestr;
unsigned int ztype;
const cfg_obj_t *zoptions;
@@ -1043,11 +1246,14 @@ check_zoneconf(const cfg_obj_t *zconfig, const cfg_obj_t *voptions,
unsigned int i;
dns_rdataclass_t zclass;
dns_fixedname_t fixedname;
+ dns_name_t *zname = NULL;
isc_buffer_t b;
isc_boolean_t root = ISC_FALSE;
+ const cfg_listelt_t *element;
static optionstable options[] = {
- { "allow-query", MASTERZONE | SLAVEZONE | STUBZONE | CHECKACL },
+ { "allow-query", MASTERZONE | SLAVEZONE | STUBZONE | CHECKACL |
+ STATICSTUBZONE },
{ "allow-notify", SLAVEZONE | CHECKACL },
{ "allow-transfer", MASTERZONE | SLAVEZONE | CHECKACL },
{ "notify", MASTERZONE | SLAVEZONE },
@@ -1070,12 +1276,14 @@ check_zoneconf(const cfg_obj_t *zconfig, const cfg_obj_t *voptions,
{ "min-retry-time", SLAVEZONE | STUBZONE },
{ "max-refresh-time", SLAVEZONE | STUBZONE },
{ "min-refresh-time", SLAVEZONE | STUBZONE },
+ { "dnssec-secure-to-insecure", MASTERZONE },
{ "sig-validity-interval", MASTERZONE },
{ "sig-re-signing-interval", MASTERZONE },
{ "sig-signing-nodes", MASTERZONE },
{ "sig-signing-type", MASTERZONE },
{ "sig-signing-signatures", MASTERZONE },
- { "zone-statistics", MASTERZONE | SLAVEZONE | STUBZONE },
+ { "zone-statistics", MASTERZONE | SLAVEZONE | STUBZONE |
+ STATICSTUBZONE},
{ "allow-update", MASTERZONE | CHECKACL },
{ "allow-update-forwarding", SLAVEZONE | CHECKACL },
{ "file", MASTERZONE | SLAVEZONE | STUBZONE | HINTZONE },
@@ -1089,12 +1297,17 @@ check_zoneconf(const cfg_obj_t *zconfig, const cfg_obj_t *voptions,
{ "key-directory", MASTERZONE },
{ "check-wildcard", MASTERZONE },
{ "check-mx", MASTERZONE },
+ { "check-dup-records", MASTERZONE },
{ "integrity-check", MASTERZONE },
{ "check-mx-cname", MASTERZONE },
{ "check-srv-cname", MASTERZONE },
{ "masterfile-format", MASTERZONE | SLAVEZONE | STUBZONE | HINTZONE },
{ "update-check-ksk", MASTERZONE },
+ { "dnssec-dnskey-kskonly", MASTERZONE },
+ { "auto-dnssec", MASTERZONE },
{ "try-tcp-refresh", SLAVEZONE },
+ { "server-addresses", STATICSTUBZONE },
+ { "server-names", STATICSTUBZONE },
};
static optionstable dialups[] = {
@@ -1104,7 +1317,7 @@ check_zoneconf(const cfg_obj_t *zconfig, const cfg_obj_t *voptions,
{ "passive", SLAVEZONE | STUBZONE },
};
- zname = cfg_obj_asstring(cfg_tuple_get(zconfig, "name"));
+ znamestr = cfg_obj_asstring(cfg_tuple_get(zconfig, "name"));
zoptions = cfg_tuple_get(zconfig, "options");
@@ -1112,7 +1325,7 @@ check_zoneconf(const cfg_obj_t *zconfig, const cfg_obj_t *voptions,
(void)cfg_map_get(zoptions, "type", &obj);
if (obj == NULL) {
cfg_obj_log(zconfig, logctx, ISC_LOG_ERROR,
- "zone '%s': type not present", zname);
+ "zone '%s': type not present", znamestr);
return (ISC_R_FAILURE);
}
@@ -1123,6 +1336,8 @@ check_zoneconf(const cfg_obj_t *zconfig, const cfg_obj_t *voptions,
ztype = SLAVEZONE;
else if (strcasecmp(typestr, "stub") == 0)
ztype = STUBZONE;
+ else if (strcasecmp(typestr, "static-stub") == 0)
+ ztype = STATICSTUBZONE;
else if (strcasecmp(typestr, "forward") == 0)
ztype = FORWARDZONE;
else if (strcasecmp(typestr, "hint") == 0)
@@ -1132,7 +1347,7 @@ check_zoneconf(const cfg_obj_t *zconfig, const cfg_obj_t *voptions,
else {
cfg_obj_log(obj, logctx, ISC_LOG_ERROR,
"zone '%s': invalid type %s",
- zname, typestr);
+ znamestr, typestr);
return (ISC_R_FAILURE);
}
@@ -1146,14 +1361,14 @@ check_zoneconf(const cfg_obj_t *zconfig, const cfg_obj_t *voptions,
if (result != ISC_R_SUCCESS) {
cfg_obj_log(obj, logctx, ISC_LOG_ERROR,
"zone '%s': invalid class %s",
- zname, r.base);
+ znamestr, r.base);
return (ISC_R_FAILURE);
}
if (zclass != defclass) {
cfg_obj_log(obj, logctx, ISC_LOG_ERROR,
"zone '%s': class '%s' does not "
"match view/default class",
- zname, r.base);
+ znamestr, r.base);
return (ISC_R_FAILURE);
}
}
@@ -1164,26 +1379,25 @@ check_zoneconf(const cfg_obj_t *zconfig, const cfg_obj_t *voptions,
* deals with strings.
*/
dns_fixedname_init(&fixedname);
- isc_buffer_init(&b, zname, strlen(zname));
- isc_buffer_add(&b, strlen(zname));
+ isc_buffer_init(&b, znamestr, strlen(znamestr));
+ isc_buffer_add(&b, strlen(znamestr));
tresult = dns_name_fromtext(dns_fixedname_name(&fixedname), &b,
- dns_rootname, ISC_TRUE, NULL);
+ dns_rootname, DNS_NAME_DOWNCASE, NULL);
if (tresult != ISC_R_SUCCESS) {
cfg_obj_log(zconfig, logctx, ISC_LOG_ERROR,
- "zone '%s': is not a valid name", zname);
+ "zone '%s': is not a valid name", znamestr);
result = ISC_R_FAILURE;
} else {
char namebuf[DNS_NAME_FORMATSIZE];
- dns_name_format(dns_fixedname_name(&fixedname),
- namebuf, sizeof(namebuf));
+ zname = dns_fixedname_name(&fixedname);
+ dns_name_format(zname, namebuf, sizeof(namebuf));
tresult = nameexist(zconfig, namebuf, ztype == HINTZONE ? 1 : 2,
symtab, "zone '%s': already exists "
"previous definition: %s:%u", logctx, mctx);
if (tresult != ISC_R_SUCCESS)
result = tresult;
- if (dns_name_equal(dns_fixedname_name(&fixedname),
- dns_rootname))
+ if (dns_name_equal(zname, dns_rootname))
root = ISC_TRUE;
}
@@ -1202,13 +1416,15 @@ check_zoneconf(const cfg_obj_t *zconfig, const cfg_obj_t *voptions,
cfg_obj_log(obj, logctx, ISC_LOG_ERROR,
"option '%s' is not allowed "
"in '%s' zone '%s'",
- options[i].name, typestr, zname);
+ options[i].name, typestr,
+ znamestr);
result = ISC_R_FAILURE;
} else
cfg_obj_log(obj, logctx, ISC_LOG_WARNING,
"option '%s' is not allowed "
"in '%s' zone '%s'",
- options[i].name, typestr, zname);
+ options[i].name, typestr,
+ znamestr);
}
obj = NULL;
if ((options[i].allowed & ztype) != 0 &&
@@ -1230,7 +1446,7 @@ check_zoneconf(const cfg_obj_t *zconfig, const cfg_obj_t *voptions,
if (cfg_map_get(zoptions, "masters", &obj) != ISC_R_SUCCESS) {
cfg_obj_log(zoptions, logctx, ISC_LOG_ERROR,
"zone '%s': missing 'masters' entry",
- zname);
+ znamestr);
result = ISC_R_FAILURE;
} else {
isc_uint32_t count;
@@ -1241,7 +1457,7 @@ check_zoneconf(const cfg_obj_t *zconfig, const cfg_obj_t *voptions,
if (tresult == ISC_R_SUCCESS && count == 0) {
cfg_obj_log(zoptions, logctx, ISC_LOG_ERROR,
"zone '%s': empty 'masters' entry",
- zname);
+ znamestr);
result = ISC_R_FAILURE;
}
}
@@ -1251,7 +1467,10 @@ check_zoneconf(const cfg_obj_t *zconfig, const cfg_obj_t *voptions,
* Master zones can't have both "allow-update" and "update-policy".
*/
if (ztype == MASTERZONE) {
- isc_result_t res1, res2;
+ isc_result_t res1, res2, res3;
+ const char *arg;
+ isc_boolean_t ddns;
+
obj = NULL;
res1 = cfg_map_get(zoptions, "allow-update", &obj);
obj = NULL;
@@ -1260,11 +1479,32 @@ check_zoneconf(const cfg_obj_t *zconfig, const cfg_obj_t *voptions,
cfg_obj_log(obj, logctx, ISC_LOG_ERROR,
"zone '%s': 'allow-update' is ignored "
"when 'update-policy' is present",
- zname);
+ znamestr);
result = ISC_R_FAILURE;
} else if (res2 == ISC_R_SUCCESS &&
check_update_policy(obj, logctx) != ISC_R_SUCCESS)
result = ISC_R_FAILURE;
+ ddns = ISC_TF(res1 == ISC_R_SUCCESS || res2 == ISC_R_SUCCESS);
+
+ obj = NULL;
+ arg = "off";
+ res3 = cfg_map_get(zoptions, "auto-dnssec", &obj);
+ if (res3 == ISC_R_SUCCESS)
+ arg = cfg_obj_asstring(obj);
+ if (strcasecmp(arg, "off") != 0 && !ddns) {
+ cfg_obj_log(obj, logctx, ISC_LOG_ERROR,
+ "'auto-dnssec %s;' requires "
+ "dynamic DNS to be configured in the zone",
+ arg);
+ result = ISC_R_FAILURE;
+ }
+ if (strcasecmp(arg, "create") == 0) {
+ cfg_obj_log(obj, logctx, ISC_LOG_ERROR,
+ "'auto-dnssec create;' is not "
+ "yet implemented");
+ result = ISC_R_FAILURE;
+ }
+
obj = NULL;
res1 = cfg_map_get(zoptions, "sig-signing-type", &obj);
if (res1 == ISC_R_SUCCESS) {
@@ -1298,7 +1538,7 @@ check_zoneconf(const cfg_obj_t *zconfig, const cfg_obj_t *voptions,
"dialup type '%s' is not "
"allowed in '%s' "
"zone '%s'",
- str, typestr, zname);
+ str, typestr, znamestr);
result = ISC_R_FAILURE;
}
break;
@@ -1306,7 +1546,7 @@ check_zoneconf(const cfg_obj_t *zconfig, const cfg_obj_t *voptions,
if (i == sizeof(dialups) / sizeof(dialups[0])) {
cfg_obj_log(obj, logctx, ISC_LOG_ERROR,
"invalid dialup type '%s' in zone "
- "'%s'", str, zname);
+ "'%s'", str, znamestr);
result = ISC_R_FAILURE;
}
}
@@ -1330,6 +1570,78 @@ check_zoneconf(const cfg_obj_t *zconfig, const cfg_obj_t *voptions,
result = ISC_R_FAILURE;
/*
+ * Check validity of static stub server addresses.
+ */
+ obj = NULL;
+ (void)cfg_map_get(zoptions, "server-addresses", &obj);
+ if (ztype == STATICSTUBZONE && obj != NULL) {
+ for (element = cfg_list_first(obj);
+ element != NULL;
+ element = cfg_list_next(element))
+ {
+ isc_sockaddr_t sa;
+ isc_netaddr_t na;
+ obj = cfg_listelt_value(element);
+ sa = *cfg_obj_assockaddr(obj);
+
+ if (isc_sockaddr_getport(&sa) != 0) {
+ result = ISC_R_FAILURE;
+ cfg_obj_log(obj, logctx, ISC_LOG_ERROR,
+ "port is not configurable for "
+ "static stub server-addresses");
+ }
+
+ isc_netaddr_fromsockaddr(&na, &sa);
+ if (isc_netaddr_getzone(&na) != 0) {
+ result = ISC_R_FAILURE;
+ cfg_obj_log(obj, logctx, ISC_LOG_ERROR,
+ "scoped address is not allowed "
+ "for static stub "
+ "server-addresses");
+ }
+ }
+ }
+
+ /*
+ * Check validity of static stub server names.
+ */
+ obj = NULL;
+ (void)cfg_map_get(zoptions, "server-names", &obj);
+ if (zname != NULL && ztype == STATICSTUBZONE && obj != NULL) {
+ for (element = cfg_list_first(obj);
+ element != NULL;
+ element = cfg_list_next(element))
+ {
+ const char *snamestr;
+ dns_fixedname_t fixed_sname;
+ isc_buffer_t b2;
+ dns_name_t *sname;
+
+ obj = cfg_listelt_value(element);
+ snamestr = cfg_obj_asstring(obj);
+
+ dns_fixedname_init(&fixed_sname);
+ isc_buffer_init(&b2, snamestr, strlen(snamestr));
+ isc_buffer_add(&b2, strlen(snamestr));
+ sname = dns_fixedname_name(&fixed_sname);
+ tresult = dns_name_fromtext(sname, &b2, dns_rootname,
+ 0, NULL);
+ if (tresult != ISC_R_SUCCESS) {
+ cfg_obj_log(zconfig, logctx, ISC_LOG_ERROR,
+ "server-name '%s' is not a valid "
+ "name", snamestr);
+ result = ISC_R_FAILURE;
+ } else if (dns_name_issubdomain(sname, zname)) {
+ cfg_obj_log(zconfig, logctx, ISC_LOG_ERROR,
+ "server-name '%s' must not be a "
+ "subdomain of zone name '%s'",
+ snamestr, znamestr);
+ result = ISC_R_FAILURE;
+ }
+ }
+ }
+
+ /*
* Check various options.
*/
tresult = check_options(zoptions, logctx, mctx);
@@ -1352,7 +1664,7 @@ check_zoneconf(const cfg_obj_t *zconfig, const cfg_obj_t *voptions,
(ztype == MASTERZONE || ztype == HINTZONE)) {
cfg_obj_log(zconfig, logctx, ISC_LOG_ERROR,
"zone '%s': missing 'file' entry",
- zname);
+ znamestr);
result = tresult;
}
}
@@ -1374,6 +1686,9 @@ bind9_check_key(const cfg_obj_t *key, isc_log_t *logctx) {
const char *algorithm;
int i;
size_t len = 0;
+ isc_result_t result;
+ isc_buffer_t buf;
+ unsigned char secretbuf[1024];
static const algorithmtable algorithms[] = {
{ "hmac-md5", 128 },
{ "hmac-md5.sig-alg.reg.int", 0 },
@@ -1396,6 +1711,14 @@ bind9_check_key(const cfg_obj_t *key, isc_log_t *logctx) {
return (ISC_R_FAILURE);
}
+ isc_buffer_init(&buf, secretbuf, sizeof(secretbuf));
+ result = isc_base64_decodestring(cfg_obj_asstring(secretobj), &buf);
+ if (result != ISC_R_SUCCESS) {
+ cfg_obj_log(secretobj, logctx, ISC_LOG_ERROR,
+ "bad secret '%s'", isc_result_totext(result));
+ return (result);
+ }
+
algorithm = cfg_obj_asstring(algobj);
for (i = 0; algorithms[i].name != NULL; i++) {
len = strlen(algorithms[i].name);
@@ -1480,7 +1803,7 @@ check_keylist(const cfg_obj_t *keys, isc_symtab_t *symtab,
isc_buffer_init(&b, keyid, strlen(keyid));
isc_buffer_add(&b, strlen(keyid));
tresult = dns_name_fromtext(name, &b, dns_rootname,
- ISC_FALSE, NULL);
+ 0, NULL);
if (tresult != ISC_R_SUCCESS) {
cfg_obj_log(key, logctx, ISC_LOG_ERROR,
"key '%s': bad key name", keyid);
@@ -1650,7 +1973,7 @@ check_servers(const cfg_obj_t *config, const cfg_obj_t *voptions,
isc_buffer_add(&b, strlen(keyval));
keyname = dns_fixedname_name(&fname);
tresult = dns_name_fromtext(keyname, &b, dns_rootname,
- ISC_FALSE, NULL);
+ 0, NULL);
if (tresult != ISC_R_SUCCESS) {
cfg_obj_log(keys, logctx, ISC_LOG_ERROR,
"bad key name '%s'", keyval);
@@ -1670,7 +1993,8 @@ check_servers(const cfg_obj_t *config, const cfg_obj_t *voptions,
}
static isc_result_t
-check_trusted_key(const cfg_obj_t *key, isc_log_t *logctx)
+check_trusted_key(const cfg_obj_t *key, isc_boolean_t managed,
+ isc_log_t *logctx)
{
const char *keystr, *keynamestr;
dns_fixedname_t fkeyname;
@@ -1704,6 +2028,19 @@ check_trusted_key(const cfg_obj_t *key, isc_log_t *logctx)
result = ISC_R_FAILURE;
}
+ if (managed) {
+ const char *initmethod;
+ initmethod = cfg_obj_asstring(cfg_tuple_get(key, "init"));
+
+ if (strcasecmp(initmethod, "initial-key") != 0) {
+ cfg_obj_log(key, logctx, ISC_LOG_ERROR,
+ "managed key '%s': "
+ "invalid initialization method '%s'",
+ keynamestr, initmethod);
+ result = ISC_R_FAILURE;
+ }
+ }
+
isc_buffer_init(&keydatabuf, keydata, sizeof(keydata));
keystr = cfg_obj_asstring(cfg_tuple_get(key, "key"));
@@ -1719,7 +2056,8 @@ check_trusted_key(const cfg_obj_t *key, isc_log_t *logctx)
if ((alg == DST_ALG_RSASHA1 || alg == DST_ALG_RSAMD5) &&
r.length > 1 && r.base[0] == 1 && r.base[1] == 3)
cfg_obj_log(key, logctx, ISC_LOG_WARNING,
- "trusted key '%s' has a weak exponent",
+ "%s key '%s' has a weak exponent",
+ managed ? "managed" : "trusted",
keynamestr);
}
@@ -1892,12 +2230,32 @@ check_viewconf(const cfg_obj_t *config, const cfg_obj_t *voptions,
element2 != NULL;
element2 = cfg_list_next(element2)) {
obj = cfg_listelt_value(element2);
- tresult = check_trusted_key(obj, logctx);
+ tresult = check_trusted_key(obj, ISC_FALSE, logctx);
if (tresult != ISC_R_SUCCESS)
result = tresult;
}
}
+ keys = NULL;
+ if (voptions != NULL)
+ (void)cfg_map_get(voptions, "managed-keys", &keys);
+ if (keys == NULL)
+ (void)cfg_map_get(config, "managed-keys", &keys);
+
+ for (element = cfg_list_first(keys);
+ element != NULL;
+ element = cfg_list_next(element))
+ {
+ const cfg_obj_t *keylist = cfg_listelt_value(element);
+ for (element2 = cfg_list_first(keylist);
+ element2 != NULL;
+ element2 = cfg_list_next(element2)) {
+ obj = cfg_listelt_value(element2);
+ tresult = check_trusted_key(obj, ISC_TRUE, logctx);
+ if (tresult != ISC_R_SUCCESS)
+ result = tresult;
+ }
+ }
/*
* Check options.
*/
@@ -1917,7 +2275,16 @@ check_viewconf(const cfg_obj_t *config, const cfg_obj_t *voptions,
if (tresult != ISC_R_SUCCESS)
result = tresult;
- cfg_aclconfctx_destroy(&actx);
+ tresult = check_filteraaaa(&actx, voptions, viewname, config,
+ logctx, mctx);
+ if (tresult != ISC_R_SUCCESS)
+ result = tresult;
+
+ tresult = check_dns64(&actx, voptions, config, logctx, mctx);
+ if (tresult != ISC_R_SUCCESS)
+ result = tresult;
+
+ cfg_aclconfctx_clear(&actx);
return (result);
}
@@ -2162,7 +2529,7 @@ bind9_check_controls(const cfg_obj_t *config, isc_log_t *logctx,
result = tresult;
}
}
- cfg_aclconfctx_destroy(&actx);
+ cfg_aclconfctx_clear(&actx);
return (result);
}
diff --git a/contrib/bind9/lib/bind9/include/bind9/getaddresses.h b/contrib/bind9/lib/bind9/include/bind9/getaddresses.h
index 677ced2..9ad8045 100644
--- a/contrib/bind9/lib/bind9/include/bind9/getaddresses.h
+++ b/contrib/bind9/lib/bind9/include/bind9/getaddresses.h
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: getaddresses.h,v 1.9.332.2 2009-01-18 23:47:35 tbox Exp $ */
+/* $Id: getaddresses.h,v 1.11 2009-01-17 23:47:42 tbox Exp $ */
#ifndef BIND9_GETADDRESSES_H
#define BIND9_GETADDRESSES_H 1
diff --git a/contrib/bind9/lib/dns/Makefile.in b/contrib/bind9/lib/dns/Makefile.in
index dfb8d7f..45c5c2a 100644
--- a/contrib/bind9/lib/dns/Makefile.in
+++ b/contrib/bind9/lib/dns/Makefile.in
@@ -1,4 +1,4 @@
-# Copyright (C) 2004-2008, 2010 Internet Systems Consortium, Inc. ("ISC")
+# Copyright (C) 2004-2011 Internet Systems Consortium, Inc. ("ISC")
# Copyright (C) 1998-2003 Internet Software Consortium.
#
# Permission to use, copy, modify, and/or distribute this software for any
@@ -13,7 +13,7 @@
# OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
# PERFORMANCE OF THIS SOFTWARE.
-# $Id: Makefile.in,v 1.163.50.2 2010-06-09 23:48:16 tbox Exp $
+# $Id: Makefile.in,v 1.176 2011-01-13 01:59:27 marka Exp $
srcdir = @srcdir@
VPATH = @srcdir@
@@ -34,8 +34,7 @@ USE_ISC_SPNEGO = @USE_ISC_SPNEGO@
CINCLUDES = -I. -Iinclude ${DNS_INCLUDES} \
${ISC_INCLUDES} @DST_OPENSSL_INC@ @DST_GSSAPI_INC@
-CDEFINES = -DUSE_MD5 @USE_OPENSSL@ @USE_PKCS11@ @USE_GSSAPI@ \
- ${USE_ISC_SPNEGO}
+CDEFINES = -DUSE_MD5 @USE_OPENSSL@ @USE_GSSAPI@ ${USE_ISC_SPNEGO}
CWARNINGS =
@@ -48,7 +47,7 @@ LIBS = @LIBS@
# Alphabetically
OPENSSLLINKOBJS = openssl_link.@O@ openssldh_link.@O@ openssldsa_link.@O@ \
- opensslrsa_link.@O@
+ opensslgost_link.@O@ opensslrsa_link.@O@
DSTOBJS = @DST_EXTRA_OBJS@ @OPENSSLLINKOBJS@ \
dst_api.@O@ dst_lib.@O@ dst_parse.@O@ dst_result.@O@ \
@@ -58,24 +57,26 @@ DSTOBJS = @DST_EXTRA_OBJS@ @OPENSSLLINKOBJS@ \
DNSOBJS = acache.@O@ acl.@O@ adb.@O@ byaddr.@O@ \
cache.@O@ callbacks.@O@ compress.@O@ \
db.@O@ dbiterator.@O@ dbtable.@O@ diff.@O@ dispatch.@O@ \
- dlz.@O@ dnssec.@O@ ds.@O@ forward.@O@ iptable.@O@ journal.@O@ \
- keytable.@O@ lib.@O@ log.@O@ lookup.@O@ \
+ dlz.@O@ dns64.@O@ dnssec.@O@ ds.@O@ forward.@O@ iptable.@O@ \
+ journal.@O@ keydata.@O@ keytable.@O@ \
+ lib.@O@ log.@O@ lookup.@O@ \
master.@O@ masterdump.@O@ message.@O@ \
- name.@O@ ncache.@O@ nsec.@O@ nsec3.@O@ order.@O@ peer.@O@ portlist.@O@ \
+ name.@O@ ncache.@O@ nsec.@O@ nsec3.@O@ order.@O@ peer.@O@ \
+ portlist.@O@ private.@O@ \
rbt.@O@ rbtdb.@O@ rbtdb64.@O@ rcode.@O@ rdata.@O@ \
- rdatalist.@O@ \
- rdataset.@O@ rdatasetiter.@O@ rdataslab.@O@ request.@O@ \
- resolver.@O@ result.@O@ rootns.@O@ sdb.@O@ sdlz.@O@ \
- soa.@O@ ssu.@O@ \
+ rdatalist.@O@ rdataset.@O@ rdatasetiter.@O@ rdataslab.@O@ \
+ request.@O@ resolver.@O@ result.@O@ rootns.@O@ rpz.@O@ \
+ rriterator.@O@ sdb.@O@ \
+ sdlz.@O@ soa.@O@ ssu.@O@ ssu_external.@O@ \
stats.@O@ tcpmsg.@O@ time.@O@ timer.@O@ tkey.@O@ \
- tsig.@O@ ttl.@O@ validator.@O@ \
+ tsec.@O@ tsig.@O@ ttl.@O@ validator.@O@ \
version.@O@ view.@O@ xfrin.@O@ zone.@O@ zonekey.@O@ zt.@O@
OBJS= ${DNSOBJS} ${OTHEROBJS} ${DSTOBJS}
# Alphabetically
-OPENSSLLINKSRCS = openssl_link.c openssldh_link.c \
- openssldsa_link.c opensslrsa_link.c
+OPENSSLLINKSRCS = openssl_link.c openssldh_link.c openssldsa_link.c \
+ opensslgost_link.c opensslrsa_link.c
DSTSRCS = @DST_EXTRA_SRCS@ @OPENSSLLINKSRCS@ \
dst_api.c dst_lib.c dst_parse.c \
@@ -85,17 +86,16 @@ DSTSRCS = @DST_EXTRA_SRCS@ @OPENSSLLINKSRCS@ \
DNSSRCS = acache.c acl.c adb.c byaddr.c \
cache.c callbacks.c compress.c \
db.c dbiterator.c dbtable.c diff.c dispatch.c \
- dlz.c dnssec.c ds.c forward.c iptable.c journal.c \
- keytable.c lib.c log.c lookup.c \
+ dlz.c dns64.c dnssec.c ds.c forward.c iptable.c journal.c \
+ keydata.c keytable.c lib.c log.c lookup.c \
master.c masterdump.c message.c \
name.c ncache.c nsec.c nsec3.c order.c peer.c portlist.c \
- rbt.c rbtdb.c rbtdb64.c rcode.c rdata.c \
- rdatalist.c \
+ rbt.c rbtdb.c rbtdb64.c rcode.c rdata.c rdatalist.c \
rdataset.c rdatasetiter.c rdataslab.c request.c \
- resolver.c result.c rootns.c sdb.c sdlz.c \
- soa.c ssu.c \
+ resolver.c result.c rootns.c rpz.c rriterator.c \
+ sdb.c sdlz.c soa.c ssu.c ssu_external.c \
stats.c tcpmsg.c time.c timer.c tkey.c \
- tsig.c ttl.c validator.c \
+ tsec.c tsig.c ttl.c validator.c \
version.c view.c xfrin.c zone.c zonekey.c zt.c ${OTHERSRCS}
SRCS = ${DSTSRCS} ${DNSSRCS}
diff --git a/contrib/bind9/lib/dns/acl.c b/contrib/bind9/lib/dns/acl.c
index cfb7fd8..118e394 100644
--- a/contrib/bind9/lib/dns/acl.c
+++ b/contrib/bind9/lib/dns/acl.c
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: acl.c,v 1.50.44.3 2009-01-18 23:47:35 tbox Exp $ */
+/* $Id: acl.c,v 1.53 2009-01-17 23:47:42 tbox Exp $ */
/*! \file */
diff --git a/contrib/bind9/lib/dns/adb.c b/contrib/bind9/lib/dns/adb.c
index cd9cadf..fcc2dd8 100644
--- a/contrib/bind9/lib/dns/adb.c
+++ b/contrib/bind9/lib/dns/adb.c
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: adb.c,v 1.243.42.6 2010-08-11 23:45:49 tbox Exp $ */
+/* $Id: adb.c,v 1.254 2010-12-21 23:47:08 tbox Exp $ */
/*! \file
*
@@ -66,13 +66,6 @@
#define DNS_ADBFETCH6_VALID(x) ISC_MAGIC_VALID(x, DNS_ADBFETCH6_MAGIC)
/*!
- * The number of buckets needs to be a prime (for good hashing).
- *
- * XXXRTH How many buckets do we need?
- */
-#define NBUCKETS 1009 /*%< how many buckets for names/addrs */
-
-/*!
* For type 3 negative cache entries, we will remember that the address is
* broken for this long. XXXMLG This is also used for actual addresses, too.
* The intent is to keep us from constantly asking about A/AAAA records
@@ -139,30 +132,37 @@ struct dns_adb {
*
* XXXRTH Have a per-bucket structure that contains all of these?
*/
- dns_adbnamelist_t names[NBUCKETS];
- dns_adbnamelist_t deadnames[NBUCKETS];
- /*% See dns_adbnamelist_t */
- isc_mutex_t namelocks[NBUCKETS];
- /*% See dns_adbnamelist_t */
- isc_boolean_t name_sd[NBUCKETS];
- /*% See dns_adbnamelist_t */
- unsigned int name_refcnt[NBUCKETS];
+ unsigned int nnames;
+ isc_mutex_t namescntlock;
+ unsigned int namescnt;
+ dns_adbnamelist_t *names;
+ dns_adbnamelist_t *deadnames;
+ isc_mutex_t *namelocks;
+ isc_boolean_t *name_sd;
+ unsigned int *name_refcnt;
/*!
- * Bucketized locks for entries.
+ * Bucketized locks and lists for entries.
*
* XXXRTH Have a per-bucket structure that contains all of these?
*/
- dns_adbentrylist_t entries[NBUCKETS];
- dns_adbentrylist_t deadentries[NBUCKETS];
- isc_mutex_t entrylocks[NBUCKETS];
- isc_boolean_t entry_sd[NBUCKETS]; /*%< shutting down */
- unsigned int entry_refcnt[NBUCKETS];
+ unsigned int nentries;
+ isc_mutex_t entriescntlock;
+ unsigned int entriescnt;
+ dns_adbentrylist_t *entries;
+ dns_adbentrylist_t *deadentries;
+ isc_mutex_t *entrylocks;
+ isc_boolean_t *entry_sd; /*%< shutting down */
+ unsigned int *entry_refcnt;
isc_event_t cevent;
isc_boolean_t cevent_sent;
isc_boolean_t shutting_down;
isc_eventlist_t whenshutdown;
+ isc_event_t growentries;
+ isc_boolean_t growentries_sent;
+ isc_event_t grownames;
+ isc_boolean_t grownames_sent;
};
/*
@@ -484,6 +484,322 @@ ttlclamp(dns_ttl_t ttl) {
}
/*
+ * Hashing is most efficient if the number of buckets is prime.
+ * The sequence below is the closest previous primes to 2^n and
+ * 1.5 * 2^n, for values of n from 10 to 28. (The tables will
+ * no longer grow beyond 2^28 entries.)
+ */
+static const unsigned nbuckets[] = { 1021, 1531, 2039, 3067, 4093, 6143,
+ 8191, 12281, 16381, 24571, 32749,
+ 49193, 65521, 98299, 131071, 199603,
+ 262139, 393209, 524287, 768431, 1048573,
+ 1572853, 2097143, 3145721, 4194301,
+ 6291449, 8388593, 12582893, 16777213,
+ 25165813, 33554393, 50331599, 67108859,
+ 100663291, 134217689, 201326557,
+ 268535431, 0 };
+
+static void
+grow_entries(isc_task_t *task, isc_event_t *ev) {
+ dns_adb_t *adb;
+ dns_adbentry_t *e;
+ dns_adbentrylist_t *newdeadentries = NULL;
+ dns_adbentrylist_t *newentries = NULL;
+ isc_boolean_t *newentry_sd = NULL;
+ isc_mutex_t *newentrylocks = NULL;
+ isc_result_t result;
+ unsigned int *newentry_refcnt = NULL;
+ unsigned int i, n, bucket;
+
+ adb = ev->ev_arg;
+ INSIST(DNS_ADB_VALID(adb));
+
+ isc_event_free(&ev);
+
+ isc_task_beginexclusive(task);
+
+ i = 0;
+ while (nbuckets[i] != 0 && adb->nentries >= nbuckets[i])
+ i++;
+ if (nbuckets[i] != 0)
+ n = nbuckets[i];
+ else
+ goto done;
+
+ DP(ISC_LOG_INFO, "adb: grow_entries to %u starting", n);
+
+ /*
+ * Are we shutting down?
+ */
+ for (i = 0; i < adb->nentries; i++)
+ if (adb->entry_sd[i])
+ goto cleanup;
+
+ /*
+ * Grab all the resources we need.
+ */
+ newentries = isc_mem_get(adb->mctx, sizeof(*newentries) * n);
+ newdeadentries = isc_mem_get(adb->mctx, sizeof(*newdeadentries) * n);
+ newentrylocks = isc_mem_get(adb->mctx, sizeof(*newentrylocks) * n);
+ newentry_sd = isc_mem_get(adb->mctx, sizeof(*newentry_sd) * n);
+ newentry_refcnt = isc_mem_get(adb->mctx, sizeof(*newentry_refcnt) * n);
+ if (newentries == NULL || newdeadentries == NULL ||
+ newentrylocks == NULL || newentry_sd == NULL ||
+ newentry_refcnt == NULL)
+ goto cleanup;
+
+ /*
+ * Initialise the new resources.
+ */
+ result = isc_mutexblock_init(newentrylocks, n);
+ if (result != ISC_R_SUCCESS)
+ goto cleanup;
+
+ for (i = 0; i < n; i++) {
+ ISC_LIST_INIT(newentries[i]);
+ ISC_LIST_INIT(newdeadentries[i]);
+ newentry_sd[i] = ISC_FALSE;
+ newentry_refcnt[i] = 0;
+ adb->irefcnt++;
+ }
+
+ /*
+ * Move entries to new arrays.
+ */
+ for (i = 0; i < adb->nentries; i++) {
+ e = ISC_LIST_HEAD(adb->entries[i]);
+ while (e != NULL) {
+ ISC_LIST_UNLINK(adb->entries[i], e, plink);
+ bucket = isc_sockaddr_hash(&e->sockaddr, ISC_TRUE) % n;
+ e->lock_bucket = bucket;
+ ISC_LIST_APPEND(newentries[bucket], e, plink);
+ INSIST(adb->entry_refcnt[i] > 0);
+ adb->entry_refcnt[i]--;
+ newentry_refcnt[bucket]++;
+ e = ISC_LIST_HEAD(adb->entries[i]);
+ }
+ e = ISC_LIST_HEAD(adb->deadentries[i]);
+ while (e != NULL) {
+ ISC_LIST_UNLINK(adb->deadentries[i], e, plink);
+ bucket = isc_sockaddr_hash(&e->sockaddr, ISC_TRUE) % n;
+ e->lock_bucket = bucket;
+ ISC_LIST_APPEND(newdeadentries[bucket], e, plink);
+ INSIST(adb->entry_refcnt[i] > 0);
+ adb->entry_refcnt[i]--;
+ newentry_refcnt[bucket]++;
+ e = ISC_LIST_HEAD(adb->deadentries[i]);
+ }
+ INSIST(adb->entry_refcnt[i] == 0);
+ adb->irefcnt--;
+ }
+
+ /*
+ * Cleanup old resources.
+ */
+ DESTROYMUTEXBLOCK(adb->entrylocks, adb->nentries);
+ isc_mem_put(adb->mctx, adb->entries,
+ sizeof(*adb->entries) * adb->nentries);
+ isc_mem_put(adb->mctx, adb->deadentries,
+ sizeof(*adb->deadentries) * adb->nentries);
+ isc_mem_put(adb->mctx, adb->entrylocks,
+ sizeof(*adb->entrylocks) * adb->nentries);
+ isc_mem_put(adb->mctx, adb->entry_sd,
+ sizeof(*adb->entry_sd) * adb->nentries);
+ isc_mem_put(adb->mctx, adb->entry_refcnt,
+ sizeof(*adb->entry_refcnt) * adb->nentries);
+
+ /*
+ * Install new resources.
+ */
+ adb->entries = newentries;
+ adb->deadentries = newdeadentries;
+ adb->entrylocks = newentrylocks;
+ adb->entry_sd = newentry_sd;
+ adb->entry_refcnt = newentry_refcnt;
+ adb->nentries = n;
+
+ /*
+ * Only on success do we set adb->growentries_sent to ISC_FALSE.
+ * This will prevent us being continuously being called on error.
+ */
+ adb->growentries_sent = ISC_FALSE;
+ goto done;
+
+ cleanup:
+ if (newentries != NULL)
+ isc_mem_put(adb->mctx, newentries,
+ sizeof(*newentries) * n);
+ if (newdeadentries != NULL)
+ isc_mem_put(adb->mctx, newdeadentries,
+ sizeof(*newdeadentries) * n);
+ if (newentrylocks != NULL)
+ isc_mem_put(adb->mctx, newentrylocks,
+ sizeof(*newentrylocks) * n);
+ if (newentry_sd != NULL)
+ isc_mem_put(adb->mctx, newentry_sd,
+ sizeof(*newentry_sd) * n);
+ if (newentry_refcnt != NULL)
+ isc_mem_put(adb->mctx, newentry_refcnt,
+ sizeof(*newentry_refcnt) * n);
+ done:
+ isc_task_endexclusive(task);
+
+ LOCK(&adb->lock);
+ if (dec_adb_irefcnt(adb))
+ check_exit(adb);
+ UNLOCK(&adb->lock);
+ DP(ISC_LOG_INFO, "adb: grow_entries finished");
+}
+
+static void
+grow_names(isc_task_t *task, isc_event_t *ev) {
+ dns_adb_t *adb;
+ dns_adbname_t *name;
+ dns_adbnamelist_t *newdeadnames = NULL;
+ dns_adbnamelist_t *newnames = NULL;
+ isc_boolean_t *newname_sd = NULL;
+ isc_mutex_t *newnamelocks = NULL;
+ isc_result_t result;
+ unsigned int *newname_refcnt = NULL;
+ unsigned int i, n, bucket;
+
+ adb = ev->ev_arg;
+ INSIST(DNS_ADB_VALID(adb));
+
+ isc_event_free(&ev);
+
+ isc_task_beginexclusive(task);
+
+ i = 0;
+ while (nbuckets[i] != 0 && adb->nnames >= nbuckets[i])
+ i++;
+ if (nbuckets[i] != 0)
+ n = nbuckets[i];
+ else
+ goto done;
+
+ DP(ISC_LOG_INFO, "adb: grow_names to %u starting", n);
+
+ /*
+ * Are we shutting down?
+ */
+ for (i = 0; i < adb->nnames; i++)
+ if (adb->name_sd[i])
+ goto cleanup;
+
+ /*
+ * Grab all the resources we need.
+ */
+ newnames = isc_mem_get(adb->mctx, sizeof(*newnames) * n);
+ newdeadnames = isc_mem_get(adb->mctx, sizeof(*newdeadnames) * n);
+ newnamelocks = isc_mem_get(adb->mctx, sizeof(*newnamelocks) * n);
+ newname_sd = isc_mem_get(adb->mctx, sizeof(*newname_sd) * n);
+ newname_refcnt = isc_mem_get(adb->mctx, sizeof(*newname_refcnt) * n);
+ if (newnames == NULL || newdeadnames == NULL ||
+ newnamelocks == NULL || newname_sd == NULL ||
+ newname_refcnt == NULL)
+ goto cleanup;
+
+ /*
+ * Initialise the new resources.
+ */
+ result = isc_mutexblock_init(newnamelocks, n);
+ if (result != ISC_R_SUCCESS)
+ goto cleanup;
+
+ for (i = 0; i < n; i++) {
+ ISC_LIST_INIT(newnames[i]);
+ ISC_LIST_INIT(newdeadnames[i]);
+ newname_sd[i] = ISC_FALSE;
+ newname_refcnt[i] = 0;
+ adb->irefcnt++;
+ }
+
+ /*
+ * Move names to new arrays.
+ */
+ for (i = 0; i < adb->nnames; i++) {
+ name = ISC_LIST_HEAD(adb->names[i]);
+ while (name != NULL) {
+ ISC_LIST_UNLINK(adb->names[i], name, plink);
+ bucket = dns_name_fullhash(&name->name, ISC_TRUE) % n;
+ name->lock_bucket = bucket;
+ ISC_LIST_APPEND(newnames[bucket], name, plink);
+ INSIST(adb->name_refcnt[i] > 0);
+ adb->name_refcnt[i]--;
+ newname_refcnt[bucket]++;
+ name = ISC_LIST_HEAD(adb->names[i]);
+ }
+ name = ISC_LIST_HEAD(adb->deadnames[i]);
+ while (name != NULL) {
+ ISC_LIST_UNLINK(adb->deadnames[i], name, plink);
+ bucket = dns_name_fullhash(&name->name, ISC_TRUE) % n;
+ name->lock_bucket = bucket;
+ ISC_LIST_APPEND(newdeadnames[bucket], name, plink);
+ INSIST(adb->name_refcnt[i] > 0);
+ adb->name_refcnt[i]--;
+ newname_refcnt[bucket]++;
+ name = ISC_LIST_HEAD(adb->deadnames[i]);
+ }
+ INSIST(adb->name_refcnt[i] == 0);
+ adb->irefcnt--;
+ }
+
+ /*
+ * Cleanup old resources.
+ */
+ DESTROYMUTEXBLOCK(adb->namelocks, adb->nnames);
+ isc_mem_put(adb->mctx, adb->names,
+ sizeof(*adb->names) * adb->nnames);
+ isc_mem_put(adb->mctx, adb->deadnames,
+ sizeof(*adb->deadnames) * adb->nnames);
+ isc_mem_put(adb->mctx, adb->namelocks,
+ sizeof(*adb->namelocks) * adb->nnames);
+ isc_mem_put(adb->mctx, adb->name_sd,
+ sizeof(*adb->name_sd) * adb->nnames);
+ isc_mem_put(adb->mctx, adb->name_refcnt,
+ sizeof(*adb->name_refcnt) * adb->nnames);
+
+ /*
+ * Install new resources.
+ */
+ adb->names = newnames;
+ adb->deadnames = newdeadnames;
+ adb->namelocks = newnamelocks;
+ adb->name_sd = newname_sd;
+ adb->name_refcnt = newname_refcnt;
+ adb->nnames = n;
+
+ /*
+ * Only on success do we set adb->grownames_sent to ISC_FALSE.
+ * This will prevent us being continuously being called on error.
+ */
+ adb->grownames_sent = ISC_FALSE;
+ goto done;
+
+ cleanup:
+ if (newnames != NULL)
+ isc_mem_put(adb->mctx, newnames, sizeof(*newnames) * n);
+ if (newdeadnames != NULL)
+ isc_mem_put(adb->mctx, newdeadnames, sizeof(*newdeadnames) * n);
+ if (newnamelocks != NULL)
+ isc_mem_put(adb->mctx, newnamelocks, sizeof(*newnamelocks) * n);
+ if (newname_sd != NULL)
+ isc_mem_put(adb->mctx, newname_sd, sizeof(*newname_sd) * n);
+ if (newname_refcnt != NULL)
+ isc_mem_put(adb->mctx, newname_refcnt,
+ sizeof(*newname_refcnt) * n);
+ done:
+ isc_task_endexclusive(task);
+
+ LOCK(&adb->lock);
+ if (dec_adb_irefcnt(adb))
+ check_exit(adb);
+ UNLOCK(&adb->lock);
+ DP(ISC_LOG_INFO, "adb: grow_names finished");
+}
+
+/*
* Requires the adbname bucket be locked and that no entry buckets be locked.
*
* This code handles A and AAAA rdatasets only.
@@ -836,12 +1152,12 @@ violate_locking_hierarchy(isc_mutex_t *have, isc_mutex_t *want) {
*/
static isc_boolean_t
shutdown_names(dns_adb_t *adb) {
- int bucket;
+ unsigned int bucket;
isc_boolean_t result = ISC_FALSE;
dns_adbname_t *name;
dns_adbname_t *next_name;
- for (bucket = 0; bucket < NBUCKETS; bucket++) {
+ for (bucket = 0; bucket < adb->nnames; bucket++) {
LOCK(&adb->namelocks[bucket]);
adb->name_sd[bucket] = ISC_TRUE;
@@ -881,12 +1197,12 @@ shutdown_names(dns_adb_t *adb) {
*/
static isc_boolean_t
shutdown_entries(dns_adb_t *adb) {
- int bucket;
+ unsigned int bucket;
isc_boolean_t result = ISC_FALSE;
dns_adbentry_t *entry;
dns_adbentry_t *next_entry;
- for (bucket = 0; bucket < NBUCKETS; bucket++) {
+ for (bucket = 0; bucket < adb->nentries; bucket++) {
LOCK(&adb->entrylocks[bucket]);
adb->entry_sd[bucket] = ISC_TRUE;
@@ -1306,6 +1622,16 @@ new_adbname(dns_adb_t *adb, dns_name_t *dnsname) {
ISC_LIST_INIT(name->finds);
ISC_LINK_INIT(name, plink);
+ LOCK(&adb->namescntlock);
+ adb->namescnt++;
+ if (!adb->grownames_sent && adb->namescnt > (adb->nnames * 8)) {
+ isc_event_t *event = &adb->grownames;
+ inc_adb_irefcnt(adb);
+ isc_task_send(adb->task, &event);
+ adb->grownames_sent = ISC_TRUE;
+ }
+ UNLOCK(&adb->namescntlock);
+
return (name);
}
@@ -1329,6 +1655,9 @@ free_adbname(dns_adb_t *adb, dns_adbname_t **name) {
dns_name_free(&n->name, adb->mctx);
isc_mempool_put(adb->nmp, n);
+ LOCK(&adb->namescntlock);
+ adb->namescnt--;
+ UNLOCK(&adb->namescntlock);
}
static inline dns_adbnamehook_t *
@@ -1417,6 +1746,16 @@ new_adbentry(dns_adb_t *adb) {
e->expires = 0;
ISC_LIST_INIT(e->lameinfo);
ISC_LINK_INIT(e, plink);
+ LOCK(&adb->entriescntlock);
+ adb->entriescnt++;
+ if (!adb->growentries_sent &&
+ adb->entriescnt > (adb->nentries * 8)) {
+ isc_event_t *event = &adb->growentries;
+ inc_adb_irefcnt(adb);
+ isc_task_send(adb->task, &event);
+ adb->growentries_sent = ISC_TRUE;
+ }
+ UNLOCK(&adb->entriescntlock);
return (e);
}
@@ -1444,6 +1783,9 @@ free_adbentry(dns_adb_t *adb, dns_adbentry_t **entry) {
}
isc_mempool_put(adb->emp, e);
+ LOCK(&adb->entriescntlock);
+ adb->entriescnt--;
+ UNLOCK(&adb->entriescntlock);
}
static inline dns_adbfind_t *
@@ -1597,7 +1939,7 @@ find_name_and_lock(dns_adb_t *adb, dns_name_t *name,
dns_adbname_t *adbname;
int bucket;
- bucket = dns_name_fullhash(name, ISC_FALSE) % NBUCKETS;
+ bucket = dns_name_fullhash(name, ISC_FALSE) % adb->nnames;
if (*bucketp == DNS_ADB_INVALIDBUCKET) {
LOCK(&adb->namelocks[bucket]);
@@ -1639,7 +1981,7 @@ find_entry_and_lock(dns_adb_t *adb, isc_sockaddr_t *addr, int *bucketp,
dns_adbentry_t *entry, *entry_next;
int bucket;
- bucket = isc_sockaddr_hash(addr, ISC_TRUE) % NBUCKETS;
+ bucket = isc_sockaddr_hash(addr, ISC_TRUE) % adb->nentries;
if (*bucketp == DNS_ADB_INVALIDBUCKET) {
LOCK(&adb->entrylocks[bucket]);
@@ -1992,13 +2334,36 @@ destroy(dns_adb_t *adb) {
isc_mempool_destroy(&adb->aimp);
isc_mempool_destroy(&adb->afmp);
- DESTROYMUTEXBLOCK(adb->entrylocks, NBUCKETS);
- DESTROYMUTEXBLOCK(adb->namelocks, NBUCKETS);
+ DESTROYMUTEXBLOCK(adb->entrylocks, adb->nentries);
+ isc_mem_put(adb->mctx, adb->entries,
+ sizeof(*adb->entries) * adb->nentries);
+ isc_mem_put(adb->mctx, adb->deadentries,
+ sizeof(*adb->deadentries) * adb->nentries);
+ isc_mem_put(adb->mctx, adb->entrylocks,
+ sizeof(*adb->entrylocks) * adb->nentries);
+ isc_mem_put(adb->mctx, adb->entry_sd,
+ sizeof(*adb->entry_sd) * adb->nentries);
+ isc_mem_put(adb->mctx, adb->entry_refcnt,
+ sizeof(*adb->entry_refcnt) * adb->nentries);
+
+ DESTROYMUTEXBLOCK(adb->namelocks, adb->nnames);
+ isc_mem_put(adb->mctx, adb->names,
+ sizeof(*adb->names) * adb->nnames);
+ isc_mem_put(adb->mctx, adb->deadnames,
+ sizeof(*adb->deadnames) * adb->nnames);
+ isc_mem_put(adb->mctx, adb->namelocks,
+ sizeof(*adb->namelocks) * adb->nnames);
+ isc_mem_put(adb->mctx, adb->name_sd,
+ sizeof(*adb->name_sd) * adb->nnames);
+ isc_mem_put(adb->mctx, adb->name_refcnt,
+ sizeof(*adb->name_refcnt) * adb->nnames);
DESTROYLOCK(&adb->reflock);
DESTROYLOCK(&adb->lock);
DESTROYLOCK(&adb->mplock);
DESTROYLOCK(&adb->overmemlock);
+ DESTROYLOCK(&adb->entriescntlock);
+ DESTROYLOCK(&adb->namescntlock);
isc_mem_putanddetach(&adb->mctx, adb, sizeof(dns_adb_t));
}
@@ -2014,7 +2379,7 @@ dns_adb_create(isc_mem_t *mem, dns_view_t *view, isc_timermgr_t *timermgr,
{
dns_adb_t *adb;
isc_result_t result;
- int i;
+ unsigned int i;
REQUIRE(mem != NULL);
REQUIRE(view != NULL);
@@ -2054,6 +2419,30 @@ dns_adb_create(isc_mem_t *mem, dns_view_t *view, isc_timermgr_t *timermgr,
adb->shutting_down = ISC_FALSE;
ISC_LIST_INIT(adb->whenshutdown);
+ adb->nentries = nbuckets[0];
+ adb->entriescnt = 0;
+ adb->entries = NULL;
+ adb->deadentries = NULL;
+ adb->entry_sd = NULL;
+ adb->entry_refcnt = NULL;
+ adb->entrylocks = NULL;
+ ISC_EVENT_INIT(&adb->growentries, sizeof(adb->growentries), 0, NULL,
+ DNS_EVENT_ADBGROWENTRIES, grow_entries, adb,
+ adb, NULL, NULL);
+ adb->growentries_sent = ISC_FALSE;
+
+ adb->nnames = nbuckets[0];
+ adb->namescnt = 0;
+ adb->names = NULL;
+ adb->deadnames = NULL;
+ adb->name_sd = NULL;
+ adb->name_refcnt = NULL;
+ adb->namelocks = NULL;
+ ISC_EVENT_INIT(&adb->grownames, sizeof(adb->grownames), 0, NULL,
+ DNS_EVENT_ADBGROWNAMES, grow_names, adb,
+ adb, NULL, NULL);
+ adb->grownames_sent = ISC_FALSE;
+
isc_mem_attach(mem, &adb->mctx);
result = isc_mutex_init(&adb->lock);
@@ -2072,28 +2461,68 @@ dns_adb_create(isc_mem_t *mem, dns_view_t *view, isc_timermgr_t *timermgr,
if (result != ISC_R_SUCCESS)
goto fail0e;
+ result = isc_mutex_init(&adb->entriescntlock);
+ if (result != ISC_R_SUCCESS)
+ goto fail0f;
+
+ result = isc_mutex_init(&adb->namescntlock);
+ if (result != ISC_R_SUCCESS)
+ goto fail0g;
+
+#define ALLOCENTRY(adb, el) \
+ do { \
+ (adb)->el = isc_mem_get((adb)->mctx, \
+ sizeof(*(adb)->el) * (adb)->nentries); \
+ if ((adb)->el == NULL) { \
+ result = ISC_R_NOMEMORY; \
+ goto fail1; \
+ }\
+ } while (0)
+ ALLOCENTRY(adb, entries);
+ ALLOCENTRY(adb, deadentries);
+ ALLOCENTRY(adb, entrylocks);
+ ALLOCENTRY(adb, entry_sd);
+ ALLOCENTRY(adb, entry_refcnt);
+#undef ALLOCENTRY
+
+#define ALLOCNAME(adb, el) \
+ do { \
+ (adb)->el = isc_mem_get((adb)->mctx, \
+ sizeof(*(adb)->el) * (adb)->nnames); \
+ if ((adb)->el == NULL) { \
+ result = ISC_R_NOMEMORY; \
+ goto fail1; \
+ }\
+ } while (0)
+ ALLOCNAME(adb, names);
+ ALLOCNAME(adb, deadnames);
+ ALLOCNAME(adb, namelocks);
+ ALLOCNAME(adb, name_sd);
+ ALLOCNAME(adb, name_refcnt);
+#undef ALLOCNAME
+
/*
* Initialize the bucket locks for names and elements.
* May as well initialize the list heads, too.
*/
- result = isc_mutexblock_init(adb->namelocks, NBUCKETS);
+ result = isc_mutexblock_init(adb->namelocks, adb->nnames);
if (result != ISC_R_SUCCESS)
goto fail1;
- for (i = 0; i < NBUCKETS; i++) {
+ for (i = 0; i < adb->nnames; i++) {
ISC_LIST_INIT(adb->names[i]);
ISC_LIST_INIT(adb->deadnames[i]);
adb->name_sd[i] = ISC_FALSE;
adb->name_refcnt[i] = 0;
adb->irefcnt++;
}
- for (i = 0; i < NBUCKETS; i++) {
+ for (i = 0; i < adb->nentries; i++) {
ISC_LIST_INIT(adb->entries[i]);
ISC_LIST_INIT(adb->deadentries[i]);
adb->entry_sd[i] = ISC_FALSE;
adb->entry_refcnt[i] = 0;
adb->irefcnt++;
}
- result = isc_mutexblock_init(adb->entrylocks, NBUCKETS);
+ result = isc_mutexblock_init(adb->entrylocks, adb->nentries);
if (result != ISC_R_SUCCESS)
goto fail2;
@@ -2140,12 +2569,42 @@ dns_adb_create(isc_mem_t *mem, dns_view_t *view, isc_timermgr_t *timermgr,
isc_task_detach(&adb->task);
/* clean up entrylocks */
- DESTROYMUTEXBLOCK(adb->entrylocks, NBUCKETS);
+ DESTROYMUTEXBLOCK(adb->entrylocks, adb->nentries);
fail2: /* clean up namelocks */
- DESTROYMUTEXBLOCK(adb->namelocks, NBUCKETS);
+ DESTROYMUTEXBLOCK(adb->namelocks, adb->nnames);
fail1: /* clean up only allocated memory */
+ if (adb->entries != NULL)
+ isc_mem_put(adb->mctx, adb->entries,
+ sizeof(*adb->entries) * adb->nentries);
+ if (adb->deadentries != NULL)
+ isc_mem_put(adb->mctx, adb->deadentries,
+ sizeof(*adb->deadentries) * adb->nentries);
+ if (adb->entrylocks != NULL)
+ isc_mem_put(adb->mctx, adb->entrylocks,
+ sizeof(*adb->entrylocks) * adb->nentries);
+ if (adb->entry_sd != NULL)
+ isc_mem_put(adb->mctx, adb->entry_sd,
+ sizeof(*adb->entry_sd) * adb->nentries);
+ if (adb->entry_refcnt != NULL)
+ isc_mem_put(adb->mctx, adb->entry_refcnt,
+ sizeof(*adb->entry_refcnt) * adb->nentries);
+ if (adb->names != NULL)
+ isc_mem_put(adb->mctx, adb->names,
+ sizeof(*adb->names) * adb->nnames);
+ if (adb->deadnames != NULL)
+ isc_mem_put(adb->mctx, adb->deadnames,
+ sizeof(*adb->deadnames) * adb->nnames);
+ if (adb->namelocks != NULL)
+ isc_mem_put(adb->mctx, adb->namelocks,
+ sizeof(*adb->namelocks) * adb->nnames);
+ if (adb->name_sd != NULL)
+ isc_mem_put(adb->mctx, adb->name_sd,
+ sizeof(*adb->name_sd) * adb->nnames);
+ if (adb->name_refcnt != NULL)
+ isc_mem_put(adb->mctx, adb->name_refcnt,
+ sizeof(*adb->name_refcnt) * adb->nnames);
if (adb->nmp != NULL)
isc_mempool_destroy(&adb->nmp);
if (adb->nhmp != NULL)
@@ -2161,6 +2620,10 @@ dns_adb_create(isc_mem_t *mem, dns_view_t *view, isc_timermgr_t *timermgr,
if (adb->afmp != NULL)
isc_mempool_destroy(&adb->afmp);
+ DESTROYLOCK(&adb->namescntlock);
+ fail0g:
+ DESTROYLOCK(&adb->entriescntlock);
+ fail0f:
DESTROYLOCK(&adb->overmemlock);
fail0e:
DESTROYLOCK(&adb->reflock);
@@ -2728,7 +3191,7 @@ dns_adb_cancelfind(dns_adbfind_t *find) {
void
dns_adb_dump(dns_adb_t *adb, FILE *f) {
- int i;
+ unsigned int i;
isc_stdtime_t now;
REQUIRE(DNS_ADB_VALID(adb));
@@ -2744,9 +3207,9 @@ dns_adb_dump(dns_adb_t *adb, FILE *f) {
LOCK(&adb->lock);
isc_stdtime_get(&now);
- for (i = 0; i < NBUCKETS; i++)
+ for (i = 0; i < adb->nnames; i++)
RUNTIME_CHECK(cleanup_names(adb, i, now) == ISC_FALSE);
- for (i = 0; i < NBUCKETS; i++)
+ for (i = 0; i < adb->nentries; i++)
RUNTIME_CHECK(cleanup_entries(adb, i, now) == ISC_FALSE);
dump_adb(adb, f, ISC_FALSE, now);
@@ -2762,7 +3225,7 @@ dump_ttl(FILE *f, const char *legend, isc_stdtime_t value, isc_stdtime_t now) {
static void
dump_adb(dns_adb_t *adb, FILE *f, isc_boolean_t debug, isc_stdtime_t now) {
- int i;
+ unsigned int i;
dns_adbname_t *name;
dns_adbentry_t *entry;
@@ -2772,15 +3235,15 @@ dump_adb(dns_adb_t *adb, FILE *f, isc_boolean_t debug, isc_stdtime_t now) {
adb, adb->erefcnt, adb->irefcnt,
isc_mempool_getallocated(adb->nhmp));
- for (i = 0; i < NBUCKETS; i++)
+ for (i = 0; i < adb->nnames; i++)
LOCK(&adb->namelocks[i]);
- for (i = 0; i < NBUCKETS; i++)
+ for (i = 0; i < adb->nentries; i++)
LOCK(&adb->entrylocks[i]);
/*
* Dump the names
*/
- for (i = 0; i < NBUCKETS; i++) {
+ for (i = 0; i < adb->nnames; i++) {
name = ISC_LIST_HEAD(adb->names[i]);
if (name == NULL)
continue;
@@ -2824,7 +3287,7 @@ dump_adb(dns_adb_t *adb, FILE *f, isc_boolean_t debug, isc_stdtime_t now) {
fprintf(f, ";\n; Unassociated entries\n;\n");
- for (i = 0; i < NBUCKETS; i++) {
+ for (i = 0; i < adb->nentries; i++) {
entry = ISC_LIST_HEAD(adb->entries[i]);
while (entry != NULL) {
if (entry->refcnt == 0)
@@ -2836,9 +3299,9 @@ dump_adb(dns_adb_t *adb, FILE *f, isc_boolean_t debug, isc_stdtime_t now) {
/*
* Unlock everything
*/
- for (i = 0; i < NBUCKETS; i++)
+ for (i = 0; i < adb->nentries; i++)
UNLOCK(&adb->entrylocks[i]);
- for (i = 0; i < NBUCKETS; i++)
+ for (i = 0; i < adb->nnames; i++)
UNLOCK(&adb->namelocks[i]);
}
@@ -2999,10 +3462,20 @@ dbfind_name(dns_adbname_t *adbname, isc_stdtime_t now, dns_rdatatype_t rdtype)
else
adbname->fetch6_err = FIND_ERR_UNEXPECTED;
- result = dns_view_find(adb->view, &adbname->name, rdtype, now,
- NAME_GLUEOK(adbname) ? DNS_DBFIND_GLUEOK : 0,
- ISC_TF(NAME_HINTOK(adbname)),
- NULL, NULL, fname, &rdataset, NULL);
+ /*
+ * We need to specify whether to search static-stub zones (if
+ * configured) depending on whether this is a "start at zone" lookup,
+ * i.e., whether it's a "bailiwick" glue. If it's bailiwick (in which
+ * case NAME_STARTATZONE is set) we need to stop the search at any
+ * matching static-stub zone without looking into the cache to honor
+ * the configuration on which server we should send queries to.
+ */
+ result = dns_view_find2(adb->view, &adbname->name, rdtype, now,
+ NAME_GLUEOK(adbname) ? DNS_DBFIND_GLUEOK : 0,
+ ISC_TF(NAME_HINTOK(adbname)),
+ (adbname->flags & NAME_STARTATZONE) != 0 ?
+ ISC_TRUE : ISC_FALSE,
+ NULL, NULL, fname, &rdataset, NULL);
/* XXXVIX this switch statement is too sparse to gen a jump table. */
switch (result) {
@@ -3557,9 +4030,9 @@ dns_adb_flush(dns_adb_t *adb) {
/*
* Call our cleanup routines.
*/
- for (i = 0; i < NBUCKETS; i++)
+ for (i = 0; i < adb->nnames; i++)
RUNTIME_CHECK(cleanup_names(adb, i, INT_MAX) == ISC_FALSE);
- for (i = 0; i < NBUCKETS; i++)
+ for (i = 0; i < adb->nentries; i++)
RUNTIME_CHECK(cleanup_entries(adb, i, INT_MAX) == ISC_FALSE);
#ifdef DUMP_ADB_AFTER_CLEANING
@@ -3578,7 +4051,7 @@ dns_adb_flushname(dns_adb_t *adb, dns_name_t *name) {
INSIST(DNS_ADB_VALID(adb));
LOCK(&adb->lock);
- bucket = dns_name_hash(name, ISC_FALSE) % NBUCKETS;
+ bucket = dns_name_hash(name, ISC_FALSE) % adb->nnames;
LOCK(&adb->namelocks[bucket]);
adbname = ISC_LIST_HEAD(adb->names[bucket]);
while (adbname != NULL) {
diff --git a/contrib/bind9/lib/dns/api b/contrib/bind9/lib/dns/api
index a04d4bc..9bac060 100644
--- a/contrib/bind9/lib/dns/api
+++ b/contrib/bind9/lib/dns/api
@@ -1,3 +1,3 @@
-LIBINTERFACE = 59
-LIBREVISION = 4
+LIBINTERFACE = 82
+LIBREVISION = 3
LIBAGE = 1
diff --git a/contrib/bind9/lib/dns/byaddr.c b/contrib/bind9/lib/dns/byaddr.c
index 96b9f38..2fd61a2 100644
--- a/contrib/bind9/lib/dns/byaddr.c
+++ b/contrib/bind9/lib/dns/byaddr.c
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004, 2005, 2007 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004, 2005, 2007, 2009 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 2000-2003 Internet Software Consortium.
*
* Permission to use, copy, modify, and/or distribute this software for any
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: byaddr.c,v 1.39 2007-06-19 23:47:16 tbox Exp $ */
+/* $Id: byaddr.c,v 1.41 2009-09-02 23:48:02 tbox Exp $ */
/*! \file */
@@ -43,25 +43,6 @@
* XXXRTH We could use a static event...
*/
-struct dns_byaddr {
- /* Unlocked. */
- unsigned int magic;
- isc_mem_t * mctx;
- isc_mutex_t lock;
- dns_fixedname_t name;
- /* Locked by lock. */
- unsigned int options;
- dns_lookup_t * lookup;
- isc_task_t * task;
- dns_byaddrevent_t * event;
- isc_boolean_t canceled;
-};
-
-#define BYADDR_MAGIC ISC_MAGIC('B', 'y', 'A', 'd')
-#define VALID_BYADDR(b) ISC_MAGIC_VALID(b, BYADDR_MAGIC)
-
-#define MAX_RESTARTS 16
-
static char hex_digits[] = {
'0', '1', '2', '3', '4', '5', '6', '7',
'8', '9', 'a', 'b', 'c', 'd', 'e', 'f'
@@ -125,10 +106,29 @@ dns_byaddr_createptrname2(isc_netaddr_t *address, unsigned int options,
len = (unsigned int)strlen(textname);
isc_buffer_init(&buffer, textname, len);
isc_buffer_add(&buffer, len);
- return (dns_name_fromtext(name, &buffer, dns_rootname,
- ISC_FALSE, NULL));
+ return (dns_name_fromtext(name, &buffer, dns_rootname, 0, NULL));
}
+#ifdef BIND9
+struct dns_byaddr {
+ /* Unlocked. */
+ unsigned int magic;
+ isc_mem_t * mctx;
+ isc_mutex_t lock;
+ dns_fixedname_t name;
+ /* Locked by lock. */
+ unsigned int options;
+ dns_lookup_t * lookup;
+ isc_task_t * task;
+ dns_byaddrevent_t * event;
+ isc_boolean_t canceled;
+};
+
+#define BYADDR_MAGIC ISC_MAGIC('B', 'y', 'A', 'd')
+#define VALID_BYADDR(b) ISC_MAGIC_VALID(b, BYADDR_MAGIC)
+
+#define MAX_RESTARTS 16
+
static inline isc_result_t
copy_ptr_targets(dns_byaddr_t *byaddr, dns_rdataset_t *rdataset) {
isc_result_t result;
@@ -314,3 +314,4 @@ dns_byaddr_destroy(dns_byaddr_t **byaddrp) {
*byaddrp = NULL;
}
+#endif /* BIND9 */
diff --git a/contrib/bind9/lib/dns/cache.c b/contrib/bind9/lib/dns/cache.c
index 28ead66..bf93da2 100644
--- a/contrib/bind9/lib/dns/cache.c
+++ b/contrib/bind9/lib/dns/cache.c
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: cache.c,v 1.80.50.3 2009-05-06 23:34:30 jinmei Exp $ */
+/* $Id: cache.c,v 1.87 2009-11-12 23:43:02 each Exp $ */
/*! \file */
@@ -122,6 +122,7 @@ struct dns_cache {
isc_mutex_t lock;
isc_mutex_t filelock;
isc_mem_t *mctx;
+ char *name;
/* Locked by 'lock'. */
int references;
@@ -132,6 +133,7 @@ struct dns_cache {
char *db_type;
int db_argc;
char **db_argv;
+ isc_uint32_t size;
/* Locked by 'filelock'. */
char *filename;
@@ -171,6 +173,16 @@ dns_cache_create(isc_mem_t *mctx, isc_taskmgr_t *taskmgr,
const char *db_type, unsigned int db_argc, char **db_argv,
dns_cache_t **cachep)
{
+ return (dns_cache_create2(mctx, taskmgr, timermgr, rdclass, "",
+ db_type, db_argc, db_argv, cachep));
+}
+
+isc_result_t
+dns_cache_create2(isc_mem_t *mctx, isc_taskmgr_t *taskmgr,
+ isc_timermgr_t *timermgr, dns_rdataclass_t rdclass,
+ const char *cachename, const char *db_type,
+ unsigned int db_argc, char **db_argv, dns_cache_t **cachep)
+{
isc_result_t result;
dns_cache_t *cache;
int i;
@@ -179,6 +191,7 @@ dns_cache_create(isc_mem_t *mctx, isc_taskmgr_t *taskmgr,
REQUIRE(cachep != NULL);
REQUIRE(*cachep == NULL);
REQUIRE(mctx != NULL);
+ REQUIRE(cachename != NULL);
cache = isc_mem_get(mctx, sizeof(*cache));
if (cache == NULL)
@@ -187,6 +200,15 @@ dns_cache_create(isc_mem_t *mctx, isc_taskmgr_t *taskmgr,
cache->mctx = NULL;
isc_mem_attach(mctx, &cache->mctx);
+ cache->name = NULL;
+ if (cachename != NULL) {
+ cache->name = isc_mem_strdup(mctx, cachename);
+ if (cache->name == NULL) {
+ result = ISC_R_NOMEMORY;
+ goto cleanup_mem;
+ }
+ }
+
result = isc_mutex_init(&cache->lock);
if (result != ISC_R_SUCCESS)
goto cleanup_mem;
@@ -275,6 +297,8 @@ dns_cache_create(isc_mem_t *mctx, isc_taskmgr_t *taskmgr,
cleanup_lock:
DESTROYLOCK(&cache->lock);
cleanup_mem:
+ if (cache->name != NULL)
+ isc_mem_free(mctx, cache->name);
isc_mem_put(mctx, cache, sizeof(*cache));
isc_mem_detach(&mctx);
return (result);
@@ -323,6 +347,9 @@ cache_free(dns_cache_t *cache) {
if (cache->db_type != NULL)
isc_mem_free(cache->mctx, cache->db_type);
+ if (cache->name != NULL)
+ isc_mem_free(cache->mctx, cache->name);
+
DESTROYLOCK(&cache->lock);
DESTROYLOCK(&cache->filelock);
cache->magic = 0;
@@ -423,6 +450,7 @@ dns_cache_setfilename(dns_cache_t *cache, const char *filename) {
return (ISC_R_SUCCESS);
}
+#ifdef BIND9
isc_result_t
dns_cache_load(dns_cache_t *cache) {
isc_result_t result;
@@ -438,22 +466,29 @@ dns_cache_load(dns_cache_t *cache) {
return (result);
}
+#endif /* BIND9 */
isc_result_t
dns_cache_dump(dns_cache_t *cache) {
+#ifdef BIND9
isc_result_t result;
+#endif
REQUIRE(VALID_CACHE(cache));
if (cache->filename == NULL)
return (ISC_R_SUCCESS);
+#ifdef BIND9
LOCK(&cache->filelock);
result = dns_master_dump(cache->mctx, cache->db, NULL,
&dns_master_style_cache, cache->filename);
UNLOCK(&cache->filelock);
-
return (result);
+#else
+ return (ISC_R_NOTIMPLEMENTED);
+#endif
+
}
void
@@ -493,6 +528,26 @@ dns_cache_setcleaninginterval(dns_cache_t *cache, unsigned int t) {
UNLOCK(&cache->lock);
}
+unsigned int
+dns_cache_getcleaninginterval(dns_cache_t *cache) {
+ unsigned int t;
+
+ REQUIRE(VALID_CACHE(cache));
+
+ LOCK(&cache->lock);
+ t = cache->cleaner.cleaning_interval;
+ UNLOCK(&cache->lock);
+
+ return (t);
+}
+
+const char *
+dns_cache_getname(dns_cache_t *cache) {
+ REQUIRE(VALID_CACHE(cache));
+
+ return (cache->name);
+}
+
/*
* Initialize the cache cleaner object at *cleaner.
* Space for the object must be allocated by the caller.
@@ -519,6 +574,7 @@ cache_cleaner_init(dns_cache_t *cache, isc_taskmgr_t *taskmgr,
cleaner->cleaning_timer = NULL;
cleaner->resched_event = NULL;
cleaner->overmem_event = NULL;
+ cleaner->cleaning_interval = 0; /* Initially turned off. */
result = dns_db_createiterator(cleaner->cache->db, ISC_FALSE,
&cleaner->iterator);
@@ -547,7 +603,6 @@ cache_cleaner_init(dns_cache_t *cache, isc_taskmgr_t *taskmgr,
goto cleanup;
}
- cleaner->cleaning_interval = 0; /* Initially turned off. */
result = isc_timer_create(timermgr, isc_timertype_inactive,
NULL, NULL, cleaner->task,
cleaning_timer_action, cleaner,
@@ -949,6 +1004,10 @@ dns_cache_setcachesize(dns_cache_t *cache, isc_uint32_t size) {
if (size != 0 && size < DNS_CACHE_MINSIZE)
size = DNS_CACHE_MINSIZE;
+ LOCK(&cache->lock);
+ cache->size = size;
+ UNLOCK(&cache->lock);
+
hiwater = size - (size >> 3); /* Approximately 7/8ths. */
lowater = size - (size >> 2); /* Approximately 3/4ths. */
@@ -972,6 +1031,19 @@ dns_cache_setcachesize(dns_cache_t *cache, isc_uint32_t size) {
isc_mem_setwater(cache->mctx, water, cache, hiwater, lowater);
}
+isc_uint32_t
+dns_cache_getcachesize(dns_cache_t *cache) {
+ isc_uint32_t size;
+
+ REQUIRE(VALID_CACHE(cache));
+
+ LOCK(&cache->lock);
+ size = cache->size;
+ UNLOCK(&cache->lock);
+
+ return (size);
+}
+
/*
* The cleaner task is shutting down; do the necessary cleanup.
*/
diff --git a/contrib/bind9/lib/dns/client.c b/contrib/bind9/lib/dns/client.c
new file mode 100644
index 0000000..e55ea1f
--- /dev/null
+++ b/contrib/bind9/lib/dns/client.c
@@ -0,0 +1,3019 @@
+/*
+ * Copyright (C) 2009, 2010 Internet Systems Consortium, Inc. ("ISC")
+ *
+ * Permission to use, copy, modify, and/or 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 ISC DISCLAIMS ALL WARRANTIES WITH
+ * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+ * AND FITNESS. IN NO EVENT SHALL ISC 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.
+ */
+
+/* $Id: client.c,v 1.12 2010-12-03 12:03:22 marka Exp $ */
+
+#include <config.h>
+
+#include <stddef.h>
+
+#include <isc/app.h>
+#include <isc/mem.h>
+#include <isc/mutex.h>
+#include <isc/sockaddr.h>
+#include <isc/socket.h>
+#include <isc/task.h>
+#include <isc/timer.h>
+#include <isc/util.h>
+
+#include <dns/adb.h>
+#include <dns/client.h>
+#include <dns/db.h>
+#include <dns/dispatch.h>
+#include <dns/events.h>
+#include <dns/forward.h>
+#include <dns/keytable.h>
+#include <dns/message.h>
+#include <dns/name.h>
+#include <dns/rdata.h>
+#include <dns/rdatalist.h>
+#include <dns/rdataset.h>
+#include <dns/rdatatype.h>
+#include <dns/rdatasetiter.h>
+#include <dns/rdatastruct.h>
+#include <dns/request.h>
+#include <dns/resolver.h>
+#include <dns/result.h>
+#include <dns/tsec.h>
+#include <dns/tsig.h>
+#include <dns/view.h>
+
+#include <dst/dst.h>
+
+#define DNS_CLIENT_MAGIC ISC_MAGIC('D', 'N', 'S', 'c')
+#define DNS_CLIENT_VALID(c) ISC_MAGIC_VALID(c, DNS_CLIENT_MAGIC)
+
+#define RCTX_MAGIC ISC_MAGIC('R', 'c', 't', 'x')
+#define RCTX_VALID(c) ISC_MAGIC_VALID(c, RCTX_MAGIC)
+
+#define REQCTX_MAGIC ISC_MAGIC('R', 'q', 'c', 'x')
+#define REQCTX_VALID(c) ISC_MAGIC_VALID(c, REQCTX_MAGIC)
+
+#define UCTX_MAGIC ISC_MAGIC('U', 'c', 't', 'x')
+#define UCTX_VALID(c) ISC_MAGIC_VALID(c, UCTX_MAGIC)
+
+#define MAX_RESTARTS 16
+
+/*%
+ * DNS client object
+ */
+struct dns_client {
+ /* Unlocked */
+ unsigned int magic;
+ unsigned int attributes;
+ isc_mutex_t lock;
+ isc_mem_t *mctx;
+ isc_appctx_t *actx;
+ isc_taskmgr_t *taskmgr;
+ isc_task_t *task;
+ isc_socketmgr_t *socketmgr;
+ isc_timermgr_t *timermgr;
+ dns_dispatchmgr_t *dispatchmgr;
+ dns_dispatch_t *dispatchv4;
+ dns_dispatch_t *dispatchv6;
+
+ unsigned int update_timeout;
+ unsigned int update_udptimeout;
+ unsigned int update_udpretries;
+ unsigned int find_timeout;
+ unsigned int find_udpretries;
+
+ /* Locked */
+ unsigned int references;
+ dns_viewlist_t viewlist;
+ ISC_LIST(struct resctx) resctxs;
+ ISC_LIST(struct reqctx) reqctxs;
+ ISC_LIST(struct updatectx) updatectxs;
+};
+
+/*%
+ * Timeout/retry constants for dynamic update borrowed from nsupdate
+ */
+#define DEF_UPDATE_TIMEOUT 300
+#define MIN_UPDATE_TIMEOUT 30
+#define DEF_UPDATE_UDPTIMEOUT 3
+#define DEF_UPDATE_UDPRETRIES 3
+
+#define DEF_FIND_TIMEOUT 5
+#define DEF_FIND_UDPRETRIES 3
+
+#define DNS_CLIENTATTR_OWNCTX 0x01
+
+#define DNS_CLIENTVIEW_NAME "dnsclient"
+
+/*%
+ * Internal state for a single name resolution procedure
+ */
+typedef struct resctx {
+ /* Unlocked */
+ unsigned int magic;
+ isc_mutex_t lock;
+ dns_client_t *client;
+ isc_boolean_t want_dnssec;
+
+ /* Locked */
+ ISC_LINK(struct resctx) link;
+ isc_task_t *task;
+ dns_view_t *view;
+ unsigned int restarts;
+ dns_fixedname_t name;
+ dns_rdatatype_t type;
+ dns_fetch_t *fetch;
+ dns_namelist_t namelist;
+ isc_result_t result;
+ dns_clientresevent_t *event;
+ isc_boolean_t canceled;
+ dns_rdataset_t *rdataset;
+ dns_rdataset_t *sigrdataset;
+} resctx_t;
+
+/*%
+ * Argument of an internal event for synchronous name resolution.
+ */
+typedef struct resarg {
+ /* Unlocked */
+ isc_appctx_t *actx;
+ dns_client_t *client;
+ isc_mutex_t lock;
+
+ /* Locked */
+ isc_result_t result;
+ isc_result_t vresult;
+ dns_namelist_t *namelist;
+ dns_clientrestrans_t *trans;
+ isc_boolean_t canceled;
+} resarg_t;
+
+/*%
+ * Internal state for a single DNS request
+ */
+typedef struct reqctx {
+ /* Unlocked */
+ unsigned int magic;
+ isc_mutex_t lock;
+ dns_client_t *client;
+ unsigned int parseoptions;
+
+ /* Locked */
+ ISC_LINK(struct reqctx) link;
+ isc_boolean_t canceled;
+ dns_tsigkey_t *tsigkey;
+ dns_request_t *request;
+ dns_clientreqevent_t *event;
+} reqctx_t;
+
+/*%
+ * Argument of an internal event for synchronous DNS request.
+ */
+typedef struct reqarg {
+ /* Unlocked */
+ isc_appctx_t *actx;
+ dns_client_t *client;
+ isc_mutex_t lock;
+
+ /* Locked */
+ isc_result_t result;
+ dns_clientreqtrans_t *trans;
+ isc_boolean_t canceled;
+} reqarg_t;
+
+/*%
+ * Argument of an internal event for synchronous name resolution.
+ */
+typedef struct updatearg {
+ /* Unlocked */
+ isc_appctx_t *actx;
+ dns_client_t *client;
+ isc_mutex_t lock;
+
+ /* Locked */
+ isc_result_t result;
+ dns_clientupdatetrans_t *trans;
+ isc_boolean_t canceled;
+} updatearg_t;
+
+/*%
+ * Internal state for a single dynamic update procedure
+ */
+typedef struct updatectx {
+ /* Unlocked */
+ unsigned int magic;
+ isc_mutex_t lock;
+ dns_client_t *client;
+
+ /* Locked */
+ dns_request_t *updatereq;
+ dns_request_t *soareq;
+ dns_clientrestrans_t *restrans;
+ dns_clientrestrans_t *restrans2;
+ isc_boolean_t canceled;
+
+ /* Task Locked */
+ ISC_LINK(struct updatectx) link;
+ dns_clientupdatestate_t state;
+ dns_rdataclass_t rdclass;
+ dns_view_t *view;
+ dns_message_t *updatemsg;
+ dns_message_t *soaquery;
+ dns_clientupdateevent_t *event;
+ dns_tsigkey_t *tsigkey;
+ dst_key_t *sig0key;
+ dns_name_t *firstname;
+ dns_name_t soaqname;
+ dns_fixedname_t zonefname;
+ dns_name_t *zonename;
+ isc_sockaddrlist_t servers;
+ unsigned int nservers;
+ isc_sockaddr_t *currentserver;
+ struct updatectx *bp4;
+ struct updatectx *bp6;
+} updatectx_t;
+
+static isc_result_t request_soa(updatectx_t *uctx);
+static void client_resfind(resctx_t *rctx, dns_fetchevent_t *event);
+static isc_result_t send_update(updatectx_t *uctx);
+
+static isc_result_t
+getudpdispatch(int family, dns_dispatchmgr_t *dispatchmgr,
+ isc_socketmgr_t *socketmgr, isc_taskmgr_t *taskmgr,
+ isc_boolean_t is_shared, dns_dispatch_t **dispp)
+{
+ unsigned int attrs, attrmask;
+ isc_sockaddr_t sa;
+ dns_dispatch_t *disp;
+ unsigned buffersize, maxbuffers, maxrequests, buckets, increment;
+ isc_result_t result;
+
+ attrs = 0;
+ attrs |= DNS_DISPATCHATTR_UDP;
+ switch (family) {
+ case AF_INET:
+ attrs |= DNS_DISPATCHATTR_IPV4;
+ break;
+ case AF_INET6:
+ attrs |= DNS_DISPATCHATTR_IPV6;
+ break;
+ default:
+ INSIST(0);
+ }
+ attrmask = 0;
+ attrmask |= DNS_DISPATCHATTR_UDP;
+ attrmask |= DNS_DISPATCHATTR_TCP;
+ attrmask |= DNS_DISPATCHATTR_IPV4;
+ attrmask |= DNS_DISPATCHATTR_IPV6;
+
+ isc_sockaddr_anyofpf(&sa, family);
+
+ buffersize = 4096;
+ maxbuffers = is_shared ? 1000 : 8;
+ maxrequests = 32768;
+ buckets = is_shared ? 16411 : 3;
+ increment = is_shared ? 16433 : 5;
+
+ disp = NULL;
+ result = dns_dispatch_getudp(dispatchmgr, socketmgr,
+ taskmgr, &sa,
+ buffersize, maxbuffers, maxrequests,
+ buckets, increment,
+ attrs, attrmask, &disp);
+ if (result == ISC_R_SUCCESS)
+ *dispp = disp;
+
+ return (result);
+}
+
+static isc_result_t
+dns_client_createview(isc_mem_t *mctx, dns_rdataclass_t rdclass,
+ unsigned int options, isc_taskmgr_t *taskmgr,
+ unsigned int ntasks, isc_socketmgr_t *socketmgr,
+ isc_timermgr_t *timermgr, dns_dispatchmgr_t *dispatchmgr,
+ dns_dispatch_t *dispatchv4, dns_dispatch_t *dispatchv6,
+ dns_view_t **viewp)
+{
+ isc_result_t result;
+ dns_view_t *view = NULL;
+ const char *dbtype;
+
+ result = dns_view_create(mctx, rdclass, DNS_CLIENTVIEW_NAME, &view);
+ if (result != ISC_R_SUCCESS)
+ return (result);
+
+ /* Initialize view security roots */
+ result = dns_view_initsecroots(view, mctx);
+ if (result != ISC_R_SUCCESS) {
+ dns_view_detach(&view);
+ return (result);
+ }
+
+ result = dns_view_createresolver(view, taskmgr, ntasks, socketmgr,
+ timermgr, 0, dispatchmgr,
+ dispatchv4, dispatchv6);
+ if (result != ISC_R_SUCCESS) {
+ dns_view_detach(&view);
+ return (result);
+ }
+
+ /*
+ * Set cache DB.
+ * XXX: it may be better if specific DB implementations can be
+ * specified via some configuration knob.
+ */
+ if ((options & DNS_CLIENTCREATEOPT_USECACHE) != 0)
+ dbtype = "rbt";
+ else
+ dbtype = "ecdb";
+ result = dns_db_create(mctx, dbtype, dns_rootname, dns_dbtype_cache,
+ rdclass, 0, NULL, &view->cachedb);
+ if (result != ISC_R_SUCCESS) {
+ dns_view_detach(&view);
+ return (result);
+ }
+
+ *viewp = view;
+ return (ISC_R_SUCCESS);
+}
+
+isc_result_t
+dns_client_create(dns_client_t **clientp, unsigned int options) {
+ isc_result_t result;
+ isc_mem_t *mctx = NULL;
+ isc_appctx_t *actx = NULL;
+ isc_taskmgr_t *taskmgr = NULL;
+ isc_socketmgr_t *socketmgr = NULL;
+ isc_timermgr_t *timermgr = NULL;
+
+ result = isc_mem_create(0, 0, &mctx);
+ if (result != ISC_R_SUCCESS)
+ return (result);
+ result = isc_appctx_create(mctx, &actx);
+ if (result != ISC_R_SUCCESS)
+ goto cleanup;
+ result = isc_app_ctxstart(actx);
+ if (result != ISC_R_SUCCESS)
+ goto cleanup;
+ result = isc_taskmgr_createinctx(mctx, actx, 1, 0, &taskmgr);
+ if (result != ISC_R_SUCCESS)
+ goto cleanup;
+ result = isc_socketmgr_createinctx(mctx, actx, &socketmgr);
+ if (result != ISC_R_SUCCESS)
+ goto cleanup;
+ result = isc_timermgr_createinctx(mctx, actx, &timermgr);
+ if (result != ISC_R_SUCCESS)
+ goto cleanup;
+
+ result = dns_client_createx(mctx, actx, taskmgr, socketmgr, timermgr,
+ options, clientp);
+ if (result != ISC_R_SUCCESS)
+ goto cleanup;
+
+ (*clientp)->attributes |= DNS_CLIENTATTR_OWNCTX;
+
+ /* client has its own reference to mctx, so we can detach it here */
+ isc_mem_detach(&mctx);
+
+ return (ISC_R_SUCCESS);
+
+ cleanup:
+ if (taskmgr != NULL)
+ isc_taskmgr_destroy(&taskmgr);
+ if (timermgr != NULL)
+ isc_timermgr_destroy(&timermgr);
+ if (socketmgr != NULL)
+ isc_socketmgr_destroy(&socketmgr);
+ if (actx != NULL)
+ isc_appctx_destroy(&actx);
+ isc_mem_detach(&mctx);
+
+ return (result);
+}
+
+isc_result_t
+dns_client_createx(isc_mem_t *mctx, isc_appctx_t *actx, isc_taskmgr_t *taskmgr,
+ isc_socketmgr_t *socketmgr, isc_timermgr_t *timermgr,
+ unsigned int options, dns_client_t **clientp)
+{
+ dns_client_t *client;
+ isc_result_t result;
+ dns_dispatchmgr_t *dispatchmgr = NULL;
+ dns_dispatch_t *dispatchv4 = NULL;
+ dns_dispatch_t *dispatchv6 = NULL;
+ dns_view_t *view = NULL;
+
+ REQUIRE(mctx != NULL);
+ REQUIRE(taskmgr != NULL);
+ REQUIRE(timermgr != NULL);
+ REQUIRE(socketmgr != NULL);
+ REQUIRE(clientp != NULL && *clientp == NULL);
+
+ client = isc_mem_get(mctx, sizeof(*client));
+ if (client == NULL)
+ return (ISC_R_NOMEMORY);
+
+ result = isc_mutex_init(&client->lock);
+ if (result != ISC_R_SUCCESS) {
+ isc_mem_put(mctx, client, sizeof(*client));
+ return (result);
+ }
+
+ client->actx = actx;
+ client->taskmgr = taskmgr;
+ client->socketmgr = socketmgr;
+ client->timermgr = timermgr;
+
+ client->task = NULL;
+ result = isc_task_create(client->taskmgr, 0, &client->task);
+ if (result != ISC_R_SUCCESS)
+ goto cleanup;
+
+ result = dns_dispatchmgr_create(mctx, NULL, &dispatchmgr);
+ if (result != ISC_R_SUCCESS)
+ goto cleanup;
+ client->dispatchmgr = dispatchmgr;
+
+ /* TODO: whether to use dispatch v4 or v6 should be configurable */
+ client->dispatchv4 = NULL;
+ client->dispatchv6 = NULL;
+ result = getudpdispatch(AF_INET, dispatchmgr, socketmgr,
+ taskmgr, ISC_TRUE, &dispatchv4);
+ if (result == ISC_R_SUCCESS)
+ client->dispatchv4 = dispatchv4;
+ result = getudpdispatch(AF_INET6, dispatchmgr, socketmgr,
+ taskmgr, ISC_TRUE, &dispatchv6);
+ if (result == ISC_R_SUCCESS)
+ client->dispatchv6 = dispatchv6;
+
+ /* We need at least one of the dispatchers */
+ if (dispatchv4 == NULL && dispatchv6 == NULL) {
+ INSIST(result != ISC_R_SUCCESS);
+ goto cleanup;
+ }
+
+ /* Create the default view for class IN */
+ result = dns_client_createview(mctx, dns_rdataclass_in, options,
+ taskmgr, 31, socketmgr, timermgr,
+ dispatchmgr, dispatchv4, dispatchv6,
+ &view);
+ if (result != ISC_R_SUCCESS)
+ goto cleanup;
+ ISC_LIST_INIT(client->viewlist);
+ ISC_LIST_APPEND(client->viewlist, view, link);
+
+ dns_view_freeze(view); /* too early? */
+
+ ISC_LIST_INIT(client->resctxs);
+ ISC_LIST_INIT(client->reqctxs);
+ ISC_LIST_INIT(client->updatectxs);
+
+ client->mctx = NULL;
+ isc_mem_attach(mctx, &client->mctx);
+
+ client->update_timeout = DEF_UPDATE_TIMEOUT;
+ client->update_udptimeout = DEF_UPDATE_UDPTIMEOUT;
+ client->update_udpretries = DEF_UPDATE_UDPRETRIES;
+ client->find_timeout = DEF_FIND_TIMEOUT;
+ client->find_udpretries = DEF_FIND_UDPRETRIES;
+
+ client->references = 1;
+ client->magic = DNS_CLIENT_MAGIC;
+
+ *clientp = client;
+
+ return (ISC_R_SUCCESS);
+
+ cleanup:
+ if (dispatchv4 != NULL)
+ dns_dispatch_detach(&dispatchv4);
+ if (dispatchv6 != NULL)
+ dns_dispatch_detach(&dispatchv6);
+ if (dispatchmgr != NULL)
+ dns_dispatchmgr_destroy(&dispatchmgr);
+ if (client->task != NULL)
+ isc_task_detach(&client->task);
+ isc_mem_put(mctx, client, sizeof(*client));
+
+ return (result);
+}
+
+static void
+destroyclient(dns_client_t **clientp) {
+ dns_client_t *client = *clientp;
+ dns_view_t *view;
+
+ while ((view = ISC_LIST_HEAD(client->viewlist)) != NULL) {
+ ISC_LIST_UNLINK(client->viewlist, view, link);
+ dns_view_detach(&view);
+ }
+
+ if (client->dispatchv4 != NULL)
+ dns_dispatch_detach(&client->dispatchv4);
+ if (client->dispatchv6 != NULL)
+ dns_dispatch_detach(&client->dispatchv6);
+
+ dns_dispatchmgr_destroy(&client->dispatchmgr);
+
+ isc_task_detach(&client->task);
+
+ /*
+ * If the client has created its own running environments,
+ * destroy them.
+ */
+ if ((client->attributes & DNS_CLIENTATTR_OWNCTX) != 0) {
+ isc_taskmgr_destroy(&client->taskmgr);
+ isc_timermgr_destroy(&client->timermgr);
+ isc_socketmgr_destroy(&client->socketmgr);
+
+ isc_app_ctxfinish(client->actx);
+ isc_appctx_destroy(&client->actx);
+ }
+
+ DESTROYLOCK(&client->lock);
+ client->magic = 0;
+
+ isc_mem_putanddetach(&client->mctx, client, sizeof(*client));
+
+ *clientp = NULL;
+}
+
+void
+dns_client_destroy(dns_client_t **clientp) {
+ dns_client_t *client;
+ isc_boolean_t destroyok = ISC_FALSE;
+
+ REQUIRE(clientp != NULL);
+ client = *clientp;
+ REQUIRE(DNS_CLIENT_VALID(client));
+
+ LOCK(&client->lock);
+ client->references--;
+ if (client->references == 0 && ISC_LIST_EMPTY(client->resctxs) &&
+ ISC_LIST_EMPTY(client->reqctxs) &&
+ ISC_LIST_EMPTY(client->updatectxs)) {
+ destroyok = ISC_TRUE;
+ }
+ UNLOCK(&client->lock);
+
+ if (destroyok)
+ destroyclient(&client);
+
+ *clientp = NULL;
+}
+
+isc_result_t
+dns_client_setservers(dns_client_t *client, dns_rdataclass_t rdclass,
+ dns_name_t *namespace, isc_sockaddrlist_t *addrs)
+{
+ isc_result_t result;
+ dns_view_t *view = NULL;
+
+ REQUIRE(DNS_CLIENT_VALID(client));
+ REQUIRE(addrs != NULL);
+
+ if (namespace == NULL)
+ namespace = dns_rootname;
+
+ LOCK(&client->lock);
+ result = dns_viewlist_find(&client->viewlist, DNS_CLIENTVIEW_NAME,
+ rdclass, &view);
+ if (result != ISC_R_SUCCESS) {
+ UNLOCK(&client->lock);
+ return (result);
+ }
+ UNLOCK(&client->lock);
+
+ result = dns_fwdtable_add(view->fwdtable, namespace, addrs,
+ dns_fwdpolicy_only);
+
+ dns_view_detach(&view);
+
+ return (result);
+}
+
+isc_result_t
+dns_client_clearservers(dns_client_t *client, dns_rdataclass_t rdclass,
+ dns_name_t *namespace)
+{
+ isc_result_t result;
+ dns_view_t *view = NULL;
+
+ REQUIRE(DNS_CLIENT_VALID(client));
+
+ if (namespace == NULL)
+ namespace = dns_rootname;
+
+ LOCK(&client->lock);
+ result = dns_viewlist_find(&client->viewlist, DNS_CLIENTVIEW_NAME,
+ rdclass, &view);
+ if (result != ISC_R_SUCCESS) {
+ UNLOCK(&client->lock);
+ return (result);
+ }
+ UNLOCK(&client->lock);
+
+ result = dns_fwdtable_delete(view->fwdtable, namespace);
+
+ dns_view_detach(&view);
+
+ return (result);
+}
+
+static isc_result_t
+getrdataset(isc_mem_t *mctx, dns_rdataset_t **rdatasetp) {
+ dns_rdataset_t *rdataset;
+
+ REQUIRE(mctx != NULL);
+ REQUIRE(rdatasetp != NULL && *rdatasetp == NULL);
+
+ rdataset = isc_mem_get(mctx, sizeof(*rdataset));
+ if (rdataset == NULL)
+ return (ISC_R_NOMEMORY);
+
+ dns_rdataset_init(rdataset);
+
+ *rdatasetp = rdataset;
+
+ return (ISC_R_SUCCESS);
+}
+
+static void
+putrdataset(isc_mem_t *mctx, dns_rdataset_t **rdatasetp) {
+ dns_rdataset_t *rdataset;
+
+ REQUIRE(rdatasetp != NULL);
+ rdataset = *rdatasetp;
+ REQUIRE(rdataset != NULL);
+
+ if (dns_rdataset_isassociated(rdataset))
+ dns_rdataset_disassociate(rdataset);
+
+ isc_mem_put(mctx, rdataset, sizeof(*rdataset));
+
+ *rdatasetp = NULL;
+}
+
+static void
+fetch_done(isc_task_t *task, isc_event_t *event) {
+ resctx_t *rctx = event->ev_arg;
+ dns_fetchevent_t *fevent;
+
+ REQUIRE(event->ev_type == DNS_EVENT_FETCHDONE);
+ REQUIRE(RCTX_VALID(rctx));
+ REQUIRE(rctx->task == task);
+ fevent = (dns_fetchevent_t *)event;
+
+ client_resfind(rctx, fevent);
+}
+
+static inline isc_result_t
+start_fetch(resctx_t *rctx) {
+ isc_result_t result;
+
+ /*
+ * The caller must be holding the rctx's lock.
+ */
+
+ REQUIRE(rctx->fetch == NULL);
+
+ result = dns_resolver_createfetch(rctx->view->resolver,
+ dns_fixedname_name(&rctx->name),
+ rctx->type,
+ NULL, NULL, NULL, 0,
+ rctx->task, fetch_done, rctx,
+ rctx->rdataset,
+ rctx->sigrdataset,
+ &rctx->fetch);
+
+ return (result);
+}
+
+static isc_result_t
+view_find(resctx_t *rctx, dns_db_t **dbp, dns_dbnode_t **nodep,
+ dns_name_t *foundname)
+{
+ isc_result_t result;
+ dns_name_t *name = dns_fixedname_name(&rctx->name);
+ dns_rdatatype_t type;
+
+ if (rctx->type == dns_rdatatype_rrsig)
+ type = dns_rdatatype_any;
+ else
+ type = rctx->type;
+
+ result = dns_view_find(rctx->view, name, type, 0, 0, ISC_FALSE,
+ dbp, nodep, foundname, rctx->rdataset,
+ rctx->sigrdataset);
+
+ return (result);
+}
+
+static void
+client_resfind(resctx_t *rctx, dns_fetchevent_t *event) {
+ isc_mem_t *mctx;
+ isc_result_t result, tresult;
+ isc_result_t vresult = ISC_R_SUCCESS;
+ isc_boolean_t want_restart;
+ isc_boolean_t send_event = ISC_FALSE;
+ dns_name_t *name, *prefix;
+ dns_fixedname_t foundname, fixed;
+ dns_rdataset_t *trdataset;
+ dns_rdata_t rdata = DNS_RDATA_INIT;
+ unsigned int nlabels;
+ int order;
+ dns_namereln_t namereln;
+ dns_rdata_cname_t cname;
+ dns_rdata_dname_t dname;
+
+ REQUIRE(RCTX_VALID(rctx));
+
+ LOCK(&rctx->lock);
+
+ mctx = rctx->view->mctx;
+
+ result = ISC_R_SUCCESS;
+ name = dns_fixedname_name(&rctx->name);
+
+ do {
+ dns_name_t *fname = NULL;
+ dns_name_t *ansname = NULL;
+ dns_db_t *db = NULL;
+ dns_dbnode_t *node = NULL;
+
+ rctx->restarts++;
+ want_restart = ISC_FALSE;
+
+ if (event == NULL && !rctx->canceled) {
+ dns_fixedname_init(&foundname);
+ fname = dns_fixedname_name(&foundname);
+ INSIST(!dns_rdataset_isassociated(rctx->rdataset));
+ INSIST(rctx->sigrdataset == NULL ||
+ !dns_rdataset_isassociated(rctx->sigrdataset));
+ result = view_find(rctx, &db, &node, fname);
+ if (result == ISC_R_NOTFOUND) {
+ /*
+ * We don't know anything about the name.
+ * Launch a fetch.
+ */
+ if (node != NULL) {
+ INSIST(db != NULL);
+ dns_db_detachnode(db, &node);
+ }
+ if (db != NULL)
+ dns_db_detach(&db);
+ result = start_fetch(rctx);
+ if (result != ISC_R_SUCCESS) {
+ putrdataset(mctx, &rctx->rdataset);
+ if (rctx->sigrdataset != NULL)
+ putrdataset(mctx,
+ &rctx->sigrdataset);
+ send_event = ISC_TRUE;
+ }
+ goto done;
+ }
+ } else {
+ INSIST(event->fetch == rctx->fetch);
+ dns_resolver_destroyfetch(&rctx->fetch);
+ db = event->db;
+ node = event->node;
+ result = event->result;
+ vresult = event->vresult;
+ fname = dns_fixedname_name(&event->foundname);
+ INSIST(event->rdataset == rctx->rdataset);
+ INSIST(event->sigrdataset == rctx->sigrdataset);
+ }
+
+ /*
+ * If we've been canceled, forget about the result.
+ */
+ if (rctx->canceled)
+ result = ISC_R_CANCELED;
+ else {
+ /*
+ * Otherwise, get some resource for copying the
+ * result.
+ */
+ ansname = isc_mem_get(mctx, sizeof(*ansname));
+ if (ansname == NULL)
+ tresult = ISC_R_NOMEMORY;
+ else {
+ dns_name_t *aname;
+
+ aname = dns_fixedname_name(&rctx->name);
+ dns_name_init(ansname, NULL);
+ tresult = dns_name_dup(aname, mctx, ansname);
+ if (tresult != ISC_R_SUCCESS)
+ isc_mem_put(mctx, ansname,
+ sizeof(*ansname));
+ }
+ if (tresult != ISC_R_SUCCESS)
+ result = tresult;
+ }
+
+ switch (result) {
+ case ISC_R_SUCCESS:
+ send_event = ISC_TRUE;
+ /*
+ * This case is handled in the main line below.
+ */
+ break;
+ case DNS_R_CNAME:
+ /*
+ * Add the CNAME to the answer list.
+ */
+ trdataset = rctx->rdataset;
+ ISC_LIST_APPEND(ansname->list, rctx->rdataset, link);
+ rctx->rdataset = NULL;
+ if (rctx->sigrdataset != NULL) {
+ ISC_LIST_APPEND(ansname->list,
+ rctx->sigrdataset, link);
+ rctx->sigrdataset = NULL;
+ }
+ ISC_LIST_APPEND(rctx->namelist, ansname, link);
+ ansname = NULL;
+
+ /*
+ * Copy the CNAME's target into the lookup's
+ * query name and start over.
+ */
+ tresult = dns_rdataset_first(trdataset);
+ if (tresult != ISC_R_SUCCESS)
+ goto done;
+ dns_rdataset_current(trdataset, &rdata);
+ tresult = dns_rdata_tostruct(&rdata, &cname, NULL);
+ dns_rdata_reset(&rdata);
+ if (tresult != ISC_R_SUCCESS)
+ goto done;
+ tresult = dns_name_copy(&cname.cname, name, NULL);
+ dns_rdata_freestruct(&cname);
+ if (tresult == ISC_R_SUCCESS)
+ want_restart = ISC_TRUE;
+ else
+ result = tresult;
+ goto done;
+ case DNS_R_DNAME:
+ /*
+ * Add the DNAME to the answer list.
+ */
+ trdataset = rctx->rdataset;
+ ISC_LIST_APPEND(ansname->list, rctx->rdataset, link);
+ rctx->rdataset = NULL;
+ if (rctx->sigrdataset != NULL) {
+ ISC_LIST_APPEND(ansname->list,
+ rctx->sigrdataset, link);
+ rctx->sigrdataset = NULL;
+ }
+ ISC_LIST_APPEND(rctx->namelist, ansname, link);
+ ansname = NULL;
+
+ namereln = dns_name_fullcompare(name, fname, &order,
+ &nlabels);
+ INSIST(namereln == dns_namereln_subdomain);
+ /*
+ * Get the target name of the DNAME.
+ */
+ tresult = dns_rdataset_first(trdataset);
+ if (tresult != ISC_R_SUCCESS) {
+ result = tresult;
+ goto done;
+ }
+ dns_rdataset_current(trdataset, &rdata);
+ tresult = dns_rdata_tostruct(&rdata, &dname, NULL);
+ dns_rdata_reset(&rdata);
+ if (tresult != ISC_R_SUCCESS) {
+ result = tresult;
+ goto done;
+ }
+ /*
+ * Construct the new query name and start over.
+ */
+ dns_fixedname_init(&fixed);
+ prefix = dns_fixedname_name(&fixed);
+ dns_name_split(name, nlabels, prefix, NULL);
+ tresult = dns_name_concatenate(prefix, &dname.dname,
+ name, NULL);
+ dns_rdata_freestruct(&dname);
+ if (tresult == ISC_R_SUCCESS)
+ want_restart = ISC_TRUE;
+ else
+ result = tresult;
+ goto done;
+ case DNS_R_NCACHENXDOMAIN:
+ case DNS_R_NCACHENXRRSET:
+ ISC_LIST_APPEND(ansname->list, rctx->rdataset, link);
+ ISC_LIST_APPEND(rctx->namelist, ansname, link);
+ ansname = NULL;
+ rctx->rdataset = NULL;
+ /* What about sigrdataset? */
+ if (rctx->sigrdataset != NULL)
+ putrdataset(mctx, &rctx->sigrdataset);
+ send_event = ISC_TRUE;
+ goto done;
+ default:
+ if (rctx->rdataset != NULL)
+ putrdataset(mctx, &rctx->rdataset);
+ if (rctx->sigrdataset != NULL)
+ putrdataset(mctx, &rctx->sigrdataset);
+ send_event = ISC_TRUE;
+ goto done;
+ }
+
+ if (rctx->type == dns_rdatatype_any) {
+ int n = 0;
+ dns_rdatasetiter_t *rdsiter = NULL;
+
+ tresult = dns_db_allrdatasets(db, node, NULL, 0,
+ &rdsiter);
+ if (tresult != ISC_R_SUCCESS) {
+ result = tresult;
+ goto done;
+ }
+
+ tresult = dns_rdatasetiter_first(rdsiter);
+ while (tresult == ISC_R_SUCCESS) {
+ dns_rdatasetiter_current(rdsiter,
+ rctx->rdataset);
+ if (rctx->rdataset->type != 0) {
+ ISC_LIST_APPEND(ansname->list,
+ rctx->rdataset,
+ link);
+ n++;
+ rctx->rdataset = NULL;
+ } else {
+ /*
+ * We're not interested in this
+ * rdataset.
+ */
+ dns_rdataset_disassociate(
+ rctx->rdataset);
+ }
+ tresult = dns_rdatasetiter_next(rdsiter);
+
+ if (tresult == ISC_R_SUCCESS &&
+ rctx->rdataset == NULL) {
+ tresult = getrdataset(mctx,
+ &rctx->rdataset);
+ if (tresult != ISC_R_SUCCESS) {
+ result = tresult;
+ break;
+ }
+ }
+ }
+ if (n == 0) {
+ /*
+ * We didn't match any rdatasets (which means
+ * something went wrong in this
+ * implementation).
+ */
+ result = DNS_R_SERVFAIL; /* better code? */
+ } else {
+ ISC_LIST_APPEND(rctx->namelist, ansname, link);
+ ansname = NULL;
+ }
+ dns_rdatasetiter_destroy(&rdsiter);
+ if (tresult != ISC_R_NOMORE)
+ result = DNS_R_SERVFAIL; /* ditto */
+ else
+ result = ISC_R_SUCCESS;
+ goto done;
+ } else {
+ /*
+ * This is the "normal" case -- an ordinary question
+ * to which we've got the answer.
+ */
+ ISC_LIST_APPEND(ansname->list, rctx->rdataset, link);
+ rctx->rdataset = NULL;
+ if (rctx->sigrdataset != NULL) {
+ ISC_LIST_APPEND(ansname->list,
+ rctx->sigrdataset, link);
+ rctx->sigrdataset = NULL;
+ }
+ ISC_LIST_APPEND(rctx->namelist, ansname, link);
+ ansname = NULL;
+ }
+
+ done:
+ /*
+ * Free temporary resources
+ */
+ if (ansname != NULL) {
+ dns_rdataset_t *rdataset;
+
+ while ((rdataset = ISC_LIST_HEAD(ansname->list))
+ != NULL) {
+ ISC_LIST_UNLINK(ansname->list, rdataset, link);
+ putrdataset(mctx, &rdataset);
+ }
+ dns_name_free(ansname, mctx);
+ isc_mem_put(mctx, ansname, sizeof(*ansname));
+ }
+
+ if (node != NULL)
+ dns_db_detachnode(db, &node);
+ if (db != NULL)
+ dns_db_detach(&db);
+ if (event != NULL)
+ isc_event_free(ISC_EVENT_PTR(&event));
+
+ /*
+ * Limit the number of restarts.
+ */
+ if (want_restart && rctx->restarts == MAX_RESTARTS) {
+ want_restart = ISC_FALSE;
+ result = ISC_R_QUOTA;
+ send_event = ISC_TRUE;
+ }
+
+ /*
+ * Prepare further find with new resources
+ */
+ if (want_restart) {
+ INSIST(rctx->rdataset == NULL &&
+ rctx->sigrdataset == NULL);
+
+ result = getrdataset(mctx, &rctx->rdataset);
+ if (result == ISC_R_SUCCESS && rctx->want_dnssec) {
+ result = getrdataset(mctx, &rctx->sigrdataset);
+ if (result != ISC_R_SUCCESS) {
+ putrdataset(mctx, &rctx->rdataset);
+ }
+ }
+
+ if (result != ISC_R_SUCCESS) {
+ want_restart = ISC_FALSE;
+ send_event = ISC_TRUE;
+ }
+ }
+ } while (want_restart);
+
+ if (send_event) {
+ isc_task_t *task;
+
+ while ((name = ISC_LIST_HEAD(rctx->namelist)) != NULL) {
+ ISC_LIST_UNLINK(rctx->namelist, name, link);
+ ISC_LIST_APPEND(rctx->event->answerlist, name, link);
+ }
+
+ rctx->event->result = result;
+ rctx->event->vresult = vresult;
+ task = rctx->event->ev_sender;
+ rctx->event->ev_sender = rctx;
+ isc_task_sendanddetach(&task, ISC_EVENT_PTR(&rctx->event));
+ }
+
+ UNLOCK(&rctx->lock);
+}
+
+static void
+resolve_done(isc_task_t *task, isc_event_t *event) {
+ resarg_t *resarg = event->ev_arg;
+ dns_clientresevent_t *rev = (dns_clientresevent_t *)event;
+ dns_name_t *name;
+
+ UNUSED(task);
+
+ LOCK(&resarg->lock);
+
+ resarg->result = rev->result;
+ resarg->vresult = rev->vresult;
+ while ((name = ISC_LIST_HEAD(rev->answerlist)) != NULL) {
+ ISC_LIST_UNLINK(rev->answerlist, name, link);
+ ISC_LIST_APPEND(*resarg->namelist, name, link);
+ }
+
+ dns_client_destroyrestrans(&resarg->trans);
+ isc_event_free(&event);
+
+ if (!resarg->canceled) {
+ UNLOCK(&resarg->lock);
+
+ /* Exit from the internal event loop */
+ isc_app_ctxsuspend(resarg->actx);
+ } else {
+ /*
+ * We have already exited from the loop (due to some
+ * unexpected event). Just clean the arg up.
+ */
+ UNLOCK(&resarg->lock);
+ DESTROYLOCK(&resarg->lock);
+ isc_mem_put(resarg->client->mctx, resarg, sizeof(*resarg));
+ }
+}
+
+isc_result_t
+dns_client_resolve(dns_client_t *client, dns_name_t *name,
+ dns_rdataclass_t rdclass, dns_rdatatype_t type,
+ unsigned int options, dns_namelist_t *namelist)
+{
+ isc_result_t result;
+ isc_appctx_t *actx;
+ resarg_t *resarg;
+
+ REQUIRE(DNS_CLIENT_VALID(client));
+ REQUIRE(namelist != NULL && ISC_LIST_EMPTY(*namelist));
+
+ if ((client->attributes & DNS_CLIENTATTR_OWNCTX) == 0 &&
+ (options & DNS_CLIENTRESOPT_ALLOWRUN) == 0) {
+ /*
+ * If the client is run under application's control, we need
+ * to create a new running (sub)environment for this
+ * particular resolution.
+ */
+ return (ISC_R_NOTIMPLEMENTED); /* XXXTBD */
+ } else
+ actx = client->actx;
+
+ resarg = isc_mem_get(client->mctx, sizeof(*resarg));
+ if (resarg == NULL)
+ return (ISC_R_NOMEMORY);
+
+ result = isc_mutex_init(&resarg->lock);
+ if (result != ISC_R_SUCCESS) {
+ isc_mem_put(client->mctx, resarg, sizeof(*resarg));
+ return (result);
+ }
+
+ resarg->actx = actx;
+ resarg->client = client;
+ resarg->result = DNS_R_SERVFAIL;
+ resarg->namelist = namelist;
+ resarg->trans = NULL;
+ resarg->canceled = ISC_FALSE;
+ result = dns_client_startresolve(client, name, rdclass, type, options,
+ client->task, resolve_done, resarg,
+ &resarg->trans);
+ if (result != ISC_R_SUCCESS) {
+ DESTROYLOCK(&resarg->lock);
+ isc_mem_put(client->mctx, resarg, sizeof(*resarg));
+ return (result);
+ }
+
+ /*
+ * Start internal event loop. It blocks until the entire process
+ * is completed.
+ */
+ result = isc_app_ctxrun(actx);
+
+ LOCK(&resarg->lock);
+ if (result == ISC_R_SUCCESS || result == ISC_R_SUSPEND)
+ result = resarg->result;
+ if (result != ISC_R_SUCCESS && resarg->vresult != ISC_R_SUCCESS) {
+ /*
+ * If this lookup failed due to some error in DNSSEC
+ * validation, return the validation error code.
+ * XXX: or should we pass the validation result separately?
+ */
+ result = resarg->vresult;
+ }
+ if (resarg->trans != NULL) {
+ /*
+ * Unusual termination (perhaps due to signal). We need some
+ * tricky cleanup process.
+ */
+ resarg->canceled = ISC_TRUE;
+ dns_client_cancelresolve(resarg->trans);
+
+ UNLOCK(&resarg->lock);
+
+ /* resarg will be freed in the event handler. */
+ } else {
+ UNLOCK(&resarg->lock);
+
+ DESTROYLOCK(&resarg->lock);
+ isc_mem_put(client->mctx, resarg, sizeof(*resarg));
+ }
+
+ return (result);
+}
+
+isc_result_t
+dns_client_startresolve(dns_client_t *client, dns_name_t *name,
+ dns_rdataclass_t rdclass, dns_rdatatype_t type,
+ unsigned int options, isc_task_t *task,
+ isc_taskaction_t action, void *arg,
+ dns_clientrestrans_t **transp)
+{
+ dns_view_t *view = NULL;
+ dns_clientresevent_t *event = NULL;
+ resctx_t *rctx = NULL;
+ isc_task_t *clone = NULL;
+ isc_mem_t *mctx;
+ isc_result_t result;
+ dns_rdataset_t *rdataset, *sigrdataset;
+ isc_boolean_t want_dnssec;
+
+ REQUIRE(DNS_CLIENT_VALID(client));
+ REQUIRE(transp != NULL && *transp == NULL);
+
+ LOCK(&client->lock);
+ result = dns_viewlist_find(&client->viewlist, DNS_CLIENTVIEW_NAME,
+ rdclass, &view);
+ UNLOCK(&client->lock);
+ if (result != ISC_R_SUCCESS)
+ return (result);
+
+ mctx = client->mctx;
+ rdataset = NULL;
+ sigrdataset = NULL;
+ want_dnssec = ISC_TF((options & DNS_CLIENTRESOPT_NODNSSEC) == 0);
+
+ /*
+ * Prepare some intermediate resources
+ */
+ clone = NULL;
+ isc_task_attach(task, &clone);
+ event = (dns_clientresevent_t *)
+ isc_event_allocate(mctx, clone, DNS_EVENT_CLIENTRESDONE,
+ action, arg, sizeof(*event));
+ if (event == NULL) {
+ result = ISC_R_NOMEMORY;
+ goto cleanup;
+ }
+ event->result = DNS_R_SERVFAIL;
+ ISC_LIST_INIT(event->answerlist);
+
+ rctx = isc_mem_get(mctx, sizeof(*rctx));
+ if (rctx == NULL)
+ result = ISC_R_NOMEMORY;
+ else {
+ result = isc_mutex_init(&rctx->lock);
+ if (result != ISC_R_SUCCESS) {
+ isc_mem_put(mctx, rctx, sizeof(*rctx));
+ rctx = NULL;
+ }
+ }
+ if (result != ISC_R_SUCCESS)
+ goto cleanup;
+
+ result = getrdataset(mctx, &rdataset);
+ if (result != ISC_R_SUCCESS)
+ goto cleanup;
+ rctx->rdataset = rdataset;
+
+ if (want_dnssec) {
+ result = getrdataset(mctx, &sigrdataset);
+ if (result != ISC_R_SUCCESS)
+ goto cleanup;
+ }
+ rctx->sigrdataset = sigrdataset;
+
+ dns_fixedname_init(&rctx->name);
+ result = dns_name_copy(name, dns_fixedname_name(&rctx->name), NULL);
+ if (result != ISC_R_SUCCESS)
+ goto cleanup;
+
+ rctx->client = client;
+ ISC_LINK_INIT(rctx, link);
+ rctx->canceled = ISC_FALSE;
+ rctx->task = client->task;
+ rctx->type = type;
+ rctx->view = view;
+ rctx->restarts = 0;
+ rctx->fetch = NULL;
+ rctx->want_dnssec = want_dnssec;
+ ISC_LIST_INIT(rctx->namelist);
+ rctx->event = event;
+
+ rctx->magic = RCTX_MAGIC;
+
+ LOCK(&client->lock);
+ ISC_LIST_APPEND(client->resctxs, rctx, link);
+ UNLOCK(&client->lock);
+
+ client_resfind(rctx, NULL);
+
+ *transp = (dns_clientrestrans_t *)rctx;
+
+ return (ISC_R_SUCCESS);
+
+ cleanup:
+ if (rdataset != NULL)
+ putrdataset(client->mctx, &rdataset);
+ if (sigrdataset != NULL)
+ putrdataset(client->mctx, &sigrdataset);
+ if (rctx != NULL) {
+ DESTROYLOCK(&rctx->lock);
+ isc_mem_put(mctx, rctx, sizeof(*rctx));
+ }
+ if (event != NULL)
+ isc_event_free(ISC_EVENT_PTR(&event));
+ isc_task_detach(&clone);
+ dns_view_detach(&view);
+
+ return (result);
+}
+
+void
+dns_client_cancelresolve(dns_clientrestrans_t *trans) {
+ resctx_t *rctx;
+
+ REQUIRE(trans != NULL);
+ rctx = (resctx_t *)trans;
+ REQUIRE(RCTX_VALID(rctx));
+
+ LOCK(&rctx->lock);
+
+ if (!rctx->canceled) {
+ rctx->canceled = ISC_TRUE;
+ if (rctx->fetch != NULL)
+ dns_resolver_cancelfetch(rctx->fetch);
+ }
+
+ UNLOCK(&rctx->lock);
+}
+
+void
+dns_client_freeresanswer(dns_client_t *client, dns_namelist_t *namelist) {
+ dns_name_t *name;
+ dns_rdataset_t *rdataset;
+
+ REQUIRE(DNS_CLIENT_VALID(client));
+ REQUIRE(namelist != NULL);
+
+ while ((name = ISC_LIST_HEAD(*namelist)) != NULL) {
+ ISC_LIST_UNLINK(*namelist, name, link);
+ while ((rdataset = ISC_LIST_HEAD(name->list)) != NULL) {
+ ISC_LIST_UNLINK(name->list, rdataset, link);
+ putrdataset(client->mctx, &rdataset);
+ }
+ dns_name_free(name, client->mctx);
+ isc_mem_put(client->mctx, name, sizeof(*name));
+ }
+}
+
+void
+dns_client_destroyrestrans(dns_clientrestrans_t **transp) {
+ resctx_t *rctx;
+ isc_mem_t *mctx;
+ dns_client_t *client;
+ isc_boolean_t need_destroyclient = ISC_FALSE;
+
+ REQUIRE(transp != NULL);
+ rctx = (resctx_t *)*transp;
+ REQUIRE(RCTX_VALID(rctx));
+ REQUIRE(rctx->fetch == NULL);
+ REQUIRE(rctx->event == NULL);
+ client = rctx->client;
+ REQUIRE(DNS_CLIENT_VALID(client));
+
+ mctx = client->mctx;
+ dns_view_detach(&rctx->view);
+
+ LOCK(&client->lock);
+
+ INSIST(ISC_LINK_LINKED(rctx, link));
+ ISC_LIST_UNLINK(client->resctxs, rctx, link);
+
+ if (client->references == 0 && ISC_LIST_EMPTY(client->resctxs) &&
+ ISC_LIST_EMPTY(client->reqctxs) &&
+ ISC_LIST_EMPTY(client->updatectxs))
+ need_destroyclient = ISC_TRUE;
+
+ UNLOCK(&client->lock);
+
+ INSIST(ISC_LIST_EMPTY(rctx->namelist));
+
+ DESTROYLOCK(&rctx->lock);
+ rctx->magic = 0;
+
+ isc_mem_put(mctx, rctx, sizeof(*rctx));
+
+ if (need_destroyclient)
+ destroyclient(&client);
+
+ *transp = NULL;
+}
+
+isc_result_t
+dns_client_addtrustedkey(dns_client_t *client, dns_rdataclass_t rdclass,
+ dns_name_t *keyname, isc_buffer_t *keydatabuf)
+{
+ isc_result_t result;
+ dns_view_t *view = NULL;
+ dst_key_t *dstkey = NULL;
+ dns_keytable_t *secroots = NULL;
+
+ REQUIRE(DNS_CLIENT_VALID(client));
+
+ LOCK(&client->lock);
+ result = dns_viewlist_find(&client->viewlist, DNS_CLIENTVIEW_NAME,
+ rdclass, &view);
+ UNLOCK(&client->lock);
+ if (result != ISC_R_SUCCESS)
+ goto cleanup;
+
+ result = dns_view_getsecroots(view, &secroots);
+ if (result != ISC_R_SUCCESS)
+ goto cleanup;
+
+ result = dst_key_fromdns(keyname, rdclass, keydatabuf, client->mctx,
+ &dstkey);
+ if (result != ISC_R_SUCCESS)
+ goto cleanup;
+
+ result = dns_keytable_add(secroots, ISC_FALSE, &dstkey);
+
+ cleanup:
+ if (dstkey != NULL)
+ dst_key_free(&dstkey);
+ if (view != NULL)
+ dns_view_detach(&view);
+ if (secroots != NULL)
+ dns_keytable_detach(&secroots);
+ return (result);
+}
+
+/*%
+ * Simple request routines
+ */
+static void
+request_done(isc_task_t *task, isc_event_t *event) {
+ dns_requestevent_t *reqev = NULL;
+ dns_request_t *request;
+ isc_result_t result, eresult;
+ reqctx_t *ctx;
+
+ UNUSED(task);
+
+ REQUIRE(event->ev_type == DNS_EVENT_REQUESTDONE);
+ reqev = (dns_requestevent_t *)event;
+ request = reqev->request;
+ result = eresult = reqev->result;
+ ctx = reqev->ev_arg;
+ REQUIRE(REQCTX_VALID(ctx));
+
+ isc_event_free(&event);
+
+ LOCK(&ctx->lock);
+
+ if (eresult == ISC_R_SUCCESS) {
+ result = dns_request_getresponse(request, ctx->event->rmessage,
+ ctx->parseoptions);
+ }
+
+ if (ctx->tsigkey != NULL)
+ dns_tsigkey_detach(&ctx->tsigkey);
+
+ if (ctx->canceled)
+ ctx->event->result = ISC_R_CANCELED;
+ else
+ ctx->event->result = result;
+ task = ctx->event->ev_sender;
+ ctx->event->ev_sender = ctx;
+ isc_task_sendanddetach(&task, ISC_EVENT_PTR(&ctx->event));
+
+ UNLOCK(&ctx->lock);
+}
+
+static void
+localrequest_done(isc_task_t *task, isc_event_t *event) {
+ reqarg_t *reqarg = event->ev_arg;
+ dns_clientreqevent_t *rev =(dns_clientreqevent_t *)event;
+
+ UNUSED(task);
+
+ REQUIRE(event->ev_type == DNS_EVENT_CLIENTREQDONE);
+
+ LOCK(&reqarg->lock);
+
+ reqarg->result = rev->result;
+ dns_client_destroyreqtrans(&reqarg->trans);
+ isc_event_free(&event);
+
+ if (!reqarg->canceled) {
+ UNLOCK(&reqarg->lock);
+
+ /* Exit from the internal event loop */
+ isc_app_ctxsuspend(reqarg->actx);
+ } else {
+ /*
+ * We have already exited from the loop (due to some
+ * unexpected event). Just clean the arg up.
+ */
+ UNLOCK(&reqarg->lock);
+ DESTROYLOCK(&reqarg->lock);
+ isc_mem_put(reqarg->client->mctx, reqarg, sizeof(*reqarg));
+ }
+}
+
+isc_result_t
+dns_client_request(dns_client_t *client, dns_message_t *qmessage,
+ dns_message_t *rmessage, isc_sockaddr_t *server,
+ unsigned int options, unsigned int parseoptions,
+ dns_tsec_t *tsec, unsigned int timeout,
+ unsigned int udptimeout, unsigned int udpretries)
+{
+ isc_appctx_t *actx;
+ reqarg_t *reqarg;
+ isc_result_t result;
+
+ REQUIRE(DNS_CLIENT_VALID(client));
+ REQUIRE(qmessage != NULL);
+ REQUIRE(rmessage != NULL);
+
+ if ((client->attributes & DNS_CLIENTATTR_OWNCTX) == 0 &&
+ (options & DNS_CLIENTREQOPT_ALLOWRUN) == 0) {
+ /*
+ * If the client is run under application's control, we need
+ * to create a new running (sub)environment for this
+ * particular resolution.
+ */
+ return (ISC_R_NOTIMPLEMENTED); /* XXXTBD */
+ } else
+ actx = client->actx;
+
+ reqarg = isc_mem_get(client->mctx, sizeof(*reqarg));
+ if (reqarg == NULL)
+ return (ISC_R_NOMEMORY);
+
+ result = isc_mutex_init(&reqarg->lock);
+ if (result != ISC_R_SUCCESS) {
+ isc_mem_put(client->mctx, reqarg, sizeof(*reqarg));
+ return (result);
+ }
+
+ reqarg->actx = actx;
+ reqarg->client = client;
+ reqarg->trans = NULL;
+ reqarg->canceled = ISC_FALSE;
+
+ result = dns_client_startrequest(client, qmessage, rmessage, server,
+ options, parseoptions, tsec, timeout,
+ udptimeout, udpretries,
+ client->task, localrequest_done,
+ reqarg, &reqarg->trans);
+ if (result != ISC_R_SUCCESS) {
+ DESTROYLOCK(&reqarg->lock);
+ isc_mem_put(client->mctx, reqarg, sizeof(*reqarg));
+ return (result);
+ }
+
+ /*
+ * Start internal event loop. It blocks until the entire process
+ * is completed.
+ */
+ result = isc_app_ctxrun(actx);
+
+ LOCK(&reqarg->lock);
+ if (result == ISC_R_SUCCESS || result == ISC_R_SUSPEND)
+ result = reqarg->result;
+ if (reqarg->trans != NULL) {
+ /*
+ * Unusual termination (perhaps due to signal). We need some
+ * tricky cleanup process.
+ */
+ reqarg->canceled = ISC_TRUE;
+ dns_client_cancelresolve(reqarg->trans);
+
+ UNLOCK(&reqarg->lock);
+
+ /* reqarg will be freed in the event handler. */
+ } else {
+ UNLOCK(&reqarg->lock);
+
+ DESTROYLOCK(&reqarg->lock);
+ isc_mem_put(client->mctx, reqarg, sizeof(*reqarg));
+ }
+
+ return (result);
+}
+
+isc_result_t
+dns_client_startrequest(dns_client_t *client, dns_message_t *qmessage,
+ dns_message_t *rmessage, isc_sockaddr_t *server,
+ unsigned int options, unsigned int parseoptions,
+ dns_tsec_t *tsec, unsigned int timeout,
+ unsigned int udptimeout, unsigned int udpretries,
+ isc_task_t *task, isc_taskaction_t action, void *arg,
+ dns_clientreqtrans_t **transp)
+{
+ isc_result_t result;
+ dns_view_t *view = NULL;
+ isc_task_t *clone = NULL;
+ dns_clientreqevent_t *event = NULL;
+ reqctx_t *ctx = NULL;
+ dns_tsectype_t tsectype = dns_tsectype_none;
+
+ UNUSED(options);
+
+ REQUIRE(DNS_CLIENT_VALID(client));
+ REQUIRE(qmessage != NULL);
+ REQUIRE(rmessage != NULL);
+ REQUIRE(transp != NULL && *transp == NULL);
+
+ if (tsec != NULL) {
+ tsectype = dns_tsec_gettype(tsec);
+ if (tsectype != dns_tsectype_tsig)
+ return (ISC_R_NOTIMPLEMENTED); /* XXX */
+ }
+
+ LOCK(&client->lock);
+ result = dns_viewlist_find(&client->viewlist, DNS_CLIENTVIEW_NAME,
+ qmessage->rdclass, &view);
+ UNLOCK(&client->lock);
+ if (result != ISC_R_SUCCESS)
+ return (result);
+
+ clone = NULL;
+ isc_task_attach(task, &clone);
+ event = (dns_clientreqevent_t *)
+ isc_event_allocate(client->mctx, clone,
+ DNS_EVENT_CLIENTREQDONE,
+ action, arg, sizeof(*event));
+ if (event == NULL) {
+ result = ISC_R_NOMEMORY;
+ goto cleanup;
+ }
+
+ ctx = isc_mem_get(client->mctx, sizeof(*ctx));
+ if (ctx == NULL)
+ result = ISC_R_NOMEMORY;
+ else {
+ result = isc_mutex_init(&ctx->lock);
+ if (result != ISC_R_SUCCESS) {
+ isc_mem_put(client->mctx, ctx, sizeof(*ctx));
+ ctx = NULL;
+ }
+ }
+ if (result != ISC_R_SUCCESS)
+ goto cleanup;
+
+ ctx->client = client;
+ ISC_LINK_INIT(ctx, link);
+ ctx->parseoptions = parseoptions;
+ ctx->canceled = ISC_FALSE;
+ ctx->event = event;
+ ctx->event->rmessage = rmessage;
+ ctx->tsigkey = NULL;
+ if (tsec != NULL)
+ dns_tsec_getkey(tsec, &ctx->tsigkey);
+
+ ctx->magic = REQCTX_MAGIC;
+
+ LOCK(&client->lock);
+ ISC_LIST_APPEND(client->reqctxs, ctx, link);
+ UNLOCK(&client->lock);
+
+ ctx->request = NULL;
+ result = dns_request_createvia3(view->requestmgr, qmessage, NULL,
+ server, options, ctx->tsigkey,
+ timeout, udptimeout, udpretries,
+ client->task, request_done, ctx,
+ &ctx->request);
+ if (result == ISC_R_SUCCESS) {
+ dns_view_detach(&view);
+ *transp = (dns_clientreqtrans_t *)ctx;
+ return (ISC_R_SUCCESS);
+ }
+
+ cleanup:
+ if (ctx != NULL) {
+ LOCK(&client->lock);
+ ISC_LIST_UNLINK(client->reqctxs, ctx, link);
+ UNLOCK(&client->lock);
+ DESTROYLOCK(&ctx->lock);
+ isc_mem_put(client->mctx, ctx, sizeof(*ctx));
+ }
+ if (event != NULL)
+ isc_event_free(ISC_EVENT_PTR(&event));
+ isc_task_detach(&clone);
+ dns_view_detach(&view);
+
+ return (result);
+}
+
+void
+dns_client_cancelrequest(dns_clientreqtrans_t *trans) {
+ reqctx_t *ctx;
+
+ REQUIRE(trans != NULL);
+ ctx = (reqctx_t *)trans;
+ REQUIRE(REQCTX_VALID(ctx));
+
+ LOCK(&ctx->lock);
+
+ if (!ctx->canceled) {
+ ctx->canceled = ISC_TRUE;
+ if (ctx->request != NULL)
+ dns_request_cancel(ctx->request);
+ }
+
+ UNLOCK(&ctx->lock);
+}
+
+void
+dns_client_destroyreqtrans(dns_clientreqtrans_t **transp) {
+ reqctx_t *ctx;
+ isc_mem_t *mctx;
+ dns_client_t *client;
+ isc_boolean_t need_destroyclient = ISC_FALSE;
+
+ REQUIRE(transp != NULL);
+ ctx = (reqctx_t *)*transp;
+ REQUIRE(REQCTX_VALID(ctx));
+ client = ctx->client;
+ REQUIRE(DNS_CLIENT_VALID(client));
+ REQUIRE(ctx->event == NULL);
+ REQUIRE(ctx->request != NULL);
+
+ dns_request_destroy(&ctx->request);
+ mctx = client->mctx;
+
+ LOCK(&client->lock);
+
+ INSIST(ISC_LINK_LINKED(ctx, link));
+ ISC_LIST_UNLINK(client->reqctxs, ctx, link);
+
+ if (client->references == 0 && ISC_LIST_EMPTY(client->resctxs) &&
+ ISC_LIST_EMPTY(client->reqctxs) &&
+ ISC_LIST_EMPTY(client->updatectxs)) {
+ need_destroyclient = ISC_TRUE;
+ }
+
+ UNLOCK(&client->lock);
+
+ DESTROYLOCK(&ctx->lock);
+ ctx->magic = 0;
+
+ isc_mem_put(mctx, ctx, sizeof(*ctx));
+
+ if (need_destroyclient)
+ destroyclient(&client);
+
+ *transp = NULL;
+}
+
+/*%
+ * Dynamic update routines
+ */
+static isc_result_t
+rcode2result(dns_rcode_t rcode) {
+ /* XXX: isn't there a similar function? */
+ switch (rcode) {
+ case dns_rcode_formerr:
+ return (DNS_R_FORMERR);
+ case dns_rcode_servfail:
+ return (DNS_R_SERVFAIL);
+ case dns_rcode_nxdomain:
+ return (DNS_R_NXDOMAIN);
+ case dns_rcode_notimp:
+ return (DNS_R_NOTIMP);
+ case dns_rcode_refused:
+ return (DNS_R_REFUSED);
+ case dns_rcode_yxdomain:
+ return (DNS_R_YXDOMAIN);
+ case dns_rcode_yxrrset:
+ return (DNS_R_YXRRSET);
+ case dns_rcode_nxrrset:
+ return (DNS_R_NXRRSET);
+ case dns_rcode_notauth:
+ return (DNS_R_NOTAUTH);
+ case dns_rcode_notzone:
+ return (DNS_R_NOTZONE);
+ case dns_rcode_badvers:
+ return (DNS_R_BADVERS);
+ }
+
+ return (ISC_R_FAILURE);
+}
+
+static void
+update_sendevent(updatectx_t *uctx, isc_result_t result) {
+ isc_task_t *task;
+
+ dns_message_destroy(&uctx->updatemsg);
+ if (uctx->tsigkey != NULL)
+ dns_tsigkey_detach(&uctx->tsigkey);
+ if (uctx->sig0key != NULL)
+ dst_key_free(&uctx->sig0key);
+
+ if (uctx->canceled)
+ uctx->event->result = ISC_R_CANCELED;
+ else
+ uctx->event->result = result;
+ uctx->event->state = uctx->state;
+ task = uctx->event->ev_sender;
+ uctx->event->ev_sender = uctx;
+ isc_task_sendanddetach(&task, ISC_EVENT_PTR(&uctx->event));
+}
+
+static void
+update_done(isc_task_t *task, isc_event_t *event) {
+ isc_result_t result;
+ dns_requestevent_t *reqev = NULL;
+ dns_request_t *request;
+ dns_message_t *answer = NULL;
+ updatectx_t *uctx = event->ev_arg;
+ dns_client_t *client;
+ unsigned int timeout;
+
+ UNUSED(task);
+
+ REQUIRE(event->ev_type == DNS_EVENT_REQUESTDONE);
+ reqev = (dns_requestevent_t *)event;
+ request = reqev->request;
+ REQUIRE(UCTX_VALID(uctx));
+ client = uctx->client;
+ REQUIRE(DNS_CLIENT_VALID(client));
+
+ result = reqev->result;
+ if (result != ISC_R_SUCCESS)
+ goto out;
+
+ result = dns_message_create(client->mctx, DNS_MESSAGE_INTENTPARSE,
+ &answer);
+ if (result != ISC_R_SUCCESS)
+ goto out;
+ uctx->state = dns_clientupdatestate_done;
+ result = dns_request_getresponse(request, answer,
+ DNS_MESSAGEPARSE_PRESERVEORDER);
+ if (result == ISC_R_SUCCESS && answer->rcode != dns_rcode_noerror)
+ result = rcode2result(answer->rcode);
+
+ out:
+ if (answer != NULL)
+ dns_message_destroy(&answer);
+ isc_event_free(&event);
+
+ LOCK(&uctx->lock);
+ uctx->currentserver = ISC_LIST_NEXT(uctx->currentserver, link);
+ dns_request_destroy(&uctx->updatereq);
+ if (result != ISC_R_SUCCESS && !uctx->canceled &&
+ uctx->currentserver != NULL) {
+ dns_message_renderreset(uctx->updatemsg);
+ dns_message_settsigkey(uctx->updatemsg, NULL);
+
+ timeout = client->update_timeout / uctx->nservers;
+ if (timeout < MIN_UPDATE_TIMEOUT)
+ timeout = MIN_UPDATE_TIMEOUT;
+ result = dns_request_createvia3(uctx->view->requestmgr,
+ uctx->updatemsg,
+ NULL,
+ uctx->currentserver, 0,
+ uctx->tsigkey,
+ timeout,
+ client->update_udptimeout,
+ client->update_udpretries,
+ client->task,
+ update_done, uctx,
+ &uctx->updatereq);
+ UNLOCK(&uctx->lock);
+
+ if (result == ISC_R_SUCCESS) {
+ /* XXX: should we keep the 'done' state here? */
+ uctx->state = dns_clientupdatestate_sent;
+ return;
+ }
+ } else
+ UNLOCK(&uctx->lock);
+
+ update_sendevent(uctx, result);
+}
+
+static isc_result_t
+send_update(updatectx_t *uctx) {
+ isc_result_t result;
+ dns_name_t *name = NULL;
+ dns_rdataset_t *rdataset = NULL;
+ dns_client_t *client = uctx->client;
+ unsigned int timeout;
+
+ REQUIRE(uctx->zonename != NULL && uctx->currentserver != NULL);
+
+ result = dns_message_gettempname(uctx->updatemsg, &name);
+ if (result != ISC_R_SUCCESS)
+ return (result);
+ dns_name_init(name, NULL);
+ dns_name_clone(uctx->zonename, name);
+ result = dns_message_gettemprdataset(uctx->updatemsg, &rdataset);
+ if (result != ISC_R_SUCCESS) {
+ dns_message_puttempname(uctx->updatemsg, &name);
+ return (result);
+ }
+ dns_rdataset_makequestion(rdataset, uctx->rdclass, dns_rdatatype_soa);
+ ISC_LIST_INIT(name->list);
+ ISC_LIST_APPEND(name->list, rdataset, link);
+ dns_message_addname(uctx->updatemsg, name, DNS_SECTION_ZONE);
+ if (uctx->tsigkey == NULL && uctx->sig0key != NULL) {
+ result = dns_message_setsig0key(uctx->updatemsg,
+ uctx->sig0key);
+ if (result != ISC_R_SUCCESS)
+ return (result);
+ }
+ timeout = client->update_timeout / uctx->nservers;
+ if (timeout < MIN_UPDATE_TIMEOUT)
+ timeout = MIN_UPDATE_TIMEOUT;
+ result = dns_request_createvia3(uctx->view->requestmgr,
+ uctx->updatemsg,
+ NULL, uctx->currentserver, 0,
+ uctx->tsigkey, timeout,
+ client->update_udptimeout,
+ client->update_udpretries,
+ client->task, update_done, uctx,
+ &uctx->updatereq);
+ if (result == ISC_R_SUCCESS &&
+ uctx->state == dns_clientupdatestate_prepare) {
+ uctx->state = dns_clientupdatestate_sent;
+ }
+
+ return (result);
+}
+
+static void
+resolveaddr_done(isc_task_t *task, isc_event_t *event) {
+ isc_result_t result;
+ int family;
+ dns_rdatatype_t qtype;
+ dns_clientresevent_t *rev = (dns_clientresevent_t *)event;
+ dns_name_t *name;
+ dns_rdataset_t *rdataset;
+ updatectx_t *uctx;
+ isc_boolean_t completed = ISC_FALSE;
+
+ UNUSED(task);
+
+ REQUIRE(event->ev_arg != NULL);
+ uctx = *(updatectx_t **)event->ev_arg;
+ REQUIRE(UCTX_VALID(uctx));
+
+ if (event->ev_arg == &uctx->bp4) {
+ family = AF_INET;
+ qtype = dns_rdatatype_a;
+ LOCK(&uctx->lock);
+ dns_client_destroyrestrans(&uctx->restrans);
+ UNLOCK(&uctx->lock);
+ } else {
+ INSIST(event->ev_arg == &uctx->bp6);
+ family = AF_INET6;
+ qtype = dns_rdatatype_aaaa;
+ LOCK(&uctx->lock);
+ dns_client_destroyrestrans(&uctx->restrans2);
+ UNLOCK(&uctx->lock);
+ }
+
+ result = rev->result;
+ if (result != ISC_R_SUCCESS)
+ goto done;
+
+ for (name = ISC_LIST_HEAD(rev->answerlist); name != NULL;
+ name = ISC_LIST_NEXT(name, link)) {
+ for (rdataset = ISC_LIST_HEAD(name->list);
+ rdataset != NULL;
+ rdataset = ISC_LIST_NEXT(rdataset, link)) {
+ if (!dns_rdataset_isassociated(rdataset))
+ continue;
+ if (rdataset->type != qtype)
+ continue;
+
+ for (result = dns_rdataset_first(rdataset);
+ result == ISC_R_SUCCESS;
+ result = dns_rdataset_next(rdataset)) {
+ dns_rdata_t rdata;
+ dns_rdata_in_a_t rdata_a;
+ dns_rdata_in_aaaa_t rdata_aaaa;
+ isc_sockaddr_t *sa;
+
+ sa = isc_mem_get(uctx->client->mctx,
+ sizeof(*sa));
+ if (sa == NULL) {
+ /*
+ * If we fail to get a sockaddr,
+ we simply move forward with the
+ * addresses we've got so far.
+ */
+ goto done;
+ }
+
+ dns_rdata_init(&rdata);
+ switch (family) {
+ case AF_INET:
+ dns_rdataset_current(rdataset, &rdata);
+ dns_rdata_tostruct(&rdata, &rdata_a,
+ NULL);
+ isc_sockaddr_fromin(sa,
+ &rdata_a.in_addr,
+ 53);
+ dns_rdata_freestruct(&rdata_a);
+ break;
+ case AF_INET6:
+ dns_rdataset_current(rdataset, &rdata);
+ dns_rdata_tostruct(&rdata, &rdata_aaaa,
+ NULL);
+ isc_sockaddr_fromin6(sa,
+ &rdata_aaaa.in6_addr,
+ 53);
+ dns_rdata_freestruct(&rdata_aaaa);
+ break;
+ }
+
+ ISC_LINK_INIT(sa, link);
+ ISC_LIST_APPEND(uctx->servers, sa, link);
+ uctx->nservers++;
+ }
+ }
+ }
+
+ done:
+ dns_client_freeresanswer(uctx->client, &rev->answerlist);
+ isc_event_free(&event);
+
+ LOCK(&uctx->lock);
+ if (uctx->restrans == NULL && uctx->restrans2 == NULL)
+ completed = ISC_TRUE;
+ UNLOCK(&uctx->lock);
+
+ if (completed) {
+ INSIST(uctx->currentserver == NULL);
+ uctx->currentserver = ISC_LIST_HEAD(uctx->servers);
+ if (uctx->currentserver != NULL && !uctx->canceled)
+ send_update(uctx);
+ else {
+ if (result == ISC_R_SUCCESS)
+ result = ISC_R_NOTFOUND;
+ update_sendevent(uctx, result);
+ }
+ }
+}
+
+static isc_result_t
+process_soa(updatectx_t *uctx, dns_rdataset_t *soaset, dns_name_t *soaname) {
+ isc_result_t result;
+ dns_rdata_t soarr = DNS_RDATA_INIT;
+ dns_rdata_soa_t soa;
+ dns_name_t primary;
+
+ result = dns_rdataset_first(soaset);
+ if (result != ISC_R_SUCCESS)
+ return (result);
+ dns_rdata_init(&soarr);
+ dns_rdataset_current(soaset, &soarr);
+ result = dns_rdata_tostruct(&soarr, &soa, NULL);
+ if (result != ISC_R_SUCCESS)
+ return (result);
+
+ dns_name_init(&primary, NULL);
+ dns_name_clone(&soa.origin, &primary);
+
+ if (uctx->zonename == NULL) {
+ uctx->zonename = dns_fixedname_name(&uctx->zonefname);
+ result = dns_name_copy(soaname, uctx->zonename, NULL);
+ if (result != ISC_R_SUCCESS)
+ goto out;
+ }
+
+ if (uctx->currentserver != NULL)
+ result = send_update(uctx);
+ else {
+ /*
+ * Get addresses of the primary server. We don't use the ADB
+ * feature so that we could avoid caching data.
+ */
+ LOCK(&uctx->lock);
+ uctx->bp4 = uctx;
+ result = dns_client_startresolve(uctx->client, &primary,
+ uctx->rdclass,
+ dns_rdatatype_a,
+ 0, uctx->client->task,
+ resolveaddr_done, &uctx->bp4,
+ &uctx->restrans);
+ if (result == ISC_R_SUCCESS) {
+ uctx->bp6 = uctx;
+ result = dns_client_startresolve(uctx->client,
+ &primary,
+ uctx->rdclass,
+ dns_rdatatype_aaaa,
+ 0, uctx->client->task,
+ resolveaddr_done,
+ &uctx->bp6,
+ &uctx->restrans2);
+ }
+ UNLOCK(&uctx->lock);
+ }
+
+ out:
+ dns_rdata_freestruct(&soa);
+
+ return (result);
+}
+
+static void
+receive_soa(isc_task_t *task, isc_event_t *event) {
+ dns_requestevent_t *reqev = NULL;
+ updatectx_t *uctx;
+ dns_client_t *client;
+ isc_result_t result, eresult;
+ dns_request_t *request;
+ dns_message_t *rcvmsg = NULL;
+ dns_section_t section;
+ dns_rdataset_t *soaset = NULL;
+ int pass = 0;
+ dns_name_t *name;
+ dns_message_t *soaquery = NULL;
+ isc_sockaddr_t *addr;
+ isc_boolean_t seencname = ISC_FALSE;
+ isc_boolean_t droplabel = ISC_FALSE;
+ dns_name_t tname;
+ unsigned int nlabels;
+
+ UNUSED(task);
+
+ REQUIRE(event->ev_type == DNS_EVENT_REQUESTDONE);
+ reqev = (dns_requestevent_t *)event;
+ request = reqev->request;
+ result = eresult = reqev->result;
+ uctx = reqev->ev_arg;
+ client = uctx->client;
+ soaquery = uctx->soaquery;
+ addr = uctx->currentserver;
+ INSIST(addr != NULL);
+
+ isc_event_free(&event);
+
+ if (eresult != ISC_R_SUCCESS) {
+ result = eresult;
+ goto out;
+ }
+
+ result = dns_message_create(uctx->client->mctx,
+ DNS_MESSAGE_INTENTPARSE, &rcvmsg);
+ if (result != ISC_R_SUCCESS)
+ goto out;
+ result = dns_request_getresponse(request, rcvmsg,
+ DNS_MESSAGEPARSE_PRESERVEORDER);
+
+ if (result == DNS_R_TSIGERRORSET) {
+ dns_request_t *newrequest = NULL;
+
+ /* Retry SOA request without TSIG */
+ dns_message_destroy(&rcvmsg);
+ dns_message_renderreset(uctx->soaquery);
+ result = dns_request_createvia3(uctx->view->requestmgr,
+ uctx->soaquery, NULL, addr, 0,
+ NULL,
+ client->find_timeout * 20,
+ client->find_timeout, 3,
+ uctx->client->task,
+ receive_soa, uctx,
+ &newrequest);
+ if (result == ISC_R_SUCCESS) {
+ LOCK(&uctx->lock);
+ dns_request_destroy(&uctx->soareq);
+ uctx->soareq = newrequest;
+ UNLOCK(&uctx->lock);
+
+ return;
+ }
+ goto out;
+ }
+
+ section = DNS_SECTION_ANSWER;
+
+ if (rcvmsg->rcode != dns_rcode_noerror &&
+ rcvmsg->rcode != dns_rcode_nxdomain) {
+ result = rcode2result(rcvmsg->rcode);
+ goto out;
+ }
+
+ lookforsoa:
+ if (pass == 0)
+ section = DNS_SECTION_ANSWER;
+ else if (pass == 1)
+ section = DNS_SECTION_AUTHORITY;
+ else {
+ droplabel = ISC_TRUE;
+ goto out;
+ }
+
+ result = dns_message_firstname(rcvmsg, section);
+ if (result != ISC_R_SUCCESS) {
+ pass++;
+ goto lookforsoa;
+ }
+ while (result == ISC_R_SUCCESS) {
+ name = NULL;
+ dns_message_currentname(rcvmsg, section, &name);
+ soaset = NULL;
+ result = dns_message_findtype(name, dns_rdatatype_soa, 0,
+ &soaset);
+ if (result == ISC_R_SUCCESS)
+ break;
+ if (section == DNS_SECTION_ANSWER) {
+ dns_rdataset_t *tset = NULL;
+ if (dns_message_findtype(name, dns_rdatatype_cname, 0,
+ &tset) == ISC_R_SUCCESS
+ ||
+ dns_message_findtype(name, dns_rdatatype_dname, 0,
+ &tset) == ISC_R_SUCCESS
+ )
+ {
+ seencname = ISC_TRUE;
+ break;
+ }
+ }
+
+ result = dns_message_nextname(rcvmsg, section);
+ }
+
+ if (soaset == NULL && !seencname) {
+ pass++;
+ goto lookforsoa;
+ }
+
+ if (seencname) {
+ droplabel = ISC_TRUE;
+ goto out;
+ }
+
+ result = process_soa(uctx, soaset, name);
+
+ out:
+ if (droplabel) {
+ result = dns_message_firstname(soaquery, DNS_SECTION_QUESTION);
+ INSIST(result == ISC_R_SUCCESS);
+ name = NULL;
+ dns_message_currentname(soaquery, DNS_SECTION_QUESTION, &name);
+ nlabels = dns_name_countlabels(name);
+ if (nlabels == 1)
+ result = DNS_R_SERVFAIL; /* is there a better error? */
+ else {
+ dns_name_init(&tname, NULL);
+ dns_name_getlabelsequence(name, 1, nlabels - 1,
+ &tname);
+ dns_name_clone(&tname, name);
+ dns_request_destroy(&request);
+ LOCK(&uctx->lock);
+ uctx->soareq = NULL;
+ UNLOCK(&uctx->lock);
+ dns_message_renderreset(soaquery);
+ dns_message_settsigkey(soaquery, NULL);
+ result = dns_request_createvia3(uctx->view->requestmgr,
+ soaquery, NULL,
+ uctx->currentserver, 0,
+ uctx->tsigkey,
+ client->find_timeout *
+ 20,
+ client->find_timeout,
+ 3, client->task,
+ receive_soa, uctx,
+ &uctx->soareq);
+ }
+ }
+
+ if (!droplabel || result != ISC_R_SUCCESS) {
+ dns_message_destroy(&uctx->soaquery);
+ LOCK(&uctx->lock);
+ dns_request_destroy(&uctx->soareq);
+ UNLOCK(&uctx->lock);
+ }
+
+ if (rcvmsg != NULL)
+ dns_message_destroy(&rcvmsg);
+
+ if (result != ISC_R_SUCCESS)
+ update_sendevent(uctx, result);
+}
+
+static isc_result_t
+request_soa(updatectx_t *uctx) {
+ isc_result_t result;
+ dns_message_t *soaquery = uctx->soaquery;
+ dns_name_t *name = NULL;
+ dns_rdataset_t *rdataset = NULL;
+
+ if (soaquery == NULL) {
+ result = dns_message_create(uctx->client->mctx,
+ DNS_MESSAGE_INTENTRENDER,
+ &soaquery);
+ if (result != ISC_R_SUCCESS)
+ return (result);
+ }
+ soaquery->flags |= DNS_MESSAGEFLAG_RD;
+ result = dns_message_gettempname(soaquery, &name);
+ if (result != ISC_R_SUCCESS)
+ goto fail;
+ result = dns_message_gettemprdataset(soaquery, &rdataset);
+ if (result != ISC_R_SUCCESS)
+ goto fail;
+ dns_rdataset_makequestion(rdataset, uctx->rdclass, dns_rdatatype_soa);
+ dns_name_clone(uctx->firstname, name);
+ ISC_LIST_APPEND(name->list, rdataset, link);
+ dns_message_addname(soaquery, name, DNS_SECTION_QUESTION);
+ rdataset = NULL;
+ name = NULL;
+
+ result = dns_request_createvia3(uctx->view->requestmgr,
+ soaquery, NULL, uctx->currentserver, 0,
+ uctx->tsigkey,
+ uctx->client->find_timeout * 20,
+ uctx->client->find_timeout, 3,
+ uctx->client->task, receive_soa, uctx,
+ &uctx->soareq);
+ if (result == ISC_R_SUCCESS) {
+ uctx->soaquery = soaquery;
+ return (ISC_R_SUCCESS);
+ }
+
+ fail:
+ if (rdataset != NULL) {
+ ISC_LIST_UNLINK(name->list, rdataset, link); /* for safety */
+ dns_message_puttemprdataset(soaquery, &rdataset);
+ }
+ if (name != NULL)
+ dns_message_puttempname(soaquery, &name);
+ dns_message_destroy(&soaquery);
+
+ return (result);
+}
+
+static void
+resolvesoa_done(isc_task_t *task, isc_event_t *event) {
+ dns_clientresevent_t *rev = (dns_clientresevent_t *)event;
+ updatectx_t *uctx;
+ dns_name_t *name, tname;
+ dns_rdataset_t *rdataset = NULL;
+ isc_result_t result = rev->result;
+ unsigned int nlabels;
+
+ UNUSED(task);
+
+ uctx = event->ev_arg;
+ REQUIRE(UCTX_VALID(uctx));
+
+ LOCK(&uctx->lock);
+ dns_client_destroyrestrans(&uctx->restrans);
+ UNLOCK(&uctx->lock);
+
+ uctx = event->ev_arg;
+ if (result != ISC_R_SUCCESS &&
+ result != DNS_R_NCACHENXDOMAIN &&
+ result != DNS_R_NCACHENXRRSET) {
+ /* XXX: what about DNSSEC failure? */
+ goto out;
+ }
+
+ for (name = ISC_LIST_HEAD(rev->answerlist); name != NULL;
+ name = ISC_LIST_NEXT(name, link)) {
+ for (rdataset = ISC_LIST_HEAD(name->list);
+ rdataset != NULL;
+ rdataset = ISC_LIST_NEXT(rdataset, link)) {
+ if (dns_rdataset_isassociated(rdataset) &&
+ rdataset->type == dns_rdatatype_soa)
+ break;
+ }
+ }
+
+ if (rdataset == NULL) {
+ /* Drop one label and retry resolution. */
+ nlabels = dns_name_countlabels(&uctx->soaqname);
+ if (nlabels == 1) {
+ result = DNS_R_SERVFAIL; /* is there a better error? */
+ goto out;
+ }
+ dns_name_init(&tname, NULL);
+ dns_name_getlabelsequence(&uctx->soaqname, 1, nlabels - 1,
+ &tname);
+ dns_name_clone(&tname, &uctx->soaqname);
+
+ result = dns_client_startresolve(uctx->client, &uctx->soaqname,
+ uctx->rdclass,
+ dns_rdatatype_soa, 0,
+ uctx->client->task,
+ resolvesoa_done, uctx,
+ &uctx->restrans);
+ } else
+ result = process_soa(uctx, rdataset, &uctx->soaqname);
+
+ out:
+ dns_client_freeresanswer(uctx->client, &rev->answerlist);
+ isc_event_free(&event);
+
+ if (result != ISC_R_SUCCESS)
+ update_sendevent(uctx, result);
+}
+
+static isc_result_t
+copy_name(isc_mem_t *mctx, dns_message_t *msg, dns_name_t *name,
+ dns_name_t **newnamep)
+{
+ isc_result_t result;
+ dns_name_t *newname = NULL;
+ isc_region_t r;
+ isc_buffer_t *namebuf = NULL, *rdatabuf = NULL;
+ dns_rdatalist_t *rdatalist;
+ dns_rdataset_t *rdataset, *newrdataset;
+ dns_rdata_t rdata = DNS_RDATA_INIT, *newrdata;
+
+ result = dns_message_gettempname(msg, &newname);
+ if (result != ISC_R_SUCCESS)
+ return (result);
+ result = isc_buffer_allocate(mctx, &namebuf, DNS_NAME_MAXWIRE);
+ if (result != ISC_R_SUCCESS)
+ goto fail;
+ dns_name_init(newname, NULL);
+ dns_name_setbuffer(newname, namebuf);
+ dns_message_takebuffer(msg, &namebuf);
+ result = dns_name_copy(name, newname, NULL);
+ if (result != ISC_R_SUCCESS)
+ goto fail;
+
+ for (rdataset = ISC_LIST_HEAD(name->list); rdataset != NULL;
+ rdataset = ISC_LIST_NEXT(rdataset, link)) {
+ rdatalist = NULL;
+ result = dns_message_gettemprdatalist(msg, &rdatalist);
+ if (result != ISC_R_SUCCESS)
+ goto fail;
+ dns_rdatalist_init(rdatalist);
+ rdatalist->type = rdataset->type;
+ rdatalist->rdclass = rdataset->rdclass;
+ rdatalist->covers = rdataset->covers;
+ rdatalist->ttl = rdataset->ttl;
+
+ result = dns_rdataset_first(rdataset);
+ while (result == ISC_R_SUCCESS) {
+ dns_rdata_reset(&rdata);
+ dns_rdataset_current(rdataset, &rdata);
+
+ newrdata = NULL;
+ result = dns_message_gettemprdata(msg, &newrdata);
+ if (result != ISC_R_SUCCESS)
+ goto fail;
+ dns_rdata_toregion(&rdata, &r);
+ rdatabuf = NULL;
+ result = isc_buffer_allocate(mctx, &rdatabuf,
+ r.length);
+ if (result != ISC_R_SUCCESS)
+ goto fail;
+ isc_buffer_putmem(rdatabuf, r.base, r.length);
+ isc_buffer_usedregion(rdatabuf, &r);
+ dns_rdata_init(newrdata);
+ dns_rdata_fromregion(newrdata, rdata.rdclass,
+ rdata.type, &r);
+ newrdata->flags = rdata.flags;
+
+ ISC_LIST_APPEND(rdatalist->rdata, newrdata, link);
+ dns_message_takebuffer(msg, &rdatabuf);
+
+ result = dns_rdataset_next(rdataset);
+ }
+
+ newrdataset = NULL;
+ result = dns_message_gettemprdataset(msg, &newrdataset);
+ if (result != ISC_R_SUCCESS)
+ goto fail;
+ dns_rdataset_init(newrdataset);
+ dns_rdatalist_tordataset(rdatalist, newrdataset);
+
+ ISC_LIST_APPEND(newname->list, newrdataset, link);
+ }
+
+ *newnamep = newname;
+
+ return (ISC_R_SUCCESS);
+
+ fail:
+ dns_message_puttempname(msg, &newname);
+
+ return (result);
+
+}
+
+static void
+internal_update_callback(isc_task_t *task, isc_event_t *event) {
+ updatearg_t *uarg = event->ev_arg;
+ dns_clientupdateevent_t *uev = (dns_clientupdateevent_t *)event;
+
+ UNUSED(task);
+
+ LOCK(&uarg->lock);
+
+ uarg->result = uev->result;
+
+ dns_client_destroyupdatetrans(&uarg->trans);
+ isc_event_free(&event);
+
+ if (!uarg->canceled) {
+ UNLOCK(&uarg->lock);
+
+ /* Exit from the internal event loop */
+ isc_app_ctxsuspend(uarg->actx);
+ } else {
+ /*
+ * We have already exited from the loop (due to some
+ * unexpected event). Just clean the arg up.
+ */
+ UNLOCK(&uarg->lock);
+ DESTROYLOCK(&uarg->lock);
+ isc_mem_put(uarg->client->mctx, uarg, sizeof(*uarg));
+ }
+}
+
+isc_result_t
+dns_client_update(dns_client_t *client, dns_rdataclass_t rdclass,
+ dns_name_t *zonename, dns_namelist_t *prerequisites,
+ dns_namelist_t *updates, isc_sockaddrlist_t *servers,
+ dns_tsec_t *tsec, unsigned int options)
+{
+ isc_result_t result;
+ isc_appctx_t *actx;
+ updatearg_t *uarg;
+
+ REQUIRE(DNS_CLIENT_VALID(client));
+
+ if ((client->attributes & DNS_CLIENTATTR_OWNCTX) == 0 &&
+ (options & DNS_CLIENTRESOPT_ALLOWRUN) == 0) {
+ /*
+ * If the client is run under application's control, we need
+ * to create a new running (sub)environment for this
+ * particular resolution.
+ */
+ return (ISC_R_NOTIMPLEMENTED); /* XXXTBD */
+ } else
+ actx = client->actx;
+
+ uarg = isc_mem_get(client->mctx, sizeof(*uarg));
+ if (uarg == NULL)
+ return (ISC_R_NOMEMORY);
+
+ result = isc_mutex_init(&uarg->lock);
+ if (result != ISC_R_SUCCESS) {
+ isc_mem_put(client->mctx, uarg, sizeof(*uarg));
+ return (result);
+ }
+
+ uarg->actx = actx;
+ uarg->client = client;
+ uarg->result = ISC_R_FAILURE;
+ uarg->trans = NULL;
+ uarg->canceled = ISC_FALSE;
+
+ result = dns_client_startupdate(client, rdclass, zonename,
+ prerequisites, updates, servers,
+ tsec, options, client->task,
+ internal_update_callback, uarg,
+ &uarg->trans);
+ if (result != ISC_R_SUCCESS) {
+ DESTROYLOCK(&uarg->lock);
+ isc_mem_put(client->mctx, uarg, sizeof(*uarg));
+ return (result);
+ }
+
+ /*
+ * Start internal event loop. It blocks until the entire process
+ * is completed.
+ */
+ result = isc_app_ctxrun(actx);
+
+ LOCK(&uarg->lock);
+ if (result == ISC_R_SUCCESS || result == ISC_R_SUSPEND)
+ result = uarg->result;
+
+ if (uarg->trans != NULL) {
+ /*
+ * Unusual termination (perhaps due to signal). We need some
+ * tricky cleanup process.
+ */
+ uarg->canceled = ISC_TRUE;
+ dns_client_cancelupdate(uarg->trans);
+
+ UNLOCK(&uarg->lock);
+
+ /* uarg will be freed in the event handler. */
+ } else {
+ UNLOCK(&uarg->lock);
+
+ DESTROYLOCK(&uarg->lock);
+ isc_mem_put(client->mctx, uarg, sizeof(*uarg));
+ }
+
+ return (result);
+}
+
+isc_result_t
+dns_client_startupdate(dns_client_t *client, dns_rdataclass_t rdclass,
+ dns_name_t *zonename, dns_namelist_t *prerequisites,
+ dns_namelist_t *updates, isc_sockaddrlist_t *servers,
+ dns_tsec_t *tsec, unsigned int options,
+ isc_task_t *task, isc_taskaction_t action, void *arg,
+ dns_clientupdatetrans_t **transp)
+{
+ dns_view_t *view = NULL;
+ isc_result_t result;
+ dns_name_t *name, *newname;
+ updatectx_t *uctx;
+ isc_task_t *clone = NULL;
+ dns_section_t section = DNS_SECTION_UPDATE;
+ isc_sockaddr_t *server, *sa = NULL;
+ dns_tsectype_t tsectype = dns_tsectype_none;
+
+ UNUSED(options);
+
+ REQUIRE(DNS_CLIENT_VALID(client));
+ REQUIRE(transp != NULL && *transp == NULL);
+ REQUIRE(updates != NULL);
+ REQUIRE(task != NULL);
+
+ if (tsec != NULL) {
+ tsectype = dns_tsec_gettype(tsec);
+ if (tsectype != dns_tsectype_tsig)
+ return (ISC_R_NOTIMPLEMENTED); /* XXX */
+ }
+
+ LOCK(&client->lock);
+ result = dns_viewlist_find(&client->viewlist, DNS_CLIENTVIEW_NAME,
+ rdclass, &view);
+ UNLOCK(&client->lock);
+ if (result != ISC_R_SUCCESS)
+ return (result);
+
+ /* Create a context and prepare some resources */
+ uctx = isc_mem_get(client->mctx, sizeof(*uctx));
+ if (uctx == NULL) {
+ dns_view_detach(&view);
+ return (ISC_R_NOMEMORY);
+ }
+ result = isc_mutex_init(&uctx->lock);
+ if (result != ISC_R_SUCCESS) {
+ dns_view_detach(&view);
+ isc_mem_put(client->mctx, uctx, sizeof(*uctx));
+ return (ISC_R_NOMEMORY);
+ }
+ clone = NULL;
+ isc_task_attach(task, &clone);
+ uctx->client = client;
+ ISC_LINK_INIT(uctx, link);
+ uctx->state = dns_clientupdatestate_prepare;
+ uctx->view = view;
+ uctx->rdclass = rdclass;
+ uctx->canceled = ISC_FALSE;
+ uctx->updatemsg = NULL;
+ uctx->soaquery = NULL;
+ uctx->updatereq = NULL;
+ uctx->restrans = NULL;
+ uctx->restrans2 = NULL;
+ uctx->bp4 = NULL;
+ uctx->bp6 = NULL;
+ uctx->soareq = NULL;
+ uctx->event = NULL;
+ uctx->tsigkey = NULL;
+ uctx->sig0key = NULL;
+ uctx->zonename = NULL;
+ dns_name_init(&uctx->soaqname, NULL);
+ ISC_LIST_INIT(uctx->servers);
+ uctx->nservers = 0;
+ uctx->currentserver = NULL;
+ dns_fixedname_init(&uctx->zonefname);
+ if (tsec != NULL)
+ dns_tsec_getkey(tsec, &uctx->tsigkey);
+ uctx->event = (dns_clientupdateevent_t *)
+ isc_event_allocate(client->mctx, clone, DNS_EVENT_UPDATEDONE,
+ action, arg, sizeof(*uctx->event));
+ if (uctx->event == NULL)
+ goto fail;
+ if (zonename != NULL) {
+ uctx->zonename = dns_fixedname_name(&uctx->zonefname);
+ result = dns_name_copy(zonename, uctx->zonename, NULL);
+ }
+ if (servers != NULL) {
+ for (server = ISC_LIST_HEAD(*servers);
+ server != NULL;
+ server = ISC_LIST_NEXT(server, link)) {
+ sa = isc_mem_get(client->mctx, sizeof(*sa));
+ if (sa == NULL)
+ goto fail;
+ sa->type = server->type;
+ sa->length = server->length;
+ ISC_LINK_INIT(sa, link);
+ ISC_LIST_APPEND(uctx->servers, sa, link);
+ if (uctx->currentserver == NULL)
+ uctx->currentserver = sa;
+ uctx->nservers++;
+ }
+ }
+
+ /* Make update message */
+ result = dns_message_create(client->mctx, DNS_MESSAGE_INTENTRENDER,
+ &uctx->updatemsg);
+ if (result != ISC_R_SUCCESS)
+ goto fail;
+ uctx->updatemsg->opcode = dns_opcode_update;
+
+ if (prerequisites != NULL) {
+ for (name = ISC_LIST_HEAD(*prerequisites); name != NULL;
+ name = ISC_LIST_NEXT(name, link)) {
+ newname = NULL;
+ result = copy_name(client->mctx, uctx->updatemsg,
+ name, &newname);
+ if (result != ISC_R_SUCCESS)
+ goto fail;
+ dns_message_addname(uctx->updatemsg, newname,
+ DNS_SECTION_PREREQUISITE);
+ }
+ }
+
+ for (name = ISC_LIST_HEAD(*updates); name != NULL;
+ name = ISC_LIST_NEXT(name, link)) {
+ newname = NULL;
+ result = copy_name(client->mctx, uctx->updatemsg, name,
+ &newname);
+ if (result != ISC_R_SUCCESS)
+ goto fail;
+ dns_message_addname(uctx->updatemsg, newname,
+ DNS_SECTION_UPDATE);
+ }
+
+ uctx->firstname = NULL;
+ result = dns_message_firstname(uctx->updatemsg, section);
+ if (result == ISC_R_NOMORE) {
+ section = DNS_SECTION_PREREQUISITE;
+ result = dns_message_firstname(uctx->updatemsg, section);
+ }
+ if (result != ISC_R_SUCCESS)
+ goto fail;
+ dns_message_currentname(uctx->updatemsg, section, &uctx->firstname);
+
+ uctx->magic = UCTX_MAGIC;
+
+ LOCK(&client->lock);
+ ISC_LIST_APPEND(client->updatectxs, uctx, link);
+ UNLOCK(&client->lock);
+
+ if (uctx->zonename != NULL && uctx->currentserver != NULL) {
+ result = send_update(uctx);
+ if (result != ISC_R_SUCCESS)
+ goto fail;
+ } else if (uctx->currentserver != NULL) {
+ result = request_soa(uctx);
+ if (result != ISC_R_SUCCESS)
+ goto fail;
+ } else {
+ dns_name_clone(uctx->firstname, &uctx->soaqname);
+ result = dns_client_startresolve(uctx->client, &uctx->soaqname,
+ uctx->rdclass,
+ dns_rdatatype_soa, 0,
+ client->task, resolvesoa_done,
+ uctx, &uctx->restrans);
+ if (result != ISC_R_SUCCESS)
+ goto fail;
+ }
+
+ *transp = (dns_clientupdatetrans_t *)uctx;
+
+ return (ISC_R_SUCCESS);
+
+ fail:
+ if (ISC_LINK_LINKED(uctx, link)) {
+ LOCK(&client->lock);
+ ISC_LIST_UNLINK(client->updatectxs, uctx, link);
+ UNLOCK(&client->lock);
+ }
+ if (uctx->updatemsg != NULL)
+ dns_message_destroy(&uctx->updatemsg);
+ while ((sa = ISC_LIST_HEAD(uctx->servers)) != NULL) {
+ ISC_LIST_UNLINK(uctx->servers, sa, link);
+ isc_mem_put(client->mctx, sa, sizeof(*sa));
+ }
+ if (uctx->event != NULL)
+ isc_event_free(ISC_EVENT_PTR(&uctx->event));
+ if (uctx->tsigkey != NULL)
+ dns_tsigkey_detach(&uctx->tsigkey);
+ isc_task_detach(&clone);
+ DESTROYLOCK(&uctx->lock);
+ uctx->magic = 0;
+ isc_mem_put(client->mctx, uctx, sizeof(*uctx));
+ dns_view_detach(&view);
+
+ return (result);
+}
+
+void
+dns_client_cancelupdate(dns_clientupdatetrans_t *trans) {
+ updatectx_t *uctx;
+
+ REQUIRE(trans != NULL);
+ uctx = (updatectx_t *)trans;
+ REQUIRE(UCTX_VALID(uctx));
+
+ LOCK(&uctx->lock);
+
+ if (!uctx->canceled) {
+ uctx->canceled = ISC_TRUE;
+ if (uctx->updatereq != NULL)
+ dns_request_cancel(uctx->updatereq);
+ if (uctx->soareq != NULL)
+ dns_request_cancel(uctx->soareq);
+ if (uctx->restrans != NULL)
+ dns_client_cancelresolve(uctx->restrans);
+ if (uctx->restrans2 != NULL)
+ dns_client_cancelresolve(uctx->restrans2);
+ }
+
+ UNLOCK(&uctx->lock);
+}
+
+void
+dns_client_destroyupdatetrans(dns_clientupdatetrans_t **transp) {
+ updatectx_t *uctx;
+ isc_mem_t *mctx;
+ dns_client_t *client;
+ isc_boolean_t need_destroyclient = ISC_FALSE;
+ isc_sockaddr_t *sa;
+
+ REQUIRE(transp != NULL);
+ uctx = (updatectx_t *)*transp;
+ REQUIRE(UCTX_VALID(uctx));
+ client = uctx->client;
+ REQUIRE(DNS_CLIENT_VALID(client));
+ REQUIRE(uctx->updatereq == NULL && uctx->updatemsg == NULL &&
+ uctx->soareq == NULL && uctx->soaquery == NULL &&
+ uctx->event == NULL && uctx->tsigkey == NULL &&
+ uctx->sig0key == NULL);
+
+ mctx = client->mctx;
+ dns_view_detach(&uctx->view);
+ while ((sa = ISC_LIST_HEAD(uctx->servers)) != NULL) {
+ ISC_LIST_UNLINK(uctx->servers, sa, link);
+ isc_mem_put(mctx, sa, sizeof(*sa));
+ }
+
+ LOCK(&client->lock);
+
+ INSIST(ISC_LINK_LINKED(uctx, link));
+ ISC_LIST_UNLINK(client->updatectxs, uctx, link);
+
+ if (client->references == 0 && ISC_LIST_EMPTY(client->resctxs) &&
+ ISC_LIST_EMPTY(client->reqctxs) &&
+ ISC_LIST_EMPTY(client->updatectxs))
+ need_destroyclient = ISC_TRUE;
+
+ UNLOCK(&client->lock);
+
+ DESTROYLOCK(&uctx->lock);
+ uctx->magic = 0;
+
+ isc_mem_put(mctx, uctx, sizeof(*uctx));
+
+ if (need_destroyclient)
+ destroyclient(&client);
+
+ *transp = NULL;
+}
+
+isc_mem_t *
+dns_client_mctx(dns_client_t *client) {
+
+ REQUIRE(DNS_CLIENT_VALID(client));
+ return (client->mctx);
+}
+
+typedef struct {
+ isc_buffer_t buffer;
+ dns_rdataset_t rdataset;
+ dns_rdatalist_t rdatalist;
+ dns_rdata_t rdata;
+ size_t size;
+ isc_mem_t * mctx;
+ unsigned char data[FLEXIBLE_ARRAY_MEMBER];
+} dns_client_updaterec_t;
+
+isc_result_t
+dns_client_updaterec(dns_client_updateop_t op, dns_name_t *owner,
+ dns_rdatatype_t type, dns_rdata_t *source,
+ dns_ttl_t ttl, dns_name_t *target,
+ dns_rdataset_t *rdataset, dns_rdatalist_t *rdatalist,
+ dns_rdata_t *rdata, isc_mem_t *mctx)
+{
+ dns_client_updaterec_t *updaterec = NULL;
+ size_t size = offsetof(dns_client_updaterec_t, data);
+
+ REQUIRE(op < updateop_max);
+ REQUIRE(owner != NULL);
+ REQUIRE((rdataset != NULL && rdatalist != NULL && rdata != NULL) ||
+ (rdataset == NULL && rdatalist == NULL && rdata == NULL &&
+ mctx != NULL));
+ if (op == updateop_add)
+ REQUIRE(source != NULL);
+ if (source != NULL) {
+ REQUIRE(source->type == type);
+ REQUIRE(op == updateop_add || op == updateop_delete ||
+ op == updateop_exist);
+ }
+
+ size += owner->length;
+ if (source != NULL)
+ size += source->length;
+
+ if (rdataset == NULL) {
+ updaterec = isc_mem_get(mctx, size);
+ if (updaterec == NULL)
+ return (ISC_R_NOMEMORY);
+ rdataset = &updaterec->rdataset;
+ rdatalist = &updaterec->rdatalist;
+ rdata = &updaterec->rdata;
+ dns_rdataset_init(rdataset);
+ dns_rdatalist_init(&updaterec->rdatalist);
+ dns_rdata_init(&updaterec->rdata);
+ isc_buffer_init(&updaterec->buffer, updaterec->data,
+ size - offsetof(dns_client_updaterec_t, data));
+ dns_name_copy(owner, target, &updaterec->buffer);
+ if (source != NULL) {
+ isc_region_t r;
+ dns_rdata_clone(source, rdata);
+ dns_rdata_toregion(rdata, &r);
+ rdata->data = isc_buffer_used(&updaterec->buffer);
+ isc_buffer_copyregion(&updaterec->buffer, &r);
+ }
+ updaterec->mctx = NULL;
+ isc_mem_attach(mctx, &updaterec->mctx);
+ } else if (source != NULL)
+ dns_rdata_clone(source, rdata);
+
+ switch (op) {
+ case updateop_add:
+ break;
+ case updateop_delete:
+ if (source != NULL) {
+ ttl = 0;
+ dns_rdata_makedelete(rdata);
+ } else
+ dns_rdata_deleterrset(rdata, type);
+ break;
+ case updateop_notexist:
+ dns_rdata_notexist(rdata, type);
+ break;
+ case updateop_exist:
+ if (source == NULL) {
+ ttl = 0;
+ dns_rdata_exists(rdata, type);
+ }
+ case updateop_none:
+ break;
+ default:
+ INSIST(0);
+ }
+
+ rdatalist->type = rdata->type;
+ rdatalist->rdclass = rdata->rdclass;
+ if (source != NULL) {
+ rdatalist->covers = dns_rdata_covers(rdata);
+ rdatalist->ttl = ttl;
+ }
+ ISC_LIST_APPEND(rdatalist->rdata, rdata, link);
+ dns_rdatalist_tordataset(rdatalist, rdataset);
+ ISC_LIST_APPEND(target->list, rdataset, link);
+ if (updaterec != NULL) {
+ target->attributes |= DNS_NAMEATTR_HASUPDATEREC;
+ dns_name_setbuffer(target, &updaterec->buffer);
+ }
+ if (op == updateop_add || op == updateop_delete)
+ target->attributes |= DNS_NAMEATTR_UPDATE;
+ else
+ target->attributes |= DNS_NAMEATTR_PREREQUISITE;
+ return (ISC_R_SUCCESS);
+}
+
+void
+dns_client_freeupdate(dns_name_t **namep) {
+ dns_client_updaterec_t *updaterec;
+ dns_rdatalist_t *rdatalist;
+ dns_rdataset_t *rdataset;
+ dns_rdata_t *rdata;
+ dns_name_t *name;
+
+ REQUIRE(namep != NULL && *namep != NULL);
+
+ name = *namep;
+ for (rdataset = ISC_LIST_HEAD(name->list);
+ rdataset != NULL;
+ rdataset = ISC_LIST_HEAD(name->list)) {
+ ISC_LIST_UNLINK(name->list, rdataset, link);
+ rdatalist = NULL;
+ dns_rdatalist_fromrdataset(rdataset, &rdatalist);
+ if (rdatalist == NULL) {
+ dns_rdataset_disassociate(rdataset);
+ continue;
+ }
+ for (rdata = ISC_LIST_HEAD(rdatalist->rdata);
+ rdata != NULL;
+ rdata = ISC_LIST_HEAD(rdatalist->rdata))
+ ISC_LIST_UNLINK(rdatalist->rdata, rdata, link);
+ dns_rdataset_disassociate(rdataset);
+ }
+
+ if ((name->attributes & DNS_NAMEATTR_HASUPDATEREC) != 0) {
+ updaterec = (dns_client_updaterec_t *)name->buffer;
+ INSIST(updaterec != NULL);
+ isc_mem_putanddetach(&updaterec->mctx, updaterec,
+ updaterec->size);
+ *namep = NULL;
+ }
+}
diff --git a/contrib/bind9/lib/dns/db.c b/contrib/bind9/lib/dns/db.c
index f52f674..c74d24d 100644
--- a/contrib/bind9/lib/dns/db.c
+++ b/contrib/bind9/lib/dns/db.c
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004, 2005, 2007-2009 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004, 2005, 2007-2009, 2011 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 1999-2001, 2003 Internet Software Consortium.
*
* Permission to use, copy, modify, and/or distribute this software for any
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: db.c,v 1.88.50.2 2009-06-23 00:19:34 tbox Exp $ */
+/* $Id: db.c,v 1.97 2011-01-13 04:59:25 tbox Exp $ */
/*! \file */
@@ -34,10 +34,12 @@
#include <dns/callbacks.h>
#include <dns/db.h>
+#include <dns/dbiterator.h>
#include <dns/log.h>
#include <dns/master.h>
#include <dns/rdata.h>
#include <dns/rdataset.h>
+#include <dns/rdatasetiter.h>
#include <dns/result.h>
/***
@@ -61,14 +63,18 @@ struct dns_dbimplementation {
*/
#include "rbtdb.h"
+#ifdef BIND9
#include "rbtdb64.h"
+#endif
static ISC_LIST(dns_dbimplementation_t) implementations;
static isc_rwlock_t implock;
static isc_once_t once = ISC_ONCE_INIT;
static dns_dbimplementation_t rbtimp;
+#ifdef BIND9
static dns_dbimplementation_t rbt64imp;
+#endif
static void
initialize(void) {
@@ -80,15 +86,19 @@ initialize(void) {
rbtimp.driverarg = NULL;
ISC_LINK_INIT(&rbtimp, link);
+#ifdef BIND9
rbt64imp.name = "rbt64";
rbt64imp.create = dns_rbtdb64_create;
rbt64imp.mctx = NULL;
rbt64imp.driverarg = NULL;
ISC_LINK_INIT(&rbt64imp, link);
+#endif
ISC_LIST_INIT(implementations);
ISC_LIST_APPEND(implementations, &rbtimp, link);
+#ifdef BIND9
ISC_LIST_APPEND(implementations, &rbt64imp, link);
+#endif
}
static inline dns_dbimplementation_t *
@@ -290,6 +300,7 @@ dns_db_class(dns_db_t *db) {
return (db->rdclass);
}
+#ifdef BIND9
isc_result_t
dns_db_beginload(dns_db_t *db, dns_addrdatasetfunc_t *addp,
dns_dbload_t **dbloadp) {
@@ -318,14 +329,19 @@ dns_db_endload(dns_db_t *db, dns_dbload_t **dbloadp) {
isc_result_t
dns_db_load(dns_db_t *db, const char *filename) {
- return (dns_db_load2(db, filename, dns_masterformat_text));
+ return (dns_db_load3(db, filename, dns_masterformat_text, 0));
}
isc_result_t
dns_db_load2(dns_db_t *db, const char *filename, dns_masterformat_t format) {
+ return (dns_db_load3(db, filename, format, 0));
+}
+
+isc_result_t
+dns_db_load3(dns_db_t *db, const char *filename, dns_masterformat_t format,
+ unsigned int options) {
isc_result_t result, eresult;
dns_rdatacallbacks_t callbacks;
- unsigned int options = 0;
/*
* Load master file 'filename' into 'db'.
@@ -376,6 +392,7 @@ dns_db_dump2(dns_db_t *db, dns_dbversion_t *version, const char *filename,
return ((db->methods->dump)(db, version, filename, masterformat));
}
+#endif /* BIND9 */
/***
*** Version Methods
@@ -921,8 +938,27 @@ dns_db_getsigningtime(dns_db_t *db, dns_rdataset_t *rdataset, dns_name_t *name)
}
void
-dns_db_resigned(dns_db_t *db, dns_rdataset_t *rdataset, dns_dbversion_t *version)
+dns_db_resigned(dns_db_t *db, dns_rdataset_t *rdataset,
+ dns_dbversion_t *version)
{
if (db->methods->resigned != NULL)
(db->methods->resigned)(db, rdataset, version);
}
+
+void
+dns_db_rpz_enabled(dns_db_t *db, dns_rpz_st_t *st)
+{
+ if (db->methods->rpz_enabled != NULL)
+ (db->methods->rpz_enabled)(db, st);
+}
+
+isc_result_t
+dns_db_rpz_findips(dns_rpz_zone_t *rpz, dns_rpz_type_t rpz_type,
+ dns_zone_t *zone, dns_db_t *db, dns_dbversion_t *version,
+ dns_rdataset_t *ardataset, dns_rpz_st_t *st)
+{
+ if (db->methods->rpz_findips == NULL)
+ return (ISC_R_NOTIMPLEMENTED);
+ return ((db->methods->rpz_findips)(rpz, rpz_type, zone, db, version,
+ ardataset, st));
+}
diff --git a/contrib/bind9/lib/dns/diff.c b/contrib/bind9/lib/dns/diff.c
index a92a496..3dbb5cf 100644
--- a/contrib/bind9/lib/dns/diff.c
+++ b/contrib/bind9/lib/dns/diff.c
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: diff.c,v 1.18.50.2 2009-01-05 23:47:22 tbox Exp $ */
+/* $Id: diff.c,v 1.23 2009-12-01 00:47:09 each Exp $ */
/*! \file */
@@ -387,10 +387,22 @@ diff_apply(dns_diff_t *diff, dns_db_t *db, dns_dbversion_t *ver,
* from a server that is not as careful.
* Issue a warning and continue.
*/
- if (warn)
+ if (warn) {
+ char classbuf[DNS_RDATATYPE_FORMATSIZE];
+ char namebuf[DNS_NAME_FORMATSIZE];
+
+ dns_name_format(dns_db_origin(db),
+ namebuf,
+ sizeof(namebuf));
+ dns_rdataclass_format(dns_db_class(db),
+ classbuf,
+ sizeof(classbuf));
isc_log_write(DIFF_COMMON_LOGARGS,
ISC_LOG_WARNING,
- "update with no effect");
+ "%s/%s: dns_diff_apply: "
+ "update with no effect",
+ namebuf, classbuf);
+ }
} else if (result == DNS_R_NXRRSET) {
/*
* OK.
@@ -478,6 +490,7 @@ dns_diff_load(dns_diff_t *diff, dns_addrdatasetfunc_t addfunc,
if (result == DNS_R_UNCHANGED) {
isc_log_write(DIFF_COMMON_LOGARGS,
ISC_LOG_WARNING,
+ "dns_diff_load: "
"update with no effect");
} else if (result == ISC_R_SUCCESS ||
result == DNS_R_NXRRSET) {
diff --git a/contrib/bind9/lib/dns/dispatch.c b/contrib/bind9/lib/dns/dispatch.c
index 632d349..c074911 100644
--- a/contrib/bind9/lib/dns/dispatch.c
+++ b/contrib/bind9/lib/dns/dispatch.c
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004-2009 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004-2009, 2011 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 1999-2003 Internet Software Consortium.
*
* Permission to use, copy, modify, and/or distribute this software for any
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: dispatch.c,v 1.155.12.11 2009-12-02 23:26:28 marka Exp $ */
+/* $Id: dispatch.c,v 1.168.248.1.2.1 2011-06-02 23:47:34 tbox Exp $ */
/*! \file */
@@ -417,7 +417,7 @@ request_log(dns_dispatch_t *disp, dns_dispentry_t *resp,
/*%
* ARC4 random number generator derived from OpenBSD.
- * Only dispatch_arc4random() and dispatch_arc4uniformrandom() are expected
+ * Only dispatch_random() and dispatch_uniformrandom() are expected
* to be called from general dispatch routines; the rest of them are subroutines
* for these two.
*
@@ -437,8 +437,11 @@ request_log(dns_dispatch_t *disp, dns_dispentry_t *resp,
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
+#ifdef BIND9
static void
-dispatch_arc4init(arc4ctx_t *actx, isc_entropy_t *entropy, isc_mutex_t *lock) {
+dispatch_initrandom(arc4ctx_t *actx, isc_entropy_t *entropy,
+ isc_mutex_t *lock)
+{
int n;
for (n = 0; n < 256; n++)
actx->s[n] = n;
@@ -527,7 +530,7 @@ dispatch_arc4stir(arc4ctx_t *actx) {
}
static isc_uint16_t
-dispatch_arc4random(arc4ctx_t *actx) {
+dispatch_random(arc4ctx_t *actx) {
isc_uint16_t result;
if (actx->lock != NULL)
@@ -543,9 +546,38 @@ dispatch_arc4random(arc4ctx_t *actx) {
return (result);
}
+#else
+/*
+ * For general purpose library, we don't have to be too strict about the
+ * quality of random values. Performance doesn't matter much, either.
+ * So we simply use the isc_random module to keep the library as small as
+ * possible.
+ */
+
+static void
+dispatch_initrandom(arc4ctx_t *actx, isc_entropy_t *entropy,
+ isc_mutex_t *lock)
+{
+ UNUSED(actx);
+ UNUSED(entropy);
+ UNUSED(lock);
+
+ return;
+}
static isc_uint16_t
-dispatch_arc4uniformrandom(arc4ctx_t *actx, isc_uint16_t upper_bound) {
+dispatch_random(arc4ctx_t *actx) {
+ isc_uint32_t r;
+
+ UNUSED(actx);
+
+ isc_random_get(&r);
+ return (r & 0xffff);
+}
+#endif /* BIND9 */
+
+static isc_uint16_t
+dispatch_uniformrandom(arc4ctx_t *actx, isc_uint16_t upper_bound) {
isc_uint16_t min, r;
if (upper_bound < 2)
@@ -568,7 +600,7 @@ dispatch_arc4uniformrandom(arc4ctx_t *actx, isc_uint16_t upper_bound) {
* to re-roll.
*/
for (;;) {
- r = dispatch_arc4random(actx);
+ r = dispatch_random(actx);
if (r >= min)
break;
}
@@ -859,7 +891,7 @@ get_dispsocket(dns_dispatch_t *disp, isc_sockaddr_t *dest,
*/
localaddr = disp->local;
for (i = 0; i < 64; i++) {
- port = ports[dispatch_arc4uniformrandom(DISP_ARC4CTX(disp),
+ port = ports[dispatch_uniformrandom(DISP_ARC4CTX(disp),
nports)];
isc_sockaddr_setport(&localaddr, port);
@@ -964,6 +996,7 @@ deactivate_dispsocket(dns_dispatch_t *disp, dispsocket_t *dispsock) {
INSIST(dispsock->portentry != NULL);
deref_portentry(disp, &dispsock->portentry);
+#ifdef BIND9
if (disp->nsockets > DNS_DISPATCH_POOLSOCKS)
destroy_dispsocket(disp, &dispsock);
else {
@@ -987,6 +1020,13 @@ deactivate_dispsocket(dns_dispatch_t *disp, dispsocket_t *dispsock) {
destroy_dispsocket(disp, &dispsock);
}
}
+#else
+ /* This kind of optimization isn't necessary for normal use */
+ UNUSED(qid);
+ UNUSED(result);
+
+ destroy_dispsocket(disp, &dispsock);
+#endif
}
/*
@@ -1707,13 +1747,17 @@ destroy_mgr(dns_dispatchmgr_t **mgrp) {
isc_mempool_destroy(&mgr->epool);
isc_mempool_destroy(&mgr->rpool);
isc_mempool_destroy(&mgr->dpool);
- isc_mempool_destroy(&mgr->bpool);
- isc_mempool_destroy(&mgr->spool);
+ if (mgr->bpool != NULL)
+ isc_mempool_destroy(&mgr->bpool);
+ if (mgr->spool != NULL)
+ isc_mempool_destroy(&mgr->spool);
DESTROYLOCK(&mgr->pool_lock);
+#ifdef BIND9
if (mgr->entropy != NULL)
isc_entropy_detach(&mgr->entropy);
+#endif /* BIND9 */
if (mgr->qid != NULL)
qid_destroy(mctx, &mgr->qid);
@@ -1752,9 +1796,13 @@ open_socket(isc_socketmgr_t *mgr, isc_sockaddr_t *local,
return (result);
isc_socket_setname(sock, "dispatcher", NULL);
} else {
+#ifdef BIND9
result = isc_socket_open(sock);
if (result != ISC_R_SUCCESS)
return (result);
+#else
+ INSIST(0);
+#endif
}
#ifndef ISC_ALLOW_MAPPED
@@ -1764,8 +1812,13 @@ open_socket(isc_socketmgr_t *mgr, isc_sockaddr_t *local,
if (result != ISC_R_SUCCESS) {
if (*sockp == NULL)
isc_socket_detach(&sock);
- else
+ else {
+#ifdef BIND9
isc_socket_close(sock);
+#else
+ INSIST(0);
+#endif
+ }
return (result);
}
@@ -1897,10 +1950,14 @@ dns_dispatchmgr_create(isc_mem_t *mctx, isc_entropy_t *entropy,
if (result != ISC_R_SUCCESS)
goto kill_dpool;
+#ifdef BIND9
if (entropy != NULL)
isc_entropy_attach(entropy, &mgr->entropy);
+#else
+ UNUSED(entropy);
+#endif
- dispatch_arc4init(&mgr->arc4ctx, mgr->entropy, &mgr->arc4_lock);
+ dispatch_initrandom(&mgr->arc4ctx, mgr->entropy, &mgr->arc4_lock);
*mgrp = mgr;
return (ISC_R_SUCCESS);
@@ -2411,7 +2468,7 @@ dispatch_allocate(dns_dispatchmgr_t *mgr, unsigned int maxrequests,
ISC_LIST_INIT(disp->activesockets);
ISC_LIST_INIT(disp->inactivesockets);
disp->nsockets = 0;
- dispatch_arc4init(&disp->arc4ctx, mgr->entropy, NULL);
+ dispatch_initrandom(&disp->arc4ctx, mgr->entropy, NULL);
disp->port_table = NULL;
disp->portpool = NULL;
@@ -2708,7 +2765,7 @@ get_udpsocket(dns_dispatchmgr_t *mgr, dns_dispatch_t *disp,
for (i = 0; i < 1024; i++) {
in_port_t prt;
- prt = ports[dispatch_arc4uniformrandom(
+ prt = ports[dispatch_uniformrandom(
DISP_ARC4CTX(disp),
nports)];
isc_sockaddr_setport(&localaddr_bound, prt);
@@ -2844,8 +2901,10 @@ dispatch_createudp(dns_dispatchmgr_t *mgr, isc_socketmgr_t *sockmgr,
disp->task[i] = NULL;
result = isc_task_create(taskmgr, 0, &disp->task[i]);
if (result != ISC_R_SUCCESS) {
- while (--i >= 0)
- isc_task_destroy(&disp->task[i]);
+ while (--i >= 0) {
+ isc_task_shutdown(disp->task[i]);
+ isc_task_detach(&disp->task[i]);
+ }
goto kill_socket;
}
isc_task_setname(disp->task[i], "udpdispatch", disp);
@@ -3045,7 +3104,7 @@ dns_dispatch_addresponse2(dns_dispatch_t *disp, isc_sockaddr_t *dest,
/*
* Try somewhat hard to find an unique ID.
*/
- id = (dns_messageid_t)dispatch_arc4random(DISP_ARC4CTX(disp));
+ id = (dns_messageid_t)dispatch_random(DISP_ARC4CTX(disp));
bucket = dns_hash(qid, dest, id, localport);
ok = ISC_FALSE;
for (i = 0; i < 64; i++) {
diff --git a/contrib/bind9/lib/dns/dlz.c b/contrib/bind9/lib/dns/dlz.c
index f848230..5a508e9 100644
--- a/contrib/bind9/lib/dns/dlz.c
+++ b/contrib/bind9/lib/dns/dlz.c
@@ -1,5 +1,5 @@
/*
- * Portions Copyright (C) 2005, 2007, 2009 Internet Systems Consortium, Inc. ("ISC")
+ * Portions Copyright (C) 2005, 2007, 2009, 2010 Internet Systems Consortium, Inc. ("ISC")
* Portions Copyright (C) 1999-2001 Internet Software Consortium.
*
* Permission to use, copy, modify, and/or distribute this software for any
@@ -50,7 +50,7 @@
* USE OR PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: dlz.c,v 1.5.332.2 2009-01-18 23:47:35 tbox Exp $ */
+/* $Id: dlz.c,v 1.10 2010-12-20 23:47:20 tbox Exp $ */
/*! \file */
@@ -64,6 +64,8 @@
#include <dns/log.h>
#include <dns/master.h>
#include <dns/dlz.h>
+#include <dns/ssu.h>
+#include <dns/zone.h>
#include <isc/buffer.h>
@@ -230,6 +232,12 @@ dns_dlzdestroy(dns_dlzdb_t **dbp) {
*/
REQUIRE(dbp != NULL && DNS_DLZ_VALID(*dbp));
+#ifdef BIND9
+ if ((*dbp)->ssutable != NULL) {
+ dns_ssutable_detach(&(*dbp)->ssutable);
+ }
+#endif
+
/* call the drivers destroy method */
if ((*dbp) != NULL) {
mctx = (*dbp)->mctx;
@@ -499,7 +507,7 @@ dns_dlzunregister(dns_dlzimplementation_t **dlzimp) {
mctx = dlz_imp->mctx;
/*
- * return the memory back to the available memory pool and
+ * Return the memory back to the available memory pool and
* remove it from the memory context.
*/
isc_mem_put(mctx, dlz_imp, sizeof(dns_dlzimplementation_t));
@@ -508,3 +516,143 @@ dns_dlzunregister(dns_dlzimplementation_t **dlzimp) {
/* Unlock the dlz_implementations list. */
RWUNLOCK(&dlz_implock, isc_rwlocktype_write);
}
+
+#ifdef BIND9
+/*
+ * Create a writeable DLZ zone. This can be called by DLZ drivers
+ * during configure() to create a zone that can be updated. The zone
+ * type is set to dns_zone_dlz, which is equivalent to a master zone
+ *
+ * This function uses a callback setup in dns_dlzconfigure() to call
+ * into the server zone code to setup the remaining pieces of server
+ * specific functionality on the zone
+ */
+isc_result_t
+dns_dlz_writeablezone(dns_view_t *view, const char *zone_name) {
+ dns_zone_t *zone = NULL;
+ dns_zone_t *dupzone = NULL;
+ isc_result_t result;
+ isc_buffer_t buffer;
+ dns_fixedname_t fixorigin;
+ dns_name_t *origin;
+ dns_rdataclass_t zclass;
+ dns_dlzdb_t *dlzdatabase;
+
+ REQUIRE(DNS_DLZ_VALID(view->dlzdatabase));
+
+ dlzdatabase = view->dlzdatabase;
+
+ REQUIRE(dlzdatabase->configure_callback != NULL);
+
+ isc_buffer_init(&buffer, zone_name, strlen(zone_name));
+ isc_buffer_add(&buffer, strlen(zone_name));
+ dns_fixedname_init(&fixorigin);
+ result = dns_name_fromtext(dns_fixedname_name(&fixorigin),
+ &buffer, dns_rootname, 0, NULL);
+ if (result != ISC_R_SUCCESS)
+ goto cleanup;
+ origin = dns_fixedname_name(&fixorigin);
+
+ zclass = view->rdclass;
+
+ /* See if the zone already exists */
+ result = dns_view_findzone(view, origin, &dupzone);
+ if (result == ISC_R_SUCCESS) {
+ dns_zone_detach(&dupzone);
+ result = ISC_R_EXISTS;
+ goto cleanup;
+ }
+ INSIST(dupzone == NULL);
+
+ /* Create it */
+ result = dns_zone_create(&zone, view->mctx);
+ if (result != ISC_R_SUCCESS)
+ goto cleanup;
+ result = dns_zone_setorigin(zone, origin);
+ if (result != ISC_R_SUCCESS)
+ goto cleanup;
+ dns_zone_setview(zone, view);
+
+ dns_zone_setadded(zone, ISC_TRUE);
+
+ if (dlzdatabase->ssutable == NULL) {
+ result = dns_ssutable_createdlz(dlzdatabase->mctx,
+ &dlzdatabase->ssutable,
+ view->dlzdatabase);
+ if (result != ISC_R_SUCCESS)
+ goto cleanup;
+ }
+ dns_zone_setssutable(zone, dlzdatabase->ssutable);
+
+ result = dlzdatabase->configure_callback(view, zone);
+ if (result != ISC_R_SUCCESS)
+ goto cleanup;
+
+ /*
+ * Add the zone to its view in the new view list.
+ */
+ result = dns_view_addzone(view, zone);
+
+ result = ISC_R_SUCCESS;
+
+ cleanup:
+ if (zone != NULL)
+ dns_zone_detach(&zone);
+
+ return (result);
+}
+#endif
+
+/*%
+ * Configure a DLZ driver. This is optional, and if supplied gives
+ * the backend an opportunity to configure parameters related to DLZ.
+ */
+isc_result_t
+dns_dlzconfigure(dns_view_t *view, isc_result_t (*callback)(dns_view_t *,
+ dns_zone_t *))
+{
+ dns_dlzimplementation_t *impl;
+ dns_dlzdb_t *dlzdatabase;
+ isc_result_t result;
+
+ REQUIRE(view != NULL);
+ REQUIRE(DNS_DLZ_VALID(view->dlzdatabase));
+ REQUIRE(view->dlzdatabase->implementation != NULL);
+
+ dlzdatabase = view->dlzdatabase;
+ impl = dlzdatabase->implementation;
+
+ if (impl->methods->configure == NULL)
+ return (ISC_R_SUCCESS);
+
+ dlzdatabase->configure_callback = callback;
+
+ result = impl->methods->configure(impl->driverarg,
+ dlzdatabase->dbdata, view);
+ return (result);
+}
+
+isc_boolean_t
+dns_dlz_ssumatch(dns_dlzdb_t *dlzdatabase,
+ dns_name_t *signer, dns_name_t *name, isc_netaddr_t *tcpaddr,
+ dns_rdatatype_t type, const dst_key_t *key)
+{
+ dns_dlzimplementation_t *impl;
+ isc_boolean_t r;
+
+ REQUIRE(dlzdatabase != NULL);
+ REQUIRE(dlzdatabase->implementation != NULL);
+ REQUIRE(dlzdatabase->implementation->methods != NULL);
+ impl = dlzdatabase->implementation;
+
+ if (impl->methods->ssumatch == NULL) {
+ isc_log_write(dns_lctx, DNS_LOGCATEGORY_DATABASE,
+ DNS_LOGMODULE_DLZ, ISC_LOG_INFO,
+ "No ssumatch method for DLZ database");
+ return (ISC_FALSE);
+ }
+
+ r = impl->methods->ssumatch(signer, name, tcpaddr, type, key,
+ impl->driverarg, dlzdatabase->dbdata);
+ return (r);
+}
diff --git a/contrib/bind9/lib/dns/dns64.c b/contrib/bind9/lib/dns/dns64.c
new file mode 100644
index 0000000..180c0a9
--- /dev/null
+++ b/contrib/bind9/lib/dns/dns64.c
@@ -0,0 +1,299 @@
+/*
+ * Copyright (C) 2010 Internet Systems Consortium, Inc. ("ISC")
+ *
+ * Permission to use, copy, modify, and/or 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 ISC DISCLAIMS ALL WARRANTIES WITH
+ * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+ * AND FITNESS. IN NO EVENT SHALL ISC 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.
+ */
+
+/* $Id: dns64.c,v 1.6 2010-12-09 04:59:09 marka Exp $ */
+
+#include <config.h>
+
+#include <isc/list.h>
+#include <isc/mem.h>
+#include <isc/netaddr.h>
+#include <isc/string.h>
+#include <isc/util.h>
+
+#include <dns/acl.h>
+#include <dns/dns64.h>
+#include <dns/rdata.h>
+#include <dns/rdataset.h>
+#include <dns/result.h>
+
+struct dns_dns64 {
+ unsigned char bits[16]; /*
+ * Prefix + suffix bits.
+ */
+ dns_acl_t * clients; /*
+ * Which clients get mapped
+ * addresses.
+ */
+ dns_acl_t * mapped; /*
+ * IPv4 addresses to be mapped.
+ */
+ dns_acl_t * excluded; /*
+ * IPv6 addresses that are
+ * treated as not existing.
+ */
+ unsigned int prefixlen; /*
+ * Start of mapped address.
+ */
+ unsigned int flags;
+ isc_mem_t * mctx;
+ ISC_LINK(dns_dns64_t) link;
+};
+
+isc_result_t
+dns_dns64_create(isc_mem_t *mctx, isc_netaddr_t *prefix,
+ unsigned int prefixlen, isc_netaddr_t *suffix,
+ dns_acl_t *clients, dns_acl_t *mapped, dns_acl_t *excluded,
+ unsigned int flags, dns_dns64_t **dns64)
+{
+ dns_dns64_t *new;
+ unsigned int nbytes = 16;
+
+ REQUIRE(prefix != NULL && prefix->family == AF_INET6);
+ /* Legal prefix lengths from draft-ietf-behave-address-format-04. */
+ REQUIRE(prefixlen == 32 || prefixlen == 40 || prefixlen == 48 ||
+ prefixlen == 56 || prefixlen == 64 || prefixlen == 96);
+ REQUIRE(isc_netaddr_prefixok(prefix, prefixlen) == ISC_R_SUCCESS);
+ REQUIRE(dns64 != NULL && *dns64 == NULL);
+
+ if (suffix != NULL) {
+ static const unsigned char zeros[16];
+ REQUIRE(prefix->family == AF_INET6);
+ nbytes = prefixlen / 8 + 4;
+ /* Bits 64-71 are zeros. draft-ietf-behave-address-format-04 */
+ if (prefixlen >= 32 && prefixlen <= 64)
+ nbytes++;
+ REQUIRE(memcmp(suffix->type.in6.s6_addr, zeros, nbytes) == 0);
+ }
+
+ new = isc_mem_get(mctx, sizeof(dns_dns64_t));
+ if (new == NULL)
+ return (ISC_R_NOMEMORY);
+ memset(new->bits, 0, sizeof(new->bits));
+ memcpy(new->bits, prefix->type.in6.s6_addr, prefixlen / 8);
+ if (suffix != NULL)
+ memcpy(new->bits + nbytes, suffix->type.in6.s6_addr + nbytes,
+ 16 - nbytes);
+ new->clients = NULL;
+ if (clients != NULL)
+ dns_acl_attach(clients, &new->clients);
+ new->mapped = NULL;
+ if (mapped != NULL)
+ dns_acl_attach(mapped, &new->mapped);
+ new->excluded = NULL;
+ if (excluded != NULL)
+ dns_acl_attach(excluded, &new->excluded);
+ new->prefixlen = prefixlen;
+ new->flags = flags;
+ ISC_LINK_INIT(new, link);
+ new->mctx = NULL;
+ isc_mem_attach(mctx, &new->mctx);
+ *dns64 = new;
+ return (ISC_R_SUCCESS);
+}
+
+void
+dns_dns64_destroy(dns_dns64_t **dns64p) {
+ dns_dns64_t *dns64;
+
+ REQUIRE(dns64p != NULL && *dns64p != NULL);
+
+ dns64 = *dns64p;
+ *dns64p = NULL;
+
+ REQUIRE(!ISC_LINK_LINKED(dns64, link));
+
+ if (dns64->clients != NULL)
+ dns_acl_detach(&dns64->clients);
+ if (dns64->mapped != NULL)
+ dns_acl_detach(&dns64->mapped);
+ if (dns64->excluded != NULL)
+ dns_acl_detach(&dns64->excluded);
+ isc_mem_putanddetach(&dns64->mctx, dns64, sizeof(*dns64));
+}
+
+isc_result_t
+dns_dns64_aaaafroma(const dns_dns64_t *dns64, const isc_netaddr_t *reqaddr,
+ const dns_name_t *reqsigner, const dns_aclenv_t *env,
+ unsigned int flags, unsigned char *a, unsigned char *aaaa)
+{
+ unsigned int nbytes, i;
+ isc_result_t result;
+ int match;
+
+ if ((dns64->flags & DNS_DNS64_RECURSIVE_ONLY) != 0 &&
+ (flags & DNS_DNS64_RECURSIVE) == 0)
+ return (DNS_R_DISALLOWED);
+
+ if ((dns64->flags & DNS_DNS64_BREAK_DNSSEC) == 0 &&
+ (flags & DNS_DNS64_DNSSEC) != 0)
+ return (DNS_R_DISALLOWED);
+
+ if (dns64->clients != NULL) {
+ result = dns_acl_match(reqaddr, reqsigner, dns64->clients, env,
+ &match, NULL);
+ if (result != ISC_R_SUCCESS)
+ return (result);
+ if (match <= 0)
+ return (DNS_R_DISALLOWED);
+ }
+
+ if (dns64->mapped != NULL) {
+ struct in_addr ina;
+ isc_netaddr_t netaddr;
+
+ memcpy(&ina.s_addr, a, 4);
+ isc_netaddr_fromin(&netaddr, &ina);
+ result = dns_acl_match(&netaddr, NULL, dns64->mapped, env,
+ &match, NULL);
+ if (result != ISC_R_SUCCESS)
+ return (result);
+ if (match <= 0)
+ return (DNS_R_DISALLOWED);
+ }
+
+ nbytes = dns64->prefixlen / 8;
+ INSIST(nbytes <= 12);
+ /* Copy prefix. */
+ memcpy(aaaa, dns64->bits, nbytes);
+ /* Bits 64-71 are zeros. draft-ietf-behave-address-format-04 */
+ if (nbytes == 8)
+ aaaa[nbytes++] = 0;
+ /* Copy mapped address. */
+ for (i = 0; i < 4U; i++) {
+ aaaa[nbytes++] = a[i];
+ /* Bits 64-71 are zeros. draft-ietf-behave-address-format-04 */
+ if (nbytes == 8)
+ aaaa[nbytes++] = 0;
+ }
+ /* Copy suffix. */
+ memcpy(aaaa + nbytes, dns64->bits + nbytes, 16 - nbytes);
+ return (ISC_R_SUCCESS);
+}
+
+dns_dns64_t *
+dns_dns64_next(dns_dns64_t *dns64) {
+ dns64 = ISC_LIST_NEXT(dns64, link);
+ return (dns64);
+}
+
+void
+dns_dns64_append(dns_dns64list_t *list, dns_dns64_t *dns64) {
+ ISC_LIST_APPEND(*list, dns64, link);
+}
+
+void
+dns_dns64_unlink(dns_dns64list_t *list, dns_dns64_t *dns64) {
+ ISC_LIST_UNLINK(*list, dns64, link);
+}
+
+isc_boolean_t
+dns_dns64_aaaaok(const dns_dns64_t *dns64, const isc_netaddr_t *reqaddr,
+ const dns_name_t *reqsigner, const dns_aclenv_t *env,
+ unsigned int flags, dns_rdataset_t *rdataset,
+ isc_boolean_t *aaaaok, size_t aaaaoklen)
+{
+ struct in6_addr in6;
+ isc_netaddr_t netaddr;
+ isc_result_t result;
+ int match;
+ isc_boolean_t answer = ISC_FALSE;
+ isc_boolean_t found = ISC_FALSE;
+ unsigned int i, ok;
+
+ REQUIRE(rdataset != NULL);
+ REQUIRE(rdataset->type == dns_rdatatype_aaaa);
+ REQUIRE(rdataset->rdclass == dns_rdataclass_in);
+ if (aaaaok != NULL)
+ REQUIRE(aaaaoklen == dns_rdataset_count(rdataset));
+
+ for (;dns64 != NULL; dns64 = ISC_LIST_NEXT(dns64, link)) {
+ if ((dns64->flags & DNS_DNS64_RECURSIVE_ONLY) != 0 &&
+ (flags & DNS_DNS64_RECURSIVE) == 0)
+ continue;
+
+ if ((dns64->flags & DNS_DNS64_BREAK_DNSSEC) == 0 &&
+ (flags & DNS_DNS64_DNSSEC) != 0)
+ continue;
+ /*
+ * Work out if this dns64 structure applies to this client.
+ */
+ if (dns64->clients != NULL) {
+ result = dns_acl_match(reqaddr, reqsigner,
+ dns64->clients, env,
+ &match, NULL);
+ if (result != ISC_R_SUCCESS)
+ continue;
+ if (match <= 0)
+ continue;
+ }
+
+ if (!found && aaaaok != NULL) {
+ for (i = 0; i < aaaaoklen; i++)
+ aaaaok[i] = ISC_FALSE;
+ }
+ found = ISC_TRUE;
+
+ /*
+ * If we are not excluding any addresses then any AAAA
+ * will do.
+ */
+ if (dns64->excluded == NULL) {
+ answer = ISC_TRUE;
+ for (i = 0; i < aaaaoklen; i++)
+ aaaaok[i] = ISC_TRUE;
+ goto done;
+ }
+
+ i = 0; ok = 0;
+ for (result = dns_rdataset_first(rdataset);
+ result == ISC_R_SUCCESS;
+ result = dns_rdataset_next(rdataset)) {
+ dns_rdata_t rdata = DNS_RDATA_INIT;
+ if (aaaaok == NULL || !aaaaok[i]) {
+
+ dns_rdataset_current(rdataset, &rdata);
+ memcpy(&in6.s6_addr, rdata.data, 16);
+ isc_netaddr_fromin6(&netaddr, &in6);
+
+ result = dns_acl_match(&netaddr, NULL,
+ dns64->excluded,
+ env, &match, NULL);
+ if (result == ISC_R_SUCCESS && match <= 0) {
+ answer = ISC_TRUE;
+ if (aaaaok == NULL)
+ goto done;
+ aaaaok[i] = ISC_TRUE;
+ ok++;
+ }
+ } else
+ ok++;
+ i++;
+ }
+ /*
+ * Are all addresses ok?
+ */
+ if (aaaaok != NULL && ok == aaaaoklen)
+ goto done;
+ }
+
+ done:
+ if (!found && aaaaok != NULL) {
+ for (i = 0; i < aaaaoklen; i++)
+ aaaaok[i] = ISC_TRUE;
+ }
+ return (found ? answer : ISC_TRUE);
+}
diff --git a/contrib/bind9/lib/dns/dnssec.c b/contrib/bind9/lib/dns/dnssec.c
index 67a2c67..dc249b7 100644
--- a/contrib/bind9/lib/dns/dnssec.c
+++ b/contrib/bind9/lib/dns/dnssec.c
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004-2009 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004-2010 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 1999-2003 Internet Software Consortium.
*
* Permission to use, copy, modify, and/or distribute this software for any
@@ -16,7 +16,7 @@
*/
/*
- * $Id: dnssec.c,v 1.93.12.6 2009-06-22 23:47:18 tbox Exp $
+ * $Id: dnssec.c,v 1.119 2010-01-13 23:48:59 tbox Exp $
*/
/*! \file */
@@ -26,15 +26,18 @@
#include <stdlib.h>
#include <isc/buffer.h>
+#include <isc/dir.h>
#include <isc/mem.h>
#include <isc/serial.h>
#include <isc/string.h>
#include <isc/util.h>
#include <dns/db.h>
+#include <dns/diff.h>
#include <dns/dnssec.h>
#include <dns/fixedname.h>
#include <dns/keyvalues.h>
+#include <dns/log.h>
#include <dns/message.h>
#include <dns/rdata.h>
#include <dns/rdatalist.h>
@@ -539,6 +542,59 @@ dns_dnssec_verify(dns_name_t *name, dns_rdataset_t *set, dst_key_t *key,
return (result);
}
+static isc_boolean_t
+key_active(dst_key_t *key) {
+ isc_result_t result;
+ isc_stdtime_t now, publish, active, revoke, inactive, delete;
+ isc_boolean_t pubset = ISC_FALSE, actset = ISC_FALSE;
+ isc_boolean_t revset = ISC_FALSE, inactset = ISC_FALSE;
+ isc_boolean_t delset = ISC_FALSE;
+ int major, minor;
+
+ /* Is this an old-style key? */
+ result = dst_key_getprivateformat(key, &major, &minor);
+
+ /*
+ * Smart signing started with key format 1.3; prior to that, all
+ * keys are assumed active
+ */
+ if (major == 1 && minor <= 2)
+ return (ISC_TRUE);
+
+ isc_stdtime_get(&now);
+
+ result = dst_key_gettime(key, DST_TIME_PUBLISH, &publish);
+ if (result == ISC_R_SUCCESS)
+ pubset = ISC_TRUE;
+
+ result = dst_key_gettime(key, DST_TIME_ACTIVATE, &active);
+ if (result == ISC_R_SUCCESS)
+ actset = ISC_TRUE;
+
+ result = dst_key_gettime(key, DST_TIME_REVOKE, &revoke);
+ if (result == ISC_R_SUCCESS)
+ revset = ISC_TRUE;
+
+ result = dst_key_gettime(key, DST_TIME_INACTIVE, &inactive);
+ if (result == ISC_R_SUCCESS)
+ inactset = ISC_TRUE;
+
+ result = dst_key_gettime(key, DST_TIME_DELETE, &delete);
+ if (result == ISC_R_SUCCESS)
+ delset = ISC_TRUE;
+
+ if ((inactset && inactive <= now) || (delset && delete <= now))
+ return (ISC_FALSE);
+
+ if (revset && revoke <= now && pubset && publish <= now)
+ return (ISC_TRUE);
+
+ if (actset && active <= now)
+ return (ISC_TRUE);
+
+ return (ISC_FALSE);
+}
+
#define is_zone_key(key) ((dst_key_flags(key) & DNS_KEYFLAG_OWNERMASK) \
== DNS_KEYOWNER_ZONE)
@@ -580,14 +636,70 @@ dns_dnssec_findzonekeys2(dns_db_t *db, dns_dbversion_t *ver,
DST_TYPE_PUBLIC|DST_TYPE_PRIVATE,
directory,
mctx, &keys[count]);
+
+ /*
+ * If the key was revoked and the private file
+ * doesn't exist, maybe it was revoked internally
+ * by named. Try loading the unrevoked version.
+ */
if (result == ISC_R_FILENOTFOUND) {
+ isc_uint32_t flags;
+ flags = dst_key_flags(pubkey);
+ if ((flags & DNS_KEYFLAG_REVOKE) != 0) {
+ dst_key_setflags(pubkey,
+ flags & ~DNS_KEYFLAG_REVOKE);
+ result = dst_key_fromfile(dst_key_name(pubkey),
+ dst_key_id(pubkey),
+ dst_key_alg(pubkey),
+ DST_TYPE_PUBLIC|
+ DST_TYPE_PRIVATE,
+ directory,
+ mctx, &keys[count]);
+ if (result == ISC_R_SUCCESS &&
+ dst_key_pubcompare(pubkey, keys[count],
+ ISC_FALSE)) {
+ dst_key_setflags(keys[count], flags);
+ }
+ dst_key_setflags(pubkey, flags);
+ }
+ }
+
+ if (result != ISC_R_SUCCESS) {
+ char keybuf[DNS_NAME_FORMATSIZE];
+ char algbuf[DNS_SECALG_FORMATSIZE];
+ dns_name_format(dst_key_name(pubkey), keybuf,
+ sizeof(keybuf));
+ dns_secalg_format(dst_key_alg(pubkey), algbuf,
+ sizeof(algbuf));
+ isc_log_write(dns_lctx, DNS_LOGCATEGORY_GENERAL,
+ DNS_LOGMODULE_DNSSEC, ISC_LOG_WARNING,
+ "dns_dnssec_findzonekeys2: error "
+ "reading private key file %s/%s/%d: %s",
+ keybuf, algbuf, dst_key_id(pubkey),
+ isc_result_totext(result));
+ }
+
+ if (result == ISC_R_FILENOTFOUND || result == ISC_R_NOPERM) {
keys[count] = pubkey;
pubkey = NULL;
count++;
goto next;
}
+
if (result != ISC_R_SUCCESS)
goto failure;
+
+ /*
+ * If a key is marked inactive, skip it
+ */
+ if (!key_active(keys[count])) {
+ dst_key_free(&keys[count]);
+ keys[count] = pubkey;
+ pubkey = NULL;
+ count++;
+ goto next;
+ }
+
if ((dst_key_flags(keys[count]) & DNS_KEYTYPE_NOAUTH) != 0) {
/* We should never get here. */
dst_key_free(&keys[count]);
@@ -951,3 +1063,691 @@ dns_dnssec_selfsigns(dns_rdata_t *rdata, dns_name_t *name,
dst_key_free(&dstkey);
return (ISC_FALSE);
}
+
+isc_result_t
+dns_dnsseckey_create(isc_mem_t *mctx, dst_key_t **dstkey,
+ dns_dnsseckey_t **dkp)
+{
+ isc_result_t result;
+ dns_dnsseckey_t *dk;
+ int major, minor;
+
+ REQUIRE(dkp != NULL && *dkp == NULL);
+ dk = isc_mem_get(mctx, sizeof(dns_dnsseckey_t));
+ if (dk == NULL)
+ return (ISC_R_NOMEMORY);
+
+ dk->key = *dstkey;
+ *dstkey = NULL;
+ dk->force_publish = ISC_FALSE;
+ dk->force_sign = ISC_FALSE;
+ dk->hint_publish = ISC_FALSE;
+ dk->hint_sign = ISC_FALSE;
+ dk->hint_remove = ISC_FALSE;
+ dk->first_sign = ISC_FALSE;
+ dk->is_active = ISC_FALSE;
+ dk->prepublish = 0;
+ dk->source = dns_keysource_unknown;
+ dk->index = 0;
+
+ /* KSK or ZSK? */
+ dk->ksk = ISC_TF((dst_key_flags(dk->key) & DNS_KEYFLAG_KSK) != 0);
+
+ /* Is this an old-style key? */
+ result = dst_key_getprivateformat(dk->key, &major, &minor);
+
+ /* Smart signing started with key format 1.3 */
+ dk->legacy = ISC_TF(major == 1 && minor <= 2);
+
+ ISC_LINK_INIT(dk, link);
+ *dkp = dk;
+ return (ISC_R_SUCCESS);
+}
+
+void
+dns_dnsseckey_destroy(isc_mem_t *mctx, dns_dnsseckey_t **dkp) {
+ dns_dnsseckey_t *dk;
+
+ REQUIRE(dkp != NULL && *dkp != NULL);
+ dk = *dkp;
+ if (dk->key != NULL)
+ dst_key_free(&dk->key);
+ isc_mem_put(mctx, dk, sizeof(dns_dnsseckey_t));
+ *dkp = NULL;
+}
+
+static void
+get_hints(dns_dnsseckey_t *key) {
+ isc_result_t result;
+ isc_stdtime_t now, publish, active, revoke, inactive, delete;
+ isc_boolean_t pubset = ISC_FALSE, actset = ISC_FALSE;
+ isc_boolean_t revset = ISC_FALSE, inactset = ISC_FALSE;
+ isc_boolean_t delset = ISC_FALSE;
+
+ REQUIRE(key != NULL && key->key != NULL);
+
+ isc_stdtime_get(&now);
+
+ result = dst_key_gettime(key->key, DST_TIME_PUBLISH, &publish);
+ if (result == ISC_R_SUCCESS)
+ pubset = ISC_TRUE;
+
+ result = dst_key_gettime(key->key, DST_TIME_ACTIVATE, &active);
+ if (result == ISC_R_SUCCESS)
+ actset = ISC_TRUE;
+
+ result = dst_key_gettime(key->key, DST_TIME_REVOKE, &revoke);
+ if (result == ISC_R_SUCCESS)
+ revset = ISC_TRUE;
+
+ result = dst_key_gettime(key->key, DST_TIME_INACTIVE, &inactive);
+ if (result == ISC_R_SUCCESS)
+ inactset = ISC_TRUE;
+
+ result = dst_key_gettime(key->key, DST_TIME_DELETE, &delete);
+ if (result == ISC_R_SUCCESS)
+ delset = ISC_TRUE;
+
+ /* Metadata says publish (but possibly not activate) */
+ if (pubset && publish <= now)
+ key->hint_publish = ISC_TRUE;
+
+ /* Metadata says activate (so we must also publish) */
+ if (actset && active <= now) {
+ key->hint_sign = ISC_TRUE;
+ key->hint_publish = ISC_TRUE;
+ }
+
+ /*
+ * Activation date is set (maybe in the future), but
+ * publication date isn't. Most likely the user wants to
+ * publish now and activate later.
+ */
+ if (actset && !pubset)
+ key->hint_publish = ISC_TRUE;
+
+ /*
+ * If activation date is in the future, make note of how far off
+ */
+ if (key->hint_publish && actset && active > now) {
+ key->prepublish = active - now;
+ }
+
+ /*
+ * Key has been marked inactive: we can continue publishing,
+ * but don't sign.
+ */
+ if (key->hint_publish && inactset && inactive <= now) {
+ key->hint_sign = ISC_FALSE;
+ }
+
+ /*
+ * Metadata says revoke. If the key is published,
+ * we *have to* sign with it per RFC5011--even if it was
+ * not active before.
+ *
+ * If it hasn't already been done, we should also revoke it now.
+ */
+ if (key->hint_publish && (revset && revoke <= now)) {
+ isc_uint32_t flags;
+ key->hint_sign = ISC_TRUE;
+ flags = dst_key_flags(key->key);
+ if ((flags & DNS_KEYFLAG_REVOKE) == 0) {
+ flags |= DNS_KEYFLAG_REVOKE;
+ dst_key_setflags(key->key, flags);
+ }
+ }
+
+ /*
+ * Metadata says delete, so don't publish this key or sign with it.
+ */
+ if (delset && delete <= now) {
+ key->hint_publish = ISC_FALSE;
+ key->hint_sign = ISC_FALSE;
+ key->hint_remove = ISC_TRUE;
+ }
+}
+
+/*%
+ * Get a list of DNSSEC keys from the key repository
+ */
+isc_result_t
+dns_dnssec_findmatchingkeys(dns_name_t *origin, const char *directory,
+ isc_mem_t *mctx, dns_dnsseckeylist_t *keylist)
+{
+ isc_result_t result = ISC_R_SUCCESS;
+ isc_boolean_t dir_open = ISC_FALSE;
+ dns_dnsseckeylist_t list;
+ isc_dir_t dir;
+ dns_dnsseckey_t *key = NULL;
+ dst_key_t *dstkey = NULL;
+ char namebuf[DNS_NAME_FORMATSIZE], *p;
+ isc_buffer_t b;
+ unsigned int len;
+
+ REQUIRE(keylist != NULL);
+ ISC_LIST_INIT(list);
+ isc_dir_init(&dir);
+
+ isc_buffer_init(&b, namebuf, sizeof(namebuf) - 1);
+ RETERR(dns_name_totext(origin, ISC_FALSE, &b));
+ len = isc_buffer_usedlength(&b);
+ namebuf[len] = '\0';
+
+ if (directory == NULL)
+ directory = ".";
+ RETERR(isc_dir_open(&dir, directory));
+ dir_open = ISC_TRUE;
+
+ while (isc_dir_read(&dir) == ISC_R_SUCCESS) {
+ if (dir.entry.name[0] == 'K' &&
+ dir.entry.length > len + 1 &&
+ dir.entry.name[len + 1] == '+' &&
+ strncasecmp(dir.entry.name + 1, namebuf, len) == 0) {
+ p = strrchr(dir.entry.name, '.');
+ if (p != NULL && strcmp(p, ".private") != 0)
+ continue;
+
+ dstkey = NULL;
+ result = dst_key_fromnamedfile(dir.entry.name,
+ directory,
+ DST_TYPE_PUBLIC |
+ DST_TYPE_PRIVATE,
+ mctx, &dstkey);
+
+ if (result != ISC_R_SUCCESS) {
+ isc_log_write(dns_lctx,
+ DNS_LOGCATEGORY_GENERAL,
+ DNS_LOGMODULE_DNSSEC,
+ ISC_LOG_WARNING,
+ "dns_dnssec_findmatchingkeys: "
+ "error reading key file %s: %s",
+ dir.entry.name,
+ isc_result_totext(result));
+ continue;
+ }
+
+ RETERR(dns_dnsseckey_create(mctx, &dstkey, &key));
+ key->source = dns_keysource_repository;
+ get_hints(key);
+
+ if (key->legacy) {
+ dns_dnsseckey_destroy(mctx, &key);
+ } else {
+ ISC_LIST_APPEND(list, key, link);
+ key = NULL;
+ }
+ }
+ }
+
+ if (!ISC_LIST_EMPTY(list))
+ ISC_LIST_APPENDLIST(*keylist, list, link);
+ else
+ result = ISC_R_NOTFOUND;
+
+ failure:
+ if (dir_open)
+ isc_dir_close(&dir);
+ INSIST(key == NULL);
+ while ((key = ISC_LIST_HEAD(list)) != NULL) {
+ ISC_LIST_UNLINK(list, key, link);
+ INSIST(key->key != NULL);
+ dst_key_free(&key->key);
+ dns_dnsseckey_destroy(mctx, &key);
+ }
+ if (dstkey != NULL)
+ dst_key_free(&dstkey);
+ return (result);
+}
+
+/*%
+ * Add 'newkey' to 'keylist' if it's not already there.
+ *
+ * If 'savekeys' is ISC_TRUE, then we need to preserve all
+ * the keys in the keyset, regardless of whether they have
+ * metadata indicating they should be deactivated or removed.
+ */
+static void
+addkey(dns_dnsseckeylist_t *keylist, dst_key_t **newkey,
+ isc_boolean_t savekeys, isc_mem_t *mctx)
+{
+ dns_dnsseckey_t *key;
+
+ /* Skip duplicates */
+ for (key = ISC_LIST_HEAD(*keylist);
+ key != NULL;
+ key = ISC_LIST_NEXT(key, link)) {
+ if (dst_key_id(key->key) == dst_key_id(*newkey) &&
+ dst_key_alg(key->key) == dst_key_alg(*newkey) &&
+ dns_name_equal(dst_key_name(key->key),
+ dst_key_name(*newkey)))
+ break;
+ }
+
+ if (key != NULL) {
+ /*
+ * Found a match. If the old key was only public and the
+ * new key is private, replace the old one; otherwise
+ * leave it. But either way, mark the key as having
+ * been found in the zone.
+ */
+ if (dst_key_isprivate(key->key)) {
+ dst_key_free(newkey);
+ } else if (dst_key_isprivate(*newkey)) {
+ dst_key_free(&key->key);
+ key->key = *newkey;
+ }
+
+ key->source = dns_keysource_zoneapex;
+ return;
+ }
+
+ dns_dnsseckey_create(mctx, newkey, &key);
+ if (key->legacy || savekeys) {
+ key->force_publish = ISC_TRUE;
+ key->force_sign = dst_key_isprivate(key->key);
+ }
+ key->source = dns_keysource_zoneapex;
+ ISC_LIST_APPEND(*keylist, key, link);
+ *newkey = NULL;
+}
+
+
+/*%
+ * Mark all keys which signed the DNSKEY/SOA RRsets as "active",
+ * for future reference.
+ */
+static isc_result_t
+mark_active_keys(dns_dnsseckeylist_t *keylist, dns_rdataset_t *rrsigs) {
+ isc_result_t result = ISC_R_SUCCESS;
+ dns_rdata_t rdata = DNS_RDATA_INIT;
+ dns_rdataset_t sigs;
+ dns_dnsseckey_t *key;
+
+ REQUIRE(rrsigs != NULL && dns_rdataset_isassociated(rrsigs));
+
+ dns_rdataset_init(&sigs);
+ dns_rdataset_clone(rrsigs, &sigs);
+ for (key = ISC_LIST_HEAD(*keylist);
+ key != NULL;
+ key = ISC_LIST_NEXT(key, link)) {
+ isc_uint16_t keyid, sigid;
+ dns_secalg_t keyalg, sigalg;
+ keyid = dst_key_id(key->key);
+ keyalg = dst_key_alg(key->key);
+
+ for (result = dns_rdataset_first(&sigs);
+ result == ISC_R_SUCCESS;
+ result = dns_rdataset_next(&sigs)) {
+ dns_rdata_rrsig_t sig;
+
+ dns_rdata_reset(&rdata);
+ dns_rdataset_current(&sigs, &rdata);
+ result = dns_rdata_tostruct(&rdata, &sig, NULL);
+ RUNTIME_CHECK(result == ISC_R_SUCCESS);
+ sigalg = sig.algorithm;
+ sigid = sig.keyid;
+ if (keyid == sigid && keyalg == sigalg) {
+ key->is_active = ISC_TRUE;
+ break;
+ }
+ }
+ }
+
+ if (result == ISC_R_NOMORE)
+ result = ISC_R_SUCCESS;
+
+ if (dns_rdataset_isassociated(&sigs))
+ dns_rdataset_disassociate(&sigs);
+ return (result);
+}
+
+/*%
+ * Add the contents of a DNSKEY rdataset 'keyset' to 'keylist'.
+ */
+isc_result_t
+dns_dnssec_keylistfromrdataset(dns_name_t *origin,
+ const char *directory, isc_mem_t *mctx,
+ dns_rdataset_t *keyset, dns_rdataset_t *keysigs,
+ dns_rdataset_t *soasigs, isc_boolean_t savekeys,
+ isc_boolean_t public,
+ dns_dnsseckeylist_t *keylist)
+{
+ dns_rdataset_t keys;
+ dns_rdata_t rdata = DNS_RDATA_INIT;
+ dst_key_t *pubkey = NULL, *privkey = NULL;
+ isc_result_t result;
+
+ REQUIRE(keyset != NULL && dns_rdataset_isassociated(keyset));
+
+ dns_rdataset_init(&keys);
+
+ dns_rdataset_clone(keyset, &keys);
+ for (result = dns_rdataset_first(&keys);
+ result == ISC_R_SUCCESS;
+ result = dns_rdataset_next(&keys)) {
+ dns_rdata_reset(&rdata);
+ dns_rdataset_current(&keys, &rdata);
+ RETERR(dns_dnssec_keyfromrdata(origin, &rdata, mctx, &pubkey));
+
+ if (!is_zone_key(pubkey) ||
+ (dst_key_flags(pubkey) & DNS_KEYTYPE_NOAUTH) != 0)
+ goto skip;
+
+ /* Corrupted .key file? */
+ if (!dns_name_equal(origin, dst_key_name(pubkey)))
+ goto skip;
+
+ if (public) {
+ addkey(keylist, &pubkey, savekeys, mctx);
+ goto skip;
+ }
+
+ result = dst_key_fromfile(dst_key_name(pubkey),
+ dst_key_id(pubkey),
+ dst_key_alg(pubkey),
+ DST_TYPE_PUBLIC|DST_TYPE_PRIVATE,
+ directory, mctx, &privkey);
+
+ /*
+ * If the key was revoked and the private file
+ * doesn't exist, maybe it was revoked internally
+ * by named. Try loading the unrevoked version.
+ */
+ if (result == ISC_R_FILENOTFOUND) {
+ isc_uint32_t flags;
+ flags = dst_key_flags(pubkey);
+ if ((flags & DNS_KEYFLAG_REVOKE) != 0) {
+ dst_key_setflags(pubkey,
+ flags & ~DNS_KEYFLAG_REVOKE);
+ result = dst_key_fromfile(dst_key_name(pubkey),
+ dst_key_id(pubkey),
+ dst_key_alg(pubkey),
+ DST_TYPE_PUBLIC|
+ DST_TYPE_PRIVATE,
+ directory,
+ mctx, &privkey);
+ if (result == ISC_R_SUCCESS &&
+ dst_key_pubcompare(pubkey, privkey,
+ ISC_FALSE)) {
+ dst_key_setflags(privkey, flags);
+ }
+ dst_key_setflags(pubkey, flags);
+ }
+ }
+
+ if (result != ISC_R_SUCCESS) {
+ char keybuf[DNS_NAME_FORMATSIZE];
+ char algbuf[DNS_SECALG_FORMATSIZE];
+ dns_name_format(dst_key_name(pubkey), keybuf,
+ sizeof(keybuf));
+ dns_secalg_format(dst_key_alg(pubkey), algbuf,
+ sizeof(algbuf));
+ isc_log_write(dns_lctx, DNS_LOGCATEGORY_GENERAL,
+ DNS_LOGMODULE_DNSSEC, ISC_LOG_WARNING,
+ "dns_dnssec_keylistfromrdataset: error "
+ "reading private key file %s/%s/%d: %s",
+ keybuf, algbuf, dst_key_id(pubkey),
+ isc_result_totext(result));
+ }
+
+ if (result == ISC_R_FILENOTFOUND || result == ISC_R_NOPERM) {
+ addkey(keylist, &pubkey, savekeys, mctx);
+ goto skip;
+ }
+ RETERR(result);
+
+ /* This should never happen. */
+ if ((dst_key_flags(privkey) & DNS_KEYTYPE_NOAUTH) != 0)
+ goto skip;
+
+ addkey(keylist, &privkey, savekeys, mctx);
+ skip:
+ if (pubkey != NULL)
+ dst_key_free(&pubkey);
+ if (privkey != NULL)
+ dst_key_free(&privkey);
+ }
+
+ if (result != ISC_R_NOMORE)
+ RETERR(result);
+
+ if (keysigs != NULL && dns_rdataset_isassociated(keysigs))
+ RETERR(mark_active_keys(keylist, keysigs));
+
+ if (soasigs != NULL && dns_rdataset_isassociated(soasigs))
+ RETERR(mark_active_keys(keylist, soasigs));
+
+ result = ISC_R_SUCCESS;
+
+ failure:
+ if (dns_rdataset_isassociated(&keys))
+ dns_rdataset_disassociate(&keys);
+ if (pubkey != NULL)
+ dst_key_free(&pubkey);
+ if (privkey != NULL)
+ dst_key_free(&privkey);
+ return (result);
+}
+
+static isc_result_t
+make_dnskey(dst_key_t *key, unsigned char *buf, int bufsize,
+ dns_rdata_t *target)
+{
+ isc_result_t result;
+ isc_buffer_t b;
+ isc_region_t r;
+
+ isc_buffer_init(&b, buf, bufsize);
+ result = dst_key_todns(key, &b);
+ if (result != ISC_R_SUCCESS)
+ return (result);
+
+ dns_rdata_reset(target);
+ isc_buffer_usedregion(&b, &r);
+ dns_rdata_fromregion(target, dst_key_class(key),
+ dns_rdatatype_dnskey, &r);
+ return (ISC_R_SUCCESS);
+}
+
+static isc_result_t
+publish_key(dns_diff_t *diff, dns_dnsseckey_t *key, dns_name_t *origin,
+ dns_ttl_t ttl, isc_mem_t *mctx, isc_boolean_t allzsk,
+ void (*report)(const char *, ...))
+{
+ isc_result_t result;
+ dns_difftuple_t *tuple = NULL;
+ unsigned char buf[DST_KEY_MAXSIZE];
+ dns_rdata_t dnskey = DNS_RDATA_INIT;
+ char alg[80];
+
+ dns_rdata_reset(&dnskey);
+ RETERR(make_dnskey(key->key, buf, sizeof(buf), &dnskey));
+
+ dns_secalg_format(dst_key_alg(key->key), alg, sizeof(alg));
+ report("Fetching %s %d/%s from key %s.",
+ key->ksk ? (allzsk ? "KSK/ZSK" : "KSK") : "ZSK",
+ dst_key_id(key->key), alg,
+ key->source == dns_keysource_user ? "file" : "repository");
+
+ if (key->prepublish && ttl > key->prepublish) {
+ char keystr[DST_KEY_FORMATSIZE];
+ isc_stdtime_t now;
+
+ dst_key_format(key->key, keystr, sizeof(keystr));
+ report("Key %s: Delaying activation to match the DNSKEY TTL.\n",
+ keystr, ttl);
+
+ isc_stdtime_get(&now);
+ dst_key_settime(key->key, DST_TIME_ACTIVATE, now + ttl);
+ }
+
+ /* publish key */
+ RETERR(dns_difftuple_create(mctx, DNS_DIFFOP_ADD, origin, ttl,
+ &dnskey, &tuple));
+ dns_diff_appendminimal(diff, &tuple);
+ result = ISC_R_SUCCESS;
+
+ failure:
+ return (result);
+}
+
+static isc_result_t
+remove_key(dns_diff_t *diff, dns_dnsseckey_t *key, dns_name_t *origin,
+ dns_ttl_t ttl, isc_mem_t *mctx, const char *reason,
+ void (*report)(const char *, ...))
+{
+ isc_result_t result;
+ dns_difftuple_t *tuple = NULL;
+ unsigned char buf[DST_KEY_MAXSIZE];
+ dns_rdata_t dnskey = DNS_RDATA_INIT;
+ char alg[80];
+
+ dns_secalg_format(dst_key_alg(key->key), alg, sizeof(alg));
+ report("Removing %s key %d/%s from DNSKEY RRset.",
+ reason, dst_key_id(key->key), alg);
+
+ RETERR(make_dnskey(key->key, buf, sizeof(buf), &dnskey));
+ RETERR(dns_difftuple_create(mctx, DNS_DIFFOP_DEL, origin, ttl, &dnskey,
+ &tuple));
+ dns_diff_appendminimal(diff, &tuple);
+ result = ISC_R_SUCCESS;
+
+ failure:
+ return (result);
+}
+
+/*
+ * Update 'keys' with information from 'newkeys'.
+ *
+ * If 'removed' is not NULL, any keys that are being removed from
+ * the zone will be added to the list for post-removal processing.
+ */
+isc_result_t
+dns_dnssec_updatekeys(dns_dnsseckeylist_t *keys, dns_dnsseckeylist_t *newkeys,
+ dns_dnsseckeylist_t *removed, dns_name_t *origin,
+ dns_ttl_t ttl, dns_diff_t *diff, isc_boolean_t allzsk,
+ isc_mem_t *mctx, void (*report)(const char *, ...))
+{
+ isc_result_t result;
+ dns_dnsseckey_t *key, *key1, *key2, *next;
+
+ /*
+ * First, look through the existing key list to find keys
+ * supplied from the command line which are not in the zone.
+ * Update the zone to include them.
+ */
+ for (key = ISC_LIST_HEAD(*keys);
+ key != NULL;
+ key = ISC_LIST_NEXT(key, link)) {
+ if (key->source == dns_keysource_user &&
+ (key->hint_publish || key->force_publish)) {
+ RETERR(publish_key(diff, key, origin, ttl,
+ mctx, allzsk, report));
+ }
+ }
+
+ /*
+ * Second, scan the list of newly found keys looking for matches
+ * with known keys, and update accordingly.
+ */
+ for (key1 = ISC_LIST_HEAD(*newkeys); key1 != NULL; key1 = next) {
+ isc_boolean_t key_revoked = ISC_FALSE;
+
+ next = ISC_LIST_NEXT(key1, link);
+
+ for (key2 = ISC_LIST_HEAD(*keys);
+ key2 != NULL;
+ key2 = ISC_LIST_NEXT(key2, link)) {
+ if (dst_key_pubcompare(key1->key, key2->key,
+ ISC_TRUE)) {
+ int r1, r2;
+ r1 = dst_key_flags(key1->key) &
+ DNS_KEYFLAG_REVOKE;
+ r2 = dst_key_flags(key2->key) &
+ DNS_KEYFLAG_REVOKE;
+ key_revoked = ISC_TF(r1 != r2);
+ break;
+ }
+ }
+
+ /* No match found in keys; add the new key. */
+ if (key2 == NULL) {
+ dns_dnsseckey_t *next;
+
+ next = ISC_LIST_NEXT(key1, link);
+ ISC_LIST_UNLINK(*newkeys, key1, link);
+ ISC_LIST_APPEND(*keys, key1, link);
+
+ if (key1->source != dns_keysource_zoneapex &&
+ (key1->hint_publish || key1->force_publish)) {
+ RETERR(publish_key(diff, key1, origin, ttl,
+ mctx, allzsk, report));
+ if (key1->hint_sign || key1->force_sign)
+ key1->first_sign = ISC_TRUE;
+ }
+
+ continue;
+ }
+
+ /* Match found: remove or update it as needed */
+ if (key1->hint_remove) {
+ RETERR(remove_key(diff, key2, origin, ttl, mctx,
+ "expired", report));
+ ISC_LIST_UNLINK(*keys, key2, link);
+ if (removed != NULL)
+ ISC_LIST_APPEND(*removed, key2, link);
+ else
+ dns_dnsseckey_destroy(mctx, &key2);
+ } else if (key_revoked &&
+ (dst_key_flags(key1->key) & DNS_KEYFLAG_REVOKE) != 0) {
+
+ /*
+ * A previously valid key has been revoked.
+ * We need to remove the old version and pull
+ * in the new one.
+ */
+ RETERR(remove_key(diff, key2, origin, ttl, mctx,
+ "revoked", report));
+ ISC_LIST_UNLINK(*keys, key2, link);
+ if (removed != NULL)
+ ISC_LIST_APPEND(*removed, key2, link);
+ else
+ dns_dnsseckey_destroy(mctx, &key2);
+
+ RETERR(publish_key(diff, key1, origin, ttl,
+ mctx, allzsk, report));
+ ISC_LIST_UNLINK(*newkeys, key1, link);
+ ISC_LIST_APPEND(*keys, key1, link);
+
+ /*
+ * XXX: The revoke flag is only defined for trust
+ * anchors. Setting the flag on a non-KSK is legal,
+ * but not defined in any RFC. It seems reasonable
+ * to treat it the same as a KSK: keep it in the
+ * zone, sign the DNSKEY set with it, but not
+ * sign other records with it.
+ */
+ key1->ksk = ISC_TRUE;
+ continue;
+ } else {
+ if (!key2->is_active &&
+ (key1->hint_sign || key1->force_sign))
+ key2->first_sign = ISC_TRUE;
+ key2->hint_sign = key1->hint_sign;
+ key2->hint_publish = key1->hint_publish;
+ }
+ }
+
+ /* Free any leftover keys in newkeys */
+ while (!ISC_LIST_EMPTY(*newkeys)) {
+ key1 = ISC_LIST_HEAD(*newkeys);
+ ISC_LIST_UNLINK(*newkeys, key1, link);
+ dns_dnsseckey_destroy(mctx, &key1);
+ }
+
+ result = ISC_R_SUCCESS;
+
+ failure:
+ return (result);
+}
diff --git a/contrib/bind9/lib/dns/ds.c b/contrib/bind9/lib/dns/ds.c
index 9cf5659..80e1503 100644
--- a/contrib/bind9/lib/dns/ds.c
+++ b/contrib/bind9/lib/dns/ds.c
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004-2007 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004-2007, 2010 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 2002, 2003 Internet Software Consortium.
*
* Permission to use, copy, modify, and/or distribute this software for any
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: ds.c,v 1.11 2007-06-19 23:47:16 tbox Exp $ */
+/* $Id: ds.c,v 1.13 2010-12-23 23:47:08 tbox Exp $ */
/*! \file */
@@ -38,6 +38,13 @@
#include <dst/dst.h>
+#ifdef HAVE_OPENSSL_GOST
+#include <dst/result.h>
+#include <openssl/evp.h>
+
+extern const EVP_MD * EVP_gost(void);
+#endif
+
isc_result_t
dns_ds_buildrdata(dns_name_t *owner, dns_rdata_t *key,
unsigned int digest_type, unsigned char *buffer,
@@ -49,6 +56,12 @@ dns_ds_buildrdata(dns_name_t *owner, dns_rdata_t *key,
isc_region_t r;
isc_buffer_t b;
dns_rdata_ds_t ds;
+ isc_sha1_t sha1;
+ isc_sha256_t sha256;
+#ifdef HAVE_OPENSSL_GOST
+ EVP_MD_CTX ctx;
+ const EVP_MD *md;
+#endif
REQUIRE(key != NULL);
REQUIRE(key->type == dns_rdatatype_dnskey);
@@ -63,8 +76,8 @@ dns_ds_buildrdata(dns_name_t *owner, dns_rdata_t *key,
memset(buffer, 0, DNS_DS_BUFFERSIZE);
isc_buffer_init(&b, buffer, DNS_DS_BUFFERSIZE);
- if (digest_type == DNS_DSDIGEST_SHA1) {
- isc_sha1_t sha1;
+ switch (digest_type) {
+ case DNS_DSDIGEST_SHA1:
isc_sha1_init(&sha1);
dns_name_toregion(name, &r);
isc_sha1_update(&sha1, r.base, r.length);
@@ -72,8 +85,33 @@ dns_ds_buildrdata(dns_name_t *owner, dns_rdata_t *key,
INSIST(r.length >= 4);
isc_sha1_update(&sha1, r.base, r.length);
isc_sha1_final(&sha1, digest);
- } else {
- isc_sha256_t sha256;
+ break;
+#ifdef HAVE_OPENSSL_GOST
+#define CHECK(x) \
+ if ((x) != 1) { \
+ EVP_MD_CTX_cleanup(&ctx); \
+ return (DST_R_OPENSSLFAILURE); \
+ }
+
+ case DNS_DSDIGEST_GOST:
+ md = EVP_gost();
+ if (md == NULL)
+ return (DST_R_OPENSSLFAILURE);
+ EVP_MD_CTX_init(&ctx);
+ CHECK(EVP_DigestInit(&ctx, md));
+ dns_name_toregion(name, &r);
+ CHECK(EVP_DigestUpdate(&ctx,
+ (const void *) r.base,
+ (size_t) r.length));
+ dns_rdata_toregion(key, &r);
+ INSIST(r.length >= 4);
+ CHECK(EVP_DigestUpdate(&ctx,
+ (const void *) r.base,
+ (size_t) r.length));
+ CHECK(EVP_DigestFinal(&ctx, digest, NULL));
+ break;
+#endif
+ default:
isc_sha256_init(&sha256);
dns_name_toregion(name, &r);
isc_sha256_update(&sha256, r.base, r.length);
@@ -81,6 +119,7 @@ dns_ds_buildrdata(dns_name_t *owner, dns_rdata_t *key,
INSIST(r.length >= 4);
isc_sha256_update(&sha256, r.base, r.length);
isc_sha256_final(digest, &sha256);
+ break;
}
ds.mctx = NULL;
@@ -89,8 +128,19 @@ dns_ds_buildrdata(dns_name_t *owner, dns_rdata_t *key,
ds.algorithm = r.base[3];
ds.key_tag = dst_region_computeid(&r, ds.algorithm);
ds.digest_type = digest_type;
- ds.length = (digest_type == DNS_DSDIGEST_SHA1) ?
- ISC_SHA1_DIGESTLENGTH : ISC_SHA256_DIGESTLENGTH;
+ switch (digest_type) {
+ case DNS_DSDIGEST_SHA1:
+ ds.length = ISC_SHA1_DIGESTLENGTH;
+ break;
+#ifdef HAVE_OPENSSL_GOST
+ case DNS_DSDIGEST_GOST:
+ ds.length = ISC_GOST_DIGESTLENGTH;
+ break;
+#endif
+ default:
+ ds.length = ISC_SHA256_DIGESTLENGTH;
+ break;
+ }
ds.digest = digest;
return (dns_rdata_fromstruct(rdata, key->rdclass, dns_rdatatype_ds,
@@ -99,6 +149,12 @@ dns_ds_buildrdata(dns_name_t *owner, dns_rdata_t *key,
isc_boolean_t
dns_ds_digest_supported(unsigned int digest_type) {
+#ifdef HAVE_OPENSSL_GOST
+ return (ISC_TF(digest_type == DNS_DSDIGEST_SHA1 ||
+ digest_type == DNS_DSDIGEST_SHA256 ||
+ digest_type == DNS_DSDIGEST_GOST));
+#else
return (ISC_TF(digest_type == DNS_DSDIGEST_SHA1 ||
digest_type == DNS_DSDIGEST_SHA256));
+#endif
}
diff --git a/contrib/bind9/lib/dns/dst_api.c b/contrib/bind9/lib/dns/dst_api.c
index 97d2657..1ece312 100644
--- a/contrib/bind9/lib/dns/dst_api.c
+++ b/contrib/bind9/lib/dns/dst_api.c
@@ -1,5 +1,5 @@
/*
- * Portions Copyright (C) 2004-2010 Internet Systems Consortium, Inc. ("ISC")
+ * Portions Copyright (C) 2004-2011 Internet Systems Consortium, Inc. ("ISC")
* Portions Copyright (C) 1999-2003 Internet Software Consortium.
*
* Permission to use, copy, modify, and/or distribute this software for any
@@ -31,7 +31,7 @@
/*
* Principal Author: Brian Wellington
- * $Id: dst_api.c,v 1.16.12.12 2010-12-09 01:12:55 marka Exp $
+ * $Id: dst_api.c,v 1.57 2011-01-11 23:47:13 tbox Exp $
*/
/*! \file */
@@ -39,6 +39,7 @@
#include <config.h>
#include <stdlib.h>
+#include <time.h>
#include <isc/buffer.h>
#include <isc/dir.h>
@@ -48,6 +49,7 @@
#include <isc/lex.h>
#include <isc/mem.h>
#include <isc/once.h>
+#include <isc/platform.h>
#include <isc/print.h>
#include <isc/refcount.h>
#include <isc/random.h>
@@ -70,7 +72,9 @@
#define DST_AS_STR(t) ((t).value.as_textregion.base)
static dst_func_t *dst_t_func[DST_MAX_ALGS];
+#ifdef BIND9
static isc_entropy_t *dst_entropy_pool = NULL;
+#endif
static unsigned int dst_entropy_flags = 0;
static isc_boolean_t dst_initialized = ISC_FALSE;
@@ -108,10 +112,11 @@ static isc_result_t frombuffer(dns_name_t *name,
static isc_result_t algorithm_status(unsigned int alg);
-static isc_result_t addsuffix(char *filename, unsigned int len,
- const char *ofilename, const char *suffix);
+static isc_result_t addsuffix(char *filename, int len,
+ const char *dirname, const char *ofilename,
+ const char *suffix);
-#define RETERR(x) \
+#define RETERR(x) \
do { \
result = (x); \
if (result != ISC_R_SUCCESS) \
@@ -126,7 +131,7 @@ static isc_result_t addsuffix(char *filename, unsigned int len,
return (_r); \
} while (0); \
-#ifdef OPENSSL
+#if defined(OPENSSL) && defined(BIND9)
static void *
default_memalloc(void *arg, size_t size) {
UNUSED(arg);
@@ -144,14 +149,29 @@ default_memfree(void *arg, void *ptr) {
isc_result_t
dst_lib_init(isc_mem_t *mctx, isc_entropy_t *ectx, unsigned int eflags) {
+ return (dst_lib_init2(mctx, ectx, NULL, eflags));
+}
+
+isc_result_t
+dst_lib_init2(isc_mem_t *mctx, isc_entropy_t *ectx,
+ const char *engine, unsigned int eflags) {
isc_result_t result;
- REQUIRE(mctx != NULL && ectx != NULL);
+ REQUIRE(mctx != NULL);
+#ifdef BIND9
+ REQUIRE(ectx != NULL);
+#else
+ UNUSED(ectx);
+#endif
REQUIRE(dst_initialized == ISC_FALSE);
+#ifndef OPENSSL
+ UNUSED(engine);
+#endif
+
dst__memory_pool = NULL;
-#ifdef OPENSSL
+#if defined(OPENSSL) && defined(BIND9)
UNUSED(mctx);
/*
* When using --with-openssl, there seems to be no good way of not
@@ -166,11 +186,15 @@ dst_lib_init(isc_mem_t *mctx, isc_entropy_t *ectx, unsigned int eflags) {
if (result != ISC_R_SUCCESS)
return (result);
isc_mem_setname(dst__memory_pool, "dst", NULL);
+#ifndef OPENSSL_LEAKS
isc_mem_setdestroycheck(dst__memory_pool, ISC_FALSE);
+#endif
#else
isc_mem_attach(mctx, &dst__memory_pool);
#endif
+#ifdef BIND9
isc_entropy_attach(ectx, &dst_entropy_pool);
+#endif
dst_entropy_flags = eflags;
dst_result_register();
@@ -183,7 +207,7 @@ dst_lib_init(isc_mem_t *mctx, isc_entropy_t *ectx, unsigned int eflags) {
RETERR(dst__hmacsha384_init(&dst_t_func[DST_ALG_HMACSHA384]));
RETERR(dst__hmacsha512_init(&dst_t_func[DST_ALG_HMACSHA512]));
#ifdef OPENSSL
- RETERR(dst__openssl_init());
+ RETERR(dst__openssl_init(engine));
RETERR(dst__opensslrsa_init(&dst_t_func[DST_ALG_RSAMD5],
DST_ALG_RSAMD5));
RETERR(dst__opensslrsa_init(&dst_t_func[DST_ALG_RSASHA1],
@@ -199,6 +223,9 @@ dst_lib_init(isc_mem_t *mctx, isc_entropy_t *ectx, unsigned int eflags) {
RETERR(dst__openssldsa_init(&dst_t_func[DST_ALG_NSEC3DSA]));
#endif
RETERR(dst__openssldh_init(&dst_t_func[DST_ALG_DH]));
+#ifdef HAVE_OPENSSL_GOST
+ RETERR(dst__opensslgost_init(&dst_t_func[DST_ALG_ECCGOST]));
+#endif
#endif /* OPENSSL */
#ifdef GSSAPI
RETERR(dst__gssapi_init(&dst_t_func[DST_ALG_GSSAPI]));
@@ -207,6 +234,8 @@ dst_lib_init(isc_mem_t *mctx, isc_entropy_t *ectx, unsigned int eflags) {
return (ISC_R_SUCCESS);
out:
+ /* avoid immediate crash! */
+ dst_initialized = ISC_TRUE;
dst_lib_destroy();
return (result);
}
@@ -225,9 +254,10 @@ dst_lib_destroy(void) {
#endif
if (dst__memory_pool != NULL)
isc_mem_detach(&dst__memory_pool);
+#ifdef BIND9
if (dst_entropy_pool != NULL)
isc_entropy_detach(&dst_entropy_pool);
-
+#endif
}
isc_boolean_t
@@ -402,7 +432,7 @@ dst_key_fromfile(dns_name_t *name, dns_keytag_t id,
return (result);
key = NULL;
- result = dst_key_fromnamedfile(filename, type, mctx, &key);
+ result = dst_key_fromnamedfile(filename, NULL, type, mctx, &key);
if (result != ISC_R_SUCCESS)
return (result);
@@ -424,12 +454,11 @@ dst_key_fromfile(dns_name_t *name, dns_keytag_t id,
}
isc_result_t
-dst_key_fromnamedfile(const char *filename, int type, isc_mem_t *mctx,
- dst_key_t **keyp)
+dst_key_fromnamedfile(const char *filename, const char *dirname,
+ int type, isc_mem_t *mctx, dst_key_t **keyp)
{
isc_result_t result;
dst_key_t *pubkey = NULL, *key = NULL;
- dns_keytag_t id;
char *newfilename = NULL;
int newfilenamelen = 0;
isc_lex_t *lex = NULL;
@@ -440,11 +469,23 @@ dst_key_fromnamedfile(const char *filename, int type, isc_mem_t *mctx,
REQUIRE(mctx != NULL);
REQUIRE(keyp != NULL && *keyp == NULL);
+ /* If an absolute path is specified, don't use the key directory */
+#ifndef WIN32
+ if (filename[0] == '/')
+ dirname = NULL;
+#else /* WIN32 */
+ if (filename[0] == '/' || filename[0] == '\\')
+ dirname = NULL;
+#endif
+
newfilenamelen = strlen(filename) + 5;
+ if (dirname != NULL)
+ newfilenamelen += strlen(dirname) + 1;
newfilename = isc_mem_get(mctx, newfilenamelen);
if (newfilename == NULL)
return (ISC_R_NOMEMORY);
- result = addsuffix(newfilename, newfilenamelen, filename, ".key");
+ result = addsuffix(newfilename, newfilenamelen,
+ dirname, filename, ".key");
INSIST(result == ISC_R_SUCCESS);
result = dst_key_read_public(newfilename, type, mctx, &pubkey);
@@ -474,38 +515,43 @@ dst_key_fromnamedfile(const char *filename, int type, isc_mem_t *mctx,
key = get_key_struct(pubkey->key_name, pubkey->key_alg,
pubkey->key_flags, pubkey->key_proto, 0,
pubkey->key_class, mctx);
- id = pubkey->key_id;
- dst_key_free(&pubkey);
-
- if (key == NULL)
+ if (key == NULL) {
+ dst_key_free(&pubkey);
return (ISC_R_NOMEMORY);
+ }
if (key->func->parse == NULL)
RETERR(DST_R_UNSUPPORTEDALG);
newfilenamelen = strlen(filename) + 9;
+ if (dirname != NULL)
+ newfilenamelen += strlen(dirname) + 1;
newfilename = isc_mem_get(mctx, newfilenamelen);
if (newfilename == NULL)
RETERR(ISC_R_NOMEMORY);
- result = addsuffix(newfilename, newfilenamelen, filename, ".private");
+ result = addsuffix(newfilename, newfilenamelen,
+ dirname, filename, ".private");
INSIST(result == ISC_R_SUCCESS);
RETERR(isc_lex_create(mctx, 1500, &lex));
RETERR(isc_lex_openfile(lex, newfilename));
isc_mem_put(mctx, newfilename, newfilenamelen);
- RETERR(key->func->parse(key, lex));
+ RETERR(key->func->parse(key, lex, pubkey));
isc_lex_destroy(&lex);
RETERR(computeid(key));
- if (id != key->key_id)
+ if (pubkey->key_id != key->key_id)
RETERR(DST_R_INVALIDPRIVATEKEY);
+ dst_key_free(&pubkey);
*keyp = key;
return (ISC_R_SUCCESS);
out:
+ if (pubkey != NULL)
+ dst_key_free(&pubkey);
if (newfilename != NULL)
isc_mem_put(mctx, newfilename, newfilenamelen);
if (lex != NULL)
@@ -640,7 +686,7 @@ dst_key_privatefrombuffer(dst_key_t *key, isc_buffer_t *buffer) {
RETERR(isc_lex_create(key->mctx, 1500, &lex));
RETERR(isc_lex_openbuffer(lex, buffer));
- RETERR(key->func->parse(key, lex));
+ RETERR(key->func->parse(key, lex, NULL));
out:
if (lex != NULL)
isc_lex_destroy(&lex);
@@ -657,9 +703,10 @@ dst_key_getgssctx(const dst_key_t *key)
isc_result_t
dst_key_fromgssapi(dns_name_t *name, gss_ctx_id_t gssctx, isc_mem_t *mctx,
- dst_key_t **keyp)
+ dst_key_t **keyp, isc_region_t *intoken)
{
dst_key_t *key;
+ isc_result_t result;
REQUIRE(gssctx != NULL);
REQUIRE(keyp != NULL && *keyp == NULL);
@@ -669,9 +716,21 @@ dst_key_fromgssapi(dns_name_t *name, gss_ctx_id_t gssctx, isc_mem_t *mctx,
if (key == NULL)
return (ISC_R_NOMEMORY);
+ if (intoken != NULL) {
+ /*
+ * Keep the token for use by external ssu rules. They may need
+ * to examine the PAC in the kerberos ticket.
+ */
+ RETERR(isc_buffer_allocate(key->mctx, &key->key_tkeytoken,
+ intoken->length));
+ RETERR(isc_buffer_copyregion(key->key_tkeytoken, intoken));
+ }
+
key->keydata.gssctx = gssctx;
*keyp = key;
- return (ISC_R_SUCCESS);
+ result = ISC_R_SUCCESS;
+out:
+ return result;
}
isc_result_t
@@ -723,6 +782,18 @@ dst_key_generate(dns_name_t *name, unsigned int alg,
dns_rdataclass_t rdclass,
isc_mem_t *mctx, dst_key_t **keyp)
{
+ return (dst_key_generate2(name, alg, bits, param, flags, protocol,
+ rdclass, mctx, keyp, NULL));
+}
+
+isc_result_t
+dst_key_generate2(dns_name_t *name, unsigned int alg,
+ unsigned int bits, unsigned int param,
+ unsigned int flags, unsigned int protocol,
+ dns_rdataclass_t rdclass,
+ isc_mem_t *mctx, dst_key_t **keyp,
+ void (*callback)(int))
+{
dst_key_t *key;
isc_result_t ret;
@@ -748,7 +819,7 @@ dst_key_generate(dns_name_t *name, unsigned int alg,
return (DST_R_UNSUPPORTEDALG);
}
- ret = key->func->generate(key, param);
+ ret = key->func->generate(key, param, callback);
if (ret != ISC_R_SUCCESS) {
dst_key_free(&key);
return (ret);
@@ -764,25 +835,185 @@ dst_key_generate(dns_name_t *name, unsigned int alg,
return (ISC_R_SUCCESS);
}
-isc_boolean_t
-dst_key_compare(const dst_key_t *key1, const dst_key_t *key2) {
+isc_result_t
+dst_key_getnum(const dst_key_t *key, int type, isc_uint32_t *valuep)
+{
+ REQUIRE(VALID_KEY(key));
+ REQUIRE(valuep != NULL);
+ REQUIRE(type <= DST_MAX_NUMERIC);
+ if (!key->numset[type])
+ return (ISC_R_NOTFOUND);
+ *valuep = key->nums[type];
+ return (ISC_R_SUCCESS);
+}
+
+void
+dst_key_setnum(dst_key_t *key, int type, isc_uint32_t value)
+{
+ REQUIRE(VALID_KEY(key));
+ REQUIRE(type <= DST_MAX_NUMERIC);
+ key->nums[type] = value;
+ key->numset[type] = ISC_TRUE;
+}
+
+void
+dst_key_unsetnum(dst_key_t *key, int type)
+{
+ REQUIRE(VALID_KEY(key));
+ REQUIRE(type <= DST_MAX_NUMERIC);
+ key->numset[type] = ISC_FALSE;
+}
+
+isc_result_t
+dst_key_gettime(const dst_key_t *key, int type, isc_stdtime_t *timep) {
+ REQUIRE(VALID_KEY(key));
+ REQUIRE(timep != NULL);
+ REQUIRE(type <= DST_MAX_TIMES);
+ if (!key->timeset[type])
+ return (ISC_R_NOTFOUND);
+ *timep = key->times[type];
+ return (ISC_R_SUCCESS);
+}
+
+void
+dst_key_settime(dst_key_t *key, int type, isc_stdtime_t when) {
+ REQUIRE(VALID_KEY(key));
+ REQUIRE(type <= DST_MAX_TIMES);
+ key->times[type] = when;
+ key->timeset[type] = ISC_TRUE;
+}
+
+void
+dst_key_unsettime(dst_key_t *key, int type) {
+ REQUIRE(VALID_KEY(key));
+ REQUIRE(type <= DST_MAX_TIMES);
+ key->timeset[type] = ISC_FALSE;
+}
+
+isc_result_t
+dst_key_getprivateformat(const dst_key_t *key, int *majorp, int *minorp) {
+ REQUIRE(VALID_KEY(key));
+ REQUIRE(majorp != NULL);
+ REQUIRE(minorp != NULL);
+ *majorp = key->fmt_major;
+ *minorp = key->fmt_minor;
+ return (ISC_R_SUCCESS);
+}
+
+void
+dst_key_setprivateformat(dst_key_t *key, int major, int minor) {
+ REQUIRE(VALID_KEY(key));
+ key->fmt_major = major;
+ key->fmt_minor = minor;
+}
+
+static isc_boolean_t
+comparekeys(const dst_key_t *key1, const dst_key_t *key2,
+ isc_boolean_t match_revoked_key,
+ isc_boolean_t (*compare)(const dst_key_t *key1,
+ const dst_key_t *key2))
+{
REQUIRE(dst_initialized == ISC_TRUE);
REQUIRE(VALID_KEY(key1));
REQUIRE(VALID_KEY(key2));
if (key1 == key2)
return (ISC_TRUE);
+
if (key1 == NULL || key2 == NULL)
return (ISC_FALSE);
- if (key1->key_alg == key2->key_alg &&
- key1->key_id == key2->key_id &&
- key1->func->compare != NULL &&
- key1->func->compare(key1, key2) == ISC_TRUE)
- return (ISC_TRUE);
+
+ if (key1->key_alg != key2->key_alg)
+ return (ISC_FALSE);
+
+ /*
+ * For all algorithms except RSAMD5, revoking the key
+ * changes the key ID, increasing it by 128. If we want to
+ * be able to find matching keys even if one of them is the
+ * revoked version of the other one, then we need to check
+ * for that possibility.
+ */
+ if (key1->key_id != key2->key_id) {
+ if (!match_revoked_key)
+ return (ISC_FALSE);
+ if (key1->key_alg == DST_ALG_RSAMD5)
+ return (ISC_FALSE);
+ if ((key1->key_flags & DNS_KEYFLAG_REVOKE) ==
+ (key2->key_flags & DNS_KEYFLAG_REVOKE))
+ return (ISC_FALSE);
+ if ((key1->key_flags & DNS_KEYFLAG_REVOKE) != 0 &&
+ key1->key_id != ((key2->key_id + 128) & 0xffff))
+ return (ISC_FALSE);
+ if ((key2->key_flags & DNS_KEYFLAG_REVOKE) != 0 &&
+ key2->key_id != ((key1->key_id + 128) & 0xffff))
+ return (ISC_FALSE);
+ }
+
+ if (compare != NULL)
+ return (compare(key1, key2));
else
return (ISC_FALSE);
}
+
+/*
+ * Compares only the public portion of two keys, by converting them
+ * both to wire format and comparing the results.
+ */
+static isc_boolean_t
+pub_compare(const dst_key_t *key1, const dst_key_t *key2) {
+ isc_result_t result;
+ unsigned char buf1[DST_KEY_MAXSIZE], buf2[DST_KEY_MAXSIZE];
+ isc_buffer_t b1, b2;
+ isc_region_t r1, r2;
+
+ isc_buffer_init(&b1, buf1, sizeof(buf1));
+ result = dst_key_todns(key1, &b1);
+ if (result != ISC_R_SUCCESS)
+ return (ISC_FALSE);
+ /* Zero out flags. */
+ buf1[0] = buf1[1] = 0;
+ if ((key1->key_flags & DNS_KEYFLAG_EXTENDED) != 0)
+ isc_buffer_subtract(&b1, 2);
+
+ isc_buffer_init(&b2, buf2, sizeof(buf2));
+ result = dst_key_todns(key2, &b2);
+ if (result != ISC_R_SUCCESS)
+ return (ISC_FALSE);
+ /* Zero out flags. */
+ buf2[0] = buf2[1] = 0;
+ if ((key2->key_flags & DNS_KEYFLAG_EXTENDED) != 0)
+ isc_buffer_subtract(&b2, 2);
+
+ isc_buffer_usedregion(&b1, &r1);
+ /* Remove extended flags. */
+ if ((key1->key_flags & DNS_KEYFLAG_EXTENDED) != 0) {
+ memmove(&buf1[4], &buf1[6], r1.length - 6);
+ r1.length -= 2;
+ }
+
+ isc_buffer_usedregion(&b2, &r2);
+ /* Remove extended flags. */
+ if ((key2->key_flags & DNS_KEYFLAG_EXTENDED) != 0) {
+ memmove(&buf2[4], &buf2[6], r2.length - 6);
+ r2.length -= 2;
+ }
+ return (ISC_TF(isc_region_compare(&r1, &r2) == 0));
+}
+
+isc_boolean_t
+dst_key_compare(const dst_key_t *key1, const dst_key_t *key2) {
+ return (comparekeys(key1, key2, ISC_FALSE, key1->func->compare));
+}
+
+isc_boolean_t
+dst_key_pubcompare(const dst_key_t *key1, const dst_key_t *key2,
+ isc_boolean_t match_revoked_key)
+{
+ return (comparekeys(key1, key2, match_revoked_key, pub_compare));
+}
+
+
isc_boolean_t
dst_key_paramcompare(const dst_key_t *key1, const dst_key_t *key2) {
REQUIRE(dst_initialized == ISC_TRUE);
@@ -839,6 +1070,9 @@ dst_key_free(dst_key_t **keyp) {
isc_mem_free(mctx, key->label);
dns_name_free(key->key_name, mctx);
isc_mem_put(mctx, key->key_name, sizeof(dns_name_t));
+ if (key->key_tkeytoken) {
+ isc_buffer_free(&key->key_tkeytoken);
+ }
memset(key, 0, sizeof(dst_key_t));
isc_mem_put(mctx, key, sizeof(dst_key_t));
*keyp = NULL;
@@ -882,6 +1116,9 @@ dst_key_sigsize(const dst_key_t *key, unsigned int *n) {
case DST_ALG_NSEC3DSA:
*n = DNS_SIG_DSASIGSIZE;
break;
+ case DST_ALG_ECCGOST:
+ *n = DNS_SIG_GOSTSIGSIZE;
+ break;
case DST_ALG_HMACMD5:
*n = 16;
break;
@@ -923,6 +1160,69 @@ dst_key_secretsize(const dst_key_t *key, unsigned int *n) {
return (ISC_R_SUCCESS);
}
+/*%
+ * Set the flags on a key, then recompute the key ID
+ */
+isc_result_t
+dst_key_setflags(dst_key_t *key, isc_uint32_t flags) {
+ REQUIRE(VALID_KEY(key));
+ key->key_flags = flags;
+ return (computeid(key));
+}
+
+void
+dst_key_format(const dst_key_t *key, char *cp, unsigned int size) {
+ char namestr[DNS_NAME_FORMATSIZE];
+ char algstr[DNS_NAME_FORMATSIZE];
+
+ dns_name_format(dst_key_name(key), namestr, sizeof(namestr));
+ dns_secalg_format((dns_secalg_t) dst_key_alg(key), algstr,
+ sizeof(algstr));
+ snprintf(cp, size, "%s/%s/%d", namestr, algstr, dst_key_id(key));
+}
+
+isc_result_t
+dst_key_dump(dst_key_t *key, isc_mem_t *mctx, char **buffer, int *length) {
+
+ REQUIRE(buffer != NULL && *buffer == NULL);
+ REQUIRE(length != NULL && *length == 0);
+ REQUIRE(VALID_KEY(key));
+
+ if (key->func->isprivate == NULL)
+ return (ISC_R_NOTIMPLEMENTED);
+ return (key->func->dump(key, mctx, buffer, length));
+}
+
+isc_result_t
+dst_key_restore(dns_name_t *name, unsigned int alg, unsigned int flags,
+ unsigned int protocol, dns_rdataclass_t rdclass,
+ isc_mem_t *mctx, const char *keystr, dst_key_t **keyp)
+{
+ isc_result_t result;
+ dst_key_t *key;
+
+ REQUIRE(dst_initialized == ISC_TRUE);
+ REQUIRE(keyp != NULL && *keyp == NULL);
+
+ if (alg >= DST_MAX_ALGS || dst_t_func[alg] == NULL)
+ return (DST_R_UNSUPPORTEDALG);
+
+ if (dst_t_func[alg]->restore == NULL)
+ return (ISC_R_NOTIMPLEMENTED);
+
+ key = get_key_struct(name, alg, flags, protocol, 0, rdclass, mctx);
+ if (key == NULL)
+ return (ISC_R_NOMEMORY);
+
+ result = (dst_t_func[alg]->restore)(key, keystr);
+ if (result == ISC_R_SUCCESS)
+ *keyp = key;
+ else
+ dst_key_free(&key);
+
+ return (result);
+}
+
/***
*** Static methods
***/
@@ -938,6 +1238,7 @@ get_key_struct(dns_name_t *name, unsigned int alg,
{
dst_key_t *key;
isc_result_t result;
+ int i;
key = (dst_key_t *) isc_mem_get(mctx, sizeof(dst_key_t));
if (key == NULL)
@@ -974,6 +1275,12 @@ get_key_struct(dns_name_t *name, unsigned int alg,
key->key_size = bits;
key->key_class = rdclass;
key->func = dst_t_func[alg];
+ key->fmt_major = 0;
+ key->fmt_minor = 0;
+ for (i = 0; i < (DST_MAX_TIMES + 1); i++) {
+ key->times[i] = 0;
+ key->timeset[i] = ISC_FALSE;
+ }
return (key);
}
@@ -1046,7 +1353,7 @@ dst_key_read_public(const char *filename, int type,
isc_buffer_init(&b, DST_AS_STR(token), strlen(DST_AS_STR(token)));
isc_buffer_add(&b, strlen(DST_AS_STR(token)));
ret = dns_name_fromtext(dns_fixedname_name(&name), &b, dns_rootname,
- ISC_FALSE, NULL);
+ 0, NULL);
if (ret != ISC_R_SUCCESS)
goto cleanup;
@@ -1116,6 +1423,7 @@ issymmetric(const dst_key_t *key) {
case DST_ALG_DSA:
case DST_ALG_NSEC3DSA:
case DST_ALG_DH:
+ case DST_ALG_ECCGOST:
return (ISC_FALSE);
case DST_ALG_HMACMD5:
case DST_ALG_GSSAPI:
@@ -1126,6 +1434,55 @@ issymmetric(const dst_key_t *key) {
}
/*%
+ * Write key timing metadata to a file pointer, preceded by 'tag'
+ */
+static void
+printtime(const dst_key_t *key, int type, const char *tag, FILE *stream) {
+ isc_result_t result;
+#ifdef ISC_PLATFORM_USETHREADS
+ char output[26]; /* Minimum buffer as per ctime_r() specification. */
+#else
+ const char *output;
+#endif
+ isc_stdtime_t when;
+ time_t t;
+ char utc[sizeof("YYYYMMDDHHSSMM")];
+ isc_buffer_t b;
+ isc_region_t r;
+
+ result = dst_key_gettime(key, type, &when);
+ if (result == ISC_R_NOTFOUND)
+ return;
+
+ /* time_t and isc_stdtime_t might be different sizes */
+ t = when;
+#ifdef ISC_PLATFORM_USETHREADS
+#ifdef WIN32
+ if (ctime_s(output, sizeof(output), &t) != 0)
+ goto error;
+#else
+ if (ctime_r(&t, output) == NULL)
+ goto error;
+#endif
+#else
+ output = ctime(&t);
+#endif
+
+ isc_buffer_init(&b, utc, sizeof(utc));
+ result = dns_time32_totext(when, &b);
+ if (result != ISC_R_SUCCESS)
+ goto error;
+
+ isc_buffer_usedregion(&b, &r);
+ fprintf(stream, "%s: %.*s (%.*s)\n", tag, (int)r.length, r.base,
+ (int)strlen(output) - 1, output);
+ return;
+
+ error:
+ fprintf(stream, "%s: (set, unable to display)\n", tag);
+}
+
+/*%
* Writes a public key to disk in DNS format.
*/
static isc_result_t
@@ -1184,12 +1541,34 @@ write_public_key(const dst_key_t *key, int type, const char *directory) {
(void)isc_fsaccess_set(filename, access);
}
- ret = dns_name_print(key->key_name, fp);
- if (ret != ISC_R_SUCCESS) {
- fclose(fp);
- return (ret);
+ /* Write key information in comments */
+ if ((type & DST_TYPE_KEY) == 0) {
+ fprintf(fp, "; This is a %s%s-signing key, keyid %d, for ",
+ (key->key_flags & DNS_KEYFLAG_REVOKE) != 0 ?
+ "revoked " :
+ "",
+ (key->key_flags & DNS_KEYFLAG_KSK) != 0 ?
+ "key" :
+ "zone",
+ key->key_id);
+ ret = dns_name_print(key->key_name, fp);
+ if (ret != ISC_R_SUCCESS) {
+ fclose(fp);
+ return (ret);
+ }
+ fputc('\n', fp);
+
+ printtime(key, DST_TIME_CREATED, "; Created", fp);
+ printtime(key, DST_TIME_PUBLISH, "; Publish", fp);
+ printtime(key, DST_TIME_ACTIVATE, "; Activate", fp);
+ printtime(key, DST_TIME_REVOKE, "; Revoke", fp);
+ printtime(key, DST_TIME_INACTIVE, "; Inactive", fp);
+ printtime(key, DST_TIME_DELETE, "; Delete", fp);
}
+ /* Now print the actual key */
+ ret = dns_name_print(key->key_name, fp);
+
fprintf(fp, " ");
isc_buffer_usedregion(&classb, &r);
@@ -1317,15 +1696,16 @@ algorithm_status(unsigned int alg) {
alg == DST_ALG_DSA || alg == DST_ALG_DH ||
alg == DST_ALG_HMACMD5 || alg == DST_ALG_NSEC3DSA ||
alg == DST_ALG_NSEC3RSASHA1 ||
- alg == DST_ALG_RSASHA256 || alg == DST_ALG_RSASHA512)
+ alg == DST_ALG_RSASHA256 || alg == DST_ALG_RSASHA512 ||
+ alg == DST_ALG_ECCGOST)
return (DST_R_NOCRYPTO);
#endif
return (DST_R_UNSUPPORTEDALG);
}
static isc_result_t
-addsuffix(char *filename, unsigned int len, const char *ofilename,
- const char *suffix)
+addsuffix(char *filename, int len, const char *odirname,
+ const char *ofilename, const char *suffix)
{
int olen = strlen(ofilename);
int n;
@@ -1337,27 +1717,42 @@ addsuffix(char *filename, unsigned int len, const char *ofilename,
else if (olen > 4 && strcmp(ofilename + olen - 4, ".key") == 0)
olen -= 4;
- n = snprintf(filename, len, "%.*s%s", olen, ofilename, suffix);
+ if (odirname == NULL)
+ n = snprintf(filename, len, "%.*s%s", olen, ofilename, suffix);
+ else
+ n = snprintf(filename, len, "%s/%.*s%s",
+ odirname, olen, ofilename, suffix);
if (n < 0)
return (ISC_R_FAILURE);
- if ((unsigned int)n >= len)
+ if (n >= len)
return (ISC_R_NOSPACE);
return (ISC_R_SUCCESS);
}
isc_result_t
dst__entropy_getdata(void *buf, unsigned int len, isc_boolean_t pseudo) {
+#ifdef BIND9
unsigned int flags = dst_entropy_flags;
if (len == 0)
return (ISC_R_SUCCESS);
if (pseudo)
flags &= ~ISC_ENTROPY_GOODONLY;
+ else
+ flags |= ISC_ENTROPY_BLOCKING;
return (isc_entropy_getdata(dst_entropy_pool, buf, len, NULL, flags));
+#else
+ UNUSED(buf);
+ UNUSED(len);
+ UNUSED(pseudo);
+
+ return (ISC_R_NOTIMPLEMENTED);
+#endif
}
unsigned int
dst__entropy_status(void) {
+#ifdef BIND9
#ifdef GSSAPI
unsigned int flags = dst_entropy_flags;
isc_result_t ret;
@@ -1376,4 +1771,12 @@ dst__entropy_status(void) {
}
#endif
return (isc_entropy_status(dst_entropy_pool));
+#else
+ return (0);
+#endif
+}
+
+isc_buffer_t *
+dst_key_tkeytoken(const dst_key_t *key) {
+ return (key->key_tkeytoken);
}
diff --git a/contrib/bind9/lib/dns/dst_internal.h b/contrib/bind9/lib/dns/dst_internal.h
index 01bf1f2..220b3da 100644
--- a/contrib/bind9/lib/dns/dst_internal.h
+++ b/contrib/bind9/lib/dns/dst_internal.h
@@ -1,5 +1,5 @@
/*
- * Portions Copyright (C) 2004-2008, 2010 Internet Systems Consortium, Inc. ("ISC")
+ * Portions Copyright (C) 2004-2011 Internet Systems Consortium, Inc. ("ISC")
* Portions Copyright (C) 2000-2002 Internet Software Consortium.
*
* Permission to use, copy, modify, and/or distribute this software for any
@@ -29,7 +29,7 @@
* IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: dst_internal.h,v 1.11.120.3 2010-12-09 01:12:55 marka Exp $ */
+/* $Id: dst_internal.h,v 1.29 2011-01-11 23:47:13 tbox Exp $ */
#ifndef DST_DST_INTERNAL_H
#define DST_DST_INTERNAL_H 1
@@ -44,9 +44,12 @@
#include <isc/refcount.h>
#include <isc/sha1.h>
#include <isc/sha2.h>
+#include <isc/stdtime.h>
#include <isc/hmacmd5.h>
#include <isc/hmacsha.h>
+#include <dns/time.h>
+
#include <dst/dst.h>
#ifdef OPENSSL
@@ -60,8 +63,8 @@
ISC_LANG_BEGINDECLS
-#define KEY_MAGIC ISC_MAGIC('D','S','T','K')
-#define CTX_MAGIC ISC_MAGIC('D','S','T','C')
+#define KEY_MAGIC ISC_MAGIC('D','S','T','K')
+#define CTX_MAGIC ISC_MAGIC('D','S','T','C')
#define VALID_KEY(x) ISC_MAGIC_VALID(x, KEY_MAGIC)
#define VALID_CTX(x) ISC_MAGIC_VALID(x, CTX_MAGIC)
@@ -74,7 +77,7 @@ extern isc_mem_t *dst__memory_pool;
typedef struct dst_func dst_func_t;
-typedef struct dst_hmacmd5_key dst_hmacmd5_key_t;
+typedef struct dst_hmacmd5_key dst_hmacmd5_key_t;
typedef struct dst_hmacsha1_key dst_hmacsha1_key_t;
typedef struct dst_hmacsha224_key dst_hmacsha224_key_t;
typedef struct dst_hmacsha256_key dst_hmacsha256_key_t;
@@ -115,7 +118,17 @@ struct dst_key {
dst_hmacsha512_key_t *hmacsha512;
} keydata; /*%< pointer to key in crypto pkg fmt */
- dst_func_t * func; /*%< crypto package specific functions */
+
+ isc_stdtime_t times[DST_MAX_TIMES + 1]; /*%< timing metadata */
+ isc_boolean_t timeset[DST_MAX_TIMES + 1]; /*%< data set? */
+ isc_stdtime_t nums[DST_MAX_NUMERIC + 1]; /*%< numeric metadata */
+ isc_boolean_t numset[DST_MAX_NUMERIC + 1]; /*%< data set? */
+
+ int fmt_major; /*%< private key format, major version */
+ int fmt_minor; /*%< private key format, minor version */
+
+ dst_func_t * func; /*%< crypto package specific functions */
+ isc_buffer_t *key_tkeytoken; /*%< TKEY token data */
};
struct dst_context {
@@ -160,7 +173,8 @@ struct dst_func {
isc_boolean_t (*compare)(const dst_key_t *key1, const dst_key_t *key2);
isc_boolean_t (*paramcompare)(const dst_key_t *key1,
const dst_key_t *key2);
- isc_result_t (*generate)(dst_key_t *key, int parms);
+ isc_result_t (*generate)(dst_key_t *key, int parms,
+ void (*callback)(int));
isc_boolean_t (*isprivate)(const dst_key_t *key);
void (*destroy)(dst_key_t *key);
@@ -168,19 +182,24 @@ struct dst_func {
isc_result_t (*todns)(const dst_key_t *key, isc_buffer_t *data);
isc_result_t (*fromdns)(dst_key_t *key, isc_buffer_t *data);
isc_result_t (*tofile)(const dst_key_t *key, const char *directory);
- isc_result_t (*parse)(dst_key_t *key, isc_lex_t *lexer);
+ isc_result_t (*parse)(dst_key_t *key,
+ isc_lex_t *lexer,
+ dst_key_t *pub);
/* cleanup */
void (*cleanup)(void);
isc_result_t (*fromlabel)(dst_key_t *key, const char *engine,
const char *label, const char *pin);
+ isc_result_t (*dump)(dst_key_t *key, isc_mem_t *mctx, char **buffer,
+ int *length);
+ isc_result_t (*restore)(dst_key_t *key, const char *keystr);
};
/*%
* Initializers
*/
-isc_result_t dst__openssl_init(void);
+isc_result_t dst__openssl_init(const char *engine);
isc_result_t dst__hmacmd5_init(struct dst_func **funcp);
isc_result_t dst__hmacsha1_init(struct dst_func **funcp);
@@ -193,6 +212,9 @@ isc_result_t dst__opensslrsa_init(struct dst_func **funcp,
isc_result_t dst__openssldsa_init(struct dst_func **funcp);
isc_result_t dst__openssldh_init(struct dst_func **funcp);
isc_result_t dst__gssapi_init(struct dst_func **funcp);
+#ifdef HAVE_OPENSSL_GOST
+isc_result_t dst__opensslgost_init(struct dst_func **funcp);
+#endif
/*%
* Destructors
diff --git a/contrib/bind9/lib/dns/dst_openssl.h b/contrib/bind9/lib/dns/dst_openssl.h
index a095d45..781085b 100644
--- a/contrib/bind9/lib/dns/dst_openssl.h
+++ b/contrib/bind9/lib/dns/dst_openssl.h
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004, 2005, 2007, 2008 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004, 2005, 2007-2009 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 2002 Internet Software Consortium.
*
* Permission to use, copy, modify, and/or distribute this software for any
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: dst_openssl.h,v 1.7 2008-04-01 23:47:10 tbox Exp $ */
+/* $Id: dst_openssl.h,v 1.9 2009-10-06 04:40:14 tbox Exp $ */
#ifndef DST_OPENSSL_H
#define DST_OPENSSL_H 1
@@ -29,10 +29,7 @@ isc_result_t
dst__openssl_toresult(isc_result_t fallback);
ENGINE *
-dst__openssl_getengine(const char *name);
-
-isc_result_t
-dst__openssl_setdefault(const char *name);
+dst__openssl_getengine(const char *engine);
ISC_LANG_ENDDECLS
diff --git a/contrib/bind9/lib/dns/dst_parse.c b/contrib/bind9/lib/dns/dst_parse.c
index 37264be..4d7d784 100644
--- a/contrib/bind9/lib/dns/dst_parse.c
+++ b/contrib/bind9/lib/dns/dst_parse.c
@@ -31,7 +31,7 @@
/*%
* Principal Author: Brian Wellington
- * $Id: dst_parse.c,v 1.14.120.6 2010-01-15 19:38:53 each Exp $
+ * $Id: dst_parse.c,v 1.27 2010-12-23 04:07:58 marka Exp $
*/
#include <config.h>
@@ -41,9 +41,12 @@
#include <isc/fsaccess.h>
#include <isc/lex.h>
#include <isc/mem.h>
+#include <isc/stdtime.h>
#include <isc/string.h>
#include <isc/util.h>
+#include <dns/time.h>
+
#include "dst_internal.h"
#include "dst_parse.h"
#include "dst/result.h"
@@ -53,6 +56,25 @@
#define PRIVATE_KEY_STR "Private-key-format:"
#define ALGORITHM_STR "Algorithm:"
+#define TIMING_NTAGS (DST_MAX_TIMES + 1)
+static const char *timetags[TIMING_NTAGS] = {
+ "Created:",
+ "Publish:",
+ "Activate:",
+ "Revoke:",
+ "Inactive:",
+ "Delete:",
+ "DSPublish:"
+};
+
+#define NUMERIC_NTAGS (DST_MAX_NUMERIC + 1)
+static const char *numerictags[NUMERIC_NTAGS] = {
+ "Predecessor:",
+ "Successor:",
+ "MaxTTL:",
+ "RollPeriod:"
+};
+
struct parse_map {
const int value;
const char *tag;
@@ -82,6 +104,8 @@ static struct parse_map map[] = {
{TAG_DSA_PRIVATE, "Private_value(x):"},
{TAG_DSA_PUBLIC, "Public_value(y):"},
+ {TAG_GOST_PRIVASN1, "GostAsn1:"},
+
{TAG_HMACMD5_KEY, "Key:"},
{TAG_HMACMD5_BITS, "Bits:"},
@@ -107,13 +131,12 @@ static int
find_value(const char *s, const unsigned int alg) {
int i;
- for (i = 0; ; i++) {
- if (map[i].tag == NULL)
- return (-1);
- else if (strcasecmp(s, map[i].tag) == 0 &&
- TAG_ALG(map[i].value) == alg)
+ for (i = 0; map[i].tag != NULL; i++) {
+ if (strcasecmp(s, map[i].tag) == 0 &&
+ (TAG_ALG(map[i].value) == alg))
return (map[i].value);
}
+ return (-1);
}
static const char *
@@ -129,6 +152,28 @@ find_tag(const int value) {
}
static int
+find_metadata(const char *s, const char *tags[], int ntags) {
+ int i;
+
+ for (i = 0; i < ntags; i++) {
+ if (strcasecmp(s, tags[i]) == 0)
+ return (i);
+ }
+
+ return (-1);
+}
+
+static int
+find_timedata(const char *s) {
+ return (find_metadata(s, timetags, TIMING_NTAGS));
+}
+
+static int
+find_numericdata(const char *s) {
+ return (find_metadata(s, numerictags, NUMERIC_NTAGS));
+}
+
+static int
check_rsa(const dst_private_t *priv) {
int i, j;
isc_boolean_t have[RSA_NTAGS];
@@ -197,6 +242,15 @@ check_dsa(const dst_private_t *priv) {
}
static int
+check_gost(const dst_private_t *priv) {
+ if (priv->nelements != GOST_NTAGS)
+ return (-1);
+ if (priv->elements[0].tag != TAG(DST_ALG_ECCGOST, 0))
+ return (-1);
+ return (0);
+}
+
+static int
check_hmac_md5(const dst_private_t *priv, isc_boolean_t old) {
int i, j;
@@ -253,6 +307,8 @@ check_data(const dst_private_t *priv, const unsigned int alg,
return (check_dh(priv));
case DST_ALG_DSA:
return (check_dsa(priv));
+ case DST_ALG_ECCGOST:
+ return (check_gost(priv));
case DST_ALG_HMACMD5:
return (check_hmac_md5(priv, old));
case DST_ALG_HMACSHA1:
@@ -285,7 +341,7 @@ dst__privstruct_free(dst_private_t *priv, isc_mem_t *mctx) {
priv->nelements = 0;
}
-int
+isc_result_t
dst__privstruct_parse(dst_key_t *key, unsigned int alg, isc_lex_t *lex,
isc_mem_t *mctx, dst_private_t *priv)
{
@@ -294,6 +350,7 @@ dst__privstruct_parse(dst_key_t *key, unsigned int alg, isc_lex_t *lex,
isc_token_t token;
unsigned char *data = NULL;
unsigned int opt = ISC_LEXOPT_EOL;
+ isc_stdtime_t when;
isc_result_t ret;
REQUIRE(priv != NULL);
@@ -341,13 +398,16 @@ dst__privstruct_parse(dst_key_t *key, unsigned int alg, isc_lex_t *lex,
goto fail;
}
- if (major > MAJOR_VERSION ||
- (major == MAJOR_VERSION && minor > MINOR_VERSION))
- {
+ if (major > DST_MAJOR_VERSION) {
ret = DST_R_INVALIDPRIVATEKEY;
goto fail;
}
+ /*
+ * Store the private key format version number
+ */
+ dst_key_setprivateformat(key, major, minor);
+
READLINE(lex, opt, &token);
/*
@@ -377,7 +437,6 @@ dst__privstruct_parse(dst_key_t *key, unsigned int alg, isc_lex_t *lex,
for (n = 0; n < MAXFIELDS; n++) {
int tag;
isc_region_t r;
-
do {
ret = isc_lex_gettoken(lex, opt, &token);
if (ret == ISC_R_EOF)
@@ -391,11 +450,50 @@ dst__privstruct_parse(dst_key_t *key, unsigned int alg, isc_lex_t *lex,
goto fail;
}
+ /* Numeric metadata */
+ tag = find_numericdata(DST_AS_STR(token));
+ if (tag >= 0) {
+ INSIST(tag < NUMERIC_NTAGS);
+
+ NEXTTOKEN(lex, opt | ISC_LEXOPT_NUMBER, &token);
+ if (token.type != isc_tokentype_number) {
+ ret = DST_R_INVALIDPRIVATEKEY;
+ goto fail;
+ }
+
+ dst_key_setnum(key, tag, token.value.as_ulong);
+ goto next;
+ }
+
+ /* Timing metadata */
+ tag = find_timedata(DST_AS_STR(token));
+ if (tag >= 0) {
+ INSIST(tag < TIMING_NTAGS);
+
+ NEXTTOKEN(lex, opt, &token);
+ if (token.type != isc_tokentype_string) {
+ ret = DST_R_INVALIDPRIVATEKEY;
+ goto fail;
+ }
+
+ ret = dns_time32_fromtext(DST_AS_STR(token), &when);
+ if (ret != ISC_R_SUCCESS)
+ goto fail;
+
+ dst_key_settime(key, tag, when);
+
+ goto next;
+ }
+
+ /* Key data */
tag = find_value(DST_AS_STR(token), alg);
- if (tag < 0 || TAG_ALG(tag) != alg) {
+ if (tag < 0 && minor > DST_MINOR_VERSION)
+ goto next;
+ else if (tag < 0) {
ret = DST_R_INVALIDPRIVATEKEY;
goto fail;
}
+
priv->elements[n].tag = tag;
data = (unsigned char *) isc_mem_get(mctx, MAXFIELDSIZE);
@@ -406,23 +504,23 @@ dst__privstruct_parse(dst_key_t *key, unsigned int alg, isc_lex_t *lex,
ret = isc_base64_tobuffer(lex, &b, -1);
if (ret != ISC_R_SUCCESS)
goto fail;
+
isc_buffer_usedregion(&b, &r);
priv->elements[n].length = r.length;
priv->elements[n].data = r.base;
+ priv->nelements++;
+ next:
READLINE(lex, opt, &token);
data = NULL;
}
done:
- priv->nelements = n;
-
if (check_data(priv, alg, ISC_TRUE) < 0)
goto fail;
return (ISC_R_SUCCESS);
fail:
- priv->nelements = n;
dst__privstruct_free(priv, mctx);
if (data != NULL)
isc_mem_put(mctx, data, MAXFIELDSIZE);
@@ -430,17 +528,21 @@ fail:
return (ret);
}
-int
+isc_result_t
dst__privstruct_writefile(const dst_key_t *key, const dst_private_t *priv,
const char *directory)
{
FILE *fp;
int ret, i;
- isc_result_t iret;
+ isc_result_t result;
char filename[ISC_DIR_NAMEMAX];
char buffer[MAXFIELDSIZE * 2];
- isc_buffer_t b;
isc_fsaccess_t access;
+ isc_stdtime_t when;
+ isc_uint32_t value;
+ isc_buffer_t b;
+ isc_region_t r;
+ int major, minor;
REQUIRE(priv != NULL);
@@ -461,11 +563,17 @@ dst__privstruct_writefile(const dst_key_t *key, const dst_private_t *priv,
&access);
(void)isc_fsaccess_set(filename, access);
+ dst_key_getprivateformat(key, &major, &minor);
+ if (major == 0 && minor == 0) {
+ major = DST_MAJOR_VERSION;
+ minor = DST_MINOR_VERSION;
+ }
+
/* XXXDCL return value should be checked for full filesystem */
- fprintf(fp, "%s v%d.%d\n", PRIVATE_KEY_STR, MAJOR_VERSION,
- MINOR_VERSION);
+ fprintf(fp, "%s v%d.%d\n", PRIVATE_KEY_STR, major, minor);
fprintf(fp, "%s %d ", ALGORITHM_STR, dst_key_alg(key));
+
/* XXXVIX this switch statement is too sparse to gen a jump table. */
switch (dst_key_alg(key)) {
case DST_ALG_RSAMD5:
@@ -480,18 +588,21 @@ dst__privstruct_writefile(const dst_key_t *key, const dst_private_t *priv,
case DST_ALG_RSASHA1:
fprintf(fp, "(RSASHA1)\n");
break;
- case DST_ALG_NSEC3DSA:
- fprintf(fp, "(NSEC3DSA)\n");
- break;
case DST_ALG_NSEC3RSASHA1:
fprintf(fp, "(NSEC3RSASHA1)\n");
break;
+ case DST_ALG_NSEC3DSA:
+ fprintf(fp, "(NSEC3DSA)\n");
+ break;
case DST_ALG_RSASHA256:
fprintf(fp, "(RSASHA256)\n");
break;
case DST_ALG_RSASHA512:
fprintf(fp, "(RSASHA512)\n");
break;
+ case DST_ALG_ECCGOST:
+ fprintf(fp, "(ECC-GOST)\n");
+ break;
case DST_ALG_HMACMD5:
fprintf(fp, "(HMAC_MD5)\n");
break;
@@ -516,8 +627,6 @@ dst__privstruct_writefile(const dst_key_t *key, const dst_private_t *priv,
}
for (i = 0; i < priv->nelements; i++) {
- isc_buffer_t b;
- isc_region_t r;
const char *s;
s = find_tag(priv->elements[i].tag);
@@ -525,8 +634,8 @@ dst__privstruct_writefile(const dst_key_t *key, const dst_private_t *priv,
r.base = priv->elements[i].data;
r.length = priv->elements[i].length;
isc_buffer_init(&b, buffer, sizeof(buffer));
- iret = isc_base64_totext(&r, sizeof(buffer), "", &b);
- if (iret != ISC_R_SUCCESS) {
+ result = isc_base64_totext(&r, sizeof(buffer), "", &b);
+ if (result != ISC_R_SUCCESS) {
fclose(fp);
return (DST_R_INVALIDPRIVATEKEY);
}
@@ -537,10 +646,36 @@ dst__privstruct_writefile(const dst_key_t *key, const dst_private_t *priv,
fprintf(fp, "\n");
}
+ /* Add the metadata tags */
+ if (major > 1 || (major == 1 && minor >= 3)) {
+ for (i = 0; i < NUMERIC_NTAGS; i++) {
+ result = dst_key_getnum(key, i, &value);
+ if (result != ISC_R_SUCCESS)
+ continue;
+ fprintf(fp, "%s %u\n", numerictags[i], value);
+ }
+ for (i = 0; i < TIMING_NTAGS; i++) {
+ result = dst_key_gettime(key, i, &when);
+ if (result != ISC_R_SUCCESS)
+ continue;
+
+ isc_buffer_init(&b, buffer, sizeof(buffer));
+ result = dns_time32_totext(when, &b);
+ if (result != ISC_R_SUCCESS)
+ continue;
+
+ isc_buffer_usedregion(&b, &r);
+
+ fprintf(fp, "%s ", timetags[i]);
+ isc_util_fwrite(r.base, 1, r.length, fp);
+ fprintf(fp, "\n");
+ }
+ }
+
fflush(fp);
- iret = ferror(fp) ? DST_R_WRITEERROR : ISC_R_SUCCESS;
+ result = ferror(fp) ? DST_R_WRITEERROR : ISC_R_SUCCESS;
fclose(fp);
- return (iret);
+ return (result);
}
/*! \file */
diff --git a/contrib/bind9/lib/dns/dst_parse.h b/contrib/bind9/lib/dns/dst_parse.h
index 11e2b33..d1034ce 100644
--- a/contrib/bind9/lib/dns/dst_parse.h
+++ b/contrib/bind9/lib/dns/dst_parse.h
@@ -1,5 +1,5 @@
/*
- * Portions Copyright (C) 2004-2008 Internet Systems Consortium, Inc. ("ISC")
+ * Portions Copyright (C) 2004-2010 Internet Systems Consortium, Inc. ("ISC")
* Portions Copyright (C) 2000-2002 Internet Software Consortium.
*
* Permission to use, copy, modify, and/or distribute this software for any
@@ -29,7 +29,7 @@
* IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: dst_parse.h,v 1.11 2008-05-15 00:50:26 each Exp $ */
+/* $Id: dst_parse.h,v 1.17 2010-12-23 23:47:08 tbox Exp $ */
/*! \file */
#ifndef DST_DST_PARSE_H
@@ -39,11 +39,13 @@
#include <dst/dst.h>
-#define MAJOR_VERSION 1
-#define MINOR_VERSION 2
-
#define MAXFIELDSIZE 512
-#define MAXFIELDS 12
+
+/*
+ * Maximum number of fields in a private file is 18 (12 algorithm-
+ * specific fields for RSA, plus 6 generic fields).
+ */
+#define MAXFIELDS 12+6
#define TAG_SHIFT 4
#define TAG_ALG(tag) ((unsigned int)(tag) >> TAG_SHIFT)
@@ -76,6 +78,9 @@
#define TAG_DSA_PRIVATE ((DST_ALG_DSA << TAG_SHIFT) + 3)
#define TAG_DSA_PUBLIC ((DST_ALG_DSA << TAG_SHIFT) + 4)
+#define GOST_NTAGS 1
+#define TAG_GOST_PRIVASN1 ((DST_ALG_ECCGOST << TAG_SHIFT) + 0)
+
#define OLD_HMACMD5_NTAGS 1
#define HMACMD5_NTAGS 2
#define TAG_HMACMD5_KEY ((DST_ALG_HMACMD5 << TAG_SHIFT) + 0)
@@ -121,11 +126,11 @@ ISC_LANG_BEGINDECLS
void
dst__privstruct_free(dst_private_t *priv, isc_mem_t *mctx);
-int
+isc_result_t
dst__privstruct_parse(dst_key_t *key, unsigned int alg, isc_lex_t *lex,
isc_mem_t *mctx, dst_private_t *priv);
-int
+isc_result_t
dst__privstruct_writefile(const dst_key_t *key, const dst_private_t *priv,
const char *directory);
diff --git a/contrib/bind9/lib/dns/ecdb.c b/contrib/bind9/lib/dns/ecdb.c
new file mode 100644
index 0000000..d98a3eb
--- /dev/null
+++ b/contrib/bind9/lib/dns/ecdb.c
@@ -0,0 +1,810 @@
+/*
+ * Copyright (C) 2009-2011 Internet Systems Consortium, Inc. ("ISC")
+ *
+ * Permission to use, copy, modify, and/or 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 ISC DISCLAIMS ALL WARRANTIES WITH
+ * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+ * AND FITNESS. IN NO EVENT SHALL ISC 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.
+ */
+
+/* $Id: ecdb.c,v 1.8 2011-01-14 00:51:43 tbox Exp $ */
+
+#include "config.h"
+
+#include <isc/result.h>
+#include <isc/util.h>
+#include <isc/mutex.h>
+#include <isc/mem.h>
+
+#include <dns/db.h>
+#include <dns/ecdb.h>
+#include <dns/rdata.h>
+#include <dns/rdataset.h>
+#include <dns/rdatasetiter.h>
+#include <dns/rdataslab.h>
+
+#define ECDB_MAGIC ISC_MAGIC('E', 'C', 'D', 'B')
+#define VALID_ECDB(db) ((db) != NULL && \
+ (db)->common.impmagic == ECDB_MAGIC)
+
+#define ECDBNODE_MAGIC ISC_MAGIC('E', 'C', 'D', 'N')
+#define VALID_ECDBNODE(ecdbn) ISC_MAGIC_VALID(ecdbn, ECDBNODE_MAGIC)
+
+#if DNS_RDATASET_FIXED
+#error "Fixed rdataset isn't supported in this implementation"
+#endif
+
+/*%
+ * The 'ephemeral' cache DB (ecdb) implementation. An ecdb just provides
+ * temporary storage for ongoing name resolution with the common DB interfaces.
+ * It actually doesn't cache anything. The implementation expects any stored
+ * data is released within a short period, and does not care about the
+ * scalability in terms of the number of nodes.
+ */
+
+typedef struct dns_ecdb {
+ /* Unlocked */
+ dns_db_t common;
+ isc_mutex_t lock;
+
+ /* Locked */
+ unsigned int references;
+ ISC_LIST(struct dns_ecdbnode) nodes;
+} dns_ecdb_t;
+
+typedef struct dns_ecdbnode {
+ /* Unlocked */
+ unsigned int magic;
+ isc_mutex_t lock;
+ dns_ecdb_t *ecdb;
+ dns_name_t name;
+ ISC_LINK(struct dns_ecdbnode) link;
+
+ /* Locked */
+ ISC_LIST(struct rdatasetheader) rdatasets;
+ unsigned int references;
+} dns_ecdbnode_t;
+
+typedef struct rdatasetheader {
+ dns_rdatatype_t type;
+ dns_ttl_t ttl;
+ dns_trust_t trust;
+ dns_rdatatype_t covers;
+ unsigned int attributes;
+
+ ISC_LINK(struct rdatasetheader) link;
+} rdatasetheader_t;
+
+/* Copied from rbtdb.c */
+#define RDATASET_ATTR_NXDOMAIN 0x0010
+#define NXDOMAIN(header) \
+ (((header)->attributes & RDATASET_ATTR_NXDOMAIN) != 0)
+
+static isc_result_t dns_ecdb_create(isc_mem_t *mctx, dns_name_t *origin,
+ dns_dbtype_t type,
+ dns_rdataclass_t rdclass,
+ unsigned int argc, char *argv[],
+ void *driverarg, dns_db_t **dbp);
+
+static void rdataset_disassociate(dns_rdataset_t *rdataset);
+static isc_result_t rdataset_first(dns_rdataset_t *rdataset);
+static isc_result_t rdataset_next(dns_rdataset_t *rdataset);
+static void rdataset_current(dns_rdataset_t *rdataset, dns_rdata_t *rdata);
+static void rdataset_clone(dns_rdataset_t *source, dns_rdataset_t *target);
+static unsigned int rdataset_count(dns_rdataset_t *rdataset);
+static void rdataset_settrust(dns_rdataset_t *rdataset, dns_trust_t trust);
+
+static dns_rdatasetmethods_t rdataset_methods = {
+ rdataset_disassociate,
+ rdataset_first,
+ rdataset_next,
+ rdataset_current,
+ rdataset_clone,
+ rdataset_count,
+ NULL, /* addnoqname */
+ NULL, /* getnoqname */
+ NULL, /* addclosest */
+ NULL, /* getclosest */
+ NULL, /* getadditional */
+ NULL, /* setadditional */
+ NULL, /* putadditional */
+ rdataset_settrust, /* settrust */
+ NULL /* expire */
+};
+
+typedef struct ecdb_rdatasetiter {
+ dns_rdatasetiter_t common;
+ rdatasetheader_t *current;
+} ecdb_rdatasetiter_t;
+
+static void rdatasetiter_destroy(dns_rdatasetiter_t **iteratorp);
+static isc_result_t rdatasetiter_first(dns_rdatasetiter_t *iterator);
+static isc_result_t rdatasetiter_next(dns_rdatasetiter_t *iterator);
+static void rdatasetiter_current(dns_rdatasetiter_t *iterator,
+ dns_rdataset_t *rdataset);
+
+static dns_rdatasetitermethods_t rdatasetiter_methods = {
+ rdatasetiter_destroy,
+ rdatasetiter_first,
+ rdatasetiter_next,
+ rdatasetiter_current
+};
+
+isc_result_t
+dns_ecdb_register(isc_mem_t *mctx, dns_dbimplementation_t **dbimp) {
+ REQUIRE(mctx != NULL);
+ REQUIRE(dbimp != NULL && *dbimp == NULL);
+
+ return (dns_db_register("ecdb", dns_ecdb_create, NULL, mctx, dbimp));
+}
+
+void
+dns_ecdb_unregister(dns_dbimplementation_t **dbimp) {
+ REQUIRE(dbimp != NULL && *dbimp != NULL);
+
+ dns_db_unregister(dbimp);
+}
+
+/*%
+ * DB routines
+ */
+
+static void
+attach(dns_db_t *source, dns_db_t **targetp) {
+ dns_ecdb_t *ecdb = (dns_ecdb_t *)source;
+
+ REQUIRE(VALID_ECDB(ecdb));
+ REQUIRE(targetp != NULL && *targetp == NULL);
+
+ LOCK(&ecdb->lock);
+ ecdb->references++;
+ UNLOCK(&ecdb->lock);
+
+ *targetp = source;
+}
+
+static void
+destroy_ecdb(dns_ecdb_t **ecdbp) {
+ dns_ecdb_t *ecdb = *ecdbp;
+ isc_mem_t *mctx = ecdb->common.mctx;
+
+ if (dns_name_dynamic(&ecdb->common.origin))
+ dns_name_free(&ecdb->common.origin, mctx);
+
+ DESTROYLOCK(&ecdb->lock);
+
+ ecdb->common.impmagic = 0;
+ ecdb->common.magic = 0;
+
+ isc_mem_putanddetach(&mctx, ecdb, sizeof(*ecdb));
+
+ *ecdbp = NULL;
+}
+
+static void
+detach(dns_db_t **dbp) {
+ dns_ecdb_t *ecdb;
+ isc_boolean_t need_destroy = ISC_FALSE;
+
+ REQUIRE(dbp != NULL);
+ ecdb = (dns_ecdb_t *)*dbp;
+ REQUIRE(VALID_ECDB(ecdb));
+
+ LOCK(&ecdb->lock);
+ ecdb->references--;
+ if (ecdb->references == 0 && ISC_LIST_EMPTY(ecdb->nodes))
+ need_destroy = ISC_TRUE;
+ UNLOCK(&ecdb->lock);
+
+ if (need_destroy)
+ destroy_ecdb(&ecdb);
+
+ *dbp = NULL;
+}
+
+static void
+attachnode(dns_db_t *db, dns_dbnode_t *source, dns_dbnode_t **targetp) {
+ dns_ecdb_t *ecdb = (dns_ecdb_t *)db;
+ dns_ecdbnode_t *node = (dns_ecdbnode_t *)source;
+
+ REQUIRE(VALID_ECDB(ecdb));
+ REQUIRE(VALID_ECDBNODE(node));
+ REQUIRE(targetp != NULL && *targetp == NULL);
+
+ LOCK(&node->lock);
+ INSIST(node->references > 0);
+ node->references++;
+ INSIST(node->references != 0); /* Catch overflow. */
+ UNLOCK(&node->lock);
+
+ *targetp = node;
+}
+
+static void
+destroynode(dns_ecdbnode_t *node) {
+ isc_mem_t *mctx;
+ dns_ecdb_t *ecdb = node->ecdb;
+ isc_boolean_t need_destroydb = ISC_FALSE;
+ rdatasetheader_t *header;
+
+ mctx = ecdb->common.mctx;
+
+ LOCK(&ecdb->lock);
+ ISC_LIST_UNLINK(ecdb->nodes, node, link);
+ if (ecdb->references == 0 && ISC_LIST_EMPTY(ecdb->nodes))
+ need_destroydb = ISC_TRUE;
+ UNLOCK(&ecdb->lock);
+
+ dns_name_free(&node->name, mctx);
+
+ while ((header = ISC_LIST_HEAD(node->rdatasets)) != NULL) {
+ unsigned int headersize;
+
+ ISC_LIST_UNLINK(node->rdatasets, header, link);
+ headersize =
+ dns_rdataslab_size((unsigned char *)header,
+ sizeof(*header));
+ isc_mem_put(mctx, header, headersize);
+ }
+
+ DESTROYLOCK(&node->lock);
+
+ node->magic = 0;
+ isc_mem_put(mctx, node, sizeof(*node));
+
+ if (need_destroydb)
+ destroy_ecdb(&ecdb);
+}
+
+static void
+detachnode(dns_db_t *db, dns_dbnode_t **nodep) {
+ dns_ecdb_t *ecdb = (dns_ecdb_t *)db;
+ dns_ecdbnode_t *node;
+ isc_boolean_t need_destroy = ISC_FALSE;
+
+ REQUIRE(VALID_ECDB(ecdb));
+ REQUIRE(nodep != NULL);
+ node = (dns_ecdbnode_t *)*nodep;
+ REQUIRE(VALID_ECDBNODE(node));
+
+ UNUSED(ecdb); /* in case REQUIRE() is empty */
+
+ LOCK(&node->lock);
+ INSIST(node->references > 0);
+ node->references--;
+ if (node->references == 0)
+ need_destroy = ISC_TRUE;
+ UNLOCK(&node->lock);
+
+ if (need_destroy)
+ destroynode(node);
+
+ *nodep = NULL;
+}
+
+static isc_result_t
+find(dns_db_t *db, dns_name_t *name, dns_dbversion_t *version,
+ dns_rdatatype_t type, unsigned int options, isc_stdtime_t now,
+ dns_dbnode_t **nodep, dns_name_t *foundname, dns_rdataset_t *rdataset,
+ dns_rdataset_t *sigrdataset)
+{
+ dns_ecdb_t *ecdb = (dns_ecdb_t *)db;
+
+ REQUIRE(VALID_ECDB(ecdb));
+
+ UNUSED(name);
+ UNUSED(version);
+ UNUSED(type);
+ UNUSED(options);
+ UNUSED(now);
+ UNUSED(nodep);
+ UNUSED(foundname);
+ UNUSED(rdataset);
+ UNUSED(sigrdataset);
+
+ return (ISC_R_NOTFOUND);
+}
+
+static isc_result_t
+findzonecut(dns_db_t *db, dns_name_t *name,
+ unsigned int options, isc_stdtime_t now,
+ dns_dbnode_t **nodep, dns_name_t *foundname,
+ dns_rdataset_t *rdataset, dns_rdataset_t *sigrdataset)
+{
+ dns_ecdb_t *ecdb = (dns_ecdb_t *)db;
+
+ REQUIRE(VALID_ECDB(ecdb));
+
+ UNUSED(name);
+ UNUSED(options);
+ UNUSED(now);
+ UNUSED(nodep);
+ UNUSED(foundname);
+ UNUSED(rdataset);
+ UNUSED(sigrdataset);
+
+ return (ISC_R_NOTFOUND);
+}
+
+static isc_result_t
+findnode(dns_db_t *db, dns_name_t *name, isc_boolean_t create,
+ dns_dbnode_t **nodep)
+{
+ dns_ecdb_t *ecdb = (dns_ecdb_t *)db;
+ isc_mem_t *mctx;
+ dns_ecdbnode_t *node;
+ isc_result_t result;
+
+ REQUIRE(VALID_ECDB(ecdb));
+ REQUIRE(nodep != NULL && *nodep == NULL);
+
+ UNUSED(name);
+
+ if (create != ISC_TRUE) {
+ /* an 'ephemeral' node is never reused. */
+ return (ISC_R_NOTFOUND);
+ }
+
+ mctx = ecdb->common.mctx;
+ node = isc_mem_get(mctx, sizeof(*node));
+ if (node == NULL)
+ return (ISC_R_NOMEMORY);
+
+ result = isc_mutex_init(&node->lock);
+ if (result != ISC_R_SUCCESS) {
+ UNEXPECTED_ERROR(__FILE__, __LINE__,
+ "isc_mutex_init() failed: %s",
+ isc_result_totext(result));
+ isc_mem_put(mctx, node, sizeof(*node));
+ return (ISC_R_UNEXPECTED);
+ }
+
+ dns_name_init(&node->name, NULL);
+ result = dns_name_dup(name, mctx, &node->name);
+ if (result != ISC_R_SUCCESS) {
+ DESTROYLOCK(&node->lock);
+ isc_mem_put(mctx, node, sizeof(*node));
+ return (result);
+ }
+ node->ecdb= ecdb;
+ node->references = 1;
+ ISC_LIST_INIT(node->rdatasets);
+
+ ISC_LINK_INIT(node, link);
+
+ LOCK(&ecdb->lock);
+ ISC_LIST_APPEND(ecdb->nodes, node, link);
+ UNLOCK(&ecdb->lock);
+
+ node->magic = ECDBNODE_MAGIC;
+
+ *nodep = node;
+
+ return (ISC_R_SUCCESS);
+}
+
+static void
+bind_rdataset(dns_ecdb_t *ecdb, dns_ecdbnode_t *node,
+ rdatasetheader_t *header, dns_rdataset_t *rdataset)
+{
+ unsigned char *raw;
+
+ /*
+ * Caller must be holding the node lock.
+ */
+
+ REQUIRE(!dns_rdataset_isassociated(rdataset));
+
+ rdataset->methods = &rdataset_methods;
+ rdataset->rdclass = ecdb->common.rdclass;
+ rdataset->type = header->type;
+ rdataset->covers = header->covers;
+ rdataset->ttl = header->ttl;
+ rdataset->trust = header->trust;
+ if (NXDOMAIN(header))
+ rdataset->attributes |= DNS_RDATASETATTR_NXDOMAIN;
+
+ rdataset->private1 = ecdb;
+ rdataset->private2 = node;
+ raw = (unsigned char *)header + sizeof(*header);
+ rdataset->private3 = raw;
+ rdataset->count = 0;
+
+ /*
+ * Reset iterator state.
+ */
+ rdataset->privateuint4 = 0;
+ rdataset->private5 = NULL;
+
+ INSIST(node->references > 0);
+ node->references++;
+}
+
+static isc_result_t
+addrdataset(dns_db_t *db, dns_dbnode_t *node, dns_dbversion_t *version,
+ isc_stdtime_t now, dns_rdataset_t *rdataset, unsigned int options,
+ dns_rdataset_t *addedrdataset)
+{
+ dns_ecdb_t *ecdb = (dns_ecdb_t *)db;
+ isc_region_t r;
+ isc_result_t result = ISC_R_SUCCESS;
+ isc_mem_t *mctx;
+ dns_ecdbnode_t *ecdbnode = (dns_ecdbnode_t *)node;
+ rdatasetheader_t *header;
+
+ REQUIRE(VALID_ECDB(ecdb));
+ REQUIRE(VALID_ECDBNODE(ecdbnode));
+
+ UNUSED(version);
+ UNUSED(now);
+ UNUSED(options);
+
+ mctx = ecdb->common.mctx;
+
+ LOCK(&ecdbnode->lock);
+
+ /*
+ * Sanity check: this implementation does not allow overriding an
+ * existing rdataset of the same type.
+ */
+ for (header = ISC_LIST_HEAD(ecdbnode->rdatasets); header != NULL;
+ header = ISC_LIST_NEXT(header, link)) {
+ INSIST(header->type != rdataset->type ||
+ header->covers != rdataset->covers);
+ }
+
+ result = dns_rdataslab_fromrdataset(rdataset, mctx,
+ &r, sizeof(rdatasetheader_t));
+ if (result != ISC_R_SUCCESS)
+ goto unlock;
+
+ header = (rdatasetheader_t *)r.base;
+ header->type = rdataset->type;
+ header->ttl = rdataset->ttl;
+ header->trust = rdataset->trust;
+ header->covers = rdataset->covers;
+ header->attributes = 0;
+ if ((rdataset->attributes & DNS_RDATASETATTR_NXDOMAIN) != 0)
+ header->attributes |= RDATASET_ATTR_NXDOMAIN;
+ ISC_LINK_INIT(header, link);
+ ISC_LIST_APPEND(ecdbnode->rdatasets, header, link);
+
+ if (addedrdataset == NULL)
+ goto unlock;
+
+ bind_rdataset(ecdb, ecdbnode, header, addedrdataset);
+
+ unlock:
+ UNLOCK(&ecdbnode->lock);
+
+ return (result);
+}
+
+static isc_result_t
+deleterdataset(dns_db_t *db, dns_dbnode_t *node, dns_dbversion_t *version,
+ dns_rdatatype_t type, dns_rdatatype_t covers)
+{
+ UNUSED(db);
+ UNUSED(node);
+ UNUSED(version);
+ UNUSED(type);
+ UNUSED(covers);
+
+ return (ISC_R_NOTIMPLEMENTED);
+}
+
+static isc_result_t
+createiterator(dns_db_t *db, unsigned int options,
+ dns_dbiterator_t **iteratorp)
+{
+ UNUSED(db);
+ UNUSED(options);
+ UNUSED(iteratorp);
+
+ return (ISC_R_NOTIMPLEMENTED);
+}
+
+static isc_result_t
+allrdatasets(dns_db_t *db, dns_dbnode_t *node, dns_dbversion_t *version,
+ isc_stdtime_t now, dns_rdatasetiter_t **iteratorp)
+{
+ dns_ecdb_t *ecdb = (dns_ecdb_t *)db;
+ dns_ecdbnode_t *ecdbnode = (dns_ecdbnode_t *)node;
+ isc_mem_t *mctx;
+ ecdb_rdatasetiter_t *iterator;
+
+ REQUIRE(VALID_ECDB(ecdb));
+ REQUIRE(VALID_ECDBNODE(ecdbnode));
+
+ mctx = ecdb->common.mctx;
+
+ iterator = isc_mem_get(mctx, sizeof(ecdb_rdatasetiter_t));
+ if (iterator == NULL)
+ return (ISC_R_NOMEMORY);
+
+ iterator->common.magic = DNS_RDATASETITER_MAGIC;
+ iterator->common.methods = &rdatasetiter_methods;
+ iterator->common.db = db;
+ iterator->common.node = NULL;
+ attachnode(db, node, &iterator->common.node);
+ iterator->common.version = version;
+ iterator->common.now = now;
+
+ *iteratorp = (dns_rdatasetiter_t *)iterator;
+
+ return (ISC_R_SUCCESS);
+}
+
+static dns_dbmethods_t ecdb_methods = {
+ attach,
+ detach,
+ NULL, /* beginload */
+ NULL, /* endload */
+ NULL, /* dump */
+ NULL, /* currentversion */
+ NULL, /* newversion */
+ NULL, /* attachversion */
+ NULL, /* closeversion */
+ findnode,
+ find,
+ findzonecut,
+ attachnode,
+ detachnode,
+ NULL, /* expirenode */
+ NULL, /* printnode */
+ createiterator, /* createiterator */
+ NULL, /* findrdataset */
+ allrdatasets,
+ addrdataset,
+ NULL, /* subtractrdataset */
+ deleterdataset,
+ NULL, /* issecure */
+ NULL, /* nodecount */
+ NULL, /* ispersistent */
+ NULL, /* overmem */
+ NULL, /* settask */
+ NULL, /* getoriginnode */
+ NULL, /* transfernode */
+ NULL, /* getnsec3parameters */
+ NULL, /* findnsec3node */
+ NULL, /* setsigningtime */
+ NULL, /* getsigningtime */
+ NULL, /* resigned */
+ NULL, /* isdnssec */
+ NULL, /* getrrsetstats */
+ NULL, /* rpz_enabled */
+ NULL /* rpz_findips */
+};
+
+static isc_result_t
+dns_ecdb_create(isc_mem_t *mctx, dns_name_t *origin, dns_dbtype_t type,
+ dns_rdataclass_t rdclass, unsigned int argc, char *argv[],
+ void *driverarg, dns_db_t **dbp)
+{
+ dns_ecdb_t *ecdb;
+ isc_result_t result;
+
+ REQUIRE(mctx != NULL);
+ REQUIRE(origin == dns_rootname);
+ REQUIRE(type == dns_dbtype_cache);
+ REQUIRE(dbp != NULL && *dbp == NULL);
+
+ UNUSED(argc);
+ UNUSED(argv);
+ UNUSED(driverarg);
+
+ ecdb = isc_mem_get(mctx, sizeof(*ecdb));
+ if (ecdb == NULL)
+ return (ISC_R_NOMEMORY);
+
+ ecdb->common.attributes = DNS_DBATTR_CACHE;
+ ecdb->common.rdclass = rdclass;
+ ecdb->common.methods = &ecdb_methods;
+ dns_name_init(&ecdb->common.origin, NULL);
+ result = dns_name_dupwithoffsets(origin, mctx, &ecdb->common.origin);
+ if (result != ISC_R_SUCCESS) {
+ isc_mem_put(mctx, ecdb, sizeof(*ecdb));
+ return (result);
+ }
+
+ result = isc_mutex_init(&ecdb->lock);
+ if (result != ISC_R_SUCCESS) {
+ UNEXPECTED_ERROR(__FILE__, __LINE__,
+ "isc_mutex_init() failed: %s",
+ isc_result_totext(result));
+ if (dns_name_dynamic(&ecdb->common.origin))
+ dns_name_free(&ecdb->common.origin, mctx);
+ isc_mem_put(mctx, ecdb, sizeof(*ecdb));
+ return (ISC_R_UNEXPECTED);
+ }
+
+ ecdb->references = 1;
+ ISC_LIST_INIT(ecdb->nodes);
+
+ ecdb->common.mctx = NULL;
+ isc_mem_attach(mctx, &ecdb->common.mctx);
+ ecdb->common.impmagic = ECDB_MAGIC;
+ ecdb->common.magic = DNS_DB_MAGIC;
+
+ *dbp = (dns_db_t *)ecdb;
+
+ return (ISC_R_SUCCESS);
+}
+
+/*%
+ * Rdataset Methods
+ */
+
+static void
+rdataset_disassociate(dns_rdataset_t *rdataset) {
+ dns_db_t *db = rdataset->private1;
+ dns_dbnode_t *node = rdataset->private2;
+
+ dns_db_detachnode(db, &node);
+}
+
+static isc_result_t
+rdataset_first(dns_rdataset_t *rdataset) {
+ unsigned char *raw = rdataset->private3;
+ unsigned int count;
+
+ count = raw[0] * 256 + raw[1];
+ if (count == 0) {
+ rdataset->private5 = NULL;
+ return (ISC_R_NOMORE);
+ }
+ raw += 2;
+ /*
+ * The privateuint4 field is the number of rdata beyond the cursor
+ * position, so we decrement the total count by one before storing
+ * it.
+ */
+ count--;
+ rdataset->privateuint4 = count;
+ rdataset->private5 = raw;
+
+ return (ISC_R_SUCCESS);
+}
+
+static isc_result_t
+rdataset_next(dns_rdataset_t *rdataset) {
+ unsigned int count;
+ unsigned int length;
+ unsigned char *raw;
+
+ count = rdataset->privateuint4;
+ if (count == 0)
+ return (ISC_R_NOMORE);
+ count--;
+ rdataset->privateuint4 = count;
+ raw = rdataset->private5;
+ length = raw[0] * 256 + raw[1];
+ raw += length + 2;
+ rdataset->private5 = raw;
+
+ return (ISC_R_SUCCESS);
+}
+
+static void
+rdataset_current(dns_rdataset_t *rdataset, dns_rdata_t *rdata) {
+ unsigned char *raw = rdataset->private5;
+ isc_region_t r;
+ unsigned int length;
+ unsigned int flags = 0;
+
+ REQUIRE(raw != NULL);
+
+ length = raw[0] * 256 + raw[1];
+ raw += 2;
+ if (rdataset->type == dns_rdatatype_rrsig) {
+ if (*raw & DNS_RDATASLAB_OFFLINE)
+ flags |= DNS_RDATA_OFFLINE;
+ length--;
+ raw++;
+ }
+ r.length = length;
+ r.base = raw;
+ dns_rdata_fromregion(rdata, rdataset->rdclass, rdataset->type, &r);
+ rdata->flags |= flags;
+}
+
+static void
+rdataset_clone(dns_rdataset_t *source, dns_rdataset_t *target) {
+ dns_db_t *db = source->private1;
+ dns_dbnode_t *node = source->private2;
+ dns_dbnode_t *cloned_node = NULL;
+
+ attachnode(db, node, &cloned_node);
+ *target = *source;
+
+ /*
+ * Reset iterator state.
+ */
+ target->privateuint4 = 0;
+ target->private5 = NULL;
+}
+
+static unsigned int
+rdataset_count(dns_rdataset_t *rdataset) {
+ unsigned char *raw = rdataset->private3;
+ unsigned int count;
+
+ count = raw[0] * 256 + raw[1];
+
+ return (count);
+}
+
+static void
+rdataset_settrust(dns_rdataset_t *rdataset, dns_trust_t trust) {
+ rdatasetheader_t *header = rdataset->private3;
+
+ header--;
+ header->trust = rdataset->trust = trust;
+}
+
+/*
+ * Rdataset Iterator Methods
+ */
+
+static void
+rdatasetiter_destroy(dns_rdatasetiter_t **iteratorp) {
+ ecdb_rdatasetiter_t *ecdbiterator;
+ isc_mem_t *mctx;
+
+ REQUIRE(iteratorp != NULL);
+ ecdbiterator = (ecdb_rdatasetiter_t *)*iteratorp;
+ REQUIRE(DNS_RDATASETITER_VALID(&ecdbiterator->common));
+
+ mctx = ecdbiterator->common.db->mctx;
+
+ ecdbiterator->common.magic = 0;
+
+ dns_db_detachnode(ecdbiterator->common.db, &ecdbiterator->common.node);
+ isc_mem_put(mctx, ecdbiterator, sizeof(ecdb_rdatasetiter_t));
+
+ *iteratorp = NULL;
+}
+
+static isc_result_t
+rdatasetiter_first(dns_rdatasetiter_t *iterator) {
+ ecdb_rdatasetiter_t *ecdbiterator = (ecdb_rdatasetiter_t *)iterator;
+ dns_ecdbnode_t *ecdbnode = (dns_ecdbnode_t *)iterator->node;
+
+ REQUIRE(DNS_RDATASETITER_VALID(iterator));
+
+ if (ISC_LIST_EMPTY(ecdbnode->rdatasets))
+ return (ISC_R_NOMORE);
+ ecdbiterator->current = ISC_LIST_HEAD(ecdbnode->rdatasets);
+ return (ISC_R_SUCCESS);
+}
+
+static isc_result_t
+rdatasetiter_next(dns_rdatasetiter_t *iterator) {
+ ecdb_rdatasetiter_t *ecdbiterator = (ecdb_rdatasetiter_t *)iterator;
+
+ REQUIRE(DNS_RDATASETITER_VALID(iterator));
+
+ ecdbiterator->current = ISC_LIST_NEXT(ecdbiterator->current, link);
+ if (ecdbiterator->current == NULL)
+ return (ISC_R_NOMORE);
+ else
+ return (ISC_R_SUCCESS);
+}
+
+static void
+rdatasetiter_current(dns_rdatasetiter_t *iterator, dns_rdataset_t *rdataset) {
+ ecdb_rdatasetiter_t *ecdbiterator = (ecdb_rdatasetiter_t *)iterator;
+ dns_ecdb_t *ecdb;
+
+ ecdb = (dns_ecdb_t *)iterator->db;
+ REQUIRE(VALID_ECDB(ecdb));
+
+ bind_rdataset(ecdb, iterator->node, ecdbiterator->current, rdataset);
+}
diff --git a/contrib/bind9/lib/dns/forward.c b/contrib/bind9/lib/dns/forward.c
index 1406b46..1f9c41a 100644
--- a/contrib/bind9/lib/dns/forward.c
+++ b/contrib/bind9/lib/dns/forward.c
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004, 2005, 2007 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004, 2005, 2007, 2009 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 2000, 2001 Internet Software Consortium.
*
* Permission to use, copy, modify, and/or distribute this software for any
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: forward.c,v 1.12 2007-06-19 23:47:16 tbox Exp $ */
+/* $Id: forward.c,v 1.14 2009-09-02 23:48:02 tbox Exp $ */
/*! \file */
@@ -133,11 +133,27 @@ dns_fwdtable_add(dns_fwdtable_t *fwdtable, dns_name_t *name,
}
isc_result_t
+dns_fwdtable_delete(dns_fwdtable_t *fwdtable, dns_name_t *name) {
+ isc_result_t result;
+
+ REQUIRE(VALID_FWDTABLE(fwdtable));
+
+ RWLOCK(&fwdtable->rwlock, isc_rwlocktype_write);
+ result = dns_rbt_deletename(fwdtable->table, name, ISC_FALSE);
+ RWUNLOCK(&fwdtable->rwlock, isc_rwlocktype_write);
+
+ if (result == DNS_R_PARTIALMATCH)
+ result = ISC_R_NOTFOUND;
+
+ return (result);
+}
+
+isc_result_t
dns_fwdtable_find(dns_fwdtable_t *fwdtable, dns_name_t *name,
dns_forwarders_t **forwardersp)
{
return (dns_fwdtable_find2(fwdtable, name, NULL, forwardersp));
-}
+}
isc_result_t
dns_fwdtable_find2(dns_fwdtable_t *fwdtable, dns_name_t *name,
diff --git a/contrib/bind9/lib/dns/gen-unix.h b/contrib/bind9/lib/dns/gen-unix.h
index 91cd4d5..47a343d 100644
--- a/contrib/bind9/lib/dns/gen-unix.h
+++ b/contrib/bind9/lib/dns/gen-unix.h
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: gen-unix.h,v 1.19.332.2 2009-01-18 23:47:35 tbox Exp $ */
+/* $Id: gen-unix.h,v 1.21 2009-01-17 23:47:42 tbox Exp $ */
/*! \file
* \brief
diff --git a/contrib/bind9/lib/dns/gen.c b/contrib/bind9/lib/dns/gen.c
index 6f8ce7d..f1d46ea 100644
--- a/contrib/bind9/lib/dns/gen.c
+++ b/contrib/bind9/lib/dns/gen.c
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004-2008 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004-2009 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 1998-2003 Internet Software Consortium.
*
* Permission to use, copy, modify, and/or distribute this software for any
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: gen.c,v 1.83 2008-09-25 04:02:38 tbox Exp $ */
+/* $Id: gen.c,v 1.85 2009-12-04 22:06:37 tbox Exp $ */
/*! \file */
@@ -631,6 +631,8 @@ main(int argc, char **argv) {
TOWIRETYPE, TOWIRECLASS, TOWIREDEF);
doswitch("COMPARESWITCH", "compare", COMPAREARGS,
COMPARETYPE, COMPARECLASS, COMPAREDEF);
+ doswitch("CASECOMPARESWITCH", "casecompare", COMPAREARGS,
+ COMPARETYPE, COMPARECLASS, COMPAREDEF);
doswitch("FROMSTRUCTSWITCH", "fromstruct", FROMSTRUCTARGS,
FROMSTRUCTTYPE, FROMSTRUCTCLASS, FROMSTRUCTDEF);
doswitch("TOSTRUCTSWITCH", "tostruct", TOSTRUCTARGS,
diff --git a/contrib/bind9/lib/dns/gssapi_link.c b/contrib/bind9/lib/dns/gssapi_link.c
index a7af67f..e14d0eb 100644
--- a/contrib/bind9/lib/dns/gssapi_link.c
+++ b/contrib/bind9/lib/dns/gssapi_link.c
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004-2008 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004-2009, 2011 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 2000-2002 Internet Software Consortium.
*
* Permission to use, copy, modify, and/or distribute this software for any
@@ -16,13 +16,14 @@
*/
/*
- * $Id: gssapi_link.c,v 1.12 2008-11-11 03:55:01 marka Exp $
+ * $Id: gssapi_link.c,v 1.16 2011-01-11 23:47:13 tbox Exp $
*/
#include <config.h>
#ifdef GSSAPI
+#include <isc/base64.h>
#include <isc/buffer.h>
#include <isc/mem.h>
#include <isc/string.h>
@@ -44,6 +45,12 @@
(gb).value = (r).base; \
} while (0)
+#define GBUFFER_TO_REGION(gb, r) \
+ do { \
+ (r).length = (gb).length; \
+ (r).base = (gb).value; \
+ } while (0)
+
struct dst_gssapi_signverifyctx {
isc_buffer_t *buffer;
@@ -254,9 +261,10 @@ gssapi_compare(const dst_key_t *key1, const dst_key_t *key2) {
}
static isc_result_t
-gssapi_generate(dst_key_t *key, int unused) {
+gssapi_generate(dst_key_t *key, int unused, void (*callback)(int)) {
UNUSED(key);
UNUSED(unused);
+ UNUSED(callback);
/* No idea */
return (ISC_R_FAILURE);
@@ -275,6 +283,79 @@ gssapi_destroy(dst_key_t *key) {
key->keydata.gssctx = NULL;
}
+static isc_result_t
+gssapi_restore(dst_key_t *key, const char *keystr) {
+ OM_uint32 major, minor;
+ size_t len;
+ isc_buffer_t *b = NULL;
+ isc_region_t r;
+ gss_buffer_desc gssbuffer;
+ isc_result_t result;
+
+ len = strlen(keystr);
+ if ((len % 4) != 0)
+ return (ISC_R_BADBASE64);
+
+ len = (len / 4) * 3;
+
+ result = isc_buffer_allocate(key->mctx, &b, len);
+ if (result != ISC_R_SUCCESS)
+ return (result);
+
+ result = isc_base64_decodestring(keystr, b);
+ if (result != ISC_R_SUCCESS) {
+ isc_buffer_free(&b);
+ return (result);
+ }
+
+ isc_buffer_remainingregion(b, &r);
+ REGION_TO_GBUFFER(r, gssbuffer);
+ major = gss_import_sec_context(&minor, &gssbuffer,
+ &key->keydata.gssctx);
+ if (major != GSS_S_COMPLETE) {
+ isc_buffer_free(&b);
+ return (ISC_R_FAILURE);
+ }
+
+ isc_buffer_free(&b);
+ return (ISC_R_SUCCESS);
+}
+
+static isc_result_t
+gssapi_dump(dst_key_t *key, isc_mem_t *mctx, char **buffer, int *length) {
+ OM_uint32 major, minor;
+ gss_buffer_desc gssbuffer;
+ size_t len;
+ char *buf;
+ isc_buffer_t b;
+ isc_region_t r;
+ isc_result_t result;
+
+ major = gss_export_sec_context(&minor, &key->keydata.gssctx,
+ &gssbuffer);
+ if (major != GSS_S_COMPLETE) {
+ fprintf(stderr, "gss_export_sec_context -> %d, %d\n",
+ major, minor);
+ return (ISC_R_FAILURE);
+ }
+ if (gssbuffer.length == 0)
+ return (ISC_R_FAILURE);
+ len = ((gssbuffer.length + 2)/3) * 4;
+ buf = isc_mem_get(mctx, len);
+ if (buf == NULL) {
+ gss_release_buffer(&minor, &gssbuffer);
+ return (ISC_R_NOMEMORY);
+ }
+ isc_buffer_init(&b, buf, len);
+ GBUFFER_TO_REGION(gssbuffer, r);
+ result = isc_base64_totext(&r, 0, "", &b);
+ RUNTIME_CHECK(result == ISC_R_SUCCESS);
+ gss_release_buffer(&minor, &gssbuffer);
+ *buffer = buf;
+ *length = len;
+ return (ISC_R_SUCCESS);
+}
+
static dst_func_t gssapi_functions = {
gssapi_create_signverify_ctx,
gssapi_destroy_signverify_ctx,
@@ -292,7 +373,9 @@ static dst_func_t gssapi_functions = {
NULL, /*%< tofile */
NULL, /*%< parse */
NULL, /*%< cleanup */
- NULL /*%< fromlabel */
+ NULL, /*%< fromlabel */
+ gssapi_dump,
+ gssapi_restore,
};
isc_result_t
diff --git a/contrib/bind9/lib/dns/gssapictx.c b/contrib/bind9/lib/dns/gssapictx.c
index f365a64..707745c 100644
--- a/contrib/bind9/lib/dns/gssapictx.c
+++ b/contrib/bind9/lib/dns/gssapictx.c
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004-2008, 2010 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004-2011 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 2000, 2001 Internet Software Consortium.
*
* Permission to use, copy, modify, and/or distribute this software for any
@@ -15,16 +15,18 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: gssapictx.c,v 1.12.118.5 2010-12-22 02:37:55 marka Exp $ */
+/* $Id: gssapictx.c,v 1.26 2011-01-10 03:49:49 marka Exp $ */
#include <config.h>
+#include <ctype.h>
#include <stdlib.h>
#include <string.h>
#include <isc/buffer.h>
#include <isc/dir.h>
#include <isc/entropy.h>
+#include <isc/file.h>
#include <isc/lex.h>
#include <isc/mem.h>
#include <isc/once.h>
@@ -201,9 +203,12 @@ log_cred(const gss_cred_id_t cred) {
* - tkey-gssapi-credential doesn't start with DNS/
* - the default realm in /etc/krb5.conf and the
* tkey-gssapi-credential bind config option don't match
+ *
+ * Note that if tkey-gssapi-keytab is set then these configure checks
+ * are not performed, and runtime errors from gssapi are used instead
*/
static void
-dst_gssapi_check_config(const char *gss_name) {
+check_config(const char *gss_name) {
const char *p;
krb5_context krb5_ctx;
char *krb5_realm = NULL;
@@ -263,7 +268,7 @@ dst_gssapi_acquirecred(dns_name_t *name, isc_boolean_t initiate,
* here when we're in the acceptor role, which would let us
* default the hostname and use a compiled in default service
* name of "DNS", giving one less thing to configure in
- * named.conf. Unfortunately, this creates a circular
+ * named.conf. Unfortunately, this creates a circular
* dependency due to DNS-based realm lookup in at least one
* GSSAPI implementation (Heimdal). Oh well.
*/
@@ -273,7 +278,7 @@ dst_gssapi_acquirecred(dns_name_t *name, isc_boolean_t initiate,
gret = gss_import_name(&minor, &gnamebuf,
GSS_C_NO_OID, &gname);
if (gret != GSS_S_COMPLETE) {
- dst_gssapi_check_config((char *)array);
+ check_config((char *)array);
gss_log(3, "failed gss_import_name: %s",
gss_error_tostring(gret, minor, buf,
@@ -306,7 +311,7 @@ dst_gssapi_acquirecred(dns_name_t *name, isc_boolean_t initiate,
initiate ? "initiate" : "accept",
(char *)gnamebuf.value,
gss_error_tostring(gret, minor, buf, sizeof(buf)));
- dst_gssapi_check_config((char *)array);
+ check_config((char *)array);
return (ISC_R_FAILURE);
}
@@ -361,7 +366,7 @@ dst_gssapi_identitymatchesrealmkrb5(dns_name_t *signer, dns_name_t *name,
rname++;
/*
- * Find the host portion of the signer's name. We do this by
+ * Find the host portion of the signer's name. We do this by
* searching for the first / character. We then check to make
* certain the instance name is "host"
*
@@ -440,7 +445,7 @@ dst_gssapi_identitymatchesrealmms(dns_name_t *signer, dns_name_t *name,
return (isc_boolean_false);
/*
- * Find the host portion of the signer's name. Zero out the $ so
+ * Find the host portion of the signer's name. Zero out the $ so
* it terminates the signer's name, and skip past the @ for
* the realm.
*
@@ -454,7 +459,7 @@ dst_gssapi_identitymatchesrealmms(dns_name_t *signer, dns_name_t *name,
/*
* Find the first . in the target name, and make it the end of
- * the string. The rest of the name has to match the realm.
+ * the string. The rest of the name has to match the realm.
*/
if (name != NULL) {
nname = strchr(nbuf, '.');
@@ -510,9 +515,34 @@ dst_gssapi_releasecred(gss_cred_id_t *cred) {
#endif
}
+#ifdef GSSAPI
+/*
+ * Format a gssapi error message info into a char ** on the given memory
+ * context. This is used to return gssapi error messages back up the
+ * call chain for reporting to the user.
+ */
+static void
+gss_err_message(isc_mem_t *mctx, isc_uint32_t major, isc_uint32_t minor,
+ char **err_message)
+{
+ char buf[1024];
+ char *estr;
+
+ if (err_message == NULL || mctx == NULL) {
+ /* the caller doesn't want any error messages */
+ return;
+ }
+
+ estr = gss_error_tostring(major, minor, buf, sizeof(buf));
+ if (estr)
+ (*err_message) = isc_mem_strdup(mctx, estr);
+}
+#endif
+
isc_result_t
dst_gssapi_initctx(dns_name_t *name, isc_buffer_t *intoken,
- isc_buffer_t *outtoken, gss_ctx_id_t *gssctx)
+ isc_buffer_t *outtoken, gss_ctx_id_t *gssctx,
+ isc_mem_t *mctx, char **err_message)
{
#ifdef GSSAPI
isc_region_t r;
@@ -523,10 +553,10 @@ dst_gssapi_initctx(dns_name_t *name, isc_buffer_t *intoken,
isc_result_t result;
gss_buffer_desc gnamebuf;
unsigned char array[DNS_NAME_MAXTEXT + 1];
- char buf[1024];
/* Client must pass us a valid gss_ctx_id_t here */
REQUIRE(gssctx != NULL);
+ REQUIRE(mctx != NULL);
isc_buffer_init(&namebuf, array, sizeof(array));
name_to_gbuffer(name, &namebuf, &gnamebuf);
@@ -534,6 +564,7 @@ dst_gssapi_initctx(dns_name_t *name, isc_buffer_t *intoken,
/* Get the name as a GSS name */
gret = gss_import_name(&minor, &gnamebuf, GSS_C_NO_OID, &gname);
if (gret != GSS_S_COMPLETE) {
+ gss_err_message(mctx, gret, minor, err_message);
result = ISC_R_FAILURE;
goto out;
}
@@ -550,8 +581,7 @@ dst_gssapi_initctx(dns_name_t *name, isc_buffer_t *intoken,
* Note that we don't set GSS_C_SEQUENCE_FLAG as Windows DNS
* servers don't like it.
*/
- flags = GSS_C_REPLAY_FLAG | GSS_C_MUTUAL_FLAG | GSS_C_DELEG_FLAG |
- GSS_C_INTEG_FLAG;
+ flags = GSS_C_REPLAY_FLAG | GSS_C_MUTUAL_FLAG | GSS_C_INTEG_FLAG;
gret = gss_init_sec_context(&minor, GSS_C_NO_CREDENTIAL, gssctx,
gname, GSS_SPNEGO_MECHANISM, flags,
@@ -559,9 +589,9 @@ dst_gssapi_initctx(dns_name_t *name, isc_buffer_t *intoken,
NULL, &gouttoken, &ret_flags, NULL);
if (gret != GSS_S_COMPLETE && gret != GSS_S_CONTINUE_NEEDED) {
- gss_log(3, "Failure initiating security context");
- gss_log(3, "%s", gss_error_tostring(gret, minor,
- buf, sizeof(buf)));
+ gss_err_message(mctx, gret, minor, err_message);
+ gss_log(3, "Failure initiating security context: %s",
+ *err_message);
result = ISC_R_FAILURE;
goto out;
}
@@ -593,6 +623,8 @@ dst_gssapi_initctx(dns_name_t *name, isc_buffer_t *intoken,
UNUSED(intoken);
UNUSED(outtoken);
UNUSED(gssctx);
+ UNUSED(mctx);
+ UNUSED(err_message);
return (ISC_R_NOTIMPLEMENTED);
#endif
@@ -600,6 +632,7 @@ dst_gssapi_initctx(dns_name_t *name, isc_buffer_t *intoken,
isc_result_t
dst_gssapi_acceptctx(gss_cred_id_t cred,
+ const char *gssapi_keytab,
isc_region_t *intoken, isc_buffer_t **outtoken,
gss_ctx_id_t *ctxout, dns_name_t *principal,
isc_mem_t *mctx)
@@ -626,6 +659,34 @@ dst_gssapi_acceptctx(gss_cred_id_t cred,
else
context = *ctxout;
+ if (gssapi_keytab != NULL) {
+#ifdef ISC_PLATFORM_GSSAPI_KRB5_HEADER
+ gret = gsskrb5_register_acceptor_identity(gssapi_keytab);
+ if (gret != GSS_S_COMPLETE) {
+ gss_log(3, "failed "
+ "gsskrb5_register_acceptor_identity(%s): %s",
+ gssapi_keytab,
+ gss_error_tostring(gret, minor,
+ buf, sizeof(buf)));
+ return (DNS_R_INVALIDTKEY);
+ }
+#else
+ /*
+ * Minimize memory leakage by only setting KRB5_KTNAME
+ * if it needs to change.
+ */
+ const char *old = getenv("KRB5_KTNAME");
+ if (old == NULL || strcmp(old, gssapi_keytab) != 0) {
+ char *kt = malloc(strlen(gssapi_keytab) + 13);
+ if (kt == NULL)
+ return (ISC_R_NOMEMORY);
+ sprintf(kt, "KRB5_KTNAME=%s", gssapi_keytab);
+ if (putenv(kt) != 0)
+ return (ISC_R_NOMEMORY);
+ }
+#endif
+ }
+
gret = gss_accept_sec_context(&minor, &context, cred, &gintoken,
GSS_C_NO_CHANNEL_BINDINGS, &gname,
NULL, &gouttoken, NULL, NULL, NULL);
@@ -692,7 +753,7 @@ dst_gssapi_acceptctx(gss_cred_id_t cred,
isc_buffer_add(&namebuf, r.length);
RETERR(dns_name_fromtext(principal, &namebuf, dns_rootname,
- ISC_FALSE, NULL));
+ 0, NULL));
if (gnamebuf.length != 0) {
gret = gss_release_buffer(&minor, &gnamebuf);
@@ -717,6 +778,7 @@ dst_gssapi_acceptctx(gss_cred_id_t cred,
return (result);
#else
UNUSED(cred);
+ UNUSED(gssapi_keytab);
UNUSED(intoken);
UNUSED(outtoken);
UNUSED(ctxout);
diff --git a/contrib/bind9/lib/dns/hmac_link.c b/contrib/bind9/lib/dns/hmac_link.c
index 5d6dce7..ecc4089 100644
--- a/contrib/bind9/lib/dns/hmac_link.c
+++ b/contrib/bind9/lib/dns/hmac_link.c
@@ -1,5 +1,5 @@
/*
- * Portions Copyright (C) 2004-2008 Internet Systems Consortium, Inc. ("ISC")
+ * Portions Copyright (C) 2004-2011 Internet Systems Consortium, Inc. ("ISC")
* Portions Copyright (C) 1999-2002 Internet Software Consortium.
*
* Permission to use, copy, modify, and/or distribute this software for any
@@ -31,7 +31,7 @@
/*
* Principal Author: Brian Wellington
- * $Id: hmac_link.c,v 1.11 2008-04-01 23:47:10 tbox Exp $
+ * $Id: hmac_link.c,v 1.19 2011-01-11 23:47:13 tbox Exp $
*/
#include <config.h>
@@ -50,14 +50,10 @@
#include "dst_internal.h"
#include "dst_parse.h"
-#define HMAC_LEN 64
-#define HMAC_IPAD 0x36
-#define HMAC_OPAD 0x5c
-
static isc_result_t hmacmd5_fromdns(dst_key_t *key, isc_buffer_t *data);
struct dst_hmacmd5_key {
- unsigned char key[HMAC_LEN];
+ unsigned char key[ISC_MD5_BLOCK_LENGTH];
};
static isc_result_t
@@ -79,7 +75,7 @@ hmacmd5_createctx(dst_key_t *key, dst_context_t *dctx) {
hmacmd5ctx = isc_mem_get(dctx->mctx, sizeof(isc_hmacmd5_t));
if (hmacmd5ctx == NULL)
return (ISC_R_NOMEMORY);
- isc_hmacmd5_init(hmacmd5ctx, hkey->key, HMAC_LEN);
+ isc_hmacmd5_init(hmacmd5ctx, hkey->key, ISC_SHA1_BLOCK_LENGTH);
dctx->ctxdata.hmacmd5ctx = hmacmd5ctx;
return (ISC_R_SUCCESS);
}
@@ -142,26 +138,28 @@ hmacmd5_compare(const dst_key_t *key1, const dst_key_t *key2) {
else if (hkey1 == NULL || hkey2 == NULL)
return (ISC_FALSE);
- if (memcmp(hkey1->key, hkey2->key, HMAC_LEN) == 0)
+ if (memcmp(hkey1->key, hkey2->key, ISC_SHA1_BLOCK_LENGTH) == 0)
return (ISC_TRUE);
else
return (ISC_FALSE);
}
static isc_result_t
-hmacmd5_generate(dst_key_t *key, int pseudorandom_ok) {
+hmacmd5_generate(dst_key_t *key, int pseudorandom_ok, void (*callback)(int)) {
isc_buffer_t b;
isc_result_t ret;
- int bytes;
- unsigned char data[HMAC_LEN];
+ unsigned int bytes;
+ unsigned char data[ISC_SHA1_BLOCK_LENGTH];
+
+ UNUSED(callback);
bytes = (key->key_size + 7) / 8;
- if (bytes > HMAC_LEN) {
- bytes = HMAC_LEN;
- key->key_size = HMAC_LEN * 8;
+ if (bytes > ISC_SHA1_BLOCK_LENGTH) {
+ bytes = ISC_SHA1_BLOCK_LENGTH;
+ key->key_size = ISC_SHA1_BLOCK_LENGTH * 8;
}
- memset(data, 0, HMAC_LEN);
+ memset(data, 0, ISC_SHA1_BLOCK_LENGTH);
ret = dst__entropy_getdata(data, bytes, ISC_TF(pseudorandom_ok != 0));
if (ret != ISC_R_SUCCESS)
@@ -170,7 +168,7 @@ hmacmd5_generate(dst_key_t *key, int pseudorandom_ok) {
isc_buffer_init(&b, data, bytes);
isc_buffer_add(&b, bytes);
ret = hmacmd5_fromdns(key, &b);
- memset(data, 0, HMAC_LEN);
+ memset(data, 0, ISC_SHA1_BLOCK_LENGTH);
return (ret);
}
@@ -184,6 +182,7 @@ hmacmd5_isprivate(const dst_key_t *key) {
static void
hmacmd5_destroy(dst_key_t *key) {
dst_hmacmd5_key_t *hkey = key->keydata.hmacmd5;
+
memset(hkey, 0, sizeof(dst_hmacmd5_key_t));
isc_mem_put(key->mctx, hkey, sizeof(dst_hmacmd5_key_t));
key->keydata.hmacmd5 = NULL;
@@ -223,7 +222,7 @@ hmacmd5_fromdns(dst_key_t *key, isc_buffer_t *data) {
memset(hkey->key, 0, sizeof(hkey->key));
- if (r.length > HMAC_LEN) {
+ if (r.length > ISC_SHA1_BLOCK_LENGTH) {
isc_md5_init(&md5ctx);
isc_md5_update(&md5ctx, r.base, r.length);
isc_md5_final(&md5ctx, hkey->key);
@@ -268,15 +267,17 @@ hmacmd5_tofile(const dst_key_t *key, const char *directory) {
}
static isc_result_t
-hmacmd5_parse(dst_key_t *key, isc_lex_t *lexer) {
+hmacmd5_parse(dst_key_t *key, isc_lex_t *lexer, dst_key_t *pub) {
dst_private_t priv;
isc_result_t result, tresult;
isc_buffer_t b;
isc_mem_t *mctx = key->mctx;
unsigned int i;
+ UNUSED(pub);
/* read private key file */
- result = dst__privstruct_parse(key, DST_ALG_HMACMD5, lexer, mctx, &priv);
+ result = dst__privstruct_parse(key, DST_ALG_HMACMD5, lexer, mctx,
+ &priv);
if (result != ISC_R_SUCCESS)
return (result);
@@ -324,6 +325,8 @@ static dst_func_t hmacmd5_functions = {
hmacmd5_parse,
NULL, /*%< cleanup */
NULL, /*%< fromlabel */
+ NULL, /*%< dump */
+ NULL, /*%< restore */
};
isc_result_t
@@ -337,7 +340,7 @@ dst__hmacmd5_init(dst_func_t **funcp) {
static isc_result_t hmacsha1_fromdns(dst_key_t *key, isc_buffer_t *data);
struct dst_hmacsha1_key {
- unsigned char key[ISC_SHA1_DIGESTLENGTH];
+ unsigned char key[ISC_SHA1_BLOCK_LENGTH];
};
static isc_result_t
@@ -348,7 +351,7 @@ hmacsha1_createctx(dst_key_t *key, dst_context_t *dctx) {
hmacsha1ctx = isc_mem_get(dctx->mctx, sizeof(isc_hmacsha1_t));
if (hmacsha1ctx == NULL)
return (ISC_R_NOMEMORY);
- isc_hmacsha1_init(hmacsha1ctx, hkey->key, ISC_SHA1_DIGESTLENGTH);
+ isc_hmacsha1_init(hmacsha1ctx, hkey->key, ISC_SHA1_BLOCK_LENGTH);
dctx->ctxdata.hmacsha1ctx = hmacsha1ctx;
return (ISC_R_SUCCESS);
}
@@ -411,26 +414,28 @@ hmacsha1_compare(const dst_key_t *key1, const dst_key_t *key2) {
else if (hkey1 == NULL || hkey2 == NULL)
return (ISC_FALSE);
- if (memcmp(hkey1->key, hkey2->key, ISC_SHA1_DIGESTLENGTH) == 0)
+ if (memcmp(hkey1->key, hkey2->key, ISC_SHA1_BLOCK_LENGTH) == 0)
return (ISC_TRUE);
else
return (ISC_FALSE);
}
static isc_result_t
-hmacsha1_generate(dst_key_t *key, int pseudorandom_ok) {
+hmacsha1_generate(dst_key_t *key, int pseudorandom_ok, void (*callback)(int)) {
isc_buffer_t b;
isc_result_t ret;
- int bytes;
- unsigned char data[HMAC_LEN];
+ unsigned int bytes;
+ unsigned char data[ISC_SHA1_BLOCK_LENGTH];
+
+ UNUSED(callback);
bytes = (key->key_size + 7) / 8;
- if (bytes > HMAC_LEN) {
- bytes = HMAC_LEN;
- key->key_size = HMAC_LEN * 8;
+ if (bytes > ISC_SHA1_BLOCK_LENGTH) {
+ bytes = ISC_SHA1_BLOCK_LENGTH;
+ key->key_size = ISC_SHA1_BLOCK_LENGTH * 8;
}
- memset(data, 0, HMAC_LEN);
+ memset(data, 0, ISC_SHA1_BLOCK_LENGTH);
ret = dst__entropy_getdata(data, bytes, ISC_TF(pseudorandom_ok != 0));
if (ret != ISC_R_SUCCESS)
@@ -439,7 +444,7 @@ hmacsha1_generate(dst_key_t *key, int pseudorandom_ok) {
isc_buffer_init(&b, data, bytes);
isc_buffer_add(&b, bytes);
ret = hmacsha1_fromdns(key, &b);
- memset(data, 0, ISC_SHA1_DIGESTLENGTH);
+ memset(data, 0, ISC_SHA1_BLOCK_LENGTH);
return (ret);
}
@@ -453,6 +458,7 @@ hmacsha1_isprivate(const dst_key_t *key) {
static void
hmacsha1_destroy(dst_key_t *key) {
dst_hmacsha1_key_t *hkey = key->keydata.hmacsha1;
+
memset(hkey, 0, sizeof(dst_hmacsha1_key_t));
isc_mem_put(key->mctx, hkey, sizeof(dst_hmacsha1_key_t));
key->keydata.hmacsha1 = NULL;
@@ -492,7 +498,7 @@ hmacsha1_fromdns(dst_key_t *key, isc_buffer_t *data) {
memset(hkey->key, 0, sizeof(hkey->key));
- if (r.length > ISC_SHA1_DIGESTLENGTH) {
+ if (r.length > ISC_SHA1_BLOCK_LENGTH) {
isc_sha1_init(&sha1ctx);
isc_sha1_update(&sha1ctx, r.base, r.length);
isc_sha1_final(&sha1ctx, hkey->key);
@@ -537,13 +543,14 @@ hmacsha1_tofile(const dst_key_t *key, const char *directory) {
}
static isc_result_t
-hmacsha1_parse(dst_key_t *key, isc_lex_t *lexer) {
+hmacsha1_parse(dst_key_t *key, isc_lex_t *lexer, dst_key_t *pub) {
dst_private_t priv;
isc_result_t result, tresult;
isc_buffer_t b;
isc_mem_t *mctx = key->mctx;
unsigned int i;
+ UNUSED(pub);
/* read private key file */
result = dst__privstruct_parse(key, DST_ALG_HMACSHA1, lexer, mctx,
&priv);
@@ -594,6 +601,8 @@ static dst_func_t hmacsha1_functions = {
hmacsha1_parse,
NULL, /* cleanup */
NULL, /* fromlabel */
+ NULL, /* dump */
+ NULL, /* restore */
};
isc_result_t
@@ -607,7 +616,7 @@ dst__hmacsha1_init(dst_func_t **funcp) {
static isc_result_t hmacsha224_fromdns(dst_key_t *key, isc_buffer_t *data);
struct dst_hmacsha224_key {
- unsigned char key[ISC_SHA224_DIGESTLENGTH];
+ unsigned char key[ISC_SHA224_BLOCK_LENGTH];
};
static isc_result_t
@@ -618,7 +627,7 @@ hmacsha224_createctx(dst_key_t *key, dst_context_t *dctx) {
hmacsha224ctx = isc_mem_get(dctx->mctx, sizeof(isc_hmacsha224_t));
if (hmacsha224ctx == NULL)
return (ISC_R_NOMEMORY);
- isc_hmacsha224_init(hmacsha224ctx, hkey->key, ISC_SHA224_DIGESTLENGTH);
+ isc_hmacsha224_init(hmacsha224ctx, hkey->key, ISC_SHA224_BLOCK_LENGTH);
dctx->ctxdata.hmacsha224ctx = hmacsha224ctx;
return (ISC_R_SUCCESS);
}
@@ -681,26 +690,30 @@ hmacsha224_compare(const dst_key_t *key1, const dst_key_t *key2) {
else if (hkey1 == NULL || hkey2 == NULL)
return (ISC_FALSE);
- if (memcmp(hkey1->key, hkey2->key, ISC_SHA224_DIGESTLENGTH) == 0)
+ if (memcmp(hkey1->key, hkey2->key, ISC_SHA224_BLOCK_LENGTH) == 0)
return (ISC_TRUE);
else
return (ISC_FALSE);
}
static isc_result_t
-hmacsha224_generate(dst_key_t *key, int pseudorandom_ok) {
+hmacsha224_generate(dst_key_t *key, int pseudorandom_ok,
+ void (*callback)(int))
+{
isc_buffer_t b;
isc_result_t ret;
- int bytes;
- unsigned char data[HMAC_LEN];
+ unsigned int bytes;
+ unsigned char data[ISC_SHA224_BLOCK_LENGTH];
+
+ UNUSED(callback);
bytes = (key->key_size + 7) / 8;
- if (bytes > HMAC_LEN) {
- bytes = HMAC_LEN;
- key->key_size = HMAC_LEN * 8;
+ if (bytes > ISC_SHA224_BLOCK_LENGTH) {
+ bytes = ISC_SHA224_BLOCK_LENGTH;
+ key->key_size = ISC_SHA224_BLOCK_LENGTH * 8;
}
- memset(data, 0, HMAC_LEN);
+ memset(data, 0, ISC_SHA224_BLOCK_LENGTH);
ret = dst__entropy_getdata(data, bytes, ISC_TF(pseudorandom_ok != 0));
if (ret != ISC_R_SUCCESS)
@@ -709,7 +722,7 @@ hmacsha224_generate(dst_key_t *key, int pseudorandom_ok) {
isc_buffer_init(&b, data, bytes);
isc_buffer_add(&b, bytes);
ret = hmacsha224_fromdns(key, &b);
- memset(data, 0, ISC_SHA224_DIGESTLENGTH);
+ memset(data, 0, ISC_SHA224_BLOCK_LENGTH);
return (ret);
}
@@ -723,6 +736,7 @@ hmacsha224_isprivate(const dst_key_t *key) {
static void
hmacsha224_destroy(dst_key_t *key) {
dst_hmacsha224_key_t *hkey = key->keydata.hmacsha224;
+
memset(hkey, 0, sizeof(dst_hmacsha224_key_t));
isc_mem_put(key->mctx, hkey, sizeof(dst_hmacsha224_key_t));
key->keydata.hmacsha224 = NULL;
@@ -762,7 +776,7 @@ hmacsha224_fromdns(dst_key_t *key, isc_buffer_t *data) {
memset(hkey->key, 0, sizeof(hkey->key));
- if (r.length > ISC_SHA224_DIGESTLENGTH) {
+ if (r.length > ISC_SHA224_BLOCK_LENGTH) {
isc_sha224_init(&sha224ctx);
isc_sha224_update(&sha224ctx, r.base, r.length);
isc_sha224_final(hkey->key, &sha224ctx);
@@ -807,13 +821,14 @@ hmacsha224_tofile(const dst_key_t *key, const char *directory) {
}
static isc_result_t
-hmacsha224_parse(dst_key_t *key, isc_lex_t *lexer) {
+hmacsha224_parse(dst_key_t *key, isc_lex_t *lexer, dst_key_t *pub) {
dst_private_t priv;
isc_result_t result, tresult;
isc_buffer_t b;
isc_mem_t *mctx = key->mctx;
unsigned int i;
+ UNUSED(pub);
/* read private key file */
result = dst__privstruct_parse(key, DST_ALG_HMACSHA224, lexer, mctx,
&priv);
@@ -864,6 +879,8 @@ static dst_func_t hmacsha224_functions = {
hmacsha224_parse,
NULL, /* cleanup */
NULL, /* fromlabel */
+ NULL, /* dump */
+ NULL, /* restore */
};
isc_result_t
@@ -877,7 +894,7 @@ dst__hmacsha224_init(dst_func_t **funcp) {
static isc_result_t hmacsha256_fromdns(dst_key_t *key, isc_buffer_t *data);
struct dst_hmacsha256_key {
- unsigned char key[ISC_SHA256_DIGESTLENGTH];
+ unsigned char key[ISC_SHA256_BLOCK_LENGTH];
};
static isc_result_t
@@ -888,7 +905,7 @@ hmacsha256_createctx(dst_key_t *key, dst_context_t *dctx) {
hmacsha256ctx = isc_mem_get(dctx->mctx, sizeof(isc_hmacsha256_t));
if (hmacsha256ctx == NULL)
return (ISC_R_NOMEMORY);
- isc_hmacsha256_init(hmacsha256ctx, hkey->key, ISC_SHA256_DIGESTLENGTH);
+ isc_hmacsha256_init(hmacsha256ctx, hkey->key, ISC_SHA256_BLOCK_LENGTH);
dctx->ctxdata.hmacsha256ctx = hmacsha256ctx;
return (ISC_R_SUCCESS);
}
@@ -951,26 +968,30 @@ hmacsha256_compare(const dst_key_t *key1, const dst_key_t *key2) {
else if (hkey1 == NULL || hkey2 == NULL)
return (ISC_FALSE);
- if (memcmp(hkey1->key, hkey2->key, ISC_SHA256_DIGESTLENGTH) == 0)
+ if (memcmp(hkey1->key, hkey2->key, ISC_SHA256_BLOCK_LENGTH) == 0)
return (ISC_TRUE);
else
return (ISC_FALSE);
}
static isc_result_t
-hmacsha256_generate(dst_key_t *key, int pseudorandom_ok) {
+hmacsha256_generate(dst_key_t *key, int pseudorandom_ok,
+ void (*callback)(int))
+{
isc_buffer_t b;
isc_result_t ret;
- int bytes;
- unsigned char data[HMAC_LEN];
+ unsigned int bytes;
+ unsigned char data[ISC_SHA256_BLOCK_LENGTH];
+
+ UNUSED(callback);
bytes = (key->key_size + 7) / 8;
- if (bytes > HMAC_LEN) {
- bytes = HMAC_LEN;
- key->key_size = HMAC_LEN * 8;
+ if (bytes > ISC_SHA256_BLOCK_LENGTH) {
+ bytes = ISC_SHA256_BLOCK_LENGTH;
+ key->key_size = ISC_SHA256_BLOCK_LENGTH * 8;
}
- memset(data, 0, HMAC_LEN);
+ memset(data, 0, ISC_SHA256_BLOCK_LENGTH);
ret = dst__entropy_getdata(data, bytes, ISC_TF(pseudorandom_ok != 0));
if (ret != ISC_R_SUCCESS)
@@ -979,7 +1000,7 @@ hmacsha256_generate(dst_key_t *key, int pseudorandom_ok) {
isc_buffer_init(&b, data, bytes);
isc_buffer_add(&b, bytes);
ret = hmacsha256_fromdns(key, &b);
- memset(data, 0, ISC_SHA256_DIGESTLENGTH);
+ memset(data, 0, ISC_SHA256_BLOCK_LENGTH);
return (ret);
}
@@ -993,6 +1014,7 @@ hmacsha256_isprivate(const dst_key_t *key) {
static void
hmacsha256_destroy(dst_key_t *key) {
dst_hmacsha256_key_t *hkey = key->keydata.hmacsha256;
+
memset(hkey, 0, sizeof(dst_hmacsha256_key_t));
isc_mem_put(key->mctx, hkey, sizeof(dst_hmacsha256_key_t));
key->keydata.hmacsha256 = NULL;
@@ -1032,7 +1054,7 @@ hmacsha256_fromdns(dst_key_t *key, isc_buffer_t *data) {
memset(hkey->key, 0, sizeof(hkey->key));
- if (r.length > ISC_SHA256_DIGESTLENGTH) {
+ if (r.length > ISC_SHA256_BLOCK_LENGTH) {
isc_sha256_init(&sha256ctx);
isc_sha256_update(&sha256ctx, r.base, r.length);
isc_sha256_final(hkey->key, &sha256ctx);
@@ -1077,13 +1099,14 @@ hmacsha256_tofile(const dst_key_t *key, const char *directory) {
}
static isc_result_t
-hmacsha256_parse(dst_key_t *key, isc_lex_t *lexer) {
+hmacsha256_parse(dst_key_t *key, isc_lex_t *lexer, dst_key_t *pub) {
dst_private_t priv;
isc_result_t result, tresult;
isc_buffer_t b;
isc_mem_t *mctx = key->mctx;
unsigned int i;
+ UNUSED(pub);
/* read private key file */
result = dst__privstruct_parse(key, DST_ALG_HMACSHA256, lexer, mctx,
&priv);
@@ -1134,6 +1157,8 @@ static dst_func_t hmacsha256_functions = {
hmacsha256_parse,
NULL, /* cleanup */
NULL, /* fromlabel */
+ NULL, /* dump */
+ NULL, /* restore */
};
isc_result_t
@@ -1147,7 +1172,7 @@ dst__hmacsha256_init(dst_func_t **funcp) {
static isc_result_t hmacsha384_fromdns(dst_key_t *key, isc_buffer_t *data);
struct dst_hmacsha384_key {
- unsigned char key[ISC_SHA384_DIGESTLENGTH];
+ unsigned char key[ISC_SHA384_BLOCK_LENGTH];
};
static isc_result_t
@@ -1158,7 +1183,7 @@ hmacsha384_createctx(dst_key_t *key, dst_context_t *dctx) {
hmacsha384ctx = isc_mem_get(dctx->mctx, sizeof(isc_hmacsha384_t));
if (hmacsha384ctx == NULL)
return (ISC_R_NOMEMORY);
- isc_hmacsha384_init(hmacsha384ctx, hkey->key, ISC_SHA384_DIGESTLENGTH);
+ isc_hmacsha384_init(hmacsha384ctx, hkey->key, ISC_SHA384_BLOCK_LENGTH);
dctx->ctxdata.hmacsha384ctx = hmacsha384ctx;
return (ISC_R_SUCCESS);
}
@@ -1221,26 +1246,30 @@ hmacsha384_compare(const dst_key_t *key1, const dst_key_t *key2) {
else if (hkey1 == NULL || hkey2 == NULL)
return (ISC_FALSE);
- if (memcmp(hkey1->key, hkey2->key, ISC_SHA384_DIGESTLENGTH) == 0)
+ if (memcmp(hkey1->key, hkey2->key, ISC_SHA384_BLOCK_LENGTH) == 0)
return (ISC_TRUE);
else
return (ISC_FALSE);
}
static isc_result_t
-hmacsha384_generate(dst_key_t *key, int pseudorandom_ok) {
+hmacsha384_generate(dst_key_t *key, int pseudorandom_ok,
+ void (*callback)(int))
+{
isc_buffer_t b;
isc_result_t ret;
- int bytes;
- unsigned char data[HMAC_LEN];
+ unsigned int bytes;
+ unsigned char data[ISC_SHA384_BLOCK_LENGTH];
+
+ UNUSED(callback);
bytes = (key->key_size + 7) / 8;
- if (bytes > HMAC_LEN) {
- bytes = HMAC_LEN;
- key->key_size = HMAC_LEN * 8;
+ if (bytes > ISC_SHA384_BLOCK_LENGTH) {
+ bytes = ISC_SHA384_BLOCK_LENGTH;
+ key->key_size = ISC_SHA384_BLOCK_LENGTH * 8;
}
- memset(data, 0, HMAC_LEN);
+ memset(data, 0, ISC_SHA384_BLOCK_LENGTH);
ret = dst__entropy_getdata(data, bytes, ISC_TF(pseudorandom_ok != 0));
if (ret != ISC_R_SUCCESS)
@@ -1249,7 +1278,7 @@ hmacsha384_generate(dst_key_t *key, int pseudorandom_ok) {
isc_buffer_init(&b, data, bytes);
isc_buffer_add(&b, bytes);
ret = hmacsha384_fromdns(key, &b);
- memset(data, 0, ISC_SHA384_DIGESTLENGTH);
+ memset(data, 0, ISC_SHA384_BLOCK_LENGTH);
return (ret);
}
@@ -1263,6 +1292,7 @@ hmacsha384_isprivate(const dst_key_t *key) {
static void
hmacsha384_destroy(dst_key_t *key) {
dst_hmacsha384_key_t *hkey = key->keydata.hmacsha384;
+
memset(hkey, 0, sizeof(dst_hmacsha384_key_t));
isc_mem_put(key->mctx, hkey, sizeof(dst_hmacsha384_key_t));
key->keydata.hmacsha384 = NULL;
@@ -1302,7 +1332,7 @@ hmacsha384_fromdns(dst_key_t *key, isc_buffer_t *data) {
memset(hkey->key, 0, sizeof(hkey->key));
- if (r.length > ISC_SHA384_DIGESTLENGTH) {
+ if (r.length > ISC_SHA384_BLOCK_LENGTH) {
isc_sha384_init(&sha384ctx);
isc_sha384_update(&sha384ctx, r.base, r.length);
isc_sha384_final(hkey->key, &sha384ctx);
@@ -1347,13 +1377,14 @@ hmacsha384_tofile(const dst_key_t *key, const char *directory) {
}
static isc_result_t
-hmacsha384_parse(dst_key_t *key, isc_lex_t *lexer) {
+hmacsha384_parse(dst_key_t *key, isc_lex_t *lexer, dst_key_t *pub) {
dst_private_t priv;
isc_result_t result, tresult;
isc_buffer_t b;
isc_mem_t *mctx = key->mctx;
unsigned int i;
+ UNUSED(pub);
/* read private key file */
result = dst__privstruct_parse(key, DST_ALG_HMACSHA384, lexer, mctx,
&priv);
@@ -1404,6 +1435,8 @@ static dst_func_t hmacsha384_functions = {
hmacsha384_parse,
NULL, /* cleanup */
NULL, /* fromlabel */
+ NULL, /* dump */
+ NULL, /* restore */
};
isc_result_t
@@ -1417,7 +1450,7 @@ dst__hmacsha384_init(dst_func_t **funcp) {
static isc_result_t hmacsha512_fromdns(dst_key_t *key, isc_buffer_t *data);
struct dst_hmacsha512_key {
- unsigned char key[ISC_SHA512_DIGESTLENGTH];
+ unsigned char key[ISC_SHA512_BLOCK_LENGTH];
};
static isc_result_t
@@ -1428,7 +1461,7 @@ hmacsha512_createctx(dst_key_t *key, dst_context_t *dctx) {
hmacsha512ctx = isc_mem_get(dctx->mctx, sizeof(isc_hmacsha512_t));
if (hmacsha512ctx == NULL)
return (ISC_R_NOMEMORY);
- isc_hmacsha512_init(hmacsha512ctx, hkey->key, ISC_SHA512_DIGESTLENGTH);
+ isc_hmacsha512_init(hmacsha512ctx, hkey->key, ISC_SHA512_BLOCK_LENGTH);
dctx->ctxdata.hmacsha512ctx = hmacsha512ctx;
return (ISC_R_SUCCESS);
}
@@ -1491,26 +1524,30 @@ hmacsha512_compare(const dst_key_t *key1, const dst_key_t *key2) {
else if (hkey1 == NULL || hkey2 == NULL)
return (ISC_FALSE);
- if (memcmp(hkey1->key, hkey2->key, ISC_SHA512_DIGESTLENGTH) == 0)
+ if (memcmp(hkey1->key, hkey2->key, ISC_SHA512_BLOCK_LENGTH) == 0)
return (ISC_TRUE);
else
return (ISC_FALSE);
}
static isc_result_t
-hmacsha512_generate(dst_key_t *key, int pseudorandom_ok) {
+hmacsha512_generate(dst_key_t *key, int pseudorandom_ok,
+ void (*callback)(int))
+{
isc_buffer_t b;
isc_result_t ret;
- int bytes;
- unsigned char data[HMAC_LEN];
+ unsigned int bytes;
+ unsigned char data[ISC_SHA512_BLOCK_LENGTH];
+
+ UNUSED(callback);
bytes = (key->key_size + 7) / 8;
- if (bytes > HMAC_LEN) {
- bytes = HMAC_LEN;
- key->key_size = HMAC_LEN * 8;
+ if (bytes > ISC_SHA512_BLOCK_LENGTH) {
+ bytes = ISC_SHA512_BLOCK_LENGTH;
+ key->key_size = ISC_SHA512_BLOCK_LENGTH * 8;
}
- memset(data, 0, HMAC_LEN);
+ memset(data, 0, ISC_SHA512_BLOCK_LENGTH);
ret = dst__entropy_getdata(data, bytes, ISC_TF(pseudorandom_ok != 0));
if (ret != ISC_R_SUCCESS)
@@ -1519,7 +1556,7 @@ hmacsha512_generate(dst_key_t *key, int pseudorandom_ok) {
isc_buffer_init(&b, data, bytes);
isc_buffer_add(&b, bytes);
ret = hmacsha512_fromdns(key, &b);
- memset(data, 0, ISC_SHA512_DIGESTLENGTH);
+ memset(data, 0, ISC_SHA512_BLOCK_LENGTH);
return (ret);
}
@@ -1533,6 +1570,7 @@ hmacsha512_isprivate(const dst_key_t *key) {
static void
hmacsha512_destroy(dst_key_t *key) {
dst_hmacsha512_key_t *hkey = key->keydata.hmacsha512;
+
memset(hkey, 0, sizeof(dst_hmacsha512_key_t));
isc_mem_put(key->mctx, hkey, sizeof(dst_hmacsha512_key_t));
key->keydata.hmacsha512 = NULL;
@@ -1572,7 +1610,7 @@ hmacsha512_fromdns(dst_key_t *key, isc_buffer_t *data) {
memset(hkey->key, 0, sizeof(hkey->key));
- if (r.length > ISC_SHA512_DIGESTLENGTH) {
+ if (r.length > ISC_SHA512_BLOCK_LENGTH) {
isc_sha512_init(&sha512ctx);
isc_sha512_update(&sha512ctx, r.base, r.length);
isc_sha512_final(hkey->key, &sha512ctx);
@@ -1617,13 +1655,14 @@ hmacsha512_tofile(const dst_key_t *key, const char *directory) {
}
static isc_result_t
-hmacsha512_parse(dst_key_t *key, isc_lex_t *lexer) {
+hmacsha512_parse(dst_key_t *key, isc_lex_t *lexer, dst_key_t *pub) {
dst_private_t priv;
isc_result_t result, tresult;
isc_buffer_t b;
isc_mem_t *mctx = key->mctx;
unsigned int i;
+ UNUSED(pub);
/* read private key file */
result = dst__privstruct_parse(key, DST_ALG_HMACSHA512, lexer, mctx,
&priv);
@@ -1674,6 +1713,8 @@ static dst_func_t hmacsha512_functions = {
hmacsha512_parse,
NULL, /* cleanup */
NULL, /* fromlabel */
+ NULL, /* dump */
+ NULL, /* restore */
};
isc_result_t
diff --git a/contrib/bind9/lib/dns/include/dns/Makefile.in b/contrib/bind9/lib/dns/include/dns/Makefile.in
index a4cd810..e13d084 100644
--- a/contrib/bind9/lib/dns/include/dns/Makefile.in
+++ b/contrib/bind9/lib/dns/include/dns/Makefile.in
@@ -1,4 +1,4 @@
-# Copyright (C) 2004, 2007, 2008 Internet Systems Consortium, Inc. ("ISC")
+# Copyright (C) 2004, 2007-2009 Internet Systems Consortium, Inc. ("ISC")
# Copyright (C) 1998-2003 Internet Software Consortium.
#
# Permission to use, copy, modify, and/or distribute this software for any
@@ -13,7 +13,7 @@
# OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
# PERFORMANCE OF THIS SOFTWARE.
-# $Id: Makefile.in,v 1.55 2008-11-14 23:47:33 tbox Exp $
+# $Id: Makefile.in,v 1.57 2009-10-08 23:48:10 tbox Exp $
srcdir = @srcdir@
VPATH = @srcdir@
@@ -21,19 +21,17 @@ top_srcdir = @top_srcdir@
@BIND9_VERSION@
-HEADERS = acl.h adb.h byaddr.h cache.h callbacks.h \
- cert.h compress.h \
+HEADERS = acl.h adb.h byaddr.h cache.h callbacks.h cert.h compress.h \
db.h dbiterator.h dbtable.h diff.h dispatch.h dlz.h \
- dnssec.h ds.h events.h fixedname.h iptable.h journal.h keyflags.h \
- keytable.h keyvalues.h lib.h log.h master.h masterdump.h \
- message.h name.h ncache.h \
- nsec.h peer.h portlist.h rbt.h rcode.h \
+ dnssec.h ds.h events.h fixedname.h iptable.h journal.h \
+ keyflags.h keytable.h keyvalues.h lib.h log.h \
+ master.h masterdump.h message.h name.h ncache.h nsec.h \
+ peer.h portlist.h private.h rbt.h rcode.h \
rdata.h rdataclass.h rdatalist.h rdataset.h rdatasetiter.h \
rdataslab.h rdatatype.h request.h resolver.h result.h \
rootns.h sdb.h sdlz.h secalg.h secproto.h soa.h ssu.h \
- tcpmsg.h time.h tkey.h \
- tsig.h ttl.h types.h validator.h version.h view.h xfrin.h \
- zone.h zonekey.h zt.h
+ tcpmsg.h time.h tkey.h tsig.h ttl.h types.h \
+ validator.h version.h view.h xfrin.h zone.h zonekey.h zt.h
GENHEADERS = enumclass.h enumtype.h rdatastruct.h
diff --git a/contrib/bind9/lib/dns/include/dns/acl.h b/contrib/bind9/lib/dns/include/dns/acl.h
index 1045cd2..04f5577 100644
--- a/contrib/bind9/lib/dns/include/dns/acl.h
+++ b/contrib/bind9/lib/dns/include/dns/acl.h
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: acl.h,v 1.31.206.2 2009-01-18 23:47:41 tbox Exp $ */
+/* $Id: acl.h,v 1.33 2009-01-17 23:47:43 tbox Exp $ */
#ifndef DNS_ACL_H
#define DNS_ACL_H 1
diff --git a/contrib/bind9/lib/dns/include/dns/cache.h b/contrib/bind9/lib/dns/include/dns/cache.h
index 94077d6..e4ea5f4 100644
--- a/contrib/bind9/lib/dns/include/dns/cache.h
+++ b/contrib/bind9/lib/dns/include/dns/cache.h
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004-2007 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004-2007, 2009 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 1999-2001 Internet Software Consortium.
*
* Permission to use, copy, modify, and/or distribute this software for any
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: cache.h,v 1.26 2007-06-19 23:47:16 tbox Exp $ */
+/* $Id: cache.h,v 1.28 2009-01-09 23:47:46 tbox Exp $ */
#ifndef DNS_CACHE_H
#define DNS_CACHE_H 1
@@ -65,8 +65,15 @@ dns_cache_create(isc_mem_t *mctx, isc_taskmgr_t *taskmgr,
isc_timermgr_t *timermgr, dns_rdataclass_t rdclass,
const char *db_type, unsigned int db_argc, char **db_argv,
dns_cache_t **cachep);
+isc_result_t
+dns_cache_create2(isc_mem_t *mctx, isc_taskmgr_t *taskmgr,
+ isc_timermgr_t *timermgr, dns_rdataclass_t rdclass,
+ const char *cachename, const char *db_type,
+ unsigned int db_argc, char **db_argv, dns_cache_t **cachep);
/*%<
- * Create a new DNS cache.
+ * Create a new DNS cache. dns_cache_create2() will create a named cache.
+ * dns_cache_create() is a backward compatible version that internally specifies
+ * an empty name.
*
* Requires:
*
@@ -76,6 +83,8 @@ dns_cache_create(isc_mem_t *mctx, isc_taskmgr_t *taskmgr,
* manager, or both are NULL. If NULL, no periodic cleaning of the
* cache will take place.
*
+ *\li 'cachename' is a valid string. This must not be NULL.
+ *
*\li 'cachep' is a valid pointer, and *cachep == NULL
*
* Ensures:
@@ -217,12 +226,36 @@ dns_cache_setcleaninginterval(dns_cache_t *cache, unsigned int interval);
* Set the periodic cache cleaning interval to 'interval' seconds.
*/
+unsigned int
+dns_cache_getcleaninginterval(dns_cache_t *cache);
+/*%<
+ * Get the periodic cache cleaning interval to 'interval' seconds.
+ */
+
+isc_uint32_t
+dns_cache_getcachesize(dns_cache_t *cache);
+/*%<
+ * Get the maximum cache size.
+ */
+
+const char *
+dns_cache_getname(dns_cache_t *cache);
+/*%<
+ * Get the cache name.
+ */
+
void
dns_cache_setcachesize(dns_cache_t *cache, isc_uint32_t size);
/*%<
* Set the maximum cache size. 0 means unlimited.
*/
+isc_uint32_t
+dns_cache_getcachesize(dns_cache_t *cache);
+/*%<
+ * Get the maximum cache size.
+ */
+
isc_result_t
dns_cache_flush(dns_cache_t *cache);
/*%<
diff --git a/contrib/bind9/lib/dns/include/dns/client.h b/contrib/bind9/lib/dns/include/dns/client.h
new file mode 100644
index 0000000..13cdf8f
--- /dev/null
+++ b/contrib/bind9/lib/dns/include/dns/client.h
@@ -0,0 +1,621 @@
+/*
+ * Copyright (C) 2009 Internet Systems Consortium, Inc. ("ISC")
+ *
+ * Permission to use, copy, modify, and/or 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 ISC DISCLAIMS ALL WARRANTIES WITH
+ * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+ * AND FITNESS. IN NO EVENT SHALL ISC 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.
+ */
+
+/* $Id: client.h,v 1.3 2009-09-02 23:48:02 tbox Exp $ */
+
+#ifndef DNS_CLIENT_H
+#define DNS_CLIENT_H 1
+
+/*****
+ ***** Module Info
+ *****/
+
+/*! \file
+ *
+ * \brief
+ * The DNS client module provides convenient programming interfaces to various
+ * DNS services, such as name resolution with or without DNSSEC validation or
+ * dynamic DNS update. This module is primarily expected to be used by other
+ * applications than BIND9-related ones that need such advanced DNS features.
+ *
+ * MP:
+ *\li In the typical usage of this module, application threads will not share
+ * the same data structures created and manipulated in this module.
+ * However, the module still ensures appropriate synchronization of such
+ * data structures.
+ *
+ * Resources:
+ *\li TBS
+ *
+ * Security:
+ *\li This module does not handle any low-level data directly, and so no
+ * security issue specific to this module is anticipated.
+ */
+
+#include <isc/event.h>
+#include <isc/sockaddr.h>
+
+#include <dns/tsig.h>
+#include <dns/types.h>
+
+#include <dst/dst.h>
+
+typedef enum {
+ updateop_none = 0,
+ updateop_add = 1,
+ updateop_delete = 2,
+ updateop_exist = 3,
+ updateop_notexist = 4,
+ updateop_max = 5
+} dns_client_updateop_t;
+
+ISC_LANG_BEGINDECLS
+
+/***
+ *** Types
+ ***/
+
+/*%
+ * Optional flags for dns_client_create(x).
+ */
+/*%< Enable caching resolution results (experimental). */
+#define DNS_CLIENTCREATEOPT_USECACHE 0x8000
+
+/*%
+ * Optional flags for dns_client_(start)resolve.
+ */
+/*%< Disable DNSSEC validation. */
+#define DNS_CLIENTRESOPT_NODNSSEC 0x01
+/*%< Allow running external context. */
+#define DNS_CLIENTRESOPT_ALLOWRUN 0x02
+
+/*%
+ * Optional flags for dns_client_(start)request.
+ */
+/*%< Allow running external context. */
+#define DNS_CLIENTREQOPT_ALLOWRUN 0x01
+
+/*%
+ * A dns_clientresevent_t is sent when name resolution performed by a client
+ * completes. 'result' stores the result code of the entire resolution
+ * procedure. 'vresult' specifically stores the result code of DNSSEC
+ * validation if it is performed. When name resolution successfully completes,
+ * 'answerlist' is typically non empty, containing answer names along with
+ * RRsets. It is the receiver's responsibility to free this list by calling
+ * dns_client_freeresanswer() before freeing the event structure.
+ */
+typedef struct dns_clientresevent {
+ ISC_EVENT_COMMON(struct dns_clientresevent);
+ isc_result_t result;
+ isc_result_t vresult;
+ dns_namelist_t answerlist;
+} dns_clientresevent_t; /* too long? */
+
+/*%
+ * Status of a dynamic update procedure.
+ */
+typedef enum {
+ dns_clientupdatestate_prepare, /*%< no updates have been sent */
+ dns_clientupdatestate_sent, /*%< updates were sent, no response */
+ dns_clientupdatestate_done /*%< update was sent and succeeded */
+} dns_clientupdatestate_t;
+
+/*%
+ * A dns_clientreqevent_t is sent when a DNS request is completed by a client.
+ * 'result' stores the result code of the entire transaction.
+ * If the transaction is successfully completed but the response packet cannot
+ * be parsed, 'result' will store the result code of dns_message_parse().
+ * If the response packet is received, 'rmessage' will contain the response
+ * message, whether it is successfully parsed or not.
+ */
+typedef struct dns_clientreqevent {
+ ISC_EVENT_COMMON(struct dns_clientreqevent);
+ isc_result_t result;
+ dns_message_t *rmessage;
+} dns_clientreqevent_t; /* too long? */
+
+/*%
+ * A dns_clientupdateevent_t is sent when dynamic update performed by a client
+ * completes. 'result' stores the result code of the entire update procedure.
+ * 'state' specifies the status of the update procedure when this event is
+ * sent. This can be used as a hint by the receiver to determine whether
+ * the update attempt was ever made. In particular, if the state is
+ * dns_clientupdatestate_prepare, the receiver can be sure that the requested
+ * update was not applied.
+ */
+typedef struct dns_clientupdateevent {
+ ISC_EVENT_COMMON(struct dns_clientupdateevent);
+ isc_result_t result;
+ dns_clientupdatestate_t state;
+} dns_clientupdateevent_t; /* too long? */
+
+isc_result_t
+dns_client_create(dns_client_t **clientp, unsigned int options);
+
+isc_result_t
+dns_client_createx(isc_mem_t *mctx, isc_appctx_t *actx, isc_taskmgr_t *taskmgr,
+ isc_socketmgr_t *socketmgr, isc_timermgr_t *timermgr,
+ unsigned int options, dns_client_t **clientp);
+/*%<
+ * Create a DNS client. These functions create a new client object with
+ * minimal internal resources such as the default 'view' for the IN class and
+ * IPv4/IPv6 dispatches for the view.
+ *
+ * dns_client_createx() takes 'manager' arguments so that the caller can
+ * control the behavior of the client through the underlying event framework.
+ * On the other hand, dns_client_create() simplifies the interface and creates
+ * the managers internally. A DNS client object created via
+ * dns_client_create() is expected to be used by an application that only needs
+ * simple synchronous services or by a thread-based application.
+ *
+ * If the DNS_CLIENTCREATEOPT_USECACHE flag is set in 'options',
+ * dns_client_create(x) will create a cache database with the view.
+ *
+ * Requires:
+ *
+ *\li 'mctx' is a valid memory context.
+ *
+ *\li 'actx' is a valid application context.
+ *
+ *\li 'taskmgr' is a valid task manager.
+ *
+ *\li 'socketmgr' is a valid socket manager.
+ *
+ *\li 'timermgr' is a valid timer manager.
+ *
+ *\li clientp != NULL && *clientp == NULL.
+ *
+ * Returns:
+ *
+ *\li #ISC_R_SUCCESS On success.
+ *
+ *\li Anything else Failure.
+ */
+
+void
+dns_client_destroy(dns_client_t **clientp);
+/*%<
+ * Destroy 'client'.
+ *
+ * Requires:
+ *
+ *\li '*clientp' is a valid client.
+ *
+ * Ensures:
+ *
+ *\li *clientp == NULL.
+ */
+
+isc_result_t
+dns_client_setservers(dns_client_t *client, dns_rdataclass_t rdclass,
+ dns_name_t *namespace, isc_sockaddrlist_t *addrs);
+/*%<
+ * Specify a list of addresses of recursive name servers that the client will
+ * use for name resolution. A view for the 'rdclass' class must be created
+ * beforehand. If 'namespace' is non NULL, the specified server will be used
+ * if and only if the query name is a subdomain of 'namespace'. When servers
+ * for multiple 'namespace's are provided, and a query name is covered by
+ * more than one 'namespace', the servers for the best (longest) matching
+ * namespace will be used. If 'namespace' is NULL, it works as if
+ * dns_rootname (.) were specified.
+ *
+ * Requires:
+ *
+ *\li 'client' is a valid client.
+ *
+ *\li 'namespace' is NULL or a valid name.
+ *
+ *\li 'addrs' != NULL.
+ *
+ * Returns:
+ *
+ *\li #ISC_R_SUCCESS On success.
+ *
+ *\li Anything else Failure.
+ */
+
+isc_result_t
+dns_client_clearservers(dns_client_t *client, dns_rdataclass_t rdclass,
+ dns_name_t *namespace);
+/*%<
+ * Remove configured recursive name servers for the 'rdclass' and 'namespace'
+ * from the client. See the description of dns_client_setservers() for
+ * the requirements about 'rdclass' and 'namespace'.
+ *
+ * Requires:
+ *
+ *\li 'client' is a valid client.
+ *
+ *\li 'namespace' is NULL or a valid name.
+ *
+ * Returns:
+ *
+ *\li #ISC_R_SUCCESS On success.
+ *
+ *\li Anything else Failure.
+ */
+
+isc_result_t
+dns_client_resolve(dns_client_t *client, dns_name_t *name,
+ dns_rdataclass_t rdclass, dns_rdatatype_t type,
+ unsigned int options, dns_namelist_t *namelist);
+
+isc_result_t
+dns_client_startresolve(dns_client_t *client, dns_name_t *name,
+ dns_rdataclass_t rdclass, dns_rdatatype_t type,
+ unsigned int options, isc_task_t *task,
+ isc_taskaction_t action, void *arg,
+ dns_clientrestrans_t **transp);
+/*%<
+ * Perform name resolution for 'name', 'rdclass', and 'type'.
+ *
+ * If any trusted keys are configured and the query name is considered to
+ * belong to a secure zone, these functions also validate the responses
+ * using DNSSEC by default. If the DNS_CLIENTRESOPT_NODNSSEC flag is set
+ * in 'options', DNSSEC validation is disabled regardless of the configured
+ * trusted keys or the query name.
+ *
+ * dns_client_resolve() provides a synchronous service. This function starts
+ * name resolution internally and blocks until it completes. On success,
+ * 'namelist' will contain a list of answer names, each of which has
+ * corresponding RRsets. The caller must provide a valid empty list, and
+ * is responsible for freeing the list content via dns_client_freeresanswer().
+ * If the name resolution fails due to an error in DNSSEC validation,
+ * dns_client_resolve() returns the result code indicating the validation
+ * error. Otherwise, it returns the result code of the entire resolution
+ * process, either success or failure.
+ *
+ * It is typically expected that the client object passed to
+ * dns_client_resolve() was created via dns_client_create() and has its own
+ * managers and contexts. However, if the DNS_CLIENTRESOPT_ALLOWRUN flag is
+ * set in 'options', this function performs the synchronous service even if
+ * it does not have its own manager and context structures.
+ *
+ * dns_client_startresolve() is an asynchronous version of dns_client_resolve()
+ * and does not block. When name resolution is completed, 'action' will be
+ * called with the argument of a 'dns_clientresevent_t' object, which contains
+ * the resulting list of answer names (on success). On return, '*transp' is
+ * set to an opaque transaction ID so that the caller can cancel this
+ * resolution process.
+ *
+ * Requires:
+ *
+ *\li 'client' is a valid client.
+ *
+ *\li 'addrs' != NULL.
+ *
+ *\li 'name' is a valid name.
+ *
+ *\li 'namelist' != NULL and is not empty.
+ *
+ *\li 'task' is a valid task.
+ *
+ *\li 'transp' != NULL && *transp == NULL;
+ *
+ * Returns:
+ *
+ *\li #ISC_R_SUCCESS On success.
+ *
+ *\li Anything else Failure.
+ */
+
+void
+dns_client_cancelresolve(dns_clientrestrans_t *trans);
+/*%<
+ * Cancel an ongoing resolution procedure started via
+ * dns_client_startresolve().
+ *
+ * Notes:
+ *
+ *\li If the resolution procedure has not completed, post its CLIENTRESDONE
+ * event with a result code of #ISC_R_CANCELED.
+ *
+ * Requires:
+ *
+ *\li 'trans' is a valid transaction ID.
+ */
+
+void
+dns_client_destroyrestrans(dns_clientrestrans_t **transp);
+/*%<
+ * Destroy name resolution transaction state identified by '*transp'.
+ *
+ * Requires:
+ *
+ *\li '*transp' is a valid transaction ID.
+ *
+ *\li The caller has received the CLIENTRESDONE event (either because the
+ * resolution completed or because dns_client_cancelresolve() was called).
+ *
+ * Ensures:
+ *
+ *\li *transp == NULL.
+ */
+
+void
+dns_client_freeresanswer(dns_client_t *client, dns_namelist_t *namelist);
+/*%<
+ * Free resources allocated for the content of 'namelist'.
+ *
+ * Requires:
+ *
+ *\li 'client' is a valid client.
+ *
+ *\li 'namelist' != NULL.
+ */
+
+isc_result_t
+dns_client_addtrustedkey(dns_client_t *client, dns_rdataclass_t rdclass,
+ dns_name_t *keyname, isc_buffer_t *keydatabuf);
+/*%<
+ * Add a DNSSEC trusted key for the 'rdclass' class. A view for the 'rdclass'
+ * class must be created beforehand. 'keyname' is the DNS name of the key,
+ * and 'keydatabuf' stores the resource data of the key.
+ *
+ * Requires:
+ *
+ *\li 'client' is a valid client.
+ *
+ *\li 'keyname' is a valid name.
+ *
+ *\li 'keydatabuf' is a valid buffer.
+ *
+ * Returns:
+ *
+ *\li #ISC_R_SUCCESS On success.
+ *
+ *\li Anything else Failure.
+ */
+
+isc_result_t
+dns_client_request(dns_client_t *client, dns_message_t *qmessage,
+ dns_message_t *rmessage, isc_sockaddr_t *server,
+ unsigned int options, unsigned int parseoptions,
+ dns_tsec_t *tsec, unsigned int timeout,
+ unsigned int udptimeout, unsigned int udpretries);
+
+isc_result_t
+dns_client_startrequest(dns_client_t *client, dns_message_t *qmessage,
+ dns_message_t *rmessage, isc_sockaddr_t *server,
+ unsigned int options, unsigned int parseoptions,
+ dns_tsec_t *tsec, unsigned int timeout,
+ unsigned int udptimeout, unsigned int udpretries,
+ isc_task_t *task, isc_taskaction_t action, void *arg,
+ dns_clientreqtrans_t **transp);
+
+/*%<
+ * Send a DNS request containig a query message 'query' to 'server'.
+ *
+ * 'parseoptions' will be used when the response packet is parsed, and will be
+ * passed to dns_message_parse() via dns_request_getresponse(). See
+ * dns_message_parse() for more details.
+ *
+ * 'tsec' is a transaction security object containing, e.g. a TSIG key for
+ * authenticating the request/response transaction. This is optional and can
+ * be NULL, in which case this library performs the transaction without any
+ * transaction authentication.
+ *
+ * 'timeout', 'udptimeout', and 'udpretries' are passed to
+ * dns_request_createvia3(). See dns_request_createvia3() for more details.
+ *
+ * dns_client_request() provides a synchronous service. This function sends
+ * the request and blocks until a response is received. On success,
+ * 'rmessage' will contain the response message. The caller must provide a
+ * valid initialized message.
+ *
+ * It is usually expected that the client object passed to
+ * dns_client_request() was created via dns_client_create() and has its own
+ * managers and contexts. However, if the DNS_CLIENTREQOPT_ALLOWRUN flag is
+ * set in 'options', this function performs the synchronous service even if
+ * it does not have its own manager and context structures.
+ *
+ * dns_client_startrequest() is an asynchronous version of dns_client_request()
+ * and does not block. When the transaction is completed, 'action' will be
+ * called with the argument of a 'dns_clientreqevent_t' object, which contains
+ * the response message (on success). On return, '*transp' is set to an opaque
+ * transaction ID so that the caller can cancel this request.
+ *
+ * Requires:
+ *
+ *\li 'client' is a valid client.
+ *
+ *\li 'qmessage' and 'rmessage' are valid initialized message.
+ *
+ *\li 'server' is a valid socket address structure.
+ *
+ *\li 'task' is a valid task.
+ *
+ *\li 'transp' != NULL && *transp == NULL;
+ *
+ * Returns:
+ *
+ *\li #ISC_R_SUCCESS On success.
+ *
+ *\li Anything else Failure.
+ *
+ *\li Any result that dns_message_parse() can return.
+ */
+
+void
+dns_client_cancelrequest(dns_clientreqtrans_t *transp);
+/*%<
+ * Cancel an ongoing DNS request procedure started via
+ * dns_client_startrequest().
+ *
+ * Notes:
+ *
+ *\li If the request procedure has not completed, post its CLIENTREQDONE
+ * event with a result code of #ISC_R_CANCELED.
+ *
+ * Requires:
+ *
+ *\li 'trans' is a valid transaction ID.
+ */
+
+void
+dns_client_destroyreqtrans(dns_clientreqtrans_t **transp);
+/*%
+ * Destroy DNS request transaction state identified by '*transp'.
+ *
+ * Requires:
+ *
+ *\li '*transp' is a valid transaction ID.
+ *
+ *\li The caller has received the CLIENTREQDONE event (either because the
+ * request completed or because dns_client_cancelrequest() was called).
+ *
+ * Ensures:
+ *
+ *\li *transp == NULL.
+ */
+
+isc_result_t
+dns_client_update(dns_client_t *client, dns_rdataclass_t rdclass,
+ dns_name_t *zonename, dns_namelist_t *prerequisites,
+ dns_namelist_t *updates, isc_sockaddrlist_t *servers,
+ dns_tsec_t *tsec, unsigned int options);
+
+isc_result_t
+dns_client_startupdate(dns_client_t *client, dns_rdataclass_t rdclass,
+ dns_name_t *zonename, dns_namelist_t *prerequisites,
+ dns_namelist_t *updates, isc_sockaddrlist_t *servers,
+ dns_tsec_t *tsec, unsigned int options,
+ isc_task_t *task, isc_taskaction_t action, void *arg,
+ dns_clientupdatetrans_t **transp);
+/*%<
+ * Perform DNS dynamic update for 'updates' of the 'rdclass' class with
+ * optional 'prerequisites'.
+ *
+ * 'updates' are a list of names with associated RRsets to be updated.
+ *
+ * 'prerequisites' are a list of names with associated RRsets corresponding to
+ * the prerequisites of the updates. This is optional and can be NULL, in
+ * which case the prerequisite section of the update message will be empty.
+ *
+ * Both 'updates' and 'prerequisites' must be constructed as specified in
+ * RFC2136.
+ *
+ * 'zonename' is the name of the zone in which the updated names exist.
+ * This is optional and can be NULL. In this case, these functions internally
+ * identify the appropriate zone through some queries for the SOA RR starting
+ * with the first name in prerequisites or updates.
+ *
+ * 'servers' is a list of authoritative servers to which the update message
+ * should be sent. This is optional and can be NULL. In this case, these
+ * functions internally identify the appropriate primary server name and its
+ * addresses through some queries for the SOA RR (like the case of zonename)
+ * and supplemental A/AAAA queries for the server name.
+ * Note: The client module generally assumes the given addresses are of the
+ * primary server of the corresponding zone. It will work even if a secondary
+ * server address is specified as long as the server allows update forwarding,
+ * it is generally discouraged to include secondary server addresses unless
+ * there's strong reason to do so.
+ *
+ * 'tsec' is a transaction security object containing, e.g. a TSIG key for
+ * authenticating the update transaction (and the supplemental query/response
+ * transactions if the server is specified). This is optional and can be
+ * NULL, in which case the library tries the update without any transaction
+ * authentication.
+ *
+ * dns_client_update() provides a synchronous service. This function blocks
+ * until the entire update procedure completes, including the additional
+ * queries when necessary.
+ *
+ * dns_client_startupdate() is an asynchronous version of dns_client_update().
+ * It immediately returns (typically with *transp being set to a non-NULL
+ * pointer), and performs the update procedure through a set of internal
+ * events. All transactions including the additional query exchanges are
+ * performed as a separate event, so none of these events cause blocking
+ * operation. When the update procedure completes, the specified function
+ * 'action' will be called with the argument of a 'dns_clientupdateevent_t'
+ * structure. On return, '*transp' is set to an opaque transaction ID so that
+ * the caller can cancel this update process.
+ *
+ * Notes:
+ *\li No options are currently defined.
+ *
+ * Requires:
+ *
+ *\li 'client' is a valid client.
+ *
+ *\li 'updates' != NULL.
+ *
+ *\li 'task' is a valid task.
+ *
+ *\li 'transp' != NULL && *transp == NULL;
+ *
+ * Returns:
+ *
+ *\li #ISC_R_SUCCESS On success.
+ *
+ *\li Anything else Failure.
+ */
+
+void
+dns_client_cancelupdate(dns_clientupdatetrans_t *trans);
+/*%<
+ * Cancel an ongoing dynamic update procedure started via
+ * dns_client_startupdate().
+ *
+ * Notes:
+ *
+ *\li If the update procedure has not completed, post its UPDATEDONE
+ * event with a result code of #ISC_R_CANCELED.
+ *
+ * Requires:
+ *
+ *\li 'trans' is a valid transaction ID.
+ */
+
+void
+dns_client_destroyupdatetrans(dns_clientupdatetrans_t **transp);
+/*%<
+ * Destroy dynamic update transaction identified by '*transp'.
+ *
+ * Requires:
+ *
+ *\li '*transp' is a valid transaction ID.
+ *
+ *\li The caller has received the UPDATEDONE event (either because the
+ * update completed or because dns_client_cancelupdate() was called).
+ *
+ * Ensures:
+ *
+ *\li *transp == NULL.
+ */
+
+isc_result_t
+dns_client_updaterec(dns_client_updateop_t op, dns_name_t *owner,
+ dns_rdatatype_t type, dns_rdata_t *source,
+ dns_ttl_t ttl, dns_name_t *target,
+ dns_rdataset_t *rdataset, dns_rdatalist_t *rdatalist,
+ dns_rdata_t *rdata, isc_mem_t *mctx);
+/*%<
+ * TBD
+ */
+
+void
+dns_client_freeupdate(dns_name_t **namep);
+/*%<
+ * TBD
+ */
+
+isc_mem_t *
+dns_client_mctx(dns_client_t *client);
+
+ISC_LANG_ENDDECLS
+
+#endif /* DNS_CLIENT_H */
diff --git a/contrib/bind9/lib/dns/include/dns/compress.h b/contrib/bind9/lib/dns/include/dns/compress.h
index 4181c77..ebe543b 100644
--- a/contrib/bind9/lib/dns/include/dns/compress.h
+++ b/contrib/bind9/lib/dns/include/dns/compress.h
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: compress.h,v 1.40.332.2 2009-01-18 23:47:41 tbox Exp $ */
+/* $Id: compress.h,v 1.42 2009-01-17 23:47:43 tbox Exp $ */
#ifndef DNS_COMPRESS_H
#define DNS_COMPRESS_H 1
diff --git a/contrib/bind9/lib/dns/include/dns/db.h b/contrib/bind9/lib/dns/include/dns/db.h
index f622834..edb1263 100644
--- a/contrib/bind9/lib/dns/include/dns/db.h
+++ b/contrib/bind9/lib/dns/include/dns/db.h
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004-2009 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004-2009, 2011 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 1999-2003 Internet Software Consortium.
*
* Permission to use, copy, modify, and/or distribute this software for any
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: db.h,v 1.93.50.5 2009-11-25 23:48:42 tbox Exp $ */
+/* $Id: db.h,v 1.104 2011-01-13 04:59:25 tbox Exp $ */
#ifndef DNS_DB_H
#define DNS_DB_H 1
@@ -59,7 +59,11 @@
#include <isc/ondestroy.h>
#include <isc/stdtime.h>
+#include <dns/fixedname.h>
#include <dns/name.h>
+#include <dns/rdata.h>
+#include <dns/rdataset.h>
+#include <dns/rpz.h>
#include <dns/types.h>
ISC_LANG_BEGINDECLS
@@ -167,6 +171,13 @@ typedef struct dns_dbmethods {
dns_dbversion_t *version);
isc_boolean_t (*isdnssec)(dns_db_t *db);
dns_stats_t *(*getrrsetstats)(dns_db_t *db);
+ void (*rpz_enabled)(dns_db_t *db, dns_rpz_st_t *st);
+ isc_result_t (*rpz_findips)(dns_rpz_zone_t *rpz,
+ dns_rpz_type_t rpz_type,
+ dns_zone_t *zone, dns_db_t *db,
+ dns_dbversion_t *version,
+ dns_rdataset_t *ardataset,
+ dns_rpz_st_t *st);
} dns_dbmethods_t;
typedef isc_result_t
@@ -491,6 +502,10 @@ dns_db_load(dns_db_t *db, const char *filename);
isc_result_t
dns_db_load2(dns_db_t *db, const char *filename, dns_masterformat_t format);
+
+isc_result_t
+dns_db_load3(dns_db_t *db, const char *filename, dns_masterformat_t format,
+ unsigned int options);
/*%<
* Load master file 'filename' into 'db'.
*
@@ -614,7 +629,7 @@ dns_db_closeversion(dns_db_t *db, dns_dbversion_t **versionp,
*
* Note: if '*versionp' is a read-write version and 'commit' is ISC_TRUE,
* then all changes made in the version will take effect, otherwise they
- * will be rolled back. The value if 'commit' is ignored for read-only
+ * will be rolled back. The value of 'commit' is ignored for read-only
* versions.
*
* Requires:
@@ -841,6 +856,9 @@ dns_db_find(dns_db_t *db, dns_name_t *name, dns_dbversion_t *version,
* \li #DNS_R_COVERINGNSEC The returned data is a NSEC
* that potentially covers 'name'.
*
+ * \li #DNS_R_EMPTYWILD The name is a wildcard without
+ * resource records.
+ *
* Error results:
*
* \li #ISC_R_NOMEMORY
@@ -1477,6 +1495,31 @@ dns_db_getrrsetstats(dns_db_t *db);
* dns_rdatasetstats_create(); otherwise NULL.
*/
+void
+dns_db_rpz_enabled(dns_db_t *db, dns_rpz_st_t *st);
+/*%<
+ * See if a policy database has DNS_RPZ_TYPE_IP, DNS_RPZ_TYPE_NSIP, or
+ * DNS_RPZ_TYPE_NSDNAME records.
+ */
+
+isc_result_t
+dns_db_rpz_findips(dns_rpz_zone_t *rpz, dns_rpz_type_t rpz_type,
+ dns_zone_t *zone, dns_db_t *db, dns_dbversion_t *version,
+ dns_rdataset_t *ardataset, dns_rpz_st_t *st);
+/*%<
+ * Search the CDIR block tree of a response policy tree of trees for the best
+ * match to any of the IP addresses in an A or AAAA rdataset.
+ *
+ * Requires:
+ * \li search in policy zone 'rpz' for a match of 'rpz_type' either
+ * DNS_RPZ_TYPE_IP or DNS_RPZ_TYPE_NSIP
+ * \li 'zone' and 'db' are the database corresponding to 'rpz'
+ * \li 'version' is the required version of the database
+ * \li 'ardataset' is an A or AAAA rdataset of addresses to check
+ * \li 'found' specifies the previous best match if any or
+ * or NULL, an empty name, 0, DNS_RPZ_POLICY_MISS, and 0
+ */
+
ISC_LANG_ENDDECLS
#endif /* DNS_DB_H */
diff --git a/contrib/bind9/lib/dns/include/dns/diff.h b/contrib/bind9/lib/dns/include/dns/diff.h
index f5e25ee..b6c929f 100644
--- a/contrib/bind9/lib/dns/include/dns/diff.h
+++ b/contrib/bind9/lib/dns/include/dns/diff.h
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: diff.h,v 1.15.120.4 2010-06-04 23:48:25 tbox Exp $ */
+/* $Id: diff.h,v 1.19 2010-06-04 23:51:14 tbox Exp $ */
#ifndef DNS_DIFF_H
#define DNS_DIFF_H 1
diff --git a/contrib/bind9/lib/dns/include/dns/dispatch.h b/contrib/bind9/lib/dns/include/dns/dispatch.h
index 6e2f3e1..3d252a1 100644
--- a/contrib/bind9/lib/dns/include/dns/dispatch.h
+++ b/contrib/bind9/lib/dns/include/dns/dispatch.h
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: dispatch.h,v 1.60.82.2 2009-01-29 23:47:44 tbox Exp $ */
+/* $Id: dispatch.h,v 1.62 2009-01-27 23:47:54 tbox Exp $ */
#ifndef DNS_DISPATCH_H
#define DNS_DISPATCH_H 1
diff --git a/contrib/bind9/lib/dns/include/dns/dlz.h b/contrib/bind9/lib/dns/include/dns/dlz.h
index 28a24a9..e04b1b1 100644
--- a/contrib/bind9/lib/dns/include/dns/dlz.h
+++ b/contrib/bind9/lib/dns/include/dns/dlz.h
@@ -1,5 +1,5 @@
/*
- * Portions Copyright (C) 2005-2007, 2009 Internet Systems Consortium, Inc. ("ISC")
+ * Portions Copyright (C) 2005-2007, 2009, 2010 Internet Systems Consortium, Inc. ("ISC")
* Portions Copyright (C) 1999-2001 Internet Software Consortium.
*
* Permission to use, copy, modify, and/or distribute this software for any
@@ -50,7 +50,7 @@
* USE OR PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: dlz.h,v 1.7.332.2 2009-01-18 23:47:41 tbox Exp $ */
+/* $Id: dlz.h,v 1.12 2010-12-20 23:47:21 tbox Exp $ */
/*! \file dns/dlz.h */
@@ -87,6 +87,7 @@
#include <dns/name.h>
#include <dns/types.h>
#include <dns/view.h>
+#include <dst/dst.h>
#include <isc/lang.h>
@@ -166,12 +167,37 @@ typedef isc_result_t
* return a result code indicating the type of error.
*/
+
+typedef isc_result_t
+(*dns_dlzconfigure_t)(void *driverarg, void *dbdata, dns_view_t *view);
+/*%<
+ * Method prototype. Drivers implementing the DLZ interface may
+ * optionally supply a configure method. If supplied, this will be
+ * called immediately after the create method is called. The driver
+ * may call configuration functions during the configure call
+ */
+
+
+typedef isc_boolean_t (*dns_dlzssumatch_t)(dns_name_t *signer,
+ dns_name_t *name,
+ isc_netaddr_t *tcpaddr,
+ dns_rdatatype_t type,
+ const dst_key_t *key,
+ void *driverarg, void *dbdata);
+/*%<
+ * Method prototype. Drivers implementing the DLZ interface may
+ * optionally supply a ssumatch method. If supplied, this will be
+ * called to authorize update requests
+ */
+
/*% the methods supplied by a DLZ driver */
typedef struct dns_dlzmethods {
dns_dlzcreate_t create;
dns_dlzdestroy_t destroy;
dns_dlzfindzone_t findzone;
dns_dlzallowzonexfr_t allowzonexfr;
+ dns_dlzconfigure_t configure;
+ dns_dlzssumatch_t ssumatch;
} dns_dlzmethods_t;
/*% information about a DLZ driver */
@@ -183,12 +209,18 @@ struct dns_dlzimplementation {
ISC_LINK(dns_dlzimplementation_t) link;
};
-/*% an instance of a DLZ driver */
+typedef isc_result_t (*dlzconfigure_callback_t)(dns_view_t *, dns_zone_t *);
+
+/*% An instance of a DLZ driver */
struct dns_dlzdb {
unsigned int magic;
isc_mem_t *mctx;
dns_dlzimplementation_t *implementation;
void *dbdata;
+ dlzconfigure_callback_t configure_callback;
+#ifdef BIND9
+ dns_ssutable_t *ssutable;
+#endif
};
@@ -285,6 +317,30 @@ dns_dlzunregister(dns_dlzimplementation_t **dlzimp);
* is called.
*/
+
+isc_result_t
+dns_dlz_writeablezone(dns_view_t *view, const char *zone_name);
+
+/*%<
+ * creates a writeable DLZ zone. Must be called from within the
+ * configure() method of a DLZ driver.
+ */
+
+
+isc_result_t
+dns_dlzconfigure(dns_view_t *view, dlzconfigure_callback_t callback);
+/*%<
+ * call a DLZ drivers configure method, if supplied
+ */
+
+isc_boolean_t
+dns_dlz_ssumatch(dns_dlzdb_t *dlzdatabase,
+ dns_name_t *signer, dns_name_t *name, isc_netaddr_t *tcpaddr,
+ dns_rdatatype_t type, const dst_key_t *key);
+/*%<
+ * call a DLZ drivers ssumatch method, if supplied. Otherwise return ISC_FALSE
+ */
+
ISC_LANG_ENDDECLS
#endif /* DLZ_H */
diff --git a/contrib/bind9/lib/dns/include/dns/dns64.h b/contrib/bind9/lib/dns/include/dns/dns64.h
new file mode 100644
index 0000000..5fd32e8
--- /dev/null
+++ b/contrib/bind9/lib/dns/include/dns/dns64.h
@@ -0,0 +1,175 @@
+/*
+ * Copyright (C) 2010 Internet Systems Consortium, Inc. ("ISC")
+ *
+ * Permission to use, copy, modify, and/or 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 ISC DISCLAIMS ALL WARRANTIES WITH
+ * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+ * AND FITNESS. IN NO EVENT SHALL ISC 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.
+ */
+
+/* $Id: dns64.h,v 1.3 2010-12-08 23:51:56 tbox Exp $ */
+
+#ifndef DNS_DNS64_H
+#define DNS_DNS64_H 1
+
+#include <isc/lang.h>
+
+#include <dns/types.h>
+
+ISC_LANG_BEGINDECLS
+
+/*
+ * dns_dns64_create() flags.
+ */
+#define DNS_DNS64_RECURSIVE_ONLY 0x01 /* If set then this record
+ * only applies to recursive
+ * queries.
+ */
+#define DNS_DNS64_BREAK_DNSSEC 0x02 /* If set then still perform
+ * DNSSEC synthesis even
+ * though the result would
+ * fail validation.
+ */
+
+/*
+ * dns_dns64_aaaaok() and dns_dns64_aaaafroma() flags.
+ */
+#define DNS_DNS64_RECURSIVE 0x01 /* Recursive query. */
+#define DNS_DNS64_DNSSEC 0x02 /* DNSSEC sensitive query. */
+
+isc_result_t
+dns_dns64_create(isc_mem_t *mctx, isc_netaddr_t *prefix,
+ unsigned int prefixlen, isc_netaddr_t *suffix,
+ dns_acl_t *client, dns_acl_t *mapped, dns_acl_t *excluded,
+ unsigned int flags, dns_dns64_t **dns64);
+/*
+ * Create a dns64 record which is used to identify the set of clients
+ * it applies to and how to perform the DNS64 synthesis.
+ *
+ * 'prefix' and 'prefixlen' defined the leading bits of the AAAA records
+ * to be synthesised. 'suffix' defines the bits after the A records bits.
+ * If suffix is NULL zeros will be used for these bits. 'client' defines
+ * for which clients this record applies. If 'client' is NULL then all
+ * clients apply. 'mapped' defines which A records are candidated for
+ * mapping. If 'mapped' is NULL then all A records will be mapped.
+ * 'excluded' defines which AAAA are to be treated as non-existent for the
+ * purposed of determining whether to perform syntesis. If 'excluded' is
+ * NULL then no AAAA records prevent synthesis.
+ *
+ * If DNS_DNS64_RECURSIVE_ONLY is set then the record will only match if
+ * DNS_DNS64_RECURSIVE is set when calling dns_dns64_aaaaok() and
+ * dns_dns64_aaaafroma().
+ *
+ * If DNS_DNS64_BREAK_DNSSEC is set then the record will still apply if
+ * DNS_DNS64_DNSSEC is set when calling dns_dns64_aaaaok() and
+ * dns_dns64_aaaafroma() otherwise the record will be ignored.
+ *
+ * Requires:
+ * 'mctx' to be valid.
+ * 'prefix' to be valid and the address family to AF_INET6.
+ * 'prefixlen' to be one of 32, 40, 48, 56, 72 and 96.
+ * the bits not covered by prefixlen in prefix to
+ * be zero.
+ * 'suffix' to be NULL or the address family be set to AF_INET6
+ * and the leading 'prefixlen' + 32 bits of the 'suffix'
+ * to be zero. If 'prefixlen' is 40, 48 or 56 then the
+ * the leading 'prefixlen' + 40 bits of 'suffix' must be
+ * zero.
+ * 'client' to be NULL or a valid acl.
+ * 'mapped' to be NULL or a valid acl.
+ * 'exculded' to be NULL or a valid acl.
+ *
+ * Returns:
+ * ISC_R_SUCCESS
+ * ISC_R_NOMEMORY
+ */
+
+void
+dns_dns64_destroy(dns_dns64_t **dns64p);
+/*
+ * Destroys a dns64 record.
+ *
+ * Requires the record to not be linked.
+ */
+
+isc_result_t
+dns_dns64_aaaafroma(const dns_dns64_t *dns64, const isc_netaddr_t *reqaddr,
+ const dns_name_t *reqsigner, const dns_aclenv_t *env,
+ unsigned int flags, unsigned char *a, unsigned char *aaaa);
+/*
+ * dns_dns64_aaaafroma() determines whether to perform a DNS64 address
+ * synthesis from 'a' based on 'dns64', 'reqaddr', 'reqsigner', 'env',
+ * 'flags' and 'aaaa'. If synthesis is performed then the result is
+ * written to '*aaaa'.
+ *
+ * The synthesised address will be of the form:
+ *
+ * <prefix bits><a bits><suffix bits>
+ *
+ * If <a bits> straddle bits 64-71 of the AAAA record, then 8 zero bits will
+ * be inserted at bits 64-71.
+ *
+ * Requires:
+ * 'dns64' to be valid.
+ * 'reqaddr' to be valid.
+ * 'reqsigner' to be NULL or valid.
+ * 'env' to be valid.
+ * 'a' to point to a IPv4 address in network order.
+ * 'aaaa' to point to a IPv6 address buffer in network order.
+ *
+ * Returns:
+ * ISC_R_SUCCESS if synthesis was performed.
+ * DNS_R_DISALLOWED if there is no match.
+ */
+
+dns_dns64_t *
+dns_dns64_next(dns_dns64_t *dns64);
+/*
+ * Return the next dns64 record in the list.
+ */
+
+void
+dns_dns64_append(dns_dns64list_t *list, dns_dns64_t *dns64);
+/*
+ * Append the dns64 record to the list.
+ */
+
+void
+dns_dns64_unlink(dns_dns64list_t *list, dns_dns64_t *dns64);
+/*
+ * Unlink the dns64 record from the list.
+ */
+
+isc_boolean_t
+dns_dns64_aaaaok(const dns_dns64_t *dns64, const isc_netaddr_t *reqaddr,
+ const dns_name_t *reqsigner, const dns_aclenv_t *env,
+ unsigned int flags, dns_rdataset_t *rdataset,
+ isc_boolean_t *aaaaok, size_t aaaaoklen);
+/*
+ * Determine if there are any non-excluded AAAA records in from the
+ * matching dns64 records in the list starting at 'dns64'. If there
+ * is a non-exluded address return ISC_TRUE. If all addresses are
+ * excluded in the matched records return ISC_FALSE. If no records
+ * match then return ISC_TRUE.
+ *
+ * If aaaaok is defined then dns_dns64_aaaaok() return a array of which
+ * addresses in 'rdataset' were deemed to not be exclude by any matching
+ * record. If there are no matching records then all entries are set
+ * to ISC_TRUE.
+ *
+ * Requires
+ * 'rdataset' to be valid and to be for type AAAA and class IN.
+ * 'aaaaoklen' must match the number of records in 'rdataset'
+ * if 'aaaaok' in non NULL.
+ */
+
+ISC_LANG_ENDDECLS
+
+#endif /* DNS_DNS64_H */
diff --git a/contrib/bind9/lib/dns/include/dns/dnssec.h b/contrib/bind9/lib/dns/include/dns/dnssec.h
index 5a1468a..c6d910b 100644
--- a/contrib/bind9/lib/dns/include/dns/dnssec.h
+++ b/contrib/bind9/lib/dns/include/dns/dnssec.h
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004-2007, 2009 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004-2007, 2009, 2010 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 1999-2002 Internet Software Consortium.
*
* Permission to use, copy, modify, and/or distribute this software for any
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: dnssec.h,v 1.32.332.6 2009-06-22 23:47:18 tbox Exp $ */
+/* $Id: dnssec.h,v 1.42 2010-01-09 23:48:45 tbox Exp $ */
#ifndef DNS_DNSSEC_H
#define DNS_DNSSEC_H 1
@@ -25,12 +25,48 @@
#include <isc/lang.h>
#include <isc/stdtime.h>
+#include <dns/diff.h>
#include <dns/types.h>
#include <dst/dst.h>
ISC_LANG_BEGINDECLS
+/*
+ * Indicates how the signer found this key: in the key repository, at the
+ * zone apex, or specified by the user.
+ */
+typedef enum {
+ dns_keysource_unknown,
+ dns_keysource_repository,
+ dns_keysource_zoneapex,
+ dns_keysource_user
+} dns_keysource_t;
+
+/*
+ * A DNSSEC key and hints about its intended use gleaned from metadata
+ */
+struct dns_dnsseckey {
+ dst_key_t *key;
+ isc_boolean_t hint_publish; /*% metadata says to publish */
+ isc_boolean_t force_publish; /*% publish regardless of metadata */
+ isc_boolean_t hint_sign; /*% metadata says to sign with this key */
+ isc_boolean_t force_sign; /*% sign with key regardless of metadata */
+ isc_boolean_t hint_remove; /*% metadata says *don't* publish */
+ isc_boolean_t is_active; /*% key is already active */
+ isc_boolean_t first_sign; /*% key is newly becoming active */
+ unsigned int prepublish; /*% how long until active? */
+ dns_keysource_t source; /*% how the key was found */
+ isc_boolean_t ksk; /*% this is a key-signing key */
+ isc_boolean_t legacy; /*% this is old-style key with no
+ metadata (possibly generated by
+ an older version of BIND9) and
+ should be ignored when searching
+ for keys to import into the zone */
+ unsigned int index; /*% position in list */
+ ISC_LINK(dns_dnsseckey_t) link;
+};
+
isc_result_t
dns_dnssec_keyfromrdata(dns_name_t *name, dns_rdata_t *rdata, isc_mem_t *mctx,
dst_key_t **key);
@@ -184,6 +220,103 @@ dns_dnssec_selfsigns(dns_rdata_t *rdata, dns_name_t *name,
isc_boolean_t ignoretime, isc_mem_t *mctx);
+isc_result_t
+dns_dnsseckey_create(isc_mem_t *mctx, dst_key_t **dstkey,
+ dns_dnsseckey_t **dkp);
+/*%<
+ * Create and initialize a dns_dnsseckey_t structure.
+ *
+ * Requires:
+ *\li 'dkp' is not NULL and '*dkp' is NULL.
+ *
+ * Returns:
+ *\li #ISC_R_SUCCESS
+ *\li #ISC_R_NOMEMORY
+ */
+
+void
+dns_dnsseckey_destroy(isc_mem_t *mctx, dns_dnsseckey_t **dkp);
+/*%<
+ * Reclaim a dns_dnsseckey_t structure.
+ *
+ * Requires:
+ *\li 'dkp' is not NULL and '*dkp' is not NULL.
+ *
+ * Ensures:
+ *\li '*dkp' is NULL.
+ */
+
+isc_result_t
+dns_dnssec_findmatchingkeys(dns_name_t *origin, const char *directory,
+ isc_mem_t *mctx, dns_dnsseckeylist_t *keylist);
+/*%<
+ * Search 'directory' for K* key files matching the name in 'origin'.
+ * Append all such keys, along with use hints gleaned from their
+ * metadata, onto 'keylist'.
+ *
+ * Requires:
+ *\li 'keylist' is not NULL
+ *
+ * Returns:
+ *\li #ISC_R_SUCCESS
+ *\li #ISC_R_NOTFOUND
+ *\li #ISC_R_NOMEMORY
+ *\li any error returned by dns_name_totext(), isc_dir_open(), or
+ * dst_key_fromnamedfile()
+ *
+ * Ensures:
+ *\li On error, keylist is unchanged
+ */
+
+isc_result_t
+dns_dnssec_keylistfromrdataset(dns_name_t *origin,
+ const char *directory, isc_mem_t *mctx,
+ dns_rdataset_t *keyset, dns_rdataset_t *keysigs,
+ dns_rdataset_t *soasigs, isc_boolean_t savekeys,
+ isc_boolean_t public,
+ dns_dnsseckeylist_t *keylist);
+/*%<
+ * Append the contents of a DNSKEY rdataset 'keyset' to 'keylist'.
+ * Omit duplicates. If 'public' is ISC_FALSE, search 'directory' for
+ * matching key files, and load the private keys that go with
+ * the public ones. If 'savekeys' is ISC_TRUE, mark the keys so
+ * they will not be deleted or inactivated regardless of metadata.
+ *
+ * 'keysigs' and 'soasigs', if not NULL and associated, contain the
+ * RRSIGS for the DNSKEY and SOA records respectively and are used to mark
+ * whether a key is already active in the zone.
+ */
+
+isc_result_t
+dns_dnssec_updatekeys(dns_dnsseckeylist_t *keys, dns_dnsseckeylist_t *newkeys,
+ dns_dnsseckeylist_t *removed, dns_name_t *origin,
+ dns_ttl_t ttl, dns_diff_t *diff, isc_boolean_t allzsk,
+ isc_mem_t *mctx, void (*report)(const char *, ...));
+/*%<
+ * Update the list of keys in 'keys' with new key information in 'newkeys'.
+ *
+ * For each key in 'newkeys', see if it has a match in 'keys'.
+ * - If not, and if the metadata says the key should be published:
+ * add it to 'keys', and place a dns_difftuple into 'diff' so
+ * the key can be added to the DNSKEY set. If the metadata says it
+ * should be active, set the first_sign flag.
+ * - If so, and if the metadata says it should be removed:
+ * remove it from 'keys', and place a dns_difftuple into 'diff' so
+ * the key can be removed from the DNSKEY set. if 'removed' is non-NULL,
+ * copy the key into that list; otherwise destroy it.
+ * - Otherwise, make sure keys has current metadata.
+ *
+ * If 'allzsk' is true, we are allowing KSK-flagged keys to be used as
+ * ZSKs.
+ *
+ * 'ttl' is the TTL of the DNSKEY RRset; if it is longer than the
+ * time until a new key will be activated, then we have to delay the
+ * key's activation.
+ *
+ * 'report' points to a function for reporting status.
+ *
+ * On completion, any remaining keys in 'newkeys' are freed.
+ */
ISC_LANG_ENDDECLS
#endif /* DNS_DNSSEC_H */
diff --git a/contrib/bind9/lib/dns/include/dns/ds.h b/contrib/bind9/lib/dns/include/dns/ds.h
index 77a2cb8..04e4bab 100644
--- a/contrib/bind9/lib/dns/include/dns/ds.h
+++ b/contrib/bind9/lib/dns/include/dns/ds.h
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004-2007 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004-2007, 2010 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 2002 Internet Software Consortium.
*
* Permission to use, copy, modify, and/or distribute this software for any
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: ds.h,v 1.10 2007-06-19 23:47:16 tbox Exp $ */
+/* $Id: ds.h,v 1.12 2010-12-23 23:47:08 tbox Exp $ */
#ifndef DNS_DS_H
#define DNS_DS_H 1
@@ -26,6 +26,11 @@
#define DNS_DSDIGEST_SHA1 (1)
#define DNS_DSDIGEST_SHA256 (2)
+#define DNS_DSDIGEST_GOST (3)
+
+/* should not be here... */
+
+#define ISC_GOST_DIGESTLENGTH 32U
/*
* Assuming SHA-256 digest type.
diff --git a/contrib/bind9/lib/dns/include/dns/ecdb.h b/contrib/bind9/lib/dns/include/dns/ecdb.h
new file mode 100644
index 0000000..be71a52
--- /dev/null
+++ b/contrib/bind9/lib/dns/include/dns/ecdb.h
@@ -0,0 +1,52 @@
+/*
+ * Copyright (C) 2009 Internet Systems Consortium, Inc. ("ISC")
+ *
+ * Permission to use, copy, modify, and/or 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 ISC DISCLAIMS ALL WARRANTIES WITH
+ * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+ * AND FITNESS. IN NO EVENT SHALL ISC 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.
+ */
+
+/* $Id: ecdb.h,v 1.3 2009-09-02 23:48:02 tbox Exp $ */
+
+#ifndef DNS_ECDB_H
+#define DNS_ECDB_H 1
+
+/*****
+ ***** Module Info
+ *****/
+
+/* TBD */
+
+/***
+ *** Imports
+ ***/
+
+#include <dns/types.h>
+
+/***
+ *** Types
+ ***/
+
+/***
+ *** Functions
+ ***/
+
+/* TBD: describe those */
+
+isc_result_t
+dns_ecdb_register(isc_mem_t *mctx, dns_dbimplementation_t **dbimp);
+
+void
+dns_ecdb_unregister(dns_dbimplementation_t **dbimp);
+
+ISC_LANG_ENDDECLS
+
+#endif /* DNS_ECDB_H */
diff --git a/contrib/bind9/lib/dns/include/dns/events.h b/contrib/bind9/lib/dns/include/dns/events.h
index 689566b..d985833 100644
--- a/contrib/bind9/lib/dns/include/dns/events.h
+++ b/contrib/bind9/lib/dns/include/dns/events.h
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: events.h,v 1.49.332.4 2010-05-10 23:48:14 tbox Exp $ */
+/* $Id: events.h,v 1.56 2010-12-21 03:11:42 marka Exp $ */
#ifndef DNS_EVENTS_H
#define DNS_EVENTS_H 1
@@ -69,6 +69,11 @@
#define DNS_EVENT_ACACHECLEAN (ISC_EVENTCLASS_DNS + 39)
#define DNS_EVENT_ACACHEOVERMEM (ISC_EVENTCLASS_DNS + 40)
#define DNS_EVENT_RBTPRUNE (ISC_EVENTCLASS_DNS + 41)
+#define DNS_EVENT_MANAGEKEYS (ISC_EVENTCLASS_DNS + 42)
+#define DNS_EVENT_CLIENTRESDONE (ISC_EVENTCLASS_DNS + 43)
+#define DNS_EVENT_CLIENTREQDONE (ISC_EVENTCLASS_DNS + 44)
+#define DNS_EVENT_ADBGROWENTRIES (ISC_EVENTCLASS_DNS + 45)
+#define DNS_EVENT_ADBGROWNAMES (ISC_EVENTCLASS_DNS + 46)
#define DNS_EVENT_FIRSTEVENT (ISC_EVENTCLASS_DNS + 0)
#define DNS_EVENT_LASTEVENT (ISC_EVENTCLASS_DNS + 65535)
diff --git a/contrib/bind9/lib/dns/include/dns/forward.h b/contrib/bind9/lib/dns/include/dns/forward.h
index 5fbe898..683969d 100644
--- a/contrib/bind9/lib/dns/include/dns/forward.h
+++ b/contrib/bind9/lib/dns/include/dns/forward.h
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004-2007 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004-2007, 2009 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 2000, 2001 Internet Software Consortium.
*
* Permission to use, copy, modify, and/or distribute this software for any
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: forward.h,v 1.11 2007-06-19 23:47:16 tbox Exp $ */
+/* $Id: forward.h,v 1.13 2009-09-02 23:48:02 tbox Exp $ */
#ifndef DNS_FORWARD_H
#define DNS_FORWARD_H 1
@@ -67,6 +67,21 @@ dns_fwdtable_add(dns_fwdtable_t *fwdtable, dns_name_t *name,
*/
isc_result_t
+dns_fwdtable_delete(dns_fwdtable_t *fwdtable, dns_name_t *name);
+/*%<
+ * Removes an entry for 'name' from the forwarding table. If an entry
+ * that exactly matches 'name' does not exist, ISC_R_NOTFOUND will be returned.
+ *
+ * Requires:
+ * \li fwdtable is a valid forwarding table.
+ * \li name is a valid name
+ *
+ * Returns:
+ * \li #ISC_R_SUCCESS
+ * \li #ISC_R_NOTFOUND
+ */
+
+isc_result_t
dns_fwdtable_find(dns_fwdtable_t *fwdtable, dns_name_t *name,
dns_forwarders_t **forwardersp);
/*%<
diff --git a/contrib/bind9/lib/dns/include/dns/journal.h b/contrib/bind9/lib/dns/include/dns/journal.h
index 9e56c19..28a7dbe 100644
--- a/contrib/bind9/lib/dns/include/dns/journal.h
+++ b/contrib/bind9/lib/dns/include/dns/journal.h
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: journal.h,v 1.33.120.4 2009-11-04 23:47:25 tbox Exp $ */
+/* $Id: journal.h,v 1.37 2009-11-04 23:48:18 tbox Exp $ */
#ifndef DNS_JOURNAL_H
#define DNS_JOURNAL_H 1
diff --git a/contrib/bind9/lib/dns/include/dns/keydata.h b/contrib/bind9/lib/dns/include/dns/keydata.h
new file mode 100644
index 0000000..36bf590
--- /dev/null
+++ b/contrib/bind9/lib/dns/include/dns/keydata.h
@@ -0,0 +1,55 @@
+/*
+ * Copyright (C) 2009 Internet Systems Consortium, Inc. ("ISC")
+ *
+ * Permission to use, copy, modify, and/or 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 ISC DISCLAIMS ALL WARRANTIES WITH
+ * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+ * AND FITNESS. IN NO EVENT SHALL ISC 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.
+ */
+
+/* $Id: keydata.h,v 1.2 2009-06-30 02:52:32 each Exp $ */
+
+#ifndef DNS_KEYDATA_H
+#define DNS_KEYDATA_H 1
+
+/*****
+ ***** Module Info
+ *****/
+
+/*! \file dns/keydata.h
+ * \brief
+ * KEYDATA utilities.
+ */
+
+/***
+ *** Imports
+ ***/
+
+#include <isc/lang.h>
+#include <isc/types.h>
+
+#include <dns/types.h>
+#include <dns/rdatastruct.h>
+
+ISC_LANG_BEGINDECLS
+
+isc_result_t
+dns_keydata_todnskey(dns_rdata_keydata_t *keydata,
+ dns_rdata_dnskey_t *dnskey, isc_mem_t *mctx);
+
+isc_result_t
+dns_keydata_fromdnskey(dns_rdata_keydata_t *keydata,
+ dns_rdata_dnskey_t *dnskey,
+ isc_uint32_t refresh, isc_uint32_t addhd,
+ isc_uint32_t removehd, isc_mem_t *mctx);
+
+ISC_LANG_ENDDECLS
+
+#endif /* DNS_KEYDATA_H */
diff --git a/contrib/bind9/lib/dns/include/dns/keytable.h b/contrib/bind9/lib/dns/include/dns/keytable.h
index 40c4b16..a53ec08 100644
--- a/contrib/bind9/lib/dns/include/dns/keytable.h
+++ b/contrib/bind9/lib/dns/include/dns/keytable.h
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004, 2005, 2007 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004, 2005, 2007, 2009, 2010 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 2000, 2001 Internet Software Consortium.
*
* Permission to use, copy, modify, and/or distribute this software for any
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: keytable.h,v 1.16 2007-06-19 23:47:16 tbox Exp $ */
+/* $Id: keytable.h,v 1.23 2010-06-25 03:24:05 marka Exp $ */
#ifndef DNS_KEYTABLE_H
#define DNS_KEYTABLE_H 1
@@ -42,6 +42,10 @@
*/
#include <isc/lang.h>
+#include <isc/magic.h>
+#include <isc/refcount.h>
+#include <isc/rwlock.h>
+#include <isc/stdtime.h>
#include <dns/types.h>
@@ -49,6 +53,33 @@
ISC_LANG_BEGINDECLS
+struct dns_keytable {
+ /* Unlocked. */
+ unsigned int magic;
+ isc_mem_t *mctx;
+ isc_mutex_t lock;
+ isc_rwlock_t rwlock;
+ /* Locked by lock. */
+ isc_uint32_t active_nodes;
+ /* Locked by rwlock. */
+ isc_uint32_t references;
+ dns_rbt_t *table;
+};
+
+#define KEYTABLE_MAGIC ISC_MAGIC('K', 'T', 'b', 'l')
+#define VALID_KEYTABLE(kt) ISC_MAGIC_VALID(kt, KEYTABLE_MAGIC)
+
+struct dns_keynode {
+ unsigned int magic;
+ isc_refcount_t refcount;
+ dst_key_t * key;
+ isc_boolean_t managed;
+ struct dns_keynode * next;
+};
+
+#define KEYNODE_MAGIC ISC_MAGIC('K', 'N', 'o', 'd')
+#define VALID_KEYNODE(kn) ISC_MAGIC_VALID(kn, KEYNODE_MAGIC)
+
isc_result_t
dns_keytable_create(isc_mem_t *mctx, dns_keytable_t **keytablep);
/*%<
@@ -106,16 +137,22 @@ dns_keytable_detach(dns_keytable_t **keytablep);
*/
isc_result_t
-dns_keytable_add(dns_keytable_t *keytable, dst_key_t **keyp);
+dns_keytable_add(dns_keytable_t *keytable, isc_boolean_t managed,
+ dst_key_t **keyp);
/*%<
- * Add '*keyp' to 'keytable'.
+ * Add '*keyp' to 'keytable' (using the name in '*keyp').
+ * The value of keynode->managed is set to 'managed'
*
* Notes:
*
*\li Ownership of *keyp is transferred to the keytable.
+ *\li If the key already exists in the table, ISC_R_EXISTS is
+ * returned and the new key is freed.
*
* Requires:
*
+ *\li 'keytable' points to a valid keytable.
+ *
*\li keyp != NULL && *keyp is a valid dst_key_t *.
*
* Ensures:
@@ -125,11 +162,124 @@ dns_keytable_add(dns_keytable_t *keytable, dst_key_t **keyp);
* Returns:
*
*\li ISC_R_SUCCESS
+ *\li ISC_R_EXISTS
+ *
+ *\li Any other result indicates failure.
+ */
+
+isc_result_t
+dns_keytable_marksecure(dns_keytable_t *keytable, dns_name_t *name);
+/*%<
+ * Add a null key to 'keytable' for name 'name'. This marks the
+ * name as a secure domain, but doesn't supply any key data to allow the
+ * domain to be validated. (Used when automated trust anchor management
+ * has gotten broken by a zone misconfiguration; for example, when the
+ * active key has been revoked but the stand-by key was still in its 30-day
+ * waiting period for validity.)
+ *
+ * Notes:
+ *
+ *\li If a key already exists in the table, ISC_R_EXISTS is
+ * returned and nothing is done.
+ *
+ * Requires:
+ *
+ *\li 'keytable' points to a valid keytable.
+ *
+ *\li keyp != NULL && *keyp is a valid dst_key_t *.
+ *
+ * Returns:
+ *
+ *\li ISC_R_SUCCESS
+ *\li ISC_R_EXISTS
+ *
+ *\li Any other result indicates failure.
+ */
+
+isc_result_t
+dns_keytable_delete(dns_keytable_t *keytable, dns_name_t *keyname);
+/*%<
+ * Delete node(s) from 'keytable' matching name 'keyname'
+ *
+ * Requires:
+ *
+ *\li 'keytable' points to a valid keytable.
+ *
+ *\li 'name' is not NULL
+ *
+ * Returns:
+ *
+ *\li ISC_R_SUCCESS
+ *
+ *\li Any other result indicates failure.
+ */
+
+isc_result_t
+dns_keytable_deletekeynode(dns_keytable_t *keytable, dst_key_t *dstkey);
+/*%<
+ * Delete node(s) from 'keytable' containing copies of the key pointed
+ * to by 'dstkey'
+ *
+ * Requires:
+ *
+ *\li 'keytable' points to a valid keytable.
+ *\li 'dstkey' is not NULL
+ *
+ * Returns:
+ *
+ *\li ISC_R_SUCCESS
*
*\li Any other result indicates failure.
*/
isc_result_t
+dns_keytable_find(dns_keytable_t *keytable, dns_name_t *keyname,
+ dns_keynode_t **keynodep);
+/*%<
+ * Search for the first instance of a key named 'name' in 'keytable',
+ * without regard to keyid and algorithm. Use dns_keytable_nextkeynode()
+ * to find subsequent instances.
+ *
+ * Requires:
+ *
+ *\li 'keytable' is a valid keytable.
+ *
+ *\li 'name' is a valid absolute name.
+ *
+ *\li keynodep != NULL && *keynodep == NULL
+ *
+ * Returns:
+ *
+ *\li ISC_R_SUCCESS
+ *\li ISC_R_NOTFOUND
+ *
+ *\li Any other result indicates an error.
+ */
+
+isc_result_t
+dns_keytable_nextkeynode(dns_keytable_t *keytable, dns_keynode_t *keynode,
+ dns_keynode_t **nextnodep);
+/*%<
+ * Return for the next key after 'keynode' in 'keytable', without regard to
+ * keyid and algorithm.
+ *
+ * Requires:
+ *
+ *\li 'keytable' is a valid keytable.
+ *
+ *\li 'keynode' is a valid keynode.
+ *
+ *\li nextnodep != NULL && *nextnodep == NULL
+ *
+ * Returns:
+ *
+ *\li ISC_R_SUCCESS
+ *\li ISC_R_NOTFOUND
+ *
+ *\li Any other result indicates an error.
+ */
+
+isc_result_t
dns_keytable_findkeynode(dns_keytable_t *keytable, dns_name_t *name,
dns_secalg_t algorithm, dns_keytag_t tag,
dns_keynode_t **keynodep);
@@ -157,7 +307,7 @@ dns_keytable_findkeynode(dns_keytable_t *keytable, dns_name_t *name,
isc_result_t
dns_keytable_findnextkeynode(dns_keytable_t *keytable, dns_keynode_t *keynode,
- dns_keynode_t **nextnodep);
+ dns_keynode_t **nextnodep);
/*%<
* Search for the next key with the same properties as 'keynode' in
* 'keytable' as found by dns_keytable_findkeynode().
@@ -201,6 +351,22 @@ dns_keytable_finddeepestmatch(dns_keytable_t *keytable, dns_name_t *name,
*/
void
+dns_keytable_attachkeynode(dns_keytable_t *keytable, dns_keynode_t *source,
+ dns_keynode_t **target);
+/*%<
+ * Attach a keynode and and increment the active_nodes counter in a
+ * corresponding keytable.
+ *
+ * Requires:
+ *
+ *\li 'keytable' is a valid keytable.
+ *
+ *\li 'source' is a valid keynode.
+ *
+ *\li 'target' is not null and '*target' is null.
+ */
+
+void
dns_keytable_detachkeynode(dns_keytable_t *keytable,
dns_keynode_t **keynodep);
/*%<
@@ -244,12 +410,48 @@ dns_keytable_issecuredomain(dns_keytable_t *keytable, dns_name_t *name,
*\li Any other result is an error.
*/
+isc_result_t
+dns_keytable_dump(dns_keytable_t *keytable, FILE *fp);
+/*%<
+ * Dump the keytable on fp.
+ */
+
dst_key_t *
dns_keynode_key(dns_keynode_t *keynode);
/*%<
* Get the DST key associated with keynode.
*/
+isc_boolean_t
+dns_keynode_managed(dns_keynode_t *keynode);
+/*%<
+ * Is this flagged as a managed key?
+ */
+
+isc_result_t
+dns_keynode_create(isc_mem_t *mctx, dns_keynode_t **target);
+/*%<
+ * Allocate space for a keynode
+ */
+
+void
+dns_keynode_attach(dns_keynode_t *source, dns_keynode_t **target);
+/*%<
+ * Attach keynode 'source' to '*target'
+ */
+
+void
+dns_keynode_detach(isc_mem_t *mctx, dns_keynode_t **target);
+/*%<
+ * Detach a single keynode, without touching any keynodes that
+ * may be pointed to by its 'next' pointer
+ */
+
+void
+dns_keynode_detachall(isc_mem_t *mctx, dns_keynode_t **target);
+/*%<
+ * Detach a keynode and all its succesors.
+ */
ISC_LANG_ENDDECLS
#endif /* DNS_KEYTABLE_H */
diff --git a/contrib/bind9/lib/dns/include/dns/keyvalues.h b/contrib/bind9/lib/dns/include/dns/keyvalues.h
index 70ca3fa..2107657 100644
--- a/contrib/bind9/lib/dns/include/dns/keyvalues.h
+++ b/contrib/bind9/lib/dns/include/dns/keyvalues.h
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: keyvalues.h,v 1.23.48.4 2010-01-15 23:47:33 tbox Exp $ */
+/* $Id: keyvalues.h,v 1.29 2010-12-23 23:47:08 tbox Exp $ */
#ifndef DNS_KEYVALUES_H
#define DNS_KEYVALUES_H 1
@@ -42,7 +42,7 @@
#define DNS_KEYOWNER_ENTITY 0x0200 /*%< key is assoc. with entity eg host */
#define DNS_KEYOWNER_ZONE 0x0100 /*%< key is zone key */
#define DNS_KEYOWNER_RESERVED 0x0300 /*%< reserved meaning */
-#define DNS_KEYFLAG_REVOKE 0x0080 /*%< key revoked (per rfc5001) */
+#define DNS_KEYFLAG_REVOKE 0x0080 /*%< key revoked (per rfc5011) */
#define DNS_KEYFLAG_RESERVED9 0x0040 /*%< reserved - must be zero */
#define DNS_KEYFLAG_RESERVED10 0x0020 /*%< reserved - must be zero */
#define DNS_KEYFLAG_RESERVED11 0x0010 /*%< reserved - must be zero */
@@ -51,7 +51,6 @@
#define DNS_KEYFLAG_RESERVEDMASK (DNS_KEYFLAG_RESERVED2 | \
DNS_KEYFLAG_RESERVED4 | \
DNS_KEYFLAG_RESERVED5 | \
- DNS_KEYFLAG_RESERVED8 | \
DNS_KEYFLAG_RESERVED9 | \
DNS_KEYFLAG_RESERVED10 | \
DNS_KEYFLAG_RESERVED11 )
@@ -71,6 +70,7 @@
#define DNS_KEYALG_NSEC3RSASHA1 7
#define DNS_KEYALG_RSASHA256 8
#define DNS_KEYALG_RSASHA512 10
+#define DNS_KEYALG_ECCGOST 12
#define DNS_KEYALG_INDIRECT 252
#define DNS_KEYALG_PRIVATEDNS 253
#define DNS_KEYALG_PRIVATEOID 254 /*%< Key begins with OID giving alg */
@@ -99,4 +99,6 @@
#define DNS_SIG_DSAMINBYTES 213
#define DNS_SIG_DSAMAXBYTES 405
+#define DNS_SIG_GOSTSIGSIZE 64
+
#endif /* DNS_KEYVALUES_H */
diff --git a/contrib/bind9/lib/dns/include/dns/lib.h b/contrib/bind9/lib/dns/include/dns/lib.h
index 361ef8f..70874b7 100644
--- a/contrib/bind9/lib/dns/include/dns/lib.h
+++ b/contrib/bind9/lib/dns/include/dns/lib.h
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004-2007 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004-2007, 2009 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 1999-2001 Internet Software Consortium.
*
* Permission to use, copy, modify, and/or distribute this software for any
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: lib.h,v 1.16 2007-06-19 23:47:17 tbox Exp $ */
+/* $Id: lib.h,v 1.18 2009-09-02 23:48:02 tbox Exp $ */
#ifndef DNS_LIB_H
#define DNS_LIB_H 1
@@ -40,6 +40,20 @@ dns_lib_initmsgcat(void);
* has not already been initialized.
*/
+isc_result_t
+dns_lib_init(void);
+/*%<
+ * A set of initialization procedure used in the DNS library. This function
+ * is provided for an application that is not aware of the underlying ISC or
+ * DNS libraries much.
+ */
+
+void
+dns_lib_shutdown(void);
+/*%<
+ * Free temporary resources allocated in dns_lib_init().
+ */
+
ISC_LANG_ENDDECLS
#endif /* DNS_LIB_H */
diff --git a/contrib/bind9/lib/dns/include/dns/log.h b/contrib/bind9/lib/dns/include/dns/log.h
index 4b648ff..a5650ed 100644
--- a/contrib/bind9/lib/dns/include/dns/log.h
+++ b/contrib/bind9/lib/dns/include/dns/log.h
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: log.h,v 1.42.332.2 2009-01-18 23:47:41 tbox Exp $ */
+/* $Id: log.h,v 1.45 2009-12-18 22:16:49 each Exp $ */
/*! \file dns/log.h
* \author Principal Authors: DCL */
@@ -73,6 +73,7 @@ LIBDNS_EXTERNAL_DATA extern isc_logmodule_t dns_modules[];
#define DNS_LOGMODULE_HINTS (&dns_modules[24])
#define DNS_LOGMODULE_ACACHE (&dns_modules[25])
#define DNS_LOGMODULE_DLZ (&dns_modules[26])
+#define DNS_LOGMODULE_DNSSEC (&dns_modules[27])
ISC_LANG_BEGINDECLS
diff --git a/contrib/bind9/lib/dns/include/dns/lookup.h b/contrib/bind9/lib/dns/include/dns/lookup.h
index 81bb9b9..7e6a566 100644
--- a/contrib/bind9/lib/dns/include/dns/lookup.h
+++ b/contrib/bind9/lib/dns/include/dns/lookup.h
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: lookup.h,v 1.12.332.2 2009-01-18 23:47:41 tbox Exp $ */
+/* $Id: lookup.h,v 1.14 2009-01-17 23:47:43 tbox Exp $ */
#ifndef DNS_LOOKUP_H
#define DNS_LOOKUP_H 1
diff --git a/contrib/bind9/lib/dns/include/dns/master.h b/contrib/bind9/lib/dns/include/dns/master.h
index 3f3a4de..2ee6374 100644
--- a/contrib/bind9/lib/dns/include/dns/master.h
+++ b/contrib/bind9/lib/dns/include/dns/master.h
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004-2008 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004-2009 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 1999-2002 Internet Software Consortium.
*
* Permission to use, copy, modify, and/or distribute this software for any
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: master.h,v 1.51 2008-04-02 02:37:42 marka Exp $ */
+/* $Id: master.h,v 1.53 2009-07-01 23:47:36 tbox Exp $ */
#ifndef DNS_MASTER_H
#define DNS_MASTER_H 1
@@ -56,6 +56,7 @@
#define DNS_MASTER_CHECKMXFAIL 0x00001000
#define DNS_MASTER_RESIGN 0x00002000
+#define DNS_MASTER_KEY 0x00004000 /*%< Loading a key zone master file. */
ISC_LANG_BEGINDECLS
diff --git a/contrib/bind9/lib/dns/include/dns/masterdump.h b/contrib/bind9/lib/dns/include/dns/masterdump.h
index 651d0d0..684dd82 100644
--- a/contrib/bind9/lib/dns/include/dns/masterdump.h
+++ b/contrib/bind9/lib/dns/include/dns/masterdump.h
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004-2008 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004-2008, 2011 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 1999-2002 Internet Software Consortium.
*
* Permission to use, copy, modify, and/or distribute this software for any
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: masterdump.h,v 1.42.602.1 2011-05-27 00:19:19 each Exp $ */
+/* $Id: masterdump.h,v 1.42.596.2 2011-06-02 23:47:35 tbox Exp $ */
#ifndef DNS_MASTERDUMP_H
#define DNS_MASTERDUMP_H 1
diff --git a/contrib/bind9/lib/dns/include/dns/message.h b/contrib/bind9/lib/dns/include/dns/message.h
index 98fb321..438de1e 100644
--- a/contrib/bind9/lib/dns/include/dns/message.h
+++ b/contrib/bind9/lib/dns/include/dns/message.h
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004-2009 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004-2010 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 1999-2003 Internet Software Consortium.
*
* Permission to use, copy, modify, and/or distribute this software for any
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: message.h,v 1.125.118.2 2009-01-18 23:47:41 tbox Exp $ */
+/* $Id: message.h,v 1.132 2010-03-04 23:50:34 tbox Exp $ */
#ifndef DNS_MESSAGE_H
#define DNS_MESSAGE_H 1
@@ -81,8 +81,7 @@
* name = NULL;
* name = dns_message_gettempname(message, &name);
* dns_name_init(name, NULL);
- * result = dns_name_fromtext(name, &source, dns_rootname, ISC_FALSE,
- * buffer);
+ * result = dns_name_fromtext(name, &source, dns_rootname, 0, buffer);
* dns_message_takebuffer(message, &buffer);
* \endcode
*
@@ -137,6 +136,8 @@ typedef int dns_pseudosection_t;
typedef int dns_messagetextflag_t;
#define DNS_MESSAGETEXTFLAG_NOCOMMENTS 0x0001
#define DNS_MESSAGETEXTFLAG_NOHEADERS 0x0002
+#define DNS_MESSAGETEXTFLAG_ONESOA 0x0004
+#define DNS_MESSAGETEXTFLAG_OMITSOA 0x0008
/*
* Dynamic update names for these sections.
@@ -174,6 +175,9 @@ typedef int dns_messagetextflag_t;
additional section. */
#define DNS_MESSAGERENDER_PREFER_AAAA 0x0010 /*%< prefer AAAA records in
additional section. */
+#ifdef ALLOW_FILTER_AAAA_ON_V4
+#define DNS_MESSAGERENDER_FILTER_AAAA 0x0020 /*%< filter AAAA records */
+#endif
typedef struct dns_msgblock dns_msgblock_t;
@@ -369,6 +373,14 @@ dns_message_totext(dns_message_t *msg, const dns_master_style_t *style,
* #DNS_MESSAGETEXTFLAG_NOHEADERS is cleared, header lines will
* be emitted.
*
+ * If #DNS_MESSAGETEXTFLAG_ONESOA is set then only print the
+ * first SOA record in the answer section. If
+ * #DNS_MESSAGETEXTFLAG_OMITSOA is set don't print any SOA records
+ * in the answer section. These are useful for suppressing the
+ * display of the second SOA record in a AXFR by setting
+ * #DNS_MESSAGETEXTFLAG_ONESOA on the first message in a AXFR stream
+ * and #DNS_MESSAGETEXTFLAG_OMITSOA on subsequent messages.
+ *
* Requires:
*
*\li 'msg' is a valid message.
diff --git a/contrib/bind9/lib/dns/include/dns/name.h b/contrib/bind9/lib/dns/include/dns/name.h
index 801c9ac..c13a85d 100644
--- a/contrib/bind9/lib/dns/include/dns/name.h
+++ b/contrib/bind9/lib/dns/include/dns/name.h
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004-2007, 2009, 2010 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004-2007, 2009-2011 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 1998-2003 Internet Software Consortium.
*
* Permission to use, copy, modify, and/or distribute this software for any
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: name.h,v 1.126.332.5 2010-07-09 23:45:55 tbox Exp $ */
+/* $Id: name.h,v 1.137 2011-01-13 04:59:26 tbox Exp $ */
#ifndef DNS_NAME_H
#define DNS_NAME_H 1
@@ -121,21 +121,27 @@ struct dns_name {
#define DNS_NAME_MAGIC ISC_MAGIC('D','N','S','n')
-#define DNS_NAMEATTR_ABSOLUTE 0x0001
-#define DNS_NAMEATTR_READONLY 0x0002
-#define DNS_NAMEATTR_DYNAMIC 0x0004
-#define DNS_NAMEATTR_DYNOFFSETS 0x0008
-#define DNS_NAMEATTR_NOCOMPRESS 0x0010
+#define DNS_NAMEATTR_ABSOLUTE 0x00000001
+#define DNS_NAMEATTR_READONLY 0x00000002
+#define DNS_NAMEATTR_DYNAMIC 0x00000004
+#define DNS_NAMEATTR_DYNOFFSETS 0x00000008
+#define DNS_NAMEATTR_NOCOMPRESS 0x00000010
/*
* Attributes below 0x0100 reserved for name.c usage.
*/
-#define DNS_NAMEATTR_CACHE 0x0100 /*%< Used by resolver. */
-#define DNS_NAMEATTR_ANSWER 0x0200 /*%< Used by resolver. */
-#define DNS_NAMEATTR_NCACHE 0x0400 /*%< Used by resolver. */
-#define DNS_NAMEATTR_CHAINING 0x0800 /*%< Used by resolver. */
-#define DNS_NAMEATTR_CHASE 0x1000 /*%< Used by resolver. */
-#define DNS_NAMEATTR_WILDCARD 0x2000 /*%< Used by server. */
+#define DNS_NAMEATTR_CACHE 0x00000100 /*%< Used by resolver. */
+#define DNS_NAMEATTR_ANSWER 0x00000200 /*%< Used by resolver. */
+#define DNS_NAMEATTR_NCACHE 0x00000400 /*%< Used by resolver. */
+#define DNS_NAMEATTR_CHAINING 0x00000800 /*%< Used by resolver. */
+#define DNS_NAMEATTR_CHASE 0x00001000 /*%< Used by resolver. */
+#define DNS_NAMEATTR_WILDCARD 0x00002000 /*%< Used by server. */
+#define DNS_NAMEATTR_PREREQUISITE 0x00004000 /*%< Used by client. */
+#define DNS_NAMEATTR_UPDATE 0x00008000 /*%< Used by client. */
+#define DNS_NAMEATTR_HASUPDATEREC 0x00010000 /*%< Used by client. */
+/*
+ * Various flags.
+ */
#define DNS_NAME_DOWNCASE 0x0001
#define DNS_NAME_CHECKNAMES 0x0002 /*%< Used by rdata. */
#define DNS_NAME_CHECKNAMESFAIL 0x0004 /*%< Used by rdata. */
@@ -750,7 +756,7 @@ dns_name_towire(const dns_name_t *name, dns_compress_t *cctx,
isc_result_t
dns_name_fromtext(dns_name_t *name, isc_buffer_t *source,
- dns_name_t *origin, unsigned int options,
+ const dns_name_t *origin, unsigned int options,
isc_buffer_t *target);
/*%<
* Convert the textual representation of a DNS name at source
@@ -1139,6 +1145,56 @@ dns_name_format(dns_name_t *name, char *cp, unsigned int size);
*/
isc_result_t
+dns_name_tostring(dns_name_t *source, char **target, isc_mem_t *mctx);
+/*%<
+ * Convert 'name' to string format, allocating sufficient memory to
+ * hold it (free with isc_mem_free()).
+ *
+ * Differs from dns_name_format in that it allocates its own memory.
+ *
+ * Requires:
+ *
+ *\li 'name' is a valid name.
+ *\li 'target' is not NULL.
+ *\li '*target' is NULL.
+ *
+ * Returns:
+ *
+ *\li ISC_R_SUCCESS
+ *
+ *\li Any error that dns_name_totext() can return.
+ */
+
+isc_result_t
+dns_name_fromstring(dns_name_t *target, const char *src, unsigned int options,
+ isc_mem_t *mctx);
+isc_result_t
+dns_name_fromstring2(dns_name_t *target, const char *src,
+ const dns_name_t *origin, unsigned int options,
+ isc_mem_t *mctx);
+/*%<
+ * Convert a string to a name and place it in target, allocating memory
+ * as necessary. 'options' has the same semantics as that of
+ * dns_name_fromtext().
+ *
+ * If 'target' has a buffer then the name will be copied into it rather than
+ * memory being allocated.
+ *
+ * Requires:
+ *
+ * \li 'target' is a valid name that is not read-only.
+ * \li 'src' is not NULL.
+ *
+ * Returns:
+ *
+ *\li #ISC_R_SUCCESS
+ *
+ *\li Any error that dns_name_fromtext() can return.
+ *
+ *\li Any error that dns_name_dup() can return.
+ */
+
+isc_result_t
dns_name_settotextfilter(dns_name_totextfilter_t proc);
/*%<
* Set / clear a thread specific function 'proc' to be called at the
diff --git a/contrib/bind9/lib/dns/include/dns/ncache.h b/contrib/bind9/lib/dns/include/dns/ncache.h
index 0c1d950..32345cf 100644
--- a/contrib/bind9/lib/dns/include/dns/ncache.h
+++ b/contrib/bind9/lib/dns/include/dns/ncache.h
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: ncache.h,v 1.25.48.4 2010-05-14 23:47:50 tbox Exp $ */
+/* $Id: ncache.h,v 1.29 2010-05-14 23:50:40 tbox Exp $ */
#ifndef DNS_NCACHE_H
#define DNS_NCACHE_H 1
diff --git a/contrib/bind9/lib/dns/include/dns/nsec3.h b/contrib/bind9/lib/dns/include/dns/nsec3.h
index ba808e4..ac0c8f2 100644
--- a/contrib/bind9/lib/dns/include/dns/nsec3.h
+++ b/contrib/bind9/lib/dns/include/dns/nsec3.h
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2008, 2009 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2008-2010 Internet Systems Consortium, Inc. ("ISC")
*
* Permission to use, copy, modify, and/or distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
@@ -14,7 +14,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: nsec3.h,v 1.5.48.3 2009-10-06 21:20:18 each Exp $ */
+/* $Id: nsec3.h,v 1.12 2010-05-18 02:38:10 tbox Exp $ */
#ifndef DNS_NSEC3_H
#define DNS_NSEC3_H 1
@@ -110,6 +110,12 @@ isc_result_t
dns_nsec3_addnsec3s(dns_db_t *db, dns_dbversion_t *version,
dns_name_t *name, dns_ttl_t nsecttl,
isc_boolean_t unsecure, dns_diff_t *diff);
+
+isc_result_t
+dns_nsec3_addnsec3sx(dns_db_t *db, dns_dbversion_t *version,
+ dns_name_t *name, dns_ttl_t nsecttl,
+ isc_boolean_t unsecure, dns_rdatatype_t private,
+ dns_diff_t *diff);
/*%<
* Add NSEC3 records for 'name', recording the change in 'diff'.
* Adjust previous NSEC3 records, if any, to reflect the addition.
@@ -130,6 +136,10 @@ dns_nsec3_addnsec3s(dns_db_t *db, dns_dbversion_t *version,
* NSEC3PARAM record otherwise OPTOUT will be inherited from the previous
* record in the chain.
*
+ * dns_nsec3_addnsec3sx() is similar to dns_nsec3_addnsec3s() but 'private'
+ * specifies the type of the private rdataset to be checked in addition to
+ * the nsec3param rdataset at the zone apex.
+ *
* Requires:
* 'db' to be valid.
* 'version' to be valid or NULL.
@@ -145,6 +155,10 @@ dns_nsec3_delnsec3(dns_db_t *db, dns_dbversion_t *version, dns_name_t *name,
isc_result_t
dns_nsec3_delnsec3s(dns_db_t *db, dns_dbversion_t *version, dns_name_t *name,
dns_diff_t *diff);
+
+isc_result_t
+dns_nsec3_delnsec3sx(dns_db_t *db, dns_dbversion_t *version, dns_name_t *name,
+ dns_rdatatype_t private, dns_diff_t *diff);
/*%<
* Remove NSEC3 records for 'name', recording the change in 'diff'.
* Adjust previous NSEC3 records, if any, to reflect the removal.
@@ -156,6 +170,10 @@ dns_nsec3_delnsec3s(dns_db_t *db, dns_dbversion_t *version, dns_name_t *name,
* to dns_nsec3_addnsec3s(). Unlike dns_nsec3_addnsec3s() updated NSEC3
* records have the OPTOUT flag preserved.
*
+ * dns_nsec3_delnsec3sx() is similar to dns_nsec3_delnsec3s() but 'private'
+ * specifies the type of the private rdataset to be checked in addition to
+ * the nsec3param rdataset at the zone apex.
+ *
* Requires:
* 'db' to be valid.
* 'version' to be valid or NULL.
@@ -167,10 +185,19 @@ dns_nsec3_delnsec3s(dns_db_t *db, dns_dbversion_t *version, dns_name_t *name,
isc_result_t
dns_nsec3_active(dns_db_t *db, dns_dbversion_t *version,
isc_boolean_t complete, isc_boolean_t *answer);
+
+isc_result_t
+dns_nsec3_activex(dns_db_t *db, dns_dbversion_t *version,
+ isc_boolean_t complete, dns_rdatatype_t private,
+ isc_boolean_t *answer);
/*%<
* Check if there are any complete/to be built NSEC3 chains.
* If 'complete' is ISC_TRUE only complete chains will be recognized.
*
+ * dns_nsec3_activex() is similar to dns_nsec3_active() but 'private'
+ * specifies the type of the private rdataset to be checked in addition to
+ * the nsec3param rdataset at the zone apex.
+ *
* Requires:
* 'db' to be valid.
* 'version' to be valid or NULL.
@@ -191,6 +218,36 @@ dns_nsec3_maxiterations(dns_db_t *db, dns_dbversion_t *version,
* 'iterationsp' to be non NULL.
*/
+isc_boolean_t
+dns_nsec3param_fromprivate(dns_rdata_t *src, dns_rdata_t *target,
+ unsigned char *buf, size_t buflen);
+/*%<
+ * Convert a private rdata to a nsec3param rdata.
+ *
+ * Return ISC_TRUE if 'src' could be successfully converted.
+ *
+ * 'buf' should be at least DNS_NSEC3PARAM_BUFFERSIZE in size.
+ */
+
+void
+dns_nsec3param_toprivate(dns_rdata_t *src, dns_rdata_t *target,
+ dns_rdatatype_t privatetype,
+ unsigned char *buf, size_t buflen);
+/*%<
+ * Convert a nsec3param rdata to a private rdata.
+ *
+ * 'buf' should be at least src->length + 1 in size.
+ */
+
+isc_result_t
+dns_nsec3param_deletechains(dns_db_t *db, dns_dbversion_t *ver,
+ dns_zone_t *zone, dns_diff_t *diff);
+
+/*%<
+ * Mark NSEC3PARAM for deletion.
+ */
+
+
ISC_LANG_ENDDECLS
#endif /* DNS_NSEC3_H */
diff --git a/contrib/bind9/lib/dns/include/dns/peer.h b/contrib/bind9/lib/dns/include/dns/peer.h
index 1f8a42e..a1a3e34 100644
--- a/contrib/bind9/lib/dns/include/dns/peer.h
+++ b/contrib/bind9/lib/dns/include/dns/peer.h
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: peer.h,v 1.33.118.2 2009-01-18 23:47:41 tbox Exp $ */
+/* $Id: peer.h,v 1.35 2009-01-17 23:47:43 tbox Exp $ */
#ifndef DNS_PEER_H
#define DNS_PEER_H 1
diff --git a/contrib/bind9/lib/dns/include/dns/private.h b/contrib/bind9/lib/dns/include/dns/private.h
new file mode 100644
index 0000000..ffedb5f
--- /dev/null
+++ b/contrib/bind9/lib/dns/include/dns/private.h
@@ -0,0 +1,55 @@
+/*
+ * Copyright (C) 2009 Internet Systems Consortium, Inc. ("ISC")
+ *
+ * Permission to use, copy, modify, and/or 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 ISC DISCLAIMS ALL WARRANTIES WITH
+ * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+ * AND FITNESS. IN NO EVENT SHALL ISC 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.
+ */
+
+/* $Id: private.h,v 1.3 2009-10-09 23:48:09 tbox Exp $ */
+
+#include <isc/lang.h>
+#include <isc/types.h>
+
+#include <dns/types.h>
+#include <dns/db.h>
+
+#ifndef DNS_PRIVATE_H
+#define DNS_PRIVATE_H
+
+ISC_LANG_BEGINDECLS
+
+isc_result_t
+dns_private_chains(dns_db_t *db, dns_dbversion_t *ver,
+ dns_rdatatype_t privatetype,
+ isc_boolean_t *build_nsec, isc_boolean_t *build_nsec3);
+/*%<
+ * Examine the NSEC, NSEC3PARAM and privatetype RRsets at the apex of the
+ * database to determine which of NSEC or NSEC3 chains we are currently
+ * maintaining. In normal operations only one of NSEC or NSEC3 is being
+ * maintained but when we are transitiong between NSEC and NSEC3 we need
+ * to update both sets of chains. If 'privatetype' is zero then the
+ * privatetype RRset will not be examined.
+ *
+ * Requires:
+ * \li 'db' is valid.
+ * \li 'version' is valid or NULL.
+ * \li 'build_nsec' is a pointer to a isc_boolean_t or NULL.
+ * \li 'build_nsec3' is a pointer to a isc_boolean_t or NULL.
+ *
+ * Returns:
+ * \li ISC_R_SUCCESS, 'build_nsec' and 'build_nsec3' will be valid.
+ * \li other on error
+ */
+
+ISC_LANG_ENDDECLS
+
+#endif
diff --git a/contrib/bind9/lib/dns/include/dns/rbt.h b/contrib/bind9/lib/dns/include/dns/rbt.h
index 72ef2f1..6149e8d 100644
--- a/contrib/bind9/lib/dns/include/dns/rbt.h
+++ b/contrib/bind9/lib/dns/include/dns/rbt.h
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: rbt.h,v 1.71.48.3 2009-10-20 05:06:04 marka Exp $ */
+/* $Id: rbt.h,v 1.77 2009-11-04 01:18:19 marka Exp $ */
#ifndef DNS_RBT_H
#define DNS_RBT_H 1
@@ -70,6 +70,12 @@ ISC_LANG_BEGINDECLS
* multiple dns_rbtnode structures will not work.
*/
typedef struct dns_rbtnode dns_rbtnode_t;
+enum {
+ DNS_RBT_NSEC_NORMAL=0, /* in main tree */
+ DNS_RBT_NSEC_HAS_NSEC=1, /* also has node in nsec tree */
+ DNS_RBT_NSEC_NSEC=2, /* in nsec tree */
+ DNS_RBT_NSEC_NSEC3=3 /* in nsec3 tree */
+};
struct dns_rbtnode {
#if DNS_RBT_USEMAGIC
unsigned int magic;
@@ -94,10 +100,7 @@ struct dns_rbtnode {
* The following bitfields add up to a total bitwidth of 32.
* The range of values necessary for each item is indicated,
* but in the case of "attributes" the field is wider to accommodate
- * possible future expansion. "offsetlen" could be one bit
- * narrower by always adjusting its value by 1 to find the real
- * offsetlen, but doing so does not gain anything (except perhaps
- * another bit for "attributes", which doesn't yet need any more).
+ * possible future expansion.
*
* In each case below the "range" indicated is what's _necessary_ for
* the bitfield to hold, not what it actually _can_ hold.
@@ -105,8 +108,8 @@ struct dns_rbtnode {
unsigned int is_root : 1; /*%< range is 0..1 */
unsigned int color : 1; /*%< range is 0..1 */
unsigned int find_callback : 1; /*%< range is 0..1 */
- unsigned int attributes : 4; /*%< range is 0..2 */
- unsigned int nsec3 : 1; /*%< range is 0..1 */
+ unsigned int attributes : 3; /*%< range is 0..2 */
+ unsigned int nsec : 2; /*%< range is 0..3 */
unsigned int namelen : 8; /*%< range is 1..255 */
unsigned int offsetlen : 8; /*%< range is 1..128 */
unsigned int oldnamelen : 8; /*%< range is 1..255 */
@@ -909,7 +912,7 @@ dns_rbtnodechain_nextflat(dns_rbtnodechain_t *chain, dns_name_t *name);
} while (0)
#else /* DNS_RBT_USEISCREFCOUNT */
#define dns_rbtnode_refinit(node, n) ((node)->references = (n))
-#define dns_rbtnode_refdestroy(node) (REQUIRE((node)->references == 0))
+#define dns_rbtnode_refdestroy(node) REQUIRE((node)->references == 0)
#define dns_rbtnode_refcurrent(node) ((node)->references)
#define dns_rbtnode_refincrement0(node, refs) \
do { \
diff --git a/contrib/bind9/lib/dns/include/dns/rdata.h b/contrib/bind9/lib/dns/include/dns/rdata.h
index 1674b0c..b70a353 100644
--- a/contrib/bind9/lib/dns/include/dns/rdata.h
+++ b/contrib/bind9/lib/dns/include/dns/rdata.h
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: rdata.h,v 1.70.120.3 2009-02-16 00:29:27 marka Exp $ */
+/* $Id: rdata.h,v 1.77 2009-12-04 21:09:33 marka Exp $ */
#ifndef DNS_RDATA_H
#define DNS_RDATA_H 1
@@ -95,6 +95,7 @@
#include <dns/types.h>
#include <dns/name.h>
+#include <dns/message.h>
ISC_LANG_BEGINDECLS
@@ -124,9 +125,27 @@ struct dns_rdata {
#define DNS_RDATA_INIT { NULL, 0, 0, 0, 0, {(void*)(-1), (void *)(-1)}}
+#define DNS_RDATA_CHECKINITIALIZED
+#ifdef DNS_RDATA_CHECKINITIALIZED
+#define DNS_RDATA_INITIALIZED(rdata) \
+ ((rdata)->data == NULL && (rdata)->length == 0 && \
+ (rdata)->rdclass == 0 && (rdata)->type == 0 && (rdata)->flags == 0 && \
+ !ISC_LINK_LINKED((rdata), link))
+#else
+#ifdef ISC_LIST_CHECKINIT
+#define DNS_RDATA_INITIALIZED(rdata) \
+ (!ISC_LINK_LINKED((rdata), link))
+#else
+#define DNS_RDATA_INITIALIZED(rdata) ISC_TRUE
+#endif
+#endif
+
#define DNS_RDATA_UPDATE 0x0001 /*%< update pseudo record. */
#define DNS_RDATA_OFFLINE 0x0002 /*%< RRSIG has a offline key. */
+#define DNS_RDATA_VALIDFLAGS(rdata) \
+ (((rdata)->flags & ~(DNS_RDATA_UPDATE|DNS_RDATA_OFFLINE)) == 0)
+
/*
* Flags affecting rdata formatting style. Flags 0xFFFF0000
* are used by masterfile-level formatting and defined elsewhere.
@@ -201,6 +220,25 @@ dns_rdata_compare(const dns_rdata_t *rdata1, const dns_rdata_t *rdata2);
*\li > 0 'rdata1' is greater than 'rdata2'
*/
+int
+dns_rdata_casecompare(const dns_rdata_t *rdata1, const dns_rdata_t *rdata2);
+/*%<
+ * dns_rdata_casecompare() is similar to dns_rdata_compare() but also
+ * compares domain names case insensitively in known rdata types that
+ * are treated as opaque data by dns_rdata_compare().
+ *
+ * Requires:
+ *
+ *\li 'rdata1' is a valid, non-empty rdata
+ *
+ *\li 'rdata2' is a valid, non-empty rdata
+ *
+ * Returns:
+ *\li < 0 'rdata1' is less than 'rdata2'
+ *\li 0 'rdata1' is equal to 'rdata2'
+ *\li > 0 'rdata1' is greater than 'rdata2'
+ */
+
/***
*** Conversions
***/
@@ -698,6 +736,21 @@ dns_rdata_checknames(dns_rdata_t *rdata, dns_name_t *owner, dns_name_t *bad);
* 'bad' to be NULL or valid.
*/
+void
+dns_rdata_exists(dns_rdata_t *rdata, dns_rdatatype_t type);
+
+void
+dns_rdata_notexist(dns_rdata_t *rdata, dns_rdatatype_t type);
+
+void
+dns_rdata_deleterrset(dns_rdata_t *rdata, dns_rdatatype_t type);
+
+void
+dns_rdata_makedelete(dns_rdata_t *rdata);
+
+const char *
+dns_rdata_updateop(dns_rdata_t *rdata, dns_section_t section);
+
ISC_LANG_ENDDECLS
#endif /* DNS_RDATA_H */
diff --git a/contrib/bind9/lib/dns/include/dns/rdataset.h b/contrib/bind9/lib/dns/include/dns/rdataset.h
index 9b48209..7f50c12 100644
--- a/contrib/bind9/lib/dns/include/dns/rdataset.h
+++ b/contrib/bind9/lib/dns/include/dns/rdataset.h
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004-2010 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004-2011 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 1999-2003 Internet Software Consortium.
*
* Permission to use, copy, modify, and/or distribute this software for any
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: rdataset.h,v 1.65.50.4.6.1 2011-05-27 00:19:19 each Exp $ */
+/* $Id: rdataset.h,v 1.69.270.3 2011-06-21 20:15:54 each Exp $ */
#ifndef DNS_RDATASET_H
#define DNS_RDATASET_H 1
@@ -203,6 +203,7 @@ struct dns_rdataset {
#define DNS_RDATASETATTR_RESIGN 0x00040000
#define DNS_RDATASETATTR_CLOSEST 0x00080000
#define DNS_RDATASETATTR_OPTOUT 0x00100000 /*%< OPTOUT proof */
+#define DNS_RDATASETATTR_NEGATIVE 0x00200000
/*%
* _OMITDNSSEC:
diff --git a/contrib/bind9/lib/dns/include/dns/request.h b/contrib/bind9/lib/dns/include/dns/request.h
index 8808c0a..f2db1031b 100644
--- a/contrib/bind9/lib/dns/include/dns/request.h
+++ b/contrib/bind9/lib/dns/include/dns/request.h
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004-2007, 2009 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004-2007, 2009, 2010 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 2000-2002 Internet Software Consortium.
*
* Permission to use, copy, modify, and/or distribute this software for any
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: request.h,v 1.27.332.2 2009-01-18 23:47:41 tbox Exp $ */
+/* $Id: request.h,v 1.31 2010-03-04 23:50:34 tbox Exp $ */
#ifndef DNS_REQUEST_H
#define DNS_REQUEST_H 1
@@ -47,6 +47,7 @@
#include <dns/types.h>
#define DNS_REQUESTOPT_TCP 0x00000001U
+#define DNS_REQUESTOPT_CASE 0x00000002U
typedef struct dns_requestevent {
ISC_EVENT_COMMON(struct dns_requestevent);
@@ -175,6 +176,9 @@ dns_request_create(dns_requestmgr_t *requestmgr, dns_message_t *message,
* #DNS_REQUESTOPT_TCP option is set, TCP will be used. The request
* will timeout after 'timeout' seconds.
*
+ *\li If the #DNS_REQUESTOPT_CASE option is set, use case sensitive
+ * compression.
+ *
*\li When the request completes, successfully, due to a timeout, or
* because it was canceled, a completion event will be sent to 'task'.
*
@@ -227,6 +231,9 @@ dns_request_createvia3(dns_requestmgr_t *requestmgr, dns_message_t *message,
* will timeout after 'timeout' seconds. UDP requests will be resent
* at 'udptimeout' intervals if non-zero or 'udpretries' is non-zero.
*
+ *\li If the #DNS_REQUESTOPT_CASE option is set, use case sensitive
+ * compression.
+ *
*\li When the request completes, successfully, due to a timeout, or
* because it was canceled, a completion event will be sent to 'task'.
*
diff --git a/contrib/bind9/lib/dns/include/dns/resolver.h b/contrib/bind9/lib/dns/include/dns/resolver.h
index c9034bf..2db1770 100644
--- a/contrib/bind9/lib/dns/include/dns/resolver.h
+++ b/contrib/bind9/lib/dns/include/dns/resolver.h
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004-2010 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004-2011 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 1999-2001, 2003 Internet Software Consortium.
*
* Permission to use, copy, modify, and/or distribute this software for any
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: resolver.h,v 1.60.56.5 2010-02-25 10:56:41 tbox Exp $ */
+/* $Id: resolver.h,v 1.67.86.1.2.1 2011-06-02 23:47:36 tbox Exp $ */
#ifndef DNS_RESOLVER_H
#define DNS_RESOLVER_H 1
@@ -81,6 +81,7 @@ typedef struct dns_fetchevent {
dns_fixedname_t foundname;
isc_sockaddr_t * client;
dns_messageid_t id;
+ isc_result_t vresult;
} dns_fetchevent_t;
/*
@@ -179,7 +180,7 @@ dns_resolver_freeze(dns_resolver_t *res);
*
* Requires:
*
- *\li 'res' is a valid, unfrozen resolver.
+ *\li 'res' is a valid resolver.
*
* Ensures:
*
@@ -491,6 +492,27 @@ dns_resolver_setmustbesecure(dns_resolver_t *resolver, dns_name_t *name,
isc_boolean_t
dns_resolver_getmustbesecure(dns_resolver_t *resolver, dns_name_t *name);
+
+void
+dns_resolver_settimeout(dns_resolver_t *resolver, unsigned int seconds);
+/*%<
+ * Set the length of time the resolver will work on a query, in seconds.
+ *
+ * If timeout is 0, the default timeout will be applied.
+ *
+ * Requires:
+ * \li resolver to be valid.
+ */
+
+unsigned int
+dns_resolver_gettimeout(dns_resolver_t *resolver);
+/*%<
+ * Get the current length of time the resolver will work on a query, in seconds.
+ *
+ * Requires:
+ * \li resolver to be valid.
+ */
+
void
dns_resolver_setclientsperquery(dns_resolver_t *resolver,
isc_uint32_t min, isc_uint32_t max);
diff --git a/contrib/bind9/lib/dns/include/dns/result.h b/contrib/bind9/lib/dns/include/dns/result.h
index 74b84d6..adc1215 100644
--- a/contrib/bind9/lib/dns/include/dns/result.h
+++ b/contrib/bind9/lib/dns/include/dns/result.h
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004-2008, 2010 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004-2011 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 1998-2003 Internet Software Consortium.
*
* Permission to use, copy, modify, and/or distribute this software for any
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: result.h,v 1.116.48.2 2010-02-25 10:56:41 tbox Exp $ */
+/* $Id: result.h,v 1.122 2011-01-11 23:47:13 tbox Exp $ */
#ifndef DNS_RESULT_H
#define DNS_RESULT_H 1
@@ -148,10 +148,11 @@
#define DNS_R_MXISADDRESS (ISC_RESULTCLASS_DNS + 102)
#define DNS_R_DUPLICATE (ISC_RESULTCLASS_DNS + 103)
#define DNS_R_INVALIDNSEC3 (ISC_RESULTCLASS_DNS + 104)
-#define DNS_R_NOTMASTER (ISC_RESULTCLASS_DNS + 105)
+#define DNS_R_NOTMASTER (ISC_RESULTCLASS_DNS + 105)
#define DNS_R_BROKENCHAIN (ISC_RESULTCLASS_DNS + 106)
+#define DNS_R_EXPIRED (ISC_RESULTCLASS_DNS + 107)
-#define DNS_R_NRESULTS 107 /*%< Number of results */
+#define DNS_R_NRESULTS 108 /*%< Number of results */
/*
* DNS wire format rcodes.
diff --git a/contrib/bind9/lib/dns/include/dns/rpz.h b/contrib/bind9/lib/dns/include/dns/rpz.h
new file mode 100644
index 0000000..404f517
--- /dev/null
+++ b/contrib/bind9/lib/dns/include/dns/rpz.h
@@ -0,0 +1,189 @@
+/*
+ * Copyright (C) 2011 Internet Systems Consortium, Inc. ("ISC")
+ *
+ * Permission to use, copy, modify, and/or 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 ISC DISCLAIMS ALL WARRANTIES WITH
+ * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+ * AND FITNESS. IN NO EVENT SHALL ISC 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.
+ */
+
+/* $Id: rpz.h,v 1.3 2011-01-13 04:59:26 tbox Exp $ */
+
+#ifndef DNS_RPZ_H
+#define DNS_RPZ_H 1
+
+#include <isc/lang.h>
+
+#include <dns/fixedname.h>
+#include <dns/rdata.h>
+#include <dns/types.h>
+
+ISC_LANG_BEGINDECLS
+
+#define DNS_RPZ_IP_ZONE "rpz-ip"
+#define DNS_RPZ_NSIP_ZONE "rpz-nsip"
+#define DNS_RPZ_NSDNAME_ZONE "rpz-nsdname"
+
+typedef isc_uint8_t dns_rpz_cidr_bits_t;
+
+typedef enum {
+ DNS_RPZ_TYPE_BAD,
+ DNS_RPZ_TYPE_QNAME,
+ DNS_RPZ_TYPE_IP,
+ DNS_RPZ_TYPE_NSIP,
+ DNS_RPZ_TYPE_NSDNAME
+} dns_rpz_type_t;
+
+/*
+ * Require DNS_RPZ_POLICY_NO_OP < DNS_RPZ_POLICY_NXDOMAIN <
+ * DNS_RPZ_POLICY_NODATA < DNS_RPZ_POLICY_CNAME.
+ */
+typedef enum {
+ DNS_RPZ_POLICY_GIVEN = 0, /* 'given': what something else says */
+ DNS_RPZ_POLICY_NO_OP = 1, /* 'no-op': do not rewrite */
+ DNS_RPZ_POLICY_NXDOMAIN = 2, /* 'nxdomain': answer with NXDOMAIN */
+ DNS_RPZ_POLICY_NODATA = 3, /* 'nodata': answer with ANCOUNT=0 */
+ DNS_RPZ_POLICY_CNAME = 4, /* 'cname x': answer with x's rrsets */
+ DNS_RPZ_POLICY_RECORD = 5,
+ DNS_RPZ_POLICY_MISS,
+ DNS_RPZ_POLICY_ERROR
+} dns_rpz_policy_t;
+
+/*
+ * Specify a response policy zone.
+ */
+typedef struct dns_rpz_zone dns_rpz_zone_t;
+
+struct dns_rpz_zone {
+ ISC_LINK(dns_rpz_zone_t) link;
+ int num;
+ dns_name_t origin; /* Policy zone name */
+ dns_name_t nsdname; /* RPZ_NSDNAME_ZONE.origin */
+ dns_rpz_policy_t policy; /* RPZ_POLICY_GIVEN or override */
+ dns_name_t cname; /* override name for
+ RPZ_POLICY_CNAME */
+};
+
+/*
+ * Radix trees for response policy IP addresses.
+ */
+typedef struct dns_rpz_cidr dns_rpz_cidr_t;
+
+/*
+ * context for finding the best policy
+ */
+typedef struct {
+ unsigned int state;
+# define DNS_RPZ_REWRITTEN 0x0001
+# define DNS_RPZ_DONE_QNAME 0x0002
+# define DNS_RPZ_DONE_A 0x0004
+# define DNS_RPZ_RECURSING 0x0008
+# define DNS_RPZ_HAVE_IP 0x0010
+# define DNS_RPZ_HAVE_NSIPv4 0x0020
+# define DNS_RPZ_HAVE_NSIPv6 0x0040
+# define DNS_RPZ_HAD_NSDNAME 0x0080
+ /*
+ * Best match so far.
+ */
+ struct {
+ dns_rpz_type_t type;
+ dns_rpz_zone_t *rpz;
+ dns_rpz_cidr_bits_t prefix;
+ dns_rpz_policy_t policy;
+ dns_ttl_t ttl;
+ isc_result_t result;
+ dns_zone_t *zone;
+ dns_db_t *db;
+ dns_dbnode_t *node;
+ dns_rdataset_t *rdataset;
+ } m;
+ /*
+ * State for chasing NS names and addresses including recursion.
+ */
+ struct {
+ unsigned int label;
+ dns_db_t *db;
+ dns_rdataset_t *ns_rdataset;
+ dns_rdatatype_t r_type;
+ isc_result_t r_result;
+ dns_rdataset_t *r_rdataset;
+ } ns;
+ /*
+ * State of real query while recursing for NSIP or NSDNAME.
+ */
+ struct {
+ isc_result_t result;
+ isc_boolean_t is_zone;
+ isc_boolean_t authoritative;
+ dns_zone_t *zone;
+ dns_db_t *db;
+ dns_dbnode_t *node;
+ dns_rdataset_t *rdataset;
+ dns_rdataset_t *sigrdataset;
+ dns_rdatatype_t qtype;
+ } q;
+ dns_name_t *qname;
+ dns_name_t *r_name;
+ dns_name_t *fname;
+ dns_fixedname_t _qnamef;
+ dns_fixedname_t _r_namef;
+ dns_fixedname_t _fnamef;
+} dns_rpz_st_t;
+
+#define DNS_RPZ_TTL_DEFAULT 5
+
+/*
+ * So various response policy zone messages can be turned up or down.
+ */
+#define DNS_RPZ_ERROR_LEVEL ISC_LOG_WARNING
+#define DNS_RPZ_INFO_LEVEL ISC_LOG_INFO
+#define DNS_RPZ_DEBUG_LEVEL1 ISC_LOG_DEBUG(1)
+#define DNS_RPZ_DEBUG_LEVEL2 ISC_LOG_DEBUG(2)
+
+const char *
+dns_rpz_type2str(dns_rpz_type_t type);
+
+dns_rpz_policy_t
+dns_rpz_str2policy(const char *str);
+
+void
+dns_rpz_set_need(isc_boolean_t need);
+
+isc_boolean_t
+dns_rpz_needed(void);
+
+void
+dns_rpz_cidr_free(dns_rpz_cidr_t **cidr);
+
+void
+dns_rpz_view_destroy(dns_view_t *view);
+
+isc_result_t
+dns_rpz_new_cidr(isc_mem_t *mctx, dns_name_t *origin,
+ dns_rpz_cidr_t **rbtdb_cidr);
+void
+dns_rpz_enabled(dns_rpz_cidr_t *cidr, dns_rpz_st_t *st);
+
+void
+dns_rpz_cidr_deleteip(dns_rpz_cidr_t *cidr, dns_name_t *name);
+
+void
+dns_rpz_cidr_addip(dns_rpz_cidr_t *cidr, dns_name_t *name);
+
+isc_result_t
+dns_rpz_cidr_find(dns_rpz_cidr_t *cidr, const isc_netaddr_t *netaddr,
+ dns_rpz_type_t type, dns_name_t *canon_name,
+ dns_name_t *search_name, dns_rpz_cidr_bits_t *prefix);
+
+dns_rpz_policy_t
+dns_rpz_decode_cname(dns_rdataset_t *, dns_name_t *selfname);
+
+#endif /* DNS_RPZ_H */
+
diff --git a/contrib/bind9/lib/dns/include/dns/rriterator.h b/contrib/bind9/lib/dns/include/dns/rriterator.h
new file mode 100644
index 0000000..0087349
--- /dev/null
+++ b/contrib/bind9/lib/dns/include/dns/rriterator.h
@@ -0,0 +1,103 @@
+/*
+ * Copyright (C) 2009 Internet Systems Consortium, Inc. ("ISC")
+ *
+ * Permission to use, copy, modify, and/or 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 ISC DISCLAIMS ALL WARRANTIES WITH
+ * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+ * AND FITNESS. IN NO EVENT SHALL ISC 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.
+ */
+
+/* $Id: rriterator.h,v 1.2 2009-06-30 02:52:32 each Exp $ */
+
+#ifndef DNS_RRITERATOR_H
+#define DNS_RRITERATOR_H 1
+
+/*****
+ ***** Module Info
+ *****/
+
+/*! \file dns/rriterator.h
+ * \brief
+ * Functions for "walking" a zone database, visiting each RR or RRset in turn.
+ */
+
+/*****
+ ***** Imports
+ *****/
+
+#include <isc/lang.h>
+#include <isc/magic.h>
+#include <isc/ondestroy.h>
+#include <isc/stdtime.h>
+
+#include <dns/db.h>
+#include <dns/dbiterator.h>
+#include <dns/fixedname.h>
+#include <dns/name.h>
+#include <dns/rdata.h>
+#include <dns/rdataset.h>
+#include <dns/rdatasetiter.h>
+#include <dns/types.h>
+
+ISC_LANG_BEGINDECLS
+
+/*****
+ ***** Types
+ *****/
+
+/*%
+ * A dns_rriterator_t is an iterator that iterates over an entire database,
+ * returning one RR at a time, in some arbitrary order.
+ */
+
+typedef struct dns_rriterator {
+ unsigned int magic;
+ isc_result_t result;
+ dns_db_t *db;
+ dns_dbiterator_t *dbit;
+ dns_dbversion_t *ver;
+ isc_stdtime_t now;
+ dns_dbnode_t *node;
+ dns_fixedname_t fixedname;
+ dns_rdatasetiter_t *rdatasetit;
+ dns_rdataset_t rdataset;
+ dns_rdata_t rdata;
+} dns_rriterator_t;
+
+#define RRITERATOR_MAGIC ISC_MAGIC('R', 'R', 'I', 't')
+#define VALID_RRITERATOR(m) ISC_MAGIC_VALID(m, RRITERATOR_MAGIC)
+
+isc_result_t
+dns_rriterator_init(dns_rriterator_t *it, dns_db_t *db,
+ dns_dbversion_t *ver, isc_stdtime_t now);
+
+isc_result_t
+dns_rriterator_first(dns_rriterator_t *it);
+
+isc_result_t
+dns_rriterator_nextrrset(dns_rriterator_t *it);
+
+isc_result_t
+dns_rriterator_next(dns_rriterator_t *it);
+
+void
+dns_rriterator_current(dns_rriterator_t *it, dns_name_t **name,
+ isc_uint32_t *ttl, dns_rdataset_t **rdataset,
+ dns_rdata_t **rdata);
+
+void
+dns_rriterator_pause(dns_rriterator_t *it);
+
+void
+dns_rriterator_destroy(dns_rriterator_t *it);
+
+ISC_LANG_ENDDECLS
+
+#endif /* DNS_RRITERATOR_H */
diff --git a/contrib/bind9/lib/dns/include/dns/sdb.h b/contrib/bind9/lib/dns/include/dns/sdb.h
index 18995ed..5744837 100644
--- a/contrib/bind9/lib/dns/include/dns/sdb.h
+++ b/contrib/bind9/lib/dns/include/dns/sdb.h
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: sdb.h,v 1.21.332.2 2009-01-18 23:47:41 tbox Exp $ */
+/* $Id: sdb.h,v 1.23 2009-01-17 23:47:43 tbox Exp $ */
#ifndef DNS_SDB_H
#define DNS_SDB_H 1
diff --git a/contrib/bind9/lib/dns/include/dns/sdlz.h b/contrib/bind9/lib/dns/include/dns/sdlz.h
index 9d2a0ed..b917cc0 100644
--- a/contrib/bind9/lib/dns/include/dns/sdlz.h
+++ b/contrib/bind9/lib/dns/include/dns/sdlz.h
@@ -1,5 +1,5 @@
/*
- * Portions Copyright (C) 2005-2007, 2009 Internet Systems Consortium, Inc. ("ISC")
+ * Portions Copyright (C) 2005-2007, 2009-2011 Internet Systems Consortium, Inc. ("ISC")
* Portions Copyright (C) 1999-2001 Internet Software Consortium.
*
* Permission to use, copy, modify, and/or distribute this software for any
@@ -50,7 +50,7 @@
* USE OR PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: sdlz.h,v 1.7.332.2 2009-01-18 23:47:41 tbox Exp $ */
+/* $Id: sdlz.h,v 1.14 2011-01-13 08:50:29 tbox Exp $ */
/*! \file dns/sdlz.h */
@@ -74,11 +74,10 @@ typedef struct dns_sdlzlookup dns_sdlzlookup_t;
/* A simple DLZ database traversal in progress. */
typedef struct dns_sdlzallnodes dns_sdlzallnodes_t;
-
-typedef isc_result_t
-(*dns_sdlzallnodesfunc_t)(const char *zone, void *driverarg, void *dbdata,
- dns_sdlzallnodes_t *allnodes);
-
+typedef isc_result_t (*dns_sdlzallnodesfunc_t)(const char *zone,
+ void *driverarg,
+ void *dbdata,
+ dns_sdlzallnodes_t *allnodes);
/*%<
* Method prototype. Drivers implementing the SDLZ interface may
* supply an all nodes method. This method is called when the DNS
@@ -92,9 +91,9 @@ typedef isc_result_t
* does not have to implement an all nodes method.
*/
-typedef isc_result_t
-(*dns_sdlzallowzonexfr_t)(void *driverarg, void *dbdata, const char *name,
- const char *client);
+typedef isc_result_t (*dns_sdlzallowzonexfr_t)(void *driverarg,
+ void *dbdata, const char *name,
+ const char *client);
/*%<
* Method prototype. Drivers implementing the SDLZ interface may
@@ -117,9 +116,9 @@ typedef isc_result_t
* error.
*/
-typedef isc_result_t
-(*dns_sdlzauthorityfunc_t)(const char *zone, void *driverarg, void *dbdata,
- dns_sdlzlookup_t *lookup);
+typedef isc_result_t (*dns_sdlzauthorityfunc_t)(const char *zone,
+ void *driverarg, void *dbdata,
+ dns_sdlzlookup_t *lookup);
/*%<
* Method prototype. Drivers implementing the SDLZ interface may
@@ -131,9 +130,9 @@ typedef isc_result_t
* method.
*/
-typedef isc_result_t
-(*dns_sdlzcreate_t)(const char *dlzname, unsigned int argc, char *argv[],
- void *driverarg, void **dbdata);
+typedef isc_result_t (*dns_sdlzcreate_t)(const char *dlzname,
+ unsigned int argc, char *argv[],
+ void *driverarg, void **dbdata);
/*%<
* Method prototype. Drivers implementing the SDLZ interface may
@@ -142,8 +141,7 @@ typedef isc_result_t
* does not have to implement a create method.
*/
-typedef void
-(*dns_sdlzdestroy_t)(void *driverarg, void *dbdata);
+typedef void (*dns_sdlzdestroy_t)(void *driverarg, void *dbdata);
/*%<
* Method prototype. Drivers implementing the SDLZ interface may
@@ -198,6 +196,87 @@ typedef isc_result_t
* lookup method.
*/
+typedef isc_result_t (*dns_sdlznewversion_t)(const char *zone,
+ void *driverarg, void *dbdata,
+ void **versionp);
+/*%<
+ * Method prototype. Drivers implementing the SDLZ interface may
+ * supply a newversion method. This method is called to start a
+ * write transaction on a zone and should only be implemented by
+ * writeable backends.
+ * When implemented, the driver should create a new transaction, and
+ * fill *versionp with a pointer to the transaction state. The
+ * closeversion function will be called to close the transaction.
+ */
+
+typedef void (*dns_sdlzcloseversion_t)(const char *zone, isc_boolean_t commit,
+ void *driverarg, void *dbdata,
+ void **versionp);
+/*%<
+ * Method prototype. Drivers implementing the SDLZ interface must
+ * supply a closeversion method if they supply a newversion method.
+ * When implemented, the driver should close the given transaction,
+ * committing changes if 'commit' is ISC_TRUE. If 'commit' is not true
+ * then all changes should be discarded and the database rolled back.
+ * If the call is successful then *versionp should be set to NULL
+ */
+
+typedef isc_result_t (*dns_sdlzconfigure_t)(dns_view_t *view, void *driverarg,
+ void *dbdata);
+/*%<
+ * Method prototype. Drivers implementing the SDLZ interface may
+ * supply a configure method. When supplied, it will be called
+ * immediately after the create method to give the driver a chance
+ * to configure writeable zones
+ */
+
+
+typedef isc_boolean_t (*dns_sdlzssumatch_t)(const char *signer,
+ const char *name,
+ const char *tcpaddr,
+ const char *type,
+ const char *key,
+ isc_uint32_t keydatalen,
+ unsigned char *keydata,
+ void *driverarg,
+ void *dbdata);
+
+/*%<
+ * Method prototype. Drivers implementing the SDLZ interface may
+ * supply a ssumatch method. If supplied, then ssumatch will be
+ * called to authorize any zone updates. The driver should return
+ * ISC_TRUE to allow the update, and ISC_FALSE to deny it. For a DLZ
+ * controlled zone, this is the only access control on updates.
+ */
+
+
+typedef isc_result_t (*dns_sdlzmodrdataset_t)(const char *name,
+ const char *rdatastr,
+ void *driverarg, void *dbdata,
+ void *version);
+/*%<
+ * Method prototype. Drivers implementing the SDLZ interface may
+ * supply addrdataset and subtractrdataset methods. If supplied, then these
+ * will be called when rdatasets are added/subtracted during
+ * updates. The version parameter comes from a call to the sdlz
+ * newversion() method from the driver. The rdataset parameter is a
+ * linearise string representation of the rdataset change. The format
+ * is the same as used by dig when displaying records. The fields are
+ * tab delimited.
+ */
+
+typedef isc_result_t (*dns_sdlzdelrdataset_t)(const char *name,
+ const char *type,
+ void *driverarg, void *dbdata,
+ void *version);
+/*%<
+ * Method prototype. Drivers implementing the SDLZ interface may
+ * supply a delrdataset method. If supplied, then this
+ * function will be called when rdatasets are deleted during
+ * updates. The call should remove all rdatasets of the given type for
+ * the specified name.
+ */
+
typedef struct dns_sdlzmethods {
dns_sdlzcreate_t create;
dns_sdlzdestroy_t destroy;
@@ -206,6 +285,13 @@ typedef struct dns_sdlzmethods {
dns_sdlzauthorityfunc_t authority;
dns_sdlzallnodesfunc_t allnodes;
dns_sdlzallowzonexfr_t allowzonexfr;
+ dns_sdlznewversion_t newversion;
+ dns_sdlzcloseversion_t closeversion;
+ dns_sdlzconfigure_t configure;
+ dns_sdlzssumatch_t ssumatch;
+ dns_sdlzmodrdataset_t addrdataset;
+ dns_sdlzmodrdataset_t subtractrdataset;
+ dns_sdlzdelrdataset_t delrdataset;
} dns_sdlzmethods_t;
isc_result_t
@@ -261,6 +347,14 @@ dns_sdlz_putsoa(dns_sdlzlookup_t *lookup, const char *mname, const char *rname,
*/
+isc_result_t
+dns_sdlz_setdb(dns_dlzdb_t *dlzdatabase, dns_rdataclass_t rdclass,
+ dns_name_t *name, dns_db_t **dbp);
+/*%<
+ * Create the database pointers for a writeable SDLZ zone
+ */
+
+
ISC_LANG_ENDDECLS
#endif /* SDLZ_H */
diff --git a/contrib/bind9/lib/dns/include/dns/secalg.h b/contrib/bind9/lib/dns/include/dns/secalg.h
index 0eb0333..49613d5 100644
--- a/contrib/bind9/lib/dns/include/dns/secalg.h
+++ b/contrib/bind9/lib/dns/include/dns/secalg.h
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004-2007 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004-2007, 2009 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 1999-2001 Internet Software Consortium.
*
* Permission to use, copy, modify, and/or distribute this software for any
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: secalg.h,v 1.19 2007-06-19 23:47:17 tbox Exp $ */
+/* $Id: secalg.h,v 1.21 2009-10-12 23:48:02 tbox Exp $ */
#ifndef DNS_SECALG_H
#define DNS_SECALG_H 1
@@ -66,6 +66,13 @@ dns_secalg_totext(dns_secalg_t secalg, isc_buffer_t *target);
*\li ISC_R_NOSPACE target buffer is too small
*/
+#define DNS_SECALG_FORMATSIZE 20
+void
+dns_secalg_format(dns_secalg_t alg, char *cp, unsigned int size);
+/*%<
+ * Wrapper for dns_secalg_totext(), writing text into 'cp'
+ */
+
ISC_LANG_ENDDECLS
#endif /* DNS_SECALG_H */
diff --git a/contrib/bind9/lib/dns/include/dns/soa.h b/contrib/bind9/lib/dns/include/dns/soa.h
index c1ad706..6ebf61d 100644
--- a/contrib/bind9/lib/dns/include/dns/soa.h
+++ b/contrib/bind9/lib/dns/include/dns/soa.h
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004-2007 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004-2007, 2009 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 2000, 2001 Internet Software Consortium.
*
* Permission to use, copy, modify, and/or distribute this software for any
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: soa.h,v 1.9 2007-06-19 23:47:17 tbox Exp $ */
+/* $Id: soa.h,v 1.12 2009-09-10 01:47:09 each Exp $ */
#ifndef DNS_SOA_H
#define DNS_SOA_H 1
@@ -40,6 +40,28 @@
ISC_LANG_BEGINDECLS
+#define DNS_SOA_BUFFERSIZE ((2 * DNS_NAME_MAXWIRE) + (4 * 5))
+
+isc_result_t
+dns_soa_buildrdata(dns_name_t *origin, dns_name_t *contact,
+ dns_rdataclass_t rdclass,
+ isc_uint32_t serial, isc_uint32_t refresh,
+ isc_uint32_t retry, isc_uint32_t expire,
+ isc_uint32_t minimum, unsigned char *buffer,
+ dns_rdata_t *rdata);
+/*%<
+ * Build the rdata of an SOA record.
+ *
+ * Requires:
+ *\li buffer Points to a temporary buffer of at least
+ * DNS_SOA_BUFFERSIZE bytes.
+ *\li rdata Points to an initialized dns_rdata_t.
+ *
+ * Ensures:
+ * \li *rdata Contains a valid SOA rdata. The 'data' member
+ * refers to 'buffer'.
+ */
+
isc_uint32_t
dns_soa_getserial(dns_rdata_t *rdata);
isc_uint32_t
diff --git a/contrib/bind9/lib/dns/include/dns/ssu.h b/contrib/bind9/lib/dns/include/dns/ssu.h
index 686928b..5d6c178 100644
--- a/contrib/bind9/lib/dns/include/dns/ssu.h
+++ b/contrib/bind9/lib/dns/include/dns/ssu.h
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004-2008 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004-2008, 2010, 2011 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 2000, 2001, 2003 Internet Software Consortium.
*
* Permission to use, copy, modify, and/or distribute this software for any
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: ssu.h,v 1.24 2008-01-18 23:46:58 tbox Exp $ */
+/* $Id: ssu.h,v 1.28 2011-01-06 23:47:00 tbox Exp $ */
#ifndef DNS_SSU_H
#define DNS_SSU_H 1
@@ -25,6 +25,7 @@
#include <isc/lang.h>
#include <dns/types.h>
+#include <dst/dst.h>
ISC_LANG_BEGINDECLS
@@ -40,7 +41,9 @@ ISC_LANG_BEGINDECLS
#define DNS_SSUMATCHTYPE_SUBDOMAINKRB5 9
#define DNS_SSUMATCHTYPE_TCPSELF 10
#define DNS_SSUMATCHTYPE_6TO4SELF 11
-#define DNS_SSUMATCHTYPE_MAX 11 /* max value */
+#define DNS_SSUMATCHTYPE_EXTERNAL 12
+#define DNS_SSUMATCHTYPE_DLZ 13
+#define DNS_SSUMATCHTYPE_MAX 12 /* max value */
isc_result_t
dns_ssutable_create(isc_mem_t *mctx, dns_ssutable_t **table);
@@ -57,6 +60,16 @@ dns_ssutable_create(isc_mem_t *mctx, dns_ssutable_t **table);
*\li ISC_R_NOMEMORY
*/
+isc_result_t
+dns_ssutable_createdlz(isc_mem_t *mctx, dns_ssutable_t **tablep,
+ dns_dlzdb_t *dlzdatabase);
+/*%<
+ * Create an SSU table that contains a dlzdatabase pointer, and a
+ * single rule with matchtype DNS_SSUMATCHTYPE_DLZ. This type of SSU
+ * table is used by writeable DLZ drivers to offload authorization for
+ * updates to the driver.
+ */
+
void
dns_ssutable_attach(dns_ssutable_t *source, dns_ssutable_t **targetp);
/*%<
@@ -120,7 +133,7 @@ dns_ssutable_addrule(dns_ssutable_t *table, isc_boolean_t grant,
isc_boolean_t
dns_ssutable_checkrules(dns_ssutable_t *table, dns_name_t *signer,
dns_name_t *name, isc_netaddr_t *tcpaddr,
- dns_rdatatype_t type);
+ dns_rdatatype_t type, const dst_key_t *key);
/*%<
* Checks that the attempted update of (name, type) is allowed according
* to the rules specified in the simple-secure-update rule table. If
@@ -184,6 +197,16 @@ isc_result_t dns_ssutable_nextrule(dns_ssurule_t *rule,
*\li #ISC_R_NOMORE
*/
+
+/*%<
+ * Check a policy rule via an external application
+ */
+isc_boolean_t
+dns_ssu_external_match(dns_name_t *identity, dns_name_t *signer,
+ dns_name_t *name, isc_netaddr_t *tcpaddr,
+ dns_rdatatype_t type, const dst_key_t *key,
+ isc_mem_t *mctx);
+
ISC_LANG_ENDDECLS
#endif /* DNS_SSU_H */
diff --git a/contrib/bind9/lib/dns/include/dns/stats.h b/contrib/bind9/lib/dns/include/dns/stats.h
index 853c1e9..c19b0c7 100644
--- a/contrib/bind9/lib/dns/include/dns/stats.h
+++ b/contrib/bind9/lib/dns/include/dns/stats.h
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: stats.h,v 1.18.56.2 2009-01-29 23:47:44 tbox Exp $ */
+/* $Id: stats.h,v 1.20 2009-01-27 23:47:54 tbox Exp $ */
#ifndef DNS_STATS_H
#define DNS_STATS_H 1
diff --git a/contrib/bind9/lib/dns/include/dns/tkey.h b/contrib/bind9/lib/dns/include/dns/tkey.h
index cb1fe0e..f9e34f8 100644
--- a/contrib/bind9/lib/dns/include/dns/tkey.h
+++ b/contrib/bind9/lib/dns/include/dns/tkey.h
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004-2007, 2009 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004-2007, 2009-2011 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 1999-2001 Internet Software Consortium.
*
* Permission to use, copy, modify, and/or distribute this software for any
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: tkey.h,v 1.26.332.2 2009-01-18 23:47:41 tbox Exp $ */
+/* $Id: tkey.h,v 1.32 2011-01-08 23:47:01 tbox Exp $ */
#ifndef DNS_TKEY_H
#define DNS_TKEY_H 1
@@ -44,6 +44,7 @@ struct dns_tkeyctx {
gss_cred_id_t gsscred;
isc_mem_t *mctx;
isc_entropy_t *ectx;
+ char *gssapi_keytab;
};
isc_result_t
@@ -123,7 +124,8 @@ dns_tkey_builddhquery(dns_message_t *msg, dst_key_t *key, dns_name_t *name,
isc_result_t
dns_tkey_buildgssquery(dns_message_t *msg, dns_name_t *name, dns_name_t *gname,
isc_buffer_t *intoken, isc_uint32_t lifetime,
- gss_ctx_id_t *context, isc_boolean_t win2k);
+ gss_ctx_id_t *context, isc_boolean_t win2k,
+ isc_mem_t *mctx, char **err_message);
/*%<
* Builds a query containing a TKEY that will generate a GSSAPI context.
* The key is requested to have the specified lifetime (in seconds).
@@ -141,6 +143,7 @@ dns_tkey_buildgssquery(dns_message_t *msg, dns_name_t *name, dns_name_t *gname,
*\li ISC_R_SUCCESS msg was successfully updated to include the
* query to be sent
*\li other an error occurred while building the message
+ *\li *err_message optional error message
*/
@@ -187,7 +190,7 @@ isc_result_t
dns_tkey_processgssresponse(dns_message_t *qmsg, dns_message_t *rmsg,
dns_name_t *gname, gss_ctx_id_t *context,
isc_buffer_t *outtoken, dns_tsigkey_t **outkey,
- dns_tsig_keyring_t *ring);
+ dns_tsig_keyring_t *ring, char **err_message);
/*%<
* XXX
*/
@@ -211,12 +214,11 @@ dns_tkey_processdeleteresponse(dns_message_t *qmsg, dns_message_t *rmsg,
* component of the query or response
*/
-
isc_result_t
dns_tkey_gssnegotiate(dns_message_t *qmsg, dns_message_t *rmsg,
dns_name_t *server, gss_ctx_id_t *context,
dns_tsigkey_t **outkey, dns_tsig_keyring_t *ring,
- isc_boolean_t win2k);
+ isc_boolean_t win2k, char **err_message);
/*
* Client side negotiation of GSS-TSIG. Process the response
diff --git a/contrib/bind9/lib/dns/include/dns/tsec.h b/contrib/bind9/lib/dns/include/dns/tsec.h
new file mode 100644
index 0000000..698634e
--- /dev/null
+++ b/contrib/bind9/lib/dns/include/dns/tsec.h
@@ -0,0 +1,135 @@
+/*
+ * Copyright (C) 2009, 2010 Internet Systems Consortium, Inc. ("ISC")
+ *
+ * Permission to use, copy, modify, and/or 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 ISC DISCLAIMS ALL WARRANTIES WITH
+ * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+ * AND FITNESS. IN NO EVENT SHALL ISC 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.
+ */
+
+/* $Id: tsec.h,v 1.6 2010-12-09 00:54:34 marka Exp $ */
+
+#ifndef DNS_TSEC_H
+#define DNS_TSEC_H 1
+
+/*****
+ ***** Module Info
+ *****/
+
+/*! \file
+ *
+ * \brief
+ * The TSEC (Transaction Security) module is an abstraction layer for managing
+ * DNS transaction mechanisms such as TSIG or SIG(0). A TSEC structure is a
+ * mechanism-independent object containing key information specific to the
+ * mechanism, and is expected to be used as an argument to other modules
+ * that use transaction security in a mechanism-independent manner.
+ *
+ * MP:
+ *\li A TSEC structure is expected to be thread-specific. No inter-thread
+ * synchronization is ensured in multiple access to a single TSEC
+ * structure.
+ *
+ * Resources:
+ *\li TBS
+ *
+ * Security:
+ *\li This module does not handle any low-level data directly, and so no
+ * security issue specific to this module is anticipated.
+ */
+
+#include <dns/types.h>
+
+#include <dst/dst.h>
+
+ISC_LANG_BEGINDECLS
+
+/***
+ *** Types
+ ***/
+
+/*%
+ * Transaction security types.
+ */
+typedef enum {
+ dns_tsectype_none,
+ dns_tsectype_tsig,
+ dns_tsectype_sig0
+} dns_tsectype_t;
+
+isc_result_t
+dns_tsec_create(isc_mem_t *mctx, dns_tsectype_t type, dst_key_t *key,
+ dns_tsec_t **tsecp);
+/*%<
+ * Create a TSEC structure and stores a type-dependent key structure in it.
+ * For a TSIG key (type is dns_tsectype_tsig), dns_tsec_create() creates a
+ * TSIG key structure from '*key' and keeps it in the structure. For other
+ * types, this function simply retains '*key' in the structure. In either
+ * case, the ownership of '*key' is transferred to the TSEC module; the caller
+ * must not modify or destroy it after the call to dns_tsec_create().
+ *
+ * Requires:
+ *
+ *\li 'mctx' is a valid memory context.
+ *
+ *\li 'type' is a valid value of dns_tsectype_t (see above).
+ *
+ *\li 'key' is a valid key.
+ *
+ *\li tsecp != NULL && *tsecp == NULL.
+ *
+ * Returns:
+ *
+ *\li #ISC_R_SUCCESS On success.
+ *
+ *\li Anything else Failure.
+ */
+
+void
+dns_tsec_destroy(dns_tsec_t **tsecp);
+/*%<
+ * Destroy the TSEC structure. The stored key is also detached or destroyed.
+ *
+ * Requires
+ *
+ *\li '*tsecp' is a valid TSEC structure.
+ *
+ * Ensures
+ *
+ *\li *tsecp == NULL.
+ *
+ */
+
+dns_tsectype_t
+dns_tsec_gettype(dns_tsec_t *tsec);
+/*%<
+ * Return the TSEC type of '*tsec'.
+ *
+ * Requires
+ *
+ *\li 'tsec' is a valid TSEC structure.
+ *
+ */
+
+void
+dns_tsec_getkey(dns_tsec_t *tsec, void *keyp);
+/*%<
+ * Return the TSEC key of '*tsec' in '*keyp'.
+ *
+ * Requires
+ *
+ *\li keyp != NULL
+ *
+ * Ensures
+ *
+ *\li *tsecp points to a valid key structure depending on the TSEC type.
+ */
+
+#endif /* DNS_TSEC_H */
diff --git a/contrib/bind9/lib/dns/include/dns/tsig.h b/contrib/bind9/lib/dns/include/dns/tsig.h
index 5161fb3..ef9423b 100644
--- a/contrib/bind9/lib/dns/include/dns/tsig.h
+++ b/contrib/bind9/lib/dns/include/dns/tsig.h
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004-2007, 2010 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004-2007, 2009-2011 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 1999-2002 Internet Software Consortium.
*
* Permission to use, copy, modify, and/or distribute this software for any
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: tsig.h,v 1.51.332.4 2010-12-09 01:12:55 marka Exp $ */
+/* $Id: tsig.h,v 1.59 2011-01-11 23:47:13 tbox Exp $ */
#ifndef DNS_TSIG_H
#define DNS_TSIG_H 1
@@ -25,6 +25,7 @@
#include <isc/lang.h>
#include <isc/refcount.h>
#include <isc/rwlock.h>
+#include <isc/stdio.h>
#include <isc/stdtime.h>
#include <dns/types.h>
@@ -69,6 +70,7 @@ struct dns_tsig_keyring {
unsigned int generated;
unsigned int maxgenerated;
ISC_LIST(dns_tsigkey_t) lru;
+ unsigned int references;
};
struct dns_tsigkey {
@@ -253,9 +255,30 @@ dns_tsigkeyring_create(isc_mem_t *mctx, dns_tsig_keyring_t **ringp);
*\li #ISC_R_NOMEMORY
*/
+isc_result_t
+dns_tsigkeyring_add(dns_tsig_keyring_t *ring, dns_name_t *name,
+ dns_tsigkey_t *tkey);
+/*%<
+ * Place a TSIG key onto a key ring.
+ *
+ * Requires:
+ *\li 'ring', 'name' and 'tkey' are not NULL
+ *
+ * Returns:
+ *\li #ISC_R_SUCCESS
+ *\li Any other value indicates failure.
+ */
+
+
+void
+dns_tsigkeyring_attach(dns_tsig_keyring_t *source, dns_tsig_keyring_t **target);
void
-dns_tsigkeyring_destroy(dns_tsig_keyring_t **ringp);
+dns_tsigkeyring_detach(dns_tsig_keyring_t **ringp);
+
+isc_result_t
+dns_tsigkeyring_dumpanddetach(dns_tsig_keyring_t **ringp, FILE *fp);
+
/*%<
* Destroy a TSIG key ring.
*
@@ -263,6 +286,9 @@ dns_tsigkeyring_destroy(dns_tsig_keyring_t **ringp);
*\li 'ringp' is not NULL
*/
+void
+dns_keyring_restore(dns_tsig_keyring_t *ring, FILE *fp);
+
ISC_LANG_ENDDECLS
#endif /* DNS_TSIG_H */
diff --git a/contrib/bind9/lib/dns/include/dns/types.h b/contrib/bind9/lib/dns/include/dns/types.h
index 4e4c195..dc02c86 100644
--- a/contrib/bind9/lib/dns/include/dns/types.h
+++ b/contrib/bind9/lib/dns/include/dns/types.h
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: types.h,v 1.130.50.7 2010-05-14 23:47:50 tbox Exp $ */
+/* $Id: types.h,v 1.143 2010-12-08 02:46:16 marka Exp $ */
#ifndef DNS_TYPES_H
#define DNS_TYPES_H 1
@@ -44,6 +44,10 @@ typedef struct dns_adbentry dns_adbentry_t;
typedef struct dns_adbfind dns_adbfind_t;
typedef ISC_LIST(dns_adbfind_t) dns_adbfindlist_t;
typedef struct dns_byaddr dns_byaddr_t;
+typedef struct dns_client dns_client_t;
+typedef void dns_clientrestrans_t;
+typedef void dns_clientreqtrans_t;
+typedef void dns_clientupdatetrans_t;
typedef struct dns_cache dns_cache_t;
typedef isc_uint16_t dns_cert_t;
typedef struct dns_compress dns_compress_t;
@@ -63,6 +67,10 @@ typedef struct dns_dispatchevent dns_dispatchevent_t;
typedef struct dns_dispatchlist dns_dispatchlist_t;
typedef struct dns_dispatchmgr dns_dispatchmgr_t;
typedef struct dns_dispentry dns_dispentry_t;
+typedef struct dns_dns64 dns_dns64_t;
+typedef ISC_LIST(dns_dns64_t) dns_dns64list_t;
+typedef struct dns_dnsseckey dns_dnsseckey_t;
+typedef ISC_LIST(dns_dnsseckey_t) dns_dnsseckeylist_t;
typedef struct dns_dumpctx dns_dumpctx_t;
typedef struct dns_fetch dns_fetch_t;
typedef struct dns_fixedname dns_fixedname_t;
@@ -72,6 +80,7 @@ typedef struct dns_iptable dns_iptable_t;
typedef isc_uint32_t dns_iterations_t;
typedef isc_uint16_t dns_keyflags_t;
typedef struct dns_keynode dns_keynode_t;
+typedef ISC_LIST(dns_keynode_t) dns_keynodelist_t;
typedef struct dns_keytable dns_keytable_t;
typedef isc_uint16_t dns_keytag_t;
typedef struct dns_loadctx dns_loadctx_t;
@@ -111,6 +120,7 @@ typedef struct dns_stats dns_stats_t;
typedef isc_uint32_t dns_rdatastatstype_t;
typedef struct dns_tkeyctx dns_tkeyctx_t;
typedef isc_uint16_t dns_trust_t;
+typedef struct dns_tsec dns_tsec_t;
typedef struct dns_tsig_keyring dns_tsig_keyring_t;
typedef struct dns_tsigkey dns_tsigkey_t;
typedef isc_uint32_t dns_ttl_t;
@@ -179,6 +189,12 @@ typedef enum {
dns_masterformat_raw = 2
} dns_masterformat_t;
+typedef enum {
+ dns_v4_aaaa_ok = 0,
+ dns_v4_aaaa_filter = 1,
+ dns_v4_aaaa_break_dnssec = 2
+} dns_v4_aaaa_t;
+
/*
* These are generated by gen.c.
*/
diff --git a/contrib/bind9/lib/dns/include/dns/validator.h b/contrib/bind9/lib/dns/include/dns/validator.h
index fb5b834..5fec135 100644
--- a/contrib/bind9/lib/dns/include/dns/validator.h
+++ b/contrib/bind9/lib/dns/include/dns/validator.h
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: validator.h,v 1.41.48.5 2010-02-25 10:56:41 tbox Exp $ */
+/* $Id: validator.h,v 1.46 2010-02-25 05:08:01 tbox Exp $ */
#ifndef DNS_VALIDATOR_H
#define DNS_VALIDATOR_H 1
diff --git a/contrib/bind9/lib/dns/include/dns/view.h b/contrib/bind9/lib/dns/include/dns/view.h
index ec96d4c..4b24023 100644
--- a/contrib/bind9/lib/dns/include/dns/view.h
+++ b/contrib/bind9/lib/dns/include/dns/view.h
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004-2010 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004-2011 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 1999-2003 Internet Software Consortium.
*
* Permission to use, copy, modify, and/or distribute this software for any
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: view.h,v 1.111.88.6 2010-09-24 08:30:28 tbox Exp $ */
+/* $Id: view.h,v 1.132 2011-01-13 01:59:28 marka Exp $ */
#ifndef DNS_VIEW_H
#define DNS_VIEW_H 1
@@ -73,6 +73,8 @@
#include <dns/acl.h>
#include <dns/fixedname.h>
+#include <dns/rdatastruct.h>
+#include <dns/rpz.h>
#include <dns/types.h>
ISC_LANG_BEGINDECLS
@@ -92,8 +94,13 @@ struct dns_view {
dns_cache_t * cache;
dns_db_t * cachedb;
dns_db_t * hints;
- dns_keytable_t * secroots;
- dns_keytable_t * trustedkeys;
+
+ /*
+ * security roots.
+ * internal use only; access via * dns_view_getsecroots()
+ */
+ dns_keytable_t * secroots_priv;
+
isc_mutex_t lock;
isc_boolean_t frozen;
isc_task_t * task;
@@ -102,6 +109,7 @@ struct dns_view {
isc_event_t reqevent;
isc_stats_t * resstats;
dns_stats_t * resquerystats;
+ isc_boolean_t cacheshared;
/* Configurable data. */
dns_tsig_keyring_t * statickeys;
@@ -129,6 +137,10 @@ struct dns_view {
dns_acl_t * transferacl;
dns_acl_t * updateacl;
dns_acl_t * upfwdacl;
+ dns_acl_t * denyansweracl;
+ dns_rbt_t * answeracl_exclude;
+ dns_rbt_t * denyanswernames;
+ dns_rbt_t * answernames_exclude;
isc_boolean_t requestixfr;
isc_boolean_t provideixfr;
isc_boolean_t requestnsid;
@@ -145,6 +157,11 @@ struct dns_view {
dns_name_t * dlv;
dns_fixedname_t dlv_fixed;
isc_uint16_t maxudp;
+ dns_v4_aaaa_t v4_aaaa;
+ dns_acl_t * v4_aaaa_acl;
+ dns_dns64list_t dns64;
+ unsigned int dns64cnt;
+ ISC_LIST(dns_rpz_zone_t) rpz_zones;
/*
* Configurable data for server use only,
@@ -162,6 +179,17 @@ struct dns_view {
unsigned int attributes;
/* Under owner's locking control. */
ISC_LINK(struct dns_view) link;
+ dns_viewlist_t * viewlist;
+
+ dns_zone_t * managed_keys;
+
+#ifdef BIND9
+ /* File in which to store configuration for newly added zones */
+ char * new_zone_file;
+
+ void * new_zone_config;
+ void (*cfg_destroy)(void **);
+#endif
};
#define DNS_VIEW_MAGIC ISC_MAGIC('V','i','e','w')
@@ -310,8 +338,12 @@ dns_view_createresolver(dns_view_t *view,
void
dns_view_setcache(dns_view_t *view, dns_cache_t *cache);
+void
+dns_view_setcache2(dns_view_t *view, dns_cache_t *cache, isc_boolean_t shared);
/*%<
- * Set the view's cache database.
+ * Set the view's cache database. If 'shared' is true, this means the cache
+ * is created by another view and is shared with that view. dns_view_setcache()
+ * is a backward compatible version equivalent to setcache2(..., ISC_FALSE).
*
* Requires:
*
@@ -346,6 +378,8 @@ dns_view_sethints(dns_view_t *view, dns_db_t *hints);
void
dns_view_setkeyring(dns_view_t *view, dns_tsig_keyring_t *ring);
+void
+dns_view_setdynamickeyring(dns_view_t *view, dns_tsig_keyring_t *ring);
/*%<
* Set the view's static TSIG keys
*
@@ -362,6 +396,15 @@ dns_view_setkeyring(dns_view_t *view, dns_tsig_keyring_t *ring);
*/
void
+dns_view_getdynamickeyring(dns_view_t *view, dns_tsig_keyring_t **ringp);
+/*%<
+ * Return the views dynamic keys.
+ *
+ * \li 'view' is a valid, unfrozen view.
+ * \li 'ringp' != NULL && ringp == NULL.
+ */
+
+void
dns_view_setdstport(dns_view_t *view, in_port_t dstport);
/*%<
* Set the view's destination port. This is the port to
@@ -398,7 +441,7 @@ dns_view_addzone(dns_view_t *view, dns_zone_t *zone);
void
dns_view_freeze(dns_view_t *view);
/*%<
- * Freeze view.
+ * Freeze view. No changes can be made to view configuration while frozen.
*
* Requires:
*
@@ -409,14 +452,44 @@ dns_view_freeze(dns_view_t *view);
*\li 'view' is frozen.
*/
+void
+dns_view_thaw(dns_view_t *view);
+/*%<
+ * Thaw view. This allows zones to be added or removed at runtime. This is
+ * NOT thread-safe; the caller MUST have run isc_task_exclusive() prior to
+ * thawing the view.
+ *
+ * Requires:
+ *
+ *\li 'view' is a valid, frozen view.
+ *
+ * Ensures:
+ *
+ *\li 'view' is no longer frozen.
+ */
isc_result_t
dns_view_find(dns_view_t *view, dns_name_t *name, dns_rdatatype_t type,
isc_stdtime_t now, unsigned int options, isc_boolean_t use_hints,
dns_db_t **dbp, dns_dbnode_t **nodep, dns_name_t *foundname,
dns_rdataset_t *rdataset, dns_rdataset_t *sigrdataset);
+isc_result_t
+dns_view_find2(dns_view_t *view, dns_name_t *name, dns_rdatatype_t type,
+ isc_stdtime_t now, unsigned int options,
+ isc_boolean_t use_hints, isc_boolean_t use_static_stub,
+ dns_db_t **dbp, dns_dbnode_t **nodep, dns_name_t *foundname,
+ dns_rdataset_t *rdataset, dns_rdataset_t *sigrdataset);
/*%<
* Find an rdataset whose owner name is 'name', and whose type is
* 'type'.
+ * In general, this function first searches view's zone and cache DBs for the
+ * best match data against 'name'. If nothing found there, and if 'use_hints'
+ * is ISC_TRUE, the view's hint DB (if configured) is searched.
+ * If the view is configured with a static-stub zone which gives the longest
+ * match for 'name' among the zones, however, the cache DB is not consulted
+ * unless 'use_static_stub' is ISC_FALSE (see below about this argument).
+ *
+ * dns_view_find() is a backward compatible version equivalent to
+ * dns_view_find2() with use_static_stub argument being ISC_FALSE.
*
* Notes:
*
@@ -432,6 +505,23 @@ dns_view_find(dns_view_t *view, dns_name_t *name, dns_rdatatype_t type,
* in the hints database but not the type, the result code will be
* #DNS_R_HINTNXRRSET.
*
+ *\li If 'use_static_stub' is ISC_FALSE and the longest match zone for 'name'
+ * is a static-stub zone, it's ignored and the cache and/or hints will be
+ * searched. In the majority of the cases this argument should be
+ * ISC_FALSE. The only known usage of this argument being ISC_TRUE is
+ * if this search is for a "bailiwick" glue A or AAAA RRset that may
+ * best match a static-stub zone. Consider the following example:
+ * this view is configured with a static-stub zone "example.com",
+ * and an attempt of recursive resolution needs to send a query for the
+ * zone. In this case it's quite likely that the resolver is trying to
+ * find A/AAAA RRs for the apex name "example.com". And, to honor the
+ * static-stub configuration it needs to return the glue RRs in the
+ * static-stub zone even if that exact RRs coming from the authoritative
+ * zone has been cached.
+ * In other general cases, the requested data is better to be
+ * authoritative, either locally configured or retrieved from an external
+ * server, and the data in the static-stub zone should better be ignored.
+ *
*\li 'foundname' must meet the requirements of dns_db_find().
*
*\li If 'sigrdataset' is not NULL, and there is a SIG rdataset which
@@ -728,8 +818,14 @@ dns_view_dumpdbtostream(dns_view_t *view, FILE *fp);
isc_result_t
dns_view_flushcache(dns_view_t *view);
+isc_result_t
+dns_view_flushcache2(dns_view_t *view, isc_boolean_t fixuponly);
/*%<
- * Flush the view's cache (and ADB).
+ * Flush the view's cache (and ADB). If 'fixuponly' is true, it only updates
+ * the internal reference to the cache DB with omitting actual flush operation.
+ * 'fixuponly' is intended to be used for a view that shares a cache with
+ * a different view. dns_view_flushcache() is a backward compatible version
+ * that always sets fixuponly to false.
*
* Requires:
* 'view' is valid.
@@ -878,4 +974,105 @@ dns_view_getresquerystats(dns_view_t *view, dns_stats_t **statsp);
*\li 'statsp' != NULL && '*statsp' != NULL
*/
+isc_boolean_t
+dns_view_iscacheshared(dns_view_t *view);
+/*%<
+ * Check if the view shares the cache created by another view.
+ *
+ * Requires:
+ * \li 'view' is valid.
+ *
+ * Returns:
+ *\li #ISC_TRUE if the cache is shared.
+ *\li #ISC_FALSE otherwise.
+ */
+
+isc_result_t
+dns_view_initsecroots(dns_view_t *view, isc_mem_t *mctx);
+/*%<
+ * Initialize security roots for the view. (Note that secroots is
+ * NULL until this function is called, so any function using
+ * secroots must check its validity first. One way to do this is
+ * use dns_view_getsecroots() and check its return value.)
+ *
+ * Requires:
+ * \li 'view' is valid.
+ * \li 'view->secroots' is NULL.
+ *
+ * Returns:
+ *\li ISC_R_SUCCESS
+ *\li Any other result indicates failure
+ */
+
+isc_result_t
+dns_view_getsecroots(dns_view_t *view, dns_keytable_t **ktp);
+/*%<
+ * Get the security roots for this view. Returns ISC_R_NOTFOUND if
+ * the security roots keytable has not been initialized for the view.
+ *
+ * '*ktp' is attached on success; the caller is responsible for
+ * detaching it with dns_keytable_detach().
+ *
+ * Requires:
+ * \li 'view' is valid.
+ * \li 'ktp' is not NULL and '*ktp' is NULL.
+ *
+ * Returns:
+ *\li ISC_R_SUCCESS
+ *\li ISC_R_NOTFOUND
+ */
+
+isc_result_t
+dns_view_issecuredomain(dns_view_t *view, dns_name_t *name,
+ isc_boolean_t *secure_domain);
+/*%<
+ * Is 'name' at or beneath a trusted key? Put answer in
+ * '*secure_domain'.
+ *
+ * Requires:
+ * \li 'view' is valid.
+ *
+ * Returns:
+ *\li ISC_R_SUCCESS
+ *\li Any other value indicates failure
+ */
+
+void
+dns_view_untrust(dns_view_t *view, dns_name_t *keyname,
+ dns_rdata_dnskey_t *dnskey, isc_mem_t *mctx);
+/*%<
+ * Remove keys that match 'keyname' and 'dnskey' from the views trust
+ * anchors.
+ *
+ * Requires:
+ * \li 'view' is valid.
+ * \li 'keyname' is valid.
+ * \li 'mctx' is valid.
+ * \li 'dnskey' is valid.
+ */
+
+void
+dns_view_setnewzones(dns_view_t *view, isc_boolean_t allow, void *cfgctx,
+ void (*cfg_destroy)(void **));
+/*%<
+ * Set whether or not to allow zones to be created or deleted at runtime.
+ *
+ * If 'allow' is ISC_TRUE, determines the filename into which new zone
+ * configuration will be written. Preserves the configuration context
+ * (a pointer to which is passed in 'cfgctx') for use when parsing new
+ * zone configuration. 'cfg_destroy' points to a callback routine to
+ * destroy the configuration context when the view is destroyed. (This
+ * roundabout method is used in order to avoid libdns having a dependency
+ * on libisccfg and libbind9.)
+ *
+ * If 'allow' is ISC_FALSE, removes any existing references to
+ * configuration context and frees any memory.
+ *
+ * Requires:
+ * \li 'view' is valid.
+ */
+
+void
+dns_view_restorekeyring(dns_view_t *view);
+
#endif /* DNS_VIEW_H */
diff --git a/contrib/bind9/lib/dns/include/dns/xfrin.h b/contrib/bind9/lib/dns/include/dns/xfrin.h
index b957e25..58910d2 100644
--- a/contrib/bind9/lib/dns/include/dns/xfrin.h
+++ b/contrib/bind9/lib/dns/include/dns/xfrin.h
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: xfrin.h,v 1.28.332.2 2009-01-18 23:47:41 tbox Exp $ */
+/* $Id: xfrin.h,v 1.30 2009-01-17 23:47:43 tbox Exp $ */
#ifndef DNS_XFRIN_H
#define DNS_XFRIN_H 1
diff --git a/contrib/bind9/lib/dns/include/dns/zone.h b/contrib/bind9/lib/dns/include/dns/zone.h
index 96cb998..67756d9 100644
--- a/contrib/bind9/lib/dns/include/dns/zone.h
+++ b/contrib/bind9/lib/dns/include/dns/zone.h
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: zone.h,v 1.160.50.8 2010-12-14 23:46:09 tbox Exp $ */
+/* $Id: zone.h,v 1.182 2010-12-18 01:56:22 each Exp $ */
#ifndef DNS_ZONE_H
#define DNS_ZONE_H 1
@@ -40,7 +40,10 @@ typedef enum {
dns_zone_none,
dns_zone_master,
dns_zone_slave,
- dns_zone_stub
+ dns_zone_stub,
+ dns_zone_staticstub,
+ dns_zone_key,
+ dns_zone_dlz
} dns_zonetype_t;
#define DNS_ZONEOPT_SERVERS 0x00000001U /*%< perform server checks */
@@ -70,6 +73,10 @@ typedef enum {
#define DNS_ZONEOPT_TRYTCPREFRESH 0x01000000U /*%< try tcp refresh on udp failure */
#define DNS_ZONEOPT_NOTIFYTOSOA 0x02000000U /*%< Notify the SOA MNAME */
#define DNS_ZONEOPT_NSEC3TESTZONE 0x04000000U /*%< nsec3-test-zone */
+#define DNS_ZONEOPT_SECURETOINSECURE 0x08000000U /*%< dnssec-secure-to-insecure */
+#define DNS_ZONEOPT_DNSKEYKSKONLY 0x10000000U /*%< dnssec-dnskey-kskonly */
+#define DNS_ZONEOPT_CHECKDUPRR 0x20000000U /*%< check-dup-records */
+#define DNS_ZONEOPT_CHECKDUPRRFAIL 0x40000000U /*%< fatal check-dup-records failures */
#ifndef NOMINUM_PUBLIC
/*
@@ -78,6 +85,14 @@ typedef enum {
#define DNS_ZONEOPT_NOTIFYFORWARD 0x80000000U /* forward notify to master */
#endif /* NOMINUM_PUBLIC */
+/*
+ * Zone key maintenance options
+ */
+#define DNS_ZONEKEY_ALLOW 0x00000001U /*%< fetch keys on command */
+#define DNS_ZONEKEY_MAINTAIN 0x00000002U /*%< publish/sign on schedule */
+#define DNS_ZONEKEY_CREATE 0x00000004U /*%< make keys when needed */
+#define DNS_ZONEKEY_FULLSIGN 0x00000008U /*%< roll to new keys immediately */
+
#ifndef DNS_ZONE_MINREFRESH
#define DNS_ZONE_MINREFRESH 300 /*%< 5 minutes */
#endif
@@ -367,6 +382,22 @@ dns_zone_getdb(dns_zone_t *zone, dns_db_t **dbp);
*\li DNS_R_NOTLOADED
*/
+void
+dns_zone_setdb(dns_zone_t *zone, dns_db_t *db);
+/*%<
+ * Sets the zone database to 'db'.
+ *
+ * This function is expected to be used to configure a zone with a
+ * database which is not loaded from a file or zone transfer.
+ * It can be used for a general purpose zone, but right now its use
+ * is limited to static-stub zones to avoid possible undiscovered
+ * problems in the general cases.
+ *
+ * Require:
+ *\li 'zone' to be a valid zone of static-stub.
+ *\li zone doesn't have a database.
+ */
+
isc_result_t
dns_zone_setdbtype(dns_zone_t *zone,
unsigned int dbargc, const char * const *dbargv);
@@ -568,6 +599,25 @@ dns_zone_getoptions(dns_zone_t *zone);
*/
void
+dns_zone_setkeyopt(dns_zone_t *zone, unsigned int option, isc_boolean_t value);
+/*%<
+ * Set key options on ('value' == ISC_TRUE) or off ('value' ==
+ * #ISC_FALSE).
+ *
+ * Require:
+ *\li 'zone' to be a valid zone.
+ */
+
+unsigned int
+dns_zone_getkeyopts(dns_zone_t *zone);
+/*%<
+ * Returns the current zone key options.
+ *
+ * Require:
+ *\li 'zone' to be a valid zone.
+ */
+
+void
dns_zone_setminrefreshtime(dns_zone_t *zone, isc_uint32_t val);
/*%<
* Set the minimum refresh time.
@@ -1747,6 +1797,61 @@ dns_zone_getprivatetype(dns_zone_t *zone);
* will not be permanent.
*/
+void
+dns_zone_rekey(dns_zone_t *zone, isc_boolean_t fullsign);
+/*%<
+ * Update the zone's DNSKEY set from the key repository.
+ *
+ * If 'fullsign' is true, trigger an immediate full signing of
+ * the zone with the new key. Otherwise, if there are no keys or
+ * if the new keys are for algorithms that have already signed the
+ * zone, then the zone can be re-signed incrementally.
+ */
+
+isc_result_t
+dns_zone_nscheck(dns_zone_t *zone, dns_db_t *db, dns_dbversion_t *version,
+ unsigned int *errors);
+/*%
+ * Check if the name servers for the zone are sane (have address, don't
+ * refer to CNAMEs/DNAMEs. The number of constiancy errors detected in
+ * returned in '*errors'
+ *
+ * Requires:
+ * \li 'zone' to be valid.
+ * \li 'db' to be valid.
+ * \li 'version' to be valid or NULL.
+ * \li 'errors' to be non NULL.
+ *
+ * Returns:
+ * ISC_R_SUCCESS if there were no errors examining the zone contents.
+ */
+
+void
+dns_zone_setadded(dns_zone_t *zone, isc_boolean_t added);
+/*%
+ * Sets the value of zone->added, which should be ISC_TRUE for
+ * zones that were originally added by "rndc addzone".
+ *
+ * Requires:
+ * \li 'zone' to be valid.
+ */
+
+isc_boolean_t
+dns_zone_getadded(dns_zone_t *zone);
+/*%
+ * Returns ISC_TRUE if the zone was originally added at runtime
+ * using "rndc addzone".
+ *
+ * Requires:
+ * \li 'zone' to be valid.
+ */
+
+isc_result_t
+dns_zone_dlzpostload(dns_zone_t *zone, dns_db_t *db);
+/*%
+ * Load the origin names for a writeable DLZ database.
+ */
+
ISC_LANG_ENDDECLS
#endif /* DNS_ZONE_H */
diff --git a/contrib/bind9/lib/dns/include/dst/dst.h b/contrib/bind9/lib/dns/include/dst/dst.h
index 1a30d2b..3c999f6 100644
--- a/contrib/bind9/lib/dns/include/dst/dst.h
+++ b/contrib/bind9/lib/dns/include/dst/dst.h
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004-2008, 2010 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004-2011 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 2000-2002 Internet Software Consortium.
*
* Permission to use, copy, modify, and/or distribute this software for any
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: dst.h,v 1.12.50.3 2010-12-09 01:12:55 marka Exp $ */
+/* $Id: dst.h,v 1.31 2011-01-11 23:47:14 tbox Exp $ */
#ifndef DST_DST_H
#define DST_DST_H 1
@@ -23,8 +23,11 @@
/*! \file dst/dst.h */
#include <isc/lang.h>
+#include <isc/stdtime.h>
#include <dns/types.h>
+#include <dns/name.h>
+#include <dns/secalg.h>
#include <dst/gssapi.h>
@@ -55,6 +58,7 @@ typedef struct dst_context dst_context_t;
#define DST_ALG_NSEC3RSASHA1 7
#define DST_ALG_RSASHA256 8
#define DST_ALG_RSASHA512 10
+#define DST_ALG_ECCGOST 12
#define DST_ALG_HMACMD5 157
#define DST_ALG_GSSAPI 160
#define DST_ALG_HMACSHA1 161 /* XXXMPA */
@@ -80,12 +84,55 @@ typedef struct dst_context dst_context_t;
#define DST_TYPE_PRIVATE 0x2000000
#define DST_TYPE_PUBLIC 0x4000000
+/* Key timing metadata definitions */
+#define DST_TIME_CREATED 0
+#define DST_TIME_PUBLISH 1
+#define DST_TIME_ACTIVATE 2
+#define DST_TIME_REVOKE 3
+#define DST_TIME_INACTIVE 4
+#define DST_TIME_DELETE 5
+#define DST_TIME_DSPUBLISH 6
+#define DST_MAX_TIMES 6
+
+/* Numeric metadata definitions */
+#define DST_NUM_PREDECESSOR 0
+#define DST_NUM_SUCCESSOR 1
+#define DST_NUM_MAXTTL 2
+#define DST_NUM_ROLLPERIOD 3
+#define DST_MAX_NUMERIC 3
+
+/*
+ * Current format version number of the private key parser.
+ *
+ * When parsing a key file with the same major number but a higher minor
+ * number, the key parser will ignore any fields it does not recognize.
+ * Thus, DST_MINOR_VERSION should be incremented whenever new
+ * fields are added to the private key file (such as new metadata).
+ *
+ * When rewriting these keys, those fields will be dropped, and the
+ * format version set back to the current one..
+ *
+ * When a key is seen with a higher major number, the key parser will
+ * reject it as invalid. Thus, DST_MAJOR_VERSION should be incremented
+ * and DST_MINOR_VERSION set to zero whenever there is a format change
+ * which is not backward compatible to previous versions of the dst_key
+ * parser, such as change in the syntax of an existing field, the removal
+ * of a currently mandatory field, or a new field added which would
+ * alter the functioning of the key if it were absent.
+ */
+#define DST_MAJOR_VERSION 1
+#define DST_MINOR_VERSION 3
+
/***
*** Functions
***/
isc_result_t
dst_lib_init(isc_mem_t *mctx, isc_entropy_t *ectx, unsigned int eflags);
+
+isc_result_t
+dst_lib_init2(isc_mem_t *mctx, isc_entropy_t *ectx,
+ const char *engine, unsigned int eflags);
/*%<
* Initializes the DST subsystem.
*
@@ -96,6 +143,7 @@ dst_lib_init(isc_mem_t *mctx, isc_entropy_t *ectx, unsigned int eflags);
* Returns:
* \li ISC_R_SUCCESS
* \li ISC_R_NOMEMORY
+ * \li DST_R_NOENGINE
*
* Ensures:
* \li DST is properly initialized.
@@ -244,13 +292,17 @@ dst_key_fromfile(dns_name_t *name, dns_keytag_t id, unsigned int alg, int type,
*/
isc_result_t
-dst_key_fromnamedfile(const char *filename, int type, isc_mem_t *mctx,
- dst_key_t **keyp);
+dst_key_fromnamedfile(const char *filename, const char *dirname,
+ int type, isc_mem_t *mctx, dst_key_t **keyp);
/*%<
* Reads a key from permanent storage. The key can either be a public or
* key, and is specified by filename. If a private key is specified, the
* public key must also be present.
*
+ * If 'dirname' is not NULL, and 'filename' is a relative path,
+ * then the file is looked up relative to the given directory.
+ * If 'filename' is an absolute path, 'dirname' is ignored.
+ *
* Requires:
* \li "filename" is not NULL
* \li "type" is DST_TYPE_PUBLIC, DST_TYPE_PRIVATE, or the bitwise union
@@ -419,7 +471,7 @@ dst_key_getgssctx(const dst_key_t *key);
isc_result_t
dst_key_fromgssapi(dns_name_t *name, gss_ctx_id_t gssctx, isc_mem_t *mctx,
- dst_key_t **keyp);
+ dst_key_t **keyp, isc_region_t *intoken);
/*%<
* Converts a GSSAPI opaque context id into a DST key.
*
@@ -450,6 +502,14 @@ dst_key_generate(dns_name_t *name, unsigned int alg,
unsigned int flags, unsigned int protocol,
dns_rdataclass_t rdclass,
isc_mem_t *mctx, dst_key_t **keyp);
+
+isc_result_t
+dst_key_generate2(dns_name_t *name, unsigned int alg,
+ unsigned int bits, unsigned int param,
+ unsigned int flags, unsigned int protocol,
+ dns_rdataclass_t rdclass,
+ isc_mem_t *mctx, dst_key_t **keyp,
+ void (*callback)(int));
/*%<
* Generate a DST key (or keypair) with the supplied parameters. The
* interpretation of the "param" field depends on the algorithm:
@@ -482,7 +542,31 @@ dst_key_generate(dns_name_t *name, unsigned int alg,
isc_boolean_t
dst_key_compare(const dst_key_t *key1, const dst_key_t *key2);
/*%<
- * Compares two DST keys.
+ * Compares two DST keys. Returns true if they match, false otherwise.
+ *
+ * Keys ARE NOT considered to match if one of them is the revoked version
+ * of the other.
+ *
+ * Requires:
+ *\li "key1" is a valid key.
+ *\li "key2" is a valid key.
+ *
+ * Returns:
+ *\li ISC_TRUE
+ * \li ISC_FALSE
+ */
+
+isc_boolean_t
+dst_key_pubcompare(const dst_key_t *key1, const dst_key_t *key2,
+ isc_boolean_t match_revoked_key);
+/*%<
+ * Compares only the public portions of two DST keys. Returns true
+ * if they match, false otherwise. This allows us, for example, to
+ * determine whether a public key found in a zone matches up with a
+ * key pair found on disk.
+ *
+ * If match_revoked_key is TRUE, then keys ARE considered to match if one
+ * of them is the revoked version of the other. Otherwise, they are not.
*
* Requires:
*\li "key1" is a valid key.
@@ -521,10 +605,12 @@ dst_key_attach(dst_key_t *source, dst_key_t **target);
void
dst_key_free(dst_key_t **keyp);
/*%<
- * Release all memory associated with the key.
+ * Decrement the key's reference counter and, when it reaches zero,
+ * release all memory associated with the key.
*
* Requires:
*\li "keyp" is not NULL and "*keyp" is a valid key.
+ *\li reference counter greater than zero.
*
* Ensures:
*\li All memory associated with "*keyp" will be freed.
@@ -633,7 +719,7 @@ dst_region_computeid(const isc_region_t *source, unsigned int alg);
isc_uint16_t
dst_key_getbits(const dst_key_t *key);
-/*
+/*%<
* Get the number of digest bits required (0 == MAX).
*
* Requires:
@@ -642,13 +728,150 @@ dst_key_getbits(const dst_key_t *key);
void
dst_key_setbits(dst_key_t *key, isc_uint16_t bits);
-/*
+/*%<
* Set the number of digest bits required (0 == MAX).
*
* Requires:
* "key" is a valid key.
*/
+isc_result_t
+dst_key_setflags(dst_key_t *key, isc_uint32_t flags);
+/*
+ * Set the key flags, and recompute the key ID.
+ *
+ * Requires:
+ * "key" is a valid key.
+ */
+
+isc_result_t
+dst_key_getnum(const dst_key_t *key, int type, isc_uint32_t *valuep);
+/*%<
+ * Get a member of the numeric metadata array and place it in '*valuep'.
+ *
+ * Requires:
+ * "key" is a valid key.
+ * "type" is no larger than DST_MAX_NUMERIC
+ * "timep" is not null.
+ */
+
+void
+dst_key_setnum(dst_key_t *key, int type, isc_uint32_t value);
+/*%<
+ * Set a member of the numeric metadata array.
+ *
+ * Requires:
+ * "key" is a valid key.
+ * "type" is no larger than DST_MAX_NUMERIC
+ */
+
+void
+dst_key_unsetnum(dst_key_t *key, int type);
+/*%<
+ * Flag a member of the numeric metadata array as "not set".
+ *
+ * Requires:
+ * "key" is a valid key.
+ * "type" is no larger than DST_MAX_NUMERIC
+ */
+
+isc_result_t
+dst_key_gettime(const dst_key_t *key, int type, isc_stdtime_t *timep);
+/*%<
+ * Get a member of the timing metadata array and place it in '*timep'.
+ *
+ * Requires:
+ * "key" is a valid key.
+ * "type" is no larger than DST_MAX_TIMES
+ * "timep" is not null.
+ */
+
+void
+dst_key_settime(dst_key_t *key, int type, isc_stdtime_t when);
+/*%<
+ * Set a member of the timing metadata array.
+ *
+ * Requires:
+ * "key" is a valid key.
+ * "type" is no larger than DST_MAX_TIMES
+ */
+
+void
+dst_key_unsettime(dst_key_t *key, int type);
+/*%<
+ * Flag a member of the timing metadata array as "not set".
+ *
+ * Requires:
+ * "key" is a valid key.
+ * "type" is no larger than DST_MAX_TIMES
+ */
+
+isc_result_t
+dst_key_getprivateformat(const dst_key_t *key, int *majorp, int *minorp);
+/*%<
+ * Get the private key format version number. (If the key does not have
+ * a private key associated with it, the version will be 0.0.) The major
+ * version number is placed in '*majorp', and the minor version number in
+ * '*minorp'.
+ *
+ * Requires:
+ * "key" is a valid key.
+ * "majorp" is not NULL.
+ * "minorp" is not NULL.
+ */
+
+void
+dst_key_setprivateformat(dst_key_t *key, int major, int minor);
+/*%<
+ * Set the private key format version number.
+ *
+ * Requires:
+ * "key" is a valid key.
+ */
+
+#define DST_KEY_FORMATSIZE (DNS_NAME_FORMATSIZE + DNS_SECALG_FORMATSIZE + 7)
+
+void
+dst_key_format(const dst_key_t *key, char *cp, unsigned int size);
+/*%<
+ * Write the uniquely identifying information about the key (name,
+ * algorithm, key ID) into a string 'cp' of size 'size'.
+ */
+
+
+isc_buffer_t *
+dst_key_tkeytoken(const dst_key_t *key);
+/*%<
+ * Return the token from the TKEY request, if any. If this key was
+ * not negotiated via TKEY, return NULL.
+ */
+
+
+isc_result_t
+dst_key_dump(dst_key_t *key, isc_mem_t *mctx, char **buffer, int *length);
+/*%<
+ * Allocate 'buffer' and dump the key into it in base64 format. The buffer
+ * is not NUL terminated. The length of the buffer is returned in *length.
+ *
+ * 'buffer' needs to be freed using isc_mem_put(mctx, buffer, length);
+ *
+ * Requires:
+ * 'buffer' to be non NULL and *buffer to be NULL.
+ * 'length' to be non NULL and *length to be zero.
+ *
+ * Returns:
+ * ISC_R_SUCCESS
+ * ISC_R_NOMEMORY
+ * ISC_R_NOTIMPLEMENTED
+ * others.
+ */
+
+isc_result_t
+dst_key_restore(dns_name_t *name, unsigned int alg, unsigned int flags,
+ unsigned int protocol, dns_rdataclass_t rdclass,
+ isc_mem_t *mctx, const char *keystr, dst_key_t **keyp);
+
+
ISC_LANG_ENDDECLS
#endif /* DST_DST_H */
diff --git a/contrib/bind9/lib/dns/include/dst/gssapi.h b/contrib/bind9/lib/dns/include/dst/gssapi.h
index 0a468d3..189e6b5 100644
--- a/contrib/bind9/lib/dns/include/dst/gssapi.h
+++ b/contrib/bind9/lib/dns/include/dst/gssapi.h
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004-2007, 2009 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004-2007, 2009-2011 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 2000, 2001 Internet Software Consortium.
*
* Permission to use, copy, modify, and/or distribute this software for any
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: gssapi.h,v 1.9.332.2 2009-01-18 23:47:41 tbox Exp $ */
+/* $Id: gssapi.h,v 1.16 2011-01-08 23:47:01 tbox Exp $ */
#ifndef DST_GSSAPI_H
#define DST_GSSAPI_H 1
@@ -34,8 +34,12 @@
* MSVC does not like macros in #include lines.
*/
#include <gssapi/gssapi.h>
+#include <gssapi/gssapi_krb5.h>
#else
#include ISC_PLATFORM_GSSAPIHEADER
+#ifdef ISC_PLATFORM_GSSAPI_KRB5_HEADER
+#include ISC_PLATFORM_GSSAPI_KRB5_HEADER
+#endif
#endif
#ifndef GSS_SPNEGO_MECHANISM
#define GSS_SPNEGO_MECHANISM ((void*)0)
@@ -90,7 +94,8 @@ dst_gssapi_releasecred(gss_cred_id_t *cred);
isc_result_t
dst_gssapi_initctx(dns_name_t *name, isc_buffer_t *intoken,
- isc_buffer_t *outtoken, gss_ctx_id_t *gssctx);
+ isc_buffer_t *outtoken, gss_ctx_id_t *gssctx,
+ isc_mem_t *mctx, char **err_message);
/*
* Initiates a GSS context.
*
@@ -108,10 +113,12 @@ dst_gssapi_initctx(dns_name_t *name, isc_buffer_t *intoken,
* ISC_R_SUCCESS msg was successfully updated to include the
* query to be sent
* other an error occurred while building the message
+ * *err_message optional error message
*/
isc_result_t
dst_gssapi_acceptctx(gss_cred_id_t cred,
+ const char *gssapi_keytab,
isc_region_t *intoken, isc_buffer_t **outtoken,
gss_ctx_id_t *context, dns_name_t *principal,
isc_mem_t *mctx);
diff --git a/contrib/bind9/lib/dns/iptable.c b/contrib/bind9/lib/dns/iptable.c
index 071f9a6..7c334dd 100644
--- a/contrib/bind9/lib/dns/iptable.c
+++ b/contrib/bind9/lib/dns/iptable.c
@@ -14,7 +14,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: iptable.c,v 1.12.44.3 2009-02-18 23:47:12 tbox Exp $ */
+/* $Id: iptable.c,v 1.15 2009-02-18 23:47:48 tbox Exp $ */
#include <config.h>
diff --git a/contrib/bind9/lib/dns/journal.c b/contrib/bind9/lib/dns/journal.c
index 520083e..a6d630e 100644
--- a/contrib/bind9/lib/dns/journal.c
+++ b/contrib/bind9/lib/dns/journal.c
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: journal.c,v 1.103.48.8 2010-11-17 23:45:45 tbox Exp $ */
+/* $Id: journal.c,v 1.112 2010-11-17 23:47:08 tbox Exp $ */
#include <config.h>
@@ -562,11 +562,9 @@ journal_open(isc_mem_t *mctx, const char *filename, isc_boolean_t write,
if (result == ISC_R_FILENOTFOUND) {
if (create) {
- isc_log_write(JOURNAL_COMMON_LOGARGS,
- ISC_LOG_INFO,
+ isc_log_write(JOURNAL_COMMON_LOGARGS, ISC_LOG_DEBUG(1),
"journal file %s does not exist, "
- "creating it",
- j->filename);
+ "creating it", j->filename);
CHECK(journal_file_create(mctx, filename));
/*
* Retry.
diff --git a/contrib/bind9/lib/dns/keydata.c b/contrib/bind9/lib/dns/keydata.c
new file mode 100644
index 0000000..c2f82c8
--- /dev/null
+++ b/contrib/bind9/lib/dns/keydata.c
@@ -0,0 +1,89 @@
+/*
+ * Copyright (C) 2009 Internet Systems Consortium, Inc. ("ISC")
+ *
+ * Permission to use, copy, modify, and/or 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 ISC DISCLAIMS ALL WARRANTIES WITH
+ * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+ * AND FITNESS. IN NO EVENT SHALL ISC 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.
+ */
+
+/* $Id: keydata.c,v 1.3 2009-07-01 23:47:36 tbox Exp $ */
+
+/*! \file */
+
+#include <config.h>
+
+
+#include <isc/buffer.h>
+#include <isc/mem.h>
+#include <isc/string.h>
+#include <isc/util.h>
+
+#include <dns/rdata.h>
+#include <dns/rdatastruct.h>
+#include <dns/keydata.h>
+
+isc_result_t
+dns_keydata_todnskey(dns_rdata_keydata_t *keydata,
+ dns_rdata_dnskey_t *dnskey, isc_mem_t *mctx)
+{
+ REQUIRE(keydata != NULL && dnskey != NULL);
+
+ dnskey->common.rdtype = dns_rdatatype_dnskey;
+ dnskey->common.rdclass = keydata->common.rdclass;
+ dnskey->mctx = mctx;
+ dnskey->flags = keydata->flags;
+ dnskey->protocol = keydata->protocol;
+ dnskey->algorithm = keydata->algorithm;
+
+ dnskey->datalen = keydata->datalen;
+
+ if (mctx == NULL)
+ dnskey->data = keydata->data;
+ else {
+ dnskey->data = isc_mem_allocate(mctx, dnskey->datalen);
+ if (dnskey->data == NULL)
+ return (ISC_R_NOMEMORY);
+ memcpy(dnskey->data, keydata->data, dnskey->datalen);
+ }
+
+ return (ISC_R_SUCCESS);
+}
+
+isc_result_t
+dns_keydata_fromdnskey(dns_rdata_keydata_t *keydata,
+ dns_rdata_dnskey_t *dnskey,
+ isc_uint32_t refresh, isc_uint32_t addhd,
+ isc_uint32_t removehd, isc_mem_t *mctx)
+{
+ REQUIRE(keydata != NULL && dnskey != NULL);
+
+ keydata->common.rdtype = dns_rdatatype_keydata;
+ keydata->common.rdclass = dnskey->common.rdclass;
+ keydata->mctx = mctx;
+ keydata->refresh = refresh;
+ keydata->addhd = addhd;
+ keydata->removehd = removehd;
+ keydata->flags = dnskey->flags;
+ keydata->protocol = dnskey->protocol;
+ keydata->algorithm = dnskey->algorithm;
+
+ keydata->datalen = dnskey->datalen;
+ if (mctx == NULL)
+ keydata->data = dnskey->data;
+ else {
+ keydata->data = isc_mem_allocate(mctx, keydata->datalen);
+ if (keydata->data == NULL)
+ return (ISC_R_NOMEMORY);
+ memcpy(keydata->data, dnskey->data, keydata->datalen);
+ }
+
+ return (ISC_R_SUCCESS);
+}
diff --git a/contrib/bind9/lib/dns/keytable.c b/contrib/bind9/lib/dns/keytable.c
index 874868d..3edc3d6 100644
--- a/contrib/bind9/lib/dns/keytable.c
+++ b/contrib/bind9/lib/dns/keytable.c
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004, 2005, 2007 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004, 2005, 2007, 2009, 2010 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 2000, 2001 Internet Software Consortium.
*
* Permission to use, copy, modify, and/or distribute this software for any
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: keytable.c,v 1.34 2007-06-19 23:47:16 tbox Exp $ */
+/* $Id: keytable.c,v 1.41 2010-06-25 23:46:51 tbox Exp $ */
/*! \file */
@@ -31,41 +31,12 @@
#include <dns/rbt.h>
#include <dns/result.h>
-struct dns_keytable {
- /* Unlocked. */
- unsigned int magic;
- isc_mem_t *mctx;
- isc_mutex_t lock;
- isc_rwlock_t rwlock;
- /* Locked by lock. */
- isc_uint32_t active_nodes;
- /* Locked by rwlock. */
- isc_uint32_t references;
- dns_rbt_t *table;
-};
-
-#define KEYTABLE_MAGIC ISC_MAGIC('K', 'T', 'b', 'l')
-#define VALID_KEYTABLE(kt) ISC_MAGIC_VALID(kt, KEYTABLE_MAGIC)
-
-struct dns_keynode {
- unsigned int magic;
- dst_key_t * key;
- struct dns_keynode * next;
-};
-
-#define KEYNODE_MAGIC ISC_MAGIC('K', 'N', 'o', 'd')
-#define VALID_KEYNODE(kn) ISC_MAGIC_VALID(kn, KEYNODE_MAGIC)
-
static void
free_keynode(void *node, void *arg) {
dns_keynode_t *keynode = node;
isc_mem_t *mctx = arg;
- REQUIRE(VALID_KEYNODE(keynode));
- dst_key_free(&keynode->key);
- if (keynode->next != NULL)
- free_keynode(keynode->next, mctx);
- isc_mem_put(mctx, keynode, sizeof(dns_keynode_t));
+ dns_keynode_detachall(mctx, &keynode);
}
isc_result_t
@@ -116,7 +87,6 @@ dns_keytable_create(isc_mem_t *mctx, dns_keytable_t **keytablep) {
return (result);
}
-
void
dns_keytable_attach(dns_keytable_t *source, dns_keytable_t **targetp) {
@@ -173,50 +143,224 @@ dns_keytable_detach(dns_keytable_t **keytablep) {
*keytablep = NULL;
}
-isc_result_t
-dns_keytable_add(dns_keytable_t *keytable, dst_key_t **keyp) {
+static isc_result_t
+insert(dns_keytable_t *keytable, isc_boolean_t managed,
+ dns_name_t *keyname, dst_key_t **keyp)
+{
isc_result_t result;
- dns_keynode_t *knode;
+ dns_keynode_t *knode = NULL;
dns_rbtnode_t *node;
- dns_name_t *keyname;
-
- /*
- * Add '*keyp' to 'keytable'.
- */
+ REQUIRE(keyp == NULL || *keyp != NULL);
REQUIRE(VALID_KEYTABLE(keytable));
- REQUIRE(keyp != NULL);
- keyname = dst_key_name(*keyp);
+ result = dns_keynode_create(keytable->mctx, &knode);
+ if (result != ISC_R_SUCCESS)
+ return (result);
- knode = isc_mem_get(keytable->mctx, sizeof(*knode));
- if (knode == NULL)
- return (ISC_R_NOMEMORY);
+ knode->managed = managed;
RWLOCK(&keytable->rwlock, isc_rwlocktype_write);
node = NULL;
result = dns_rbt_addnode(keytable->table, keyname, &node);
- if (result == ISC_R_SUCCESS || result == ISC_R_EXISTS) {
- knode->magic = KEYNODE_MAGIC;
- knode->key = *keyp;
- knode->next = node->data;
+ if (keyp != NULL) {
+ if (result == ISC_R_EXISTS) {
+ /* Key already in table? */
+ dns_keynode_t *k;
+ for (k = node->data; k != NULL; k = k->next) {
+ if (k->key == NULL) {
+ k->key = *keyp;
+ break;
+ }
+ if (dst_key_compare(k->key, *keyp) == ISC_TRUE)
+ break;
+ }
+
+ if (k == NULL)
+ result = ISC_R_SUCCESS;
+ else
+ dst_key_free(keyp);
+ }
+
+ if (result == ISC_R_SUCCESS) {
+ knode->key = *keyp;
+ knode->next = node->data;
+ *keyp = NULL;
+ }
+ }
+
+ if (result == ISC_R_SUCCESS) {
node->data = knode;
- *keyp = NULL;
knode = NULL;
- result = ISC_R_SUCCESS;
}
+ /* Key was already there? That's the same as a success */
+ if (result == ISC_R_EXISTS)
+ result = ISC_R_SUCCESS;
+
RWUNLOCK(&keytable->rwlock, isc_rwlocktype_write);
if (knode != NULL)
- isc_mem_put(keytable->mctx, knode, sizeof(*knode));
+ dns_keynode_detach(keytable->mctx, &knode);
+
+ return (result);
+}
+
+isc_result_t
+dns_keytable_add(dns_keytable_t *keytable, isc_boolean_t managed,
+ dst_key_t **keyp)
+{
+ REQUIRE(keyp != NULL && *keyp != NULL);
+ return (insert(keytable, managed, dst_key_name(*keyp), keyp));
+}
+
+isc_result_t
+dns_keytable_marksecure(dns_keytable_t *keytable, dns_name_t *name) {
+ return (insert(keytable, ISC_TRUE, name, NULL));
+}
+
+isc_result_t
+dns_keytable_delete(dns_keytable_t *keytable, dns_name_t *keyname) {
+ isc_result_t result;
+ dns_rbtnode_t *node = NULL;
+
+ REQUIRE(VALID_KEYTABLE(keytable));
+ REQUIRE(keyname != NULL);
+
+ RWLOCK(&keytable->rwlock, isc_rwlocktype_write);
+ result = dns_rbt_findnode(keytable->table, keyname, NULL, &node, NULL,
+ DNS_RBTFIND_NOOPTIONS, NULL, NULL);
+ if (result == ISC_R_SUCCESS) {
+ if (node->data != NULL)
+ result = dns_rbt_deletenode(keytable->table,
+ node, ISC_FALSE);
+ else
+ result = ISC_R_NOTFOUND;
+ } else if (result == DNS_R_PARTIALMATCH)
+ result = ISC_R_NOTFOUND;
+ RWUNLOCK(&keytable->rwlock, isc_rwlocktype_write);
return (result);
}
isc_result_t
+dns_keytable_deletekeynode(dns_keytable_t *keytable, dst_key_t *dstkey) {
+ isc_result_t result;
+ dns_name_t *keyname;
+ dns_rbtnode_t *node = NULL;
+ dns_keynode_t *knode = NULL, **kprev = NULL;
+
+ REQUIRE(VALID_KEYTABLE(keytable));
+ REQUIRE(dstkey != NULL);
+
+ keyname = dst_key_name(dstkey);
+
+ RWLOCK(&keytable->rwlock, isc_rwlocktype_write);
+ result = dns_rbt_findnode(keytable->table, keyname, NULL, &node, NULL,
+ DNS_RBTFIND_NOOPTIONS, NULL, NULL);
+
+ if (result == DNS_R_PARTIALMATCH)
+ result = ISC_R_NOTFOUND;
+ if (result != ISC_R_SUCCESS)
+ goto finish;
+
+ if (node->data == NULL) {
+ result = ISC_R_NOTFOUND;
+ goto finish;
+ }
+
+ knode = node->data;
+ if (knode->next == NULL &&
+ (knode->key == NULL ||
+ dst_key_compare(knode->key, dstkey) == ISC_TRUE)) {
+ result = dns_rbt_deletenode(keytable->table, node, ISC_FALSE);
+ goto finish;
+ }
+
+ kprev = (dns_keynode_t **) &node->data;
+ while (knode != NULL) {
+ if (dst_key_compare(knode->key, dstkey) == ISC_TRUE)
+ break;
+ kprev = &knode->next;
+ knode = knode->next;
+ }
+
+ if (knode != NULL) {
+ if (knode->key != NULL)
+ dst_key_free(&knode->key);
+ /*
+ * This is equivalent to:
+ * dns_keynode_attach(knode->next, &tmp);
+ * dns_keynode_detach(kprev);
+ * dns_keynode_attach(tmp, &kprev);
+ * dns_keynode_detach(&tmp);
+ */
+ *kprev = knode->next;
+ knode->next = NULL;
+ dns_keynode_detach(keytable->mctx, &knode);
+ } else
+ result = DNS_R_PARTIALMATCH;
+ finish:
+ RWUNLOCK(&keytable->rwlock, isc_rwlocktype_write);
+ return (result);
+}
+
+isc_result_t
+dns_keytable_find(dns_keytable_t *keytable, dns_name_t *keyname,
+ dns_keynode_t **keynodep)
+{
+ isc_result_t result;
+ dns_rbtnode_t *node = NULL;
+
+ REQUIRE(VALID_KEYTABLE(keytable));
+ REQUIRE(keyname != NULL);
+ REQUIRE(keynodep != NULL && *keynodep == NULL);
+
+ RWLOCK(&keytable->rwlock, isc_rwlocktype_read);
+ result = dns_rbt_findnode(keytable->table, keyname, NULL, &node, NULL,
+ DNS_RBTFIND_NOOPTIONS, NULL, NULL);
+ if (result == ISC_R_SUCCESS) {
+ if (node->data != NULL) {
+ LOCK(&keytable->lock);
+ keytable->active_nodes++;
+ UNLOCK(&keytable->lock);
+ dns_keynode_attach(node->data, keynodep);
+ } else
+ result = ISC_R_NOTFOUND;
+ } else if (result == DNS_R_PARTIALMATCH)
+ result = ISC_R_NOTFOUND;
+ RWUNLOCK(&keytable->rwlock, isc_rwlocktype_read);
+
+ return (result);
+}
+
+isc_result_t
+dns_keytable_nextkeynode(dns_keytable_t *keytable, dns_keynode_t *keynode,
+ dns_keynode_t **nextnodep)
+{
+ /*
+ * Return the next key after 'keynode', regardless of
+ * properties.
+ */
+
+ REQUIRE(VALID_KEYTABLE(keytable));
+ REQUIRE(VALID_KEYNODE(keynode));
+ REQUIRE(nextnodep != NULL && *nextnodep == NULL);
+
+ if (keynode->next == NULL)
+ return (ISC_R_NOTFOUND);
+
+ dns_keynode_attach(keynode->next, nextnodep);
+ LOCK(&keytable->lock);
+ keytable->active_nodes++;
+ UNLOCK(&keytable->lock);
+
+ return (ISC_R_SUCCESS);
+}
+
+isc_result_t
dns_keytable_findkeynode(dns_keytable_t *keytable, dns_name_t *name,
dns_secalg_t algorithm, dns_keytag_t tag,
dns_keynode_t **keynodep)
@@ -250,6 +394,10 @@ dns_keytable_findkeynode(dns_keytable_t *keytable, dns_name_t *name,
if (result == ISC_R_SUCCESS) {
INSIST(data != NULL);
for (knode = data; knode != NULL; knode = knode->next) {
+ if (knode->key == NULL) {
+ knode = NULL;
+ break;
+ }
if (algorithm == dst_key_alg(knode->key)
&& tag == dst_key_id(knode->key))
break;
@@ -258,7 +406,7 @@ dns_keytable_findkeynode(dns_keytable_t *keytable, dns_name_t *name,
LOCK(&keytable->lock);
keytable->active_nodes++;
UNLOCK(&keytable->lock);
- *keynodep = knode;
+ dns_keynode_attach(knode, keynodep);
} else
result = DNS_R_PARTIALMATCH;
} else if (result == DNS_R_PARTIALMATCH)
@@ -286,6 +434,10 @@ dns_keytable_findnextkeynode(dns_keytable_t *keytable, dns_keynode_t *keynode,
REQUIRE(nextnodep != NULL && *nextnodep == NULL);
for (knode = keynode->next; knode != NULL; knode = knode->next) {
+ if (knode->key == NULL) {
+ knode = NULL;
+ break;
+ }
if (dst_key_alg(keynode->key) == dst_key_alg(knode->key) &&
dst_key_id(keynode->key) == dst_key_id(knode->key))
break;
@@ -295,7 +447,7 @@ dns_keytable_findnextkeynode(dns_keytable_t *keytable, dns_keynode_t *keynode,
keytable->active_nodes++;
UNLOCK(&keytable->lock);
result = ISC_R_SUCCESS;
- *nextnodep = knode;
+ dns_keynode_attach(knode, nextnodep);
} else
result = ISC_R_NOTFOUND;
@@ -331,6 +483,25 @@ dns_keytable_finddeepestmatch(dns_keytable_t *keytable, dns_name_t *name,
}
void
+dns_keytable_attachkeynode(dns_keytable_t *keytable, dns_keynode_t *source,
+ dns_keynode_t **target)
+{
+ /*
+ * Give back a keynode found via dns_keytable_findkeynode().
+ */
+
+ REQUIRE(VALID_KEYTABLE(keytable));
+ REQUIRE(VALID_KEYNODE(source));
+ REQUIRE(target != NULL && *target == NULL);
+
+ LOCK(&keytable->lock);
+ keytable->active_nodes++;
+ UNLOCK(&keytable->lock);
+
+ dns_keynode_attach(source, target);
+}
+
+void
dns_keytable_detachkeynode(dns_keytable_t *keytable, dns_keynode_t **keynodep)
{
/*
@@ -345,7 +516,7 @@ dns_keytable_detachkeynode(dns_keytable_t *keytable, dns_keynode_t **keynodep)
keytable->active_nodes--;
UNLOCK(&keytable->lock);
- *keynodep = NULL;
+ dns_keynode_detach(keytable->mctx, keynodep);
}
isc_result_t
@@ -382,6 +553,44 @@ dns_keytable_issecuredomain(dns_keytable_t *keytable, dns_name_t *name,
return (result);
}
+isc_result_t
+dns_keytable_dump(dns_keytable_t *keytable, FILE *fp)
+{
+ isc_result_t result;
+ dns_keynode_t *knode;
+ dns_rbtnode_t *node;
+ dns_rbtnodechain_t chain;
+
+ REQUIRE(VALID_KEYTABLE(keytable));
+
+ RWLOCK(&keytable->rwlock, isc_rwlocktype_read);
+ dns_rbtnodechain_init(&chain, keytable->mctx);
+ result = dns_rbtnodechain_first(&chain, keytable->table, NULL, NULL);
+ if (result != ISC_R_SUCCESS && result != DNS_R_NEWORIGIN)
+ goto cleanup;
+ for (;;) {
+ char pbuf[DST_KEY_FORMATSIZE];
+
+ dns_rbtnodechain_current(&chain, NULL, NULL, &node);
+ for (knode = node->data; knode != NULL; knode = knode->next) {
+ dst_key_format(knode->key, pbuf, sizeof(pbuf));
+ fprintf(fp, "%s ; %s\n", pbuf,
+ knode->managed ? "managed" : "trusted");
+ }
+ result = dns_rbtnodechain_next(&chain, NULL, NULL);
+ if (result != ISC_R_SUCCESS && result != DNS_R_NEWORIGIN) {
+ if (result == ISC_R_NOMORE)
+ result = ISC_R_SUCCESS;
+ break;
+ }
+ }
+
+ cleanup:
+ dns_rbtnodechain_invalidate(&chain);
+ RWUNLOCK(&keytable->rwlock, isc_rwlocktype_read);
+ return (result);
+}
+
dst_key_t *
dns_keynode_key(dns_keynode_t *keynode) {
@@ -393,3 +602,71 @@ dns_keynode_key(dns_keynode_t *keynode) {
return (keynode->key);
}
+
+isc_boolean_t
+dns_keynode_managed(dns_keynode_t *keynode) {
+ /*
+ * Is this a managed key?
+ */
+ REQUIRE(VALID_KEYNODE(keynode));
+
+ return (keynode->managed);
+}
+
+isc_result_t
+dns_keynode_create(isc_mem_t *mctx, dns_keynode_t **target) {
+ isc_result_t result;
+ dns_keynode_t *knode = NULL;
+
+ REQUIRE(target != NULL && *target == NULL);
+
+ knode = isc_mem_get(mctx, sizeof(dns_keynode_t));
+ if (knode == NULL)
+ return (ISC_R_NOMEMORY);
+
+ knode->magic = KEYNODE_MAGIC;
+ knode->managed = ISC_FALSE;
+ knode->key = NULL;
+ knode->next = NULL;
+
+ result = isc_refcount_init(&knode->refcount, 1);
+ if (result != ISC_R_SUCCESS)
+ return (result);
+
+ *target = knode;
+ return (ISC_R_SUCCESS);
+}
+
+void
+dns_keynode_attach(dns_keynode_t *source, dns_keynode_t **target) {
+ REQUIRE(VALID_KEYNODE(source));
+ isc_refcount_increment(&source->refcount, NULL);
+ *target = source;
+}
+
+void
+dns_keynode_detach(isc_mem_t *mctx, dns_keynode_t **keynode) {
+ unsigned int refs;
+ dns_keynode_t *node = *keynode;
+ REQUIRE(VALID_KEYNODE(node));
+ isc_refcount_decrement(&node->refcount, &refs);
+ if (refs == 0) {
+ if (node->key != NULL)
+ dst_key_free(&node->key);
+ isc_refcount_destroy(&node->refcount);
+ isc_mem_put(mctx, node, sizeof(dns_keynode_t));
+ }
+ *keynode = NULL;
+}
+
+void
+dns_keynode_detachall(isc_mem_t *mctx, dns_keynode_t **keynode) {
+ dns_keynode_t *next = NULL, *node = *keynode;
+ REQUIRE(VALID_KEYNODE(node));
+ while (node != NULL) {
+ next = node->next;
+ dns_keynode_detach(mctx, &node);
+ node = next;
+ }
+ *keynode = NULL;
+}
diff --git a/contrib/bind9/lib/dns/lib.c b/contrib/bind9/lib/dns/lib.c
index 761be56..6953c88 100644
--- a/contrib/bind9/lib/dns/lib.c
+++ b/contrib/bind9/lib/dns/lib.c
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004, 2005, 2007 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004, 2005, 2007, 2009 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 1999-2001 Internet Software Consortium.
*
* Permission to use, copy, modify, and/or distribute this software for any
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: lib.c,v 1.16 2007-06-19 23:47:16 tbox Exp $ */
+/* $Id: lib.c,v 1.19 2009-09-03 00:12:23 each Exp $ */
/*! \file */
@@ -23,11 +23,20 @@
#include <stddef.h>
-#include <isc/once.h>
+#include <isc/hash.h>
+#include <isc/mem.h>
#include <isc/msgcat.h>
+#include <isc/mutex.h>
+#include <isc/once.h>
#include <isc/util.h>
+#include <dns/db.h>
+#include <dns/ecdb.h>
#include <dns/lib.h>
+#include <dns/result.h>
+
+#include <dst/dst.h>
+
/***
*** Globals
@@ -63,3 +72,97 @@ dns_lib_initmsgcat(void) {
RUNTIME_CHECK(isc_once_do(&msgcat_once, open_msgcat) == ISC_R_SUCCESS);
}
+
+static isc_once_t init_once = ISC_ONCE_INIT;
+static isc_mem_t *dns_g_mctx = NULL;
+#ifndef BIND9
+static dns_dbimplementation_t *dbimp = NULL;
+#endif
+static isc_boolean_t initialize_done = ISC_FALSE;
+static isc_mutex_t reflock;
+static unsigned int references = 0;
+
+static void
+initialize(void) {
+ isc_result_t result;
+
+ REQUIRE(initialize_done == ISC_FALSE);
+
+ result = isc_mem_create(0, 0, &dns_g_mctx);
+ if (result != ISC_R_SUCCESS)
+ return;
+ dns_result_register();
+#ifndef BIND9
+ result = dns_ecdb_register(dns_g_mctx, &dbimp);
+ if (result != ISC_R_SUCCESS)
+ goto cleanup_mctx;
+#endif
+ result = isc_hash_create(dns_g_mctx, NULL, DNS_NAME_MAXWIRE);
+ if (result != ISC_R_SUCCESS)
+ goto cleanup_db;
+
+ result = dst_lib_init(dns_g_mctx, NULL, 0);
+ if (result != ISC_R_SUCCESS)
+ goto cleanup_hash;
+
+ result = isc_mutex_init(&reflock);
+ if (result != ISC_R_SUCCESS)
+ goto cleanup_dst;
+
+ initialize_done = ISC_TRUE;
+ return;
+
+ cleanup_dst:
+ dst_lib_destroy();
+ cleanup_hash:
+ isc_hash_destroy();
+ cleanup_db:
+#ifndef BIND9
+ dns_ecdb_unregister(&dbimp);
+ cleanup_mctx:
+#endif
+ isc_mem_detach(&dns_g_mctx);
+}
+
+isc_result_t
+dns_lib_init(void) {
+ isc_result_t result;
+
+ /*
+ * Since this routine is expected to be used by a normal application,
+ * it should be better to return an error, instead of an emergency
+ * abort, on any failure.
+ */
+ result = isc_once_do(&init_once, initialize);
+ if (result != ISC_R_SUCCESS)
+ return (result);
+
+ if (!initialize_done)
+ return (ISC_R_FAILURE);
+
+ LOCK(&reflock);
+ references++;
+ UNLOCK(&reflock);
+
+ return (ISC_R_SUCCESS);
+}
+
+void
+dns_lib_shutdown(void) {
+ isc_boolean_t cleanup_ok = ISC_FALSE;
+
+ LOCK(&reflock);
+ if (--references == 0)
+ cleanup_ok = ISC_TRUE;
+ UNLOCK(&reflock);
+
+ if (!cleanup_ok)
+ return;
+
+ dst_lib_destroy();
+ isc_hash_destroy();
+#ifndef BIND9
+ dns_ecdb_unregister(&dbimp);
+#endif
+ isc_mem_detach(&dns_g_mctx);
+}
diff --git a/contrib/bind9/lib/dns/log.c b/contrib/bind9/lib/dns/log.c
index 5b3ee32..9de5976 100644
--- a/contrib/bind9/lib/dns/log.c
+++ b/contrib/bind9/lib/dns/log.c
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004-2007 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004-2007, 2009 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 1999-2001, 2003 Internet Software Consortium.
*
* Permission to use, copy, modify, and/or distribute this software for any
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: log.c,v 1.45 2007-06-18 23:47:40 tbox Exp $ */
+/* $Id: log.c,v 1.47 2009-12-18 23:49:03 tbox Exp $ */
/*! \file */
@@ -79,6 +79,7 @@ LIBDNS_EXTERNAL_DATA isc_logmodule_t dns_modules[] = {
{ "dns/hints", 0 },
{ "dns/acache", 0 },
{ "dns/dlz", 0 },
+ { "dns/dnssec", 0 },
{ NULL, 0 }
};
diff --git a/contrib/bind9/lib/dns/master.c b/contrib/bind9/lib/dns/master.c
index 9c6d3b8..e90a74c 100644
--- a/contrib/bind9/lib/dns/master.c
+++ b/contrib/bind9/lib/dns/master.c
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: master.c,v 1.171.120.2 2009-01-18 23:47:40 tbox Exp $ */
+/* $Id: master.c,v 1.178 2009-09-01 00:22:26 jinmei Exp $ */
/*! \file */
@@ -85,7 +85,11 @@
*/
#define TOKENSIZ (8*1024)
-#define DNS_MASTER_BUFSZ 2048
+/*%
+ * Buffers sizes for $GENERATE.
+ */
+#define DNS_MASTER_LHS 2048
+#define DNS_MASTER_RHS MINTSIZ
typedef ISC_LIST(dns_rdatalist_t) rdatalist_head_t;
@@ -614,6 +618,57 @@ loadctx_create(dns_masterformat_t format, isc_mem_t *mctx,
return (result);
}
+static const char *hex = "0123456789abcdef0123456789ABCDEF";
+
+/*%
+ * Convert value into a nibble sequence from least significant to most
+ * significant nibble. Zero fill upper most significant nibbles if
+ * required to make the width.
+ *
+ * Returns the number of characters that should have been written without
+ * counting the terminating NUL.
+ */
+static unsigned int
+nibbles(char *numbuf, size_t length, unsigned int width, char mode, int value) {
+ unsigned int count = 0;
+
+ /*
+ * This reserve space for the NUL string terminator.
+ */
+ if (length > 0U) {
+ *numbuf = '\0';
+ length--;
+ }
+ do {
+ char val = hex[(value & 0x0f) + ((mode == 'n') ? 0 : 16)];
+ value >>= 4;
+ if (length > 0U) {
+ *numbuf++ = val;
+ *numbuf = '\0';
+ length--;
+ }
+ if (width > 0)
+ width--;
+ count++;
+ /*
+ * If width is non zero then we need to add a label seperator.
+ * If value is non zero then we need to add another label and
+ * that requires a label seperator.
+ */
+ if (width > 0 || value != 0) {
+ if (length > 0U) {
+ *numbuf++ = '.';
+ *numbuf = '\0';
+ length--;
+ }
+ if (width > 0)
+ width--;
+ count++;
+ }
+ } while (value != 0 || width > 0);
+ return (count);
+}
+
static isc_result_t
genname(char *name, int it, char *buffer, size_t length) {
char fmt[sizeof("%04000000000d")];
@@ -624,6 +679,7 @@ genname(char *name, int it, char *buffer, size_t length) {
isc_textregion_t r;
unsigned int n;
unsigned int width;
+ isc_boolean_t nibblemode;
r.base = buffer;
r.length = length;
@@ -638,10 +694,11 @@ genname(char *name, int it, char *buffer, size_t length) {
isc_textregion_consume(&r, 1);
continue;
}
+ nibblemode = ISC_FALSE;
strcpy(fmt, "%d");
/* Get format specifier. */
if (*name == '{' ) {
- n = sscanf(name, "{%d,%u,%1[doxX]}",
+ n = sscanf(name, "{%d,%u,%1[doxXnN]}",
&delta, &width, mode);
switch (n) {
case 1:
@@ -651,6 +708,8 @@ genname(char *name, int it, char *buffer, size_t length) {
"%%0%ud", width);
break;
case 3:
+ if (mode[0] == 'n' || mode[0] == 'N')
+ nibblemode = ISC_TRUE;
n = snprintf(fmt, sizeof(fmt),
"%%0%u%c", width, mode[0]);
break;
@@ -663,7 +722,12 @@ genname(char *name, int it, char *buffer, size_t length) {
while (*name != '\0' && *name++ != '}')
continue;
}
- n = snprintf(numbuf, sizeof(numbuf), fmt, it + delta);
+ if (nibblemode)
+ n = nibbles(numbuf, sizeof(numbuf), width,
+ mode[0], it + delta);
+ else
+ n = snprintf(numbuf, sizeof(numbuf), fmt,
+ it + delta);
if (n >= sizeof(numbuf))
return (ISC_R_NOSPACE);
cp = numbuf;
@@ -746,8 +810,8 @@ generate(dns_loadctx_t *lctx, char *range, char *lhs, char *gtype, char *rhs,
ISC_LIST_INIT(head);
target_mem = isc_mem_get(lctx->mctx, target_size);
- rhsbuf = isc_mem_get(lctx->mctx, DNS_MASTER_BUFSZ);
- lhsbuf = isc_mem_get(lctx->mctx, DNS_MASTER_BUFSZ);
+ rhsbuf = isc_mem_get(lctx->mctx, DNS_MASTER_RHS);
+ lhsbuf = isc_mem_get(lctx->mctx, DNS_MASTER_LHS);
if (target_mem == NULL || rhsbuf == NULL || lhsbuf == NULL) {
result = ISC_R_NOMEMORY;
goto error_cleanup;
@@ -778,35 +842,13 @@ generate(dns_loadctx_t *lctx, char *range, char *lhs, char *gtype, char *rhs,
goto insist_cleanup;
}
- switch (type) {
- case dns_rdatatype_ns:
- case dns_rdatatype_ptr:
- case dns_rdatatype_cname:
- case dns_rdatatype_dname:
- break;
-
- case dns_rdatatype_a:
- case dns_rdatatype_aaaa:
- if (lctx->zclass == dns_rdataclass_in ||
- lctx->zclass == dns_rdataclass_ch ||
- lctx->zclass == dns_rdataclass_hs)
- break;
- /* FALLTHROUGH */
- default:
- (*callbacks->error)(callbacks,
- "%s: %s:%lu: unsupported type '%s'",
- "$GENERATE", source, line, gtype);
- result = ISC_R_NOTIMPLEMENTED;
- goto error_cleanup;
- }
-
ISC_LIST_INIT(rdatalist.rdata);
ISC_LINK_INIT(&rdatalist, link);
for (i = start; i <= stop; i += step) {
- result = genname(lhs, i, lhsbuf, DNS_MASTER_BUFSZ);
+ result = genname(lhs, i, lhsbuf, DNS_MASTER_LHS);
if (result != ISC_R_SUCCESS)
goto error_cleanup;
- result = genname(rhs, i, rhsbuf, DNS_MASTER_BUFSZ);
+ result = genname(rhs, i, rhsbuf, DNS_MASTER_RHS);
if (result != ISC_R_SUCCESS)
goto error_cleanup;
@@ -820,6 +862,7 @@ generate(dns_loadctx_t *lctx, char *range, char *lhs, char *gtype, char *rhs,
if ((lctx->options & DNS_MASTER_ZONE) != 0 &&
(lctx->options & DNS_MASTER_SLAVE) == 0 &&
+ (lctx->options & DNS_MASTER_KEY) == 0 &&
!dns_name_issubdomain(owner, lctx->top))
{
char namebuf[DNS_NAME_FORMATSIZE];
@@ -880,9 +923,9 @@ generate(dns_loadctx_t *lctx, char *range, char *lhs, char *gtype, char *rhs,
if (target_mem != NULL)
isc_mem_put(lctx->mctx, target_mem, target_size);
if (lhsbuf != NULL)
- isc_mem_put(lctx->mctx, lhsbuf, DNS_MASTER_BUFSZ);
+ isc_mem_put(lctx->mctx, lhsbuf, DNS_MASTER_LHS);
if (rhsbuf != NULL)
- isc_mem_put(lctx->mctx, rhsbuf, DNS_MASTER_BUFSZ);
+ isc_mem_put(lctx->mctx, rhsbuf, DNS_MASTER_RHS);
return (result);
}
@@ -1270,7 +1313,8 @@ load_text(dns_loadctx_t *lctx) {
goto log_and_cleanup;
}
/* RHS */
- GETTOKEN(lctx->lex, 0, &token, ISC_FALSE);
+ GETTOKEN(lctx->lex, ISC_LEXOPT_QSTRING,
+ &token, ISC_FALSE);
rhs = isc_mem_strdup(mctx, DNS_AS_STR(token));
if (rhs == NULL) {
result = ISC_R_NOMEMORY;
@@ -1338,7 +1382,7 @@ load_text(dns_loadctx_t *lctx) {
isc_buffer_setactive(&buffer,
token.value.as_region.length);
result = dns_name_fromtext(new_name, &buffer,
- ictx->origin, ISC_FALSE, NULL);
+ ictx->origin, 0, NULL);
if (MANYERRS(lctx, result)) {
SETRESULT(lctx, result);
LOGIT(result);
@@ -1459,6 +1503,7 @@ load_text(dns_loadctx_t *lctx) {
}
if ((lctx->options & DNS_MASTER_ZONE) != 0 &&
(lctx->options & DNS_MASTER_SLAVE) == 0 &&
+ (lctx->options & DNS_MASTER_KEY) == 0 &&
!dns_name_issubdomain(new_name, lctx->top))
{
char namebuf[DNS_NAME_FORMATSIZE];
diff --git a/contrib/bind9/lib/dns/masterdump.c b/contrib/bind9/lib/dns/masterdump.c
index 34c984b..e2adf9b 100644
--- a/contrib/bind9/lib/dns/masterdump.c
+++ b/contrib/bind9/lib/dns/masterdump.c
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004-2009 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004-2009, 2011 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 1999-2003 Internet Software Consortium.
*
* Permission to use, copy, modify, and/or distribute this software for any
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: masterdump.c,v 1.94.50.3.18.1 2011-05-27 00:19:19 each Exp $ */
+/* $Id: masterdump.c,v 1.99.328.3 2011-06-21 20:15:47 each Exp $ */
/*! \file */
@@ -42,6 +42,7 @@
#include <dns/log.h>
#include <dns/master.h>
#include <dns/masterdump.h>
+#include <dns/ncache.h>
#include <dns/rdata.h>
#include <dns/rdataclass.h>
#include <dns/rdataset.h>
@@ -60,6 +61,11 @@
return (_r); \
} while (0)
+#define CHECK(x) do { \
+ if ((x) != ISC_R_SUCCESS) \
+ goto cleanup; \
+ } while (0)
+
struct dns_master_style {
unsigned int flags; /* DNS_STYLEFLAG_* */
unsigned int ttl_column;
@@ -156,6 +162,7 @@ static char spaces[N_SPACES+1] = " ";
#define N_TABS 10
static char tabs[N_TABS+1] = "\t\t\t\t\t\t\t\t\t\t";
+#ifdef BIND9
struct dns_dumpctx {
unsigned int magic;
isc_mem_t *mctx;
@@ -183,6 +190,7 @@ struct dns_dumpctx {
dns_totext_ctx_t *ctx,
isc_buffer_t *buffer, FILE *f);
};
+#endif /* BIND9 */
#define NXDOMAIN(x) (((x)->attributes & DNS_RDATASETATTR_NXDOMAIN) != 0)
@@ -336,6 +344,52 @@ str_totext(const char *source, isc_buffer_t *target) {
return (ISC_R_SUCCESS);
}
+static isc_result_t
+ncache_summary(dns_rdataset_t *rdataset, isc_boolean_t omit_final_dot,
+ isc_buffer_t *target)
+{
+ isc_result_t result = ISC_R_SUCCESS;
+ dns_rdataset_t rds;
+ dns_name_t name;
+
+ dns_rdataset_init(&rds);
+ dns_name_init(&name, NULL);
+
+ do {
+ dns_ncache_current(rdataset, &name, &rds);
+ for (result = dns_rdataset_first(&rds);
+ result == ISC_R_SUCCESS;
+ result = dns_rdataset_next(&rds)) {
+ CHECK(str_totext("; ", target));
+ CHECK(dns_name_totext(&name, omit_final_dot, target));
+ CHECK(str_totext(" ", target));
+ CHECK(dns_rdatatype_totext(rds.type, target));
+ if (rds.type == dns_rdatatype_rrsig) {
+ CHECK(str_totext(" ", target));
+ CHECK(dns_rdatatype_totext(rds.covers, target));
+ CHECK(str_totext(" ...\n", target));
+ } else {
+ dns_rdata_t rdata = DNS_RDATA_INIT;
+ dns_rdataset_current(&rds, &rdata);
+ CHECK(str_totext(" ", target));
+ CHECK(dns_rdata_tofmttext(&rdata, dns_rootname,
+ 0, 0, " ", target));
+ CHECK(str_totext("\n", target));
+ }
+ }
+ dns_rdataset_disassociate(&rds);
+ result = dns_rdataset_next(rdataset);
+ } while (result == ISC_R_SUCCESS);
+
+ if (result == ISC_R_NOMORE)
+ result = ISC_R_SUCCESS;
+ cleanup:
+ if (dns_rdataset_isassociated(&rds))
+ dns_rdataset_disassociate(&rds);
+
+ return (result);
+}
+
/*
* Convert 'rdataset' to master file text format according to 'ctx',
* storing the result in 'target'. If 'owner_name' is NULL, it
@@ -356,6 +410,7 @@ rdataset_totext(dns_rdataset_t *rdataset,
isc_uint32_t current_ttl;
isc_boolean_t current_ttl_valid;
dns_rdatatype_t type;
+ unsigned int type_start;
REQUIRE(DNS_RDATASET_VALID(rdataset));
@@ -437,33 +492,37 @@ rdataset_totext(dns_rdataset_t *rdataset,
* Type.
*/
- if (rdataset->type == 0) {
+ if ((rdataset->attributes & DNS_RDATASETATTR_NEGATIVE) != 0) {
type = rdataset->covers;
} else {
type = rdataset->type;
}
- {
- unsigned int type_start;
- INDENT_TO(type_column);
- type_start = target->used;
- if (rdataset->type == 0)
- RETERR(str_totext("\\-", target));
- result = dns_rdatatype_totext(type, target);
- if (result != ISC_R_SUCCESS)
- return (result);
- column += (target->used - type_start);
- }
+ INDENT_TO(type_column);
+ type_start = target->used;
+ if ((rdataset->attributes & DNS_RDATASETATTR_NEGATIVE) != 0)
+ RETERR(str_totext("\\-", target));
+ result = dns_rdatatype_totext(type, target);
+ if (result != ISC_R_SUCCESS)
+ return (result);
+ column += (target->used - type_start);
/*
* Rdata.
*/
INDENT_TO(rdata_column);
- if (rdataset->type == 0) {
+ if ((rdataset->attributes & DNS_RDATASETATTR_NEGATIVE) != 0) {
if (NXDOMAIN(rdataset))
RETERR(str_totext(";-$NXDOMAIN\n", target));
else
RETERR(str_totext(";-$NXRRSET\n", target));
+ /*
+ * Print a summary of the cached records which make
+ * up the negative response.
+ */
+ RETERR(ncache_summary(rdataset, omit_final_dot,
+ target));
+ break;
} else {
dns_rdata_t rdata = DNS_RDATA_INIT;
isc_region_t r;
@@ -639,6 +698,7 @@ dns_master_questiontotext(dns_name_t *owner_name,
ISC_FALSE, target));
}
+#ifdef BIND9
/*
* Print an rdataset. 'buffer' is a scratch buffer, which must have been
* dynamically allocated by the caller. It must be large enough to
@@ -814,7 +874,7 @@ dump_rdatasets_text(isc_mem_t *mctx, dns_name_t *name,
if (ctx->style.flags & DNS_STYLEFLAG_TRUST) {
fprintf(f, "; %s\n", dns_trust_totext(rds->trust));
}
- if (rds->type == 0 &&
+ if (((rds->attributes & DNS_RDATASETATTR_NEGATIVE) != 0) &&
(ctx->style.flags & DNS_STYLEFLAG_NCACHE) == 0) {
/* Omit negative cache entries */
} else {
@@ -979,7 +1039,7 @@ dump_rdatasets_raw(isc_mem_t *mctx, dns_name_t *name,
dns_rdataset_init(&rdataset);
dns_rdatasetiter_current(rdsiter, &rdataset);
- if (rdataset.type == 0 &&
+ if (((rdataset.attributes & DNS_RDATASETATTR_NEGATIVE) != 0) &&
(ctx->style.flags & DNS_STYLEFLAG_NCACHE) == 0) {
/* Omit negative cache entries */
} else {
@@ -1694,6 +1754,7 @@ dns_master_dumpnode(isc_mem_t *mctx, dns_db_t *db, dns_dbversion_t *version,
return (result);
}
+#endif /* BIND9 */
isc_result_t
dns_master_stylecreate(dns_master_style_t **stylep, unsigned int flags,
diff --git a/contrib/bind9/lib/dns/message.c b/contrib/bind9/lib/dns/message.c
index 4a01178e..b58c139 100644
--- a/contrib/bind9/lib/dns/message.c
+++ b/contrib/bind9/lib/dns/message.c
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004-2010 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004-2011 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 1999-2003 Internet Software Consortium.
*
* Permission to use, copy, modify, and/or distribute this software for any
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: message.c,v 1.245.50.7 2010-06-03 05:29:03 marka Exp $ */
+/* $Id: message.c,v 1.254.186.3 2011-06-21 20:15:47 each Exp $ */
/*! \file */
@@ -1804,6 +1804,36 @@ wrong_priority(dns_rdataset_t *rds, int pass, dns_rdatatype_t preferred_glue) {
return (ISC_TRUE);
}
+#ifdef ALLOW_FILTER_AAAA_ON_V4
+/*
+ * Decide whether to not answer with an AAAA record and its RRSIG
+ */
+static inline isc_boolean_t
+norender_rdataset(const dns_rdataset_t *rdataset, unsigned int options)
+{
+ switch (rdataset->type) {
+ case dns_rdatatype_aaaa:
+ if ((options & DNS_MESSAGERENDER_FILTER_AAAA) == 0)
+ return (ISC_FALSE);
+ break;
+
+ case dns_rdatatype_rrsig:
+ if ((options & DNS_MESSAGERENDER_FILTER_AAAA) == 0 ||
+ rdataset->covers != dns_rdatatype_aaaa)
+ return (ISC_FALSE);
+ break;
+
+ default:
+ return (ISC_FALSE);
+ }
+
+ if (rdataset->rdclass != dns_rdataclass_in)
+ return (ISC_FALSE);
+
+ return (ISC_TRUE);
+}
+
+#endif
isc_result_t
dns_message_rendersection(dns_message_t *msg, dns_section_t sectionid,
unsigned int options)
@@ -1931,6 +1961,23 @@ dns_message_rendersection(dns_message_t *msg, dns_section_t sectionid,
preferred_glue))
goto next;
+#ifdef ALLOW_FILTER_AAAA_ON_V4
+ /*
+ * Suppress AAAAs if asked and we are
+ * not doing DNSSEC or are breaking DNSSEC.
+ * Say so in the AD bit if we break DNSSEC.
+ */
+ if (norender_rdataset(rdataset, options) &&
+ sectionid != DNS_SECTION_QUESTION) {
+ if (sectionid == DNS_SECTION_ANSWER ||
+ sectionid == DNS_SECTION_AUTHORITY)
+ msg->flags &= ~DNS_MESSAGEFLAG_AD;
+ if (OPTOUT(rdataset))
+ msg->flags &= ~DNS_MESSAGEFLAG_AD;
+ goto next;
+ }
+
+#endif
st = *(msg->buffer);
count = 0;
@@ -2469,7 +2516,7 @@ dns_message_peekheader(isc_buffer_t *source, dns_messageid_t *idp,
isc_result_t
dns_message_reply(dns_message_t *msg, isc_boolean_t want_question_section) {
- unsigned int first_section;
+ unsigned int clear_after;
isc_result_t result;
REQUIRE(DNS_MESSAGE_VALID(msg));
@@ -2481,15 +2528,15 @@ dns_message_reply(dns_message_t *msg, isc_boolean_t want_question_section) {
msg->opcode != dns_opcode_notify)
want_question_section = ISC_FALSE;
if (msg->opcode == dns_opcode_update)
- first_section = DNS_SECTION_ADDITIONAL;
+ clear_after = DNS_SECTION_PREREQUISITE;
else if (want_question_section) {
if (!msg->question_ok)
return (DNS_R_FORMERR);
- first_section = DNS_SECTION_ANSWER;
+ clear_after = DNS_SECTION_ANSWER;
} else
- first_section = DNS_SECTION_QUESTION;
+ clear_after = DNS_SECTION_QUESTION;
msg->from_to_wire = DNS_MESSAGE_INTENTRENDER;
- msgresetnames(msg, first_section);
+ msgresetnames(msg, clear_after);
msgresetopt(msg);
msgresetsigs(msg, ISC_TRUE);
msginitprivate(msg);
@@ -3071,6 +3118,7 @@ dns_message_sectiontotext(dns_message_t *msg, dns_section_t section,
dns_name_t *name, empty_name;
dns_rdataset_t *rdataset;
isc_result_t result;
+ isc_boolean_t seensoa = ISC_FALSE;
REQUIRE(DNS_MESSAGE_VALID(msg));
REQUIRE(target != NULL);
@@ -3100,6 +3148,15 @@ dns_message_sectiontotext(dns_message_t *msg, dns_section_t section,
for (rdataset = ISC_LIST_HEAD(name->list);
rdataset != NULL;
rdataset = ISC_LIST_NEXT(rdataset, link)) {
+ if (section == DNS_SECTION_ANSWER &&
+ rdataset->type == dns_rdatatype_soa) {
+ if ((flags & DNS_MESSAGETEXTFLAG_OMITSOA) != 0)
+ continue;
+ if (seensoa &&
+ (flags & DNS_MESSAGETEXTFLAG_ONESOA) != 0)
+ continue;
+ seensoa = ISC_TRUE;
+ }
if (section == DNS_SECTION_QUESTION) {
ADD_STRING(target, ";");
result = dns_master_questiontotext(name,
diff --git a/contrib/bind9/lib/dns/name.c b/contrib/bind9/lib/dns/name.c
index 80864b8..f88f281 100644
--- a/contrib/bind9/lib/dns/name.c
+++ b/contrib/bind9/lib/dns/name.c
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004-2008, 2010 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004-2011 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 1998-2003 Internet Software Consortium.
*
* Permission to use, copy, modify, and/or distribute this software for any
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: name.c,v 1.165.120.3 2010-07-09 05:15:05 each Exp $ */
+/* $Id: name.c,v 1.174 2011-01-13 04:59:25 tbox Exp $ */
/*! \file */
@@ -34,6 +34,7 @@
#include <isc/util.h>
#include <dns/compress.h>
+#include <dns/fixedname.h>
#include <dns/name.h>
#include <dns/result.h>
@@ -1018,10 +1019,9 @@ dns_name_toregion(dns_name_t *name, isc_region_t *r) {
DNS_NAME_TOREGION(name, r);
}
-
isc_result_t
dns_name_fromtext(dns_name_t *name, isc_buffer_t *source,
- dns_name_t *origin, unsigned int options,
+ const dns_name_t *origin, unsigned int options,
isc_buffer_t *target)
{
unsigned char *ndata, *label;
@@ -2360,6 +2360,75 @@ dns_name_format(dns_name_t *name, char *cp, unsigned int size) {
snprintf(cp, size, "<unknown>");
}
+/*
+ * dns_name_tostring() -- similar to dns_name_format() but allocates its own
+ * memory.
+ */
+isc_result_t
+dns_name_tostring(dns_name_t *name, char **target, isc_mem_t *mctx) {
+ isc_result_t result;
+ isc_buffer_t buf;
+ isc_region_t reg;
+ char *p, txt[DNS_NAME_FORMATSIZE];
+
+ REQUIRE(VALID_NAME(name));
+ REQUIRE(target != NULL && *target == NULL);
+
+ isc_buffer_init(&buf, txt, sizeof(txt));
+ result = dns_name_totext(name, ISC_FALSE, &buf);
+ if (result != ISC_R_SUCCESS)
+ return (result);
+
+ isc_buffer_usedregion(&buf, &reg);
+ p = isc_mem_allocate(mctx, reg.length + 1);
+ memcpy(p, (char *) reg.base, (int) reg.length);
+ p[reg.length] = '\0';
+
+ *target = p;
+ return (ISC_R_SUCCESS);
+}
+
+/*
+ * dns_name_fromstring() -- convert directly from a string to a name,
+ * allocating memory as needed
+ */
+isc_result_t
+dns_name_fromstring(dns_name_t *target, const char *src, unsigned int options,
+ isc_mem_t *mctx)
+{
+ return (dns_name_fromstring2(target, src, dns_rootname, options, mctx));
+}
+
+isc_result_t
+dns_name_fromstring2(dns_name_t *target, const char *src,
+ const dns_name_t *origin, unsigned int options,
+ isc_mem_t *mctx)
+{
+ isc_result_t result;
+ isc_buffer_t buf;
+ dns_fixedname_t fn;
+ dns_name_t *name;
+
+ REQUIRE(src != NULL);
+
+ isc_buffer_init(&buf, src, strlen(src));
+ isc_buffer_add(&buf, strlen(src));
+ if (BINDABLE(target) && target->buffer != NULL)
+ name = target;
+ else {
+ dns_fixedname_init(&fn);
+ name = dns_fixedname_name(&fn);
+ }
+
+ result = dns_name_fromtext(name, &buf, origin, options, NULL);
+ if (result != ISC_R_SUCCESS)
+ return (result);
+
+ if (name != target)
+ result = dns_name_dupwithoffsets(name, mctx, target);
+ return (result);
+}
+
isc_result_t
dns_name_copy(dns_name_t *source, dns_name_t *dest, isc_buffer_t *target) {
unsigned char *ndata;
diff --git a/contrib/bind9/lib/dns/ncache.c b/contrib/bind9/lib/dns/ncache.c
index cfa4783..420a118 100644
--- a/contrib/bind9/lib/dns/ncache.c
+++ b/contrib/bind9/lib/dns/ncache.c
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004, 2005, 2007, 2008, 2010 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004, 2005, 2007, 2008, 2010, 2011 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 1999-2003 Internet Software Consortium.
*
* Permission to use, copy, modify, and/or distribute this software for any
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: ncache.c,v 1.43.48.7.6.1 2011-05-27 00:19:19 each Exp $ */
+/* $Id: ncache.c,v 1.50.124.1.2.3 2011-06-21 20:15:47 each Exp $ */
/*! \file */
@@ -35,7 +35,7 @@
#define DNS_NCACHE_RDATA 20U
/*
- * The format of an ncache rdata is a sequence of one or more records of
+ * The format of an ncache rdata is a sequence of zero or more records of
* the following format:
*
* owner name
@@ -223,42 +223,6 @@ dns_ncache_addoptout(dns_message_t *message, dns_db_t *cache,
return (result);
if (trust == 0xffff) {
- /*
- * We didn't find any authority data from which to create a
- * negative cache rdataset. In particular, we have no SOA.
- *
- * We trust that the caller wants negative caching, so this
- * means we have a "type 3 nxdomain" or "type 3 nodata"
- * response (see RFC2308 for details).
- *
- * We will now build a suitable negative cache rdataset that
- * will cause zero bytes to be emitted when converted to
- * wire format.
- */
-
- /*
- * The ownername must exist, but it doesn't matter what value
- * it has. We use the root name.
- */
- dns_name_toregion(dns_rootname, &r);
- result = isc_buffer_copyregion(&buffer, &r);
- if (result != ISC_R_SUCCESS)
- return (result);
- /*
- * Copy the type and a zero rdata count to the buffer.
- */
- isc_buffer_availableregion(&buffer, &r);
- if (r.length < 5)
- return (ISC_R_NOSPACE);
- isc_buffer_putuint16(&buffer, 0); /* type */
- /*
- * RFC2308, section 5, says that negative answers without
- * SOAs should not be cached.
- */
- ttl = 0;
- /*
- * Set trust.
- */
if ((message->flags & DNS_MESSAGEFLAG_AA) != 0 &&
message->counts[DNS_SECTION_ANSWER] == 0) {
/*
@@ -268,22 +232,7 @@ dns_ncache_addoptout(dns_message_t *message, dns_db_t *cache,
trust = dns_trust_authauthority;
} else
trust = dns_trust_additional;
- isc_buffer_putuint8(&buffer, (unsigned char)trust); /* trust */
- isc_buffer_putuint16(&buffer, 0); /* count */
-
- /*
- * Now add it to the cache.
- */
- if (next >= DNS_NCACHE_RDATA)
- return (ISC_R_NOSPACE);
- dns_rdata_init(&rdata[next]);
- isc_buffer_remainingregion(&buffer, &r);
- rdata[next].data = r.base;
- rdata[next].length = r.length;
- rdata[next].rdclass = ncrdatalist.rdclass;
- rdata[next].type = 0;
- rdata[next].flags = 0;
- ISC_LIST_APPEND(ncrdatalist.rdata, &rdata[next], link);
+ ttl = 0;
}
INSIST(trust != 0xffff);
@@ -294,6 +243,7 @@ dns_ncache_addoptout(dns_message_t *message, dns_db_t *cache,
RUNTIME_CHECK(dns_rdatalist_tordataset(&ncrdatalist, &ncrdataset)
== ISC_R_SUCCESS);
ncrdataset.trust = trust;
+ ncrdataset.attributes |= DNS_RDATASETATTR_NEGATIVE;
if (message->rcode == dns_rcode_nxdomain)
ncrdataset.attributes |= DNS_RDATASETATTR_NXDOMAIN;
if (optout)
@@ -324,6 +274,7 @@ dns_ncache_towire(dns_rdataset_t *rdataset, dns_compress_t *cctx,
REQUIRE(rdataset != NULL);
REQUIRE(rdataset->type == 0);
+ REQUIRE((rdataset->attributes & DNS_RDATASETATTR_NEGATIVE) != 0);
savedbuffer = *target;
count = 0;
@@ -552,6 +503,7 @@ dns_ncache_getrdataset(dns_rdataset_t *ncacherdataset, dns_name_t *name,
REQUIRE(ncacherdataset != NULL);
REQUIRE(ncacherdataset->type == 0);
+ REQUIRE((ncacherdataset->attributes & DNS_RDATASETATTR_NEGATIVE) != 0);
REQUIRE(name != NULL);
REQUIRE(!dns_rdataset_isassociated(rdataset));
REQUIRE(type != dns_rdatatype_rrsig);
@@ -628,6 +580,7 @@ dns_ncache_getsigrdataset(dns_rdataset_t *ncacherdataset, dns_name_t *name,
REQUIRE(ncacherdataset != NULL);
REQUIRE(ncacherdataset->type == 0);
+ REQUIRE((ncacherdataset->attributes & DNS_RDATASETATTR_NEGATIVE) != 0);
REQUIRE(name != NULL);
REQUIRE(!dns_rdataset_isassociated(rdataset));
@@ -727,6 +680,7 @@ dns_ncache_current(dns_rdataset_t *ncacherdataset, dns_name_t *found,
REQUIRE(ncacherdataset != NULL);
REQUIRE(ncacherdataset->type == 0);
+ REQUIRE((ncacherdataset->attributes & DNS_RDATASETATTR_NEGATIVE) != 0);
REQUIRE(found != NULL);
REQUIRE(!dns_rdataset_isassociated(rdataset));
diff --git a/contrib/bind9/lib/dns/nsec.c b/contrib/bind9/lib/dns/nsec.c
index 7d93ecc..94c5163 100644
--- a/contrib/bind9/lib/dns/nsec.c
+++ b/contrib/bind9/lib/dns/nsec.c
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: nsec.c,v 1.11.48.2 2009-01-06 23:47:26 tbox Exp $ */
+/* $Id: nsec.c,v 1.13 2009-01-06 23:47:57 tbox Exp $ */
/*! \file */
diff --git a/contrib/bind9/lib/dns/nsec3.c b/contrib/bind9/lib/dns/nsec3.c
index 9c85781..e75e744 100644
--- a/contrib/bind9/lib/dns/nsec3.c
+++ b/contrib/bind9/lib/dns/nsec3.c
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2006, 2008, 2009 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2006, 2008-2010 Internet Systems Consortium, Inc. ("ISC")
*
* Permission to use, copy, modify, and/or distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
@@ -14,7 +14,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: nsec3.c,v 1.6.12.4 2009-11-03 23:47:46 tbox Exp $ */
+/* $Id: nsec3.c,v 1.19.96.1 2011-06-21 20:15:48 each Exp $ */
#include <config.h>
@@ -28,6 +28,8 @@
#include <dst/dst.h>
#include <dns/db.h>
+#include <dns/zone.h>
+#include <dns/compress.h>
#include <dns/dbiterator.h>
#include <dns/diff.h>
#include <dns/fixedname.h>
@@ -472,7 +474,6 @@ delete(dns_db_t *db, dns_dbversion_t *version, dns_name_t *name,
return (result);
}
-#ifndef RFC5155_STRICT
static isc_boolean_t
better_param(dns_rdataset_t *nsec3paramset, dns_rdata_t *param) {
dns_rdataset_t rdataset;
@@ -487,7 +488,17 @@ better_param(dns_rdataset_t *nsec3paramset, dns_rdata_t *param) {
result == ISC_R_SUCCESS;
result = dns_rdataset_next(&rdataset)) {
dns_rdata_t rdata = DNS_RDATA_INIT;
- dns_rdataset_current(&rdataset, &rdata);
+ unsigned char buf[DNS_NSEC3PARAM_BUFFERSIZE];
+
+ if (rdataset.type != dns_rdatatype_nsec3param) {
+ dns_rdata_t tmprdata = DNS_RDATA_INIT;
+ dns_rdataset_current(&rdataset, &tmprdata);
+ if (!dns_nsec3param_fromprivate(&tmprdata, &rdata,
+ buf, sizeof(buf)))
+ continue;
+ } else
+ dns_rdataset_current(&rdataset, &rdata);
+
if (rdata.length != param->length)
continue;
if (rdata.data[0] != param->data[0] ||
@@ -505,7 +516,6 @@ better_param(dns_rdataset_t *nsec3paramset, dns_rdata_t *param) {
dns_rdataset_disassociate(&rdataset);
return (ISC_FALSE);
}
-#endif
static isc_result_t
find_nsec3(dns_rdata_nsec3_t *nsec3, dns_rdataset_t *rdataset,
@@ -548,7 +558,7 @@ dns_nsec3_addnsec3(dns_db_t *db, dns_dbversion_t *version,
dns_rdataset_t rdataset;
int pass;
isc_boolean_t exists;
- isc_boolean_t remove_unsecure = ISC_FALSE;
+ isc_boolean_t maybe_remove_unsecure = ISC_FALSE;
isc_uint8_t flags;
isc_buffer_t buffer;
isc_result_t result;
@@ -629,8 +639,12 @@ dns_nsec3_addnsec3(dns_db_t *db, dns_dbversion_t *version,
*/
if (!unsecure)
goto addnsec3;
- else
- remove_unsecure = ISC_TRUE;
+ else if (CREATE(nsec3param->flags) && OPTOUT(flags)) {
+ result = dns_nsec3_delnsec3(db, version, name,
+ nsec3param, diff);
+ goto failure;
+ } else
+ maybe_remove_unsecure = ISC_TRUE;
} else {
dns_rdataset_disassociate(&rdataset);
if (result != ISC_R_NOMORE)
@@ -666,26 +680,19 @@ dns_nsec3_addnsec3(dns_db_t *db, dns_dbversion_t *version,
if (result != ISC_R_SUCCESS)
goto failure;
- if (remove_unsecure) {
+ if (maybe_remove_unsecure) {
dns_rdataset_disassociate(&rdataset);
/*
- * We have found the previous NSEC3 record and can now
- * see if the existing NSEC3 record needs to be
- * updated or deleted.
+ * If we have OPTOUT set in the previous NSEC3 record
+ * we actually need to delete the NSEC3 record.
+ * Otherwise we just need to replace the NSEC3 record.
*/
- if (!OPTOUT(nsec3.flags)) {
- /*
- * Just update the NSEC3 record.
- */
- goto addnsec3;
- } else {
- /*
- * This is actually a deletion not a add.
- */
+ if (OPTOUT(nsec3.flags)) {
result = dns_nsec3_delnsec3(db, version, name,
nsec3param, diff);
goto failure;
}
+ goto addnsec3;
} else {
/*
* Is this is a unsecure delegation we are adding?
@@ -928,17 +935,323 @@ dns_nsec3_addnsec3s(dns_db_t *db, dns_dbversion_t *version,
dns_rdata_t rdata = DNS_RDATA_INIT;
dns_rdataset_current(&rdataset, &rdata);
- dns_rdata_tostruct(&rdata, &nsec3param, NULL);
+ CHECK(dns_rdata_tostruct(&rdata, &nsec3param, NULL));
+
+ if (nsec3param.flags != 0)
+ continue;
+ /*
+ * We have a active chain. Update it.
+ */
+ CHECK(dns_nsec3_addnsec3(db, version, name, &nsec3param,
+ nsecttl, unsecure, diff));
+ }
+ if (result == ISC_R_NOMORE)
+ result = ISC_R_SUCCESS;
+
+ failure:
+ if (dns_rdataset_isassociated(&rdataset))
+ dns_rdataset_disassociate(&rdataset);
+ if (node != NULL)
+ dns_db_detachnode(db, &node);
+
+ return (result);
+}
+
+isc_boolean_t
+dns_nsec3param_fromprivate(dns_rdata_t *src, dns_rdata_t *target,
+ unsigned char *buf, size_t buflen)
+{
+ dns_decompress_t dctx;
+ isc_result_t result;
+ isc_buffer_t buf1;
+ isc_buffer_t buf2;
+
+ /*
+ * Algorithm 0 (reserved by RFC 4034) is used to identify
+ * NSEC3PARAM records from DNSKEY pointers.
+ */
+ if (src->length < 1 || src->data[0] != 0)
+ return (ISC_FALSE);
+
+ isc_buffer_init(&buf1, src->data + 1, src->length - 1);
+ isc_buffer_add(&buf1, src->length - 1);
+ isc_buffer_setactive(&buf1, src->length - 1);
+ isc_buffer_init(&buf2, buf, buflen);
+ dns_decompress_init(&dctx, -1, DNS_DECOMPRESS_NONE);
+ result = dns_rdata_fromwire(target, src->rdclass,
+ dns_rdatatype_nsec3param,
+ &buf1, &dctx, 0, &buf2);
+ dns_decompress_invalidate(&dctx);
+
+ return (ISC_TF(result == ISC_R_SUCCESS));
+}
+
+void
+dns_nsec3param_toprivate(dns_rdata_t *src, dns_rdata_t *target,
+ dns_rdatatype_t privatetype,
+ unsigned char *buf, size_t buflen)
+{
+ REQUIRE(buflen >= src->length + 1);
+
+ REQUIRE(DNS_RDATA_INITIALIZED(target));
+
+ memcpy(buf + 1, src->data, src->length);
+ buf[0] = 0;
+ target->data = buf;
+ target->length = src->length + 1;
+ target->type = privatetype;
+ target->rdclass = src->rdclass;
+ target->flags = 0;
+ ISC_LINK_INIT(target, link);
+}
+
+#ifdef BIND9
+static isc_result_t
+rr_exists(dns_db_t *db, dns_dbversion_t *ver, dns_name_t *name,
+ const dns_rdata_t *rdata, isc_boolean_t *flag)
+{
+ dns_rdataset_t rdataset;
+ dns_dbnode_t *node = NULL;
+ isc_result_t result;
+
+ dns_rdataset_init(&rdataset);
+ if (rdata->type == dns_rdatatype_nsec3)
+ CHECK(dns_db_findnsec3node(db, name, ISC_FALSE, &node));
+ else
+ CHECK(dns_db_findnode(db, name, ISC_FALSE, &node));
+ result = dns_db_findrdataset(db, node, ver, rdata->type, 0,
+ (isc_stdtime_t) 0, &rdataset, NULL);
+ if (result == ISC_R_NOTFOUND) {
+ *flag = ISC_FALSE;
+ result = ISC_R_SUCCESS;
+ goto failure;
+ }
+
+ for (result = dns_rdataset_first(&rdataset);
+ result == ISC_R_SUCCESS;
+ result = dns_rdataset_next(&rdataset)) {
+ dns_rdata_t myrdata = DNS_RDATA_INIT;
+ dns_rdataset_current(&rdataset, &myrdata);
+ if (!dns_rdata_casecompare(&myrdata, rdata))
+ break;
+ }
+ dns_rdataset_disassociate(&rdataset);
+ if (result == ISC_R_SUCCESS) {
+ *flag = ISC_TRUE;
+ } else if (result == ISC_R_NOMORE) {
+ *flag = ISC_FALSE;
+ result = ISC_R_SUCCESS;
+ }
+
+ failure:
+ if (node != NULL)
+ dns_db_detachnode(db, &node);
+ return (result);
+}
+#endif
+
+#ifdef BIND9
+isc_result_t
+dns_nsec3param_deletechains(dns_db_t *db, dns_dbversion_t *ver,
+ dns_zone_t *zone, dns_diff_t *diff)
+{
+ dns_dbnode_t *node = NULL;
+ dns_difftuple_t *tuple = NULL;
+ dns_name_t next;
+ dns_rdata_t rdata = DNS_RDATA_INIT;
+ dns_rdataset_t rdataset;
+ isc_boolean_t flag;
+ isc_result_t result = ISC_R_SUCCESS;
+ unsigned char buf[DNS_NSEC3PARAM_BUFFERSIZE + 1];
+ dns_name_t *origin = dns_zone_getorigin(zone);
+ dns_rdatatype_t privatetype = dns_zone_getprivatetype(zone);
+
+ dns_name_init(&next, NULL);
+ dns_rdataset_init(&rdataset);
+
+ result = dns_db_getoriginnode(db, &node);
+ if (result != ISC_R_SUCCESS)
+ return (result);
+
+ /*
+ * Cause all NSEC3 chains to be deleted.
+ */
+ result = dns_db_findrdataset(db, node, ver, dns_rdatatype_nsec3param,
+ 0, (isc_stdtime_t) 0, &rdataset, NULL);
+ if (result == ISC_R_NOTFOUND)
+ goto try_private;
+ if (result != ISC_R_SUCCESS)
+ goto failure;
+
+ for (result = dns_rdataset_first(&rdataset);
+ result == ISC_R_SUCCESS;
+ result = dns_rdataset_next(&rdataset)) {
+ dns_rdata_t private = DNS_RDATA_INIT;
+
+ dns_rdataset_current(&rdataset, &rdata);
+
+ CHECK(dns_difftuple_create(diff->mctx, DNS_DIFFOP_DEL, origin,
+ rdataset.ttl, &rdata, &tuple));
+ CHECK(do_one_tuple(&tuple, db, ver, diff));
+ INSIST(tuple == NULL);
+
+ dns_nsec3param_toprivate(&rdata, &private, privatetype,
+ buf, sizeof(buf));
+ buf[2] = DNS_NSEC3FLAG_REMOVE | DNS_NSEC3FLAG_NONSEC;
+
+ CHECK(rr_exists(db, ver, origin, &private, &flag));
+
+ if (!flag) {
+ CHECK(dns_difftuple_create(diff->mctx, DNS_DIFFOP_ADD,
+ origin, 0, &private,
+ &tuple));
+ CHECK(do_one_tuple(&tuple, db, ver, diff));
+ INSIST(tuple == NULL);
+ }
+ dns_rdata_reset(&rdata);
+ }
+ if (result != ISC_R_NOMORE)
+ goto failure;
+
+ dns_rdataset_disassociate(&rdataset);
+
+ try_private:
+ if (privatetype == 0)
+ goto success;
+ result = dns_db_findrdataset(db, node, ver, privatetype, 0,
+ (isc_stdtime_t) 0, &rdataset, NULL);
+ if (result == ISC_R_NOTFOUND)
+ goto success;
+ if (result != ISC_R_SUCCESS)
+ goto failure;
+
+ for (result = dns_rdataset_first(&rdataset);
+ result == ISC_R_SUCCESS;
+ result = dns_rdataset_next(&rdataset)) {
+ dns_rdataset_current(&rdataset, &rdata);
+ INSIST(rdata.length <= sizeof(buf));
+ memcpy(buf, rdata.data, rdata.length);
+
+ if (buf[0] != 0 ||
+ buf[2] == (DNS_NSEC3FLAG_REMOVE | DNS_NSEC3FLAG_NONSEC)) {
+ dns_rdata_reset(&rdata);
+ continue;
+ }
+
+ CHECK(dns_difftuple_create(diff->mctx, DNS_DIFFOP_DEL, origin,
+ 0, &rdata, &tuple));
+ CHECK(do_one_tuple(&tuple, db, ver, diff));
+ INSIST(tuple == NULL);
+
+ rdata.data = buf;
+ buf[2] = DNS_NSEC3FLAG_REMOVE | DNS_NSEC3FLAG_NONSEC;
+
+ CHECK(rr_exists(db, ver, origin, &rdata, &flag));
+
+ if (!flag) {
+ CHECK(dns_difftuple_create(diff->mctx, DNS_DIFFOP_ADD,
+ origin, 0, &rdata, &tuple));
+ CHECK(do_one_tuple(&tuple, db, ver, diff));
+ INSIST(tuple == NULL);
+ }
+ dns_rdata_reset(&rdata);
+ }
+ if (result != ISC_R_NOMORE)
+ goto failure;
+ success:
+ result = ISC_R_SUCCESS;
+
+ failure:
+ if (dns_rdataset_isassociated(&rdataset))
+ dns_rdataset_disassociate(&rdataset);
+ dns_db_detachnode(db, &node);
+ return (result);
+}
+#endif
+
+isc_result_t
+dns_nsec3_addnsec3sx(dns_db_t *db, dns_dbversion_t *version,
+ dns_name_t *name, dns_ttl_t nsecttl,
+ isc_boolean_t unsecure, dns_rdatatype_t type,
+ dns_diff_t *diff)
+{
+ dns_dbnode_t *node = NULL;
+ dns_rdata_nsec3param_t nsec3param;
+ dns_rdataset_t rdataset;
+ dns_rdataset_t prdataset;
+ isc_result_t result;
+
+ dns_rdataset_init(&rdataset);
+ dns_rdataset_init(&prdataset);
+
+ /*
+ * Find the NSEC3 parameters for this zone.
+ */
+ result = dns_db_getoriginnode(db, &node);
+ if (result != ISC_R_SUCCESS)
+ return (result);
+
+ result = dns_db_findrdataset(db, node, version, type, 0, 0,
+ &prdataset, NULL);
+ if (result != ISC_R_SUCCESS && result != ISC_R_NOTFOUND)
+ goto failure;
+
+ result = dns_db_findrdataset(db, node, version,
+ dns_rdatatype_nsec3param, 0, 0,
+ &rdataset, NULL);
+ if (result == ISC_R_NOTFOUND)
+ goto try_private;
+ if (result != ISC_R_SUCCESS)
+ goto failure;
+
+ /*
+ * Update each active NSEC3 chain.
+ */
+ for (result = dns_rdataset_first(&rdataset);
+ result == ISC_R_SUCCESS;
+ result = dns_rdataset_next(&rdataset)) {
+ dns_rdata_t rdata = DNS_RDATA_INIT;
+
+ dns_rdataset_current(&rdataset, &rdata);
+ CHECK(dns_rdata_tostruct(&rdata, &nsec3param, NULL));
-#ifdef RFC5155_STRICT
if (nsec3param.flags != 0)
continue;
-#else
+
+ /*
+ * We have a active chain. Update it.
+ */
+ CHECK(dns_nsec3_addnsec3(db, version, name, &nsec3param,
+ nsecttl, unsecure, diff));
+ }
+ if (result != ISC_R_NOMORE)
+ goto failure;
+
+ dns_rdataset_disassociate(&rdataset);
+
+ try_private:
+ if (!dns_rdataset_isassociated(&prdataset))
+ goto success;
+ /*
+ * Update each active NSEC3 chain.
+ */
+ for (result = dns_rdataset_first(&prdataset);
+ result == ISC_R_SUCCESS;
+ result = dns_rdataset_next(&prdataset)) {
+ dns_rdata_t rdata1 = DNS_RDATA_INIT;
+ dns_rdata_t rdata2 = DNS_RDATA_INIT;
+ unsigned char buf[DNS_NSEC3PARAM_BUFFERSIZE];
+
+ dns_rdataset_current(&prdataset, &rdata1);
+ if (!dns_nsec3param_fromprivate(&rdata1, &rdata2,
+ buf, sizeof(buf)))
+ continue;
+ CHECK(dns_rdata_tostruct(&rdata2, &nsec3param, NULL));
+
if ((nsec3param.flags & DNS_NSEC3FLAG_REMOVE) != 0)
continue;
- if (better_param(&rdataset, &rdata))
+ if (better_param(&prdataset, &rdata2))
continue;
-#endif
/*
* We have a active chain. Update it.
@@ -947,11 +1260,13 @@ dns_nsec3_addnsec3s(dns_db_t *db, dns_dbversion_t *version,
nsecttl, unsecure, diff));
}
if (result == ISC_R_NOMORE)
+ success:
result = ISC_R_SUCCESS;
-
failure:
if (dns_rdataset_isassociated(&rdataset))
dns_rdataset_disassociate(&rdataset);
+ if (dns_rdataset_isassociated(&prdataset))
+ dns_rdataset_disassociate(&prdataset);
if (node != NULL)
dns_db_detachnode(db, &node);
@@ -1120,6 +1435,8 @@ dns_nsec3_delnsec3(dns_db_t *db, dns_dbversion_t *version, dns_name_t *name,
*/
nsec3.next = nexthash;
nsec3.next_length = next_length;
+ if (CREATE(nsec3param->flags))
+ nsec3.flags = nsec3param->flags & DNS_NSEC3FLAG_OPTOUT;
isc_buffer_init(&buffer, nsec3buf, sizeof(nsec3buf));
CHECK(dns_rdata_fromstruct(&rdata, rdataset.rdclass,
dns_rdatatype_nsec3, &nsec3,
@@ -1257,6 +1574,13 @@ isc_result_t
dns_nsec3_delnsec3s(dns_db_t *db, dns_dbversion_t *version, dns_name_t *name,
dns_diff_t *diff)
{
+ return (dns_nsec3_delnsec3sx(db, version, name, 0, diff));
+}
+
+isc_result_t
+dns_nsec3_delnsec3sx(dns_db_t *db, dns_dbversion_t *version, dns_name_t *name,
+ dns_rdatatype_t privatetype, dns_diff_t *diff)
+{
dns_dbnode_t *node = NULL;
dns_rdata_nsec3param_t nsec3param;
dns_rdataset_t rdataset;
@@ -1274,11 +1598,10 @@ dns_nsec3_delnsec3s(dns_db_t *db, dns_dbversion_t *version, dns_name_t *name,
result = dns_db_findrdataset(db, node, version,
dns_rdatatype_nsec3param, 0, 0,
&rdataset, NULL);
- dns_db_detachnode(db, &node);
if (result == ISC_R_NOTFOUND)
- return (ISC_R_SUCCESS);
+ goto try_private;
if (result != ISC_R_SUCCESS)
- return (result);
+ goto failure;
/*
* Update each active NSEC3 chain.
@@ -1289,17 +1612,47 @@ dns_nsec3_delnsec3s(dns_db_t *db, dns_dbversion_t *version, dns_name_t *name,
dns_rdata_t rdata = DNS_RDATA_INIT;
dns_rdataset_current(&rdataset, &rdata);
- dns_rdata_tostruct(&rdata, &nsec3param, NULL);
+ CHECK(dns_rdata_tostruct(&rdata, &nsec3param, NULL));
-#ifdef RFC5155_STRICT
if (nsec3param.flags != 0)
continue;
-#else
+ /*
+ * We have a active chain. Update it.
+ */
+ CHECK(dns_nsec3_delnsec3(db, version, name, &nsec3param, diff));
+ }
+ dns_rdataset_disassociate(&rdataset);
+
+ try_private:
+ if (privatetype == 0)
+ goto success;
+ result = dns_db_findrdataset(db, node, version, privatetype, 0, 0,
+ &rdataset, NULL);
+ if (result == ISC_R_NOTFOUND)
+ goto success;
+ if (result != ISC_R_SUCCESS)
+ goto failure;
+
+ /*
+ * Update each NSEC3 chain being built.
+ */
+ for (result = dns_rdataset_first(&rdataset);
+ result == ISC_R_SUCCESS;
+ result = dns_rdataset_next(&rdataset)) {
+ dns_rdata_t rdata1 = DNS_RDATA_INIT;
+ dns_rdata_t rdata2 = DNS_RDATA_INIT;
+ unsigned char buf[DNS_NSEC3PARAM_BUFFERSIZE];
+
+ dns_rdataset_current(&rdataset, &rdata1);
+ if (!dns_nsec3param_fromprivate(&rdata1, &rdata2,
+ buf, sizeof(buf)))
+ continue;
+ CHECK(dns_rdata_tostruct(&rdata2, &nsec3param, NULL));
+
if ((nsec3param.flags & DNS_NSEC3FLAG_REMOVE) != 0)
continue;
- if (better_param(&rdataset, &rdata))
+ if (better_param(&rdataset, &rdata2))
continue;
-#endif
/*
* We have a active chain. Update it.
@@ -1307,6 +1660,7 @@ dns_nsec3_delnsec3s(dns_db_t *db, dns_dbversion_t *version, dns_name_t *name,
CHECK(dns_nsec3_delnsec3(db, version, name, &nsec3param, diff));
}
if (result == ISC_R_NOMORE)
+ success:
result = ISC_R_SUCCESS;
failure:
@@ -1322,6 +1676,14 @@ isc_result_t
dns_nsec3_active(dns_db_t *db, dns_dbversion_t *version,
isc_boolean_t complete, isc_boolean_t *answer)
{
+ return (dns_nsec3_activex(db, version, complete, 0, answer));
+}
+
+isc_result_t
+dns_nsec3_activex(dns_db_t *db, dns_dbversion_t *version,
+ isc_boolean_t complete, dns_rdatatype_t privatetype,
+ isc_boolean_t *answer)
+{
dns_dbnode_t *node = NULL;
dns_rdataset_t rdataset;
dns_rdata_nsec3param_t nsec3param;
@@ -1338,34 +1700,78 @@ dns_nsec3_active(dns_db_t *db, dns_dbversion_t *version,
result = dns_db_findrdataset(db, node, version,
dns_rdatatype_nsec3param, 0, 0,
&rdataset, NULL);
- dns_db_detachnode(db, &node);
+ if (result == ISC_R_NOTFOUND)
+ goto try_private;
+
+ if (result != ISC_R_SUCCESS) {
+ dns_db_detachnode(db, &node);
+ return (result);
+ }
+ for (result = dns_rdataset_first(&rdataset);
+ result == ISC_R_SUCCESS;
+ result = dns_rdataset_next(&rdataset)) {
+ dns_rdata_t rdata = DNS_RDATA_INIT;
+
+ dns_rdataset_current(&rdataset, &rdata);
+ result = dns_rdata_tostruct(&rdata, &nsec3param, NULL);
+ RUNTIME_CHECK(result == ISC_R_SUCCESS);
+
+ if (nsec3param.flags == 0)
+ break;
+ }
+ dns_rdataset_disassociate(&rdataset);
+ if (result == ISC_R_SUCCESS) {
+ dns_db_detachnode(db, &node);
+ *answer = ISC_TRUE;
+ return (ISC_R_SUCCESS);
+ }
+ if (result == ISC_R_NOMORE)
+ *answer = ISC_FALSE;
+
+ try_private:
+ if (privatetype == 0 || complete) {
+ *answer = ISC_FALSE;
+ return (ISC_R_SUCCESS);
+ }
+ result = dns_db_findrdataset(db, node, version, privatetype, 0, 0,
+ &rdataset, NULL);
+
+ dns_db_detachnode(db, &node);
if (result == ISC_R_NOTFOUND) {
*answer = ISC_FALSE;
return (ISC_R_SUCCESS);
}
if (result != ISC_R_SUCCESS)
return (result);
+
for (result = dns_rdataset_first(&rdataset);
result == ISC_R_SUCCESS;
result = dns_rdataset_next(&rdataset)) {
- dns_rdata_t rdata = DNS_RDATA_INIT;
+ dns_rdata_t rdata1 = DNS_RDATA_INIT;
+ dns_rdata_t rdata2 = DNS_RDATA_INIT;
+ unsigned char buf[DNS_NSEC3PARAM_BUFFERSIZE];
- dns_rdataset_current(&rdataset, &rdata);
- result = dns_rdata_tostruct(&rdata, &nsec3param, NULL);
+ dns_rdataset_current(&rdataset, &rdata1);
+ if (!dns_nsec3param_fromprivate(&rdata1, &rdata2,
+ buf, sizeof(buf)))
+ continue;
+ result = dns_rdata_tostruct(&rdata2, &nsec3param, NULL);
RUNTIME_CHECK(result == ISC_R_SUCCESS);
- if ((nsec3param.flags) == 0 ||
- (!complete && CREATE(nsec3param.flags)))
+ if (!complete && CREATE(nsec3param.flags))
break;
}
dns_rdataset_disassociate(&rdataset);
- if (result == ISC_R_SUCCESS)
+ if (result == ISC_R_SUCCESS) {
*answer = ISC_TRUE;
+ result = ISC_R_SUCCESS;
+ }
if (result == ISC_R_NOMORE) {
*answer = ISC_FALSE;
result = ISC_R_SUCCESS;
}
+
return (result);
}
diff --git a/contrib/bind9/lib/dns/openssl_link.c b/contrib/bind9/lib/dns/openssl_link.c
index 081e3c6..8c733f6 100644
--- a/contrib/bind9/lib/dns/openssl_link.c
+++ b/contrib/bind9/lib/dns/openssl_link.c
@@ -31,7 +31,7 @@
/*
* Principal Author: Brian Wellington
- * $Id: openssl_link.c,v 1.22.112.5 2010-09-15 12:37:35 tbox Exp $
+ * $Id: openssl_link.c,v 1.29 2010-09-15 12:38:36 tbox Exp $
*/
#ifdef OPENSSL
@@ -45,6 +45,8 @@
#include <isc/thread.h>
#include <isc/util.h>
+#include <dst/result.h>
+
#include "dst_internal.h"
#include "dst_openssl.h"
@@ -60,12 +62,6 @@
#ifdef USE_ENGINE
#include <openssl/engine.h>
-
-#ifdef ENGINE_ID
-const char *engine_id = ENGINE_ID;
-#else
-const char *engine_id;
-#endif
#endif
static RAND_METHOD *rm = NULL;
@@ -74,15 +70,7 @@ static isc_mutex_t *locks = NULL;
static int nlocks;
#ifdef USE_ENGINE
-static ENGINE *e;
-static ENGINE *he;
-#endif
-
-#ifdef USE_PKCS11
-static isc_result_t
-dst__openssl_load_engine(const char *name, const char *engine_id,
- const char **pre_cmds, int pre_num,
- const char **post_cmds, int post_num);
+static ENGINE *e = NULL;
#endif
static int
@@ -135,8 +123,16 @@ id_callback(void) {
static void *
mem_alloc(size_t size) {
+#ifdef OPENSSL_LEAKS
+ void *ptr;
+
+ INSIST(dst__memory_pool != NULL);
+ ptr = isc_mem_allocate(dst__memory_pool, size);
+ return (ptr);
+#else
INSIST(dst__memory_pool != NULL);
return (isc_mem_allocate(dst__memory_pool, size));
+#endif
}
static void
@@ -148,16 +144,26 @@ mem_free(void *ptr) {
static void *
mem_realloc(void *ptr, size_t size) {
+#ifdef OPENSSL_LEAKS
+ void *rptr;
+
+ INSIST(dst__memory_pool != NULL);
+ rptr = isc_mem_reallocate(dst__memory_pool, ptr, size);
+ return (rptr);
+#else
INSIST(dst__memory_pool != NULL);
return (isc_mem_reallocate(dst__memory_pool, ptr, size));
+#endif
}
isc_result_t
-dst__openssl_init() {
+dst__openssl_init(const char *engine) {
isc_result_t result;
#ifdef USE_ENGINE
- /* const char *name; */
ENGINE *re;
+#else
+
+ UNUSED(engine);
#endif
#ifdef DNS_CRYPTO_LEAKS
@@ -187,70 +193,26 @@ dst__openssl_init() {
rm->add = entropy_add;
rm->pseudorand = entropy_getpseudo;
rm->status = entropy_status;
+
#ifdef USE_ENGINE
OPENSSL_config(NULL);
-#ifdef USE_PKCS11
-#ifndef PKCS11_SO_PATH
-#define PKCS11_SO_PATH "/usr/local/lib/engines/engine_pkcs11.so"
-#endif
-#ifndef PKCS11_MODULE_PATH
-#define PKCS11_MODULE_PATH "/usr/lib/libpkcs11.so"
-#endif
- {
- /*
- * to use this to config the PIN, add in openssl.cnf:
- * - at the beginning: "openssl_conf = openssl_def"
- * - at any place these sections:
- * [ openssl_def ]
- * engines = engine_section
- * [ engine_section ]
- * pkcs11 = pkcs11_section
- * [ pkcs11_section ]
- * PIN = my___pin
- */
-
- const char *pre_cmds[] = {
- "SO_PATH", PKCS11_SO_PATH,
- "LOAD", NULL,
- "MODULE_PATH", PKCS11_MODULE_PATH
- };
- const char *post_cmds[] = {
- /* "PIN", "my___pin" */
- };
- result = dst__openssl_load_engine("pkcs11", "pkcs11",
- pre_cmds, 0,
- post_cmds, /*1*/ 0);
- if (result != ISC_R_SUCCESS)
- goto cleanup_rm;
- }
-#endif /* USE_PKCS11 */
- if (engine_id != NULL) {
- e = ENGINE_by_id(engine_id);
+
+ if (engine != NULL && *engine == '\0')
+ engine = NULL;
+
+ if (engine != NULL) {
+ e = ENGINE_by_id(engine);
if (e == NULL) {
- result = ISC_R_NOTFOUND;
+ result = DST_R_NOENGINE;
goto cleanup_rm;
}
- if (!ENGINE_init(e)) {
- result = ISC_R_FAILURE;
- ENGINE_free(e);
+ /* This will init the engine. */
+ if (!ENGINE_set_default(e, ENGINE_METHOD_ALL)) {
+ result = DST_R_NOENGINE;
goto cleanup_rm;
}
- ENGINE_set_default(e, ENGINE_METHOD_ALL);
- ENGINE_free(e);
- } else {
- ENGINE_register_all_complete();
- for (e = ENGINE_get_first(); e != NULL; e = ENGINE_get_next(e)) {
-
- /*
- * Something weird here. If we call ENGINE_finish()
- * ENGINE_get_default_RAND() will fail.
- */
- if (ENGINE_init(e)) {
- if (he == NULL)
- he = e;
- }
- }
}
+
re = ENGINE_get_default_RAND();
if (re == NULL) {
re = ENGINE_new();
@@ -263,7 +225,6 @@ dst__openssl_init() {
ENGINE_free(re);
} else
ENGINE_finish(re);
-
#else
RAND_set_rand_method(rm);
#endif /* USE_ENGINE */
@@ -271,13 +232,18 @@ dst__openssl_init() {
#ifdef USE_ENGINE
cleanup_rm:
+ if (e != NULL)
+ ENGINE_free(e);
+ e = NULL;
mem_free(rm);
+ rm = NULL;
#endif
cleanup_mutexinit:
CRYPTO_set_locking_callback(NULL);
DESTROYMUTEXBLOCK(locks, nlocks);
cleanup_mutexalloc:
mem_free(locks);
+ locks = NULL;
return (result);
}
@@ -287,15 +253,22 @@ dst__openssl_destroy() {
/*
* Sequence taken from apps_shutdown() in <apps/apps.h>.
*/
+ if (rm != NULL) {
+#if OPENSSL_VERSION_NUMBER >= 0x00907000L
+ RAND_cleanup();
+#endif
+ mem_free(rm);
+ rm = NULL;
+ }
#if (OPENSSL_VERSION_NUMBER >= 0x00907000L)
- CONF_modules_unload(1);
+ CONF_modules_free();
#endif
+ OBJ_cleanup();
EVP_cleanup();
#if defined(USE_ENGINE)
- if (e != NULL) {
- ENGINE_finish(e);
- e = NULL;
- }
+ if (e != NULL)
+ ENGINE_free(e);
+ e = NULL;
#if defined(USE_ENGINE) && OPENSSL_VERSION_NUMBER >= 0x00907000L
ENGINE_cleanup();
#endif
@@ -304,23 +277,18 @@ dst__openssl_destroy() {
CRYPTO_cleanup_all_ex_data();
#endif
ERR_clear_error();
- ERR_free_strings();
ERR_remove_state(0);
+ ERR_free_strings();
#ifdef DNS_CRYPTO_LEAKS
CRYPTO_mem_leaks_fp(stderr);
#endif
- if (rm != NULL) {
-#if OPENSSL_VERSION_NUMBER >= 0x00907000L
- RAND_cleanup();
-#endif
- mem_free(rm);
- }
if (locks != NULL) {
CRYPTO_set_locking_callback(NULL);
DESTROYMUTEXBLOCK(locks, nlocks);
mem_free(locks);
+ locks = NULL;
}
}
@@ -341,91 +309,18 @@ dst__openssl_toresult(isc_result_t fallback) {
}
ENGINE *
-dst__openssl_getengine(const char *name) {
-
- UNUSED(name);
-
+dst__openssl_getengine(const char *engine) {
+ if (engine == NULL)
+ return (NULL);
#if defined(USE_ENGINE)
- return (he);
-#else
- return (NULL);
-#endif
-}
-
-isc_result_t
-dst__openssl_setdefault(const char *name) {
-
- UNUSED(name);
-
-#if defined(USE_ENGINE)
- ENGINE_set_default(e, ENGINE_METHOD_ALL);
-#endif
- /*
- * XXXMPA If the engine does not have a default RAND method
- * restore our method.
- */
- return (ISC_R_SUCCESS);
-}
-
-#ifdef USE_PKCS11
-/*
- * 'name' is the name the engine is known by to the dst library.
- * This may or may not match the name the engine is known by to
- * openssl. It is the name that is stored in the private key file.
- *
- * 'engine_id' is the openssl engine name.
- *
- * pre_cmds and post_cmds a sequence if command argument pairs
- * pre_num and post_num are a count of those pairs.
- *
- * "SO_PATH", PKCS11_SO_PATH ("/usr/local/lib/engines/engine_pkcs11.so")
- * "LOAD", NULL
- * "MODULE_PATH", PKCS11_MODULE_PATH ("/usr/lib/libpkcs11.so")
- */
-static isc_result_t
-dst__openssl_load_engine(const char *name, const char *engine_id,
- const char **pre_cmds, int pre_num,
- const char **post_cmds, int post_num)
-{
- ENGINE *e;
-
- UNUSED(name);
-
- if (!strcasecmp(engine_id, "dynamic"))
- ENGINE_load_dynamic();
- e = ENGINE_by_id(engine_id);
if (e == NULL)
- return (ISC_R_NOTFOUND);
- while (pre_num--) {
- if (!ENGINE_ctrl_cmd_string(e, pre_cmds[0], pre_cmds[1], 0)) {
- ENGINE_free(e);
- return (ISC_R_FAILURE);
- }
- pre_cmds += 2;
- }
- if (!ENGINE_init(e)) {
- ENGINE_free(e);
- return (ISC_R_FAILURE);
- }
- /*
- * ENGINE_init() returned a functional reference, so free the
- * structural reference from ENGINE_by_id().
- */
- ENGINE_free(e);
- while (post_num--) {
- if (!ENGINE_ctrl_cmd_string(e, post_cmds[0], post_cmds[1], 0)) {
- ENGINE_free(e);
- return (ISC_R_FAILURE);
- }
- post_cmds += 2;
- }
- if (he != NULL)
- ENGINE_finish(he);
- he = e;
- return (ISC_R_SUCCESS);
+ return (NULL);
+ if (strcmp(engine, ENGINE_get_id(e)) == 0)
+ return (e);
+#endif
+ return (NULL);
}
-#endif /* USE_PKCS11 */
#else /* OPENSSL */
diff --git a/contrib/bind9/lib/dns/openssldh_link.c b/contrib/bind9/lib/dns/openssldh_link.c
index e31137f..9deda6b 100644
--- a/contrib/bind9/lib/dns/openssldh_link.c
+++ b/contrib/bind9/lib/dns/openssldh_link.c
@@ -1,5 +1,5 @@
/*
- * Portions Copyright (C) 2004-2008 Internet Systems Consortium, Inc. ("ISC")
+ * Portions Copyright (C) 2004-2009, 2011 Internet Systems Consortium, Inc. ("ISC")
* Portions Copyright (C) 1999-2002 Internet Software Consortium.
*
* Permission to use, copy, modify, and/or distribute this software for any
@@ -31,7 +31,7 @@
/*
* Principal Author: Brian Wellington
- * $Id: openssldh_link.c,v 1.14 2008-04-01 23:47:10 tbox Exp $
+ * $Id: openssldh_link.c,v 1.20 2011-01-11 23:47:13 tbox Exp $
*/
#ifdef OPENSSL
@@ -149,12 +149,37 @@ openssldh_paramcompare(const dst_key_t *key1, const dst_key_t *key2) {
return (ISC_TRUE);
}
+#if OPENSSL_VERSION_NUMBER > 0x00908000L
+static int
+progress_cb(int p, int n, BN_GENCB *cb)
+{
+ union {
+ void *dptr;
+ void (*fptr)(int);
+ } u;
+
+ UNUSED(n);
+
+ u.dptr = cb->arg;
+ if (u.fptr != NULL)
+ u.fptr(p);
+ return (1);
+}
+#endif
+
static isc_result_t
-openssldh_generate(dst_key_t *key, int generator) {
+openssldh_generate(dst_key_t *key, int generator, void (*callback)(int)) {
+ DH *dh = NULL;
#if OPENSSL_VERSION_NUMBER > 0x00908000L
BN_GENCB cb;
+ union {
+ void *dptr;
+ void (*fptr)(int);
+ } u;
+#else
+
+ UNUSED(callback);
#endif
- DH *dh = NULL;
if (generator == 0) {
if (key->key_size == 768 ||
@@ -181,7 +206,12 @@ openssldh_generate(dst_key_t *key, int generator) {
if (dh == NULL)
return (dst__openssl_toresult(DST_R_OPENSSLFAILURE));
- BN_GENCB_set_old(&cb, NULL, NULL);
+ if (callback == NULL) {
+ BN_GENCB_set_old(&cb, NULL, NULL);
+ } else {
+ u.fptr = callback;
+ BN_GENCB_set(&cb, &progress_cb, u.dptr);
+ }
if (!DH_generate_parameters_ex(dh, key->key_size, generator,
&cb)) {
@@ -476,7 +506,7 @@ openssldh_tofile(const dst_key_t *key, const char *directory) {
}
static isc_result_t
-openssldh_parse(dst_key_t *key, isc_lex_t *lexer) {
+openssldh_parse(dst_key_t *key, isc_lex_t *lexer, dst_key_t *pub) {
dst_private_t priv;
isc_result_t ret;
int i;
@@ -484,6 +514,7 @@ openssldh_parse(dst_key_t *key, isc_lex_t *lexer) {
isc_mem_t *mctx;
#define DST_RET(a) {ret = a; goto err;}
+ UNUSED(pub);
mctx = key->mctx;
/* read private key file */
@@ -609,6 +640,8 @@ static dst_func_t openssldh_functions = {
openssldh_parse,
openssldh_cleanup,
NULL, /*%< fromlabel */
+ NULL, /*%< dump */
+ NULL, /*%< restore */
};
isc_result_t
diff --git a/contrib/bind9/lib/dns/openssldsa_link.c b/contrib/bind9/lib/dns/openssldsa_link.c
index c563d9b..ae88d4c 100644
--- a/contrib/bind9/lib/dns/openssldsa_link.c
+++ b/contrib/bind9/lib/dns/openssldsa_link.c
@@ -1,5 +1,5 @@
/*
- * Portions Copyright (C) 2004-2009 Internet Systems Consortium, Inc. ("ISC")
+ * Portions Copyright (C) 2004-2009, 2011 Internet Systems Consortium, Inc. ("ISC")
* Portions Copyright (C) 1999-2002 Internet Software Consortium.
*
* Permission to use, copy, modify, and/or distribute this software for any
@@ -29,7 +29,7 @@
* IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: openssldsa_link.c,v 1.13.120.2 2009-01-14 23:47:26 tbox Exp $ */
+/* $Id: openssldsa_link.c,v 1.20 2011-01-11 23:47:13 tbox Exp $ */
#ifdef OPENSSL
#ifndef USE_EVP
@@ -313,15 +313,40 @@ openssldsa_compare(const dst_key_t *key1, const dst_key_t *key2) {
return (ISC_TRUE);
}
-static isc_result_t
-openssldsa_generate(dst_key_t *key, int unused) {
#if OPENSSL_VERSION_NUMBER > 0x00908000L
- BN_GENCB cb;
+static int
+progress_cb(int p, int n, BN_GENCB *cb)
+{
+ union {
+ void *dptr;
+ void (*fptr)(int);
+ } u;
+
+ UNUSED(n);
+
+ u.dptr = cb->arg;
+ if (u.fptr != NULL)
+ u.fptr(p);
+ return (1);
+}
#endif
+
+static isc_result_t
+openssldsa_generate(dst_key_t *key, int unused, void (*callback)(int)) {
DSA *dsa;
unsigned char rand_array[ISC_SHA1_DIGESTLENGTH];
isc_result_t result;
+#if OPENSSL_VERSION_NUMBER > 0x00908000L
+ BN_GENCB cb;
+ union {
+ void *dptr;
+ void (*fptr)(int);
+ } u;
+
+#else
+ UNUSED(callback);
+#endif
UNUSED(unused);
result = dst__entropy_getdata(rand_array, sizeof(rand_array),
@@ -334,7 +359,12 @@ openssldsa_generate(dst_key_t *key, int unused) {
if (dsa == NULL)
return (dst__openssl_toresult(DST_R_OPENSSLFAILURE));
- BN_GENCB_set_old(&cb, NULL, NULL);
+ if (callback == NULL) {
+ BN_GENCB_set_old(&cb, NULL, NULL);
+ } else {
+ u.fptr = callback;
+ BN_GENCB_set(&cb, &progress_cb, u.dptr);
+ }
if (!DSA_generate_parameters_ex(dsa, key->key_size, rand_array,
ISC_SHA1_DIGESTLENGTH, NULL, NULL,
@@ -512,7 +542,7 @@ openssldsa_tofile(const dst_key_t *key, const char *directory) {
}
static isc_result_t
-openssldsa_parse(dst_key_t *key, isc_lex_t *lexer) {
+openssldsa_parse(dst_key_t *key, isc_lex_t *lexer, dst_key_t *pub) {
dst_private_t priv;
isc_result_t ret;
int i;
@@ -520,6 +550,7 @@ openssldsa_parse(dst_key_t *key, isc_lex_t *lexer) {
isc_mem_t *mctx = key->mctx;
#define DST_RET(a) {ret = a; goto err;}
+ UNUSED(pub);
/* read private key file */
ret = dst__privstruct_parse(key, DST_ALG_DSA, lexer, mctx, &priv);
if (ret != ISC_R_SUCCESS)
@@ -587,6 +618,8 @@ static dst_func_t openssldsa_functions = {
openssldsa_parse,
NULL, /*%< cleanup */
NULL, /*%< fromlabel */
+ NULL, /*%< dump */
+ NULL, /*%< restore */
};
isc_result_t
diff --git a/contrib/bind9/lib/dns/opensslgost_link.c b/contrib/bind9/lib/dns/opensslgost_link.c
new file mode 100644
index 0000000..1b029db
--- /dev/null
+++ b/contrib/bind9/lib/dns/opensslgost_link.c
@@ -0,0 +1,418 @@
+/*
+ * Copyright (C) 2010, 2011 Internet Systems Consortium, Inc. ("ISC")
+ *
+ * Permission to use, copy, modify, and/or 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 ISC DISCLAIMS ALL WARRANTIES WITH
+ * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+ * AND FITNESS. IN NO EVENT SHALL ISC 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.
+ */
+
+/* $Id: opensslgost_link.c,v 1.5 2011-01-19 23:47:12 tbox Exp $ */
+
+#include <config.h>
+
+#ifdef HAVE_OPENSSL_GOST
+
+#include <isc/entropy.h>
+#include <isc/mem.h>
+#include <isc/string.h>
+#include <isc/util.h>
+
+#include <dst/result.h>
+
+#include "dst_internal.h"
+#include "dst_openssl.h"
+#include "dst_parse.h"
+
+#include <openssl/err.h>
+#include <openssl/objects.h>
+#include <openssl/rsa.h>
+#include <openssl/engine.h>
+
+static ENGINE *e = NULL;
+static const EVP_MD *opensslgost_digest;
+extern const EVP_MD *EVP_gost(void);
+
+const EVP_MD *EVP_gost(void) {
+ return (opensslgost_digest);
+}
+
+#define DST_RET(a) {ret = a; goto err;}
+
+static isc_result_t opensslgost_todns(const dst_key_t *key,
+ isc_buffer_t *data);
+
+static isc_result_t
+opensslgost_createctx(dst_key_t *key, dst_context_t *dctx) {
+ EVP_MD_CTX *evp_md_ctx;
+ const EVP_MD *md = EVP_gost();
+
+ UNUSED(key);
+
+ if (md == NULL)
+ return (DST_R_OPENSSLFAILURE);
+
+ evp_md_ctx = EVP_MD_CTX_create();
+ if (evp_md_ctx == NULL)
+ return (ISC_R_NOMEMORY);
+
+ if (!EVP_DigestInit_ex(evp_md_ctx, md, NULL)) {
+ EVP_MD_CTX_destroy(evp_md_ctx);
+ return (ISC_R_FAILURE);
+ }
+ dctx->ctxdata.evp_md_ctx = evp_md_ctx;
+
+ return (ISC_R_SUCCESS);
+}
+
+static void
+opensslgost_destroyctx(dst_context_t *dctx) {
+ EVP_MD_CTX *evp_md_ctx = dctx->ctxdata.evp_md_ctx;
+
+ if (evp_md_ctx != NULL) {
+ EVP_MD_CTX_destroy(evp_md_ctx);
+ dctx->ctxdata.evp_md_ctx = NULL;
+ }
+}
+
+static isc_result_t
+opensslgost_adddata(dst_context_t *dctx, const isc_region_t *data) {
+ EVP_MD_CTX *evp_md_ctx = dctx->ctxdata.evp_md_ctx;
+
+ if (!EVP_DigestUpdate(evp_md_ctx, data->base, data->length))
+ return (ISC_R_FAILURE);
+
+ return (ISC_R_SUCCESS);
+}
+
+static isc_result_t
+opensslgost_sign(dst_context_t *dctx, isc_buffer_t *sig) {
+ dst_key_t *key = dctx->key;
+ isc_region_t r;
+ unsigned int siglen = 0;
+ EVP_MD_CTX *evp_md_ctx = dctx->ctxdata.evp_md_ctx;
+ EVP_PKEY *pkey = key->keydata.pkey;
+
+ isc_buffer_availableregion(sig, &r);
+
+ if (r.length < (unsigned int) EVP_PKEY_size(pkey))
+ return (ISC_R_NOSPACE);
+
+ if (!EVP_SignFinal(evp_md_ctx, r.base, &siglen, pkey))
+ return (ISC_R_FAILURE);
+
+ isc_buffer_add(sig, siglen);
+
+ return (ISC_R_SUCCESS);
+}
+
+static isc_result_t
+opensslgost_verify(dst_context_t *dctx, const isc_region_t *sig) {
+ dst_key_t *key = dctx->key;
+ int status = 0;
+ EVP_MD_CTX *evp_md_ctx = dctx->ctxdata.evp_md_ctx;
+ EVP_PKEY *pkey = key->keydata.pkey;
+
+ status = EVP_VerifyFinal(evp_md_ctx, sig->base, sig->length, pkey);
+ if (status != 1)
+ return (dst__openssl_toresult(DST_R_VERIFYFAILURE));
+
+ return (ISC_R_SUCCESS);
+}
+
+static isc_boolean_t
+opensslgost_compare(const dst_key_t *key1, const dst_key_t *key2) {
+ EVP_PKEY *pkey1, *pkey2;
+
+ pkey1 = key1->keydata.pkey;
+ pkey2 = key2->keydata.pkey;
+
+ if (pkey1 == NULL && pkey2 == NULL)
+ return (ISC_TRUE);
+ else if (pkey1 == NULL || pkey2 == NULL)
+ return (ISC_FALSE);
+
+ if (EVP_PKEY_cmp(pkey1, pkey2) != 1)
+ return (ISC_FALSE);
+ return (ISC_TRUE);
+}
+
+static int
+progress_cb(EVP_PKEY_CTX *ctx)
+{
+ union {
+ void *dptr;
+ void (*fptr)(int);
+ } u;
+ int p;
+
+ u.dptr = EVP_PKEY_CTX_get_app_data(ctx);
+ p = EVP_PKEY_CTX_get_keygen_info(ctx, 0);
+ if (u.fptr != NULL)
+ u.fptr(p);
+ return (1);
+}
+
+static isc_result_t
+opensslgost_generate(dst_key_t *key, int unused, void (*callback)(int)) {
+ EVP_PKEY_CTX *ctx;
+ union {
+ void *dptr;
+ void (*fptr)(int);
+ } u;
+ EVP_PKEY *pkey = NULL;
+
+ UNUSED(unused);
+ ctx = EVP_PKEY_CTX_new_id(NID_id_GostR3410_2001, NULL);
+ if (ctx == NULL)
+ goto err;
+ if (callback != NULL) {
+ u.fptr = callback;
+ EVP_PKEY_CTX_set_app_data(ctx, u.dptr);
+ EVP_PKEY_CTX_set_cb(ctx, &progress_cb);
+ }
+ if (EVP_PKEY_keygen_init(ctx) <= 0)
+ goto err;
+ if (EVP_PKEY_CTX_ctrl_str(ctx, "paramset", "A") <= 0)
+ goto err;
+ if (EVP_PKEY_keygen(ctx, &pkey) <= 0)
+ goto err;
+ key->keydata.pkey = pkey;
+ EVP_PKEY_CTX_free(ctx);
+ return (ISC_R_SUCCESS);
+
+err:
+ if (pkey != NULL)
+ EVP_PKEY_free(pkey);
+ if (ctx != NULL)
+ EVP_PKEY_CTX_free(ctx);
+ return (dst__openssl_toresult(DST_R_OPENSSLFAILURE));
+}
+
+static isc_boolean_t
+opensslgost_isprivate(const dst_key_t *key) {
+ EVP_PKEY *pkey = key->keydata.pkey;
+ EC_KEY *ec;
+
+ INSIST(pkey != NULL);
+
+ ec = EVP_PKEY_get0(pkey);
+ return (ISC_TF(ec != NULL && EC_KEY_get0_private_key(ec) != NULL));
+}
+
+static void
+opensslgost_destroy(dst_key_t *key) {
+ EVP_PKEY *pkey = key->keydata.pkey;
+
+ EVP_PKEY_free(pkey);
+ key->keydata.pkey = NULL;
+}
+
+unsigned char gost_prefix[37] = {
+ 0x30, 0x63, 0x30, 0x1c, 0x06, 0x06, 0x2a, 0x85,
+ 0x03, 0x02, 0x02, 0x13, 0x30, 0x12, 0x06, 0x07,
+ 0x2a, 0x85, 0x03, 0x02, 0x02, 0x23, 0x01, 0x06,
+ 0x07, 0x2a, 0x85, 0x03, 0x02, 0x02, 0x1e, 0x01,
+ 0x03, 0x43, 0x00, 0x04, 0x40
+};
+
+static isc_result_t
+opensslgost_todns(const dst_key_t *key, isc_buffer_t *data) {
+ EVP_PKEY *pkey;
+ isc_region_t r;
+ unsigned char der[37 + 64], *p;
+ int len;
+
+ REQUIRE(key->keydata.pkey != NULL);
+
+ pkey = key->keydata.pkey;
+
+ isc_buffer_availableregion(data, &r);
+ if (r.length < 64)
+ return (ISC_R_NOSPACE);
+
+ p = der;
+ len = i2d_PUBKEY(pkey, &p);
+ INSIST(len == sizeof(der));
+ INSIST(memcmp(gost_prefix, der, 37) == 0);
+ memcpy(r.base, der + 37, 64);
+ isc_buffer_add(data, 64);
+
+ return (ISC_R_SUCCESS);
+}
+
+static isc_result_t
+opensslgost_fromdns(dst_key_t *key, isc_buffer_t *data) {
+ isc_region_t r;
+ EVP_PKEY *pkey = NULL;
+ unsigned char der[37 + 64];
+ const unsigned char *p;
+
+ isc_buffer_remainingregion(data, &r);
+ if (r.length == 0)
+ return (ISC_R_SUCCESS);
+
+ if (r.length != 64)
+ return (DST_R_INVALIDPUBLICKEY);
+ memcpy(der, gost_prefix, 37);
+ memcpy(der + 37, r.base, 64);
+ isc_buffer_forward(data, 64);
+
+ p = der;
+ if (d2i_PUBKEY(&pkey, &p, (long) sizeof(der)) == NULL)
+ return (dst__openssl_toresult(DST_R_OPENSSLFAILURE));
+ key->keydata.pkey = pkey;
+
+ return (ISC_R_SUCCESS);
+}
+
+static isc_result_t
+opensslgost_tofile(const dst_key_t *key, const char *directory) {
+ EVP_PKEY *pkey;
+ dst_private_t priv;
+ isc_result_t result;
+ unsigned char *der, *p;
+ int len;
+
+ if (key->keydata.pkey == NULL)
+ return (DST_R_NULLKEY);
+
+ pkey = key->keydata.pkey;
+
+ len = i2d_PrivateKey(pkey, NULL);
+ der = isc_mem_get(key->mctx, (size_t) len);
+ if (der == NULL)
+ return (ISC_R_NOMEMORY);
+
+ p = der;
+ if (i2d_PrivateKey(pkey, &p) != len) {
+ result = dst__openssl_toresult(DST_R_OPENSSLFAILURE);
+ goto fail;
+ }
+
+ priv.elements[0].tag = TAG_GOST_PRIVASN1;
+ priv.elements[0].length = len;
+ priv.elements[0].data = der;
+ priv.nelements = GOST_NTAGS;
+
+ result = dst__privstruct_writefile(key, &priv, directory);
+ fail:
+ if (der != NULL)
+ isc_mem_put(key->mctx, der, (size_t) len);
+ return (result);
+}
+
+static isc_result_t
+opensslgost_parse(dst_key_t *key, isc_lex_t *lexer, dst_key_t *pub) {
+ dst_private_t priv;
+ isc_result_t ret;
+ isc_mem_t *mctx = key->mctx;
+ EVP_PKEY *pkey = NULL;
+ const unsigned char *p;
+
+ UNUSED(pub);
+
+ /* read private key file */
+ ret = dst__privstruct_parse(key, DST_ALG_ECCGOST, lexer, mctx, &priv);
+ if (ret != ISC_R_SUCCESS)
+ return (ret);
+
+ INSIST(priv.elements[0].tag == TAG_GOST_PRIVASN1);
+ p = priv.elements[0].data;
+ if (d2i_PrivateKey(NID_id_GostR3410_2001, &pkey, &p,
+ (long) priv.elements[0].length) == NULL)
+ DST_RET(DST_R_INVALIDPRIVATEKEY);
+ key->keydata.pkey = pkey;
+ key->key_size = EVP_PKEY_bits(pkey);
+ dst__privstruct_free(&priv, mctx);
+ memset(&priv, 0, sizeof(priv));
+ return (ISC_R_SUCCESS);
+
+ err:
+ if (pkey != NULL)
+ EVP_PKEY_free(pkey);
+ opensslgost_destroy(key);
+ dst__privstruct_free(&priv, mctx);
+ memset(&priv, 0, sizeof(priv));
+ return (ret);
+}
+
+static void
+opensslgost_cleanup(void) {
+ if (e != NULL) {
+ ENGINE_finish(e);
+ ENGINE_free(e);
+ e = NULL;
+ }
+}
+
+static dst_func_t opensslgost_functions = {
+ opensslgost_createctx,
+ opensslgost_destroyctx,
+ opensslgost_adddata,
+ opensslgost_sign,
+ opensslgost_verify,
+ NULL, /*%< computesecret */
+ opensslgost_compare,
+ NULL, /*%< paramcompare */
+ opensslgost_generate,
+ opensslgost_isprivate,
+ opensslgost_destroy,
+ opensslgost_todns,
+ opensslgost_fromdns,
+ opensslgost_tofile,
+ opensslgost_parse,
+ opensslgost_cleanup,
+ NULL, /*%< fromlabel */
+ NULL, /*%< dump */
+ NULL /*%< restore */
+};
+
+isc_result_t
+dst__opensslgost_init(dst_func_t **funcp) {
+ REQUIRE(funcp != NULL);
+
+ /* check if the gost engine works properly */
+ e = ENGINE_by_id("gost");
+ if (e == NULL)
+ return (DST_R_OPENSSLFAILURE);
+ if (ENGINE_init(e) <= 0) {
+ ENGINE_free(e);
+ e = NULL;
+ return (DST_R_OPENSSLFAILURE);
+ }
+ /* better than to rely on digest_gost symbol */
+ opensslgost_digest = ENGINE_get_digest(e, NID_id_GostR3411_94);
+ /* from openssl.cnf */
+ if ((opensslgost_digest == NULL) ||
+ (ENGINE_register_pkey_asn1_meths(e) <= 0) ||
+ (ENGINE_ctrl_cmd_string(e,
+ "CRYPT_PARAMS",
+ "id-Gost28147-89-CryptoPro-A-ParamSet",
+ 0) <= 0)) {
+ ENGINE_finish(e);
+ ENGINE_free(e);
+ e = NULL;
+ return (DST_R_OPENSSLFAILURE);
+ }
+
+ if (*funcp == NULL)
+ *funcp = &opensslgost_functions;
+ return (ISC_R_SUCCESS);
+}
+
+#else /* HAVE_OPENSSL_GOST */
+
+#include <isc/util.h>
+
+EMPTY_TRANSLATION_UNIT
+
+#endif /* HAVE_OPENSSL_GOST */
+/*! \file */
diff --git a/contrib/bind9/lib/dns/opensslrsa_link.c b/contrib/bind9/lib/dns/opensslrsa_link.c
index 1e3c5c2..fcdc9f0 100644
--- a/contrib/bind9/lib/dns/opensslrsa_link.c
+++ b/contrib/bind9/lib/dns/opensslrsa_link.c
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004-2010 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004-2009, 2011 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 2000-2003 Internet Software Consortium.
*
* Permission to use, copy, modify, and/or distribute this software for any
@@ -17,7 +17,7 @@
/*
* Principal Author: Brian Wellington
- * $Id: opensslrsa_link.c,v 1.20.50.8 2010-01-22 02:36:49 marka Exp $
+ * $Id: opensslrsa_link.c,v 1.39 2011-01-11 23:47:13 tbox Exp $
*/
#ifdef OPENSSL
#include <config.h>
@@ -30,6 +30,7 @@
#endif
#endif
+
#include <isc/entropy.h>
#include <isc/md5.h>
#include <isc/sha1.h>
@@ -368,7 +369,7 @@ opensslrsa_sign(dst_context_t *dctx, isc_buffer_t *sig) {
RSA *rsa = key->keydata.rsa;
/* note: ISC_SHA512_DIGESTLENGTH >= ISC_*_DIGESTLENGTH */
unsigned char digest[PREFIXLEN + ISC_SHA512_DIGESTLENGTH];
- int status = 0;
+ int status;
int type = 0;
unsigned int digestlen = 0;
char *message;
@@ -703,10 +704,32 @@ opensslrsa_compare(const dst_key_t *key1, const dst_key_t *key2) {
return (ISC_TRUE);
}
+#if OPENSSL_VERSION_NUMBER > 0x00908000L
+static int
+progress_cb(int p, int n, BN_GENCB *cb)
+{
+ union {
+ void *dptr;
+ void (*fptr)(int);
+ } u;
+
+ UNUSED(n);
+
+ u.dptr = cb->arg;
+ if (u.fptr != NULL)
+ u.fptr(p);
+ return (1);
+}
+#endif
+
static isc_result_t
-opensslrsa_generate(dst_key_t *key, int exp) {
+opensslrsa_generate(dst_key_t *key, int exp, void (*callback)(int)) {
#if OPENSSL_VERSION_NUMBER > 0x00908000L
BN_GENCB cb;
+ union {
+ void *dptr;
+ void (*fptr)(int);
+ } u;
RSA *rsa = RSA_new();
BIGNUM *e = BN_new();
#if USE_EVP
@@ -732,7 +755,12 @@ opensslrsa_generate(dst_key_t *key, int exp) {
BN_set_bit(e, 32);
}
- BN_GENCB_set_old(&cb, NULL, NULL);
+ if (callback == NULL) {
+ BN_GENCB_set_old(&cb, NULL, NULL);
+ } else {
+ u.fptr = callback;
+ BN_GENCB_set(&cb, &progress_cb, u.dptr);
+ }
if (RSA_generate_key_ex(rsa, key->key_size, e, &cb)) {
BN_free(e);
@@ -763,8 +791,12 @@ err:
#if USE_EVP
EVP_PKEY *pkey = EVP_PKEY_new();
+ UNUSED(callback);
+
if (pkey == NULL)
return (ISC_R_NOMEMORY);
+#else
+ UNUSED(callback);
#endif
if (exp == 0)
@@ -1059,8 +1091,9 @@ opensslrsa_tofile(const dst_key_t *key, const char *directory) {
i++;
}
+
priv.nelements = i;
- result = dst__privstruct_writefile(key, &priv, directory);
+ result = dst__privstruct_writefile(key, &priv, directory);
fail:
#if USE_EVP
RSA_free(rsa);
@@ -1074,16 +1107,52 @@ opensslrsa_tofile(const dst_key_t *key, const char *directory) {
}
static isc_result_t
-opensslrsa_parse(dst_key_t *key, isc_lex_t *lexer) {
+rsa_check(RSA *rsa, RSA *pub)
+{
+ /* Public parameters should be the same but if they are not set
+ * copy them from the public key. */
+ if (pub != NULL) {
+ if (rsa->n != NULL) {
+ if (BN_cmp(rsa->n, pub->n) != 0)
+ return (DST_R_INVALIDPRIVATEKEY);
+ } else {
+ rsa->n = pub->n;
+ pub->n = NULL;
+ }
+ if (rsa->e != NULL) {
+ if (BN_cmp(rsa->e, pub->e) != 0)
+ return (DST_R_INVALIDPRIVATEKEY);
+ } else {
+ rsa->e = pub->e;
+ pub->e = NULL;
+ }
+ }
+ if (rsa->n == NULL || rsa->e == NULL)
+ return (DST_R_INVALIDPRIVATEKEY);
+ return (ISC_R_SUCCESS);
+}
+
+static isc_result_t
+opensslrsa_parse(dst_key_t *key, isc_lex_t *lexer, dst_key_t *pub) {
dst_private_t priv;
isc_result_t ret;
int i;
- RSA *rsa = NULL;
+ RSA *rsa = NULL, *pubrsa = NULL;
ENGINE *e = NULL;
isc_mem_t *mctx = key->mctx;
- const char *name = NULL, *label = NULL;
+ const char *engine = NULL, *label = NULL;
EVP_PKEY *pkey = NULL;
+#if USE_EVP
+ if (pub != NULL && pub->keydata.pkey != NULL)
+ pubrsa = EVP_PKEY_get1_RSA(pub->keydata.pkey);
+#else
+ if (pub != NULL && pub->keydata.rsa != NULL) {
+ pubrsa = pub->keydata.rsa;
+ pub->keydata.rsa = NULL;
+ }
+#endif
+
/* read private key file */
ret = dst__privstruct_parse(key, DST_ALG_RSA, lexer, mctx, &priv);
if (ret != ISC_R_SUCCESS)
@@ -1092,7 +1161,7 @@ opensslrsa_parse(dst_key_t *key, isc_lex_t *lexer) {
for (i = 0; i < priv.nelements; i++) {
switch (priv.elements[i].tag) {
case TAG_RSA_ENGINE:
- name = (char *)priv.elements[i].data;
+ engine = (char *)priv.elements[i].data;
break;
case TAG_RSA_LABEL:
label = (char *)priv.elements[i].data;
@@ -1105,10 +1174,10 @@ opensslrsa_parse(dst_key_t *key, isc_lex_t *lexer) {
* Is this key is stored in a HSM?
* See if we can fetch it.
*/
- if (name != NULL || label != NULL) {
- INSIST(name != NULL);
- INSIST(label != NULL);
- e = dst__openssl_getengine(name);
+ if (label != NULL) {
+ if (engine == NULL)
+ DST_RET(DST_R_NOENGINE);
+ e = dst__openssl_getengine(engine);
if (e == NULL)
DST_RET(DST_R_NOENGINE);
pkey = ENGINE_load_private_key(e, label, NULL, NULL);
@@ -1116,22 +1185,29 @@ opensslrsa_parse(dst_key_t *key, isc_lex_t *lexer) {
/* ERR_print_errors_fp(stderr); */
DST_RET(ISC_R_NOTFOUND);
}
- key->engine = isc_mem_strdup(key->mctx, name);
+ key->engine = isc_mem_strdup(key->mctx, engine);
if (key->engine == NULL)
DST_RET(ISC_R_NOMEMORY);
key->label = isc_mem_strdup(key->mctx, label);
if (key->label == NULL)
DST_RET(ISC_R_NOMEMORY);
+ rsa = EVP_PKEY_get1_RSA(pkey);
+ if (rsa == NULL)
+ DST_RET(dst__openssl_toresult(DST_R_OPENSSLFAILURE));
+ if (rsa_check(rsa, pubrsa) != ISC_R_SUCCESS)
+ DST_RET(DST_R_INVALIDPRIVATEKEY);
+ if (pubrsa != NULL)
+ RSA_free(pubrsa);
key->key_size = EVP_PKEY_bits(pkey);
#if USE_EVP
key->keydata.pkey = pkey;
+ RSA_free(rsa);
#else
- key->keydata.rsa = EVP_PKEY_get1_RSA(pkey);
- if (rsa == NULL)
- DST_RET(dst__openssl_toresult(DST_R_OPENSSLFAILURE));
+ key->keydata.rsa = rsa;
EVP_PKEY_free(pkey);
#endif
dst__privstruct_free(&priv, mctx);
+ memset(&priv, 0, sizeof(priv));
return (ISC_R_SUCCESS);
}
@@ -1144,9 +1220,8 @@ opensslrsa_parse(dst_key_t *key, isc_lex_t *lexer) {
pkey = EVP_PKEY_new();
if (pkey == NULL)
DST_RET(ISC_R_NOMEMORY);
- if (!EVP_PKEY_set1_RSA(pkey, rsa)) {
+ if (!EVP_PKEY_set1_RSA(pkey, rsa))
DST_RET(ISC_R_FAILURE);
- }
key->keydata.pkey = pkey;
#else
key->keydata.rsa = rsa;
@@ -1196,8 +1271,13 @@ opensslrsa_parse(dst_key_t *key, isc_lex_t *lexer) {
}
}
dst__privstruct_free(&priv, mctx);
+ memset(&priv, 0, sizeof(priv));
+ if (rsa_check(rsa, pubrsa) != ISC_R_SUCCESS)
+ DST_RET(DST_R_INVALIDPRIVATEKEY);
key->key_size = BN_num_bits(rsa->n);
+ if (pubrsa != NULL)
+ RSA_free(pubrsa);
#if USE_EVP
RSA_free(rsa);
#endif
@@ -1211,6 +1291,8 @@ opensslrsa_parse(dst_key_t *key, isc_lex_t *lexer) {
#endif
if (rsa != NULL)
RSA_free(rsa);
+ if (pubrsa != NULL)
+ RSA_free(pubrsa);
opensslrsa_destroy(key);
dst__privstruct_free(&priv, mctx);
memset(&priv, 0, sizeof(priv));
@@ -1224,33 +1306,63 @@ opensslrsa_fromlabel(dst_key_t *key, const char *engine, const char *label,
ENGINE *e = NULL;
isc_result_t ret;
EVP_PKEY *pkey = NULL;
+ RSA *rsa = NULL, *pubrsa = NULL;
+ char *colon;
UNUSED(pin);
+ if (engine == NULL)
+ DST_RET(DST_R_NOENGINE);
e = dst__openssl_getengine(engine);
if (e == NULL)
DST_RET(DST_R_NOENGINE);
+ pkey = ENGINE_load_public_key(e, label, NULL, NULL);
+ if (pkey != NULL) {
+ pubrsa = EVP_PKEY_get1_RSA(pkey);
+ EVP_PKEY_free(pkey);
+ if (pubrsa == NULL)
+ DST_RET(dst__openssl_toresult(DST_R_OPENSSLFAILURE));
+ }
pkey = ENGINE_load_private_key(e, label, NULL, NULL);
if (pkey == NULL)
DST_RET(ISC_R_NOTFOUND);
- key->engine = isc_mem_strdup(key->mctx, label);
- if (key->engine == NULL)
- DST_RET(ISC_R_NOMEMORY);
+ if (engine != NULL) {
+ key->engine = isc_mem_strdup(key->mctx, engine);
+ if (key->engine == NULL)
+ DST_RET(ISC_R_NOMEMORY);
+ } else {
+ key->engine = isc_mem_strdup(key->mctx, label);
+ if (key->engine == NULL)
+ DST_RET(ISC_R_NOMEMORY);
+ colon = strchr(key->engine, ':');
+ if (colon != NULL)
+ *colon = '\0';
+ }
key->label = isc_mem_strdup(key->mctx, label);
if (key->label == NULL)
DST_RET(ISC_R_NOMEMORY);
+ rsa = EVP_PKEY_get1_RSA(pkey);
+ if (rsa == NULL)
+ DST_RET(dst__openssl_toresult(DST_R_OPENSSLFAILURE));
+ if (rsa_check(rsa, pubrsa) != ISC_R_SUCCESS)
+ DST_RET(DST_R_INVALIDPRIVATEKEY);
+ if (pubrsa != NULL)
+ RSA_free(pubrsa);
key->key_size = EVP_PKEY_bits(pkey);
#if USE_EVP
key->keydata.pkey = pkey;
+ RSA_free(rsa);
#else
- key->keydata.rsa = EVP_PKEY_get1_RSA(pkey);
+ key->keydata.rsa = rsa;
EVP_PKEY_free(pkey);
- if (key->keydata.rsa == NULL)
- return (dst__openssl_toresult(DST_R_OPENSSLFAILURE));
#endif
return (ISC_R_SUCCESS);
err:
+ if (rsa != NULL)
+ RSA_free(rsa);
+ if (pubrsa != NULL)
+ RSA_free(pubrsa);
if (pkey != NULL)
EVP_PKEY_free(pkey);
return (ret);
@@ -1274,6 +1386,8 @@ static dst_func_t opensslrsa_functions = {
opensslrsa_parse,
NULL, /*%< cleanup */
opensslrsa_fromlabel,
+ NULL, /*%< dump */
+ NULL, /*%< restore */
};
isc_result_t
diff --git a/contrib/bind9/lib/dns/peer.c b/contrib/bind9/lib/dns/peer.c
index 1e81023..3851c3e 100644
--- a/contrib/bind9/lib/dns/peer.c
+++ b/contrib/bind9/lib/dns/peer.c
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004-2008 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004-2009 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 2000, 2001, 2003 Internet Software Consortium.
*
* Permission to use, copy, modify, and/or distribute this software for any
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: peer.c,v 1.31 2008-04-03 06:09:04 tbox Exp $ */
+/* $Id: peer.c,v 1.33 2009-09-02 23:48:02 tbox Exp $ */
/*! \file */
@@ -536,7 +536,7 @@ dns_peer_setkeybycharp(dns_peer_t *peer, const char *keyval) {
isc_buffer_init(&b, keyval, strlen(keyval));
isc_buffer_add(&b, strlen(keyval));
result = dns_name_fromtext(dns_fixedname_name(&fname), &b,
- dns_rootname, ISC_FALSE, NULL);
+ dns_rootname, 0, NULL);
if (result != ISC_R_SUCCESS)
return (result);
diff --git a/contrib/bind9/lib/dns/private.c b/contrib/bind9/lib/dns/private.c
new file mode 100644
index 0000000..ba3e8ed
--- /dev/null
+++ b/contrib/bind9/lib/dns/private.c
@@ -0,0 +1,295 @@
+/*
+ * Copyright (C) 2009 Internet Systems Consortium, Inc. ("ISC")
+ *
+ * Permission to use, copy, modify, and/or 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 ISC DISCLAIMS ALL WARRANTIES WITH
+ * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+ * AND FITNESS. IN NO EVENT SHALL ISC 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.
+ */
+
+/* $Id: private.c,v 1.3 2009-10-09 23:48:09 tbox Exp $ */
+
+#include "config.h"
+
+#include <isc/result.h>
+#include <isc/string.h>
+#include <isc/types.h>
+#include <isc/base64.h>
+
+#include <dns/nsec3.h>
+#include <dns/private.h>
+
+/*
+ * We need to build the relevant chain if there exists a NSEC/NSEC3PARAM
+ * at the apex; normally only one or the other of NSEC/NSEC3PARAM will exist.
+ *
+ * If a NSEC3PARAM RRset exists then we will need to build a NSEC chain
+ * if all the NSEC3PARAM records (and associated chains) are slated for
+ * destruction and we have not been told to NOT build the NSEC chain.
+ *
+ * If the NSEC set exist then check to see if there is a request to create
+ * a NSEC3 chain.
+ *
+ * If neither NSEC/NSEC3PARAM RRsets exist at the origin and the private
+ * type exists then we need to examine it to determine if NSEC3 chain has
+ * been requested to be built otherwise a NSEC chain needs to be built.
+ */
+
+#define REMOVE(x) (((x) & DNS_NSEC3FLAG_REMOVE) != 0)
+#define CREATE(x) (((x) & DNS_NSEC3FLAG_CREATE) != 0)
+#define NONSEC(x) (((x) & DNS_NSEC3FLAG_NONSEC) != 0)
+
+#define CHECK(x) do { \
+ result = (x); \
+ if (result != ISC_R_SUCCESS) \
+ goto failure; \
+ } while (0)
+
+/*
+ * Work out if 'param' should be ignored or not (i.e. it is in the process
+ * of being removed).
+ *
+ * Note: we 'belt-and-braces' here by also checking for a CREATE private
+ * record and keep the param record in this case.
+ */
+
+static isc_boolean_t
+ignore(dns_rdata_t *param, dns_rdataset_t *privateset) {
+ isc_result_t result;
+
+ for (result = dns_rdataset_first(privateset);
+ result == ISC_R_SUCCESS;
+ result = dns_rdataset_next(privateset)) {
+ unsigned char buf[DNS_NSEC3PARAM_BUFFERSIZE];
+ dns_rdata_t private = DNS_RDATA_INIT;
+ dns_rdata_t rdata = DNS_RDATA_INIT;
+
+ dns_rdataset_current(privateset, &private);
+ if (!dns_nsec3param_fromprivate(&private, &rdata,
+ buf, sizeof(buf)))
+ continue;
+ /*
+ * We are going to create a new NSEC3 chain so it
+ * doesn't matter if we are removing this one.
+ */
+ if (CREATE(rdata.data[1]))
+ return (ISC_FALSE);
+ if (rdata.data[0] != param->data[0] ||
+ rdata.data[2] != param->data[2] ||
+ rdata.data[3] != param->data[3] ||
+ rdata.data[4] != param->data[4] ||
+ memcmp(&rdata.data[5], &param->data[5], param->data[4]))
+ continue;
+ /*
+ * The removal of this NSEC3 chain does NOT cause a
+ * NSEC chain to be created so we don't need to tell
+ * the caller that it will be removed.
+ */
+ if (NONSEC(rdata.data[1]))
+ return (ISC_FALSE);
+ return (ISC_TRUE);
+ }
+ return (ISC_FALSE);
+}
+
+isc_result_t
+dns_private_chains(dns_db_t *db, dns_dbversion_t *ver,
+ dns_rdatatype_t privatetype,
+ isc_boolean_t *build_nsec, isc_boolean_t *build_nsec3)
+{
+ dns_dbnode_t *node;
+ dns_rdataset_t nsecset, nsec3paramset, privateset;
+ isc_boolean_t nsec3chain;
+ isc_boolean_t signing;
+ isc_result_t result;
+ unsigned char buf[DNS_NSEC3PARAM_BUFFERSIZE];
+ unsigned int count;
+
+ node = NULL;
+ dns_rdataset_init(&nsecset);
+ dns_rdataset_init(&nsec3paramset);
+ dns_rdataset_init(&privateset);
+
+ CHECK(dns_db_getoriginnode(db, &node));
+
+ result = dns_db_findrdataset(db, node, ver, dns_rdatatype_nsec,
+ 0, (isc_stdtime_t) 0, &nsecset, NULL);
+
+ if (result != ISC_R_SUCCESS && result != ISC_R_NOTFOUND)
+ goto failure;
+
+ result = dns_db_findrdataset(db, node, ver, dns_rdatatype_nsec3param,
+ 0, (isc_stdtime_t) 0, &nsec3paramset,
+ NULL);
+ if (result != ISC_R_SUCCESS && result != ISC_R_NOTFOUND)
+ goto failure;
+
+ if (dns_rdataset_isassociated(&nsecset) &&
+ dns_rdataset_isassociated(&nsec3paramset)) {
+ if (build_nsec != NULL)
+ *build_nsec = ISC_TRUE;
+ if (build_nsec3 != NULL)
+ *build_nsec3 = ISC_TRUE;
+ goto success;
+ }
+
+ if (privatetype != (dns_rdatatype_t)0) {
+ result = dns_db_findrdataset(db, node, ver, privatetype,
+ 0, (isc_stdtime_t) 0,
+ &privateset, NULL);
+ if (result != ISC_R_SUCCESS && result != ISC_R_NOTFOUND)
+ goto failure;
+ }
+
+ /*
+ * Look to see if we also need to be creating a NSEC3 chains.
+ */
+ if (dns_rdataset_isassociated(&nsecset)) {
+ if (build_nsec != NULL)
+ *build_nsec = ISC_TRUE;
+ if (build_nsec3 != NULL)
+ *build_nsec3 = ISC_FALSE;
+ if (!dns_rdataset_isassociated(&privateset))
+ goto success;
+ for (result = dns_rdataset_first(&privateset);
+ result == ISC_R_SUCCESS;
+ result = dns_rdataset_next(&privateset)) {
+ unsigned char buf[DNS_NSEC3PARAM_BUFFERSIZE];
+ dns_rdata_t private = DNS_RDATA_INIT;
+ dns_rdata_t rdata = DNS_RDATA_INIT;
+
+ dns_rdataset_current(&privateset, &private);
+ if (!dns_nsec3param_fromprivate(&private, &rdata,
+ buf, sizeof(buf)))
+ continue;
+ if (REMOVE(rdata.data[1]))
+ continue;
+ if (build_nsec3 != NULL)
+ *build_nsec3 = ISC_TRUE;
+ break;
+ }
+ goto success;
+ }
+
+ if (dns_rdataset_isassociated(&nsec3paramset)) {
+ if (build_nsec3 != NULL)
+ *build_nsec3 = ISC_TRUE;
+ if (build_nsec != NULL)
+ *build_nsec = ISC_FALSE;
+ if (!dns_rdataset_isassociated(&privateset))
+ goto success;
+ /*
+ * If we are in the process of building a new NSEC3 chain
+ * then we don't need to build a NSEC chain.
+ */
+ for (result = dns_rdataset_first(&privateset);
+ result == ISC_R_SUCCESS;
+ result = dns_rdataset_next(&privateset)) {
+ dns_rdata_t private = DNS_RDATA_INIT;
+ dns_rdata_t rdata = DNS_RDATA_INIT;
+
+ dns_rdataset_current(&privateset, &private);
+ if (!dns_nsec3param_fromprivate(&private, &rdata,
+ buf, sizeof(buf)))
+ continue;
+ if (CREATE(rdata.data[1]))
+ goto success;
+ }
+
+ /*
+ * Check to see if there will be a active NSEC3CHAIN once
+ * the changes queued complete.
+ */
+ count = 0;
+ for (result = dns_rdataset_first(&nsec3paramset);
+ result == ISC_R_SUCCESS;
+ result = dns_rdataset_next(&nsec3paramset)) {
+ dns_rdata_t rdata = DNS_RDATA_INIT;
+
+ /*
+ * If there is more that one NSEC3 chain present then
+ * we don't need to construct a NSEC chain.
+ */
+ if (++count > 1)
+ goto success;
+ dns_rdataset_current(&nsec3paramset, &rdata);
+ if (ignore(&rdata, &privateset))
+ continue;
+ /*
+ * We still have a good NSEC3 chain or we are
+ * not creating a NSEC chain as NONSEC is set.
+ */
+ goto success;
+ }
+
+ /*
+ * The last NSEC3 chain is being removed and does not have
+ * have NONSEC set.
+ */
+ if (build_nsec != NULL)
+ *build_nsec = ISC_TRUE;
+ goto success;
+ }
+
+ if (build_nsec != NULL)
+ *build_nsec = ISC_FALSE;
+ if (build_nsec3 != NULL)
+ *build_nsec3 = ISC_FALSE;
+ if (!dns_rdataset_isassociated(&privateset))
+ goto success;
+
+ signing = ISC_FALSE;
+ nsec3chain = ISC_FALSE;
+
+ for (result = dns_rdataset_first(&privateset);
+ result == ISC_R_SUCCESS;
+ result = dns_rdataset_next(&privateset)) {
+ dns_rdata_t rdata = DNS_RDATA_INIT;
+ dns_rdata_t private = DNS_RDATA_INIT;
+
+ dns_rdataset_current(&privateset, &private);
+ if (!dns_nsec3param_fromprivate(&private, &rdata,
+ buf, sizeof(buf))) {
+ /*
+ * Look for record that says we are signing the
+ * zone with a key.
+ */
+ if (private.length == 5 && private.data[0] != 0 &&
+ private.data[3] == 0 && private.data[4] == 0)
+ signing = ISC_TRUE;
+ } else {
+ if (CREATE(rdata.data[1]))
+ nsec3chain = ISC_TRUE;
+ }
+ }
+
+ if (signing) {
+ if (nsec3chain) {
+ if (build_nsec3 != NULL)
+ *build_nsec3 = ISC_TRUE;
+ } else {
+ if (build_nsec != NULL)
+ *build_nsec = ISC_TRUE;
+ }
+ }
+
+ success:
+ result = ISC_R_SUCCESS;
+ failure:
+ if (dns_rdataset_isassociated(&nsecset))
+ dns_rdataset_disassociate(&nsecset);
+ if (dns_rdataset_isassociated(&nsec3paramset))
+ dns_rdataset_disassociate(&nsec3paramset);
+ if (dns_rdataset_isassociated(&privateset))
+ dns_rdataset_disassociate(&privateset);
+ if (node != NULL)
+ dns_db_detachnode(db, &node);
+ return (result);
+}
diff --git a/contrib/bind9/lib/dns/rbt.c b/contrib/bind9/lib/dns/rbt.c
index 5e09db3..6c14e8e 100644
--- a/contrib/bind9/lib/dns/rbt.c
+++ b/contrib/bind9/lib/dns/rbt.c
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: rbt.c,v 1.142.50.3 2009-10-20 05:06:04 marka Exp $ */
+/* $Id: rbt.c,v 1.146 2009-10-27 04:46:58 marka Exp $ */
/*! \file */
@@ -537,7 +537,10 @@ dns_rbt_addnode(dns_rbt_t *rbt, dns_name_t *name, dns_rbtnode_t **nodep) {
* current node.
*/
new_current->is_root = current->is_root;
- new_current->nsec3 = current->nsec3;
+ if (current->nsec == DNS_RBT_NSEC_HAS_NSEC)
+ new_current->nsec = DNS_RBT_NSEC_NORMAL;
+ else
+ new_current->nsec = current->nsec;
PARENT(new_current) = PARENT(current);
LEFT(new_current) = LEFT(current);
RIGHT(new_current) = RIGHT(current);
@@ -1451,7 +1454,7 @@ create_node(isc_mem_t *mctx, dns_name_t *name, dns_rbtnode_t **nodep) {
DIRTY(node) = 0;
dns_rbtnode_refinit(node, 0);
node->find_callback = 0;
- node->nsec3 = 0;
+ node->nsec = DNS_RBT_NSEC_NORMAL;
MAKE_BLACK(node);
diff --git a/contrib/bind9/lib/dns/rbtdb.c b/contrib/bind9/lib/dns/rbtdb.c
index 8932a17..d4415d8 100644
--- a/contrib/bind9/lib/dns/rbtdb.c
+++ b/contrib/bind9/lib/dns/rbtdb.c
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004-2010 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004-2011 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 1999-2003 Internet Software Consortium.
*
* Permission to use, copy, modify, and/or distribute this software for any
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: rbtdb.c,v 1.270.12.26 2010-12-02 05:09:58 marka Exp $ */
+/* $Id: rbtdb.c,v 1.310.8.1.2.1 2011-06-21 20:15:48 each Exp $ */
/*! \file */
@@ -53,6 +53,7 @@
#include <dns/nsec.h>
#include <dns/nsec3.h>
#include <dns/rbt.h>
+#include <dns/rpz.h>
#include <dns/rdata.h>
#include <dns/rdataset.h>
#include <dns/rdatasetiter.h>
@@ -278,6 +279,7 @@ typedef ISC_LIST(dns_rbtnode_t) rbtnodelist_t;
#define RDATASET_ATTR_RESIGN 0x0020
#define RDATASET_ATTR_STATCOUNT 0x0040
#define RDATASET_ATTR_OPTOUT 0x0080
+#define RDATASET_ATTR_NEGATIVE 0x0100
typedef struct acache_cbarg {
dns_rdatasetadditional_t type;
@@ -316,6 +318,8 @@ struct acachectl {
(((header)->attributes & RDATASET_ATTR_RESIGN) != 0)
#define OPTOUT(header) \
(((header)->attributes & RDATASET_ATTR_OPTOUT) != 0)
+#define NEGATIVE(header) \
+ (((header)->attributes & RDATASET_ATTR_NEGATIVE) != 0)
#define DEFAULT_NODE_LOCK_COUNT 7 /*%< Should be prime. */
@@ -391,12 +395,15 @@ typedef ISC_LIST(rbtdb_version_t) rbtdb_versionlist_t;
typedef struct {
/* Unlocked. */
dns_db_t common;
+ /* Locks the data in this struct */
#if DNS_RBTDB_USERWLOCK
isc_rwlock_t lock;
#else
isc_mutex_t lock;
#endif
+ /* Locks the tree structure (prevents nodes appearing/disappearing) */
isc_rwlock_t tree_lock;
+ /* Locks for individual tree nodes */
unsigned int node_lock_count;
rbtdb_nodelock_t * node_locks;
dns_rbtnode_t * origin_node;
@@ -435,7 +442,9 @@ typedef struct {
/* Locked by tree_lock. */
dns_rbt_t * tree;
+ dns_rbt_t * nsec;
dns_rbt_t * nsec3;
+ dns_rpz_cidr_t * rpz_cidr;
/* Unlocked */
unsigned int quantum;
@@ -615,8 +624,9 @@ typedef struct rbtdb_dbiterator {
static void free_rbtdb(dns_rbtdb_t *rbtdb, isc_boolean_t log,
isc_event_t *event);
static void overmem(dns_db_t *db, isc_boolean_t overmem);
-static void setnsec3parameters(dns_db_t *db, rbtdb_version_t *version,
- isc_boolean_t *nsec3createflag);
+#ifdef BIND9
+static void setnsec3parameters(dns_db_t *db, rbtdb_version_t *version);
+#endif
/*%
* 'init_count' is used to initialize 'newheader->count' which inturn
@@ -689,11 +699,13 @@ update_rrsetstats(dns_rbtdb_t *rbtdb, rdatasetheader_t *header,
/* At the moment we count statistics only for cache DB */
INSIST(IS_CACHE(rbtdb));
- if (NXDOMAIN(header))
- statattributes = DNS_RDATASTATSTYPE_ATTR_NXDOMAIN;
- else if (RBTDB_RDATATYPE_BASE(header->type) == 0) {
- statattributes = DNS_RDATASTATSTYPE_ATTR_NXRRSET;
- base = RBTDB_RDATATYPE_EXT(header->type);
+ if (NEGATIVE(header)) {
+ if (NXDOMAIN(header))
+ statattributes = DNS_RDATASTATSTYPE_ATTR_NXDOMAIN;
+ else {
+ statattributes = DNS_RDATASTATSTYPE_ATTR_NXRRSET;
+ base = RBTDB_RDATATYPE_EXT(header->type);
+ }
} else
base = RBTDB_RDATATYPE_BASE(header->type);
@@ -822,6 +834,7 @@ free_rbtdb(dns_rbtdb_t *rbtdb, isc_boolean_t log, isc_event_t *event) {
isc_ondestroy_t ondest;
isc_result_t result;
char buf[DNS_NAME_FORMATSIZE];
+ dns_rbt_t **treep;
isc_time_t start;
if (IS_CACHE(rbtdb) && rbtdb->common.rdclass == dns_rdataclass_in)
@@ -858,33 +871,26 @@ free_rbtdb(dns_rbtdb_t *rbtdb, isc_boolean_t log, isc_event_t *event) {
if (event == NULL)
rbtdb->quantum = (rbtdb->task != NULL) ? 100 : 0;
- again:
- if (rbtdb->tree != NULL) {
- isc_time_now(&start);
- result = dns_rbt_destroy2(&rbtdb->tree, rbtdb->quantum);
- if (result == ISC_R_QUOTA) {
- INSIST(rbtdb->task != NULL);
- if (rbtdb->quantum != 0)
- rbtdb->quantum = adjust_quantum(rbtdb->quantum,
- &start);
- if (event == NULL)
- event = isc_event_allocate(rbtdb->common.mctx,
- NULL,
- DNS_EVENT_FREESTORAGE,
- free_rbtdb_callback,
- rbtdb,
- sizeof(isc_event_t));
- if (event == NULL)
- goto again;
- isc_task_send(rbtdb->task, &event);
- return;
+
+ for (;;) {
+ /*
+ * pick the next tree to (start to) destroy
+ */
+ treep = &rbtdb->tree;
+ if (*treep == NULL) {
+ treep = &rbtdb->nsec;
+ if (*treep == NULL) {
+ treep = &rbtdb->nsec3;
+ /*
+ * we're finished after clear cutting
+ */
+ if (*treep == NULL)
+ break;
+ }
}
- INSIST(result == ISC_R_SUCCESS && rbtdb->tree == NULL);
- }
- if (rbtdb->nsec3 != NULL) {
isc_time_now(&start);
- result = dns_rbt_destroy2(&rbtdb->nsec3, rbtdb->quantum);
+ result = dns_rbt_destroy2(treep, rbtdb->quantum);
if (result == ISC_R_QUOTA) {
INSIST(rbtdb->task != NULL);
if (rbtdb->quantum != 0)
@@ -898,11 +904,11 @@ free_rbtdb(dns_rbtdb_t *rbtdb, isc_boolean_t log, isc_event_t *event) {
rbtdb,
sizeof(isc_event_t));
if (event == NULL)
- goto again;
+ continue;
isc_task_send(rbtdb->task, &event);
return;
}
- INSIST(result == ISC_R_SUCCESS && rbtdb->nsec3 == NULL);
+ INSIST(result == ISC_R_SUCCESS && *treep == NULL);
}
if (event != NULL)
@@ -957,6 +963,11 @@ free_rbtdb(dns_rbtdb_t *rbtdb, isc_boolean_t log, isc_event_t *event) {
if (rbtdb->rrsetstats != NULL)
dns_stats_detach(&rbtdb->rrsetstats);
+#ifdef BIND9
+ if (rbtdb->rpz_cidr != NULL)
+ dns_rpz_cidr_free(&rbtdb->rpz_cidr);
+#endif
+
isc_mem_put(rbtdb->common.mctx, rbtdb->node_locks,
rbtdb->node_lock_count * sizeof(rbtdb_nodelock_t));
isc_rwlock_destroy(&rbtdb->tree_lock);
@@ -1480,6 +1491,82 @@ clean_zone_node(dns_rbtdb_t *rbtdb, dns_rbtnode_t *node,
node->dirty = 0;
}
+static void
+delete_node(dns_rbtdb_t *rbtdb, dns_rbtnode_t *node)
+{
+ dns_rbtnode_t *nsecnode;
+ dns_fixedname_t fname;
+ dns_name_t *name;
+ isc_result_t result = ISC_R_UNEXPECTED;
+
+ INSIST(!ISC_LINK_LINKED(node, deadlink));
+
+ switch (node->nsec) {
+ case DNS_RBT_NSEC_NORMAL:
+#ifdef BIND9
+ if (rbtdb->rpz_cidr != NULL) {
+ dns_fixedname_init(&fname);
+ name = dns_fixedname_name(&fname);
+ dns_rbt_fullnamefromnode(node, name);
+ dns_rpz_cidr_deleteip(rbtdb->rpz_cidr, name);
+ }
+#endif
+ result = dns_rbt_deletenode(rbtdb->tree, node, ISC_FALSE);
+ break;
+ case DNS_RBT_NSEC_HAS_NSEC:
+ dns_fixedname_init(&fname);
+ name = dns_fixedname_name(&fname);
+ dns_rbt_fullnamefromnode(node, name);
+ /*
+ * Delete the corresponding node from the auxiliary NSEC
+ * tree before deleting from the main tree.
+ */
+ nsecnode = NULL;
+ result = dns_rbt_findnode(rbtdb->nsec, name, NULL, &nsecnode,
+ NULL, DNS_RBTFIND_EMPTYDATA,
+ NULL, NULL);
+ if (result != ISC_R_SUCCESS) {
+ isc_log_write(dns_lctx, DNS_LOGCATEGORY_DATABASE,
+ DNS_LOGMODULE_CACHE, ISC_LOG_WARNING,
+ "delete_node: "
+ "dns_rbt_findnode(nsec): %s",
+ isc_result_totext(result));
+ } else {
+ result = dns_rbt_deletenode(rbtdb->nsec, nsecnode,
+ ISC_FALSE);
+ if (result != ISC_R_SUCCESS) {
+ isc_log_write(dns_lctx,
+ DNS_LOGCATEGORY_DATABASE,
+ DNS_LOGMODULE_CACHE,
+ ISC_LOG_WARNING,
+ "delete_nsecnode(): "
+ "dns_rbt_deletenode(nsecnode): %s",
+ isc_result_totext(result));
+ }
+ }
+ result = dns_rbt_deletenode(rbtdb->tree, node, ISC_FALSE);
+#ifdef BIND9
+ dns_rpz_cidr_deleteip(rbtdb->rpz_cidr, name);
+#endif
+ break;
+ case DNS_RBT_NSEC_NSEC:
+ result = dns_rbt_deletenode(rbtdb->nsec, node, ISC_FALSE);
+ break;
+ case DNS_RBT_NSEC_NSEC3:
+ result = dns_rbt_deletenode(rbtdb->nsec3, node, ISC_FALSE);
+ break;
+ }
+ if (result != ISC_R_SUCCESS) {
+ isc_log_write(dns_lctx,
+ DNS_LOGCATEGORY_DATABASE,
+ DNS_LOGMODULE_CACHE,
+ ISC_LOG_WARNING,
+ "delete_nsecnode(): "
+ "dns_rbt_deletenode: %s",
+ isc_result_totext(result));
+ }
+}
+
/*%
* Clean up dead nodes. These are nodes which have no references, and
* have no data. They are dead but we could not or chose not to delete
@@ -1491,7 +1578,6 @@ clean_zone_node(dns_rbtdb_t *rbtdb, dns_rbtnode_t *node,
static void
cleanup_dead_nodes(dns_rbtdb_t *rbtdb, int bucketnum) {
dns_rbtnode_t *node;
- isc_result_t result;
int count = 10; /* XXXJT: should be adjustable */
node = ISC_LIST_HEAD(rbtdb->deadnodes[bucketnum]);
@@ -1505,19 +1591,8 @@ cleanup_dead_nodes(dns_rbtdb_t *rbtdb, int bucketnum) {
INSIST(dns_rbtnode_refcurrent(node) == 0 &&
node->data == NULL);
- INSIST(!ISC_LINK_LINKED(node, deadlink));
- if (node->nsec3)
- result = dns_rbt_deletenode(rbtdb->nsec3, node,
- ISC_FALSE);
- else
- result = dns_rbt_deletenode(rbtdb->tree, node,
- ISC_FALSE);
- if (result != ISC_R_SUCCESS)
- isc_log_write(dns_lctx, DNS_LOGCATEGORY_DATABASE,
- DNS_LOGMODULE_CACHE, ISC_LOG_WARNING,
- "cleanup_dead_nodes: "
- "dns_rbt_deletenode: %s",
- isc_result_totext(result));
+ delete_node(rbtdb, node);
+
node = ISC_LIST_HEAD(rbtdb->deadnodes[bucketnum]);
count--;
}
@@ -1766,22 +1841,7 @@ decrement_reference(dns_rbtdb_t *rbtdb, dns_rbtnode_t *node,
sizeof(printname)));
}
- INSIST(!ISC_LINK_LINKED(node, deadlink));
- if (node->nsec3)
- result = dns_rbt_deletenode(rbtdb->nsec3, node,
- ISC_FALSE);
- else
- result = dns_rbt_deletenode(rbtdb->tree, node,
- ISC_FALSE);
- if (result != ISC_R_SUCCESS) {
- isc_log_write(dns_lctx,
- DNS_LOGCATEGORY_DATABASE,
- DNS_LOGMODULE_CACHE,
- ISC_LOG_WARNING,
- "decrement_reference: "
- "dns_rbt_deletenode: %s",
- isc_result_totext(result));
- }
+ delete_node(rbtdb, node);
}
} else if (dns_rbtnode_refcurrent(node) == 0) {
INSIST(!ISC_LINK_LINKED(node, deadlink));
@@ -1917,13 +1977,17 @@ cleanup_nondirty(rbtdb_version_t *version, rbtdb_changedlist_t *cleanup_list) {
static void
iszonesecure(dns_db_t *db, rbtdb_version_t *version, dns_dbnode_t *origin) {
+#ifndef BIND9
+ UNUSED(db);
+ UNUSED(version);
+ UNUSED(origin);
+
+ return;
+#else
dns_rdataset_t keyset;
dns_rdataset_t nsecset, signsecset;
- dns_rdata_t rdata = DNS_RDATA_INIT;
isc_boolean_t haszonekey = ISC_FALSE;
isc_boolean_t hasnsec = ISC_FALSE;
- isc_boolean_t hasoptbit = ISC_FALSE;
- isc_boolean_t nsec3createflag = ISC_FALSE;
isc_result_t result;
dns_rdataset_init(&keyset);
@@ -1955,41 +2019,30 @@ iszonesecure(dns_db_t *db, rbtdb_version_t *version, dns_dbnode_t *origin) {
if (result == ISC_R_SUCCESS) {
if (dns_rdataset_isassociated(&signsecset)) {
hasnsec = ISC_TRUE;
- result = dns_rdataset_first(&nsecset);
- if (result == ISC_R_SUCCESS) {
- dns_rdataset_current(&nsecset, &rdata);
- hasoptbit = dns_nsec_typepresent(&rdata,
- dns_rdatatype_opt);
- }
dns_rdataset_disassociate(&signsecset);
}
dns_rdataset_disassociate(&nsecset);
}
- setnsec3parameters(db, version, &nsec3createflag);
+ setnsec3parameters(db, version);
/*
* Do we have a valid NSEC/NSEC3 chain?
*/
- if (version->havensec3 || (hasnsec && !hasoptbit))
+ if (version->havensec3 || hasnsec)
version->secure = dns_db_secure;
- /*
- * Do we have a NSEC/NSEC3 chain under creation?
- */
- else if (hasoptbit || nsec3createflag)
- version->secure = dns_db_partial;
else
version->secure = dns_db_insecure;
+#endif
}
/*%<
* Walk the origin node looking for NSEC3PARAM records.
* Cache the nsec3 parameters.
*/
+#ifdef BIND9
static void
-setnsec3parameters(dns_db_t *db, rbtdb_version_t *version,
- isc_boolean_t *nsec3createflag)
-{
+setnsec3parameters(dns_db_t *db, rbtdb_version_t *version) {
dns_rbtnode_t *node;
dns_rdata_nsec3param_t nsec3param;
dns_rdata_t rdata = DNS_RDATA_INIT;
@@ -2020,7 +2073,7 @@ setnsec3parameters(dns_db_t *db, rbtdb_version_t *version,
} while (header != NULL);
if (header != NULL &&
- header->type == dns_rdatatype_nsec3param) {
+ (header->type == dns_rdatatype_nsec3param)) {
/*
* Find A NSEC3PARAM with a supported algorithm.
*/
@@ -2055,17 +2108,8 @@ setnsec3parameters(dns_db_t *db, rbtdb_version_t *version,
!dns_nsec3_supportedhash(nsec3param.hash))
continue;
-#ifdef RFC5155_STRICT
if (nsec3param.flags != 0)
continue;
-#else
- if ((nsec3param.flags & DNS_NSEC3FLAG_CREATE)
- != 0)
- *nsec3createflag = ISC_TRUE;
- if ((nsec3param.flags & ~DNS_NSEC3FLAG_OPTOUT)
- != 0)
- continue;
-#endif
memcpy(version->salt, nsec3param.salt,
nsec3param.salt_length);
@@ -2088,6 +2132,7 @@ setnsec3parameters(dns_db_t *db, rbtdb_version_t *version,
isc_rwlocktype_read);
RWUNLOCK(&rbtdb->tree_lock, isc_rwlocktype_read);
}
+#endif
static void
cleanup_dead_nodes_callback(isc_task_t *task, isc_event_t *event) {
@@ -2407,7 +2452,8 @@ add_wildcard_magic(dns_rbtdb_t *rbtdb, dns_name_t *name) {
result = dns_rbt_addnode(rbtdb->tree, &foundname, &node);
if (result != ISC_R_SUCCESS && result != ISC_R_EXISTS)
return (result);
- node->nsec3 = 0;
+ if (result == ISC_R_SUCCESS)
+ node->nsec = DNS_RBT_NSEC_NORMAL;
node->find_callback = 1;
node->wild = 1;
return (ISC_R_SUCCESS);
@@ -2435,7 +2481,8 @@ add_empty_wildcards(dns_rbtdb_t *rbtdb, dns_name_t *name) {
&node);
if (result != ISC_R_SUCCESS && result != ISC_R_EXISTS)
return (result);
- node->nsec3 = 0;
+ if (result == ISC_R_SUCCESS)
+ node->nsec = DNS_RBT_NSEC_NORMAL;
}
i++;
}
@@ -2474,6 +2521,17 @@ findnode(dns_db_t *db, dns_name_t *name, isc_boolean_t create,
node = NULL;
result = dns_rbt_addnode(rbtdb->tree, name, &node);
if (result == ISC_R_SUCCESS) {
+#ifdef BIND9
+ if (rbtdb->rpz_cidr != NULL) {
+ dns_fixedname_t fnamef;
+ dns_name_t *fname;
+
+ dns_fixedname_init(&fnamef);
+ fname = dns_fixedname_name(&fnamef);
+ dns_rbt_fullnamefromnode(node, fname);
+ dns_rpz_cidr_addip(rbtdb->rpz_cidr, fname);
+ }
+#endif
dns_rbt_namefromnode(node, &nodename);
#ifdef DNS_RBT_USEHASH
node->locknum = node->hashval % rbtdb->node_lock_count;
@@ -2481,7 +2539,6 @@ findnode(dns_db_t *db, dns_name_t *name, isc_boolean_t create,
node->locknum = dns_name_hash(&nodename, ISC_TRUE) %
rbtdb->node_lock_count;
#endif
- node->nsec3 = 0;
add_empty_wildcards(rbtdb, name);
if (dns_name_iswildcard(name)) {
@@ -2543,13 +2600,14 @@ findnsec3node(dns_db_t *db, dns_name_t *name, isc_boolean_t create,
node->locknum = dns_name_hash(&nodename, ISC_TRUE) %
rbtdb->node_lock_count;
#endif
- node->nsec3 = 1U;
+ node->nsec = DNS_RBT_NSEC_NSEC3;
} else if (result != ISC_R_EXISTS) {
RWUNLOCK(&rbtdb->tree_lock, locktype);
return (result);
}
- } else
- INSIST(node->nsec3);
+ } else {
+ INSIST(node->nsec == DNS_RBT_NSEC_NSEC3);
+ }
NODE_STRONGLOCK(&rbtdb->node_locks[node->locknum].lock);
new_reference(rbtdb, node);
NODE_STRONGUNLOCK(&rbtdb->node_locks[node->locknum].lock);
@@ -2727,6 +2785,8 @@ bind_rdataset(dns_rbtdb_t *rbtdb, dns_rbtnode_t *node,
rdataset->covers = RBTDB_RDATATYPE_EXT(header->type);
rdataset->ttl = header->rdh_ttl - now;
rdataset->trust = header->trust;
+ if (NEGATIVE(header))
+ rdataset->attributes |= DNS_RDATASETATTR_NEGATIVE;
if (NXDOMAIN(header))
rdataset->attributes |= DNS_RDATASETATTR_NXDOMAIN;
if (OPTOUT(header))
@@ -3258,13 +3318,125 @@ matchparams(rdatasetheader_t *header, rbtdb_search_t *search)
* Find node of the NSEC/NSEC3 record that is 'name'.
*/
static inline isc_result_t
+previous_closest_nsec(dns_rdatatype_t type, rbtdb_search_t *search,
+ dns_name_t *name, dns_name_t *origin,
+ dns_rbtnode_t **nodep, dns_rbtnodechain_t *nsecchain,
+ isc_boolean_t *firstp)
+{
+ dns_fixedname_t ftarget;
+ dns_name_t *target;
+ dns_rbtnode_t *nsecnode;
+ isc_result_t result;
+
+ REQUIRE(nodep != NULL && *nodep == NULL);
+
+ if (type == dns_rdatatype_nsec3) {
+ result = dns_rbtnodechain_prev(&search->chain, NULL, NULL);
+ if (result != ISC_R_SUCCESS && result != DNS_R_NEWORIGIN)
+ return (result);
+ result = dns_rbtnodechain_current(&search->chain, name, origin,
+ nodep);
+ return (result);
+ }
+
+ dns_fixedname_init(&ftarget);
+ target = dns_fixedname_name(&ftarget);
+
+ for (;;) {
+ if (*firstp) {
+ /*
+ * Construct the name of the second node to check.
+ * It is the first node sought in the NSEC tree.
+ */
+ *firstp = ISC_FALSE;
+ dns_rbtnodechain_init(nsecchain, NULL);
+ result = dns_name_concatenate(name, origin,
+ target, NULL);
+ if (result != ISC_R_SUCCESS)
+ return (result);
+ nsecnode = NULL;
+ result = dns_rbt_findnode(search->rbtdb->nsec,
+ target, NULL,
+ &nsecnode, nsecchain,
+ DNS_RBTFIND_NOOPTIONS,
+ NULL, NULL);
+ if (result == ISC_R_SUCCESS) {
+ /*
+ * Since this was the first loop, finding the
+ * name in the NSEC tree implies that the first
+ * node checked in the main tree had an
+ * unacceptable NSEC record.
+ * Try the previous node in the NSEC tree.
+ */
+ result = dns_rbtnodechain_prev(nsecchain,
+ name, origin);
+ if (result == DNS_R_NEWORIGIN)
+ result = ISC_R_SUCCESS;
+ } else if (result == ISC_R_NOTFOUND ||
+ result == DNS_R_PARTIALMATCH) {
+ result = dns_rbtnodechain_current(nsecchain,
+ name, origin, NULL);
+ if (result == ISC_R_NOTFOUND)
+ result = ISC_R_NOMORE;
+ }
+ } else {
+ /*
+ * This is a second or later trip through the auxiliary
+ * tree for the name of a third or earlier NSEC node in
+ * the main tree. Previous trips through the NSEC tree
+ * must have found nodes in the main tree with NSEC
+ * records. Perhaps they lacked signature records.
+ */
+ result = dns_rbtnodechain_prev(nsecchain, name, origin);
+ if (result == DNS_R_NEWORIGIN)
+ result = ISC_R_SUCCESS;
+ }
+ if (result != ISC_R_SUCCESS)
+ return (result);
+
+ /*
+ * Construct the name to seek in the main tree.
+ */
+ result = dns_name_concatenate(name, origin, target, NULL);
+ if (result != ISC_R_SUCCESS)
+ return (result);
+
+ *nodep = NULL;
+ result = dns_rbt_findnode(search->rbtdb->tree, target, NULL,
+ nodep, &search->chain,
+ DNS_RBTFIND_NOOPTIONS, NULL, NULL);
+ if (result == ISC_R_SUCCESS)
+ return (result);
+
+ /*
+ * There should always be a node in the main tree with the
+ * same name as the node in the auxiliary NSEC tree, except for
+ * nodes in the auxiliary tree that are awaiting deletion.
+ */
+ if (result != DNS_R_PARTIALMATCH && result != ISC_R_NOTFOUND) {
+ isc_log_write(dns_lctx, DNS_LOGCATEGORY_DATABASE,
+ DNS_LOGMODULE_CACHE, ISC_LOG_ERROR,
+ "previous_closest_nsec(): %s",
+ isc_result_totext(result));
+ return (DNS_R_BADDB);
+ }
+ }
+}
+
+/*
+ * Find the NSEC/NSEC3 which is or before the current point on the
+ * search chain. For NSEC3 records only NSEC3 records that match the
+ * current NSEC3PARAM record are considered.
+ */
+static inline isc_result_t
find_closest_nsec(rbtdb_search_t *search, dns_dbnode_t **nodep,
dns_name_t *foundname, dns_rdataset_t *rdataset,
dns_rdataset_t *sigrdataset, dns_rbt_t *tree,
dns_db_secure_t secure)
{
- dns_rbtnode_t *node;
+ dns_rbtnode_t *node, *prevnode;
rdatasetheader_t *header, *header_next, *found, *foundsig;
+ dns_rbtnodechain_t nsecchain;
isc_boolean_t empty_node;
isc_result_t result;
dns_fixedname_t fname, forigin;
@@ -3272,6 +3444,7 @@ find_closest_nsec(rbtdb_search_t *search, dns_dbnode_t **nodep,
dns_rdatatype_t type;
rbtdb_rdatatype_t sigtype;
isc_boolean_t wraps;
+ isc_boolean_t first = ISC_TRUE;
isc_boolean_t need_sig = ISC_TF(secure == dns_db_secure);
if (tree == search->rbtdb->nsec3) {
@@ -3284,17 +3457,21 @@ find_closest_nsec(rbtdb_search_t *search, dns_dbnode_t **nodep,
wraps = ISC_FALSE;
}
+ /*
+ * Use the auxiliary tree only starting with the second node in the
+ * hope that the original node will be right much of the time.
+ */
+ dns_fixedname_init(&fname);
+ name = dns_fixedname_name(&fname);
+ dns_fixedname_init(&forigin);
+ origin = dns_fixedname_name(&forigin);
again:
+ node = NULL;
+ prevnode = NULL;
+ result = dns_rbtnodechain_current(&search->chain, name, origin, &node);
+ if (result != ISC_R_SUCCESS)
+ return (result);
do {
- node = NULL;
- dns_fixedname_init(&fname);
- name = dns_fixedname_name(&fname);
- dns_fixedname_init(&forigin);
- origin = dns_fixedname_name(&forigin);
- result = dns_rbtnodechain_current(&search->chain, name,
- origin, &node);
- if (result != ISC_R_SUCCESS)
- return (result);
NODE_LOCK(&(search->rbtdb->node_locks[node->locknum].lock),
isc_rwlocktype_read);
found = NULL;
@@ -3344,11 +3521,12 @@ find_closest_nsec(rbtdb_search_t *search, dns_dbnode_t **nodep,
empty_node = ISC_TRUE;
found = NULL;
foundsig = NULL;
- result = dns_rbtnodechain_prev(&search->chain,
- NULL, NULL);
+ result = previous_closest_nsec(type, search,
+ name, origin,
+ &prevnode, NULL,
+ NULL);
} else if (found != NULL &&
- (foundsig != NULL || !need_sig))
- {
+ (foundsig != NULL || !need_sig)) {
/*
* We've found the right NSEC/NSEC3 record.
*
@@ -3385,8 +3563,11 @@ find_closest_nsec(rbtdb_search_t *search, dns_dbnode_t **nodep,
* node as if it were empty and keep looking.
*/
empty_node = ISC_TRUE;
- result = dns_rbtnodechain_prev(&search->chain,
- NULL, NULL);
+ result = previous_closest_nsec(type, search,
+ name, origin,
+ &prevnode,
+ &nsecchain,
+ &first);
} else {
/*
* We found an active node, but either the
@@ -3400,13 +3581,19 @@ find_closest_nsec(rbtdb_search_t *search, dns_dbnode_t **nodep,
* This node isn't active. We've got to keep
* looking.
*/
- result = dns_rbtnodechain_prev(&search->chain, NULL,
- NULL);
+ result = previous_closest_nsec(type, search,
+ name, origin, &prevnode,
+ &nsecchain, &first);
}
NODE_UNLOCK(&(search->rbtdb->node_locks[node->locknum].lock),
isc_rwlocktype_read);
+ node = prevnode;
+ prevnode = NULL;
} while (empty_node && result == ISC_R_SUCCESS);
+ if (!first)
+ dns_rbtnodechain_invalidate(&nsecchain);
+
if (result == ISC_R_NOMORE && wraps) {
result = dns_rbtnodechain_last(&search->chain, tree,
NULL, NULL);
@@ -3950,6 +4137,7 @@ zone_findzonecut(dns_db_t *db, dns_name_t *name, unsigned int options,
FATAL_ERROR(__FILE__, __LINE__, "zone_findzonecut() called!");
+ /* NOTREACHED */
return (ISC_R_NOTIMPLEMENTED);
}
@@ -4361,6 +4549,200 @@ find_coveringnsec(rbtdb_search_t *search, dns_dbnode_t **nodep,
return (result);
}
+/*
+ * Mark a database for response policy rewriting.
+ */
+#ifdef BIND9
+static void
+get_rpz_enabled(dns_db_t *db, dns_rpz_st_t *st)
+{
+ dns_rbtdb_t *rbtdb;
+
+ rbtdb = (dns_rbtdb_t *)db;
+ REQUIRE(VALID_RBTDB(rbtdb));
+ RWLOCK(&rbtdb->tree_lock, isc_rwlocktype_read);
+ dns_rpz_enabled(rbtdb->rpz_cidr, st);
+ RWUNLOCK(&rbtdb->tree_lock, isc_rwlocktype_read);
+}
+
+/*
+ * Search the CDIR block tree of a response policy tree of trees for all of
+ * the IP addresses in an A or AAAA rdataset.
+ * Among the policies for all IPv4 and IPv6 addresses for a name, choose
+ * the longest prefix. Among those with the longest prefix, the first
+ * configured policy. Among answers for with the longest prefixes for
+ * two or more IP addresses in the A and AAAA rdatasets the lexically
+ * smallest address.
+ */
+static isc_result_t
+rpz_findips(dns_rpz_zone_t *rpz, dns_rpz_type_t rpz_type,
+ dns_zone_t *zone, dns_db_t *db, dns_dbversion_t *version,
+ dns_rdataset_t *ardataset, dns_rpz_st_t *st)
+{
+ dns_rbtdb_t *rbtdb;
+ struct in_addr ina;
+ struct in6_addr in6a;
+ isc_netaddr_t netaddr;
+ dns_fixedname_t selfnamef, qnamef;
+ dns_name_t *selfname, *qname;
+ dns_rbtnode_t *node;
+ dns_rdataset_t zrdataset;
+ dns_rpz_cidr_bits_t prefix;
+ isc_result_t result;
+ dns_rpz_policy_t rpz_policy;
+ dns_ttl_t ttl;
+
+ rbtdb = (dns_rbtdb_t *)db;
+ REQUIRE(VALID_RBTDB(rbtdb));
+ RWLOCK(&rbtdb->tree_lock, isc_rwlocktype_read);
+
+ if (rbtdb->rpz_cidr == NULL) {
+ RWUNLOCK(&rbtdb->tree_lock, isc_rwlocktype_read);
+ dns_db_detach(&db);
+ dns_zone_detach(&zone);
+ return (ISC_R_UNEXPECTED);
+ }
+
+ dns_fixedname_init(&selfnamef);
+ dns_fixedname_init(&qnamef);
+ selfname = dns_fixedname_name(&selfnamef);
+ qname = dns_fixedname_name(&qnamef);
+
+ for (result = dns_rdataset_first(ardataset);
+ result == ISC_R_SUCCESS;
+ result = dns_rdataset_next(ardataset)) {
+ dns_rdata_t rdata = DNS_RDATA_INIT;
+ dns_rdataset_current(ardataset, &rdata);
+ switch (rdata.type) {
+ case dns_rdatatype_a:
+ INSIST(rdata.length == 4);
+ memcpy(&ina.s_addr, rdata.data, 4);
+ isc_netaddr_fromin(&netaddr, &ina);
+ break;
+ case dns_rdatatype_aaaa:
+ INSIST(rdata.length == 16);
+ memcpy(in6a.s6_addr, rdata.data, 16);
+ isc_netaddr_fromin6(&netaddr, &in6a);
+ break;
+ default:
+ continue;
+ }
+
+ result = dns_rpz_cidr_find(rbtdb->rpz_cidr, &netaddr, rpz_type,
+ selfname, qname, &prefix);
+ if (result != ISC_R_SUCCESS)
+ continue;
+
+ /*
+ * Choose the policy with the longest matching prefix.
+ * Between policies with the same prefix, choose the first
+ * configured.
+ */
+ if (st->m.policy != DNS_RPZ_POLICY_MISS) {
+ if (prefix < st->m.prefix)
+ continue;
+ if (prefix == st->m.prefix &&
+ rpz->num > st->m.rpz->num)
+ continue;
+ }
+
+ /*
+ * We have rpz_st an entry with a prefix at least as long as
+ * the prefix of the entry we had before. Find the node
+ * corresponding to CDIR tree entry.
+ */
+ node = NULL;
+ result = dns_rbt_findnode(rbtdb->tree, qname, NULL,
+ &node, NULL, 0, NULL, NULL);
+ if (result != ISC_R_SUCCESS) {
+ char namebuf[DNS_NAME_FORMATSIZE];
+
+ dns_name_format(qname, namebuf, sizeof(namebuf));
+ isc_log_write(dns_lctx, DNS_LOGCATEGORY_DATABASE,
+ DNS_LOGMODULE_CACHE, DNS_RPZ_ERROR_LEVEL,
+ "rpz_findips findnode(%s): %s",
+ namebuf, isc_result_totext(result));
+ continue;
+ }
+ /*
+ * First look for a simple rewrite of the IP address.
+ * If that fails, look for a CNAME. If we cannot find
+ * a CNAME or the CNAME is neither of the special forms
+ * "*" or ".", treat it like a real CNAME.
+ */
+ dns_rdataset_init(&zrdataset);
+ result = dns_db_findrdataset(db, node, version, ardataset->type,
+ 0, 0, &zrdataset, NULL);
+ if (result != ISC_R_SUCCESS)
+ result = dns_db_findrdataset(db, node, version,
+ dns_rdatatype_cname,
+ 0, 0, &zrdataset, NULL);
+ if (result == ISC_R_SUCCESS) {
+ if (zrdataset.type != dns_rdatatype_cname) {
+ rpz_policy = DNS_RPZ_POLICY_RECORD;
+ } else {
+ rpz_policy = dns_rpz_decode_cname(&zrdataset,
+ selfname);
+ if (rpz_policy == DNS_RPZ_POLICY_RECORD)
+ result = DNS_R_CNAME;
+ }
+ ttl = zrdataset.ttl;
+ } else {
+ rpz_policy = DNS_RPZ_POLICY_RECORD;
+ result = DNS_R_NXRRSET;
+ ttl = DNS_RPZ_TTL_DEFAULT;
+ }
+
+ /*
+ * Use an overriding action specified in the configuration file
+ */
+ if (rpz->policy != DNS_RPZ_POLICY_GIVEN &&
+ rpz_policy != DNS_RPZ_POLICY_NO_OP)
+ rpz_policy = rpz->policy;
+
+ /*
+ * We know the new prefix is at least as long as the current.
+ * Prefer the new answer if the new prefix is longer.
+ * Prefer the zone configured first if the prefixes are equal.
+ * With two actions from the same zone, prefer the action
+ * on the "smallest" name.
+ */
+ if (st->m.policy == DNS_RPZ_POLICY_MISS ||
+ prefix > st->m.prefix ||
+ rpz->num <= st->m.rpz->num ||
+ 0 > dns_name_compare(qname, st->qname)) {
+ if (dns_rdataset_isassociated(st->m.rdataset))
+ dns_rdataset_disassociate(st->m.rdataset);
+ if (st->m.node != NULL)
+ dns_db_detachnode(st->m.db, &st->m.node);
+ if (st->m.db != NULL)
+ dns_db_detach(&st->m.db);
+ if (st->m.zone != NULL)
+ dns_zone_detach(&st->m.zone);
+ st->m.rpz = rpz;
+ st->m.type = rpz_type;
+ st->m.prefix = prefix;
+ st->m.policy = rpz_policy;
+ st->m.ttl = ttl;
+ st->m.result = result;
+ dns_name_copy(qname, st->qname, NULL);
+ if (rpz_policy == DNS_RPZ_POLICY_RECORD &&
+ result != DNS_R_NXRRSET) {
+ dns_rdataset_clone(&zrdataset,st->m.rdataset);
+ dns_db_attachnode(db, node, &st->m.node);
+ }
+ dns_db_attach(db, &st->m.db);
+ dns_zone_attach(zone, &st->m.zone);
+ }
+ if (dns_rdataset_isassociated(&zrdataset))
+ dns_rdataset_disassociate(&zrdataset);
+ }
+
+ RWUNLOCK(&rbtdb->tree_lock, isc_rwlocktype_read);
+ return (ISC_R_SUCCESS);
+}
+#endif
+
static isc_result_t
cache_find(dns_db_t *db, dns_name_t *name, dns_dbversion_t *version,
dns_rdatatype_t type, unsigned int options, isc_stdtime_t now,
@@ -4636,7 +5018,7 @@ cache_find(dns_db_t *db, dns_name_t *name, dns_dbversion_t *version,
*nodep = node;
}
- if (RBTDB_RDATATYPE_BASE(found->type) == 0) {
+ if (NEGATIVE(found)) {
/*
* We found a negative cache entry.
*/
@@ -5305,7 +5687,7 @@ cache_findrdataset(dns_db_t *db, dns_dbnode_t *node, dns_dbversion_t *version,
if (found == NULL)
return (ISC_R_NOTFOUND);
- if (RBTDB_RDATATYPE_BASE(found->type) == 0) {
+ if (NEGATIVE(found)) {
/*
* We found a negative cache entry.
*/
@@ -5516,7 +5898,7 @@ add(dns_rbtdb_t *rbtdb, dns_rbtnode_t *rbtnode, rbtdb_version_t *rbtversion,
negtype = 0;
if (rbtversion == NULL && !newheader_nx) {
rdtype = RBTDB_RDATATYPE_BASE(newheader->type);
- if (rdtype == 0) {
+ if (NEGATIVE(newheader)) {
/*
* We're adding a negative cache entry.
*/
@@ -5683,6 +6065,7 @@ add(dns_rbtdb_t *rbtdb, dns_rbtnode_t *rbtnode, rbtdb_version_t *rbtversion,
free_rdataset(rbtdb, rbtdb->common.mctx,
newheader);
newheader = (rdatasetheader_t *)merged;
+ init_rdataset(rbtdb, newheader);
if (loading && RESIGN(newheader) &&
RESIGN(header) &&
header->resign < newheader->resign)
@@ -6005,16 +6388,17 @@ addrdataset(dns_db_t *db, dns_dbnode_t *node, dns_dbversion_t *version,
rdatasetheader_t *header;
isc_result_t result;
isc_boolean_t delegating;
+ isc_boolean_t newnsec;
isc_boolean_t tree_locked = ISC_FALSE;
isc_boolean_t cache_is_overmem = ISC_FALSE;
REQUIRE(VALID_RBTDB(rbtdb));
if (rbtdb->common.methods == &zone_methods)
- REQUIRE(((rbtnode->nsec3 &&
+ REQUIRE(((rbtnode->nsec == DNS_RBT_NSEC_NSEC3 &&
(rdataset->type == dns_rdatatype_nsec3 ||
rdataset->covers == dns_rdatatype_nsec3)) ||
- (!rbtnode->nsec3 &&
+ (rbtnode->nsec != DNS_RBT_NSEC_NSEC3 &&
rdataset->type != dns_rdatatype_nsec3 &&
rdataset->covers != dns_rdatatype_nsec3)));
@@ -6056,6 +6440,8 @@ addrdataset(dns_db_t *db, dns_dbnode_t *node, dns_dbversion_t *version,
} else {
newheader->serial = 1;
newheader->resign = 0;
+ if ((rdataset->attributes & DNS_RDATASETATTR_NEGATIVE) != 0)
+ newheader->attributes |= RDATASET_ATTR_NEGATIVE;
if ((rdataset->attributes & DNS_RDATASETATTR_NXDOMAIN) != 0)
newheader->attributes |= RDATASET_ATTR_NXDOMAIN;
if ((rdataset->attributes & DNS_RDATASETATTR_OPTOUT) != 0)
@@ -6089,14 +6475,23 @@ addrdataset(dns_db_t *db, dns_dbnode_t *node, dns_dbversion_t *version,
delegating = ISC_FALSE;
/*
- * If we're adding a delegation type or the DB is a cache in an overmem
- * state, hold an exclusive lock on the tree. In the latter case
- * the lock does not necessarily have to be acquired but it will help
- * purge stale entries more effectively.
+ * Add to the auxiliary NSEC tree if we're adding an NSEC record.
+ */
+ if (rbtnode->nsec != DNS_RBT_NSEC_HAS_NSEC &&
+ rdataset->type == dns_rdatatype_nsec)
+ newnsec = ISC_TRUE;
+ else
+ newnsec = ISC_FALSE;
+
+ /*
+ * If we're adding a delegation type, adding to the auxiliary NSEC tree,
+ * or the DB is a cache in an overmem state, hold an exclusive lock on
+ * the tree. In the latter case the lock does not necessarily have to
+ * be acquired but it will help purge stale entries more effectively.
*/
if (IS_CACHE(rbtdb) && isc_mem_isovermem(rbtdb->common.mctx))
cache_is_overmem = ISC_TRUE;
- if (delegating || cache_is_overmem) {
+ if (delegating || newnsec || cache_is_overmem) {
tree_locked = ISC_TRUE;
RWLOCK(&rbtdb->tree_lock, isc_rwlocktype_write);
}
@@ -6125,14 +6520,35 @@ addrdataset(dns_db_t *db, dns_dbnode_t *node, dns_dbversion_t *version,
* cleaning, we can release it now. However, we still need the
* node lock.
*/
- if (tree_locked && !delegating) {
+ if (tree_locked && !delegating && !newnsec) {
RWUNLOCK(&rbtdb->tree_lock, isc_rwlocktype_write);
tree_locked = ISC_FALSE;
}
}
- result = add(rbtdb, rbtnode, rbtversion, newheader, options, ISC_FALSE,
- addedrdataset, now);
+ result = ISC_R_SUCCESS;
+ if (newnsec) {
+ dns_fixedname_t fname;
+ dns_name_t *name;
+ dns_rbtnode_t *nsecnode;
+
+ dns_fixedname_init(&fname);
+ name = dns_fixedname_name(&fname);
+ dns_rbt_fullnamefromnode(rbtnode, name);
+ nsecnode = NULL;
+ result = dns_rbt_addnode(rbtdb->nsec, name, &nsecnode);
+ if (result == ISC_R_SUCCESS) {
+ nsecnode->nsec = DNS_RBT_NSEC_NSEC;
+ rbtnode->nsec = DNS_RBT_NSEC_HAS_NSEC;
+ } else if (result == ISC_R_EXISTS) {
+ rbtnode->nsec = DNS_RBT_NSEC_HAS_NSEC;
+ result = ISC_R_SUCCESS;
+ }
+ }
+
+ if (result == ISC_R_SUCCESS)
+ result = add(rbtdb, rbtnode, rbtversion, newheader, options,
+ ISC_FALSE, addedrdataset, now);
if (result == ISC_R_SUCCESS && delegating)
rbtnode->find_callback = 1;
@@ -6169,10 +6585,10 @@ subtractrdataset(dns_db_t *db, dns_dbnode_t *node, dns_dbversion_t *version,
REQUIRE(VALID_RBTDB(rbtdb));
if (rbtdb->common.methods == &zone_methods)
- REQUIRE(((rbtnode->nsec3 &&
+ REQUIRE(((rbtnode->nsec == DNS_RBT_NSEC_NSEC3 &&
(rdataset->type == dns_rdatatype_nsec3 ||
rdataset->covers == dns_rdatatype_nsec3)) ||
- (!rbtnode->nsec3 &&
+ (rbtnode->nsec != DNS_RBT_NSEC_NSEC3 &&
rdataset->type != dns_rdatatype_nsec3 &&
rdataset->covers != dns_rdatatype_nsec3)));
@@ -6391,6 +6807,78 @@ deleterdataset(dns_db_t *db, dns_dbnode_t *node, dns_dbversion_t *version,
return (result);
}
+/*
+ * load a non-NSEC3 node in the main tree and optionally to the auxiliary NSEC
+ */
+static isc_result_t
+loadnode(dns_rbtdb_t *rbtdb, dns_name_t *name, dns_rbtnode_t **nodep,
+ isc_boolean_t hasnsec)
+{
+ isc_result_t noderesult, nsecresult;
+ dns_rbtnode_t *nsecnode;
+
+ noderesult = dns_rbt_addnode(rbtdb->tree, name, nodep);
+
+#ifdef BIND9
+ if (noderesult == ISC_R_SUCCESS)
+ dns_rpz_cidr_addip(rbtdb->rpz_cidr, name);
+#endif
+
+ if (!hasnsec)
+ return (noderesult);
+ if (noderesult == ISC_R_EXISTS) {
+ /*
+ * Add a node to the auxiliary NSEC tree for an old node
+ * just now getting an NSEC record.
+ */
+ if ((*nodep)->nsec == DNS_RBT_NSEC_HAS_NSEC)
+ return (noderesult);
+ } else if (noderesult != ISC_R_SUCCESS) {
+ return (noderesult);
+ }
+
+ /*
+ * Build the auxiliary tree for NSECs as we go.
+ * This tree speeds searches for closest NSECs that would otherwise
+ * need to examine many irrelevant nodes in large TLDs.
+ *
+ * Add nodes to the auxiliary tree after corresponding nodes have
+ * been added to the main tree.
+ */
+ nsecnode = NULL;
+ nsecresult = dns_rbt_addnode(rbtdb->nsec, name, &nsecnode);
+ if (nsecresult == ISC_R_SUCCESS) {
+ nsecnode->nsec = DNS_RBT_NSEC_NSEC;
+ (*nodep)->nsec = DNS_RBT_NSEC_HAS_NSEC;
+ return (noderesult);
+ }
+
+ if (nsecresult == ISC_R_EXISTS) {
+#if 1 /* 0 */
+ isc_log_write(dns_lctx,
+ DNS_LOGCATEGORY_DATABASE,
+ DNS_LOGMODULE_CACHE,
+ ISC_LOG_WARNING,
+ "addnode: NSEC node already exists");
+#endif
+ (*nodep)->nsec = DNS_RBT_NSEC_HAS_NSEC;
+ return (noderesult);
+ }
+
+ nsecresult = dns_rbt_deletenode(rbtdb->tree, *nodep, ISC_FALSE);
+ if (nsecresult != ISC_R_SUCCESS)
+ isc_log_write(dns_lctx,
+ DNS_LOGCATEGORY_DATABASE,
+ DNS_LOGMODULE_CACHE,
+ ISC_LOG_WARNING,
+ "loading_addrdataset: "
+ "dns_rbt_deletenode: %s after "
+ "dns_rbt_addnode(NSEC): %s",
+ isc_result_totext(nsecresult),
+ isc_result_totext(noderesult));
+ return (noderesult);
+}
+
static isc_result_t
loading_addrdataset(void *arg, dns_name_t *name, dns_rdataset_t *rdataset) {
rbtdb_load_t *loadctx = arg;
@@ -6439,15 +6927,15 @@ loading_addrdataset(void *arg, dns_name_t *name, dns_rdataset_t *rdataset) {
rdataset->covers == dns_rdatatype_nsec3) {
result = dns_rbt_addnode(rbtdb->nsec3, name, &node);
if (result == ISC_R_SUCCESS)
- node->nsec3 = 1;
+ node->nsec = DNS_RBT_NSEC_NSEC3;
+ } else if (rdataset->type == dns_rdatatype_nsec) {
+ result = loadnode(rbtdb, name, &node, ISC_TRUE);
} else {
- result = dns_rbt_addnode(rbtdb->tree, name, &node);
- if (result == ISC_R_SUCCESS)
- node->nsec3 = 0;
+ result = loadnode(rbtdb, name, &node, ISC_FALSE);
}
if (result != ISC_R_SUCCESS && result != ISC_R_EXISTS)
return (result);
- if (result != ISC_R_EXISTS) {
+ if (result == ISC_R_SUCCESS) {
dns_name_t foundname;
dns_name_init(&foundname, NULL);
dns_rbt_namefromnode(node, &foundname);
@@ -6573,9 +7061,17 @@ dump(dns_db_t *db, dns_dbversion_t *version, const char *filename,
REQUIRE(VALID_RBTDB(rbtdb));
+#ifdef BIND9
return (dns_master_dump2(rbtdb->common.mctx, db, version,
&dns_master_style_default,
filename, masterformat));
+#else
+ UNUSED(version);
+ UNUSED(filename);
+ UNUSED(masterformat);
+
+ return (ISC_R_NOTIMPLEMENTED);
+#endif /* BIND9 */
}
static void
@@ -6756,7 +7252,7 @@ setsigningtime(dns_db_t *db, dns_rdataset_t *rdataset, isc_stdtime_t resign) {
} else if (resign < oldresign)
isc_heap_increased(rbtdb->heaps[header->node->locknum],
header->heap_index);
- else
+ else if (resign > oldresign)
isc_heap_decreased(rbtdb->heaps[header->node->locknum],
header->heap_index);
} else if (resign && header->heap_index == 0) {
@@ -6780,7 +7276,7 @@ getsigningtime(dns_db_t *db, dns_rdataset_t *rdataset,
REQUIRE(VALID_RBTDB(rbtdb));
- RBTDB_LOCK(&rbtdb->lock, isc_rwlocktype_read);
+ RWLOCK(&rbtdb->tree_lock, isc_rwlocktype_read);
for (i = 0; i < rbtdb->node_lock_count; i++) {
NODE_LOCK(&rbtdb->node_locks[i].lock, isc_rwlocktype_read);
@@ -6816,7 +7312,7 @@ getsigningtime(dns_db_t *db, dns_rdataset_t *rdataset,
result = ISC_R_SUCCESS;
unlock:
- RBTDB_UNLOCK(&rbtdb->lock, isc_rwlocktype_read);
+ RWUNLOCK(&rbtdb->tree_lock, isc_rwlocktype_read);
return (result);
}
@@ -6838,7 +7334,7 @@ resigned(dns_db_t *db, dns_rdataset_t *rdataset, dns_dbversion_t *version)
header = rdataset->private3;
header--;
- RBTDB_LOCK(&rbtdb->lock, isc_rwlocktype_write);
+ RWLOCK(&rbtdb->tree_lock, isc_rwlocktype_write);
NODE_LOCK(&rbtdb->node_locks[node->locknum].lock,
isc_rwlocktype_write);
/*
@@ -6852,7 +7348,7 @@ resigned(dns_db_t *db, dns_rdataset_t *rdataset, dns_dbversion_t *version)
NODE_UNLOCK(&rbtdb->node_locks[node->locknum].lock,
isc_rwlocktype_write);
- RBTDB_UNLOCK(&rbtdb->lock, isc_rwlocktype_write);
+ RWUNLOCK(&rbtdb->tree_lock, isc_rwlocktype_write);
}
static dns_stats_t *
@@ -6901,7 +7397,14 @@ static dns_dbmethods_t zone_methods = {
getsigningtime,
resigned,
isdnssec,
+ NULL,
+#ifdef BIND9
+ get_rpz_enabled,
+ rpz_findips
+#else
+ NULL,
NULL
+#endif
};
static dns_dbmethods_t cache_methods = {
@@ -6940,7 +7443,9 @@ static dns_dbmethods_t cache_methods = {
NULL,
NULL,
isdnssec,
- getrrsetstats
+ getrrsetstats,
+ NULL,
+ NULL
};
isc_result_t
@@ -7110,12 +7615,36 @@ dns_rbtdb_create
return (result);
}
+ result = dns_rbt_create(mctx, delete_callback, rbtdb, &rbtdb->nsec);
+ if (result != ISC_R_SUCCESS) {
+ free_rbtdb(rbtdb, ISC_FALSE, NULL);
+ return (result);
+ }
+
result = dns_rbt_create(mctx, delete_callback, rbtdb, &rbtdb->nsec3);
if (result != ISC_R_SUCCESS) {
free_rbtdb(rbtdb, ISC_FALSE, NULL);
return (result);
}
+#ifdef BIND9
+ /*
+ * Get ready for response policy IP address searching if at least one
+ * zone has been configured as a response policy zone and this
+ * is not a cache zone.
+ * It would be better to know that this database is for a policy
+ * zone named for a view, but that would require knowledge from
+ * above such as an argv[] set from data in the zone.
+ */
+ if (type == dns_dbtype_zone && !dns_name_equal(origin, dns_rootname)) {
+ result = dns_rpz_new_cidr(mctx, origin, &rbtdb->rpz_cidr);
+ if (result != ISC_R_SUCCESS) {
+ free_rbtdb(rbtdb, ISC_FALSE, NULL);
+ return (result);
+ }
+ }
+#endif
+
/*
* In order to set the node callback bit correctly in zone databases,
* we need to know if the node has the origin name of the zone.
@@ -7140,7 +7669,7 @@ dns_rbtdb_create
free_rbtdb(rbtdb, ISC_FALSE, NULL);
return (result);
}
- rbtdb->origin_node->nsec3 = 0;
+ rbtdb->origin_node->nsec = DNS_RBT_NSEC_NORMAL;
/*
* We need to give the origin node the right locknum.
*/
@@ -7168,7 +7697,7 @@ dns_rbtdb_create
free_rbtdb(rbtdb, ISC_FALSE, NULL);
return (result);
}
- nsec3node->nsec3 = 1;
+ nsec3node->nsec = DNS_RBT_NSEC_NSEC3;
/*
* We need to give the nsec3 origin node the right locknum.
*/
@@ -7638,7 +8167,7 @@ rdatasetiter_next(dns_rdatasetiter_t *iterator) {
type = header->type;
rdtype = RBTDB_RDATATYPE_BASE(header->type);
- if (rdtype == 0) {
+ if (NEGATIVE(header)) {
covers = RBTDB_RDATATYPE_EXT(header->type);
negtype = RBTDB_RDATATYPE_VALUE(covers, 0);
} else
@@ -8226,6 +8755,21 @@ rdataset_getadditional(dns_rdataset_t *rdataset, dns_rdatasetadditional_t type,
dns_name_t *fname, dns_message_t *msg,
isc_stdtime_t now)
{
+#ifndef BIND9
+ UNUSED(rdataset);
+ UNUSED(type);
+ UNUSED(qtype);
+ UNUSED(acache);
+ UNUSED(zonep);
+ UNUSED(dbp);
+ UNUSED(versionp);
+ UNUSED(nodep);
+ UNUSED(fname);
+ UNUSED(msg);
+ UNUSED(now);
+
+ return (ISC_R_NOTIMPLEMENTED);
+#else
dns_rbtdb_t *rbtdb = rdataset->private1;
dns_rbtnode_t *rbtnode = rdataset->private2;
unsigned char *raw = rdataset->private3; /* RDATASLAB */
@@ -8342,8 +8886,10 @@ acache_callback(dns_acacheentry_t *entry, void **arg) {
dns_db_detach((dns_db_t **)(void*)&rbtdb);
*arg = NULL;
+#endif /* BIND9 */
}
+#ifdef BIND9
static void
acache_cancelentry(isc_mem_t *mctx, dns_acacheentry_t *entry,
acache_cbarg_t **cbargp)
@@ -8364,6 +8910,7 @@ acache_cancelentry(isc_mem_t *mctx, dns_acacheentry_t *entry,
*cbargp = NULL;
}
+#endif /* BIND9 */
static isc_result_t
rdataset_setadditional(dns_rdataset_t *rdataset, dns_rdatasetadditional_t type,
@@ -8372,6 +8919,19 @@ rdataset_setadditional(dns_rdataset_t *rdataset, dns_rdatasetadditional_t type,
dns_dbversion_t *version, dns_dbnode_t *node,
dns_name_t *fname)
{
+#ifndef BIND9
+ UNUSED(rdataset);
+ UNUSED(type);
+ UNUSED(qtype);
+ UNUSED(acache);
+ UNUSED(zone);
+ UNUSED(db);
+ UNUSED(version);
+ UNUSED(node);
+ UNUSED(fname);
+
+ return (ISC_R_NOTIMPLEMENTED);
+#else
dns_rbtdb_t *rbtdb = rdataset->private1;
dns_rbtnode_t *rbtnode = rdataset->private2;
unsigned char *raw = rdataset->private3; /* RDATASLAB */
@@ -8495,12 +9055,21 @@ rdataset_setadditional(dns_rdataset_t *rdataset, dns_rdatasetadditional_t type,
}
return (result);
+#endif
}
static isc_result_t
rdataset_putadditional(dns_acache_t *acache, dns_rdataset_t *rdataset,
dns_rdatasetadditional_t type, dns_rdatatype_t qtype)
{
+#ifndef BIND9
+ UNUSED(acache);
+ UNUSED(rdataset);
+ UNUSED(type);
+ UNUSED(qtype);
+
+ return (ISC_R_NOTIMPLEMENTED);
+#else
dns_rbtdb_t *rbtdb = rdataset->private1;
dns_rbtnode_t *rbtnode = rdataset->private2;
unsigned char *raw = rdataset->private3; /* RDATASLAB */
@@ -8565,6 +9134,7 @@ rdataset_putadditional(dns_acache_t *acache, dns_rdataset_t *rdataset,
}
return (ISC_R_SUCCESS);
+#endif
}
/*%
diff --git a/contrib/bind9/lib/dns/rcode.c b/contrib/bind9/lib/dns/rcode.c
index 2dc0a29..18fedcd 100644
--- a/contrib/bind9/lib/dns/rcode.c
+++ b/contrib/bind9/lib/dns/rcode.c
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004-2008, 2010 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004-2010 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 1998-2003 Internet Software Consortium.
*
* Permission to use, copy, modify, and/or distribute this software for any
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: rcode.c,v 1.8.48.2 2010-01-15 23:47:33 tbox Exp $ */
+/* $Id: rcode.c,v 1.16 2010-12-23 04:07:58 marka Exp $ */
#include <config.h>
#include <ctype.h>
@@ -79,12 +79,17 @@
{ dns_tsigerror_badtrunc, "BADTRUNC", 0}, \
{ 0, NULL, 0 }
-/* RFC2538 section 2.1 */
+/* RFC4398 section 2.1 */
#define CERTNAMES \
{ 1, "PKIX", 0}, \
{ 2, "SPKI", 0}, \
{ 3, "PGP", 0}, \
+ { 4, "IPKIX", 0}, \
+ { 5, "ISPKI", 0}, \
+ { 6, "IPGP", 0}, \
+ { 7, "ACPKIX", 0}, \
+ { 8, "IACPKIX", 0}, \
{ 253, "URI", 0}, \
{ 254, "OID", 0}, \
{ 0, NULL, 0}
@@ -102,6 +107,7 @@
{ DNS_KEYALG_NSEC3RSASHA1, "NSEC3RSASHA1", 0 }, \
{ DNS_KEYALG_RSASHA256, "RSASHA256", 0 }, \
{ DNS_KEYALG_RSASHA512, "RSASHA512", 0 }, \
+ { DNS_KEYALG_ECCGOST, "ECCGOST", 0 }, \
{ DNS_KEYALG_INDIRECT, "INDIRECT", 0 }, \
{ DNS_KEYALG_PRIVATEDNS, "PRIVATEDNS", 0 }, \
{ DNS_KEYALG_PRIVATEOID, "PRIVATEOID", 0 }, \
@@ -313,6 +319,21 @@ dns_secalg_totext(dns_secalg_t secalg, isc_buffer_t *target) {
return (dns_mnemonic_totext(secalg, target, secalgs));
}
+void
+dns_secalg_format(dns_secalg_t alg, char *cp, unsigned int size) {
+ isc_buffer_t b;
+ isc_region_t r;
+ isc_result_t result;
+
+ REQUIRE(cp != NULL && size > 0);
+ isc_buffer_init(&b, cp, size - 1);
+ result = dns_secalg_totext(alg, &b);
+ isc_buffer_usedregion(&b, &r);
+ r.base[r.length] = 0;
+ if (result != ISC_R_SUCCESS)
+ r.base[0] = 0;
+}
+
isc_result_t
dns_secproto_fromtext(dns_secproto_t *secprotop, isc_textregion_t *source) {
unsigned int value;
diff --git a/contrib/bind9/lib/dns/rdata.c b/contrib/bind9/lib/dns/rdata.c
index daaa83a..c282b03 100644
--- a/contrib/bind9/lib/dns/rdata.c
+++ b/contrib/bind9/lib/dns/rdata.c
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004-2009, 2011 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004-2011 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 1998-2003 Internet Software Consortium.
*
* Permission to use, copy, modify, and/or distribute this software for any
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: rdata.c,v 1.199.50.4 2011-01-13 04:48:21 tbox Exp $ */
+/* $Id: rdata.c,v 1.209 2011-01-13 04:59:25 tbox Exp $ */
/*! \file */
@@ -38,6 +38,7 @@
#include <dns/enumtype.h>
#include <dns/keyflags.h>
#include <dns/keyvalues.h>
+#include <dns/message.h>
#include <dns/rcode.h>
#include <dns/rdata.h>
#include <dns/rdataclass.h>
@@ -275,23 +276,6 @@ dns_rdata_init(dns_rdata_t *rdata) {
/* ISC_LIST_INIT(rdata->list); */
}
-#if 1
-#define DNS_RDATA_INITIALIZED(rdata) \
- ((rdata)->data == NULL && (rdata)->length == 0 && \
- (rdata)->rdclass == 0 && (rdata)->type == 0 && (rdata)->flags == 0 && \
- !ISC_LINK_LINKED((rdata), link))
-#else
-#ifdef ISC_LIST_CHECKINIT
-#define DNS_RDATA_INITIALIZED(rdata) \
- (!ISC_LINK_LINKED((rdata), link))
-#else
-#define DNS_RDATA_INITIALIZED(rdata) ISC_TRUE
-#endif
-#endif
-
-#define DNS_RDATA_VALIDFLAGS(rdata) \
- (((rdata)->flags & ~(DNS_RDATA_UPDATE|DNS_RDATA_OFFLINE)) == 0)
-
void
dns_rdata_reset(dns_rdata_t *rdata) {
@@ -365,6 +349,37 @@ dns_rdata_compare(const dns_rdata_t *rdata1, const dns_rdata_t *rdata2) {
return (result);
}
+int
+dns_rdata_casecompare(const dns_rdata_t *rdata1, const dns_rdata_t *rdata2) {
+ int result = 0;
+ isc_boolean_t use_default = ISC_FALSE;
+
+ REQUIRE(rdata1 != NULL);
+ REQUIRE(rdata2 != NULL);
+ REQUIRE(rdata1->data != NULL);
+ REQUIRE(rdata2->data != NULL);
+ REQUIRE(DNS_RDATA_VALIDFLAGS(rdata1));
+ REQUIRE(DNS_RDATA_VALIDFLAGS(rdata2));
+
+ if (rdata1->rdclass != rdata2->rdclass)
+ return (rdata1->rdclass < rdata2->rdclass ? -1 : 1);
+
+ if (rdata1->type != rdata2->type)
+ return (rdata1->type < rdata2->type ? -1 : 1);
+
+ CASECOMPARESWITCH
+
+ if (use_default) {
+ isc_region_t r1;
+ isc_region_t r2;
+
+ dns_rdata_toregion(rdata1, &r1);
+ dns_rdata_toregion(rdata2, &r2);
+ result = isc_region_compare(&r1, &r2);
+ }
+ return (result);
+}
+
/***
*** Conversions
***/
@@ -1772,3 +1787,93 @@ dns_rdatatype_isknown(dns_rdatatype_t type) {
return (ISC_TRUE);
return (ISC_FALSE);
}
+
+void
+dns_rdata_exists(dns_rdata_t *rdata, dns_rdatatype_t type) {
+
+ REQUIRE(rdata != NULL);
+ REQUIRE(DNS_RDATA_INITIALIZED(rdata));
+
+ rdata->data = NULL;
+ rdata->length = 0;
+ rdata->flags = DNS_RDATA_UPDATE;
+ rdata->type = type;
+ rdata->rdclass = dns_rdataclass_any;
+}
+
+void
+dns_rdata_notexist(dns_rdata_t *rdata, dns_rdatatype_t type) {
+
+ REQUIRE(rdata != NULL);
+ REQUIRE(DNS_RDATA_INITIALIZED(rdata));
+
+ rdata->data = NULL;
+ rdata->length = 0;
+ rdata->flags = DNS_RDATA_UPDATE;
+ rdata->type = type;
+ rdata->rdclass = dns_rdataclass_none;
+}
+
+void
+dns_rdata_deleterrset(dns_rdata_t *rdata, dns_rdatatype_t type) {
+
+ REQUIRE(rdata != NULL);
+ REQUIRE(DNS_RDATA_INITIALIZED(rdata));
+
+ rdata->data = NULL;
+ rdata->length = 0;
+ rdata->flags = DNS_RDATA_UPDATE;
+ rdata->type = type;
+ rdata->rdclass = dns_rdataclass_any;
+}
+
+void
+dns_rdata_makedelete(dns_rdata_t *rdata) {
+ REQUIRE(rdata != NULL);
+
+ rdata->rdclass = dns_rdataclass_none;
+}
+
+const char *
+dns_rdata_updateop(dns_rdata_t *rdata, dns_section_t section) {
+
+ REQUIRE(rdata != NULL);
+ REQUIRE(DNS_RDATA_INITIALIZED(rdata));
+
+ switch (section) {
+ case DNS_SECTION_PREREQUISITE:
+ switch (rdata->rdclass) {
+ case dns_rdataclass_none:
+ switch (rdata->type) {
+ case dns_rdatatype_any:
+ return ("domain doesn't exist");
+ default:
+ return ("rrset doesn't exist");
+ }
+ case dns_rdataclass_any:
+ switch (rdata->type) {
+ case dns_rdatatype_any:
+ return ("domain exists");
+ default:
+ return ("rrset exists (value independent)");
+ }
+ default:
+ return ("rrset exists (value dependent)");
+ }
+ case DNS_SECTION_UPDATE:
+ switch (rdata->rdclass) {
+ case dns_rdataclass_none:
+ return ("delete");
+ case dns_rdataclass_any:
+ switch (rdata->type) {
+ case dns_rdatatype_any:
+ return ("delete all rrsets");
+ default:
+ return ("delete rrset");
+ }
+ default:
+ return ("add");
+ }
+ }
+ return ("invalid");
+}
diff --git a/contrib/bind9/lib/dns/rdata/any_255/tsig_250.c b/contrib/bind9/lib/dns/rdata/any_255/tsig_250.c
index e698239..9763f6d 100644
--- a/contrib/bind9/lib/dns/rdata/any_255/tsig_250.c
+++ b/contrib/bind9/lib/dns/rdata/any_255/tsig_250.c
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004, 2005, 2007 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004, 2005, 2007, 2009 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 1999-2003 Internet Software Consortium.
*
* Permission to use, copy, modify, and/or distribute this software for any
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: tsig_250.c,v 1.63 2007-06-19 23:47:17 tbox Exp $ */
+/* $Id: tsig_250.c,v 1.65 2009-12-04 22:06:37 tbox Exp $ */
/* Reviewed: Thu Mar 16 13:39:43 PST 2000 by gson */
@@ -594,4 +594,9 @@ checknames_any_tsig(ARGS_CHECKNAMES) {
return (ISC_TRUE);
}
+static inline int
+casecompare_any_tsig(ARGS_COMPARE) {
+ return (compare_any_tsig(rdata1, rdata2));
+}
+
#endif /* RDATA_ANY_255_TSIG_250_C */
diff --git a/contrib/bind9/lib/dns/rdata/ch_3/a_1.c b/contrib/bind9/lib/dns/rdata/ch_3/a_1.c
index 156caac..2623f76 100644
--- a/contrib/bind9/lib/dns/rdata/ch_3/a_1.c
+++ b/contrib/bind9/lib/dns/rdata/ch_3/a_1.c
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2005, 2007 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2005, 2007, 2009 Internet Systems Consortium, Inc. ("ISC")
*
* Permission to use, copy, modify, and/or distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
@@ -14,7 +14,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: a_1.c,v 1.6 2007-06-19 23:47:17 tbox Exp $ */
+/* $Id: a_1.c,v 1.8 2009-12-04 22:06:37 tbox Exp $ */
/* by Bjorn.Victor@it.uu.se, 2005-05-07 */
/* Based on generic/soa_6.c and generic/mx_15.c */
@@ -107,7 +107,7 @@ fromwire_ch_a(ARGS_FROMWIRE) {
dns_decompress_setmethods(dctx, DNS_COMPRESS_GLOBAL14);
dns_name_init(&name, NULL);
-
+
RETERR(dns_name_fromwire(&name, source, dctx, options, target));
isc_buffer_activeregion(source, &sregion);
@@ -205,7 +205,7 @@ fromstruct_ch_a(ARGS_FROMSTRUCT) {
dns_name_toregion(&a->ch_addr_dom, &region);
RETERR(isc_buffer_copyregion(target, &region));
-
+
return (uint16_tobuffer(ntohs(a->ch_addr), target));
}
@@ -313,4 +313,8 @@ checknames_ch_a(ARGS_CHECKNAMES) {
return (ISC_TRUE);
}
+static inline int
+casecompare_ch_a(ARGS_COMPARE) {
+ return (compare_ch_a(rdata1, rdata2));
+}
#endif /* RDATA_CH_3_A_1_C */
diff --git a/contrib/bind9/lib/dns/rdata/generic/afsdb_18.c b/contrib/bind9/lib/dns/rdata/generic/afsdb_18.c
index f82167be..bd1d1e0 100644
--- a/contrib/bind9/lib/dns/rdata/generic/afsdb_18.c
+++ b/contrib/bind9/lib/dns/rdata/generic/afsdb_18.c
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004, 2005, 2007 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004, 2005, 2007, 2009 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 1999-2001, 2003 Internet Software Consortium.
*
* Permission to use, copy, modify, and/or distribute this software for any
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: afsdb_18.c,v 1.47 2007-06-19 23:47:17 tbox Exp $ */
+/* $Id: afsdb_18.c,v 1.49 2009-12-04 22:06:37 tbox Exp $ */
/* Reviewed: Wed Mar 15 14:59:00 PST 2000 by explorer */
@@ -306,4 +306,8 @@ checknames_afsdb(ARGS_CHECKNAMES) {
return (ISC_TRUE);
}
+static inline int
+casecompare_afsdb(ARGS_COMPARE) {
+ return (compare_afsdb(rdata1, rdata2));
+}
#endif /* RDATA_GENERIC_AFSDB_18_C */
diff --git a/contrib/bind9/lib/dns/rdata/generic/cert_37.c b/contrib/bind9/lib/dns/rdata/generic/cert_37.c
index e0398d2..d06b4e6 100644
--- a/contrib/bind9/lib/dns/rdata/generic/cert_37.c
+++ b/contrib/bind9/lib/dns/rdata/generic/cert_37.c
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004, 2005, 2007 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004, 2005, 2007, 2009 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 1999-2003 Internet Software Consortium.
*
* Permission to use, copy, modify, and/or distribute this software for any
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: cert_37.c,v 1.50 2007-06-19 23:47:17 tbox Exp $ */
+/* $Id: cert_37.c,v 1.52 2009-12-04 22:06:37 tbox Exp $ */
/* Reviewed: Wed Mar 15 21:14:32 EST 2000 by tale */
@@ -276,5 +276,9 @@ checknames_cert(ARGS_CHECKNAMES) {
return (ISC_TRUE);
}
-#endif /* RDATA_GENERIC_CERT_37_C */
+static inline int
+casecompare_cert(ARGS_COMPARE) {
+ return (compare_cert(rdata1, rdata2));
+}
+#endif /* RDATA_GENERIC_CERT_37_C */
diff --git a/contrib/bind9/lib/dns/rdata/generic/cname_5.c b/contrib/bind9/lib/dns/rdata/generic/cname_5.c
index f44d8c5..508bb20 100644
--- a/contrib/bind9/lib/dns/rdata/generic/cname_5.c
+++ b/contrib/bind9/lib/dns/rdata/generic/cname_5.c
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004, 2007 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004, 2007, 2009 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 1998-2001 Internet Software Consortium.
*
* Permission to use, copy, modify, and/or distribute this software for any
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: cname_5.c,v 1.47 2007-06-19 23:47:17 tbox Exp $ */
+/* $Id: cname_5.c,v 1.49 2009-12-04 22:06:37 tbox Exp $ */
/* reviewed: Wed Mar 15 16:48:45 PST 2000 by brister */
@@ -229,4 +229,9 @@ checknames_cname(ARGS_CHECKNAMES) {
return (ISC_TRUE);
}
+static inline int
+casecompare_cname(ARGS_COMPARE) {
+ return (compare_cname(rdata1, rdata2));
+}
+
#endif /* RDATA_GENERIC_CNAME_5_C */
diff --git a/contrib/bind9/lib/dns/rdata/generic/dlv_32769.c b/contrib/bind9/lib/dns/rdata/generic/dlv_32769.c
index 21d7abbb4..0f87433c 100644
--- a/contrib/bind9/lib/dns/rdata/generic/dlv_32769.c
+++ b/contrib/bind9/lib/dns/rdata/generic/dlv_32769.c
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004, 2006, 2007 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004, 2006, 2007, 2009, 2010 Internet Systems Consortium, Inc. ("ISC")
*
* Permission to use, copy, modify, and/or distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
@@ -14,7 +14,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: dlv_32769.c,v 1.6 2007-06-18 23:47:43 tbox Exp $ */
+/* $Id: dlv_32769.c,v 1.10 2010-12-23 23:47:08 tbox Exp $ */
/* draft-ietf-dnsext-delegation-signer-05.txt */
@@ -74,12 +74,20 @@ fromtext_dlv(ARGS_FROMTEXT) {
/*
* Digest.
*/
- if (c == DNS_DSDIGEST_SHA1)
+ switch (c) {
+ case DNS_DSDIGEST_SHA1:
length = ISC_SHA1_DIGESTLENGTH;
- else if (c == DNS_DSDIGEST_SHA256)
+ break;
+ case DNS_DSDIGEST_SHA256:
length = ISC_SHA256_DIGESTLENGTH;
- else
+ break;
+ case DNS_DSDIGEST_GOST:
+ length = ISC_GOST_DIGESTLENGTH;
+ break;
+ default:
length = -1;
+ break;
+ }
return (isc_hex_tobuffer(lexer, target, -1));
}
@@ -144,7 +152,7 @@ fromwire_dlv(ARGS_FROMWIRE) {
UNUSED(options);
isc_buffer_activeregion(source, &sr);
-
+
/*
* Check digest lengths if we know them.
*/
@@ -152,7 +160,9 @@ fromwire_dlv(ARGS_FROMWIRE) {
(sr.base[3] == DNS_DSDIGEST_SHA1 &&
sr.length < 4 + ISC_SHA1_DIGESTLENGTH) ||
(sr.base[3] == DNS_DSDIGEST_SHA256 &&
- sr.length < 4 + ISC_SHA256_DIGESTLENGTH))
+ sr.length < 4 + ISC_SHA256_DIGESTLENGTH) ||
+ (sr.base[3] == DNS_DSDIGEST_GOST &&
+ sr.length < 4 + ISC_GOST_DIGESTLENGTH))
return (ISC_R_UNEXPECTEDEND);
/*
@@ -164,7 +174,9 @@ fromwire_dlv(ARGS_FROMWIRE) {
sr.length = 4 + ISC_SHA1_DIGESTLENGTH;
else if (sr.base[3] == DNS_DSDIGEST_SHA256)
sr.length = 4 + ISC_SHA256_DIGESTLENGTH;
-
+ else if (sr.base[3] == DNS_DSDIGEST_GOST)
+ sr.length = 4 + ISC_GOST_DIGESTLENGTH;
+
isc_buffer_forward(source, sr.length);
return (mem_tobuffer(target, sr.base, sr.length));
}
@@ -213,6 +225,9 @@ fromstruct_dlv(ARGS_FROMSTRUCT) {
case DNS_DSDIGEST_SHA256:
REQUIRE(dlv->length == ISC_SHA256_DIGESTLENGTH);
break;
+ case DNS_DSDIGEST_GOST:
+ REQUIRE(dlv->length == ISC_GOST_DIGESTLENGTH);
+ break;
}
UNUSED(type);
@@ -318,4 +333,9 @@ checknames_dlv(ARGS_CHECKNAMES) {
return (ISC_TRUE);
}
+static inline int
+casecompare_dlv(ARGS_COMPARE) {
+ return (compare_dlv(rdata1, rdata2));
+}
+
#endif /* RDATA_GENERIC_DLV_32769_C */
diff --git a/contrib/bind9/lib/dns/rdata/generic/dname_39.c b/contrib/bind9/lib/dns/rdata/generic/dname_39.c
index e36702d..61356bf 100644
--- a/contrib/bind9/lib/dns/rdata/generic/dname_39.c
+++ b/contrib/bind9/lib/dns/rdata/generic/dname_39.c
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004, 2007 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004, 2007, 2009 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 1999-2001 Internet Software Consortium.
*
* Permission to use, copy, modify, and/or distribute this software for any
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: dname_39.c,v 1.38 2007-06-19 23:47:17 tbox Exp $ */
+/* $Id: dname_39.c,v 1.40 2009-12-04 22:06:37 tbox Exp $ */
/* Reviewed: Wed Mar 15 16:52:38 PST 2000 by explorer */
@@ -230,4 +230,8 @@ checknames_dname(ARGS_CHECKNAMES) {
return (ISC_TRUE);
}
+static inline int
+casecompare_dname(ARGS_COMPARE) {
+ return (compare_dname(rdata1, rdata2));
+}
#endif /* RDATA_GENERIC_DNAME_39_C */
diff --git a/contrib/bind9/lib/dns/rdata/generic/dnskey_48.c b/contrib/bind9/lib/dns/rdata/generic/dnskey_48.c
index d526ca0..91fe9f8 100644
--- a/contrib/bind9/lib/dns/rdata/generic/dnskey_48.c
+++ b/contrib/bind9/lib/dns/rdata/generic/dnskey_48.c
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004, 2005, 2007 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004, 2005, 2007, 2009 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 2003 Internet Software Consortium.
*
* Permission to use, copy, modify, and/or distribute this software for any
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: dnskey_48.c,v 1.8 2007-06-19 23:47:17 tbox Exp $ */
+/* $Id: dnskey_48.c,v 1.10 2009-12-04 22:06:37 tbox Exp $ */
/*
* Reviewed: Wed Mar 15 16:47:10 PST 2000 by halley.
@@ -76,6 +76,7 @@ totext_dnskey(ARGS_TOTEXT) {
char buf[sizeof("64000")];
unsigned int flags;
unsigned char algorithm;
+ char namebuf[DNS_NAME_FORMATSIZE];
REQUIRE(rdata->type == 48);
REQUIRE(rdata->length != 0);
@@ -105,6 +106,15 @@ totext_dnskey(ARGS_TOTEXT) {
if ((flags & 0xc000) == 0xc000)
return (ISC_R_SUCCESS);
+ if ((tctx->flags & DNS_STYLEFLAG_COMMENT) != 0 &&
+ algorithm == DNS_KEYALG_PRIVATEDNS) {
+ dns_name_t name;
+ dns_name_init(&name, NULL);
+ dns_name_fromregion(&name, &sr);
+ dns_name_format(&name, namebuf, sizeof(namebuf));
+ } else
+ namebuf[0] = 0;
+
/* key */
if ((tctx->flags & DNS_STYLEFLAG_MULTILINE) != 0)
RETERR(str_totext(" (", target));
@@ -127,12 +137,18 @@ totext_dnskey(ARGS_TOTEXT) {
dns_rdata_toregion(rdata, &tmpr);
sprintf(buf, "%u", dst_region_computeid(&tmpr, algorithm));
RETERR(str_totext(buf, target));
+ if (algorithm == DNS_KEYALG_PRIVATEDNS) {
+ RETERR(str_totext(tctx->linebreak, target));
+ RETERR(str_totext("; alg = ", target));
+ RETERR(str_totext(namebuf, target));
+ }
}
return (ISC_R_SUCCESS);
}
static inline isc_result_t
fromwire_dnskey(ARGS_FROMWIRE) {
+ unsigned char algorithm;
isc_region_t sr;
REQUIRE(type == 48);
@@ -146,6 +162,18 @@ fromwire_dnskey(ARGS_FROMWIRE) {
if (sr.length < 4)
return (ISC_R_UNEXPECTEDEND);
+ algorithm = sr.base[3];
+ RETERR(mem_tobuffer(target, sr.base, 4));
+ isc_region_consume(&sr, 4);
+ isc_buffer_forward(source, 4);
+
+ if (algorithm == DNS_KEYALG_PRIVATEDNS) {
+ dns_name_t name;
+ dns_decompress_setmethods(dctx, DNS_COMPRESS_NONE);
+ dns_name_init(&name, NULL);
+ RETERR(dns_name_fromwire(&name, source, dctx, options, target));
+ }
+ isc_buffer_activeregion(source, &sr);
isc_buffer_forward(source, sr.length);
return (mem_tobuffer(target, sr.base, sr.length));
}
@@ -309,4 +337,13 @@ checknames_dnskey(ARGS_CHECKNAMES) {
return (ISC_TRUE);
}
+static inline int
+casecompare_dnskey(ARGS_COMPARE) {
+
+ /*
+ * Treat ALG 253 (private DNS) subtype name case sensistively.
+ */
+ return (compare_dnskey(rdata1, rdata2));
+}
+
#endif /* RDATA_GENERIC_DNSKEY_48_C */
diff --git a/contrib/bind9/lib/dns/rdata/generic/ds_43.c b/contrib/bind9/lib/dns/rdata/generic/ds_43.c
index fcaa69b..ee74ab67 100644
--- a/contrib/bind9/lib/dns/rdata/generic/ds_43.c
+++ b/contrib/bind9/lib/dns/rdata/generic/ds_43.c
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004, 2005, 2007 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004, 2005, 2007, 2009, 2010 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 2002 Internet Software Consortium.
*
* Permission to use, copy, modify, and/or distribute this software for any
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: ds_43.c,v 1.12 2007-06-18 23:47:43 tbox Exp $ */
+/* $Id: ds_43.c,v 1.16 2010-12-23 23:47:08 tbox Exp $ */
/* draft-ietf-dnsext-delegation-signer-05.txt */
@@ -74,12 +74,20 @@ fromtext_ds(ARGS_FROMTEXT) {
/*
* Digest.
*/
- if (c == DNS_DSDIGEST_SHA1)
+ switch (c) {
+ case DNS_DSDIGEST_SHA1:
length = ISC_SHA1_DIGESTLENGTH;
- else if (c == DNS_DSDIGEST_SHA256)
+ break;
+ case DNS_DSDIGEST_SHA256:
length = ISC_SHA256_DIGESTLENGTH;
- else
+ break;
+ case DNS_DSDIGEST_GOST:
+ length = ISC_GOST_DIGESTLENGTH;
+ break;
+ default:
length = -1;
+ break;
+ }
return (isc_hex_tobuffer(lexer, target, length));
}
@@ -152,7 +160,9 @@ fromwire_ds(ARGS_FROMWIRE) {
(sr.base[3] == DNS_DSDIGEST_SHA1 &&
sr.length < 4 + ISC_SHA1_DIGESTLENGTH) ||
(sr.base[3] == DNS_DSDIGEST_SHA256 &&
- sr.length < 4 + ISC_SHA256_DIGESTLENGTH))
+ sr.length < 4 + ISC_SHA256_DIGESTLENGTH) ||
+ (sr.base[3] == DNS_DSDIGEST_GOST &&
+ sr.length < 4 + ISC_GOST_DIGESTLENGTH))
return (ISC_R_UNEXPECTEDEND);
/*
@@ -164,6 +174,8 @@ fromwire_ds(ARGS_FROMWIRE) {
sr.length = 4 + ISC_SHA1_DIGESTLENGTH;
else if (sr.base[3] == DNS_DSDIGEST_SHA256)
sr.length = 4 + ISC_SHA256_DIGESTLENGTH;
+ else if (sr.base[3] == DNS_DSDIGEST_GOST)
+ sr.length = 4 + ISC_GOST_DIGESTLENGTH;
isc_buffer_forward(source, sr.length);
return (mem_tobuffer(target, sr.base, sr.length));
@@ -213,6 +225,9 @@ fromstruct_ds(ARGS_FROMSTRUCT) {
case DNS_DSDIGEST_SHA256:
REQUIRE(ds->length == ISC_SHA256_DIGESTLENGTH);
break;
+ case DNS_DSDIGEST_GOST:
+ REQUIRE(ds->length == ISC_GOST_DIGESTLENGTH);
+ break;
}
UNUSED(type);
@@ -318,4 +333,9 @@ checknames_ds(ARGS_CHECKNAMES) {
return (ISC_TRUE);
}
+static inline int
+casecompare_ds(ARGS_COMPARE) {
+ return (compare_ds(rdata1, rdata2));
+}
+
#endif /* RDATA_GENERIC_DS_43_C */
diff --git a/contrib/bind9/lib/dns/rdata/generic/gpos_27.c b/contrib/bind9/lib/dns/rdata/generic/gpos_27.c
index 35fcc50..7a3992a 100644
--- a/contrib/bind9/lib/dns/rdata/generic/gpos_27.c
+++ b/contrib/bind9/lib/dns/rdata/generic/gpos_27.c
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004, 2005, 2007 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004, 2005, 2007, 2009 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 1999-2002 Internet Software Consortium.
*
* Permission to use, copy, modify, and/or distribute this software for any
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: gpos_27.c,v 1.41 2007-06-19 23:47:17 tbox Exp $ */
+/* $Id: gpos_27.c,v 1.43 2009-12-04 22:06:37 tbox Exp $ */
/* reviewed: Wed Mar 15 16:48:45 PST 2000 by brister */
@@ -249,4 +249,9 @@ checknames_gpos(ARGS_CHECKNAMES) {
return (ISC_TRUE);
}
+static inline int
+casecompare_gpos(ARGS_COMPARE) {
+ return (compare_gpos(rdata1, rdata2));
+}
+
#endif /* RDATA_GENERIC_GPOS_27_C */
diff --git a/contrib/bind9/lib/dns/rdata/generic/hinfo_13.c b/contrib/bind9/lib/dns/rdata/generic/hinfo_13.c
index 7f31ab0..6b301e6 100644
--- a/contrib/bind9/lib/dns/rdata/generic/hinfo_13.c
+++ b/contrib/bind9/lib/dns/rdata/generic/hinfo_13.c
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004, 2007 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004, 2007, 2009 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 1998-2002 Internet Software Consortium.
*
* Permission to use, copy, modify, and/or distribute this software for any
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: hinfo_13.c,v 1.44 2007-06-19 23:47:17 tbox Exp $ */
+/* $Id: hinfo_13.c,v 1.46 2009-12-04 22:06:37 tbox Exp $ */
/*
* Reviewed: Wed Mar 15 16:47:10 PST 2000 by halley.
@@ -221,4 +221,8 @@ checknames_hinfo(ARGS_CHECKNAMES) {
return (ISC_TRUE);
}
+static inline int
+casecompare_hinfo(ARGS_COMPARE) {
+ return (compare_hinfo(rdata1, rdata2));
+}
#endif /* RDATA_GENERIC_HINFO_13_C */
diff --git a/contrib/bind9/lib/dns/rdata/generic/hip_55.c b/contrib/bind9/lib/dns/rdata/generic/hip_55.c
new file mode 100644
index 0000000..4cda9c6
--- /dev/null
+++ b/contrib/bind9/lib/dns/rdata/generic/hip_55.c
@@ -0,0 +1,506 @@
+/*
+ * Copyright (C) 2009, 2011 Internet Systems Consortium, Inc. ("ISC")
+ *
+ * Permission to use, copy, modify, and/or 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 ISC DISCLAIMS ALL WARRANTIES WITH
+ * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+ * AND FITNESS. IN NO EVENT SHALL ISC 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.
+ */
+
+/* $Id: hip_55.c,v 1.8 2011-01-13 04:59:26 tbox Exp $ */
+
+/* reviewed: TBC */
+
+/* RFC 5205 */
+
+#ifndef RDATA_GENERIC_HIP_5_C
+#define RDATA_GENERIC_HIP_5_C
+
+#define RRTYPE_HIP_ATTRIBUTES (0)
+
+static inline isc_result_t
+fromtext_hip(ARGS_FROMTEXT) {
+ isc_token_t token;
+ dns_name_t name;
+ isc_buffer_t buffer;
+ isc_buffer_t hit_len;
+ isc_buffer_t key_len;
+ unsigned char *start;
+ size_t len;
+
+ REQUIRE(type == 55);
+
+ UNUSED(type);
+ UNUSED(rdclass);
+ UNUSED(callbacks);
+
+ /*
+ * Dummy HIT len.
+ */
+ hit_len = *target;
+ RETERR(uint8_tobuffer(0, target));
+
+ /*
+ * Algorithm.
+ */
+ RETERR(isc_lex_getmastertoken(lexer, &token, isc_tokentype_number,
+ ISC_FALSE));
+ if (token.value.as_ulong > 0xffU)
+ RETTOK(ISC_R_RANGE);
+ RETERR(uint8_tobuffer(token.value.as_ulong, target));
+
+ /*
+ * Dummy KEY len.
+ */
+ key_len = *target;
+ RETERR(uint16_tobuffer(0, target));
+
+ /*
+ * HIT (base16).
+ */
+ start = isc_buffer_used(target);
+ RETERR(isc_lex_getmastertoken(lexer, &token, isc_tokentype_string,
+ ISC_FALSE));
+ RETTOK(isc_hex_decodestring(DNS_AS_STR(token), target));
+
+ /*
+ * Fill in HIT len.
+ */
+ len = (unsigned char *)isc_buffer_used(target) - start;
+ if (len > 0xffU)
+ RETTOK(ISC_R_RANGE);
+ RETERR(uint8_tobuffer(len, &hit_len));
+
+ /*
+ * Public key (base64).
+ */
+ start = isc_buffer_used(target);
+ RETERR(isc_lex_getmastertoken(lexer, &token, isc_tokentype_string,
+ ISC_FALSE));
+ RETTOK(isc_base64_decodestring(DNS_AS_STR(token), target));
+
+ /*
+ * Fill in KEY len.
+ */
+ len = (unsigned char *)isc_buffer_used(target) - start;
+ if (len > 0xffffU)
+ RETTOK(ISC_R_RANGE);
+ RETERR(uint16_tobuffer(len, &key_len));
+
+ /*
+ * Rendezvous Servers.
+ */
+ dns_name_init(&name, NULL);
+ do {
+ RETERR(isc_lex_getmastertoken(lexer, &token,
+ isc_tokentype_string,
+ ISC_TRUE));
+ if (token.type != isc_tokentype_string)
+ break;
+ buffer_fromregion(&buffer, &token.value.as_region);
+ origin = (origin != NULL) ? origin : dns_rootname;
+ RETTOK(dns_name_fromtext(&name, &buffer, origin, options,
+ target));
+ } while (1);
+
+ /*
+ * Let upper layer handle eol/eof.
+ */
+ isc_lex_ungettoken(lexer, &token);
+
+ return (ISC_R_SUCCESS);
+}
+
+static inline isc_result_t
+totext_hip(ARGS_TOTEXT) {
+ isc_region_t region;
+ dns_name_t name;
+ size_t length, key_len, hit_len;
+ unsigned char algorithm;
+ char buf[sizeof("225 ")];
+
+ REQUIRE(rdata->type == 55);
+ REQUIRE(rdata->length != 0);
+
+ dns_rdata_toregion(rdata, &region);
+
+ hit_len = uint8_fromregion(&region);
+ isc_region_consume(&region, 1);
+
+ algorithm = uint8_fromregion(&region);
+ isc_region_consume(&region, 1);
+
+ key_len = uint16_fromregion(&region);
+ isc_region_consume(&region, 2);
+
+ if ((tctx->flags & DNS_STYLEFLAG_MULTILINE) != 0)
+ RETERR(str_totext("( ", target));
+
+ /*
+ * Algorithm
+ */
+ sprintf(buf, "%u ", algorithm);
+ RETERR(str_totext(buf, target));
+
+ /*
+ * HIT.
+ */
+ INSIST(hit_len < region.length);
+ length = region.length;
+ region.length = hit_len;
+ RETERR(isc_hex_totext(&region, 1, "", target));
+ region.length = length - hit_len;
+ RETERR(str_totext(tctx->linebreak, target));
+
+ /*
+ * Public KEY.
+ */
+ INSIST(key_len <= region.length);
+ length = region.length;
+ region.length = key_len;
+ RETERR(isc_base64_totext(&region, 1, "", target));
+ region.length = length - key_len;
+ RETERR(str_totext(tctx->linebreak, target));
+
+ /*
+ * Rendezvous Servers.
+ */
+ dns_name_init(&name, NULL);
+ while (region.length > 0) {
+ dns_name_fromregion(&name, &region);
+
+ RETERR(dns_name_totext(&name, ISC_FALSE, target));
+ isc_region_consume(&region, name.length);
+ if (region.length > 0)
+ RETERR(str_totext(tctx->linebreak, target));
+ }
+ if ((tctx->flags & DNS_STYLEFLAG_MULTILINE) != 0)
+ RETERR(str_totext(" )", target));
+ return (ISC_R_SUCCESS);
+}
+
+static inline isc_result_t
+fromwire_hip(ARGS_FROMWIRE) {
+ isc_region_t region, rr;
+ dns_name_t name;
+ isc_uint8_t hit_len;
+ isc_uint16_t key_len;
+
+ REQUIRE(type == 55);
+
+ UNUSED(type);
+ UNUSED(rdclass);
+
+ isc_buffer_activeregion(source, &region);
+ if (region.length < 4U)
+ RETERR(DNS_R_FORMERR);
+
+ rr = region;
+ hit_len = uint8_fromregion(&region);
+ if (hit_len == 0)
+ RETERR(DNS_R_FORMERR);
+ isc_region_consume(&region, 2); /* hit length + algorithm */
+ key_len = uint16_fromregion(&region);
+ if (key_len == 0)
+ RETERR(DNS_R_FORMERR);
+ isc_region_consume(&region, 2);
+ if (region.length < (unsigned) (hit_len + key_len))
+ RETERR(DNS_R_FORMERR);
+
+ RETERR(mem_tobuffer(target, rr.base, 4 + hit_len + key_len));
+ isc_buffer_forward(source, 4 + hit_len + key_len);
+
+ dns_decompress_setmethods(dctx, DNS_COMPRESS_NONE);
+ while (isc_buffer_activelength(source) > 0) {
+ dns_name_init(&name, NULL);
+ RETERR(dns_name_fromwire(&name, source, dctx, options, target));
+ }
+ return (ISC_R_SUCCESS);
+}
+
+static inline isc_result_t
+towire_hip(ARGS_TOWIRE) {
+ isc_region_t region;
+
+ REQUIRE(rdata->type == 55);
+ REQUIRE(rdata->length != 0);
+
+ UNUSED(cctx);
+
+ dns_rdata_toregion(rdata, &region);
+ return (mem_tobuffer(target, region.base, region.length));
+}
+
+static inline int
+compare_hip(ARGS_COMPARE) {
+ isc_region_t region1;
+ isc_region_t region2;
+
+ REQUIRE(rdata1->type == rdata2->type);
+ REQUIRE(rdata1->rdclass == rdata2->rdclass);
+ REQUIRE(rdata1->type == 55);
+ REQUIRE(rdata1->length != 0);
+ REQUIRE(rdata2->length != 0);
+
+ dns_rdata_toregion(rdata1, &region1);
+ dns_rdata_toregion(rdata2, &region2);
+ return (isc_region_compare(&region1, &region2));
+}
+
+static inline isc_result_t
+fromstruct_hip(ARGS_FROMSTRUCT) {
+ dns_rdata_hip_t *hip = source;
+ dns_rdata_hip_t myhip;
+ isc_result_t result;
+
+ REQUIRE(type == 55);
+ REQUIRE(source != NULL);
+ REQUIRE(hip->common.rdtype == type);
+ REQUIRE(hip->common.rdclass == rdclass);
+ REQUIRE(hip->hit_len > 0 && hip->hit != NULL);
+ REQUIRE(hip->key_len > 0 && hip->key != NULL);
+ REQUIRE((hip->servers == NULL && hip->servers_len == 0) ||
+ (hip->servers != NULL && hip->servers_len != 0));
+
+ UNUSED(type);
+ UNUSED(rdclass);
+
+ RETERR(uint8_tobuffer(hip->hit_len, target));
+ RETERR(uint8_tobuffer(hip->algorithm, target));
+ RETERR(uint16_tobuffer(hip->key_len, target));
+ RETERR(mem_tobuffer(target, hip->hit, hip->hit_len));
+ RETERR(mem_tobuffer(target, hip->key, hip->key_len));
+
+ myhip = *hip;
+ for (result = dns_rdata_hip_first(&myhip);
+ result == ISC_R_SUCCESS;
+ result = dns_rdata_hip_next(&myhip))
+ /* empty */;
+
+ return(mem_tobuffer(target, hip->servers, hip->servers_len));
+}
+
+static inline isc_result_t
+tostruct_hip(ARGS_TOSTRUCT) {
+ isc_region_t region;
+ dns_rdata_hip_t *hip = target;
+
+ REQUIRE(rdata->type == 55);
+ REQUIRE(target != NULL);
+ REQUIRE(rdata->length != 0);
+
+ hip->common.rdclass = rdata->rdclass;
+ hip->common.rdtype = rdata->type;
+ ISC_LINK_INIT(&hip->common, link);
+
+ dns_rdata_toregion(rdata, &region);
+
+ hip->hit_len = uint8_fromregion(&region);
+ isc_region_consume(&region, 1);
+
+ hip->algorithm = uint8_fromregion(&region);
+ isc_region_consume(&region, 1);
+
+ hip->key_len = uint16_fromregion(&region);
+ isc_region_consume(&region, 2);
+
+ hip->hit = hip->key = hip->servers = NULL;
+
+ hip->hit = mem_maybedup(mctx, region.base, hip->hit_len);
+ if (hip->hit == NULL)
+ goto cleanup;
+ isc_region_consume(&region, hip->hit_len);
+
+ hip->key = mem_maybedup(mctx, region.base, hip->key_len);
+ if (hip->key == NULL)
+ goto cleanup;
+ isc_region_consume(&region, hip->key_len);
+
+ hip->servers_len = region.length;
+ if (hip->servers_len != 0) {
+ hip->servers = mem_maybedup(mctx, region.base, region.length);
+ if (hip->servers == NULL)
+ goto cleanup;
+ }
+
+ hip->offset = hip->servers_len;
+ hip->mctx = mctx;
+ return (ISC_R_SUCCESS);
+
+ cleanup:
+ if (hip->hit != NULL)
+ isc_mem_free(mctx, hip->hit);
+ if (hip->key != NULL)
+ isc_mem_free(mctx, hip->key);
+ if (hip->servers != NULL)
+ isc_mem_free(mctx, hip->servers);
+ return (ISC_R_NOMEMORY);
+
+}
+
+static inline void
+freestruct_hip(ARGS_FREESTRUCT) {
+ dns_rdata_hip_t *hip = source;
+
+ REQUIRE(source != NULL);
+
+ if (hip->mctx == NULL)
+ return;
+
+ isc_mem_free(hip->mctx, hip->hit);
+ isc_mem_free(hip->mctx, hip->key);
+ if (hip->servers != NULL)
+ isc_mem_free(hip->mctx, hip->servers);
+ hip->mctx = NULL;
+}
+
+static inline isc_result_t
+additionaldata_hip(ARGS_ADDLDATA) {
+ UNUSED(rdata);
+ UNUSED(add);
+ UNUSED(arg);
+
+ REQUIRE(rdata->type == 55);
+
+ return (ISC_R_SUCCESS);
+}
+
+static inline isc_result_t
+digest_hip(ARGS_DIGEST) {
+ isc_region_t r;
+
+ REQUIRE(rdata->type == 55);
+
+ dns_rdata_toregion(rdata, &r);
+ return ((digest)(arg, &r));
+}
+
+static inline isc_boolean_t
+checkowner_hip(ARGS_CHECKOWNER) {
+
+ REQUIRE(type == 55);
+
+ UNUSED(name);
+ UNUSED(type);
+ UNUSED(rdclass);
+ UNUSED(wildcard);
+
+ return (ISC_TRUE);
+}
+
+static inline isc_boolean_t
+checknames_hip(ARGS_CHECKNAMES) {
+
+ REQUIRE(rdata->type == 55);
+
+ UNUSED(rdata);
+ UNUSED(owner);
+ UNUSED(bad);
+
+ return (ISC_TRUE);
+}
+
+isc_result_t
+dns_rdata_hip_first(dns_rdata_hip_t *hip) {
+ if (hip->servers_len == 0)
+ return (ISC_R_NOMORE);
+ hip->offset = 0;
+ return (ISC_R_SUCCESS);
+}
+
+isc_result_t
+dns_rdata_hip_next(dns_rdata_hip_t *hip) {
+ isc_region_t region;
+ dns_name_t name;
+
+ if (hip->offset >= hip->servers_len)
+ return (ISC_R_NOMORE);
+
+ region.base = hip->servers + hip->offset;
+ region.length = hip->servers_len - hip->offset;
+ dns_name_init(&name, NULL);
+ dns_name_fromregion(&name, &region);
+ hip->offset += name.length;
+ INSIST(hip->offset <= hip->servers_len);
+ return (ISC_R_SUCCESS);
+}
+
+void
+dns_rdata_hip_current(dns_rdata_hip_t *hip, dns_name_t *name) {
+ isc_region_t region;
+
+ REQUIRE(hip->offset < hip->servers_len);
+
+ region.base = hip->servers + hip->offset;
+ region.length = hip->servers_len - hip->offset;
+ dns_name_fromregion(name, &region);
+
+ INSIST(name->length + hip->offset <= hip->servers_len);
+}
+
+static inline int
+casecompare_hip(ARGS_COMPARE) {
+ isc_region_t r1;
+ isc_region_t r2;
+ dns_name_t name1;
+ dns_name_t name2;
+ int order;
+ isc_uint8_t hit_len;
+ isc_uint16_t key_len;
+
+ REQUIRE(rdata1->type == rdata2->type);
+ REQUIRE(rdata1->rdclass == rdata2->rdclass);
+ REQUIRE(rdata1->type == 55);
+ REQUIRE(rdata1->length != 0);
+ REQUIRE(rdata2->length != 0);
+
+ dns_rdata_toregion(rdata1, &r1);
+ dns_rdata_toregion(rdata2, &r2);
+
+ INSIST(r1.length > 4);
+ INSIST(r2.length > 4);
+ r1.length = 4;
+ r2.length = 4;
+ order = isc_region_compare(&r1, &r2);
+ if (order != 0)
+ return (order);
+
+ hit_len = uint8_fromregion(&r1);
+ isc_region_consume(&r1, 2); /* hit length + algorithm */
+ key_len = uint16_fromregion(&r1);
+
+ dns_rdata_toregion(rdata1, &r1);
+ dns_rdata_toregion(rdata2, &r2);
+ isc_region_consume(&r1, 4);
+ isc_region_consume(&r2, 4);
+ INSIST(r1.length >= (unsigned) (hit_len + key_len));
+ INSIST(r2.length >= (unsigned) (hit_len + key_len));
+ order = isc_region_compare(&r1, &r2);
+ if (order != 0)
+ return (order);
+ isc_region_consume(&r1, hit_len + key_len);
+ isc_region_consume(&r2, hit_len + key_len);
+
+ dns_name_init(&name1, NULL);
+ dns_name_init(&name2, NULL);
+ while (r1.length != 0 && r2.length != 0) {
+ dns_name_fromregion(&name1, &r1);
+ dns_name_fromregion(&name2, &r2);
+ order = dns_name_rdatacompare(&name1, &name2);
+ if (order != 0)
+ return (order);
+
+ isc_region_consume(&r1, name_length(&name1));
+ isc_region_consume(&r2, name_length(&name2));
+ }
+ return (isc_region_compare(&r1, &r2));
+}
+
+#endif /* RDATA_GENERIC_HIP_5_C */
diff --git a/contrib/bind9/lib/dns/rdata/generic/hip_55.h b/contrib/bind9/lib/dns/rdata/generic/hip_55.h
new file mode 100644
index 0000000..79828ad
--- /dev/null
+++ b/contrib/bind9/lib/dns/rdata/generic/hip_55.h
@@ -0,0 +1,47 @@
+/*
+ * Copyright (C) 2009 Internet Systems Consortium, Inc. ("ISC")
+ *
+ * Permission to use, copy, modify, and/or 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 ISC DISCLAIMS ALL WARRANTIES WITH
+ * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+ * AND FITNESS. IN NO EVENT SHALL ISC 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.
+ */
+
+/* $Id: hip_55.h,v 1.2 2009-02-26 06:09:19 marka Exp $ */
+
+#ifndef GENERIC_HIP_5_H
+#define GENERIC_HIP_5_H 1
+
+/* RFC 5205 */
+
+typedef struct dns_rdata_hip {
+ dns_rdatacommon_t common;
+ isc_mem_t * mctx;
+ unsigned char * hit;
+ unsigned char * key;
+ unsigned char * servers;
+ isc_uint8_t algorithm;
+ isc_uint8_t hit_len;
+ isc_uint16_t key_len;
+ isc_uint16_t servers_len;
+ /* Private */
+ isc_uint16_t offset;
+} dns_rdata_hip_t;
+
+isc_result_t
+dns_rdata_hip_first(dns_rdata_hip_t *);
+
+isc_result_t
+dns_rdata_hip_next(dns_rdata_hip_t *);
+
+void
+dns_rdata_hip_current(dns_rdata_hip_t *, dns_name_t *);
+
+#endif /* GENERIC_HIP_5_H */
diff --git a/contrib/bind9/lib/dns/rdata/generic/ipseckey_45.c b/contrib/bind9/lib/dns/rdata/generic/ipseckey_45.c
index f971d49..995a135 100644
--- a/contrib/bind9/lib/dns/rdata/generic/ipseckey_45.c
+++ b/contrib/bind9/lib/dns/rdata/generic/ipseckey_45.c
@@ -14,7 +14,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: ipseckey_45.c,v 1.4.332.5 2011-01-13 04:48:23 tbox Exp $ */
+/* $Id: ipseckey_45.c,v 1.11 2011-01-13 04:59:26 tbox Exp $ */
#ifndef RDATA_GENERIC_IPSECKEY_45_C
#define RDATA_GENERIC_IPSECKEY_45_C
@@ -456,4 +456,43 @@ checknames_ipseckey(ARGS_CHECKNAMES) {
return (ISC_TRUE);
}
+static inline int
+casecompare_ipseckey(ARGS_COMPARE) {
+ isc_region_t region1;
+ isc_region_t region2;
+ dns_name_t name1;
+ dns_name_t name2;
+ int order;
+
+ REQUIRE(rdata1->type == rdata2->type);
+ REQUIRE(rdata1->rdclass == rdata2->rdclass);
+ REQUIRE(rdata1->type == 45);
+ REQUIRE(rdata1->length >= 3);
+ REQUIRE(rdata2->length >= 3);
+
+ dns_rdata_toregion(rdata1, &region1);
+ dns_rdata_toregion(rdata2, &region2);
+
+ if (memcmp(region1.base, region2.base, 3) != 0 || region1.base[1] != 3)
+ return (isc_region_compare(&region1, &region2));
+
+ dns_name_init(&name1, NULL);
+ dns_name_init(&name2, NULL);
+
+ isc_region_consume(&region1, 3);
+ isc_region_consume(&region2, 3);
+
+ dns_name_fromregion(&name1, &region1);
+ dns_name_fromregion(&name2, &region2);
+
+ order = dns_name_rdatacompare(&name1, &name2);
+ if (order != 0)
+ return (order);
+
+ isc_region_consume(&region1, name_length(&name1));
+ isc_region_consume(&region2, name_length(&name2));
+
+ return (isc_region_compare(&region1, &region2));
+}
+
#endif /* RDATA_GENERIC_IPSECKEY_45_C */
diff --git a/contrib/bind9/lib/dns/rdata/generic/isdn_20.c b/contrib/bind9/lib/dns/rdata/generic/isdn_20.c
index a9e03b2c..b58776c 100644
--- a/contrib/bind9/lib/dns/rdata/generic/isdn_20.c
+++ b/contrib/bind9/lib/dns/rdata/generic/isdn_20.c
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004, 2005, 2007 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004, 2005, 2007, 2009 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 1999-2002 Internet Software Consortium.
*
* Permission to use, copy, modify, and/or distribute this software for any
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: isdn_20.c,v 1.38 2007-06-19 23:47:17 tbox Exp $ */
+/* $Id: isdn_20.c,v 1.40 2009-12-04 22:06:37 tbox Exp $ */
/* Reviewed: Wed Mar 15 16:53:11 PST 2000 by bwelling */
@@ -231,4 +231,9 @@ checknames_isdn(ARGS_CHECKNAMES) {
return (ISC_TRUE);
}
+static inline int
+casecompare_isdn(ARGS_COMPARE) {
+ return (compare_isdn(rdata1, rdata2));
+}
+
#endif /* RDATA_GENERIC_ISDN_20_C */
diff --git a/contrib/bind9/lib/dns/rdata/generic/key_25.c b/contrib/bind9/lib/dns/rdata/generic/key_25.c
index acd314c..6fe27cb 100644
--- a/contrib/bind9/lib/dns/rdata/generic/key_25.c
+++ b/contrib/bind9/lib/dns/rdata/generic/key_25.c
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004, 2005, 2007 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004, 2005, 2007, 2009 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 1999-2003 Internet Software Consortium.
*
* Permission to use, copy, modify, and/or distribute this software for any
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: key_25.c,v 1.51 2007-06-19 23:47:17 tbox Exp $ */
+/* $Id: key_25.c,v 1.53 2009-12-04 22:06:37 tbox Exp $ */
/*
* Reviewed: Wed Mar 15 16:47:10 PST 2000 by halley.
@@ -76,6 +76,7 @@ totext_key(ARGS_TOTEXT) {
char buf[sizeof("64000")];
unsigned int flags;
unsigned char algorithm;
+ char namebuf[DNS_NAME_FORMATSIZE];
REQUIRE(rdata->type == 25);
REQUIRE(rdata->length != 0);
@@ -105,6 +106,15 @@ totext_key(ARGS_TOTEXT) {
if ((flags & 0xc000) == 0xc000)
return (ISC_R_SUCCESS);
+ if ((tctx->flags & DNS_STYLEFLAG_COMMENT) != 0 &&
+ algorithm == DNS_KEYALG_PRIVATEDNS) {
+ dns_name_t name;
+ dns_name_init(&name, NULL);
+ dns_name_fromregion(&name, &sr);
+ dns_name_format(&name, namebuf, sizeof(namebuf));
+ } else
+ namebuf[0] = 0;
+
/* key */
if ((tctx->flags & DNS_STYLEFLAG_MULTILINE) != 0)
RETERR(str_totext(" (", target));
@@ -127,12 +137,18 @@ totext_key(ARGS_TOTEXT) {
dns_rdata_toregion(rdata, &tmpr);
sprintf(buf, "%u", dst_region_computeid(&tmpr, algorithm));
RETERR(str_totext(buf, target));
+ if (algorithm == DNS_KEYALG_PRIVATEDNS) {
+ RETERR(str_totext(tctx->linebreak, target));
+ RETERR(str_totext("; alg = ", target));
+ RETERR(str_totext(namebuf, target));
+ }
}
return (ISC_R_SUCCESS);
}
static inline isc_result_t
fromwire_key(ARGS_FROMWIRE) {
+ unsigned char algorithm;
isc_region_t sr;
REQUIRE(type == 25);
@@ -146,6 +162,18 @@ fromwire_key(ARGS_FROMWIRE) {
if (sr.length < 4)
return (ISC_R_UNEXPECTEDEND);
+ algorithm = sr.base[3];
+ RETERR(mem_tobuffer(target, sr.base, 4));
+ isc_region_consume(&sr, 4);
+ isc_buffer_forward(source, 4);
+
+ if (algorithm == DNS_KEYALG_PRIVATEDNS) {
+ dns_name_t name;
+ dns_decompress_setmethods(dctx, DNS_COMPRESS_NONE);
+ dns_name_init(&name, NULL);
+ RETERR(dns_name_fromwire(&name, source, dctx, options, target));
+ }
+ isc_buffer_activeregion(source, &sr);
isc_buffer_forward(source, sr.length);
return (mem_tobuffer(target, sr.base, sr.length));
}
@@ -309,4 +337,9 @@ checknames_key(ARGS_CHECKNAMES) {
return (ISC_TRUE);
}
+static inline int
+casecompare_key(ARGS_COMPARE) {
+ return (compare_key(rdata1, rdata2));
+}
+
#endif /* RDATA_GENERIC_KEY_25_C */
diff --git a/contrib/bind9/lib/dns/rdata/generic/keydata_65533.c b/contrib/bind9/lib/dns/rdata/generic/keydata_65533.c
new file mode 100644
index 0000000..3636209
--- /dev/null
+++ b/contrib/bind9/lib/dns/rdata/generic/keydata_65533.c
@@ -0,0 +1,377 @@
+/*
+ * Copyright (C) 2009 Internet Systems Consortium, Inc. ("ISC")
+ *
+ * Permission to use, copy, modify, and/or 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 ISC DISCLAIMS ALL WARRANTIES WITH
+ * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+ * AND FITNESS. IN NO EVENT SHALL ISC 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.
+ */
+
+/* $Id: keydata_65533.c,v 1.3 2009-12-04 21:09:33 marka Exp $ */
+
+#ifndef GENERIC_KEYDATA_65533_C
+#define GENERIC_KEYDATA_65533_C 1
+
+#include <dst/dst.h>
+
+#define RRTYPE_KEYDATA_ATTRIBUTES (DNS_RDATATYPEATTR_DNSSEC)
+
+static inline isc_result_t
+fromtext_keydata(ARGS_FROMTEXT) {
+ isc_token_t token;
+ dns_secalg_t alg;
+ dns_secproto_t proto;
+ dns_keyflags_t flags;
+ isc_uint32_t refresh, addhd, removehd;
+
+ REQUIRE(type == 65533);
+
+ UNUSED(type);
+ UNUSED(rdclass);
+ UNUSED(origin);
+ UNUSED(options);
+ UNUSED(callbacks);
+
+ /* refresh timer */
+ RETERR(isc_lex_getmastertoken(lexer, &token, isc_tokentype_string,
+ ISC_FALSE));
+ RETTOK(dns_time32_fromtext(DNS_AS_STR(token), &refresh));
+ RETERR(uint32_tobuffer(refresh, target));
+
+ /* add hold-down */
+ RETERR(isc_lex_getmastertoken(lexer, &token, isc_tokentype_string,
+ ISC_FALSE));
+ RETTOK(dns_time32_fromtext(DNS_AS_STR(token), &addhd));
+ RETERR(uint32_tobuffer(addhd, target));
+
+ /* remove hold-down */
+ RETERR(isc_lex_getmastertoken(lexer, &token, isc_tokentype_string,
+ ISC_FALSE));
+ RETTOK(dns_time32_fromtext(DNS_AS_STR(token), &removehd));
+ RETERR(uint32_tobuffer(removehd, target));
+
+ /* flags */
+ RETERR(isc_lex_getmastertoken(lexer, &token, isc_tokentype_string,
+ ISC_FALSE));
+ RETTOK(dns_keyflags_fromtext(&flags, &token.value.as_textregion));
+ RETERR(uint16_tobuffer(flags, target));
+
+ /* protocol */
+ RETERR(isc_lex_getmastertoken(lexer, &token, isc_tokentype_string,
+ ISC_FALSE));
+ RETTOK(dns_secproto_fromtext(&proto, &token.value.as_textregion));
+ RETERR(mem_tobuffer(target, &proto, 1));
+
+ /* algorithm */
+ RETERR(isc_lex_getmastertoken(lexer, &token, isc_tokentype_string,
+ ISC_FALSE));
+ RETTOK(dns_secalg_fromtext(&alg, &token.value.as_textregion));
+ RETERR(mem_tobuffer(target, &alg, 1));
+
+ /* No Key? */
+ if ((flags & 0xc000) == 0xc000)
+ return (ISC_R_SUCCESS);
+
+ return (isc_base64_tobuffer(lexer, target, -1));
+}
+
+static inline isc_result_t
+totext_keydata(ARGS_TOTEXT) {
+ isc_region_t sr;
+ char buf[sizeof("64000")];
+ unsigned int flags;
+ unsigned char algorithm;
+ unsigned long when;
+
+ REQUIRE(rdata->type == 65533);
+ REQUIRE(rdata->length != 0);
+
+ dns_rdata_toregion(rdata, &sr);
+
+ /* refresh timer */
+ when = uint32_fromregion(&sr);
+ isc_region_consume(&sr, 4);
+ RETERR(dns_time32_totext(when, target));
+ RETERR(str_totext(" ", target));
+
+ /* add hold-down */
+ when = uint32_fromregion(&sr);
+ isc_region_consume(&sr, 4);
+ RETERR(dns_time32_totext(when, target));
+ RETERR(str_totext(" ", target));
+
+ /* remove hold-down */
+ when = uint32_fromregion(&sr);
+ isc_region_consume(&sr, 4);
+ RETERR(dns_time32_totext(when, target));
+ RETERR(str_totext(" ", target));
+
+ /* flags */
+ flags = uint16_fromregion(&sr);
+ isc_region_consume(&sr, 2);
+ sprintf(buf, "%u", flags);
+ RETERR(str_totext(buf, target));
+ RETERR(str_totext(" ", target));
+
+ /* protocol */
+ sprintf(buf, "%u", sr.base[0]);
+ isc_region_consume(&sr, 1);
+ RETERR(str_totext(buf, target));
+ RETERR(str_totext(" ", target));
+
+ /* algorithm */
+ algorithm = sr.base[0];
+ sprintf(buf, "%u", algorithm);
+ isc_region_consume(&sr, 1);
+ RETERR(str_totext(buf, target));
+
+ /* No Key? */
+ if ((flags & 0xc000) == 0xc000)
+ return (ISC_R_SUCCESS);
+
+ /* key */
+ if ((tctx->flags & DNS_STYLEFLAG_MULTILINE) != 0)
+ RETERR(str_totext(" (", target));
+ RETERR(str_totext(tctx->linebreak, target));
+ RETERR(isc_base64_totext(&sr, tctx->width - 2,
+ tctx->linebreak, target));
+
+ if ((tctx->flags & DNS_STYLEFLAG_COMMENT) != 0)
+ RETERR(str_totext(tctx->linebreak, target));
+ else if ((tctx->flags & DNS_STYLEFLAG_MULTILINE) != 0)
+ RETERR(str_totext(" ", target));
+
+ if ((tctx->flags & DNS_STYLEFLAG_MULTILINE) != 0)
+ RETERR(str_totext(")", target));
+
+ if ((tctx->flags & DNS_STYLEFLAG_COMMENT) != 0) {
+ isc_region_t tmpr;
+
+ RETERR(str_totext(" ; key id = ", target));
+ dns_rdata_toregion(rdata, &tmpr);
+ /* Skip over refresh, addhd, and removehd */
+ isc_region_consume(&tmpr, 12);
+ sprintf(buf, "%u", dst_region_computeid(&tmpr, algorithm));
+ RETERR(str_totext(buf, target));
+ }
+ return (ISC_R_SUCCESS);
+}
+
+static inline isc_result_t
+fromwire_keydata(ARGS_FROMWIRE) {
+ isc_region_t sr;
+
+ REQUIRE(type == 65533);
+
+ UNUSED(type);
+ UNUSED(rdclass);
+ UNUSED(dctx);
+ UNUSED(options);
+
+ isc_buffer_activeregion(source, &sr);
+ if (sr.length < 4)
+ return (ISC_R_UNEXPECTEDEND);
+
+ isc_buffer_forward(source, sr.length);
+ return (mem_tobuffer(target, sr.base, sr.length));
+}
+
+static inline isc_result_t
+towire_keydata(ARGS_TOWIRE) {
+ isc_region_t sr;
+
+ REQUIRE(rdata->type == 65533);
+ REQUIRE(rdata->length != 0);
+
+ UNUSED(cctx);
+
+ dns_rdata_toregion(rdata, &sr);
+ return (mem_tobuffer(target, sr.base, sr.length));
+}
+
+static inline int
+compare_keydata(ARGS_COMPARE) {
+ isc_region_t r1;
+ isc_region_t r2;
+
+ REQUIRE(rdata1->type == rdata2->type);
+ REQUIRE(rdata1->rdclass == rdata2->rdclass);
+ REQUIRE(rdata1->type == 65533);
+ REQUIRE(rdata1->length != 0);
+ REQUIRE(rdata2->length != 0);
+
+ dns_rdata_toregion(rdata1, &r1);
+ dns_rdata_toregion(rdata2, &r2);
+ return (isc_region_compare(&r1, &r2));
+}
+
+static inline isc_result_t
+fromstruct_keydata(ARGS_FROMSTRUCT) {
+ dns_rdata_keydata_t *keydata = source;
+
+ REQUIRE(type == 65533);
+ REQUIRE(source != NULL);
+ REQUIRE(keydata->common.rdtype == type);
+ REQUIRE(keydata->common.rdclass == rdclass);
+
+ UNUSED(type);
+ UNUSED(rdclass);
+
+ /* Refresh timer */
+ RETERR(uint32_tobuffer(keydata->refresh, target));
+
+ /* Add hold-down */
+ RETERR(uint32_tobuffer(keydata->addhd, target));
+
+ /* Remove hold-down */
+ RETERR(uint32_tobuffer(keydata->removehd, target));
+
+ /* Flags */
+ RETERR(uint16_tobuffer(keydata->flags, target));
+
+ /* Protocol */
+ RETERR(uint8_tobuffer(keydata->protocol, target));
+
+ /* Algorithm */
+ RETERR(uint8_tobuffer(keydata->algorithm, target));
+
+ /* Data */
+ return (mem_tobuffer(target, keydata->data, keydata->datalen));
+}
+
+static inline isc_result_t
+tostruct_keydata(ARGS_TOSTRUCT) {
+ dns_rdata_keydata_t *keydata = target;
+ isc_region_t sr;
+
+ REQUIRE(rdata->type == 65533);
+ REQUIRE(target != NULL);
+ REQUIRE(rdata->length != 0);
+
+ keydata->common.rdclass = rdata->rdclass;
+ keydata->common.rdtype = rdata->type;
+ ISC_LINK_INIT(&keydata->common, link);
+
+ dns_rdata_toregion(rdata, &sr);
+
+ /* Refresh timer */
+ if (sr.length < 4)
+ return (ISC_R_UNEXPECTEDEND);
+ keydata->refresh = uint32_fromregion(&sr);
+ isc_region_consume(&sr, 4);
+
+ /* Add hold-down */
+ if (sr.length < 4)
+ return (ISC_R_UNEXPECTEDEND);
+ keydata->addhd = uint32_fromregion(&sr);
+ isc_region_consume(&sr, 4);
+
+ /* Remove hold-down */
+ if (sr.length < 4)
+ return (ISC_R_UNEXPECTEDEND);
+ keydata->removehd = uint32_fromregion(&sr);
+ isc_region_consume(&sr, 4);
+
+ /* Flags */
+ if (sr.length < 2)
+ return (ISC_R_UNEXPECTEDEND);
+ keydata->flags = uint16_fromregion(&sr);
+ isc_region_consume(&sr, 2);
+
+ /* Protocol */
+ if (sr.length < 1)
+ return (ISC_R_UNEXPECTEDEND);
+ keydata->protocol = uint8_fromregion(&sr);
+ isc_region_consume(&sr, 1);
+
+ /* Algorithm */
+ if (sr.length < 1)
+ return (ISC_R_UNEXPECTEDEND);
+ keydata->algorithm = uint8_fromregion(&sr);
+ isc_region_consume(&sr, 1);
+
+ /* Data */
+ keydata->datalen = sr.length;
+ keydata->data = mem_maybedup(mctx, sr.base, keydata->datalen);
+ if (keydata->data == NULL)
+ return (ISC_R_NOMEMORY);
+
+ keydata->mctx = mctx;
+ return (ISC_R_SUCCESS);
+}
+
+static inline void
+freestruct_keydata(ARGS_FREESTRUCT) {
+ dns_rdata_keydata_t *keydata = (dns_rdata_keydata_t *) source;
+
+ REQUIRE(source != NULL);
+ REQUIRE(keydata->common.rdtype == 65533);
+
+ if (keydata->mctx == NULL)
+ return;
+
+ if (keydata->data != NULL)
+ isc_mem_free(keydata->mctx, keydata->data);
+ keydata->mctx = NULL;
+}
+
+static inline isc_result_t
+additionaldata_keydata(ARGS_ADDLDATA) {
+ REQUIRE(rdata->type == 65533);
+
+ UNUSED(rdata);
+ UNUSED(add);
+ UNUSED(arg);
+
+ return (ISC_R_SUCCESS);
+}
+
+static inline isc_result_t
+digest_keydata(ARGS_DIGEST) {
+ isc_region_t r;
+
+ REQUIRE(rdata->type == 65533);
+
+ dns_rdata_toregion(rdata, &r);
+
+ return ((digest)(arg, &r));
+}
+
+static inline isc_boolean_t
+checkowner_keydata(ARGS_CHECKOWNER) {
+
+ REQUIRE(type == 65533);
+
+ UNUSED(name);
+ UNUSED(type);
+ UNUSED(rdclass);
+ UNUSED(wildcard);
+
+ return (ISC_TRUE);
+}
+
+static inline isc_boolean_t
+checknames_keydata(ARGS_CHECKNAMES) {
+
+ REQUIRE(rdata->type == 65533);
+
+ UNUSED(rdata);
+ UNUSED(owner);
+ UNUSED(bad);
+
+ return (ISC_TRUE);
+}
+
+static inline int
+casecompare_keydata(ARGS_COMPARE) {
+ return (compare_keydata(rdata1, rdata2));
+}
+
+#endif /* GENERIC_KEYDATA_65533_C */
diff --git a/contrib/bind9/lib/dns/rdata/generic/keydata_65533.h b/contrib/bind9/lib/dns/rdata/generic/keydata_65533.h
new file mode 100644
index 0000000..21cb1ba
--- /dev/null
+++ b/contrib/bind9/lib/dns/rdata/generic/keydata_65533.h
@@ -0,0 +1,35 @@
+/*
+ * Copyright (C) 2009 Internet Systems Consortium, Inc. ("ISC")
+ *
+ * Permission to use, copy, modify, and/or 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 ISC DISCLAIMS ALL WARRANTIES WITH
+ * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+ * AND FITNESS. IN NO EVENT SHALL ISC 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.
+ */
+
+#ifndef GENERIC_KEYDATA_65533_H
+#define GENERIC_KEYDATA_65533_H 1
+
+/* $Id: keydata_65533.h,v 1.2 2009-06-30 02:52:32 each Exp $ */
+
+typedef struct dns_rdata_keydata {
+ dns_rdatacommon_t common;
+ isc_mem_t * mctx;
+ isc_uint32_t refresh; /* Timer for refreshing data */
+ isc_uint32_t addhd; /* Hold-down timer for adding */
+ isc_uint32_t removehd; /* Hold-down timer for removing */
+ isc_uint16_t flags; /* Copy of DNSKEY_48 */
+ isc_uint8_t protocol;
+ isc_uint8_t algorithm;
+ isc_uint16_t datalen;
+ unsigned char * data;
+} dns_rdata_keydata_t;
+
+#endif /* GENERIC_KEYDATA_65533_H */
diff --git a/contrib/bind9/lib/dns/rdata/generic/loc_29.c b/contrib/bind9/lib/dns/rdata/generic/loc_29.c
index a5efb01..62d5cd0 100644
--- a/contrib/bind9/lib/dns/rdata/generic/loc_29.c
+++ b/contrib/bind9/lib/dns/rdata/generic/loc_29.c
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: loc_29.c,v 1.45.332.4 2009-02-17 05:54:12 marka Exp $ */
+/* $Id: loc_29.c,v 1.50 2009-12-04 21:09:33 marka Exp $ */
/* Reviewed: Wed Mar 15 18:13:09 PST 2000 by explorer */
@@ -796,4 +796,9 @@ checknames_loc(ARGS_CHECKNAMES) {
return (ISC_TRUE);
}
+static inline int
+casecompare_loc(ARGS_COMPARE) {
+ return (compare_loc(rdata1, rdata2));
+}
+
#endif /* RDATA_GENERIC_LOC_29_C */
diff --git a/contrib/bind9/lib/dns/rdata/generic/mb_7.c b/contrib/bind9/lib/dns/rdata/generic/mb_7.c
index c47365a..7a4af1c 100644
--- a/contrib/bind9/lib/dns/rdata/generic/mb_7.c
+++ b/contrib/bind9/lib/dns/rdata/generic/mb_7.c
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004, 2007 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004, 2007, 2009 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 1998-2001 Internet Software Consortium.
*
* Permission to use, copy, modify, and/or distribute this software for any
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: mb_7.c,v 1.45 2007-06-19 23:47:17 tbox Exp $ */
+/* $Id: mb_7.c,v 1.47 2009-12-04 22:06:37 tbox Exp $ */
/* Reviewed: Wed Mar 15 17:31:26 PST 2000 by bwelling */
@@ -69,7 +69,7 @@ totext_mb(ARGS_TOTEXT) {
static inline isc_result_t
fromwire_mb(ARGS_FROMWIRE) {
- dns_name_t name;
+ dns_name_t name;
REQUIRE(type == 7);
@@ -78,8 +78,8 @@ fromwire_mb(ARGS_FROMWIRE) {
dns_decompress_setmethods(dctx, DNS_COMPRESS_GLOBAL14);
- dns_name_init(&name, NULL);
- return (dns_name_fromwire(&name, source, dctx, options, target));
+ dns_name_init(&name, NULL);
+ return (dns_name_fromwire(&name, source, dctx, options, target));
}
static inline isc_result_t
@@ -231,4 +231,9 @@ checknames_mb(ARGS_CHECKNAMES) {
return (ISC_TRUE);
}
+static inline int
+casecompare_mb(ARGS_COMPARE) {
+ return (compare_mb(rdata1, rdata2));
+}
+
#endif /* RDATA_GENERIC_MB_7_C */
diff --git a/contrib/bind9/lib/dns/rdata/generic/md_3.c b/contrib/bind9/lib/dns/rdata/generic/md_3.c
index 269f9be..ee06274 100644
--- a/contrib/bind9/lib/dns/rdata/generic/md_3.c
+++ b/contrib/bind9/lib/dns/rdata/generic/md_3.c
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004, 2007 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004, 2007, 2009 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 1998-2001 Internet Software Consortium.
*
* Permission to use, copy, modify, and/or distribute this software for any
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: md_3.c,v 1.47 2007-06-19 23:47:17 tbox Exp $ */
+/* $Id: md_3.c,v 1.49 2009-12-04 22:06:37 tbox Exp $ */
/* Reviewed: Wed Mar 15 17:48:20 PST 2000 by bwelling */
@@ -69,7 +69,7 @@ totext_md(ARGS_TOTEXT) {
static inline isc_result_t
fromwire_md(ARGS_FROMWIRE) {
- dns_name_t name;
+ dns_name_t name;
REQUIRE(type == 3);
@@ -78,8 +78,8 @@ fromwire_md(ARGS_FROMWIRE) {
dns_decompress_setmethods(dctx, DNS_COMPRESS_GLOBAL14);
- dns_name_init(&name, NULL);
- return (dns_name_fromwire(&name, source, dctx, options, target));
+ dns_name_init(&name, NULL);
+ return (dns_name_fromwire(&name, source, dctx, options, target));
}
static inline isc_result_t
@@ -233,4 +233,9 @@ checknames_md(ARGS_CHECKNAMES) {
return (ISC_TRUE);
}
+static inline int
+casecompare_md(ARGS_COMPARE) {
+ return (compare_md(rdata1, rdata2));
+}
+
#endif /* RDATA_GENERIC_MD_3_C */
diff --git a/contrib/bind9/lib/dns/rdata/generic/mf_4.c b/contrib/bind9/lib/dns/rdata/generic/mf_4.c
index 9223384..d14bf6c 100644
--- a/contrib/bind9/lib/dns/rdata/generic/mf_4.c
+++ b/contrib/bind9/lib/dns/rdata/generic/mf_4.c
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004, 2007 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004, 2007, 2009 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 1998-2001 Internet Software Consortium.
*
* Permission to use, copy, modify, and/or distribute this software for any
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: mf_4.c,v 1.45 2007-06-19 23:47:17 tbox Exp $ */
+/* $Id: mf_4.c,v 1.47 2009-12-04 22:06:37 tbox Exp $ */
/* reviewed: Wed Mar 15 17:47:33 PST 2000 by brister */
@@ -69,7 +69,7 @@ totext_mf(ARGS_TOTEXT) {
static inline isc_result_t
fromwire_mf(ARGS_FROMWIRE) {
- dns_name_t name;
+ dns_name_t name;
REQUIRE(type == 4);
@@ -78,8 +78,8 @@ fromwire_mf(ARGS_FROMWIRE) {
dns_decompress_setmethods(dctx, DNS_COMPRESS_GLOBAL14);
- dns_name_init(&name, NULL);
- return (dns_name_fromwire(&name, source, dctx, options, target));
+ dns_name_init(&name, NULL);
+ return (dns_name_fromwire(&name, source, dctx, options, target));
}
static inline isc_result_t
@@ -232,4 +232,9 @@ checknames_mf(ARGS_CHECKNAMES) {
return (ISC_TRUE);
}
+static inline int
+casecompare_mf(ARGS_COMPARE) {
+ return (compare_mf(rdata1, rdata2));
+}
+
#endif /* RDATA_GENERIC_MF_4_C */
diff --git a/contrib/bind9/lib/dns/rdata/generic/mg_8.c b/contrib/bind9/lib/dns/rdata/generic/mg_8.c
index ba7630c..c1d553a 100644
--- a/contrib/bind9/lib/dns/rdata/generic/mg_8.c
+++ b/contrib/bind9/lib/dns/rdata/generic/mg_8.c
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004, 2007 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004, 2007, 2009 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 1998-2001 Internet Software Consortium.
*
* Permission to use, copy, modify, and/or distribute this software for any
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: mg_8.c,v 1.43 2007-06-19 23:47:17 tbox Exp $ */
+/* $Id: mg_8.c,v 1.45 2009-12-04 22:06:37 tbox Exp $ */
/* reviewed: Wed Mar 15 17:49:21 PST 2000 by brister */
@@ -69,7 +69,7 @@ totext_mg(ARGS_TOTEXT) {
static inline isc_result_t
fromwire_mg(ARGS_FROMWIRE) {
- dns_name_t name;
+ dns_name_t name;
REQUIRE(type == 8);
@@ -78,8 +78,8 @@ fromwire_mg(ARGS_FROMWIRE) {
dns_decompress_setmethods(dctx, DNS_COMPRESS_GLOBAL14);
- dns_name_init(&name, NULL);
- return (dns_name_fromwire(&name, source, dctx, options, target));
+ dns_name_init(&name, NULL);
+ return (dns_name_fromwire(&name, source, dctx, options, target));
}
static inline isc_result_t
@@ -227,4 +227,9 @@ checknames_mg(ARGS_CHECKNAMES) {
return (ISC_TRUE);
}
+static inline int
+casecompare_mg(ARGS_COMPARE) {
+ return (compare_mg(rdata1, rdata2));
+}
+
#endif /* RDATA_GENERIC_MG_8_C */
diff --git a/contrib/bind9/lib/dns/rdata/generic/minfo_14.c b/contrib/bind9/lib/dns/rdata/generic/minfo_14.c
index 6848a4e..881e624 100644
--- a/contrib/bind9/lib/dns/rdata/generic/minfo_14.c
+++ b/contrib/bind9/lib/dns/rdata/generic/minfo_14.c
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004, 2007 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004, 2007, 2009 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 1998-2001 Internet Software Consortium.
*
* Permission to use, copy, modify, and/or distribute this software for any
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: minfo_14.c,v 1.45 2007-06-19 23:47:17 tbox Exp $ */
+/* $Id: minfo_14.c,v 1.47 2009-12-04 22:06:37 tbox Exp $ */
/* reviewed: Wed Mar 15 17:45:32 PST 2000 by brister */
@@ -93,8 +93,8 @@ totext_minfo(ARGS_TOTEXT) {
static inline isc_result_t
fromwire_minfo(ARGS_FROMWIRE) {
- dns_name_t rmail;
- dns_name_t email;
+ dns_name_t rmail;
+ dns_name_t email;
REQUIRE(type == 14);
@@ -103,11 +103,11 @@ fromwire_minfo(ARGS_FROMWIRE) {
dns_decompress_setmethods(dctx, DNS_COMPRESS_GLOBAL14);
- dns_name_init(&rmail, NULL);
- dns_name_init(&email, NULL);
+ dns_name_init(&rmail, NULL);
+ dns_name_init(&email, NULL);
- RETERR(dns_name_fromwire(&rmail, source, dctx, options, target));
- return (dns_name_fromwire(&email, source, dctx, options, target));
+ RETERR(dns_name_fromwire(&rmail, source, dctx, options, target));
+ return (dns_name_fromwire(&email, source, dctx, options, target));
}
static inline isc_result_t
@@ -321,4 +321,9 @@ checknames_minfo(ARGS_CHECKNAMES) {
return (ISC_TRUE);
}
+static inline int
+casecompare_minfo(ARGS_COMPARE) {
+ return (compare_minfo(rdata1, rdata2));
+}
+
#endif /* RDATA_GENERIC_MINFO_14_C */
diff --git a/contrib/bind9/lib/dns/rdata/generic/mr_9.c b/contrib/bind9/lib/dns/rdata/generic/mr_9.c
index a480bd4..6c02108 100644
--- a/contrib/bind9/lib/dns/rdata/generic/mr_9.c
+++ b/contrib/bind9/lib/dns/rdata/generic/mr_9.c
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004, 2007 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004, 2007, 2009 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 1998-2001 Internet Software Consortium.
*
* Permission to use, copy, modify, and/or distribute this software for any
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: mr_9.c,v 1.42 2007-06-19 23:47:17 tbox Exp $ */
+/* $Id: mr_9.c,v 1.44 2009-12-04 22:06:37 tbox Exp $ */
/* Reviewed: Wed Mar 15 21:30:35 EST 2000 by tale */
@@ -69,7 +69,7 @@ totext_mr(ARGS_TOTEXT) {
static inline isc_result_t
fromwire_mr(ARGS_FROMWIRE) {
- dns_name_t name;
+ dns_name_t name;
REQUIRE(type == 9);
@@ -78,8 +78,8 @@ fromwire_mr(ARGS_FROMWIRE) {
dns_decompress_setmethods(dctx, DNS_COMPRESS_GLOBAL14);
- dns_name_init(&name, NULL);
- return (dns_name_fromwire(&name, source, dctx, options, target));
+ dns_name_init(&name, NULL);
+ return (dns_name_fromwire(&name, source, dctx, options, target));
}
static inline isc_result_t
@@ -228,4 +228,9 @@ checknames_mr(ARGS_CHECKNAMES) {
return (ISC_TRUE);
}
+static inline int
+casecompare_mr(ARGS_COMPARE) {
+ return (compare_mr(rdata1, rdata2));
+}
+
#endif /* RDATA_GENERIC_MR_9_C */
diff --git a/contrib/bind9/lib/dns/rdata/generic/mx_15.c b/contrib/bind9/lib/dns/rdata/generic/mx_15.c
index b7b43f3..0d8e6cd 100644
--- a/contrib/bind9/lib/dns/rdata/generic/mx_15.c
+++ b/contrib/bind9/lib/dns/rdata/generic/mx_15.c
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004, 2005, 2007 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004, 2005, 2007, 2009 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 1998-2001, 2003 Internet Software Consortium.
*
* Permission to use, copy, modify, and/or distribute this software for any
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: mx_15.c,v 1.56 2007-06-19 23:47:17 tbox Exp $ */
+/* $Id: mx_15.c,v 1.58 2009-12-04 22:06:37 tbox Exp $ */
/* reviewed: Wed Mar 15 18:05:46 PST 2000 by brister */
@@ -120,7 +120,7 @@ totext_mx(ARGS_TOTEXT) {
static inline isc_result_t
fromwire_mx(ARGS_FROMWIRE) {
- dns_name_t name;
+ dns_name_t name;
isc_region_t sregion;
REQUIRE(type == 15);
@@ -130,7 +130,7 @@ fromwire_mx(ARGS_FROMWIRE) {
dns_decompress_setmethods(dctx, DNS_COMPRESS_GLOBAL14);
- dns_name_init(&name, NULL);
+ dns_name_init(&name, NULL);
isc_buffer_activeregion(source, &sregion);
if (sregion.length < 2)
@@ -316,4 +316,9 @@ checknames_mx(ARGS_CHECKNAMES) {
return (ISC_TRUE);
}
+static inline int
+casecompare_mx(ARGS_COMPARE) {
+ return (compare_mx(rdata1, rdata2));
+}
+
#endif /* RDATA_GENERIC_MX_15_C */
diff --git a/contrib/bind9/lib/dns/rdata/generic/ns_2.c b/contrib/bind9/lib/dns/rdata/generic/ns_2.c
index 14e0c9d..f3df004 100644
--- a/contrib/bind9/lib/dns/rdata/generic/ns_2.c
+++ b/contrib/bind9/lib/dns/rdata/generic/ns_2.c
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004, 2007 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004, 2007, 2009 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 1998-2001 Internet Software Consortium.
*
* Permission to use, copy, modify, and/or distribute this software for any
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: ns_2.c,v 1.46 2007-06-19 23:47:17 tbox Exp $ */
+/* $Id: ns_2.c,v 1.48 2009-12-04 22:06:37 tbox Exp $ */
/* Reviewed: Wed Mar 15 18:15:00 PST 2000 by bwelling */
@@ -77,7 +77,7 @@ totext_ns(ARGS_TOTEXT) {
static inline isc_result_t
fromwire_ns(ARGS_FROMWIRE) {
- dns_name_t name;
+ dns_name_t name;
REQUIRE(type == 2);
@@ -86,8 +86,8 @@ fromwire_ns(ARGS_FROMWIRE) {
dns_decompress_setmethods(dctx, DNS_COMPRESS_GLOBAL14);
- dns_name_init(&name, NULL);
- return (dns_name_fromwire(&name, source, dctx, options, target));
+ dns_name_init(&name, NULL);
+ return (dns_name_fromwire(&name, source, dctx, options, target));
}
static inline isc_result_t
@@ -248,4 +248,9 @@ checknames_ns(ARGS_CHECKNAMES) {
return (ISC_TRUE);
}
+static inline int
+casecompare_ns(ARGS_COMPARE) {
+ return (compare_ns(rdata1, rdata2));
+}
+
#endif /* RDATA_GENERIC_NS_2_C */
diff --git a/contrib/bind9/lib/dns/rdata/generic/nsec3_50.c b/contrib/bind9/lib/dns/rdata/generic/nsec3_50.c
index 890af1a..d21b009 100644
--- a/contrib/bind9/lib/dns/rdata/generic/nsec3_50.c
+++ b/contrib/bind9/lib/dns/rdata/generic/nsec3_50.c
@@ -14,7 +14,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: nsec3_50.c,v 1.4.48.2 2009-01-18 23:47:41 tbox Exp $ */
+/* $Id: nsec3_50.c,v 1.7 2009-12-04 21:09:34 marka Exp $ */
/*
* Copyright (C) 2004 Nominet, Ltd.
@@ -478,4 +478,9 @@ checknames_nsec3(ARGS_CHECKNAMES) {
return (ISC_TRUE);
}
+static inline int
+casecompare_nsec3(ARGS_COMPARE) {
+ return (compare_nsec3(rdata1, rdata2));
+}
+
#endif /* RDATA_GENERIC_NSEC3_50_C */
diff --git a/contrib/bind9/lib/dns/rdata/generic/nsec3param_51.c b/contrib/bind9/lib/dns/rdata/generic/nsec3param_51.c
index 1457015..01beb3c 100644
--- a/contrib/bind9/lib/dns/rdata/generic/nsec3param_51.c
+++ b/contrib/bind9/lib/dns/rdata/generic/nsec3param_51.c
@@ -14,7 +14,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: nsec3param_51.c,v 1.4.48.2 2009-01-18 23:47:41 tbox Exp $ */
+/* $Id: nsec3param_51.c,v 1.7 2009-12-04 21:09:34 marka Exp $ */
/*
* Copyright (C) 2004 Nominet, Ltd.
@@ -311,4 +311,9 @@ checknames_nsec3param(ARGS_CHECKNAMES) {
return (ISC_TRUE);
}
+static inline int
+casecompare_nsec3param(ARGS_COMPARE) {
+ return (compare_nsec3param(rdata1, rdata2));
+}
+
#endif /* RDATA_GENERIC_NSEC3PARAM_51_C */
diff --git a/contrib/bind9/lib/dns/rdata/generic/nsec_47.c b/contrib/bind9/lib/dns/rdata/generic/nsec_47.c
index ace1035..5807d5f 100644
--- a/contrib/bind9/lib/dns/rdata/generic/nsec_47.c
+++ b/contrib/bind9/lib/dns/rdata/generic/nsec_47.c
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004, 2007, 2008, 2011 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004, 2007-2009, 2011 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 2003 Internet Software Consortium.
*
* Permission to use, copy, modify, and/or distribute this software for any
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: nsec_47.c,v 1.11.82.2 2011-01-13 04:48:23 tbox Exp $ */
+/* $Id: nsec_47.c,v 1.15 2011-01-13 04:59:26 tbox Exp $ */
/* reviewed: Wed Mar 15 18:21:15 PST 2000 by brister */
@@ -361,4 +361,36 @@ checknames_nsec(ARGS_CHECKNAMES) {
return (ISC_TRUE);
}
+static inline int
+casecompare_nsec(ARGS_COMPARE) {
+ isc_region_t region1;
+ isc_region_t region2;
+ dns_name_t name1;
+ dns_name_t name2;
+ int order;
+
+ REQUIRE(rdata1->type == rdata2->type);
+ REQUIRE(rdata1->rdclass == rdata2->rdclass);
+ REQUIRE(rdata1->type == 47);
+ REQUIRE(rdata1->length != 0);
+ REQUIRE(rdata2->length != 0);
+
+ dns_name_init(&name1, NULL);
+ dns_name_init(&name2, NULL);
+
+ dns_rdata_toregion(rdata1, &region1);
+ dns_rdata_toregion(rdata2, &region2);
+
+ dns_name_fromregion(&name1, &region1);
+ dns_name_fromregion(&name2, &region2);
+
+ order = dns_name_rdatacompare(&name1, &name2);
+ if (order != 0)
+ return (order);
+
+ isc_region_consume(&region1, name_length(&name1));
+ isc_region_consume(&region2, name_length(&name2));
+
+ return (isc_region_compare(&region1, &region2));
+}
#endif /* RDATA_GENERIC_NSEC_47_C */
diff --git a/contrib/bind9/lib/dns/rdata/generic/null_10.c b/contrib/bind9/lib/dns/rdata/generic/null_10.c
index 06a8877..e6d9b9a 100644
--- a/contrib/bind9/lib/dns/rdata/generic/null_10.c
+++ b/contrib/bind9/lib/dns/rdata/generic/null_10.c
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004, 2007 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004, 2007, 2009 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 1998-2002 Internet Software Consortium.
*
* Permission to use, copy, modify, and/or distribute this software for any
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: null_10.c,v 1.42 2007-06-19 23:47:17 tbox Exp $ */
+/* $Id: null_10.c,v 1.44 2009-12-04 22:06:37 tbox Exp $ */
/* Reviewed: Thu Mar 16 13:57:50 PST 2000 by explorer */
@@ -189,4 +189,9 @@ checknames_null(ARGS_CHECKNAMES) {
return (ISC_TRUE);
}
+static inline int
+casecompare_null(ARGS_COMPARE) {
+ return (compare_null(rdata1, rdata2));
+}
+
#endif /* RDATA_GENERIC_NULL_10_C */
diff --git a/contrib/bind9/lib/dns/rdata/generic/nxt_30.c b/contrib/bind9/lib/dns/rdata/generic/nxt_30.c
index 362e6fc..44ded55 100644
--- a/contrib/bind9/lib/dns/rdata/generic/nxt_30.c
+++ b/contrib/bind9/lib/dns/rdata/generic/nxt_30.c
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004, 2005, 2007 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004, 2005, 2007, 2009 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 1999-2003 Internet Software Consortium.
*
* Permission to use, copy, modify, and/or distribute this software for any
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: nxt_30.c,v 1.63 2007-06-19 23:47:17 tbox Exp $ */
+/* $Id: nxt_30.c,v 1.65 2009-12-04 22:06:37 tbox Exp $ */
/* reviewed: Wed Mar 15 18:21:15 PST 2000 by brister */
@@ -326,4 +326,8 @@ checknames_nxt(ARGS_CHECKNAMES) {
return (ISC_TRUE);
}
+static inline int
+casecompare_nxt(ARGS_COMPARE) {
+ return (compare_nxt(rdata1, rdata2));
+}
#endif /* RDATA_GENERIC_NXT_30_C */
diff --git a/contrib/bind9/lib/dns/rdata/generic/opt_41.c b/contrib/bind9/lib/dns/rdata/generic/opt_41.c
index 506f4a3..695057d 100644
--- a/contrib/bind9/lib/dns/rdata/generic/opt_41.c
+++ b/contrib/bind9/lib/dns/rdata/generic/opt_41.c
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004, 2005, 2007 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004, 2005, 2007, 2009 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 1998-2002 Internet Software Consortium.
*
* Permission to use, copy, modify, and/or distribute this software for any
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: opt_41.c,v 1.33 2007-06-19 23:47:17 tbox Exp $ */
+/* $Id: opt_41.c,v 1.35 2009-12-04 22:06:37 tbox Exp $ */
/* Reviewed: Thu Mar 16 14:06:44 PST 2000 by gson */
@@ -277,4 +277,9 @@ checknames_opt(ARGS_CHECKNAMES) {
return (ISC_TRUE);
}
+static inline int
+casecompare_opt(ARGS_COMPARE) {
+ return (compare_opt(rdata1, rdata2));
+}
+
#endif /* RDATA_GENERIC_OPT_41_C */
diff --git a/contrib/bind9/lib/dns/rdata/generic/proforma.c b/contrib/bind9/lib/dns/rdata/generic/proforma.c
index c3db196..0efc197 100644
--- a/contrib/bind9/lib/dns/rdata/generic/proforma.c
+++ b/contrib/bind9/lib/dns/rdata/generic/proforma.c
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004, 2007 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004, 2007, 2009 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 1998-2002 Internet Software Consortium.
*
* Permission to use, copy, modify, and/or distribute this software for any
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: proforma.c,v 1.36 2007-06-19 23:47:17 tbox Exp $ */
+/* $Id: proforma.c,v 1.38 2009-12-04 22:06:37 tbox Exp $ */
#ifndef RDATA_GENERIC_#_#_C
#define RDATA_GENERIC_#_#_C
@@ -170,4 +170,21 @@ checknames_#(ARGS_CHECKNAMES) {
return (ISC_TRUE);
}
+static inline int
+casecompare_#(ARGS_COMPARE) {
+ isc_region_t r1;
+ isc_region_t r2;
+
+ REQUIRE(rdata1->type == rdata2->type);
+ REQUIRE(rdata1->rdclass == rdata2->rdclass);
+ REQUIRE(rdata1->type == #);
+ REQUIRE(rdata1->rdclass == #);
+ REQUIRE(rdata1->length != 0); /* XXX */
+ REQUIRE(rdata2->length != 0); /* XXX */
+
+ dns_rdata_toregion(rdata1, &r1);
+ dns_rdata_toregion(rdata2, &r2);
+ return (isc_region_compare(&r1, &r2));
+}
+
#endif /* RDATA_GENERIC_#_#_C */
diff --git a/contrib/bind9/lib/dns/rdata/generic/ptr_12.c b/contrib/bind9/lib/dns/rdata/generic/ptr_12.c
index 8e718cd..0ed648f 100644
--- a/contrib/bind9/lib/dns/rdata/generic/ptr_12.c
+++ b/contrib/bind9/lib/dns/rdata/generic/ptr_12.c
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004, 2007 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004, 2007, 2009 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 1998-2001 Internet Software Consortium.
*
* Permission to use, copy, modify, and/or distribute this software for any
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: ptr_12.c,v 1.43 2007-06-19 23:47:17 tbox Exp $ */
+/* $Id: ptr_12.c,v 1.45 2009-12-04 22:06:37 tbox Exp $ */
/* Reviewed: Thu Mar 16 14:05:12 PST 2000 by explorer */
@@ -79,7 +79,7 @@ totext_ptr(ARGS_TOTEXT) {
static inline isc_result_t
fromwire_ptr(ARGS_FROMWIRE) {
- dns_name_t name;
+ dns_name_t name;
REQUIRE(type == 12);
@@ -88,8 +88,8 @@ fromwire_ptr(ARGS_FROMWIRE) {
dns_decompress_setmethods(dctx, DNS_COMPRESS_GLOBAL14);
- dns_name_init(&name, NULL);
- return (dns_name_fromwire(&name, source, dctx, options, target));
+ dns_name_init(&name, NULL);
+ return (dns_name_fromwire(&name, source, dctx, options, target));
}
static inline isc_result_t
@@ -288,4 +288,8 @@ checknames_ptr(ARGS_CHECKNAMES) {
return (ISC_TRUE);
}
+static inline int
+casecompare_ptr(ARGS_COMPARE) {
+ return (compare_ptr(rdata1, rdata2));
+}
#endif /* RDATA_GENERIC_PTR_12_C */
diff --git a/contrib/bind9/lib/dns/rdata/generic/rp_17.c b/contrib/bind9/lib/dns/rdata/generic/rp_17.c
index 19d7b35..2865e2f 100644
--- a/contrib/bind9/lib/dns/rdata/generic/rp_17.c
+++ b/contrib/bind9/lib/dns/rdata/generic/rp_17.c
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004, 2005, 2007 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004, 2005, 2007, 2009 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 1999-2001 Internet Software Consortium.
*
* Permission to use, copy, modify, and/or distribute this software for any
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: rp_17.c,v 1.42 2007-06-19 23:47:17 tbox Exp $ */
+/* $Id: rp_17.c,v 1.44 2009-12-04 22:06:37 tbox Exp $ */
/* RFC1183 */
@@ -93,8 +93,8 @@ totext_rp(ARGS_TOTEXT) {
static inline isc_result_t
fromwire_rp(ARGS_FROMWIRE) {
- dns_name_t rmail;
- dns_name_t email;
+ dns_name_t rmail;
+ dns_name_t email;
REQUIRE(type == 17);
@@ -103,11 +103,11 @@ fromwire_rp(ARGS_FROMWIRE) {
dns_decompress_setmethods(dctx, DNS_COMPRESS_NONE);
- dns_name_init(&rmail, NULL);
- dns_name_init(&email, NULL);
+ dns_name_init(&rmail, NULL);
+ dns_name_init(&email, NULL);
- RETERR(dns_name_fromwire(&rmail, source, dctx, options, target));
- return (dns_name_fromwire(&email, source, dctx, options, target));
+ RETERR(dns_name_fromwire(&rmail, source, dctx, options, target));
+ return (dns_name_fromwire(&email, source, dctx, options, target));
}
static inline isc_result_t
@@ -311,4 +311,8 @@ checknames_rp(ARGS_CHECKNAMES) {
return (ISC_TRUE);
}
+static inline int
+casecompare_rp(ARGS_COMPARE) {
+ return (compare_rp(rdata1, rdata2));
+}
#endif /* RDATA_GENERIC_RP_17_C */
diff --git a/contrib/bind9/lib/dns/rdata/generic/rrsig_46.c b/contrib/bind9/lib/dns/rdata/generic/rrsig_46.c
index bcbb05b..1fa7d07 100644
--- a/contrib/bind9/lib/dns/rdata/generic/rrsig_46.c
+++ b/contrib/bind9/lib/dns/rdata/generic/rrsig_46.c
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004, 2005, 2007, 2011 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004, 2005, 2007, 2009, 2011 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 2003 Internet Software Consortium.
*
* Permission to use, copy, modify, and/or distribute this software for any
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: rrsig_46.c,v 1.10.332.2 2011-01-13 04:48:23 tbox Exp $ */
+/* $Id: rrsig_46.c,v 1.14 2011-01-13 04:59:26 tbox Exp $ */
/* Reviewed: Fri Mar 17 09:05:02 PST 2000 by gson */
@@ -544,4 +544,47 @@ checknames_rrsig(ARGS_CHECKNAMES) {
return (ISC_TRUE);
}
+static inline int
+casecompare_rrsig(ARGS_COMPARE) {
+ isc_region_t r1;
+ isc_region_t r2;
+ dns_name_t name1;
+ dns_name_t name2;
+ int order;
+
+ REQUIRE(rdata1->type == rdata2->type);
+ REQUIRE(rdata1->rdclass == rdata2->rdclass);
+ REQUIRE(rdata1->type == 46);
+ REQUIRE(rdata1->length != 0);
+ REQUIRE(rdata2->length != 0);
+
+ dns_rdata_toregion(rdata1, &r1);
+ dns_rdata_toregion(rdata2, &r2);
+
+ INSIST(r1.length > 18);
+ INSIST(r2.length > 18);
+ r1.length = 18;
+ r2.length = 18;
+ order = isc_region_compare(&r1, &r2);
+ if (order != 0)
+ return (order);
+
+ dns_name_init(&name1, NULL);
+ dns_name_init(&name2, NULL);
+ dns_rdata_toregion(rdata1, &r1);
+ dns_rdata_toregion(rdata2, &r2);
+ isc_region_consume(&r1, 18);
+ isc_region_consume(&r2, 18);
+ dns_name_fromregion(&name1, &r1);
+ dns_name_fromregion(&name2, &r2);
+ order = dns_name_rdatacompare(&name1, &name2);
+ if (order != 0)
+ return (order);
+
+ isc_region_consume(&r1, name_length(&name1));
+ isc_region_consume(&r2, name_length(&name2));
+
+ return (isc_region_compare(&r1, &r2));
+}
+
#endif /* RDATA_GENERIC_RRSIG_46_C */
diff --git a/contrib/bind9/lib/dns/rdata/generic/rt_21.c b/contrib/bind9/lib/dns/rdata/generic/rt_21.c
index 48323c7..efd51e2 100644
--- a/contrib/bind9/lib/dns/rdata/generic/rt_21.c
+++ b/contrib/bind9/lib/dns/rdata/generic/rt_21.c
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004, 2005, 2007 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004, 2005, 2007, 2009 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 1999-2001, 2003 Internet Software Consortium.
*
* Permission to use, copy, modify, and/or distribute this software for any
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: rt_21.c,v 1.46 2007-06-19 23:47:17 tbox Exp $ */
+/* $Id: rt_21.c,v 1.48 2009-12-04 22:06:37 tbox Exp $ */
/* reviewed: Thu Mar 16 15:02:31 PST 2000 by brister */
@@ -90,7 +90,7 @@ totext_rt(ARGS_TOTEXT) {
static inline isc_result_t
fromwire_rt(ARGS_FROMWIRE) {
- dns_name_t name;
+ dns_name_t name;
isc_region_t sregion;
isc_region_t tregion;
@@ -101,7 +101,7 @@ fromwire_rt(ARGS_FROMWIRE) {
dns_decompress_setmethods(dctx, DNS_COMPRESS_NONE);
- dns_name_init(&name, NULL);
+ dns_name_init(&name, NULL);
isc_buffer_activeregion(source, &sregion);
isc_buffer_availableregion(target, &tregion);
@@ -308,4 +308,9 @@ checknames_rt(ARGS_CHECKNAMES) {
return (ISC_TRUE);
}
+static inline int
+casecompare_rt(ARGS_COMPARE) {
+ return (compare_rt(rdata1, rdata2));
+}
+
#endif /* RDATA_GENERIC_RT_21_C */
diff --git a/contrib/bind9/lib/dns/rdata/generic/sig_24.c b/contrib/bind9/lib/dns/rdata/generic/sig_24.c
index 3010b8e..6366309 100644
--- a/contrib/bind9/lib/dns/rdata/generic/sig_24.c
+++ b/contrib/bind9/lib/dns/rdata/generic/sig_24.c
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004, 2005, 2007 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004, 2005, 2007, 2009 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 1999-2003 Internet Software Consortium.
*
* Permission to use, copy, modify, and/or distribute this software for any
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: sig_24.c,v 1.66 2007-06-19 23:47:17 tbox Exp $ */
+/* $Id: sig_24.c,v 1.68 2009-12-04 22:06:37 tbox Exp $ */
/* Reviewed: Fri Mar 17 09:05:02 PST 2000 by gson */
@@ -575,4 +575,8 @@ checknames_sig(ARGS_CHECKNAMES) {
return (ISC_TRUE);
}
+static inline int
+casecompare_sig(ARGS_COMPARE) {
+ return (compare_sig(rdata1, rdata2));
+}
#endif /* RDATA_GENERIC_SIG_24_C */
diff --git a/contrib/bind9/lib/dns/rdata/generic/soa_6.c b/contrib/bind9/lib/dns/rdata/generic/soa_6.c
index d3fdf41..34361a8 100644
--- a/contrib/bind9/lib/dns/rdata/generic/soa_6.c
+++ b/contrib/bind9/lib/dns/rdata/generic/soa_6.c
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: soa_6.c,v 1.61.332.2 2009-02-16 23:47:15 tbox Exp $ */
+/* $Id: soa_6.c,v 1.64 2009-12-04 21:09:34 marka Exp $ */
/* Reviewed: Thu Mar 16 15:18:32 PST 2000 by explorer */
@@ -441,4 +441,9 @@ checknames_soa(ARGS_CHECKNAMES) {
return (ISC_TRUE);
}
+static inline int
+casecompare_soa(ARGS_COMPARE) {
+ return (compare_soa(rdata1, rdata2));
+}
+
#endif /* RDATA_GENERIC_SOA_6_C */
diff --git a/contrib/bind9/lib/dns/rdata/generic/spf_99.c b/contrib/bind9/lib/dns/rdata/generic/spf_99.c
index b1ad062..0f8ba5f 100644
--- a/contrib/bind9/lib/dns/rdata/generic/spf_99.c
+++ b/contrib/bind9/lib/dns/rdata/generic/spf_99.c
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004, 2005, 2007 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004, 2005, 2007, 2009 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 1998-2002 Internet Software Consortium.
*
* Permission to use, copy, modify, and/or distribute this software for any
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: spf_99.c,v 1.4 2007-06-19 23:47:17 tbox Exp $ */
+/* $Id: spf_99.c,v 1.6 2009-12-04 22:06:37 tbox Exp $ */
/* Reviewed: Thu Mar 16 15:40:00 PST 2000 by bwelling */
@@ -235,4 +235,8 @@ checknames_spf(ARGS_CHECKNAMES) {
return (ISC_TRUE);
}
+static inline int
+casecompare_spf(ARGS_COMPARE) {
+ return (compare_spf(rdata1, rdata2));
+}
#endif /* RDATA_GENERIC_SPF_99_C */
diff --git a/contrib/bind9/lib/dns/rdata/generic/sshfp_44.c b/contrib/bind9/lib/dns/rdata/generic/sshfp_44.c
index 892c1ec..7b34451 100644
--- a/contrib/bind9/lib/dns/rdata/generic/sshfp_44.c
+++ b/contrib/bind9/lib/dns/rdata/generic/sshfp_44.c
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004, 2006, 2007 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004, 2006, 2007, 2009 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 2003 Internet Software Consortium.
*
* Permission to use, copy, modify, and/or distribute this software for any
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: sshfp_44.c,v 1.7 2007-06-19 23:47:17 tbox Exp $ */
+/* $Id: sshfp_44.c,v 1.9 2009-12-04 22:06:37 tbox Exp $ */
/* RFC 4255 */
@@ -259,4 +259,9 @@ checknames_sshfp(ARGS_CHECKNAMES) {
return (ISC_TRUE);
}
+static inline int
+casecompare_sshfp(ARGS_COMPARE) {
+ return (compare_sshfp(rdata1, rdata2));
+}
+
#endif /* RDATA_GENERIC_SSHFP_44_C */
diff --git a/contrib/bind9/lib/dns/rdata/generic/tkey_249.c b/contrib/bind9/lib/dns/rdata/generic/tkey_249.c
index 6927c8d..64acc0f 100644
--- a/contrib/bind9/lib/dns/rdata/generic/tkey_249.c
+++ b/contrib/bind9/lib/dns/rdata/generic/tkey_249.c
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004, 2007 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004, 2007, 2009 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 1999-2003 Internet Software Consortium.
*
* Permission to use, copy, modify, and/or distribute this software for any
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: tkey_249.c,v 1.57 2007-06-19 23:47:17 tbox Exp $ */
+/* $Id: tkey_249.c,v 1.59 2009-12-04 22:06:37 tbox Exp $ */
/*
* Reviewed: Thu Mar 16 17:35:30 PST 2000 by halley.
@@ -552,4 +552,8 @@ checknames_tkey(ARGS_CHECKNAMES) {
return (ISC_TRUE);
}
+static inline isc_result_t
+casecompare_tkey(ARGS_COMPARE) {
+ return (compare_tkey(rdata1, rdata2));
+}
#endif /* RDATA_GENERIC_TKEY_249_C */
diff --git a/contrib/bind9/lib/dns/rdata/generic/txt_16.c b/contrib/bind9/lib/dns/rdata/generic/txt_16.c
index fa14b86..e04e0f0 100644
--- a/contrib/bind9/lib/dns/rdata/generic/txt_16.c
+++ b/contrib/bind9/lib/dns/rdata/generic/txt_16.c
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004, 2007, 2008 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004, 2007-2009 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 1998-2002 Internet Software Consortium.
*
* Permission to use, copy, modify, and/or distribute this software for any
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: txt_16.c,v 1.45 2008-02-15 23:46:51 tbox Exp $ */
+/* $Id: txt_16.c,v 1.47 2009-12-04 22:06:37 tbox Exp $ */
/* Reviewed: Thu Mar 16 15:40:00 PST 2000 by bwelling */
@@ -235,4 +235,9 @@ checknames_txt(ARGS_CHECKNAMES) {
return (ISC_TRUE);
}
+static inline isc_result_t
+casecompare_txt(ARGS_COMPARE) {
+ return (compare_txt(rdata1, rdata2));
+}
+
#endif /* RDATA_GENERIC_TXT_16_C */
diff --git a/contrib/bind9/lib/dns/rdata/generic/unspec_103.c b/contrib/bind9/lib/dns/rdata/generic/unspec_103.c
index ffd14d9..0ce9a90 100644
--- a/contrib/bind9/lib/dns/rdata/generic/unspec_103.c
+++ b/contrib/bind9/lib/dns/rdata/generic/unspec_103.c
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004, 2007 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004, 2007, 2009 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 1999-2002 Internet Software Consortium.
*
* Permission to use, copy, modify, and/or distribute this software for any
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: unspec_103.c,v 1.35 2007-06-19 23:47:17 tbox Exp $ */
+/* $Id: unspec_103.c,v 1.37 2009-12-04 22:06:37 tbox Exp $ */
#ifndef RDATA_GENERIC_UNSPEC_103_C
#define RDATA_GENERIC_UNSPEC_103_C
@@ -186,4 +186,9 @@ checknames_unspec(ARGS_CHECKNAMES) {
return (ISC_TRUE);
}
+static inline int
+casecompare_unspec(ARGS_COMPARE) {
+ return (compare_unspec(rdata1, rdata2));
+}
+
#endif /* RDATA_GENERIC_UNSPEC_103_C */
diff --git a/contrib/bind9/lib/dns/rdata/generic/x25_19.c b/contrib/bind9/lib/dns/rdata/generic/x25_19.c
index 47aeb7f..f315b89 100644
--- a/contrib/bind9/lib/dns/rdata/generic/x25_19.c
+++ b/contrib/bind9/lib/dns/rdata/generic/x25_19.c
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004, 2005, 2007 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004, 2005, 2007, 2009 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 1999-2002 Internet Software Consortium.
*
* Permission to use, copy, modify, and/or distribute this software for any
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: x25_19.c,v 1.39 2007-06-19 23:47:17 tbox Exp $ */
+/* $Id: x25_19.c,v 1.41 2009-12-04 22:06:37 tbox Exp $ */
/* Reviewed: Thu Mar 16 16:15:57 PST 2000 by bwelling */
@@ -216,4 +216,9 @@ checknames_x25(ARGS_CHECKNAMES) {
return (ISC_TRUE);
}
+static inline int
+casecompare_x25(ARGS_COMPARE) {
+ return (compare_x25(rdata1, rdata2));
+}
+
#endif /* RDATA_GENERIC_X25_19_C */
diff --git a/contrib/bind9/lib/dns/rdata/hs_4/a_1.c b/contrib/bind9/lib/dns/rdata/hs_4/a_1.c
index ae30719..6d02b79 100644
--- a/contrib/bind9/lib/dns/rdata/hs_4/a_1.c
+++ b/contrib/bind9/lib/dns/rdata/hs_4/a_1.c
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004, 2007 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004, 2007, 2009 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 1999-2002 Internet Software Consortium.
*
* Permission to use, copy, modify, and/or distribute this software for any
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: a_1.c,v 1.31 2007-06-19 23:47:17 tbox Exp $ */
+/* $Id: a_1.c,v 1.33 2009-12-04 22:06:37 tbox Exp $ */
/* reviewed: Thu Mar 16 15:58:36 PST 2000 by brister */
@@ -229,4 +229,9 @@ checknames_hs_a(ARGS_CHECKNAMES) {
return (ISC_TRUE);
}
+static inline int
+casecompare_hs_a(ARGS_COMPARE) {
+ return (compare_hs_a(rdata1, rdata2));
+}
+
#endif /* RDATA_HS_4_A_1_C */
diff --git a/contrib/bind9/lib/dns/rdata/in_1/a6_38.c b/contrib/bind9/lib/dns/rdata/in_1/a6_38.c
index 450b74c..ec453b1 100644
--- a/contrib/bind9/lib/dns/rdata/in_1/a6_38.c
+++ b/contrib/bind9/lib/dns/rdata/in_1/a6_38.c
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004, 2007 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004, 2007, 2009 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 1999-2003 Internet Software Consortium.
*
* Permission to use, copy, modify, and/or distribute this software for any
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: a6_38.c,v 1.54 2007-06-19 23:47:17 tbox Exp $ */
+/* $Id: a6_38.c,v 1.56 2009-12-04 22:06:37 tbox Exp $ */
/* RFC2874 */
@@ -458,4 +458,9 @@ checknames_in_a6(ARGS_CHECKNAMES) {
return (ISC_TRUE);
}
+static inline int
+casecompare_in_a6(ARGS_COMPARE) {
+ return (compare_in_a6(rdata1, rdata2));
+}
+
#endif /* RDATA_IN_1_A6_38_C */
diff --git a/contrib/bind9/lib/dns/rdata/in_1/a_1.c b/contrib/bind9/lib/dns/rdata/in_1/a_1.c
index 1181e44..b4c1e94 100644
--- a/contrib/bind9/lib/dns/rdata/in_1/a_1.c
+++ b/contrib/bind9/lib/dns/rdata/in_1/a_1.c
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004, 2007 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004, 2007, 2009 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 1998-2002 Internet Software Consortium.
*
* Permission to use, copy, modify, and/or distribute this software for any
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: a_1.c,v 1.53 2007-06-19 23:47:17 tbox Exp $ */
+/* $Id: a_1.c,v 1.55 2009-12-04 22:06:37 tbox Exp $ */
/* Reviewed: Thu Mar 16 16:52:50 PST 2000 by bwelling */
@@ -233,4 +233,9 @@ checknames_in_a(ARGS_CHECKNAMES) {
return (ISC_TRUE);
}
+static inline int
+casecompare_in_a(ARGS_COMPARE) {
+ return (compare_in_a(rdata1, rdata2));
+}
+
#endif /* RDATA_IN_1_A_1_C */
diff --git a/contrib/bind9/lib/dns/rdata/in_1/aaaa_28.c b/contrib/bind9/lib/dns/rdata/in_1/aaaa_28.c
index 119131c..fe3954e 100644
--- a/contrib/bind9/lib/dns/rdata/in_1/aaaa_28.c
+++ b/contrib/bind9/lib/dns/rdata/in_1/aaaa_28.c
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004, 2005, 2007 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004, 2005, 2007, 2009 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 1999-2002 Internet Software Consortium.
*
* Permission to use, copy, modify, and/or distribute this software for any
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: aaaa_28.c,v 1.45 2007-06-19 23:47:17 tbox Exp $ */
+/* $Id: aaaa_28.c,v 1.47 2009-12-04 22:06:37 tbox Exp $ */
/* Reviewed: Thu Mar 16 16:52:50 PST 2000 by bwelling */
@@ -230,4 +230,8 @@ checknames_in_aaaa(ARGS_CHECKNAMES) {
return (ISC_TRUE);
}
+static inline int
+casecompare_in_aaaa(ARGS_COMPARE) {
+ return (compare_in_aaaa(rdata1, rdata2));
+}
#endif /* RDATA_IN_1_AAAA_28_C */
diff --git a/contrib/bind9/lib/dns/rdata/in_1/apl_42.c b/contrib/bind9/lib/dns/rdata/in_1/apl_42.c
index 70f6880..3f37880 100644
--- a/contrib/bind9/lib/dns/rdata/in_1/apl_42.c
+++ b/contrib/bind9/lib/dns/rdata/in_1/apl_42.c
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004, 2005, 2007, 2008 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004, 2005, 2007-2009 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 2002 Internet Software Consortium.
*
* Permission to use, copy, modify, and/or distribute this software for any
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: apl_42.c,v 1.14 2008-01-22 23:28:04 tbox Exp $ */
+/* $Id: apl_42.c,v 1.16 2009-12-04 22:06:37 tbox Exp $ */
/* RFC3123 */
@@ -450,4 +450,9 @@ checknames_in_apl(ARGS_CHECKNAMES) {
return (ISC_TRUE);
}
+static inline int
+casecompare_in_apl(ARGS_COMPARE) {
+ return (compare_in_apl(rdata1, rdata2));
+}
+
#endif /* RDATA_IN_1_APL_42_C */
diff --git a/contrib/bind9/lib/dns/rdata/in_1/dhcid_49.c b/contrib/bind9/lib/dns/rdata/in_1/dhcid_49.c
index 5759a76d..9eca46f 100644
--- a/contrib/bind9/lib/dns/rdata/in_1/dhcid_49.c
+++ b/contrib/bind9/lib/dns/rdata/in_1/dhcid_49.c
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2006, 2007 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2006, 2007, 2009 Internet Systems Consortium, Inc. ("ISC")
*
* Permission to use, copy, modify, and/or distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
@@ -14,7 +14,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: dhcid_49.c,v 1.5 2007-06-19 23:47:17 tbox Exp $ */
+/* $Id: dhcid_49.c,v 1.7 2009-12-04 22:06:37 tbox Exp $ */
/* RFC 4701 */
@@ -51,7 +51,7 @@ totext_in_dhcid(ARGS_TOTEXT) {
dns_rdata_toregion(rdata, &sr);
if ((tctx->flags & DNS_STYLEFLAG_MULTILINE) != 0)
- RETERR(str_totext("( " /*)*/, target));
+ RETERR(str_totext("( " /*)*/, target));
RETERR(isc_base64_totext(&sr, tctx->width - 2, tctx->linebreak,
target));
if ((tctx->flags & DNS_STYLEFLAG_MULTILINE) != 0) {
@@ -226,4 +226,9 @@ checknames_in_dhcid(ARGS_CHECKNAMES) {
return (ISC_TRUE);
}
+static inline int
+casecompare_in_dhcid(ARGS_COMPARE) {
+ return (compare_in_dhcid(rdata1, rdata2));
+}
+
#endif /* RDATA_IN_1_DHCID_49_C */
diff --git a/contrib/bind9/lib/dns/rdata/in_1/kx_36.c b/contrib/bind9/lib/dns/rdata/in_1/kx_36.c
index 795844d..dfc103b 100644
--- a/contrib/bind9/lib/dns/rdata/in_1/kx_36.c
+++ b/contrib/bind9/lib/dns/rdata/in_1/kx_36.c
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004, 2005, 2007 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004, 2005, 2007, 2009 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 1999-2001, 2003 Internet Software Consortium.
*
* Permission to use, copy, modify, and/or distribute this software for any
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: kx_36.c,v 1.45 2007-06-19 23:47:17 tbox Exp $ */
+/* $Id: kx_36.c,v 1.47 2009-12-04 22:06:37 tbox Exp $ */
/* Reviewed: Thu Mar 16 17:24:54 PST 2000 by explorer */
@@ -85,7 +85,7 @@ totext_in_kx(ARGS_TOTEXT) {
static inline isc_result_t
fromwire_in_kx(ARGS_FROMWIRE) {
- dns_name_t name;
+ dns_name_t name;
isc_region_t sregion;
REQUIRE(type == 36);
@@ -96,7 +96,7 @@ fromwire_in_kx(ARGS_FROMWIRE) {
dns_decompress_setmethods(dctx, DNS_COMPRESS_NONE);
- dns_name_init(&name, NULL);
+ dns_name_init(&name, NULL);
isc_buffer_activeregion(source, &sregion);
if (sregion.length < 2)
@@ -285,4 +285,9 @@ checknames_in_kx(ARGS_CHECKNAMES) {
return (ISC_TRUE);
}
+static inline int
+casecompare_in_kx(ARGS_COMPARE) {
+ return (compare_in_kx(rdata1, rdata2));
+}
+
#endif /* RDATA_IN_1_KX_36_C */
diff --git a/contrib/bind9/lib/dns/rdata/in_1/naptr_35.c b/contrib/bind9/lib/dns/rdata/in_1/naptr_35.c
index 51aadf7..3d09757 100644
--- a/contrib/bind9/lib/dns/rdata/in_1/naptr_35.c
+++ b/contrib/bind9/lib/dns/rdata/in_1/naptr_35.c
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004, 2005, 2007, 2008 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004, 2005, 2007-2009 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 1999-2001, 2003 Internet Software Consortium.
*
* Permission to use, copy, modify, and/or distribute this software for any
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: naptr_35.c,v 1.53 2008-02-15 23:46:51 tbox Exp $ */
+/* $Id: naptr_35.c,v 1.56 2009-12-04 21:09:34 marka Exp $ */
/* Reviewed: Thu Mar 16 16:52:50 PST 2000 by bwelling */
@@ -25,12 +25,134 @@
#define RDATA_IN_1_NAPTR_35_C
#define RRTYPE_NAPTR_ATTRIBUTES (0)
+#ifdef HAVE_REGEX_H
+#include <regex.h>
+#endif
+
+/*
+ * Check the wire format of the Regexp field.
+ * Don't allow embeded NUL's.
+ */
+static inline isc_result_t
+txt_valid_regex(const unsigned char *txt) {
+#ifdef HAVE_REGEX_H
+ regex_t preg;
+ unsigned int regflags = REG_EXTENDED;
+ unsigned int nsub = 0;
+ char regex[256];
+ char *cp;
+#endif
+ isc_boolean_t flags = ISC_FALSE;
+ isc_boolean_t replace = ISC_FALSE;
+ unsigned char c;
+ unsigned char delim;
+ unsigned int len;
+
+ len = *txt++;
+ if (len == 0U)
+ return (ISC_R_SUCCESS);
+
+ delim = *txt++;
+ len--;
+
+ /*
+ * Digits, backslash and flags can't be delimiters.
+ */
+ switch (delim) {
+ case '0': case '1': case '2': case '3': case '4':
+ case '5': case '6': case '7': case '8': case '9':
+ case '\\': case 'i': case 0:
+ return (DNS_R_SYNTAX);
+ }
+
+#ifdef HAVE_REGEX_H
+ memset(&preg, 0, sizeof(preg));
+ cp = regex;
+#endif
+
+ while (len-- > 0) {
+ c = *txt++;
+ if (c == 0)
+ return (DNS_R_SYNTAX);
+ if (c == delim && !replace) {
+ replace = ISC_TRUE;
+ continue;
+ } else if (c == delim && !flags) {
+ flags = ISC_TRUE;
+ continue;
+ } else if (c == delim)
+ return (DNS_R_SYNTAX);
+ /*
+ * Flags are not escaped.
+ */
+ if (flags) {
+ switch (c) {
+ case 'i':
+#ifdef HAVE_REGEX_H
+ regflags |= REG_ICASE;
+#endif
+ continue;
+ default:
+ return (DNS_R_SYNTAX);
+ }
+ }
+#ifdef HAVE_REGEX_H
+ if (!replace)
+ *cp++ = c;
+#endif
+ if (c == '\\') {
+ if (len == 0)
+ return (DNS_R_SYNTAX);
+ c = *txt++;
+ if (c == 0)
+ return (DNS_R_SYNTAX);
+ len--;
+ if (replace)
+ switch (c) {
+ case '0': return (DNS_R_SYNTAX);
+#ifdef HAVE_REGEX_H
+ case '1': if (nsub < 1) nsub = 1; break;
+ case '2': if (nsub < 2) nsub = 2; break;
+ case '3': if (nsub < 3) nsub = 3; break;
+ case '4': if (nsub < 4) nsub = 4; break;
+ case '5': if (nsub < 5) nsub = 5; break;
+ case '6': if (nsub < 6) nsub = 6; break;
+ case '7': if (nsub < 7) nsub = 7; break;
+ case '8': if (nsub < 8) nsub = 8; break;
+ case '9': if (nsub < 9) nsub = 9; break;
+#endif
+ }
+#ifdef HAVE_REGEX_H
+ if (!replace)
+ *cp++ = c;
+#endif
+ }
+ }
+ if (!flags)
+ return (DNS_R_SYNTAX);
+#ifdef HAVE_REGEX_H
+ *cp = '\0';
+ if (regcomp(&preg, regex, regflags))
+ return (DNS_R_SYNTAX);
+ /*
+ * Check that substitutions in the replacement string are consistant
+ * with the regular expression.
+ */
+ if (preg.re_nsub < nsub) {
+ regfree(&preg);
+ return (DNS_R_SYNTAX);
+ }
+ regfree(&preg);
+#endif
+ return (ISC_R_SUCCESS);
+}
static inline isc_result_t
fromtext_in_naptr(ARGS_FROMTEXT) {
isc_token_t token;
dns_name_t name;
isc_buffer_t buffer;
+ unsigned char *regex;
REQUIRE(type == 35);
REQUIRE(rdclass == 1);
@@ -74,9 +196,11 @@ fromtext_in_naptr(ARGS_FROMTEXT) {
/*
* Regexp.
*/
+ regex = isc_buffer_used(target);
RETERR(isc_lex_getmastertoken(lexer, &token, isc_tokentype_qstring,
ISC_FALSE));
RETTOK(txt_fromtext(&token.value.as_textregion, target));
+ RETTOK(txt_valid_regex(regex));
/*
* Replacement.
@@ -156,6 +280,7 @@ static inline isc_result_t
fromwire_in_naptr(ARGS_FROMWIRE) {
dns_name_t name;
isc_region_t sr;
+ unsigned char *regex;
REQUIRE(type == 35);
REQUIRE(rdclass == 1);
@@ -189,7 +314,9 @@ fromwire_in_naptr(ARGS_FROMWIRE) {
/*
* Regexp.
*/
+ regex = isc_buffer_used(target);
RETERR(txt_fromwire(source, target));
+ RETERR(txt_valid_regex(regex));
/*
* Replacement.
@@ -575,4 +702,9 @@ checknames_in_naptr(ARGS_CHECKNAMES) {
return (ISC_TRUE);
}
+static inline int
+casecompare_in_naptr(ARGS_COMPARE) {
+ return (compare_in_naptr(rdata1, rdata2));
+}
+
#endif /* RDATA_IN_1_NAPTR_35_C */
diff --git a/contrib/bind9/lib/dns/rdata/in_1/nsap-ptr_23.c b/contrib/bind9/lib/dns/rdata/in_1/nsap-ptr_23.c
index 615d24a..2554b07 100644
--- a/contrib/bind9/lib/dns/rdata/in_1/nsap-ptr_23.c
+++ b/contrib/bind9/lib/dns/rdata/in_1/nsap-ptr_23.c
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004, 2005, 2007 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004, 2005, 2007, 2009 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 1999-2001 Internet Software Consortium.
*
* Permission to use, copy, modify, and/or distribute this software for any
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: nsap-ptr_23.c,v 1.38 2007-06-19 23:47:17 tbox Exp $ */
+/* $Id: nsap-ptr_23.c,v 1.40 2009-12-04 22:06:37 tbox Exp $ */
/* Reviewed: Fri Mar 17 10:16:02 PST 2000 by gson */
@@ -73,7 +73,7 @@ totext_in_nsap_ptr(ARGS_TOTEXT) {
static inline isc_result_t
fromwire_in_nsap_ptr(ARGS_FROMWIRE) {
- dns_name_t name;
+ dns_name_t name;
REQUIRE(type == 23);
REQUIRE(rdclass == 1);
@@ -83,8 +83,8 @@ fromwire_in_nsap_ptr(ARGS_FROMWIRE) {
dns_decompress_setmethods(dctx, DNS_COMPRESS_NONE);
- dns_name_init(&name, NULL);
- return (dns_name_fromwire(&name, source, dctx, options, target));
+ dns_name_init(&name, NULL);
+ return (dns_name_fromwire(&name, source, dctx, options, target));
}
static inline isc_result_t
@@ -242,4 +242,9 @@ checknames_in_nsap_ptr(ARGS_CHECKNAMES) {
return (ISC_TRUE);
}
+static inline int
+casecompare_in_nsap_ptr(ARGS_COMPARE) {
+ return (compare_in_nsap_ptr(rdata1, rdata2));
+}
+
#endif /* RDATA_IN_1_NSAP_PTR_23_C */
diff --git a/contrib/bind9/lib/dns/rdata/in_1/nsap_22.c b/contrib/bind9/lib/dns/rdata/in_1/nsap_22.c
index 1aaf13f..4a56c75 100644
--- a/contrib/bind9/lib/dns/rdata/in_1/nsap_22.c
+++ b/contrib/bind9/lib/dns/rdata/in_1/nsap_22.c
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004, 2005, 2007 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004, 2005, 2007, 2009 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 1999-2002 Internet Software Consortium.
*
* Permission to use, copy, modify, and/or distribute this software for any
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: nsap_22.c,v 1.42 2007-06-19 23:47:17 tbox Exp $ */
+/* $Id: nsap_22.c,v 1.44 2009-12-04 22:06:37 tbox Exp $ */
/* Reviewed: Fri Mar 17 10:41:07 PST 2000 by gson */
@@ -252,4 +252,9 @@ checknames_in_nsap(ARGS_CHECKNAMES) {
return (ISC_TRUE);
}
+static inline int
+casecompare_in_nsap(ARGS_COMPARE) {
+ return (compare_in_nsap(rdata1, rdata2));
+}
+
#endif /* RDATA_IN_1_NSAP_22_C */
diff --git a/contrib/bind9/lib/dns/rdata/in_1/px_26.c b/contrib/bind9/lib/dns/rdata/in_1/px_26.c
index 517b87c..50f68cd 100644
--- a/contrib/bind9/lib/dns/rdata/in_1/px_26.c
+++ b/contrib/bind9/lib/dns/rdata/in_1/px_26.c
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004, 2005, 2007 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004, 2005, 2007, 2009 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 1999-2001, 2003 Internet Software Consortium.
*
* Permission to use, copy, modify, and/or distribute this software for any
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: px_26.c,v 1.43 2007-06-19 23:47:17 tbox Exp $ */
+/* $Id: px_26.c,v 1.45 2009-12-04 22:06:37 tbox Exp $ */
/* Reviewed: Mon Mar 20 10:44:27 PST 2000 */
@@ -115,7 +115,7 @@ totext_in_px(ARGS_TOTEXT) {
static inline isc_result_t
fromwire_in_px(ARGS_FROMWIRE) {
- dns_name_t name;
+ dns_name_t name;
isc_region_t sregion;
REQUIRE(type == 26);
@@ -126,7 +126,7 @@ fromwire_in_px(ARGS_FROMWIRE) {
dns_decompress_setmethods(dctx, DNS_COMPRESS_NONE);
- dns_name_init(&name, NULL);
+ dns_name_init(&name, NULL);
/*
* Preference.
@@ -371,4 +371,9 @@ checknames_in_px(ARGS_CHECKNAMES) {
return (ISC_TRUE);
}
+static inline int
+casecompare_in_px(ARGS_COMPARE) {
+ return (compare_in_px(rdata1, rdata2));
+}
+
#endif /* RDATA_IN_1_PX_26_C */
diff --git a/contrib/bind9/lib/dns/rdata/in_1/srv_33.c b/contrib/bind9/lib/dns/rdata/in_1/srv_33.c
index ac9e577..3dfd13e 100644
--- a/contrib/bind9/lib/dns/rdata/in_1/srv_33.c
+++ b/contrib/bind9/lib/dns/rdata/in_1/srv_33.c
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004, 2005, 2007 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004, 2005, 2007, 2009 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 1999-2001, 2003 Internet Software Consortium.
*
* Permission to use, copy, modify, and/or distribute this software for any
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: srv_33.c,v 1.45 2007-06-19 23:47:17 tbox Exp $ */
+/* $Id: srv_33.c,v 1.47 2009-12-04 22:06:37 tbox Exp $ */
/* Reviewed: Fri Mar 17 13:01:00 PST 2000 by bwelling */
@@ -140,7 +140,7 @@ totext_in_srv(ARGS_TOTEXT) {
static inline isc_result_t
fromwire_in_srv(ARGS_FROMWIRE) {
- dns_name_t name;
+ dns_name_t name;
isc_region_t sr;
REQUIRE(type == 33);
@@ -151,7 +151,7 @@ fromwire_in_srv(ARGS_FROMWIRE) {
dns_decompress_setmethods(dctx, DNS_COMPRESS_NONE);
- dns_name_init(&name, NULL);
+ dns_name_init(&name, NULL);
/*
* Priority, weight, port.
@@ -370,4 +370,9 @@ checknames_in_srv(ARGS_CHECKNAMES) {
return (ISC_TRUE);
}
+static inline int
+casecompare_in_srv(ARGS_COMPARE) {
+ return (compare_in_srv(rdata1, rdata2));
+}
+
#endif /* RDATA_IN_1_SRV_33_C */
diff --git a/contrib/bind9/lib/dns/rdata/in_1/wks_11.c b/contrib/bind9/lib/dns/rdata/in_1/wks_11.c
index b7d5057..29983ec 100644
--- a/contrib/bind9/lib/dns/rdata/in_1/wks_11.c
+++ b/contrib/bind9/lib/dns/rdata/in_1/wks_11.c
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: wks_11.c,v 1.54.332.2 2009-02-16 23:47:15 tbox Exp $ */
+/* $Id: wks_11.c,v 1.57 2009-12-04 21:09:34 marka Exp $ */
/* Reviewed: Fri Mar 17 15:01:49 PST 2000 by explorer */
@@ -348,4 +348,9 @@ checknames_in_wks(ARGS_CHECKNAMES) {
return (ISC_TRUE);
}
+static inline int
+casecompare_in_wks(ARGS_COMPARE) {
+ return (compare_in_wks(rdata1, rdata2));
+}
+
#endif /* RDATA_IN_1_WKS_11_C */
diff --git a/contrib/bind9/lib/dns/rdatalist.c b/contrib/bind9/lib/dns/rdatalist.c
index e8178a7..d30aff9 100644
--- a/contrib/bind9/lib/dns/rdatalist.c
+++ b/contrib/bind9/lib/dns/rdatalist.c
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: rdatalist.c,v 1.36.50.2 2010-02-25 10:56:41 tbox Exp $ */
+/* $Id: rdatalist.c,v 1.40 2010-11-16 05:38:31 marka Exp $ */
/*! \file */
diff --git a/contrib/bind9/lib/dns/rdataset.c b/contrib/bind9/lib/dns/rdataset.c
index 44b3a5e..fdd7669 100644
--- a/contrib/bind9/lib/dns/rdataset.c
+++ b/contrib/bind9/lib/dns/rdataset.c
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004-2010 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004-2011 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 1999-2003 Internet Software Consortium.
*
* Permission to use, copy, modify, and/or distribute this software for any
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: rdataset.c,v 1.82.50.4.6.1 2011-05-27 00:19:19 each Exp $ */
+/* $Id: rdataset.c,v 1.86.220.3 2011-06-21 20:15:53 each Exp $ */
/*! \file */
@@ -345,7 +345,7 @@ towiresorted(dns_rdataset_t *rdataset, const dns_name_t *owner_name,
count = 1;
result = dns_rdataset_first(rdataset);
INSIST(result == ISC_R_NOMORE);
- } else if (rdataset->type == 0) {
+ } else if ((rdataset->attributes & DNS_RDATASETATTR_NEGATIVE) != 0) {
/*
* This is a negative caching rdataset.
*/
diff --git a/contrib/bind9/lib/dns/rdataslab.c b/contrib/bind9/lib/dns/rdataslab.c
index d1a02a0..932f8de 100644
--- a/contrib/bind9/lib/dns/rdataslab.c
+++ b/contrib/bind9/lib/dns/rdataslab.c
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004-2010 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004-2011 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 1999-2003 Internet Software Consortium.
*
* Permission to use, copy, modify, and/or distribute this software for any
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: rdataslab.c,v 1.48.50.4 2010-02-25 10:56:41 tbox Exp $ */
+/* $Id: rdataslab.c,v 1.52.148.1.2.1 2011-06-02 23:47:35 tbox Exp $ */
/*! \file */
@@ -144,21 +144,25 @@ dns_rdataslab_fromrdataset(dns_rdataset_t *rdataset, isc_mem_t *mctx,
nalloc = dns_rdataset_count(rdataset);
nitems = nalloc;
- if (nitems == 0)
+ if (nitems == 0 && rdataset->type != 0)
return (ISC_R_FAILURE);
if (nalloc > 0xffff)
return (ISC_R_NOSPACE);
- x = isc_mem_get(mctx, nalloc * sizeof(struct xrdata));
- if (x == NULL)
- return (ISC_R_NOMEMORY);
+
+ if (nalloc != 0) {
+ x = isc_mem_get(mctx, nalloc * sizeof(struct xrdata));
+ if (x == NULL)
+ return (ISC_R_NOMEMORY);
+ } else
+ x = NULL;
/*
* Save all of the rdata members into an array.
*/
result = dns_rdataset_first(rdataset);
- if (result != ISC_R_SUCCESS)
+ if (result != ISC_R_SUCCESS && result != ISC_R_NOMORE)
goto free_rdatas;
for (i = 0; i < nalloc && result == ISC_R_SUCCESS; i++) {
INSIST(result == ISC_R_SUCCESS);
@@ -223,11 +227,14 @@ dns_rdataslab_fromrdataset(dns_rdataset_t *rdataset, isc_mem_t *mctx,
/*
* Don't forget the last item!
*/
+ if (nalloc != 0) {
#if DNS_RDATASET_FIXED
- buflen += (8 + x[i-1].rdata.length);
+ buflen += (8 + x[i-1].rdata.length);
#else
- buflen += (2 + x[i-1].rdata.length);
+ buflen += (2 + x[i-1].rdata.length);
#endif
+ }
+
/*
* Provide space to store the per RR meta data.
*/
@@ -316,7 +323,8 @@ dns_rdataslab_fromrdataset(dns_rdataset_t *rdataset, isc_mem_t *mctx,
result = ISC_R_SUCCESS;
free_rdatas:
- isc_mem_put(mctx, x, nalloc * sizeof(struct xrdata));
+ if (x != NULL)
+ isc_mem_put(mctx, x, nalloc * sizeof(struct xrdata));
return (result);
}
diff --git a/contrib/bind9/lib/dns/request.c b/contrib/bind9/lib/dns/request.c
index c1cd235..b5d6248 100644
--- a/contrib/bind9/lib/dns/request.c
+++ b/contrib/bind9/lib/dns/request.c
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004-2009 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004-2010 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 2000-2002 Internet Software Consortium.
*
* Permission to use, copy, modify, and/or distribute this software for any
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: request.c,v 1.82.72.2 2009-01-18 23:47:40 tbox Exp $ */
+/* $Id: request.c,v 1.87 2010-03-04 23:50:34 tbox Exp $ */
/*! \file */
@@ -449,7 +449,8 @@ req_send(dns_request_t *request, isc_task_t *task, isc_sockaddr_t *address) {
}
static isc_result_t
-new_request(isc_mem_t *mctx, dns_request_t **requestp) {
+new_request(isc_mem_t *mctx, dns_request_t **requestp)
+{
dns_request_t *request;
request = isc_mem_get(mctx, sizeof(*request));
@@ -1058,6 +1059,9 @@ req_render(dns_message_t *message, isc_buffer_t **bufferp,
return (result);
cleanup_cctx = ISC_TRUE;
+ if ((options & DNS_REQUESTOPT_CASE) != 0)
+ dns_compress_setsensitive(&cctx, ISC_TRUE);
+
/*
* Render message.
*/
diff --git a/contrib/bind9/lib/dns/resolver.c b/contrib/bind9/lib/dns/resolver.c
index 290bb0f..6d9ab70 100644
--- a/contrib/bind9/lib/dns/resolver.c
+++ b/contrib/bind9/lib/dns/resolver.c
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: resolver.c,v 1.384.14.30 2011-01-27 23:45:47 tbox Exp $ */
+/* $Id: resolver.c,v 1.428.6.5.2.1 2011-06-21 20:15:53 each Exp $ */
/*! \file */
@@ -105,6 +105,14 @@
#define QTRACE(m)
#endif
+#ifndef DEFAULT_QUERY_TIMEOUT
+#define DEFAULT_QUERY_TIMEOUT 30 /* The default time in seconds for the whole query to live. */
+#endif
+
+#ifndef MAXIMUM_QUERY_TIMEOUT
+#define MAXIMUM_QUERY_TIMEOUT 30 /* The maximum time in seconds for the whole query to live. */
+#endif
+
/*%
* Maximum EDNS0 input packet size.
*/
@@ -273,6 +281,8 @@ struct fetchctx {
unsigned int findfail;
unsigned int valfail;
isc_boolean_t timeout;
+ dns_adbaddrinfo_t *addrinfo;
+ isc_sockaddr_t *client;
};
#define FCTX_MAGIC ISC_MAGIC('F', '!', '!', '!')
@@ -384,6 +394,7 @@ struct dns_resolver {
unsigned int spillatmin;
isc_timer_t * spillattimer;
isc_boolean_t zero_no_soa_ttl;
+ unsigned int query_timeout;
/* Locked by lock. */
unsigned int references;
@@ -424,6 +435,7 @@ struct dns_resolver {
FCTX_ADDRINFO_TRIED) != 0)
#define NXDOMAIN(r) (((r)->attributes & DNS_RDATASETATTR_NXDOMAIN) != 0)
+#define NEGATIVE(r) (((r)->attributes & DNS_RDATASETATTR_NEGATIVE) != 0)
static void destroy(dns_resolver_t *res);
static void empty_bucket(dns_resolver_t *res);
@@ -1034,6 +1046,7 @@ fctx_sendevents(fetchctx_t *fctx, isc_result_t result, int line) {
ISC_LIST_UNLINK(fctx->events, event, ev_link);
task = event->ev_sender;
event->ev_sender = fctx;
+ event->vresult = fctx->vresult;
if (!HAVE_ANSWER(fctx))
event->result = result;
@@ -1047,7 +1060,7 @@ fctx_sendevents(fetchctx_t *fctx, isc_result_t result, int line) {
* Negative results must be indicated in event->result.
*/
if (dns_rdataset_isassociated(event->rdataset) &&
- event->rdataset->type == dns_rdatatype_none) {
+ NEGATIVE(event->rdataset)) {
INSIST(event->result == DNS_R_NCACHENXDOMAIN ||
event->result == DNS_R_NCACHENXRRSET);
}
@@ -1741,9 +1754,8 @@ resquery_send(resquery_t *query) {
if ((query->options & DNS_FETCHOPT_NOVALIDATE) != 0) {
fctx->qmessage->flags |= DNS_MESSAGEFLAG_CD;
} else if (res->view->enablevalidation) {
- result = dns_keytable_issecuredomain(res->view->secroots,
- &fctx->name,
- &secure_domain);
+ result = dns_view_issecuredomain(res->view, &fctx->name,
+ &secure_domain);
if (result != ISC_R_SUCCESS)
secure_domain = ISC_FALSE;
if (res->view->dlv != NULL)
@@ -2284,7 +2296,7 @@ add_bad(fetchctx_t *fctx, dns_adbaddrinfo_t *addrinfo, isc_result_t reason,
char code[64];
isc_buffer_t b;
isc_sockaddr_t *sa;
- const char *sep1, *sep2;
+ const char *spc = "";
isc_sockaddr_t *address = &addrinfo->sockaddr;
if (reason == DNS_R_LAME)
@@ -2330,18 +2342,14 @@ add_bad(fetchctx_t *fctx, dns_adbaddrinfo_t *addrinfo, isc_result_t reason,
isc_buffer_init(&b, code, sizeof(code) - 1);
dns_rcode_totext(fctx->rmessage->rcode, &b);
code[isc_buffer_usedlength(&b)] = '\0';
- sep1 = "(";
- sep2 = ") ";
+ spc = " ";
} else if (reason == DNS_R_UNEXPECTEDOPCODE) {
isc_buffer_init(&b, code, sizeof(code) - 1);
dns_opcode_totext((dns_opcode_t)fctx->rmessage->opcode, &b);
code[isc_buffer_usedlength(&b)] = '\0';
- sep1 = "(";
- sep2 = ") ";
+ spc = " ";
} else {
code[0] = '\0';
- sep1 = "";
- sep2 = "";
}
dns_name_format(&fctx->name, namebuf, sizeof(namebuf));
dns_rdatatype_format(fctx->type, typebuf, sizeof(typebuf));
@@ -2349,83 +2357,19 @@ add_bad(fetchctx_t *fctx, dns_adbaddrinfo_t *addrinfo, isc_result_t reason,
isc_sockaddr_format(address, addrbuf, sizeof(addrbuf));
isc_log_write(dns_lctx, DNS_LOGCATEGORY_LAME_SERVERS,
DNS_LOGMODULE_RESOLVER, ISC_LOG_INFO,
- "%s %s%s%sresolving '%s/%s/%s': %s",
- dns_result_totext(reason), sep1, code, sep2,
+ "error (%s%s%s) resolving '%s/%s/%s': %s",
+ dns_result_totext(reason), spc, code,
namebuf, typebuf, classbuf, addrbuf);
}
/*
- * Return 'bits' bits of random entropy from fctx->rand_buf,
- * refreshing it by calling isc_random_get() whenever the requested
- * number of bits is greater than the number in the buffer.
- */
-static inline isc_uint32_t
-random_bits(fetchctx_t *fctx, isc_uint32_t bits) {
- isc_uint32_t ret = 0;
-
- REQUIRE(VALID_FCTX(fctx));
- REQUIRE(bits <= 32);
- if (bits == 0)
- return (0);
-
- if (bits >= fctx->rand_bits) {
- /* if rand_bits == 0, this is unnecessary but harmless */
- bits -= fctx->rand_bits;
- ret = fctx->rand_buf << bits;
-
- /* refresh random buffer now */
- isc_random_get(&fctx->rand_buf);
- fctx->rand_bits = sizeof(fctx->rand_buf) * CHAR_BIT;
- }
-
- if (bits > 0) {
- isc_uint32_t mask = 0xffffffff;
- if (bits < 32) {
- mask = (1 << bits) - 1;
- }
-
- ret |= fctx->rand_buf & mask;
- fctx->rand_buf >>= bits;
- fctx->rand_bits -= bits;
- }
-
- return (ret);
-}
-
-/*
- * Add some random jitter to a server's RTT value so that the
- * order of queries will be unpredictable.
- *
- * RTT values of servers which have been tried are fuzzed by 128 ms.
- * Servers that haven't been tried yet have their RTT set to a random
- * value between 0 ms and 7 ms; they should get to go first, but in
- * unpredictable order.
- */
-static inline void
-randomize_srtt(fetchctx_t *fctx, dns_adbaddrinfo_t *ai) {
- if (TRIED(ai)) {
- ai->srtt >>= 10; /* convert to milliseconds, near enough */
- ai->srtt |= (ai->srtt & 0x80) | random_bits(fctx, 7);
- ai->srtt <<= 10; /* now back to microseconds */
- } else
- ai->srtt = random_bits(fctx, 3) << 10;
-}
-
-/*
- * Sort addrinfo list by RTT (with random jitter)
+ * Sort addrinfo list by RTT.
*/
static void
-sort_adbfind(fetchctx_t *fctx, dns_adbfind_t *find) {
+sort_adbfind(dns_adbfind_t *find) {
dns_adbaddrinfo_t *best, *curr;
dns_adbaddrinfolist_t sorted;
- /* Add jitter to SRTT values */
- curr = ISC_LIST_HEAD(find->list);
- while (curr != NULL) {
- randomize_srtt(fctx, curr);
- curr = ISC_LIST_NEXT(curr, publink);
- }
-
/* Lame N^2 bubble sort. */
ISC_LIST_INIT(sorted);
while (!ISC_LIST_EMPTY(find->list)) {
@@ -2443,19 +2387,19 @@ sort_adbfind(fetchctx_t *fctx, dns_adbfind_t *find) {
}
/*
- * Sort a list of finds by server RTT (with random jitter)
+ * Sort a list of finds by server RTT.
*/
static void
-sort_finds(fetchctx_t *fctx, dns_adbfindlist_t *findlist) {
+sort_finds(dns_adbfindlist_t *findlist) {
dns_adbfind_t *best, *curr;
dns_adbfindlist_t sorted;
dns_adbaddrinfo_t *addrinfo, *bestaddrinfo;
- /* Sort each find's addrinfo list by SRTT (after adding jitter) */
+ /* Sort each find's addrinfo list by SRTT. */
for (curr = ISC_LIST_HEAD(*findlist);
curr != NULL;
curr = ISC_LIST_NEXT(curr, publink))
- sort_adbfind(fctx, curr);
+ sort_adbfind(curr);
/* Lame N^2 bubble sort. */
ISC_LIST_INIT(sorted);
@@ -2840,8 +2784,8 @@ fctx_getaddresses(fetchctx_t *fctx, isc_boolean_t badcache) {
* We've found some addresses. We might still be looking
* for more addresses.
*/
- sort_finds(fctx, &fctx->finds);
- sort_finds(fctx, &fctx->altfinds);
+ sort_finds(&fctx->finds);
+ sort_finds(&fctx->altfinds);
result = ISC_R_SUCCESS;
}
@@ -3470,6 +3414,7 @@ fctx_join(fetchctx_t *fctx, isc_task_t *task, isc_sockaddr_t *client,
else
ISC_LIST_APPEND(fctx->events, event, ev_link);
fctx->references++;
+ fctx->client = client;
fetch->magic = DNS_FETCH_MAGIC;
fetch->private = fctx;
@@ -3568,6 +3513,8 @@ fctx_create(dns_resolver_t *res, dns_name_t *name, dns_rdatatype_t type,
fctx->rand_buf = 0;
fctx->rand_bits = 0;
fctx->timeout = ISC_FALSE;
+ fctx->addrinfo = NULL;
+ fctx->client = NULL;
dns_name_init(&fctx->nsname, NULL);
fctx->nsfetch = NULL;
@@ -3657,7 +3604,7 @@ fctx_create(dns_resolver_t *res, dns_name_t *name, dns_rdatatype_t type,
/*
* Compute an expiration time for the entire fetch.
*/
- isc_interval_set(&interval, 30, 0); /* XXXRTH constant */
+ isc_interval_set(&interval, res->query_timeout, 0);
iresult = isc_time_nowplusinterval(&fctx->expires, &interval);
if (iresult != ISC_R_SUCCESS) {
UNEXPECTED_ERROR(__FILE__, __LINE__,
@@ -3799,6 +3746,33 @@ log_lame(fetchctx_t *fctx, dns_adbaddrinfo_t *addrinfo) {
namebuf, domainbuf, addrbuf);
}
+static inline void
+log_formerr(fetchctx_t *fctx, const char *format, ...) {
+ char nsbuf[ISC_SOCKADDR_FORMATSIZE];
+ char clbuf[ISC_SOCKADDR_FORMATSIZE];
+ const char *clmsg = "";
+ char msgbuf[2048];
+ va_list args;
+
+ va_start(args, format);
+ vsnprintf(msgbuf, sizeof(msgbuf), format, args);
+ va_end(args);
+
+ isc_sockaddr_format(&fctx->addrinfo->sockaddr, nsbuf, sizeof(nsbuf));
+
+ if (fctx->client != NULL) {
+ clmsg = " for client ";
+ isc_sockaddr_format(fctx->client, clbuf, sizeof(clbuf));
+ } else {
+ clbuf[0] = '\0';
+ }
+
+ isc_log_write(dns_lctx, DNS_LOGCATEGORY_RESOLVER,
+ DNS_LOGMODULE_RESOLVER, ISC_LOG_NOTICE,
+ "DNS format error from %s resolving %s%s%s: %s",
+ nsbuf, fctx->info, clmsg, clbuf, msgbuf);
+}
+
static inline isc_result_t
same_question(fetchctx_t *fctx) {
isc_result_t result;
@@ -3813,8 +3787,10 @@ same_question(fetchctx_t *fctx) {
/*
* XXXRTH Currently we support only one question.
*/
- if (message->counts[DNS_SECTION_QUESTION] != 1)
+ if (message->counts[DNS_SECTION_QUESTION] != 1) {
+ log_formerr(fctx, "too many questions");
return (DNS_R_FORMERR);
+ }
result = dns_message_firstname(message, DNS_SECTION_QUESTION);
if (result != ISC_R_SUCCESS)
@@ -3824,10 +3800,21 @@ same_question(fetchctx_t *fctx) {
rdataset = ISC_LIST_HEAD(name->list);
INSIST(rdataset != NULL);
INSIST(ISC_LIST_NEXT(rdataset, link) == NULL);
+
if (fctx->type != rdataset->type ||
fctx->res->rdclass != rdataset->rdclass ||
- !dns_name_equal(&fctx->name, name))
+ !dns_name_equal(&fctx->name, name)) {
+ char namebuf[DNS_NAME_FORMATSIZE];
+ char class[DNS_RDATACLASS_FORMATSIZE];
+ char type[DNS_RDATATYPE_FORMATSIZE];
+
+ dns_name_format(name, namebuf, sizeof(namebuf));
+ dns_rdataclass_format(rdataset->rdclass, class, sizeof(class));
+ dns_rdatatype_format(rdataset->type, type, sizeof(type));
+ log_formerr(fctx, "question section mismatch: got %s/%s/%s",
+ namebuf, class, type);
return (DNS_R_FORMERR);
+ }
return (ISC_R_SUCCESS);
}
@@ -3957,6 +3944,7 @@ validated(isc_task_t *task, isc_event_t *event) {
REQUIRE(!ISC_LIST_EMPTY(fctx->validators));
vevent = (dns_validatorevent_t *)event;
+ fctx->vresult = vevent->result;
FCTXTRACE("received validation completion event");
@@ -4177,7 +4165,7 @@ validated(isc_task_t *task, isc_event_t *event) {
if (result != ISC_R_SUCCESS &&
result != DNS_R_UNCHANGED)
goto noanswer_response;
- if (ardataset != NULL && ardataset->type == 0) {
+ if (ardataset != NULL && NEGATIVE(ardataset)) {
if (NXDOMAIN(ardataset))
eresult = DNS_R_NCACHENXDOMAIN;
else
@@ -4330,8 +4318,8 @@ cache_name(fetchctx_t *fctx, dns_name_t *name, dns_adbaddrinfo_t *addrinfo,
* Is DNSSEC validation required for this name?
*/
if (res->view->enablevalidation) {
- result = dns_keytable_issecuredomain(res->view->secroots, name,
- &secure_domain);
+ result = dns_view_issecuredomain(res->view, name,
+ &secure_domain);
if (result != ISC_R_SUCCESS)
return (result);
@@ -4498,7 +4486,7 @@ cache_name(fetchctx_t *fctx, dns_name_t *name, dns_adbaddrinfo_t *addrinfo,
result = ISC_R_SUCCESS;
if (!need_validation &&
ardataset != NULL &&
- ardataset->type == 0) {
+ NEGATIVE(ardataset)) {
/*
* The answer in the cache is
* better than the answer we
@@ -4628,7 +4616,7 @@ cache_name(fetchctx_t *fctx, dns_name_t *name, dns_adbaddrinfo_t *addrinfo,
if (result == DNS_R_UNCHANGED) {
if (ANSWER(rdataset) &&
ardataset != NULL &&
- ardataset->type == 0) {
+ NEGATIVE(ardataset)) {
/*
* The answer in the cache is better
* than the answer we found, and is
@@ -4658,7 +4646,7 @@ cache_name(fetchctx_t *fctx, dns_name_t *name, dns_adbaddrinfo_t *addrinfo,
* Negative results must be indicated in event->result.
*/
if (dns_rdataset_isassociated(event->rdataset) &&
- event->rdataset->type == dns_rdatatype_none) {
+ NEGATIVE(event->rdataset)) {
INSIST(eresult == DNS_R_NCACHENXDOMAIN ||
eresult == DNS_R_NCACHENXRRSET);
}
@@ -4738,7 +4726,7 @@ ncache_adderesult(dns_message_t *message, dns_db_t *cache, dns_dbnode_t *node,
* care about whether it is DNS_R_NCACHENXDOMAIN or
* DNS_R_NCACHENXRRSET then extract it.
*/
- if (ardataset->type == 0) {
+ if (NEGATIVE(ardataset)) {
/*
* The cache data is a negative cache entry.
*/
@@ -4803,8 +4791,8 @@ ncache_message(fetchctx_t *fctx, dns_adbaddrinfo_t *addrinfo,
* Is DNSSEC validation required for this name?
*/
if (fctx->res->view->enablevalidation) {
- result = dns_keytable_issecuredomain(res->view->secroots, name,
- &secure_domain);
+ result = dns_view_issecuredomain(res->view, name,
+ &secure_domain);
if (result != ISC_R_SUCCESS)
return (result);
@@ -4948,7 +4936,9 @@ mark_related(dns_name_t *name, dns_rdataset_t *rdataset,
}
static isc_result_t
-check_related(void *arg, dns_name_t *addname, dns_rdatatype_t type) {
+check_section(void *arg, dns_name_t *addname, dns_rdatatype_t type,
+ dns_section_t section)
+{
fetchctx_t *fctx = arg;
isc_result_t result;
dns_name_t *name;
@@ -4959,15 +4949,19 @@ check_related(void *arg, dns_name_t *addname, dns_rdatatype_t type) {
REQUIRE(VALID_FCTX(fctx));
+#if CHECK_FOR_GLUE_IN_ANSWER
+ if (section == DNS_SECTION_ANSWER && type != dns_rdatatype_a)
+ return (ISC_R_SUCCESS);
+#endif
+
if (GLUING(fctx))
gluing = ISC_TRUE;
else
gluing = ISC_FALSE;
name = NULL;
rdataset = NULL;
- result = dns_message_findname(fctx->rmessage, DNS_SECTION_ADDITIONAL,
- addname, dns_rdatatype_any, 0, &name,
- NULL);
+ result = dns_message_findname(fctx->rmessage, section, addname,
+ dns_rdatatype_any, 0, &name, NULL);
if (result == ISC_R_SUCCESS) {
external = ISC_TF(!dns_name_issubdomain(name, &fctx->domain));
if (type == dns_rdatatype_a) {
@@ -5005,6 +4999,21 @@ check_related(void *arg, dns_name_t *addname, dns_rdatatype_t type) {
return (ISC_R_SUCCESS);
}
+static isc_result_t
+check_related(void *arg, dns_name_t *addname, dns_rdatatype_t type) {
+ return (check_section(arg, addname, type, DNS_SECTION_ADDITIONAL));
+}
+
+#ifndef CHECK_FOR_GLUE_IN_ANSWER
+#define CHECK_FOR_GLUE_IN_ANSWER 0
+#endif
+#if CHECK_FOR_GLUE_IN_ANSWER
+static isc_result_t
+check_answer(void *arg, dns_name_t *addname, dns_rdatatype_t type) {
+ return (check_section(arg, addname, type, DNS_SECTION_ANSWER));
+}
+#endif
+
static void
chase_additional(fetchctx_t *fctx) {
isc_boolean_t rescan;
@@ -5061,8 +5070,8 @@ cname_target(dns_rdataset_t *rdataset, dns_name_t *tname) {
}
static inline isc_result_t
-dname_target(dns_rdataset_t *rdataset, dns_name_t *qname, dns_name_t *oname,
- dns_fixedname_t *fixeddname)
+dname_target(fetchctx_t *fctx, dns_rdataset_t *rdataset, dns_name_t *qname,
+ dns_name_t *oname, dns_fixedname_t *fixeddname)
{
isc_result_t result;
dns_rdata_t rdata = DNS_RDATA_INIT;
@@ -5075,7 +5084,6 @@ dname_target(dns_rdataset_t *rdataset, dns_name_t *qname, dns_name_t *oname,
/*
* Get the target name of the DNAME.
*/
-
result = dns_rdataset_first(rdataset);
if (result != ISC_R_SUCCESS)
return (result);
@@ -5089,7 +5097,14 @@ dname_target(dns_rdataset_t *rdataset, dns_name_t *qname, dns_name_t *oname,
*/
namereln = dns_name_fullcompare(qname, oname, &order, &nlabels);
if (namereln != dns_namereln_subdomain) {
+ char qbuf[DNS_NAME_FORMATSIZE];
+ char obuf[DNS_NAME_FORMATSIZE];
+
dns_rdata_freestruct(&dname);
+ dns_name_format(qname, qbuf, sizeof(qbuf));
+ dns_name_format(oname, obuf, sizeof(obuf));
+ log_formerr(fctx, "unrelated DNAME in answer: "
+ "%s is not in %s", qbuf, obuf);
return (DNS_R_FORMERR);
}
dns_fixedname_init(&prefix);
@@ -5102,16 +5117,147 @@ dname_target(dns_rdataset_t *rdataset, dns_name_t *qname, dns_name_t *oname,
return (result);
}
+static isc_boolean_t
+is_answeraddress_allowed(dns_view_t *view, dns_name_t *name,
+ dns_rdataset_t *rdataset)
+{
+ isc_result_t result;
+ dns_rdata_t rdata = DNS_RDATA_INIT;
+ struct in_addr ina;
+ struct in6_addr in6a;
+ isc_netaddr_t netaddr;
+ char addrbuf[ISC_NETADDR_FORMATSIZE];
+ char namebuf[DNS_NAME_FORMATSIZE];
+ char classbuf[64];
+ char typebuf[64];
+ int match;
+
+ /* By default, we allow any addresses. */
+ if (view->denyansweracl == NULL)
+ return (ISC_TRUE);
+
+ /*
+ * If the owner name matches one in the exclusion list, either exactly
+ * or partially, allow it.
+ */
+ if (view->answeracl_exclude != NULL) {
+ dns_rbtnode_t *node = NULL;
+
+ result = dns_rbt_findnode(view->answeracl_exclude, name, NULL,
+ &node, NULL, 0, NULL, NULL);
+
+ if (result == ISC_R_SUCCESS || result == DNS_R_PARTIALMATCH)
+ return (ISC_TRUE);
+ }
+
+ /*
+ * Otherwise, search the filter list for a match for each address
+ * record. If a match is found, the address should be filtered,
+ * so should the entire answer.
+ */
+ for (result = dns_rdataset_first(rdataset);
+ result == ISC_R_SUCCESS;
+ result = dns_rdataset_next(rdataset)) {
+ dns_rdata_reset(&rdata);
+ dns_rdataset_current(rdataset, &rdata);
+ if (rdataset->type == dns_rdatatype_a) {
+ INSIST(rdata.length == sizeof(ina.s_addr));
+ memcpy(&ina.s_addr, rdata.data, sizeof(ina.s_addr));
+ isc_netaddr_fromin(&netaddr, &ina);
+ } else {
+ INSIST(rdata.length == sizeof(in6a.s6_addr));
+ memcpy(in6a.s6_addr, rdata.data, sizeof(in6a.s6_addr));
+ isc_netaddr_fromin6(&netaddr, &in6a);
+ }
+
+ result = dns_acl_match(&netaddr, NULL, view->denyansweracl,
+ &view->aclenv, &match, NULL);
+
+ if (result == ISC_R_SUCCESS && match > 0) {
+ isc_netaddr_format(&netaddr, addrbuf, sizeof(addrbuf));
+ dns_name_format(name, namebuf, sizeof(namebuf));
+ dns_rdatatype_format(rdataset->type, typebuf,
+ sizeof(typebuf));
+ dns_rdataclass_format(rdataset->rdclass, classbuf,
+ sizeof(classbuf));
+ isc_log_write(dns_lctx, DNS_LOGCATEGORY_RESOLVER,
+ DNS_LOGMODULE_RESOLVER, ISC_LOG_NOTICE,
+ "answer address %s denied for %s/%s/%s",
+ addrbuf, namebuf, typebuf, classbuf);
+ return (ISC_FALSE);
+ }
+ }
+
+ return (ISC_TRUE);
+}
+
+static isc_boolean_t
+is_answertarget_allowed(dns_view_t *view, dns_name_t *name,
+ dns_rdatatype_t type, dns_name_t *tname,
+ dns_name_t *domain)
+{
+ isc_result_t result;
+ dns_rbtnode_t *node = NULL;
+ char qnamebuf[DNS_NAME_FORMATSIZE];
+ char tnamebuf[DNS_NAME_FORMATSIZE];
+ char classbuf[64];
+ char typebuf[64];
+
+ /* By default, we allow any target name. */
+ if (view->denyanswernames == NULL)
+ return (ISC_TRUE);
+
+ /*
+ * If the owner name matches one in the exclusion list, either exactly
+ * or partially, allow it.
+ */
+ if (view->answernames_exclude != NULL) {
+ result = dns_rbt_findnode(view->answernames_exclude, name, NULL,
+ &node, NULL, 0, NULL, NULL);
+ if (result == ISC_R_SUCCESS || result == DNS_R_PARTIALMATCH)
+ return (ISC_TRUE);
+ }
+
+ /*
+ * If the target name is a subdomain of the search domain, allow it.
+ */
+ if (dns_name_issubdomain(tname, domain))
+ return (ISC_TRUE);
+
+ /*
+ * Otherwise, apply filters.
+ */
+ result = dns_rbt_findnode(view->denyanswernames, tname, NULL, &node,
+ NULL, 0, NULL, NULL);
+ if (result == ISC_R_SUCCESS || result == DNS_R_PARTIALMATCH) {
+ dns_name_format(name, qnamebuf, sizeof(qnamebuf));
+ dns_name_format(tname, tnamebuf, sizeof(tnamebuf));
+ dns_rdatatype_format(type, typebuf, sizeof(typebuf));
+ dns_rdataclass_format(view->rdclass, classbuf,
+ sizeof(classbuf));
+ isc_log_write(dns_lctx, DNS_LOGCATEGORY_RESOLVER,
+ DNS_LOGMODULE_RESOLVER, ISC_LOG_NOTICE,
+ "%s target %s denied for %s/%s",
+ typebuf, tnamebuf, qnamebuf, classbuf);
+ return (ISC_FALSE);
+ }
+
+ return (ISC_TRUE);
+}
+
/*
* Handle a no-answer response (NXDOMAIN, NXRRSET, or referral).
- * If bind8_ns_resp is ISC_TRUE, this is a suspected BIND 8
- * response to an NS query that should be treated as a referral
- * even though the NS records occur in the answer section
- * rather than the authority section.
+ * If look_in_options has LOOK_FOR_NS_IN_ANSWER then we look in the answer
+ * section for the NS RRset if the query type is NS; if it has
+ * LOOK_FOR_GLUE_IN_ANSWER we look for glue incorrectly returned in the answer
+ * section for A and AAAA queries.
*/
+#define LOOK_FOR_NS_IN_ANSWER 0x1
+#define LOOK_FOR_GLUE_IN_ANSWER 0x2
+
static isc_result_t
noanswer_response(fetchctx_t *fctx, dns_name_t *oqname,
- isc_boolean_t bind8_ns_resp)
+ unsigned int look_in_options)
{
isc_result_t result;
dns_message_t *message;
@@ -5119,11 +5265,16 @@ noanswer_response(fetchctx_t *fctx, dns_name_t *oqname,
dns_rdataset_t *rdataset, *ns_rdataset;
isc_boolean_t aa, negative_response;
dns_rdatatype_t type;
- dns_section_t section =
- bind8_ns_resp ? DNS_SECTION_ANSWER : DNS_SECTION_AUTHORITY;
+ dns_section_t section;
FCTXTRACE("noanswer_response");
+ if ((look_in_options & LOOK_FOR_NS_IN_ANSWER) != 0) {
+ INSIST(fctx->type == dns_rdatatype_ns);
+ section = DNS_SECTION_ANSWER;
+ } else
+ section = DNS_SECTION_AUTHORITY;
+
message = fctx->rmessage;
/*
@@ -5196,8 +5347,22 @@ noanswer_response(fetchctx_t *fctx, dns_name_t *oqname,
type = rdataset->covers;
if (((type == dns_rdatatype_ns ||
type == dns_rdatatype_soa) &&
- !dns_name_issubdomain(qname, name)))
+ !dns_name_issubdomain(qname, name))) {
+ char qbuf[DNS_NAME_FORMATSIZE];
+ char nbuf[DNS_NAME_FORMATSIZE];
+ char tbuf[DNS_RDATATYPE_FORMATSIZE];
+ dns_rdatatype_format(fctx->type, tbuf,
+ sizeof(tbuf));
+ dns_name_format(name, nbuf,
+ sizeof(nbuf));
+ dns_name_format(qname, qbuf,
+ sizeof(qbuf));
+ log_formerr(fctx,
+ "unrelated %s %s in "
+ "%s authority section",
+ tbuf, qbuf, nbuf);
return (DNS_R_FORMERR);
+ }
if (type == dns_rdatatype_ns) {
/*
* NS or RRSIG NS.
@@ -5207,8 +5372,14 @@ noanswer_response(fetchctx_t *fctx, dns_name_t *oqname,
if (rdataset->type ==
dns_rdatatype_ns) {
if (ns_name != NULL &&
- name != ns_name)
+ name != ns_name) {
+ log_formerr(fctx,
+ "multiple NS "
+ "RRsets in "
+ "authority "
+ "section");
return (DNS_R_FORMERR);
+ }
ns_name = name;
ns_rdataset = rdataset;
}
@@ -5227,8 +5398,14 @@ noanswer_response(fetchctx_t *fctx, dns_name_t *oqname,
if (rdataset->type ==
dns_rdatatype_soa) {
if (soa_name != NULL &&
- name != soa_name)
+ name != soa_name) {
+ log_formerr(fctx,
+ "multiple SOA "
+ "RRs in "
+ "authority "
+ "section");
return (DNS_R_FORMERR);
+ }
soa_name = name;
}
name->attributes |=
@@ -5304,15 +5481,25 @@ noanswer_response(fetchctx_t *fctx, dns_name_t *oqname,
*
* These should only be here if
* this is a referral, and there
- * should only be one DS.
+ * should only be one DS RRset.
*/
- if (ns_name == NULL)
+ if (ns_name == NULL) {
+ log_formerr(fctx,
+ "DS with no "
+ "referral");
return (DNS_R_FORMERR);
+ }
if (rdataset->type ==
dns_rdatatype_ds) {
if (ds_name != NULL &&
- name != ds_name)
+ name != ds_name) {
+ log_formerr(fctx,
+ "DS doesn't "
+ "match "
+ "referral "
+ "(NS)");
return (DNS_R_FORMERR);
+ }
ds_name = name;
}
name->attributes |=
@@ -5362,6 +5549,7 @@ noanswer_response(fetchctx_t *fctx, dns_name_t *oqname,
/*
* The responder is insane.
*/
+ log_formerr(fctx, "invalid response");
return (DNS_R_FORMERR);
}
}
@@ -5369,8 +5557,10 @@ noanswer_response(fetchctx_t *fctx, dns_name_t *oqname,
/*
* If we found both NS and SOA, they should be the same name.
*/
- if (ns_name != NULL && soa_name != NULL && ns_name != soa_name)
+ if (ns_name != NULL && soa_name != NULL && ns_name != soa_name) {
+ log_formerr(fctx, "NS/SOA mismatch");
return (DNS_R_FORMERR);
+ }
/*
* Do we have a referral? (We only want to follow a referral if
@@ -5383,14 +5573,18 @@ noanswer_response(fetchctx_t *fctx, dns_name_t *oqname,
* progress. We return DNS_R_FORMERR so that we'll keep
* trying other servers.
*/
- if (dns_name_equal(ns_name, &fctx->domain))
+ if (dns_name_equal(ns_name, &fctx->domain)) {
+ log_formerr(fctx, "non-improving referral");
return (DNS_R_FORMERR);
+ }
/*
* If the referral name is not a parent of the query
* name, consider the responder insane.
*/
if (! dns_name_issubdomain(&fctx->name, ns_name)) {
+ /* Logged twice */
+ log_formerr(fctx, "referral to non-parent");
FCTXTRACE("referral to non-parent");
return (DNS_R_FORMERR);
}
@@ -5404,6 +5598,20 @@ noanswer_response(fetchctx_t *fctx, dns_name_t *oqname,
fctx->attributes |= FCTX_ATTR_GLUING;
(void)dns_rdataset_additionaldata(ns_rdataset, check_related,
fctx);
+#if CHECK_FOR_GLUE_IN_ANSWER
+ /*
+ * Look in the answer section for "glue" that is incorrectly
+ * returned as a answer. This is needed if the server also
+ * minimizes the response size by not adding records to the
+ * additional section that are in the answer section or if
+ * the record gets dropped due to message size constraints.
+ */
+ if ((look_in_options & LOOK_FOR_GLUE_IN_ANSWER) != 0 &&
+ (fctx->type == dns_rdatatype_aaaa ||
+ fctx->type == dns_rdatatype_a))
+ (void)dns_rdataset_additionaldata(ns_rdataset,
+ check_answer, fctx);
+#endif
fctx->attributes &= ~FCTX_ATTR_GLUING;
/*
* NS rdatasets with 0 TTL cause problems.
@@ -5459,6 +5667,7 @@ answer_response(fetchctx_t *fctx) {
unsigned int aflag;
dns_rdatatype_t type;
dns_fixedname_t dname, fqname;
+ dns_view_t *view;
FCTXTRACE("answer_response");
@@ -5481,6 +5690,7 @@ answer_response(fetchctx_t *fctx) {
aa = ISC_FALSE;
qname = &fctx->name;
type = fctx->type;
+ view = fctx->res->view;
result = dns_message_firstname(message, DNS_SECTION_ANSWER);
while (!done && result == ISC_R_SUCCESS) {
name = NULL;
@@ -5499,8 +5709,21 @@ answer_response(fetchctx_t *fctx) {
* NSEC3 records are not allowed to
* appear in the answer section.
*/
+ log_formerr(fctx, "NSEC3 in answer");
return (DNS_R_FORMERR);
}
+
+ /*
+ * Apply filters, if given, on answers to reject
+ * a malicious attempt of rebinding.
+ */
+ if ((rdataset->type == dns_rdatatype_a ||
+ rdataset->type == dns_rdatatype_aaaa) &&
+ !is_answeraddress_allowed(view, name,
+ rdataset)) {
+ return (DNS_R_SERVFAIL);
+ }
+
if (rdataset->type == type && !found_cname) {
/*
* We've found an ordinary answer.
@@ -5539,8 +5762,16 @@ answer_response(fetchctx_t *fctx) {
*/
if (type == dns_rdatatype_rrsig ||
type == dns_rdatatype_dnskey ||
- type == dns_rdatatype_nsec)
+ type == dns_rdatatype_nsec ||
+ type == dns_rdatatype_nsec3) {
+ char buf[DNS_RDATATYPE_FORMATSIZE];
+ dns_rdatatype_format(fctx->type,
+ buf, sizeof(buf));
+ log_formerr(fctx,
+ "CNAME response "
+ "for %s RR", buf);
return (DNS_R_FORMERR);
+ }
found = ISC_TRUE;
found_cname = ISC_TRUE;
want_chaining = ISC_TRUE;
@@ -5549,6 +5780,14 @@ answer_response(fetchctx_t *fctx) {
&tname);
if (result != ISC_R_SUCCESS)
return (result);
+ /* Apply filters on the target name. */
+ if (!is_answertarget_allowed(view,
+ name,
+ rdataset->type,
+ &tname,
+ &fctx->domain)) {
+ return (DNS_R_SERVFAIL);
+ }
} else if (rdataset->type == dns_rdatatype_rrsig
&& rdataset->covers ==
dns_rdatatype_cname
@@ -5649,6 +5888,8 @@ answer_response(fetchctx_t *fctx) {
rdataset != NULL;
rdataset = ISC_LIST_NEXT(rdataset, link)) {
isc_boolean_t found_dname = ISC_FALSE;
+ dns_name_t *dname_name;
+
found = ISC_FALSE;
aflag = 0;
if (rdataset->type == dns_rdatatype_dname) {
@@ -5659,12 +5900,15 @@ answer_response(fetchctx_t *fctx) {
* If we're not chaining, then the
* DNAME should not be external.
*/
- if (!chaining && external)
+ if (!chaining && external) {
+ log_formerr(fctx,
+ "external DNAME");
return (DNS_R_FORMERR);
+ }
found = ISC_TRUE;
want_chaining = ISC_TRUE;
aflag = DNS_RDATASETATTR_ANSWER;
- result = dname_target(rdataset,
+ result = dname_target(fctx, rdataset,
qname, name,
&dname);
if (result == ISC_R_NOSPACE) {
@@ -5678,6 +5922,15 @@ answer_response(fetchctx_t *fctx) {
return (result);
else
found_dname = ISC_TRUE;
+
+ dname_name = dns_fixedname_name(&dname);
+ if (!is_answertarget_allowed(view,
+ qname,
+ rdataset->type,
+ dname_name,
+ &fctx->domain)) {
+ return (DNS_R_SERVFAIL);
+ }
} else if (rdataset->type == dns_rdatatype_rrsig
&& rdataset->covers ==
dns_rdatatype_dname) {
@@ -5765,8 +6018,10 @@ answer_response(fetchctx_t *fctx) {
/*
* We should have found an answer.
*/
- if (!have_answer)
+ if (!have_answer) {
+ log_formerr(fctx, "reply has no answer");
return (DNS_R_FORMERR);
+ }
/*
* This response is now potentially cacheable.
@@ -5783,15 +6038,18 @@ answer_response(fetchctx_t *fctx) {
* If it isn't a noanswer response, no harm will be
* done.
*/
- return (noanswer_response(fctx, qname, ISC_FALSE));
+ return (noanswer_response(fctx, qname, 0));
}
/*
* We didn't end with an incomplete chain, so the rcode should be
* "no error".
*/
- if (message->rcode != dns_rcode_noerror)
+ if (message->rcode != dns_rcode_noerror) {
+ log_formerr(fctx, "CNAME/DNAME chain complete, but RCODE "
+ "indicates error");
return (DNS_R_FORMERR);
+ }
/*
* Examine the authority section (if there is one).
@@ -6128,6 +6386,39 @@ log_packet(dns_message_t *message, int level, isc_mem_t *mctx) {
isc_mem_put(mctx, buf, len);
}
+static isc_boolean_t
+iscname(fetchctx_t *fctx) {
+ isc_result_t result;
+
+ result = dns_message_findname(fctx->rmessage, DNS_SECTION_ANSWER,
+ &fctx->name, dns_rdatatype_cname, 0,
+ NULL, NULL);
+ return (result == ISC_R_SUCCESS ? ISC_TRUE : ISC_FALSE);
+}
+
+static isc_boolean_t
+betterreferral(fetchctx_t *fctx) {
+ isc_result_t result;
+ dns_name_t *name;
+ dns_rdataset_t *rdataset;
+ dns_message_t *message = fctx->rmessage;
+
+ for (result = dns_message_firstname(message, DNS_SECTION_AUTHORITY);
+ result == ISC_R_SUCCESS;
+ result = dns_message_nextname(message, DNS_SECTION_AUTHORITY)) {
+ name = NULL;
+ dns_message_currentname(message, DNS_SECTION_AUTHORITY, &name);
+ if (!isstrictsubdomain(name, &fctx->domain))
+ continue;
+ for (rdataset = ISC_LIST_HEAD(name->list);
+ rdataset != NULL;
+ rdataset = ISC_LIST_NEXT(rdataset, link))
+ if (rdataset->type == dns_rdatatype_ns)
+ return (ISC_TRUE);
+ }
+ return (ISC_FALSE);
+}
+
static void
resquery_response(isc_task_t *task, isc_event_t *event) {
isc_result_t result = ISC_R_SUCCESS;
@@ -6179,6 +6470,7 @@ resquery_response(isc_task_t *task, isc_event_t *event) {
fctx->timeouts = 0;
fctx->timeout = ISC_FALSE;
+ fctx->addrinfo = query->addrinfo;
/*
* XXXRTH We should really get the current time just once. We
@@ -6475,6 +6767,7 @@ resquery_response(isc_task_t *task, isc_event_t *event) {
* cannot make any more progress with this
* fetch.
*/
+ log_formerr(fctx, "server sent FORMERR");
result = DNS_R_FORMERR;
}
} else if (message->rcode == dns_rcode_yxdomain) {
@@ -6589,27 +6882,62 @@ resquery_response(isc_task_t *task, isc_event_t *event) {
(message->rcode == dns_rcode_noerror ||
message->rcode == dns_rcode_nxdomain)) {
/*
- * We've got answers. However, if we sent
- * a BIND 8 server an NS query, it may have
- * incorrectly responded with a non-authoritative
- * answer instead of a referral. Since this
- * answer lacks the SIGs necessary to do DNSSEC
- * validation, we must invoke the following special
- * kludge to treat it as a referral.
+ * [normal case]
+ * We've got answers. If it has an authoritative answer or an
+ * answer from a forwarder, we're done.
*/
- if (fctx->type == dns_rdatatype_ns &&
- (message->flags & DNS_MESSAGEFLAG_AA) == 0 &&
- !ISFORWARDER(query->addrinfo))
- {
- result = noanswer_response(fctx, NULL, ISC_TRUE);
+ if ((message->flags & DNS_MESSAGEFLAG_AA) != 0 ||
+ ISFORWARDER(query->addrinfo))
+ result = answer_response(fctx);
+ else if (iscname(fctx) &&
+ fctx->type != dns_rdatatype_any &&
+ fctx->type != dns_rdatatype_cname) {
+ /*
+ * A BIND8 server could return a non-authoritative
+ * answer when a CNAME is followed. We should treat
+ * it as a valid answer.
+ */
+ result = answer_response(fctx);
+ } else if (fctx->type != dns_rdatatype_ns &&
+ !betterreferral(fctx)) {
+ /*
+ * Lame response !!!.
+ */
+ result = answer_response(fctx);
+ } else {
+ if (fctx->type == dns_rdatatype_ns) {
+ /*
+ * A BIND 8 server could incorrectly return a
+ * non-authoritative answer to an NS query
+ * instead of a referral. Since this answer
+ * lacks the SIGs necessary to do DNSSEC
+ * validation, we must invoke the following
+ * special kludge to treat it as a referral.
+ */
+ result = noanswer_response(fctx, NULL,
+ LOOK_FOR_NS_IN_ANSWER);
+ } else {
+ /*
+ * Some other servers may still somehow include
+ * an answer when it should return a referral
+ * with an empty answer. Check to see if we can
+ * treat this as a referral by ignoring the
+ * answer. Further more, there may be an
+ * implementation that moves A/AAAA glue records
+ * to the answer section for that type of
+ * delegation when the query is for that glue
+ * record. LOOK_FOR_GLUE_IN_ANSWER will handle
+ * such a corner case.
+ */
+ result = noanswer_response(fctx, NULL,
+ LOOK_FOR_GLUE_IN_ANSWER);
+ }
if (result != DNS_R_DELEGATION) {
/*
- * The answer section must have contained
- * something other than the NS records
- * we asked for. Since AA is not set
- * and the server is not a forwarder,
- * it is technically lame and it's easier
- * to treat it as such than to figure out
+ * At this point, AA is not set, the response
+ * is not a referral, and the server is not a
+ * forwarder. It is technically lame and it's
+ * easier to treat it as such than to figure out
* some more elaborate course of action.
*/
broken_server = DNS_R_LAME;
@@ -6618,7 +6946,6 @@ resquery_response(isc_task_t *task, isc_event_t *event) {
}
goto force_referral;
}
- result = answer_response(fctx);
if (result != ISC_R_SUCCESS) {
if (result == DNS_R_FORMERR)
keep_trying = ISC_TRUE;
@@ -6630,7 +6957,7 @@ resquery_response(isc_task_t *task, isc_event_t *event) {
/*
* NXDOMAIN, NXRDATASET, or referral.
*/
- result = noanswer_response(fctx, NULL, ISC_FALSE);
+ result = noanswer_response(fctx, NULL, 0);
if (result == DNS_R_CHASEDSSERVERS) {
} else if (result == DNS_R_DELEGATION) {
force_referral:
@@ -7042,6 +7369,7 @@ dns_resolver_create(dns_view_t *view,
res->spillatmax = 100;
res->spillattimer = NULL;
res->zero_no_soa_ttl = ISC_FALSE;
+ res->query_timeout = DEFAULT_QUERY_TIMEOUT;
res->ndisps = 0;
res->nextdisp = 0; /* meaningless at this point, but init it */
res->nbuckets = ntasks;
@@ -7193,6 +7521,7 @@ dns_resolver_create(dns_view_t *view,
return (result);
}
+#ifdef BIND9
static void
prime_done(isc_task_t *task, isc_event_t *event) {
dns_resolver_t *res;
@@ -7298,16 +7627,15 @@ dns_resolver_prime(dns_resolver_t *res) {
}
}
}
+#endif /* BIND9 */
void
dns_resolver_freeze(dns_resolver_t *res) {
-
/*
* Freeze resolver.
*/
REQUIRE(VALID_RESOLVER(res));
- REQUIRE(!res->frozen);
res->frozen = ISC_TRUE;
}
@@ -8340,3 +8668,22 @@ dns_resolver_getoptions(dns_resolver_t *resolver) {
return (resolver->options);
}
+
+unsigned int
+dns_resolver_gettimeout(dns_resolver_t *resolver) {
+ REQUIRE(VALID_RESOLVER(resolver));
+
+ return (resolver->query_timeout);
+}
+
+void
+dns_resolver_settimeout(dns_resolver_t *resolver, unsigned int seconds) {
+ REQUIRE(VALID_RESOLVER(resolver));
+
+ if (seconds == 0)
+ seconds = DEFAULT_QUERY_TIMEOUT;
+ if (seconds > MAXIMUM_QUERY_TIMEOUT)
+ seconds = MAXIMUM_QUERY_TIMEOUT;
+
+ resolver->query_timeout = seconds;
+}
diff --git a/contrib/bind9/lib/dns/result.c b/contrib/bind9/lib/dns/result.c
index 2b0457c..4cc194d 100644
--- a/contrib/bind9/lib/dns/result.c
+++ b/contrib/bind9/lib/dns/result.c
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004, 2005, 2007, 2008, 2010 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004, 2005, 2007-2011 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 1998-2003 Internet Software Consortium.
*
* Permission to use, copy, modify, and/or distribute this software for any
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: result.c,v 1.125.48.2 2010-02-25 10:56:41 tbox Exp $ */
+/* $Id: result.c,v 1.132 2011-01-11 23:47:13 tbox Exp $ */
/*! \file */
@@ -105,7 +105,7 @@ static const char *text[DNS_R_NRESULTS] = {
"no valid RRSIG", /*%< 59 DNS_R_NOVALIDSIG */
"no valid NSEC", /*%< 60 DNS_R_NOVALIDNSEC */
- "not insecure", /*%< 61 DNS_R_NOTINSECURE */
+ "insecurity proof failed", /*%< 61 DNS_R_NOTINSECURE */
"unknown service", /*%< 62 DNS_R_UNKNOWNSERVICE */
"recoverable error occurred", /*%< 63 DNS_R_RECOVERABLE */
"unknown opt attribute record", /*%< 64 DNS_R_UNKNOWNOPT */
@@ -160,6 +160,7 @@ static const char *text[DNS_R_NRESULTS] = {
"not master", /*%< 105 DNS_R_NOTMASTER */
"broken trust chain", /*%< 106 DNS_R_BROKENCHAIN */
+ "expired", /*%< 106 DNS_R_EXPIRED */
};
static const char *rcode_text[DNS_R_NRCODERESULTS] = {
diff --git a/contrib/bind9/lib/dns/rootns.c b/contrib/bind9/lib/dns/rootns.c
index d51a0d6..40e2244 100644
--- a/contrib/bind9/lib/dns/rootns.c
+++ b/contrib/bind9/lib/dns/rootns.c
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: rootns.c,v 1.36.50.4 2010-06-18 05:37:50 marka Exp $ */
+/* $Id: rootns.c,v 1.40 2010-06-18 05:36:24 marka Exp $ */
/*! \file */
diff --git a/contrib/bind9/lib/dns/rpz.c b/contrib/bind9/lib/dns/rpz.c
new file mode 100644
index 0000000..f809e7b
--- /dev/null
+++ b/contrib/bind9/lib/dns/rpz.c
@@ -0,0 +1,1168 @@
+/*
+ * Copyright (C) 2011 Internet Systems Consortium, Inc. ("ISC")
+ *
+ * Permission to use, copy, modify, and/or 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 ISC DISCLAIMS ALL WARRANTIES WITH
+ * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+ * AND FITNESS. IN NO EVENT SHALL ISC 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.
+ */
+
+/* $Id: rpz.c,v 1.7 2011-01-17 04:27:23 marka Exp $ */
+
+/*! \file */
+
+#include <config.h>
+
+#include <isc/buffer.h>
+#include <isc/mem.h>
+#include <isc/net.h>
+#include <isc/netaddr.h>
+#include <isc/print.h>
+#include <isc/stdlib.h>
+#include <isc/string.h>
+#include <isc/util.h>
+
+#include <dns/db.h>
+#include <dns/fixedname.h>
+#include <dns/log.h>
+#include <dns/rdata.h>
+#include <dns/rdataset.h>
+#include <dns/rdatastruct.h>
+#include <dns/result.h>
+#include <dns/rpz.h>
+#include <dns/view.h>
+
+
+/*
+ * Parallel radix trees for databases of response policy IP addresses
+ *
+ * The radix or Patricia trees are somewhat specialized to handle response
+ * policy addresses by representing the two test of IP IP addresses and name
+ * server IP addresses in a single tree.
+ *
+ * Each leaf indicates that an IP address is listed in the IP address or the
+ * name server IP address policy sub-zone (or both) of the corresponding
+ * response response zone. The policy data such as a CNAME or an A record
+ * is kept in the policy zone. After an IP address has been found in a radix
+ * tree, the node in the policy zone's database is found by converting
+ * the IP address to a domain name in a canonical form.
+ *
+ * The response policy zone canonical form of IPv6 addresses is one of:
+ * prefix.W.W.W.W.W.W.W.W
+ * prefix.WORDS.zz
+ * prefix.WORDS.zz.WORDS
+ * prefix.zz.WORDS
+ * where
+ * prefix is the prefix length of the IPv6 address between 1 and 128
+ * W is a number between 0 and 65535
+ * WORDS is one or more numbers W separated with "."
+ * zz corresponds to :: in the standard IPv6 text representation
+ *
+ * The canonical form of IPv4 addresses is:
+ * prefix.B.B.B.B
+ * where
+ * prefix is the prefix length of the address between 1 and 32
+ * B is a number between 0 and 255
+ *
+ * IPv4 addresses are distinguished from IPv6 addresses by having
+ * 5 labels all of which are numbers, and a prefix between 1 and 32.
+ */
+
+
+/*
+ * Use a private definition of IPv6 addresses because s6_addr32 is not
+ * always defined and our IPv6 addresses are in non-standard byte order
+ */
+typedef isc_uint32_t dns_rpz_cidr_word_t;
+#define DNS_RPZ_CIDR_WORD_BITS ((int)sizeof(dns_rpz_cidr_word_t)*8)
+#define DNS_RPZ_CIDR_KEY_BITS ((int)sizeof(dns_rpz_cidr_key_t)*8)
+#define DNS_RPZ_CIDR_WORDS (128/DNS_RPZ_CIDR_WORD_BITS)
+typedef struct {
+ dns_rpz_cidr_word_t w[DNS_RPZ_CIDR_WORDS];
+} dns_rpz_cidr_key_t;
+
+#define ADDR_V4MAPPED 0xffff
+
+#define DNS_RPZ_WORD_MASK(b) \
+ ((b) == 0 ? (dns_rpz_cidr_word_t)(-1) \
+ : ((dns_rpz_cidr_word_t)(-1) \
+ << (DNS_RPZ_CIDR_WORD_BITS - (b))))
+
+#define DNS_RPZ_IP_BIT(ip, bitno) \
+ (1 & ((ip)->w[(bitno)/DNS_RPZ_CIDR_WORD_BITS] >> \
+ (DNS_RPZ_CIDR_WORD_BITS - 1 - ((bitno) % DNS_RPZ_CIDR_WORD_BITS))))
+
+typedef struct dns_rpz_cidr_node dns_rpz_cidr_node_t;
+typedef isc_uint8_t dns_rpz_cidr_flags_t;
+struct dns_rpz_cidr_node {
+ dns_rpz_cidr_node_t *parent;
+ dns_rpz_cidr_node_t *child[2];
+ dns_rpz_cidr_key_t ip;
+ dns_rpz_cidr_bits_t bits;
+ dns_rpz_cidr_flags_t flags;
+#define DNS_RPZ_CIDR_FG_IP 0x01 /* has IP data or is parent of IP */
+#define DNS_RPZ_CIDR_FG_IP_DATA 0x02 /* has IP data */
+#define DNS_RPZ_CIDR_FG_NSIPv4 0x04 /* has or is parent of NSIPv4 data */
+#define DNS_RPZ_CIDR_FG_NSIPv6 0x08 /* has or is parent of NSIPv6 data */
+#define DNS_RPZ_CIDR_FG_NSIP_DATA 0x10 /* has NSIP data */
+};
+
+struct dns_rpz_cidr {
+ isc_mem_t *mctx;
+ isc_boolean_t had_nsdname;
+ dns_rpz_cidr_node_t *root;
+ dns_name_t ip_name; /* RPZ_IP_ZONE.LOCALHOST. */
+ dns_name_t nsip_name; /* RPZ_NSIP_ZONE.LOCALHOST. */
+ dns_name_t nsdname_name; /* RPZ_NSDNAME_ZONE.LOCALHOST */
+};
+
+
+static isc_boolean_t have_rpz_zones = ISC_FALSE;
+
+
+const char *
+dns_rpz_type2str(dns_rpz_type_t type)
+{
+ switch (type) {
+ case DNS_RPZ_TYPE_QNAME:
+ return ("QNAME");
+ case DNS_RPZ_TYPE_IP:
+ return ("IP");
+ case DNS_RPZ_TYPE_NSIP:
+ return ("NSIP");
+ case DNS_RPZ_TYPE_NSDNAME:
+ return ("NSDNAME");
+ case DNS_RPZ_TYPE_BAD:
+ break;
+ }
+ FATAL_ERROR(__FILE__, __LINE__,
+ "impossible response policy zone type %d", type);
+ return ("impossible");
+}
+
+
+
+dns_rpz_policy_t
+dns_rpz_str2policy(const char *str)
+{
+ if (str == NULL)
+ return (DNS_RPZ_POLICY_ERROR);
+ if (!strcasecmp(str, "given"))
+ return (DNS_RPZ_POLICY_GIVEN);
+ if (!strcasecmp(str, "no-op"))
+ return (DNS_RPZ_POLICY_NO_OP);
+ if (!strcasecmp(str, "nxdomain"))
+ return (DNS_RPZ_POLICY_NXDOMAIN);
+ if (!strcasecmp(str, "nodata"))
+ return (DNS_RPZ_POLICY_NODATA);
+ if (!strcasecmp(str, "cname"))
+ return (DNS_RPZ_POLICY_CNAME);
+ return (DNS_RPZ_POLICY_ERROR);
+}
+
+
+
+/*
+ * Free the radix tree of a response policy database.
+ */
+void
+dns_rpz_cidr_free(dns_rpz_cidr_t **cidrp) {
+ dns_rpz_cidr_node_t *cur, *child, *parent;
+ dns_rpz_cidr_t *cidr;
+
+ REQUIRE(cidrp != NULL);
+
+ cidr = *cidrp;
+ if (cidr == NULL)
+ return;
+
+ cur = cidr->root;
+ while (cur != NULL) {
+ /* Depth first. */
+ child = cur->child[0];
+ if (child != NULL) {
+ cur = child;
+ continue;
+ }
+ child = cur->child[1];
+ if (child != NULL) {
+ cur = child;
+ continue;
+ }
+
+ /* Delete this leaf and go up. */
+ parent = cur->parent;
+ if (parent == NULL)
+ cidr->root = NULL;
+ else
+ parent->child[parent->child[1] == cur] = NULL;
+ isc_mem_put(cidr->mctx, cur, sizeof(*cur));
+ cur = parent;
+ }
+
+ dns_name_free(&cidr->ip_name, cidr->mctx);
+ dns_name_free(&cidr->nsip_name, cidr->mctx);
+ dns_name_free(&cidr->nsdname_name, cidr->mctx);
+ isc_mem_put(cidr->mctx, cidr, sizeof(*cidr));
+ *cidrp = NULL;
+}
+
+
+
+/*
+ * Forget a view's list of policy zones.
+ */
+void
+dns_rpz_view_destroy(dns_view_t *view) {
+ dns_rpz_zone_t *zone;
+
+ REQUIRE(view != NULL);
+
+ while (!ISC_LIST_EMPTY(view->rpz_zones)) {
+ zone = ISC_LIST_HEAD(view->rpz_zones);
+ ISC_LIST_UNLINK(view->rpz_zones, zone, link);
+ if (dns_name_dynamic(&zone->origin))
+ dns_name_free(&zone->origin, view->mctx);
+ if (dns_name_dynamic(&zone->nsdname))
+ dns_name_free(&zone->nsdname, view->mctx);
+ if (dns_name_dynamic(&zone->cname))
+ dns_name_free(&zone->cname, view->mctx);
+ isc_mem_put(view->mctx, zone, sizeof(*zone));
+ }
+}
+
+/*
+ * Note that we have at least one response policy zone.
+ * It would be better for something to tell the rbtdb code that the
+ * zone is in at least one view's list of policy zones.
+ */
+void
+dns_rpz_set_need(isc_boolean_t need)
+{
+ have_rpz_zones = need;
+}
+
+
+isc_boolean_t
+dns_rpz_needed(void)
+{
+ return (have_rpz_zones);
+}
+
+
+
+/*
+ * Start a new radix tree for a response policy zone.
+ */
+isc_result_t
+dns_rpz_new_cidr(isc_mem_t *mctx, dns_name_t *origin,
+ dns_rpz_cidr_t **rbtdb_cidr)
+{
+ isc_result_t result;
+ dns_rpz_cidr_t *cidr;
+
+ REQUIRE(rbtdb_cidr != NULL && *rbtdb_cidr == NULL);
+
+ /*
+ * Only if there is at least one response policy zone.
+ */
+ if (!have_rpz_zones)
+ return (ISC_R_SUCCESS);
+
+ cidr = isc_mem_get(mctx, sizeof(*cidr));
+ if (cidr == NULL)
+ return (ISC_R_NOMEMORY);
+ memset(cidr, 0, sizeof(*cidr));
+ cidr->mctx = mctx;
+
+ dns_name_init(&cidr->ip_name, NULL);
+ result = dns_name_fromstring2(&cidr->ip_name, DNS_RPZ_IP_ZONE, origin,
+ DNS_NAME_DOWNCASE, mctx);
+ if (result != ISC_R_SUCCESS) {
+ isc_mem_put(mctx, cidr, sizeof(*cidr));
+ return (result);
+ }
+
+ dns_name_init(&cidr->nsip_name, NULL);
+ result = dns_name_fromstring2(&cidr->nsip_name, DNS_RPZ_NSIP_ZONE,
+ origin, DNS_NAME_DOWNCASE, mctx);
+ if (result != ISC_R_SUCCESS) {
+ dns_name_free(&cidr->ip_name, mctx);
+ isc_mem_put(mctx, cidr, sizeof(*cidr));
+ return (result);
+ }
+
+ dns_name_init(&cidr->nsdname_name, NULL);
+ result = dns_name_fromstring2(&cidr->nsdname_name, DNS_RPZ_NSDNAME_ZONE,
+ origin, DNS_NAME_DOWNCASE, mctx);
+ if (result != ISC_R_SUCCESS) {
+ dns_name_free(&cidr->nsip_name, mctx);
+ dns_name_free(&cidr->ip_name, mctx);
+ isc_mem_put(mctx, cidr, sizeof(*cidr));
+ return (result);
+ }
+
+ *rbtdb_cidr = cidr;
+ return (ISC_R_SUCCESS);
+}
+
+
+/*
+ * See if a policy zone has IP, NSIP, or NSDNAME rules or records.
+ */
+void
+dns_rpz_enabled(dns_rpz_cidr_t *cidr, dns_rpz_st_t *st) {
+ if (cidr->root != NULL &&
+ (cidr->root->flags & DNS_RPZ_CIDR_FG_IP) != 0)
+ st->state |= DNS_RPZ_HAVE_IP;
+ if (cidr->root != NULL &&
+ (cidr->root->flags & DNS_RPZ_CIDR_FG_NSIPv4) != 0)
+ st->state |= DNS_RPZ_HAVE_NSIPv4;
+ if (cidr->root != NULL &&
+ (cidr->root->flags & DNS_RPZ_CIDR_FG_NSIPv6) != 0)
+ st->state |= DNS_RPZ_HAVE_NSIPv6;
+ if (cidr->had_nsdname)
+ st->state |= DNS_RPZ_HAD_NSDNAME;
+}
+
+static inline dns_rpz_cidr_flags_t
+get_flags(const dns_rpz_cidr_key_t *ip, dns_rpz_cidr_bits_t prefix,
+ dns_rpz_type_t rpz_type)
+{
+ if (rpz_type == DNS_RPZ_TYPE_NSIP) {
+ if (prefix >= 96 &&
+ ip->w[0] == 0 && ip->w[1] == 0 &&
+ ip->w[2] == ADDR_V4MAPPED)
+ return (DNS_RPZ_CIDR_FG_NSIP_DATA |
+ DNS_RPZ_CIDR_FG_NSIPv4);
+ else
+ return (DNS_RPZ_CIDR_FG_NSIP_DATA |
+ DNS_RPZ_CIDR_FG_NSIPv6);
+ } else {
+ return (DNS_RPZ_CIDR_FG_IP | DNS_RPZ_CIDR_FG_IP_DATA);
+ }
+}
+
+
+
+/*
+ * Mark a node as having IP or NSIP data and all of its parents
+ * as members of the IP or NSIP tree.
+ */
+static void
+set_node_flags(dns_rpz_cidr_node_t *node, dns_rpz_type_t rpz_type) {
+ dns_rpz_cidr_flags_t flags;
+
+ flags = get_flags(&node->ip, node->bits, rpz_type);
+ node->flags |= flags;
+ flags &= ~(DNS_RPZ_CIDR_FG_NSIP_DATA | DNS_RPZ_CIDR_FG_IP_DATA);
+ for (;;) {
+ node = node->parent;
+ if (node == NULL)
+ return;
+ node->flags |= flags;
+ }
+}
+
+
+
+/*
+ * Make a radix tree node.
+ */
+static dns_rpz_cidr_node_t *
+new_node(dns_rpz_cidr_t *cidr, const dns_rpz_cidr_key_t *ip,
+ dns_rpz_cidr_bits_t bits, dns_rpz_cidr_flags_t flags)
+{
+ dns_rpz_cidr_node_t *node;
+ int i, words, wlen;
+
+ node = isc_mem_get(cidr->mctx, sizeof(*node));
+ if (node == NULL)
+ return (NULL);
+ memset(node, 0, sizeof(*node));
+
+ node->flags = flags & ~(DNS_RPZ_CIDR_FG_IP_DATA |
+ DNS_RPZ_CIDR_FG_NSIP_DATA);
+
+ node->bits = bits;
+ words = bits / DNS_RPZ_CIDR_WORD_BITS;
+ wlen = bits % DNS_RPZ_CIDR_WORD_BITS;
+ i = 0;
+ while (i < words) {
+ node->ip.w[i] = ip->w[i];
+ ++i;
+ }
+ if (wlen != 0) {
+ node->ip.w[i] = ip->w[i] & DNS_RPZ_WORD_MASK(wlen);
+ ++i;
+ }
+ while (i < DNS_RPZ_CIDR_WORDS)
+ node->ip.w[i++] = 0;
+
+ return (node);
+}
+
+
+
+static void
+badname(int level, dns_name_t *name, const char *comment)
+{
+ char printname[DNS_NAME_FORMATSIZE];
+
+ if (isc_log_wouldlog(dns_lctx, level)) {
+ dns_name_format(name, printname, sizeof(printname));
+ isc_log_write(dns_lctx, DNS_LOGCATEGORY_DATABASE,
+ DNS_LOGMODULE_RBTDB, level,
+ "invalid response policy name \"%s\"%s",
+ printname, comment);
+ }
+}
+
+
+
+/*
+ * Convert an IP address from radix tree binary (host byte order) to
+ * to its canonical response policy domain name and its name in the
+ * policy zone.
+ */
+static isc_result_t
+ip2name(dns_rpz_cidr_t *cidr, const dns_rpz_cidr_key_t *tgt_ip,
+ dns_rpz_cidr_bits_t tgt_prefix, dns_rpz_type_t type,
+ dns_name_t *canon_name, dns_name_t *search_name)
+{
+#ifndef INET6_ADDRSTRLEN
+#define INET6_ADDRSTRLEN 46
+#endif
+ int w[DNS_RPZ_CIDR_WORDS*2];
+ char str[1+8+1+INET6_ADDRSTRLEN+1];
+ isc_buffer_t buffer;
+ dns_name_t *name;
+ isc_result_t result;
+ isc_boolean_t zeros;
+ int i, n, len;
+
+ if (tgt_prefix > 96 &&
+ tgt_ip->w[0] == 0 &&
+ tgt_ip->w[1] == 0 &&
+ tgt_ip->w[2] == ADDR_V4MAPPED) {
+ len = snprintf(str, sizeof(str), "%d.%d.%d.%d.%d",
+ tgt_prefix - 96,
+ tgt_ip->w[3] & 0xff,
+ (tgt_ip->w[3]>>8) & 0xff,
+ (tgt_ip->w[3]>>16) & 0xff,
+ (tgt_ip->w[3]>>24) & 0xff);
+ if (len == -1 || len > (int)sizeof(str))
+ return (ISC_R_FAILURE);
+ } else {
+ for (i = 0; i < DNS_RPZ_CIDR_WORDS; i++) {
+ w[i*2+1] = ((tgt_ip->w[DNS_RPZ_CIDR_WORDS-1-i] >> 16)
+ & 0xffff);
+ w[i*2] = tgt_ip->w[DNS_RPZ_CIDR_WORDS-1-i] & 0xffff;
+ }
+ zeros = ISC_FALSE;
+ len = snprintf(str, sizeof(str), "%d", tgt_prefix);
+ if (len == -1)
+ return (ISC_R_FAILURE);
+ i = 0;
+ while (i < DNS_RPZ_CIDR_WORDS * 2) {
+ if (w[i] != 0 || zeros
+ || i >= DNS_RPZ_CIDR_WORDS * 2 - 1
+ || w[i+1] != 0) {
+ INSIST((size_t)len <= sizeof(str));
+ n = snprintf(&str[len], sizeof(str) - len,
+ ".%x", w[i++]);
+ if (n < 0)
+ return (ISC_R_FAILURE);
+ len += n;
+ } else {
+ zeros = ISC_TRUE;
+ INSIST((size_t)len <= sizeof(str));
+ n = snprintf(&str[len], sizeof(str) - len,
+ ".zz");
+ if (n < 0)
+ return (ISC_R_FAILURE);
+ len += n;
+ i += 2;
+ while (i < DNS_RPZ_CIDR_WORDS * 2 && w[i] == 0)
+ ++i;
+ }
+ if (len > (int)sizeof(str))
+ return (ISC_R_FAILURE);
+ }
+ }
+
+ if (canon_name != NULL) {
+ isc__buffer_init(&buffer, str, sizeof(str));
+ isc__buffer_add(&buffer, len);
+ result = dns_name_fromtext(canon_name, &buffer,
+ dns_rootname, 0, NULL);
+ if (result != ISC_R_SUCCESS)
+ return (result);
+ }
+ if (search_name != NULL) {
+ isc__buffer_init(&buffer, str, sizeof(str));
+ isc__buffer_add(&buffer, len);
+ if (type == DNS_RPZ_TYPE_NSIP)
+ name = &cidr->nsip_name;
+ else
+ name = &cidr->ip_name;
+ result = dns_name_fromtext(search_name, &buffer, name, 0, NULL);
+ if (result != ISC_R_SUCCESS)
+ return (result);
+ }
+ return (ISC_R_SUCCESS);
+}
+
+
+
+/*
+ * Decide which kind of IP address response policy zone a name is in.
+ */
+static dns_rpz_type_t
+set_type(dns_rpz_cidr_t *cidr, dns_name_t *name) {
+
+ if (dns_name_issubdomain(name, &cidr->ip_name))
+ return (DNS_RPZ_TYPE_IP);
+
+ /*
+ * Require `./configure --enable-rpz-nsip` and nsdname
+ * until consistency problems are resolved.
+ */
+#ifdef ENABLE_RPZ_NSIP
+ if (dns_name_issubdomain(name, &cidr->nsip_name))
+ return (DNS_RPZ_TYPE_NSIP);
+#endif
+
+#ifdef ENABLE_RPZ_NSDNAME
+ if (dns_name_issubdomain(name, &cidr->nsdname_name))
+ return (DNS_RPZ_TYPE_NSDNAME);
+#endif
+
+ return (DNS_RPZ_TYPE_QNAME);
+}
+
+
+
+/*
+ * Convert an IP address from canonical response policy domain name form
+ * to radix tree binary (host byte order).
+ */
+static isc_result_t
+name2ipkey(dns_rpz_cidr_t *cidr, int level, dns_name_t *src_name,
+ dns_rpz_type_t type, dns_rpz_cidr_key_t *tgt_ip,
+ dns_rpz_cidr_bits_t *tgt_prefix)
+{
+ isc_buffer_t buffer;
+ unsigned char data[DNS_NAME_MAXWIRE+1];
+ dns_fixedname_t fname;
+ dns_name_t *name;
+ const char *cp, *end;
+ char *cp2;
+ int ip_labels;
+ dns_rpz_cidr_bits_t bits;
+ unsigned long prefix, l;
+ int i;
+
+ /*
+ * Need at least enough labels for the shortest name,
+ * :: or 128.*.RPZ_x_ZONE.rpz.LOCALHOST.
+ */
+ ip_labels = dns_name_countlabels(src_name);
+ ip_labels -= dns_name_countlabels(&cidr->ip_name);
+ ip_labels--;
+ if (ip_labels < 1) {
+ badname(level, src_name, ", too short");
+ return (ISC_R_FAILURE);
+ }
+
+ /*
+ * Get text for the IP address without RPZ_x_ZONE.rpz.LOCALHOST.
+ */
+ dns_fixedname_init(&fname);
+ name = dns_fixedname_name(&fname);
+ dns_name_split(src_name, dns_name_countlabels(&cidr->ip_name),
+ name, NULL);
+ isc_buffer_init(&buffer, data, sizeof(data));
+ dns_name_totext(name, ISC_TRUE, &buffer);
+ isc_buffer_putuint8(&buffer, '\0');
+ cp = isc_buffer_base(&buffer);
+
+ prefix = strtoul(cp, &cp2, 10);
+ if (prefix < 1U || prefix > 128U || *cp2 != '.') {
+ badname(level, src_name, ", bad prefix length");
+ return (ISC_R_FAILURE);
+ }
+ cp = cp2+1;
+
+ end = isc_buffer_used(&buffer);
+ if (ip_labels == 4 && !strchr(cp, 'z')) {
+ /*
+ * Convert an IPv4 address
+ * from the form "prefix.w.z.y.x"
+ */
+ if (prefix > 32U) {
+ badname(level, src_name, "; bad IPv4 prefix length");
+ return (ISC_R_FAILURE);
+ }
+ prefix += 96;
+ *tgt_prefix = (dns_rpz_cidr_bits_t)prefix;
+ tgt_ip->w[0] = 0;
+ tgt_ip->w[1] = 0;
+ tgt_ip->w[2] = ADDR_V4MAPPED;
+ tgt_ip->w[3] = 0;
+ for (i = 0; i < 32; i += 8) {
+ l = strtoul(cp, &cp2, 10);
+ if (l > 255U || (*cp2 != '.' && *cp2 != '\0')) {
+ badname(level, src_name, "; bad IPv4 address");
+ return (ISC_R_FAILURE);
+ }
+ tgt_ip->w[3] |= l << i;
+ cp = cp2 + 1;
+ }
+ } else {
+ /*
+ * Convert a text IPv6 address.
+ */
+ *tgt_prefix = (dns_rpz_cidr_bits_t)prefix;
+ for (i = 0;
+ ip_labels > 0 && i < DNS_RPZ_CIDR_WORDS * 2;
+ ip_labels--) {
+ if (cp[0] == 'z' && cp[1] == 'z' &&
+ (cp[2] == '.' || cp[2] == '\0') &&
+ i <= 6) {
+ do {
+ if ((i & 1) == 0)
+ tgt_ip->w[3-i/2] = 0;
+ ++i;
+ } while (ip_labels + i <= 8);
+ cp += 3;
+ } else {
+ l = strtoul(cp, &cp2, 16);
+ if (l > 0xffffu ||
+ (*cp2 != '.' && *cp2 != '\0')) {
+ badname(level, src_name, "");
+ return (ISC_R_FAILURE);
+ }
+ if ((i & 1) == 0)
+ tgt_ip->w[3-i/2] = l;
+ else
+ tgt_ip->w[3-i/2] |= l << 16;
+ i++;
+ cp = cp2 + 1;
+ }
+ }
+ }
+ if (cp != end) {
+ badname(level, src_name, "");
+ return (ISC_R_FAILURE);
+ }
+
+ /*
+ * Check for 1s after the prefix length.
+ */
+ bits = (dns_rpz_cidr_bits_t)prefix;
+ while (bits < DNS_RPZ_CIDR_KEY_BITS) {
+ dns_rpz_cidr_word_t aword;
+
+ i = bits % DNS_RPZ_CIDR_WORD_BITS;
+ aword = tgt_ip->w[bits / DNS_RPZ_CIDR_WORD_BITS];
+ if ((aword & ~DNS_RPZ_WORD_MASK(i)) != 0) {
+ badname(level, src_name, "; wrong prefix length");
+ return (ISC_R_FAILURE);
+ }
+ bits -= i;
+ bits += DNS_RPZ_CIDR_WORD_BITS;
+ }
+
+ /*
+ * Convert the IPv6 address back to a canonical policy domain name
+ * to ensure that it is in canonical form.
+ */
+ if (ISC_R_SUCCESS != ip2name(cidr, tgt_ip, (dns_rpz_cidr_bits_t)prefix,
+ type, NULL, name) ||
+ !dns_name_equal(src_name, name)) {
+ badname(level, src_name, "; not canonical");
+ return (ISC_R_FAILURE);
+ }
+
+ return (ISC_R_SUCCESS);
+}
+
+
+
+/*
+ * find first differing bit
+ */
+static int
+ffbit(dns_rpz_cidr_word_t w) {
+ int bit;
+
+ if (w == 0)
+ return (DNS_RPZ_CIDR_WORD_BITS);
+ for (bit = 0; (w & (1U << (DNS_RPZ_CIDR_WORD_BITS-1))) == 0; bit++)
+ w <<= 1;
+ return (bit);
+}
+
+
+
+/*
+ * find the first differing bit in two keys
+ */
+static int
+diff_keys(const dns_rpz_cidr_key_t *key1, dns_rpz_cidr_bits_t bits1,
+ const dns_rpz_cidr_key_t *key2, dns_rpz_cidr_bits_t bits2)
+{
+ dns_rpz_cidr_word_t delta;
+ dns_rpz_cidr_bits_t maxbit, bit;
+ int i;
+
+ maxbit = ISC_MIN(bits1, bits2);
+
+ /*
+ * find the first differing words
+ */
+ for (i = 0, bit = 0;
+ bit <= maxbit;
+ i++, bit += DNS_RPZ_CIDR_WORD_BITS) {
+ delta = key1->w[i] ^ key2->w[i];
+ if (delta != 0) {
+ bit += ffbit(delta);
+ break;
+ }
+ }
+ return (ISC_MIN(bit, maxbit));
+}
+
+
+
+/*
+ * Search a radix tree for an IP address for ordinary lookup
+ * or for a CIDR block adding or deleting an entry
+ * The tree read (for simple search) or write lock must be held by the caller.
+ *
+ * return ISC_R_SUCCESS, ISC_R_NOTFOUND, DNS_R_PARTIALMATCH, ISC_R_EXISTS,
+ * ISC_R_NOMEMORY
+ */
+static isc_result_t
+search(dns_rpz_cidr_t *cidr, const dns_rpz_cidr_key_t *tgt_ip,
+ dns_rpz_cidr_bits_t tgt_prefix, dns_rpz_type_t type,
+ isc_boolean_t create,
+ dns_rpz_cidr_node_t **found) /* NULL or longest match node */
+{
+ dns_rpz_cidr_node_t *cur, *parent, *child, *new_parent, *sibling;
+ int cur_num, child_num;
+ dns_rpz_cidr_bits_t dbit;
+ dns_rpz_cidr_flags_t flags, data_flag;
+ isc_result_t find_result;
+
+ flags = get_flags(tgt_ip, tgt_prefix, type);
+ data_flag = flags & (DNS_RPZ_CIDR_FG_IP_DATA |
+ DNS_RPZ_CIDR_FG_NSIP_DATA);
+
+ find_result = ISC_R_NOTFOUND;
+ if (found != NULL)
+ *found = NULL;
+ cur = cidr->root;
+ parent = NULL;
+ cur_num = 0;
+ for (;;) {
+ if (cur == NULL) {
+ /*
+ * No child so we cannot go down. Fail or
+ * add the target as a child of the current parent.
+ */
+ if (!create)
+ return (find_result);
+ child = new_node(cidr, tgt_ip, tgt_prefix, 0);
+ if (child == NULL)
+ return (ISC_R_NOMEMORY);
+ if (parent == NULL)
+ cidr->root = child;
+ else
+ parent->child[cur_num] = child;
+ child->parent = parent;
+ set_node_flags(child, type);
+ if (found != NULL)
+ *found = cur;
+ return (ISC_R_SUCCESS);
+ }
+
+ /*
+ * Pretend a node not in the correct tree does not exist
+ * if we are not adding to the tree,
+ * If we are adding, then continue down to eventually
+ * add a node and mark/put this node in the correct tree.
+ */
+ if ((cur->flags & flags) == 0 && !create)
+ return (find_result);
+
+ dbit = diff_keys(tgt_ip, tgt_prefix, &cur->ip, cur->bits);
+ /*
+ * dbit <= tgt_prefix and dbit <= cur->bits always.
+ * We are finished searching if we matched all of the target.
+ */
+ if (dbit == tgt_prefix) {
+ if (tgt_prefix == cur->bits) {
+ /*
+ * The current node matches the target exactly.
+ * It is the answer if it has data.
+ */
+ if ((cur->flags & data_flag) != 0) {
+ if (create)
+ return (ISC_R_EXISTS);
+ if (found != NULL)
+ *found = cur;
+ return (ISC_R_SUCCESS);
+ } else if (create) {
+ /*
+ * The node had no data but does now.
+ */
+ set_node_flags(cur, type);
+ if (found != NULL)
+ *found = cur;
+ return (ISC_R_SUCCESS);
+ }
+ return (find_result);
+ }
+
+ /*
+ * We know tgt_prefix < cur_bits which means that
+ * the target is shorter than the current node.
+ * Add the target as the current node's parent.
+ */
+ if (!create)
+ return (find_result);
+
+ new_parent = new_node(cidr, tgt_ip, tgt_prefix,
+ cur->flags);
+ if (new_parent == NULL)
+ return (ISC_R_NOMEMORY);
+ new_parent->parent = parent;
+ if (parent == NULL)
+ cidr->root = new_parent;
+ else
+ parent->child[cur_num] = new_parent;
+ child_num = DNS_RPZ_IP_BIT(&cur->ip, tgt_prefix+1);
+ new_parent->child[child_num] = cur;
+ cur->parent = new_parent;
+ set_node_flags(new_parent, type);
+ if (found != NULL)
+ *found = new_parent;
+ return (ISC_R_SUCCESS);
+ }
+
+ if (dbit == cur->bits) {
+ /*
+ * We have a partial match by matching of all of the
+ * current node but only part of the target.
+ * Try to go down.
+ */
+ if ((cur->flags & data_flag) != 0) {
+ find_result = DNS_R_PARTIALMATCH;
+ if (found != NULL)
+ *found = cur;
+ }
+
+ parent = cur;
+ cur_num = DNS_RPZ_IP_BIT(tgt_ip, dbit);
+ cur = cur->child[cur_num];
+ continue;
+ }
+
+
+ /*
+ * dbit < tgt_prefix and dbit < cur->bits,
+ * so we failed to match both the target and the current node.
+ * Insert a fork of a parent above the current node and
+ * add the target as a sibling of the current node
+ */
+ if (!create)
+ return (find_result);
+
+ sibling = new_node(cidr, tgt_ip, tgt_prefix, 0);
+ if (sibling == NULL)
+ return (ISC_R_NOMEMORY);
+ new_parent = new_node(cidr, tgt_ip, dbit, cur->flags);
+ if (new_parent == NULL) {
+ isc_mem_put(cidr->mctx, sibling, sizeof(*sibling));
+ return (ISC_R_NOMEMORY);
+ }
+ new_parent->parent = parent;
+ if (parent == NULL)
+ cidr->root = new_parent;
+ else
+ parent->child[cur_num] = new_parent;
+ child_num = DNS_RPZ_IP_BIT(tgt_ip, dbit);
+ new_parent->child[child_num] = sibling;
+ new_parent->child[1-child_num] = cur;
+ cur->parent = new_parent;
+ sibling->parent = new_parent;
+ set_node_flags(sibling, type);
+ if (found != NULL)
+ *found = sibling;
+ return (ISC_R_SUCCESS);
+ }
+}
+
+
+
+/*
+ * Add an IP address to the radix tree of a response policy database.
+ * The tree write lock must be held by the caller.
+ */
+void
+dns_rpz_cidr_addip(dns_rpz_cidr_t *cidr, dns_name_t *name)
+{
+ dns_rpz_cidr_key_t tgt_ip;
+ dns_rpz_cidr_bits_t tgt_prefix;
+ dns_rpz_type_t type;
+
+ if (cidr == NULL)
+ return;
+
+ /*
+ * no worries if the new name is not an IP address
+ */
+ type = set_type(cidr, name);
+ switch (type) {
+ case DNS_RPZ_TYPE_IP:
+ case DNS_RPZ_TYPE_NSIP:
+ break;
+ case DNS_RPZ_TYPE_NSDNAME:
+ cidr->had_nsdname = ISC_TRUE;
+ return;
+ case DNS_RPZ_TYPE_QNAME:
+ case DNS_RPZ_TYPE_BAD:
+ return;
+ }
+ if (ISC_R_SUCCESS != name2ipkey(cidr, DNS_RPZ_ERROR_LEVEL, name,
+ type, &tgt_ip, &tgt_prefix))
+ return;
+
+ if (ISC_R_EXISTS == search(cidr, &tgt_ip, tgt_prefix, type,
+ ISC_TRUE, NULL) &&
+ isc_log_wouldlog(dns_lctx, DNS_RPZ_ERROR_LEVEL)) {
+ char printname[DNS_NAME_FORMATSIZE];
+
+ dns_name_format(name, printname, sizeof(printname));
+ isc_log_write(dns_lctx, DNS_LOGCATEGORY_DATABASE,
+ DNS_LOGMODULE_RBTDB, DNS_RPZ_ERROR_LEVEL,
+ "duplicate response policy name \"%s\"",
+ printname);
+ }
+}
+
+
+
+/*
+ * Delete an IP address from the radix tree of a response policy database.
+ * The tree write lock must be held by the caller.
+ */
+void
+dns_rpz_cidr_deleteip(dns_rpz_cidr_t *cidr, dns_name_t *name) {
+ dns_rpz_cidr_key_t tgt_ip;
+ dns_rpz_cidr_bits_t tgt_prefix;
+ dns_rpz_type_t type;
+ dns_rpz_cidr_node_t *tgt = NULL, *parent, *child;
+ dns_rpz_cidr_flags_t flags, data_flag;
+
+ if (cidr == NULL)
+ return;
+
+ /*
+ * Decide which kind of policy zone IP address it is, if either
+ * and then find its node.
+ */
+ type = set_type(cidr, name);
+ switch (type) {
+ case DNS_RPZ_TYPE_IP:
+ case DNS_RPZ_TYPE_NSIP:
+ break;
+ case DNS_RPZ_TYPE_NSDNAME:
+ /*
+ * We cannot easily count nsdnames because
+ * internal rbt nodes get deleted.
+ */
+ return;
+ case DNS_RPZ_TYPE_QNAME:
+ case DNS_RPZ_TYPE_BAD:
+ return;
+ }
+
+ /*
+ * Do not get excited about the deletion of interior rbt nodes.
+ */
+ if (ISC_R_SUCCESS != name2ipkey(cidr, DNS_RPZ_DEBUG_LEVEL2, name,
+ type, &tgt_ip, &tgt_prefix))
+ return;
+ if (ISC_R_SUCCESS != search(cidr, &tgt_ip, tgt_prefix, type,
+ ISC_FALSE, &tgt)) {
+ if (isc_log_wouldlog(dns_lctx, DNS_RPZ_ERROR_LEVEL)) {
+ char printname[DNS_NAME_FORMATSIZE];
+
+ dns_name_format(name, printname, sizeof(printname));
+ isc_log_write(dns_lctx, DNS_LOGCATEGORY_DATABASE,
+ DNS_LOGMODULE_RBTDB, DNS_RPZ_ERROR_LEVEL,
+ "missing response policy node \"%s\"",
+ printname);
+ }
+ return;
+ }
+
+ /*
+ * Mark the node and its parents to reflect the deleted IP address.
+ */
+ flags = get_flags(&tgt_ip, tgt_prefix, type);
+ data_flag = flags & (DNS_RPZ_CIDR_FG_IP_DATA |
+ DNS_RPZ_CIDR_FG_NSIP_DATA);
+ tgt->flags &= ~data_flag;
+ for (parent = tgt; parent != NULL; parent = parent->parent) {
+ if ((parent->flags & data_flag) != 0 ||
+ (parent->child[0] != NULL &&
+ (parent->child[0]->flags & flags) != 0) ||
+ (parent->child[1] != NULL &&
+ (parent->child[1]->flags & flags) != 0))
+ break;
+ parent->flags &= ~flags;
+ }
+
+ /*
+ * We might need to delete 2 nodes.
+ */
+ do {
+ /*
+ * The node is now useless if it has no data of its own
+ * and 0 or 1 children. We are finished if it is not useless.
+ */
+ if ((child = tgt->child[0]) != NULL) {
+ if (tgt->child[1] != NULL)
+ return;
+ } else {
+ child = tgt->child[1];
+ }
+ if ((tgt->flags & (DNS_RPZ_CIDR_FG_IP_DATA |
+ DNS_RPZ_CIDR_FG_NSIP_DATA)) != 0)
+ return;
+
+ /*
+ * Replace the pointer to this node in the parent with
+ * the remaining child or NULL.
+ */
+ parent = tgt->parent;
+ if (parent == NULL) {
+ cidr->root = child;
+ } else {
+ parent->child[parent->child[1] == tgt] = child;
+ }
+ /*
+ * If the child exists fix up its parent pointer.
+ */
+ if (child != NULL)
+ child->parent = parent;
+ isc_mem_put(cidr->mctx, tgt, sizeof(*tgt));
+
+ tgt = parent;
+ } while (tgt != NULL);
+}
+
+
+
+/*
+ * Caller must hold tree lock.
+ * Return ISC_R_NOTFOUND
+ * or ISC_R_SUCCESS and the found entry's canonical and search names
+ * and its prefix length
+ */
+isc_result_t
+dns_rpz_cidr_find(dns_rpz_cidr_t *cidr, const isc_netaddr_t *netaddr,
+ dns_rpz_type_t type, dns_name_t *canon_name,
+ dns_name_t *search_name, dns_rpz_cidr_bits_t *prefix)
+{
+ dns_rpz_cidr_key_t tgt_ip;
+ isc_result_t result;
+ dns_rpz_cidr_node_t *found;
+ int i;
+
+ /*
+ * Convert IP address to CIDR tree key.
+ */
+ if (netaddr->family == AF_INET) {
+ tgt_ip.w[0] = 0;
+ tgt_ip.w[1] = 0;
+ tgt_ip.w[2] = ADDR_V4MAPPED;
+ tgt_ip.w[3] = ntohl(netaddr->type.in.s_addr);
+ } else if (netaddr->family == AF_INET6) {
+ dns_rpz_cidr_key_t src_ip6;
+
+ /*
+ * Given the int aligned struct in_addr member of netaddr->type
+ * one could cast netaddr->type.in6 to dns_rpz_cidr_key_t *,
+ * but there are objections.
+ */
+ memcpy(src_ip6.w, &netaddr->type.in6, sizeof(src_ip6.w));
+ for (i = 0; i < 4; i++) {
+ tgt_ip.w[i] = ntohl(src_ip6.w[i]);
+ }
+ } else {
+ return (ISC_R_NOTFOUND);
+ }
+
+ result = search(cidr, &tgt_ip, 128, type, ISC_FALSE, &found);
+ if (result != ISC_R_SUCCESS && result != DNS_R_PARTIALMATCH)
+ return (result);
+
+ *prefix = found->bits;
+ return (ip2name(cidr, &found->ip, found->bits, type,
+ canon_name, search_name));
+}
+
+
+
+/*
+ * Translate CNAME rdata to a QNAME response policy action.
+ */
+dns_rpz_policy_t
+dns_rpz_decode_cname(dns_rdataset_t *rdataset, dns_name_t *selfname) {
+ dns_rdata_t rdata = DNS_RDATA_INIT;
+ dns_rdata_cname_t cname;
+ isc_result_t result;
+
+ result = dns_rdataset_first(rdataset);
+ RUNTIME_CHECK(result == ISC_R_SUCCESS);
+ dns_rdataset_current(rdataset, &rdata);
+ result = dns_rdata_tostruct(&rdata, &cname, NULL);
+ RUNTIME_CHECK(result == ISC_R_SUCCESS);
+ dns_rdata_reset(&rdata);
+
+ /*
+ * CNAME . means NXDOMAIN
+ */
+ if (dns_name_equal(&cname.cname, dns_rootname))
+ return (DNS_RPZ_POLICY_NXDOMAIN);
+
+ /*
+ * CNAME *. means NODATA
+ */
+ if (dns_name_countlabels(&cname.cname) == 2
+ && dns_name_iswildcard(&cname.cname))
+ return (DNS_RPZ_POLICY_NODATA);
+
+ /*
+ * 128.1.0.127.rpz-ip CNAME 128.1.0.0.127. means "do not rewrite"
+ */
+ if (selfname != NULL && dns_name_equal(&cname.cname, selfname))
+ return (DNS_RPZ_POLICY_NO_OP);
+
+ /*
+ * evil.com CNAME garden.net rewrites www.evil.com to www.garden.net.
+ */
+ return (DNS_RPZ_POLICY_RECORD);
+}
diff --git a/contrib/bind9/lib/dns/rriterator.c b/contrib/bind9/lib/dns/rriterator.c
new file mode 100644
index 0000000..31d67af
--- /dev/null
+++ b/contrib/bind9/lib/dns/rriterator.c
@@ -0,0 +1,202 @@
+/*
+ * Copyright (C) 2009 Internet Systems Consortium, Inc. ("ISC")
+ *
+ * Permission to use, copy, modify, and/or 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 ISC DISCLAIMS ALL WARRANTIES WITH
+ * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+ * AND FITNESS. IN NO EVENT SHALL ISC 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.
+ */
+
+/* $Id: rriterator.c,v 1.2 2009-06-30 02:52:32 each Exp $ */
+
+/*! \file */
+
+/***
+ *** Imports
+ ***/
+
+#include <config.h>
+
+#include <isc/string.h>
+#include <isc/util.h>
+
+#include <dns/db.h>
+#include <dns/dbiterator.h>
+#include <dns/rdata.h>
+#include <dns/rdataset.h>
+#include <dns/rdatasetiter.h>
+#include <dns/result.h>
+#include <dns/rriterator.h>
+
+/***
+ *** RRiterator methods
+ ***/
+
+isc_result_t
+dns_rriterator_init(dns_rriterator_t *it, dns_db_t *db, dns_dbversion_t *ver,
+ isc_stdtime_t now)
+{
+ isc_result_t result;
+ it->magic = RRITERATOR_MAGIC;
+ it->db = db;
+ it->dbit = NULL;
+ it->ver = ver;
+ it->now = now;
+ it->node = NULL;
+ result = dns_db_createiterator(it->db, 0, &it->dbit);
+ if (result != ISC_R_SUCCESS)
+ return (result);
+ it->rdatasetit = NULL;
+ dns_rdata_init(&it->rdata);
+ dns_rdataset_init(&it->rdataset);
+ dns_fixedname_init(&it->fixedname);
+ INSIST(! dns_rdataset_isassociated(&it->rdataset));
+ it->result = ISC_R_SUCCESS;
+ return (it->result);
+}
+
+isc_result_t
+dns_rriterator_first(dns_rriterator_t *it) {
+ REQUIRE(VALID_RRITERATOR(it));
+ /* Reset state */
+ if (dns_rdataset_isassociated(&it->rdataset))
+ dns_rdataset_disassociate(&it->rdataset);
+ if (it->rdatasetit != NULL)
+ dns_rdatasetiter_destroy(&it->rdatasetit);
+ if (it->node != NULL)
+ dns_db_detachnode(it->db, &it->node);
+ it->result = dns_dbiterator_first(it->dbit);
+
+ /*
+ * The top node may be empty when out of zone glue exists.
+ * Walk the tree to find the first node with data.
+ */
+ while (it->result == ISC_R_SUCCESS) {
+ it->result = dns_dbiterator_current(it->dbit, &it->node,
+ dns_fixedname_name(&it->fixedname));
+ if (it->result != ISC_R_SUCCESS)
+ return (it->result);
+
+ it->result = dns_db_allrdatasets(it->db, it->node, it->ver,
+ it->now, &it->rdatasetit);
+ if (it->result != ISC_R_SUCCESS)
+ return (it->result);
+
+ it->result = dns_rdatasetiter_first(it->rdatasetit);
+ if (it->result != ISC_R_SUCCESS) {
+ /*
+ * This node is empty. Try next node.
+ */
+ dns_rdatasetiter_destroy(&it->rdatasetit);
+ dns_db_detachnode(it->db, &it->node);
+ it->result = dns_dbiterator_next(it->dbit);
+ continue;
+ }
+ dns_rdatasetiter_current(it->rdatasetit, &it->rdataset);
+ it->rdataset.attributes |= DNS_RDATASETATTR_LOADORDER;
+ it->result = dns_rdataset_first(&it->rdataset);
+ return (it->result);
+ }
+ return (it->result);
+}
+
+isc_result_t
+dns_rriterator_nextrrset(dns_rriterator_t *it) {
+ REQUIRE(VALID_RRITERATOR(it));
+ if (dns_rdataset_isassociated(&it->rdataset))
+ dns_rdataset_disassociate(&it->rdataset);
+ it->result = dns_rdatasetiter_next(it->rdatasetit);
+ /*
+ * The while loop body is executed more than once
+ * only when an empty dbnode needs to be skipped.
+ */
+ while (it->result == ISC_R_NOMORE) {
+ dns_rdatasetiter_destroy(&it->rdatasetit);
+ dns_db_detachnode(it->db, &it->node);
+ it->result = dns_dbiterator_next(it->dbit);
+ if (it->result == ISC_R_NOMORE) {
+ /* We are at the end of the entire database. */
+ return (it->result);
+ }
+ if (it->result != ISC_R_SUCCESS)
+ return (it->result);
+ it->result = dns_dbiterator_current(it->dbit, &it->node,
+ dns_fixedname_name(&it->fixedname));
+ if (it->result != ISC_R_SUCCESS)
+ return (it->result);
+ it->result = dns_db_allrdatasets(it->db, it->node, it->ver,
+ it->now, &it->rdatasetit);
+ if (it->result != ISC_R_SUCCESS)
+ return (it->result);
+ it->result = dns_rdatasetiter_first(it->rdatasetit);
+ }
+ if (it->result != ISC_R_SUCCESS)
+ return (it->result);
+ dns_rdatasetiter_current(it->rdatasetit, &it->rdataset);
+ it->rdataset.attributes |= DNS_RDATASETATTR_LOADORDER;
+ it->result = dns_rdataset_first(&it->rdataset);
+ return (it->result);
+}
+
+isc_result_t
+dns_rriterator_next(dns_rriterator_t *it) {
+ REQUIRE(VALID_RRITERATOR(it));
+ if (it->result != ISC_R_SUCCESS)
+ return (it->result);
+
+ INSIST(it->dbit != NULL);
+ INSIST(it->node != NULL);
+ INSIST(it->rdatasetit != NULL);
+
+ it->result = dns_rdataset_next(&it->rdataset);
+ if (it->result == ISC_R_NOMORE)
+ return (dns_rriterator_nextrrset(it));
+ return (it->result);
+}
+
+void
+dns_rriterator_pause(dns_rriterator_t *it) {
+ REQUIRE(VALID_RRITERATOR(it));
+ RUNTIME_CHECK(dns_dbiterator_pause(it->dbit) == ISC_R_SUCCESS);
+}
+
+void
+dns_rriterator_destroy(dns_rriterator_t *it) {
+ REQUIRE(VALID_RRITERATOR(it));
+ if (dns_rdataset_isassociated(&it->rdataset))
+ dns_rdataset_disassociate(&it->rdataset);
+ if (it->rdatasetit != NULL)
+ dns_rdatasetiter_destroy(&it->rdatasetit);
+ if (it->node != NULL)
+ dns_db_detachnode(it->db, &it->node);
+ dns_dbiterator_destroy(&it->dbit);
+}
+
+void
+dns_rriterator_current(dns_rriterator_t *it, dns_name_t **name,
+ isc_uint32_t *ttl, dns_rdataset_t **rdataset,
+ dns_rdata_t **rdata)
+{
+ REQUIRE(name != NULL && *name == NULL);
+ REQUIRE(VALID_RRITERATOR(it));
+ REQUIRE(it->result == ISC_R_SUCCESS);
+
+ *name = dns_fixedname_name(&it->fixedname);
+ *ttl = it->rdataset.ttl;
+
+ dns_rdata_reset(&it->rdata);
+ dns_rdataset_current(&it->rdataset, &it->rdata);
+
+ if (rdataset)
+ *rdataset = &it->rdataset;
+
+ if (rdata)
+ *rdata = &it->rdata;
+}
diff --git a/contrib/bind9/lib/dns/sdb.c b/contrib/bind9/lib/dns/sdb.c
index 49c6430..d27007d 100644
--- a/contrib/bind9/lib/dns/sdb.c
+++ b/contrib/bind9/lib/dns/sdb.c
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004-2010 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004-2011 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 2000, 2001, 2003 Internet Software Consortium.
*
* Permission to use, copy, modify, and/or distribute this software for any
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: sdb.c,v 1.66.48.6 2010-08-16 05:21:42 marka Exp $ */
+/* $Id: sdb.c,v 1.76 2011-01-13 04:59:25 tbox Exp $ */
/*! \file */
@@ -450,7 +450,7 @@ getnode(dns_sdballnodes_t *allnodes, const char *name, dns_sdbnode_t **nodep) {
isc_buffer_init(&b, name, strlen(name));
isc_buffer_add(&b, strlen(name));
- result = dns_name_fromtext(newname, &b, origin, ISC_FALSE, NULL);
+ result = dns_name_fromtext(newname, &b, origin, 0, NULL);
if (result != ISC_R_SUCCESS)
return (result);
@@ -1253,6 +1253,8 @@ static dns_dbmethods_t sdb_methods = {
NULL,
NULL,
NULL,
+ NULL,
+ NULL,
NULL
};
diff --git a/contrib/bind9/lib/dns/sdlz.c b/contrib/bind9/lib/dns/sdlz.c
index 6be315a..e684e1d 100644
--- a/contrib/bind9/lib/dns/sdlz.c
+++ b/contrib/bind9/lib/dns/sdlz.c
@@ -1,5 +1,5 @@
/*
- * Portions Copyright (C) 2005-2010 Internet Systems Consortium, Inc. ("ISC")
+ * Portions Copyright (C) 2005-2011 Internet Systems Consortium, Inc. ("ISC")
* Portions Copyright (C) 1999-2001 Internet Software Consortium.
*
* Permission to use, copy, modify, and/or distribute this software for any
@@ -50,7 +50,7 @@
* USE OR PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: sdlz.c,v 1.18.50.6 2010-08-16 05:21:42 marka Exp $ */
+/* $Id: sdlz.c,v 1.31 2011-01-13 06:29:16 marka Exp $ */
/*! \file */
@@ -108,6 +108,8 @@ struct dns_sdlz_db {
isc_mutex_t refcnt_lock;
/* Locked */
unsigned int references;
+ dns_dbversion_t *future_version;
+ int dummy_version;
};
struct dns_sdlzlookup {
@@ -164,8 +166,6 @@ typedef struct sdlz_rdatasetiter {
/* This is a reasonable value */
#define SDLZ_DEFAULT_TTL (60 * 60 * 24)
-static int dummy;
-
#ifdef __COVERITY__
#define MAYBE_LOCK(imp) LOCK(&imp->driverlock)
#define MAYBE_UNLOCK(imp) UNLOCK(&imp->driverlock)
@@ -225,11 +225,22 @@ static dns_dbiteratormethods_t dbiterator_methods = {
* Utility functions
*/
-/*% Converts the input string to lowercase, in place. */
+/*
+ * Log a message at the given level
+ */
+static void
+sdlz_log(int level, const char *fmt, ...) {
+ va_list ap;
+ va_start(ap, fmt);
+ isc_log_vwrite(dns_lctx, DNS_LOGCATEGORY_DATABASE,
+ DNS_LOGMODULE_DLZ, ISC_LOG_DEBUG(level),
+ fmt, ap);
+ va_end(ap);
+}
+/*% Converts the input string to lowercase, in place. */
static void
dns_sdlz_tolower(char *str) {
-
unsigned int len = strlen(str);
unsigned int i;
@@ -237,7 +248,6 @@ dns_sdlz_tolower(char *str) {
if (str[i] >= 'A' && str[i] <= 'Z')
str[i] += 32;
}
-
}
static inline unsigned int
@@ -381,43 +391,79 @@ dump(dns_db_t *db, dns_dbversion_t *version, const char *filename,
static void
currentversion(dns_db_t *db, dns_dbversion_t **versionp) {
+ dns_sdlz_db_t *sdlz = (dns_sdlz_db_t *)db;
+ REQUIRE(VALID_SDLZDB(sdlz));
REQUIRE(versionp != NULL && *versionp == NULL);
- UNUSED(db);
-
- *versionp = (void *) &dummy;
+ *versionp = (void *) &sdlz->dummy_version;
return;
}
static isc_result_t
newversion(dns_db_t *db, dns_dbversion_t **versionp) {
- UNUSED(db);
- UNUSED(versionp);
+ dns_sdlz_db_t *sdlz = (dns_sdlz_db_t *)db;
+ char origin[DNS_NAME_MAXTEXT + 1];
+ isc_result_t result;
- return (ISC_R_NOTIMPLEMENTED);
+ REQUIRE(VALID_SDLZDB(sdlz));
+
+ if (sdlz->dlzimp->methods->newversion == NULL)
+ return (ISC_R_NOTIMPLEMENTED);
+
+ dns_name_format(&sdlz->common.origin, origin, sizeof(origin));
+
+ result = sdlz->dlzimp->methods->newversion(origin,
+ sdlz->dlzimp->driverarg,
+ sdlz->dbdata, versionp);
+ if (result != ISC_R_SUCCESS) {
+ sdlz_log(ISC_LOG_ERROR,
+ "sdlz newversion on origin %s failed : %s",
+ origin, isc_result_totext(result));
+ return (result);
+ }
+
+ sdlz->future_version = *versionp;
+ return (ISC_R_SUCCESS);
}
static void
attachversion(dns_db_t *db, dns_dbversion_t *source,
dns_dbversion_t **targetp)
{
- REQUIRE(source != NULL && source == (void *) &dummy);
+ dns_sdlz_db_t *sdlz = (dns_sdlz_db_t *)db;
+
+ REQUIRE(VALID_SDLZDB(sdlz));
+ REQUIRE(source != NULL && source == (void *)&sdlz->dummy_version);
- UNUSED(db);
- UNUSED(source);
- UNUSED(targetp);
*targetp = source;
}
static void
closeversion(dns_db_t *db, dns_dbversion_t **versionp, isc_boolean_t commit) {
- REQUIRE(versionp != NULL && *versionp == (void *) &dummy);
- REQUIRE(commit == ISC_FALSE);
+ dns_sdlz_db_t *sdlz = (dns_sdlz_db_t *)db;
+ char origin[DNS_NAME_MAXTEXT + 1];
- UNUSED(db);
- UNUSED(commit);
+ REQUIRE(VALID_SDLZDB(sdlz));
+ REQUIRE(versionp != NULL);
+
+ if (*versionp == (void *)&sdlz->dummy_version) {
+ *versionp = NULL;
+ return;
+ }
+
+ REQUIRE(*versionp == sdlz->future_version);
+ REQUIRE(sdlz->dlzimp->methods->closeversion != NULL);
+
+ dns_name_format(&sdlz->common.origin, origin, sizeof(origin));
- *versionp = NULL;
+ sdlz->dlzimp->methods->closeversion(origin, commit,
+ sdlz->dlzimp->driverarg,
+ sdlz->dbdata, versionp);
+ if (*versionp != NULL)
+ sdlz_log(ISC_LOG_ERROR,
+ "sdlz closeversion on origin %s failed", origin);
+
+ sdlz->future_version = NULL;
}
static isc_result_t
@@ -506,11 +552,11 @@ findnode(dns_db_t *db, dns_name_t *name, isc_boolean_t create,
dns_sdlzauthorityfunc_t authority;
REQUIRE(VALID_SDLZDB(sdlz));
- REQUIRE(create == ISC_FALSE);
REQUIRE(nodep != NULL && *nodep == NULL);
- UNUSED(name);
- UNUSED(create);
+ if (sdlz->dlzimp->methods->newversion == NULL) {
+ REQUIRE(create == ISC_FALSE);
+ }
isc_buffer_init(&b, namestr, sizeof(namestr));
if ((sdlz->dlzimp->flags & DNS_SDLZFLAG_RELATIVEOWNER) != 0) {
@@ -558,7 +604,7 @@ findnode(dns_db_t *db, dns_name_t *name, isc_boolean_t create,
* if the host (namestr) was not found, try to lookup a
* "wildcard" host.
*/
- if (result != ISC_R_SUCCESS) {
+ if (result != ISC_R_SUCCESS && !create) {
result = sdlz->dlzimp->methods->lookup(zonestr, "*",
sdlz->dlzimp->driverarg,
sdlz->dbdata, node);
@@ -566,7 +612,7 @@ findnode(dns_db_t *db, dns_name_t *name, isc_boolean_t create,
MAYBE_UNLOCK(sdlz->dlzimp);
- if (result != ISC_R_SUCCESS && !isorigin) {
+ if (result != ISC_R_SUCCESS && !isorigin && !create) {
destroynode(node);
return (result);
}
@@ -584,6 +630,23 @@ findnode(dns_db_t *db, dns_name_t *name, isc_boolean_t create,
}
}
+ if (node->name == NULL) {
+ node->name = isc_mem_get(sdlz->common.mctx,
+ sizeof(dns_name_t));
+ if (node->name == NULL) {
+ destroynode(node);
+ return (ISC_R_NOMEMORY);
+ }
+ dns_name_init(node->name, NULL);
+ result = dns_name_dup(name, sdlz->common.mctx, node->name);
+ if (result != ISC_R_SUCCESS) {
+ isc_mem_put(sdlz->common.mctx, node->name,
+ sizeof(dns_name_t));
+ destroynode(node);
+ return (result);
+ }
+ }
+
*nodep = node;
return (ISC_R_SUCCESS);
}
@@ -778,7 +841,7 @@ find(dns_db_t *db, dns_name_t *name, dns_dbversion_t *version,
REQUIRE(VALID_SDLZDB(sdlz));
REQUIRE(nodep == NULL || *nodep == NULL);
- REQUIRE(version == NULL || version == (void *) &dummy);
+ REQUIRE(version == NULL || version == (void*)&sdlz->dummy_version);
UNUSED(options);
UNUSED(sdlz);
@@ -920,9 +983,14 @@ static isc_result_t
allrdatasets(dns_db_t *db, dns_dbnode_t *node, dns_dbversion_t *version,
isc_stdtime_t now, dns_rdatasetiter_t **iteratorp)
{
+ dns_sdlz_db_t *sdlz = (dns_sdlz_db_t *) db;
sdlz_rdatasetiter_t *iterator;
- REQUIRE(version == NULL || version == &dummy);
+ REQUIRE(VALID_SDLZDB(sdlz));
+
+ REQUIRE(version == NULL ||
+ version == (void*)&sdlz->dummy_version ||
+ version == sdlz->future_version);
UNUSED(version);
UNUSED(now);
@@ -945,47 +1013,139 @@ allrdatasets(dns_db_t *db, dns_dbnode_t *node, dns_dbversion_t *version,
}
static isc_result_t
+modrdataset(dns_db_t *db, dns_dbnode_t *node, dns_dbversion_t *version,
+ dns_rdataset_t *rdataset, unsigned int options,
+ dns_sdlzmodrdataset_t mod_function)
+{
+ dns_sdlz_db_t *sdlz = (dns_sdlz_db_t *)db;
+ dns_master_style_t *style = NULL;
+ isc_result_t result;
+ isc_buffer_t *buffer = NULL;
+ isc_mem_t *mctx;
+ dns_sdlznode_t *sdlznode;
+ char *rdatastr = NULL;
+ char name[DNS_NAME_MAXTEXT + 1];
+
+ REQUIRE(VALID_SDLZDB(sdlz));
+
+ if (mod_function == NULL)
+ return (ISC_R_NOTIMPLEMENTED);
+
+ sdlznode = (dns_sdlznode_t *)node;
+
+ UNUSED(options);
+
+ dns_name_format(sdlznode->name, name, sizeof(name));
+
+ mctx = sdlz->common.mctx;
+
+ result = isc_buffer_allocate(mctx, &buffer, 1024);
+ if (result != ISC_R_SUCCESS)
+ return (result);
+
+ result = dns_master_stylecreate(&style, 0, 0, 0, 0, 0, 0, 1, mctx);
+ if (result != ISC_R_SUCCESS)
+ goto cleanup;
+
+ result = dns_master_rdatasettotext(sdlznode->name, rdataset,
+ style, buffer);
+ if (result != ISC_R_SUCCESS)
+ goto cleanup;
+
+ if (isc_buffer_usedlength(buffer) < 1) {
+ result = ISC_R_BADADDRESSFORM;
+ goto cleanup;
+ }
+
+ rdatastr = isc_buffer_base(buffer);
+ if (rdatastr == NULL) {
+ result = ISC_R_NOMEMORY;
+ goto cleanup;
+ }
+ rdatastr[isc_buffer_usedlength(buffer) - 1] = 0;
+
+ MAYBE_LOCK(sdlz->dlzimp);
+ result = mod_function(name, rdatastr, sdlz->dlzimp->driverarg,
+ sdlz->dbdata, version);
+ MAYBE_UNLOCK(sdlz->dlzimp);
+
+cleanup:
+ isc_buffer_free(&buffer);
+ if (style != NULL)
+ dns_master_styledestroy(&style, mctx);
+
+ return (result);
+}
+
+static isc_result_t
addrdataset(dns_db_t *db, dns_dbnode_t *node, dns_dbversion_t *version,
isc_stdtime_t now, dns_rdataset_t *rdataset, unsigned int options,
dns_rdataset_t *addedrdataset)
{
- UNUSED(db);
- UNUSED(node);
- UNUSED(version);
+ dns_sdlz_db_t *sdlz = (dns_sdlz_db_t *)db;
+ isc_result_t result;
+
UNUSED(now);
- UNUSED(rdataset);
- UNUSED(options);
UNUSED(addedrdataset);
+ REQUIRE(VALID_SDLZDB(sdlz));
- return (ISC_R_NOTIMPLEMENTED);
+ if (sdlz->dlzimp->methods->addrdataset == NULL)
+ return (ISC_R_NOTIMPLEMENTED);
+
+ result = modrdataset(db, node, version, rdataset, options,
+ sdlz->dlzimp->methods->addrdataset);
+ return (result);
}
+
static isc_result_t
subtractrdataset(dns_db_t *db, dns_dbnode_t *node, dns_dbversion_t *version,
dns_rdataset_t *rdataset, unsigned int options,
dns_rdataset_t *newrdataset)
{
- UNUSED(db);
- UNUSED(node);
- UNUSED(version);
- UNUSED(rdataset);
- UNUSED(options);
+ dns_sdlz_db_t *sdlz = (dns_sdlz_db_t *)db;
+ isc_result_t result;
+
UNUSED(newrdataset);
+ REQUIRE(VALID_SDLZDB(sdlz));
- return (ISC_R_NOTIMPLEMENTED);
+ if (sdlz->dlzimp->methods->subtractrdataset == NULL) {
+ return (ISC_R_NOTIMPLEMENTED);
+ }
+
+ result = modrdataset(db, node, version, rdataset, options,
+ sdlz->dlzimp->methods->subtractrdataset);
+ return (result);
}
static isc_result_t
deleterdataset(dns_db_t *db, dns_dbnode_t *node, dns_dbversion_t *version,
dns_rdatatype_t type, dns_rdatatype_t covers)
{
- UNUSED(db);
- UNUSED(node);
- UNUSED(version);
- UNUSED(type);
+ dns_sdlz_db_t *sdlz = (dns_sdlz_db_t *)db;
+ char name[DNS_NAME_MAXTEXT + 1];
+ char b_type[DNS_RDATATYPE_FORMATSIZE];
+ dns_sdlznode_t *sdlznode;
+ isc_result_t result;
+
UNUSED(covers);
- return (ISC_R_NOTIMPLEMENTED);
+ REQUIRE(VALID_SDLZDB(sdlz));
+
+ if (sdlz->dlzimp->methods->delrdataset == NULL)
+ return (ISC_R_NOTIMPLEMENTED);
+
+ sdlznode = (dns_sdlznode_t *)node;
+ dns_name_format(sdlznode->name, name, sizeof(name));
+ dns_rdatatype_format(type, b_type, sizeof(b_type));
+
+ MAYBE_LOCK(sdlz->dlzimp);
+ result = sdlz->dlzimp->methods->delrdataset(name, b_type,
+ sdlz->dlzimp->driverarg,
+ sdlz->dbdata, version);
+ MAYBE_UNLOCK(sdlz->dlzimp);
+
+ return (result);
}
static isc_boolean_t
@@ -1021,6 +1181,26 @@ settask(dns_db_t *db, isc_task_t *task) {
}
+/*
+ * getoriginnode() is used by the update code to find the
+ * dns_rdatatype_dnskey record for a zone
+ */
+static isc_result_t
+getoriginnode(dns_db_t *db, dns_dbnode_t **nodep) {
+ dns_sdlz_db_t *sdlz = (dns_sdlz_db_t *)db;
+ isc_result_t result;
+
+ REQUIRE(VALID_SDLZDB(sdlz));
+ if (sdlz->dlzimp->methods->newversion == NULL)
+ return (ISC_R_NOTIMPLEMENTED);
+
+ result = findnode(db, &sdlz->common.origin, ISC_FALSE, nodep);
+ if (result != ISC_R_SUCCESS)
+ sdlz_log(ISC_LOG_ERROR, "sdlz getoriginnode failed : %s",
+ isc_result_totext(result));
+ return (result);
+}
+
static dns_dbmethods_t sdlzdb_methods = {
attach,
detach,
@@ -1049,6 +1229,8 @@ static dns_dbmethods_t sdlzdb_methods = {
ispersistent,
overmem,
settask,
+ getoriginnode,
+ NULL,
NULL,
NULL,
NULL,
@@ -1371,9 +1553,7 @@ dns_sdlzcreate(isc_mem_t *mctx, const char *dlzname, unsigned int argc,
isc_result_t result = ISC_R_NOTFOUND;
/* Write debugging message to log */
- isc_log_write(dns_lctx, DNS_LOGCATEGORY_DATABASE,
- DNS_LOGMODULE_DLZ, ISC_LOG_DEBUG(2),
- "Loading SDLZ driver.");
+ sdlz_log(ISC_LOG_DEBUG(2), "Loading SDLZ driver.");
/*
* Performs checks to make sure data is as we expect it to be.
@@ -1395,13 +1575,9 @@ dns_sdlzcreate(isc_mem_t *mctx, const char *dlzname, unsigned int argc,
/* Write debugging message to log */
if (result == ISC_R_SUCCESS) {
- isc_log_write(dns_lctx, DNS_LOGCATEGORY_DATABASE,
- DNS_LOGMODULE_DLZ, ISC_LOG_DEBUG(2),
- "SDLZ driver loaded successfully.");
+ sdlz_log(ISC_LOG_DEBUG(2), "SDLZ driver loaded successfully.");
} else {
- isc_log_write(dns_lctx, DNS_LOGCATEGORY_DATABASE,
- DNS_LOGMODULE_DLZ, ISC_LOG_ERROR,
- "SDLZ driver failed to load.");
+ sdlz_log(ISC_LOG_ERROR, "SDLZ driver failed to load.");
}
return (result);
@@ -1414,9 +1590,7 @@ dns_sdlzdestroy(void *driverdata, void **dbdata)
dns_sdlzimplementation_t *imp;
/* Write debugging message to log */
- isc_log_write(dns_lctx, DNS_LOGCATEGORY_DATABASE,
- DNS_LOGMODULE_DLZ, ISC_LOG_DEBUG(2),
- "Unloading SDLZ driver.");
+ sdlz_log(ISC_LOG_DEBUG(2), "Unloading SDLZ driver.");
imp = driverdata;
@@ -1472,11 +1646,97 @@ dns_sdlzfindzone(void *driverarg, void *dbdata, isc_mem_t *mctx,
return (result);
}
+
+static isc_result_t
+dns_sdlzconfigure(void *driverarg, void *dbdata, dns_view_t *view)
+{
+ isc_result_t result;
+ dns_sdlzimplementation_t *imp;
+
+ REQUIRE(driverarg != NULL);
+
+ imp = (dns_sdlzimplementation_t *) driverarg;
+
+ /* Call SDLZ driver's configure method */
+ if (imp->methods->configure != NULL) {
+ MAYBE_LOCK(imp);
+ result = imp->methods->configure(view, imp->driverarg, dbdata);
+ MAYBE_UNLOCK(imp);
+ } else {
+ result = ISC_R_SUCCESS;
+ }
+
+ return (result);
+}
+
+static isc_boolean_t
+dns_sdlzssumatch(dns_name_t *signer, dns_name_t *name, isc_netaddr_t *tcpaddr,
+ dns_rdatatype_t type, const dst_key_t *key, void *driverarg,
+ void *dbdata)
+{
+ dns_sdlzimplementation_t *imp;
+ char b_signer[DNS_NAME_FORMATSIZE];
+ char b_name[DNS_NAME_FORMATSIZE];
+ char b_addr[ISC_NETADDR_FORMATSIZE];
+ char b_type[DNS_RDATATYPE_FORMATSIZE];
+ char b_key[DST_KEY_FORMATSIZE];
+ isc_buffer_t *tkey_token;
+ isc_region_t token_region;
+ isc_uint32_t token_len = 0;
+ isc_boolean_t ret;
+
+ REQUIRE(driverarg != NULL);
+
+ imp = (dns_sdlzimplementation_t *) driverarg;
+ if (imp->methods->ssumatch == NULL)
+ return (ISC_FALSE);
+
+ /*
+ * Format the request elements. sdlz operates on strings, not
+ * structures
+ */
+ if (signer)
+ dns_name_format(signer, b_signer, sizeof(b_signer));
+ else
+ b_signer[0] = 0;
+
+ dns_name_format(name, b_name, sizeof(b_name));
+
+ if (tcpaddr)
+ isc_netaddr_format(tcpaddr, b_addr, sizeof(b_addr));
+ else
+ b_addr[0] = 0;
+
+ dns_rdatatype_format(type, b_type, sizeof(b_type));
+
+ if (key)
+ dst_key_format(key, b_key, sizeof(b_key));
+ else
+ b_key[0] = 0;
+
+ tkey_token = dst_key_tkeytoken(key);
+
+ if (tkey_token) {
+ isc_buffer_region(tkey_token, &token_region);
+ token_len = token_region.length;
+ }
+
+ MAYBE_LOCK(imp);
+ ret = imp->methods->ssumatch(b_signer, b_name, b_addr, b_type, b_key,
+ token_len,
+ token_len ? token_region.base : NULL,
+ imp->driverarg, dbdata);
+ MAYBE_UNLOCK(imp);
+ return (ret);
+}
+
static dns_dlzmethods_t sdlzmethods = {
dns_sdlzcreate,
dns_sdlzdestroy,
dns_sdlzfindzone,
- dns_sdlzallowzonexfr
+ dns_sdlzallowzonexfr,
+ dns_sdlzconfigure,
+ dns_sdlzssumatch
};
/*
@@ -1530,8 +1790,16 @@ dns_sdlz_putrr(dns_sdlzlookup_t *lookup, const char *type, dns_ttl_t ttl,
ISC_LINK_INIT(rdatalist, link);
ISC_LIST_APPEND(lookup->lists, rdatalist, link);
} else
- if (rdatalist->ttl != ttl)
- return (DNS_R_BADTTL);
+ if (rdatalist->ttl > ttl) {
+ /*
+ * BIND9 doesn't enforce all RRs in an RRset
+ * having the same TTL, as per RFC 2136,
+ * section 7.12. If a DLZ backend has
+ * different TTLs, then the best
+ * we can do is return the lowest.
+ */
+ rdatalist->ttl = ttl;
+ }
rdata = isc_mem_get(mctx, sizeof(dns_rdata_t));
if (rdata == NULL)
@@ -1615,7 +1883,7 @@ dns_sdlz_putnamedrr(dns_sdlzallnodes_t *allnodes, const char *name,
isc_buffer_init(&b, name, strlen(name));
isc_buffer_add(&b, strlen(name));
- result = dns_name_fromtext(newname, &b, origin, ISC_FALSE, NULL);
+ result = dns_name_fromtext(newname, &b, origin, 0, NULL);
if (result != ISC_R_SUCCESS)
return (result);
@@ -1694,9 +1962,7 @@ dns_sdlzregister(const char *drivername, const dns_sdlzmethods_t *methods,
DNS_SDLZFLAG_THREADSAFE)) == 0);
/* Write debugging message to log */
- isc_log_write(dns_lctx, DNS_LOGCATEGORY_DATABASE,
- DNS_LOGMODULE_DLZ, ISC_LOG_DEBUG(2),
- "Registering SDLZ driver '%s'", drivername);
+ sdlz_log(ISC_LOG_DEBUG(2), "Registering SDLZ driver '%s'", drivername);
/*
* Allocate memory for a sdlz_implementation object. Error if
@@ -1769,9 +2035,7 @@ dns_sdlzunregister(dns_sdlzimplementation_t **sdlzimp) {
isc_mem_t *mctx;
/* Write debugging message to log */
- isc_log_write(dns_lctx, DNS_LOGCATEGORY_DATABASE,
- DNS_LOGMODULE_DLZ, ISC_LOG_DEBUG(2),
- "Unregistering SDLZ driver.");
+ sdlz_log(ISC_LOG_DEBUG(2), "Unregistering SDLZ driver.");
/*
* Performs checks to make sure data is as we expect it to be.
@@ -1797,3 +2061,16 @@ dns_sdlzunregister(dns_sdlzimplementation_t **sdlzimp) {
*sdlzimp = NULL;
}
+
+
+isc_result_t
+dns_sdlz_setdb(dns_dlzdb_t *dlzdatabase, dns_rdataclass_t rdclass,
+ dns_name_t *name, dns_db_t **dbp)
+{
+ isc_result_t result;
+
+ result = dns_sdlzcreateDBP(dlzdatabase->mctx,
+ dlzdatabase->implementation->driverarg,
+ dlzdatabase->dbdata, name, rdclass, dbp);
+ return (result);
+}
diff --git a/contrib/bind9/lib/dns/soa.c b/contrib/bind9/lib/dns/soa.c
index f338586..bd0d185 100644
--- a/contrib/bind9/lib/dns/soa.c
+++ b/contrib/bind9/lib/dns/soa.c
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004, 2005, 2007 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004, 2005, 2007, 2009 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 2000, 2001 Internet Software Consortium.
*
* Permission to use, copy, modify, and/or distribute this software for any
@@ -15,15 +15,18 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: soa.c,v 1.8 2007-06-19 23:47:16 tbox Exp $ */
+/* $Id: soa.c,v 1.12 2009-09-10 02:18:40 each Exp $ */
/*! \file */
#include <config.h>
+#include <string.h>
+#include <isc/buffer.h>
#include <isc/util.h>
#include <dns/rdata.h>
+#include <dns/rdatastruct.h>
#include <dns/soa.h>
static inline isc_uint32_t
@@ -60,6 +63,39 @@ soa_get(dns_rdata_t *rdata, int offset) {
return (decode_uint32(rdata->data + rdata->length - 20 + offset));
}
+isc_result_t
+dns_soa_buildrdata(dns_name_t *origin, dns_name_t *contact,
+ dns_rdataclass_t rdclass,
+ isc_uint32_t serial, isc_uint32_t refresh,
+ isc_uint32_t retry, isc_uint32_t expire,
+ isc_uint32_t minimum, unsigned char *buffer,
+ dns_rdata_t *rdata) {
+ dns_rdata_soa_t soa;
+ isc_buffer_t rdatabuf;
+
+ REQUIRE(origin != NULL);
+ REQUIRE(contact != NULL);
+
+ memset(buffer, 0, DNS_SOA_BUFFERSIZE);
+ isc_buffer_init(&rdatabuf, buffer, DNS_SOA_BUFFERSIZE);
+
+ soa.common.rdtype = dns_rdatatype_soa;
+ soa.common.rdclass = rdclass;
+ soa.mctx = NULL;
+ soa.serial = serial;
+ soa.refresh = refresh;
+ soa.retry = retry;
+ soa.expire = expire;
+ soa.minimum = minimum;
+ dns_name_init(&soa.origin, NULL);
+ dns_name_clone(origin, &soa.origin);
+ dns_name_init(&soa.contact, NULL);
+ dns_name_clone(contact, &soa.contact);
+
+ return (dns_rdata_fromstruct(rdata, rdclass, dns_rdatatype_soa,
+ &soa, &rdatabuf));
+}
+
isc_uint32_t
dns_soa_getserial(dns_rdata_t *rdata) {
return soa_get(rdata, 0);
diff --git a/contrib/bind9/lib/dns/spnego.c b/contrib/bind9/lib/dns/spnego.c
index ad15331..5ad492c 100644
--- a/contrib/bind9/lib/dns/spnego.c
+++ b/contrib/bind9/lib/dns/spnego.c
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2006-2009 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2006-2011 Internet Systems Consortium, Inc. ("ISC")
*
* Permission to use, copy, modify, and/or distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
@@ -14,7 +14,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: spnego.c,v 1.8.118.4 2009-07-21 07:27:13 marka Exp $ */
+/* $Id: spnego.c,v 1.16 2011-01-11 23:47:13 tbox Exp $ */
/*! \file
* \brief
@@ -172,6 +172,8 @@
/* asn1_err.h */
/* Generated from ../../../lib/asn1/asn1_err.et */
+#ifndef ERROR_TABLE_BASE_asn1
+/* these may be brought in already via gssapi_krb5.h */
typedef enum asn1_error_number {
ASN1_BAD_TIMEFORMAT = 1859794432,
ASN1_MISSING_FIELD = 1859794433,
@@ -186,6 +188,7 @@ typedef enum asn1_error_number {
} asn1_error_number;
#define ERROR_TABLE_BASE_asn1 1859794432
+#endif
#define __asn1_common_definitions__
@@ -409,7 +412,7 @@ code_NegTokenArg(OM_uint32 * minor_status,
{
OM_uint32 ret;
u_char *buf;
- size_t buf_size, buf_len;
+ size_t buf_size, buf_len = 0;
buf_size = 1024;
buf = malloc(buf_size);
diff --git a/contrib/bind9/lib/dns/ssu.c b/contrib/bind9/lib/dns/ssu.c
index 128071c..eb13551 100644
--- a/contrib/bind9/lib/dns/ssu.c
+++ b/contrib/bind9/lib/dns/ssu.c
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004-2008 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004-2008, 2010, 2011 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 2000, 2001, 2003 Internet Software Consortium.
*
* Permission to use, copy, modify, and/or distribute this software for any
@@ -17,7 +17,7 @@
/*! \file */
/*
- * $Id: ssu.c,v 1.34 2008-01-18 23:46:58 tbox Exp $
+ * $Id: ssu.c,v 1.38 2011-01-06 23:47:00 tbox Exp $
* Principal Author: Brian Wellington
*/
@@ -30,11 +30,13 @@
#include <isc/string.h>
#include <isc/util.h>
+#include <dns/dlz.h>
#include <dns/fixedname.h>
#include <dns/name.h>
#include <dns/ssu.h>
#include <dst/gssapi.h>
+#include <dst/dst.h>
#define SSUTABLEMAGIC ISC_MAGIC('S', 'S', 'U', 'T')
#define VALID_SSUTABLE(table) ISC_MAGIC_VALID(table, SSUTABLEMAGIC)
@@ -59,6 +61,7 @@ struct dns_ssutable {
isc_mem_t *mctx;
unsigned int references;
isc_mutex_t lock;
+ dns_dlzdb_t *dlzdatabase;
ISC_LIST(dns_ssurule_t) rules;
};
@@ -345,7 +348,8 @@ stf_from_address(dns_name_t *stfself, isc_netaddr_t *tcpaddr) {
isc_boolean_t
dns_ssutable_checkrules(dns_ssutable_t *table, dns_name_t *signer,
dns_name_t *name, isc_netaddr_t *tcpaddr,
- dns_rdatatype_t type)
+ dns_rdatatype_t type,
+ const dst_key_t *key)
{
dns_ssurule_t *rule;
unsigned int i;
@@ -483,10 +487,27 @@ dns_ssutable_checkrules(dns_ssutable_t *table, dns_name_t *signer,
if (!dns_name_equal(stfself, name))
continue;
break;
+ case DNS_SSUMATCHTYPE_EXTERNAL:
+ if (!dns_ssu_external_match(rule->identity, signer,
+ name, tcpaddr, type, key,
+ table->mctx))
+ continue;
+ break;
+ case DNS_SSUMATCHTYPE_DLZ:
+ if (!dns_dlz_ssumatch(table->dlzdatabase, signer,
+ name, tcpaddr, type, key))
+ continue;
+ break;
}
if (rule->ntypes == 0) {
- if (!isusertype(type))
+ /*
+ * If this is a DLZ rule, then the DLZ ssu
+ * checks will have already checked
+ * the type.
+ */
+ if (rule->matchtype != DNS_SSUMATCHTYPE_DLZ &&
+ !isusertype(type))
continue;
} else {
for (i = 0; i < rule->ntypes; i++) {
@@ -550,3 +571,42 @@ dns_ssutable_nextrule(dns_ssurule_t *rule, dns_ssurule_t **nextrule) {
*nextrule = ISC_LIST_NEXT(rule, link);
return (*nextrule != NULL ? ISC_R_SUCCESS : ISC_R_NOMORE);
}
+
+/*
+ * Create a specialised SSU table that points at an external DLZ database
+ */
+isc_result_t
+dns_ssutable_createdlz(isc_mem_t *mctx, dns_ssutable_t **tablep,
+ dns_dlzdb_t *dlzdatabase)
+{
+ isc_result_t result;
+ dns_ssurule_t *rule;
+ dns_ssutable_t *table = NULL;
+
+ REQUIRE(tablep != NULL && *tablep == NULL);
+
+ result = dns_ssutable_create(mctx, &table);
+ if (result != ISC_R_SUCCESS)
+ return (result);
+
+ table->dlzdatabase = dlzdatabase;
+
+ rule = isc_mem_get(table->mctx, sizeof(dns_ssurule_t));
+ if (rule == NULL) {
+ dns_ssutable_detach(&table);
+ return (ISC_R_NOMEMORY);
+ }
+
+ rule->identity = NULL;
+ rule->name = NULL;
+ rule->types = NULL;
+ rule->grant = ISC_TRUE;
+ rule->matchtype = DNS_SSUMATCHTYPE_DLZ;
+ rule->ntypes = 0;
+ rule->types = NULL;
+ rule->magic = SSURULEMAGIC;
+
+ ISC_LIST_INITANDAPPEND(table->rules, rule, link);
+ *tablep = table;
+ return (ISC_R_SUCCESS);
+}
diff --git a/contrib/bind9/lib/dns/ssu_external.c b/contrib/bind9/lib/dns/ssu_external.c
new file mode 100644
index 0000000..ac72a1f
--- /dev/null
+++ b/contrib/bind9/lib/dns/ssu_external.c
@@ -0,0 +1,265 @@
+/*
+ * Copyright (C) 2011 Internet Systems Consortium, Inc. ("ISC")
+ *
+ * Permission to use, copy, modify, and/or 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 ISC DISCLAIMS ALL WARRANTIES WITH
+ * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+ * AND FITNESS. IN NO EVENT SHALL ISC 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.
+ */
+
+/* $Id: ssu_external.c,v 1.7 2011-01-13 07:05:57 marka Exp $ */
+
+/*
+ * This implements external update-policy rules. This allows permission
+ * to update a zone to be checked by consulting an external daemon (e.g.,
+ * kerberos).
+ */
+
+#include <config.h>
+#include <errno.h>
+#include <unistd.h>
+
+#ifdef ISC_PLATFORM_HAVESYSUNH
+#include <sys/socket.h>
+#include <sys/un.h>
+#endif
+
+#include <isc/magic.h>
+#include <isc/mem.h>
+#include <isc/netaddr.h>
+#include <isc/result.h>
+#include <isc/string.h>
+#include <isc/util.h>
+#include <isc/strerror.h>
+
+#include <dns/fixedname.h>
+#include <dns/name.h>
+#include <dns/ssu.h>
+#include <dns/log.h>
+#include <dns/rdatatype.h>
+
+#include <dst/dst.h>
+
+
+static void
+ssu_e_log(int level, const char *fmt, ...) {
+ va_list ap;
+
+ va_start(ap, fmt);
+ isc_log_vwrite(dns_lctx, DNS_LOGCATEGORY_SECURITY,
+ DNS_LOGMODULE_ZONE, ISC_LOG_DEBUG(level), fmt, ap);
+ va_end(ap);
+}
+
+
+/*
+ * Connect to a UNIX domain socket.
+ */
+static int
+ux_socket_connect(const char *path) {
+ int fd = -1;
+#ifdef ISC_PLATFORM_HAVESYSUNH
+ struct sockaddr_un addr;
+
+ REQUIRE(path != NULL);
+
+ if (strlen(path) > sizeof(addr.sun_path)) {
+ ssu_e_log(3, "ssu_external: socket path '%s' "
+ "longer than system maximum %u",
+ path, sizeof(addr.sun_path));
+ return (-1);
+ }
+
+ memset(&addr, 0, sizeof(addr));
+ addr.sun_family = AF_UNIX;
+ strncpy(addr.sun_path, path, sizeof(addr.sun_path));
+
+ fd = socket(AF_UNIX, SOCK_STREAM, 0);
+ if (fd == -1) {
+ char strbuf[ISC_STRERRORSIZE];
+ isc__strerror(errno, strbuf, sizeof(strbuf));
+ ssu_e_log(3, "ssu_external: unable to create socket - %s",
+ strbuf);
+ return (-1);
+ }
+
+ if (connect(fd, (struct sockaddr *)&addr, sizeof(addr)) == -1) {
+ char strbuf[ISC_STRERRORSIZE];
+ isc__strerror(errno, strbuf, sizeof(strbuf));
+ ssu_e_log(3, "ssu_external: unable to connect to "
+ "socket '%s' - %s",
+ path, strbuf);
+ close(fd);
+ return (-1);
+ }
+#endif
+ return (fd);
+}
+
+/* Change this version if you update the format of the request */
+#define SSU_EXTERNAL_VERSION 1
+
+/*
+ * Perform an update-policy rule check against an external application
+ * over a socket.
+ *
+ * This currently only supports local: for unix domain datagram sockets.
+ *
+ * Note that by using a datagram socket and creating a new socket each
+ * time we avoid the need for locking and allow for parallel access to
+ * the authorization server.
+ */
+isc_boolean_t
+dns_ssu_external_match(dns_name_t *identity,
+ dns_name_t *signer, dns_name_t *name,
+ isc_netaddr_t *tcpaddr, dns_rdatatype_t type,
+ const dst_key_t *key, isc_mem_t *mctx)
+{
+ char b_identity[DNS_NAME_FORMATSIZE];
+ char b_signer[DNS_NAME_FORMATSIZE];
+ char b_name[DNS_NAME_FORMATSIZE];
+ char b_addr[ISC_NETADDR_FORMATSIZE];
+ char b_type[DNS_RDATATYPE_FORMATSIZE];
+ char b_key[DST_KEY_FORMATSIZE];
+ isc_buffer_t *tkey_token;
+ int fd;
+ const char *sock_path;
+ size_t req_len;
+ isc_region_t token_region;
+ unsigned char *data;
+ isc_buffer_t buf;
+ isc_uint32_t token_len = 0;
+ isc_uint32_t reply;
+ ssize_t ret;
+
+ /* The identity contains local:/path/to/socket */
+ dns_name_format(identity, b_identity, sizeof(b_identity));
+
+ /* For now only local: is supported */
+ if (strncmp(b_identity, "local:", 6) != 0) {
+ ssu_e_log(3, "ssu_external: invalid socket path '%s'",
+ b_identity);
+ return (ISC_FALSE);
+ }
+ sock_path = &b_identity[6];
+
+ fd = ux_socket_connect(sock_path);
+ if (fd == -1)
+ return (ISC_FALSE);
+
+ tkey_token = dst_key_tkeytoken(key);
+
+ /* Format the request elements */
+ if (signer)
+ dns_name_format(signer, b_signer, sizeof(b_signer));
+ else
+ b_signer[0] = 0;
+
+ dns_name_format(name, b_name, sizeof(b_name));
+
+ if (tcpaddr)
+ isc_netaddr_format(tcpaddr, b_addr, sizeof(b_addr));
+ else
+ b_addr[0] = 0;
+
+ dns_rdatatype_format(type, b_type, sizeof(b_type));
+
+ if (key)
+ dst_key_format(key, b_key, sizeof(b_key));
+ else
+ b_key[0] = 0;
+
+ if (tkey_token) {
+ isc_buffer_region(tkey_token, &token_region);
+ token_len = token_region.length;
+ }
+
+ /* Work out how big the request will be */
+ req_len = sizeof(isc_uint32_t) + /* Format version */
+ sizeof(isc_uint32_t) + /* Length */
+ strlen(b_signer) + 1 + /* Signer */
+ strlen(b_name) + 1 + /* Name */
+ strlen(b_addr) + 1 + /* Address */
+ strlen(b_type) + 1 + /* Type */
+ strlen(b_key) + 1 + /* Key */
+ sizeof(isc_uint32_t) + /* tkey_token length */
+ token_len; /* tkey_token */
+
+
+ /* format the buffer */
+ data = isc_mem_allocate(mctx, req_len);
+ if (data == NULL) {
+ close(fd);
+ return (ISC_FALSE);
+ }
+
+ isc_buffer_init(&buf, data, req_len);
+ isc_buffer_putuint32(&buf, SSU_EXTERNAL_VERSION);
+ isc_buffer_putuint32(&buf, req_len);
+
+ /* Strings must be null-terminated */
+ isc_buffer_putstr(&buf, b_signer);
+ isc_buffer_putuint8(&buf, 0);
+ isc_buffer_putstr(&buf, b_name);
+ isc_buffer_putuint8(&buf, 0);
+ isc_buffer_putstr(&buf, b_addr);
+ isc_buffer_putuint8(&buf, 0);
+ isc_buffer_putstr(&buf, b_type);
+ isc_buffer_putuint8(&buf, 0);
+ isc_buffer_putstr(&buf, b_key);
+ isc_buffer_putuint8(&buf, 0);
+
+ isc_buffer_putuint32(&buf, token_len);
+ if (tkey_token && token_len != 0)
+ isc_buffer_putmem(&buf, token_region.base, token_len);
+
+ ENSURE(isc_buffer_availablelength(&buf) == 0);
+
+ /* Send the request */
+ ret = write(fd, data, req_len);
+ isc_mem_free(mctx, data);
+ if (ret != (ssize_t) req_len) {
+ char strbuf[ISC_STRERRORSIZE];
+ isc__strerror(errno, strbuf, sizeof(strbuf));
+ ssu_e_log(3, "ssu_external: unable to send request - %s",
+ strbuf);
+ close(fd);
+ return (ISC_FALSE);
+ }
+
+ /* Receive the reply */
+ ret = read(fd, &reply, sizeof(isc_uint32_t));
+ if (ret != (ssize_t) sizeof(isc_uint32_t)) {
+ char strbuf[ISC_STRERRORSIZE];
+ isc__strerror(errno, strbuf, sizeof(strbuf));
+ ssu_e_log(3, "ssu_external: unable to receive reply - %s",
+ strbuf);
+ close(fd);
+ return (ISC_FALSE);
+ }
+
+ close(fd);
+
+ reply = ntohl(reply);
+
+ if (reply == 0) {
+ ssu_e_log(3, "ssu_external: denied external auth for '%s'",
+ b_name);
+ return (ISC_FALSE);
+ } else if (reply == 1) {
+ ssu_e_log(3, "ssu_external: allowed external auth for '%s'",
+ b_name);
+ return (ISC_TRUE);
+ }
+
+ ssu_e_log(3, "ssu_external: invalid reply 0x%08x", reply);
+
+ return (ISC_FALSE);
+}
diff --git a/contrib/bind9/lib/dns/stats.c b/contrib/bind9/lib/dns/stats.c
index b73a3b3..cb46bf5 100644
--- a/contrib/bind9/lib/dns/stats.c
+++ b/contrib/bind9/lib/dns/stats.c
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: stats.c,v 1.16.118.2 2009-01-29 23:47:44 tbox Exp $ */
+/* $Id: stats.c,v 1.18 2009-01-27 23:47:54 tbox Exp $ */
/*! \file */
diff --git a/contrib/bind9/lib/dns/time.c b/contrib/bind9/lib/dns/time.c
index bd8cdc3..3f55f19 100644
--- a/contrib/bind9/lib/dns/time.c
+++ b/contrib/bind9/lib/dns/time.c
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: time.c,v 1.31.332.4 2010-04-21 23:48:05 tbox Exp $ */
+/* $Id: time.c,v 1.35 2010-04-21 23:51:22 tbox Exp $ */
/*! \file */
diff --git a/contrib/bind9/lib/dns/tkey.c b/contrib/bind9/lib/dns/tkey.c
index 7107dd5..a861ee3 100644
--- a/contrib/bind9/lib/dns/tkey.c
+++ b/contrib/bind9/lib/dns/tkey.c
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004-2008, 2010 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004-2011 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 1999-2001, 2003 Internet Software Consortium.
*
* Permission to use, copy, modify, and/or distribute this software for any
@@ -16,7 +16,7 @@
*/
/*
- * $Id: tkey.c,v 1.90.118.4 2010-12-09 01:12:55 marka Exp $
+ * $Id: tkey.c,v 1.100 2011-01-08 23:47:01 tbox Exp $
*/
/*! \file */
#include <config.h>
@@ -99,6 +99,7 @@ dns_tkeyctx_create(isc_mem_t *mctx, isc_entropy_t *ectx, dns_tkeyctx_t **tctxp)
tctx->dhkey = NULL;
tctx->domain = NULL;
tctx->gsscred = NULL;
+ tctx->gssapi_keytab = NULL;
*tctxp = tctx;
return (ISC_R_SUCCESS);
@@ -121,6 +122,9 @@ dns_tkeyctx_destroy(dns_tkeyctx_t **tctxp) {
dns_name_free(tctx->domain, mctx);
isc_mem_put(mctx, tctx->domain, sizeof(dns_name_t));
}
+ if (tctx->gssapi_keytab != NULL) {
+ isc_mem_free(mctx, tctx->gssapi_keytab);
+ }
if (tctx->gsscred != NULL)
dst_gssapi_releasecred(&tctx->gsscred);
isc_entropy_detach(&tctx->ectx);
@@ -430,8 +434,17 @@ process_gsstkey(dns_name_t *name, dns_rdata_tkey_t *tkeyin,
isc_buffer_t *outtoken = NULL;
gss_ctx_id_t gss_ctx = NULL;
- if (tctx->gsscred == NULL)
+ /*
+ * You have to define either a gss credential (principal) to
+ * accept with tkey-gssapi-credential, or you have to
+ * configure a specific keytab (with tkey-gssapi-keytab) in
+ * order to use gsstkey
+ */
+ if (tctx->gsscred == NULL && tctx->gssapi_keytab == NULL) {
+ tkey_log("process_gsstkey(): no tkey-gssapi-credential "
+ "or tkey-gssapi-keytab configured");
return (ISC_R_NOPERM);
+ }
if (!dns_name_equal(&tkeyin->algorithm, DNS_TSIG_GSSAPI_NAME) &&
!dns_name_equal(&tkeyin->algorithm, DNS_TSIG_GSSAPIMS_NAME)) {
@@ -454,7 +467,11 @@ process_gsstkey(dns_name_t *name, dns_rdata_tkey_t *tkeyin,
dns_fixedname_init(&principal);
- result = dst_gssapi_acceptctx(tctx->gsscred, &intoken,
+ /*
+ * Note that tctx->gsscred may be NULL if tctx->gssapi_keytab is set
+ */
+ result = dst_gssapi_acceptctx(tctx->gsscred, tctx->gssapi_keytab,
+ &intoken,
&outtoken, &gss_ctx,
dns_fixedname_name(&principal),
tctx->mctx);
@@ -479,7 +496,8 @@ process_gsstkey(dns_name_t *name, dns_rdata_tkey_t *tkeyin,
#endif
isc_uint32_t expire;
- RETERR(dst_key_fromgssapi(name, gss_ctx, ring->mctx, &dstkey));
+ RETERR(dst_key_fromgssapi(name, gss_ctx, ring->mctx,
+ &dstkey, &intoken));
/*
* Limit keys to 1 hour or the context's lifetime whichever
* is smaller.
@@ -734,8 +752,7 @@ dns_tkey_processquery(dns_message_t *msg, dns_tkeyctx_t *tctx,
}
isc_buffer_init(&b, randomtext, sizeof(randomtext));
isc_buffer_add(&b, sizeof(randomtext));
- result = dns_name_fromtext(keyname, &b, NULL,
- ISC_FALSE, NULL);
+ result = dns_name_fromtext(keyname, &b, NULL, 0, NULL);
if (result != ISC_R_SUCCESS)
goto failure;
}
@@ -985,7 +1002,8 @@ dns_tkey_builddhquery(dns_message_t *msg, dst_key_t *key, dns_name_t *name,
isc_result_t
dns_tkey_buildgssquery(dns_message_t *msg, dns_name_t *name, dns_name_t *gname,
isc_buffer_t *intoken, isc_uint32_t lifetime,
- gss_ctx_id_t *context, isc_boolean_t win2k)
+ gss_ctx_id_t *context, isc_boolean_t win2k,
+ isc_mem_t *mctx, char **err_message)
{
dns_rdata_tkey_t tkey;
isc_result_t result;
@@ -999,9 +1017,11 @@ dns_tkey_buildgssquery(dns_message_t *msg, dns_name_t *name, dns_name_t *gname,
REQUIRE(name != NULL);
REQUIRE(gname != NULL);
REQUIRE(context != NULL);
+ REQUIRE(mctx != NULL);
isc_buffer_init(&token, array, sizeof(array));
- result = dst_gssapi_initctx(gname, NULL, &token, context);
+ result = dst_gssapi_initctx(gname, NULL, &token, context,
+ mctx, err_message);
if (result != DNS_R_CONTINUE && result != ISC_R_SUCCESS)
return (result);
@@ -1218,7 +1238,7 @@ isc_result_t
dns_tkey_processgssresponse(dns_message_t *qmsg, dns_message_t *rmsg,
dns_name_t *gname, gss_ctx_id_t *context,
isc_buffer_t *outtoken, dns_tsigkey_t **outkey,
- dns_tsig_keyring_t *ring)
+ dns_tsig_keyring_t *ring, char **err_message)
{
dns_rdata_t rtkeyrdata = DNS_RDATA_INIT, qtkeyrdata = DNS_RDATA_INIT;
dns_name_t *tkeyname;
@@ -1232,6 +1252,7 @@ dns_tkey_processgssresponse(dns_message_t *qmsg, dns_message_t *rmsg,
REQUIRE(qmsg != NULL);
REQUIRE(rmsg != NULL);
REQUIRE(gname != NULL);
+ REQUIRE(ring != NULL);
if (outkey != NULL)
REQUIRE(*outkey == NULL);
@@ -1268,10 +1289,11 @@ dns_tkey_processgssresponse(dns_message_t *qmsg, dns_message_t *rmsg,
isc_buffer_init(outtoken, array, sizeof(array));
isc_buffer_init(&intoken, rtkey.key, rtkey.keylen);
- RETERR(dst_gssapi_initctx(gname, &intoken, outtoken, context));
+ RETERR(dst_gssapi_initctx(gname, &intoken, outtoken, context,
+ ring->mctx, err_message));
RETERR(dst_key_fromgssapi(dns_rootname, *context, rmsg->mctx,
- &dstkey));
+ &dstkey, NULL));
RETERR(dns_tsigkey_createfromkey(tkeyname, DNS_TSIG_GSSAPI_NAME,
dstkey, ISC_FALSE, NULL,
@@ -1349,7 +1371,7 @@ isc_result_t
dns_tkey_gssnegotiate(dns_message_t *qmsg, dns_message_t *rmsg,
dns_name_t *server, gss_ctx_id_t *context,
dns_tsigkey_t **outkey, dns_tsig_keyring_t *ring,
- isc_boolean_t win2k)
+ isc_boolean_t win2k, char **err_message)
{
dns_rdata_t rtkeyrdata = DNS_RDATA_INIT, qtkeyrdata = DNS_RDATA_INIT;
dns_name_t *tkeyname;
@@ -1393,12 +1415,13 @@ dns_tkey_gssnegotiate(dns_message_t *qmsg, dns_message_t *rmsg,
isc_buffer_init(&intoken, rtkey.key, rtkey.keylen);
isc_buffer_init(&outtoken, array, sizeof(array));
- result = dst_gssapi_initctx(server, &intoken, &outtoken, context);
+ result = dst_gssapi_initctx(server, &intoken, &outtoken, context,
+ ring->mctx, err_message);
if (result != DNS_R_CONTINUE && result != ISC_R_SUCCESS)
return (result);
RETERR(dst_key_fromgssapi(dns_rootname, *context, rmsg->mctx,
- &dstkey));
+ &dstkey, NULL));
/*
* XXXSRA This seems confused. If we got CONTINUE from initctx,
diff --git a/contrib/bind9/lib/dns/tsec.c b/contrib/bind9/lib/dns/tsec.c
new file mode 100644
index 0000000..b7ed777
--- /dev/null
+++ b/contrib/bind9/lib/dns/tsec.c
@@ -0,0 +1,160 @@
+/*
+ * Copyright (C) 2009, 2010 Internet Systems Consortium, Inc. ("ISC")
+ *
+ * Permission to use, copy, modify, and/or 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 ISC DISCLAIMS ALL WARRANTIES WITH
+ * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+ * AND FITNESS. IN NO EVENT SHALL ISC 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.
+ */
+
+/* $Id: tsec.c,v 1.7 2010-12-09 00:54:34 marka Exp $ */
+
+#include <config.h>
+
+#include <isc/mem.h>
+
+#include <dns/tsec.h>
+#include <dns/tsig.h>
+#include <dns/result.h>
+
+#include <dst/dst.h>
+
+#define DNS_TSEC_MAGIC ISC_MAGIC('T', 's', 'e', 'c')
+#define DNS_TSEC_VALID(t) ISC_MAGIC_VALID(t, DNS_TSEC_MAGIC)
+
+/*%
+ * DNS Transaction Security object. We assume this is not shared by
+ * multiple threads, and so the structure does not contain a lock.
+ */
+struct dns_tsec {
+ unsigned int magic;
+ dns_tsectype_t type;
+ isc_mem_t *mctx;
+ union {
+ dns_tsigkey_t *tsigkey;
+ dst_key_t *key;
+ } ukey;
+};
+
+isc_result_t
+dns_tsec_create(isc_mem_t *mctx, dns_tsectype_t type, dst_key_t *key,
+ dns_tsec_t **tsecp)
+{
+ isc_result_t result;
+ dns_tsec_t *tsec;
+ dns_tsigkey_t *tsigkey = NULL;
+ dns_name_t *algname;
+
+ REQUIRE(mctx != NULL);
+ REQUIRE(tsecp != NULL && *tsecp == NULL);
+
+ tsec = isc_mem_get(mctx, sizeof(*tsec));
+ if (tsec == NULL)
+ return (ISC_R_NOMEMORY);
+
+ tsec->type = type;
+ tsec->mctx = mctx;
+
+ switch (type) {
+ case dns_tsectype_tsig:
+ switch (dst_key_alg(key)) {
+ case DST_ALG_HMACMD5:
+ algname = dns_tsig_hmacmd5_name;
+ break;
+ case DST_ALG_HMACSHA1:
+ algname = dns_tsig_hmacsha1_name;
+ break;
+ case DST_ALG_HMACSHA224:
+ algname = dns_tsig_hmacsha224_name;
+ break;
+ case DST_ALG_HMACSHA256:
+ algname = dns_tsig_hmacsha256_name;
+ break;
+ case DST_ALG_HMACSHA384:
+ algname = dns_tsig_hmacsha384_name;
+ break;
+ case DST_ALG_HMACSHA512:
+ algname = dns_tsig_hmacsha512_name;
+ break;
+ default:
+ isc_mem_put(mctx, tsec, sizeof(*tsec));
+ return (DNS_R_BADALG);
+ }
+ result = dns_tsigkey_createfromkey(dst_key_name(key),
+ algname, key, ISC_FALSE,
+ NULL, 0, 0, mctx, NULL,
+ &tsigkey);
+ if (result != ISC_R_SUCCESS) {
+ isc_mem_put(mctx, tsec, sizeof(*tsec));
+ return (result);
+ }
+ tsec->ukey.tsigkey = tsigkey;
+ break;
+ case dns_tsectype_sig0:
+ tsec->ukey.key = key;
+ break;
+ default:
+ INSIST(0);
+ }
+
+ tsec->magic = DNS_TSEC_MAGIC;
+
+ *tsecp = tsec;
+ return (ISC_R_SUCCESS);
+}
+
+void
+dns_tsec_destroy(dns_tsec_t **tsecp) {
+ dns_tsec_t *tsec;
+
+ REQUIRE(tsecp != NULL && *tsecp != NULL);
+ tsec = *tsecp;
+ REQUIRE(DNS_TSEC_VALID(tsec));
+
+ switch (tsec->type) {
+ case dns_tsectype_tsig:
+ dns_tsigkey_detach(&tsec->ukey.tsigkey);
+ break;
+ case dns_tsectype_sig0:
+ dst_key_free(&tsec->ukey.key);
+ break;
+ default:
+ INSIST(0);
+ }
+
+ tsec->magic = 0;
+ isc_mem_put(tsec->mctx, tsec, sizeof(*tsec));
+
+ *tsecp = NULL;
+}
+
+dns_tsectype_t
+dns_tsec_gettype(dns_tsec_t *tsec) {
+ REQUIRE(DNS_TSEC_VALID(tsec));
+
+ return (tsec->type);
+}
+
+void
+dns_tsec_getkey(dns_tsec_t *tsec, void *keyp) {
+ REQUIRE(DNS_TSEC_VALID(tsec));
+ REQUIRE(keyp != NULL);
+
+ switch (tsec->type) {
+ case dns_tsectype_tsig:
+ dns_tsigkey_attach(tsec->ukey.tsigkey, (dns_tsigkey_t **)keyp);
+ break;
+ case dns_tsectype_sig0:
+ *(dst_key_t **)keyp = tsec->ukey.key;
+ break;
+ default:
+ INSIST(0);
+ }
+}
diff --git a/contrib/bind9/lib/dns/tsig.c b/contrib/bind9/lib/dns/tsig.c
index 65d32dc..cec5222 100644
--- a/contrib/bind9/lib/dns/tsig.c
+++ b/contrib/bind9/lib/dns/tsig.c
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004-2008, 2010 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004-2011 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 1999-2002 Internet Software Consortium.
*
* Permission to use, copy, modify, and/or distribute this software for any
@@ -16,7 +16,7 @@
*/
/*
- * $Id: tsig.c,v 1.136.18.5 2010-12-09 01:12:55 marka Exp $
+ * $Id: tsig.c,v 1.147 2011-01-11 23:47:13 tbox Exp $
*/
/*! \file */
#include <config.h>
@@ -91,31 +91,6 @@ static dns_name_t gsstsig = {
};
LIBDNS_EXTERNAL_DATA dns_name_t *dns_tsig_gssapi_name = &gsstsig;
-static void
-remove_fromring(dns_tsigkey_t *tkey) {
- if (tkey->generated) {
- ISC_LIST_UNLINK(tkey->ring->lru, tkey, link);
- tkey->ring->generated--;
- }
- (void)dns_rbt_deletename(tkey->ring->keys, &tkey->name, ISC_FALSE);
-}
-
-static void
-adjust_lru(dns_tsigkey_t *tkey) {
- if (tkey->generated) {
- RWLOCK(&tkey->ring->lock, isc_rwlocktype_write);
- /*
- * We may have been removed from the LRU list between
- * removing the read lock and aquiring the write lock.
- */
- if (ISC_LINK_LINKED(tkey, link)) {
- ISC_LIST_UNLINK(tkey->ring->lru, tkey, link);
- ISC_LIST_APPEND(tkey->ring->lru, tkey, link);
- }
- RWUNLOCK(&tkey->ring->lock, isc_rwlocktype_write);
- }
-}
-
/*
* Since Microsoft doesn't follow its own standard, we will use this
* alternate name as a second guess.
@@ -228,8 +203,10 @@ tsig_log(dns_tsigkey_t *key, int level, const char *fmt, ...) {
else
strcpy(namestr, "<null>");
- if (key != NULL && key->generated)
+ if (key != NULL && key->generated && key->creator)
dns_name_format(key->creator, creatorstr, sizeof(creatorstr));
+ else
+ strcpy(creatorstr, "<null>");
va_start(ap, fmt);
vsnprintf(message, sizeof(message), fmt, ap);
@@ -245,6 +222,71 @@ tsig_log(dns_tsigkey_t *key, int level, const char *fmt, ...) {
level, "tsig key '%s': %s", namestr, message);
}
+static void
+remove_fromring(dns_tsigkey_t *tkey) {
+ if (tkey->generated) {
+ ISC_LIST_UNLINK(tkey->ring->lru, tkey, link);
+ tkey->ring->generated--;
+ }
+ (void)dns_rbt_deletename(tkey->ring->keys, &tkey->name, ISC_FALSE);
+}
+
+static void
+adjust_lru(dns_tsigkey_t *tkey) {
+ if (tkey->generated) {
+ RWLOCK(&tkey->ring->lock, isc_rwlocktype_write);
+ /*
+ * We may have been removed from the LRU list between
+ * removing the read lock and aquiring the write lock.
+ */
+ if (ISC_LINK_LINKED(tkey, link)) {
+ ISC_LIST_UNLINK(tkey->ring->lru, tkey, link);
+ ISC_LIST_APPEND(tkey->ring->lru, tkey, link);
+ }
+ RWUNLOCK(&tkey->ring->lock, isc_rwlocktype_write);
+ }
+}
+
+/*
+ * A supplemental routine just to add a key to ring. Note that reference
+ * counter should be counted separately because we may be adding the key
+ * as part of creation of the key, in which case the reference counter was
+ * already initialized. Also note we don't need RWLOCK for the reference
+ * counter: it's protected by a separate lock.
+ */
+static isc_result_t
+keyring_add(dns_tsig_keyring_t *ring, dns_name_t *name,
+ dns_tsigkey_t *tkey)
+{
+ isc_result_t result;
+
+ RWLOCK(&ring->lock, isc_rwlocktype_write);
+ ring->writecount++;
+
+ /*
+ * Do on the fly cleaning. Find some nodes we might not
+ * want around any more.
+ */
+ if (ring->writecount > 10) {
+ cleanup_ring(ring);
+ ring->writecount = 0;
+ }
+
+ result = dns_rbt_addname(ring->keys, name, tkey);
+ if (tkey->generated) {
+ /*
+ * Add the new key to the LRU list and remove the least
+ * recently used key if there are too many keys on the list.
+ */
+ ISC_LIST_INITANDAPPEND(ring->lru, tkey, link);
+ if (ring->generated++ > ring->maxgenerated)
+ remove_fromring(ISC_LIST_HEAD(ring->lru));
+ }
+ RWUNLOCK(&ring->lock, isc_rwlocktype_write);
+
+ return (result);
+}
+
isc_result_t
dns_tsigkey_createfromkey(dns_name_t *name, dns_name_t *algorithm,
dst_key_t *dstkey, isc_boolean_t generated,
@@ -363,7 +405,7 @@ dns_tsigkey_createfromkey(dns_name_t *name, dns_name_t *algorithm,
tkey->ring = ring;
if (key != NULL)
- refs++;
+ refs = 1;
if (ring != NULL)
refs++;
ret = isc_refcount_init(&tkey->refs, refs);
@@ -379,36 +421,9 @@ dns_tsigkey_createfromkey(dns_name_t *name, dns_name_t *algorithm,
tkey->magic = TSIG_MAGIC;
if (ring != NULL) {
- RWLOCK(&ring->lock, isc_rwlocktype_write);
- ring->writecount++;
-
- /*
- * Do on the fly cleaning. Find some nodes we might not
- * want around any more.
- */
- if (ring->writecount > 10) {
- cleanup_ring(ring);
- ring->writecount = 0;
- }
-
- ret = dns_rbt_addname(ring->keys, name, tkey);
- if (ret != ISC_R_SUCCESS) {
- RWUNLOCK(&ring->lock, isc_rwlocktype_write);
+ ret = keyring_add(ring, name, tkey);
+ if (ret != ISC_R_SUCCESS)
goto cleanup_refs;
- }
-
- if (tkey->generated) {
- /*
- * Add the new key to the LRU list and remove the
- * least recently used key if there are too many
- * keys on the list.
- */
- ISC_LIST_INITANDAPPEND(ring->lru, tkey, link);
- if (ring->generated++ > ring->maxgenerated)
- remove_fromring(ISC_LIST_HEAD(ring->lru));
- }
-
- RWUNLOCK(&ring->lock, isc_rwlocktype_write);
}
/*
@@ -424,6 +439,7 @@ dns_tsigkey_createfromkey(dns_name_t *name, dns_name_t *algorithm,
"the key '%s' is too short to be secure",
namestr);
}
+
if (key != NULL)
*key = tkey;
@@ -512,6 +528,184 @@ cleanup_ring(dns_tsig_keyring_t *ring)
}
}
+static void
+destroyring(dns_tsig_keyring_t *ring) {
+ dns_rbt_destroy(&ring->keys);
+ isc_rwlock_destroy(&ring->lock);
+ isc_mem_putanddetach(&ring->mctx, ring, sizeof(dns_tsig_keyring_t));
+}
+
+static unsigned int
+dst_alg_fromname(dns_name_t *algorithm) {
+ if (dns_name_equal(algorithm, DNS_TSIG_HMACMD5_NAME)) {
+ return (DST_ALG_HMACMD5);
+ } else if (dns_name_equal(algorithm, DNS_TSIG_HMACSHA1_NAME)) {
+ return (DST_ALG_HMACSHA1);
+ } else if (dns_name_equal(algorithm, DNS_TSIG_HMACSHA224_NAME)) {
+ return (DST_ALG_HMACSHA224);
+ } else if (dns_name_equal(algorithm, DNS_TSIG_HMACSHA256_NAME)) {
+ return (DST_ALG_HMACSHA256);
+ } else if (dns_name_equal(algorithm, DNS_TSIG_HMACSHA384_NAME)) {
+ return (DST_ALG_HMACSHA384);
+ } else if (dns_name_equal(algorithm, DNS_TSIG_HMACSHA512_NAME)) {
+ return (DST_ALG_HMACSHA512);
+ } else if (dns_name_equal(algorithm, DNS_TSIG_GSSAPI_NAME)) {
+ return (DST_ALG_GSSAPI);
+ } else if (dns_name_equal(algorithm, DNS_TSIG_GSSAPIMS_NAME)) {
+ return (DST_ALG_GSSAPI);
+ } else
+ return (0);
+}
+
+static isc_result_t
+restore_key(dns_tsig_keyring_t *ring, isc_stdtime_t now, FILE *fp) {
+ dst_key_t *dstkey = NULL;
+ char namestr[1024];
+ char creatorstr[1024];
+ char algorithmstr[1024];
+ char keystr[4096];
+ unsigned int inception, expire;
+ int n;
+ isc_buffer_t b;
+ dns_name_t *name, *creator, *algorithm;
+ dns_fixedname_t fname, fcreator, falgorithm;
+ isc_result_t result;
+ unsigned int dstalg;
+
+ n = fscanf(fp, "%1023s %1023s %u %u %1023s %4095s\n", namestr,
+ creatorstr, &inception, &expire, algorithmstr, keystr);
+ if (n == EOF)
+ return (ISC_R_NOMORE);
+ if (n != 6)
+ return (ISC_R_FAILURE);
+
+ if (isc_serial_lt(expire, now))
+ return (DNS_R_EXPIRED);
+
+ dns_fixedname_init(&fname);
+ name = dns_fixedname_name(&fname);
+ isc_buffer_init(&b, namestr, strlen(namestr));
+ isc_buffer_add(&b, strlen(namestr));
+ result = dns_name_fromtext(name, &b, dns_rootname, 0, NULL);
+ if (result != ISC_R_SUCCESS)
+ return (result);
+
+ dns_fixedname_init(&fcreator);
+ creator = dns_fixedname_name(&fcreator);
+ isc_buffer_init(&b, creatorstr, strlen(creatorstr));
+ isc_buffer_add(&b, strlen(creatorstr));
+ result = dns_name_fromtext(creator, &b, dns_rootname, 0, NULL);
+ if (result != ISC_R_SUCCESS)
+ return (result);
+
+ dns_fixedname_init(&falgorithm);
+ algorithm = dns_fixedname_name(&falgorithm);
+ isc_buffer_init(&b, algorithmstr, strlen(algorithmstr));
+ isc_buffer_add(&b, strlen(algorithmstr));
+ result = dns_name_fromtext(algorithm, &b, dns_rootname, 0, NULL);
+ if (result != ISC_R_SUCCESS)
+ return (result);
+
+ dstalg = dst_alg_fromname(algorithm);
+ if (dstalg == 0)
+ return (DNS_R_BADALG);
+
+ result = dst_key_restore(name, dstalg, DNS_KEYOWNER_ENTITY,
+ DNS_KEYPROTO_DNSSEC, dns_rdataclass_in,
+ ring->mctx, keystr, &dstkey);
+ if (result != ISC_R_SUCCESS)
+ return (result);
+
+ result = dns_tsigkey_createfromkey(name, algorithm, dstkey,
+ ISC_TRUE, creator, inception,
+ expire, ring->mctx, ring, NULL);
+ if (result != ISC_R_SUCCESS && dstkey != NULL)
+ dst_key_free(&dstkey);
+ return (result);
+}
+
+static void
+dump_key(dns_tsigkey_t *tkey, FILE *fp)
+{
+ char *buffer = NULL;
+ int length = 0;
+ char namestr[DNS_NAME_FORMATSIZE];
+ char creatorstr[DNS_NAME_FORMATSIZE];
+ char algorithmstr[DNS_NAME_FORMATSIZE];
+ isc_result_t result;
+
+ dns_name_format(&tkey->name, namestr, sizeof(namestr));
+ dns_name_format(tkey->creator, creatorstr, sizeof(creatorstr));
+ dns_name_format(tkey->algorithm, algorithmstr, sizeof(algorithmstr));
+ result = dst_key_dump(tkey->key, tkey->mctx, &buffer, &length);
+ if (result == ISC_R_SUCCESS)
+ fprintf(fp, "%s %s %u %u %s %.*s\n", namestr, creatorstr,
+ tkey->inception, tkey->expire, algorithmstr,
+ length, buffer);
+ if (buffer != NULL)
+ isc_mem_put(tkey->mctx, buffer, length);
+}
+
+isc_result_t
+dns_tsigkeyring_dumpanddetach(dns_tsig_keyring_t **ringp, FILE *fp) {
+ isc_result_t result;
+ dns_rbtnodechain_t chain;
+ dns_name_t foundname;
+ dns_fixedname_t fixedorigin;
+ dns_name_t *origin;
+ isc_stdtime_t now;
+ dns_rbtnode_t *node;
+ dns_tsigkey_t *tkey;
+ dns_tsig_keyring_t *ring;
+ unsigned int references;
+
+ REQUIRE(ringp != NULL && *ringp != NULL);
+
+ ring = *ringp;
+ *ringp = NULL;
+
+ RWLOCK(&ring->lock, isc_rwlocktype_write);
+ INSIST(ring->references > 0);
+ ring->references--;
+ references = ring->references;
+ RWUNLOCK(&ring->lock, isc_rwlocktype_write);
+
+ if (references != 0)
+ return (DNS_R_CONTINUE);
+
+ isc_stdtime_get(&now);
+ dns_name_init(&foundname, NULL);
+ dns_fixedname_init(&fixedorigin);
+ origin = dns_fixedname_name(&fixedorigin);
+ dns_rbtnodechain_init(&chain, ring->mctx);
+ result = dns_rbtnodechain_first(&chain, ring->keys, &foundname,
+ origin);
+ if (result != ISC_R_SUCCESS && result != DNS_R_NEWORIGIN) {
+ dns_rbtnodechain_invalidate(&chain);
+ goto destroy;
+ }
+
+ for (;;) {
+ node = NULL;
+ dns_rbtnodechain_current(&chain, &foundname, origin, &node);
+ tkey = node->data;
+ if (tkey != NULL && tkey->generated && tkey->expire >= now)
+ dump_key(tkey, fp);
+ result = dns_rbtnodechain_next(&chain, &foundname,
+ origin);
+ if (result != ISC_R_SUCCESS && result != DNS_R_NEWORIGIN) {
+ dns_rbtnodechain_invalidate(&chain);
+ if (result == ISC_R_NOMORE)
+ result = ISC_R_SUCCESS;
+ goto destroy;
+ }
+ }
+
+ destroy:
+ destroyring(ring);
+ return (result);
+}
+
isc_result_t
dns_tsigkey_create(dns_name_t *name, dns_name_t *algorithm,
unsigned char *secret, int length, isc_boolean_t generated,
@@ -1589,14 +1783,43 @@ dns_tsigkeyring_create(isc_mem_t *mctx, dns_tsig_keyring_t **ringp) {
ring->maxgenerated = DNS_TSIG_MAXGENERATEDKEYS;
ISC_LIST_INIT(ring->lru);
isc_mem_attach(mctx, &ring->mctx);
+ ring->references = 1;
*ringp = ring;
return (ISC_R_SUCCESS);
}
+isc_result_t
+dns_tsigkeyring_add(dns_tsig_keyring_t *ring, dns_name_t *name,
+ dns_tsigkey_t *tkey)
+{
+ isc_result_t result;
+
+ result = keyring_add(ring, name, tkey);
+ if (result == ISC_R_SUCCESS)
+ isc_refcount_increment(&tkey->refs, NULL);
+
+ return (result);
+}
+
void
-dns_tsigkeyring_destroy(dns_tsig_keyring_t **ringp) {
+dns_tsigkeyring_attach(dns_tsig_keyring_t *source, dns_tsig_keyring_t **target)
+{
+ REQUIRE(source != NULL);
+ REQUIRE(target != NULL && *target == NULL);
+
+ RWLOCK(&source->lock, isc_rwlocktype_write);
+ INSIST(source->references > 0);
+ source->references++;
+ INSIST(source->references > 0);
+ *target = source;
+ RWUNLOCK(&source->lock, isc_rwlocktype_write);
+}
+
+void
+dns_tsigkeyring_detach(dns_tsig_keyring_t **ringp) {
dns_tsig_keyring_t *ring;
+ unsigned int references;
REQUIRE(ringp != NULL);
REQUIRE(*ringp != NULL);
@@ -1604,7 +1827,27 @@ dns_tsigkeyring_destroy(dns_tsig_keyring_t **ringp) {
ring = *ringp;
*ringp = NULL;
- dns_rbt_destroy(&ring->keys);
- isc_rwlock_destroy(&ring->lock);
- isc_mem_putanddetach(&ring->mctx, ring, sizeof(dns_tsig_keyring_t));
+ RWLOCK(&ring->lock, isc_rwlocktype_write);
+ INSIST(ring->references > 0);
+ ring->references--;
+ references = ring->references;
+ RWUNLOCK(&ring->lock, isc_rwlocktype_write);
+
+ if (references == 0)
+ destroyring(ring);
+}
+
+void
+dns_keyring_restore(dns_tsig_keyring_t *ring, FILE *fp) {
+ isc_stdtime_t now;
+ isc_result_t result;
+
+ isc_stdtime_get(&now);
+ do {
+ result = restore_key(ring, now, fp);
+ if (result == ISC_R_NOMORE)
+ return;
+ if (result == DNS_R_BADALG || result == DNS_R_EXPIRED)
+ result = ISC_R_SUCCESS;
+ } while (result == ISC_R_SUCCESS);
}
diff --git a/contrib/bind9/lib/dns/validator.c b/contrib/bind9/lib/dns/validator.c
index 4ecec8d..6c0d38d 100644
--- a/contrib/bind9/lib/dns/validator.c
+++ b/contrib/bind9/lib/dns/validator.c
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004-2010 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004-2011 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 2000-2003 Internet Software Consortium.
*
* Permission to use, copy, modify, and/or distribute this software for any
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: validator.c,v 1.164.12.23.4.1 2011-05-27 00:19:19 each Exp $ */
+/* $Id: validator.c,v 1.197.40.3 2011-06-21 20:15:54 each Exp $ */
#include <config.h>
@@ -28,17 +28,17 @@
#include <isc/util.h>
#include <dns/db.h>
-#include <dns/ds.h>
#include <dns/dnssec.h>
+#include <dns/ds.h>
#include <dns/events.h>
#include <dns/keytable.h>
+#include <dns/keyvalues.h>
#include <dns/log.h>
#include <dns/message.h>
#include <dns/ncache.h>
#include <dns/nsec.h>
#include <dns/nsec3.h>
#include <dns/rdata.h>
-#include <dns/rdatastruct.h>
#include <dns/rdataset.h>
#include <dns/rdatatype.h>
#include <dns/resolver.h>
@@ -129,6 +129,8 @@
#define SHUTDOWN(v) (((v)->attributes & VALATTR_SHUTDOWN) != 0)
#define CANCELED(v) (((v)->attributes & VALATTR_CANCELED) != 0)
+#define NEGATIVE(r) (((r)->attributes & DNS_RDATASETATTR_NEGATIVE) != 0)
+
static void
destroy(dns_validator_t *val);
@@ -253,9 +255,17 @@ dlv_algorithm_supported(dns_validator_t *val) {
dlv.algorithm))
continue;
+#ifdef HAVE_OPENSSL_GOST
+ if (dlv.digest_type != DNS_DSDIGEST_SHA256 &&
+ dlv.digest_type != DNS_DSDIGEST_SHA1 &&
+ dlv.digest_type != DNS_DSDIGEST_GOST)
+ continue;
+#else
if (dlv.digest_type != DNS_DSDIGEST_SHA256 &&
dlv.digest_type != DNS_DSDIGEST_SHA1)
continue;
+#endif
+
return (ISC_TRUE);
}
@@ -381,7 +391,7 @@ isdelegation(dns_name_t *name, dns_rdataset_t *rdataset,
}
/*%
- * We have been asked to to look for a key.
+ * We have been asked to look for a key.
* If found resume the validation process.
* If not found fail the validation process.
*/
@@ -580,7 +590,8 @@ dsfetched2(isc_task_t *task, isc_event_t *event) {
if (isdelegation(tname, &val->frdataset, eresult)) {
if (val->mustbesecure) {
validator_log(val, ISC_LOG_WARNING,
- "must be secure failure");
+ "must be secure failure, no DS"
+ " and this is a delegation");
validator_done(val, DNS_R_MUSTBESECURE);
} else if (val->view->dlv == NULL || DLVTRIED(val)) {
markanswer(val, "dsfetched2");
@@ -733,7 +744,7 @@ dsvalidated(isc_task_t *task, isc_event_t *event) {
name = dns_fixedname_name(&val->fname);
if ((val->attributes & VALATTR_INSECURITY) != 0 &&
val->frdataset.covers == dns_rdatatype_ds &&
- val->frdataset.type == 0 &&
+ NEGATIVE(&val->frdataset) &&
isdelegation(name, &val->frdataset, DNS_R_NCACHENXRRSET)) {
if (val->mustbesecure) {
validator_log(val, ISC_LOG_WARNING,
@@ -1087,7 +1098,7 @@ nsec3noexistnodata(dns_validator_t *val, dns_name_t* name,
if (ns && !soa) {
if (!atparent) {
/*
- * This NSEC record is from somewhere
+ * This NSEC3 record is from somewhere
* higher in the DNS, and at the
* parent of a delegation. It can not
* be legitimately used here.
@@ -1098,7 +1109,7 @@ nsec3noexistnodata(dns_validator_t *val, dns_name_t* name,
}
} else if (atparent && ns && soa) {
/*
- * This NSEC record is from the child.
+ * This NSEC3 record is from the child.
* It can not be legitimately used here.
*/
validator_log(val, ISC_LOG_DEBUG(3),
@@ -1503,8 +1514,11 @@ create_fetch(dns_validator_t *val, dns_name_t *name, dns_rdatatype_t type,
if (dns_rdataset_isassociated(&val->fsigrdataset))
dns_rdataset_disassociate(&val->fsigrdataset);
- if (check_deadlock(val, name, type, NULL, NULL))
+ if (check_deadlock(val, name, type, NULL, NULL)) {
+ validator_log(val, ISC_LOG_DEBUG(3),
+ "deadlock found (create_fetch)");
return (DNS_R_NOVALIDSIG);
+ }
validator_logcreate(val, name, type, caller, "fetch");
return (dns_resolver_createfetch(val->view->resolver, name, type,
@@ -1526,8 +1540,11 @@ create_validator(dns_validator_t *val, dns_name_t *name, dns_rdatatype_t type,
{
isc_result_t result;
- if (check_deadlock(val, name, type, rdataset, sigrdataset))
+ if (check_deadlock(val, name, type, rdataset, sigrdataset)) {
+ validator_log(val, ISC_LOG_DEBUG(3),
+ "deadlock found (create_validator)");
return (DNS_R_NOVALIDSIG);
+ }
validator_logcreate(val, name, type, caller, "validator");
result = dns_validator_create(val->view, name, type,
@@ -1766,16 +1783,23 @@ compute_keytag(dns_rdata_t *rdata, dns_rdata_dnskey_t *key) {
*/
static isc_boolean_t
isselfsigned(dns_validator_t *val) {
+ dns_fixedname_t fixed;
dns_rdataset_t *rdataset, *sigrdataset;
dns_rdata_t rdata = DNS_RDATA_INIT;
dns_rdata_t sigrdata = DNS_RDATA_INIT;
dns_rdata_dnskey_t key;
dns_rdata_rrsig_t sig;
dns_keytag_t keytag;
+ dns_name_t *name;
isc_result_t result;
+ dst_key_t *dstkey;
+ isc_mem_t *mctx;
+ isc_boolean_t answer = ISC_FALSE;
rdataset = val->event->rdataset;
sigrdataset = val->event->sigrdataset;
+ name = val->event->name;
+ mctx = val->view->mctx;
INSIST(rdataset->type == dns_rdatatype_dnskey);
@@ -1797,12 +1821,31 @@ isselfsigned(dns_validator_t *val) {
result = dns_rdata_tostruct(&sigrdata, &sig, NULL);
RUNTIME_CHECK(result == ISC_R_SUCCESS);
- if (sig.algorithm == key.algorithm &&
- sig.keyid == keytag)
- return (ISC_TRUE);
+ if (sig.algorithm != key.algorithm ||
+ sig.keyid != keytag ||
+ !dns_name_equal(name, &sig.signer))
+ continue;
+
+ dstkey = NULL;
+ result = dns_dnssec_keyfromrdata(name, &rdata, mctx,
+ &dstkey);
+ if (result != ISC_R_SUCCESS)
+ continue;
+
+ result = dns_dnssec_verify2(name, rdataset, dstkey,
+ ISC_TRUE, mctx, &sigrdata,
+ dns_fixedname_name(&fixed));
+ dst_key_free(&dstkey);
+ if (result != ISC_R_SUCCESS)
+ continue;
+ if ((key.flags & DNS_KEYFLAG_REVOKE) == 0) {
+ answer = ISC_TRUE;
+ continue;
+ }
+ dns_view_untrust(val->view, name, &key, mctx);
}
}
- return (ISC_FALSE);
+ return (answer);
}
/*%
@@ -1944,6 +1987,8 @@ validate(dns_validator_t *val, isc_boolean_t resume) {
break;
}
val->key = dns_keynode_key(val->keynode);
+ if (val->key == NULL)
+ break;
} else {
if (get_dst_key(val, val->siginfo, val->keyset)
!= ISC_R_SUCCESS)
@@ -1960,8 +2005,6 @@ validate(dns_validator_t *val, isc_boolean_t resume) {
isc_stdtime_get(&now);
ttl = ISC_MIN(event->rdataset->ttl,
val->siginfo->timeexpire - now);
- if (val->keyset != NULL)
- ttl = ISC_MIN(ttl, val->keyset->ttl);
event->rdataset->ttl = ttl;
event->sigrdataset->ttl = ttl;
}
@@ -1990,7 +2033,8 @@ validate(dns_validator_t *val, isc_boolean_t resume) {
} else if (result == ISC_R_SUCCESS) {
marksecure(event);
validator_log(val, ISC_LOG_DEBUG(3),
- "marking as secure");
+ "marking as secure, "
+ "noqname proof not needed");
return (result);
} else {
validator_log(val, ISC_LOG_DEBUG(3),
@@ -2011,25 +2055,102 @@ validate(dns_validator_t *val, isc_boolean_t resume) {
}
/*%
+ * Check whether this DNSKEY (keyrdata) signed the DNSKEY RRset
+ * (val->event->rdataset).
+ */
+static isc_result_t
+checkkey(dns_validator_t *val, dns_rdata_t *keyrdata, isc_uint16_t keyid,
+ dns_secalg_t algorithm)
+{
+ dns_rdata_rrsig_t sig;
+ dst_key_t *dstkey = NULL;
+ isc_result_t result;
+
+ for (result = dns_rdataset_first(val->event->sigrdataset);
+ result == ISC_R_SUCCESS;
+ result = dns_rdataset_next(val->event->sigrdataset))
+ {
+ dns_rdata_t rdata = DNS_RDATA_INIT;
+
+ dns_rdataset_current(val->event->sigrdataset, &rdata);
+ result = dns_rdata_tostruct(&rdata, &sig, NULL);
+ RUNTIME_CHECK(result == ISC_R_SUCCESS);
+ if (keyid != sig.keyid || algorithm != sig.algorithm)
+ continue;
+ if (dstkey == NULL) {
+ result = dns_dnssec_keyfromrdata(val->event->name,
+ keyrdata,
+ val->view->mctx,
+ &dstkey);
+ if (result != ISC_R_SUCCESS)
+ /*
+ * This really shouldn't happen, but...
+ */
+ continue;
+ }
+ result = verify(val, dstkey, &rdata, sig.keyid);
+ if (result == ISC_R_SUCCESS)
+ break;
+ }
+ if (dstkey != NULL)
+ dst_key_free(&dstkey);
+ return (result);
+}
+
+/*%
+ * Find the DNSKEY that corresponds to the DS.
+ */
+static isc_result_t
+keyfromds(dns_validator_t *val, dns_rdataset_t *rdataset, dns_rdata_t *dsrdata,
+ isc_uint8_t digest, isc_uint16_t keyid, dns_secalg_t algorithm,
+ dns_rdata_t *keyrdata)
+{
+ dns_keytag_t keytag;
+ dns_rdata_dnskey_t key;
+ isc_result_t result;
+ unsigned char dsbuf[DNS_DS_BUFFERSIZE];
+
+ for (result = dns_rdataset_first(rdataset);
+ result == ISC_R_SUCCESS;
+ result = dns_rdataset_next(rdataset))
+ {
+ dns_rdata_t newdsrdata = DNS_RDATA_INIT;
+
+ dns_rdata_reset(keyrdata);
+ dns_rdataset_current(rdataset, keyrdata);
+ result = dns_rdata_tostruct(keyrdata, &key, NULL);
+ RUNTIME_CHECK(result == ISC_R_SUCCESS);
+ keytag = compute_keytag(keyrdata, &key);
+ if (keyid != keytag || algorithm != key.algorithm)
+ continue;
+ dns_rdata_reset(&newdsrdata);
+ result = dns_ds_buildrdata(val->event->name, keyrdata, digest,
+ dsbuf, &newdsrdata);
+ if (result != ISC_R_SUCCESS) {
+ validator_log(val, ISC_LOG_DEBUG(3),
+ "dns_ds_buildrdata() -> %s",
+ dns_result_totext(result));
+ continue;
+ }
+ if (dns_rdata_compare(dsrdata, &newdsrdata) == 0)
+ break;
+ }
+ return (result);
+}
+
+/*%
* Validate the DNSKEY RRset by looking for a DNSKEY that matches a
* DLV record and that also verifies the DNSKEY RRset.
*/
static isc_result_t
dlv_validatezonekey(dns_validator_t *val) {
- dns_keytag_t keytag;
dns_rdata_dlv_t dlv;
- dns_rdata_dnskey_t key;
- dns_rdata_rrsig_t sig;
dns_rdata_t dlvrdata = DNS_RDATA_INIT;
dns_rdata_t keyrdata = DNS_RDATA_INIT;
- dns_rdata_t newdsrdata = DNS_RDATA_INIT;
- dns_rdata_t sigrdata = DNS_RDATA_INIT;
dns_rdataset_t trdataset;
- dst_key_t *dstkey;
isc_boolean_t supported_algorithm;
isc_result_t result;
- unsigned char dsbuf[DNS_DS_BUFFERSIZE];
- isc_uint8_t digest_type;
+ char digest_types[256];
validator_log(val, ISC_LOG_DEBUG(3), "dlv_validatezonekey");
@@ -2046,7 +2167,7 @@ dlv_validatezonekey(dns_validator_t *val) {
* need to ignore DNS_DSDIGEST_SHA1 if a DNS_DSDIGEST_SHA256
* is present.
*/
- digest_type = DNS_DSDIGEST_SHA1;
+ memset(digest_types, 1, sizeof(digest_types));
for (result = dns_rdataset_first(&val->dlv);
result == ISC_R_SUCCESS;
result = dns_rdataset_next(&val->dlv)) {
@@ -2062,7 +2183,7 @@ dlv_validatezonekey(dns_validator_t *val) {
if (dlv.digest_type == DNS_DSDIGEST_SHA256 &&
dlv.length == ISC_SHA256_DIGESTLENGTH) {
- digest_type = DNS_DSDIGEST_SHA256;
+ digest_types[DNS_DSDIGEST_SHA1] = 0;
break;
}
}
@@ -2080,7 +2201,7 @@ dlv_validatezonekey(dns_validator_t *val) {
dlv.digest_type))
continue;
- if (dlv.digest_type != digest_type)
+ if (digest_types[dlv.digest_type] == 0)
continue;
if (!dns_resolver_algorithm_supported(val->view->resolver,
@@ -2093,70 +2214,27 @@ dlv_validatezonekey(dns_validator_t *val) {
dns_rdataset_init(&trdataset);
dns_rdataset_clone(val->event->rdataset, &trdataset);
- for (result = dns_rdataset_first(&trdataset);
- result == ISC_R_SUCCESS;
- result = dns_rdataset_next(&trdataset))
- {
- dns_rdata_reset(&keyrdata);
- dns_rdataset_current(&trdataset, &keyrdata);
- result = dns_rdata_tostruct(&keyrdata, &key, NULL);
- RUNTIME_CHECK(result == ISC_R_SUCCESS);
- keytag = compute_keytag(&keyrdata, &key);
- if (dlv.key_tag != keytag ||
- dlv.algorithm != key.algorithm)
- continue;
- dns_rdata_reset(&newdsrdata);
- result = dns_ds_buildrdata(val->event->name,
- &keyrdata, dlv.digest_type,
- dsbuf, &newdsrdata);
- if (result != ISC_R_SUCCESS) {
- validator_log(val, ISC_LOG_DEBUG(3),
- "dns_ds_buildrdata() -> %s",
- dns_result_totext(result));
- continue;
- }
- /* Covert to DLV */
- newdsrdata.type = dns_rdatatype_dlv;
- if (dns_rdata_compare(&dlvrdata, &newdsrdata) == 0)
- break;
- }
+ /*
+ * Convert to DLV to DS and find matching DNSKEY.
+ */
+ dlvrdata.type = dns_rdatatype_ds;
+ result = keyfromds(val, &trdataset, &dlvrdata,
+ dlv.digest_type, dlv.key_tag,
+ dlv.algorithm, &keyrdata);
if (result != ISC_R_SUCCESS) {
dns_rdataset_disassociate(&trdataset);
validator_log(val, ISC_LOG_DEBUG(3),
"no DNSKEY matching DLV");
continue;
}
+
validator_log(val, ISC_LOG_DEBUG(3),
"Found matching DLV record: checking for signature");
+ /*
+ * Check that this DNSKEY signed the DNSKEY rrset.
+ */
+ result = checkkey(val, &keyrdata, dlv.key_tag, dlv.algorithm);
- for (result = dns_rdataset_first(val->event->sigrdataset);
- result == ISC_R_SUCCESS;
- result = dns_rdataset_next(val->event->sigrdataset))
- {
- dns_rdata_reset(&sigrdata);
- dns_rdataset_current(val->event->sigrdataset,
- &sigrdata);
- result = dns_rdata_tostruct(&sigrdata, &sig, NULL);
- RUNTIME_CHECK(result == ISC_R_SUCCESS);
- if (dlv.key_tag != sig.keyid ||
- dlv.algorithm != sig.algorithm)
- continue;
- dstkey = NULL;
- result = dns_dnssec_keyfromrdata(val->event->name,
- &keyrdata,
- val->view->mctx,
- &dstkey);
- if (result != ISC_R_SUCCESS)
- /*
- * This really shouldn't happen, but...
- */
- continue;
-
- result = verify(val, dstkey, &sigrdata, sig.keyid);
- dst_key_free(&dstkey);
- if (result == ISC_R_SUCCESS)
- break;
- }
dns_rdataset_disassociate(&trdataset);
if (result == ISC_R_SUCCESS)
break;
@@ -2165,12 +2243,13 @@ dlv_validatezonekey(dns_validator_t *val) {
}
if (result == ISC_R_SUCCESS) {
marksecure(val->event);
- validator_log(val, ISC_LOG_DEBUG(3), "marking as secure");
+ validator_log(val, ISC_LOG_DEBUG(3), "marking as secure (dlv)");
return (result);
} else if (result == ISC_R_NOMORE && !supported_algorithm) {
if (val->mustbesecure) {
validator_log(val, ISC_LOG_WARNING,
- "must be secure failure");
+ "must be secure failure,"
+ "no supported algorithm/digest (dlv)");
return (DNS_R_MUSTBESECURE);
}
validator_log(val, ISC_LOG_DEBUG(3),
@@ -2182,7 +2261,8 @@ dlv_validatezonekey(dns_validator_t *val) {
}
/*%
- * Attempts positive response validation of an RRset containing zone keys.
+ * Attempts positive response validation of an RRset containing zone keys
+ * (i.e. a DNSKEY rrset).
*
* Returns:
* \li ISC_R_SUCCESS Validation completed successfully
@@ -2196,19 +2276,15 @@ validatezonekey(dns_validator_t *val) {
dns_validatorevent_t *event;
dns_rdataset_t trdataset;
dns_rdata_t dsrdata = DNS_RDATA_INIT;
- dns_rdata_t newdsrdata = DNS_RDATA_INIT;
dns_rdata_t keyrdata = DNS_RDATA_INIT;
dns_rdata_t sigrdata = DNS_RDATA_INIT;
- unsigned char dsbuf[DNS_DS_BUFFERSIZE];
char namebuf[DNS_NAME_FORMATSIZE];
- dns_keytag_t keytag;
dns_rdata_ds_t ds;
- dns_rdata_dnskey_t key;
dns_rdata_rrsig_t sig;
dst_key_t *dstkey;
isc_boolean_t supported_algorithm;
isc_boolean_t atsep = ISC_FALSE;
- isc_uint8_t digest_type;
+ char digest_types[256];
/*
* Caller must be holding the validator lock.
@@ -2257,8 +2333,7 @@ validatezonekey(dns_validator_t *val) {
result = dns_keytable_findkeynode(val->keytable,
val->event->name,
sig.algorithm,
- sig.keyid,
- &keynode);
+ sig.keyid, &keynode);
if (result == ISC_R_NOTFOUND &&
dns_keytable_finddeepestmatch(val->keytable,
val->event->name, found) != ISC_R_SUCCESS) {
@@ -2282,11 +2357,18 @@ validatezonekey(dns_validator_t *val) {
while (result == ISC_R_SUCCESS) {
dns_keynode_t *nextnode = NULL;
dstkey = dns_keynode_key(keynode);
+ if (dstkey == NULL) {
+ dns_keytable_detachkeynode(
+ val->keytable,
+ &keynode);
+ break;
+ }
result = verify(val, dstkey, &sigrdata,
sig.keyid);
if (result == ISC_R_SUCCESS) {
- dns_keytable_detachkeynode(val->keytable,
- &keynode);
+ dns_keytable_detachkeynode(
+ val->keytable,
+ &keynode);
break;
}
result = dns_keytable_findnextkeynode(
@@ -2316,8 +2398,8 @@ validatezonekey(dns_validator_t *val) {
sizeof(namebuf));
validator_log(val, ISC_LOG_NOTICE,
"unable to find a DNSKEY which verifies "
- "the DNSKEY RRset and also matches one "
- "of specified trusted-keys for '%s'",
+ "the DNSKEY RRset and also matches a "
+ "trusted key for '%s'",
namebuf);
validator_log(val, ISC_LOG_NOTICE,
"please check the 'trusted-keys' for "
@@ -2411,7 +2493,8 @@ validatezonekey(dns_validator_t *val) {
if (val->dsset->trust < dns_trust_secure) {
if (val->mustbesecure) {
validator_log(val, ISC_LOG_WARNING,
- "must be secure failure");
+ "must be secure failure,"
+ " insecure DS");
return (DNS_R_MUSTBESECURE);
}
if (val->view->dlv == NULL || DLVTRIED(val)) {
@@ -2435,7 +2518,7 @@ validatezonekey(dns_validator_t *val) {
* need to ignore DNS_DSDIGEST_SHA1 if a DNS_DSDIGEST_SHA256
* is present.
*/
- digest_type = DNS_DSDIGEST_SHA1;
+ memset(digest_types, 1, sizeof(digest_types));
for (result = dns_rdataset_first(val->dsset);
result == ISC_R_SUCCESS;
result = dns_rdataset_next(val->dsset)) {
@@ -2451,7 +2534,7 @@ validatezonekey(dns_validator_t *val) {
if (ds.digest_type == DNS_DSDIGEST_SHA256 &&
ds.length == ISC_SHA256_DIGESTLENGTH) {
- digest_type = DNS_DSDIGEST_SHA256;
+ digest_types[DNS_DSDIGEST_SHA1] = 0;
break;
}
}
@@ -2469,7 +2552,7 @@ validatezonekey(dns_validator_t *val) {
ds.digest_type))
continue;
- if (ds.digest_type != digest_type)
+ if (digest_types[ds.digest_type] == 0)
continue;
if (!dns_resolver_algorithm_supported(val->view->resolver,
@@ -2483,29 +2566,10 @@ validatezonekey(dns_validator_t *val) {
dns_rdataset_clone(val->event->rdataset, &trdataset);
/*
- * Look for the KEY that matches the DS record.
+ * Find matching DNSKEY from DS.
*/
- for (result = dns_rdataset_first(&trdataset);
- result == ISC_R_SUCCESS;
- result = dns_rdataset_next(&trdataset))
- {
- dns_rdata_reset(&keyrdata);
- dns_rdataset_current(&trdataset, &keyrdata);
- result = dns_rdata_tostruct(&keyrdata, &key, NULL);
- RUNTIME_CHECK(result == ISC_R_SUCCESS);
- keytag = compute_keytag(&keyrdata, &key);
- if (ds.key_tag != keytag ||
- ds.algorithm != key.algorithm)
- continue;
- dns_rdata_reset(&newdsrdata);
- result = dns_ds_buildrdata(val->event->name,
- &keyrdata, ds.digest_type,
- dsbuf, &newdsrdata);
- if (result != ISC_R_SUCCESS)
- continue;
- if (dns_rdata_compare(&dsrdata, &newdsrdata) == 0)
- break;
- }
+ result = keyfromds(val, &trdataset, &dsrdata, ds.digest_type,
+ ds.key_tag, ds.algorithm, &keyrdata);
if (result != ISC_R_SUCCESS) {
dns_rdataset_disassociate(&trdataset);
validator_log(val, ISC_LOG_DEBUG(3),
@@ -2513,38 +2577,11 @@ validatezonekey(dns_validator_t *val) {
continue;
}
- for (result = dns_rdataset_first(val->event->sigrdataset);
- result == ISC_R_SUCCESS;
- result = dns_rdataset_next(val->event->sigrdataset))
- {
- dns_rdata_reset(&sigrdata);
- dns_rdataset_current(val->event->sigrdataset,
- &sigrdata);
- result = dns_rdata_tostruct(&sigrdata, &sig, NULL);
- RUNTIME_CHECK(result == ISC_R_SUCCESS);
- if (ds.key_tag != sig.keyid ||
- ds.algorithm != sig.algorithm)
- continue;
- if (!dns_name_equal(val->event->name, &sig.signer)) {
- validator_log(val, ISC_LOG_DEBUG(3),
- "DNSKEY signer mismatch");
- continue;
- }
- dstkey = NULL;
- result = dns_dnssec_keyfromrdata(val->event->name,
- &keyrdata,
- val->view->mctx,
- &dstkey);
- if (result != ISC_R_SUCCESS)
- /*
- * This really shouldn't happen, but...
- */
- continue;
- result = verify(val, dstkey, &sigrdata, sig.keyid);
- dst_key_free(&dstkey);
- if (result == ISC_R_SUCCESS)
- break;
- }
+ /*
+ * Check that this DNSKEY signed the DNSKEY rrset.
+ */
+ result = checkkey(val, &keyrdata, ds.key_tag, ds.algorithm);
+
dns_rdataset_disassociate(&trdataset);
if (result == ISC_R_SUCCESS)
break;
@@ -2553,20 +2590,24 @@ validatezonekey(dns_validator_t *val) {
}
if (result == ISC_R_SUCCESS) {
marksecure(event);
- validator_log(val, ISC_LOG_DEBUG(3), "marking as secure");
+ validator_log(val, ISC_LOG_DEBUG(3), "marking as secure (DS)");
return (result);
} else if (result == ISC_R_NOMORE && !supported_algorithm) {
if (val->mustbesecure) {
validator_log(val, ISC_LOG_WARNING,
- "must be secure failure");
+ "must be secure failure, "
+ "no supported algorithm/digest (DS)");
return (DNS_R_MUSTBESECURE);
}
validator_log(val, ISC_LOG_DEBUG(3),
"no supported algorithm/digest (DS)");
markanswer(val, "validatezonekey (3)");
return (ISC_R_SUCCESS);
- } else
+ } else {
+ validator_log(val, ISC_LOG_INFO,
+ "no valid signature found (DS)");
return (DNS_R_NOVALIDSIG);
+ }
}
/*%
@@ -3092,9 +3133,7 @@ nsecvalidate(dns_validator_t *val, isc_boolean_t resume) {
findnsec3proofs(val);
if (FOUNDNOQNAME(val) && FOUNDCLOSEST(val)) {
validator_log(val, ISC_LOG_DEBUG(3),
- "noqname proof found");
- validator_log(val, ISC_LOG_DEBUG(3),
- "marking as secure");
+ "marking as secure, noqname proof found");
marksecure(val->event);
return (ISC_R_SUCCESS);
} else if (FOUNDOPTOUT(val) &&
@@ -3141,7 +3180,6 @@ nsecvalidate(dns_validator_t *val, isc_boolean_t resume) {
marksecure(val->event);
return (ISC_R_SUCCESS);
}
- findnsec3proofs(val);
if (val->authfail != 0 && val->authcount == val->authfail)
return (DNS_R_BROKENCHAIN);
@@ -3343,7 +3381,8 @@ startfinddlvsep(dns_validator_t *val, dns_name_t *unsecure) {
namebuf);
if (dns_name_issubdomain(val->event->name, val->view->dlv)) {
- validator_log(val, ISC_LOG_WARNING, "must be secure failure");
+ validator_log(val, ISC_LOG_WARNING, "must be secure failure, "
+ " %s is under DLV (startfinddlvsep)", namebuf);
return (DNS_R_MUSTBESECURE);
}
@@ -3395,10 +3434,12 @@ finddlvsep(dns_validator_t *val, isc_boolean_t resume) {
INSIST(val->view->dlv != NULL);
if (!resume) {
-
if (dns_name_issubdomain(val->event->name, val->view->dlv)) {
+ dns_name_format(val->event->name, namebuf,
+ sizeof(namebuf));
validator_log(val, ISC_LOG_WARNING,
- "must be secure failure");
+ "must be secure failure, "
+ "%s is under DLV (finddlvsep)", namebuf);
return (DNS_R_MUSTBESECURE);
}
@@ -3466,8 +3507,11 @@ finddlvsep(dns_validator_t *val, isc_boolean_t resume) {
return (result);
return (DNS_R_WAIT);
}
- if (val->frdataset.trust < dns_trust_secure)
+ if (val->frdataset.trust < dns_trust_secure) {
+ validator_log(val, ISC_LOG_DEBUG(3),
+ "DLV not validated");
return (DNS_R_NOVALIDSIG);
+ }
val->havedlvsep = ISC_TRUE;
dns_rdataset_clone(&val->frdataset, &val->dlv);
return (ISC_R_SUCCESS);
@@ -3552,10 +3596,13 @@ proveunsecure(dns_validator_t *val, isc_boolean_t have_ds, isc_boolean_t resume)
if (result == ISC_R_NOTFOUND) {
if (val->mustbesecure) {
validator_log(val, ISC_LOG_WARNING,
- "must be secure failure");
+ "must be secure failure, "
+ "not beneath secure root");
result = DNS_R_MUSTBESECURE;
goto out;
- }
+ } else
+ validator_log(val, ISC_LOG_DEBUG(3),
+ "not beneath secure root");
if (val->view->dlv == NULL || DLVTRIED(val)) {
markanswer(val, "proveunsecure (1)");
return (ISC_R_SUCCESS);
@@ -3575,7 +3622,7 @@ proveunsecure(dns_validator_t *val, isc_boolean_t have_ds, isc_boolean_t resume)
/*
* If we have a DS rdataset and it is secure then check if
* the DS rdataset has a supported algorithm combination.
- * If not this is a insecure delegation as far as this
+ * If not this is an insecure delegation as far as this
* resolver is concerned. Fall back to DLV if available.
*/
if (have_ds && val->frdataset.trust >= dns_trust_secure &&
@@ -3586,7 +3633,8 @@ proveunsecure(dns_validator_t *val, isc_boolean_t have_ds, isc_boolean_t resume)
if ((val->view->dlv == NULL || DLVTRIED(val)) &&
val->mustbesecure) {
validator_log(val, ISC_LOG_WARNING,
- "must be secure failure at '%s'",
+ "must be secure failure at '%s', "
+ "can't fall back to DLV",
namebuf);
result = DNS_R_MUSTBESECURE;
goto out;
@@ -3628,7 +3676,7 @@ proveunsecure(dns_validator_t *val, isc_boolean_t have_ds, isc_boolean_t resume)
if (result == DNS_R_NXRRSET || result == DNS_R_NCACHENXRRSET) {
/*
* There is no DS. If this is a delegation,
- * we maybe done.
+ * we may be done.
*/
/*
* If we have "trust == answer" then this namespace
@@ -3641,7 +3689,7 @@ proveunsecure(dns_validator_t *val, isc_boolean_t have_ds, isc_boolean_t resume)
&val->frdataset,
NULL, dsvalidated,
"proveunsecure");
- if (result != ISC_R_SUCCESS)
+ if (result != ISC_R_SUCCESS)
goto out;
return (DNS_R_WAIT);
}
@@ -3653,12 +3701,13 @@ proveunsecure(dns_validator_t *val, isc_boolean_t have_ds, isc_boolean_t resume)
if (result == DNS_R_NXRRSET &&
!dns_rdataset_isassociated(&val->frdataset) &&
dns_view_findzonecut2(val->view, tname, found,
- 0, 0, ISC_FALSE, ISC_FALSE,
- NULL, NULL) == ISC_R_SUCCESS &&
+ 0, 0, ISC_FALSE, ISC_FALSE,
+ NULL, NULL) == ISC_R_SUCCESS &&
dns_name_equal(tname, found)) {
if (val->mustbesecure) {
validator_log(val, ISC_LOG_WARNING,
- "must be secure failure");
+ "must be secure failure, "
+ "no DS at zone cut");
return (DNS_R_MUSTBESECURE);
}
if (val->view->dlv == NULL || DLVTRIED(val)) {
@@ -3674,13 +3723,18 @@ proveunsecure(dns_validator_t *val, isc_boolean_t have_ds, isc_boolean_t resume)
* there's no way of validating existing
* negative response blobs, give up.
*/
+ validator_log(val, ISC_LOG_WARNING,
+ "can't validate existing "
+ "negative responses (no DS)");
result = DNS_R_NOVALIDSIG;
goto out;
}
if (isdelegation(tname, &val->frdataset, result)) {
if (val->mustbesecure) {
validator_log(val, ISC_LOG_WARNING,
- "must be secure failure");
+ "must be secure failure, "
+ "%s is a delegation",
+ namebuf);
return (DNS_R_MUSTBESECURE);
}
if (val->view->dlv == NULL || DLVTRIED(val)) {
@@ -3703,7 +3757,10 @@ proveunsecure(dns_validator_t *val, isc_boolean_t have_ds, isc_boolean_t resume)
if (val->mustbesecure) {
validator_log(val,
ISC_LOG_WARNING,
- "must be secure failure");
+ "must be secure failure, "
+ "no supported algorithm/"
+ "digest (%s/DS)",
+ namebuf);
result = DNS_R_MUSTBESECURE;
goto out;
}
@@ -3721,6 +3778,8 @@ proveunsecure(dns_validator_t *val, isc_boolean_t have_ds, isc_boolean_t resume)
}
else if (!dns_rdataset_isassociated(&val->fsigrdataset))
{
+ validator_log(val, ISC_LOG_DEBUG(3),
+ "DS is unsigned");
result = DNS_R_NOVALIDSIG;
goto out;
}
@@ -3769,6 +3828,10 @@ proveunsecure(dns_validator_t *val, isc_boolean_t have_ds, isc_boolean_t resume)
* there's no way of validating existing
* negative response blobs, give up.
*/
+ validator_log(val, ISC_LOG_WARNING,
+ "can't validate existing "
+ "negative responses "
+ "(not a zone cut)");
result = DNS_R_NOVALIDSIG;
goto out;
}
@@ -3788,7 +3851,7 @@ proveunsecure(dns_validator_t *val, isc_boolean_t have_ds, isc_boolean_t resume)
/* Couldn't complete insecurity proof */
validator_log(val, ISC_LOG_DEBUG(3), "insecurity proof failed");
- return (DNS_R_NOTINSECURE); /* Couldn't complete insecurity proof */
+ return (DNS_R_NOTINSECURE);
out:
if (dns_rdataset_isassociated(&val->frdataset))
@@ -3827,7 +3890,7 @@ dlv_validator_start(dns_validator_t *val) {
* \li 3. a negative answer (secure or unsecure).
*
* Note a answer that appears to be a secure positive answer may actually
- * be a unsecure positive answer.
+ * be an unsecure positive answer.
*/
static void
validator_start(isc_task_t *task, isc_event_t *event) {
@@ -3893,6 +3956,10 @@ validator_start(isc_task_t *task, isc_event_t *event) {
val->attributes |= VALATTR_INSECURITY;
result = proveunsecure(val, ISC_FALSE, ISC_FALSE);
+ if (result == DNS_R_NOTINSECURE)
+ validator_log(val, ISC_LOG_INFO,
+ "got insecure response; "
+ "parent indicates it should be secure");
} else if (val->event->rdataset == NULL &&
val->event->sigrdataset == NULL)
{
@@ -3909,7 +3976,7 @@ validator_start(isc_task_t *task, isc_event_t *event) {
val->attributes |= VALATTR_NEEDNODATA;
result = nsecvalidate(val, ISC_FALSE);
} else if (val->event->rdataset != NULL &&
- val->event->rdataset->type == 0)
+ NEGATIVE(val->event->rdataset))
{
/*
* This is a nonexistence validation.
@@ -3965,6 +4032,7 @@ dns_validator_create(dns_view_t *view, dns_name_t *name, dns_rdatatype_t type,
return (ISC_R_NOMEMORY);
val->view = NULL;
dns_view_weakattach(view, &val->view);
+
event = (dns_validatorevent_t *)
isc_event_allocate(view->mctx, task,
DNS_EVENT_VALIDATORSTART,
@@ -3993,8 +4061,12 @@ dns_validator_create(dns_view_t *view, dns_name_t *name, dns_rdatatype_t type,
val->fetch = NULL;
val->subvalidator = NULL;
val->parent = NULL;
+
val->keytable = NULL;
- dns_keytable_attach(val->view->secroots, &val->keytable);
+ result = dns_view_getsecroots(val->view, &val->keytable);
+ if (result != ISC_R_SUCCESS)
+ return (result);
+
val->keynode = NULL;
val->key = NULL;
val->siginfo = NULL;
diff --git a/contrib/bind9/lib/dns/view.c b/contrib/bind9/lib/dns/view.c
index 809cc15..24f925a 100644
--- a/contrib/bind9/lib/dns/view.c
+++ b/contrib/bind9/lib/dns/view.c
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004-2010 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004-2011 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 1999-2003 Internet Software Consortium.
*
* Permission to use, copy, modify, and/or distribute this software for any
@@ -15,13 +15,16 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: view.c,v 1.150.84.6 2010-09-24 08:09:08 marka Exp $ */
+/* $Id: view.c,v 1.178 2011-01-13 09:53:04 marka Exp $ */
/*! \file */
#include <config.h>
+#include <isc/file.h>
#include <isc/hash.h>
+#include <isc/print.h>
+#include <isc/sha2.h>
#include <isc/stats.h>
#include <isc/string.h> /* Required for HP/UX (and others?) */
#include <isc/task.h>
@@ -33,17 +36,24 @@
#include <dns/cache.h>
#include <dns/db.h>
#include <dns/dlz.h>
+#ifdef BIND9
+#include <dns/dns64.h>
+#endif
+#include <dns/dnssec.h>
#include <dns/events.h>
#include <dns/forward.h>
#include <dns/keytable.h>
+#include <dns/keyvalues.h>
#include <dns/master.h>
#include <dns/masterdump.h>
#include <dns/order.h>
#include <dns/peer.h>
+#include <dns/rbt.h>
#include <dns/rdataset.h>
#include <dns/request.h>
#include <dns/resolver.h>
#include <dns/result.h>
+#include <dns/rpz.h>
#include <dns/stats.h>
#include <dns/tsig.h>
#include <dns/zone.h>
@@ -85,6 +95,7 @@ dns_view_create(isc_mem_t *mctx, dns_rdataclass_t rdclass,
if (result != ISC_R_SUCCESS)
goto cleanup_name;
+#ifdef BIND9
view->zonetable = NULL;
result = dns_zt_create(mctx, rdclass, &view->zonetable);
if (result != ISC_R_SUCCESS) {
@@ -94,24 +105,8 @@ dns_view_create(isc_mem_t *mctx, dns_rdataclass_t rdclass,
result = ISC_R_UNEXPECTED;
goto cleanup_mutex;
}
- view->secroots = NULL;
- result = dns_keytable_create(mctx, &view->secroots);
- if (result != ISC_R_SUCCESS) {
- UNEXPECTED_ERROR(__FILE__, __LINE__,
- "dns_keytable_create() failed: %s",
- isc_result_totext(result));
- result = ISC_R_UNEXPECTED;
- goto cleanup_zt;
- }
- view->trustedkeys = NULL;
- result = dns_keytable_create(mctx, &view->trustedkeys);
- if (result != ISC_R_SUCCESS) {
- UNEXPECTED_ERROR(__FILE__, __LINE__,
- "dns_keytable_create() failed: %s",
- isc_result_totext(result));
- result = ISC_R_UNEXPECTED;
- goto cleanup_secroots;
- }
+#endif
+ view->secroots_priv = NULL;
view->fwdtable = NULL;
result = dns_fwdtable_create(mctx, &view->fwdtable);
if (result != ISC_R_SUCCESS) {
@@ -119,7 +114,7 @@ dns_view_create(isc_mem_t *mctx, dns_rdataclass_t rdclass,
"dns_fwdtable_create() failed: %s",
isc_result_totext(result));
result = ISC_R_UNEXPECTED;
- goto cleanup_trustedkeys;
+ goto cleanup_zt;
}
view->acache = NULL;
@@ -155,6 +150,9 @@ dns_view_create(isc_mem_t *mctx, dns_rdataclass_t rdclass,
view->rootexclude = NULL;
view->resstats = NULL;
view->resquerystats = NULL;
+ view->cacheshared = ISC_FALSE;
+ ISC_LIST_INIT(view->dns64);
+ view->dns64cnt = 0;
/*
* Initialize configuration data with default values.
@@ -179,6 +177,10 @@ dns_view_create(isc_mem_t *mctx, dns_rdataclass_t rdclass,
view->notifyacl = NULL;
view->updateacl = NULL;
view->upfwdacl = NULL;
+ view->denyansweracl = NULL;
+ view->answeracl_exclude = NULL;
+ view->denyanswernames = NULL;
+ view->answernames_exclude = NULL;
view->requestixfr = ISC_TRUE;
view->provideixfr = ISC_TRUE;
view->maxcachettl = 7 * 24 * 3600;
@@ -188,11 +190,20 @@ dns_view_create(isc_mem_t *mctx, dns_rdataclass_t rdclass,
view->flush = ISC_FALSE;
view->dlv = NULL;
view->maxudp = 0;
+ view->v4_aaaa = dns_v4_aaaa_ok;
+ view->v4_aaaa_acl = NULL;
+ ISC_LIST_INIT(view->rpz_zones);
dns_fixedname_init(&view->dlv_fixed);
+ view->managed_keys = NULL;
+#ifdef BIND9
+ view->new_zone_file = NULL;
+ view->new_zone_config = NULL;
+ view->cfg_destroy = NULL;
result = dns_order_create(view->mctx, &view->order);
if (result != ISC_R_SUCCESS)
goto cleanup_dynkeys;
+#endif
result = dns_peerlist_new(view->mctx, &view->peers);
if (result != ISC_R_SUCCESS)
@@ -222,10 +233,12 @@ dns_view_create(isc_mem_t *mctx, dns_rdataclass_t rdclass,
dns_peerlist_detach(&view->peers);
cleanup_order:
+#ifdef BIND9
dns_order_detach(&view->order);
cleanup_dynkeys:
- dns_tsigkeyring_destroy(&view->dynamickeys);
+#endif
+ dns_tsigkeyring_detach(&view->dynamickeys);
cleanup_references:
isc_refcount_destroy(&view->references);
@@ -233,16 +246,12 @@ dns_view_create(isc_mem_t *mctx, dns_rdataclass_t rdclass,
cleanup_fwdtable:
dns_fwdtable_destroy(&view->fwdtable);
- cleanup_trustedkeys:
- dns_keytable_detach(&view->trustedkeys);
-
- cleanup_secroots:
- dns_keytable_detach(&view->secroots);
-
cleanup_zt:
+#ifdef BIND9
dns_zt_detach(&view->zonetable);
cleanup_mutex:
+#endif
DESTROYLOCK(&view->lock);
cleanup_name:
@@ -256,6 +265,10 @@ dns_view_create(isc_mem_t *mctx, dns_rdataclass_t rdclass,
static inline void
destroy(dns_view_t *view) {
+#ifdef BIND9
+ dns_dns64_t *dns64;
+#endif
+
REQUIRE(!ISC_LINK_LINKED(view, link));
REQUIRE(isc_refcount_current(&view->references) == 0);
REQUIRE(view->weakrefs == 0);
@@ -263,23 +276,62 @@ destroy(dns_view_t *view) {
REQUIRE(ADBSHUTDOWN(view));
REQUIRE(REQSHUTDOWN(view));
+#ifdef BIND9
if (view->order != NULL)
dns_order_detach(&view->order);
+#endif
if (view->peers != NULL)
dns_peerlist_detach(&view->peers);
- if (view->dynamickeys != NULL)
- dns_tsigkeyring_destroy(&view->dynamickeys);
+
+ if (view->dynamickeys != NULL) {
+ isc_result_t result;
+ char template[20];
+ char keyfile[20];
+ FILE *fp = NULL;
+ int n;
+
+ n = snprintf(keyfile, sizeof(keyfile), "%s.tsigkeys",
+ view->name);
+ if (n > 0 && (size_t)n < sizeof(keyfile)) {
+ result = isc_file_mktemplate(keyfile, template,
+ sizeof(template));
+ if (result == ISC_R_SUCCESS)
+ (void)isc_file_openuniqueprivate(template, &fp);
+ }
+ if (fp == NULL)
+ dns_tsigkeyring_detach(&view->dynamickeys);
+ else {
+ result = dns_tsigkeyring_dumpanddetach(
+ &view->dynamickeys, fp);
+ if (result == ISC_R_SUCCESS) {
+ if (fclose(fp) == 0)
+ result = isc_file_rename(template,
+ keyfile);
+ if (result != ISC_R_SUCCESS)
+ (void)remove(template);
+ } else {
+ (void)fclose(fp);
+ (void)remove(template);
+ }
+ }
+ }
if (view->statickeys != NULL)
- dns_tsigkeyring_destroy(&view->statickeys);
+ dns_tsigkeyring_detach(&view->statickeys);
if (view->adb != NULL)
dns_adb_detach(&view->adb);
if (view->resolver != NULL)
dns_resolver_detach(&view->resolver);
+#ifdef BIND9
if (view->acache != NULL) {
if (view->cachedb != NULL)
dns_acache_putdb(view->acache, view->cachedb);
dns_acache_detach(&view->acache);
}
+ dns_rpz_view_destroy(view);
+#else
+ INSIST(view->acache == NULL);
+ INSIST(ISC_LIST_EMPTY(view->rpz_zones));
+#endif
if (view->requestmgr != NULL)
dns_requestmgr_detach(&view->requestmgr);
if (view->task != NULL)
@@ -318,6 +370,16 @@ destroy(dns_view_t *view) {
dns_acl_detach(&view->updateacl);
if (view->upfwdacl != NULL)
dns_acl_detach(&view->upfwdacl);
+ if (view->denyansweracl != NULL)
+ dns_acl_detach(&view->denyansweracl);
+ if (view->v4_aaaa_acl != NULL)
+ dns_acl_detach(&view->v4_aaaa_acl);
+ if (view->answeracl_exclude != NULL)
+ dns_rbt_destroy(&view->answeracl_exclude);
+ if (view->denyanswernames != NULL)
+ dns_rbt_destroy(&view->denyanswernames);
+ if (view->answernames_exclude != NULL)
+ dns_rbt_destroy(&view->answernames_exclude);
if (view->delonly != NULL) {
dns_name_t *name;
int i;
@@ -357,8 +419,19 @@ destroy(dns_view_t *view) {
isc_stats_detach(&view->resstats);
if (view->resquerystats != NULL)
dns_stats_detach(&view->resquerystats);
- dns_keytable_detach(&view->trustedkeys);
- dns_keytable_detach(&view->secroots);
+ if (view->secroots_priv != NULL)
+ dns_keytable_detach(&view->secroots_priv);
+#ifdef BIND9
+ for (dns64 = ISC_LIST_HEAD(view->dns64);
+ dns64 != NULL;
+ dns64 = ISC_LIST_HEAD(view->dns64)) {
+ dns_dns64_unlink(&view->dns64, dns64);
+ dns_dns64_destroy(&dns64);
+ }
+ if (view->managed_keys != NULL)
+ dns_zone_detach(&view->managed_keys);
+ dns_view_setnewzones(view, ISC_FALSE, NULL, NULL);
+#endif
dns_fwdtable_destroy(&view->fwdtable);
dns_aclenv_destroy(&view->aclenv);
DESTROYLOCK(&view->lock);
@@ -414,12 +487,19 @@ view_flushanddetach(dns_view_t **viewp, isc_boolean_t flush) {
dns_adb_shutdown(view->adb);
if (!REQSHUTDOWN(view))
dns_requestmgr_shutdown(view->requestmgr);
+#ifdef BIND9
if (view->acache != NULL)
dns_acache_shutdown(view->acache);
if (view->flush)
dns_zt_flushanddetach(&view->zonetable);
else
dns_zt_detach(&view->zonetable);
+ if (view->managed_keys != NULL) {
+ if (view->flush)
+ dns_zone_flush(view->managed_keys);
+ dns_zone_detach(&view->managed_keys);
+ }
+#endif
done = all_done(view);
UNLOCK(&view->lock);
}
@@ -440,6 +520,7 @@ dns_view_detach(dns_view_t **viewp) {
view_flushanddetach(viewp, ISC_FALSE);
}
+#ifdef BIND9
static isc_result_t
dialup(dns_zone_t *zone, void *dummy) {
UNUSED(dummy);
@@ -452,6 +533,7 @@ dns_view_dialup(dns_view_t *view) {
REQUIRE(DNS_VIEW_VALID(view));
(void)dns_zt_apply(view->zonetable, ISC_FALSE, dialup, NULL);
}
+#endif
void
dns_view_weakattach(dns_view_t *source, dns_view_t **targetp) {
@@ -633,12 +715,20 @@ dns_view_createresolver(dns_view_t *view,
void
dns_view_setcache(dns_view_t *view, dns_cache_t *cache) {
+ dns_view_setcache2(view, cache, ISC_FALSE);
+}
+
+void
+dns_view_setcache2(dns_view_t *view, dns_cache_t *cache, isc_boolean_t shared) {
REQUIRE(DNS_VIEW_VALID(view));
REQUIRE(!view->frozen);
+ view->cacheshared = shared;
if (view->cache != NULL) {
+#ifdef BIND9
if (view->acache != NULL)
dns_acache_putdb(view->acache, view->cachedb);
+#endif
dns_db_detach(&view->cachedb);
dns_cache_detach(&view->cache);
}
@@ -646,8 +736,17 @@ dns_view_setcache(dns_view_t *view, dns_cache_t *cache) {
dns_cache_attachdb(cache, &view->cachedb);
INSIST(DNS_DB_VALID(view->cachedb));
+#ifdef BIND9
if (view->acache != NULL)
dns_acache_setdb(view->acache, view->cachedb);
+#endif
+}
+
+isc_boolean_t
+dns_view_iscacheshared(dns_view_t *view) {
+ REQUIRE(DNS_VIEW_VALID(view));
+
+ return (view->cacheshared);
}
void
@@ -665,26 +764,52 @@ dns_view_setkeyring(dns_view_t *view, dns_tsig_keyring_t *ring) {
REQUIRE(DNS_VIEW_VALID(view));
REQUIRE(ring != NULL);
if (view->statickeys != NULL)
- dns_tsigkeyring_destroy(&view->statickeys);
- view->statickeys = ring;
+ dns_tsigkeyring_detach(&view->statickeys);
+ dns_tsigkeyring_attach(ring, &view->statickeys);
}
void
-dns_view_setdstport(dns_view_t *view, in_port_t dstport) {
+dns_view_setdynamickeyring(dns_view_t *view, dns_tsig_keyring_t *ring) {
REQUIRE(DNS_VIEW_VALID(view));
- view->dstport = dstport;
+ REQUIRE(ring != NULL);
+ if (view->dynamickeys != NULL)
+ dns_tsigkeyring_detach(&view->dynamickeys);
+ dns_tsigkeyring_attach(ring, &view->dynamickeys);
}
-isc_result_t
-dns_view_addzone(dns_view_t *view, dns_zone_t *zone) {
- isc_result_t result;
+void
+dns_view_getdynamickeyring(dns_view_t *view, dns_tsig_keyring_t **ringp) {
+ REQUIRE(DNS_VIEW_VALID(view));
+ REQUIRE(ringp != NULL && *ringp == NULL);
+ if (view->dynamickeys != NULL)
+ dns_tsigkeyring_attach(view->dynamickeys, ringp);
+}
+
+void
+dns_view_restorekeyring(dns_view_t *view) {
+ FILE *fp;
+ char keyfile[20];
+ int n;
REQUIRE(DNS_VIEW_VALID(view));
- REQUIRE(!view->frozen);
- result = dns_zt_mount(view->zonetable, zone);
+ if (view->dynamickeys != NULL) {
+ n = snprintf(keyfile, sizeof(keyfile), "%s.tsigkeys",
+ view->name);
+ if (n > 0 && (size_t)n < sizeof(keyfile)) {
+ fp = fopen(keyfile, "r");
+ if (fp != NULL) {
+ dns_keyring_restore(view->dynamickeys, fp);
+ (void)fclose(fp);
+ }
+ }
+ }
+}
- return (result);
+void
+dns_view_setdstport(dns_view_t *view, in_port_t dstport) {
+ REQUIRE(DNS_VIEW_VALID(view));
+ view->dstport = dstport;
}
void
@@ -699,6 +824,29 @@ dns_view_freeze(dns_view_t *view) {
view->frozen = ISC_TRUE;
}
+#ifdef BIND9
+void
+dns_view_thaw(dns_view_t *view) {
+ REQUIRE(DNS_VIEW_VALID(view));
+ REQUIRE(view->frozen);
+
+ view->frozen = ISC_FALSE;
+}
+
+isc_result_t
+dns_view_addzone(dns_view_t *view, dns_zone_t *zone) {
+ isc_result_t result;
+
+ REQUIRE(DNS_VIEW_VALID(view));
+ REQUIRE(!view->frozen);
+
+ result = dns_zt_mount(view->zonetable, zone);
+
+ return (result);
+}
+#endif
+
+#ifdef BIND9
isc_result_t
dns_view_findzone(dns_view_t *view, dns_name_t *name, dns_zone_t **zonep) {
isc_result_t result;
@@ -713,20 +861,37 @@ dns_view_findzone(dns_view_t *view, dns_name_t *name, dns_zone_t **zonep) {
return (result);
}
+#endif
isc_result_t
dns_view_find(dns_view_t *view, dns_name_t *name, dns_rdatatype_t type,
isc_stdtime_t now, unsigned int options, isc_boolean_t use_hints,
dns_db_t **dbp, dns_dbnode_t **nodep, dns_name_t *foundname,
- dns_rdataset_t *rdataset, dns_rdataset_t *sigrdataset)
+ dns_rdataset_t *rdataset, dns_rdataset_t *sigrdataset) {
+ return (dns_view_find2(view, name, type, now, options, use_hints,
+ ISC_FALSE, dbp, nodep, foundname, rdataset,
+ sigrdataset));
+}
+
+isc_result_t
+dns_view_find2(dns_view_t *view, dns_name_t *name, dns_rdatatype_t type,
+ isc_stdtime_t now, unsigned int options,
+ isc_boolean_t use_hints, isc_boolean_t use_static_stub,
+ dns_db_t **dbp, dns_dbnode_t **nodep, dns_name_t *foundname,
+ dns_rdataset_t *rdataset, dns_rdataset_t *sigrdataset)
{
isc_result_t result;
dns_db_t *db, *zdb;
dns_dbnode_t *node, *znode;
- isc_boolean_t is_cache;
+ isc_boolean_t is_cache, is_staticstub_zone;
dns_rdataset_t zrdataset, zsigrdataset;
dns_zone_t *zone;
+#ifndef BIND9
+ UNUSED(use_hints);
+ UNUSED(use_static_stub);
+#endif
+
/*
* Find an rdataset whose owner name is 'name', and whose type is
* 'type'.
@@ -752,15 +917,30 @@ dns_view_find(dns_view_t *view, dns_name_t *name, dns_rdatatype_t type,
zone = NULL;
db = NULL;
node = NULL;
+ is_staticstub_zone = ISC_FALSE;
+#ifdef BIND9
result = dns_zt_find(view->zonetable, name, 0, NULL, &zone);
+ if (zone != NULL && dns_zone_gettype(zone) == dns_zone_staticstub &&
+ !use_static_stub) {
+ result = ISC_R_NOTFOUND;
+ }
if (result == ISC_R_SUCCESS || result == DNS_R_PARTIALMATCH) {
result = dns_zone_getdb(zone, &db);
if (result != ISC_R_SUCCESS && view->cachedb != NULL)
dns_db_attach(view->cachedb, &db);
else if (result != ISC_R_SUCCESS)
goto cleanup;
+ if (dns_zone_gettype(zone) == dns_zone_staticstub &&
+ dns_name_equal(name, dns_zone_getorigin(zone))) {
+ is_staticstub_zone = ISC_TRUE;
+ }
} else if (result == ISC_R_NOTFOUND && view->cachedb != NULL)
dns_db_attach(view->cachedb, &db);
+#else
+ result = ISC_R_NOTFOUND;
+ if (view->cachedb != NULL)
+ dns_db_attach(view->cachedb, &db);
+#endif /* BIND9 */
else
goto cleanup;
@@ -773,8 +953,7 @@ dns_view_find(dns_view_t *view, dns_name_t *name, dns_rdatatype_t type,
result = dns_db_find(db, name, NULL, type, options,
now, &node, foundname, rdataset, sigrdataset);
- if (result == DNS_R_DELEGATION ||
- result == ISC_R_NOTFOUND) {
+ if (result == DNS_R_DELEGATION || result == ISC_R_NOTFOUND) {
if (dns_rdataset_isassociated(rdataset))
dns_rdataset_disassociate(rdataset);
if (sigrdataset != NULL &&
@@ -784,10 +963,13 @@ dns_view_find(dns_view_t *view, dns_name_t *name, dns_rdatatype_t type,
dns_db_detachnode(db, &node);
if (!is_cache) {
dns_db_detach(&db);
- if (view->cachedb != NULL) {
+ if (view->cachedb != NULL && !is_staticstub_zone) {
/*
* Either the answer is in the cache, or we
* don't know it.
+ * Note that if the result comes from a
+ * static-stub zone we stop the search here
+ * (see the function description in view.h).
*/
is_cache = ISC_TRUE;
dns_db_attach(view->cachedb, &db);
@@ -817,7 +999,7 @@ dns_view_find(dns_view_t *view, dns_name_t *name, dns_rdatatype_t type,
*/
result = ISC_R_NOTFOUND;
} else if (result == DNS_R_GLUE) {
- if (view->cachedb != NULL) {
+ if (view->cachedb != NULL && !is_staticstub_zone) {
/*
* We found an answer, but the cache may be better.
* Remember what we've got and go look in the cache.
@@ -843,6 +1025,7 @@ dns_view_find(dns_view_t *view, dns_name_t *name, dns_rdatatype_t type,
result = ISC_R_SUCCESS;
}
+#ifdef BIND9
if (result == ISC_R_NOTFOUND && use_hints && view->hints != NULL) {
if (dns_rdataset_isassociated(rdataset))
dns_rdataset_disassociate(rdataset);
@@ -877,6 +1060,7 @@ dns_view_find(dns_view_t *view, dns_name_t *name, dns_rdatatype_t type,
if (db == NULL && node != NULL)
dns_db_detachnode(view->hints, &node);
}
+#endif /* BIND9 */
cleanup:
if (dns_rdataset_isassociated(&zrdataset)) {
@@ -905,8 +1089,10 @@ dns_view_find(dns_view_t *view, dns_name_t *name, dns_rdatatype_t type,
} else
INSIST(node == NULL);
+#ifdef BIND9
if (zone != NULL)
dns_zone_detach(&zone);
+#endif
return (result);
}
@@ -969,12 +1155,12 @@ dns_view_findzonecut(dns_view_t *view, dns_name_t *name, dns_name_t *fname,
isc_result_t
dns_view_findzonecut2(dns_view_t *view, dns_name_t *name, dns_name_t *fname,
isc_stdtime_t now, unsigned int options,
- isc_boolean_t use_hints, isc_boolean_t use_cache,
+ isc_boolean_t use_hints, isc_boolean_t use_cache,
dns_rdataset_t *rdataset, dns_rdataset_t *sigrdataset)
{
isc_result_t result;
dns_db_t *db;
- isc_boolean_t is_cache, use_zone, try_hints;
+ isc_boolean_t is_cache, use_zone, try_hints, is_staticstub_zone;
dns_zone_t *zone;
dns_name_t *zfname;
dns_rdataset_t zrdataset, zsigrdataset;
@@ -986,6 +1172,7 @@ dns_view_findzonecut2(dns_view_t *view, dns_name_t *name, dns_name_t *fname,
db = NULL;
zone = NULL;
use_zone = ISC_FALSE;
+ is_staticstub_zone = ISC_FALSE;
try_hints = ISC_FALSE;
zfname = NULL;
@@ -999,9 +1186,16 @@ dns_view_findzonecut2(dns_view_t *view, dns_name_t *name, dns_name_t *fname,
/*
* Find the right database.
*/
+#ifdef BIND9
result = dns_zt_find(view->zonetable, name, 0, NULL, &zone);
- if (result == ISC_R_SUCCESS || result == DNS_R_PARTIALMATCH)
+ if (result == ISC_R_SUCCESS || result == DNS_R_PARTIALMATCH) {
result = dns_zone_getdb(zone, &db);
+ if (dns_zone_gettype(zone) == dns_zone_staticstub)
+ is_staticstub_zone = ISC_TRUE;
+ }
+#else
+ result = ISC_R_NOTFOUND;
+#endif
if (result == ISC_R_NOTFOUND) {
/*
* We're not directly authoritative for this query name, nor
@@ -1064,7 +1258,9 @@ dns_view_findzonecut2(dns_view_t *view, dns_name_t *name, dns_name_t *fname,
fname, rdataset, sigrdataset);
if (result == ISC_R_SUCCESS) {
if (zfname != NULL &&
- !dns_name_issubdomain(fname, zfname)) {
+ (!dns_name_issubdomain(fname, zfname) ||
+ (dns_zone_staticstub &&
+ dns_name_equal(fname, zfname)))) {
/*
* We found a zonecut in the cache, but our
* zone delegation is better.
@@ -1133,8 +1329,10 @@ dns_view_findzonecut2(dns_view_t *view, dns_name_t *name, dns_name_t *fname,
}
if (db != NULL)
dns_db_detach(&db);
+#ifdef BIND9
if (zone != NULL)
dns_zone_detach(&zone);
+#endif
return (result);
}
@@ -1161,6 +1359,7 @@ dns_viewlist_find(dns_viewlist_t *list, const char *name,
return (ISC_R_SUCCESS);
}
+#ifdef BIND9
isc_result_t
dns_viewlist_findzone(dns_viewlist_t *list, dns_name_t *name,
isc_boolean_t allclasses, dns_rdataclass_t rdclass,
@@ -1225,6 +1424,7 @@ dns_view_loadnew(dns_view_t *view, isc_boolean_t stop) {
return (dns_zt_loadnew(view->zonetable, stop));
}
+#endif /* BIND9 */
isc_result_t
dns_view_gettsig(dns_view_t *view, dns_name_t *keyname, dns_tsigkey_t **keyp)
@@ -1269,6 +1469,7 @@ dns_view_checksig(dns_view_t *view, isc_buffer_t *source, dns_message_t *msg) {
view->dynamickeys));
}
+#ifdef BIND9
isc_result_t
dns_view_dumpdbtostream(dns_view_t *view, FILE *fp) {
isc_result_t result;
@@ -1284,26 +1485,38 @@ dns_view_dumpdbtostream(dns_view_t *view, FILE *fp) {
dns_resolver_printbadcache(view->resolver, fp);
return (ISC_R_SUCCESS);
}
+#endif
isc_result_t
dns_view_flushcache(dns_view_t *view) {
+ return (dns_view_flushcache2(view, ISC_FALSE));
+}
+
+isc_result_t
+dns_view_flushcache2(dns_view_t *view, isc_boolean_t fixuponly) {
isc_result_t result;
REQUIRE(DNS_VIEW_VALID(view));
if (view->cachedb == NULL)
return (ISC_R_SUCCESS);
- result = dns_cache_flush(view->cache);
- if (result != ISC_R_SUCCESS)
- return (result);
+ if (!fixuponly) {
+ result = dns_cache_flush(view->cache);
+ if (result != ISC_R_SUCCESS)
+ return (result);
+ }
+#ifdef BIND9
if (view->acache != NULL)
dns_acache_putdb(view->acache, view->cachedb);
+#endif
dns_db_detach(&view->cachedb);
dns_cache_attachdb(view->cache, &view->cachedb);
+#ifdef BIND9
if (view->acache != NULL)
dns_acache_setdb(view->acache, view->cachedb);
if (view->resolver != NULL)
dns_resolver_flushbadcache(view->resolver, NULL);
+#endif
dns_adb_flush(view->adb);
return (ISC_R_SUCCESS);
@@ -1437,11 +1650,13 @@ dns_view_getrootdelonly(dns_view_t *view) {
return (view->rootdelonly);
}
+#ifdef BIND9
isc_result_t
dns_view_freezezones(dns_view_t *view, isc_boolean_t value) {
REQUIRE(DNS_VIEW_VALID(view));
return (dns_zt_freezezones(view->zonetable, value));
}
+#endif
void
dns_view_setresstats(dns_view_t *view, isc_stats_t *stats) {
@@ -1478,3 +1693,97 @@ dns_view_getresquerystats(dns_view_t *view, dns_stats_t **statsp) {
if (view->resquerystats != NULL)
dns_stats_attach(view->resquerystats, statsp);
}
+
+isc_result_t
+dns_view_initsecroots(dns_view_t *view, isc_mem_t *mctx) {
+ REQUIRE(DNS_VIEW_VALID(view));
+ if (view->secroots_priv != NULL)
+ dns_keytable_detach(&view->secroots_priv);
+ return (dns_keytable_create(mctx, &view->secroots_priv));
+}
+
+isc_result_t
+dns_view_getsecroots(dns_view_t *view, dns_keytable_t **ktp) {
+ REQUIRE(DNS_VIEW_VALID(view));
+ REQUIRE(ktp != NULL && *ktp == NULL);
+ if (view->secroots_priv == NULL)
+ return (ISC_R_NOTFOUND);
+ dns_keytable_attach(view->secroots_priv, ktp);
+ return (ISC_R_SUCCESS);
+}
+
+isc_result_t
+dns_view_issecuredomain(dns_view_t *view, dns_name_t *name,
+ isc_boolean_t *secure_domain) {
+ REQUIRE(DNS_VIEW_VALID(view));
+ return (dns_keytable_issecuredomain(view->secroots_priv, name,
+ secure_domain));
+}
+
+void
+dns_view_untrust(dns_view_t *view, dns_name_t *keyname,
+ dns_rdata_dnskey_t *dnskey, isc_mem_t *mctx)
+{
+ isc_result_t result;
+ unsigned char data[4096];
+ dns_rdata_t rdata = DNS_RDATA_INIT;
+ isc_buffer_t buffer;
+ dst_key_t *key = NULL;
+ dns_keytable_t *sr = NULL;
+
+ /*
+ * Clear the revoke bit, if set, so that the key will match what's
+ * in secroots now.
+ */
+ dnskey->flags &= ~DNS_KEYFLAG_REVOKE;
+
+ /* Convert dnskey to DST key. */
+ isc_buffer_init(&buffer, data, sizeof(data));
+ dns_rdata_fromstruct(&rdata, dnskey->common.rdclass,
+ dns_rdatatype_dnskey, dnskey, &buffer);
+ result = dns_dnssec_keyfromrdata(keyname, &rdata, mctx, &key);
+ if (result != ISC_R_SUCCESS)
+ return;
+ result = dns_view_getsecroots(view, &sr);
+ if (result == ISC_R_SUCCESS) {
+ dns_keytable_deletekeynode(sr, key);
+ dns_keytable_detach(&sr);
+ }
+ dst_key_free(&key);
+}
+
+#define NZF ".nzf"
+
+void
+dns_view_setnewzones(dns_view_t *view, isc_boolean_t allow, void *cfgctx,
+ void (*cfg_destroy)(void **))
+{
+ REQUIRE(DNS_VIEW_VALID(view));
+ REQUIRE((cfgctx != NULL && cfg_destroy != NULL) || !allow);
+
+#ifdef BIND9
+ if (view->new_zone_file != NULL) {
+ isc_mem_free(view->mctx, view->new_zone_file);
+ view->new_zone_file = NULL;
+ }
+
+ if (view->new_zone_config != NULL) {
+ view->cfg_destroy(&view->new_zone_config);
+ view->cfg_destroy = NULL;
+ }
+
+ if (allow) {
+ char buffer[ISC_SHA256_DIGESTSTRINGLENGTH + sizeof(NZF)];
+ isc_sha256_data((void *)view->name, strlen(view->name), buffer);
+ /* Truncate the hash at 16 chars; full length is overkill */
+ isc_string_printf(buffer + 16, sizeof(NZF), "%s", NZF);
+ view->new_zone_file = isc_mem_strdup(view->mctx, buffer);
+ view->new_zone_config = cfgctx;
+ view->cfg_destroy = cfg_destroy;
+ }
+#else
+ UNUSED(allow);
+ UNUSED(cfgctx);
+ UNUSED(cfg_destroy);
+#endif
+}
diff --git a/contrib/bind9/lib/dns/xfrin.c b/contrib/bind9/lib/dns/xfrin.c
index b3f2e95..210bca9 100644
--- a/contrib/bind9/lib/dns/xfrin.c
+++ b/contrib/bind9/lib/dns/xfrin.c
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004-2008 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004-2008, 2011 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 1999-2003 Internet Software Consortium.
*
* Permission to use, copy, modify, and/or distribute this software for any
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: xfrin.c,v 1.166 2008-09-25 04:12:39 marka Exp $ */
+/* $Id: xfrin.c,v 1.166.522.2.2.1 2011-06-02 23:47:35 tbox Exp $ */
/*! \file */
@@ -83,8 +83,9 @@ typedef enum {
XFRST_IXFR_DEL,
XFRST_IXFR_ADDSOA,
XFRST_IXFR_ADD,
+ XFRST_IXFR_END,
XFRST_AXFR,
- XFRST_END
+ XFRST_AXFR_END
} xfrin_state_t;
/*%
@@ -203,6 +204,7 @@ static isc_result_t axfr_putdata(dns_xfrin_ctx_t *xfr, dns_diffop_t op,
dns_rdata_t *rdata);
static isc_result_t axfr_apply(dns_xfrin_ctx_t *xfr);
static isc_result_t axfr_commit(dns_xfrin_ctx_t *xfr);
+static isc_result_t axfr_finalize(dns_xfrin_ctx_t *xfr);
static isc_result_t ixfr_init(dns_xfrin_ctx_t *xfr);
static isc_result_t ixfr_apply(dns_xfrin_ctx_t *xfr);
@@ -318,6 +320,16 @@ axfr_commit(dns_xfrin_ctx_t *xfr) {
CHECK(axfr_apply(xfr));
CHECK(dns_db_endload(xfr->db, &xfr->axfr.add_private));
+
+ result = ISC_R_SUCCESS;
+ failure:
+ return (result);
+}
+
+static isc_result_t
+axfr_finalize(dns_xfrin_ctx_t *xfr) {
+ isc_result_t result;
+
CHECK(dns_zone_replacedb(xfr->zone, xfr->db, ISC_TRUE));
result = ISC_R_SUCCESS;
@@ -541,7 +553,7 @@ xfr_rr(dns_xfrin_ctx_t *xfr, dns_name_t *name, isc_uint32_t ttl,
isc_uint32_t soa_serial = dns_soa_getserial(rdata);
if (soa_serial == xfr->end_serial) {
CHECK(ixfr_commit(xfr));
- xfr->state = XFRST_END;
+ xfr->state = XFRST_IXFR_END;
break;
} else if (soa_serial != xfr->ixfr.current_serial) {
xfrin_log(xfr, ISC_LOG_ERROR,
@@ -572,11 +584,12 @@ xfr_rr(dns_xfrin_ctx_t *xfr, dns_name_t *name, isc_uint32_t ttl,
CHECK(axfr_putdata(xfr, DNS_DIFFOP_ADD, name, ttl, rdata));
if (rdata->type == dns_rdatatype_soa) {
CHECK(axfr_commit(xfr));
- xfr->state = XFRST_END;
+ xfr->state = XFRST_AXFR_END;
break;
}
break;
- case XFRST_END:
+ case XFRST_AXFR_END:
+ case XFRST_IXFR_END:
FAIL(DNS_R_EXTRADATA);
default:
INSIST(0);
@@ -1318,8 +1331,9 @@ xfrin_recv_done(isc_task_t *task, isc_event_t *ev) {
} else if (dns_message_gettsigkey(msg) != NULL) {
xfr->sincetsig++;
- if (xfr->sincetsig > 100 ||
- xfr->nmsg == 0 || xfr->state == XFRST_END)
+ if (xfr->sincetsig > 100 || xfr->nmsg == 0 ||
+ xfr->state == XFRST_AXFR_END ||
+ xfr->state == XFRST_IXFR_END)
{
result = DNS_R_EXPECTEDTSIG;
goto failure;
@@ -1345,16 +1359,22 @@ xfrin_recv_done(isc_task_t *task, isc_event_t *ev) {
dns_message_destroy(&msg);
- if (xfr->state == XFRST_GOTSOA) {
+ switch (xfr->state) {
+ case XFRST_GOTSOA:
xfr->reqtype = dns_rdatatype_axfr;
xfr->state = XFRST_INITIALSOA;
CHECK(xfrin_send_request(xfr));
- } else if (xfr->state == XFRST_END) {
+ break;
+ case XFRST_AXFR_END:
+ CHECK(axfr_finalize(xfr));
+ /* FALLTHROUGH */
+ case XFRST_IXFR_END:
/*
* Close the journal.
*/
if (xfr->ixfr.journal != NULL)
dns_journal_destroy(&xfr->ixfr.journal);
+
/*
* Inform the caller we succeeded.
*/
@@ -1368,7 +1388,8 @@ xfrin_recv_done(isc_task_t *task, isc_event_t *ev) {
*/
xfr->shuttingdown = ISC_TRUE;
maybe_free(xfr);
- } else {
+ break;
+ default:
/*
* Read the next message.
*/
diff --git a/contrib/bind9/lib/dns/zone.c b/contrib/bind9/lib/dns/zone.c
index 108aefb..c727c2e 100644
--- a/contrib/bind9/lib/dns/zone.c
+++ b/contrib/bind9/lib/dns/zone.c
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004-2010 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004-2011 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 1999-2003 Internet Software Consortium.
*
* Permission to use, copy, modify, and/or distribute this software for any
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: zone.c,v 1.483.36.23 2010-12-14 00:48:22 marka Exp $ */
+/* $Id: zone.c,v 1.582.8.7 2011-02-18 23:23:08 each Exp $ */
/*! \file */
@@ -47,6 +47,8 @@
#include <dns/dnssec.h>
#include <dns/events.h>
#include <dns/journal.h>
+#include <dns/keydata.h>
+#include <dns/keytable.h>
#include <dns/keyvalues.h>
#include <dns/log.h>
#include <dns/master.h>
@@ -56,6 +58,8 @@
#include <dns/nsec.h>
#include <dns/nsec3.h>
#include <dns/peer.h>
+#include <dns/private.h>
+#include <dns/rbt.h>
#include <dns/rcode.h>
#include <dns/rdataclass.h>
#include <dns/rdatalist.h>
@@ -66,6 +70,7 @@
#include <dns/request.h>
#include <dns/resolver.h>
#include <dns/result.h>
+#include <dns/rriterator.h>
#include <dns/soa.h>
#include <dns/ssu.h>
#include <dns/stats.h>
@@ -129,6 +134,7 @@ typedef struct dns_signing dns_signing_t;
typedef ISC_LIST(dns_signing_t) dns_signinglist_t;
typedef struct dns_nsec3chain dns_nsec3chain_t;
typedef ISC_LIST(dns_nsec3chain_t) dns_nsec3chainlist_t;
+typedef struct dns_keyfetch dns_keyfetch_t;
#define DNS_ZONE_CHECKLOCK
#ifdef DNS_ZONE_CHECKLOCK
@@ -200,6 +206,8 @@ struct dns_zone {
isc_time_t keywarntime;
isc_time_t signingtime;
isc_time_t nsec3chaintime;
+ isc_time_t refreshkeytime;
+ isc_uint32_t refreshkeycount;
isc_uint32_t refresh;
isc_uint32_t retry;
isc_uint32_t expire;
@@ -273,13 +281,13 @@ struct dns_zone {
/*%
* Statistics counters about zone management.
*/
- isc_stats_t *stats;
+ isc_stats_t *stats;
/*%
* Optional per-zone statistics counters. Counted outside of this
* module.
*/
- isc_boolean_t requeststats_on;
- isc_stats_t *requeststats;
+ isc_boolean_t requeststats_on;
+ isc_stats_t *requeststats;
isc_uint32_t notifydelay;
dns_isselffunc_t isself;
void *isselfarg;
@@ -304,6 +312,21 @@ struct dns_zone {
isc_uint32_t signatures;
isc_uint32_t nodes;
dns_rdatatype_t privatetype;
+
+ /*%
+ * Autosigning/key-maintenance options
+ */
+ isc_uint32_t keyopts;
+
+ /*%
+ * True if added by "rndc addzone"
+ */
+ isc_boolean_t added;
+
+ /*%
+ * whether a rpz radix was needed when last loaded
+ */
+ isc_boolean_t rpz_zone;
};
#define DNS_ZONE_FLAG(z,f) (ISC_TF(((z)->flags & (f)) != 0))
@@ -339,7 +362,7 @@ struct dns_zone {
* from SOA (if not set, we
* are still using
* default timer values) */
-#define DNS_ZONEFLG_FORCEXFER 0x00008000U /*%< Force a zone xfer */
+#define DNS_ZONEFLG_FORCEXFER 0x00008000U /*%< Force a zone xfer */
#define DNS_ZONEFLG_NOREFRESH 0x00010000U
#define DNS_ZONEFLG_DIALNOTIFY 0x00020000U
#define DNS_ZONEFLG_DIALREFRESH 0x00040000U
@@ -352,8 +375,11 @@ struct dns_zone {
#define DNS_ZONEFLG_NEEDCOMPACT 0x02000000U
#define DNS_ZONEFLG_REFRESHING 0x04000000U /*%< Refreshing keydata */
#define DNS_ZONEFLG_THAW 0x08000000U
+/* #define DNS_ZONEFLG_XXXXX 0x10000000U XXXMPA unused. */
+#define DNS_ZONEFLG_NODELAY 0x20000000U
#define DNS_ZONE_OPTION(z,o) (((z)->options & (o)) != 0)
+#define DNS_ZONEKEY_OPTION(z,o) (((z)->keyopts & (o)) != 0)
/* Flags for zone_load() */
#define DNS_ZONELOADFLAG_NOSTAT 0x00000001U /* Do not stat() master files */
@@ -484,7 +510,7 @@ struct dns_io {
* DNSKEY as result of an update.
*/
struct dns_signing {
- unsigned int magic;
+ unsigned int magic;
dns_db_t *db;
dns_dbiterator_t *dbiterator;
dns_secalg_t algorithm;
@@ -495,15 +521,15 @@ struct dns_signing {
};
struct dns_nsec3chain {
- unsigned int magic;
+ unsigned int magic;
dns_db_t *db;
dns_dbiterator_t *dbiterator;
dns_rdata_nsec3param_t nsec3param;
unsigned char salt[255];
isc_boolean_t done;
- isc_boolean_t seen_nsec;
- isc_boolean_t delete_nsec;
- isc_boolean_t save_delete_nsec;
+ isc_boolean_t seen_nsec;
+ isc_boolean_t delete_nsec;
+ isc_boolean_t save_delete_nsec;
ISC_LINK(dns_nsec3chain_t) link;
};
/*%<
@@ -528,6 +554,19 @@ struct dns_nsec3chain {
* so it can be recovered in the event of a error.
*/
+struct dns_keyfetch {
+ dns_fixedname_t name;
+ dns_rdataset_t keydataset;
+ dns_rdataset_t dnskeyset;
+ dns_rdataset_t dnskeysigset;
+ dns_zone_t *zone;
+ dns_db_t *db;
+ dns_fetch_t *fetch;
+};
+
+#define HOUR 3600
+#define DAY (24*HOUR)
+#define MONTH (30*DAY)
#define SEND_BUFFER_SIZE 2048
@@ -538,6 +577,10 @@ static void zone_debuglog(dns_zone_t *zone, const char *, int debuglevel,
static void notify_log(dns_zone_t *zone, int level, const char *fmt, ...)
ISC_FORMAT_PRINTF(3, 4);
static void queue_xfrin(dns_zone_t *zone);
+static isc_result_t update_one_rr(dns_db_t *db, dns_dbversion_t *ver,
+ dns_diff_t *diff, dns_diffop_t op,
+ dns_name_t *name, dns_ttl_t ttl,
+ dns_rdata_t *rdata);
static void zone_unload(dns_zone_t *zone);
static void zone_expire(dns_zone_t *zone);
static void zone_iattach(dns_zone_t *source, dns_zone_t **target);
@@ -613,6 +656,10 @@ static isc_boolean_t dns_zonemgr_unreachable(dns_zonemgr_t *zmgr,
isc_time_t *now);
static isc_result_t zone_signwithkey(dns_zone_t *zone, dns_secalg_t algorithm,
isc_uint16_t keyid, isc_boolean_t delete);
+static isc_result_t delete_nsec(dns_db_t *db, dns_dbversion_t *ver,
+ dns_dbnode_t *node, dns_name_t *name,
+ dns_diff_t *diff);
+static void zone_rekey(dns_zone_t *zone);
#define ENTER zone_debuglog(zone, me, 1, "enter")
@@ -710,6 +757,7 @@ dns_zone_create(dns_zone_t **zonep, isc_mem_t *mctx) {
zone->type = dns_zone_none;
zone->flags = 0;
zone->options = 0;
+ zone->keyopts = 0;
zone->db_argc = 0;
zone->db_argv = NULL;
isc_time_settoepoch(&zone->expiretime);
@@ -721,6 +769,8 @@ dns_zone_create(dns_zone_t **zonep, isc_mem_t *mctx) {
isc_time_settoepoch(&zone->keywarntime);
isc_time_settoepoch(&zone->signingtime);
isc_time_settoepoch(&zone->nsec3chaintime);
+ isc_time_settoepoch(&zone->refreshkeytime);
+ zone->refreshkeycount = 0;
zone->refresh = DNS_ZONE_DEFAULTREFRESH;
zone->retry = DNS_ZONE_DEFAULTRETRY;
zone->expire = 0;
@@ -787,6 +837,8 @@ dns_zone_create(dns_zone_t **zonep, isc_mem_t *mctx) {
zone->signatures = 10;
zone->nodes = 100;
zone->privatetype = (dns_rdatatype_t)0xffffU;
+ zone->added = ISC_FALSE;
+ zone->rpz_zone = ISC_FALSE;
zone->magic = ZONE_MAGIC;
@@ -1304,8 +1356,8 @@ dns_zone_getjournal(dns_zone_t *zone) {
* master file (if any) is written by the server, rather than being
* updated manually and read by the server.
*
- * This is true for slave zones, stub zones, and zones that allow
- * dynamic updates either by having an update policy ("ssutable")
+ * This is true for slave zones, stub zones, key zones, and zones that
+ * allow dynamic updates either by having an update policy ("ssutable")
* or an "allow-update" ACL with a value other than exactly "{ none; }".
*/
static isc_boolean_t
@@ -1314,6 +1366,7 @@ zone_isdynamic(dns_zone_t *zone) {
return (ISC_TF(zone->type == dns_zone_slave ||
zone->type == dns_zone_stub ||
+ zone->type == dns_zone_key ||
(!zone->update_disabled && zone->ssutable != NULL) ||
(!zone->update_disabled && zone->update_acl != NULL &&
!dns_acl_isnone(zone->update_acl))));
@@ -1383,11 +1436,12 @@ zone_load(dns_zone_t *zone, unsigned int flags) {
*/
if (zone->masterfile != NULL) {
/*
- * The file is already loaded. If we are just doing a
+ * The file is already loaded. If we are just doing a
* "rndc reconfig", we are done.
*/
if (!isc_time_isepoch(&zone->loadtime) &&
- (flags & DNS_ZONELOADFLAG_NOSTAT) != 0) {
+ (flags & DNS_ZONELOADFLAG_NOSTAT) != 0 &&
+ zone->rpz_zone == dns_rpz_needed()) {
result = ISC_R_SUCCESS;
goto cleanup;
}
@@ -1396,7 +1450,8 @@ zone_load(dns_zone_t *zone, unsigned int flags) {
if (result == ISC_R_SUCCESS) {
if (DNS_ZONE_FLAG(zone, DNS_ZONEFLG_LOADED) &&
!DNS_ZONE_FLAG(zone, DNS_ZONEFLG_HASINCLUDE) &&
- isc_time_compare(&filetime, &zone->loadtime) <= 0) {
+ isc_time_compare(&filetime, &zone->loadtime) <= 0 &&
+ zone->rpz_zone == dns_rpz_needed()) {
dns_zone_log(zone, ISC_LOG_DEBUG(1),
"skipping load: master file "
"older than last load");
@@ -1404,6 +1459,7 @@ zone_load(dns_zone_t *zone, unsigned int flags) {
goto cleanup;
}
loadtime = filetime;
+ zone->rpz_zone = dns_rpz_needed();
}
}
@@ -1526,6 +1582,8 @@ get_master_options(dns_zone_t *zone) {
options = DNS_MASTER_ZONE;
if (zone->type == dns_zone_slave)
options |= DNS_MASTER_SLAVE;
+ if (zone->type == dns_zone_key)
+ options |= DNS_MASTER_KEY;
if (DNS_ZONE_OPTION(zone, DNS_ZONEOPT_CHECKNS))
options |= DNS_MASTER_CHECKNS;
if (DNS_ZONE_OPTION(zone, DNS_ZONEOPT_FATALNS))
@@ -1541,7 +1599,8 @@ get_master_options(dns_zone_t *zone) {
if (DNS_ZONE_OPTION(zone, DNS_ZONEOPT_CHECKWILDCARD))
options |= DNS_MASTER_CHECKWILDCARD;
if (zone->type == dns_zone_master &&
- (zone->update_acl != NULL || zone->ssutable != NULL))
+ ((zone->update_acl != NULL && !dns_acl_isnone(zone->update_acl)) ||
+ zone->ssutable != NULL))
options |= DNS_MASTER_RESIGN;
return (options);
}
@@ -1740,11 +1799,12 @@ zone_check_mx(dns_zone_t *zone, dns_db_t *db, dns_name_t *name,
dns_name_format(name, namebuf, sizeof namebuf);
if (result == DNS_R_NXRRSET || result == DNS_R_NXDOMAIN ||
result == DNS_R_EMPTYNAME) {
+ if (!DNS_ZONE_OPTION(zone, DNS_ZONEOPT_CHECKMXFAIL))
+ level = ISC_LOG_WARNING;
dns_zone_log(zone, level,
"%s/MX '%s' has no address records (A or AAAA)",
ownerbuf, namebuf);
- /* XXX950 make fatal for 9.5.0. */
- return (ISC_TRUE);
+ return ((level == ISC_LOG_WARNING) ? ISC_TRUE : ISC_FALSE);
}
if (result == DNS_R_CNAME) {
@@ -1986,6 +2046,113 @@ zone_check_glue(dns_zone_t *zone, dns_db_t *db, dns_name_t *name,
}
static isc_boolean_t
+zone_rrset_check_dup(dns_zone_t *zone, dns_name_t *owner,
+ dns_rdataset_t *rdataset)
+{
+ dns_rdataset_t tmprdataset;
+ isc_result_t result;
+ isc_boolean_t answer = ISC_TRUE;
+ isc_boolean_t format = ISC_TRUE;
+ int level = ISC_LOG_WARNING;
+ char ownerbuf[DNS_NAME_FORMATSIZE];
+ char typebuf[DNS_RDATATYPE_FORMATSIZE];
+ unsigned int count1 = 0;
+
+ if (DNS_ZONE_OPTION(zone, DNS_ZONEOPT_CHECKDUPRRFAIL))
+ level = ISC_LOG_ERROR;
+
+ dns_rdataset_init(&tmprdataset);
+ for (result = dns_rdataset_first(rdataset);
+ result == ISC_R_SUCCESS;
+ result = dns_rdataset_next(rdataset)) {
+ dns_rdata_t rdata1 = DNS_RDATA_INIT;
+ unsigned int count2 = 0;
+
+ count1++;
+ dns_rdataset_current(rdataset, &rdata1);
+ dns_rdataset_clone(rdataset, &tmprdataset);
+ for (result = dns_rdataset_first(&tmprdataset);
+ result == ISC_R_SUCCESS;
+ result = dns_rdataset_next(&tmprdataset)) {
+ dns_rdata_t rdata2 = DNS_RDATA_INIT;
+ count2++;
+ if (count1 >= count2)
+ continue;
+ dns_rdataset_current(&tmprdataset, &rdata2);
+ if (dns_rdata_casecompare(&rdata1, &rdata2) == 0) {
+ if (format) {
+ dns_name_format(owner, ownerbuf,
+ sizeof ownerbuf);
+ dns_rdatatype_format(rdata1.type,
+ typebuf,
+ sizeof(typebuf));
+ format = ISC_FALSE;
+ }
+ dns_zone_log(zone, level, "%s/%s has "
+ "semantically identical records",
+ ownerbuf, typebuf);
+ if (level == ISC_LOG_ERROR)
+ answer = ISC_FALSE;
+ break;
+ }
+ }
+ dns_rdataset_disassociate(&tmprdataset);
+ if (!format)
+ break;
+ }
+ return (answer);
+}
+
+static isc_boolean_t
+zone_check_dup(dns_zone_t *zone, dns_db_t *db) {
+ dns_dbiterator_t *dbiterator = NULL;
+ dns_dbnode_t *node = NULL;
+ dns_fixedname_t fixed;
+ dns_name_t *name;
+ dns_rdataset_t rdataset;
+ dns_rdatasetiter_t *rdsit = NULL;
+ isc_boolean_t ok = ISC_TRUE;
+ isc_result_t result;
+
+ dns_fixedname_init(&fixed);
+ name = dns_fixedname_name(&fixed);
+ dns_rdataset_init(&rdataset);
+
+ result = dns_db_createiterator(db, 0, &dbiterator);
+ if (result != ISC_R_SUCCESS)
+ return (ISC_TRUE);
+
+ for (result = dns_dbiterator_first(dbiterator);
+ result == ISC_R_SUCCESS;
+ result = dns_dbiterator_next(dbiterator)) {
+ result = dns_dbiterator_current(dbiterator, &node, name);
+ if (result != ISC_R_SUCCESS)
+ continue;
+
+ result = dns_db_allrdatasets(db, node, NULL, 0, &rdsit);
+ if (result != ISC_R_SUCCESS)
+ continue;
+
+ for (result = dns_rdatasetiter_first(rdsit);
+ result == ISC_R_SUCCESS;
+ result = dns_rdatasetiter_next(rdsit)) {
+ dns_rdatasetiter_current(rdsit, &rdataset);
+ if (!zone_rrset_check_dup(zone, name, &rdataset))
+ ok = ISC_FALSE;
+ dns_rdataset_disassociate(&rdataset);
+ }
+ dns_rdatasetiter_destroy(&rdsit);
+ dns_db_detachnode(db, &node);
+ }
+
+ if (node != NULL)
+ dns_db_detachnode(db, &node);
+ dns_dbiterator_destroy(&dbiterator);
+
+ return (ok);
+}
+
+static isc_boolean_t
integrity_checks(dns_zone_t *zone, dns_db_t *db) {
dns_dbiterator_t *dbiterator = NULL;
dns_dbnode_t *node = NULL;
@@ -2052,6 +2219,7 @@ integrity_checks(dns_zone_t *zone, dns_db_t *db) {
result = dns_rdataset_next(&rdataset);
}
dns_rdataset_disassociate(&rdataset);
+ goto next;
checkmx:
result = dns_db_findrdataset(db, node, NULL, dns_rdatatype_mx,
@@ -2104,7 +2272,7 @@ integrity_checks(dns_zone_t *zone, dns_db_t *db) {
/*
* OpenSSL verification of RSA keys with exponent 3 is known to be
- * broken prior OpenSSL 0.9.8c/0.9.7k. Look for such keys and warn
+ * broken prior OpenSSL 0.9.8c/0.9.7k. Look for such keys and warn
* if they are in use.
*/
static void
@@ -2168,7 +2336,6 @@ zone_check_dnskeys(dns_zone_t *zone, dns_db_t *db) {
dns_db_detachnode(db, &node);
if (version != NULL)
dns_db_closeversion(db, &version, ISC_FALSE);
-
}
static void
@@ -2189,15 +2356,18 @@ resume_signingwithkey(dns_zone_t *zone) {
zone->privatetype,
dns_rdatatype_none, 0,
&rdataset, NULL);
- if (result != ISC_R_SUCCESS)
+ if (result != ISC_R_SUCCESS) {
+ INSIST(!dns_rdataset_isassociated(&rdataset));
goto cleanup;
+ }
for (result = dns_rdataset_first(&rdataset);
result == ISC_R_SUCCESS;
result = dns_rdataset_next(&rdataset))
{
dns_rdataset_current(&rdataset, &rdata);
- if (rdata.length != 5 || rdata.data[4] != 0) {
+ if (rdata.length != 5 ||
+ rdata.data[0] == 0 || rdata.data[4] != 0) {
dns_rdata_reset(&rdata);
continue;
}
@@ -2219,7 +2389,6 @@ resume_signingwithkey(dns_zone_t *zone) {
dns_db_detachnode(zone->db, &node);
if (version != NULL)
dns_db_closeversion(zone->db, &version, ISC_FALSE);
-
}
static isc_result_t
@@ -2228,6 +2397,9 @@ zone_addnsec3chain(dns_zone_t *zone, dns_rdata_nsec3param_t *nsec3param) {
isc_result_t result;
isc_time_t now;
unsigned int options = 0;
+ char saltbuf[255*2+1];
+ char flags[sizeof("REMOVE|CREATE|NONSEC|OPTOUT")];
+ int i;
nsec3chain = isc_mem_get(zone->mctx, sizeof *nsec3chain);
if (nsec3chain == NULL)
@@ -2249,6 +2421,40 @@ zone_addnsec3chain(dns_zone_t *zone, dns_rdata_nsec3param_t *nsec3param) {
nsec3chain->delete_nsec = ISC_FALSE;
nsec3chain->save_delete_nsec = ISC_FALSE;
+ if (nsec3param->flags == 0)
+ strlcpy(flags, "NONE", sizeof(flags));
+ else {
+ flags[0] = '\0';
+ if (nsec3param->flags & DNS_NSEC3FLAG_REMOVE)
+ strlcat(flags, "REMOVE", sizeof(flags));
+ if (nsec3param->flags & DNS_NSEC3FLAG_CREATE) {
+ if (flags[0] == '\0')
+ strlcpy(flags, "CREATE", sizeof(flags));
+ else
+ strlcat(flags, "|CREATE", sizeof(flags));
+ }
+ if (nsec3param->flags & DNS_NSEC3FLAG_NONSEC) {
+ if (flags[0] == '\0')
+ strlcpy(flags, "NONSEC", sizeof(flags));
+ else
+ strlcat(flags, "|NONSEC", sizeof(flags));
+ }
+ if (nsec3param->flags & DNS_NSEC3FLAG_OPTOUT) {
+ if (flags[0] == '\0')
+ strlcpy(flags, "OPTOUT", sizeof(flags));
+ else
+ strlcat(flags, "|OPTOUT", sizeof(flags));
+ }
+ }
+ if (nsec3param->salt_length == 0)
+ strlcpy(saltbuf, "-", sizeof(saltbuf));
+ else
+ for (i = 0; i < nsec3param->salt_length; i++)
+ sprintf(&saltbuf[i*2], "%02X", nsec3chain->salt[i]);
+ dns_zone_log(zone, ISC_LOG_INFO,
+ "zone_addnsec3chain(%u,%s,%u,%s)",
+ nsec3param->hash, flags, nsec3param->iterations,
+ saltbuf);
for (current = ISC_LIST_HEAD(zone->nsec3chain);
current != NULL;
current = ISC_LIST_NEXT(current, link)) {
@@ -2298,11 +2504,13 @@ static void
resume_addnsec3chain(dns_zone_t *zone) {
dns_dbnode_t *node = NULL;
dns_dbversion_t *version = NULL;
- dns_rdata_t rdata = DNS_RDATA_INIT;
dns_rdataset_t rdataset;
isc_result_t result;
dns_rdata_nsec3param_t nsec3param;
+ if (zone->privatetype == 0)
+ return;
+
result = dns_db_findnode(zone->db, &zone->origin, ISC_FALSE, &node);
if (result != ISC_R_SUCCESS)
goto cleanup;
@@ -2310,17 +2518,25 @@ resume_addnsec3chain(dns_zone_t *zone) {
dns_db_currentversion(zone->db, &version);
dns_rdataset_init(&rdataset);
result = dns_db_findrdataset(zone->db, node, version,
- dns_rdatatype_nsec3param,
- dns_rdatatype_none, 0,
- &rdataset, NULL);
- if (result != ISC_R_SUCCESS)
+ zone->privatetype, dns_rdatatype_none,
+ 0, &rdataset, NULL);
+ if (result != ISC_R_SUCCESS) {
+ INSIST(!dns_rdataset_isassociated(&rdataset));
goto cleanup;
+ }
for (result = dns_rdataset_first(&rdataset);
result == ISC_R_SUCCESS;
result = dns_rdataset_next(&rdataset))
{
- dns_rdataset_current(&rdataset, &rdata);
+ unsigned char buf[DNS_NSEC3PARAM_BUFFERSIZE];
+ dns_rdata_t rdata = DNS_RDATA_INIT;
+ dns_rdata_t private = DNS_RDATA_INIT;
+
+ dns_rdataset_current(&rdataset, &private);
+ if (!dns_nsec3param_fromprivate(&private, &rdata, buf,
+ sizeof(buf)))
+ continue;
result = dns_rdata_tostruct(&rdata, &nsec3param, NULL);
RUNTIME_CHECK(result == ISC_R_SUCCESS);
if ((nsec3param.flags & DNS_NSEC3FLAG_CREATE) != 0 ||
@@ -2332,10 +2548,8 @@ resume_addnsec3chain(dns_zone_t *zone) {
dns_result_totext(result));
}
}
- dns_rdata_reset(&rdata);
}
dns_rdataset_disassociate(&rdataset);
-
cleanup:
if (node != NULL)
dns_db_detachnode(zone->db, &node);
@@ -2353,8 +2567,8 @@ set_resigntime(dns_zone_t *zone) {
dns_rdataset_init(&rdataset);
dns_fixedname_init(&fixed);
- result = dns_db_getsigningtime(zone->db, &rdataset,
- dns_fixedname_name(&fixed));
+ result = dns_db_getsigningtime(zone->db, &rdataset,
+ dns_fixedname_name(&fixed));
if (result != ISC_R_SUCCESS) {
isc_time_settoepoch(&zone->resigntime);
return;
@@ -2392,10 +2606,12 @@ check_nsec3param(dns_zone_t *zone, dns_db_t *db) {
dns_rdatatype_nsec3param,
dns_rdatatype_none, 0, &rdataset, NULL);
if (result == ISC_R_NOTFOUND) {
+ INSIST(!dns_rdataset_isassociated(&rdataset));
result = ISC_R_SUCCESS;
goto cleanup;
}
if (result != ISC_R_SUCCESS) {
+ INSIST(!dns_rdataset_isassociated(&rdataset));
dns_zone_log(zone, ISC_LOG_ERROR,
"nsec3param lookup failure: %s",
dns_result_totext(result));
@@ -2456,6 +2672,642 @@ check_nsec3param(dns_zone_t *zone, dns_db_t *db) {
return (result);
}
+/*
+ * Set the timer for refreshing the key zone to the soonest future time
+ * of the set (current timer, keydata->refresh, keydata->addhd,
+ * keydata->removehd).
+ */
+static void
+set_refreshkeytimer(dns_zone_t *zone, dns_rdata_keydata_t *key,
+ isc_stdtime_t now) {
+ const char me[] = "set_refreshkeytimer";
+ isc_stdtime_t then;
+ isc_time_t timenow, timethen;
+ char timebuf[80];
+
+ ENTER;
+ then = key->refresh;
+ if (key->addhd > now && key->addhd < then)
+ then = key->addhd;
+ if (key->removehd > now && key->removehd < then)
+ then = key->removehd;
+
+ TIME_NOW(&timenow);
+ if (then > now)
+ DNS_ZONE_TIME_ADD(&timenow, then - now, &timethen);
+ else
+ timethen = timenow;
+ if (isc_time_compare(&zone->refreshkeytime, &timenow) < 0 ||
+ isc_time_compare(&timethen, &zone->refreshkeytime) < 0)
+ zone->refreshkeytime = timethen;
+
+ isc_time_formattimestamp(&zone->refreshkeytime, timebuf, 80);
+ dns_zone_log(zone, ISC_LOG_DEBUG(1), "next key refresh: %s", timebuf);
+ zone_settimer(zone, &timenow);
+}
+
+/*
+ * Convert key(s) linked from 'keynode' to KEYDATA and add to the key zone.
+ * If the key zone is changed, set '*changed' to ISC_TRUE.
+ */
+static isc_result_t
+create_keydata(dns_zone_t *zone, dns_db_t *db, dns_dbversion_t *ver,
+ dns_diff_t *diff, dns_keytable_t *keytable,
+ dns_keynode_t **keynodep, isc_boolean_t *changed)
+{
+ const char me[] = "create_keydata";
+ isc_result_t result = ISC_R_SUCCESS;
+ isc_buffer_t keyb, dstb;
+ unsigned char key_buf[4096], dst_buf[DST_KEY_MAXSIZE];
+ dns_rdata_keydata_t keydata;
+ dns_rdata_dnskey_t dnskey;
+ dns_rdata_t rdata = DNS_RDATA_INIT;
+ dns_keynode_t *keynode;
+ isc_stdtime_t now;
+ isc_region_t r;
+ dst_key_t *key;
+
+ REQUIRE(keynodep != NULL);
+ keynode = *keynodep;
+
+ ENTER;
+ isc_stdtime_get(&now);
+
+ /* Loop in case there's more than one key. */
+ while (result == ISC_R_SUCCESS) {
+ dns_keynode_t *nextnode = NULL;
+
+ key = dns_keynode_key(keynode);
+ if (key == NULL)
+ goto skip;
+
+ isc_buffer_init(&dstb, dst_buf, sizeof(dst_buf));
+ CHECK(dst_key_todns(key, &dstb));
+
+ /* Convert DST key to DNSKEY. */
+ dns_rdata_reset(&rdata);
+ isc_buffer_usedregion(&dstb, &r);
+ dns_rdata_fromregion(&rdata, dst_key_class(key),
+ dns_rdatatype_dnskey, &r);
+
+ /* DSTKEY to KEYDATA. */
+ CHECK(dns_rdata_tostruct(&rdata, &dnskey, NULL));
+ CHECK(dns_keydata_fromdnskey(&keydata, &dnskey, now, 0, 0,
+ NULL));
+
+ /* KEYDATA to rdata. */
+ dns_rdata_reset(&rdata);
+ isc_buffer_init(&keyb, key_buf, sizeof(key_buf));
+ CHECK(dns_rdata_fromstruct(&rdata,
+ zone->rdclass, dns_rdatatype_keydata,
+ &keydata, &keyb));
+
+ /* Add rdata to zone. */
+ CHECK(update_one_rr(db, ver, diff, DNS_DIFFOP_ADD,
+ dst_key_name(key), 0, &rdata));
+ *changed = ISC_TRUE;
+
+ skip:
+ result = dns_keytable_nextkeynode(keytable, keynode, &nextnode);
+ if (result != ISC_R_NOTFOUND) {
+ dns_keytable_detachkeynode(keytable, &keynode);
+ keynode = nextnode;
+ }
+ }
+
+ /* Refresh new keys from the zone apex as soon as possible. */
+ if (*changed)
+ set_refreshkeytimer(zone, &keydata, now);
+
+ if (keynode != NULL)
+ dns_keytable_detachkeynode(keytable, &keynode);
+ *keynodep = NULL;
+
+ return (ISC_R_SUCCESS);
+
+ failure:
+ return (result);
+}
+
+/*
+ * Remove from the key zone all the KEYDATA records found in rdataset.
+ */
+static isc_result_t
+delete_keydata(dns_db_t *db, dns_dbversion_t *ver, dns_diff_t *diff,
+ dns_name_t *name, dns_rdataset_t *rdataset)
+{
+ dns_rdata_t rdata = DNS_RDATA_INIT;
+ isc_result_t result, uresult;
+
+ for (result = dns_rdataset_first(rdataset);
+ result == ISC_R_SUCCESS;
+ result = dns_rdataset_next(rdataset)) {
+ dns_rdata_reset(&rdata);
+ dns_rdataset_current(rdataset, &rdata);
+ uresult = update_one_rr(db, ver, diff, DNS_DIFFOP_DEL,
+ name, 0, &rdata);
+ if (uresult != ISC_R_SUCCESS)
+ return (uresult);
+ }
+ if (result == ISC_R_NOMORE)
+ result = ISC_R_SUCCESS;
+ return (result);
+}
+
+/*
+ * Compute the DNSSEC key ID for a DNSKEY record.
+ */
+static isc_result_t
+compute_tag(dns_name_t *name, dns_rdata_dnskey_t *dnskey, isc_mem_t *mctx,
+ dns_keytag_t *tag)
+{
+ isc_result_t result;
+ dns_rdata_t rdata = DNS_RDATA_INIT;
+ unsigned char data[4096];
+ isc_buffer_t buffer;
+ dst_key_t *dstkey = NULL;
+
+ isc_buffer_init(&buffer, data, sizeof(data));
+ dns_rdata_fromstruct(&rdata, dnskey->common.rdclass,
+ dns_rdatatype_dnskey, dnskey, &buffer);
+
+ result = dns_dnssec_keyfromrdata(name, &rdata, mctx, &dstkey);
+ if (result == ISC_R_SUCCESS)
+ *tag = dst_key_id(dstkey);
+ dst_key_free(&dstkey);
+
+ return (result);
+}
+
+/*
+ * Add key to the security roots for all views.
+ */
+static void
+trust_key(dns_viewlist_t *viewlist, dns_name_t *keyname,
+ dns_rdata_dnskey_t *dnskey, isc_mem_t *mctx) {
+ isc_result_t result;
+ dns_rdata_t rdata = DNS_RDATA_INIT;
+ unsigned char data[4096];
+ isc_buffer_t buffer;
+ dns_view_t *view;
+ dns_keytable_t *sr = NULL;
+ dst_key_t *dstkey = NULL;
+
+ /* Convert dnskey to DST key. */
+ isc_buffer_init(&buffer, data, sizeof(data));
+ dns_rdata_fromstruct(&rdata, dnskey->common.rdclass,
+ dns_rdatatype_dnskey, dnskey, &buffer);
+
+ for (view = ISC_LIST_HEAD(*viewlist); view != NULL;
+ view = ISC_LIST_NEXT(view, link)) {
+
+ result = dns_view_getsecroots(view, &sr);
+ if (result != ISC_R_SUCCESS)
+ continue;
+
+ CHECK(dns_dnssec_keyfromrdata(keyname, &rdata, mctx, &dstkey));
+ CHECK(dns_keytable_add(sr, ISC_TRUE, &dstkey));
+ dns_keytable_detach(&sr);
+ }
+
+ failure:
+ if (dstkey != NULL)
+ dst_key_free(&dstkey);
+ if (sr != NULL)
+ dns_keytable_detach(&sr);
+ return;
+}
+
+/*
+ * Remove key from the security roots for all views.
+ */
+static void
+untrust_key(dns_viewlist_t *viewlist, dns_name_t *keyname, isc_mem_t *mctx,
+ dns_rdata_dnskey_t *dnskey)
+{
+ dns_view_t *view;
+
+ for (view = ISC_LIST_HEAD(*viewlist); view != NULL;
+ view = ISC_LIST_NEXT(view, link))
+ dns_view_untrust(view, keyname, dnskey, mctx);
+}
+
+/*
+ * Add a null key to the security roots for all views, so that all queries
+ * to the zone will fail.
+ */
+static void
+fail_secure(dns_viewlist_t *viewlist, dns_name_t *keyname) {
+ isc_result_t result;
+ dns_view_t *view;
+
+ for (view = ISC_LIST_HEAD(*viewlist);
+ view != NULL;
+ view = ISC_LIST_NEXT(view, link)) {
+ dns_keytable_t *sr = NULL;
+
+ result = dns_view_getsecroots(view, &sr);
+ if (result != ISC_R_SUCCESS)
+ continue;
+
+ dns_keytable_marksecure(sr, keyname);
+ dns_keytable_detach(&sr);
+ }
+}
+
+/*
+ * Scan a set of KEYDATA records from the key zone. The ones that are
+ * valid (i.e., the add holddown timer has expired) become trusted keys for
+ * all views.
+ */
+static void
+load_secroots(dns_zone_t *zone, dns_name_t *name, dns_rdataset_t *rdataset) {
+ isc_result_t result;
+ dns_rdata_t rdata = DNS_RDATA_INIT;
+ dns_rdata_keydata_t keydata;
+ dns_rdata_dnskey_t dnskey;
+ isc_mem_t *mctx = zone->mctx;
+ dns_view_t *view = zone->view;
+ dns_viewlist_t *viewlist = view->viewlist;
+ int trusted = 0, revoked = 0, pending = 0;
+ isc_stdtime_t now;
+
+ isc_stdtime_get(&now);
+
+ /* For each view, delete references to this key from secroots. */
+ for (view = ISC_LIST_HEAD(*viewlist); view != NULL;
+ view = ISC_LIST_NEXT(view, link)) {
+ dns_keytable_t *sr = NULL;
+
+ result = dns_view_getsecroots(view, &sr);
+ if (result != ISC_R_SUCCESS)
+ continue;
+
+ dns_keytable_delete(sr, name);
+ dns_keytable_detach(&sr);
+ }
+
+ /* Now insert all the accepted trust anchors from this keydata set. */
+ for (result = dns_rdataset_first(rdataset);
+ result == ISC_R_SUCCESS;
+ result = dns_rdataset_next(rdataset)) {
+ dns_rdata_reset(&rdata);
+ dns_rdataset_current(rdataset, &rdata);
+
+ /* Convert rdata to keydata. */
+ dns_rdata_tostruct(&rdata, &keydata, NULL);
+
+ /* Set the key refresh timer. */
+ set_refreshkeytimer(zone, &keydata, now);
+
+ /* If the removal timer is nonzero, this key was revoked. */
+ if (keydata.removehd != 0) {
+ revoked++;
+ continue;
+ }
+
+ /*
+ * If the add timer is still pending, this key is not
+ * trusted yet.
+ */
+ if (now < keydata.addhd) {
+ pending++;
+ continue;
+ }
+
+ /* Convert keydata to dnskey. */
+ dns_keydata_todnskey(&keydata, &dnskey, NULL);
+
+ /* Add to keytables. */
+ trusted++;
+ trust_key(viewlist, name, &dnskey, mctx);
+ }
+
+ if (trusted == 0 && pending != 0) {
+ char namebuf[DNS_NAME_FORMATSIZE];
+ dns_name_format(name, namebuf, sizeof namebuf);
+ dns_zone_log(zone, ISC_LOG_ERROR,
+ "No valid trust anchors for '%s'!", namebuf);
+ dns_zone_log(zone, ISC_LOG_ERROR,
+ "%d key(s) revoked, %d still pending",
+ revoked, pending);
+ dns_zone_log(zone, ISC_LOG_ERROR,
+ "All queries to '%s' will fail", namebuf);
+ fail_secure(viewlist, name);
+ }
+}
+
+static isc_result_t
+do_one_tuple(dns_difftuple_t **tuple, dns_db_t *db, dns_dbversion_t *ver,
+ dns_diff_t *diff)
+{
+ dns_diff_t temp_diff;
+ isc_result_t result;
+
+ /*
+ * Create a singleton diff.
+ */
+ dns_diff_init(diff->mctx, &temp_diff);
+ temp_diff.resign = diff->resign;
+ ISC_LIST_APPEND(temp_diff.tuples, *tuple, link);
+
+ /*
+ * Apply it to the database.
+ */
+ result = dns_diff_apply(&temp_diff, db, ver);
+ ISC_LIST_UNLINK(temp_diff.tuples, *tuple, link);
+ if (result != ISC_R_SUCCESS) {
+ dns_difftuple_free(tuple);
+ return (result);
+ }
+
+ /*
+ * Merge it into the current pending journal entry.
+ */
+ dns_diff_appendminimal(diff, tuple);
+
+ /*
+ * Do not clear temp_diff.
+ */
+ return (ISC_R_SUCCESS);
+}
+
+static isc_result_t
+update_one_rr(dns_db_t *db, dns_dbversion_t *ver, dns_diff_t *diff,
+ dns_diffop_t op, dns_name_t *name, dns_ttl_t ttl,
+ dns_rdata_t *rdata)
+{
+ dns_difftuple_t *tuple = NULL;
+ isc_result_t result;
+ result = dns_difftuple_create(diff->mctx, op,
+ name, ttl, rdata, &tuple);
+ if (result != ISC_R_SUCCESS)
+ return (result);
+ return (do_one_tuple(&tuple, db, ver, diff));
+}
+
+static isc_result_t
+increment_soa_serial(dns_db_t *db, dns_dbversion_t *ver,
+ dns_diff_t *diff, isc_mem_t *mctx) {
+ dns_difftuple_t *deltuple = NULL;
+ dns_difftuple_t *addtuple = NULL;
+ isc_uint32_t serial;
+ isc_result_t result;
+
+ CHECK(dns_db_createsoatuple(db, ver, mctx, DNS_DIFFOP_DEL, &deltuple));
+ CHECK(dns_difftuple_copy(deltuple, &addtuple));
+ addtuple->op = DNS_DIFFOP_ADD;
+
+ serial = dns_soa_getserial(&addtuple->rdata);
+
+ /* RFC1982 */
+ serial = (serial + 1) & 0xFFFFFFFF;
+ if (serial == 0)
+ serial = 1;
+
+ dns_soa_setserial(serial, &addtuple->rdata);
+ CHECK(do_one_tuple(&deltuple, db, ver, diff));
+ CHECK(do_one_tuple(&addtuple, db, ver, diff));
+ result = ISC_R_SUCCESS;
+
+ failure:
+ if (addtuple != NULL)
+ dns_difftuple_free(&addtuple);
+ if (deltuple != NULL)
+ dns_difftuple_free(&deltuple);
+ return (result);
+}
+
+/*
+ * Write all transactions in 'diff' to the zone journal file.
+ */
+static isc_result_t
+zone_journal(dns_zone_t *zone, dns_diff_t *diff, const char *caller) {
+ const char me[] = "zone_journal";
+ const char *journalfile;
+ isc_result_t result = ISC_R_SUCCESS;
+ dns_journal_t *journal = NULL;
+
+ ENTER;
+ journalfile = dns_zone_getjournal(zone);
+ if (journalfile != NULL) {
+ result = dns_journal_open(zone->mctx, journalfile,
+ ISC_TRUE, &journal);
+ if (result != ISC_R_SUCCESS) {
+ dns_zone_log(zone, ISC_LOG_ERROR,
+ "%s:dns_journal_open -> %s\n",
+ caller, dns_result_totext(result));
+ return (result);
+ }
+
+ result = dns_journal_write_transaction(journal, diff);
+ dns_journal_destroy(&journal);
+ if (result != ISC_R_SUCCESS) {
+ dns_zone_log(zone, ISC_LOG_ERROR,
+ "%s:dns_journal_write_transaction -> %s\n",
+ caller, dns_result_totext(result));
+ return (result);
+ }
+ }
+ return (result);
+}
+
+/*
+ * Create an SOA record for a newly-created zone
+ */
+static isc_result_t
+add_soa(dns_zone_t *zone, dns_db_t *db) {
+ isc_result_t result;
+ dns_rdata_t rdata = DNS_RDATA_INIT;
+ unsigned char buf[DNS_SOA_BUFFERSIZE];
+ dns_dbversion_t *ver = NULL;
+ dns_diff_t diff;
+
+ dns_zone_log(zone, ISC_LOG_DEBUG(1), "creating SOA");
+
+ dns_diff_init(zone->mctx, &diff);
+ result = dns_db_newversion(db, &ver);
+ if (result != ISC_R_SUCCESS) {
+ dns_zone_log(zone, ISC_LOG_ERROR,
+ "add_soa:dns_db_newversion -> %s\n",
+ dns_result_totext(result));
+ goto failure;
+ }
+
+ /* Build SOA record */
+ result = dns_soa_buildrdata(&zone->origin, dns_rootname, zone->rdclass,
+ 0, 0, 0, 0, 0, buf, &rdata);
+ if (result != ISC_R_SUCCESS) {
+ dns_zone_log(zone, ISC_LOG_ERROR,
+ "add_soa:dns_soa_buildrdata -> %s\n",
+ dns_result_totext(result));
+ goto failure;
+ }
+
+ result = update_one_rr(db, ver, &diff, DNS_DIFFOP_ADD,
+ &zone->origin, 0, &rdata);
+
+failure:
+ dns_diff_clear(&diff);
+ if (ver != NULL)
+ dns_db_closeversion(db, &ver, ISC_TF(result == ISC_R_SUCCESS));
+
+ return (result);
+}
+
+/*
+ * Synchronize the set of initializing keys found in managed-keys {}
+ * statements with the set of trust anchors found in the managed-keys.bind
+ * zone. If a domain is no longer named in managed-keys, delete all keys
+ * from that domain from the key zone. If a domain is mentioned in in
+ * managed-keys but there are no references to it in the key zone, load
+ * the key zone with the initializing key(s) for that domain.
+ */
+static isc_result_t
+sync_keyzone(dns_zone_t *zone, dns_db_t *db) {
+ isc_result_t result = ISC_R_SUCCESS;
+ isc_boolean_t changed = ISC_FALSE;
+ dns_rbtnodechain_t chain;
+ dns_fixedname_t fn;
+ dns_name_t foundname, *origin;
+ dns_keynode_t *keynode = NULL;
+ dns_view_t *view = zone->view;
+ dns_keytable_t *sr = NULL;
+ dns_dbversion_t *ver = NULL;
+ dns_diff_t diff;
+ dns_rriterator_t rrit;
+
+ dns_zone_log(zone, ISC_LOG_DEBUG(1), "synchronizing trusted keys");
+
+ dns_name_init(&foundname, NULL);
+ dns_fixedname_init(&fn);
+ origin = dns_fixedname_name(&fn);
+
+ dns_diff_init(zone->mctx, &diff);
+
+ CHECK(dns_view_getsecroots(view, &sr));
+
+ result = dns_db_newversion(db, &ver);
+ if (result != ISC_R_SUCCESS) {
+ dns_zone_log(zone, ISC_LOG_ERROR,
+ "sync_keyzone:dns_db_newversion -> %s\n",
+ dns_result_totext(result));
+ goto failure;
+ }
+
+ /*
+ * Walk the zone DB. If we find any keys whose names are no longer
+ * in managed-keys (or *are* in trusted-keys, meaning they are
+ * permanent and not RFC5011-maintained), delete them from the
+ * zone. Otherwise call load_secroots(), which loads keys into
+ * secroots as appropriate.
+ */
+ dns_rriterator_init(&rrit, db, ver, 0);
+ for (result = dns_rriterator_first(&rrit);
+ result == ISC_R_SUCCESS;
+ result = dns_rriterator_nextrrset(&rrit)) {
+ dns_rdataset_t *rdataset;
+ dns_name_t *rrname = NULL;
+ isc_uint32_t ttl;
+
+ dns_rriterator_current(&rrit, &rrname, &ttl,
+ &rdataset, NULL);
+ if (!dns_rdataset_isassociated(rdataset)) {
+ dns_rriterator_destroy(&rrit);
+ goto failure;
+ }
+
+ if (rdataset->type != dns_rdatatype_keydata)
+ continue;
+
+ result = dns_keytable_find(sr, rrname, &keynode);
+ if ((result != ISC_R_SUCCESS &&
+ result != DNS_R_PARTIALMATCH) ||
+ dns_keynode_managed(keynode) == ISC_FALSE) {
+ CHECK(delete_keydata(db, ver, &diff,
+ rrname, rdataset));
+ changed = ISC_TRUE;
+ } else {
+ load_secroots(zone, rrname, rdataset);
+ }
+
+ if (keynode != NULL)
+ dns_keytable_detachkeynode(sr, &keynode);
+ }
+ dns_rriterator_destroy(&rrit);
+
+ /*
+ * Now walk secroots to find any managed keys that aren't
+ * in the zone. If we find any, we add them to the zone.
+ */
+ RWLOCK(&sr->rwlock, isc_rwlocktype_write);
+ dns_rbtnodechain_init(&chain, zone->mctx);
+ result = dns_rbtnodechain_first(&chain, sr->table, &foundname, origin);
+ if (result == ISC_R_NOTFOUND)
+ result = ISC_R_NOMORE;
+ while (result == DNS_R_NEWORIGIN || result == ISC_R_SUCCESS) {
+ dns_rbtnode_t *rbtnode = NULL;
+
+ dns_rbtnodechain_current(&chain, &foundname, origin, &rbtnode);
+ if (rbtnode->data == NULL)
+ goto skip;
+
+ dns_keytable_attachkeynode(sr, rbtnode->data, &keynode);
+ if (dns_keynode_managed(keynode)) {
+ dns_fixedname_t fname;
+ dns_name_t *keyname;
+ dst_key_t *key;
+
+ key = dns_keynode_key(keynode);
+ dns_fixedname_init(&fname);
+
+ if (key == NULL) /* fail_secure() was called. */
+ goto skip;
+
+ keyname = dst_key_name(key);
+ result = dns_db_find(db, keyname, ver,
+ dns_rdatatype_keydata,
+ DNS_DBFIND_NOWILD, 0, NULL,
+ dns_fixedname_name(&fname),
+ NULL, NULL);
+ if (result != ISC_R_SUCCESS)
+ result = create_keydata(zone, db, ver, &diff,
+ sr, &keynode, &changed);
+ if (result != ISC_R_SUCCESS)
+ break;
+ }
+ skip:
+ result = dns_rbtnodechain_next(&chain, &foundname, origin);
+ if (keynode != NULL)
+ dns_keytable_detachkeynode(sr, &keynode);
+ }
+ RWUNLOCK(&sr->rwlock, isc_rwlocktype_write);
+
+ if (result == ISC_R_NOMORE)
+ result = ISC_R_SUCCESS;
+
+ if (changed) {
+ /* Write changes to journal file. */
+ result = increment_soa_serial(db, ver, &diff, zone->mctx);
+ if (result == ISC_R_SUCCESS)
+ zone_journal(zone, &diff, "sync_keyzone");
+
+ DNS_ZONE_SETFLAG(zone, DNS_ZONEFLG_LOADED);
+ zone_needdump(zone, 30);
+ }
+
+ failure:
+ if (keynode != NULL)
+ dns_keytable_detachkeynode(sr, &keynode);
+ if (sr != NULL)
+ dns_keytable_detach(&sr);
+ if (ver != NULL)
+ dns_db_closeversion(db, &ver, changed);
+ dns_diff_clear(&diff);
+
+ return (result);
+}
+
static isc_result_t
zone_postload(dns_zone_t *zone, dns_db_t *db, isc_time_t loadtime,
isc_result_t result)
@@ -2467,6 +3319,7 @@ zone_postload(dns_zone_t *zone, dns_db_t *db, isc_time_t loadtime,
isc_time_t now;
isc_boolean_t needdump = ISC_FALSE;
isc_boolean_t hasinclude = DNS_ZONE_FLAG(zone, DNS_ZONEFLG_HASINCLUDE);
+ isc_boolean_t nomaster = ISC_FALSE;
unsigned int options;
TIME_NOW(&now);
@@ -2488,12 +3341,16 @@ zone_postload(dns_zone_t *zone, dns_db_t *db, isc_time_t loadtime,
"failed: %s",
zone->masterfile,
dns_result_totext(result));
- } else
+ } else {
dns_zone_log(zone, ISC_LOG_ERROR,
"loading from master file %s failed: %s",
zone->masterfile,
dns_result_totext(result));
- goto cleanup;
+ nomaster = ISC_TRUE;
+ }
+
+ if (zone->type != dns_zone_key)
+ goto cleanup;
}
dns_zone_log(zone, ISC_LOG_DEBUG(2),
@@ -2506,6 +3363,18 @@ zone_postload(dns_zone_t *zone, dns_db_t *db, isc_time_t loadtime,
DNS_ZONE_CLRFLAG(zone, DNS_ZONEFLG_HASINCLUDE);
/*
+ * If there's no master file for a key zone, then the zone is new:
+ * create an SOA record. (We do this now, instead of later, so that
+ * if there happens to be a journal file, we can roll forward from
+ * a sane starting point.)
+ */
+ if (nomaster && zone->type == dns_zone_key) {
+ result = add_soa(zone, db);
+ if (result != ISC_R_SUCCESS)
+ goto cleanup;
+ }
+
+ /*
* Apply update log, if any, on initial load.
*/
if (zone->journal != NULL &&
@@ -2552,7 +3421,7 @@ zone_postload(dns_zone_t *zone, dns_db_t *db, isc_time_t loadtime,
result = zone_get_from_db(zone, db, &nscount, &soacount, &serial,
&refresh, &retry, &expire, &minimum,
&errors);
- if (result != ISC_R_SUCCESS) {
+ if (result != ISC_R_SUCCESS && zone->type != dns_zone_key) {
dns_zone_log(zone, ISC_LOG_ERROR,
"could not find NS and/or SOA records");
}
@@ -2563,6 +3432,7 @@ zone_postload(dns_zone_t *zone, dns_db_t *db, isc_time_t loadtime,
*/
switch (zone->type) {
+ case dns_zone_dlz:
case dns_zone_master:
case dns_zone_slave:
case dns_zone_stub:
@@ -2594,6 +3464,13 @@ zone_postload(dns_zone_t *zone, dns_db_t *db, isc_time_t loadtime,
goto cleanup;
}
+ if (zone->type == dns_zone_master &&
+ DNS_ZONE_OPTION(zone, DNS_ZONEOPT_CHECKDUPRR) &&
+ !zone_check_dup(zone, db)) {
+ result = DNS_R_BADZONE;
+ goto cleanup;
+ }
+
if (zone->db != NULL) {
/*
* This is checked in zone_replacedb() for slave zones
@@ -2621,12 +3498,13 @@ zone_postload(dns_zone_t *zone, dns_db_t *db, isc_time_t loadtime,
goto cleanup;
} else if (!isc_serial_ge(serial, oldserial))
dns_zone_log(zone, ISC_LOG_ERROR,
- "zone serial has gone backwards");
+ "zone serial (%u/%u) has gone "
+ "backwards", serial, oldserial);
else if (serial == oldserial && !hasinclude)
dns_zone_log(zone, ISC_LOG_ERROR,
- "zone serial unchanged. "
+ "zone serial (%u) unchanged. "
"zone may fail to transfer "
- "to slaves.");
+ "to slaves.", serial);
}
if (zone->type == dns_zone_master &&
@@ -2672,6 +3550,13 @@ zone_postload(dns_zone_t *zone, dns_db_t *db, isc_time_t loadtime,
zone->refreshtime = now;
}
break;
+
+ case dns_zone_key:
+ result = sync_keyzone(zone, db);
+ if (result != ISC_R_SUCCESS)
+ goto cleanup;
+ break;
+
default:
UNEXPECTED_ERROR(__FILE__, __LINE__,
"unexpected zone type %d", zone->type);
@@ -2685,6 +3570,13 @@ zone_postload(dns_zone_t *zone, dns_db_t *db, isc_time_t loadtime,
if (zone->type == dns_zone_master)
zone_check_dnskeys(zone, db);
+ /*
+ * Schedule DNSSEC key refresh.
+ */
+ if (zone->type == dns_zone_master &&
+ DNS_ZONEKEY_OPTION(zone, DNS_ZONEKEY_MAINTAIN))
+ zone->refreshkeytime = now;
+
#if 0
/* destroy notification example. */
{
@@ -2709,9 +3601,16 @@ zone_postload(dns_zone_t *zone, dns_db_t *db, isc_time_t loadtime,
DNS_ZONE_SETFLAG(zone,
DNS_ZONEFLG_LOADED|DNS_ZONEFLG_NEEDNOTIFY);
}
+
result = ISC_R_SUCCESS;
- if (needdump)
- zone_needdump(zone, DNS_DUMP_DELAY);
+
+ if (needdump) {
+ if (zone->type == dns_zone_key)
+ zone_needdump(zone, 30);
+ else
+ zone_needdump(zone, DNS_DUMP_DELAY);
+ }
+
if (zone->task != NULL) {
if (zone->type == dns_zone_master) {
set_resigntime(zone);
@@ -2723,13 +3622,14 @@ zone_postload(dns_zone_t *zone, dns_db_t *db, isc_time_t loadtime,
if (! dns_db_ispersistent(db))
dns_zone_log(zone, ISC_LOG_INFO, "loaded serial %u%s", serial,
- dns_db_issecure(db) ? " (signed)" : "");
+ dns_db_issecure(db) ? " (DNSSEC signed)" : "");
return (result);
cleanup:
if (zone->type == dns_zone_slave ||
- zone->type == dns_zone_stub) {
+ zone->type == dns_zone_stub ||
+ zone->type == dns_zone_key) {
if (zone->journal != NULL)
zone_saveunique(zone, zone->journal, "jn-XXXXXXXX");
if (zone->masterfile != NULL)
@@ -2763,7 +3663,9 @@ exit_check(dns_zone_t *zone) {
}
static isc_boolean_t
-zone_check_ns(dns_zone_t *zone, dns_db_t *db, dns_name_t *name) {
+zone_check_ns(dns_zone_t *zone, dns_db_t *db, dns_dbversion_t *version,
+ dns_name_t *name, isc_boolean_t logit)
+{
isc_result_t result;
char namebuf[DNS_NAME_FORMATSIZE];
char altbuf[DNS_NAME_FORMATSIZE];
@@ -2782,42 +3684,45 @@ zone_check_ns(dns_zone_t *zone, dns_db_t *db, dns_name_t *name) {
dns_fixedname_init(&fixed);
foundname = dns_fixedname_name(&fixed);
- result = dns_db_find(db, name, NULL, dns_rdatatype_a,
+ result = dns_db_find(db, name, version, dns_rdatatype_a,
0, 0, NULL, foundname, NULL, NULL);
if (result == ISC_R_SUCCESS)
return (ISC_TRUE);
if (result == DNS_R_NXRRSET) {
- result = dns_db_find(db, name, NULL, dns_rdatatype_aaaa,
+ result = dns_db_find(db, name, version, dns_rdatatype_aaaa,
0, 0, NULL, foundname, NULL, NULL);
if (result == ISC_R_SUCCESS)
return (ISC_TRUE);
}
- dns_name_format(name, namebuf, sizeof namebuf);
if (result == DNS_R_NXRRSET || result == DNS_R_NXDOMAIN ||
result == DNS_R_EMPTYNAME) {
- dns_zone_log(zone, level,
- "NS '%s' has no address records (A or AAAA)",
- namebuf);
- /* XXX950 Make fatal ISC_FALSE for 9.5.0. */
- return (ISC_TRUE);
+ if (logit) {
+ dns_name_format(name, namebuf, sizeof namebuf);
+ dns_zone_log(zone, level, "NS '%s' has no address "
+ "records (A or AAAA)", namebuf);
+ }
+ return (ISC_FALSE);
}
if (result == DNS_R_CNAME) {
- dns_zone_log(zone, level, "NS '%s' is a CNAME (illegal)",
- namebuf);
- /* XXX950 Make fatal ISC_FALSE for 9.5.0. */
- return (ISC_TRUE);
+ if (logit) {
+ dns_name_format(name, namebuf, sizeof namebuf);
+ dns_zone_log(zone, level, "NS '%s' is a CNAME "
+ "(illegal)", namebuf);
+ }
+ return (ISC_FALSE);
}
if (result == DNS_R_DNAME) {
- dns_name_format(foundname, altbuf, sizeof altbuf);
- dns_zone_log(zone, level,
- "NS '%s' is below a DNAME '%s' (illegal)",
- namebuf, altbuf);
- /* XXX950 Make fatal ISC_FALSE for 9.5.0. */
- return (ISC_TRUE);
+ if (logit) {
+ dns_name_format(name, namebuf, sizeof namebuf);
+ dns_name_format(foundname, altbuf, sizeof altbuf);
+ dns_zone_log(zone, level, "NS '%s' is below a DNAME "
+ "'%s' (illegal)", namebuf, altbuf);
+ }
+ return (ISC_FALSE);
}
return (ISC_TRUE);
@@ -2826,7 +3731,7 @@ zone_check_ns(dns_zone_t *zone, dns_db_t *db, dns_name_t *name) {
static isc_result_t
zone_count_ns_rr(dns_zone_t *zone, dns_db_t *db, dns_dbnode_t *node,
dns_dbversion_t *version, unsigned int *nscount,
- unsigned int *errors)
+ unsigned int *errors, isc_boolean_t logit)
{
isc_result_t result;
unsigned int count = 0;
@@ -2838,10 +3743,14 @@ zone_count_ns_rr(dns_zone_t *zone, dns_db_t *db, dns_dbnode_t *node,
dns_rdataset_init(&rdataset);
result = dns_db_findrdataset(db, node, version, dns_rdatatype_ns,
dns_rdatatype_none, 0, &rdataset, NULL);
- if (result == ISC_R_NOTFOUND)
+ if (result == ISC_R_NOTFOUND) {
+ INSIST(!dns_rdataset_isassociated(&rdataset));
goto success;
- if (result != ISC_R_SUCCESS)
+ }
+ if (result != ISC_R_SUCCESS) {
+ INSIST(!dns_rdataset_isassociated(&rdataset));
goto invalidate_rdataset;
+ }
result = dns_rdataset_first(&rdataset);
while (result == ISC_R_SUCCESS) {
@@ -2853,7 +3762,7 @@ zone_count_ns_rr(dns_zone_t *zone, dns_db_t *db, dns_dbnode_t *node,
result = dns_rdata_tostruct(&rdata, &ns, NULL);
RUNTIME_CHECK(result == ISC_R_SUCCESS);
if (dns_name_issubdomain(&ns.name, &zone->origin) &&
- !zone_check_ns(zone, db, &ns.name))
+ !zone_check_ns(zone, db, version, &ns.name, logit))
ecount++;
}
count++;
@@ -2892,6 +3801,7 @@ zone_load_soa_rr(dns_db_t *db, dns_dbnode_t *node, dns_dbversion_t *version,
result = dns_db_findrdataset(db, node, version, dns_rdatatype_soa,
dns_rdatatype_none, 0, &rdataset, NULL);
if (result == ISC_R_NOTFOUND) {
+ INSIST(!dns_rdataset_isassociated(&rdataset));
if (soacount != NULL)
*soacount = 0;
if (serial != NULL)
@@ -2907,8 +3817,10 @@ zone_load_soa_rr(dns_db_t *db, dns_dbnode_t *node, dns_dbversion_t *version,
result = ISC_R_SUCCESS;
goto invalidate_rdataset;
}
- if (result != ISC_R_SUCCESS)
+ if (result != ISC_R_SUCCESS) {
+ INSIST(!dns_rdataset_isassociated(&rdataset));
goto invalidate_rdataset;
+ }
count = 0;
result = dns_rdataset_first(&rdataset);
@@ -2960,15 +3872,14 @@ zone_get_from_db(dns_zone_t *zone, dns_db_t *db, unsigned int *nscount,
isc_uint32_t *expire, isc_uint32_t *minimum,
unsigned int *errors)
{
- dns_dbversion_t *version;
isc_result_t result;
isc_result_t answer = ISC_R_SUCCESS;
+ dns_dbversion_t *version = NULL;
dns_dbnode_t *node;
REQUIRE(db != NULL);
REQUIRE(zone != NULL);
- version = NULL;
dns_db_currentversion(db, &version);
node = NULL;
@@ -2980,7 +3891,7 @@ zone_get_from_db(dns_zone_t *zone, dns_db_t *db, unsigned int *nscount,
if (nscount != NULL || errors != NULL) {
result = zone_count_ns_rr(zone, db, node, version,
- nscount, errors);
+ nscount, errors, ISC_TRUE);
if (result != ISC_R_SUCCESS)
answer = result;
}
@@ -3028,7 +3939,7 @@ dns_zone_detach(dns_zone_t **zonep) {
*/
if (zone->task != NULL) {
/*
- * This zone is being managed. Post
+ * This zone is being managed. Post
* its control event and let it clean
* up synchronously in the context of
* its task.
@@ -3163,6 +4074,27 @@ dns_zone_getoptions(dns_zone_t *zone) {
return (zone->options);
}
+void
+dns_zone_setkeyopt(dns_zone_t *zone, unsigned int keyopt, isc_boolean_t value)
+{
+ REQUIRE(DNS_ZONE_VALID(zone));
+
+ LOCK_ZONE(zone);
+ if (value)
+ zone->keyopts |= keyopt;
+ else
+ zone->keyopts &= ~keyopt;
+ UNLOCK_ZONE(zone);
+}
+
+unsigned int
+dns_zone_getkeyopts(dns_zone_t *zone) {
+
+ REQUIRE(DNS_ZONE_VALID(zone));
+
+ return (zone->keyopts);
+}
+
isc_result_t
dns_zone_setxfrsource4(dns_zone_t *zone, const isc_sockaddr_t *xfrsource) {
REQUIRE(DNS_ZONE_VALID(zone));
@@ -3499,6 +4431,17 @@ dns_zone_getdb(dns_zone_t *zone, dns_db_t **dpb) {
return (result);
}
+void
+dns_zone_setdb(dns_zone_t *zone, dns_db_t *db) {
+ REQUIRE(DNS_ZONE_VALID(zone));
+ REQUIRE(zone->type == dns_zone_staticstub);
+
+ ZONEDB_LOCK(&zone->dblock, isc_rwlocktype_write);
+ REQUIRE(zone->db == NULL);
+ dns_db_attach(db, &zone->db);
+ ZONEDB_UNLOCK(&zone->dblock, isc_rwlocktype_write);
+}
+
/*
* Co-ordinates the starting of routine jobs.
*/
@@ -3535,126 +4478,6 @@ was_dumping(dns_zone_t *zone) {
#define MAXZONEKEYS 10
static isc_result_t
-do_one_tuple(dns_difftuple_t **tuple, dns_db_t *db, dns_dbversion_t *ver,
- dns_diff_t *diff)
-{
- dns_diff_t temp_diff;
- isc_result_t result;
-
- /*
- * Create a singleton diff.
- */
- dns_diff_init(diff->mctx, &temp_diff);
- temp_diff.resign = diff->resign;
- ISC_LIST_APPEND(temp_diff.tuples, *tuple, link);
-
- /*
- * Apply it to the database.
- */
- result = dns_diff_apply(&temp_diff, db, ver);
- ISC_LIST_UNLINK(temp_diff.tuples, *tuple, link);
- if (result != ISC_R_SUCCESS) {
- dns_difftuple_free(tuple);
- return (result);
- }
-
- /*
- * Merge it into the current pending journal entry.
- */
- dns_diff_appendminimal(diff, tuple);
-
- /*
- * Do not clear temp_diff.
- */
- return (ISC_R_SUCCESS);
-}
-
-static isc_result_t
-increment_soa_serial(dns_db_t *db, dns_dbversion_t *ver,
- dns_diff_t *diff, isc_mem_t *mctx)
-{
- dns_difftuple_t *deltuple = NULL;
- dns_difftuple_t *addtuple = NULL;
- isc_uint32_t serial;
- isc_result_t result;
-
- CHECK(dns_db_createsoatuple(db, ver, mctx, DNS_DIFFOP_DEL, &deltuple));
- CHECK(dns_difftuple_copy(deltuple, &addtuple));
- addtuple->op = DNS_DIFFOP_ADD;
-
- serial = dns_soa_getserial(&addtuple->rdata);
-
- /* RFC1982 */
- serial = (serial + 1) & 0xFFFFFFFF;
- if (serial == 0)
- serial = 1;
-
- dns_soa_setserial(serial, &addtuple->rdata);
- CHECK(do_one_tuple(&deltuple, db, ver, diff));
- CHECK(do_one_tuple(&addtuple, db, ver, diff));
- result = ISC_R_SUCCESS;
-
- failure:
- if (addtuple != NULL)
- dns_difftuple_free(&addtuple);
- if (deltuple != NULL)
- dns_difftuple_free(&deltuple);
- return (result);
-}
-
-static isc_result_t
-update_one_rr(dns_db_t *db, dns_dbversion_t *ver, dns_diff_t *diff,
- dns_diffop_t op, dns_name_t *name, dns_ttl_t ttl,
- dns_rdata_t *rdata)
-{
- dns_difftuple_t *tuple = NULL;
- isc_result_t result;
- result = dns_difftuple_create(diff->mctx, op,
- name, ttl, rdata, &tuple);
- if (result != ISC_R_SUCCESS)
- return (result);
- return (do_one_tuple(&tuple, db, ver, diff));
-}
-
-static isc_boolean_t
-ksk_sanity(dns_db_t *db, dns_dbversion_t *ver) {
- isc_boolean_t ret = ISC_FALSE;
- isc_boolean_t have_ksk = ISC_FALSE, have_nonksk = ISC_FALSE;
- isc_result_t result;
- dns_dbnode_t *node = NULL;
- dns_rdataset_t rdataset;
- dns_rdata_t rdata = DNS_RDATA_INIT;
- dns_rdata_dnskey_t dnskey;
-
- dns_rdataset_init(&rdataset);
- CHECK(dns_db_findnode(db, dns_db_origin(db), ISC_FALSE, &node));
- CHECK(dns_db_findrdataset(db, node, ver, dns_rdatatype_dnskey, 0, 0,
- &rdataset, NULL));
- CHECK(dns_rdataset_first(&rdataset));
- while (result == ISC_R_SUCCESS && (!have_ksk || !have_nonksk)) {
- dns_rdataset_current(&rdataset, &rdata);
- CHECK(dns_rdata_tostruct(&rdata, &dnskey, NULL));
- if ((dnskey.flags & (DNS_KEYFLAG_OWNERMASK|DNS_KEYTYPE_NOAUTH))
- == DNS_KEYOWNER_ZONE) {
- if ((dnskey.flags & DNS_KEYFLAG_KSK) != 0)
- have_ksk = ISC_TRUE;
- else
- have_nonksk = ISC_TRUE;
- }
- dns_rdata_reset(&rdata);
- result = dns_rdataset_next(&rdataset);
- }
- if (have_ksk && have_nonksk)
- ret = ISC_TRUE;
- failure:
- if (dns_rdataset_isassociated(&rdataset))
- dns_rdataset_disassociate(&rdataset);
- if (node != NULL)
- dns_db_detachnode(db, &node);
- return (ret);
-}
-
-static isc_result_t
find_zone_keys(dns_zone_t *zone, dns_db_t *db, dns_dbversion_t *ver,
isc_mem_t *mctx, unsigned int maxkeys,
dst_key_t **keys, unsigned int *nkeys)
@@ -3752,10 +4575,14 @@ del_sigs(dns_zone_t *zone, dns_db_t *db, dns_dbversion_t *ver, dns_name_t *name,
(isc_stdtime_t) 0, &rdataset, NULL);
dns_db_detachnode(db, &node);
- if (result == ISC_R_NOTFOUND)
+ if (result == ISC_R_NOTFOUND) {
+ INSIST(!dns_rdataset_isassociated(&rdataset));
return (ISC_R_SUCCESS);
- if (result != ISC_R_SUCCESS)
+ }
+ if (result != ISC_R_SUCCESS) {
+ INSIST(!dns_rdataset_isassociated(&rdataset));
goto failure;
+ }
for (result = dns_rdataset_first(&rdataset);
result == ISC_R_SUCCESS;
@@ -3841,7 +4668,8 @@ static isc_result_t
add_sigs(dns_db_t *db, dns_dbversion_t *ver, dns_name_t *name,
dns_rdatatype_t type, dns_diff_t *diff, dst_key_t **keys,
unsigned int nkeys, isc_mem_t *mctx, isc_stdtime_t inception,
- isc_stdtime_t expire, isc_boolean_t check_ksk)
+ isc_stdtime_t expire, isc_boolean_t check_ksk,
+ isc_boolean_t keyset_kskonly)
{
isc_result_t result;
dns_dbnode_t *node = NULL;
@@ -3849,7 +4677,7 @@ add_sigs(dns_db_t *db, dns_dbversion_t *ver, dns_name_t *name,
dns_rdata_t sig_rdata = DNS_RDATA_INIT;
unsigned char data[1024]; /* XXX */
isc_buffer_t buffer;
- unsigned int i;
+ unsigned int i, j;
dns_rdataset_init(&rdataset);
isc_buffer_init(&buffer, data, sizeof(data));
@@ -3865,18 +4693,59 @@ add_sigs(dns_db_t *db, dns_dbversion_t *ver, dns_name_t *name,
result = dns_db_findrdataset(db, node, ver, type, 0,
(isc_stdtime_t) 0, &rdataset, NULL);
dns_db_detachnode(db, &node);
- if (result == ISC_R_NOTFOUND)
+ if (result == ISC_R_NOTFOUND) {
+ INSIST(!dns_rdataset_isassociated(&rdataset));
return (ISC_R_SUCCESS);
- if (result != ISC_R_SUCCESS)
+ }
+ if (result != ISC_R_SUCCESS) {
+ INSIST(!dns_rdataset_isassociated(&rdataset));
goto failure;
+ }
+
+#define REVOKE(x) ((dst_key_flags(x) & DNS_KEYFLAG_REVOKE) != 0)
+#define KSK(x) ((dst_key_flags(x) & DNS_KEYFLAG_KSK) != 0)
+#define ALG(x) dst_key_alg(x)
for (i = 0; i < nkeys; i++) {
- if (check_ksk && type != dns_rdatatype_dnskey &&
- (dst_key_flags(keys[i]) & DNS_KEYFLAG_KSK) != 0)
- continue;
+ isc_boolean_t both = ISC_FALSE;
+
if (!dst_key_isprivate(keys[i]))
continue;
+
+ if (check_ksk && !REVOKE(keys[i])) {
+ isc_boolean_t have_ksk, have_nonksk;
+ if (KSK(keys[i])) {
+ have_ksk = ISC_TRUE;
+ have_nonksk = ISC_FALSE;
+ } else {
+ have_ksk = ISC_FALSE;
+ have_nonksk = ISC_TRUE;
+ }
+ for (j = 0; j < nkeys; j++) {
+ if (j == i || ALG(keys[i]) != ALG(keys[j]))
+ continue;
+ if (REVOKE(keys[j]))
+ continue;
+ if (KSK(keys[j]))
+ have_ksk = ISC_TRUE;
+ else
+ have_nonksk = ISC_TRUE;
+ both = have_ksk && have_nonksk;
+ if (both)
+ break;
+ }
+ }
+ if (both) {
+ if (type == dns_rdatatype_dnskey) {
+ if (!KSK(keys[i]) && keyset_kskonly)
+ continue;
+ } else if (KSK(keys[i]))
+ continue;
+ } else if (REVOKE(keys[i]) && type != dns_rdatatype_dnskey)
+ continue;
+
/* Calculate the signature, creating a RRSIG RDATA. */
+ isc_buffer_clear(&buffer);
CHECK(dns_dnssec_sign(name, &rdataset, keys[i],
&inception, &expire,
mctx, &buffer, &sig_rdata));
@@ -3898,7 +4767,6 @@ add_sigs(dns_db_t *db, dns_dbversion_t *ver, dns_name_t *name,
static void
zone_resigninc(dns_zone_t *zone) {
- const char *journalfile;
dns_db_t *db = NULL;
dns_dbversion_t *version = NULL;
dns_diff_t sig_diff;
@@ -3907,7 +4775,7 @@ zone_resigninc(dns_zone_t *zone) {
dns_rdataset_t rdataset;
dns_rdatatype_t covers;
dst_key_t *zone_keys[MAXZONEKEYS];
- isc_boolean_t check_ksk;
+ isc_boolean_t check_ksk, keyset_kskonly = ISC_FALSE;
isc_result_t result;
isc_stdtime_t now, inception, soaexpire, expire, stop;
isc_uint32_t jitter;
@@ -3962,8 +4830,7 @@ zone_resigninc(dns_zone_t *zone) {
stop = now + 5;
check_ksk = DNS_ZONE_OPTION(zone, DNS_ZONEOPT_UPDATECHECKKSK);
- if (check_ksk)
- check_ksk = ksk_sanity(db, version);
+ keyset_kskonly = DNS_ZONE_OPTION(zone, DNS_ZONEOPT_DNSKEYKSKONLY);
name = dns_fixedname_name(&fixed);
result = dns_db_getsigningtime(db, &rdataset, name);
@@ -4007,14 +4874,14 @@ zone_resigninc(dns_zone_t *zone) {
}
result = add_sigs(db, version, name, covers, &sig_diff,
zone_keys, nkeys, zone->mctx, inception,
- expire, check_ksk);
+ expire, check_ksk, keyset_kskonly);
if (result != ISC_R_SUCCESS) {
dns_zone_log(zone, ISC_LOG_ERROR,
"zone_resigninc:add_sigs -> %s\n",
dns_result_totext(result));
break;
}
- result = dns_db_getsigningtime(db, &rdataset,
+ result = dns_db_getsigningtime(db, &rdataset,
dns_fixedname_name(&fixed));
if (nkeys == 0 && result == ISC_R_NOTFOUND) {
result = ISC_R_SUCCESS;
@@ -4052,7 +4919,7 @@ zone_resigninc(dns_zone_t *zone) {
*/
result = add_sigs(db, version, &zone->origin, dns_rdatatype_soa,
&sig_diff, zone_keys, nkeys, zone->mctx, inception,
- soaexpire, check_ksk);
+ soaexpire, check_ksk, keyset_kskonly);
if (result != ISC_R_SUCCESS) {
dns_zone_log(zone, ISC_LOG_ERROR,
"zone_resigninc:add_sigs -> %s\n",
@@ -4060,31 +4927,10 @@ zone_resigninc(dns_zone_t *zone) {
goto failure;
}
- journalfile = dns_zone_getjournal(zone);
- if (journalfile != NULL) {
- dns_journal_t *journal = NULL;
- result = dns_journal_open(zone->mctx, journalfile,
- ISC_TRUE, &journal);
- if (result != ISC_R_SUCCESS) {
- dns_zone_log(zone, ISC_LOG_ERROR,
- "zone_resigninc:dns_journal_open -> %s\n",
- dns_result_totext(result));
- goto failure;
- }
-
- result = dns_journal_write_transaction(journal, &sig_diff);
- dns_journal_destroy(&journal);
- if (result != ISC_R_SUCCESS) {
- dns_zone_log(zone, ISC_LOG_ERROR,
- "zone_resigninc:dns_journal_write_transaction -> %s\n",
- dns_result_totext(result));
- goto failure;
- }
- }
+ /* Write changes to journal file. */
+ zone_journal(zone, &sig_diff, "zone_resigninc");
- /*
- * Everything has succeeded. Commit the changes.
- */
+ /* Everything has succeeded. Commit the changes. */
dns_db_closeversion(db, &version, ISC_TRUE);
failure:
@@ -4151,16 +4997,6 @@ next_active(dns_db_t *db, dns_dbversion_t *version, dns_name_t *oldname,
return (result);
}
-static void
-set_bit(unsigned char *array, unsigned int index) {
- unsigned int shift, mask;
-
- shift = 7 - (index % 8);
- mask = 1 << shift;
-
- array[index / 8] |= mask;
-}
-
static isc_boolean_t
signed_with_key(dns_db_t *db, dns_dbnode_t *node, dns_dbversion_t *version,
dns_rdatatype_t type, dst_key_t *key)
@@ -4173,8 +5009,10 @@ signed_with_key(dns_db_t *db, dns_dbnode_t *node, dns_dbversion_t *version,
dns_rdataset_init(&rdataset);
result = dns_db_findrdataset(db, node, version, dns_rdatatype_rrsig,
type, 0, &rdataset, NULL);
- if (result != ISC_R_SUCCESS)
+ if (result != ISC_R_SUCCESS) {
+ INSIST(!dns_rdataset_isassociated(&rdataset));
return (ISC_FALSE);
+ }
for (result = dns_rdataset_first(&rdataset);
result == ISC_R_SUCCESS;
result = dns_rdataset_next(&rdataset)) {
@@ -4209,21 +5047,6 @@ add_nsec(dns_db_t *db, dns_dbversion_t *version, dns_name_t *name,
CHECK(next_active(db, version, name, next, bottom));
CHECK(dns_nsec_buildrdata(db, version, node, next, nsecbuffer,
&rdata));
- if (dns_name_equal(dns_db_origin(db), name)) {
- /*
- * Set the OPT bit to indicate that this is a
- * partially secure zone.
- */
- isc_region_t region;
-
- dns_rdata_toregion(&rdata, &region);
- dns_name_fromregion(next, &region);
- isc_region_consume(&region, next->length);
- INSIST(region.length > (2 + dns_rdatatype_opt / 8) &&
- region.base[0] == 0 &&
- region.base[1] > dns_rdatatype_opt / 8);
- set_bit(region.base + 2, dns_rdatatype_opt);
- }
CHECK(update_one_rr(db, version, diff, DNS_DIFFOP_ADD, name, ttl,
&rdata));
failure:
@@ -4236,8 +5059,8 @@ sign_a_node(dns_db_t *db, dns_name_t *name, dns_dbnode_t *node,
isc_boolean_t build_nsec, dst_key_t *key,
isc_stdtime_t inception, isc_stdtime_t expire,
unsigned int minimum, isc_boolean_t is_ksk,
- isc_boolean_t *delegation, dns_diff_t *diff,
- isc_int32_t *signatures, isc_mem_t *mctx)
+ isc_boolean_t keyset_kskonly, isc_boolean_t *delegation,
+ dns_diff_t *diff, isc_int32_t *signatures, isc_mem_t *mctx)
{
isc_result_t result;
dns_rdatasetiter_t *iterator = NULL;
@@ -4255,6 +5078,7 @@ sign_a_node(dns_db_t *db, dns_name_t *name, dns_dbnode_t *node,
result = ISC_R_SUCCESS;
return (result);
}
+
dns_rdataset_init(&rdataset);
isc_buffer_init(&buffer, data, sizeof(data));
seen_rr = seen_soa = seen_ns = seen_dname = seen_nsec =
@@ -4275,7 +5099,8 @@ sign_a_node(dns_db_t *db, dns_name_t *name, dns_dbnode_t *node,
seen_nsec = ISC_TRUE;
else if (rdataset.type == dns_rdatatype_nsec3)
seen_nsec3 = ISC_TRUE;
- seen_rr = ISC_TRUE;
+ if (rdataset.type != dns_rdatatype_rrsig)
+ seen_rr = ISC_TRUE;
dns_rdataset_disassociate(&rdataset);
}
if (result != ISC_R_NOMORE)
@@ -4299,9 +5124,15 @@ sign_a_node(dns_db_t *db, dns_name_t *name, dns_dbnode_t *node,
if (build_nsec && !seen_nsec3 && !seen_nsec && seen_rr) {
/* Build and add NSEC. */
bottom = (seen_ns && !seen_soa) || seen_dname;
- CHECK(add_nsec(db, version, name, node, minimum, bottom, diff));
- /* Count a NSEC generation as a signature generation. */
- (*signatures)--;
+ /*
+ * Build a NSEC record except at the origin.
+ */
+ if (!dns_name_equal(name, dns_db_origin(db))) {
+ CHECK(add_nsec(db, version, name, node, minimum,
+ bottom, diff));
+ /* Count a NSEC generation as a signature generation. */
+ (*signatures)--;
+ }
}
result = dns_rdatasetiter_first(iterator);
while (result == ISC_R_SUCCESS) {
@@ -4309,7 +5140,10 @@ sign_a_node(dns_db_t *db, dns_name_t *name, dns_dbnode_t *node,
if (rdataset.type == dns_rdatatype_soa ||
rdataset.type == dns_rdatatype_rrsig)
goto next_rdataset;
- if (is_ksk && rdataset.type != dns_rdatatype_dnskey)
+ if (rdataset.type == dns_rdatatype_dnskey) {
+ if (!is_ksk && keyset_kskonly)
+ goto next_rdataset;
+ } else if (is_ksk)
goto next_rdataset;
if (*delegation &&
rdataset.type != dns_rdatatype_ds &&
@@ -4318,6 +5152,7 @@ sign_a_node(dns_db_t *db, dns_name_t *name, dns_dbnode_t *node,
if (signed_with_key(db, node, version, rdataset.type, key))
goto next_rdataset;
/* Calculate the signature, creating a RRSIG RDATA. */
+ isc_buffer_clear(&buffer);
CHECK(dns_dnssec_sign(name, &rdataset, key, &inception,
&expire, mctx, &buffer, &rdata));
/* Update the database and journal with the RRSIG. */
@@ -4334,7 +5169,7 @@ sign_a_node(dns_db_t *db, dns_name_t *name, dns_dbnode_t *node,
result = ISC_R_SUCCESS;
if (seen_dname)
*delegation = ISC_TRUE;
-failure:
+ failure:
if (dns_rdataset_isassociated(&rdataset))
dns_rdataset_disassociate(&rdataset);
if (iterator != NULL)
@@ -4342,63 +5177,45 @@ failure:
return (result);
}
+/*
+ * If 'update_only' is set then don't create a NSEC RRset if it doesn't exist.
+ */
static isc_result_t
updatesecure(dns_db_t *db, dns_dbversion_t *version, dns_name_t *name,
- dns_ttl_t minimum, isc_boolean_t *secureupdated, dns_diff_t *diff)
+ dns_ttl_t minimum, isc_boolean_t update_only, dns_diff_t *diff)
{
isc_result_t result;
- dns_rdata_t rdata = DNS_RDATA_INIT;
- unsigned char nsecbuffer[DNS_NSEC_BUFFERSIZE];
dns_rdataset_t rdataset;
- dns_rdata_nsec_t nsec;
dns_dbnode_t *node = NULL;
- /*
- * Check to see if the OPT bit has already been cleared.
- */
CHECK(dns_db_getoriginnode(db, &node));
- dns_rdataset_init(&rdataset);
- CHECK(dns_db_findrdataset(db, node, version, dns_rdatatype_nsec,
- dns_rdatatype_none, 0, &rdataset, NULL));
- CHECK(dns_rdataset_first(&rdataset));
- dns_rdataset_current(&rdataset, &rdata);
-
- /*
- * Find the NEXT name for building the new record.
- */
- CHECK(dns_rdata_tostruct(&rdata, &nsec, NULL));
-
- /*
- * Delete the old NSEC record.
- */
- CHECK(update_one_rr(db, version, diff, DNS_DIFFOP_DEL, name, minimum,
- &rdata));
- dns_rdata_reset(&rdata);
-
- /*
- * Add the new NSEC record.
- */
- CHECK(dns_nsec_buildrdata(db, version, node, &nsec.next, nsecbuffer,
- &rdata));
- CHECK(update_one_rr(db, version, diff, DNS_DIFFOP_ADD, name, minimum,
- &rdata));
- dns_rdata_reset(&rdata);
-
- if (secureupdated != NULL)
- *secureupdated = ISC_TRUE;
-
+ if (update_only) {
+ dns_rdataset_init(&rdataset);
+ result = dns_db_findrdataset(db, node, version,
+ dns_rdatatype_nsec,
+ dns_rdatatype_none,
+ 0, &rdataset, NULL);
+ if (dns_rdataset_isassociated(&rdataset))
+ dns_rdataset_disassociate(&rdataset);
+ if (result == ISC_R_NOTFOUND)
+ goto success;
+ if (result != ISC_R_SUCCESS)
+ goto failure;
+ }
+ CHECK(delete_nsec(db, version, node, name, diff));
+ CHECK(add_nsec(db, version, name, node, minimum, ISC_FALSE, diff));
+ success:
+ result = ISC_R_SUCCESS;
failure:
if (node != NULL)
dns_db_detachnode(db, &node);
- if (dns_rdataset_isassociated(&rdataset))
- dns_rdataset_disassociate(&rdataset);
return (result);
}
static isc_result_t
-updatesignwithkey(dns_signing_t *signing, dns_dbversion_t *version,
- dns_name_t *name, dns_rdatatype_t privatetype,
- dns_diff_t *diff)
+updatesignwithkey(dns_zone_t *zone, dns_signing_t *signing,
+ dns_dbversion_t *version, isc_boolean_t build_nsec3,
+ dns_ttl_t minimum, dns_diff_t *diff)
{
isc_result_t result;
dns_dbnode_t *node = NULL;
@@ -4406,43 +5223,68 @@ updatesignwithkey(dns_signing_t *signing, dns_dbversion_t *version,
dns_rdata_t rdata = DNS_RDATA_INIT;
unsigned char data[5];
isc_boolean_t seen_done = ISC_FALSE;
+ isc_boolean_t have_rr = ISC_FALSE;
dns_rdataset_init(&rdataset);
result = dns_db_getoriginnode(signing->db, &node);
if (result != ISC_R_SUCCESS)
goto failure;
- result = dns_db_findrdataset(signing->db, node, version, privatetype,
- dns_rdatatype_none, 0, &rdataset, NULL);
+ result = dns_db_findrdataset(signing->db, node, version,
+ zone->privatetype, dns_rdatatype_none,
+ 0, &rdataset, NULL);
if (result == ISC_R_NOTFOUND) {
+ INSIST(!dns_rdataset_isassociated(&rdataset));
result = ISC_R_SUCCESS;
goto failure;
}
- if (result != ISC_R_SUCCESS)
+ if (result != ISC_R_SUCCESS) {
+ INSIST(!dns_rdataset_isassociated(&rdataset));
goto failure;
+ }
for (result = dns_rdataset_first(&rdataset);
result == ISC_R_SUCCESS;
result = dns_rdataset_next(&rdataset)) {
dns_rdataset_current(&rdataset, &rdata);
+ /*
+ * If we don't match the algorithm or keyid skip the record.
+ */
if (rdata.length != 5 ||
rdata.data[0] != signing->algorithm ||
rdata.data[1] != ((signing->keyid >> 8) & 0xff) ||
rdata.data[2] != (signing->keyid & 0xff)) {
+ have_rr = ISC_TRUE;
dns_rdata_reset(&rdata);
continue;
}
- if (!signing->delete && rdata.data[4] != 0)
+ /*
+ * We have a match. If we were signing (!signing->delete)
+ * and we already have a record indicating that we have
+ * finished signing (rdata.data[4] != 0) then keep it.
+ * Otherwise it needs to be deleted as we have removed all
+ * the signatures (signing->delete), so any record indicating
+ * completion is now out of date, or we have finished signing
+ * with the new record so we no longer need to remember that
+ * we need to sign the zone with the matching key across a
+ * nameserver re-start.
+ */
+ if (!signing->delete && rdata.data[4] != 0) {
seen_done = ISC_TRUE;
- else
+ have_rr = ISC_TRUE;
+ } else
CHECK(update_one_rr(signing->db, version, diff,
- DNS_DIFFOP_DEL, name,
+ DNS_DIFFOP_DEL, &zone->origin,
rdataset.ttl, &rdata));
dns_rdata_reset(&rdata);
}
if (result == ISC_R_NOMORE)
result = ISC_R_SUCCESS;
if (!signing->delete && !seen_done) {
-
+ /*
+ * If we were signing then we need to indicate that we have
+ * finished signing the zone with this key. If it is already
+ * there we don't need to add it a second time.
+ */
data[0] = signing->algorithm;
data[1] = (signing->keyid >> 8) & 0xff;
data[2] = signing->keyid & 0xff;
@@ -4450,11 +5292,23 @@ updatesignwithkey(dns_signing_t *signing, dns_dbversion_t *version,
data[4] = 1;
rdata.length = sizeof(data);
rdata.data = data;
- rdata.type = privatetype;
+ rdata.type = zone->privatetype;
rdata.rdclass = dns_db_class(signing->db);
CHECK(update_one_rr(signing->db, version, diff, DNS_DIFFOP_ADD,
- name, rdataset.ttl, &rdata));
+ &zone->origin, rdataset.ttl, &rdata));
+ } else if (!have_rr) {
+ dns_name_t *origin = dns_db_origin(signing->db);
+ /*
+ * Rebuild the NSEC/NSEC3 record for the origin as we no
+ * longer have any private records.
+ */
+ if (build_nsec3)
+ CHECK(dns_nsec3_addnsec3s(signing->db, version, origin,
+ minimum, ISC_FALSE, diff));
+ CHECK(updatesecure(signing->db, version, origin, minimum,
+ ISC_TRUE, diff));
}
+
failure:
if (dns_rdataset_isassociated(&rdataset))
dns_rdataset_disassociate(&rdataset);
@@ -4463,9 +5317,15 @@ updatesignwithkey(dns_signing_t *signing, dns_dbversion_t *version,
return (result);
}
+/*
+ * If 'active' is set then we are not done with the chain yet so only
+ * delete the nsec3param record which indicates a full chain exists
+ * (flags == 0).
+ */
static isc_result_t
fixup_nsec3param(dns_db_t *db, dns_dbversion_t *ver, dns_nsec3chain_t *chain,
- isc_boolean_t active, dns_diff_t *diff)
+ isc_boolean_t active, dns_rdatatype_t privatetype,
+ dns_diff_t *diff)
{
dns_dbnode_t *node = NULL;
dns_name_t *name = dns_db_origin(db);
@@ -4484,7 +5344,7 @@ fixup_nsec3param(dns_db_t *db, dns_dbversion_t *ver, dns_nsec3chain_t *chain,
result = dns_db_findrdataset(db, node, ver, dns_rdatatype_nsec3param,
0, 0, &rdataset, NULL);
if (result == ISC_R_NOTFOUND)
- goto add;
+ goto try_private;
if (result != ISC_R_SUCCESS)
goto failure;
@@ -4520,6 +5380,50 @@ fixup_nsec3param(dns_db_t *db, dns_dbversion_t *ver, dns_nsec3chain_t *chain,
if (result != ISC_R_NOMORE)
goto failure;
+ dns_rdataset_disassociate(&rdataset);
+
+ try_private:
+
+ if (active)
+ goto add;
+ /*
+ * Delete all private records which match that in nsec3chain.
+ */
+ result = dns_db_findrdataset(db, node, ver, privatetype,
+ 0, 0, &rdataset, NULL);
+ if (result == ISC_R_NOTFOUND)
+ goto add;
+ if (result != ISC_R_SUCCESS)
+ goto failure;
+
+ for (result = dns_rdataset_first(&rdataset);
+ result == ISC_R_SUCCESS;
+ result = dns_rdataset_next(&rdataset)) {
+ dns_rdata_t private = DNS_RDATA_INIT;
+ unsigned char buf[DNS_NSEC3PARAM_BUFFERSIZE];
+
+ dns_rdataset_current(&rdataset, &private);
+ if (!dns_nsec3param_fromprivate(&private, &rdata,
+ buf, sizeof(buf)))
+ continue;
+ CHECK(dns_rdata_tostruct(&rdata, &nsec3param, NULL));
+
+ if (nsec3param.hash != chain->nsec3param.hash ||
+ nsec3param.iterations != chain->nsec3param.iterations ||
+ nsec3param.salt_length != chain->nsec3param.salt_length ||
+ memcmp(nsec3param.salt, chain->nsec3param.salt,
+ nsec3param.salt_length)) {
+ dns_rdata_reset(&rdata);
+ continue;
+ }
+
+ CHECK(update_one_rr(db, ver, diff, DNS_DIFFOP_DEL,
+ name, rdataset.ttl, &private));
+ dns_rdata_reset(&rdata);
+ }
+ if (result != ISC_R_NOMORE)
+ goto failure;
+
add:
if ((chain->nsec3param.flags & DNS_NSEC3FLAG_REMOVE) != 0) {
result = ISC_R_SUCCESS;
@@ -4620,7 +5524,7 @@ deletematchingnsec3(dns_db_t *db, dns_dbversion_t *ver, dns_dbnode_t *node,
static isc_result_t
need_nsec_chain(dns_db_t *db, dns_dbversion_t *ver,
const dns_rdata_nsec3param_t *param,
- isc_boolean_t *answer, isc_boolean_t *updatensec)
+ isc_boolean_t *answer)
{
dns_dbnode_t *node = NULL;
dns_rdata_t rdata = DNS_RDATA_INIT;
@@ -4634,29 +5538,19 @@ need_nsec_chain(dns_db_t *db, dns_dbversion_t *ver,
RUNTIME_CHECK(result == ISC_R_SUCCESS);
dns_rdataset_init(&rdataset);
+
result = dns_db_findrdataset(db, node, ver, dns_rdatatype_nsec,
0, 0, &rdataset, NULL);
- if (result == ISC_R_NOTFOUND)
- goto check_nsec3param;
-
- if (result != ISC_R_SUCCESS)
- goto failure;
-
- CHECK(dns_rdataset_first(&rdataset));
- dns_rdataset_current(&rdataset, &rdata);
-
- if (!dns_nsec_typepresent(&rdata, dns_rdatatype_opt)) {
- /*
- * We have a complete NSEC chain. Signal to update
- * the apex NSEC record.
- */
- *updatensec = ISC_TRUE;
- goto failure;
+ if (result == ISC_R_SUCCESS) {
+ dns_rdataset_disassociate(&rdataset);
+ dns_db_detachnode(db, &node);
+ return (result);
+ }
+ if (result != ISC_R_NOTFOUND) {
+ dns_db_detachnode(db, &node);
+ return (result);
}
- dns_rdataset_disassociate(&rdataset);
- dns_rdata_reset(&rdata);
- check_nsec3param:
result = dns_db_findrdataset(db, node, ver, dns_rdatatype_nsec3param,
0, 0, &rdataset, NULL);
if (result == ISC_R_NOTFOUND) {
@@ -4705,13 +5599,60 @@ need_nsec_chain(dns_db_t *db, dns_dbversion_t *ver,
return (result);
}
+static isc_result_t
+update_sigs(dns_diff_t *diff, dns_db_t *db, dns_dbversion_t *version,
+ dst_key_t *zone_keys[], unsigned int nkeys, dns_zone_t *zone,
+ isc_stdtime_t inception, isc_stdtime_t expire, isc_stdtime_t now,
+ isc_boolean_t check_ksk, isc_boolean_t keyset_kskonly,
+ dns_diff_t *sig_diff)
+{
+ dns_difftuple_t *tuple;
+ isc_result_t result;
+
+ for (tuple = ISC_LIST_HEAD(diff->tuples);
+ tuple != NULL;
+ tuple = ISC_LIST_HEAD(diff->tuples)) {
+ result = del_sigs(zone, db, version, &tuple->name,
+ tuple->rdata.type, sig_diff,
+ zone_keys, nkeys, now);
+ if (result != ISC_R_SUCCESS) {
+ dns_zone_log(zone, ISC_LOG_ERROR,
+ "update_sigs:del_sigs -> %s\n",
+ dns_result_totext(result));
+ return (result);
+ }
+ result = add_sigs(db, version, &tuple->name,
+ tuple->rdata.type, sig_diff,
+ zone_keys, nkeys, zone->mctx, inception,
+ expire, check_ksk, keyset_kskonly);
+ if (result != ISC_R_SUCCESS) {
+ dns_zone_log(zone, ISC_LOG_ERROR,
+ "update_sigs:add_sigs -> %s\n",
+ dns_result_totext(result));
+ return (result);
+ }
+
+ do {
+ dns_difftuple_t *next = ISC_LIST_NEXT(tuple, link);
+ while (next != NULL &&
+ (tuple->rdata.type != next->rdata.type ||
+ !dns_name_equal(&tuple->name, &next->name)))
+ next = ISC_LIST_NEXT(next, link);
+ ISC_LIST_UNLINK(diff->tuples, tuple, link);
+ dns_diff_appendminimal(sig_diff, &tuple);
+ INSIST(tuple == NULL);
+ tuple = next;
+ } while (tuple != NULL);
+ }
+ return (ISC_R_SUCCESS);
+}
+
/*
* Incrementally build and sign a new NSEC3 chain using the parameters
* requested.
*/
static void
zone_nsec3chain(dns_zone_t *zone) {
- const char *journalfile;
dns_db_t *db = NULL;
dns_dbnode_t *node = NULL;
dns_dbversion_t *version = NULL;
@@ -4727,7 +5668,7 @@ zone_nsec3chain(dns_zone_t *zone) {
dns_nsec3chainlist_t cleanup;
dst_key_t *zone_keys[MAXZONEKEYS];
isc_int32_t signatures;
- isc_boolean_t check_ksk, is_ksk;
+ isc_boolean_t check_ksk, keyset_kskonly, is_ksk;
isc_boolean_t delegation;
isc_boolean_t first;
isc_result_t result;
@@ -4740,9 +5681,9 @@ zone_nsec3chain(dns_zone_t *zone) {
isc_boolean_t seen_soa, seen_ns, seen_dname, seen_ds;
isc_boolean_t seen_nsec, seen_nsec3, seen_rr;
dns_rdatasetiter_t *iterator = NULL;
- dns_difftuple_t *tuple;
isc_boolean_t buildnsecchain;
isc_boolean_t updatensec = ISC_FALSE;
+ dns_rdatatype_t privatetype = zone->privatetype;
dns_rdataset_init(&rdataset);
dns_fixedname_init(&fixed);
@@ -4799,8 +5740,7 @@ zone_nsec3chain(dns_zone_t *zone) {
stop = now + 5;
check_ksk = DNS_ZONE_OPTION(zone, DNS_ZONEOPT_UPDATECHECKKSK);
- if (check_ksk)
- check_ksk = ksk_sanity(db, version);
+ keyset_kskonly = DNS_ZONE_OPTION(zone, DNS_ZONEOPT_DNSKEYKSKONLY);
/*
* We keep pulling nodes off each iterator in turn until
@@ -4924,9 +5864,17 @@ zone_nsec3chain(dns_zone_t *zone) {
* Process one node.
*/
dns_dbiterator_pause(nsec3chain->dbiterator);
- CHECK(dns_nsec3_addnsec3(db, version, name,
- &nsec3chain->nsec3param,
- zone->minimum, unsecure, &nsec3_diff));
+ result = dns_nsec3_addnsec3(db, version, name,
+ &nsec3chain->nsec3param,
+ zone->minimum, unsecure,
+ &nsec3_diff);
+ if (result != ISC_R_SUCCESS) {
+ dns_zone_log(zone, ISC_LOG_ERROR, "zone_nsec3chain:"
+ "dns_nsec3_addnsec3 -> %s\n",
+ dns_result_totext(result));
+ goto failure;
+ }
+
/*
* Treat each call to dns_nsec3_addnsec3() as if it's cost is
* two signatures. Additionally there will, in general, be
@@ -4948,7 +5896,8 @@ zone_nsec3chain(dns_zone_t *zone) {
if (result == ISC_R_NOMORE && nsec3chain->delete_nsec) {
CHECK(fixup_nsec3param(db, version, nsec3chain,
- ISC_FALSE, &param_diff));
+ ISC_FALSE, privatetype,
+ &param_diff));
LOCK_ZONE(zone);
ISC_LIST_UNLINK(zone->nsec3chain, nsec3chain,
link);
@@ -4962,12 +5911,14 @@ zone_nsec3chain(dns_zone_t *zone) {
CHECK(fixup_nsec3param(db, version,
nsec3chain,
ISC_TRUE,
+ privatetype,
&param_diff));
nsec3chain->delete_nsec = ISC_TRUE;
goto same_addchain;
}
CHECK(fixup_nsec3param(db, version, nsec3chain,
- ISC_FALSE, &param_diff));
+ ISC_FALSE, privatetype,
+ &param_diff));
LOCK_ZONE(zone);
ISC_LIST_UNLINK(zone->nsec3chain, nsec3chain,
link);
@@ -5028,10 +5979,22 @@ zone_nsec3chain(dns_zone_t *zone) {
* of removing this NSEC3 chain.
*/
if (first && !updatensec &&
- (nsec3chain->nsec3param.flags & DNS_NSEC3FLAG_NONSEC) == 0)
- CHECK(need_nsec_chain(db, version,
- &nsec3chain->nsec3param,
- &buildnsecchain, &updatensec));
+ (nsec3chain->nsec3param.flags & DNS_NSEC3FLAG_NONSEC) == 0) {
+ result = need_nsec_chain(db, version,
+ &nsec3chain->nsec3param,
+ &buildnsecchain);
+ if (result != ISC_R_SUCCESS) {
+ dns_zone_log(zone, ISC_LOG_ERROR,
+ "zone_nsec3chain:"
+ "need_nsec_chain -> %s\n",
+ dns_result_totext(result));
+ goto failure;
+ }
+ }
+
+ if (first)
+ dns_zone_log(zone, ISC_LOG_DEBUG(3), "zone_nsec3chain:"
+ "buildnsecchain = %u\n", buildnsecchain);
dns_dbiterator_current(nsec3chain->dbiterator, &node, name);
delegation = ISC_FALSE;
@@ -5040,16 +6003,33 @@ zone_nsec3chain(dns_zone_t *zone) {
/*
* Delete the NSECPARAM record that matches this chain.
*/
- if (first)
- CHECK(fixup_nsec3param(db, version, nsec3chain,
- ISC_TRUE, &param_diff));
+ if (first) {
+ result = fixup_nsec3param(db, version,
+ nsec3chain,
+ ISC_TRUE, privatetype,
+ &param_diff);
+ if (result != ISC_R_SUCCESS) {
+ dns_zone_log(zone, ISC_LOG_ERROR,
+ "zone_nsec3chain:"
+ "fixup_nsec3param -> %s\n",
+ dns_result_totext(result));
+ goto failure;
+ }
+ }
/*
* Delete the NSEC3 records.
*/
- CHECK(deletematchingnsec3(db, version, node, name,
- &nsec3chain->nsec3param,
- &nsec3_diff));
+ result = deletematchingnsec3(db, version, node, name,
+ &nsec3chain->nsec3param,
+ &nsec3_diff);
+ if (result != ISC_R_SUCCESS) {
+ dns_zone_log(zone, ISC_LOG_ERROR,
+ "zone_nsec3chain:"
+ "deletematchingnsec3 -> %s\n",
+ dns_result_totext(result));
+ goto failure;
+ }
goto next_removenode;
}
@@ -5100,7 +6080,8 @@ zone_nsec3chain(dns_zone_t *zone) {
seen_nsec = ISC_TRUE;
else if (rdataset.type == dns_rdatatype_nsec3)
seen_nsec3 = ISC_TRUE;
- seen_rr = ISC_TRUE;
+ if (rdataset.type != dns_rdatatype_rrsig)
+ seen_rr = ISC_TRUE;
dns_rdataset_disassociate(&rdataset);
}
dns_rdatasetiter_destroy(&iterator);
@@ -5110,8 +6091,14 @@ zone_nsec3chain(dns_zone_t *zone) {
if ((seen_ns && !seen_soa) || seen_dname)
delegation = ISC_TRUE;
- CHECK(add_nsec(db, version, name, node, zone->minimum,
- delegation, &nsec_diff));
+ /*
+ * Add a NSEC record except at the origin.
+ */
+ if (!dns_name_equal(name, dns_db_origin(db))) {
+ dns_dbiterator_pause(nsec3chain->dbiterator);
+ CHECK(add_nsec(db, version, name, node, zone->minimum,
+ delegation, &nsec_diff));
+ }
next_removenode:
first = ISC_FALSE;
@@ -5133,8 +6120,17 @@ zone_nsec3chain(dns_zone_t *zone) {
UNLOCK_ZONE(zone);
ISC_LIST_APPEND(cleanup, nsec3chain, link);
dns_dbiterator_pause(nsec3chain->dbiterator);
- CHECK(fixup_nsec3param(db, version, nsec3chain,
- ISC_FALSE, &param_diff));
+ result = fixup_nsec3param(db, version,
+ nsec3chain, ISC_FALSE,
+ privatetype,
+ &param_diff);
+ if (result != ISC_R_SUCCESS) {
+ dns_zone_log(zone, ISC_LOG_ERROR,
+ "zone_nsec3chain:"
+ "fixup_nsec3param -> %s\n",
+ dns_result_totext(result));
+ goto failure;
+ }
goto next_removechain;
} else if (result != ISC_R_SUCCESS) {
dns_zone_log(zone, ISC_LOG_ERROR,
@@ -5166,107 +6162,101 @@ zone_nsec3chain(dns_zone_t *zone) {
}
/*
- * Add / update signatures for the NSEC3 records.
+ * We may need to update the NSEC/NSEC3 records for the zone apex.
*/
- for (tuple = ISC_LIST_HEAD(nsec3_diff.tuples);
- tuple != NULL;
- tuple = ISC_LIST_HEAD(nsec3_diff.tuples)) {
- /*
- * We have changed the NSEC3 RRset above so we need to update
- * the signatures.
- */
- result = del_sigs(zone, db, version, &tuple->name,
- dns_rdatatype_nsec3, &sig_diff,
- zone_keys, nkeys, now);
- if (result != ISC_R_SUCCESS) {
- dns_zone_log(zone, ISC_LOG_ERROR,
- "zone_nsec3chain:del_sigs -> %s\n",
- dns_result_totext(result));
- goto failure;
- }
- result = add_sigs(db, version, &tuple->name,
- dns_rdatatype_nsec3, &sig_diff, zone_keys,
- nkeys, zone->mctx, inception, expire,
- check_ksk);
- if (result != ISC_R_SUCCESS) {
- dns_zone_log(zone, ISC_LOG_ERROR,
- "zone_nsec3chain:add_sigs -> %s\n",
- dns_result_totext(result));
- goto failure;
+ if (!ISC_LIST_EMPTY(param_diff.tuples)) {
+ isc_boolean_t rebuild_nsec = ISC_FALSE,
+ rebuild_nsec3 = ISC_FALSE;
+ result = dns_db_getoriginnode(db, &node);
+ RUNTIME_CHECK(result == ISC_R_SUCCESS);
+ result = dns_db_allrdatasets(db, node, version, 0, &iterator);
+ for (result = dns_rdatasetiter_first(iterator);
+ result == ISC_R_SUCCESS;
+ result = dns_rdatasetiter_next(iterator)) {
+ dns_rdatasetiter_current(iterator, &rdataset);
+ if (rdataset.type == dns_rdatatype_nsec)
+ rebuild_nsec = ISC_TRUE;
+ if (rdataset.type == dns_rdatatype_nsec3param)
+ rebuild_nsec3 = ISC_TRUE;
+ dns_rdataset_disassociate(&rdataset);
}
+ dns_rdatasetiter_destroy(&iterator);
+ dns_db_detachnode(db, &node);
- do {
- dns_difftuple_t *next = ISC_LIST_NEXT(tuple, link);
- while (next != NULL &&
- !dns_name_equal(&tuple->name, &next->name))
- next = ISC_LIST_NEXT(next, link);
- ISC_LIST_UNLINK(nsec3_diff.tuples, tuple, link);
- dns_diff_appendminimal(&sig_diff, &tuple);
- INSIST(tuple == NULL);
- tuple = next;
- } while (tuple != NULL);
- }
-
- for (tuple = ISC_LIST_HEAD(param_diff.tuples);
- tuple != NULL;
- tuple = ISC_LIST_HEAD(param_diff.tuples)) {
- /*
- * We have changed the NSEC3PARAM RRset above so we need to
- * update the signatures.
- */
- result = del_sigs(zone, db, version, &tuple->name,
- dns_rdatatype_nsec3param, &sig_diff,
- zone_keys, nkeys, now);
- if (result != ISC_R_SUCCESS) {
- dns_zone_log(zone, ISC_LOG_ERROR,
- "zone_nsec3chain:del_sigs -> %s\n",
- dns_result_totext(result));
- goto failure;
+ if (rebuild_nsec) {
+ if (nsec3chain != NULL)
+ dns_dbiterator_pause(nsec3chain->dbiterator);
+ result = updatesecure(db, version, &zone->origin,
+ zone->minimum, ISC_TRUE,
+ &nsec_diff);
+ if (result != ISC_R_SUCCESS) {
+ dns_zone_log(zone, ISC_LOG_ERROR,
+ "zone_nsec3chain:"
+ "updatesecure -> %s\n",
+ dns_result_totext(result));
+ goto failure;
+ }
}
- result = add_sigs(db, version, &tuple->name,
- dns_rdatatype_nsec3param, &sig_diff,
- zone_keys, nkeys, zone->mctx, inception,
- expire, check_ksk);
- if (result != ISC_R_SUCCESS) {
- dns_zone_log(zone, ISC_LOG_ERROR,
- "zone_nsec3chain:add_sigs -> %s\n",
- dns_result_totext(result));
- goto failure;
+ if (rebuild_nsec3) {
+ result = dns_nsec3_addnsec3s(db, version,
+ dns_db_origin(db),
+ zone->minimum, ISC_FALSE,
+ &nsec3_diff);
+ if (result != ISC_R_SUCCESS) {
+ dns_zone_log(zone, ISC_LOG_ERROR,
+ "zone_nsec3chain:"
+ "dns_nsec3_addnsec3s -> %s\n",
+ dns_result_totext(result));
+ goto failure;
+ }
}
- ISC_LIST_UNLINK(param_diff.tuples, tuple, link);
- dns_diff_appendminimal(&sig_diff, &tuple);
- INSIST(tuple == NULL);
}
- if (updatensec)
- CHECK(updatesecure(db, version, &zone->origin, zone->minimum,
- NULL, &nsec_diff));
+ /*
+ * Add / update signatures for the NSEC3 records.
+ */
+ result = update_sigs(&nsec3_diff, db, version, zone_keys,
+ nkeys, zone, inception, expire, now,
+ check_ksk, keyset_kskonly, &sig_diff);
+ if (result != ISC_R_SUCCESS) {
+ dns_zone_log(zone, ISC_LOG_ERROR, "zone_nsec3chain:"
+ "update_sigs -> %s\n", dns_result_totext(result));
+ goto failure;
+ }
- for (tuple = ISC_LIST_HEAD(nsec_diff.tuples);
- tuple != NULL;
- tuple = ISC_LIST_HEAD(nsec_diff.tuples)) {
- result = del_sigs(zone, db, version, &tuple->name,
- dns_rdatatype_nsec, &sig_diff,
- zone_keys, nkeys, now);
- if (result != ISC_R_SUCCESS) {
- dns_zone_log(zone, ISC_LOG_ERROR,
- "zone_nsec3chain:del_sigs -> %s\n",
- dns_result_totext(result));
- goto failure;
- }
- result = add_sigs(db, version, &tuple->name,
- dns_rdatatype_nsec, &sig_diff,
- zone_keys, nkeys, zone->mctx, inception,
- expire, check_ksk);
+ /*
+ * We have changed the NSEC3PARAM or private RRsets
+ * above so we need to update the signatures.
+ */
+ result = update_sigs(&param_diff, db, version, zone_keys,
+ nkeys, zone, inception, expire, now,
+ check_ksk, keyset_kskonly, &sig_diff);
+ if (result != ISC_R_SUCCESS) {
+ dns_zone_log(zone, ISC_LOG_ERROR, "zone_nsec3chain:"
+ "update_sigs -> %s\n", dns_result_totext(result));
+ goto failure;
+ }
+
+ if (updatensec) {
+ if (nsec3chain != NULL)
+ dns_dbiterator_pause(nsec3chain->dbiterator);
+ result = updatesecure(db, version, &zone->origin,
+ zone->minimum, ISC_FALSE, &nsec_diff);
if (result != ISC_R_SUCCESS) {
- dns_zone_log(zone, ISC_LOG_ERROR,
- "zone_nsec3chain:add_sigs -> %s\n",
+ dns_zone_log(zone, ISC_LOG_ERROR, "zone_nsec3chain:"
+ "updatesecure -> %s\n",
dns_result_totext(result));
goto failure;
}
- ISC_LIST_UNLINK(nsec_diff.tuples, tuple, link);
- dns_diff_appendminimal(&sig_diff, &tuple);
- INSIST(tuple == NULL);
+ }
+
+ result = update_sigs(&nsec_diff, db, version, zone_keys,
+ nkeys, zone, inception, expire, now,
+ check_ksk, keyset_kskonly, &sig_diff);
+ if (result != ISC_R_SUCCESS) {
+ dns_zone_log(zone, ISC_LOG_ERROR, "zone_nsec3chain:"
+ "update_sigs -> %s\n", dns_result_totext(result));
+ goto failure;
}
/*
@@ -5294,34 +6284,15 @@ zone_nsec3chain(dns_zone_t *zone) {
result = add_sigs(db, version, &zone->origin, dns_rdatatype_soa,
&sig_diff, zone_keys, nkeys, zone->mctx, inception,
- soaexpire, check_ksk);
+ soaexpire, check_ksk, keyset_kskonly);
if (result != ISC_R_SUCCESS) {
dns_zone_log(zone, ISC_LOG_ERROR, "zone_nsec3chain:"
"add_sigs -> %s\n", dns_result_totext(result));
goto failure;
}
- journalfile = dns_zone_getjournal(zone);
- if (journalfile != NULL) {
- dns_journal_t *journal = NULL;
- result = dns_journal_open(zone->mctx, journalfile,
- ISC_TRUE, &journal);
- if (result != ISC_R_SUCCESS) {
- dns_zone_log(zone, ISC_LOG_ERROR, "zone_nsec3chain:"
- "dns_journal_open -> %s\n",
- dns_result_totext(result));
- goto failure;
- }
-
- result = dns_journal_write_transaction(journal, &sig_diff);
- dns_journal_destroy(&journal);
- if (result != ISC_R_SUCCESS) {
- dns_zone_log(zone, ISC_LOG_ERROR, "zone_nsec3chain:"
- "dns_journal_write_transaction -> %s\n",
- dns_result_totext(result));
- goto failure;
- }
- }
+ /* Write changes to journal file. */
+ zone_journal(zone, &sig_diff, "zone_nsec3chain");
LOCK_ZONE(zone);
zone_needdump(zone, DNS_DUMP_DELAY);
@@ -5358,6 +6329,9 @@ zone_nsec3chain(dns_zone_t *zone) {
set_resigntime(zone);
failure:
+ if (result != ISC_R_SUCCESS)
+ dns_zone_log(zone, ISC_LOG_ERROR, "zone_nsec3chain: %s\n",
+ dns_result_totext(result));
/*
* On error roll back the current nsec3chain.
*/
@@ -5414,6 +6388,8 @@ zone_nsec3chain(dns_zone_t *zone) {
for (i = 0; i < nkeys; i++)
dst_key_free(&zone_keys[i]);
+ if (node != NULL)
+ dns_db_detachnode(db, &node);
if (version != NULL) {
dns_db_closeversion(db, &version, ISC_FALSE);
dns_db_detach(&db);
@@ -5506,11 +6482,11 @@ del_sig(dns_db_t *db, dns_dbversion_t *version, dns_name_t *name,
*/
static void
zone_sign(dns_zone_t *zone) {
- const char *journalfile;
dns_db_t *db = NULL;
dns_dbnode_t *node = NULL;
dns_dbversion_t *version = NULL;
dns_diff_t sig_diff;
+ dns_diff_t post_diff;
dns_fixedname_t fixed;
dns_fixedname_t nextfixed;
dns_name_t *name, *nextname;
@@ -5519,19 +6495,19 @@ zone_sign(dns_zone_t *zone) {
dns_signinglist_t cleanup;
dst_key_t *zone_keys[MAXZONEKEYS];
isc_int32_t signatures;
- isc_boolean_t check_ksk, is_ksk;
+ isc_boolean_t check_ksk, keyset_kskonly, is_ksk;
isc_boolean_t commit = ISC_FALSE;
isc_boolean_t delegation;
- isc_boolean_t finishedakey = ISC_FALSE;
- isc_boolean_t secureupdated = ISC_FALSE;
- isc_boolean_t build_nsec3 = ISC_FALSE, build_nsec = ISC_FALSE;
+ isc_boolean_t build_nsec = ISC_FALSE;
+ isc_boolean_t build_nsec3 = ISC_FALSE;
isc_boolean_t first;
isc_result_t result;
isc_stdtime_t now, inception, soaexpire, expire, stop;
isc_uint32_t jitter;
- unsigned int i;
+ unsigned int i, j;
unsigned int nkeys = 0;
isc_uint32_t nodes;
+ isc_boolean_t was_ksk;
dns_rdataset_init(&rdataset);
dns_fixedname_init(&fixed);
@@ -5540,6 +6516,7 @@ zone_sign(dns_zone_t *zone) {
nextname = dns_fixedname_name(&nextfixed);
dns_diff_init(zone->mctx, &sig_diff);
sig_diff.resign = zone->sigresigninginterval;
+ dns_diff_init(zone->mctx, &post_diff);
ISC_LIST_INIT(cleanup);
/*
@@ -5584,10 +6561,6 @@ zone_sign(dns_zone_t *zone) {
expire = soaexpire - jitter % 3600;
stop = now + 5;
- check_ksk = DNS_ZONE_OPTION(zone, DNS_ZONEOPT_UPDATECHECKKSK);
- if (check_ksk)
- check_ksk = ksk_sanity(db, version);
-
/*
* We keep pulling nodes off each iterator in turn until
* we have no more nodes to pull off or we reach the limits
@@ -5597,39 +6570,17 @@ zone_sign(dns_zone_t *zone) {
signatures = zone->signatures;
signing = ISC_LIST_HEAD(zone->signing);
first = ISC_TRUE;
- /*
- * See if we have a NSEC chain.
- */
- result = dns_db_getoriginnode(db, &node);
- RUNTIME_CHECK(result == ISC_R_SUCCESS);
- result = dns_db_findrdataset(db, node, version, dns_rdatatype_nsec,
- dns_rdatatype_none, 0, &rdataset, NULL);
- dns_db_detachnode(db, &node);
- if (result == ISC_R_SUCCESS) {
+
+ check_ksk = DNS_ZONE_OPTION(zone, DNS_ZONEOPT_UPDATECHECKKSK);
+ keyset_kskonly = DNS_ZONE_OPTION(zone, DNS_ZONEOPT_DNSKEYKSKONLY);
+
+ /* Determine which type of chain to build */
+ CHECK(dns_private_chains(db, version, zone->privatetype,
+ &build_nsec, &build_nsec3));
+
+ /* If neither chain is found, default to NSEC */
+ if (!build_nsec && !build_nsec3)
build_nsec = ISC_TRUE;
- dns_rdataset_disassociate(&rdataset);
- } else if (result != ISC_R_NOTFOUND) {
- goto failure;
- } else {
- /*
- * No NSEC chain present.
- * See if we need to build a NSEC3 chain?
- */
- result = dns_nsec3_active(db, version, ISC_TRUE, &build_nsec3);
- if (result == ISC_R_SUCCESS) {
- if (build_nsec3)
- build_nsec3 = ISC_FALSE;
- else {
- result = dns_nsec3_active(db, version,
- ISC_FALSE,
- &build_nsec3);
- if (build_nsec3)
- secureupdated = ISC_TRUE;
- else
- build_nsec = ISC_TRUE;
- }
- }
- }
while (signing != NULL && nodes-- > 0 && signatures > 0) {
nextsigning = ISC_LIST_NEXT(signing, link);
@@ -5637,7 +6588,7 @@ zone_sign(dns_zone_t *zone) {
ZONEDB_LOCK(&zone->dblock, isc_rwlocktype_read);
if (signing->done || signing->db != zone->db) {
/*
- * The zone has been reloaded. We will have
+ * The zone has been reloaded. We will have
* created new signings as part of the reload
* process so we can destroy this one.
*/
@@ -5651,9 +6602,31 @@ zone_sign(dns_zone_t *zone) {
if (signing->db != db)
goto next_signing;
- is_ksk = ISC_FALSE;
delegation = ISC_FALSE;
+ was_ksk = ISC_FALSE;
+
+ if (first && signing->delete) {
+ /*
+ * Remove the key we are deleting from consideration.
+ */
+ for (i = 0, j = 0; i < nkeys; i++) {
+ /*
+ * Find the key we want to remove.
+ */
+ if (ALG(zone_keys[i]) == signing->algorithm &&
+ dst_key_id(zone_keys[i]) == signing->keyid)
+ {
+ if (KSK(zone_keys[i]))
+ dst_key_free(&zone_keys[i]);
+ continue;
+ }
+ zone_keys[j] = zone_keys[i];
+ j++;
+ }
+ nkeys = j;
+ }
+
dns_dbiterator_current(signing->dbiterator, &node, name);
if (signing->delete) {
@@ -5661,8 +6634,8 @@ zone_sign(dns_zone_t *zone) {
CHECK(del_sig(db, version, name, node, nkeys,
signing->algorithm, signing->keyid,
&sig_diff));
- goto next_node;
}
+
/*
* On the first pass we need to check if the current node
* has not been obscured.
@@ -5694,26 +6667,77 @@ zone_sign(dns_zone_t *zone) {
*/
dns_dbiterator_pause(signing->dbiterator);
for (i = 0; i < nkeys; i++) {
+ isc_boolean_t both = ISC_FALSE;
+
+ /*
+ * Find the keys we want to sign with.
+ */
+ if (!dst_key_isprivate(zone_keys[i]))
+ continue;
+
+ /*
+ * When adding look for the specific key.
+ */
+ if (!signing->delete &&
+ (dst_key_alg(zone_keys[i]) != signing->algorithm ||
+ dst_key_id(zone_keys[i]) != signing->keyid))
+ continue;
+
/*
- * Find the key we want to sign with.
+ * When deleting make sure we are properly signed
+ * with the algorithm that was being removed.
*/
- if (dst_key_alg(zone_keys[i]) != signing->algorithm ||
- dst_key_id(zone_keys[i]) != signing->keyid ||
- !dst_key_isprivate(zone_keys[i]))
+ if (signing->delete &&
+ ALG(zone_keys[i]) != signing->algorithm)
continue;
+
/*
* Do we do KSK processing?
*/
- if (check_ksk &&
- (dst_key_flags(zone_keys[i]) & DNS_KEYFLAG_KSK) != 0)
- is_ksk = ISC_TRUE;
+ if (check_ksk && !REVOKE(zone_keys[i])) {
+ isc_boolean_t have_ksk, have_nonksk;
+ if (KSK(zone_keys[i])) {
+ have_ksk = ISC_TRUE;
+ have_nonksk = ISC_FALSE;
+ } else {
+ have_ksk = ISC_FALSE;
+ have_nonksk = ISC_TRUE;
+ }
+ for (j = 0; j < nkeys; j++) {
+ if (j == i ||
+ ALG(zone_keys[i]) !=
+ ALG(zone_keys[j]))
+ continue;
+ if (REVOKE(zone_keys[j]))
+ continue;
+ if (KSK(zone_keys[j]))
+ have_ksk = ISC_TRUE;
+ else
+ have_nonksk = ISC_TRUE;
+ both = have_ksk && have_nonksk;
+ if (both)
+ break;
+ }
+ }
+ if (both || REVOKE(zone_keys[i]))
+ is_ksk = KSK(zone_keys[i]);
+ else
+ is_ksk = ISC_FALSE;
+
CHECK(sign_a_node(db, name, node, version, build_nsec3,
build_nsec, zone_keys[i], inception,
expire, zone->minimum, is_ksk,
- &delegation, &sig_diff, &signatures,
- zone->mctx));
- break;
+ ISC_TF(both && keyset_kskonly),
+ &delegation, &sig_diff,
+ &signatures, zone->mctx));
+ /*
+ * If we are adding we are done. Look for other keys
+ * of the same algorithm if deleting.
+ */
+ if (!signing->delete)
+ break;
}
+
/*
* Go onto next node.
*/
@@ -5726,9 +6750,7 @@ zone_sign(dns_zone_t *zone) {
ISC_LIST_UNLINK(zone->signing, signing, link);
ISC_LIST_APPEND(cleanup, signing, link);
dns_dbiterator_pause(signing->dbiterator);
- finishedakey = ISC_TRUE;
- if (!is_ksk && !secureupdated && nkeys != 0 &&
- build_nsec) {
+ if (nkeys != 0 && build_nsec) {
/*
* We have finished regenerating the
* zone with a zone signing key.
@@ -5740,8 +6762,8 @@ zone_sign(dns_zone_t *zone) {
result = updatesecure(db, version,
&zone->origin,
zone->minimum,
- &secureupdated,
- &sig_diff);
+ ISC_FALSE,
+ &post_diff);
if (result != ISC_R_SUCCESS) {
dns_zone_log(zone,
ISC_LOG_ERROR,
@@ -5750,16 +6772,19 @@ zone_sign(dns_zone_t *zone) {
goto failure;
}
}
- result = updatesignwithkey(signing, version,
- &zone->origin,
- zone->privatetype,
- &sig_diff);
+ result = updatesignwithkey(zone, signing,
+ version,
+ build_nsec3,
+ zone->minimum,
+ &post_diff);
if (result != ISC_R_SUCCESS) {
dns_zone_log(zone, ISC_LOG_ERROR,
- "updatesignwithkey -> %s\n",
+ "updatesignwithkey "
+ "-> %s\n",
dns_result_totext(result));
goto failure;
}
+ build_nsec = ISC_FALSE;
goto next_signing;
} else if (result != ISC_R_SUCCESS) {
dns_zone_log(zone, ISC_LOG_ERROR,
@@ -5783,53 +6808,13 @@ zone_sign(dns_zone_t *zone) {
first = ISC_TRUE;
}
- if (secureupdated) {
- /*
- * We have changed the NSEC RRset above so we need to update
- * the signatures.
- */
- result = del_sigs(zone, db, version, &zone->origin,
- dns_rdatatype_nsec, &sig_diff, zone_keys,
- nkeys, now);
- if (result != ISC_R_SUCCESS) {
- dns_zone_log(zone, ISC_LOG_ERROR,
- "zone_sign:del_sigs -> %s\n",
- dns_result_totext(result));
- goto failure;
- }
- result = add_sigs(db, version, &zone->origin,
- dns_rdatatype_nsec, &sig_diff, zone_keys,
- nkeys, zone->mctx, inception, soaexpire,
- check_ksk);
- if (result != ISC_R_SUCCESS) {
- dns_zone_log(zone, ISC_LOG_ERROR,
- "zone_sign:add_sigs -> %s\n",
- dns_result_totext(result));
- goto failure;
- }
- }
-
- if (finishedakey) {
- /*
- * We have changed the RRset above so we need to update
- * the signatures.
- */
- result = del_sigs(zone, db, version, &zone->origin,
- zone->privatetype, &sig_diff,
- zone_keys, nkeys, now);
- if (result != ISC_R_SUCCESS) {
- dns_zone_log(zone, ISC_LOG_ERROR,
- "zone_sign:del_sigs -> %s\n",
- dns_result_totext(result));
- goto failure;
- }
- result = add_sigs(db, version, &zone->origin,
- zone->privatetype, &sig_diff,
- zone_keys, nkeys, zone->mctx, inception,
- soaexpire, check_ksk);
+ if (ISC_LIST_HEAD(post_diff.tuples) != NULL) {
+ result = update_sigs(&post_diff, db, version, zone_keys,
+ nkeys, zone, inception, expire, now,
+ check_ksk, keyset_kskonly, &sig_diff);
if (result != ISC_R_SUCCESS) {
- dns_zone_log(zone, ISC_LOG_ERROR,
- "zone_sign:add_sigs -> %s\n",
+ dns_zone_log(zone, ISC_LOG_ERROR, "zone_sign:"
+ "update_sigs -> %s\n",
dns_result_totext(result));
goto failure;
}
@@ -5838,8 +6823,10 @@ zone_sign(dns_zone_t *zone) {
/*
* Have we changed anything?
*/
- if (ISC_LIST_HEAD(sig_diff.tuples) == NULL)
+ if (ISC_LIST_HEAD(sig_diff.tuples) == NULL) {
+ result = ISC_R_SUCCESS;
goto pauseall;
+ }
commit = ISC_TRUE;
@@ -5866,7 +6853,7 @@ zone_sign(dns_zone_t *zone) {
*/
result = add_sigs(db, version, &zone->origin, dns_rdatatype_soa,
&sig_diff, zone_keys, nkeys, zone->mctx, inception,
- soaexpire, check_ksk);
+ soaexpire, check_ksk, keyset_kskonly);
if (result != ISC_R_SUCCESS) {
dns_zone_log(zone, ISC_LOG_ERROR,
"zone_sign:add_sigs -> %s\n",
@@ -5877,27 +6864,9 @@ zone_sign(dns_zone_t *zone) {
/*
* Write changes to journal file.
*/
- journalfile = dns_zone_getjournal(zone);
- if (journalfile != NULL) {
- dns_journal_t *journal = NULL;
- result = dns_journal_open(zone->mctx, journalfile,
- ISC_TRUE, &journal);
- if (result != ISC_R_SUCCESS) {
- dns_zone_log(zone, ISC_LOG_ERROR,
- "zone_sign:dns_journal_open -> %s\n",
- dns_result_totext(result));
- goto failure;
- }
-
- result = dns_journal_write_transaction(journal, &sig_diff);
- dns_journal_destroy(&journal);
- if (result != ISC_R_SUCCESS) {
- dns_zone_log(zone, ISC_LOG_ERROR,
- "zone_sign:dns_journal_write_transaction -> %s\n",
- dns_result_totext(result));
- goto failure;
- }
- }
+ result = zone_journal(zone, &sig_diff, "zone_sign");
+ if (result != ISC_R_SUCCESS)
+ goto failure;
pauseall:
/*
@@ -5934,6 +6903,7 @@ zone_sign(dns_zone_t *zone) {
if (commit) {
LOCK_ZONE(zone);
+ DNS_ZONE_SETFLAG(zone, DNS_ZONEFLG_NEEDNOTIFY);
zone_needdump(zone, DNS_DUMP_DELAY);
UNLOCK_ZONE(zone);
}
@@ -5945,7 +6915,7 @@ zone_sign(dns_zone_t *zone) {
signing = ISC_LIST_HEAD(cleanup);
while (signing != NULL) {
ISC_LIST_UNLINK(cleanup, signing, link);
- ISC_LIST_APPEND(zone->signing, signing, link);
+ ISC_LIST_PREPEND(zone->signing, signing, link);
dns_dbiterator_first(signing->dbiterator);
dns_dbiterator_pause(signing->dbiterator);
signing = ISC_LIST_HEAD(cleanup);
@@ -5961,6 +6931,9 @@ zone_sign(dns_zone_t *zone) {
for (i = 0; i < nkeys; i++)
dst_key_free(&zone_keys[i]);
+ if (node != NULL)
+ dns_db_detachnode(db, &node);
+
if (version != NULL) {
dns_db_closeversion(db, &version, ISC_FALSE);
dns_db_detach(&db);
@@ -5979,6 +6952,832 @@ zone_sign(dns_zone_t *zone) {
}
static void
+normalize_key(dns_rdata_t *rr, dns_rdata_t *target,
+ unsigned char *data, int size) {
+ dns_rdata_dnskey_t dnskey;
+ dns_rdata_keydata_t keydata;
+ isc_buffer_t buf;
+
+ dns_rdata_reset(target);
+ isc_buffer_init(&buf, data, size);
+
+ switch (rr->type) {
+ case dns_rdatatype_dnskey:
+ dns_rdata_tostruct(rr, &dnskey, NULL);
+ dnskey.flags &= ~DNS_KEYFLAG_REVOKE;
+ dns_rdata_fromstruct(target, rr->rdclass, dns_rdatatype_dnskey,
+ &dnskey, &buf);
+ break;
+ case dns_rdatatype_keydata:
+ dns_rdata_tostruct(rr, &keydata, NULL);
+ dns_keydata_todnskey(&keydata, &dnskey, NULL);
+ dns_rdata_fromstruct(target, rr->rdclass, dns_rdatatype_dnskey,
+ &dnskey, &buf);
+ break;
+ default:
+ INSIST(0);
+ }
+}
+
+/*
+ * 'rdset' contains either a DNSKEY rdataset from the zone apex, or
+ * a KEYDATA rdataset from the key zone.
+ *
+ * 'rr' contains either a DNSKEY record, or a KEYDATA record
+ *
+ * After normalizing keys to the same format (DNSKEY, with revoke bit
+ * cleared), return ISC_TRUE if a key that matches 'rr' is found in
+ * 'rdset', or ISC_FALSE if not.
+ */
+
+static isc_boolean_t
+matchkey(dns_rdataset_t *rdset, dns_rdata_t *rr) {
+ unsigned char data1[4096], data2[4096];
+ dns_rdata_t rdata, rdata1, rdata2;
+ isc_result_t result;
+
+ dns_rdata_init(&rdata);
+ dns_rdata_init(&rdata1);
+ dns_rdata_init(&rdata2);
+
+ normalize_key(rr, &rdata1, data1, sizeof(data1));
+
+ for (result = dns_rdataset_first(rdset);
+ result == ISC_R_SUCCESS;
+ result = dns_rdataset_next(rdset)) {
+ dns_rdata_reset(&rdata);
+ dns_rdataset_current(rdset, &rdata);
+ normalize_key(&rdata, &rdata2, data2, sizeof(data2));
+ if (dns_rdata_compare(&rdata1, &rdata2) == 0)
+ return (ISC_TRUE);
+ }
+
+ return (ISC_FALSE);
+}
+
+/*
+ * Calculate the refresh interval for a keydata zone, per
+ * RFC5011: MAX(1 hr,
+ * MIN(15 days,
+ * 1/2 * OrigTTL,
+ * 1/2 * RRSigExpirationInterval))
+ * or for retries: MAX(1 hr,
+ * MIN(1 day,
+ * 1/10 * OrigTTL,
+ * 1/10 * RRSigExpirationInterval))
+ */
+static inline isc_stdtime_t
+refresh_time(dns_keyfetch_t *kfetch, isc_boolean_t retry) {
+ isc_result_t result;
+ isc_uint32_t t;
+ dns_rdataset_t *rdset;
+ dns_rdata_t sigrr = DNS_RDATA_INIT;
+ dns_rdata_sig_t sig;
+ isc_stdtime_t now;
+
+ isc_stdtime_get(&now);
+
+ if (dns_rdataset_isassociated(&kfetch->dnskeysigset))
+ rdset = &kfetch->dnskeysigset;
+ else
+ return (now + HOUR);
+
+ result = dns_rdataset_first(rdset);
+ if (result != ISC_R_SUCCESS)
+ return (now + HOUR);
+
+ dns_rdataset_current(rdset, &sigrr);
+ result = dns_rdata_tostruct(&sigrr, &sig, NULL);
+
+ if (!retry) {
+ t = sig.originalttl / 2;
+
+ if (isc_serial_gt(sig.timeexpire, now)) {
+ isc_uint32_t exp = (sig.timeexpire - now) / 2;
+ if (t > exp)
+ t = exp;
+ }
+
+ if (t > (15*DAY))
+ t = (15*DAY);
+
+ if (t < HOUR)
+ t = HOUR;
+ } else {
+ t = sig.originalttl / 10;
+
+ if (isc_serial_gt(sig.timeexpire, now)) {
+ isc_uint32_t exp = (sig.timeexpire - now) / 10;
+ if (t > exp)
+ t = exp;
+ }
+
+ if (t > DAY)
+ t = DAY;
+
+ if (t < HOUR)
+ t = HOUR;
+ }
+
+ return (now + t);
+}
+
+/*
+ * This routine is called when no changes are needed in a KEYDATA
+ * record except to simply update the refresh timer. Caller should
+ * hold zone lock.
+ */
+static isc_result_t
+minimal_update(dns_keyfetch_t *kfetch, dns_dbversion_t *ver, dns_diff_t *diff)
+{
+ isc_result_t result;
+ isc_buffer_t keyb;
+ unsigned char key_buf[4096];
+ dns_rdata_t rdata = DNS_RDATA_INIT;
+ dns_rdata_keydata_t keydata;
+ dns_name_t *name;
+ dns_zone_t *zone = kfetch->zone;
+ isc_stdtime_t now;
+
+ name = dns_fixedname_name(&kfetch->name);
+ isc_stdtime_get(&now);
+
+ for (result = dns_rdataset_first(&kfetch->keydataset);
+ result == ISC_R_SUCCESS;
+ result = dns_rdataset_next(&kfetch->keydataset)) {
+ dns_rdata_reset(&rdata);
+ dns_rdataset_current(&kfetch->keydataset, &rdata);
+
+ /* Delete old version */
+ CHECK(update_one_rr(kfetch->db, ver, diff, DNS_DIFFOP_DEL,
+ name, 0, &rdata));
+
+ /* Update refresh timer */
+ CHECK(dns_rdata_tostruct(&rdata, &keydata, NULL));
+ keydata.refresh = refresh_time(kfetch, ISC_TRUE);
+ set_refreshkeytimer(zone, &keydata, now);
+
+ dns_rdata_reset(&rdata);
+ isc_buffer_init(&keyb, key_buf, sizeof(key_buf));
+ CHECK(dns_rdata_fromstruct(&rdata,
+ zone->rdclass, dns_rdatatype_keydata,
+ &keydata, &keyb));
+
+ /* Insert updated version */
+ CHECK(update_one_rr(kfetch->db, ver, diff, DNS_DIFFOP_ADD,
+ name, 0, &rdata));
+ }
+ result = ISC_R_SUCCESS;
+ failure:
+ return (result);
+}
+
+/*
+ * Verify that DNSKEY set is signed by the key specified in 'keydata'.
+ */
+static isc_boolean_t
+revocable(dns_keyfetch_t *kfetch, dns_rdata_keydata_t *keydata) {
+ isc_result_t result;
+ dns_name_t *keyname;
+ isc_mem_t *mctx;
+ dns_rdata_t sigrr = DNS_RDATA_INIT;
+ dns_rdata_t rr = DNS_RDATA_INIT;
+ dns_rdata_rrsig_t sig;
+ dns_rdata_dnskey_t dnskey;
+ dst_key_t *dstkey = NULL;
+ unsigned char key_buf[4096];
+ isc_buffer_t keyb;
+ isc_boolean_t answer = ISC_FALSE;
+
+ REQUIRE(kfetch != NULL && keydata != NULL);
+ REQUIRE(dns_rdataset_isassociated(&kfetch->dnskeysigset));
+
+ keyname = dns_fixedname_name(&kfetch->name);
+ mctx = kfetch->zone->view->mctx;
+
+ /* Generate a key from keydata */
+ isc_buffer_init(&keyb, key_buf, sizeof(key_buf));
+ dns_keydata_todnskey(keydata, &dnskey, NULL);
+ dns_rdata_fromstruct(&rr, keydata->common.rdclass, dns_rdatatype_dnskey,
+ &dnskey, &keyb);
+ result = dns_dnssec_keyfromrdata(keyname, &rr, mctx, &dstkey);
+ if (result != ISC_R_SUCCESS)
+ return (ISC_FALSE);
+
+ /* See if that key generated any of the signatures */
+ for (result = dns_rdataset_first(&kfetch->dnskeysigset);
+ result == ISC_R_SUCCESS;
+ result = dns_rdataset_next(&kfetch->dnskeysigset)) {
+ dns_fixedname_t fixed;
+ dns_fixedname_init(&fixed);
+
+ dns_rdata_reset(&sigrr);
+ dns_rdataset_current(&kfetch->dnskeysigset, &sigrr);
+ result = dns_rdata_tostruct(&sigrr, &sig, NULL);
+ RUNTIME_CHECK(result == ISC_R_SUCCESS);
+
+ if (dst_key_alg(dstkey) == sig.algorithm &&
+ (dst_key_id(dstkey) == sig.keyid ||
+ (sig.algorithm != 1 && sig.keyid ==
+ ((dst_key_id(dstkey) + 128) & 0xffff)))) {
+ result = dns_dnssec_verify2(keyname,
+ &kfetch->dnskeyset,
+ dstkey, ISC_FALSE, mctx, &sigrr,
+ dns_fixedname_name(&fixed));
+
+ dns_zone_log(kfetch->zone, ISC_LOG_DEBUG(3),
+ "Confirm revoked DNSKEY is self-signed: "
+ "%s", dns_result_totext(result));
+
+ if (result == ISC_R_SUCCESS) {
+ answer = ISC_TRUE;
+ break;
+ }
+ }
+ }
+
+ dst_key_free(&dstkey);
+ return (answer);
+}
+
+/*
+ * A DNSKEY set has been fetched from the zone apex of a zone whose trust
+ * anchors are being managed; scan the keyset, and update the key zone and the
+ * local trust anchors according to RFC5011.
+ */
+static void
+keyfetch_done(isc_task_t *task, isc_event_t *event) {
+ isc_result_t result, eresult;
+ dns_fetchevent_t *devent;
+ dns_keyfetch_t *kfetch;
+ dns_zone_t *zone;
+ isc_mem_t *mctx = NULL;
+ dns_keytable_t *secroots = NULL;
+ dns_dbversion_t *ver = NULL;
+ dns_diff_t diff;
+ isc_boolean_t changed = ISC_FALSE;
+ isc_boolean_t alldone = ISC_FALSE;
+ dns_name_t *keyname;
+ dns_rdata_t sigrr = DNS_RDATA_INIT;
+ dns_rdata_t dnskeyrr = DNS_RDATA_INIT;
+ dns_rdata_t keydatarr = DNS_RDATA_INIT;
+ dns_rdata_rrsig_t sig;
+ dns_rdata_dnskey_t dnskey;
+ dns_rdata_keydata_t keydata;
+ isc_boolean_t initializing;
+ char namebuf[DNS_NAME_FORMATSIZE];
+ unsigned char key_buf[4096];
+ isc_buffer_t keyb;
+ dst_key_t *dstkey;
+ isc_stdtime_t now;
+ int pending = 0;
+ isc_boolean_t secure;
+
+ UNUSED(task);
+ INSIST(event != NULL && event->ev_type == DNS_EVENT_FETCHDONE);
+ INSIST(event->ev_arg != NULL);
+
+ kfetch = event->ev_arg;
+ zone = kfetch->zone;
+ isc_mem_attach(zone->mctx, &mctx);
+ keyname = dns_fixedname_name(&kfetch->name);
+
+ devent = (dns_fetchevent_t *) event;
+ eresult = devent->result;
+
+ /* Free resources which are not of interest */
+ if (devent->node != NULL)
+ dns_db_detachnode(devent->db, &devent->node);
+ if (devent->db != NULL)
+ dns_db_detach(&devent->db);
+ isc_event_free(&event);
+ dns_resolver_destroyfetch(&kfetch->fetch);
+
+ isc_stdtime_get(&now);
+ dns_name_format(keyname, namebuf, sizeof(namebuf));
+
+ result = dns_view_getsecroots(zone->view, &secroots);
+ INSIST(result == ISC_R_SUCCESS);
+
+ LOCK_ZONE(zone);
+ dns_db_newversion(kfetch->db, &ver);
+ dns_diff_init(mctx, &diff);
+
+ zone->refreshkeycount--;
+ alldone = ISC_TF(zone->refreshkeycount == 0);
+
+ if (alldone)
+ DNS_ZONE_CLRFLAG(zone, DNS_ZONEFLG_REFRESHING);
+
+ /* Fetch failed */
+ if (eresult != ISC_R_SUCCESS ||
+ !dns_rdataset_isassociated(&kfetch->dnskeyset)) {
+ dns_zone_log(zone, ISC_LOG_WARNING,
+ "Unable to fetch DNSKEY set "
+ "'%s': %s", namebuf, dns_result_totext(eresult));
+ CHECK(minimal_update(kfetch, ver, &diff));
+ changed = ISC_TRUE;
+ goto failure;
+ }
+
+ /* No RRSIGs found */
+ if (!dns_rdataset_isassociated(&kfetch->dnskeysigset)) {
+ dns_zone_log(zone, ISC_LOG_WARNING,
+ "No DNSKEY RRSIGs found for "
+ "'%s': %s", namebuf, dns_result_totext(eresult));
+ CHECK(minimal_update(kfetch, ver, &diff));
+ changed = ISC_TRUE;
+ goto failure;
+ }
+
+ /*
+ * Validate the dnskeyset against the current trusted keys.
+ */
+ for (result = dns_rdataset_first(&kfetch->dnskeysigset);
+ result == ISC_R_SUCCESS;
+ result = dns_rdataset_next(&kfetch->dnskeysigset)) {
+ dns_keynode_t *keynode = NULL;
+
+ dns_rdata_reset(&sigrr);
+ dns_rdataset_current(&kfetch->dnskeysigset, &sigrr);
+ result = dns_rdata_tostruct(&sigrr, &sig, NULL);
+ RUNTIME_CHECK(result == ISC_R_SUCCESS);
+
+ result = dns_keytable_find(secroots, keyname, &keynode);
+ while (result == ISC_R_SUCCESS) {
+ dns_keynode_t *nextnode = NULL;
+ dns_fixedname_t fixed;
+ dns_fixedname_init(&fixed);
+
+ dstkey = dns_keynode_key(keynode);
+ if (dstkey == NULL) /* fail_secure() was called */
+ break;
+
+ if (dst_key_alg(dstkey) == sig.algorithm &&
+ dst_key_id(dstkey) == sig.keyid) {
+ result = dns_dnssec_verify2(keyname,
+ &kfetch->dnskeyset,
+ dstkey, ISC_FALSE,
+ zone->view->mctx, &sigrr,
+ dns_fixedname_name(&fixed));
+
+ dns_zone_log(zone, ISC_LOG_DEBUG(3),
+ "Verifying DNSKEY set for zone "
+ "'%s': %s", namebuf,
+ dns_result_totext(result));
+
+ if (result == ISC_R_SUCCESS) {
+ kfetch->dnskeyset.trust =
+ dns_trust_secure;
+ kfetch->dnskeysigset.trust =
+ dns_trust_secure;
+ dns_keytable_detachkeynode(secroots,
+ &keynode);
+ break;
+ }
+ }
+
+ result = dns_keytable_nextkeynode(secroots,
+ keynode, &nextnode);
+ dns_keytable_detachkeynode(secroots, &keynode);
+ keynode = nextnode;
+ }
+
+ if (kfetch->dnskeyset.trust == dns_trust_secure)
+ break;
+ }
+
+ /*
+ * If we were not able to verify the answer using the current
+ * trusted keys then all we can do is look at any revoked keys.
+ */
+ secure = ISC_TF(kfetch->dnskeyset.trust == dns_trust_secure);
+
+ /*
+ * First scan keydataset to find keys that are not in dnskeyset
+ * - Missing keys which are not scheduled for removal,
+ * log a warning
+ * - Missing keys which are scheduled for removal and
+ * the remove hold-down timer has completed should
+ * be removed from the key zone
+ * - Missing keys whose acceptance timers have not yet
+ * completed, log a warning and reset the acceptance
+ * timer to 30 days in the future
+ * - All keys not being removed have their refresh timers
+ * updated
+ */
+ initializing = ISC_TRUE;
+ for (result = dns_rdataset_first(&kfetch->keydataset);
+ result == ISC_R_SUCCESS;
+ result = dns_rdataset_next(&kfetch->keydataset)) {
+ dns_rdata_reset(&keydatarr);
+ dns_rdataset_current(&kfetch->keydataset, &keydatarr);
+ dns_rdata_tostruct(&keydatarr, &keydata, NULL);
+
+ /*
+ * If any keydata record has a nonzero add holddown, then
+ * there was a pre-existing trust anchor for this domain;
+ * that means we are *not* initializing it and shouldn't
+ * automatically trust all the keys we find at the zone apex.
+ */
+ initializing = initializing && ISC_TF(keydata.addhd == 0);
+
+ if (! matchkey(&kfetch->dnskeyset, &keydatarr)) {
+ isc_boolean_t deletekey = ISC_FALSE;
+
+ if (!secure) {
+ if (now > keydata.removehd)
+ deletekey = ISC_TRUE;
+ } else if (now < keydata.addhd) {
+ dns_zone_log(zone, ISC_LOG_WARNING,
+ "Pending key unexpectedly missing "
+ "from %s; restarting acceptance "
+ "timer", namebuf);
+ keydata.addhd = now + MONTH;
+ keydata.refresh = refresh_time(kfetch,
+ ISC_FALSE);
+ } else if (keydata.addhd == 0) {
+ keydata.addhd = now;
+ } else if (keydata.removehd == 0) {
+ dns_zone_log(zone, ISC_LOG_WARNING,
+ "Active key unexpectedly missing "
+ "from %s", namebuf);
+ keydata.refresh = now + HOUR;
+ } else if (now > keydata.removehd) {
+ deletekey = ISC_TRUE;
+ } else {
+ keydata.refresh = refresh_time(kfetch,
+ ISC_FALSE);
+ }
+
+ if (secure || deletekey) {
+ /* Delete old version */
+ CHECK(update_one_rr(kfetch->db, ver, &diff,
+ DNS_DIFFOP_DEL, keyname, 0,
+ &keydatarr));
+ changed = ISC_TRUE;
+ }
+
+ if (!secure || deletekey)
+ continue;
+
+ dns_rdata_reset(&keydatarr);
+ isc_buffer_init(&keyb, key_buf, sizeof(key_buf));
+ dns_rdata_fromstruct(&keydatarr, zone->rdclass,
+ dns_rdatatype_keydata,
+ &keydata, &keyb);
+
+ /* Insert updated version */
+ CHECK(update_one_rr(kfetch->db, ver, &diff,
+ DNS_DIFFOP_ADD, keyname, 0,
+ &keydatarr));
+ changed = ISC_TRUE;
+
+ set_refreshkeytimer(zone, &keydata, now);
+ }
+ }
+
+ /*
+ * Next scan dnskeyset:
+ * - If new keys are found (i.e., lacking a match in keydataset)
+ * add them to the key zone and set the acceptance timer
+ * to 30 days in the future (or to immediately if we've
+ * determined that we're initializing the zone for the
+ * first time)
+ * - Previously-known keys that have been revoked
+ * must be scheduled for removal from the key zone (or,
+ * if they hadn't been accepted as trust anchors yet
+ * anyway, removed at once)
+ * - Previously-known unrevoked keys whose acceptance timers
+ * have completed are promoted to trust anchors
+ * - All keys not being removed have their refresh
+ * timers updated
+ */
+ for (result = dns_rdataset_first(&kfetch->dnskeyset);
+ result == ISC_R_SUCCESS;
+ result = dns_rdataset_next(&kfetch->dnskeyset)) {
+ isc_boolean_t revoked = ISC_FALSE;
+ isc_boolean_t newkey = ISC_FALSE;
+ isc_boolean_t updatekey = ISC_FALSE;
+ isc_boolean_t deletekey = ISC_FALSE;
+ isc_boolean_t trustkey = ISC_FALSE;
+
+ dns_rdata_reset(&dnskeyrr);
+ dns_rdataset_current(&kfetch->dnskeyset, &dnskeyrr);
+ dns_rdata_tostruct(&dnskeyrr, &dnskey, NULL);
+
+ /* Skip ZSK's */
+ if (!ISC_TF(dnskey.flags & DNS_KEYFLAG_KSK))
+ continue;
+
+ revoked = ISC_TF(dnskey.flags & DNS_KEYFLAG_REVOKE);
+
+ if (matchkey(&kfetch->keydataset, &dnskeyrr)) {
+ dns_rdata_reset(&keydatarr);
+ dns_rdataset_current(&kfetch->keydataset, &keydatarr);
+ dns_rdata_tostruct(&keydatarr, &keydata, NULL);
+
+ if (revoked && revocable(kfetch, &keydata)) {
+ if (keydata.addhd > now) {
+ /*
+ * Key wasn't trusted yet, and now
+ * it's been revoked? Just remove it
+ */
+ deletekey = ISC_TRUE;
+ } else if (keydata.removehd == 0) {
+ /* Remove from secroots */
+ untrust_key(zone->view->viewlist,
+ keyname, mctx, &dnskey);
+
+ /* If initializing, delete now */
+ if (keydata.addhd == 0)
+ deletekey = ISC_TRUE;
+ else
+ keydata.removehd = now + MONTH;
+ } else if (keydata.removehd < now) {
+ /* Scheduled for removal */
+ deletekey = ISC_TRUE;
+ }
+ } else if (revoked) {
+ if (secure && keydata.removehd == 0) {
+ dns_zone_log(zone, ISC_LOG_WARNING,
+ "Active key for zone "
+ "'%s' is revoked but "
+ "did not self-sign; "
+ "ignoring.", namebuf);
+ continue;
+ }
+ } else if (secure) {
+ if (keydata.removehd != 0) {
+ /*
+ * Key isn't revoked--but it
+ * seems it used to be.
+ * Remove it now and add it
+ * back as if it were a fresh key.
+ */
+ deletekey = ISC_TRUE;
+ newkey = ISC_TRUE;
+ } else if (keydata.addhd > now)
+ pending++;
+ else if (keydata.addhd == 0)
+ keydata.addhd = now;
+
+ if (keydata.addhd <= now)
+ trustkey = ISC_TRUE;
+ }
+
+ if (!deletekey && !newkey)
+ updatekey = ISC_TRUE;
+ } else if (secure) {
+ /*
+ * Key wasn't in the key zone but it's
+ * revoked now anyway, so just skip it
+ */
+ if (revoked)
+ continue;
+
+ /* Key wasn't in the key zone: add it */
+ newkey = ISC_TRUE;
+
+ if (initializing) {
+ dns_keytag_t tag = 0;
+ CHECK(compute_tag(keyname, &dnskey,
+ mctx, &tag));
+ dns_zone_log(zone, ISC_LOG_WARNING,
+ "Initializing automatic trust "
+ "anchor management for zone '%s'; "
+ "DNSKEY ID %d is now trusted, "
+ "waiving the normal 30-day "
+ "waiting period.",
+ namebuf, tag);
+ trustkey = ISC_TRUE;
+ }
+ }
+
+ /* Delete old version */
+ if (deletekey || !newkey) {
+ CHECK(update_one_rr(kfetch->db, ver, &diff,
+ DNS_DIFFOP_DEL, keyname, 0,
+ &keydatarr));
+ changed = ISC_TRUE;
+ }
+
+ if (updatekey) {
+ /* Set refresh timer */
+ keydata.refresh = refresh_time(kfetch, ISC_FALSE);
+ dns_rdata_reset(&keydatarr);
+ isc_buffer_init(&keyb, key_buf, sizeof(key_buf));
+ dns_rdata_fromstruct(&keydatarr, zone->rdclass,
+ dns_rdatatype_keydata,
+ &keydata, &keyb);
+
+ /* Insert updated version */
+ CHECK(update_one_rr(kfetch->db, ver, &diff,
+ DNS_DIFFOP_ADD, keyname, 0,
+ &keydatarr));
+ changed = ISC_TRUE;
+ } else if (newkey) {
+ /* Convert DNSKEY to KEYDATA */
+ dns_rdata_tostruct(&dnskeyrr, &dnskey, NULL);
+ dns_keydata_fromdnskey(&keydata, &dnskey, 0, 0, 0,
+ NULL);
+ keydata.addhd = initializing ? now : now + MONTH;
+ keydata.refresh = refresh_time(kfetch, ISC_FALSE);
+ dns_rdata_reset(&keydatarr);
+ isc_buffer_init(&keyb, key_buf, sizeof(key_buf));
+ dns_rdata_fromstruct(&keydatarr, zone->rdclass,
+ dns_rdatatype_keydata,
+ &keydata, &keyb);
+
+ /* Insert into key zone */
+ CHECK(update_one_rr(kfetch->db, ver, &diff,
+ DNS_DIFFOP_ADD, keyname, 0,
+ &keydatarr));
+ changed = ISC_TRUE;
+ }
+
+ if (trustkey) {
+ /* Trust this key in all views */
+ dns_rdata_tostruct(&dnskeyrr, &dnskey, NULL);
+ trust_key(zone->view->viewlist, keyname, &dnskey,
+ mctx);
+ }
+
+ if (!deletekey)
+ set_refreshkeytimer(zone, &keydata, now);
+ }
+
+ /*
+ * RFC5011 says, "A trust point that has all of its trust anchors
+ * revoked is considered deleted and is treated as if the trust
+ * point was never configured." But if someone revoked their
+ * active key before the standby was trusted, that would mean the
+ * zone would suddenly be nonsecured. We avoid this by checking to
+ * see if there's pending keydata. If so, we put a null key in
+ * the security roots; then all queries to the zone will fail.
+ */
+ if (pending != 0)
+ fail_secure(zone->view->viewlist, keyname);
+
+ failure:
+ if (changed) {
+ DNS_ZONE_SETFLAG(zone, DNS_ZONEFLG_LOADED);
+ zone_needdump(zone, 30);
+ }
+
+ UNLOCK_ZONE(zone);
+
+ /* Write changes to journal file. */
+ if (alldone) {
+ result = increment_soa_serial(kfetch->db, ver, &diff, mctx);
+ if (result == ISC_R_SUCCESS)
+ result = zone_journal(zone, &diff, "keyfetch_done");
+ }
+
+ dns_diff_clear(&diff);
+ dns_db_closeversion(kfetch->db, &ver, changed);
+ dns_db_detach(&kfetch->db);
+ dns_zone_detach(&kfetch->zone);
+
+ if (dns_rdataset_isassociated(&kfetch->keydataset))
+ dns_rdataset_disassociate(&kfetch->keydataset);
+ if (dns_rdataset_isassociated(&kfetch->dnskeyset))
+ dns_rdataset_disassociate(&kfetch->dnskeyset);
+ if (dns_rdataset_isassociated(&kfetch->dnskeysigset))
+ dns_rdataset_disassociate(&kfetch->dnskeysigset);
+
+ dns_name_free(keyname, mctx);
+ isc_mem_put(mctx, kfetch, sizeof(dns_keyfetch_t));
+ isc_mem_detach(&mctx);
+
+ if (secroots != NULL)
+ dns_keytable_detach(&secroots);
+}
+
+/*
+ * Refresh the data in the key zone. Initiate a fetch to get new DNSKEY
+ * records from the zone apex.
+ */
+static void
+zone_refreshkeys(dns_zone_t *zone) {
+ const char me[] = "zone_refreshkeys";
+ isc_result_t result;
+ dns_rriterator_t rrit;
+ dns_db_t *db = NULL;
+ dns_dbversion_t *ver = NULL;
+ dns_diff_t diff;
+ dns_rdata_t rdata = DNS_RDATA_INIT;
+ dns_rdata_keydata_t kd;
+ isc_stdtime_t now;
+ isc_boolean_t commit = ISC_FALSE;
+
+ ENTER;
+ REQUIRE(zone->db != NULL);
+
+ isc_stdtime_get(&now);
+
+ ZONEDB_LOCK(&zone->dblock, isc_rwlocktype_read);
+ dns_db_attach(zone->db, &db);
+ ZONEDB_UNLOCK(&zone->dblock, isc_rwlocktype_read);
+
+ LOCK_ZONE(zone);
+ dns_db_newversion(db, &ver);
+ dns_diff_init(zone->mctx, &diff);
+
+ DNS_ZONE_SETFLAG(zone, DNS_ZONEFLG_REFRESHING);
+
+ dns_rriterator_init(&rrit, db, ver, 0);
+ for (result = dns_rriterator_first(&rrit);
+ result == ISC_R_SUCCESS;
+ result = dns_rriterator_nextrrset(&rrit)) {
+ isc_stdtime_t timer = 0xffffffff;
+ dns_keyfetch_t *kfetch;
+ dns_rdataset_t *kdset;
+ dns_name_t *name = NULL;
+ isc_uint32_t ttl;
+
+ dns_rriterator_current(&rrit, &name, &ttl, &kdset, NULL);
+ if (!dns_rdataset_isassociated(kdset))
+ continue;
+
+ if (kdset->type != dns_rdatatype_keydata)
+ continue;
+
+ /*
+ * Scan the stored keys looking for ones that need
+ * removal or refreshing
+ */
+ for (result = dns_rdataset_first(kdset);
+ result == ISC_R_SUCCESS;
+ result = dns_rdataset_next(kdset)) {
+ dns_rdata_reset(&rdata);
+ dns_rdataset_current(kdset, &rdata);
+ result = dns_rdata_tostruct(&rdata, &kd, NULL);
+ RUNTIME_CHECK(result == ISC_R_SUCCESS);
+
+ /* Removal timer expired? */
+ if (kd.removehd != 0 && kd.removehd < now) {
+ CHECK(update_one_rr(db, ver, &diff,
+ DNS_DIFFOP_DEL, name, ttl,
+ &rdata));
+ continue;
+ }
+
+ /* Acceptance timer expired? */
+ if (kd.addhd != 0 && kd.addhd < now)
+ timer = kd.addhd;
+
+ /* Or do we just need to refresh the keyset? */
+ if (timer > kd.refresh)
+ timer = kd.refresh;
+ }
+
+ if (timer > now)
+ continue;
+
+ zone->refreshkeycount++;
+
+ kfetch = isc_mem_get(zone->mctx, sizeof(dns_keyfetch_t));
+ kfetch->zone = NULL;
+ dns_zone_attach(zone, &kfetch->zone);
+ dns_fixedname_init(&kfetch->name);
+ dns_name_dup(name, zone->mctx,
+ dns_fixedname_name(&kfetch->name));
+ dns_rdataset_init(&kfetch->dnskeyset);
+ dns_rdataset_init(&kfetch->dnskeysigset);
+ dns_rdataset_init(&kfetch->keydataset);
+ dns_rdataset_clone(kdset, &kfetch->keydataset);
+ kfetch->db = NULL;
+ dns_db_attach(db, &kfetch->db);
+ kfetch->fetch = NULL;
+
+ dns_resolver_createfetch(zone->view->resolver,
+ dns_fixedname_name(&kfetch->name),
+ dns_rdatatype_dnskey,
+ NULL, NULL, NULL,
+ DNS_FETCHOPT_NOVALIDATE,
+ zone->task, keyfetch_done, kfetch,
+ &kfetch->dnskeyset,
+ &kfetch->dnskeysigset,
+ &kfetch->fetch);
+ }
+ if (!ISC_LIST_EMPTY(diff.tuples)) {
+ CHECK(increment_soa_serial(db, ver, &diff, zone->mctx));
+ commit = ISC_TRUE;
+ zone_journal(zone, &diff, "sync_keyzone");
+ DNS_ZONE_SETFLAG(zone, DNS_ZONEFLG_LOADED);
+ zone_needdump(zone, 30);
+ }
+ failure:
+ UNLOCK_ZONE(zone);
+
+ dns_rriterator_destroy(&rrit);
+ dns_diff_clear(&diff);
+ dns_db_closeversion(db, &ver, commit);
+ dns_db_detach(&db);
+}
+
+static void
zone_maintenance(dns_zone_t *zone) {
const char me[] = "zone_maintenance";
isc_time_t now;
@@ -5991,7 +7790,7 @@ zone_maintenance(dns_zone_t *zone) {
/*
* Configuring the view of this zone may have
* failed, for example because the config file
- * had a syntax error. In that case, the view
+ * had a syntax error. In that case, the view
* adb or resolver, and we had better not try
* to do maintenance on it.
*/
@@ -6038,6 +7837,7 @@ zone_maintenance(dns_zone_t *zone) {
switch (zone->type) {
case dns_zone_master:
case dns_zone_slave:
+ case dns_zone_key:
LOCK_ZONE(zone);
if (zone->masterfile != NULL &&
isc_time_compare(&now, &zone->dumptime) >= 0 &&
@@ -6059,6 +7859,24 @@ zone_maintenance(dns_zone_t *zone) {
break;
}
+ /*
+ * Do we need to refresh keys?
+ */
+ switch (zone->type) {
+ case dns_zone_key:
+ if (isc_time_compare(&now, &zone->refreshkeytime) >= 0 &&
+ DNS_ZONE_FLAG(zone, DNS_ZONEFLG_LOADED) &&
+ !DNS_ZONE_FLAG(zone, DNS_ZONEFLG_REFRESHING))
+ zone_refreshkeys(zone);
+ break;
+ case dns_zone_master:
+ if (!isc_time_isepoch(&zone->refreshkeytime) &&
+ isc_time_compare(&now, &zone->refreshkeytime) >= 0)
+ zone_rekey(zone);
+ default:
+ break;
+ }
+
switch (zone->type) {
case dns_zone_master:
case dns_zone_slave:
@@ -6098,7 +7916,8 @@ void
dns_zone_markdirty(dns_zone_t *zone) {
LOCK_ZONE(zone);
- set_resigntime(zone); /* XXXMPA make separate call back */
+ if (zone->type == dns_zone_master)
+ set_resigntime(zone); /* XXXMPA make separate call back */
zone_needdump(zone, DNS_DUMP_DELAY);
UNLOCK_ZONE(zone);
}
@@ -8474,7 +10293,7 @@ zone_shutdown(isc_task_t *task, isc_event_t *event) {
/*
* We have now canceled everything set the flag to allow exit_check()
- * to succeed. We must not unlock between setting this flag and
+ * to succeed. We must not unlock between setting this flag and
* calling exit_check().
*/
DNS_ZONE_SETFLAG(zone, DNS_ZONEFLG_SHUTDOWN);
@@ -8505,6 +10324,7 @@ zone_settimer(dns_zone_t *zone, isc_time_t *now) {
isc_time_t next;
isc_result_t result;
+ ENTER;
REQUIRE(DNS_ZONE_VALID(zone));
if (DNS_ZONE_FLAG(zone, DNS_ZONEFLG_EXITING))
return;
@@ -8522,6 +10342,12 @@ zone_settimer(dns_zone_t *zone, isc_time_t *now) {
isc_time_compare(&zone->dumptime, &next) < 0)
next = zone->dumptime;
}
+ if (!DNS_ZONE_FLAG(zone, DNS_ZONEFLG_REFRESHING) &&
+ !isc_time_isepoch(&zone->refreshkeytime)) {
+ if (isc_time_isepoch(&next) ||
+ isc_time_compare(&zone->refreshkeytime, &next) < 0)
+ next = zone->refreshkeytime;
+ }
if (!isc_time_isepoch(&zone->resigntime)) {
if (isc_time_isepoch(&next) ||
isc_time_compare(&zone->resigntime, &next) < 0)
@@ -8574,6 +10400,22 @@ zone_settimer(dns_zone_t *zone, isc_time_t *now) {
}
break;
+ case dns_zone_key:
+ if (DNS_ZONE_FLAG(zone, DNS_ZONEFLG_NEEDDUMP) &&
+ !DNS_ZONE_FLAG(zone, DNS_ZONEFLG_DUMPING)) {
+ INSIST(!isc_time_isepoch(&zone->dumptime));
+ if (isc_time_isepoch(&next) ||
+ isc_time_compare(&zone->dumptime, &next) < 0)
+ next = zone->dumptime;
+ }
+ if (!DNS_ZONE_FLAG(zone, DNS_ZONEFLG_REFRESHING)) {
+ if (isc_time_isepoch(&next) ||
+ (!isc_time_isepoch(&zone->refreshkeytime) &&
+ isc_time_compare(&zone->refreshkeytime, &next) < 0))
+ next = zone->refreshkeytime;
+ }
+ break;
+
default:
break;
}
@@ -8786,7 +10628,7 @@ dns_zone_notifyreceive(dns_zone_t *zone, isc_sockaddr_t *from,
REQUIRE(DNS_ZONE_VALID(zone));
/*
- * If type != T_SOA return DNS_R_REFUSED. We don't yet support
+ * If type != T_SOA return DNS_R_NOTIMP. We don't yet support
* ROLLOVER.
*
* SOA: RFC1996
@@ -8905,7 +10747,8 @@ dns_zone_notifyreceive(dns_zone_t *zone, isc_sockaddr_t *from,
NULL, NULL);
RUNTIME_CHECK(result == ISC_R_SUCCESS);
if (isc_serial_le(serial, oldserial)) {
- dns_zone_log(zone, ISC_LOG_INFO,
+ dns_zone_log(zone,
+ ISC_LOG_INFO,
"notify from %s: "
"zone is up to date",
fromtext);
@@ -9309,7 +11152,8 @@ dns_zone_logc(dns_zone_t *zone, isc_logcategory_t *category,
vsnprintf(message, sizeof(message), fmt, ap);
va_end(ap);
isc_log_write(dns_lctx, category, DNS_LOGMODULE_ZONE,
- level, "zone %s: %s", zone->strnamerd, message);
+ level, "%s %s: %s", (zone->type == dns_zone_key) ?
+ "managed-keys-zone" : "zone", zone->strnamerd, message);
}
void
@@ -9324,7 +11168,8 @@ dns_zone_log(dns_zone_t *zone, int level, const char *fmt, ...) {
vsnprintf(message, sizeof(message), fmt, ap);
va_end(ap);
isc_log_write(dns_lctx, DNS_LOGCATEGORY_GENERAL, DNS_LOGMODULE_ZONE,
- level, "zone %s: %s", zone->strnamerd, message);
+ level, "%s %s: %s", (zone->type == dns_zone_key) ?
+ "managed-keys-zone" : "zone", zone->strnamerd, message);
}
static void
@@ -9342,7 +11187,8 @@ zone_debuglog(dns_zone_t *zone, const char *me, int debuglevel,
vsnprintf(message, sizeof(message), fmt, ap);
va_end(ap);
isc_log_write(dns_lctx, DNS_LOGCATEGORY_GENERAL, DNS_LOGMODULE_ZONE,
- level, "%s: zone %s: %s", me, zone->strnamerd, message);
+ level, "%s: %s %s: %s", me, zone->type != dns_zone_key ?
+ "zone" : "managed-keys-zone", zone->strnamerd, message);
}
static int
@@ -9499,7 +11345,7 @@ notify_done(isc_task_t *task, isc_event_t *event) {
dns_result_totext(result));
/*
- * Old bind's return formerr if they see a soa record. Retry w/o
+ * Old bind's return formerr if they see a soa record. Retry w/o
* the soa if we see a formerr and had sent a SOA.
*/
isc_event_free(&event);
@@ -9554,7 +11400,7 @@ zone_replacedb(dns_zone_t *zone, dns_db_t *db, isc_boolean_t dump) {
"has %d SOA records", soacount);
result = DNS_R_BADZONE;
}
- if (nscount == 0) {
+ if (nscount == 0 && zone->type != dns_zone_key) {
dns_zone_log(zone, ISC_LOG_ERROR, "has no NS records");
result = DNS_R_BADZONE;
}
@@ -9640,24 +11486,27 @@ zone_replacedb(dns_zone_t *zone, dns_db_t *db, isc_boolean_t dump) {
}
} else {
if (dump && zone->masterfile != NULL) {
- isc_log_write(dns_lctx, DNS_LOGCATEGORY_GENERAL,
- DNS_LOGMODULE_ZONE, ISC_LOG_DEBUG(3),
- "dumping new zone version");
- result = dns_db_dump2(db, ver, zone->masterfile,
- zone->masterformat);
- if (result != ISC_R_SUCCESS)
- goto fail;
-
/*
- * Update the time the zone was updated, so
- * dns_zone_load can avoid loading it when
- * the server is reloaded. If isc_time_now
- * fails for some reason, all that happens is
- * the timestamp is not updated.
+ * If DNS_ZONEFLG_FORCEXFER was set we don't want
+ * to keep the old masterfile.
*/
- TIME_NOW(&zone->loadtime);
+ if (DNS_ZONE_FLAG(zone, DNS_ZONEFLG_FORCEXFER) &&
+ remove(zone->masterfile) < 0 && errno != ENOENT) {
+ char strbuf[ISC_STRERRORSIZE];
+ isc__strerror(errno, strbuf, sizeof(strbuf));
+ isc_log_write(dns_lctx,
+ DNS_LOGCATEGORY_GENERAL,
+ DNS_LOGMODULE_ZONE,
+ ISC_LOG_WARNING,
+ "unable to remove masterfile "
+ "'%s': '%s'",
+ zone->masterfile, strbuf);
+ }
+ if (DNS_ZONE_FLAG(zone, DNS_ZONEFLG_LOADED) == 0)
+ DNS_ZONE_SETFLAG(zone, DNS_ZONEFLG_NODELAY);
+ else
+ zone_needdump(zone, 0);
}
-
if (dump && zone->journal != NULL) {
/*
* The in-memory database just changed, and
@@ -9665,7 +11514,7 @@ zone_replacedb(dns_zone_t *zone, dns_db_t *db, isc_boolean_t dump) {
* being loaded from disk. Also, we have not
* journaled diffs for this change.
* Therefore, the on-disk journal is missing
- * the deltas for this change. Since it can
+ * the deltas for this change. Since it can
* no longer be used to bring the zone
* up-to-date, it is useless and should be
* removed.
@@ -9853,16 +11702,19 @@ zone_xfrdone(dns_zone_t *zone, isc_result_t result) {
&now);
/* Someone removed the file from underneath us! */
if (result == ISC_R_FILENOTFOUND &&
- zone->masterfile != NULL)
- zone_needdump(zone, DNS_DUMP_DELAY);
- else if (result != ISC_R_SUCCESS)
+ zone->masterfile != NULL) {
+ unsigned int delay = DNS_DUMP_DELAY;
+ if (DNS_ZONE_FLAG(zone, DNS_ZONEFLG_NODELAY))
+ delay = 0;
+ zone_needdump(zone, delay);
+ } else if (result != ISC_R_SUCCESS)
dns_zone_log(zone, ISC_LOG_ERROR,
"transfer: could not set file "
"modification time of '%s': %s",
zone->masterfile,
dns_result_totext(result));
}
-
+ DNS_ZONE_CLRFLAG(zone, DNS_ZONEFLG_NODELAY);
inc_stats(zone, dns_zonestatscounter_xfrsuccess);
break;
@@ -11313,7 +13165,7 @@ dns_zone_setdialup(dns_zone_t *zone, dns_dialuptype_t dialup) {
case dns_dialuptype_no:
break;
case dns_dialuptype_yes:
- DNS_ZONE_SETFLAG(zone, (DNS_ZONEFLG_DIALNOTIFY |
+ DNS_ZONE_SETFLAG(zone, (DNS_ZONEFLG_DIALNOTIFY |
DNS_ZONEFLG_DIALREFRESH |
DNS_ZONEFLG_NOREFRESH));
break;
@@ -11642,3 +13494,778 @@ zone_signwithkey(dns_zone_t *zone, dns_secalg_t algorithm, isc_uint16_t keyid,
}
return (result);
}
+
+static void
+logmsg(const char *format, ...) {
+ va_list args;
+ va_start(args, format);
+ isc_log_vwrite(dns_lctx, DNS_LOGCATEGORY_GENERAL, DNS_LOGMODULE_ZONE,
+ ISC_LOG_DEBUG(1), format, args);
+ va_end(args);
+}
+
+static void
+clear_keylist(dns_dnsseckeylist_t *list, isc_mem_t *mctx) {
+ dns_dnsseckey_t *key;
+ while (!ISC_LIST_EMPTY(*list)) {
+ key = ISC_LIST_HEAD(*list);
+ ISC_LIST_UNLINK(*list, key, link);
+ dns_dnsseckey_destroy(mctx, &key);
+ }
+}
+
+/* Called once; *timep should be set to the current time. */
+static isc_result_t
+next_keyevent(dst_key_t *key, isc_stdtime_t *timep) {
+ isc_result_t result;
+ isc_stdtime_t now, then = 0, event;
+ int i;
+
+ now = *timep;
+
+ for (i = 0; i <= DST_MAX_TIMES; i++) {
+ result = dst_key_gettime(key, i, &event);
+ if (result == ISC_R_SUCCESS && event > now &&
+ (then == 0 || event < then))
+ then = event;
+ }
+
+ if (then != 0) {
+ *timep = then;
+ return (ISC_R_SUCCESS);
+ }
+
+ return (ISC_R_NOTFOUND);
+}
+
+static isc_result_t
+rr_exists(dns_db_t *db, dns_dbversion_t *ver, dns_name_t *name,
+ const dns_rdata_t *rdata, isc_boolean_t *flag)
+{
+ dns_rdataset_t rdataset;
+ dns_dbnode_t *node = NULL;
+ isc_result_t result;
+
+ dns_rdataset_init(&rdataset);
+ if (rdata->type == dns_rdatatype_nsec3)
+ CHECK(dns_db_findnsec3node(db, name, ISC_FALSE, &node));
+ else
+ CHECK(dns_db_findnode(db, name, ISC_FALSE, &node));
+ result = dns_db_findrdataset(db, node, ver, rdata->type, 0,
+ (isc_stdtime_t) 0, &rdataset, NULL);
+ if (result == ISC_R_NOTFOUND) {
+ *flag = ISC_FALSE;
+ result = ISC_R_SUCCESS;
+ goto failure;
+ }
+
+ for (result = dns_rdataset_first(&rdataset);
+ result == ISC_R_SUCCESS;
+ result = dns_rdataset_next(&rdataset)) {
+ dns_rdata_t myrdata = DNS_RDATA_INIT;
+ dns_rdataset_current(&rdataset, &myrdata);
+ if (!dns_rdata_compare(&myrdata, rdata))
+ break;
+ }
+ dns_rdataset_disassociate(&rdataset);
+ if (result == ISC_R_SUCCESS) {
+ *flag = ISC_TRUE;
+ } else if (result == ISC_R_NOMORE) {
+ *flag = ISC_FALSE;
+ result = ISC_R_SUCCESS;
+ }
+
+ failure:
+ if (node != NULL)
+ dns_db_detachnode(db, &node);
+ return (result);
+}
+
+/*
+ * Add records to signal the state of signing or of key removal.
+ */
+static isc_result_t
+add_signing_records(dns_db_t *db, dns_rdatatype_t privatetype,
+ dns_dbversion_t *ver, dns_diff_t *diff)
+{
+ dns_difftuple_t *tuple, *newtuple = NULL;
+ dns_rdata_dnskey_t dnskey;
+ dns_rdata_t rdata = DNS_RDATA_INIT;
+ isc_boolean_t flag;
+ isc_region_t r;
+ isc_result_t result = ISC_R_SUCCESS;
+ isc_uint16_t keyid;
+ unsigned char buf[5];
+ dns_name_t *name = dns_db_origin(db);
+
+ for (tuple = ISC_LIST_HEAD(diff->tuples);
+ tuple != NULL;
+ tuple = ISC_LIST_NEXT(tuple, link)) {
+ if (tuple->rdata.type != dns_rdatatype_dnskey)
+ continue;
+
+ result = dns_rdata_tostruct(&tuple->rdata, &dnskey, NULL);
+ RUNTIME_CHECK(result == ISC_R_SUCCESS);
+ if ((dnskey.flags &
+ (DNS_KEYFLAG_OWNERMASK|DNS_KEYTYPE_NOAUTH))
+ != DNS_KEYOWNER_ZONE)
+ continue;
+
+ dns_rdata_toregion(&tuple->rdata, &r);
+
+ keyid = dst_region_computeid(&r, dnskey.algorithm);
+
+ buf[0] = dnskey.algorithm;
+ buf[1] = (keyid & 0xff00) >> 8;
+ buf[2] = (keyid & 0xff);
+ buf[3] = (tuple->op == DNS_DIFFOP_ADD) ? 0 : 1;
+ buf[4] = 0;
+ rdata.data = buf;
+ rdata.length = sizeof(buf);
+ rdata.type = privatetype;
+ rdata.rdclass = tuple->rdata.rdclass;
+
+ CHECK(rr_exists(db, ver, name, &rdata, &flag));
+ if (flag)
+ continue;
+ CHECK(dns_difftuple_create(diff->mctx, DNS_DIFFOP_ADD,
+ name, 0, &rdata, &newtuple));
+ CHECK(do_one_tuple(&newtuple, db, ver, diff));
+ INSIST(newtuple == NULL);
+ /*
+ * Remove any record which says this operation has already
+ * completed.
+ */
+ buf[4] = 1;
+ CHECK(rr_exists(db, ver, name, &rdata, &flag));
+ if (flag) {
+ CHECK(dns_difftuple_create(diff->mctx, DNS_DIFFOP_DEL,
+ name, 0, &rdata, &newtuple));
+ CHECK(do_one_tuple(&newtuple, db, ver, diff));
+ INSIST(newtuple == NULL);
+ }
+ }
+ failure:
+ return (result);
+}
+
+static isc_result_t
+sign_apex(dns_zone_t *zone, dns_db_t *db, dns_dbversion_t *ver,
+ dns_diff_t *diff, dns_diff_t *sig_diff)
+{
+ isc_result_t result;
+ isc_stdtime_t now, inception, soaexpire;
+ isc_boolean_t check_ksk, keyset_kskonly;
+ dst_key_t *zone_keys[MAXZONEKEYS];
+ unsigned int nkeys = 0, i;
+ dns_difftuple_t *tuple;
+
+ result = find_zone_keys(zone, db, ver, zone->mctx, MAXZONEKEYS,
+ zone_keys, &nkeys);
+ if (result != ISC_R_SUCCESS) {
+ dns_zone_log(zone, ISC_LOG_ERROR,
+ "sign_apex:find_zone_keys -> %s\n",
+ dns_result_totext(result));
+ return (result);
+ }
+
+ isc_stdtime_get(&now);
+ inception = now - 3600; /* Allow for clock skew. */
+ soaexpire = now + dns_zone_getsigvalidityinterval(zone);
+
+ check_ksk = DNS_ZONE_OPTION(zone, DNS_ZONEOPT_UPDATECHECKKSK);
+ keyset_kskonly = DNS_ZONE_OPTION(zone, DNS_ZONEOPT_DNSKEYKSKONLY);
+
+ /*
+ * See if update_sigs will update DNSKEY signature and if not
+ * cause them to sign so that so that newly activated keys
+ * are used.
+ */
+ for (tuple = ISC_LIST_HEAD(diff->tuples);
+ tuple != NULL;
+ tuple = ISC_LIST_NEXT(tuple, link)) {
+ if (tuple->rdata.type == dns_rdatatype_dnskey &&
+ dns_name_equal(&tuple->name, &zone->origin))
+ break;
+ }
+
+ if (tuple == NULL) {
+ result = del_sigs(zone, db, ver, &zone->origin,
+ dns_rdatatype_dnskey, sig_diff,
+ zone_keys, nkeys, now);
+ if (result != ISC_R_SUCCESS) {
+ dns_zone_log(zone, ISC_LOG_ERROR,
+ "sign_apex:del_sigs -> %s\n",
+ dns_result_totext(result));
+ goto failure;
+ }
+ result = add_sigs(db, ver, &zone->origin, dns_rdatatype_dnskey,
+ sig_diff, zone_keys, nkeys, zone->mctx,
+ inception, soaexpire, check_ksk,
+ keyset_kskonly);
+ if (result != ISC_R_SUCCESS) {
+ dns_zone_log(zone, ISC_LOG_ERROR,
+ "sign_apex:add_sigs -> %s\n",
+ dns_result_totext(result));
+ goto failure;
+ }
+ }
+
+ result = update_sigs(diff, db, ver, zone_keys, nkeys, zone,
+ inception, soaexpire, now, check_ksk,
+ keyset_kskonly, sig_diff);
+
+ if (result != ISC_R_SUCCESS) {
+ dns_zone_log(zone, ISC_LOG_ERROR,
+ "sign_apex:update_sigs -> %s\n",
+ dns_result_totext(result));
+ goto failure;
+ }
+
+ failure:
+ for (i = 0; i < nkeys; i++)
+ dst_key_free(&zone_keys[i]);
+ return (result);
+}
+
+/*
+ * Prevent the zone entering a inconsistent state where
+ * NSEC only DNSKEYs are present with NSEC3 chains.
+ * See update.c:check_dnssec()
+ */
+static isc_boolean_t
+dnskey_sane(dns_zone_t *zone, dns_db_t *db, dns_dbversion_t *ver,
+ dns_diff_t *diff)
+{
+ isc_result_t result;
+ dns_difftuple_t *tuple;
+ isc_boolean_t nseconly = ISC_FALSE, nsec3 = ISC_FALSE;
+ dns_rdatatype_t privatetype = dns_zone_getprivatetype(zone);
+
+ /* Scan the tuples for an NSEC-only DNSKEY */
+ for (tuple = ISC_LIST_HEAD(diff->tuples);
+ tuple != NULL;
+ tuple = ISC_LIST_NEXT(tuple, link)) {
+ isc_uint8_t alg;
+ if (tuple->rdata.type != dns_rdatatype_dnskey ||
+ tuple->op != DNS_DIFFOP_ADD)
+ continue;
+
+ alg = tuple->rdata.data[3];
+ if (alg == DST_ALG_RSAMD5 || alg == DST_ALG_RSASHA1 ||
+ alg == DST_ALG_DSA || alg == DST_ALG_ECC) {
+ nseconly = ISC_TRUE;
+ break;
+ }
+ }
+
+ /* Check existing DB for NSEC-only DNSKEY */
+ if (!nseconly)
+ CHECK(dns_nsec_nseconly(db, ver, &nseconly));
+
+ /* Check existing DB for NSEC3 */
+ if (!nsec3)
+ CHECK(dns_nsec3_activex(db, ver, ISC_FALSE,
+ privatetype, &nsec3));
+
+ /* Refuse to allow NSEC3 with NSEC-only keys */
+ if (nseconly && nsec3) {
+ dns_zone_log(zone, ISC_LOG_ERROR,
+ "NSEC only DNSKEYs and NSEC3 chains not allowed");
+ goto failure;
+ }
+
+ return (ISC_TRUE);
+
+ failure:
+ return (ISC_FALSE);
+}
+
+static isc_result_t
+clean_nsec3param(dns_zone_t *zone, dns_db_t *db, dns_dbversion_t *ver,
+ dns_diff_t *diff)
+{
+ isc_result_t result;
+ dns_dbnode_t *node = NULL;
+ dns_rdataset_t rdataset;
+
+ dns_rdataset_init(&rdataset);
+ CHECK(dns_db_getoriginnode(db, &node));
+
+ result = dns_db_findrdataset(db, node, ver, dns_rdatatype_dnskey,
+ dns_rdatatype_none, 0, &rdataset, NULL);
+ if (dns_rdataset_isassociated(&rdataset))
+ dns_rdataset_disassociate(&rdataset);
+ if (result != ISC_R_NOTFOUND)
+ goto failure;
+
+ result = dns_nsec3param_deletechains(db, ver, zone, diff);
+
+ failure:
+ if (node != NULL)
+ dns_db_detachnode(db, &node);
+ return (result);
+}
+
+/*
+ * Given an RRSIG rdataset and an algorithm, determine whether there
+ * are any signatures using that algorithm.
+ */
+static isc_boolean_t
+signed_with_alg(dns_rdataset_t *rdataset, dns_secalg_t alg) {
+ dns_rdata_t rdata = DNS_RDATA_INIT;
+ dns_rdata_rrsig_t rrsig;
+ isc_result_t result;
+
+ REQUIRE(rdataset == NULL || rdataset->type == dns_rdatatype_rrsig);
+ if (rdataset == NULL || !dns_rdataset_isassociated(rdataset)) {
+ return (ISC_FALSE);
+ }
+
+ for (result = dns_rdataset_first(rdataset);
+ result == ISC_R_SUCCESS;
+ result = dns_rdataset_next(rdataset))
+ {
+ dns_rdataset_current(rdataset, &rdata);
+ result = dns_rdata_tostruct(&rdata, &rrsig, NULL);
+ RUNTIME_CHECK(result == ISC_R_SUCCESS);
+ dns_rdata_reset(&rdata);
+ if (rrsig.algorithm == alg)
+ return (ISC_TRUE);
+ }
+
+ return (ISC_FALSE);
+}
+
+static isc_result_t
+add_chains(dns_zone_t *zone, dns_db_t *db, dns_dbversion_t *ver,
+ dns_diff_t *diff)
+{
+ dns_name_t *origin;
+ isc_boolean_t build_nsec3;
+ isc_result_t result;
+
+ origin = dns_db_origin(db);
+ CHECK(dns_private_chains(db, ver, zone->privatetype, NULL,
+ &build_nsec3));
+ if (build_nsec3)
+ CHECK(dns_nsec3_addnsec3sx(db, ver, origin, zone->minimum,
+ ISC_FALSE, zone->privatetype, diff));
+ CHECK(updatesecure(db, ver, origin, zone->minimum, ISC_TRUE, diff));
+
+ failure:
+ return (result);
+}
+
+static void
+zone_rekey(dns_zone_t *zone) {
+ isc_result_t result;
+ dns_db_t *db = NULL;
+ dns_dbnode_t *node = NULL;
+ dns_dbversion_t *ver = NULL;
+ dns_rdataset_t soaset, soasigs, keyset, keysigs;
+ dns_dnsseckeylist_t dnskeys, keys, rmkeys;
+ dns_dnsseckey_t *key;
+ dns_diff_t diff, sig_diff;
+ isc_boolean_t commit = ISC_FALSE, newactive = ISC_FALSE;
+ isc_boolean_t fullsign;
+ dns_ttl_t ttl = 3600;
+ const char *dir;
+ isc_mem_t *mctx;
+ isc_stdtime_t now;
+ isc_time_t timenow;
+ isc_interval_t ival;
+ char timebuf[80];
+
+ REQUIRE(DNS_ZONE_VALID(zone));
+
+ ISC_LIST_INIT(dnskeys);
+ ISC_LIST_INIT(keys);
+ ISC_LIST_INIT(rmkeys);
+ dns_rdataset_init(&soaset);
+ dns_rdataset_init(&soasigs);
+ dns_rdataset_init(&keyset);
+ dns_rdataset_init(&keysigs);
+ dir = dns_zone_getkeydirectory(zone);
+ mctx = zone->mctx;
+ dns_diff_init(mctx, &diff);
+ dns_diff_init(mctx, &sig_diff);
+
+ CHECK(dns_zone_getdb(zone, &db));
+ CHECK(dns_db_newversion(db, &ver));
+ CHECK(dns_db_getoriginnode(db, &node));
+
+ dns_zone_log(zone, ISC_LOG_INFO, "reconfiguring zone keys");
+
+ /* Get the SOA record's TTL */
+ CHECK(dns_db_findrdataset(db, node, ver, dns_rdatatype_soa,
+ dns_rdatatype_none, 0, &soaset, &soasigs));
+ ttl = soaset.ttl;
+ dns_rdataset_disassociate(&soaset);
+
+ /* Get the DNSKEY rdataset */
+ result = dns_db_findrdataset(db, node, ver, dns_rdatatype_dnskey,
+ dns_rdatatype_none, 0, &keyset, &keysigs);
+ if (result == ISC_R_SUCCESS) {
+ ttl = keyset.ttl;
+ result = dns_dnssec_keylistfromrdataset(&zone->origin, dir,
+ mctx, &keyset,
+ &keysigs, &soasigs,
+ ISC_FALSE, ISC_FALSE,
+ &dnskeys);
+ /* Can't get keys for some reason; try again later. */
+ if (result != ISC_R_SUCCESS)
+ goto trylater;
+ } else if (result != ISC_R_NOTFOUND)
+ goto failure;
+
+ /*
+ * True when called from "rndc sign". Indicates the zone should be
+ * fully signed now.
+ */
+ fullsign = ISC_TF(DNS_ZONEKEY_OPTION(zone, DNS_ZONEKEY_FULLSIGN) != 0);
+
+ result = dns_dnssec_findmatchingkeys(&zone->origin, dir, mctx, &keys);
+ if (result == ISC_R_SUCCESS) {
+ isc_boolean_t check_ksk;
+ check_ksk = DNS_ZONE_OPTION(zone, DNS_ZONEOPT_UPDATECHECKKSK);
+
+ result = dns_dnssec_updatekeys(&dnskeys, &keys, &rmkeys,
+ &zone->origin, ttl, &diff,
+ ISC_TF(!check_ksk),
+ mctx, logmsg);
+
+ /* Keys couldn't be updated for some reason;
+ * try again later. */
+ if (result != ISC_R_SUCCESS) {
+ dns_zone_log(zone, ISC_LOG_ERROR, "zone_rekey:"
+ "couldn't update zone keys: %s",
+ isc_result_totext(result));
+ goto trylater;
+ }
+
+ /* See if any pre-existing keys have newly become active */
+ for (key = ISC_LIST_HEAD(dnskeys);
+ key != NULL;
+ key = ISC_LIST_NEXT(key, link)) {
+ if (key->first_sign) {
+ newactive = ISC_TRUE;
+ break;
+ }
+ }
+
+ if ((newactive || fullsign || !ISC_LIST_EMPTY(diff.tuples)) &&
+ dnskey_sane(zone, db, ver, &diff)) {
+ CHECK(dns_diff_apply(&diff, db, ver));
+ CHECK(clean_nsec3param(zone, db, ver, &diff));
+ CHECK(add_signing_records(db, zone->privatetype, ver,
+ &diff));
+ CHECK(increment_soa_serial(db, ver, &diff, mctx));
+ CHECK(add_chains(zone, db, ver, &diff));
+ CHECK(sign_apex(zone, db, ver, &diff, &sig_diff));
+ CHECK(zone_journal(zone, &sig_diff, "zone_rekey"));
+ commit = ISC_TRUE;
+ }
+ }
+
+ dns_db_closeversion(db, &ver, commit);
+
+ if (commit) {
+ isc_time_t timenow;
+ dns_difftuple_t *tuple;
+ isc_boolean_t newkey = ISC_FALSE;
+ isc_boolean_t newalg = ISC_FALSE;
+
+ LOCK_ZONE(zone);
+ DNS_ZONE_SETFLAG(zone, DNS_ZONEFLG_NEEDNOTIFY);
+
+ zone_needdump(zone, DNS_DUMP_DELAY);
+
+ TIME_NOW(&timenow);
+ zone_settimer(zone, &timenow);
+
+ /*
+ * Has a new key become active? If so, is it for
+ * a new algorithm?
+ */
+ for (tuple = ISC_LIST_HEAD(sig_diff.tuples);
+ tuple != NULL;
+ tuple = ISC_LIST_NEXT(tuple, link)) {
+ dns_rdata_dnskey_t dnskey;
+
+ if (tuple->rdata.type != dns_rdatatype_dnskey)
+ continue;
+
+ newkey = ISC_TRUE;
+ if (!dns_rdataset_isassociated(&keysigs)) {
+ newalg = ISC_TRUE;
+ break;
+ }
+
+ result = dns_rdata_tostruct(&tuple->rdata,
+ &dnskey, NULL);
+ RUNTIME_CHECK(result == ISC_R_SUCCESS);
+ if (!signed_with_alg(&keysigs,
+ dnskey.algorithm)) {
+ newalg = ISC_TRUE;
+ break;
+ }
+ }
+
+ /*
+ * If we found a new algorithm, we need to sign the
+ * zone fully. If there's a new key, but it's for an
+ * already-existing algorithm, then the zone signing
+ * can be handled incrementally.
+ */
+ if (newkey && !newalg)
+ set_resigntime(zone);
+
+ /* Remove any signatures from removed keys. */
+ if (!ISC_LIST_EMPTY(rmkeys)) {
+ for (key = ISC_LIST_HEAD(rmkeys);
+ key != NULL;
+ key = ISC_LIST_NEXT(key, link)) {
+ result = zone_signwithkey(zone,
+ dst_key_alg(key->key),
+ dst_key_id(key->key),
+ ISC_TRUE);
+ if (result != ISC_R_SUCCESS) {
+ dns_zone_log(zone, ISC_LOG_ERROR,
+ "zone_signwithkey failed: %s",
+ dns_result_totext(result));
+ }
+ }
+ }
+
+
+ if (fullsign) {
+ /*
+ * "rndc sign" was called, so we now sign the zone
+ * with all active keys, whether they're new or not.
+ */
+ for (key = ISC_LIST_HEAD(dnskeys);
+ key != NULL;
+ key = ISC_LIST_NEXT(key, link)) {
+ if (!key->force_sign && !key->hint_sign)
+ continue;
+
+ result = zone_signwithkey(zone,
+ dst_key_alg(key->key),
+ dst_key_id(key->key),
+ ISC_FALSE);
+ if (result != ISC_R_SUCCESS) {
+ dns_zone_log(zone, ISC_LOG_ERROR,
+ "zone_signwithkey failed: %s",
+ dns_result_totext(result));
+ }
+ }
+ } else if (newalg) {
+ /*
+ * We haven't been told to sign fully, but a new
+ * algorithm was added to the DNSKEY. We sign
+ * the full zone, but only with the newly-added
+ * keys.
+ */
+ for (tuple = ISC_LIST_HEAD(sig_diff.tuples);
+ tuple != NULL;
+ tuple = ISC_LIST_NEXT(tuple, link)) {
+ dns_rdata_dnskey_t dnskey;
+ dns_secalg_t algorithm;
+ isc_region_t r;
+ isc_uint16_t keyid;
+
+ if (tuple->rdata.type != dns_rdatatype_dnskey ||
+ tuple->op == DNS_DIFFOP_DEL)
+ continue;
+
+ result = dns_rdata_tostruct(&tuple->rdata,
+ &dnskey, NULL);
+ RUNTIME_CHECK(result == ISC_R_SUCCESS);
+ dns_rdata_toregion(&tuple->rdata, &r);
+ algorithm = dnskey.algorithm;
+ keyid = dst_region_computeid(&r, algorithm);
+
+ result = zone_signwithkey(zone, algorithm,
+ keyid, ISC_FALSE);
+ if (result != ISC_R_SUCCESS) {
+ dns_zone_log(zone, ISC_LOG_ERROR,
+ "zone_signwithkey failed: %s",
+ dns_result_totext(result));
+ }
+ }
+ }
+
+ /*
+ * Clear fullsign flag, if it was set, so we don't do
+ * another full signing next time
+ */
+ zone->keyopts &= ~DNS_ZONEKEY_FULLSIGN;
+
+ /*
+ * Cause the zone to add/delete NSEC3 chains for the
+ * deferred NSEC3PARAM changes.
+ */
+ for (tuple = ISC_LIST_HEAD(sig_diff.tuples);
+ tuple != NULL;
+ tuple = ISC_LIST_NEXT(tuple, link)) {
+ unsigned char buf[DNS_NSEC3PARAM_BUFFERSIZE];
+ dns_rdata_t rdata = DNS_RDATA_INIT;
+ dns_rdata_nsec3param_t nsec3param;
+
+ if (tuple->rdata.type != zone->privatetype ||
+ tuple->op != DNS_DIFFOP_ADD)
+ continue;
+
+ if (!dns_nsec3param_fromprivate(&tuple->rdata, &rdata,
+ buf, sizeof(buf)))
+ continue;
+ result = dns_rdata_tostruct(&rdata, &nsec3param, NULL);
+ RUNTIME_CHECK(result == ISC_R_SUCCESS);
+ if (nsec3param.flags == 0)
+ continue;
+
+ result = zone_addnsec3chain(zone, &nsec3param);
+ if (result != ISC_R_SUCCESS) {
+ dns_zone_log(zone, ISC_LOG_ERROR,
+ "zone_addnsec3chain failed: %s",
+ dns_result_totext(result));
+ }
+ }
+ UNLOCK_ZONE(zone);
+ }
+
+ isc_stdtime_get(&now);
+ TIME_NOW(&timenow);
+ isc_time_settoepoch(&zone->refreshkeytime);
+ for (key = ISC_LIST_HEAD(dnskeys);
+ key != NULL;
+ key = ISC_LIST_NEXT(key, link)) {
+ isc_stdtime_t then;
+ isc_time_t timethen;
+
+ /*
+ * If we are doing automatic key maintenance and the
+ * key metadata indicates there is a key change event
+ * scheduled in the future, set the key refresh timer.
+ */
+ if (!DNS_ZONEKEY_OPTION(zone, DNS_ZONEKEY_MAINTAIN))
+ break;
+
+ then = now;
+ result = next_keyevent(key->key, &then);
+ if (result != ISC_R_SUCCESS)
+ continue;
+
+ DNS_ZONE_TIME_ADD(&timenow, then - now, &timethen);
+ LOCK_ZONE(zone);
+ if (isc_time_isepoch(&zone->refreshkeytime) ||
+ isc_time_compare(&timethen, &zone->refreshkeytime) < 0) {
+ zone->refreshkeytime = timethen;
+ zone_settimer(zone, &timenow);
+ }
+ UNLOCK_ZONE(zone);
+ }
+
+ /*
+ * If no key event is scheduled, we should still check the key
+ * repository for updates every so often. (Currently this is
+ * hard-coded to 12 hours, but it could be configurable.)
+ */
+ if (isc_time_isepoch(&zone->refreshkeytime))
+ DNS_ZONE_TIME_ADD(&timenow, (3600 * 12), &zone->refreshkeytime);
+
+ isc_time_formattimestamp(&zone->refreshkeytime, timebuf, 80);
+ dns_zone_log(zone, ISC_LOG_INFO, "next key event: %s", timebuf);
+
+ failure:
+ dns_diff_clear(&diff);
+ dns_diff_clear(&sig_diff);
+
+ clear_keylist(&dnskeys, mctx);
+ clear_keylist(&keys, mctx);
+ clear_keylist(&rmkeys, mctx);
+
+ if (ver != NULL)
+ dns_db_closeversion(db, &ver, ISC_FALSE);
+ if (dns_rdataset_isassociated(&keyset))
+ dns_rdataset_disassociate(&keyset);
+ if (dns_rdataset_isassociated(&keysigs))
+ dns_rdataset_disassociate(&keysigs);
+ if (dns_rdataset_isassociated(&soasigs))
+ dns_rdataset_disassociate(&soasigs);
+ if (node != NULL)
+ dns_db_detachnode(db, &node);
+ if (db != NULL)
+ dns_db_detach(&db);
+ return;
+
+ trylater:
+ isc_interval_set(&ival, HOUR, 0);
+ isc_time_nowplusinterval(&zone->refreshkeytime, &ival);
+ goto failure;
+}
+
+void
+dns_zone_rekey(dns_zone_t *zone, isc_boolean_t fullsign) {
+ isc_time_t now;
+
+ if (zone->type == dns_zone_master && zone->task != NULL) {
+ LOCK_ZONE(zone);
+
+ if (fullsign)
+ zone->keyopts |= DNS_ZONEKEY_FULLSIGN;
+
+ TIME_NOW(&now);
+ zone->refreshkeytime = now;
+ zone_settimer(zone, &now);
+
+ UNLOCK_ZONE(zone);
+ }
+}
+
+isc_result_t
+dns_zone_nscheck(dns_zone_t *zone, dns_db_t *db, dns_dbversion_t *version,
+ unsigned int *errors)
+{
+ isc_result_t result;
+ dns_dbnode_t *node = NULL;
+
+ REQUIRE(DNS_ZONE_VALID(zone));
+ REQUIRE(errors != NULL);
+
+ result = dns_db_getoriginnode(db, &node);
+ if (result != ISC_R_SUCCESS)
+ return (result);
+ result = zone_count_ns_rr(zone, db, node, version, NULL, errors,
+ ISC_FALSE);
+ dns_db_detachnode(db, &node);
+ return (result);
+}
+
+void
+dns_zone_setadded(dns_zone_t *zone, isc_boolean_t added) {
+ REQUIRE(DNS_ZONE_VALID(zone));
+ LOCK_ZONE(zone);
+ zone->added = added;
+ UNLOCK_ZONE(zone);
+}
+
+isc_boolean_t
+dns_zone_getadded(dns_zone_t *zone) {
+ REQUIRE(DNS_ZONE_VALID(zone));
+ return (zone->added);
+}
+
+isc_result_t
+dns_zone_dlzpostload(dns_zone_t *zone, dns_db_t *db)
+{
+ isc_time_t loadtime;
+ isc_result_t result;
+ TIME_NOW(&loadtime);
+
+ LOCK_ZONE(zone);
+ result = zone_postload(zone, db, loadtime, ISC_R_SUCCESS);
+ UNLOCK_ZONE(zone);
+ return result;
+}
diff --git a/contrib/bind9/lib/export/Makefile.in b/contrib/bind9/lib/export/Makefile.in
new file mode 100644
index 0000000..5a9e633
--- /dev/null
+++ b/contrib/bind9/lib/export/Makefile.in
@@ -0,0 +1,27 @@
+# Copyright (C) 2009 Internet Systems Consortium, Inc. ("ISC")
+#
+# Permission to use, copy, modify, and/or 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 ISC DISCLAIMS ALL WARRANTIES WITH
+# REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+# AND FITNESS. IN NO EVENT SHALL ISC 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.
+
+# $Id: Makefile.in,v 1.3 2009-09-02 23:48:02 tbox Exp $
+
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+
+# Note: the order of SUBDIRS is important.
+# Attempt to disable parallel processing.
+.NOTPARALLEL:
+.NO_PARALLEL:
+SUBDIRS = isc dns isccfg irs samples
+TARGETS =
+
+@BIND9_MAKE_RULES@
diff --git a/contrib/bind9/lib/export/dns/Makefile.in b/contrib/bind9/lib/export/dns/Makefile.in
new file mode 100644
index 0000000..15b0d3f
--- /dev/null
+++ b/contrib/bind9/lib/export/dns/Makefile.in
@@ -0,0 +1,179 @@
+# Copyright (C) 2009, 2010 Internet Systems Consortium, Inc. ("ISC")
+#
+# Permission to use, copy, modify, and/or 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 ISC DISCLAIMS ALL WARRANTIES WITH
+# REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+# AND FITNESS. IN NO EVENT SHALL ISC 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.
+
+# $Id: Makefile.in,v 1.8 2010-12-23 04:07:59 marka Exp $
+
+top_srcdir = @top_srcdir@
+srcdir = @top_srcdir@/lib/dns
+export_srcdir = @top_srcdir@/lib/export
+
+# Attempt to disable parallel processing.
+.NOTPARALLEL:
+.NO_PARALLEL:
+
+@BIND9_VERSION@
+
+@LIBDNS_API@
+
+@BIND9_MAKE_INCLUDES@
+
+CINCLUDES = -I. -Iinclude ${DNS_INCLUDES} -I${export_srcdir}/isc/include \
+ ${ISC_INCLUDES} @DST_OPENSSL_INC@ @DST_GSSAPI_INC@
+
+CDEFINES = -DUSE_MD5 @USE_OPENSSL@ @USE_GSSAPI@
+
+CWARNINGS =
+
+ISCLIBS = ../isc/libisc.@A@
+
+ISCDEPLIBS = ../isc/libisc.@A@
+
+LIBS = @LIBS@
+
+# Alphabetically
+
+OPENSSLLINKOBJS = openssl_link.@O@ openssldh_link.@O@ openssldsa_link.@O@ \
+ opensslgost_link.@O@ opensslrsa_link.@O@
+
+DSTOBJS = @OPENSSLLINKOBJS@ \
+ dst_api.@O@ dst_lib.@O@ dst_parse.@O@ dst_result.@O@ \
+ gssapi_link.@O@ gssapictx.@O@ hmac_link.@O@ key.@O@
+
+DNSOBJS = acl.@O@ adb.@O@ byaddr.@O@ \
+ cache.@O@ callbacks.@O@ client.@O@ compress.@O@ \
+ db.@O@ dbiterator.@O@ diff.@O@ dispatch.@O@ dlz.@O@ dnssec.@O@ \
+ ds.@O@ \
+ forward.@O@ iptable.@O@ \
+ keytable.@O@ \
+ lib.@O@ log.@O@ \
+ master.@O@ masterdump.@O@ message.@O@ \
+ name.@O@ ncache.@O@ nsec.@O@ nsec3.@O@ \
+ peer.@O@ portlist.@O@ \
+ rbt.@O@ rbtdb.@O@ rcode.@O@ rdata.@O@ \
+ rdatalist.@O@ rdataset.@O@ rdatasetiter.@O@ rdataslab.@O@ \
+ request.@O@ resolver.@O@ result.@O@ soa.@O@ stats.@O@ \
+ tcpmsg.@O@ time.@O@ tsec.@O@ tsig.@O@ ttl.@O@ \
+ validator.@O@ version.@O@ view.@O@
+PORTDNSOBJS = ecdb.@O@
+
+OBJS= ${DNSOBJS} ${OTHEROBJS} ${DSTOBJS} ${PORTDNSOBJS}
+
+# Alphabetically
+
+OPENSSLLINKSRCS = openssl_link.c openssldh_link.c openssldsa_link.c \
+ opensslgost_link.c opensslrsa_link.c
+
+DSTSRCS = @OPENSSLLINKSRCS@ \
+ dst_api.c dst_lib.c dst_parse.c \
+ dst_result.c gssapi_link.c gssapictx.c \
+ hmac_link.c key.c
+
+DNSSRCS = acl.c adb.c byaddr.c \
+ cache.c callbacks.c client.c compress.c \
+ db.c dbiterator.c diff.c dispatch.c dlz.c dnssec.c ds.c \
+ forward.c iptable.c \
+ keytable.c \
+ lib.c log.c \
+ master.c masterdump.c message.c \
+ name.c ncache.c nsec.c nsec3.c \
+ peer.c portlist.c \
+ rbt.c rbtdb.c rcode.c rdata.c \
+ rdatalist.c rdataset.c rdatasetiter.c rdataslab.c \
+ request.c res.c resolver.c result.c soa.c stats.c \
+ tcpmsg.c time.c tsec.c tsig.c ttl.c \
+ validator.c version.c view.c
+PORTDNSSRCS = ecdb.c
+
+SRCS = ${DSTSRCS} ${DNSSRCS} ${PORTDNSSRCS}
+
+SUBDIRS = include
+TARGETS = include/dns/enumtype.h include/dns/enumclass.h \
+ include/dns/rdatastruct.h timestamp
+
+DEPENDEXTRA = ./gen -F include/dns/rdatastruct.h \
+ -s ${srcdir} -d >> Makefile ;
+
+@BIND9_MAKE_RULES@
+
+version.@O@: ${srcdir}/version.c
+ ${LIBTOOL_MODE_COMPILE} ${CC} ${ALL_CFLAGS} \
+ -DVERSION=\"${VERSION}\" \
+ -DLIBINTERFACE=${LIBINTERFACE} \
+ -DLIBREVISION=${LIBREVISION} \
+ -DLIBAGE=${LIBAGE} \
+ -c ${srcdir}/version.c
+
+libdns.@SA@: ${OBJS}
+ ${AR} ${ARFLAGS} $@ ${OBJS}
+ ${RANLIB} $@
+
+libdns.la: ${OBJS}
+ ${LIBTOOL_MODE_LINK} \
+ ${CC} ${ALL_CFLAGS} ${LDFLAGS} -o libdns.la \
+ -rpath ${export_libdir} \
+ -version-info ${LIBINTERFACE}:${LIBREVISION}:${LIBAGE} \
+ ${OBJS} ${ISCLIBS} @DNS_CRYPTO_LIBS@ ${LIBS}
+
+timestamp: libdns.@A@
+ touch timestamp
+
+installdirs:
+ $(SHELL) ${top_srcdir}/mkinstalldirs ${DESTDIR}${export_libdir}
+
+install:: timestamp installdirs
+ ${LIBTOOL_MODE_INSTALL} ${INSTALL_DATA} libdns.@A@ \
+ ${DESTDIR}${export_libdir}
+
+clean distclean::
+ rm -f libdns.@A@ timestamp
+ rm -f gen code.h include/dns/enumtype.h include/dns/enumclass.h
+ rm -f include/dns/rdatastruct.h
+
+newrr::
+ rm -f code.h include/dns/enumtype.h include/dns/enumclass.h
+ rm -f include/dns/rdatastruct.h
+
+include: include/dns/enumtype.h include/dns/enumclass.h \
+ include/dns/rdatastruct.h
+
+rdata.@O@: code.h
+
+include/dns/enumtype.h: gen
+ ./gen -s ${srcdir} -t > $@
+
+include/dns/enumclass.h: gen
+ ./gen -s ${srcdir} -c > $@
+
+include/dns/rdatastruct.h: gen \
+ ${srcdir}/rdata/rdatastructpre.h \
+ ${srcdir}/rdata/rdatastructsuf.h
+ ./gen -s ${srcdir} -i \
+ -P ${srcdir}/rdata/rdatastructpre.h \
+ -S ${srcdir}/rdata/rdatastructsuf.h > $@
+
+code.h: gen
+ ./gen -s ${srcdir} > code.h
+
+gen: ${srcdir}/gen.c
+ ${CC} ${ALL_CFLAGS} ${LDFLAGS} -o $@ ${srcdir}/gen.c ${LIBS}
+
+#We don't need rbtdb64 for this library
+#rbtdb64.@O@: rbtdb.c
+
+depend: include/dns/enumtype.h include/dns/enumclass.h \
+ include/dns/rdatastruct.h code.h
+subdirs: include/dns/enumtype.h include/dns/enumclass.h \
+ include/dns/rdatastruct.h code.h
+${OBJS}: include/dns/enumtype.h include/dns/enumclass.h \
+ include/dns/rdatastruct.h
diff --git a/contrib/bind9/lib/export/dns/include/Makefile.in b/contrib/bind9/lib/export/dns/include/Makefile.in
new file mode 100644
index 0000000..ecd9c8a
--- /dev/null
+++ b/contrib/bind9/lib/export/dns/include/Makefile.in
@@ -0,0 +1,23 @@
+# Copyright (C) 2009 Internet Systems Consortium, Inc. ("ISC")
+#
+# Permission to use, copy, modify, and/or 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 ISC DISCLAIMS ALL WARRANTIES WITH
+# REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+# AND FITNESS. IN NO EVENT SHALL ISC 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.
+
+# $Id: Makefile.in,v 1.3 2009-09-02 23:48:02 tbox Exp $
+
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+
+SUBDIRS = dns dst
+TARGETS =
+
+@BIND9_MAKE_RULES@
diff --git a/contrib/bind9/lib/export/dns/include/dns/Makefile.in b/contrib/bind9/lib/export/dns/include/dns/Makefile.in
new file mode 100644
index 0000000..ccaae41
--- /dev/null
+++ b/contrib/bind9/lib/export/dns/include/dns/Makefile.in
@@ -0,0 +1,56 @@
+# Copyright (C) 2009 Internet Systems Consortium, Inc. ("ISC")
+#
+# Permission to use, copy, modify, and/or 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 ISC DISCLAIMS ALL WARRANTIES WITH
+# REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+# AND FITNESS. IN NO EVENT SHALL ISC 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.
+
+# $Id: Makefile.in,v 1.4 2009-09-18 07:18:04 jinmei Exp $
+
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+
+@BIND9_VERSION@
+
+HEADERS = acl.h adb.h byaddr.h \
+ cache.h callbacks.h cert.h client.h compress.h \
+ db.h dbiterator.h diff.h dispatch.h dlz.h dnssec.h \
+ ds.h events.h fixedname.h ecdb.h \
+ forward.h iptable.h \
+ keytable.h keyvalues.h \
+ lib.h log.h \
+ master.h masterdump.h message.h \
+ name.h ncache.h nsec.h nsec3.h \
+ peer.h portlist.h \
+ rbt.h rcode.h rdata.h rdataclass.h \
+ rdatalist.h rdataset.h rdatasetiter.h rdataslab.h rdatatype.h \
+ request.h resolver.h result.h \
+ secalg.h secproto.h soa.h stats.h \
+ tcpmsg.h time.h tsec.h tsig.h ttl.h types.h \
+ validator.h version.h view.h
+
+GENHEADERS = enumclass.h enumtype.h rdatastruct.h
+
+SUBDIRS =
+TARGETS =
+
+@BIND9_MAKE_RULES@
+
+installdirs:
+ $(SHELL) ${top_srcdir}/mkinstalldirs ${DESTDIR}${export_includedir}/dns
+
+install:: installdirs
+ for i in ${HEADERS}; do \
+ ${INSTALL_DATA} ${top_srcdir}/lib/dns/include/dns/$$i \
+ ${DESTDIR}${export_includedir}/dns ; \
+ done
+ for i in ${GENHEADERS}; do \
+ ${INSTALL_DATA} $$i ${DESTDIR}${export_includedir}/dns ; \
+ done
diff --git a/contrib/bind9/lib/export/dns/include/dst/Makefile.in b/contrib/bind9/lib/export/dns/include/dst/Makefile.in
new file mode 100644
index 0000000..cebc726
--- /dev/null
+++ b/contrib/bind9/lib/export/dns/include/dst/Makefile.in
@@ -0,0 +1,36 @@
+# Copyright (C) 2009 Internet Systems Consortium, Inc. ("ISC")
+#
+# Permission to use, copy, modify, and/or 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 ISC DISCLAIMS ALL WARRANTIES WITH
+# REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+# AND FITNESS. IN NO EVENT SHALL ISC 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.
+
+# $Id: Makefile.in,v 1.3 2009-09-02 23:48:02 tbox Exp $
+
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+
+@BIND9_VERSION@
+
+HEADERS = dst.h gssapi.h lib.h result.h
+
+SUBDIRS =
+TARGETS =
+
+@BIND9_MAKE_RULES@
+
+installdirs:
+ $(SHELL) ${top_srcdir}/mkinstalldirs ${DESTDIR}${export_includedir}/dst
+
+install:: installdirs
+ for i in ${HEADERS}; do \
+ ${INSTALL_DATA} ${top_srcdir}/lib/dns/include/dst/$$i \
+ ${DESTDIR}${export_includedir}/dst ; \
+ done
diff --git a/contrib/bind9/lib/export/irs/Makefile.in b/contrib/bind9/lib/export/irs/Makefile.in
new file mode 100644
index 0000000..aad9400
--- /dev/null
+++ b/contrib/bind9/lib/export/irs/Makefile.in
@@ -0,0 +1,86 @@
+# Copyright (C) 2009 Internet Systems Consortium, Inc. ("ISC")
+#
+# Permission to use, copy, modify, and/or 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 ISC DISCLAIMS ALL WARRANTIES WITH
+# REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+# AND FITNESS. IN NO EVENT SHALL ISC 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.
+
+# $Id: Makefile.in,v 1.4 2009-12-05 23:31:40 each Exp $
+
+top_srcdir = @top_srcdir@
+srcdir = @top_srcdir@/lib/irs
+export_srcdir = @top_srcdir@/lib/export
+
+@BIND9_VERSION@
+
+@LIBIRS_API@
+
+@BIND9_MAKE_INCLUDES@
+
+CINCLUDES = -I. -I./include -I${srcdir}/include \
+ ${ISCCFG_INCLUDES} -I../dns/include ${DNS_INCLUDES} \
+ -I${export_srcdir}/isc/include ${ISC_INCLUDES}
+CDEFINES =
+CWARNINGS =
+
+# Alphabetically
+OBJS = context.@O@ \
+ dnsconf.@O@ \
+ gai_strerror.@O@ getaddrinfo.@O@ getnameinfo.@O@ \
+ resconf.@O@
+
+# Alphabetically
+SRCS = context.c \
+ dnsconf.c \
+ gai_sterror.c getaddrinfo.c getnameinfo.c \
+ resconf.c
+
+ISCLIBS = ../isc/libisc.@A@
+DNSLIBS = ../dns/libdns.@A@
+ISCCFGLIBS = ../isccfg/libisccfg.@A@
+
+LIBS = @LIBS@
+
+SUBDIRS = include
+TARGETS = timestamp
+
+@BIND9_MAKE_RULES@
+
+version.@O@: ${srcdir}/version.c
+ ${LIBTOOL_MODE_COMPILE} ${CC} ${ALL_CFLAGS} \
+ -DVERSION=\"${VERSION}\" \
+ -DLIBINTERFACE=${LIBINTERFACE} \
+ -DLIBREVISION=${LIBREVISION} \
+ -DLIBAGE=${LIBAGE} \
+ -c ${srcdir}/version.c
+
+libirs.@SA@: ${OBJS} version.@O@
+ ${AR} ${ARFLAGS} $@ ${OBJS} version.@O@
+ ${RANLIB} $@
+
+libirs.la: ${OBJS} version.@O@
+ ${LIBTOOL_MODE_LINK} \
+ ${CC} ${ALL_CFLAGS} ${LDFLAGS} -o libirs.la \
+ -rpath ${export_libdir} \
+ -version-info ${LIBINTERFACE}:${LIBREVISION}:${LIBAGE} \
+ ${OBJS} version.@O@ ${LIBS} ${ISCCFGLIBS} ${DNSLIBS} ${ISCLIBS}
+
+timestamp: libirs.@A@
+ touch timestamp
+
+installdirs:
+ $(SHELL) ${top_srcdir}/mkinstalldirs ${DESTDIR}${export_libdir}
+
+install:: timestamp installdirs
+ ${LIBTOOL_MODE_INSTALL} ${INSTALL_DATA} libirs.@A@ \
+ ${DESTDIR}${export_libdir}
+
+clean distclean::
+ rm -f libirs.@A@ libirs.la timestamp
diff --git a/contrib/bind9/lib/export/irs/include/Makefile.in b/contrib/bind9/lib/export/irs/include/Makefile.in
new file mode 100644
index 0000000..e6d4eae
--- /dev/null
+++ b/contrib/bind9/lib/export/irs/include/Makefile.in
@@ -0,0 +1,24 @@
+# Copyright (C) 2009 Internet Systems Consortium, Inc. ("ISC")
+#
+# Permission to use, copy, modify, and/or 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 ISC DISCLAIMS ALL WARRANTIES WITH
+# REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+# AND FITNESS. IN NO EVENT SHALL ISC 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.
+
+# $Id: Makefile.in,v 1.2 2009-09-01 00:22:27 jinmei Exp $
+
+srcdir = @srdir@
+top_srcdir = @top_srcdir@
+
+
+SUBDIRS = irs
+TARGETS =
+
+@BIND9_MAKE_RULES@
diff --git a/contrib/bind9/lib/export/irs/include/irs/Makefile.in b/contrib/bind9/lib/export/irs/include/irs/Makefile.in
new file mode 100644
index 0000000..93f4200
--- /dev/null
+++ b/contrib/bind9/lib/export/irs/include/irs/Makefile.in
@@ -0,0 +1,46 @@
+# Copyright (C) 2009 Internet Systems Consortium, Inc. ("ISC")
+#
+# Permission to use, copy, modify, and/or 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 ISC DISCLAIMS ALL WARRANTIES WITH
+# REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+# AND FITNESS. IN NO EVENT SHALL ISC 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.
+
+# $Id: Makefile.in,v 1.3 2009-09-02 23:48:02 tbox Exp $
+
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+
+#
+# Only list headers that are to be installed and are not
+# machine generated. The latter are handled specially in the
+# install target below.
+#
+HEADERS = context.h dnsconf.h resconf.h types.h version.h
+
+SUBDIRS =
+TARGETS =
+
+@BIND9_MAKE_RULES@
+
+installdirs:
+ $(SHELL) ${top_srcdir}/mkinstalldirs ${DESTDIR}${export_includedir}/irs
+
+install:: installdirs
+ for i in ${HEADERS}; do \
+ ${INSTALL_DATA} ${top_srcdir}/lib/irs/include/irs/$$i \
+ ${DESTDIR}${export_includedir}/irs ; \
+ done
+ ${INSTALL_DATA} ${top_srcdir}/lib/irs/include/irs/netdb.h \
+ ${DESTDIR}${export_includedir}/irs
+ ${INSTALL_DATA} ${top_srcdir}/lib/irs/include/irs/platform.h \
+ ${DESTDIR}${export_includedir}/irs
+
+distclean::
+ rm -f netdb.h platform.h
diff --git a/contrib/bind9/lib/export/isc/Makefile.in b/contrib/bind9/lib/export/isc/Makefile.in
new file mode 100644
index 0000000..fa1c367
--- /dev/null
+++ b/contrib/bind9/lib/export/isc/Makefile.in
@@ -0,0 +1,139 @@
+# Copyright (C) 2009, 2010 Internet Systems Consortium, Inc. ("ISC")
+#
+# Permission to use, copy, modify, and/or 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 ISC DISCLAIMS ALL WARRANTIES WITH
+# REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+# AND FITNESS. IN NO EVENT SHALL ISC 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.
+
+# $Id: Makefile.in,v 1.8 2010-06-09 23:50:58 tbox Exp $
+
+top_srcdir = @top_srcdir@
+srcdir = @top_srcdir@/lib/isc
+export_srcdir = @top_srcdir@/lib/export
+
+@BIND9_VERSION@
+
+@LIBISC_API@
+
+CINCLUDES = -I${srcdir}/unix/include \
+ -I${srcdir}/@ISC_THREAD_DIR@/include \
+ -I${srcdir}/@ISC_ARCH_DIR@/include \
+ -I${export_srcdir}/isc/include -I${srcdir}/include \
+ @ISC_OPENSSL_INC@
+CDEFINES = @USE_OPENSSL@ -DUSE_APPIMPREGISTER -DUSE_MEMIMPREGISTER \
+ -DUSE_SOCKETIMPREGISTER -DUSE_TASKIMPREGISTER \
+ -DUSE_TIMERIMPREGISTER
+CWARNINGS =
+
+# Alphabetically
+# {file,dir}.c is necessary for isclog
+# symtab.c is necessary for isccfg
+APIOBJS = app_api.@O@ mem_api.@O@ socket_api.@O@ \
+ task_api.@O@ timer_api.@O@
+
+ISCDRIVEROBJS = mem.@O@ unix/socket.@O@ task.@O@ timer.@O@ lib.@O@ \
+ heap.@O@ #timer module depends on this
+
+UNIXOBJS = @ISC_ISCIPV6_O@ \
+ unix/app.@O@ \
+ unix/dir.@O@ \
+ unix/errno2result.@O@ \
+ unix/file.@O@ \
+ unix/fsaccess.@O@ \
+ unix/stdio.@O@ \
+ unix/stdtime.@O@ unix/strerror.@O@ unix/time.@O@
+
+NLSOBJS = nls/msgcat.@O@
+
+THREADOPTOBJS = @ISC_THREAD_DIR@/condition.@O@ @ISC_THREAD_DIR@/mutex.@O@
+
+THREADOBJS = @THREADOPTOBJS@ @ISC_THREAD_DIR@/thread.@O@
+
+WIN32OBJS = win32/condition.@O@ win32/dir.@O@ win32/file.@O@ \
+ win32/fsaccess.@O@ win32/once.@O@ win32/stdtime.@O@ \
+ win32/thread.@O@ win32/time.@O@
+
+# Alphabetically
+OBJS = @ISC_EXTRA_OBJS@ \
+ assertions.@O@ backtrace.@O@ backtrace-emptytbl.@O@ base32.@O@ \
+ base64.@O@ buffer.@O@ bufferlist.@O@ \
+ error.@O@ event.@O@ \
+ hash.@O@ hex.@O@ hmacmd5.@O@ hmacsha.@O@ \
+ inet_aton.@O@ iterated_hash.@O@ lex.@O@ lfsr.@O@ log.@O@ \
+ md5.@O@ mutexblock.@O@ \
+ netaddr.@O@ netscope.@O@ \
+ ondestroy.@O@ \
+ parseint.@O@ portset.@O@ radix.@O@ \
+ random.@O@ refcount.@O@ region.@O@ result.@O@ rwlock.@O@ \
+ serial.@O@ sha1.@O@ sha2.@O@ sockaddr.@O@ stats.@O@ string.@O@ \
+ symtab.@O@ \
+ version.@O@ \
+ ${APIOBJS} ${ISCDRIVEROBJS} \
+ ${UNIXOBJS} ${NLSOBJS} ${THREADOBJS}
+
+# Alphabetically
+APISRCS = app_api.c mem_api.c socket_api.c \
+ task_api.c timer_api.c
+
+ISCDRIVERSRCS = mem.c task.c lib.c timer.c heap.c
+
+SRCS = @ISC_EXTRA_SRCS@ \
+ assertions.c backtrace.c backtrace-emptytbl.c base32.c \
+ base64.c buffer.c bufferlist.c \
+ error.c event.c \
+ hash.c hex.c hmacmd5.c hmacsha.c \
+ inet_aton.c iterated_hash.c lex.c log.c lfsr.c \
+ md5.c mutexblock.c \
+ netaddr.c netscope.c \
+ ondestroy.c \
+ parseint.c portset.c radix.c \
+ random.c refcount.c region.c result.c rwlock.c \
+ serial.c sha1.c sha2.c sockaddr.c stats.c string.c symtab.c \
+ version.c \
+ ${APISRCS} ${ISCDRIVERSRCS}
+
+LIBS = @LIBS@
+
+SUBDIRS = include unix nls @ISC_THREAD_DIR@
+TARGETS = timestamp
+
+@BIND9_MAKE_RULES@
+
+version.@O@: ${srcdir}/version.c
+ ${LIBTOOL_MODE_COMPILE} ${CC} ${ALL_CFLAGS} \
+ -DVERSION=\"${VERSION}\" \
+ -DLIBINTERFACE=${LIBINTERFACE} \
+ -DLIBREVISION=${LIBREVISION} \
+ -DLIBAGE=${LIBAGE} \
+ -c ${srcdir}/version.c
+
+libisc.@SA@: ${OBJS}
+ ${AR} ${ARFLAGS} $@ ${OBJS}
+ ${RANLIB} $@
+
+libisc.la: ${OBJS}
+ ${LIBTOOL_MODE_LINK} \
+ ${CC} ${ALL_CFLAGS} ${LDFLAGS} -o libisc.la \
+ -rpath ${export_libdir} \
+ -version-info ${LIBINTERFACE}:${LIBREVISION}:${LIBAGE} \
+ ${OBJS} ${LIBS}
+
+timestamp: libisc.@A@
+ touch timestamp
+
+installdirs:
+ $(SHELL) ${top_srcdir}/mkinstalldirs ${DESTDIR}${export_libdir}
+
+install:: timestamp installdirs
+ ${LIBTOOL_MODE_INSTALL} ${INSTALL_DATA} libisc.@A@ \
+ ${DESTDIR}${export_libdir}
+
+clean distclean::
+ rm -f libisc.@A@ libisc.la timestamp
diff --git a/contrib/bind9/lib/export/isc/include/Makefile.in b/contrib/bind9/lib/export/isc/include/Makefile.in
new file mode 100644
index 0000000..f89628b
--- /dev/null
+++ b/contrib/bind9/lib/export/isc/include/Makefile.in
@@ -0,0 +1,24 @@
+# Copyright (C) 2009 Internet Systems Consortium, Inc. ("ISC")
+#
+# Permission to use, copy, modify, and/or 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 ISC DISCLAIMS ALL WARRANTIES WITH
+# REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+# AND FITNESS. IN NO EVENT SHALL ISC 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.
+
+# $Id: Makefile.in,v 1.2 2009-09-01 00:22:27 jinmei Exp $
+
+srcdir = @srdir@
+top_srcdir = @top_srcdir@
+
+
+SUBDIRS = isc
+TARGETS =
+
+@BIND9_MAKE_RULES@
diff --git a/contrib/bind9/lib/export/isc/include/isc/Makefile.in b/contrib/bind9/lib/export/isc/include/isc/Makefile.in
new file mode 100644
index 0000000..0336ba2
--- /dev/null
+++ b/contrib/bind9/lib/export/isc/include/isc/Makefile.in
@@ -0,0 +1,66 @@
+# Copyright (C) 2009 Internet Systems Consortium, Inc. ("ISC")
+#
+# Permission to use, copy, modify, and/or 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 ISC DISCLAIMS ALL WARRANTIES WITH
+# REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+# AND FITNESS. IN NO EVENT SHALL ISC 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.
+
+# $Id: Makefile.in,v 1.3 2009-12-05 23:31:41 each Exp $
+
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+export_srcdir = @top_srcdir@/lib/export
+
+@BIND9_VERSION@
+
+#
+# Only list headers that are to be installed and are not
+# machine generated. The latter are handled specially in the
+# install target below.
+#
+HEADERS = app.h assertions.h base64.h bitstring.h boolean.h \
+ buffer.h bufferlist.h commandline.h entropy.h error.h event.h \
+ eventclass.h file.h formatcheck.h fsaccess.h \
+ hash.h heap.h hex.h hmacmd5.h \
+ httpd.h \
+ interfaceiter.h @ISC_IPV6_H@ iterated_hash.h lang.h lex.h \
+ lfsr.h lib.h list.h log.h \
+ magic.h md5.h mem.h msgcat.h msgs.h \
+ mutexblock.h namespace.h netaddr.h ondestroy.h os.h parseint.h \
+ print.h quota.h radix.h random.h ratelimiter.h \
+ refcount.h region.h resource.h \
+ result.h resultclass.h rwlock.h serial.h sha1.h sha2.h \
+ sockaddr.h socket.h stdio.h stdlib.h string.h \
+ symtab.h \
+ task.h taskpool.h timer.h types.h util.h version.h \
+ xml.h
+
+SUBDIRS =
+TARGETS =
+
+@BIND9_MAKE_RULES@
+
+installdirs:
+ $(SHELL) ${top_srcdir}/mkinstalldirs ${DESTDIR}${export_includedir}/isc
+
+install:: installdirs
+ for i in ${HEADERS}; do \
+ ${INSTALL_DATA} ${top_srcdir}/lib/isc/include/isc/$$i \
+ ${DESTDIR}${export_includedir}/isc ; \
+ done
+ ${INSTALL_DATA} ${top_srcdir}/lib/isc/include/isc/platform.h \
+ ${DESTDIR}${export_includedir}/isc
+ ${INSTALL_DATA} ${top_srcdir}/lib/isc/@ISC_ARCH_DIR@/include/isc/atomic.h \
+ ${DESTDIR}${export_includedir}/isc
+ ${INSTALL_DATA} ${export_srcdir}/isc/include/isc/bind9.h \
+ ${DESTDIR}${export_includedir}/isc
+
+distclean::
+ rm -f platform.h
diff --git a/contrib/bind9/lib/export/isc/include/isc/bind9.h b/contrib/bind9/lib/export/isc/include/isc/bind9.h
new file mode 100644
index 0000000..380ca85
--- /dev/null
+++ b/contrib/bind9/lib/export/isc/include/isc/bind9.h
@@ -0,0 +1,30 @@
+/*
+ * Copyright (C) 2009 Internet Systems Consortium, Inc. ("ISC")
+ *
+ * Permission to use, copy, modify, and/or 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 ISC DISCLAIMS ALL WARRANTIES WITH
+ * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+ * AND FITNESS. IN NO EVENT SHALL ISC 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.
+ */
+
+/* $Id: bind9.h,v 1.2 2009-12-05 23:31:41 each Exp $ */
+
+#ifndef ISC_BIND9_H
+#define ISC_BIND9_H 1
+
+/*
+ * This determines whether we are building BIND9 or using the exported
+ * libisc/libdns libraries. The version of this file included in the
+ * standard BIND9 build defines BIND9; the version included with the
+ * exportable libraries does not.
+ */
+#undef BIND9
+
+#endif /* ISC_BIND9_H */
diff --git a/contrib/bind9/lib/export/isc/nls/Makefile.in b/contrib/bind9/lib/export/isc/nls/Makefile.in
new file mode 100644
index 0000000..da2513f
--- /dev/null
+++ b/contrib/bind9/lib/export/isc/nls/Makefile.in
@@ -0,0 +1,35 @@
+# Copyright (C) 2009 Internet Systems Consortium, Inc. ("ISC")
+#
+# Permission to use, copy, modify, and/or 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 ISC DISCLAIMS ALL WARRANTIES WITH
+# REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+# AND FITNESS. IN NO EVENT SHALL ISC 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.
+
+# $Id: Makefile.in,v 1.3 2009-09-02 23:48:02 tbox Exp $
+
+top_srcdir = @top_srcdir@
+srcdir = @top_srcdir@/lib/isc/nls
+
+@BIND9_MAKE_INCLUDES@
+
+CINCLUDES = -I${srcdir}/unix/include \
+ ${ISC_INCLUDES}
+
+CDEFINES =
+CWARNINGS =
+
+OBJS = msgcat.@O@
+
+SRCS = msgcat.c
+
+SUBDIRS =
+TARGETS = ${OBJS}
+
+@BIND9_MAKE_RULES@
diff --git a/contrib/bind9/lib/export/isc/nothreads/Makefile.in b/contrib/bind9/lib/export/isc/nothreads/Makefile.in
new file mode 100644
index 0000000..3bffb4e
--- /dev/null
+++ b/contrib/bind9/lib/export/isc/nothreads/Makefile.in
@@ -0,0 +1,40 @@
+# Copyright (C) 2009, 2010 Internet Systems Consortium, Inc. ("ISC")
+#
+# Permission to use, copy, modify, and/or 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 ISC DISCLAIMS ALL WARRANTIES WITH
+# REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+# AND FITNESS. IN NO EVENT SHALL ISC 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.
+
+# $Id: Makefile.in,v 1.5 2010-06-09 23:50:58 tbox Exp $
+
+top_srcdir = @top_srcdir@
+srcdir = @top_srcdir@/lib/isc/nothreads
+
+@BIND9_MAKE_INCLUDES@
+
+CINCLUDES = -I${srcdir}/include \
+ -I${srcdir}/../unix/include \
+ -I../include \
+ -I${srcdir}/../include \
+ -I${srcdir}/..
+
+CDEFINES =
+CWARNINGS =
+
+THREADOPTOBJS = condition.@O@ mutex.@O@
+OBJS = @THREADOPTOBJS@ thread.@O@
+
+THREADOPTSRCS = condition.c mutex.c
+SRCS = @THREADOPTSRCS@ thread.c
+
+SUBDIRS = include
+TARGETS = ${OBJS}
+
+@BIND9_MAKE_RULES@
diff --git a/contrib/bind9/lib/export/isc/nothreads/include/Makefile.in b/contrib/bind9/lib/export/isc/nothreads/include/Makefile.in
new file mode 100644
index 0000000..f89628b
--- /dev/null
+++ b/contrib/bind9/lib/export/isc/nothreads/include/Makefile.in
@@ -0,0 +1,24 @@
+# Copyright (C) 2009 Internet Systems Consortium, Inc. ("ISC")
+#
+# Permission to use, copy, modify, and/or 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 ISC DISCLAIMS ALL WARRANTIES WITH
+# REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+# AND FITNESS. IN NO EVENT SHALL ISC 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.
+
+# $Id: Makefile.in,v 1.2 2009-09-01 00:22:27 jinmei Exp $
+
+srcdir = @srdir@
+top_srcdir = @top_srcdir@
+
+
+SUBDIRS = isc
+TARGETS =
+
+@BIND9_MAKE_RULES@
diff --git a/contrib/bind9/lib/export/isc/nothreads/include/isc/Makefile.in b/contrib/bind9/lib/export/isc/nothreads/include/isc/Makefile.in
new file mode 100644
index 0000000..423f10a
--- /dev/null
+++ b/contrib/bind9/lib/export/isc/nothreads/include/isc/Makefile.in
@@ -0,0 +1,36 @@
+# Copyright (C) 2009 Internet Systems Consortium, Inc. ("ISC")
+#
+# Permission to use, copy, modify, and/or 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 ISC DISCLAIMS ALL WARRANTIES WITH
+# REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+# AND FITNESS. IN NO EVENT SHALL ISC 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.
+
+# $Id: Makefile.in,v 1.2 2009-09-01 00:22:27 jinmei Exp $
+
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+
+@BIND9_VERSION@
+
+HEADERS = condition.h mutex.h once.h thread.h
+
+SUBDIRS =
+TARGETS =
+
+@BIND9_MAKE_RULES@
+
+installdirs:
+ $(SHELL) ${top_srcdir}/mkinstalldirs ${DESTDIR}${export_includedir}/isc
+
+install:: installdirs
+ for i in ${HEADERS}; do \
+ ${INSTALL_DATA} $(top_srcdir)/lib/isc/nothreads/include/isc/$$i \
+ ${DESTDIR}${export_includedir}/isc ; \
+ done
diff --git a/contrib/bind9/lib/export/isc/pthreads/Makefile.in b/contrib/bind9/lib/export/isc/pthreads/Makefile.in
new file mode 100644
index 0000000..5fac018
--- /dev/null
+++ b/contrib/bind9/lib/export/isc/pthreads/Makefile.in
@@ -0,0 +1,38 @@
+# Copyright (C) 2009 Internet Systems Consortium, Inc. ("ISC")
+#
+# Permission to use, copy, modify, and/or 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 ISC DISCLAIMS ALL WARRANTIES WITH
+# REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+# AND FITNESS. IN NO EVENT SHALL ISC 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.
+
+# $Id: Makefile.in,v 1.3 2009-09-02 23:48:02 tbox Exp $
+
+top_srcdir = @top_srcdir@
+srcdir = @top_srcdir@/lib/isc/pthreads
+
+@BIND9_MAKE_INCLUDES@
+
+CINCLUDES = -I${srcdir}/include \
+ -I${srcdir}/../unix/include \
+ -I../include \
+ -I${srcdir}/../include \
+ -I${srcdir}/..
+
+CDEFINES =
+CWARNINGS =
+
+OBJS = condition.@O@ mutex.@O@ thread.@O@
+
+SRCS = condition.c mutex.c thread.c
+
+SUBDIRS = include
+TARGETS = ${OBJS}
+
+@BIND9_MAKE_RULES@
diff --git a/contrib/bind9/lib/export/isc/pthreads/include/Makefile.in b/contrib/bind9/lib/export/isc/pthreads/include/Makefile.in
new file mode 100644
index 0000000..f89628b
--- /dev/null
+++ b/contrib/bind9/lib/export/isc/pthreads/include/Makefile.in
@@ -0,0 +1,24 @@
+# Copyright (C) 2009 Internet Systems Consortium, Inc. ("ISC")
+#
+# Permission to use, copy, modify, and/or 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 ISC DISCLAIMS ALL WARRANTIES WITH
+# REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+# AND FITNESS. IN NO EVENT SHALL ISC 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.
+
+# $Id: Makefile.in,v 1.2 2009-09-01 00:22:27 jinmei Exp $
+
+srcdir = @srdir@
+top_srcdir = @top_srcdir@
+
+
+SUBDIRS = isc
+TARGETS =
+
+@BIND9_MAKE_RULES@
diff --git a/contrib/bind9/lib/export/isc/pthreads/include/isc/Makefile.in b/contrib/bind9/lib/export/isc/pthreads/include/isc/Makefile.in
new file mode 100644
index 0000000..807de94
--- /dev/null
+++ b/contrib/bind9/lib/export/isc/pthreads/include/isc/Makefile.in
@@ -0,0 +1,36 @@
+# Copyright (C) 2009 Internet Systems Consortium, Inc. ("ISC")
+#
+# Permission to use, copy, modify, and/or 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 ISC DISCLAIMS ALL WARRANTIES WITH
+# REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+# AND FITNESS. IN NO EVENT SHALL ISC 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.
+
+# $Id: Makefile.in,v 1.2 2009-09-01 00:22:27 jinmei Exp $
+
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+
+@BIND9_VERSION@
+
+HEADERS = condition.h mutex.h once.h thread.h
+
+SUBDIRS =
+TARGETS =
+
+@BIND9_MAKE_RULES@
+
+installdirs:
+ $(SHELL) ${top_srcdir}/mkinstalldirs ${DESTDIR}${export_includedir}/isc
+
+install:: installdirs
+ for i in ${HEADERS}; do \
+ ${INSTALL_DATA} $(top_srcdir)/lib/isc/pthreads/include/isc/$$i \
+ ${DESTDIR}${export_includedir}/isc ; \
+ done
diff --git a/contrib/bind9/lib/export/isc/unix/Makefile.in b/contrib/bind9/lib/export/isc/unix/Makefile.in
new file mode 100644
index 0000000..81746a4
--- /dev/null
+++ b/contrib/bind9/lib/export/isc/unix/Makefile.in
@@ -0,0 +1,57 @@
+# Copyright (C) 2009 Internet Systems Consortium, Inc. ("ISC")
+#
+# Permission to use, copy, modify, and/or 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 ISC DISCLAIMS ALL WARRANTIES WITH
+# REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+# AND FITNESS. IN NO EVENT SHALL ISC 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.
+
+# $Id: Makefile.in,v 1.3 2009-09-02 23:48:02 tbox Exp $
+
+top_srcdir = @top_srcdir@
+srcdir = @top_srcdir@/lib/isc/unix
+
+@BIND9_MAKE_INCLUDES@
+
+CINCLUDES = -I${srcdir}/include \
+ -I${srcdir}/../@ISC_THREAD_DIR@/include \
+ -I../include \
+ -I${srcdir}/../include \
+ -I${srcdir}/..
+
+CDEFINES = -DUSE_SOCKETIMPREGISTER -DUSE_APPIMPREGISTER
+
+CWARNINGS =
+
+# Alphabetically
+ISCDRIVEROBJS = app.@O@ socket.@O@
+
+OBJS = @ISC_IPV6_O@ \
+ dir.@O@ \
+ errno2result.@O@ \
+ file.@O@ fsaccess.@O@ \
+ stdio.@O@ stdtime.@O@ strerror.@O@ \
+ time.@O@ \
+ ${ISCDRIVEROBJS}
+
+# Alphabetically
+ISCDRIVERSRCS = app.c socket.c
+
+SRCS = @ISC_IPV6_C@ \
+ dir.c \
+ errno2result.c \
+ file.c fsaccess.c \
+ stdio.c stdtime.c strerror.c \
+ time.c \
+ ${ISCDRIVERSRCS}
+
+SUBDIRS = include
+TARGETS = ${OBJS}
+
+@BIND9_MAKE_RULES@
diff --git a/contrib/bind9/lib/export/isc/unix/include/Makefile.in b/contrib/bind9/lib/export/isc/unix/include/Makefile.in
new file mode 100644
index 0000000..f89628b
--- /dev/null
+++ b/contrib/bind9/lib/export/isc/unix/include/Makefile.in
@@ -0,0 +1,24 @@
+# Copyright (C) 2009 Internet Systems Consortium, Inc. ("ISC")
+#
+# Permission to use, copy, modify, and/or 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 ISC DISCLAIMS ALL WARRANTIES WITH
+# REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+# AND FITNESS. IN NO EVENT SHALL ISC 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.
+
+# $Id: Makefile.in,v 1.2 2009-09-01 00:22:27 jinmei Exp $
+
+srcdir = @srdir@
+top_srcdir = @top_srcdir@
+
+
+SUBDIRS = isc
+TARGETS =
+
+@BIND9_MAKE_RULES@
diff --git a/contrib/bind9/lib/export/isc/unix/include/isc/Makefile.in b/contrib/bind9/lib/export/isc/unix/include/isc/Makefile.in
new file mode 100644
index 0000000..21ce049
--- /dev/null
+++ b/contrib/bind9/lib/export/isc/unix/include/isc/Makefile.in
@@ -0,0 +1,37 @@
+# Copyright (C) 2009 Internet Systems Consortium, Inc. ("ISC")
+#
+# Permission to use, copy, modify, and/or 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 ISC DISCLAIMS ALL WARRANTIES WITH
+# REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+# AND FITNESS. IN NO EVENT SHALL ISC 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.
+
+# $Id: Makefile.in,v 1.2 2009-09-01 00:22:27 jinmei Exp $
+
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+
+@BIND9_VERSION@
+
+HEADERS = dir.h int.h net.h netdb.h offset.h stdtime.h \
+ syslog.h time.h
+
+SUBDIRS =
+TARGETS =
+
+@BIND9_MAKE_RULES@
+
+installdirs:
+ $(SHELL) ${top_srcdir}/mkinstalldirs ${DESTDIR}${export_includedir}/isc
+
+install:: installdirs
+ for i in ${HEADERS}; do \
+ ${INSTALL_DATA} $(top_srcdir)/lib/isc/unix/include/isc/$$i \
+ ${DESTDIR}${export_includedir}/isc ; \
+ done
diff --git a/contrib/bind9/lib/export/isccfg/Makefile.in b/contrib/bind9/lib/export/isccfg/Makefile.in
new file mode 100644
index 0000000..ed2b2cf
--- /dev/null
+++ b/contrib/bind9/lib/export/isccfg/Makefile.in
@@ -0,0 +1,83 @@
+# Copyright (C) 2009 Internet Systems Consortium, Inc. ("ISC")
+#
+# Permission to use, copy, modify, and/or 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 ISC DISCLAIMS ALL WARRANTIES WITH
+# REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+# AND FITNESS. IN NO EVENT SHALL ISC 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.
+
+# $Id: Makefile.in,v 1.4 2009-12-05 23:31:41 each Exp $
+
+top_srcdir = @top_srcdir@
+srcdir = @top_srcdir@/lib/isccfg
+export_srcdir = @top_srcdir@/lib/export
+
+@BIND9_VERSION@
+
+@LIBISCCFG_API@
+
+@BIND9_MAKE_INCLUDES@
+
+CINCLUDES = -I. ${DNS_INCLUDES} -I${export_srcdir}/isc/include \
+ ${ISC_INCLUDES} ${ISCCFG_INCLUDES}
+
+CDEFINES =
+CWARNINGS =
+
+ISCLIBS = ../isc/libisc.@A@
+DNSLIBS = ../dns/libdns.@A@
+
+ISCDEPLIBS = ../../lib/isc/libisc.@A@
+ISCCFGDEPLIBS = libisccfg.@A@
+
+LIBS = @LIBS@
+
+SUBDIRS = include
+
+# Alphabetically
+OBJS = dnsconf.@O@ log.@O@ parser.@O@ version.@O@
+
+# Alphabetically
+SRCS = dnsconf.c log.c parser.c version.c
+
+TARGETS = timestamp
+
+@BIND9_MAKE_RULES@
+
+version.@O@: ${srcdir}/version.c
+ ${LIBTOOL_MODE_COMPILE} ${CC} ${ALL_CFLAGS} \
+ -DVERSION=\"${VERSION}\" \
+ -DLIBINTERFACE=${LIBINTERFACE} \
+ -DLIBREVISION=${LIBREVISION} \
+ -DLIBAGE=${LIBAGE} \
+ -c ${srcdir}/version.c
+
+libisccfg.@SA@: ${OBJS}
+ ${AR} ${ARFLAGS} $@ ${OBJS}
+ ${RANLIB} $@
+
+libisccfg.la: ${OBJS}
+ ${LIBTOOL_MODE_LINK} \
+ ${CC} ${ALL_CFLAGS} ${LDFLAGS} -o libisccfg.la \
+ -rpath ${export_libdir} \
+ -version-info ${LIBINTERFACE}:${LIBREVISION}:${LIBAGE} \
+ ${OBJS} ${LIBS} ${DNSLIBS} ${ISCLIBS}
+
+timestamp: libisccfg.@A@
+ touch timestamp
+
+installdirs:
+ $(SHELL) ${top_srcdir}/mkinstalldirs ${DESTDIR}${export_libdir}
+
+install:: timestamp installdirs
+ ${LIBTOOL_MODE_INSTALL} ${INSTALL_DATA} libisccfg.@A@ \
+ ${DESTDIR}${export_libdir}
+
+clean distclean::
+ rm -f libisccfg.@A@ timestamp
diff --git a/contrib/bind9/lib/export/isccfg/include/Makefile.in b/contrib/bind9/lib/export/isccfg/include/Makefile.in
new file mode 100644
index 0000000..896c467
--- /dev/null
+++ b/contrib/bind9/lib/export/isccfg/include/Makefile.in
@@ -0,0 +1,24 @@
+# Copyright (C) 2009 Internet Systems Consortium, Inc. ("ISC")
+#
+# Permission to use, copy, modify, and/or 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 ISC DISCLAIMS ALL WARRANTIES WITH
+# REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+# AND FITNESS. IN NO EVENT SHALL ISC 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.
+
+# $Id: Makefile.in,v 1.2 2009-09-01 00:22:27 jinmei Exp $
+
+srcdir = @srdir@
+top_srcdir = @top_srcdir@
+
+
+SUBDIRS = isccfg
+TARGETS =
+
+@BIND9_MAKE_RULES@
diff --git a/contrib/bind9/lib/export/isccfg/include/isccfg/Makefile.in b/contrib/bind9/lib/export/isccfg/include/isccfg/Makefile.in
new file mode 100644
index 0000000..3f97894
--- /dev/null
+++ b/contrib/bind9/lib/export/isccfg/include/isccfg/Makefile.in
@@ -0,0 +1,42 @@
+# Copyright (C) 2009 Internet Systems Consortium, Inc. ("ISC")
+#
+# Permission to use, copy, modify, and/or 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 ISC DISCLAIMS ALL WARRANTIES WITH
+# REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+# AND FITNESS. IN NO EVENT SHALL ISC 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.
+
+# $Id: Makefile.in,v 1.3 2009-09-02 23:48:02 tbox Exp $
+
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+
+@BIND9_VERSION@
+
+#
+# Only list headers that are to be installed and are not
+# machine generated. The latter are handled specially in the
+# install target below.
+#
+HEADERS = cfg.h grammar.h log.h dnsconf.h version.h
+
+SUBDIRS =
+TARGETS =
+
+@BIND9_MAKE_RULES@
+
+installdirs:
+ $(SHELL) ${top_srcdir}/mkinstalldirs \
+ ${DESTDIR}${export_includedir}/isccfg
+
+install:: installdirs
+ for i in ${HEADERS}; do \
+ ${INSTALL_DATA} ${top_srcdir}/lib/isccfg/include/isccfg/$$i \
+ ${DESTDIR}${export_includedir}/isccfg ; \
+ done
diff --git a/contrib/bind9/lib/export/samples/Makefile-postinstall.in b/contrib/bind9/lib/export/samples/Makefile-postinstall.in
new file mode 100644
index 0000000..10a26f4
--- /dev/null
+++ b/contrib/bind9/lib/export/samples/Makefile-postinstall.in
@@ -0,0 +1,78 @@
+# Copyright (C) 2009 Internet Systems Consortium, Inc. ("ISC")
+#
+# Permission to use, copy, modify, and/or 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 ISC DISCLAIMS ALL WARRANTIES WITH
+# REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+# AND FITNESS. IN NO EVENT SHALL ISC 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.
+
+# $Id: Makefile-postinstall.in,v 1.3 2009-09-02 23:48:02 tbox Exp $
+
+srcdir = @srcdir@
+#prefix = @prefix@
+#exec_prefix = @exec_prefix@
+
+CDEFINES =
+CWARNINGS =
+
+DNSLIBS = -ldns @DNS_CRYPTO_LIBS@
+ISCLIBS = -lisc
+ISCCFGLIBS = -lisccfg
+IRSLIBS = -lirs
+
+LIBS = ${DNSLIBS} ${ISCCFGLIBS} ${ISCLIBS} @LIBS@
+
+SUBDIRS =
+
+TARGETS = sample@EXEEXT@ sample-async@EXEEXT@ sample-gai@EXEEXT@ \
+ sample-update@EXEEXT@ sample-request@EXEEXT@ nsprobe@EXEEXT@ \
+ dlvchecks@EXEEXT@
+
+OBJS = sample.@O@ sample-async.@O@ sample-gai.@O@ sample-update.@O@ \
+ sample-request.@O@ nsprobe.@O@ dlvchecks.@O@
+
+SRCS = sample.c sample-async.c sample-gai.c sample-update.c \
+ sample-request.c nsprobe.c dlvchecks..c
+
+@BIND9_MAKE_RULES@
+
+# The following two may depend on BIND9_MAKE_RULES
+CINCLUDES = -I@export_includedir@
+LDFLAGS = -L@export_libdir@
+
+sample@EXEEXT@: sample.@O@ ${DEPLIBS}
+ ${LIBTOOL_MODE_LINK} ${PURIFY} ${CC} ${CFLAGS} ${LDFLAGS} -o $@ \
+ sample.@O@ ${LIBS}
+
+sample-async@EXEEXT@: sample-async.@O@ ${DEPLIBS}
+ ${LIBTOOL_MODE_LINK} ${PURIFY} ${CC} ${CFLAGS} ${LDFLAGS} -o $@ \
+ sample-async.@O@ ${LIBS}
+
+sample-gai@EXEEXT@: sample-gai.@O@ ${IRSDEPLIBS} ${DEPLIBS}
+ ${LIBTOOL_MODE_LINK} ${PURIFY} ${CC} ${CFLAGS} ${LDFLAGS} -o $@ \
+ sample-gai.@O@ ${IRSLIBS} ${LIBS}
+
+sample-update@EXEEXT@: sample-update.@O@ ${DEPLIBS}
+ ${LIBTOOL_MODE_LINK} ${PURIFY} ${CC} ${CFLAGS} ${LDFLAGS} -o $@ \
+ sample-update.@O@ ${LIBS}
+
+sample-request@EXEEXT@: sample-request.@O@ ${DEPLIBS}
+ ${LIBTOOL_MODE_LINK} ${PURIFY} ${CC} ${CFLAGS} ${LDFLAGS} -o $@ \
+ sample-request.@O@ ${LIBS}
+
+nsprobe@EXEEXT@: nsprobe.@O@ ${DEPLIBS}
+ ${LIBTOOL_MODE_LINK} ${PURIFY} ${CC} ${CFLAGS} ${LDFLAGS} -o $@ \
+ nsprobe.@O@ ${LIBS}
+
+dlvchecks@EXEEXT@: dlvchecks.@O@ ${DEPLIBS}
+ ${LIBTOOL_MODE_LINK} ${PURIFY} ${CC} ${CFLAGS} ${LDFLAGS} -o $@ \
+ dlvchecks.@O@ ${LIBS}
+
+clean distclean maintainer-clean::
+ rm -f ${TARGETS}
diff --git a/contrib/bind9/lib/export/samples/Makefile.in b/contrib/bind9/lib/export/samples/Makefile.in
new file mode 100644
index 0000000..ff8e916
--- /dev/null
+++ b/contrib/bind9/lib/export/samples/Makefile.in
@@ -0,0 +1,98 @@
+# Copyright (C) 2009 Internet Systems Consortium, Inc. ("ISC")
+#
+# Permission to use, copy, modify, and/or 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 ISC DISCLAIMS ALL WARRANTIES WITH
+# REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+# AND FITNESS. IN NO EVENT SHALL ISC 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.
+
+# $Id: Makefile.in,v 1.4 2009-12-05 23:31:41 each Exp $
+
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+export_srcdir = @top_srcdir@/lib/export
+
+@BIND9_VERSION@
+
+@BIND9_MAKE_INCLUDES@
+
+CINCLUDES = -I${srcdir}/include -I../dns/include \
+ -I${export_srcdir}/isc/include \
+ ${DNS_INCLUDES} ${ISC_INCLUDES} \
+ -I${top_srcdir}/lib/irs/include
+
+CDEFINES =
+CWARNINGS =
+
+DNSLIBS = ../dns/libdns.@A@ @DNS_CRYPTO_LIBS@
+ISCLIBS = ../isc/libisc.@A@
+ISCCFGLIBS = ../isccfg/libisccfg.@A@
+IRSLIBS = ../irs/libirs.@A@
+
+DNSDEPLIBS = ../dns/libdns.@A@
+ISCDEPLIBS = ../isc/libisc.@A@
+ISCCFGDEPLIBS = ../isccfg/libisccfg.@A@
+IRSDEPLIBS = ../irs/libirs.@A@
+
+DEPLIBS = ${DNSDEPLIBS} ${ISCCFGDEPLIBS} ${ISCDEPLIBS}
+
+LIBS = ${DNSLIBS} ${ISCCFGLIBS} ${ISCLIBS} @LIBS@
+
+SUBDIRS =
+
+TARGETS = sample@EXEEXT@ sample-async@EXEEXT@ sample-gai@EXEEXT@ \
+ sample-update@EXEEXT@ sample-request@EXEEXT@ nsprobe@EXEEXT@
+
+OBJS = sample.@O@ sample-async.@O@ sample-gai.@O@ sample-update.@O@ \
+ sample-request.@O@ nsprobe.@O@
+
+UOBJS =
+
+SRCS = sample.c sample-async.c sample-gai.c sample-update.c \
+ sample-request.c nsprobe.c
+
+MANPAGES =
+
+HTMLPAGES =
+
+MANOBJS = ${MANPAGES} ${HTMLPAGES}
+
+@BIND9_MAKE_RULES@
+
+sample@EXEEXT@: sample.@O@ ${DEPLIBS}
+ ${LIBTOOL_MODE_LINK} ${PURIFY} ${CC} ${CFLAGS} ${LDFLAGS} -o $@ \
+ sample.@O@ ${LIBS}
+
+sample-async@EXEEXT@: sample-async.@O@ ${DEPLIBS}
+ ${LIBTOOL_MODE_LINK} ${PURIFY} ${CC} ${CFLAGS} ${LDFLAGS} -o $@ \
+ sample-async.@O@ ${LIBS}
+
+sample-gai@EXEEXT@: sample-gai.@O@ ${IRSDEPLIBS} ${DEPLIBS}
+ ${LIBTOOL_MODE_LINK} ${PURIFY} ${CC} ${CFLAGS} ${LDFLAGS} -o $@ \
+ sample-gai.@O@ ${IRSLIBS} ${LIBS}
+
+sample-update@EXEEXT@: sample-update.@O@ ${DEPLIBS}
+ ${LIBTOOL_MODE_LINK} ${PURIFY} ${CC} ${CFLAGS} ${LDFLAGS} -o $@ \
+ sample-update.@O@ ${LIBS}
+
+sample-request@EXEEXT@: sample-request.@O@ ${DEPLIBS}
+ ${LIBTOOL_MODE_LINK} ${PURIFY} ${CC} ${CFLAGS} ${LDFLAGS} -o $@ \
+ sample-request.@O@ ${LIBS}
+
+nsprobe@EXEEXT@: nsprobe.@O@ ${DEPLIBS}
+ ${LIBTOOL_MODE_LINK} ${PURIFY} ${CC} ${CFLAGS} ${LDFLAGS} -o $@ \
+ nsprobe.@O@ ${LIBS}
+
+doc man:: ${MANOBJS}
+
+docclean manclean maintainer-clean::
+ rm -f ${MANOBJS}
+
+clean distclean maintainer-clean::
+ rm -f ${TARGETS}
diff --git a/contrib/bind9/lib/export/samples/nsprobe.c b/contrib/bind9/lib/export/samples/nsprobe.c
new file mode 100644
index 0000000..85c572d
--- /dev/null
+++ b/contrib/bind9/lib/export/samples/nsprobe.c
@@ -0,0 +1,1220 @@
+/*
+ * Copyright (C) 2009, 2010 Internet Systems Consortium, Inc. ("ISC")
+ *
+ * Permission to use, copy, modify, and/or 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 ISC DISCLAIMS ALL WARRANTIES WITH
+ * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+ * AND FITNESS. IN NO EVENT SHALL ISC 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.
+ */
+
+/* $Id: nsprobe.c,v 1.7 2010-01-07 23:48:54 tbox Exp $ */
+
+#include <config.h>
+
+#include <sys/types.h>
+#include <sys/socket.h>
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+#include <netdb.h>
+
+#include <isc/app.h>
+#include <isc/buffer.h>
+#include <isc/lib.h>
+#include <isc/mem.h>
+#include <isc/socket.h>
+#include <isc/sockaddr.h>
+#include <isc/string.h>
+#include <isc/task.h>
+#include <isc/timer.h>
+#include <isc/util.h>
+
+#include <dns/client.h>
+#include <dns/fixedname.h>
+#include <dns/lib.h>
+#include <dns/message.h>
+#include <dns/name.h>
+#include <dns/rdata.h>
+#include <dns/rdataset.h>
+#include <dns/rdatastruct.h>
+#include <dns/rdatatype.h>
+#include <dns/result.h>
+
+#define MAX_PROBES 1000
+
+static dns_client_t *client = NULL;
+static isc_task_t *probe_task = NULL;
+static isc_appctx_t *actx = NULL;
+static isc_mem_t *mctx = NULL;
+static unsigned int outstanding_probes = 0;
+const char *cacheserver = "127.0.0.1";
+static FILE *fp;
+
+typedef enum {
+ none,
+ exist,
+ nxdomain,
+ othererr,
+ multiplesoa,
+ multiplecname,
+ brokenanswer,
+ lame,
+ timedout,
+ notype,
+ unexpected
+} query_result_t;
+
+struct server {
+ ISC_LINK(struct server) link;
+
+ isc_sockaddr_t address;
+ query_result_t result_a;
+ query_result_t result_aaaa;
+};
+
+struct probe_ns {
+ ISC_LINK(struct probe_ns) link;
+
+ dns_fixedname_t fixedname;
+ dns_name_t *name;
+ struct server *current_server;
+ ISC_LIST(struct server) servers;
+};
+
+struct probe_trans {
+ isc_boolean_t inuse;
+ char *domain;
+ dns_fixedname_t fixedname;
+ dns_name_t *qname;
+ const char **qlabel;
+ isc_boolean_t qname_found;
+ dns_clientrestrans_t *resid;
+ dns_message_t *qmessage;
+ dns_message_t *rmessage;
+ dns_clientreqtrans_t *reqid;
+
+ /* NS list */
+ struct probe_ns *current_ns;
+ ISC_LIST(struct probe_ns) nslist;
+};
+
+struct lcl_stat {
+ unsigned long valid;
+ unsigned long ignore;
+ unsigned long nxdomain;
+ unsigned long othererr;
+ unsigned long multiplesoa;
+ unsigned long multiplecname;
+ unsigned long brokenanswer;
+ unsigned long lame;
+ unsigned long unknown;
+} server_stat, domain_stat;
+
+static unsigned long number_of_domains = 0;
+static unsigned long number_of_servers = 0;
+static unsigned long multiple_error_domains = 0;
+static isc_boolean_t debug_mode = ISC_FALSE;
+static int verbose_level = 0;
+static const char *qlabels[] = {"www.", "ftp.", NULL};
+static struct probe_trans probes[MAX_PROBES];
+
+static isc_result_t probe_domain(struct probe_trans *trans);
+static void reset_probe(struct probe_trans *trans);
+static isc_result_t fetch_nsaddress(struct probe_trans *trans);
+static isc_result_t probe_name(struct probe_trans *trans,
+ dns_rdatatype_t type);
+
+/* Dump an rdataset for debug */
+static isc_result_t
+print_rdataset(dns_rdataset_t *rdataset, dns_name_t *owner) {
+ isc_buffer_t target;
+ isc_result_t result;
+ isc_region_t r;
+ char t[4096];
+
+ if (!debug_mode)
+ return (ISC_R_SUCCESS);
+
+ isc_buffer_init(&target, t, sizeof(t));
+
+ if (!dns_rdataset_isassociated(rdataset))
+ return (ISC_R_SUCCESS);
+ result = dns_rdataset_totext(rdataset, owner, ISC_FALSE, ISC_FALSE,
+ &target);
+ if (result != ISC_R_SUCCESS)
+ return (result);
+ isc_buffer_usedregion(&target, &r);
+ printf("%.*s", (int)r.length, (char *)r.base);
+
+ return (ISC_R_SUCCESS);
+}
+
+static isc_result_t
+print_name(dns_name_t *name) {
+ isc_result_t result;
+ isc_buffer_t target;
+ isc_region_t r;
+ char t[4096];
+
+ isc_buffer_init(&target, t, sizeof(t));
+ result = dns_name_totext(name, ISC_TRUE, &target);
+ if (result == ISC_R_SUCCESS) {
+ isc_buffer_usedregion(&target, &r);
+ printf("%.*s", (int)r.length, (char *)r.base);
+ } else
+ printf("(invalid name)");
+
+ return (result);
+}
+
+static isc_result_t
+print_address(FILE *fp, isc_sockaddr_t *addr) {
+ char buf[NI_MAXHOST];
+
+ if (getnameinfo(&addr->type.sa, addr->length, buf, sizeof(buf),
+ NULL, 0, NI_NUMERICHOST) == 0) {
+ fprintf(fp, "%s", buf);
+ } else {
+ fprintf(fp, "(invalid address)");
+ }
+
+ return (ISC_R_SUCCESS);
+}
+
+static void
+ctxs_destroy(isc_mem_t **mctxp, isc_appctx_t **actxp,
+ isc_taskmgr_t **taskmgrp, isc_socketmgr_t **socketmgrp,
+ isc_timermgr_t **timermgrp)
+{
+ if (*taskmgrp != NULL)
+ isc_taskmgr_destroy(taskmgrp);
+
+ if (*timermgrp != NULL)
+ isc_timermgr_destroy(timermgrp);
+
+ if (*socketmgrp != NULL)
+ isc_socketmgr_destroy(socketmgrp);
+
+ if (*actxp != NULL)
+ isc_appctx_destroy(actxp);
+
+ if (*mctxp != NULL)
+ isc_mem_destroy(mctxp);
+}
+
+static isc_result_t
+ctxs_init(isc_mem_t **mctxp, isc_appctx_t **actxp,
+ isc_taskmgr_t **taskmgrp, isc_socketmgr_t **socketmgrp,
+ isc_timermgr_t **timermgrp)
+{
+ isc_result_t result;
+
+ result = isc_mem_create(0, 0, mctxp);
+ if (result != ISC_R_SUCCESS)
+ goto fail;
+
+ result = isc_appctx_create(*mctxp, actxp);
+ if (result != ISC_R_SUCCESS)
+ goto fail;
+
+ result = isc_taskmgr_createinctx(*mctxp, *actxp, 1, 0, taskmgrp);
+ if (result != ISC_R_SUCCESS)
+ goto fail;
+
+ result = isc_socketmgr_createinctx(*mctxp, *actxp, socketmgrp);
+ if (result != ISC_R_SUCCESS)
+ goto fail;
+
+ result = isc_timermgr_createinctx(*mctxp, *actxp, timermgrp);
+ if (result != ISC_R_SUCCESS)
+ goto fail;
+
+ return (ISC_R_SUCCESS);
+
+ fail:
+ ctxs_destroy(mctxp, actxp, taskmgrp, socketmgrp, timermgrp);
+
+ return (result);
+}
+
+/*
+ * Common routine to make query data
+ */
+static isc_result_t
+make_querymessage(dns_message_t *message, dns_name_t *qname0,
+ dns_rdatatype_t rdtype)
+{
+ dns_name_t *qname = NULL;
+ dns_rdataset_t *qrdataset = NULL;
+ isc_result_t result;
+
+ message->opcode = dns_opcode_query;
+ message->rdclass = dns_rdataclass_in;
+
+ result = dns_message_gettempname(message, &qname);
+ if (result != ISC_R_SUCCESS)
+ goto cleanup;
+
+ result = dns_message_gettemprdataset(message, &qrdataset);
+ if (result != ISC_R_SUCCESS)
+ goto cleanup;
+
+ dns_name_init(qname, NULL);
+ dns_name_clone(qname0, qname);
+ dns_rdataset_init(qrdataset);
+ dns_rdataset_makequestion(qrdataset, message->rdclass, rdtype);
+ ISC_LIST_APPEND(qname->list, qrdataset, link);
+ dns_message_addname(message, qname, DNS_SECTION_QUESTION);
+
+ return (ISC_R_SUCCESS);
+
+ cleanup:
+ if (qname != NULL)
+ dns_message_puttempname(message, &qname);
+ if (qrdataset != NULL)
+ dns_message_puttemprdataset(message, &qrdataset);
+ if (message != NULL)
+ dns_message_destroy(&message);
+ return (result);
+}
+
+/*
+ * Update statistics
+ */
+static inline void
+increment_entry(unsigned long *entryp) {
+ (*entryp)++;
+ INSIST(*entryp != 0); /* check overflow */
+}
+
+static void
+update_stat(struct probe_trans *trans) {
+ struct probe_ns *pns;
+ struct server *server;
+ struct lcl_stat local_stat;
+ unsigned int err_count = 0;
+ const char *stattype;
+
+ increment_entry(&number_of_domains);
+ memset(&local_stat, 0, sizeof(local_stat));
+
+ /* Update per sever statistics */
+ for (pns = ISC_LIST_HEAD(trans->nslist); pns != NULL;
+ pns = ISC_LIST_NEXT(pns, link)) {
+ for (server = ISC_LIST_HEAD(pns->servers); server != NULL;
+ server = ISC_LIST_NEXT(server, link)) {
+ increment_entry(&number_of_servers);
+
+ if (server->result_aaaa == exist ||
+ server->result_aaaa == notype) {
+ /*
+ * Don't care about the result of A query if
+ * the answer to AAAA query was expected.
+ */
+ stattype = "valid";
+ increment_entry(&server_stat.valid);
+ increment_entry(&local_stat.valid);
+ } else if (server->result_a == exist) {
+ switch (server->result_aaaa) {
+ case exist:
+ case notype:
+ stattype = "valid";
+ increment_entry(&server_stat.valid);
+ increment_entry(&local_stat.valid);
+ break;
+ case timedout:
+ stattype = "ignore";
+ increment_entry(&server_stat.ignore);
+ increment_entry(&local_stat.ignore);
+ break;
+ case nxdomain:
+ stattype = "nxdomain";
+ increment_entry(&server_stat.nxdomain);
+ increment_entry(&local_stat.nxdomain);
+ break;
+ case othererr:
+ stattype = "othererr";
+ increment_entry(&server_stat.othererr);
+ increment_entry(&local_stat.othererr);
+ break;
+ case multiplesoa:
+ stattype = "multiplesoa";
+ increment_entry(&server_stat.multiplesoa);
+ increment_entry(&local_stat.multiplesoa);
+ break;
+ case multiplecname:
+ stattype = "multiplecname";
+ increment_entry(&server_stat.multiplecname);
+ increment_entry(&local_stat.multiplecname);
+ break;
+ case brokenanswer:
+ stattype = "brokenanswer";
+ increment_entry(&server_stat.brokenanswer);
+ increment_entry(&local_stat.brokenanswer);
+ break;
+ case lame:
+ stattype = "lame";
+ increment_entry(&server_stat.lame);
+ increment_entry(&local_stat.lame);
+ break;
+ default:
+ stattype = "unknown";
+ increment_entry(&server_stat.unknown);
+ increment_entry(&local_stat.unknown);
+ break;
+ }
+ } else {
+ stattype = "unknown";
+ increment_entry(&server_stat.unknown);
+ increment_entry(&local_stat.unknown);
+ }
+
+ if (verbose_level > 1 ||
+ (verbose_level == 1 &&
+ strcmp(stattype, "valid") != 0 &&
+ strcmp(stattype, "unknown") != 0)) {
+ print_name(pns->name);
+ putchar('(');
+ print_address(stdout, &server->address);
+ printf(") for %s:%s\n", trans->domain,
+ stattype);
+ }
+ }
+ }
+
+ /* Update per domain statistics */
+ if (local_stat.ignore > 0) {
+ if (verbose_level > 0)
+ printf("%s:ignore\n", trans->domain);
+ increment_entry(&domain_stat.ignore);
+ err_count++;
+ }
+ if (local_stat.nxdomain > 0) {
+ if (verbose_level > 0)
+ printf("%s:nxdomain\n", trans->domain);
+ increment_entry(&domain_stat.nxdomain);
+ err_count++;
+ }
+ if (local_stat.othererr > 0) {
+ if (verbose_level > 0)
+ printf("%s:othererr\n", trans->domain);
+ increment_entry(&domain_stat.othererr);
+ err_count++;
+ }
+ if (local_stat.multiplesoa > 0) {
+ if (verbose_level > 0)
+ printf("%s:multiplesoa\n", trans->domain);
+ increment_entry(&domain_stat.multiplesoa);
+ err_count++;
+ }
+ if (local_stat.multiplecname > 0) {
+ if (verbose_level > 0)
+ printf("%s:multiplecname\n", trans->domain);
+ increment_entry(&domain_stat.multiplecname);
+ err_count++;
+ }
+ if (local_stat.brokenanswer > 0) {
+ if (verbose_level > 0)
+ printf("%s:brokenanswer\n", trans->domain);
+ increment_entry(&domain_stat.brokenanswer);
+ err_count++;
+ }
+ if (local_stat.lame > 0) {
+ if (verbose_level > 0)
+ printf("%s:lame\n", trans->domain);
+ increment_entry(&domain_stat.lame);
+ err_count++;
+ }
+
+ if (err_count > 1)
+ increment_entry(&multiple_error_domains);
+
+ /*
+ * We regard the domain as valid if and only if no authoritative server
+ * has a problem and at least one server is known to be valid.
+ */
+ if (local_stat.valid > 0 && err_count == 0) {
+ if (verbose_level > 1)
+ printf("%s:valid\n", trans->domain);
+ increment_entry(&domain_stat.valid);
+ }
+
+ /*
+ * If the domain has no available server or all servers have the
+ * 'unknown' result, the domain's result is also regarded as unknown.
+ */
+ if (local_stat.valid == 0 && err_count == 0) {
+ if (verbose_level > 1)
+ printf("%s:unknown\n", trans->domain);
+ increment_entry(&domain_stat.unknown);
+ }
+}
+
+/*
+ * Search for an existent name with an A RR
+ */
+
+static isc_result_t
+set_nextqname(struct probe_trans *trans) {
+ isc_result_t result;
+ size_t domainlen;
+ isc_buffer_t b;
+ char buf[4096]; /* XXX ad-hoc constant, but should be enough */
+
+ if (*trans->qlabel == NULL)
+ return (ISC_R_NOMORE);
+
+ result = isc_string_copy(buf, sizeof(buf), *trans->qlabel);
+ if (result != ISC_R_SUCCESS)
+ return (result);
+ result = isc_string_append(buf, sizeof(buf), trans->domain);
+ if (result != ISC_R_SUCCESS)
+ return (result);
+
+ domainlen = strlen(buf);
+ isc_buffer_init(&b, buf, domainlen);
+ isc_buffer_add(&b, domainlen);
+ dns_fixedname_init(&trans->fixedname);
+ trans->qname = dns_fixedname_name(&trans->fixedname);
+ result = dns_name_fromtext(trans->qname, &b, dns_rootname,
+ 0, NULL);
+
+ trans->qlabel++;
+
+ return (result);
+}
+
+static void
+request_done(isc_task_t *task, isc_event_t *event) {
+ struct probe_trans *trans = event->ev_arg;
+ dns_clientreqevent_t *rev = (dns_clientreqevent_t *)event;
+ dns_message_t *rmessage;
+ struct probe_ns *pns;
+ struct server *server;
+ isc_result_t result;
+ query_result_t *resultp;
+ dns_name_t *name;
+ dns_rdataset_t *rdataset;
+ dns_rdatatype_t type;
+
+ REQUIRE(task == probe_task);
+ REQUIRE(trans != NULL && trans->inuse == ISC_TRUE);
+ rmessage = rev->rmessage;
+ REQUIRE(rmessage == trans->rmessage);
+ INSIST(outstanding_probes > 0);
+
+ server = trans->current_ns->current_server;
+ INSIST(server != NULL);
+
+ if (server->result_a == none) {
+ type = dns_rdatatype_a;
+ resultp = &server->result_a;
+ } else {
+ resultp = &server->result_aaaa;
+ type = dns_rdatatype_aaaa;
+ }
+
+ if (rev->result == ISC_R_SUCCESS) {
+ if ((rmessage->flags & DNS_MESSAGEFLAG_AA) == 0)
+ *resultp = lame;
+ else if (rmessage->rcode == dns_rcode_nxdomain)
+ *resultp = nxdomain;
+ else if (rmessage->rcode != dns_rcode_noerror)
+ *resultp = othererr;
+ else if (rmessage->counts[DNS_SECTION_ANSWER] == 0) {
+ /* no error but empty answer */
+ *resultp = notype;
+ } else {
+ result = dns_message_firstname(rmessage,
+ DNS_SECTION_ANSWER);
+ while (result == ISC_R_SUCCESS) {
+ name = NULL;
+ dns_message_currentname(rmessage,
+ DNS_SECTION_ANSWER,
+ &name);
+ for (rdataset = ISC_LIST_HEAD(name->list);
+ rdataset != NULL;
+ rdataset = ISC_LIST_NEXT(rdataset,
+ link)) {
+ (void)print_rdataset(rdataset, name);
+
+ if (rdataset->type ==
+ dns_rdatatype_cname ||
+ rdataset->type ==
+ dns_rdatatype_dname) {
+ /* Should chase the chain? */
+ *resultp = exist;
+ goto found;
+ } else if (rdataset->type == type) {
+ *resultp = exist;
+ goto found;
+ }
+ }
+ result = dns_message_nextname(rmessage,
+ DNS_SECTION_ANSWER);
+ }
+
+ /*
+ * Something unexpected happened: the response
+ * contained a non-empty authoritative answer, but we
+ * could not find an expected result.
+ */
+ *resultp = unexpected;
+ }
+ } else if (rev->result == DNS_R_RECOVERABLE ||
+ rev->result == DNS_R_BADLABELTYPE) {
+ /* Broken response. Try identifying known cases. */
+ *resultp = brokenanswer;
+
+ if (rmessage->counts[DNS_SECTION_ANSWER] > 0) {
+ result = dns_message_firstname(rmessage,
+ DNS_SECTION_ANSWER);
+ while (result == ISC_R_SUCCESS) {
+ /*
+ * Check to see if the response has multiple
+ * CNAME RRs. Update the result code if so.
+ */
+ name = NULL;
+ dns_message_currentname(rmessage,
+ DNS_SECTION_ANSWER,
+ &name);
+ for (rdataset = ISC_LIST_HEAD(name->list);
+ rdataset != NULL;
+ rdataset = ISC_LIST_NEXT(rdataset,
+ link)) {
+ if (rdataset->type ==
+ dns_rdatatype_cname &&
+ dns_rdataset_count(rdataset) > 1) {
+ *resultp = multiplecname;
+ goto found;
+ }
+ }
+ result = dns_message_nextname(rmessage,
+ DNS_SECTION_ANSWER);
+ }
+ }
+
+ if (rmessage->counts[DNS_SECTION_AUTHORITY] > 0) {
+ result = dns_message_firstname(rmessage,
+ DNS_SECTION_AUTHORITY);
+ while (result == ISC_R_SUCCESS) {
+ /*
+ * Check to see if the response has multiple
+ * SOA RRs. Update the result code if so.
+ */
+ name = NULL;
+ dns_message_currentname(rmessage,
+ DNS_SECTION_AUTHORITY,
+ &name);
+ for (rdataset = ISC_LIST_HEAD(name->list);
+ rdataset != NULL;
+ rdataset = ISC_LIST_NEXT(rdataset,
+ link)) {
+ if (rdataset->type ==
+ dns_rdatatype_soa &&
+ dns_rdataset_count(rdataset) > 1) {
+ *resultp = multiplesoa;
+ goto found;
+ }
+ }
+ result = dns_message_nextname(rmessage,
+ DNS_SECTION_AUTHORITY);
+ }
+ }
+ } else if (rev->result == ISC_R_TIMEDOUT)
+ *resultp = timedout;
+ else {
+ fprintf(stderr, "unexpected result: %d (domain=%s, server=",
+ rev->result, trans->domain);
+ print_address(stderr, &server->address);
+ fputc('\n', stderr);
+ *resultp = unexpected;
+ }
+
+ found:
+ INSIST(*resultp != none);
+ if (type == dns_rdatatype_a && *resultp == exist)
+ trans->qname_found = ISC_TRUE;
+
+ dns_client_destroyreqtrans(&trans->reqid);
+ isc_event_free(&event);
+ dns_message_reset(trans->rmessage, DNS_MESSAGE_INTENTPARSE);
+
+ result = probe_name(trans, type);
+ if (result == ISC_R_NOMORE) {
+ /* We've tried all addresses of all servers. */
+ if (type == dns_rdatatype_a && trans->qname_found) {
+ /*
+ * If we've explored A RRs and found an existent
+ * record, we can move to AAAA.
+ */
+ trans->current_ns = ISC_LIST_HEAD(trans->nslist);
+ probe_name(trans, dns_rdatatype_aaaa);
+ result = ISC_R_SUCCESS;
+ } else if (type == dns_rdatatype_a) {
+ /*
+ * No server provided an existent A RR of this name.
+ * Try next label.
+ */
+ dns_fixedname_invalidate(&trans->fixedname);
+ trans->qname = NULL;
+ result = set_nextqname(trans);
+ if (result == ISC_R_SUCCESS) {
+ trans->current_ns =
+ ISC_LIST_HEAD(trans->nslist);
+ for (pns = trans->current_ns; pns != NULL;
+ pns = ISC_LIST_NEXT(pns, link)) {
+ for (server = ISC_LIST_HEAD(pns->servers);
+ server != NULL;
+ server = ISC_LIST_NEXT(server,
+ link)) {
+ INSIST(server->result_aaaa ==
+ none);
+ server->result_a = none;
+ }
+ }
+ result = probe_name(trans, dns_rdatatype_a);
+ }
+ }
+ if (result != ISC_R_SUCCESS) {
+ /*
+ * We've explored AAAA RRs or failed to find a valid
+ * query label. Wrap up the result and move to the
+ * next domain.
+ */
+ reset_probe(trans);
+ }
+ } else if (result != ISC_R_SUCCESS)
+ reset_probe(trans); /* XXX */
+}
+
+static isc_result_t
+probe_name(struct probe_trans *trans, dns_rdatatype_t type) {
+ isc_result_t result;
+ struct probe_ns *pns;
+ struct server *server;
+
+ REQUIRE(trans->reqid == NULL);
+ REQUIRE(type == dns_rdatatype_a || type == dns_rdatatype_aaaa);
+
+ for (pns = trans->current_ns; pns != NULL;
+ pns = ISC_LIST_NEXT(pns, link)) {
+ for (server = ISC_LIST_HEAD(pns->servers); server != NULL;
+ server = ISC_LIST_NEXT(server, link)) {
+ if ((type == dns_rdatatype_a &&
+ server->result_a == none) ||
+ (type == dns_rdatatype_aaaa &&
+ server->result_aaaa == none)) {
+ pns->current_server = server;
+ goto found;
+ }
+ }
+ }
+
+ found:
+ trans->current_ns = pns;
+ if (pns == NULL)
+ return (ISC_R_NOMORE);
+
+ INSIST(pns->current_server != NULL);
+ dns_message_reset(trans->qmessage, DNS_MESSAGE_INTENTRENDER);
+ result = make_querymessage(trans->qmessage, trans->qname, type);
+ if (result != ISC_R_SUCCESS)
+ return (result);
+ result = dns_client_startrequest(client, trans->qmessage,
+ trans->rmessage,
+ &pns->current_server->address,
+ 0, DNS_MESSAGEPARSE_BESTEFFORT,
+ NULL, 120, 0, 4,
+ probe_task, request_done, trans,
+ &trans->reqid);
+
+ return (result);
+}
+
+/*
+ * Get IP addresses of NSes
+ */
+
+static void
+resolve_nsaddress(isc_task_t *task, isc_event_t *event) {
+ struct probe_trans *trans = event->ev_arg;
+ dns_clientresevent_t *rev = (dns_clientresevent_t *)event;
+ dns_name_t *name;
+ dns_rdataset_t *rdataset;
+ dns_rdata_t rdata = DNS_RDATA_INIT;
+ struct probe_ns *pns = trans->current_ns;
+ isc_result_t result;
+
+ REQUIRE(task == probe_task);
+ REQUIRE(trans->inuse == ISC_TRUE);
+ REQUIRE(pns != NULL);
+ INSIST(outstanding_probes > 0);
+
+ for (name = ISC_LIST_HEAD(rev->answerlist); name != NULL;
+ name = ISC_LIST_NEXT(name, link)) {
+ for (rdataset = ISC_LIST_HEAD(name->list);
+ rdataset != NULL;
+ rdataset = ISC_LIST_NEXT(rdataset, link)) {
+ (void)print_rdataset(rdataset, name);
+
+ if (rdataset->type != dns_rdatatype_a)
+ continue;
+
+ for (result = dns_rdataset_first(rdataset);
+ result == ISC_R_SUCCESS;
+ result = dns_rdataset_next(rdataset)) {
+ dns_rdata_in_a_t rdata_a;
+ struct server *server;
+
+ dns_rdataset_current(rdataset, &rdata);
+ result = dns_rdata_tostruct(&rdata, &rdata_a,
+ NULL);
+ if (result != ISC_R_SUCCESS)
+ continue;
+
+ server = isc_mem_get(mctx, sizeof(*server));
+ if (server == NULL) {
+ fprintf(stderr, "resolve_nsaddress: "
+ "mem_get failed");
+ result = ISC_R_NOMEMORY;
+ goto cleanup;
+ }
+ isc_sockaddr_fromin(&server->address,
+ &rdata_a.in_addr, 53);
+ ISC_LINK_INIT(server, link);
+ server->result_a = none;
+ server->result_aaaa = none;
+ ISC_LIST_APPEND(pns->servers, server, link);
+ }
+ }
+ }
+
+ cleanup:
+ dns_client_freeresanswer(client, &rev->answerlist);
+ dns_client_destroyrestrans(&trans->resid);
+ isc_event_free(&event);
+
+ next_ns:
+ trans->current_ns = ISC_LIST_NEXT(pns, link);
+ if (trans->current_ns == NULL) {
+ trans->current_ns = ISC_LIST_HEAD(trans->nslist);
+ dns_fixedname_invalidate(&trans->fixedname);
+ trans->qname = NULL;
+ result = set_nextqname(trans);
+ if (result == ISC_R_SUCCESS)
+ result = probe_name(trans, dns_rdatatype_a);
+ } else {
+ result = fetch_nsaddress(trans);
+ if (result != ISC_R_SUCCESS)
+ goto next_ns; /* XXX: this is unlikely to succeed */
+ }
+
+ if (result != ISC_R_SUCCESS)
+ reset_probe(trans);
+}
+
+static isc_result_t
+fetch_nsaddress(struct probe_trans *trans) {
+ struct probe_ns *pns;
+
+ pns = trans->current_ns;
+ REQUIRE(pns != NULL);
+
+ return (dns_client_startresolve(client, pns->name, dns_rdataclass_in,
+ dns_rdatatype_a, 0, probe_task,
+ resolve_nsaddress, trans,
+ &trans->resid));
+}
+
+/*
+ * Get NS RRset for a given domain
+ */
+
+static void
+reset_probe(struct probe_trans *trans) {
+ struct probe_ns *pns;
+ struct server *server;
+ isc_result_t result;
+
+ REQUIRE(trans->resid == NULL);
+ REQUIRE(trans->reqid == NULL);
+
+ update_stat(trans);
+
+ dns_message_reset(trans->qmessage, DNS_MESSAGE_INTENTRENDER);
+ dns_message_reset(trans->rmessage, DNS_MESSAGE_INTENTPARSE);
+
+ trans->inuse = ISC_FALSE;
+ if (trans->domain != NULL)
+ isc_mem_free(mctx, trans->domain);
+ trans->domain = NULL;
+ if (trans->qname != NULL)
+ dns_fixedname_invalidate(&trans->fixedname);
+ trans->qname = NULL;
+ trans->qlabel = qlabels;
+ trans->qname_found = ISC_FALSE;
+ trans->current_ns = NULL;
+
+ while ((pns = ISC_LIST_HEAD(trans->nslist)) != NULL) {
+ ISC_LIST_UNLINK(trans->nslist, pns, link);
+ while ((server = ISC_LIST_HEAD(pns->servers)) != NULL) {
+ ISC_LIST_UNLINK(pns->servers, server, link);
+ isc_mem_put(mctx, server, sizeof(*server));
+ }
+ isc_mem_put(mctx, pns, sizeof(*pns));
+ }
+
+ outstanding_probes--;
+
+ result = probe_domain(trans);
+ if (result == ISC_R_NOMORE && outstanding_probes == 0)
+ isc_app_ctxshutdown(actx);
+}
+
+static void
+resolve_ns(isc_task_t *task, isc_event_t *event) {
+ struct probe_trans *trans = event->ev_arg;
+ dns_clientresevent_t *rev = (dns_clientresevent_t *)event;
+ dns_name_t *name;
+ dns_rdataset_t *rdataset;
+ isc_result_t result = ISC_R_SUCCESS;
+ dns_rdata_t rdata = DNS_RDATA_INIT;
+ struct probe_ns *pns;
+
+ REQUIRE(task == probe_task);
+ REQUIRE(trans->inuse == ISC_TRUE);
+ INSIST(outstanding_probes > 0);
+
+ for (name = ISC_LIST_HEAD(rev->answerlist); name != NULL;
+ name = ISC_LIST_NEXT(name, link)) {
+ for (rdataset = ISC_LIST_HEAD(name->list);
+ rdataset != NULL;
+ rdataset = ISC_LIST_NEXT(rdataset, link)) {
+ (void)print_rdataset(rdataset, name);
+
+ if (rdataset->type != dns_rdatatype_ns)
+ continue;
+
+ for (result = dns_rdataset_first(rdataset);
+ result == ISC_R_SUCCESS;
+ result = dns_rdataset_next(rdataset)) {
+ dns_rdata_ns_t ns;
+
+ dns_rdataset_current(rdataset, &rdata);
+ /*
+ * Extract the name from the NS record.
+ */
+ result = dns_rdata_tostruct(&rdata, &ns, NULL);
+ if (result != ISC_R_SUCCESS)
+ continue;
+
+ pns = isc_mem_get(mctx, sizeof(*pns));
+ if (pns == NULL) {
+ fprintf(stderr,
+ "resolve_ns: mem_get failed");
+ result = ISC_R_NOMEMORY;
+ /*
+ * XXX: should we continue with the
+ * available servers anyway?
+ */
+ goto cleanup;
+ }
+
+ dns_fixedname_init(&pns->fixedname);
+ pns->name =
+ dns_fixedname_name(&pns->fixedname);
+ ISC_LINK_INIT(pns, link);
+ ISC_LIST_APPEND(trans->nslist, pns, link);
+ ISC_LIST_INIT(pns->servers);
+
+ dns_name_copy(&ns.name, pns->name, NULL);
+ dns_rdata_reset(&rdata);
+ dns_rdata_freestruct(&ns);
+ }
+ }
+ }
+
+ cleanup:
+ dns_client_freeresanswer(client, &rev->answerlist);
+ dns_client_destroyrestrans(&trans->resid);
+ isc_event_free(&event);
+
+ if (!ISC_LIST_EMPTY(trans->nslist)) {
+ /* Go get addresses of NSes */
+ trans->current_ns = ISC_LIST_HEAD(trans->nslist);
+ result = fetch_nsaddress(trans);
+ } else
+ result = ISC_R_FAILURE;
+
+ if (result == ISC_R_SUCCESS)
+ return;
+
+ reset_probe(trans);
+}
+
+static isc_result_t
+probe_domain(struct probe_trans *trans) {
+ isc_result_t result;
+ size_t domainlen;
+ isc_buffer_t b;
+ char buf[4096]; /* XXX ad hoc constant, but should be enough */
+ char *cp;
+
+ REQUIRE(trans != NULL);
+ REQUIRE(trans->inuse == ISC_FALSE);
+ REQUIRE(outstanding_probes < MAX_PROBES);
+
+ /* Construct domain */
+ cp = fgets(buf, sizeof(buf), fp);
+ if (cp == NULL)
+ return (ISC_R_NOMORE);
+ if ((cp = strchr(buf, '\n')) != NULL) /* zap NL if any */
+ *cp = '\0';
+ trans->domain = isc_mem_strdup(mctx, buf);
+ if (trans->domain == NULL) {
+ fprintf(stderr,
+ "failed to allocate memory for domain: %s", cp);
+ return (ISC_R_NOMEMORY);
+ }
+
+ /* Start getting NS for the domain */
+ domainlen = strlen(buf);
+ isc_buffer_init(&b, buf, domainlen);
+ isc_buffer_add(&b, domainlen);
+ dns_fixedname_init(&trans->fixedname);
+ trans->qname = dns_fixedname_name(&trans->fixedname);
+ result = dns_name_fromtext(trans->qname, &b, dns_rootname, 0, NULL);
+ if (result != ISC_R_SUCCESS)
+ goto cleanup;
+ result = dns_client_startresolve(client, trans->qname,
+ dns_rdataclass_in, dns_rdatatype_ns,
+ 0, probe_task, resolve_ns, trans,
+ &trans->resid);
+ if (result != ISC_R_SUCCESS)
+ goto cleanup;
+
+ trans->inuse = ISC_TRUE;
+ outstanding_probes++;
+
+ return (ISC_R_SUCCESS);
+
+ cleanup:
+ isc_mem_free(mctx, trans->domain);
+ dns_fixedname_invalidate(&trans->fixedname);
+
+ return (result);
+}
+
+ISC_PLATFORM_NORETURN_PRE static void
+usage(void) ISC_PLATFORM_NORETURN_POST;
+
+static void
+usage(void) {
+ fprintf(stderr, "usage: nsprobe [-d] [-v [-v...]] [-c cache_address] "
+ "[input_file]\n");
+
+ exit(1);
+}
+
+int
+main(int argc, char *argv[]) {
+ int i, ch, error;
+ struct addrinfo hints, *res;
+ isc_result_t result;
+ isc_sockaddr_t sa;
+ isc_sockaddrlist_t servers;
+ isc_taskmgr_t *taskmgr = NULL;
+ isc_socketmgr_t *socketmgr = NULL;
+ isc_timermgr_t *timermgr = NULL;
+
+ while ((ch = getopt(argc, argv, "c:dhv")) != -1) {
+ switch (ch) {
+ case 'c':
+ cacheserver = optarg;
+ break;
+ case 'd':
+ debug_mode = ISC_TRUE;
+ break;
+ case 'h':
+ usage();
+ break;
+ case 'v':
+ verbose_level++;
+ break;
+ default:
+ usage();
+ break;
+ }
+ }
+
+ argc -= optind;
+ argv += optind;
+
+ /* Common set up */
+ isc_lib_register();
+ result = dns_lib_init();
+ if (result != ISC_R_SUCCESS) {
+ fprintf(stderr, "dns_lib_init failed: %d\n", result);
+ exit(1);
+ }
+
+ result = ctxs_init(&mctx, &actx, &taskmgr, &socketmgr,
+ &timermgr);
+ if (result != ISC_R_SUCCESS) {
+ fprintf(stderr, "ctx create failed: %d\n", result);
+ exit(1);
+ }
+
+ isc_app_ctxstart(actx);
+
+ result = dns_client_createx(mctx, actx, taskmgr, socketmgr,
+ timermgr, 0, &client);
+ if (result != ISC_R_SUCCESS) {
+ fprintf(stderr, "dns_client_createx failed: %d\n", result);
+ exit(1);
+ }
+
+ /* Set local cache server */
+ memset(&hints, 0, sizeof(hints));
+ hints.ai_family = AF_UNSPEC;
+ hints.ai_socktype = SOCK_DGRAM;
+ error = getaddrinfo(cacheserver, "53", &hints, &res);
+ if (error != 0) {
+ fprintf(stderr, "failed to convert server name (%s): %s\n",
+ cacheserver, gai_strerror(error));
+ exit(1);
+ }
+
+ if (res->ai_addrlen > sizeof(sa.type)) {
+ fprintf(stderr,
+ "assumption failure: addrlen is too long: %d\n",
+ res->ai_addrlen);
+ exit(1);
+ }
+ memcpy(&sa.type.sa, res->ai_addr, res->ai_addrlen);
+ sa.length = res->ai_addrlen;
+ freeaddrinfo(res);
+ ISC_LINK_INIT(&sa, link);
+ ISC_LIST_INIT(servers);
+ ISC_LIST_APPEND(servers, &sa, link);
+ result = dns_client_setservers(client, dns_rdataclass_in, NULL,
+ &servers);
+ if (result != ISC_R_SUCCESS) {
+ fprintf(stderr, "failed to set server: %d\n", result);
+ exit(1);
+ }
+
+ /* Create the main task */
+ probe_task = NULL;
+ result = isc_task_create(taskmgr, 0, &probe_task);
+ if (result != ISC_R_SUCCESS) {
+ fprintf(stderr, "failed to create task: %d\n", result);
+ exit(1);
+ }
+
+ /* Open input file */
+ if (argc == 0)
+ fp = stdin;
+ else {
+ fp = fopen(argv[0], "r");
+ if (fp == NULL) {
+ fprintf(stderr, "failed to open input file: %s\n",
+ argv[0]);
+ exit(1);
+ }
+ }
+
+ /* Set up and start probe */
+ for (i = 0; i < MAX_PROBES; i++) {
+ probes[i].inuse = ISC_FALSE;
+ probes[i].domain = NULL;
+ dns_fixedname_init(&probes[i].fixedname);
+ probes[i].qname = NULL;
+ probes[i].qlabel = qlabels;
+ probes[i].qname_found = ISC_FALSE;
+ probes[i].resid = NULL;
+ ISC_LIST_INIT(probes[i].nslist);
+ probes[i].reqid = NULL;
+
+ probes[i].qmessage = NULL;
+ result = dns_message_create(mctx, DNS_MESSAGE_INTENTRENDER,
+ &probes[i].qmessage);
+ if (result == ISC_R_SUCCESS) {
+ result = dns_message_create(mctx,
+ DNS_MESSAGE_INTENTPARSE,
+ &probes[i].rmessage);
+ }
+ if (result != ISC_R_SUCCESS) {
+ fprintf(stderr, "initialization failure\n");
+ exit(1);
+ }
+ }
+ for (i = 0; i < MAX_PROBES; i++) {
+ result = probe_domain(&probes[i]);
+ if (result == ISC_R_NOMORE)
+ break;
+ else if (result != ISC_R_SUCCESS) {
+ fprintf(stderr, "failed to issue an initial probe\n");
+ exit(1);
+ }
+ }
+
+ /* Start event loop */
+ isc_app_ctxrun(actx);
+
+ /* Dump results */
+ printf("Per domain results (out of %lu domains):\n",
+ number_of_domains);
+ printf(" valid: %lu\n"
+ " ignore: %lu\n"
+ " nxdomain: %lu\n"
+ " othererr: %lu\n"
+ " multiplesoa: %lu\n"
+ " multiplecname: %lu\n"
+ " brokenanswer: %lu\n"
+ " lame: %lu\n"
+ " unknown: %lu\n"
+ " multiple errors: %lu\n",
+ domain_stat.valid, domain_stat.ignore, domain_stat.nxdomain,
+ domain_stat.othererr, domain_stat.multiplesoa,
+ domain_stat.multiplecname, domain_stat.brokenanswer,
+ domain_stat.lame, domain_stat.unknown, multiple_error_domains);
+ printf("Per server results (out of %lu servers):\n",
+ number_of_servers);
+ printf(" valid: %lu\n"
+ " ignore: %lu\n"
+ " nxdomain: %lu\n"
+ " othererr: %lu\n"
+ " multiplesoa: %lu\n"
+ " multiplecname: %lu\n"
+ " brokenanswer: %lu\n"
+ " lame: %lu\n"
+ " unknown: %lu\n",
+ server_stat.valid, server_stat.ignore, server_stat.nxdomain,
+ server_stat.othererr, server_stat.multiplesoa,
+ server_stat.multiplecname, server_stat.brokenanswer,
+ server_stat.lame, server_stat.unknown);
+
+ /* Cleanup */
+ for (i = 0; i < MAX_PROBES; i++) {
+ dns_message_destroy(&probes[i].qmessage);
+ dns_message_destroy(&probes[i].rmessage);
+ }
+ isc_task_detach(&probe_task);
+ dns_client_destroy(&client);
+ dns_lib_shutdown();
+ isc_app_ctxfinish(actx);
+ ctxs_destroy(&mctx, &actx, &taskmgr, &socketmgr, &timermgr);
+
+ exit(0);
+}
diff --git a/contrib/bind9/lib/export/samples/sample-async.c b/contrib/bind9/lib/export/samples/sample-async.c
new file mode 100644
index 0000000..19c0bba
--- /dev/null
+++ b/contrib/bind9/lib/export/samples/sample-async.c
@@ -0,0 +1,402 @@
+/*
+ * Copyright (C) 2009 Internet Systems Consortium, Inc. ("ISC")
+ *
+ * Permission to use, copy, modify, and/or 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 ISC DISCLAIMS ALL WARRANTIES WITH
+ * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+ * AND FITNESS. IN NO EVENT SHALL ISC 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.
+ */
+
+/* $Id: sample-async.c,v 1.5 2009-09-29 15:06:07 fdupont Exp $ */
+
+#include <config.h>
+
+#include <sys/types.h>
+#include <sys/socket.h>
+
+#include <netinet/in.h>
+
+#include <arpa/inet.h>
+
+#include <unistd.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include <isc/app.h>
+#include <isc/buffer.h>
+#include <isc/lib.h>
+#include <isc/mem.h>
+#include <isc/socket.h>
+#include <isc/sockaddr.h>
+#include <isc/task.h>
+#include <isc/timer.h>
+#include <isc/util.h>
+
+#include <dns/client.h>
+#include <dns/fixedname.h>
+#include <dns/lib.h>
+#include <dns/name.h>
+#include <dns/rdataset.h>
+#include <dns/rdatatype.h>
+#include <dns/result.h>
+
+#define MAX_SERVERS 10
+#define MAX_QUERIES 100
+
+static dns_client_t *client = NULL;
+static isc_task_t *query_task = NULL;
+static isc_appctx_t *query_actx = NULL;
+static unsigned int outstanding_queries = 0;
+static const char *def_server = "127.0.0.1";
+static FILE *fp;
+
+struct query_trans {
+ int id;
+ isc_boolean_t inuse;
+ dns_rdatatype_t type;
+ dns_fixedname_t fixedname;
+ dns_name_t *qname;
+ dns_namelist_t answerlist;
+ dns_clientrestrans_t *xid;
+};
+
+static struct query_trans query_array[MAX_QUERIES];
+
+static isc_result_t dispatch_query(struct query_trans *trans);
+
+static void
+ctxs_destroy(isc_mem_t **mctxp, isc_appctx_t **actxp,
+ isc_taskmgr_t **taskmgrp, isc_socketmgr_t **socketmgrp,
+ isc_timermgr_t **timermgrp)
+{
+ if (*taskmgrp != NULL)
+ isc_taskmgr_destroy(taskmgrp);
+
+ if (*timermgrp != NULL)
+ isc_timermgr_destroy(timermgrp);
+
+ if (*socketmgrp != NULL)
+ isc_socketmgr_destroy(socketmgrp);
+
+ if (*actxp != NULL)
+ isc_appctx_destroy(actxp);
+
+ if (*mctxp != NULL)
+ isc_mem_destroy(mctxp);
+}
+
+static isc_result_t
+ctxs_init(isc_mem_t **mctxp, isc_appctx_t **actxp,
+ isc_taskmgr_t **taskmgrp, isc_socketmgr_t **socketmgrp,
+ isc_timermgr_t **timermgrp)
+{
+ isc_result_t result;
+
+ result = isc_mem_create(0, 0, mctxp);
+ if (result != ISC_R_SUCCESS)
+ goto fail;
+
+ result = isc_appctx_create(*mctxp, actxp);
+ if (result != ISC_R_SUCCESS)
+ goto fail;
+
+ result = isc_taskmgr_createinctx(*mctxp, *actxp, 1, 0, taskmgrp);
+ if (result != ISC_R_SUCCESS)
+ goto fail;
+
+ result = isc_socketmgr_createinctx(*mctxp, *actxp, socketmgrp);
+ if (result != ISC_R_SUCCESS)
+ goto fail;
+
+ result = isc_timermgr_createinctx(*mctxp, *actxp, timermgrp);
+ if (result != ISC_R_SUCCESS)
+ goto fail;
+
+ return (ISC_R_SUCCESS);
+
+ fail:
+ ctxs_destroy(mctxp, actxp, taskmgrp, socketmgrp, timermgrp);
+
+ return (result);
+}
+
+static isc_result_t
+printdata(dns_rdataset_t *rdataset, dns_name_t *owner) {
+ isc_buffer_t target;
+ isc_result_t result;
+ isc_region_t r;
+ char t[4096];
+
+ isc_buffer_init(&target, t, sizeof(t));
+
+ if (!dns_rdataset_isassociated(rdataset))
+ return (ISC_R_SUCCESS);
+ result = dns_rdataset_totext(rdataset, owner, ISC_FALSE, ISC_FALSE,
+ &target);
+ if (result != ISC_R_SUCCESS)
+ return (result);
+ isc_buffer_usedregion(&target, &r);
+ printf(" %.*s", (int)r.length, (char *)r.base);
+
+ return (ISC_R_SUCCESS);
+}
+
+static void
+process_answer(isc_task_t *task, isc_event_t *event) {
+ struct query_trans *trans = event->ev_arg;
+ dns_clientresevent_t *rev = (dns_clientresevent_t *)event;
+ dns_name_t *name;
+ dns_rdataset_t *rdataset;
+ isc_result_t result;
+
+ REQUIRE(task == query_task);
+ REQUIRE(trans->inuse == ISC_TRUE);
+ REQUIRE(outstanding_queries > 0);
+
+ printf("answer[%2d]\n", trans->id);
+
+ if (rev->result != ISC_R_SUCCESS)
+ printf(" failed: %d(%s)\n", rev->result,
+ dns_result_totext(rev->result));
+
+ for (name = ISC_LIST_HEAD(rev->answerlist); name != NULL;
+ name = ISC_LIST_NEXT(name, link)) {
+ for (rdataset = ISC_LIST_HEAD(name->list);
+ rdataset != NULL;
+ rdataset = ISC_LIST_NEXT(rdataset, link)) {
+ (void)printdata(rdataset, name);
+ }
+ }
+
+ dns_client_freeresanswer(client, &rev->answerlist);
+ dns_client_destroyrestrans(&trans->xid);
+
+ isc_event_free(&event);
+
+ trans->inuse = ISC_FALSE;
+ dns_fixedname_invalidate(&trans->fixedname);
+ trans->qname = NULL;
+ outstanding_queries--;
+
+ result = dispatch_query(trans);
+#if 0 /* for cancel test */
+ if (result == ISC_R_SUCCESS) {
+ static int count = 0;
+
+ if ((++count) % 10 == 0)
+ dns_client_cancelresolve(trans->xid);
+ }
+#endif
+ if (result == ISC_R_NOMORE && outstanding_queries == 0)
+ isc_app_ctxshutdown(query_actx);
+}
+
+static isc_result_t
+dispatch_query(struct query_trans *trans) {
+ isc_result_t result;
+ size_t namelen;
+ isc_buffer_t b;
+ char buf[4096]; /* XXX ad hoc constant, but should be enough */
+ char *cp;
+
+ REQUIRE(trans != NULL);
+ REQUIRE(trans->inuse == ISC_FALSE);
+ REQUIRE(ISC_LIST_EMPTY(trans->answerlist));
+ REQUIRE(outstanding_queries < MAX_QUERIES);
+
+ /* Construct qname */
+ cp = fgets(buf, sizeof(buf), fp);
+ if (cp == NULL)
+ return (ISC_R_NOMORE);
+ /* zap NL if any */
+ if ((cp = strchr(buf, '\n')) != NULL)
+ *cp = '\0';
+ namelen = strlen(buf);
+ isc_buffer_init(&b, buf, namelen);
+ isc_buffer_add(&b, namelen);
+ dns_fixedname_init(&trans->fixedname);
+ trans->qname = dns_fixedname_name(&trans->fixedname);
+ result = dns_name_fromtext(trans->qname, &b, dns_rootname, 0, NULL);
+ if (result != ISC_R_SUCCESS)
+ goto cleanup;
+
+ /* Start resolution */
+ result = dns_client_startresolve(client, trans->qname,
+ dns_rdataclass_in, trans->type, 0,
+ query_task, process_answer, trans,
+ &trans->xid);
+ if (result != ISC_R_SUCCESS)
+ goto cleanup;
+
+ trans->inuse = ISC_TRUE;
+ outstanding_queries++;
+
+ return (ISC_R_SUCCESS);
+
+ cleanup:
+ dns_fixedname_invalidate(&trans->fixedname);
+
+ return (result);
+}
+
+ISC_PLATFORM_NORETURN_PRE static void
+usage(void) ISC_PLATFORM_NORETURN_POST;
+
+static void
+usage(void) {
+ fprintf(stderr, "usage: sample-async [-s server_address] [-t RR type] "
+ "input_file\n");
+
+ exit(1);
+}
+
+int
+main(int argc, char *argv[]) {
+ int ch;
+ isc_textregion_t tr;
+ isc_mem_t *mctx = NULL;
+ isc_taskmgr_t *taskmgr = NULL;
+ isc_socketmgr_t *socketmgr = NULL;
+ isc_timermgr_t *timermgr = NULL;
+ int nservers = 0;
+ const char *serveraddr[MAX_SERVERS];
+ isc_sockaddr_t sa[MAX_SERVERS];
+ isc_sockaddrlist_t servers;
+ dns_rdatatype_t type = dns_rdatatype_a;
+ struct in_addr inaddr;
+ isc_result_t result;
+ int i;
+
+ while ((ch = getopt(argc, argv, "s:t:")) != -1) {
+ switch (ch) {
+ case 't':
+ tr.base = optarg;
+ tr.length = strlen(optarg);
+ result = dns_rdatatype_fromtext(&type, &tr);
+ if (result != ISC_R_SUCCESS) {
+ fprintf(stderr,
+ "invalid RRtype: %s\n", optarg);
+ exit(1);
+ }
+ break;
+ case 's':
+ if (nservers == MAX_SERVERS) {
+ fprintf(stderr,
+ "too many servers (up to %d)\n",
+ MAX_SERVERS);
+ exit(1);
+ }
+ serveraddr[nservers++] = (const char *)optarg;
+ break;
+ default:
+ usage();
+ }
+ }
+
+ argc -= optind;
+ argv += optind;
+ if (argc < 1)
+ usage();
+
+ if (nservers == 0) {
+ nservers = 1;
+ serveraddr[0] = def_server;
+ }
+
+ for (i = 0; i < MAX_QUERIES; i++) {
+ query_array[i].id = i;
+ query_array[i].inuse = ISC_FALSE;
+ query_array[i].type = type;
+ dns_fixedname_init(&query_array[i].fixedname);
+ query_array[i].qname = NULL;
+ ISC_LIST_INIT(query_array[i].answerlist);
+ query_array[i].xid = NULL;
+ }
+
+ isc_lib_register();
+ result = dns_lib_init();
+ if (result != ISC_R_SUCCESS) {
+ fprintf(stderr, "dns_lib_init failed: %d\n", result);
+ exit(1);
+ }
+
+ result = ctxs_init(&mctx, &query_actx, &taskmgr, &socketmgr,
+ &timermgr);
+ if (result != ISC_R_SUCCESS) {
+ fprintf(stderr, "ctx create failed: %d\n", result);
+ exit(1);
+ }
+
+ isc_app_ctxstart(query_actx);
+
+ result = dns_client_createx(mctx, query_actx, taskmgr, socketmgr,
+ timermgr, 0, &client);
+ if (result != ISC_R_SUCCESS) {
+ fprintf(stderr, "dns_client_createx failed: %d\n", result);
+ exit(1);
+ }
+
+ /* Set nameservers */
+ ISC_LIST_INIT(servers);
+ for (i = 0; i < nservers; i++) {
+ if (inet_pton(AF_INET, serveraddr[i], &inaddr) != 1) {
+ fprintf(stderr, "failed to parse IPv4 address %s\n",
+ serveraddr[i]);
+ exit(1);
+ }
+ isc_sockaddr_fromin(&sa[i], &inaddr, 53);
+ ISC_LIST_APPEND(servers, &sa[i], link);
+ }
+ result = dns_client_setservers(client, dns_rdataclass_in, NULL,
+ &servers);
+ if (result != ISC_R_SUCCESS) {
+ fprintf(stderr, "set server failed: %d\n", result);
+ exit(1);
+ }
+
+ /* Create the main task */
+ query_task = NULL;
+ result = isc_task_create(taskmgr, 0, &query_task);
+ if (result != ISC_R_SUCCESS) {
+ fprintf(stderr, "failed to create task: %d\n", result);
+ exit(1);
+ }
+
+ /* Open input file */
+ fp = fopen(argv[0], "r");
+ if (fp == NULL) {
+ fprintf(stderr, "failed to open input file: %s\n", argv[1]);
+ exit(1);
+ }
+
+ /* Dispatch initial queries */
+ for (i = 0; i < MAX_QUERIES; i++) {
+ result = dispatch_query(&query_array[i]);
+ if (result == ISC_R_NOMORE)
+ break;
+ }
+
+ /* Start event loop */
+ isc_app_ctxrun(query_actx);
+
+ /* Sanity check */
+ for (i = 0; i < MAX_QUERIES; i++)
+ INSIST(query_array[i].inuse == ISC_FALSE);
+
+ /* Cleanup */
+ isc_task_detach(&query_task);
+ dns_client_destroy(&client);
+ dns_lib_shutdown();
+ isc_app_ctxfinish(query_actx);
+ ctxs_destroy(&mctx, &query_actx, &taskmgr, &socketmgr, &timermgr);
+
+ exit(0);
+}
diff --git a/contrib/bind9/lib/export/samples/sample-gai.c b/contrib/bind9/lib/export/samples/sample-gai.c
new file mode 100644
index 0000000..7c07f1b
--- /dev/null
+++ b/contrib/bind9/lib/export/samples/sample-gai.c
@@ -0,0 +1,77 @@
+/*
+ * Copyright (C) 2009 Internet Systems Consortium, Inc. ("ISC")
+ *
+ * Permission to use, copy, modify, and/or 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 ISC DISCLAIMS ALL WARRANTIES WITH
+ * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+ * AND FITNESS. IN NO EVENT SHALL ISC 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.
+ */
+
+/* $Id: sample-gai.c,v 1.4 2009-09-02 23:48:02 tbox Exp $ */
+
+#include <config.h>
+
+#include <sys/types.h>
+#include <sys/socket.h>
+
+#include <irs/netdb.h>
+
+#include <stdlib.h>
+#include <string.h>
+#include <stdio.h>
+
+static void
+do_gai(int family, char *hostname) {
+ struct addrinfo hints, *res, *res0;
+ int error;
+ char namebuf[1024], addrbuf[1024], servbuf[1024];
+
+ memset(&hints, 0, sizeof(hints));
+ hints.ai_family = family;
+ hints.ai_socktype = SOCK_STREAM;
+ hints.ai_flags = AI_CANONNAME;
+ error = getaddrinfo(hostname, "http", &hints, &res0);
+ if (error) {
+ fprintf(stderr, "getaddrinfo failed for %s,family=%d: %s\n",
+ hostname, family, gai_strerror(error));
+ return;
+ }
+
+ for (res = res0; res; res = res->ai_next) {
+ error = getnameinfo(res->ai_addr, res->ai_addrlen,
+ addrbuf, sizeof(addrbuf),
+ NULL, 0, NI_NUMERICHOST);
+ if (error == 0)
+ error = getnameinfo(res->ai_addr, res->ai_addrlen,
+ namebuf, sizeof(namebuf),
+ servbuf, sizeof(servbuf), 0);
+ if (error != 0) {
+ fprintf(stderr, "getnameinfo failed: %s\n",
+ gai_strerror(error));
+ } else {
+ printf("%s(%s/%s)=%s:%s\n", hostname,
+ res->ai_canonname, addrbuf, namebuf, servbuf);
+ }
+ }
+
+ freeaddrinfo(res);
+}
+
+int
+main(int argc, char *argv[]) {
+ if (argc < 2)
+ exit(1);
+
+ do_gai(AF_INET, argv[1]);
+ do_gai(AF_INET6, argv[1]);
+ do_gai(AF_UNSPEC, argv[1]);
+
+ exit(0);
+}
diff --git a/contrib/bind9/lib/export/samples/sample-request.c b/contrib/bind9/lib/export/samples/sample-request.c
new file mode 100644
index 0000000..4331498
--- /dev/null
+++ b/contrib/bind9/lib/export/samples/sample-request.c
@@ -0,0 +1,263 @@
+/*
+ * Copyright (C) 2009 Internet Systems Consortium, Inc. ("ISC")
+ *
+ * Permission to use, copy, modify, and/or 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 ISC DISCLAIMS ALL WARRANTIES WITH
+ * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+ * AND FITNESS. IN NO EVENT SHALL ISC 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.
+ */
+
+/* $Id: sample-request.c,v 1.5 2009-09-29 15:06:07 fdupont Exp $ */
+
+#include <config.h>
+
+#include <sys/types.h>
+#include <sys/socket.h>
+
+#include <netinet/in.h>
+
+#include <arpa/inet.h>
+
+#include <unistd.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <netdb.h>
+
+#include <isc/base64.h>
+#include <isc/buffer.h>
+#include <isc/lib.h>
+#include <isc/mem.h>
+#include <isc/sockaddr.h>
+#include <isc/util.h>
+
+#include <dns/client.h>
+#include <dns/fixedname.h>
+#include <dns/keyvalues.h>
+#include <dns/lib.h>
+#include <dns/masterdump.h>
+#include <dns/message.h>
+#include <dns/name.h>
+#include <dns/rdata.h>
+#include <dns/rdataset.h>
+#include <dns/rdatastruct.h>
+#include <dns/rdatatype.h>
+#include <dns/result.h>
+#include <dns/secalg.h>
+
+#include <dst/dst.h>
+
+static isc_mem_t *mctx;
+static dns_fixedname_t fixedqname;
+
+ISC_PLATFORM_NORETURN_PRE static void
+usage(void) ISC_PLATFORM_NORETURN_POST;
+
+static void
+usage(void) {
+ fprintf(stderr, "sample-request [-t RRtype] server_address hostname\n");
+
+ exit(1);
+}
+
+static isc_result_t
+make_querymessage(dns_message_t *message, const char *namestr,
+ dns_rdatatype_t rdtype)
+{
+ dns_name_t *qname = NULL, *qname0;
+ dns_rdataset_t *qrdataset = NULL;
+ isc_result_t result;
+ isc_buffer_t b;
+ size_t namelen;
+
+ /* Construct qname */
+ namelen = strlen(namestr);
+ isc_buffer_init(&b, namestr, namelen);
+ isc_buffer_add(&b, namelen);
+ dns_fixedname_init(&fixedqname);
+ qname0 = dns_fixedname_name(&fixedqname);
+ result = dns_name_fromtext(qname0, &b, dns_rootname, 0, NULL);
+ if (result != ISC_R_SUCCESS) {
+ fprintf(stderr, "failed to convert qname: %d\n", result);
+ return (result);
+ }
+
+ /* Construct query message */
+ message->opcode = dns_opcode_query;
+ message->rdclass = dns_rdataclass_in;
+
+ result = dns_message_gettempname(message, &qname);
+ if (result != ISC_R_SUCCESS)
+ goto cleanup;
+
+ result = dns_message_gettemprdataset(message, &qrdataset);
+ if (result != ISC_R_SUCCESS)
+ goto cleanup;
+
+ dns_name_init(qname, NULL);
+ dns_name_clone(qname0, qname);
+ dns_rdataset_init(qrdataset);
+ dns_rdataset_makequestion(qrdataset, message->rdclass, rdtype);
+ ISC_LIST_APPEND(qname->list, qrdataset, link);
+ dns_message_addname(message, qname, DNS_SECTION_QUESTION);
+
+ return (ISC_R_SUCCESS);
+
+ cleanup:
+ if (qname != NULL)
+ dns_message_puttempname(message, &qname);
+ if (qrdataset != NULL)
+ dns_message_puttemprdataset(message, &qrdataset);
+ if (message != NULL)
+ dns_message_destroy(&message);
+ return (result);
+}
+
+static void
+print_section(dns_message_t *message, int section, isc_buffer_t *buf) {
+ isc_result_t result;
+ isc_region_t r;
+
+ result = dns_message_sectiontotext(message, section,
+ &dns_master_style_full, 0, buf);
+ if (result != ISC_R_SUCCESS)
+ goto fail;
+
+ isc_buffer_usedregion(buf, &r);
+ printf("%.*s", (int)r.length, (char *)r.base);
+
+ return;
+
+ fail:
+ fprintf(stderr, "failed to convert a section\n");
+}
+
+int
+main(int argc, char *argv[]) {
+ int ch, i, gai_error;
+ struct addrinfo hints, *res;
+ isc_textregion_t tr;
+ dns_client_t *client = NULL;
+ isc_result_t result;
+ isc_sockaddr_t sa;
+ dns_message_t *qmessage, *rmessage;
+ dns_rdatatype_t type = dns_rdatatype_a;
+ isc_buffer_t *outputbuf;
+
+ while ((ch = getopt(argc, argv, "t:")) != -1) {
+ switch (ch) {
+ case 't':
+ tr.base = optarg;
+ tr.length = strlen(optarg);
+ result = dns_rdatatype_fromtext(&type, &tr);
+ if (result != ISC_R_SUCCESS) {
+ fprintf(stderr,
+ "invalid RRtype: %s\n", optarg);
+ exit(1);
+ }
+ break;
+ default:
+ usage();
+ }
+ }
+
+ argc -= optind;
+ argv += optind;
+ if (argc < 2)
+ usage();
+
+ isc_lib_register();
+ result = dns_lib_init();
+ if (result != ISC_R_SUCCESS) {
+ fprintf(stderr, "dns_lib_init failed: %d\n", result);
+ exit(1);
+ }
+
+ result = dns_client_create(&client, 0);
+ if (result != ISC_R_SUCCESS) {
+ fprintf(stderr, "dns_client_create failed: %d\n", result);
+ exit(1);
+ }
+
+ /* Prepare message structures */
+ mctx = NULL;
+ qmessage = NULL;
+ rmessage = NULL;
+
+ result = isc_mem_create(0, 0, &mctx);
+ if (result != ISC_R_SUCCESS) {
+ fprintf(stderr, "failed to create a memory context\n");
+ exit(1);
+ }
+ result = dns_message_create(mctx, DNS_MESSAGE_INTENTRENDER, &qmessage);
+ if (result == ISC_R_SUCCESS) {
+ result = dns_message_create(mctx, DNS_MESSAGE_INTENTPARSE,
+ &rmessage);
+ }
+ if (result != ISC_R_SUCCESS) {
+ fprintf(stderr, "failed to create messages\n");
+ exit(1);
+ }
+
+ /* Initialize the nameserver address */
+ memset(&hints, 0, sizeof(hints));
+ hints.ai_family = AF_UNSPEC;
+ hints.ai_socktype = SOCK_DGRAM;
+ hints.ai_protocol = IPPROTO_UDP;
+ hints.ai_flags = AI_NUMERICHOST;
+ gai_error = getaddrinfo(argv[0], "53", &hints, &res);
+ if (gai_error != 0) {
+ fprintf(stderr, "getaddrinfo failed: %s\n",
+ gai_strerror(gai_error));
+ exit(1);
+ }
+ INSIST(res->ai_addrlen <= sizeof(sa.type));
+ memcpy(&sa.type, res->ai_addr, res->ai_addrlen);
+ freeaddrinfo(res);
+ sa.length = res->ai_addrlen;
+ ISC_LINK_INIT(&sa, link);
+
+ /* Construct qname */
+ result = make_querymessage(qmessage, argv[1], type);
+ if (result != ISC_R_SUCCESS) {
+ fprintf(stderr, "failed to create a query\n");
+ exit(1);
+ }
+
+ /* Send request and wait for a response */
+ result = dns_client_request(client, qmessage, rmessage, &sa, 0, 0,
+ NULL, 60, 0, 3);
+ if (result != ISC_R_SUCCESS) {
+ fprintf(stderr, "failed to get a response: %s\n",
+ dns_result_totext(result));
+ }
+
+ /* Dump the response */
+ outputbuf = NULL;
+ result = isc_buffer_allocate(mctx, &outputbuf, 65535);
+ if (result != ISC_R_SUCCESS) {
+ fprintf(stderr, "failed to allocate a result buffer\n");
+ exit(1);
+ }
+ for (i = 0; i < DNS_SECTION_MAX; i++) {
+ print_section(rmessage, i, outputbuf);
+ isc_buffer_clear(outputbuf);
+ }
+ isc_buffer_free(&outputbuf);
+
+ /* Cleanup */
+ dns_message_destroy(&qmessage);
+ dns_message_destroy(&rmessage);
+ isc_mem_destroy(&mctx);
+ dns_client_destroy(&client);
+ dns_lib_shutdown();
+
+ exit(0);
+}
diff --git a/contrib/bind9/lib/export/samples/sample-update.c b/contrib/bind9/lib/export/samples/sample-update.c
new file mode 100644
index 0000000..eef0a58
--- /dev/null
+++ b/contrib/bind9/lib/export/samples/sample-update.c
@@ -0,0 +1,755 @@
+/*
+ * Copyright (C) 2009, 2010 Internet Systems Consortium, Inc. ("ISC")
+ *
+ * Permission to use, copy, modify, and/or 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 ISC DISCLAIMS ALL WARRANTIES WITH
+ * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+ * AND FITNESS. IN NO EVENT SHALL ISC 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.
+ */
+
+/* $Id: sample-update.c,v 1.10 2010-12-09 00:54:34 marka Exp $ */
+
+#include <config.h>
+
+#include <sys/types.h>
+#include <sys/socket.h>
+
+#include <netinet/in.h>
+
+#include <arpa/inet.h>
+
+#include <unistd.h>
+#include <ctype.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <netdb.h>
+
+#include <isc/buffer.h>
+#include <isc/lex.h>
+#include <isc/lib.h>
+#include <isc/mem.h>
+#include <isc/parseint.h>
+#include <isc/sockaddr.h>
+#include <isc/util.h>
+
+#include <dns/callbacks.h>
+#include <dns/client.h>
+#include <dns/fixedname.h>
+#include <dns/lib.h>
+#include <dns/name.h>
+#include <dns/rdata.h>
+#include <dns/rdataclass.h>
+#include <dns/rdatalist.h>
+#include <dns/rdataset.h>
+#include <dns/rdatastruct.h>
+#include <dns/rdatatype.h>
+#include <dns/result.h>
+#include <dns/secalg.h>
+#include <dns/tsec.h>
+
+#include <dst/dst.h>
+
+static dns_tsec_t *tsec = NULL;
+static const dns_rdataclass_t default_rdataclass = dns_rdataclass_in;
+static isc_bufferlist_t usedbuffers;
+static ISC_LIST(dns_rdatalist_t) usedrdatalists;
+
+static void setup_tsec(char *keyfile, isc_mem_t *mctx);
+static void update_addordelete(isc_mem_t *mctx, char *cmdline,
+ isc_boolean_t isdelete, dns_name_t *name);
+static void evaluate_prereq(isc_mem_t *mctx, char *cmdline, dns_name_t *name);
+
+ISC_PLATFORM_NORETURN_PRE static void
+usage(void) ISC_PLATFORM_NORETURN_POST;
+
+static void
+usage(void) {
+ fprintf(stderr, "sample-update "
+ "[-a auth_server] "
+ "[-k keyfile] "
+ "[-p prerequisite] "
+ "[-r recursive_server] "
+ "[-z zonename] "
+ "(add|delete) \"name TTL RRtype RDATA\"\n");
+ exit(1);
+}
+
+int
+main(int argc, char *argv[]) {
+ int ch;
+ struct addrinfo hints, *res;
+ int gai_error;
+ dns_client_t *client = NULL;
+ char *zonenamestr = NULL;
+ char *keyfilename = NULL;
+ char *prereqstr = NULL;
+ isc_sockaddrlist_t auth_servers;
+ char *auth_server = NULL;
+ char *recursive_server = NULL;
+ isc_sockaddr_t sa_auth, sa_recursive;
+ isc_sockaddrlist_t rec_servers;
+ isc_result_t result;
+ isc_boolean_t isdelete;
+ isc_buffer_t b, *buf;
+ dns_fixedname_t zname0, pname0, uname0;
+ size_t namelen;
+ dns_name_t *zname = NULL, *uname, *pname;
+ dns_rdataset_t *rdataset;
+ dns_rdatalist_t *rdatalist;
+ dns_rdata_t *rdata;
+ dns_namelist_t updatelist, prereqlist, *prereqlistp = NULL;
+ isc_mem_t *umctx = NULL;
+
+ while ((ch = getopt(argc, argv, "a:k:p:r:z:")) != -1) {
+ switch (ch) {
+ case 'k':
+ keyfilename = optarg;
+ break;
+ case 'a':
+ auth_server = optarg;
+ break;
+ case 'p':
+ prereqstr = optarg;
+ break;
+ case 'r':
+ recursive_server = optarg;
+ break;
+ case 'z':
+ zonenamestr = optarg;
+ break;
+ default:
+ usage();
+ }
+ }
+
+ argc -= optind;
+ argv += optind;
+ if (argc < 2)
+ usage();
+
+ /* command line argument validation */
+ if (strcmp(argv[0], "delete") == 0)
+ isdelete = ISC_TRUE;
+ else if (strcmp(argv[0], "add") == 0)
+ isdelete = ISC_FALSE;
+ else {
+ fprintf(stderr, "invalid update command: %s\n", argv[0]);
+ exit(1);
+ }
+
+ if (auth_server == NULL && recursive_server == NULL) {
+ fprintf(stderr, "authoritative or recursive server "
+ "must be specified\n");
+ usage();
+ }
+
+ /* Initialization */
+ ISC_LIST_INIT(usedbuffers);
+ ISC_LIST_INIT(usedrdatalists);
+ ISC_LIST_INIT(prereqlist);
+ ISC_LIST_INIT(auth_servers);
+ isc_lib_register();
+ result = dns_lib_init();
+ if (result != ISC_R_SUCCESS) {
+ fprintf(stderr, "dns_lib_init failed: %d\n", result);
+ exit(1);
+ }
+ result = isc_mem_create(0, 0, &umctx);
+ if (result != ISC_R_SUCCESS) {
+ fprintf(stderr, "failed to crate mctx\n");
+ exit(1);
+ }
+
+ result = dns_client_create(&client, 0);
+ if (result != ISC_R_SUCCESS) {
+ fprintf(stderr, "dns_client_create failed: %d\n", result);
+ exit(1);
+ }
+
+ /* Set the authoritative server */
+ if (auth_server != NULL) {
+ memset(&hints, 0, sizeof(hints));
+ hints.ai_family = AF_UNSPEC;
+ hints.ai_socktype = SOCK_DGRAM;
+ hints.ai_protocol = IPPROTO_UDP;
+ hints.ai_flags = AI_NUMERICHOST;
+ gai_error = getaddrinfo(auth_server, "53", &hints, &res);
+ if (gai_error != 0) {
+ fprintf(stderr, "getaddrinfo failed: %s\n",
+ gai_strerror(gai_error));
+ exit(1);
+ }
+ INSIST(res->ai_addrlen <= sizeof(sa_auth.type));
+ memcpy(&sa_auth.type, res->ai_addr, res->ai_addrlen);
+ freeaddrinfo(res);
+ sa_auth.length = res->ai_addrlen;
+ ISC_LINK_INIT(&sa_auth, link);
+
+ ISC_LIST_APPEND(auth_servers, &sa_auth, link);
+ }
+
+ /* Set the recursive server */
+ if (recursive_server != NULL) {
+ memset(&hints, 0, sizeof(hints));
+ hints.ai_family = AF_UNSPEC;
+ hints.ai_socktype = SOCK_DGRAM;
+ hints.ai_protocol = IPPROTO_UDP;
+ hints.ai_flags = AI_NUMERICHOST;
+ gai_error = getaddrinfo(recursive_server, "53", &hints, &res);
+ if (gai_error != 0) {
+ fprintf(stderr, "getaddrinfo failed: %s\n",
+ gai_strerror(gai_error));
+ exit(1);
+ }
+ INSIST(res->ai_addrlen <= sizeof(sa_recursive.type));
+ memcpy(&sa_recursive.type, res->ai_addr, res->ai_addrlen);
+ freeaddrinfo(res);
+ sa_recursive.length = res->ai_addrlen;
+ ISC_LINK_INIT(&sa_recursive, link);
+ ISC_LIST_INIT(rec_servers);
+ ISC_LIST_APPEND(rec_servers, &sa_recursive, link);
+ result = dns_client_setservers(client, dns_rdataclass_in,
+ NULL, &rec_servers);
+ if (result != ISC_R_SUCCESS) {
+ fprintf(stderr, "set server failed: %d\n", result);
+ exit(1);
+ }
+ }
+
+ /* Construct zone name */
+ zname = NULL;
+ if (zonenamestr != NULL) {
+ namelen = strlen(zonenamestr);
+ isc_buffer_init(&b, zonenamestr, namelen);
+ isc_buffer_add(&b, namelen);
+ dns_fixedname_init(&zname0);
+ zname = dns_fixedname_name(&zname0);
+ result = dns_name_fromtext(zname, &b, dns_rootname, 0, NULL);
+ if (result != ISC_R_SUCCESS)
+ fprintf(stderr, "failed to convert zone name: %d\n",
+ result);
+ }
+
+ /* Construct prerequisite name (if given) */
+ if (prereqstr != NULL) {
+ dns_fixedname_init(&pname0);
+ pname = dns_fixedname_name(&pname0);
+ evaluate_prereq(umctx, prereqstr, pname);
+ ISC_LIST_APPEND(prereqlist, pname, link);
+ prereqlistp = &prereqlist;
+ }
+
+ /* Construct update name */
+ ISC_LIST_INIT(updatelist);
+ dns_fixedname_init(&uname0);
+ uname = dns_fixedname_name(&uname0);
+ update_addordelete(umctx, argv[1], isdelete, uname);
+ ISC_LIST_APPEND(updatelist, uname, link);
+
+ /* Set up TSIG/SIG(0) key (if given) */
+ if (keyfilename != NULL)
+ setup_tsec(keyfilename, umctx);
+
+ /* Perform update */
+ result = dns_client_update(client,
+ default_rdataclass, /* XXX: fixed */
+ zname, prereqlistp, &updatelist,
+ (auth_server == NULL) ? NULL :
+ &auth_servers, tsec, 0);
+ if (result != ISC_R_SUCCESS) {
+ fprintf(stderr,
+ "update failed: %s\n", dns_result_totext(result));
+ } else
+ fprintf(stderr, "update succeeded\n");
+
+ /* Cleanup */
+ while ((pname = ISC_LIST_HEAD(prereqlist)) != NULL) {
+ while ((rdataset = ISC_LIST_HEAD(pname->list)) != NULL) {
+ ISC_LIST_UNLINK(pname->list, rdataset, link);
+ dns_rdataset_disassociate(rdataset);
+ isc_mem_put(umctx, rdataset, sizeof(*rdataset));
+ }
+ ISC_LIST_UNLINK(prereqlist, pname, link);
+ }
+ while ((uname = ISC_LIST_HEAD(updatelist)) != NULL) {
+ while ((rdataset = ISC_LIST_HEAD(uname->list)) != NULL) {
+ ISC_LIST_UNLINK(uname->list, rdataset, link);
+ dns_rdataset_disassociate(rdataset);
+ isc_mem_put(umctx, rdataset, sizeof(*rdataset));
+ }
+ ISC_LIST_UNLINK(updatelist, uname, link);
+ }
+ while ((rdatalist = ISC_LIST_HEAD(usedrdatalists)) != NULL) {
+ while ((rdata = ISC_LIST_HEAD(rdatalist->rdata)) != NULL) {
+ ISC_LIST_UNLINK(rdatalist->rdata, rdata, link);
+ isc_mem_put(umctx, rdata, sizeof(*rdata));
+ }
+ ISC_LIST_UNLINK(usedrdatalists, rdatalist, link);
+ isc_mem_put(umctx, rdatalist, sizeof(*rdatalist));
+ }
+ while ((buf = ISC_LIST_HEAD(usedbuffers)) != NULL) {
+ ISC_LIST_UNLINK(usedbuffers, buf, link);
+ isc_buffer_free(&buf);
+ }
+ if (tsec != NULL)
+ dns_tsec_destroy(&tsec);
+ isc_mem_destroy(&umctx);
+ dns_client_destroy(&client);
+ dns_lib_shutdown();
+
+ exit(0);
+}
+
+/*
+ * Subroutines borrowed from nsupdate.c
+ */
+#define MAXWIRE (64 * 1024)
+#define TTL_MAX 2147483647U /* Maximum signed 32 bit integer. */
+
+static char *
+nsu_strsep(char **stringp, const char *delim) {
+ char *string = *stringp;
+ char *s;
+ const char *d;
+ char sc, dc;
+
+ if (string == NULL)
+ return (NULL);
+
+ for (; *string != '\0'; string++) {
+ sc = *string;
+ for (d = delim; (dc = *d) != '\0'; d++) {
+ if (sc == dc)
+ break;
+ }
+ if (dc == 0)
+ break;
+ }
+
+ for (s = string; *s != '\0'; s++) {
+ sc = *s;
+ for (d = delim; (dc = *d) != '\0'; d++) {
+ if (sc == dc) {
+ *s++ = '\0';
+ *stringp = s;
+ return (string);
+ }
+ }
+ }
+ *stringp = NULL;
+ return (string);
+}
+
+static void
+fatal(const char *format, ...) {
+ va_list args;
+
+ va_start(args, format);
+ vfprintf(stderr, format, args);
+ va_end(args);
+ fprintf(stderr, "\n");
+ exit(1);
+}
+
+static inline void
+check_result(isc_result_t result, const char *msg) {
+ if (result != ISC_R_SUCCESS)
+ fatal("%s: %s", msg, isc_result_totext(result));
+}
+
+static void
+parse_name(char **cmdlinep, dns_name_t *name) {
+ isc_result_t result;
+ char *word;
+ isc_buffer_t source;
+
+ word = nsu_strsep(cmdlinep, " \t\r\n");
+ if (*word == 0) {
+ fprintf(stderr, "could not read owner name\n");
+ exit(1);
+ }
+
+ isc_buffer_init(&source, word, strlen(word));
+ isc_buffer_add(&source, strlen(word));
+ result = dns_name_fromtext(name, &source, dns_rootname, 0, NULL);
+ check_result(result, "dns_name_fromtext");
+ isc_buffer_invalidate(&source);
+}
+
+static void
+parse_rdata(isc_mem_t *mctx, char **cmdlinep, dns_rdataclass_t rdataclass,
+ dns_rdatatype_t rdatatype, dns_rdata_t *rdata)
+{
+ char *cmdline = *cmdlinep;
+ isc_buffer_t source, *buf = NULL, *newbuf = NULL;
+ isc_region_t r;
+ isc_lex_t *lex = NULL;
+ dns_rdatacallbacks_t callbacks;
+ isc_result_t result;
+
+ while (cmdline != NULL && *cmdline != 0 &&
+ isspace((unsigned char)*cmdline))
+ cmdline++;
+
+ if (cmdline != NULL && *cmdline != 0) {
+ dns_rdatacallbacks_init(&callbacks);
+ result = isc_lex_create(mctx, strlen(cmdline), &lex);
+ check_result(result, "isc_lex_create");
+ isc_buffer_init(&source, cmdline, strlen(cmdline));
+ isc_buffer_add(&source, strlen(cmdline));
+ result = isc_lex_openbuffer(lex, &source);
+ check_result(result, "isc_lex_openbuffer");
+ result = isc_buffer_allocate(mctx, &buf, MAXWIRE);
+ check_result(result, "isc_buffer_allocate");
+ result = dns_rdata_fromtext(rdata, rdataclass, rdatatype, lex,
+ dns_rootname, 0, mctx, buf,
+ &callbacks);
+ isc_lex_destroy(&lex);
+ if (result == ISC_R_SUCCESS) {
+ isc_buffer_usedregion(buf, &r);
+ result = isc_buffer_allocate(mctx, &newbuf, r.length);
+ check_result(result, "isc_buffer_allocate");
+ isc_buffer_putmem(newbuf, r.base, r.length);
+ isc_buffer_usedregion(newbuf, &r);
+ dns_rdata_reset(rdata);
+ dns_rdata_fromregion(rdata, rdataclass, rdatatype, &r);
+ isc_buffer_free(&buf);
+ ISC_LIST_APPEND(usedbuffers, newbuf, link);
+ } else {
+ fprintf(stderr, "invalid rdata format: %s\n",
+ isc_result_totext(result));
+ isc_buffer_free(&buf);
+ exit(1);
+ }
+ } else {
+ rdata->flags = DNS_RDATA_UPDATE;
+ }
+ *cmdlinep = cmdline;
+}
+
+static void
+update_addordelete(isc_mem_t *mctx, char *cmdline, isc_boolean_t isdelete,
+ dns_name_t *name)
+{
+ isc_result_t result;
+ isc_uint32_t ttl;
+ char *word;
+ dns_rdataclass_t rdataclass;
+ dns_rdatatype_t rdatatype;
+ dns_rdata_t *rdata = NULL;
+ dns_rdatalist_t *rdatalist = NULL;
+ dns_rdataset_t *rdataset = NULL;
+ isc_textregion_t region;
+
+ /*
+ * Read the owner name.
+ */
+ parse_name(&cmdline, name);
+
+ rdata = isc_mem_get(mctx, sizeof(*rdata));
+ if (rdata == NULL) {
+ fprintf(stderr, "memory allocation for rdata failed\n");
+ exit(1);
+ }
+ dns_rdata_init(rdata);
+
+ /*
+ * If this is an add, read the TTL and verify that it's in range.
+ * If it's a delete, ignore a TTL if present (for compatibility).
+ */
+ word = nsu_strsep(&cmdline, " \t\r\n");
+ if (word == NULL || *word == 0) {
+ if (!isdelete) {
+ fprintf(stderr, "could not read owner ttl\n");
+ exit(1);
+ }
+ else {
+ ttl = 0;
+ rdataclass = dns_rdataclass_any;
+ rdatatype = dns_rdatatype_any;
+ rdata->flags = DNS_RDATA_UPDATE;
+ goto doneparsing;
+ }
+ }
+ result = isc_parse_uint32(&ttl, word, 10);
+ if (result != ISC_R_SUCCESS) {
+ if (isdelete) {
+ ttl = 0;
+ goto parseclass;
+ } else {
+ fprintf(stderr, "ttl '%s': %s\n", word,
+ isc_result_totext(result));
+ exit(1);
+ }
+ }
+
+ if (isdelete)
+ ttl = 0;
+ else if (ttl > TTL_MAX) {
+ fprintf(stderr, "ttl '%s' is out of range (0 to %u)\n",
+ word, TTL_MAX);
+ exit(1);
+ }
+
+ /*
+ * Read the class or type.
+ */
+ word = nsu_strsep(&cmdline, " \t\r\n");
+ parseclass:
+ if (word == NULL || *word == 0) {
+ if (isdelete) {
+ rdataclass = dns_rdataclass_any;
+ rdatatype = dns_rdatatype_any;
+ rdata->flags = DNS_RDATA_UPDATE;
+ goto doneparsing;
+ } else {
+ fprintf(stderr, "could not read class or type\n");
+ exit(1);
+ }
+ }
+ region.base = word;
+ region.length = strlen(word);
+ result = dns_rdataclass_fromtext(&rdataclass, &region);
+ if (result == ISC_R_SUCCESS) {
+ /*
+ * Now read the type.
+ */
+ word = nsu_strsep(&cmdline, " \t\r\n");
+ if (word == NULL || *word == 0) {
+ if (isdelete) {
+ rdataclass = dns_rdataclass_any;
+ rdatatype = dns_rdatatype_any;
+ rdata->flags = DNS_RDATA_UPDATE;
+ goto doneparsing;
+ } else {
+ fprintf(stderr, "could not read type\n");
+ exit(1);
+ }
+ }
+ region.base = word;
+ region.length = strlen(word);
+ result = dns_rdatatype_fromtext(&rdatatype, &region);
+ if (result != ISC_R_SUCCESS) {
+ fprintf(stderr, "'%s' is not a valid type: %s\n",
+ word, isc_result_totext(result));
+ exit(1);
+ }
+ } else {
+ rdataclass = default_rdataclass;
+ result = dns_rdatatype_fromtext(&rdatatype, &region);
+ if (result != ISC_R_SUCCESS) {
+ fprintf(stderr, "'%s' is not a valid class or type: "
+ "%s\n", word, isc_result_totext(result));
+ exit(1);
+ }
+ }
+
+ parse_rdata(mctx, &cmdline, rdataclass, rdatatype, rdata);
+
+ if (isdelete) {
+ if ((rdata->flags & DNS_RDATA_UPDATE) != 0)
+ rdataclass = dns_rdataclass_any;
+ else
+ rdataclass = dns_rdataclass_none;
+ } else {
+ if ((rdata->flags & DNS_RDATA_UPDATE) != 0) {
+ fprintf(stderr, "could not read rdata\n");
+ exit(1);
+ }
+ }
+
+ doneparsing:
+
+ rdatalist = isc_mem_get(mctx, sizeof(*rdatalist));
+ if (rdatalist == NULL) {
+ fprintf(stderr, "memory allocation for rdatalist failed\n");
+ exit(1);
+ }
+ dns_rdatalist_init(rdatalist);
+ rdatalist->type = rdatatype;
+ rdatalist->rdclass = rdataclass;
+ rdatalist->covers = rdatatype;
+ rdatalist->ttl = (dns_ttl_t)ttl;
+ ISC_LIST_INIT(rdatalist->rdata);
+ ISC_LIST_APPEND(rdatalist->rdata, rdata, link);
+ ISC_LIST_APPEND(usedrdatalists, rdatalist, link);
+
+ rdataset = isc_mem_get(mctx, sizeof(*rdataset));
+ if (rdataset == NULL) {
+ fprintf(stderr, "memory allocation for rdataset failed\n");
+ exit(1);
+ }
+ dns_rdataset_init(rdataset);
+ dns_rdatalist_tordataset(rdatalist, rdataset);
+ ISC_LIST_INIT(name->list);
+ ISC_LIST_APPEND(name->list, rdataset, link);
+}
+
+static void
+make_prereq(isc_mem_t *mctx, char *cmdline, isc_boolean_t ispositive,
+ isc_boolean_t isrrset, dns_name_t *name)
+{
+ isc_result_t result;
+ char *word;
+ isc_textregion_t region;
+ dns_rdataset_t *rdataset = NULL;
+ dns_rdatalist_t *rdatalist = NULL;
+ dns_rdataclass_t rdataclass;
+ dns_rdatatype_t rdatatype;
+ dns_rdata_t *rdata = NULL;
+
+ /*
+ * Read the owner name
+ */
+ parse_name(&cmdline, name);
+
+ /*
+ * If this is an rrset prereq, read the class or type.
+ */
+ if (isrrset) {
+ word = nsu_strsep(&cmdline, " \t\r\n");
+ if (word == NULL || *word == 0) {
+ fprintf(stderr, "could not read class or type\n");
+ exit(1);
+ }
+ region.base = word;
+ region.length = strlen(word);
+ result = dns_rdataclass_fromtext(&rdataclass, &region);
+ if (result == ISC_R_SUCCESS) {
+ /*
+ * Now read the type.
+ */
+ word = nsu_strsep(&cmdline, " \t\r\n");
+ if (word == NULL || *word == 0) {
+ fprintf(stderr, "could not read type\n");
+ exit(1);
+ }
+ region.base = word;
+ region.length = strlen(word);
+ result = dns_rdatatype_fromtext(&rdatatype, &region);
+ if (result != ISC_R_SUCCESS) {
+ fprintf(stderr, "invalid type: %s\n", word);
+ exit(1);
+ }
+ } else {
+ rdataclass = default_rdataclass;
+ result = dns_rdatatype_fromtext(&rdatatype, &region);
+ if (result != ISC_R_SUCCESS) {
+ fprintf(stderr, "invalid type: %s\n", word);
+ exit(1);
+ }
+ }
+ } else
+ rdatatype = dns_rdatatype_any;
+
+ rdata = isc_mem_get(mctx, sizeof(*rdata));
+ if (rdata == NULL) {
+ fprintf(stderr, "memory allocation for rdata failed\n");
+ exit(1);
+ }
+ dns_rdata_init(rdata);
+
+ if (isrrset && ispositive)
+ parse_rdata(mctx, &cmdline, rdataclass, rdatatype, rdata);
+ else
+ rdata->flags = DNS_RDATA_UPDATE;
+
+ rdatalist = isc_mem_get(mctx, sizeof(*rdatalist));
+ if (rdatalist == NULL) {
+ fprintf(stderr, "memory allocation for rdatalist failed\n");
+ exit(1);
+ }
+ dns_rdatalist_init(rdatalist);
+ rdatalist->type = rdatatype;
+ if (ispositive) {
+ if (isrrset && rdata->data != NULL)
+ rdatalist->rdclass = rdataclass;
+ else
+ rdatalist->rdclass = dns_rdataclass_any;
+ } else
+ rdatalist->rdclass = dns_rdataclass_none;
+ rdatalist->covers = 0;
+ rdatalist->ttl = 0;
+ rdata->rdclass = rdatalist->rdclass;
+ rdata->type = rdatatype;
+ ISC_LIST_INIT(rdatalist->rdata);
+ ISC_LIST_APPEND(rdatalist->rdata, rdata, link);
+ ISC_LIST_APPEND(usedrdatalists, rdatalist, link);
+
+ rdataset = isc_mem_get(mctx, sizeof(*rdataset));
+ if (rdataset == NULL) {
+ fprintf(stderr, "memory allocation for rdataset failed\n");
+ exit(1);
+ }
+ dns_rdataset_init(rdataset);
+ dns_rdatalist_tordataset(rdatalist, rdataset);
+ ISC_LIST_INIT(name->list);
+ ISC_LIST_APPEND(name->list, rdataset, link);
+}
+
+static void
+evaluate_prereq(isc_mem_t *mctx, char *cmdline, dns_name_t *name) {
+ char *word;
+ isc_boolean_t ispositive, isrrset;
+
+ word = nsu_strsep(&cmdline, " \t\r\n");
+ if (word == NULL || *word == 0) {
+ fprintf(stderr, "could not read operation code\n");
+ exit(1);
+ }
+ if (strcasecmp(word, "nxdomain") == 0) {
+ ispositive = ISC_FALSE;
+ isrrset = ISC_FALSE;
+ } else if (strcasecmp(word, "yxdomain") == 0) {
+ ispositive = ISC_TRUE;
+ isrrset = ISC_FALSE;
+ } else if (strcasecmp(word, "nxrrset") == 0) {
+ ispositive = ISC_FALSE;
+ isrrset = ISC_TRUE;
+ } else if (strcasecmp(word, "yxrrset") == 0) {
+ ispositive = ISC_TRUE;
+ isrrset = ISC_TRUE;
+ } else {
+ fprintf(stderr, "incorrect operation code: %s\n", word);
+ exit(1);
+ }
+
+ make_prereq(mctx, cmdline, ispositive, isrrset, name);
+}
+
+static void
+setup_tsec(char *keyfile, isc_mem_t *mctx) {
+ dst_key_t *dstkey = NULL;
+ isc_result_t result;
+ dns_tsectype_t tsectype;
+
+ result = dst_key_fromnamedfile(keyfile, NULL,
+ DST_TYPE_PRIVATE | DST_TYPE_KEY, mctx,
+ &dstkey);
+ if (result != ISC_R_SUCCESS) {
+ fprintf(stderr, "could not read key from %s: %s\n",
+ keyfile, isc_result_totext(result));
+ exit(1);
+ }
+
+ if (dst_key_alg(dstkey) == DST_ALG_HMACMD5)
+ tsectype = dns_tsectype_tsig;
+ else
+ tsectype = dns_tsectype_sig0;
+
+ result = dns_tsec_create(mctx, tsectype, dstkey, &tsec);
+ dst_key_free(&dstkey);
+ if (result != ISC_R_SUCCESS) {
+ fprintf(stderr, "could not create tsec: %s\n",
+ isc_result_totext(result));
+ exit(1);
+ }
+}
diff --git a/contrib/bind9/lib/export/samples/sample.c b/contrib/bind9/lib/export/samples/sample.c
new file mode 100644
index 0000000..6564f0e
--- /dev/null
+++ b/contrib/bind9/lib/export/samples/sample.c
@@ -0,0 +1,378 @@
+/*
+ * Copyright (C) 2009 Internet Systems Consortium, Inc. ("ISC")
+ *
+ * Permission to use, copy, modify, and/or 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 ISC DISCLAIMS ALL WARRANTIES WITH
+ * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+ * AND FITNESS. IN NO EVENT SHALL ISC 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.
+ */
+
+/* $Id: sample.c,v 1.5 2009-09-29 15:06:07 fdupont Exp $ */
+
+#include <config.h>
+
+#include <sys/types.h>
+#include <sys/socket.h>
+
+#include <netinet/in.h>
+
+#include <arpa/inet.h>
+
+#include <unistd.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <netdb.h>
+
+#include <isc/base64.h>
+#include <isc/buffer.h>
+#include <isc/lib.h>
+#include <isc/mem.h>
+#include <isc/sockaddr.h>
+#include <isc/util.h>
+
+#include <dns/client.h>
+#include <dns/fixedname.h>
+#include <dns/keyvalues.h>
+#include <dns/lib.h>
+#include <dns/name.h>
+#include <dns/rdata.h>
+#include <dns/rdataset.h>
+#include <dns/rdatastruct.h>
+#include <dns/rdatatype.h>
+#include <dns/result.h>
+#include <dns/secalg.h>
+
+#include <dst/dst.h>
+
+static char *algname;
+
+static isc_result_t
+printdata(dns_rdataset_t *rdataset, dns_name_t *owner) {
+ isc_buffer_t target;
+ isc_result_t result;
+ isc_region_t r;
+ char t[4096];
+
+ if (!dns_rdataset_isassociated(rdataset)) {
+ printf("[WARN: empty]\n");
+ return (ISC_R_SUCCESS);
+ }
+
+ isc_buffer_init(&target, t, sizeof(t));
+
+ result = dns_rdataset_totext(rdataset, owner, ISC_FALSE, ISC_FALSE,
+ &target);
+ if (result != ISC_R_SUCCESS)
+ return (result);
+ isc_buffer_usedregion(&target, &r);
+ printf("%.*s", (int)r.length, (char *)r.base);
+
+ return (ISC_R_SUCCESS);
+}
+
+ISC_PLATFORM_NORETURN_PRE static void
+usage(void) ISC_PLATFORM_NORETURN_POST;
+
+static void
+usage(void) {
+ fprintf(stderr, "sample [-t RRtype] "
+ "[[-a algorithm] [-e] -k keyname -K keystring] "
+ "[-s domain:serveraddr_for_domain ] "
+ "server_address hostname\n");
+
+ exit(1);
+}
+
+static void
+set_key(dns_client_t *client, char *keynamestr, char *keystr,
+ isc_boolean_t is_sep, isc_mem_t **mctxp)
+{
+ isc_result_t result;
+ dns_fixedname_t fkeyname;
+ size_t namelen;
+ dns_name_t *keyname;
+ dns_rdata_dnskey_t keystruct;
+ unsigned char keydata[4096];
+ isc_buffer_t keydatabuf;
+ unsigned char rrdata[4096];
+ isc_buffer_t rrdatabuf;
+ isc_buffer_t b;
+ isc_textregion_t tr;
+ isc_region_t r;
+ dns_secalg_t alg;
+
+ result = isc_mem_create(0, 0, mctxp);
+ if (result != ISC_R_SUCCESS) {
+ fprintf(stderr, "failed to crate mctx\n");
+ exit(1);
+ }
+
+ if (algname != NULL) {
+ tr.base = algname;
+ tr.length = strlen(algname);
+ result = dns_secalg_fromtext(&alg, &tr);
+ if (result != ISC_R_SUCCESS) {
+ fprintf(stderr, "failed to identify the algorithm\n");
+ exit(1);
+ }
+ } else
+ alg = DNS_KEYALG_RSASHA1;
+
+ keystruct.common.rdclass = dns_rdataclass_in;
+ keystruct.common.rdtype = dns_rdatatype_dnskey;
+ keystruct.flags = DNS_KEYOWNER_ZONE; /* fixed */
+ if (is_sep)
+ keystruct.flags |= DNS_KEYFLAG_KSK;
+ keystruct.protocol = DNS_KEYPROTO_DNSSEC; /* fixed */
+ keystruct.algorithm = alg;
+
+ isc_buffer_init(&keydatabuf, keydata, sizeof(keydata));
+ isc_buffer_init(&rrdatabuf, rrdata, sizeof(rrdata));
+ result = isc_base64_decodestring(keystr, &keydatabuf);
+ if (result != ISC_R_SUCCESS) {
+ fprintf(stderr, "base64 decode failed\n");
+ exit(1);
+ }
+ isc_buffer_usedregion(&keydatabuf, &r);
+ keystruct.datalen = r.length;
+ keystruct.data = r.base;
+
+ result = dns_rdata_fromstruct(NULL, keystruct.common.rdclass,
+ keystruct.common.rdtype,
+ &keystruct, &rrdatabuf);
+ if (result != ISC_R_SUCCESS) {
+ fprintf(stderr, "failed to construct key rdata\n");
+ exit(1);
+ }
+ namelen = strlen(keynamestr);
+ isc_buffer_init(&b, keynamestr, namelen);
+ isc_buffer_add(&b, namelen);
+ dns_fixedname_init(&fkeyname);
+ keyname = dns_fixedname_name(&fkeyname);
+ result = dns_name_fromtext(keyname, &b, dns_rootname, 0, NULL);
+ if (result != ISC_R_SUCCESS) {
+ fprintf(stderr, "failed to construct key name\n");
+ exit(1);
+ }
+ result = dns_client_addtrustedkey(client, dns_rdataclass_in,
+ keyname, &rrdatabuf);
+ if (result != ISC_R_SUCCESS) {
+ fprintf(stderr, "failed to add key for %s\n",
+ keynamestr);
+ exit(1);
+ }
+}
+
+static void
+addserver(dns_client_t *client, const char *addrstr, const char *namespace) {
+ struct addrinfo hints, *res;
+ int gai_error;
+ isc_sockaddr_t sa;
+ isc_sockaddrlist_t servers;
+ isc_result_t result;
+ size_t namelen;
+ isc_buffer_t b;
+ dns_fixedname_t fname;
+ dns_name_t *name = NULL;
+
+ memset(&hints, 0, sizeof(hints));
+ hints.ai_family = AF_UNSPEC;
+ hints.ai_socktype = SOCK_DGRAM;
+ hints.ai_protocol = IPPROTO_UDP;
+ hints.ai_flags = AI_NUMERICHOST;
+ gai_error = getaddrinfo(addrstr, "53", &hints, &res);
+ if (gai_error != 0) {
+ fprintf(stderr, "getaddrinfo failed: %s\n",
+ gai_strerror(gai_error));
+ exit(1);
+ }
+ INSIST(res->ai_addrlen <= sizeof(sa.type));
+ memcpy(&sa.type, res->ai_addr, res->ai_addrlen);
+ freeaddrinfo(res);
+ sa.length = res->ai_addrlen;
+ ISC_LINK_INIT(&sa, link);
+ ISC_LIST_INIT(servers);
+ ISC_LIST_APPEND(servers, &sa, link);
+
+ if (namespace != NULL) {
+ namelen = strlen(namespace);
+ isc_buffer_init(&b, namespace, namelen);
+ isc_buffer_add(&b, namelen);
+ dns_fixedname_init(&fname);
+ name = dns_fixedname_name(&fname);
+ result = dns_name_fromtext(name, &b, dns_rootname, 0, NULL);
+ if (result != ISC_R_SUCCESS) {
+ fprintf(stderr, "failed to convert qname: %d\n",
+ result);
+ exit(1);
+ }
+ }
+
+ result = dns_client_setservers(client, dns_rdataclass_in, name,
+ &servers);
+ if (result != ISC_R_SUCCESS) {
+ fprintf(stderr, "set server failed: %d\n", result);
+ exit(1);
+ }
+}
+
+int
+main(int argc, char *argv[]) {
+ int ch;
+ isc_textregion_t tr;
+ char *altserver = NULL;
+ char *altserveraddr = NULL;
+ char *altservername = NULL;
+ dns_client_t *client = NULL;
+ char *keynamestr = NULL;
+ char *keystr = NULL;
+ isc_result_t result;
+ isc_buffer_t b;
+ dns_fixedname_t qname0;
+ size_t namelen;
+ dns_name_t *qname, *name;
+ dns_rdatatype_t type = dns_rdatatype_a;
+ dns_rdataset_t *rdataset;
+ dns_namelist_t namelist;
+ isc_mem_t *keymctx = NULL;
+ unsigned int clientopt, resopt;
+ isc_boolean_t is_sep = ISC_FALSE;
+
+ while ((ch = getopt(argc, argv, "a:es:t:k:K:")) != -1) {
+ switch (ch) {
+ case 't':
+ tr.base = optarg;
+ tr.length = strlen(optarg);
+ result = dns_rdatatype_fromtext(&type, &tr);
+ if (result != ISC_R_SUCCESS) {
+ fprintf(stderr,
+ "invalid RRtype: %s\n", optarg);
+ exit(1);
+ }
+ break;
+ case 'a':
+ algname = optarg;
+ break;
+ case 'e':
+ is_sep = ISC_TRUE;
+ break;
+ case 's':
+ if (altserver != NULL) {
+ fprintf(stderr, "alternate server "
+ "already defined: %s\n",
+ altserver);
+ exit(1);
+ }
+ altserver = optarg;
+ break;
+ case 'k':
+ keynamestr = optarg;
+ break;
+ case 'K':
+ keystr = optarg;
+ break;
+ default:
+ usage();
+ }
+ }
+
+ argc -= optind;
+ argv += optind;
+ if (argc < 2)
+ usage();
+
+ if (altserver != NULL) {
+ char *cp;
+
+ cp = strchr(altserver, ':');
+ if (cp == NULL) {
+ fprintf(stderr, "invalid alternate server: %s\n",
+ altserver);
+ exit(1);
+ }
+ *cp = '\0';
+ altservername = altserver;
+ altserveraddr = cp + 1;
+ }
+
+ isc_lib_register();
+ result = dns_lib_init();
+ if (result != ISC_R_SUCCESS) {
+ fprintf(stderr, "dns_lib_init failed: %d\n", result);
+ exit(1);
+ }
+
+ clientopt = 0;
+ result = dns_client_create(&client, clientopt);
+ if (result != ISC_R_SUCCESS) {
+ fprintf(stderr, "dns_client_create failed: %d\n", result);
+ exit(1);
+ }
+
+ /* Set the nameserver */
+ addserver(client, argv[0], NULL);
+
+ /* Set the alternate nameserver (when specified) */
+ if (altserver != NULL)
+ addserver(client, altserveraddr, altservername);
+
+ /* Install DNSSEC key (if given) */
+ if (keynamestr != NULL) {
+ if (keystr == NULL) {
+ fprintf(stderr,
+ "key string is missing "
+ "while key name is provided\n");
+ exit(1);
+ }
+ set_key(client, keynamestr, keystr, is_sep, &keymctx);
+ }
+
+ /* Construct qname */
+ namelen = strlen(argv[1]);
+ isc_buffer_init(&b, argv[1], namelen);
+ isc_buffer_add(&b, namelen);
+ dns_fixedname_init(&qname0);
+ qname = dns_fixedname_name(&qname0);
+ result = dns_name_fromtext(qname, &b, dns_rootname, 0, NULL);
+ if (result != ISC_R_SUCCESS)
+ fprintf(stderr, "failed to convert qname: %d\n", result);
+
+ /* Perform resolution */
+ resopt = 0;
+ if (keynamestr == NULL)
+ resopt |= DNS_CLIENTRESOPT_NODNSSEC;
+ ISC_LIST_INIT(namelist);
+ result = dns_client_resolve(client, qname, dns_rdataclass_in, type,
+ resopt, &namelist);
+ if (result != ISC_R_SUCCESS) {
+ fprintf(stderr,
+ "resolution failed: %s\n", dns_result_totext(result));
+ }
+ for (name = ISC_LIST_HEAD(namelist); name != NULL;
+ name = ISC_LIST_NEXT(name, link)) {
+ for (rdataset = ISC_LIST_HEAD(name->list);
+ rdataset != NULL;
+ rdataset = ISC_LIST_NEXT(rdataset, link)) {
+ if (printdata(rdataset, name) != ISC_R_SUCCESS)
+ fprintf(stderr, "print data failed\n");
+ }
+ }
+
+ dns_client_freeresanswer(client, &namelist);
+
+ /* Cleanup */
+ dns_client_destroy(&client);
+ if (keynamestr != NULL)
+ isc_mem_destroy(&keymctx);
+ dns_lib_shutdown();
+
+ exit(0);
+}
diff --git a/contrib/bind9/lib/irs/Makefile.in b/contrib/bind9/lib/irs/Makefile.in
new file mode 100644
index 0000000..3f9bfb3
--- /dev/null
+++ b/contrib/bind9/lib/irs/Makefile.in
@@ -0,0 +1,80 @@
+# Copyright (C) 2009 Internet Systems Consortium, Inc. ("ISC")
+#
+# Permission to use, copy, modify, and/or 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 ISC DISCLAIMS ALL WARRANTIES WITH
+# REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+# AND FITNESS. IN NO EVENT SHALL ISC 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.
+
+# $Id: Makefile.in,v 1.3 2009-09-02 23:48:02 tbox Exp $
+
+srcdir = @srcdir@
+VPATH = @srcdir@
+top_srcdir = @top_srcdir@
+
+@BIND9_VERSION@
+
+@LIBIRS_API@
+
+@BIND9_MAKE_INCLUDES@
+
+CINCLUDES = -I. -I./include -I${srcdir}/include \
+ ${DNS_INCLUDES} ${ISC_INCLUDES} ${ISCCFG_INCLUDES}
+
+CDEFINES =
+CWARNINGS =
+
+# Alphabetically
+OBJS = context.@O@ \
+ dnsconf.@O@ \
+ gai_strerror.@O@ getaddrinfo.@O@ getnameinfo.@O@ \
+ resconf.@O@
+
+# Alphabetically
+SRCS = context.c \
+ dnsconf.c \
+ gai_sterror.c getaddrinfo.c getnameinfo.c \
+ resconf.c
+
+LIBS = @LIBS@
+
+SUBDIRS = include
+TARGETS = timestamp
+
+@BIND9_MAKE_RULES@
+
+version.@O@: version.c
+ ${LIBTOOL_MODE_COMPILE} ${CC} ${ALL_CFLAGS} \
+ -DVERSION=\"${VERSION}\" \
+ -DLIBINTERFACE=${LIBINTERFACE} \
+ -DLIBREVISION=${LIBREVISION} \
+ -DLIBAGE=${LIBAGE} \
+ -c ${srcdir}/version.c
+
+libirs.@SA@: ${OBJS} version.@O@
+ ${AR} ${ARFLAGS} $@ ${OBJS} version.@O@
+ ${RANLIB} $@
+
+libirs.la: ${OBJS} version.@O@
+ ${LIBTOOL_MODE_LINK} \
+ ${CC} ${ALL_CFLAGS} ${LDFLAGS} -o libirs.la -rpath ${libdir} \
+ -version-info ${LIBINTERFACE}:${LIBREVISION}:${LIBAGE} \
+ ${OBJS} version.@O@ ${LIBS}
+
+timestamp: libirs.@A@
+ touch timestamp
+
+installdirs:
+ $(SHELL) ${top_srcdir}/mkinstalldirs ${DESTDIR}${libdir}
+
+install:: timestamp installdirs
+ ${LIBTOOL_MODE_INSTALL} ${INSTALL_DATA} libirs.@A@ ${DESTDIR}${libdir}
+
+clean distclean::
+ rm -f libirs.@A@ libirs.la timestamp
diff --git a/contrib/bind9/lib/irs/api b/contrib/bind9/lib/irs/api
new file mode 100644
index 0000000..94575eb
--- /dev/null
+++ b/contrib/bind9/lib/irs/api
@@ -0,0 +1,3 @@
+LIBINTERFACE = 80
+LIBREVISION = 0
+LIBAGE = 0
diff --git a/contrib/bind9/lib/irs/context.c b/contrib/bind9/lib/irs/context.c
new file mode 100644
index 0000000..0c6d856
--- /dev/null
+++ b/contrib/bind9/lib/irs/context.c
@@ -0,0 +1,396 @@
+/*
+ * Copyright (C) 2009 Internet Systems Consortium, Inc. ("ISC")
+ *
+ * Permission to use, copy, modify, and/or 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 ISC DISCLAIMS ALL WARRANTIES WITH
+ * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+ * AND FITNESS. IN NO EVENT SHALL ISC 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.
+ */
+
+/* $Id: context.c,v 1.3 2009-09-02 23:48:02 tbox Exp $ */
+
+#include <config.h>
+
+#include <isc/app.h>
+#include <isc/lib.h>
+#include <isc/magic.h>
+#include <isc/mem.h>
+#include <isc/once.h>
+#include <isc/socket.h>
+#include <isc/task.h>
+#include <isc/thread.h>
+#include <isc/timer.h>
+#include <isc/util.h>
+
+#include <dns/client.h>
+#include <dns/lib.h>
+
+#include <irs/context.h>
+#include <irs/dnsconf.h>
+#include <irs/resconf.h>
+
+#define IRS_CONTEXT_MAGIC ISC_MAGIC('I', 'R', 'S', 'c')
+#define IRS_CONTEXT_VALID(c) ISC_MAGIC_VALID(c, IRS_CONTEXT_MAGIC)
+
+#ifndef RESOLV_CONF
+/*% location of resolve.conf */
+#define RESOLV_CONF "/etc/resolv.conf"
+#endif
+
+#ifndef DNS_CONF
+/*% location of dns.conf */
+#define DNS_CONF "/etc/dns.conf"
+#endif
+
+#ifndef ISC_PLATFORM_USETHREADS
+irs_context_t *irs_g_context = NULL;
+#else
+static isc_boolean_t thread_key_initialized = ISC_FALSE;
+static isc_mutex_t thread_key_mutex;
+static isc_thread_key_t irs_context_key;
+static isc_once_t once = ISC_ONCE_INIT;
+#endif
+
+
+struct irs_context {
+ /*
+ * An IRS context is a thread-specific object, and does not need to
+ * be locked.
+ */
+ unsigned int magic;
+ isc_mem_t *mctx;
+ isc_appctx_t *actx;
+ isc_taskmgr_t *taskmgr;
+ isc_task_t *task;
+ isc_socketmgr_t *socketmgr;
+ isc_timermgr_t *timermgr;
+ dns_client_t *dnsclient;
+ irs_resconf_t *resconf;
+ irs_dnsconf_t *dnsconf;
+};
+
+static void
+ctxs_destroy(isc_mem_t **mctxp, isc_appctx_t **actxp,
+ isc_taskmgr_t **taskmgrp, isc_socketmgr_t **socketmgrp,
+ isc_timermgr_t **timermgrp)
+{
+ if (taskmgrp != NULL)
+ isc_taskmgr_destroy(taskmgrp);
+
+ if (timermgrp != NULL)
+ isc_timermgr_destroy(timermgrp);
+
+ if (socketmgrp != NULL)
+ isc_socketmgr_destroy(socketmgrp);
+
+ if (actxp != NULL)
+ isc_appctx_destroy(actxp);
+
+ if (mctxp != NULL)
+ isc_mem_destroy(mctxp);
+}
+
+static isc_result_t
+ctxs_init(isc_mem_t **mctxp, isc_appctx_t **actxp,
+ isc_taskmgr_t **taskmgrp, isc_socketmgr_t **socketmgrp,
+ isc_timermgr_t **timermgrp)
+{
+ isc_result_t result;
+
+ result = isc_mem_create(0, 0, mctxp);
+ if (result != ISC_R_SUCCESS)
+ goto fail;
+
+ result = isc_appctx_create(*mctxp, actxp);
+ if (result != ISC_R_SUCCESS)
+ goto fail;
+
+ result = isc_taskmgr_createinctx(*mctxp, *actxp, 1, 0, taskmgrp);
+ if (result != ISC_R_SUCCESS)
+ goto fail;
+
+ result = isc_socketmgr_createinctx(*mctxp, *actxp, socketmgrp);
+ if (result != ISC_R_SUCCESS)
+ goto fail;
+
+ result = isc_timermgr_createinctx(*mctxp, *actxp, timermgrp);
+ if (result != ISC_R_SUCCESS)
+ goto fail;
+
+ return (ISC_R_SUCCESS);
+
+ fail:
+ ctxs_destroy(mctxp, actxp, taskmgrp, socketmgrp, timermgrp);
+
+ return (result);
+}
+
+#ifdef ISC_PLATFORM_USETHREADS
+static void
+free_specific_context(void *arg) {
+ irs_context_t *context = arg;
+
+ irs_context_destroy(&context);
+
+ isc_thread_key_setspecific(irs_context_key, NULL);
+}
+
+static void
+thread_key_mutex_init(void) {
+ RUNTIME_CHECK(isc_mutex_init(&thread_key_mutex) == ISC_R_SUCCESS);
+}
+
+static isc_result_t
+thread_key_init() {
+ isc_result_t result;
+
+ result = isc_once_do(&once, thread_key_mutex_init);
+ if (result != ISC_R_SUCCESS)
+ return (result);
+
+ if (!thread_key_initialized) {
+ LOCK(&thread_key_mutex);
+
+ if (!thread_key_initialized &&
+ isc_thread_key_create(&irs_context_key,
+ free_specific_context) != 0) {
+ result = ISC_R_FAILURE;
+ } else
+ thread_key_initialized = ISC_TRUE;
+
+ UNLOCK(&thread_key_mutex);
+ }
+
+ return (result);
+}
+#endif /* ISC_PLATFORM_USETHREADS */
+
+isc_result_t
+irs_context_get(irs_context_t **contextp) {
+ irs_context_t *context;
+ isc_result_t result;
+
+ REQUIRE(contextp != NULL && *contextp == NULL);
+
+#ifndef ISC_PLATFORM_USETHREADS
+ if (irs_g_context == NULL) {
+ result = irs_context_create(&irs_g_context);
+ if (result != ISC_R_SUCCESS)
+ return (result);
+ }
+
+ context = irs_g_context;
+#else
+ result = thread_key_init();
+ if (result != ISC_R_SUCCESS)
+ return (result);
+
+ context = isc_thread_key_getspecific(irs_context_key);
+ if (context == NULL) {
+ result = irs_context_create(&context);
+ if (result != ISC_R_SUCCESS)
+ return (result);
+ result = isc_thread_key_setspecific(irs_context_key, context);
+ if (result != ISC_R_SUCCESS) {
+ irs_context_destroy(&context);
+ return (result);
+ }
+ }
+#endif /* ISC_PLATFORM_USETHREADS */
+
+ *contextp = context;
+
+ return (ISC_R_SUCCESS);
+}
+
+isc_result_t
+irs_context_create(irs_context_t **contextp) {
+ isc_result_t result;
+ irs_context_t *context;
+ isc_appctx_t *actx = NULL;
+ isc_mem_t *mctx = NULL;
+ isc_taskmgr_t *taskmgr = NULL;
+ isc_socketmgr_t *socketmgr = NULL;
+ isc_timermgr_t *timermgr = NULL;
+ dns_client_t *client = NULL;
+ isc_sockaddrlist_t *nameservers;
+ irs_dnsconf_dnskeylist_t *trustedkeys;
+ irs_dnsconf_dnskey_t *trustedkey;
+
+ isc_lib_register();
+ result = dns_lib_init();
+ if (result != ISC_R_SUCCESS)
+ return (result);
+
+ result = ctxs_init(&mctx, &actx, &taskmgr, &socketmgr, &timermgr);
+ if (result != ISC_R_SUCCESS)
+ return (result);
+
+ result = isc_app_ctxstart(actx);
+ if (result != ISC_R_SUCCESS) {
+ ctxs_destroy(&mctx, &actx, &taskmgr, &socketmgr, &timermgr);
+ return (result);
+ }
+
+ context = isc_mem_get(mctx, sizeof(*context));
+ if (context == NULL) {
+ ctxs_destroy(&mctx, &actx, &taskmgr, &socketmgr, &timermgr);
+ return (ISC_R_NOMEMORY);
+ }
+
+ context->mctx = mctx;
+ context->actx = actx;
+ context->taskmgr = taskmgr;
+ context->socketmgr = socketmgr;
+ context->timermgr = timermgr;
+ context->resconf = NULL;
+ context->dnsconf = NULL;
+ context->task = NULL;
+ result = isc_task_create(taskmgr, 0, &context->task);
+ if (result != ISC_R_SUCCESS)
+ goto fail;
+
+ /* Create a DNS client object */
+ result = dns_client_createx(mctx, actx, taskmgr, socketmgr, timermgr,
+ 0, &client);
+ if (result != ISC_R_SUCCESS)
+ goto fail;
+ context->dnsclient = client;
+
+ /* Read resolver configuration file */
+ result = irs_resconf_load(mctx, RESOLV_CONF, &context->resconf);
+ if (result != ISC_R_SUCCESS)
+ goto fail;
+ /* Set nameservers */
+ nameservers = irs_resconf_getnameservers(context->resconf);
+ result = dns_client_setservers(client, dns_rdataclass_in, NULL,
+ nameservers);
+ if (result != ISC_R_SUCCESS)
+ goto fail;
+
+ /* Read advanced DNS configuration (if any) */
+ result = irs_dnsconf_load(mctx, DNS_CONF, &context->dnsconf);
+ if (result != ISC_R_SUCCESS)
+ goto fail;
+ trustedkeys = irs_dnsconf_gettrustedkeys(context->dnsconf);
+ for (trustedkey = ISC_LIST_HEAD(*trustedkeys);
+ trustedkey != NULL;
+ trustedkey = ISC_LIST_NEXT(trustedkey, link)) {
+ result = dns_client_addtrustedkey(client, dns_rdataclass_in,
+ trustedkey->keyname,
+ trustedkey->keydatabuf);
+ if (result != ISC_R_SUCCESS)
+ goto fail;
+ }
+
+ context->magic = IRS_CONTEXT_MAGIC;
+ *contextp = context;
+
+ return (ISC_R_SUCCESS);
+
+ fail:
+ if (context->task != NULL)
+ isc_task_detach(&context->task);
+ if (context->resconf != NULL)
+ irs_resconf_destroy(&context->resconf);
+ if (context->dnsconf != NULL)
+ irs_dnsconf_destroy(&context->dnsconf);
+ if (client != NULL)
+ dns_client_destroy(&client);
+ ctxs_destroy(NULL, &actx, &taskmgr, &socketmgr, &timermgr);
+ isc_mem_putanddetach(&mctx, context, sizeof(*context));
+
+ return (result);
+}
+
+void
+irs_context_destroy(irs_context_t **contextp) {
+ irs_context_t *context;
+
+ REQUIRE(contextp != NULL);
+ context = *contextp;
+ REQUIRE(IRS_CONTEXT_VALID(context));
+
+ isc_task_detach(&context->task);
+ irs_dnsconf_destroy(&context->dnsconf);
+ irs_resconf_destroy(&context->resconf);
+ dns_client_destroy(&context->dnsclient);
+
+ ctxs_destroy(NULL, &context->actx, &context->taskmgr,
+ &context->socketmgr, &context->timermgr);
+
+ context->magic = 0;
+
+ isc_mem_putanddetach(&context->mctx, context, sizeof(*context));
+
+ *contextp = NULL;
+
+#ifndef ISC_PLATFORM_USETHREADS
+ irs_g_context = NULL;
+#else
+ (void)isc_thread_key_setspecific(irs_context_key, NULL);
+#endif
+}
+
+isc_mem_t *
+irs_context_getmctx(irs_context_t *context) {
+ REQUIRE(IRS_CONTEXT_VALID(context));
+
+ return (context->mctx);
+}
+
+isc_appctx_t *
+irs_context_getappctx(irs_context_t *context) {
+ REQUIRE(IRS_CONTEXT_VALID(context));
+
+ return (context->actx);
+}
+
+isc_taskmgr_t *
+irs_context_gettaskmgr(irs_context_t *context) {
+ REQUIRE(IRS_CONTEXT_VALID(context));
+
+ return (context->taskmgr);
+}
+
+isc_timermgr_t *
+irs_context_gettimermgr(irs_context_t *context) {
+ REQUIRE(IRS_CONTEXT_VALID(context));
+
+ return (context->timermgr);
+}
+
+isc_task_t *
+irs_context_gettask(irs_context_t *context) {
+ REQUIRE(IRS_CONTEXT_VALID(context));
+
+ return (context->task);
+}
+
+dns_client_t *
+irs_context_getdnsclient(irs_context_t *context) {
+ REQUIRE(IRS_CONTEXT_VALID(context));
+
+ return (context->dnsclient);
+}
+
+irs_resconf_t *
+irs_context_getresconf(irs_context_t *context) {
+ REQUIRE(IRS_CONTEXT_VALID(context));
+
+ return (context->resconf);
+}
+
+irs_dnsconf_t *
+irs_context_getdnsconf(irs_context_t *context) {
+ REQUIRE(IRS_CONTEXT_VALID(context));
+
+ return (context->dnsconf);
+}
diff --git a/contrib/bind9/lib/irs/dnsconf.c b/contrib/bind9/lib/irs/dnsconf.c
new file mode 100644
index 0000000..8464d6d
--- /dev/null
+++ b/contrib/bind9/lib/irs/dnsconf.c
@@ -0,0 +1,269 @@
+/*
+ * Copyright (C) 2009 Internet Systems Consortium, Inc. ("ISC")
+ *
+ * Permission to use, copy, modify, and/or 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 ISC DISCLAIMS ALL WARRANTIES WITH
+ * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+ * AND FITNESS. IN NO EVENT SHALL ISC 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.
+ */
+
+/* $Id: dnsconf.c,v 1.3 2009-09-02 23:48:02 tbox Exp $ */
+
+/*! \file */
+
+#include <config.h>
+
+#include <string.h>
+
+#include <isc/base64.h>
+#include <isc/buffer.h>
+#include <isc/file.h>
+#include <isc/mem.h>
+#include <isc/util.h>
+
+#include <isccfg/dnsconf.h>
+
+#include <dns/fixedname.h>
+#include <dns/name.h>
+#include <dns/rdata.h>
+#include <dns/rdatastruct.h>
+
+#include <irs/dnsconf.h>
+
+#define IRS_DNSCONF_MAGIC ISC_MAGIC('D', 'c', 'f', 'g')
+#define IRS_DNSCONF_VALID(c) ISC_MAGIC_VALID(c, IRS_DNSCONF_MAGIC)
+
+/*!
+ * configuration data structure
+ */
+
+struct irs_dnsconf {
+ unsigned int magic;
+ isc_mem_t *mctx;
+ irs_dnsconf_dnskeylist_t trusted_keylist;
+};
+
+static isc_result_t
+configure_dnsseckeys(irs_dnsconf_t *conf, cfg_obj_t *cfgobj,
+ dns_rdataclass_t rdclass)
+{
+ isc_mem_t *mctx = conf->mctx;
+ const cfg_obj_t *keys = NULL;
+ const cfg_obj_t *key, *keylist;
+ dns_fixedname_t fkeyname;
+ dns_name_t *keyname_base, *keyname;
+ const cfg_listelt_t *element, *element2;
+ isc_result_t result;
+ isc_uint32_t flags, proto, alg;
+ const char *keystr, *keynamestr;
+ unsigned char keydata[4096];
+ isc_buffer_t keydatabuf_base, *keydatabuf;
+ dns_rdata_dnskey_t keystruct;
+ unsigned char rrdata[4096];
+ isc_buffer_t rrdatabuf;
+ isc_region_t r;
+ isc_buffer_t namebuf;
+ irs_dnsconf_dnskey_t *keyent;
+
+ cfg_map_get(cfgobj, "trusted-keys", &keys);
+ if (keys == NULL)
+ return (ISC_R_SUCCESS);
+
+ for (element = cfg_list_first(keys);
+ element != NULL;
+ element = cfg_list_next(element)) {
+ keylist = cfg_listelt_value(element);
+ for (element2 = cfg_list_first(keylist);
+ element2 != NULL;
+ element2 = cfg_list_next(element2))
+ {
+ keydatabuf = NULL;
+ keyname = NULL;
+
+ key = cfg_listelt_value(element2);
+
+ flags = cfg_obj_asuint32(cfg_tuple_get(key, "flags"));
+ proto = cfg_obj_asuint32(cfg_tuple_get(key,
+ "protocol"));
+ alg = cfg_obj_asuint32(cfg_tuple_get(key,
+ "algorithm"));
+ keynamestr = cfg_obj_asstring(cfg_tuple_get(key,
+ "name"));
+
+ keystruct.common.rdclass = rdclass;
+ keystruct.common.rdtype = dns_rdatatype_dnskey;
+ keystruct.mctx = NULL;
+ ISC_LINK_INIT(&keystruct.common, link);
+
+ if (flags > 0xffff)
+ return (ISC_R_RANGE);
+ if (proto > 0xff)
+ return (ISC_R_RANGE);
+ if (alg > 0xff)
+ return (ISC_R_RANGE);
+ keystruct.flags = (isc_uint16_t)flags;
+ keystruct.protocol = (isc_uint8_t)proto;
+ keystruct.algorithm = (isc_uint8_t)alg;
+
+ isc_buffer_init(&keydatabuf_base, keydata,
+ sizeof(keydata));
+ isc_buffer_init(&rrdatabuf, rrdata, sizeof(rrdata));
+
+ /* Configure key value */
+ keystr = cfg_obj_asstring(cfg_tuple_get(key, "key"));
+ result = isc_base64_decodestring(keystr,
+ &keydatabuf_base);
+ if (result != ISC_R_SUCCESS)
+ return (result);
+ isc_buffer_usedregion(&keydatabuf_base, &r);
+ keystruct.datalen = r.length;
+ keystruct.data = r.base;
+
+ result = dns_rdata_fromstruct(NULL,
+ keystruct.common.rdclass,
+ keystruct.common.rdtype,
+ &keystruct, &rrdatabuf);
+ if (result != ISC_R_SUCCESS)
+ return (result);
+ isc_buffer_usedregion(&rrdatabuf, &r);
+ result = isc_buffer_allocate(mctx, &keydatabuf,
+ r.length);
+ if (result != ISC_R_SUCCESS)
+ return (result);
+ result = isc_buffer_copyregion(keydatabuf, &r);
+ if (result != ISC_R_SUCCESS)
+ goto cleanup;
+
+ /* Configure key name */
+ dns_fixedname_init(&fkeyname);
+ keyname_base = dns_fixedname_name(&fkeyname);
+ isc_buffer_init(&namebuf, keynamestr,
+ strlen(keynamestr));
+ isc_buffer_add(&namebuf, strlen(keynamestr));
+ result = dns_name_fromtext(keyname_base, &namebuf,
+ dns_rootname, 0, NULL);
+ if (result != ISC_R_SUCCESS)
+ return (result);
+ keyname = isc_mem_get(mctx, sizeof(*keyname));
+ if (keyname == NULL) {
+ result = ISC_R_NOMEMORY;
+ goto cleanup;
+ }
+ dns_name_init(keyname, NULL);
+ result = dns_name_dup(keyname_base, mctx, keyname);
+ if (result != ISC_R_SUCCESS)
+ goto cleanup;
+
+ /* Add the key data to the list */
+ keyent = isc_mem_get(mctx, sizeof(*keyent));
+ if (keyent == NULL) {
+ dns_name_free(keyname, mctx);
+ result = ISC_R_NOMEMORY;
+ goto cleanup;
+ }
+ keyent->keyname = keyname;
+ keyent->keydatabuf = keydatabuf;
+
+ ISC_LIST_APPEND(conf->trusted_keylist, keyent, link);
+ }
+ }
+
+ return (ISC_R_SUCCESS);
+
+ cleanup:
+ if (keydatabuf != NULL)
+ isc_buffer_free(&keydatabuf);
+ if (keyname != NULL)
+ isc_mem_put(mctx, keyname, sizeof(*keyname));
+
+ return (result);
+}
+
+isc_result_t
+irs_dnsconf_load(isc_mem_t *mctx, const char *filename, irs_dnsconf_t **confp)
+{
+ irs_dnsconf_t *conf;
+ cfg_parser_t *parser = NULL;
+ cfg_obj_t *cfgobj = NULL;
+ isc_result_t result = ISC_R_SUCCESS;
+
+ REQUIRE(confp != NULL && *confp == NULL);
+
+ conf = isc_mem_get(mctx, sizeof(*conf));
+ if (conf == NULL)
+ return (ISC_R_NOMEMORY);
+
+ conf->mctx = mctx;
+ ISC_LIST_INIT(conf->trusted_keylist);
+
+ /*
+ * If the specified file does not exist, we'll simply with an empty
+ * configuration.
+ */
+ if (!isc_file_exists(filename))
+ goto cleanup;
+
+ result = cfg_parser_create(mctx, NULL, &parser);
+ if (result != ISC_R_SUCCESS)
+ goto cleanup;
+
+ result = cfg_parse_file(parser, filename, &cfg_type_dnsconf,
+ &cfgobj);
+ if (result != ISC_R_SUCCESS)
+ goto cleanup;
+
+ result = configure_dnsseckeys(conf, cfgobj, dns_rdataclass_in);
+
+ cleanup:
+ if (parser != NULL) {
+ if (cfgobj != NULL)
+ cfg_obj_destroy(parser, &cfgobj);
+ cfg_parser_destroy(&parser);
+ }
+
+ conf->magic = IRS_DNSCONF_MAGIC;
+
+ if (result == ISC_R_SUCCESS)
+ *confp = conf;
+ else
+ irs_dnsconf_destroy(&conf);
+
+ return (result);
+}
+
+void
+irs_dnsconf_destroy(irs_dnsconf_t **confp) {
+ irs_dnsconf_t *conf;
+ irs_dnsconf_dnskey_t *keyent;
+
+ REQUIRE(confp != NULL);
+ conf = *confp;
+ REQUIRE(IRS_DNSCONF_VALID(conf));
+
+ while ((keyent = ISC_LIST_HEAD(conf->trusted_keylist)) != NULL) {
+ ISC_LIST_UNLINK(conf->trusted_keylist, keyent, link);
+
+ isc_buffer_free(&keyent->keydatabuf);
+ dns_name_free(keyent->keyname, conf->mctx);
+ isc_mem_put(conf->mctx, keyent->keyname, sizeof(dns_name_t));
+ isc_mem_put(conf->mctx, keyent, sizeof(*keyent));
+ }
+
+ isc_mem_put(conf->mctx, conf, sizeof(*conf));
+
+ *confp = NULL;
+}
+
+irs_dnsconf_dnskeylist_t *
+irs_dnsconf_gettrustedkeys(irs_dnsconf_t *conf) {
+ REQUIRE(IRS_DNSCONF_VALID(conf));
+
+ return (&conf->trusted_keylist);
+}
diff --git a/contrib/bind9/lib/irs/gai_strerror.c b/contrib/bind9/lib/irs/gai_strerror.c
new file mode 100644
index 0000000..aa021ef
--- /dev/null
+++ b/contrib/bind9/lib/irs/gai_strerror.c
@@ -0,0 +1,93 @@
+/*
+ * Copyright (C) 2009 Internet Systems Consortium, Inc. ("ISC")
+ *
+ * Permission to use, copy, modify, and/or 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 ISC DISCLAIMS ALL WARRANTIES WITH
+ * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+ * AND FITNESS. IN NO EVENT SHALL ISC 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.
+ */
+
+/* $Id: gai_strerror.c,v 1.5 2009-09-02 23:48:02 tbox Exp $ */
+
+/*! \file gai_strerror.c
+ * gai_strerror() returns an error message corresponding to an
+ * error code returned by getaddrinfo() and getnameinfo(). The following error
+ * codes and their meaning are defined in
+ * \link netdb.h include/irs/netdb.h.\endlink
+ * This implementation is almost an exact copy of lwres/gai_sterror.c except
+ * that it catches up the latest API standard, RFC3493.
+ *
+ * \li #EAI_ADDRFAMILY address family for hostname not supported
+ * \li #EAI_AGAIN temporary failure in name resolution
+ * \li #EAI_BADFLAGS invalid value for ai_flags
+ * \li #EAI_FAIL non-recoverable failure in name resolution
+ * \li #EAI_FAMILY ai_family not supported
+ * \li #EAI_MEMORY memory allocation failure
+ * \li #EAI_NODATA no address associated with hostname (obsoleted in RFC3493)
+ * \li #EAI_NONAME hostname nor servname provided, or not known
+ * \li #EAI_SERVICE servname not supported for ai_socktype
+ * \li #EAI_SOCKTYPE ai_socktype not supported
+ * \li #EAI_SYSTEM system error returned in errno
+ * \li #EAI_BADHINTS Invalid value for hints (non-standard)
+ * \li #EAI_PROTOCOL Resolved protocol is unknown (non-standard)
+ * \li #EAI_OVERFLOW Argument buffer overflow
+ * \li #EAI_INSECUREDATA Insecure Data (experimental)
+ *
+ * The message invalid error code is returned if ecode is out of range.
+ *
+ * ai_flags, ai_family and ai_socktype are elements of the struct
+ * addrinfo used by lwres_getaddrinfo().
+ *
+ * \section gai_strerror_see See Also
+ *
+ * strerror(), getaddrinfo(), getnameinfo(), RFC3493.
+ */
+#include <config.h>
+
+#include <irs/netdb.h>
+
+/*% Text of error messages. */
+static const char *gai_messages[] = {
+ "no error",
+ "address family for hostname not supported",
+ "temporary failure in name resolution",
+ "invalid value for ai_flags",
+ "non-recoverable failure in name resolution",
+ "ai_family not supported",
+ "memory allocation failure",
+ "no address associated with hostname",
+ "hostname nor servname provided, or not known",
+ "servname not supported for ai_socktype",
+ "ai_socktype not supported",
+ "system error returned in errno",
+ "bad hints",
+ "bad protocol",
+ "argument buffer overflow",
+ "insecure data provided"
+};
+
+/*%
+ * Returns an error message corresponding to an error code returned by
+ * getaddrinfo() and getnameinfo()
+ */
+IRS_GAISTRERROR_RETURN_T
+gai_strerror(int ecode) {
+ union {
+ const char *const_ptr;
+ char *deconst_ptr;
+ } ptr;
+
+ if ((ecode < 0) ||
+ (ecode >= (int)(sizeof(gai_messages)/sizeof(*gai_messages))))
+ ptr.const_ptr = "invalid error code";
+ else
+ ptr.const_ptr = gai_messages[ecode];
+ return (ptr.deconst_ptr);
+}
diff --git a/contrib/bind9/lib/irs/getaddrinfo.c b/contrib/bind9/lib/irs/getaddrinfo.c
new file mode 100644
index 0000000..e7075da
--- /dev/null
+++ b/contrib/bind9/lib/irs/getaddrinfo.c
@@ -0,0 +1,1295 @@
+/*
+ * Copyright (C) 2009 Internet Systems Consortium, Inc. ("ISC")
+ *
+ * Permission to use, copy, modify, and/or 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 ISC DISCLAIMS ALL WARRANTIES WITH
+ * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+ * AND FITNESS. IN NO EVENT SHALL ISC 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.
+ */
+
+/* $Id: getaddrinfo.c,v 1.3 2009-09-02 23:48:02 tbox Exp $ */
+
+/*! \file */
+
+/**
+ * getaddrinfo() is used to get a list of IP addresses and port
+ * numbers for host hostname and service servname as defined in RFC3493.
+ * hostname and servname are pointers to null-terminated strings
+ * or NULL. hostname is either a host name or a numeric host address
+ * string: a dotted decimal IPv4 address or an IPv6 address. servname is
+ * either a decimal port number or a service name as listed in
+ * /etc/services.
+ *
+ * If the operating system does not provide a struct addrinfo, the
+ * following structure is used:
+ *
+ * \code
+ * struct addrinfo {
+ * int ai_flags; // AI_PASSIVE, AI_CANONNAME
+ * int ai_family; // PF_xxx
+ * int ai_socktype; // SOCK_xxx
+ * int ai_protocol; // 0 or IPPROTO_xxx for IPv4 and IPv6
+ * size_t ai_addrlen; // length of ai_addr
+ * char *ai_canonname; // canonical name for hostname
+ * struct sockaddr *ai_addr; // binary address
+ * struct addrinfo *ai_next; // next structure in linked list
+ * };
+ * \endcode
+ *
+ *
+ * hints is an optional pointer to a struct addrinfo. This structure can
+ * be used to provide hints concerning the type of socket that the caller
+ * supports or wishes to use. The caller can supply the following
+ * structure elements in *hints:
+ *
+ * <ul>
+ * <li>ai_family:
+ * The protocol family that should be used. When ai_family is set
+ * to PF_UNSPEC, it means the caller will accept any protocol
+ * family supported by the operating system.</li>
+ *
+ * <li>ai_socktype:
+ * denotes the type of socket -- SOCK_STREAM, SOCK_DGRAM or
+ * SOCK_RAW -- that is wanted. When ai_socktype is zero the caller
+ * will accept any socket type.</li>
+ *
+ * <li>ai_protocol:
+ * indicates which transport protocol is wanted: IPPROTO_UDP or
+ * IPPROTO_TCP. If ai_protocol is zero the caller will accept any
+ * protocol.</li>
+ *
+ * <li>ai_flags:
+ * Flag bits. If the AI_CANONNAME bit is set, a successful call to
+ * getaddrinfo() will return a null-terminated string
+ * containing the canonical name of the specified hostname in
+ * ai_canonname of the first addrinfo structure returned. Setting
+ * the AI_PASSIVE bit indicates that the returned socket address
+ * structure is intended for used in a call to bind(2). In this
+ * case, if the hostname argument is a NULL pointer, then the IP
+ * address portion of the socket address structure will be set to
+ * INADDR_ANY for an IPv4 address or IN6ADDR_ANY_INIT for an IPv6
+ * address.<br /><br />
+ *
+ * When ai_flags does not set the AI_PASSIVE bit, the returned
+ * socket address structure will be ready for use in a call to
+ * connect(2) for a connection-oriented protocol or connect(2),
+ * sendto(2), or sendmsg(2) if a connectionless protocol was
+ * chosen. The IP address portion of the socket address structure
+ * will be set to the loopback address if hostname is a NULL
+ * pointer and AI_PASSIVE is not set in ai_flags.<br /><br />
+ *
+ * If ai_flags is set to AI_NUMERICHOST it indicates that hostname
+ * should be treated as a numeric string defining an IPv4 or IPv6
+ * address and no name resolution should be attempted.
+ * </li></ul>
+ *
+ * All other elements of the struct addrinfo passed via hints must be
+ * zero.
+ *
+ * A hints of NULL is treated as if the caller provided a struct addrinfo
+ * initialized to zero with ai_familyset to PF_UNSPEC.
+ *
+ * After a successful call to getaddrinfo(), *res is a pointer to a
+ * linked list of one or more addrinfo structures. Each struct addrinfo
+ * in this list cn be processed by following the ai_next pointer, until a
+ * NULL pointer is encountered. The three members ai_family, ai_socktype,
+ * and ai_protocol in each returned addrinfo structure contain the
+ * corresponding arguments for a call to socket(2). For each addrinfo
+ * structure in the list, the ai_addr member points to a filled-in socket
+ * address structure of length ai_addrlen.
+ *
+ * All of the information returned by getaddrinfo() is dynamically
+ * allocated: the addrinfo structures, and the socket address structures
+ * and canonical host name strings pointed to by the addrinfostructures.
+ * Memory allocated for the dynamically allocated structures created by a
+ * successful call to getaddrinfo() is released by freeaddrinfo().
+ * ai is a pointer to a struct addrinfo created by a call to getaddrinfo().
+ *
+ * \section irsreturn RETURN VALUES
+ *
+ * getaddrinfo() returns zero on success or one of the error codes
+ * listed in gai_strerror() if an error occurs. If both hostname and
+ * servname are NULL getaddrinfo() returns #EAI_NONAME.
+ *
+ * \section irssee SEE ALSO
+ *
+ * getaddrinfo(), freeaddrinfo(),
+ * gai_strerror(), RFC3493, getservbyname(3), connect(2),
+ * sendto(2), sendmsg(2), socket(2).
+ */
+
+#include <config.h>
+
+#include <stdlib.h>
+#include <string.h>
+#include <errno.h>
+
+#include <isc/app.h>
+#include <isc/buffer.h>
+#include <isc/lib.h>
+#include <isc/mem.h>
+#include <isc/sockaddr.h>
+#include <isc/util.h>
+
+#include <dns/client.h>
+#include <dns/fixedname.h>
+#include <dns/name.h>
+#include <dns/rdata.h>
+#include <dns/rdataset.h>
+#include <dns/rdatastruct.h>
+#include <dns/rdatatype.h>
+#include <dns/result.h>
+
+#include <irs/context.h>
+#include <irs/netdb.h>
+#include <irs/resconf.h>
+
+#define SA(addr) ((struct sockaddr *)(addr))
+#define SIN(addr) ((struct sockaddr_in *)(addr))
+#define SIN6(addr) ((struct sockaddr_in6 *)(addr))
+#define SLOCAL(addr) ((struct sockaddr_un *)(addr))
+
+/*! \struct addrinfo
+ */
+static struct addrinfo
+ *ai_concat(struct addrinfo *ai1, struct addrinfo *ai2),
+ *ai_reverse(struct addrinfo *oai),
+ *ai_clone(struct addrinfo *oai, int family),
+ *ai_alloc(int family, int addrlen);
+#ifdef AF_LOCAL
+static int get_local(const char *name, int socktype, struct addrinfo **res);
+#endif
+
+static int
+resolve_name(int family, const char *hostname, int flags,
+ struct addrinfo **aip, int socktype, int port);
+
+static int add_ipv4(const char *hostname, int flags, struct addrinfo **aip,
+ int socktype, int port);
+static int add_ipv6(const char *hostname, int flags, struct addrinfo **aip,
+ int socktype, int port);
+static void set_order(int, int (**)(const char *, int, struct addrinfo **,
+ int, int));
+
+#define FOUND_IPV4 0x1
+#define FOUND_IPV6 0x2
+#define FOUND_MAX 2
+
+#define ISC_AI_MASK (AI_PASSIVE|AI_CANONNAME|AI_NUMERICHOST)
+/*%
+ * Get a list of IP addresses and port numbers for host hostname and
+ * service servname.
+ */
+int
+getaddrinfo(const char *hostname, const char *servname,
+ const struct addrinfo *hints, struct addrinfo **res)
+{
+ struct servent *sp;
+ const char *proto;
+ int family, socktype, flags, protocol;
+ struct addrinfo *ai, *ai_list;
+ int err = 0;
+ int port, i;
+ int (*net_order[FOUND_MAX+1])(const char *, int, struct addrinfo **,
+ int, int);
+
+ if (hostname == NULL && servname == NULL)
+ return (EAI_NONAME);
+
+ proto = NULL;
+ if (hints != NULL) {
+ if ((hints->ai_flags & ~(ISC_AI_MASK)) != 0)
+ return (EAI_BADFLAGS);
+ if (hints->ai_addrlen || hints->ai_canonname ||
+ hints->ai_addr || hints->ai_next) {
+ errno = EINVAL;
+ return (EAI_SYSTEM);
+ }
+ family = hints->ai_family;
+ socktype = hints->ai_socktype;
+ protocol = hints->ai_protocol;
+ flags = hints->ai_flags;
+ switch (family) {
+ case AF_UNSPEC:
+ switch (hints->ai_socktype) {
+ case SOCK_STREAM:
+ proto = "tcp";
+ break;
+ case SOCK_DGRAM:
+ proto = "udp";
+ break;
+ }
+ break;
+ case AF_INET:
+ case AF_INET6:
+ switch (hints->ai_socktype) {
+ case 0:
+ break;
+ case SOCK_STREAM:
+ proto = "tcp";
+ break;
+ case SOCK_DGRAM:
+ proto = "udp";
+ break;
+ case SOCK_RAW:
+ break;
+ default:
+ return (EAI_SOCKTYPE);
+ }
+ break;
+#ifdef AF_LOCAL
+ case AF_LOCAL:
+ switch (hints->ai_socktype) {
+ case 0:
+ break;
+ case SOCK_STREAM:
+ break;
+ case SOCK_DGRAM:
+ break;
+ default:
+ return (EAI_SOCKTYPE);
+ }
+ break;
+#endif
+ default:
+ return (EAI_FAMILY);
+ }
+ } else {
+ protocol = 0;
+ family = 0;
+ socktype = 0;
+ flags = 0;
+ }
+
+#ifdef AF_LOCAL
+ /*!
+ * First, deal with AF_LOCAL. If the family was not set,
+ * then assume AF_LOCAL if the first character of the
+ * hostname/servname is '/'.
+ */
+
+ if (hostname != NULL &&
+ (family == AF_LOCAL || (family == 0 && *hostname == '/')))
+ return (get_local(hostname, socktype, res));
+
+ if (servname != NULL &&
+ (family == AF_LOCAL || (family == 0 && *servname == '/')))
+ return (get_local(servname, socktype, res));
+#endif
+
+ /*
+ * Ok, only AF_INET and AF_INET6 left.
+ */
+ ai_list = NULL;
+
+ /*
+ * First, look up the service name (port) if it was
+ * requested. If the socket type wasn't specified, then
+ * try and figure it out.
+ */
+ if (servname != NULL) {
+ char *e;
+
+ port = strtol(servname, &e, 10);
+ if (*e == '\0') {
+ if (socktype == 0)
+ return (EAI_SOCKTYPE);
+ if (port < 0 || port > 65535)
+ return (EAI_SERVICE);
+ port = htons((unsigned short) port);
+ } else {
+ sp = getservbyname(servname, proto);
+ if (sp == NULL)
+ return (EAI_SERVICE);
+ port = sp->s_port;
+ if (socktype == 0) {
+ if (strcmp(sp->s_proto, "tcp") == 0)
+ socktype = SOCK_STREAM;
+ else if (strcmp(sp->s_proto, "udp") == 0)
+ socktype = SOCK_DGRAM;
+ }
+ }
+ } else
+ port = 0;
+
+ /*
+ * Next, deal with just a service name, and no hostname.
+ * (we verified that one of them was non-null up above).
+ */
+ if (hostname == NULL && (flags & AI_PASSIVE) != 0) {
+ if (family == AF_INET || family == 0) {
+ ai = ai_alloc(AF_INET, sizeof(struct sockaddr_in));
+ if (ai == NULL)
+ return (EAI_MEMORY);
+ ai->ai_socktype = socktype;
+ ai->ai_protocol = protocol;
+ SIN(ai->ai_addr)->sin_port = port;
+ ai->ai_next = ai_list;
+ ai_list = ai;
+ }
+
+ if (family == AF_INET6 || family == 0) {
+ ai = ai_alloc(AF_INET6, sizeof(struct sockaddr_in6));
+ if (ai == NULL) {
+ freeaddrinfo(ai_list);
+ return (EAI_MEMORY);
+ }
+ ai->ai_socktype = socktype;
+ ai->ai_protocol = protocol;
+ SIN6(ai->ai_addr)->sin6_port = port;
+ ai->ai_next = ai_list;
+ ai_list = ai;
+ }
+
+ *res = ai_list;
+ return (0);
+ }
+
+ /*
+ * If the family isn't specified or AI_NUMERICHOST specified, check
+ * first to see if it is a numeric address.
+ * Though the gethostbyname2() routine will recognize numeric addresses,
+ * it will only recognize the format that it is being called for. Thus,
+ * a numeric AF_INET address will be treated by the AF_INET6 call as
+ * a domain name, and vice versa. Checking for both numerics here
+ * avoids that.
+ */
+ if (hostname != NULL &&
+ (family == 0 || (flags & AI_NUMERICHOST) != 0)) {
+ char abuf[sizeof(struct in6_addr)];
+ char nbuf[NI_MAXHOST];
+ int addrsize, addroff;
+#ifdef IRS_HAVE_SIN6_SCOPE_ID
+ char *p, *ep;
+ char ntmp[NI_MAXHOST];
+ isc_uint32_t scopeid;
+#endif
+
+#ifdef IRS_HAVE_SIN6_SCOPE_ID
+ /*
+ * Scope identifier portion.
+ */
+ ntmp[0] = '\0';
+ if (strchr(hostname, '%') != NULL) {
+ strncpy(ntmp, hostname, sizeof(ntmp) - 1);
+ ntmp[sizeof(ntmp) - 1] = '\0';
+ p = strchr(ntmp, '%');
+ ep = NULL;
+
+ /*
+ * Vendors may want to support non-numeric
+ * scopeid around here.
+ */
+
+ if (p != NULL)
+ scopeid = (isc_uint32_t)strtoul(p + 1,
+ &ep, 10);
+ if (p != NULL && ep != NULL && ep[0] == '\0')
+ *p = '\0';
+ else {
+ ntmp[0] = '\0';
+ scopeid = 0;
+ }
+ } else
+ scopeid = 0;
+#endif
+
+ if (inet_pton(AF_INET, hostname, (struct in_addr *)abuf)
+ == 1) {
+ if (family == AF_INET6) {
+ /*
+ * Convert to a V4 mapped address.
+ */
+ struct in6_addr *a6 = (struct in6_addr *)abuf;
+ memcpy(&a6->s6_addr[12], &a6->s6_addr[0], 4);
+ memset(&a6->s6_addr[10], 0xff, 2);
+ memset(&a6->s6_addr[0], 0, 10);
+ goto inet6_addr;
+ }
+ addrsize = sizeof(struct in_addr);
+ addroff = (char *)(&SIN(0)->sin_addr) - (char *)0;
+ family = AF_INET;
+ goto common;
+#ifdef IRS_HAVE_SIN6_SCOPE_ID
+ } else if (ntmp[0] != '\0' &&
+ inet_pton(AF_INET6, ntmp, abuf) == 1) {
+ if (family && family != AF_INET6)
+ return (EAI_NONAME);
+ addrsize = sizeof(struct in6_addr);
+ addroff = (char *)(&SIN6(0)->sin6_addr) - (char *)0;
+ family = AF_INET6;
+ goto common;
+#endif
+ } else if (inet_pton(AF_INET6, hostname, abuf) == 1) {
+ if (family != 0 && family != AF_INET6)
+ return (EAI_NONAME);
+ inet6_addr:
+ addrsize = sizeof(struct in6_addr);
+ addroff = (char *)(&SIN6(0)->sin6_addr) - (char *)0;
+ family = AF_INET6;
+
+ common:
+ ai = ai_alloc(family,
+ ((family == AF_INET6) ?
+ sizeof(struct sockaddr_in6) :
+ sizeof(struct sockaddr_in)));
+ if (ai == NULL)
+ return (EAI_MEMORY);
+ ai_list = ai;
+ ai->ai_socktype = socktype;
+ SIN(ai->ai_addr)->sin_port = port;
+ memcpy((char *)ai->ai_addr + addroff, abuf, addrsize);
+ if ((flags & AI_CANONNAME) != 0) {
+#ifdef IRS_HAVE_SIN6_SCOPE_ID
+ if (ai->ai_family == AF_INET6)
+ SIN6(ai->ai_addr)->sin6_scope_id =
+ scopeid;
+#endif
+ if (getnameinfo(ai->ai_addr, ai->ai_addrlen,
+ nbuf, sizeof(nbuf), NULL, 0,
+ NI_NUMERICHOST) == 0) {
+ ai->ai_canonname = strdup(nbuf);
+ if (ai->ai_canonname == NULL) {
+ freeaddrinfo(ai);
+ return (EAI_MEMORY);
+ }
+ } else {
+ /* XXX raise error? */
+ ai->ai_canonname = NULL;
+ }
+ }
+ goto done;
+ } else if ((flags & AI_NUMERICHOST) != 0) {
+ return (EAI_NONAME);
+ }
+ }
+
+ if (hostname == NULL && (flags & AI_PASSIVE) == 0) {
+ set_order(family, net_order);
+ for (i = 0; i < FOUND_MAX; i++) {
+ if (net_order[i] == NULL)
+ break;
+ err = (net_order[i])(hostname, flags, &ai_list,
+ socktype, port);
+ if (err != 0) {
+ if (ai_list != NULL)
+ freeaddrinfo(ai_list);
+ break;
+ }
+ }
+ } else
+ err = resolve_name(family, hostname, flags, &ai_list,
+ socktype, port);
+
+ if (ai_list == NULL) {
+ if (err == 0)
+ err = EAI_NONAME;
+ return (err);
+ }
+
+done:
+ ai_list = ai_reverse(ai_list);
+
+ *res = ai_list;
+ return (0);
+}
+
+typedef struct gai_restrans {
+ dns_clientrestrans_t *xid;
+ isc_boolean_t is_inprogress;
+ int error;
+ struct addrinfo ai_sentinel;
+ struct gai_resstate *resstate;
+} gai_restrans_t;
+
+typedef struct gai_resstate {
+ isc_mem_t *mctx;
+ struct gai_statehead *head;
+ dns_fixedname_t fixedname;
+ dns_name_t *qname;
+ gai_restrans_t *trans4;
+ gai_restrans_t *trans6;
+ ISC_LINK(struct gai_resstate) link;
+} gai_resstate_t;
+
+typedef struct gai_statehead {
+ int ai_family;
+ int ai_flags;
+ int ai_socktype;
+ int ai_port;
+ isc_appctx_t *actx;
+ dns_client_t *dnsclient;
+ ISC_LIST(struct gai_resstate) resstates;
+ unsigned int activestates;
+} gai_statehead_t;
+
+static isc_result_t
+make_resstate(isc_mem_t *mctx, gai_statehead_t *head, const char *hostname,
+ const char *domain, gai_resstate_t **statep)
+{
+ isc_result_t result;
+ gai_resstate_t *state;
+ dns_fixedname_t fixeddomain;
+ dns_name_t *qdomain;
+ size_t namelen;
+ isc_buffer_t b;
+ isc_boolean_t need_v4 = ISC_FALSE;
+ isc_boolean_t need_v6 = ISC_FALSE;
+
+ state = isc_mem_get(mctx, sizeof(*state));
+ if (state == NULL)
+ return (ISC_R_NOMEMORY);
+
+ /* Construct base domain name */
+ namelen = strlen(domain);
+ isc_buffer_init(&b, domain, namelen);
+ isc_buffer_add(&b, namelen);
+ dns_fixedname_init(&fixeddomain);
+ qdomain = dns_fixedname_name(&fixeddomain);
+ result = dns_name_fromtext(qdomain, &b, dns_rootname, 0, NULL);
+ if (result != ISC_R_SUCCESS) {
+ isc_mem_put(mctx, state, sizeof(*state));
+ return (result);
+ }
+
+ /* Construct query name */
+ namelen = strlen(hostname);
+ isc_buffer_init(&b, hostname, namelen);
+ isc_buffer_add(&b, namelen);
+ dns_fixedname_init(&state->fixedname);
+ state->qname = dns_fixedname_name(&state->fixedname);
+ result = dns_name_fromtext(state->qname, &b, qdomain, 0, NULL);
+ if (result != ISC_R_SUCCESS) {
+ isc_mem_put(mctx, state, sizeof(*state));
+ return (result);
+ }
+
+ if (head->ai_family == AF_UNSPEC || head->ai_family == AF_INET)
+ need_v4 = ISC_TRUE;
+ if (head->ai_family == AF_UNSPEC || head->ai_family == AF_INET6)
+ need_v6 = ISC_TRUE;
+
+ state->trans6 = NULL;
+ state->trans4 = NULL;
+ if (need_v4) {
+ state->trans4 = isc_mem_get(mctx, sizeof(gai_restrans_t));
+ if (state->trans4 == NULL) {
+ isc_mem_put(mctx, state, sizeof(*state));
+ return (ISC_R_NOMEMORY);
+ }
+ state->trans4->error = 0;
+ state->trans4->xid = NULL;
+ state->trans4->resstate = state;
+ state->trans4->is_inprogress = ISC_TRUE;
+ state->trans4->ai_sentinel.ai_next = NULL;
+ }
+ if (need_v6) {
+ state->trans6 = isc_mem_get(mctx, sizeof(gai_restrans_t));
+ if (state->trans6 == NULL) {
+ if (state->trans4 != NULL)
+ isc_mem_put(mctx, state->trans4,
+ sizeof(*state->trans4));
+ isc_mem_put(mctx, state, sizeof(*state));
+ return (ISC_R_NOMEMORY);
+ }
+ state->trans6->error = 0;
+ state->trans6->xid = NULL;
+ state->trans6->resstate = state;
+ state->trans6->is_inprogress = ISC_TRUE;
+ state->trans6->ai_sentinel.ai_next = NULL;
+ }
+
+ state->mctx = mctx;
+ state->head = head;
+ ISC_LINK_INIT(state, link);
+
+ *statep = state;
+
+ return (ISC_R_SUCCESS);
+}
+
+static isc_result_t
+make_resstates(isc_mem_t *mctx, const char *hostname, gai_statehead_t *head,
+ irs_resconf_t *resconf)
+{
+ isc_result_t result;
+ irs_resconf_searchlist_t *searchlist;
+ irs_resconf_search_t *searchent;
+ gai_resstate_t *resstate, *resstate0;
+
+ resstate0 = NULL;
+ result = make_resstate(mctx, head, hostname, ".", &resstate0);
+ if (result != ISC_R_SUCCESS)
+ return (result);
+
+ searchlist = irs_resconf_getsearchlist(resconf);
+ for (searchent = ISC_LIST_HEAD(*searchlist); searchent != NULL;
+ searchent = ISC_LIST_NEXT(searchent, link)) {
+ resstate = NULL;
+ result = make_resstate(mctx, head, hostname,
+ (const char *)searchent->domain,
+ &resstate);
+ if (result != ISC_R_SUCCESS)
+ break;
+
+ ISC_LIST_APPEND(head->resstates, resstate, link);
+ head->activestates++;
+ }
+
+ /*
+ * Insert the original hostname either at the head or the tail of the
+ * state list, depending on the number of labels contained in the
+ * original name and the 'ndots' configuration parameter.
+ */
+ if (dns_name_countlabels(resstate0->qname) >
+ irs_resconf_getndots(resconf) + 1) {
+ ISC_LIST_PREPEND(head->resstates, resstate0, link);
+ } else
+ ISC_LIST_APPEND(head->resstates, resstate0, link);
+ head->activestates++;
+
+ if (result != ISC_R_SUCCESS) {
+ while ((resstate = ISC_LIST_HEAD(head->resstates)) != NULL) {
+ ISC_LIST_UNLINK(head->resstates, resstate, link);
+ if (resstate->trans4 != NULL) {
+ isc_mem_put(mctx, resstate->trans4,
+ sizeof(*resstate->trans4));
+ }
+ if (resstate->trans6 != NULL) {
+ isc_mem_put(mctx, resstate->trans6,
+ sizeof(*resstate->trans6));
+ }
+
+ isc_mem_put(mctx, resstate, sizeof(*resstate));
+ }
+ }
+
+ return (result);
+}
+
+static void
+process_answer(isc_task_t *task, isc_event_t *event) {
+ int error = 0, family;
+ gai_restrans_t *trans = event->ev_arg;
+ gai_resstate_t *resstate;
+ dns_clientresevent_t *rev = (dns_clientresevent_t *)event;
+ dns_rdatatype_t qtype;
+ dns_name_t *name;
+
+ REQUIRE(trans != NULL);
+ resstate = trans->resstate;
+ REQUIRE(resstate != NULL);
+ REQUIRE(task != NULL);
+
+ if (trans == resstate->trans4) {
+ family = AF_INET;
+ qtype = dns_rdatatype_a;
+ } else {
+ INSIST(trans == resstate->trans6);
+ family = AF_INET6;
+ qtype = dns_rdatatype_aaaa;
+ }
+
+ INSIST(trans->is_inprogress);
+ trans->is_inprogress = ISC_FALSE;
+
+ switch (rev->result) {
+ case ISC_R_SUCCESS:
+ case DNS_R_NCACHENXDOMAIN: /* treat this as a fatal error? */
+ case DNS_R_NCACHENXRRSET:
+ break;
+ default:
+ switch (rev->vresult) {
+ case DNS_R_SIGINVALID:
+ case DNS_R_SIGEXPIRED:
+ case DNS_R_SIGFUTURE:
+ case DNS_R_KEYUNAUTHORIZED:
+ case DNS_R_MUSTBESECURE:
+ case DNS_R_COVERINGNSEC:
+ case DNS_R_NOTAUTHORITATIVE:
+ case DNS_R_NOVALIDKEY:
+ case DNS_R_NOVALIDDS:
+ case DNS_R_NOVALIDSIG:
+ error = EAI_INSECUREDATA;
+ break;
+ default:
+ error = EAI_FAIL;
+ }
+ goto done;
+ }
+
+ /* Parse the response and construct the addrinfo chain */
+ for (name = ISC_LIST_HEAD(rev->answerlist); name != NULL;
+ name = ISC_LIST_NEXT(name, link)) {
+ isc_result_t result;
+ dns_rdataset_t *rdataset;
+ isc_buffer_t b;
+ isc_region_t r;
+ char t[1024];
+
+ for (rdataset = ISC_LIST_HEAD(name->list);
+ rdataset != NULL;
+ rdataset = ISC_LIST_NEXT(rdataset, link)) {
+ if (!dns_rdataset_isassociated(rdataset))
+ continue;
+ if (rdataset->type != qtype)
+ continue;
+
+ if ((resstate->head->ai_flags & AI_CANONNAME) != 0) {
+ isc_buffer_init(&b, t, sizeof(t));
+ result = dns_name_totext(name, ISC_TRUE, &b);
+ if (result != ISC_R_SUCCESS) {
+ error = EAI_FAIL;
+ goto done;
+ }
+ isc_buffer_putuint8(&b, '\0');
+ isc_buffer_usedregion(&b, &r);
+ }
+
+ for (result = dns_rdataset_first(rdataset);
+ result == ISC_R_SUCCESS;
+ result = dns_rdataset_next(rdataset)) {
+ struct addrinfo *ai;
+ dns_rdata_t rdata;
+ dns_rdata_in_a_t rdata_a;
+ dns_rdata_in_aaaa_t rdata_aaaa;
+
+ ai = ai_alloc(family,
+ ((family == AF_INET6) ?
+ sizeof(struct sockaddr_in6) :
+ sizeof(struct sockaddr_in)));
+ if (ai == NULL) {
+ error = EAI_MEMORY;
+ goto done;
+ }
+ ai->ai_socktype = resstate->head->ai_socktype;
+ ai->ai_next = trans->ai_sentinel.ai_next;
+ trans->ai_sentinel.ai_next = ai;
+
+ /*
+ * Set AF-specific parameters
+ * (IPv4/v6 address/port)
+ */
+ dns_rdata_init(&rdata);
+ switch (family) {
+ case AF_INET:
+ dns_rdataset_current(rdataset, &rdata);
+ dns_rdata_tostruct(&rdata, &rdata_a,
+ NULL);
+
+ SIN(ai->ai_addr)->sin_port =
+ resstate->head->ai_port;
+ memcpy(&SIN(ai->ai_addr)->sin_addr,
+ &rdata_a.in_addr, 4);
+ dns_rdata_freestruct(&rdata_a);
+ break;
+ case AF_INET6:
+ dns_rdataset_current(rdataset, &rdata);
+ dns_rdata_tostruct(&rdata, &rdata_aaaa,
+ NULL);
+ SIN6(ai->ai_addr)->sin6_port =
+ resstate->head->ai_port;
+ memcpy(&SIN6(ai->ai_addr)->sin6_addr,
+ &rdata_aaaa.in6_addr, 16);
+ dns_rdata_freestruct(&rdata_aaaa);
+ break;
+ }
+
+ if ((resstate->head->ai_flags & AI_CANONNAME)
+ != 0) {
+ ai->ai_canonname =
+ strdup((const char *)r.base);
+ if (ai->ai_canonname == NULL) {
+ error = EAI_MEMORY;
+ goto done;
+ }
+ }
+ }
+ }
+ }
+
+ done:
+ dns_client_freeresanswer(resstate->head->dnsclient, &rev->answerlist);
+ dns_client_destroyrestrans(&trans->xid);
+
+ isc_event_free(&event);
+
+ /* Make sure that error == 0 iff we have a non-empty list */
+ if (error == 0) {
+ if (trans->ai_sentinel.ai_next == NULL)
+ error = EAI_NONAME;
+ } else {
+ if (trans->ai_sentinel.ai_next != NULL) {
+ freeaddrinfo(trans->ai_sentinel.ai_next);
+ trans->ai_sentinel.ai_next = NULL;
+ }
+ }
+ trans->error = error;
+
+ /* Check whether we are done */
+ if ((resstate->trans4 == NULL || !resstate->trans4->is_inprogress) &&
+ (resstate->trans6 == NULL || !resstate->trans6->is_inprogress)) {
+ /*
+ * We're done for this state. If there is no other outstanding
+ * state, we can exit.
+ */
+ resstate->head->activestates--;
+ if (resstate->head->activestates == 0) {
+ isc_app_ctxsuspend(resstate->head->actx);
+ return;
+ }
+
+ /*
+ * There are outstanding states, but if we are at the head
+ * of the state list (i.e., at the highest search priority)
+ * and have any answer, we can stop now by canceling the
+ * others.
+ */
+ if (resstate == ISC_LIST_HEAD(resstate->head->resstates)) {
+ if ((resstate->trans4 != NULL &&
+ resstate->trans4->ai_sentinel.ai_next != NULL) ||
+ (resstate->trans6 != NULL &&
+ resstate->trans6->ai_sentinel.ai_next != NULL)) {
+ gai_resstate_t *rest;
+
+ for (rest = ISC_LIST_NEXT(resstate, link);
+ rest != NULL;
+ rest = ISC_LIST_NEXT(rest, link)) {
+ if (rest->trans4 != NULL &&
+ rest->trans4->xid != NULL)
+ dns_client_cancelresolve(
+ rest->trans4->xid);
+ if (rest->trans6 != NULL &&
+ rest->trans6->xid != NULL)
+ dns_client_cancelresolve(
+ rest->trans6->xid);
+ }
+ } else {
+ /*
+ * This search fails, so we move to the tail
+ * of the list so that the next entry will
+ * have the highest priority.
+ */
+ ISC_LIST_UNLINK(resstate->head->resstates,
+ resstate, link);
+ ISC_LIST_APPEND(resstate->head->resstates,
+ resstate, link);
+ }
+ }
+ }
+}
+
+static int
+resolve_name(int family, const char *hostname, int flags,
+ struct addrinfo **aip, int socktype, int port)
+{
+ isc_result_t result;
+ irs_context_t *irsctx;
+ irs_resconf_t *conf;
+ isc_mem_t *mctx;
+ isc_appctx_t *actx;
+ isc_task_t *task;
+ int terror = 0;
+ int error = 0;
+ dns_client_t *client;
+ gai_resstate_t *resstate;
+ gai_statehead_t head;
+ isc_boolean_t all_fail = ISC_TRUE;
+
+ /* get IRS context and the associated parameters */
+ irsctx = NULL;
+ result = irs_context_get(&irsctx);
+ if (result != ISC_R_SUCCESS)
+ return (EAI_FAIL);
+ actx = irs_context_getappctx(irsctx);
+
+ mctx = irs_context_getmctx(irsctx);
+ task = irs_context_gettask(irsctx);
+ conf = irs_context_getresconf(irsctx);
+ client = irs_context_getdnsclient(irsctx);
+
+ /* construct resolution states */
+ head.activestates = 0;
+ head.ai_family = family;
+ head.ai_socktype = socktype;
+ head.ai_flags = flags;
+ head.ai_port = port;
+ head.actx = actx;
+ head.dnsclient = client;
+ ISC_LIST_INIT(head.resstates);
+ result = make_resstates(mctx, hostname, &head, conf);
+ if (result != ISC_R_SUCCESS)
+ return (EAI_FAIL);
+
+ for (resstate = ISC_LIST_HEAD(head.resstates);
+ resstate != NULL; resstate = ISC_LIST_NEXT(resstate, link)) {
+ if (resstate->trans4 != NULL) {
+ result = dns_client_startresolve(client,
+ resstate->qname,
+ dns_rdataclass_in,
+ dns_rdatatype_a,
+ 0, task,
+ process_answer,
+ resstate->trans4,
+ &resstate->trans4->xid);
+ if (result == ISC_R_SUCCESS) {
+ resstate->trans4->is_inprogress = ISC_TRUE;
+ all_fail = ISC_FALSE;
+ } else
+ resstate->trans4->is_inprogress = ISC_FALSE;
+ }
+ if (resstate->trans6 != NULL) {
+ result = dns_client_startresolve(client,
+ resstate->qname,
+ dns_rdataclass_in,
+ dns_rdatatype_aaaa,
+ 0, task,
+ process_answer,
+ resstate->trans6,
+ &resstate->trans6->xid);
+ if (result == ISC_R_SUCCESS) {
+ resstate->trans6->is_inprogress = ISC_TRUE;
+ all_fail = ISC_FALSE;
+ } else
+ resstate->trans6->is_inprogress= ISC_FALSE;
+ }
+ }
+ if (!all_fail) {
+ /* Start all the events */
+ isc_app_ctxrun(actx);
+ } else
+ error = EAI_FAIL;
+
+ /* Cleanup */
+ while ((resstate = ISC_LIST_HEAD(head.resstates)) != NULL) {
+ int terror4 = 0, terror6 = 0;
+
+ ISC_LIST_UNLINK(head.resstates, resstate, link);
+
+ if (*aip == NULL) {
+ struct addrinfo *sentinel4 = NULL;
+ struct addrinfo *sentinel6 = NULL;
+
+ if (resstate->trans4 != NULL) {
+ sentinel4 =
+ resstate->trans4->ai_sentinel.ai_next;
+ resstate->trans4->ai_sentinel.ai_next = NULL;
+ }
+ if (resstate->trans6 != NULL) {
+ sentinel6 =
+ resstate->trans6->ai_sentinel.ai_next;
+ resstate->trans6->ai_sentinel.ai_next = NULL;
+ }
+ *aip = ai_concat(sentinel4, sentinel6);
+ }
+
+ if (resstate->trans4 != NULL) {
+ INSIST(resstate->trans4->xid == NULL);
+ terror4 = resstate->trans4->error;
+ isc_mem_put(mctx, resstate->trans4,
+ sizeof(*resstate->trans4));
+ }
+ if (resstate->trans6 != NULL) {
+ INSIST(resstate->trans6->xid == NULL);
+ terror6 = resstate->trans6->error;
+ isc_mem_put(mctx, resstate->trans6,
+ sizeof(*resstate->trans6));
+ }
+
+ /*
+ * If the entire lookup fails, we need to choose an appropriate
+ * error code from individual codes. We'll try to provide as
+ * specific a code as possible. In general, we are going to
+ * find an error code other than EAI_NONAME (which is too
+ * generic and may actually not be problematic in some cases).
+ * EAI_NONAME will be set below if no better code is found.
+ */
+ if (terror == 0 || terror == EAI_NONAME) {
+ if (terror4 != 0 && terror4 != EAI_NONAME)
+ terror = terror4;
+ else if (terror6 != 0 && terror6 != EAI_NONAME)
+ terror = terror6;
+ }
+
+ isc_mem_put(mctx, resstate, sizeof(*resstate));
+ }
+
+ if (*aip == NULL) {
+ error = terror;
+ if (error == 0)
+ error = EAI_NONAME;
+ }
+
+#if 1 /* XXX: enabled for finding leaks. should be cleaned up later. */
+ isc_app_ctxfinish(actx);
+ irs_context_destroy(&irsctx);
+#endif
+
+ return (error);
+}
+
+static char *
+irs_strsep(char **stringp, const char *delim) {
+ char *string = *stringp;
+ char *s;
+ const char *d;
+ char sc, dc;
+
+ if (string == NULL)
+ return (NULL);
+
+ for (s = string; *s != '\0'; s++) {
+ sc = *s;
+ for (d = delim; (dc = *d) != '\0'; d++)
+ if (sc == dc) {
+ *s++ = '\0';
+ *stringp = s;
+ return (string);
+ }
+ }
+ *stringp = NULL;
+ return (string);
+}
+
+static void
+set_order(int family, int (**net_order)(const char *, int, struct addrinfo **,
+ int, int))
+{
+ char *order, *tok;
+ int found;
+
+ if (family) {
+ switch (family) {
+ case AF_INET:
+ *net_order++ = add_ipv4;
+ break;
+ case AF_INET6:
+ *net_order++ = add_ipv6;
+ break;
+ }
+ } else {
+ order = getenv("NET_ORDER");
+ found = 0;
+ while (order != NULL) {
+ /*
+ * We ignore any unknown names.
+ */
+ tok = irs_strsep(&order, ":");
+ if (strcasecmp(tok, "inet6") == 0) {
+ if ((found & FOUND_IPV6) == 0)
+ *net_order++ = add_ipv6;
+ found |= FOUND_IPV6;
+ } else if (strcasecmp(tok, "inet") == 0 ||
+ strcasecmp(tok, "inet4") == 0) {
+ if ((found & FOUND_IPV4) == 0)
+ *net_order++ = add_ipv4;
+ found |= FOUND_IPV4;
+ }
+ }
+
+ /*
+ * Add in anything that we didn't find.
+ */
+ if ((found & FOUND_IPV4) == 0)
+ *net_order++ = add_ipv4;
+ if ((found & FOUND_IPV6) == 0)
+ *net_order++ = add_ipv6;
+ }
+ *net_order = NULL;
+ return;
+}
+
+static char v4_loop[4] = { 127, 0, 0, 1 };
+
+static int
+add_ipv4(const char *hostname, int flags, struct addrinfo **aip,
+ int socktype, int port)
+{
+ struct addrinfo *ai;
+
+ UNUSED(hostname);
+ UNUSED(flags);
+
+ ai = ai_clone(*aip, AF_INET); /* don't use ai_clone() */
+ if (ai == NULL) {
+ freeaddrinfo(*aip);
+ return (EAI_MEMORY);
+ }
+
+ *aip = ai;
+ ai->ai_socktype = socktype;
+ SIN(ai->ai_addr)->sin_port = port;
+ memcpy(&SIN(ai->ai_addr)->sin_addr, v4_loop, 4);
+
+ return (0);
+}
+
+static char v6_loop[16] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 };
+
+static int
+add_ipv6(const char *hostname, int flags, struct addrinfo **aip,
+ int socktype, int port)
+{
+ struct addrinfo *ai;
+
+ UNUSED(hostname);
+ UNUSED(flags);
+
+ ai = ai_clone(*aip, AF_INET6); /* don't use ai_clone() */
+ if (ai == NULL) {
+ freeaddrinfo(*aip);
+ return (EAI_MEMORY);
+ }
+
+ *aip = ai;
+ ai->ai_socktype = socktype;
+ SIN6(ai->ai_addr)->sin6_port = port;
+ memcpy(&SIN6(ai->ai_addr)->sin6_addr, v6_loop, 16);
+
+ return (0);
+}
+
+/*% Free address info. */
+void
+freeaddrinfo(struct addrinfo *ai) {
+ struct addrinfo *ai_next;
+
+ while (ai != NULL) {
+ ai_next = ai->ai_next;
+ if (ai->ai_addr != NULL)
+ free(ai->ai_addr);
+ if (ai->ai_canonname)
+ free(ai->ai_canonname);
+ free(ai);
+ ai = ai_next;
+ }
+}
+
+#ifdef AF_LOCAL
+static int
+get_local(const char *name, int socktype, struct addrinfo **res) {
+ struct addrinfo *ai;
+ struct sockaddr_un *slocal;
+
+ if (socktype == 0)
+ return (EAI_SOCKTYPE);
+
+ ai = ai_alloc(AF_LOCAL, sizeof(*slocal));
+ if (ai == NULL)
+ return (EAI_MEMORY);
+
+ slocal = SLOCAL(ai->ai_addr);
+ strncpy(slocal->sun_path, name, sizeof(slocal->sun_path));
+
+ ai->ai_socktype = socktype;
+ /*
+ * ai->ai_flags, ai->ai_protocol, ai->ai_canonname,
+ * and ai->ai_next were initialized to zero.
+ */
+
+ *res = ai;
+ return (0);
+}
+#endif
+
+/*!
+ * Allocate an addrinfo structure, and a sockaddr structure
+ * of the specificed length. We initialize:
+ * ai_addrlen
+ * ai_family
+ * ai_addr
+ * ai_addr->sa_family
+ * ai_addr->sa_len (IRS_PLATFORM_HAVESALEN)
+ * and everything else is initialized to zero.
+ */
+static struct addrinfo *
+ai_alloc(int family, int addrlen) {
+ struct addrinfo *ai;
+
+ ai = (struct addrinfo *)calloc(1, sizeof(*ai));
+ if (ai == NULL)
+ return (NULL);
+
+ ai->ai_addr = SA(calloc(1, addrlen));
+ if (ai->ai_addr == NULL) {
+ free(ai);
+ return (NULL);
+ }
+ ai->ai_addrlen = addrlen;
+ ai->ai_family = family;
+ ai->ai_addr->sa_family = family;
+#ifdef IRS_PLATFORM_HAVESALEN
+ ai->ai_addr->sa_len = addrlen;
+#endif
+ return (ai);
+}
+
+static struct addrinfo *
+ai_clone(struct addrinfo *oai, int family) {
+ struct addrinfo *ai;
+
+ ai = ai_alloc(family, ((family == AF_INET6) ?
+ sizeof(struct sockaddr_in6) : sizeof(struct sockaddr_in)));
+
+ if (ai == NULL) {
+ if (oai != NULL)
+ freeaddrinfo(oai);
+ return (NULL);
+ }
+ if (oai == NULL)
+ return (ai);
+
+ ai->ai_flags = oai->ai_flags;
+ ai->ai_socktype = oai->ai_socktype;
+ ai->ai_protocol = oai->ai_protocol;
+ ai->ai_canonname = NULL;
+ ai->ai_next = oai;
+ return (ai);
+}
+
+static struct addrinfo *
+ai_reverse(struct addrinfo *oai) {
+ struct addrinfo *nai, *tai;
+
+ nai = NULL;
+
+ while (oai != NULL) {
+ /*
+ * Grab one off the old list.
+ */
+ tai = oai;
+ oai = oai->ai_next;
+ /*
+ * Put it on the front of the new list.
+ */
+ tai->ai_next = nai;
+ nai = tai;
+ }
+ return (nai);
+}
+
+
+static struct addrinfo *
+ai_concat(struct addrinfo *ai1, struct addrinfo *ai2) {
+ struct addrinfo *ai_tmp;
+
+ if (ai1 == NULL)
+ return (ai2);
+ else if (ai2 == NULL)
+ return (ai1);
+
+ for (ai_tmp = ai1; ai_tmp != NULL && ai_tmp->ai_next != NULL;
+ ai_tmp = ai_tmp->ai_next)
+ ;
+
+ ai_tmp->ai_next = ai2;
+
+ return (ai1);
+}
diff --git a/contrib/bind9/lib/irs/getnameinfo.c b/contrib/bind9/lib/irs/getnameinfo.c
new file mode 100644
index 0000000..fadd8d8
--- /dev/null
+++ b/contrib/bind9/lib/irs/getnameinfo.c
@@ -0,0 +1,410 @@
+/*
+ * Copyright (C) 2009 Internet Systems Consortium, Inc. ("ISC")
+ *
+ * Permission to use, copy, modify, and/or 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 ISC DISCLAIMS ALL WARRANTIES WITH
+ * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+ * AND FITNESS. IN NO EVENT SHALL ISC 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.
+ */
+
+/* $Id: getnameinfo.c,v 1.4 2009-09-02 23:48:02 tbox Exp $ */
+
+/*! \file */
+
+/*
+ * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. Neither the name of the project nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+/**
+ * getnameinfo() returns the hostname for the struct sockaddr sa which is
+ * salen bytes long. The hostname is of length hostlen and is returned via
+ * *host. The maximum length of the hostname is 1025 bytes: #NI_MAXHOST.
+ *
+ * The name of the service associated with the port number in sa is
+ * returned in *serv. It is servlen bytes long. The maximum length of the
+ * service name is #NI_MAXSERV - 32 bytes.
+ *
+ * The flags argument sets the following bits:
+ *
+ * \li #NI_NOFQDN:
+ * A fully qualified domain name is not required for local hosts.
+ * The local part of the fully qualified domain name is returned
+ * instead.
+ *
+ * \li #NI_NUMERICHOST
+ * Return the address in numeric form, as if calling inet_ntop(),
+ * instead of a host name.
+ *
+ * \li #NI_NAMEREQD
+ * A name is required. If the hostname cannot be found in the DNS
+ * and this flag is set, a non-zero error code is returned. If the
+ * hostname is not found and the flag is not set, the address is
+ * returned in numeric form.
+ *
+ * \li #NI_NUMERICSERV
+ * The service name is returned as a digit string representing the
+ * port number.
+ *
+ * \li #NI_DGRAM
+ * Specifies that the service being looked up is a datagram
+ * service, and causes getservbyport() to be called with a second
+ * argument of "udp" instead of its default of "tcp". This is
+ * required for the few ports (512-514) that have different
+ * services for UDP and TCP.
+ *
+ * \section getnameinfo_return Return Values
+ *
+ * getnameinfo() returns 0 on success or a non-zero error code if
+ * an error occurs.
+ *
+ * \section getname_see See Also
+ *
+ * RFC3493, getservbyport(),
+ * getnamebyaddr(). inet_ntop().
+ */
+
+#include <config.h>
+
+#include <stdio.h>
+#include <string.h>
+
+#include <isc/netaddr.h>
+#include <isc/print.h>
+#include <isc/sockaddr.h>
+#include <isc/util.h>
+
+#include <dns/byaddr.h>
+#include <dns/client.h>
+#include <dns/fixedname.h>
+#include <dns/name.h>
+#include <dns/rdata.h>
+#include <dns/rdataset.h>
+#include <dns/rdatastruct.h>
+#include <dns/result.h>
+
+#include <irs/context.h>
+#include <irs/netdb.h>
+
+#define SUCCESS 0
+
+/*% afd structure definition */
+static struct afd {
+ int a_af;
+ size_t a_addrlen;
+ size_t a_socklen;
+} afdl [] = {
+ /*!
+ * First entry is linked last...
+ */
+ { AF_INET, sizeof(struct in_addr), sizeof(struct sockaddr_in) },
+ { AF_INET6, sizeof(struct in6_addr), sizeof(struct sockaddr_in6) },
+ {0, 0, 0},
+};
+
+/*!
+ * The test against 0 is there to keep the Solaris compiler
+ * from complaining about "end-of-loop code not reached".
+ */
+#define ERR(code) \
+ do { result = (code); \
+ if (result != 0) goto cleanup; \
+ } while (0)
+
+int
+getnameinfo(const struct sockaddr *sa, socklen_t salen, char *host,
+ IRS_GETNAMEINFO_BUFLEN_T hostlen, char *serv,
+ IRS_GETNAMEINFO_BUFLEN_T servlen, IRS_GETNAMEINFO_FLAGS_T flags)
+{
+ struct afd *afd;
+ struct servent *sp;
+ unsigned short port;
+#ifdef IRS_PLATFORM_HAVESALEN
+ size_t len;
+#endif
+ int family, i;
+ const void *addr;
+ char *p;
+#if 0
+ unsigned long v4a;
+ unsigned char pfx;
+#endif
+ char numserv[sizeof("65000")];
+ char numaddr[sizeof("abcd:abcd:abcd:abcd:abcd:abcd:255.255.255.255")
+ + 1 + sizeof("4294967295")];
+ const char *proto;
+ int result = SUCCESS;
+
+ if (sa == NULL)
+ ERR(EAI_FAIL);
+
+#ifdef IRS_PLATFORM_HAVESALEN
+ len = sa->sa_len;
+ if (len != salen)
+ ERR(EAI_FAIL);
+#endif
+
+ family = sa->sa_family;
+ for (i = 0; afdl[i].a_af; i++)
+ if (afdl[i].a_af == family) {
+ afd = &afdl[i];
+ goto found;
+ }
+ ERR(EAI_FAMILY);
+
+ found:
+ if (salen != afd->a_socklen)
+ ERR(EAI_FAIL);
+
+ switch (family) {
+ case AF_INET:
+ port = ((const struct sockaddr_in *)sa)->sin_port;
+ addr = &((const struct sockaddr_in *)sa)->sin_addr.s_addr;
+ break;
+
+ case AF_INET6:
+ port = ((const struct sockaddr_in6 *)sa)->sin6_port;
+ addr = ((const struct sockaddr_in6 *)sa)->sin6_addr.s6_addr;
+ break;
+
+ default:
+ port = 0;
+ addr = NULL;
+ INSIST(0);
+ }
+ proto = (flags & NI_DGRAM) ? "udp" : "tcp";
+
+ if (serv == NULL || servlen == 0U) {
+ /*
+ * Caller does not want service.
+ */
+ } else if ((flags & NI_NUMERICSERV) != 0 ||
+ (sp = getservbyport(port, proto)) == NULL) {
+ snprintf(numserv, sizeof(numserv), "%d", ntohs(port));
+ if ((strlen(numserv) + 1) > servlen)
+ ERR(EAI_OVERFLOW);
+ strcpy(serv, numserv);
+ } else {
+ if ((strlen(sp->s_name) + 1) > servlen)
+ ERR(EAI_OVERFLOW);
+ strcpy(serv, sp->s_name);
+ }
+
+#if 0
+ switch (sa->sa_family) {
+ case AF_INET:
+ v4a = ((struct sockaddr_in *)sa)->sin_addr.s_addr;
+ if (IN_MULTICAST(v4a) || IN_EXPERIMENTAL(v4a))
+ flags |= NI_NUMERICHOST;
+ v4a >>= IN_CLASSA_NSHIFT;
+ if (v4a == 0 || v4a == IN_LOOPBACKNET)
+ flags |= NI_NUMERICHOST;
+ break;
+
+ case AF_INET6:
+ pfx = ((struct sockaddr_in6 *)sa)->sin6_addr.s6_addr[0];
+ if (pfx == 0 || pfx == 0xfe || pfx == 0xff)
+ flags |= NI_NUMERICHOST;
+ break;
+ }
+#endif
+
+ if (host == NULL || hostlen == 0U) {
+ /*
+ * do nothing in this case.
+ * in case you are wondering if "&&" is more correct than
+ * "||" here: RFC3493 says that host == NULL or hostlen == 0
+ * means that the caller does not want the result.
+ */
+ } else if ((flags & NI_NUMERICHOST) != 0) {
+ if (inet_ntop(afd->a_af, addr, numaddr, sizeof(numaddr))
+ == NULL)
+ ERR(EAI_SYSTEM);
+#if defined(IRS_HAVE_SIN6_SCOPE_ID)
+ if (afd->a_af == AF_INET6 &&
+ ((const struct sockaddr_in6 *)sa)->sin6_scope_id) {
+ char *p = numaddr + strlen(numaddr);
+ const char *stringscope = NULL;
+#ifdef VENDOR_SPECIFIC
+ /*
+ * Vendors may want to add support for
+ * non-numeric scope identifier.
+ */
+ stringscope = foo;
+#endif
+ if (stringscope == NULL) {
+ snprintf(p, sizeof(numaddr) - (p - numaddr),
+ "%%%u",
+ ((const struct sockaddr_in6 *)sa)->sin6_scope_id);
+ } else {
+ snprintf(p, sizeof(numaddr) - (p - numaddr),
+ "%%%s", stringscope);
+ }
+ }
+#endif
+ if (strlen(numaddr) + 1 > hostlen)
+ ERR(EAI_OVERFLOW);
+ strcpy(host, numaddr);
+ } else {
+ isc_netaddr_t netaddr;
+ dns_fixedname_t ptrfname;
+ dns_name_t *ptrname;
+ irs_context_t *irsctx = NULL;
+ dns_client_t *client;
+ isc_boolean_t found = ISC_FALSE;
+ dns_namelist_t answerlist;
+ dns_rdataset_t *rdataset;
+ isc_region_t hostregion;
+ char hoststr[1024]; /* is this enough? */
+ isc_result_t iresult;
+
+ /* Get IRS context and the associated DNS client object */
+ iresult = irs_context_get(&irsctx);
+ if (iresult != ISC_R_SUCCESS)
+ ERR(EAI_FAIL);
+ client = irs_context_getdnsclient(irsctx);
+
+ /* Make query name */
+ isc_netaddr_fromsockaddr(&netaddr, (const isc_sockaddr_t *)sa);
+ dns_fixedname_init(&ptrfname);
+ ptrname = dns_fixedname_name(&ptrfname);
+ iresult = dns_byaddr_createptrname2(&netaddr, 0, ptrname);
+ if (iresult != ISC_R_SUCCESS)
+ ERR(EAI_FAIL);
+
+ /* Get the PTR RRset */
+ ISC_LIST_INIT(answerlist);
+ iresult = dns_client_resolve(client, ptrname,
+ dns_rdataclass_in,
+ dns_rdatatype_ptr,
+ DNS_CLIENTRESOPT_ALLOWRUN,
+ &answerlist);
+ switch (iresult) {
+ case ISC_R_SUCCESS:
+ /*
+ * a 'non-existent' error is not necessarily fatal for
+ * getnameinfo().
+ */
+ case DNS_R_NCACHENXDOMAIN:
+ case DNS_R_NCACHENXRRSET:
+ break;
+ case DNS_R_SIGINVALID:
+ case DNS_R_SIGEXPIRED:
+ case DNS_R_SIGFUTURE:
+ case DNS_R_KEYUNAUTHORIZED:
+ case DNS_R_MUSTBESECURE:
+ case DNS_R_COVERINGNSEC:
+ case DNS_R_NOTAUTHORITATIVE:
+ case DNS_R_NOVALIDKEY:
+ case DNS_R_NOVALIDDS:
+ case DNS_R_NOVALIDSIG:
+ ERR(EAI_INSECUREDATA);
+ default:
+ ERR(EAI_FAIL);
+ }
+
+ /* Parse the answer for the hostname */
+ for (ptrname = ISC_LIST_HEAD(answerlist); ptrname != NULL;
+ ptrname = ISC_LIST_NEXT(ptrname, link)) {
+ for (rdataset = ISC_LIST_HEAD(ptrname->list);
+ rdataset != NULL;
+ rdataset = ISC_LIST_NEXT(rdataset, link)) {
+ if (!dns_rdataset_isassociated(rdataset))
+ continue;
+ if (rdataset->type != dns_rdatatype_ptr)
+ continue;
+
+ for (iresult = dns_rdataset_first(rdataset);
+ iresult == ISC_R_SUCCESS;
+ iresult = dns_rdataset_next(rdataset)) {
+ dns_rdata_t rdata;
+ dns_rdata_ptr_t rdata_ptr;
+ isc_buffer_t b;
+
+ dns_rdata_init(&rdata);
+ dns_rdataset_current(rdataset, &rdata);
+ dns_rdata_tostruct(&rdata, &rdata_ptr,
+ NULL);
+
+ isc_buffer_init(&b, hoststr,
+ sizeof(hoststr));
+ iresult =
+ dns_name_totext(&rdata_ptr.ptr,
+ ISC_TRUE, &b);
+ dns_rdata_freestruct(&rdata_ptr);
+ if (iresult == ISC_R_SUCCESS) {
+ /*
+ * We ignore the rest of the
+ * answer. After all,
+ * getnameinfo() can return
+ * at most one hostname.
+ */
+ found = ISC_TRUE;
+ isc_buffer_usedregion(
+ &b, &hostregion);
+ goto ptrfound;
+ }
+
+ }
+ }
+ }
+ ptrfound:
+ dns_client_freeresanswer(client, &answerlist);
+ if (found) {
+ if ((flags & NI_NOFQDN) != 0) {
+ p = strchr(hoststr, '.');
+ if (p)
+ *p = '\0';
+ }
+ if (hostregion.length + 1 > hostlen)
+ ERR(EAI_OVERFLOW);
+ snprintf(host, hostlen, "%.*s",
+ (int)hostregion.length,
+ (char *)hostregion.base);
+ } else {
+ if ((flags & NI_NAMEREQD) != 0)
+ ERR(EAI_NONAME);
+ if (inet_ntop(afd->a_af, addr, numaddr,
+ sizeof(numaddr)) == NULL)
+ ERR(EAI_SYSTEM);
+ if ((strlen(numaddr) + 1) > hostlen)
+ ERR(EAI_OVERFLOW);
+ strcpy(host, numaddr);
+ }
+ }
+ result = SUCCESS;
+
+ cleanup:
+ return (result);
+}
diff --git a/contrib/bind9/lib/irs/include/Makefile.in b/contrib/bind9/lib/irs/include/Makefile.in
new file mode 100644
index 0000000..22a63ee
--- /dev/null
+++ b/contrib/bind9/lib/irs/include/Makefile.in
@@ -0,0 +1,24 @@
+# Copyright (C) 2009 Internet Systems Consortium, Inc. ("ISC")
+#
+# Permission to use, copy, modify, and/or 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 ISC DISCLAIMS ALL WARRANTIES WITH
+# REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+# AND FITNESS. IN NO EVENT SHALL ISC 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.
+
+# $Id: Makefile.in,v 1.3 2009-09-02 23:48:02 tbox Exp $
+
+srcdir = @srcdir@
+VPATH = @srcdir@
+top_srcdir = @top_srcdir@
+
+SUBDIRS = irs
+TARGETS =
+
+@BIND9_MAKE_RULES@
diff --git a/contrib/bind9/lib/irs/include/irs/Makefile.in b/contrib/bind9/lib/irs/include/irs/Makefile.in
new file mode 100644
index 0000000..7d50995
--- /dev/null
+++ b/contrib/bind9/lib/irs/include/irs/Makefile.in
@@ -0,0 +1,44 @@
+# Copyright (C) 2009 Internet Systems Consortium, Inc. ("ISC")
+#
+# Permission to use, copy, modify, and/or 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 ISC DISCLAIMS ALL WARRANTIES WITH
+# REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+# AND FITNESS. IN NO EVENT SHALL ISC 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.
+
+# $Id: Makefile.in,v 1.3 2009-09-02 23:48:02 tbox Exp $
+
+srcdir = @srcdir@
+VPATH = @srcdir@
+top_srcdir = @top_srcdir@
+
+#
+# Only list headers that are to be installed and are not
+# machine generated. The latter are handled specially in the
+# install target below.
+#
+HEADERS = version.h
+
+SUBDIRS =
+TARGETS =
+
+@BIND9_MAKE_RULES@
+
+installdirs:
+ $(SHELL) ${top_srcdir}/mkinstalldirs ${DESTDIR}${includedir}/irs
+
+install:: installdirs
+ for i in ${HEADERS}; do \
+ ${INSTALL_DATA} ${srcdir}/$$i ${DESTDIR}${includedir}/irs ; \
+ done
+ ${INSTALL_DATA} netdb.h ${DESTDIR}${includedir}/irs
+ ${INSTALL_DATA} platform.h ${DESTDIR}${includedir}/irs
+
+distclean::
+ rm -f netdb.h platform.h
diff --git a/contrib/bind9/lib/irs/include/irs/context.h b/contrib/bind9/lib/irs/include/irs/context.h
new file mode 100644
index 0000000..c49cfcf
--- /dev/null
+++ b/contrib/bind9/lib/irs/include/irs/context.h
@@ -0,0 +1,159 @@
+/*
+ * Copyright (C) 2009 Internet Systems Consortium, Inc. ("ISC")
+ *
+ * Permission to use, copy, modify, and/or 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 ISC DISCLAIMS ALL WARRANTIES WITH
+ * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+ * AND FITNESS. IN NO EVENT SHALL ISC 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.
+ */
+
+/* $Id: context.h,v 1.3 2009-09-02 23:48:02 tbox Exp $ */
+
+#ifndef IRS_CONTEXT_H
+#define IRS_CONTEXT_H 1
+
+/*! \file
+ *
+ * \brief
+ * The IRS context module provides an abstract interface to the DNS library
+ * with an application. An IRS context object initializes and holds various
+ * resources used in the DNS library.
+ */
+
+#include <dns/types.h>
+#include <irs/types.h>
+
+ISC_LANG_BEGINDECLS
+
+isc_result_t
+irs_context_create(irs_context_t **contextp);
+/*%<
+ * Create an IRS context. It internally initializes the ISC and DNS libraries
+ * (if not yet), creates a DNS client object and initializes the client using
+ * the configuration files parsed via the 'resconf' and 'dnsconf' IRS modules.
+ * Some of the internally initialized objects can be used by the application
+ * via irs_context_getxxx() functions (see below).
+ *
+ * Requires:
+ *
+ *\li contextp != NULL && *contextp == NULL.
+ */
+
+isc_result_t
+irs_context_get(irs_context_t **contextp);
+/*%<
+ * Return an IRS context for the calling thread. If no IRS context is
+ * associated to the thread, this function creates a new one by calling
+ * irs_context_create(), and associates it with the thread as a thread specific
+ * data value. This function is provided for standard libraries that are
+ * expected to be thread-safe but do not accept an appropriate IRS context
+ * as a library parameter, e.g., getaddrinfo().
+ *
+ * Requires:
+ *
+ *\li contextp != NULL && *contextp == NULL.
+ */
+
+void
+irs_context_destroy(irs_context_t **contextp);
+/*%<
+ * Destroy an IRS context.
+ *
+ * Requires:
+ *
+ *\li '*contextp' is a valid IRS context.
+ *
+ * Ensures:
+ *\li '*contextp' == NULL.
+ */
+
+isc_mem_t *
+irs_context_getmctx(irs_context_t *context);
+/*%<
+ * Return the memory context held in the context.
+ *
+ * Requires:
+ *
+ *\li 'context' is a valid IRS context.
+ */
+
+isc_appctx_t *
+irs_context_getappctx(irs_context_t *context);
+/*%<
+ * Return the application context held in the context.
+ *
+ * Requires:
+ *
+ *\li 'context' is a valid IRS context.
+ */
+
+isc_taskmgr_t *
+irs_context_gettaskmgr(irs_context_t *context);
+/*%<
+ * Return the task manager held in the context.
+ *
+ * Requires:
+ *
+ *\li 'context' is a valid IRS context.
+ */
+
+isc_timermgr_t *
+irs_context_gettimermgr(irs_context_t *context);
+/*%<
+ * Return the timer manager held in the context.
+ *
+ * Requires:
+ *
+ *\li 'context' is a valid IRS context.
+ */
+
+isc_task_t *
+irs_context_gettask(irs_context_t *context);
+/*%<
+ * Return the task object held in the context.
+ *
+ * Requires:
+ *
+ *\li 'context' is a valid IRS context.
+ */
+
+dns_client_t *
+irs_context_getdnsclient(irs_context_t *context);
+/*%<
+ * Return the DNS client object held in the context.
+ *
+ * Requires:
+ *
+ *\li 'context' is a valid IRS context.
+ */
+
+irs_resconf_t *
+irs_context_getresconf(irs_context_t *context);
+/*%<
+ * Return the resolver configuration object held in the context.
+ *
+ * Requires:
+ *
+ *\li 'context' is a valid IRS context.
+ */
+
+irs_dnsconf_t *
+irs_context_getdnsconf(irs_context_t *context);
+/*%<
+ * Return the advanced DNS configuration object held in the context.
+ *
+ * Requires:
+ *
+ *\li 'context' is a valid IRS context.
+ */
+
+ISC_LANG_ENDDECLS
+
+#endif /* IRS_CONTEXT_H */
diff --git a/contrib/bind9/lib/irs/include/irs/dnsconf.h b/contrib/bind9/lib/irs/include/irs/dnsconf.h
new file mode 100644
index 0000000..0041c16
--- /dev/null
+++ b/contrib/bind9/lib/irs/include/irs/dnsconf.h
@@ -0,0 +1,94 @@
+/*
+ * Copyright (C) 2009 Internet Systems Consortium, Inc. ("ISC")
+ *
+ * Permission to use, copy, modify, and/or 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 ISC DISCLAIMS ALL WARRANTIES WITH
+ * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+ * AND FITNESS. IN NO EVENT SHALL ISC 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.
+ */
+
+/* $Id: dnsconf.h,v 1.3 2009-09-02 23:48:02 tbox Exp $ */
+
+#ifndef IRS_DNSCONF_H
+#define IRS_DNSCONF_H 1
+
+/*! \file
+ *
+ * \brief
+ * The IRS dnsconf module parses an "advanced" configuration file related to
+ * the DNS library, such as trusted keys for DNSSEC validation, and creates
+ * the corresponding configuration objects for the DNS library modules.
+ *
+ * Notes:
+ * This module is very experimental and the configuration syntax or library
+ * interfaces may change in future versions. Currently, only the
+ * 'trusted-keys' statement is supported, whose syntax is the same as the
+ * same name of statement for named.conf.
+ */
+
+#include <irs/types.h>
+
+/*%
+ * A compound structure storing DNS key information mainly for DNSSEC
+ * validation. A dns_key_t object will be created using the 'keyname' and
+ * 'keydatabuf' members with the dst_key_fromdns() function.
+ */
+typedef struct irs_dnsconf_dnskey {
+ dns_name_t *keyname;
+ isc_buffer_t *keydatabuf;
+ ISC_LINK(struct irs_dnsconf_dnskey) link;
+} irs_dnsconf_dnskey_t;
+
+typedef ISC_LIST(irs_dnsconf_dnskey_t) irs_dnsconf_dnskeylist_t;
+
+ISC_LANG_BEGINDECLS
+
+isc_result_t
+irs_dnsconf_load(isc_mem_t *mctx, const char *filename, irs_dnsconf_t **confp);
+/*%<
+ * Load the "advanced" DNS configuration file 'filename' in the "dns.conf"
+ * format, and create a new irs_dnsconf_t object from the configuration.
+ *
+ * Requires:
+ *
+ *\li 'mctx' is a valid memory context.
+ *
+ *\li 'filename' != NULL
+ *
+ *\li 'confp' != NULL && '*confp' == NULL
+ */
+
+void
+irs_dnsconf_destroy(irs_dnsconf_t **confp);
+/*%<
+ * Destroy the dnsconf object.
+ *
+ * Requires:
+ *
+ *\li '*confp' is a valid dnsconf object.
+ *
+ * Ensures:
+ *
+ *\li *confp == NULL
+ */
+
+irs_dnsconf_dnskeylist_t *
+irs_dnsconf_gettrustedkeys(irs_dnsconf_t *conf);
+/*%<
+ * Return a list of key information stored in 'conf'.
+ *
+ * Requires:
+ *
+ *\li 'conf' is a valid dnsconf object.
+ */
+
+ISC_LANG_ENDDECLS
+
+#endif /* IRS_DNSCONF_H */
diff --git a/contrib/bind9/lib/irs/include/irs/netdb.h.in b/contrib/bind9/lib/irs/include/irs/netdb.h.in
new file mode 100644
index 0000000..9dda413
--- /dev/null
+++ b/contrib/bind9/lib/irs/include/irs/netdb.h.in
@@ -0,0 +1,167 @@
+/*
+ * Copyright (C) 2009 Internet Systems Consortium, Inc. ("ISC")
+ *
+ * Permission to use, copy, modify, and/or 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 ISC DISCLAIMS ALL WARRANTIES WITH
+ * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+ * AND FITNESS. IN NO EVENT SHALL ISC 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.
+ */
+
+/* $Id: netdb.h.in,v 1.3 2009-09-02 23:48:02 tbox Exp $ */
+
+/*! \file */
+
+#ifndef IRS_NETDB_H
+#define IRS_NETDB_H 1
+
+#include <stddef.h> /* Required on FreeBSD (and others?) for size_t. */
+#include <netdb.h> /* Contractual provision. */
+
+/*
+ * Define if <netdb.h> does not declare struct addrinfo.
+ */
+@ISC_IRS_NEEDADDRINFO@
+
+#ifdef ISC_IRS_NEEDADDRINFO
+struct addrinfo {
+ int ai_flags; /* AI_PASSIVE, AI_CANONNAME */
+ int ai_family; /* PF_xxx */
+ int ai_socktype; /* SOCK_xxx */
+ int ai_protocol; /* 0 or IPPROTO_xxx for IPv4 and IPv6 */
+ size_t ai_addrlen; /* Length of ai_addr */
+ char *ai_canonname; /* Canonical name for hostname */
+ struct sockaddr *ai_addr; /* Binary address */
+ struct addrinfo *ai_next; /* Next structure in linked list */
+};
+#endif
+
+/*
+ * Undefine all #defines we are interested in as <netdb.h> may or may not have
+ * defined them.
+ */
+
+/*
+ * Error return codes from gethostbyname() and gethostbyaddr()
+ * (left in extern int h_errno).
+ */
+
+#undef NETDB_INTERNAL
+#undef NETDB_SUCCESS
+#undef HOST_NOT_FOUND
+#undef TRY_AGAIN
+#undef NO_RECOVERY
+#undef NO_DATA
+#undef NO_ADDRESS
+
+#define NETDB_INTERNAL -1 /* see errno */
+#define NETDB_SUCCESS 0 /* no problem */
+#define HOST_NOT_FOUND 1 /* Authoritative Answer Host not found */
+#define TRY_AGAIN 2 /* Non-Authoritive Host not found, or SERVERFAIL */
+#define NO_RECOVERY 3 /* Non recoverable errors, FORMERR, REFUSED, NOTIMP */
+#define NO_DATA 4 /* Valid name, no data record of requested type */
+#define NO_ADDRESS NO_DATA /* no address, look for MX record */
+
+/*
+ * Error return codes from getaddrinfo(). EAI_INSECUREDATA is our own extension
+ * and it's very unlikely to be already defined, but undef it just in case; it
+ * at least doesn't do any harm.
+ */
+
+#undef EAI_ADDRFAMILY
+#undef EAI_AGAIN
+#undef EAI_BADFLAGS
+#undef EAI_FAIL
+#undef EAI_FAMILY
+#undef EAI_MEMORY
+#undef EAI_NODATA
+#undef EAI_NONAME
+#undef EAI_SERVICE
+#undef EAI_SOCKTYPE
+#undef EAI_SYSTEM
+#undef EAI_BADHINTS
+#undef EAI_PROTOCOL
+#undef EAI_OVERFLOW
+#undef EAI_INSECUREDATA
+#undef EAI_MAX
+
+#define EAI_ADDRFAMILY 1 /* address family for hostname not supported */
+#define EAI_AGAIN 2 /* temporary failure in name resolution */
+#define EAI_BADFLAGS 3 /* invalid value for ai_flags */
+#define EAI_FAIL 4 /* non-recoverable failure in name resolution */
+#define EAI_FAMILY 5 /* ai_family not supported */
+#define EAI_MEMORY 6 /* memory allocation failure */
+#define EAI_NODATA 7 /* no address associated with hostname */
+#define EAI_NONAME 8 /* hostname nor servname provided, or not known */
+#define EAI_SERVICE 9 /* servname not supported for ai_socktype */
+#define EAI_SOCKTYPE 10 /* ai_socktype not supported */
+#define EAI_SYSTEM 11 /* system error returned in errno */
+#define EAI_BADHINTS 12
+#define EAI_PROTOCOL 13
+#define EAI_OVERFLOW 14
+#define EAI_INSECUREDATA 15
+#define EAI_MAX 16
+
+/*
+ * Flag values for getaddrinfo()
+ */
+#undef AI_PASSIVE
+#undef AI_CANONNAME
+#undef AI_NUMERICHOST
+
+#define AI_PASSIVE 0x00000001
+#define AI_CANONNAME 0x00000002
+#define AI_NUMERICHOST 0x00000004
+
+/*
+ * Flag values for getipnodebyname()
+ */
+#undef AI_V4MAPPED
+#undef AI_ALL
+#undef AI_ADDRCONFIG
+#undef AI_DEFAULT
+
+#define AI_V4MAPPED 0x00000008
+#define AI_ALL 0x00000010
+#define AI_ADDRCONFIG 0x00000020
+#define AI_DEFAULT (AI_V4MAPPED|AI_ADDRCONFIG)
+
+/*
+ * Constants for lwres_getnameinfo()
+ */
+#undef NI_MAXHOST
+#undef NI_MAXSERV
+
+#define NI_MAXHOST 1025
+#define NI_MAXSERV 32
+
+/*
+ * Flag values for lwres_getnameinfo()
+ */
+#undef NI_NOFQDN
+#undef NI_NUMERICHOST
+#undef NI_NAMEREQD
+#undef NI_NUMERICSERV
+#undef NI_DGRAM
+#undef NI_NUMERICSCOPE
+
+#define NI_NOFQDN 0x00000001
+#define NI_NUMERICHOST 0x00000002
+#define NI_NAMEREQD 0x00000004
+#define NI_NUMERICSERV 0x00000008
+#define NI_DGRAM 0x00000010
+
+/*
+ * Tell Emacs to use C mode on this file.
+ * Local variables:
+ * mode: c
+ * End:
+ */
+
+#endif /* IRS_NETDB_H */
diff --git a/contrib/bind9/lib/irs/include/irs/platform.h.in b/contrib/bind9/lib/irs/include/irs/platform.h.in
new file mode 100644
index 0000000..f61f671
--- /dev/null
+++ b/contrib/bind9/lib/irs/include/irs/platform.h.in
@@ -0,0 +1,45 @@
+/*
+ * Copyright (C) 2009 Internet Systems Consortium, Inc. ("ISC")
+ *
+ * Permission to use, copy, modify, and/or 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 ISC DISCLAIMS ALL WARRANTIES WITH
+ * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+ * AND FITNESS. IN NO EVENT SHALL ISC 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.
+ */
+
+/* $Id: platform.h.in,v 1.3 2009-09-02 23:48:02 tbox Exp $ */
+
+/*! \file */
+
+#ifndef IRS_PLATFORM_H
+#define IRS_PLATFORM_H 1
+
+/*****
+ ***** Platform-dependent defines.
+ *****/
+
+#ifndef IRS_PLATFORM_USEDECLSPEC
+#define LIBIRS_EXTERNAL_DATA
+#else
+#ifdef LIBIRS_EXPORTS
+#define LIBIRS_EXTERNAL_DATA __declspec(dllexport)
+#else
+#define LIBIRS_EXTERNAL_DATA __declspec(dllimport)
+#endif
+#endif
+
+/*
+ * Tell Emacs to use C mode on this file.
+ * Local Variables:
+ * mode: c
+ * End:
+ */
+
+#endif /* IRS_PLATFORM_H */
diff --git a/contrib/bind9/lib/irs/include/irs/resconf.h b/contrib/bind9/lib/irs/include/irs/resconf.h
new file mode 100644
index 0000000..8249c7b
--- /dev/null
+++ b/contrib/bind9/lib/irs/include/irs/resconf.h
@@ -0,0 +1,113 @@
+/*
+ * Copyright (C) 2009 Internet Systems Consortium, Inc. ("ISC")
+ *
+ * Permission to use, copy, modify, and/or 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 ISC DISCLAIMS ALL WARRANTIES WITH
+ * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+ * AND FITNESS. IN NO EVENT SHALL ISC 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.
+ */
+
+/* $Id: resconf.h,v 1.3 2009-09-02 23:48:02 tbox Exp $ */
+
+#ifndef IRS_RESCONF_H
+#define IRS_RESCONF_H 1
+
+/*! \file
+ *
+ * \brief
+ * The IRS resconf module parses the legacy "/etc/resolv.conf" file and
+ * creates the corresponding configuration objects for the DNS library
+ * modules.
+ */
+
+#include <irs/types.h>
+
+/*%
+ * A DNS search list specified in the 'domain' or 'search' statements
+ * in the "resolv.conf" file.
+ */
+typedef struct irs_resconf_search {
+ char *domain;
+ ISC_LINK(struct irs_resconf_search) link;
+} irs_resconf_search_t;
+
+typedef ISC_LIST(irs_resconf_search_t) irs_resconf_searchlist_t;
+
+ISC_LANG_BEGINDECLS
+
+isc_result_t
+irs_resconf_load(isc_mem_t *mctx, const char *filename, irs_resconf_t **confp);
+/*%<
+ * Load the resolver configuration file 'filename' in the "resolv.conf" format,
+ * and create a new irs_resconf_t object from the configuration.
+ *
+ * Notes:
+ *
+ *\li Currently, only the following options are supported:
+ * nameserver, domain, search, sortlist, ndots, and options.
+ * In addition, 'sortlist' is not actually effective; it's parsed, but
+ * the application cannot use the configuration.
+ *
+ * Requires:
+ *
+ *\li 'mctx' is a valid memory context.
+ *
+ *\li 'filename' != NULL
+ *
+ *\li 'confp' != NULL && '*confp' == NULL
+ */
+
+void
+irs_resconf_destroy(irs_resconf_t **confp);
+/*%<
+ * Destroy the resconf object.
+ *
+ * Requires:
+ *
+ *\li '*confp' is a valid resconf object.
+ *
+ * Ensures:
+ *
+ *\li *confp == NULL
+ */
+
+isc_sockaddrlist_t *
+irs_resconf_getnameservers(irs_resconf_t *conf);
+/*%<
+ * Return a list of name server addresses stored in 'conf'.
+ *
+ * Requires:
+ *
+ *\li 'conf' is a valid resconf object.
+ */
+
+irs_resconf_searchlist_t *
+irs_resconf_getsearchlist(irs_resconf_t *conf);
+/*%<
+ * Return the search list stored in 'conf'.
+ *
+ * Requires:
+ *
+ *\li 'conf' is a valid resconf object.
+ */
+
+unsigned int
+irs_resconf_getndots(irs_resconf_t *conf);
+/*%<
+ * Return the 'ndots' value stored in 'conf'.
+ *
+ * Requires:
+ *
+ *\li 'conf' is a valid resconf object.
+ */
+
+ISC_LANG_ENDDECLS
+
+#endif /* IRS_RESCONF_H */
diff --git a/contrib/bind9/lib/irs/include/irs/types.h b/contrib/bind9/lib/irs/include/irs/types.h
new file mode 100644
index 0000000..4b8a804
--- /dev/null
+++ b/contrib/bind9/lib/irs/include/irs/types.h
@@ -0,0 +1,31 @@
+/*
+ * Copyright (C) 2009 Internet Systems Consortium, Inc. ("ISC")
+ *
+ * Permission to use, copy, modify, and/or 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 ISC DISCLAIMS ALL WARRANTIES WITH
+ * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+ * AND FITNESS. IN NO EVENT SHALL ISC 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.
+ */
+
+/* $Id: types.h,v 1.3 2009-09-02 23:48:02 tbox Exp $ */
+
+#ifndef IRS_TYPES_H
+#define IRS_TYPES_H 1
+
+/* Core Types. Alphabetized by defined type. */
+
+/*%< per-thread IRS context */
+typedef struct irs_context irs_context_t;
+/*%< resolv.conf configuration information */
+typedef struct irs_resconf irs_resconf_t;
+/*%< advanced DNS-related configuration information */
+typedef struct irs_dnsconf irs_dnsconf_t;
+
+#endif /* IRS_TYPES_H */
diff --git a/contrib/bind9/lib/irs/include/irs/version.h b/contrib/bind9/lib/irs/include/irs/version.h
new file mode 100644
index 0000000..f43aa14
--- /dev/null
+++ b/contrib/bind9/lib/irs/include/irs/version.h
@@ -0,0 +1,27 @@
+/*
+ * Copyright (C) 2009 Internet Systems Consortium, Inc. ("ISC")
+ *
+ * Permission to use, copy, modify, and/or 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 ISC DISCLAIMS ALL WARRANTIES WITH
+ * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+ * AND FITNESS. IN NO EVENT SHALL ISC 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.
+ */
+
+/* $Id: version.h,v 1.3 2009-09-02 23:48:02 tbox Exp $ */
+
+/*! \file */
+
+#include <irs/platform.h>
+
+LIBIRS_EXTERNAL_DATA extern const char irs_version[];
+
+LIBIRS_EXTERNAL_DATA extern const unsigned int irs_libinterface;
+LIBIRS_EXTERNAL_DATA extern const unsigned int irs_librevision;
+LIBIRS_EXTERNAL_DATA extern const unsigned int irs_libage;
diff --git a/contrib/bind9/lib/irs/resconf.c b/contrib/bind9/lib/irs/resconf.c
new file mode 100644
index 0000000..af1413b
--- /dev/null
+++ b/contrib/bind9/lib/irs/resconf.c
@@ -0,0 +1,636 @@
+/*
+ * Copyright (C) 2009 Internet Systems Consortium, Inc. ("ISC")
+ *
+ * Permission to use, copy, modify, and/or 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 ISC DISCLAIMS ALL WARRANTIES WITH
+ * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+ * AND FITNESS. IN NO EVENT SHALL ISC 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.
+ */
+
+/* $Id: resconf.c,v 1.3 2009-09-02 23:48:02 tbox Exp $ */
+
+/*! \file resconf.c */
+
+/**
+ * Module for parsing resolv.conf files (largely derived from lwconfig.c).
+ *
+ * irs_resconf_load() opens the file filename and parses it to initialize
+ * the configuration structure.
+ *
+ * \section lwconfig_return Return Values
+ *
+ * irs_resconf_load() returns #IRS_R_SUCCESS if it successfully read and
+ * parsed filename. It returns a non-0 error code if filename could not be
+ * opened or contained incorrect resolver statements.
+ *
+ * \section lwconfig_see See Also
+ *
+ * stdio(3), \link resolver resolver \endlink
+ *
+ * \section files Files
+ *
+ * /etc/resolv.conf
+ */
+
+#include <config.h>
+
+#include <sys/types.h>
+#include <sys/socket.h>
+
+#include <ctype.h>
+#include <errno.h>
+#include <netdb.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+
+#include <isc/magic.h>
+#include <isc/mem.h>
+#include <isc/netaddr.h>
+#include <isc/sockaddr.h>
+#include <isc/util.h>
+
+#include <irs/resconf.h>
+
+#define IRS_RESCONF_MAGIC ISC_MAGIC('R', 'E', 'S', 'c')
+#define IRS_RESCONF_VALID(c) ISC_MAGIC_VALID(c, IRS_RESCONF_MAGIC)
+
+/*!
+ * protocol constants
+ */
+
+#if ! defined(NS_INADDRSZ)
+#define NS_INADDRSZ 4
+#endif
+
+#if ! defined(NS_IN6ADDRSZ)
+#define NS_IN6ADDRSZ 16
+#endif
+
+/*!
+ * resolv.conf parameters
+ */
+
+#define RESCONFMAXNAMESERVERS 3 /*%< max 3 "nameserver" entries */
+#define RESCONFMAXSEARCH 8 /*%< max 8 domains in "search" entry */
+#define RESCONFMAXLINELEN 256 /*%< max size of a line */
+#define RESCONFMAXSORTLIST 10 /*%< max 10 */
+
+/*!
+ * configuration data structure
+ */
+
+struct irs_resconf {
+ /*
+ * The configuration data is a thread-specific object, and does not
+ * need to be locked.
+ */
+ unsigned int magic;
+ isc_mem_t *mctx;
+
+ isc_sockaddrlist_t nameservers;
+ unsigned int numns; /*%< number of configured servers */
+
+ char *domainname;
+ char *search[RESCONFMAXSEARCH];
+ isc_uint8_t searchnxt; /*%< index for next free slot */
+
+ irs_resconf_searchlist_t searchlist;
+
+ struct {
+ isc_netaddr_t addr;
+ /*% mask has a non-zero 'family' if set */
+ isc_netaddr_t mask;
+ } sortlist[RESCONFMAXSORTLIST];
+ isc_uint8_t sortlistnxt;
+
+ /*%< non-zero if 'options debug' set */
+ isc_uint8_t resdebug;
+ /*%< set to n in 'options ndots:n' */
+ isc_uint8_t ndots;
+};
+
+static isc_result_t
+resconf_parsenameserver(irs_resconf_t *conf, FILE *fp);
+static isc_result_t
+resconf_parsedomain(irs_resconf_t *conf, FILE *fp);
+static isc_result_t
+resconf_parsesearch(irs_resconf_t *conf, FILE *fp);
+static isc_result_t
+resconf_parsesortlist(irs_resconf_t *conf, FILE *fp);
+static isc_result_t
+resconf_parseoption(irs_resconf_t *ctx, FILE *fp);
+
+/*!
+ * Eat characters from FP until EOL or EOF. Returns EOF or '\n'
+ */
+static int
+eatline(FILE *fp) {
+ int ch;
+
+ ch = fgetc(fp);
+ while (ch != '\n' && ch != EOF)
+ ch = fgetc(fp);
+
+ return (ch);
+}
+
+/*!
+ * Eats white space up to next newline or non-whitespace character (of
+ * EOF). Returns the last character read. Comments are considered white
+ * space.
+ */
+static int
+eatwhite(FILE *fp) {
+ int ch;
+
+ ch = fgetc(fp);
+ while (ch != '\n' && ch != EOF && isspace((unsigned char)ch))
+ ch = fgetc(fp);
+
+ if (ch == ';' || ch == '#')
+ ch = eatline(fp);
+
+ return (ch);
+}
+
+/*!
+ * Skip over any leading whitespace and then read in the next sequence of
+ * non-whitespace characters. In this context newline is not considered
+ * whitespace. Returns EOF on end-of-file, or the character
+ * that caused the reading to stop.
+ */
+static int
+getword(FILE *fp, char *buffer, size_t size) {
+ int ch;
+ char *p = buffer;
+
+ REQUIRE(buffer != NULL);
+ REQUIRE(size > 0U);
+
+ *p = '\0';
+
+ ch = eatwhite(fp);
+
+ if (ch == EOF)
+ return (EOF);
+
+ do {
+ *p = '\0';
+
+ if (ch == EOF || isspace((unsigned char)ch))
+ break;
+ else if ((size_t) (p - buffer) == size - 1)
+ return (EOF); /* Not enough space. */
+
+ *p++ = (char)ch;
+ ch = fgetc(fp);
+ } while (1);
+
+ return (ch);
+}
+
+static isc_result_t
+add_server(isc_mem_t *mctx, const char *address_str,
+ isc_sockaddrlist_t *nameservers)
+{
+ int error;
+ isc_sockaddr_t *address = NULL;
+ struct addrinfo hints, *res;
+ isc_result_t result = ISC_R_SUCCESS;
+
+ res = NULL;
+ memset(&hints, 0, sizeof(hints));
+ hints.ai_family = AF_UNSPEC;
+ hints.ai_socktype = SOCK_DGRAM;
+ hints.ai_protocol = IPPROTO_UDP;
+ hints.ai_flags = AI_NUMERICHOST;
+ error = getaddrinfo(address_str, "53", &hints, &res);
+ if (error != 0)
+ return (ISC_R_BADADDRESSFORM);
+
+ /* XXX: special case: treat all-0 IPv4 address as loopback */
+ if (res->ai_family == AF_INET) {
+ struct in_addr *v4;
+ unsigned char zeroaddress[] = {0, 0, 0, 0};
+ unsigned char loopaddress[] = {127, 0, 0, 1};
+
+ v4 = &((struct sockaddr_in *)res->ai_addr)->sin_addr;
+ if (memcmp(v4, zeroaddress, 4) == 0)
+ memcpy(v4, loopaddress, 4);
+ }
+
+ address = isc_mem_get(mctx, sizeof(*address));
+ if (address == NULL) {
+ result = ISC_R_NOMEMORY;
+ goto cleanup;
+ }
+ if (res->ai_addrlen > sizeof(address->type)) {
+ isc_mem_put(mctx, address, sizeof(*address));
+ result = ISC_R_RANGE;
+ goto cleanup;
+ }
+ address->length = res->ai_addrlen;
+ memcpy(&address->type.sa, res->ai_addr, res->ai_addrlen);
+ ISC_LINK_INIT(address, link);
+ ISC_LIST_APPEND(*nameservers, address, link);
+
+ cleanup:
+ freeaddrinfo(res);
+
+ return (result);
+}
+
+static isc_result_t
+create_addr(const char *buffer, isc_netaddr_t *addr, int convert_zero) {
+ struct in_addr v4;
+ struct in6_addr v6;
+
+ if (inet_aton(buffer, &v4) == 1) {
+ if (convert_zero) {
+ unsigned char zeroaddress[] = {0, 0, 0, 0};
+ unsigned char loopaddress[] = {127, 0, 0, 1};
+ if (memcmp(&v4, zeroaddress, 4) == 0)
+ memcpy(&v4, loopaddress, 4);
+ }
+ addr->family = AF_INET;
+ memcpy(&addr->type.in, &v4, NS_INADDRSZ);
+ addr->zone = 0;
+ } else if (inet_pton(AF_INET6, buffer, &v6) == 1) {
+ addr->family = AF_INET6;
+ memcpy(&addr->type.in6, &v6, NS_IN6ADDRSZ);
+ addr->zone = 0;
+ } else
+ return (ISC_R_BADADDRESSFORM); /* Unrecognised format. */
+
+ return (ISC_R_SUCCESS);
+}
+
+static isc_result_t
+resconf_parsenameserver(irs_resconf_t *conf, FILE *fp) {
+ char word[RESCONFMAXLINELEN];
+ int cp;
+ isc_result_t result;
+
+ if (conf->numns == RESCONFMAXNAMESERVERS)
+ return (ISC_R_SUCCESS);
+
+ cp = getword(fp, word, sizeof(word));
+ if (strlen(word) == 0U)
+ return (ISC_R_UNEXPECTEDEND); /* Nothing on line. */
+ else if (cp == ' ' || cp == '\t')
+ cp = eatwhite(fp);
+
+ if (cp != EOF && cp != '\n')
+ return (ISC_R_UNEXPECTEDTOKEN); /* Extra junk on line. */
+
+ result = add_server(conf->mctx, word, &conf->nameservers);
+ if (result != ISC_R_SUCCESS)
+ return (result);
+ conf->numns++;
+
+ return (ISC_R_SUCCESS);
+}
+
+static isc_result_t
+resconf_parsedomain(irs_resconf_t *conf, FILE *fp) {
+ char word[RESCONFMAXLINELEN];
+ int res, i;
+
+ res = getword(fp, word, sizeof(word));
+ if (strlen(word) == 0U)
+ return (ISC_R_UNEXPECTEDEND); /* Nothing else on line. */
+ else if (res == ' ' || res == '\t')
+ res = eatwhite(fp);
+
+ if (res != EOF && res != '\n')
+ return (ISC_R_UNEXPECTEDTOKEN); /* Extra junk on line. */
+
+ if (conf->domainname != NULL)
+ isc_mem_free(conf->mctx, conf->domainname);
+
+ /*
+ * Search and domain are mutually exclusive.
+ */
+ for (i = 0; i < RESCONFMAXSEARCH; i++) {
+ if (conf->search[i] != NULL) {
+ isc_mem_free(conf->mctx, conf->search[i]);
+ conf->search[i] = NULL;
+ }
+ }
+ conf->searchnxt = 0;
+
+ conf->domainname = isc_mem_strdup(conf->mctx, word);
+ if (conf->domainname == NULL)
+ return (ISC_R_NOMEMORY);
+
+ return (ISC_R_SUCCESS);
+}
+
+static isc_result_t
+resconf_parsesearch(irs_resconf_t *conf, FILE *fp) {
+ int idx, delim;
+ char word[RESCONFMAXLINELEN];
+
+ if (conf->domainname != NULL) {
+ /*
+ * Search and domain are mutually exclusive.
+ */
+ isc_mem_free(conf->mctx, conf->domainname);
+ conf->domainname = NULL;
+ }
+
+ /*
+ * Remove any previous search definitions.
+ */
+ for (idx = 0; idx < RESCONFMAXSEARCH; idx++) {
+ if (conf->search[idx] != NULL) {
+ isc_mem_free(conf->mctx, conf->search[idx]);
+ conf->search[idx] = NULL;
+ }
+ }
+ conf->searchnxt = 0;
+
+ delim = getword(fp, word, sizeof(word));
+ if (strlen(word) == 0U)
+ return (ISC_R_UNEXPECTEDEND); /* Nothing else on line. */
+
+ idx = 0;
+ while (strlen(word) > 0U) {
+ if (conf->searchnxt == RESCONFMAXSEARCH)
+ goto ignore; /* Too many domains. */
+
+ conf->search[idx] = isc_mem_strdup(conf->mctx, word);
+ if (conf->search[idx] == NULL)
+ return (ISC_R_NOMEMORY);
+ idx++;
+ conf->searchnxt++;
+
+ ignore:
+ if (delim == EOF || delim == '\n')
+ break;
+ else
+ delim = getword(fp, word, sizeof(word));
+ }
+
+ return (ISC_R_SUCCESS);
+}
+
+static isc_result_t
+resconf_parsesortlist(irs_resconf_t *conf, FILE *fp) {
+ int delim, res, idx;
+ char word[RESCONFMAXLINELEN];
+ char *p;
+
+ delim = getword(fp, word, sizeof(word));
+ if (strlen(word) == 0U)
+ return (ISC_R_UNEXPECTEDEND); /* Empty line after keyword. */
+
+ while (strlen(word) > 0U) {
+ if (conf->sortlistnxt == RESCONFMAXSORTLIST)
+ return (ISC_R_QUOTA); /* Too many values. */
+
+ p = strchr(word, '/');
+ if (p != NULL)
+ *p++ = '\0';
+
+ idx = conf->sortlistnxt;
+ res = create_addr(word, &conf->sortlist[idx].addr, 1);
+ if (res != ISC_R_SUCCESS)
+ return (res);
+
+ if (p != NULL) {
+ res = create_addr(p, &conf->sortlist[idx].mask, 0);
+ if (res != ISC_R_SUCCESS)
+ return (res);
+ } else {
+ /*
+ * Make up a mask. (XXX: is this correct?)
+ */
+ conf->sortlist[idx].mask = conf->sortlist[idx].addr;
+ memset(&conf->sortlist[idx].mask.type, 0xff,
+ sizeof(conf->sortlist[idx].mask.type));
+ }
+
+ conf->sortlistnxt++;
+
+ if (delim == EOF || delim == '\n')
+ break;
+ else
+ delim = getword(fp, word, sizeof(word));
+ }
+
+ return (ISC_R_SUCCESS);
+}
+
+static isc_result_t
+resconf_parseoption(irs_resconf_t *conf, FILE *fp) {
+ int delim;
+ long ndots;
+ char *p;
+ char word[RESCONFMAXLINELEN];
+
+ delim = getword(fp, word, sizeof(word));
+ if (strlen(word) == 0U)
+ return (ISC_R_UNEXPECTEDEND); /* Empty line after keyword. */
+
+ while (strlen(word) > 0U) {
+ if (strcmp("debug", word) == 0) {
+ conf->resdebug = 1;
+ } else if (strncmp("ndots:", word, 6) == 0) {
+ ndots = strtol(word + 6, &p, 10);
+ if (*p != '\0') /* Bad string. */
+ return (ISC_R_UNEXPECTEDTOKEN);
+ if (ndots < 0 || ndots > 0xff) /* Out of range. */
+ return (ISC_R_RANGE);
+ conf->ndots = (isc_uint8_t)ndots;
+ }
+
+ if (delim == EOF || delim == '\n')
+ break;
+ else
+ delim = getword(fp, word, sizeof(word));
+ }
+
+ return (ISC_R_SUCCESS);
+}
+
+static isc_result_t
+add_search(irs_resconf_t *conf, char *domain) {
+ irs_resconf_search_t *entry;
+
+ entry = isc_mem_get(conf->mctx, sizeof(*entry));
+ if (entry == NULL)
+ return (ISC_R_NOMEMORY);
+
+ entry->domain = domain;
+ ISC_LINK_INIT(entry, link);
+ ISC_LIST_APPEND(conf->searchlist, entry, link);
+
+ return (ISC_R_SUCCESS);
+}
+
+/*% parses a file and fills in the data structure. */
+isc_result_t
+irs_resconf_load(isc_mem_t *mctx, const char *filename, irs_resconf_t **confp)
+{
+ FILE *fp = NULL;
+ char word[256];
+ isc_result_t rval, ret;
+ irs_resconf_t *conf;
+ int i, stopchar;
+
+ REQUIRE(mctx != NULL);
+ REQUIRE(filename != NULL);
+ REQUIRE(strlen(filename) > 0U);
+ REQUIRE(confp != NULL && *confp == NULL);
+
+ conf = isc_mem_get(mctx, sizeof(*conf));
+ if (conf == NULL)
+ return (ISC_R_NOMEMORY);
+
+ conf->mctx = mctx;
+ ISC_LIST_INIT(conf->nameservers);
+ conf->numns = 0;
+ conf->domainname = NULL;
+ conf->searchnxt = 0;
+ conf->resdebug = 0;
+ conf->ndots = 1;
+ for (i = 0; i < RESCONFMAXSEARCH; i++)
+ conf->search[i] = NULL;
+
+ errno = 0;
+ if ((fp = fopen(filename, "r")) == NULL) {
+ isc_mem_put(mctx, conf, sizeof(*conf));
+ return (ISC_R_INVALIDFILE);
+ }
+
+ ret = ISC_R_SUCCESS;
+ do {
+ stopchar = getword(fp, word, sizeof(word));
+ if (stopchar == EOF) {
+ rval = ISC_R_SUCCESS;
+ break;
+ }
+
+ if (strlen(word) == 0U)
+ rval = ISC_R_SUCCESS;
+ else if (strcmp(word, "nameserver") == 0)
+ rval = resconf_parsenameserver(conf, fp);
+ else if (strcmp(word, "domain") == 0)
+ rval = resconf_parsedomain(conf, fp);
+ else if (strcmp(word, "search") == 0)
+ rval = resconf_parsesearch(conf, fp);
+ else if (strcmp(word, "sortlist") == 0)
+ rval = resconf_parsesortlist(conf, fp);
+ else if (strcmp(word, "options") == 0)
+ rval = resconf_parseoption(conf, fp);
+ else {
+ /* unrecognised word. Ignore entire line */
+ rval = ISC_R_SUCCESS;
+ stopchar = eatline(fp);
+ if (stopchar == EOF) {
+ break;
+ }
+ }
+ if (ret == ISC_R_SUCCESS && rval != ISC_R_SUCCESS)
+ ret = rval;
+ } while (1);
+
+ fclose(fp);
+
+ /* If we don't find a nameserver fall back to localhost */
+ if (conf->numns == 0) {
+ INSIST(ISC_LIST_EMPTY(conf->nameservers));
+
+ /* XXX: should we catch errors? */
+ (void)add_server(conf->mctx, "127.0.0.1", &conf->nameservers);
+ (void)add_server(conf->mctx, "::1", &conf->nameservers);
+ }
+
+ /*
+ * Construct unified search list from domain or configured
+ * search list
+ */
+ ISC_LIST_INIT(conf->searchlist);
+ if (conf->domainname != NULL) {
+ ret = add_search(conf, conf->domainname);
+ } else if (conf->searchnxt > 0) {
+ for (i = 0; i < conf->searchnxt; i++) {
+ ret = add_search(conf, conf->search[i]);
+ if (ret != ISC_R_SUCCESS)
+ break;
+ }
+ }
+
+ conf->magic = IRS_RESCONF_MAGIC;
+
+ if (ret != ISC_R_SUCCESS)
+ irs_resconf_destroy(&conf);
+ else
+ *confp = conf;
+
+ return (ret);
+}
+
+void
+irs_resconf_destroy(irs_resconf_t **confp) {
+ irs_resconf_t *conf;
+ isc_sockaddr_t *address;
+ irs_resconf_search_t *searchentry;
+ int i;
+
+ REQUIRE(confp != NULL);
+ conf = *confp;
+ REQUIRE(IRS_RESCONF_VALID(conf));
+
+ while ((searchentry = ISC_LIST_HEAD(conf->searchlist)) != NULL) {
+ ISC_LIST_UNLINK(conf->searchlist, searchentry, link);
+ isc_mem_put(conf->mctx, searchentry, sizeof(*searchentry));
+ }
+
+ while ((address = ISC_LIST_HEAD(conf->nameservers)) != NULL) {
+ ISC_LIST_UNLINK(conf->nameservers, address, link);
+ isc_mem_put(conf->mctx, address, sizeof(*address));
+ }
+
+ if (conf->domainname != NULL)
+ isc_mem_free(conf->mctx, conf->domainname);
+
+ for (i = 0; i < RESCONFMAXSEARCH; i++) {
+ if (conf->search[i] != NULL)
+ isc_mem_free(conf->mctx, conf->search[i]);
+ }
+
+ isc_mem_put(conf->mctx, conf, sizeof(*conf));
+
+ *confp = NULL;
+}
+
+isc_sockaddrlist_t *
+irs_resconf_getnameservers(irs_resconf_t *conf) {
+ REQUIRE(IRS_RESCONF_VALID(conf));
+
+ return (&conf->nameservers);
+}
+
+irs_resconf_searchlist_t *
+irs_resconf_getsearchlist(irs_resconf_t *conf) {
+ REQUIRE(IRS_RESCONF_VALID(conf));
+
+ return (&conf->searchlist);
+}
+
+unsigned int
+irs_resconf_getndots(irs_resconf_t *conf) {
+ REQUIRE(IRS_RESCONF_VALID(conf));
+
+ return ((unsigned int)conf->ndots);
+}
diff --git a/contrib/bind9/lib/irs/version.c b/contrib/bind9/lib/irs/version.c
new file mode 100644
index 0000000..b27de99
--- /dev/null
+++ b/contrib/bind9/lib/irs/version.c
@@ -0,0 +1,27 @@
+/*
+ * Copyright (C) 2009 Internet Systems Consortium, Inc. ("ISC")
+ *
+ * Permission to use, copy, modify, and/or 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 ISC DISCLAIMS ALL WARRANTIES WITH
+ * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+ * AND FITNESS. IN NO EVENT SHALL ISC 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.
+ */
+
+/* $Id: version.c,v 1.3 2009-09-02 23:48:02 tbox Exp $ */
+
+/*! \file */
+
+#include <irs/version.h>
+
+const char irs_version[] = VERSION;
+
+const unsigned int irs_libinterface = LIBINTERFACE;
+const unsigned int irs_librevision = LIBREVISION;
+const unsigned int irs_libage = LIBAGE;
diff --git a/contrib/bind9/lib/isc/Makefile.in b/contrib/bind9/lib/isc/Makefile.in
index d831fcf..d92c0b8 100644
--- a/contrib/bind9/lib/isc/Makefile.in
+++ b/contrib/bind9/lib/isc/Makefile.in
@@ -13,7 +13,7 @@
# OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
# PERFORMANCE OF THIS SOFTWARE.
-# $Id: Makefile.in,v 1.96.50.6 2010-06-09 01:52:54 marka Exp $
+# $Id: Makefile.in,v 1.109 2010-06-09 01:43:09 marka Exp $
srcdir = @srcdir@
VPATH = @srcdir@
@@ -27,8 +27,8 @@ CINCLUDES = -I${srcdir}/unix/include \
-I${srcdir}/@ISC_THREAD_DIR@/include \
-I${srcdir}/@ISC_ARCH_DIR@/include \
-I./include \
- -I${srcdir}/include
-CDEFINES =
+ -I${srcdir}/include @ISC_OPENSSL_INC@
+CDEFINES = @USE_OPENSSL@
CWARNINGS =
# Alphabetically
@@ -39,7 +39,6 @@ UNIXOBJS = @ISC_ISCIPV6_O@ \
unix/os.@O@ unix/resource.@O@ unix/socket.@O@ unix/stdio.@O@ \
unix/stdtime.@O@ unix/strerror.@O@ unix/syslog.@O@ unix/time.@O@
-
NLSOBJS = nls/msgcat.@O@
THREADOPTOBJS = @ISC_THREAD_DIR@/condition.@O@ @ISC_THREAD_DIR@/mutex.@O@
@@ -52,8 +51,9 @@ WIN32OBJS = win32/condition.@O@ win32/dir.@O@ win32/file.@O@ \
# Alphabetically
OBJS = @ISC_EXTRA_OBJS@ \
- assertions.@O@ base32.@O@ base64.@O@ bitstring.@O@ buffer.@O@ \
- bufferlist.@O@ commandline.@O@ error.@O@ event.@O@ \
+ assertions.@O@ backtrace.@O@ base32.@O@ base64.@O@ \
+ bitstring.@O@ buffer.@O@ bufferlist.@O@ commandline.@O@ \
+ error.@O@ event.@O@ \
hash.@O@ heap.@O@ hex.@O@ hmacmd5.@O@ hmacsha.@O@ \
httpd.@O@ inet_aton.@O@ iterated_hash.@O@ \
lex.@O@ lfsr.@O@ lib.@O@ log.@O@ \
@@ -64,11 +64,12 @@ OBJS = @ISC_EXTRA_OBJS@ \
serial.@O@ sha1.@O@ sha2.@O@ sockaddr.@O@ stats.@O@ \
string.@O@ strtoul.@O@ symtab.@O@ task.@O@ taskpool.@O@ \
timer.@O@ version.@O@ ${UNIXOBJS} ${NLSOBJS} ${THREADOBJS}
+SYMTBLOBJS = backtrace-emptytbl.@O@
# Alphabetically
SRCS = @ISC_EXTRA_SRCS@ \
- assertions.c base32.c base64.c bitstring.c buffer.c \
- bufferlist.c commandline.c error.c event.c \
+ assertions.c backtrace.c base32.c base64.c bitstring.c \
+ buffer.c bufferlist.c commandline.c error.c event.c \
heap.c hex.c hmacmd5.c hmacsha.c \
httpd.c inet_aton.c iterated_hash.c \
lex.c lfsr.c lib.c log.c \
@@ -77,7 +78,7 @@ SRCS = @ISC_EXTRA_SRCS@ \
parseint.c portset.c quota.c radix.c random.c \
ratelimiter.c refcount.c region.c result.c rwlock.c \
serial.c sha1.c sha2.c sockaddr.c stats.c string.c strtoul.c \
- symtab.c task.c taskpool.c timer.c version.c
+ symtab.c symtbl-empty.c task.c taskpool.c timer.c version.c
LIBS = @LIBS@
@@ -98,17 +99,27 @@ version.@O@: version.c
-DLIBAGE=${LIBAGE} \
-c ${srcdir}/version.c
-libisc.@SA@: ${OBJS}
+libisc.@SA@: ${OBJS} ${SYMTBLOBJS}
+ ${AR} ${ARFLAGS} $@ ${OBJS} ${SYMTBLOBJS}
+ ${RANLIB} $@
+
+libisc-nosymtbl.@SA@: ${OBJS}
${AR} ${ARFLAGS} $@ ${OBJS}
${RANLIB} $@
-libisc.la: ${OBJS}
+libisc.la: ${OBJS} ${SYMTBLOBJS}
${LIBTOOL_MODE_LINK} \
${CC} ${ALL_CFLAGS} ${LDFLAGS} -o libisc.la -rpath ${libdir} \
-version-info ${LIBINTERFACE}:${LIBREVISION}:${LIBAGE} \
+ ${OBJS} ${SYMTBLOBJS} ${LIBS}
+
+libisc-nosymtbl.la: ${OBJS}
+ ${LIBTOOL_MODE_LINK} \
+ ${CC} ${ALL_CFLAGS} ${LDFLAGS} -o libisc-nosymtbl.la -rpath ${libdir} \
+ -version-info ${LIBINTERFACE}:${LIBREVISION}:${LIBAGE} \
${OBJS} ${LIBS}
-timestamp: libisc.@A@
+timestamp: libisc.@A@ libisc-nosymtbl.@A@
touch timestamp
installdirs:
@@ -118,4 +129,5 @@ install:: timestamp installdirs
${LIBTOOL_MODE_INSTALL} ${INSTALL_DATA} libisc.@A@ ${DESTDIR}${libdir}
clean distclean::
- rm -f libisc.@A@ libisc.la timestamp
+ rm -f libisc.@A@ libisc-nosymtbl.@A@ libisc.la \
+ libisc-nosymtbl.la timestamp
diff --git a/contrib/bind9/lib/isc/alpha/include/isc/atomic.h b/contrib/bind9/lib/isc/alpha/include/isc/atomic.h
index bb4f1ad..012c955 100644
--- a/contrib/bind9/lib/isc/alpha/include/isc/atomic.h
+++ b/contrib/bind9/lib/isc/alpha/include/isc/atomic.h
@@ -14,7 +14,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: atomic.h,v 1.5.332.2 2009-04-08 06:47:32 tbox Exp $ */
+/* $Id: atomic.h,v 1.7 2009-04-08 06:48:23 tbox Exp $ */
/*
* This code was written based on FreeBSD's kernel source whose copyright
diff --git a/contrib/bind9/lib/isc/api b/contrib/bind9/lib/isc/api
index e1f7b71..b91b130 100644
--- a/contrib/bind9/lib/isc/api
+++ b/contrib/bind9/lib/isc/api
@@ -1,3 +1,3 @@
-LIBINTERFACE = 54
-LIBREVISION = 1
-LIBAGE = 4
+LIBINTERFACE = 81
+LIBREVISION = 2
+LIBAGE = 0
diff --git a/contrib/bind9/lib/isc/app_api.c b/contrib/bind9/lib/isc/app_api.c
new file mode 100644
index 0000000..b2a2f14
--- /dev/null
+++ b/contrib/bind9/lib/isc/app_api.c
@@ -0,0 +1,136 @@
+/*
+ * Copyright (C) 2009 Internet Systems Consortium, Inc. ("ISC")
+ *
+ * Permission to use, copy, modify, and/or 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 ISC DISCLAIMS ALL WARRANTIES WITH
+ * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+ * AND FITNESS. IN NO EVENT SHALL ISC 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.
+ */
+
+/* $Id: app_api.c,v 1.5 2009-09-02 23:48:02 tbox Exp $ */
+
+#include <config.h>
+
+#include <unistd.h>
+
+#include <isc/app.h>
+#include <isc/magic.h>
+#include <isc/mutex.h>
+#include <isc/once.h>
+#include <isc/util.h>
+
+static isc_mutex_t createlock;
+static isc_once_t once = ISC_ONCE_INIT;
+static isc_appctxcreatefunc_t appctx_createfunc = NULL;
+
+#define ISCAPI_APPMETHODS_VALID(m) ISC_MAGIC_VALID(m, ISCAPI_APPMETHODS_MAGIC)
+
+static void
+initialize(void) {
+ RUNTIME_CHECK(isc_mutex_init(&createlock) == ISC_R_SUCCESS);
+}
+
+isc_result_t
+isc_app_register(isc_appctxcreatefunc_t createfunc) {
+ isc_result_t result = ISC_R_SUCCESS;
+
+ RUNTIME_CHECK(isc_once_do(&once, initialize) == ISC_R_SUCCESS);
+
+ LOCK(&createlock);
+ if (appctx_createfunc == NULL)
+ appctx_createfunc = createfunc;
+ else
+ result = ISC_R_EXISTS;
+ UNLOCK(&createlock);
+
+ return (result);
+}
+
+isc_result_t
+isc_appctx_create(isc_mem_t *mctx, isc_appctx_t **ctxp) {
+ isc_result_t result;
+
+ LOCK(&createlock);
+
+ REQUIRE(appctx_createfunc != NULL);
+ result = (*appctx_createfunc)(mctx, ctxp);
+
+ UNLOCK(&createlock);
+
+ return (result);
+}
+
+void
+isc_appctx_destroy(isc_appctx_t **ctxp) {
+ REQUIRE(ctxp != NULL && ISCAPI_APPCTX_VALID(*ctxp));
+
+ (*ctxp)->methods->ctxdestroy(ctxp);
+
+ ENSURE(*ctxp == NULL);
+}
+
+isc_result_t
+isc_app_ctxstart(isc_appctx_t *ctx) {
+ REQUIRE(ISCAPI_APPCTX_VALID(ctx));
+
+ return (ctx->methods->ctxstart(ctx));
+}
+
+isc_result_t
+isc_app_ctxrun(isc_appctx_t *ctx) {
+ REQUIRE(ISCAPI_APPCTX_VALID(ctx));
+
+ return (ctx->methods->ctxrun(ctx));
+}
+
+isc_result_t
+isc_app_ctxsuspend(isc_appctx_t *ctx) {
+ REQUIRE(ISCAPI_APPCTX_VALID(ctx));
+
+ return (ctx->methods->ctxsuspend(ctx));
+}
+
+isc_result_t
+isc_app_ctxshutdown(isc_appctx_t *ctx) {
+ REQUIRE(ISCAPI_APPCTX_VALID(ctx));
+
+ return (ctx->methods->ctxshutdown(ctx));
+}
+
+void
+isc_app_ctxfinish(isc_appctx_t *ctx) {
+ REQUIRE(ISCAPI_APPCTX_VALID(ctx));
+
+ ctx->methods->ctxfinish(ctx);
+}
+
+void
+isc_appctx_settaskmgr(isc_appctx_t *ctx, isc_taskmgr_t *taskmgr) {
+ REQUIRE(ISCAPI_APPCTX_VALID(ctx));
+ REQUIRE(taskmgr != NULL);
+
+ ctx->methods->settaskmgr(ctx, taskmgr);
+}
+
+void
+isc_appctx_setsocketmgr(isc_appctx_t *ctx, isc_socketmgr_t *socketmgr) {
+ REQUIRE(ISCAPI_APPCTX_VALID(ctx));
+ REQUIRE(socketmgr != NULL);
+
+ ctx->methods->setsocketmgr(ctx, socketmgr);
+}
+
+void
+isc_appctx_settimermgr(isc_appctx_t *ctx, isc_timermgr_t *timermgr) {
+ REQUIRE(ISCAPI_APPCTX_VALID(ctx));
+ REQUIRE(timermgr != NULL);
+
+ ctx->methods->settimermgr(ctx, timermgr);
+}
diff --git a/contrib/bind9/lib/isc/assertions.c b/contrib/bind9/lib/isc/assertions.c
index b98d61d..fe082b7 100644
--- a/contrib/bind9/lib/isc/assertions.c
+++ b/contrib/bind9/lib/isc/assertions.c
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004, 2005, 2007, 2008 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004, 2005, 2007-2009 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 1997-2001 Internet Software Consortium.
*
* Permission to use, copy, modify, and/or distribute this software for any
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: assertions.c,v 1.23 2008-10-15 23:47:31 tbox Exp $ */
+/* $Id: assertions.c,v 1.26 2009-09-29 15:06:07 fdupont Exp $ */
/*! \file */
@@ -25,29 +25,47 @@
#include <stdlib.h>
#include <isc/assertions.h>
+#include <isc/backtrace.h>
#include <isc/msgs.h>
+#include <isc/result.h>
+
+/*
+ * The maximum number of stack frames to dump on assertion failure.
+ */
+#ifndef BACKTRACE_MAXFRAME
+#define BACKTRACE_MAXFRAME 128
+#endif
/*%
* Forward.
*/
-/* coverity[+kill] */
static void
default_callback(const char *, int, isc_assertiontype_t, const char *);
+static isc_assertioncallback_t isc_assertion_failed_cb = default_callback;
+
/*%
* Public.
*/
-LIBISC_EXTERNAL_DATA isc_assertioncallback_t isc_assertion_failed =
- default_callback;
+/*% assertion failed handler */
+/* coverity[+kill] */
+void
+isc_assertion_failed(const char *file, int line, isc_assertiontype_t type,
+ const char *cond)
+{
+ isc_assertion_failed_cb(file, line, type, cond);
+ abort();
+ /* NOTREACHED */
+}
/*% Set callback. */
void
isc_assertion_setcallback(isc_assertioncallback_t cb) {
if (cb == NULL)
- isc_assertion_failed = default_callback;
+ isc_assertion_failed_cb = default_callback;
else
- isc_assertion_failed = cb;
+ isc_assertion_failed_cb = cb;
}
/*% Type to Text */
@@ -87,11 +105,35 @@ static void
default_callback(const char *file, int line, isc_assertiontype_t type,
const char *cond)
{
- fprintf(stderr, "%s:%d: %s(%s) %s.\n",
+ void *tracebuf[BACKTRACE_MAXFRAME];
+ int i, nframes;
+ const char *logsuffix = ".";
+ const char *fname;
+ isc_result_t result;
+
+ result = isc_backtrace_gettrace(tracebuf, BACKTRACE_MAXFRAME, &nframes);
+ if (result == ISC_R_SUCCESS && nframes > 0)
+ logsuffix = ", back trace";
+
+ fprintf(stderr, "%s:%d: %s(%s) %s%s\n",
file, line, isc_assertion_typetotext(type), cond,
isc_msgcat_get(isc_msgcat, ISC_MSGSET_GENERAL,
- ISC_MSG_FAILED, "failed"));
+ ISC_MSG_FAILED, "failed"), logsuffix);
+ if (result == ISC_R_SUCCESS) {
+ for (i = 0; i < nframes; i++) {
+ unsigned long offset;
+
+ fname = NULL;
+ result = isc_backtrace_getsymbol(tracebuf[i], &fname,
+ &offset);
+ if (result == ISC_R_SUCCESS) {
+ fprintf(stderr, "#%d %p in %s()+0x%lx\n", i,
+ tracebuf[i], fname, offset);
+ } else {
+ fprintf(stderr, "#%d %p in ??\n", i,
+ tracebuf[i]);
+ }
+ }
+ }
fflush(stderr);
- abort();
- /* NOTREACHED */
}
diff --git a/contrib/bind9/lib/isc/backtrace-emptytbl.c b/contrib/bind9/lib/isc/backtrace-emptytbl.c
new file mode 100644
index 0000000..2743030
--- /dev/null
+++ b/contrib/bind9/lib/isc/backtrace-emptytbl.c
@@ -0,0 +1,34 @@
+/*
+ * Copyright (C) 2009 Internet Systems Consortium, Inc. ("ISC")
+ *
+ * Permission to use, copy, modify, and/or 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 ISC DISCLAIMS ALL WARRANTIES WITH
+ * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+ * AND FITNESS. IN NO EVENT SHALL ISC 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.
+ */
+
+/* $Id: backtrace-emptytbl.c,v 1.3 2009-09-01 20:13:44 each Exp $ */
+
+/*! \file */
+
+/*
+ * This file defines an empty (default) symbol table used in backtrace.c
+ * If the application wants to have a complete symbol table, it should redefine
+ * isc__backtrace_symtable with the complete table in some way, and link the
+ * version of the library not including this definition
+ * (e.g. libisc-nosymbol.a).
+ */
+
+#include <config.h>
+
+#include <isc/backtrace.h>
+
+const int isc__backtrace_nsymbols = 0;
+const isc_backtrace_symmap_t isc__backtrace_symtable[] = { { NULL, "" } };
diff --git a/contrib/bind9/lib/isc/backtrace.c b/contrib/bind9/lib/isc/backtrace.c
new file mode 100644
index 0000000..7b5ddfe
--- /dev/null
+++ b/contrib/bind9/lib/isc/backtrace.c
@@ -0,0 +1,285 @@
+/*
+ * Copyright (C) 2009 Internet Systems Consortium, Inc. ("ISC")
+ *
+ * Permission to use, copy, modify, and/or 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 ISC DISCLAIMS ALL WARRANTIES WITH
+ * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+ * AND FITNESS. IN NO EVENT SHALL ISC 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.
+ */
+
+/* $Id: backtrace.c,v 1.3 2009-09-02 23:48:02 tbox Exp $ */
+
+/*! \file */
+
+#include "config.h"
+
+#include <string.h>
+#include <stdlib.h>
+#ifdef HAVE_LIBCTRACE
+#include <execinfo.h>
+#endif
+
+#include <isc/backtrace.h>
+#include <isc/result.h>
+#include <isc/util.h>
+
+#ifdef ISC_PLATFORM_USEBACKTRACE
+/*
+ * Getting a back trace of a running process is tricky and highly platform
+ * dependent. Our current approach is as follows:
+ * 1. If the system library supports the "backtrace()" function, use it.
+ * 2. Otherwise, if the compiler is gcc and the architecture is x86_64 or IA64,
+ * then use gcc's (hidden) Unwind_Backtrace() function. Note that this
+ * function doesn't work for C programs on many other architectures.
+ * 3. Otherwise, if the architecture x86 or x86_64, try to unwind the stack
+ * frame following frame pointers. This assumes the executable binary
+ * compiled with frame pointers; this is not always true for x86_64 (rather,
+ * compiler optimizations often disable frame pointers). The validation
+ * checks in getnextframeptr() hopefully rejects bogus values stored in
+ * the RBP register in such a case. If the backtrace function itself crashes
+ * due to this problem, the whole package should be rebuilt with
+ * --disable-backtrace.
+ */
+#ifdef HAVE_LIBCTRACE
+#define BACKTRACE_LIBC
+#elif defined(__GNUC__) && (defined(__x86_64__) || defined(__ia64__))
+#define BACKTRACE_GCC
+#elif defined(__x86_64__) || defined(__i386__)
+#define BACKTRACE_X86STACK
+#else
+#define BACKTRACE_DISABLED
+#endif /* HAVE_LIBCTRACE */
+#else /* !ISC_PLATFORM_USEBACKTRACE */
+#define BACKTRACE_DISABLED
+#endif /* ISC_PLATFORM_USEBACKTRACE */
+
+#ifdef BACKTRACE_LIBC
+isc_result_t
+isc_backtrace_gettrace(void **addrs, int maxaddrs, int *nframes) {
+ int n;
+
+ /*
+ * Validate the arguments: intentionally avoid using REQUIRE().
+ * See notes in backtrace.h.
+ */
+ if (addrs == NULL || nframes == NULL)
+ return (ISC_R_FAILURE);
+
+ /*
+ * backtrace(3) includes this function itself in the address array,
+ * which should be eliminated from the returned sequence.
+ */
+ n = backtrace(addrs, maxaddrs);
+ if (n < 2)
+ return (ISC_R_NOTFOUND);
+ n--;
+ memmove(addrs, &addrs[1], sizeof(void *) * n);
+ *nframes = n;
+ return (ISC_R_SUCCESS);
+}
+#elif defined(BACKTRACE_GCC)
+extern int _Unwind_Backtrace(void* fn, void* a);
+extern void* _Unwind_GetIP(void* ctx);
+
+typedef struct {
+ void **result;
+ int max_depth;
+ int skip_count;
+ int count;
+} trace_arg_t;
+
+static int
+btcallback(void *uc, void *opq) {
+ trace_arg_t *arg = (trace_arg_t *)opq;
+
+ if (arg->skip_count > 0)
+ arg->skip_count--;
+ else
+ arg->result[arg->count++] = (void *)_Unwind_GetIP(uc);
+ if (arg->count == arg->max_depth)
+ return (5); /* _URC_END_OF_STACK */
+
+ return (0); /* _URC_NO_REASON */
+}
+
+isc_result_t
+isc_backtrace_gettrace(void **addrs, int maxaddrs, int *nframes) {
+ trace_arg_t arg;
+
+ /* Argument validation: see above. */
+ if (addrs == NULL || nframes == NULL)
+ return (ISC_R_FAILURE);
+
+ arg.skip_count = 1;
+ arg.result = addrs;
+ arg.max_depth = maxaddrs;
+ arg.count = 0;
+ _Unwind_Backtrace(btcallback, &arg);
+
+ *nframes = arg.count;
+
+ return (ISC_R_SUCCESS);
+}
+#elif defined(BACKTRACE_X86STACK)
+#ifdef __x86_64__
+static unsigned long
+getrbp() {
+ __asm("movq %rbp, %rax\n");
+}
+#endif
+
+static void **
+getnextframeptr(void **sp) {
+ void **newsp = (void **)*sp;
+
+ /*
+ * Perform sanity check for the new frame pointer, derived from
+ * google glog. This can actually be bogus depending on compiler.
+ */
+
+ /* prohibit the stack frames from growing downwards */
+ if (newsp <= sp)
+ return (NULL);
+
+ /* A heuristics to reject "too large" frame: this actually happened. */
+ if ((char *)newsp - (char *)sp > 100000)
+ return (NULL);
+
+ /*
+ * Not sure if other checks used in glog are needed at this moment.
+ * For our purposes we don't have to consider non-contiguous frames,
+ * for example.
+ */
+
+ return (newsp);
+}
+
+isc_result_t
+isc_backtrace_gettrace(void **addrs, int maxaddrs, int *nframes) {
+ int i = 0;
+ void **sp;
+
+ /* Argument validation: see above. */
+ if (addrs == NULL || nframes == NULL)
+ return (ISC_R_FAILURE);
+
+#ifdef __x86_64__
+ sp = (void **)getrbp();
+ if (sp == NULL)
+ return (ISC_R_NOTFOUND);
+ /*
+ * sp is the frame ptr of this function itself due to the call to
+ * getrbp(), so need to unwind one frame for consistency.
+ */
+ sp = getnextframeptr(sp);
+#else
+ /*
+ * i386: the frame pointer is stored 2 words below the address for the
+ * first argument. Note that the body of this function cannot be
+ * inlined since it depends on the address of the function argument.
+ */
+ sp = (void **)&addrs - 2;
+#endif
+
+ while (sp != NULL && i < maxaddrs) {
+ addrs[i++] = *(sp + 1);
+ sp = getnextframeptr(sp);
+ }
+
+ *nframes = i;
+
+ return (ISC_R_SUCCESS);
+}
+#elif defined(BACKTRACE_DISABLED)
+isc_result_t
+isc_backtrace_gettrace(void **addrs, int maxaddrs, int *nframes) {
+ /* Argument validation: see above. */
+ if (addrs == NULL || nframes == NULL)
+ return (ISC_R_FAILURE);
+
+ UNUSED(maxaddrs);
+
+ return (ISC_R_NOTIMPLEMENTED);
+}
+#endif
+
+isc_result_t
+isc_backtrace_getsymbolfromindex(int index, const void **addrp,
+ const char **symbolp)
+{
+ REQUIRE(addrp != NULL && *addrp == NULL);
+ REQUIRE(symbolp != NULL && *symbolp == NULL);
+
+ if (index < 0 || index >= isc__backtrace_nsymbols)
+ return (ISC_R_RANGE);
+
+ *addrp = isc__backtrace_symtable[index].addr;
+ *symbolp = isc__backtrace_symtable[index].symbol;
+ return (ISC_R_SUCCESS);
+}
+
+static int
+symtbl_compare(const void *addr, const void *entryarg) {
+ const isc_backtrace_symmap_t *entry = entryarg;
+ const isc_backtrace_symmap_t *end =
+ &isc__backtrace_symtable[isc__backtrace_nsymbols - 1];
+
+ if (isc__backtrace_nsymbols == 1 || entry == end) {
+ if (addr >= entry->addr) {
+ /*
+ * If addr is equal to or larger than that of the last
+ * entry of the table, we cannot be sure if this is
+ * within a valid range so we consider it valid.
+ */
+ return (0);
+ }
+ return (-1);
+ }
+
+ /* entry + 1 is a valid entry from now on. */
+ if (addr < entry->addr)
+ return (-1);
+ else if (addr >= (entry + 1)->addr)
+ return (1);
+ return (0);
+}
+
+isc_result_t
+isc_backtrace_getsymbol(const void *addr, const char **symbolp,
+ unsigned long *offsetp)
+{
+ isc_result_t result = ISC_R_SUCCESS;
+ isc_backtrace_symmap_t *found;
+
+ /*
+ * Validate the arguments: intentionally avoid using REQUIRE().
+ * See notes in backtrace.h.
+ */
+ if (symbolp == NULL || *symbolp != NULL || offsetp == NULL)
+ return (ISC_R_FAILURE);
+
+ if (isc__backtrace_nsymbols < 1)
+ return (ISC_R_NOTFOUND);
+
+ /*
+ * Search the table for the entry that meets:
+ * entry.addr <= addr < next_entry.addr.
+ */
+ found = bsearch(addr, isc__backtrace_symtable, isc__backtrace_nsymbols,
+ sizeof(isc__backtrace_symtable[0]), symtbl_compare);
+ if (found == NULL)
+ result = ISC_R_NOTFOUND;
+ else {
+ *symbolp = found->symbol;
+ *offsetp = (const char *)addr - (char *)found->addr;
+ }
+
+ return (result);
+}
diff --git a/contrib/bind9/lib/isc/base32.c b/contrib/bind9/lib/isc/base32.c
index 5e5cbd9..7621920 100644
--- a/contrib/bind9/lib/isc/base32.c
+++ b/contrib/bind9/lib/isc/base32.c
@@ -14,7 +14,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: base32.c,v 1.3.116.3 2009-10-21 01:22:47 each Exp $ */
+/* $Id: base32.c,v 1.6 2009-10-21 01:22:29 each Exp $ */
/*! \file */
diff --git a/contrib/bind9/lib/isc/base64.c b/contrib/bind9/lib/isc/base64.c
index 858525f..ee34c3c 100644
--- a/contrib/bind9/lib/isc/base64.c
+++ b/contrib/bind9/lib/isc/base64.c
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: base64.c,v 1.32.332.2 2009-10-21 23:47:20 tbox Exp $ */
+/* $Id: base64.c,v 1.34 2009-10-21 23:48:05 tbox Exp $ */
/*! \file */
diff --git a/contrib/bind9/lib/isc/entropy.c b/contrib/bind9/lib/isc/entropy.c
index af8757f..8d273d2 100644
--- a/contrib/bind9/lib/isc/entropy.c
+++ b/contrib/bind9/lib/isc/entropy.c
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: entropy.c,v 1.18.332.4 2010-08-10 23:46:54 tbox Exp $ */
+/* $Id: entropy.c,v 1.22 2010-08-10 23:48:19 tbox Exp $ */
/*! \file
* \brief
diff --git a/contrib/bind9/lib/isc/hash.c b/contrib/bind9/lib/isc/hash.c
index 7c0fcea..44975e7 100644
--- a/contrib/bind9/lib/isc/hash.c
+++ b/contrib/bind9/lib/isc/hash.c
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: hash.c,v 1.13.332.3 2009-05-07 23:47:12 tbox Exp $ */
+/* $Id: hash.c,v 1.16 2009-09-01 00:22:28 jinmei Exp $ */
/*! \file
* Some portion of this code was derived from universal hash function
@@ -194,8 +194,12 @@ isc_hash_ctxcreate(isc_mem_t *mctx, isc_entropy_t *entropy,
hctx->vectorlen = vlen;
hctx->rndvector = rv;
+#ifdef BIND9
if (entropy != NULL)
isc_entropy_attach(entropy, &hctx->entropy);
+#else
+ UNUSED(entropy);
+#endif
*hctxp = hctx;
return (ISC_R_SUCCESS);
@@ -236,18 +240,22 @@ isc_hash_create(isc_mem_t *mctx, isc_entropy_t *entropy, size_t limit) {
void
isc_hash_ctxinit(isc_hash_t *hctx) {
- isc_result_t result;
-
LOCK(&hctx->lock);
if (hctx->initialized == ISC_TRUE)
goto out;
if (hctx->entropy) {
+#ifdef BIND9
+ isc_result_t result;
+
result = isc_entropy_getdata(hctx->entropy,
hctx->rndvector, hctx->vectorlen,
NULL, 0);
INSIST(result == ISC_R_SUCCESS);
+#else
+ INSIST(0);
+#endif
} else {
isc_uint32_t pr;
unsigned int i, copylen;
@@ -293,6 +301,7 @@ static void
destroy(isc_hash_t **hctxp) {
isc_hash_t *hctx;
isc_mem_t *mctx;
+ unsigned char canary0[4], canary1[4];
REQUIRE(hctxp != NULL && *hctxp != NULL);
hctx = *hctxp;
@@ -303,8 +312,10 @@ destroy(isc_hash_t **hctxp) {
isc_refcount_destroy(&hctx->refcnt);
mctx = hctx->mctx;
+#ifdef BIND9
if (hctx->entropy != NULL)
isc_entropy_detach(&hctx->entropy);
+#endif
if (hctx->rndvector != NULL)
isc_mem_put(mctx, hctx->rndvector, hctx->vectorlen);
@@ -312,7 +323,10 @@ destroy(isc_hash_t **hctxp) {
DESTROYLOCK(&hctx->lock);
+ memcpy(canary0, hctx + 1, sizeof(canary0));
memset(hctx, 0, sizeof(isc_hash_t));
+ memcpy(canary1, hctx + 1, sizeof(canary1));
+ INSIST(memcmp(canary0, canary1, sizeof(canary0)) == 0);
isc_mem_put(mctx, hctx, sizeof(isc_hash_t));
isc_mem_detach(&mctx);
}
diff --git a/contrib/bind9/lib/isc/heap.c b/contrib/bind9/lib/isc/heap.c
index 68f8ba8..4dead3f 100644
--- a/contrib/bind9/lib/isc/heap.c
+++ b/contrib/bind9/lib/isc/heap.c
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: heap.c,v 1.37.240.3 2010-02-04 23:47:46 tbox Exp $ */
+/* $Id: heap.c,v 1.39 2010-02-04 23:49:13 tbox Exp $ */
/*! \file
* Heap implementation of priority queues adapted from the following:
diff --git a/contrib/bind9/lib/isc/hmacmd5.c b/contrib/bind9/lib/isc/hmacmd5.c
index b1d5906..10e87c9 100644
--- a/contrib/bind9/lib/isc/hmacmd5.c
+++ b/contrib/bind9/lib/isc/hmacmd5.c
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004-2007 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004-2007, 2009 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 2000, 2001 Internet Software Consortium.
*
* Permission to use, copy, modify, and/or distribute this software for any
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: hmacmd5.c,v 1.14 2007-06-19 23:47:17 tbox Exp $ */
+/* $Id: hmacmd5.c,v 1.16 2009-02-06 23:47:42 tbox Exp $ */
/*! \file
* This code implements the HMAC-MD5 keyed hash algorithm
@@ -27,10 +27,40 @@
#include <isc/assertions.h>
#include <isc/hmacmd5.h>
#include <isc/md5.h>
+#include <isc/platform.h>
#include <isc/string.h>
#include <isc/types.h>
#include <isc/util.h>
+#ifdef ISC_PLATFORM_OPENSSLHASH
+
+void
+isc_hmacmd5_init(isc_hmacmd5_t *ctx, const unsigned char *key,
+ unsigned int len)
+{
+ HMAC_Init(ctx, (const void *) key, (int) len, EVP_md5());
+}
+
+void
+isc_hmacmd5_invalidate(isc_hmacmd5_t *ctx) {
+ HMAC_CTX_cleanup(ctx);
+}
+
+void
+isc_hmacmd5_update(isc_hmacmd5_t *ctx, const unsigned char *buf,
+ unsigned int len)
+{
+ HMAC_Update(ctx, buf, (int) len);
+}
+
+void
+isc_hmacmd5_sign(isc_hmacmd5_t *ctx, unsigned char *digest) {
+ HMAC_Final(ctx, digest, NULL);
+ HMAC_CTX_cleanup(ctx);
+}
+
+#else
+
#define PADLEN 64
#define IPAD 0x36
#define OPAD 0x5C
@@ -98,6 +128,7 @@ isc_hmacmd5_sign(isc_hmacmd5_t *ctx, unsigned char *digest) {
isc_md5_final(&ctx->md5ctx, digest);
isc_hmacmd5_invalidate(ctx);
}
+#endif /* !ISC_PLATFORM_OPENSSLHASH */
/*!
* Verify signature - finalize MD5 operation and reapply MD5, then
diff --git a/contrib/bind9/lib/isc/hmacsha.c b/contrib/bind9/lib/isc/hmacsha.c
index 9f27163..125672d 100644
--- a/contrib/bind9/lib/isc/hmacsha.c
+++ b/contrib/bind9/lib/isc/hmacsha.c
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2005-2007 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2005-2007, 2009 Internet Systems Consortium, Inc. ("ISC")
*
* Permission to use, copy, modify, and/or distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
@@ -14,7 +14,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: hmacsha.c,v 1.8 2007-08-27 03:27:53 marka Exp $ */
+/* $Id: hmacsha.c,v 1.10 2009-02-06 23:47:42 tbox Exp $ */
/*
* This code implements the HMAC-SHA1, HMAC-SHA224, HMAC-SHA256, HMAC-SHA384
@@ -26,12 +26,172 @@
#include <isc/assertions.h>
#include <isc/hmacsha.h>
+#include <isc/platform.h>
#include <isc/sha1.h>
#include <isc/sha2.h>
#include <isc/string.h>
#include <isc/types.h>
#include <isc/util.h>
+#ifdef ISC_PLATFORM_OPENSSLHASH
+
+void
+isc_hmacsha1_init(isc_hmacsha1_t *ctx, const unsigned char *key,
+ unsigned int len)
+{
+ HMAC_Init(ctx, (const void *) key, (int) len, EVP_sha1());
+}
+
+void
+isc_hmacsha1_invalidate(isc_hmacsha1_t *ctx) {
+ HMAC_CTX_cleanup(ctx);
+}
+
+void
+isc_hmacsha1_update(isc_hmacsha1_t *ctx, const unsigned char *buf,
+ unsigned int len)
+{
+ HMAC_Update(ctx, buf, (int) len);
+}
+
+void
+isc_hmacsha1_sign(isc_hmacsha1_t *ctx, unsigned char *digest, size_t len) {
+ unsigned char newdigest[ISC_SHA1_DIGESTLENGTH];
+
+ REQUIRE(len <= ISC_SHA1_DIGESTLENGTH);
+
+ HMAC_Final(ctx, newdigest, NULL);
+ HMAC_CTX_cleanup(ctx);
+ memcpy(digest, newdigest, len);
+ memset(newdigest, 0, sizeof(newdigest));
+}
+
+void
+isc_hmacsha224_init(isc_hmacsha224_t *ctx, const unsigned char *key,
+ unsigned int len)
+{
+ HMAC_Init(ctx, (const void *) key, (int) len, EVP_sha224());
+}
+
+void
+isc_hmacsha224_invalidate(isc_hmacsha224_t *ctx) {
+ HMAC_CTX_cleanup(ctx);
+}
+
+void
+isc_hmacsha224_update(isc_hmacsha224_t *ctx, const unsigned char *buf,
+ unsigned int len)
+{
+ HMAC_Update(ctx, buf, (int) len);
+}
+
+void
+isc_hmacsha224_sign(isc_hmacsha224_t *ctx, unsigned char *digest, size_t len) {
+ unsigned char newdigest[ISC_SHA224_DIGESTLENGTH];
+
+ REQUIRE(len <= ISC_SHA224_DIGESTLENGTH);
+
+ HMAC_Final(ctx, newdigest, NULL);
+ HMAC_CTX_cleanup(ctx);
+ memcpy(digest, newdigest, len);
+ memset(newdigest, 0, sizeof(newdigest));
+}
+
+void
+isc_hmacsha256_init(isc_hmacsha256_t *ctx, const unsigned char *key,
+ unsigned int len)
+{
+ HMAC_Init(ctx, (const void *) key, (int) len, EVP_sha256());
+}
+
+void
+isc_hmacsha256_invalidate(isc_hmacsha256_t *ctx) {
+ HMAC_CTX_cleanup(ctx);
+}
+
+void
+isc_hmacsha256_update(isc_hmacsha256_t *ctx, const unsigned char *buf,
+ unsigned int len)
+{
+ HMAC_Update(ctx, buf, (int) len);
+}
+
+void
+isc_hmacsha256_sign(isc_hmacsha256_t *ctx, unsigned char *digest, size_t len) {
+ unsigned char newdigest[ISC_SHA256_DIGESTLENGTH];
+
+ REQUIRE(len <= ISC_SHA256_DIGESTLENGTH);
+
+ HMAC_Final(ctx, newdigest, NULL);
+ HMAC_CTX_cleanup(ctx);
+ memcpy(digest, newdigest, len);
+ memset(newdigest, 0, sizeof(newdigest));
+}
+
+void
+isc_hmacsha384_init(isc_hmacsha384_t *ctx, const unsigned char *key,
+ unsigned int len)
+{
+ HMAC_Init(ctx, (const void *) key, (int) len, EVP_sha384());
+}
+
+void
+isc_hmacsha384_invalidate(isc_hmacsha384_t *ctx) {
+ HMAC_CTX_cleanup(ctx);
+}
+
+void
+isc_hmacsha384_update(isc_hmacsha384_t *ctx, const unsigned char *buf,
+ unsigned int len)
+{
+ HMAC_Update(ctx, buf, (int) len);
+}
+
+void
+isc_hmacsha384_sign(isc_hmacsha384_t *ctx, unsigned char *digest, size_t len) {
+ unsigned char newdigest[ISC_SHA384_DIGESTLENGTH];
+
+ REQUIRE(len <= ISC_SHA384_DIGESTLENGTH);
+
+ HMAC_Final(ctx, newdigest, NULL);
+ HMAC_CTX_cleanup(ctx);
+ memcpy(digest, newdigest, len);
+ memset(newdigest, 0, sizeof(newdigest));
+}
+
+void
+isc_hmacsha512_init(isc_hmacsha512_t *ctx, const unsigned char *key,
+ unsigned int len)
+{
+ HMAC_Init(ctx, (const void *) key, (int) len, EVP_sha512());
+}
+
+void
+isc_hmacsha512_invalidate(isc_hmacsha512_t *ctx) {
+ HMAC_CTX_cleanup(ctx);
+}
+
+void
+isc_hmacsha512_update(isc_hmacsha512_t *ctx, const unsigned char *buf,
+ unsigned int len)
+{
+ HMAC_Update(ctx, buf, (int) len);
+}
+
+void
+isc_hmacsha512_sign(isc_hmacsha512_t *ctx, unsigned char *digest, size_t len) {
+ unsigned char newdigest[ISC_SHA512_DIGESTLENGTH];
+
+ REQUIRE(len <= ISC_SHA512_DIGESTLENGTH);
+
+ HMAC_Final(ctx, newdigest, NULL);
+ HMAC_CTX_cleanup(ctx);
+ memcpy(digest, newdigest, len);
+ memset(newdigest, 0, sizeof(newdigest));
+}
+
+#else
+
#define IPAD 0x36
#define OPAD 0x5C
@@ -105,19 +265,6 @@ isc_hmacsha1_sign(isc_hmacsha1_t *ctx, unsigned char *digest, size_t len) {
}
/*
- * Verify signature - finalize SHA1 operation and reapply SHA1, then
- * compare to the supplied digest.
- */
-isc_boolean_t
-isc_hmacsha1_verify(isc_hmacsha1_t *ctx, unsigned char *digest, size_t len) {
- unsigned char newdigest[ISC_SHA1_DIGESTLENGTH];
-
- REQUIRE(len <= ISC_SHA1_DIGESTLENGTH);
- isc_hmacsha1_sign(ctx, newdigest, ISC_SHA1_DIGESTLENGTH);
- return (ISC_TF(memcmp(digest, newdigest, len) == 0));
-}
-
-/*
* Start HMAC-SHA224 process. Initialize an sha224 context and digest the key.
*/
void
@@ -185,19 +332,6 @@ isc_hmacsha224_sign(isc_hmacsha224_t *ctx, unsigned char *digest, size_t len) {
}
/*
- * Verify signature - finalize SHA224 operation and reapply SHA224, then
- * compare to the supplied digest.
- */
-isc_boolean_t
-isc_hmacsha224_verify(isc_hmacsha224_t *ctx, unsigned char *digest, size_t len) {
- unsigned char newdigest[ISC_SHA224_DIGESTLENGTH];
-
- REQUIRE(len <= ISC_SHA224_DIGESTLENGTH);
- isc_hmacsha224_sign(ctx, newdigest, ISC_SHA224_DIGESTLENGTH);
- return (ISC_TF(memcmp(digest, newdigest, len) == 0));
-}
-
-/*
* Start HMAC-SHA256 process. Initialize an sha256 context and digest the key.
*/
void
@@ -265,19 +399,6 @@ isc_hmacsha256_sign(isc_hmacsha256_t *ctx, unsigned char *digest, size_t len) {
}
/*
- * Verify signature - finalize SHA256 operation and reapply SHA256, then
- * compare to the supplied digest.
- */
-isc_boolean_t
-isc_hmacsha256_verify(isc_hmacsha256_t *ctx, unsigned char *digest, size_t len) {
- unsigned char newdigest[ISC_SHA256_DIGESTLENGTH];
-
- REQUIRE(len <= ISC_SHA256_DIGESTLENGTH);
- isc_hmacsha256_sign(ctx, newdigest, ISC_SHA256_DIGESTLENGTH);
- return (ISC_TF(memcmp(digest, newdigest, len) == 0));
-}
-
-/*
* Start HMAC-SHA384 process. Initialize an sha384 context and digest the key.
*/
void
@@ -345,19 +466,6 @@ isc_hmacsha384_sign(isc_hmacsha384_t *ctx, unsigned char *digest, size_t len) {
}
/*
- * Verify signature - finalize SHA384 operation and reapply SHA384, then
- * compare to the supplied digest.
- */
-isc_boolean_t
-isc_hmacsha384_verify(isc_hmacsha384_t *ctx, unsigned char *digest, size_t len) {
- unsigned char newdigest[ISC_SHA384_DIGESTLENGTH];
-
- REQUIRE(len <= ISC_SHA384_DIGESTLENGTH);
- isc_hmacsha384_sign(ctx, newdigest, ISC_SHA384_DIGESTLENGTH);
- return (ISC_TF(memcmp(digest, newdigest, len) == 0));
-}
-
-/*
* Start HMAC-SHA512 process. Initialize an sha512 context and digest the key.
*/
void
@@ -423,6 +531,59 @@ isc_hmacsha512_sign(isc_hmacsha512_t *ctx, unsigned char *digest, size_t len) {
memcpy(digest, newdigest, len);
memset(newdigest, 0, sizeof(newdigest));
}
+#endif /* !ISC_PLATFORM_OPENSSLHASH */
+
+/*
+ * Verify signature - finalize SHA1 operation and reapply SHA1, then
+ * compare to the supplied digest.
+ */
+isc_boolean_t
+isc_hmacsha1_verify(isc_hmacsha1_t *ctx, unsigned char *digest, size_t len) {
+ unsigned char newdigest[ISC_SHA1_DIGESTLENGTH];
+
+ REQUIRE(len <= ISC_SHA1_DIGESTLENGTH);
+ isc_hmacsha1_sign(ctx, newdigest, ISC_SHA1_DIGESTLENGTH);
+ return (ISC_TF(memcmp(digest, newdigest, len) == 0));
+}
+
+/*
+ * Verify signature - finalize SHA224 operation and reapply SHA224, then
+ * compare to the supplied digest.
+ */
+isc_boolean_t
+isc_hmacsha224_verify(isc_hmacsha224_t *ctx, unsigned char *digest, size_t len) {
+ unsigned char newdigest[ISC_SHA224_DIGESTLENGTH];
+
+ REQUIRE(len <= ISC_SHA224_DIGESTLENGTH);
+ isc_hmacsha224_sign(ctx, newdigest, ISC_SHA224_DIGESTLENGTH);
+ return (ISC_TF(memcmp(digest, newdigest, len) == 0));
+}
+
+/*
+ * Verify signature - finalize SHA256 operation and reapply SHA256, then
+ * compare to the supplied digest.
+ */
+isc_boolean_t
+isc_hmacsha256_verify(isc_hmacsha256_t *ctx, unsigned char *digest, size_t len) {
+ unsigned char newdigest[ISC_SHA256_DIGESTLENGTH];
+
+ REQUIRE(len <= ISC_SHA256_DIGESTLENGTH);
+ isc_hmacsha256_sign(ctx, newdigest, ISC_SHA256_DIGESTLENGTH);
+ return (ISC_TF(memcmp(digest, newdigest, len) == 0));
+}
+
+/*
+ * Verify signature - finalize SHA384 operation and reapply SHA384, then
+ * compare to the supplied digest.
+ */
+isc_boolean_t
+isc_hmacsha384_verify(isc_hmacsha384_t *ctx, unsigned char *digest, size_t len) {
+ unsigned char newdigest[ISC_SHA384_DIGESTLENGTH];
+
+ REQUIRE(len <= ISC_SHA384_DIGESTLENGTH);
+ isc_hmacsha384_sign(ctx, newdigest, ISC_SHA384_DIGESTLENGTH);
+ return (ISC_TF(memcmp(digest, newdigest, len) == 0));
+}
/*
* Verify signature - finalize SHA512 operation and reapply SHA512, then
diff --git a/contrib/bind9/lib/isc/httpd.c b/contrib/bind9/lib/isc/httpd.c
index b653f79..81f118e 100644
--- a/contrib/bind9/lib/isc/httpd.c
+++ b/contrib/bind9/lib/isc/httpd.c
@@ -14,7 +14,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: httpd.c,v 1.16.64.2 2010-02-04 23:47:46 tbox Exp $ */
+/* $Id: httpd.c,v 1.20 2010-11-16 05:38:31 marka Exp $ */
/*! \file */
diff --git a/contrib/bind9/lib/isc/ia64/include/isc/atomic.h b/contrib/bind9/lib/isc/ia64/include/isc/atomic.h
index b2d355e..fffb0e3 100644
--- a/contrib/bind9/lib/isc/ia64/include/isc/atomic.h
+++ b/contrib/bind9/lib/isc/ia64/include/isc/atomic.h
@@ -14,7 +14,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: atomic.h,v 1.4.326.3 2009-06-24 02:21:28 marka Exp $ */
+/* $Id: atomic.h,v 1.7 2009-06-24 02:22:50 marka Exp $ */
#ifndef ISC_ATOMIC_H
#define ISC_ATOMIC_H 1
diff --git a/contrib/bind9/lib/isc/include/isc/Makefile.in b/contrib/bind9/lib/isc/include/isc/Makefile.in
index c1d71f4..12c09cd 100644
--- a/contrib/bind9/lib/isc/include/isc/Makefile.in
+++ b/contrib/bind9/lib/isc/include/isc/Makefile.in
@@ -13,7 +13,7 @@
# OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
# PERFORMANCE OF THIS SOFTWARE.
-# $Id: Makefile.in,v 1.64.12.2 2009-02-12 23:47:22 tbox Exp $
+# $Id: Makefile.in,v 1.68 2009-12-05 23:31:41 each Exp $
srcdir = @srcdir@
VPATH = @srcdir@
@@ -26,15 +26,15 @@ top_srcdir = @top_srcdir@
# machine generated. The latter are handled specially in the
# install target below.
#
-HEADERS = app.h assertions.h base64.h bitstring.h boolean.h buffer.h \
- bufferlist.h commandline.h entropy.h error.h event.h \
+HEADERS = app.h assertions.h base64.h bind9.h bitstring.h boolean.h \
+ buffer.h bufferlist.h commandline.h entropy.h error.h event.h \
eventclass.h file.h formatcheck.h fsaccess.h \
hash.h heap.h hex.h hmacmd5.h \
httpd.h \
interfaceiter.h @ISC_IPV6_H@ iterated_hash.h lang.h lex.h \
lfsr.h lib.h list.h log.h \
- magic.h md5.h mem.h msgcat.h msgs.h \
- mutexblock.h netaddr.h ondestroy.h os.h parseint.h \
+ magic.h md5.h mem.h msgcat.h msgs.h mutexblock.h \
+ namespace.h netaddr.h ondestroy.h os.h parseint.h \
print.h quota.h radix.h random.h ratelimiter.h \
refcount.h region.h resource.h \
result.h resultclass.h rwlock.h serial.h sha1.h sha2.h \
diff --git a/contrib/bind9/lib/isc/include/isc/app.h b/contrib/bind9/lib/isc/include/isc/app.h
index 0552758..ac8669f 100644
--- a/contrib/bind9/lib/isc/include/isc/app.h
+++ b/contrib/bind9/lib/isc/include/isc/app.h
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004-2007 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004-2007, 2009 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 1999-2001 Internet Software Consortium.
*
* Permission to use, copy, modify, and/or distribute this software for any
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: app.h,v 1.8 2007-06-19 23:47:18 tbox Exp $ */
+/* $Id: app.h,v 1.11 2009-09-02 23:48:03 tbox Exp $ */
#ifndef ISC_APP_H
#define ISC_APP_H 1
@@ -54,12 +54,23 @@
* Use of this module is not required. In particular, isc_app_start() is
* NOT an ISC library initialization routine.
*
+ * This module also supports per-thread 'application contexts'. With this
+ * mode, a thread-based application will have a separate context, in which
+ * it uses other ISC library services such as tasks or timers. Signals are
+ * not caught in this mode, so that the application can handle the signals
+ * in its preferred way.
+ *
* \li MP:
* Clients must ensure that isc_app_start(), isc_app_run(), and
* isc_app_finish() are called at most once. isc_app_shutdown()
* is safe to use by any thread (provided isc_app_start() has been
* called previously).
*
+ * The same note applies to isc_app_ctxXXX() functions, but in this case
+ * it's a per-thread restriction. For example, a thread with an
+ * application context must ensure that isc_app_ctxstart() with the
+ * context is called at most once.
+ *
* \li Reliability:
* No anticipated impact.
*
@@ -75,17 +86,64 @@
#include <isc/eventclass.h>
#include <isc/lang.h>
+#include <isc/magic.h>
#include <isc/result.h>
+/***
+ *** Types
+ ***/
+
typedef isc_event_t isc_appevent_t;
#define ISC_APPEVENT_FIRSTEVENT (ISC_EVENTCLASS_APP + 0)
#define ISC_APPEVENT_SHUTDOWN (ISC_EVENTCLASS_APP + 1)
#define ISC_APPEVENT_LASTEVENT (ISC_EVENTCLASS_APP + 65535)
+/*%
+ * app module methods. Only app driver implementations use this structure.
+ * Other clients should use the top-level interfaces (i.e., isc_app_xxx
+ * functions). magic must be ISCAPI_APPMETHODS_MAGIC.
+ */
+typedef struct isc_appmethods {
+ void (*ctxdestroy)(isc_appctx_t **ctxp);
+ isc_result_t (*ctxstart)(isc_appctx_t *ctx);
+ isc_result_t (*ctxrun)(isc_appctx_t *ctx);
+ isc_result_t (*ctxsuspend)(isc_appctx_t *ctx);
+ isc_result_t (*ctxshutdown)(isc_appctx_t *ctx);
+ void (*ctxfinish)(isc_appctx_t *ctx);
+ void (*settaskmgr)(isc_appctx_t *ctx,
+ isc_taskmgr_t *timermgr);
+ void (*setsocketmgr)(isc_appctx_t *ctx,
+ isc_socketmgr_t *timermgr);
+ void (*settimermgr)(isc_appctx_t *ctx,
+ isc_timermgr_t *timermgr);
+} isc_appmethods_t;
+
+/*%
+ * This structure is actually just the common prefix of an application context
+ * implementation's version of an isc_appctx_t.
+ * \brief
+ * Direct use of this structure by clients is forbidden. app implementations
+ * may change the structure. 'magic' must be ISCAPI_APPCTX_MAGIC for any
+ * of the isc_app_ routines to work. app implementations must maintain
+ * all app context invariants.
+ */
+struct isc_appctx {
+ unsigned int impmagic;
+ unsigned int magic;
+ isc_appmethods_t *methods;
+};
+
+#define ISCAPI_APPCTX_MAGIC ISC_MAGIC('A','a','p','c')
+#define ISCAPI_APPCTX_VALID(c) ((c) != NULL && \
+ (c)->magic == ISCAPI_APPCTX_MAGIC)
+
ISC_LANG_BEGINDECLS
isc_result_t
+isc_app_ctxstart(isc_appctx_t *ctx);
+
+isc_result_t
isc_app_start(void);
/*!<
* \brief Start an ISC library application.
@@ -93,6 +151,9 @@ isc_app_start(void);
* Notes:
* This call should be made before any other ISC library call, and as
* close to the beginning of the application as possible.
+ *
+ * Requires:
+ * 'ctx' is a valid application context (for app_ctxstart()).
*/
isc_result_t
@@ -102,7 +163,7 @@ isc_app_onrun(isc_mem_t *mctx, isc_task_t *task, isc_taskaction_t action,
* \brief Request delivery of an event when the application is run.
*
* Requires:
- * isc_app_start() has been called.
+ *\li isc_app_start() has been called.
*
* Returns:
* ISC_R_SUCCESS
@@ -110,6 +171,9 @@ isc_app_onrun(isc_mem_t *mctx, isc_task_t *task, isc_taskaction_t action,
*/
isc_result_t
+isc_app_ctxrun(isc_appctx_t *ctx);
+
+isc_result_t
isc_app_run(void);
/*!<
* \brief Run an ISC library application.
@@ -120,11 +184,12 @@ isc_app_run(void);
* caller should start shutting down the application.
*
* Requires:
- *\li isc_app_start() has been called.
+ *\li isc_app_[ctx]start() has been called.
*
* Ensures:
*\li Any events requested via isc_app_onrun() will have been posted (in
* FIFO order) before isc_app_run() blocks.
+ *\li 'ctx' is a valid application context (for app_ctxrun()).
*
* Returns:
*\li ISC_R_SUCCESS Shutdown has been requested.
@@ -132,6 +197,9 @@ isc_app_run(void);
*/
isc_result_t
+isc_app_ctxshutdown(isc_appctx_t *ctx);
+
+isc_result_t
isc_app_shutdown(void);
/*!<
* \brief Request application shutdown.
@@ -141,7 +209,8 @@ isc_app_shutdown(void);
* only be triggered once.
*
* Requires:
- *\li isc_app_run() has been called.
+ *\li isc_app_[ctx]run() has been called.
+ *\li 'ctx' is a valid application context (for app_ctxshutdown()).
*
* Returns:
*\li ISC_R_SUCCESS
@@ -149,6 +218,12 @@ isc_app_shutdown(void);
*/
isc_result_t
+isc_app_ctxsuspend(isc_appctx_t *ctx);
+/*!<
+ * \brief This has the same behavior as isc_app_ctxsuspend().
+ */
+
+isc_result_t
isc_app_reload(void);
/*!<
* \brief Request application reload.
@@ -162,6 +237,9 @@ isc_app_reload(void);
*/
void
+isc_app_ctxfinish(isc_appctx_t *ctx);
+
+void
isc_app_finish(void);
/*!<
* \brief Finish an ISC library application.
@@ -171,6 +249,7 @@ isc_app_finish(void);
*
* Requires:
*\li isc_app_start() has been called.
+ *\li 'ctx' is a valid application context (for app_ctxfinish()).
*
* Ensures:
*\li Any resources allocated by isc_app_start() have been released.
@@ -206,6 +285,90 @@ isc_app_unblock(void);
* \li isc_app_block() has been called by the same thread.
*/
+isc_result_t
+isc_appctx_create(isc_mem_t *mctx, isc_appctx_t **ctxp);
+/*!<
+ * \brief Create an application context.
+ *
+ * Requires:
+ *\li 'mctx' is a valid memory context.
+ *\li 'ctxp' != NULL && *ctxp == NULL.
+ */
+
+void
+isc_appctx_destroy(isc_appctx_t **ctxp);
+/*!<
+ * \brief Destroy an application context.
+ *
+ * Requires:
+ *\li '*ctxp' is a valid application context.
+ *
+ * Ensures:
+ *\li *ctxp == NULL.
+ */
+
+void
+isc_appctx_settaskmgr(isc_appctx_t *ctx, isc_taskmgr_t *taskmgr);
+/*!<
+ * \brief Associate a task manager with an application context.
+ *
+ * This must be done before running tasks within the application context.
+ *
+ * Requires:
+ *\li 'ctx' is a valid application context.
+ *\li 'taskmgr' is a valid task manager.
+ */
+
+void
+isc_appctx_setsocketmgr(isc_appctx_t *ctx, isc_socketmgr_t *socketmgr);
+/*!<
+ * \brief Associate a socket manager with an application context.
+ *
+ * This must be done before handling socket events within the application
+ * context.
+ *
+ * Requires:
+ *\li 'ctx' is a valid application context.
+ *\li 'socketmgr' is a valid socket manager.
+ */
+
+void
+isc_appctx_settimermgr(isc_appctx_t *ctx, isc_timermgr_t *timermgr);
+/*!<
+ * \brief Associate a socket timer with an application context.
+ *
+ * This must be done before handling timer events within the application
+ * context.
+ *
+ * Requires:
+ *\li 'ctx' is a valid application context.
+ *\li 'timermgr' is a valid timer manager.
+ */
+
+#ifdef USE_APPIMPREGISTER
+/*%<
+ * See isc_appctx_create() above.
+ */
+typedef isc_result_t
+(*isc_appctxcreatefunc_t)(isc_mem_t *mctx, isc_appctx_t **ctxp);
+
+isc_result_t
+isc_app_register(isc_appctxcreatefunc_t createfunc);
+/*%<
+ * Register a new application implementation and add it to the list of
+ * supported implementations. This function must be called when a different
+ * event library is used than the one contained in the ISC library.
+ */
+
+isc_result_t
+isc__app_register(void);
+/*%<
+ * A short cut function that specifies the application module in the ISC
+ * library for isc_app_register(). An application that uses the ISC library
+ * usually do not have to care about this function: it would call
+ * isc_lib_register(), which internally calls this function.
+ */
+#endif /* USE_APPIMPREGISTER */
ISC_LANG_ENDDECLS
diff --git a/contrib/bind9/lib/isc/include/isc/assertions.h b/contrib/bind9/lib/isc/include/isc/assertions.h
index 8a2ba7e..91217b8 100644
--- a/contrib/bind9/lib/isc/include/isc/assertions.h
+++ b/contrib/bind9/lib/isc/include/isc/assertions.h
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004-2008 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004-2009 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 1997-2001 Internet Software Consortium.
*
* Permission to use, copy, modify, and/or distribute this software for any
@@ -16,7 +16,7 @@
*/
/*
- * $Id: assertions.h,v 1.26 2008-10-15 23:47:31 tbox Exp $
+ * $Id: assertions.h,v 1.28 2009-09-29 23:48:04 tbox Exp $
*/
/*! \file isc/assertions.h
*/
@@ -41,7 +41,9 @@ typedef void (*isc_assertioncallback_t)(const char *, int, isc_assertiontype_t,
const char *);
/* coverity[+kill] */
-LIBISC_EXTERNAL_DATA extern isc_assertioncallback_t isc_assertion_failed;
+ISC_PLATFORM_NORETURN_PRE
+void isc_assertion_failed(const char *, int, isc_assertiontype_t,
+ const char *) ISC_PLATFORM_NORETURN_POST;
void
isc_assertion_setcallback(isc_assertioncallback_t);
diff --git a/contrib/bind9/lib/isc/include/isc/backtrace.h b/contrib/bind9/lib/isc/include/isc/backtrace.h
new file mode 100644
index 0000000..94fee61
--- /dev/null
+++ b/contrib/bind9/lib/isc/include/isc/backtrace.h
@@ -0,0 +1,131 @@
+/*
+ * Copyright (C) 2009 Internet Systems Consortium, Inc. ("ISC")
+ *
+ * Permission to use, copy, modify, and/or 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 ISC DISCLAIMS ALL WARRANTIES WITH
+ * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+ * AND FITNESS. IN NO EVENT SHALL ISC 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.
+ */
+
+/* $Id: backtrace.h,v 1.2 2009-09-01 18:40:25 jinmei Exp $ */
+
+/*! \file isc/backtrace.h
+ * \brief provide a back trace of the running process to help debug problems.
+ *
+ * This module tries to get a back trace of the process using some platform
+ * dependent way when available. It also manages an internal symbol table
+ * that maps function addresses used in the process to their textual symbols.
+ * This module is expected to be used to help debug when some fatal error
+ * happens.
+ *
+ * IMPORTANT NOTE: since the (major) intended use case of this module is
+ * dumping a back trace on a fatal error, normally followed by self termination,
+ * functions defined in this module generally doesn't employ assertion checks
+ * (if it did, a program bug could cause infinite recursive calls to a
+ * backtrace function). These functions still perform minimal checks and return
+ * ISC_R_FAILURE if they detect an error, but the caller should therefore be
+ * very careful about the use of these functions, and generally discouraged to
+ * use them except in an exit path. The exception is
+ * isc_backtrace_getsymbolfromindex(), which is expected to be used in a
+ * non-error-handling context and validates arguments with assertion checks.
+ */
+
+#ifndef ISC_BACKTRACE_H
+#define ISC_BACKTRACE_H 1
+
+/***
+ *** Imports
+ ***/
+
+#include <isc/types.h>
+
+/***
+ *** Types
+ ***/
+struct isc_backtrace_symmap {
+ void *addr;
+ const char *symbol;
+};
+
+extern const int isc__backtrace_nsymbols;
+extern const isc_backtrace_symmap_t isc__backtrace_symtable[];
+
+/***
+ *** Functions
+ ***/
+
+ISC_LANG_BEGINDECLS
+isc_result_t
+isc_backtrace_gettrace(void **addrs, int maxaddrs, int *nframes);
+/*%<
+ * Get a back trace of the running process above this function itself. On
+ * success, addrs[i] will store the address of the call point of the i-th
+ * stack frame (addrs[0] is the caller of this function). *nframes will store
+ * the total number of frames.
+ *
+ * Requires (note that these are not ensured by assertion checks, see above):
+ *
+ *\li 'addrs' is a valid array containing at least 'maxaddrs' void * entries.
+ *
+ *\li 'nframes' must be non NULL.
+ *
+ * Returns:
+ *
+ *\li #ISC_R_SUCCESS
+ *\li #ISC_R_FAILURE
+ *\li #ISC_R_NOTFOUND
+ *\li #ISC_R_NOTIMPLEMENTED
+ */
+
+isc_result_t
+isc_backtrace_getsymbolfromindex(int index, const void **addrp,
+ const char **symbolp);
+/*%<
+ * Returns the content of the internal symbol table of the given index.
+ * On success, *addrsp and *symbolp point to the address and the symbol of
+ * the 'index'th entry of the table, respectively. If 'index' is not in the
+ * range of the symbol table, ISC_R_RANGE will be returned.
+ *
+ * Requires
+ *
+ *\li 'addrp' must be non NULL && '*addrp' == NULL.
+ *
+ *\li 'symbolp' must be non NULL && '*symbolp' == NULL.
+ *
+ * Returns:
+ *
+ *\li #ISC_R_SUCCESS
+ *\li #ISC_R_RANGE
+ */
+
+isc_result_t
+isc_backtrace_getsymbol(const void *addr, const char **symbolp,
+ unsigned long *offsetp);
+/*%<
+ * Searches the internal symbol table for the symbol that most matches the
+ * given 'addr'. On success, '*symbolp' will point to the name of function
+ * to which the address 'addr' belong, and '*offsetp' will store the offset
+ * from the function's entry address to 'addr'.
+ *
+ * Requires (note that these are not ensured by assertion checks, see above):
+ *
+ *\li 'symbolp' must be non NULL && '*symbolp' == NULL.
+ *
+ *\li 'offsetp' must be non NULL.
+ *
+ * Returns:
+ *
+ *\li #ISC_R_SUCCESS
+ *\li #ISC_R_FAILURE
+ *\li #ISC_R_NOTFOUND
+ */
+ISC_LANG_ENDDECLS
+
+#endif /* ISC_BACKTRACE_H */
diff --git a/contrib/bind9/lib/isc/include/isc/bind9.h b/contrib/bind9/lib/isc/include/isc/bind9.h
new file mode 100644
index 0000000..dd75e91
--- /dev/null
+++ b/contrib/bind9/lib/isc/include/isc/bind9.h
@@ -0,0 +1,30 @@
+/*
+ * Copyright (C) 2009 Internet Systems Consortium, Inc. ("ISC")
+ *
+ * Permission to use, copy, modify, and/or 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 ISC DISCLAIMS ALL WARRANTIES WITH
+ * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+ * AND FITNESS. IN NO EVENT SHALL ISC 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.
+ */
+
+/* $Id: bind9.h,v 1.2 2009-12-05 23:31:41 each Exp $ */
+
+#ifndef ISC_BIND9_H
+#define ISC_BIND9_H 1
+
+/*
+ * This determines whether we are building BIND9 or using the exported
+ * libisc/libdns libraries. The version of this file included in the
+ * standard BIND9 build defines BIND9; the version included with the
+ * exportable libraries does not.
+ */
+#define BIND9 1
+
+#endif /* ISC_BIND9_H */
diff --git a/contrib/bind9/lib/isc/include/isc/buffer.h b/contrib/bind9/lib/isc/include/isc/buffer.h
index e55c5b0..30a6e39 100644
--- a/contrib/bind9/lib/isc/include/isc/buffer.h
+++ b/contrib/bind9/lib/isc/include/isc/buffer.h
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004-2008 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004-2008, 2010 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 1998-2002 Internet Software Consortium.
*
* Permission to use, copy, modify, and/or distribute this software for any
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: buffer.h,v 1.53 2008-09-25 04:02:39 tbox Exp $ */
+/* $Id: buffer.h,v 1.55 2010-12-20 23:47:21 tbox Exp $ */
#ifndef ISC_BUFFER_H
#define ISC_BUFFER_H 1
diff --git a/contrib/bind9/lib/isc/include/isc/entropy.h b/contrib/bind9/lib/isc/include/isc/entropy.h
index 1eb8fd1..e115906 100644
--- a/contrib/bind9/lib/isc/include/isc/entropy.h
+++ b/contrib/bind9/lib/isc/include/isc/entropy.h
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: entropy.h,v 1.32.332.3 2009-10-19 02:46:07 marka Exp $ */
+/* $Id: entropy.h,v 1.35 2009-10-19 02:37:08 marka Exp $ */
#ifndef ISC_ENTROPY_H
#define ISC_ENTROPY_H 1
diff --git a/contrib/bind9/lib/isc/include/isc/error.h b/contrib/bind9/lib/isc/include/isc/error.h
index a0025e0..d3dcc8b 100644
--- a/contrib/bind9/lib/isc/include/isc/error.h
+++ b/contrib/bind9/lib/isc/include/isc/error.h
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004-2007 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004-2007, 2009 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 1998-2001 Internet Software Consortium.
*
* Permission to use, copy, modify, and/or distribute this software for any
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: error.h,v 1.20 2007-06-19 23:47:18 tbox Exp $ */
+/* $Id: error.h,v 1.22 2009-09-29 23:48:04 tbox Exp $ */
#ifndef ISC_ERROR_H
#define ISC_ERROR_H 1
@@ -26,6 +26,7 @@
#include <isc/formatcheck.h>
#include <isc/lang.h>
+#include <isc/platform.h>
ISC_LANG_BEGINDECLS
@@ -45,9 +46,9 @@ isc_error_unexpected(const char *, int, const char *, ...)
ISC_FORMAT_PRINTF(3, 4);
/*% fatal error */
-void
+ISC_PLATFORM_NORETURN_PRE void
isc_error_fatal(const char *, int, const char *, ...)
- ISC_FORMAT_PRINTF(3, 4);
+ISC_FORMAT_PRINTF(3, 4) ISC_PLATFORM_NORETURN_POST;
/*% runtimecheck error */
void
diff --git a/contrib/bind9/lib/isc/include/isc/file.h b/contrib/bind9/lib/isc/include/isc/file.h
index 6629a3e..be40825 100644
--- a/contrib/bind9/lib/isc/include/isc/file.h
+++ b/contrib/bind9/lib/isc/include/isc/file.h
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004-2007, 2009 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004-2007, 2009, 2011 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 2000, 2001 Internet Software Consortium.
*
* Permission to use, copy, modify, and/or distribute this software for any
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: file.h,v 1.33.332.2 2009-01-18 23:47:41 tbox Exp $ */
+/* $Id: file.h,v 1.39 2011-01-11 23:47:14 tbox Exp $ */
#ifndef ISC_FILE_H
#define ISC_FILE_H 1
@@ -100,6 +100,10 @@ isc_file_mktemplate(const char *path, char *buf, size_t buflen);
isc_result_t
isc_file_openunique(char *templet, FILE **fp);
+isc_result_t
+isc_file_openuniqueprivate(char *templet, FILE **fp);
+isc_result_t
+isc_file_openuniquemode(char *templet, int mode, FILE **fp);
/*!<
* \brief Create and open a file with a unique name based on 'templet'.
*
@@ -251,6 +255,29 @@ isc_file_truncate(const char *filename, isc_offset_t size);
* Truncate/extend the file specified to 'size' bytes.
*/
+isc_result_t
+isc_file_safecreate(const char *filename, FILE **fp);
+/*%<
+ * Open 'filename' for writing, truncating if necessary. Ensure that
+ * if it existed it was a normal file. If creating the file, ensure
+ * that only the owner can read/write it.
+ */
+
+isc_result_t
+isc_file_splitpath(isc_mem_t *mctx, char *path,
+ char **dirname, char **basename);
+/*%<
+ * Split a path into dirname and basename. If 'path' contains no slash
+ * (or, on windows, backslash), then '*dirname' is set to ".".
+ *
+ * Allocates memory for '*dirname', which can be freed with isc_mem_free().
+ *
+ * Returns:
+ * - ISC_R_SUCCESS on success
+ * - ISC_R_INVALIDFILE if 'path' is empty or ends with '/'
+ * - ISC_R_NOMEMORY if unable to allocate memory
+ */
+
ISC_LANG_ENDDECLS
#endif /* ISC_FILE_H */
diff --git a/contrib/bind9/lib/isc/include/isc/fsaccess.h b/contrib/bind9/lib/isc/include/isc/fsaccess.h
index 88469dd..9758242 100644
--- a/contrib/bind9/lib/isc/include/isc/fsaccess.h
+++ b/contrib/bind9/lib/isc/include/isc/fsaccess.h
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: fsaccess.h,v 1.14.332.2 2009-01-18 23:47:41 tbox Exp $ */
+/* $Id: fsaccess.h,v 1.16 2009-01-17 23:47:43 tbox Exp $ */
#ifndef ISC_FSACCESS_H
#define ISC_FSACCESS_H 1
diff --git a/contrib/bind9/lib/isc/include/isc/hash.h b/contrib/bind9/lib/isc/include/isc/hash.h
index 9bfb709..543e5fd 100644
--- a/contrib/bind9/lib/isc/include/isc/hash.h
+++ b/contrib/bind9/lib/isc/include/isc/hash.h
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: hash.h,v 1.10.332.2 2009-01-18 23:47:41 tbox Exp $ */
+/* $Id: hash.h,v 1.12 2009-01-17 23:47:43 tbox Exp $ */
#ifndef ISC_HASH_H
#define ISC_HASH_H 1
diff --git a/contrib/bind9/lib/isc/include/isc/heap.h b/contrib/bind9/lib/isc/include/isc/heap.h
index ae346c1..943ace3 100644
--- a/contrib/bind9/lib/isc/include/isc/heap.h
+++ b/contrib/bind9/lib/isc/include/isc/heap.h
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: heap.h,v 1.24.332.2 2009-01-18 23:47:41 tbox Exp $ */
+/* $Id: heap.h,v 1.26 2009-01-17 23:47:43 tbox Exp $ */
#ifndef ISC_HEAP_H
#define ISC_HEAP_H 1
diff --git a/contrib/bind9/lib/isc/include/isc/hmacmd5.h b/contrib/bind9/lib/isc/include/isc/hmacmd5.h
index 68074ae..c7d7fff 100644
--- a/contrib/bind9/lib/isc/include/isc/hmacmd5.h
+++ b/contrib/bind9/lib/isc/include/isc/hmacmd5.h
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004-2007 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004-2007, 2009 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 2000, 2001 Internet Software Consortium.
*
* Permission to use, copy, modify, and/or distribute this software for any
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: hmacmd5.h,v 1.12 2007-06-19 23:47:18 tbox Exp $ */
+/* $Id: hmacmd5.h,v 1.14 2009-02-06 23:47:42 tbox Exp $ */
/*! \file isc/hmacmd5.h
* \brief This is the header file for the HMAC-MD5 keyed hash algorithm
@@ -27,14 +27,23 @@
#include <isc/lang.h>
#include <isc/md5.h>
+#include <isc/platform.h>
#include <isc/types.h>
#define ISC_HMACMD5_KEYLENGTH 64
+#ifdef ISC_PLATFORM_OPENSSLHASH
+#include <openssl/hmac.h>
+
+typedef HMAC_CTX isc_hmacmd5_t;
+
+#else
+
typedef struct {
isc_md5_t md5ctx;
unsigned char key[ISC_HMACMD5_KEYLENGTH];
} isc_hmacmd5_t;
+#endif
ISC_LANG_BEGINDECLS
diff --git a/contrib/bind9/lib/isc/include/isc/hmacsha.h b/contrib/bind9/lib/isc/include/isc/hmacsha.h
index c439883..286cafc 100644
--- a/contrib/bind9/lib/isc/include/isc/hmacsha.h
+++ b/contrib/bind9/lib/isc/include/isc/hmacsha.h
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2005-2007 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2005-2007, 2009 Internet Systems Consortium, Inc. ("ISC")
*
* Permission to use, copy, modify, and/or distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
@@ -14,7 +14,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: hmacsha.h,v 1.7 2007-06-19 23:47:18 tbox Exp $ */
+/* $Id: hmacsha.h,v 1.9 2009-02-06 23:47:42 tbox Exp $ */
/*! \file isc/hmacsha.h
* This is the header file for the HMAC-SHA1, HMAC-SHA224, HMAC-SHA256,
@@ -25,6 +25,7 @@
#define ISC_HMACSHA_H 1
#include <isc/lang.h>
+#include <isc/platform.h>
#include <isc/sha1.h>
#include <isc/sha2.h>
#include <isc/types.h>
@@ -35,6 +36,17 @@
#define ISC_HMACSHA384_KEYLENGTH ISC_SHA384_BLOCK_LENGTH
#define ISC_HMACSHA512_KEYLENGTH ISC_SHA512_BLOCK_LENGTH
+#ifdef ISC_PLATFORM_OPENSSLHASH
+#include <openssl/hmac.h>
+
+typedef HMAC_CTX isc_hmacsha1_t;
+typedef HMAC_CTX isc_hmacsha224_t;
+typedef HMAC_CTX isc_hmacsha256_t;
+typedef HMAC_CTX isc_hmacsha384_t;
+typedef HMAC_CTX isc_hmacsha512_t;
+
+#else
+
typedef struct {
isc_sha1_t sha1ctx;
unsigned char key[ISC_HMACSHA1_KEYLENGTH];
@@ -59,6 +71,7 @@ typedef struct {
isc_sha512_t sha512ctx;
unsigned char key[ISC_HMACSHA512_KEYLENGTH];
} isc_hmacsha512_t;
+#endif
ISC_LANG_BEGINDECLS
diff --git a/contrib/bind9/lib/isc/include/isc/lib.h b/contrib/bind9/lib/isc/include/isc/lib.h
index 3804a07..c8bdbc6 100644
--- a/contrib/bind9/lib/isc/include/isc/lib.h
+++ b/contrib/bind9/lib/isc/include/isc/lib.h
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004-2007 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004-2007, 2009 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 1999-2001 Internet Software Consortium.
*
* Permission to use, copy, modify, and/or distribute this software for any
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: lib.h,v 1.14 2007-06-19 23:47:18 tbox Exp $ */
+/* $Id: lib.h,v 1.16 2009-09-02 23:48:03 tbox Exp $ */
#ifndef ISC_LIB_H
#define ISC_LIB_H 1
@@ -36,6 +36,15 @@ isc_lib_initmsgcat(void);
* has not already been initialized.
*/
+void
+isc_lib_register(void);
+/*!<
+ * \brief Register the ISC library implementations for some base services
+ * such as memory or event management and handling socket or timer events.
+ * An external application that wants to use the ISC library must call this
+ * function very early in main().
+ */
+
ISC_LANG_ENDDECLS
#endif /* ISC_LIB_H */
diff --git a/contrib/bind9/lib/isc/include/isc/log.h b/contrib/bind9/lib/isc/include/isc/log.h
index fec3d9d..eac5755 100644
--- a/contrib/bind9/lib/isc/include/isc/log.h
+++ b/contrib/bind9/lib/isc/include/isc/log.h
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: log.h,v 1.54.332.5 2009-02-16 02:04:05 marka Exp $ */
+/* $Id: log.h,v 1.59 2009-02-16 02:01:16 marka Exp $ */
#ifndef ISC_LOG_H
#define ISC_LOG_H 1
diff --git a/contrib/bind9/lib/isc/include/isc/md5.h b/contrib/bind9/lib/isc/include/isc/md5.h
index 9d5b1ec..9017115 100644
--- a/contrib/bind9/lib/isc/include/isc/md5.h
+++ b/contrib/bind9/lib/isc/include/isc/md5.h
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004-2007 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004-2007, 2009, 2010 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 2000, 2001 Internet Software Consortium.
*
* Permission to use, copy, modify, and/or distribute this software for any
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: md5.h,v 1.16 2007-06-19 23:47:18 tbox Exp $ */
+/* $Id: md5.h,v 1.20 2010-01-07 23:48:54 tbox Exp $ */
/*! \file isc/md5.h
* \brief This is the header file for the MD5 message-digest algorithm.
@@ -44,15 +44,25 @@
#define ISC_MD5_H 1
#include <isc/lang.h>
+#include <isc/platform.h>
#include <isc/types.h>
#define ISC_MD5_DIGESTLENGTH 16U
+#define ISC_MD5_BLOCK_LENGTH 64U
+
+#ifdef ISC_PLATFORM_OPENSSLHASH
+#include <openssl/evp.h>
+
+typedef EVP_MD_CTX isc_md5_t;
+
+#else
typedef struct {
isc_uint32_t buf[4];
isc_uint32_t bytes[2];
isc_uint32_t in[16];
} isc_md5_t;
+#endif
ISC_LANG_BEGINDECLS
diff --git a/contrib/bind9/lib/isc/include/isc/mem.h b/contrib/bind9/lib/isc/include/isc/mem.h
index d13d912..e0a7fe5 100644
--- a/contrib/bind9/lib/isc/include/isc/mem.h
+++ b/contrib/bind9/lib/isc/include/isc/mem.h
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: mem.h,v 1.78.120.6 2010-08-11 23:04:21 jinmei Exp $ */
+/* $Id: mem.h,v 1.89 2010-08-11 22:54:58 jinmei Exp $ */
#ifndef ISC_MEM_H
#define ISC_MEM_H 1
@@ -152,11 +152,29 @@ LIBISC_EXTERNAL_DATA extern unsigned int isc_mem_debugging;
#endif
-#define isc_mem_get(c, s) isc__mem_get((c), (s) _ISC_MEM_FILELINE)
-#define isc_mem_allocate(c, s) isc__mem_allocate((c), (s) _ISC_MEM_FILELINE)
-#define isc_mem_reallocate(c, p, s) isc__mem_reallocate((c), (p), (s) _ISC_MEM_FILELINE)
-#define isc_mem_strdup(c, p) isc__mem_strdup((c), (p) _ISC_MEM_FILELINE)
-#define isc_mempool_get(c) isc__mempool_get((c) _ISC_MEM_FILELINE)
+/*%<
+ * We use either isc___mem (three underscores) or isc__mem (two) depending on
+ * whether it's for BIND9's internal purpose (with -DBIND9) or generic export
+ * library. This condition is generally handled in isc/namespace.h, but for
+ * Windows it doesn't work if it involves multiple times of macro expansion
+ * (such as isc_mem to isc__mem then to isc___mem). The following definitions
+ * are used to work around this portability issue. Right now, we don't support
+ * the export library for Windows, so we always use the three-underscore
+ * version.
+ */
+#ifdef WIN32
+#define ISCMEMFUNC(sfx) isc___mem_ ## sfx
+#define ISCMEMPOOLFUNC(sfx) isc___mempool_ ## sfx
+#else
+#define ISCMEMFUNC(sfx) isc__mem_ ## sfx
+#define ISCMEMPOOLFUNC(sfx) isc__mempool_ ## sfx
+#endif
+
+#define isc_mem_get(c, s) ISCMEMFUNC(get)((c), (s) _ISC_MEM_FILELINE)
+#define isc_mem_allocate(c, s) ISCMEMFUNC(allocate)((c), (s) _ISC_MEM_FILELINE)
+#define isc_mem_reallocate(c, p, s) ISCMEMFUNC(reallocate)((c), (p), (s) _ISC_MEM_FILELINE)
+#define isc_mem_strdup(c, p) ISCMEMFUNC(strdup)((c), (p) _ISC_MEM_FILELINE)
+#define isc_mempool_get(c) ISCMEMPOOLFUNC(get)((c) _ISC_MEM_FILELINE)
/*%
* isc_mem_putanddetach() is a convenience function for use where you
@@ -187,33 +205,102 @@ LIBISC_EXTERNAL_DATA extern unsigned int isc_mem_debugging;
* \endcode
*/
+/*% memory and memory pool methods */
+typedef struct isc_memmethods {
+ void (*attach)(isc_mem_t *source, isc_mem_t **targetp);
+ void (*detach)(isc_mem_t **mctxp);
+ void (*destroy)(isc_mem_t **mctxp);
+ void *(*memget)(isc_mem_t *mctx, size_t size _ISC_MEM_FLARG);
+ void (*memput)(isc_mem_t *mctx, void *ptr, size_t size _ISC_MEM_FLARG);
+ void (*memputanddetach)(isc_mem_t **mctxp, void *ptr,
+ size_t size _ISC_MEM_FLARG);
+ void *(*memallocate)(isc_mem_t *mctx, size_t size _ISC_MEM_FLARG);
+ void *(*memreallocate)(isc_mem_t *mctx, void *ptr,
+ size_t size _ISC_MEM_FLARG);
+ char *(*memstrdup)(isc_mem_t *mctx, const char *s _ISC_MEM_FLARG);
+ void (*memfree)(isc_mem_t *mctx, void *ptr _ISC_MEM_FLARG);
+ void (*setdestroycheck)(isc_mem_t *mctx, isc_boolean_t flag);
+ void (*setwater)(isc_mem_t *ctx, isc_mem_water_t water,
+ void *water_arg, size_t hiwater, size_t lowater);
+ void (*waterack)(isc_mem_t *ctx, int flag);
+ size_t (*inuse)(isc_mem_t *mctx);
+ isc_boolean_t (*isovermem)(isc_mem_t *mctx);
+ isc_result_t (*mpcreate)(isc_mem_t *mctx, size_t size,
+ isc_mempool_t **mpctxp);
+} isc_memmethods_t;
+
+typedef struct isc_mempoolmethods {
+ void (*destroy)(isc_mempool_t **mpctxp);
+ void *(*get)(isc_mempool_t *mpctx _ISC_MEM_FLARG);
+ void (*put)(isc_mempool_t *mpctx, void *mem _ISC_MEM_FLARG);
+ unsigned int (*getallocated)(isc_mempool_t *mpctx);
+ void (*setmaxalloc)(isc_mempool_t *mpctx, unsigned int limit);
+ void (*setfreemax)(isc_mempool_t *mpctx, unsigned int limit);
+ void (*setname)(isc_mempool_t *mpctx, const char *name);
+ void (*associatelock)(isc_mempool_t *mpctx, isc_mutex_t *lock);
+ void (*setfillcount)(isc_mempool_t *mpctx, unsigned int limit);
+} isc_mempoolmethods_t;
+
+/*%
+ * This structure is actually just the common prefix of a memory context
+ * implementation's version of an isc_mem_t.
+ * \brief
+ * Direct use of this structure by clients is forbidden. mctx implementations
+ * may change the structure. 'magic' must be ISCAPI_MCTX_MAGIC for any of the
+ * isc_mem_ routines to work. mctx implementations must maintain all mctx
+ * invariants.
+ */
+struct isc_mem {
+ unsigned int impmagic;
+ unsigned int magic;
+ isc_memmethods_t *methods;
+};
+
+#define ISCAPI_MCTX_MAGIC ISC_MAGIC('A','m','c','x')
+#define ISCAPI_MCTX_VALID(m) ((m) != NULL && \
+ (m)->magic == ISCAPI_MCTX_MAGIC)
+
+/*%
+ * This is the common prefix of a memory pool context. The same note as
+ * that for the mem structure applies.
+ */
+struct isc_mempool {
+ unsigned int impmagic;
+ unsigned int magic;
+ isc_mempoolmethods_t *methods;
+};
+
+#define ISCAPI_MPOOL_MAGIC ISC_MAGIC('A','m','p','l')
+#define ISCAPI_MPOOL_VALID(mp) ((mp) != NULL && \
+ (mp)->magic == ISCAPI_MPOOL_MAGIC)
+
#if ISC_MEM_DEBUG
#define isc_mem_put(c, p, s) \
do { \
- isc__mem_put((c), (p), (s) _ISC_MEM_FILELINE); \
+ ISCMEMFUNC(put)((c), (p), (s) _ISC_MEM_FILELINE); \
(p) = NULL; \
} while (0)
#define isc_mem_putanddetach(c, p, s) \
do { \
- isc__mem_putanddetach((c), (p), (s) _ISC_MEM_FILELINE); \
+ ISCMEMFUNC(putanddetach)((c), (p), (s) _ISC_MEM_FILELINE); \
(p) = NULL; \
} while (0)
#define isc_mem_free(c, p) \
do { \
- isc__mem_free((c), (p) _ISC_MEM_FILELINE); \
+ ISCMEMFUNC(free)((c), (p) _ISC_MEM_FILELINE); \
(p) = NULL; \
} while (0)
#define isc_mempool_put(c, p) \
do { \
- isc__mempool_put((c), (p) _ISC_MEM_FILELINE); \
+ ISCMEMPOOLFUNC(put)((c), (p) _ISC_MEM_FILELINE); \
(p) = NULL; \
} while (0)
#else
-#define isc_mem_put(c, p, s) isc__mem_put((c), (p), (s) _ISC_MEM_FILELINE)
+#define isc_mem_put(c, p, s) ISCMEMFUNC(put)((c), (p), (s) _ISC_MEM_FILELINE)
#define isc_mem_putanddetach(c, p, s) \
- isc__mem_putanddetach((c), (p), (s) _ISC_MEM_FILELINE)
-#define isc_mem_free(c, p) isc__mem_free((c), (p) _ISC_MEM_FILELINE)
-#define isc_mempool_put(c, p) isc__mempool_put((c), (p) _ISC_MEM_FILELINE)
+ ISCMEMFUNC(putanddetach)((c), (p), (s) _ISC_MEM_FILELINE)
+#define isc_mem_free(c, p) ISCMEMFUNC(free)((c), (p) _ISC_MEM_FILELINE)
+#define isc_mempool_put(c, p) ISCMEMPOOLFUNC(put)((c), (p) _ISC_MEM_FILELINE)
#endif
/*@{*/
@@ -613,24 +700,50 @@ isc_mempool_setfillcount(isc_mempool_t *mpctx, unsigned int limit);
* Pseudo-private functions for use via macros. Do not call directly.
*/
void *
-isc__mem_get(isc_mem_t *, size_t _ISC_MEM_FLARG);
+ISCMEMFUNC(get)(isc_mem_t *, size_t _ISC_MEM_FLARG);
void
-isc__mem_putanddetach(isc_mem_t **, void *,
- size_t _ISC_MEM_FLARG);
+ISCMEMFUNC(putanddetach)(isc_mem_t **, void *, size_t _ISC_MEM_FLARG);
void
-isc__mem_put(isc_mem_t *, void *, size_t _ISC_MEM_FLARG);
+ISCMEMFUNC(put)(isc_mem_t *, void *, size_t _ISC_MEM_FLARG);
void *
-isc__mem_allocate(isc_mem_t *, size_t _ISC_MEM_FLARG);
+ISCMEMFUNC(allocate)(isc_mem_t *, size_t _ISC_MEM_FLARG);
void *
-isc__mem_reallocate(isc_mem_t *, void *, size_t _ISC_MEM_FLARG);
+ISCMEMFUNC(reallocate)(isc_mem_t *, void *, size_t _ISC_MEM_FLARG);
void
-isc__mem_free(isc_mem_t *, void * _ISC_MEM_FLARG);
+ISCMEMFUNC(free)(isc_mem_t *, void * _ISC_MEM_FLARG);
char *
-isc__mem_strdup(isc_mem_t *, const char *_ISC_MEM_FLARG);
+ISCMEMFUNC(strdup)(isc_mem_t *, const char *_ISC_MEM_FLARG);
void *
-isc__mempool_get(isc_mempool_t * _ISC_MEM_FLARG);
+ISCMEMPOOLFUNC(get)(isc_mempool_t * _ISC_MEM_FLARG);
void
-isc__mempool_put(isc_mempool_t *, void * _ISC_MEM_FLARG);
+ISCMEMPOOLFUNC(put)(isc_mempool_t *, void * _ISC_MEM_FLARG);
+
+#ifdef USE_MEMIMPREGISTER
+
+/*%<
+ * See isc_mem_create2() above.
+ */
+typedef isc_result_t
+(*isc_memcreatefunc_t)(size_t init_max_size, size_t target_size,
+ isc_mem_t **ctxp, unsigned int flags);
+
+isc_result_t
+isc_mem_register(isc_memcreatefunc_t createfunc);
+/*%<
+ * Register a new memory management implementation and add it to the list of
+ * supported implementations. This function must be called when a different
+ * memory management library is used than the one contained in the ISC library.
+ */
+
+isc_result_t
+isc__mem_register(void);
+/*%<
+ * A short cut function that specifies the memory management module in the ISC
+ * library for isc_mem_register(). An application that uses the ISC library
+ * usually do not have to care about this function: it would call
+ * isc_lib_register(), which internally calls this function.
+ */
+#endif /* USE_MEMIMPREGISTER */
ISC_LANG_ENDDECLS
diff --git a/contrib/bind9/lib/isc/include/isc/msgs.h b/contrib/bind9/lib/isc/include/isc/msgs.h
index 674371f5..22dfde2 100644
--- a/contrib/bind9/lib/isc/include/isc/msgs.h
+++ b/contrib/bind9/lib/isc/include/isc/msgs.h
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004-2008 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004-2009 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 2000-2003 Internet Software Consortium.
*
* Permission to use, copy, modify, and/or distribute this software for any
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: msgs.h,v 1.17 2008-08-08 06:28:59 tbox Exp $ */
+/* $Id: msgs.h,v 1.19 2009-10-01 23:48:08 tbox Exp $ */
#ifndef ISC_MSGS_H
#define ISC_MSGS_H 1
@@ -156,7 +156,7 @@
#define ISC_MSG_FILTER 1421 /*%< setsockopt(SO_ACCEPTFILTER): %s */
#define ISC_MSG_TOOMANYHANDLES 1422 /*%< %s: too many open WSA event handles: %s */
-
+#define ISC_MSG_POKED 1423 /*%< "poked flags: %d" */
#define ISC_MSG_AWAKE 1502 /*%< "awake" */
#define ISC_MSG_WORKING 1503 /*%< "working" */
diff --git a/contrib/bind9/lib/isc/include/isc/namespace.h b/contrib/bind9/lib/isc/include/isc/namespace.h
new file mode 100644
index 0000000..05a8b2c
--- /dev/null
+++ b/contrib/bind9/lib/isc/include/isc/namespace.h
@@ -0,0 +1,164 @@
+/*
+ * Copyright (C) 2009, 2010 Internet Systems Consortium, Inc. ("ISC")
+ *
+ * Permission to use, copy, modify, and/or 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 ISC DISCLAIMS ALL WARRANTIES WITH
+ * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+ * AND FITNESS. IN NO EVENT SHALL ISC 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.
+ */
+
+/* $Id: namespace.h,v 1.9 2010-12-04 13:25:59 marka Exp $ */
+
+#ifndef ISCAPI_NAMESPACE_H
+#define ISCAPI_NAMESPACE_H 1
+
+/*%
+ * name space conversions
+ */
+
+#ifdef BIND9
+
+#define isc_app_start isc__app_start
+#define isc_app_ctxstart isc__app_ctxstart
+#define isc_app_onrun isc__app_onrun
+#define isc_app_run isc__app_run
+#define isc_app_ctxrun isc__app_ctxrun
+#define isc_app_shutdown isc__app_shutdown
+#define isc_app_ctxshutdown isc__app_ctxshutdown
+#define isc_app_ctxsuspend isc__app_ctxsuspend
+#define isc_app_reload isc__app_reload
+#define isc_app_finish isc__app_finish
+#define isc_app_block isc__app_block
+#define isc_app_unblock isc__app_unblock
+#define isc_appctx_create isc__appctx_create
+#define isc_appctx_destroy isc__appctx_destroy
+#define isc_appctx_settaskmgr isc__appctx_settaskmgr
+#define isc_appctx_setsocketmgr isc__appctx_setsocketmgr
+#define isc_appctx_settimermgr isc__appctx_settimermgr
+
+#define isc_mem_checkdestroyed isc__mem_checkdestroyed
+#define isc_mem_createx isc__mem_createx
+#define isc_mem_createx2 isc__mem_createx2
+#define isc_mem_create isc__mem_create
+#define isc_mem_create2 isc__mem_create2
+#define isc_mem_attach isc__mem_attach
+#define isc_mem_detach isc__mem_detach
+#define isc__mem_putanddetach isc___mem_putanddetach
+#define isc_mem_destroy isc__mem_destroy
+#define isc_mem_ondestroy isc__mem_ondestroy
+#define isc__mem_get isc___mem_get
+#define isc__mem_put isc___mem_put
+#define isc_mem_stats isc__mem_stats
+#define isc__mem_allocate isc___mem_allocate
+#define isc__mem_free isc___mem_free
+#define isc__mem_strdup isc___mem_strdup
+#define isc__mem_reallocate isc___mem_reallocate
+#define isc_mem_references isc__mem_references
+#define isc_mem_setdestroycheck isc__mem_setdestroycheck
+#define isc_mem_setquota isc__mem_setquota
+#define isc_mem_getname isc__mem_getname
+#define isc_mem_getquota isc__mem_getquota
+#define isc_mem_gettag isc__mem_gettag
+#define isc_mem_inuse isc__mem_inuse
+#define isc_mem_isovermem isc__mem_isovermem
+#define isc_mem_setname isc__mem_setname
+#define isc_mem_setwater isc__mem_setwater
+#define isc_mem_printallactive isc__mem_printallactive
+#define isc_mem_waterack isc__mem_waterack
+#define isc_mempool_create isc__mempool_create
+#define isc_mempool_setname isc__mempool_setname
+#define isc_mempool_destroy isc__mempool_destroy
+#define isc_mempool_associatelock isc__mempool_associatelock
+#define isc__mempool_get isc___mempool_get
+#define isc__mempool_put isc___mempool_put
+#define isc_mempool_setfreemax isc__mempool_setfreemax
+#define isc_mempool_getfreemax isc__mempool_getfreemax
+#define isc_mempool_getfreecount isc__mempool_getfreecount
+#define isc_mempool_setmaxalloc isc__mempool_setmaxalloc
+#define isc_mempool_getmaxalloc isc__mempool_getmaxalloc
+#define isc_mempool_getallocated isc__mempool_getallocated
+#define isc_mempool_setfillcount isc__mempool_setfillcount
+#define isc_mempool_getfillcount isc__mempool_getfillcount
+
+#define isc_socket_create isc__socket_create
+#define isc_socket_attach isc__socket_attach
+#define isc_socket_detach isc__socket_detach
+#define isc_socketmgr_create isc__socketmgr_create
+#define isc_socketmgr_create2 isc__socketmgr_create2
+#define isc_socketmgr_destroy isc__socketmgr_destroy
+#define isc_socket_open isc__socket_open
+#define isc_socket_close isc__socket_close
+#define isc_socket_recvv isc__socket_recvv
+#define isc_socket_recv isc__socket_recv
+#define isc_socket_recv2 isc__socket_recv2
+#define isc_socket_send isc__socket_send
+#define isc_socket_sendto isc__socket_sendto
+#define isc_socket_sendv isc__socket_sendv
+#define isc_socket_sendtov isc__socket_sendtov
+#define isc_socket_sendto2 isc__socket_sendto2
+#define isc_socket_cleanunix isc__socket_cleanunix
+#define isc_socket_permunix isc__socket_permunix
+#define isc_socket_bind isc__socket_bind
+#define isc_socket_filter isc__socket_filter
+#define isc_socket_listen isc__socket_listen
+#define isc_socket_accept isc__socket_accept
+#define isc_socket_connect isc__socket_connect
+#define isc_socket_getname isc__socket_getname
+#define isc_socket_gettag isc__socket_gettag
+#define isc_socket_getpeername isc__socket_getpeername
+#define isc_socket_getsockname isc__socket_getsockname
+#define isc_socket_cancel isc__socket_cancel
+#define isc_socket_gettype isc__socket_gettype
+#define isc_socket_isbound isc__socket_isbound
+#define isc_socket_ipv6only isc__socket_ipv6only
+#define isc_socket_setname isc__socket_setname
+#define isc_socketmgr_getmaxsockets isc__socketmgr_getmaxsockets
+#define isc_socketmgr_setstats isc__socketmgr_setstats
+#define isc_socketmgr_setreserved isc__socketmgr_setreserved
+#define isc__socketmgr_maxudp isc___socketmgr_maxudp
+#define isc_socket_fdwatchcreate isc__socket_fdwatchcreate
+#define isc_socket_fdwatchpoke isc__socket_fdwatchpoke
+
+#define isc_task_create isc__task_create
+#define isc_task_attach isc__task_attach
+#define isc_task_detach isc__task_detach
+/* #define isc_task_exiting isc__task_exiting XXXMPA */
+#define isc_task_send isc__task_send
+#define isc_task_sendanddetach isc__task_sendanddetach
+#define isc_task_purgerange isc__task_purgerange
+#define isc_task_purge isc__task_purge
+#define isc_task_purgeevent isc__task_purgeevent
+#define isc_task_unsendrange isc__task_unsendrange
+#define isc_task_unsend isc__task_unsend
+#define isc_task_onshutdown isc__task_onshutdown
+#define isc_task_shutdown isc__task_shutdown
+#define isc_task_destroy isc__task_destroy
+#define isc_task_setname isc__task_setname
+#define isc_task_getname isc__task_getname
+#define isc_task_gettag isc__task_gettag
+#define isc_task_getcurrenttime isc__task_getcurrenttime
+#define isc_taskmgr_create isc__taskmgr_create
+#define isc_taskmgr_destroy isc__taskmgr_destroy
+#define isc_task_beginexclusive isc__task_beginexclusive
+#define isc_task_endexclusive isc__task_endexclusive
+
+#define isc_timer_create isc__timer_create
+#define isc_timer_reset isc__timer_reset
+#define isc_timer_gettype isc__timer_gettype
+#define isc_timer_touch isc__timer_touch
+#define isc_timer_attach isc__timer_attach
+#define isc_timer_detach isc__timer_detach
+#define isc_timermgr_create isc__timermgr_create
+#define isc_timermgr_poke isc__timermgr_poke
+#define isc_timermgr_destroy isc__timermgr_destroy
+
+#endif /* BIND9 */
+
+#endif /* ISCAPI_NAMESPACE_H */
diff --git a/contrib/bind9/lib/isc/include/isc/netaddr.h b/contrib/bind9/lib/isc/include/isc/netaddr.h
index 52418ec..04b7ec1 100644
--- a/contrib/bind9/lib/isc/include/isc/netaddr.h
+++ b/contrib/bind9/lib/isc/include/isc/netaddr.h
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: netaddr.h,v 1.35.332.2 2009-01-18 23:47:41 tbox Exp $ */
+/* $Id: netaddr.h,v 1.37 2009-01-17 23:47:43 tbox Exp $ */
#ifndef ISC_NETADDR_H
#define ISC_NETADDR_H 1
diff --git a/contrib/bind9/lib/isc/include/isc/netscope.h b/contrib/bind9/lib/isc/include/isc/netscope.h
index 7b2c13c..1a50816 100644
--- a/contrib/bind9/lib/isc/include/isc/netscope.h
+++ b/contrib/bind9/lib/isc/include/isc/netscope.h
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: netscope.h,v 1.11.332.2 2009-06-25 23:47:24 tbox Exp $ */
+/* $Id: netscope.h,v 1.13 2009-06-25 23:48:02 tbox Exp $ */
#ifndef ISC_NETSCOPE_H
#define ISC_NETSCOPE_H 1
diff --git a/contrib/bind9/lib/isc/include/isc/platform.h.in b/contrib/bind9/lib/isc/include/isc/platform.h.in
index 99c887b..2491274 100644
--- a/contrib/bind9/lib/isc/include/isc/platform.h.in
+++ b/contrib/bind9/lib/isc/include/isc/platform.h.in
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: platform.h.in,v 1.48.84.4 2010-06-03 23:47:49 tbox Exp $ */
+/* $Id: platform.h.in,v 1.56 2010-12-18 01:56:23 each Exp $ */
#ifndef ISC_PLATFORM_H
#define ISC_PLATFORM_H 1
@@ -146,6 +146,11 @@
*/
@ISC_PLATFORM_HAVEDEVPOLL@
+/*! \brief
+ * Define if we want to log backtrace
+ */
+@ISC_PLATFORM_USEBACKTRACE@
+
/*
*** Printing.
***/
@@ -215,6 +220,12 @@
@ISC_PLATFORM_GSSAPIHEADER@
/*
+ * Defined to <gssapi_krb5.h> or <gssapi/gssapi_krb5.h> for how to
+ * include the GSSAPI KRB5 header.
+ */
+@ISC_PLATFORM_GSSAPI_KRB5_HEADER@
+
+/*
* Defined to <krb5.h> or <krb5/krb5.h> for how to include
* the KRB5 header.
*/
@@ -290,6 +301,17 @@
*/
@ISC_PLATFORM_HAVESTRINGSH@
+/*
+ * Define if the hash functions must be provided by OpenSSL.
+ */
+@ISC_PLATFORM_OPENSSLHASH@
+
+/*
+ * Defines for the noreturn attribute.
+ */
+@ISC_PLATFORM_NORETURN_PRE@
+@ISC_PLATFORM_NORETURN_POST@
+
/***
*** Windows dll support.
***/
diff --git a/contrib/bind9/lib/isc/include/isc/portset.h b/contrib/bind9/lib/isc/include/isc/portset.h
index a257322..2e27467 100644
--- a/contrib/bind9/lib/isc/include/isc/portset.h
+++ b/contrib/bind9/lib/isc/include/isc/portset.h
@@ -14,7 +14,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: portset.h,v 1.3.90.3 2009-06-25 05:31:51 marka Exp $ */
+/* $Id: portset.h,v 1.6 2009-06-25 05:28:34 marka Exp $ */
/*! \file isc/portset.h
* \brief Transport Protocol Port Manipulation Module
diff --git a/contrib/bind9/lib/isc/include/isc/radix.h b/contrib/bind9/lib/isc/include/isc/radix.h
index fa5e294..ed8aaf2 100644
--- a/contrib/bind9/lib/isc/include/isc/radix.h
+++ b/contrib/bind9/lib/isc/include/isc/radix.h
@@ -14,7 +14,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: radix.h,v 1.11.44.2 2008-12-24 23:47:02 tbox Exp $ */
+/* $Id: radix.h,v 1.13 2008-12-01 23:47:45 tbox Exp $ */
/*
* This source was adapted from MRT's RCS Ids:
diff --git a/contrib/bind9/lib/isc/include/isc/random.h b/contrib/bind9/lib/isc/include/isc/random.h
index 9743cb4..e05b204 100644
--- a/contrib/bind9/lib/isc/include/isc/random.h
+++ b/contrib/bind9/lib/isc/include/isc/random.h
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: random.h,v 1.18.332.2 2009-01-18 23:47:41 tbox Exp $ */
+/* $Id: random.h,v 1.20 2009-01-17 23:47:43 tbox Exp $ */
#ifndef ISC_RANDOM_H
#define ISC_RANDOM_H 1
diff --git a/contrib/bind9/lib/isc/include/isc/ratelimiter.h b/contrib/bind9/lib/isc/include/isc/ratelimiter.h
index 7ed312a..f8a9819 100644
--- a/contrib/bind9/lib/isc/include/isc/ratelimiter.h
+++ b/contrib/bind9/lib/isc/include/isc/ratelimiter.h
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: ratelimiter.h,v 1.21.332.2 2009-01-18 23:47:41 tbox Exp $ */
+/* $Id: ratelimiter.h,v 1.23 2009-01-18 23:48:14 tbox Exp $ */
#ifndef ISC_RATELIMITER_H
#define ISC_RATELIMITER_H 1
diff --git a/contrib/bind9/lib/isc/include/isc/refcount.h b/contrib/bind9/lib/isc/include/isc/refcount.h
index 8e83a13..71f35f1 100644
--- a/contrib/bind9/lib/isc/include/isc/refcount.h
+++ b/contrib/bind9/lib/isc/include/isc/refcount.h
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004-2007 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004-2007, 2009 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 2001, 2003 Internet Software Consortium.
*
* Permission to use, copy, modify, and/or distribute this software for any
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: refcount.h,v 1.15 2007-06-19 23:47:18 tbox Exp $ */
+/* $Id: refcount.h,v 1.17 2009-09-29 23:48:04 tbox Exp $ */
#ifndef ISC_REFCOUNT_H
#define ISC_REFCOUNT_H 1
@@ -28,7 +28,7 @@
#include <isc/util.h>
/*! \file isc/refcount.h
- * \brief Implements a locked reference counter.
+ * \brief Implements a locked reference counter.
*
* These functions may actually be
* implemented using macros, and implementations of these macros are below.
@@ -42,7 +42,7 @@ ISC_LANG_BEGINDECLS
* Function prototypes
*/
-/*
+/*
* isc_result_t
* isc_refcount_init(isc_refcount_t *ref, unsigned int n);
*
@@ -103,7 +103,7 @@ typedef struct isc_refcount {
isc_int32_t refs;
} isc_refcount_t;
-#define isc_refcount_destroy(rp) (REQUIRE((rp)->refs == 0))
+#define isc_refcount_destroy(rp) REQUIRE((rp)->refs == 0)
#define isc_refcount_current(rp) ((unsigned int)((rp)->refs))
#define isc_refcount_increment0(rp, tp) \
@@ -192,7 +192,7 @@ typedef struct isc_refcount {
int refs;
} isc_refcount_t;
-#define isc_refcount_destroy(rp) (REQUIRE((rp)->refs == 0))
+#define isc_refcount_destroy(rp) REQUIRE((rp)->refs == 0)
#define isc_refcount_current(rp) ((unsigned int)((rp)->refs))
#define isc_refcount_increment0(rp, tp) \
diff --git a/contrib/bind9/lib/isc/include/isc/result.h b/contrib/bind9/lib/isc/include/isc/result.h
index 804ab5e..cc591dc 100644
--- a/contrib/bind9/lib/isc/include/isc/result.h
+++ b/contrib/bind9/lib/isc/include/isc/result.h
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004-2008 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004-2009 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 1998-2001, 2003 Internet Software Consortium.
*
* Permission to use, copy, modify, and/or distribute this software for any
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: result.h,v 1.71 2008-09-25 04:02:39 tbox Exp $ */
+/* $Id: result.h,v 1.73 2009-09-02 23:48:03 tbox Exp $ */
#ifndef ISC_RESULT_H
#define ISC_RESULT_H 1
@@ -42,6 +42,7 @@
#define ISC_R_EOF 14 /*%< end of file */
#define ISC_R_BOUND 15 /*%< socket already bound */
#define ISC_R_RELOAD 16 /*%< reload */
+#define ISC_R_SUSPEND ISC_R_RELOAD /*%< alias of 'reload' */
#define ISC_R_LOCKBUSY 17 /*%< lock busy */
#define ISC_R_EXISTS 18 /*%< already exists */
#define ISC_R_NOSPACE 19 /*%< ran out of space */
diff --git a/contrib/bind9/lib/isc/include/isc/resultclass.h b/contrib/bind9/lib/isc/include/isc/resultclass.h
index 86c55b6..84f6c64 100644
--- a/contrib/bind9/lib/isc/include/isc/resultclass.h
+++ b/contrib/bind9/lib/isc/include/isc/resultclass.h
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004-2007 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004-2007, 2009 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 1999-2001 Internet Software Consortium.
*
* Permission to use, copy, modify, and/or distribute this software for any
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: resultclass.h,v 1.18 2007-06-19 23:47:18 tbox Exp $ */
+/* $Id: resultclass.h,v 1.20 2009-09-02 23:48:03 tbox Exp $ */
#ifndef ISC_RESULTCLASS_H
#define ISC_RESULTCLASS_H 1
@@ -45,6 +45,7 @@
#define ISC_RESULTCLASS_DNSRCODE ISC_RESULTCLASS_FROMNUM(3)
#define ISC_RESULTCLASS_OMAPI ISC_RESULTCLASS_FROMNUM(4)
#define ISC_RESULTCLASS_ISCCC ISC_RESULTCLASS_FROMNUM(5)
+#define ISC_RESULTCLASS_DHCP ISC_RESULTCLASS_FROMNUM(6)
#endif /* ISC_RESULTCLASS_H */
diff --git a/contrib/bind9/lib/isc/include/isc/serial.h b/contrib/bind9/lib/isc/include/isc/serial.h
index 97d5fe1..332709d 100644
--- a/contrib/bind9/lib/isc/include/isc/serial.h
+++ b/contrib/bind9/lib/isc/include/isc/serial.h
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: serial.h,v 1.16.332.2 2009-01-18 23:47:41 tbox Exp $ */
+/* $Id: serial.h,v 1.18 2009-01-18 23:48:14 tbox Exp $ */
#ifndef ISC_SERIAL_H
#define ISC_SERIAL_H 1
diff --git a/contrib/bind9/lib/isc/include/isc/sha1.h b/contrib/bind9/lib/isc/include/isc/sha1.h
index 4da682a..a9d08b9 100644
--- a/contrib/bind9/lib/isc/include/isc/sha1.h
+++ b/contrib/bind9/lib/isc/include/isc/sha1.h
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004-2007 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004-2007, 2009 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 2000, 2001 Internet Software Consortium.
*
* Permission to use, copy, modify, and/or distribute this software for any
@@ -18,7 +18,7 @@
#ifndef ISC_SHA1_H
#define ISC_SHA1_H 1
-/* $Id: sha1.h,v 1.17 2007-06-19 23:47:18 tbox Exp $ */
+/* $Id: sha1.h,v 1.19 2009-02-06 23:47:42 tbox Exp $ */
/* $NetBSD: sha1.h,v 1.2 1998/05/29 22:55:44 thorpej Exp $ */
@@ -29,16 +29,25 @@
*/
#include <isc/lang.h>
+#include <isc/platform.h>
#include <isc/types.h>
#define ISC_SHA1_DIGESTLENGTH 20U
#define ISC_SHA1_BLOCK_LENGTH 64U
+#ifdef ISC_PLATFORM_OPENSSLHASH
+#include <openssl/evp.h>
+
+typedef EVP_MD_CTX isc_sha1_t;
+
+#else
+
typedef struct {
isc_uint32_t state[5];
isc_uint32_t count[2];
unsigned char buffer[ISC_SHA1_BLOCK_LENGTH];
} isc_sha1_t;
+#endif
ISC_LANG_BEGINDECLS
diff --git a/contrib/bind9/lib/isc/include/isc/sha2.h b/contrib/bind9/lib/isc/include/isc/sha2.h
index c3130a8..8d4ffa6 100644
--- a/contrib/bind9/lib/isc/include/isc/sha2.h
+++ b/contrib/bind9/lib/isc/include/isc/sha2.h
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2005-2007, 2010 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2005-2007, 2009 Internet Systems Consortium, Inc. ("ISC")
*
* Permission to use, copy, modify, and/or distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
@@ -14,7 +14,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: sha2.h,v 1.9.332.2 2010-01-15 23:47:34 tbox Exp $ */
+/* $Id: sha2.h,v 1.12 2009-10-22 02:21:31 each Exp $ */
/* $FreeBSD$ */
/* $KAME: sha2.h,v 1.3 2001/03/12 08:27:48 itojun Exp $ */
@@ -58,6 +58,7 @@
#define ISC_SHA2_H
#include <isc/lang.h>
+#include <isc/platform.h>
#include <isc/types.h>
/*** SHA-224/256/384/512 Various Length Definitions ***********************/
@@ -75,10 +76,15 @@
#define ISC_SHA512_DIGESTLENGTH 64U
#define ISC_SHA512_DIGESTSTRINGLENGTH (ISC_SHA512_DIGESTLENGTH * 2 + 1)
+/*** SHA-256/384/512 Context Structures *******************************/
-ISC_LANG_BEGINDECLS
+#ifdef ISC_PLATFORM_OPENSSLHASH
+#include <openssl/evp.h>
-/*** SHA-256/384/512 Context Structures *******************************/
+typedef EVP_MD_CTX isc_sha256_t;
+typedef EVP_MD_CTX isc_sha512_t;
+
+#else
/*
* Keep buffer immediately after bitcount to preserve alignment.
@@ -97,10 +103,13 @@ typedef struct {
isc_uint64_t bitcount[2];
isc_uint8_t buffer[ISC_SHA512_BLOCK_LENGTH];
} isc_sha512_t;
+#endif
typedef isc_sha256_t isc_sha224_t;
typedef isc_sha512_t isc_sha384_t;
+ISC_LANG_BEGINDECLS
+
/*** SHA-224/256/384/512 Function Prototypes ******************************/
void isc_sha224_init (isc_sha224_t *);
diff --git a/contrib/bind9/lib/isc/include/isc/sockaddr.h b/contrib/bind9/lib/isc/include/isc/sockaddr.h
index 758cef7..c83655e 100644
--- a/contrib/bind9/lib/isc/include/isc/sockaddr.h
+++ b/contrib/bind9/lib/isc/include/isc/sockaddr.h
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: sockaddr.h,v 1.55.332.2 2009-01-18 23:47:41 tbox Exp $ */
+/* $Id: sockaddr.h,v 1.57 2009-01-18 23:48:14 tbox Exp $ */
#ifndef ISC_SOCKADDR_H
#define ISC_SOCKADDR_H 1
diff --git a/contrib/bind9/lib/isc/include/isc/socket.h b/contrib/bind9/lib/isc/include/isc/socket.h
index 749ee52..0aa71da 100644
--- a/contrib/bind9/lib/isc/include/isc/socket.h
+++ b/contrib/bind9/lib/isc/include/isc/socket.h
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: socket.h,v 1.85.58.3 2009-01-29 22:40:35 jinmei Exp $ */
+/* $Id: socket.h,v 1.94 2009-10-01 01:30:01 sar Exp $ */
#ifndef ISC_SOCKET_H
#define ISC_SOCKET_H 1
@@ -260,6 +260,85 @@ typedef enum {
#define ISC_SOCKFDWATCH_WRITE 0x00000002 /*%< watch for writable */
/*@}*/
+/*% Socket and socket manager methods */
+typedef struct isc_socketmgrmethods {
+ void (*destroy)(isc_socketmgr_t **managerp);
+ isc_result_t (*socketcreate)(isc_socketmgr_t *manager, int pf,
+ isc_sockettype_t type,
+ isc_socket_t **socketp);
+ isc_result_t (*fdwatchcreate)(isc_socketmgr_t *manager, int fd,
+ int flags,
+ isc_sockfdwatch_t callback,
+ void *cbarg, isc_task_t *task,
+ isc_socket_t **socketp);
+} isc_socketmgrmethods_t;
+
+typedef struct isc_socketmethods {
+ void (*attach)(isc_socket_t *socket,
+ isc_socket_t **socketp);
+ void (*detach)(isc_socket_t **socketp);
+ isc_result_t (*bind)(isc_socket_t *sock, isc_sockaddr_t *sockaddr,
+ unsigned int options);
+ isc_result_t (*sendto)(isc_socket_t *sock, isc_region_t *region,
+ isc_task_t *task, isc_taskaction_t action,
+ const void *arg, isc_sockaddr_t *address,
+ struct in6_pktinfo *pktinfo);
+ isc_result_t (*connect)(isc_socket_t *sock, isc_sockaddr_t *addr,
+ isc_task_t *task, isc_taskaction_t action,
+ const void *arg);
+ isc_result_t (*recv)(isc_socket_t *sock, isc_region_t *region,
+ unsigned int minimum, isc_task_t *task,
+ isc_taskaction_t action, const void *arg);
+ void (*cancel)(isc_socket_t *sock, isc_task_t *task,
+ unsigned int how);
+ isc_result_t (*getsockname)(isc_socket_t *sock,
+ isc_sockaddr_t *addressp);
+ isc_sockettype_t (*gettype)(isc_socket_t *sock);
+ void (*ipv6only)(isc_socket_t *sock, isc_boolean_t yes);
+ isc_result_t (*fdwatchpoke)(isc_socket_t *sock, int flags);
+} isc_socketmethods_t;
+
+/*%
+ * This structure is actually just the common prefix of a socket manager
+ * object implementation's version of an isc_socketmgr_t.
+ * \brief
+ * Direct use of this structure by clients is forbidden. socket implementations
+ * may change the structure. 'magic' must be ISCAPI_SOCKETMGR_MAGIC for any
+ * of the isc_socket_ routines to work. socket implementations must maintain
+ * all socket invariants.
+ * In effect, this definition is used only for non-BIND9 version ("export")
+ * of the library, and the export version does not work for win32. So, to avoid
+ * the definition conflict with win32/socket.c, we enable this definition only
+ * for non-Win32 (i.e. Unix) platforms.
+ */
+#ifndef WIN32
+struct isc_socketmgr {
+ unsigned int impmagic;
+ unsigned int magic;
+ isc_socketmgrmethods_t *methods;
+};
+#endif
+
+#define ISCAPI_SOCKETMGR_MAGIC ISC_MAGIC('A','s','m','g')
+#define ISCAPI_SOCKETMGR_VALID(m) ((m) != NULL && \
+ (m)->magic == ISCAPI_SOCKETMGR_MAGIC)
+
+/*%
+ * This is the common prefix of a socket object. The same note as
+ * that for the socketmgr structure applies.
+ */
+#ifndef WIN32
+struct isc_socket {
+ unsigned int impmagic;
+ unsigned int magic;
+ isc_socketmethods_t *methods;
+};
+#endif
+
+#define ISCAPI_SOCKET_MAGIC ISC_MAGIC('A','s','c','t')
+#define ISCAPI_SOCKET_VALID(s) ((s) != NULL && \
+ (s)->magic == ISCAPI_SOCKET_MAGIC)
+
/***
*** Socket and Socket Manager Functions
***
@@ -307,6 +386,35 @@ isc_socket_fdwatchcreate(isc_socketmgr_t *manager,
*/
isc_result_t
+isc_socket_fdwatchpoke(isc_socket_t *sock,
+ int flags);
+/*%<
+ * Poke a file descriptor watch socket informing the manager that it
+ * should restart watching the socket
+ *
+ * Note:
+ *
+ *\li 'sock' is the socket returned by isc_socket_fdwatchcreate
+ *
+ *\li 'flags' indicates what the manager should watch for on the socket
+ * in addition to what it may already be watching. It can be one or
+ * both of ISC_SOCKFDWATCH_READ and ISC_SOCKFDWATCH_WRITE. To
+ * temporarily disable watching on a socket the value indicating
+ * no more data should be returned from the call back routine.
+ *
+ *\li This function is not available on Windows.
+ *
+ * Requires:
+ *
+ *\li 'sock' is a valid isc socket
+ *
+ *
+ * Returns:
+ *
+ *\li #ISC_R_SUCCESS
+ */
+
+isc_result_t
isc_socket_create(isc_socketmgr_t *manager,
int pf,
isc_sockettype_t type,
@@ -821,6 +929,10 @@ isc_socket_sendto2(isc_socket_t *sock, isc_region_t *region,
/*@}*/
isc_result_t
+isc_socketmgr_createinctx(isc_mem_t *mctx, isc_appctx_t *actx,
+ isc_socketmgr_t **managerp);
+
+isc_result_t
isc_socketmgr_create(isc_mem_t *mctx, isc_socketmgr_t **managerp);
isc_result_t
@@ -831,6 +943,8 @@ isc_socketmgr_create2(isc_mem_t *mctx, isc_socketmgr_t **managerp,
* maximum number of sockets that the created manager should handle.
* isc_socketmgr_create() is equivalent of isc_socketmgr_create2() with
* "maxsocks" being zero.
+ * isc_socketmgr_createinctx() also associates the new manager with the
+ * specified application context.
*
* Notes:
*
@@ -842,6 +956,8 @@ isc_socketmgr_create2(isc_mem_t *mctx, isc_socketmgr_t **managerp,
*
*\li 'managerp' points to a NULL isc_socketmgr_t.
*
+ *\li 'actx' is a valid application context (for createinctx()).
+ *
* Ensures:
*
*\li '*managerp' is a valid isc_socketmgr_t.
@@ -992,6 +1108,12 @@ isc__socketmgr_setreserved(isc_socketmgr_t *mgr, isc_uint32_t);
* Temporary. For use by named only.
*/
+void
+isc__socketmgr_maxudp(isc_socketmgr_t *mgr, int maxudp);
+/*%<
+ * Test interface. Drop UDP packet > 'maxudp'.
+ */
+
#ifdef HAVE_LIBXML2
void
@@ -1002,6 +1124,31 @@ isc_socketmgr_renderxml(isc_socketmgr_t *mgr, xmlTextWriterPtr writer);
#endif /* HAVE_LIBXML2 */
+#ifdef USE_SOCKETIMPREGISTER
+/*%<
+ * See isc_socketmgr_create() above.
+ */
+typedef isc_result_t
+(*isc_socketmgrcreatefunc_t)(isc_mem_t *mctx, isc_socketmgr_t **managerp);
+
+isc_result_t
+isc_socket_register(isc_socketmgrcreatefunc_t createfunc);
+/*%<
+ * Register a new socket I/O implementation and add it to the list of
+ * supported implementations. This function must be called when a different
+ * event library is used than the one contained in the ISC library.
+ */
+
+isc_result_t
+isc__socket_register(void);
+/*%<
+ * A short cut function that specifies the socket I/O module in the ISC
+ * library for isc_socket_register(). An application that uses the ISC library
+ * usually do not have to care about this function: it would call
+ * isc_lib_register(), which internally calls this function.
+ */
+#endif /* USE_SOCKETIMPREGISTER */
+
ISC_LANG_ENDDECLS
#endif /* ISC_SOCKET_H */
diff --git a/contrib/bind9/lib/isc/include/isc/stats.h b/contrib/bind9/lib/isc/include/isc/stats.h
index 1148a16..226bc08 100644
--- a/contrib/bind9/lib/isc/include/isc/stats.h
+++ b/contrib/bind9/lib/isc/include/isc/stats.h
@@ -14,7 +14,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: stats.h,v 1.4.2.2 2009-01-29 23:47:44 tbox Exp $ */
+/* $Id: stats.h,v 1.4 2009-01-29 01:03:56 jinmei Exp $ */
#ifndef ISC_STATS_H
#define ISC_STATS_H 1
diff --git a/contrib/bind9/lib/isc/include/isc/symtab.h b/contrib/bind9/lib/isc/include/isc/symtab.h
index a1d7102..c61d0ea 100644
--- a/contrib/bind9/lib/isc/include/isc/symtab.h
+++ b/contrib/bind9/lib/isc/include/isc/symtab.h
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: symtab.h,v 1.24.332.2 2009-01-18 23:47:41 tbox Exp $ */
+/* $Id: symtab.h,v 1.26 2009-01-18 23:48:14 tbox Exp $ */
#ifndef ISC_SYMTAB_H
#define ISC_SYMTAB_H 1
diff --git a/contrib/bind9/lib/isc/include/isc/task.h b/contrib/bind9/lib/isc/include/isc/task.h
index a8c7569..a2a1bbe 100644
--- a/contrib/bind9/lib/isc/include/isc/task.h
+++ b/contrib/bind9/lib/isc/include/isc/task.h
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004-2007, 2009, 2010 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004-2007, 2009-2011 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 1998-2001, 2003 Internet Software Consortium.
*
* Permission to use, copy, modify, and/or distribute this software for any
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: task.h,v 1.61.332.4 2010-12-03 23:45:47 tbox Exp $ */
+/* $Id: task.h,v 1.69.14.1.2.1 2011-06-02 23:47:36 tbox Exp $ */
#ifndef ISC_TASK_H
#define ISC_TASK_H 1
@@ -96,6 +96,72 @@
ISC_LANG_BEGINDECLS
+/***
+ *** Types
+ ***/
+
+/*% Task and task manager methods */
+typedef struct isc_taskmgrmethods {
+ void (*destroy)(isc_taskmgr_t **managerp);
+ isc_result_t (*taskcreate)(isc_taskmgr_t *manager,
+ unsigned int quantum,
+ isc_task_t **taskp);
+} isc_taskmgrmethods_t;
+
+typedef struct isc_taskmethods {
+ void (*attach)(isc_task_t *source, isc_task_t **targetp);
+ void (*detach)(isc_task_t **taskp);
+ void (*destroy)(isc_task_t **taskp);
+ void (*send)(isc_task_t *task, isc_event_t **eventp);
+ void (*sendanddetach)(isc_task_t **taskp, isc_event_t **eventp);
+ unsigned int (*unsend)(isc_task_t *task, void *sender, isc_eventtype_t type,
+ void *tag, isc_eventlist_t *events);
+ isc_result_t (*onshutdown)(isc_task_t *task, isc_taskaction_t action,
+ const void *arg);
+ void (*shutdown)(isc_task_t *task);
+ void (*setname)(isc_task_t *task, const char *name, void *tag);
+ unsigned int (*purgeevents)(isc_task_t *task, void *sender,
+ isc_eventtype_t type, void *tag);
+ unsigned int (*purgerange)(isc_task_t *task, void *sender,
+ isc_eventtype_t first, isc_eventtype_t last,
+ void *tag);
+ isc_result_t (*beginexclusive)(isc_task_t *task);
+ void (*endexclusive)(isc_task_t *task);
+} isc_taskmethods_t;
+
+/*%
+ * This structure is actually just the common prefix of a task manager
+ * object implementation's version of an isc_taskmgr_t.
+ * \brief
+ * Direct use of this structure by clients is forbidden. task implementations
+ * may change the structure. 'magic' must be ISCAPI_TASKMGR_MAGIC for any
+ * of the isc_task_ routines to work. task implementations must maintain
+ * all task invariants.
+ */
+struct isc_taskmgr {
+ unsigned int impmagic;
+ unsigned int magic;
+ isc_taskmgrmethods_t *methods;
+};
+
+#define ISCAPI_TASKMGR_MAGIC ISC_MAGIC('A','t','m','g')
+#define ISCAPI_TASKMGR_VALID(m) ((m) != NULL && \
+ (m)->magic == ISCAPI_TASKMGR_MAGIC)
+
+/*%
+ * This is the common prefix of a task object. The same note as
+ * that for the taskmgr structure applies.
+ */
+struct isc_task {
+ unsigned int impmagic;
+ unsigned int magic;
+ isc_taskmethods_t *methods;
+};
+
+#define ISCAPI_TASK_MAGIC ISC_MAGIC('A','t','s','t')
+#define ISCAPI_TASK_VALID(s) ((s) != NULL && \
+ (s)->magic == ISCAPI_TASK_MAGIC)
+
isc_result_t
isc_task_create(isc_taskmgr_t *manager, unsigned int quantum,
isc_task_t **taskp);
@@ -550,10 +616,15 @@ isc_task_exiting(isc_task_t *t);
*****/
isc_result_t
+isc_taskmgr_createinctx(isc_mem_t *mctx, isc_appctx_t *actx,
+ unsigned int workers, unsigned int default_quantum,
+ isc_taskmgr_t **managerp);
+isc_result_t
isc_taskmgr_create(isc_mem_t *mctx, unsigned int workers,
unsigned int default_quantum, isc_taskmgr_t **managerp);
/*%<
- * Create a new task manager.
+ * Create a new task manager. isc_taskmgr_createinctx() also associates
+ * the new manager with the specified application context.
*
* Notes:
*
@@ -575,6 +646,8 @@ isc_taskmgr_create(isc_mem_t *mctx, unsigned int workers,
*
*\li managerp != NULL && *managerp == NULL
*
+ *\li 'actx' is a valid application context (for createinctx()).
+ *
* Ensures:
*
*\li On success, '*managerp' will be attached to the newly created task
@@ -584,8 +657,10 @@ isc_taskmgr_create(isc_mem_t *mctx, unsigned int workers,
*
*\li #ISC_R_SUCCESS
*\li #ISC_R_NOMEMORY
- *\li #ISC_R_NOTHREADS No threads could be created.
+ *\li #ISC_R_NOTHREADS No threads could be created.
*\li #ISC_R_UNEXPECTED An unexpected error occurred.
+ *\li #ISC_R_SHUTTINGDOWN The non-threaded, shared, task
+ * manager shutting down.
*/
void
@@ -629,6 +704,31 @@ isc_taskmgr_renderxml(isc_taskmgr_t *mgr, xmlTextWriterPtr writer);
#endif
+/*%<
+ * See isc_taskmgr_create() above.
+ */
+typedef isc_result_t
+(*isc_taskmgrcreatefunc_t)(isc_mem_t *mctx, unsigned int workers,
+ unsigned int default_quantum,
+ isc_taskmgr_t **managerp);
+
+isc_result_t
+isc_task_register(isc_taskmgrcreatefunc_t createfunc);
+/*%<
+ * Register a new task management implementation and add it to the list of
+ * supported implementations. This function must be called when a different
+ * event library is used than the one contained in the ISC library.
+ */
+
+isc_result_t
+isc__task_register(void);
+/*%<
+ * A short cut function that specifies the task management module in the ISC
+ * library for isc_task_register(). An application that uses the ISC library
+ * usually do not have to care about this function: it would call
+ * isc_lib_register(), which internally calls this function.
+ */
+
ISC_LANG_ENDDECLS
#endif /* ISC_TASK_H */
diff --git a/contrib/bind9/lib/isc/include/isc/timer.h b/contrib/bind9/lib/isc/include/isc/timer.h
index 052e25b..a54e73b 100644
--- a/contrib/bind9/lib/isc/include/isc/timer.h
+++ b/contrib/bind9/lib/isc/include/isc/timer.h
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004-2008 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004-2009 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 1998-2002 Internet Software Consortium.
*
* Permission to use, copy, modify, and/or distribute this software for any
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: timer.h,v 1.40 2008-06-23 23:47:11 tbox Exp $ */
+/* $Id: timer.h,v 1.43 2009-09-02 23:48:03 tbox Exp $ */
#ifndef ISC_TIMER_H
#define ISC_TIMER_H 1
@@ -103,6 +103,61 @@ typedef struct isc_timerevent {
#define ISC_TIMEREVENT_LIFE (ISC_EVENTCLASS_TIMER + 3)
#define ISC_TIMEREVENT_LASTEVENT (ISC_EVENTCLASS_TIMER + 65535)
+/*% Timer and timer manager methods */
+typedef struct {
+ void (*destroy)(isc_timermgr_t **managerp);
+ isc_result_t (*timercreate)(isc_timermgr_t *manager,
+ isc_timertype_t type,
+ isc_time_t *expires,
+ isc_interval_t *interval,
+ isc_task_t *task,
+ isc_taskaction_t action,
+ const void *arg,
+ isc_timer_t **timerp);
+} isc_timermgrmethods_t;
+
+typedef struct {
+ void (*attach)(isc_timer_t *timer, isc_timer_t **timerp);
+ void (*detach)(isc_timer_t **timerp);
+ isc_result_t (*reset)(isc_timer_t *timer, isc_timertype_t type,
+ isc_time_t *expires, isc_interval_t *interval,
+ isc_boolean_t purge);
+ isc_result_t (*touch)(isc_timer_t *timer);
+} isc_timermethods_t;
+
+/*%
+ * This structure is actually just the common prefix of a timer manager
+ * object implementation's version of an isc_timermgr_t.
+ * \brief
+ * Direct use of this structure by clients is forbidden. timer implementations
+ * may change the structure. 'magic' must be ISCAPI_TIMERMGR_MAGIC for any
+ * of the isc_timer_ routines to work. timer implementations must maintain
+ * all timer invariants.
+ */
+struct isc_timermgr {
+ unsigned int impmagic;
+ unsigned int magic;
+ isc_timermgrmethods_t *methods;
+};
+
+#define ISCAPI_TIMERMGR_MAGIC ISC_MAGIC('A','t','m','g')
+#define ISCAPI_TIMERMGR_VALID(m) ((m) != NULL && \
+ (m)->magic == ISCAPI_TIMERMGR_MAGIC)
+
+/*%
+ * This is the common prefix of a timer object. The same note as
+ * that for the timermgr structure applies.
+ */
+struct isc_timer {
+ unsigned int impmagic;
+ unsigned int magic;
+ isc_timermethods_t *methods;
+};
+
+#define ISCAPI_TIMER_MAGIC ISC_MAGIC('A','t','m','r')
+#define ISCAPI_TIMER_VALID(s) ((s) != NULL && \
+ (s)->magic == ISCAPI_TIMER_MAGIC)
+
/***
*** Timer and Timer Manager Functions
***
@@ -289,9 +344,14 @@ isc_timer_gettype(isc_timer_t *timer);
*/
isc_result_t
+isc_timermgr_createinctx(isc_mem_t *mctx, isc_appctx_t *actx,
+ isc_timermgr_t **managerp);
+
+isc_result_t
isc_timermgr_create(isc_mem_t *mctx, isc_timermgr_t **managerp);
/*%<
- * Create a timer manager.
+ * Create a timer manager. isc_timermgr_createinctx() also associates
+ * the new manager with the specified application context.
*
* Notes:
*
@@ -303,6 +363,8 @@ isc_timermgr_create(isc_mem_t *mctx, isc_timermgr_t **managerp);
*
*\li 'managerp' points to a NULL isc_timermgr_t.
*
+ *\li 'actx' is a valid application context (for createinctx()).
+ *
* Ensures:
*
*\li '*managerp' is a valid isc_timermgr_t.
@@ -339,6 +401,31 @@ isc_timermgr_destroy(isc_timermgr_t **managerp);
void isc_timermgr_poke(isc_timermgr_t *m);
+#ifdef USE_TIMERIMPREGISTER
+/*%<
+ * See isc_timermgr_create() above.
+ */
+typedef isc_result_t
+(*isc_timermgrcreatefunc_t)(isc_mem_t *mctx, isc_timermgr_t **managerp);
+
+isc_result_t
+isc__timer_register(void);
+/*%<
+ * Register a new timer management implementation and add it to the list of
+ * supported implementations. This function must be called when a different
+ * event library is used than the one contained in the ISC library.
+ */
+
+isc_result_t
+isc_timer_register(isc_timermgrcreatefunc_t createfunc);
+/*%<
+ * A short cut function that specifies the timer management module in the ISC
+ * library for isc_timer_register(). An application that uses the ISC library
+ * usually do not have to care about this function: it would call
+ * isc_lib_register(), which internally calls this function.
+ */
+#endif /* USE_TIMERIMPREGISTER */
+
ISC_LANG_ENDDECLS
#endif /* ISC_TIMER_H */
diff --git a/contrib/bind9/lib/isc/include/isc/types.h b/contrib/bind9/lib/isc/include/isc/types.h
index 01362b8..10da62b 100644
--- a/contrib/bind9/lib/isc/include/isc/types.h
+++ b/contrib/bind9/lib/isc/include/isc/types.h
@@ -15,11 +15,14 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: types.h,v 1.46.84.2 2009-01-29 23:47:44 tbox Exp $ */
+/* $Id: types.h,v 1.52 2009-12-05 23:31:41 each Exp $ */
#ifndef ISC_TYPES_H
#define ISC_TYPES_H 1
+#include <isc/bind9.h>
+#include <isc/namespace.h>
+
/*! \file isc/types.h
* \brief
* OS-specific types, from the OS-specific include directories.
@@ -40,6 +43,8 @@
/* Core Types. Alphabetized by defined type. */
+typedef struct isc_appctx isc_appctx_t; /*%< Application context */
+typedef struct isc_backtrace_symmap isc_backtrace_symmap_t; /*%< Symbol Table Entry */
typedef struct isc_bitstring isc_bitstring_t; /*%< Bitstring */
typedef struct isc_buffer isc_buffer_t; /*%< Buffer */
typedef ISC_LIST(isc_buffer_t) isc_bufferlist_t; /*%< Buffer List */
@@ -94,7 +99,7 @@ typedef struct isc_timer isc_timer_t; /*%< Timer */
typedef struct isc_timermgr isc_timermgr_t; /*%< Timer Manager */
typedef void (*isc_taskaction_t)(isc_task_t *, isc_event_t *);
-typedef int (*isc_sockfdwatch_t)(isc_task_t *, isc_socket_t *, void *);
+typedef int (*isc_sockfdwatch_t)(isc_task_t *, isc_socket_t *, void *, int);
/* The following cannot be listed alphabetically due to forward reference */
typedef isc_result_t (isc_httpdaction_t)(const char *url,
diff --git a/contrib/bind9/lib/isc/include/isc/util.h b/contrib/bind9/lib/isc/include/isc/util.h
index 8ccad8d..11d0044 100644
--- a/contrib/bind9/lib/isc/include/isc/util.h
+++ b/contrib/bind9/lib/isc/include/isc/util.h
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: util.h,v 1.30.332.2 2010-01-11 23:47:22 tbox Exp $ */
+/* $Id: util.h,v 1.32 2010-01-11 23:48:37 tbox Exp $ */
#ifndef ISC_UTIL_H
#define ISC_UTIL_H 1
diff --git a/contrib/bind9/lib/isc/inet_aton.c b/contrib/bind9/lib/isc/inet_aton.c
index 3c25ca3..9e35a36 100644
--- a/contrib/bind9/lib/isc/inet_aton.c
+++ b/contrib/bind9/lib/isc/inet_aton.c
@@ -1,5 +1,5 @@
/*
- * Portions Copyright (C) 2004, 2005, 2007, 2009 Internet Systems Consortium, Inc. ("ISC")
+ * Portions Copyright (C) 2004, 2005, 2007, 2008 Internet Systems Consortium, Inc. ("ISC")
* Portions Copyright (C) 1996-2001 Internet Software Consortium.
*
* Permission to use, copy, modify, and/or distribute this software for any
@@ -71,7 +71,7 @@
#if defined(LIBC_SCCS) && !defined(lint)
static char sccsid[] = "@(#)inet_addr.c 8.1 (Berkeley) 6/17/93";
-static char rcsid[] = "$Id: inet_aton.c,v 1.21.332.2 2009-03-05 23:47:03 tbox Exp $";
+static char rcsid[] = "$Id: inet_aton.c,v 1.23 2008-12-01 23:47:45 tbox Exp $";
#endif /* LIBC_SCCS and not lint */
#include <config.h>
diff --git a/contrib/bind9/lib/isc/inet_ntop.c b/contrib/bind9/lib/isc/inet_ntop.c
index 22930f3..581ebe8 100644
--- a/contrib/bind9/lib/isc/inet_ntop.c
+++ b/contrib/bind9/lib/isc/inet_ntop.c
@@ -19,7 +19,7 @@
#if defined(LIBC_SCCS) && !defined(lint)
static char rcsid[] =
- "$Id: inet_ntop.c,v 1.19.332.2 2009-07-18 23:47:25 tbox Exp $";
+ "$Id: inet_ntop.c,v 1.21 2009-07-17 23:47:41 tbox Exp $";
#endif /* LIBC_SCCS and not lint */
#include <config.h>
diff --git a/contrib/bind9/lib/isc/iterated_hash.c b/contrib/bind9/lib/isc/iterated_hash.c
index ebc5076..7185075 100644
--- a/contrib/bind9/lib/isc/iterated_hash.c
+++ b/contrib/bind9/lib/isc/iterated_hash.c
@@ -14,7 +14,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: iterated_hash.c,v 1.4.48.2 2009-02-18 23:47:12 tbox Exp $ */
+/* $Id: iterated_hash.c,v 1.6 2009-02-18 23:47:48 tbox Exp $ */
#include "config.h"
diff --git a/contrib/bind9/lib/isc/lib.c b/contrib/bind9/lib/isc/lib.c
index 99b0178..1b6ccc0 100644
--- a/contrib/bind9/lib/isc/lib.c
+++ b/contrib/bind9/lib/isc/lib.c
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004, 2005, 2007 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004, 2005, 2007, 2009 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 1999-2001 Internet Software Consortium.
*
* Permission to use, copy, modify, and/or distribute this software for any
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: lib.c,v 1.14 2007-06-19 23:47:17 tbox Exp $ */
+/* $Id: lib.c,v 1.16 2009-09-02 23:48:02 tbox Exp $ */
/*! \file */
@@ -24,9 +24,15 @@
#include <stdio.h>
#include <stdlib.h>
-#include <isc/once.h>
-#include <isc/msgs.h>
+#include <isc/app.h>
#include <isc/lib.h>
+#include <isc/mem.h>
+#include <isc/msgs.h>
+#include <isc/once.h>
+#include <isc/socket.h>
+#include <isc/task.h>
+#include <isc/timer.h>
+#include <isc/util.h>
/***
*** Globals
@@ -41,7 +47,6 @@ LIBISC_EXTERNAL_DATA isc_msgcat_t * isc_msgcat = NULL;
static isc_once_t msgcat_once = ISC_ONCE_INIT;
-
/***
*** Functions
***/
@@ -77,3 +82,22 @@ isc_lib_initmsgcat(void) {
abort();
}
}
+
+#ifndef BIND9
+static isc_once_t register_once = ISC_ONCE_INIT;
+
+static void
+do_register(void) {
+ RUNTIME_CHECK(isc__mem_register() == ISC_R_SUCCESS);
+ RUNTIME_CHECK(isc__app_register() == ISC_R_SUCCESS);
+ RUNTIME_CHECK(isc__task_register() == ISC_R_SUCCESS);
+ RUNTIME_CHECK(isc__socket_register() == ISC_R_SUCCESS);
+ RUNTIME_CHECK(isc__timer_register() == ISC_R_SUCCESS);
+}
+
+void
+isc_lib_register() {
+ RUNTIME_CHECK(isc_once_do(&register_once, do_register)
+ == ISC_R_SUCCESS);
+}
+#endif
diff --git a/contrib/bind9/lib/isc/log.c b/contrib/bind9/lib/isc/log.c
index 121bd25..7ef6692 100644
--- a/contrib/bind9/lib/isc/log.c
+++ b/contrib/bind9/lib/isc/log.c
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: log.c,v 1.94.332.5 2009-02-16 02:04:05 marka Exp $ */
+/* $Id: log.c,v 1.99 2009-02-16 02:01:16 marka Exp $ */
/*! \file
* \author Principal Authors: DCL */
diff --git a/contrib/bind9/lib/isc/md5.c b/contrib/bind9/lib/isc/md5.c
index b9ec42c..b778177 100644
--- a/contrib/bind9/lib/isc/md5.c
+++ b/contrib/bind9/lib/isc/md5.c
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004, 2005, 2007 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004, 2005, 2007, 2009 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 2000, 2001 Internet Software Consortium.
*
* Permission to use, copy, modify, and/or distribute this software for any
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: md5.c,v 1.14 2007-06-19 23:47:17 tbox Exp $ */
+/* $Id: md5.c,v 1.16 2009-02-06 23:47:42 tbox Exp $ */
/*! \file
* This code implements the MD5 message-digest algorithm.
@@ -38,10 +38,35 @@
#include <isc/assertions.h>
#include <isc/md5.h>
+#include <isc/platform.h>
#include <isc/string.h>
#include <isc/types.h>
#include <isc/util.h>
+#ifdef ISC_PLATFORM_OPENSSLHASH
+
+void
+isc_md5_init(isc_md5_t *ctx) {
+ EVP_DigestInit(ctx, EVP_md5());
+}
+
+void
+isc_md5_invalidate(isc_md5_t *ctx) {
+ EVP_MD_CTX_cleanup(ctx);
+}
+
+void
+isc_md5_update(isc_md5_t *ctx, const unsigned char *buf, unsigned int len) {
+ EVP_DigestUpdate(ctx, (const void *) buf, (size_t) len);
+}
+
+void
+isc_md5_final(isc_md5_t *ctx, unsigned char *digest) {
+ EVP_DigestFinal(ctx, digest, NULL);
+}
+
+#else
+
static void
byteSwap(isc_uint32_t *buf, unsigned words)
{
@@ -249,3 +274,4 @@ isc_md5_final(isc_md5_t *ctx, unsigned char *digest) {
memcpy(digest, ctx->buf, 16);
memset(ctx, 0, sizeof(isc_md5_t)); /* In case it's sensitive */
}
+#endif
diff --git a/contrib/bind9/lib/isc/mem.c b/contrib/bind9/lib/isc/mem.c
index aeacfc0..8311569 100644
--- a/contrib/bind9/lib/isc/mem.c
+++ b/contrib/bind9/lib/isc/mem.c
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: mem.c,v 1.145.120.9 2010-08-11 23:45:49 tbox Exp $ */
+/* $Id: mem.c,v 1.160 2010-12-08 02:46:16 marka Exp $ */
/*! \file */
@@ -60,6 +60,9 @@ LIBISC_EXTERNAL_DATA unsigned int isc_mem_debugging = ISC_MEM_DEBUGGING;
/*
* Types.
*/
+typedef struct isc__mem isc__mem_t;
+typedef struct isc__mempool isc__mempool_t;
+
#if ISC_MEM_TRACKLINES
typedef struct debuglink debuglink_t;
struct debuglink {
@@ -89,7 +92,7 @@ typedef struct {
*/
union {
size_t size;
- isc_mem_t *ctx;
+ isc__mem_t *ctx;
char bytes[ALIGNMENT_SIZE];
} u;
} size_info;
@@ -110,7 +113,7 @@ typedef ISC_LIST(debuglink_t) debuglist_t;
/* List of all active memory contexts. */
-static ISC_LIST(isc_mem_t) contexts;
+static ISC_LIST(isc__mem_t) contexts;
static isc_once_t once = ISC_ONCE_INIT;
static isc_mutex_t lock;
@@ -120,8 +123,8 @@ static isc_mutex_t lock;
*/
static isc_uint64_t totallost;
-struct isc_mem {
- unsigned int magic;
+struct isc__mem {
+ isc_mem_t common;
isc_ondestroy_t ondestroy;
unsigned int flags;
isc_mutex_t lock;
@@ -144,7 +147,7 @@ struct isc_mem {
isc_boolean_t is_overmem;
isc_mem_water_t water;
void * water_arg;
- ISC_LIST(isc_mempool_t) pools;
+ ISC_LIST(isc__mempool_t) pools;
unsigned int poolcnt;
/* ISC_MEMFLAG_INTERNAL */
@@ -163,19 +166,19 @@ struct isc_mem {
#endif
unsigned int memalloc_failures;
- ISC_LINK(isc_mem_t) link;
+ ISC_LINK(isc__mem_t) link;
};
#define MEMPOOL_MAGIC ISC_MAGIC('M', 'E', 'M', 'p')
#define VALID_MEMPOOL(c) ISC_MAGIC_VALID(c, MEMPOOL_MAGIC)
-struct isc_mempool {
+struct isc__mempool {
/* always unlocked */
- unsigned int magic; /*%< magic number */
+ isc_mempool_t common; /*%< common header of mempool's */
isc_mutex_t *lock; /*%< optional lock */
- isc_mem_t *mctx; /*%< our memory context */
+ isc__mem_t *mctx; /*%< our memory context */
/*%< locked via the memory context's lock */
- ISC_LINK(isc_mempool_t) link; /*%< next pool in this mem context */
+ ISC_LINK(isc__mempool_t) link; /*%< next pool in this mem context */
/*%< optionally locked from here down */
element *items; /*%< low water item list */
size_t size; /*%< size of each item on this pool */
@@ -210,13 +213,187 @@ struct isc_mempool {
#define DELETE_TRACE(a, b, c, d, e) delete_trace_entry(a, b, c, d, e)
static void
-print_active(isc_mem_t *ctx, FILE *out);
+print_active(isc__mem_t *ctx, FILE *out);
+
+/*%
+ * The following can be either static or public, depending on build environment.
+ */
+
+#ifdef BIND9
+#define ISC_MEMFUNC_SCOPE
+#else
+#define ISC_MEMFUNC_SCOPE static
+#endif
+
+ISC_MEMFUNC_SCOPE isc_result_t
+isc__mem_createx(size_t init_max_size, size_t target_size,
+ isc_memalloc_t memalloc, isc_memfree_t memfree, void *arg,
+ isc_mem_t **ctxp);
+ISC_MEMFUNC_SCOPE isc_result_t
+isc__mem_createx2(size_t init_max_size, size_t target_size,
+ isc_memalloc_t memalloc, isc_memfree_t memfree, void *arg,
+ isc_mem_t **ctxp, unsigned int flags);
+ISC_MEMFUNC_SCOPE isc_result_t
+isc__mem_create(size_t init_max_size, size_t target_size, isc_mem_t **ctxp);
+ISC_MEMFUNC_SCOPE isc_result_t
+isc__mem_create2(size_t init_max_size, size_t target_size,
+ isc_mem_t **ctxp, unsigned int flags);
+ISC_MEMFUNC_SCOPE void
+isc__mem_attach(isc_mem_t *source, isc_mem_t **targetp);
+ISC_MEMFUNC_SCOPE void
+isc__mem_detach(isc_mem_t **ctxp);
+ISC_MEMFUNC_SCOPE void
+isc___mem_putanddetach(isc_mem_t **ctxp, void *ptr, size_t size FLARG);
+ISC_MEMFUNC_SCOPE void
+isc__mem_destroy(isc_mem_t **ctxp);
+ISC_MEMFUNC_SCOPE isc_result_t
+isc__mem_ondestroy(isc_mem_t *ctx, isc_task_t *task, isc_event_t **event);
+ISC_MEMFUNC_SCOPE void *
+isc___mem_get(isc_mem_t *ctx, size_t size FLARG);
+ISC_MEMFUNC_SCOPE void
+isc___mem_put(isc_mem_t *ctx, void *ptr, size_t size FLARG);
+ISC_MEMFUNC_SCOPE void
+isc__mem_stats(isc_mem_t *ctx, FILE *out);
+ISC_MEMFUNC_SCOPE void *
+isc___mem_allocate(isc_mem_t *ctx, size_t size FLARG);
+ISC_MEMFUNC_SCOPE void *
+isc___mem_reallocate(isc_mem_t *ctx, void *ptr, size_t size FLARG);
+ISC_MEMFUNC_SCOPE void
+isc___mem_free(isc_mem_t *ctx, void *ptr FLARG);
+ISC_MEMFUNC_SCOPE char *
+isc___mem_strdup(isc_mem_t *mctx, const char *s FLARG);
+ISC_MEMFUNC_SCOPE void
+isc__mem_setdestroycheck(isc_mem_t *ctx, isc_boolean_t flag);
+ISC_MEMFUNC_SCOPE void
+isc__mem_setquota(isc_mem_t *ctx, size_t quota);
+ISC_MEMFUNC_SCOPE size_t
+isc__mem_getquota(isc_mem_t *ctx);
+ISC_MEMFUNC_SCOPE size_t
+isc__mem_inuse(isc_mem_t *ctx);
+ISC_MEMFUNC_SCOPE isc_boolean_t
+isc__mem_isovermem(isc_mem_t *ctx);
+ISC_MEMFUNC_SCOPE void
+isc__mem_setwater(isc_mem_t *ctx, isc_mem_water_t water, void *water_arg,
+ size_t hiwater, size_t lowater);
+ISC_MEMFUNC_SCOPE void
+isc__mem_waterack(isc_mem_t *ctx0, int flag);
+ISC_MEMFUNC_SCOPE void
+isc__mem_setname(isc_mem_t *ctx, const char *name, void *tag);
+ISC_MEMFUNC_SCOPE const char *
+isc__mem_getname(isc_mem_t *ctx);
+ISC_MEMFUNC_SCOPE void *
+isc__mem_gettag(isc_mem_t *ctx);
+ISC_MEMFUNC_SCOPE isc_result_t
+isc__mempool_create(isc_mem_t *mctx, size_t size, isc_mempool_t **mpctxp);
+ISC_MEMFUNC_SCOPE void
+isc__mempool_setname(isc_mempool_t *mpctx, const char *name);
+ISC_MEMFUNC_SCOPE void
+isc__mempool_destroy(isc_mempool_t **mpctxp);
+ISC_MEMFUNC_SCOPE void
+isc__mempool_associatelock(isc_mempool_t *mpctx, isc_mutex_t *lock);
+ISC_MEMFUNC_SCOPE void *
+isc___mempool_get(isc_mempool_t *mpctx FLARG);
+ISC_MEMFUNC_SCOPE void
+isc___mempool_put(isc_mempool_t *mpctx, void *mem FLARG);
+ISC_MEMFUNC_SCOPE void
+isc__mempool_setfreemax(isc_mempool_t *mpctx, unsigned int limit);
+ISC_MEMFUNC_SCOPE unsigned int
+isc__mempool_getfreemax(isc_mempool_t *mpctx);
+ISC_MEMFUNC_SCOPE unsigned int
+isc__mempool_getfreecount(isc_mempool_t *mpctx);
+ISC_MEMFUNC_SCOPE void
+isc__mempool_setmaxalloc(isc_mempool_t *mpctx, unsigned int limit);
+ISC_MEMFUNC_SCOPE unsigned int
+isc__mempool_getmaxalloc(isc_mempool_t *mpctx);
+ISC_MEMFUNC_SCOPE unsigned int
+isc__mempool_getallocated(isc_mempool_t *mpctx);
+ISC_MEMFUNC_SCOPE void
+isc__mempool_setfillcount(isc_mempool_t *mpctx, unsigned int limit);
+ISC_MEMFUNC_SCOPE unsigned int
+isc__mempool_getfillcount(isc_mempool_t *mpctx);
+#ifdef BIND9
+ISC_MEMFUNC_SCOPE void
+isc__mem_printactive(isc_mem_t *ctx0, FILE *file);
+ISC_MEMFUNC_SCOPE void
+isc__mem_printallactive(FILE *file);
+ISC_MEMFUNC_SCOPE void
+isc__mem_checkdestroyed(FILE *file);
+ISC_MEMFUNC_SCOPE unsigned int
+isc__mem_references(isc_mem_t *ctx0);
+#endif
+
+static struct isc__memmethods {
+ isc_memmethods_t methods;
+
+ /*%
+ * The following are defined just for avoiding unused static functions.
+ */
+#ifndef BIND9
+ void *createx, *create, *create2, *ondestroy, *stats,
+ *setquota, *getquota, *setname, *getname, *gettag;
+#endif
+} memmethods = {
+ {
+ isc__mem_attach,
+ isc__mem_detach,
+ isc__mem_destroy,
+ isc___mem_get,
+ isc___mem_put,
+ isc___mem_putanddetach,
+ isc___mem_allocate,
+ isc___mem_reallocate,
+ isc___mem_strdup,
+ isc___mem_free,
+ isc__mem_setdestroycheck,
+ isc__mem_setwater,
+ isc__mem_waterack,
+ isc__mem_inuse,
+ isc__mem_isovermem,
+ isc__mempool_create
+ }
+#ifndef BIND9
+ ,
+ (void *)isc__mem_createx, (void *)isc__mem_create,
+ (void *)isc__mem_create2, (void *)isc__mem_ondestroy,
+ (void *)isc__mem_stats, (void *)isc__mem_setquota,
+ (void *)isc__mem_getquota, (void *)isc__mem_setname,
+ (void *)isc__mem_getname, (void *)isc__mem_gettag
+#endif
+};
+
+static struct isc__mempoolmethods {
+ isc_mempoolmethods_t methods;
+
+ /*%
+ * The following are defined just for avoiding unused static functions.
+ */
+#ifndef BIND9
+ void *getfreemax, *getfreecount, *getmaxalloc, *getfillcount;
+#endif
+} mempoolmethods = {
+ {
+ isc__mempool_destroy,
+ isc___mempool_get,
+ isc___mempool_put,
+ isc__mempool_getallocated,
+ isc__mempool_setmaxalloc,
+ isc__mempool_setfreemax,
+ isc__mempool_setname,
+ isc__mempool_associatelock,
+ isc__mempool_setfillcount
+ }
+#ifndef BIND9
+ ,
+ (void *)isc__mempool_getfreemax, (void *)isc__mempool_getfreecount,
+ (void *)isc__mempool_getmaxalloc, (void *)isc__mempool_getfillcount
+#endif
+};
/*!
* mctx must be locked.
*/
static inline void
-add_trace_entry(isc_mem_t *mctx, const void *ptr, unsigned int size
+add_trace_entry(isc__mem_t *mctx, const void *ptr, unsigned int size
FLARG)
{
debuglink_t *dl;
@@ -276,7 +453,7 @@ add_trace_entry(isc_mem_t *mctx, const void *ptr, unsigned int size
}
static inline void
-delete_trace_entry(isc_mem_t *mctx, const void *ptr, unsigned int size,
+delete_trace_entry(isc__mem_t *mctx, const void *ptr, unsigned int size,
const char *file, unsigned int line)
{
debuglink_t *dl;
@@ -347,7 +524,7 @@ quantize(size_t size) {
}
static inline isc_boolean_t
-more_basic_blocks(isc_mem_t *ctx) {
+more_basic_blocks(isc__mem_t *ctx) {
void *new;
unsigned char *curr, *next;
unsigned char *first, *last;
@@ -417,7 +594,7 @@ more_basic_blocks(isc_mem_t *ctx) {
}
static inline isc_boolean_t
-more_frags(isc_mem_t *ctx, size_t new_size) {
+more_frags(isc__mem_t *ctx, size_t new_size) {
int i, frags;
size_t total_size;
void *new;
@@ -479,7 +656,7 @@ more_frags(isc_mem_t *ctx, size_t new_size) {
}
static inline void *
-mem_getunlocked(isc_mem_t *ctx, size_t size) {
+mem_getunlocked(isc__mem_t *ctx, size_t size) {
size_t new_size = quantize(size);
void *ret;
@@ -560,7 +737,7 @@ check_overrun(void *mem, size_t size, size_t new_size) {
#endif
static inline void
-mem_putunlocked(isc_mem_t *ctx, void *mem, size_t size) {
+mem_putunlocked(isc__mem_t *ctx, void *mem, size_t size) {
size_t new_size = quantize(size);
if (size == ctx->max_size || new_size >= ctx->max_size) {
@@ -608,7 +785,7 @@ mem_putunlocked(isc_mem_t *ctx, void *mem, size_t size) {
* Perform a malloc, doing memory filling and overrun detection as necessary.
*/
static inline void *
-mem_get(isc_mem_t *ctx, size_t size) {
+mem_get(isc__mem_t *ctx, size_t size) {
char *ret;
#if ISC_MEM_CHECKOVERRUN
@@ -636,7 +813,7 @@ mem_get(isc_mem_t *ctx, size_t size) {
* Perform a free, doing memory filling and overrun detection as necessary.
*/
static inline void
-mem_put(isc_mem_t *ctx, void *mem, size_t size) {
+mem_put(isc__mem_t *ctx, void *mem, size_t size) {
#if ISC_MEM_CHECKOVERRUN
INSIST(((unsigned char *)mem)[size] == 0xbe);
#endif
@@ -652,7 +829,7 @@ mem_put(isc_mem_t *ctx, void *mem, size_t size) {
* Update internal counters after a memory get.
*/
static inline void
-mem_getstats(isc_mem_t *ctx, size_t size) {
+mem_getstats(isc__mem_t *ctx, size_t size) {
ctx->total += size;
ctx->inuse += size;
@@ -669,7 +846,7 @@ mem_getstats(isc_mem_t *ctx, size_t size) {
* Update internal counters after a memory put.
*/
static inline void
-mem_putstats(isc_mem_t *ctx, void *ptr, size_t size) {
+mem_putstats(isc__mem_t *ctx, void *ptr, size_t size) {
UNUSED(ptr);
INSIST(ctx->inuse >= size);
@@ -713,22 +890,22 @@ initialize_action(void) {
* Public.
*/
-isc_result_t
-isc_mem_createx(size_t init_max_size, size_t target_size,
- isc_memalloc_t memalloc, isc_memfree_t memfree, void *arg,
- isc_mem_t **ctxp)
+ISC_MEMFUNC_SCOPE isc_result_t
+isc__mem_createx(size_t init_max_size, size_t target_size,
+ isc_memalloc_t memalloc, isc_memfree_t memfree, void *arg,
+ isc_mem_t **ctxp)
{
- return (isc_mem_createx2(init_max_size, target_size, memalloc, memfree,
- arg, ctxp, ISC_MEMFLAG_DEFAULT));
+ return (isc__mem_createx2(init_max_size, target_size, memalloc, memfree,
+ arg, ctxp, ISC_MEMFLAG_DEFAULT));
}
-isc_result_t
-isc_mem_createx2(size_t init_max_size, size_t target_size,
- isc_memalloc_t memalloc, isc_memfree_t memfree, void *arg,
- isc_mem_t **ctxp, unsigned int flags)
+ISC_MEMFUNC_SCOPE isc_result_t
+isc__mem_createx2(size_t init_max_size, size_t target_size,
+ isc_memalloc_t memalloc, isc_memfree_t memfree, void *arg,
+ isc_mem_t **ctxp, unsigned int flags)
{
- isc_mem_t *ctx;
+ isc__mem_t *ctx;
isc_result_t result;
REQUIRE(ctxp != NULL && *ctxp == NULL);
@@ -769,7 +946,9 @@ isc_mem_createx2(size_t init_max_size, size_t target_size,
ctx->is_overmem = ISC_FALSE;
ctx->water = NULL;
ctx->water_arg = NULL;
- ctx->magic = MEM_MAGIC;
+ ctx->common.impmagic = MEM_MAGIC;
+ ctx->common.magic = ISCAPI_MCTX_MAGIC;
+ ctx->common.methods = (isc_memmethods_t *)&memmethods;
isc_ondestroy_init(&ctx->ondestroy);
ctx->memalloc = memalloc;
ctx->memfree = memfree;
@@ -834,7 +1013,7 @@ isc_mem_createx2(size_t init_max_size, size_t target_size,
ISC_LIST_INITANDAPPEND(contexts, ctx, link);
UNLOCK(&lock);
- *ctxp = ctx;
+ *ctxp = (isc_mem_t *)ctx;
return (ISC_R_SUCCESS);
error:
@@ -855,26 +1034,24 @@ isc_mem_createx2(size_t init_max_size, size_t target_size,
return (result);
}
-isc_result_t
-isc_mem_create(size_t init_max_size, size_t target_size,
- isc_mem_t **ctxp)
-{
- return (isc_mem_createx2(init_max_size, target_size,
- default_memalloc, default_memfree, NULL,
- ctxp, ISC_MEMFLAG_DEFAULT));
+ISC_MEMFUNC_SCOPE isc_result_t
+isc__mem_create(size_t init_max_size, size_t target_size, isc_mem_t **ctxp) {
+ return (isc__mem_createx2(init_max_size, target_size,
+ default_memalloc, default_memfree, NULL,
+ ctxp, ISC_MEMFLAG_DEFAULT));
}
-isc_result_t
-isc_mem_create2(size_t init_max_size, size_t target_size,
- isc_mem_t **ctxp, unsigned int flags)
+ISC_MEMFUNC_SCOPE isc_result_t
+isc__mem_create2(size_t init_max_size, size_t target_size,
+ isc_mem_t **ctxp, unsigned int flags)
{
- return (isc_mem_createx2(init_max_size, target_size,
- default_memalloc, default_memfree, NULL,
- ctxp, flags));
+ return (isc__mem_createx2(init_max_size, target_size,
+ default_memalloc, default_memfree, NULL,
+ ctxp, flags));
}
static void
-destroy(isc_mem_t *ctx) {
+destroy(isc__mem_t *ctx) {
unsigned int i;
isc_ondestroy_t ondest;
@@ -883,7 +1060,8 @@ destroy(isc_mem_t *ctx) {
totallost += ctx->inuse;
UNLOCK(&lock);
- ctx->magic = 0;
+ ctx->common.impmagic = 0;
+ ctx->common.magic = 0;
INSIST(ISC_LIST_EMPTY(ctx->pools));
@@ -941,8 +1119,10 @@ destroy(isc_mem_t *ctx) {
isc_ondestroy_notify(&ondest, ctx);
}
-void
-isc_mem_attach(isc_mem_t *source, isc_mem_t **targetp) {
+ISC_MEMFUNC_SCOPE void
+isc__mem_attach(isc_mem_t *source0, isc_mem_t **targetp) {
+ isc__mem_t *source = (isc__mem_t *)source0;
+
REQUIRE(VALID_CONTEXT(source));
REQUIRE(targetp != NULL && *targetp == NULL);
@@ -950,16 +1130,16 @@ isc_mem_attach(isc_mem_t *source, isc_mem_t **targetp) {
source->references++;
MCTXUNLOCK(source, &source->lock);
- *targetp = source;
+ *targetp = (isc_mem_t *)source;
}
-void
-isc_mem_detach(isc_mem_t **ctxp) {
- isc_mem_t *ctx;
+ISC_MEMFUNC_SCOPE void
+isc__mem_detach(isc_mem_t **ctxp) {
+ isc__mem_t *ctx;
isc_boolean_t want_destroy = ISC_FALSE;
REQUIRE(ctxp != NULL);
- ctx = *ctxp;
+ ctx = (isc__mem_t *)*ctxp;
REQUIRE(VALID_CONTEXT(ctx));
MCTXLOCK(ctx, &ctx->lock);
@@ -985,15 +1165,15 @@ isc_mem_detach(isc_mem_t **ctxp) {
* isc_mem_detach(&mctx);
*/
-void
-isc__mem_putanddetach(isc_mem_t **ctxp, void *ptr, size_t size FLARG) {
- isc_mem_t *ctx;
+ISC_MEMFUNC_SCOPE void
+isc___mem_putanddetach(isc_mem_t **ctxp, void *ptr, size_t size FLARG) {
+ isc__mem_t *ctx;
isc_boolean_t want_destroy = ISC_FALSE;
size_info *si;
size_t oldsize;
REQUIRE(ctxp != NULL);
- ctx = *ctxp;
+ ctx = (isc__mem_t *)*ctxp;
REQUIRE(VALID_CONTEXT(ctx));
REQUIRE(ptr != NULL);
@@ -1011,7 +1191,7 @@ isc__mem_putanddetach(isc_mem_t **ctxp, void *ptr, size_t size FLARG) {
oldsize -= ALIGNMENT_SIZE;
INSIST(oldsize == size);
}
- isc__mem_free(ctx, ptr FLARG_PASS);
+ isc_mem_free((isc_mem_t *)ctx, ptr);
MCTXLOCK(ctx, &ctx->lock);
ctx->references--;
@@ -1045,9 +1225,9 @@ isc__mem_putanddetach(isc_mem_t **ctxp, void *ptr, size_t size FLARG) {
destroy(ctx);
}
-void
-isc_mem_destroy(isc_mem_t **ctxp) {
- isc_mem_t *ctx;
+ISC_MEMFUNC_SCOPE void
+isc__mem_destroy(isc_mem_t **ctxp) {
+ isc__mem_t *ctx;
/*
* This routine provides legacy support for callers who use mctxs
@@ -1055,7 +1235,7 @@ isc_mem_destroy(isc_mem_t **ctxp) {
*/
REQUIRE(ctxp != NULL);
- ctx = *ctxp;
+ ctx = (isc__mem_t *)*ctxp;
REQUIRE(VALID_CONTEXT(ctx));
MCTXLOCK(ctx, &ctx->lock);
@@ -1072,8 +1252,9 @@ isc_mem_destroy(isc_mem_t **ctxp) {
*ctxp = NULL;
}
-isc_result_t
-isc_mem_ondestroy(isc_mem_t *ctx, isc_task_t *task, isc_event_t **event) {
+ISC_MEMFUNC_SCOPE isc_result_t
+isc__mem_ondestroy(isc_mem_t *ctx0, isc_task_t *task, isc_event_t **event) {
+ isc__mem_t *ctx = (isc__mem_t *)ctx0;
isc_result_t res;
MCTXLOCK(ctx, &ctx->lock);
@@ -1083,16 +1264,16 @@ isc_mem_ondestroy(isc_mem_t *ctx, isc_task_t *task, isc_event_t **event) {
return (res);
}
-
-void *
-isc__mem_get(isc_mem_t *ctx, size_t size FLARG) {
+ISC_MEMFUNC_SCOPE void *
+isc___mem_get(isc_mem_t *ctx0, size_t size FLARG) {
+ isc__mem_t *ctx = (isc__mem_t *)ctx0;
void *ptr;
isc_boolean_t call_water = ISC_FALSE;
REQUIRE(VALID_CONTEXT(ctx));
if ((isc_mem_debugging & (ISC_MEM_DEBUGSIZE|ISC_MEM_DEBUGCTX)) != 0)
- return (isc__mem_allocate(ctx, size FLARG_PASS));
+ return (isc__mem_allocate(ctx0, size FLARG_PASS));
if ((ctx->flags & ISC_MEMFLAG_INTERNAL) != 0) {
MCTXLOCK(ctx, &ctx->lock);
@@ -1128,9 +1309,9 @@ isc__mem_get(isc_mem_t *ctx, size_t size FLARG) {
return (ptr);
}
-void
-isc__mem_put(isc_mem_t *ctx, void *ptr, size_t size FLARG)
-{
+ISC_MEMFUNC_SCOPE void
+isc___mem_put(isc_mem_t *ctx0, void *ptr, size_t size FLARG) {
+ isc__mem_t *ctx = (isc__mem_t *)ctx0;
isc_boolean_t call_water = ISC_FALSE;
size_info *si;
size_t oldsize;
@@ -1146,7 +1327,7 @@ isc__mem_put(isc_mem_t *ctx, void *ptr, size_t size FLARG)
oldsize -= ALIGNMENT_SIZE;
INSIST(oldsize == size);
}
- isc__mem_free(ctx, ptr FLARG_PASS);
+ isc_mem_free((isc_mem_t *)ctx, ptr);
return;
}
@@ -1181,8 +1362,10 @@ isc__mem_put(isc_mem_t *ctx, void *ptr, size_t size FLARG)
(ctx->water)(ctx->water_arg, ISC_MEM_LOWATER);
}
-void
-isc_mem_waterack(isc_mem_t *ctx, int flag) {
+ISC_MEMFUNC_SCOPE void
+isc__mem_waterack(isc_mem_t *ctx0, int flag) {
+ isc__mem_t *ctx = (isc__mem_t *)ctx0;
+
REQUIRE(VALID_CONTEXT(ctx));
MCTXLOCK(ctx, &ctx->lock);
@@ -1195,7 +1378,7 @@ isc_mem_waterack(isc_mem_t *ctx, int flag) {
#if ISC_MEM_TRACKLINES
static void
-print_active(isc_mem_t *mctx, FILE *out) {
+print_active(isc__mem_t *mctx, FILE *out) {
if (mctx->debuglist != NULL) {
debuglink_t *dl;
unsigned int i, j;
@@ -1237,11 +1420,12 @@ print_active(isc_mem_t *mctx, FILE *out) {
/*
* Print the stats[] on the stream "out" with suitable formatting.
*/
-void
-isc_mem_stats(isc_mem_t *ctx, FILE *out) {
+ISC_MEMFUNC_SCOPE void
+isc__mem_stats(isc_mem_t *ctx0, FILE *out) {
+ isc__mem_t *ctx = (isc__mem_t *)ctx0;
size_t i;
const struct stats *s;
- const isc_mempool_t *pool;
+ const isc__mempool_t *pool;
REQUIRE(VALID_CONTEXT(ctx));
MCTXLOCK(ctx, &ctx->lock);
@@ -1314,7 +1498,8 @@ isc_mem_stats(isc_mem_t *ctx, FILE *out) {
*/
static void *
-isc__mem_allocateunlocked(isc_mem_t *ctx, size_t size) {
+isc__mem_allocateunlocked(isc_mem_t *ctx0, size_t size) {
+ isc__mem_t *ctx = (isc__mem_t *)ctx0;
size_info *si;
size += ALIGNMENT_SIZE;
@@ -1336,8 +1521,9 @@ isc__mem_allocateunlocked(isc_mem_t *ctx, size_t size) {
return (&si[1]);
}
-void *
-isc__mem_allocate(isc_mem_t *ctx, size_t size FLARG) {
+ISC_MEMFUNC_SCOPE void *
+isc___mem_allocate(isc_mem_t *ctx0, size_t size FLARG) {
+ isc__mem_t *ctx = (isc__mem_t *)ctx0;
size_info *si;
isc_boolean_t call_water = ISC_FALSE;
@@ -1345,9 +1531,9 @@ isc__mem_allocate(isc_mem_t *ctx, size_t size FLARG) {
if ((ctx->flags & ISC_MEMFLAG_INTERNAL) != 0) {
MCTXLOCK(ctx, &ctx->lock);
- si = isc__mem_allocateunlocked(ctx, size);
+ si = isc__mem_allocateunlocked((isc_mem_t *)ctx, size);
} else {
- si = isc__mem_allocateunlocked(ctx, size);
+ si = isc__mem_allocateunlocked((isc_mem_t *)ctx, size);
MCTXLOCK(ctx, &ctx->lock);
if (si != NULL)
mem_getstats(ctx, si[-1].u.size);
@@ -1381,8 +1567,9 @@ isc__mem_allocate(isc_mem_t *ctx, size_t size FLARG) {
return (si);
}
-void *
-isc__mem_reallocate(isc_mem_t *ctx, void *ptr, size_t size FLARG) {
+ISC_MEMFUNC_SCOPE void *
+isc___mem_reallocate(isc_mem_t *ctx0, void *ptr, size_t size FLARG) {
+ isc__mem_t *ctx = (isc__mem_t *)ctx0;
void *new_ptr = NULL;
size_t oldsize, copysize;
@@ -1400,23 +1587,24 @@ isc__mem_reallocate(isc_mem_t *ctx, void *ptr, size_t size FLARG) {
* NULL if allocation fails or doesn't happen.
*/
if (size > 0U) {
- new_ptr = isc__mem_allocate(ctx, size FLARG_PASS);
+ new_ptr = isc__mem_allocate(ctx0, size FLARG_PASS);
if (new_ptr != NULL && ptr != NULL) {
oldsize = (((size_info *)ptr)[-1]).u.size;
INSIST(oldsize >= ALIGNMENT_SIZE);
oldsize -= ALIGNMENT_SIZE;
copysize = oldsize > size ? size : oldsize;
memcpy(new_ptr, ptr, copysize);
- isc__mem_free(ctx, ptr FLARG_PASS);
+ isc__mem_free(ctx0, ptr FLARG_PASS);
}
} else if (ptr != NULL)
- isc__mem_free(ctx, ptr FLARG_PASS);
+ isc__mem_free(ctx0, ptr FLARG_PASS);
return (new_ptr);
}
-void
-isc__mem_free(isc_mem_t *ctx, void *ptr FLARG) {
+ISC_MEMFUNC_SCOPE void
+isc___mem_free(isc_mem_t *ctx0, void *ptr FLARG) {
+ isc__mem_t *ctx = (isc__mem_t *)ctx0;
size_info *si;
size_t size;
isc_boolean_t call_water= ISC_FALSE;
@@ -1472,8 +1660,9 @@ isc__mem_free(isc_mem_t *ctx, void *ptr FLARG) {
* Other useful things.
*/
-char *
-isc__mem_strdup(isc_mem_t *mctx, const char *s FLARG) {
+ISC_MEMFUNC_SCOPE char *
+isc___mem_strdup(isc_mem_t *mctx0, const char *s FLARG) {
+ isc__mem_t *mctx = (isc__mem_t *)mctx0;
size_t len;
char *ns;
@@ -1482,7 +1671,7 @@ isc__mem_strdup(isc_mem_t *mctx, const char *s FLARG) {
len = strlen(s);
- ns = isc__mem_allocate(mctx, len + 1 FLARG_PASS);
+ ns = isc___mem_allocate((isc_mem_t *)mctx, len + 1 FLARG_PASS);
if (ns != NULL)
strncpy(ns, s, len + 1);
@@ -1490,8 +1679,10 @@ isc__mem_strdup(isc_mem_t *mctx, const char *s FLARG) {
return (ns);
}
-void
-isc_mem_setdestroycheck(isc_mem_t *ctx, isc_boolean_t flag) {
+ISC_MEMFUNC_SCOPE void
+isc__mem_setdestroycheck(isc_mem_t *ctx0, isc_boolean_t flag) {
+ isc__mem_t *ctx = (isc__mem_t *)ctx0;
+
REQUIRE(VALID_CONTEXT(ctx));
MCTXLOCK(ctx, &ctx->lock);
@@ -1504,8 +1695,10 @@ isc_mem_setdestroycheck(isc_mem_t *ctx, isc_boolean_t flag) {
* Quotas
*/
-void
-isc_mem_setquota(isc_mem_t *ctx, size_t quota) {
+ISC_MEMFUNC_SCOPE void
+isc__mem_setquota(isc_mem_t *ctx0, size_t quota) {
+ isc__mem_t *ctx = (isc__mem_t *)ctx0;
+
REQUIRE(VALID_CONTEXT(ctx));
MCTXLOCK(ctx, &ctx->lock);
@@ -1514,8 +1707,9 @@ isc_mem_setquota(isc_mem_t *ctx, size_t quota) {
MCTXUNLOCK(ctx, &ctx->lock);
}
-size_t
-isc_mem_getquota(isc_mem_t *ctx) {
+ISC_MEMFUNC_SCOPE size_t
+isc__mem_getquota(isc_mem_t *ctx0) {
+ isc__mem_t *ctx = (isc__mem_t *)ctx0;
size_t quota;
REQUIRE(VALID_CONTEXT(ctx));
@@ -1528,8 +1722,9 @@ isc_mem_getquota(isc_mem_t *ctx) {
return (quota);
}
-size_t
-isc_mem_inuse(isc_mem_t *ctx) {
+ISC_MEMFUNC_SCOPE size_t
+isc__mem_inuse(isc_mem_t *ctx0) {
+ isc__mem_t *ctx = (isc__mem_t *)ctx0;
size_t inuse;
REQUIRE(VALID_CONTEXT(ctx));
@@ -1542,10 +1737,11 @@ isc_mem_inuse(isc_mem_t *ctx) {
return (inuse);
}
-void
-isc_mem_setwater(isc_mem_t *ctx, isc_mem_water_t water, void *water_arg,
+ISC_MEMFUNC_SCOPE void
+isc__mem_setwater(isc_mem_t *ctx0, isc_mem_water_t water, void *water_arg,
size_t hiwater, size_t lowater)
{
+ isc__mem_t *ctx = (isc__mem_t *)ctx0;
isc_boolean_t callwater = ISC_FALSE;
isc_mem_water_t oldwater;
void *oldwater_arg;
@@ -1580,8 +1776,10 @@ isc_mem_setwater(isc_mem_t *ctx, isc_mem_water_t water, void *water_arg,
(oldwater)(oldwater_arg, ISC_MEM_LOWATER);
}
-isc_boolean_t
-isc_mem_isovermem(isc_mem_t *ctx) {
+ISC_MEMFUNC_SCOPE isc_boolean_t
+isc__mem_isovermem(isc_mem_t *ctx0) {
+ isc__mem_t *ctx = (isc__mem_t *)ctx0;
+
REQUIRE(VALID_CONTEXT(ctx));
/*
@@ -1592,8 +1790,10 @@ isc_mem_isovermem(isc_mem_t *ctx) {
return (ctx->is_overmem);
}
-void
-isc_mem_setname(isc_mem_t *ctx, const char *name, void *tag) {
+ISC_MEMFUNC_SCOPE void
+isc__mem_setname(isc_mem_t *ctx0, const char *name, void *tag) {
+ isc__mem_t *ctx = (isc__mem_t *)ctx0;
+
REQUIRE(VALID_CONTEXT(ctx));
LOCK(&ctx->lock);
@@ -1603,15 +1803,19 @@ isc_mem_setname(isc_mem_t *ctx, const char *name, void *tag) {
UNLOCK(&ctx->lock);
}
-const char *
-isc_mem_getname(isc_mem_t *ctx) {
+ISC_MEMFUNC_SCOPE const char *
+isc__mem_getname(isc_mem_t *ctx0) {
+ isc__mem_t *ctx = (isc__mem_t *)ctx0;
+
REQUIRE(VALID_CONTEXT(ctx));
return (ctx->name);
}
-void *
-isc_mem_gettag(isc_mem_t *ctx) {
+ISC_MEMFUNC_SCOPE void *
+isc__mem_gettag(isc_mem_t *ctx0) {
+ isc__mem_t *ctx = (isc__mem_t *)ctx0;
+
REQUIRE(VALID_CONTEXT(ctx));
return (ctx->tag);
@@ -1621,9 +1825,10 @@ isc_mem_gettag(isc_mem_t *ctx) {
* Memory pool stuff
*/
-isc_result_t
-isc_mempool_create(isc_mem_t *mctx, size_t size, isc_mempool_t **mpctxp) {
- isc_mempool_t *mpctx;
+ISC_MEMFUNC_SCOPE isc_result_t
+isc__mempool_create(isc_mem_t *mctx0, size_t size, isc_mempool_t **mpctxp) {
+ isc__mem_t *mctx = (isc__mem_t *)mctx0;
+ isc__mempool_t *mpctx;
REQUIRE(VALID_CONTEXT(mctx));
REQUIRE(size > 0U);
@@ -1633,11 +1838,13 @@ isc_mempool_create(isc_mem_t *mctx, size_t size, isc_mempool_t **mpctxp) {
* Allocate space for this pool, initialize values, and if all works
* well, attach to the memory context.
*/
- mpctx = isc_mem_get(mctx, sizeof(isc_mempool_t));
+ mpctx = isc_mem_get((isc_mem_t *)mctx, sizeof(isc__mempool_t));
if (mpctx == NULL)
return (ISC_R_NOMEMORY);
- mpctx->magic = MEMPOOL_MAGIC;
+ mpctx->common.methods = (isc_mempoolmethods_t *)&mempoolmethods;
+ mpctx->common.impmagic = MEMPOOL_MAGIC;
+ mpctx->common.magic = ISCAPI_MPOOL_MAGIC;
mpctx->lock = NULL;
mpctx->mctx = mctx;
mpctx->size = size;
@@ -1652,7 +1859,7 @@ isc_mempool_create(isc_mem_t *mctx, size_t size, isc_mempool_t **mpctxp) {
#endif
mpctx->items = NULL;
- *mpctxp = mpctx;
+ *mpctxp = (isc_mempool_t *)mpctx;
MCTXLOCK(mctx, &mctx->lock);
ISC_LIST_INITANDAPPEND(mctx->pools, mpctx, link);
@@ -1662,9 +1869,12 @@ isc_mempool_create(isc_mem_t *mctx, size_t size, isc_mempool_t **mpctxp) {
return (ISC_R_SUCCESS);
}
-void
-isc_mempool_setname(isc_mempool_t *mpctx, const char *name) {
+ISC_MEMFUNC_SCOPE void
+isc__mempool_setname(isc_mempool_t *mpctx0, const char *name) {
+ isc__mempool_t *mpctx = (isc__mempool_t *)mpctx0;
+
REQUIRE(name != NULL);
+ REQUIRE(VALID_MEMPOOL(mpctx));
#if ISC_MEMPOOL_NAMES
if (mpctx->lock != NULL)
@@ -1681,20 +1891,20 @@ isc_mempool_setname(isc_mempool_t *mpctx, const char *name) {
#endif
}
-void
-isc_mempool_destroy(isc_mempool_t **mpctxp) {
- isc_mempool_t *mpctx;
- isc_mem_t *mctx;
+ISC_MEMFUNC_SCOPE void
+isc__mempool_destroy(isc_mempool_t **mpctxp) {
+ isc__mempool_t *mpctx;
+ isc__mem_t *mctx;
isc_mutex_t *lock;
element *item;
REQUIRE(mpctxp != NULL);
- mpctx = *mpctxp;
+ mpctx = (isc__mempool_t *)*mpctxp;
REQUIRE(VALID_MEMPOOL(mpctx));
#if ISC_MEMPOOL_NAMES
if (mpctx->allocated > 0)
UNEXPECTED_ERROR(__FILE__, __LINE__,
- "isc_mempool_destroy(): mempool %s "
+ "isc__mempool_destroy(): mempool %s "
"leaked memory",
mpctx->name);
#endif
@@ -1734,9 +1944,10 @@ isc_mempool_destroy(isc_mempool_t **mpctxp) {
mctx->poolcnt--;
MCTXUNLOCK(mctx, &mctx->lock);
- mpctx->magic = 0;
+ mpctx->common.impmagic = 0;
+ mpctx->common.magic = 0;
- isc_mem_put(mpctx->mctx, mpctx, sizeof(isc_mempool_t));
+ isc_mem_put((isc_mem_t *)mpctx->mctx, mpctx, sizeof(isc__mempool_t));
if (lock != NULL)
UNLOCK(lock);
@@ -1744,8 +1955,10 @@ isc_mempool_destroy(isc_mempool_t **mpctxp) {
*mpctxp = NULL;
}
-void
-isc_mempool_associatelock(isc_mempool_t *mpctx, isc_mutex_t *lock) {
+ISC_MEMFUNC_SCOPE void
+isc__mempool_associatelock(isc_mempool_t *mpctx0, isc_mutex_t *lock) {
+ isc__mempool_t *mpctx = (isc__mempool_t *)mpctx0;
+
REQUIRE(VALID_MEMPOOL(mpctx));
REQUIRE(mpctx->lock == NULL);
REQUIRE(lock != NULL);
@@ -1753,10 +1966,11 @@ isc_mempool_associatelock(isc_mempool_t *mpctx, isc_mutex_t *lock) {
mpctx->lock = lock;
}
-void *
-isc__mempool_get(isc_mempool_t *mpctx FLARG) {
+ISC_MEMFUNC_SCOPE void *
+isc___mempool_get(isc_mempool_t *mpctx0 FLARG) {
+ isc__mempool_t *mpctx = (isc__mempool_t *)mpctx0;
element *item;
- isc_mem_t *mctx;
+ isc__mem_t *mctx;
unsigned int i;
REQUIRE(VALID_MEMPOOL(mpctx));
@@ -1835,9 +2049,10 @@ isc__mempool_get(isc_mempool_t *mpctx FLARG) {
return (item);
}
-void
-isc__mempool_put(isc_mempool_t *mpctx, void *mem FLARG) {
- isc_mem_t *mctx;
+ISC_MEMFUNC_SCOPE void
+isc___mempool_put(isc_mempool_t *mpctx0, void *mem FLARG) {
+ isc__mempool_t *mpctx = (isc__mempool_t *)mpctx0;
+ isc__mem_t *mctx;
element *item;
REQUIRE(VALID_MEMPOOL(mpctx));
@@ -1892,8 +2107,10 @@ isc__mempool_put(isc_mempool_t *mpctx, void *mem FLARG) {
* Quotas
*/
-void
-isc_mempool_setfreemax(isc_mempool_t *mpctx, unsigned int limit) {
+ISC_MEMFUNC_SCOPE void
+isc__mempool_setfreemax(isc_mempool_t *mpctx0, unsigned int limit) {
+ isc__mempool_t *mpctx = (isc__mempool_t *)mpctx0;
+
REQUIRE(VALID_MEMPOOL(mpctx));
if (mpctx->lock != NULL)
@@ -1905,8 +2122,9 @@ isc_mempool_setfreemax(isc_mempool_t *mpctx, unsigned int limit) {
UNLOCK(mpctx->lock);
}
-unsigned int
-isc_mempool_getfreemax(isc_mempool_t *mpctx) {
+ISC_MEMFUNC_SCOPE unsigned int
+isc__mempool_getfreemax(isc_mempool_t *mpctx0) {
+ isc__mempool_t *mpctx = (isc__mempool_t *)mpctx0;
unsigned int freemax;
REQUIRE(VALID_MEMPOOL(mpctx));
@@ -1922,8 +2140,9 @@ isc_mempool_getfreemax(isc_mempool_t *mpctx) {
return (freemax);
}
-unsigned int
-isc_mempool_getfreecount(isc_mempool_t *mpctx) {
+ISC_MEMFUNC_SCOPE unsigned int
+isc__mempool_getfreecount(isc_mempool_t *mpctx0) {
+ isc__mempool_t *mpctx = (isc__mempool_t *)mpctx0;
unsigned int freecount;
REQUIRE(VALID_MEMPOOL(mpctx));
@@ -1939,8 +2158,10 @@ isc_mempool_getfreecount(isc_mempool_t *mpctx) {
return (freecount);
}
-void
-isc_mempool_setmaxalloc(isc_mempool_t *mpctx, unsigned int limit) {
+ISC_MEMFUNC_SCOPE void
+isc__mempool_setmaxalloc(isc_mempool_t *mpctx0, unsigned int limit) {
+ isc__mempool_t *mpctx = (isc__mempool_t *)mpctx0;
+
REQUIRE(limit > 0);
REQUIRE(VALID_MEMPOOL(mpctx));
@@ -1954,8 +2175,9 @@ isc_mempool_setmaxalloc(isc_mempool_t *mpctx, unsigned int limit) {
UNLOCK(mpctx->lock);
}
-unsigned int
-isc_mempool_getmaxalloc(isc_mempool_t *mpctx) {
+ISC_MEMFUNC_SCOPE unsigned int
+isc__mempool_getmaxalloc(isc_mempool_t *mpctx0) {
+ isc__mempool_t *mpctx = (isc__mempool_t *)mpctx0;
unsigned int maxalloc;
REQUIRE(VALID_MEMPOOL(mpctx));
@@ -1971,8 +2193,9 @@ isc_mempool_getmaxalloc(isc_mempool_t *mpctx) {
return (maxalloc);
}
-unsigned int
-isc_mempool_getallocated(isc_mempool_t *mpctx) {
+ISC_MEMFUNC_SCOPE unsigned int
+isc__mempool_getallocated(isc_mempool_t *mpctx0) {
+ isc__mempool_t *mpctx = (isc__mempool_t *)mpctx0;
unsigned int allocated;
REQUIRE(VALID_MEMPOOL(mpctx));
@@ -1988,8 +2211,10 @@ isc_mempool_getallocated(isc_mempool_t *mpctx) {
return (allocated);
}
-void
-isc_mempool_setfillcount(isc_mempool_t *mpctx, unsigned int limit) {
+ISC_MEMFUNC_SCOPE void
+isc__mempool_setfillcount(isc_mempool_t *mpctx0, unsigned int limit) {
+ isc__mempool_t *mpctx = (isc__mempool_t *)mpctx0;
+
REQUIRE(limit > 0);
REQUIRE(VALID_MEMPOOL(mpctx));
@@ -2002,8 +2227,10 @@ isc_mempool_setfillcount(isc_mempool_t *mpctx, unsigned int limit) {
UNLOCK(mpctx->lock);
}
-unsigned int
-isc_mempool_getfillcount(isc_mempool_t *mpctx) {
+ISC_MEMFUNC_SCOPE unsigned int
+isc__mempool_getfillcount(isc_mempool_t *mpctx0) {
+ isc__mempool_t *mpctx = (isc__mempool_t *)mpctx0;
+
unsigned int fillcount;
REQUIRE(VALID_MEMPOOL(mpctx));
@@ -2019,8 +2246,17 @@ isc_mempool_getfillcount(isc_mempool_t *mpctx) {
return (fillcount);
}
-void
-isc_mem_printactive(isc_mem_t *ctx, FILE *file) {
+#ifdef USE_MEMIMPREGISTER
+isc_result_t
+isc__mem_register() {
+ return (isc_mem_register(isc__mem_create2));
+}
+#endif
+
+#ifdef BIND9
+ISC_MEMFUNC_SCOPE void
+isc__mem_printactive(isc_mem_t *ctx0, FILE *file) {
+ isc__mem_t *ctx = (isc__mem_t *)ctx0;
REQUIRE(VALID_CONTEXT(ctx));
REQUIRE(file != NULL);
@@ -2033,12 +2269,12 @@ isc_mem_printactive(isc_mem_t *ctx, FILE *file) {
#endif
}
-void
-isc_mem_printallactive(FILE *file) {
+ISC_MEMFUNC_SCOPE void
+isc__mem_printallactive(FILE *file) {
#if !ISC_MEM_TRACKLINES
UNUSED(file);
#else
- isc_mem_t *ctx;
+ isc__mem_t *ctx;
RUNTIME_CHECK(isc_once_do(&once, initialize_action) == ISC_R_SUCCESS);
@@ -2053,15 +2289,15 @@ isc_mem_printallactive(FILE *file) {
#endif
}
-void
-isc_mem_checkdestroyed(FILE *file) {
+ISC_MEMFUNC_SCOPE void
+isc__mem_checkdestroyed(FILE *file) {
RUNTIME_CHECK(isc_once_do(&once, initialize_action) == ISC_R_SUCCESS);
LOCK(&lock);
if (!ISC_LIST_EMPTY(contexts)) {
#if ISC_MEM_TRACKLINES
- isc_mem_t *ctx;
+ isc__mem_t *ctx;
for (ctx = ISC_LIST_HEAD(contexts);
ctx != NULL;
@@ -2076,9 +2312,11 @@ isc_mem_checkdestroyed(FILE *file) {
UNLOCK(&lock);
}
-unsigned int
-isc_mem_references(isc_mem_t *ctx) {
+ISC_MEMFUNC_SCOPE unsigned int
+isc_mem_references(isc_mem_t *ctx0) {
+ isc__mem_t *ctx = (isc__mem_t *)ctx0;
unsigned int references;
+
REQUIRE(VALID_CONTEXT(ctx));
MCTXLOCK(ctx, &ctx->lock);
@@ -2098,7 +2336,7 @@ typedef struct summarystat {
} summarystat_t;
static void
-renderctx(isc_mem_t *ctx, summarystat_t *summary, xmlTextWriterPtr writer) {
+renderctx(isc__mem_t *ctx, summarystat_t *summary, xmlTextWriterPtr writer) {
REQUIRE(VALID_CONTEXT(ctx));
xmlTextWriterStartElement(writer, ISC_XMLCHAR "context");
@@ -2184,7 +2422,7 @@ renderctx(isc_mem_t *ctx, summarystat_t *summary, xmlTextWriterPtr writer) {
void
isc_mem_renderxml(xmlTextWriterPtr writer) {
- isc_mem_t *ctx;
+ isc__mem_t *ctx;
summarystat_t summary;
isc_uint64_t lost;
@@ -2236,3 +2474,4 @@ isc_mem_renderxml(xmlTextWriterPtr writer) {
}
#endif /* HAVE_LIBXML2 */
+#endif /* BIND9 */
diff --git a/contrib/bind9/lib/isc/mem_api.c b/contrib/bind9/lib/isc/mem_api.c
new file mode 100644
index 0000000..638efcd
--- /dev/null
+++ b/contrib/bind9/lib/isc/mem_api.c
@@ -0,0 +1,303 @@
+/*
+ * Copyright (C) 2009, 2010 Internet Systems Consortium, Inc. ("ISC")
+ *
+ * Permission to use, copy, modify, and/or 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 ISC DISCLAIMS ALL WARRANTIES WITH
+ * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+ * AND FITNESS. IN NO EVENT SHALL ISC 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.
+ */
+
+/* $Id: mem_api.c,v 1.8 2010-08-12 21:30:26 jinmei Exp $ */
+
+#include <config.h>
+
+#include <isc/magic.h>
+#include <isc/mem.h>
+#include <isc/once.h>
+#include <isc/util.h>
+
+#if ISC_MEM_TRACKLINES
+#define FLARG_PASS , file, line
+#define FLARG , const char *file, unsigned int line
+#else
+#define FLARG_PASS
+#define FLARG
+#endif
+
+static isc_mutex_t createlock;
+static isc_once_t once = ISC_ONCE_INIT;
+static isc_memcreatefunc_t mem_createfunc = NULL;
+
+static void
+initialize(void) {
+ RUNTIME_CHECK(isc_mutex_init(&createlock) == ISC_R_SUCCESS);
+}
+
+isc_result_t
+isc_mem_register(isc_memcreatefunc_t createfunc) {
+ isc_result_t result = ISC_R_SUCCESS;
+
+ RUNTIME_CHECK(isc_once_do(&once, initialize) == ISC_R_SUCCESS);
+
+ LOCK(&createlock);
+ if (mem_createfunc == NULL)
+ mem_createfunc = createfunc;
+ else
+ result = ISC_R_EXISTS;
+ UNLOCK(&createlock);
+
+ return (result);
+}
+
+isc_result_t
+isc_mem_create(size_t init_max_size, size_t target_size, isc_mem_t **mctxp) {
+ isc_result_t result;
+
+ LOCK(&createlock);
+
+ REQUIRE(mem_createfunc != NULL);
+ result = (*mem_createfunc)(init_max_size, target_size, mctxp,
+ ISC_MEMFLAG_DEFAULT);
+
+ UNLOCK(&createlock);
+
+ return (result);
+}
+
+isc_result_t
+isc_mem_create2(size_t init_max_size, size_t target_size, isc_mem_t **mctxp,
+ unsigned int flags)
+{
+ isc_result_t result;
+
+ LOCK(&createlock);
+
+ REQUIRE(mem_createfunc != NULL);
+ result = (*mem_createfunc)(init_max_size, target_size, mctxp, flags);
+
+ UNLOCK(&createlock);
+
+ return (result);
+}
+
+void
+isc_mem_attach(isc_mem_t *source, isc_mem_t **targetp) {
+ REQUIRE(ISCAPI_MCTX_VALID(source));
+ REQUIRE(targetp != NULL && *targetp == NULL);
+
+ source->methods->attach(source, targetp);
+
+ ENSURE(*targetp == source);
+}
+
+void
+isc_mem_detach(isc_mem_t **mctxp) {
+ REQUIRE(mctxp != NULL && ISCAPI_MCTX_VALID(*mctxp));
+
+ (*mctxp)->methods->detach(mctxp);
+
+ ENSURE(*mctxp == NULL);
+}
+
+void
+isc_mem_destroy(isc_mem_t **mctxp) {
+ REQUIRE(mctxp != NULL && ISCAPI_MCTX_VALID(*mctxp));
+
+ (*mctxp)->methods->destroy(mctxp);
+
+ ENSURE(*mctxp == NULL);
+}
+
+void *
+isc__mem_get(isc_mem_t *mctx, size_t size FLARG) {
+ REQUIRE(ISCAPI_MCTX_VALID(mctx));
+
+ return (mctx->methods->memget(mctx, size FLARG_PASS));
+}
+
+void
+isc__mem_put(isc_mem_t *mctx, void *ptr, size_t size FLARG) {
+ REQUIRE(ISCAPI_MCTX_VALID(mctx));
+
+ mctx->methods->memput(mctx, ptr, size FLARG_PASS);
+}
+
+void
+isc__mem_putanddetach(isc_mem_t **mctxp, void *ptr, size_t size FLARG) {
+ REQUIRE(mctxp != NULL && ISCAPI_MCTX_VALID(*mctxp));
+
+ (*mctxp)->methods->memputanddetach(mctxp, ptr, size FLARG_PASS);
+
+ /*
+ * XXX: We cannot always ensure *mctxp == NULL here
+ * (see lib/isc/mem.c).
+ */
+}
+
+void *
+isc__mem_allocate(isc_mem_t *mctx, size_t size FLARG) {
+ REQUIRE(ISCAPI_MCTX_VALID(mctx));
+
+ return (mctx->methods->memallocate(mctx, size FLARG_PASS));
+}
+
+void *
+isc__mem_reallocate(isc_mem_t *mctx, void *ptr, size_t size FLARG) {
+ REQUIRE(ISCAPI_MCTX_VALID(mctx));
+
+ return (mctx->methods->memreallocate(mctx, ptr, size FLARG_PASS));
+}
+
+char *
+isc__mem_strdup(isc_mem_t *mctx, const char *s FLARG) {
+ REQUIRE(ISCAPI_MCTX_VALID(mctx));
+
+ return (mctx->methods->memstrdup(mctx, s FLARG_PASS));
+}
+
+void
+isc__mem_free(isc_mem_t *mctx, void *ptr FLARG) {
+ REQUIRE(ISCAPI_MCTX_VALID(mctx));
+
+ mctx->methods->memfree(mctx, ptr FLARG_PASS);
+}
+
+void
+isc_mem_setdestroycheck(isc_mem_t *mctx, isc_boolean_t flag) {
+ REQUIRE(ISCAPI_MCTX_VALID(mctx));
+
+ mctx->methods->setdestroycheck(mctx, flag);
+}
+
+void
+isc_mem_setwater(isc_mem_t *ctx, isc_mem_water_t water, void *water_arg,
+ size_t hiwater, size_t lowater)
+{
+ REQUIRE(ISCAPI_MCTX_VALID(ctx));
+
+ ctx->methods->setwater(ctx, water, water_arg, hiwater, lowater);
+}
+
+void
+isc_mem_waterack(isc_mem_t *ctx, int flag) {
+ REQUIRE(ISCAPI_MCTX_VALID(ctx));
+
+ ctx->methods->waterack(ctx, flag);
+}
+
+size_t
+isc_mem_inuse(isc_mem_t *mctx) {
+ REQUIRE(ISCAPI_MCTX_VALID(mctx));
+
+ return (mctx->methods->inuse(mctx));
+}
+
+isc_boolean_t
+isc_mem_isovermem(isc_mem_t *mctx) {
+ REQUIRE(ISCAPI_MCTX_VALID(mctx));
+
+ return (mctx->methods->isovermem(mctx));
+}
+
+void
+isc_mem_setname(isc_mem_t *mctx, const char *name, void *tag) {
+ REQUIRE(ISCAPI_MCTX_VALID(mctx));
+
+ UNUSED(name);
+ UNUSED(tag);
+
+ return;
+}
+
+const char *
+isc_mem_getname(isc_mem_t *mctx) {
+ REQUIRE(ISCAPI_MCTX_VALID(mctx));
+
+ return ("");
+}
+
+void *
+isc_mem_gettag(isc_mem_t *mctx) {
+ REQUIRE(ISCAPI_MCTX_VALID(mctx));
+
+ return (NULL);
+}
+
+isc_result_t
+isc_mempool_create(isc_mem_t *mctx, size_t size, isc_mempool_t **mpctxp) {
+ REQUIRE(ISCAPI_MCTX_VALID(mctx));
+
+ return (mctx->methods->mpcreate(mctx, size, mpctxp));
+}
+
+void
+isc_mempool_destroy(isc_mempool_t **mpctxp) {
+ REQUIRE(mpctxp != NULL && ISCAPI_MPOOL_VALID(*mpctxp));
+
+ (*mpctxp)->methods->destroy(mpctxp);
+
+ ENSURE(*mpctxp == NULL);
+}
+
+void *
+isc__mempool_get(isc_mempool_t *mpctx FLARG) {
+ REQUIRE(ISCAPI_MPOOL_VALID(mpctx));
+
+ return (mpctx->methods->get(mpctx FLARG_PASS));
+}
+
+void
+isc__mempool_put(isc_mempool_t *mpctx, void *mem FLARG) {
+ REQUIRE(ISCAPI_MPOOL_VALID(mpctx));
+
+ mpctx->methods->put(mpctx, mem FLARG_PASS);
+}
+
+unsigned int
+isc_mempool_getallocated(isc_mempool_t *mpctx) {
+ REQUIRE(ISCAPI_MPOOL_VALID(mpctx));
+
+ return (mpctx->methods->getallocated(mpctx));
+}
+
+void
+isc_mempool_setmaxalloc(isc_mempool_t *mpctx, unsigned int limit) {
+ REQUIRE(ISCAPI_MPOOL_VALID(mpctx));
+
+ mpctx->methods->setmaxalloc(mpctx, limit);
+}
+
+void
+isc_mempool_setfreemax(isc_mempool_t *mpctx, unsigned int limit) {
+ REQUIRE(ISCAPI_MPOOL_VALID(mpctx));
+
+ mpctx->methods->setfreemax(mpctx, limit);
+}
+
+void
+isc_mempool_setname(isc_mempool_t *mpctx, const char *name) {
+ REQUIRE(ISCAPI_MPOOL_VALID(mpctx));
+
+ mpctx->methods->setname(mpctx, name);
+}
+
+void
+isc_mempool_associatelock(isc_mempool_t *mpctx, isc_mutex_t *lock) {
+ REQUIRE(ISCAPI_MPOOL_VALID(mpctx));
+
+ mpctx->methods->associatelock(mpctx, lock);
+}
+
+void
+isc_mempool_setfillcount(isc_mempool_t *mpctx, unsigned int limit) {
+ REQUIRE(ISCAPI_MPOOL_VALID(mpctx));
+
+ mpctx->methods->setfillcount(mpctx, limit);
+}
diff --git a/contrib/bind9/lib/isc/netaddr.c b/contrib/bind9/lib/isc/netaddr.c
index 92c4fe5..33dddb8 100644
--- a/contrib/bind9/lib/isc/netaddr.c
+++ b/contrib/bind9/lib/isc/netaddr.c
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004, 2005, 2007 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004, 2005, 2007, 2010 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 1999-2002 Internet Software Consortium.
*
* Permission to use, copy, modify, and/or distribute this software for any
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: netaddr.c,v 1.38 2007-06-18 23:47:44 tbox Exp $ */
+/* $Id: netaddr.c,v 1.41 2010-11-17 23:47:08 tbox Exp $ */
/*! \file */
@@ -303,18 +303,18 @@ isc_netaddr_fromin6(isc_netaddr_t *netaddr, const struct in6_addr *ina6) {
isc_result_t
isc_netaddr_frompath(isc_netaddr_t *netaddr, const char *path) {
#ifdef ISC_PLATFORM_HAVESYSUNH
- if (strlen(path) > sizeof(netaddr->type.un) - 1)
- return (ISC_R_NOSPACE);
-
- memset(netaddr, 0, sizeof(*netaddr));
- netaddr->family = AF_UNIX;
- strcpy(netaddr->type.un, path);
- netaddr->zone = 0;
- return (ISC_R_SUCCESS);
-#else
+ if (strlen(path) > sizeof(netaddr->type.un) - 1)
+ return (ISC_R_NOSPACE);
+
+ memset(netaddr, 0, sizeof(*netaddr));
+ netaddr->family = AF_UNIX;
+ strcpy(netaddr->type.un, path);
+ netaddr->zone = 0;
+ return (ISC_R_SUCCESS);
+#else
UNUSED(netaddr);
UNUSED(path);
- return (ISC_R_NOTIMPLEMENTED);
+ return (ISC_R_NOTIMPLEMENTED);
#endif
}
diff --git a/contrib/bind9/lib/isc/nls/Makefile.in b/contrib/bind9/lib/isc/nls/Makefile.in
index c4ec7a1..bfd8dd0 100644
--- a/contrib/bind9/lib/isc/nls/Makefile.in
+++ b/contrib/bind9/lib/isc/nls/Makefile.in
@@ -1,4 +1,4 @@
-# Copyright (C) 2004, 2007 Internet Systems Consortium, Inc. ("ISC")
+# Copyright (C) 2004, 2007, 2009 Internet Systems Consortium, Inc. ("ISC")
# Copyright (C) 1999-2001 Internet Software Consortium.
#
# Permission to use, copy, modify, and/or distribute this software for any
@@ -13,7 +13,7 @@
# OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
# PERFORMANCE OF THIS SOFTWARE.
-# $Id: Makefile.in,v 1.14 2007-06-19 23:47:18 tbox Exp $
+# $Id: Makefile.in,v 1.17 2009-12-05 23:31:41 each Exp $
srcdir = @srcdir@
VPATH = @srcdir@
diff --git a/contrib/bind9/lib/isc/nothreads/Makefile.in b/contrib/bind9/lib/isc/nothreads/Makefile.in
index 042cfce..29bacd6 100644
--- a/contrib/bind9/lib/isc/nothreads/Makefile.in
+++ b/contrib/bind9/lib/isc/nothreads/Makefile.in
@@ -1,4 +1,4 @@
-# Copyright (C) 2004, 2007, 2010 Internet Systems Consortium, Inc. ("ISC")
+# Copyright (C) 2004, 2007, 2009, 2010 Internet Systems Consortium, Inc. ("ISC")
# Copyright (C) 2000, 2001 Internet Software Consortium.
#
# Permission to use, copy, modify, and/or distribute this software for any
@@ -13,11 +13,11 @@
# OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
# PERFORMANCE OF THIS SOFTWARE.
-# $Id: Makefile.in,v 1.7.332.2 2010-06-09 23:48:16 tbox Exp $
+# $Id: Makefile.in,v 1.12 2010-06-09 23:50:58 tbox Exp $
-srcdir = @srcdir@
-VPATH = @srcdir@
top_srcdir = @top_srcdir@
+srcdir = @top_srcdir@/lib/isc/nothreads
+VPATH = @top_srcdir@/lib/isc/nothreads
CINCLUDES = -I${srcdir}/include \
-I${srcdir}/../unix/include \
diff --git a/contrib/bind9/lib/isc/powerpc/include/isc/atomic.h b/contrib/bind9/lib/isc/powerpc/include/isc/atomic.h
index 074fea1..2e11e39 100644
--- a/contrib/bind9/lib/isc/powerpc/include/isc/atomic.h
+++ b/contrib/bind9/lib/isc/powerpc/include/isc/atomic.h
@@ -14,7 +14,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: atomic.h,v 1.6.332.2 2009-10-14 23:47:14 tbox Exp $ */
+/* $Id: atomic.h,v 1.8 2009-10-14 23:47:51 tbox Exp $ */
#ifndef ISC_ATOMIC_H
#define ISC_ATOMIC_H 1
diff --git a/contrib/bind9/lib/isc/print.c b/contrib/bind9/lib/isc/print.c
index 5d800f3..bd7b580 100644
--- a/contrib/bind9/lib/isc/print.c
+++ b/contrib/bind9/lib/isc/print.c
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: print.c,v 1.35.130.2 2010-10-18 23:46:17 tbox Exp $ */
+/* $Id: print.c,v 1.37 2010-10-18 23:47:08 tbox Exp $ */
/*! \file */
diff --git a/contrib/bind9/lib/isc/pthreads/Makefile.in b/contrib/bind9/lib/isc/pthreads/Makefile.in
index 572d76c..7aae93d 100644
--- a/contrib/bind9/lib/isc/pthreads/Makefile.in
+++ b/contrib/bind9/lib/isc/pthreads/Makefile.in
@@ -1,4 +1,4 @@
-# Copyright (C) 2004, 2007 Internet Systems Consortium, Inc. ("ISC")
+# Copyright (C) 2004, 2007, 2009 Internet Systems Consortium, Inc. ("ISC")
# Copyright (C) 1998-2001 Internet Software Consortium.
#
# Permission to use, copy, modify, and/or distribute this software for any
@@ -13,7 +13,7 @@
# OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
# PERFORMANCE OF THIS SOFTWARE.
-# $Id: Makefile.in,v 1.19 2007-06-19 23:47:18 tbox Exp $
+# $Id: Makefile.in,v 1.22 2009-12-05 23:31:41 each Exp $
srcdir = @srcdir@
VPATH = @srcdir@
diff --git a/contrib/bind9/lib/isc/pthreads/mutex.c b/contrib/bind9/lib/isc/pthreads/mutex.c
index efe38db..fa5a701 100644
--- a/contrib/bind9/lib/isc/pthreads/mutex.c
+++ b/contrib/bind9/lib/isc/pthreads/mutex.c
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: mutex.c,v 1.16.112.2 2011-01-04 23:45:43 tbox Exp $ */
+/* $Id: mutex.c,v 1.18 2011-01-04 23:47:14 tbox Exp $ */
/*! \file */
diff --git a/contrib/bind9/lib/isc/radix.c b/contrib/bind9/lib/isc/radix.c
index d72ed33..be2e841 100644
--- a/contrib/bind9/lib/isc/radix.c
+++ b/contrib/bind9/lib/isc/radix.c
@@ -14,7 +14,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: radix.c,v 1.20.36.3 2009-01-18 23:47:41 tbox Exp $ */
+/* $Id: radix.c,v 1.23 2009-01-18 23:48:14 tbox Exp $ */
/*
* This source was adapted from MRT's RCS Ids:
diff --git a/contrib/bind9/lib/isc/random.c b/contrib/bind9/lib/isc/random.c
index 09145f4..f082fe6 100644
--- a/contrib/bind9/lib/isc/random.c
+++ b/contrib/bind9/lib/isc/random.c
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: random.c,v 1.25.332.2 2009-07-16 23:47:17 tbox Exp $ */
+/* $Id: random.c,v 1.28 2009-07-16 05:52:46 marka Exp $ */
/*! \file */
@@ -103,7 +103,7 @@ isc_uint32_t
isc_random_jitter(isc_uint32_t max, isc_uint32_t jitter) {
isc_uint32_t rnd;
- REQUIRE(jitter < max);
+ REQUIRE(jitter < max || (jitter == 0 && max == 0));
if (jitter == 0)
return (max);
diff --git a/contrib/bind9/lib/isc/rwlock.c b/contrib/bind9/lib/isc/rwlock.c
index 39b90d7..fce7516 100644
--- a/contrib/bind9/lib/isc/rwlock.c
+++ b/contrib/bind9/lib/isc/rwlock.c
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: rwlock.c,v 1.44.332.2 2009-01-18 23:47:41 tbox Exp $ */
+/* $Id: rwlock.c,v 1.46 2009-01-18 23:48:14 tbox Exp $ */
/*! \file */
diff --git a/contrib/bind9/lib/isc/sha1.c b/contrib/bind9/lib/isc/sha1.c
index 20ee28d..d72eb9c 100644
--- a/contrib/bind9/lib/isc/sha1.c
+++ b/contrib/bind9/lib/isc/sha1.c
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004, 2005, 2007 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004, 2005, 2007, 2009 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 2000, 2001, 2003 Internet Software Consortium.
*
* Permission to use, copy, modify, and/or distribute this software for any
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: sha1.c,v 1.18 2007-06-19 23:47:17 tbox Exp $ */
+/* $Id: sha1.c,v 1.20 2009-02-06 23:47:42 tbox Exp $ */
/* $NetBSD: sha1.c,v 1.5 2000/01/22 22:19:14 mycroft Exp $ */
/* $OpenBSD: sha1.c,v 1.9 1997/07/23 21:12:32 kstailey Exp $ */
@@ -38,11 +38,47 @@
#include "config.h"
#include <isc/assertions.h>
+#include <isc/platform.h>
#include <isc/sha1.h>
#include <isc/string.h>
#include <isc/types.h>
#include <isc/util.h>
+#ifdef ISC_PLATFORM_OPENSSLHASH
+
+void
+isc_sha1_init(isc_sha1_t *context)
+{
+ INSIST(context != NULL);
+
+ EVP_DigestInit(context, EVP_sha1());
+}
+
+void
+isc_sha1_invalidate(isc_sha1_t *context) {
+ EVP_MD_CTX_cleanup(context);
+}
+
+void
+isc_sha1_update(isc_sha1_t *context, const unsigned char *data,
+ unsigned int len)
+{
+ INSIST(context != 0);
+ INSIST(data != 0);
+
+ EVP_DigestUpdate(context, (const void *) data, (size_t) len);
+}
+
+void
+isc_sha1_final(isc_sha1_t *context, unsigned char *digest) {
+ INSIST(digest != 0);
+ INSIST(context != 0);
+
+ EVP_DigestFinal(context, digest, NULL);
+}
+
+#else
+
#define rol(value, bits) (((value) << (bits)) | ((value) >> (32 - (bits))))
/*@{*/
@@ -313,3 +349,4 @@ isc_sha1_final(isc_sha1_t *context, unsigned char *digest) {
memset(context, 0, sizeof(isc_sha1_t));
}
+#endif
diff --git a/contrib/bind9/lib/isc/sha2.c b/contrib/bind9/lib/isc/sha2.c
index 22f1d47..1dc05a70 100644
--- a/contrib/bind9/lib/isc/sha2.c
+++ b/contrib/bind9/lib/isc/sha2.c
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2005-2007, 2009, 2010 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2005-2007, 2009 Internet Systems Consortium, Inc. ("ISC")
*
* Permission to use, copy, modify, and/or distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
@@ -14,7 +14,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: sha2.c,v 1.13.332.4 2010-01-15 23:47:34 tbox Exp $ */
+/* $Id: sha2.c,v 1.18 2009-10-22 02:21:31 each Exp $ */
/* $FreeBSD$ */
/* $KAME: sha2.c,v 1.8 2001/11/08 01:07:52 itojun Exp $ */
@@ -58,10 +58,169 @@
#include <config.h>
#include <isc/assertions.h>
+#include <isc/platform.h>
#include <isc/sha2.h>
#include <isc/string.h>
#include <isc/util.h>
+#ifdef ISC_PLATFORM_OPENSSLHASH
+
+void
+isc_sha224_init(isc_sha224_t *context) {
+ if (context == (isc_sha224_t *)0) {
+ return;
+ }
+ EVP_DigestInit(context, EVP_sha224());
+}
+
+void
+isc_sha224_invalidate(isc_sha224_t *context) {
+ EVP_MD_CTX_cleanup(context);
+}
+
+void
+isc_sha224_update(isc_sha224_t *context, const isc_uint8_t* data, size_t len) {
+ if (len == 0U) {
+ /* Calling with no data is valid - we do nothing */
+ return;
+ }
+
+ /* Sanity check: */
+ REQUIRE(context != (isc_sha224_t *)0 && data != (isc_uint8_t*)0);
+
+ EVP_DigestUpdate(context, (const void *) data, len);
+}
+
+void
+isc_sha224_final(isc_uint8_t digest[], isc_sha224_t *context) {
+ /* Sanity check: */
+ REQUIRE(context != (isc_sha224_t *)0);
+
+ /* If no digest buffer is passed, we don't bother doing this: */
+ if (digest != (isc_uint8_t*)0) {
+ EVP_DigestFinal(context, digest, NULL);
+ } else {
+ EVP_MD_CTX_cleanup(context);
+ }
+}
+
+void
+isc_sha256_init(isc_sha256_t *context) {
+ if (context == (isc_sha256_t *)0) {
+ return;
+ }
+ EVP_DigestInit(context, EVP_sha256());
+}
+
+void
+isc_sha256_invalidate(isc_sha256_t *context) {
+ EVP_MD_CTX_cleanup(context);
+}
+
+void
+isc_sha256_update(isc_sha256_t *context, const isc_uint8_t *data, size_t len) {
+ if (len == 0U) {
+ /* Calling with no data is valid - we do nothing */
+ return;
+ }
+
+ /* Sanity check: */
+ REQUIRE(context != (isc_sha256_t *)0 && data != (isc_uint8_t*)0);
+
+ EVP_DigestUpdate(context, (const void *) data, len);
+}
+
+void
+isc_sha256_final(isc_uint8_t digest[], isc_sha256_t *context) {
+ /* Sanity check: */
+ REQUIRE(context != (isc_sha256_t *)0);
+
+ /* If no digest buffer is passed, we don't bother doing this: */
+ if (digest != (isc_uint8_t*)0) {
+ EVP_DigestFinal(context, digest, NULL);
+ } else {
+ EVP_MD_CTX_cleanup(context);
+ }
+}
+
+void
+isc_sha512_init(isc_sha512_t *context) {
+ if (context == (isc_sha512_t *)0) {
+ return;
+ }
+ EVP_DigestInit(context, EVP_sha512());
+}
+
+void
+isc_sha512_invalidate(isc_sha512_t *context) {
+ EVP_MD_CTX_cleanup(context);
+}
+
+void isc_sha512_update(isc_sha512_t *context, const isc_uint8_t *data, size_t len) {
+ if (len == 0U) {
+ /* Calling with no data is valid - we do nothing */
+ return;
+ }
+
+ /* Sanity check: */
+ REQUIRE(context != (isc_sha512_t *)0 && data != (isc_uint8_t*)0);
+
+ EVP_DigestUpdate(context, (const void *) data, len);
+}
+
+void isc_sha512_final(isc_uint8_t digest[], isc_sha512_t *context) {
+ /* Sanity check: */
+ REQUIRE(context != (isc_sha512_t *)0);
+
+ /* If no digest buffer is passed, we don't bother doing this: */
+ if (digest != (isc_uint8_t*)0) {
+ EVP_DigestFinal(context, digest, NULL);
+ } else {
+ EVP_MD_CTX_cleanup(context);
+ }
+}
+
+void
+isc_sha384_init(isc_sha384_t *context) {
+ if (context == (isc_sha384_t *)0) {
+ return;
+ }
+ EVP_DigestInit(context, EVP_sha384());
+}
+
+void
+isc_sha384_invalidate(isc_sha384_t *context) {
+ EVP_MD_CTX_cleanup(context);
+}
+
+void
+isc_sha384_update(isc_sha384_t *context, const isc_uint8_t* data, size_t len) {
+ if (len == 0U) {
+ /* Calling with no data is valid - we do nothing */
+ return;
+ }
+
+ /* Sanity check: */
+ REQUIRE(context != (isc_sha512_t *)0 && data != (isc_uint8_t*)0);
+
+ EVP_DigestUpdate(context, (const void *) data, len);
+}
+
+void
+isc_sha384_final(isc_uint8_t digest[], isc_sha384_t *context) {
+ /* Sanity check: */
+ REQUIRE(context != (isc_sha384_t *)0);
+
+ /* If no digest buffer is passed, we don't bother doing this: */
+ if (digest != (isc_uint8_t*)0) {
+ EVP_DigestFinal(context, digest, NULL);
+ } else {
+ EVP_MD_CTX_cleanup(context);
+ }
+}
+
+#else
+
/*
* UNROLLED TRANSFORM LOOP NOTE:
* You can define SHA2_UNROLL_TRANSFORM to use the unrolled transform
@@ -394,13 +553,6 @@ static const isc_uint64_t sha512_initial_hash_value[8] = {
};
#endif
-/*
- * Constant used by SHA256/384/512_End() functions for converting the
- * digest to a readable hexadecimal character string:
- */
-static const char *sha2_hex_digits = "0123456789abcdef";
-
-
/*** SHA-224: *********************************************************/
void
@@ -432,41 +584,6 @@ isc_sha224_final(isc_uint8_t digest[], isc_sha224_t *context) {
memset(sha256_digest, 0, ISC_SHA256_DIGESTLENGTH);
}
-char *
-isc_sha224_end(isc_sha224_t *context, char buffer[]) {
- isc_uint8_t digest[ISC_SHA224_DIGESTLENGTH], *d = digest;
- unsigned int i;
-
- /* Sanity check: */
- REQUIRE(context != (isc_sha224_t *)0);
-
- if (buffer != (char*)0) {
- isc_sha224_final(digest, context);
-
- for (i = 0; i < ISC_SHA224_DIGESTLENGTH; i++) {
- *buffer++ = sha2_hex_digits[(*d & 0xf0) >> 4];
- *buffer++ = sha2_hex_digits[*d & 0x0f];
- d++;
- }
- *buffer = (char)0;
- } else {
- memset(context, 0, sizeof(context));
- }
- memset(digest, 0, ISC_SHA224_DIGESTLENGTH);
- return buffer;
-}
-
-char*
-isc_sha224_data(const isc_uint8_t *data, size_t len,
- char digest[ISC_SHA224_DIGESTSTRINGLENGTH])
-{
- isc_sha224_t context;
-
- isc_sha224_init(&context);
- isc_sha224_update(&context, data, len);
- return (isc_sha224_end(&context, digest));
-}
-
/*** SHA-256: *********************************************************/
void
isc_sha256_init(isc_sha256_t *context) {
@@ -479,6 +596,11 @@ isc_sha256_init(isc_sha256_t *context) {
context->bitcount = 0;
}
+void
+isc_sha256_invalidate(isc_sha256_t *context) {
+ memset(context, 0, sizeof(isc_sha256_t));
+}
+
#ifdef ISC_SHA2_UNROLL_TRANSFORM
/* Unrolled SHA-256 round macros: */
@@ -656,11 +778,6 @@ isc_sha256_transform(isc_sha256_t *context, const isc_uint32_t* data) {
#endif /* ISC_SHA2_UNROLL_TRANSFORM */
void
-isc_sha256_invalidate(isc_sha256_t *context) {
- memset(context, 0, sizeof(isc_sha256_t));
-}
-
-void
isc_sha256_update(isc_sha256_t *context, const isc_uint8_t *data, size_t len) {
unsigned int freespace, usedspace;
@@ -782,42 +899,6 @@ isc_sha256_final(isc_uint8_t digest[], isc_sha256_t *context) {
usedspace = 0;
}
-char *
-isc_sha256_end(isc_sha256_t *context, char buffer[]) {
- isc_uint8_t digest[ISC_SHA256_DIGESTLENGTH], *d = digest;
- unsigned int i;
-
- /* Sanity check: */
- REQUIRE(context != (isc_sha256_t *)0);
-
- if (buffer != (char*)0) {
- isc_sha256_final(digest, context);
-
- for (i = 0; i < ISC_SHA256_DIGESTLENGTH; i++) {
- *buffer++ = sha2_hex_digits[(*d & 0xf0) >> 4];
- *buffer++ = sha2_hex_digits[*d & 0x0f];
- d++;
- }
- *buffer = (char)0;
- } else {
- memset(context, 0, sizeof(context));
- }
- memset(digest, 0, ISC_SHA256_DIGESTLENGTH);
- return buffer;
-}
-
-char *
-isc_sha256_data(const isc_uint8_t* data, size_t len,
- char digest[ISC_SHA256_DIGESTSTRINGLENGTH])
-{
- isc_sha256_t context;
-
- isc_sha256_init(&context);
- isc_sha256_update(&context, data, len);
- return (isc_sha256_end(&context, digest));
-}
-
-
/*** SHA-512: *********************************************************/
void
isc_sha512_init(isc_sha512_t *context) {
@@ -830,6 +911,11 @@ isc_sha512_init(isc_sha512_t *context) {
context->bitcount[0] = context->bitcount[1] = 0;
}
+void
+isc_sha512_invalidate(isc_sha512_t *context) {
+ memset(context, 0, sizeof(isc_sha512_t));
+}
+
#ifdef ISC_SHA2_UNROLL_TRANSFORM
/* Unrolled SHA-512 round macros: */
@@ -1000,13 +1086,7 @@ isc_sha512_transform(isc_sha512_t *context, const isc_uint64_t* data) {
#endif /* ISC_SHA2_UNROLL_TRANSFORM */
-void
-isc_sha512_invalidate(isc_sha512_t *context) {
- memset(context, 0, sizeof(isc_sha512_t));
-}
-
-void
-isc_sha512_update(isc_sha512_t *context, const isc_uint8_t *data, size_t len) {
+void isc_sha512_update(isc_sha512_t *context, const isc_uint8_t *data, size_t len) {
unsigned int freespace, usedspace;
if (len == 0U) {
@@ -1131,41 +1211,6 @@ void isc_sha512_final(isc_uint8_t digest[], isc_sha512_t *context) {
memset(context, 0, sizeof(context));
}
-char *
-isc_sha512_end(isc_sha512_t *context, char buffer[]) {
- isc_uint8_t digest[ISC_SHA512_DIGESTLENGTH], *d = digest;
- unsigned int i;
-
- /* Sanity check: */
- REQUIRE(context != (isc_sha512_t *)0);
-
- if (buffer != (char*)0) {
- isc_sha512_final(digest, context);
-
- for (i = 0; i < ISC_SHA512_DIGESTLENGTH; i++) {
- *buffer++ = sha2_hex_digits[(*d & 0xf0) >> 4];
- *buffer++ = sha2_hex_digits[*d & 0x0f];
- d++;
- }
- *buffer = (char)0;
- } else {
- memset(context, 0, sizeof(context));
- }
- memset(digest, 0, ISC_SHA512_DIGESTLENGTH);
- return buffer;
-}
-
-char *
-isc_sha512_data(const isc_uint8_t *data, size_t len,
- char digest[ISC_SHA512_DIGESTSTRINGLENGTH])
-{
- isc_sha512_t context;
-
- isc_sha512_init(&context);
- isc_sha512_update(&context, data, len);
- return (isc_sha512_end(&context, digest));
-}
-
/*** SHA-384: *********************************************************/
void
@@ -1218,6 +1263,130 @@ isc_sha384_final(isc_uint8_t digest[], isc_sha384_t *context) {
/* Zero out state data */
memset(context, 0, sizeof(context));
}
+#endif /* !ISC_PLATFORM_OPENSSLHASH */
+
+/*
+ * Constant used by SHA256/384/512_End() functions for converting the
+ * digest to a readable hexadecimal character string:
+ */
+static const char *sha2_hex_digits = "0123456789abcdef";
+
+char *
+isc_sha224_end(isc_sha224_t *context, char buffer[]) {
+ isc_uint8_t digest[ISC_SHA224_DIGESTLENGTH], *d = digest;
+ unsigned int i;
+
+ /* Sanity check: */
+ REQUIRE(context != (isc_sha224_t *)0);
+
+ if (buffer != (char*)0) {
+ isc_sha224_final(digest, context);
+
+ for (i = 0; i < ISC_SHA224_DIGESTLENGTH; i++) {
+ *buffer++ = sha2_hex_digits[(*d & 0xf0) >> 4];
+ *buffer++ = sha2_hex_digits[*d & 0x0f];
+ d++;
+ }
+ *buffer = (char)0;
+ } else {
+#ifdef ISC_PLATFORM_OPENSSLHASH
+ EVP_MD_CTX_cleanup(context);
+#else
+ memset(context, 0, sizeof(context));
+#endif
+ }
+ memset(digest, 0, ISC_SHA224_DIGESTLENGTH);
+ return buffer;
+}
+
+char *
+isc_sha224_data(const isc_uint8_t *data, size_t len,
+ char digest[ISC_SHA224_DIGESTSTRINGLENGTH])
+{
+ isc_sha224_t context;
+
+ isc_sha224_init(&context);
+ isc_sha224_update(&context, data, len);
+ return (isc_sha224_end(&context, digest));
+}
+
+char *
+isc_sha256_end(isc_sha256_t *context, char buffer[]) {
+ isc_uint8_t digest[ISC_SHA256_DIGESTLENGTH], *d = digest;
+ unsigned int i;
+
+ /* Sanity check: */
+ REQUIRE(context != (isc_sha256_t *)0);
+
+ if (buffer != (char*)0) {
+ isc_sha256_final(digest, context);
+
+ for (i = 0; i < ISC_SHA256_DIGESTLENGTH; i++) {
+ *buffer++ = sha2_hex_digits[(*d & 0xf0) >> 4];
+ *buffer++ = sha2_hex_digits[*d & 0x0f];
+ d++;
+ }
+ *buffer = (char)0;
+ } else {
+#ifdef ISC_PLATFORM_OPENSSLHASH
+ EVP_MD_CTX_cleanup(context);
+#else
+ memset(context, 0, sizeof(context));
+#endif
+ }
+ memset(digest, 0, ISC_SHA256_DIGESTLENGTH);
+ return buffer;
+}
+
+char *
+isc_sha256_data(const isc_uint8_t* data, size_t len,
+ char digest[ISC_SHA256_DIGESTSTRINGLENGTH])
+{
+ isc_sha256_t context;
+
+ isc_sha256_init(&context);
+ isc_sha256_update(&context, data, len);
+ return (isc_sha256_end(&context, digest));
+}
+
+char *
+isc_sha512_end(isc_sha512_t *context, char buffer[]) {
+ isc_uint8_t digest[ISC_SHA512_DIGESTLENGTH], *d = digest;
+ unsigned int i;
+
+ /* Sanity check: */
+ REQUIRE(context != (isc_sha512_t *)0);
+
+ if (buffer != (char*)0) {
+ isc_sha512_final(digest, context);
+
+ for (i = 0; i < ISC_SHA512_DIGESTLENGTH; i++) {
+ *buffer++ = sha2_hex_digits[(*d & 0xf0) >> 4];
+ *buffer++ = sha2_hex_digits[*d & 0x0f];
+ d++;
+ }
+ *buffer = (char)0;
+ } else {
+#ifdef ISC_PLATFORM_OPENSSLHASH
+ EVP_MD_CTX_cleanup(context);
+#else
+ memset(context, 0, sizeof(context));
+#endif
+ }
+ memset(digest, 0, ISC_SHA512_DIGESTLENGTH);
+ return buffer;
+}
+
+char *
+isc_sha512_data(const isc_uint8_t *data, size_t len,
+ char digest[ISC_SHA512_DIGESTSTRINGLENGTH])
+{
+ isc_sha512_t context;
+
+ isc_sha512_init(&context);
+ isc_sha512_update(&context, data, len);
+ return (isc_sha512_end(&context, digest));
+}
char *
isc_sha384_end(isc_sha384_t *context, char buffer[]) {
@@ -1237,13 +1406,17 @@ isc_sha384_end(isc_sha384_t *context, char buffer[]) {
}
*buffer = (char)0;
} else {
+#ifdef ISC_PLATFORM_OPENSSLHASH
+ EVP_MD_CTX_cleanup(context);
+#else
memset(context, 0, sizeof(context));
+#endif
}
memset(digest, 0, ISC_SHA384_DIGESTLENGTH);
return buffer;
}
-char*
+char *
isc_sha384_data(const isc_uint8_t *data, size_t len,
char digest[ISC_SHA384_DIGESTSTRINGLENGTH])
{
diff --git a/contrib/bind9/lib/isc/sockaddr.c b/contrib/bind9/lib/isc/sockaddr.c
index 19833e4..9661ee4 100644
--- a/contrib/bind9/lib/isc/sockaddr.c
+++ b/contrib/bind9/lib/isc/sockaddr.c
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004-2007 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004-2007, 2010 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 1999-2003 Internet Software Consortium.
*
* Permission to use, copy, modify, and/or distribute this software for any
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: sockaddr.c,v 1.70 2007-06-19 23:47:17 tbox Exp $ */
+/* $Id: sockaddr.c,v 1.73 2010-11-17 23:47:09 tbox Exp $ */
/*! \file */
@@ -390,8 +390,8 @@ isc_sockaddr_fromnetaddr(isc_sockaddr_t *sockaddr, const isc_netaddr_t *na,
#endif
sockaddr->type.sin6.sin6_port = htons(port);
break;
- default:
- INSIST(0);
+ default:
+ INSIST(0);
}
ISC_LINK_INIT(sockaddr, link);
}
diff --git a/contrib/bind9/lib/isc/socket_api.c b/contrib/bind9/lib/isc/socket_api.c
new file mode 100644
index 0000000..c1e5fd4
--- /dev/null
+++ b/contrib/bind9/lib/isc/socket_api.c
@@ -0,0 +1,216 @@
+/*
+ * Copyright (C) 2009 Internet Systems Consortium, Inc. ("ISC")
+ *
+ * Permission to use, copy, modify, and/or 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 ISC DISCLAIMS ALL WARRANTIES WITH
+ * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+ * AND FITNESS. IN NO EVENT SHALL ISC 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.
+ */
+
+/* $Id: socket_api.c,v 1.5 2009-10-01 01:30:01 sar Exp $ */
+
+#include <config.h>
+
+#include <isc/app.h>
+#include <isc/magic.h>
+#include <isc/mutex.h>
+#include <isc/once.h>
+#include <isc/socket.h>
+#include <isc/util.h>
+
+static isc_mutex_t createlock;
+static isc_once_t once = ISC_ONCE_INIT;
+static isc_socketmgrcreatefunc_t socketmgr_createfunc = NULL;
+
+static void
+initialize(void) {
+ RUNTIME_CHECK(isc_mutex_init(&createlock) == ISC_R_SUCCESS);
+}
+
+isc_result_t
+isc_socket_register(isc_socketmgrcreatefunc_t createfunc) {
+ isc_result_t result = ISC_R_SUCCESS;
+
+ RUNTIME_CHECK(isc_once_do(&once, initialize) == ISC_R_SUCCESS);
+
+ LOCK(&createlock);
+ if (socketmgr_createfunc == NULL)
+ socketmgr_createfunc = createfunc;
+ else
+ result = ISC_R_EXISTS;
+ UNLOCK(&createlock);
+
+ return (result);
+}
+
+isc_result_t
+isc_socketmgr_createinctx(isc_mem_t *mctx, isc_appctx_t *actx,
+ isc_socketmgr_t **managerp)
+{
+ isc_result_t result;
+
+ LOCK(&createlock);
+
+ REQUIRE(socketmgr_createfunc != NULL);
+ result = (*socketmgr_createfunc)(mctx, managerp);
+
+ UNLOCK(&createlock);
+
+ if (result == ISC_R_SUCCESS)
+ isc_appctx_setsocketmgr(actx, *managerp);
+
+ return (result);
+}
+
+isc_result_t
+isc_socketmgr_create(isc_mem_t *mctx, isc_socketmgr_t **managerp) {
+ isc_result_t result;
+
+ LOCK(&createlock);
+
+ REQUIRE(socketmgr_createfunc != NULL);
+ result = (*socketmgr_createfunc)(mctx, managerp);
+
+ UNLOCK(&createlock);
+
+ return (result);
+}
+
+void
+isc_socketmgr_destroy(isc_socketmgr_t **managerp) {
+ REQUIRE(managerp != NULL && ISCAPI_SOCKETMGR_VALID(*managerp));
+
+ (*managerp)->methods->destroy(managerp);
+
+ ENSURE(*managerp == NULL);
+}
+
+isc_result_t
+isc_socket_create(isc_socketmgr_t *manager, int pf, isc_sockettype_t type,
+ isc_socket_t **socketp)
+{
+ REQUIRE(ISCAPI_SOCKETMGR_VALID(manager));
+
+ return (manager->methods->socketcreate(manager, pf, type, socketp));
+}
+
+void
+isc_socket_attach(isc_socket_t *sock, isc_socket_t **socketp) {
+ REQUIRE(ISCAPI_SOCKET_VALID(sock));
+ REQUIRE(socketp != NULL && *socketp == NULL);
+
+ sock->methods->attach(sock, socketp);
+
+ ENSURE(*socketp == sock);
+}
+
+void
+isc_socket_detach(isc_socket_t **socketp) {
+ REQUIRE(socketp != NULL && ISCAPI_SOCKET_VALID(*socketp));
+
+ (*socketp)->methods->detach(socketp);
+
+ ENSURE(*socketp == NULL);
+}
+
+isc_result_t
+isc_socket_bind(isc_socket_t *sock, isc_sockaddr_t *sockaddr,
+ unsigned int options)
+{
+ REQUIRE(ISCAPI_SOCKET_VALID(sock));
+
+ return (sock->methods->bind(sock, sockaddr, options));
+}
+
+isc_result_t
+isc_socket_sendto(isc_socket_t *sock, isc_region_t *region, isc_task_t *task,
+ isc_taskaction_t action, const void *arg,
+ isc_sockaddr_t *address, struct in6_pktinfo *pktinfo)
+{
+ REQUIRE(ISCAPI_SOCKET_VALID(sock));
+
+ return (sock->methods->sendto(sock, region, task, action, arg, address,
+ pktinfo));
+}
+
+isc_result_t
+isc_socket_connect(isc_socket_t *sock, isc_sockaddr_t *addr, isc_task_t *task,
+ isc_taskaction_t action, const void *arg)
+{
+ REQUIRE(ISCAPI_SOCKET_VALID(sock));
+
+ return (sock->methods->connect(sock, addr, task, action, arg));
+}
+
+isc_result_t
+isc_socket_recv(isc_socket_t *sock, isc_region_t *region, unsigned int minimum,
+ isc_task_t *task, isc_taskaction_t action, const void *arg)
+{
+ REQUIRE(ISCAPI_SOCKET_VALID(sock));
+
+ return (sock->methods->recv(sock, region, minimum, task, action, arg));
+}
+
+void
+isc_socket_cancel(isc_socket_t *sock, isc_task_t *task, unsigned int how) {
+ REQUIRE(ISCAPI_SOCKET_VALID(sock));
+
+ sock->methods->cancel(sock, task, how);
+}
+
+isc_result_t
+isc_socket_getsockname(isc_socket_t *sock, isc_sockaddr_t *addressp) {
+ REQUIRE(ISCAPI_SOCKET_VALID(sock));
+
+ return (sock->methods->getsockname(sock, addressp));
+}
+
+void
+isc_socket_ipv6only(isc_socket_t *sock, isc_boolean_t yes) {
+ REQUIRE(ISCAPI_SOCKET_VALID(sock));
+
+ sock->methods->ipv6only(sock, yes);
+}
+
+isc_sockettype_t
+isc_socket_gettype(isc_socket_t *sock) {
+ REQUIRE(ISCAPI_SOCKET_VALID(sock));
+
+ return (sock->methods->gettype(sock));
+}
+
+void
+isc_socket_setname(isc_socket_t *socket, const char *name, void *tag) {
+ REQUIRE(ISCAPI_SOCKET_VALID(socket));
+
+ UNUSED(socket); /* in case REQUIRE() is empty */
+ UNUSED(name);
+ UNUSED(tag);
+}
+
+isc_result_t
+isc_socket_fdwatchcreate(isc_socketmgr_t *manager, int fd, int flags,
+ isc_sockfdwatch_t callback, void *cbarg,
+ isc_task_t *task, isc_socket_t **socketp)
+{
+ REQUIRE(ISCAPI_SOCKETMGR_VALID(manager));
+
+ return (manager->methods->fdwatchcreate(manager, fd, flags,
+ callback, cbarg, task,
+ socketp));
+}
+
+isc_result_t
+isc_socket_fdwatchpoke(isc_socket_t *sock, int flags)
+{
+ REQUIRE(ISCAPI_SOCKET_VALID(sock));
+
+ return(sock->methods->fdwatchpoke(sock, flags));
+}
diff --git a/contrib/bind9/lib/isc/sparc64/include/isc/atomic.h b/contrib/bind9/lib/isc/sparc64/include/isc/atomic.h
index 9ee3c0b..89eaec5 100644
--- a/contrib/bind9/lib/isc/sparc64/include/isc/atomic.h
+++ b/contrib/bind9/lib/isc/sparc64/include/isc/atomic.h
@@ -72,9 +72,9 @@ isc_atomic_xadd(isc_int32_t *p, isc_int32_t val) {
for (prev = *(volatile isc_int32_t *)p; ; prev = swapped) {
swapped = prev + val;
__asm__ volatile(
- "casa [%1] %2, %3, %0"
- : "+r"(swapped)
- : "r"(p), "n"(ASI_P), "r"(prev));
+ "casa [%2] %3, %4, %0"
+ : "+r"(swapped), "=m"(*p)
+ : "r"(p), "n"(ASI_P), "r"(prev), "m"(*p));
if (swapped == prev)
break;
}
@@ -92,10 +92,9 @@ isc_atomic_store(isc_int32_t *p, isc_int32_t val) {
for (prev = *(volatile isc_int32_t *)p; ; prev = swapped) {
swapped = val;
__asm__ volatile(
- "casa [%1] %2, %3, %0"
- : "+r"(swapped)
- : "r"(p), "n"(ASI_P), "r"(prev)
- : "memory");
+ "casa [%2] %3, %4, %0"
+ : "+r"(swapped), "=m"(*p)
+ : "r"(p), "n"(ASI_P), "r"(prev), "m"(*p));
if (swapped == prev)
break;
}
@@ -111,9 +110,9 @@ isc_atomic_cmpxchg(isc_int32_t *p, isc_int32_t cmpval, isc_int32_t val) {
isc_int32_t temp = val;
__asm__ volatile(
- "casa [%1] %2, %3, %0"
- : "+r"(temp)
- : "r"(p), "n"(ASI_P), "r"(cmpval));
+ "casa [%2] %3, %4, %0"
+ : "+r"(temp), "=m"(*p)
+ : "r"(p), "n"(ASI_P), "r"(cmpval), "m"(*p));
return (temp);
}
diff --git a/contrib/bind9/lib/isc/stats.c b/contrib/bind9/lib/isc/stats.c
index ac66bcf..e72fb54 100644
--- a/contrib/bind9/lib/isc/stats.c
+++ b/contrib/bind9/lib/isc/stats.c
@@ -14,7 +14,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: stats.c,v 1.3.6.2 2009-01-29 23:47:44 tbox Exp $ */
+/* $Id: stats.c,v 1.3 2009-01-27 23:47:54 tbox Exp $ */
/*! \file */
diff --git a/contrib/bind9/lib/isc/task.c b/contrib/bind9/lib/isc/task.c
index 5d87f21..a9dfd1f 100644
--- a/contrib/bind9/lib/isc/task.c
+++ b/contrib/bind9/lib/isc/task.c
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004-2008, 2010 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004-2011 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 1998-2003 Internet Software Consortium.
*
* Permission to use, copy, modify, and/or distribute this software for any
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: task.c,v 1.107.120.2 2010-12-03 23:45:47 tbox Exp $ */
+/* $Id: task.c,v 1.115.14.1.2.1 2011-06-02 23:47:36 tbox Exp $ */
/*! \file
* \author Principal Author: Bob Halley
@@ -40,9 +40,33 @@
#include <isc/util.h>
#include <isc/xml.h>
-#ifndef ISC_PLATFORM_USETHREADS
+#ifdef OPENSSL_LEAKS
+#include <openssl/err.h>
+#endif
+
+/*%
+ * For BIND9 internal applications:
+ * when built with threads we use multiple worker threads shared by the whole
+ * application.
+ * when built without threads we share a single global task manager and use
+ * an integrated event loop for socket, timer, and other generic task events.
+ * For generic library:
+ * we don't use either of them: an application can have multiple task managers
+ * whether or not it's threaded, and if the application is threaded each thread
+ * is expected to have a separate manager; no "worker threads" are shared by
+ * the application threads.
+ */
+#ifdef BIND9
+#ifdef ISC_PLATFORM_USETHREADS
+#define USE_WORKER_THREADS
+#else
+#define USE_SHARED_MANAGER
+#endif /* ISC_PLATFORM_USETHREADS */
+#endif /* BIND9 */
+
+#ifndef USE_WORKER_THREADS
#include "task_p.h"
-#endif /* ISC_PLATFORM_USETHREADS */
+#endif /* USE_WORKER_THREADS */
#ifdef ISC_TASK_TRACE
#define XTRACE(m) fprintf(stderr, "task %p thread %lu: %s\n", \
@@ -66,7 +90,7 @@ typedef enum {
task_state_done
} task_state_t;
-#ifdef HAVE_LIBXML2
+#if defined(HAVE_LIBXML2) && defined(BIND9)
static const char *statenames[] = {
"idle", "ready", "running", "done",
};
@@ -75,10 +99,13 @@ static const char *statenames[] = {
#define TASK_MAGIC ISC_MAGIC('T', 'A', 'S', 'K')
#define VALID_TASK(t) ISC_MAGIC_VALID(t, TASK_MAGIC)
-struct isc_task {
+typedef struct isc__task isc__task_t;
+typedef struct isc__taskmgr isc__taskmgr_t;
+
+struct isc__task {
/* Not locked. */
- unsigned int magic;
- isc_taskmgr_t * manager;
+ isc_task_t common;
+ isc__taskmgr_t * manager;
isc_mutex_t lock;
/* Locked by task lock. */
task_state_t state;
@@ -91,8 +118,8 @@ struct isc_task {
char name[16];
void * tag;
/* Locked by task manager lock. */
- LINK(isc_task_t) link;
- LINK(isc_task_t) ready_link;
+ LINK(isc__task_t) link;
+ LINK(isc__task_t) ready_link;
};
#define TASK_F_SHUTTINGDOWN 0x01
@@ -103,9 +130,11 @@ struct isc_task {
#define TASK_MANAGER_MAGIC ISC_MAGIC('T', 'S', 'K', 'M')
#define VALID_MANAGER(m) ISC_MAGIC_VALID(m, TASK_MANAGER_MAGIC)
-struct isc_taskmgr {
+typedef ISC_LIST(isc__task_t) isc__tasklist_t;
+
+struct isc__taskmgr {
/* Not locked. */
- unsigned int magic;
+ isc_taskmgr_t common;
isc_mem_t * mctx;
isc_mutex_t lock;
#ifdef ISC_PLATFORM_USETHREADS
@@ -114,8 +143,8 @@ struct isc_taskmgr {
#endif /* ISC_PLATFORM_USETHREADS */
/* Locked by task manager lock. */
unsigned int default_quantum;
- LIST(isc_task_t) tasks;
- isc_tasklist_t ready_tasks;
+ LIST(isc__task_t) tasks;
+ isc__tasklist_t ready_tasks;
#ifdef ISC_PLATFORM_USETHREADS
isc_condition_t work_available;
isc_condition_t exclusive_granted;
@@ -123,7 +152,7 @@ struct isc_taskmgr {
unsigned int tasks_running;
isc_boolean_t exclusive_requested;
isc_boolean_t exiting;
-#ifndef ISC_PLATFORM_USETHREADS
+#ifdef USE_SHARED_MANAGER
unsigned int refs;
#endif /* ISC_PLATFORM_USETHREADS */
};
@@ -132,17 +161,116 @@ struct isc_taskmgr {
#define DEFAULT_DEFAULT_QUANTUM 5
#define FINISHED(m) ((m)->exiting && EMPTY((m)->tasks))
-#ifndef ISC_PLATFORM_USETHREADS
-static isc_taskmgr_t *taskmgr = NULL;
-#endif /* ISC_PLATFORM_USETHREADS */
+#ifdef USE_SHARED_MANAGER
+static isc__taskmgr_t *taskmgr = NULL;
+#endif /* USE_SHARED_MANAGER */
+
+/*%
+ * The following can be either static or public, depending on build environment.
+ */
+
+#ifdef BIND9
+#define ISC_TASKFUNC_SCOPE
+#else
+#define ISC_TASKFUNC_SCOPE static
+#endif
+
+ISC_TASKFUNC_SCOPE isc_result_t
+isc__task_create(isc_taskmgr_t *manager0, unsigned int quantum,
+ isc_task_t **taskp);
+ISC_TASKFUNC_SCOPE void
+isc__task_attach(isc_task_t *source0, isc_task_t **targetp);
+ISC_TASKFUNC_SCOPE void
+isc__task_detach(isc_task_t **taskp);
+ISC_TASKFUNC_SCOPE void
+isc__task_send(isc_task_t *task0, isc_event_t **eventp);
+ISC_TASKFUNC_SCOPE void
+isc__task_sendanddetach(isc_task_t **taskp, isc_event_t **eventp);
+ISC_TASKFUNC_SCOPE unsigned int
+isc__task_purgerange(isc_task_t *task0, void *sender, isc_eventtype_t first,
+ isc_eventtype_t last, void *tag);
+ISC_TASKFUNC_SCOPE unsigned int
+isc__task_purge(isc_task_t *task, void *sender, isc_eventtype_t type,
+ void *tag);
+ISC_TASKFUNC_SCOPE isc_boolean_t
+isc__task_purgeevent(isc_task_t *task0, isc_event_t *event);
+ISC_TASKFUNC_SCOPE unsigned int
+isc__task_unsendrange(isc_task_t *task, void *sender, isc_eventtype_t first,
+ isc_eventtype_t last, void *tag,
+ isc_eventlist_t *events);
+ISC_TASKFUNC_SCOPE unsigned int
+isc__task_unsend(isc_task_t *task, void *sender, isc_eventtype_t type,
+ void *tag, isc_eventlist_t *events);
+ISC_TASKFUNC_SCOPE isc_result_t
+isc__task_onshutdown(isc_task_t *task0, isc_taskaction_t action,
+ const void *arg);
+ISC_TASKFUNC_SCOPE void
+isc__task_shutdown(isc_task_t *task0);
+ISC_TASKFUNC_SCOPE void
+isc__task_destroy(isc_task_t **taskp);
+ISC_TASKFUNC_SCOPE void
+isc__task_setname(isc_task_t *task0, const char *name, void *tag);
+ISC_TASKFUNC_SCOPE const char *
+isc__task_getname(isc_task_t *task0);
+ISC_TASKFUNC_SCOPE void *
+isc__task_gettag(isc_task_t *task0);
+ISC_TASKFUNC_SCOPE void
+isc__task_getcurrenttime(isc_task_t *task0, isc_stdtime_t *t);
+ISC_TASKFUNC_SCOPE isc_result_t
+isc__taskmgr_create(isc_mem_t *mctx, unsigned int workers,
+ unsigned int default_quantum, isc_taskmgr_t **managerp);
+ISC_TASKFUNC_SCOPE void
+isc__taskmgr_destroy(isc_taskmgr_t **managerp);
+ISC_TASKFUNC_SCOPE isc_result_t
+isc__task_beginexclusive(isc_task_t *task);
+ISC_TASKFUNC_SCOPE void
+isc__task_endexclusive(isc_task_t *task0);
+
+static struct isc__taskmethods {
+ isc_taskmethods_t methods;
+
+ /*%
+ * The following are defined just for avoiding unused static functions.
+ */
+#ifndef BIND9
+ void *purgeevent, *unsendrange, *getname, *gettag, *getcurrenttime;
+#endif
+} taskmethods = {
+ {
+ isc__task_attach,
+ isc__task_detach,
+ isc__task_destroy,
+ isc__task_send,
+ isc__task_sendanddetach,
+ isc__task_unsend,
+ isc__task_onshutdown,
+ isc__task_shutdown,
+ isc__task_setname,
+ isc__task_purge,
+ isc__task_purgerange,
+ isc__task_beginexclusive,
+ isc__task_endexclusive
+ }
+#ifndef BIND9
+ ,
+ (void *)isc__task_purgeevent, (void *)isc__task_unsendrange,
+ (void *)isc__task_getname, (void *)isc__task_gettag,
+ (void *)isc__task_getcurrenttime
+#endif
+};
+
+static isc_taskmgrmethods_t taskmgrmethods = {
+ isc__taskmgr_destroy,
+ isc__task_create
+};
/***
*** Tasks.
***/
static void
-task_finished(isc_task_t *task) {
- isc_taskmgr_t *manager = task->manager;
+task_finished(isc__task_t *task) {
+ isc__taskmgr_t *manager = task->manager;
REQUIRE(EMPTY(task->events));
REQUIRE(EMPTY(task->on_shutdown));
@@ -153,7 +281,7 @@ task_finished(isc_task_t *task) {
LOCK(&manager->lock);
UNLINK(manager->tasks, task, link);
-#ifdef ISC_PLATFORM_USETHREADS
+#ifdef USE_WORKER_THREADS
if (FINISHED(manager)) {
/*
* All tasks have completed and the
@@ -163,19 +291,21 @@ task_finished(isc_task_t *task) {
*/
BROADCAST(&manager->work_available);
}
-#endif /* ISC_PLATFORM_USETHREADS */
+#endif /* USE_WORKER_THREADS */
UNLOCK(&manager->lock);
DESTROYLOCK(&task->lock);
- task->magic = 0;
+ task->common.impmagic = 0;
+ task->common.magic = 0;
isc_mem_put(manager->mctx, task, sizeof(*task));
}
-isc_result_t
-isc_task_create(isc_taskmgr_t *manager, unsigned int quantum,
- isc_task_t **taskp)
+ISC_TASKFUNC_SCOPE isc_result_t
+isc__task_create(isc_taskmgr_t *manager0, unsigned int quantum,
+ isc_task_t **taskp)
{
- isc_task_t *task;
+ isc__taskmgr_t *manager = (isc__taskmgr_t *)manager0;
+ isc__task_t *task;
isc_boolean_t exiting;
isc_result_t result;
@@ -220,14 +350,17 @@ isc_task_create(isc_taskmgr_t *manager, unsigned int quantum,
return (ISC_R_SHUTTINGDOWN);
}
- task->magic = TASK_MAGIC;
- *taskp = task;
+ task->common.methods = (isc_taskmethods_t *)&taskmethods;
+ task->common.magic = ISCAPI_TASK_MAGIC;
+ task->common.impmagic = TASK_MAGIC;
+ *taskp = (isc_task_t *)task;
return (ISC_R_SUCCESS);
}
-void
-isc_task_attach(isc_task_t *source, isc_task_t **targetp) {
+ISC_TASKFUNC_SCOPE void
+isc__task_attach(isc_task_t *source0, isc_task_t **targetp) {
+ isc__task_t *source = (isc__task_t *)source0;
/*
* Attach *targetp to source.
@@ -242,11 +375,11 @@ isc_task_attach(isc_task_t *source, isc_task_t **targetp) {
source->references++;
UNLOCK(&source->lock);
- *targetp = source;
+ *targetp = (isc_task_t *)source;
}
static inline isc_boolean_t
-task_shutdown(isc_task_t *task) {
+task_shutdown(isc__task_t *task) {
isc_boolean_t was_idle = ISC_FALSE;
isc_event_t *event, *prev;
@@ -283,8 +416,8 @@ task_shutdown(isc_task_t *task) {
}
static inline void
-task_ready(isc_task_t *task) {
- isc_taskmgr_t *manager = task->manager;
+task_ready(isc__task_t *task) {
+ isc__taskmgr_t *manager = task->manager;
REQUIRE(VALID_MANAGER(manager));
REQUIRE(task->state == task_state_ready);
@@ -294,15 +427,15 @@ task_ready(isc_task_t *task) {
LOCK(&manager->lock);
ENQUEUE(manager->ready_tasks, task, ready_link);
-#ifdef ISC_PLATFORM_USETHREADS
+#ifdef USE_WORKER_THREADS
SIGNAL(&manager->work_available);
-#endif /* ISC_PLATFORM_USETHREADS */
+#endif /* USE_WORKER_THREADS */
UNLOCK(&manager->lock);
}
static inline isc_boolean_t
-task_detach(isc_task_t *task) {
+task_detach(isc__task_t *task) {
/*
* Caller must be holding the task lock.
@@ -330,9 +463,9 @@ task_detach(isc_task_t *task) {
return (ISC_FALSE);
}
-void
-isc_task_detach(isc_task_t **taskp) {
- isc_task_t *task;
+ISC_TASKFUNC_SCOPE void
+isc__task_detach(isc_task_t **taskp) {
+ isc__task_t *task;
isc_boolean_t was_idle;
/*
@@ -340,7 +473,7 @@ isc_task_detach(isc_task_t **taskp) {
*/
REQUIRE(taskp != NULL);
- task = *taskp;
+ task = (isc__task_t *)*taskp;
REQUIRE(VALID_TASK(task));
XTRACE("isc_task_detach");
@@ -356,7 +489,7 @@ isc_task_detach(isc_task_t **taskp) {
}
static inline isc_boolean_t
-task_send(isc_task_t *task, isc_event_t **eventp) {
+task_send(isc__task_t *task, isc_event_t **eventp) {
isc_boolean_t was_idle = ISC_FALSE;
isc_event_t *event;
@@ -385,8 +518,9 @@ task_send(isc_task_t *task, isc_event_t **eventp) {
return (was_idle);
}
-void
-isc_task_send(isc_task_t *task, isc_event_t **eventp) {
+ISC_TASKFUNC_SCOPE void
+isc__task_send(isc_task_t *task0, isc_event_t **eventp) {
+ isc__task_t *task = (isc__task_t *)task0;
isc_boolean_t was_idle;
/*
@@ -426,10 +560,10 @@ isc_task_send(isc_task_t *task, isc_event_t **eventp) {
}
}
-void
-isc_task_sendanddetach(isc_task_t **taskp, isc_event_t **eventp) {
+ISC_TASKFUNC_SCOPE void
+isc__task_sendanddetach(isc_task_t **taskp, isc_event_t **eventp) {
isc_boolean_t idle1, idle2;
- isc_task_t *task;
+ isc__task_t *task;
/*
* Send '*event' to '*taskp' and then detach '*taskp' from its
@@ -437,7 +571,7 @@ isc_task_sendanddetach(isc_task_t **taskp, isc_event_t **eventp) {
*/
REQUIRE(taskp != NULL);
- task = *taskp;
+ task = (isc__task_t *)*taskp;
REQUIRE(VALID_TASK(task));
XTRACE("isc_task_sendanddetach");
@@ -463,7 +597,7 @@ isc_task_sendanddetach(isc_task_t **taskp, isc_event_t **eventp) {
#define PURGE_OK(event) (((event)->ev_attributes & ISC_EVENTATTR_NOPURGE) == 0)
static unsigned int
-dequeue_events(isc_task_t *task, void *sender, isc_eventtype_t first,
+dequeue_events(isc__task_t *task, void *sender, isc_eventtype_t first,
isc_eventtype_t last, void *tag,
isc_eventlist_t *events, isc_boolean_t purging)
{
@@ -502,10 +636,11 @@ dequeue_events(isc_task_t *task, void *sender, isc_eventtype_t first,
return (count);
}
-unsigned int
-isc_task_purgerange(isc_task_t *task, void *sender, isc_eventtype_t first,
- isc_eventtype_t last, void *tag)
+ISC_TASKFUNC_SCOPE unsigned int
+isc__task_purgerange(isc_task_t *task0, void *sender, isc_eventtype_t first,
+ isc_eventtype_t last, void *tag)
{
+ isc__task_t *task = (isc__task_t *)task0;
unsigned int count;
isc_eventlist_t events;
isc_event_t *event, *next_event;
@@ -533,9 +668,9 @@ isc_task_purgerange(isc_task_t *task, void *sender, isc_eventtype_t first,
return (count);
}
-unsigned int
-isc_task_purge(isc_task_t *task, void *sender, isc_eventtype_t type,
- void *tag)
+ISC_TASKFUNC_SCOPE unsigned int
+isc__task_purge(isc_task_t *task, void *sender, isc_eventtype_t type,
+ void *tag)
{
/*
* Purge events from a task's event queue.
@@ -543,11 +678,12 @@ isc_task_purge(isc_task_t *task, void *sender, isc_eventtype_t type,
XTRACE("isc_task_purge");
- return (isc_task_purgerange(task, sender, type, type, tag));
+ return (isc__task_purgerange(task, sender, type, type, tag));
}
-isc_boolean_t
-isc_task_purgeevent(isc_task_t *task, isc_event_t *event) {
+ISC_TASKFUNC_SCOPE isc_boolean_t
+isc__task_purgeevent(isc_task_t *task0, isc_event_t *event) {
+ isc__task_t *task = (isc__task_t *)task0;
isc_event_t *curr_event, *next_event;
/*
@@ -588,10 +724,10 @@ isc_task_purgeevent(isc_task_t *task, isc_event_t *event) {
return (ISC_TRUE);
}
-unsigned int
-isc_task_unsendrange(isc_task_t *task, void *sender, isc_eventtype_t first,
- isc_eventtype_t last, void *tag,
- isc_eventlist_t *events)
+ISC_TASKFUNC_SCOPE unsigned int
+isc__task_unsendrange(isc_task_t *task, void *sender, isc_eventtype_t first,
+ isc_eventtype_t last, void *tag,
+ isc_eventlist_t *events)
{
/*
* Remove events from a task's event queue.
@@ -599,13 +735,13 @@ isc_task_unsendrange(isc_task_t *task, void *sender, isc_eventtype_t first,
XTRACE("isc_task_unsendrange");
- return (dequeue_events(task, sender, first, last, tag, events,
- ISC_FALSE));
+ return (dequeue_events((isc__task_t *)task, sender, first,
+ last, tag, events, ISC_FALSE));
}
-unsigned int
-isc_task_unsend(isc_task_t *task, void *sender, isc_eventtype_t type,
- void *tag, isc_eventlist_t *events)
+ISC_TASKFUNC_SCOPE unsigned int
+isc__task_unsend(isc_task_t *task, void *sender, isc_eventtype_t type,
+ void *tag, isc_eventlist_t *events)
{
/*
* Remove events from a task's event queue.
@@ -613,13 +749,15 @@ isc_task_unsend(isc_task_t *task, void *sender, isc_eventtype_t type,
XTRACE("isc_task_unsend");
- return (dequeue_events(task, sender, type, type, tag, events,
- ISC_FALSE));
+ return (dequeue_events((isc__task_t *)task, sender, type,
+ type, tag, events, ISC_FALSE));
}
-isc_result_t
-isc_task_onshutdown(isc_task_t *task, isc_taskaction_t action, const void *arg)
+ISC_TASKFUNC_SCOPE isc_result_t
+isc__task_onshutdown(isc_task_t *task0, isc_taskaction_t action,
+ const void *arg)
{
+ isc__task_t *task = (isc__task_t *)task0;
isc_boolean_t disallowed = ISC_FALSE;
isc_result_t result = ISC_R_SUCCESS;
isc_event_t *event;
@@ -655,8 +793,9 @@ isc_task_onshutdown(isc_task_t *task, isc_taskaction_t action, const void *arg)
return (result);
}
-void
-isc_task_shutdown(isc_task_t *task) {
+ISC_TASKFUNC_SCOPE void
+isc__task_shutdown(isc_task_t *task0) {
+ isc__task_t *task = (isc__task_t *)task0;
isc_boolean_t was_idle;
/*
@@ -673,8 +812,8 @@ isc_task_shutdown(isc_task_t *task) {
task_ready(task);
}
-void
-isc_task_destroy(isc_task_t **taskp) {
+ISC_TASKFUNC_SCOPE void
+isc__task_destroy(isc_task_t **taskp) {
/*
* Destroy '*taskp'.
@@ -686,8 +825,9 @@ isc_task_destroy(isc_task_t **taskp) {
isc_task_detach(taskp);
}
-void
-isc_task_setname(isc_task_t *task, const char *name, void *tag) {
+ISC_TASKFUNC_SCOPE void
+isc__task_setname(isc_task_t *task0, const char *name, void *tag) {
+ isc__task_t *task = (isc__task_t *)task0;
/*
* Name 'task'.
@@ -702,18 +842,28 @@ isc_task_setname(isc_task_t *task, const char *name, void *tag) {
UNLOCK(&task->lock);
}
-const char *
-isc_task_getname(isc_task_t *task) {
+ISC_TASKFUNC_SCOPE const char *
+isc__task_getname(isc_task_t *task0) {
+ isc__task_t *task = (isc__task_t *)task0;
+
+ REQUIRE(VALID_TASK(task));
+
return (task->name);
}
-void *
-isc_task_gettag(isc_task_t *task) {
+ISC_TASKFUNC_SCOPE void *
+isc__task_gettag(isc_task_t *task0) {
+ isc__task_t *task = (isc__task_t *)task0;
+
+ REQUIRE(VALID_TASK(task));
+
return (task->tag);
}
-void
-isc_task_getcurrenttime(isc_task_t *task, isc_stdtime_t *t) {
+ISC_TASKFUNC_SCOPE void
+isc__task_getcurrenttime(isc_task_t *task0, isc_stdtime_t *t) {
+ isc__task_t *task = (isc__task_t *)task0;
+
REQUIRE(VALID_TASK(task));
REQUIRE(t != NULL);
@@ -728,12 +878,12 @@ isc_task_getcurrenttime(isc_task_t *task, isc_stdtime_t *t) {
*** Task Manager.
***/
static void
-dispatch(isc_taskmgr_t *manager) {
- isc_task_t *task;
-#ifndef ISC_PLATFORM_USETHREADS
+dispatch(isc__taskmgr_t *manager) {
+ isc__task_t *task;
+#ifndef USE_WORKER_THREADS
unsigned int total_dispatch_count = 0;
- isc_tasklist_t ready_tasks;
-#endif /* ISC_PLATFORM_USETHREADS */
+ isc__tasklist_t ready_tasks;
+#endif /* USE_WORKER_THREADS */
REQUIRE(VALID_MANAGER(manager));
@@ -787,12 +937,12 @@ dispatch(isc_taskmgr_t *manager) {
* unlocks. The while expression is always protected by the lock.
*/
-#ifndef ISC_PLATFORM_USETHREADS
+#ifndef USE_WORKER_THREADS
ISC_LIST_INIT(ready_tasks);
#endif
LOCK(&manager->lock);
while (!FINISHED(manager)) {
-#ifdef ISC_PLATFORM_USETHREADS
+#ifdef USE_WORKER_THREADS
/*
* For reasons similar to those given in the comment in
* isc_task_send() above, it is safe for us to dequeue
@@ -812,11 +962,11 @@ dispatch(isc_taskmgr_t *manager) {
ISC_MSGSET_TASK,
ISC_MSG_AWAKE, "awake"));
}
-#else /* ISC_PLATFORM_USETHREADS */
+#else /* USE_WORKER_THREADS */
if (total_dispatch_count >= DEFAULT_TASKMGR_QUANTUM ||
EMPTY(manager->ready_tasks))
break;
-#endif /* ISC_PLATFORM_USETHREADS */
+#endif /* USE_WORKER_THREADS */
XTHREADTRACE(isc_msgcat_get(isc_msgcat, ISC_MSGSET_TASK,
ISC_MSG_WORKING, "working"));
@@ -859,13 +1009,15 @@ dispatch(isc_taskmgr_t *manager) {
"execute action"));
if (event->ev_action != NULL) {
UNLOCK(&task->lock);
- (event->ev_action)(task,event);
+ (event->ev_action)(
+ (isc_task_t *)task,
+ event);
LOCK(&task->lock);
}
dispatch_count++;
-#ifndef ISC_PLATFORM_USETHREADS
+#ifndef USE_WORKER_THREADS
total_dispatch_count++;
-#endif /* ISC_PLATFORM_USETHREADS */
+#endif /* USE_WORKER_THREADS */
}
if (task->references == 0 &&
@@ -950,12 +1102,12 @@ dispatch(isc_taskmgr_t *manager) {
LOCK(&manager->lock);
manager->tasks_running--;
-#ifdef ISC_PLATFORM_USETHREADS
+#ifdef USE_WORKER_THREADS
if (manager->exclusive_requested &&
manager->tasks_running == 1) {
SIGNAL(&manager->exclusive_granted);
}
-#endif /* ISC_PLATFORM_USETHREADS */
+#endif /* USE_WORKER_THREADS */
if (requeue) {
/*
* We know we're awake, so we don't have
@@ -976,7 +1128,7 @@ dispatch(isc_taskmgr_t *manager) {
* were usually nonempty, the 'optimization'
* might even hurt rather than help.
*/
-#ifdef ISC_PLATFORM_USETHREADS
+#ifdef USE_WORKER_THREADS
ENQUEUE(manager->ready_tasks, task,
ready_link);
#else
@@ -985,19 +1137,19 @@ dispatch(isc_taskmgr_t *manager) {
}
}
}
-#ifndef ISC_PLATFORM_USETHREADS
+#ifndef USE_WORKER_THREADS
ISC_LIST_APPENDLIST(manager->ready_tasks, ready_tasks, ready_link);
#endif
UNLOCK(&manager->lock);
}
-#ifdef ISC_PLATFORM_USETHREADS
+#ifdef USE_WORKER_THREADS
static isc_threadresult_t
#ifdef _WIN32
WINAPI
#endif
run(void *uap) {
- isc_taskmgr_t *manager = uap;
+ isc__taskmgr_t *manager = uap;
XTHREADTRACE(isc_msgcat_get(isc_msgcat, ISC_MSGSET_GENERAL,
ISC_MSG_STARTING, "starting"));
@@ -1007,33 +1159,42 @@ run(void *uap) {
XTHREADTRACE(isc_msgcat_get(isc_msgcat, ISC_MSGSET_GENERAL,
ISC_MSG_EXITING, "exiting"));
+#ifdef OPENSSL_LEAKS
+ ERR_remove_state(0);
+#endif
+
return ((isc_threadresult_t)0);
}
-#endif /* ISC_PLATFORM_USETHREADS */
+#endif /* USE_WORKER_THREADS */
static void
-manager_free(isc_taskmgr_t *manager) {
+manager_free(isc__taskmgr_t *manager) {
isc_mem_t *mctx;
-#ifdef ISC_PLATFORM_USETHREADS
+#ifdef USE_WORKER_THREADS
(void)isc_condition_destroy(&manager->exclusive_granted);
(void)isc_condition_destroy(&manager->work_available);
isc_mem_free(manager->mctx, manager->threads);
-#endif /* ISC_PLATFORM_USETHREADS */
+#endif /* USE_WORKER_THREADS */
DESTROYLOCK(&manager->lock);
- manager->magic = 0;
+ manager->common.impmagic = 0;
+ manager->common.magic = 0;
mctx = manager->mctx;
isc_mem_put(mctx, manager, sizeof(*manager));
isc_mem_detach(&mctx);
+
+#ifdef USE_SHARED_MANAGER
+ taskmgr = NULL;
+#endif /* USE_SHARED_MANAGER */
}
-isc_result_t
-isc_taskmgr_create(isc_mem_t *mctx, unsigned int workers,
- unsigned int default_quantum, isc_taskmgr_t **managerp)
+ISC_TASKFUNC_SCOPE isc_result_t
+isc__taskmgr_create(isc_mem_t *mctx, unsigned int workers,
+ unsigned int default_quantum, isc_taskmgr_t **managerp)
{
isc_result_t result;
unsigned int i, started = 0;
- isc_taskmgr_t *manager;
+ isc__taskmgr_t *manager;
/*
* Create a new task manager.
@@ -1042,28 +1203,33 @@ isc_taskmgr_create(isc_mem_t *mctx, unsigned int workers,
REQUIRE(workers > 0);
REQUIRE(managerp != NULL && *managerp == NULL);
-#ifndef ISC_PLATFORM_USETHREADS
+#ifndef USE_WORKER_THREADS
UNUSED(i);
UNUSED(started);
- UNUSED(workers);
+#endif
+#ifdef USE_SHARED_MANAGER
if (taskmgr != NULL) {
+ if (taskmgr->refs == 0)
+ return (ISC_R_SHUTTINGDOWN);
taskmgr->refs++;
- *managerp = taskmgr;
+ *managerp = (isc_taskmgr_t *)taskmgr;
return (ISC_R_SUCCESS);
}
-#endif /* ISC_PLATFORM_USETHREADS */
+#endif /* USE_SHARED_MANAGER */
manager = isc_mem_get(mctx, sizeof(*manager));
if (manager == NULL)
return (ISC_R_NOMEMORY);
- manager->magic = TASK_MANAGER_MAGIC;
+ manager->common.methods = &taskmgrmethods;
+ manager->common.impmagic = TASK_MANAGER_MAGIC;
+ manager->common.magic = ISCAPI_TASKMGR_MAGIC;
manager->mctx = NULL;
result = isc_mutex_init(&manager->lock);
if (result != ISC_R_SUCCESS)
goto cleanup_mgr;
-#ifdef ISC_PLATFORM_USETHREADS
+#ifdef USE_WORKER_THREADS
manager->workers = 0;
manager->threads = isc_mem_allocate(mctx,
workers * sizeof(isc_thread_t));
@@ -1087,7 +1253,7 @@ isc_taskmgr_create(isc_mem_t *mctx, unsigned int workers,
result = ISC_R_UNEXPECTED;
goto cleanup_workavailable;
}
-#endif /* ISC_PLATFORM_USETHREADS */
+#endif /* USE_WORKER_THREADS */
if (default_quantum == 0)
default_quantum = DEFAULT_DEFAULT_QUANTUM;
manager->default_quantum = default_quantum;
@@ -1099,7 +1265,7 @@ isc_taskmgr_create(isc_mem_t *mctx, unsigned int workers,
isc_mem_attach(mctx, &manager->mctx);
-#ifdef ISC_PLATFORM_USETHREADS
+#ifdef USE_WORKER_THREADS
LOCK(&manager->lock);
/*
* Start workers.
@@ -1119,16 +1285,17 @@ isc_taskmgr_create(isc_mem_t *mctx, unsigned int workers,
return (ISC_R_NOTHREADS);
}
isc_thread_setconcurrency(workers);
-#else /* ISC_PLATFORM_USETHREADS */
+#endif /* USE_WORKER_THREADS */
+#ifdef USE_SHARED_MANAGER
manager->refs = 1;
taskmgr = manager;
-#endif /* ISC_PLATFORM_USETHREADS */
+#endif /* USE_SHARED_MANAGER */
- *managerp = manager;
+ *managerp = (isc_taskmgr_t *)manager;
return (ISC_R_SUCCESS);
-#ifdef ISC_PLATFORM_USETHREADS
+#ifdef USE_WORKER_THREADS
cleanup_workavailable:
(void)isc_condition_destroy(&manager->work_available);
cleanup_threads:
@@ -1141,10 +1308,10 @@ isc_taskmgr_create(isc_mem_t *mctx, unsigned int workers,
return (result);
}
-void
-isc_taskmgr_destroy(isc_taskmgr_t **managerp) {
- isc_taskmgr_t *manager;
- isc_task_t *task;
+ISC_TASKFUNC_SCOPE void
+isc__taskmgr_destroy(isc_taskmgr_t **managerp) {
+ isc__taskmgr_t *manager;
+ isc__task_t *task;
unsigned int i;
/*
@@ -1152,18 +1319,20 @@ isc_taskmgr_destroy(isc_taskmgr_t **managerp) {
*/
REQUIRE(managerp != NULL);
- manager = *managerp;
+ manager = (isc__taskmgr_t *)*managerp;
REQUIRE(VALID_MANAGER(manager));
-#ifndef ISC_PLATFORM_USETHREADS
+#ifndef USE_WORKER_THREADS
UNUSED(i);
+#endif /* USE_WORKER_THREADS */
- if (manager->refs > 1) {
- manager->refs--;
+#ifdef USE_SHARED_MANAGER
+ manager->refs--;
+ if (manager->refs > 0) {
*managerp = NULL;
return;
}
-#endif /* ISC_PLATFORM_USETHREADS */
+#endif
XTHREADTRACE("isc_taskmgr_destroy");
/*
@@ -1203,7 +1372,7 @@ isc_taskmgr_destroy(isc_taskmgr_t **managerp) {
ENQUEUE(manager->ready_tasks, task, ready_link);
UNLOCK(&task->lock);
}
-#ifdef ISC_PLATFORM_USETHREADS
+#ifdef USE_WORKER_THREADS
/*
* Wake up any sleeping workers. This ensures we get work done if
* there's work left to do, and if there are already no tasks left
@@ -1217,36 +1386,51 @@ isc_taskmgr_destroy(isc_taskmgr_t **managerp) {
*/
for (i = 0; i < manager->workers; i++)
(void)isc_thread_join(manager->threads[i], NULL);
-#else /* ISC_PLATFORM_USETHREADS */
+#else /* USE_WORKER_THREADS */
/*
* Dispatch the shutdown events.
*/
UNLOCK(&manager->lock);
- while (isc__taskmgr_ready())
- (void)isc__taskmgr_dispatch();
+ while (isc__taskmgr_ready((isc_taskmgr_t *)manager))
+ (void)isc__taskmgr_dispatch((isc_taskmgr_t *)manager);
+#ifdef BIND9
if (!ISC_LIST_EMPTY(manager->tasks))
isc_mem_printallactive(stderr);
+#endif
INSIST(ISC_LIST_EMPTY(manager->tasks));
-#endif /* ISC_PLATFORM_USETHREADS */
+#ifdef USE_SHARED_MANAGER
+ taskmgr = NULL;
+#endif
+#endif /* USE_WORKER_THREADS */
manager_free(manager);
*managerp = NULL;
}
-#ifndef ISC_PLATFORM_USETHREADS
+#ifndef USE_WORKER_THREADS
isc_boolean_t
-isc__taskmgr_ready(void) {
- if (taskmgr == NULL)
+isc__taskmgr_ready(isc_taskmgr_t *manager0) {
+ isc__taskmgr_t *manager = (isc__taskmgr_t *)manager0;
+
+#ifdef USE_SHARED_MANAGER
+ if (manager == NULL)
+ manager = taskmgr;
+#endif
+ if (manager == NULL)
return (ISC_FALSE);
- return (ISC_TF(!ISC_LIST_EMPTY(taskmgr->ready_tasks)));
+ return (ISC_TF(!ISC_LIST_EMPTY(manager->ready_tasks)));
}
isc_result_t
-isc__taskmgr_dispatch(void) {
- isc_taskmgr_t *manager = taskmgr;
+isc__taskmgr_dispatch(isc_taskmgr_t *manager0) {
+ isc__taskmgr_t *manager = (isc__taskmgr_t *)manager0;
- if (taskmgr == NULL)
+#ifdef USE_SHARED_MANAGER
+ if (manager == NULL)
+ manager = taskmgr;
+#endif
+ if (manager == NULL)
return (ISC_R_NOTFOUND);
dispatch(manager);
@@ -1254,12 +1438,13 @@ isc__taskmgr_dispatch(void) {
return (ISC_R_SUCCESS);
}
-#endif /* ISC_PLATFORM_USETHREADS */
+#endif /* USE_WORKER_THREADS */
-isc_result_t
-isc_task_beginexclusive(isc_task_t *task) {
-#ifdef ISC_PLATFORM_USETHREADS
- isc_taskmgr_t *manager = task->manager;
+ISC_TASKFUNC_SCOPE isc_result_t
+isc__task_beginexclusive(isc_task_t *task0) {
+#ifdef USE_WORKER_THREADS
+ isc__task_t *task = (isc__task_t *)task0;
+ isc__taskmgr_t *manager = task->manager;
REQUIRE(task->state == task_state_running);
LOCK(&manager->lock);
if (manager->exclusive_requested) {
@@ -1272,15 +1457,17 @@ isc_task_beginexclusive(isc_task_t *task) {
}
UNLOCK(&manager->lock);
#else
- UNUSED(task);
+ UNUSED(task0);
#endif
return (ISC_R_SUCCESS);
}
-void
-isc_task_endexclusive(isc_task_t *task) {
-#ifdef ISC_PLATFORM_USETHREADS
- isc_taskmgr_t *manager = task->manager;
+ISC_TASKFUNC_SCOPE void
+isc__task_endexclusive(isc_task_t *task0) {
+#ifdef USE_WORKER_THREADS
+ isc__task_t *task = (isc__task_t *)task0;
+ isc__taskmgr_t *manager = task->manager;
+
REQUIRE(task->state == task_state_running);
LOCK(&manager->lock);
REQUIRE(manager->exclusive_requested);
@@ -1288,23 +1475,31 @@ isc_task_endexclusive(isc_task_t *task) {
BROADCAST(&manager->work_available);
UNLOCK(&manager->lock);
#else
- UNUSED(task);
+ UNUSED(task0);
#endif
}
+#ifdef USE_SOCKETIMPREGISTER
+isc_result_t
+isc__task_register() {
+ return (isc_task_register(isc__taskmgr_create));
+}
+#endif
+
isc_boolean_t
isc_task_exiting(isc_task_t *t) {
- isc_task_t *task = (isc_task_t *)t;
+ isc__task_t *task = (isc__task_t *)t;
REQUIRE(VALID_TASK(task));
return (TASK_SHUTTINGDOWN(task));
}
-#ifdef HAVE_LIBXML2
+
+#if defined(HAVE_LIBXML2) && defined(BIND9)
void
-isc_taskmgr_renderxml(isc_taskmgr_t *mgr, xmlTextWriterPtr writer)
-{
- isc_task_t *task;
+isc_taskmgr_renderxml(isc_taskmgr_t *mgr0, xmlTextWriterPtr writer) {
+ isc__taskmgr_t *mgr = (isc__taskmgr_t *)mgr0;
+ isc__task_t *task;
LOCK(&mgr->lock);
@@ -1380,4 +1575,4 @@ isc_taskmgr_renderxml(isc_taskmgr_t *mgr, xmlTextWriterPtr writer)
UNLOCK(&mgr->lock);
}
-#endif /* HAVE_LIBXML2 */
+#endif /* HAVE_LIBXML2 && BIND9 */
diff --git a/contrib/bind9/lib/isc/task_api.c b/contrib/bind9/lib/isc/task_api.c
new file mode 100644
index 0000000..4e03db2
--- /dev/null
+++ b/contrib/bind9/lib/isc/task_api.c
@@ -0,0 +1,216 @@
+/*
+ * Copyright (C) 2009, 2010 Internet Systems Consortium, Inc. ("ISC")
+ *
+ * Permission to use, copy, modify, and/or 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 ISC DISCLAIMS ALL WARRANTIES WITH
+ * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+ * AND FITNESS. IN NO EVENT SHALL ISC 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.
+ */
+
+/* $Id: task_api.c,v 1.7 2010-12-22 23:46:59 tbox Exp $ */
+
+#include <config.h>
+
+#include <unistd.h>
+
+#include <isc/app.h>
+#include <isc/magic.h>
+#include <isc/mutex.h>
+#include <isc/once.h>
+#include <isc/task.h>
+#include <isc/util.h>
+
+static isc_mutex_t createlock;
+static isc_once_t once = ISC_ONCE_INIT;
+static isc_taskmgrcreatefunc_t taskmgr_createfunc = NULL;
+
+static void
+initialize(void) {
+ RUNTIME_CHECK(isc_mutex_init(&createlock) == ISC_R_SUCCESS);
+}
+
+isc_result_t
+isc_task_register(isc_taskmgrcreatefunc_t createfunc) {
+ isc_result_t result = ISC_R_SUCCESS;
+
+ RUNTIME_CHECK(isc_once_do(&once, initialize) == ISC_R_SUCCESS);
+
+ LOCK(&createlock);
+ if (taskmgr_createfunc == NULL)
+ taskmgr_createfunc = createfunc;
+ else
+ result = ISC_R_EXISTS;
+ UNLOCK(&createlock);
+
+ return (result);
+}
+
+isc_result_t
+isc_taskmgr_createinctx(isc_mem_t *mctx, isc_appctx_t *actx,
+ unsigned int workers, unsigned int default_quantum,
+ isc_taskmgr_t **managerp)
+{
+ isc_result_t result;
+
+ LOCK(&createlock);
+
+ REQUIRE(taskmgr_createfunc != NULL);
+ result = (*taskmgr_createfunc)(mctx, workers, default_quantum,
+ managerp);
+
+ UNLOCK(&createlock);
+
+ if (result == ISC_R_SUCCESS)
+ isc_appctx_settaskmgr(actx, *managerp);
+
+ return (result);
+}
+
+isc_result_t
+isc_taskmgr_create(isc_mem_t *mctx, unsigned int workers,
+ unsigned int default_quantum, isc_taskmgr_t **managerp)
+{
+ isc_result_t result;
+
+ LOCK(&createlock);
+
+ REQUIRE(taskmgr_createfunc != NULL);
+ result = (*taskmgr_createfunc)(mctx, workers, default_quantum,
+ managerp);
+
+ UNLOCK(&createlock);
+
+ return (result);
+}
+
+void
+isc_taskmgr_destroy(isc_taskmgr_t **managerp) {
+ REQUIRE(managerp != NULL && ISCAPI_TASKMGR_VALID(*managerp));
+
+ (*managerp)->methods->destroy(managerp);
+
+ ENSURE(*managerp == NULL);
+}
+
+isc_result_t
+isc_task_create(isc_taskmgr_t *manager, unsigned int quantum,
+ isc_task_t **taskp)
+{
+ REQUIRE(ISCAPI_TASKMGR_VALID(manager));
+ REQUIRE(taskp != NULL && *taskp == NULL);
+
+ return (manager->methods->taskcreate(manager, quantum, taskp));
+}
+
+void
+isc_task_attach(isc_task_t *source, isc_task_t **targetp) {
+ REQUIRE(ISCAPI_TASK_VALID(source));
+ REQUIRE(targetp != NULL && *targetp == NULL);
+
+ source->methods->attach(source, targetp);
+
+ ENSURE(*targetp == source);
+}
+
+void
+isc_task_detach(isc_task_t **taskp) {
+ REQUIRE(taskp != NULL && ISCAPI_TASK_VALID(*taskp));
+
+ (*taskp)->methods->detach(taskp);
+
+ ENSURE(*taskp == NULL);
+}
+
+void
+isc_task_send(isc_task_t *task, isc_event_t **eventp) {
+ REQUIRE(ISCAPI_TASK_VALID(task));
+ REQUIRE(eventp != NULL && *eventp != NULL);
+
+ task->methods->send(task, eventp);
+
+ ENSURE(*eventp == NULL);
+}
+
+void
+isc_task_sendanddetach(isc_task_t **taskp, isc_event_t **eventp) {
+ REQUIRE(taskp != NULL && ISCAPI_TASK_VALID(*taskp));
+ REQUIRE(eventp != NULL && *eventp != NULL);
+
+ (*taskp)->methods->sendanddetach(taskp, eventp);
+
+ ENSURE(*taskp == NULL && *eventp == NULL);
+}
+
+unsigned int
+isc_task_unsend(isc_task_t *task, void *sender, isc_eventtype_t type,
+ void *tag, isc_eventlist_t *events)
+{
+ REQUIRE(ISCAPI_TASK_VALID(task));
+
+ return (task->methods->unsend(task, sender, type, tag, events));
+}
+
+isc_result_t
+isc_task_onshutdown(isc_task_t *task, isc_taskaction_t action, const void *arg)
+{
+ REQUIRE(ISCAPI_TASK_VALID(task));
+
+ return (task->methods->onshutdown(task, action, arg));
+}
+
+void
+isc_task_shutdown(isc_task_t *task) {
+ REQUIRE(ISCAPI_TASK_VALID(task));
+
+ task->methods->shutdown(task);
+}
+
+void
+isc_task_setname(isc_task_t *task, const char *name, void *tag) {
+ REQUIRE(ISCAPI_TASK_VALID(task));
+
+ task->methods->setname(task, name, tag);
+}
+
+unsigned int
+isc_task_purge(isc_task_t *task, void *sender, isc_eventtype_t type, void *tag)
+{
+ REQUIRE(ISCAPI_TASK_VALID(task));
+
+ return (task->methods->purgeevents(task, sender, type, tag));
+}
+
+isc_result_t
+isc_task_beginexclusive(isc_task_t *task) {
+ REQUIRE(ISCAPI_TASK_VALID(task));
+
+ return (task->methods->beginexclusive(task));
+}
+
+void
+isc_task_endexclusive(isc_task_t *task) {
+ REQUIRE(ISCAPI_TASK_VALID(task));
+
+ task->methods->endexclusive(task);
+}
+
+
+/*%
+ * This is necessary for libisc's internal timer implementation. Other
+ * implementation might skip implementing this.
+ */
+unsigned int
+isc_task_purgerange(isc_task_t *task, void *sender, isc_eventtype_t first,
+ isc_eventtype_t last, void *tag)
+{
+ REQUIRE(ISCAPI_TASK_VALID(task));
+
+ return (task->methods->purgerange(task, sender, first, last, tag));
+}
diff --git a/contrib/bind9/lib/isc/task_p.h b/contrib/bind9/lib/isc/task_p.h
index 7bf208a..1bcdca6 100644
--- a/contrib/bind9/lib/isc/task_p.h
+++ b/contrib/bind9/lib/isc/task_p.h
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004, 2005, 2007 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004, 2005, 2007, 2009 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 2000, 2001 Internet Software Consortium.
*
* Permission to use, copy, modify, and/or distribute this software for any
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: task_p.h,v 1.11 2007-06-19 23:47:17 tbox Exp $ */
+/* $Id: task_p.h,v 1.13 2009-09-02 23:48:02 tbox Exp $ */
#ifndef ISC_TASK_P_H
#define ISC_TASK_P_H
@@ -23,9 +23,9 @@
/*! \file */
isc_boolean_t
-isc__taskmgr_ready(void);
+isc__taskmgr_ready(isc_taskmgr_t *taskmgr);
isc_result_t
-isc__taskmgr_dispatch(void);
+isc__taskmgr_dispatch(isc_taskmgr_t *taskmgr);
#endif /* ISC_TASK_P_H */
diff --git a/contrib/bind9/lib/isc/timer.c b/contrib/bind9/lib/isc/timer.c
index 6342688..ab89cdd 100644
--- a/contrib/bind9/lib/isc/timer.c
+++ b/contrib/bind9/lib/isc/timer.c
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004, 2005, 2007-2009 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004, 2005, 2007-2009, 2011 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 1998-2002 Internet Software Consortium.
*
* Permission to use, copy, modify, and/or distribute this software for any
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: timer.c,v 1.84.58.4 2009-01-23 23:47:21 tbox Exp $ */
+/* $Id: timer.c,v 1.95.302.1.2.1 2011-06-02 23:47:36 tbox Exp $ */
/*! \file */
@@ -34,9 +34,22 @@
#include <isc/timer.h>
#include <isc/util.h>
-#ifndef ISC_PLATFORM_USETHREADS
+#ifdef OPENSSL_LEAKS
+#include <openssl/err.h>
+#endif
+
+/* See task.c about the following definition: */
+#ifdef BIND9
+#ifdef ISC_PLATFORM_USETHREADS
+#define USE_TIMER_THREAD
+#else
+#define USE_SHARED_MANAGER
+#endif /* ISC_PLATFORM_USETHREADS */
+#endif /* BIND9 */
+
+#ifndef USE_TIMER_THREAD
#include "timer_p.h"
-#endif /* ISC_PLATFORM_USETHREADS */
+#endif /* USE_TIMER_THREAD */
#ifdef ISC_TIMER_TRACE
#define XTRACE(s) fprintf(stderr, "%s\n", (s))
@@ -58,10 +71,13 @@
#define TIMER_MAGIC ISC_MAGIC('T', 'I', 'M', 'R')
#define VALID_TIMER(t) ISC_MAGIC_VALID(t, TIMER_MAGIC)
-struct isc_timer {
+typedef struct isc__timer isc__timer_t;
+typedef struct isc__timermgr isc__timermgr_t;
+
+struct isc__timer {
/*! Not locked. */
- unsigned int magic;
- isc_timermgr_t * manager;
+ isc_timer_t common;
+ isc__timermgr_t * manager;
isc_mutex_t lock;
/*! Locked by timer lock. */
unsigned int references;
@@ -75,45 +91,119 @@ struct isc_timer {
void * arg;
unsigned int index;
isc_time_t due;
- LINK(isc_timer_t) link;
+ LINK(isc__timer_t) link;
};
#define TIMER_MANAGER_MAGIC ISC_MAGIC('T', 'I', 'M', 'M')
#define VALID_MANAGER(m) ISC_MAGIC_VALID(m, TIMER_MANAGER_MAGIC)
-struct isc_timermgr {
+struct isc__timermgr {
/* Not locked. */
- unsigned int magic;
+ isc_timermgr_t common;
isc_mem_t * mctx;
isc_mutex_t lock;
/* Locked by manager lock. */
isc_boolean_t done;
- LIST(isc_timer_t) timers;
+ LIST(isc__timer_t) timers;
unsigned int nscheduled;
isc_time_t due;
-#ifdef ISC_PLATFORM_USETHREADS
+#ifdef USE_TIMER_THREAD
isc_condition_t wakeup;
isc_thread_t thread;
-#else /* ISC_PLATFORM_USETHREADS */
+#endif /* USE_TIMER_THREAD */
+#ifdef USE_SHARED_MANAGER
unsigned int refs;
-#endif /* ISC_PLATFORM_USETHREADS */
+#endif /* USE_SHARED_MANAGER */
isc_heap_t * heap;
};
-#ifndef ISC_PLATFORM_USETHREADS
+/*%
+ * The followings can be either static or public, depending on build
+ * environment.
+ */
+
+#ifdef BIND9
+#define ISC_TIMERFUNC_SCOPE
+#else
+#define ISC_TIMERFUNC_SCOPE static
+#endif
+
+ISC_TIMERFUNC_SCOPE isc_result_t
+isc__timer_create(isc_timermgr_t *manager, isc_timertype_t type,
+ isc_time_t *expires, isc_interval_t *interval,
+ isc_task_t *task, isc_taskaction_t action, const void *arg,
+ isc_timer_t **timerp);
+ISC_TIMERFUNC_SCOPE isc_result_t
+isc__timer_reset(isc_timer_t *timer, isc_timertype_t type,
+ isc_time_t *expires, isc_interval_t *interval,
+ isc_boolean_t purge);
+ISC_TIMERFUNC_SCOPE isc_timertype_t
+isc__timer_gettype(isc_timer_t *timer);
+ISC_TIMERFUNC_SCOPE isc_result_t
+isc__timer_touch(isc_timer_t *timer);
+ISC_TIMERFUNC_SCOPE void
+isc__timer_attach(isc_timer_t *timer0, isc_timer_t **timerp);
+ISC_TIMERFUNC_SCOPE void
+isc__timer_detach(isc_timer_t **timerp);
+ISC_TIMERFUNC_SCOPE isc_result_t
+isc__timermgr_create(isc_mem_t *mctx, isc_timermgr_t **managerp);
+ISC_TIMERFUNC_SCOPE void
+isc__timermgr_poke(isc_timermgr_t *manager0);
+ISC_TIMERFUNC_SCOPE void
+isc__timermgr_destroy(isc_timermgr_t **managerp);
+
+static struct isc__timermethods {
+ isc_timermethods_t methods;
+
+ /*%
+ * The following are defined just for avoiding unused static functions.
+ */
+#ifndef BIND9
+ void *gettype;
+#endif
+} timermethods = {
+ {
+ isc__timer_attach,
+ isc__timer_detach,
+ isc__timer_reset,
+ isc__timer_touch
+ }
+#ifndef BIND9
+ ,
+ (void *)isc__timer_gettype
+#endif
+};
+
+static struct isc__timermgrmethods {
+ isc_timermgrmethods_t methods;
+#ifndef BIND9
+ void *poke; /* see above */
+#endif
+} timermgrmethods = {
+ {
+ isc__timermgr_destroy,
+ isc__timer_create
+ }
+#ifndef BIND9
+ ,
+ (void *)isc__timermgr_poke
+#endif
+};
+
+#ifdef USE_SHARED_MANAGER
/*!
- * If threads are not in use, there can be only one.
+ * If the manager is supposed to be shared, there can be only one.
*/
-static isc_timermgr_t *timermgr = NULL;
-#endif /* ISC_PLATFORM_USETHREADS */
+static isc__timermgr_t *timermgr = NULL;
+#endif /* USE_SHARED_MANAGER */
static inline isc_result_t
-schedule(isc_timer_t *timer, isc_time_t *now, isc_boolean_t signal_ok) {
+schedule(isc__timer_t *timer, isc_time_t *now, isc_boolean_t signal_ok) {
isc_result_t result;
- isc_timermgr_t *manager;
+ isc__timermgr_t *manager;
isc_time_t due;
int cmp;
-#ifdef ISC_PLATFORM_USETHREADS
+#ifdef USE_TIMER_THREAD
isc_boolean_t timedwait;
#endif
@@ -123,13 +213,13 @@ schedule(isc_timer_t *timer, isc_time_t *now, isc_boolean_t signal_ok) {
REQUIRE(timer->type != isc_timertype_inactive);
-#ifndef ISC_PLATFORM_USETHREADS
+#ifndef USE_TIMER_THREAD
UNUSED(signal_ok);
-#endif /* ISC_PLATFORM_USETHREADS */
+#endif /* USE_TIMER_THREAD */
manager = timer->manager;
-#ifdef ISC_PLATFORM_USETHREADS
+#ifdef USE_TIMER_THREAD
/*!
* If the manager was timed wait, we may need to signal the
* manager to force a wakeup.
@@ -199,7 +289,7 @@ schedule(isc_timer_t *timer, isc_time_t *now, isc_boolean_t signal_ok) {
* the current "next" timer. We do this either by waking up the
* run thread, or explicitly setting the value in the manager.
*/
-#ifdef ISC_PLATFORM_USETHREADS
+#ifdef USE_TIMER_THREAD
/*
* This is a temporary (probably) hack to fix a bug on tru64 5.1
@@ -232,19 +322,19 @@ schedule(isc_timer_t *timer, isc_time_t *now, isc_boolean_t signal_ok) {
"signal (schedule)"));
SIGNAL(&manager->wakeup);
}
-#else /* ISC_PLATFORM_USETHREADS */
+#else /* USE_TIMER_THREAD */
if (timer->index == 1 &&
isc_time_compare(&timer->due, &manager->due) < 0)
manager->due = timer->due;
-#endif /* ISC_PLATFORM_USETHREADS */
+#endif /* USE_TIMER_THREAD */
return (ISC_R_SUCCESS);
}
static inline void
-deschedule(isc_timer_t *timer) {
+deschedule(isc__timer_t *timer) {
isc_boolean_t need_wakeup = ISC_FALSE;
- isc_timermgr_t *manager;
+ isc__timermgr_t *manager;
/*
* The caller must ensure locking.
@@ -258,20 +348,20 @@ deschedule(isc_timer_t *timer) {
timer->index = 0;
INSIST(manager->nscheduled > 0);
manager->nscheduled--;
-#ifdef ISC_PLATFORM_USETHREADS
+#ifdef USE_TIMER_THREAD
if (need_wakeup) {
XTRACE(isc_msgcat_get(isc_msgcat, ISC_MSGSET_TIMER,
ISC_MSG_SIGNALDESCHED,
"signal (deschedule)"));
SIGNAL(&manager->wakeup);
}
-#endif /* ISC_PLATFORM_USETHREADS */
+#endif /* USE_TIMER_THREAD */
}
}
static void
-destroy(isc_timer_t *timer) {
- isc_timermgr_t *manager = timer->manager;
+destroy(isc__timer_t *timer) {
+ isc__timermgr_t *manager = timer->manager;
/*
* The caller must ensure it is safe to destroy the timer.
@@ -291,17 +381,19 @@ destroy(isc_timer_t *timer) {
isc_task_detach(&timer->task);
DESTROYLOCK(&timer->lock);
- timer->magic = 0;
+ timer->common.impmagic = 0;
+ timer->common.magic = 0;
isc_mem_put(manager->mctx, timer, sizeof(*timer));
}
-isc_result_t
-isc_timer_create(isc_timermgr_t *manager, isc_timertype_t type,
- isc_time_t *expires, isc_interval_t *interval,
- isc_task_t *task, isc_taskaction_t action, const void *arg,
- isc_timer_t **timerp)
+ISC_TIMERFUNC_SCOPE isc_result_t
+isc__timer_create(isc_timermgr_t *manager0, isc_timertype_t type,
+ isc_time_t *expires, isc_interval_t *interval,
+ isc_task_t *task, isc_taskaction_t action, const void *arg,
+ isc_timer_t **timerp)
{
- isc_timer_t *timer;
+ isc__timermgr_t *manager = (isc__timermgr_t *)manager0;
+ isc__timer_t *timer;
isc_result_t result;
isc_time_t now;
@@ -382,7 +474,9 @@ isc_timer_create(isc_timermgr_t *manager, isc_timertype_t type,
return (result);
}
ISC_LINK_INIT(timer, link);
- timer->magic = TIMER_MAGIC;
+ timer->common.impmagic = TIMER_MAGIC;
+ timer->common.magic = ISCAPI_TIMER_MAGIC;
+ timer->common.methods = (isc_timermethods_t *)&timermethods;
LOCK(&manager->lock);
@@ -401,25 +495,27 @@ isc_timer_create(isc_timermgr_t *manager, isc_timertype_t type,
UNLOCK(&manager->lock);
if (result != ISC_R_SUCCESS) {
- timer->magic = 0;
+ timer->common.impmagic = 0;
+ timer->common.magic = 0;
DESTROYLOCK(&timer->lock);
isc_task_detach(&timer->task);
isc_mem_put(manager->mctx, timer, sizeof(*timer));
return (result);
}
- *timerp = timer;
+ *timerp = (isc_timer_t *)timer;
return (ISC_R_SUCCESS);
}
-isc_result_t
-isc_timer_reset(isc_timer_t *timer, isc_timertype_t type,
- isc_time_t *expires, isc_interval_t *interval,
- isc_boolean_t purge)
+ISC_TIMERFUNC_SCOPE isc_result_t
+isc__timer_reset(isc_timer_t *timer0, isc_timertype_t type,
+ isc_time_t *expires, isc_interval_t *interval,
+ isc_boolean_t purge)
{
+ isc__timer_t *timer = (isc__timer_t *)timer0;
isc_time_t now;
- isc_timermgr_t *manager;
+ isc__timermgr_t *manager;
isc_result_t result;
/*
@@ -489,8 +585,9 @@ isc_timer_reset(isc_timer_t *timer, isc_timertype_t type,
return (result);
}
-isc_timertype_t
-isc_timer_gettype(isc_timer_t *timer) {
+ISC_TIMERFUNC_SCOPE isc_timertype_t
+isc__timer_gettype(isc_timer_t *timer0) {
+ isc__timer_t *timer = (isc__timer_t *)timer0;
isc_timertype_t t;
REQUIRE(VALID_TIMER(timer));
@@ -502,8 +599,9 @@ isc_timer_gettype(isc_timer_t *timer) {
return (t);
}
-isc_result_t
-isc_timer_touch(isc_timer_t *timer) {
+ISC_TIMERFUNC_SCOPE isc_result_t
+isc__timer_touch(isc_timer_t *timer0) {
+ isc__timer_t *timer = (isc__timer_t *)timer0;
isc_result_t result;
isc_time_t now;
@@ -532,8 +630,10 @@ isc_timer_touch(isc_timer_t *timer) {
return (result);
}
-void
-isc_timer_attach(isc_timer_t *timer, isc_timer_t **timerp) {
+ISC_TIMERFUNC_SCOPE void
+isc__timer_attach(isc_timer_t *timer0, isc_timer_t **timerp) {
+ isc__timer_t *timer = (isc__timer_t *)timer0;
+
/*
* Attach *timerp to timer.
*/
@@ -545,12 +645,12 @@ isc_timer_attach(isc_timer_t *timer, isc_timer_t **timerp) {
timer->references++;
UNLOCK(&timer->lock);
- *timerp = timer;
+ *timerp = (isc_timer_t *)timer;
}
-void
-isc_timer_detach(isc_timer_t **timerp) {
- isc_timer_t *timer;
+ISC_TIMERFUNC_SCOPE void
+isc__timer_detach(isc_timer_t **timerp) {
+ isc__timer_t *timer;
isc_boolean_t free_timer = ISC_FALSE;
/*
@@ -558,7 +658,7 @@ isc_timer_detach(isc_timer_t **timerp) {
*/
REQUIRE(timerp != NULL);
- timer = *timerp;
+ timer = (isc__timer_t *)*timerp;
REQUIRE(VALID_TIMER(timer));
LOCK(&timer->lock);
@@ -575,11 +675,11 @@ isc_timer_detach(isc_timer_t **timerp) {
}
static void
-dispatch(isc_timermgr_t *manager, isc_time_t *now) {
+dispatch(isc__timermgr_t *manager, isc_time_t *now) {
isc_boolean_t done = ISC_FALSE, post_event, need_schedule;
isc_timerevent_t *event;
isc_eventtype_t type = 0;
- isc_timer_t *timer;
+ isc__timer_t *timer;
isc_result_t result;
isc_boolean_t idle;
@@ -693,13 +793,13 @@ dispatch(isc_timermgr_t *manager, isc_time_t *now) {
}
}
-#ifdef ISC_PLATFORM_USETHREADS
+#ifdef USE_TIMER_THREAD
static isc_threadresult_t
#ifdef _WIN32 /* XXXDCL */
WINAPI
#endif
run(void *uap) {
- isc_timermgr_t *manager = uap;
+ isc__timermgr_t *manager = uap;
isc_time_t now;
isc_result_t result;
@@ -732,13 +832,17 @@ run(void *uap) {
}
UNLOCK(&manager->lock);
+#ifdef OPENSSL_LEAKS
+ ERR_remove_state(0);
+#endif
+
return ((isc_threadresult_t)0);
}
-#endif /* ISC_PLATFORM_USETHREADS */
+#endif /* USE_TIMER_THREAD */
static isc_boolean_t
sooner(void *v1, void *v2) {
- isc_timer_t *t1, *t2;
+ isc__timer_t *t1, *t2;
t1 = v1;
t2 = v2;
@@ -752,7 +856,7 @@ sooner(void *v1, void *v2) {
static void
set_index(void *what, unsigned int index) {
- isc_timer_t *timer;
+ isc__timer_t *timer;
timer = what;
REQUIRE(VALID_TIMER(timer));
@@ -760,9 +864,9 @@ set_index(void *what, unsigned int index) {
timer->index = index;
}
-isc_result_t
-isc_timermgr_create(isc_mem_t *mctx, isc_timermgr_t **managerp) {
- isc_timermgr_t *manager;
+ISC_TIMERFUNC_SCOPE isc_result_t
+isc__timermgr_create(isc_mem_t *mctx, isc_timermgr_t **managerp) {
+ isc__timermgr_t *manager;
isc_result_t result;
/*
@@ -771,19 +875,21 @@ isc_timermgr_create(isc_mem_t *mctx, isc_timermgr_t **managerp) {
REQUIRE(managerp != NULL && *managerp == NULL);
-#ifndef ISC_PLATFORM_USETHREADS
+#ifdef USE_SHARED_MANAGER
if (timermgr != NULL) {
timermgr->refs++;
- *managerp = timermgr;
+ *managerp = (isc_timermgr_t *)timermgr;
return (ISC_R_SUCCESS);
}
-#endif /* ISC_PLATFORM_USETHREADS */
+#endif /* USE_SHARED_MANAGER */
manager = isc_mem_get(mctx, sizeof(*manager));
if (manager == NULL)
return (ISC_R_NOMEMORY);
- manager->magic = TIMER_MANAGER_MAGIC;
+ manager->common.impmagic = TIMER_MANAGER_MAGIC;
+ manager->common.magic = ISCAPI_TIMERMGR_MAGIC;
+ manager->common.methods = (isc_timermgrmethods_t *)&timermgrmethods;
manager->mctx = NULL;
manager->done = ISC_FALSE;
INIT_LIST(manager->timers);
@@ -803,7 +909,7 @@ isc_timermgr_create(isc_mem_t *mctx, isc_timermgr_t **managerp) {
return (result);
}
isc_mem_attach(mctx, &manager->mctx);
-#ifdef ISC_PLATFORM_USETHREADS
+#ifdef USE_TIMER_THREAD
if (isc_condition_init(&manager->wakeup) != ISC_R_SUCCESS) {
isc_mem_detach(&manager->mctx);
DESTROYLOCK(&manager->lock);
@@ -828,30 +934,33 @@ isc_timermgr_create(isc_mem_t *mctx, isc_timermgr_t **managerp) {
ISC_MSG_FAILED, "failed"));
return (ISC_R_UNEXPECTED);
}
-#else /* ISC_PLATFORM_USETHREADS */
+#endif
+#ifdef USE_SHARED_MANAGER
manager->refs = 1;
timermgr = manager;
-#endif /* ISC_PLATFORM_USETHREADS */
+#endif /* USE_SHARED_MANAGER */
- *managerp = manager;
+ *managerp = (isc_timermgr_t *)manager;
return (ISC_R_SUCCESS);
}
-void
-isc_timermgr_poke(isc_timermgr_t *manager) {
-#ifdef ISC_PLATFORM_USETHREADS
+ISC_TIMERFUNC_SCOPE void
+isc__timermgr_poke(isc_timermgr_t *manager0) {
+#ifdef USE_TIMER_THREAD
+ isc__timermgr_t *manager = (isc__timermgr_t *)manager0;
+
REQUIRE(VALID_MANAGER(manager));
SIGNAL(&manager->wakeup);
#else
- UNUSED(manager);
+ UNUSED(manager0);
#endif
}
-void
-isc_timermgr_destroy(isc_timermgr_t **managerp) {
- isc_timermgr_t *manager;
+ISC_TIMERFUNC_SCOPE void
+isc__timermgr_destroy(isc_timermgr_t **managerp) {
+ isc__timermgr_t *manager;
isc_mem_t *mctx;
/*
@@ -859,34 +968,37 @@ isc_timermgr_destroy(isc_timermgr_t **managerp) {
*/
REQUIRE(managerp != NULL);
- manager = *managerp;
+ manager = (isc__timermgr_t *)*managerp;
REQUIRE(VALID_MANAGER(manager));
LOCK(&manager->lock);
-#ifndef ISC_PLATFORM_USETHREADS
- if (manager->refs > 1) {
- manager->refs--;
+#ifdef USE_SHARED_MANAGER
+ manager->refs--;
+ if (manager->refs > 0) {
UNLOCK(&manager->lock);
*managerp = NULL;
return;
}
+ timermgr = NULL;
+#endif /* USE_SHARED_MANAGER */
- isc__timermgr_dispatch();
-#endif /* ISC_PLATFORM_USETHREADS */
+#ifndef USE_TIMER_THREAD
+ isc__timermgr_dispatch((isc_timermgr_t *)manager);
+#endif
REQUIRE(EMPTY(manager->timers));
manager->done = ISC_TRUE;
-#ifdef ISC_PLATFORM_USETHREADS
+#ifdef USE_TIMER_THREAD
XTRACE(isc_msgcat_get(isc_msgcat, ISC_MSGSET_TIMER,
ISC_MSG_SIGNALDESTROY, "signal (destroy)"));
SIGNAL(&manager->wakeup);
-#endif /* ISC_PLATFORM_USETHREADS */
+#endif /* USE_TIMER_THREAD */
UNLOCK(&manager->lock);
-#ifdef ISC_PLATFORM_USETHREADS
+#ifdef USE_TIMER_THREAD
/*
* Wait for thread to exit.
*/
@@ -895,39 +1007,63 @@ isc_timermgr_destroy(isc_timermgr_t **managerp) {
"isc_thread_join() %s",
isc_msgcat_get(isc_msgcat, ISC_MSGSET_GENERAL,
ISC_MSG_FAILED, "failed"));
-#endif /* ISC_PLATFORM_USETHREADS */
+#endif /* USE_TIMER_THREAD */
/*
* Clean up.
*/
-#ifdef ISC_PLATFORM_USETHREADS
+#ifdef USE_TIMER_THREAD
(void)isc_condition_destroy(&manager->wakeup);
-#endif /* ISC_PLATFORM_USETHREADS */
+#endif /* USE_TIMER_THREAD */
DESTROYLOCK(&manager->lock);
isc_heap_destroy(&manager->heap);
- manager->magic = 0;
+ manager->common.impmagic = 0;
+ manager->common.magic = 0;
mctx = manager->mctx;
isc_mem_put(mctx, manager, sizeof(*manager));
isc_mem_detach(&mctx);
*managerp = NULL;
+
+#ifdef USE_SHARED_MANAGER
+ timermgr = NULL;
+#endif
}
-#ifndef ISC_PLATFORM_USETHREADS
+#ifndef USE_TIMER_THREAD
isc_result_t
-isc__timermgr_nextevent(isc_time_t *when) {
- if (timermgr == NULL || timermgr->nscheduled == 0)
+isc__timermgr_nextevent(isc_timermgr_t *manager0, isc_time_t *when) {
+ isc__timermgr_t *manager = (isc__timermgr_t *)manager0;
+
+#ifdef USE_SHARED_MANAGER
+ if (manager == NULL)
+ manager = timermgr;
+#endif
+ if (manager == NULL || manager->nscheduled == 0)
return (ISC_R_NOTFOUND);
- *when = timermgr->due;
+ *when = manager->due;
return (ISC_R_SUCCESS);
}
void
-isc__timermgr_dispatch(void) {
+isc__timermgr_dispatch(isc_timermgr_t *manager0) {
+ isc__timermgr_t *manager = (isc__timermgr_t *)manager0;
isc_time_t now;
- if (timermgr == NULL)
+
+#ifdef USE_SHARED_MANAGER
+ if (manager == NULL)
+ manager = timermgr;
+#endif
+ if (manager == NULL)
return;
TIME_NOW(&now);
- dispatch(timermgr, &now);
+ dispatch(manager, &now);
}
-#endif /* ISC_PLATFORM_USETHREADS */
+#endif /* USE_TIMER_THREAD */
+
+#ifdef USE_TIMERIMPREGISTER
+isc_result_t
+isc__timer_register() {
+ return (isc_timer_register(isc__timermgr_create));
+}
+#endif
diff --git a/contrib/bind9/lib/isc/timer_api.c b/contrib/bind9/lib/isc/timer_api.c
new file mode 100644
index 0000000..5a9bf9d
--- /dev/null
+++ b/contrib/bind9/lib/isc/timer_api.c
@@ -0,0 +1,144 @@
+/*
+ * Copyright (C) 2009 Internet Systems Consortium, Inc. ("ISC")
+ *
+ * Permission to use, copy, modify, and/or 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 ISC DISCLAIMS ALL WARRANTIES WITH
+ * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+ * AND FITNESS. IN NO EVENT SHALL ISC 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.
+ */
+
+/* $Id: timer_api.c,v 1.4 2009-09-02 23:48:02 tbox Exp $ */
+
+#include <config.h>
+
+#include <unistd.h>
+
+#include <isc/app.h>
+#include <isc/magic.h>
+#include <isc/mutex.h>
+#include <isc/once.h>
+#include <isc/timer.h>
+#include <isc/util.h>
+
+static isc_mutex_t createlock;
+static isc_once_t once = ISC_ONCE_INIT;
+static isc_timermgrcreatefunc_t timermgr_createfunc = NULL;
+
+static void
+initialize(void) {
+ RUNTIME_CHECK(isc_mutex_init(&createlock) == ISC_R_SUCCESS);
+}
+
+isc_result_t
+isc_timer_register(isc_timermgrcreatefunc_t createfunc) {
+ isc_result_t result = ISC_R_SUCCESS;
+
+ RUNTIME_CHECK(isc_once_do(&once, initialize) == ISC_R_SUCCESS);
+
+ LOCK(&createlock);
+ if (timermgr_createfunc == NULL)
+ timermgr_createfunc = createfunc;
+ else
+ result = ISC_R_EXISTS;
+ UNLOCK(&createlock);
+
+ return (result);
+}
+
+isc_result_t
+isc_timermgr_createinctx(isc_mem_t *mctx, isc_appctx_t *actx,
+ isc_timermgr_t **managerp)
+{
+ isc_result_t result;
+
+ LOCK(&createlock);
+
+ REQUIRE(timermgr_createfunc != NULL);
+ result = (*timermgr_createfunc)(mctx, managerp);
+
+ UNLOCK(&createlock);
+
+ if (result == ISC_R_SUCCESS)
+ isc_appctx_settimermgr(actx, *managerp);
+
+ return (result);
+}
+
+isc_result_t
+isc_timermgr_create(isc_mem_t *mctx, isc_timermgr_t **managerp) {
+ isc_result_t result;
+
+ LOCK(&createlock);
+
+ REQUIRE(timermgr_createfunc != NULL);
+ result = (*timermgr_createfunc)(mctx, managerp);
+
+ UNLOCK(&createlock);
+
+ return (result);
+}
+
+void
+isc_timermgr_destroy(isc_timermgr_t **managerp) {
+ REQUIRE(*managerp != NULL && ISCAPI_TIMERMGR_VALID(*managerp));
+
+ (*managerp)->methods->destroy(managerp);
+
+ ENSURE(*managerp == NULL);
+}
+
+isc_result_t
+isc_timer_create(isc_timermgr_t *manager, isc_timertype_t type,
+ isc_time_t *expires, isc_interval_t *interval,
+ isc_task_t *task, isc_taskaction_t action, const void *arg,
+ isc_timer_t **timerp)
+{
+ REQUIRE(ISCAPI_TIMERMGR_VALID(manager));
+
+ return (manager->methods->timercreate(manager, type, expires,
+ interval, task, action, arg,
+ timerp));
+}
+
+void
+isc_timer_attach(isc_timer_t *timer, isc_timer_t **timerp) {
+ REQUIRE(ISCAPI_TIMER_VALID(timer));
+ REQUIRE(timerp != NULL && *timerp == NULL);
+
+ timer->methods->attach(timer, timerp);
+
+ ENSURE(*timerp == timer);
+}
+
+void
+isc_timer_detach(isc_timer_t **timerp) {
+ REQUIRE(timerp != NULL && ISCAPI_TIMER_VALID(*timerp));
+
+ (*timerp)->methods->detach(timerp);
+
+ ENSURE(*timerp == NULL);
+}
+
+isc_result_t
+isc_timer_reset(isc_timer_t *timer, isc_timertype_t type,
+ isc_time_t *expires, isc_interval_t *interval,
+ isc_boolean_t purge)
+{
+ REQUIRE(ISCAPI_TIMER_VALID(timer));
+
+ return (timer->methods->reset(timer, type, expires, interval, purge));
+}
+
+isc_result_t
+isc_timer_touch(isc_timer_t *timer) {
+ REQUIRE(ISCAPI_TIMER_VALID(timer));
+
+ return (timer->methods->touch(timer));
+}
diff --git a/contrib/bind9/lib/isc/timer_p.h b/contrib/bind9/lib/isc/timer_p.h
index b41f922..657b695 100644
--- a/contrib/bind9/lib/isc/timer_p.h
+++ b/contrib/bind9/lib/isc/timer_p.h
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004, 2005, 2007 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004, 2005, 2007, 2009 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 2000, 2001 Internet Software Consortium.
*
* Permission to use, copy, modify, and/or distribute this software for any
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: timer_p.h,v 1.10 2007-06-19 23:47:17 tbox Exp $ */
+/* $Id: timer_p.h,v 1.12 2009-09-02 23:48:02 tbox Exp $ */
#ifndef ISC_TIMER_P_H
#define ISC_TIMER_P_H
@@ -23,9 +23,9 @@
/*! \file */
isc_result_t
-isc__timermgr_nextevent(isc_time_t *when);
+isc__timermgr_nextevent(isc_timermgr_t *timermgr, isc_time_t *when);
void
-isc__timermgr_dispatch(void);
+isc__timermgr_dispatch(isc_timermgr_t *timermgr);
#endif /* ISC_TIMER_P_H */
diff --git a/contrib/bind9/lib/isc/unix/Makefile.in b/contrib/bind9/lib/isc/unix/Makefile.in
index 7d23b96..2c91756 100644
--- a/contrib/bind9/lib/isc/unix/Makefile.in
+++ b/contrib/bind9/lib/isc/unix/Makefile.in
@@ -1,4 +1,4 @@
-# Copyright (C) 2004, 2007 Internet Systems Consortium, Inc. ("ISC")
+# Copyright (C) 2004, 2007, 2009 Internet Systems Consortium, Inc. ("ISC")
# Copyright (C) 1998-2001 Internet Software Consortium.
#
# Permission to use, copy, modify, and/or distribute this software for any
@@ -13,7 +13,7 @@
# OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
# PERFORMANCE OF THIS SOFTWARE.
-# $Id: Makefile.in,v 1.41 2007-06-19 23:47:18 tbox Exp $
+# $Id: Makefile.in,v 1.44 2009-12-05 23:31:41 each Exp $
srcdir = @srcdir@
VPATH = @srcdir@
diff --git a/contrib/bind9/lib/isc/unix/app.c b/contrib/bind9/lib/isc/unix/app.c
index 6bd1660..4dc5130 100644
--- a/contrib/bind9/lib/isc/unix/app.c
+++ b/contrib/bind9/lib/isc/unix/app.c
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004, 2005, 2007, 2008 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004, 2005, 2007-2009 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 1999-2003 Internet Software Consortium.
*
* Permission to use, copy, modify, and/or distribute this software for any
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: app.c,v 1.60 2008-10-15 03:41:17 marka Exp $ */
+/* $Id: app.c,v 1.64 2009-11-04 05:58:46 marka Exp $ */
/*! \file */
@@ -37,6 +37,7 @@
#include <isc/app.h>
#include <isc/boolean.h>
#include <isc/condition.h>
+#include <isc/mem.h>
#include <isc/msgs.h>
#include <isc/mutex.h>
#include <isc/event.h>
@@ -47,31 +48,129 @@
#include <isc/time.h>
#include <isc/util.h>
+/*%
+ * For BIND9 internal applications built with threads, we use a single app
+ * context and let multiple worker, I/O, timer threads do actual jobs.
+ * For other cases (including BIND9 built without threads) an app context acts
+ * as an event loop dispatching various events.
+ */
+#if defined(ISC_PLATFORM_USETHREADS) && defined(BIND9)
+#define USE_THREADS_SINGLECTX
+#endif
+
#ifdef ISC_PLATFORM_USETHREADS
#include <pthread.h>
-#else /* ISC_PLATFORM_USETHREADS */
+#endif
+
+#ifndef USE_THREADS_SINGLECTX
#include "../timer_p.h"
#include "../task_p.h"
#include "socket_p.h"
+#endif /* USE_THREADS_SINGLECTX */
+
+#ifdef ISC_PLATFORM_USETHREADS
+static pthread_t blockedthread;
#endif /* ISC_PLATFORM_USETHREADS */
-static isc_eventlist_t on_run;
-static isc_mutex_t lock;
-static isc_boolean_t shutdown_requested = ISC_FALSE;
-static isc_boolean_t running = ISC_FALSE;
-/*!
- * We assume that 'want_shutdown' can be read and written atomically.
+/*%
+ * The following can be either static or public, depending on build environment.
*/
-static volatile isc_boolean_t want_shutdown = ISC_FALSE;
+
+#ifdef BIND9
+#define ISC_APPFUNC_SCOPE
+#else
+#define ISC_APPFUNC_SCOPE static
+#endif
+
+ISC_APPFUNC_SCOPE isc_result_t isc__app_start(void);
+ISC_APPFUNC_SCOPE isc_result_t isc__app_ctxstart(isc_appctx_t *ctx);
+ISC_APPFUNC_SCOPE isc_result_t isc__app_onrun(isc_mem_t *mctx,
+ isc_task_t *task,
+ isc_taskaction_t action,
+ void *arg);
+ISC_APPFUNC_SCOPE isc_result_t isc__app_ctxrun(isc_appctx_t *ctx);
+ISC_APPFUNC_SCOPE isc_result_t isc__app_run(void);
+ISC_APPFUNC_SCOPE isc_result_t isc__app_ctxshutdown(isc_appctx_t *ctx);
+ISC_APPFUNC_SCOPE isc_result_t isc__app_shutdown(void);
+ISC_APPFUNC_SCOPE isc_result_t isc__app_reload(void);
+ISC_APPFUNC_SCOPE isc_result_t isc__app_ctxsuspend(isc_appctx_t *ctx);
+ISC_APPFUNC_SCOPE void isc__app_ctxfinish(isc_appctx_t *ctx);
+ISC_APPFUNC_SCOPE void isc__app_finish(void);
+ISC_APPFUNC_SCOPE void isc__app_block(void);
+ISC_APPFUNC_SCOPE void isc__app_unblock(void);
+ISC_APPFUNC_SCOPE isc_result_t isc__appctx_create(isc_mem_t *mctx,
+ isc_appctx_t **ctxp);
+ISC_APPFUNC_SCOPE void isc__appctx_destroy(isc_appctx_t **ctxp);
+ISC_APPFUNC_SCOPE void isc__appctx_settaskmgr(isc_appctx_t *ctx,
+ isc_taskmgr_t *taskmgr);
+ISC_APPFUNC_SCOPE void isc__appctx_setsocketmgr(isc_appctx_t *ctx,
+ isc_socketmgr_t *socketmgr);
+ISC_APPFUNC_SCOPE void isc__appctx_settimermgr(isc_appctx_t *ctx,
+ isc_timermgr_t *timermgr);
+
/*
- * We assume that 'want_reload' can be read and written atomically.
+ * The application context of this module. This implementation actually
+ * doesn't use it. (This may change in the future).
*/
-static volatile isc_boolean_t want_reload = ISC_FALSE;
+#define APPCTX_MAGIC ISC_MAGIC('A', 'p', 'c', 'x')
+#define VALID_APPCTX(c) ISC_MAGIC_VALID(c, APPCTX_MAGIC)
+
+typedef struct isc__appctx {
+ isc_appctx_t common;
+ isc_mem_t *mctx;
+ isc_mutex_t lock;
+ isc_eventlist_t on_run;
+ isc_boolean_t shutdown_requested;
+ isc_boolean_t running;
+
+ /*!
+ * We assume that 'want_shutdown' can be read and written atomically.
+ */
+ isc_boolean_t want_shutdown;
+ /*
+ * We assume that 'want_reload' can be read and written atomically.
+ */
+ isc_boolean_t want_reload;
-static isc_boolean_t blocked = ISC_FALSE;
-#ifdef ISC_PLATFORM_USETHREADS
-static pthread_t blockedthread;
-#endif /* ISC_PLATFORM_USETHREADS */
+ isc_boolean_t blocked;
+
+ isc_taskmgr_t *taskmgr;
+ isc_socketmgr_t *socketmgr;
+ isc_timermgr_t *timermgr;
+} isc__appctx_t;
+
+static isc__appctx_t isc_g_appctx;
+
+static struct {
+ isc_appmethods_t methods;
+
+ /*%
+ * The following are defined just for avoiding unused static functions.
+ */
+#ifndef BIND9
+ void *run, *shutdown, *start, *onrun, *reload, *finish,
+ *block, *unblock;
+#endif
+} appmethods = {
+ {
+ isc__appctx_destroy,
+ isc__app_ctxstart,
+ isc__app_ctxrun,
+ isc__app_ctxsuspend,
+ isc__app_ctxshutdown,
+ isc__app_ctxfinish,
+ isc__appctx_settaskmgr,
+ isc__appctx_setsocketmgr,
+ isc__appctx_settimermgr
+ }
+#ifndef BIND9
+ ,
+ (void *)isc__app_run, (void *)isc__app_shutdown,
+ (void *)isc__app_start, (void *)isc__app_onrun, (void *)isc__app_reload,
+ (void *)isc__app_finish, (void *)isc__app_block,
+ (void *)isc__app_unblock
+#endif
+};
#ifdef HAVE_LINUXTHREADS
/*!
@@ -91,13 +190,13 @@ static pthread_t main_thread;
static void
exit_action(int arg) {
UNUSED(arg);
- want_shutdown = ISC_TRUE;
+ isc_g_appctx.want_shutdown = ISC_TRUE;
}
static void
reload_action(int arg) {
UNUSED(arg);
- want_reload = ISC_TRUE;
+ isc_g_appctx.want_reload = ISC_TRUE;
}
#endif
@@ -123,12 +222,12 @@ handle_signal(int sig, void (*handler)(int)) {
return (ISC_R_SUCCESS);
}
-isc_result_t
-isc_app_start(void) {
+ISC_APPFUNC_SCOPE isc_result_t
+isc__app_ctxstart(isc_appctx_t *ctx0) {
+ isc__appctx_t *ctx = (isc__appctx_t *)ctx0;
isc_result_t result;
- int presult;
- sigset_t sset;
- char strbuf[ISC_STRERRORSIZE];
+
+ REQUIRE(VALID_APPCTX(ctx));
/*
* Start an ISC library application.
@@ -151,7 +250,35 @@ isc_app_start(void) {
main_thread = pthread_self();
#endif
- result = isc_mutex_init(&lock);
+ result = isc_mutex_init(&ctx->lock);
+ if (result != ISC_R_SUCCESS)
+ return (result);
+
+ ISC_LIST_INIT(ctx->on_run);
+
+ ctx->shutdown_requested = ISC_FALSE;
+ ctx->running = ISC_FALSE;
+ ctx->want_shutdown = ISC_FALSE;
+ ctx->want_reload = ISC_FALSE;
+ ctx->blocked = ISC_FALSE;
+
+ return (ISC_R_SUCCESS);
+}
+
+ISC_APPFUNC_SCOPE isc_result_t
+isc__app_start(void) {
+ isc_result_t result;
+ int presult;
+ sigset_t sset;
+ char strbuf[ISC_STRERRORSIZE];
+
+ isc_g_appctx.common.impmagic = APPCTX_MAGIC;
+ isc_g_appctx.common.magic = ISCAPI_APPCTX_MAGIC;
+ isc_g_appctx.common.methods = &appmethods.methods;
+ isc_g_appctx.mctx = NULL;
+ /* The remaining members will be initialized in ctxstart() */
+
+ result = isc__app_ctxstart((isc_appctx_t *)&isc_g_appctx);
if (result != ISC_R_SUCCESS)
return (result);
@@ -253,22 +380,20 @@ isc_app_start(void) {
}
#endif /* ISC_PLATFORM_USETHREADS */
- ISC_LIST_INIT(on_run);
-
return (ISC_R_SUCCESS);
}
-isc_result_t
-isc_app_onrun(isc_mem_t *mctx, isc_task_t *task, isc_taskaction_t action,
+ISC_APPFUNC_SCOPE isc_result_t
+isc__app_onrun(isc_mem_t *mctx, isc_task_t *task, isc_taskaction_t action,
void *arg)
{
isc_event_t *event;
isc_task_t *cloned_task = NULL;
isc_result_t result;
- LOCK(&lock);
+ LOCK(&isc_g_appctx.lock);
- if (running) {
+ if (isc_g_appctx.running) {
result = ISC_R_ALREADYRUNNING;
goto unlock;
}
@@ -285,24 +410,25 @@ isc_app_onrun(isc_mem_t *mctx, isc_task_t *task, isc_taskaction_t action,
goto unlock;
}
- ISC_LIST_APPEND(on_run, event, ev_link);
+ ISC_LIST_APPEND(isc_g_appctx.on_run, event, ev_link);
result = ISC_R_SUCCESS;
unlock:
- UNLOCK(&lock);
+ UNLOCK(&isc_g_appctx.lock);
return (result);
}
-#ifndef ISC_PLATFORM_USETHREADS
+#ifndef USE_THREADS_SINGLECTX
/*!
* Event loop for nonthreaded programs.
*/
static isc_result_t
-evloop(void) {
+evloop(isc__appctx_t *ctx) {
isc_result_t result;
- while (!want_shutdown) {
+
+ while (!ctx->want_shutdown) {
int n;
isc_time_t when, now;
struct timeval tv, *tvp;
@@ -310,14 +436,27 @@ evloop(void) {
isc_boolean_t readytasks;
isc_boolean_t call_timer_dispatch = ISC_FALSE;
- readytasks = isc__taskmgr_ready();
+ /*
+ * Check the reload (or suspend) case first for exiting the
+ * loop as fast as possible in case:
+ * - the direct call to isc__taskmgr_dispatch() in
+ * isc__app_ctxrun() completes all the tasks so far,
+ * - there is thus currently no active task, and
+ * - there is a timer event
+ */
+ if (ctx->want_reload) {
+ ctx->want_reload = ISC_FALSE;
+ return (ISC_R_RELOAD);
+ }
+
+ readytasks = isc__taskmgr_ready(ctx->taskmgr);
if (readytasks) {
tv.tv_sec = 0;
tv.tv_usec = 0;
tvp = &tv;
call_timer_dispatch = ISC_TRUE;
} else {
- result = isc__timermgr_nextevent(&when);
+ result = isc__timermgr_nextevent(ctx->timermgr, &when);
if (result != ISC_R_SUCCESS)
tvp = NULL;
else {
@@ -334,7 +473,7 @@ evloop(void) {
}
swait = NULL;
- n = isc__socketmgr_waitevents(tvp, &swait);
+ n = isc__socketmgr_waitevents(ctx->socketmgr, tvp, &swait);
if (n == 0 || call_timer_dispatch) {
/*
@@ -351,20 +490,17 @@ evloop(void) {
* call, since this loop only runs in the non-thread
* mode.
*/
- isc__timermgr_dispatch();
+ isc__timermgr_dispatch(ctx->timermgr);
}
if (n > 0)
- (void)isc__socketmgr_dispatch(swait);
- (void)isc__taskmgr_dispatch();
-
- if (want_reload) {
- want_reload = ISC_FALSE;
- return (ISC_R_RELOAD);
- }
+ (void)isc__socketmgr_dispatch(ctx->socketmgr, swait);
+ (void)isc__taskmgr_dispatch(ctx->taskmgr);
}
return (ISC_R_SUCCESS);
}
+#endif /* USE_THREADS_SINGLECTX */
+#ifndef ISC_PLATFORM_USETHREADS
/*
* This is a gross hack to support waiting for condition
* variables in nonthreaded programs in a limited way;
@@ -400,11 +536,11 @@ isc__nothread_wait_hack(isc_condition_t *cp, isc_mutex_t *mp) {
INSIST(*mp == 1); /* Mutex must be locked on entry. */
--*mp;
- result = evloop();
+ result = evloop(&isc_g_appctx);
if (result == ISC_R_RELOAD)
- want_reload = ISC_TRUE;
+ isc_g_appctx.want_reload = ISC_TRUE;
if (signalled) {
- want_shutdown = ISC_FALSE;
+ isc_g_appctx.want_shutdown = ISC_FALSE;
signalled = ISC_FALSE;
}
@@ -420,43 +556,46 @@ isc__nothread_signal_hack(isc_condition_t *cp) {
INSIST(in_recursive_evloop);
- want_shutdown = ISC_TRUE;
+ isc_g_appctx.want_shutdown = ISC_TRUE;
signalled = ISC_TRUE;
return (ISC_R_SUCCESS);
}
#endif /* ISC_PLATFORM_USETHREADS */
-isc_result_t
-isc_app_run(void) {
+ISC_APPFUNC_SCOPE isc_result_t
+isc__app_ctxrun(isc_appctx_t *ctx0) {
+ isc__appctx_t *ctx = (isc__appctx_t *)ctx0;
int result;
isc_event_t *event, *next_event;
isc_task_t *task;
-#ifdef ISC_PLATFORM_USETHREADS
+#ifdef USE_THREADS_SINGLECTX
sigset_t sset;
char strbuf[ISC_STRERRORSIZE];
#ifdef HAVE_SIGWAIT
int sig;
#endif
-#endif /* ISC_PLATFORM_USETHREADS */
+#endif /* USE_THREADS_SINGLECTX */
+
+ REQUIRE(VALID_APPCTX(ctx));
#ifdef HAVE_LINUXTHREADS
REQUIRE(main_thread == pthread_self());
#endif
- LOCK(&lock);
+ LOCK(&ctx->lock);
- if (!running) {
- running = ISC_TRUE;
+ if (!ctx->running) {
+ ctx->running = ISC_TRUE;
/*
* Post any on-run events (in FIFO order).
*/
- for (event = ISC_LIST_HEAD(on_run);
+ for (event = ISC_LIST_HEAD(ctx->on_run);
event != NULL;
event = next_event) {
next_event = ISC_LIST_NEXT(event, ev_link);
- ISC_LIST_UNLINK(on_run, event, ev_link);
+ ISC_LIST_UNLINK(ctx->on_run, event, ev_link);
task = event->ev_sender;
event->ev_sender = NULL;
isc_task_sendanddetach(&task, &event);
@@ -464,7 +603,7 @@ isc_app_run(void) {
}
- UNLOCK(&lock);
+ UNLOCK(&ctx->lock);
#ifndef HAVE_SIGWAIT
/*
@@ -473,19 +612,27 @@ isc_app_run(void) {
* We do this here to ensure that the signal handler is installed
* (i.e. that it wasn't a "one-shot" handler).
*/
- result = handle_signal(SIGHUP, reload_action);
- if (result != ISC_R_SUCCESS)
- return (ISC_R_SUCCESS);
+ if (ctx == &isc_g_appctx) {
+ result = handle_signal(SIGHUP, reload_action);
+ if (result != ISC_R_SUCCESS)
+ return (ISC_R_SUCCESS);
+ }
#endif
-#ifdef ISC_PLATFORM_USETHREADS
+#ifdef USE_THREADS_SINGLECTX
+ /*
+ * When we are using multiple contexts, we don't rely on signals.
+ */
+ if (ctx != &isc_g_appctx)
+ return (ISC_R_SUCCESS);
+
/*
* There is no danger if isc_app_shutdown() is called before we wait
* for signals. Signals are blocked, so any such signal will simply
* be made pending and we will get it when we call sigwait().
*/
- while (!want_shutdown) {
+ while (!ctx->want_shutdown) {
#ifdef HAVE_SIGWAIT
/*
* Wait for SIGHUP, SIGINT, or SIGTERM.
@@ -503,21 +650,19 @@ isc_app_run(void) {
#ifndef HAVE_UNIXWARE_SIGWAIT
result = sigwait(&sset, &sig);
if (result == 0) {
- if (sig == SIGINT ||
- sig == SIGTERM)
- want_shutdown = ISC_TRUE;
+ if (sig == SIGINT || sig == SIGTERM)
+ ctx->want_shutdown = ISC_TRUE;
else if (sig == SIGHUP)
- want_reload = ISC_TRUE;
+ ctx->want_reload = ISC_TRUE;
}
#else /* Using UnixWare sigwait semantics. */
sig = sigwait(&sset);
if (sig >= 0) {
- if (sig == SIGINT ||
- sig == SIGTERM)
- want_shutdown = ISC_TRUE;
+ if (sig == SIGINT || sig == SIGTERM)
+ ctx->want_shutdown = ISC_TRUE;
else if (sig == SIGHUP)
- want_reload = ISC_TRUE;
+ ctx->want_reload = ISC_TRUE;
}
#endif /* HAVE_UNIXWARE_SIGWAIT */
@@ -528,131 +673,174 @@ isc_app_run(void) {
if (sigemptyset(&sset) != 0) {
isc__strerror(errno, strbuf, sizeof(strbuf));
UNEXPECTED_ERROR(__FILE__, __LINE__,
- "isc_app_run() sigsetops: %s", strbuf);
+ "isc_app_run() sigsetops: %s",
+ strbuf);
return (ISC_R_UNEXPECTED);
}
result = sigsuspend(&sset);
#endif /* HAVE_SIGWAIT */
- if (want_reload) {
- want_reload = ISC_FALSE;
+ if (ctx->want_reload) {
+ ctx->want_reload = ISC_FALSE;
return (ISC_R_RELOAD);
}
- if (want_shutdown && blocked)
+ if (ctx->want_shutdown && ctx->blocked)
exit(1);
}
-#else /* ISC_PLATFORM_USETHREADS */
+#else /* USE_THREADS_SINGLECTX */
- (void)isc__taskmgr_dispatch();
+ (void)isc__taskmgr_dispatch(ctx->taskmgr);
- result = evloop();
+ result = evloop(ctx);
if (result != ISC_R_SUCCESS)
return (result);
-#endif /* ISC_PLATFORM_USETHREADS */
+#endif /* USE_THREADS_SINGLECTX */
return (ISC_R_SUCCESS);
}
-isc_result_t
-isc_app_shutdown(void) {
+ISC_APPFUNC_SCOPE isc_result_t
+isc__app_run() {
+ return (isc__app_ctxrun((isc_appctx_t *)&isc_g_appctx));
+}
+
+ISC_APPFUNC_SCOPE isc_result_t
+isc__app_ctxshutdown(isc_appctx_t *ctx0) {
+ isc__appctx_t *ctx = (isc__appctx_t *)ctx0;
isc_boolean_t want_kill = ISC_TRUE;
char strbuf[ISC_STRERRORSIZE];
- LOCK(&lock);
+ REQUIRE(VALID_APPCTX(ctx));
- REQUIRE(running);
+ LOCK(&ctx->lock);
- if (shutdown_requested)
+ REQUIRE(ctx->running);
+
+ if (ctx->shutdown_requested)
want_kill = ISC_FALSE;
else
- shutdown_requested = ISC_TRUE;
+ ctx->shutdown_requested = ISC_TRUE;
- UNLOCK(&lock);
+ UNLOCK(&ctx->lock);
if (want_kill) {
+ if (ctx != &isc_g_appctx)
+ ctx->want_shutdown = ISC_TRUE;
+ else {
#ifdef HAVE_LINUXTHREADS
- int result;
-
- result = pthread_kill(main_thread, SIGTERM);
- if (result != 0) {
- isc__strerror(result, strbuf, sizeof(strbuf));
- UNEXPECTED_ERROR(__FILE__, __LINE__,
- "isc_app_shutdown() pthread_kill: %s",
- strbuf);
- return (ISC_R_UNEXPECTED);
- }
+ int result;
+
+ result = pthread_kill(main_thread, SIGTERM);
+ if (result != 0) {
+ isc__strerror(result, strbuf, sizeof(strbuf));
+ UNEXPECTED_ERROR(__FILE__, __LINE__,
+ "isc_app_shutdown() "
+ "pthread_kill: %s",
+ strbuf);
+ return (ISC_R_UNEXPECTED);
+ }
#else
- if (kill(getpid(), SIGTERM) < 0) {
- isc__strerror(errno, strbuf, sizeof(strbuf));
- UNEXPECTED_ERROR(__FILE__, __LINE__,
- "isc_app_shutdown() kill: %s", strbuf);
- return (ISC_R_UNEXPECTED);
+ if (kill(getpid(), SIGTERM) < 0) {
+ isc__strerror(errno, strbuf, sizeof(strbuf));
+ UNEXPECTED_ERROR(__FILE__, __LINE__,
+ "isc_app_shutdown() "
+ "kill: %s", strbuf);
+ return (ISC_R_UNEXPECTED);
+ }
+#endif /* HAVE_LINUXTHREADS */
}
-#endif
}
return (ISC_R_SUCCESS);
}
-isc_result_t
-isc_app_reload(void) {
+ISC_APPFUNC_SCOPE isc_result_t
+isc__app_shutdown() {
+ return (isc__app_ctxshutdown((isc_appctx_t *)&isc_g_appctx));
+}
+
+ISC_APPFUNC_SCOPE isc_result_t
+isc__app_ctxsuspend(isc_appctx_t *ctx0) {
+ isc__appctx_t *ctx = (isc__appctx_t *)ctx0;
isc_boolean_t want_kill = ISC_TRUE;
char strbuf[ISC_STRERRORSIZE];
- LOCK(&lock);
+ REQUIRE(VALID_APPCTX(ctx));
+
+ LOCK(&ctx->lock);
- REQUIRE(running);
+ REQUIRE(ctx->running);
/*
* Don't send the reload signal if we're shutting down.
*/
- if (shutdown_requested)
+ if (ctx->shutdown_requested)
want_kill = ISC_FALSE;
- UNLOCK(&lock);
+ UNLOCK(&ctx->lock);
if (want_kill) {
+ if (ctx != &isc_g_appctx)
+ ctx->want_reload = ISC_TRUE;
+ else {
#ifdef HAVE_LINUXTHREADS
- int result;
-
- result = pthread_kill(main_thread, SIGHUP);
- if (result != 0) {
- isc__strerror(result, strbuf, sizeof(strbuf));
- UNEXPECTED_ERROR(__FILE__, __LINE__,
- "isc_app_reload() pthread_kill: %s",
- strbuf);
- return (ISC_R_UNEXPECTED);
- }
+ int result;
+
+ result = pthread_kill(main_thread, SIGHUP);
+ if (result != 0) {
+ isc__strerror(result, strbuf, sizeof(strbuf));
+ UNEXPECTED_ERROR(__FILE__, __LINE__,
+ "isc_app_reload() "
+ "pthread_kill: %s",
+ strbuf);
+ return (ISC_R_UNEXPECTED);
+ }
#else
- if (kill(getpid(), SIGHUP) < 0) {
- isc__strerror(errno, strbuf, sizeof(strbuf));
- UNEXPECTED_ERROR(__FILE__, __LINE__,
- "isc_app_reload() kill: %s", strbuf);
- return (ISC_R_UNEXPECTED);
- }
+ if (kill(getpid(), SIGHUP) < 0) {
+ isc__strerror(errno, strbuf, sizeof(strbuf));
+ UNEXPECTED_ERROR(__FILE__, __LINE__,
+ "isc_app_reload() "
+ "kill: %s", strbuf);
+ return (ISC_R_UNEXPECTED);
+ }
#endif
+ }
}
return (ISC_R_SUCCESS);
}
-void
-isc_app_finish(void) {
- DESTROYLOCK(&lock);
+ISC_APPFUNC_SCOPE isc_result_t
+isc__app_reload(void) {
+ return (isc__app_ctxsuspend((isc_appctx_t *)&isc_g_appctx));
+}
+
+ISC_APPFUNC_SCOPE void
+isc__app_ctxfinish(isc_appctx_t *ctx0) {
+ isc__appctx_t *ctx = (isc__appctx_t *)ctx0;
+
+ REQUIRE(VALID_APPCTX(ctx));
+
+ DESTROYLOCK(&ctx->lock);
+}
+
+ISC_APPFUNC_SCOPE void
+isc__app_finish(void) {
+ isc__app_ctxfinish((isc_appctx_t *)&isc_g_appctx);
}
-void
-isc_app_block(void) {
+ISC_APPFUNC_SCOPE void
+isc__app_block(void) {
#ifdef ISC_PLATFORM_USETHREADS
sigset_t sset;
#endif /* ISC_PLATFORM_USETHREADS */
- REQUIRE(running);
- REQUIRE(!blocked);
+ REQUIRE(isc_g_appctx.running);
+ REQUIRE(!isc_g_appctx.blocked);
- blocked = ISC_TRUE;
+ isc_g_appctx.blocked = ISC_TRUE;
#ifdef ISC_PLATFORM_USETHREADS
blockedthread = pthread_self();
RUNTIME_CHECK(sigemptyset(&sset) == 0 &&
@@ -662,16 +850,16 @@ isc_app_block(void) {
#endif /* ISC_PLATFORM_USETHREADS */
}
-void
-isc_app_unblock(void) {
+ISC_APPFUNC_SCOPE void
+isc__app_unblock(void) {
#ifdef ISC_PLATFORM_USETHREADS
sigset_t sset;
#endif /* ISC_PLATFORM_USETHREADS */
- REQUIRE(running);
- REQUIRE(blocked);
+ REQUIRE(isc_g_appctx.running);
+ REQUIRE(isc_g_appctx.blocked);
- blocked = ISC_FALSE;
+ isc_g_appctx.blocked = ISC_FALSE;
#ifdef ISC_PLATFORM_USETHREADS
REQUIRE(blockedthread == pthread_self());
@@ -682,3 +870,77 @@ isc_app_unblock(void) {
RUNTIME_CHECK(pthread_sigmask(SIG_BLOCK, &sset, NULL) == 0);
#endif /* ISC_PLATFORM_USETHREADS */
}
+
+ISC_APPFUNC_SCOPE isc_result_t
+isc__appctx_create(isc_mem_t *mctx, isc_appctx_t **ctxp) {
+ isc__appctx_t *ctx;
+
+ REQUIRE(mctx != NULL);
+ REQUIRE(ctxp != NULL && *ctxp == NULL);
+
+ ctx = isc_mem_get(mctx, sizeof(*ctx));
+ if (ctx == NULL)
+ return (ISC_R_NOMEMORY);
+
+ ctx->common.impmagic = APPCTX_MAGIC;
+ ctx->common.magic = ISCAPI_APPCTX_MAGIC;
+ ctx->common.methods = &appmethods.methods;
+
+ ctx->mctx = NULL;
+ isc_mem_attach(mctx, &ctx->mctx);
+
+ ctx->taskmgr = NULL;
+ ctx->socketmgr = NULL;
+ ctx->timermgr = NULL;
+
+ *ctxp = (isc_appctx_t *)ctx;
+
+ return (ISC_R_SUCCESS);
+}
+
+ISC_APPFUNC_SCOPE void
+isc__appctx_destroy(isc_appctx_t **ctxp) {
+ isc__appctx_t *ctx;
+
+ REQUIRE(ctxp != NULL);
+ ctx = (isc__appctx_t *)*ctxp;
+ REQUIRE(VALID_APPCTX(ctx));
+
+ isc_mem_putanddetach(&ctx->mctx, ctx, sizeof(*ctx));
+
+ *ctxp = NULL;
+}
+
+ISC_APPFUNC_SCOPE void
+isc__appctx_settaskmgr(isc_appctx_t *ctx0, isc_taskmgr_t *taskmgr) {
+ isc__appctx_t *ctx = (isc__appctx_t *)ctx0;
+
+ REQUIRE(VALID_APPCTX(ctx));
+
+ ctx->taskmgr = taskmgr;
+}
+
+ISC_APPFUNC_SCOPE void
+isc__appctx_setsocketmgr(isc_appctx_t *ctx0, isc_socketmgr_t *socketmgr) {
+ isc__appctx_t *ctx = (isc__appctx_t *)ctx0;
+
+ REQUIRE(VALID_APPCTX(ctx));
+
+ ctx->socketmgr = socketmgr;
+}
+
+ISC_APPFUNC_SCOPE void
+isc__appctx_settimermgr(isc_appctx_t *ctx0, isc_timermgr_t *timermgr) {
+ isc__appctx_t *ctx = (isc__appctx_t *)ctx0;
+
+ REQUIRE(VALID_APPCTX(ctx));
+
+ ctx->timermgr = timermgr;
+}
+
+#ifdef USE_APPIMPREGISTER
+isc_result_t
+isc__app_register() {
+ return (isc_app_register(isc__appctx_create));
+}
+#endif
diff --git a/contrib/bind9/lib/isc/unix/dir.c b/contrib/bind9/lib/isc/unix/dir.c
index 8053c42..0caf882 100644
--- a/contrib/bind9/lib/isc/unix/dir.c
+++ b/contrib/bind9/lib/isc/unix/dir.c
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004, 2005, 2007, 2009 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004, 2005, 2007-2009 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 1999-2001 Internet Software Consortium.
*
* Permission to use, copy, modify, and/or distribute this software for any
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: dir.c,v 1.25.332.3 2009-02-16 23:47:15 tbox Exp $ */
+/* $Id: dir.c,v 1.29 2009-02-16 23:48:04 tbox Exp $ */
/*! \file
* \author Principal Authors: DCL */
diff --git a/contrib/bind9/lib/isc/unix/entropy.c b/contrib/bind9/lib/isc/unix/entropy.c
index bdff8d9..9044632 100644
--- a/contrib/bind9/lib/isc/unix/entropy.c
+++ b/contrib/bind9/lib/isc/unix/entropy.c
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004-2007, 2009 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004-2008 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 2000-2003 Internet Software Consortium.
*
* Permission to use, copy, modify, and/or distribute this software for any
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: entropy.c,v 1.80.332.2 2009-02-16 23:47:15 tbox Exp $ */
+/* $Id: entropy.c,v 1.82 2008-12-01 23:47:45 tbox Exp $ */
/* \file unix/entropy.c
* \brief
diff --git a/contrib/bind9/lib/isc/unix/file.c b/contrib/bind9/lib/isc/unix/file.c
index ae737b8..25d856c 100644
--- a/contrib/bind9/lib/isc/unix/file.c
+++ b/contrib/bind9/lib/isc/unix/file.c
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004, 2005, 2007, 2009 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004, 2005, 2007, 2009, 2011 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 2000-2002 Internet Software Consortium.
*
* Permission to use, copy, modify, and/or distribute this software for any
@@ -48,7 +48,7 @@
* SUCH DAMAGE.
*/
-/* $Id: file.c,v 1.51.332.2 2009-02-16 23:47:15 tbox Exp $ */
+/* $Id: file.c,v 1.57 2011-01-11 23:47:14 tbox Exp $ */
/*! \file */
@@ -68,6 +68,7 @@
#include <isc/dir.h>
#include <isc/file.h>
#include <isc/log.h>
+#include <isc/mem.h>
#include <isc/random.h>
#include <isc/string.h>
#include <isc/time.h>
@@ -242,16 +243,26 @@ isc_file_renameunique(const char *file, char *templet) {
return (ISC_R_SUCCESS);
}
-
isc_result_t
isc_file_openunique(char *templet, FILE **fp) {
+ int mode = S_IWUSR|S_IRUSR|S_IRGRP|S_IWGRP|S_IROTH|S_IWOTH;
+ return (isc_file_openuniquemode(templet, mode, fp));
+}
+
+isc_result_t
+isc_file_openuniqueprivate(char *templet, FILE **fp) {
+ int mode = S_IWUSR|S_IRUSR;
+ return (isc_file_openuniquemode(templet, mode, fp));
+}
+
+isc_result_t
+isc_file_openuniquemode(char *templet, int mode, FILE **fp) {
int fd;
FILE *f;
isc_result_t result = ISC_R_SUCCESS;
char *x;
char *cp;
isc_uint32_t which;
- int mode;
REQUIRE(templet != NULL);
REQUIRE(fp != NULL && *fp == NULL);
@@ -269,7 +280,6 @@ isc_file_openunique(char *templet, FILE **fp) {
x = cp--;
}
- mode = S_IWUSR|S_IRUSR|S_IRGRP|S_IWGRP|S_IROTH|S_IWOTH;
while ((fd = open(templet, O_RDWR|O_CREAT|O_EXCL, mode)) == -1) {
if (errno != EEXIST)
@@ -442,3 +452,73 @@ isc_file_truncate(const char *filename, isc_offset_t size) {
result = isc__errno2result(errno);
return (result);
}
+
+isc_result_t
+isc_file_safecreate(const char *filename, FILE **fp) {
+ isc_result_t result;
+ int flags;
+ struct stat sb;
+ FILE *f;
+ int fd;
+
+ REQUIRE(filename != NULL);
+ REQUIRE(fp != NULL && *fp == NULL);
+
+ result = file_stats(filename, &sb);
+ if (result == ISC_R_SUCCESS) {
+ if ((sb.st_mode & S_IFREG) == 0)
+ return (ISC_R_INVALIDFILE);
+ flags = O_WRONLY | O_TRUNC;
+ } else if (result == ISC_R_FILENOTFOUND) {
+ flags = O_WRONLY | O_CREAT | O_EXCL;
+ } else
+ return (result);
+
+ fd = open(filename, flags, S_IRUSR | S_IWUSR);
+ if (fd == -1)
+ return (isc__errno2result(errno));
+
+ f = fdopen(fd, "w");
+ if (f == NULL) {
+ result = isc__errno2result(errno);
+ close(fd);
+ return (result);
+ }
+
+ *fp = f;
+ return (ISC_R_SUCCESS);
+}
+
+isc_result_t
+isc_file_splitpath(isc_mem_t *mctx, char *path, char **dirname, char **basename)
+{
+ char *dir, *file, *slash;
+
+ slash = strrchr(path, '/');
+
+ if (slash == path) {
+ file = ++slash;
+ dir = isc_mem_strdup(mctx, "/");
+ } else if (slash != NULL) {
+ file = ++slash;
+ dir = isc_mem_allocate(mctx, slash - path);
+ if (dir != NULL)
+ strlcpy(dir, path, slash - path);
+ } else {
+ file = path;
+ dir = isc_mem_strdup(mctx, ".");
+ }
+
+ if (dir == NULL)
+ return (ISC_R_NOMEMORY);
+
+ if (*file == '\0') {
+ isc_mem_free(mctx, dir);
+ return (ISC_R_INVALIDFILE);
+ }
+
+ *dirname = dir;
+ *basename = file;
+
+ return (ISC_R_SUCCESS);
+}
diff --git a/contrib/bind9/lib/isc/unix/ifiter_getifaddrs.c b/contrib/bind9/lib/isc/unix/ifiter_getifaddrs.c
index 1e9c814..90a3faf 100644
--- a/contrib/bind9/lib/isc/unix/ifiter_getifaddrs.c
+++ b/contrib/bind9/lib/isc/unix/ifiter_getifaddrs.c
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: ifiter_getifaddrs.c,v 1.11.120.2 2009-09-24 23:47:34 tbox Exp $ */
+/* $Id: ifiter_getifaddrs.c,v 1.13 2009-09-24 23:48:13 tbox Exp $ */
/*! \file
* \brief
diff --git a/contrib/bind9/lib/isc/unix/ifiter_ioctl.c b/contrib/bind9/lib/isc/unix/ifiter_ioctl.c
index c004f61..010b365 100644
--- a/contrib/bind9/lib/isc/unix/ifiter_ioctl.c
+++ b/contrib/bind9/lib/isc/unix/ifiter_ioctl.c
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: ifiter_ioctl.c,v 1.60.120.2 2009-01-18 23:47:41 tbox Exp $ */
+/* $Id: ifiter_ioctl.c,v 1.62 2009-01-18 23:48:14 tbox Exp $ */
/*! \file
* \brief
diff --git a/contrib/bind9/lib/isc/unix/include/isc/net.h b/contrib/bind9/lib/isc/unix/include/isc/net.h
index 5fad793..112f1d7 100644
--- a/contrib/bind9/lib/isc/unix/include/isc/net.h
+++ b/contrib/bind9/lib/isc/unix/include/isc/net.h
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004, 2005, 2007-2009 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004, 2005, 2007, 2008 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 1999-2003 Internet Software Consortium.
*
* Permission to use, copy, modify, and/or distribute this software for any
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: net.h,v 1.48.84.2 2009-02-16 23:47:15 tbox Exp $ */
+/* $Id: net.h,v 1.50 2008-12-01 04:14:54 marka Exp $ */
#ifndef ISC_NET_H
#define ISC_NET_H 1
diff --git a/contrib/bind9/lib/isc/unix/include/isc/offset.h b/contrib/bind9/lib/isc/unix/include/isc/offset.h
index 91f43c37..2920899 100644
--- a/contrib/bind9/lib/isc/unix/include/isc/offset.h
+++ b/contrib/bind9/lib/isc/unix/include/isc/offset.h
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004, 2005, 2007, 2009 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004, 2005, 2007, 2008 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 2000, 2001 Internet Software Consortium.
*
* Permission to use, copy, modify, and/or distribute this software for any
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: offset.h,v 1.15.332.2 2009-02-16 23:47:15 tbox Exp $ */
+/* $Id: offset.h,v 1.17 2008-12-01 23:47:45 tbox Exp $ */
#ifndef ISC_OFFSET_H
#define ISC_OFFSET_H 1
diff --git a/contrib/bind9/lib/isc/unix/include/isc/strerror.h b/contrib/bind9/lib/isc/unix/include/isc/strerror.h
index e094e96..ac8d496 100644
--- a/contrib/bind9/lib/isc/unix/include/isc/strerror.h
+++ b/contrib/bind9/lib/isc/unix/include/isc/strerror.h
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004, 2005, 2007, 2009 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004, 2005, 2007, 2008 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 2001 Internet Software Consortium.
*
* Permission to use, copy, modify, and/or distribute this software for any
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: strerror.h,v 1.8.332.2 2009-02-16 23:47:15 tbox Exp $ */
+/* $Id: strerror.h,v 1.10 2008-12-01 23:47:45 tbox Exp $ */
#ifndef ISC_STRERROR_H
#define ISC_STRERROR_H
diff --git a/contrib/bind9/lib/isc/unix/include/isc/time.h b/contrib/bind9/lib/isc/unix/include/isc/time.h
index 2149011..19f0810 100644
--- a/contrib/bind9/lib/isc/unix/include/isc/time.h
+++ b/contrib/bind9/lib/isc/unix/include/isc/time.h
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: time.h,v 1.38.56.2 2009-01-05 23:47:23 tbox Exp $ */
+/* $Id: time.h,v 1.40 2009-01-05 23:47:54 tbox Exp $ */
#ifndef ISC_TIME_H
#define ISC_TIME_H 1
diff --git a/contrib/bind9/lib/isc/unix/interfaceiter.c b/contrib/bind9/lib/isc/unix/interfaceiter.c
index 2d60a33..37fc3b1 100644
--- a/contrib/bind9/lib/isc/unix/interfaceiter.c
+++ b/contrib/bind9/lib/isc/unix/interfaceiter.c
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004, 2005, 2007-2009 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004, 2005, 2007, 2008 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 1999-2003 Internet Software Consortium.
*
* Permission to use, copy, modify, and/or distribute this software for any
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: interfaceiter.c,v 1.44.120.2 2009-02-16 23:47:15 tbox Exp $ */
+/* $Id: interfaceiter.c,v 1.45 2008-12-01 03:51:47 marka Exp $ */
/*! \file */
diff --git a/contrib/bind9/lib/isc/unix/resource.c b/contrib/bind9/lib/isc/unix/resource.c
index 1061282..99a4b8c 100644
--- a/contrib/bind9/lib/isc/unix/resource.c
+++ b/contrib/bind9/lib/isc/unix/resource.c
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: resource.c,v 1.21.66.2 2009-02-13 23:47:39 tbox Exp $ */
+/* $Id: resource.c,v 1.23 2009-02-13 23:48:14 tbox Exp $ */
#include <config.h>
diff --git a/contrib/bind9/lib/isc/unix/socket.c b/contrib/bind9/lib/isc/unix/socket.c
index 055e883..ec7487e 100644
--- a/contrib/bind9/lib/isc/unix/socket.c
+++ b/contrib/bind9/lib/isc/unix/socket.c
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004-2010 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004-2011 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 1998-2003 Internet Software Consortium.
*
* Permission to use, copy, modify, and/or distribute this software for any
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: socket.c,v 1.308.12.17 2010-12-22 03:28:13 marka Exp $ */
+/* $Id: socket.c,v 1.333.14.2.2.1 2011-06-02 23:47:36 tbox Exp $ */
/*! \file */
@@ -76,9 +76,19 @@
#include "errno2result.h"
-#ifndef ISC_PLATFORM_USETHREADS
+/* See task.c about the following definition: */
+#ifdef BIND9
+#ifdef ISC_PLATFORM_USETHREADS
+#define USE_WATCHER_THREAD
+#else
+#define USE_SHARED_MANAGER
+#endif /* ISC_PLATFORM_USETHREADS */
+#endif /* BIND9 */
+
+#ifndef USE_WATCHER_THREAD
#include "socket_p.h"
-#endif /* ISC_PLATFORM_USETHREADS */
+#include "../task_p.h"
+#endif /* USE_WATCHER_THREAD */
#if defined(SO_BSDCOMPAT) && defined(__linux__)
#include <sys/utsname.h>
@@ -101,7 +111,7 @@ typedef struct {
#define USE_SELECT
#endif /* ISC_PLATFORM_HAVEKQUEUE */
-#ifndef ISC_PLATFORM_USETHREADS
+#ifndef USE_WATCHER_THREAD
#if defined(USE_KQUEUE) || defined(USE_EPOLL) || defined(USE_DEVPOLL)
struct isc_socketwait {
int nevents;
@@ -114,7 +124,7 @@ struct isc_socketwait {
int maxfd;
};
#endif /* USE_KQUEUE */
-#endif /* !ISC_PLATFORM_USETHREADS */
+#endif /* !USE_WATCHER_THREAD */
/*%
* Maximum number of allowable open sockets. This is also the maximum
@@ -248,7 +258,7 @@ typedef enum { poll_idle, poll_active, poll_checking } pollstate_t;
typedef isc_event_t intev_t;
#define SOCKET_MAGIC ISC_MAGIC('I', 'O', 'i', 'o')
-#define VALID_SOCKET(t) ISC_MAGIC_VALID(t, SOCKET_MAGIC)
+#define VALID_SOCKET(s) ISC_MAGIC_VALID(s, SOCKET_MAGIC)
/*!
* IPv6 control information. If the socket is an IPv6 socket we want
@@ -282,16 +292,21 @@ typedef isc_event_t intev_t;
*/
#define NRETRIES 10
-struct isc_socket {
+typedef struct isc__socket isc__socket_t;
+typedef struct isc__socketmgr isc__socketmgr_t;
+
+#define NEWCONNSOCK(ev) ((isc__socket_t *)(ev)->newsocket)
+
+struct isc__socket {
/* Not locked. */
- unsigned int magic;
- isc_socketmgr_t *manager;
+ isc_socket_t common;
+ isc__socketmgr_t *manager;
isc_mutex_t lock;
isc_sockettype_t type;
const isc_statscounter_t *statsindex;
/* Locked by socket lock. */
- ISC_LINK(isc_socket_t) link;
+ ISC_LINK(isc__socket_t) link;
unsigned int references;
int fd;
int pf;
@@ -339,9 +354,9 @@ struct isc_socket {
#define SOCKET_MANAGER_MAGIC ISC_MAGIC('I', 'O', 'm', 'g')
#define VALID_MANAGER(m) ISC_MAGIC_VALID(m, SOCKET_MANAGER_MAGIC)
-struct isc_socketmgr {
+struct isc__socketmgr {
/* Not locked. */
- unsigned int magic;
+ isc_socketmgr_t common;
isc_mem_t *mctx;
isc_mutex_t lock;
isc_mutex_t *fdlock;
@@ -370,14 +385,14 @@ struct isc_socketmgr {
#endif
/* Locked by fdlock. */
- isc_socket_t **fds;
+ isc__socket_t **fds;
int *fdstate;
#ifdef USE_DEVPOLL
pollinfo_t *fdpollinfo;
#endif
/* Locked by manager lock. */
- ISC_LIST(isc_socket_t) socklist;
+ ISC_LIST(isc__socket_t) socklist;
#ifdef USE_SELECT
fd_set *read_fds;
fd_set *read_fds_copy;
@@ -386,17 +401,18 @@ struct isc_socketmgr {
int maxfd;
#endif /* USE_SELECT */
int reserved; /* unlocked */
-#ifdef ISC_PLATFORM_USETHREADS
+#ifdef USE_WATCHER_THREAD
isc_thread_t watcher;
isc_condition_t shutdown_ok;
-#else /* ISC_PLATFORM_USETHREADS */
+#else /* USE_WATCHER_THREAD */
unsigned int refs;
-#endif /* ISC_PLATFORM_USETHREADS */
+#endif /* USE_WATCHER_THREAD */
+ int maxudp;
};
-#ifndef ISC_PLATFORM_USETHREADS
-static isc_socketmgr_t *socketmgr = NULL;
-#endif /* ISC_PLATFORM_USETHREADS */
+#ifdef USE_SHARED_MANAGER
+static isc__socketmgr_t *socketmgr = NULL;
+#endif /* USE_SHARED_MANAGER */
#define CLOSED 0 /* this one must be zero */
#define MANAGED 1
@@ -412,26 +428,165 @@ static isc_socketmgr_t *socketmgr = NULL;
# define MAXSCATTERGATHER_RECV (ISC_SOCKET_MAXSCATTERGATHER)
#endif
-static void send_recvdone_event(isc_socket_t *, isc_socketevent_t **);
-static void send_senddone_event(isc_socket_t *, isc_socketevent_t **);
-static void free_socket(isc_socket_t **);
-static isc_result_t allocate_socket(isc_socketmgr_t *, isc_sockettype_t,
- isc_socket_t **);
-static void destroy(isc_socket_t **);
+static void send_recvdone_event(isc__socket_t *, isc_socketevent_t **);
+static void send_senddone_event(isc__socket_t *, isc_socketevent_t **);
+static void free_socket(isc__socket_t **);
+static isc_result_t allocate_socket(isc__socketmgr_t *, isc_sockettype_t,
+ isc__socket_t **);
+static void destroy(isc__socket_t **);
static void internal_accept(isc_task_t *, isc_event_t *);
static void internal_connect(isc_task_t *, isc_event_t *);
static void internal_recv(isc_task_t *, isc_event_t *);
static void internal_send(isc_task_t *, isc_event_t *);
static void internal_fdwatch_write(isc_task_t *, isc_event_t *);
static void internal_fdwatch_read(isc_task_t *, isc_event_t *);
-static void process_cmsg(isc_socket_t *, struct msghdr *, isc_socketevent_t *);
-static void build_msghdr_send(isc_socket_t *, isc_socketevent_t *,
+static void process_cmsg(isc__socket_t *, struct msghdr *, isc_socketevent_t *);
+static void build_msghdr_send(isc__socket_t *, isc_socketevent_t *,
struct msghdr *, struct iovec *, size_t *);
-static void build_msghdr_recv(isc_socket_t *, isc_socketevent_t *,
+static void build_msghdr_recv(isc__socket_t *, isc_socketevent_t *,
struct msghdr *, struct iovec *, size_t *);
-#ifdef ISC_PLATFORM_USETHREADS
-static isc_boolean_t process_ctlfd(isc_socketmgr_t *manager);
+#ifdef USE_WATCHER_THREAD
+static isc_boolean_t process_ctlfd(isc__socketmgr_t *manager);
+#endif
+
+/*%
+ * The following can be either static or public, depending on build environment.
+ */
+
+#ifdef BIND9
+#define ISC_SOCKETFUNC_SCOPE
+#else
+#define ISC_SOCKETFUNC_SCOPE static
+#endif
+
+ISC_SOCKETFUNC_SCOPE isc_result_t
+isc__socket_create(isc_socketmgr_t *manager, int pf, isc_sockettype_t type,
+ isc_socket_t **socketp);
+ISC_SOCKETFUNC_SCOPE void
+isc__socket_attach(isc_socket_t *sock, isc_socket_t **socketp);
+ISC_SOCKETFUNC_SCOPE void
+isc__socket_detach(isc_socket_t **socketp);
+ISC_SOCKETFUNC_SCOPE isc_result_t
+isc__socketmgr_create(isc_mem_t *mctx, isc_socketmgr_t **managerp);
+ISC_SOCKETFUNC_SCOPE isc_result_t
+isc__socketmgr_create2(isc_mem_t *mctx, isc_socketmgr_t **managerp,
+ unsigned int maxsocks);
+ISC_SOCKETFUNC_SCOPE void
+isc__socketmgr_destroy(isc_socketmgr_t **managerp);
+ISC_SOCKETFUNC_SCOPE isc_result_t
+isc__socket_recvv(isc_socket_t *sock, isc_bufferlist_t *buflist,
+ unsigned int minimum, isc_task_t *task,
+ isc_taskaction_t action, const void *arg);
+ISC_SOCKETFUNC_SCOPE isc_result_t
+isc__socket_recv(isc_socket_t *sock, isc_region_t *region,
+ unsigned int minimum, isc_task_t *task,
+ isc_taskaction_t action, const void *arg);
+ISC_SOCKETFUNC_SCOPE isc_result_t
+isc__socket_recv2(isc_socket_t *sock, isc_region_t *region,
+ unsigned int minimum, isc_task_t *task,
+ isc_socketevent_t *event, unsigned int flags);
+ISC_SOCKETFUNC_SCOPE isc_result_t
+isc__socket_send(isc_socket_t *sock, isc_region_t *region,
+ isc_task_t *task, isc_taskaction_t action, const void *arg);
+ISC_SOCKETFUNC_SCOPE isc_result_t
+isc__socket_sendto(isc_socket_t *sock, isc_region_t *region,
+ isc_task_t *task, isc_taskaction_t action, const void *arg,
+ isc_sockaddr_t *address, struct in6_pktinfo *pktinfo);
+ISC_SOCKETFUNC_SCOPE isc_result_t
+isc__socket_sendv(isc_socket_t *sock, isc_bufferlist_t *buflist,
+ isc_task_t *task, isc_taskaction_t action, const void *arg);
+ISC_SOCKETFUNC_SCOPE isc_result_t
+isc__socket_sendtov(isc_socket_t *sock, isc_bufferlist_t *buflist,
+ isc_task_t *task, isc_taskaction_t action, const void *arg,
+ isc_sockaddr_t *address, struct in6_pktinfo *pktinfo);
+ISC_SOCKETFUNC_SCOPE isc_result_t
+isc__socket_sendto2(isc_socket_t *sock, isc_region_t *region,
+ isc_task_t *task,
+ isc_sockaddr_t *address, struct in6_pktinfo *pktinfo,
+ isc_socketevent_t *event, unsigned int flags);
+ISC_SOCKETFUNC_SCOPE void
+isc__socket_cleanunix(isc_sockaddr_t *sockaddr, isc_boolean_t active);
+ISC_SOCKETFUNC_SCOPE isc_result_t
+isc__socket_permunix(isc_sockaddr_t *sockaddr, isc_uint32_t perm,
+ isc_uint32_t owner, isc_uint32_t group);
+ISC_SOCKETFUNC_SCOPE isc_result_t
+isc__socket_bind(isc_socket_t *sock, isc_sockaddr_t *sockaddr,
+ unsigned int options);
+ISC_SOCKETFUNC_SCOPE isc_result_t
+isc__socket_filter(isc_socket_t *sock, const char *filter);
+ISC_SOCKETFUNC_SCOPE isc_result_t
+isc__socket_listen(isc_socket_t *sock, unsigned int backlog);
+ISC_SOCKETFUNC_SCOPE isc_result_t
+isc__socket_accept(isc_socket_t *sock,
+ isc_task_t *task, isc_taskaction_t action, const void *arg);
+ISC_SOCKETFUNC_SCOPE isc_result_t
+isc__socket_connect(isc_socket_t *sock, isc_sockaddr_t *addr,
+ isc_task_t *task, isc_taskaction_t action,
+ const void *arg);
+ISC_SOCKETFUNC_SCOPE isc_result_t
+isc__socket_getpeername(isc_socket_t *sock, isc_sockaddr_t *addressp);
+ISC_SOCKETFUNC_SCOPE isc_result_t
+isc__socket_getsockname(isc_socket_t *sock, isc_sockaddr_t *addressp);
+ISC_SOCKETFUNC_SCOPE void
+isc__socket_cancel(isc_socket_t *sock, isc_task_t *task, unsigned int how);
+ISC_SOCKETFUNC_SCOPE isc_sockettype_t
+isc__socket_gettype(isc_socket_t *sock);
+ISC_SOCKETFUNC_SCOPE isc_boolean_t
+isc__socket_isbound(isc_socket_t *sock);
+ISC_SOCKETFUNC_SCOPE void
+isc__socket_ipv6only(isc_socket_t *sock, isc_boolean_t yes);
+#if defined(HAVE_LIBXML2) && defined(BIND9)
+ISC_SOCKETFUNC_SCOPE void
+isc__socketmgr_renderxml(isc_socketmgr_t *mgr0, xmlTextWriterPtr writer);
+#endif
+
+ISC_SOCKETFUNC_SCOPE isc_result_t
+isc__socket_fdwatchcreate(isc_socketmgr_t *manager, int fd, int flags,
+ isc_sockfdwatch_t callback, void *cbarg,
+ isc_task_t *task, isc_socket_t **socketp);
+ISC_SOCKETFUNC_SCOPE isc_result_t
+isc__socket_fdwatchpoke(isc_socket_t *sock, int flags);
+
+static struct {
+ isc_socketmethods_t methods;
+
+ /*%
+ * The following are defined just for avoiding unused static functions.
+ */
+#ifndef BIND9
+ void *recvv, *send, *sendv, *sendto2, *cleanunix, *permunix, *filter,
+ *listen, *accept, *getpeername, *isbound;
+#endif
+} socketmethods = {
+ {
+ isc__socket_attach,
+ isc__socket_detach,
+ isc__socket_bind,
+ isc__socket_sendto,
+ isc__socket_connect,
+ isc__socket_recv,
+ isc__socket_cancel,
+ isc__socket_getsockname,
+ isc__socket_gettype,
+ isc__socket_ipv6only,
+ isc__socket_fdwatchpoke
+ }
+#ifndef BIND9
+ ,
+ (void *)isc__socket_recvv, (void *)isc__socket_send,
+ (void *)isc__socket_sendv, (void *)isc__socket_sendto2,
+ (void *)isc__socket_cleanunix, (void *)isc__socket_permunix,
+ (void *)isc__socket_filter, (void *)isc__socket_listen,
+ (void *)isc__socket_accept, (void *)isc__socket_getpeername,
+ (void *)isc__socket_isbound
#endif
+};
+
+static isc_socketmgrmethods_t socketmgrmethods = {
+ isc__socketmgr_destroy,
+ isc__socket_create,
+ isc__socket_fdwatchcreate
+};
#define SELECT_POKE_SHUTDOWN (-1)
#define SELECT_POKE_NOTHING (-2)
@@ -531,12 +686,14 @@ static const isc_statscounter_t fdwatchstatsindex[] = {
isc_sockstatscounter_fdwatchrecvfail
};
+#if defined(USE_KQUEUE) || defined(USE_EPOLL) || defined(USE_DEVPOLL) || \
+ defined(USE_WATCHER_THREAD)
static void
-manager_log(isc_socketmgr_t *sockmgr,
+manager_log(isc__socketmgr_t *sockmgr,
isc_logcategory_t *category, isc_logmodule_t *module, int level,
const char *fmt, ...) ISC_FORMAT_PRINTF(5, 6);
static void
-manager_log(isc_socketmgr_t *sockmgr,
+manager_log(isc__socketmgr_t *sockmgr,
isc_logcategory_t *category, isc_logmodule_t *module, int level,
const char *fmt, ...)
{
@@ -553,14 +710,15 @@ manager_log(isc_socketmgr_t *sockmgr,
isc_log_write(isc_lctx, category, module, level,
"sockmgr %p: %s", sockmgr, msgbuf);
}
+#endif
static void
-socket_log(isc_socket_t *sock, isc_sockaddr_t *address,
+socket_log(isc__socket_t *sock, isc_sockaddr_t *address,
isc_logcategory_t *category, isc_logmodule_t *module, int level,
isc_msgcat_t *msgcat, int msgset, int message,
const char *fmt, ...) ISC_FORMAT_PRINTF(9, 10);
static void
-socket_log(isc_socket_t *sock, isc_sockaddr_t *address,
+socket_log(isc__socket_t *sock, isc_sockaddr_t *address,
isc_logcategory_t *category, isc_logmodule_t *module, int level,
isc_msgcat_t *msgcat, int msgset, int message,
const char *fmt, ...)
@@ -595,7 +753,7 @@ socket_log(isc_socket_t *sock, isc_sockaddr_t *address,
* setting IPV6_V6ONLY.
*/
static void
-FIX_IPV6_RECVPKTINFO(isc_socket_t *sock)
+FIX_IPV6_RECVPKTINFO(isc__socket_t *sock)
{
char strbuf[ISC_STRERRORSIZE];
int on = 1;
@@ -632,7 +790,7 @@ inc_stats(isc_stats_t *stats, isc_statscounter_t counterid) {
}
static inline isc_result_t
-watch_fd(isc_socketmgr_t *manager, int fd, int msg) {
+watch_fd(isc__socketmgr_t *manager, int fd, int msg) {
isc_result_t result = ISC_R_SUCCESS;
#ifdef USE_KQUEUE
@@ -700,7 +858,7 @@ watch_fd(isc_socketmgr_t *manager, int fd, int msg) {
}
static inline isc_result_t
-unwatch_fd(isc_socketmgr_t *manager, int fd, int msg) {
+unwatch_fd(isc__socketmgr_t *manager, int fd, int msg) {
isc_result_t result = ISC_R_SUCCESS;
#ifdef USE_KQUEUE
@@ -787,7 +945,7 @@ unwatch_fd(isc_socketmgr_t *manager, int fd, int msg) {
}
static void
-wakeup_socket(isc_socketmgr_t *manager, int fd, int msg) {
+wakeup_socket(isc__socketmgr_t *manager, int fd, int msg) {
isc_result_t result;
int lockid = FDLOCK_ID(fd);
@@ -848,14 +1006,14 @@ wakeup_socket(isc_socketmgr_t *manager, int fd, int msg) {
}
}
-#ifdef ISC_PLATFORM_USETHREADS
+#ifdef USE_WATCHER_THREAD
/*
* Poke the select loop when there is something for us to do.
* The write is required (by POSIX) to complete. That is, we
* will not get partial writes.
*/
static void
-select_poke(isc_socketmgr_t *mgr, int fd, int msg) {
+select_poke(isc__socketmgr_t *mgr, int fd, int msg) {
int cc;
int buf[2];
char strbuf[ISC_STRERRORSIZE];
@@ -894,7 +1052,7 @@ select_poke(isc_socketmgr_t *mgr, int fd, int msg) {
* Read a message on the internal fd.
*/
static void
-select_readmsg(isc_socketmgr_t *mgr, int *fd, int *msg) {
+select_readmsg(isc__socketmgr_t *mgr, int *fd, int *msg) {
int buf[2];
int cc;
char strbuf[ISC_STRERRORSIZE];
@@ -921,19 +1079,19 @@ select_readmsg(isc_socketmgr_t *mgr, int *fd, int *msg) {
*fd = buf[0];
*msg = buf[1];
}
-#else /* ISC_PLATFORM_USETHREADS */
+#else /* USE_WATCHER_THREAD */
/*
* Update the state of the socketmgr when something changes.
*/
static void
-select_poke(isc_socketmgr_t *manager, int fd, int msg) {
+select_poke(isc__socketmgr_t *manager, int fd, int msg) {
if (msg == SELECT_POKE_SHUTDOWN)
return;
else if (fd >= 0)
wakeup_socket(manager, fd, msg);
return;
}
-#endif /* ISC_PLATFORM_USETHREADS */
+#endif /* USE_WATCHER_THREAD */
/*
* Make a fd non-blocking.
@@ -1026,7 +1184,7 @@ cmsg_space(ISC_SOCKADDR_LEN_T len) {
* Process control messages received on a socket.
*/
static void
-process_cmsg(isc_socket_t *sock, struct msghdr *msg, isc_socketevent_t *dev) {
+process_cmsg(isc__socket_t *sock, struct msghdr *msg, isc_socketevent_t *dev) {
#ifdef USE_CMSG
struct cmsghdr *cmsgp;
#ifdef ISC_PLATFORM_HAVEIN6PKTINFO
@@ -1129,7 +1287,7 @@ process_cmsg(isc_socket_t *sock, struct msghdr *msg, isc_socketevent_t *dev) {
* this transaction can send.
*/
static void
-build_msghdr_send(isc_socket_t *sock, isc_socketevent_t *dev,
+build_msghdr_send(isc__socket_t *sock, isc_socketevent_t *dev,
struct msghdr *msg, struct iovec *iov, size_t *write_countp)
{
unsigned int iovcount;
@@ -1248,7 +1406,7 @@ build_msghdr_send(isc_socket_t *sock, isc_socketevent_t *dev,
* this transaction can receive.
*/
static void
-build_msghdr_recv(isc_socket_t *sock, isc_socketevent_t *dev,
+build_msghdr_recv(isc__socket_t *sock, isc_socketevent_t *dev,
struct msghdr *msg, struct iovec *iov, size_t *read_countp)
{
unsigned int iovcount;
@@ -1369,7 +1527,7 @@ build_msghdr_recv(isc_socket_t *sock, isc_socketevent_t *dev,
}
static void
-set_dev_address(isc_sockaddr_t *address, isc_socket_t *sock,
+set_dev_address(isc_sockaddr_t *address, isc__socket_t *sock,
isc_socketevent_t *dev)
{
if (sock->type == isc_sockettype_udp) {
@@ -1393,7 +1551,7 @@ destroy_socketevent(isc_event_t *event) {
}
static isc_socketevent_t *
-allocate_socketevent(isc_socket_t *sock, isc_eventtype_t eventtype,
+allocate_socketevent(isc__socket_t *sock, isc_eventtype_t eventtype,
isc_taskaction_t action, const void *arg)
{
isc_socketevent_t *ev;
@@ -1446,7 +1604,7 @@ dump_msg(struct msghdr *msg) {
#define DOIO_EOF 3 /* EOF, no event sent */
static int
-doio_recv(isc_socket_t *sock, isc_socketevent_t *dev) {
+doio_recv(isc__socket_t *sock, isc_socketevent_t *dev) {
int cc;
struct iovec iov[MAXSCATTERGATHER_RECV];
size_t read_count;
@@ -1554,6 +1712,12 @@ doio_recv(isc_socket_t *sock, isc_socketevent_t *dev) {
}
return (DOIO_SOFT);
}
+ /*
+ * Simulate a firewall blocking UDP responses bigger than
+ * 512 bytes.
+ */
+ if (sock->manager->maxudp != 0 && cc > sock->manager->maxudp)
+ return (DOIO_SOFT);
}
socket_log(sock, &dev->address, IOEVENT,
@@ -1630,7 +1794,7 @@ doio_recv(isc_socket_t *sock, isc_socketevent_t *dev) {
* No other return values are possible.
*/
static int
-doio_send(isc_socket_t *sock, isc_socketevent_t *dev) {
+doio_send(isc__socket_t *sock, isc_socketevent_t *dev) {
int cc;
struct iovec iov[MAXSCATTERGATHER_SEND];
size_t write_count;
@@ -1741,7 +1905,7 @@ doio_send(isc_socket_t *sock, isc_socketevent_t *dev) {
* references exist.
*/
static void
-closesocket(isc_socketmgr_t *manager, isc_socket_t *sock, int fd) {
+closesocket(isc__socketmgr_t *manager, isc__socket_t *sock, int fd) {
isc_sockettype_t type = sock->type;
int lockid = FDLOCK_ID(fd);
@@ -1804,10 +1968,10 @@ closesocket(isc_socketmgr_t *manager, isc_socket_t *sock, int fd) {
}
static void
-destroy(isc_socket_t **sockp) {
+destroy(isc__socket_t **sockp) {
int fd;
- isc_socket_t *sock = *sockp;
- isc_socketmgr_t *manager = sock->manager;
+ isc__socket_t *sock = *sockp;
+ isc__socketmgr_t *manager = sock->manager;
socket_log(sock, NULL, CREATION, isc_msgcat, ISC_MSGSET_SOCKET,
ISC_MSG_DESTROYING, "destroying");
@@ -1828,10 +1992,10 @@ destroy(isc_socket_t **sockp) {
ISC_LIST_UNLINK(manager->socklist, sock, link);
-#ifdef ISC_PLATFORM_USETHREADS
+#ifdef USE_WATCHER_THREAD
if (ISC_LIST_EMPTY(manager->socklist))
SIGNAL(&manager->shutdown_ok);
-#endif /* ISC_PLATFORM_USETHREADS */
+#endif /* USE_WATCHER_THREAD */
UNLOCK(&manager->lock);
@@ -1839,10 +2003,10 @@ destroy(isc_socket_t **sockp) {
}
static isc_result_t
-allocate_socket(isc_socketmgr_t *manager, isc_sockettype_t type,
- isc_socket_t **socketp)
+allocate_socket(isc__socketmgr_t *manager, isc_sockettype_t type,
+ isc__socket_t **socketp)
{
- isc_socket_t *sock;
+ isc__socket_t *sock;
isc_result_t result;
ISC_SOCKADDR_LEN_T cmsgbuflen;
@@ -1853,7 +2017,8 @@ allocate_socket(isc_socketmgr_t *manager, isc_sockettype_t type,
result = ISC_R_UNEXPECTED;
- sock->magic = 0;
+ sock->common.magic = 0;
+ sock->common.impmagic = 0;
sock->references = 0;
sock->manager = manager;
@@ -1917,7 +2082,8 @@ allocate_socket(isc_socketmgr_t *manager, isc_sockettype_t type,
*/
result = isc_mutex_init(&sock->lock);
if (result != ISC_R_SUCCESS) {
- sock->magic = 0;
+ sock->common.magic = 0;
+ sock->common.impmagic = 0;
goto error;
}
@@ -1931,7 +2097,8 @@ allocate_socket(isc_socketmgr_t *manager, isc_sockettype_t type,
ISC_EVENTATTR_NOPURGE, NULL, ISC_SOCKEVENT_INTW,
NULL, sock, sock, NULL, NULL);
- sock->magic = SOCKET_MAGIC;
+ sock->common.magic = ISCAPI_SOCKET_MAGIC;
+ sock->common.impmagic = SOCKET_MAGIC;
*socketp = sock;
return (ISC_R_SUCCESS);
@@ -1956,8 +2123,8 @@ allocate_socket(isc_socketmgr_t *manager, isc_sockettype_t type,
* also close the socket.
*/
static void
-free_socket(isc_socket_t **socketp) {
- isc_socket_t *sock = *socketp;
+free_socket(isc__socket_t **socketp) {
+ isc__socket_t *sock = *socketp;
INSIST(sock->references == 0);
INSIST(VALID_SOCKET(sock));
@@ -1977,7 +2144,8 @@ free_socket(isc_socket_t **socketp) {
isc_mem_put(sock->manager->mctx, sock->sendcmsgbuf,
sock->sendcmsgbuflen);
- sock->magic = 0;
+ sock->common.magic = 0;
+ sock->common.impmagic = 0;
DESTROYLOCK(&sock->lock);
@@ -2025,7 +2193,7 @@ clear_bsdcompat(void) {
#endif
static isc_result_t
-opensocket(isc_socketmgr_t *manager, isc_socket_t *sock) {
+opensocket(isc__socketmgr_t *manager, isc__socket_t *sock) {
char strbuf[ISC_STRERRORSIZE];
const char *err = "socket";
int tries = 0;
@@ -2316,11 +2484,12 @@ opensocket(isc_socketmgr_t *manager, isc_socket_t *sock) {
* called with 'arg' as the arg value. The new socket is returned
* in 'socketp'.
*/
-isc_result_t
-isc_socket_create(isc_socketmgr_t *manager, int pf, isc_sockettype_t type,
- isc_socket_t **socketp)
+ISC_SOCKETFUNC_SCOPE isc_result_t
+isc__socket_create(isc_socketmgr_t *manager0, int pf, isc_sockettype_t type,
+ isc_socket_t **socketp)
{
- isc_socket_t *sock = NULL;
+ isc__socket_t *sock = NULL;
+ isc__socketmgr_t *manager = (isc__socketmgr_t *)manager0;
isc_result_t result;
int lockid;
@@ -2356,8 +2525,9 @@ isc_socket_create(isc_socketmgr_t *manager, int pf, isc_sockettype_t type,
return (result);
}
+ sock->common.methods = (isc_socketmethods_t *)&socketmethods;
sock->references = 1;
- *socketp = sock;
+ *socketp = (isc_socket_t *)sock;
/*
* Note we don't have to lock the socket like we normally would because
@@ -2388,9 +2558,11 @@ isc_socket_create(isc_socketmgr_t *manager, int pf, isc_sockettype_t type,
return (ISC_R_SUCCESS);
}
-isc_result_t
-isc_socket_open(isc_socket_t *sock) {
+#ifdef BIND9
+ISC_SOCKETFUNC_SCOPE isc_result_t
+isc__socket_open(isc_socket_t *sock0) {
isc_result_t result;
+ isc__socket_t *sock = (isc__socket_t *)sock0;
REQUIRE(VALID_SOCKET(sock));
@@ -2430,6 +2602,7 @@ isc_socket_open(isc_socket_t *sock) {
return (result);
}
+#endif /* BIND9 */
/*
* Create a new 'type' socket managed by 'manager'. Events
@@ -2437,12 +2610,13 @@ isc_socket_open(isc_socket_t *sock) {
* called with 'arg' as the arg value. The new socket is returned
* in 'socketp'.
*/
-isc_result_t
-isc_socket_fdwatchcreate(isc_socketmgr_t *manager, int fd, int flags,
- isc_sockfdwatch_t callback, void *cbarg,
- isc_task_t *task, isc_socket_t **socketp)
+ISC_SOCKETFUNC_SCOPE isc_result_t
+isc__socket_fdwatchcreate(isc_socketmgr_t *manager0, int fd, int flags,
+ isc_sockfdwatch_t callback, void *cbarg,
+ isc_task_t *task, isc_socket_t **socketp)
{
- isc_socket_t *sock = NULL;
+ isc__socketmgr_t *manager = (isc__socketmgr_t *)manager0;
+ isc__socket_t *sock = NULL;
isc_result_t result;
int lockid;
@@ -2460,8 +2634,9 @@ isc_socket_fdwatchcreate(isc_socketmgr_t *manager, int fd, int flags,
sock->fdwatchtask = task;
sock->statsindex = fdwatchstatsindex;
+ sock->common.methods = (isc_socketmethods_t *)&socketmethods;
sock->references = 1;
- *socketp = sock;
+ *socketp = (isc_socket_t *)sock;
/*
* Note we don't have to lock the socket like we normally would because
@@ -2494,10 +2669,50 @@ isc_socket_fdwatchcreate(isc_socketmgr_t *manager, int fd, int flags,
}
/*
+ * Indicate to the manager that it should watch the socket again.
+ * This can be used to restart watching if the previous event handler
+ * didn't indicate there was more data to be processed. Primarily
+ * it is for writing but could be used for reading if desired
+ */
+
+ISC_SOCKETFUNC_SCOPE isc_result_t
+isc__socket_fdwatchpoke(isc_socket_t *sock0, int flags)
+{
+ isc__socket_t *sock = (isc__socket_t *)sock0;
+
+ REQUIRE(VALID_SOCKET(sock));
+
+ /*
+ * We check both flags first to allow us to get the lock
+ * once but only if we need it.
+ */
+
+ if ((flags & (ISC_SOCKFDWATCH_READ | ISC_SOCKFDWATCH_WRITE)) != 0) {
+ LOCK(&sock->lock);
+ if (((flags & ISC_SOCKFDWATCH_READ) != 0) &&
+ !sock->pending_recv)
+ select_poke(sock->manager, sock->fd,
+ SELECT_POKE_READ);
+ if (((flags & ISC_SOCKFDWATCH_WRITE) != 0) &&
+ !sock->pending_send)
+ select_poke(sock->manager, sock->fd,
+ SELECT_POKE_WRITE);
+ UNLOCK(&sock->lock);
+ }
+
+ socket_log(sock, NULL, TRACE, isc_msgcat, ISC_MSGSET_SOCKET,
+ ISC_MSG_POKED, "fdwatch-poked flags: %d", flags);
+
+ return (ISC_R_SUCCESS);
+}
+
+/*
* Attach to a socket. Caller must explicitly detach when it is done.
*/
-void
-isc_socket_attach(isc_socket_t *sock, isc_socket_t **socketp) {
+ISC_SOCKETFUNC_SCOPE void
+isc__socket_attach(isc_socket_t *sock0, isc_socket_t **socketp) {
+ isc__socket_t *sock = (isc__socket_t *)sock0;
+
REQUIRE(VALID_SOCKET(sock));
REQUIRE(socketp != NULL && *socketp == NULL);
@@ -2505,20 +2720,20 @@ isc_socket_attach(isc_socket_t *sock, isc_socket_t **socketp) {
sock->references++;
UNLOCK(&sock->lock);
- *socketp = sock;
+ *socketp = (isc_socket_t *)sock;
}
/*
* Dereference a socket. If this is the last reference to it, clean things
* up by destroying the socket.
*/
-void
-isc_socket_detach(isc_socket_t **socketp) {
- isc_socket_t *sock;
+ISC_SOCKETFUNC_SCOPE void
+isc__socket_detach(isc_socket_t **socketp) {
+ isc__socket_t *sock;
isc_boolean_t kill_socket = ISC_FALSE;
REQUIRE(socketp != NULL);
- sock = *socketp;
+ sock = (isc__socket_t *)*socketp;
REQUIRE(VALID_SOCKET(sock));
LOCK(&sock->lock);
@@ -2534,10 +2749,12 @@ isc_socket_detach(isc_socket_t **socketp) {
*socketp = NULL;
}
-isc_result_t
-isc_socket_close(isc_socket_t *sock) {
+#ifdef BIND9
+ISC_SOCKETFUNC_SCOPE isc_result_t
+isc__socket_close(isc_socket_t *sock0) {
+ isc__socket_t *sock = (isc__socket_t *)sock0;
int fd;
- isc_socketmgr_t *manager;
+ isc__socketmgr_t *manager;
isc_sockettype_t type;
REQUIRE(VALID_SOCKET(sock));
@@ -2575,6 +2792,7 @@ isc_socket_close(isc_socket_t *sock) {
return (ISC_R_SUCCESS);
}
+#endif /* BIND9 */
/*
* I/O is possible on a given socket. Schedule an event to this task that
@@ -2585,7 +2803,7 @@ isc_socket_close(isc_socket_t *sock) {
* The socket and manager must be locked before calling this function.
*/
static void
-dispatch_recv(isc_socket_t *sock) {
+dispatch_recv(isc__socket_t *sock) {
intev_t *iev;
isc_socketevent_t *ev;
isc_task_t *sender;
@@ -2619,7 +2837,7 @@ dispatch_recv(isc_socket_t *sock) {
}
static void
-dispatch_send(isc_socket_t *sock) {
+dispatch_send(isc__socket_t *sock) {
intev_t *iev;
isc_socketevent_t *ev;
isc_task_t *sender;
@@ -2656,7 +2874,7 @@ dispatch_send(isc_socket_t *sock) {
* Dispatch an internal accept event.
*/
static void
-dispatch_accept(isc_socket_t *sock) {
+dispatch_accept(isc__socket_t *sock) {
intev_t *iev;
isc_socket_newconnev_t *ev;
@@ -2682,7 +2900,7 @@ dispatch_accept(isc_socket_t *sock) {
}
static void
-dispatch_connect(isc_socket_t *sock) {
+dispatch_connect(isc__socket_t *sock) {
intev_t *iev;
isc_socket_connev_t *ev;
@@ -2712,7 +2930,7 @@ dispatch_connect(isc_socket_t *sock) {
* Caller must have the socket locked if the event is attached to the socket.
*/
static void
-send_recvdone_event(isc_socket_t *sock, isc_socketevent_t **dev) {
+send_recvdone_event(isc__socket_t *sock, isc_socketevent_t **dev) {
isc_task_t *task;
task = (*dev)->ev_sender;
@@ -2735,7 +2953,7 @@ send_recvdone_event(isc_socket_t *sock, isc_socketevent_t **dev) {
* Caller must have the socket locked if the event is attached to the socket.
*/
static void
-send_senddone_event(isc_socket_t *sock, isc_socketevent_t **dev) {
+send_senddone_event(isc__socket_t *sock, isc_socketevent_t **dev) {
isc_task_t *task;
INSIST(dev != NULL && *dev != NULL);
@@ -2766,8 +2984,8 @@ send_senddone_event(isc_socket_t *sock, isc_socketevent_t **dev) {
*/
static void
internal_accept(isc_task_t *me, isc_event_t *ev) {
- isc_socket_t *sock;
- isc_socketmgr_t *manager;
+ isc__socket_t *sock;
+ isc__socketmgr_t *manager;
isc_socket_newconnev_t *dev;
isc_task_t *task;
ISC_SOCKADDR_LEN_T addrlen;
@@ -2822,9 +3040,9 @@ internal_accept(isc_task_t *me, isc_event_t *ev) {
* daemons such as BIND 8 and Apache.
*/
- addrlen = sizeof(dev->newsocket->peer_address.type);
- memset(&dev->newsocket->peer_address.type, 0, addrlen);
- fd = accept(sock->fd, &dev->newsocket->peer_address.type.sa,
+ addrlen = sizeof(NEWCONNSOCK(dev)->peer_address.type);
+ memset(&NEWCONNSOCK(dev)->peer_address.type, 0, addrlen);
+ fd = accept(sock->fd, &NEWCONNSOCK(dev)->peer_address.type.sa,
(void *)&addrlen);
#ifdef F_DUPFD
@@ -2894,14 +3112,14 @@ internal_accept(isc_task_t *me, isc_event_t *ev) {
(void)close(fd);
goto soft_error;
- } else if (dev->newsocket->peer_address.type.sa.sa_family !=
+ } else if (NEWCONNSOCK(dev)->peer_address.type.sa.sa_family !=
sock->pf)
{
UNEXPECTED_ERROR(__FILE__, __LINE__,
"internal_accept(): "
"accept() returned peer address "
"family %u (expected %u)",
- dev->newsocket->peer_address.
+ NEWCONNSOCK(dev)->peer_address.
type.sa.sa_family,
sock->pf);
(void)close(fd);
@@ -2920,8 +3138,8 @@ internal_accept(isc_task_t *me, isc_event_t *ev) {
}
if (fd != -1) {
- dev->newsocket->peer_address.length = addrlen;
- dev->newsocket->pf = sock->pf;
+ NEWCONNSOCK(dev)->peer_address.length = addrlen;
+ NEWCONNSOCK(dev)->pf = sock->pf;
}
/*
@@ -2950,28 +3168,28 @@ internal_accept(isc_task_t *me, isc_event_t *ev) {
int lockid = FDLOCK_ID(fd);
LOCK(&manager->fdlock[lockid]);
- manager->fds[fd] = dev->newsocket;
+ manager->fds[fd] = NEWCONNSOCK(dev);
manager->fdstate[fd] = MANAGED;
UNLOCK(&manager->fdlock[lockid]);
LOCK(&manager->lock);
- ISC_LIST_APPEND(manager->socklist, dev->newsocket, link);
+ ISC_LIST_APPEND(manager->socklist, NEWCONNSOCK(dev), link);
- dev->newsocket->fd = fd;
- dev->newsocket->bound = 1;
- dev->newsocket->connected = 1;
+ NEWCONNSOCK(dev)->fd = fd;
+ NEWCONNSOCK(dev)->bound = 1;
+ NEWCONNSOCK(dev)->connected = 1;
/*
* Save away the remote address
*/
- dev->address = dev->newsocket->peer_address;
+ dev->address = NEWCONNSOCK(dev)->peer_address;
#ifdef USE_SELECT
if (manager->maxfd < fd)
manager->maxfd = fd;
#endif
- socket_log(sock, &dev->newsocket->peer_address, CREATION,
+ socket_log(sock, &NEWCONNSOCK(dev)->peer_address, CREATION,
isc_msgcat, ISC_MSGSET_SOCKET, ISC_MSG_ACCEPTEDCXN,
"accepted connection, new socket %p",
dev->newsocket);
@@ -2981,8 +3199,8 @@ internal_accept(isc_task_t *me, isc_event_t *ev) {
inc_stats(manager->stats, sock->statsindex[STATID_ACCEPT]);
} else {
inc_stats(manager->stats, sock->statsindex[STATID_ACCEPTFAIL]);
- dev->newsocket->references--;
- free_socket(&dev->newsocket);
+ NEWCONNSOCK(dev)->references--;
+ free_socket((isc__socket_t **)&dev->newsocket);
}
/*
@@ -3006,7 +3224,7 @@ internal_accept(isc_task_t *me, isc_event_t *ev) {
static void
internal_recv(isc_task_t *me, isc_event_t *ev) {
isc_socketevent_t *dev;
- isc_socket_t *sock;
+ isc__socket_t *sock;
INSIST(ev->ev_type == ISC_SOCKEVENT_INTR);
@@ -3071,14 +3289,14 @@ internal_recv(isc_task_t *me, isc_event_t *ev) {
static void
internal_send(isc_task_t *me, isc_event_t *ev) {
isc_socketevent_t *dev;
- isc_socket_t *sock;
+ isc__socket_t *sock;
INSIST(ev->ev_type == ISC_SOCKEVENT_INTW);
/*
* Find out what socket this is and lock it.
*/
- sock = (isc_socket_t *)ev->ev_sender;
+ sock = (isc__socket_t *)ev->ev_sender;
INSIST(VALID_SOCKET(sock));
LOCK(&sock->lock);
@@ -3125,7 +3343,7 @@ internal_send(isc_task_t *me, isc_event_t *ev) {
static void
internal_fdwatch_write(isc_task_t *me, isc_event_t *ev) {
- isc_socket_t *sock;
+ isc__socket_t *sock;
int more_data;
INSIST(ev->ev_type == ISC_SOCKEVENT_INTW);
@@ -3133,7 +3351,7 @@ internal_fdwatch_write(isc_task_t *me, isc_event_t *ev) {
/*
* Find out what socket this is and lock it.
*/
- sock = (isc_socket_t *)ev->ev_sender;
+ sock = (isc__socket_t *)ev->ev_sender;
INSIST(VALID_SOCKET(sock));
LOCK(&sock->lock);
@@ -3144,7 +3362,8 @@ internal_fdwatch_write(isc_task_t *me, isc_event_t *ev) {
INSIST(sock->pending_send == 1);
UNLOCK(&sock->lock);
- more_data = (sock->fdwatchcb)(me, sock, sock->fdwatcharg);
+ more_data = (sock->fdwatchcb)(me, (isc_socket_t *)sock,
+ sock->fdwatcharg, ISC_SOCKFDWATCH_WRITE);
LOCK(&sock->lock);
sock->pending_send = 0;
@@ -3165,7 +3384,7 @@ internal_fdwatch_write(isc_task_t *me, isc_event_t *ev) {
static void
internal_fdwatch_read(isc_task_t *me, isc_event_t *ev) {
- isc_socket_t *sock;
+ isc__socket_t *sock;
int more_data;
INSIST(ev->ev_type == ISC_SOCKEVENT_INTR);
@@ -3173,7 +3392,7 @@ internal_fdwatch_read(isc_task_t *me, isc_event_t *ev) {
/*
* Find out what socket this is and lock it.
*/
- sock = (isc_socket_t *)ev->ev_sender;
+ sock = (isc__socket_t *)ev->ev_sender;
INSIST(VALID_SOCKET(sock));
LOCK(&sock->lock);
@@ -3184,7 +3403,8 @@ internal_fdwatch_read(isc_task_t *me, isc_event_t *ev) {
INSIST(sock->pending_recv == 1);
UNLOCK(&sock->lock);
- more_data = (sock->fdwatchcb)(me, sock, sock->fdwatcharg);
+ more_data = (sock->fdwatchcb)(me, (isc_socket_t *)sock,
+ sock->fdwatcharg, ISC_SOCKFDWATCH_READ);
LOCK(&sock->lock);
sock->pending_recv = 0;
@@ -3208,10 +3428,10 @@ internal_fdwatch_read(isc_task_t *me, isc_event_t *ev) {
* and unlocking twice if both reads and writes are possible.
*/
static void
-process_fd(isc_socketmgr_t *manager, int fd, isc_boolean_t readable,
+process_fd(isc__socketmgr_t *manager, int fd, isc_boolean_t readable,
isc_boolean_t writeable)
{
- isc_socket_t *sock;
+ isc__socket_t *sock;
isc_boolean_t unlock_sock;
isc_boolean_t unwatch_read = ISC_FALSE, unwatch_write = ISC_FALSE;
int lockid = FDLOCK_ID(fd);
@@ -3277,11 +3497,11 @@ check_write:
#ifdef USE_KQUEUE
static isc_boolean_t
-process_fds(isc_socketmgr_t *manager, struct kevent *events, int nevents) {
+process_fds(isc__socketmgr_t *manager, struct kevent *events, int nevents) {
int i;
isc_boolean_t readable, writable;
isc_boolean_t done = ISC_FALSE;
-#ifdef ISC_PLATFORM_USETHREADS
+#ifdef USE_WATCHER_THREAD
isc_boolean_t have_ctlevent = ISC_FALSE;
#endif
@@ -3299,7 +3519,7 @@ process_fds(isc_socketmgr_t *manager, struct kevent *events, int nevents) {
for (i = 0; i < nevents; i++) {
REQUIRE(events[i].ident < manager->maxsocks);
-#ifdef ISC_PLATFORM_USETHREADS
+#ifdef USE_WATCHER_THREAD
if (events[i].ident == (uintptr_t)manager->pipe_fds[0]) {
have_ctlevent = ISC_TRUE;
continue;
@@ -3310,7 +3530,7 @@ process_fds(isc_socketmgr_t *manager, struct kevent *events, int nevents) {
process_fd(manager, events[i].ident, readable, writable);
}
-#ifdef ISC_PLATFORM_USETHREADS
+#ifdef USE_WATCHER_THREAD
if (have_ctlevent)
done = process_ctlfd(manager);
#endif
@@ -3319,10 +3539,11 @@ process_fds(isc_socketmgr_t *manager, struct kevent *events, int nevents) {
}
#elif defined(USE_EPOLL)
static isc_boolean_t
-process_fds(isc_socketmgr_t *manager, struct epoll_event *events, int nevents) {
+process_fds(isc__socketmgr_t *manager, struct epoll_event *events, int nevents)
+{
int i;
isc_boolean_t done = ISC_FALSE;
-#ifdef ISC_PLATFORM_USETHREADS
+#ifdef USE_WATCHER_THREAD
isc_boolean_t have_ctlevent = ISC_FALSE;
#endif
@@ -3335,7 +3556,7 @@ process_fds(isc_socketmgr_t *manager, struct epoll_event *events, int nevents) {
for (i = 0; i < nevents; i++) {
REQUIRE(events[i].data.fd < (int)manager->maxsocks);
-#ifdef ISC_PLATFORM_USETHREADS
+#ifdef USE_WATCHER_THREAD
if (events[i].data.fd == manager->pipe_fds[0]) {
have_ctlevent = ISC_TRUE;
continue;
@@ -3357,7 +3578,7 @@ process_fds(isc_socketmgr_t *manager, struct epoll_event *events, int nevents) {
(events[i].events & EPOLLOUT) != 0);
}
-#ifdef ISC_PLATFORM_USETHREADS
+#ifdef USE_WATCHER_THREAD
if (have_ctlevent)
done = process_ctlfd(manager);
#endif
@@ -3366,10 +3587,10 @@ process_fds(isc_socketmgr_t *manager, struct epoll_event *events, int nevents) {
}
#elif defined(USE_DEVPOLL)
static isc_boolean_t
-process_fds(isc_socketmgr_t *manager, struct pollfd *events, int nevents) {
+process_fds(isc__socketmgr_t *manager, struct pollfd *events, int nevents) {
int i;
isc_boolean_t done = ISC_FALSE;
-#ifdef ISC_PLATFORM_USETHREADS
+#ifdef USE_WATCHER_THREAD
isc_boolean_t have_ctlevent = ISC_FALSE;
#endif
@@ -3382,7 +3603,7 @@ process_fds(isc_socketmgr_t *manager, struct pollfd *events, int nevents) {
for (i = 0; i < nevents; i++) {
REQUIRE(events[i].fd < (int)manager->maxsocks);
-#ifdef ISC_PLATFORM_USETHREADS
+#ifdef USE_WATCHER_THREAD
if (events[i].fd == manager->pipe_fds[0]) {
have_ctlevent = ISC_TRUE;
continue;
@@ -3393,7 +3614,7 @@ process_fds(isc_socketmgr_t *manager, struct pollfd *events, int nevents) {
(events[i].events & POLLOUT) != 0);
}
-#ifdef ISC_PLATFORM_USETHREADS
+#ifdef USE_WATCHER_THREAD
if (have_ctlevent)
done = process_ctlfd(manager);
#endif
@@ -3402,27 +3623,27 @@ process_fds(isc_socketmgr_t *manager, struct pollfd *events, int nevents) {
}
#elif defined(USE_SELECT)
static void
-process_fds(isc_socketmgr_t *manager, int maxfd,
- fd_set *readfds, fd_set *writefds)
+process_fds(isc__socketmgr_t *manager, int maxfd, fd_set *readfds,
+ fd_set *writefds)
{
int i;
REQUIRE(maxfd <= (int)manager->maxsocks);
for (i = 0; i < maxfd; i++) {
-#ifdef ISC_PLATFORM_USETHREADS
+#ifdef USE_WATCHER_THREAD
if (i == manager->pipe_fds[0] || i == manager->pipe_fds[1])
continue;
-#endif /* ISC_PLATFORM_USETHREADS */
+#endif /* USE_WATCHER_THREAD */
process_fd(manager, i, FD_ISSET(i, readfds),
FD_ISSET(i, writefds));
}
}
#endif
-#ifdef ISC_PLATFORM_USETHREADS
+#ifdef USE_WATCHER_THREAD
static isc_boolean_t
-process_ctlfd(isc_socketmgr_t *manager) {
+process_ctlfd(isc__socketmgr_t *manager) {
int msg, fd;
for (;;) {
@@ -3470,7 +3691,7 @@ process_ctlfd(isc_socketmgr_t *manager) {
*/
static isc_threadresult_t
watcher(void *uap) {
- isc_socketmgr_t *manager = uap;
+ isc__socketmgr_t *manager = uap;
isc_boolean_t done;
int ctlfd;
int cc;
@@ -3585,22 +3806,34 @@ watcher(void *uap) {
return ((isc_threadresult_t)0);
}
-#endif /* ISC_PLATFORM_USETHREADS */
+#endif /* USE_WATCHER_THREAD */
-void
-isc__socketmgr_setreserved(isc_socketmgr_t *manager, isc_uint32_t reserved) {
+#ifdef BIND9
+ISC_SOCKETFUNC_SCOPE void
+isc__socketmgr_setreserved(isc_socketmgr_t *manager0, isc_uint32_t reserved) {
+ isc__socketmgr_t *manager = (isc__socketmgr_t *)manager0;
REQUIRE(VALID_MANAGER(manager));
manager->reserved = reserved;
}
+ISC_SOCKETFUNC_SCOPE void
+isc___socketmgr_maxudp(isc_socketmgr_t *manager0, int maxudp) {
+ isc__socketmgr_t *manager = (isc__socketmgr_t *)manager0;
+
+ REQUIRE(VALID_MANAGER(manager));
+
+ manager->maxudp = maxudp;
+}
+#endif /* BIND9 */
+
/*
* Create a new socket manager.
*/
static isc_result_t
-setup_watcher(isc_mem_t *mctx, isc_socketmgr_t *manager) {
+setup_watcher(isc_mem_t *mctx, isc__socketmgr_t *manager) {
isc_result_t result;
#if defined(USE_KQUEUE) || defined(USE_EPOLL) || defined(USE_DEVPOLL)
char strbuf[ISC_STRERRORSIZE];
@@ -3626,7 +3859,7 @@ setup_watcher(isc_mem_t *mctx, isc_socketmgr_t *manager) {
return (result);
}
-#ifdef ISC_PLATFORM_USETHREADS
+#ifdef USE_WATCHER_THREAD
result = watch_fd(manager, manager->pipe_fds[0], SELECT_POKE_READ);
if (result != ISC_R_SUCCESS) {
close(manager->kqueue_fd);
@@ -3634,7 +3867,7 @@ setup_watcher(isc_mem_t *mctx, isc_socketmgr_t *manager) {
sizeof(struct kevent) * manager->nevents);
return (result);
}
-#endif /* ISC_PLATFORM_USETHREADS */
+#endif /* USE_WATCHER_THREAD */
#elif defined(USE_EPOLL)
manager->nevents = ISC_SOCKET_MAXEVENTS;
manager->events = isc_mem_get(mctx, sizeof(struct epoll_event) *
@@ -3654,7 +3887,7 @@ setup_watcher(isc_mem_t *mctx, isc_socketmgr_t *manager) {
sizeof(struct epoll_event) * manager->nevents);
return (result);
}
-#ifdef ISC_PLATFORM_USETHREADS
+#ifdef USE_WATCHER_THREAD
result = watch_fd(manager, manager->pipe_fds[0], SELECT_POKE_READ);
if (result != ISC_R_SUCCESS) {
close(manager->epoll_fd);
@@ -3662,7 +3895,7 @@ setup_watcher(isc_mem_t *mctx, isc_socketmgr_t *manager) {
sizeof(struct epoll_event) * manager->nevents);
return (result);
}
-#endif /* ISC_PLATFORM_USETHREADS */
+#endif /* USE_WATCHER_THREAD */
#elif defined(USE_DEVPOLL)
/*
* XXXJT: /dev/poll seems to reject large numbers of events,
@@ -3700,7 +3933,7 @@ setup_watcher(isc_mem_t *mctx, isc_socketmgr_t *manager) {
sizeof(pollinfo_t) * manager->maxsocks);
return (result);
}
-#ifdef ISC_PLATFORM_USETHREADS
+#ifdef USE_WATCHER_THREAD
result = watch_fd(manager, manager->pipe_fds[0], SELECT_POKE_READ);
if (result != ISC_R_SUCCESS) {
close(manager->devpoll_fd);
@@ -3710,7 +3943,7 @@ setup_watcher(isc_mem_t *mctx, isc_socketmgr_t *manager) {
sizeof(pollinfo_t) * manager->maxsocks);
return (result);
}
-#endif /* ISC_PLATFORM_USETHREADS */
+#endif /* USE_WATCHER_THREAD */
#elif defined(USE_SELECT)
UNUSED(result);
@@ -3758,20 +3991,20 @@ setup_watcher(isc_mem_t *mctx, isc_socketmgr_t *manager) {
memset(manager->read_fds, 0, manager->fd_bufsize);
memset(manager->write_fds, 0, manager->fd_bufsize);
-#ifdef ISC_PLATFORM_USETHREADS
+#ifdef USE_WATCHER_THREAD
(void)watch_fd(manager, manager->pipe_fds[0], SELECT_POKE_READ);
manager->maxfd = manager->pipe_fds[0];
-#else /* ISC_PLATFORM_USETHREADS */
+#else /* USE_WATCHER_THREAD */
manager->maxfd = 0;
-#endif /* ISC_PLATFORM_USETHREADS */
+#endif /* USE_WATCHER_THREAD */
#endif /* USE_KQUEUE */
return (ISC_R_SUCCESS);
}
static void
-cleanup_watcher(isc_mem_t *mctx, isc_socketmgr_t *manager) {
-#ifdef ISC_PLATFORM_USETHREADS
+cleanup_watcher(isc_mem_t *mctx, isc__socketmgr_t *manager) {
+#ifdef USE_WATCHER_THREAD
isc_result_t result;
result = unwatch_fd(manager, manager->pipe_fds[0], SELECT_POKE_READ);
@@ -3781,7 +4014,7 @@ cleanup_watcher(isc_mem_t *mctx, isc_socketmgr_t *manager) {
isc_msgcat_get(isc_msgcat, ISC_MSGSET_GENERAL,
ISC_MSG_FAILED, "failed"));
}
-#endif /* ISC_PLATFORM_USETHREADS */
+#endif /* USE_WATCHER_THREAD */
#ifdef USE_KQUEUE
close(manager->kqueue_fd);
@@ -3809,35 +4042,35 @@ cleanup_watcher(isc_mem_t *mctx, isc_socketmgr_t *manager) {
#endif /* USE_KQUEUE */
}
-isc_result_t
-isc_socketmgr_create(isc_mem_t *mctx, isc_socketmgr_t **managerp) {
- return (isc_socketmgr_create2(mctx, managerp, 0));
+ISC_SOCKETFUNC_SCOPE isc_result_t
+isc__socketmgr_create(isc_mem_t *mctx, isc_socketmgr_t **managerp) {
+ return (isc__socketmgr_create2(mctx, managerp, 0));
}
-isc_result_t
-isc_socketmgr_create2(isc_mem_t *mctx, isc_socketmgr_t **managerp,
- unsigned int maxsocks)
+ISC_SOCKETFUNC_SCOPE isc_result_t
+isc__socketmgr_create2(isc_mem_t *mctx, isc_socketmgr_t **managerp,
+ unsigned int maxsocks)
{
int i;
- isc_socketmgr_t *manager;
-#ifdef ISC_PLATFORM_USETHREADS
+ isc__socketmgr_t *manager;
+#ifdef USE_WATCHER_THREAD
char strbuf[ISC_STRERRORSIZE];
#endif
isc_result_t result;
REQUIRE(managerp != NULL && *managerp == NULL);
-#ifndef ISC_PLATFORM_USETHREADS
+#ifdef USE_SHARED_MANAGER
if (socketmgr != NULL) {
/* Don't allow maxsocks to be updated */
if (maxsocks > 0 && socketmgr->maxsocks != maxsocks)
return (ISC_R_EXISTS);
socketmgr->refs++;
- *managerp = socketmgr;
+ *managerp = (isc_socketmgr_t *)socketmgr;
return (ISC_R_SUCCESS);
}
-#endif /* ISC_PLATFORM_USETHREADS */
+#endif /* USE_SHARED_MANAGER */
if (maxsocks == 0)
maxsocks = ISC_SOCKET_MAXSOCKETS;
@@ -3850,8 +4083,9 @@ isc_socketmgr_create2(isc_mem_t *mctx, isc_socketmgr_t **managerp,
memset(manager, 0, sizeof(*manager));
manager->maxsocks = maxsocks;
manager->reserved = 0;
+ manager->maxudp = 0;
manager->fds = isc_mem_get(mctx,
- manager->maxsocks * sizeof(isc_socket_t *));
+ manager->maxsocks * sizeof(isc__socket_t *));
if (manager->fds == NULL) {
result = ISC_R_NOMEMORY;
goto free_manager;
@@ -3863,7 +4097,9 @@ isc_socketmgr_create2(isc_mem_t *mctx, isc_socketmgr_t **managerp,
}
manager->stats = NULL;
- manager->magic = SOCKET_MANAGER_MAGIC;
+ manager->common.methods = &socketmgrmethods;
+ manager->common.magic = ISCAPI_SOCKETMGR_MAGIC;
+ manager->common.impmagic = SOCKET_MANAGER_MAGIC;
manager->mctx = NULL;
memset(manager->fds, 0, manager->maxsocks * sizeof(isc_socket_t *));
ISC_LIST_INIT(manager->socklist);
@@ -3887,7 +4123,7 @@ isc_socketmgr_create2(isc_mem_t *mctx, isc_socketmgr_t **managerp,
}
}
-#ifdef ISC_PLATFORM_USETHREADS
+#ifdef USE_WATCHER_THREAD
if (isc_condition_init(&manager->shutdown_ok) != ISC_R_SUCCESS) {
UNEXPECTED_ERROR(__FILE__, __LINE__,
"isc_condition_init() %s",
@@ -3916,9 +4152,11 @@ isc_socketmgr_create2(isc_mem_t *mctx, isc_socketmgr_t **managerp,
#if 0
RUNTIME_CHECK(make_nonblock(manager->pipe_fds[1]) == ISC_R_SUCCESS);
#endif
-#else /* ISC_PLATFORM_USETHREADS */
+#endif /* USE_WATCHER_THREAD */
+
+#ifdef USE_SHARED_MANAGER
manager->refs = 1;
-#endif /* ISC_PLATFORM_USETHREADS */
+#endif /* USE_SHARED_MANAGER */
/*
* Set up initial state for the select loop
@@ -3927,7 +4165,7 @@ isc_socketmgr_create2(isc_mem_t *mctx, isc_socketmgr_t **managerp,
if (result != ISC_R_SUCCESS)
goto cleanup;
memset(manager->fdstate, 0, manager->maxsocks * sizeof(int));
-#ifdef ISC_PLATFORM_USETHREADS
+#ifdef USE_WATCHER_THREAD
/*
* Start up the select/poll thread.
*/
@@ -3941,26 +4179,26 @@ isc_socketmgr_create2(isc_mem_t *mctx, isc_socketmgr_t **managerp,
result = ISC_R_UNEXPECTED;
goto cleanup;
}
-#endif /* ISC_PLATFORM_USETHREADS */
+#endif /* USE_WATCHER_THREAD */
isc_mem_attach(mctx, &manager->mctx);
-#ifndef ISC_PLATFORM_USETHREADS
+#ifdef USE_SHARED_MANAGER
socketmgr = manager;
-#endif /* ISC_PLATFORM_USETHREADS */
- *managerp = manager;
+#endif /* USE_SHARED_MANAGER */
+ *managerp = (isc_socketmgr_t *)manager;
return (ISC_R_SUCCESS);
cleanup:
-#ifdef ISC_PLATFORM_USETHREADS
+#ifdef USE_WATCHER_THREAD
(void)close(manager->pipe_fds[0]);
(void)close(manager->pipe_fds[1]);
-#endif /* ISC_PLATFORM_USETHREADS */
+#endif /* USE_WATCHER_THREAD */
-#ifdef ISC_PLATFORM_USETHREADS
+#ifdef USE_WATCHER_THREAD
cleanup_condition:
(void)isc_condition_destroy(&manager->shutdown_ok);
-#endif /* ISC_PLATFORM_USETHREADS */
+#endif /* USE_WATCHER_THREAD */
cleanup_lock:
@@ -3988,8 +4226,10 @@ free_manager:
return (result);
}
+#ifdef BIND9
isc_result_t
-isc_socketmgr_getmaxsockets(isc_socketmgr_t *manager, unsigned int *nsockp) {
+isc__socketmgr_getmaxsockets(isc_socketmgr_t *manager0, unsigned int *nsockp) {
+ isc__socketmgr_t *manager = (isc__socketmgr_t *)manager0;
REQUIRE(VALID_MANAGER(manager));
REQUIRE(nsockp != NULL);
@@ -3999,7 +4239,9 @@ isc_socketmgr_getmaxsockets(isc_socketmgr_t *manager, unsigned int *nsockp) {
}
void
-isc_socketmgr_setstats(isc_socketmgr_t *manager, isc_stats_t *stats) {
+isc__socketmgr_setstats(isc_socketmgr_t *manager0, isc_stats_t *stats) {
+ isc__socketmgr_t *manager = (isc__socketmgr_t *)manager0;
+
REQUIRE(VALID_MANAGER(manager));
REQUIRE(ISC_LIST_EMPTY(manager->socklist));
REQUIRE(manager->stats == NULL);
@@ -4007,10 +4249,11 @@ isc_socketmgr_setstats(isc_socketmgr_t *manager, isc_stats_t *stats) {
isc_stats_attach(stats, &manager->stats);
}
+#endif
-void
-isc_socketmgr_destroy(isc_socketmgr_t **managerp) {
- isc_socketmgr_t *manager;
+ISC_SOCKETFUNC_SCOPE void
+isc__socketmgr_destroy(isc_socketmgr_t **managerp) {
+ isc__socketmgr_t *manager;
int i;
isc_mem_t *mctx;
@@ -4019,42 +4262,36 @@ isc_socketmgr_destroy(isc_socketmgr_t **managerp) {
*/
REQUIRE(managerp != NULL);
- manager = *managerp;
+ manager = (isc__socketmgr_t *)*managerp;
REQUIRE(VALID_MANAGER(manager));
-#ifndef ISC_PLATFORM_USETHREADS
- if (manager->refs > 1) {
- manager->refs--;
+#ifdef USE_SHARED_MANAGER
+ manager->refs--;
+ if (manager->refs > 0) {
*managerp = NULL;
return;
}
-#endif /* ISC_PLATFORM_USETHREADS */
+ socketmgr = NULL;
+#endif /* USE_SHARED_MANAGER */
LOCK(&manager->lock);
-#ifdef ISC_PLATFORM_USETHREADS
/*
* Wait for all sockets to be destroyed.
*/
while (!ISC_LIST_EMPTY(manager->socklist)) {
+#ifdef USE_WATCHER_THREAD
manager_log(manager, CREATION, "%s",
isc_msgcat_get(isc_msgcat, ISC_MSGSET_SOCKET,
ISC_MSG_SOCKETSREMAIN,
"sockets exist"));
WAIT(&manager->shutdown_ok, &manager->lock);
+#else /* USE_WATCHER_THREAD */
+ UNLOCK(&manager->lock);
+ isc__taskmgr_dispatch(NULL);
+ LOCK(&manager->lock);
+#endif /* USE_WATCHER_THREAD */
}
-#else /* ISC_PLATFORM_USETHREADS */
- /*
- * Hope all sockets have been destroyed.
- */
- if (!ISC_LIST_EMPTY(manager->socklist)) {
- manager_log(manager, CREATION, "%s",
- isc_msgcat_get(isc_msgcat, ISC_MSGSET_SOCKET,
- ISC_MSG_SOCKETSREMAIN,
- "sockets exist"));
- INSIST(0);
- }
-#endif /* ISC_PLATFORM_USETHREADS */
UNLOCK(&manager->lock);
@@ -4065,7 +4302,7 @@ isc_socketmgr_destroy(isc_socketmgr_t **managerp) {
*/
select_poke(manager, 0, SELECT_POKE_SHUTDOWN);
-#ifdef ISC_PLATFORM_USETHREADS
+#ifdef USE_WATCHER_THREAD
/*
* Wait for thread to exit.
*/
@@ -4074,25 +4311,25 @@ isc_socketmgr_destroy(isc_socketmgr_t **managerp) {
"isc_thread_join() %s",
isc_msgcat_get(isc_msgcat, ISC_MSGSET_GENERAL,
ISC_MSG_FAILED, "failed"));
-#endif /* ISC_PLATFORM_USETHREADS */
+#endif /* USE_WATCHER_THREAD */
/*
* Clean up.
*/
cleanup_watcher(manager->mctx, manager);
-#ifdef ISC_PLATFORM_USETHREADS
+#ifdef USE_WATCHER_THREAD
(void)close(manager->pipe_fds[0]);
(void)close(manager->pipe_fds[1]);
(void)isc_condition_destroy(&manager->shutdown_ok);
-#endif /* ISC_PLATFORM_USETHREADS */
+#endif /* USE_WATCHER_THREAD */
for (i = 0; i < (int)manager->maxsocks; i++)
if (manager->fdstate[i] == CLOSE_PENDING) /* no need to lock */
(void)close(i);
isc_mem_put(manager->mctx, manager->fds,
- manager->maxsocks * sizeof(isc_socket_t *));
+ manager->maxsocks * sizeof(isc__socket_t *));
isc_mem_put(manager->mctx, manager->fdstate,
manager->maxsocks * sizeof(int));
@@ -4106,17 +4343,22 @@ isc_socketmgr_destroy(isc_socketmgr_t **managerp) {
FDLOCK_COUNT * sizeof(isc_mutex_t));
}
DESTROYLOCK(&manager->lock);
- manager->magic = 0;
+ manager->common.magic = 0;
+ manager->common.impmagic = 0;
mctx= manager->mctx;
isc_mem_put(mctx, manager, sizeof(*manager));
isc_mem_detach(&mctx);
*managerp = NULL;
+
+#ifdef USE_SHARED_MANAGER
+ socketmgr = NULL;
+#endif
}
static isc_result_t
-socket_recv(isc_socket_t *sock, isc_socketevent_t *dev, isc_task_t *task,
+socket_recv(isc__socket_t *sock, isc_socketevent_t *dev, isc_task_t *task,
unsigned int flags)
{
int io_state;
@@ -4187,13 +4429,14 @@ socket_recv(isc_socket_t *sock, isc_socketevent_t *dev, isc_task_t *task,
return (result);
}
-isc_result_t
-isc_socket_recvv(isc_socket_t *sock, isc_bufferlist_t *buflist,
- unsigned int minimum, isc_task_t *task,
- isc_taskaction_t action, const void *arg)
+ISC_SOCKETFUNC_SCOPE isc_result_t
+isc__socket_recvv(isc_socket_t *sock0, isc_bufferlist_t *buflist,
+ unsigned int minimum, isc_task_t *task,
+ isc_taskaction_t action, const void *arg)
{
+ isc__socket_t *sock = (isc__socket_t *)sock0;
isc_socketevent_t *dev;
- isc_socketmgr_t *manager;
+ isc__socketmgr_t *manager;
unsigned int iocount;
isc_buffer_t *buffer;
@@ -4241,12 +4484,14 @@ isc_socket_recvv(isc_socket_t *sock, isc_bufferlist_t *buflist,
return (socket_recv(sock, dev, task, 0));
}
-isc_result_t
-isc_socket_recv(isc_socket_t *sock, isc_region_t *region, unsigned int minimum,
- isc_task_t *task, isc_taskaction_t action, const void *arg)
+ISC_SOCKETFUNC_SCOPE isc_result_t
+isc__socket_recv(isc_socket_t *sock0, isc_region_t *region,
+ unsigned int minimum, isc_task_t *task,
+ isc_taskaction_t action, const void *arg)
{
+ isc__socket_t *sock = (isc__socket_t *)sock0;
isc_socketevent_t *dev;
- isc_socketmgr_t *manager;
+ isc__socketmgr_t *manager;
REQUIRE(VALID_SOCKET(sock));
REQUIRE(action != NULL);
@@ -4260,14 +4505,16 @@ isc_socket_recv(isc_socket_t *sock, isc_region_t *region, unsigned int minimum,
if (dev == NULL)
return (ISC_R_NOMEMORY);
- return (isc_socket_recv2(sock, region, minimum, task, dev, 0));
+ return (isc__socket_recv2(sock0, region, minimum, task, dev, 0));
}
-isc_result_t
-isc_socket_recv2(isc_socket_t *sock, isc_region_t *region,
- unsigned int minimum, isc_task_t *task,
- isc_socketevent_t *event, unsigned int flags)
+ISC_SOCKETFUNC_SCOPE isc_result_t
+isc__socket_recv2(isc_socket_t *sock0, isc_region_t *region,
+ unsigned int minimum, isc_task_t *task,
+ isc_socketevent_t *event, unsigned int flags)
{
+ isc__socket_t *sock = (isc__socket_t *)sock0;
+
event->ev_sender = sock;
event->result = ISC_R_UNEXPECTED;
ISC_LIST_INIT(event->bufferlist);
@@ -4292,7 +4539,7 @@ isc_socket_recv2(isc_socket_t *sock, isc_region_t *region,
}
static isc_result_t
-socket_send(isc_socket_t *sock, isc_socketevent_t *dev, isc_task_t *task,
+socket_send(isc__socket_t *sock, isc_socketevent_t *dev, isc_task_t *task,
isc_sockaddr_t *address, struct in6_pktinfo *pktinfo,
unsigned int flags)
{
@@ -4383,24 +4630,25 @@ socket_send(isc_socket_t *sock, isc_socketevent_t *dev, isc_task_t *task,
return (result);
}
-isc_result_t
-isc_socket_send(isc_socket_t *sock, isc_region_t *region,
- isc_task_t *task, isc_taskaction_t action, const void *arg)
+ISC_SOCKETFUNC_SCOPE isc_result_t
+isc__socket_send(isc_socket_t *sock, isc_region_t *region,
+ isc_task_t *task, isc_taskaction_t action, const void *arg)
{
/*
* REQUIRE() checking is performed in isc_socket_sendto().
*/
- return (isc_socket_sendto(sock, region, task, action, arg, NULL,
- NULL));
+ return (isc__socket_sendto(sock, region, task, action, arg, NULL,
+ NULL));
}
-isc_result_t
-isc_socket_sendto(isc_socket_t *sock, isc_region_t *region,
- isc_task_t *task, isc_taskaction_t action, const void *arg,
- isc_sockaddr_t *address, struct in6_pktinfo *pktinfo)
+ISC_SOCKETFUNC_SCOPE isc_result_t
+isc__socket_sendto(isc_socket_t *sock0, isc_region_t *region,
+ isc_task_t *task, isc_taskaction_t action, const void *arg,
+ isc_sockaddr_t *address, struct in6_pktinfo *pktinfo)
{
+ isc__socket_t *sock = (isc__socket_t *)sock0;
isc_socketevent_t *dev;
- isc_socketmgr_t *manager;
+ isc__socketmgr_t *manager;
REQUIRE(VALID_SOCKET(sock));
REQUIRE(region != NULL);
@@ -4422,21 +4670,22 @@ isc_socket_sendto(isc_socket_t *sock, isc_region_t *region,
return (socket_send(sock, dev, task, address, pktinfo, 0));
}
-isc_result_t
-isc_socket_sendv(isc_socket_t *sock, isc_bufferlist_t *buflist,
- isc_task_t *task, isc_taskaction_t action, const void *arg)
+ISC_SOCKETFUNC_SCOPE isc_result_t
+isc__socket_sendv(isc_socket_t *sock, isc_bufferlist_t *buflist,
+ isc_task_t *task, isc_taskaction_t action, const void *arg)
{
- return (isc_socket_sendtov(sock, buflist, task, action, arg, NULL,
- NULL));
+ return (isc__socket_sendtov(sock, buflist, task, action, arg, NULL,
+ NULL));
}
-isc_result_t
-isc_socket_sendtov(isc_socket_t *sock, isc_bufferlist_t *buflist,
- isc_task_t *task, isc_taskaction_t action, const void *arg,
- isc_sockaddr_t *address, struct in6_pktinfo *pktinfo)
+ISC_SOCKETFUNC_SCOPE isc_result_t
+isc__socket_sendtov(isc_socket_t *sock0, isc_bufferlist_t *buflist,
+ isc_task_t *task, isc_taskaction_t action, const void *arg,
+ isc_sockaddr_t *address, struct in6_pktinfo *pktinfo)
{
+ isc__socket_t *sock = (isc__socket_t *)sock0;
isc_socketevent_t *dev;
- isc_socketmgr_t *manager;
+ isc__socketmgr_t *manager;
unsigned int iocount;
isc_buffer_t *buffer;
@@ -4470,12 +4719,15 @@ isc_socket_sendtov(isc_socket_t *sock, isc_bufferlist_t *buflist,
return (socket_send(sock, dev, task, address, pktinfo, 0));
}
-isc_result_t
-isc_socket_sendto2(isc_socket_t *sock, isc_region_t *region,
- isc_task_t *task,
- isc_sockaddr_t *address, struct in6_pktinfo *pktinfo,
- isc_socketevent_t *event, unsigned int flags)
+ISC_SOCKETFUNC_SCOPE isc_result_t
+isc__socket_sendto2(isc_socket_t *sock0, isc_region_t *region,
+ isc_task_t *task,
+ isc_sockaddr_t *address, struct in6_pktinfo *pktinfo,
+ isc_socketevent_t *event, unsigned int flags)
{
+ isc__socket_t *sock = (isc__socket_t *)sock0;
+
+ REQUIRE(VALID_SOCKET(sock));
REQUIRE((flags & ~(ISC_SOCKFLAG_IMMEDIATE|ISC_SOCKFLAG_NORETRY)) == 0);
if ((flags & ISC_SOCKFLAG_NORETRY) != 0)
REQUIRE(sock->type == isc_sockettype_udp);
@@ -4490,8 +4742,8 @@ isc_socket_sendto2(isc_socket_t *sock, isc_region_t *region,
return (socket_send(sock, event, task, address, pktinfo, flags));
}
-void
-isc_socket_cleanunix(isc_sockaddr_t *sockaddr, isc_boolean_t active) {
+ISC_SOCKETFUNC_SCOPE void
+isc__socket_cleanunix(isc_sockaddr_t *sockaddr, isc_boolean_t active) {
#ifdef ISC_PLATFORM_HAVESYSUNH
int s;
struct stat sb;
@@ -4620,8 +4872,8 @@ isc_socket_cleanunix(isc_sockaddr_t *sockaddr, isc_boolean_t active) {
#endif
}
-isc_result_t
-isc_socket_permunix(isc_sockaddr_t *sockaddr, isc_uint32_t perm,
+ISC_SOCKETFUNC_SCOPE isc_result_t
+isc__socket_permunix(isc_sockaddr_t *sockaddr, isc_uint32_t perm,
isc_uint32_t owner, isc_uint32_t group)
{
#ifdef ISC_PLATFORM_HAVESYSUNH
@@ -4674,12 +4926,15 @@ isc_socket_permunix(isc_sockaddr_t *sockaddr, isc_uint32_t perm,
#endif
}
-isc_result_t
-isc_socket_bind(isc_socket_t *sock, isc_sockaddr_t *sockaddr,
- unsigned int options) {
+ISC_SOCKETFUNC_SCOPE isc_result_t
+isc__socket_bind(isc_socket_t *sock0, isc_sockaddr_t *sockaddr,
+ unsigned int options) {
+ isc__socket_t *sock = (isc__socket_t *)sock0;
char strbuf[ISC_STRERRORSIZE];
int on = 1;
+ REQUIRE(VALID_SOCKET(sock));
+
LOCK(&sock->lock);
INSIST(!sock->bound);
@@ -4745,8 +5000,9 @@ isc_socket_bind(isc_socket_t *sock, isc_sockaddr_t *sockaddr,
*/
#undef ENABLE_ACCEPTFILTER
-isc_result_t
-isc_socket_filter(isc_socket_t *sock, const char *filter) {
+ISC_SOCKETFUNC_SCOPE isc_result_t
+isc__socket_filter(isc_socket_t *sock0, const char *filter) {
+ isc__socket_t *sock = (isc__socket_t *)sock0;
#if defined(SO_ACCEPTFILTER) && defined(ENABLE_ACCEPTFILTER)
char strbuf[ISC_STRERRORSIZE];
struct accept_filter_arg afa;
@@ -4784,8 +5040,9 @@ isc_socket_filter(isc_socket_t *sock, const char *filter) {
* is a new connection we'll have to allocate a new one anyway, so we might
* as well keep things simple rather than having to track them.
*/
-isc_result_t
-isc_socket_listen(isc_socket_t *sock, unsigned int backlog) {
+ISC_SOCKETFUNC_SCOPE isc_result_t
+isc__socket_listen(isc_socket_t *sock0, unsigned int backlog) {
+ isc__socket_t *sock = (isc__socket_t *)sock0;
char strbuf[ISC_STRERRORSIZE];
REQUIRE(VALID_SOCKET(sock));
@@ -4818,14 +5075,15 @@ isc_socket_listen(isc_socket_t *sock, unsigned int backlog) {
/*
* This should try to do aggressive accept() XXXMLG
*/
-isc_result_t
-isc_socket_accept(isc_socket_t *sock,
+ISC_SOCKETFUNC_SCOPE isc_result_t
+isc__socket_accept(isc_socket_t *sock0,
isc_task_t *task, isc_taskaction_t action, const void *arg)
{
+ isc__socket_t *sock = (isc__socket_t *)sock0;
isc_socket_newconnev_t *dev;
- isc_socketmgr_t *manager;
+ isc__socketmgr_t *manager;
isc_task_t *ntask = NULL;
- isc_socket_t *nsock;
+ isc__socket_t *nsock;
isc_result_t result;
isc_boolean_t do_poke = ISC_FALSE;
@@ -4872,7 +5130,7 @@ isc_socket_accept(isc_socket_t *sock,
nsock->statsindex = sock->statsindex;
dev->ev_sender = ntask;
- dev->newsocket = nsock;
+ dev->newsocket = (isc_socket_t *)nsock;
/*
* Poke watcher here. We still have the socket locked, so there
@@ -4891,13 +5149,14 @@ isc_socket_accept(isc_socket_t *sock,
return (ISC_R_SUCCESS);
}
-isc_result_t
-isc_socket_connect(isc_socket_t *sock, isc_sockaddr_t *addr,
+ISC_SOCKETFUNC_SCOPE isc_result_t
+isc__socket_connect(isc_socket_t *sock0, isc_sockaddr_t *addr,
isc_task_t *task, isc_taskaction_t action, const void *arg)
{
+ isc__socket_t *sock = (isc__socket_t *)sock0;
isc_socket_connev_t *dev;
isc_task_t *ntask = NULL;
- isc_socketmgr_t *manager;
+ isc__socketmgr_t *manager;
int cc;
char strbuf[ISC_STRERRORSIZE];
char addrbuf[ISC_SOCKADDR_FORMATSIZE];
@@ -5037,7 +5296,7 @@ isc_socket_connect(isc_socket_t *sock, isc_sockaddr_t *addr,
*/
static void
internal_connect(isc_task_t *me, isc_event_t *ev) {
- isc_socket_t *sock;
+ isc__socket_t *sock;
isc_socket_connev_t *dev;
isc_task_t *task;
int cc;
@@ -5151,8 +5410,9 @@ internal_connect(isc_task_t *me, isc_event_t *ev) {
isc_task_sendanddetach(&task, ISC_EVENT_PTR(&dev));
}
-isc_result_t
-isc_socket_getpeername(isc_socket_t *sock, isc_sockaddr_t *addressp) {
+ISC_SOCKETFUNC_SCOPE isc_result_t
+isc__socket_getpeername(isc_socket_t *sock0, isc_sockaddr_t *addressp) {
+ isc__socket_t *sock = (isc__socket_t *)sock0;
isc_result_t result;
REQUIRE(VALID_SOCKET(sock));
@@ -5172,8 +5432,9 @@ isc_socket_getpeername(isc_socket_t *sock, isc_sockaddr_t *addressp) {
return (result);
}
-isc_result_t
-isc_socket_getsockname(isc_socket_t *sock, isc_sockaddr_t *addressp) {
+ISC_SOCKETFUNC_SCOPE isc_result_t
+isc__socket_getsockname(isc_socket_t *sock0, isc_sockaddr_t *addressp) {
+ isc__socket_t *sock = (isc__socket_t *)sock0;
ISC_SOCKADDR_LEN_T len;
isc_result_t result;
char strbuf[ISC_STRERRORSIZE];
@@ -5210,8 +5471,9 @@ isc_socket_getsockname(isc_socket_t *sock, isc_sockaddr_t *addressp) {
* Run through the list of events on this socket, and cancel the ones
* queued for task "task" of type "how". "how" is a bitmask.
*/
-void
-isc_socket_cancel(isc_socket_t *sock, isc_task_t *task, unsigned int how) {
+ISC_SOCKETFUNC_SCOPE void
+isc__socket_cancel(isc_socket_t *sock0, isc_task_t *task, unsigned int how) {
+ isc__socket_t *sock = (isc__socket_t *)sock0;
REQUIRE(VALID_SOCKET(sock));
@@ -5290,8 +5552,8 @@ isc_socket_cancel(isc_socket_t *sock, isc_task_t *task, unsigned int how) {
ISC_LIST_UNLINK(sock->accept_list, dev,
ev_link);
- dev->newsocket->references--;
- free_socket(&dev->newsocket);
+ NEWCONNSOCK(dev)->references--;
+ free_socket((isc__socket_t **)&dev->newsocket);
dev->result = ISC_R_CANCELED;
dev->ev_sender = sock;
@@ -5330,17 +5592,22 @@ isc_socket_cancel(isc_socket_t *sock, isc_task_t *task, unsigned int how) {
UNLOCK(&sock->lock);
}
-isc_sockettype_t
-isc_socket_gettype(isc_socket_t *sock) {
+ISC_SOCKETFUNC_SCOPE isc_sockettype_t
+isc__socket_gettype(isc_socket_t *sock0) {
+ isc__socket_t *sock = (isc__socket_t *)sock0;
+
REQUIRE(VALID_SOCKET(sock));
return (sock->type);
}
-isc_boolean_t
-isc_socket_isbound(isc_socket_t *sock) {
+ISC_SOCKETFUNC_SCOPE isc_boolean_t
+isc__socket_isbound(isc_socket_t *sock0) {
+ isc__socket_t *sock = (isc__socket_t *)sock0;
isc_boolean_t val;
+ REQUIRE(VALID_SOCKET(sock));
+
LOCK(&sock->lock);
val = ((sock->bound) ? ISC_TRUE : ISC_FALSE);
UNLOCK(&sock->lock);
@@ -5348,8 +5615,9 @@ isc_socket_isbound(isc_socket_t *sock) {
return (val);
}
-void
-isc_socket_ipv6only(isc_socket_t *sock, isc_boolean_t yes) {
+ISC_SOCKETFUNC_SCOPE void
+isc__socket_ipv6only(isc_socket_t *sock0, isc_boolean_t yes) {
+ isc__socket_t *sock = (isc__socket_t *)sock0;
#if defined(IPV6_V6ONLY)
int onoff = yes ? 1 : 0;
#else
@@ -5379,12 +5647,21 @@ isc_socket_ipv6only(isc_socket_t *sock, isc_boolean_t yes) {
#endif
}
-#ifndef ISC_PLATFORM_USETHREADS
-/* In our assumed scenario, we can simply use a single static object. */
+#ifndef USE_WATCHER_THREAD
+/*
+ * In our assumed scenario, we can simply use a single static object.
+ * XXX: this is not true if the application uses multiple threads with
+ * 'multi-context' mode. Fixing this is a future TODO item.
+ */
static isc_socketwait_t swait_private;
int
-isc__socketmgr_waitevents(struct timeval *tvp, isc_socketwait_t **swaitp) {
+isc__socketmgr_waitevents(isc_socketmgr_t *manager0, struct timeval *tvp,
+ isc_socketwait_t **swaitp)
+{
+ isc__socketmgr_t *manager = (isc__socketmgr_t *)manager0;
+
+
int n;
#ifdef USE_KQUEUE
struct timespec ts, *tsp;
@@ -5398,7 +5675,11 @@ isc__socketmgr_waitevents(struct timeval *tvp, isc_socketwait_t **swaitp) {
REQUIRE(swaitp != NULL && *swaitp == NULL);
- if (socketmgr == NULL)
+#ifdef USE_SHARED_MANAGER
+ if (manager == NULL)
+ manager = socketmgr;
+#endif
+ if (manager == NULL)
return (0);
#ifdef USE_KQUEUE
@@ -5408,8 +5689,8 @@ isc__socketmgr_waitevents(struct timeval *tvp, isc_socketwait_t **swaitp) {
tsp = &ts;
} else
tsp = NULL;
- swait_private.nevents = kevent(socketmgr->kqueue_fd, NULL, 0,
- socketmgr->events, socketmgr->nevents,
+ swait_private.nevents = kevent(manager->kqueue_fd, NULL, 0,
+ manager->events, manager->nevents,
tsp);
n = swait_private.nevents;
#elif defined(USE_EPOLL)
@@ -5417,29 +5698,28 @@ isc__socketmgr_waitevents(struct timeval *tvp, isc_socketwait_t **swaitp) {
timeout = tvp->tv_sec * 1000 + (tvp->tv_usec + 999) / 1000;
else
timeout = -1;
- swait_private.nevents = epoll_wait(socketmgr->epoll_fd,
- socketmgr->events,
- socketmgr->nevents, timeout);
+ swait_private.nevents = epoll_wait(manager->epoll_fd,
+ manager->events,
+ manager->nevents, timeout);
n = swait_private.nevents;
#elif defined(USE_DEVPOLL)
- dvp.dp_fds = socketmgr->events;
- dvp.dp_nfds = socketmgr->nevents;
+ dvp.dp_fds = manager->events;
+ dvp.dp_nfds = manager->nevents;
if (tvp != NULL) {
dvp.dp_timeout = tvp->tv_sec * 1000 +
(tvp->tv_usec + 999) / 1000;
} else
dvp.dp_timeout = -1;
- swait_private.nevents = ioctl(socketmgr->devpoll_fd, DP_POLL, &dvp);
+ swait_private.nevents = ioctl(manager->devpoll_fd, DP_POLL, &dvp);
n = swait_private.nevents;
#elif defined(USE_SELECT)
- memcpy(socketmgr->read_fds_copy, socketmgr->read_fds,
- socketmgr->fd_bufsize);
- memcpy(socketmgr->write_fds_copy, socketmgr->write_fds,
- socketmgr->fd_bufsize);
+ memcpy(manager->read_fds_copy, manager->read_fds, manager->fd_bufsize);
+ memcpy(manager->write_fds_copy, manager->write_fds,
+ manager->fd_bufsize);
- swait_private.readset = socketmgr->read_fds_copy;
- swait_private.writeset = socketmgr->write_fds_copy;
- swait_private.maxfd = socketmgr->maxfd + 1;
+ swait_private.readset = manager->read_fds_copy;
+ swait_private.writeset = manager->write_fds_copy;
+ swait_private.maxfd = manager->maxfd + 1;
n = select(swait_private.maxfd, swait_private.readset,
swait_private.writeset, NULL, tvp);
@@ -5450,24 +5730,32 @@ isc__socketmgr_waitevents(struct timeval *tvp, isc_socketwait_t **swaitp) {
}
isc_result_t
-isc__socketmgr_dispatch(isc_socketwait_t *swait) {
+isc__socketmgr_dispatch(isc_socketmgr_t *manager0, isc_socketwait_t *swait) {
+ isc__socketmgr_t *manager = (isc__socketmgr_t *)manager0;
+
REQUIRE(swait == &swait_private);
- if (socketmgr == NULL)
+#ifdef USE_SHARED_MANAGER
+ if (manager == NULL)
+ manager = socketmgr;
+#endif
+ if (manager == NULL)
return (ISC_R_NOTFOUND);
#if defined(USE_KQUEUE) || defined(USE_EPOLL) || defined(USE_DEVPOLL)
- (void)process_fds(socketmgr, socketmgr->events, swait->nevents);
+ (void)process_fds(manager, manager->events, swait->nevents);
return (ISC_R_SUCCESS);
#elif defined(USE_SELECT)
- process_fds(socketmgr, swait->maxfd, swait->readset, swait->writeset);
+ process_fds(manager, swait->maxfd, swait->readset, swait->writeset);
return (ISC_R_SUCCESS);
#endif
}
-#endif /* ISC_PLATFORM_USETHREADS */
+#endif /* USE_WATCHER_THREAD */
+#ifdef BIND9
void
-isc_socket_setname(isc_socket_t *socket, const char *name, void *tag) {
+isc__socket_setname(isc_socket_t *socket0, const char *name, void *tag) {
+ isc__socket_t *socket = (isc__socket_t *)socket0;
/*
* Name 'socket'.
@@ -5482,17 +5770,29 @@ isc_socket_setname(isc_socket_t *socket, const char *name, void *tag) {
UNLOCK(&socket->lock);
}
-const char *
-isc_socket_getname(isc_socket_t *socket) {
+ISC_SOCKETFUNC_SCOPE const char *
+isc__socket_getname(isc_socket_t *socket0) {
+ isc__socket_t *socket = (isc__socket_t *)socket0;
+
return (socket->name);
}
void *
-isc_socket_gettag(isc_socket_t *socket) {
+isc__socket_gettag(isc_socket_t *socket0) {
+ isc__socket_t *socket = (isc__socket_t *)socket0;
+
return (socket->tag);
}
+#endif /* BIND9 */
-#ifdef HAVE_LIBXML2
+#ifdef USE_SOCKETIMPREGISTER
+isc_result_t
+isc__socket_register() {
+ return (isc_socket_register(isc__socketmgr_create));
+}
+#endif
+
+#if defined(HAVE_LIBXML2) && defined(BIND9)
static const char *
_socktype(isc_sockettype_t type)
@@ -5509,21 +5809,21 @@ _socktype(isc_sockettype_t type)
return ("not-initialized");
}
-void
-isc_socketmgr_renderxml(isc_socketmgr_t *mgr, xmlTextWriterPtr writer)
-{
- isc_socket_t *sock;
+ISC_SOCKETFUNC_SCOPE void
+isc_socketmgr_renderxml(isc_socketmgr_t *mgr0, xmlTextWriterPtr writer) {
+ isc__socketmgr_t *mgr = (isc__socketmgr_t *)mgr0;
+ isc__socket_t *sock;
char peerbuf[ISC_SOCKADDR_FORMATSIZE];
isc_sockaddr_t addr;
ISC_SOCKADDR_LEN_T len;
LOCK(&mgr->lock);
-#ifndef ISC_PLATFORM_USETHREADS
+#ifdef USE_SHARED_MANAGER
xmlTextWriterStartElement(writer, ISC_XMLCHAR "references");
xmlTextWriterWriteFormatString(writer, "%d", mgr->refs);
xmlTextWriterEndElement(writer);
-#endif
+#endif /* USE_SHARED_MANAGER */
xmlTextWriterStartElement(writer, ISC_XMLCHAR "sockets");
sock = ISC_LIST_HEAD(mgr->socklist);
diff --git a/contrib/bind9/lib/isc/unix/socket_p.h b/contrib/bind9/lib/isc/unix/socket_p.h
index b9a2347..b6c4b6a 100644
--- a/contrib/bind9/lib/isc/unix/socket_p.h
+++ b/contrib/bind9/lib/isc/unix/socket_p.h
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004, 2005, 2007, 2008 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004, 2005, 2007-2009 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 2000, 2001 Internet Software Consortium.
*
* Permission to use, copy, modify, and/or distribute this software for any
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: socket_p.h,v 1.13 2008-06-23 23:47:11 tbox Exp $ */
+/* $Id: socket_p.h,v 1.15 2009-09-02 23:48:03 tbox Exp $ */
#ifndef ISC_SOCKET_P_H
#define ISC_SOCKET_P_H
@@ -27,6 +27,7 @@
#endif
typedef struct isc_socketwait isc_socketwait_t;
-int isc__socketmgr_waitevents(struct timeval *, isc_socketwait_t **);
-isc_result_t isc__socketmgr_dispatch(isc_socketwait_t *);
+int isc__socketmgr_waitevents(isc_socketmgr_t *, struct timeval *,
+ isc_socketwait_t **);
+isc_result_t isc__socketmgr_dispatch(isc_socketmgr_t *, isc_socketwait_t *);
#endif /* ISC_SOCKET_P_H */
diff --git a/contrib/bind9/lib/isc/unix/strerror.c b/contrib/bind9/lib/isc/unix/strerror.c
index 08ea52d..4a61a97 100644
--- a/contrib/bind9/lib/isc/unix/strerror.c
+++ b/contrib/bind9/lib/isc/unix/strerror.c
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: strerror.c,v 1.8.332.2 2009-02-16 23:47:15 tbox Exp $ */
+/* $Id: strerror.c,v 1.10 2009-02-16 23:48:04 tbox Exp $ */
/*! \file */
diff --git a/contrib/bind9/lib/isccc/Makefile.in b/contrib/bind9/lib/isccc/Makefile.in
index fb08fcd..1417172 100644
--- a/contrib/bind9/lib/isccc/Makefile.in
+++ b/contrib/bind9/lib/isccc/Makefile.in
@@ -1,4 +1,4 @@
-# Copyright (C) 2004, 2007 Internet Systems Consortium, Inc. ("ISC")
+# Copyright (C) 2004, 2007, 2009, 2011 Internet Systems Consortium, Inc. ("ISC")
# Copyright (C) 2001, 2003 Internet Software Consortium.
#
# Permission to use, copy, modify, and/or distribute this software for any
@@ -13,7 +13,7 @@
# OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
# PERFORMANCE OF THIS SOFTWARE.
-# $Id: Makefile.in,v 1.9 2007-06-19 23:47:21 tbox Exp $
+# $Id: Makefile.in,v 1.12.244.1.2.1 2011-06-02 23:47:37 tbox Exp $
srcdir = @srcdir@
VPATH = @srcdir@
@@ -71,7 +71,7 @@ libisccc.la: ${OBJS}
${LIBTOOL_MODE_LINK} \
${CC} ${ALL_CFLAGS} ${LDFLAGS} -o libisccc.la -rpath ${libdir} \
-version-info ${LIBINTERFACE}:${LIBREVISION}:${LIBAGE} \
- ${OBJS} ${LIBS} ${ISCLIBS}
+ ${OBJS} ${ISCLIBS} ${LIBS}
timestamp: libisccc.@A@
touch timestamp
diff --git a/contrib/bind9/lib/isccc/api b/contrib/bind9/lib/isccc/api
index 2240cdd..94575eb 100644
--- a/contrib/bind9/lib/isccc/api
+++ b/contrib/bind9/lib/isccc/api
@@ -1,3 +1,3 @@
-LIBINTERFACE = 50
-LIBREVISION = 1
+LIBINTERFACE = 80
+LIBREVISION = 0
LIBAGE = 0
diff --git a/contrib/bind9/lib/isccfg/Makefile.in b/contrib/bind9/lib/isccfg/Makefile.in
index 4c55a16..37b0a26 100644
--- a/contrib/bind9/lib/isccfg/Makefile.in
+++ b/contrib/bind9/lib/isccfg/Makefile.in
@@ -1,4 +1,4 @@
-# Copyright (C) 2004, 2005, 2007 Internet Systems Consortium, Inc. ("ISC")
+# Copyright (C) 2004, 2005, 2007, 2009, 2011 Internet Systems Consortium, Inc. ("ISC")
# Copyright (C) 2001-2003 Internet Software Consortium.
#
# Permission to use, copy, modify, and/or distribute this software for any
@@ -13,7 +13,7 @@
# OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
# PERFORMANCE OF THIS SOFTWARE.
-# $Id: Makefile.in,v 1.18 2007-06-19 23:47:22 tbox Exp $
+# $Id: Makefile.in,v 1.21.244.1.2.1 2011-06-02 23:47:37 tbox Exp $
srcdir = @srcdir@
VPATH = @srcdir@
@@ -27,7 +27,7 @@ top_srcdir = @top_srcdir@
CINCLUDES = -I. ${DNS_INCLUDES} ${ISC_INCLUDES} ${ISCCFG_INCLUDES}
-CDEFINES = @USE_DLZ@
+CDEFINES = @USE_DLZ@
CWARNINGS =
ISCLIBS = ../../lib/isc/libisc.@A@
@@ -68,7 +68,7 @@ libisccfg.la: ${OBJS}
${LIBTOOL_MODE_LINK} \
${CC} ${ALL_CFLAGS} ${LDFLAGS} -o libisccfg.la -rpath ${libdir} \
-version-info ${LIBINTERFACE}:${LIBREVISION}:${LIBAGE} \
- ${OBJS} ${LIBS} ${DNSLIBS} ${ISCCCLIBS} ${ISCLIBS}
+ ${OBJS} ${DNSLIBS} ${ISCCCLIBS} ${ISCLIBS} ${LIBS}
timestamp: libisccfg.@A@
touch timestamp
diff --git a/contrib/bind9/lib/isccfg/aclconf.c b/contrib/bind9/lib/isccfg/aclconf.c
index 6bf0ad8..44d436a4 100644
--- a/contrib/bind9/lib/isccfg/aclconf.c
+++ b/contrib/bind9/lib/isccfg/aclconf.c
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004-2009 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004-2010 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 1999-2002 Internet Software Consortium.
*
* Permission to use, copy, modify, and/or distribute this software for any
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: aclconf.c,v 1.22.34.4 2009-10-01 23:47:17 tbox Exp $ */
+/* $Id: aclconf.c,v 1.29 2010-08-13 23:47:03 tbox Exp $ */
#include <config.h>
@@ -39,7 +39,7 @@ cfg_aclconfctx_init(cfg_aclconfctx_t *ctx) {
}
void
-cfg_aclconfctx_destroy(cfg_aclconfctx_t *ctx) {
+cfg_aclconfctx_clear(cfg_aclconfctx_t *ctx) {
dns_acl_t *dacl, *next;
for (dacl = ISC_LIST_HEAD(ctx->named_acl_cache);
@@ -51,6 +51,23 @@ cfg_aclconfctx_destroy(cfg_aclconfctx_t *ctx) {
}
}
+void
+cfg_aclconfctx_clone(cfg_aclconfctx_t *src, cfg_aclconfctx_t *dest) {
+ dns_acl_t *dacl, *next;
+ REQUIRE(src != NULL && dest != NULL);
+
+ cfg_aclconfctx_init(dest);
+ for (dacl = ISC_LIST_HEAD(src->named_acl_cache);
+ dacl != NULL;
+ dacl = next)
+ {
+ dns_acl_t *copy;
+ next = ISC_LIST_NEXT(dacl, nextincache);
+ dns_acl_attach(dacl, &copy);
+ ISC_LIST_APPEND(dest->named_acl_cache, copy, nextincache);
+ }
+}
+
/*
* Find the definition of the named acl whose name is "name".
*/
@@ -150,7 +167,7 @@ convert_keyname(const cfg_obj_t *keyobj, isc_log_t *lctx, isc_mem_t *mctx,
isc_buffer_add(&buf, keylen);
dns_fixedname_init(&fixname);
result = dns_name_fromtext(dns_fixedname_name(&fixname), &buf,
- dns_rootname, ISC_FALSE, NULL);
+ dns_rootname, 0, NULL);
if (result != ISC_R_SUCCESS) {
cfg_obj_log(keyobj, lctx, ISC_LOG_WARNING,
"key name '%s' is not a valid domain name",
diff --git a/contrib/bind9/lib/isccfg/api b/contrib/bind9/lib/isccfg/api
index fbbf923..7821c32 100644
--- a/contrib/bind9/lib/isccfg/api
+++ b/contrib/bind9/lib/isccfg/api
@@ -1,3 +1,3 @@
-LIBINTERFACE = 50
-LIBREVISION = 3
-LIBAGE = 0
+LIBINTERFACE = 81
+LIBREVISION = 1
+LIBAGE = 1
diff --git a/contrib/bind9/lib/isccfg/dnsconf.c b/contrib/bind9/lib/isccfg/dnsconf.c
new file mode 100644
index 0000000..7091d63
--- /dev/null
+++ b/contrib/bind9/lib/isccfg/dnsconf.c
@@ -0,0 +1,69 @@
+/*
+ * Copyright (C) 2009 Internet Systems Consortium, Inc. ("ISC")
+ *
+ * Permission to use, copy, modify, and/or 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 ISC DISCLAIMS ALL WARRANTIES WITH
+ * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+ * AND FITNESS. IN NO EVENT SHALL ISC 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.
+ */
+
+/* $Id: dnsconf.c,v 1.4 2009-09-02 23:48:03 tbox Exp $ */
+
+/*! \file */
+
+#include <config.h>
+
+#include <isccfg/cfg.h>
+#include <isccfg/grammar.h>
+
+/*%
+ * A trusted key, as used in the "trusted-keys" statement.
+ */
+static cfg_tuplefielddef_t trustedkey_fields[] = {
+ { "name", &cfg_type_astring, 0 },
+ { "flags", &cfg_type_uint32, 0 },
+ { "protocol", &cfg_type_uint32, 0 },
+ { "algorithm", &cfg_type_uint32, 0 },
+ { "key", &cfg_type_qstring, 0 },
+ { NULL, NULL, 0 }
+};
+
+static cfg_type_t cfg_type_trustedkey = {
+ "trustedkey", cfg_parse_tuple, cfg_print_tuple, cfg_doc_tuple,
+ &cfg_rep_tuple, trustedkey_fields
+};
+
+static cfg_type_t cfg_type_trustedkeys = {
+ "trusted-keys", cfg_parse_bracketed_list, cfg_print_bracketed_list,
+ cfg_doc_bracketed_list, &cfg_rep_list, &cfg_type_trustedkey
+};
+
+/*%
+ * Clauses that can be found within the top level of the dns.conf
+ * file only.
+ */
+static cfg_clausedef_t
+dnsconf_clauses[] = {
+ { "trusted-keys", &cfg_type_trustedkeys, CFG_CLAUSEFLAG_MULTI },
+ { NULL, NULL, 0 }
+};
+
+/*% The top-level dns.conf syntax. */
+
+static cfg_clausedef_t *
+dnsconf_clausesets[] = {
+ dnsconf_clauses,
+ NULL
+};
+
+LIBISCCFG_EXTERNAL_DATA cfg_type_t cfg_type_dnsconf = {
+ "dnsconf", cfg_parse_mapbody, cfg_print_mapbody, cfg_doc_mapbody,
+ &cfg_rep_map, dnsconf_clausesets
+};
diff --git a/contrib/bind9/lib/isccfg/include/isccfg/aclconf.h b/contrib/bind9/lib/isccfg/include/isccfg/aclconf.h
index f2ab70f..49aef03 100644
--- a/contrib/bind9/lib/isccfg/include/isccfg/aclconf.h
+++ b/contrib/bind9/lib/isccfg/include/isccfg/aclconf.h
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004-2007 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004-2007, 2010 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 1999-2001 Internet Software Consortium.
*
* Permission to use, copy, modify, and/or distribute this software for any
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: aclconf.h,v 1.10 2007-10-12 04:17:18 each Exp $ */
+/* $Id: aclconf.h,v 1.12 2010-08-13 23:47:04 tbox Exp $ */
#ifndef ISCCFG_ACLCONF_H
#define ISCCFG_ACLCONF_H 1
@@ -44,9 +44,15 @@ cfg_aclconfctx_init(cfg_aclconfctx_t *ctx);
*/
void
-cfg_aclconfctx_destroy(cfg_aclconfctx_t *ctx);
+cfg_aclconfctx_clone(cfg_aclconfctx_t *src, cfg_aclconfctx_t *dest);
/*
- * Destroy an ACL configuration context.
+ * Copy the contents of one ACL configuration context into another.
+ */
+
+void
+cfg_aclconfctx_clear(cfg_aclconfctx_t *ctx);
+/*
+ * Clear the contents of an ACL configuration context.
*/
isc_result_t
diff --git a/contrib/bind9/lib/isccfg/include/isccfg/cfg.h b/contrib/bind9/lib/isccfg/include/isccfg/cfg.h
index 06efa35..82900d6 100644
--- a/contrib/bind9/lib/isccfg/include/isccfg/cfg.h
+++ b/contrib/bind9/lib/isccfg/include/isccfg/cfg.h
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004-2007 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004-2007, 2010 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 2000-2002 Internet Software Consortium.
*
* Permission to use, copy, modify, and/or distribute this software for any
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: cfg.h,v 1.44 2007-10-12 04:17:18 each Exp $ */
+/* $Id: cfg.h,v 1.46 2010-08-13 23:47:04 tbox Exp $ */
#ifndef ISCCFG_CFG_H
#define ISCCFG_CFG_H 1
@@ -35,6 +35,7 @@
#include <isc/formatcheck.h>
#include <isc/lang.h>
+#include <isc/refcount.h>
#include <isc/types.h>
#include <isc/list.h>
@@ -70,7 +71,7 @@ typedef struct cfg_obj cfg_obj_t;
typedef struct cfg_listelt cfg_listelt_t;
/*%
- * A callback function to be called when parsing an option
+ * A callback function to be called when parsing an option
* that needs to be interpreted at parsing time, like
* "directory".
*/
@@ -83,6 +84,12 @@ typedef isc_result_t
ISC_LANG_BEGINDECLS
+void
+cfg_parser_attach(cfg_parser_t *src, cfg_parser_t **dest);
+/*%<
+ * Reference a parser object.
+ */
+
isc_result_t
cfg_parser_create(isc_mem_t *mctx, isc_log_t *lctx, cfg_parser_t **ret);
/*%<
@@ -123,7 +130,7 @@ cfg_parse_buffer(cfg_parser_t *pctx, isc_buffer_t *buffer,
* (isc_parse_buffer()).
*
* Returns an error if the file does not parse correctly.
- *
+ *
* Requires:
*\li "filename" is valid.
*\li "mem" is valid.
@@ -140,13 +147,14 @@ cfg_parse_buffer(cfg_parser_t *pctx, isc_buffer_t *buffer,
void
cfg_parser_destroy(cfg_parser_t **pctxp);
/*%<
- * Destroy a configuration parser.
+ * Remove a reference to a configuration parser; destroy it if there are no
+ * more references.
*/
isc_boolean_t
cfg_obj_isvoid(const cfg_obj_t *obj);
/*%<
- * Return true iff 'obj' is of void type (e.g., an optional
+ * Return true iff 'obj' is of void type (e.g., an optional
* value not specified).
*/
@@ -355,7 +363,7 @@ cfg_list_length(const cfg_obj_t *obj, isc_boolean_t recurse);
* all contained lists.
*/
-const cfg_obj_t *
+cfg_obj_t *
cfg_listelt_value(const cfg_listelt_t *elt);
/*%<
* Returns the configuration object associated with cfg_listelt_t.
@@ -389,17 +397,25 @@ cfg_print_grammar(const cfg_type_t *type,
isc_boolean_t
cfg_obj_istype(const cfg_obj_t *obj, const cfg_type_t *type);
/*%<
- * Return true iff 'obj' is of type 'type'.
+ * Return true iff 'obj' is of type 'type'.
*/
-void cfg_obj_destroy(cfg_parser_t *pctx, cfg_obj_t **obj);
+void
+cfg_obj_attach(cfg_obj_t *src, cfg_obj_t **dest);
+/*%<
+ * Reference a configuration object.
+ */
+
+void
+cfg_obj_destroy(cfg_parser_t *pctx, cfg_obj_t **obj);
/*%<
- * Destroy a configuration object.
+ * Delete a reference to a configuration object; destroy the object if
+ * there are no more references.
*/
void
cfg_obj_log(const cfg_obj_t *obj, isc_log_t *lctx, int level,
- const char *fmt, ...)
+ const char *fmt, ...)
ISC_FORMAT_PRINTF(4, 5);
/*%<
* Log a message concerning configuration object 'obj' to the logging
diff --git a/contrib/bind9/lib/isccfg/include/isccfg/dnsconf.h b/contrib/bind9/lib/isccfg/include/isccfg/dnsconf.h
new file mode 100644
index 0000000..bb71338
--- /dev/null
+++ b/contrib/bind9/lib/isccfg/include/isccfg/dnsconf.h
@@ -0,0 +1,35 @@
+/*
+ * Copyright (C) 2009 Internet Systems Consortium, Inc. ("ISC")
+ *
+ * Permission to use, copy, modify, and/or 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 ISC DISCLAIMS ALL WARRANTIES WITH
+ * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+ * AND FITNESS. IN NO EVENT SHALL ISC 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.
+ */
+
+/* $Id: dnsconf.h,v 1.3 2009-09-02 23:48:03 tbox Exp $ */
+
+#ifndef ISCCFG_NAMEDCONF_H
+#define ISCCFG_NAMEDCONF_H 1
+
+/*! \file
+ * \brief
+ * This module defines the named.conf, rndc.conf, and rndc.key grammars.
+ */
+
+#include <isccfg/cfg.h>
+
+/*
+ * Configuration object types.
+ */
+LIBISCCFG_EXTERNAL_DATA extern cfg_type_t cfg_type_dnsconf;
+/*%< A complete dns.conf file. */
+
+#endif /* ISCCFG_CFG_H */
diff --git a/contrib/bind9/lib/isccfg/include/isccfg/grammar.h b/contrib/bind9/lib/isccfg/include/isccfg/grammar.h
index b8b845b..afc95bc 100644
--- a/contrib/bind9/lib/isccfg/include/isccfg/grammar.h
+++ b/contrib/bind9/lib/isccfg/include/isccfg/grammar.h
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004-2008 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004-2011 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 2002, 2003 Internet Software Consortium.
*
* Permission to use, copy, modify, and/or distribute this software for any
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: grammar.h,v 1.17 2008-09-25 04:02:39 tbox Exp $ */
+/* $Id: grammar.h,v 1.24 2011-01-04 23:47:14 tbox Exp $ */
#ifndef ISCCFG_GRAMMAR_H
#define ISCCFG_GRAMMAR_H 1
@@ -53,6 +53,8 @@
#define CFG_CLAUSEFLAG_CALLBACK 0x00000020
/*% A option that is only used in testing. */
#define CFG_CLAUSEFLAG_TESTONLY 0x00000040
+/*% A configuration option that was not configured at compile time. */
+#define CFG_CLAUSEFLAG_NOTCONFIGURED 0x00000080
typedef struct cfg_clausedef cfg_clausedef_t;
typedef struct cfg_tuplefielddef cfg_tuplefielddef_t;
@@ -157,6 +159,7 @@ struct cfg_obj {
isc_sockaddr_t sockaddr;
cfg_netprefix_t netprefix;
} value;
+ isc_refcount_t references; /*%< reference counter */
const char * file;
unsigned int line;
};
@@ -210,10 +213,21 @@ struct cfg_parser {
*/
unsigned int line;
+ /*%
+ * Parser context flags, used for maintaining state
+ * from one token to the next.
+ */
+ unsigned int flags;
+
+ /*%< Reference counter */
+ isc_refcount_t references;
+
cfg_parsecallback_t callback;
void *callbackarg;
};
+/* Parser context flags */
+#define CFG_PCTX_SKIP 0x1
/*@{*/
/*%
@@ -314,10 +328,16 @@ cfg_parse_rawport(cfg_parser_t *pctx, unsigned int flags, in_port_t *port);
isc_result_t
cfg_parse_sockaddr(cfg_parser_t *pctx, const cfg_type_t *type, cfg_obj_t **ret);
+isc_result_t
+cfg_parse_boolean(cfg_parser_t *pctx, const cfg_type_t *type, cfg_obj_t **ret);
+
void
cfg_print_sockaddr(cfg_printer_t *pctx, const cfg_obj_t *obj);
void
+cfg_print_boolean(cfg_printer_t *pctx, const cfg_obj_t *obj);
+
+void
cfg_doc_sockaddr(cfg_printer_t *pctx, const cfg_type_t *type);
isc_result_t
diff --git a/contrib/bind9/lib/isccfg/include/isccfg/log.h b/contrib/bind9/lib/isccfg/include/isccfg/log.h
index f45e4c2..2c9dc12 100644
--- a/contrib/bind9/lib/isccfg/include/isccfg/log.h
+++ b/contrib/bind9/lib/isccfg/include/isccfg/log.h
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: log.h,v 1.12.332.2 2009-01-18 23:47:41 tbox Exp $ */
+/* $Id: log.h,v 1.14 2009-01-18 23:48:14 tbox Exp $ */
#ifndef ISCCFG_LOG_H
#define ISCCFG_LOG_H 1
diff --git a/contrib/bind9/lib/isccfg/include/isccfg/namedconf.h b/contrib/bind9/lib/isccfg/include/isccfg/namedconf.h
index 34aa3e8..9242cf3 100644
--- a/contrib/bind9/lib/isccfg/include/isccfg/namedconf.h
+++ b/contrib/bind9/lib/isccfg/include/isccfg/namedconf.h
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004-2007, 2009 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004-2007, 2009, 2010 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 2002 Internet Software Consortium.
*
* Permission to use, copy, modify, and/or distribute this software for any
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: namedconf.h,v 1.9.332.2 2009-06-25 23:47:28 tbox Exp $ */
+/* $Id: namedconf.h,v 1.18 2010-08-11 18:14:20 each Exp $ */
#ifndef ISCCFG_NAMEDCONF_H
#define ISCCFG_NAMEDCONF_H 1
@@ -33,12 +33,24 @@
LIBISCCFG_EXTERNAL_DATA extern cfg_type_t cfg_type_namedconf;
/*%< A complete named.conf file. */
+LIBISCCFG_EXTERNAL_DATA extern cfg_type_t cfg_type_bindkeys;
+/*%< A bind.keys file. */
+
+LIBISCCFG_EXTERNAL_DATA extern cfg_type_t cfg_type_newzones;
+/*%< A new-zones file (for zones added by 'rndc addzone'). */
+
+LIBISCCFG_EXTERNAL_DATA extern cfg_type_t cfg_type_addzoneconf;
+/*%< A single zone passed via the addzone rndc command. */
+
LIBISCCFG_EXTERNAL_DATA extern cfg_type_t cfg_type_rndcconf;
/*%< A complete rndc.conf file. */
LIBISCCFG_EXTERNAL_DATA extern cfg_type_t cfg_type_rndckey;
/*%< A complete rndc.key file. */
+LIBISCCFG_EXTERNAL_DATA extern cfg_type_t cfg_type_sessionkey;
+/*%< A complete session.key file. */
+
LIBISCCFG_EXTERNAL_DATA extern cfg_type_t cfg_type_keyref;
/*%< A key reference, used as an ACL element */
diff --git a/contrib/bind9/lib/isccfg/namedconf.c b/contrib/bind9/lib/isccfg/namedconf.c
index f291507..f80d34b 100644
--- a/contrib/bind9/lib/isccfg/namedconf.c
+++ b/contrib/bind9/lib/isccfg/namedconf.c
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004-2008, 2010 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004-2011 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 2002, 2003 Internet Software Consortium.
*
* Permission to use, copy, modify, and/or distribute this software for any
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: namedconf.c,v 1.92.44.2 2010-05-13 23:47:49 tbox Exp $ */
+/* $Id: namedconf.c,v 1.131.8.1 2011-02-03 05:50:08 marka Exp $ */
/*! \file */
@@ -24,6 +24,7 @@
#include <string.h>
#include <isc/lex.h>
+#include <isc/mem.h>
#include <isc/result.h>
#include <isc/string.h>
#include <isc/util.h>
@@ -35,9 +36,9 @@
#define TOKEN_STRING(pctx) (pctx->token.value.as_textregion.base)
/*% Check a return value. */
-#define CHECK(op) \
- do { result = (op); \
- if (result != ISC_R_SUCCESS) goto cleanup; \
+#define CHECK(op) \
+ do { result = (op); \
+ if (result != ISC_R_SUCCESS) goto cleanup; \
} while (0)
/*% Clean up a configuration object if non-NULL. */
@@ -57,7 +58,17 @@ static isc_result_t
parse_keyvalue(cfg_parser_t *pctx, const cfg_type_t *type, cfg_obj_t **ret);
static isc_result_t
-parse_optional_keyvalue(cfg_parser_t *pctx, const cfg_type_t *type, cfg_obj_t **ret);
+parse_optional_keyvalue(cfg_parser_t *pctx, const cfg_type_t *type,
+ cfg_obj_t **ret);
+
+static isc_result_t
+parse_updatepolicy(cfg_parser_t *pctx, const cfg_type_t *type,
+ cfg_obj_t **ret);
+static void
+print_updatepolicy(cfg_printer_t *pctx, const cfg_obj_t *obj);
+
+static void
+doc_updatepolicy(cfg_printer_t *pctx, const cfg_type_t *type);
static void
print_keyvalue(cfg_printer_t *pctx, const cfg_obj_t *obj);
@@ -111,6 +122,7 @@ static cfg_type_t cfg_type_zone;
static cfg_type_t cfg_type_zoneopts;
static cfg_type_t cfg_type_dynamically_loadable_zones;
static cfg_type_t cfg_type_dynamically_loadable_zones_opts;
+static cfg_type_t cfg_type_v4_aaaa;
/*
* Clauses that can be found in a 'dynamically loadable zones' statement
@@ -241,30 +253,76 @@ static cfg_tuplefielddef_t pubkey_fields[] = {
{ NULL, NULL, 0 }
};
static cfg_type_t cfg_type_pubkey = {
- "pubkey", cfg_parse_tuple, cfg_print_tuple, cfg_doc_tuple, &cfg_rep_tuple, pubkey_fields };
+ "pubkey", cfg_parse_tuple, cfg_print_tuple, cfg_doc_tuple,
+ &cfg_rep_tuple, pubkey_fields };
/*%
* A list of RR types, used in grant statements.
* Note that the old parser allows quotes around the RR type names.
*/
static cfg_type_t cfg_type_rrtypelist = {
- "rrtypelist", cfg_parse_spacelist, cfg_print_spacelist, cfg_doc_terminal,
- &cfg_rep_list, &cfg_type_astring
+ "rrtypelist", cfg_parse_spacelist, cfg_print_spacelist,
+ cfg_doc_terminal, &cfg_rep_list, &cfg_type_astring
};
static const char *mode_enums[] = { "grant", "deny", NULL };
static cfg_type_t cfg_type_mode = {
- "mode", cfg_parse_enum, cfg_print_ustring, cfg_doc_enum, &cfg_rep_string,
- &mode_enums
+ "mode", cfg_parse_enum, cfg_print_ustring, cfg_doc_enum,
+ &cfg_rep_string, &mode_enums
};
+static isc_result_t
+parse_matchtype(cfg_parser_t *pctx, const cfg_type_t *type,
+ cfg_obj_t **ret) {
+ isc_result_t result;
+
+ CHECK(cfg_peektoken(pctx, 0));
+ if (pctx->token.type == isc_tokentype_string &&
+ strcasecmp(TOKEN_STRING(pctx), "zonesub") == 0) {
+ pctx->flags |= CFG_PCTX_SKIP;
+ }
+ return (cfg_parse_enum(pctx, type, ret));
+
+ cleanup:
+ return (result);
+}
+
+static isc_result_t
+parse_matchname(cfg_parser_t *pctx, const cfg_type_t *type, cfg_obj_t **ret) {
+ isc_result_t result;
+ cfg_obj_t *obj = NULL;
+
+ if ((pctx->flags & CFG_PCTX_SKIP) != 0) {
+ pctx->flags &= ~CFG_PCTX_SKIP;
+ CHECK(cfg_parse_void(pctx, NULL, &obj));
+ } else
+ result = cfg_parse_astring(pctx, type, &obj);
+
+ *ret = obj;
+ cleanup:
+ return (result);
+}
+
+static void
+doc_matchname(cfg_printer_t *pctx, const cfg_type_t *type) {
+ cfg_print_chars(pctx, "[ ", 2);
+ cfg_doc_obj(pctx, type->of);
+ cfg_print_chars(pctx, " ]", 2);
+}
+
static const char *matchtype_enums[] = {
"name", "subdomain", "wildcard", "self", "selfsub", "selfwild",
"krb5-self", "ms-self", "krb5-subdomain", "ms-subdomain",
- "tcp-self", "6to4-self", NULL };
+ "tcp-self", "6to4-self", "zonesub", "external", NULL };
+
static cfg_type_t cfg_type_matchtype = {
- "matchtype", cfg_parse_enum, cfg_print_ustring, cfg_doc_enum, &cfg_rep_string,
- &matchtype_enums
+ "matchtype", parse_matchtype, cfg_print_ustring,
+ cfg_doc_enum, &cfg_rep_string, &matchtype_enums
+};
+
+static cfg_type_t cfg_type_matchname = {
+ "optional_matchname", parse_matchname, cfg_print_ustring,
+ &doc_matchname, &cfg_rep_tuple, &cfg_type_ustring
};
/*%
@@ -274,18 +332,70 @@ static cfg_tuplefielddef_t grant_fields[] = {
{ "mode", &cfg_type_mode, 0 },
{ "identity", &cfg_type_astring, 0 }, /* domain name */
{ "matchtype", &cfg_type_matchtype, 0 },
- { "name", &cfg_type_astring, 0 }, /* domain name */
+ { "name", &cfg_type_matchname, 0 }, /* domain name */
{ "types", &cfg_type_rrtypelist, 0 },
{ NULL, NULL, 0 }
};
static cfg_type_t cfg_type_grant = {
- "grant", cfg_parse_tuple, cfg_print_tuple, cfg_doc_tuple, &cfg_rep_tuple, grant_fields };
+ "grant", cfg_parse_tuple, cfg_print_tuple, cfg_doc_tuple,
+ &cfg_rep_tuple, grant_fields
+};
static cfg_type_t cfg_type_updatepolicy = {
- "update_policy", cfg_parse_bracketed_list, cfg_print_bracketed_list, cfg_doc_bracketed_list,
- &cfg_rep_list, &cfg_type_grant
+ "update_policy", parse_updatepolicy, print_updatepolicy,
+ doc_updatepolicy, &cfg_rep_list, &cfg_type_grant
};
+static isc_result_t
+parse_updatepolicy(cfg_parser_t *pctx, const cfg_type_t *type,
+ cfg_obj_t **ret) {
+ isc_result_t result;
+ CHECK(cfg_gettoken(pctx, 0));
+ if (pctx->token.type == isc_tokentype_special &&
+ pctx->token.value.as_char == '{') {
+ cfg_ungettoken(pctx);
+ return (cfg_parse_bracketed_list(pctx, type, ret));
+ }
+
+ if (pctx->token.type == isc_tokentype_string &&
+ strcasecmp(TOKEN_STRING(pctx), "local") == 0) {
+ cfg_obj_t *obj = NULL;
+ CHECK(cfg_create_obj(pctx, &cfg_type_ustring, &obj));
+ obj->value.string.length = strlen("local");
+ obj->value.string.base = isc_mem_get(pctx->mctx,
+ obj->value.string.length + 1);
+ if (obj->value.string.base == NULL) {
+ isc_mem_put(pctx->mctx, obj, sizeof(*obj));
+ return (ISC_R_NOMEMORY);
+ }
+ memcpy(obj->value.string.base, "local", 5);
+ obj->value.string.base[5] = '\0';
+ *ret = obj;
+ return (ISC_R_SUCCESS);
+ }
+
+ cfg_ungettoken(pctx);
+ return (ISC_R_UNEXPECTEDTOKEN);
+
+ cleanup:
+ return (result);
+}
+
+static void
+print_updatepolicy(cfg_printer_t *pctx, const cfg_obj_t *obj) {
+ if (cfg_obj_isstring(obj))
+ cfg_print_ustring(pctx, obj);
+ else
+ cfg_print_bracketed_list(pctx, obj);
+}
+
+static void
+doc_updatepolicy(cfg_printer_t *pctx, const cfg_type_t *type) {
+ cfg_print_cstr(pctx, "( local | { ");
+ cfg_doc_obj(pctx, type->of);
+ cfg_print_cstr(pctx, "; ... }");
+}
+
/*%
* A view statement.
*/
@@ -296,7 +406,9 @@ static cfg_tuplefielddef_t view_fields[] = {
{ NULL, NULL, 0 }
};
static cfg_type_t cfg_type_view = {
- "view", cfg_parse_tuple, cfg_print_tuple, cfg_doc_tuple, &cfg_rep_tuple, view_fields };
+ "view", cfg_parse_tuple, cfg_print_tuple, cfg_doc_tuple,
+ &cfg_rep_tuple, view_fields
+};
/*%
* A zone statement.
@@ -308,7 +420,9 @@ static cfg_tuplefielddef_t zone_fields[] = {
{ NULL, NULL, 0 }
};
static cfg_type_t cfg_type_zone = {
- "zone", cfg_parse_tuple, cfg_print_tuple, cfg_doc_tuple, &cfg_rep_tuple, zone_fields };
+ "zone", cfg_parse_tuple, cfg_print_tuple, cfg_doc_tuple,
+ &cfg_rep_tuple, zone_fields
+};
/*%
* A "category" clause in the "logging" statement.
@@ -319,13 +433,15 @@ static cfg_tuplefielddef_t category_fields[] = {
{ NULL, NULL, 0 }
};
static cfg_type_t cfg_type_category = {
- "category", cfg_parse_tuple, cfg_print_tuple, cfg_doc_tuple, &cfg_rep_tuple, category_fields };
+ "category", cfg_parse_tuple, cfg_print_tuple, cfg_doc_tuple,
+ &cfg_rep_tuple, category_fields
+};
/*%
- * A trusted key, as used in the "trusted-keys" statement.
+ * A dnssec key, as used in the "trusted-keys" statement.
*/
-static cfg_tuplefielddef_t trustedkey_fields[] = {
+static cfg_tuplefielddef_t dnsseckey_fields[] = {
{ "name", &cfg_type_astring, 0 },
{ "flags", &cfg_type_uint32, 0 },
{ "protocol", &cfg_type_uint32, 0 },
@@ -333,9 +449,27 @@ static cfg_tuplefielddef_t trustedkey_fields[] = {
{ "key", &cfg_type_qstring, 0 },
{ NULL, NULL, 0 }
};
-static cfg_type_t cfg_type_trustedkey = {
- "trustedkey", cfg_parse_tuple, cfg_print_tuple, cfg_doc_tuple, &cfg_rep_tuple,
- trustedkey_fields
+static cfg_type_t cfg_type_dnsseckey = {
+ "dnsseckey", cfg_parse_tuple, cfg_print_tuple, cfg_doc_tuple,
+ &cfg_rep_tuple, dnsseckey_fields
+};
+
+/*%
+ * A managed key initialization specifier, as used in the
+ * "managed-keys" statement.
+ */
+static cfg_tuplefielddef_t managedkey_fields[] = {
+ { "name", &cfg_type_astring, 0 },
+ { "init", &cfg_type_ustring, 0 }, /* must be literal "initial-key" */
+ { "flags", &cfg_type_uint32, 0 },
+ { "protocol", &cfg_type_uint32, 0 },
+ { "algorithm", &cfg_type_uint32, 0 },
+ { "key", &cfg_type_qstring, 0 },
+ { NULL, NULL, 0 }
+};
+static cfg_type_t cfg_type_managedkey = {
+ "managedkey", cfg_parse_tuple, cfg_print_tuple, cfg_doc_tuple,
+ &cfg_rep_tuple, managedkey_fields
};
static keyword_type_t wild_class_kw = { "class", &cfg_type_ustring };
@@ -397,6 +531,7 @@ static cfg_tuplefielddef_t checknames_fields[] = {
{ "mode", &cfg_type_checkmode, 0 },
{ NULL, NULL, 0 }
};
+
static cfg_type_t cfg_type_checknames = {
"checknames", cfg_parse_tuple, cfg_print_tuple, cfg_doc_tuple, &cfg_rep_tuple,
checknames_fields
@@ -407,6 +542,13 @@ static cfg_type_t cfg_type_bracketed_sockaddrlist = {
&cfg_rep_list, &cfg_type_sockaddr
};
+static const char *autodnssec_enums[] = { "allow", "maintain", "create",
+ "off", NULL };
+static cfg_type_t cfg_type_autodnssec = {
+ "autodnssec", cfg_parse_enum, cfg_print_ustring, cfg_doc_enum,
+ &cfg_rep_string, &autodnssec_enums
+};
+
static cfg_type_t cfg_type_rrsetorder = {
"rrsetorder", cfg_parse_bracketed_list, cfg_print_bracketed_list, cfg_doc_bracketed_list,
&cfg_rep_list, &cfg_type_rrsetorderingelement
@@ -421,13 +563,27 @@ static cfg_type_t cfg_type_optional_port = {
/*% A list of keys, as in the "key" clause of the controls statement. */
static cfg_type_t cfg_type_keylist = {
- "keylist", cfg_parse_bracketed_list, cfg_print_bracketed_list, cfg_doc_bracketed_list, &cfg_rep_list,
- &cfg_type_astring
+ "keylist", cfg_parse_bracketed_list, cfg_print_bracketed_list,
+ cfg_doc_bracketed_list, &cfg_rep_list, &cfg_type_astring
+};
+
+/*% A list of dnssec keys, as in "trusted-keys" */
+static cfg_type_t cfg_type_dnsseckeys = {
+ "dnsseckeys", cfg_parse_bracketed_list, cfg_print_bracketed_list,
+ cfg_doc_bracketed_list, &cfg_rep_list, &cfg_type_dnsseckey
};
-static cfg_type_t cfg_type_trustedkeys = {
- "trusted-keys", cfg_parse_bracketed_list, cfg_print_bracketed_list, cfg_doc_bracketed_list, &cfg_rep_list,
- &cfg_type_trustedkey
+/*%
+ * A list of managed key entries, as in "trusted-keys". Currently
+ * (9.7.0) this has a format similar to dnssec keys, except the keyname
+ * is followed by the keyword "initial-key". In future releases, this
+ * keyword may take other values indicating different methods for the
+ * key to be initialized.
+ */
+
+static cfg_type_t cfg_type_managedkeys = {
+ "managedkeys", cfg_parse_bracketed_list, cfg_print_bracketed_list,
+ cfg_doc_bracketed_list, &cfg_rep_list, &cfg_type_managedkey
};
static const char *forwardtype_enums[] = { "first", "only", NULL };
@@ -437,7 +593,8 @@ static cfg_type_t cfg_type_forwardtype = {
};
static const char *zonetype_enums[] = {
- "master", "slave", "stub", "hint", "forward", "delegation-only", NULL };
+ "master", "slave", "stub", "static-stub", "hint", "forward",
+ "delegation-only", NULL };
static cfg_type_t cfg_type_zonetype = {
"zonetype", cfg_parse_enum, cfg_print_ustring, cfg_doc_enum,
&cfg_rep_string, &zonetype_enums
@@ -479,6 +636,7 @@ parse_qstringornone(cfg_parser_t *pctx, const cfg_type_t *type,
cfg_obj_t **ret)
{
isc_result_t result;
+
CHECK(cfg_gettoken(pctx, CFG_LEXOPT_QSTRING));
if (pctx->token.type == isc_tokentype_string &&
strcasecmp(TOKEN_STRING(pctx), "none") == 0)
@@ -496,13 +654,65 @@ doc_qstringornone(cfg_printer_t *pctx, const cfg_type_t *type) {
}
static cfg_type_t cfg_type_qstringornone = {
- "qstringornone", parse_qstringornone, NULL, doc_qstringornone, NULL, NULL };
+ "qstringornone", parse_qstringornone, NULL, doc_qstringornone,
+ NULL, NULL
+};
/*%
- * keyword hostname
+ * A boolean ("yes" or "no"), or the special keyword "auto".
+ * Used in the dnssec-validation option.
*/
+static void
+print_auto(cfg_printer_t *pctx, const cfg_obj_t *obj) {
+ UNUSED(obj);
+ cfg_print_cstr(pctx, "auto");
+}
+
+static cfg_type_t cfg_type_auto = {
+ "auto", NULL, print_auto, NULL, &cfg_rep_void, NULL
+};
+
+static isc_result_t
+parse_boolorauto(cfg_parser_t *pctx, const cfg_type_t *type,
+ cfg_obj_t **ret)
+{
+ isc_result_t result;
+
+ CHECK(cfg_gettoken(pctx, CFG_LEXOPT_QSTRING));
+ if (pctx->token.type == isc_tokentype_string &&
+ strcasecmp(TOKEN_STRING(pctx), "auto") == 0)
+ return (cfg_create_obj(pctx, &cfg_type_auto, ret));
+ cfg_ungettoken(pctx);
+ return (cfg_parse_boolean(pctx, type, ret));
+ cleanup:
+ return (result);
+}
static void
+print_boolorauto(cfg_printer_t *pctx, const cfg_obj_t *obj) {
+ if (obj->type->rep == &cfg_rep_void)
+ cfg_print_chars(pctx, "auto", 4);
+ else if (obj->value.boolean)
+ cfg_print_chars(pctx, "yes", 3);
+ else
+ cfg_print_chars(pctx, "no", 2);
+}
+
+static void
+doc_boolorauto(cfg_printer_t *pctx, const cfg_type_t *type) {
+ UNUSED(type);
+ cfg_print_cstr(pctx, "( yes | no | auto )");
+}
+
+static cfg_type_t cfg_type_boolorauto = {
+ "boolorauto", parse_boolorauto, print_boolorauto,
+ doc_boolorauto, NULL, NULL
+};
+
+/*%
+ * keyword hostname
+ */
+static void
print_hostname(cfg_printer_t *pctx, const cfg_obj_t *obj) {
UNUSED(obj);
cfg_print_cstr(pctx, "hostname");
@@ -652,7 +862,18 @@ namedconf_or_view_clauses[] = {
/* only 1 DLZ per view allowed */
{ "dlz", &cfg_type_dynamically_loadable_zones, 0 },
{ "server", &cfg_type_server, CFG_CLAUSEFLAG_MULTI },
- { "trusted-keys", &cfg_type_trustedkeys, CFG_CLAUSEFLAG_MULTI },
+ { "trusted-keys", &cfg_type_dnsseckeys, CFG_CLAUSEFLAG_MULTI },
+ { "managed-keys", &cfg_type_managedkeys, CFG_CLAUSEFLAG_MULTI },
+ { NULL, NULL, 0 }
+};
+
+/*%
+ * Clauses that can occur in the bind.keys file.
+ */
+static cfg_clausedef_t
+bindkeys_clauses[] = {
+ { "trusted-keys", &cfg_type_dnsseckeys, CFG_CLAUSEFLAG_MULTI },
+ { "managed-keys", &cfg_type_managedkeys, CFG_CLAUSEFLAG_MULTI },
{ NULL, NULL, 0 }
};
@@ -661,18 +882,21 @@ namedconf_or_view_clauses[] = {
*/
static cfg_clausedef_t
options_clauses[] = {
- { "use-v4-udp-ports", &cfg_type_bracketed_portlist, 0 },
- { "use-v6-udp-ports", &cfg_type_bracketed_portlist, 0 },
{ "avoid-v4-udp-ports", &cfg_type_bracketed_portlist, 0 },
{ "avoid-v6-udp-ports", &cfg_type_bracketed_portlist, 0 },
+ { "bindkeys-file", &cfg_type_qstring, 0 },
{ "blackhole", &cfg_type_bracketed_aml, 0 },
{ "coresize", &cfg_type_size, 0 },
{ "datasize", &cfg_type_size, 0 },
+ { "session-keyfile", &cfg_type_qstringornone, 0 },
+ { "session-keyname", &cfg_type_astring, 0 },
+ { "session-keyalg", &cfg_type_astring, 0 },
{ "deallocate-on-exit", &cfg_type_boolean, CFG_CLAUSEFLAG_OBSOLETE },
{ "directory", &cfg_type_qstring, CFG_CLAUSEFLAG_CALLBACK },
{ "dump-file", &cfg_type_qstring, 0 },
{ "fake-iquery", &cfg_type_boolean, CFG_CLAUSEFLAG_OBSOLETE },
{ "files", &cfg_type_size, 0 },
+ { "flush-zones-on-shutdown", &cfg_type_boolean, 0 },
{ "has-old-clients", &cfg_type_boolean, CFG_CLAUSEFLAG_OBSOLETE },
{ "heartbeat-interval", &cfg_type_uint32, 0 },
{ "host-statistics", &cfg_type_boolean, CFG_CLAUSEFLAG_NOTIMP },
@@ -681,6 +905,7 @@ options_clauses[] = {
{ "interface-interval", &cfg_type_uint32, 0 },
{ "listen-on", &cfg_type_listenon, CFG_CLAUSEFLAG_MULTI },
{ "listen-on-v6", &cfg_type_listenon, CFG_CLAUSEFLAG_MULTI },
+ { "managed-keys-directory", &cfg_type_qstring, 0 },
{ "match-mapped-addresses", &cfg_type_boolean, 0 },
{ "memstatistics-file", &cfg_type_qstring, 0 },
{ "memstatistics", &cfg_type_boolean, 0 },
@@ -693,6 +918,7 @@ options_clauses[] = {
{ "random-device", &cfg_type_qstring, 0 },
{ "recursive-clients", &cfg_type_uint32, 0 },
{ "reserved-sockets", &cfg_type_uint32, 0 },
+ { "secroots-file", &cfg_type_qstring, 0 },
{ "serial-queries", &cfg_type_uint32, CFG_CLAUSEFLAG_OBSOLETE },
{ "serial-query-rate", &cfg_type_uint32, 0 },
{ "server-id", &cfg_type_serverid, 0 },
@@ -703,6 +929,7 @@ options_clauses[] = {
{ "tcp-listen-queue", &cfg_type_uint32, 0 },
{ "tkey-dhkey", &cfg_type_tkey_dhkey, 0 },
{ "tkey-gssapi-credential", &cfg_type_qstring, 0 },
+ { "tkey-gssapi-keytab", &cfg_type_qstring, 0 },
{ "tkey-domain", &cfg_type_qstring, 0 },
{ "transfers-per-ns", &cfg_type_uint32, 0 },
{ "transfers-in", &cfg_type_uint32, 0 },
@@ -710,12 +937,12 @@ options_clauses[] = {
{ "treat-cr-as-space", &cfg_type_boolean, CFG_CLAUSEFLAG_OBSOLETE },
{ "use-id-pool", &cfg_type_boolean, CFG_CLAUSEFLAG_OBSOLETE },
{ "use-ixfr", &cfg_type_boolean, 0 },
+ { "use-v4-udp-ports", &cfg_type_bracketed_portlist, 0 },
+ { "use-v6-udp-ports", &cfg_type_bracketed_portlist, 0 },
{ "version", &cfg_type_qstringornone, 0 },
- { "flush-zones-on-shutdown", &cfg_type_boolean, 0 },
{ NULL, NULL, 0 }
};
-
static cfg_type_t cfg_type_namelist = {
"namelist", cfg_parse_bracketed_list, cfg_print_bracketed_list,
cfg_doc_bracketed_list, &cfg_rep_list, &cfg_type_qstring };
@@ -726,6 +953,34 @@ static cfg_type_t cfg_type_optional_exclude = {
"optional_exclude", parse_optional_keyvalue, print_keyvalue,
doc_optional_keyvalue, &cfg_rep_list, &exclude_kw };
+static keyword_type_t exceptionnames_kw = { "except-from", &cfg_type_namelist };
+
+static cfg_type_t cfg_type_optional_exceptionnames = {
+ "optional_allow", parse_optional_keyvalue, print_keyvalue,
+ doc_optional_keyvalue, &cfg_rep_list, &exceptionnames_kw };
+
+static cfg_tuplefielddef_t denyaddresses_fields[] = {
+ { "acl", &cfg_type_bracketed_aml, 0 },
+ { "except-from", &cfg_type_optional_exceptionnames, 0 },
+ { NULL, NULL, 0 }
+};
+
+static cfg_type_t cfg_type_denyaddresses = {
+ "denyaddresses", cfg_parse_tuple, cfg_print_tuple, cfg_doc_tuple,
+ &cfg_rep_tuple, denyaddresses_fields
+};
+
+static cfg_tuplefielddef_t denyaliases_fields[] = {
+ { "name", &cfg_type_namelist, 0 },
+ { "except-from", &cfg_type_optional_exceptionnames, 0 },
+ { NULL, NULL, 0 }
+};
+
+static cfg_type_t cfg_type_denyaliases = {
+ "denyaliases", cfg_parse_tuple, cfg_print_tuple, cfg_doc_tuple,
+ &cfg_rep_tuple, denyaliases_fields
+};
+
static cfg_type_t cfg_type_algorithmlist = {
"algorithmlist", cfg_parse_bracketed_list, cfg_print_bracketed_list,
cfg_doc_bracketed_list, &cfg_rep_list, &cfg_type_astring };
@@ -758,20 +1013,134 @@ static cfg_type_t cfg_type_masterformat = {
&cfg_rep_string, &masterformat_enums
};
+
+
+/*
+ * response-policy {
+ * zone <string> [ policy (given|no-op|nxdomain|nodata|cname <domain> ) ];
+ * };
+ *
+ * this is a chimera of doc_optional_keyvalue() and cfg_doc_enum()
+ */
+static void
+doc_rpz_policies(cfg_printer_t *pctx, const cfg_type_t *type) {
+ const keyword_type_t *kw;
+ const char * const *p;
+
+ kw = type->of;
+ cfg_print_chars(pctx, "[ ", 2);
+ cfg_print_cstr(pctx, kw->name);
+ cfg_print_chars(pctx, " ", 1);
+
+ cfg_print_chars(pctx, "( ", 2);
+ for (p = kw->type->of; *p != NULL; p++) {
+ cfg_print_cstr(pctx, *p);
+ if (p[1] != NULL)
+ cfg_print_chars(pctx, " | ", 3);
+ }
+}
+
+/*
+ * print_qstring() from parser.c
+ */
+static void
+print_rpz_cname(cfg_printer_t *pctx, const cfg_obj_t *obj)
+{
+ cfg_print_chars(pctx, "\"", 1);
+ cfg_print_ustring(pctx, obj);
+ cfg_print_chars(pctx, "\"", 1);
+}
+
+static void
+doc_rpz_cname(cfg_printer_t *pctx, const cfg_type_t *type) {
+ cfg_doc_terminal(pctx, type);
+ cfg_print_chars(pctx, " ) ]", 4);
+}
+
+static isc_result_t
+parse_rpz(cfg_parser_t *pctx, const cfg_type_t *type, cfg_obj_t **ret) {
+ isc_result_t result;
+ cfg_obj_t *obj = NULL;
+ const cfg_tuplefielddef_t *fields = type->of;
+
+ CHECK(cfg_create_tuple(pctx, type, &obj));
+ CHECK(cfg_parse_obj(pctx, fields[0].type, &obj->value.tuple[0]));
+ CHECK(cfg_parse_obj(pctx, fields[1].type, &obj->value.tuple[1]));
+ /*
+ * parse cname domain only after "policy cname"
+ */
+ if (cfg_obj_isvoid(obj->value.tuple[1]) ||
+ strcasecmp("cname", cfg_obj_asstring(obj->value.tuple[1]))) {
+ CHECK(cfg_parse_void(pctx, NULL, &obj->value.tuple[2]));
+ } else {
+ CHECK(cfg_parse_obj(pctx, fields[2].type, &obj->value.tuple[2]));
+ }
+
+ *ret = obj;
+ return (ISC_R_SUCCESS);
+
+cleanup:
+ CLEANUP_OBJ(obj);
+ return (result);
+}
+
+static const char *rpz_policies[] = {
+ "given", "no-op", "nxdomain", "nodata", "cname", NULL
+};
+static cfg_type_t cfg_type_rpz_policylist = {
+ "policies", cfg_parse_enum, cfg_print_ustring, cfg_doc_enum,
+ &cfg_rep_string, &rpz_policies
+};
+static keyword_type_t rpz_policies_kw = {
+ "policy", &cfg_type_rpz_policylist
+};
+static cfg_type_t cfg_type_rpz_policy = {
+ "optional_policy", parse_optional_keyvalue, print_keyvalue,
+ doc_rpz_policies, &cfg_rep_string, &rpz_policies_kw
+};
+static cfg_type_t cfg_type_cname = {
+ "domain", cfg_parse_astring, print_rpz_cname, doc_rpz_cname,
+ &cfg_rep_string, NULL
+};
+static cfg_tuplefielddef_t rpzone_fields[] = {
+ { "name", &cfg_type_astring, 0 },
+ { "policy", &cfg_type_rpz_policy, 0 },
+ { "cname", &cfg_type_cname, 0 },
+ { NULL, NULL, 0 }
+};
+static cfg_type_t cfg_type_rpzone = {
+ "rpzone", parse_rpz, cfg_print_tuple, cfg_doc_tuple,
+ &cfg_rep_tuple, rpzone_fields
+};
+static cfg_clausedef_t rpz_clauses[] = {
+ { "zone", &cfg_type_rpzone, CFG_CLAUSEFLAG_MULTI },
+ { NULL, NULL, 0 }
+};
+static cfg_clausedef_t *rpz_clausesets[] = {
+ rpz_clauses,
+ NULL
+};
+static cfg_type_t cfg_type_rpz = {
+ "rpz", cfg_parse_map, cfg_print_map, cfg_doc_map,
+ &cfg_rep_map, rpz_clausesets
+};
+
+
+
/*%
* dnssec-lookaside
*/
static keyword_type_t trustanchor_kw = { "trust-anchor", &cfg_type_astring };
-static cfg_type_t cfg_type_trustanchor = {
- "trust-anchor", parse_keyvalue, print_keyvalue, doc_keyvalue,
- &cfg_rep_string, &trustanchor_kw
+static cfg_type_t cfg_type_optional_trustanchor = {
+ "optional_trustanchor", parse_optional_keyvalue, print_keyvalue,
+ doc_keyvalue, &cfg_rep_string, &trustanchor_kw
};
static cfg_tuplefielddef_t lookaside_fields[] = {
{ "domain", &cfg_type_astring, 0 },
- { "trust-anchor", &cfg_type_trustanchor, 0 },
+ { "trust-anchor", &cfg_type_optional_trustanchor, 0 },
{ NULL, NULL, 0 }
};
@@ -780,6 +1149,31 @@ static cfg_type_t cfg_type_lookaside = {
&cfg_rep_tuple, lookaside_fields
};
+/*
+ * DNS64.
+ */
+static cfg_clausedef_t
+dns64_clauses[] = {
+ { "clients", &cfg_type_bracketed_aml, 0 },
+ { "mapped", &cfg_type_bracketed_aml, 0 },
+ { "exclude", &cfg_type_bracketed_aml, 0 },
+ { "suffix", &cfg_type_netaddr6, 0 },
+ { "recursive-only", &cfg_type_boolean, 0 },
+ { "break-dnssec", &cfg_type_boolean, 0 },
+ { NULL, NULL, 0 },
+};
+
+static cfg_clausedef_t *
+dns64_clausesets[] = {
+ dns64_clauses,
+ NULL
+};
+
+static cfg_type_t cfg_type_dns64 = {
+ "dns64", cfg_parse_netprefix_map, cfg_print_map, cfg_doc_map,
+ &cfg_rep_map, dns64_clausesets
+};
+
/*%
* Clauses that can be found within the 'view' statement,
* with defaults in the 'options' statement.
@@ -791,26 +1185,33 @@ view_clauses[] = {
{ "acache-enable", &cfg_type_boolean, 0 },
{ "additional-from-auth", &cfg_type_boolean, 0 },
{ "additional-from-cache", &cfg_type_boolean, 0 },
+ { "allow-new-zones", &cfg_type_boolean, 0 },
{ "allow-query-cache", &cfg_type_bracketed_aml, 0 },
{ "allow-query-cache-on", &cfg_type_bracketed_aml, 0 },
{ "allow-recursion", &cfg_type_bracketed_aml, 0 },
{ "allow-recursion-on", &cfg_type_bracketed_aml, 0 },
{ "allow-v6-synthesis", &cfg_type_bracketed_aml,
CFG_CLAUSEFLAG_OBSOLETE },
+ { "attach-cache", &cfg_type_astring, 0 },
{ "auth-nxdomain", &cfg_type_boolean, CFG_CLAUSEFLAG_NEWDEFAULT },
{ "cache-file", &cfg_type_qstring, 0 },
{ "check-names", &cfg_type_checknames, CFG_CLAUSEFLAG_MULTI },
{ "cleaning-interval", &cfg_type_uint32, 0 },
{ "clients-per-query", &cfg_type_uint32, 0 },
+ { "deny-answer-addresses", &cfg_type_denyaddresses, 0 },
+ { "deny-answer-aliases", &cfg_type_denyaliases, 0 },
{ "disable-algorithms", &cfg_type_disablealgorithm,
CFG_CLAUSEFLAG_MULTI },
{ "disable-empty-zone", &cfg_type_astring, CFG_CLAUSEFLAG_MULTI },
+ { "dns64", &cfg_type_dns64, CFG_CLAUSEFLAG_MULTI },
+ { "dns64-server", &cfg_type_astring, 0 },
+ { "dns64-contact", &cfg_type_astring, 0 },
{ "dnssec-accept-expired", &cfg_type_boolean, 0 },
{ "dnssec-enable", &cfg_type_boolean, 0 },
{ "dnssec-lookaside", &cfg_type_lookaside, CFG_CLAUSEFLAG_MULTI },
{ "dnssec-must-be-secure", &cfg_type_mustbesecure,
CFG_CLAUSEFLAG_MULTI },
- { "dnssec-validation", &cfg_type_boolean, 0 },
+ { "dnssec-validation", &cfg_type_boolorauto, 0 },
{ "dual-stack-servers", &cfg_type_nameportiplist, 0 },
{ "edns-udp-size", &cfg_type_uint32, 0 },
{ "empty-contact", &cfg_type_astring, 0 },
@@ -841,6 +1242,7 @@ view_clauses[] = {
{ "recursion", &cfg_type_boolean, 0 },
{ "request-ixfr", &cfg_type_boolean, 0 },
{ "request-nsid", &cfg_type_boolean, 0 },
+ { "resolver-query-timeout", &cfg_type_uint32, 0 },
{ "rfc2308-type1", &cfg_type_boolean, CFG_CLAUSEFLAG_NYI },
{ "root-delegation-only", &cfg_type_optional_exclude, 0 },
{ "rrset-order", &cfg_type_rrsetorder, 0 },
@@ -850,6 +1252,16 @@ view_clauses[] = {
{ "transfer-format", &cfg_type_transferformat, 0 },
{ "use-queryport-pool", &cfg_type_boolean, CFG_CLAUSEFLAG_OBSOLETE },
{ "zero-no-soa-ttl-cache", &cfg_type_boolean, 0 },
+#ifdef ALLOW_FILTER_AAAA_ON_V4
+ { "filter-aaaa", &cfg_type_bracketed_aml, 0 },
+ { "filter-aaaa-on-v4", &cfg_type_v4_aaaa, 0 },
+#else
+ { "filter-aaaa", &cfg_type_bracketed_aml,
+ CFG_CLAUSEFLAG_NOTCONFIGURED },
+ { "filter-aaaa-on-v4", &cfg_type_v4_aaaa,
+ CFG_CLAUSEFLAG_NOTCONFIGURED },
+#endif
+ { "response-policy", &cfg_type_rpz, 0 },
{ NULL, NULL, 0 }
};
@@ -920,6 +1332,7 @@ zone_clauses[] = {
{ "also-notify", &cfg_type_portiplist, 0 },
{ "alt-transfer-source", &cfg_type_sockaddr4wild, 0 },
{ "alt-transfer-source-v6", &cfg_type_sockaddr6wild, 0 },
+ { "check-dup-records", &cfg_type_checkmode, 0 },
{ "check-integrity", &cfg_type_boolean, 0 },
{ "check-mx", &cfg_type_checkmode, 0 },
{ "check-mx-cname", &cfg_type_checkmode, 0 },
@@ -927,6 +1340,8 @@ zone_clauses[] = {
{ "check-srv-cname", &cfg_type_checkmode, 0 },
{ "check-wildcard", &cfg_type_boolean, 0 },
{ "dialup", &cfg_type_dialuptype, 0 },
+ { "dnssec-dnskey-kskonly", &cfg_type_boolean, 0 },
+ { "dnssec-secure-to-insecure", &cfg_type_boolean, 0 },
{ "forward", &cfg_type_forwardtype, 0 },
{ "forwarders", &cfg_type_portiplist, 0 },
{ "key-directory", &cfg_type_qstring, 0 },
@@ -986,6 +1401,9 @@ zone_only_clauses[] = {
*/
{ "check-names", &cfg_type_checkmode, 0 },
{ "ixfr-from-differences", &cfg_type_boolean, 0 },
+ { "auto-dnssec", &cfg_type_autodnssec, 0 },
+ { "server-addresses", &cfg_type_bracketed_sockaddrlist, 0 },
+ { "server-names", &cfg_type_namelist, 0 },
{ NULL, NULL, 0 }
};
@@ -998,12 +1416,40 @@ namedconf_clausesets[] = {
namedconf_or_view_clauses,
NULL
};
-
LIBISCCFG_EXTERNAL_DATA cfg_type_t cfg_type_namedconf = {
"namedconf", cfg_parse_mapbody, cfg_print_mapbody, cfg_doc_mapbody,
&cfg_rep_map, namedconf_clausesets
};
+/*% The bind.keys syntax (trusted-keys/managed-keys only). */
+static cfg_clausedef_t *
+bindkeys_clausesets[] = {
+ bindkeys_clauses,
+ NULL
+};
+LIBISCCFG_EXTERNAL_DATA cfg_type_t cfg_type_bindkeys = {
+ "bindkeys", cfg_parse_mapbody, cfg_print_mapbody, cfg_doc_mapbody,
+ &cfg_rep_map, bindkeys_clausesets
+};
+
+/*% The new-zone-file syntax (for zones added by 'rndc addzone') */
+static cfg_clausedef_t
+newzones_clauses[] = {
+ { "zone", &cfg_type_zone, CFG_CLAUSEFLAG_MULTI },
+ { NULL, NULL, 0 }
+};
+
+static cfg_clausedef_t *
+newzones_clausesets[] = {
+ newzones_clauses,
+ NULL
+};
+
+LIBISCCFG_EXTERNAL_DATA cfg_type_t cfg_type_newzones = {
+ "newzones", cfg_parse_mapbody, cfg_print_mapbody, cfg_doc_mapbody,
+ &cfg_rep_map, newzones_clausesets
+};
+
/*% The "options" statement syntax. */
static cfg_clausedef_t *
@@ -1166,6 +1612,38 @@ static cfg_type_t cfg_type_logging = {
"logging", cfg_parse_map, cfg_print_map, cfg_doc_map, &cfg_rep_map, logging_clausesets };
+/*%
+ * For parsing an 'addzone' statement
+ */
+
+static cfg_tuplefielddef_t addzone_fields[] = {
+ { "name", &cfg_type_astring, 0 },
+ { "class", &cfg_type_optional_class, 0 },
+ { "view", &cfg_type_optional_class, 0 },
+ { "options", &cfg_type_zoneopts, 0 },
+ { NULL, NULL, 0 }
+};
+static cfg_type_t cfg_type_addzone = {
+ "addzone", cfg_parse_tuple, cfg_print_tuple, cfg_doc_tuple, &cfg_rep_tuple, addzone_fields };
+
+static cfg_clausedef_t
+addzoneconf_clauses[] = {
+ { "addzone", &cfg_type_addzone, 0 },
+ { NULL, NULL, 0 }
+};
+
+static cfg_clausedef_t *
+addzoneconf_clausesets[] = {
+ addzoneconf_clauses,
+ NULL
+};
+
+LIBISCCFG_EXTERNAL_DATA cfg_type_t cfg_type_addzoneconf = {
+ "addzoneconf", cfg_parse_mapbody, cfg_print_mapbody, cfg_doc_mapbody,
+ &cfg_rep_map, addzoneconf_clausesets
+};
+
+
static isc_result_t
parse_unitstring(char *str, isc_resourcevalue_t *valuep) {
char *endp;
@@ -1385,6 +1863,17 @@ static cfg_type_t cfg_type_ixfrdifftype = {
&cfg_rep_string, ixfrdiff_enums,
};
+static const char *v4_aaaa_enums[] = { "break-dnssec", NULL };
+static isc_result_t
+parse_v4_aaaa(cfg_parser_t *pctx, const cfg_type_t *type,
+ cfg_obj_t **ret) {
+ return (parse_enum_or_other(pctx, type, &cfg_type_boolean, ret));
+}
+static cfg_type_t cfg_type_v4_aaaa = {
+ "v4_aaaa", parse_v4_aaaa, cfg_print_ustring,
+ doc_enum_or_other, &cfg_rep_string, v4_aaaa_enums,
+};
+
static keyword_type_t key_kw = { "key", &cfg_type_astring };
LIBISCCFG_EXTERNAL_DATA cfg_type_t cfg_type_keyref = {
@@ -2082,6 +2571,15 @@ LIBISCCFG_EXTERNAL_DATA cfg_type_t cfg_type_rndckey = {
&cfg_rep_map, rndckey_clausesets
};
+/*
+ * session.key has exactly the same syntax as rndc.key, but it's defined
+ * separately for clarity (and so we can extend it someday, if needed).
+ */
+LIBISCCFG_EXTERNAL_DATA cfg_type_t cfg_type_sessionkey = {
+ "sessionkey", cfg_parse_mapbody, cfg_print_mapbody, cfg_doc_mapbody,
+ &cfg_rep_map, rndckey_clausesets
+};
+
static cfg_tuplefielddef_t nameport_fields[] = {
{ "name", &cfg_type_astring, 0 },
{ "port", &cfg_type_optional_port, 0 },
diff --git a/contrib/bind9/lib/isccfg/parser.c b/contrib/bind9/lib/isccfg/parser.c
index 2f64a09..87ad391 100644
--- a/contrib/bind9/lib/isccfg/parser.c
+++ b/contrib/bind9/lib/isccfg/parser.c
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004-2008 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004-2011 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 2000-2003 Internet Software Consortium.
*
* Permission to use, copy, modify, and/or distribute this software for any
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: parser.c,v 1.129 2008-09-25 04:02:39 tbox Exp $ */
+/* $Id: parser.c,v 1.139 2011-01-04 23:47:14 tbox Exp $ */
/*! \file */
@@ -29,12 +29,12 @@
#include <isc/mem.h>
#include <isc/net.h>
#include <isc/netaddr.h>
+#include <isc/netscope.h>
#include <isc/print.h>
#include <isc/string.h>
#include <isc/sockaddr.h>
-#include <isc/netscope.h>
-#include <isc/util.h>
#include <isc/symtab.h>
+#include <isc/util.h>
#include <isccfg/cfg.h>
#include <isccfg/grammar.h>
@@ -387,6 +387,12 @@ cfg_parser_create(isc_mem_t *mctx, isc_log_t *lctx, cfg_parser_t **ret) {
if (pctx == NULL)
return (ISC_R_NOMEMORY);
+ result = isc_refcount_init(&pctx->references, 1);
+ if (result != ISC_R_SUCCESS) {
+ isc_mem_put(mctx, pctx, sizeof(*pctx));
+ return (result);
+ }
+
pctx->mctx = mctx;
pctx->lctx = lctx;
pctx->lexer = NULL;
@@ -400,6 +406,7 @@ cfg_parser_create(isc_mem_t *mctx, isc_log_t *lctx, cfg_parser_t **ret) {
pctx->callback = NULL;
pctx->callbackarg = NULL;
pctx->token.type = isc_tokentype_unknown;
+ pctx->flags = 0;
memset(specials, 0, sizeof(specials));
specials['{'] = 1;
@@ -526,17 +533,30 @@ cfg_parse_buffer(cfg_parser_t *pctx, isc_buffer_t *buffer,
}
void
+cfg_parser_attach(cfg_parser_t *src, cfg_parser_t **dest) {
+ REQUIRE(src != NULL);
+ REQUIRE(dest != NULL && *dest == NULL);
+ isc_refcount_increment(&src->references, NULL);
+ *dest = src;
+}
+
+void
cfg_parser_destroy(cfg_parser_t **pctxp) {
cfg_parser_t *pctx = *pctxp;
- isc_lex_destroy(&pctx->lexer);
- /*
- * Cleaning up open_files does not
- * close the files; that was already done
- * by closing the lexer.
- */
- CLEANUP_OBJ(pctx->open_files);
- CLEANUP_OBJ(pctx->closed_files);
- isc_mem_put(pctx->mctx, pctx, sizeof(*pctx));
+ unsigned int refs;
+
+ isc_refcount_decrement(&pctx->references, &refs);
+ if (refs == 0) {
+ isc_lex_destroy(&pctx->lexer);
+ /*
+ * Cleaning up open_files does not
+ * close the files; that was already done
+ * by closing the lexer.
+ */
+ CLEANUP_OBJ(pctx->open_files);
+ CLEANUP_OBJ(pctx->closed_files);
+ isc_mem_put(pctx->mctx, pctx, sizeof(*pctx));
+ }
*pctxp = NULL;
}
@@ -848,8 +868,8 @@ cfg_obj_asboolean(const cfg_obj_t *obj) {
return (obj->value.boolean);
}
-static isc_result_t
-parse_boolean(cfg_parser_t *pctx, const cfg_type_t *type, cfg_obj_t **ret)
+isc_result_t
+cfg_parse_boolean(cfg_parser_t *pctx, const cfg_type_t *type, cfg_obj_t **ret)
{
isc_result_t result;
isc_boolean_t value;
@@ -888,8 +908,8 @@ parse_boolean(cfg_parser_t *pctx, const cfg_type_t *type, cfg_obj_t **ret)
return (result);
}
-static void
-print_boolean(cfg_printer_t *pctx, const cfg_obj_t *obj) {
+void
+cfg_print_boolean(cfg_printer_t *pctx, const cfg_obj_t *obj) {
if (obj->value.boolean)
cfg_print_chars(pctx, "yes", 3);
else
@@ -897,7 +917,7 @@ print_boolean(cfg_printer_t *pctx, const cfg_obj_t *obj) {
}
cfg_type_t cfg_type_boolean = {
- "boolean", parse_boolean, print_boolean, cfg_doc_terminal,
+ "boolean", cfg_parse_boolean, cfg_print_boolean, cfg_doc_terminal,
&cfg_rep_boolean, NULL
};
@@ -1132,7 +1152,7 @@ cfg_list_length(const cfg_obj_t *obj, isc_boolean_t recurse) {
return (count);
}
-const cfg_obj_t *
+cfg_obj_t *
cfg_listelt_value(const cfg_listelt_t *elt) {
REQUIRE(elt != NULL);
return (elt->obj);
@@ -1237,6 +1257,14 @@ cfg_parse_mapbody(cfg_parser_t *pctx, const cfg_type_t *type, cfg_obj_t **ret)
if ((clause->flags & CFG_CLAUSEFLAG_NYI) != 0)
cfg_parser_warning(pctx, 0, "option '%s' is "
"not implemented", clause->name);
+
+ if ((clause->flags & CFG_CLAUSEFLAG_NOTCONFIGURED) != 0) {
+ cfg_parser_warning(pctx, 0, "option '%s' is not "
+ "configured", clause->name);
+ result = ISC_R_FAILURE;
+ goto cleanup;
+ }
+
/*
* Don't log options with CFG_CLAUSEFLAG_NEWDEFAULT
* set here - we need to log the *lack* of such an option,
@@ -1478,6 +1506,7 @@ static struct flagtext {
{ CFG_CLAUSEFLAG_OBSOLETE, "obsolete" },
{ CFG_CLAUSEFLAG_NEWDEFAULT, "default changed" },
{ CFG_CLAUSEFLAG_TESTONLY, "test only" },
+ { CFG_CLAUSEFLAG_NOTCONFIGURED, "not configured" },
{ 0, NULL }
};
@@ -2305,6 +2334,7 @@ cfg_obj_line(const cfg_obj_t *obj) {
isc_result_t
cfg_create_obj(cfg_parser_t *pctx, const cfg_type_t *type, cfg_obj_t **ret) {
+ isc_result_t result;
cfg_obj_t *obj;
obj = isc_mem_get(pctx->mctx, sizeof(cfg_obj_t));
@@ -2313,10 +2343,16 @@ cfg_create_obj(cfg_parser_t *pctx, const cfg_type_t *type, cfg_obj_t **ret) {
obj->type = type;
obj->file = current_file(pctx);
obj->line = pctx->line;
+ result = isc_refcount_init(&obj->references, 1);
+ if (result != ISC_R_SUCCESS) {
+ isc_mem_put(pctx->mctx, obj, sizeof(cfg_obj_t));
+ return (result);
+ }
*ret = obj;
return (ISC_R_SUCCESS);
}
+
static void
map_symtabitem_destroy(char *key, unsigned int type,
isc_symvalue_t symval, void *userarg)
@@ -2370,11 +2406,25 @@ cfg_obj_istype(const cfg_obj_t *obj, const cfg_type_t *type) {
void
cfg_obj_destroy(cfg_parser_t *pctx, cfg_obj_t **objp) {
cfg_obj_t *obj = *objp;
- obj->type->rep->free(pctx, obj);
- isc_mem_put(pctx->mctx, obj, sizeof(cfg_obj_t));
+ unsigned int refs;
+
+ isc_refcount_decrement(&obj->references, &refs);
+ if (refs == 0) {
+ obj->type->rep->free(pctx, obj);
+ isc_refcount_destroy(&obj->references);
+ isc_mem_put(pctx->mctx, obj, sizeof(cfg_obj_t));
+ }
*objp = NULL;
}
+void
+cfg_obj_attach(cfg_obj_t *src, cfg_obj_t **dest) {
+ REQUIRE(src != NULL);
+ REQUIRE(dest != NULL && *dest == NULL);
+ isc_refcount_increment(&src->references, NULL);
+ *dest = src;
+}
+
static void
free_noop(cfg_parser_t *pctx, cfg_obj_t *obj) {
UNUSED(pctx);
diff --git a/contrib/bind9/lib/lwres/api b/contrib/bind9/lib/lwres/api
index fbbf923..94575eb 100644
--- a/contrib/bind9/lib/lwres/api
+++ b/contrib/bind9/lib/lwres/api
@@ -1,3 +1,3 @@
-LIBINTERFACE = 50
-LIBREVISION = 3
+LIBINTERFACE = 80
+LIBREVISION = 0
LIBAGE = 0
diff --git a/contrib/bind9/lib/lwres/context.c b/contrib/bind9/lib/lwres/context.c
index 1310022..e8f0eda 100644
--- a/contrib/bind9/lib/lwres/context.c
+++ b/contrib/bind9/lib/lwres/context.c
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: context.c,v 1.50.332.5 2009-09-01 23:47:05 tbox Exp $ */
+/* $Id: context.c,v 1.55 2009-09-02 23:48:03 tbox Exp $ */
/*! \file context.c
lwres_context_create() creates a #lwres_context_t structure for use in
diff --git a/contrib/bind9/lib/lwres/context_p.h b/contrib/bind9/lib/lwres/context_p.h
index 663b1da..0976951 100644
--- a/contrib/bind9/lib/lwres/context_p.h
+++ b/contrib/bind9/lib/lwres/context_p.h
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: context_p.h,v 1.17.332.2 2008-12-30 23:46:49 tbox Exp $ */
+/* $Id: context_p.h,v 1.19 2008-12-17 23:47:58 tbox Exp $ */
#ifndef LWRES_CONTEXT_P_H
#define LWRES_CONTEXT_P_H 1
diff --git a/contrib/bind9/lib/lwres/getaddrinfo.c b/contrib/bind9/lib/lwres/getaddrinfo.c
index 665205a..81534fc 100644
--- a/contrib/bind9/lib/lwres/getaddrinfo.c
+++ b/contrib/bind9/lib/lwres/getaddrinfo.c
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004-2007, 2009 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004-2008 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 1999-2001 Internet Software Consortium.
*
* This code is derived from software contributed to ISC by
@@ -18,7 +18,7 @@
* IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: getaddrinfo.c,v 1.52.254.2 2009-03-31 23:47:16 tbox Exp $ */
+/* $Id: getaddrinfo.c,v 1.54 2008-11-25 23:47:23 tbox Exp $ */
/*! \file */
diff --git a/contrib/bind9/lib/lwres/getipnode.c b/contrib/bind9/lib/lwres/getipnode.c
index b9eadee..bc90c74 100644
--- a/contrib/bind9/lib/lwres/getipnode.c
+++ b/contrib/bind9/lib/lwres/getipnode.c
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: getipnode.c,v 1.42.332.5 2009-09-01 23:47:05 tbox Exp $ */
+/* $Id: getipnode.c,v 1.47 2009-09-01 23:47:45 tbox Exp $ */
/*! \file */
diff --git a/contrib/bind9/lib/lwres/include/lwres/context.h b/contrib/bind9/lib/lwres/include/lwres/context.h
index 46be27a..2421b57 100644
--- a/contrib/bind9/lib/lwres/include/lwres/context.h
+++ b/contrib/bind9/lib/lwres/include/lwres/context.h
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: context.h,v 1.21.332.2 2008-12-30 23:46:49 tbox Exp $ */
+/* $Id: context.h,v 1.23 2008-12-17 23:47:58 tbox Exp $ */
#ifndef LWRES_CONTEXT_H
#define LWRES_CONTEXT_H 1
diff --git a/contrib/bind9/lib/lwres/include/lwres/netdb.h.in b/contrib/bind9/lib/lwres/include/lwres/netdb.h.in
index 7531ca3..8eedd27 100644
--- a/contrib/bind9/lib/lwres/include/lwres/netdb.h.in
+++ b/contrib/bind9/lib/lwres/include/lwres/netdb.h.in
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: netdb.h.in,v 1.39.332.2 2009-01-18 23:47:41 tbox Exp $ */
+/* $Id: netdb.h.in,v 1.41 2009-01-18 23:48:14 tbox Exp $ */
/*! \file */
diff --git a/contrib/bind9/lib/lwres/lwconfig.c b/contrib/bind9/lib/lwres/lwconfig.c
index 356c106..764ff2a 100644
--- a/contrib/bind9/lib/lwres/lwconfig.c
+++ b/contrib/bind9/lib/lwres/lwconfig.c
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: lwconfig.c,v 1.46.332.2 2008-12-30 23:46:49 tbox Exp $ */
+/* $Id: lwconfig.c,v 1.48 2008-12-17 23:47:58 tbox Exp $ */
/*! \file */
diff --git a/contrib/bind9/lib/lwres/man/lwres.3 b/contrib/bind9/lib/lwres/man/lwres.3
index 77f96b6..c2c0bb6 100644
--- a/contrib/bind9/lib/lwres/man/lwres.3
+++ b/contrib/bind9/lib/lwres/man/lwres.3
@@ -13,7 +13,7 @@
.\" OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
.\" PERFORMANCE OF THIS SOFTWARE.
.\"
-.\" $Id: lwres.3,v 1.28.418.1 2009-07-11 01:55:21 tbox Exp $
+.\" $Id: lwres.3,v 1.29 2009-07-11 01:12:46 tbox Exp $
.\"
.hy 0
.ad l
diff --git a/contrib/bind9/lib/lwres/man/lwres.html b/contrib/bind9/lib/lwres/man/lwres.html
index 3844c01..6cfb750 100644
--- a/contrib/bind9/lib/lwres/man/lwres.html
+++ b/contrib/bind9/lib/lwres/man/lwres.html
@@ -14,7 +14,7 @@
- OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
- PERFORMANCE OF THIS SOFTWARE.
-->
-<!-- $Id: lwres.html,v 1.23.418.1 2009-07-11 01:55:21 tbox Exp $ -->
+<!-- $Id: lwres.html,v 1.24.484.1 2011-06-09 03:41:05 tbox Exp $ -->
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
@@ -22,7 +22,7 @@
<meta name="generator" content="DocBook XSL Stylesheets V1.71.1">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"><div class="refentry" lang="en">
-<a name="id2476275"></a><div class="titlepage"></div>
+<a name="id2476267"></a><div class="titlepage"></div>
<div class="refnamediv">
<h2>Name</h2>
<p>lwres &#8212; introduction to the lightweight resolver library</p>
@@ -32,7 +32,7 @@
<div class="funcsynopsis"><pre class="funcsynopsisinfo">#include &lt;lwres/lwres.h&gt;</pre></div>
</div>
<div class="refsect1" lang="en">
-<a name="id2543348"></a><h2>DESCRIPTION</h2>
+<a name="id2543346"></a><h2>DESCRIPTION</h2>
<p>
The BIND 9 lightweight resolver library is a simple, name service
independent stub resolver library. It provides hostname-to-address
@@ -47,7 +47,7 @@
</p>
</div>
<div class="refsect1" lang="en">
-<a name="id2543361"></a><h2>OVERVIEW</h2>
+<a name="id2543358"></a><h2>OVERVIEW</h2>
<p>
The lwresd library implements multiple name service APIs.
The standard
@@ -101,7 +101,7 @@
</p>
</div>
<div class="refsect1" lang="en">
-<a name="id2543425"></a><h2>CLIENT-SIDE LOW-LEVEL API CALL FLOW</h2>
+<a name="id2543422"></a><h2>CLIENT-SIDE LOW-LEVEL API CALL FLOW</h2>
<p>
When a client program wishes to make an lwres request using the
native low-level API, it typically performs the following
@@ -149,7 +149,7 @@
</p>
</div>
<div class="refsect1" lang="en">
-<a name="id2543573"></a><h2>SERVER-SIDE LOW-LEVEL API CALL FLOW</h2>
+<a name="id2543571"></a><h2>SERVER-SIDE LOW-LEVEL API CALL FLOW</h2>
<p>
When implementing the server side of the lightweight resolver
protocol using the lwres library, a sequence of actions like the
@@ -191,7 +191,7 @@
<p></p>
</div>
<div class="refsect1" lang="en">
-<a name="id2543656"></a><h2>SEE ALSO</h2>
+<a name="id2543654"></a><h2>SEE ALSO</h2>
<p><span class="citerefentry"><span class="refentrytitle">lwres_gethostent</span>(3)</span>,
<span class="citerefentry"><span class="refentrytitle">lwres_getipnode</span>(3)</span>,
diff --git a/contrib/bind9/lib/lwres/man/lwres_buffer.3 b/contrib/bind9/lib/lwres/man/lwres_buffer.3
index 89b9b65..0fc5225 100644
--- a/contrib/bind9/lib/lwres/man/lwres_buffer.3
+++ b/contrib/bind9/lib/lwres/man/lwres_buffer.3
@@ -13,7 +13,7 @@
.\" OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
.\" PERFORMANCE OF THIS SOFTWARE.
.\"
-.\" $Id: lwres_buffer.3,v 1.26.418.1 2009-07-11 01:55:21 tbox Exp $
+.\" $Id: lwres_buffer.3,v 1.27 2009-07-11 01:12:46 tbox Exp $
.\"
.hy 0
.ad l
diff --git a/contrib/bind9/lib/lwres/man/lwres_buffer.html b/contrib/bind9/lib/lwres/man/lwres_buffer.html
index 7f3934a..b7e034f 100644
--- a/contrib/bind9/lib/lwres/man/lwres_buffer.html
+++ b/contrib/bind9/lib/lwres/man/lwres_buffer.html
@@ -14,7 +14,7 @@
- OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
- PERFORMANCE OF THIS SOFTWARE.
-->
-<!-- $Id: lwres_buffer.html,v 1.21.418.1 2009-07-11 01:55:21 tbox Exp $ -->
+<!-- $Id: lwres_buffer.html,v 1.22.484.1 2011-06-09 03:41:05 tbox Exp $ -->
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
@@ -22,7 +22,7 @@
<meta name="generator" content="DocBook XSL Stylesheets V1.71.1">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"><div class="refentry" lang="en">
-<a name="id2476275"></a><div class="titlepage"></div>
+<a name="id2476267"></a><div class="titlepage"></div>
<div class="refnamediv">
<h2>Name</h2>
<p>lwres_buffer_init, lwres_buffer_invalidate, lwres_buffer_add, lwres_buffer_subtract, lwres_buffer_clear, lwres_buffer_first, lwres_buffer_forward, lwres_buffer_back, lwres_buffer_getuint8, lwres_buffer_putuint8, lwres_buffer_getuint16, lwres_buffer_putuint16, lwres_buffer_getuint32, lwres_buffer_putuint32, lwres_buffer_putmem, lwres_buffer_getmem &#8212; lightweight resolver buffer management</p>
@@ -262,7 +262,7 @@ void
</div>
</div>
<div class="refsect1" lang="en">
-<a name="id2543892"></a><h2>DESCRIPTION</h2>
+<a name="id2543890"></a><h2>DESCRIPTION</h2>
<p>
These functions provide bounds checked access to a region of memory
where data is being read or written.
diff --git a/contrib/bind9/lib/lwres/man/lwres_config.3 b/contrib/bind9/lib/lwres/man/lwres_config.3
index 5b8a728..0ea1320 100644
--- a/contrib/bind9/lib/lwres/man/lwres_config.3
+++ b/contrib/bind9/lib/lwres/man/lwres_config.3
@@ -13,7 +13,7 @@
.\" OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
.\" PERFORMANCE OF THIS SOFTWARE.
.\"
-.\" $Id: lwres_config.3,v 1.26.418.1 2009-07-11 01:55:21 tbox Exp $
+.\" $Id: lwres_config.3,v 1.27 2009-07-11 01:12:46 tbox Exp $
.\"
.hy 0
.ad l
diff --git a/contrib/bind9/lib/lwres/man/lwres_config.html b/contrib/bind9/lib/lwres/man/lwres_config.html
index 2cee5ef..8c330a3 100644
--- a/contrib/bind9/lib/lwres/man/lwres_config.html
+++ b/contrib/bind9/lib/lwres/man/lwres_config.html
@@ -14,7 +14,7 @@
- OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
- PERFORMANCE OF THIS SOFTWARE.
-->
-<!-- $Id: lwres_config.html,v 1.22.418.1 2009-07-11 01:55:21 tbox Exp $ -->
+<!-- $Id: lwres_config.html,v 1.23.484.1 2011-06-09 03:41:06 tbox Exp $ -->
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
@@ -22,7 +22,7 @@
<meta name="generator" content="DocBook XSL Stylesheets V1.71.1">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"><div class="refentry" lang="en">
-<a name="id2476275"></a><div class="titlepage"></div>
+<a name="id2476267"></a><div class="titlepage"></div>
<div class="refnamediv">
<h2>Name</h2>
<p>lwres_conf_init, lwres_conf_clear, lwres_conf_parse, lwres_conf_print, lwres_conf_get &#8212; lightweight resolver configuration</p>
@@ -90,7 +90,7 @@ lwres_conf_t *
</div>
</div>
<div class="refsect1" lang="en">
-<a name="id2543441"></a><h2>DESCRIPTION</h2>
+<a name="id2543438"></a><h2>DESCRIPTION</h2>
<p><code class="function">lwres_conf_init()</code>
creates an empty
<span class="type">lwres_conf_t</span>
@@ -123,7 +123,7 @@ lwres_conf_t *
</p>
</div>
<div class="refsect1" lang="en">
-<a name="id2543508"></a><h2>RETURN VALUES</h2>
+<a name="id2543506"></a><h2>RETURN VALUES</h2>
<p><code class="function">lwres_conf_parse()</code>
returns <span class="errorcode">LWRES_R_SUCCESS</span>
if it successfully read and parsed
@@ -142,13 +142,13 @@ lwres_conf_t *
</p>
</div>
<div class="refsect1" lang="en">
-<a name="id2543545"></a><h2>SEE ALSO</h2>
+<a name="id2543543"></a><h2>SEE ALSO</h2>
<p><span class="citerefentry"><span class="refentrytitle">stdio</span>(3)</span>,
<span class="citerefentry"><span class="refentrytitle">resolver</span>(5)</span>.
</p>
</div>
<div class="refsect1" lang="en">
-<a name="id2543571"></a><h2>FILES</h2>
+<a name="id2543569"></a><h2>FILES</h2>
<p><code class="filename">/etc/resolv.conf</code>
</p>
</div>
diff --git a/contrib/bind9/lib/lwres/man/lwres_context.3 b/contrib/bind9/lib/lwres/man/lwres_context.3
index a96a075..fdcaf55 100644
--- a/contrib/bind9/lib/lwres/man/lwres_context.3
+++ b/contrib/bind9/lib/lwres/man/lwres_context.3
@@ -13,7 +13,7 @@
.\" OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
.\" PERFORMANCE OF THIS SOFTWARE.
.\"
-.\" $Id: lwres_context.3,v 1.28.418.1 2009-07-11 01:55:21 tbox Exp $
+.\" $Id: lwres_context.3,v 1.29 2009-07-11 01:12:46 tbox Exp $
.\"
.hy 0
.ad l
diff --git a/contrib/bind9/lib/lwres/man/lwres_context.html b/contrib/bind9/lib/lwres/man/lwres_context.html
index d525a4b..50d5d9f 100644
--- a/contrib/bind9/lib/lwres/man/lwres_context.html
+++ b/contrib/bind9/lib/lwres/man/lwres_context.html
@@ -14,7 +14,7 @@
- OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
- PERFORMANCE OF THIS SOFTWARE.
-->
-<!-- $Id: lwres_context.html,v 1.23.418.1 2009-07-11 01:55:21 tbox Exp $ -->
+<!-- $Id: lwres_context.html,v 1.24.484.1 2011-06-09 03:41:06 tbox Exp $ -->
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
@@ -22,7 +22,7 @@
<meta name="generator" content="DocBook XSL Stylesheets V1.71.1">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"><div class="refentry" lang="en">
-<a name="id2476275"></a><div class="titlepage"></div>
+<a name="id2476267"></a><div class="titlepage"></div>
<div class="refnamediv">
<h2>Name</h2>
<p>lwres_context_create, lwres_context_destroy, lwres_context_nextserial, lwres_context_initserial, lwres_context_freemem, lwres_context_allocmem, lwres_context_sendrecv &#8212; lightweight resolver context management</p>
@@ -172,7 +172,7 @@ void *
</div>
</div>
<div class="refsect1" lang="en">
-<a name="id2543531"></a><h2>DESCRIPTION</h2>
+<a name="id2543529"></a><h2>DESCRIPTION</h2>
<p><code class="function">lwres_context_create()</code>
creates a <span class="type">lwres_context_t</span> structure for use in
lightweight resolver operations. It holds a socket and other
@@ -258,7 +258,7 @@ void *
</p>
</div>
<div class="refsect1" lang="en">
-<a name="id2543719"></a><h2>RETURN VALUES</h2>
+<a name="id2543717"></a><h2>RETURN VALUES</h2>
<p><code class="function">lwres_context_create()</code>
returns <span class="errorcode">LWRES_R_NOMEMORY</span> if memory for
the <span class="type">struct lwres_context</span> could not be allocated,
@@ -283,7 +283,7 @@ void *
</p>
</div>
<div class="refsect1" lang="en">
-<a name="id2543769"></a><h2>SEE ALSO</h2>
+<a name="id2543767"></a><h2>SEE ALSO</h2>
<p><span class="citerefentry"><span class="refentrytitle">lwres_conf_init</span>(3)</span>,
<span class="citerefentry"><span class="refentrytitle">malloc</span>(3)</span>,
diff --git a/contrib/bind9/lib/lwres/man/lwres_gabn.3 b/contrib/bind9/lib/lwres/man/lwres_gabn.3
index 28ea7e1..769c952 100644
--- a/contrib/bind9/lib/lwres/man/lwres_gabn.3
+++ b/contrib/bind9/lib/lwres/man/lwres_gabn.3
@@ -13,7 +13,7 @@
.\" OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
.\" PERFORMANCE OF THIS SOFTWARE.
.\"
-.\" $Id: lwres_gabn.3,v 1.27.418.1 2009-07-11 01:55:21 tbox Exp $
+.\" $Id: lwres_gabn.3,v 1.28 2009-07-11 01:12:46 tbox Exp $
.\"
.hy 0
.ad l
diff --git a/contrib/bind9/lib/lwres/man/lwres_gabn.html b/contrib/bind9/lib/lwres/man/lwres_gabn.html
index b69f432..32b5f21 100644
--- a/contrib/bind9/lib/lwres/man/lwres_gabn.html
+++ b/contrib/bind9/lib/lwres/man/lwres_gabn.html
@@ -14,7 +14,7 @@
- OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
- PERFORMANCE OF THIS SOFTWARE.
-->
-<!-- $Id: lwres_gabn.html,v 1.24.418.1 2009-07-11 01:55:21 tbox Exp $ -->
+<!-- $Id: lwres_gabn.html,v 1.25.484.1 2011-06-09 03:41:06 tbox Exp $ -->
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
@@ -22,7 +22,7 @@
<meta name="generator" content="DocBook XSL Stylesheets V1.71.1">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"><div class="refentry" lang="en">
-<a name="id2476275"></a><div class="titlepage"></div>
+<a name="id2476267"></a><div class="titlepage"></div>
<div class="refnamediv">
<h2>Name</h2>
<p>lwres_gabnrequest_render, lwres_gabnresponse_render, lwres_gabnrequest_parse, lwres_gabnresponse_parse, lwres_gabnresponse_free, lwres_gabnrequest_free &#8212; lightweight resolver getaddrbyname message handling</p>
@@ -178,7 +178,7 @@ void
</div>
</div>
<div class="refsect1" lang="en">
-<a name="id2543522"></a><h2>DESCRIPTION</h2>
+<a name="id2543520"></a><h2>DESCRIPTION</h2>
<p>
These are low-level routines for creating and parsing
lightweight resolver name-to-address lookup request and
@@ -278,7 +278,7 @@ typedef struct {
</p>
</div>
<div class="refsect1" lang="en">
-<a name="id2543667"></a><h2>RETURN VALUES</h2>
+<a name="id2543665"></a><h2>RETURN VALUES</h2>
<p>
The getaddrbyname opcode functions
<code class="function">lwres_gabnrequest_render()</code>,
@@ -316,7 +316,7 @@ typedef struct {
</p>
</div>
<div class="refsect1" lang="en">
-<a name="id2543733"></a><h2>SEE ALSO</h2>
+<a name="id2543731"></a><h2>SEE ALSO</h2>
<p><span class="citerefentry"><span class="refentrytitle">lwres_packet</span>(3)</span>
</p>
</div>
diff --git a/contrib/bind9/lib/lwres/man/lwres_gai_strerror.3 b/contrib/bind9/lib/lwres/man/lwres_gai_strerror.3
index 3d80727..2527896 100644
--- a/contrib/bind9/lib/lwres/man/lwres_gai_strerror.3
+++ b/contrib/bind9/lib/lwres/man/lwres_gai_strerror.3
@@ -13,7 +13,7 @@
.\" OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
.\" PERFORMANCE OF THIS SOFTWARE.
.\"
-.\" $Id: lwres_gai_strerror.3,v 1.27.418.1 2009-07-11 01:55:21 tbox Exp $
+.\" $Id: lwres_gai_strerror.3,v 1.28 2009-07-11 01:12:46 tbox Exp $
.\"
.hy 0
.ad l
diff --git a/contrib/bind9/lib/lwres/man/lwres_gai_strerror.html b/contrib/bind9/lib/lwres/man/lwres_gai_strerror.html
index 616eebe..9ff330b 100644
--- a/contrib/bind9/lib/lwres/man/lwres_gai_strerror.html
+++ b/contrib/bind9/lib/lwres/man/lwres_gai_strerror.html
@@ -14,7 +14,7 @@
- OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
- PERFORMANCE OF THIS SOFTWARE.
-->
-<!-- $Id: lwres_gai_strerror.html,v 1.24.418.1 2009-07-11 01:55:21 tbox Exp $ -->
+<!-- $Id: lwres_gai_strerror.html,v 1.25.484.1 2011-06-09 03:41:06 tbox Exp $ -->
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
@@ -22,7 +22,7 @@
<meta name="generator" content="DocBook XSL Stylesheets V1.71.1">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"><div class="refentry" lang="en">
-<a name="id2476275"></a><div class="titlepage"></div>
+<a name="id2476267"></a><div class="titlepage"></div>
<div class="refnamediv">
<h2>Name</h2>
<p>lwres_gai_strerror &#8212; print suitable error string</p>
@@ -42,7 +42,7 @@ char *
</div>
</div>
<div class="refsect1" lang="en">
-<a name="id2543361"></a><h2>DESCRIPTION</h2>
+<a name="id2543358"></a><h2>DESCRIPTION</h2>
<p><code class="function">lwres_gai_strerror()</code>
returns an error message corresponding to an error code returned by
<code class="function">getaddrinfo()</code>.
@@ -110,7 +110,7 @@ char *
</p>
</div>
<div class="refsect1" lang="en">
-<a name="id2543576"></a><h2>SEE ALSO</h2>
+<a name="id2543574"></a><h2>SEE ALSO</h2>
<p><span class="citerefentry"><span class="refentrytitle">strerror</span>(3)</span>,
<span class="citerefentry"><span class="refentrytitle">lwres_getaddrinfo</span>(3)</span>,
diff --git a/contrib/bind9/lib/lwres/man/lwres_getaddrinfo.3 b/contrib/bind9/lib/lwres/man/lwres_getaddrinfo.3
index 2953f3b..cfc4aec 100644
--- a/contrib/bind9/lib/lwres/man/lwres_getaddrinfo.3
+++ b/contrib/bind9/lib/lwres/man/lwres_getaddrinfo.3
@@ -13,7 +13,7 @@
.\" OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
.\" PERFORMANCE OF THIS SOFTWARE.
.\"
-.\" $Id: lwres_getaddrinfo.3,v 1.31.418.1 2009-07-11 01:55:21 tbox Exp $
+.\" $Id: lwres_getaddrinfo.3,v 1.32 2009-07-11 01:12:46 tbox Exp $
.\"
.hy 0
.ad l
diff --git a/contrib/bind9/lib/lwres/man/lwres_getaddrinfo.html b/contrib/bind9/lib/lwres/man/lwres_getaddrinfo.html
index 013e878..d367f51 100644
--- a/contrib/bind9/lib/lwres/man/lwres_getaddrinfo.html
+++ b/contrib/bind9/lib/lwres/man/lwres_getaddrinfo.html
@@ -14,7 +14,7 @@
- OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
- PERFORMANCE OF THIS SOFTWARE.
-->
-<!-- $Id: lwres_getaddrinfo.html,v 1.27.418.1 2009-07-11 01:55:21 tbox Exp $ -->
+<!-- $Id: lwres_getaddrinfo.html,v 1.28.484.1 2011-06-09 03:41:06 tbox Exp $ -->
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
@@ -22,7 +22,7 @@
<meta name="generator" content="DocBook XSL Stylesheets V1.71.1">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"><div class="refentry" lang="en">
-<a name="id2476275"></a><div class="titlepage"></div>
+<a name="id2476267"></a><div class="titlepage"></div>
<div class="refnamediv">
<h2>Name</h2>
<p>lwres_getaddrinfo, lwres_freeaddrinfo &#8212; socket address structure to host and service name</p>
@@ -89,7 +89,7 @@ struct addrinfo {
</p>
</div>
<div class="refsect1" lang="en">
-<a name="id2543412"></a><h2>DESCRIPTION</h2>
+<a name="id2543410"></a><h2>DESCRIPTION</h2>
<p><code class="function">lwres_getaddrinfo()</code>
is used to get a list of IP addresses and port numbers for host
<em class="parameter"><code>hostname</code></em> and service
@@ -283,7 +283,7 @@ struct addrinfo {
</p>
</div>
<div class="refsect1" lang="en">
-<a name="id2543789"></a><h2>RETURN VALUES</h2>
+<a name="id2543787"></a><h2>RETURN VALUES</h2>
<p><code class="function">lwres_getaddrinfo()</code>
returns zero on success or one of the error codes listed in
<span class="citerefentry"><span class="refentrytitle">gai_strerror</span>(3)</span>
@@ -294,7 +294,7 @@ struct addrinfo {
</p>
</div>
<div class="refsect1" lang="en">
-<a name="id2543827"></a><h2>SEE ALSO</h2>
+<a name="id2542118"></a><h2>SEE ALSO</h2>
<p><span class="citerefentry"><span class="refentrytitle">lwres</span>(3)</span>,
<span class="citerefentry"><span class="refentrytitle">lwres_getaddrinfo</span>(3)</span>,
diff --git a/contrib/bind9/lib/lwres/man/lwres_gethostent.3 b/contrib/bind9/lib/lwres/man/lwres_gethostent.3
index 35ea1c2..7acc506 100644
--- a/contrib/bind9/lib/lwres/man/lwres_gethostent.3
+++ b/contrib/bind9/lib/lwres/man/lwres_gethostent.3
@@ -13,7 +13,7 @@
.\" OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
.\" PERFORMANCE OF THIS SOFTWARE.
.\"
-.\" $Id: lwres_gethostent.3,v 1.29.418.1 2009-07-11 01:55:21 tbox Exp $
+.\" $Id: lwres_gethostent.3,v 1.30 2009-07-11 01:12:46 tbox Exp $
.\"
.hy 0
.ad l
diff --git a/contrib/bind9/lib/lwres/man/lwres_gethostent.html b/contrib/bind9/lib/lwres/man/lwres_gethostent.html
index fd27dcf..fdaa062 100644
--- a/contrib/bind9/lib/lwres/man/lwres_gethostent.html
+++ b/contrib/bind9/lib/lwres/man/lwres_gethostent.html
@@ -14,7 +14,7 @@
- OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
- PERFORMANCE OF THIS SOFTWARE.
-->
-<!-- $Id: lwres_gethostent.html,v 1.24.418.1 2009-07-11 01:55:21 tbox Exp $ -->
+<!-- $Id: lwres_gethostent.html,v 1.25.484.1 2011-06-09 03:41:06 tbox Exp $ -->
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
@@ -22,7 +22,7 @@
<meta name="generator" content="DocBook XSL Stylesheets V1.71.1">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"><div class="refentry" lang="en">
-<a name="id2476275"></a><div class="titlepage"></div>
+<a name="id2476267"></a><div class="titlepage"></div>
<div class="refnamediv">
<h2>Name</h2>
<p>lwres_gethostbyname, lwres_gethostbyname2, lwres_gethostbyaddr, lwres_gethostent, lwres_sethostent, lwres_endhostent, lwres_gethostbyname_r, lwres_gethostbyaddr_r, lwres_gethostent_r, lwres_sethostent_r, lwres_endhostent_r &#8212; lightweight resolver get network host entry</p>
@@ -228,7 +228,7 @@ void
</div>
</div>
<div class="refsect1" lang="en">
-<a name="id2543608"></a><h2>DESCRIPTION</h2>
+<a name="id2543606"></a><h2>DESCRIPTION</h2>
<p>
These functions provide hostname-to-address and
address-to-hostname lookups by means of the lightweight resolver.
@@ -366,7 +366,7 @@ struct hostent {
</p>
</div>
<div class="refsect1" lang="en">
-<a name="id2543959"></a><h2>RETURN VALUES</h2>
+<a name="id2543957"></a><h2>RETURN VALUES</h2>
<p>
The functions
<code class="function">lwres_gethostbyname()</code>,
@@ -430,7 +430,7 @@ struct hostent {
</p>
</div>
<div class="refsect1" lang="en">
-<a name="id2544193"></a><h2>SEE ALSO</h2>
+<a name="id2544190"></a><h2>SEE ALSO</h2>
<p><span class="citerefentry"><span class="refentrytitle">gethostent</span>(3)</span>,
<span class="citerefentry"><span class="refentrytitle">lwres_getipnode</span>(3)</span>,
@@ -439,7 +439,7 @@ struct hostent {
</p>
</div>
<div class="refsect1" lang="en">
-<a name="id2544227"></a><h2>BUGS</h2>
+<a name="id2544225"></a><h2>BUGS</h2>
<p><code class="function">lwres_gethostbyname()</code>,
<code class="function">lwres_gethostbyname2()</code>,
<code class="function">lwres_gethostbyaddr()</code>
diff --git a/contrib/bind9/lib/lwres/man/lwres_getipnode.3 b/contrib/bind9/lib/lwres/man/lwres_getipnode.3
index b46e78f..40ba59c 100644
--- a/contrib/bind9/lib/lwres/man/lwres_getipnode.3
+++ b/contrib/bind9/lib/lwres/man/lwres_getipnode.3
@@ -13,7 +13,7 @@
.\" OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
.\" PERFORMANCE OF THIS SOFTWARE.
.\"
-.\" $Id: lwres_getipnode.3,v 1.28.418.1 2009-07-11 01:55:21 tbox Exp $
+.\" $Id: lwres_getipnode.3,v 1.29 2009-07-11 01:12:46 tbox Exp $
.\"
.hy 0
.ad l
diff --git a/contrib/bind9/lib/lwres/man/lwres_getipnode.html b/contrib/bind9/lib/lwres/man/lwres_getipnode.html
index 20c6d30..9f54cb6 100644
--- a/contrib/bind9/lib/lwres/man/lwres_getipnode.html
+++ b/contrib/bind9/lib/lwres/man/lwres_getipnode.html
@@ -14,7 +14,7 @@
- OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
- PERFORMANCE OF THIS SOFTWARE.
-->
-<!-- $Id: lwres_getipnode.html,v 1.25.418.1 2009-07-11 01:55:21 tbox Exp $ -->
+<!-- $Id: lwres_getipnode.html,v 1.26.484.1 2011-06-09 03:41:06 tbox Exp $ -->
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
@@ -22,7 +22,7 @@
<meta name="generator" content="DocBook XSL Stylesheets V1.71.1">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"><div class="refentry" lang="en">
-<a name="id2476275"></a><div class="titlepage"></div>
+<a name="id2476267"></a><div class="titlepage"></div>
<div class="refnamediv">
<h2>Name</h2>
<p>lwres_getipnodebyname, lwres_getipnodebyaddr, lwres_freehostent &#8212; lightweight resolver nodename / address translation API</p>
@@ -98,7 +98,7 @@ void
</div>
</div>
<div class="refsect1" lang="en">
-<a name="id2543431"></a><h2>DESCRIPTION</h2>
+<a name="id2543429"></a><h2>DESCRIPTION</h2>
<p>
These functions perform thread safe, protocol independent
nodename-to-address and address-to-nodename
@@ -217,7 +217,7 @@ struct hostent {
</p>
</div>
<div class="refsect1" lang="en">
-<a name="id2543689"></a><h2>RETURN VALUES</h2>
+<a name="id2543687"></a><h2>RETURN VALUES</h2>
<p>
If an error occurs,
<code class="function">lwres_getipnodebyname()</code>
@@ -261,7 +261,7 @@ struct hostent {
</p>
</div>
<div class="refsect1" lang="en">
-<a name="id2543786"></a><h2>SEE ALSO</h2>
+<a name="id2543784"></a><h2>SEE ALSO</h2>
<p><span class="citerefentry"><span class="refentrytitle">RFC2553</span></span>,
<span class="citerefentry"><span class="refentrytitle">lwres</span>(3)</span>,
diff --git a/contrib/bind9/lib/lwres/man/lwres_getnameinfo.3 b/contrib/bind9/lib/lwres/man/lwres_getnameinfo.3
index 3a75efb..5674fb2 100644
--- a/contrib/bind9/lib/lwres/man/lwres_getnameinfo.3
+++ b/contrib/bind9/lib/lwres/man/lwres_getnameinfo.3
@@ -13,7 +13,7 @@
.\" OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
.\" PERFORMANCE OF THIS SOFTWARE.
.\"
-.\" $Id: lwres_getnameinfo.3,v 1.29.418.1 2009-07-11 01:55:21 tbox Exp $
+.\" $Id: lwres_getnameinfo.3,v 1.30 2009-07-11 01:12:46 tbox Exp $
.\"
.hy 0
.ad l
diff --git a/contrib/bind9/lib/lwres/man/lwres_getnameinfo.html b/contrib/bind9/lib/lwres/man/lwres_getnameinfo.html
index fb7837f..1048543 100644
--- a/contrib/bind9/lib/lwres/man/lwres_getnameinfo.html
+++ b/contrib/bind9/lib/lwres/man/lwres_getnameinfo.html
@@ -14,7 +14,7 @@
- OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
- PERFORMANCE OF THIS SOFTWARE.
-->
-<!-- $Id: lwres_getnameinfo.html,v 1.23.418.1 2009-07-11 01:55:21 tbox Exp $ -->
+<!-- $Id: lwres_getnameinfo.html,v 1.24.484.1 2011-06-09 03:41:06 tbox Exp $ -->
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
@@ -22,7 +22,7 @@
<meta name="generator" content="DocBook XSL Stylesheets V1.71.1">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"><div class="refentry" lang="en">
-<a name="id2476275"></a><div class="titlepage"></div>
+<a name="id2476267"></a><div class="titlepage"></div>
<div class="refnamediv">
<h2>Name</h2>
<p>lwres_getnameinfo &#8212; lightweight resolver socket address structure to hostname and
@@ -82,7 +82,7 @@ int
</div>
</div>
<div class="refsect1" lang="en">
-<a name="id2543393"></a><h2>DESCRIPTION</h2>
+<a name="id2543390"></a><h2>DESCRIPTION</h2>
<p>
This function is equivalent to the
<span class="citerefentry"><span class="refentrytitle">getnameinfo</span>(3)</span> function defined in RFC2133.
@@ -149,13 +149,13 @@ int
</p>
</div>
<div class="refsect1" lang="en">
-<a name="id2543534"></a><h2>RETURN VALUES</h2>
+<a name="id2543532"></a><h2>RETURN VALUES</h2>
<p><code class="function">lwres_getnameinfo()</code>
returns 0 on success or a non-zero error code if an error occurs.
</p>
</div>
<div class="refsect1" lang="en">
-<a name="id2543546"></a><h2>SEE ALSO</h2>
+<a name="id2543544"></a><h2>SEE ALSO</h2>
<p><span class="citerefentry"><span class="refentrytitle">RFC2133</span></span>,
<span class="citerefentry"><span class="refentrytitle">getservbyport</span>(3)</span>,
<span class="citerefentry"><span class="refentrytitle">lwres</span>(3)</span>,
@@ -165,7 +165,7 @@ int
</p>
</div>
<div class="refsect1" lang="en">
-<a name="id2543604"></a><h2>BUGS</h2>
+<a name="id2543602"></a><h2>BUGS</h2>
<p>
RFC2133 fails to define what the nonzero return values of
<span class="citerefentry"><span class="refentrytitle">getnameinfo</span>(3)</span>
diff --git a/contrib/bind9/lib/lwres/man/lwres_getrrsetbyname.3 b/contrib/bind9/lib/lwres/man/lwres_getrrsetbyname.3
index c804e11..2aa1a9c 100644
--- a/contrib/bind9/lib/lwres/man/lwres_getrrsetbyname.3
+++ b/contrib/bind9/lib/lwres/man/lwres_getrrsetbyname.3
@@ -13,7 +13,7 @@
.\" OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
.\" PERFORMANCE OF THIS SOFTWARE.
.\"
-.\" $Id: lwres_getrrsetbyname.3,v 1.25.418.1 2009-07-11 01:55:21 tbox Exp $
+.\" $Id: lwres_getrrsetbyname.3,v 1.26 2009-07-11 01:12:46 tbox Exp $
.\"
.hy 0
.ad l
diff --git a/contrib/bind9/lib/lwres/man/lwres_getrrsetbyname.html b/contrib/bind9/lib/lwres/man/lwres_getrrsetbyname.html
index 9d9dc04..3a7fb9f 100644
--- a/contrib/bind9/lib/lwres/man/lwres_getrrsetbyname.html
+++ b/contrib/bind9/lib/lwres/man/lwres_getrrsetbyname.html
@@ -14,7 +14,7 @@
- OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
- PERFORMANCE OF THIS SOFTWARE.
-->
-<!-- $Id: lwres_getrrsetbyname.html,v 1.23.418.1 2009-07-11 01:55:21 tbox Exp $ -->
+<!-- $Id: lwres_getrrsetbyname.html,v 1.24.484.1 2011-06-09 03:41:06 tbox Exp $ -->
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
@@ -22,7 +22,7 @@
<meta name="generator" content="DocBook XSL Stylesheets V1.71.1">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"><div class="refentry" lang="en">
-<a name="id2476275"></a><div class="titlepage"></div>
+<a name="id2476267"></a><div class="titlepage"></div>
<div class="refnamediv">
<h2>Name</h2>
<p>lwres_getrrsetbyname, lwres_freerrset &#8212; retrieve DNS records</p>
@@ -102,7 +102,7 @@ struct rrsetinfo {
</p>
</div>
<div class="refsect1" lang="en">
-<a name="id2543414"></a><h2>DESCRIPTION</h2>
+<a name="id2543412"></a><h2>DESCRIPTION</h2>
<p><code class="function">lwres_getrrsetbyname()</code>
gets a set of resource records associated with a
<em class="parameter"><code>hostname</code></em>, <em class="parameter"><code>class</code></em>,
@@ -150,7 +150,7 @@ struct rrsetinfo {
<p></p>
</div>
<div class="refsect1" lang="en">
-<a name="id2543526"></a><h2>RETURN VALUES</h2>
+<a name="id2543524"></a><h2>RETURN VALUES</h2>
<p><code class="function">lwres_getrrsetbyname()</code>
returns zero on success, and one of the following error codes if
an error occurred:
@@ -184,7 +184,7 @@ struct rrsetinfo {
</p>
</div>
<div class="refsect1" lang="en">
-<a name="id2543626"></a><h2>SEE ALSO</h2>
+<a name="id2543624"></a><h2>SEE ALSO</h2>
<p><span class="citerefentry"><span class="refentrytitle">lwres</span>(3)</span>.
</p>
</div>
diff --git a/contrib/bind9/lib/lwres/man/lwres_gnba.3 b/contrib/bind9/lib/lwres/man/lwres_gnba.3
index b34fc05..ad9d627 100644
--- a/contrib/bind9/lib/lwres/man/lwres_gnba.3
+++ b/contrib/bind9/lib/lwres/man/lwres_gnba.3
@@ -13,7 +13,7 @@
.\" OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
.\" PERFORMANCE OF THIS SOFTWARE.
.\"
-.\" $Id: lwres_gnba.3,v 1.27.418.1 2009-07-11 01:55:21 tbox Exp $
+.\" $Id: lwres_gnba.3,v 1.28 2009-07-11 01:12:46 tbox Exp $
.\"
.hy 0
.ad l
diff --git a/contrib/bind9/lib/lwres/man/lwres_gnba.html b/contrib/bind9/lib/lwres/man/lwres_gnba.html
index 158f4d0..8c7691e 100644
--- a/contrib/bind9/lib/lwres/man/lwres_gnba.html
+++ b/contrib/bind9/lib/lwres/man/lwres_gnba.html
@@ -14,7 +14,7 @@
- OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
- PERFORMANCE OF THIS SOFTWARE.
-->
-<!-- $Id: lwres_gnba.html,v 1.24.418.1 2009-07-11 01:55:21 tbox Exp $ -->
+<!-- $Id: lwres_gnba.html,v 1.25.484.1 2011-06-09 03:41:06 tbox Exp $ -->
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
@@ -22,7 +22,7 @@
<meta name="generator" content="DocBook XSL Stylesheets V1.71.1">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"><div class="refentry" lang="en">
-<a name="id2476275"></a><div class="titlepage"></div>
+<a name="id2476267"></a><div class="titlepage"></div>
<div class="refnamediv">
<h2>Name</h2>
<p>lwres_gnbarequest_render, lwres_gnbaresponse_render, lwres_gnbarequest_parse, lwres_gnbaresponse_parse, lwres_gnbaresponse_free, lwres_gnbarequest_free &#8212; lightweight resolver getnamebyaddress message handling</p>
@@ -183,7 +183,7 @@ void
</div>
</div>
<div class="refsect1" lang="en">
-<a name="id2543525"></a><h2>DESCRIPTION</h2>
+<a name="id2543523"></a><h2>DESCRIPTION</h2>
<p>
These are low-level routines for creating and parsing
lightweight resolver address-to-name lookup request and
@@ -270,7 +270,7 @@ typedef struct {
</p>
</div>
<div class="refsect1" lang="en">
-<a name="id2543665"></a><h2>RETURN VALUES</h2>
+<a name="id2543662"></a><h2>RETURN VALUES</h2>
<p>
The getnamebyaddr opcode functions
<code class="function">lwres_gnbarequest_render()</code>,
@@ -308,7 +308,7 @@ typedef struct {
</p>
</div>
<div class="refsect1" lang="en">
-<a name="id2543731"></a><h2>SEE ALSO</h2>
+<a name="id2543729"></a><h2>SEE ALSO</h2>
<p><span class="citerefentry"><span class="refentrytitle">lwres_packet</span>(3)</span>.
</p>
</div>
diff --git a/contrib/bind9/lib/lwres/man/lwres_hstrerror.3 b/contrib/bind9/lib/lwres/man/lwres_hstrerror.3
index f65ba54..b9d5316 100644
--- a/contrib/bind9/lib/lwres/man/lwres_hstrerror.3
+++ b/contrib/bind9/lib/lwres/man/lwres_hstrerror.3
@@ -13,7 +13,7 @@
.\" OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
.\" PERFORMANCE OF THIS SOFTWARE.
.\"
-.\" $Id: lwres_hstrerror.3,v 1.27.418.1 2009-07-11 01:55:21 tbox Exp $
+.\" $Id: lwres_hstrerror.3,v 1.28 2009-07-11 01:12:46 tbox Exp $
.\"
.hy 0
.ad l
diff --git a/contrib/bind9/lib/lwres/man/lwres_hstrerror.html b/contrib/bind9/lib/lwres/man/lwres_hstrerror.html
index d5d25ec..df1c425 100644
--- a/contrib/bind9/lib/lwres/man/lwres_hstrerror.html
+++ b/contrib/bind9/lib/lwres/man/lwres_hstrerror.html
@@ -14,7 +14,7 @@
- OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
- PERFORMANCE OF THIS SOFTWARE.
-->
-<!-- $Id: lwres_hstrerror.html,v 1.23.418.1 2009-07-11 01:55:21 tbox Exp $ -->
+<!-- $Id: lwres_hstrerror.html,v 1.24.484.1 2011-06-09 03:41:07 tbox Exp $ -->
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
@@ -22,7 +22,7 @@
<meta name="generator" content="DocBook XSL Stylesheets V1.71.1">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"><div class="refentry" lang="en">
-<a name="id2476275"></a><div class="titlepage"></div>
+<a name="id2476267"></a><div class="titlepage"></div>
<div class="refnamediv">
<h2>Name</h2>
<p>lwres_herror, lwres_hstrerror &#8212; lightweight resolver error message generation</p>
@@ -50,7 +50,7 @@ const char *
</div>
</div>
<div class="refsect1" lang="en">
-<a name="id2543379"></a><h2>DESCRIPTION</h2>
+<a name="id2543377"></a><h2>DESCRIPTION</h2>
<p><code class="function">lwres_herror()</code>
prints the string <em class="parameter"><code>s</code></em> on
<span class="type">stderr</span> followed by the string generated by
@@ -84,7 +84,7 @@ const char *
</p>
</div>
<div class="refsect1" lang="en">
-<a name="id2543497"></a><h2>RETURN VALUES</h2>
+<a name="id2543495"></a><h2>RETURN VALUES</h2>
<p>
The string <span class="errorname">Unknown resolver error</span> is returned by
<code class="function">lwres_hstrerror()</code>
@@ -94,7 +94,7 @@ const char *
</p>
</div>
<div class="refsect1" lang="en">
-<a name="id2543517"></a><h2>SEE ALSO</h2>
+<a name="id2543515"></a><h2>SEE ALSO</h2>
<p><span class="citerefentry"><span class="refentrytitle">herror</span>(3)</span>,
<span class="citerefentry"><span class="refentrytitle">lwres_hstrerror</span>(3)</span>.
diff --git a/contrib/bind9/lib/lwres/man/lwres_inetntop.3 b/contrib/bind9/lib/lwres/man/lwres_inetntop.3
index 6bd063a..be85906 100644
--- a/contrib/bind9/lib/lwres/man/lwres_inetntop.3
+++ b/contrib/bind9/lib/lwres/man/lwres_inetntop.3
@@ -13,7 +13,7 @@
.\" OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
.\" PERFORMANCE OF THIS SOFTWARE.
.\"
-.\" $Id: lwres_inetntop.3,v 1.26.418.1 2009-07-11 01:55:21 tbox Exp $
+.\" $Id: lwres_inetntop.3,v 1.27 2009-07-11 01:12:46 tbox Exp $
.\"
.hy 0
.ad l
diff --git a/contrib/bind9/lib/lwres/man/lwres_inetntop.html b/contrib/bind9/lib/lwres/man/lwres_inetntop.html
index 8467e4b..f0ea41a 100644
--- a/contrib/bind9/lib/lwres/man/lwres_inetntop.html
+++ b/contrib/bind9/lib/lwres/man/lwres_inetntop.html
@@ -14,7 +14,7 @@
- OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
- PERFORMANCE OF THIS SOFTWARE.
-->
-<!-- $Id: lwres_inetntop.html,v 1.23.418.1 2009-07-11 01:55:21 tbox Exp $ -->
+<!-- $Id: lwres_inetntop.html,v 1.24.484.1 2011-06-09 03:41:06 tbox Exp $ -->
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
@@ -22,7 +22,7 @@
<meta name="generator" content="DocBook XSL Stylesheets V1.71.1">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"><div class="refentry" lang="en">
-<a name="id2476275"></a><div class="titlepage"></div>
+<a name="id2476267"></a><div class="titlepage"></div>
<div class="refnamediv">
<h2>Name</h2>
<p>lwres_net_ntop &#8212; lightweight resolver IP address presentation</p>
@@ -62,7 +62,7 @@ const char *
</div>
</div>
<div class="refsect1" lang="en">
-<a name="id2543379"></a><h2>DESCRIPTION</h2>
+<a name="id2543377"></a><h2>DESCRIPTION</h2>
<p><code class="function">lwres_net_ntop()</code>
converts an IP address of protocol family
<em class="parameter"><code>af</code></em> &#8212; IPv4 or IPv6 &#8212; at
@@ -80,7 +80,7 @@ const char *
</p>
</div>
<div class="refsect1" lang="en">
-<a name="id2543411"></a><h2>RETURN VALUES</h2>
+<a name="id2543409"></a><h2>RETURN VALUES</h2>
<p>
If successful, the function returns <em class="parameter"><code>dst</code></em>:
a pointer to a string containing the presentation format of the
@@ -93,7 +93,7 @@ const char *
</p>
</div>
<div class="refsect1" lang="en">
-<a name="id2543444"></a><h2>SEE ALSO</h2>
+<a name="id2543442"></a><h2>SEE ALSO</h2>
<p><span class="citerefentry"><span class="refentrytitle">RFC1884</span></span>,
<span class="citerefentry"><span class="refentrytitle">inet_ntop</span>(3)</span>,
<span class="citerefentry"><span class="refentrytitle">errno</span>(3)</span>.
diff --git a/contrib/bind9/lib/lwres/man/lwres_noop.3 b/contrib/bind9/lib/lwres/man/lwres_noop.3
index fd05e7e..3be40b2 100644
--- a/contrib/bind9/lib/lwres/man/lwres_noop.3
+++ b/contrib/bind9/lib/lwres/man/lwres_noop.3
@@ -13,7 +13,7 @@
.\" OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
.\" PERFORMANCE OF THIS SOFTWARE.
.\"
-.\" $Id: lwres_noop.3,v 1.28.418.1 2009-07-11 01:55:21 tbox Exp $
+.\" $Id: lwres_noop.3,v 1.29 2009-07-11 01:12:46 tbox Exp $
.\"
.hy 0
.ad l
diff --git a/contrib/bind9/lib/lwres/man/lwres_noop.html b/contrib/bind9/lib/lwres/man/lwres_noop.html
index 4a94836..8f9d402 100644
--- a/contrib/bind9/lib/lwres/man/lwres_noop.html
+++ b/contrib/bind9/lib/lwres/man/lwres_noop.html
@@ -14,7 +14,7 @@
- OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
- PERFORMANCE OF THIS SOFTWARE.
-->
-<!-- $Id: lwres_noop.html,v 1.25.418.1 2009-07-11 01:55:21 tbox Exp $ -->
+<!-- $Id: lwres_noop.html,v 1.26.484.1 2011-06-09 03:41:07 tbox Exp $ -->
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
@@ -22,7 +22,7 @@
<meta name="generator" content="DocBook XSL Stylesheets V1.71.1">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"><div class="refentry" lang="en">
-<a name="id2476275"></a><div class="titlepage"></div>
+<a name="id2476267"></a><div class="titlepage"></div>
<div class="refnamediv">
<h2>Name</h2>
<p>lwres_nooprequest_render, lwres_noopresponse_render, lwres_nooprequest_parse, lwres_noopresponse_parse, lwres_noopresponse_free, lwres_nooprequest_free &#8212; lightweight resolver no-op message handling</p>
@@ -179,7 +179,7 @@ void
</div>
</div>
<div class="refsect1" lang="en">
-<a name="id2543522"></a><h2>DESCRIPTION</h2>
+<a name="id2543520"></a><h2>DESCRIPTION</h2>
<p>
These are low-level routines for creating and parsing
lightweight resolver no-op request and response messages.
@@ -270,7 +270,7 @@ typedef struct {
</p>
</div>
<div class="refsect1" lang="en">
-<a name="id2543672"></a><h2>RETURN VALUES</h2>
+<a name="id2543670"></a><h2>RETURN VALUES</h2>
<p>
The no-op opcode functions
<code class="function">lwres_nooprequest_render()</code>,
@@ -309,7 +309,7 @@ typedef struct {
</p>
</div>
<div class="refsect1" lang="en">
-<a name="id2543738"></a><h2>SEE ALSO</h2>
+<a name="id2543736"></a><h2>SEE ALSO</h2>
<p><span class="citerefentry"><span class="refentrytitle">lwres_packet</span>(3)</span>
</p>
</div>
diff --git a/contrib/bind9/lib/lwres/man/lwres_packet.3 b/contrib/bind9/lib/lwres/man/lwres_packet.3
index 5c096b5..ad4a82c 100644
--- a/contrib/bind9/lib/lwres/man/lwres_packet.3
+++ b/contrib/bind9/lib/lwres/man/lwres_packet.3
@@ -13,7 +13,7 @@
.\" OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
.\" PERFORMANCE OF THIS SOFTWARE.
.\"
-.\" $Id: lwres_packet.3,v 1.29.418.1 2009-07-11 01:55:21 tbox Exp $
+.\" $Id: lwres_packet.3,v 1.30 2009-07-11 01:12:46 tbox Exp $
.\"
.hy 0
.ad l
diff --git a/contrib/bind9/lib/lwres/man/lwres_packet.html b/contrib/bind9/lib/lwres/man/lwres_packet.html
index 096b4bb..84eafc1 100644
--- a/contrib/bind9/lib/lwres/man/lwres_packet.html
+++ b/contrib/bind9/lib/lwres/man/lwres_packet.html
@@ -14,7 +14,7 @@
- OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
- PERFORMANCE OF THIS SOFTWARE.
-->
-<!-- $Id: lwres_packet.html,v 1.26.418.1 2009-07-11 01:55:21 tbox Exp $ -->
+<!-- $Id: lwres_packet.html,v 1.27.484.1 2011-06-09 03:41:07 tbox Exp $ -->
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
@@ -22,7 +22,7 @@
<meta name="generator" content="DocBook XSL Stylesheets V1.71.1">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"><div class="refentry" lang="en">
-<a name="id2476275"></a><div class="titlepage"></div>
+<a name="id2476267"></a><div class="titlepage"></div>
<div class="refnamediv">
<h2>Name</h2>
<p>lwres_lwpacket_renderheader, lwres_lwpacket_parseheader &#8212; lightweight resolver packet handling functions</p>
@@ -66,7 +66,7 @@ lwres_result_t
</div>
</div>
<div class="refsect1" lang="en">
-<a name="id2543389"></a><h2>DESCRIPTION</h2>
+<a name="id2543387"></a><h2>DESCRIPTION</h2>
<p>
These functions rely on a
<span class="type">struct lwres_lwpacket</span>
@@ -219,7 +219,7 @@ struct lwres_lwpacket {
</p>
</div>
<div class="refsect1" lang="en">
-<a name="id2543706"></a><h2>RETURN VALUES</h2>
+<a name="id2543704"></a><h2>RETURN VALUES</h2>
<p>
Successful calls to
<code class="function">lwres_lwpacket_renderheader()</code> and
diff --git a/contrib/bind9/lib/lwres/man/lwres_resutil.3 b/contrib/bind9/lib/lwres/man/lwres_resutil.3
index 6e17797..04cad4e 100644
--- a/contrib/bind9/lib/lwres/man/lwres_resutil.3
+++ b/contrib/bind9/lib/lwres/man/lwres_resutil.3
@@ -13,7 +13,7 @@
.\" OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
.\" PERFORMANCE OF THIS SOFTWARE.
.\"
-.\" $Id: lwres_resutil.3,v 1.28.418.1 2009-07-11 01:55:21 tbox Exp $
+.\" $Id: lwres_resutil.3,v 1.29 2009-07-11 01:12:46 tbox Exp $
.\"
.hy 0
.ad l
diff --git a/contrib/bind9/lib/lwres/man/lwres_resutil.html b/contrib/bind9/lib/lwres/man/lwres_resutil.html
index 1d2aa76..b4de764 100644
--- a/contrib/bind9/lib/lwres/man/lwres_resutil.html
+++ b/contrib/bind9/lib/lwres/man/lwres_resutil.html
@@ -14,7 +14,7 @@
- OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
- PERFORMANCE OF THIS SOFTWARE.
-->
-<!-- $Id: lwres_resutil.html,v 1.25.418.1 2009-07-11 01:55:21 tbox Exp $ -->
+<!-- $Id: lwres_resutil.html,v 1.26.484.1 2011-06-09 03:41:07 tbox Exp $ -->
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
@@ -22,7 +22,7 @@
<meta name="generator" content="DocBook XSL Stylesheets V1.71.1">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"><div class="refentry" lang="en">
-<a name="id2476275"></a><div class="titlepage"></div>
+<a name="id2476267"></a><div class="titlepage"></div>
<div class="refnamediv">
<h2>Name</h2>
<p>lwres_string_parse, lwres_addr_parse, lwres_getaddrsbyname, lwres_getnamebyaddr &#8212; lightweight resolver utility functions</p>
@@ -134,7 +134,7 @@ lwres_result_t
</div>
</div>
<div class="refsect1" lang="en">
-<a name="id2543466"></a><h2>DESCRIPTION</h2>
+<a name="id2543464"></a><h2>DESCRIPTION</h2>
<p><code class="function">lwres_string_parse()</code>
retrieves a DNS-encoded string starting the current pointer of
lightweight resolver buffer <em class="parameter"><code>b</code></em>: i.e.
@@ -210,7 +210,7 @@ typedef struct {
</p>
</div>
<div class="refsect1" lang="en">
-<a name="id2543605"></a><h2>RETURN VALUES</h2>
+<a name="id2543603"></a><h2>RETURN VALUES</h2>
<p>
Successful calls to
<code class="function">lwres_string_parse()</code>
@@ -248,7 +248,7 @@ typedef struct {
</p>
</div>
<div class="refsect1" lang="en">
-<a name="id2543676"></a><h2>SEE ALSO</h2>
+<a name="id2543674"></a><h2>SEE ALSO</h2>
<p><span class="citerefentry"><span class="refentrytitle">lwres_buffer</span>(3)</span>,
<span class="citerefentry"><span class="refentrytitle">lwres_gabn</span>(3)</span>.
diff --git a/contrib/bind9/lib/lwres/print_p.h b/contrib/bind9/lib/lwres/print_p.h
index e2f6ad6..ed71535 100644
--- a/contrib/bind9/lib/lwres/print_p.h
+++ b/contrib/bind9/lib/lwres/print_p.h
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: print_p.h,v 1.4.332.2 2010-08-16 23:45:48 tbox Exp $ */
+/* $Id: print_p.h,v 1.6 2010-08-16 23:46:52 tbox Exp $ */
#ifndef LWRES_PRINT_P_H
#define LWRES_PRINT_P_H 1
diff --git a/contrib/bind9/make/rules.in b/contrib/bind9/make/rules.in
index d848480..12c9d5f 100644
--- a/contrib/bind9/make/rules.in
+++ b/contrib/bind9/make/rules.in
@@ -13,7 +13,7 @@
# OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
# PERFORMANCE OF THIS SOFTWARE.
-# $Id: rules.in,v 1.64.130.2 2009-01-10 23:46:57 tbox Exp $
+# $Id: rules.in,v 1.68 2009-09-01 18:40:25 jinmei Exp $
###
### Common Makefile rules for BIND 9.
@@ -35,6 +35,8 @@ sysconfdir = @sysconfdir@
localstatedir = @localstatedir@
mandir = @mandir@
datarootdir = @datarootdir@
+export_libdir = @export_libdir@
+export_includedir = @export_includedir@
DESTDIR =
@@ -122,7 +124,7 @@ ALL_CPPFLAGS = \
ALL_CFLAGS = ${EXT_CFLAGS} ${ALL_CPPFLAGS} ${CFLAGS} \
${ALWAYS_WARNINGS} ${STD_CWARNINGS} ${CWARNINGS}
-.c.@O@:
+@BIND9_CO_RULE@
${LIBTOOL_MODE_COMPILE} ${CC} ${ALL_CFLAGS} -c $<
SHELL = @SHELL@
@@ -134,12 +136,83 @@ PURIFY = @PURIFY@
MKDEP = ${SHELL} ${top_builddir}/make/mkdep
+###
+### This is a template compound command to build an executable binary with
+### an internal symbol table.
+### This process is tricky. We first link all objects including a tentative
+### empty symbol table, then get a tentative list of symbols from the resulting
+### binary ($@tmp0). Next, we re-link all objects, but this time with the
+### symbol table just created ($tmp@1). The set of symbols should be the same,
+### but the corresponding addresses would be changed due to the difference on
+### the size of symbol tables. So we create the symbol table and re-create the
+### objects once again. Finally, we check the symbol table embedded in the
+### final binaryis consistent with the binary itself; otherwise the process is
+### terminated.
+###
+### To minimize the overhead of creating symbol tables, the autoconf switch
+### --enable-symtable takes an argument so that the symbol table can be created
+### on a per application basis: unless the argument is set to "all", the symbol
+### table is created only when a shell (environment) variable "MAKE_SYMTABLE" is
+### set to a non-null value in the rule to build the executable binary.
+###
+### Each Makefile.in that uses this macro is expected to define "LIBS" and
+### "NOSYMLIBS"; the former includes libisc with an empty symbol table, and
+### the latter includes libisc without the definition of a symbol table.
+### The rule to make the executable binary will look like this
+### binary@EXEEXT@: ${OBJS}
+### #export MAKE_SYMTABLE="yes"; \ <- enable if symtable is always needed
+### export BASEOBJS="${OBJS}"; \
+### ${FINALBUILDCMD}
+###
+### Normally, ${LIBS} includes all necessary libraries to build the binary;
+### there are some exceptions however, where the rule lists some of the
+### necessary libraries explicitly in addition to (or instead of) ${LIBS},
+### like this:
+### binary@EXEEXT@: ${OBJS}
+### cc -o $@ ${OBJS} ${OTHERLIB1} ${OTHERLIB2} ${lIBS}
+### in order to modify such a rule to use this compound command, a separate
+### variable "LIBS0" should be deinfed for the explicitly listed libraries,
+### while making sure ${LIBS} still includes libisc. So the above rule would
+### be modified as follows:
+### binary@EXEEXT@: ${OBJS}
+### export BASEOBJS="${OBJS}"; \
+### export LIBS0="${OTHERLIB1} ${OTHERLIB2}"; \
+### ${FINALBUILDCMD}
+### See bin/check/Makefile.in for a complete example of the use of LIBS0.
+###
+FINALBUILDCMD = if [ X"${MKSYMTBL_PROGRAM}" = X -o X"$${MAKE_SYMTABLE:-${ALWAYS_MAKE_SYMTABLE}}" = X ] ; then \
+ ${LIBTOOL_MODE_LINK} ${PURIFY} ${CC} ${CFLAGS} ${LDFLAGS} \
+ -o $@ $${BASEOBJS} $${LIBS0} ${LIBS}; \
+ else \
+ rm -f $@tmp0; \
+ ${LIBTOOL_MODE_LINK} ${PURIFY} ${CC} ${CFLAGS} ${LDFLAGS} \
+ -o $@tmp0 $${BASEOBJS} $${LIBS0} ${LIBS} || exit 1; \
+ rm -f $@-symtbl.c $@-symtbl.@O@; \
+ ${MKSYMTBL_PROGRAM} ${top_srcdir}/util/mksymtbl.pl \
+ -o $@-symtbl.c $@tmp0 || exit 1; \
+ $(MAKE) $@-symtbl.@O@ || exit 1; \
+ rm -f $@tmp1; \
+ ${LIBTOOL_MODE_LINK} ${PURIFY} ${CC} ${CFLAGS} ${LDFLAGS} \
+ -o $@tmp1 $${BASEOBJS} $@-symtbl.@O@ $${LIBS0} ${NOSYMLIBS} || exit 1; \
+ rm -f $@-symtbl.c $@-symtbl.@O@; \
+ ${MKSYMTBL_PROGRAM} ${top_srcdir}/util/mksymtbl.pl \
+ -o $@-symtbl.c $@tmp1 || exit 1; \
+ $(MAKE) $@-symtbl.@O@ || exit 1; \
+ ${LIBTOOL_MODE_LINK} ${PURIFY} ${CC} ${CFLAGS} ${LDFLAGS} \
+ -o $@tmp2 $${BASEOBJS} $@-symtbl.@O@ $${LIBS0} ${NOSYMLIBS}; \
+ ${MKSYMTBL_PROGRAM} ${top_srcdir}/util/mksymtbl.pl \
+ -o $@-symtbl2.c $@tmp2; \
+ diff $@-symtbl.c $@-symtbl2.c || exit 1;\
+ mv $@tmp2 $@; \
+ rm -f $@tmp0 $@tmp1 $@tmp2 $@-symtbl2.c; \
+ fi
+
cleandir: distclean
superclean: maintainer-clean
clean distclean maintainer-clean::
- rm -f *.@O@ *.o *.lo *.la core *.core .depend
- rm -rf .libs
+ rm -f *.@O@ *.o *.lo *.la core *.core *-symtbl.c *tmp0 *tmp1 *tmp2
+ rm -rf .depend .libs
distclean maintainer-clean::
rm -f Makefile
@@ -217,6 +290,16 @@ PDFLATEX = @PDFLATEX@
W3M = @W3M@
###
+### Script language program used to create internal symbol tables
+###
+MKSYMTBL_PROGRAM = @MKSYMTBL_PROGRAM@
+
+###
+### Switch to create internal symbol table selectively
+###
+ALWAYS_MAKE_SYMTABLE = @ALWAYS_MAKE_SYMTABLE@
+
+###
### DocBook -> HTML
### DocBook -> man page
###
diff --git a/contrib/bind9/version b/contrib/bind9/version
index f03c983..1d9fbd2 100644
--- a/contrib/bind9/version
+++ b/contrib/bind9/version
@@ -1,10 +1,10 @@
-# $Id: version,v 1.43.12.11.2.2.2.1 2011-05-27 00:19:16 each Exp $
+# $Id: version,v 1.53.8.2.2.4 2011-06-21 20:44:01 each Exp $
#
# This file must follow /bin/sh rules. It is imported directly via
# configure.
#
MAJORVER=9
-MINORVER=6
-PATCHVER=
-RELEASETYPE=-ESV
-RELEASEVER=-R4-P1
+MINORVER=8
+PATCHVER=0
+RELEASETYPE=-P
+RELEASEVER=4
diff --git a/contrib/dialog/CHANGES b/contrib/dialog/CHANGES
index f35790b..b839088 100644
--- a/contrib/dialog/CHANGES
+++ b/contrib/dialog/CHANGES
@@ -1,9 +1,94 @@
--- $Id: CHANGES,v 1.333 2011/03/02 10:06:37 tom Exp $
+-- $Id: CHANGES,v 1.360 2011/07/07 23:35:10 tom Exp $
-- Thomas E. Dickey <dickey@invisible-island.net>
This version of dialog was originally from a Debian snapshot. I've done this
to it:
+2011/07/07
+ + modify util.c to work better with old versions of ncurses:
+ + suppress use of wchgat() before fix in 20060715 which is needed
+ for simple shadow manipulation used here in 2011/06/30 (report
+ by xDog Walker).
+ + add a null-pointer check in dlg_print_scrolled()
+ + fix a regression in dlg_getc() introduced by changes to intercept
+ F1 for help-popup (report by xDog Walker).
+
+2011/06/30
+ + correct license statement for prgbox.c (Debian #632198).
+ + correct layout when "--colors" is used, by discounting characters in
+ the escape sequences from the column counts (report by xDog Walker).
+ + modify dlg_checklist() so that only one item in the list can
+ initially be selected (report by xDog Walker).
+ + add/use macro dlg_enter_buttoncode() to improve implementation of
+ "--nook" option (report by xDog Walker).
+ + add option "--no-nl-expand" to suppress the conversion of "\n"
+ strings into newlines (request by xDog Walker).
+ + modify LIB_CREATE symbol in makefile.in to include the library
+ dependencies such as ncurses. This is needed when dynamically
+ loading the library (report/analysis by xDog Walker).
+ + modify dlg_exit_label() to suppress the Cancel button, for
+ consistency.
+ + modify dlg_exit_label() to honor the --nook option, except when there
+ is no other button, e.g., the help-button.
+ + modify dlg_exit_buttoncode() so that it returns the proper code for
+ help-button (report by xDog Walker).
+ + correct loop limit when processing "--column-separator" (report by
+ xDog Walker).
+ + modify handling of "--version" and "--help" to ensure that they are
+ processed, and exit before widgets. Separate "--print-version"
+ from "--version", allowing its output to be interspersed with
+ widget output (report by xDog Walker).
+ + correct a few places where "--version" or "--help" options went
+ always to stdout rather than allowing redirection with the "--stderr"
+ option (report by xDog Walker).
+ + improve repainting after erasing a widget and its shadow.
+ + add "--hline" and "--hfile" options for compatibility with FreeBSD
+ dialog (request by Devin Teske).
+ + add dialog version message when opening a trace file (request by
+ xDog Walker).
+ + show filename of rc-file in traces.
+ + add piped-in data for gauge widget to traces.
+ + add entrypoints to gauge widget, for allocating, updating and freeing
+ the widget (adapted from patch by Stephen Hurd).
+ + fix a reference to freed memory in the gauge widget.
+ + fix --no-mouse option by actually closing the mouse (report by
+ xDog Walker).
+ + add sk.po from
+ http://translationproject.org/latest/dialog/
+ + limit Solaris xpg4 portability fix for redefinition of ERR to cover
+ the specific value found in <sys/regset.h>, in case an application
+ includes dialog.h after curses.h (FreeBSD #156601, report by Jaakko
+ Heinonen, Stephen Hurd).
+ + updated configure macros:
+ + CF_CURSES_CPPFLAGS,
+ + CF_CURSES_LIBS, make checks for special libraries on hpux10 and
+ sunos4 optional
+ + CF_CURSES_FUNCS, workaround for bug in gcc 4.2.1 (FreeBSD 8.1)
+ which caused part of test program to be omitted, i.e., when it saw
+ two return-statements in a row it omitted the _first_ one. Also
+ add expression to pointer check to help FreeBSD's linker decide it
+ should be validated. Just an assignment was not enough. Also, add
+ check for unctrl.h
+ + CF_CURSES_HEADER, change order for curses.h / ncurses.h pairs to
+ put ncurses.h first, which will tend to provide the same #define's
+ as in CF_NCURSES_HEADER (report by Dennis Preiser).
+ + CF_CURSES_TERM_H, modify to avoid spurious check for
+ <curses.hterm.h> if there is no ncurses version. Look for
+ ncurses's term.h anyway, to work around breakage by packagers who
+ separate ncurses' header files.
+ + CF_DISABLE_RPATH_HACK, fix garbled message
+ + CF_LD_RPATH_OPT, add mirbsd
+ + CF_MAKEFLAGS, filter out GNU make's entering/leaving messages.
+ This only appeared when using the macro in a dpkg script, though it
+ should have in other cases.
+ + CF_RPATH_HACK, add a check for libraries not found, e.g., from
+ suppressed functionality of gcc in linking from /usr/local/lib, and
+ add a -L option to help work around this.
+ + CF_XOPEN_SOURCE, workaround for cygwin to get ncurses' configure
+ script to define _XOPEN_SOURCE_EXTENDED (cygwin's features.h
+ doesn't do anything, so it needs a crutch).
+ + updated config.guess, config.sub
+
2011/03/02
+ add --prgbox and --programbox (adapted from patch by David Boyd).
+ add sl.po from
@@ -649,7 +734,7 @@ to it:
colors to be the same, provided that bold attribute is set.
Also improved the logic for choosing a background color when the
foreground and background are the same (report by Erika Pacholleck).
- + update configure script macro CF_XOPEN_SOURCE, ensuring that the
+ + updated configure script macro CF_XOPEN_SOURCE, ensuring that the
_POSIX_C_SOURCE value is defined with a specific value (bug report
originally for lynx).
+ fix configure script so that po/makefile is generated properly when
diff --git a/contrib/dialog/VERSION b/contrib/dialog/VERSION
index 0cc90f5..0462455 100644
--- a/contrib/dialog/VERSION
+++ b/contrib/dialog/VERSION
@@ -1 +1 @@
-9:0:0 1.1 20110302
+10:0:0 1.1 20110707
diff --git a/contrib/dialog/aclocal.m4 b/contrib/dialog/aclocal.m4
index 20e0fa9..159b12f 100644
--- a/contrib/dialog/aclocal.m4
+++ b/contrib/dialog/aclocal.m4
@@ -1,5 +1,5 @@
dnl macros used for DIALOG configure script
-dnl $Id: aclocal.m4,v 1.80 2011/01/18 23:17:01 tom Exp $
+dnl $Id: aclocal.m4,v 1.82 2011/06/28 22:48:31 tom Exp $
dnl ---------------------------------------------------------------------------
dnl Copyright 1999-2010,2011 -- Thomas E. Dickey
dnl
@@ -1128,7 +1128,7 @@ CF_NCURSES_VERSION
CF_CURSES_LIBS
])dnl
dnl ---------------------------------------------------------------------------
-dnl CF_CURSES_CPPFLAGS version: 10 updated: 2009/01/06 19:34:11
+dnl CF_CURSES_CPPFLAGS version: 11 updated: 2011/04/09 14:51:08
dnl ------------------
dnl Look for the curses headers.
AC_DEFUN([CF_CURSES_CPPFLAGS],[
@@ -1137,13 +1137,19 @@ AC_CACHE_CHECK(for extra include directories,cf_cv_curses_incdir,[
cf_cv_curses_incdir=no
case $host_os in #(vi
hpux10.*) #(vi
- test -d /usr/include/curses_colr && \
- cf_cv_curses_incdir="-I/usr/include/curses_colr"
+ if test "x$cf_cv_screen" = "xcurses_colr"
+ then
+ test -d /usr/include/curses_colr && \
+ cf_cv_curses_incdir="-I/usr/include/curses_colr"
+ fi
;;
sunos3*|sunos4*)
- test -d /usr/5lib && \
- test -d /usr/5include && \
- cf_cv_curses_incdir="-I/usr/5include"
+ if test "x$cf_cv_screen" = "xcurses_5lib"
+ then
+ test -d /usr/5lib && \
+ test -d /usr/5include && \
+ cf_cv_curses_incdir="-I/usr/5include"
+ fi
;;
esac
])
@@ -1153,7 +1159,7 @@ CF_CURSES_HEADER
CF_TERM_HEADER
])dnl
dnl ---------------------------------------------------------------------------
-dnl CF_CURSES_FUNCS version: 15 updated: 2010/10/23 15:52:32
+dnl CF_CURSES_FUNCS version: 17 updated: 2011/05/14 16:07:29
dnl ---------------
dnl Curses-functions are a little complicated, since a lot of them are macros.
AC_DEFUN([CF_CURSES_FUNCS],
@@ -1161,6 +1167,7 @@ AC_DEFUN([CF_CURSES_FUNCS],
AC_REQUIRE([CF_CURSES_CPPFLAGS])dnl
AC_REQUIRE([CF_XOPEN_CURSES])
AC_REQUIRE([CF_CURSES_TERM_H])
+AC_REQUIRE([CF_CURSES_UNCTRL_H])
for cf_func in $1
do
CF_UPPER(cf_tr_func,$cf_func)
@@ -1173,7 +1180,8 @@ do
[
#ifndef ${cf_func}
long foo = (long)(&${cf_func});
-${cf_cv_main_return:-return}(foo == 0);
+if (foo + 1234 > 5678)
+ ${cf_cv_main_return:-return}(foo);
#endif
],
[cf_result=yes],
@@ -1190,7 +1198,7 @@ ${cf_cv_main_return:-return}(foo == 0);
done
])dnl
dnl ---------------------------------------------------------------------------
-dnl CF_CURSES_HEADER version: 2 updated: 2010/04/28 06:02:16
+dnl CF_CURSES_HEADER version: 3 updated: 2011/05/01 19:47:45
dnl ----------------
dnl Find a "curses" header file, e.g,. "curses.h", or one of the more common
dnl variations of ncurses' installs.
@@ -1200,10 +1208,10 @@ AC_DEFUN([CF_CURSES_HEADER],[
AC_CACHE_CHECK(if we have identified curses headers,cf_cv_ncurses_header,[
cf_cv_ncurses_header=none
for cf_header in ifelse($1,,,[ \
- $1/curses.h \
- $1/ncurses.h]) \
- curses.h \
- ncurses.h ifelse($1,,[ncurses/curses.h ncurses/ncurses.h])
+ $1/ncurses.h \
+ $1/curses.h]) \
+ ncurses.h \
+ curses.h ifelse($1,,[ncurses/ncurses.h ncurses/curses.h])
do
AC_TRY_COMPILE([#include <${cf_header}>],
[initscr(); tgoto("?", 0,0)],
@@ -1219,7 +1227,7 @@ fi
AC_CHECK_HEADERS($cf_cv_ncurses_header)
])dnl
dnl ---------------------------------------------------------------------------
-dnl CF_CURSES_LIBS version: 32 updated: 2011/01/16 17:43:15
+dnl CF_CURSES_LIBS version: 34 updated: 2011/04/09 14:51:08
dnl --------------
dnl Look for the curses libraries. Older curses implementations may require
dnl termcap/termlib to be linked as well. Call CF_CURSES_CPPFLAGS first.
@@ -1239,19 +1247,26 @@ freebsd*) #(vi
AC_CHECK_LIB(mytinfo,tgoto,[CF_ADD_LIBS(-lmytinfo)])
;;
hpux10.*) #(vi
- AC_CHECK_LIB(cur_colr,initscr,[
- CF_ADD_LIBS(-lcur_colr)
- ac_cv_func_initscr=yes
- ],[
- AC_CHECK_LIB(Hcurses,initscr,[
- # HP's header uses __HP_CURSES, but user claims _HP_CURSES.
- CF_ADD_LIBS(-lHcurses)
- CPPFLAGS="$CPPFLAGS -D__HP_CURSES -D_HP_CURSES"
- ac_cv_func_initscr=yes
- ])])
+ # Looking at HPUX 10.20, the Hcurses library is the oldest (1997), cur_colr
+ # next (1998), and xcurses "newer" (2000). There is no header file for
+ # Hcurses; the subdirectory curses_colr has the headers (curses.h and
+ # term.h) for cur_colr
+ if test "x$cf_cv_screen" = "xcurses_colr"
+ then
+ AC_CHECK_LIB(cur_colr,initscr,[
+ CF_ADD_LIBS(-lcur_colr)
+ ac_cv_func_initscr=yes
+ ],[
+ AC_CHECK_LIB(Hcurses,initscr,[
+ # HP's header uses __HP_CURSES, but user claims _HP_CURSES.
+ CF_ADD_LIBS(-lHcurses)
+ CPPFLAGS="$CPPFLAGS -D__HP_CURSES -D_HP_CURSES"
+ ac_cv_func_initscr=yes
+ ])])
+ fi
;;
linux*)
- case `arch` in
+ case `arch 2>/dev/null` in
x86_64)
if test -d /lib64
then
@@ -1266,9 +1281,12 @@ linux*)
esac
;;
sunos3*|sunos4*)
- if test -d /usr/5lib ; then
- CF_ADD_LIBDIR(/usr/5lib)
- CF_ADD_LIBS(-lcurses -ltermcap)
+ if test "x$cf_cv_screen" = "xcurses_5lib"
+ then
+ if test -d /usr/5lib ; then
+ CF_ADD_LIBDIR(/usr/5lib)
+ CF_ADD_LIBS(-lcurses -ltermcap)
+ fi
fi
ac_cv_func_initscr=yes
;;
@@ -1333,7 +1351,7 @@ fi
])dnl
dnl ---------------------------------------------------------------------------
-dnl CF_CURSES_TERM_H version: 8 updated: 2010/10/23 15:54:49
+dnl CF_CURSES_TERM_H version: 9 updated: 2011/04/09 18:19:55
dnl ----------------
dnl SVr4 curses should have term.h as well (where it puts the definitions of
dnl the low-level interface). This may not be true in old/broken implementations,
@@ -1347,9 +1365,17 @@ AC_CACHE_CHECK(for term.h, cf_cv_term_header,[
# If we found <ncurses/curses.h>, look for <ncurses/term.h>, but always look
# for <term.h> if we do not find the variant.
-for cf_header in \
- `echo ${cf_cv_ncurses_header:-curses.h} | sed -e 's%/.*%/%'`term.h \
- term.h
+
+cf_header_list="term.h ncurses/term.h ncursesw/term.h"
+
+case ${cf_cv_ncurses_header:-curses.h} in #(vi
+*/*)
+ cf_header_item=`echo ${cf_cv_ncurses_header:-curses.h} | sed -e 's%\..*%%' -e 's%/.*%/%'`term.h
+ cf_header_list="$cf_header_item $cf_header_list"
+ ;;
+esac
+
+for cf_header in $cf_header_list
do
AC_TRY_COMPILE([
#include <${cf_cv_ncurses_header:-curses.h}>
@@ -1395,6 +1421,61 @@ ncursesw/term.h)
esac
])dnl
dnl ---------------------------------------------------------------------------
+dnl CF_CURSES_UNCTRL_H version: 1 updated: 2011/04/09 18:19:55
+dnl ------------------
+dnl Any X/Open curses implementation must have unctrl.h, but ncurses packages
+dnl may put it in a subdirectory (along with ncurses' other headers, of
+dnl course). Packages which put the headers in inconsistent locations are
+dnl broken).
+AC_DEFUN([CF_CURSES_UNCTRL_H],
+[
+AC_REQUIRE([CF_CURSES_CPPFLAGS])dnl
+
+AC_CACHE_CHECK(for unctrl.h, cf_cv_unctrl_header,[
+
+# If we found <ncurses/curses.h>, look for <ncurses/unctrl.h>, but always look
+# for <unctrl.h> if we do not find the variant.
+
+cf_header_list="unctrl.h ncurses/unctrl.h ncursesw/unctrl.h"
+
+case ${cf_cv_ncurses_header:-curses.h} in #(vi
+*/*)
+ cf_header_item=`echo ${cf_cv_ncurses_header:-curses.h} | sed -e 's%\..*%%' -e 's%/.*%/%'`unctrl.h
+ cf_header_list="$cf_header_item $cf_header_list"
+ ;;
+esac
+
+for cf_header in $cf_header_list
+do
+ AC_TRY_COMPILE([
+#include <${cf_cv_ncurses_header:-curses.h}>
+#include <${cf_header}>],
+ [WINDOW *x],
+ [cf_cv_unctrl_header=$cf_header
+ break],
+ [cf_cv_unctrl_header=no])
+done
+
+case $cf_cv_unctrl_header in #(vi
+no)
+ AC_MSG_WARN(unctrl.h header not found)
+ ;;
+esac
+])
+
+case $cf_cv_unctrl_header in #(vi
+unctrl.h) #(vi
+ AC_DEFINE(HAVE_UNCTRL_H)
+ ;;
+ncurses/unctrl.h) #(vi
+ AC_DEFINE(HAVE_NCURSES_UNCTRL_H)
+ ;;
+ncursesw/unctrl.h)
+ AC_DEFINE(HAVE_NCURSESW_UNCTRL_H)
+ ;;
+esac
+])dnl
+dnl ---------------------------------------------------------------------------
dnl CF_CURSES_WACS_MAP version: 5 updated: 2011/01/15 11:28:59
dnl ------------------
dnl Check for likely values of wacs_map[].
@@ -1518,7 +1599,7 @@ fi
AC_SUBST(LIBTOOL_VERSION)
])dnl
dnl ---------------------------------------------------------------------------
-dnl CF_DISABLE_RPATH_HACK version: 1 updated: 2010/04/11 10:54:00
+dnl CF_DISABLE_RPATH_HACK version: 2 updated: 2011/02/13 13:31:33
dnl ---------------------
dnl The rpath-hack makes it simpler to build programs, particularly with the
dnl *BSD ports which may have essential libraries in unusual places. But it
@@ -1526,7 +1607,7 @@ dnl can interfere with building an executable for the base system. Use this
dnl option in that case.
AC_DEFUN([CF_DISABLE_RPATH_HACK],
[
-AC_MSG_CHECKING(if rpath should be not be set)
+AC_MSG_CHECKING(if rpath-hack should be disabled)
CF_ARG_DISABLE(rpath-hack,
[ --disable-rpath-hack don't add rpath options for additional libraries],
[cf_disable_rpath_hack=yes],
@@ -2256,7 +2337,7 @@ ifdef([AC_FUNC_FSEEKO],[
])
])
dnl ---------------------------------------------------------------------------
-dnl CF_LD_RPATH_OPT version: 3 updated: 2010/06/02 05:03:05
+dnl CF_LD_RPATH_OPT version: 4 updated: 2011/06/04 20:09:13
dnl ---------------
dnl For the given system and compiler, find the compiler flags to pass to the
dnl loader to use the "rpath" feature.
@@ -2277,7 +2358,7 @@ irix*) #(vi
linux*|gnu*|k*bsd*-gnu) #(vi
LD_RPATH_OPT="-Wl,-rpath,"
;;
-openbsd[[2-9]].*) #(vi
+openbsd[[2-9]].*|mirbsd*) #(vi
LD_RPATH_OPT="-Wl,-rpath,"
;;
freebsd*) #(vi
@@ -2356,7 +2437,7 @@ ifelse($1,,,[$1=$LIB_PREFIX])
AC_SUBST(LIB_PREFIX)
])dnl
dnl ---------------------------------------------------------------------------
-dnl CF_MAKEFLAGS version: 13 updated: 2010/10/23 15:52:32
+dnl CF_MAKEFLAGS version: 14 updated: 2011/03/31 19:29:46
dnl ------------
dnl Some 'make' programs support ${MAKEFLAGS}, some ${MFLAGS}, to pass 'make'
dnl options to lower-levels. It's very useful for "make -n" -- if we have it.
@@ -2373,7 +2454,7 @@ SHELL = /bin/sh
all :
@ echo '.$cf_option'
CF_EOF
- cf_result=`${MAKE:-make} -k -f cf_makeflags.tmp 2>/dev/null | sed -e 's,[[ ]]*$,,'`
+ cf_result=`${MAKE:-make} -k -f cf_makeflags.tmp 2>/dev/null | fgrep -v "ing directory" | sed -e 's,[[ ]]*$,,'`
case "$cf_result" in
.*k)
cf_result=`${MAKE:-make} -k -f cf_makeflags.tmp CC=cc 2>/dev/null`
@@ -3107,7 +3188,7 @@ $1=`echo "$2" | \
-e 's/-[[UD]]'"$3"'\(=[[^ ]]*\)\?[$]//g'`
])dnl
dnl ---------------------------------------------------------------------------
-dnl CF_RPATH_HACK version: 8 updated: 2010/04/17 15:38:58
+dnl CF_RPATH_HACK version: 9 updated: 2011/02/13 13:31:33
dnl -------------
AC_DEFUN([CF_RPATH_HACK],
[
@@ -3120,9 +3201,36 @@ if test -n "$LD_RPATH_OPT" ; then
cf_rpath_list="/usr/lib /lib"
if test "$cf_ldd_prog" != no
then
+ cf_rpath_oops=
+
AC_TRY_LINK([#include <stdio.h>],
[printf("Hello");],
- [cf_rpath_list=`$cf_ldd_prog conftest$ac_exeext | fgrep / | sed -e 's%^.*[[ ]]/%/%' -e 's%/[[^/]][[^/]]*$%%' |sort -u`])
+ [cf_rpath_oops=`$cf_ldd_prog conftest$ac_exeext | fgrep ' not found' | sed -e 's% =>.*$%%' |sort -u`
+ cf_rpath_list=`$cf_ldd_prog conftest$ac_exeext | fgrep / | sed -e 's%^.*[[ ]]/%/%' -e 's%/[[^/]][[^/]]*$%%' |sort -u`])
+
+ # If we passed the link-test, but get a "not found" on a given library,
+ # this could be due to inept reconfiguration of gcc to make it only
+ # partly honor /usr/local/lib (or whatever). Sometimes this behavior
+ # is intentional, e.g., installing gcc in /usr/bin and suppressing the
+ # /usr/local libraries.
+ if test -n "$cf_rpath_oops"
+ then
+ for cf_rpath_src in $cf_rpath_oops
+ do
+ for cf_rpath_dir in \
+ /usr/local \
+ /usr/pkg \
+ /opt/sfw
+ do
+ if test -f $cf_rpath_dir/lib/$cf_rpath_src
+ then
+ CF_VERBOSE(...adding -L$cf_rpath_dir/lib to LDFLAGS for $cf_rpath_src)
+ LDFLAGS="$LDFLAGS -L$cf_rpath_dir/lib"
+ break
+ fi
+ done
+ done
+ fi
fi
CF_VERBOSE(...checking EXTRA_LDFLAGS $EXTRA_LDFLAGS)
@@ -3572,7 +3680,7 @@ if test "$with_dmalloc" = yes ; then
fi
])dnl
dnl ---------------------------------------------------------------------------
-dnl CF_WITH_LIBTOOL version: 26 updated: 2010/10/23 15:55:24
+dnl CF_WITH_LIBTOOL version: 27 updated: 2011/06/28 18:45:38
dnl ---------------
dnl Provide a configure option to incorporate libtool. Define several useful
dnl symbols for the makefile rules.
@@ -3648,7 +3756,7 @@ ifdef([AC_PROG_LIBTOOL],[
AC_MSG_ERROR(Cannot find libtool)
fi
])dnl
- LIB_CREATE='${LIBTOOL} --mode=link ${CC} -rpath ${DESTDIR}${libdir} ${LIBTOOL_VERSION} `cut -f1 ${srcdir}/VERSION` ${LIBTOOL_OPTS} ${LT_UNDEF} -o'
+ LIB_CREATE='${LIBTOOL} --mode=link ${CC} -rpath ${DESTDIR}${libdir} ${LIBTOOL_VERSION} `cut -f1 ${srcdir}/VERSION` ${LIBTOOL_OPTS} ${LT_UNDEF} $(LIBS) -o'
LIB_OBJECT='${OBJECTS:.o=.lo}'
LIB_SUFFIX=.la
LIB_CLEAN='${LIBTOOL} --mode=clean'
@@ -3842,7 +3950,7 @@ AC_TRY_LINK([
test $cf_cv_need_xopen_extension = yes && CPPFLAGS="$CPPFLAGS -D_XOPEN_SOURCE_EXTENDED"
])dnl
dnl ---------------------------------------------------------------------------
-dnl CF_XOPEN_SOURCE version: 34 updated: 2010/05/26 05:38:42
+dnl CF_XOPEN_SOURCE version: 35 updated: 2011/02/20 20:37:37
dnl ---------------
dnl Try to get _XOPEN_SOURCE defined properly that we can use POSIX functions,
dnl or adapt to the vendor's definitions to get equivalent functionality,
@@ -3861,6 +3969,9 @@ case $host_os in #(vi
aix[[456]]*) #(vi
cf_xopen_source="-D_ALL_SOURCE"
;;
+cygwin) #(vi
+ cf_XOPEN_SOURCE=600
+ ;;
darwin[[0-8]].*) #(vi
cf_xopen_source="-D_APPLE_C_SOURCE"
;;
diff --git a/contrib/dialog/arrows.c b/contrib/dialog/arrows.c
index 65af804..6a25fd9 100644
--- a/contrib/dialog/arrows.c
+++ b/contrib/dialog/arrows.c
@@ -1,5 +1,5 @@
/*
- * $Id: arrows.c,v 1.33 2011/01/19 00:27:53 tom Exp $
+ * $Id: arrows.c,v 1.36 2011/06/27 09:13:56 tom Exp $
*
* arrows.c -- draw arrows to indicate end-of-range for lists
*
@@ -36,6 +36,10 @@
#define add_acs(win, code) waddch(win, dlg_boxchar(code))
#endif
+/* size of decorations */
+#define ON_LEFT 4
+#define ON_RIGHT 3
+
#ifdef HAVE_COLOR
static chtype
merge_colors(chtype foreground, chtype background)
@@ -59,6 +63,36 @@ merge_colors(chtype foreground, chtype background)
#define merge_colors(f,b) (f)
#endif
+/*
+ * If we have help-line text, e.g., from "--hline", draw it between the other
+ * decorations at the bottom of the dialog window.
+ */
+void
+dlg_draw_helpline(WINDOW *win, bool decorations)
+{
+ int cur_x, cur_y;
+ int bottom;
+
+ if (dialog_vars.help_line != 0
+ && (bottom = getmaxy(win) - 1) > 0) {
+ chtype attr = A_NORMAL;
+ const int *cols = dlg_index_columns(dialog_vars.help_line);
+ int other = decorations ? (ON_LEFT + ON_RIGHT) : 0;
+ int avail = (getmaxx(win) - other - 2);
+ int limit = dlg_limit_columns(dialog_vars.help_line, avail, 0);
+
+ if (limit > 0) {
+ getyx(win, cur_y, cur_x);
+ other = decorations ? ON_LEFT : 0;
+ (void) wmove(win, bottom, other + (avail - limit) / 2);
+ waddch(win, '[');
+ dlg_print_text(win, dialog_vars.help_line, cols[limit], &attr);
+ waddch(win, ']');
+ wmove(win, cur_y, cur_x);
+ }
+ }
+}
+
void
dlg_draw_arrows2(WINDOW *win,
int top_arrow,
@@ -94,7 +128,7 @@ dlg_draw_arrows2(WINDOW *win,
(void) waddstr(win, "(-)");
} else {
wattrset(win, attr);
- (void) whline(win, dlg_boxchar(ACS_HLINE), 4);
+ (void) whline(win, dlg_boxchar(ACS_HLINE), ON_LEFT);
}
}
mouse_mkbutton(top, x - 1, 6, KEY_PPAGE);
@@ -106,7 +140,7 @@ dlg_draw_arrows2(WINDOW *win,
(void) waddstr(win, "(+)");
} else {
wattrset(win, borderattr);
- (void) whline(win, dlg_boxchar(ACS_HLINE), 4);
+ (void) whline(win, dlg_boxchar(ACS_HLINE), ON_LEFT);
}
mouse_mkbutton(bottom, x - 1, 6, KEY_NPAGE);
@@ -141,6 +175,7 @@ dlg_draw_scrollbar(WINDOW *win,
getyx(win, oldy, oldx);
getmaxyx(win, maxy, maxx);
+ dlg_draw_helpline(win, TRUE);
if (bottom_arrow || top_arrow || dialog_state.use_scrollbar) {
percent = (!total_data
? 100
@@ -213,6 +248,7 @@ dlg_draw_arrows(WINDOW *win,
int top,
int bottom)
{
+ dlg_draw_helpline(win, TRUE);
dlg_draw_arrows2(win,
top_arrow,
bottom_arrow,
diff --git a/contrib/dialog/buttons.c b/contrib/dialog/buttons.c
index d82c455..0241060 100644
--- a/contrib/dialog/buttons.c
+++ b/contrib/dialog/buttons.c
@@ -1,5 +1,5 @@
/*
- * $Id: buttons.c,v 1.84 2011/01/19 00:27:53 tom Exp $
+ * $Id: buttons.c,v 1.86 2011/06/28 10:46:46 tom Exp $
*
* buttons.c -- draw buttons, e.g., OK/Cancel
*
@@ -442,16 +442,23 @@ const char **
dlg_exit_label(void)
{
const char **result;
+ DIALOG_VARS save;
if (dialog_vars.extra_button) {
+ dlg_save_vars(&save);
+ dialog_vars.nocancel = TRUE;
result = dlg_ok_labels();
+ dlg_restore_vars(&save);
} else {
static const char *labels[3];
int n = 0;
- labels[n++] = my_exit_label();
+ if (!dialog_vars.nook)
+ labels[n++] = my_exit_label();
if (dialog_vars.help_button)
labels[n++] = my_help_label();
+ if (n == 0)
+ labels[n++] = my_exit_label();
labels[n] = 0;
result = labels;
@@ -465,7 +472,17 @@ dlg_exit_label(void)
int
dlg_exit_buttoncode(int button)
{
- return dlg_ok_buttoncode(button);
+ int result;
+ DIALOG_VARS save;
+
+ dlg_save_vars(&save);
+ dialog_vars.nocancel = TRUE;
+
+ result = dlg_ok_buttoncode(button);
+
+ dlg_restore_vars(&save);
+
+ return result;
}
const char **
diff --git a/contrib/dialog/calendar.c b/contrib/dialog/calendar.c
index 3958145..45a40ab 100644
--- a/contrib/dialog/calendar.c
+++ b/contrib/dialog/calendar.c
@@ -1,5 +1,5 @@
/*
- * $Id: calendar.c,v 1.60 2011/01/03 23:29:51 tom Exp $
+ * $Id: calendar.c,v 1.62 2011/06/29 09:47:06 tom Exp $
*
* calendar.c -- implements the calendar box
*
@@ -388,6 +388,7 @@ dialog_calendar(const char *title,
{
/* *INDENT-OFF* */
static DLG_KEYS_BINDING binding[] = {
+ HELPKEY_BINDINGS,
ENTERKEY_BINDINGS,
DLG_KEYS_DATA( DLGK_ENTER, ' ' ),
DLG_KEYS_DATA( DLGK_FIELD_NEXT, TAB ),
@@ -571,7 +572,7 @@ dialog_calendar(const char *title,
state = sYEAR;
break;
case DLGK_ENTER:
- result = dlg_ok_buttoncode(button);
+ result = dlg_enter_buttoncode(button);
break;
case DLGK_FIELD_PREV:
state = dlg_prev_ok_buttonindex(state, sMONTH);
diff --git a/contrib/dialog/checklist.c b/contrib/dialog/checklist.c
index cdefe77..4b73ceb 100644
--- a/contrib/dialog/checklist.c
+++ b/contrib/dialog/checklist.c
@@ -1,5 +1,5 @@
/*
- * $Id: checklist.c,v 1.124 2011/01/19 00:27:53 tom Exp $
+ * $Id: checklist.c,v 1.127 2011/06/29 23:04:09 tom Exp $
*
* checklist.c -- implements the checklist box
*
@@ -149,6 +149,7 @@ dlg_checklist(const char *title,
{
/* *INDENT-OFF* */
static DLG_KEYS_BINDING binding[] = {
+ HELPKEY_BINDINGS,
ENTERKEY_BINDINGS,
DLG_KEYS_DATA( DLGK_FIELD_NEXT, KEY_RIGHT ),
DLG_KEYS_DATA( DLGK_FIELD_NEXT, TAB ),
@@ -193,6 +194,24 @@ dlg_checklist(const char *title,
dlg_does_output();
dlg_tab_correct_str(prompt);
+ /*
+ * If this is a radiobutton list, ensure that no more than one item is
+ * selected initially. Allow none to be selected, since some users may
+ * wish to provide this flavor.
+ */
+ if (flag == FLAG_RADIO) {
+ bool first = TRUE;
+
+ for (i = 0; i < item_no; i++) {
+ if (items[i].state) {
+ if (first) {
+ first = FALSE;
+ } else {
+ items[i].state = 0;
+ }
+ }
+ }
+ }
#ifdef KEY_RESIZE
retry:
#endif
@@ -291,11 +310,12 @@ dlg_checklist(const char *title,
choice = max_choice - 1;
}
/* Print the list */
- for (i = 0; i < max_choice; i++)
+ for (i = 0; i < max_choice; i++) {
print_item(list,
&items[i + scrollamt],
states,
i, i == choice);
+ }
(void) wnoutrefresh(list);
/* register the new window, along with its borders */
@@ -565,7 +585,7 @@ dlg_checklist(const char *title,
if (fkey) {
switch (key) {
case DLGK_ENTER:
- result = dlg_ok_buttoncode(button);
+ result = dlg_enter_buttoncode(button);
break;
case DLGK_FIELD_PREV:
button = dlg_prev_button(buttons, button);
diff --git a/contrib/dialog/columns.c b/contrib/dialog/columns.c
index 2ca5be4a..8e5620c 100644
--- a/contrib/dialog/columns.c
+++ b/contrib/dialog/columns.c
@@ -1,5 +1,5 @@
/*
- * $Id: columns.c,v 1.7 2011/01/16 21:51:44 tom Exp $
+ * $Id: columns.c,v 1.8 2011/06/28 09:26:23 tom Exp $
*
* columns.c -- implements column-alignment
*
@@ -25,7 +25,7 @@
#define each(row, data) \
row = 0, data = target; \
- row < num_rows - 1; \
+ row < num_rows; \
++row, data = next_row(data, per_row)
static char *
diff --git a/contrib/dialog/config.guess b/contrib/dialog/config.guess
index bec935b..e4b6966 100755
--- a/contrib/dialog/config.guess
+++ b/contrib/dialog/config.guess
@@ -1,10 +1,10 @@
#! /bin/sh
# Attempt to guess a canonical system name.
# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
-# 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010
-# Free Software Foundation, Inc.
+# 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010,
+# 2911 Free Software Foundation, Inc.
-timestamp='2010-09-24'
+timestamp='2011-01-01'
# This file is free software; you can redistribute it and/or modify it
# under the terms of the GNU General Public License as published by
@@ -57,8 +57,8 @@ GNU config.guess ($timestamp)
Originally written by Per Bothner.
Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000,
-2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 Free
-Software Foundation, Inc.
+2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011
+Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
@@ -92,7 +92,7 @@ if test $# != 0; then
exit 1
fi
-trap 'exit 1' HUP INT TERM
+trap 'exit 1' 1 2 15
# CC_FOR_BUILD -- compiler used by this script. Note that the use of a
# compiler to aid in system detection is discouraged as it requires
@@ -106,7 +106,7 @@ trap 'exit 1' HUP INT TERM
set_cc_for_build='
trap "exitcode=\$?; (rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null) && exit \$exitcode" 0 ;
-trap "rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null; exit 1" HUP INT PIPE TERM ;
+trap "rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null; exit 1" 1 2 13 15 ;
: ${TMPDIR=/tmp} ;
{ tmp=`(umask 077 && mktemp -d "$TMPDIR/cgXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" ; } ||
{ test -n "$RANDOM" && tmp=$TMPDIR/cg$$-$RANDOM && (umask 077 && mkdir $tmp) ; } ||
@@ -270,7 +270,10 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in
# A Xn.n version is an unreleased experimental baselevel.
# 1.2 uses "1.2" for uname -r.
echo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[PVTX]//' | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'`
- exit ;;
+ # Reset EXIT trap before exiting to avoid spurious non-zero exit code.
+ exitcode=$?
+ trap '' 0
+ exit $exitcode ;;
Alpha\ *:Windows_NT*:*)
# How do we know it's Interix rather than the generic POSIX subsystem?
# Should we change UNAME_MACHINE based on the output of uname instead
@@ -326,8 +329,8 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in
sparc) echo sparc-icl-nx7; exit ;;
esac ;;
s390x:SunOS:*:*)
- echo ${UNAME_MACHINE}-ibm-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
- exit ;;
+ echo ${UNAME_MACHINE}-ibm-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+ exit ;;
sun4H:SunOS:5.*:*)
echo sparc-hal-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
exit ;;
@@ -495,7 +498,7 @@ EOF
else
echo i586-dg-dgux${UNAME_RELEASE}
fi
- exit ;;
+ exit ;;
M88*:DolphinOS:*:*) # DolphinOS (SVR3)
echo m88k-dolphin-sysv3
exit ;;
@@ -820,8 +823,8 @@ EOF
echo x86_64-unknown-interix${UNAME_RELEASE}
exit ;;
IA64)
- echo ia64-unknown-interix${UNAME_RELEASE}
- exit ;;
+ echo ia64-unknown-interix${UNAME_RELEASE}
+ exit ;;
esac ;;
[345]86:Windows_95:* | [345]86:Windows_98:* | [345]86:Windows_NT:*)
echo i${UNAME_MACHINE}-pc-mks
@@ -934,14 +937,14 @@ EOF
test x"${CPU}" != x && { echo "${CPU}-unknown-linux-gnu"; exit; }
;;
or32:Linux:*:*)
- echo or32-unknown-linux-gnu
- exit ;;
+ echo or32-unknown-linux-gnu
+ exit ;;
padre:Linux:*:*)
echo sparc-unknown-linux-gnu
exit ;;
parisc64:Linux:*:* | hppa64:Linux:*:*)
- echo hppa64-unknown-linux-gnu
- exit ;;
+ echo hppa64-unknown-linux-gnu
+ exit ;;
parisc:Linux:*:* | hppa:Linux:*:*)
# Look for CPU level
case `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in
diff --git a/contrib/dialog/config.sub b/contrib/dialog/config.sub
index de11910..7c62c34 100755
--- a/contrib/dialog/config.sub
+++ b/contrib/dialog/config.sub
@@ -2,9 +2,9 @@
# Configuration validation subroutine script.
# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
# 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010
-# Free Software Foundation, Inc.
+# 2011 Free Software Foundation, Inc.
-timestamp='2010-09-11'
+timestamp='2011-04-01'
# This file is (in principle) common to ALL GNU software.
# The presence of a machine in this file suggests that SOME GNU software
@@ -76,8 +76,8 @@ version="\
GNU config.sub ($timestamp)
Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000,
-2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 Free
-Software Foundation, Inc.
+2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011
+Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
@@ -175,10 +175,10 @@ case $os in
os=-chorusos
basic_machine=$1
;;
- -chorusrdb)
- os=-chorusrdb
+ -chorusrdb)
+ os=-chorusrdb
basic_machine=$1
- ;;
+ ;;
-hiux*)
os=-hiuxwe2
;;
@@ -283,12 +283,13 @@ case $basic_machine in
| moxie \
| mt \
| msp430 \
- | nds32 | nds32le | nds32be\
+ | nds32 | nds32le | nds32be \
| nios | nios2 \
| ns16k | ns32k \
+ | open8 \
| or32 \
| pdp10 | pdp11 | pj | pjl \
- | powerpc | powerpc64 | powerpc64le | powerpcle | ppcbe \
+ | powerpc | powerpc64 | powerpc64le | powerpcle \
| pyramid \
| rx \
| score \
@@ -296,12 +297,12 @@ case $basic_machine in
| sh64 | sh64le \
| sparc | sparc64 | sparc64b | sparc64v | sparc86x | sparclet | sparclite \
| sparcv8 | sparcv9 | sparcv9b | sparcv9v \
- | spu | strongarm \
- | tahoe | thumb | tic4x | tic54x | tic55x | tic6x | tic80 | tron \
+ | spu \
+ | tahoe | tic4x | tic54x | tic55x | tic6x | tic80 | tron \
| ubicom32 \
| v850 | v850e \
| we32k \
- | x86 | xc16x | xscale | xscalee[bl] | xstormy16 | xtensa \
+ | x86 | xc16x | xstormy16 | xtensa \
| z8k | z80)
basic_machine=$basic_machine-unknown
;;
@@ -324,7 +325,15 @@ case $basic_machine in
ms1)
basic_machine=mt-unknown
;;
-
+ strongarm | thumb | xscale)
+ basic_machine=arm-unknown
+ ;;
+ xscaleeb)
+ basic_machine=armeb-unknown
+ ;;
+ xscaleel)
+ basic_machine=armel-unknown
+ ;;
# We use `pc' rather than `unknown'
# because (1) that's what they normally are, and
# (2) the word "unknown" tends to confuse beginning users.
@@ -382,24 +391,25 @@ case $basic_machine in
| nds32-* | nds32le-* | nds32be-* \
| nios-* | nios2-* \
| none-* | np1-* | ns16k-* | ns32k-* \
+ | open8-* \
| orion-* \
| pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \
- | powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* | ppcbe-* \
+ | powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* \
| pyramid-* \
| romp-* | rs6000-* | rx-* \
| sh-* | sh[1234]-* | sh[24]a-* | sh[24]aeb-* | sh[23]e-* | sh[34]eb-* | sheb-* | shbe-* \
| shle-* | sh[1234]le-* | sh3ele-* | sh64-* | sh64le-* \
| sparc-* | sparc64-* | sparc64b-* | sparc64v-* | sparc86x-* | sparclet-* \
| sparclite-* \
- | sparcv8-* | sparcv9-* | sparcv9b-* | sparcv9v-* | strongarm-* | sv1-* | sx?-* \
- | tahoe-* | thumb-* \
+ | sparcv8-* | sparcv9-* | sparcv9b-* | sparcv9v-* | sv1-* | sx?-* \
+ | tahoe-* \
| tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* \
| tile-* | tilegx-* \
| tron-* \
| ubicom32-* \
| v850-* | v850e-* | vax-* \
| we32k-* \
- | x86-* | x86_64-* | xc16x-* | xps100-* | xscale-* | xscalee[bl]-* \
+ | x86-* | x86_64-* | xc16x-* | xps100-* \
| xstormy16-* | xtensa*-* \
| ymp-* \
| z8k-* | z80-*)
@@ -539,7 +549,7 @@ case $basic_machine in
basic_machine=craynv-cray
os=-unicosmp
;;
- cr16)
+ cr16 | cr16-*)
basic_machine=cr16-unknown
os=-elf
;;
@@ -826,10 +836,10 @@ case $basic_machine in
basic_machine=v70-nec
os=-sysv
;;
- next | m*-next )
+ next | m*-next)
basic_machine=m68k-next
case $os in
- -nextstep* )
+ -nextstep*)
;;
-ns2*)
os=-nextstep2
@@ -948,11 +958,14 @@ case $basic_machine in
pn)
basic_machine=pn-gould
;;
- power) basic_machine=power-ibm
+ power)
+ basic_machine=power-ibm
;;
- ppc) basic_machine=powerpc-unknown
+ ppc | ppcbe)
+ basic_machine=powerpc-unknown
;;
- ppc-*) basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'`
+ ppc-* | ppcbe-*)
+ basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'`
;;
ppcle | powerpclittle | ppc-le | powerpc-little)
basic_machine=powerpcle-unknown
@@ -960,9 +973,11 @@ case $basic_machine in
ppcle-* | powerpclittle-*)
basic_machine=powerpcle-`echo $basic_machine | sed 's/^[^-]*-//'`
;;
- ppc64) basic_machine=powerpc64-unknown
+ ppc64)
+ basic_machine=powerpc64-unknown
;;
- ppc64-*) basic_machine=powerpc64-`echo $basic_machine | sed 's/^[^-]*-//'`
+ ppc64-*)
+ basic_machine=powerpc64-`echo $basic_machine | sed 's/^[^-]*-//'`
;;
ppc64le | powerpc64little | ppc64-le | powerpc64-little)
basic_machine=powerpc64le-unknown
@@ -1046,6 +1061,9 @@ case $basic_machine in
basic_machine=i860-stratus
os=-sysv4
;;
+ strongarm-* | thumb-*)
+ basic_machine=arm-`echo $basic_machine | sed 's/^[^-]*-//'`
+ ;;
sun2)
basic_machine=m68000-sun
;;
@@ -1178,6 +1196,9 @@ case $basic_machine in
xps | xps100)
basic_machine=xps100-honeywell
;;
+ xscale-* | xscalee[bl]-*)
+ basic_machine=`echo $basic_machine | sed 's/^xscale/arm/'`
+ ;;
ymp)
basic_machine=ymp-cray
os=-unicos
@@ -1400,7 +1421,7 @@ case $os in
-nova*)
os=-rtmk-nova
;;
- -ns2 )
+ -ns2)
os=-nextstep2
;;
-nsk*)
@@ -1597,7 +1618,7 @@ case $basic_machine in
m88k-omron*)
os=-luna
;;
- *-next )
+ *-next)
os=-nextstep
;;
*-sequent)
diff --git a/contrib/dialog/configure b/contrib/dialog/configure
index 2d90644..44eaeb4 100755
--- a/contrib/dialog/configure
+++ b/contrib/dialog/configure
@@ -2462,7 +2462,7 @@ SHELL = /bin/sh
all :
@ echo '.$cf_option'
CF_EOF
- cf_result=`${MAKE:-make} -k -f cf_makeflags.tmp 2>/dev/null | sed -e 's,[ ]*$,,'`
+ cf_result=`${MAKE:-make} -k -f cf_makeflags.tmp 2>/dev/null | fgrep -v "ing directory" | sed -e 's,[ ]*$,,'`
case "$cf_result" in
.*k)
cf_result=`${MAKE:-make} -k -f cf_makeflags.tmp CC=cc 2>/dev/null`
@@ -2832,6 +2832,9 @@ case $host_os in #(vi
aix[456]*) #(vi
cf_xopen_source="-D_ALL_SOURCE"
;;
+cygwin) #(vi
+ cf_XOPEN_SOURCE=600
+ ;;
darwin[0-8].*) #(vi
cf_xopen_source="-D_APPLE_C_SOURCE"
;;
@@ -2857,14 +2860,14 @@ irix[56].*) #(vi
;;
linux*|gnu*|mint*|k*bsd*-gnu) #(vi
-echo "$as_me:2860: checking if we must define _GNU_SOURCE" >&5
+echo "$as_me:2863: checking if we must define _GNU_SOURCE" >&5
echo $ECHO_N "checking if we must define _GNU_SOURCE... $ECHO_C" >&6
if test "${cf_cv_gnu_source+set}" = set; then
echo $ECHO_N "(cached) $ECHO_C" >&6
else
cat >conftest.$ac_ext <<_ACEOF
-#line 2867 "configure"
+#line 2870 "configure"
#include "confdefs.h"
#include <sys/types.h>
int
@@ -2879,16 +2882,16 @@ make an error
}
_ACEOF
rm -f conftest.$ac_objext
-if { (eval echo "$as_me:2882: \"$ac_compile\"") >&5
+if { (eval echo "$as_me:2885: \"$ac_compile\"") >&5
(eval $ac_compile) 2>&5
ac_status=$?
- echo "$as_me:2885: \$? = $ac_status" >&5
+ echo "$as_me:2888: \$? = $ac_status" >&5
(exit $ac_status); } &&
{ ac_try='test -s conftest.$ac_objext'
- { (eval echo "$as_me:2888: \"$ac_try\"") >&5
+ { (eval echo "$as_me:2891: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
- echo "$as_me:2891: \$? = $ac_status" >&5
+ echo "$as_me:2894: \$? = $ac_status" >&5
(exit $ac_status); }; }; then
cf_cv_gnu_source=no
else
@@ -2897,7 +2900,7 @@ cat conftest.$ac_ext >&5
cf_save="$CPPFLAGS"
CPPFLAGS="$CPPFLAGS -D_GNU_SOURCE"
cat >conftest.$ac_ext <<_ACEOF
-#line 2900 "configure"
+#line 2903 "configure"
#include "confdefs.h"
#include <sys/types.h>
int
@@ -2912,16 +2915,16 @@ make an error
}
_ACEOF
rm -f conftest.$ac_objext
-if { (eval echo "$as_me:2915: \"$ac_compile\"") >&5
+if { (eval echo "$as_me:2918: \"$ac_compile\"") >&5
(eval $ac_compile) 2>&5
ac_status=$?
- echo "$as_me:2918: \$? = $ac_status" >&5
+ echo "$as_me:2921: \$? = $ac_status" >&5
(exit $ac_status); } &&
{ ac_try='test -s conftest.$ac_objext'
- { (eval echo "$as_me:2921: \"$ac_try\"") >&5
+ { (eval echo "$as_me:2924: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
- echo "$as_me:2924: \$? = $ac_status" >&5
+ echo "$as_me:2927: \$? = $ac_status" >&5
(exit $ac_status); }; }; then
cf_cv_gnu_source=no
else
@@ -2936,7 +2939,7 @@ fi
rm -f conftest.$ac_objext conftest.$ac_ext
fi
-echo "$as_me:2939: result: $cf_cv_gnu_source" >&5
+echo "$as_me:2942: result: $cf_cv_gnu_source" >&5
echo "${ECHO_T}$cf_cv_gnu_source" >&6
test "$cf_cv_gnu_source" = yes && CPPFLAGS="$CPPFLAGS -D_GNU_SOURCE"
@@ -2966,14 +2969,14 @@ solaris2.[1-9]) #(vi
cf_xopen_source="-D__EXTENSIONS__"
;;
*)
- echo "$as_me:2969: checking if we should define _XOPEN_SOURCE" >&5
+ echo "$as_me:2972: checking if we should define _XOPEN_SOURCE" >&5
echo $ECHO_N "checking if we should define _XOPEN_SOURCE... $ECHO_C" >&6
if test "${cf_cv_xopen_source+set}" = set; then
echo $ECHO_N "(cached) $ECHO_C" >&6
else
cat >conftest.$ac_ext <<_ACEOF
-#line 2976 "configure"
+#line 2979 "configure"
#include "confdefs.h"
#include <sys/types.h>
int
@@ -2988,16 +2991,16 @@ make an error
}
_ACEOF
rm -f conftest.$ac_objext
-if { (eval echo "$as_me:2991: \"$ac_compile\"") >&5
+if { (eval echo "$as_me:2994: \"$ac_compile\"") >&5
(eval $ac_compile) 2>&5
ac_status=$?
- echo "$as_me:2994: \$? = $ac_status" >&5
+ echo "$as_me:2997: \$? = $ac_status" >&5
(exit $ac_status); } &&
{ ac_try='test -s conftest.$ac_objext'
- { (eval echo "$as_me:2997: \"$ac_try\"") >&5
+ { (eval echo "$as_me:3000: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
- echo "$as_me:3000: \$? = $ac_status" >&5
+ echo "$as_me:3003: \$? = $ac_status" >&5
(exit $ac_status); }; }; then
cf_cv_xopen_source=no
else
@@ -3006,7 +3009,7 @@ cat conftest.$ac_ext >&5
cf_save="$CPPFLAGS"
CPPFLAGS="$CPPFLAGS -D_XOPEN_SOURCE=$cf_XOPEN_SOURCE"
cat >conftest.$ac_ext <<_ACEOF
-#line 3009 "configure"
+#line 3012 "configure"
#include "confdefs.h"
#include <sys/types.h>
int
@@ -3021,16 +3024,16 @@ make an error
}
_ACEOF
rm -f conftest.$ac_objext
-if { (eval echo "$as_me:3024: \"$ac_compile\"") >&5
+if { (eval echo "$as_me:3027: \"$ac_compile\"") >&5
(eval $ac_compile) 2>&5
ac_status=$?
- echo "$as_me:3027: \$? = $ac_status" >&5
+ echo "$as_me:3030: \$? = $ac_status" >&5
(exit $ac_status); } &&
{ ac_try='test -s conftest.$ac_objext'
- { (eval echo "$as_me:3030: \"$ac_try\"") >&5
+ { (eval echo "$as_me:3033: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
- echo "$as_me:3033: \$? = $ac_status" >&5
+ echo "$as_me:3036: \$? = $ac_status" >&5
(exit $ac_status); }; }; then
cf_cv_xopen_source=no
else
@@ -3045,7 +3048,7 @@ fi
rm -f conftest.$ac_objext conftest.$ac_ext
fi
-echo "$as_me:3048: result: $cf_cv_xopen_source" >&5
+echo "$as_me:3051: result: $cf_cv_xopen_source" >&5
echo "${ECHO_T}$cf_cv_xopen_source" >&6
if test "$cf_cv_xopen_source" != no ; then
@@ -3152,16 +3155,16 @@ cf_trim_CPPFLAGS=`echo "$cf_save_CPPFLAGS" | \
sed -e 's/-[UD]'"_POSIX_C_SOURCE"'\(=[^ ]*\)\?[ ]/ /g' \
-e 's/-[UD]'"_POSIX_C_SOURCE"'\(=[^ ]*\)\?$//g'`
-echo "$as_me:3155: checking if we should define _POSIX_C_SOURCE" >&5
+echo "$as_me:3158: checking if we should define _POSIX_C_SOURCE" >&5
echo $ECHO_N "checking if we should define _POSIX_C_SOURCE... $ECHO_C" >&6
if test "${cf_cv_posix_c_source+set}" = set; then
echo $ECHO_N "(cached) $ECHO_C" >&6
else
-echo "${as_me:-configure}:3161: testing if the symbol is already defined go no further ..." 1>&5
+echo "${as_me:-configure}:3164: testing if the symbol is already defined go no further ..." 1>&5
cat >conftest.$ac_ext <<_ACEOF
-#line 3164 "configure"
+#line 3167 "configure"
#include "confdefs.h"
#include <sys/types.h>
int
@@ -3176,16 +3179,16 @@ make an error
}
_ACEOF
rm -f conftest.$ac_objext
-if { (eval echo "$as_me:3179: \"$ac_compile\"") >&5
+if { (eval echo "$as_me:3182: \"$ac_compile\"") >&5
(eval $ac_compile) 2>&5
ac_status=$?
- echo "$as_me:3182: \$? = $ac_status" >&5
+ echo "$as_me:3185: \$? = $ac_status" >&5
(exit $ac_status); } &&
{ ac_try='test -s conftest.$ac_objext'
- { (eval echo "$as_me:3185: \"$ac_try\"") >&5
+ { (eval echo "$as_me:3188: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
- echo "$as_me:3188: \$? = $ac_status" >&5
+ echo "$as_me:3191: \$? = $ac_status" >&5
(exit $ac_status); }; }; then
cf_cv_posix_c_source=no
else
@@ -3206,7 +3209,7 @@ cf_want_posix_source=no
esac
if test "$cf_want_posix_source" = yes ; then
cat >conftest.$ac_ext <<_ACEOF
-#line 3209 "configure"
+#line 3212 "configure"
#include "confdefs.h"
#include <sys/types.h>
int
@@ -3221,16 +3224,16 @@ make an error
}
_ACEOF
rm -f conftest.$ac_objext
-if { (eval echo "$as_me:3224: \"$ac_compile\"") >&5
+if { (eval echo "$as_me:3227: \"$ac_compile\"") >&5
(eval $ac_compile) 2>&5
ac_status=$?
- echo "$as_me:3227: \$? = $ac_status" >&5
+ echo "$as_me:3230: \$? = $ac_status" >&5
(exit $ac_status); } &&
{ ac_try='test -s conftest.$ac_objext'
- { (eval echo "$as_me:3230: \"$ac_try\"") >&5
+ { (eval echo "$as_me:3233: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
- echo "$as_me:3233: \$? = $ac_status" >&5
+ echo "$as_me:3236: \$? = $ac_status" >&5
(exit $ac_status); }; }; then
:
else
@@ -3241,15 +3244,15 @@ fi
rm -f conftest.$ac_objext conftest.$ac_ext
fi
-echo "${as_me:-configure}:3244: testing ifdef from value $cf_POSIX_C_SOURCE ..." 1>&5
+echo "${as_me:-configure}:3247: testing ifdef from value $cf_POSIX_C_SOURCE ..." 1>&5
CFLAGS="$cf_trim_CFLAGS"
CPPFLAGS="$cf_trim_CPPFLAGS $cf_cv_posix_c_source"
-echo "${as_me:-configure}:3249: testing if the second compile does not leave our definition intact error ..." 1>&5
+echo "${as_me:-configure}:3252: testing if the second compile does not leave our definition intact error ..." 1>&5
cat >conftest.$ac_ext <<_ACEOF
-#line 3252 "configure"
+#line 3255 "configure"
#include "confdefs.h"
#include <sys/types.h>
int
@@ -3264,16 +3267,16 @@ make an error
}
_ACEOF
rm -f conftest.$ac_objext
-if { (eval echo "$as_me:3267: \"$ac_compile\"") >&5
+if { (eval echo "$as_me:3270: \"$ac_compile\"") >&5
(eval $ac_compile) 2>&5
ac_status=$?
- echo "$as_me:3270: \$? = $ac_status" >&5
+ echo "$as_me:3273: \$? = $ac_status" >&5
(exit $ac_status); } &&
{ ac_try='test -s conftest.$ac_objext'
- { (eval echo "$as_me:3273: \"$ac_try\"") >&5
+ { (eval echo "$as_me:3276: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
- echo "$as_me:3276: \$? = $ac_status" >&5
+ echo "$as_me:3279: \$? = $ac_status" >&5
(exit $ac_status); }; }; then
:
else
@@ -3289,7 +3292,7 @@ fi
rm -f conftest.$ac_objext conftest.$ac_ext
fi
-echo "$as_me:3292: result: $cf_cv_posix_c_source" >&5
+echo "$as_me:3295: result: $cf_cv_posix_c_source" >&5
echo "${ECHO_T}$cf_cv_posix_c_source" >&6
if test "$cf_cv_posix_c_source" != no ; then
@@ -3468,7 +3471,7 @@ if test "${enable_largefile+set}" = set; then
fi;
if test "$enable_largefile" != no; then
- echo "$as_me:3471: checking for special C compiler options needed for large files" >&5
+ echo "$as_me:3474: checking for special C compiler options needed for large files" >&5
echo $ECHO_N "checking for special C compiler options needed for large files... $ECHO_C" >&6
if test "${ac_cv_sys_largefile_CC+set}" = set; then
echo $ECHO_N "(cached) $ECHO_C" >&6
@@ -3480,7 +3483,7 @@ else
# IRIX 6.2 and later do not support large files by default,
# so use the C compiler's -n32 option if that helps.
cat >conftest.$ac_ext <<_ACEOF
-#line 3483 "configure"
+#line 3486 "configure"
#include "confdefs.h"
#include <sys/types.h>
/* Check that off_t can represent 2**63 - 1 correctly.
@@ -3500,16 +3503,16 @@ main ()
}
_ACEOF
rm -f conftest.$ac_objext
-if { (eval echo "$as_me:3503: \"$ac_compile\"") >&5
+if { (eval echo "$as_me:3506: \"$ac_compile\"") >&5
(eval $ac_compile) 2>&5
ac_status=$?
- echo "$as_me:3506: \$? = $ac_status" >&5
+ echo "$as_me:3509: \$? = $ac_status" >&5
(exit $ac_status); } &&
{ ac_try='test -s conftest.$ac_objext'
- { (eval echo "$as_me:3509: \"$ac_try\"") >&5
+ { (eval echo "$as_me:3512: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
- echo "$as_me:3512: \$? = $ac_status" >&5
+ echo "$as_me:3515: \$? = $ac_status" >&5
(exit $ac_status); }; }; then
break
else
@@ -3519,16 +3522,16 @@ fi
rm -f conftest.$ac_objext
CC="$CC -n32"
rm -f conftest.$ac_objext
-if { (eval echo "$as_me:3522: \"$ac_compile\"") >&5
+if { (eval echo "$as_me:3525: \"$ac_compile\"") >&5
(eval $ac_compile) 2>&5
ac_status=$?
- echo "$as_me:3525: \$? = $ac_status" >&5
+ echo "$as_me:3528: \$? = $ac_status" >&5
(exit $ac_status); } &&
{ ac_try='test -s conftest.$ac_objext'
- { (eval echo "$as_me:3528: \"$ac_try\"") >&5
+ { (eval echo "$as_me:3531: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
- echo "$as_me:3531: \$? = $ac_status" >&5
+ echo "$as_me:3534: \$? = $ac_status" >&5
(exit $ac_status); }; }; then
ac_cv_sys_largefile_CC=' -n32'; break
else
@@ -3542,13 +3545,13 @@ rm -f conftest.$ac_objext
rm -f conftest.$ac_ext
fi
fi
-echo "$as_me:3545: result: $ac_cv_sys_largefile_CC" >&5
+echo "$as_me:3548: result: $ac_cv_sys_largefile_CC" >&5
echo "${ECHO_T}$ac_cv_sys_largefile_CC" >&6
if test "$ac_cv_sys_largefile_CC" != no; then
CC=$CC$ac_cv_sys_largefile_CC
fi
- echo "$as_me:3551: checking for _FILE_OFFSET_BITS value needed for large files" >&5
+ echo "$as_me:3554: checking for _FILE_OFFSET_BITS value needed for large files" >&5
echo $ECHO_N "checking for _FILE_OFFSET_BITS value needed for large files... $ECHO_C" >&6
if test "${ac_cv_sys_file_offset_bits+set}" = set; then
echo $ECHO_N "(cached) $ECHO_C" >&6
@@ -3556,7 +3559,7 @@ else
while :; do
ac_cv_sys_file_offset_bits=no
cat >conftest.$ac_ext <<_ACEOF
-#line 3559 "configure"
+#line 3562 "configure"
#include "confdefs.h"
#include <sys/types.h>
/* Check that off_t can represent 2**63 - 1 correctly.
@@ -3576,16 +3579,16 @@ main ()
}
_ACEOF
rm -f conftest.$ac_objext
-if { (eval echo "$as_me:3579: \"$ac_compile\"") >&5
+if { (eval echo "$as_me:3582: \"$ac_compile\"") >&5
(eval $ac_compile) 2>&5
ac_status=$?
- echo "$as_me:3582: \$? = $ac_status" >&5
+ echo "$as_me:3585: \$? = $ac_status" >&5
(exit $ac_status); } &&
{ ac_try='test -s conftest.$ac_objext'
- { (eval echo "$as_me:3585: \"$ac_try\"") >&5
+ { (eval echo "$as_me:3588: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
- echo "$as_me:3588: \$? = $ac_status" >&5
+ echo "$as_me:3591: \$? = $ac_status" >&5
(exit $ac_status); }; }; then
break
else
@@ -3594,7 +3597,7 @@ cat conftest.$ac_ext >&5
fi
rm -f conftest.$ac_objext conftest.$ac_ext
cat >conftest.$ac_ext <<_ACEOF
-#line 3597 "configure"
+#line 3600 "configure"
#include "confdefs.h"
#define _FILE_OFFSET_BITS 64
#include <sys/types.h>
@@ -3615,16 +3618,16 @@ main ()
}
_ACEOF
rm -f conftest.$ac_objext
-if { (eval echo "$as_me:3618: \"$ac_compile\"") >&5
+if { (eval echo "$as_me:3621: \"$ac_compile\"") >&5
(eval $ac_compile) 2>&5
ac_status=$?
- echo "$as_me:3621: \$? = $ac_status" >&5
+ echo "$as_me:3624: \$? = $ac_status" >&5
(exit $ac_status); } &&
{ ac_try='test -s conftest.$ac_objext'
- { (eval echo "$as_me:3624: \"$ac_try\"") >&5
+ { (eval echo "$as_me:3627: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
- echo "$as_me:3627: \$? = $ac_status" >&5
+ echo "$as_me:3630: \$? = $ac_status" >&5
(exit $ac_status); }; }; then
ac_cv_sys_file_offset_bits=64; break
else
@@ -3635,7 +3638,7 @@ rm -f conftest.$ac_objext conftest.$ac_ext
break
done
fi
-echo "$as_me:3638: result: $ac_cv_sys_file_offset_bits" >&5
+echo "$as_me:3641: result: $ac_cv_sys_file_offset_bits" >&5
echo "${ECHO_T}$ac_cv_sys_file_offset_bits" >&6
if test "$ac_cv_sys_file_offset_bits" != no; then
@@ -3645,7 +3648,7 @@ EOF
fi
rm -rf conftest*
- echo "$as_me:3648: checking for _LARGE_FILES value needed for large files" >&5
+ echo "$as_me:3651: checking for _LARGE_FILES value needed for large files" >&5
echo $ECHO_N "checking for _LARGE_FILES value needed for large files... $ECHO_C" >&6
if test "${ac_cv_sys_large_files+set}" = set; then
echo $ECHO_N "(cached) $ECHO_C" >&6
@@ -3653,7 +3656,7 @@ else
while :; do
ac_cv_sys_large_files=no
cat >conftest.$ac_ext <<_ACEOF
-#line 3656 "configure"
+#line 3659 "configure"
#include "confdefs.h"
#include <sys/types.h>
/* Check that off_t can represent 2**63 - 1 correctly.
@@ -3673,16 +3676,16 @@ main ()
}
_ACEOF
rm -f conftest.$ac_objext
-if { (eval echo "$as_me:3676: \"$ac_compile\"") >&5
+if { (eval echo "$as_me:3679: \"$ac_compile\"") >&5
(eval $ac_compile) 2>&5
ac_status=$?
- echo "$as_me:3679: \$? = $ac_status" >&5
+ echo "$as_me:3682: \$? = $ac_status" >&5
(exit $ac_status); } &&
{ ac_try='test -s conftest.$ac_objext'
- { (eval echo "$as_me:3682: \"$ac_try\"") >&5
+ { (eval echo "$as_me:3685: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
- echo "$as_me:3685: \$? = $ac_status" >&5
+ echo "$as_me:3688: \$? = $ac_status" >&5
(exit $ac_status); }; }; then
break
else
@@ -3691,7 +3694,7 @@ cat conftest.$ac_ext >&5
fi
rm -f conftest.$ac_objext conftest.$ac_ext
cat >conftest.$ac_ext <<_ACEOF
-#line 3694 "configure"
+#line 3697 "configure"
#include "confdefs.h"
#define _LARGE_FILES 1
#include <sys/types.h>
@@ -3712,16 +3715,16 @@ main ()
}
_ACEOF
rm -f conftest.$ac_objext
-if { (eval echo "$as_me:3715: \"$ac_compile\"") >&5
+if { (eval echo "$as_me:3718: \"$ac_compile\"") >&5
(eval $ac_compile) 2>&5
ac_status=$?
- echo "$as_me:3718: \$? = $ac_status" >&5
+ echo "$as_me:3721: \$? = $ac_status" >&5
(exit $ac_status); } &&
{ ac_try='test -s conftest.$ac_objext'
- { (eval echo "$as_me:3721: \"$ac_try\"") >&5
+ { (eval echo "$as_me:3724: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
- echo "$as_me:3724: \$? = $ac_status" >&5
+ echo "$as_me:3727: \$? = $ac_status" >&5
(exit $ac_status); }; }; then
ac_cv_sys_large_files=1; break
else
@@ -3732,7 +3735,7 @@ rm -f conftest.$ac_objext conftest.$ac_ext
break
done
fi
-echo "$as_me:3735: result: $ac_cv_sys_large_files" >&5
+echo "$as_me:3738: result: $ac_cv_sys_large_files" >&5
echo "${ECHO_T}$ac_cv_sys_large_files" >&6
if test "$ac_cv_sys_large_files" != no; then
@@ -3745,7 +3748,7 @@ rm -rf conftest*
fi
if test "$enable_largefile" != no ; then
- echo "$as_me:3748: checking for _LARGEFILE_SOURCE value needed for large files" >&5
+ echo "$as_me:3751: checking for _LARGEFILE_SOURCE value needed for large files" >&5
echo $ECHO_N "checking for _LARGEFILE_SOURCE value needed for large files... $ECHO_C" >&6
if test "${ac_cv_sys_largefile_source+set}" = set; then
echo $ECHO_N "(cached) $ECHO_C" >&6
@@ -3753,7 +3756,7 @@ else
while :; do
ac_cv_sys_largefile_source=no
cat >conftest.$ac_ext <<_ACEOF
-#line 3756 "configure"
+#line 3759 "configure"
#include "confdefs.h"
#include <stdio.h>
int
@@ -3765,16 +3768,16 @@ return !fseeko;
}
_ACEOF
rm -f conftest.$ac_objext
-if { (eval echo "$as_me:3768: \"$ac_compile\"") >&5
+if { (eval echo "$as_me:3771: \"$ac_compile\"") >&5
(eval $ac_compile) 2>&5
ac_status=$?
- echo "$as_me:3771: \$? = $ac_status" >&5
+ echo "$as_me:3774: \$? = $ac_status" >&5
(exit $ac_status); } &&
{ ac_try='test -s conftest.$ac_objext'
- { (eval echo "$as_me:3774: \"$ac_try\"") >&5
+ { (eval echo "$as_me:3777: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
- echo "$as_me:3777: \$? = $ac_status" >&5
+ echo "$as_me:3780: \$? = $ac_status" >&5
(exit $ac_status); }; }; then
break
else
@@ -3783,7 +3786,7 @@ cat conftest.$ac_ext >&5
fi
rm -f conftest.$ac_objext conftest.$ac_ext
cat >conftest.$ac_ext <<_ACEOF
-#line 3786 "configure"
+#line 3789 "configure"
#include "confdefs.h"
#define _LARGEFILE_SOURCE 1
#include <stdio.h>
@@ -3796,16 +3799,16 @@ return !fseeko;
}
_ACEOF
rm -f conftest.$ac_objext
-if { (eval echo "$as_me:3799: \"$ac_compile\"") >&5
+if { (eval echo "$as_me:3802: \"$ac_compile\"") >&5
(eval $ac_compile) 2>&5
ac_status=$?
- echo "$as_me:3802: \$? = $ac_status" >&5
+ echo "$as_me:3805: \$? = $ac_status" >&5
(exit $ac_status); } &&
{ ac_try='test -s conftest.$ac_objext'
- { (eval echo "$as_me:3805: \"$ac_try\"") >&5
+ { (eval echo "$as_me:3808: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
- echo "$as_me:3808: \$? = $ac_status" >&5
+ echo "$as_me:3811: \$? = $ac_status" >&5
(exit $ac_status); }; }; then
ac_cv_sys_largefile_source=1; break
else
@@ -3816,7 +3819,7 @@ rm -f conftest.$ac_objext conftest.$ac_ext
break
done
fi
-echo "$as_me:3819: result: $ac_cv_sys_largefile_source" >&5
+echo "$as_me:3822: result: $ac_cv_sys_largefile_source" >&5
echo "${ECHO_T}$ac_cv_sys_largefile_source" >&6
if test "$ac_cv_sys_largefile_source" != no; then
@@ -3830,13 +3833,13 @@ rm -rf conftest*
# We used to try defining _XOPEN_SOURCE=500 too, to work around a bug
# in glibc 2.1.3, but that breaks too many other things.
# If you want fseeko and ftello with glibc, upgrade to a fixed glibc.
-echo "$as_me:3833: checking for fseeko" >&5
+echo "$as_me:3836: checking for fseeko" >&5
echo $ECHO_N "checking for fseeko... $ECHO_C" >&6
if test "${ac_cv_func_fseeko+set}" = set; then
echo $ECHO_N "(cached) $ECHO_C" >&6
else
cat >conftest.$ac_ext <<_ACEOF
-#line 3839 "configure"
+#line 3842 "configure"
#include "confdefs.h"
#include <stdio.h>
int
@@ -3848,16 +3851,16 @@ return fseeko && fseeko (stdin, 0, 0);
}
_ACEOF
rm -f conftest.$ac_objext conftest$ac_exeext
-if { (eval echo "$as_me:3851: \"$ac_link\"") >&5
+if { (eval echo "$as_me:3854: \"$ac_link\"") >&5
(eval $ac_link) 2>&5
ac_status=$?
- echo "$as_me:3854: \$? = $ac_status" >&5
+ echo "$as_me:3857: \$? = $ac_status" >&5
(exit $ac_status); } &&
{ ac_try='test -s conftest$ac_exeext'
- { (eval echo "$as_me:3857: \"$ac_try\"") >&5
+ { (eval echo "$as_me:3860: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
- echo "$as_me:3860: \$? = $ac_status" >&5
+ echo "$as_me:3863: \$? = $ac_status" >&5
(exit $ac_status); }; }; then
ac_cv_func_fseeko=yes
else
@@ -3867,7 +3870,7 @@ ac_cv_func_fseeko=no
fi
rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext
fi
-echo "$as_me:3870: result: $ac_cv_func_fseeko" >&5
+echo "$as_me:3873: result: $ac_cv_func_fseeko" >&5
echo "${ECHO_T}$ac_cv_func_fseeko" >&6
if test $ac_cv_func_fseeko = yes; then
@@ -3888,14 +3891,14 @@ fi
test "$ac_cv_sys_largefile_source" != no && CPPFLAGS="$CPPFLAGS -D_LARGEFILE_SOURCE "
test "$ac_cv_sys_file_offset_bits" != no && CPPFLAGS="$CPPFLAGS -D_FILE_OFFSET_BITS=$ac_cv_sys_file_offset_bits "
- echo "$as_me:3891: checking whether to use struct dirent64" >&5
+ echo "$as_me:3894: checking whether to use struct dirent64" >&5
echo $ECHO_N "checking whether to use struct dirent64... $ECHO_C" >&6
if test "${cf_cv_struct_dirent64+set}" = set; then
echo $ECHO_N "(cached) $ECHO_C" >&6
else
cat >conftest.$ac_ext <<_ACEOF
-#line 3898 "configure"
+#line 3901 "configure"
#include "confdefs.h"
#include <sys/types.h>
@@ -3916,16 +3919,16 @@ main ()
}
_ACEOF
rm -f conftest.$ac_objext
-if { (eval echo "$as_me:3919: \"$ac_compile\"") >&5
+if { (eval echo "$as_me:3922: \"$ac_compile\"") >&5
(eval $ac_compile) 2>&5
ac_status=$?
- echo "$as_me:3922: \$? = $ac_status" >&5
+ echo "$as_me:3925: \$? = $ac_status" >&5
(exit $ac_status); } &&
{ ac_try='test -s conftest.$ac_objext'
- { (eval echo "$as_me:3925: \"$ac_try\"") >&5
+ { (eval echo "$as_me:3928: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
- echo "$as_me:3928: \$? = $ac_status" >&5
+ echo "$as_me:3931: \$? = $ac_status" >&5
(exit $ac_status); }; }; then
cf_cv_struct_dirent64=yes
else
@@ -3936,7 +3939,7 @@ fi
rm -f conftest.$ac_objext conftest.$ac_ext
fi
-echo "$as_me:3939: result: $cf_cv_struct_dirent64" >&5
+echo "$as_me:3942: result: $cf_cv_struct_dirent64" >&5
echo "${ECHO_T}$cf_cv_struct_dirent64" >&6
test "$cf_cv_struct_dirent64" = yes && cat >>confdefs.h <<\EOF
#define HAVE_STRUCT_DIRENT64 1
@@ -3946,17 +3949,17 @@ EOF
GCC_VERSION=none
if test "$GCC" = yes ; then
- echo "$as_me:3949: checking version of $CC" >&5
+ echo "$as_me:3952: checking version of $CC" >&5
echo $ECHO_N "checking version of $CC... $ECHO_C" >&6
GCC_VERSION="`${CC} --version 2>/dev/null | sed -e '2,$d' -e 's/^.*(GCC) //' -e 's/^[^0-9.]*//' -e 's/[^0-9.].*//'`"
test -z "$GCC_VERSION" && GCC_VERSION=unknown
- echo "$as_me:3953: result: $GCC_VERSION" >&5
+ echo "$as_me:3956: result: $GCC_VERSION" >&5
echo "${ECHO_T}$GCC_VERSION" >&6
fi
if ( test "$GCC" = yes || test "$GXX" = yes )
then
-echo "$as_me:3959: checking if you want to check for gcc warnings" >&5
+echo "$as_me:3962: checking if you want to check for gcc warnings" >&5
echo $ECHO_N "checking if you want to check for gcc warnings... $ECHO_C" >&6
# Check whether --with-warnings or --without-warnings was given.
@@ -3966,7 +3969,7 @@ if test "${with_warnings+set}" = set; then
else
cf_opt_with_warnings=no
fi;
-echo "$as_me:3969: result: $cf_opt_with_warnings" >&5
+echo "$as_me:3972: result: $cf_opt_with_warnings" >&5
echo "${ECHO_T}$cf_opt_with_warnings" >&6
if test "$cf_opt_with_warnings" != no ; then
@@ -3988,10 +3991,10 @@ cat > conftest.i <<EOF
EOF
if test "$GCC" = yes
then
- { echo "$as_me:3991: checking for $CC __attribute__ directives..." >&5
+ { echo "$as_me:3994: checking for $CC __attribute__ directives..." >&5
echo "$as_me: checking for $CC __attribute__ directives..." >&6;}
cat > conftest.$ac_ext <<EOF
-#line 3994 "${as_me:-configure}"
+#line 3997 "${as_me:-configure}"
#include "confdefs.h"
#include "conftest.h"
#include "conftest.i"
@@ -4040,12 +4043,12 @@ EOF
;;
esac
- if { (eval echo "$as_me:4043: \"$ac_compile\"") >&5
+ if { (eval echo "$as_me:4046: \"$ac_compile\"") >&5
(eval $ac_compile) 2>&5
ac_status=$?
- echo "$as_me:4046: \$? = $ac_status" >&5
+ echo "$as_me:4049: \$? = $ac_status" >&5
(exit $ac_status); }; then
- test -n "$verbose" && echo "$as_me:4048: result: ... $cf_attribute" >&5
+ test -n "$verbose" && echo "$as_me:4051: result: ... $cf_attribute" >&5
echo "${ECHO_T}... $cf_attribute" >&6
cat conftest.h >>confdefs.h
case $cf_attribute in #(vi
@@ -4085,12 +4088,12 @@ INTEL_COMPILER=no
if test "$GCC" = yes ; then
case $host_os in
linux*|gnu*)
- echo "$as_me:4088: checking if this is really Intel C compiler" >&5
+ echo "$as_me:4091: checking if this is really Intel C compiler" >&5
echo $ECHO_N "checking if this is really Intel C compiler... $ECHO_C" >&6
cf_save_CFLAGS="$CFLAGS"
CFLAGS="$CFLAGS -no-gcc"
cat >conftest.$ac_ext <<_ACEOF
-#line 4093 "configure"
+#line 4096 "configure"
#include "confdefs.h"
int
@@ -4107,16 +4110,16 @@ make an error
}
_ACEOF
rm -f conftest.$ac_objext
-if { (eval echo "$as_me:4110: \"$ac_compile\"") >&5
+if { (eval echo "$as_me:4113: \"$ac_compile\"") >&5
(eval $ac_compile) 2>&5
ac_status=$?
- echo "$as_me:4113: \$? = $ac_status" >&5
+ echo "$as_me:4116: \$? = $ac_status" >&5
(exit $ac_status); } &&
{ ac_try='test -s conftest.$ac_objext'
- { (eval echo "$as_me:4116: \"$ac_try\"") >&5
+ { (eval echo "$as_me:4119: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
- echo "$as_me:4119: \$? = $ac_status" >&5
+ echo "$as_me:4122: \$? = $ac_status" >&5
(exit $ac_status); }; }; then
INTEL_COMPILER=yes
cf_save_CFLAGS="$cf_save_CFLAGS -we147 -no-gcc"
@@ -4127,14 +4130,14 @@ cat conftest.$ac_ext >&5
fi
rm -f conftest.$ac_objext conftest.$ac_ext
CFLAGS="$cf_save_CFLAGS"
- echo "$as_me:4130: result: $INTEL_COMPILER" >&5
+ echo "$as_me:4133: result: $INTEL_COMPILER" >&5
echo "${ECHO_T}$INTEL_COMPILER" >&6
;;
esac
fi
cat > conftest.$ac_ext <<EOF
-#line 4137 "${as_me:-configure}"
+#line 4140 "${as_me:-configure}"
int main(int argc, char *argv[]) { return (argv[argc-1] == 0) ; }
EOF
@@ -4151,7 +4154,7 @@ then
# remark #981: operands are evaluated in unspecified order
# warning #279: controlling expression is constant
- { echo "$as_me:4154: checking for $CC warning options..." >&5
+ { echo "$as_me:4157: checking for $CC warning options..." >&5
echo "$as_me: checking for $CC warning options..." >&6;}
cf_save_CFLAGS="$CFLAGS"
EXTRA_CFLAGS="-Wall"
@@ -4167,12 +4170,12 @@ echo "$as_me: checking for $CC warning options..." >&6;}
wd981
do
CFLAGS="$cf_save_CFLAGS $EXTRA_CFLAGS -$cf_opt"
- if { (eval echo "$as_me:4170: \"$ac_compile\"") >&5
+ if { (eval echo "$as_me:4173: \"$ac_compile\"") >&5
(eval $ac_compile) 2>&5
ac_status=$?
- echo "$as_me:4173: \$? = $ac_status" >&5
+ echo "$as_me:4176: \$? = $ac_status" >&5
(exit $ac_status); }; then
- test -n "$verbose" && echo "$as_me:4175: result: ... -$cf_opt" >&5
+ test -n "$verbose" && echo "$as_me:4178: result: ... -$cf_opt" >&5
echo "${ECHO_T}... -$cf_opt" >&6
EXTRA_CFLAGS="$EXTRA_CFLAGS -$cf_opt"
fi
@@ -4181,7 +4184,7 @@ echo "${ECHO_T}... -$cf_opt" >&6
elif test "$GCC" = yes
then
- { echo "$as_me:4184: checking for $CC warning options..." >&5
+ { echo "$as_me:4187: checking for $CC warning options..." >&5
echo "$as_me: checking for $CC warning options..." >&6;}
cf_save_CFLAGS="$CFLAGS"
EXTRA_CFLAGS=
@@ -4201,12 +4204,12 @@ echo "$as_me: checking for $CC warning options..." >&6;}
Wundef $cf_warn_CONST
do
CFLAGS="$cf_save_CFLAGS $EXTRA_CFLAGS -$cf_opt"
- if { (eval echo "$as_me:4204: \"$ac_compile\"") >&5
+ if { (eval echo "$as_me:4207: \"$ac_compile\"") >&5
(eval $ac_compile) 2>&5
ac_status=$?
- echo "$as_me:4207: \$? = $ac_status" >&5
+ echo "$as_me:4210: \$? = $ac_status" >&5
(exit $ac_status); }; then
- test -n "$verbose" && echo "$as_me:4209: result: ... -$cf_opt" >&5
+ test -n "$verbose" && echo "$as_me:4212: result: ... -$cf_opt" >&5
echo "${ECHO_T}... -$cf_opt" >&6
case $cf_opt in #(vi
Wcast-qual) #(vi
@@ -4217,7 +4220,7 @@ echo "${ECHO_T}... -$cf_opt" >&6
[34].*)
test -n "$verbose" && echo " feature is broken in gcc $GCC_VERSION" 1>&6
-echo "${as_me:-configure}:4220: testing feature is broken in gcc $GCC_VERSION ..." 1>&5
+echo "${as_me:-configure}:4223: testing feature is broken in gcc $GCC_VERSION ..." 1>&5
continue;;
esac
@@ -4242,7 +4245,7 @@ else
fi;
if test -f $srcdir/VERSION ; then
- echo "$as_me:4245: checking for package version" >&5
+ echo "$as_me:4248: checking for package version" >&5
echo $ECHO_N "checking for package version... $ECHO_C" >&6
# if there are not enough fields, cut returns the last one...
@@ -4254,39 +4257,39 @@ echo $ECHO_N "checking for package version... $ECHO_C" >&6
VERSION="$cf_field1"
VERSION_MAJOR=`echo "$cf_field2" | sed -e 's/\..*//'`
- test -z "$VERSION_MAJOR" && { { echo "$as_me:4257: error: missing major-version" >&5
+ test -z "$VERSION_MAJOR" && { { echo "$as_me:4260: error: missing major-version" >&5
echo "$as_me: error: missing major-version" >&2;}
{ (exit 1); exit 1; }; }
VERSION_MINOR=`echo "$cf_field2" | sed -e 's/^[^.]*\.//' -e 's/-.*//'`
- test -z "$VERSION_MINOR" && { { echo "$as_me:4262: error: missing minor-version" >&5
+ test -z "$VERSION_MINOR" && { { echo "$as_me:4265: error: missing minor-version" >&5
echo "$as_me: error: missing minor-version" >&2;}
{ (exit 1); exit 1; }; }
- echo "$as_me:4266: result: ${VERSION_MAJOR}.${VERSION_MINOR}" >&5
+ echo "$as_me:4269: result: ${VERSION_MAJOR}.${VERSION_MINOR}" >&5
echo "${ECHO_T}${VERSION_MAJOR}.${VERSION_MINOR}" >&6
- echo "$as_me:4269: checking for package patch date" >&5
+ echo "$as_me:4272: checking for package patch date" >&5
echo $ECHO_N "checking for package patch date... $ECHO_C" >&6
VERSION_PATCH=`echo "$cf_field3" | sed -e 's/^[^-]*-//'`
case .$VERSION_PATCH in
.)
- { { echo "$as_me:4274: error: missing patch-date $VERSION_PATCH" >&5
+ { { echo "$as_me:4277: error: missing patch-date $VERSION_PATCH" >&5
echo "$as_me: error: missing patch-date $VERSION_PATCH" >&2;}
{ (exit 1); exit 1; }; }
;;
.[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9])
;;
*)
- { { echo "$as_me:4281: error: illegal patch-date $VERSION_PATCH" >&5
+ { { echo "$as_me:4284: error: illegal patch-date $VERSION_PATCH" >&5
echo "$as_me: error: illegal patch-date $VERSION_PATCH" >&2;}
{ (exit 1); exit 1; }; }
;;
esac
- echo "$as_me:4286: result: $VERSION_PATCH" >&5
+ echo "$as_me:4289: result: $VERSION_PATCH" >&5
echo "${ECHO_T}$VERSION_PATCH" >&6
else
- { { echo "$as_me:4289: error: did not find $srcdir/VERSION" >&5
+ { { echo "$as_me:4292: error: did not find $srcdir/VERSION" >&5
echo "$as_me: error: did not find $srcdir/VERSION" >&2;}
{ (exit 1); exit 1; }; }
fi
@@ -4294,19 +4297,19 @@ fi
# show the actual data that we have for versions:
test -n "$verbose" && echo " VERSION $VERSION" 1>&6
-echo "${as_me:-configure}:4297: testing VERSION $VERSION ..." 1>&5
+echo "${as_me:-configure}:4300: testing VERSION $VERSION ..." 1>&5
test -n "$verbose" && echo " VERSION_MAJOR $VERSION_MAJOR" 1>&6
-echo "${as_me:-configure}:4301: testing VERSION_MAJOR $VERSION_MAJOR ..." 1>&5
+echo "${as_me:-configure}:4304: testing VERSION_MAJOR $VERSION_MAJOR ..." 1>&5
test -n "$verbose" && echo " VERSION_MINOR $VERSION_MINOR" 1>&6
-echo "${as_me:-configure}:4305: testing VERSION_MINOR $VERSION_MINOR ..." 1>&5
+echo "${as_me:-configure}:4308: testing VERSION_MINOR $VERSION_MINOR ..." 1>&5
test -n "$verbose" && echo " VERSION_PATCH $VERSION_PATCH" 1>&6
-echo "${as_me:-configure}:4309: testing VERSION_PATCH $VERSION_PATCH ..." 1>&5
+echo "${as_me:-configure}:4312: testing VERSION_PATCH $VERSION_PATCH ..." 1>&5
cf_PACKAGE=dialog
PACKAGE=$PACKAGE
@@ -4333,13 +4336,13 @@ else
fi;
EXTRAOBJS=""
-echo "$as_me:4336: checking for ANSI C header files" >&5
+echo "$as_me:4339: checking for ANSI C header files" >&5
echo $ECHO_N "checking for ANSI C header files... $ECHO_C" >&6
if test "${ac_cv_header_stdc+set}" = set; then
echo $ECHO_N "(cached) $ECHO_C" >&6
else
cat >conftest.$ac_ext <<_ACEOF
-#line 4342 "configure"
+#line 4345 "configure"
#include "confdefs.h"
#include <stdlib.h>
#include <stdarg.h>
@@ -4347,13 +4350,13 @@ else
#include <float.h>
_ACEOF
-if { (eval echo "$as_me:4350: \"$ac_cpp conftest.$ac_ext\"") >&5
+if { (eval echo "$as_me:4353: \"$ac_cpp conftest.$ac_ext\"") >&5
(eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
ac_status=$?
egrep -v '^ *\+' conftest.er1 >conftest.err
rm -f conftest.er1
cat conftest.err >&5
- echo "$as_me:4356: \$? = $ac_status" >&5
+ echo "$as_me:4359: \$? = $ac_status" >&5
(exit $ac_status); } >/dev/null; then
if test -s conftest.err; then
ac_cpp_err=$ac_c_preproc_warn_flag
@@ -4375,7 +4378,7 @@ rm -f conftest.err conftest.$ac_ext
if test $ac_cv_header_stdc = yes; then
# SunOS 4.x string.h does not declare mem*, contrary to ANSI.
cat >conftest.$ac_ext <<_ACEOF
-#line 4378 "configure"
+#line 4381 "configure"
#include "confdefs.h"
#include <string.h>
@@ -4393,7 +4396,7 @@ fi
if test $ac_cv_header_stdc = yes; then
# ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI.
cat >conftest.$ac_ext <<_ACEOF
-#line 4396 "configure"
+#line 4399 "configure"
#include "confdefs.h"
#include <stdlib.h>
@@ -4414,7 +4417,7 @@ if test $ac_cv_header_stdc = yes; then
:
else
cat >conftest.$ac_ext <<_ACEOF
-#line 4417 "configure"
+#line 4420 "configure"
#include "confdefs.h"
#include <ctype.h>
#if ((' ' & 0x0FF) == 0x020)
@@ -4440,15 +4443,15 @@ main ()
}
_ACEOF
rm -f conftest$ac_exeext
-if { (eval echo "$as_me:4443: \"$ac_link\"") >&5
+if { (eval echo "$as_me:4446: \"$ac_link\"") >&5
(eval $ac_link) 2>&5
ac_status=$?
- echo "$as_me:4446: \$? = $ac_status" >&5
+ echo "$as_me:4449: \$? = $ac_status" >&5
(exit $ac_status); } && { ac_try='./conftest$ac_exeext'
- { (eval echo "$as_me:4448: \"$ac_try\"") >&5
+ { (eval echo "$as_me:4451: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
- echo "$as_me:4451: \$? = $ac_status" >&5
+ echo "$as_me:4454: \$? = $ac_status" >&5
(exit $ac_status); }; }; then
:
else
@@ -4461,7 +4464,7 @@ rm -f core core.* *.core conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
fi
fi
fi
-echo "$as_me:4464: result: $ac_cv_header_stdc" >&5
+echo "$as_me:4467: result: $ac_cv_header_stdc" >&5
echo "${ECHO_T}$ac_cv_header_stdc" >&6
if test $ac_cv_header_stdc = yes; then
@@ -4471,7 +4474,7 @@ EOF
fi
-echo "$as_me:4474: checking for inline" >&5
+echo "$as_me:4477: checking for inline" >&5
echo $ECHO_N "checking for inline... $ECHO_C" >&6
if test "${ac_cv_c_inline+set}" = set; then
echo $ECHO_N "(cached) $ECHO_C" >&6
@@ -4479,7 +4482,7 @@ else
ac_cv_c_inline=no
for ac_kw in inline __inline__ __inline; do
cat >conftest.$ac_ext <<_ACEOF
-#line 4482 "configure"
+#line 4485 "configure"
#include "confdefs.h"
#ifndef __cplusplus
static $ac_kw int static_foo () {return 0; }
@@ -4488,16 +4491,16 @@ $ac_kw int foo () {return 0; }
_ACEOF
rm -f conftest.$ac_objext
-if { (eval echo "$as_me:4491: \"$ac_compile\"") >&5
+if { (eval echo "$as_me:4494: \"$ac_compile\"") >&5
(eval $ac_compile) 2>&5
ac_status=$?
- echo "$as_me:4494: \$? = $ac_status" >&5
+ echo "$as_me:4497: \$? = $ac_status" >&5
(exit $ac_status); } &&
{ ac_try='test -s conftest.$ac_objext'
- { (eval echo "$as_me:4497: \"$ac_try\"") >&5
+ { (eval echo "$as_me:4500: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
- echo "$as_me:4500: \$? = $ac_status" >&5
+ echo "$as_me:4503: \$? = $ac_status" >&5
(exit $ac_status); }; }; then
ac_cv_c_inline=$ac_kw; break
else
@@ -4508,7 +4511,7 @@ rm -f conftest.$ac_objext conftest.$ac_ext
done
fi
-echo "$as_me:4511: result: $ac_cv_c_inline" >&5
+echo "$as_me:4514: result: $ac_cv_c_inline" >&5
echo "${ECHO_T}$ac_cv_c_inline" >&6
case $ac_cv_c_inline in
inline | yes) ;;
@@ -4529,28 +4532,28 @@ for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \
inttypes.h stdint.h unistd.h
do
as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh`
-echo "$as_me:4532: checking for $ac_header" >&5
+echo "$as_me:4535: checking for $ac_header" >&5
echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6
if eval "test \"\${$as_ac_Header+set}\" = set"; then
echo $ECHO_N "(cached) $ECHO_C" >&6
else
cat >conftest.$ac_ext <<_ACEOF
-#line 4538 "configure"
+#line 4541 "configure"
#include "confdefs.h"
$ac_includes_default
#include <$ac_header>
_ACEOF
rm -f conftest.$ac_objext
-if { (eval echo "$as_me:4544: \"$ac_compile\"") >&5
+if { (eval echo "$as_me:4547: \"$ac_compile\"") >&5
(eval $ac_compile) 2>&5
ac_status=$?
- echo "$as_me:4547: \$? = $ac_status" >&5
+ echo "$as_me:4550: \$? = $ac_status" >&5
(exit $ac_status); } &&
{ ac_try='test -s conftest.$ac_objext'
- { (eval echo "$as_me:4550: \"$ac_try\"") >&5
+ { (eval echo "$as_me:4553: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
- echo "$as_me:4553: \$? = $ac_status" >&5
+ echo "$as_me:4556: \$? = $ac_status" >&5
(exit $ac_status); }; }; then
eval "$as_ac_Header=yes"
else
@@ -4560,7 +4563,7 @@ eval "$as_ac_Header=no"
fi
rm -f conftest.$ac_objext conftest.$ac_ext
fi
-echo "$as_me:4563: result: `eval echo '${'$as_ac_Header'}'`" >&5
+echo "$as_me:4566: result: `eval echo '${'$as_ac_Header'}'`" >&5
echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6
if test `eval echo '${'$as_ac_Header'}'` = yes; then
cat >>confdefs.h <<EOF
@@ -4570,13 +4573,13 @@ EOF
fi
done
-echo "$as_me:4573: checking for off_t" >&5
+echo "$as_me:4576: checking for off_t" >&5
echo $ECHO_N "checking for off_t... $ECHO_C" >&6
if test "${ac_cv_type_off_t+set}" = set; then
echo $ECHO_N "(cached) $ECHO_C" >&6
else
cat >conftest.$ac_ext <<_ACEOF
-#line 4579 "configure"
+#line 4582 "configure"
#include "confdefs.h"
$ac_includes_default
int
@@ -4591,16 +4594,16 @@ if (sizeof (off_t))
}
_ACEOF
rm -f conftest.$ac_objext
-if { (eval echo "$as_me:4594: \"$ac_compile\"") >&5
+if { (eval echo "$as_me:4597: \"$ac_compile\"") >&5
(eval $ac_compile) 2>&5
ac_status=$?
- echo "$as_me:4597: \$? = $ac_status" >&5
+ echo "$as_me:4600: \$? = $ac_status" >&5
(exit $ac_status); } &&
{ ac_try='test -s conftest.$ac_objext'
- { (eval echo "$as_me:4600: \"$ac_try\"") >&5
+ { (eval echo "$as_me:4603: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
- echo "$as_me:4603: \$? = $ac_status" >&5
+ echo "$as_me:4606: \$? = $ac_status" >&5
(exit $ac_status); }; }; then
ac_cv_type_off_t=yes
else
@@ -4610,7 +4613,7 @@ ac_cv_type_off_t=no
fi
rm -f conftest.$ac_objext conftest.$ac_ext
fi
-echo "$as_me:4613: result: $ac_cv_type_off_t" >&5
+echo "$as_me:4616: result: $ac_cv_type_off_t" >&5
echo "${ECHO_T}$ac_cv_type_off_t" >&6
if test $ac_cv_type_off_t = yes; then
:
@@ -4622,13 +4625,13 @@ EOF
fi
-echo "$as_me:4625: checking for size_t" >&5
+echo "$as_me:4628: checking for size_t" >&5
echo $ECHO_N "checking for size_t... $ECHO_C" >&6
if test "${ac_cv_type_size_t+set}" = set; then
echo $ECHO_N "(cached) $ECHO_C" >&6
else
cat >conftest.$ac_ext <<_ACEOF
-#line 4631 "configure"
+#line 4634 "configure"
#include "confdefs.h"
$ac_includes_default
int
@@ -4643,16 +4646,16 @@ if (sizeof (size_t))
}
_ACEOF
rm -f conftest.$ac_objext
-if { (eval echo "$as_me:4646: \"$ac_compile\"") >&5
+if { (eval echo "$as_me:4649: \"$ac_compile\"") >&5
(eval $ac_compile) 2>&5
ac_status=$?
- echo "$as_me:4649: \$? = $ac_status" >&5
+ echo "$as_me:4652: \$? = $ac_status" >&5
(exit $ac_status); } &&
{ ac_try='test -s conftest.$ac_objext'
- { (eval echo "$as_me:4652: \"$ac_try\"") >&5
+ { (eval echo "$as_me:4655: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
- echo "$as_me:4655: \$? = $ac_status" >&5
+ echo "$as_me:4658: \$? = $ac_status" >&5
(exit $ac_status); }; }; then
ac_cv_type_size_t=yes
else
@@ -4662,7 +4665,7 @@ ac_cv_type_size_t=no
fi
rm -f conftest.$ac_objext conftest.$ac_ext
fi
-echo "$as_me:4665: result: $ac_cv_type_size_t" >&5
+echo "$as_me:4668: result: $ac_cv_type_size_t" >&5
echo "${ECHO_T}$ac_cv_type_size_t" >&6
if test $ac_cv_type_size_t = yes; then
:
@@ -4676,13 +4679,13 @@ fi
# The Ultrix 4.2 mips builtin alloca declared by alloca.h only works
# for constant arguments. Useless!
-echo "$as_me:4679: checking for working alloca.h" >&5
+echo "$as_me:4682: checking for working alloca.h" >&5
echo $ECHO_N "checking for working alloca.h... $ECHO_C" >&6
if test "${ac_cv_working_alloca_h+set}" = set; then
echo $ECHO_N "(cached) $ECHO_C" >&6
else
cat >conftest.$ac_ext <<_ACEOF
-#line 4685 "configure"
+#line 4688 "configure"
#include "confdefs.h"
#include <alloca.h>
int
@@ -4694,16 +4697,16 @@ char *p = (char *) alloca (2 * sizeof (int));
}
_ACEOF
rm -f conftest.$ac_objext conftest$ac_exeext
-if { (eval echo "$as_me:4697: \"$ac_link\"") >&5
+if { (eval echo "$as_me:4700: \"$ac_link\"") >&5
(eval $ac_link) 2>&5
ac_status=$?
- echo "$as_me:4700: \$? = $ac_status" >&5
+ echo "$as_me:4703: \$? = $ac_status" >&5
(exit $ac_status); } &&
{ ac_try='test -s conftest$ac_exeext'
- { (eval echo "$as_me:4703: \"$ac_try\"") >&5
+ { (eval echo "$as_me:4706: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
- echo "$as_me:4706: \$? = $ac_status" >&5
+ echo "$as_me:4709: \$? = $ac_status" >&5
(exit $ac_status); }; }; then
ac_cv_working_alloca_h=yes
else
@@ -4713,7 +4716,7 @@ ac_cv_working_alloca_h=no
fi
rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext
fi
-echo "$as_me:4716: result: $ac_cv_working_alloca_h" >&5
+echo "$as_me:4719: result: $ac_cv_working_alloca_h" >&5
echo "${ECHO_T}$ac_cv_working_alloca_h" >&6
if test $ac_cv_working_alloca_h = yes; then
@@ -4723,13 +4726,13 @@ EOF
fi
-echo "$as_me:4726: checking for alloca" >&5
+echo "$as_me:4729: checking for alloca" >&5
echo $ECHO_N "checking for alloca... $ECHO_C" >&6
if test "${ac_cv_func_alloca_works+set}" = set; then
echo $ECHO_N "(cached) $ECHO_C" >&6
else
cat >conftest.$ac_ext <<_ACEOF
-#line 4732 "configure"
+#line 4735 "configure"
#include "confdefs.h"
#ifdef __GNUC__
# define alloca __builtin_alloca
@@ -4761,16 +4764,16 @@ char *p = (char *) alloca (1);
}
_ACEOF
rm -f conftest.$ac_objext conftest$ac_exeext
-if { (eval echo "$as_me:4764: \"$ac_link\"") >&5
+if { (eval echo "$as_me:4767: \"$ac_link\"") >&5
(eval $ac_link) 2>&5
ac_status=$?
- echo "$as_me:4767: \$? = $ac_status" >&5
+ echo "$as_me:4770: \$? = $ac_status" >&5
(exit $ac_status); } &&
{ ac_try='test -s conftest$ac_exeext'
- { (eval echo "$as_me:4770: \"$ac_try\"") >&5
+ { (eval echo "$as_me:4773: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
- echo "$as_me:4773: \$? = $ac_status" >&5
+ echo "$as_me:4776: \$? = $ac_status" >&5
(exit $ac_status); }; }; then
ac_cv_func_alloca_works=yes
else
@@ -4780,7 +4783,7 @@ ac_cv_func_alloca_works=no
fi
rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext
fi
-echo "$as_me:4783: result: $ac_cv_func_alloca_works" >&5
+echo "$as_me:4786: result: $ac_cv_func_alloca_works" >&5
echo "${ECHO_T}$ac_cv_func_alloca_works" >&6
if test $ac_cv_func_alloca_works = yes; then
@@ -4801,13 +4804,13 @@ cat >>confdefs.h <<\EOF
#define C_ALLOCA 1
EOF
-echo "$as_me:4804: checking whether \`alloca.c' needs Cray hooks" >&5
+echo "$as_me:4807: checking whether \`alloca.c' needs Cray hooks" >&5
echo $ECHO_N "checking whether \`alloca.c' needs Cray hooks... $ECHO_C" >&6
if test "${ac_cv_os_cray+set}" = set; then
echo $ECHO_N "(cached) $ECHO_C" >&6
else
cat >conftest.$ac_ext <<_ACEOF
-#line 4810 "configure"
+#line 4813 "configure"
#include "confdefs.h"
#if defined(CRAY) && ! defined(CRAY2)
webecray
@@ -4825,18 +4828,18 @@ fi
rm -rf conftest*
fi
-echo "$as_me:4828: result: $ac_cv_os_cray" >&5
+echo "$as_me:4831: result: $ac_cv_os_cray" >&5
echo "${ECHO_T}$ac_cv_os_cray" >&6
if test $ac_cv_os_cray = yes; then
for ac_func in _getb67 GETB67 getb67; do
as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh`
-echo "$as_me:4833: checking for $ac_func" >&5
+echo "$as_me:4836: checking for $ac_func" >&5
echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6
if eval "test \"\${$as_ac_var+set}\" = set"; then
echo $ECHO_N "(cached) $ECHO_C" >&6
else
cat >conftest.$ac_ext <<_ACEOF
-#line 4839 "configure"
+#line 4842 "configure"
#include "confdefs.h"
/* System header to define __stub macros and hopefully few prototypes,
which can conflict with char $ac_func (); below. */
@@ -4867,16 +4870,16 @@ f = $ac_func;
}
_ACEOF
rm -f conftest.$ac_objext conftest$ac_exeext
-if { (eval echo "$as_me:4870: \"$ac_link\"") >&5
+if { (eval echo "$as_me:4873: \"$ac_link\"") >&5
(eval $ac_link) 2>&5
ac_status=$?
- echo "$as_me:4873: \$? = $ac_status" >&5
+ echo "$as_me:4876: \$? = $ac_status" >&5
(exit $ac_status); } &&
{ ac_try='test -s conftest$ac_exeext'
- { (eval echo "$as_me:4876: \"$ac_try\"") >&5
+ { (eval echo "$as_me:4879: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
- echo "$as_me:4879: \$? = $ac_status" >&5
+ echo "$as_me:4882: \$? = $ac_status" >&5
(exit $ac_status); }; }; then
eval "$as_ac_var=yes"
else
@@ -4886,7 +4889,7 @@ eval "$as_ac_var=no"
fi
rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext
fi
-echo "$as_me:4889: result: `eval echo '${'$as_ac_var'}'`" >&5
+echo "$as_me:4892: result: `eval echo '${'$as_ac_var'}'`" >&5
echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6
if test `eval echo '${'$as_ac_var'}'` = yes; then
@@ -4900,7 +4903,7 @@ fi
done
fi
-echo "$as_me:4903: checking stack direction for C alloca" >&5
+echo "$as_me:4906: checking stack direction for C alloca" >&5
echo $ECHO_N "checking stack direction for C alloca... $ECHO_C" >&6
if test "${ac_cv_c_stack_direction+set}" = set; then
echo $ECHO_N "(cached) $ECHO_C" >&6
@@ -4909,7 +4912,7 @@ else
ac_cv_c_stack_direction=0
else
cat >conftest.$ac_ext <<_ACEOF
-#line 4912 "configure"
+#line 4915 "configure"
#include "confdefs.h"
int
find_stack_direction ()
@@ -4932,15 +4935,15 @@ main ()
}
_ACEOF
rm -f conftest$ac_exeext
-if { (eval echo "$as_me:4935: \"$ac_link\"") >&5
+if { (eval echo "$as_me:4938: \"$ac_link\"") >&5
(eval $ac_link) 2>&5
ac_status=$?
- echo "$as_me:4938: \$? = $ac_status" >&5
+ echo "$as_me:4941: \$? = $ac_status" >&5
(exit $ac_status); } && { ac_try='./conftest$ac_exeext'
- { (eval echo "$as_me:4940: \"$ac_try\"") >&5
+ { (eval echo "$as_me:4943: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
- echo "$as_me:4943: \$? = $ac_status" >&5
+ echo "$as_me:4946: \$? = $ac_status" >&5
(exit $ac_status); }; }; then
ac_cv_c_stack_direction=1
else
@@ -4952,7 +4955,7 @@ fi
rm -f core core.* *.core conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
fi
fi
-echo "$as_me:4955: result: $ac_cv_c_stack_direction" >&5
+echo "$as_me:4958: result: $ac_cv_c_stack_direction" >&5
echo "${ECHO_T}$ac_cv_c_stack_direction" >&6
cat >>confdefs.h <<EOF
@@ -4964,23 +4967,23 @@ fi
for ac_header in stdlib.h unistd.h
do
as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh`
-echo "$as_me:4967: checking for $ac_header" >&5
+echo "$as_me:4970: checking for $ac_header" >&5
echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6
if eval "test \"\${$as_ac_Header+set}\" = set"; then
echo $ECHO_N "(cached) $ECHO_C" >&6
else
cat >conftest.$ac_ext <<_ACEOF
-#line 4973 "configure"
+#line 4976 "configure"
#include "confdefs.h"
#include <$ac_header>
_ACEOF
-if { (eval echo "$as_me:4977: \"$ac_cpp conftest.$ac_ext\"") >&5
+if { (eval echo "$as_me:4980: \"$ac_cpp conftest.$ac_ext\"") >&5
(eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
ac_status=$?
egrep -v '^ *\+' conftest.er1 >conftest.err
rm -f conftest.er1
cat conftest.err >&5
- echo "$as_me:4983: \$? = $ac_status" >&5
+ echo "$as_me:4986: \$? = $ac_status" >&5
(exit $ac_status); } >/dev/null; then
if test -s conftest.err; then
ac_cpp_err=$ac_c_preproc_warn_flag
@@ -4999,7 +5002,7 @@ else
fi
rm -f conftest.err conftest.$ac_ext
fi
-echo "$as_me:5002: result: `eval echo '${'$as_ac_Header'}'`" >&5
+echo "$as_me:5005: result: `eval echo '${'$as_ac_Header'}'`" >&5
echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6
if test `eval echo '${'$as_ac_Header'}'` = yes; then
cat >>confdefs.h <<EOF
@@ -5012,13 +5015,13 @@ done
for ac_func in getpagesize
do
as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh`
-echo "$as_me:5015: checking for $ac_func" >&5
+echo "$as_me:5018: checking for $ac_func" >&5
echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6
if eval "test \"\${$as_ac_var+set}\" = set"; then
echo $ECHO_N "(cached) $ECHO_C" >&6
else
cat >conftest.$ac_ext <<_ACEOF
-#line 5021 "configure"
+#line 5024 "configure"
#include "confdefs.h"
/* System header to define __stub macros and hopefully few prototypes,
which can conflict with char $ac_func (); below. */
@@ -5049,16 +5052,16 @@ f = $ac_func;
}
_ACEOF
rm -f conftest.$ac_objext conftest$ac_exeext
-if { (eval echo "$as_me:5052: \"$ac_link\"") >&5
+if { (eval echo "$as_me:5055: \"$ac_link\"") >&5
(eval $ac_link) 2>&5
ac_status=$?
- echo "$as_me:5055: \$? = $ac_status" >&5
+ echo "$as_me:5058: \$? = $ac_status" >&5
(exit $ac_status); } &&
{ ac_try='test -s conftest$ac_exeext'
- { (eval echo "$as_me:5058: \"$ac_try\"") >&5
+ { (eval echo "$as_me:5061: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
- echo "$as_me:5061: \$? = $ac_status" >&5
+ echo "$as_me:5064: \$? = $ac_status" >&5
(exit $ac_status); }; }; then
eval "$as_ac_var=yes"
else
@@ -5068,7 +5071,7 @@ eval "$as_ac_var=no"
fi
rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext
fi
-echo "$as_me:5071: result: `eval echo '${'$as_ac_var'}'`" >&5
+echo "$as_me:5074: result: `eval echo '${'$as_ac_var'}'`" >&5
echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6
if test `eval echo '${'$as_ac_var'}'` = yes; then
cat >>confdefs.h <<EOF
@@ -5078,7 +5081,7 @@ EOF
fi
done
-echo "$as_me:5081: checking for working mmap" >&5
+echo "$as_me:5084: checking for working mmap" >&5
echo $ECHO_N "checking for working mmap... $ECHO_C" >&6
if test "${ac_cv_func_mmap_fixed_mapped+set}" = set; then
echo $ECHO_N "(cached) $ECHO_C" >&6
@@ -5087,7 +5090,7 @@ else
ac_cv_func_mmap_fixed_mapped=no
else
cat >conftest.$ac_ext <<_ACEOF
-#line 5090 "configure"
+#line 5093 "configure"
#include "confdefs.h"
$ac_includes_default
/* Thanks to Mike Haertel and Jim Avera for this test.
@@ -5214,15 +5217,15 @@ main ()
}
_ACEOF
rm -f conftest$ac_exeext
-if { (eval echo "$as_me:5217: \"$ac_link\"") >&5
+if { (eval echo "$as_me:5220: \"$ac_link\"") >&5
(eval $ac_link) 2>&5
ac_status=$?
- echo "$as_me:5220: \$? = $ac_status" >&5
+ echo "$as_me:5223: \$? = $ac_status" >&5
(exit $ac_status); } && { ac_try='./conftest$ac_exeext'
- { (eval echo "$as_me:5222: \"$ac_try\"") >&5
+ { (eval echo "$as_me:5225: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
- echo "$as_me:5225: \$? = $ac_status" >&5
+ echo "$as_me:5228: \$? = $ac_status" >&5
(exit $ac_status); }; }; then
ac_cv_func_mmap_fixed_mapped=yes
else
@@ -5234,7 +5237,7 @@ fi
rm -f core core.* *.core conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
fi
fi
-echo "$as_me:5237: result: $ac_cv_func_mmap_fixed_mapped" >&5
+echo "$as_me:5240: result: $ac_cv_func_mmap_fixed_mapped" >&5
echo "${ECHO_T}$ac_cv_func_mmap_fixed_mapped" >&6
if test $ac_cv_func_mmap_fixed_mapped = yes; then
@@ -5245,13 +5248,13 @@ EOF
fi
rm -f conftest.mmap
- echo "$as_me:5248: checking whether we are using the GNU C Library 2.1 or newer" >&5
+ echo "$as_me:5251: checking whether we are using the GNU C Library 2.1 or newer" >&5
echo $ECHO_N "checking whether we are using the GNU C Library 2.1 or newer... $ECHO_C" >&6
if test "${ac_cv_gnu_library_2_1+set}" = set; then
echo $ECHO_N "(cached) $ECHO_C" >&6
else
cat >conftest.$ac_ext <<_ACEOF
-#line 5254 "configure"
+#line 5257 "configure"
#include "confdefs.h"
#include <features.h>
@@ -5271,7 +5274,7 @@ fi
rm -rf conftest*
fi
-echo "$as_me:5274: result: $ac_cv_gnu_library_2_1" >&5
+echo "$as_me:5277: result: $ac_cv_gnu_library_2_1" >&5
echo "${ECHO_T}$ac_cv_gnu_library_2_1" >&6
GLIBC21="$ac_cv_gnu_library_2_1"
@@ -5284,7 +5287,7 @@ test -z "$ALL_LINGUAS" && ALL_LINGUAS=`test -d $srcdir/po && cd $srcdir/po && ec
: ${CONFIG_H:=config.h}
if test -z "$PACKAGE" ; then
- { { echo "$as_me:5287: error: CF_BUNDLED_INTL used without setting PACKAGE variable" >&5
+ { { echo "$as_me:5290: error: CF_BUNDLED_INTL used without setting PACKAGE variable" >&5
echo "$as_me: error: CF_BUNDLED_INTL used without setting PACKAGE variable" >&2;}
{ (exit 1); exit 1; }; }
fi
@@ -5301,23 +5304,23 @@ for ac_header in argz.h limits.h locale.h nl_types.h malloc.h stddef.h \
stdlib.h string.h unistd.h sys/param.h
do
as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh`
-echo "$as_me:5304: checking for $ac_header" >&5
+echo "$as_me:5307: checking for $ac_header" >&5
echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6
if eval "test \"\${$as_ac_Header+set}\" = set"; then
echo $ECHO_N "(cached) $ECHO_C" >&6
else
cat >conftest.$ac_ext <<_ACEOF
-#line 5310 "configure"
+#line 5313 "configure"
#include "confdefs.h"
#include <$ac_header>
_ACEOF
-if { (eval echo "$as_me:5314: \"$ac_cpp conftest.$ac_ext\"") >&5
+if { (eval echo "$as_me:5317: \"$ac_cpp conftest.$ac_ext\"") >&5
(eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
ac_status=$?
egrep -v '^ *\+' conftest.er1 >conftest.err
rm -f conftest.er1
cat conftest.err >&5
- echo "$as_me:5320: \$? = $ac_status" >&5
+ echo "$as_me:5323: \$? = $ac_status" >&5
(exit $ac_status); } >/dev/null; then
if test -s conftest.err; then
ac_cpp_err=$ac_c_preproc_warn_flag
@@ -5336,7 +5339,7 @@ else
fi
rm -f conftest.err conftest.$ac_ext
fi
-echo "$as_me:5339: result: `eval echo '${'$as_ac_Header'}'`" >&5
+echo "$as_me:5342: result: `eval echo '${'$as_ac_Header'}'`" >&5
echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6
if test `eval echo '${'$as_ac_Header'}'` = yes; then
cat >>confdefs.h <<EOF
@@ -5351,13 +5354,13 @@ getgid getuid mempcpy munmap putenv setenv setlocale stpcpy strchr strcasecmp \
strdup strtoul tsearch __argz_count __argz_stringify __argz_next
do
as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh`
-echo "$as_me:5354: checking for $ac_func" >&5
+echo "$as_me:5357: checking for $ac_func" >&5
echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6
if eval "test \"\${$as_ac_var+set}\" = set"; then
echo $ECHO_N "(cached) $ECHO_C" >&6
else
cat >conftest.$ac_ext <<_ACEOF
-#line 5360 "configure"
+#line 5363 "configure"
#include "confdefs.h"
/* System header to define __stub macros and hopefully few prototypes,
which can conflict with char $ac_func (); below. */
@@ -5388,16 +5391,16 @@ f = $ac_func;
}
_ACEOF
rm -f conftest.$ac_objext conftest$ac_exeext
-if { (eval echo "$as_me:5391: \"$ac_link\"") >&5
+if { (eval echo "$as_me:5394: \"$ac_link\"") >&5
(eval $ac_link) 2>&5
ac_status=$?
- echo "$as_me:5394: \$? = $ac_status" >&5
+ echo "$as_me:5397: \$? = $ac_status" >&5
(exit $ac_status); } &&
{ ac_try='test -s conftest$ac_exeext'
- { (eval echo "$as_me:5397: \"$ac_try\"") >&5
+ { (eval echo "$as_me:5400: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
- echo "$as_me:5400: \$? = $ac_status" >&5
+ echo "$as_me:5403: \$? = $ac_status" >&5
(exit $ac_status); }; }; then
eval "$as_ac_var=yes"
else
@@ -5407,7 +5410,7 @@ eval "$as_ac_var=no"
fi
rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext
fi
-echo "$as_me:5410: result: `eval echo '${'$as_ac_var'}'`" >&5
+echo "$as_me:5413: result: `eval echo '${'$as_ac_var'}'`" >&5
echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6
if test `eval echo '${'$as_ac_var'}'` = yes; then
cat >>confdefs.h <<EOF
@@ -5455,7 +5458,7 @@ if test -n "$cf_searchpath/include" ; then
cf_save_CPPFLAGS=$CPPFLAGS
CPPFLAGS="$CPPFLAGS -I$cf_add_incdir"
cat >conftest.$ac_ext <<_ACEOF
-#line 5458 "configure"
+#line 5461 "configure"
#include "confdefs.h"
#include <stdio.h>
int
@@ -5467,16 +5470,16 @@ printf("Hello")
}
_ACEOF
rm -f conftest.$ac_objext
-if { (eval echo "$as_me:5470: \"$ac_compile\"") >&5
+if { (eval echo "$as_me:5473: \"$ac_compile\"") >&5
(eval $ac_compile) 2>&5
ac_status=$?
- echo "$as_me:5473: \$? = $ac_status" >&5
+ echo "$as_me:5476: \$? = $ac_status" >&5
(exit $ac_status); } &&
{ ac_try='test -s conftest.$ac_objext'
- { (eval echo "$as_me:5476: \"$ac_try\"") >&5
+ { (eval echo "$as_me:5479: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
- echo "$as_me:5479: \$? = $ac_status" >&5
+ echo "$as_me:5482: \$? = $ac_status" >&5
(exit $ac_status); }; }; then
:
else
@@ -5493,7 +5496,7 @@ rm -f conftest.$ac_objext conftest.$ac_ext
if test "$cf_have_incdir" = no ; then
test -n "$verbose" && echo " adding $cf_add_incdir to include-path" 1>&6
-echo "${as_me:-configure}:5496: testing adding $cf_add_incdir to include-path ..." 1>&5
+echo "${as_me:-configure}:5499: testing adding $cf_add_incdir to include-path ..." 1>&5
CPPFLAGS="$CPPFLAGS -I$cf_add_incdir"
@@ -5534,7 +5537,7 @@ if test -n "$cf_searchpath/../include" ; then
cf_save_CPPFLAGS=$CPPFLAGS
CPPFLAGS="$CPPFLAGS -I$cf_add_incdir"
cat >conftest.$ac_ext <<_ACEOF
-#line 5537 "configure"
+#line 5540 "configure"
#include "confdefs.h"
#include <stdio.h>
int
@@ -5546,16 +5549,16 @@ printf("Hello")
}
_ACEOF
rm -f conftest.$ac_objext
-if { (eval echo "$as_me:5549: \"$ac_compile\"") >&5
+if { (eval echo "$as_me:5552: \"$ac_compile\"") >&5
(eval $ac_compile) 2>&5
ac_status=$?
- echo "$as_me:5552: \$? = $ac_status" >&5
+ echo "$as_me:5555: \$? = $ac_status" >&5
(exit $ac_status); } &&
{ ac_try='test -s conftest.$ac_objext'
- { (eval echo "$as_me:5555: \"$ac_try\"") >&5
+ { (eval echo "$as_me:5558: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
- echo "$as_me:5558: \$? = $ac_status" >&5
+ echo "$as_me:5561: \$? = $ac_status" >&5
(exit $ac_status); }; }; then
:
else
@@ -5572,7 +5575,7 @@ rm -f conftest.$ac_objext conftest.$ac_ext
if test "$cf_have_incdir" = no ; then
test -n "$verbose" && echo " adding $cf_add_incdir to include-path" 1>&6
-echo "${as_me:-configure}:5575: testing adding $cf_add_incdir to include-path ..." 1>&5
+echo "${as_me:-configure}:5578: testing adding $cf_add_incdir to include-path ..." 1>&5
CPPFLAGS="$CPPFLAGS -I$cf_add_incdir"
@@ -5588,7 +5591,7 @@ echo "${as_me:-configure}:5575: testing adding $cf_add_incdir to include-path ..
fi
else
-{ { echo "$as_me:5591: error: cannot find libiconv under $withval" >&5
+{ { echo "$as_me:5594: error: cannot find libiconv under $withval" >&5
echo "$as_me: error: cannot find libiconv under $withval" >&2;}
{ (exit 1); exit 1; }; }
fi
@@ -5613,7 +5616,7 @@ if test -n "$cf_searchpath/lib" ; then
if test "$cf_have_libdir" = no ; then
test -n "$verbose" && echo " adding $cf_add_libdir to library-path" 1>&6
-echo "${as_me:-configure}:5616: testing adding $cf_add_libdir to library-path ..." 1>&5
+echo "${as_me:-configure}:5619: testing adding $cf_add_libdir to library-path ..." 1>&5
LDFLAGS="-L$cf_add_libdir $LDFLAGS"
fi
@@ -5642,7 +5645,7 @@ if test -n "$cf_searchpath" ; then
if test "$cf_have_libdir" = no ; then
test -n "$verbose" && echo " adding $cf_add_libdir to library-path" 1>&6
-echo "${as_me:-configure}:5645: testing adding $cf_add_libdir to library-path ..." 1>&5
+echo "${as_me:-configure}:5648: testing adding $cf_add_libdir to library-path ..." 1>&5
LDFLAGS="-L$cf_add_libdir $LDFLAGS"
fi
@@ -5651,7 +5654,7 @@ echo "${as_me:-configure}:5645: testing adding $cf_add_libdir to library-path ..
fi
else
-{ { echo "$as_me:5654: error: cannot find libiconv under $withval" >&5
+{ { echo "$as_me:5657: error: cannot find libiconv under $withval" >&5
echo "$as_me: error: cannot find libiconv under $withval" >&2;}
{ (exit 1); exit 1; }; }
fi
@@ -5662,7 +5665,7 @@ done
fi;
- echo "$as_me:5665: checking for iconv" >&5
+ echo "$as_me:5668: checking for iconv" >&5
echo $ECHO_N "checking for iconv... $ECHO_C" >&6
if test "${am_cv_func_iconv+set}" = set; then
echo $ECHO_N "(cached) $ECHO_C" >&6
@@ -5673,12 +5676,12 @@ else
cf_cv_header_path_iconv=
cf_cv_library_path_iconv=
-echo "${as_me:-configure}:5676: testing Starting FIND_LINKAGE(iconv,) ..." 1>&5
+echo "${as_me:-configure}:5679: testing Starting FIND_LINKAGE(iconv,) ..." 1>&5
cf_save_LIBS="$LIBS"
cat >conftest.$ac_ext <<_ACEOF
-#line 5681 "configure"
+#line 5684 "configure"
#include "confdefs.h"
#include <stdlib.h>
@@ -5697,16 +5700,16 @@ main ()
}
_ACEOF
rm -f conftest.$ac_objext conftest$ac_exeext
-if { (eval echo "$as_me:5700: \"$ac_link\"") >&5
+if { (eval echo "$as_me:5703: \"$ac_link\"") >&5
(eval $ac_link) 2>&5
ac_status=$?
- echo "$as_me:5703: \$? = $ac_status" >&5
+ echo "$as_me:5706: \$? = $ac_status" >&5
(exit $ac_status); } &&
{ ac_try='test -s conftest$ac_exeext'
- { (eval echo "$as_me:5706: \"$ac_try\"") >&5
+ { (eval echo "$as_me:5709: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
- echo "$as_me:5709: \$? = $ac_status" >&5
+ echo "$as_me:5712: \$? = $ac_status" >&5
(exit $ac_status); }; }; then
cf_cv_find_linkage_iconv=yes
@@ -5720,7 +5723,7 @@ cat conftest.$ac_ext >&5
LIBS="-liconv $cf_save_LIBS"
cat >conftest.$ac_ext <<_ACEOF
-#line 5723 "configure"
+#line 5726 "configure"
#include "confdefs.h"
#include <stdlib.h>
@@ -5739,16 +5742,16 @@ main ()
}
_ACEOF
rm -f conftest.$ac_objext conftest$ac_exeext
-if { (eval echo "$as_me:5742: \"$ac_link\"") >&5
+if { (eval echo "$as_me:5745: \"$ac_link\"") >&5
(eval $ac_link) 2>&5
ac_status=$?
- echo "$as_me:5745: \$? = $ac_status" >&5
+ echo "$as_me:5748: \$? = $ac_status" >&5
(exit $ac_status); } &&
{ ac_try='test -s conftest$ac_exeext'
- { (eval echo "$as_me:5748: \"$ac_try\"") >&5
+ { (eval echo "$as_me:5751: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
- echo "$as_me:5751: \$? = $ac_status" >&5
+ echo "$as_me:5754: \$? = $ac_status" >&5
(exit $ac_status); }; }; then
cf_cv_find_linkage_iconv=yes
@@ -5765,9 +5768,9 @@ cat conftest.$ac_ext >&5
test -n "$verbose" && echo " find linkage for iconv library" 1>&6
-echo "${as_me:-configure}:5768: testing find linkage for iconv library ..." 1>&5
+echo "${as_me:-configure}:5771: testing find linkage for iconv library ..." 1>&5
-echo "${as_me:-configure}:5770: testing Searching for headers in FIND_LINKAGE(iconv,) ..." 1>&5
+echo "${as_me:-configure}:5773: testing Searching for headers in FIND_LINKAGE(iconv,) ..." 1>&5
cf_save_CPPFLAGS="$CPPFLAGS"
cf_test_CPPFLAGS="$CPPFLAGS"
@@ -5880,11 +5883,11 @@ cf_search="$cf_search $cf_header_path_list"
if test -d $cf_cv_header_path_iconv ; then
test -n "$verbose" && echo " ... testing $cf_cv_header_path_iconv" 1>&6
-echo "${as_me:-configure}:5883: testing ... testing $cf_cv_header_path_iconv ..." 1>&5
+echo "${as_me:-configure}:5886: testing ... testing $cf_cv_header_path_iconv ..." 1>&5
CPPFLAGS="$cf_save_CPPFLAGS -I$cf_cv_header_path_iconv"
cat >conftest.$ac_ext <<_ACEOF
-#line 5887 "configure"
+#line 5890 "configure"
#include "confdefs.h"
#include <stdlib.h>
@@ -5903,21 +5906,21 @@ main ()
}
_ACEOF
rm -f conftest.$ac_objext
-if { (eval echo "$as_me:5906: \"$ac_compile\"") >&5
+if { (eval echo "$as_me:5909: \"$ac_compile\"") >&5
(eval $ac_compile) 2>&5
ac_status=$?
- echo "$as_me:5909: \$? = $ac_status" >&5
+ echo "$as_me:5912: \$? = $ac_status" >&5
(exit $ac_status); } &&
{ ac_try='test -s conftest.$ac_objext'
- { (eval echo "$as_me:5912: \"$ac_try\"") >&5
+ { (eval echo "$as_me:5915: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
- echo "$as_me:5915: \$? = $ac_status" >&5
+ echo "$as_me:5918: \$? = $ac_status" >&5
(exit $ac_status); }; }; then
test -n "$verbose" && echo " ... found iconv headers in $cf_cv_header_path_iconv" 1>&6
-echo "${as_me:-configure}:5920: testing ... found iconv headers in $cf_cv_header_path_iconv ..." 1>&5
+echo "${as_me:-configure}:5923: testing ... found iconv headers in $cf_cv_header_path_iconv ..." 1>&5
cf_cv_find_linkage_iconv=maybe
cf_test_CPPFLAGS="$CPPFLAGS"
@@ -5935,7 +5938,7 @@ rm -f conftest.$ac_objext conftest.$ac_ext
if test "$cf_cv_find_linkage_iconv" = maybe ; then
-echo "${as_me:-configure}:5938: testing Searching for iconv library in FIND_LINKAGE(iconv,) ..." 1>&5
+echo "${as_me:-configure}:5941: testing Searching for iconv library in FIND_LINKAGE(iconv,) ..." 1>&5
cf_save_LIBS="$LIBS"
cf_save_LDFLAGS="$LDFLAGS"
@@ -6032,13 +6035,13 @@ cf_search="$cf_library_path_list $cf_search"
if test -d $cf_cv_library_path_iconv ; then
test -n "$verbose" && echo " ... testing $cf_cv_library_path_iconv" 1>&6
-echo "${as_me:-configure}:6035: testing ... testing $cf_cv_library_path_iconv ..." 1>&5
+echo "${as_me:-configure}:6038: testing ... testing $cf_cv_library_path_iconv ..." 1>&5
CPPFLAGS="$cf_test_CPPFLAGS"
LIBS="-liconv $cf_save_LIBS"
LDFLAGS="$cf_save_LDFLAGS -L$cf_cv_library_path_iconv"
cat >conftest.$ac_ext <<_ACEOF
-#line 6041 "configure"
+#line 6044 "configure"
#include "confdefs.h"
#include <stdlib.h>
@@ -6057,21 +6060,21 @@ main ()
}
_ACEOF
rm -f conftest.$ac_objext conftest$ac_exeext
-if { (eval echo "$as_me:6060: \"$ac_link\"") >&5
+if { (eval echo "$as_me:6063: \"$ac_link\"") >&5
(eval $ac_link) 2>&5
ac_status=$?
- echo "$as_me:6063: \$? = $ac_status" >&5
+ echo "$as_me:6066: \$? = $ac_status" >&5
(exit $ac_status); } &&
{ ac_try='test -s conftest$ac_exeext'
- { (eval echo "$as_me:6066: \"$ac_try\"") >&5
+ { (eval echo "$as_me:6069: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
- echo "$as_me:6069: \$? = $ac_status" >&5
+ echo "$as_me:6072: \$? = $ac_status" >&5
(exit $ac_status); }; }; then
test -n "$verbose" && echo " ... found iconv library in $cf_cv_library_path_iconv" 1>&6
-echo "${as_me:-configure}:6074: testing ... found iconv library in $cf_cv_library_path_iconv ..." 1>&5
+echo "${as_me:-configure}:6077: testing ... found iconv library in $cf_cv_library_path_iconv ..." 1>&5
cf_cv_find_linkage_iconv=yes
cf_cv_library_file_iconv="-liconv"
@@ -6111,7 +6114,7 @@ am_cv_func_iconv="no, consider installing GNU libiconv"
fi
fi
-echo "$as_me:6114: result: $am_cv_func_iconv" >&5
+echo "$as_me:6117: result: $am_cv_func_iconv" >&5
echo "${ECHO_T}$am_cv_func_iconv" >&6
if test "$am_cv_func_iconv" = yes; then
@@ -6120,14 +6123,14 @@ cat >>confdefs.h <<\EOF
#define HAVE_ICONV 1
EOF
- echo "$as_me:6123: checking if the declaration of iconv() needs const." >&5
+ echo "$as_me:6126: checking if the declaration of iconv() needs const." >&5
echo $ECHO_N "checking if the declaration of iconv() needs const.... $ECHO_C" >&6
if test "${am_cv_proto_iconv_const+set}" = set; then
echo $ECHO_N "(cached) $ECHO_C" >&6
else
cat >conftest.$ac_ext <<_ACEOF
-#line 6130 "configure"
+#line 6133 "configure"
#include "confdefs.h"
#include <stdlib.h>
@@ -6152,16 +6155,16 @@ main ()
}
_ACEOF
rm -f conftest.$ac_objext
-if { (eval echo "$as_me:6155: \"$ac_compile\"") >&5
+if { (eval echo "$as_me:6158: \"$ac_compile\"") >&5
(eval $ac_compile) 2>&5
ac_status=$?
- echo "$as_me:6158: \$? = $ac_status" >&5
+ echo "$as_me:6161: \$? = $ac_status" >&5
(exit $ac_status); } &&
{ ac_try='test -s conftest.$ac_objext'
- { (eval echo "$as_me:6161: \"$ac_try\"") >&5
+ { (eval echo "$as_me:6164: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
- echo "$as_me:6164: \$? = $ac_status" >&5
+ echo "$as_me:6167: \$? = $ac_status" >&5
(exit $ac_status); }; }; then
am_cv_proto_iconv_const=no
else
@@ -6171,7 +6174,7 @@ am_cv_proto_iconv_const=yes
fi
rm -f conftest.$ac_objext conftest.$ac_ext
fi
-echo "$as_me:6174: result: $am_cv_proto_iconv_const" >&5
+echo "$as_me:6177: result: $am_cv_proto_iconv_const" >&5
echo "${ECHO_T}$am_cv_proto_iconv_const" >&6
if test "$am_cv_proto_iconv_const" = yes ; then
@@ -6213,7 +6216,7 @@ if test -n "$cf_cv_header_path_iconv" ; then
cf_save_CPPFLAGS=$CPPFLAGS
CPPFLAGS="$CPPFLAGS -I$cf_add_incdir"
cat >conftest.$ac_ext <<_ACEOF
-#line 6216 "configure"
+#line 6219 "configure"
#include "confdefs.h"
#include <stdio.h>
int
@@ -6225,16 +6228,16 @@ printf("Hello")
}
_ACEOF
rm -f conftest.$ac_objext
-if { (eval echo "$as_me:6228: \"$ac_compile\"") >&5
+if { (eval echo "$as_me:6231: \"$ac_compile\"") >&5
(eval $ac_compile) 2>&5
ac_status=$?
- echo "$as_me:6231: \$? = $ac_status" >&5
+ echo "$as_me:6234: \$? = $ac_status" >&5
(exit $ac_status); } &&
{ ac_try='test -s conftest.$ac_objext'
- { (eval echo "$as_me:6234: \"$ac_try\"") >&5
+ { (eval echo "$as_me:6237: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
- echo "$as_me:6237: \$? = $ac_status" >&5
+ echo "$as_me:6240: \$? = $ac_status" >&5
(exit $ac_status); }; }; then
:
else
@@ -6251,7 +6254,7 @@ rm -f conftest.$ac_objext conftest.$ac_ext
if test "$cf_have_incdir" = no ; then
test -n "$verbose" && echo " adding $cf_add_incdir to include-path" 1>&6
-echo "${as_me:-configure}:6254: testing adding $cf_add_incdir to include-path ..." 1>&5
+echo "${as_me:-configure}:6257: testing adding $cf_add_incdir to include-path ..." 1>&5
CPPFLAGS="$CPPFLAGS -I$cf_add_incdir"
@@ -6288,7 +6291,7 @@ if test -n "$cf_cv_library_path_iconv" ; then
if test "$cf_have_libdir" = no ; then
test -n "$verbose" && echo " adding $cf_add_libdir to library-path" 1>&6
-echo "${as_me:-configure}:6291: testing adding $cf_add_libdir to library-path ..." 1>&5
+echo "${as_me:-configure}:6294: testing adding $cf_add_libdir to library-path ..." 1>&5
LDFLAGS="-L$cf_add_libdir $LDFLAGS"
fi
@@ -6299,13 +6302,13 @@ fi
fi
fi
- echo "$as_me:6302: checking for nl_langinfo and CODESET" >&5
+ echo "$as_me:6305: checking for nl_langinfo and CODESET" >&5
echo $ECHO_N "checking for nl_langinfo and CODESET... $ECHO_C" >&6
if test "${am_cv_langinfo_codeset+set}" = set; then
echo $ECHO_N "(cached) $ECHO_C" >&6
else
cat >conftest.$ac_ext <<_ACEOF
-#line 6308 "configure"
+#line 6311 "configure"
#include "confdefs.h"
#include <langinfo.h>
int
@@ -6317,16 +6320,16 @@ char* cs = nl_langinfo(CODESET);
}
_ACEOF
rm -f conftest.$ac_objext conftest$ac_exeext
-if { (eval echo "$as_me:6320: \"$ac_link\"") >&5
+if { (eval echo "$as_me:6323: \"$ac_link\"") >&5
(eval $ac_link) 2>&5
ac_status=$?
- echo "$as_me:6323: \$? = $ac_status" >&5
+ echo "$as_me:6326: \$? = $ac_status" >&5
(exit $ac_status); } &&
{ ac_try='test -s conftest$ac_exeext'
- { (eval echo "$as_me:6326: \"$ac_try\"") >&5
+ { (eval echo "$as_me:6329: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
- echo "$as_me:6329: \$? = $ac_status" >&5
+ echo "$as_me:6332: \$? = $ac_status" >&5
(exit $ac_status); }; }; then
am_cv_langinfo_codeset=yes
else
@@ -6337,7 +6340,7 @@ fi
rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext
fi
-echo "$as_me:6340: result: $am_cv_langinfo_codeset" >&5
+echo "$as_me:6343: result: $am_cv_langinfo_codeset" >&5
echo "${ECHO_T}$am_cv_langinfo_codeset" >&6
if test $am_cv_langinfo_codeset = yes; then
@@ -6348,13 +6351,13 @@ EOF
fi
if test $ac_cv_header_locale_h = yes; then
- echo "$as_me:6351: checking for LC_MESSAGES" >&5
+ echo "$as_me:6354: checking for LC_MESSAGES" >&5
echo $ECHO_N "checking for LC_MESSAGES... $ECHO_C" >&6
if test "${am_cv_val_LC_MESSAGES+set}" = set; then
echo $ECHO_N "(cached) $ECHO_C" >&6
else
cat >conftest.$ac_ext <<_ACEOF
-#line 6357 "configure"
+#line 6360 "configure"
#include "confdefs.h"
#include <locale.h>
int
@@ -6366,16 +6369,16 @@ return LC_MESSAGES
}
_ACEOF
rm -f conftest.$ac_objext conftest$ac_exeext
-if { (eval echo "$as_me:6369: \"$ac_link\"") >&5
+if { (eval echo "$as_me:6372: \"$ac_link\"") >&5
(eval $ac_link) 2>&5
ac_status=$?
- echo "$as_me:6372: \$? = $ac_status" >&5
+ echo "$as_me:6375: \$? = $ac_status" >&5
(exit $ac_status); } &&
{ ac_try='test -s conftest$ac_exeext'
- { (eval echo "$as_me:6375: \"$ac_try\"") >&5
+ { (eval echo "$as_me:6378: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
- echo "$as_me:6378: \$? = $ac_status" >&5
+ echo "$as_me:6381: \$? = $ac_status" >&5
(exit $ac_status); }; }; then
am_cv_val_LC_MESSAGES=yes
else
@@ -6385,7 +6388,7 @@ am_cv_val_LC_MESSAGES=no
fi
rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext
fi
-echo "$as_me:6388: result: $am_cv_val_LC_MESSAGES" >&5
+echo "$as_me:6391: result: $am_cv_val_LC_MESSAGES" >&5
echo "${ECHO_T}$am_cv_val_LC_MESSAGES" >&6
if test $am_cv_val_LC_MESSAGES = yes; then
@@ -6395,7 +6398,7 @@ EOF
fi
fi
- echo "$as_me:6398: checking whether NLS is requested" >&5
+ echo "$as_me:6401: checking whether NLS is requested" >&5
echo $ECHO_N "checking whether NLS is requested... $ECHO_C" >&6
# Check whether --enable-nls or --disable-nls was given.
@@ -6405,7 +6408,7 @@ if test "${enable_nls+set}" = set; then
else
USE_NLS=no
fi;
- echo "$as_me:6408: result: $USE_NLS" >&5
+ echo "$as_me:6411: result: $USE_NLS" >&5
echo "${ECHO_T}$USE_NLS" >&6
BUILD_INCLUDED_LIBINTL=no
@@ -6418,7 +6421,7 @@ cat >>confdefs.h <<\EOF
#define ENABLE_NLS 1
EOF
- echo "$as_me:6421: checking whether included gettext is requested" >&5
+ echo "$as_me:6424: checking whether included gettext is requested" >&5
echo $ECHO_N "checking whether included gettext is requested... $ECHO_C" >&6
# Check whether --with-included-gettext or --without-included-gettext was given.
@@ -6428,7 +6431,7 @@ if test "${with_included_gettext+set}" = set; then
else
nls_cv_force_use_gnu_gettext=no
fi;
- echo "$as_me:6431: result: $nls_cv_force_use_gnu_gettext" >&5
+ echo "$as_me:6434: result: $nls_cv_force_use_gnu_gettext" >&5
echo "${ECHO_T}$nls_cv_force_use_gnu_gettext" >&6
nls_cv_use_gnu_gettext="$nls_cv_force_use_gnu_gettext"
@@ -6437,7 +6440,7 @@ echo "${ECHO_T}$nls_cv_force_use_gnu_gettext" >&6
cf_save_LIBS_1="$LIBS"
LIBS="$LIBICONV $LIBS"
- echo "$as_me:6440: checking for libintl.h and gettext()" >&5
+ echo "$as_me:6443: checking for libintl.h and gettext()" >&5
echo $ECHO_N "checking for libintl.h and gettext()... $ECHO_C" >&6
if test "${cf_cv_func_gettext+set}" = set; then
echo $ECHO_N "(cached) $ECHO_C" >&6
@@ -6448,12 +6451,12 @@ else
cf_cv_header_path_intl=
cf_cv_library_path_intl=
-echo "${as_me:-configure}:6451: testing Starting FIND_LINKAGE(intl,) ..." 1>&5
+echo "${as_me:-configure}:6454: testing Starting FIND_LINKAGE(intl,) ..." 1>&5
cf_save_LIBS="$LIBS"
cat >conftest.$ac_ext <<_ACEOF
-#line 6456 "configure"
+#line 6459 "configure"
#include "confdefs.h"
#include <libintl.h>
@@ -6473,16 +6476,16 @@ main ()
}
_ACEOF
rm -f conftest.$ac_objext conftest$ac_exeext
-if { (eval echo "$as_me:6476: \"$ac_link\"") >&5
+if { (eval echo "$as_me:6479: \"$ac_link\"") >&5
(eval $ac_link) 2>&5
ac_status=$?
- echo "$as_me:6479: \$? = $ac_status" >&5
+ echo "$as_me:6482: \$? = $ac_status" >&5
(exit $ac_status); } &&
{ ac_try='test -s conftest$ac_exeext'
- { (eval echo "$as_me:6482: \"$ac_try\"") >&5
+ { (eval echo "$as_me:6485: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
- echo "$as_me:6485: \$? = $ac_status" >&5
+ echo "$as_me:6488: \$? = $ac_status" >&5
(exit $ac_status); }; }; then
cf_cv_find_linkage_intl=yes
@@ -6496,7 +6499,7 @@ cat conftest.$ac_ext >&5
LIBS="-lintl $cf_save_LIBS"
cat >conftest.$ac_ext <<_ACEOF
-#line 6499 "configure"
+#line 6502 "configure"
#include "confdefs.h"
#include <libintl.h>
@@ -6516,16 +6519,16 @@ main ()
}
_ACEOF
rm -f conftest.$ac_objext conftest$ac_exeext
-if { (eval echo "$as_me:6519: \"$ac_link\"") >&5
+if { (eval echo "$as_me:6522: \"$ac_link\"") >&5
(eval $ac_link) 2>&5
ac_status=$?
- echo "$as_me:6522: \$? = $ac_status" >&5
+ echo "$as_me:6525: \$? = $ac_status" >&5
(exit $ac_status); } &&
{ ac_try='test -s conftest$ac_exeext'
- { (eval echo "$as_me:6525: \"$ac_try\"") >&5
+ { (eval echo "$as_me:6528: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
- echo "$as_me:6528: \$? = $ac_status" >&5
+ echo "$as_me:6531: \$? = $ac_status" >&5
(exit $ac_status); }; }; then
cf_cv_find_linkage_intl=yes
@@ -6542,9 +6545,9 @@ cat conftest.$ac_ext >&5
test -n "$verbose" && echo " find linkage for intl library" 1>&6
-echo "${as_me:-configure}:6545: testing find linkage for intl library ..." 1>&5
+echo "${as_me:-configure}:6548: testing find linkage for intl library ..." 1>&5
-echo "${as_me:-configure}:6547: testing Searching for headers in FIND_LINKAGE(intl,) ..." 1>&5
+echo "${as_me:-configure}:6550: testing Searching for headers in FIND_LINKAGE(intl,) ..." 1>&5
cf_save_CPPFLAGS="$CPPFLAGS"
cf_test_CPPFLAGS="$CPPFLAGS"
@@ -6657,11 +6660,11 @@ cf_search="$cf_search $cf_header_path_list"
if test -d $cf_cv_header_path_intl ; then
test -n "$verbose" && echo " ... testing $cf_cv_header_path_intl" 1>&6
-echo "${as_me:-configure}:6660: testing ... testing $cf_cv_header_path_intl ..." 1>&5
+echo "${as_me:-configure}:6663: testing ... testing $cf_cv_header_path_intl ..." 1>&5
CPPFLAGS="$cf_save_CPPFLAGS -I$cf_cv_header_path_intl"
cat >conftest.$ac_ext <<_ACEOF
-#line 6664 "configure"
+#line 6667 "configure"
#include "confdefs.h"
#include <libintl.h>
@@ -6681,21 +6684,21 @@ main ()
}
_ACEOF
rm -f conftest.$ac_objext
-if { (eval echo "$as_me:6684: \"$ac_compile\"") >&5
+if { (eval echo "$as_me:6687: \"$ac_compile\"") >&5
(eval $ac_compile) 2>&5
ac_status=$?
- echo "$as_me:6687: \$? = $ac_status" >&5
+ echo "$as_me:6690: \$? = $ac_status" >&5
(exit $ac_status); } &&
{ ac_try='test -s conftest.$ac_objext'
- { (eval echo "$as_me:6690: \"$ac_try\"") >&5
+ { (eval echo "$as_me:6693: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
- echo "$as_me:6693: \$? = $ac_status" >&5
+ echo "$as_me:6696: \$? = $ac_status" >&5
(exit $ac_status); }; }; then
test -n "$verbose" && echo " ... found intl headers in $cf_cv_header_path_intl" 1>&6
-echo "${as_me:-configure}:6698: testing ... found intl headers in $cf_cv_header_path_intl ..." 1>&5
+echo "${as_me:-configure}:6701: testing ... found intl headers in $cf_cv_header_path_intl ..." 1>&5
cf_cv_find_linkage_intl=maybe
cf_test_CPPFLAGS="$CPPFLAGS"
@@ -6713,7 +6716,7 @@ rm -f conftest.$ac_objext conftest.$ac_ext
if test "$cf_cv_find_linkage_intl" = maybe ; then
-echo "${as_me:-configure}:6716: testing Searching for intl library in FIND_LINKAGE(intl,) ..." 1>&5
+echo "${as_me:-configure}:6719: testing Searching for intl library in FIND_LINKAGE(intl,) ..." 1>&5
cf_save_LIBS="$LIBS"
cf_save_LDFLAGS="$LDFLAGS"
@@ -6810,13 +6813,13 @@ cf_search="$cf_library_path_list $cf_search"
if test -d $cf_cv_library_path_intl ; then
test -n "$verbose" && echo " ... testing $cf_cv_library_path_intl" 1>&6
-echo "${as_me:-configure}:6813: testing ... testing $cf_cv_library_path_intl ..." 1>&5
+echo "${as_me:-configure}:6816: testing ... testing $cf_cv_library_path_intl ..." 1>&5
CPPFLAGS="$cf_test_CPPFLAGS"
LIBS="-lintl $cf_save_LIBS"
LDFLAGS="$cf_save_LDFLAGS -L$cf_cv_library_path_intl"
cat >conftest.$ac_ext <<_ACEOF
-#line 6819 "configure"
+#line 6822 "configure"
#include "confdefs.h"
#include <libintl.h>
@@ -6836,21 +6839,21 @@ main ()
}
_ACEOF
rm -f conftest.$ac_objext conftest$ac_exeext
-if { (eval echo "$as_me:6839: \"$ac_link\"") >&5
+if { (eval echo "$as_me:6842: \"$ac_link\"") >&5
(eval $ac_link) 2>&5
ac_status=$?
- echo "$as_me:6842: \$? = $ac_status" >&5
+ echo "$as_me:6845: \$? = $ac_status" >&5
(exit $ac_status); } &&
{ ac_try='test -s conftest$ac_exeext'
- { (eval echo "$as_me:6845: \"$ac_try\"") >&5
+ { (eval echo "$as_me:6848: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
- echo "$as_me:6848: \$? = $ac_status" >&5
+ echo "$as_me:6851: \$? = $ac_status" >&5
(exit $ac_status); }; }; then
test -n "$verbose" && echo " ... found intl library in $cf_cv_library_path_intl" 1>&6
-echo "${as_me:-configure}:6853: testing ... found intl library in $cf_cv_library_path_intl ..." 1>&5
+echo "${as_me:-configure}:6856: testing ... found intl library in $cf_cv_library_path_intl ..." 1>&5
cf_cv_find_linkage_intl=yes
cf_cv_library_file_intl="-lintl"
@@ -6890,7 +6893,7 @@ cf_cv_func_gettext=no
fi
fi
-echo "$as_me:6893: result: $cf_cv_func_gettext" >&5
+echo "$as_me:6896: result: $cf_cv_func_gettext" >&5
echo "${ECHO_T}$cf_cv_func_gettext" >&6
LIBS="$cf_save_LIBS_1"
@@ -6929,7 +6932,7 @@ if test -n "$cf_cv_header_path_intl" ; then
cf_save_CPPFLAGS=$CPPFLAGS
CPPFLAGS="$CPPFLAGS -I$cf_add_incdir"
cat >conftest.$ac_ext <<_ACEOF
-#line 6932 "configure"
+#line 6935 "configure"
#include "confdefs.h"
#include <stdio.h>
int
@@ -6941,16 +6944,16 @@ printf("Hello")
}
_ACEOF
rm -f conftest.$ac_objext
-if { (eval echo "$as_me:6944: \"$ac_compile\"") >&5
+if { (eval echo "$as_me:6947: \"$ac_compile\"") >&5
(eval $ac_compile) 2>&5
ac_status=$?
- echo "$as_me:6947: \$? = $ac_status" >&5
+ echo "$as_me:6950: \$? = $ac_status" >&5
(exit $ac_status); } &&
{ ac_try='test -s conftest.$ac_objext'
- { (eval echo "$as_me:6950: \"$ac_try\"") >&5
+ { (eval echo "$as_me:6953: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
- echo "$as_me:6953: \$? = $ac_status" >&5
+ echo "$as_me:6956: \$? = $ac_status" >&5
(exit $ac_status); }; }; then
:
else
@@ -6967,7 +6970,7 @@ rm -f conftest.$ac_objext conftest.$ac_ext
if test "$cf_have_incdir" = no ; then
test -n "$verbose" && echo " adding $cf_add_incdir to include-path" 1>&6
-echo "${as_me:-configure}:6970: testing adding $cf_add_incdir to include-path ..." 1>&5
+echo "${as_me:-configure}:6973: testing adding $cf_add_incdir to include-path ..." 1>&5
CPPFLAGS="$CPPFLAGS -I$cf_add_incdir"
@@ -7004,7 +7007,7 @@ if test -n "$cf_cv_library_path_intl" ; then
if test "$cf_have_libdir" = no ; then
test -n "$verbose" && echo " adding $cf_add_libdir to library-path" 1>&6
-echo "${as_me:-configure}:7007: testing adding $cf_add_libdir to library-path ..." 1>&5
+echo "${as_me:-configure}:7010: testing adding $cf_add_libdir to library-path ..." 1>&5
INTLLIBS="-L$cf_add_libdir $INTLLIBS"
fi
@@ -7020,13 +7023,13 @@ fi
for ac_func in dcgettext
do
as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh`
-echo "$as_me:7023: checking for $ac_func" >&5
+echo "$as_me:7026: checking for $ac_func" >&5
echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6
if eval "test \"\${$as_ac_var+set}\" = set"; then
echo $ECHO_N "(cached) $ECHO_C" >&6
else
cat >conftest.$ac_ext <<_ACEOF
-#line 7029 "configure"
+#line 7032 "configure"
#include "confdefs.h"
/* System header to define __stub macros and hopefully few prototypes,
which can conflict with char $ac_func (); below. */
@@ -7057,16 +7060,16 @@ f = $ac_func;
}
_ACEOF
rm -f conftest.$ac_objext conftest$ac_exeext
-if { (eval echo "$as_me:7060: \"$ac_link\"") >&5
+if { (eval echo "$as_me:7063: \"$ac_link\"") >&5
(eval $ac_link) 2>&5
ac_status=$?
- echo "$as_me:7063: \$? = $ac_status" >&5
+ echo "$as_me:7066: \$? = $ac_status" >&5
(exit $ac_status); } &&
{ ac_try='test -s conftest$ac_exeext'
- { (eval echo "$as_me:7066: \"$ac_try\"") >&5
+ { (eval echo "$as_me:7069: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
- echo "$as_me:7069: \$? = $ac_status" >&5
+ echo "$as_me:7072: \$? = $ac_status" >&5
(exit $ac_status); }; }; then
eval "$as_ac_var=yes"
else
@@ -7076,7 +7079,7 @@ eval "$as_ac_var=no"
fi
rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext
fi
-echo "$as_me:7079: result: `eval echo '${'$as_ac_var'}'`" >&5
+echo "$as_me:7082: result: `eval echo '${'$as_ac_var'}'`" >&5
echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6
if test `eval echo '${'$as_ac_var'}'` = yes; then
cat >>confdefs.h <<EOF
@@ -7091,7 +7094,7 @@ done
# Extract the first word of "msgfmt", so it can be a program name with args.
set dummy msgfmt; ac_word=$2
-echo "$as_me:7094: checking for $ac_word" >&5
+echo "$as_me:7097: checking for $ac_word" >&5
echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
if test "${ac_cv_path_MSGFMT+set}" = set; then
echo $ECHO_N "(cached) $ECHO_C" >&6
@@ -7118,16 +7121,16 @@ esac
fi
MSGFMT="$ac_cv_path_MSGFMT"
if test "$MSGFMT" != ":"; then
- echo "$as_me:7121: result: $MSGFMT" >&5
+ echo "$as_me:7124: result: $MSGFMT" >&5
echo "${ECHO_T}$MSGFMT" >&6
else
- echo "$as_me:7124: result: no" >&5
+ echo "$as_me:7127: result: no" >&5
echo "${ECHO_T}no" >&6
fi
# Extract the first word of "gmsgfmt", so it can be a program name with args.
set dummy gmsgfmt; ac_word=$2
-echo "$as_me:7130: checking for $ac_word" >&5
+echo "$as_me:7133: checking for $ac_word" >&5
echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
if test "${ac_cv_path_GMSGFMT+set}" = set; then
echo $ECHO_N "(cached) $ECHO_C" >&6
@@ -7144,7 +7147,7 @@ for ac_dir in $ac_dummy; do
test -z "$ac_dir" && ac_dir=.
if $as_executable_p "$ac_dir/$ac_word"; then
ac_cv_path_GMSGFMT="$ac_dir/$ac_word"
- echo "$as_me:7147: found $ac_dir/$ac_word" >&5
+ echo "$as_me:7150: found $ac_dir/$ac_word" >&5
break
fi
done
@@ -7156,17 +7159,17 @@ fi
GMSGFMT=$ac_cv_path_GMSGFMT
if test -n "$GMSGFMT"; then
- echo "$as_me:7159: result: $GMSGFMT" >&5
+ echo "$as_me:7162: result: $GMSGFMT" >&5
echo "${ECHO_T}$GMSGFMT" >&6
else
- echo "$as_me:7162: result: no" >&5
+ echo "$as_me:7165: result: no" >&5
echo "${ECHO_T}no" >&6
fi
# Extract the first word of "xgettext", so it can be a program name with args.
set dummy xgettext; ac_word=$2
-echo "$as_me:7169: checking for $ac_word" >&5
+echo "$as_me:7172: checking for $ac_word" >&5
echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
if test "${ac_cv_path_XGETTEXT+set}" = set; then
echo $ECHO_N "(cached) $ECHO_C" >&6
@@ -7193,10 +7196,10 @@ esac
fi
XGETTEXT="$ac_cv_path_XGETTEXT"
if test "$XGETTEXT" != ":"; then
- echo "$as_me:7196: result: $XGETTEXT" >&5
+ echo "$as_me:7199: result: $XGETTEXT" >&5
echo "${ECHO_T}$XGETTEXT" >&6
else
- echo "$as_me:7199: result: no" >&5
+ echo "$as_me:7202: result: no" >&5
echo "${ECHO_T}no" >&6
fi
@@ -7211,7 +7214,7 @@ fi
if test "$nls_cv_use_gnu_gettext" = "yes"; then
if test ! -d $srcdir/intl ; then
- { { echo "$as_me:7214: error: no NLS library is packaged with this application" >&5
+ { { echo "$as_me:7217: error: no NLS library is packaged with this application" >&5
echo "$as_me: error: no NLS library is packaged with this application" >&2;}
{ (exit 1); exit 1; }; }
fi
@@ -7219,7 +7222,7 @@ echo "$as_me: error: no NLS library is packaged with this application" >&2;}
# Extract the first word of "msgfmt", so it can be a program name with args.
set dummy msgfmt; ac_word=$2
-echo "$as_me:7222: checking for $ac_word" >&5
+echo "$as_me:7225: checking for $ac_word" >&5
echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
if test "${ac_cv_path_MSGFMT+set}" = set; then
echo $ECHO_N "(cached) $ECHO_C" >&6
@@ -7246,16 +7249,16 @@ esac
fi
MSGFMT="$ac_cv_path_MSGFMT"
if test "$MSGFMT" != ":"; then
- echo "$as_me:7249: result: $MSGFMT" >&5
+ echo "$as_me:7252: result: $MSGFMT" >&5
echo "${ECHO_T}$MSGFMT" >&6
else
- echo "$as_me:7252: result: no" >&5
+ echo "$as_me:7255: result: no" >&5
echo "${ECHO_T}no" >&6
fi
# Extract the first word of "gmsgfmt", so it can be a program name with args.
set dummy gmsgfmt; ac_word=$2
-echo "$as_me:7258: checking for $ac_word" >&5
+echo "$as_me:7261: checking for $ac_word" >&5
echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
if test "${ac_cv_path_GMSGFMT+set}" = set; then
echo $ECHO_N "(cached) $ECHO_C" >&6
@@ -7272,7 +7275,7 @@ for ac_dir in $ac_dummy; do
test -z "$ac_dir" && ac_dir=.
if $as_executable_p "$ac_dir/$ac_word"; then
ac_cv_path_GMSGFMT="$ac_dir/$ac_word"
- echo "$as_me:7275: found $ac_dir/$ac_word" >&5
+ echo "$as_me:7278: found $ac_dir/$ac_word" >&5
break
fi
done
@@ -7284,17 +7287,17 @@ fi
GMSGFMT=$ac_cv_path_GMSGFMT
if test -n "$GMSGFMT"; then
- echo "$as_me:7287: result: $GMSGFMT" >&5
+ echo "$as_me:7290: result: $GMSGFMT" >&5
echo "${ECHO_T}$GMSGFMT" >&6
else
- echo "$as_me:7290: result: no" >&5
+ echo "$as_me:7293: result: no" >&5
echo "${ECHO_T}no" >&6
fi
# Extract the first word of "xgettext", so it can be a program name with args.
set dummy xgettext; ac_word=$2
-echo "$as_me:7297: checking for $ac_word" >&5
+echo "$as_me:7300: checking for $ac_word" >&5
echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
if test "${ac_cv_path_XGETTEXT+set}" = set; then
echo $ECHO_N "(cached) $ECHO_C" >&6
@@ -7321,10 +7324,10 @@ esac
fi
XGETTEXT="$ac_cv_path_XGETTEXT"
if test "$XGETTEXT" != ":"; then
- echo "$as_me:7324: result: $XGETTEXT" >&5
+ echo "$as_me:7327: result: $XGETTEXT" >&5
echo "${ECHO_T}$XGETTEXT" >&6
else
- echo "$as_me:7327: result: no" >&5
+ echo "$as_me:7330: result: no" >&5
echo "${ECHO_T}no" >&6
fi
@@ -7339,7 +7342,7 @@ fi
if $GMSGFMT --statistics /dev/null >/dev/null 2>&1; then
: ;
else
- echo "$as_me:7342: result: found msgfmt program is not GNU msgfmt; ignore it" >&5
+ echo "$as_me:7345: result: found msgfmt program is not GNU msgfmt; ignore it" >&5
echo "${ECHO_T}found msgfmt program is not GNU msgfmt; ignore it" >&6
GMSGFMT=":"
fi
@@ -7349,7 +7352,7 @@ echo "${ECHO_T}found msgfmt program is not GNU msgfmt; ignore it" >&6
if $XGETTEXT --omit-header /dev/null >/dev/null 2>&1; then
: ;
else
- echo "$as_me:7352: result: found xgettext program is not GNU xgettext; ignore it" >&5
+ echo "$as_me:7355: result: found xgettext program is not GNU xgettext; ignore it" >&5
echo "${ECHO_T}found xgettext program is not GNU xgettext; ignore it" >&6
XGETTEXT=":"
fi
@@ -7369,7 +7372,7 @@ echo "${ECHO_T}found xgettext program is not GNU xgettext; ignore it" >&6
do
# Extract the first word of "$ac_prog", so it can be a program name with args.
set dummy $ac_prog; ac_word=$2
-echo "$as_me:7372: checking for $ac_word" >&5
+echo "$as_me:7375: checking for $ac_word" >&5
echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
if test "${ac_cv_prog_INTLBISON+set}" = set; then
echo $ECHO_N "(cached) $ECHO_C" >&6
@@ -7384,7 +7387,7 @@ for ac_dir in $ac_dummy; do
test -z "$ac_dir" && ac_dir=.
$as_executable_p "$ac_dir/$ac_word" || continue
ac_cv_prog_INTLBISON="$ac_prog"
-echo "$as_me:7387: found $ac_dir/$ac_word" >&5
+echo "$as_me:7390: found $ac_dir/$ac_word" >&5
break
done
@@ -7392,10 +7395,10 @@ fi
fi
INTLBISON=$ac_cv_prog_INTLBISON
if test -n "$INTLBISON"; then
- echo "$as_me:7395: result: $INTLBISON" >&5
+ echo "$as_me:7398: result: $INTLBISON" >&5
echo "${ECHO_T}$INTLBISON" >&6
else
- echo "$as_me:7398: result: no" >&5
+ echo "$as_me:7401: result: no" >&5
echo "${ECHO_T}no" >&6
fi
@@ -7405,7 +7408,7 @@ done
if test -z "$INTLBISON"; then
ac_verc_fail=yes
else
- echo "$as_me:7408: checking version of bison" >&5
+ echo "$as_me:7411: checking version of bison" >&5
echo $ECHO_N "checking version of bison... $ECHO_C" >&6
ac_prog_version=`$INTLBISON --version 2>&1 | sed -n 's/^.*GNU Bison.* \([0-9]*\.[0-9.]*\).*$/\1/p'`
case $ac_prog_version in
@@ -7414,7 +7417,7 @@ echo $ECHO_N "checking version of bison... $ECHO_C" >&6
ac_prog_version="$ac_prog_version, ok"; ac_verc_fail=no;;
*) ac_prog_version="$ac_prog_version, bad"; ac_verc_fail=yes;;
esac
- echo "$as_me:7417: result: $ac_prog_version" >&5
+ echo "$as_me:7420: result: $ac_prog_version" >&5
echo "${ECHO_T}$ac_prog_version" >&6
fi
if test $ac_verc_fail = yes; then
@@ -7440,7 +7443,7 @@ echo "${ECHO_T}$ac_prog_version" >&6
if test "x$ALL_LINGUAS" = "x"; then
LINGUAS=
else
- echo "$as_me:7443: checking for catalogs to be installed" >&5
+ echo "$as_me:7446: checking for catalogs to be installed" >&5
echo $ECHO_N "checking for catalogs to be installed... $ECHO_C" >&6
NEW_LINGUAS=
for presentlang in $ALL_LINGUAS; do
@@ -7460,7 +7463,7 @@ echo $ECHO_N "checking for catalogs to be installed... $ECHO_C" >&6
fi
done
LINGUAS=$NEW_LINGUAS
- echo "$as_me:7463: result: $LINGUAS" >&5
+ echo "$as_me:7466: result: $LINGUAS" >&5
echo "${ECHO_T}$LINGUAS" >&6
fi
@@ -7495,7 +7498,7 @@ cf_makefile=makefile
use_our_messages=no
if test "$USE_NLS" = yes ; then
if test -d $srcdir/po ; then
-echo "$as_me:7498: checking if we should use included message-library" >&5
+echo "$as_me:7501: checking if we should use included message-library" >&5
echo $ECHO_N "checking if we should use included message-library... $ECHO_C" >&6
# Check whether --enable-included-msgs or --disable-included-msgs was given.
@@ -7506,7 +7509,7 @@ else
use_our_messages=yes
fi;
fi
-echo "$as_me:7509: result: $use_our_messages" >&5
+echo "$as_me:7512: result: $use_our_messages" >&5
echo "${ECHO_T}$use_our_messages" >&6
fi
@@ -7547,23 +7550,23 @@ else
for ac_header in libintl.h
do
as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh`
-echo "$as_me:7550: checking for $ac_header" >&5
+echo "$as_me:7553: checking for $ac_header" >&5
echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6
if eval "test \"\${$as_ac_Header+set}\" = set"; then
echo $ECHO_N "(cached) $ECHO_C" >&6
else
cat >conftest.$ac_ext <<_ACEOF
-#line 7556 "configure"
+#line 7559 "configure"
#include "confdefs.h"
#include <$ac_header>
_ACEOF
-if { (eval echo "$as_me:7560: \"$ac_cpp conftest.$ac_ext\"") >&5
+if { (eval echo "$as_me:7563: \"$ac_cpp conftest.$ac_ext\"") >&5
(eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
ac_status=$?
egrep -v '^ *\+' conftest.er1 >conftest.err
rm -f conftest.er1
cat conftest.err >&5
- echo "$as_me:7566: \$? = $ac_status" >&5
+ echo "$as_me:7569: \$? = $ac_status" >&5
(exit $ac_status); } >/dev/null; then
if test -s conftest.err; then
ac_cpp_err=$ac_c_preproc_warn_flag
@@ -7582,7 +7585,7 @@ else
fi
rm -f conftest.err conftest.$ac_ext
fi
-echo "$as_me:7585: result: `eval echo '${'$as_ac_Header'}'`" >&5
+echo "$as_me:7588: result: `eval echo '${'$as_ac_Header'}'`" >&5
echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6
if test `eval echo '${'$as_ac_Header'}'` = yes; then
cat >>confdefs.h <<EOF
@@ -7627,14 +7630,14 @@ EOF
fi
fi
-echo "$as_me:7630: checking if -lm needed for math functions" >&5
+echo "$as_me:7633: checking if -lm needed for math functions" >&5
echo $ECHO_N "checking if -lm needed for math functions... $ECHO_C" >&6
if test "${cf_cv_need_libm+set}" = set; then
echo $ECHO_N "(cached) $ECHO_C" >&6
else
cat >conftest.$ac_ext <<_ACEOF
-#line 7637 "configure"
+#line 7640 "configure"
#include "confdefs.h"
#include <stdio.h>
@@ -7649,16 +7652,16 @@ double x = rand(); printf("result = %g\n", sqrt(x))
}
_ACEOF
rm -f conftest.$ac_objext conftest$ac_exeext
-if { (eval echo "$as_me:7652: \"$ac_link\"") >&5
+if { (eval echo "$as_me:7655: \"$ac_link\"") >&5
(eval $ac_link) 2>&5
ac_status=$?
- echo "$as_me:7655: \$? = $ac_status" >&5
+ echo "$as_me:7658: \$? = $ac_status" >&5
(exit $ac_status); } &&
{ ac_try='test -s conftest$ac_exeext'
- { (eval echo "$as_me:7658: \"$ac_try\"") >&5
+ { (eval echo "$as_me:7661: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
- echo "$as_me:7661: \$? = $ac_status" >&5
+ echo "$as_me:7664: \$? = $ac_status" >&5
(exit $ac_status); }; }; then
cf_cv_need_libm=no
else
@@ -7668,7 +7671,7 @@ cf_cv_need_libm=yes
fi
rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext
fi
-echo "$as_me:7671: result: $cf_cv_need_libm" >&5
+echo "$as_me:7674: result: $cf_cv_need_libm" >&5
echo "${ECHO_T}$cf_cv_need_libm" >&6
if test "$cf_cv_need_libm" = yes
then
@@ -7677,7 +7680,7 @@ then
fi
-echo "$as_me:7680: checking if you want to use dmalloc for testing" >&5
+echo "$as_me:7683: checking if you want to use dmalloc for testing" >&5
echo $ECHO_N "checking if you want to use dmalloc for testing... $ECHO_C" >&6
# Check whether --with-dmalloc or --without-dmalloc was given.
@@ -7693,7 +7696,7 @@ EOF
else
with_dmalloc=
fi;
-echo "$as_me:7696: result: ${with_dmalloc:-no}" >&5
+echo "$as_me:7699: result: ${with_dmalloc:-no}" >&5
echo "${ECHO_T}${with_dmalloc:-no}" >&6
case .$with_cflags in #(vi
@@ -7787,23 +7790,23 @@ fi
esac
if test "$with_dmalloc" = yes ; then
- echo "$as_me:7790: checking for dmalloc.h" >&5
+ echo "$as_me:7793: checking for dmalloc.h" >&5
echo $ECHO_N "checking for dmalloc.h... $ECHO_C" >&6
if test "${ac_cv_header_dmalloc_h+set}" = set; then
echo $ECHO_N "(cached) $ECHO_C" >&6
else
cat >conftest.$ac_ext <<_ACEOF
-#line 7796 "configure"
+#line 7799 "configure"
#include "confdefs.h"
#include <dmalloc.h>
_ACEOF
-if { (eval echo "$as_me:7800: \"$ac_cpp conftest.$ac_ext\"") >&5
+if { (eval echo "$as_me:7803: \"$ac_cpp conftest.$ac_ext\"") >&5
(eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
ac_status=$?
egrep -v '^ *\+' conftest.er1 >conftest.err
rm -f conftest.er1
cat conftest.err >&5
- echo "$as_me:7806: \$? = $ac_status" >&5
+ echo "$as_me:7809: \$? = $ac_status" >&5
(exit $ac_status); } >/dev/null; then
if test -s conftest.err; then
ac_cpp_err=$ac_c_preproc_warn_flag
@@ -7822,11 +7825,11 @@ else
fi
rm -f conftest.err conftest.$ac_ext
fi
-echo "$as_me:7825: result: $ac_cv_header_dmalloc_h" >&5
+echo "$as_me:7828: result: $ac_cv_header_dmalloc_h" >&5
echo "${ECHO_T}$ac_cv_header_dmalloc_h" >&6
if test $ac_cv_header_dmalloc_h = yes; then
-echo "$as_me:7829: checking for dmalloc_debug in -ldmalloc" >&5
+echo "$as_me:7832: checking for dmalloc_debug in -ldmalloc" >&5
echo $ECHO_N "checking for dmalloc_debug in -ldmalloc... $ECHO_C" >&6
if test "${ac_cv_lib_dmalloc_dmalloc_debug+set}" = set; then
echo $ECHO_N "(cached) $ECHO_C" >&6
@@ -7834,7 +7837,7 @@ else
ac_check_lib_save_LIBS=$LIBS
LIBS="-ldmalloc $LIBS"
cat >conftest.$ac_ext <<_ACEOF
-#line 7837 "configure"
+#line 7840 "configure"
#include "confdefs.h"
/* Override any gcc2 internal prototype to avoid an error. */
@@ -7853,16 +7856,16 @@ dmalloc_debug ();
}
_ACEOF
rm -f conftest.$ac_objext conftest$ac_exeext
-if { (eval echo "$as_me:7856: \"$ac_link\"") >&5
+if { (eval echo "$as_me:7859: \"$ac_link\"") >&5
(eval $ac_link) 2>&5
ac_status=$?
- echo "$as_me:7859: \$? = $ac_status" >&5
+ echo "$as_me:7862: \$? = $ac_status" >&5
(exit $ac_status); } &&
{ ac_try='test -s conftest$ac_exeext'
- { (eval echo "$as_me:7862: \"$ac_try\"") >&5
+ { (eval echo "$as_me:7865: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
- echo "$as_me:7865: \$? = $ac_status" >&5
+ echo "$as_me:7868: \$? = $ac_status" >&5
(exit $ac_status); }; }; then
ac_cv_lib_dmalloc_dmalloc_debug=yes
else
@@ -7873,7 +7876,7 @@ fi
rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext
LIBS=$ac_check_lib_save_LIBS
fi
-echo "$as_me:7876: result: $ac_cv_lib_dmalloc_dmalloc_debug" >&5
+echo "$as_me:7879: result: $ac_cv_lib_dmalloc_dmalloc_debug" >&5
echo "${ECHO_T}$ac_cv_lib_dmalloc_dmalloc_debug" >&6
if test $ac_cv_lib_dmalloc_dmalloc_debug = yes; then
cat >>confdefs.h <<EOF
@@ -7888,7 +7891,7 @@ fi
fi
-echo "$as_me:7891: checking if you want to use dbmalloc for testing" >&5
+echo "$as_me:7894: checking if you want to use dbmalloc for testing" >&5
echo $ECHO_N "checking if you want to use dbmalloc for testing... $ECHO_C" >&6
# Check whether --with-dbmalloc or --without-dbmalloc was given.
@@ -7904,7 +7907,7 @@ EOF
else
with_dbmalloc=
fi;
-echo "$as_me:7907: result: ${with_dbmalloc:-no}" >&5
+echo "$as_me:7910: result: ${with_dbmalloc:-no}" >&5
echo "${ECHO_T}${with_dbmalloc:-no}" >&6
case .$with_cflags in #(vi
@@ -7998,23 +8001,23 @@ fi
esac
if test "$with_dbmalloc" = yes ; then
- echo "$as_me:8001: checking for dbmalloc.h" >&5
+ echo "$as_me:8004: checking for dbmalloc.h" >&5
echo $ECHO_N "checking for dbmalloc.h... $ECHO_C" >&6
if test "${ac_cv_header_dbmalloc_h+set}" = set; then
echo $ECHO_N "(cached) $ECHO_C" >&6
else
cat >conftest.$ac_ext <<_ACEOF
-#line 8007 "configure"
+#line 8010 "configure"
#include "confdefs.h"
#include <dbmalloc.h>
_ACEOF
-if { (eval echo "$as_me:8011: \"$ac_cpp conftest.$ac_ext\"") >&5
+if { (eval echo "$as_me:8014: \"$ac_cpp conftest.$ac_ext\"") >&5
(eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
ac_status=$?
egrep -v '^ *\+' conftest.er1 >conftest.err
rm -f conftest.er1
cat conftest.err >&5
- echo "$as_me:8017: \$? = $ac_status" >&5
+ echo "$as_me:8020: \$? = $ac_status" >&5
(exit $ac_status); } >/dev/null; then
if test -s conftest.err; then
ac_cpp_err=$ac_c_preproc_warn_flag
@@ -8033,11 +8036,11 @@ else
fi
rm -f conftest.err conftest.$ac_ext
fi
-echo "$as_me:8036: result: $ac_cv_header_dbmalloc_h" >&5
+echo "$as_me:8039: result: $ac_cv_header_dbmalloc_h" >&5
echo "${ECHO_T}$ac_cv_header_dbmalloc_h" >&6
if test $ac_cv_header_dbmalloc_h = yes; then
-echo "$as_me:8040: checking for debug_malloc in -ldbmalloc" >&5
+echo "$as_me:8043: checking for debug_malloc in -ldbmalloc" >&5
echo $ECHO_N "checking for debug_malloc in -ldbmalloc... $ECHO_C" >&6
if test "${ac_cv_lib_dbmalloc_debug_malloc+set}" = set; then
echo $ECHO_N "(cached) $ECHO_C" >&6
@@ -8045,7 +8048,7 @@ else
ac_check_lib_save_LIBS=$LIBS
LIBS="-ldbmalloc $LIBS"
cat >conftest.$ac_ext <<_ACEOF
-#line 8048 "configure"
+#line 8051 "configure"
#include "confdefs.h"
/* Override any gcc2 internal prototype to avoid an error. */
@@ -8064,16 +8067,16 @@ debug_malloc ();
}
_ACEOF
rm -f conftest.$ac_objext conftest$ac_exeext
-if { (eval echo "$as_me:8067: \"$ac_link\"") >&5
+if { (eval echo "$as_me:8070: \"$ac_link\"") >&5
(eval $ac_link) 2>&5
ac_status=$?
- echo "$as_me:8070: \$? = $ac_status" >&5
+ echo "$as_me:8073: \$? = $ac_status" >&5
(exit $ac_status); } &&
{ ac_try='test -s conftest$ac_exeext'
- { (eval echo "$as_me:8073: \"$ac_try\"") >&5
+ { (eval echo "$as_me:8076: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
- echo "$as_me:8076: \$? = $ac_status" >&5
+ echo "$as_me:8079: \$? = $ac_status" >&5
(exit $ac_status); }; }; then
ac_cv_lib_dbmalloc_debug_malloc=yes
else
@@ -8084,7 +8087,7 @@ fi
rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext
LIBS=$ac_check_lib_save_LIBS
fi
-echo "$as_me:8087: result: $ac_cv_lib_dbmalloc_debug_malloc" >&5
+echo "$as_me:8090: result: $ac_cv_lib_dbmalloc_debug_malloc" >&5
echo "${ECHO_T}$ac_cv_lib_dbmalloc_debug_malloc" >&6
if test $ac_cv_lib_dbmalloc_debug_malloc = yes; then
cat >>confdefs.h <<EOF
@@ -8099,7 +8102,7 @@ fi
fi
-echo "$as_me:8102: checking if you want to use purify for testing" >&5
+echo "$as_me:8105: checking if you want to use purify for testing" >&5
echo $ECHO_N "checking if you want to use purify for testing... $ECHO_C" >&6
# Check whether --with-purify or --without-purify was given.
@@ -8115,7 +8118,7 @@ EOF
else
with_purify=
fi;
-echo "$as_me:8118: result: ${with_purify:-no}" >&5
+echo "$as_me:8121: result: ${with_purify:-no}" >&5
echo "${ECHO_T}${with_purify:-no}" >&6
case .$with_cflags in #(vi
@@ -8208,7 +8211,7 @@ fi
;;
esac
-echo "$as_me:8211: checking if you want to use valgrind for testing" >&5
+echo "$as_me:8214: checking if you want to use valgrind for testing" >&5
echo $ECHO_N "checking if you want to use valgrind for testing... $ECHO_C" >&6
# Check whether --with-valgrind or --without-valgrind was given.
@@ -8224,7 +8227,7 @@ EOF
else
with_valgrind=
fi;
-echo "$as_me:8227: result: ${with_valgrind:-no}" >&5
+echo "$as_me:8230: result: ${with_valgrind:-no}" >&5
echo "${ECHO_T}${with_valgrind:-no}" >&6
case .$with_cflags in #(vi
@@ -8317,7 +8320,7 @@ fi
;;
esac
-echo "$as_me:8320: checking if you want to perform memory-leak testing" >&5
+echo "$as_me:8323: checking if you want to perform memory-leak testing" >&5
echo $ECHO_N "checking if you want to perform memory-leak testing... $ECHO_C" >&6
# Check whether --with-no-leaks or --without-no-leaks was given.
@@ -8339,10 +8342,10 @@ EOF
else
with_no_leaks=
fi;
-echo "$as_me:8342: result: $with_no_leaks" >&5
+echo "$as_me:8345: result: $with_no_leaks" >&5
echo "${ECHO_T}$with_no_leaks" >&6
-echo "$as_me:8345: checking if you want --trace option" >&5
+echo "$as_me:8348: checking if you want --trace option" >&5
echo $ECHO_N "checking if you want --trace option... $ECHO_C" >&6
# Check whether --enable-trace or --disable-trace was given.
@@ -8352,7 +8355,7 @@ if test "${enable_trace+set}" = set; then
else
enableval=yes
fi;
-echo "$as_me:8355: result: $enableval" >&5
+echo "$as_me:8358: result: $enableval" >&5
echo "${ECHO_T}$enableval" >&6
if test "$enableval" != no ; then
EXTRAOBJS="$EXTRAOBJS trace\$o"
@@ -8366,7 +8369,7 @@ fi
LIBTOOL_MAKE="#"
-echo "$as_me:8369: checking if libtool -version-number should be used" >&5
+echo "$as_me:8372: checking if libtool -version-number should be used" >&5
echo $ECHO_N "checking if libtool -version-number should be used... $ECHO_C" >&6
# Check whether --enable-libtool-version or --disable-libtool-version was given.
@@ -8383,7 +8386,7 @@ else
cf_libtool_version=yes
fi;
-echo "$as_me:8386: result: $cf_libtool_version" >&5
+echo "$as_me:8389: result: $cf_libtool_version" >&5
echo "${ECHO_T}$cf_libtool_version" >&6
if test "$cf_libtool_version" = yes ; then
@@ -8408,7 +8411,7 @@ LIB_LINK='${CC}'
LIB_INSTALL=
LIB_UNINSTALL=
-echo "$as_me:8411: checking if you want to build libraries with libtool" >&5
+echo "$as_me:8414: checking if you want to build libraries with libtool" >&5
echo $ECHO_N "checking if you want to build libraries with libtool... $ECHO_C" >&6
# Check whether --with-libtool or --without-libtool was given.
@@ -8418,7 +8421,7 @@ if test "${with_libtool+set}" = set; then
else
with_libtool=no
fi;
-echo "$as_me:8421: result: $with_libtool" >&5
+echo "$as_me:8424: result: $with_libtool" >&5
echo "${ECHO_T}$with_libtool" >&6
if test "$with_libtool" != "no"; then
@@ -8449,7 +8452,7 @@ case ".$with_libtool" in #(vi
with_libtool=`echo $with_libtool | sed -e s%NONE%$cf_path_syntax%`
;;
*)
- { { echo "$as_me:8452: error: expected a pathname, not \"$with_libtool\"" >&5
+ { { echo "$as_me:8455: error: expected a pathname, not \"$with_libtool\"" >&5
echo "$as_me: error: expected a pathname, not \"$with_libtool\"" >&2;}
{ (exit 1); exit 1; }; }
;;
@@ -8459,7 +8462,7 @@ esac
else
# Extract the first word of "libtool", so it can be a program name with args.
set dummy libtool; ac_word=$2
-echo "$as_me:8462: checking for $ac_word" >&5
+echo "$as_me:8465: checking for $ac_word" >&5
echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
if test "${ac_cv_path_LIBTOOL+set}" = set; then
echo $ECHO_N "(cached) $ECHO_C" >&6
@@ -8476,7 +8479,7 @@ for ac_dir in $ac_dummy; do
test -z "$ac_dir" && ac_dir=.
if $as_executable_p "$ac_dir/$ac_word"; then
ac_cv_path_LIBTOOL="$ac_dir/$ac_word"
- echo "$as_me:8479: found $ac_dir/$ac_word" >&5
+ echo "$as_me:8482: found $ac_dir/$ac_word" >&5
break
fi
done
@@ -8487,20 +8490,20 @@ fi
LIBTOOL=$ac_cv_path_LIBTOOL
if test -n "$LIBTOOL"; then
- echo "$as_me:8490: result: $LIBTOOL" >&5
+ echo "$as_me:8493: result: $LIBTOOL" >&5
echo "${ECHO_T}$LIBTOOL" >&6
else
- echo "$as_me:8493: result: no" >&5
+ echo "$as_me:8496: result: no" >&5
echo "${ECHO_T}no" >&6
fi
fi
if test -z "$LIBTOOL" ; then
- { { echo "$as_me:8499: error: Cannot find libtool" >&5
+ { { echo "$as_me:8502: error: Cannot find libtool" >&5
echo "$as_me: error: Cannot find libtool" >&2;}
{ (exit 1); exit 1; }; }
fi
- LIB_CREATE='${LIBTOOL} --mode=link ${CC} -rpath ${DESTDIR}${libdir} ${LIBTOOL_VERSION} `cut -f1 ${srcdir}/VERSION` ${LIBTOOL_OPTS} ${LT_UNDEF} -o'
+ LIB_CREATE='${LIBTOOL} --mode=link ${CC} -rpath ${DESTDIR}${libdir} ${LIBTOOL_VERSION} `cut -f1 ${srcdir}/VERSION` ${LIBTOOL_OPTS} ${LT_UNDEF} $(LIBS) -o'
LIB_OBJECT='${OBJECTS:.o=.lo}'
LIB_SUFFIX=.la
LIB_CLEAN='${LIBTOOL} --mode=clean'
@@ -8511,17 +8514,17 @@ echo "$as_me: error: Cannot find libtool" >&2;}
LIB_PREP=:
# Show the version of libtool
- echo "$as_me:8514: checking version of libtool" >&5
+ echo "$as_me:8517: checking version of libtool" >&5
echo $ECHO_N "checking version of libtool... $ECHO_C" >&6
# Save the version in a cache variable - this is not entirely a good
# thing, but the version string from libtool is very ugly, and for
# bug reports it might be useful to have the original string. "("
cf_cv_libtool_version=`$LIBTOOL --version 2>&1 | sed -e '/^$/d' |sed -e '2,$d' -e 's/([^)]*)//g' -e 's/^[^1-9]*//' -e 's/[^0-9.].*//'`
- echo "$as_me:8521: result: $cf_cv_libtool_version" >&5
+ echo "$as_me:8524: result: $cf_cv_libtool_version" >&5
echo "${ECHO_T}$cf_cv_libtool_version" >&6
if test -z "$cf_cv_libtool_version" ; then
- { { echo "$as_me:8524: error: This is not GNU libtool" >&5
+ { { echo "$as_me:8527: error: This is not GNU libtool" >&5
echo "$as_me: error: This is not GNU libtool" >&2;}
{ (exit 1); exit 1; }; }
fi
@@ -8555,7 +8558,7 @@ if test "$with_libtool" = "yes" ; then
OBJEXT="lo"
LIBTOOL_MAKE=
-echo "$as_me:8558: checking for additional libtool options" >&5
+echo "$as_me:8561: checking for additional libtool options" >&5
echo $ECHO_N "checking for additional libtool options... $ECHO_C" >&6
# Check whether --with-libtool-opts or --without-libtool-opts was given.
@@ -8565,7 +8568,7 @@ if test "${with_libtool_opts+set}" = set; then
else
with_libtool_opts=no
fi;
-echo "$as_me:8568: result: $with_libtool_opts" >&5
+echo "$as_me:8571: result: $with_libtool_opts" >&5
echo "${ECHO_T}$with_libtool_opts" >&6
case .$with_libtool_opts in
@@ -8578,7 +8581,7 @@ esac
fi
-echo "$as_me:8581: checking for specific curses-directory" >&5
+echo "$as_me:8584: checking for specific curses-directory" >&5
echo $ECHO_N "checking for specific curses-directory... $ECHO_C" >&6
# Check whether --with-curses-dir or --without-curses-dir was given.
@@ -8588,7 +8591,7 @@ if test "${with_curses_dir+set}" = set; then
else
cf_cv_curses_dir=no
fi;
-echo "$as_me:8591: result: $cf_cv_curses_dir" >&5
+echo "$as_me:8594: result: $cf_cv_curses_dir" >&5
echo "${ECHO_T}$cf_cv_curses_dir" >&6
if ( test -n "$cf_cv_curses_dir" && test "$cf_cv_curses_dir" != "no" )
@@ -8619,7 +8622,7 @@ case ".$withval" in #(vi
withval=`echo $withval | sed -e s%NONE%$cf_path_syntax%`
;;
*)
- { { echo "$as_me:8622: error: expected a pathname, not \"$withval\"" >&5
+ { { echo "$as_me:8625: error: expected a pathname, not \"$withval\"" >&5
echo "$as_me: error: expected a pathname, not \"$withval\"" >&2;}
{ (exit 1); exit 1; }; }
;;
@@ -8652,7 +8655,7 @@ if test -n "$cf_cv_curses_dir/include" ; then
cf_save_CPPFLAGS=$CPPFLAGS
CPPFLAGS="$CPPFLAGS -I$cf_add_incdir"
cat >conftest.$ac_ext <<_ACEOF
-#line 8655 "configure"
+#line 8658 "configure"
#include "confdefs.h"
#include <stdio.h>
int
@@ -8664,16 +8667,16 @@ printf("Hello")
}
_ACEOF
rm -f conftest.$ac_objext
-if { (eval echo "$as_me:8667: \"$ac_compile\"") >&5
+if { (eval echo "$as_me:8670: \"$ac_compile\"") >&5
(eval $ac_compile) 2>&5
ac_status=$?
- echo "$as_me:8670: \$? = $ac_status" >&5
+ echo "$as_me:8673: \$? = $ac_status" >&5
(exit $ac_status); } &&
{ ac_try='test -s conftest.$ac_objext'
- { (eval echo "$as_me:8673: \"$ac_try\"") >&5
+ { (eval echo "$as_me:8676: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
- echo "$as_me:8676: \$? = $ac_status" >&5
+ echo "$as_me:8679: \$? = $ac_status" >&5
(exit $ac_status); }; }; then
:
else
@@ -8690,7 +8693,7 @@ rm -f conftest.$ac_objext conftest.$ac_ext
if test "$cf_have_incdir" = no ; then
test -n "$verbose" && echo " adding $cf_add_incdir to include-path" 1>&6
-echo "${as_me:-configure}:8693: testing adding $cf_add_incdir to include-path ..." 1>&5
+echo "${as_me:-configure}:8696: testing adding $cf_add_incdir to include-path ..." 1>&5
CPPFLAGS="$CPPFLAGS -I$cf_add_incdir"
@@ -8724,7 +8727,7 @@ if test -n "$cf_cv_curses_dir/lib" ; then
if test "$cf_have_libdir" = no ; then
test -n "$verbose" && echo " adding $cf_add_libdir to library-path" 1>&6
-echo "${as_me:-configure}:8727: testing adding $cf_add_libdir to library-path ..." 1>&5
+echo "${as_me:-configure}:8730: testing adding $cf_add_libdir to library-path ..." 1>&5
LDFLAGS="-L$cf_add_libdir $LDFLAGS"
fi
@@ -8752,7 +8755,7 @@ if test $use_ncurses != no ; then
cf_wide_curses=yes
if test $use_ncurses = ncursesw ; then
-echo "$as_me:8755: checking for multibyte character support" >&5
+echo "$as_me:8758: checking for multibyte character support" >&5
echo $ECHO_N "checking for multibyte character support... $ECHO_C" >&6
if test "${cf_cv_utf8_lib+set}" = set; then
echo $ECHO_N "(cached) $ECHO_C" >&6
@@ -8760,7 +8763,7 @@ else
cf_save_LIBS="$LIBS"
cat >conftest.$ac_ext <<_ACEOF
-#line 8763 "configure"
+#line 8766 "configure"
#include "confdefs.h"
#include <stdlib.h>
@@ -8773,16 +8776,16 @@ putwc(0,0);
}
_ACEOF
rm -f conftest.$ac_objext conftest$ac_exeext
-if { (eval echo "$as_me:8776: \"$ac_link\"") >&5
+if { (eval echo "$as_me:8779: \"$ac_link\"") >&5
(eval $ac_link) 2>&5
ac_status=$?
- echo "$as_me:8779: \$? = $ac_status" >&5
+ echo "$as_me:8782: \$? = $ac_status" >&5
(exit $ac_status); } &&
{ ac_try='test -s conftest$ac_exeext'
- { (eval echo "$as_me:8782: \"$ac_try\"") >&5
+ { (eval echo "$as_me:8785: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
- echo "$as_me:8785: \$? = $ac_status" >&5
+ echo "$as_me:8788: \$? = $ac_status" >&5
(exit $ac_status); }; }; then
cf_cv_utf8_lib=yes
else
@@ -8794,12 +8797,12 @@ cat conftest.$ac_ext >&5
cf_cv_header_path_utf8=
cf_cv_library_path_utf8=
-echo "${as_me:-configure}:8797: testing Starting FIND_LINKAGE(utf8,) ..." 1>&5
+echo "${as_me:-configure}:8800: testing Starting FIND_LINKAGE(utf8,) ..." 1>&5
cf_save_LIBS="$LIBS"
cat >conftest.$ac_ext <<_ACEOF
-#line 8802 "configure"
+#line 8805 "configure"
#include "confdefs.h"
#include <libutf8.h>
@@ -8812,16 +8815,16 @@ putwc(0,0);
}
_ACEOF
rm -f conftest.$ac_objext conftest$ac_exeext
-if { (eval echo "$as_me:8815: \"$ac_link\"") >&5
+if { (eval echo "$as_me:8818: \"$ac_link\"") >&5
(eval $ac_link) 2>&5
ac_status=$?
- echo "$as_me:8818: \$? = $ac_status" >&5
+ echo "$as_me:8821: \$? = $ac_status" >&5
(exit $ac_status); } &&
{ ac_try='test -s conftest$ac_exeext'
- { (eval echo "$as_me:8821: \"$ac_try\"") >&5
+ { (eval echo "$as_me:8824: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
- echo "$as_me:8824: \$? = $ac_status" >&5
+ echo "$as_me:8827: \$? = $ac_status" >&5
(exit $ac_status); }; }; then
cf_cv_find_linkage_utf8=yes
@@ -8835,7 +8838,7 @@ cat conftest.$ac_ext >&5
LIBS="-lutf8 $cf_save_LIBS"
cat >conftest.$ac_ext <<_ACEOF
-#line 8838 "configure"
+#line 8841 "configure"
#include "confdefs.h"
#include <libutf8.h>
@@ -8848,16 +8851,16 @@ putwc(0,0);
}
_ACEOF
rm -f conftest.$ac_objext conftest$ac_exeext
-if { (eval echo "$as_me:8851: \"$ac_link\"") >&5
+if { (eval echo "$as_me:8854: \"$ac_link\"") >&5
(eval $ac_link) 2>&5
ac_status=$?
- echo "$as_me:8854: \$? = $ac_status" >&5
+ echo "$as_me:8857: \$? = $ac_status" >&5
(exit $ac_status); } &&
{ ac_try='test -s conftest$ac_exeext'
- { (eval echo "$as_me:8857: \"$ac_try\"") >&5
+ { (eval echo "$as_me:8860: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
- echo "$as_me:8860: \$? = $ac_status" >&5
+ echo "$as_me:8863: \$? = $ac_status" >&5
(exit $ac_status); }; }; then
cf_cv_find_linkage_utf8=yes
@@ -8874,9 +8877,9 @@ cat conftest.$ac_ext >&5
test -n "$verbose" && echo " find linkage for utf8 library" 1>&6
-echo "${as_me:-configure}:8877: testing find linkage for utf8 library ..." 1>&5
+echo "${as_me:-configure}:8880: testing find linkage for utf8 library ..." 1>&5
-echo "${as_me:-configure}:8879: testing Searching for headers in FIND_LINKAGE(utf8,) ..." 1>&5
+echo "${as_me:-configure}:8882: testing Searching for headers in FIND_LINKAGE(utf8,) ..." 1>&5
cf_save_CPPFLAGS="$CPPFLAGS"
cf_test_CPPFLAGS="$CPPFLAGS"
@@ -8989,11 +8992,11 @@ cf_search="$cf_search $cf_header_path_list"
if test -d $cf_cv_header_path_utf8 ; then
test -n "$verbose" && echo " ... testing $cf_cv_header_path_utf8" 1>&6
-echo "${as_me:-configure}:8992: testing ... testing $cf_cv_header_path_utf8 ..." 1>&5
+echo "${as_me:-configure}:8995: testing ... testing $cf_cv_header_path_utf8 ..." 1>&5
CPPFLAGS="$cf_save_CPPFLAGS -I$cf_cv_header_path_utf8"
cat >conftest.$ac_ext <<_ACEOF
-#line 8996 "configure"
+#line 8999 "configure"
#include "confdefs.h"
#include <libutf8.h>
@@ -9006,21 +9009,21 @@ putwc(0,0);
}
_ACEOF
rm -f conftest.$ac_objext
-if { (eval echo "$as_me:9009: \"$ac_compile\"") >&5
+if { (eval echo "$as_me:9012: \"$ac_compile\"") >&5
(eval $ac_compile) 2>&5
ac_status=$?
- echo "$as_me:9012: \$? = $ac_status" >&5
+ echo "$as_me:9015: \$? = $ac_status" >&5
(exit $ac_status); } &&
{ ac_try='test -s conftest.$ac_objext'
- { (eval echo "$as_me:9015: \"$ac_try\"") >&5
+ { (eval echo "$as_me:9018: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
- echo "$as_me:9018: \$? = $ac_status" >&5
+ echo "$as_me:9021: \$? = $ac_status" >&5
(exit $ac_status); }; }; then
test -n "$verbose" && echo " ... found utf8 headers in $cf_cv_header_path_utf8" 1>&6
-echo "${as_me:-configure}:9023: testing ... found utf8 headers in $cf_cv_header_path_utf8 ..." 1>&5
+echo "${as_me:-configure}:9026: testing ... found utf8 headers in $cf_cv_header_path_utf8 ..." 1>&5
cf_cv_find_linkage_utf8=maybe
cf_test_CPPFLAGS="$CPPFLAGS"
@@ -9038,7 +9041,7 @@ rm -f conftest.$ac_objext conftest.$ac_ext
if test "$cf_cv_find_linkage_utf8" = maybe ; then
-echo "${as_me:-configure}:9041: testing Searching for utf8 library in FIND_LINKAGE(utf8,) ..." 1>&5
+echo "${as_me:-configure}:9044: testing Searching for utf8 library in FIND_LINKAGE(utf8,) ..." 1>&5
cf_save_LIBS="$LIBS"
cf_save_LDFLAGS="$LDFLAGS"
@@ -9135,13 +9138,13 @@ cf_search="$cf_library_path_list $cf_search"
if test -d $cf_cv_library_path_utf8 ; then
test -n "$verbose" && echo " ... testing $cf_cv_library_path_utf8" 1>&6
-echo "${as_me:-configure}:9138: testing ... testing $cf_cv_library_path_utf8 ..." 1>&5
+echo "${as_me:-configure}:9141: testing ... testing $cf_cv_library_path_utf8 ..." 1>&5
CPPFLAGS="$cf_test_CPPFLAGS"
LIBS="-lutf8 $cf_save_LIBS"
LDFLAGS="$cf_save_LDFLAGS -L$cf_cv_library_path_utf8"
cat >conftest.$ac_ext <<_ACEOF
-#line 9144 "configure"
+#line 9147 "configure"
#include "confdefs.h"
#include <libutf8.h>
@@ -9154,21 +9157,21 @@ putwc(0,0);
}
_ACEOF
rm -f conftest.$ac_objext conftest$ac_exeext
-if { (eval echo "$as_me:9157: \"$ac_link\"") >&5
+if { (eval echo "$as_me:9160: \"$ac_link\"") >&5
(eval $ac_link) 2>&5
ac_status=$?
- echo "$as_me:9160: \$? = $ac_status" >&5
+ echo "$as_me:9163: \$? = $ac_status" >&5
(exit $ac_status); } &&
{ ac_try='test -s conftest$ac_exeext'
- { (eval echo "$as_me:9163: \"$ac_try\"") >&5
+ { (eval echo "$as_me:9166: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
- echo "$as_me:9166: \$? = $ac_status" >&5
+ echo "$as_me:9169: \$? = $ac_status" >&5
(exit $ac_status); }; }; then
test -n "$verbose" && echo " ... found utf8 library in $cf_cv_library_path_utf8" 1>&6
-echo "${as_me:-configure}:9171: testing ... found utf8 library in $cf_cv_library_path_utf8 ..." 1>&5
+echo "${as_me:-configure}:9174: testing ... found utf8 library in $cf_cv_library_path_utf8 ..." 1>&5
cf_cv_find_linkage_utf8=yes
cf_cv_library_file_utf8="-lutf8"
@@ -9210,7 +9213,7 @@ fi
fi
rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext
fi
-echo "$as_me:9213: result: $cf_cv_utf8_lib" >&5
+echo "$as_me:9216: result: $cf_cv_utf8_lib" >&5
echo "${ECHO_T}$cf_cv_utf8_lib" >&6
# HAVE_LIBUTF8_H is used by ncurses if curses.h is shared between
@@ -9244,7 +9247,7 @@ if test -n "$cf_cv_header_path_utf8" ; then
cf_save_CPPFLAGS=$CPPFLAGS
CPPFLAGS="$CPPFLAGS -I$cf_add_incdir"
cat >conftest.$ac_ext <<_ACEOF
-#line 9247 "configure"
+#line 9250 "configure"
#include "confdefs.h"
#include <stdio.h>
int
@@ -9256,16 +9259,16 @@ printf("Hello")
}
_ACEOF
rm -f conftest.$ac_objext
-if { (eval echo "$as_me:9259: \"$ac_compile\"") >&5
+if { (eval echo "$as_me:9262: \"$ac_compile\"") >&5
(eval $ac_compile) 2>&5
ac_status=$?
- echo "$as_me:9262: \$? = $ac_status" >&5
+ echo "$as_me:9265: \$? = $ac_status" >&5
(exit $ac_status); } &&
{ ac_try='test -s conftest.$ac_objext'
- { (eval echo "$as_me:9265: \"$ac_try\"") >&5
+ { (eval echo "$as_me:9268: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
- echo "$as_me:9268: \$? = $ac_status" >&5
+ echo "$as_me:9271: \$? = $ac_status" >&5
(exit $ac_status); }; }; then
:
else
@@ -9282,7 +9285,7 @@ rm -f conftest.$ac_objext conftest.$ac_ext
if test "$cf_have_incdir" = no ; then
test -n "$verbose" && echo " adding $cf_add_incdir to include-path" 1>&6
-echo "${as_me:-configure}:9285: testing adding $cf_add_incdir to include-path ..." 1>&5
+echo "${as_me:-configure}:9288: testing adding $cf_add_incdir to include-path ..." 1>&5
CPPFLAGS="$CPPFLAGS -I$cf_add_incdir"
@@ -9316,7 +9319,7 @@ if test -n "$cf_cv_library_path_utf8" ; then
if test "$cf_have_libdir" = no ; then
test -n "$verbose" && echo " adding $cf_add_libdir to library-path" 1>&6
-echo "${as_me:-configure}:9319: testing adding $cf_add_libdir to library-path ..." 1>&5
+echo "${as_me:-configure}:9322: testing adding $cf_add_libdir to library-path ..." 1>&5
LDFLAGS="-L$cf_add_libdir $LDFLAGS"
fi
@@ -9336,7 +9339,7 @@ for ac_prog in ${cf_ncuconfig_root}6-config ${cf_ncuconfig_root}5-config
do
# Extract the first word of "$ac_prog", so it can be a program name with args.
set dummy $ac_prog; ac_word=$2
-echo "$as_me:9339: checking for $ac_word" >&5
+echo "$as_me:9342: checking for $ac_word" >&5
echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
if test "${ac_cv_path_NCURSES_CONFIG+set}" = set; then
echo $ECHO_N "(cached) $ECHO_C" >&6
@@ -9353,7 +9356,7 @@ for ac_dir in $ac_dummy; do
test -z "$ac_dir" && ac_dir=.
if $as_executable_p "$ac_dir/$ac_word"; then
ac_cv_path_NCURSES_CONFIG="$ac_dir/$ac_word"
- echo "$as_me:9356: found $ac_dir/$ac_word" >&5
+ echo "$as_me:9359: found $ac_dir/$ac_word" >&5
break
fi
done
@@ -9364,10 +9367,10 @@ fi
NCURSES_CONFIG=$ac_cv_path_NCURSES_CONFIG
if test -n "$NCURSES_CONFIG"; then
- echo "$as_me:9367: result: $NCURSES_CONFIG" >&5
+ echo "$as_me:9370: result: $NCURSES_CONFIG" >&5
echo "${ECHO_T}$NCURSES_CONFIG" >&6
else
- echo "$as_me:9370: result: no" >&5
+ echo "$as_me:9373: result: no" >&5
echo "${ECHO_T}no" >&6
fi
@@ -9382,7 +9385,7 @@ LIBS="`$NCURSES_CONFIG --libs` $LIBS"
# even with config script, some packages use no-override for curses.h
-echo "$as_me:9385: checking if we have identified curses headers" >&5
+echo "$as_me:9388: checking if we have identified curses headers" >&5
echo $ECHO_N "checking if we have identified curses headers... $ECHO_C" >&6
if test "${cf_cv_ncurses_header+set}" = set; then
echo $ECHO_N "(cached) $ECHO_C" >&6
@@ -9390,13 +9393,13 @@ else
cf_cv_ncurses_header=none
for cf_header in \
- $use_ncurses/curses.h \
- $use_ncurses/ncurses.h \
- curses.h \
- ncurses.h
+ $use_ncurses/ncurses.h \
+ $use_ncurses/curses.h \
+ ncurses.h \
+ curses.h
do
cat >conftest.$ac_ext <<_ACEOF
-#line 9399 "configure"
+#line 9402 "configure"
#include "confdefs.h"
#include <${cf_header}>
int
@@ -9408,16 +9411,16 @@ initscr(); tgoto("?", 0,0)
}
_ACEOF
rm -f conftest.$ac_objext
-if { (eval echo "$as_me:9411: \"$ac_compile\"") >&5
+if { (eval echo "$as_me:9414: \"$ac_compile\"") >&5
(eval $ac_compile) 2>&5
ac_status=$?
- echo "$as_me:9414: \$? = $ac_status" >&5
+ echo "$as_me:9417: \$? = $ac_status" >&5
(exit $ac_status); } &&
{ ac_try='test -s conftest.$ac_objext'
- { (eval echo "$as_me:9417: \"$ac_try\"") >&5
+ { (eval echo "$as_me:9420: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
- echo "$as_me:9420: \$? = $ac_status" >&5
+ echo "$as_me:9423: \$? = $ac_status" >&5
(exit $ac_status); }; }; then
cf_cv_ncurses_header=$cf_header; break
else
@@ -9428,11 +9431,11 @@ rm -f conftest.$ac_objext conftest.$ac_ext
done
fi
-echo "$as_me:9431: result: $cf_cv_ncurses_header" >&5
+echo "$as_me:9434: result: $cf_cv_ncurses_header" >&5
echo "${ECHO_T}$cf_cv_ncurses_header" >&6
if test "$cf_cv_ncurses_header" = none ; then
- { { echo "$as_me:9435: error: No curses header-files found" >&5
+ { { echo "$as_me:9438: error: No curses header-files found" >&5
echo "$as_me: error: No curses header-files found" >&2;}
{ (exit 1); exit 1; }; }
fi
@@ -9442,23 +9445,23 @@ fi
for ac_header in $cf_cv_ncurses_header
do
as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh`
-echo "$as_me:9445: checking for $ac_header" >&5
+echo "$as_me:9448: checking for $ac_header" >&5
echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6
if eval "test \"\${$as_ac_Header+set}\" = set"; then
echo $ECHO_N "(cached) $ECHO_C" >&6
else
cat >conftest.$ac_ext <<_ACEOF
-#line 9451 "configure"
+#line 9454 "configure"
#include "confdefs.h"
#include <$ac_header>
_ACEOF
-if { (eval echo "$as_me:9455: \"$ac_cpp conftest.$ac_ext\"") >&5
+if { (eval echo "$as_me:9458: \"$ac_cpp conftest.$ac_ext\"") >&5
(eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
ac_status=$?
egrep -v '^ *\+' conftest.er1 >conftest.err
rm -f conftest.er1
cat conftest.err >&5
- echo "$as_me:9461: \$? = $ac_status" >&5
+ echo "$as_me:9464: \$? = $ac_status" >&5
(exit $ac_status); } >/dev/null; then
if test -s conftest.err; then
ac_cpp_err=$ac_c_preproc_warn_flag
@@ -9477,7 +9480,7 @@ else
fi
rm -f conftest.err conftest.$ac_ext
fi
-echo "$as_me:9480: result: `eval echo '${'$as_ac_Header'}'`" >&5
+echo "$as_me:9483: result: `eval echo '${'$as_ac_Header'}'`" >&5
echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6
if test `eval echo '${'$as_ac_Header'}'` = yes; then
cat >>confdefs.h <<EOF
@@ -9530,7 +9533,7 @@ if test -n "$cf_cv_curses_dir/include/$cf_ncuhdr_root" ; then
cf_save_CPPFLAGS=$CPPFLAGS
CPPFLAGS="$CPPFLAGS -I$cf_add_incdir"
cat >conftest.$ac_ext <<_ACEOF
-#line 9533 "configure"
+#line 9536 "configure"
#include "confdefs.h"
#include <stdio.h>
int
@@ -9542,16 +9545,16 @@ printf("Hello")
}
_ACEOF
rm -f conftest.$ac_objext
-if { (eval echo "$as_me:9545: \"$ac_compile\"") >&5
+if { (eval echo "$as_me:9548: \"$ac_compile\"") >&5
(eval $ac_compile) 2>&5
ac_status=$?
- echo "$as_me:9548: \$? = $ac_status" >&5
+ echo "$as_me:9551: \$? = $ac_status" >&5
(exit $ac_status); } &&
{ ac_try='test -s conftest.$ac_objext'
- { (eval echo "$as_me:9551: \"$ac_try\"") >&5
+ { (eval echo "$as_me:9554: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
- echo "$as_me:9554: \$? = $ac_status" >&5
+ echo "$as_me:9557: \$? = $ac_status" >&5
(exit $ac_status); }; }; then
:
else
@@ -9568,7 +9571,7 @@ rm -f conftest.$ac_objext conftest.$ac_ext
if test "$cf_have_incdir" = no ; then
test -n "$verbose" && echo " adding $cf_add_incdir to include-path" 1>&6
-echo "${as_me:-configure}:9571: testing adding $cf_add_incdir to include-path ..." 1>&5
+echo "${as_me:-configure}:9574: testing adding $cf_add_incdir to include-path ..." 1>&5
CPPFLAGS="$CPPFLAGS -I$cf_add_incdir"
@@ -9585,7 +9588,7 @@ fi
}
-echo "$as_me:9588: checking for $cf_ncuhdr_root header in include-path" >&5
+echo "$as_me:9591: checking for $cf_ncuhdr_root header in include-path" >&5
echo $ECHO_N "checking for $cf_ncuhdr_root header in include-path... $ECHO_C" >&6
if test "${cf_cv_ncurses_h+set}" = set; then
echo $ECHO_N "(cached) $ECHO_C" >&6
@@ -9597,7 +9600,7 @@ else
do
cat >conftest.$ac_ext <<_ACEOF
-#line 9600 "configure"
+#line 9603 "configure"
#include "confdefs.h"
#include <$cf_header>
@@ -9621,16 +9624,16 @@ printf("old\n");
}
_ACEOF
rm -f conftest.$ac_objext
-if { (eval echo "$as_me:9624: \"$ac_compile\"") >&5
+if { (eval echo "$as_me:9627: \"$ac_compile\"") >&5
(eval $ac_compile) 2>&5
ac_status=$?
- echo "$as_me:9627: \$? = $ac_status" >&5
+ echo "$as_me:9630: \$? = $ac_status" >&5
(exit $ac_status); } &&
{ ac_try='test -s conftest.$ac_objext'
- { (eval echo "$as_me:9630: \"$ac_try\"") >&5
+ { (eval echo "$as_me:9633: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
- echo "$as_me:9633: \$? = $ac_status" >&5
+ echo "$as_me:9636: \$? = $ac_status" >&5
(exit $ac_status); }; }; then
cf_cv_ncurses_h=$cf_header
@@ -9645,14 +9648,14 @@ rm -f conftest.$ac_objext conftest.$ac_ext
done
fi
-echo "$as_me:9648: result: $cf_cv_ncurses_h" >&5
+echo "$as_me:9651: result: $cf_cv_ncurses_h" >&5
echo "${ECHO_T}$cf_cv_ncurses_h" >&6
if test "$cf_cv_ncurses_h" != no ; then
cf_cv_ncurses_header=$cf_cv_ncurses_h
else
-echo "$as_me:9655: checking for $cf_ncuhdr_root include-path" >&5
+echo "$as_me:9658: checking for $cf_ncuhdr_root include-path" >&5
echo $ECHO_N "checking for $cf_ncuhdr_root include-path... $ECHO_C" >&6
if test "${cf_cv_ncurses_h2+set}" = set; then
echo $ECHO_N "(cached) $ECHO_C" >&6
@@ -9792,7 +9795,7 @@ if test -n "$cf_incdir" ; then
cf_save_CPPFLAGS=$CPPFLAGS
CPPFLAGS="$CPPFLAGS -I$cf_add_incdir"
cat >conftest.$ac_ext <<_ACEOF
-#line 9795 "configure"
+#line 9798 "configure"
#include "confdefs.h"
#include <stdio.h>
int
@@ -9804,16 +9807,16 @@ printf("Hello")
}
_ACEOF
rm -f conftest.$ac_objext
-if { (eval echo "$as_me:9807: \"$ac_compile\"") >&5
+if { (eval echo "$as_me:9810: \"$ac_compile\"") >&5
(eval $ac_compile) 2>&5
ac_status=$?
- echo "$as_me:9810: \$? = $ac_status" >&5
+ echo "$as_me:9813: \$? = $ac_status" >&5
(exit $ac_status); } &&
{ ac_try='test -s conftest.$ac_objext'
- { (eval echo "$as_me:9813: \"$ac_try\"") >&5
+ { (eval echo "$as_me:9816: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
- echo "$as_me:9816: \$? = $ac_status" >&5
+ echo "$as_me:9819: \$? = $ac_status" >&5
(exit $ac_status); }; }; then
:
else
@@ -9830,7 +9833,7 @@ rm -f conftest.$ac_objext conftest.$ac_ext
if test "$cf_have_incdir" = no ; then
test -n "$verbose" && echo " adding $cf_add_incdir to include-path" 1>&6
-echo "${as_me:-configure}:9833: testing adding $cf_add_incdir to include-path ..." 1>&5
+echo "${as_me:-configure}:9836: testing adding $cf_add_incdir to include-path ..." 1>&5
CPPFLAGS="$CPPFLAGS -I$cf_add_incdir"
@@ -9851,7 +9854,7 @@ fi
do
cat >conftest.$ac_ext <<_ACEOF
-#line 9854 "configure"
+#line 9857 "configure"
#include "confdefs.h"
#include <$cf_header>
@@ -9875,16 +9878,16 @@ printf("old\n");
}
_ACEOF
rm -f conftest.$ac_objext
-if { (eval echo "$as_me:9878: \"$ac_compile\"") >&5
+if { (eval echo "$as_me:9881: \"$ac_compile\"") >&5
(eval $ac_compile) 2>&5
ac_status=$?
- echo "$as_me:9881: \$? = $ac_status" >&5
+ echo "$as_me:9884: \$? = $ac_status" >&5
(exit $ac_status); } &&
{ ac_try='test -s conftest.$ac_objext'
- { (eval echo "$as_me:9884: \"$ac_try\"") >&5
+ { (eval echo "$as_me:9887: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
- echo "$as_me:9887: \$? = $ac_status" >&5
+ echo "$as_me:9890: \$? = $ac_status" >&5
(exit $ac_status); }; }; then
cf_cv_ncurses_h2=$cf_header
@@ -9905,12 +9908,12 @@ rm -f conftest.$ac_objext conftest.$ac_ext
CPPFLAGS="$cf_save2_CPPFLAGS"
test "$cf_cv_ncurses_h2" != no && break
done
- test "$cf_cv_ncurses_h2" = no && { { echo "$as_me:9908: error: not found" >&5
+ test "$cf_cv_ncurses_h2" = no && { { echo "$as_me:9911: error: not found" >&5
echo "$as_me: error: not found" >&2;}
{ (exit 1); exit 1; }; }
fi
-echo "$as_me:9913: result: $cf_cv_ncurses_h2" >&5
+echo "$as_me:9916: result: $cf_cv_ncurses_h2" >&5
echo "${ECHO_T}$cf_cv_ncurses_h2" >&6
cf_1st_incdir=`echo $cf_cv_ncurses_h2 | sed -e 's%/[^/]*$%%'`
@@ -9943,7 +9946,7 @@ if test -n "$cf_1st_incdir" ; then
cf_save_CPPFLAGS=$CPPFLAGS
CPPFLAGS="$CPPFLAGS -I$cf_add_incdir"
cat >conftest.$ac_ext <<_ACEOF
-#line 9946 "configure"
+#line 9949 "configure"
#include "confdefs.h"
#include <stdio.h>
int
@@ -9955,16 +9958,16 @@ printf("Hello")
}
_ACEOF
rm -f conftest.$ac_objext
-if { (eval echo "$as_me:9958: \"$ac_compile\"") >&5
+if { (eval echo "$as_me:9961: \"$ac_compile\"") >&5
(eval $ac_compile) 2>&5
ac_status=$?
- echo "$as_me:9961: \$? = $ac_status" >&5
+ echo "$as_me:9964: \$? = $ac_status" >&5
(exit $ac_status); } &&
{ ac_try='test -s conftest.$ac_objext'
- { (eval echo "$as_me:9964: \"$ac_try\"") >&5
+ { (eval echo "$as_me:9967: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
- echo "$as_me:9967: \$? = $ac_status" >&5
+ echo "$as_me:9970: \$? = $ac_status" >&5
(exit $ac_status); }; }; then
:
else
@@ -9981,7 +9984,7 @@ rm -f conftest.$ac_objext conftest.$ac_ext
if test "$cf_have_incdir" = no ; then
test -n "$verbose" && echo " adding $cf_add_incdir to include-path" 1>&6
-echo "${as_me:-configure}:9984: testing adding $cf_add_incdir to include-path ..." 1>&5
+echo "${as_me:-configure}:9987: testing adding $cf_add_incdir to include-path ..." 1>&5
CPPFLAGS="$CPPFLAGS -I$cf_add_incdir"
@@ -10024,7 +10027,7 @@ EOF
;;
esac
-echo "$as_me:10027: checking for terminfo header" >&5
+echo "$as_me:10030: checking for terminfo header" >&5
echo $ECHO_N "checking for terminfo header... $ECHO_C" >&6
if test "${cf_cv_term_header+set}" = set; then
echo $ECHO_N "(cached) $ECHO_C" >&6
@@ -10042,7 +10045,7 @@ esac
for cf_test in $cf_term_header "ncurses/term.h" "ncursesw/term.h"
do
cat >conftest.$ac_ext <<_ACEOF
-#line 10045 "configure"
+#line 10048 "configure"
#include "confdefs.h"
#include <stdio.h>
#include <${cf_cv_ncurses_header:-curses.h}>
@@ -10057,16 +10060,16 @@ int x = auto_left_margin
}
_ACEOF
rm -f conftest.$ac_objext
-if { (eval echo "$as_me:10060: \"$ac_compile\"") >&5
+if { (eval echo "$as_me:10063: \"$ac_compile\"") >&5
(eval $ac_compile) 2>&5
ac_status=$?
- echo "$as_me:10063: \$? = $ac_status" >&5
+ echo "$as_me:10066: \$? = $ac_status" >&5
(exit $ac_status); } &&
{ ac_try='test -s conftest.$ac_objext'
- { (eval echo "$as_me:10066: \"$ac_try\"") >&5
+ { (eval echo "$as_me:10069: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
- echo "$as_me:10069: \$? = $ac_status" >&5
+ echo "$as_me:10072: \$? = $ac_status" >&5
(exit $ac_status); }; }; then
cf_cv_term_header="$cf_test"
@@ -10082,7 +10085,7 @@ rm -f conftest.$ac_objext conftest.$ac_ext
done
fi
-echo "$as_me:10085: result: $cf_cv_term_header" >&5
+echo "$as_me:10088: result: $cf_cv_term_header" >&5
echo "${ECHO_T}$cf_cv_term_header" >&6
# Set definitions to allow ifdef'ing to accommodate subdirectories
@@ -10116,7 +10119,7 @@ cat >>confdefs.h <<\EOF
#define NCURSES 1
EOF
-echo "$as_me:10119: checking for ncurses version" >&5
+echo "$as_me:10122: checking for ncurses version" >&5
echo $ECHO_N "checking for ncurses version... $ECHO_C" >&6
if test "${cf_cv_ncurses_version+set}" = set; then
echo $ECHO_N "(cached) $ECHO_C" >&6
@@ -10142,10 +10145,10 @@ Autoconf "old"
#endif
EOF
cf_try="$ac_cpp conftest.$ac_ext 2>&5 | grep '^Autoconf ' >conftest.out"
- { (eval echo "$as_me:10145: \"$cf_try\"") >&5
+ { (eval echo "$as_me:10148: \"$cf_try\"") >&5
(eval $cf_try) 2>&5
ac_status=$?
- echo "$as_me:10148: \$? = $ac_status" >&5
+ echo "$as_me:10151: \$? = $ac_status" >&5
(exit $ac_status); }
if test -f conftest.out ; then
cf_out=`cat conftest.out | sed -e 's%^Autoconf %%' -e 's%^[^"]*"%%' -e 's%".*%%'`
@@ -10155,7 +10158,7 @@ EOF
else
cat >conftest.$ac_ext <<_ACEOF
-#line 10158 "configure"
+#line 10161 "configure"
#include "confdefs.h"
#include <${cf_cv_ncurses_header:-curses.h}>
@@ -10180,15 +10183,15 @@ int main()
}
_ACEOF
rm -f conftest$ac_exeext
-if { (eval echo "$as_me:10183: \"$ac_link\"") >&5
+if { (eval echo "$as_me:10186: \"$ac_link\"") >&5
(eval $ac_link) 2>&5
ac_status=$?
- echo "$as_me:10186: \$? = $ac_status" >&5
+ echo "$as_me:10189: \$? = $ac_status" >&5
(exit $ac_status); } && { ac_try='./conftest$ac_exeext'
- { (eval echo "$as_me:10188: \"$ac_try\"") >&5
+ { (eval echo "$as_me:10191: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
- echo "$as_me:10191: \$? = $ac_status" >&5
+ echo "$as_me:10194: \$? = $ac_status" >&5
(exit $ac_status); }; }; then
cf_cv_ncurses_version=`cat $cf_tempfile`
@@ -10202,7 +10205,7 @@ fi
rm -f $cf_tempfile
fi
-echo "$as_me:10205: result: $cf_cv_ncurses_version" >&5
+echo "$as_me:10208: result: $cf_cv_ncurses_version" >&5
echo "${ECHO_T}$cf_cv_ncurses_version" >&6
test "$cf_cv_ncurses_version" = no || cat >>confdefs.h <<\EOF
#define NCURSES 1
@@ -10214,7 +10217,7 @@ cf_nculib_root=$use_ncurses
# to link gpm.
cf_ncurses_LIBS=""
cf_ncurses_SAVE="$LIBS"
-echo "$as_me:10217: checking for Gpm_Open in -lgpm" >&5
+echo "$as_me:10220: checking for Gpm_Open in -lgpm" >&5
echo $ECHO_N "checking for Gpm_Open in -lgpm... $ECHO_C" >&6
if test "${ac_cv_lib_gpm_Gpm_Open+set}" = set; then
echo $ECHO_N "(cached) $ECHO_C" >&6
@@ -10222,7 +10225,7 @@ else
ac_check_lib_save_LIBS=$LIBS
LIBS="-lgpm $LIBS"
cat >conftest.$ac_ext <<_ACEOF
-#line 10225 "configure"
+#line 10228 "configure"
#include "confdefs.h"
/* Override any gcc2 internal prototype to avoid an error. */
@@ -10241,16 +10244,16 @@ Gpm_Open ();
}
_ACEOF
rm -f conftest.$ac_objext conftest$ac_exeext
-if { (eval echo "$as_me:10244: \"$ac_link\"") >&5
+if { (eval echo "$as_me:10247: \"$ac_link\"") >&5
(eval $ac_link) 2>&5
ac_status=$?
- echo "$as_me:10247: \$? = $ac_status" >&5
+ echo "$as_me:10250: \$? = $ac_status" >&5
(exit $ac_status); } &&
{ ac_try='test -s conftest$ac_exeext'
- { (eval echo "$as_me:10250: \"$ac_try\"") >&5
+ { (eval echo "$as_me:10253: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
- echo "$as_me:10253: \$? = $ac_status" >&5
+ echo "$as_me:10256: \$? = $ac_status" >&5
(exit $ac_status); }; }; then
ac_cv_lib_gpm_Gpm_Open=yes
else
@@ -10261,10 +10264,10 @@ fi
rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext
LIBS=$ac_check_lib_save_LIBS
fi
-echo "$as_me:10264: result: $ac_cv_lib_gpm_Gpm_Open" >&5
+echo "$as_me:10267: result: $ac_cv_lib_gpm_Gpm_Open" >&5
echo "${ECHO_T}$ac_cv_lib_gpm_Gpm_Open" >&6
if test $ac_cv_lib_gpm_Gpm_Open = yes; then
- echo "$as_me:10267: checking for initscr in -lgpm" >&5
+ echo "$as_me:10270: checking for initscr in -lgpm" >&5
echo $ECHO_N "checking for initscr in -lgpm... $ECHO_C" >&6
if test "${ac_cv_lib_gpm_initscr+set}" = set; then
echo $ECHO_N "(cached) $ECHO_C" >&6
@@ -10272,7 +10275,7 @@ else
ac_check_lib_save_LIBS=$LIBS
LIBS="-lgpm $LIBS"
cat >conftest.$ac_ext <<_ACEOF
-#line 10275 "configure"
+#line 10278 "configure"
#include "confdefs.h"
/* Override any gcc2 internal prototype to avoid an error. */
@@ -10291,16 +10294,16 @@ initscr ();
}
_ACEOF
rm -f conftest.$ac_objext conftest$ac_exeext
-if { (eval echo "$as_me:10294: \"$ac_link\"") >&5
+if { (eval echo "$as_me:10297: \"$ac_link\"") >&5
(eval $ac_link) 2>&5
ac_status=$?
- echo "$as_me:10297: \$? = $ac_status" >&5
+ echo "$as_me:10300: \$? = $ac_status" >&5
(exit $ac_status); } &&
{ ac_try='test -s conftest$ac_exeext'
- { (eval echo "$as_me:10300: \"$ac_try\"") >&5
+ { (eval echo "$as_me:10303: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
- echo "$as_me:10303: \$? = $ac_status" >&5
+ echo "$as_me:10306: \$? = $ac_status" >&5
(exit $ac_status); }; }; then
ac_cv_lib_gpm_initscr=yes
else
@@ -10311,7 +10314,7 @@ fi
rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext
LIBS=$ac_check_lib_save_LIBS
fi
-echo "$as_me:10314: result: $ac_cv_lib_gpm_initscr" >&5
+echo "$as_me:10317: result: $ac_cv_lib_gpm_initscr" >&5
echo "${ECHO_T}$ac_cv_lib_gpm_initscr" >&6
if test $ac_cv_lib_gpm_initscr = yes; then
LIBS="$cf_ncurses_SAVE"
@@ -10326,7 +10329,7 @@ freebsd*)
# This is only necessary if you are linking against an obsolete
# version of ncurses (but it should do no harm, since it's static).
if test "$cf_nculib_root" = ncurses ; then
- echo "$as_me:10329: checking for tgoto in -lmytinfo" >&5
+ echo "$as_me:10332: checking for tgoto in -lmytinfo" >&5
echo $ECHO_N "checking for tgoto in -lmytinfo... $ECHO_C" >&6
if test "${ac_cv_lib_mytinfo_tgoto+set}" = set; then
echo $ECHO_N "(cached) $ECHO_C" >&6
@@ -10334,7 +10337,7 @@ else
ac_check_lib_save_LIBS=$LIBS
LIBS="-lmytinfo $LIBS"
cat >conftest.$ac_ext <<_ACEOF
-#line 10337 "configure"
+#line 10340 "configure"
#include "confdefs.h"
/* Override any gcc2 internal prototype to avoid an error. */
@@ -10353,16 +10356,16 @@ tgoto ();
}
_ACEOF
rm -f conftest.$ac_objext conftest$ac_exeext
-if { (eval echo "$as_me:10356: \"$ac_link\"") >&5
+if { (eval echo "$as_me:10359: \"$ac_link\"") >&5
(eval $ac_link) 2>&5
ac_status=$?
- echo "$as_me:10359: \$? = $ac_status" >&5
+ echo "$as_me:10362: \$? = $ac_status" >&5
(exit $ac_status); } &&
{ ac_try='test -s conftest$ac_exeext'
- { (eval echo "$as_me:10362: \"$ac_try\"") >&5
+ { (eval echo "$as_me:10365: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
- echo "$as_me:10365: \$? = $ac_status" >&5
+ echo "$as_me:10368: \$? = $ac_status" >&5
(exit $ac_status); }; }; then
ac_cv_lib_mytinfo_tgoto=yes
else
@@ -10373,7 +10376,7 @@ fi
rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext
LIBS=$ac_check_lib_save_LIBS
fi
-echo "$as_me:10376: result: $ac_cv_lib_mytinfo_tgoto" >&5
+echo "$as_me:10379: result: $ac_cv_lib_mytinfo_tgoto" >&5
echo "${ECHO_T}$ac_cv_lib_mytinfo_tgoto" >&6
if test $ac_cv_lib_mytinfo_tgoto = yes; then
cf_ncurses_LIBS="-lmytinfo $cf_ncurses_LIBS"
@@ -10392,13 +10395,13 @@ else
eval 'cf_cv_have_lib_'$cf_nculib_root'=no'
cf_libdir=""
- echo "$as_me:10395: checking for initscr" >&5
+ echo "$as_me:10398: checking for initscr" >&5
echo $ECHO_N "checking for initscr... $ECHO_C" >&6
if test "${ac_cv_func_initscr+set}" = set; then
echo $ECHO_N "(cached) $ECHO_C" >&6
else
cat >conftest.$ac_ext <<_ACEOF
-#line 10401 "configure"
+#line 10404 "configure"
#include "confdefs.h"
/* System header to define __stub macros and hopefully few prototypes,
which can conflict with char initscr (); below. */
@@ -10429,16 +10432,16 @@ f = initscr;
}
_ACEOF
rm -f conftest.$ac_objext conftest$ac_exeext
-if { (eval echo "$as_me:10432: \"$ac_link\"") >&5
+if { (eval echo "$as_me:10435: \"$ac_link\"") >&5
(eval $ac_link) 2>&5
ac_status=$?
- echo "$as_me:10435: \$? = $ac_status" >&5
+ echo "$as_me:10438: \$? = $ac_status" >&5
(exit $ac_status); } &&
{ ac_try='test -s conftest$ac_exeext'
- { (eval echo "$as_me:10438: \"$ac_try\"") >&5
+ { (eval echo "$as_me:10441: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
- echo "$as_me:10441: \$? = $ac_status" >&5
+ echo "$as_me:10444: \$? = $ac_status" >&5
(exit $ac_status); }; }; then
ac_cv_func_initscr=yes
else
@@ -10448,18 +10451,18 @@ ac_cv_func_initscr=no
fi
rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext
fi
-echo "$as_me:10451: result: $ac_cv_func_initscr" >&5
+echo "$as_me:10454: result: $ac_cv_func_initscr" >&5
echo "${ECHO_T}$ac_cv_func_initscr" >&6
if test $ac_cv_func_initscr = yes; then
eval 'cf_cv_have_lib_'$cf_nculib_root'=yes'
else
cf_save_LIBS="$LIBS"
- echo "$as_me:10458: checking for initscr in -l$cf_nculib_root" >&5
+ echo "$as_me:10461: checking for initscr in -l$cf_nculib_root" >&5
echo $ECHO_N "checking for initscr in -l$cf_nculib_root... $ECHO_C" >&6
LIBS="-l$cf_nculib_root $LIBS"
cat >conftest.$ac_ext <<_ACEOF
-#line 10462 "configure"
+#line 10465 "configure"
#include "confdefs.h"
#include <${cf_cv_ncurses_header:-curses.h}>
int
@@ -10471,25 +10474,25 @@ initscr()
}
_ACEOF
rm -f conftest.$ac_objext conftest$ac_exeext
-if { (eval echo "$as_me:10474: \"$ac_link\"") >&5
+if { (eval echo "$as_me:10477: \"$ac_link\"") >&5
(eval $ac_link) 2>&5
ac_status=$?
- echo "$as_me:10477: \$? = $ac_status" >&5
+ echo "$as_me:10480: \$? = $ac_status" >&5
(exit $ac_status); } &&
{ ac_try='test -s conftest$ac_exeext'
- { (eval echo "$as_me:10480: \"$ac_try\"") >&5
+ { (eval echo "$as_me:10483: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
- echo "$as_me:10483: \$? = $ac_status" >&5
+ echo "$as_me:10486: \$? = $ac_status" >&5
(exit $ac_status); }; }; then
- echo "$as_me:10485: result: yes" >&5
+ echo "$as_me:10488: result: yes" >&5
echo "${ECHO_T}yes" >&6
eval 'cf_cv_have_lib_'$cf_nculib_root'=yes'
else
echo "$as_me: failed program was:" >&5
cat conftest.$ac_ext >&5
-echo "$as_me:10492: result: no" >&5
+echo "$as_me:10495: result: no" >&5
echo "${ECHO_T}no" >&6
cf_search=
@@ -10579,11 +10582,11 @@ cf_search="$cf_library_path_list $cf_search"
for cf_libdir in $cf_search
do
- echo "$as_me:10582: checking for -l$cf_nculib_root in $cf_libdir" >&5
+ echo "$as_me:10585: checking for -l$cf_nculib_root in $cf_libdir" >&5
echo $ECHO_N "checking for -l$cf_nculib_root in $cf_libdir... $ECHO_C" >&6
LIBS="-L$cf_libdir -l$cf_nculib_root $cf_save_LIBS"
cat >conftest.$ac_ext <<_ACEOF
-#line 10586 "configure"
+#line 10589 "configure"
#include "confdefs.h"
#include <${cf_cv_ncurses_header:-curses.h}>
int
@@ -10595,25 +10598,25 @@ initscr()
}
_ACEOF
rm -f conftest.$ac_objext conftest$ac_exeext
-if { (eval echo "$as_me:10598: \"$ac_link\"") >&5
+if { (eval echo "$as_me:10601: \"$ac_link\"") >&5
(eval $ac_link) 2>&5
ac_status=$?
- echo "$as_me:10601: \$? = $ac_status" >&5
+ echo "$as_me:10604: \$? = $ac_status" >&5
(exit $ac_status); } &&
{ ac_try='test -s conftest$ac_exeext'
- { (eval echo "$as_me:10604: \"$ac_try\"") >&5
+ { (eval echo "$as_me:10607: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
- echo "$as_me:10607: \$? = $ac_status" >&5
+ echo "$as_me:10610: \$? = $ac_status" >&5
(exit $ac_status); }; }; then
- echo "$as_me:10609: result: yes" >&5
+ echo "$as_me:10612: result: yes" >&5
echo "${ECHO_T}yes" >&6
eval 'cf_cv_have_lib_'$cf_nculib_root'=yes'
break
else
echo "$as_me: failed program was:" >&5
cat conftest.$ac_ext >&5
-echo "$as_me:10616: result: no" >&5
+echo "$as_me:10619: result: no" >&5
echo "${ECHO_T}no" >&6
LIBS="$cf_save_LIBS"
fi
@@ -10628,7 +10631,7 @@ fi
eval 'cf_found_library=$cf_cv_have_lib_'$cf_nculib_root
if test $cf_found_library = no ; then
- { { echo "$as_me:10631: error: Cannot link $cf_nculib_root library" >&5
+ { { echo "$as_me:10634: error: Cannot link $cf_nculib_root library" >&5
echo "$as_me: error: Cannot link $cf_nculib_root library" >&2;}
{ (exit 1); exit 1; }; }
fi
@@ -10636,7 +10639,7 @@ fi
fi
if test -n "$cf_ncurses_LIBS" ; then
- echo "$as_me:10639: checking if we can link $cf_nculib_root without $cf_ncurses_LIBS" >&5
+ echo "$as_me:10642: checking if we can link $cf_nculib_root without $cf_ncurses_LIBS" >&5
echo $ECHO_N "checking if we can link $cf_nculib_root without $cf_ncurses_LIBS... $ECHO_C" >&6
cf_ncurses_SAVE="$LIBS"
for p in $cf_ncurses_LIBS ; do
@@ -10646,7 +10649,7 @@ echo $ECHO_N "checking if we can link $cf_nculib_root without $cf_ncurses_LIBS..
fi
done
cat >conftest.$ac_ext <<_ACEOF
-#line 10649 "configure"
+#line 10652 "configure"
#include "confdefs.h"
#include <${cf_cv_ncurses_header:-curses.h}>
int
@@ -10658,23 +10661,23 @@ initscr(); mousemask(0,0); tgoto((char *)0, 0, 0);
}
_ACEOF
rm -f conftest.$ac_objext conftest$ac_exeext
-if { (eval echo "$as_me:10661: \"$ac_link\"") >&5
+if { (eval echo "$as_me:10664: \"$ac_link\"") >&5
(eval $ac_link) 2>&5
ac_status=$?
- echo "$as_me:10664: \$? = $ac_status" >&5
+ echo "$as_me:10667: \$? = $ac_status" >&5
(exit $ac_status); } &&
{ ac_try='test -s conftest$ac_exeext'
- { (eval echo "$as_me:10667: \"$ac_try\"") >&5
+ { (eval echo "$as_me:10670: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
- echo "$as_me:10670: \$? = $ac_status" >&5
+ echo "$as_me:10673: \$? = $ac_status" >&5
(exit $ac_status); }; }; then
- echo "$as_me:10672: result: yes" >&5
+ echo "$as_me:10675: result: yes" >&5
echo "${ECHO_T}yes" >&6
else
echo "$as_me: failed program was:" >&5
cat conftest.$ac_ext >&5
-echo "$as_me:10677: result: no" >&5
+echo "$as_me:10680: result: no" >&5
echo "${ECHO_T}no" >&6
LIBS="$cf_ncurses_SAVE"
fi
@@ -10692,7 +10695,7 @@ fi
else
cf_wide_curses=no
-echo "$as_me:10695: checking for extra include directories" >&5
+echo "$as_me:10698: checking for extra include directories" >&5
echo $ECHO_N "checking for extra include directories... $ECHO_C" >&6
if test "${cf_cv_curses_incdir+set}" = set; then
echo $ECHO_N "(cached) $ECHO_C" >&6
@@ -10701,22 +10704,28 @@ else
cf_cv_curses_incdir=no
case $host_os in #(vi
hpux10.*) #(vi
- test -d /usr/include/curses_colr && \
- cf_cv_curses_incdir="-I/usr/include/curses_colr"
+ if test "x$cf_cv_screen" = "xcurses_colr"
+ then
+ test -d /usr/include/curses_colr && \
+ cf_cv_curses_incdir="-I/usr/include/curses_colr"
+ fi
;;
sunos3*|sunos4*)
- test -d /usr/5lib && \
- test -d /usr/5include && \
- cf_cv_curses_incdir="-I/usr/5include"
+ if test "x$cf_cv_screen" = "xcurses_5lib"
+ then
+ test -d /usr/5lib && \
+ test -d /usr/5include && \
+ cf_cv_curses_incdir="-I/usr/5include"
+ fi
;;
esac
fi
-echo "$as_me:10715: result: $cf_cv_curses_incdir" >&5
+echo "$as_me:10724: result: $cf_cv_curses_incdir" >&5
echo "${ECHO_T}$cf_cv_curses_incdir" >&6
test "$cf_cv_curses_incdir" != no && CPPFLAGS="$CPPFLAGS $cf_cv_curses_incdir"
-echo "$as_me:10719: checking if we have identified curses headers" >&5
+echo "$as_me:10728: checking if we have identified curses headers" >&5
echo $ECHO_N "checking if we have identified curses headers... $ECHO_C" >&6
if test "${cf_cv_ncurses_header+set}" = set; then
echo $ECHO_N "(cached) $ECHO_C" >&6
@@ -10724,11 +10733,11 @@ else
cf_cv_ncurses_header=none
for cf_header in \
- curses.h \
- ncurses.h ncurses/curses.h ncurses/ncurses.h
+ ncurses.h \
+ curses.h ncurses/ncurses.h ncurses/curses.h
do
cat >conftest.$ac_ext <<_ACEOF
-#line 10731 "configure"
+#line 10740 "configure"
#include "confdefs.h"
#include <${cf_header}>
int
@@ -10740,16 +10749,16 @@ initscr(); tgoto("?", 0,0)
}
_ACEOF
rm -f conftest.$ac_objext
-if { (eval echo "$as_me:10743: \"$ac_compile\"") >&5
+if { (eval echo "$as_me:10752: \"$ac_compile\"") >&5
(eval $ac_compile) 2>&5
ac_status=$?
- echo "$as_me:10746: \$? = $ac_status" >&5
+ echo "$as_me:10755: \$? = $ac_status" >&5
(exit $ac_status); } &&
{ ac_try='test -s conftest.$ac_objext'
- { (eval echo "$as_me:10749: \"$ac_try\"") >&5
+ { (eval echo "$as_me:10758: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
- echo "$as_me:10752: \$? = $ac_status" >&5
+ echo "$as_me:10761: \$? = $ac_status" >&5
(exit $ac_status); }; }; then
cf_cv_ncurses_header=$cf_header; break
else
@@ -10760,11 +10769,11 @@ rm -f conftest.$ac_objext conftest.$ac_ext
done
fi
-echo "$as_me:10763: result: $cf_cv_ncurses_header" >&5
+echo "$as_me:10772: result: $cf_cv_ncurses_header" >&5
echo "${ECHO_T}$cf_cv_ncurses_header" >&6
if test "$cf_cv_ncurses_header" = none ; then
- { { echo "$as_me:10767: error: No curses header-files found" >&5
+ { { echo "$as_me:10776: error: No curses header-files found" >&5
echo "$as_me: error: No curses header-files found" >&2;}
{ (exit 1); exit 1; }; }
fi
@@ -10774,23 +10783,23 @@ fi
for ac_header in $cf_cv_ncurses_header
do
as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh`
-echo "$as_me:10777: checking for $ac_header" >&5
+echo "$as_me:10786: checking for $ac_header" >&5
echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6
if eval "test \"\${$as_ac_Header+set}\" = set"; then
echo $ECHO_N "(cached) $ECHO_C" >&6
else
cat >conftest.$ac_ext <<_ACEOF
-#line 10783 "configure"
+#line 10792 "configure"
#include "confdefs.h"
#include <$ac_header>
_ACEOF
-if { (eval echo "$as_me:10787: \"$ac_cpp conftest.$ac_ext\"") >&5
+if { (eval echo "$as_me:10796: \"$ac_cpp conftest.$ac_ext\"") >&5
(eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
ac_status=$?
egrep -v '^ *\+' conftest.er1 >conftest.err
rm -f conftest.er1
cat conftest.err >&5
- echo "$as_me:10793: \$? = $ac_status" >&5
+ echo "$as_me:10802: \$? = $ac_status" >&5
(exit $ac_status); } >/dev/null; then
if test -s conftest.err; then
ac_cpp_err=$ac_c_preproc_warn_flag
@@ -10809,7 +10818,7 @@ else
fi
rm -f conftest.err conftest.$ac_ext
fi
-echo "$as_me:10812: result: `eval echo '${'$as_ac_Header'}'`" >&5
+echo "$as_me:10821: result: `eval echo '${'$as_ac_Header'}'`" >&5
echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6
if test `eval echo '${'$as_ac_Header'}'` = yes; then
cat >>confdefs.h <<EOF
@@ -10819,7 +10828,7 @@ EOF
fi
done
-echo "$as_me:10822: checking for terminfo header" >&5
+echo "$as_me:10831: checking for terminfo header" >&5
echo $ECHO_N "checking for terminfo header... $ECHO_C" >&6
if test "${cf_cv_term_header+set}" = set; then
echo $ECHO_N "(cached) $ECHO_C" >&6
@@ -10837,7 +10846,7 @@ esac
for cf_test in $cf_term_header "ncurses/term.h" "ncursesw/term.h"
do
cat >conftest.$ac_ext <<_ACEOF
-#line 10840 "configure"
+#line 10849 "configure"
#include "confdefs.h"
#include <stdio.h>
#include <${cf_cv_ncurses_header:-curses.h}>
@@ -10852,16 +10861,16 @@ int x = auto_left_margin
}
_ACEOF
rm -f conftest.$ac_objext
-if { (eval echo "$as_me:10855: \"$ac_compile\"") >&5
+if { (eval echo "$as_me:10864: \"$ac_compile\"") >&5
(eval $ac_compile) 2>&5
ac_status=$?
- echo "$as_me:10858: \$? = $ac_status" >&5
+ echo "$as_me:10867: \$? = $ac_status" >&5
(exit $ac_status); } &&
{ ac_try='test -s conftest.$ac_objext'
- { (eval echo "$as_me:10861: \"$ac_try\"") >&5
+ { (eval echo "$as_me:10870: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
- echo "$as_me:10864: \$? = $ac_status" >&5
+ echo "$as_me:10873: \$? = $ac_status" >&5
(exit $ac_status); }; }; then
cf_cv_term_header="$cf_test"
@@ -10877,7 +10886,7 @@ rm -f conftest.$ac_objext conftest.$ac_ext
done
fi
-echo "$as_me:10880: result: $cf_cv_term_header" >&5
+echo "$as_me:10889: result: $cf_cv_term_header" >&5
echo "${ECHO_T}$cf_cv_term_header" >&6
# Set definitions to allow ifdef'ing to accommodate subdirectories
@@ -10906,7 +10915,7 @@ EOF
;;
esac
-echo "$as_me:10909: checking for ncurses version" >&5
+echo "$as_me:10918: checking for ncurses version" >&5
echo $ECHO_N "checking for ncurses version... $ECHO_C" >&6
if test "${cf_cv_ncurses_version+set}" = set; then
echo $ECHO_N "(cached) $ECHO_C" >&6
@@ -10932,10 +10941,10 @@ Autoconf "old"
#endif
EOF
cf_try="$ac_cpp conftest.$ac_ext 2>&5 | grep '^Autoconf ' >conftest.out"
- { (eval echo "$as_me:10935: \"$cf_try\"") >&5
+ { (eval echo "$as_me:10944: \"$cf_try\"") >&5
(eval $cf_try) 2>&5
ac_status=$?
- echo "$as_me:10938: \$? = $ac_status" >&5
+ echo "$as_me:10947: \$? = $ac_status" >&5
(exit $ac_status); }
if test -f conftest.out ; then
cf_out=`cat conftest.out | sed -e 's%^Autoconf %%' -e 's%^[^"]*"%%' -e 's%".*%%'`
@@ -10945,7 +10954,7 @@ EOF
else
cat >conftest.$ac_ext <<_ACEOF
-#line 10948 "configure"
+#line 10957 "configure"
#include "confdefs.h"
#include <${cf_cv_ncurses_header:-curses.h}>
@@ -10970,15 +10979,15 @@ int main()
}
_ACEOF
rm -f conftest$ac_exeext
-if { (eval echo "$as_me:10973: \"$ac_link\"") >&5
+if { (eval echo "$as_me:10982: \"$ac_link\"") >&5
(eval $ac_link) 2>&5
ac_status=$?
- echo "$as_me:10976: \$? = $ac_status" >&5
+ echo "$as_me:10985: \$? = $ac_status" >&5
(exit $ac_status); } && { ac_try='./conftest$ac_exeext'
- { (eval echo "$as_me:10978: \"$ac_try\"") >&5
+ { (eval echo "$as_me:10987: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
- echo "$as_me:10981: \$? = $ac_status" >&5
+ echo "$as_me:10990: \$? = $ac_status" >&5
(exit $ac_status); }; }; then
cf_cv_ncurses_version=`cat $cf_tempfile`
@@ -10992,16 +11001,16 @@ fi
rm -f $cf_tempfile
fi
-echo "$as_me:10995: result: $cf_cv_ncurses_version" >&5
+echo "$as_me:11004: result: $cf_cv_ncurses_version" >&5
echo "${ECHO_T}$cf_cv_ncurses_version" >&6
test "$cf_cv_ncurses_version" = no || cat >>confdefs.h <<\EOF
#define NCURSES 1
EOF
-echo "$as_me:11001: checking if we have identified curses libraries" >&5
+echo "$as_me:11010: checking if we have identified curses libraries" >&5
echo $ECHO_N "checking if we have identified curses libraries... $ECHO_C" >&6
cat >conftest.$ac_ext <<_ACEOF
-#line 11004 "configure"
+#line 11013 "configure"
#include "confdefs.h"
#include <${cf_cv_ncurses_header:-curses.h}>
int
@@ -11013,16 +11022,16 @@ initscr(); tgoto("?", 0,0)
}
_ACEOF
rm -f conftest.$ac_objext conftest$ac_exeext
-if { (eval echo "$as_me:11016: \"$ac_link\"") >&5
+if { (eval echo "$as_me:11025: \"$ac_link\"") >&5
(eval $ac_link) 2>&5
ac_status=$?
- echo "$as_me:11019: \$? = $ac_status" >&5
+ echo "$as_me:11028: \$? = $ac_status" >&5
(exit $ac_status); } &&
{ ac_try='test -s conftest$ac_exeext'
- { (eval echo "$as_me:11022: \"$ac_try\"") >&5
+ { (eval echo "$as_me:11031: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
- echo "$as_me:11025: \$? = $ac_status" >&5
+ echo "$as_me:11034: \$? = $ac_status" >&5
(exit $ac_status); }; }; then
cf_result=yes
else
@@ -11031,13 +11040,13 @@ cat conftest.$ac_ext >&5
cf_result=no
fi
rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext
-echo "$as_me:11034: result: $cf_result" >&5
+echo "$as_me:11043: result: $cf_result" >&5
echo "${ECHO_T}$cf_result" >&6
if test "$cf_result" = no ; then
case $host_os in #(vi
freebsd*) #(vi
- echo "$as_me:11040: checking for tgoto in -lmytinfo" >&5
+ echo "$as_me:11049: checking for tgoto in -lmytinfo" >&5
echo $ECHO_N "checking for tgoto in -lmytinfo... $ECHO_C" >&6
if test "${ac_cv_lib_mytinfo_tgoto+set}" = set; then
echo $ECHO_N "(cached) $ECHO_C" >&6
@@ -11045,7 +11054,7 @@ else
ac_check_lib_save_LIBS=$LIBS
LIBS="-lmytinfo $LIBS"
cat >conftest.$ac_ext <<_ACEOF
-#line 11048 "configure"
+#line 11057 "configure"
#include "confdefs.h"
/* Override any gcc2 internal prototype to avoid an error. */
@@ -11064,16 +11073,16 @@ tgoto ();
}
_ACEOF
rm -f conftest.$ac_objext conftest$ac_exeext
-if { (eval echo "$as_me:11067: \"$ac_link\"") >&5
+if { (eval echo "$as_me:11076: \"$ac_link\"") >&5
(eval $ac_link) 2>&5
ac_status=$?
- echo "$as_me:11070: \$? = $ac_status" >&5
+ echo "$as_me:11079: \$? = $ac_status" >&5
(exit $ac_status); } &&
{ ac_try='test -s conftest$ac_exeext'
- { (eval echo "$as_me:11073: \"$ac_try\"") >&5
+ { (eval echo "$as_me:11082: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
- echo "$as_me:11076: \$? = $ac_status" >&5
+ echo "$as_me:11085: \$? = $ac_status" >&5
(exit $ac_status); }; }; then
ac_cv_lib_mytinfo_tgoto=yes
else
@@ -11084,7 +11093,7 @@ fi
rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext
LIBS=$ac_check_lib_save_LIBS
fi
-echo "$as_me:11087: result: $ac_cv_lib_mytinfo_tgoto" >&5
+echo "$as_me:11096: result: $ac_cv_lib_mytinfo_tgoto" >&5
echo "${ECHO_T}$ac_cv_lib_mytinfo_tgoto" >&6
if test $ac_cv_lib_mytinfo_tgoto = yes; then
LIBS="-lmytinfo $LIBS"
@@ -11092,7 +11101,13 @@ fi
;;
hpux10.*) #(vi
- echo "$as_me:11095: checking for initscr in -lcur_colr" >&5
+ # Looking at HPUX 10.20, the Hcurses library is the oldest (1997), cur_colr
+ # next (1998), and xcurses "newer" (2000). There is no header file for
+ # Hcurses; the subdirectory curses_colr has the headers (curses.h and
+ # term.h) for cur_colr
+ if test "x$cf_cv_screen" = "xcurses_colr"
+ then
+ echo "$as_me:11110: checking for initscr in -lcur_colr" >&5
echo $ECHO_N "checking for initscr in -lcur_colr... $ECHO_C" >&6
if test "${ac_cv_lib_cur_colr_initscr+set}" = set; then
echo $ECHO_N "(cached) $ECHO_C" >&6
@@ -11100,7 +11115,7 @@ else
ac_check_lib_save_LIBS=$LIBS
LIBS="-lcur_colr $LIBS"
cat >conftest.$ac_ext <<_ACEOF
-#line 11103 "configure"
+#line 11118 "configure"
#include "confdefs.h"
/* Override any gcc2 internal prototype to avoid an error. */
@@ -11119,16 +11134,16 @@ initscr ();
}
_ACEOF
rm -f conftest.$ac_objext conftest$ac_exeext
-if { (eval echo "$as_me:11122: \"$ac_link\"") >&5
+if { (eval echo "$as_me:11137: \"$ac_link\"") >&5
(eval $ac_link) 2>&5
ac_status=$?
- echo "$as_me:11125: \$? = $ac_status" >&5
+ echo "$as_me:11140: \$? = $ac_status" >&5
(exit $ac_status); } &&
{ ac_try='test -s conftest$ac_exeext'
- { (eval echo "$as_me:11128: \"$ac_try\"") >&5
+ { (eval echo "$as_me:11143: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
- echo "$as_me:11131: \$? = $ac_status" >&5
+ echo "$as_me:11146: \$? = $ac_status" >&5
(exit $ac_status); }; }; then
ac_cv_lib_cur_colr_initscr=yes
else
@@ -11139,16 +11154,16 @@ fi
rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext
LIBS=$ac_check_lib_save_LIBS
fi
-echo "$as_me:11142: result: $ac_cv_lib_cur_colr_initscr" >&5
+echo "$as_me:11157: result: $ac_cv_lib_cur_colr_initscr" >&5
echo "${ECHO_T}$ac_cv_lib_cur_colr_initscr" >&6
if test $ac_cv_lib_cur_colr_initscr = yes; then
- LIBS="-lcur_colr $LIBS"
- ac_cv_func_initscr=yes
+ LIBS="-lcur_colr $LIBS"
+ ac_cv_func_initscr=yes
else
- echo "$as_me:11151: checking for initscr in -lHcurses" >&5
+ echo "$as_me:11166: checking for initscr in -lHcurses" >&5
echo $ECHO_N "checking for initscr in -lHcurses... $ECHO_C" >&6
if test "${ac_cv_lib_Hcurses_initscr+set}" = set; then
echo $ECHO_N "(cached) $ECHO_C" >&6
@@ -11156,7 +11171,7 @@ else
ac_check_lib_save_LIBS=$LIBS
LIBS="-lHcurses $LIBS"
cat >conftest.$ac_ext <<_ACEOF
-#line 11159 "configure"
+#line 11174 "configure"
#include "confdefs.h"
/* Override any gcc2 internal prototype to avoid an error. */
@@ -11175,16 +11190,16 @@ initscr ();
}
_ACEOF
rm -f conftest.$ac_objext conftest$ac_exeext
-if { (eval echo "$as_me:11178: \"$ac_link\"") >&5
+if { (eval echo "$as_me:11193: \"$ac_link\"") >&5
(eval $ac_link) 2>&5
ac_status=$?
- echo "$as_me:11181: \$? = $ac_status" >&5
+ echo "$as_me:11196: \$? = $ac_status" >&5
(exit $ac_status); } &&
{ ac_try='test -s conftest$ac_exeext'
- { (eval echo "$as_me:11184: \"$ac_try\"") >&5
+ { (eval echo "$as_me:11199: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
- echo "$as_me:11187: \$? = $ac_status" >&5
+ echo "$as_me:11202: \$? = $ac_status" >&5
(exit $ac_status); }; }; then
ac_cv_lib_Hcurses_initscr=yes
else
@@ -11195,22 +11210,23 @@ fi
rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext
LIBS=$ac_check_lib_save_LIBS
fi
-echo "$as_me:11198: result: $ac_cv_lib_Hcurses_initscr" >&5
+echo "$as_me:11213: result: $ac_cv_lib_Hcurses_initscr" >&5
echo "${ECHO_T}$ac_cv_lib_Hcurses_initscr" >&6
if test $ac_cv_lib_Hcurses_initscr = yes; then
- # HP's header uses __HP_CURSES, but user claims _HP_CURSES.
- LIBS="-lHcurses $LIBS"
- CPPFLAGS="$CPPFLAGS -D__HP_CURSES -D_HP_CURSES"
- ac_cv_func_initscr=yes
+ # HP's header uses __HP_CURSES, but user claims _HP_CURSES.
+ LIBS="-lHcurses $LIBS"
+ CPPFLAGS="$CPPFLAGS -D__HP_CURSES -D_HP_CURSES"
+ ac_cv_func_initscr=yes
fi
fi
+ fi
;;
linux*)
- case `arch` in
+ case `arch 2>/dev/null` in
x86_64)
if test -d /lib64
then
@@ -11234,7 +11250,7 @@ if test -n "/lib64" ; then
if test "$cf_have_libdir" = no ; then
test -n "$verbose" && echo " adding $cf_add_libdir to library-path" 1>&6
-echo "${as_me:-configure}:11237: testing adding $cf_add_libdir to library-path ..." 1>&5
+echo "${as_me:-configure}:11253: testing adding $cf_add_libdir to library-path ..." 1>&5
LDFLAGS="-L$cf_add_libdir $LDFLAGS"
fi
@@ -11263,7 +11279,7 @@ if test -n "/lib" ; then
if test "$cf_have_libdir" = no ; then
test -n "$verbose" && echo " adding $cf_add_libdir to library-path" 1>&6
-echo "${as_me:-configure}:11266: testing adding $cf_add_libdir to library-path ..." 1>&5
+echo "${as_me:-configure}:11282: testing adding $cf_add_libdir to library-path ..." 1>&5
LDFLAGS="-L$cf_add_libdir $LDFLAGS"
fi
@@ -11294,7 +11310,7 @@ if test -n "/lib" ; then
if test "$cf_have_libdir" = no ; then
test -n "$verbose" && echo " adding $cf_add_libdir to library-path" 1>&6
-echo "${as_me:-configure}:11297: testing adding $cf_add_libdir to library-path ..." 1>&5
+echo "${as_me:-configure}:11313: testing adding $cf_add_libdir to library-path ..." 1>&5
LDFLAGS="-L$cf_add_libdir $LDFLAGS"
fi
@@ -11306,7 +11322,9 @@ fi
esac
;;
sunos3*|sunos4*)
- if test -d /usr/5lib ; then
+ if test "x$cf_cv_screen" = "xcurses_5lib"
+ then
+ if test -d /usr/5lib ; then
if test -n "/usr/5lib" ; then
for cf_add_libdir in /usr/5lib
@@ -11327,7 +11345,7 @@ if test -n "/usr/5lib" ; then
if test "$cf_have_libdir" = no ; then
test -n "$verbose" && echo " adding $cf_add_libdir to library-path" 1>&6
-echo "${as_me:-configure}:11330: testing adding $cf_add_libdir to library-path ..." 1>&5
+echo "${as_me:-configure}:11348: testing adding $cf_add_libdir to library-path ..." 1>&5
LDFLAGS="-L$cf_add_libdir $LDFLAGS"
fi
@@ -11335,7 +11353,8 @@ echo "${as_me:-configure}:11330: testing adding $cf_add_libdir to library-path .
done
fi
- LIBS="-lcurses -ltermcap $LIBS"
+ LIBS="-lcurses -ltermcap $LIBS"
+ fi
fi
ac_cv_func_initscr=yes
;;
@@ -11355,13 +11374,13 @@ if test ".$ac_cv_func_initscr" != .yes ; then
# Check for library containing tgoto. Do this before curses library
# because it may be needed to link the test-case for initscr.
- echo "$as_me:11358: checking for tgoto" >&5
+ echo "$as_me:11377: checking for tgoto" >&5
echo $ECHO_N "checking for tgoto... $ECHO_C" >&6
if test "${ac_cv_func_tgoto+set}" = set; then
echo $ECHO_N "(cached) $ECHO_C" >&6
else
cat >conftest.$ac_ext <<_ACEOF
-#line 11364 "configure"
+#line 11383 "configure"
#include "confdefs.h"
/* System header to define __stub macros and hopefully few prototypes,
which can conflict with char tgoto (); below. */
@@ -11392,16 +11411,16 @@ f = tgoto;
}
_ACEOF
rm -f conftest.$ac_objext conftest$ac_exeext
-if { (eval echo "$as_me:11395: \"$ac_link\"") >&5
+if { (eval echo "$as_me:11414: \"$ac_link\"") >&5
(eval $ac_link) 2>&5
ac_status=$?
- echo "$as_me:11398: \$? = $ac_status" >&5
+ echo "$as_me:11417: \$? = $ac_status" >&5
(exit $ac_status); } &&
{ ac_try='test -s conftest$ac_exeext'
- { (eval echo "$as_me:11401: \"$ac_try\"") >&5
+ { (eval echo "$as_me:11420: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
- echo "$as_me:11404: \$? = $ac_status" >&5
+ echo "$as_me:11423: \$? = $ac_status" >&5
(exit $ac_status); }; }; then
ac_cv_func_tgoto=yes
else
@@ -11411,7 +11430,7 @@ ac_cv_func_tgoto=no
fi
rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext
fi
-echo "$as_me:11414: result: $ac_cv_func_tgoto" >&5
+echo "$as_me:11433: result: $ac_cv_func_tgoto" >&5
echo "${ECHO_T}$ac_cv_func_tgoto" >&6
if test $ac_cv_func_tgoto = yes; then
cf_term_lib=predefined
@@ -11420,7 +11439,7 @@ else
for cf_term_lib in $cf_check_list termcap termlib unknown
do
as_ac_Lib=`echo "ac_cv_lib_$cf_term_lib''_tgoto" | $as_tr_sh`
-echo "$as_me:11423: checking for tgoto in -l$cf_term_lib" >&5
+echo "$as_me:11442: checking for tgoto in -l$cf_term_lib" >&5
echo $ECHO_N "checking for tgoto in -l$cf_term_lib... $ECHO_C" >&6
if eval "test \"\${$as_ac_Lib+set}\" = set"; then
echo $ECHO_N "(cached) $ECHO_C" >&6
@@ -11428,7 +11447,7 @@ else
ac_check_lib_save_LIBS=$LIBS
LIBS="-l$cf_term_lib $LIBS"
cat >conftest.$ac_ext <<_ACEOF
-#line 11431 "configure"
+#line 11450 "configure"
#include "confdefs.h"
/* Override any gcc2 internal prototype to avoid an error. */
@@ -11447,16 +11466,16 @@ tgoto ();
}
_ACEOF
rm -f conftest.$ac_objext conftest$ac_exeext
-if { (eval echo "$as_me:11450: \"$ac_link\"") >&5
+if { (eval echo "$as_me:11469: \"$ac_link\"") >&5
(eval $ac_link) 2>&5
ac_status=$?
- echo "$as_me:11453: \$? = $ac_status" >&5
+ echo "$as_me:11472: \$? = $ac_status" >&5
(exit $ac_status); } &&
{ ac_try='test -s conftest$ac_exeext'
- { (eval echo "$as_me:11456: \"$ac_try\"") >&5
+ { (eval echo "$as_me:11475: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
- echo "$as_me:11459: \$? = $ac_status" >&5
+ echo "$as_me:11478: \$? = $ac_status" >&5
(exit $ac_status); }; }; then
eval "$as_ac_Lib=yes"
else
@@ -11467,7 +11486,7 @@ fi
rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext
LIBS=$ac_check_lib_save_LIBS
fi
-echo "$as_me:11470: result: `eval echo '${'$as_ac_Lib'}'`" >&5
+echo "$as_me:11489: result: `eval echo '${'$as_ac_Lib'}'`" >&5
echo "${ECHO_T}`eval echo '${'$as_ac_Lib'}'`" >&6
if test `eval echo '${'$as_ac_Lib'}'` = yes; then
break
@@ -11482,7 +11501,7 @@ fi
for cf_curs_lib in $cf_check_list xcurses jcurses pdcurses unknown
do
as_ac_Lib=`echo "ac_cv_lib_$cf_curs_lib''_initscr" | $as_tr_sh`
-echo "$as_me:11485: checking for initscr in -l$cf_curs_lib" >&5
+echo "$as_me:11504: checking for initscr in -l$cf_curs_lib" >&5
echo $ECHO_N "checking for initscr in -l$cf_curs_lib... $ECHO_C" >&6
if eval "test \"\${$as_ac_Lib+set}\" = set"; then
echo $ECHO_N "(cached) $ECHO_C" >&6
@@ -11490,7 +11509,7 @@ else
ac_check_lib_save_LIBS=$LIBS
LIBS="-l$cf_curs_lib $LIBS"
cat >conftest.$ac_ext <<_ACEOF
-#line 11493 "configure"
+#line 11512 "configure"
#include "confdefs.h"
/* Override any gcc2 internal prototype to avoid an error. */
@@ -11509,16 +11528,16 @@ initscr ();
}
_ACEOF
rm -f conftest.$ac_objext conftest$ac_exeext
-if { (eval echo "$as_me:11512: \"$ac_link\"") >&5
+if { (eval echo "$as_me:11531: \"$ac_link\"") >&5
(eval $ac_link) 2>&5
ac_status=$?
- echo "$as_me:11515: \$? = $ac_status" >&5
+ echo "$as_me:11534: \$? = $ac_status" >&5
(exit $ac_status); } &&
{ ac_try='test -s conftest$ac_exeext'
- { (eval echo "$as_me:11518: \"$ac_try\"") >&5
+ { (eval echo "$as_me:11537: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
- echo "$as_me:11521: \$? = $ac_status" >&5
+ echo "$as_me:11540: \$? = $ac_status" >&5
(exit $ac_status); }; }; then
eval "$as_ac_Lib=yes"
else
@@ -11529,23 +11548,23 @@ fi
rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext
LIBS=$ac_check_lib_save_LIBS
fi
-echo "$as_me:11532: result: `eval echo '${'$as_ac_Lib'}'`" >&5
+echo "$as_me:11551: result: `eval echo '${'$as_ac_Lib'}'`" >&5
echo "${ECHO_T}`eval echo '${'$as_ac_Lib'}'`" >&6
if test `eval echo '${'$as_ac_Lib'}'` = yes; then
break
fi
done
- test $cf_curs_lib = unknown && { { echo "$as_me:11539: error: no curses library found" >&5
+ test $cf_curs_lib = unknown && { { echo "$as_me:11558: error: no curses library found" >&5
echo "$as_me: error: no curses library found" >&2;}
{ (exit 1); exit 1; }; }
LIBS="-l$cf_curs_lib $cf_save_LIBS"
if test "$cf_term_lib" = unknown ; then
- echo "$as_me:11545: checking if we can link with $cf_curs_lib library" >&5
+ echo "$as_me:11564: checking if we can link with $cf_curs_lib library" >&5
echo $ECHO_N "checking if we can link with $cf_curs_lib library... $ECHO_C" >&6
cat >conftest.$ac_ext <<_ACEOF
-#line 11548 "configure"
+#line 11567 "configure"
#include "confdefs.h"
#include <${cf_cv_ncurses_header:-curses.h}>
int
@@ -11557,16 +11576,16 @@ initscr()
}
_ACEOF
rm -f conftest.$ac_objext conftest$ac_exeext
-if { (eval echo "$as_me:11560: \"$ac_link\"") >&5
+if { (eval echo "$as_me:11579: \"$ac_link\"") >&5
(eval $ac_link) 2>&5
ac_status=$?
- echo "$as_me:11563: \$? = $ac_status" >&5
+ echo "$as_me:11582: \$? = $ac_status" >&5
(exit $ac_status); } &&
{ ac_try='test -s conftest$ac_exeext'
- { (eval echo "$as_me:11566: \"$ac_try\"") >&5
+ { (eval echo "$as_me:11585: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
- echo "$as_me:11569: \$? = $ac_status" >&5
+ echo "$as_me:11588: \$? = $ac_status" >&5
(exit $ac_status); }; }; then
cf_result=yes
else
@@ -11575,18 +11594,18 @@ cat conftest.$ac_ext >&5
cf_result=no
fi
rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext
- echo "$as_me:11578: result: $cf_result" >&5
+ echo "$as_me:11597: result: $cf_result" >&5
echo "${ECHO_T}$cf_result" >&6
- test $cf_result = no && { { echo "$as_me:11580: error: Cannot link curses library" >&5
+ test $cf_result = no && { { echo "$as_me:11599: error: Cannot link curses library" >&5
echo "$as_me: error: Cannot link curses library" >&2;}
{ (exit 1); exit 1; }; }
elif test "$cf_curs_lib" = "$cf_term_lib" ; then
:
elif test "$cf_term_lib" != predefined ; then
- echo "$as_me:11586: checking if we need both $cf_curs_lib and $cf_term_lib libraries" >&5
+ echo "$as_me:11605: checking if we need both $cf_curs_lib and $cf_term_lib libraries" >&5
echo $ECHO_N "checking if we need both $cf_curs_lib and $cf_term_lib libraries... $ECHO_C" >&6
cat >conftest.$ac_ext <<_ACEOF
-#line 11589 "configure"
+#line 11608 "configure"
#include "confdefs.h"
#include <${cf_cv_ncurses_header:-curses.h}>
int
@@ -11598,16 +11617,16 @@ initscr(); tgoto((char *)0, 0, 0);
}
_ACEOF
rm -f conftest.$ac_objext conftest$ac_exeext
-if { (eval echo "$as_me:11601: \"$ac_link\"") >&5
+if { (eval echo "$as_me:11620: \"$ac_link\"") >&5
(eval $ac_link) 2>&5
ac_status=$?
- echo "$as_me:11604: \$? = $ac_status" >&5
+ echo "$as_me:11623: \$? = $ac_status" >&5
(exit $ac_status); } &&
{ ac_try='test -s conftest$ac_exeext'
- { (eval echo "$as_me:11607: \"$ac_try\"") >&5
+ { (eval echo "$as_me:11626: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
- echo "$as_me:11610: \$? = $ac_status" >&5
+ echo "$as_me:11629: \$? = $ac_status" >&5
(exit $ac_status); }; }; then
cf_result=no
else
@@ -11616,7 +11635,7 @@ cat conftest.$ac_ext >&5
LIBS="-l$cf_curs_lib -l$cf_term_lib $cf_save_LIBS"
cat >conftest.$ac_ext <<_ACEOF
-#line 11619 "configure"
+#line 11638 "configure"
#include "confdefs.h"
#include <${cf_cv_ncurses_header:-curses.h}>
int
@@ -11628,16 +11647,16 @@ initscr()
}
_ACEOF
rm -f conftest.$ac_objext conftest$ac_exeext
-if { (eval echo "$as_me:11631: \"$ac_link\"") >&5
+if { (eval echo "$as_me:11650: \"$ac_link\"") >&5
(eval $ac_link) 2>&5
ac_status=$?
- echo "$as_me:11634: \$? = $ac_status" >&5
+ echo "$as_me:11653: \$? = $ac_status" >&5
(exit $ac_status); } &&
{ ac_try='test -s conftest$ac_exeext'
- { (eval echo "$as_me:11637: \"$ac_try\"") >&5
+ { (eval echo "$as_me:11656: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
- echo "$as_me:11640: \$? = $ac_status" >&5
+ echo "$as_me:11659: \$? = $ac_status" >&5
(exit $ac_status); }; }; then
cf_result=yes
else
@@ -11649,7 +11668,7 @@ rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext
fi
rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext
- echo "$as_me:11652: result: $cf_result" >&5
+ echo "$as_me:11671: result: $cf_result" >&5
echo "${ECHO_T}$cf_result" >&6
fi
fi
@@ -11659,7 +11678,7 @@ fi
cf_all_widgets=yes
-echo "$as_me:11662: checking if you want extra dialogs" >&5
+echo "$as_me:11681: checking if you want extra dialogs" >&5
echo $ECHO_N "checking if you want extra dialogs... $ECHO_C" >&6
# Check whether --enable-extras or --disable-extras was given.
@@ -11669,7 +11688,7 @@ if test "${enable_extras+set}" = set; then
else
enableval=yes
fi;
-echo "$as_me:11672: result: $enableval" >&5
+echo "$as_me:11691: result: $enableval" >&5
echo "${ECHO_T}$enableval" >&6
if test "$enableval" != no ; then
cf_all_widgets=yes
@@ -11677,7 +11696,7 @@ else
cf_all_widgets=no
fi
-echo "$as_me:11680: checking if you want config-file support" >&5
+echo "$as_me:11699: checking if you want config-file support" >&5
echo $ECHO_N "checking if you want config-file support... $ECHO_C" >&6
# Check whether --enable-rc-file or --disable-rc-file was given.
@@ -11687,7 +11706,7 @@ if test "${enable_rc_file+set}" = set; then
else
enableval=$cf_all_widgets
fi;
-echo "$as_me:11690: result: $enableval" >&5
+echo "$as_me:11709: result: $enableval" >&5
echo "${ECHO_T}$enableval" >&6
if test "$enableval" != no ; then
EXTRAOBJS="$EXTRAOBJS rc\$o"
@@ -11699,7 +11718,7 @@ else
:
fi
-echo "$as_me:11702: checking if you want Xdialog-style dialogs" >&5
+echo "$as_me:11721: checking if you want Xdialog-style dialogs" >&5
echo $ECHO_N "checking if you want Xdialog-style dialogs... $ECHO_C" >&6
# Check whether --enable-Xdialog or --disable-Xdialog was given.
@@ -11709,7 +11728,7 @@ if test "${enable_Xdialog+set}" = set; then
else
enableval=$cf_all_widgets
fi;
-echo "$as_me:11712: result: $enableval" >&5
+echo "$as_me:11731: result: $enableval" >&5
echo "${ECHO_T}$enableval" >&6
if test "$enableval" != no ; then
EXTRAOBJS="$EXTRAOBJS calendar\$o fselect\$o timebox\$o"
@@ -11721,7 +11740,7 @@ else
:
fi
-echo "$as_me:11724: checking if you want the form dialog" >&5
+echo "$as_me:11743: checking if you want the form dialog" >&5
echo $ECHO_N "checking if you want the form dialog... $ECHO_C" >&6
# Check whether --enable-form or --disable-form was given.
@@ -11731,7 +11750,7 @@ if test "${enable_form+set}" = set; then
else
enableval=$cf_all_widgets
fi;
-echo "$as_me:11734: result: $enableval" >&5
+echo "$as_me:11753: result: $enableval" >&5
echo "${ECHO_T}$enableval" >&6
if test "$enableval" != no ; then
EXTRAOBJS="$EXTRAOBJS formbox\$o"
@@ -11743,7 +11762,7 @@ else
:
fi
-echo "$as_me:11746: checking if you want the gauge dialog" >&5
+echo "$as_me:11765: checking if you want the gauge dialog" >&5
echo $ECHO_N "checking if you want the gauge dialog... $ECHO_C" >&6
# Check whether --enable-gauge or --disable-gauge was given.
@@ -11753,7 +11772,7 @@ if test "${enable_gauge+set}" = set; then
else
enableval=$cf_all_widgets
fi;
-echo "$as_me:11756: result: $enableval" >&5
+echo "$as_me:11775: result: $enableval" >&5
echo "${ECHO_T}$enableval" >&6
if test "$enableval" != no ; then
EXTRAOBJS="$EXTRAOBJS guage\$o pause\$o prgbox\$o progressbox\$o"
@@ -11765,7 +11784,7 @@ else
:
fi
-echo "$as_me:11768: checking if you want the tailbox dialog" >&5
+echo "$as_me:11787: checking if you want the tailbox dialog" >&5
echo $ECHO_N "checking if you want the tailbox dialog... $ECHO_C" >&6
# Check whether --enable-tailbox or --disable-tailbox was given.
@@ -11775,7 +11794,7 @@ if test "${enable_tailbox+set}" = set; then
else
enableval=$cf_all_widgets
fi;
-echo "$as_me:11778: result: $enableval" >&5
+echo "$as_me:11797: result: $enableval" >&5
echo "${ECHO_T}$enableval" >&6
if test "$enableval" != no ; then
EXTRAOBJS="$EXTRAOBJS tailbox\$o"
@@ -11787,7 +11806,7 @@ else
:
fi
-echo "$as_me:11790: checking if you want the mixedform dialog" >&5
+echo "$as_me:11809: checking if you want the mixedform dialog" >&5
echo $ECHO_N "checking if you want the mixedform dialog... $ECHO_C" >&6
# Check whether --enable-mixedform or --disable-mixedform was given.
@@ -11797,7 +11816,7 @@ if test "${enable_mixedform+set}" = set; then
else
enableval=$cf_all_widgets
fi;
-echo "$as_me:11800: result: $enableval" >&5
+echo "$as_me:11819: result: $enableval" >&5
echo "${ECHO_T}$enableval" >&6
if test "$enableval" != no ; then
EXTRAOBJS="$EXTRAOBJS mixedform\$o"
@@ -11809,7 +11828,7 @@ else
:
fi
-echo "$as_me:11812: checking if you want the mixedgauge dialog" >&5
+echo "$as_me:11831: checking if you want the mixedgauge dialog" >&5
echo $ECHO_N "checking if you want the mixedgauge dialog... $ECHO_C" >&6
# Check whether --enable-mixedgauge or --disable-mixedgauge was given.
@@ -11819,7 +11838,7 @@ if test "${enable_mixedgauge+set}" = set; then
else
enableval=$cf_all_widgets
fi;
-echo "$as_me:11822: result: $enableval" >&5
+echo "$as_me:11841: result: $enableval" >&5
echo "${ECHO_T}$enableval" >&6
if test "$enableval" != no ; then
EXTRAOBJS="$EXTRAOBJS mixedgauge\$o"
@@ -11831,7 +11850,7 @@ else
:
fi
-echo "$as_me:11834: checking if you want the wide-curses features" >&5
+echo "$as_me:11853: checking if you want the wide-curses features" >&5
echo $ECHO_N "checking if you want the wide-curses features... $ECHO_C" >&6
# Check whether --enable-widec or --disable-widec was given.
@@ -11841,7 +11860,7 @@ if test "${enable_widec+set}" = set; then
else
enableval=$cf_wide_curses
fi;
-echo "$as_me:11844: result: $enableval" >&5
+echo "$as_me:11863: result: $enableval" >&5
echo "${ECHO_T}$enableval" >&6
if test "$enableval" != no ; then
cat >>confdefs.h <<\EOF
@@ -11852,13 +11871,13 @@ else
:
fi
-echo "$as_me:11855: checking for ANSI C header files" >&5
+echo "$as_me:11874: checking for ANSI C header files" >&5
echo $ECHO_N "checking for ANSI C header files... $ECHO_C" >&6
if test "${ac_cv_header_stdc+set}" = set; then
echo $ECHO_N "(cached) $ECHO_C" >&6
else
cat >conftest.$ac_ext <<_ACEOF
-#line 11861 "configure"
+#line 11880 "configure"
#include "confdefs.h"
#include <stdlib.h>
#include <stdarg.h>
@@ -11866,13 +11885,13 @@ else
#include <float.h>
_ACEOF
-if { (eval echo "$as_me:11869: \"$ac_cpp conftest.$ac_ext\"") >&5
+if { (eval echo "$as_me:11888: \"$ac_cpp conftest.$ac_ext\"") >&5
(eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
ac_status=$?
egrep -v '^ *\+' conftest.er1 >conftest.err
rm -f conftest.er1
cat conftest.err >&5
- echo "$as_me:11875: \$? = $ac_status" >&5
+ echo "$as_me:11894: \$? = $ac_status" >&5
(exit $ac_status); } >/dev/null; then
if test -s conftest.err; then
ac_cpp_err=$ac_c_preproc_warn_flag
@@ -11894,7 +11913,7 @@ rm -f conftest.err conftest.$ac_ext
if test $ac_cv_header_stdc = yes; then
# SunOS 4.x string.h does not declare mem*, contrary to ANSI.
cat >conftest.$ac_ext <<_ACEOF
-#line 11897 "configure"
+#line 11916 "configure"
#include "confdefs.h"
#include <string.h>
@@ -11912,7 +11931,7 @@ fi
if test $ac_cv_header_stdc = yes; then
# ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI.
cat >conftest.$ac_ext <<_ACEOF
-#line 11915 "configure"
+#line 11934 "configure"
#include "confdefs.h"
#include <stdlib.h>
@@ -11933,7 +11952,7 @@ if test $ac_cv_header_stdc = yes; then
:
else
cat >conftest.$ac_ext <<_ACEOF
-#line 11936 "configure"
+#line 11955 "configure"
#include "confdefs.h"
#include <ctype.h>
#if ((' ' & 0x0FF) == 0x020)
@@ -11959,15 +11978,15 @@ main ()
}
_ACEOF
rm -f conftest$ac_exeext
-if { (eval echo "$as_me:11962: \"$ac_link\"") >&5
+if { (eval echo "$as_me:11981: \"$ac_link\"") >&5
(eval $ac_link) 2>&5
ac_status=$?
- echo "$as_me:11965: \$? = $ac_status" >&5
+ echo "$as_me:11984: \$? = $ac_status" >&5
(exit $ac_status); } && { ac_try='./conftest$ac_exeext'
- { (eval echo "$as_me:11967: \"$ac_try\"") >&5
+ { (eval echo "$as_me:11986: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
- echo "$as_me:11970: \$? = $ac_status" >&5
+ echo "$as_me:11989: \$? = $ac_status" >&5
(exit $ac_status); }; }; then
:
else
@@ -11980,7 +11999,7 @@ rm -f core core.* *.core conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
fi
fi
fi
-echo "$as_me:11983: result: $ac_cv_header_stdc" >&5
+echo "$as_me:12002: result: $ac_cv_header_stdc" >&5
echo "${ECHO_T}$ac_cv_header_stdc" >&6
if test $ac_cv_header_stdc = yes; then
@@ -11990,13 +12009,13 @@ EOF
fi
-echo "$as_me:11993: checking whether time.h and sys/time.h may both be included" >&5
+echo "$as_me:12012: checking whether time.h and sys/time.h may both be included" >&5
echo $ECHO_N "checking whether time.h and sys/time.h may both be included... $ECHO_C" >&6
if test "${ac_cv_header_time+set}" = set; then
echo $ECHO_N "(cached) $ECHO_C" >&6
else
cat >conftest.$ac_ext <<_ACEOF
-#line 11999 "configure"
+#line 12018 "configure"
#include "confdefs.h"
#include <sys/types.h>
#include <sys/time.h>
@@ -12012,16 +12031,16 @@ return 0;
}
_ACEOF
rm -f conftest.$ac_objext
-if { (eval echo "$as_me:12015: \"$ac_compile\"") >&5
+if { (eval echo "$as_me:12034: \"$ac_compile\"") >&5
(eval $ac_compile) 2>&5
ac_status=$?
- echo "$as_me:12018: \$? = $ac_status" >&5
+ echo "$as_me:12037: \$? = $ac_status" >&5
(exit $ac_status); } &&
{ ac_try='test -s conftest.$ac_objext'
- { (eval echo "$as_me:12021: \"$ac_try\"") >&5
+ { (eval echo "$as_me:12040: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
- echo "$as_me:12024: \$? = $ac_status" >&5
+ echo "$as_me:12043: \$? = $ac_status" >&5
(exit $ac_status); }; }; then
ac_cv_header_time=yes
else
@@ -12031,7 +12050,7 @@ ac_cv_header_time=no
fi
rm -f conftest.$ac_objext conftest.$ac_ext
fi
-echo "$as_me:12034: result: $ac_cv_header_time" >&5
+echo "$as_me:12053: result: $ac_cv_header_time" >&5
echo "${ECHO_T}$ac_cv_header_time" >&6
if test $ac_cv_header_time = yes; then
@@ -12044,13 +12063,13 @@ fi
ac_header_dirent=no
for ac_hdr in dirent.h sys/ndir.h sys/dir.h ndir.h; do
as_ac_Header=`echo "ac_cv_header_dirent_$ac_hdr" | $as_tr_sh`
-echo "$as_me:12047: checking for $ac_hdr that defines DIR" >&5
+echo "$as_me:12066: checking for $ac_hdr that defines DIR" >&5
echo $ECHO_N "checking for $ac_hdr that defines DIR... $ECHO_C" >&6
if eval "test \"\${$as_ac_Header+set}\" = set"; then
echo $ECHO_N "(cached) $ECHO_C" >&6
else
cat >conftest.$ac_ext <<_ACEOF
-#line 12053 "configure"
+#line 12072 "configure"
#include "confdefs.h"
#include <sys/types.h>
#include <$ac_hdr>
@@ -12065,16 +12084,16 @@ return 0;
}
_ACEOF
rm -f conftest.$ac_objext
-if { (eval echo "$as_me:12068: \"$ac_compile\"") >&5
+if { (eval echo "$as_me:12087: \"$ac_compile\"") >&5
(eval $ac_compile) 2>&5
ac_status=$?
- echo "$as_me:12071: \$? = $ac_status" >&5
+ echo "$as_me:12090: \$? = $ac_status" >&5
(exit $ac_status); } &&
{ ac_try='test -s conftest.$ac_objext'
- { (eval echo "$as_me:12074: \"$ac_try\"") >&5
+ { (eval echo "$as_me:12093: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
- echo "$as_me:12077: \$? = $ac_status" >&5
+ echo "$as_me:12096: \$? = $ac_status" >&5
(exit $ac_status); }; }; then
eval "$as_ac_Header=yes"
else
@@ -12084,7 +12103,7 @@ eval "$as_ac_Header=no"
fi
rm -f conftest.$ac_objext conftest.$ac_ext
fi
-echo "$as_me:12087: result: `eval echo '${'$as_ac_Header'}'`" >&5
+echo "$as_me:12106: result: `eval echo '${'$as_ac_Header'}'`" >&5
echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6
if test `eval echo '${'$as_ac_Header'}'` = yes; then
cat >>confdefs.h <<EOF
@@ -12097,7 +12116,7 @@ fi
done
# Two versions of opendir et al. are in -ldir and -lx on SCO Xenix.
if test $ac_header_dirent = dirent.h; then
- echo "$as_me:12100: checking for opendir in -ldir" >&5
+ echo "$as_me:12119: checking for opendir in -ldir" >&5
echo $ECHO_N "checking for opendir in -ldir... $ECHO_C" >&6
if test "${ac_cv_lib_dir_opendir+set}" = set; then
echo $ECHO_N "(cached) $ECHO_C" >&6
@@ -12105,7 +12124,7 @@ else
ac_check_lib_save_LIBS=$LIBS
LIBS="-ldir $LIBS"
cat >conftest.$ac_ext <<_ACEOF
-#line 12108 "configure"
+#line 12127 "configure"
#include "confdefs.h"
/* Override any gcc2 internal prototype to avoid an error. */
@@ -12124,16 +12143,16 @@ opendir ();
}
_ACEOF
rm -f conftest.$ac_objext conftest$ac_exeext
-if { (eval echo "$as_me:12127: \"$ac_link\"") >&5
+if { (eval echo "$as_me:12146: \"$ac_link\"") >&5
(eval $ac_link) 2>&5
ac_status=$?
- echo "$as_me:12130: \$? = $ac_status" >&5
+ echo "$as_me:12149: \$? = $ac_status" >&5
(exit $ac_status); } &&
{ ac_try='test -s conftest$ac_exeext'
- { (eval echo "$as_me:12133: \"$ac_try\"") >&5
+ { (eval echo "$as_me:12152: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
- echo "$as_me:12136: \$? = $ac_status" >&5
+ echo "$as_me:12155: \$? = $ac_status" >&5
(exit $ac_status); }; }; then
ac_cv_lib_dir_opendir=yes
else
@@ -12144,14 +12163,14 @@ fi
rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext
LIBS=$ac_check_lib_save_LIBS
fi
-echo "$as_me:12147: result: $ac_cv_lib_dir_opendir" >&5
+echo "$as_me:12166: result: $ac_cv_lib_dir_opendir" >&5
echo "${ECHO_T}$ac_cv_lib_dir_opendir" >&6
if test $ac_cv_lib_dir_opendir = yes; then
LIBS="$LIBS -ldir"
fi
else
- echo "$as_me:12154: checking for opendir in -lx" >&5
+ echo "$as_me:12173: checking for opendir in -lx" >&5
echo $ECHO_N "checking for opendir in -lx... $ECHO_C" >&6
if test "${ac_cv_lib_x_opendir+set}" = set; then
echo $ECHO_N "(cached) $ECHO_C" >&6
@@ -12159,7 +12178,7 @@ else
ac_check_lib_save_LIBS=$LIBS
LIBS="-lx $LIBS"
cat >conftest.$ac_ext <<_ACEOF
-#line 12162 "configure"
+#line 12181 "configure"
#include "confdefs.h"
/* Override any gcc2 internal prototype to avoid an error. */
@@ -12178,16 +12197,16 @@ opendir ();
}
_ACEOF
rm -f conftest.$ac_objext conftest$ac_exeext
-if { (eval echo "$as_me:12181: \"$ac_link\"") >&5
+if { (eval echo "$as_me:12200: \"$ac_link\"") >&5
(eval $ac_link) 2>&5
ac_status=$?
- echo "$as_me:12184: \$? = $ac_status" >&5
+ echo "$as_me:12203: \$? = $ac_status" >&5
(exit $ac_status); } &&
{ ac_try='test -s conftest$ac_exeext'
- { (eval echo "$as_me:12187: \"$ac_try\"") >&5
+ { (eval echo "$as_me:12206: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
- echo "$as_me:12190: \$? = $ac_status" >&5
+ echo "$as_me:12209: \$? = $ac_status" >&5
(exit $ac_status); }; }; then
ac_cv_lib_x_opendir=yes
else
@@ -12198,7 +12217,7 @@ fi
rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext
LIBS=$ac_check_lib_save_LIBS
fi
-echo "$as_me:12201: result: $ac_cv_lib_x_opendir" >&5
+echo "$as_me:12220: result: $ac_cv_lib_x_opendir" >&5
echo "${ECHO_T}$ac_cv_lib_x_opendir" >&6
if test $ac_cv_lib_x_opendir = yes; then
LIBS="$LIBS -lx"
@@ -12209,23 +12228,23 @@ fi
for ac_header in search.h unctrl.h unistd.h
do
as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh`
-echo "$as_me:12212: checking for $ac_header" >&5
+echo "$as_me:12231: checking for $ac_header" >&5
echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6
if eval "test \"\${$as_ac_Header+set}\" = set"; then
echo $ECHO_N "(cached) $ECHO_C" >&6
else
cat >conftest.$ac_ext <<_ACEOF
-#line 12218 "configure"
+#line 12237 "configure"
#include "confdefs.h"
#include <$ac_header>
_ACEOF
-if { (eval echo "$as_me:12222: \"$ac_cpp conftest.$ac_ext\"") >&5
+if { (eval echo "$as_me:12241: \"$ac_cpp conftest.$ac_ext\"") >&5
(eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
ac_status=$?
egrep -v '^ *\+' conftest.er1 >conftest.err
rm -f conftest.er1
cat conftest.err >&5
- echo "$as_me:12228: \$? = $ac_status" >&5
+ echo "$as_me:12247: \$? = $ac_status" >&5
(exit $ac_status); } >/dev/null; then
if test -s conftest.err; then
ac_cpp_err=$ac_c_preproc_warn_flag
@@ -12244,7 +12263,7 @@ else
fi
rm -f conftest.err conftest.$ac_ext
fi
-echo "$as_me:12247: result: `eval echo '${'$as_ac_Header'}'`" >&5
+echo "$as_me:12266: result: `eval echo '${'$as_ac_Header'}'`" >&5
echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6
if test `eval echo '${'$as_ac_Header'}'` = yes; then
cat >>confdefs.h <<EOF
@@ -12254,7 +12273,7 @@ EOF
fi
done
-echo "$as_me:12257: checking for term.h" >&5
+echo "$as_me:12276: checking for term.h" >&5
echo $ECHO_N "checking for term.h... $ECHO_C" >&6
if test "${cf_cv_term_header+set}" = set; then
echo $ECHO_N "(cached) $ECHO_C" >&6
@@ -12262,12 +12281,20 @@ else
# If we found <ncurses/curses.h>, look for <ncurses/term.h>, but always look
# for <term.h> if we do not find the variant.
-for cf_header in \
- `echo ${cf_cv_ncurses_header:-curses.h} | sed -e 's%/.*%/%'`term.h \
- term.h
+
+cf_header_list="term.h ncurses/term.h ncursesw/term.h"
+
+case ${cf_cv_ncurses_header:-curses.h} in #(vi
+*/*)
+ cf_header_item=`echo ${cf_cv_ncurses_header:-curses.h} | sed -e 's%\..*%%' -e 's%/.*%/%'`term.h
+ cf_header_list="$cf_header_item $cf_header_list"
+ ;;
+esac
+
+for cf_header in $cf_header_list
do
cat >conftest.$ac_ext <<_ACEOF
-#line 12270 "configure"
+#line 12297 "configure"
#include "confdefs.h"
#include <${cf_cv_ncurses_header:-curses.h}>
@@ -12281,16 +12308,16 @@ WINDOW *x
}
_ACEOF
rm -f conftest.$ac_objext
-if { (eval echo "$as_me:12284: \"$ac_compile\"") >&5
+if { (eval echo "$as_me:12311: \"$ac_compile\"") >&5
(eval $ac_compile) 2>&5
ac_status=$?
- echo "$as_me:12287: \$? = $ac_status" >&5
+ echo "$as_me:12314: \$? = $ac_status" >&5
(exit $ac_status); } &&
{ ac_try='test -s conftest.$ac_objext'
- { (eval echo "$as_me:12290: \"$ac_try\"") >&5
+ { (eval echo "$as_me:12317: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
- echo "$as_me:12293: \$? = $ac_status" >&5
+ echo "$as_me:12320: \$? = $ac_status" >&5
(exit $ac_status); }; }; then
cf_cv_term_header=$cf_header
break
@@ -12309,7 +12336,7 @@ no)
for cf_header in ncurses/term.h ncursesw/term.h
do
cat >conftest.$ac_ext <<_ACEOF
-#line 12312 "configure"
+#line 12339 "configure"
#include "confdefs.h"
#include <${cf_cv_ncurses_header:-curses.h}>
@@ -12327,16 +12354,16 @@ WINDOW *x
}
_ACEOF
rm -f conftest.$ac_objext
-if { (eval echo "$as_me:12330: \"$ac_compile\"") >&5
+if { (eval echo "$as_me:12357: \"$ac_compile\"") >&5
(eval $ac_compile) 2>&5
ac_status=$?
- echo "$as_me:12333: \$? = $ac_status" >&5
+ echo "$as_me:12360: \$? = $ac_status" >&5
(exit $ac_status); } &&
{ ac_try='test -s conftest.$ac_objext'
- { (eval echo "$as_me:12336: \"$ac_try\"") >&5
+ { (eval echo "$as_me:12363: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
- echo "$as_me:12339: \$? = $ac_status" >&5
+ echo "$as_me:12366: \$? = $ac_status" >&5
(exit $ac_status); }; }; then
cf_cv_term_header=$cf_header
break
@@ -12351,7 +12378,7 @@ rm -f conftest.$ac_objext conftest.$ac_ext
esac
fi
-echo "$as_me:12354: result: $cf_cv_term_header" >&5
+echo "$as_me:12381: result: $cf_cv_term_header" >&5
echo "${ECHO_T}$cf_cv_term_header" >&6
case $cf_cv_term_header in #(vi
@@ -12375,13 +12402,13 @@ EOF
;;
esac
-echo "$as_me:12378: checking return type of signal handlers" >&5
+echo "$as_me:12405: checking return type of signal handlers" >&5
echo $ECHO_N "checking return type of signal handlers... $ECHO_C" >&6
if test "${ac_cv_type_signal+set}" = set; then
echo $ECHO_N "(cached) $ECHO_C" >&6
else
cat >conftest.$ac_ext <<_ACEOF
-#line 12384 "configure"
+#line 12411 "configure"
#include "confdefs.h"
#include <sys/types.h>
#include <signal.h>
@@ -12403,16 +12430,16 @@ int i;
}
_ACEOF
rm -f conftest.$ac_objext
-if { (eval echo "$as_me:12406: \"$ac_compile\"") >&5
+if { (eval echo "$as_me:12433: \"$ac_compile\"") >&5
(eval $ac_compile) 2>&5
ac_status=$?
- echo "$as_me:12409: \$? = $ac_status" >&5
+ echo "$as_me:12436: \$? = $ac_status" >&5
(exit $ac_status); } &&
{ ac_try='test -s conftest.$ac_objext'
- { (eval echo "$as_me:12412: \"$ac_try\"") >&5
+ { (eval echo "$as_me:12439: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
- echo "$as_me:12415: \$? = $ac_status" >&5
+ echo "$as_me:12442: \$? = $ac_status" >&5
(exit $ac_status); }; }; then
ac_cv_type_signal=void
else
@@ -12422,7 +12449,7 @@ ac_cv_type_signal=int
fi
rm -f conftest.$ac_objext conftest.$ac_ext
fi
-echo "$as_me:12425: result: $ac_cv_type_signal" >&5
+echo "$as_me:12452: result: $ac_cv_type_signal" >&5
echo "${ECHO_T}$ac_cv_type_signal" >&6
cat >>confdefs.h <<EOF
@@ -12447,13 +12474,13 @@ wctomb \
do
as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh`
-echo "$as_me:12450: checking for $ac_func" >&5
+echo "$as_me:12477: checking for $ac_func" >&5
echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6
if eval "test \"\${$as_ac_var+set}\" = set"; then
echo $ECHO_N "(cached) $ECHO_C" >&6
else
cat >conftest.$ac_ext <<_ACEOF
-#line 12456 "configure"
+#line 12483 "configure"
#include "confdefs.h"
/* System header to define __stub macros and hopefully few prototypes,
which can conflict with char $ac_func (); below. */
@@ -12484,16 +12511,16 @@ f = $ac_func;
}
_ACEOF
rm -f conftest.$ac_objext conftest$ac_exeext
-if { (eval echo "$as_me:12487: \"$ac_link\"") >&5
+if { (eval echo "$as_me:12514: \"$ac_link\"") >&5
(eval $ac_link) 2>&5
ac_status=$?
- echo "$as_me:12490: \$? = $ac_status" >&5
+ echo "$as_me:12517: \$? = $ac_status" >&5
(exit $ac_status); } &&
{ ac_try='test -s conftest$ac_exeext'
- { (eval echo "$as_me:12493: \"$ac_try\"") >&5
+ { (eval echo "$as_me:12520: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
- echo "$as_me:12496: \$? = $ac_status" >&5
+ echo "$as_me:12523: \$? = $ac_status" >&5
(exit $ac_status); }; }; then
eval "$as_ac_var=yes"
else
@@ -12503,7 +12530,7 @@ eval "$as_ac_var=no"
fi
rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext
fi
-echo "$as_me:12506: result: `eval echo '${'$as_ac_var'}'`" >&5
+echo "$as_me:12533: result: `eval echo '${'$as_ac_var'}'`" >&5
echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6
if test `eval echo '${'$as_ac_var'}'` = yes; then
cat >>confdefs.h <<EOF
@@ -12513,14 +12540,14 @@ EOF
fi
done
-echo "$as_me:12516: checking if we must define _XOPEN_SOURCE_EXTENDED" >&5
+echo "$as_me:12543: checking if we must define _XOPEN_SOURCE_EXTENDED" >&5
echo $ECHO_N "checking if we must define _XOPEN_SOURCE_EXTENDED... $ECHO_C" >&6
if test "${cf_cv_need_xopen_extension+set}" = set; then
echo $ECHO_N "(cached) $ECHO_C" >&6
else
cat >conftest.$ac_ext <<_ACEOF
-#line 12523 "configure"
+#line 12550 "configure"
#include "confdefs.h"
#include <stdlib.h>
@@ -12542,23 +12569,23 @@ main ()
}
_ACEOF
rm -f conftest.$ac_objext conftest$ac_exeext
-if { (eval echo "$as_me:12545: \"$ac_link\"") >&5
+if { (eval echo "$as_me:12572: \"$ac_link\"") >&5
(eval $ac_link) 2>&5
ac_status=$?
- echo "$as_me:12548: \$? = $ac_status" >&5
+ echo "$as_me:12575: \$? = $ac_status" >&5
(exit $ac_status); } &&
{ ac_try='test -s conftest$ac_exeext'
- { (eval echo "$as_me:12551: \"$ac_try\"") >&5
+ { (eval echo "$as_me:12578: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
- echo "$as_me:12554: \$? = $ac_status" >&5
+ echo "$as_me:12581: \$? = $ac_status" >&5
(exit $ac_status); }; }; then
cf_cv_need_xopen_extension=no
else
echo "$as_me: failed program was:" >&5
cat conftest.$ac_ext >&5
cat >conftest.$ac_ext <<_ACEOF
-#line 12561 "configure"
+#line 12588 "configure"
#include "confdefs.h"
#define _XOPEN_SOURCE_EXTENDED
@@ -12580,16 +12607,16 @@ main ()
}
_ACEOF
rm -f conftest.$ac_objext conftest$ac_exeext
-if { (eval echo "$as_me:12583: \"$ac_link\"") >&5
+if { (eval echo "$as_me:12610: \"$ac_link\"") >&5
(eval $ac_link) 2>&5
ac_status=$?
- echo "$as_me:12586: \$? = $ac_status" >&5
+ echo "$as_me:12613: \$? = $ac_status" >&5
(exit $ac_status); } &&
{ ac_try='test -s conftest$ac_exeext'
- { (eval echo "$as_me:12589: \"$ac_try\"") >&5
+ { (eval echo "$as_me:12616: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
- echo "$as_me:12592: \$? = $ac_status" >&5
+ echo "$as_me:12619: \$? = $ac_status" >&5
(exit $ac_status); }; }; then
cf_cv_need_xopen_extension=yes
else
@@ -12601,10 +12628,98 @@ rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext
fi
rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext
fi
-echo "$as_me:12604: result: $cf_cv_need_xopen_extension" >&5
+echo "$as_me:12631: result: $cf_cv_need_xopen_extension" >&5
echo "${ECHO_T}$cf_cv_need_xopen_extension" >&6
test $cf_cv_need_xopen_extension = yes && CPPFLAGS="$CPPFLAGS -D_XOPEN_SOURCE_EXTENDED"
+echo "$as_me:12635: checking for unctrl.h" >&5
+echo $ECHO_N "checking for unctrl.h... $ECHO_C" >&6
+if test "${cf_cv_unctrl_header+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+# If we found <ncurses/curses.h>, look for <ncurses/unctrl.h>, but always look
+# for <unctrl.h> if we do not find the variant.
+
+cf_header_list="unctrl.h ncurses/unctrl.h ncursesw/unctrl.h"
+
+case ${cf_cv_ncurses_header:-curses.h} in #(vi
+*/*)
+ cf_header_item=`echo ${cf_cv_ncurses_header:-curses.h} | sed -e 's%\..*%%' -e 's%/.*%/%'`unctrl.h
+ cf_header_list="$cf_header_item $cf_header_list"
+ ;;
+esac
+
+for cf_header in $cf_header_list
+do
+ cat >conftest.$ac_ext <<_ACEOF
+#line 12656 "configure"
+#include "confdefs.h"
+
+#include <${cf_cv_ncurses_header:-curses.h}>
+#include <${cf_header}>
+int
+main ()
+{
+WINDOW *x
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:12670: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ echo "$as_me:12673: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:12676: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:12679: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ cf_cv_unctrl_header=$cf_header
+ break
+else
+ echo "$as_me: failed program was:" >&5
+cat conftest.$ac_ext >&5
+cf_cv_unctrl_header=no
+fi
+rm -f conftest.$ac_objext conftest.$ac_ext
+done
+
+case $cf_cv_unctrl_header in #(vi
+no)
+ { echo "$as_me:12693: WARNING: unctrl.h header not found" >&5
+echo "$as_me: WARNING: unctrl.h header not found" >&2;}
+ ;;
+esac
+
+fi
+echo "$as_me:12699: result: $cf_cv_unctrl_header" >&5
+echo "${ECHO_T}$cf_cv_unctrl_header" >&6
+
+case $cf_cv_unctrl_header in #(vi
+unctrl.h) #(vi
+ cat >>confdefs.h <<\EOF
+#define HAVE_UNCTRL_H 1
+EOF
+
+ ;;
+ncurses/unctrl.h) #(vi
+ cat >>confdefs.h <<\EOF
+#define HAVE_NCURSES_UNCTRL_H 1
+EOF
+
+ ;;
+ncursesw/unctrl.h)
+ cat >>confdefs.h <<\EOF
+#define HAVE_NCURSESW_UNCTRL_H 1
+EOF
+
+ ;;
+esac
+
for cf_func in \
flushinp \
getattrs \
@@ -12620,16 +12735,17 @@ getparx \
getpary \
getparyx \
use_default_colors \
+wchgat \
wget_wch \
do
cf_tr_func=`echo "$cf_func" | sed y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%`
- echo "$as_me:12629: checking for ${cf_func}" >&5
+ echo "$as_me:12745: checking for ${cf_func}" >&5
echo $ECHO_N "checking for ${cf_func}... $ECHO_C" >&6
-echo "${as_me:-configure}:12632: testing ${cf_func} ..." 1>&5
+echo "${as_me:-configure}:12748: testing ${cf_func} ..." 1>&5
if eval "test \"\${cf_cv_func_$cf_func+set}\" = set"; then
echo $ECHO_N "(cached) $ECHO_C" >&6
@@ -12638,7 +12754,7 @@ else
eval cf_result='$ac_cv_func_'$cf_func
if test ".$cf_result" != ".no"; then
cat >conftest.$ac_ext <<_ACEOF
-#line 12641 "configure"
+#line 12757 "configure"
#include "confdefs.h"
#ifdef HAVE_XCURSES
@@ -12661,7 +12777,8 @@ main ()
#ifndef ${cf_func}
long foo = (long)(&${cf_func});
-${cf_cv_main_return:-return}(foo == 0);
+if (foo + 1234 > 5678)
+ ${cf_cv_main_return:-return}(foo);
#endif
;
@@ -12669,16 +12786,16 @@ ${cf_cv_main_return:-return}(foo == 0);
}
_ACEOF
rm -f conftest.$ac_objext conftest$ac_exeext
-if { (eval echo "$as_me:12672: \"$ac_link\"") >&5
+if { (eval echo "$as_me:12789: \"$ac_link\"") >&5
(eval $ac_link) 2>&5
ac_status=$?
- echo "$as_me:12675: \$? = $ac_status" >&5
+ echo "$as_me:12792: \$? = $ac_status" >&5
(exit $ac_status); } &&
{ ac_try='test -s conftest$ac_exeext'
- { (eval echo "$as_me:12678: \"$ac_try\"") >&5
+ { (eval echo "$as_me:12795: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
- echo "$as_me:12681: \$? = $ac_status" >&5
+ echo "$as_me:12798: \$? = $ac_status" >&5
(exit $ac_status); }; }; then
cf_result=yes
else
@@ -12694,7 +12811,7 @@ fi
# use the computed/retrieved cache-value:
eval 'cf_result=$cf_cv_func_'$cf_func
- echo "$as_me:12697: result: $cf_result" >&5
+ echo "$as_me:12814: result: $cf_result" >&5
echo "${ECHO_T}$cf_result" >&6
if test $cf_result != no; then
cat >>confdefs.h <<EOF
@@ -12704,13 +12821,13 @@ EOF
fi
done
-echo "$as_me:12707: checking for start_color" >&5
+echo "$as_me:12824: checking for start_color" >&5
echo $ECHO_N "checking for start_color... $ECHO_C" >&6
if test "${ac_cv_func_start_color+set}" = set; then
echo $ECHO_N "(cached) $ECHO_C" >&6
else
cat >conftest.$ac_ext <<_ACEOF
-#line 12713 "configure"
+#line 12830 "configure"
#include "confdefs.h"
/* System header to define __stub macros and hopefully few prototypes,
which can conflict with char start_color (); below. */
@@ -12741,16 +12858,16 @@ f = start_color;
}
_ACEOF
rm -f conftest.$ac_objext conftest$ac_exeext
-if { (eval echo "$as_me:12744: \"$ac_link\"") >&5
+if { (eval echo "$as_me:12861: \"$ac_link\"") >&5
(eval $ac_link) 2>&5
ac_status=$?
- echo "$as_me:12747: \$? = $ac_status" >&5
+ echo "$as_me:12864: \$? = $ac_status" >&5
(exit $ac_status); } &&
{ ac_try='test -s conftest$ac_exeext'
- { (eval echo "$as_me:12750: \"$ac_try\"") >&5
+ { (eval echo "$as_me:12867: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
- echo "$as_me:12753: \$? = $ac_status" >&5
+ echo "$as_me:12870: \$? = $ac_status" >&5
(exit $ac_status); }; }; then
ac_cv_func_start_color=yes
else
@@ -12760,7 +12877,7 @@ ac_cv_func_start_color=no
fi
rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext
fi
-echo "$as_me:12763: result: $ac_cv_func_start_color" >&5
+echo "$as_me:12880: result: $ac_cv_func_start_color" >&5
echo "${ECHO_T}$ac_cv_func_start_color" >&6
if test $ac_cv_func_start_color = yes; then
cat >>confdefs.h <<\EOF
@@ -12769,14 +12886,14 @@ EOF
fi
-echo "$as_me:12772: checking for chtype typedef" >&5
+echo "$as_me:12889: checking for chtype typedef" >&5
echo $ECHO_N "checking for chtype typedef... $ECHO_C" >&6
if test "${cf_cv_chtype_decl+set}" = set; then
echo $ECHO_N "(cached) $ECHO_C" >&6
else
cat >conftest.$ac_ext <<_ACEOF
-#line 12779 "configure"
+#line 12896 "configure"
#include "confdefs.h"
#include <${cf_cv_ncurses_header:-curses.h}>
int
@@ -12788,16 +12905,16 @@ chtype foo
}
_ACEOF
rm -f conftest.$ac_objext
-if { (eval echo "$as_me:12791: \"$ac_compile\"") >&5
+if { (eval echo "$as_me:12908: \"$ac_compile\"") >&5
(eval $ac_compile) 2>&5
ac_status=$?
- echo "$as_me:12794: \$? = $ac_status" >&5
+ echo "$as_me:12911: \$? = $ac_status" >&5
(exit $ac_status); } &&
{ ac_try='test -s conftest.$ac_objext'
- { (eval echo "$as_me:12797: \"$ac_try\"") >&5
+ { (eval echo "$as_me:12914: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
- echo "$as_me:12800: \$? = $ac_status" >&5
+ echo "$as_me:12917: \$? = $ac_status" >&5
(exit $ac_status); }; }; then
cf_cv_chtype_decl=yes
else
@@ -12807,21 +12924,21 @@ cf_cv_chtype_decl=no
fi
rm -f conftest.$ac_objext conftest.$ac_ext
fi
-echo "$as_me:12810: result: $cf_cv_chtype_decl" >&5
+echo "$as_me:12927: result: $cf_cv_chtype_decl" >&5
echo "${ECHO_T}$cf_cv_chtype_decl" >&6
if test $cf_cv_chtype_decl = yes ; then
cat >>confdefs.h <<\EOF
#define HAVE_TYPE_CHTYPE 1
EOF
- echo "$as_me:12817: checking if chtype is scalar or struct" >&5
+ echo "$as_me:12934: checking if chtype is scalar or struct" >&5
echo $ECHO_N "checking if chtype is scalar or struct... $ECHO_C" >&6
if test "${cf_cv_chtype_type+set}" = set; then
echo $ECHO_N "(cached) $ECHO_C" >&6
else
cat >conftest.$ac_ext <<_ACEOF
-#line 12824 "configure"
+#line 12941 "configure"
#include "confdefs.h"
#include <${cf_cv_ncurses_header:-curses.h}>
int
@@ -12833,16 +12950,16 @@ chtype foo; long x = foo
}
_ACEOF
rm -f conftest.$ac_objext
-if { (eval echo "$as_me:12836: \"$ac_compile\"") >&5
+if { (eval echo "$as_me:12953: \"$ac_compile\"") >&5
(eval $ac_compile) 2>&5
ac_status=$?
- echo "$as_me:12839: \$? = $ac_status" >&5
+ echo "$as_me:12956: \$? = $ac_status" >&5
(exit $ac_status); } &&
{ ac_try='test -s conftest.$ac_objext'
- { (eval echo "$as_me:12842: \"$ac_try\"") >&5
+ { (eval echo "$as_me:12959: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
- echo "$as_me:12845: \$? = $ac_status" >&5
+ echo "$as_me:12962: \$? = $ac_status" >&5
(exit $ac_status); }; }; then
cf_cv_chtype_type=scalar
else
@@ -12852,7 +12969,7 @@ cf_cv_chtype_type=struct
fi
rm -f conftest.$ac_objext conftest.$ac_ext
fi
-echo "$as_me:12855: result: $cf_cv_chtype_type" >&5
+echo "$as_me:12972: result: $cf_cv_chtype_type" >&5
echo "${ECHO_T}$cf_cv_chtype_type" >&6
if test $cf_cv_chtype_type = scalar ; then
cat >>confdefs.h <<\EOF
@@ -12862,7 +12979,7 @@ EOF
fi
fi
-echo "$as_me:12865: checking for wide alternate character set array" >&5
+echo "$as_me:12982: checking for wide alternate character set array" >&5
echo $ECHO_N "checking for wide alternate character set array... $ECHO_C" >&6
if test "${cf_cv_curses_wacs_map+set}" = set; then
echo $ECHO_N "(cached) $ECHO_C" >&6
@@ -12872,7 +12989,7 @@ else
for name in wacs_map _wacs_map __wacs_map _nc_wacs _wacs_char
do
cat >conftest.$ac_ext <<_ACEOF
-#line 12875 "configure"
+#line 12992 "configure"
#include "confdefs.h"
#ifndef _XOPEN_SOURCE_EXTENDED
@@ -12888,16 +13005,16 @@ void *foo = &($name['k'])
}
_ACEOF
rm -f conftest.$ac_objext conftest$ac_exeext
-if { (eval echo "$as_me:12891: \"$ac_link\"") >&5
+if { (eval echo "$as_me:13008: \"$ac_link\"") >&5
(eval $ac_link) 2>&5
ac_status=$?
- echo "$as_me:12894: \$? = $ac_status" >&5
+ echo "$as_me:13011: \$? = $ac_status" >&5
(exit $ac_status); } &&
{ ac_try='test -s conftest$ac_exeext'
- { (eval echo "$as_me:12897: \"$ac_try\"") >&5
+ { (eval echo "$as_me:13014: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
- echo "$as_me:12900: \$? = $ac_status" >&5
+ echo "$as_me:13017: \$? = $ac_status" >&5
(exit $ac_status); }; }; then
cf_cv_curses_wacs_map=$name
break
@@ -12908,14 +13025,14 @@ fi
rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext
done
fi
-echo "$as_me:12911: result: $cf_cv_curses_wacs_map" >&5
+echo "$as_me:13028: result: $cf_cv_curses_wacs_map" >&5
echo "${ECHO_T}$cf_cv_curses_wacs_map" >&6
test "$cf_cv_curses_wacs_map" != unknown && cat >>confdefs.h <<EOF
#define CURSES_WACS_ARRAY $cf_cv_curses_wacs_map
EOF
-echo "$as_me:12918: checking for wide alternate character constants" >&5
+echo "$as_me:13035: checking for wide alternate character constants" >&5
echo $ECHO_N "checking for wide alternate character constants... $ECHO_C" >&6
if test "${cf_cv_curses_wacs_symbols+set}" = set; then
echo $ECHO_N "(cached) $ECHO_C" >&6
@@ -12925,7 +13042,7 @@ cf_cv_curses_wacs_symbols=no
if test "$cf_cv_curses_wacs_map" != unknown
then
cat >conftest.$ac_ext <<_ACEOF
-#line 12928 "configure"
+#line 13045 "configure"
#include "confdefs.h"
#ifndef _XOPEN_SOURCE_EXTENDED
@@ -12942,16 +13059,16 @@ cchar_t *foo = WACS_PLUS;
}
_ACEOF
rm -f conftest.$ac_objext conftest$ac_exeext
-if { (eval echo "$as_me:12945: \"$ac_link\"") >&5
+if { (eval echo "$as_me:13062: \"$ac_link\"") >&5
(eval $ac_link) 2>&5
ac_status=$?
- echo "$as_me:12948: \$? = $ac_status" >&5
+ echo "$as_me:13065: \$? = $ac_status" >&5
(exit $ac_status); } &&
{ ac_try='test -s conftest$ac_exeext'
- { (eval echo "$as_me:12951: \"$ac_try\"") >&5
+ { (eval echo "$as_me:13068: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
- echo "$as_me:12954: \$? = $ac_status" >&5
+ echo "$as_me:13071: \$? = $ac_status" >&5
(exit $ac_status); }; }; then
cf_cv_curses_wacs_symbols=yes
else
@@ -12961,7 +13078,7 @@ fi
rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext
else
cat >conftest.$ac_ext <<_ACEOF
-#line 12964 "configure"
+#line 13081 "configure"
#include "confdefs.h"
#ifndef _XOPEN_SOURCE_EXTENDED
@@ -12977,16 +13094,16 @@ cchar_t *foo = WACS_PLUS
}
_ACEOF
rm -f conftest.$ac_objext conftest$ac_exeext
-if { (eval echo "$as_me:12980: \"$ac_link\"") >&5
+if { (eval echo "$as_me:13097: \"$ac_link\"") >&5
(eval $ac_link) 2>&5
ac_status=$?
- echo "$as_me:12983: \$? = $ac_status" >&5
+ echo "$as_me:13100: \$? = $ac_status" >&5
(exit $ac_status); } &&
{ ac_try='test -s conftest$ac_exeext'
- { (eval echo "$as_me:12986: \"$ac_try\"") >&5
+ { (eval echo "$as_me:13103: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
- echo "$as_me:12989: \$? = $ac_status" >&5
+ echo "$as_me:13106: \$? = $ac_status" >&5
(exit $ac_status); }; }; then
cf_cv_curses_wacs_symbols=yes
else
@@ -12997,7 +13114,7 @@ rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext
fi
fi
-echo "$as_me:13000: result: $cf_cv_curses_wacs_symbols" >&5
+echo "$as_me:13117: result: $cf_cv_curses_wacs_symbols" >&5
echo "${ECHO_T}$cf_cv_curses_wacs_symbols" >&6
test "$cf_cv_curses_wacs_symbols" != no && cat >>confdefs.h <<\EOF
@@ -13007,23 +13124,23 @@ EOF
for ac_header in sys/wait.h
do
as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh`
-echo "$as_me:13010: checking for $ac_header" >&5
+echo "$as_me:13127: checking for $ac_header" >&5
echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6
if eval "test \"\${$as_ac_Header+set}\" = set"; then
echo $ECHO_N "(cached) $ECHO_C" >&6
else
cat >conftest.$ac_ext <<_ACEOF
-#line 13016 "configure"
+#line 13133 "configure"
#include "confdefs.h"
#include <$ac_header>
_ACEOF
-if { (eval echo "$as_me:13020: \"$ac_cpp conftest.$ac_ext\"") >&5
+if { (eval echo "$as_me:13137: \"$ac_cpp conftest.$ac_ext\"") >&5
(eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
ac_status=$?
egrep -v '^ *\+' conftest.er1 >conftest.err
rm -f conftest.er1
cat conftest.err >&5
- echo "$as_me:13026: \$? = $ac_status" >&5
+ echo "$as_me:13143: \$? = $ac_status" >&5
(exit $ac_status); } >/dev/null; then
if test -s conftest.err; then
ac_cpp_err=$ac_c_preproc_warn_flag
@@ -13042,7 +13159,7 @@ else
fi
rm -f conftest.err conftest.$ac_ext
fi
-echo "$as_me:13045: result: `eval echo '${'$as_ac_Header'}'`" >&5
+echo "$as_me:13162: result: `eval echo '${'$as_ac_Header'}'`" >&5
echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6
if test `eval echo '${'$as_ac_Header'}'` = yes; then
cat >>confdefs.h <<EOF
@@ -13063,23 +13180,23 @@ else
for ac_header in wait.h
do
as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh`
-echo "$as_me:13066: checking for $ac_header" >&5
+echo "$as_me:13183: checking for $ac_header" >&5
echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6
if eval "test \"\${$as_ac_Header+set}\" = set"; then
echo $ECHO_N "(cached) $ECHO_C" >&6
else
cat >conftest.$ac_ext <<_ACEOF
-#line 13072 "configure"
+#line 13189 "configure"
#include "confdefs.h"
#include <$ac_header>
_ACEOF
-if { (eval echo "$as_me:13076: \"$ac_cpp conftest.$ac_ext\"") >&5
+if { (eval echo "$as_me:13193: \"$ac_cpp conftest.$ac_ext\"") >&5
(eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
ac_status=$?
egrep -v '^ *\+' conftest.er1 >conftest.err
rm -f conftest.er1
cat conftest.err >&5
- echo "$as_me:13082: \$? = $ac_status" >&5
+ echo "$as_me:13199: \$? = $ac_status" >&5
(exit $ac_status); } >/dev/null; then
if test -s conftest.err; then
ac_cpp_err=$ac_c_preproc_warn_flag
@@ -13098,7 +13215,7 @@ else
fi
rm -f conftest.err conftest.$ac_ext
fi
-echo "$as_me:13101: result: `eval echo '${'$as_ac_Header'}'`" >&5
+echo "$as_me:13218: result: `eval echo '${'$as_ac_Header'}'`" >&5
echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6
if test `eval echo '${'$as_ac_Header'}'` = yes; then
cat >>confdefs.h <<EOF
@@ -13111,23 +13228,23 @@ done
for ac_header in waitstatus.h
do
as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh`
-echo "$as_me:13114: checking for $ac_header" >&5
+echo "$as_me:13231: checking for $ac_header" >&5
echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6
if eval "test \"\${$as_ac_Header+set}\" = set"; then
echo $ECHO_N "(cached) $ECHO_C" >&6
else
cat >conftest.$ac_ext <<_ACEOF
-#line 13120 "configure"
+#line 13237 "configure"
#include "confdefs.h"
#include <$ac_header>
_ACEOF
-if { (eval echo "$as_me:13124: \"$ac_cpp conftest.$ac_ext\"") >&5
+if { (eval echo "$as_me:13241: \"$ac_cpp conftest.$ac_ext\"") >&5
(eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
ac_status=$?
egrep -v '^ *\+' conftest.er1 >conftest.err
rm -f conftest.er1
cat conftest.err >&5
- echo "$as_me:13130: \$? = $ac_status" >&5
+ echo "$as_me:13247: \$? = $ac_status" >&5
(exit $ac_status); } >/dev/null; then
if test -s conftest.err; then
ac_cpp_err=$ac_c_preproc_warn_flag
@@ -13146,7 +13263,7 @@ else
fi
rm -f conftest.err conftest.$ac_ext
fi
-echo "$as_me:13149: result: `eval echo '${'$as_ac_Header'}'`" >&5
+echo "$as_me:13266: result: `eval echo '${'$as_ac_Header'}'`" >&5
echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6
if test `eval echo '${'$as_ac_Header'}'` = yes; then
cat >>confdefs.h <<EOF
@@ -13168,14 +13285,14 @@ cf_wait_headers="$cf_wait_headers
fi
fi
-echo "$as_me:13171: checking for union wait" >&5
+echo "$as_me:13288: checking for union wait" >&5
echo $ECHO_N "checking for union wait... $ECHO_C" >&6
if test "${cf_cv_type_unionwait+set}" = set; then
echo $ECHO_N "(cached) $ECHO_C" >&6
else
cat >conftest.$ac_ext <<_ACEOF
-#line 13178 "configure"
+#line 13295 "configure"
#include "confdefs.h"
$cf_wait_headers
int
@@ -13191,16 +13308,16 @@ int x;
}
_ACEOF
rm -f conftest.$ac_objext conftest$ac_exeext
-if { (eval echo "$as_me:13194: \"$ac_link\"") >&5
+if { (eval echo "$as_me:13311: \"$ac_link\"") >&5
(eval $ac_link) 2>&5
ac_status=$?
- echo "$as_me:13197: \$? = $ac_status" >&5
+ echo "$as_me:13314: \$? = $ac_status" >&5
(exit $ac_status); } &&
{ ac_try='test -s conftest$ac_exeext'
- { (eval echo "$as_me:13200: \"$ac_try\"") >&5
+ { (eval echo "$as_me:13317: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
- echo "$as_me:13203: \$? = $ac_status" >&5
+ echo "$as_me:13320: \$? = $ac_status" >&5
(exit $ac_status); }; }; then
cf_cv_type_unionwait=no
echo compiles ok w/o union wait 1>&5
@@ -13210,7 +13327,7 @@ else
cat conftest.$ac_ext >&5
cat >conftest.$ac_ext <<_ACEOF
-#line 13213 "configure"
+#line 13330 "configure"
#include "confdefs.h"
$cf_wait_headers
int
@@ -13230,16 +13347,16 @@ union wait x;
}
_ACEOF
rm -f conftest.$ac_objext conftest$ac_exeext
-if { (eval echo "$as_me:13233: \"$ac_link\"") >&5
+if { (eval echo "$as_me:13350: \"$ac_link\"") >&5
(eval $ac_link) 2>&5
ac_status=$?
- echo "$as_me:13236: \$? = $ac_status" >&5
+ echo "$as_me:13353: \$? = $ac_status" >&5
(exit $ac_status); } &&
{ ac_try='test -s conftest$ac_exeext'
- { (eval echo "$as_me:13239: \"$ac_try\"") >&5
+ { (eval echo "$as_me:13356: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
- echo "$as_me:13242: \$? = $ac_status" >&5
+ echo "$as_me:13359: \$? = $ac_status" >&5
(exit $ac_status); }; }; then
cf_cv_type_unionwait=yes
echo compiles ok with union wait and possibly macros too 1>&5
@@ -13254,7 +13371,7 @@ fi
rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext
fi
-echo "$as_me:13257: result: $cf_cv_type_unionwait" >&5
+echo "$as_me:13374: result: $cf_cv_type_unionwait" >&5
echo "${ECHO_T}$cf_cv_type_unionwait" >&6
test $cf_cv_type_unionwait = yes && cat >>confdefs.h <<\EOF
#define HAVE_TYPE_UNIONWAIT 1
@@ -13262,14 +13379,14 @@ EOF
if test $cf_cv_type_unionwait = yes; then
- echo "$as_me:13265: checking if union wait can be used as wait-arg" >&5
+ echo "$as_me:13382: checking if union wait can be used as wait-arg" >&5
echo $ECHO_N "checking if union wait can be used as wait-arg... $ECHO_C" >&6
if test "${cf_cv_arg_union_wait+set}" = set; then
echo $ECHO_N "(cached) $ECHO_C" >&6
else
cat >conftest.$ac_ext <<_ACEOF
-#line 13272 "configure"
+#line 13389 "configure"
#include "confdefs.h"
$cf_wait_headers
int
@@ -13281,16 +13398,16 @@ union wait x; wait(&x)
}
_ACEOF
rm -f conftest.$ac_objext
-if { (eval echo "$as_me:13284: \"$ac_compile\"") >&5
+if { (eval echo "$as_me:13401: \"$ac_compile\"") >&5
(eval $ac_compile) 2>&5
ac_status=$?
- echo "$as_me:13287: \$? = $ac_status" >&5
+ echo "$as_me:13404: \$? = $ac_status" >&5
(exit $ac_status); } &&
{ ac_try='test -s conftest.$ac_objext'
- { (eval echo "$as_me:13290: \"$ac_try\"") >&5
+ { (eval echo "$as_me:13407: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
- echo "$as_me:13293: \$? = $ac_status" >&5
+ echo "$as_me:13410: \$? = $ac_status" >&5
(exit $ac_status); }; }; then
cf_cv_arg_union_wait=yes
else
@@ -13302,20 +13419,20 @@ rm -f conftest.$ac_objext conftest.$ac_ext
fi
- echo "$as_me:13305: result: $cf_cv_arg_union_wait" >&5
+ echo "$as_me:13422: result: $cf_cv_arg_union_wait" >&5
echo "${ECHO_T}$cf_cv_arg_union_wait" >&6
test $cf_cv_arg_union_wait = yes && cat >>confdefs.h <<\EOF
#define WAIT_USES_UNION 1
EOF
- echo "$as_me:13311: checking if union wait can be used as waitpid-arg" >&5
+ echo "$as_me:13428: checking if union wait can be used as waitpid-arg" >&5
echo $ECHO_N "checking if union wait can be used as waitpid-arg... $ECHO_C" >&6
if test "${cf_cv_arg_union_waitpid+set}" = set; then
echo $ECHO_N "(cached) $ECHO_C" >&6
else
cat >conftest.$ac_ext <<_ACEOF
-#line 13318 "configure"
+#line 13435 "configure"
#include "confdefs.h"
$cf_wait_headers
int
@@ -13327,16 +13444,16 @@ union wait x; waitpid(0, &x, 0)
}
_ACEOF
rm -f conftest.$ac_objext
-if { (eval echo "$as_me:13330: \"$ac_compile\"") >&5
+if { (eval echo "$as_me:13447: \"$ac_compile\"") >&5
(eval $ac_compile) 2>&5
ac_status=$?
- echo "$as_me:13333: \$? = $ac_status" >&5
+ echo "$as_me:13450: \$? = $ac_status" >&5
(exit $ac_status); } &&
{ ac_try='test -s conftest.$ac_objext'
- { (eval echo "$as_me:13336: \"$ac_try\"") >&5
+ { (eval echo "$as_me:13453: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
- echo "$as_me:13339: \$? = $ac_status" >&5
+ echo "$as_me:13456: \$? = $ac_status" >&5
(exit $ac_status); }; }; then
cf_cv_arg_union_waitpid=yes
else
@@ -13348,7 +13465,7 @@ rm -f conftest.$ac_objext conftest.$ac_ext
fi
- echo "$as_me:13351: result: $cf_cv_arg_union_waitpid" >&5
+ echo "$as_me:13468: result: $cf_cv_arg_union_waitpid" >&5
echo "${ECHO_T}$cf_cv_arg_union_waitpid" >&6
test $cf_cv_arg_union_waitpid = yes && cat >>confdefs.h <<\EOF
#define WAITPID_USES_UNION 1
@@ -13356,14 +13473,14 @@ EOF
fi
-echo "$as_me:13359: checking if we must include wchar.h to declare mbstate_t" >&5
+echo "$as_me:13476: checking if we must include wchar.h to declare mbstate_t" >&5
echo $ECHO_N "checking if we must include wchar.h to declare mbstate_t... $ECHO_C" >&6
if test "${cf_cv_mbstate_t+set}" = set; then
echo $ECHO_N "(cached) $ECHO_C" >&6
else
cat >conftest.$ac_ext <<_ACEOF
-#line 13366 "configure"
+#line 13483 "configure"
#include "confdefs.h"
#include <stdlib.h>
@@ -13380,23 +13497,23 @@ mbstate_t state
}
_ACEOF
rm -f conftest.$ac_objext
-if { (eval echo "$as_me:13383: \"$ac_compile\"") >&5
+if { (eval echo "$as_me:13500: \"$ac_compile\"") >&5
(eval $ac_compile) 2>&5
ac_status=$?
- echo "$as_me:13386: \$? = $ac_status" >&5
+ echo "$as_me:13503: \$? = $ac_status" >&5
(exit $ac_status); } &&
{ ac_try='test -s conftest.$ac_objext'
- { (eval echo "$as_me:13389: \"$ac_try\"") >&5
+ { (eval echo "$as_me:13506: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
- echo "$as_me:13392: \$? = $ac_status" >&5
+ echo "$as_me:13509: \$? = $ac_status" >&5
(exit $ac_status); }; }; then
cf_cv_mbstate_t=no
else
echo "$as_me: failed program was:" >&5
cat conftest.$ac_ext >&5
cat >conftest.$ac_ext <<_ACEOF
-#line 13399 "configure"
+#line 13516 "configure"
#include "confdefs.h"
#include <stdlib.h>
@@ -13414,16 +13531,16 @@ mbstate_t value
}
_ACEOF
rm -f conftest.$ac_objext
-if { (eval echo "$as_me:13417: \"$ac_compile\"") >&5
+if { (eval echo "$as_me:13534: \"$ac_compile\"") >&5
(eval $ac_compile) 2>&5
ac_status=$?
- echo "$as_me:13420: \$? = $ac_status" >&5
+ echo "$as_me:13537: \$? = $ac_status" >&5
(exit $ac_status); } &&
{ ac_try='test -s conftest.$ac_objext'
- { (eval echo "$as_me:13423: \"$ac_try\"") >&5
+ { (eval echo "$as_me:13540: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
- echo "$as_me:13426: \$? = $ac_status" >&5
+ echo "$as_me:13543: \$? = $ac_status" >&5
(exit $ac_status); }; }; then
cf_cv_mbstate_t=yes
else
@@ -13435,7 +13552,7 @@ rm -f conftest.$ac_objext conftest.$ac_ext
fi
rm -f conftest.$ac_objext conftest.$ac_ext
fi
-echo "$as_me:13438: result: $cf_cv_mbstate_t" >&5
+echo "$as_me:13555: result: $cf_cv_mbstate_t" >&5
echo "${ECHO_T}$cf_cv_mbstate_t" >&6
if test "$cf_cv_mbstate_t" = yes ; then
@@ -13458,7 +13575,7 @@ PACKAGE_CONFIG=dlg_config.h
EXTRA_OUTPUT="$EXTRA_OUTPUT headers-sh:$srcdir/headers-sh.in"
cat >conftest.$ac_ext <<_ACEOF
-#line 13461 "configure"
+#line 13578 "configure"
#include "confdefs.h"
#include <locale.h>
int
@@ -13470,16 +13587,16 @@ setlocale(LC_ALL, "")
}
_ACEOF
rm -f conftest.$ac_objext conftest$ac_exeext
-if { (eval echo "$as_me:13473: \"$ac_link\"") >&5
+if { (eval echo "$as_me:13590: \"$ac_link\"") >&5
(eval $ac_link) 2>&5
ac_status=$?
- echo "$as_me:13476: \$? = $ac_status" >&5
+ echo "$as_me:13593: \$? = $ac_status" >&5
(exit $ac_status); } &&
{ ac_try='test -s conftest$ac_exeext'
- { (eval echo "$as_me:13479: \"$ac_try\"") >&5
+ { (eval echo "$as_me:13596: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
- echo "$as_me:13482: \$? = $ac_status" >&5
+ echo "$as_me:13599: \$? = $ac_status" >&5
(exit $ac_status); }; }; then
cat >>confdefs.h <<\EOF
#define HAVE_SETLOCALE 1
@@ -13492,7 +13609,7 @@ fi
rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext
LD_RPATH_OPT=
-echo "$as_me:13495: checking for an rpath option" >&5
+echo "$as_me:13612: checking for an rpath option" >&5
echo $ECHO_N "checking for an rpath option... $ECHO_C" >&6
case $cf_cv_system_name in #(vi
irix*) #(vi
@@ -13505,7 +13622,7 @@ irix*) #(vi
linux*|gnu*|k*bsd*-gnu) #(vi
LD_RPATH_OPT="-Wl,-rpath,"
;;
-openbsd[2-9].*) #(vi
+openbsd[2-9].*|mirbsd*) #(vi
LD_RPATH_OPT="-Wl,-rpath,"
;;
freebsd*) #(vi
@@ -13523,17 +13640,17 @@ solaris2*) #(vi
*)
;;
esac
-echo "$as_me:13526: result: $LD_RPATH_OPT" >&5
+echo "$as_me:13643: result: $LD_RPATH_OPT" >&5
echo "${ECHO_T}$LD_RPATH_OPT" >&6
case "x$LD_RPATH_OPT" in #(vi
x-R*)
- echo "$as_me:13531: checking if we need a space after rpath option" >&5
+ echo "$as_me:13648: checking if we need a space after rpath option" >&5
echo $ECHO_N "checking if we need a space after rpath option... $ECHO_C" >&6
cf_save_LIBS="$LIBS"
LIBS="${LD_RPATH_OPT}$libdir $LIBS"
cat >conftest.$ac_ext <<_ACEOF
-#line 13536 "configure"
+#line 13653 "configure"
#include "confdefs.h"
int
@@ -13545,16 +13662,16 @@ main ()
}
_ACEOF
rm -f conftest.$ac_objext conftest$ac_exeext
-if { (eval echo "$as_me:13548: \"$ac_link\"") >&5
+if { (eval echo "$as_me:13665: \"$ac_link\"") >&5
(eval $ac_link) 2>&5
ac_status=$?
- echo "$as_me:13551: \$? = $ac_status" >&5
+ echo "$as_me:13668: \$? = $ac_status" >&5
(exit $ac_status); } &&
{ ac_try='test -s conftest$ac_exeext'
- { (eval echo "$as_me:13554: \"$ac_try\"") >&5
+ { (eval echo "$as_me:13671: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
- echo "$as_me:13557: \$? = $ac_status" >&5
+ echo "$as_me:13674: \$? = $ac_status" >&5
(exit $ac_status); }; }; then
cf_rpath_space=no
else
@@ -13564,14 +13681,14 @@ cf_rpath_space=yes
fi
rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext
LIBS="$cf_save_LIBS"
- echo "$as_me:13567: result: $cf_rpath_space" >&5
+ echo "$as_me:13684: result: $cf_rpath_space" >&5
echo "${ECHO_T}$cf_rpath_space" >&6
test "$cf_rpath_space" = yes && LD_RPATH_OPT="$LD_RPATH_OPT "
;;
esac
-echo "$as_me:13573: checking if rpath should be not be set" >&5
-echo $ECHO_N "checking if rpath should be not be set... $ECHO_C" >&6
+echo "$as_me:13690: checking if rpath-hack should be disabled" >&5
+echo $ECHO_N "checking if rpath-hack should be disabled... $ECHO_C" >&6
# Check whether --enable-rpath-hack or --disable-rpath-hack was given.
if test "${enable_rpath_hack+set}" = set; then
@@ -13587,21 +13704,21 @@ else
cf_disable_rpath_hack=no
fi;
-echo "$as_me:13590: result: $cf_disable_rpath_hack" >&5
+echo "$as_me:13707: result: $cf_disable_rpath_hack" >&5
echo "${ECHO_T}$cf_disable_rpath_hack" >&6
if test "$cf_disable_rpath_hack" = no ; then
-echo "$as_me:13594: checking for updated LDFLAGS" >&5
+echo "$as_me:13711: checking for updated LDFLAGS" >&5
echo $ECHO_N "checking for updated LDFLAGS... $ECHO_C" >&6
if test -n "$LD_RPATH_OPT" ; then
- echo "$as_me:13597: result: maybe" >&5
+ echo "$as_me:13714: result: maybe" >&5
echo "${ECHO_T}maybe" >&6
for ac_prog in ldd
do
# Extract the first word of "$ac_prog", so it can be a program name with args.
set dummy $ac_prog; ac_word=$2
-echo "$as_me:13604: checking for $ac_word" >&5
+echo "$as_me:13721: checking for $ac_word" >&5
echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
if test "${ac_cv_prog_cf_ldd_prog+set}" = set; then
echo $ECHO_N "(cached) $ECHO_C" >&6
@@ -13616,7 +13733,7 @@ for ac_dir in $ac_dummy; do
test -z "$ac_dir" && ac_dir=.
$as_executable_p "$ac_dir/$ac_word" || continue
ac_cv_prog_cf_ldd_prog="$ac_prog"
-echo "$as_me:13619: found $ac_dir/$ac_word" >&5
+echo "$as_me:13736: found $ac_dir/$ac_word" >&5
break
done
@@ -13624,10 +13741,10 @@ fi
fi
cf_ldd_prog=$ac_cv_prog_cf_ldd_prog
if test -n "$cf_ldd_prog"; then
- echo "$as_me:13627: result: $cf_ldd_prog" >&5
+ echo "$as_me:13744: result: $cf_ldd_prog" >&5
echo "${ECHO_T}$cf_ldd_prog" >&6
else
- echo "$as_me:13630: result: no" >&5
+ echo "$as_me:13747: result: no" >&5
echo "${ECHO_T}no" >&6
fi
@@ -13638,8 +13755,10 @@ test -n "$cf_ldd_prog" || cf_ldd_prog="no"
cf_rpath_list="/usr/lib /lib"
if test "$cf_ldd_prog" != no
then
+ cf_rpath_oops=
+
cat >conftest.$ac_ext <<_ACEOF
-#line 13642 "configure"
+#line 13761 "configure"
#include "confdefs.h"
#include <stdio.h>
int
@@ -13651,32 +13770,60 @@ printf("Hello");
}
_ACEOF
rm -f conftest.$ac_objext conftest$ac_exeext
-if { (eval echo "$as_me:13654: \"$ac_link\"") >&5
+if { (eval echo "$as_me:13773: \"$ac_link\"") >&5
(eval $ac_link) 2>&5
ac_status=$?
- echo "$as_me:13657: \$? = $ac_status" >&5
+ echo "$as_me:13776: \$? = $ac_status" >&5
(exit $ac_status); } &&
{ ac_try='test -s conftest$ac_exeext'
- { (eval echo "$as_me:13660: \"$ac_try\"") >&5
+ { (eval echo "$as_me:13779: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
- echo "$as_me:13663: \$? = $ac_status" >&5
+ echo "$as_me:13782: \$? = $ac_status" >&5
(exit $ac_status); }; }; then
- cf_rpath_list=`$cf_ldd_prog conftest$ac_exeext | fgrep / | sed -e 's%^.*[ ]/%/%' -e 's%/[^/][^/]*$%%' |sort -u`
+ cf_rpath_oops=`$cf_ldd_prog conftest$ac_exeext | fgrep ' not found' | sed -e 's% =>.*$%%' |sort -u`
+ cf_rpath_list=`$cf_ldd_prog conftest$ac_exeext | fgrep / | sed -e 's%^.*[ ]/%/%' -e 's%/[^/][^/]*$%%' |sort -u`
else
echo "$as_me: failed program was:" >&5
cat conftest.$ac_ext >&5
fi
rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext
+
+ # If we passed the link-test, but get a "not found" on a given library,
+ # this could be due to inept reconfiguration of gcc to make it only
+ # partly honor /usr/local/lib (or whatever). Sometimes this behavior
+ # is intentional, e.g., installing gcc in /usr/bin and suppressing the
+ # /usr/local libraries.
+ if test -n "$cf_rpath_oops"
+ then
+ for cf_rpath_src in $cf_rpath_oops
+ do
+ for cf_rpath_dir in \
+ /usr/local \
+ /usr/pkg \
+ /opt/sfw
+ do
+ if test -f $cf_rpath_dir/lib/$cf_rpath_src
+ then
+ test -n "$verbose" && echo " ...adding -L$cf_rpath_dir/lib to LDFLAGS for $cf_rpath_src" 1>&6
+
+echo "${as_me:-configure}:13810: testing ...adding -L$cf_rpath_dir/lib to LDFLAGS for $cf_rpath_src ..." 1>&5
+
+ LDFLAGS="$LDFLAGS -L$cf_rpath_dir/lib"
+ break
+ fi
+ done
+ done
+ fi
fi
test -n "$verbose" && echo " ...checking EXTRA_LDFLAGS $EXTRA_LDFLAGS" 1>&6
-echo "${as_me:-configure}:13675: testing ...checking EXTRA_LDFLAGS $EXTRA_LDFLAGS ..." 1>&5
+echo "${as_me:-configure}:13822: testing ...checking EXTRA_LDFLAGS $EXTRA_LDFLAGS ..." 1>&5
test -n "$verbose" && echo " ...checking LDFLAGS $LDFLAGS" 1>&6
-echo "${as_me:-configure}:13679: testing ...checking LDFLAGS $LDFLAGS ..." 1>&5
+echo "${as_me:-configure}:13826: testing ...checking LDFLAGS $LDFLAGS ..." 1>&5
cf_rpath_dst=
for cf_rpath_src in $LDFLAGS
@@ -13713,7 +13860,7 @@ do
then
test -n "$verbose" && echo " ...Filter $cf_rpath_src ->$cf_rpath_tmp" 1>&6
-echo "${as_me:-configure}:13716: testing ...Filter $cf_rpath_src ->$cf_rpath_tmp ..." 1>&5
+echo "${as_me:-configure}:13863: testing ...Filter $cf_rpath_src ->$cf_rpath_tmp ..." 1>&5
EXTRA_LDFLAGS="$cf_rpath_tmp $EXTRA_LDFLAGS"
fi
@@ -13726,11 +13873,11 @@ LDFLAGS=$cf_rpath_dst
test -n "$verbose" && echo " ...checked LDFLAGS $LDFLAGS" 1>&6
-echo "${as_me:-configure}:13729: testing ...checked LDFLAGS $LDFLAGS ..." 1>&5
+echo "${as_me:-configure}:13876: testing ...checked LDFLAGS $LDFLAGS ..." 1>&5
test -n "$verbose" && echo " ...checking LIBS $LIBS" 1>&6
-echo "${as_me:-configure}:13733: testing ...checking LIBS $LIBS ..." 1>&5
+echo "${as_me:-configure}:13880: testing ...checking LIBS $LIBS ..." 1>&5
cf_rpath_dst=
for cf_rpath_src in $LIBS
@@ -13767,7 +13914,7 @@ do
then
test -n "$verbose" && echo " ...Filter $cf_rpath_src ->$cf_rpath_tmp" 1>&6
-echo "${as_me:-configure}:13770: testing ...Filter $cf_rpath_src ->$cf_rpath_tmp ..." 1>&5
+echo "${as_me:-configure}:13917: testing ...Filter $cf_rpath_src ->$cf_rpath_tmp ..." 1>&5
EXTRA_LDFLAGS="$cf_rpath_tmp $EXTRA_LDFLAGS"
fi
@@ -13780,11 +13927,11 @@ LIBS=$cf_rpath_dst
test -n "$verbose" && echo " ...checked LIBS $LIBS" 1>&6
-echo "${as_me:-configure}:13783: testing ...checked LIBS $LIBS ..." 1>&5
+echo "${as_me:-configure}:13930: testing ...checked LIBS $LIBS ..." 1>&5
test -n "$verbose" && echo " ...checked EXTRA_LDFLAGS $EXTRA_LDFLAGS" 1>&6
-echo "${as_me:-configure}:13787: testing ...checked EXTRA_LDFLAGS $EXTRA_LDFLAGS ..." 1>&5
+echo "${as_me:-configure}:13934: testing ...checked EXTRA_LDFLAGS $EXTRA_LDFLAGS ..." 1>&5
fi
@@ -13871,7 +14018,7 @@ DEFS=-DHAVE_CONFIG_H
: ${CONFIG_STATUS=./config.status}
ac_clean_files_save=$ac_clean_files
ac_clean_files="$ac_clean_files $CONFIG_STATUS"
-{ echo "$as_me:13874: creating $CONFIG_STATUS" >&5
+{ echo "$as_me:14021: creating $CONFIG_STATUS" >&5
echo "$as_me: creating $CONFIG_STATUS" >&6;}
cat >$CONFIG_STATUS <<_ACEOF
#! $SHELL
@@ -14047,7 +14194,7 @@ cat >>$CONFIG_STATUS <<\EOF
echo "$ac_cs_version"; exit 0 ;;
--he | --h)
# Conflict between --help and --header
- { { echo "$as_me:14050: error: ambiguous option: $1
+ { { echo "$as_me:14197: error: ambiguous option: $1
Try \`$0 --help' for more information." >&5
echo "$as_me: error: ambiguous option: $1
Try \`$0 --help' for more information." >&2;}
@@ -14066,7 +14213,7 @@ Try \`$0 --help' for more information." >&2;}
ac_need_defaults=false;;
# This is an error.
- -*) { { echo "$as_me:14069: error: unrecognized option: $1
+ -*) { { echo "$as_me:14216: error: unrecognized option: $1
Try \`$0 --help' for more information." >&5
echo "$as_me: error: unrecognized option: $1
Try \`$0 --help' for more information." >&2;}
@@ -14116,7 +14263,7 @@ do
"default-1" ) CONFIG_COMMANDS="$CONFIG_COMMANDS default-1" ;;
"default" ) CONFIG_COMMANDS="$CONFIG_COMMANDS default" ;;
"dlg_config.h" ) CONFIG_HEADERS="$CONFIG_HEADERS dlg_config.h:config.hin" ;;
- *) { { echo "$as_me:14119: error: invalid argument: $ac_config_target" >&5
+ *) { { echo "$as_me:14266: error: invalid argument: $ac_config_target" >&5
echo "$as_me: error: invalid argument: $ac_config_target" >&2;}
{ (exit 1); exit 1; }; };;
esac
@@ -14407,7 +14554,7 @@ done; }
esac
if test x"$ac_file" != x-; then
- { echo "$as_me:14410: creating $ac_file" >&5
+ { echo "$as_me:14557: creating $ac_file" >&5
echo "$as_me: creating $ac_file" >&6;}
rm -f "$ac_file"
fi
@@ -14425,7 +14572,7 @@ echo "$as_me: creating $ac_file" >&6;}
-) echo $tmp/stdin ;;
[\\/$]*)
# Absolute (can't be DOS-style, as IFS=:)
- test -f "$f" || { { echo "$as_me:14428: error: cannot find input file: $f" >&5
+ test -f "$f" || { { echo "$as_me:14575: error: cannot find input file: $f" >&5
echo "$as_me: error: cannot find input file: $f" >&2;}
{ (exit 1); exit 1; }; }
echo $f;;
@@ -14438,7 +14585,7 @@ echo "$as_me: error: cannot find input file: $f" >&2;}
echo $srcdir/$f
else
# /dev/null tree
- { { echo "$as_me:14441: error: cannot find input file: $f" >&5
+ { { echo "$as_me:14588: error: cannot find input file: $f" >&5
echo "$as_me: error: cannot find input file: $f" >&2;}
{ (exit 1); exit 1; }; }
fi;;
@@ -14504,7 +14651,7 @@ for ac_file in : $CONFIG_HEADERS; do test "x$ac_file" = x: && continue
* ) ac_file_in=$ac_file.in ;;
esac
- test x"$ac_file" != x- && { echo "$as_me:14507: creating $ac_file" >&5
+ test x"$ac_file" != x- && { echo "$as_me:14654: creating $ac_file" >&5
echo "$as_me: creating $ac_file" >&6;}
# First look for the input files in the build tree, otherwise in the
@@ -14515,7 +14662,7 @@ echo "$as_me: creating $ac_file" >&6;}
-) echo $tmp/stdin ;;
[\\/$]*)
# Absolute (can't be DOS-style, as IFS=:)
- test -f "$f" || { { echo "$as_me:14518: error: cannot find input file: $f" >&5
+ test -f "$f" || { { echo "$as_me:14665: error: cannot find input file: $f" >&5
echo "$as_me: error: cannot find input file: $f" >&2;}
{ (exit 1); exit 1; }; }
echo $f;;
@@ -14528,7 +14675,7 @@ echo "$as_me: error: cannot find input file: $f" >&2;}
echo $srcdir/$f
else
# /dev/null tree
- { { echo "$as_me:14531: error: cannot find input file: $f" >&5
+ { { echo "$as_me:14678: error: cannot find input file: $f" >&5
echo "$as_me: error: cannot find input file: $f" >&2;}
{ (exit 1); exit 1; }; }
fi;;
@@ -14586,7 +14733,7 @@ cat >>$CONFIG_STATUS <<\EOF
rm -f $tmp/in
if test x"$ac_file" != x-; then
if cmp -s $ac_file $tmp/config.h 2>/dev/null; then
- { echo "$as_me:14589: $ac_file is unchanged" >&5
+ { echo "$as_me:14736: $ac_file is unchanged" >&5
echo "$as_me: $ac_file is unchanged" >&6;}
else
ac_dir=`$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
diff --git a/contrib/dialog/configure.in b/contrib/dialog/configure.in
index 5ecd8fb..2feac73 100644
--- a/contrib/dialog/configure.in
+++ b/contrib/dialog/configure.in
@@ -1,4 +1,4 @@
-dnl $Id: configure.in,v 1.64 2011/03/01 00:59:50 tom Exp $
+dnl $Id: configure.in,v 1.65 2011/06/27 10:42:27 tom Exp $
dnl Process this file with autoconf to produce a configure script.
dnl ---------------------------------------------------------------------------
dnl Copyright 1999-2010,2011 -- Thomas E. Dickey
@@ -225,6 +225,7 @@ getparx \
getpary \
getparyx \
use_default_colors \
+wchgat \
wget_wch \
)
diff --git a/contrib/dialog/dialog.1 b/contrib/dialog/dialog.1
index fc99311..8fd4de1 100644
--- a/contrib/dialog/dialog.1
+++ b/contrib/dialog/dialog.1
@@ -1,5 +1,5 @@
'\" t
-.\" $Id: dialog.1,v 1.126 2011/03/02 01:24:21 tom Exp $
+.\" $Id: dialog.1,v 1.133 2011/06/29 09:39:29 tom Exp $
.\" Copyright 2005-2010,2011 Thomas E. Dickey
.\"
.\" This program is free software; you can redistribute it and/or modify
@@ -36,7 +36,7 @@
.RE
..
.
-.TH \*D 1 "" "$Date: 2011/03/02 01:24:21 $"
+.TH \*D 1 "" "$Date: 2011/06/29 09:39:29 $"
.SH NAME
\*p \- display dialog boxes from shell scripts
.SH SYNOPSIS
@@ -285,8 +285,9 @@ Override the label used for "Extra" buttons.
Note: for inputmenu widgets, this defaults to "Rename".
.
.IP "\fB--help"
-Prints the help message to \fB\*p\fP's output.
-The help message is printed if no options are given.
+Prints the help message to the standard output and exits.
+The help message is also printed if no options are given,
+or if an unrecognized option is given.
.
.IP "\fB--help-button"
Show a help-button after "OK" and "Cancel" buttons,
@@ -307,6 +308,12 @@ after the item-help "HELP" information.
This can be used to reconstruct the state of a checklist after processing
the help request.
.
+.IP "\fB--hfile \fIfilename"
+Display the given file using a textbox when the user presses F1.
+.
+.IP "\fB--hline \fIstring"
+Display the given string centered at the bottom of the widget.
+.
.IP "\fB--ignore"
Ignore options that \fB\*p\fP does not recognize.
Some well-known ones such as "\fB--icon\fP" are ignored anyway,
@@ -385,6 +392,10 @@ See also "\fB--ascii-lines\fR".
.IP "\fB--no-mouse
Do not enable the mouse.
.
+.IP "\fB--no-nl-expand
+Do not convert "\\n" substrings of the message/prompt text into
+literal newlines.
+.
.IP "\fB--no-ok"
.IP "\fB--nook"
Suppress the "OK" button in checklist, inputbox and menu box modes.
@@ -420,8 +431,9 @@ Prints the size of each dialog box to \fB\*p\fP's output.
.IP "\fB--print-version"
Prints \fB\*p\fR's version to \fB\*p\fP's output.
This may be used alone, without other options.
+It does not cause \fBdialog\fP to exit by itself.
.
-.IP "\fB--scrollbar \fIstring"
+.IP "\fB--scrollbar"
For widgets holding a scrollable set of data,
draw a scrollbar on its right-margin.
This does not respond to the mouse.
@@ -501,6 +513,7 @@ string to be displayed at the top of the dialog box.
logs the command-line parameters and
keystrokes to the given file.
If \fBdialog\fP reads a configure file, it is logged as well.
+Piped input to the \fIgauge\fP widget is logged.
Use control/T to log a picture of the current dialog window.
.
.IP "\fB--trim"
@@ -511,7 +524,8 @@ trim literal newlines and repeated blanks from message text.
See also the "\fB--cr-wrap\fR" and "\fB--no-collapse\fR" options.
.
.IP "\fB--version"
-Same as "\fB--print-version\fP".
+Prints \fB\*p\fR's version to the standard output, and exits.
+See also "\fB--print-version\fP".
.
.IP "\fB--visit-items"
Modify the tab-traversal of checklist, radiobox, menubox and inputmenu
@@ -1278,12 +1292,13 @@ also does not work for common options of \*p, such as the gauge box.
original dialog 0.4 program.
.PP
\fBwhiptail\fP's manpage borrows features from \fB\*p\fP, e.g.,
-\fB--default-item\fP, \fB--output-fd\fP,
-but oddly cites only \fB\*p\fP versions up to 0.4 as a source.
+\fB--default-item\fP (2000),
+\fB--output-fd\fP (2002),
+but oddly cites only \fB\*p\fP versions up to 0.4 (1996) as a source.
That is, its manpage refers to features which
were borrowed from more recent versions of \fB\*p\fP, e.g.,
the \fB--gauge\fP and \fB--password\fP boxes,
-as well as options such as \fB-separate-output\fP.
+as well as options such as \fB-separate-output\fP (2008).
Somewhat humorously, one may note that the \fBpopt\fP feature
(undocumented in its manpage)
of using a "--" as an escape was documented in \fB\*p\fP's manpage about
diff --git a/contrib/dialog/dialog.3 b/contrib/dialog/dialog.3
index 521684a..62938af 100644
--- a/contrib/dialog/dialog.3
+++ b/contrib/dialog/dialog.3
@@ -1,4 +1,4 @@
-.\" $Id: dialog.3,v 1.60 2011/03/02 10:19:12 tom Exp $
+.\" $Id: dialog.3,v 1.68 2011/06/29 09:07:36 tom Exp $
.\" Copyright 2005-2010,2011 Thomas E. Dickey
.\"
.\" This program is free software; you can redistribute it and/or modify
@@ -21,11 +21,24 @@
.ds l dialog
.ds L Dialog
.ds D DIALOG
+.
+.de ES
+.ne 8
+.IP
+..
+.de EX
+.RS +10
+.nf
+..
+.de EE
+.fi
+.RE
+..
.\" Bulleted paragraph
.de bP
.IP \(bu 4
..
-.TH \*D 3 "" "$Date: 2011/03/02 10:19:12 $"
+.TH \*D 3 "" "$Date: 2011/06/29 09:07:36 $"
.SH NAME
\*l \- widgets and utilities for the \*p program
.SH SYNOPSIS
@@ -66,7 +79,7 @@ Colors and video attributes are categorized and associated with
settings in the configuration file
(see the discussion of \fI$DIALOGRC\fP in \fB\*p\fP(1)).
The \fIDIALOG_ATR(n)\fP macro is used for defining the references
-to the combined color and attribute table \fIdlg_color_table[]\fP.
+to the combined color and attribute table \fBdlg_color_table[]\fP.
.PP
The \fB\*p\fP application passes its command-line parameters
to the widget functions. Some of those parameters are single values,
@@ -85,7 +98,7 @@ These include definitions based on the generated \fI<dlg_config.h>\fP header.
.SH DATA STRUCTURES
All of the global data for the \fB\*l\fP library is stored in
a few structures: \fIDIALOG_STATE\fP, \fIDIALOG_VARS\fP and \fIDIALOG_COLORS\fP.
-The corresponding \fIdialog_state\fP, \fIdialog_vars\fP and \fIdlg_color_table\fP
+The corresponding \fBdialog_state\fP, \fBdialog_vars\fP and \fBdlg_color_table\fP
global variables should be initialized to zeros,
and then populated with the data to use.
A few of these must be nonzero for the corresponding widgets to function.
@@ -133,7 +146,7 @@ prefer to write results to the standard output,
e.g., by using the "\fB--stdout\fP" option.
.\" ---------------------------------------------------------------------------
.IP \fIDIALOG_STATE.output_count
-This is incremented by \fIdlg_does_output\fP,
+This is incremented by \fBdlg_does_output\fP,
which is called by each widget that writes text to the output.
The \fB\*p\fP application uses that to decide if it should
also write a separator, i.e.,
@@ -205,12 +218,15 @@ suppress shadows that would be drawn to the right and bottom of each dialog box.
This corresponds to the command-line option "\fB--visit-items\fP".
.\" ---------------------------------------------------------------------------
.PP
-The \fB\*p\fP application resets the \fIdialog_vars\fP data before
+The \fB\*p\fP application resets the \fBdialog_vars\fP data before
accepting options to invoke each widget.
Most of the \fIDIALOG_VARS\fP members are set directly from \fB\*p\fP's
command-line options:
.\" ---------------------------------------------------------------------------
.IP \fIDIALOG_VARS.ascii_lines
+This corresponds to the command-line option "\fB--ascii-lines\fP.
+It causes line-drawing to be done with ASCII characters, e.g., "+" and "-".
+See \fIDIALOG_VARS.no_lines\fP.
.\" ---------------------------------------------------------------------------
.IP \fIDIALOG_VARS.backtitle
This corresponds to the command-line option "\fB--backtitle\fP \fIbacktitle\fP".
@@ -344,10 +360,20 @@ and the item-help text will be written to \fB\*p\fP's output after the token "HE
Otherwise, the return status will indicate that the Help button was pressed,
and no message printed.
.\" ---------------------------------------------------------------------------
+.IP \fIDIALOG_VARS.help_file
+This corresponds to the command-line option "\fB--hfile\fP \fIstring\fP".
+The given filename is passed to \fBdialog_helpfile\fP when the user
+presses F1.
+.\" ---------------------------------------------------------------------------
.IP \fIDIALOG_VARS.help_label
This corresponds to the command-line option "\fB--help-label\fP \fIstring\fP".
The given string overrides the label used for "Help" buttons.
.\" ---------------------------------------------------------------------------
+.IP \fIDIALOG_VARS.help_line
+This corresponds to the command-line option "\fB--hline\fP \fIstring\fP".
+The given string is displayed in the bottom of dialog windows,
+like a subtitle.
+.\" ---------------------------------------------------------------------------
.IP \fIDIALOG_VARS.help_status
This corresponds to the command-line option "\fB--help-status\fP".
If true, and the the help-button is selected,
@@ -391,6 +417,10 @@ This corresponds to the command-line option "\fB--insecure\fP".
If true, make the password widget friendlier but less secure,
by echoing asterisks for each character.
.\" ---------------------------------------------------------------------------
+.IP \fIDIALOG_VARS.in_helpfile
+This variable is used to prevent \fBdialog_helpfile\fP from showing
+anything, e.g., if F1 were pressed within a help-file display.
+.\" ---------------------------------------------------------------------------
.IP \fIDIALOG_VARS.item_help
This corresponds to the command-line option "\fB--item-help\fP".
If true,
@@ -423,6 +453,14 @@ This corresponds to the command-line option "\fB--no-label\fP \fIstring\fP".
The given string overrides the label used for "No" buttons.
.\" ---------------------------------------------------------------------------
.IP \fIDIALOG_VARS.no_lines
+This corresponds to the command-line option "\fB--no-lines\fP.
+It suppresses line-drawing.
+See \fIDIALOG_VARS.ascii_lines\fP.
+.\" ---------------------------------------------------------------------------
+.IP \fIDIALOG_VARS.no_nl_expand
+This corresponds to the command-line option "\fB--no-nl-expand\fP".
+If false, \fBdlg_trim_string\fP converts literal "\\n" substrings
+in a message into newlines.
.\" ---------------------------------------------------------------------------
.IP \fIDIALOG_VARS.nocancel
This corresponds to the command-line option "\fB--no-cancel\fP".
@@ -537,24 +575,31 @@ Other parameters depend on the box type.
.IP \fBdialog_calendar
implements the "\fB--calendar\fP" option.
.RS
-.IP title
+.TP 5
+.B const char * \fItitle
is the title on the top of the widget.
-.IP subtitle
+.TP 5
+.B const char * \fIsubtitle
is the prompt text shown within the widget.
-.IP height
+.TP 5
+.B int \fIheight
is the height excluding the fixed-height calendar grid.
-.IP width
+.TP 5
+.B int \fIwidth
is the overall width of the box,
which is adjusted up to the calendar grid's minimum width if needed.
-.IP day
+.TP 5
+.B int \fIday
is the initial day of the week shown,
counting zero as Sunday.
If the value is negative, the current day of the week is used.
-.IP month
+.TP 5
+.B int \fImonth
is the initial month of the year shown,
counting one as January.
If the value is negative, the current month of the year is used.
-.IP year
+.TP 5
+.B int \fIyear
is the initial year shown.
If the value is negative, the current year is used.
.RE
@@ -563,22 +608,29 @@ If the value is negative, the current year is used.
implements the "\fB--checklist\fP" and "\fB--radiolist\fP" options
depending on the \fIflag\fP parameter.
.RS
-.IP title
+.TP 5
+.B const char * \fItitle
is the title on the top of the widget.
-.IP cprompt
+.TP 5
+.B const char * \fIcprompt
is the prompt text shown within the widget.
-.IP height
+.TP 5
+.B int \fIheight
is the desired height of the box.
If zero, the height is adjusted to use the available screen size.
-.IP width
+.TP 5
+.B int \fIwidth
is the desired width of the box.
If zero, the height is adjusted to use the available screen size.
-.IP list_height
+.TP 5
+.B int \fIlist_height
is the minimum height to reserve for displaying the list.
If zero, it is computed based on the given \fIheight\fP and \fIwidth\fP.
-.IP item_no
+.TP 5
+.B int \fIitem_no
is the number of rows in \fIitems\fP.
-.IP items
+.TP 5
+.B int \fIitems
is an array of strings which is viewed either as a list of rows
.RS
\fItag item status \fR
@@ -589,7 +641,7 @@ or
\fItag item status help\fR
.RE
.IP
-depending on whether \fIdialog_vars.item_help\fP is set.
+depending on whether \fBdialog_vars.item_help\fP is set.
.IP flag
is either \fIFLAG_CHECK\fP, for checklists,
or \fIFLAG_RADIO\fP for radiolists.
@@ -598,15 +650,19 @@ or \fIFLAG_RADIO\fP for radiolists.
.IP \fBdialog_dselect
implements the "\fB--dselect\fP" option.
.RS
-.IP title
+.TP 5
+.B const char * \fItitle
is the title on the top of the widget.
-.IP path
+.TP 5
+.B const char * \fIpath
is the preselected value to show in the input-box,
which is used also to set the directory- and file-windows.
-.IP height
+.TP 5
+.B int \fIheight
is the height excluding the minimum needed to show the dialog box framework.
If zero, the height is based on the screen size.
-.IP width
+.TP 5
+.B int \fIwidth
is the desired width of the box.
If zero, the height is based on the screen size.
.RE
@@ -614,14 +670,18 @@ If zero, the height is based on the screen size.
.IP \fBdialog_editbox
implements the "\fB--editbox\fP" option.
.RS
-.IP title
+.TP 5
+.B const char * \fItitle
is the title on the top of the widget.
-.IP file
+.TP 5
+.B const char * \fIfile
is the name of the file from which to read.
-.IP height
+.TP 5
+.B int \fIheight
is the desired height of the box.
If zero, the height is adjusted to use the available screen size.
-.IP width
+.TP 5
+.B int \fIwidth
is the desired width of the box.
If zero, the height is adjusted to use the available screen size.
.RE
@@ -629,22 +689,29 @@ If zero, the height is adjusted to use the available screen size.
.IP \fBdialog_form
implements the "\fB--form\fP" option.
.RS
-.IP title
+.TP 5
+.B const char * \fItitle
is the title on the top of the widget.
-.IP cprompt
+.TP 5
+.B const char * \fIcprompt
is the prompt text shown within the widget.
-.IP height
+.TP 5
+.B int \fIheight
is the desired height of the box.
If zero, the height is adjusted to use the available screen size.
-.IP width
+.TP 5
+.B int \fIwidth
is the desired width of the box.
If zero, the height is adjusted to use the available screen size.
-.IP form_height
+.TP 5
+.B int \fIform_height
is the minimum height to reserve for displaying the list.
If zero, it is computed based on the given \fIheight\fP and \fIwidth\fP.
-.IP item_no
+.TP 5
+.B int \fIitem_no
is the number of rows in \fIitems\fP.
-.IP items
+.TP 5
+.B int \fIitems
is an array of strings which is viewed either as a list of rows
.RS
\fIName NameY NameX Text TextY TextX FLen ILen\fR
@@ -655,39 +722,53 @@ or
\fIName NameY NameX Text TextY TextX FLen ILen Help\fR
.RE
.IP
-depending on whether \fIdialog_vars.item_help\fP is set.
+depending on whether \fBdialog_vars.item_help\fP is set.
.RE
.\" ************************************************************************
.IP \fBdialog_fselect
implements the "\fB--fselect\fP" option.
.RS
-.IP title
+.TP 5
+.B const char * \fItitle
is the title on the top of the widget.
-.IP path
+.TP 5
+.B const char * \fIpath
is the preselected value to show in the input-box,
which is used also to set the directory- and file-windows.
-.IP height
+.TP 5
+.B int \fIheight
is the height excluding the minimum needed to show the dialog box framework.
If zero, the height is based on the screen size.
-.IP width
+.TP 5
+.B int \fIwidth
is the desired width of the box.
If zero, the height is based on the screen size.
.RE
.\" ************************************************************************
.IP \fBdialog_gauge
implements the "\fB--gauge\fP" option.
+Alternatively, a simpler or customized gauge widget can be
+setup using
+\fBdlg_allocate_gauge\fP,
+\fBdlg_update_gauge\fP and
+\fBdlg_free_gauge\fP.
.RS
-.IP title
+.TP 5
+.B const char * \fItitle
is the title on the top of the widget.
-.IP cprompt
+.TP 5
+.B const char * \fIcprompt
is the prompt text shown within the widget.
-.IP height
+.TP 5
+.B int \fIheight
is the desired height of the box.
If zero, the height is based on the screen size.
-.IP width
+.TP 5
+.B int \fIwidth
is the desired width of the box.
If zero, the height is based on the screen size.
-.IP percent
+.TP 5
+.B int \fIpercent
is the percentage to show in the progress bar.
.RE
.\" ************************************************************************
@@ -695,43 +776,79 @@ is the percentage to show in the progress bar.
implements the "\fB--inputbox\fP" or
"\fB--password\fP" option, depending on the value of \fIpassword\fP.
.RS
-.IP title
+.TP 5
+.B const char * \fItitle
is the title on the top of the widget.
-.IP cprompt
+.TP 5
+.B const char * \fIcprompt
is the prompt text shown within the widget.
-.IP height
+.TP 5
+.B int \fIheight
is the desired height of the box.
If zero, the height is based on the screen size.
-.IP width
+.TP 5
+.B int \fIwidth
is the desired width of the box.
If zero, the height is based on the screen size.
-.IP init
+.TP 5
+.B const char * \fIinit
is the initial value of the input box, whose length is taken into account
when auto-sizing the width of the dialog box.
-.IP password
+.TP 5
+.B int \fIpassword
if true, causes typed input to be echoed as asterisks.
.RE
.\" ************************************************************************
+.IP \fBdialog_helpfile
+implements the "\fB--hfile\fP" option.
+.RS
+.TP 5
+.B const char * \fItitle
+is the title on the top of the widget.
+.TP 5
+.B const char * \fIfile
+is the name of a file containing the text to display.
+This function is internally bound to F1 (function key "1"),
+passing \fBdialog_vars.help_file\fP as a parameter.
+The \fBdialog\fP program sets that variable when the \fB--hfile\fP option
+is given.
+.TP 5
+.B int \fIheight
+is the desired height of the box.
+If zero, the height is based on the screen size.
+.TP 5
+.B int \fIwidth
+is the desired width of the box.
+If zero, the height is based on the screen size.
+.RE
+.\" ************************************************************************
.IP \fBdialog_menu
implements the "\fB--menu\fP" or "\fB--inputmenu\fP" option
-depending on whether \fIdialog_vars.input_menu\fP is set.
+depending on whether \fBdialog_vars.input_menu\fP is set.
.RS
-.IP title
+.TP 5
+.B const char * \fItitle
is the title on the top of the widget.
-.IP cprompt
+.TP 5
+.B const char * \fIcprompt
is the prompt text shown within the widget.
-.IP height
+.TP 5
+.B int \fIheight
is the desired height of the box.
If zero, the height is based on the screen size.
-.IP width
+.TP 5
+.B int \fIwidth
is the desired width of the box.
If zero, the height is based on the screen size.
-.IP menu_height
+.TP 5
+.B int \fImenu_height
is the minimum height to reserve for displaying the list.
If zero, it is computed based on the given \fIheight\fP and \fIwidth\fP.
-.IP item_no
+.TP 5
+.B int \fIitem_no
is the number of rows in \fIitems\fP.
-.IP items
+.TP 5
+.B int \fIitems
is an array of strings which is viewed either as a list of rows
.RS
\fItag item\fR
@@ -742,28 +859,35 @@ or
\fItag item help\fR
.RE
.IP
-depending on whether \fIdialog_vars.item_help\fP is set.
+depending on whether \fBdialog_vars.item_help\fP is set.
.RE
.\" ************************************************************************
.IP \fBdialog_mixedform
implements the "\fB--mixedform\fP" option.
.RS
-.IP title
+.TP 5
+.B const char * \fItitle
is the title on the top of the widget.
-.IP cprompt
+.TP 5
+.B const char * \fIcprompt
is the prompt text shown within the widget.
-.IP height
+.TP 5
+.B int \fIheight
is the desired height of the box.
If zero, the height is adjusted to use the available screen size.
-.IP width
+.TP 5
+.B int \fIwidth
is the desired width of the box.
If zero, the height is adjusted to use the available screen size.
-.IP form_height
+.TP 5
+.B int \fIform_height
is the minimum height to reserve for displaying the list.
If zero, it is computed based on the given \fIheight\fP and \fIwidth\fP.
-.IP item_no
+.TP 5
+.B int \fIitem_no
is the number of rows in \fIitems\fP.
-.IP items
+.TP 5
+.B int \fIitems
is an array of strings which is viewed either as a list of rows
.RS
\fIName NameY NameX Text TextY TextX FLen ILen Ityp\fR
@@ -774,27 +898,33 @@ or
\fIName NameY NameX Text TextY TextX FLen ILen Ityp Help\fR
.RE
.IP
-depending on whether \fIdialog_vars.item_help\fP is set.
+depending on whether \fBdialog_vars.item_help\fP is set.
.RE
.\" ************************************************************************
.IP \fBdialog_mixedgauge
implements the "\fB--mixedgauge\fP" option
.RS
-.IP title
+.TP 5
+.B const char * \fItitle
is the title on the top of the widget.
-.IP cprompt
+.TP 5
+.B const char * \fIcprompt
is the caption text shown within the widget.
-.IP height
+.TP 5
+.B int \fIheight
is the desired height of the box.
If zero, the height is based on the screen size.
-.IP width
+.TP 5
+.B int \fIwidth
is the desired width of the box.
If zero, the height is based on the screen size.
.IP percent
is the percentage to show in the progress bar.
-.IP item_no
+.TP 5
+.B int \fIitem_no
is the number of rows in \fIitems\fP.
-.IP items
+.TP 5
+.B int \fIitems
is an array of strings which is viewed as a list of \fItag\fP and \fIitem\fP values.
The \fItag\fP values are listed, one per row, in the list at the top of
the widget.
@@ -832,17 +962,22 @@ Other strings are displayed as is.
implements the "\fB--msgbox\fP" or "\fB--infobox\fP" option
depending on whether \fIpauseopt\fP is set.
.RS
-.IP title
+.TP 5
+.B const char * \fItitle
is the title on the top of the widget.
-.IP cprompt
+.TP 5
+.B const char * \fIcprompt
is the prompt text shown within the widget.
-.IP height
+.TP 5
+.B int \fIheight
is the desired height of the box.
If zero, the height is based on the screen size.
-.IP width
+.TP 5
+.B int \fIwidth
is the desired width of the box.
If zero, the height is based on the screen size.
-.IP pauseopt
+.TP 5
+.B int \fIpauseopt
if true, an "OK" button will be shown,
and the dialog will wait for it to complete.
With an "OK" button, it is denoted a "msgbox",
@@ -852,35 +987,45 @@ without an "OK" button, it is denoted an "infobox".
.IP \fBdialog_pause
implements the "\fB--pause\fP" option.
.RS
-.IP title
+.TP 5
+.B const char * \fItitle
is the title on the top of the widget.
-.IP height
+.TP 5
+.B int \fIheight
is the desired height of the box.
If zero, the height is based on the screen size.
-.IP width
+.TP 5
+.B int \fIwidth
is the desired width of the box.
If zero, the height is based on the screen size.
-.IP seconds
+.TP 5
+.B int \fIseconds
is the timeout to use for the progress bar.
.RE
.\" ************************************************************************
.IP \fBdialog_prgbox
implements the "\fB--prgbox\fP" option.
.RS
-.IP title
+.TP 5
+.B const char * \fItitle
is the title on the top of the widget.
-.IP cprompt
+.TP 5
+.B const char * \fIcprompt
is the prompt text shown within the widget.
If empty or null, no prompt is shown.
-.IP command
+.TP 5
+.B const char * \fIcommand
is the name of the command to execute.
-.IP height
+.TP 5
+.B int \fIheight
is the desired height of the box.
If zero, the height is based on the screen size.
-.IP width
+.TP 5
+.B int \fIwidth
is the desired width of the box.
If zero, the height is based on the screen size.
-.IP pauseopt
+.TP 5
+.B int \fIpauseopt
if true, an "OK" button will be shown,
and the dialog will wait for it to complete.
.RE
@@ -888,15 +1033,19 @@ and the dialog will wait for it to complete.
.IP \fBdialog_progressbox
implements the "\fB--progressbox\fP" option.
.RS
-.IP title
+.TP 5
+.B const char * \fItitle
is the title on the top of the widget.
-.IP cprompt
+.TP 5
+.B const char * \fIcprompt
is the prompt text shown within the widget.
If empty or null, no prompt is shown.
-.IP height
+.TP 5
+.B int \fIheight
is the desired height of the box.
If zero, the height is based on the screen size.
-.IP width
+.TP 5
+.B int \fIwidth
is the desired width of the box.
If zero, the height is based on the screen size.
.RE
@@ -905,19 +1054,24 @@ If zero, the height is based on the screen size.
implements the "\fB--tailbox\fP" or "\fB--tailboxbg\fP" option
depending on whether \fIbg_task\fP is set.
.RS
-.IP title
+.TP 5
+.B const char * \fItitle
is the title on the top of the widget.
-.IP file
+.TP 5
+.B const char * \fIfile
is the name of the file to display in the dialog.
-.IP height
+.TP 5
+.B int \fIheight
is the desired height of the box.
If zero, the height is based on the screen size.
-.IP width
+.TP 5
+.B int \fIwidth
is the desired width of the box.
If zero, the height is based on the screen size.
-.IP bg_task
+.TP 5
+.B int \fIbg_task
if true,
-the window is added to the callback list in \fIdialog_state\fP,
+the window is added to the callback list in \fBdialog_state\fP,
and the application will poll for the window to be updated.
Otherwise an "OK" button is added to the window,
and it will be closed when the button is activated.
@@ -926,14 +1080,18 @@ and it will be closed when the button is activated.
.IP \fBdialog_textbox
implements the "\fB--textbox\fP" option.
.RS
-.IP title
+.TP 5
+.B const char * \fItitle
is the title on the top of the widget.
-.IP file
+.TP 5
+.B const char * \fIfile
is the name of the file to display in the dialog.
-.IP height
+.TP 5
+.B int \fIheight
is the desired height of the box.
If zero, the height is based on the screen size.
-.IP width
+.TP 5
+.B int \fIwidth
is the desired width of the box.
If zero, the height is based on the screen size.
.RE
@@ -941,25 +1099,32 @@ If zero, the height is based on the screen size.
.IP \fBdialog_timebox
implements the "\fB--timebox\fP" option.
.RS
-.IP title
+.TP 5
+.B const char * \fItitle
is the title on the top of the widget.
-.IP subtitle
+.TP 5
+.B const char * \fIsubtitle
is the prompt text shown within the widget.
-.IP height
+.TP 5
+.B int \fIheight
is the desired height of the box.
If zero, the height is based on the screen size.
-.IP width
+.TP 5
+.B int \fIwidth
is the desired width of the box.
If zero, the height is based on the screen size.
-.IP hour
+.TP 5
+.B int \fIhour
is the initial hour shown.
If the value is negative, the current hour is used.
Returns DLG_EXIT_ERROR if the value specified is greater than or equal to 24.
-.IP minute
+.TP 5
+.B int \fIminute
is the initial minute shown.
If the value is negative, the current minute is used.
Returns DLG_EXIT_ERROR if the value specified is greater than or equal to 60.
-.IP second
+.TP 5
+.B int \fIsecond
is the initial second shown.
If the value is negative, the current second is used.
Returns DLG_EXIT_ERROR if the value specified is greater than or equal to 60.
@@ -968,14 +1133,18 @@ Returns DLG_EXIT_ERROR if the value specified is greater than or equal to 60.
.IP \fBdialog_yesno
implements the "\fB--yesno\fP" option.
.RS
-.IP title
+.TP 5
+.B const char * \fItitle
is the title on the top of the widget.
-.IP cprompt
+.TP 5
+.B const char * \fIcprompt
is the prompt text shown within the widget.
-.IP height
+.TP 5
+.B int \fIheight
is the desired height of the box.
If zero, the height is based on the screen size.
-.IP width
+.TP 5
+.B int \fIwidth
is the desired width of the box.
If zero, the height is based on the screen size.
.RE
@@ -989,7 +1158,7 @@ Bowing to longstanding usage, the functions that initialize the
display and end it are named \fIinit_dialog\fP and \fIend_dialog\fP.
.PP
The only non-widget function whose name begins with "\fIdialog_\fP"
-is \fIdialog_version\fP, which returns the version number of the
+is \fBdialog_version\fP, which returns the version number of the
library as a string.
.
.PP
@@ -1079,6 +1248,30 @@ This is the number of rows in the array.
.RE
.\" ---------------------------------------------------------------------------
.TP 5
+.B dlg_allocate_gauge
+Allocates a gauge widget.
+Use \fBdlg_update_gauge\fP to display the result.
+.RS
+.TP 5
+.B const char * \fItitle
+is the title string to display at the top of the widget.
+.TP 5
+.B const char * \fIcprompt
+is the prompt text shown within the widget.
+.TP 5
+.B int \fIheight
+is the desired height of the box.
+If zero, the height is adjusted to use the available screen size.
+.TP 5
+.B int \fIwidth
+is the desired width of the box.
+If zero, the height is adjusted to use the available screen size.
+.TP 5
+.B int \fIpercent
+is the percentage to show in the progress bar.
+.RE
+.\" ---------------------------------------------------------------------------
+.TP 5
.B dlg_asciibox
returns its parameter transformed to the
corresponding "+" or "-", etc. for the line-drawing characters used in \fB\*p\fP.
@@ -1325,7 +1518,7 @@ is the number of \fIitems\fP in the list.
.TP 5
.B dlg_calc_listw
This function is obsolete, provided for library-compatibility.
-It is replaced by \fIdlg_calc_list_width\fP.
+It is replaced by \fBdlg_calc_list_width\fP.
.RS
.TP 5
.B int \fIitem_no
@@ -1541,7 +1734,7 @@ It is terminated by an entry with a null \fIname\fP field.
.TP 5
.B dlg_default_item
This function is obsolete, provided for library-compatibility.
-It is replaced by \fIdlg_default_formitem\fP and \fIdlg_default_listitem\fP.
+It is replaced by \fBdlg_default_formitem\fP and \fBdlg_default_listitem\fP.
.RS
.TP 5
.B char ** \fIitems
@@ -1701,6 +1894,18 @@ is the number of columns (or rows if \fIvertical\fP) allowed for the display.
.RE
.\" ---------------------------------------------------------------------------
.TP 5
+.B dlg_draw_helpline
+draw the text in \fBdialog_vars.help_line\fP at the bottom of the given window.
+.RS
+.TP 5
+.B WINDOW * \fIdialog
+is the window to modify.
+.TP 5
+.B bool \fIdecorations
+if true, allow room for the scrolling arrows.
+.RE
+.\" ---------------------------------------------------------------------------
+.TP 5
.B dlg_draw_scrollbar
If \fBdialog_state.use_scrollbar\fP is set,
draw a scrollbar on the right margin of windows holding scrollable data.
@@ -1898,7 +2103,8 @@ Quit program killing all \fBtailboxbg\fP widgets.
.B const char * \fIfmt
is the format of the \fBprintf\fP-like message to write.
.TP 5
-.
+.B ...
+.br
are the variables to apply to the \fIfmt\fP format.
.RE
.\" ---------------------------------------------------------------------------
@@ -2014,6 +2220,15 @@ is the list to free.
.RE
.\" ---------------------------------------------------------------------------
.TP 5
+.B dlg_free_gauge
+Remove the gauge widget from the screen and free its associated memory.
+.RS
+.TP 5
+.B void *\fIobjptr
+points to the gauge widget.
+.RE
+.\" ---------------------------------------------------------------------------
+.TP 5
.B dlg_getc
Read a character from the given window.
Handle repainting here (to simplify
@@ -2615,23 +2830,29 @@ applied to the string.
.B dlg_progressbox
implements the "\fB--prgbox\fP" and "\fB--progressbox\fP" options.
.RS
-.IP title
+.TP 5
+.B const char * \fItitle
is the title on the top of the widget.
-.IP cprompt
+.TP 5
+.B const char * \fIcprompt
is the prompt text shown within the widget.
If empty or null, no prompt is shown.
-.IP height
+.TP 5
+.B int \fIheight
is the desired height of the box.
If zero, the height is based on the screen size.
-.IP width
+.TP 5
+.B int \fIwidth
is the desired width of the box.
If zero, the height is based on the screen size.
-.IP pauseopt
+.TP 5
+.B int \fIpauseopt
if true, an "OK" button will be shown,
and the dialog will wait for it to complete.
With an "OK" button, it is denoted a "programbox",
without an "OK" button, it is denoted a "progressbox".
-.IP fp
+.TP 5
+.B FILE * \fIfp
is the file pointer, which may be a pipe or a regular file.
.RE
.\" ---------------------------------------------------------------------------
@@ -2865,16 +3086,66 @@ Some of these may be values declared in the DLG_KEYS_ENUM.
.RE
.\" ---------------------------------------------------------------------------
.TP 5
+.B dlg_trace_msg
+Write a formatted message to the trace file.
+.RS
+.TP 5
+.B const char * \fIfmt
+is the format of the \fBprintf\fP-like message to write.
+.TP 5
+.B ...
+.br
+are the variables to apply to the \fIfmt\fP format.
+.RE
+.IP
+Use the DLG_TRACE macro for portability, in case the trace
+feature is not compiled into the library.
+It uses an extra level of parentheses to work with a variable number of
+parameters, e.g.,
+.ES
+.EX
+DLG_TRACE(("this is dialog version %s\\n", dialog_version()));
+.EE
+.\" ---------------------------------------------------------------------------
+.TP 5
.B dlg_trace_win
If \fBdialog_state.trace\fP is set,
log a printable picture of the given window.
.\" ---------------------------------------------------------------------------
.TP 5
.B dlg_trim_string
-Change embedded "\\n" substrings to '\\n' characters and tabs to single spaces.
-If there are no "\\n"s, the function strips all extra spaces, for justification.
-If it has "\\n"'s, the function preserves extra spaces.
-If \fBdialog_vars.cr_wrap\fP is set, the function preserves '\\n's.
+The \fBdialog\fP program uses this in each widget to adjust the
+message string,
+which may contain the newline character (referred to as '\\n')
+and/or the special substring "\\n"
+(which can be translated into a newline character).
+.IP
+There are several optional features:
+.RS
+.bP
+Unless \fBdialog_vars.no_nl_expand\fP is set,
+.RS
+.bP
+If it has "\\n" substrings,
+the function preserves extra spaces.
+For instance, spaces following a newline (substring or character)
+are preserved to use as an indentation.
+.bP
+The function changes embedded "\\n" substrings to '\\n' characters.
+.RE
+.bP
+If \fBdialog_vars.no_nl_expand\fP is not set,
+or if there are no "\\n" substrings,
+this function strips all extra spaces to simplify justification.
+.bP
+If \fBdialog_vars.cr_wrap\fP is set,
+the function preserves '\\n' newline characters.
+Otherwise, each '\\n' newline character is converted to a space.
+.bP
+Unless \fBdialog_vars.nocollapse\fP is set,
+each tab character is converted to a space,
+and sequences of blanks (space or tab) are reduced to a single space.
+.RE
.RS
.TP 5
.B char * \fIsrc
@@ -2891,6 +3162,18 @@ is the window from which to remove bindings
.RE
.\" ---------------------------------------------------------------------------
.TP 5
+.B dlg_update_gauge
+Update a gauge widget to show a different percentage value.
+.RS
+.TP 5
+.B void *\fIobjptr
+points to the gauge object to update.
+.TP 5
+.B int \fIpercent
+is the new percentage value to display.
+.RE
+.\" ---------------------------------------------------------------------------
+.TP 5
.B dlg_yes_buttoncode
Map the given button index for \fBdlg_yes_labels\fP into \fB\*p\fP's exit-code.
.RS
diff --git a/contrib/dialog/dialog.c b/contrib/dialog/dialog.c
index 13b2a17..44a16db 100644
--- a/contrib/dialog/dialog.c
+++ b/contrib/dialog/dialog.c
@@ -1,5 +1,5 @@
/*
- * $Id: dialog.c,v 1.186 2011/03/02 09:58:29 tom Exp $
+ * $Id: dialog.c,v 1.193 2011/06/29 09:10:56 tom Exp $
*
* cdialog - Display simple dialog boxes from shell scripts
*
@@ -71,7 +71,9 @@ typedef enum {
,o_gauge
,o_help
,o_help_button
+ ,o_help_file
,o_help_label
+ ,o_help_line
,o_help_status
,o_icon
,o_ignore
@@ -96,6 +98,7 @@ typedef enum {
,o_no_label
,o_no_lines
,o_no_mouse
+ ,o_no_nl_expand
,o_no_shadow
,o_nocancel
,o_noitem
@@ -137,6 +140,7 @@ typedef enum {
,o_title
,o_trim
,o_under_mouse
+ ,o_version
,o_visit_items
,o_wmclass
,o_yes_label
@@ -215,6 +219,8 @@ static const Options options[] = {
{ "help-button", o_help_button, 1, "" },
{ "help-label", o_help_label, 1, "<str>" },
{ "help-status", o_help_status, 1, "" },
+ { "hfile", o_help_file, 1, "<str>" },
+ { "hline", o_help_line, 1, "<str>" },
{ "icon", o_icon, 1, NULL },
{ "ignore", o_ignore, 1, "" },
{ "infobox", o_infobox, 2, "<text> <height> <width>" },
@@ -239,6 +245,7 @@ static const Options options[] = {
{ "no-label", o_no_label, 1, "<str>" },
{ "no-lines", o_no_lines, 1, "" },
{ "no-mouse", o_no_mouse, 1, "" },
+ { "no-nl-expand", o_no_nl_expand, 1, "" },
{ "no-ok", o_nook, 1, "" },
{ "no-shadow", o_no_shadow, 1, "" },
{ "nocancel", o_nocancel, 1, NULL }, /* see --no-cancel */
@@ -281,7 +288,7 @@ static const Options options[] = {
{ "title", o_title, 1, "<title>" },
{ "trim", o_trim, 1, "" },
{ "under-mouse", o_under_mouse, 1, NULL },
- { "version", o_print_version, 5, "" },
+ { "version", o_version, 5, "" },
{ "visit-items", o_visit_items, 1, "" },
{ "wmclass", o_wmclass, 1, NULL },
{ "yes-label", o_yes_label, 1, "<str>" },
@@ -872,6 +879,7 @@ call_mixed_gauge(CALLARGS)
}
#endif
+#ifdef HAVE_DLG_GAUGE
static int
call_prgbox(CALLARGS)
{
@@ -891,6 +899,7 @@ call_prgbox(CALLARGS)
numeric_arg(av, 2),
numeric_arg(av, 3), TRUE));
}
+#endif
#ifdef HAVE_DLG_GAUGE
static int
@@ -1089,6 +1098,15 @@ compare_opts(const void *a, const void *b)
}
/*
+ * Print program's version.
+ */
+static void
+PrintVersion(FILE *fp)
+{
+ fprintf(fp, "Version: %s\n", dialog_version());
+}
+
+/*
* Print program help-message
*/
static void
@@ -1122,6 +1140,9 @@ Help(void)
size_t j, k;
const Options **opts;
+ end_dialog();
+ dialog_state.output = stdout;
+
opts = dlg_calloc(const Options *, limit);
assert_ptr(opts, "Help");
for (j = 0; j < limit; ++j) {
@@ -1191,6 +1212,9 @@ process_common_options(int argc, char **argv, int offset, bool output)
case o_cr_wrap:
dialog_vars.cr_wrap = TRUE;
break;
+ case o_no_nl_expand:
+ dialog_vars.no_nl_expand = TRUE;
+ break;
case o_no_collapse:
dialog_vars.nocollapse = TRUE;
break;
@@ -1236,6 +1260,12 @@ process_common_options(int argc, char **argv, int offset, bool output)
case o_item_help:
dialog_vars.item_help = TRUE;
break;
+ case o_help_line:
+ dialog_vars.help_line = optionString(argv, &offset);
+ break;
+ case o_help_file:
+ dialog_vars.help_file = optionString(argv, &offset);
+ break;
case o_help_button:
dialog_vars.help_button = TRUE;
break;
@@ -1274,7 +1304,7 @@ process_common_options(int argc, char **argv, int offset, bool output)
break;
case o_print_version:
if (output) {
- fprintf(stdout, "Version: %s\n", dialog_version());
+ PrintVersion(dialog_state.output);
}
break;
case o_separator:
@@ -1356,6 +1386,7 @@ process_common_options(int argc, char **argv, int offset, bool output)
break;
case o_no_mouse:
dialog_state.no_mouse = TRUE;
+ mouse_close();
break;
case o_noitem:
case o_fullbutton:
@@ -1474,6 +1505,9 @@ main(int argc, char *argv[])
* that. We can only write to one of them. If --stdout is used, that
* can interfere with initializing the curses library, so we want to
* know explicitly if it is used.
+ *
+ * Also, look for any --version or --help message, processing those
+ * immediately.
*/
while (offset < argc) {
int base = offset;
@@ -1497,6 +1531,14 @@ main(int argc, char *argv[])
case o_keep_tite:
keep_tite = TRUE;
break;
+ case o_version:
+ dialog_state.output = stdout;
+ PrintVersion(dialog_state.output);
+ exit(DLG_EXIT_OK);
+ break;
+ case o_help:
+ Help();
+ break;
default:
++offset;
continue;
@@ -1512,7 +1554,11 @@ main(int argc, char *argv[])
offset = 1;
init_result(my_buffer);
- if (argc == 2) { /* if we don't want clear screen */
+ /*
+ * Dialog's output may be redirected (see above). Handle the special
+ * case of options that only report information without interaction.
+ */
+ if (argc == 2) {
switch (lookupOption(argv[1], 7)) {
case o_print_maxsize:
(void) initscr();
@@ -1521,7 +1567,7 @@ main(int argc, char *argv[])
fprintf(dialog_state.output, "MaxSize: %d, %d\n", SLINES, SCOLS);
break;
case o_print_version:
- fprintf(stdout, "Version: %s\n", dialog_version());
+ PrintVersion(dialog_state.output);
break;
case o_clear:
initscr();
@@ -1531,8 +1577,6 @@ main(int argc, char *argv[])
case o_ignore:
break;
default:
- case o_help:
- dialog_state.output = stdout;
Help();
break;
}
@@ -1621,6 +1665,8 @@ main(int argc, char *argv[])
case o_unknown:
case o_title:
case o_backtitle:
+ case o_help_line:
+ case o_help_file:
break;
default:
if (argv[j] != 0) {
diff --git a/contrib/dialog/dialog.h b/contrib/dialog/dialog.h
index ceeba45..4e1b01c 100644
--- a/contrib/dialog/dialog.h
+++ b/contrib/dialog/dialog.h
@@ -1,5 +1,5 @@
/*
- * $Id: dialog.h,v 1.224 2011/06/13 14:29:42 tom Exp $
+ * $Id: dialog.h,v 1.231 2011/06/29 09:51:00 tom Exp $
*
* dialog.h -- common declarations for all dialog modules
*
@@ -143,6 +143,7 @@
#define DLG_CTRL(n) ((n) & 0x1f) /* CTRL is preferred, but conflicts */
+#define CHR_HELP DLG_CTRL('E')
#define CHR_BACKSPACE DLG_CTRL('H')
#define CHR_REPAINT DLG_CTRL('L')
#define CHR_KILL DLG_CTRL('U')
@@ -479,6 +480,11 @@ typedef struct {
/* 1.1-20100118 */
char *date_format; /* option "--date-format" */
char *time_format; /* option "--time-format" */
+ /* 1.1-20110629 */
+ char *help_line; /* option "--hline" */
+ char *help_file; /* option "--hfile" */
+ bool in_helpfile; /* flag to prevent recursion in --hfile */
+ bool no_nl_expand; /* option "--no-nl-expand" */
} DIALOG_VARS;
#define USE_ITEM_HELP(s) (dialog_vars.item_help && (s) != 0)
@@ -533,6 +539,7 @@ extern int dialog_editbox(const char * /*title*/, const char * /*file*/, int /*h
extern int dialog_form(const char * /*title*/, const char * /*cprompt*/, int /*height*/, int /*width*/, int /*form_height*/, int /*item_no*/, char ** /*items*/);
extern int dialog_fselect(const char * /*title*/, const char * /*path*/, int /*height*/, int /*width*/);
extern int dialog_gauge(const char * /*title*/, const char * /*cprompt*/, int /*height*/, int /*width*/, int /*percent*/);
+extern int dialog_helpfile(const char * /*title*/, const char * /*file*/, int /*height*/, int /*width*/);
extern int dialog_inputbox(const char * /*title*/, const char * /*cprompt*/, int /*height*/, int /*width*/, const char * /*init*/, const int /*password*/);
extern int dialog_menu(const char * /*title*/, const char * /*cprompt*/, int /*height*/, int /*width*/, int /*menu_height*/, int /*item_no*/, char ** /*items*/);
extern int dialog_mixedform(const char * /*title*/, const char * /*cprompt*/, int /*height*/, int /*width*/, int /*form_height*/, int /*item_no*/, char ** /*items*/);
@@ -587,6 +594,7 @@ extern int dlg_eat_argv(int * /* argcp */, char *** /* argvp */, int /* start */
/* arrows.c */
extern void dlg_draw_arrows(WINDOW * /*dialog*/, int /*top_arrow*/, int /*bottom_arrow*/, int /*x*/, int /*top*/, int /*bottom*/);
extern void dlg_draw_arrows2(WINDOW * /*dialog*/, int /*top_arrow*/, int /*bottom_arrow*/, int /*x*/, int /*top*/, int /*bottom*/, chtype /*attr*/, chtype /*borderattr*/);
+extern void dlg_draw_helpline(WINDOW * /*dialog*/, bool /*decorations*/);
extern void dlg_draw_scrollbar(WINDOW * /*dialog*/, long /* first_data */, long /* this_data */, long /* next_data */, long /* total_data */, int /* left */, int /* right */, int /*top*/, int /*bottom*/, chtype /*attr*/, chtype /*borderattr*/);
/* buttons.c */
@@ -622,6 +630,11 @@ extern int dlg_default_formitem(DIALOG_FORMITEM * /*items*/);
extern int dlg_ordinate(const char * /*s*/);
extern void dlg_free_formitems(DIALOG_FORMITEM * /*items*/);
+/* guage.c */
+extern void * dlg_allocate_gauge(const char * /* title */, const char * /* cprompt */, int /* height */, int /* width */, int /* percent */);
+extern void dlg_free_gauge(void * /* objptr */);
+extern void dlg_update_gauge(void * /* objptr */, int /* percent */);
+
/* inputstr.c */
extern bool dlg_edit_string(char * /*string*/, int * /*offset*/, int /*key*/, int /*fkey*/, bool /*force*/);
extern const int * dlg_index_columns(const char * /*string*/);
@@ -743,6 +756,12 @@ extern void dlg_move_window(WINDOW * /*win*/, int /*height*/, int /*width*/, int
#endif
/*
+ * Normally "enter" means "ok". Use this macro to handle the explicit
+ * check for DLGK_ENTER:
+ */
+#define dlg_enter_buttoncode(code) (dialog_vars.nook ? DLG_EXIT_OK : dlg_ok_buttoncode(code))
+
+/*
* The following stuff is needed for mouse support
*/
typedef struct mseRegion {
diff --git a/contrib/dialog/dlg_keys.h b/contrib/dialog/dlg_keys.h
index 6a96c0f..34b4cba 100644
--- a/contrib/dialog/dlg_keys.h
+++ b/contrib/dialog/dlg_keys.h
@@ -1,9 +1,9 @@
/*
- * $Id: dlg_keys.h,v 1.24 2010/01/19 00:57:36 tom Exp $
+ * $Id: dlg_keys.h,v 1.26 2011/06/21 22:09:22 tom Exp $
*
- * dlg_keys.h -- runtime binding support for dialog
+ * dlg_keys.h -- runtime binding support for dialog
*
- * Copyright 2005-2007,2010 Thomas E. Dickey
+ * Copyright 2005-2010,2011 Thomas E. Dickey
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License, version 2.1
@@ -89,12 +89,18 @@ typedef enum {
DLGK_BEGIN,
DLGK_FINAL,
DLGK_SELECT,
+ DLGK_HELPFILE,
DLGK_TRACE
} DLG_KEYS_ENUM;
#define is_DLGK_MOUSE(code) ((code) >= M_EVENT)
#define DLGK_MOUSE(code) ((code) + M_EVENT)
+#define HELPKEY_BINDINGS \
+ DLG_KEYS_DATA( DLGK_HELPFILE, CHR_HELP ), \
+ DLG_KEYS_DATA( DLGK_HELPFILE, KEY_F(1) ), \
+ DLG_KEYS_DATA( DLGK_HELPFILE, KEY_HELP )
+
#define ENTERKEY_BINDINGS \
DLG_KEYS_DATA( DLGK_ENTER, '\n' ), \
DLG_KEYS_DATA( DLGK_ENTER, '\r' ), \
diff --git a/contrib/dialog/editbox.c b/contrib/dialog/editbox.c
index 7889024..c7da10c 100644
--- a/contrib/dialog/editbox.c
+++ b/contrib/dialog/editbox.c
@@ -1,9 +1,9 @@
/*
- * $Id: editbox.c,v 1.54 2010/04/28 21:02:01 tom Exp $
+ * $Id: editbox.c,v 1.55 2011/06/21 00:10:46 tom Exp $
*
* editbox.c -- implements the edit box
*
- * Copyright 2007-2009,2010 Thomas E. Dickey
+ * Copyright 2007-2010,2011 Thomas E. Dickey
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License, version 2.1
@@ -312,12 +312,14 @@ dlg_editbox(const char *title,
{
/* *INDENT-OFF* */
static DLG_KEYS_BINDING binding[] = {
+ HELPKEY_BINDINGS,
ENTERKEY_BINDINGS,
NAVIGATE_BINDINGS,
END_KEYS_BINDING
};
static DLG_KEYS_BINDING binding2[] = {
INPUTSTR_BINDINGS,
+ HELPKEY_BINDINGS,
ENTERKEY_BINDINGS,
NAVIGATE_BINDINGS,
END_KEYS_BINDING
diff --git a/contrib/dialog/formbox.c b/contrib/dialog/formbox.c
index 18f2054..7ec798c 100644
--- a/contrib/dialog/formbox.c
+++ b/contrib/dialog/formbox.c
@@ -1,9 +1,9 @@
/*
- * $Id: formbox.c,v 1.71 2010/02/24 10:45:57 Samuel.Martin.Moro Exp $
+ * $Id: formbox.c,v 1.73 2011/06/29 09:48:08 tom Exp $
*
* formbox.c -- implements the form (i.e, some pairs label/editbox)
*
- * Copyright 2003-2009,2010 Thomas E. Dickey
+ * Copyright 2003-2010,2011 Thomas E. Dickey
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License, version 2.1
@@ -433,12 +433,14 @@ dlg_form(const char *title,
{
/* *INDENT-OFF* */
static DLG_KEYS_BINDING binding[] = {
+ HELPKEY_BINDINGS,
ENTERKEY_BINDINGS,
NAVIGATE_BINDINGS,
END_KEYS_BINDING
};
static DLG_KEYS_BINDING binding2[] = {
INPUTSTR_BINDINGS,
+ HELPKEY_BINDINGS,
ENTERKEY_BINDINGS,
NAVIGATE_BINDINGS,
END_KEYS_BINDING
@@ -633,7 +635,7 @@ dlg_form(const char *title,
case DLGK_ENTER:
dlg_del_window(dialog);
- result = (state >= 0) ? dlg_ok_buttoncode(state) : DLG_EXIT_OK;
+ result = (state >= 0) ? dlg_enter_buttoncode(state) : DLG_EXIT_OK;
continue;
case DLGK_GRID_LEFT:
diff --git a/contrib/dialog/fselect.c b/contrib/dialog/fselect.c
index 09a5560..e082abf 100644
--- a/contrib/dialog/fselect.c
+++ b/contrib/dialog/fselect.c
@@ -1,5 +1,5 @@
/*
- * $Id: fselect.c,v 1.76 2011/01/16 22:20:16 tom Exp $
+ * $Id: fselect.c,v 1.78 2011/06/29 09:48:21 tom Exp $
*
* fselect.c -- implements the file-selector box
*
@@ -532,12 +532,14 @@ dlg_fselect(const char *title, const char *path, int height, int width, int dsel
{
/* *INDENT-OFF* */
static DLG_KEYS_BINDING binding[] = {
+ HELPKEY_BINDINGS,
ENTERKEY_BINDINGS,
NAVIGATE_BINDINGS,
END_KEYS_BINDING
};
static DLG_KEYS_BINDING binding2[] = {
INPUTSTR_BINDINGS,
+ HELPKEY_BINDINGS,
ENTERKEY_BINDINGS,
NAVIGATE_BINDINGS,
END_KEYS_BINDING
@@ -795,7 +797,7 @@ dlg_fselect(const char *title, const char *path, int height, int width, int dsel
}
/* FALLTHRU */
case DLGK_ENTER:
- result = (state > 0) ? dlg_ok_buttoncode(state) : DLG_EXIT_OK;
+ result = (state > 0) ? dlg_enter_buttoncode(state) : DLG_EXIT_OK;
continue;
#ifdef KEY_RESIZE
case KEY_RESIZE:
diff --git a/contrib/dialog/guage.c b/contrib/dialog/guage.c
index d12bc21..b25052f 100644
--- a/contrib/dialog/guage.c
+++ b/contrib/dialog/guage.c
@@ -1,5 +1,5 @@
/*
- * $Id: guage.c,v 1.52 2011/01/17 10:39:28 tom Exp $
+ * $Id: guage.c,v 1.60 2011/06/27 00:52:28 tom Exp $
*
* guage.c -- implements the gauge dialog
*
@@ -35,8 +35,9 @@
#define isMarker(buf) !strncmp(buf, "XXX", (size_t) 3)
-typedef struct {
- DIALOG_CALLBACK obj;
+typedef struct _my_obj {
+ DIALOG_CALLBACK obj; /* has to be first in struct */
+ struct _my_obj *next;
WINDOW *text;
const char *title;
char *prompt;
@@ -47,6 +48,43 @@ typedef struct {
char line[MAX_LEN + 1];
} MY_OBJ;
+static MY_OBJ *all_objects;
+
+static int
+valid(MY_OBJ * obj)
+{
+ MY_OBJ *list = all_objects;
+ int result = 0;
+
+ while (list != 0) {
+ if (list == obj) {
+ result = 1;
+ break;
+ }
+ list = list->next;
+ }
+ return result;
+}
+
+static void
+delink(MY_OBJ * obj)
+{
+ MY_OBJ *p = all_objects;
+ MY_OBJ *q = 0;
+ while (p != 0) {
+ if (p == obj) {
+ if (q != 0) {
+ q->next = p->next;
+ } else {
+ all_objects = p->next;
+ }
+ break;
+ }
+ q = p;
+ p = p->next;
+ }
+}
+
static int
read_data(char *buffer, FILE *fp)
{
@@ -55,6 +93,7 @@ read_data(char *buffer, FILE *fp)
if (feof(fp)) {
result = 0;
} else if (fgets(buffer, MY_LEN, fp) != 0) {
+ DLG_TRACE(("read_data:%s", buffer));
dlg_trim_string(buffer);
result = 1;
} else {
@@ -88,6 +127,7 @@ repaint_text(MY_OBJ * obj)
dlg_draw_title(dialog, obj->title);
wattrset(dialog, dialog_attr);
+ dlg_draw_helpline(dialog, FALSE);
dlg_print_autowrap(dialog, obj->prompt, obj->height, obj->width);
dlg_draw_box(dialog,
@@ -179,6 +219,7 @@ handle_input(DIALOG_CALLBACK * cb)
} else {
if (feof(dialog_state.pipe_input) ||
(ferror(dialog_state.pipe_input) && errno != EINTR)) {
+ delink(obj);
dlg_remove_callback(cb);
}
}
@@ -202,7 +243,8 @@ handle_my_getc(DIALOG_CALLBACK * cb, int ch, int fkey, int *result)
if (cb != 0) {
if (!fkey && (ch == ERR)) {
(void) handle_input(cb);
- status = (cb->input != 0);
+ /* cb might be freed in handle_input */
+ status = (valid((MY_OBJ *) cb) && (cb->input != 0));
}
} else {
status = FALSE;
@@ -215,46 +257,42 @@ my_cleanup(DIALOG_CALLBACK * cb)
{
MY_OBJ *obj = (MY_OBJ *) cb;
- if (obj != 0) {
- if (obj->prompt != obj->prompt_buf)
+ if (valid(obj)) {
+ if (obj->prompt != obj->prompt_buf) {
free(obj->prompt);
+ obj->prompt = obj->prompt_buf;
+ }
+ delink(obj);
}
}
+void
+dlg_update_gauge(void *objptr, int percent)
+{
+ MY_OBJ *obj = (MY_OBJ *) objptr;
+
+ curs_set(0);
+ obj->percent = percent;
+ repaint_text(obj);
+}
+
/*
- * Display a gauge, or progress meter. Starts at percent% and reads stdin. If
- * stdin is not XXX, then it is interpreted as a percentage, and the display is
- * updated accordingly. Otherwise the next line is the percentage, and
- * subsequent lines up to another XXX are used for the new prompt. Note that
- * the size of the window never changes, so the prompt can not get any larger
- * than the height and width specified.
+ * Allocates a new object and fills it as per the arguments
*/
-int
-dialog_gauge(const char *title,
- const char *cprompt,
- int height,
- int width,
- int percent)
+void *
+dlg_allocate_gauge(const char *title,
+ const char *cprompt,
+ int height,
+ int width,
+ int percent)
{
-#ifdef KEY_RESIZE
- int old_height = height;
- int old_width = width;
-#endif
- int fkey;
- int ch, result;
int x, y;
char *prompt = dlg_strclone(cprompt);
WINDOW *dialog;
MY_OBJ *obj = 0;
- curs_set(0);
-
dlg_tab_correct_str(prompt);
-#ifdef KEY_RESIZE
- retry:
-#endif
-
dlg_auto_size(title, prompt, &height, &width, MIN_HIGH, MIN_WIDE);
dlg_print_size(height, width);
dlg_ctl_size(height, width);
@@ -265,51 +303,97 @@ dialog_gauge(const char *title,
dialog = dlg_new_window(height, width, y, x);
- if (obj == 0) {
- MY_OBJ **objref;
-
- obj = dlg_calloc(MY_OBJ, 1);
- assert_ptr(obj, "dialog_gauge");
-
- objref = &obj;
- obj->obj.input = dialog_state.pipe_input;
- obj->obj.win = dialog;
- obj->obj.keep_win = TRUE;
- obj->obj.bg_task = TRUE;
- obj->obj.handle_getc = handle_my_getc;
- obj->obj.handle_input = handle_input;
- obj->title = title;
- obj->prompt = prompt;
- obj->percent = percent;
- obj->height = height;
- obj->width = width;
- dlg_add_callback_ref((DIALOG_CALLBACK **) objref, my_cleanup);
- } else {
- obj->obj.win = dialog;
+ obj = dlg_calloc(MY_OBJ, 1);
+ assert_ptr(obj, "dialog_gauge");
+
+ obj->obj.input = dialog_state.pipe_input;
+ obj->obj.win = dialog;
+ obj->obj.keep_win = TRUE;
+ obj->obj.bg_task = TRUE;
+ obj->obj.handle_getc = handle_my_getc;
+ obj->obj.handle_input = handle_input;
+
+ obj->title = title;
+ obj->prompt = prompt;
+ obj->percent = percent;
+ obj->height = height;
+ obj->width = width;
+
+ obj->next = all_objects;
+ all_objects = obj;
+
+ return (void *) obj;
+}
+
+void
+dlg_free_gauge(void *objptr)
+{
+ MY_OBJ *obj = (MY_OBJ *) objptr;
+
+ curs_set(1);
+ if (valid(obj)) {
+ delink(obj);
+ obj->obj.keep_win = FALSE;
+ dlg_remove_callback(&(obj->obj));
+ free(obj);
}
+}
- repaint_text(obj);
+/*
+ * Display a gauge, or progress meter. Starts at percent% and reads stdin. If
+ * stdin is not XXX, then it is interpreted as a percentage, and the display is
+ * updated accordingly. Otherwise the next line is the percentage, and
+ * subsequent lines up to another XXX are used for the new prompt. Note that
+ * the size of the window never changes, so the prompt can not get any larger
+ * than the height and width specified.
+ */
+int
+dialog_gauge(const char *title,
+ const char *cprompt,
+ int height,
+ int width,
+ int percent)
+{
+ int fkey;
+ int ch, result;
+ void *objptr = dlg_allocate_gauge(title, cprompt, height, width, percent);
+ MY_OBJ *obj = (MY_OBJ *) objptr;
+
+ dlg_add_callback_ref((DIALOG_CALLBACK **) & obj, my_cleanup);
+ dlg_update_gauge(obj, percent);
do {
- ch = dlg_getc(dialog, &fkey);
+ ch = dlg_getc(obj->obj.win, &fkey);
#ifdef KEY_RESIZE
if (fkey && ch == KEY_RESIZE) {
- /* reset data */
- height = old_height;
- width = old_width;
- /* repaint */
+ MY_OBJ *oldobj = obj;
+
+ dlg_mouse_free_regions();
+
+ obj = dlg_allocate_gauge(title,
+ cprompt,
+ height,
+ width,
+ oldobj->percent);
+
+ /* avoid breaking new window in dlg_remove_callback */
+ oldobj->obj.caller = 0;
+ oldobj->obj.input = 0;
+ oldobj->obj.keep_win = FALSE;
+
+ /* remove the old version of the gauge */
dlg_clear();
- dlg_del_window(dialog);
+ dlg_remove_callback(&(oldobj->obj));
refresh();
- dlg_mouse_free_regions();
- goto retry;
+
+ dlg_add_callback_ref((DIALOG_CALLBACK **) & obj, my_cleanup);
+ dlg_update_gauge(obj, obj->percent);
}
#endif
}
- while (handle_my_getc(&(obj->obj), ch, fkey, &result));
+ while (valid(obj) && handle_my_getc(&(obj->obj), ch, fkey, &result));
- curs_set(1);
- dlg_del_window(dialog);
+ dlg_free_gauge(obj);
return (DLG_EXIT_OK);
}
diff --git a/contrib/dialog/help.c b/contrib/dialog/help.c
new file mode 100644
index 0000000..8ba9229
--- /dev/null
+++ b/contrib/dialog/help.c
@@ -0,0 +1,43 @@
+/*
+ * $Id: help.c,v 1.2 2011/06/25 00:27:16 tom Exp $
+ *
+ * help.c -- implements the help dialog
+ *
+ * Copyright 2011 Thomas E. Dickey
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License, version 2.1
+ * as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this program; if not, write to
+ * Free Software Foundation, Inc.
+ * 51 Franklin St., Fifth Floor
+ * Boston, MA 02110, USA.
+ */
+
+#include <dialog.h>
+
+/*
+ * Display a help-file as a textbox widget.
+ */
+int
+dialog_helpfile(const char *title,
+ const char *file,
+ int height,
+ int width)
+{
+ int result = DLG_EXIT_ERROR;
+
+ if (!dialog_vars.in_helpfile && file != 0 && *file != '\0') {
+ dialog_vars.in_helpfile = TRUE;
+ result = dialog_textbox(title, file, height, width);
+ dialog_vars.in_helpfile = FALSE;
+ }
+ return (result);
+}
diff --git a/contrib/dialog/inputbox.c b/contrib/dialog/inputbox.c
index 6e83cbc..14e2c28 100644
--- a/contrib/dialog/inputbox.c
+++ b/contrib/dialog/inputbox.c
@@ -1,9 +1,9 @@
/*
- * $Id: inputbox.c,v 1.64 2010/01/19 01:03:39 tom Exp $
+ * $Id: inputbox.c,v 1.67 2011/06/29 09:48:34 tom Exp $
*
- * inputbox.c -- implements the input box
+ * inputbox.c -- implements the input box
*
- * Copyright 2000-2009,2010 Thomas E. Dickey
+ * Copyright 2000-2010,2011 Thomas E. Dickey
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License, version 2.1
@@ -46,12 +46,14 @@ dialog_inputbox(const char *title, const char *cprompt, int height, int width,
{
/* *INDENT-OFF* */
static DLG_KEYS_BINDING binding[] = {
+ HELPKEY_BINDINGS,
ENTERKEY_BINDINGS,
NAVIGATE_BINDINGS,
END_KEYS_BINDING
};
static DLG_KEYS_BINDING binding2[] = {
INPUTSTR_BINDINGS,
+ HELPKEY_BINDINGS,
ENTERKEY_BINDINGS,
NAVIGATE_BINDINGS,
END_KEYS_BINDING
@@ -119,6 +121,7 @@ dialog_inputbox(const char *title, const char *cprompt, int height, int width,
dlg_draw_title(dialog, title);
wattrset(dialog, dialog_attr);
+ dlg_draw_helpline(dialog, FALSE);
dlg_print_autowrap(dialog, prompt, height, width);
/* Draw the input field box */
@@ -202,7 +205,7 @@ dialog_inputbox(const char *title, const char *cprompt, int height, int width,
case ' ': /* FIXME: conflict with inputstr.c */
case DLGK_ENTER:
dlg_del_window(dialog);
- result = (state >= 0) ? dlg_ok_buttoncode(state) : DLG_EXIT_OK;
+ result = (state >= 0) ? dlg_enter_buttoncode(state) : DLG_EXIT_OK;
break;
#ifdef KEY_RESIZE
case KEY_RESIZE:
diff --git a/contrib/dialog/makefile.in b/contrib/dialog/makefile.in
index 753f642..d05d74d 100644
--- a/contrib/dialog/makefile.in
+++ b/contrib/dialog/makefile.in
@@ -1,4 +1,4 @@
-# $Id: makefile.in,v 1.78 2011/03/02 09:57:24 tom Exp $
+# $Id: makefile.in,v 1.79 2011/06/25 00:27:56 tom Exp $
# template makefile for DIALOG
##############################################################################
# Copyright (c) 1999-2010,2011 Thomas E. Dickey #
@@ -134,6 +134,7 @@ OBJECTS = $(EXTRAOBJS) \
columns$o \
dlg_keys$o \
editbox$o \
+ help$o \
inputbox$o \
inputstr$o \
menubox$o \
diff --git a/contrib/dialog/menubox.c b/contrib/dialog/menubox.c
index aa4cc2d..25005a4 100644
--- a/contrib/dialog/menubox.c
+++ b/contrib/dialog/menubox.c
@@ -1,5 +1,5 @@
/*
- * $Id: menubox.c,v 1.120 2011/01/19 00:27:53 tom Exp $
+ * $Id: menubox.c,v 1.122 2011/06/29 09:48:46 tom Exp $
*
* menubox.c -- implements the menu box
*
@@ -291,6 +291,7 @@ dlg_menu(const char *title,
{
/* *INDENT-OFF* */
static DLG_KEYS_BINDING binding[] = {
+ HELPKEY_BINDINGS,
ENTERKEY_BINDINGS,
DLG_KEYS_DATA( DLGK_FIELD_NEXT, ' ' ),
DLG_KEYS_DATA( DLGK_FIELD_NEXT, KEY_RIGHT ),
@@ -312,6 +313,7 @@ dlg_menu(const char *title,
};
static DLG_KEYS_BINDING binding2[] = {
INPUTSTR_BINDINGS,
+ HELPKEY_BINDINGS,
ENTERKEY_BINDINGS,
END_KEYS_BINDING
};
@@ -685,7 +687,7 @@ dlg_menu(const char *title,
FALSE, width);
break;
case DLGK_ENTER:
- result = dlg_ok_buttoncode(button);
+ result = dlg_enter_buttoncode(button);
/*
* If dlg_menu() is called from dialog_menu(), we want to
diff --git a/contrib/dialog/mixedgauge.c b/contrib/dialog/mixedgauge.c
index 739165d..e15a4df 100644
--- a/contrib/dialog/mixedgauge.c
+++ b/contrib/dialog/mixedgauge.c
@@ -1,5 +1,5 @@
/*
- * $Id: mixedgauge.c,v 1.23 2011/01/19 00:27:53 tom Exp $
+ * $Id: mixedgauge.c,v 1.24 2011/06/27 08:16:38 tom Exp $
*
* mixedgauge.c -- implements the mixedgauge dialog
*
@@ -331,6 +331,7 @@ dlg_begin_mixedgauge(DIALOG_MIXEDGAUGE * dlg,
dialog_attr, border_attr);
dlg_draw_title(dlg->dialog, dlg->title);
+ dlg_draw_helpline(dlg->dialog, FALSE);
if ((dlg->prompt != 0 && *(dlg->prompt) != 0)
&& wmove(dlg->dialog, dlg->item_no, 0) != ERR) {
diff --git a/contrib/dialog/msgbox.c b/contrib/dialog/msgbox.c
index 91606af..25a021b 100644
--- a/contrib/dialog/msgbox.c
+++ b/contrib/dialog/msgbox.c
@@ -1,9 +1,9 @@
/*
- * $Id: msgbox.c,v 1.64 2010/01/15 10:50:17 tom Exp $
+ * $Id: msgbox.c,v 1.66 2011/06/27 08:36:28 tom Exp $
*
* msgbox.c -- implements the message box and info box
*
- * Copyright 2000-2009,2010 Thomas E. Dickey
+ * Copyright 2000-2010,2011 Thomas E. Dickey
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License, version 2.1
@@ -37,6 +37,7 @@ dialog_msgbox(const char *title, const char *cprompt, int height, int width,
{
/* *INDENT-OFF* */
static DLG_KEYS_BINDING binding[] = {
+ HELPKEY_BINDINGS,
ENTERKEY_BINDINGS,
DLG_KEYS_DATA( DLGK_ENTER, ' ' ),
SCROLLKEY_BINDINGS,
@@ -103,6 +104,7 @@ dialog_msgbox(const char *title, const char *cprompt, int height, int width,
dlg_draw_bottom_box(dialog);
mouse_mkbutton(height - 2, width / 2 - 4, 6, '\n');
dlg_draw_buttons(dialog, height - 2, 0, buttons, button, FALSE, width);
+ dlg_draw_helpline(dialog, FALSE);
while (result == DLG_EXIT_UNKNOWN) {
if (show) {
@@ -172,6 +174,7 @@ dialog_msgbox(const char *title, const char *cprompt, int height, int width,
}
} else {
dlg_print_scrolled(dialog, prompt, offset, page, width, pauseopt);
+ dlg_draw_helpline(dialog, FALSE);
wrefresh(dialog);
result = DLG_EXIT_OK;
}
diff --git a/contrib/dialog/package/debian/changelog b/contrib/dialog/package/debian/changelog
index 2b15e4c..51d497e 100644
--- a/contrib/dialog/package/debian/changelog
+++ b/contrib/dialog/package/debian/changelog
@@ -1,3 +1,15 @@
+cdialog (20110707) unstable; urgency=high
+
+ * fix a regression in dlg_getc() from 20110630 changes.
+
+ -- Thomas E. Dickey <dickey@invisible-island.net> Thu, 07 Jul 2011 18:10:47 -0400
+
+cdialog (20110630) unstable; urgency=high
+
+ * various bug-fixes reported in FreeBSD.
+
+ -- Thomas E. Dickey <dickey@invisible-island.net> Mon, 13 Jun 2011 05:44:17 -0400
+
cdialog (20110302) unstable; urgency=high
* Add --prgbox and --progressbox
diff --git a/contrib/dialog/package/debian/control b/contrib/dialog/package/debian/control
index c1ad86a..f219de1 100644
--- a/contrib/dialog/package/debian/control
+++ b/contrib/dialog/package/debian/control
@@ -3,12 +3,12 @@ Maintainer: Thomas E. Dickey <dickey@invisible-island.net>
Section: misc
Priority: optional
Standards-Version: 3.8.4
-Build-Depends: debhelper (>= 5)
+Build-Depends: debhelper (>= 5), libncursesw5-dev (>= 5.3), groff-base
Homepage: http://invisible-island.net/dialog/
Package: cdialog
Architecture: any
-Depends: ${shlibs:Depends}, ${misc:Depends}
+Depends: libncursesw5 (>= 5.3)
Description: dialog - display dialog boxes from shell scripts
Dialog is a program that will let you to present a variety of questions
or display messages using dialog boxes from a shell script. These
diff --git a/contrib/dialog/package/dialog.spec b/contrib/dialog/package/dialog.spec
index a6f4360..f5df494 100644
--- a/contrib/dialog/package/dialog.spec
+++ b/contrib/dialog/package/dialog.spec
@@ -1,9 +1,9 @@
Summary: dialog - display dialog boxes from shell scripts
%define AppProgram dialog
%define AppVersion 1.1
-%define AppRelease 20110302
+%define AppRelease 20110707
%define ActualProg c%{AppProgram}
-# $XTermId: dialog.spec,v 1.16 2011/03/02 10:08:16 tom Exp $
+# $XTermId: dialog.spec,v 1.24 2011/07/07 22:10:02 tom Exp $
Name: %{ActualProg}
Version: %{AppVersion}
Release: %{AppRelease}
diff --git a/contrib/dialog/pause.c b/contrib/dialog/pause.c
index 001753f..c104a70 100644
--- a/contrib/dialog/pause.c
+++ b/contrib/dialog/pause.c
@@ -1,5 +1,5 @@
/*
- * $Id: pause.c,v 1.26 2011/01/18 10:16:33 tom Exp $
+ * $Id: pause.c,v 1.29 2011/06/29 09:48:53 tom Exp $
*
* pause.c -- implements the pause dialog
*
@@ -53,6 +53,7 @@ dialog_pause(const char *title,
{
/* *INDENT-OFF* */
static DLG_KEYS_BINDING binding[] = {
+ HELPKEY_BINDINGS,
ENTERKEY_BINDINGS,
DLG_KEYS_DATA( DLGK_ENTER, ' ' ),
DLG_KEYS_DATA( DLGK_FIELD_NEXT, KEY_DOWN ),
@@ -124,6 +125,7 @@ dialog_pause(const char *title,
dlg_draw_box(dialog, 0, 0, height, width, dialog_attr, border_attr);
dlg_draw_title(dialog, title);
+ dlg_draw_helpline(dialog, FALSE);
wattrset(dialog, dialog_attr);
dlg_print_autowrap(dialog, prompt, height, width);
@@ -215,7 +217,7 @@ dialog_pause(const char *title,
FALSE, width);
break;
case DLGK_ENTER:
- result = dlg_ok_buttoncode(button);
+ result = dlg_enter_buttoncode(button);
break;
case DLGK_MOUSE(0):
result = DLG_EXIT_OK;
diff --git a/contrib/dialog/po/sk.po b/contrib/dialog/po/sk.po
new file mode 100644
index 0000000..e87991c
--- /dev/null
+++ b/contrib/dialog/po/sk.po
@@ -0,0 +1,111 @@
+# Dialog
+# Copyright 2003-2007,2008 # Thomas Dickey
+# This file is distributed under the same license as the dialog package.
+# Marián Čavojský <preklad@cavo.sk>, 2011
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: dialog 1.1.20080819\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2008-06-18 18:26-0400\n"
+"PO-Revision-Date: 2011-03-09 09:50+0100\n"
+"Last-Translator: Marián Čavojský <preklad@cavo.sk>\n"
+"Language-Team: Slovak <sk-i18n@lists.linux.sk>\n"
+"Language: sk\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: buttons.c:385
+msgid "Yes"
+msgstr "Ãno"
+
+#: buttons.c:393
+msgid "No"
+msgstr "Nie"
+
+#: buttons.c:401
+msgid "OK"
+msgstr "OK"
+
+#: buttons.c:409
+msgid "Cancel"
+msgstr "Zrušiť"
+
+#: buttons.c:417
+msgid "EXIT"
+msgstr "VÃCHOD"
+
+#: buttons.c:425
+msgid "Extra"
+msgstr "Extra"
+
+#: buttons.c:433
+msgid "Help"
+msgstr "Pomoc"
+
+#. Headline "Month"
+#: calendar.c:273
+msgid "Month"
+msgstr "Mesiac"
+
+#. Headline "Year"
+#: calendar.c:293
+msgid "Year"
+msgstr "Rok"
+
+#: dialog.c:741
+msgid "Rename"
+msgstr "Premenovať"
+
+#: fselect.c:550
+msgid "Directories"
+msgstr "Adresáre"
+
+#: fselect.c:551
+msgid "Files"
+msgstr "Súbory"
+
+#: mixedgauge.c:58
+msgid "Succeeded"
+msgstr "Vporiadku"
+
+#: mixedgauge.c:61
+msgid "Failed"
+msgstr "S chybou"
+
+#: mixedgauge.c:64
+msgid "Passed"
+msgstr "Prešlo"
+
+#: mixedgauge.c:67
+msgid "Completed"
+msgstr "Skompletované"
+
+#: mixedgauge.c:70
+msgid "Checked"
+msgstr "Skontrolované"
+
+#: mixedgauge.c:73
+msgid "Done"
+msgstr "DokonÄené"
+
+#: mixedgauge.c:76
+msgid "Skipped"
+msgstr "PreskoÄené"
+
+#: mixedgauge.c:79
+msgid "In Progress"
+msgstr "Spracováva"
+
+#: mixedgauge.c:85
+msgid "N/A"
+msgstr "N/A"
+
+#: mixedgauge.c:193
+msgid "Overall Progress"
+msgstr "Celkový pokrok"
+
+#: textbox.c:489
+msgid "Search"
+msgstr "Vyhľadať"
diff --git a/contrib/dialog/prgbox.c b/contrib/dialog/prgbox.c
index 8c9f627..a3b3ea6 100644
--- a/contrib/dialog/prgbox.c
+++ b/contrib/dialog/prgbox.c
@@ -1,14 +1,13 @@
/*
- * $Id: prgbox.c,v 1.6 2011/03/02 09:59:26 tom Exp $
+ * $Id: prgbox.c,v 1.7 2011/06/30 20:44:13 tom Exp $
*
* prgbox.c -- implements the prg box
*
* Copyright 2011 Thomas E. Dickey
*
* This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as
- * published by the Free Software Foundation; either version 2.1 of the
- * License, or (at your option) any later version.
+ * it under the terms of the GNU Lesser General Public License, version 2.1
+ * as published by the Free Software Foundation.
*
* This program is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of
diff --git a/contrib/dialog/progressbox.c b/contrib/dialog/progressbox.c
index 5670d1c..024e288 100644
--- a/contrib/dialog/progressbox.c
+++ b/contrib/dialog/progressbox.c
@@ -1,5 +1,5 @@
/*
- * $Id: progressbox.c,v 1.11 2011/03/02 01:10:08 tom Exp $
+ * $Id: progressbox.c,v 1.13 2011/06/27 08:18:20 tom Exp $
*
* progressbox.c -- implements the progress box
*
@@ -109,6 +109,7 @@ pause_for_ok(WINDOW *dialog, int height, int width)
{
/* *INDENT-OFF* */
static DLG_KEYS_BINDING binding[] = {
+ HELPKEY_BINDINGS,
ENTERKEY_BINDINGS,
DLG_KEYS_DATA( DLGK_ENTER, ' ' ),
END_KEYS_BINDING
@@ -189,6 +190,7 @@ dlg_progressbox(const char *title,
dlg_draw_box(dialog, 0, 0, height, width, dialog_attr, border_attr);
dlg_draw_title(dialog, title);
+ dlg_draw_helpline(dialog, FALSE);
if (*prompt != '\0') {
int y2, x2;
diff --git a/contrib/dialog/rc.c b/contrib/dialog/rc.c
index 77dd586..2e2c7e6 100644
--- a/contrib/dialog/rc.c
+++ b/contrib/dialog/rc.c
@@ -1,9 +1,9 @@
/*
- * $Id: rc.c,v 1.45 2010/01/18 10:28:16 tom Exp $
+ * $Id: rc.c,v 1.47 2011/06/20 22:30:04 tom Exp $
*
* rc.c -- routines for processing the configuration file
*
- * Copyright 2000-2008,2010 Thomas E. Dickey
+ * Copyright 2000-2010,2011 Thomas E. Dickey
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License, version 2.1
@@ -433,9 +433,7 @@ dlg_create_rc(const char *filename)
dlg_color_table[i].hilite));
}
#endif /* HAVE_COLOR */
-#if 1
dlg_dump_keys(rc_file);
-#endif
(void) fclose(rc_file);
}
@@ -455,9 +453,7 @@ dlg_parse_rc(void)
char *tempptr;
int result = 0;
FILE *rc_file = 0;
-#if 1
char *params;
-#endif
/*
* At startup, dialog determines the settings to use as follows:
@@ -486,20 +482,21 @@ dlg_parse_rc(void)
sprintf(str, "%s%s", tempptr, DIALOGRC);
else
sprintf(str, "%s/%s", tempptr, DIALOGRC);
- rc_file = fopen(str, "rt");
+ rc_file = fopen(tempptr = str, "rt");
}
}
if (rc_file == NULL) { /* step (b) failed? */
/* try step (c) */
strcpy(str, GLOBALRC);
- if ((rc_file = fopen(str, "rt")) == NULL)
+ if ((rc_file = fopen(tempptr = str, "rt")) == NULL)
return 0; /* step (c) failed, use default values */
}
+ DLG_TRACE(("opened rc file \"%s\"\n", tempptr));
/* Scan each line and set variables */
while ((result == 0) && (fgets(str, MAX_LEN, rc_file) != NULL)) {
- dlg_trace_msg("rc:%s\n", str);
+ DLG_TRACE(("rc:%s", str));
if (*str == '\0' || lastch(str) != '\n') {
/* ignore rest of file if line too long */
fprintf(stderr, "\nParse error: line %d of configuration"
diff --git a/contrib/dialog/samples/valgrind.log b/contrib/dialog/samples/valgrind.log
new file mode 100644
index 0000000..f33b862
--- /dev/null
+++ b/contrib/dialog/samples/valgrind.log
@@ -0,0 +1,847 @@
+==23273== Memcheck, a memory error detector.
+==23273== Copyright (C) 2002-2007, and GNU GPL'd, by Julian Seward et al.
+==23273== Using LibVEX rev 1854, a library for dynamic binary translation.
+==23273== Copyright (C) 2004-2007, and GNU GPL'd, by OpenWorks LLP.
+==23273== Using valgrind-3.3.1-Debian, a dynamic binary instrumentation framework.
+==23273== Copyright (C) 2000-2007, and GNU GPL'd, by Julian Seward et al.
+==23273==
+--23273-- Command line
+--23273-- /usr/build/dialog/dialog-1.1-20110707/dialog
+--23273-- --title
+--23273-- YES/NO BOX
+--23273-- --clear
+--23273-- --yesno
+--23273-- Hi, this is a yes/no dialog box. You can use this to ask questions that have an answer of either yes or no. BTW, do you notice that long lines will be automatically wrapped around so that they can fit in the box? You can also control line breaking explicitly by inserting 'backslash n' at any place you like, but in this case, auto wrap around will be disabled and you will have to control line breaking yourself.
+--23273-- 15
+--23273-- 61
+--23273-- Startup, with flags:
+--23273-- --suppressions=/usr/lib/valgrind/debian-libc6-dbg.supp
+--23273-- -v
+--23273-- --num-callers=10
+--23273-- --error-limit=no
+--23273-- --show-reachable=yes
+--23273-- --leak-resolution=high
+--23273-- --leak-check=yes
+--23273-- --show-reachable=yes
+--23273-- --log-fd=2
+--23273-- Contents of /proc/version:
+--23273-- Linux version 2.6.26-2-686 (Debian 2.6.26-26lenny3) (dannf@debian.org) (gcc version 4.1.3 20080704 (prerelease) (Debian 4.1.2-25)) #1 SMP Sat Jun 11 14:54:10 UTC 2011
+--23273-- Arch and hwcaps: X86, x86-sse1-sse2
+--23273-- Page sizes: currently 4096, max supported 4096
+--23273-- Valgrind library directory: /usr/lib/valgrind
+--23273-- Reading syms from /lib/ld-2.7.so (0x4000000)
+--23273-- Reading debug info from /lib/ld-2.7.so...
+--23273-- ... CRC mismatch (computed 0f4d8d49 wanted a869dbba)
+--23273-- Reading debug info from /usr/lib/debug/lib/ld-2.7.so...
+--23273-- Reading syms from /usr/build/dialog/dialog-1.1-20110707/dialog (0x8048000)
+--23273-- Reading syms from /usr/lib/valgrind/x86-linux/memcheck (0x38000000)
+--23273-- object doesn't have a dynamic symbol table
+--23273-- Reading suppressions file: /usr/lib/valgrind/debian-libc6-dbg.supp
+--23273-- Reading suppressions file: /usr/lib/valgrind/default.supp
+--23273-- REDIR: 0x4015500 (index) redirected to 0x3802cf43 (vgPlain_x86_linux_REDIR_FOR_index)
+--23273-- Reading syms from /usr/lib/valgrind/x86-linux/vgpreload_core.so (0x401E000)
+--23273-- Reading syms from /usr/lib/valgrind/x86-linux/vgpreload_memcheck.so (0x4020000)
+==23273== WARNING: new redirection conflicts with existing -- ignoring it
+--23273-- new: 0x04015500 (index ) R-> 0x040241e0 index
+--23273-- REDIR: 0x40156f0 (strlen) redirected to 0x4024490 (strlen)
+--23273-- Reading syms from /usr/lib/debug/libm-2.7.so (0x4027000)
+--23273-- Reading syms from /usr/lib/debug/libc-2.7.so (0x404D000)
+--23273-- REDIR: 0x40beaf0 (rindex) redirected to 0x40240c0 (rindex)
+--23273-- REDIR: 0x40bf760 (memset) redirected to 0x4025380 (memset)
+--23273-- REDIR: 0x40be160 (strcmp) redirected to 0x4024770 (strcmp)
+--23273-- REDIR: 0x40be700 (strlen) redirected to 0x4024470 (strlen)
+--23273-- REDIR: 0x40be910 (strncmp) redirected to 0x40246e0 (strncmp)
+--23273-- REDIR: 0x40bdff0 (index) redirected to 0x40241b0 (index)
+--23273-- REDIR: 0x40b9740 (free) redirected to 0x4022ad0 (free)
+--23273-- REDIR: 0x40bb2c0 (calloc) redirected to 0x4021d60 (calloc)
+--23273-- REDIR: 0x40c07e0 (strchrnul) redirected to 0x4025450 (strchrnul)
+--23273-- REDIR: 0x40bb5e0 (malloc) redirected to 0x4023cb0 (malloc)
+--23273-- REDIR: 0x40bfc80 (memcpy) redirected to 0x40248e0 (memcpy)
+--23273-- REDIR: 0x40be7b0 (strnlen) redirected to 0x4024430 (strnlen)
+--23273-- REDIR: 0x40bf7c0 (mempcpy) redirected to 0x40254b0 (mempcpy)
+--23273-- REDIR: 0x40be1f0 (strcpy) redirected to 0x40244d0 (strcpy)
+--23273-- REDIR: 0x40bba60 (realloc) redirected to 0x4023dc0 (realloc)
+--23273-- REDIR: 0x40bea20 (strncpy) redirected to 0x40245a0 (strncpy)
+--23273-- REDIR: 0x40bf690 (bcmp) redirected to 0x4025070 (bcmp)
+--23273-- REDIR: 0x40bde40 (strcat) redirected to 0x4024240 (strcat)
+==23273==
+==23273== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 14 from 1)
+--23273--
+--23273-- supp: 14 dl-hack3-cond-1
+==23273== malloc/free: in use at exit: 72,482 bytes in 382 blocks.
+==23273== malloc/free: 419 allocs, 37 frees, 79,695 bytes allocated.
+==23273==
+==23273== searching for pointers to 382 not-freed blocks.
+==23273== checked 149,580 bytes.
+==23273==
+==23273== 6 bytes in 1 blocks are still reachable in loss record 1 of 62
+==23273== at 0x4023D6E: malloc (vg_replace_malloc.c:207)
+==23273== by 0x8068E64: dlg_strclone (util.c:1740)
+==23273== by 0x805FE72: same_cache2 (inputstr.c:212)
+==23273== by 0x805FEE7: dlg_index_wchars (inputstr.c:342)
+==23273== by 0x8059BBE: print_button (buttons.c:97)
+==23273== by 0x805A265: dlg_draw_buttons (buttons.c:297)
+==23273== by 0x806A2D0: dialog_yesno (yesno.c:98)
+==23273== by 0x804A728: call_yesno (dialog.c:600)
+==23273== by 0x804CC56: main (dialog.c:1679)
+==23273==
+==23273==
+==23273== 6 bytes in 1 blocks are still reachable in loss record 2 of 62
+==23273== at 0x4023D6E: malloc (vg_replace_malloc.c:207)
+==23273== by 0x8068E64: dlg_strclone (util.c:1740)
+==23273== by 0x805FE72: same_cache2 (inputstr.c:212)
+==23273== by 0x805FFCE: dlg_index_columns (inputstr.c:397)
+==23273== by 0x8060166: dlg_count_columns (inputstr.c:473)
+==23273== by 0x805A1F3: dlg_draw_buttons (buttons.c:296)
+==23273== by 0x806A2D0: dialog_yesno (yesno.c:98)
+==23273== by 0x804A728: call_yesno (dialog.c:600)
+==23273== by 0x804CC56: main (dialog.c:1679)
+==23273==
+==23273==
+==23273== 7 bytes in 2 blocks are still reachable in loss record 3 of 62
+==23273== at 0x4023D6E: malloc (vg_replace_malloc.c:207)
+==23273== by 0x8068E64: dlg_strclone (util.c:1740)
+==23273== by 0x805FE72: same_cache2 (inputstr.c:212)
+==23273== by 0x805FFCE: dlg_index_columns (inputstr.c:397)
+==23273== by 0x8060166: dlg_count_columns (inputstr.c:473)
+==23273== by 0x8059E3A: dlg_button_sizes (buttons.c:179)
+==23273== by 0x8059F04: dlg_button_x_step (buttons.c:209)
+==23273== by 0x805A02F: dlg_button_layout (buttons.c:234)
+==23273== by 0x806A11F: dialog_yesno (yesno.c:71)
+==23273== by 0x804A728: call_yesno (dialog.c:600)
+==23273==
+==23273==
+==23273== 11 bytes in 1 blocks are still reachable in loss record 4 of 62
+==23273== at 0x4023D6E: malloc (vg_replace_malloc.c:207)
+==23273== by 0x8068E64: dlg_strclone (util.c:1740)
+==23273== by 0x805FE72: same_cache2 (inputstr.c:212)
+==23273== by 0x805FFCE: dlg_index_columns (inputstr.c:397)
+==23273== by 0x8060166: dlg_count_columns (inputstr.c:473)
+==23273== by 0x8067711: real_auto_size (util.c:1101)
+==23273== by 0x8067A1F: dlg_auto_size (util.c:1167)
+==23273== by 0x806A14E: dialog_yesno (yesno.c:72)
+==23273== by 0x804A728: call_yesno (dialog.c:600)
+==23273== by 0x804CC56: main (dialog.c:1679)
+==23273==
+==23273==
+==23273== 12 bytes in 1 blocks are still reachable in loss record 5 of 62
+==23273== at 0x4021E22: calloc (vg_replace_malloc.c:397)
+==23273== by 0x807F18F: _nc_add_to_try (add_tries.c:90)
+==23273== by 0x80885C6: _nc_init_keytry (init_keytry.c:74)
+==23273== by 0x80807F4: _nc_keypad (lib_options.c:262)
+==23273== by 0x808035F: keypad (lib_options.c:129)
+==23273== by 0x8066340: init_dialog (util.c:330)
+==23273== by 0x804C880: main (dialog.c:1604)
+==23273==
+==23273==
+==23273== 16 bytes in 1 blocks are still reachable in loss record 6 of 62
+==23273== at 0x4023D6E: malloc (vg_replace_malloc.c:207)
+==23273== by 0x41165D0: tsearch (tsearch.c:281)
+==23273== by 0x805FC92: make_cache (inputstr.c:149)
+==23273== by 0x805FCF7: load_cache (inputstr.c:161)
+==23273== by 0x805FFB4: dlg_index_columns (inputstr.c:396)
+==23273== by 0x8060166: dlg_count_columns (inputstr.c:473)
+==23273== by 0x8066FD3: dlg_print_scrolled (util.c:886)
+==23273== by 0x806A30C: dialog_yesno (yesno.c:104)
+==23273== by 0x804A728: call_yesno (dialog.c:600)
+==23273== by 0x804CC56: main (dialog.c:1679)
+==23273==
+==23273==
+==23273== 16 bytes in 1 blocks are still reachable in loss record 7 of 62
+==23273== at 0x4023D6E: malloc (vg_replace_malloc.c:207)
+==23273== by 0x41165D0: tsearch (tsearch.c:281)
+==23273== by 0x805FC92: make_cache (inputstr.c:149)
+==23273== by 0x805FCF7: load_cache (inputstr.c:161)
+==23273== by 0x805FECD: dlg_index_wchars (inputstr.c:341)
+==23273== by 0x8059BBE: print_button (buttons.c:97)
+==23273== by 0x805A265: dlg_draw_buttons (buttons.c:297)
+==23273== by 0x806A2D0: dialog_yesno (yesno.c:98)
+==23273== by 0x804A728: call_yesno (dialog.c:600)
+==23273== by 0x804CC56: main (dialog.c:1679)
+==23273==
+==23273==
+==23273== 16 bytes in 1 blocks are still reachable in loss record 8 of 62
+==23273== at 0x4023D6E: malloc (vg_replace_malloc.c:207)
+==23273== by 0x41165D0: tsearch (tsearch.c:281)
+==23273== by 0x805FC92: make_cache (inputstr.c:149)
+==23273== by 0x805FCF7: load_cache (inputstr.c:161)
+==23273== by 0x805FFB4: dlg_index_columns (inputstr.c:396)
+==23273== by 0x8060166: dlg_count_columns (inputstr.c:473)
+==23273== by 0x805A1F3: dlg_draw_buttons (buttons.c:296)
+==23273== by 0x806A2D0: dialog_yesno (yesno.c:98)
+==23273== by 0x804A728: call_yesno (dialog.c:600)
+==23273== by 0x804CC56: main (dialog.c:1679)
+==23273==
+==23273==
+==23273== 16 bytes in 1 blocks are still reachable in loss record 9 of 62
+==23273== at 0x4023D6E: malloc (vg_replace_malloc.c:207)
+==23273== by 0x41165D0: tsearch (tsearch.c:281)
+==23273== by 0x805FC92: make_cache (inputstr.c:149)
+==23273== by 0x805FCF7: load_cache (inputstr.c:161)
+==23273== by 0x805FFB4: dlg_index_columns (inputstr.c:396)
+==23273== by 0x8060166: dlg_count_columns (inputstr.c:473)
+==23273== by 0x8067711: real_auto_size (util.c:1101)
+==23273== by 0x8067A1F: dlg_auto_size (util.c:1167)
+==23273== by 0x806A14E: dialog_yesno (yesno.c:72)
+==23273== by 0x804A728: call_yesno (dialog.c:600)
+==23273==
+==23273==
+==23273== 16 bytes in 1 blocks are still reachable in loss record 10 of 62
+==23273== at 0x4023D6E: malloc (vg_replace_malloc.c:207)
+==23273== by 0x807F2D5: _nc_doalloc (doalloc.c:55)
+==23273== by 0x8086167: _nc_trace_alloc (trace_buf.c:55)
+==23273== by 0x8086261: _nc_trace_buf (trace_buf.c:90)
+==23273== by 0x80864A7: _nc_visbuf2n (visbuf.c:94)
+==23273== by 0x8086538: _nc_visbuf2 (visbuf.c:114)
+==23273== by 0x8086553: _nc_visbuf (visbuf.c:120)
+==23273== by 0x8088693: recur_tries (trace_tries.c:55)
+==23273== by 0x80886D7: recur_tries (trace_tries.c:59)
+==23273== by 0x80886D7: recur_tries (trace_tries.c:59)
+==23273==
+==23273==
+==23273== 21 bytes in 1 blocks are still reachable in loss record 11 of 62
+==23273== at 0x4023D6E: malloc (vg_replace_malloc.c:207)
+==23273== by 0x40BE45F: strdup (strdup.c:43)
+==23273== by 0x8081EE0: setupterm (lib_setup.c:471)
+==23273== by 0x8072292: newterm (lib_newterm.c:115)
+==23273== by 0x806E82C: initscr (lib_initscr.c:83)
+==23273== by 0x8066211: init_dialog (util.c:292)
+==23273== by 0x804C880: main (dialog.c:1604)
+==23273==
+==23273==
+==23273== 23 bytes in 1 blocks are still reachable in loss record 12 of 62
+==23273== at 0x4023D6E: malloc (vg_replace_malloc.c:207)
+==23273== by 0x8088526: _nc_home_terminfo (home_terminfo.c:57)
+==23273== by 0x8085E1B: _nc_read_entry (read_entry.c:492)
+==23273== by 0x8081834: grab_entry (lib_setup.c:255)
+==23273== by 0x8081D46: setupterm (lib_setup.c:438)
+==23273== by 0x8072292: newterm (lib_newterm.c:115)
+==23273== by 0x806E82C: initscr (lib_initscr.c:83)
+==23273== by 0x8066211: init_dialog (util.c:292)
+==23273== by 0x804C880: main (dialog.c:1604)
+==23273==
+==23273==
+==23273== 24 bytes in 1 blocks are still reachable in loss record 13 of 62
+==23273== at 0x4023D6E: malloc (vg_replace_malloc.c:207)
+==23273== by 0x805FDE1: same_cache2 (inputstr.c:201)
+==23273== by 0x805FEE7: dlg_index_wchars (inputstr.c:342)
+==23273== by 0x8059BBE: print_button (buttons.c:97)
+==23273== by 0x805A265: dlg_draw_buttons (buttons.c:297)
+==23273== by 0x806A2D0: dialog_yesno (yesno.c:98)
+==23273== by 0x804A728: call_yesno (dialog.c:600)
+==23273== by 0x804CC56: main (dialog.c:1679)
+==23273==
+==23273==
+==23273== 24 bytes in 1 blocks are still reachable in loss record 14 of 62
+==23273== at 0x4023D6E: malloc (vg_replace_malloc.c:207)
+==23273== by 0x805FDE1: same_cache2 (inputstr.c:201)
+==23273== by 0x805FFCE: dlg_index_columns (inputstr.c:397)
+==23273== by 0x8060166: dlg_count_columns (inputstr.c:473)
+==23273== by 0x805A1F3: dlg_draw_buttons (buttons.c:296)
+==23273== by 0x806A2D0: dialog_yesno (yesno.c:98)
+==23273== by 0x804A728: call_yesno (dialog.c:600)
+==23273== by 0x804CC56: main (dialog.c:1679)
+==23273==
+==23273==
+==23273== 28 bytes in 1 blocks are still reachable in loss record 15 of 62
+==23273== at 0x4021E22: calloc (vg_replace_malloc.c:397)
+==23273== by 0x805FC0F: make_cache (inputstr.c:139)
+==23273== by 0x805FCF7: load_cache (inputstr.c:161)
+==23273== by 0x805FFB4: dlg_index_columns (inputstr.c:396)
+==23273== by 0x8060166: dlg_count_columns (inputstr.c:473)
+==23273== by 0x8066FD3: dlg_print_scrolled (util.c:886)
+==23273== by 0x806A30C: dialog_yesno (yesno.c:104)
+==23273== by 0x804A728: call_yesno (dialog.c:600)
+==23273== by 0x804CC56: main (dialog.c:1679)
+==23273==
+==23273==
+==23273== 28 bytes in 1 blocks are still reachable in loss record 16 of 62
+==23273== at 0x4021E22: calloc (vg_replace_malloc.c:397)
+==23273== by 0x805FC0F: make_cache (inputstr.c:139)
+==23273== by 0x805FCF7: load_cache (inputstr.c:161)
+==23273== by 0x805FECD: dlg_index_wchars (inputstr.c:341)
+==23273== by 0x8059BBE: print_button (buttons.c:97)
+==23273== by 0x805A265: dlg_draw_buttons (buttons.c:297)
+==23273== by 0x806A2D0: dialog_yesno (yesno.c:98)
+==23273== by 0x804A728: call_yesno (dialog.c:600)
+==23273== by 0x804CC56: main (dialog.c:1679)
+==23273==
+==23273==
+==23273== 28 bytes in 1 blocks are still reachable in loss record 17 of 62
+==23273== at 0x4021E22: calloc (vg_replace_malloc.c:397)
+==23273== by 0x805FC0F: make_cache (inputstr.c:139)
+==23273== by 0x805FCF7: load_cache (inputstr.c:161)
+==23273== by 0x805FFB4: dlg_index_columns (inputstr.c:396)
+==23273== by 0x8060166: dlg_count_columns (inputstr.c:473)
+==23273== by 0x805A1F3: dlg_draw_buttons (buttons.c:296)
+==23273== by 0x806A2D0: dialog_yesno (yesno.c:98)
+==23273== by 0x804A728: call_yesno (dialog.c:600)
+==23273== by 0x804CC56: main (dialog.c:1679)
+==23273==
+==23273==
+==23273== 28 bytes in 1 blocks are still reachable in loss record 18 of 62
+==23273== at 0x4021E22: calloc (vg_replace_malloc.c:397)
+==23273== by 0x805FC0F: make_cache (inputstr.c:139)
+==23273== by 0x805FCF7: load_cache (inputstr.c:161)
+==23273== by 0x805FFB4: dlg_index_columns (inputstr.c:396)
+==23273== by 0x8060166: dlg_count_columns (inputstr.c:473)
+==23273== by 0x8067711: real_auto_size (util.c:1101)
+==23273== by 0x8067A1F: dlg_auto_size (util.c:1167)
+==23273== by 0x806A14E: dialog_yesno (yesno.c:72)
+==23273== by 0x804A728: call_yesno (dialog.c:600)
+==23273== by 0x804CC56: main (dialog.c:1679)
+==23273==
+==23273==
+==23273== 28 bytes in 2 blocks are still reachable in loss record 19 of 62
+==23273== at 0x4023D6E: malloc (vg_replace_malloc.c:207)
+==23273== by 0x805FDE1: same_cache2 (inputstr.c:201)
+==23273== by 0x805FFCE: dlg_index_columns (inputstr.c:397)
+==23273== by 0x8060166: dlg_count_columns (inputstr.c:473)
+==23273== by 0x8059E3A: dlg_button_sizes (buttons.c:179)
+==23273== by 0x8059F04: dlg_button_x_step (buttons.c:209)
+==23273== by 0x805A02F: dlg_button_layout (buttons.c:234)
+==23273== by 0x806A11F: dialog_yesno (yesno.c:71)
+==23273== by 0x804A728: call_yesno (dialog.c:600)
+==23273== by 0x804CC56: main (dialog.c:1679)
+==23273==
+==23273==
+==23273== 32 bytes in 2 blocks are still reachable in loss record 20 of 62
+==23273== at 0x4023D6E: malloc (vg_replace_malloc.c:207)
+==23273== by 0x41165D0: tsearch (tsearch.c:281)
+==23273== by 0x805FC92: make_cache (inputstr.c:149)
+==23273== by 0x805FCF7: load_cache (inputstr.c:161)
+==23273== by 0x805FFB4: dlg_index_columns (inputstr.c:396)
+==23273== by 0x8060166: dlg_count_columns (inputstr.c:473)
+==23273== by 0x8059E3A: dlg_button_sizes (buttons.c:179)
+==23273== by 0x8059F04: dlg_button_x_step (buttons.c:209)
+==23273== by 0x805A02F: dlg_button_layout (buttons.c:234)
+==23273== by 0x806A11F: dialog_yesno (yesno.c:71)
+==23273==
+==23273==
+==23273== 33 bytes in 1 blocks are still reachable in loss record 21 of 62
+==23273== at 0x4023E8C: realloc (vg_replace_malloc.c:429)
+==23273== by 0x807F2A9: _nc_doalloc (doalloc.c:50)
+==23273== by 0x808620A: _nc_trace_alloc (trace_buf.c:63)
+==23273== by 0x8086261: _nc_trace_buf (trace_buf.c:90)
+==23273== by 0x80864A7: _nc_visbuf2n (visbuf.c:94)
+==23273== by 0x8086538: _nc_visbuf2 (visbuf.c:114)
+==23273== by 0x8086553: _nc_visbuf (visbuf.c:120)
+==23273== by 0x8088693: recur_tries (trace_tries.c:55)
+==23273== by 0x80886D7: recur_tries (trace_tries.c:59)
+==23273== by 0x80886D7: recur_tries (trace_tries.c:59)
+==23273==
+==23273==
+==23273== 44 bytes in 1 blocks are still reachable in loss record 22 of 62
+==23273== at 0x4023D6E: malloc (vg_replace_malloc.c:207)
+==23273== by 0x805FDE1: same_cache2 (inputstr.c:201)
+==23273== by 0x805FFCE: dlg_index_columns (inputstr.c:397)
+==23273== by 0x8060166: dlg_count_columns (inputstr.c:473)
+==23273== by 0x8067711: real_auto_size (util.c:1101)
+==23273== by 0x8067A1F: dlg_auto_size (util.c:1167)
+==23273== by 0x806A14E: dialog_yesno (yesno.c:72)
+==23273== by 0x804A728: call_yesno (dialog.c:600)
+==23273== by 0x804CC56: main (dialog.c:1679)
+==23273==
+==23273==
+==23273== 47 bytes in 1 blocks are still reachable in loss record 23 of 62
+==23273== at 0x4023E8C: realloc (vg_replace_malloc.c:429)
+==23273== by 0x807F2A9: _nc_doalloc (doalloc.c:50)
+==23273== by 0x8085368: read_termtype (read_entry.c:283)
+==23273== by 0x8085B64: _nc_read_file_entry (read_entry.c:392)
+==23273== by 0x8085BF5: _nc_read_tic_entry (read_entry.c:413)
+==23273== by 0x8085C8A: _nc_read_terminfo_dirs (read_entry.c:438)
+==23273== by 0x8085E90: _nc_read_entry (read_entry.c:500)
+==23273== by 0x8081834: grab_entry (lib_setup.c:255)
+==23273== by 0x8081D46: setupterm (lib_setup.c:438)
+==23273== by 0x8072292: newterm (lib_newterm.c:115)
+==23273==
+==23273==
+==23273== 55 bytes in 1 blocks are still reachable in loss record 24 of 62
+==23273== at 0x4021E22: calloc (vg_replace_malloc.c:397)
+==23273== by 0x8084EC3: read_termtype (read_entry.c:207)
+==23273== by 0x8085B64: _nc_read_file_entry (read_entry.c:392)
+==23273== by 0x8085BF5: _nc_read_tic_entry (read_entry.c:413)
+==23273== by 0x8085C8A: _nc_read_terminfo_dirs (read_entry.c:438)
+==23273== by 0x8085E90: _nc_read_entry (read_entry.c:500)
+==23273== by 0x8081834: grab_entry (lib_setup.c:255)
+==23273== by 0x8081D46: setupterm (lib_setup.c:438)
+==23273== by 0x8072292: newterm (lib_newterm.c:115)
+==23273== by 0x806E82C: initscr (lib_initscr.c:83)
+==23273==
+==23273==
+==23273== 56 bytes in 2 blocks are still reachable in loss record 25 of 62
+==23273== at 0x4021E22: calloc (vg_replace_malloc.c:397)
+==23273== by 0x805FC0F: make_cache (inputstr.c:139)
+==23273== by 0x805FCF7: load_cache (inputstr.c:161)
+==23273== by 0x805FFB4: dlg_index_columns (inputstr.c:396)
+==23273== by 0x8060166: dlg_count_columns (inputstr.c:473)
+==23273== by 0x8059E3A: dlg_button_sizes (buttons.c:179)
+==23273== by 0x8059F04: dlg_button_x_step (buttons.c:209)
+==23273== by 0x805A02F: dlg_button_layout (buttons.c:234)
+==23273== by 0x806A11F: dialog_yesno (yesno.c:71)
+==23273== by 0x804A728: call_yesno (dialog.c:600)
+==23273==
+==23273==
+==23273== 66 bytes in 1 blocks are still reachable in loss record 26 of 62
+==23273== at 0x4023E8C: realloc (vg_replace_malloc.c:429)
+==23273== by 0x807F2A9: _nc_doalloc (doalloc.c:50)
+==23273== by 0x808238C: get_space (lib_tparm.c:155)
+==23273== by 0x8082443: save_number (lib_tparm.c:180)
+==23273== by 0x8082D8B: tparam_internal (lib_tparm.c:564)
+==23273== by 0x80833C4: tparm (lib_tparm.c:788)
+==23273== by 0x80704CF: _nc_mvcur_init (lib_mvcur.c:358)
+==23273== by 0x8072684: newterm (lib_newterm.c:191)
+==23273== by 0x806E82C: initscr (lib_initscr.c:83)
+==23273== by 0x8066211: init_dialog (util.c:292)
+==23273==
+==23273==
+==23273== 80 bytes in 1 blocks are still reachable in loss record 27 of 62
+==23273== at 0x4021E22: calloc (vg_replace_malloc.c:397)
+==23273== by 0x8072E08: _nc_makenew (lib_newwin.c:218)
+==23273== by 0x807299B: newwin (lib_newwin.c:126)
+==23273== by 0x8074F9A: _nc_setupscreen (lib_set_term.c:459)
+==23273== by 0x80723F1: newterm (lib_newterm.c:146)
+==23273== by 0x806E82C: initscr (lib_initscr.c:83)
+==23273== by 0x8066211: init_dialog (util.c:292)
+==23273== by 0x804C880: main (dialog.c:1604)
+==23273==
+==23273==
+==23273== 80 bytes in 1 blocks are still reachable in loss record 28 of 62
+==23273== at 0x4021E22: calloc (vg_replace_malloc.c:397)
+==23273== by 0x8072E08: _nc_makenew (lib_newwin.c:218)
+==23273== by 0x807299B: newwin (lib_newwin.c:126)
+==23273== by 0x8074CB3: _nc_setupscreen (lib_set_term.c:414)
+==23273== by 0x80723F1: newterm (lib_newterm.c:146)
+==23273== by 0x806E82C: initscr (lib_initscr.c:83)
+==23273== by 0x8066211: init_dialog (util.c:292)
+==23273== by 0x804C880: main (dialog.c:1604)
+==23273==
+==23273==
+==23273== 80 bytes in 1 blocks are still reachable in loss record 29 of 62
+==23273== at 0x4021E22: calloc (vg_replace_malloc.c:397)
+==23273== by 0x8072E08: _nc_makenew (lib_newwin.c:218)
+==23273== by 0x807299B: newwin (lib_newwin.c:126)
+==23273== by 0x8074C55: _nc_setupscreen (lib_set_term.c:410)
+==23273== by 0x80723F1: newterm (lib_newterm.c:146)
+==23273== by 0x806E82C: initscr (lib_initscr.c:83)
+==23273== by 0x8066211: init_dialog (util.c:292)
+==23273== by 0x804C880: main (dialog.c:1604)
+==23273==
+==23273==
+==23273== 80 bytes in 1 blocks are still reachable in loss record 30 of 62
+==23273== at 0x4023E8C: realloc (vg_replace_malloc.c:429)
+==23273== by 0x807F2A9: _nc_doalloc (doalloc.c:50)
+==23273== by 0x808538F: read_termtype (read_entry.c:284)
+==23273== by 0x8085B64: _nc_read_file_entry (read_entry.c:392)
+==23273== by 0x8085BF5: _nc_read_tic_entry (read_entry.c:413)
+==23273== by 0x8085C8A: _nc_read_terminfo_dirs (read_entry.c:438)
+==23273== by 0x8085E90: _nc_read_entry (read_entry.c:500)
+==23273== by 0x8081834: grab_entry (lib_setup.c:255)
+==23273== by 0x8081D46: setupterm (lib_setup.c:438)
+==23273== by 0x8072292: newterm (lib_newterm.c:115)
+==23273==
+==23273==
+==23273== 112 bytes in 7 blocks are still reachable in loss record 31 of 62
+==23273== at 0x4023D6E: malloc (vg_replace_malloc.c:207)
+==23273== by 0x41165D0: tsearch (tsearch.c:281)
+==23273== by 0x805FC92: make_cache (inputstr.c:149)
+==23273== by 0x805FCF7: load_cache (inputstr.c:161)
+==23273== by 0x805FFB4: dlg_index_columns (inputstr.c:396)
+==23273== by 0x8066A0A: dlg_print_line (util.c:668)
+==23273== by 0x8066E40: justify_text (util.c:813)
+==23273== by 0x8066F5E: dlg_print_autowrap (util.c:843)
+==23273== by 0x806703E: dlg_print_scrolled (util.c:892)
+==23273== by 0x806A30C: dialog_yesno (yesno.c:104)
+==23273==
+==23273==
+==23273== 118 bytes in 1 blocks are still reachable in loss record 32 of 62
+==23273== at 0x4023E8C: realloc (vg_replace_malloc.c:429)
+==23273== by 0x807F2A9: _nc_doalloc (doalloc.c:50)
+==23273== by 0x8082957: _nc_tparm_analyze (lib_tparm.c:374)
+==23273== by 0x8082B5E: tparam_internal (lib_tparm.c:502)
+==23273== by 0x80833C4: tparm (lib_tparm.c:788)
+==23273== by 0x80782E6: vidputs (lib_vidattr.c:187)
+==23273== by 0x8078B59: vidattr (lib_vidattr.c:270)
+==23273== by 0x807ACE8: ClrToEOS (tty_update.c:957)
+==23273== by 0x807AF54: ClrBottom (tty_update.c:1006)
+==23273== by 0x807AB1C: ClrUpdate (tty_update.c:897)
+==23273==
+==23273==
+==23273== 128 bytes in 8 blocks are still reachable in loss record 33 of 62
+==23273== at 0x4023D6E: malloc (vg_replace_malloc.c:207)
+==23273== by 0x41165D0: tsearch (tsearch.c:281)
+==23273== by 0x805FC92: make_cache (inputstr.c:149)
+==23273== by 0x805FCF7: load_cache (inputstr.c:161)
+==23273== by 0x805FECD: dlg_index_wchars (inputstr.c:341)
+==23273== by 0x8066A18: dlg_print_line (util.c:669)
+==23273== by 0x8066E40: justify_text (util.c:813)
+==23273== by 0x8066F5E: dlg_print_autowrap (util.c:843)
+==23273== by 0x806703E: dlg_print_scrolled (util.c:892)
+==23273== by 0x806A30C: dialog_yesno (yesno.c:104)
+==23273==
+==23273==
+==23273== 128 bytes in 1 blocks are still reachable in loss record 34 of 62
+==23273== at 0x4021E22: calloc (vg_replace_malloc.c:397)
+==23273== by 0x806BDE0: start_color (lib_color.c:238)
+==23273== by 0x80663B1: dlg_color_setup (util.c:360)
+==23273== by 0x806638E: init_dialog (util.c:342)
+==23273== by 0x804C880: main (dialog.c:1604)
+==23273==
+==23273==
+==23273== 128 bytes in 1 blocks are still reachable in loss record 35 of 62
+==23273== at 0x4021E22: calloc (vg_replace_malloc.c:397)
+==23273== by 0x806BDA7: start_color (lib_color.c:236)
+==23273== by 0x80663B1: dlg_color_setup (util.c:360)
+==23273== by 0x806638E: init_dialog (util.c:342)
+==23273== by 0x804C880: main (dialog.c:1604)
+==23273==
+==23273==
+==23273== 160 bytes in 1 blocks are still reachable in loss record 36 of 62
+==23273== at 0x4021E22: calloc (vg_replace_malloc.c:397)
+==23273== by 0x8087176: _nc_hash_map (hashmap.c:299)
+==23273== by 0x80865F4: _nc_scroll_optimize (hardscroll.c:199)
+==23273== by 0x807A762: doupdate (tty_update.c:778)
+==23273== by 0x8073C0A: wrefresh (lib_refresh.c:58)
+==23273== by 0x806D95D: _nc_wgetch (lib_getch.c:295)
+==23273== by 0x806DD0D: wgetch (lib_getch.c:467)
+==23273== by 0x80654FC: really_getch (ui_getc.c:352)
+==23273== by 0x806566B: dlg_getc (ui_getc.c:423)
+==23273== by 0x80627C4: mouse_wgetch (mousewget.c:35)
+==23273==
+==23273==
+==23273== 160 bytes in 1 blocks are still reachable in loss record 37 of 62
+==23273== at 0x4021E22: calloc (vg_replace_malloc.c:397)
+==23273== by 0x8087141: _nc_hash_map (hashmap.c:297)
+==23273== by 0x80865F4: _nc_scroll_optimize (hardscroll.c:199)
+==23273== by 0x807A762: doupdate (tty_update.c:778)
+==23273== by 0x8073C0A: wrefresh (lib_refresh.c:58)
+==23273== by 0x806D95D: _nc_wgetch (lib_getch.c:295)
+==23273== by 0x806DD0D: wgetch (lib_getch.c:467)
+==23273== by 0x80654FC: really_getch (ui_getc.c:352)
+==23273== by 0x806566B: dlg_getc (ui_getc.c:423)
+==23273== by 0x80627C4: mouse_wgetch (mousewget.c:35)
+==23273==
+==23273==
+==23273== 160 bytes in 1 blocks are still reachable in loss record 38 of 62
+==23273== at 0x4023D6E: malloc (vg_replace_malloc.c:207)
+==23273== by 0x807F2D5: _nc_doalloc (doalloc.c:55)
+==23273== by 0x80865CB: _nc_scroll_optimize (hardscroll.c:192)
+==23273== by 0x807A762: doupdate (tty_update.c:778)
+==23273== by 0x8073C0A: wrefresh (lib_refresh.c:58)
+==23273== by 0x806D95D: _nc_wgetch (lib_getch.c:295)
+==23273== by 0x806DD0D: wgetch (lib_getch.c:467)
+==23273== by 0x80654FC: really_getch (ui_getc.c:352)
+==23273== by 0x806566B: dlg_getc (ui_getc.c:423)
+==23273== by 0x80627C4: mouse_wgetch (mousewget.c:35)
+==23273==
+==23273==
+==23273== 172 bytes in 1 blocks are still reachable in loss record 39 of 62
+==23273== at 0x4021E22: calloc (vg_replace_malloc.c:397)
+==23273== by 0x8081CD7: setupterm (lib_setup.c:431)
+==23273== by 0x8072292: newterm (lib_newterm.c:115)
+==23273== by 0x806E82C: initscr (lib_initscr.c:83)
+==23273== by 0x8066211: init_dialog (util.c:292)
+==23273== by 0x804C880: main (dialog.c:1604)
+==23273==
+==23273==
+==23273== 196 bytes in 7 blocks are still reachable in loss record 40 of 62
+==23273== at 0x4021E22: calloc (vg_replace_malloc.c:397)
+==23273== by 0x805FC0F: make_cache (inputstr.c:139)
+==23273== by 0x805FCF7: load_cache (inputstr.c:161)
+==23273== by 0x805FFB4: dlg_index_columns (inputstr.c:396)
+==23273== by 0x8066A0A: dlg_print_line (util.c:668)
+==23273== by 0x8066E40: justify_text (util.c:813)
+==23273== by 0x8066F5E: dlg_print_autowrap (util.c:843)
+==23273== by 0x806703E: dlg_print_scrolled (util.c:892)
+==23273== by 0x806A30C: dialog_yesno (yesno.c:104)
+==23273== by 0x804A728: call_yesno (dialog.c:600)
+==23273==
+==23273==
+==23273== 224 bytes in 8 blocks are still reachable in loss record 41 of 62
+==23273== at 0x4021E22: calloc (vg_replace_malloc.c:397)
+==23273== by 0x805FC0F: make_cache (inputstr.c:139)
+==23273== by 0x805FCF7: load_cache (inputstr.c:161)
+==23273== by 0x805FECD: dlg_index_wchars (inputstr.c:341)
+==23273== by 0x8066A18: dlg_print_line (util.c:669)
+==23273== by 0x8066E40: justify_text (util.c:813)
+==23273== by 0x8066F5E: dlg_print_autowrap (util.c:843)
+==23273== by 0x806703E: dlg_print_scrolled (util.c:892)
+==23273== by 0x806A30C: dialog_yesno (yesno.c:104)
+==23273== by 0x804A728: call_yesno (dialog.c:600)
+==23273==
+==23273==
+==23273== 252 bytes in 1 blocks are still reachable in loss record 42 of 62
+==23273== at 0x4021E22: calloc (vg_replace_malloc.c:397)
+==23273== by 0x80858B3: read_termtype (read_entry.c:345)
+==23273== by 0x8085B64: _nc_read_file_entry (read_entry.c:392)
+==23273== by 0x8085BF5: _nc_read_tic_entry (read_entry.c:413)
+==23273== by 0x8085C8A: _nc_read_terminfo_dirs (read_entry.c:438)
+==23273== by 0x8085E90: _nc_read_entry (read_entry.c:500)
+==23273== by 0x8081834: grab_entry (lib_setup.c:255)
+==23273== by 0x8081D46: setupterm (lib_setup.c:438)
+==23273== by 0x8072292: newterm (lib_newterm.c:115)
+==23273== by 0x806E82C: initscr (lib_initscr.c:83)
+==23273==
+==23273==
+==23273== 421 bytes in 1 blocks are still reachable in loss record 43 of 62
+==23273== at 0x4023D6E: malloc (vg_replace_malloc.c:207)
+==23273== by 0x8068E64: dlg_strclone (util.c:1740)
+==23273== by 0x805FE72: same_cache2 (inputstr.c:212)
+==23273== by 0x805FFCE: dlg_index_columns (inputstr.c:397)
+==23273== by 0x8060166: dlg_count_columns (inputstr.c:473)
+==23273== by 0x8066FD3: dlg_print_scrolled (util.c:886)
+==23273== by 0x806A30C: dialog_yesno (yesno.c:104)
+==23273== by 0x804A728: call_yesno (dialog.c:600)
+==23273== by 0x804CC56: main (dialog.c:1679)
+==23273==
+==23273==
+==23273== 480 bytes in 1 blocks are still reachable in loss record 44 of 62
+==23273== at 0x4021E22: calloc (vg_replace_malloc.c:397)
+==23273== by 0x8072E36: _nc_makenew (lib_newwin.c:223)
+==23273== by 0x807299B: newwin (lib_newwin.c:126)
+==23273== by 0x8074F9A: _nc_setupscreen (lib_set_term.c:459)
+==23273== by 0x80723F1: newterm (lib_newterm.c:146)
+==23273== by 0x806E82C: initscr (lib_initscr.c:83)
+==23273== by 0x8066211: init_dialog (util.c:292)
+==23273== by 0x804C880: main (dialog.c:1604)
+==23273==
+==23273==
+==23273== 480 bytes in 1 blocks are still reachable in loss record 45 of 62
+==23273== at 0x4021E22: calloc (vg_replace_malloc.c:397)
+==23273== by 0x8072E36: _nc_makenew (lib_newwin.c:223)
+==23273== by 0x807299B: newwin (lib_newwin.c:126)
+==23273== by 0x8074CB3: _nc_setupscreen (lib_set_term.c:414)
+==23273== by 0x80723F1: newterm (lib_newterm.c:146)
+==23273== by 0x806E82C: initscr (lib_initscr.c:83)
+==23273== by 0x8066211: init_dialog (util.c:292)
+==23273== by 0x804C880: main (dialog.c:1604)
+==23273==
+==23273==
+==23273== 480 bytes in 1 blocks are still reachable in loss record 46 of 62
+==23273== at 0x4021E22: calloc (vg_replace_malloc.c:397)
+==23273== by 0x8072E36: _nc_makenew (lib_newwin.c:223)
+==23273== by 0x807299B: newwin (lib_newwin.c:126)
+==23273== by 0x8074C55: _nc_setupscreen (lib_set_term.c:410)
+==23273== by 0x80723F1: newterm (lib_newterm.c:146)
+==23273== by 0x806E82C: initscr (lib_initscr.c:83)
+==23273== by 0x8066211: init_dialog (util.c:292)
+==23273== by 0x804C880: main (dialog.c:1604)
+==23273==
+==23273==
+==23273== 689 bytes in 1 blocks are still reachable in loss record 47 of 62
+==23273== at 0x4023D6E: malloc (vg_replace_malloc.c:207)
+==23273== by 0x8085659: read_termtype (read_entry.c:318)
+==23273== by 0x8085B64: _nc_read_file_entry (read_entry.c:392)
+==23273== by 0x8085BF5: _nc_read_tic_entry (read_entry.c:413)
+==23273== by 0x8085C8A: _nc_read_terminfo_dirs (read_entry.c:438)
+==23273== by 0x8085E90: _nc_read_entry (read_entry.c:500)
+==23273== by 0x8081834: grab_entry (lib_setup.c:255)
+==23273== by 0x8081D46: setupterm (lib_setup.c:438)
+==23273== by 0x8072292: newterm (lib_newterm.c:115)
+==23273== by 0x806E82C: initscr (lib_initscr.c:83)
+==23273==
+==23273==
+==23273== 780 bytes in 65 blocks are still reachable in loss record 48 of 62
+==23273== at 0x4021E22: calloc (vg_replace_malloc.c:397)
+==23273== by 0x807F1FF: _nc_add_to_try (add_tries.c:104)
+==23273== by 0x80885C6: _nc_init_keytry (init_keytry.c:74)
+==23273== by 0x80807F4: _nc_keypad (lib_options.c:262)
+==23273== by 0x808035F: keypad (lib_options.c:129)
+==23273== by 0x8066340: init_dialog (util.c:330)
+==23273== by 0x804C880: main (dialog.c:1604)
+==23273==
+==23273==
+==23273== 1,008 bytes in 84 blocks are still reachable in loss record 49 of 62
+==23273== at 0x4021E22: calloc (vg_replace_malloc.c:397)
+==23273== by 0x807F119: _nc_add_to_try (add_tries.c:77)
+==23273== by 0x80885C6: _nc_init_keytry (init_keytry.c:74)
+==23273== by 0x80807F4: _nc_keypad (lib_options.c:262)
+==23273== by 0x808035F: keypad (lib_options.c:129)
+==23273== by 0x8066340: init_dialog (util.c:330)
+==23273== by 0x804C880: main (dialog.c:1604)
+==23273==
+==23273==
+==23273== 1,338 bytes in 1 blocks are still reachable in loss record 50 of 62
+==23273== at 0x4023D6E: malloc (vg_replace_malloc.c:207)
+==23273== by 0x8084DF7: read_termtype (read_entry.c:193)
+==23273== by 0x8085B64: _nc_read_file_entry (read_entry.c:392)
+==23273== by 0x8085BF5: _nc_read_tic_entry (read_entry.c:413)
+==23273== by 0x8085C8A: _nc_read_terminfo_dirs (read_entry.c:438)
+==23273== by 0x8085E90: _nc_read_entry (read_entry.c:500)
+==23273== by 0x8081834: grab_entry (lib_setup.c:255)
+==23273== by 0x8081D46: setupterm (lib_setup.c:438)
+==23273== by 0x8072292: newterm (lib_newterm.c:115)
+==23273== by 0x806E82C: initscr (lib_initscr.c:83)
+==23273==
+==23273==
+==23273== 1,382 bytes in 7 blocks are still reachable in loss record 51 of 62
+==23273== at 0x4023D6E: malloc (vg_replace_malloc.c:207)
+==23273== by 0x8068E64: dlg_strclone (util.c:1740)
+==23273== by 0x805FE72: same_cache2 (inputstr.c:212)
+==23273== by 0x805FFCE: dlg_index_columns (inputstr.c:397)
+==23273== by 0x8066A0A: dlg_print_line (util.c:668)
+==23273== by 0x8066E40: justify_text (util.c:813)
+==23273== by 0x8066F5E: dlg_print_autowrap (util.c:843)
+==23273== by 0x806703E: dlg_print_scrolled (util.c:892)
+==23273== by 0x806A30C: dialog_yesno (yesno.c:104)
+==23273== by 0x804A728: call_yesno (dialog.c:600)
+==23273==
+==23273==
+==23273== 1,520 bytes in 1 blocks are still reachable in loss record 52 of 62
+==23273== at 0x4021E22: calloc (vg_replace_malloc.c:397)
+==23273== by 0x80747CF: _nc_setupscreen (lib_set_term.c:221)
+==23273== by 0x80723F1: newterm (lib_newterm.c:146)
+==23273== by 0x806E82C: initscr (lib_initscr.c:83)
+==23273== by 0x8066211: init_dialog (util.c:292)
+==23273== by 0x804C880: main (dialog.c:1604)
+==23273==
+==23273==
+==23273== 1,640 bytes in 1 blocks are still reachable in loss record 53 of 62
+==23273== at 0x4023D6E: malloc (vg_replace_malloc.c:207)
+==23273== by 0x8087007: _nc_hash_map (hashmap.c:277)
+==23273== by 0x80865F4: _nc_scroll_optimize (hardscroll.c:199)
+==23273== by 0x807A762: doupdate (tty_update.c:778)
+==23273== by 0x8073C0A: wrefresh (lib_refresh.c:58)
+==23273== by 0x806D95D: _nc_wgetch (lib_getch.c:295)
+==23273== by 0x806DD0D: wgetch (lib_getch.c:467)
+==23273== by 0x80654FC: really_getch (ui_getc.c:352)
+==23273== by 0x806566B: dlg_getc (ui_getc.c:423)
+==23273== by 0x80627C4: mouse_wgetch (mousewget.c:35)
+==23273==
+==23273==
+==23273== 1,684 bytes in 1 blocks are still reachable in loss record 54 of 62
+==23273== at 0x4023D6E: malloc (vg_replace_malloc.c:207)
+==23273== by 0x805FDE1: same_cache2 (inputstr.c:201)
+==23273== by 0x805FFCE: dlg_index_columns (inputstr.c:397)
+==23273== by 0x8060166: dlg_count_columns (inputstr.c:473)
+==23273== by 0x8066FD3: dlg_print_scrolled (util.c:886)
+==23273== by 0x806A30C: dialog_yesno (yesno.c:104)
+==23273== by 0x804A728: call_yesno (dialog.c:600)
+==23273== by 0x804CC56: main (dialog.c:1679)
+==23273==
+==23273==
+==23273== 1,803 bytes in 8 blocks are still reachable in loss record 55 of 62
+==23273== at 0x4023D6E: malloc (vg_replace_malloc.c:207)
+==23273== by 0x8068E64: dlg_strclone (util.c:1740)
+==23273== by 0x805FE72: same_cache2 (inputstr.c:212)
+==23273== by 0x805FEE7: dlg_index_wchars (inputstr.c:342)
+==23273== by 0x8066A18: dlg_print_line (util.c:669)
+==23273== by 0x8066E40: justify_text (util.c:813)
+==23273== by 0x8066F5E: dlg_print_autowrap (util.c:843)
+==23273== by 0x806703E: dlg_print_scrolled (util.c:892)
+==23273== by 0x806A30C: dialog_yesno (yesno.c:104)
+==23273== by 0x804A728: call_yesno (dialog.c:600)
+==23273==
+==23273==
+==23273== 1,892 bytes in 1 blocks are still reachable in loss record 56 of 62
+==23273== at 0x4023E8C: realloc (vg_replace_malloc.c:429)
+==23273== by 0x807F2A9: _nc_doalloc (doalloc.c:50)
+==23273== by 0x80853BA: read_termtype (read_entry.c:285)
+==23273== by 0x8085B64: _nc_read_file_entry (read_entry.c:392)
+==23273== by 0x8085BF5: _nc_read_tic_entry (read_entry.c:413)
+==23273== by 0x8085C8A: _nc_read_terminfo_dirs (read_entry.c:438)
+==23273== by 0x8085E90: _nc_read_entry (read_entry.c:500)
+==23273== by 0x8081834: grab_entry (lib_setup.c:255)
+==23273== by 0x8081D46: setupterm (lib_setup.c:438)
+==23273== by 0x8072292: newterm (lib_newterm.c:115)
+==23273==
+==23273==
+==23273== 2,800 bytes in 1 blocks are still reachable in loss record 57 of 62
+==23273== at 0x4023D6E: malloc (vg_replace_malloc.c:207)
+==23273== by 0x8085F59: _nc_set_buffer (setbuf.c:119)
+==23273== by 0x807481F: _nc_setupscreen (lib_set_term.c:232)
+==23273== by 0x80723F1: newterm (lib_newterm.c:146)
+==23273== by 0x806E82C: initscr (lib_initscr.c:83)
+==23273== by 0x8066211: init_dialog (util.c:292)
+==23273== by 0x804C880: main (dialog.c:1604)
+==23273==
+==23273==
+==23273== 5,528 bytes in 7 blocks are still reachable in loss record 58 of 62
+==23273== at 0x4023D6E: malloc (vg_replace_malloc.c:207)
+==23273== by 0x805FDE1: same_cache2 (inputstr.c:201)
+==23273== by 0x805FFCE: dlg_index_columns (inputstr.c:397)
+==23273== by 0x8066A0A: dlg_print_line (util.c:668)
+==23273== by 0x8066E40: justify_text (util.c:813)
+==23273== by 0x8066F5E: dlg_print_autowrap (util.c:843)
+==23273== by 0x806703E: dlg_print_scrolled (util.c:892)
+==23273== by 0x806A30C: dialog_yesno (yesno.c:104)
+==23273== by 0x804A728: call_yesno (dialog.c:600)
+==23273== by 0x804CC56: main (dialog.c:1679)
+==23273==
+==23273==
+==23273== 7,212 bytes in 8 blocks are still reachable in loss record 59 of 62
+==23273== at 0x4023D6E: malloc (vg_replace_malloc.c:207)
+==23273== by 0x805FDE1: same_cache2 (inputstr.c:201)
+==23273== by 0x805FEE7: dlg_index_wchars (inputstr.c:342)
+==23273== by 0x8066A18: dlg_print_line (util.c:669)
+==23273== by 0x8066E40: justify_text (util.c:813)
+==23273== by 0x8066F5E: dlg_print_autowrap (util.c:843)
+==23273== by 0x806703E: dlg_print_scrolled (util.c:892)
+==23273== by 0x806A30C: dialog_yesno (yesno.c:104)
+==23273== by 0x804A728: call_yesno (dialog.c:600)
+==23273== by 0x804CC56: main (dialog.c:1679)
+==23273==
+==23273==
+==23273== 12,800 bytes in 40 blocks are still reachable in loss record 60 of 62
+==23273== at 0x4021E22: calloc (vg_replace_malloc.c:397)
+==23273== by 0x80729EC: newwin (lib_newwin.c:130)
+==23273== by 0x8074F9A: _nc_setupscreen (lib_set_term.c:459)
+==23273== by 0x80723F1: newterm (lib_newterm.c:146)
+==23273== by 0x806E82C: initscr (lib_initscr.c:83)
+==23273== by 0x8066211: init_dialog (util.c:292)
+==23273== by 0x804C880: main (dialog.c:1604)
+==23273==
+==23273==
+==23273== 12,800 bytes in 40 blocks are still reachable in loss record 61 of 62
+==23273== at 0x4021E22: calloc (vg_replace_malloc.c:397)
+==23273== by 0x80729EC: newwin (lib_newwin.c:130)
+==23273== by 0x8074CB3: _nc_setupscreen (lib_set_term.c:414)
+==23273== by 0x80723F1: newterm (lib_newterm.c:146)
+==23273== by 0x806E82C: initscr (lib_initscr.c:83)
+==23273== by 0x8066211: init_dialog (util.c:292)
+==23273== by 0x804C880: main (dialog.c:1604)
+==23273==
+==23273==
+==23273== 12,800 bytes in 40 blocks are still reachable in loss record 62 of 62
+==23273== at 0x4021E22: calloc (vg_replace_malloc.c:397)
+==23273== by 0x80729EC: newwin (lib_newwin.c:130)
+==23273== by 0x8074C55: _nc_setupscreen (lib_set_term.c:410)
+==23273== by 0x80723F1: newterm (lib_newterm.c:146)
+==23273== by 0x806E82C: initscr (lib_initscr.c:83)
+==23273== by 0x8066211: init_dialog (util.c:292)
+==23273== by 0x804C880: main (dialog.c:1604)
+==23273==
+==23273== LEAK SUMMARY:
+==23273== definitely lost: 0 bytes in 0 blocks.
+==23273== possibly lost: 0 bytes in 0 blocks.
+==23273== still reachable: 72,482 bytes in 382 blocks.
+==23273== suppressed: 0 bytes in 0 blocks.
+--23273-- memcheck: sanity checks: 8 cheap, 2 expensive
+--23273-- memcheck: auxmaps: 0 auxmap entries (0k, 0M) in use
+--23273-- memcheck: auxmaps_L1: 0 searches, 0 cmps, ratio 0:10
+--23273-- memcheck: auxmaps_L2: 0 searches, 0 nodes
+--23273-- memcheck: SMs: n_issued = 11 (176k, 0M)
+--23273-- memcheck: SMs: n_deissued = 0 (0k, 0M)
+--23273-- memcheck: SMs: max_noaccess = 65535 (1048560k, 1023M)
+--23273-- memcheck: SMs: max_undefined = 0 (0k, 0M)
+--23273-- memcheck: SMs: max_defined = 25 (400k, 0M)
+--23273-- memcheck: SMs: max_non_DSM = 11 (176k, 0M)
+--23273-- memcheck: max sec V bit nodes: 21 (1k, 0M)
+--23273-- memcheck: set_sec_vbits8 calls: 130 (new: 21, updates: 109)
+--23273-- memcheck: max shadow mem size: 481k, 0M
+--23273-- translate: fast SP updates identified: 4,767 ( 83.0%)
+--23273-- translate: generic_known SP updates identified: 612 ( 10.6%)
+--23273-- translate: generic_unknown SP updates identified: 358 ( 6.2%)
+--23273-- tt/tc: 11,509 tt lookups requiring 11,938 probes
+--23273-- tt/tc: 11,509 fast-cache updates, 3 flushes
+--23273-- transtab: new 5,099 (117,852 -> 1,563,594; ratio 132:10) [0 scs]
+--23273-- transtab: dumped 0 (0 -> ??)
+--23273-- transtab: discarded 9 (222 -> ??)
+--23273-- scheduler: 864,676 jumps (bb entries).
+--23273-- scheduler: 8/7,086 major/minor sched events.
+--23273-- sanity: 9 cheap, 2 expensive checks.
+--23273-- exectx: 769 lists, 102 contexts (avg 0 per list)
+--23273-- exectx: 470 searches, 372 full compares (791 per 1000)
+--23273-- exectx: 0 cmp2, 36 cmp4, 2,470 cmpAll
+--23273-- errormgr: 69 supplist searches, 5,672 comparisons during search
+--23273-- errormgr: 14 errlist searches, 36 comparisons during search
diff --git a/contrib/dialog/tailbox.c b/contrib/dialog/tailbox.c
index 3499b4b..c111f64 100644
--- a/contrib/dialog/tailbox.c
+++ b/contrib/dialog/tailbox.c
@@ -1,5 +1,5 @@
/*
- * $Id: tailbox.c,v 1.61 2011/01/16 21:48:16 tom Exp $
+ * $Id: tailbox.c,v 1.63 2011/06/27 08:19:43 tom Exp $
*
* tailbox.c -- implements the tail box
*
@@ -284,6 +284,7 @@ dialog_tailbox(const char *title, const char *file, int height, int width, int b
{
/* *INDENT-OFF* */
static DLG_KEYS_BINDING binding[] = {
+ HELPKEY_BINDINGS,
ENTERKEY_BINDINGS,
DLG_KEYS_DATA( DLGK_BEGIN, '0' ),
DLG_KEYS_DATA( DLGK_BEGIN, KEY_BEG ),
@@ -338,6 +339,7 @@ dialog_tailbox(const char *title, const char *file, int height, int width, int b
dlg_draw_box(dialog, 0, 0, height, width, dialog_attr, border_attr);
dlg_draw_bottom_box(dialog);
dlg_draw_title(dialog, title);
+ dlg_draw_helpline(dialog, FALSE);
if (!bg_task) {
buttons = dlg_exit_label();
diff --git a/contrib/dialog/textbox.c b/contrib/dialog/textbox.c
index f9a19eb..72a9b11 100644
--- a/contrib/dialog/textbox.c
+++ b/contrib/dialog/textbox.c
@@ -1,5 +1,5 @@
/*
- * $Id: textbox.c,v 1.99 2011/01/16 22:20:34 tom Exp $
+ * $Id: textbox.c,v 1.101 2011/06/29 09:53:03 tom Exp $
*
* textbox.c -- implements the text box
*
@@ -452,6 +452,7 @@ get_search_term(WINDOW *dialog, char *input, int height, int width)
/* *INDENT-OFF* */
static DLG_KEYS_BINDING binding[] = {
INPUTSTR_BINDINGS,
+ HELPKEY_BINDINGS,
ENTERKEY_BINDINGS,
END_KEYS_BINDING
};
@@ -628,6 +629,7 @@ dialog_textbox(const char *title, const char *file, int height, int width)
{
/* *INDENT-OFF* */
static DLG_KEYS_BINDING binding[] = {
+ HELPKEY_BINDINGS,
ENTERKEY_BINDINGS,
DLG_KEYS_DATA( DLGK_GRID_DOWN, 'J' ),
DLG_KEYS_DATA( DLGK_GRID_DOWN, 'j' ),
@@ -819,7 +821,10 @@ dialog_textbox(const char *title, const char *file, int height, int width)
FALSE, width);
break;
case DLGK_ENTER:
- result = dlg_exit_buttoncode(button);
+ if (dialog_vars.nook)
+ result = DLG_EXIT_OK;
+ else
+ result = dlg_exit_buttoncode(button);
break;
case DLGK_PAGE_FIRST:
if (!obj.begin_reached) {
diff --git a/contrib/dialog/timebox.c b/contrib/dialog/timebox.c
index 63bffd8..5a6be3e 100644
--- a/contrib/dialog/timebox.c
+++ b/contrib/dialog/timebox.c
@@ -1,5 +1,5 @@
/*
- * $Id: timebox.c,v 1.43 2011/01/18 01:07:45 Garrett.Cooper Exp $
+ * $Id: timebox.c,v 1.45 2011/06/27 08:20:22 tom Exp $
*
* timebox.c -- implements the timebox dialog
*
@@ -148,6 +148,7 @@ dialog_timebox(const char *title,
/* *INDENT-OFF* */
static DLG_KEYS_BINDING binding[] = {
DLG_KEYS_DATA( DLGK_DELETE_RIGHT,KEY_DC ),
+ HELPKEY_BINDINGS,
ENTERKEY_BINDINGS,
DLG_KEYS_DATA( DLGK_ENTER, ' ' ),
DLG_KEYS_DATA( DLGK_FIELD_FIRST,KEY_HOME ),
@@ -223,6 +224,7 @@ dialog_timebox(const char *title,
dlg_draw_box(dialog, 0, 0, height, width, dialog_attr, border_attr);
dlg_draw_bottom_box(dialog);
dlg_draw_title(dialog, title);
+ dlg_draw_helpline(dialog, FALSE);
wattrset(dialog, dialog_attr);
dlg_print_autowrap(dialog, prompt, height, width);
diff --git a/contrib/dialog/trace.c b/contrib/dialog/trace.c
index b7ca87d..a742ae8 100644
--- a/contrib/dialog/trace.c
+++ b/contrib/dialog/trace.c
@@ -1,5 +1,5 @@
/*
- * $Id: trace.c,v 1.12 2011/01/13 01:36:34 tom Exp $
+ * $Id: trace.c,v 1.14 2011/06/21 21:12:56 tom Exp $
*
* trace.c -- implements screen-dump and keystroke-logging
*
@@ -119,6 +119,7 @@ dlg_trace_chr(int ch, int fkey)
CASE(DLGK_BEGIN);
CASE(DLGK_FINAL);
CASE(DLGK_SELECT);
+ CASE(DLGK_HELPFILE);
CASE(DLGK_TRACE);
}
}
@@ -144,6 +145,7 @@ dlg_trace(const char *fname)
myFP = fopen(fname, "a");
if (myFP != 0) {
dlg_trace_time("** opened at");
+ dlg_trace_msg("** dialog %s\n", dialog_version());
}
}
} else if (myFP != 0) {
diff --git a/contrib/dialog/ui_getc.c b/contrib/dialog/ui_getc.c
index 4298d8a..d9d5a93 100644
--- a/contrib/dialog/ui_getc.c
+++ b/contrib/dialog/ui_getc.c
@@ -1,5 +1,5 @@
/*
- * $Id: ui_getc.c,v 1.59 2011/02/28 10:56:15 tom Exp $
+ * $Id: ui_getc.c,v 1.63 2011/07/07 22:05:58 tom Exp $
*
* ui_getc.c - user interface glue for getc()
*
@@ -385,6 +385,9 @@ prev_callback(DIALOG_CALLBACK * p)
return p;
}
+#define isBeforeChr(chr) ((chr) == before_chr && !before_fkey)
+#define isBeforeFkey(chr) ((chr) == before_chr && before_fkey)
+
/*
* Read a character from the given window. Handle repainting here (to simplify
* things in the calling application). Also, if input-callback(s) are set up,
@@ -396,7 +399,8 @@ dlg_getc(WINDOW *win, int *fkey)
{
WINDOW *save_win = win;
int ch = ERR;
- int before_lookup;
+ int before_chr;
+ int before_fkey;
int result;
bool done = FALSE;
bool literal = FALSE;
@@ -411,6 +415,8 @@ dlg_getc(WINDOW *win, int *fkey)
wtimeout(win, interval);
while (!done) {
+ bool handle_others = FALSE;
+
/*
* If there was no pending file-input, check the keyboard.
*/
@@ -420,80 +426,108 @@ dlg_getc(WINDOW *win, int *fkey)
continue;
}
- before_lookup = ch;
+ before_chr = ch;
+ before_fkey = *fkey;
+
ch = dlg_lookup_key(win, ch, fkey);
dlg_trace_chr(ch, *fkey);
current = time((time_t *) 0);
- switch (ch) {
- case CHR_LITERAL:
- if (!literal) {
- literal = TRUE;
- keypad(win, FALSE);
- continue;
- }
- break;
- case CHR_REPAINT:
- (void) touchwin(win);
- (void) wrefresh(curscr);
- break;
- case ERR: /* wtimeout() in effect; check for file I/O */
- if (interval > 0
- && current >= expired) {
- dlg_exiterr("timeout");
- }
- if (!valid_file(stdin)
- || !valid_file(dialog_state.screen_output)) {
- ch = ESC;
- done = TRUE;
- } else if (check_inputs()) {
- if (handle_inputs(win))
- dlg_raise_window(win);
- else
+ /*
+ * If we acquired a fkey value, then it is one of dialog's builtin
+ * codes such as DLGK_HELPFILE.
+ */
+ if (!*fkey || *fkey != before_fkey) {
+ switch (ch) {
+ case CHR_LITERAL:
+ if (!literal) {
+ literal = TRUE;
+ keypad(win, FALSE);
+ continue;
+ }
+ break;
+ case CHR_REPAINT:
+ (void) touchwin(win);
+ (void) wrefresh(curscr);
+ break;
+ case ERR: /* wtimeout() in effect; check for file I/O */
+ if (interval > 0
+ && current >= expired) {
+ dlg_exiterr("timeout");
+ }
+ if (!valid_file(stdin)
+ || !valid_file(dialog_state.screen_output)) {
+ ch = ESC;
done = TRUE;
- } else {
- done = (interval <= 0);
- }
- break;
- case DLGK_FIELD_PREV:
- /* FALLTHRU */
- case KEY_BTAB:
- /* FALLTHRU */
- case DLGK_FIELD_NEXT:
- /* FALLTHRU */
- case TAB:
- /* Handle tab/backtab as a special case for traversing between the
- * nominal "current" window, and other windows having callbacks.
- * If the nominal (control) window closes, we'll close the windows
- * with callbacks.
- */
- if (dialog_state.getc_callbacks != 0 &&
- (before_lookup == TAB ||
- before_lookup == KEY_BTAB)) {
- if (before_lookup == TAB)
- p = next_callback(p);
- else
- p = prev_callback(p);
- if ((dialog_state.getc_redirect = p) != 0) {
- win = p->win;
+ } else if (check_inputs()) {
+ if (handle_inputs(win))
+ dlg_raise_window(win);
+ else
+ done = TRUE;
} else {
- win = save_win;
+ done = (interval <= 0);
}
- dlg_raise_window(win);
break;
- }
- /* FALLTHRU */
- default:
+ case DLGK_HELPFILE:
+ if (dialog_vars.help_file) {
+ int yold, xold;
+ getyx(win, yold, xold);
+ dialog_helpfile("HELP", dialog_vars.help_file, 0, 0);
+ dlg_raise_window(win);
+ wmove(win, yold, xold);
+ }
+ continue;
+ case DLGK_FIELD_PREV:
+ /* FALLTHRU */
+ case KEY_BTAB:
+ /* FALLTHRU */
+ case DLGK_FIELD_NEXT:
+ /* FALLTHRU */
+ case TAB:
+ /* Handle tab/backtab as a special case for traversing between
+ * the nominal "current" window, and other windows having
+ * callbacks. If the nominal (control) window closes, we'll
+ * close the windows with callbacks.
+ */
+ if (dialog_state.getc_callbacks != 0 &&
+ (isBeforeChr(TAB) ||
+ isBeforeFkey(KEY_BTAB))) {
+ p = (isBeforeChr(TAB)
+ ? next_callback(p)
+ : prev_callback(p));
+ if ((dialog_state.getc_redirect = p) != 0) {
+ win = p->win;
+ } else {
+ win = save_win;
+ }
+ dlg_raise_window(win);
+ break;
+ }
+ /* FALLTHRU */
+ default:
#ifdef NO_LEAKS
- if (before_lookup == DLG_CTRL('P')) {
- /* for testing, ^P closes the connection */
- close(0);
- close(1);
- close(2);
+ if (isBeforeChr(DLG_CTRL('P'))) {
+ /* for testing, ^P closes the connection */
+ close(0);
+ close(1);
+ close(2);
+ break;
+ }
+#endif
+ handle_others = TRUE;
+ break;
+#ifdef HAVE_DLG_TRACE
+ case CHR_TRACE:
+ dlg_trace_win(win);
break;
- }
#endif
+ }
+ } else {
+ handle_others = TRUE;
+ }
+
+ if (handle_others) {
if ((p = dialog_state.getc_redirect) != 0) {
if (!(p->handle_getc(p, ch, *fkey, &result))) {
dlg_remove_callback(p);
@@ -503,12 +537,6 @@ dlg_getc(WINDOW *win, int *fkey)
} else {
done = TRUE;
}
- break;
-#ifdef HAVE_DLG_TRACE
- case CHR_TRACE:
- dlg_trace_win(win);
- break;
-#endif
}
}
if (literal)
diff --git a/contrib/dialog/util.c b/contrib/dialog/util.c
index 8496330..82ef4fa 100644
--- a/contrib/dialog/util.c
+++ b/contrib/dialog/util.c
@@ -1,5 +1,5 @@
/*
- * $Id: util.c,v 1.211 2011/01/19 00:31:43 tom Exp $
+ * $Id: util.c,v 1.227 2011/07/07 23:42:30 tom Exp $
*
* util.c -- miscellaneous utilities for dialog
*
@@ -37,6 +37,20 @@
#endif
#endif
+#if defined(HAVE_WCHGAT)
+# if defined(NCURSES_VERSION_PATCH)
+# if NCURSES_VERSION_PATCH >= 20060715
+# define USE_WCHGAT 1
+# else
+# define USE_WCHGAT 0
+# endif
+# else
+# define USE_WCHGAT 1
+# endif
+#else
+# define USE_WCHGAT 0
+#endif
+
/* globals */
DIALOG_STATE dialog_state;
DIALOG_VARS dialog_vars;
@@ -61,6 +75,8 @@ DIALOG_VARS dialog_vars;
#define DATA(atr,upr,lwr,cmt) { atr COLOR_DATA(upr) RC_DATA(lwr,cmt) }
+#define UseShadow(dw) ((dw) != 0 && (dw)->normal != 0 && (dw)->shadow != 0)
+
/*
* Table of color and attribute values, default is for mono display.
*/
@@ -411,7 +427,7 @@ dlg_get_attrs(WINDOW *win)
{
chtype result;
#ifdef HAVE_GETATTRS
- result = getattrs(win);
+ result = (chtype) getattrs(win);
#else
attr_t my_result;
short my_pair;
@@ -487,6 +503,7 @@ end_dialog(void)
}
}
+#define ESCAPE_LEN 3
#define isOurEscape(p) (((p)[0] == '\\') && ((p)[1] == 'Z') && ((p)[2] != 0))
static int
@@ -500,7 +517,7 @@ centered(int width, const char *string)
if (dialog_vars.colors) {
for (n = 0; n < len; ++n) {
if (isOurEscape(string + n)) {
- hide += 3;
+ hide += ESCAPE_LEN;
}
}
}
@@ -661,6 +678,7 @@ dlg_print_line(WINDOW *win,
{
const char *wrap_ptr = prompt;
const char *test_ptr = prompt;
+ const char *hide_ptr = 0;
const int *cols = dlg_index_columns(prompt);
const int *indx = dlg_index_wchars(prompt);
int wrap_inx = 0;
@@ -687,8 +705,9 @@ dlg_print_line(WINDOW *win,
wrap_inx = n;
*x = cur_x;
} else if (isOurEscape(test_ptr)) {
- hidden += 3;
- n += 2;
+ hide_ptr = test_ptr;
+ hidden += ESCAPE_LEN;
+ n += (ESCAPE_LEN - 1);
}
cur_x = lm + tabbed + cols[n + 1];
if (cur_x > (rm + hidden))
@@ -725,6 +744,23 @@ dlg_print_line(WINDOW *win,
#endif
/*
+ * If we found hidden text past the last point that we will display,
+ * discount that from the displayed length.
+ */
+ if ((hide_ptr != 0) && (hide_ptr >= wrap_ptr)) {
+ hidden -= ESCAPE_LEN;
+ test_ptr = wrap_ptr;
+ while (test_ptr < wrap_ptr) {
+ if (isOurEscape(test_ptr)) {
+ hidden -= ESCAPE_LEN;
+ test_ptr += ESCAPE_LEN;
+ } else {
+ ++test_ptr;
+ }
+ }
+ }
+
+ /*
* Print the line if we have a window pointer. Otherwise this routine
* is just being called for sizing the window.
*/
@@ -736,6 +772,8 @@ dlg_print_line(WINDOW *win,
if (*x == 1)
*x = rm;
+ *x -= hidden;
+
/* Find the start of the next line and return a pointer to it */
test_ptr = wrap_ptr;
while (*test_ptr == ' ')
@@ -863,43 +901,49 @@ dlg_print_scrolled(WINDOW *win,
high = len;
#endif
dummy = newwin(high, width, 0, 0);
- wbkgdset(dummy, dialog_attr | ' ');
- wattrset(dummy, dialog_attr);
- werase(dummy);
- dlg_print_autowrap(dummy, prompt, high, width);
- getyx(dummy, y, x);
-
- copywin(dummy, /* srcwin */
- win, /* dstwin */
- offset + MARGIN, /* sminrow */
- MARGIN, /* smincol */
- MARGIN, /* dminrow */
- MARGIN, /* dmincol */
- height, /* dmaxrow */
- wide, /* dmaxcol */
- FALSE);
-
- delwin(dummy);
-
- /* if the text is incomplete, or we have scrolled, show the percentage */
- if (y > 0 && wide > 4) {
- percent = (int) ((height + offset) * 100.0 / y);
- if (percent < 0)
- percent = 0;
- if (percent > 100)
- percent = 100;
- if (offset != 0 || percent != 100) {
- (void) wattrset(win, position_indicator_attr);
- (void) wmove(win, MARGIN + height, wide - 4);
- (void) sprintf(buffer, "%d%%", percent);
- (void) waddstr(win, buffer);
- if ((len = (int) strlen(buffer)) < 4) {
- wattrset(win, border_attr);
- whline(win, dlg_boxchar(ACS_HLINE), 4 - len);
+ if (dummy == 0) {
+ wattrset(win, dialog_attr);
+ dlg_print_autowrap(win, prompt, height + 1 + (3 * MARGIN), width);
+ last = 0;
+ } else {
+ wbkgdset(dummy, dialog_attr | ' ');
+ wattrset(dummy, dialog_attr);
+ werase(dummy);
+ dlg_print_autowrap(dummy, prompt, high, width);
+ getyx(dummy, y, x);
+
+ copywin(dummy, /* srcwin */
+ win, /* dstwin */
+ offset + MARGIN, /* sminrow */
+ MARGIN, /* smincol */
+ MARGIN, /* dminrow */
+ MARGIN, /* dmincol */
+ height, /* dmaxrow */
+ wide, /* dmaxcol */
+ FALSE);
+
+ delwin(dummy);
+
+ /* if the text is incomplete, or we have scrolled, show the percentage */
+ if (y > 0 && wide > 4) {
+ percent = (int) ((height + offset) * 100.0 / y);
+ if (percent < 0)
+ percent = 0;
+ if (percent > 100)
+ percent = 100;
+ if (offset != 0 || percent != 100) {
+ (void) wattrset(win, position_indicator_attr);
+ (void) wmove(win, MARGIN + height, wide - 4);
+ (void) sprintf(buffer, "%d%%", percent);
+ (void) waddstr(win, buffer);
+ if ((len = (int) strlen(buffer)) < 4) {
+ wattrset(win, border_attr);
+ whline(win, dlg_boxchar(ACS_HLINE), 4 - len);
+ }
}
}
+ last = (y - height);
}
- last = (y - height);
} else
#endif
{
@@ -1037,6 +1081,25 @@ longest_word(const char *string)
return result;
}
+static int
+count_real_columns(const char *text)
+{
+ int result = dlg_count_columns(text);
+ if (result && dialog_vars.colors) {
+ int hidden = 0;
+ while (*text) {
+ if (isOurEscape(text)) {
+ hidden += ESCAPE_LEN;
+ text += ESCAPE_LEN;
+ } else {
+ ++text;
+ }
+ }
+ result -= hidden;
+ }
+ return result;
+}
+
/*
* if (height or width == -1) Maximize()
* if (height or width == 0), justify and return actual limits.
@@ -1074,7 +1137,7 @@ real_auto_size(const char *title,
} else if (prompt != 0) {
wide = MAX(title_length, mincols);
if (strchr(prompt, '\n') == 0) {
- double val = dialog_state.aspect_ratio * dlg_count_columns(prompt);
+ double val = dialog_state.aspect_ratio * count_real_columns(prompt);
double xxx = sqrt(val);
int tmp = (int) xxx;
wide = MAX(wide, tmp);
@@ -1190,6 +1253,27 @@ dlg_auto_sizefile(const char *title,
(void) fclose(fd);
}
+static chtype
+dlg_get_cell_attrs(WINDOW *win)
+{
+ chtype result;
+#ifdef USE_WIDE_CURSES
+ cchar_t wch;
+ wchar_t cc;
+ attr_t attrs;
+ short pair;
+ if (win_wch(win, &wch) == OK
+ && getcchar(&wch, &cc, &attrs, &pair, NULL) == OK) {
+ result = attrs;
+ } else {
+ result = 0;
+ }
+#else
+ result = winch(win) & (A_ATTRIBUTES & ~A_COLOR);
+#endif
+ return result;
+}
+
/*
* Draw a rectangular box with line drawing characters.
*
@@ -1239,54 +1323,221 @@ dlg_draw_box(WINDOW *win, int y, int x, int height, int width,
wattrset(win, save);
}
+static DIALOG_WINDOWS *
+find_window(WINDOW *win)
+{
+ DIALOG_WINDOWS *result = 0;
+ DIALOG_WINDOWS *p;
+
+ for (p = dialog_state.all_windows; p != 0; p = p->next) {
+ if (p->normal == win) {
+ result = p;
+ break;
+ }
+ }
+ return result;
+}
+
#ifdef HAVE_COLOR
/*
- * Draw a shadow on the parent window corresponding to the right- and
- * bottom-edge of the child window, to give a 3-dimensional look.
+ * If we have wchgat(), use that for updating shadow attributes, to work with
+ * wide-character data.
*/
-static void
-draw_childs_shadow(WINDOW *parent, WINDOW *child)
+
+/*
+ * Check if the given point is "in" the given window. If so, return the window
+ * pointer, otherwise null.
+ */
+static WINDOW *
+in_window(WINDOW *win, int y, int x)
{
- if (has_colors()) { /* Whether terminal supports color? */
- chtype save = dlg_get_attrs(parent);
+ WINDOW *result = 0;
+ int y_base = getbegy(win);
+ int x_base = getbegx(win);
+ int y_last = getmaxy(win) + y_base;
+ int x_last = getmaxx(win) + x_base;
+
+ if (y >= y_base && y <= y_last && x >= x_base && x <= x_last)
+ result = win;
+ return result;
+}
+
+static WINDOW *
+window_at_cell(DIALOG_WINDOWS * dw, int y, int x)
+{
+ WINDOW *result = 0;
+ DIALOG_WINDOWS *p;
+ int y_want = y + getbegy(dw->shadow);
+ int x_want = x + getbegx(dw->shadow);
+
+ for (p = dialog_state.all_windows; p != 0; p = p->next) {
+ if (dw->normal != p->normal
+ && dw->shadow != p->normal
+ && (result = in_window(p->normal, y_want, x_want)) != 0) {
+ break;
+ }
+ }
+ if (result == 0) {
+ result = stdscr;
+ }
+ return result;
+}
- dlg_draw_shadow(parent,
- getbegy(child) - getbegy(parent),
- getbegx(child) - getbegx(parent),
- getmaxy(child),
- getmaxx(child));
- wattrset(parent, save);
+static bool
+in_shadow(WINDOW *normal, WINDOW *shadow, int y, int x)
+{
+ bool result = FALSE;
+ int ybase = getbegy(normal);
+ int ylast = getmaxy(normal) + ybase;
+ int xbase = getbegx(normal);
+ int xlast = getmaxx(normal) + xbase;
+
+ y += getbegy(shadow);
+ x += getbegx(shadow);
+
+ if (y >= ybase + SHADOW_ROWS
+ && y < ylast + SHADOW_ROWS
+ && x >= xlast
+ && x < xlast + SHADOW_COLS) {
+ /* in the right-side */
+ result = TRUE;
+ } else if (y >= ylast
+ && y < ylast + SHADOW_ROWS
+ && x >= ybase + SHADOW_COLS
+ && x < ylast + SHADOW_COLS) {
+ /* check the bottom */
+ result = TRUE;
}
+
+ return result;
}
/*
- * Draw shadows along the right and bottom edge to give a more 3D look
- * to the boxes
+ * When erasing a shadow, check each cell to make sure that it is not part of
+ * another box's shadow. This is a little complicated since most shadows are
+ * merged onto stdscr.
*/
-void
-dlg_draw_shadow(WINDOW *win, int y, int x, int height, int width)
+static bool
+last_shadow(DIALOG_WINDOWS * dw, int y, int x)
+{
+ DIALOG_WINDOWS *p;
+ bool result = TRUE;
+
+ for (p = dialog_state.all_windows; p != 0; p = p->next) {
+ if (p->normal != dw->normal
+ && in_shadow(p->normal, dw->shadow, y, x)) {
+ result = FALSE;
+ break;
+ }
+ }
+ return result;
+}
+
+static void
+repaint_cell(DIALOG_WINDOWS * dw, bool draw, int y, int x)
+{
+ WINDOW *win = dw->shadow;
+ WINDOW *cellwin;
+ int y2, x2;
+
+ if ((cellwin = window_at_cell(dw, y, x)) != 0
+ && (draw || last_shadow(dw, y, x))
+ && (y2 = (y + getbegy(win) - getbegy(cellwin))) >= 0
+ && (x2 = (x + getbegx(win) - getbegx(cellwin))) >= 0
+ && wmove(cellwin, y2, x2) != ERR) {
+ chtype the_cell = dlg_get_attrs(cellwin);
+ chtype the_attr = (draw ? shadow_attr : the_cell);
+
+ if (dlg_get_cell_attrs(cellwin) & A_ALTCHARSET) {
+ the_attr |= A_ALTCHARSET;
+ }
+#if USE_WCHGAT
+ wchgat(cellwin, 1,
+ the_attr & (chtype) (~A_COLOR),
+ PAIR_NUMBER(the_attr),
+ NULL);
+#else
+ {
+ chtype the_char = ((winch(cellwin) & A_CHARTEXT) | the_attr);
+ (void) waddch(cellwin, the_char);
+ }
+#endif
+ wnoutrefresh(cellwin);
+ }
+}
+
+#define RepaintCell(dw, draw, y, x) repaint_cell(dw, draw, y, x)
+
+static void
+repaint_shadow(DIALOG_WINDOWS * dw, bool draw, int y, int x, int height, int width)
{
int i, j;
- if (has_colors()) { /* Whether terminal supports color? */
- wattrset(win, shadow_attr);
+ if (UseShadow(dw)) {
+#if !USE_WCHGAT
+ chtype save = dlg_get_attrs(dw->shadow);
+ wattrset(dw->shadow, draw ? shadow_attr : screen_attr);
+#endif
for (i = 0; i < SHADOW_ROWS; ++i) {
for (j = 0; j < width; ++j) {
- if (wmove(win, i + y + height, j + x + SHADOW_COLS) != ERR) {
- (void) waddch(win, winch(win) & (chtype) (~A_COLOR));
- }
+ RepaintCell(dw, draw, i + y + height, j + x + SHADOW_COLS);
}
}
for (i = 0; i < height; i++) {
for (j = 0; j < SHADOW_COLS; ++j) {
- if (wmove(win, i + y + SHADOW_ROWS, j + x + width) != ERR) {
- (void) waddch(win, winch(win) & (chtype) (~A_COLOR));
- }
+ RepaintCell(dw, draw, i + y + SHADOW_ROWS, j + x + width);
}
}
- (void) wnoutrefresh(win);
+ (void) wnoutrefresh(dw->shadow);
+#if !USE_WCHGAT
+ wattrset(dw->shadow, save);
+#endif
+ }
+}
+
+/*
+ * Draw a shadow on the parent window corresponding to the right- and
+ * bottom-edge of the child window, to give a 3-dimensional look.
+ */
+static void
+draw_childs_shadow(DIALOG_WINDOWS * dw)
+{
+ if (UseShadow(dw)) {
+ repaint_shadow(dw,
+ TRUE,
+ getbegy(dw->normal) - getbegy(dw->shadow),
+ getbegx(dw->normal) - getbegx(dw->shadow),
+ getmaxy(dw->normal),
+ getmaxx(dw->normal));
}
}
+
+/*
+ * Erase a shadow on the parent window corresponding to the right- and
+ * bottom-edge of the child window.
+ */
+static void
+erase_childs_shadow(DIALOG_WINDOWS * dw)
+{
+ if (UseShadow(dw)) {
+ repaint_shadow(dw,
+ FALSE,
+ getbegy(dw->normal) - getbegy(dw->shadow),
+ getbegx(dw->normal) - getbegx(dw->shadow),
+ getmaxy(dw->normal),
+ getmaxx(dw->normal));
+ }
+}
+
+/*
+ * Draw shadows along the right and bottom edge to give a more 3D look
+ * to the boxes.
+ */
+void
+dlg_draw_shadow(WINDOW *win, int y, int x, int height, int width)
+{
+ repaint_shadow(find_window(win), TRUE, y, x, height, width);
+}
#endif /* HAVE_COLOR */
/*
@@ -1340,6 +1591,10 @@ dlg_exit(int code)
code = DLG_EXIT_HELP;
goto retry;
}
+#ifdef HAVE_DLG_TRACE
+ dlg_trace((const char *) 0); /* close it */
+#endif
+
#ifdef NO_LEAKS
_dlg_inputstr_leaks();
#if defined(NCURSES_VERSION) && defined(HAVE__NC_FREE_AND_EXIT)
@@ -1650,6 +1905,8 @@ dlg_del_window(WINDOW *win)
}
if (q) {
+ if (dialog_state.all_windows != 0)
+ erase_childs_shadow(q);
delwin(q->normal);
dlg_unregister_window(q->normal);
free(q);
@@ -1663,26 +1920,13 @@ dlg_del_window(WINDOW *win)
WINDOW *
dlg_new_window(int height, int width, int y, int x)
{
- WINDOW *win;
- DIALOG_WINDOWS *p = dlg_calloc(DIALOG_WINDOWS, 1);
-
- if ((win = newwin(height, width, y, x)) == 0) {
- dlg_exiterr("Can't make new window at (%d,%d), size (%d,%d).\n",
- y, x, height, width);
- }
- p->next = dialog_state.all_windows;
- p->normal = win;
- dialog_state.all_windows = p;
-#ifdef HAVE_COLOR
- if (dialog_state.use_shadow) {
- draw_childs_shadow(p->shadow = stdscr, win);
- }
-#endif
-
- (void) keypad(win, TRUE);
- return win;
+ return dlg_new_modal_window(stdscr, height, width, y, x);
}
+/*
+ * "Modal" windows differ from normal ones by having a shadow in a window
+ * separate from the standard screen.
+ */
WINDOW *
dlg_new_modal_window(WINDOW *parent, int height, int width, int y, int x)
{
@@ -1699,7 +1943,8 @@ dlg_new_modal_window(WINDOW *parent, int height, int width, int y, int x)
dialog_state.all_windows = p;
#ifdef HAVE_COLOR
if (dialog_state.use_shadow) {
- draw_childs_shadow(p->shadow = parent, win);
+ p->shadow = parent;
+ draw_childs_shadow(p);
}
#endif
@@ -1714,19 +1959,12 @@ dlg_new_modal_window(WINDOW *parent, int height, int width, int y, int x)
void
dlg_move_window(WINDOW *win, int height, int width, int y, int x)
{
- DIALOG_WINDOWS *p, *q;
+ DIALOG_WINDOWS *p;
if (win != 0) {
dlg_ctl_size(height, width);
- for (p = dialog_state.all_windows; p != 0; p = q) {
- q = p->next;
- if (p->normal == win) {
- break;
- }
- }
-
- if (p != 0) {
+ if ((p = find_window(win)) != 0) {
(void) wresize(win, height, width);
(void) mvwin(win, y, x);
#ifdef HAVE_COLOR
@@ -1741,8 +1979,7 @@ dlg_move_window(WINDOW *win, int height, int width, int y, int x)
(void) refresh();
#ifdef HAVE_COLOR
- if (p->shadow)
- draw_childs_shadow(p->shadow, win);
+ draw_childs_shadow(p);
#endif
}
}
@@ -1883,7 +2120,7 @@ dlg_trim_string(char *s)
char *base = s;
char *p1;
char *p = s;
- int has_newlines = (strstr(s, "\\n") != 0);
+ int has_newlines = !dialog_vars.no_nl_expand && (strstr(s, "\\n") != 0);
while (*p != '\0') {
if (*p == TAB && !dialog_vars.nocollapse)
diff --git a/contrib/dialog/yesno.c b/contrib/dialog/yesno.c
index c666154..4efb073 100644
--- a/contrib/dialog/yesno.c
+++ b/contrib/dialog/yesno.c
@@ -1,9 +1,9 @@
/*
- * $Id: yesno.c,v 1.49 2010/01/15 10:54:54 tom Exp $
+ * $Id: yesno.c,v 1.51 2011/06/27 08:20:57 tom Exp $
*
* yesno.c -- implements the yes/no box
*
- * Copyright 1999-2009,2010 Thomas E. Dickey
+ * Copyright 1999-2010,2011 Thomas E. Dickey
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License, version 2.1
@@ -35,6 +35,7 @@ dialog_yesno(const char *title, const char *cprompt, int height, int width)
{
/* *INDENT-OFF* */
static DLG_KEYS_BINDING binding[] = {
+ HELPKEY_BINDINGS,
ENTERKEY_BINDINGS,
DLG_KEYS_DATA( DLGK_ENTER, ' ' ),
DLG_KEYS_DATA( DLGK_FIELD_NEXT, KEY_DOWN ),
@@ -89,6 +90,7 @@ dialog_yesno(const char *title, const char *cprompt, int height, int width)
dlg_draw_box(dialog, 0, 0, height, width, dialog_attr, border_attr);
dlg_draw_bottom_box(dialog);
dlg_draw_title(dialog, title);
+ dlg_draw_helpline(dialog, FALSE);
wattrset(dialog, dialog_attr);
diff --git a/contrib/gcc/c-decl.c b/contrib/gcc/c-decl.c
index 64a6fa8..fbafc0d 100644
--- a/contrib/gcc/c-decl.c
+++ b/contrib/gcc/c-decl.c
@@ -4340,6 +4340,8 @@ grokdeclarator (const struct c_declarator *declarator,
pedwarn ("ISO C90 forbids variable-size array %qs",
name);
}
+ if (warn_variable_decl)
+ warning (0, "variable-sized array %qs", name);
}
if (integer_zerop (size))
diff --git a/contrib/gcc/c.opt b/contrib/gcc/c.opt
index 8769657..038fc51 100644
--- a/contrib/gcc/c.opt
+++ b/contrib/gcc/c.opt
@@ -404,6 +404,10 @@ Wtraditional
C ObjC Var(warn_traditional)
Warn about features not present in traditional C
+Wtrampolines
+Common Var(warn_trampolines)
+Warn when trampolines are emitted
+
Wtrigraphs
C ObjC C++ ObjC++
Warn if trigraphs are encountered that might affect the meaning of the program
diff --git a/contrib/gcc/common.opt b/contrib/gcc/common.opt
index 367e540..2270d0d 100644
--- a/contrib/gcc/common.opt
+++ b/contrib/gcc/common.opt
@@ -189,6 +189,10 @@ Wunused-variable
Common Var(warn_unused_variable)
Warn when a variable is unused
+Wvariable-decl
+Common Var(warn_variable_decl)
+Warn about variable-sized declarations.
+
Wvolatile-register-var
Common Var(warn_register_var)
Warn when a register variable is declared volatile
diff --git a/contrib/gcc/tree-nested.c b/contrib/gcc/tree-nested.c
index 06fbbc9..9efcd98 100644
--- a/contrib/gcc/tree-nested.c
+++ b/contrib/gcc/tree-nested.c
@@ -750,7 +750,7 @@ check_for_nested_with_variably_modified (tree fndecl, tree orig_fndecl)
for (cgn = cgn->nested; cgn ; cgn = cgn->next_nested)
{
for (arg = DECL_ARGUMENTS (cgn->decl); arg; arg = TREE_CHAIN (arg))
- if (variably_modified_type_p (TREE_TYPE (arg), 0), orig_fndecl)
+ if (variably_modified_type_p (TREE_TYPE (arg), orig_fndecl))
return true;
if (check_for_nested_with_variably_modified (cgn->decl, orig_fndecl))
@@ -1621,6 +1621,10 @@ convert_tramp_reference (tree *tp, int *walk_subtrees, void *data)
it doesn't need a trampoline. */
if (DECL_NO_STATIC_CHAIN (decl))
break;
+ if (warn_trampolines)
+ {
+ warning(0, "local function address taken needing trampoline generation");
+ }
/* Lookup the immediate parent of the callee, as that's where
we need to insert the trampoline. */
diff --git a/contrib/llvm/include/llvm-c/Core.h b/contrib/llvm/include/llvm-c/Core.h
index 2eccc11..a4456dd 100644
--- a/contrib/llvm/include/llvm-c/Core.h
+++ b/contrib/llvm/include/llvm-c/Core.h
@@ -68,13 +68,6 @@ typedef struct LLVMOpaqueModule *LLVMModuleRef;
*/
typedef struct LLVMOpaqueType *LLVMTypeRef;
-/**
- * When building recursive types using LLVMRefineType, LLVMTypeRef values may
- * become invalid; use LLVMTypeHandleRef to resolve this problem. See the
- * llvm::AbstractTypeHolder class.
- */
-typedef struct LLVMOpaqueTypeHandle *LLVMTypeHandleRef;
-
typedef struct LLVMOpaqueValue *LLVMValueRef;
typedef struct LLVMOpaqueBasicBlock *LLVMBasicBlockRef;
typedef struct LLVMOpaqueBuilder *LLVMBuilderRef;
@@ -206,7 +199,6 @@ typedef enum {
LLVMStructTypeKind, /**< Structures */
LLVMArrayTypeKind, /**< Arrays */
LLVMPointerTypeKind, /**< Pointers */
- LLVMOpaqueTypeKind, /**< Opaque: type with unknown structure */
LLVMVectorTypeKind, /**< SIMD 'packed' format, or other vector type */
LLVMMetadataTypeKind, /**< Metadata */
LLVMX86_MMXTypeKind /**< X86 MMX */
@@ -320,12 +312,6 @@ void LLVMSetDataLayout(LLVMModuleRef M, const char *Triple);
const char *LLVMGetTarget(LLVMModuleRef M);
void LLVMSetTarget(LLVMModuleRef M, const char *Triple);
-/** See Module::addTypeName. */
-LLVMBool LLVMAddTypeName(LLVMModuleRef M, const char *Name, LLVMTypeRef Ty);
-void LLVMDeleteTypeName(LLVMModuleRef M, const char *Name);
-LLVMTypeRef LLVMGetTypeByName(LLVMModuleRef M, const char *Name);
-const char *LLVMGetTypeName(LLVMModuleRef M, LLVMTypeRef Ty);
-
/** See Module::dump. */
void LLVMDumpModule(LLVMModuleRef M);
@@ -401,9 +387,16 @@ LLVMTypeRef LLVMStructTypeInContext(LLVMContextRef C, LLVMTypeRef *ElementTypes,
unsigned ElementCount, LLVMBool Packed);
LLVMTypeRef LLVMStructType(LLVMTypeRef *ElementTypes, unsigned ElementCount,
LLVMBool Packed);
+LLVMTypeRef LLVMStructCreateNamed(LLVMContextRef C, const char *Name);
+void LLVMStructSetBody(LLVMTypeRef StructTy, LLVMTypeRef *ElementTypes,
+ unsigned ElementCount, LLVMBool Packed);
+
unsigned LLVMCountStructElementTypes(LLVMTypeRef StructTy);
void LLVMGetStructElementTypes(LLVMTypeRef StructTy, LLVMTypeRef *Dest);
LLVMBool LLVMIsPackedStruct(LLVMTypeRef StructTy);
+LLVMBool LLVMIsOpaqueStruct(LLVMTypeRef StructTy);
+
+LLVMTypeRef LLVMGetTypeByName(LLVMModuleRef M, const char *Name);
/* Operations on array, pointer, and vector types (sequence types) */
LLVMTypeRef LLVMArrayType(LLVMTypeRef ElementType, unsigned ElementCount);
@@ -418,21 +411,12 @@ unsigned LLVMGetVectorSize(LLVMTypeRef VectorTy);
/* Operations on other types */
LLVMTypeRef LLVMVoidTypeInContext(LLVMContextRef C);
LLVMTypeRef LLVMLabelTypeInContext(LLVMContextRef C);
-LLVMTypeRef LLVMOpaqueTypeInContext(LLVMContextRef C);
LLVMTypeRef LLVMX86MMXTypeInContext(LLVMContextRef C);
LLVMTypeRef LLVMVoidType(void);
LLVMTypeRef LLVMLabelType(void);
-LLVMTypeRef LLVMOpaqueType(void);
LLVMTypeRef LLVMX86MMXType(void);
-/* Operations on type handles */
-LLVMTypeHandleRef LLVMCreateTypeHandle(LLVMTypeRef PotentiallyAbstractTy);
-void LLVMRefineType(LLVMTypeRef AbstractTy, LLVMTypeRef ConcreteTy);
-LLVMTypeRef LLVMResolveTypeHandle(LLVMTypeHandleRef TypeHandle);
-void LLVMDisposeTypeHandle(LLVMTypeHandleRef TypeHandle);
-
-
/*===-- Values ------------------------------------------------------------===*/
/* The bulk of LLVM's object model consists of values, which comprise a very
@@ -581,6 +565,9 @@ LLVMValueRef LLVMConstArray(LLVMTypeRef ElementTy,
LLVMValueRef *ConstantVals, unsigned Length);
LLVMValueRef LLVMConstStruct(LLVMValueRef *ConstantVals, unsigned Count,
LLVMBool Packed);
+LLVMValueRef LLVMConstNamedStruct(LLVMTypeRef StructTy,
+ LLVMValueRef *ConstantVals,
+ unsigned Count);
LLVMValueRef LLVMConstVector(LLVMValueRef *ScalarConstantVals, unsigned Size);
/* Constant expressions */
@@ -1117,7 +1104,6 @@ namespace llvm {
DEFINE_SIMPLE_CONVERSION_FUNCTIONS(Module, LLVMModuleRef )
DEFINE_SIMPLE_CONVERSION_FUNCTIONS(BasicBlock, LLVMBasicBlockRef )
DEFINE_SIMPLE_CONVERSION_FUNCTIONS(IRBuilder<>, LLVMBuilderRef )
- DEFINE_SIMPLE_CONVERSION_FUNCTIONS(PATypeHolder, LLVMTypeHandleRef )
DEFINE_SIMPLE_CONVERSION_FUNCTIONS(MemoryBuffer, LLVMMemoryBufferRef )
DEFINE_SIMPLE_CONVERSION_FUNCTIONS(LLVMContext, LLVMContextRef )
DEFINE_SIMPLE_CONVERSION_FUNCTIONS(Use, LLVMUseRef )
diff --git a/contrib/llvm/include/llvm-c/Target.h b/contrib/llvm/include/llvm-c/Target.h
index 2cd15c3..d216440 100644
--- a/contrib/llvm/include/llvm-c/Target.h
+++ b/contrib/llvm/include/llvm-c/Target.h
@@ -41,6 +41,11 @@ typedef struct LLVMStructLayout *LLVMStructLayoutRef;
#include "llvm/Config/Targets.def"
#undef LLVM_TARGET /* Explicit undef to make SWIG happier */
+#define LLVM_TARGET(TargetName) \
+ void LLVMInitialize##TargetName##MCAsmInfo(void);
+#include "llvm/Config/Targets.def"
+#undef LLVM_TARGET /* Explicit undef to make SWIG happier */
+
/** LLVMInitializeAllTargetInfos - The main program should call this function if
it wants access to all available targets that LLVM is configured to
support. */
@@ -67,6 +72,7 @@ static inline LLVMBool LLVMInitializeNativeTarget(void) {
#ifdef LLVM_NATIVE_TARGET
LLVM_NATIVE_TARGETINFO();
LLVM_NATIVE_TARGET();
+ LLVM_NATIVE_MCASMINFO();
return 0;
#else
return 1;
@@ -141,12 +147,6 @@ unsigned LLVMElementAtOffset(LLVMTargetDataRef, LLVMTypeRef StructTy,
unsigned long long LLVMOffsetOfElement(LLVMTargetDataRef, LLVMTypeRef StructTy,
unsigned Element);
-/** Struct layouts are speculatively cached. If a TargetDataRef is alive when
- types are being refined and removed, this method must be called whenever a
- struct type is removed to avoid a dangling pointer in this cache.
- See the method llvm::TargetData::InvalidateStructLayoutInfo. */
-void LLVMInvalidateStructLayout(LLVMTargetDataRef, LLVMTypeRef StructTy);
-
/** Deallocates a TargetData.
See the destructor llvm::TargetData::~TargetData. */
void LLVMDisposeTargetData(LLVMTargetDataRef);
diff --git a/contrib/llvm/include/llvm-c/Transforms/IPO.h b/contrib/llvm/include/llvm-c/Transforms/IPO.h
index d16e858..89b1298 100644
--- a/contrib/llvm/include/llvm-c/Transforms/IPO.h
+++ b/contrib/llvm/include/llvm-c/Transforms/IPO.h
@@ -30,9 +30,6 @@ void LLVMAddConstantMergePass(LLVMPassManagerRef PM);
/** See llvm::createDeadArgEliminationPass function. */
void LLVMAddDeadArgEliminationPass(LLVMPassManagerRef PM);
-/** See llvm::createDeadTypeEliminationPass function. */
-void LLVMAddDeadTypeEliminationPass(LLVMPassManagerRef PM);
-
/** See llvm::createFunctionAttrsPass function. */
void LLVMAddFunctionAttrsPass(LLVMPassManagerRef PM);
diff --git a/contrib/llvm/include/llvm/ADT/APFloat.h b/contrib/llvm/include/llvm/ADT/APFloat.h
index 21b8c86..d2566a4 100644
--- a/contrib/llvm/include/llvm/ADT/APFloat.h
+++ b/contrib/llvm/include/llvm/ADT/APFloat.h
@@ -109,6 +109,7 @@ namespace llvm {
typedef signed short exponent_t;
struct fltSemantics;
+ class APSInt;
class StringRef;
/* When bits of a floating point number are truncated, this enum is
@@ -283,6 +284,7 @@ namespace llvm {
opStatus convert(const fltSemantics &, roundingMode, bool *);
opStatus convertToInteger(integerPart *, unsigned int, bool,
roundingMode, bool *) const;
+ opStatus convertToInteger(APSInt&, roundingMode, bool *) const;
opStatus convertFromAPInt(const APInt &,
bool, roundingMode);
opStatus convertFromSignExtendedInteger(const integerPart *, unsigned int,
diff --git a/contrib/llvm/include/llvm/ADT/APInt.h b/contrib/llvm/include/llvm/ADT/APInt.h
index 2feef07..e68e579 100644
--- a/contrib/llvm/include/llvm/ADT/APInt.h
+++ b/contrib/llvm/include/llvm/ADT/APInt.h
@@ -1241,18 +1241,19 @@ public:
/// toString - Converts an APInt to a string and append it to Str. Str is
/// commonly a SmallString.
- void toString(SmallVectorImpl<char> &Str, unsigned Radix, bool Signed) const;
+ void toString(SmallVectorImpl<char> &Str, unsigned Radix, bool Signed,
+ bool formatAsCLiteral = false) const;
/// Considers the APInt to be unsigned and converts it into a string in the
/// radix given. The radix can be 2, 8, 10 or 16.
void toStringUnsigned(SmallVectorImpl<char> &Str, unsigned Radix = 10) const {
- toString(Str, Radix, false);
+ toString(Str, Radix, false, false);
}
/// Considers the APInt to be signed and converts it into a string in the
/// radix given. The radix can be 2, 8, 10 or 16.
void toStringSigned(SmallVectorImpl<char> &Str, unsigned Radix = 10) const {
- toString(Str, Radix, true);
+ toString(Str, Radix, true, false);
}
/// toString - This returns the APInt as a std::string. Note that this is an
diff --git a/contrib/llvm/include/llvm/ADT/ArrayRef.h b/contrib/llvm/include/llvm/ADT/ArrayRef.h
index 97e42cb..6db866e 100644
--- a/contrib/llvm/include/llvm/ADT/ArrayRef.h
+++ b/contrib/llvm/include/llvm/ADT/ArrayRef.h
@@ -39,7 +39,7 @@ namespace llvm {
const T *Data;
/// The number of elements.
- size_t Length;
+ size_type Length;
public:
/// @name Constructors
@@ -56,6 +56,10 @@ namespace llvm {
/*implicit*/ ArrayRef(const T *data, size_t length)
: Data(data), Length(length) {}
+ /// Construct an ArrayRef from a range.
+ ArrayRef(const T *begin, const T *end)
+ : Data(begin), Length(end - begin) {}
+
/// Construct an ArrayRef from a SmallVector.
/*implicit*/ ArrayRef(const SmallVectorImpl<T> &Vec)
: Data(Vec.data()), Length(Vec.size()) {}
@@ -96,6 +100,16 @@ namespace llvm {
return Data[Length-1];
}
+ /// equals - Check for element-wise equality.
+ bool equals(ArrayRef RHS) const {
+ if (Length != RHS.Length)
+ return false;
+ for (size_type i = 0; i != Length; i++)
+ if (Data[i] != RHS.Data[i])
+ return false;
+ return true;
+ }
+
/// slice(n) - Chop off the first N elements of the array.
ArrayRef<T> slice(unsigned N) {
assert(N <= size() && "Invalid specifier");
@@ -125,8 +139,30 @@ namespace llvm {
}
/// @}
+ /// @name Conversion operators
+ /// @{
+ operator std::vector<T>() const {
+ return std::vector<T>(Data, Data+Length);
+ }
+
+ /// @}
};
+ /// @name ArrayRef Comparison Operators
+ /// @{
+
+ template<typename T>
+ inline bool operator==(ArrayRef<T> LHS, ArrayRef<T> RHS) {
+ return LHS.equals(RHS);
+ }
+
+ template<typename T>
+ inline bool operator!=(ArrayRef<T> LHS, ArrayRef<T> RHS) {
+ return !(LHS == RHS);
+ }
+
+ /// @}
+
// ArrayRefs can be treated like a POD type.
template <typename T> struct isPodLike;
template <typename T> struct isPodLike<ArrayRef<T> > {
diff --git a/contrib/llvm/include/llvm/ADT/ImmutableList.h b/contrib/llvm/include/llvm/ADT/ImmutableList.h
index 714355b..d7c0074 100644
--- a/contrib/llvm/include/llvm/ADT/ImmutableList.h
+++ b/contrib/llvm/include/llvm/ADT/ImmutableList.h
@@ -103,6 +103,14 @@ public:
/// isEmpty - Returns true if the list is empty.
bool isEmpty() const { return !X; }
+ bool contains(const T& V) const {
+ for (iterator I = begin(), E = end(); I != E; ++I) {
+ if (*I == V)
+ return true;
+ }
+ return false;
+ }
+
/// isEqual - Returns true if two lists are equal. Because all lists created
/// from the same ImmutableListFactory are uniqued, this has O(1) complexity
/// because it the contents of the list do not need to be compared. Note
diff --git a/contrib/llvm/include/llvm/ADT/PackedVector.h b/contrib/llvm/include/llvm/ADT/PackedVector.h
index 272322a..2eaddc2 100644
--- a/contrib/llvm/include/llvm/ADT/PackedVector.h
+++ b/contrib/llvm/include/llvm/ADT/PackedVector.h
@@ -90,7 +90,7 @@ public:
Vec.setValue(Vec.Bits, Idx, val);
return *this;
}
- operator T() {
+ operator T() const {
return Vec.getValue(Vec.Bits, Idx);
}
};
diff --git a/contrib/llvm/include/llvm/ADT/SmallVector.h b/contrib/llvm/include/llvm/ADT/SmallVector.h
index 8b0a13d..5f0a55b 100644
--- a/contrib/llvm/include/llvm/ADT/SmallVector.h
+++ b/contrib/llvm/include/llvm/ADT/SmallVector.h
@@ -410,7 +410,14 @@ public:
this->setEnd(this->end()+1);
// Push everything else over.
std::copy_backward(I, this->end()-1, this->end());
- *I = Elt;
+
+ // If we just moved the element we're inserting, be sure to update
+ // the reference.
+ const T *EltPtr = &Elt;
+ if (I <= EltPtr && EltPtr < this->EndX)
+ ++EltPtr;
+
+ *I = *EltPtr;
return I;
}
size_t EltNo = I-this->begin();
diff --git a/contrib/llvm/include/llvm/ADT/StringMap.h b/contrib/llvm/include/llvm/ADT/StringMap.h
index 934cacc..3507787 100644
--- a/contrib/llvm/include/llvm/ADT/StringMap.h
+++ b/contrib/llvm/include/llvm/ADT/StringMap.h
@@ -140,7 +140,7 @@ public:
/// StringMapEntry object.
const char *getKeyData() const {return reinterpret_cast<const char*>(this+1);}
- const char *first() const { return getKeyData(); }
+ StringRef first() const { return StringRef(getKeyData(), getKeyLength()); }
/// Create - Create a StringMapEntry for the specified key and default
/// construct the value.
@@ -307,7 +307,7 @@ public:
return ValueTy();
}
- ValueTy& operator[](StringRef Key) {
+ ValueTy &operator[](StringRef Key) {
return GetOrCreateValue(Key).getValue();
}
@@ -355,8 +355,7 @@ public:
/// exists, return it. Otherwise, default construct a value, insert it, and
/// return.
template <typename InitTy>
- StringMapEntry<ValueTy> &GetOrCreateValue(StringRef Key,
- InitTy Val) {
+ MapEntryTy &GetOrCreateValue(StringRef Key, InitTy Val) {
unsigned BucketNo = LookupBucketFor(Key);
ItemBucket &Bucket = TheTable[BucketNo];
if (Bucket.Item && Bucket.Item != getTombstoneVal())
@@ -378,22 +377,10 @@ public:
return *NewItem;
}
- StringMapEntry<ValueTy> &GetOrCreateValue(StringRef Key) {
+ MapEntryTy &GetOrCreateValue(StringRef Key) {
return GetOrCreateValue(Key, ValueTy());
}
- template <typename InitTy>
- StringMapEntry<ValueTy> &GetOrCreateValue(const char *KeyStart,
- const char *KeyEnd,
- InitTy Val) {
- return GetOrCreateValue(StringRef(KeyStart, KeyEnd - KeyStart), Val);
- }
-
- StringMapEntry<ValueTy> &GetOrCreateValue(const char *KeyStart,
- const char *KeyEnd) {
- return GetOrCreateValue(StringRef(KeyStart, KeyEnd - KeyStart));
- }
-
/// remove - Remove the specified key/value pair from the map, but do not
/// erase it. This aborts if the key is not in the map.
void remove(MapEntryTy *KeyValue) {
diff --git a/contrib/llvm/include/llvm/ADT/Triple.h b/contrib/llvm/include/llvm/ADT/Triple.h
index 078033d..fd23608 100644
--- a/contrib/llvm/include/llvm/ADT/Triple.h
+++ b/contrib/llvm/include/llvm/ADT/Triple.h
@@ -95,7 +95,8 @@ public:
Solaris,
Win32,
Haiku,
- Minix
+ Minix,
+ RTEMS
};
enum EnvironmentType {
UnknownEnvironment,
@@ -237,19 +238,10 @@ public:
/// specialized because it is a common query.
unsigned getOSMajorVersion() const {
unsigned Maj, Min, Micro;
- getDarwinNumber(Maj, Min, Micro);
+ getOSVersion(Maj, Min, Micro);
return Maj;
}
- void getDarwinNumber(unsigned &Major, unsigned &Minor,
- unsigned &Micro) const {
- return getOSVersion(Major, Minor, Micro);
- }
-
- unsigned getDarwinMajorNumber() const {
- return getOSMajorVersion();
- }
-
/// isOSVersionLT - Helper function for doing comparisons against version
/// numbers included in the target triple.
bool isOSVersionLT(unsigned Major, unsigned Minor = 0,
@@ -275,7 +267,7 @@ public:
/// isOSDarwin - Is this a "Darwin" OS (OS X or iOS).
bool isOSDarwin() const {
- return isMacOSX() ||getOS() == Triple::IOS;
+ return isMacOSX() || getOS() == Triple::IOS;
}
/// isOSWindows - Is this a "Windows" OS.
@@ -288,7 +280,7 @@ public:
/// compatibility, which handles supporting skewed version numbering schemes
/// used by the "darwin" triples.
unsigned isMacOSXVersionLT(unsigned Major, unsigned Minor = 0,
- unsigned Micro = 0) const {
+ unsigned Micro = 0) const {
assert(isMacOSX() && "Not an OS X triple!");
// If this is OS X, expect a sane version number.
@@ -299,7 +291,7 @@ public:
assert(Major == 10 && "Unexpected major version");
return isOSVersionLT(Minor + 4, Micro, 0);
}
-
+
/// @}
/// @name Mutators
/// @{
diff --git a/contrib/llvm/include/llvm/AbstractTypeUser.h b/contrib/llvm/include/llvm/AbstractTypeUser.h
deleted file mode 100644
index 81f5c5c..0000000
--- a/contrib/llvm/include/llvm/AbstractTypeUser.h
+++ /dev/null
@@ -1,205 +0,0 @@
-//===-- llvm/AbstractTypeUser.h - AbstractTypeUser Interface ----*- C++ -*-===//
-//
-// The LLVM Compiler Infrastructure
-//
-// This file is distributed under the University of Illinois Open Source
-// License. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-//
-// This file declares the AbstractTypeUser class.
-//
-//===----------------------------------------------------------------------===//
-
-#ifndef LLVM_ABSTRACT_TYPE_USER_H
-#define LLVM_ABSTRACT_TYPE_USER_H
-
-#if !defined(LLVM_TYPE_H) && !defined(LLVM_VALUE_H)
-#error Do not include this file directly. Include Type.h instead.
-#error Some versions of GCC (e.g. 3.4 and 4.1) can not handle the inlined method
-#error PATypeHolder::dropRef() correctly otherwise.
-#endif
-
-// This is the "master" include for <cassert> Whether this file needs it or not,
-// it must always include <cassert> for the files which include
-// llvm/AbstractTypeUser.h
-//
-// In this way, most every LLVM source file will have access to the assert()
-// macro without having to #include <cassert> directly.
-//
-#include <cassert>
-
-namespace llvm {
-
-class Value;
-class Type;
-class DerivedType;
-template<typename T> struct simplify_type;
-
-/// The AbstractTypeUser class is an interface to be implemented by classes who
-/// could possibly use an abstract type. Abstract types are denoted by the
-/// isAbstract flag set to true in the Type class. These are classes that
-/// contain an Opaque type in their structure somewhere.
-///
-/// Classes must implement this interface so that they may be notified when an
-/// abstract type is resolved. Abstract types may be resolved into more
-/// concrete types through: linking, parsing, and bitcode reading. When this
-/// happens, all of the users of the type must be updated to reference the new,
-/// more concrete type. They are notified through the AbstractTypeUser
-/// interface.
-///
-/// In addition to this, AbstractTypeUsers must keep the use list of the
-/// potentially abstract type that they reference up-to-date. To do this in a
-/// nice, transparent way, the PATypeHandle class is used to hold "Potentially
-/// Abstract Types", and keep the use list of the abstract types up-to-date.
-/// @brief LLVM Abstract Type User Representation
-class AbstractTypeUser {
-protected:
- virtual ~AbstractTypeUser(); // Derive from me
-
- /// setType - It's normally not possible to change a Value's type in place,
- /// but an AbstractTypeUser subclass that knows what its doing can be
- /// permitted to do so with care.
- void setType(Value *V, const Type *NewTy);
-
-public:
-
- /// refineAbstractType - The callback method invoked when an abstract type is
- /// resolved to another type. An object must override this method to update
- /// its internal state to reference NewType instead of OldType.
- ///
- virtual void refineAbstractType(const DerivedType *OldTy,
- const Type *NewTy) = 0;
-
- /// The other case which AbstractTypeUsers must be aware of is when a type
- /// makes the transition from being abstract (where it has clients on its
- /// AbstractTypeUsers list) to concrete (where it does not). This method
- /// notifies ATU's when this occurs for a type.
- ///
- virtual void typeBecameConcrete(const DerivedType *AbsTy) = 0;
-
- // for debugging...
- virtual void dump() const = 0;
-};
-
-
-/// PATypeHandle - Handle to a Type subclass. This class is used to keep the
-/// use list of abstract types up-to-date.
-///
-class PATypeHandle {
- const Type *Ty;
- AbstractTypeUser * const User;
-
- // These functions are defined at the bottom of Type.h. See the comment there
- // for justification.
- void addUser();
- void removeUser();
-public:
- // ctor - Add use to type if abstract. Note that Ty must not be null
- inline PATypeHandle(const Type *ty, AbstractTypeUser *user)
- : Ty(ty), User(user) {
- addUser();
- }
-
- // ctor - Add use to type if abstract.
- inline PATypeHandle(const PATypeHandle &T) : Ty(T.Ty), User(T.User) {
- addUser();
- }
-
- // dtor - Remove reference to type...
- inline ~PATypeHandle() { removeUser(); }
-
- // Automatic casting operator so that the handle may be used naturally
- inline operator Type *() const { return const_cast<Type*>(Ty); }
- inline Type *get() const { return const_cast<Type*>(Ty); }
-
- // operator= - Allow assignment to handle
- inline Type *operator=(const Type *ty) {
- if (Ty != ty) { // Ensure we don't accidentally drop last ref to Ty
- removeUser();
- Ty = ty;
- addUser();
- }
- return get();
- }
-
- // operator= - Allow assignment to handle
- inline const Type *operator=(const PATypeHandle &T) {
- return operator=(T.Ty);
- }
-
- inline bool operator==(const Type *ty) {
- return Ty == ty;
- }
-
- // operator-> - Allow user to dereference handle naturally...
- inline const Type *operator->() const { return Ty; }
-};
-
-
-/// PATypeHolder - Holder class for a potentially abstract type. This uses
-/// efficient union-find techniques to handle dynamic type resolution. Unless
-/// you need to do custom processing when types are resolved, you should always
-/// use PATypeHolders in preference to PATypeHandles.
-///
-class PATypeHolder {
- mutable const Type *Ty;
- void destroy();
-public:
- PATypeHolder() : Ty(0) {}
- PATypeHolder(const Type *ty) : Ty(ty) {
- addRef();
- }
- PATypeHolder(const PATypeHolder &T) : Ty(T.Ty) {
- addRef();
- }
-
- ~PATypeHolder() { dropRef(); }
-
- operator Type *() const { return get(); }
- Type *get() const;
-
- // operator-> - Allow user to dereference handle naturally...
- Type *operator->() const { return get(); }
-
- // operator= - Allow assignment to handle
- Type *operator=(const Type *ty) {
- if (Ty != ty) { // Don't accidentally drop last ref to Ty.
- dropRef();
- Ty = ty;
- addRef();
- }
- return get();
- }
- Type *operator=(const PATypeHolder &H) {
- return operator=(H.Ty);
- }
-
- /// getRawType - This should only be used to implement the vmcore library.
- ///
- const Type *getRawType() const { return Ty; }
-
-private:
- void addRef();
- void dropRef();
- friend class TypeMapBase;
-};
-
-// simplify_type - Allow clients to treat uses just like values when using
-// casting operators.
-template<> struct simplify_type<PATypeHolder> {
- typedef const Type* SimpleType;
- static SimpleType getSimplifiedValue(const PATypeHolder &Val) {
- return static_cast<SimpleType>(Val.get());
- }
-};
-template<> struct simplify_type<const PATypeHolder> {
- typedef const Type* SimpleType;
- static SimpleType getSimplifiedValue(const PATypeHolder &Val) {
- return static_cast<SimpleType>(Val.get());
- }
-};
-
-} // End llvm namespace
-
-#endif
diff --git a/contrib/llvm/include/llvm/Analysis/BlockFrequency.h b/contrib/llvm/include/llvm/Analysis/BlockFrequency.h
new file mode 100644
index 0000000..c4b1e08
--- /dev/null
+++ b/contrib/llvm/include/llvm/Analysis/BlockFrequency.h
@@ -0,0 +1,53 @@
+//========-------- BlockFrequency.h - Block Frequency Analysis -------========//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+//
+// Loops should be simplified before this analysis.
+//
+//===----------------------------------------------------------------------===//
+
+#ifndef LLVM_ANALYSIS_BLOCKFREQUENCY_H
+#define LLVM_ANALYSIS_BLOCKFREQUENCY_H
+
+#include "llvm/Pass.h"
+#include <climits>
+
+namespace llvm {
+
+class BranchProbabilityInfo;
+template<class BlockT, class FunctionT, class BranchProbInfoT>
+class BlockFrequencyImpl;
+
+/// BlockFrequency pass uses BlockFrequencyImpl implementation to estimate
+/// IR basic block frequencies.
+class BlockFrequency : public FunctionPass {
+
+ BlockFrequencyImpl<BasicBlock, Function, BranchProbabilityInfo> *BFI;
+
+public:
+ static char ID;
+
+ BlockFrequency();
+
+ ~BlockFrequency();
+
+ void getAnalysisUsage(AnalysisUsage &AU) const;
+
+ bool runOnFunction(Function &F);
+
+ /// getblockFreq - Return block frequency. Never return 0, value must be
+ /// positive. Please note that initial frequency is equal to 1024. It means
+ /// that we should not rely on the value itself, but only on the comparison to
+ /// the other block frequencies. We do this to avoid using of the floating
+ /// points.
+ uint32_t getBlockFreq(BasicBlock *BB);
+};
+
+}
+
+#endif
diff --git a/contrib/llvm/include/llvm/Analysis/BlockFrequencyImpl.h b/contrib/llvm/include/llvm/Analysis/BlockFrequencyImpl.h
new file mode 100644
index 0000000..6580fd1
--- /dev/null
+++ b/contrib/llvm/include/llvm/Analysis/BlockFrequencyImpl.h
@@ -0,0 +1,349 @@
+//===---- BlockFrequencyImpl.h - Machine Block Frequency Implementation ---===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+//
+// Shared implementation of BlockFrequency for IR and Machine Instructions.
+//
+//===----------------------------------------------------------------------===//
+
+#ifndef LLVM_ANALYSIS_BLOCKFREQUENCYIMPL_H
+#define LLVM_ANALYSIS_BLOCKFREQUENCYIMPL_H
+
+#include "llvm/BasicBlock.h"
+#include "llvm/ADT/DenseMap.h"
+#include "llvm/ADT/PostOrderIterator.h"
+#include "llvm/CodeGen/MachineBasicBlock.h"
+#include "llvm/CodeGen/MachineFunction.h"
+#include "llvm/Support/BranchProbability.h"
+#include "llvm/Support/Debug.h"
+#include "llvm/Support/raw_ostream.h"
+#include <vector>
+#include <sstream>
+#include <string>
+
+namespace llvm {
+
+
+class BlockFrequency;
+class MachineBlockFrequency;
+
+/// BlockFrequencyImpl implements block frequency algorithm for IR and
+/// Machine Instructions. Algorithm starts with value 1024 (START_FREQ)
+/// for the entry block and then propagates frequencies using branch weights
+/// from (Machine)BranchProbabilityInfo. LoopInfo is not required because
+/// algorithm can find "backedges" by itself.
+template<class BlockT, class FunctionT, class BlockProbInfoT>
+class BlockFrequencyImpl {
+
+ DenseMap<BlockT *, uint32_t> Freqs;
+
+ BlockProbInfoT *BPI;
+
+ FunctionT *Fn;
+
+ typedef GraphTraits< Inverse<BlockT *> > GT;
+
+ static const uint32_t START_FREQ = 1024;
+
+ std::string getBlockName(BasicBlock *BB) const {
+ return BB->getNameStr();
+ }
+
+ std::string getBlockName(MachineBasicBlock *MBB) const {
+ std::stringstream ss;
+ ss << "BB#" << MBB->getNumber();
+
+ if (const BasicBlock *BB = MBB->getBasicBlock())
+ ss << " derived from LLVM BB " << BB->getNameStr();
+
+ return ss.str();
+ }
+
+ void setBlockFreq(BlockT *BB, uint32_t Freq) {
+ Freqs[BB] = Freq;
+ DEBUG(dbgs() << "Frequency(" << getBlockName(BB) << ") = " << Freq << "\n");
+ }
+
+ /// getEdgeFreq - Return edge frequency based on SRC frequency and Src -> Dst
+ /// edge probability.
+ uint32_t getEdgeFreq(BlockT *Src, BlockT *Dst) const {
+ BranchProbability Prob = BPI->getEdgeProbability(Src, Dst);
+ uint64_t N = Prob.getNumerator();
+ uint64_t D = Prob.getDenominator();
+ uint64_t Res = (N * getBlockFreq(Src)) / D;
+
+ assert(Res <= UINT32_MAX);
+ return (uint32_t) Res;
+ }
+
+ /// incBlockFreq - Increase BB block frequency by FREQ.
+ ///
+ void incBlockFreq(BlockT *BB, uint32_t Freq) {
+ Freqs[BB] += Freq;
+ DEBUG(dbgs() << "Frequency(" << getBlockName(BB) << ") += " << Freq
+ << " --> " << Freqs[BB] << "\n");
+ }
+
+ /// divBlockFreq - Divide BB block frequency by PROB. If Prob = 0 do nothing.
+ ///
+ void divBlockFreq(BlockT *BB, BranchProbability Prob) {
+ uint64_t N = Prob.getNumerator();
+ assert(N && "Illegal division by zero!");
+ uint64_t D = Prob.getDenominator();
+ uint64_t Freq = (Freqs[BB] * D) / N;
+
+ // Should we assert it?
+ if (Freq > UINT32_MAX)
+ Freq = UINT32_MAX;
+
+ Freqs[BB] = (uint32_t) Freq;
+ DEBUG(dbgs() << "Frequency(" << getBlockName(BB) << ") /= (" << Prob
+ << ") --> " << Freqs[BB] << "\n");
+ }
+
+ // All blocks in postorder.
+ std::vector<BlockT *> POT;
+
+ // Map Block -> Position in reverse-postorder list.
+ DenseMap<BlockT *, unsigned> RPO;
+
+ // Cycle Probability for each bloch.
+ DenseMap<BlockT *, uint32_t> CycleProb;
+
+ // (reverse-)postorder traversal iterators.
+ typedef typename std::vector<BlockT *>::iterator pot_iterator;
+ typedef typename std::vector<BlockT *>::reverse_iterator rpot_iterator;
+
+ pot_iterator pot_begin() { return POT.begin(); }
+ pot_iterator pot_end() { return POT.end(); }
+
+ rpot_iterator rpot_begin() { return POT.rbegin(); }
+ rpot_iterator rpot_end() { return POT.rend(); }
+
+ rpot_iterator rpot_at(BlockT *BB) {
+ rpot_iterator I = rpot_begin();
+ unsigned idx = RPO[BB];
+ assert(idx);
+ std::advance(I, idx - 1);
+
+ assert(*I == BB);
+ return I;
+ }
+
+
+ /// Return a probability of getting to the DST block through SRC->DST edge.
+ ///
+ BranchProbability getBackEdgeProbability(BlockT *Src, BlockT *Dst) const {
+ uint32_t N = getEdgeFreq(Src, Dst);
+ uint32_t D = getBlockFreq(Dst);
+
+ return BranchProbability(N, D);
+ }
+
+ /// isReachable - Returns if BB block is reachable from the entry.
+ ///
+ bool isReachable(BlockT *BB) {
+ return RPO.count(BB);
+ }
+
+ /// isBackedge - Return if edge Src -> Dst is a backedge.
+ ///
+ bool isBackedge(BlockT *Src, BlockT *Dst) {
+ assert(isReachable(Src));
+ assert(isReachable(Dst));
+
+ unsigned a = RPO[Src];
+ unsigned b = RPO[Dst];
+
+ return a > b;
+ }
+
+ /// getSingleBlockPred - return single BB block predecessor or NULL if
+ /// BB has none or more predecessors.
+ BlockT *getSingleBlockPred(BlockT *BB) {
+ typename GT::ChildIteratorType
+ PI = GraphTraits< Inverse<BlockT *> >::child_begin(BB),
+ PE = GraphTraits< Inverse<BlockT *> >::child_end(BB);
+
+ if (PI == PE)
+ return 0;
+
+ BlockT *Pred = *PI;
+
+ ++PI;
+ if (PI != PE)
+ return 0;
+
+ return Pred;
+ }
+
+ void doBlock(BlockT *BB, BlockT *LoopHead,
+ SmallPtrSet<BlockT *, 8> &BlocksInLoop) {
+
+ DEBUG(dbgs() << "doBlock(" << getBlockName(BB) << ")\n");
+ setBlockFreq(BB, 0);
+
+ if (BB == LoopHead) {
+ setBlockFreq(BB, START_FREQ);
+ return;
+ }
+
+ if(BlockT *Pred = getSingleBlockPred(BB)) {
+ if (BlocksInLoop.count(Pred))
+ setBlockFreq(BB, getEdgeFreq(Pred, BB));
+ // TODO: else? irreducible, ignore it for now.
+ return;
+ }
+
+ bool isInLoop = false;
+ bool isLoopHead = false;
+
+ for (typename GT::ChildIteratorType
+ PI = GraphTraits< Inverse<BlockT *> >::child_begin(BB),
+ PE = GraphTraits< Inverse<BlockT *> >::child_end(BB);
+ PI != PE; ++PI) {
+ BlockT *Pred = *PI;
+
+ if (isReachable(Pred) && isBackedge(Pred, BB)) {
+ isLoopHead = true;
+ } else if (BlocksInLoop.count(Pred)) {
+ incBlockFreq(BB, getEdgeFreq(Pred, BB));
+ isInLoop = true;
+ }
+ // TODO: else? irreducible.
+ }
+
+ if (!isInLoop)
+ return;
+
+ if (!isLoopHead)
+ return;
+
+ assert(START_FREQ >= CycleProb[BB]);
+ uint32_t CProb = CycleProb[BB];
+ uint32_t Numerator = START_FREQ - CProb ? START_FREQ - CProb : 1;
+ divBlockFreq(BB, BranchProbability(Numerator, START_FREQ));
+ }
+
+ /// doLoop - Propagate block frequency down throught the loop.
+ void doLoop(BlockT *Head, BlockT *Tail) {
+ DEBUG(dbgs() << "doLoop(" << getBlockName(Head) << ", "
+ << getBlockName(Tail) << ")\n");
+
+ SmallPtrSet<BlockT *, 8> BlocksInLoop;
+
+ for (rpot_iterator I = rpot_at(Head), E = rpot_end(); I != E; ++I) {
+ BlockT *BB = *I;
+ doBlock(BB, Head, BlocksInLoop);
+
+ BlocksInLoop.insert(BB);
+ }
+
+ // Compute loop's cyclic probability using backedges probabilities.
+ for (typename GT::ChildIteratorType
+ PI = GraphTraits< Inverse<BlockT *> >::child_begin(Head),
+ PE = GraphTraits< Inverse<BlockT *> >::child_end(Head);
+ PI != PE; ++PI) {
+ BlockT *Pred = *PI;
+ assert(Pred);
+ if (isReachable(Pred) && isBackedge(Pred, Head)) {
+ BranchProbability Prob = getBackEdgeProbability(Pred, Head);
+ uint64_t N = Prob.getNumerator();
+ uint64_t D = Prob.getDenominator();
+ uint64_t Res = (N * START_FREQ) / D;
+
+ assert(Res <= UINT32_MAX);
+ CycleProb[Head] += (uint32_t) Res;
+ }
+ }
+ }
+
+ friend class BlockFrequency;
+ friend class MachineBlockFrequency;
+
+ void doFunction(FunctionT *fn, BlockProbInfoT *bpi) {
+ Fn = fn;
+ BPI = bpi;
+
+ // Clear everything.
+ RPO.clear();
+ POT.clear();
+ CycleProb.clear();
+ Freqs.clear();
+
+ BlockT *EntryBlock = fn->begin();
+
+ copy(po_begin(EntryBlock), po_end(EntryBlock), back_inserter(POT));
+
+ unsigned RPOidx = 0;
+ for (rpot_iterator I = rpot_begin(), E = rpot_end(); I != E; ++I) {
+ BlockT *BB = *I;
+ RPO[BB] = ++RPOidx;
+ DEBUG(dbgs() << "RPO[" << getBlockName(BB) << "] = " << RPO[BB] << "\n");
+ }
+
+ // Travel over all blocks in postorder.
+ for (pot_iterator I = pot_begin(), E = pot_end(); I != E; ++I) {
+ BlockT *BB = *I;
+ BlockT *LastTail = 0;
+ DEBUG(dbgs() << "POT: " << getBlockName(BB) << "\n");
+
+ for (typename GT::ChildIteratorType
+ PI = GraphTraits< Inverse<BlockT *> >::child_begin(BB),
+ PE = GraphTraits< Inverse<BlockT *> >::child_end(BB);
+ PI != PE; ++PI) {
+
+ BlockT *Pred = *PI;
+ if (isReachable(Pred) && isBackedge(Pred, BB)
+ && (!LastTail || RPO[Pred] > RPO[LastTail]))
+ LastTail = Pred;
+ }
+
+ if (LastTail)
+ doLoop(BB, LastTail);
+ }
+
+ // At the end assume the whole function as a loop, and travel over it once
+ // again.
+ doLoop(*(rpot_begin()), *(pot_begin()));
+ }
+
+public:
+ /// getBlockFreq - Return block frequency. Never return 0, value must be
+ /// positive.
+ uint32_t getBlockFreq(BlockT *BB) const {
+ typename DenseMap<BlockT *, uint32_t>::const_iterator I = Freqs.find(BB);
+ if (I != Freqs.end())
+ return I->second ? I->second : 1;
+ return 1;
+ }
+
+ void print(raw_ostream &OS) const {
+ OS << "\n\n---- Block Freqs ----\n";
+ for (typename FunctionT::iterator I = Fn->begin(), E = Fn->end(); I != E;) {
+ BlockT *BB = I++;
+ OS << " " << getBlockName(BB) << " = " << getBlockFreq(BB) << "\n";
+
+ for (typename GraphTraits<BlockT *>::ChildIteratorType
+ SI = GraphTraits<BlockT *>::child_begin(BB),
+ SE = GraphTraits<BlockT *>::child_end(BB); SI != SE; ++SI) {
+ BlockT *Succ = *SI;
+ OS << " " << getBlockName(BB) << " -> " << getBlockName(Succ)
+ << " = " << getEdgeFreq(BB, Succ) << "\n";
+ }
+ }
+ }
+
+ void dump() const {
+ print(dbgs());
+ }
+};
+
+}
+
+#endif
diff --git a/contrib/llvm/include/llvm/Analysis/BranchProbabilityInfo.h b/contrib/llvm/include/llvm/Analysis/BranchProbabilityInfo.h
index 91f289d..02ead98 100644
--- a/contrib/llvm/include/llvm/Analysis/BranchProbabilityInfo.h
+++ b/contrib/llvm/include/llvm/Analysis/BranchProbabilityInfo.h
@@ -15,8 +15,9 @@
#define LLVM_ANALYSIS_BRANCHPROBABILITYINFO_H
#include "llvm/InitializePasses.h"
+#include "llvm/Pass.h"
+#include "llvm/ADT/DenseMap.h"
#include "llvm/Support/BranchProbability.h"
-#include "llvm/Analysis/LoopInfo.h"
namespace llvm {
@@ -25,6 +26,11 @@ class raw_ostream;
class BranchProbabilityInfo : public FunctionPass {
// Default weight value. Used when we don't have information about the edge.
+ // TODO: DEFAULT_WEIGHT makes sense during static predication, when none of
+ // the successors have a weight yet. But it doesn't make sense when providing
+ // weight to an edge that may have siblings with non-zero weights. This can
+ // be handled various ways, but it's probably fine for an edge with unknown
+ // weight to just "inherit" the non-zero weight of an adjacent successor.
static const uint32_t DEFAULT_WEIGHT = 16;
typedef std::pair<BasicBlock *, BasicBlock *> Edge;
@@ -41,10 +47,7 @@ public:
initializeBranchProbabilityInfoPass(*PassRegistry::getPassRegistry());
}
- void getAnalysisUsage(AnalysisUsage &AU) const {
- AU.addRequired<LoopInfo>();
- AU.setPreservesAll();
- }
+ void getAnalysisUsage(AnalysisUsage &AU) const;
bool runOnFunction(Function &F);
diff --git a/contrib/llvm/include/llvm/Analysis/DIBuilder.h b/contrib/llvm/include/llvm/Analysis/DIBuilder.h
index 96c6587..a706cc8 100644
--- a/contrib/llvm/include/llvm/Analysis/DIBuilder.h
+++ b/contrib/llvm/include/llvm/Analysis/DIBuilder.h
@@ -135,6 +135,7 @@ namespace llvm {
unsigned Flags);
/// createMemberType - Create debugging information entry for a member.
+ /// @param Scope Member scope.
/// @param Name Member name.
/// @param File File where this member is defined.
/// @param LineNo Line number.
@@ -143,7 +144,7 @@ namespace llvm {
/// @param OffsetInBits Member offset.
/// @param Flags Flags to encode member attribute, e.g. private
/// @param Ty Parent type.
- DIType createMemberType(StringRef Name, DIFile File,
+ DIType createMemberType(DIDescriptor Scope, StringRef Name, DIFile File,
unsigned LineNo, uint64_t SizeInBits,
uint64_t AlignInBits, uint64_t OffsetInBits,
unsigned Flags, DIType Ty);
diff --git a/contrib/llvm/include/llvm/Analysis/IVUsers.h b/contrib/llvm/include/llvm/Analysis/IVUsers.h
index 1b78fe4..e56d24d 100644
--- a/contrib/llvm/include/llvm/Analysis/IVUsers.h
+++ b/contrib/llvm/include/llvm/Analysis/IVUsers.h
@@ -37,8 +37,8 @@ class TargetData;
class IVStrideUse : public CallbackVH, public ilist_node<IVStrideUse> {
friend class IVUsers;
public:
- IVStrideUse(IVUsers *P, Instruction* U, Value *O, Value *PN)
- : CallbackVH(U), Parent(P), OperandValToReplace(O), Phi(PN) {
+ IVStrideUse(IVUsers *P, Instruction* U, Value *O)
+ : CallbackVH(U), Parent(P), OperandValToReplace(O) {
}
/// getUser - Return the user instruction for this use.
@@ -51,11 +51,6 @@ public:
setValPtr(NewUser);
}
- /// getPhi - Return the phi node that represents this IV.
- PHINode *getPhi() const {
- return cast<PHINode>(Phi);
- }
-
/// getOperandValToReplace - Return the Value of the operand in the user
/// instruction that this IVStrideUse is representing.
Value *getOperandValToReplace() const {
@@ -86,9 +81,6 @@ private:
/// that this IVStrideUse is representing.
WeakVH OperandValToReplace;
- /// Phi - The loop header phi that represents this IV.
- WeakVH Phi;
-
/// PostIncLoops - The set of loops for which Expr has been adjusted to
/// use post-inc mode. This corresponds with SCEVExpander's post-inc concept.
PostIncLoopSet PostIncLoops;
@@ -151,9 +143,9 @@ public:
/// AddUsersIfInteresting - Inspect the specified Instruction. If it is a
/// reducible SCEV, recursively add its users to the IVUsesByStride set and
/// return true. Otherwise, return false.
- bool AddUsersIfInteresting(Instruction *I, PHINode *Phi);
+ bool AddUsersIfInteresting(Instruction *I);
- IVStrideUse &AddUser(Instruction *User, Value *Operand, PHINode *Phi);
+ IVStrideUse &AddUser(Instruction *User, Value *Operand);
/// getReplacementExpr - Return a SCEV expression which computes the
/// value of the OperandValToReplace of the given IVStrideUse.
diff --git a/contrib/llvm/include/llvm/Analysis/MemoryDependenceAnalysis.h b/contrib/llvm/include/llvm/Analysis/MemoryDependenceAnalysis.h
index b56fe08..34860e7 100644
--- a/contrib/llvm/include/llvm/Analysis/MemoryDependenceAnalysis.h
+++ b/contrib/llvm/include/llvm/Analysis/MemoryDependenceAnalysis.h
@@ -90,18 +90,27 @@ namespace llvm {
/// get methods: These are static ctor methods for creating various
/// MemDepResult kinds.
static MemDepResult getDef(Instruction *Inst) {
+ assert(Inst && "Def requires inst");
return MemDepResult(PairTy(Inst, Def));
}
static MemDepResult getClobber(Instruction *Inst) {
+ assert(Inst && "Clobber requires inst");
return MemDepResult(PairTy(Inst, Clobber));
}
static MemDepResult getNonLocal() {
return MemDepResult(PairTy(0, NonLocal));
}
+ static MemDepResult getUnknown() {
+ return MemDepResult(PairTy(0, Clobber));
+ }
/// isClobber - Return true if this MemDepResult represents a query that is
/// a instruction clobber dependency.
- bool isClobber() const { return Value.getInt() == Clobber; }
+ bool isClobber() const { return Value.getInt() == Clobber && getInst(); }
+
+ /// isUnknown - Return true if this MemDepResult represents a query which
+ /// cannot and/or will not be computed.
+ bool isUnknown() const { return Value.getInt() == Clobber && !getInst(); }
/// isDef - Return true if this MemDepResult represents a query that is
/// a instruction definition dependency.
diff --git a/contrib/llvm/include/llvm/Analysis/Passes.h b/contrib/llvm/include/llvm/Analysis/Passes.h
index 0eff75f..a22bd12 100644
--- a/contrib/llvm/include/llvm/Analysis/Passes.h
+++ b/contrib/llvm/include/llvm/Analysis/Passes.h
@@ -88,6 +88,13 @@ namespace llvm {
//===--------------------------------------------------------------------===//
//
+ // createObjCARCAliasAnalysisPass - This pass implements ObjC-ARC-based
+ // alias analysis.
+ //
+ ImmutablePass *createObjCARCAliasAnalysisPass();
+
+ //===--------------------------------------------------------------------===//
+ //
// createProfileLoaderPass - This pass loads information from a profile dump
// file.
//
diff --git a/contrib/llvm/include/llvm/Analysis/ScalarEvolutionExpander.h b/contrib/llvm/include/llvm/Analysis/ScalarEvolutionExpander.h
index 39d378e..a8c03b2 100644
--- a/contrib/llvm/include/llvm/Analysis/ScalarEvolutionExpander.h
+++ b/contrib/llvm/include/llvm/Analysis/ScalarEvolutionExpander.h
@@ -30,6 +30,10 @@ namespace llvm {
/// memory.
class SCEVExpander : public SCEVVisitor<SCEVExpander, Value*> {
ScalarEvolution &SE;
+
+ // New instructions receive a name to identifies them with the current pass.
+ const char* IVName;
+
std::map<std::pair<const SCEV *, Instruction *>, AssertingVH<Value> >
InsertedExpressions;
std::set<AssertingVH<Value> > InsertedValues;
@@ -67,9 +71,9 @@ namespace llvm {
public:
/// SCEVExpander - Construct a SCEVExpander in "canonical" mode.
- explicit SCEVExpander(ScalarEvolution &se)
- : SE(se), IVIncInsertLoop(0), CanonicalMode(true),
- Builder(se.getContext(), TargetFolder(se.TD)) {}
+ explicit SCEVExpander(ScalarEvolution &se, const char *name)
+ : SE(se), IVName(name), IVIncInsertLoop(0), IVIncInsertPos(0),
+ CanonicalMode(true), Builder(se.getContext(), TargetFolder(se.TD)) {}
/// clear - Erase the contents of the InsertedExpressions map so that users
/// trying to expand the same expression into multiple BasicBlocks or
diff --git a/contrib/llvm/include/llvm/Analysis/ValueTracking.h b/contrib/llvm/include/llvm/Analysis/ValueTracking.h
index 6df1693..6826330 100644
--- a/contrib/llvm/include/llvm/Analysis/ValueTracking.h
+++ b/contrib/llvm/include/llvm/Analysis/ValueTracking.h
@@ -15,6 +15,7 @@
#ifndef LLVM_ANALYSIS_VALUETRACKING_H
#define LLVM_ANALYSIS_VALUETRACKING_H
+#include "llvm/ADT/ArrayRef.h"
#include "llvm/Support/DataTypes.h"
#include <string>
@@ -108,18 +109,9 @@ namespace llvm {
/// If InsertBefore is not null, this function will duplicate (modified)
/// insertvalues when a part of a nested struct is extracted.
Value *FindInsertedValue(Value *V,
- const unsigned *idx_begin,
- const unsigned *idx_end,
+ ArrayRef<unsigned> idx_range,
Instruction *InsertBefore = 0);
- /// This is a convenience wrapper for finding values indexed by a single index
- /// only.
- inline Value *FindInsertedValue(Value *V, const unsigned Idx,
- Instruction *InsertBefore = 0) {
- const unsigned Idxs[1] = { Idx };
- return FindInsertedValue(V, &Idxs[0], &Idxs[1], InsertBefore);
- }
-
/// GetPointerBaseWithConstantOffset - Analyze the specified pointer to see if
/// it can be expressed as a base pointer plus a constant offset. Return the
/// base and offset to the caller.
@@ -158,6 +150,10 @@ namespace llvm {
return GetUnderlyingObject(const_cast<Value *>(V), TD, MaxLookup);
}
+ /// onlyUsedByLifetimeMarkers - Return true if the only users of this pointer
+ /// are lifetime markers.
+ bool onlyUsedByLifetimeMarkers(const Value *V);
+
} // end namespace llvm
#endif
diff --git a/contrib/llvm/include/llvm/Assembly/Writer.h b/contrib/llvm/include/llvm/Assembly/Writer.h
index c5b2390..8d8befd 100644
--- a/contrib/llvm/include/llvm/Assembly/Writer.h
+++ b/contrib/llvm/include/llvm/Assembly/Writer.h
@@ -17,52 +17,12 @@
#ifndef LLVM_ASSEMBLY_WRITER_H
#define LLVM_ASSEMBLY_WRITER_H
-#include <string>
-
namespace llvm {
class Type;
class Module;
class Value;
class raw_ostream;
-template <typename T> class SmallVectorImpl;
-
-/// TypePrinting - Type printing machinery.
-class TypePrinting {
- void *TypeNames; // A map to remember type names.
- TypePrinting(const TypePrinting &); // DO NOT IMPLEMENT
- void operator=(const TypePrinting&); // DO NOT IMPLEMENT
-public:
- TypePrinting();
- ~TypePrinting();
-
- void clear();
-
- void print(const Type *Ty, raw_ostream &OS, bool IgnoreTopLevelName = false);
-
- void printAtLeastOneLevel(const Type *Ty, raw_ostream &OS) {
- print(Ty, OS, true);
- }
-
- /// hasTypeName - Return true if the type has a name in TypeNames, false
- /// otherwise.
- bool hasTypeName(const Type *Ty) const;
-
- /// addTypeName - Add a name for the specified type if it doesn't already have
- /// one. This name will be printed instead of the structural version of the
- /// type in order to make the output more concise.
- void addTypeName(const Type *Ty, const std::string &N);
-
-private:
- void CalcTypeName(const Type *Ty, SmallVectorImpl<const Type *> &TypeStack,
- raw_ostream &OS, bool IgnoreTopLevelName = false);
-};
-
-// WriteTypeSymbolic - This attempts to write the specified type as a symbolic
-// type, if there is an entry in the Module's symbol table for the specified
-// type or one of its component types.
-//
-void WriteTypeSymbolic(raw_ostream &, const Type *, const Module *M);
// WriteAsOperand - Write the name of the specified value out to the specified
// ostream. This can be useful when you just want to print int %reg126, not the
diff --git a/contrib/llvm/include/llvm/Attributes.h b/contrib/llvm/include/llvm/Attributes.h
index 8b69d6e..233eab8 100644
--- a/contrib/llvm/include/llvm/Attributes.h
+++ b/contrib/llvm/include/llvm/Attributes.h
@@ -69,6 +69,9 @@ const Attributes Hotpatch = 1<<29; ///< Function should have special
///'hotpatch' sequence in prologue
const Attributes UWTable = 1<<30; ///< Function must be in a unwind
///table
+const Attributes NonLazyBind = 1U<<31; ///< Function is called early and/or
+ /// often, so lazy binding isn't
+ /// worthwhile.
/// Note that uwtable is about the ABI or the user mandating an entry in the
/// unwind table. The nounwind attribute is about an exception passing by the
@@ -90,7 +93,7 @@ const Attributes ParameterOnly = ByVal | Nest | StructRet | NoCapture;
const Attributes FunctionOnly = NoReturn | NoUnwind | ReadNone | ReadOnly |
NoInline | AlwaysInline | OptimizeForSize | StackProtect | StackProtectReq |
NoRedZone | NoImplicitFloat | Naked | InlineHint | StackAlignment |
- Hotpatch | UWTable;
+ Hotpatch | UWTable | NonLazyBind;
/// @brief Parameter attributes that do not apply to vararg call arguments.
const Attributes VarArgsIncompatible = StructRet;
diff --git a/contrib/llvm/include/llvm/BasicBlock.h b/contrib/llvm/include/llvm/BasicBlock.h
index 7e7c9e7..3b953c0 100644
--- a/contrib/llvm/include/llvm/BasicBlock.h
+++ b/contrib/llvm/include/llvm/BasicBlock.h
@@ -110,7 +110,7 @@ public:
Function *getParent() { return Parent; }
/// use_back - Specialize the methods defined in Value, as we know that an
- /// BasicBlock can only be used by Users (specifically PHI nodes, terminators,
+ /// BasicBlock can only be used by Users (specifically terminators
/// and BlockAddress's).
User *use_back() { return cast<User>(*use_begin());}
const User *use_back() const { return cast<User>(*use_begin());}
@@ -138,6 +138,12 @@ public:
return const_cast<BasicBlock*>(this)->getFirstNonPHIOrDbg();
}
+ // Same as above, but also skip lifetime intrinsics.
+ Instruction* getFirstNonPHIOrDbgOrLifetime();
+ const Instruction* getFirstNonPHIOrDbgOrLifetime() const {
+ return const_cast<BasicBlock*>(this)->getFirstNonPHIOrDbgOrLifetime();
+ }
+
/// removeFromParent - This method unlinks 'this' from the containing
/// function, but does not delete it.
///
@@ -248,6 +254,10 @@ public:
/// other than direct branches, switches, etc. to it.
bool hasAddressTaken() const { return getSubclassDataFromValue() != 0; }
+ /// replaceSuccessorsPhiUsesWith - Update all phi nodes in all our successors
+ /// to refer to basic block New instead of to us.
+ void replaceSuccessorsPhiUsesWith(BasicBlock *New);
+
private:
/// AdjustBlockAddressRefCount - BasicBlock stores the number of BlockAddress
/// objects using it. This is almost always 0, sometimes one, possibly but
diff --git a/contrib/llvm/include/llvm/Bitcode/BitstreamReader.h b/contrib/llvm/include/llvm/Bitcode/BitstreamReader.h
index 779ef5f..0437f53 100644
--- a/contrib/llvm/include/llvm/Bitcode/BitstreamReader.h
+++ b/contrib/llvm/include/llvm/Bitcode/BitstreamReader.h
@@ -194,6 +194,7 @@ public:
CurAbbrevs[i]->addRef();
// Copy block scope and bump ref counts.
+ BlockScope = RHS.BlockScope;
for (unsigned S = 0, e = static_cast<unsigned>(BlockScope.size());
S != e; ++S) {
std::vector<BitCodeAbbrev*> &Abbrevs = BlockScope[S].PrevAbbrevs;
@@ -375,10 +376,12 @@ public:
// Check that the block wasn't partially defined, and that the offset isn't
// bogus.
- if (AtEndOfStream() || NextChar+NumWords*4 > BitStream->getLastChar())
+ const unsigned char *const SkipTo = NextChar + NumWords*4;
+ if (AtEndOfStream() || SkipTo > BitStream->getLastChar() ||
+ SkipTo < BitStream->getFirstChar())
return true;
- NextChar += NumWords*4;
+ NextChar = SkipTo;
return false;
}
diff --git a/contrib/llvm/include/llvm/Bitcode/LLVMBitCodes.h b/contrib/llvm/include/llvm/Bitcode/LLVMBitCodes.h
index 7692bd2..df68bd5 100644
--- a/contrib/llvm/include/llvm/Bitcode/LLVMBitCodes.h
+++ b/contrib/llvm/include/llvm/Bitcode/LLVMBitCodes.h
@@ -29,13 +29,23 @@ namespace bitc {
// Module sub-block id's.
PARAMATTR_BLOCK_ID,
- TYPE_BLOCK_ID,
+
+ /// TYPE_BLOCK_ID_OLD - This is the type descriptor block in LLVM 2.9 and
+ /// earlier, replaced with TYPE_BLOCK_ID2. FIXME: Remove in LLVM 3.1.
+ TYPE_BLOCK_ID_OLD,
+
CONSTANTS_BLOCK_ID,
FUNCTION_BLOCK_ID,
- TYPE_SYMTAB_BLOCK_ID,
+
+ /// TYPE_SYMTAB_BLOCK_ID_OLD - This type descriptor is from LLVM 2.9 and
+ /// earlier bitcode files. FIXME: Remove in LLVM 3.1
+ TYPE_SYMTAB_BLOCK_ID_OLD,
+
VALUE_SYMTAB_BLOCK_ID,
METADATA_BLOCK_ID,
- METADATA_ATTACHMENT_ID
+ METADATA_ATTACHMENT_ID,
+
+ TYPE_BLOCK_ID_NEW
};
@@ -72,31 +82,38 @@ namespace bitc {
/// TYPE blocks have codes for each type primitive they use.
enum TypeCodes {
- TYPE_CODE_NUMENTRY = 1, // NUMENTRY: [numentries]
+ TYPE_CODE_NUMENTRY = 1, // NUMENTRY: [numentries]
// Type Codes
- TYPE_CODE_VOID = 2, // VOID
- TYPE_CODE_FLOAT = 3, // FLOAT
- TYPE_CODE_DOUBLE = 4, // DOUBLE
- TYPE_CODE_LABEL = 5, // LABEL
- TYPE_CODE_OPAQUE = 6, // OPAQUE
- TYPE_CODE_INTEGER = 7, // INTEGER: [width]
- TYPE_CODE_POINTER = 8, // POINTER: [pointee type]
- TYPE_CODE_FUNCTION = 9, // FUNCTION: [vararg, retty, paramty x N]
- TYPE_CODE_STRUCT = 10, // STRUCT: [ispacked, eltty x N]
- TYPE_CODE_ARRAY = 11, // ARRAY: [numelts, eltty]
- TYPE_CODE_VECTOR = 12, // VECTOR: [numelts, eltty]
+ TYPE_CODE_VOID = 2, // VOID
+ TYPE_CODE_FLOAT = 3, // FLOAT
+ TYPE_CODE_DOUBLE = 4, // DOUBLE
+ TYPE_CODE_LABEL = 5, // LABEL
+ TYPE_CODE_OPAQUE = 6, // OPAQUE
+ TYPE_CODE_INTEGER = 7, // INTEGER: [width]
+ TYPE_CODE_POINTER = 8, // POINTER: [pointee type]
+ TYPE_CODE_FUNCTION = 9, // FUNCTION: [vararg, retty, paramty x N]
+
+ // FIXME: This is the encoding used for structs in LLVM 2.9 and earlier.
+ // REMOVE this in LLVM 3.1
+ TYPE_CODE_STRUCT_OLD = 10, // STRUCT: [ispacked, eltty x N]
+ TYPE_CODE_ARRAY = 11, // ARRAY: [numelts, eltty]
+ TYPE_CODE_VECTOR = 12, // VECTOR: [numelts, eltty]
// These are not with the other floating point types because they're
// a late addition, and putting them in the right place breaks
// binary compatibility.
- TYPE_CODE_X86_FP80 = 13, // X86 LONG DOUBLE
- TYPE_CODE_FP128 = 14, // LONG DOUBLE (112 bit mantissa)
- TYPE_CODE_PPC_FP128= 15, // PPC LONG DOUBLE (2 doubles)
+ TYPE_CODE_X86_FP80 = 13, // X86 LONG DOUBLE
+ TYPE_CODE_FP128 = 14, // LONG DOUBLE (112 bit mantissa)
+ TYPE_CODE_PPC_FP128= 15, // PPC LONG DOUBLE (2 doubles)
- TYPE_CODE_METADATA = 16, // METADATA
+ TYPE_CODE_METADATA = 16, // METADATA
- TYPE_CODE_X86_MMX = 17 // X86 MMX
+ TYPE_CODE_X86_MMX = 17, // X86 MMX
+
+ TYPE_CODE_STRUCT_ANON = 18, // STRUCT_ANON: [ispacked, eltty x N]
+ TYPE_CODE_STRUCT_NAME = 19, // STRUCT_NAME: [strchr x N]
+ TYPE_CODE_STRUCT_NAMED = 20 // STRUCT_NAMED: [ispacked, eltty x N]
};
// The type symbol table only has one code (TST_ENTRY_CODE).
@@ -112,20 +129,16 @@ namespace bitc {
enum MetadataCodes {
METADATA_STRING = 1, // MDSTRING: [values]
- // FIXME: Remove NODE in favor of NODE2 in LLVM 3.0
- METADATA_NODE = 2, // NODE with potentially invalid metadata
- // FIXME: Remove FN_NODE in favor of FN_NODE2 in LLVM 3.0
- METADATA_FN_NODE = 3, // FN_NODE with potentially invalid metadata
+ // 2 is unused.
+ // 3 is unused.
METADATA_NAME = 4, // STRING: [values]
- // FIXME: Remove NAMED_NODE in favor of NAMED_NODE2 in LLVM 3.0
- METADATA_NAMED_NODE = 5, // NAMED_NODE with potentially invalid metadata
+ // 5 is unused.
METADATA_KIND = 6, // [n x [id, name]]
- // FIXME: Remove ATTACHMENT in favor of ATTACHMENT2 in LLVM 3.0
- METADATA_ATTACHMENT = 7, // ATTACHMENT with potentially invalid metadata
- METADATA_NODE2 = 8, // NODE2: [n x (type num, value num)]
- METADATA_FN_NODE2 = 9, // FN_NODE2: [n x (type num, value num)]
- METADATA_NAMED_NODE2 = 10, // NAMED_NODE2: [n x mdnodes]
- METADATA_ATTACHMENT2 = 11 // [m x [value, [n x [id, mdnode]]]
+ // 7 is unused.
+ METADATA_NODE = 8, // NODE: [n x (type num, value num)]
+ METADATA_FN_NODE = 9, // FN_NODE: [n x (type num, value num)]
+ METADATA_NAMED_NODE = 10, // NAMED_NODE: [n x mdnodes]
+ METADATA_ATTACHMENT = 11 // [m x [value, [n x [id, mdnode]]]
};
// The constants block (CONSTANTS_BLOCK_ID) describes emission for each
// constant and maintains an implicit current type value.
@@ -227,21 +240,18 @@ namespace bitc {
FUNC_CODE_INST_UNREACHABLE = 15, // UNREACHABLE
FUNC_CODE_INST_PHI = 16, // PHI: [ty, val0,bb0, ...]
- FUNC_CODE_INST_MALLOC = 17, // MALLOC: [instty, op, align]
- FUNC_CODE_INST_FREE = 18, // FREE: [opty, op]
+ // 17 is unused.
+ // 18 is unused.
FUNC_CODE_INST_ALLOCA = 19, // ALLOCA: [instty, op, align]
FUNC_CODE_INST_LOAD = 20, // LOAD: [opty, op, align, vol]
- // FIXME: Remove STORE in favor of STORE2 in LLVM 3.0
- FUNC_CODE_INST_STORE = 21, // STORE: [valty,val,ptr, align, vol]
- // FIXME: Remove CALL in favor of CALL2 in LLVM 3.0
- FUNC_CODE_INST_CALL = 22, // CALL with potentially invalid metadata
+ // 21 is unused.
+ // 22 is unused.
FUNC_CODE_INST_VAARG = 23, // VAARG: [valistty, valist, instty]
// This store code encodes the pointer type, rather than the value type
// this is so information only available in the pointer type (e.g. address
// spaces) is retained.
- FUNC_CODE_INST_STORE2 = 24, // STORE: [ptrty,ptr,val, align, vol]
- // FIXME: Remove GETRESULT in favor of EXTRACTVAL in LLVM 3.0
- FUNC_CODE_INST_GETRESULT = 25, // GETRESULT: [ty, opval, n]
+ FUNC_CODE_INST_STORE = 24, // STORE: [ptrty,ptr,val, align, vol]
+ // 25 is unused.
FUNC_CODE_INST_EXTRACTVAL = 26, // EXTRACTVAL: [n x operands]
FUNC_CODE_INST_INSERTVAL = 27, // INSERTVAL: [n x operands]
// fcmp/icmp returning Int1TY or vector of Int1Ty. Same as CMP, exists to
@@ -251,14 +261,12 @@ namespace bitc {
FUNC_CODE_INST_VSELECT = 29, // VSELECT: [ty,opval,opval,predty,pred]
FUNC_CODE_INST_INBOUNDS_GEP= 30, // INBOUNDS_GEP: [n x operands]
FUNC_CODE_INST_INDIRECTBR = 31, // INDIRECTBR: [opty, op0, op1, ...]
-
- // FIXME: Remove DEBUG_LOC in favor of DEBUG_LOC2 in LLVM 3.0
- FUNC_CODE_DEBUG_LOC = 32, // DEBUG_LOC with potentially invalid metadata
+ // 32 is unused.
FUNC_CODE_DEBUG_LOC_AGAIN = 33, // DEBUG_LOC_AGAIN
- FUNC_CODE_INST_CALL2 = 34, // CALL2: [attr, fnty, fnid, args...]
+ FUNC_CODE_INST_CALL = 34, // CALL: [attr, fnty, fnid, args...]
- FUNC_CODE_DEBUG_LOC2 = 35 // DEBUG_LOC2: [Line,Col,ScopeVal, IAVal]
+ FUNC_CODE_DEBUG_LOC = 35 // DEBUG_LOC: [Line,Col,ScopeVal, IAVal]
};
} // End bitc namespace
} // End llvm namespace
diff --git a/contrib/llvm/include/llvm/CodeGen/Analysis.h b/contrib/llvm/include/llvm/CodeGen/Analysis.h
index 78bf9fc..f8a7029 100644
--- a/contrib/llvm/include/llvm/CodeGen/Analysis.h
+++ b/contrib/llvm/include/llvm/CodeGen/Analysis.h
@@ -16,6 +16,7 @@
#include "llvm/Instructions.h"
#include "llvm/InlineAsm.h"
+#include "llvm/ADT/ArrayRef.h"
#include "llvm/ADT/SmallVector.h"
#include "llvm/CodeGen/ValueTypes.h"
#include "llvm/CodeGen/ISDOpcodes.h"
@@ -37,6 +38,12 @@ unsigned ComputeLinearIndex(const Type *Ty,
const unsigned *IndicesEnd,
unsigned CurIndex = 0);
+inline unsigned ComputeLinearIndex(const Type *Ty,
+ ArrayRef<unsigned> Indices,
+ unsigned CurIndex = 0) {
+ return ComputeLinearIndex(Ty, Indices.begin(), Indices.end(), CurIndex);
+}
+
/// ComputeValueVTs - Given an LLVM IR type, compute a sequence of
/// EVTs that represent all the individual underlying
/// non-aggregate types that comprise it.
diff --git a/contrib/llvm/include/llvm/CodeGen/AsmPrinter.h b/contrib/llvm/include/llvm/CodeGen/AsmPrinter.h
index 5eea099..06c5c83 100644
--- a/contrib/llvm/include/llvm/CodeGen/AsmPrinter.h
+++ b/contrib/llvm/include/llvm/CodeGen/AsmPrinter.h
@@ -465,8 +465,8 @@ namespace llvm {
void EmitJumpTableEntry(const MachineJumpTableInfo *MJTI,
const MachineBasicBlock *MBB,
unsigned uid) const;
- void EmitLLVMUsedList(Constant *List);
- void EmitXXStructorList(Constant *List);
+ void EmitLLVMUsedList(const Constant *List);
+ void EmitXXStructorList(const Constant *List);
GCMetadataPrinter *GetOrCreateGCPrinter(GCStrategy *C);
};
}
diff --git a/contrib/llvm/include/llvm/CodeGen/FunctionLoweringInfo.h b/contrib/llvm/include/llvm/CodeGen/FunctionLoweringInfo.h
index 4421cc0..84bbf48 100644
--- a/contrib/llvm/include/llvm/CodeGen/FunctionLoweringInfo.h
+++ b/contrib/llvm/include/llvm/CodeGen/FunctionLoweringInfo.h
@@ -24,6 +24,7 @@
#ifndef NDEBUG
#include "llvm/ADT/SmallSet.h"
#endif
+#include "llvm/Analysis/BranchProbabilityInfo.h"
#include "llvm/CodeGen/ValueTypes.h"
#include "llvm/CodeGen/ISDOpcodes.h"
#include "llvm/CodeGen/MachineBasicBlock.h"
@@ -57,7 +58,7 @@ public:
const Function *Fn;
MachineFunction *MF;
MachineRegisterInfo *RegInfo;
-
+ BranchProbabilityInfo *BPI;
/// CanLowerReturn - true iff the function's return value can be lowered to
/// registers.
bool CanLowerReturn;
diff --git a/contrib/llvm/include/llvm/CodeGen/ISDOpcodes.h b/contrib/llvm/include/llvm/CodeGen/ISDOpcodes.h
index e765cad..459cecd 100644
--- a/contrib/llvm/include/llvm/CodeGen/ISDOpcodes.h
+++ b/contrib/llvm/include/llvm/CodeGen/ISDOpcodes.h
@@ -232,7 +232,7 @@ namespace ISD {
SMULO, UMULO,
// Simple binary floating point operators.
- FADD, FSUB, FMUL, FDIV, FREM,
+ FADD, FSUB, FMUL, FMA, FDIV, FREM,
// FCOPYSIGN(X, Y) - Return the value of X with the sign of Y. NOTE: This
// DAG node does not require that X and Y have the same type, just that they
@@ -580,7 +580,8 @@ namespace ISD {
// PREFETCH - This corresponds to a prefetch intrinsic. It takes chains are
// their first operand. The other operands are the address to prefetch,
- // read / write specifier, and locality specifier.
+ // read / write specifier, locality specifier and instruction / data cache
+ // specifier.
PREFETCH,
// OUTCHAIN = MEMBARRIER(INCHAIN, load-load, load-store, store-load,
diff --git a/contrib/llvm/include/llvm/CodeGen/LinkAllCodegenComponents.h b/contrib/llvm/include/llvm/CodeGen/LinkAllCodegenComponents.h
index c931261..098dd0b 100644
--- a/contrib/llvm/include/llvm/CodeGen/LinkAllCodegenComponents.h
+++ b/contrib/llvm/include/llvm/CodeGen/LinkAllCodegenComponents.h
@@ -39,8 +39,6 @@ namespace {
(void) llvm::createGreedyRegisterAllocator();
(void) llvm::createDefaultPBQPRegisterAllocator();
- (void) llvm::createSimpleRegisterCoalescer();
-
llvm::linkOcamlGC();
llvm::linkShadowStackGC();
diff --git a/contrib/llvm/include/llvm/CodeGen/MachineBasicBlock.h b/contrib/llvm/include/llvm/CodeGen/MachineBasicBlock.h
index ad12157..397e59e 100644
--- a/contrib/llvm/include/llvm/CodeGen/MachineBasicBlock.h
+++ b/contrib/llvm/include/llvm/CodeGen/MachineBasicBlock.h
@@ -16,6 +16,7 @@
#include "llvm/CodeGen/MachineInstr.h"
#include "llvm/ADT/GraphTraits.h"
+#include "llvm/Support/DataTypes.h"
#include <functional>
namespace llvm {
@@ -27,6 +28,7 @@ class MCSymbol;
class SlotIndexes;
class StringRef;
class raw_ostream;
+class MachineBranchProbabilityInfo;
template <>
struct ilist_traits<MachineInstr> : public ilist_default_traits<MachineInstr> {
@@ -63,12 +65,19 @@ class MachineBasicBlock : public ilist_node<MachineBasicBlock> {
const BasicBlock *BB;
int Number;
MachineFunction *xParent;
-
+
/// Predecessors/Successors - Keep track of the predecessor / successor
/// basicblocks.
std::vector<MachineBasicBlock *> Predecessors;
std::vector<MachineBasicBlock *> Successors;
+
+ /// Weights - Keep track of the weights to the successors. This vector
+ /// has the same order as Successors, or it is empty if we don't use it
+ /// (disable optimization).
+ std::vector<uint32_t> Weights;
+ typedef std::vector<uint32_t>::iterator weight_iterator;
+
/// LiveIns - Keep track of the physical registers that are livein of
/// the basicblock.
std::vector<unsigned> LiveIns;
@@ -244,11 +253,13 @@ public:
void updateTerminator();
// Machine-CFG mutators
-
+
/// addSuccessor - Add succ as a successor of this MachineBasicBlock.
- /// The Predecessors list of succ is automatically updated.
+ /// The Predecessors list of succ is automatically updated. WEIGHT
+ /// parameter is stored in Weights list and it may be used by
+ /// MachineBranchProbabilityInfo analysis to calculate branch probability.
///
- void addSuccessor(MachineBasicBlock *succ);
+ void addSuccessor(MachineBasicBlock *succ, uint32_t weight = 0);
/// removeSuccessor - Remove successor from the successors list of this
/// MachineBasicBlock. The Predecessors list of succ is automatically updated.
@@ -260,7 +271,12 @@ public:
/// updated. Return the iterator to the element after the one removed.
///
succ_iterator removeSuccessor(succ_iterator I);
-
+
+ /// replaceSuccessor - Replace successor OLD with NEW and update weight info.
+ ///
+ void replaceSuccessor(MachineBasicBlock *Old, MachineBasicBlock *New);
+
+
/// transferSuccessors - Transfers all the successors from MBB to this
/// machine basic block (i.e., copies all the successors fromMBB and
/// remove all the successors from fromMBB).
@@ -396,8 +412,22 @@ public:
/// getSymbol - Return the MCSymbol for this basic block.
///
MCSymbol *getSymbol() const;
-
-private: // Methods used to maintain doubly linked list of blocks...
+
+
+private:
+ /// getWeightIterator - Return weight iterator corresponding to the I
+ /// successor iterator.
+ weight_iterator getWeightIterator(succ_iterator I);
+
+ friend class MachineBranchProbabilityInfo;
+
+ /// getSuccWeight - Return weight of the edge from this block to MBB. This
+ /// method should NOT be called directly, but by using getEdgeWeight method
+ /// from MachineBranchProbabilityInfo class.
+ uint32_t getSuccWeight(MachineBasicBlock *succ);
+
+
+ // Methods used to maintain doubly linked list of blocks...
friend struct ilist_traits<MachineBasicBlock>;
// Machine-CFG mutators
diff --git a/contrib/llvm/include/llvm/CodeGen/MachineBlockFrequency.h b/contrib/llvm/include/llvm/CodeGen/MachineBlockFrequency.h
new file mode 100644
index 0000000..25bf1f0
--- /dev/null
+++ b/contrib/llvm/include/llvm/CodeGen/MachineBlockFrequency.h
@@ -0,0 +1,53 @@
+//====----- MachineBlockFrequency.h - MachineBlock Frequency Analysis ----====//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+//
+// Loops should be simplified before this analysis.
+//
+//===----------------------------------------------------------------------===//
+
+#ifndef LLVM_CODEGEN_MACHINEBLOCKFREQUENCY_H
+#define LLVM_CODEGEN_MACHINEBLOCKFREQUENCY_H
+
+#include "llvm/CodeGen/MachineFunctionPass.h"
+#include <climits>
+
+namespace llvm {
+
+class MachineBranchProbabilityInfo;
+template<class BlockT, class FunctionT, class BranchProbInfoT>
+class BlockFrequencyImpl;
+
+/// MachineBlockFrequency pass uses BlockFrequencyImpl implementation to estimate
+/// machine basic block frequencies.
+class MachineBlockFrequency : public MachineFunctionPass {
+
+ BlockFrequencyImpl<MachineBasicBlock, MachineFunction, MachineBranchProbabilityInfo> *MBFI;
+
+public:
+ static char ID;
+
+ MachineBlockFrequency();
+
+ ~MachineBlockFrequency();
+
+ void getAnalysisUsage(AnalysisUsage &AU) const;
+
+ bool runOnMachineFunction(MachineFunction &F);
+
+ /// getblockFreq - Return block frequency. Never return 0, value must be
+ /// positive. Please note that initial frequency is equal to 1024. It means
+ /// that we should not rely on the value itself, but only on the comparison to
+ /// the other block frequencies. We do this to avoid using of the floating
+ /// points.
+ uint32_t getBlockFreq(MachineBasicBlock *MBB);
+};
+
+}
+
+#endif
diff --git a/contrib/llvm/include/llvm/CodeGen/MachineBranchProbabilityInfo.h b/contrib/llvm/include/llvm/CodeGen/MachineBranchProbabilityInfo.h
new file mode 100644
index 0000000..d9673e2
--- /dev/null
+++ b/contrib/llvm/include/llvm/CodeGen/MachineBranchProbabilityInfo.h
@@ -0,0 +1,78 @@
+
+//==- MachineBranchProbabilityInfo.h - Machine Branch Probability Analysis -==//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+//
+// This pass is used to evaluate branch probabilties on machine basic blocks.
+//
+//===----------------------------------------------------------------------===//
+
+#ifndef LLVM_CODEGEN_MACHINEBRANCHPROBABILITYINFO_H
+#define LLVM_CODEGEN_MACHINEBRANCHPROBABILITYINFO_H
+
+#include "llvm/Pass.h"
+#include "llvm/Support/BranchProbability.h"
+#include <climits>
+
+namespace llvm {
+
+class raw_ostream;
+class MachineBasicBlock;
+
+class MachineBranchProbabilityInfo : public ImmutablePass {
+
+ // Default weight value. Used when we don't have information about the edge.
+ // TODO: DEFAULT_WEIGHT makes sense during static predication, when none of
+ // the successors have a weight yet. But it doesn't make sense when providing
+ // weight to an edge that may have siblings with non-zero weights. This can
+ // be handled various ways, but it's probably fine for an edge with unknown
+ // weight to just "inherit" the non-zero weight of an adjacent successor.
+ static const uint32_t DEFAULT_WEIGHT = 16;
+
+ // Get sum of the block successors' weights.
+ uint32_t getSumForBlock(MachineBasicBlock *MBB) const;
+
+public:
+ static char ID;
+
+ MachineBranchProbabilityInfo() : ImmutablePass(ID) {
+ PassRegistry &Registry = *PassRegistry::getPassRegistry();
+ initializeMachineBranchProbabilityInfoPass(Registry);
+ }
+
+ void getAnalysisUsage(AnalysisUsage &AU) const {
+ AU.setPreservesAll();
+ }
+
+ // Return edge weight. If we don't have any informations about it - return
+ // DEFAULT_WEIGHT.
+ uint32_t getEdgeWeight(MachineBasicBlock *Src, MachineBasicBlock *Dst) const;
+
+ // A 'Hot' edge is an edge which probability is >= 80%.
+ bool isEdgeHot(MachineBasicBlock *Src, MachineBasicBlock *Dst) const;
+
+ // Return a hot successor for the block BB or null if there isn't one.
+ MachineBasicBlock *getHotSucc(MachineBasicBlock *MBB) const;
+
+ // Return a probability as a fraction between 0 (0% probability) and
+ // 1 (100% probability), however the value is never equal to 0, and can be 1
+ // only iff SRC block has only one successor.
+ BranchProbability getEdgeProbability(MachineBasicBlock *Src,
+ MachineBasicBlock *Dst) const;
+
+ // Print value between 0 (0% probability) and 1 (100% probability),
+ // however the value is never equal to 0, and can be 1 only iff SRC block
+ // has only one successor.
+ raw_ostream &printEdgeProbability(raw_ostream &OS, MachineBasicBlock *Src,
+ MachineBasicBlock *Dst) const;
+};
+
+}
+
+
+#endif
diff --git a/contrib/llvm/include/llvm/CodeGen/MachineFunction.h b/contrib/llvm/include/llvm/CodeGen/MachineFunction.h
index f56c053..6e08f7b 100644
--- a/contrib/llvm/include/llvm/CodeGen/MachineFunction.h
+++ b/contrib/llvm/include/llvm/CodeGen/MachineFunction.h
@@ -345,7 +345,7 @@ public:
/// CreateMachineInstr - Allocate a new MachineInstr. Use this instead
/// of `new MachineInstr'.
///
- MachineInstr *CreateMachineInstr(const TargetInstrDesc &TID,
+ MachineInstr *CreateMachineInstr(const MCInstrDesc &MCID,
DebugLoc DL,
bool NoImp = false);
diff --git a/contrib/llvm/include/llvm/CodeGen/MachineInstr.h b/contrib/llvm/include/llvm/CodeGen/MachineInstr.h
index c36dd69..5b3d3ea 100644
--- a/contrib/llvm/include/llvm/CodeGen/MachineInstr.h
+++ b/contrib/llvm/include/llvm/CodeGen/MachineInstr.h
@@ -17,11 +17,12 @@
#define LLVM_CODEGEN_MACHINEINSTR_H
#include "llvm/CodeGen/MachineOperand.h"
-#include "llvm/Target/TargetInstrDesc.h"
+#include "llvm/MC/MCInstrDesc.h"
#include "llvm/Target/TargetOpcodes.h"
#include "llvm/ADT/ilist.h"
#include "llvm/ADT/ilist_node.h"
#include "llvm/ADT/STLExtras.h"
+#include "llvm/ADT/StringRef.h"
#include "llvm/ADT/DenseMapInfo.h"
#include "llvm/Support/DebugLoc.h"
#include <vector>
@@ -30,7 +31,6 @@ namespace llvm {
template <typename T> class SmallVectorImpl;
class AliasAnalysis;
-class TargetInstrDesc;
class TargetInstrInfo;
class TargetRegisterInfo;
class MachineFunction;
@@ -57,7 +57,7 @@ public:
// function frame setup code.
};
private:
- const TargetInstrDesc *TID; // Instruction descriptor.
+ const MCInstrDesc *MCID; // Instruction descriptor.
uint16_t NumImplicitOps; // Number of implicit operands (which
// are determined at construction time).
@@ -94,7 +94,7 @@ private:
MachineInstr(MachineFunction &, const MachineInstr &);
/// MachineInstr ctor - This constructor creates a dummy MachineInstr with
- /// TID NULL and no operands.
+ /// MCID NULL and no operands.
MachineInstr();
// The next two constructors have DebugLoc and non-DebugLoc versions;
@@ -103,25 +103,25 @@ private:
/// MachineInstr ctor - This constructor creates a MachineInstr and adds the
/// implicit operands. It reserves space for the number of operands specified
- /// by the TargetInstrDesc. The version with a DebugLoc should be preferred.
- explicit MachineInstr(const TargetInstrDesc &TID, bool NoImp = false);
+ /// by the MCInstrDesc. The version with a DebugLoc should be preferred.
+ explicit MachineInstr(const MCInstrDesc &MCID, bool NoImp = false);
/// MachineInstr ctor - Work exactly the same as the ctor above, except that
/// the MachineInstr is created and added to the end of the specified basic
/// block. The version with a DebugLoc should be preferred.
- MachineInstr(MachineBasicBlock *MBB, const TargetInstrDesc &TID);
+ MachineInstr(MachineBasicBlock *MBB, const MCInstrDesc &MCID);
/// MachineInstr ctor - This constructor create a MachineInstr and add the
/// implicit operands. It reserves space for number of operands specified by
- /// TargetInstrDesc. An explicit DebugLoc is supplied.
- explicit MachineInstr(const TargetInstrDesc &TID, const DebugLoc dl,
+ /// MCInstrDesc. An explicit DebugLoc is supplied.
+ explicit MachineInstr(const MCInstrDesc &MCID, const DebugLoc dl,
bool NoImp = false);
/// MachineInstr ctor - Work exactly the same as the ctor above, except that
/// the MachineInstr is created and added to the end of the specified basic
/// block.
MachineInstr(MachineBasicBlock *MBB, const DebugLoc dl,
- const TargetInstrDesc &TID);
+ const MCInstrDesc &MCID);
~MachineInstr();
@@ -181,13 +181,22 @@ public:
///
DebugLoc getDebugLoc() const { return debugLoc; }
+ /// emitError - Emit an error referring to the source location of this
+ /// instruction. This should only be used for inline assembly that is somehow
+ /// impossible to compile. Other errors should have been handled much
+ /// earlier.
+ ///
+ /// If this method returns, the caller should try to recover from the error.
+ ///
+ void emitError(StringRef Msg) const;
+
/// getDesc - Returns the target instruction descriptor of this
/// MachineInstr.
- const TargetInstrDesc &getDesc() const { return *TID; }
+ const MCInstrDesc &getDesc() const { return *MCID; }
/// getOpcode - Returns the opcode of this MachineInstr.
///
- int getOpcode() const { return TID->Opcode; }
+ int getOpcode() const { return MCID->Opcode; }
/// Access to explicit operands of the instruction.
///
@@ -279,6 +288,9 @@ public:
bool isCopy() const {
return getOpcode() == TargetOpcode::COPY;
}
+ bool isFullCopy() const {
+ return isCopy() && !getOperand(0).getSubReg() && !getOperand(1).getSubReg();
+ }
/// isCopyLike - Return true if the instruction behaves like a copy.
/// This does not include native copy instructions.
@@ -464,8 +476,8 @@ public:
/// hasUnmodeledSideEffects - Return true if this instruction has side
/// effects that are not modeled by mayLoad / mayStore, etc.
- /// For all instructions, the property is encoded in TargetInstrDesc::Flags
- /// (see TargetInstrDesc::hasUnmodeledSideEffects(). The only exception is
+ /// For all instructions, the property is encoded in MCInstrDesc::Flags
+ /// (see MCInstrDesc::hasUnmodeledSideEffects(). The only exception is
/// INLINEASM instruction, in which case the side effect property is encoded
/// in one of its operands (see InlineAsm::Extra_HasSideEffect).
///
@@ -497,7 +509,7 @@ public:
/// setDesc - Replace the instruction descriptor (thus opcode) of
/// the current instruction with a new one.
///
- void setDesc(const TargetInstrDesc &tid) { TID = &tid; }
+ void setDesc(const MCInstrDesc &tid) { MCID = &tid; }
/// setDebugLoc - Replace current source information with new such.
/// Avoid using this, the constructor argument is preferable.
diff --git a/contrib/llvm/include/llvm/CodeGen/MachineInstrBuilder.h b/contrib/llvm/include/llvm/CodeGen/MachineInstrBuilder.h
index c8183a3..b989027 100644
--- a/contrib/llvm/include/llvm/CodeGen/MachineInstrBuilder.h
+++ b/contrib/llvm/include/llvm/CodeGen/MachineInstrBuilder.h
@@ -22,7 +22,7 @@
namespace llvm {
-class TargetInstrDesc;
+class MCInstrDesc;
class MDNode;
namespace RegState {
@@ -77,6 +77,11 @@ public:
return *this;
}
+ const MachineInstrBuilder &addCImm(const ConstantInt *Val) const {
+ MI->addOperand(MachineOperand::CreateCImm(Val));
+ return *this;
+ }
+
const MachineInstrBuilder &addFPImm(const ConstantFP *Val) const {
MI->addOperand(MachineOperand::CreateFPImm(Val));
return *this;
@@ -175,8 +180,8 @@ public:
///
inline MachineInstrBuilder BuildMI(MachineFunction &MF,
DebugLoc DL,
- const TargetInstrDesc &TID) {
- return MachineInstrBuilder(MF.CreateMachineInstr(TID, DL));
+ const MCInstrDesc &MCID) {
+ return MachineInstrBuilder(MF.CreateMachineInstr(MCID, DL));
}
/// BuildMI - This version of the builder sets up the first operand as a
@@ -184,9 +189,9 @@ inline MachineInstrBuilder BuildMI(MachineFunction &MF,
///
inline MachineInstrBuilder BuildMI(MachineFunction &MF,
DebugLoc DL,
- const TargetInstrDesc &TID,
+ const MCInstrDesc &MCID,
unsigned DestReg) {
- return MachineInstrBuilder(MF.CreateMachineInstr(TID, DL))
+ return MachineInstrBuilder(MF.CreateMachineInstr(MCID, DL))
.addReg(DestReg, RegState::Define);
}
@@ -197,9 +202,9 @@ inline MachineInstrBuilder BuildMI(MachineFunction &MF,
inline MachineInstrBuilder BuildMI(MachineBasicBlock &BB,
MachineBasicBlock::iterator I,
DebugLoc DL,
- const TargetInstrDesc &TID,
+ const MCInstrDesc &MCID,
unsigned DestReg) {
- MachineInstr *MI = BB.getParent()->CreateMachineInstr(TID, DL);
+ MachineInstr *MI = BB.getParent()->CreateMachineInstr(MCID, DL);
BB.insert(I, MI);
return MachineInstrBuilder(MI).addReg(DestReg, RegState::Define);
}
@@ -211,8 +216,8 @@ inline MachineInstrBuilder BuildMI(MachineBasicBlock &BB,
inline MachineInstrBuilder BuildMI(MachineBasicBlock &BB,
MachineBasicBlock::iterator I,
DebugLoc DL,
- const TargetInstrDesc &TID) {
- MachineInstr *MI = BB.getParent()->CreateMachineInstr(TID, DL);
+ const MCInstrDesc &MCID) {
+ MachineInstr *MI = BB.getParent()->CreateMachineInstr(MCID, DL);
BB.insert(I, MI);
return MachineInstrBuilder(MI);
}
@@ -223,8 +228,8 @@ inline MachineInstrBuilder BuildMI(MachineBasicBlock &BB,
///
inline MachineInstrBuilder BuildMI(MachineBasicBlock *BB,
DebugLoc DL,
- const TargetInstrDesc &TID) {
- return BuildMI(*BB, BB->end(), DL, TID);
+ const MCInstrDesc &MCID) {
+ return BuildMI(*BB, BB->end(), DL, MCID);
}
/// BuildMI - This version of the builder inserts the newly-built
@@ -233,9 +238,9 @@ inline MachineInstrBuilder BuildMI(MachineBasicBlock *BB,
///
inline MachineInstrBuilder BuildMI(MachineBasicBlock *BB,
DebugLoc DL,
- const TargetInstrDesc &TID,
+ const MCInstrDesc &MCID,
unsigned DestReg) {
- return BuildMI(*BB, BB->end(), DL, TID, DestReg);
+ return BuildMI(*BB, BB->end(), DL, MCID, DestReg);
}
inline unsigned getDefRegState(bool B) {
diff --git a/contrib/llvm/include/llvm/CodeGen/MachineOperand.h b/contrib/llvm/include/llvm/CodeGen/MachineOperand.h
index 140c6e8..fdef574 100644
--- a/contrib/llvm/include/llvm/CodeGen/MachineOperand.h
+++ b/contrib/llvm/include/llvm/CodeGen/MachineOperand.h
@@ -21,6 +21,7 @@ namespace llvm {
class BlockAddress;
class ConstantFP;
+class ConstantInt;
class GlobalValue;
class MachineBasicBlock;
class MachineInstr;
@@ -38,6 +39,7 @@ public:
enum MachineOperandType {
MO_Register, ///< Register operand.
MO_Immediate, ///< Immediate operand
+ MO_CImmediate, ///< Immediate >64bit operand
MO_FPImmediate, ///< Floating-point immediate operand
MO_MachineBasicBlock, ///< MachineBasicBlock reference
MO_FrameIndex, ///< Abstract Stack Frame Index
@@ -111,6 +113,7 @@ private:
union {
MachineBasicBlock *MBB; // For MO_MachineBasicBlock.
const ConstantFP *CFP; // For MO_FPImmediate.
+ const ConstantInt *CI; // For MO_CImmediate. Integers > 64bit.
int64_t ImmVal; // For MO_Immediate.
const MDNode *MD; // For MO_Metadata.
MCSymbol *Sym; // For MO_MCSymbol
@@ -173,6 +176,8 @@ public:
bool isReg() const { return OpKind == MO_Register; }
/// isImm - Tests if this is a MO_Immediate operand.
bool isImm() const { return OpKind == MO_Immediate; }
+ /// isCImm - Test if t his is a MO_CImmediate operand.
+ bool isCImm() const { return OpKind == MO_CImmediate; }
/// isFPImm - Tests if this is a MO_FPImmediate operand.
bool isFPImm() const { return OpKind == MO_FPImmediate; }
/// isMBB - Tests if this is a MO_MachineBasicBlock operand.
@@ -333,6 +338,11 @@ public:
return Contents.ImmVal;
}
+ const ConstantInt *getCImm() const {
+ assert(isCImm() && "Wrong MachineOperand accessor");
+ return Contents.CI;
+ }
+
const ConstantFP *getFPImm() const {
assert(isFPImm() && "Wrong MachineOperand accessor");
return Contents.CFP;
@@ -440,6 +450,12 @@ public:
return Op;
}
+ static MachineOperand CreateCImm(const ConstantInt *CI) {
+ MachineOperand Op(MachineOperand::MO_CImmediate);
+ Op.Contents.CI = CI;
+ return Op;
+ }
+
static MachineOperand CreateFPImm(const ConstantFP *CFP) {
MachineOperand Op(MachineOperand::MO_FPImmediate);
Op.Contents.CFP = CFP;
diff --git a/contrib/llvm/include/llvm/CodeGen/MachineRegisterInfo.h b/contrib/llvm/include/llvm/CodeGen/MachineRegisterInfo.h
index 74df8da..1079726 100644
--- a/contrib/llvm/include/llvm/CodeGen/MachineRegisterInfo.h
+++ b/contrib/llvm/include/llvm/CodeGen/MachineRegisterInfo.h
@@ -32,11 +32,6 @@ class MachineRegisterInfo {
IndexedMap<std::pair<const TargetRegisterClass*, MachineOperand*>,
VirtReg2IndexFunctor> VRegInfo;
- /// RegClassVRegMap - This vector acts as a map from TargetRegisterClass to
- /// virtual registers. For each target register class, it keeps a list of
- /// virtual registers belonging to the class.
- std::vector<unsigned> *RegClass2VRegMap;
-
/// RegAllocHints - This vector records register allocation hints for virtual
/// registers. For each virtual register, it keeps a register and hint type
/// pair making up the allocation hint. Hint type is target specific except
@@ -216,13 +211,6 @@ public:
///
unsigned getNumVirtRegs() const { return VRegInfo.size(); }
- /// getRegClassVirtRegs - Return the list of virtual registers of the given
- /// target register class.
- const std::vector<unsigned> &
- getRegClassVirtRegs(const TargetRegisterClass *RC) const {
- return RegClass2VRegMap[RC->getID()];
- }
-
/// setRegAllocationHint - Specify a register allocation hint for the
/// specified virtual register.
void setRegAllocationHint(unsigned Reg, unsigned Type, unsigned PrefReg) {
@@ -237,6 +225,14 @@ public:
return RegAllocHints[Reg];
}
+ /// getSimpleHint - Return the preferred register allocation hint, or 0 if a
+ /// standard simple hint (Type == 0) is not set.
+ unsigned getSimpleHint(unsigned Reg) const {
+ std::pair<unsigned, unsigned> Hint = getRegAllocationHint(Reg);
+ return Hint.first ? 0 : Hint.second;
+ }
+
+
//===--------------------------------------------------------------------===//
// Physical Register Use Info
//===--------------------------------------------------------------------===//
diff --git a/contrib/llvm/include/llvm/CodeGen/Passes.h b/contrib/llvm/include/llvm/CodeGen/Passes.h
index 53aee7a..e7928cb 100644
--- a/contrib/llvm/include/llvm/CodeGen/Passes.h
+++ b/contrib/llvm/include/llvm/CodeGen/Passes.h
@@ -73,16 +73,9 @@ namespace llvm {
/// This pass is still in development
extern char &StrongPHIEliminationID;
- extern char &PreAllocSplittingID;
-
/// LiveStacks pass. An analysis keeping track of the liveness of stack slots.
extern char &LiveStacksID;
- /// SimpleRegisterCoalescing pass. Aggressively coalesces every register
- /// copy it can.
- ///
- extern char &SimpleRegisterCoalescingID;
-
/// TwoAddressInstruction pass - This pass reduces two-address instructions to
/// use two operands. This destroys SSA information but it is desired by
/// register allocators.
@@ -132,10 +125,10 @@ namespace llvm {
///
FunctionPass *createDefaultPBQPRegisterAllocator();
- /// SimpleRegisterCoalescing Pass - Coalesce all copies possible. Can run
+ /// RegisterCoalescer Pass - Coalesce all copies possible. Can run
/// independently of the register allocator.
///
- RegisterCoalescer *createSimpleRegisterCoalescer();
+ RegisterCoalescer *createRegisterCoalescer();
/// PrologEpilogCodeInserter Pass - This pass inserts prolog and epilog code,
/// and eliminates abstract frame references.
diff --git a/contrib/llvm/include/llvm/CodeGen/RegAllocPBQP.h b/contrib/llvm/include/llvm/CodeGen/RegAllocPBQP.h
index 8139c65..bce3ec7 100644
--- a/contrib/llvm/include/llvm/CodeGen/RegAllocPBQP.h
+++ b/contrib/llvm/include/llvm/CodeGen/RegAllocPBQP.h
@@ -161,7 +161,8 @@ namespace llvm {
PBQP::PBQPNum benefit);
};
- FunctionPass* createPBQPRegisterAllocator(std::auto_ptr<PBQPBuilder> builder);
+ FunctionPass* createPBQPRegisterAllocator(std::auto_ptr<PBQPBuilder> builder,
+ char *customPassID=0);
}
#endif /* LLVM_CODEGEN_REGALLOCPBQP_H */
diff --git a/contrib/llvm/include/llvm/CodeGen/RegisterCoalescer.h b/contrib/llvm/include/llvm/CodeGen/RegisterCoalescer.h
deleted file mode 100644
index af0b394..0000000
--- a/contrib/llvm/include/llvm/CodeGen/RegisterCoalescer.h
+++ /dev/null
@@ -1,244 +0,0 @@
-//===-- RegisterCoalescer.h - Register Coalescing Interface ------*- C++ -*-===//
-//
-// The LLVM Compiler Infrastructure
-//
-// This file is distributed under the University of Illinois Open Source
-// License. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-//
-// This file contains the abstract interface for register coalescers,
-// allowing them to interact with and query register allocators.
-//
-//===----------------------------------------------------------------------===//
-
-#include "llvm/Support/IncludeFile.h"
-#include "llvm/CodeGen/LiveInterval.h"
-#include "llvm/ADT/SmallPtrSet.h"
-
-#ifndef LLVM_CODEGEN_REGISTER_COALESCER_H
-#define LLVM_CODEGEN_REGISTER_COALESCER_H
-
-namespace llvm {
-
- class MachineFunction;
- class RegallocQuery;
- class AnalysisUsage;
- class MachineInstr;
- class TargetRegisterInfo;
- class TargetRegisterClass;
- class TargetInstrInfo;
-
- /// An abstract interface for register coalescers. Coalescers must
- /// implement this interface to be part of the coalescer analysis
- /// group.
- class RegisterCoalescer {
- public:
- static char ID; // Class identification, replacement for typeinfo
- RegisterCoalescer() {}
- virtual ~RegisterCoalescer(); // We want to be subclassed
-
- /// Run the coalescer on this function, providing interference
- /// data to query. Return whether we removed any copies.
- virtual bool coalesceFunction(MachineFunction &mf,
- RegallocQuery &ifd) = 0;
-
- /// Reset state. Can be used to allow a coalescer run by
- /// PassManager to be run again by the register allocator.
- virtual void reset(MachineFunction &mf) {}
-
- /// Register allocators must call this from their own
- /// getAnalysisUsage to cover the case where the coalescer is not
- /// a Pass in the proper sense and isn't managed by PassManager.
- /// PassManager needs to know which analyses to make available and
- /// which to invalidate when running the register allocator or any
- /// pass that might call coalescing. The long-term solution is to
- /// allow hierarchies of PassManagers.
- virtual void getAnalysisUsage(AnalysisUsage &AU) const {}
- };
-
- /// An abstract interface for register allocators to interact with
- /// coalescers
- ///
- /// Example:
- ///
- /// This is simply an example of how to use the RegallocQuery
- /// interface. It is not meant to be used in production.
- ///
- /// class LinearScanRegallocQuery : public RegallocQuery {
- /// private:
- /// const LiveIntervals \&li;
- ///
- /// public:
- /// LinearScanRegallocQuery(LiveIntervals &intervals)
- /// : li(intervals) {}
- ///
- /// /// This is pretty slow and conservative, but since linear scan
- /// /// allocation doesn't pre-compute interference information it's
- /// /// the best we can do. Coalescers are always free to ignore this
- /// /// and implement their own discovery strategy. See
- /// /// SimpleRegisterCoalescing for an example.
- /// void getInterferences(IntervalSet &interferences,
- /// const LiveInterval &a) const {
- /// for(LiveIntervals::const_iterator iv = li.begin(),
- /// ivend = li.end();
- /// iv != ivend;
- /// ++iv) {
- /// if (interfere(a, iv->second)) {
- /// interferences.insert(&iv->second);
- /// }
- /// }
- /// }
- ///
- /// /// This is *really* slow and stupid. See above.
- /// int getNumberOfInterferences(const LiveInterval &a) const {
- /// IntervalSet intervals;
- /// getInterferences(intervals, a);
- /// return intervals.size();
- /// }
- /// };
- ///
- /// In the allocator:
- ///
- /// RegisterCoalescer &coalescer = getAnalysis<RegisterCoalescer>();
- ///
- /// // We don't reset the coalescer so if it's already been run this
- /// // takes almost no time.
- /// LinearScanRegallocQuery ifd(*li_);
- /// coalescer.coalesceFunction(fn, ifd);
- ///
- class RegallocQuery {
- public:
- typedef SmallPtrSet<const LiveInterval *, 8> IntervalSet;
-
- virtual ~RegallocQuery() {}
-
- /// Return whether two live ranges interfere.
- virtual bool interfere(const LiveInterval &a,
- const LiveInterval &b) const {
- // A naive test
- return a.overlaps(b);
- }
-
- /// Return the set of intervals that interfere with this one.
- virtual void getInterferences(IntervalSet &interferences,
- const LiveInterval &a) const = 0;
-
- /// This can often be cheaper than actually returning the
- /// interferences.
- virtual int getNumberOfInterferences(const LiveInterval &a) const = 0;
-
- /// Make any data structure updates necessary to reflect
- /// coalescing or other modifications.
- virtual void updateDataForMerge(const LiveInterval &a,
- const LiveInterval &b,
- const MachineInstr &copy) {}
-
- /// Allow the register allocator to communicate when it doesn't
- /// want a copy coalesced. This may be due to assumptions made by
- /// the allocator about various invariants and so this question is
- /// a matter of legality, not performance. Performance decisions
- /// about which copies to coalesce should be made by the
- /// coalescer.
- virtual bool isLegalToCoalesce(const MachineInstr &inst) const {
- return true;
- }
- };
-
-
- /// CoalescerPair - A helper class for register coalescers. When deciding if
- /// two registers can be coalesced, CoalescerPair can determine if a copy
- /// instruction would become an identity copy after coalescing.
- class CoalescerPair {
- const TargetInstrInfo &tii_;
- const TargetRegisterInfo &tri_;
-
- /// dstReg_ - The register that will be left after coalescing. It can be a
- /// virtual or physical register.
- unsigned dstReg_;
-
- /// srcReg_ - the virtual register that will be coalesced into dstReg.
- unsigned srcReg_;
-
- /// subReg_ - The subregister index of srcReg in dstReg_. It is possible the
- /// coalesce srcReg_ into a subreg of the larger dstReg_ when dstReg_ is a
- /// virtual register.
- unsigned subIdx_;
-
- /// partial_ - True when the original copy was a partial subregister copy.
- bool partial_;
-
- /// crossClass_ - True when both regs are virtual, and newRC is constrained.
- bool crossClass_;
-
- /// flipped_ - True when DstReg and SrcReg are reversed from the oriignal copy
- /// instruction.
- bool flipped_;
-
- /// newRC_ - The register class of the coalesced register, or NULL if dstReg_
- /// is a physreg.
- const TargetRegisterClass *newRC_;
-
- /// compose - Compose subreg indices a and b, either may be 0.
- unsigned compose(unsigned, unsigned) const;
-
- /// isMoveInstr - Return true if MI is a move or subreg instruction.
- bool isMoveInstr(const MachineInstr *MI, unsigned &Src, unsigned &Dst,
- unsigned &SrcSub, unsigned &DstSub) const;
-
- public:
- CoalescerPair(const TargetInstrInfo &tii, const TargetRegisterInfo &tri)
- : tii_(tii), tri_(tri), dstReg_(0), srcReg_(0), subIdx_(0),
- partial_(false), crossClass_(false), flipped_(false), newRC_(0) {}
-
- /// setRegisters - set registers to match the copy instruction MI. Return
- /// false if MI is not a coalescable copy instruction.
- bool setRegisters(const MachineInstr*);
-
- /// flip - Swap srcReg_ and dstReg_. Return false if swapping is impossible
- /// because dstReg_ is a physical register, or subIdx_ is set.
- bool flip();
-
- /// isCoalescable - Return true if MI is a copy instruction that will become
- /// an identity copy after coalescing.
- bool isCoalescable(const MachineInstr*) const;
-
- /// isPhys - Return true if DstReg is a physical register.
- bool isPhys() const { return !newRC_; }
-
- /// isPartial - Return true if the original copy instruction did not copy the
- /// full register, but was a subreg operation.
- bool isPartial() const { return partial_; }
-
- /// isCrossClass - Return true if DstReg is virtual and NewRC is a smaller register class than DstReg's.
- bool isCrossClass() const { return crossClass_; }
-
- /// isFlipped - Return true when getSrcReg is the register being defined by
- /// the original copy instruction.
- bool isFlipped() const { return flipped_; }
-
- /// getDstReg - Return the register (virtual or physical) that will remain
- /// after coalescing.
- unsigned getDstReg() const { return dstReg_; }
-
- /// getSrcReg - Return the virtual register that will be coalesced away.
- unsigned getSrcReg() const { return srcReg_; }
-
- /// getSubIdx - Return the subregister index in DstReg that SrcReg will be
- /// coalesced into, or 0.
- unsigned getSubIdx() const { return subIdx_; }
-
- /// getNewRC - Return the register class of the coalesced register.
- const TargetRegisterClass *getNewRC() const { return newRC_; }
- };
-}
-
-// Because of the way .a files work, we must force the SimpleRC
-// implementation to be pulled in if the RegisterCoalescing header is
-// included. Otherwise we run the risk of RegisterCoalescing being
-// used, but the default implementation not being linked into the tool
-// that uses it.
-FORCE_DEFINING_FILE_TO_BE_LINKED(RegisterCoalescer)
-FORCE_DEFINING_FILE_TO_BE_LINKED(SimpleRegisterCoalescing)
-
-#endif
diff --git a/contrib/llvm/include/llvm/CodeGen/RuntimeLibcalls.h b/contrib/llvm/include/llvm/CodeGen/RuntimeLibcalls.h
index 576be82..4bfd4ab 100644
--- a/contrib/llvm/include/llvm/CodeGen/RuntimeLibcalls.h
+++ b/contrib/llvm/include/llvm/CodeGen/RuntimeLibcalls.h
@@ -22,7 +22,7 @@ namespace RTLIB {
/// RTLIB::Libcall enum - This enum defines all of the runtime library calls
/// the backend can emit. The various long double types cannot be merged,
/// because 80-bit library functions use "xf" and 128-bit use "tf".
- ///
+ ///
/// When adding PPCF128 functions here, note that their names generally need
/// to be overridden for Darwin with the xxx$LDBL128 form. See
/// PPCISelLowering.cpp.
@@ -46,6 +46,9 @@ namespace RTLIB {
MUL_I32,
MUL_I64,
MUL_I128,
+ MULO_I32,
+ MULO_I64,
+ MULO_I128,
SDIV_I8,
SDIV_I16,
SDIV_I32,
@@ -100,6 +103,10 @@ namespace RTLIB {
REM_F64,
REM_F80,
REM_PPCF128,
+ FMA_F32,
+ FMA_F64,
+ FMA_F80,
+ FMA_PPCF128,
POWI_F32,
POWI_F64,
POWI_F80,
diff --git a/contrib/llvm/include/llvm/CodeGen/ScheduleDAG.h b/contrib/llvm/include/llvm/CodeGen/ScheduleDAG.h
index 2f01948..1bbc6c5 100644
--- a/contrib/llvm/include/llvm/CodeGen/ScheduleDAG.h
+++ b/contrib/llvm/include/llvm/CodeGen/ScheduleDAG.h
@@ -34,7 +34,7 @@ namespace llvm {
class ScheduleDAG;
class SDNode;
class TargetInstrInfo;
- class TargetInstrDesc;
+ class MCInstrDesc;
class TargetMachine;
class TargetRegisterClass;
template<class Graph> class GraphWriter;
@@ -497,13 +497,19 @@ namespace llvm {
SUnit EntrySU; // Special node for the region entry.
SUnit ExitSU; // Special node for the region exit.
+#ifdef NDEBUG
+ static const bool StressSched = false;
+#else
+ bool StressSched;
+#endif
+
explicit ScheduleDAG(MachineFunction &mf);
virtual ~ScheduleDAG();
- /// getInstrDesc - Return the TargetInstrDesc of this SUnit.
+ /// getInstrDesc - Return the MCInstrDesc of this SUnit.
/// Return NULL for SDNodes without a machine opcode.
- const TargetInstrDesc *getInstrDesc(const SUnit *SU) const {
+ const MCInstrDesc *getInstrDesc(const SUnit *SU) const {
if (SU->isInstr()) return &SU->getInstr()->getDesc();
return getNodeDesc(SU->getNode());
}
@@ -573,8 +579,8 @@ namespace llvm {
void EmitPhysRegCopy(SUnit *SU, DenseMap<SUnit*, unsigned> &VRBaseMap);
private:
- // Return the TargetInstrDesc of this SDNode or NULL.
- const TargetInstrDesc *getNodeDesc(const SDNode *Node) const;
+ // Return the MCInstrDesc of this SDNode or NULL.
+ const MCInstrDesc *getNodeDesc(const SDNode *Node) const;
};
class SUnitIterator : public std::iterator<std::forward_iterator_tag,
diff --git a/contrib/llvm/include/llvm/CodeGen/ScoreboardHazardRecognizer.h b/contrib/llvm/include/llvm/CodeGen/ScoreboardHazardRecognizer.h
index 118df28..060e89a 100644
--- a/contrib/llvm/include/llvm/CodeGen/ScoreboardHazardRecognizer.h
+++ b/contrib/llvm/include/llvm/CodeGen/ScoreboardHazardRecognizer.h
@@ -25,7 +25,6 @@
namespace llvm {
class InstrItineraryData;
-class TargetInstrDesc;
class ScheduleDAG;
class SUnit;
diff --git a/contrib/llvm/include/llvm/CodeGen/SelectionDAG.h b/contrib/llvm/include/llvm/CodeGen/SelectionDAG.h
index 1c42bef..3ec5ada 100644
--- a/contrib/llvm/include/llvm/CodeGen/SelectionDAG.h
+++ b/contrib/llvm/include/llvm/CodeGen/SelectionDAG.h
@@ -96,8 +96,12 @@ public:
return DbgValues.empty() && ByvalParmDbgValues.empty();
}
- SmallVector<SDDbgValue*,2> &getSDDbgValues(const SDNode *Node) {
- return DbgValMap[Node];
+ ArrayRef<SDDbgValue*> getSDDbgValues(const SDNode *Node) {
+ DenseMap<const SDNode*, SmallVector<SDDbgValue*, 2> >::iterator I =
+ DbgValMap.find(Node);
+ if (I != DbgValMap.end())
+ return I->second;
+ return ArrayRef<SDDbgValue*>();
}
typedef SmallVector<SDDbgValue*,32>::iterator DbgIterator;
@@ -898,7 +902,7 @@ public:
void AddDbgValue(SDDbgValue *DB, SDNode *SD, bool isParameter);
/// GetDbgValues - Get the debug values which reference the given SDNode.
- SmallVector<SDDbgValue*,2> &GetDbgValues(const SDNode* SD) {
+ ArrayRef<SDDbgValue*> GetDbgValues(const SDNode* SD) {
return DbgInfo->getSDDbgValues(SD);
}
diff --git a/contrib/llvm/include/llvm/CodeGen/SelectionDAGNodes.h b/contrib/llvm/include/llvm/CodeGen/SelectionDAGNodes.h
index 9d265f1..a5c4201 100644
--- a/contrib/llvm/include/llvm/CodeGen/SelectionDAGNodes.h
+++ b/contrib/llvm/include/llvm/CodeGen/SelectionDAGNodes.h
@@ -23,6 +23,7 @@
#include "llvm/ADT/FoldingSet.h"
#include "llvm/ADT/GraphTraits.h"
#include "llvm/ADT/ilist_node.h"
+#include "llvm/ADT/SmallPtrSet.h"
#include "llvm/ADT/SmallVector.h"
#include "llvm/ADT/STLExtras.h"
#include "llvm/CodeGen/ISDOpcodes.h"
@@ -496,11 +497,29 @@ public:
///
bool isOperandOf(SDNode *N) const;
- /// isPredecessorOf - Return true if this node is a predecessor of N. This
- /// node is either an operand of N or it can be reached by recursively
+ /// isPredecessorOf - Return true if this node is a predecessor of N.
+ /// NOTE: Implemented on top of hasPredecessor and every bit as
+ /// expensive. Use carefully.
+ bool isPredecessorOf(const SDNode *N) const { return N->hasPredecessor(this); }
+
+ /// hasPredecessor - Return true if N is a predecessor of this node.
+ /// N is either an operand of this node, or can be reached by recursively
+ /// traversing up the operands.
+ /// NOTE: This is an expensive method. Use it carefully.
+ bool hasPredecessor(const SDNode *N) const;
+
+ /// hasPredecesorHelper - Return true if N is a predecessor of this node.
+ /// N is either an operand of this node, or can be reached by recursively
/// traversing up the operands.
- /// NOTE: this is an expensive method. Use it carefully.
- bool isPredecessorOf(SDNode *N) const;
+ /// In this helper the Visited and worklist sets are held externally to
+ /// cache predecessors over multiple invocations. If you want to test for
+ /// multiple predecessors this method is preferable to multiple calls to
+ /// hasPredecessor. Be sure to clear Visited and Worklist if the DAG
+ /// changes.
+ /// NOTE: This is still very expensive. Use carefully.
+ bool hasPredecessorHelper(const SDNode *N,
+ SmallPtrSet<const SDNode *, 32> &Visited,
+ SmallVector<const SDNode *, 16> &Worklist) const;
/// getNumOperands - Return the number of values used by this operation.
///
diff --git a/contrib/llvm/include/llvm/CodeGen/SlotIndexes.h b/contrib/llvm/include/llvm/CodeGen/SlotIndexes.h
index 33ce675..6eb3180 100644
--- a/contrib/llvm/include/llvm/CodeGen/SlotIndexes.h
+++ b/contrib/llvm/include/llvm/CodeGen/SlotIndexes.h
@@ -140,6 +140,9 @@ namespace llvm {
return lie.getPointer();
}
+ /// Return true for a valid index.
+ operator bool() const { return isValid(); }
+
/// Print this index to the given raw_ostream.
void print(raw_ostream &os) const;
diff --git a/contrib/llvm/include/llvm/CodeGen/TargetLoweringObjectFileImpl.h b/contrib/llvm/include/llvm/CodeGen/TargetLoweringObjectFileImpl.h
index 54e5751..711280e 100644
--- a/contrib/llvm/include/llvm/CodeGen/TargetLoweringObjectFileImpl.h
+++ b/contrib/llvm/include/llvm/CodeGen/TargetLoweringObjectFileImpl.h
@@ -52,7 +52,7 @@ protected:
const MCSection *MergeableConst8Section;
const MCSection *MergeableConst16Section;
public:
- TargetLoweringObjectFileELF() {}
+ TargetLoweringObjectFileELF();
~TargetLoweringObjectFileELF() {}
virtual void Initialize(MCContext &Ctx, const TargetMachine &TM);
@@ -131,7 +131,7 @@ class TargetLoweringObjectFileMachO : public TargetLoweringObjectFile {
const MCSection *LazySymbolPointerSection;
const MCSection *NonLazySymbolPointerSection;
public:
- TargetLoweringObjectFileMachO() {}
+ TargetLoweringObjectFileMachO();
~TargetLoweringObjectFileMachO() {}
virtual void Initialize(MCContext &Ctx, const TargetMachine &TM);
@@ -207,7 +207,7 @@ class TargetLoweringObjectFileCOFF : public TargetLoweringObjectFile {
const MCSection *PDataSection;
const MCSection *XDataSection;
public:
- TargetLoweringObjectFileCOFF() {}
+ TargetLoweringObjectFileCOFF();
~TargetLoweringObjectFileCOFF() {}
virtual void Initialize(MCContext &Ctx, const TargetMachine &TM);
diff --git a/contrib/llvm/include/llvm/CodeGen/ValueTypes.h b/contrib/llvm/include/llvm/CodeGen/ValueTypes.h
index 22d1622..424721b 100644
--- a/contrib/llvm/include/llvm/CodeGen/ValueTypes.h
+++ b/contrib/llvm/include/llvm/CodeGen/ValueTypes.h
@@ -83,7 +83,11 @@ namespace llvm {
isVoid = 35, // This has no value
- LAST_VALUETYPE = 36, // This always remains at the end of the list.
+ untyped = 36, // This value takes a register, but has
+ // unspecified type. The register class
+ // will be determined by the opcode.
+
+ LAST_VALUETYPE = 37, // This always remains at the end of the list.
// This is the current maximum for LAST_VALUETYPE.
// MVT::MAX_ALLOWED_VALUETYPE is used for asserts and to size bit vectors
diff --git a/contrib/llvm/include/llvm/CodeGen/ValueTypes.td b/contrib/llvm/include/llvm/CodeGen/ValueTypes.td
index a1163f7..0cfb634 100644
--- a/contrib/llvm/include/llvm/CodeGen/ValueTypes.td
+++ b/contrib/llvm/include/llvm/CodeGen/ValueTypes.td
@@ -1,10 +1,10 @@
//===- ValueTypes.td - ValueType definitions ---------------*- tablegen -*-===//
-//
+//
// The LLVM Compiler Infrastructure
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
-//
+//
//===----------------------------------------------------------------------===//
//
// Value types - These values correspond to the register types defined in the
@@ -58,6 +58,7 @@ def v4f64 : ValueType<256, 32>; // 4 x f64 vector value
def x86mmx : ValueType<64 , 33>; // X86 MMX value
def FlagVT : ValueType<0 , 34>; // Pre-RA sched glue
def isVoid : ValueType<0 , 35>; // Produces no value
+def untyped: ValueType<8 , 36>; // Produces an untyped value
def MetadataVT: ValueType<0, 250>; // Metadata
diff --git a/contrib/llvm/include/llvm/Constant.h b/contrib/llvm/include/llvm/Constant.h
index 5f32ce0..5e351c4 100644
--- a/contrib/llvm/include/llvm/Constant.h
+++ b/contrib/llvm/include/llvm/Constant.h
@@ -50,11 +50,11 @@ protected:
public:
/// isNullValue - Return true if this is the value that would be returned by
/// getNullValue.
- virtual bool isNullValue() const = 0;
+ bool isNullValue() const;
/// isNegativeZeroValue - Return true if the value is what would be returned
/// by getZeroValueForNegation.
- virtual bool isNegativeZeroValue() const { return isNullValue(); }
+ bool isNegativeZeroValue() const;
/// canTrap - Return true if evaluation of this constant could trap. This is
/// true for things like constant expressions that could divide by zero.
diff --git a/contrib/llvm/include/llvm/Constants.h b/contrib/llvm/include/llvm/Constants.h
index eabc3a5..01fca29 100644
--- a/contrib/llvm/include/llvm/Constants.h
+++ b/contrib/llvm/include/llvm/Constants.h
@@ -149,13 +149,7 @@ public:
static bool isValueValidForType(const Type *Ty, uint64_t V);
static bool isValueValidForType(const Type *Ty, int64_t V);
- /// This function will return true iff this constant represents the "null"
- /// value that would be returned by the getNullValue method.
- /// @returns true if this is the null integer value.
- /// @brief Determine if the value is null.
- virtual bool isNullValue() const {
- return Val == 0;
- }
+ bool isNegative() const { return Val.isNegative(); }
/// This is just a convenience method to make client code smaller for a
/// common code. It also correctly performs the comparison without the
@@ -263,22 +257,14 @@ public:
/// isValueValidForType - return true if Ty is big enough to represent V.
static bool isValueValidForType(const Type *Ty, const APFloat &V);
- inline const APFloat& getValueAPF() const { return Val; }
-
- /// isNullValue - Return true if this is the value that would be returned by
- /// getNullValue. For ConstantFP, this is +0.0, but not -0.0. To handle the
- /// two the same, use isZero().
- virtual bool isNullValue() const;
-
- /// isNegativeZeroValue - Return true if the value is what would be returned
- /// by getZeroValueForNegation.
- virtual bool isNegativeZeroValue() const {
- return Val.isZero() && Val.isNegative();
- }
+ inline const APFloat &getValueAPF() const { return Val; }
/// isZero - Return true if the value is positive or negative zero.
bool isZero() const { return Val.isZero(); }
+ /// isNegative - Return true if the sign bit is set.
+ bool isNegative() const { return Val.isNegative(); }
+
/// isNaN - Return true if the value is a NaN.
bool isNaN() const { return Val.isNaN(); }
@@ -324,10 +310,6 @@ protected:
public:
static ConstantAggregateZero* get(const Type *Ty);
- /// isNullValue - Return true if this is the value that would be returned by
- /// getNullValue.
- virtual bool isNullValue() const { return true; }
-
virtual void destroyConstant();
/// Methods for support type inquiry through isa, cast, and dyn_cast:
@@ -350,9 +332,7 @@ protected:
ConstantArray(const ArrayType *T, const std::vector<Constant*> &Val);
public:
// ConstantArray accessors
- static Constant *get(const ArrayType *T, const std::vector<Constant*> &V);
- static Constant *get(const ArrayType *T, Constant *const *Vals,
- unsigned NumVals);
+ static Constant *get(const ArrayType *T, ArrayRef<Constant*> V);
/// This method constructs a ConstantArray and initializes it with a text
/// string. The default behavior (AddNull==true) causes a null terminator to
@@ -389,10 +369,11 @@ public:
///
std::string getAsString() const;
- /// isNullValue - Return true if this is the value that would be returned by
- /// getNullValue. This always returns false because zero arrays are always
- /// created as ConstantAggregateZero objects.
- virtual bool isNullValue() const { return false; }
+ /// getAsCString - If this array is isCString(), then this method converts the
+ /// array (without the trailing null byte) to an std::string and returns it.
+ /// Otherwise, it asserts out.
+ ///
+ std::string getAsCString() const;
virtual void destroyConstant();
virtual void replaceUsesOfWithOnConstant(Value *From, Value *To, Use *U);
@@ -422,14 +403,29 @@ protected:
ConstantStruct(const StructType *T, const std::vector<Constant*> &Val);
public:
// ConstantStruct accessors
- static Constant *get(const StructType *T, const std::vector<Constant*> &V);
- static Constant *get(LLVMContext &Context,
- const std::vector<Constant*> &V, bool Packed);
- static Constant *get(LLVMContext &Context,
- Constant *const *Vals, unsigned NumVals, bool Packed);
- static Constant *get(LLVMContext &Context, bool Packed,
- Constant * Val, ...) END_WITH_NULL;
-
+ static Constant *get(const StructType *T, ArrayRef<Constant*> V);
+ static Constant *get(const StructType *T, ...) END_WITH_NULL;
+
+ /// getAnon - Return an anonymous struct that has the specified
+ /// elements. If the struct is possibly empty, then you must specify a
+ /// context.
+ static Constant *getAnon(ArrayRef<Constant*> V, bool Packed = false) {
+ return get(getTypeForElements(V, Packed), V);
+ }
+ static Constant *getAnon(LLVMContext &Ctx,
+ ArrayRef<Constant*> V, bool Packed = false) {
+ return get(getTypeForElements(Ctx, V, Packed), V);
+ }
+
+ /// getTypeForElements - Return an anonymous struct type to use for a constant
+ /// with the specified set of elements. The list must not be empty.
+ static StructType *getTypeForElements(ArrayRef<Constant*> V,
+ bool Packed = false);
+ /// getTypeForElements - This version of the method allows an empty list.
+ static StructType *getTypeForElements(LLVMContext &Ctx,
+ ArrayRef<Constant*> V,
+ bool Packed = false);
+
/// Transparently provide more efficient getOperand methods.
DECLARE_TRANSPARENT_OPERAND_ACCESSORS(Constant);
@@ -439,13 +435,6 @@ public:
return reinterpret_cast<const StructType*>(Value::getType());
}
- /// isNullValue - Return true if this is the value that would be returned by
- /// getNullValue. This always returns false because zero structs are always
- /// created as ConstantAggregateZero objects.
- virtual bool isNullValue() const {
- return false;
- }
-
virtual void destroyConstant();
virtual void replaceUsesOfWithOnConstant(Value *From, Value *To, Use *U);
@@ -476,8 +465,6 @@ protected:
public:
// ConstantVector accessors
static Constant *get(ArrayRef<Constant*> V);
- // FIXME: Eliminate this constructor form.
- static Constant *get(const VectorType *T, const std::vector<Constant*> &V);
/// Transparently provide more efficient getOperand methods.
DECLARE_TRANSPARENT_OPERAND_ACCESSORS(Constant);
@@ -489,11 +476,6 @@ public:
return reinterpret_cast<const VectorType*>(Value::getType());
}
- /// isNullValue - Return true if this is the value that would be returned by
- /// getNullValue. This always returns false because zero vectors are always
- /// created as ConstantAggregateZero objects.
- virtual bool isNullValue() const { return false; }
-
/// This function will return true iff every element in this vector constant
/// is set to all ones.
/// @returns true iff this constant's emements are all set to all ones.
@@ -542,10 +524,6 @@ public:
/// get() - Static factory methods - Return objects of the specified value
static ConstantPointerNull *get(const PointerType *T);
- /// isNullValue - Return true if this is the value that would be returned by
- /// getNullValue.
- virtual bool isNullValue() const { return true; }
-
virtual void destroyConstant();
/// getType - Specialize the getType() method to always return an PointerType,
@@ -582,10 +560,6 @@ public:
Function *getFunction() const { return (Function*)Op<0>().get(); }
BasicBlock *getBasicBlock() const { return (BasicBlock*)Op<1>().get(); }
- /// isNullValue - Return true if this is the value that would be returned by
- /// getNullValue.
- virtual bool isNullValue() const { return false; }
-
virtual void destroyConstant();
virtual void replaceUsesOfWithOnConstant(Value *From, Value *To, Use *U);
@@ -623,35 +597,6 @@ protected:
setValueSubclassData(Opcode);
}
- // These private methods are used by the type resolution code to create
- // ConstantExprs in intermediate forms.
- static Constant *getTy(const Type *Ty, unsigned Opcode,
- Constant *C1, Constant *C2,
- unsigned Flags = 0);
- static Constant *getCompareTy(unsigned short pred, Constant *C1,
- Constant *C2);
- static Constant *getSelectTy(const Type *Ty,
- Constant *C1, Constant *C2, Constant *C3);
- template<typename IndexTy>
- static Constant *getGetElementPtrTy(const Type *Ty, Constant *C,
- IndexTy const *Idxs, unsigned NumIdxs,
- bool InBounds);
- static Constant *getExtractElementTy(const Type *Ty, Constant *Val,
- Constant *Idx);
- static Constant *getInsertElementTy(const Type *Ty, Constant *Val,
- Constant *Elt, Constant *Idx);
- static Constant *getShuffleVectorTy(const Type *Ty, Constant *V1,
- Constant *V2, Constant *Mask);
- static Constant *getExtractValueTy(const Type *Ty, Constant *Agg,
- const unsigned *Idxs, unsigned NumIdxs);
- static Constant *getInsertValueTy(const Type *Ty, Constant *Agg,
- Constant *Val,
- const unsigned *Idxs, unsigned NumIdxs);
- template<typename IndexTy>
- static Constant *getGetElementPtrImpl(Constant *C,
- IndexTy const *IdxList,
- unsigned NumIdx, bool InBounds);
-
public:
// Static methods to construct a ConstantExpr of different kinds. Note that
// these methods may return a object that is not an instance of the
@@ -822,9 +767,7 @@ public:
/// Select constant expr
///
- static Constant *getSelect(Constant *C, Constant *V1, Constant *V2) {
- return getSelectTy(V1->getType(), C, V1, V2);
- }
+ static Constant *getSelect(Constant *C, Constant *V1, Constant *V2);
/// get - Return a binary or shift operator constant expression,
/// folding if possible.
@@ -846,7 +789,9 @@ public:
///
static Constant *getGetElementPtr(Constant *C,
Constant *const *IdxList, unsigned NumIdx,
- bool InBounds = false);
+ bool InBounds = false) {
+ return getGetElementPtr(C, (Value**)IdxList, NumIdx, InBounds);
+ }
static Constant *getGetElementPtr(Constant *C,
Value *const *IdxList, unsigned NumIdx,
bool InBounds = false);
@@ -867,14 +812,9 @@ public:
static Constant *getExtractElement(Constant *Vec, Constant *Idx);
static Constant *getInsertElement(Constant *Vec, Constant *Elt,Constant *Idx);
static Constant *getShuffleVector(Constant *V1, Constant *V2, Constant *Mask);
- static Constant *getExtractValue(Constant *Agg,
- const unsigned *IdxList, unsigned NumIdx);
+ static Constant *getExtractValue(Constant *Agg, ArrayRef<unsigned> Idxs);
static Constant *getInsertValue(Constant *Agg, Constant *Val,
- const unsigned *IdxList, unsigned NumIdx);
-
- /// isNullValue - Return true if this is the value that would be returned by
- /// getNullValue.
- virtual bool isNullValue() const { return false; }
+ ArrayRef<unsigned> Idxs);
/// getOpcode - Return the opcode at the root of this constant expression
unsigned getOpcode() const { return getSubclassDataFromValue(); }
@@ -895,10 +835,18 @@ public:
Constant *getWithOperandReplaced(unsigned OpNo, Constant *Op) const;
/// getWithOperands - This returns the current constant expression with the
- /// operands replaced with the specified values. The specified operands must
- /// match count and type with the existing ones.
- Constant *getWithOperands(ArrayRef<Constant*> Ops) const;
-
+ /// operands replaced with the specified values. The specified array must
+ /// have the same number of operands as our current one.
+ Constant *getWithOperands(ArrayRef<Constant*> Ops) const {
+ return getWithOperands(Ops, getType());
+ }
+
+ /// getWithOperands - This returns the current constant expression with the
+ /// operands replaced with the specified values and with the specified result
+ /// type. The specified array must have the same number of operands as our
+ /// current one.
+ Constant *getWithOperands(ArrayRef<Constant*> Ops, const Type *Ty) const;
+
virtual void destroyConstant();
virtual void replaceUsesOfWithOnConstant(Value *From, Value *To, Use *U);
@@ -950,10 +898,6 @@ public:
///
static UndefValue *get(const Type *T);
- /// isNullValue - Return true if this is the value that would be returned by
- /// getNullValue.
- virtual bool isNullValue() const { return false; }
-
virtual void destroyConstant();
/// Methods for support type inquiry through isa, cast, and dyn_cast:
diff --git a/contrib/llvm/include/llvm/DefaultPasses.h b/contrib/llvm/include/llvm/DefaultPasses.h
index e2e58a5b..2e4145b 100644
--- a/contrib/llvm/include/llvm/DefaultPasses.h
+++ b/contrib/llvm/include/llvm/DefaultPasses.h
@@ -29,7 +29,6 @@ extern unsigned char ConstantMergeID;
extern unsigned char CorrelatedValuePropagationID;
extern unsigned char DeadArgEliminationID;
extern unsigned char DeadStoreEliminationID;
-extern unsigned char DeadTypeEliminationID;
extern unsigned char EarlyCSEID;
extern unsigned char FunctionAttrsID;
extern unsigned char FunctionInliningID;
diff --git a/contrib/llvm/include/llvm/DerivedTypes.h b/contrib/llvm/include/llvm/DerivedTypes.h
index f1cb330..acb28de 100644
--- a/contrib/llvm/include/llvm/DerivedTypes.h
+++ b/contrib/llvm/include/llvm/DerivedTypes.h
@@ -19,76 +19,27 @@
#define LLVM_DERIVED_TYPES_H
#include "llvm/Type.h"
-#include "llvm/ADT/ArrayRef.h"
#include "llvm/Support/DataTypes.h"
namespace llvm {
class Value;
-template<class ValType, class TypeClass> class TypeMap;
-class FunctionValType;
-class ArrayValType;
-class StructValType;
-class PointerValType;
-class VectorValType;
-class IntegerValType;
class APInt;
class LLVMContext;
-
-class DerivedType : public Type {
- friend class Type;
-
-protected:
- explicit DerivedType(LLVMContext &C, TypeID id) : Type(C, id) {}
-
- /// notifyUsesThatTypeBecameConcrete - Notify AbstractTypeUsers of this type
- /// that the current type has transitioned from being abstract to being
- /// concrete.
- ///
- void notifyUsesThatTypeBecameConcrete();
-
- /// dropAllTypeUses - When this (abstract) type is resolved to be equal to
- /// another (more concrete) type, we must eliminate all references to other
- /// types, to avoid some circular reference problems.
- ///
- void dropAllTypeUses();
-
-public:
-
- //===--------------------------------------------------------------------===//
- // Abstract Type handling methods - These types have special lifetimes, which
- // are managed by (add|remove)AbstractTypeUser. See comments in
- // AbstractTypeUser.h for more information.
-
- /// refineAbstractTypeTo - This function is used to when it is discovered that
- /// the 'this' abstract type is actually equivalent to the NewType specified.
- /// This causes all users of 'this' to switch to reference the more concrete
- /// type NewType and for 'this' to be deleted.
- ///
- void refineAbstractTypeTo(const Type *NewType);
-
- void dump() const { Type::dump(); }
-
- // Methods for support type inquiry through isa, cast, and dyn_cast:
- static inline bool classof(const DerivedType *) { return true; }
- static inline bool classof(const Type *T) {
- return T->isDerivedType();
- }
-};
+template<typename T> class ArrayRef;
+class StringRef;
/// Class to represent integer types. Note that this class is also used to
/// represent the built-in integer types: Int1Ty, Int8Ty, Int16Ty, Int32Ty and
/// Int64Ty.
/// @brief Integer representation type
-class IntegerType : public DerivedType {
+class IntegerType : public Type {
friend class LLVMContextImpl;
protected:
- explicit IntegerType(LLVMContext &C, unsigned NumBits) :
- DerivedType(C, IntegerTyID) {
+ explicit IntegerType(LLVMContext &C, unsigned NumBits) : Type(C, IntegerTyID){
setSubclassData(NumBits);
}
- friend class TypeMap<IntegerValType, IntegerType>;
public:
/// This enum is just used to hold constants we need for IntegerType.
enum {
@@ -103,7 +54,7 @@ public:
/// that instance will be returned. Otherwise a new one will be created. Only
/// one instance with a given NumBits value is ever created.
/// @brief Get or create an IntegerType instance.
- static const IntegerType* get(LLVMContext &C, unsigned NumBits);
+ static IntegerType *get(LLVMContext &C, unsigned NumBits);
/// @brief Get the number of bits in this IntegerType
unsigned getBitWidth() const { return getSubclassData(); }
@@ -132,7 +83,7 @@ public:
/// @brief Is this a power-of-2 byte-width IntegerType ?
bool isPowerOf2ByteWidth() const;
- // Methods for support type inquiry through isa, cast, and dyn_cast:
+ // Methods for support type inquiry through isa, cast, and dyn_cast.
static inline bool classof(const IntegerType *) { return true; }
static inline bool classof(const Type *T) {
return T->getTypeID() == IntegerTyID;
@@ -142,34 +93,22 @@ public:
/// FunctionType - Class to represent function types
///
-class FunctionType : public DerivedType {
- friend class TypeMap<FunctionValType, FunctionType>;
- bool isVarArgs;
-
+class FunctionType : public Type {
FunctionType(const FunctionType &); // Do not implement
const FunctionType &operator=(const FunctionType &); // Do not implement
- FunctionType(const Type *Result, ArrayRef<const Type*> Params,
- bool IsVarArgs);
+ FunctionType(const Type *Result, ArrayRef<Type*> Params, bool IsVarArgs);
public:
/// FunctionType::get - This static method is the primary way of constructing
/// a FunctionType.
///
- static FunctionType *get(
- const Type *Result, ///< The result type
- ArrayRef<const Type*> Params, ///< The types of the parameters
- bool isVarArg ///< Whether this is a variable argument length function
- );
+ static FunctionType *get(const Type *Result,
+ ArrayRef<Type*> Params, bool isVarArg);
/// FunctionType::get - Create a FunctionType taking no parameters.
///
- static FunctionType *get(
- const Type *Result, ///< The result type
- bool isVarArg ///< Whether this is a variable argument length function
- ) {
- return get(Result, ArrayRef<const Type *>(), isVarArg);
- }
-
+ static FunctionType *get(const Type *Result, bool isVarArg);
+
/// isValidReturnType - Return true if the specified type is valid as a return
/// type.
static bool isValidReturnType(const Type *RetTy);
@@ -178,26 +117,22 @@ public:
/// argument type.
static bool isValidArgumentType(const Type *ArgTy);
- inline bool isVarArg() const { return isVarArgs; }
- inline const Type *getReturnType() const { return ContainedTys[0]; }
+ bool isVarArg() const { return getSubclassData(); }
+ Type *getReturnType() const { return ContainedTys[0]; }
typedef Type::subtype_iterator param_iterator;
param_iterator param_begin() const { return ContainedTys + 1; }
param_iterator param_end() const { return &ContainedTys[NumContainedTys]; }
- // Parameter type accessors...
- const Type *getParamType(unsigned i) const { return ContainedTys[i+1]; }
+ // Parameter type accessors.
+ Type *getParamType(unsigned i) const { return ContainedTys[i+1]; }
/// getNumParams - Return the number of fixed parameters this function type
/// requires. This does not consider varargs.
///
unsigned getNumParams() const { return NumContainedTys - 1; }
- // Implement the AbstractTypeUser interface.
- virtual void refineAbstractType(const DerivedType *OldTy, const Type *NewTy);
- virtual void typeBecameConcrete(const DerivedType *AbsTy);
-
- // Methods for support type inquiry through isa, cast, and dyn_cast:
+ // Methods for support type inquiry through isa, cast, and dyn_cast.
static inline bool classof(const FunctionType *) { return true; }
static inline bool classof(const Type *T) {
return T->getTypeID() == FunctionTyID;
@@ -206,22 +141,21 @@ public:
/// CompositeType - Common super class of ArrayType, StructType, PointerType
-/// and VectorType
-class CompositeType : public DerivedType {
+/// and VectorType.
+class CompositeType : public Type {
protected:
- inline explicit CompositeType(LLVMContext &C, TypeID id) :
- DerivedType(C, id) { }
+ explicit CompositeType(LLVMContext &C, TypeID tid) : Type(C, tid) { }
public:
/// getTypeAtIndex - Given an index value into the type, return the type of
/// the element.
///
- virtual const Type *getTypeAtIndex(const Value *V) const = 0;
- virtual const Type *getTypeAtIndex(unsigned Idx) const = 0;
- virtual bool indexValid(const Value *V) const = 0;
- virtual bool indexValid(unsigned Idx) const = 0;
+ Type *getTypeAtIndex(const Value *V) const;
+ Type *getTypeAtIndex(unsigned Idx) const;
+ bool indexValid(const Value *V) const;
+ bool indexValid(unsigned Idx) const;
- // Methods for support type inquiry through isa, cast, and dyn_cast:
+ // Methods for support type inquiry through isa, cast, and dyn_cast.
static inline bool classof(const CompositeType *) { return true; }
static inline bool classof(const Type *T) {
return T->getTypeID() == ArrayTyID ||
@@ -232,69 +166,114 @@ public:
};
-/// StructType - Class to represent struct types
+/// StructType - Class to represent struct types, both normal and packed.
+/// Besides being optionally packed, structs can be either "anonymous" or may
+/// have an identity. Anonymous structs are uniqued by structural equivalence,
+/// but types are each unique when created, and optionally have a name.
///
class StructType : public CompositeType {
- friend class TypeMap<StructValType, StructType>;
StructType(const StructType &); // Do not implement
const StructType &operator=(const StructType &); // Do not implement
- StructType(LLVMContext &C, ArrayRef<const Type*> Types, bool isPacked);
+ StructType(LLVMContext &C)
+ : CompositeType(C, StructTyID), SymbolTableEntry(0) {}
+ enum {
+ // This is the contents of the SubClassData field.
+ SCDB_HasBody = 1,
+ SCDB_Packed = 2,
+ SCDB_IsAnonymous = 4
+ };
+
+ /// SymbolTableEntry - For a named struct that actually has a name, this is a
+ /// pointer to the symbol table entry (maintained by LLVMContext) for the
+ /// struct. This is null if the type is an anonymous struct or if it is
+ /// a named type that has an empty name.
+ ///
+ void *SymbolTableEntry;
public:
+ ~StructType() {
+ delete [] ContainedTys; // Delete the body.
+ }
+
+ /// StructType::createNamed - This creates a named struct with no body
+ /// specified. If the name is empty, it creates an unnamed struct, which has
+ /// a unique identity but no actual name.
+ static StructType *createNamed(LLVMContext &Context, StringRef Name);
+
+ static StructType *createNamed(StringRef Name, ArrayRef<Type*> Elements,
+ bool isPacked = false);
+ static StructType *createNamed(LLVMContext &Context, StringRef Name,
+ ArrayRef<Type*> Elements,
+ bool isPacked = false);
+ static StructType *createNamed(StringRef Name, Type *elt1, ...) END_WITH_NULL;
+
/// StructType::get - This static method is the primary way to create a
/// StructType.
- ///
- static StructType *get(LLVMContext &Context,
- ArrayRef<const Type*> Params,
- bool isPacked=false);
+ static StructType *get(LLVMContext &Context, ArrayRef<Type*> Elements,
+ bool isPacked = false);
/// StructType::get - Create an empty structure type.
///
- static StructType *get(LLVMContext &Context, bool isPacked=false) {
- return get(Context, llvm::ArrayRef<const Type*>(), isPacked);
- }
+ static StructType *get(LLVMContext &Context, bool isPacked = false);
+
+ /// StructType::get - This static method is a convenience method for creating
+ /// structure types by specifying the elements as arguments. Note that this
+ /// method always returns a non-packed struct, and requires at least one
+ /// element type.
+ static StructType *get(Type *elt1, ...) END_WITH_NULL;
- /// StructType::get - This static method is a convenience method for
- /// creating structure types by specifying the elements as arguments.
- /// Note that this method always returns a non-packed struct. To get
- /// an empty struct, pass NULL, NULL.
- static StructType *get(LLVMContext &Context,
- const Type *type, ...) END_WITH_NULL;
+ bool isPacked() const { return (getSubclassData() & SCDB_Packed) != 0; }
+
+ /// isAnonymous - Return true if this type is uniqued by structural
+ /// equivalence, false if it has an identity.
+ bool isAnonymous() const {return (getSubclassData() & SCDB_IsAnonymous) != 0;}
+
+ /// isOpaque - Return true if this is a type with an identity that has no body
+ /// specified yet. These prints as 'opaque' in .ll files.
+ bool isOpaque() const { return (getSubclassData() & SCDB_HasBody) == 0; }
+
+ /// hasName - Return true if this is a named struct that has a non-empty name.
+ bool hasName() const { return SymbolTableEntry != 0; }
+
+ /// getName - Return the name for this struct type if it has an identity.
+ /// This may return an empty string for an unnamed struct type. Do not call
+ /// this on an anonymous type.
+ StringRef getName() const;
+
+ /// setName - Change the name of this type to the specified name, or to a name
+ /// with a suffix if there is a collision. Do not call this on an anonymous
+ /// type.
+ void setName(StringRef Name);
+ /// setBody - Specify a body for an opaque type.
+ void setBody(ArrayRef<Type*> Elements, bool isPacked = false);
+ void setBody(Type *elt1, ...) END_WITH_NULL;
+
/// isValidElementType - Return true if the specified type is valid as a
/// element type.
static bool isValidElementType(const Type *ElemTy);
+
- // Iterator access to the elements
+ // Iterator access to the elements.
typedef Type::subtype_iterator element_iterator;
element_iterator element_begin() const { return ContainedTys; }
element_iterator element_end() const { return &ContainedTys[NumContainedTys];}
+ /// isLayoutIdentical - Return true if this is layout identical to the
+ /// specified struct.
+ bool isLayoutIdentical(const StructType *Other) const;
+
// Random access to the elements
unsigned getNumElements() const { return NumContainedTys; }
- const Type *getElementType(unsigned N) const {
+ Type *getElementType(unsigned N) const {
assert(N < NumContainedTys && "Element number out of range!");
return ContainedTys[N];
}
- /// getTypeAtIndex - Given an index value into the type, return the type of
- /// the element. For a structure type, this must be a constant value...
- ///
- virtual const Type *getTypeAtIndex(const Value *V) const;
- virtual const Type *getTypeAtIndex(unsigned Idx) const;
- virtual bool indexValid(const Value *V) const;
- virtual bool indexValid(unsigned Idx) const;
-
- // Implement the AbstractTypeUser interface.
- virtual void refineAbstractType(const DerivedType *OldTy, const Type *NewTy);
- virtual void typeBecameConcrete(const DerivedType *AbsTy);
-
- // Methods for support type inquiry through isa, cast, and dyn_cast:
+ // Methods for support type inquiry through isa, cast, and dyn_cast.
static inline bool classof(const StructType *) { return true; }
static inline bool classof(const Type *T) {
return T->getTypeID() == StructTyID;
}
-
- bool isPacked() const { return (0 != getSubclassData()) ? true : false; }
};
/// SequentialType - This is the superclass of the array, pointer and vector
@@ -306,38 +285,21 @@ public:
/// components out in memory identically.
///
class SequentialType : public CompositeType {
- PATypeHandle ContainedType; ///< Storage for the single contained type
+ Type *ContainedType; ///< Storage for the single contained type.
SequentialType(const SequentialType &); // Do not implement!
const SequentialType &operator=(const SequentialType &); // Do not implement!
- // avoiding warning: 'this' : used in base member initializer list
- SequentialType* this_() { return this; }
protected:
- SequentialType(TypeID TID, const Type *ElType)
- : CompositeType(ElType->getContext(), TID), ContainedType(ElType, this_()) {
+ SequentialType(TypeID TID, Type *ElType)
+ : CompositeType(ElType->getContext(), TID), ContainedType(ElType) {
ContainedTys = &ContainedType;
NumContainedTys = 1;
}
public:
- inline const Type *getElementType() const { return ContainedTys[0]; }
-
- virtual bool indexValid(const Value *V) const;
- virtual bool indexValid(unsigned) const {
- return true;
- }
-
- /// getTypeAtIndex - Given an index value into the type, return the type of
- /// the element. For sequential types, there is only one subtype...
- ///
- virtual const Type *getTypeAtIndex(const Value *) const {
- return ContainedTys[0];
- }
- virtual const Type *getTypeAtIndex(unsigned) const {
- return ContainedTys[0];
- }
+ Type *getElementType() const { return ContainedTys[0]; }
- // Methods for support type inquiry through isa, cast, and dyn_cast:
+ // Methods for support type inquiry through isa, cast, and dyn_cast.
static inline bool classof(const SequentialType *) { return true; }
static inline bool classof(const Type *T) {
return T->getTypeID() == ArrayTyID ||
@@ -347,15 +309,14 @@ public:
};
-/// ArrayType - Class to represent array types
+/// ArrayType - Class to represent array types.
///
class ArrayType : public SequentialType {
- friend class TypeMap<ArrayValType, ArrayType>;
uint64_t NumElements;
ArrayType(const ArrayType &); // Do not implement
const ArrayType &operator=(const ArrayType &); // Do not implement
- ArrayType(const Type *ElType, uint64_t NumEl);
+ ArrayType(Type *ElType, uint64_t NumEl);
public:
/// ArrayType::get - This static method is the primary way to construct an
/// ArrayType
@@ -366,31 +327,26 @@ public:
/// element type.
static bool isValidElementType(const Type *ElemTy);
- inline uint64_t getNumElements() const { return NumElements; }
+ uint64_t getNumElements() const { return NumElements; }
- // Implement the AbstractTypeUser interface.
- virtual void refineAbstractType(const DerivedType *OldTy, const Type *NewTy);
- virtual void typeBecameConcrete(const DerivedType *AbsTy);
-
- // Methods for support type inquiry through isa, cast, and dyn_cast:
+ // Methods for support type inquiry through isa, cast, and dyn_cast.
static inline bool classof(const ArrayType *) { return true; }
static inline bool classof(const Type *T) {
return T->getTypeID() == ArrayTyID;
}
};
-/// VectorType - Class to represent vector types
+/// VectorType - Class to represent vector types.
///
class VectorType : public SequentialType {
- friend class TypeMap<VectorValType, VectorType>;
unsigned NumElements;
VectorType(const VectorType &); // Do not implement
const VectorType &operator=(const VectorType &); // Do not implement
- VectorType(const Type *ElType, unsigned NumEl);
+ VectorType(Type *ElType, unsigned NumEl);
public:
/// VectorType::get - This static method is the primary way to construct an
- /// VectorType
+ /// VectorType.
///
static VectorType *get(const Type *ElementType, unsigned NumElements);
@@ -400,7 +356,7 @@ public:
///
static VectorType *getInteger(const VectorType *VTy) {
unsigned EltBits = VTy->getElementType()->getPrimitiveSizeInBits();
- const Type *EltTy = IntegerType::get(VTy->getContext(), EltBits);
+ Type *EltTy = IntegerType::get(VTy->getContext(), EltBits);
return VectorType::get(EltTy, VTy->getNumElements());
}
@@ -410,7 +366,7 @@ public:
///
static VectorType *getExtendedElementVectorType(const VectorType *VTy) {
unsigned EltBits = VTy->getElementType()->getPrimitiveSizeInBits();
- const Type *EltTy = IntegerType::get(VTy->getContext(), EltBits * 2);
+ Type *EltTy = IntegerType::get(VTy->getContext(), EltBits * 2);
return VectorType::get(EltTy, VTy->getNumElements());
}
@@ -422,7 +378,7 @@ public:
unsigned EltBits = VTy->getElementType()->getPrimitiveSizeInBits();
assert((EltBits & 1) == 0 &&
"Cannot truncate vector element with odd bit-width");
- const Type *EltTy = IntegerType::get(VTy->getContext(), EltBits / 2);
+ Type *EltTy = IntegerType::get(VTy->getContext(), EltBits / 2);
return VectorType::get(EltTy, VTy->getNumElements());
}
@@ -431,18 +387,14 @@ public:
static bool isValidElementType(const Type *ElemTy);
/// @brief Return the number of elements in the Vector type.
- inline unsigned getNumElements() const { return NumElements; }
+ unsigned getNumElements() const { return NumElements; }
/// @brief Return the number of bits in the Vector type.
- inline unsigned getBitWidth() const {
+ unsigned getBitWidth() const {
return NumElements * getElementType()->getPrimitiveSizeInBits();
}
- // Implement the AbstractTypeUser interface.
- virtual void refineAbstractType(const DerivedType *OldTy, const Type *NewTy);
- virtual void typeBecameConcrete(const DerivedType *AbsTy);
-
- // Methods for support type inquiry through isa, cast, and dyn_cast:
+ // Methods for support type inquiry through isa, cast, and dyn_cast.
static inline bool classof(const VectorType *) { return true; }
static inline bool classof(const Type *T) {
return T->getTypeID() == VectorTyID;
@@ -450,15 +402,12 @@ public:
};
-/// PointerType - Class to represent pointers
+/// PointerType - Class to represent pointers.
///
class PointerType : public SequentialType {
- friend class TypeMap<PointerValType, PointerType>;
- unsigned AddressSpace;
-
PointerType(const PointerType &); // Do not implement
const PointerType &operator=(const PointerType &); // Do not implement
- explicit PointerType(const Type *ElType, unsigned AddrSpace);
+ explicit PointerType(Type *ElType, unsigned AddrSpace);
public:
/// PointerType::get - This constructs a pointer to an object of the specified
/// type in a numbered address space.
@@ -475,39 +424,15 @@ public:
static bool isValidElementType(const Type *ElemTy);
/// @brief Return the address space of the Pointer type.
- inline unsigned getAddressSpace() const { return AddressSpace; }
-
- // Implement the AbstractTypeUser interface.
- virtual void refineAbstractType(const DerivedType *OldTy, const Type *NewTy);
- virtual void typeBecameConcrete(const DerivedType *AbsTy);
+ inline unsigned getAddressSpace() const { return getSubclassData(); }
- // Implement support type inquiry through isa, cast, and dyn_cast:
+ // Implement support type inquiry through isa, cast, and dyn_cast.
static inline bool classof(const PointerType *) { return true; }
static inline bool classof(const Type *T) {
return T->getTypeID() == PointerTyID;
}
};
-
-/// OpaqueType - Class to represent abstract types
-///
-class OpaqueType : public DerivedType {
- friend class LLVMContextImpl;
- OpaqueType(const OpaqueType &); // DO NOT IMPLEMENT
- const OpaqueType &operator=(const OpaqueType &); // DO NOT IMPLEMENT
- OpaqueType(LLVMContext &C);
-public:
- /// OpaqueType::get - Static factory method for the OpaqueType class...
- ///
- static OpaqueType *get(LLVMContext &C);
-
- // Implement support for type inquiry through isa, cast, and dyn_cast:
- static inline bool classof(const OpaqueType *) { return true; }
- static inline bool classof(const Type *T) {
- return T->getTypeID() == OpaqueTyID;
- }
-};
-
} // End llvm namespace
#endif
diff --git a/contrib/llvm/include/llvm/ExecutionEngine/RuntimeDyld.h b/contrib/llvm/include/llvm/ExecutionEngine/RuntimeDyld.h
index 3dc65e3..724b9f0 100644
--- a/contrib/llvm/include/llvm/ExecutionEngine/RuntimeDyld.h
+++ b/contrib/llvm/include/llvm/ExecutionEngine/RuntimeDyld.h
@@ -53,6 +53,7 @@ class RuntimeDyld {
// RuntimeDyldImpl is the actual class. RuntimeDyld is just the public
// interface.
RuntimeDyldImpl *Dyld;
+ RTDyldMemoryManager *MM;
public:
RuntimeDyld(RTDyldMemoryManager*);
~RuntimeDyld();
diff --git a/contrib/llvm/include/llvm/Function.h b/contrib/llvm/include/llvm/Function.h
index 1edc176..0aa5b2a 100644
--- a/contrib/llvm/include/llvm/Function.h
+++ b/contrib/llvm/include/llvm/Function.h
@@ -128,8 +128,8 @@ public:
~Function();
- const Type *getReturnType() const; // Return the type of the ret val
- const FunctionType *getFunctionType() const; // Return the FunctionType for me
+ Type *getReturnType() const; // Return the type of the ret val
+ FunctionType *getFunctionType() const; // Return the FunctionType for me
/// getContext - Return a pointer to the LLVMContext associated with this
/// function, or NULL if this function is not bound to a context yet.
@@ -139,12 +139,6 @@ public:
/// arguments.
bool isVarArg() const;
- /// isDeclaration - Is the body of this function unknown? (The basic block
- /// list is empty if so.) This is true for function declarations, but not
- /// true for function definitions.
- ///
- virtual bool isDeclaration() const { return BasicBlocks.empty(); }
-
/// getIntrinsicID - This method returns the ID number of the specified
/// function, or Intrinsic::not_intrinsic if the function is not an
/// instrinsic, or if the pointer is null. This value is always defined to be
diff --git a/contrib/llvm/include/llvm/GlobalAlias.h b/contrib/llvm/include/llvm/GlobalAlias.h
index f4af5b1..c3d3c38 100644
--- a/contrib/llvm/include/llvm/GlobalAlias.h
+++ b/contrib/llvm/include/llvm/GlobalAlias.h
@@ -47,11 +47,6 @@ public:
/// Provide fast operand accessors
DECLARE_TRANSPARENT_OPERAND_ACCESSORS(Value);
- /// isDeclaration - Is this global variable lacking an initializer? If so,
- /// the global variable is defined in some other translation unit, and is thus
- /// only a declaration here.
- virtual bool isDeclaration() const;
-
/// removeFromParent - This method unlinks 'this' from the containing module,
/// but does not delete it.
///
@@ -63,23 +58,23 @@ public:
virtual void eraseFromParent();
/// set/getAliasee - These methods retrive and set alias target.
- void setAliasee(Constant* GV);
- const Constant* getAliasee() const {
+ void setAliasee(Constant *GV);
+ const Constant *getAliasee() const {
return cast_or_null<Constant>(getOperand(0));
}
- Constant* getAliasee() {
+ Constant *getAliasee() {
return cast_or_null<Constant>(getOperand(0));
}
/// getAliasedGlobal() - Aliasee can be either global or bitcast of
/// global. This method retrives the global for both aliasee flavours.
- const GlobalValue* getAliasedGlobal() const;
+ const GlobalValue *getAliasedGlobal() const;
/// resolveAliasedGlobal() - This method tries to ultimately resolve the alias
/// by going through the aliasing chain and trying to find the very last
/// global. Returns NULL if a cycle was found. If stopOnWeak is false, then
/// the whole chain aliasing chain is traversed, otherwise - only strong
/// aliases.
- const GlobalValue* resolveAliasedGlobal(bool stopOnWeak = true) const;
+ const GlobalValue *resolveAliasedGlobal(bool stopOnWeak = true) const;
// Methods for support type inquiry through isa, cast, and dyn_cast:
static inline bool classof(const GlobalAlias *) { return true; }
diff --git a/contrib/llvm/include/llvm/GlobalValue.h b/contrib/llvm/include/llvm/GlobalValue.h
index b184b8e..d0f0888 100644
--- a/contrib/llvm/include/llvm/GlobalValue.h
+++ b/contrib/llvm/include/llvm/GlobalValue.h
@@ -106,8 +106,8 @@ public:
bool use_empty_except_constants();
/// getType - Global values are always pointers.
- inline const PointerType *getType() const {
- return reinterpret_cast<const PointerType*>(User::getType());
+ inline PointerType *getType() const {
+ return reinterpret_cast<PointerType*>(User::getType());
}
static LinkageTypes getLinkOnceLinkage(bool ODR) {
@@ -258,16 +258,12 @@ public:
/// @}
- /// Override from Constant class. No GlobalValue's are null values so this
- /// always returns false.
- virtual bool isNullValue() const { return false; }
-
/// Override from Constant class.
virtual void destroyConstant();
/// isDeclaration - Return true if the primary definition of this global
- /// value is outside of the current translation unit...
- virtual bool isDeclaration() const = 0;
+ /// value is outside of the current translation unit.
+ bool isDeclaration() const;
/// removeFromParent - This method unlinks 'this' from the containing module,
/// but does not delete it.
diff --git a/contrib/llvm/include/llvm/GlobalVariable.h b/contrib/llvm/include/llvm/GlobalVariable.h
index 442e0c0..bbc09c1 100644
--- a/contrib/llvm/include/llvm/GlobalVariable.h
+++ b/contrib/llvm/include/llvm/GlobalVariable.h
@@ -68,11 +68,6 @@ public:
/// Provide fast operand accessors
DECLARE_TRANSPARENT_OPERAND_ACCESSORS(Value);
- /// isDeclaration - Is this global variable lacking an initializer? If so,
- /// the global variable is defined in some other translation unit, and is thus
- /// only a declaration here.
- virtual bool isDeclaration() const { return getNumOperands() == 0; }
-
/// hasInitializer - Unless a global variable isExternal(), it has an
/// initializer. The initializer for the global variable/constant is held by
/// Initializer if an initializer is specified.
@@ -119,7 +114,7 @@ public:
/// illegal to call this method if the global is external, because we cannot
/// tell what the value is initialized to!
///
- inline /*const FIXME*/ Constant *getInitializer() const {
+ inline const Constant *getInitializer() const {
assert(hasInitializer() && "GV doesn't have initializer!");
return static_cast<Constant*>(Op<0>().get());
}
diff --git a/contrib/llvm/include/llvm/InitializePasses.h b/contrib/llvm/include/llvm/InitializePasses.h
index 372eaba..4caf8f1 100644
--- a/contrib/llvm/include/llvm/InitializePasses.h
+++ b/contrib/llvm/include/llvm/InitializePasses.h
@@ -65,6 +65,7 @@ void initializeArgPromotionPass(PassRegistry&);
void initializeBasicAliasAnalysisPass(PassRegistry&);
void initializeBasicCallGraphPass(PassRegistry&);
void initializeBlockExtractorPassPass(PassRegistry&);
+void initializeBlockFrequencyPass(PassRegistry&);
void initializeBlockPlacementPass(PassRegistry&);
void initializeBranchProbabilityInfoPass(PassRegistry&);
void initializeBreakCriticalEdgesPass(PassRegistry&);
@@ -83,7 +84,6 @@ void initializeDAEPass(PassRegistry&);
void initializeDAHPass(PassRegistry&);
void initializeDCEPass(PassRegistry&);
void initializeDSEPass(PassRegistry&);
-void initializeDTEPass(PassRegistry&);
void initializeDeadInstEliminationPass(PassRegistry&);
void initializeDeadMachineInstructionElimPass(PassRegistry&);
void initializeDomOnlyPrinterPass(PassRegistry&);
@@ -140,10 +140,13 @@ void initializeLoopUnrollPass(PassRegistry&);
void initializeLoopUnswitchPass(PassRegistry&);
void initializeLoopIdiomRecognizePass(PassRegistry&);
void initializeLowerAtomicPass(PassRegistry&);
+void initializeLowerExpectIntrinsicPass(PassRegistry&);
void initializeLowerIntrinsicsPass(PassRegistry&);
void initializeLowerInvokePass(PassRegistry&);
void initializeLowerSetJmpPass(PassRegistry&);
void initializeLowerSwitchPass(PassRegistry&);
+void initializeMachineBlockFrequencyPass(PassRegistry&);
+void initializeMachineBranchProbabilityInfoPass(PassRegistry&);
void initializeMachineCSEPass(PassRegistry&);
void initializeMachineDominatorTreePass(PassRegistry&);
void initializeMachineLICMPass(PassRegistry&);
@@ -160,6 +163,10 @@ void initializeModuleDebugInfoPrinterPass(PassRegistry&);
void initializeNoAAPass(PassRegistry&);
void initializeNoProfileInfoPass(PassRegistry&);
void initializeNoPathProfileInfoPass(PassRegistry&);
+void initializeObjCARCAliasAnalysisPass(PassRegistry&);
+void initializeObjCARCExpandPass(PassRegistry&);
+void initializeObjCARCContractPass(PassRegistry&);
+void initializeObjCARCOptPass(PassRegistry&);
void initializeOptimalEdgeProfilerPass(PassRegistry&);
void initializeOptimizePHIsPass(PassRegistry&);
void initializePEIPass(PassRegistry&);
@@ -171,7 +178,6 @@ void initializePostDomOnlyViewerPass(PassRegistry&);
void initializePostDomPrinterPass(PassRegistry&);
void initializePostDomViewerPass(PassRegistry&);
void initializePostDominatorTreePass(PassRegistry&);
-void initializePreAllocSplittingPass(PassRegistry&);
void initializePreVerifierPass(PassRegistry&);
void initializePrintDbgInfoPass(PassRegistry&);
void initializePrintFunctionPassPass(PassRegistry&);
@@ -192,7 +198,6 @@ void initializeRegionOnlyPrinterPass(PassRegistry&);
void initializeRegionOnlyViewerPass(PassRegistry&);
void initializeRegionPrinterPass(PassRegistry&);
void initializeRegionViewerPass(PassRegistry&);
-void initializeRegisterCoalescerAnalysisGroup(PassRegistry&);
void initializeRenderMachineFunctionPass(PassRegistry&);
void initializeSCCPPass(PassRegistry&);
void initializeSROA_DTPass(PassRegistry&);
@@ -200,7 +205,7 @@ void initializeSROA_SSAUpPass(PassRegistry&);
void initializeScalarEvolutionAliasAnalysisPass(PassRegistry&);
void initializeScalarEvolutionPass(PassRegistry&);
void initializeSimpleInlinerPass(PassRegistry&);
-void initializeSimpleRegisterCoalescingPass(PassRegistry&);
+void initializeRegisterCoalescerPass(PassRegistry&);
void initializeSimplifyLibCallsPass(PassRegistry&);
void initializeSingleLoopExtractorPass(PassRegistry&);
void initializeSinkingPass(PassRegistry&);
diff --git a/contrib/llvm/include/llvm/InlineAsm.h b/contrib/llvm/include/llvm/InlineAsm.h
index ed8f0f7..a98aff1 100644
--- a/contrib/llvm/include/llvm/InlineAsm.h
+++ b/contrib/llvm/include/llvm/InlineAsm.h
@@ -25,15 +25,16 @@ class PointerType;
class FunctionType;
class Module;
struct InlineAsmKeyType;
-template<class ValType, class TypeClass, class ConstantClass, bool HasLargeKey>
+template<class ValType, class ValRefType, class TypeClass, class ConstantClass,
+ bool HasLargeKey>
class ConstantUniqueMap;
template<class ConstantClass, class TypeClass, class ValType>
struct ConstantCreator;
class InlineAsm : public Value {
friend struct ConstantCreator<InlineAsm, PointerType, InlineAsmKeyType>;
- friend class ConstantUniqueMap<InlineAsmKeyType, PointerType, InlineAsm,
- false>;
+ friend class ConstantUniqueMap<InlineAsmKeyType, const InlineAsmKeyType&,
+ PointerType, InlineAsm, false>;
InlineAsm(const InlineAsm &); // do not implement
void operator=(const InlineAsm&); // do not implement
@@ -63,13 +64,13 @@ public:
/// getType - InlineAsm's are always pointers.
///
- const PointerType *getType() const {
- return reinterpret_cast<const PointerType*>(Value::getType());
+ PointerType *getType() const {
+ return reinterpret_cast<PointerType*>(Value::getType());
}
/// getFunctionType - InlineAsm's are always pointers to functions.
///
- const FunctionType *getFunctionType() const;
+ FunctionType *getFunctionType() const;
const std::string &getAsmString() const { return AsmString; }
const std::string &getConstraintString() const { return Constraints; }
@@ -187,25 +188,32 @@ public:
// in the backend.
enum {
+ // Fixed operands on an INLINEASM SDNode.
Op_InputChain = 0,
Op_AsmString = 1,
Op_MDNode = 2,
Op_ExtraInfo = 3, // HasSideEffects, IsAlignStack
Op_FirstOperand = 4,
+ // Fixed operands on an INLINEASM MachineInstr.
MIOp_AsmString = 0,
MIOp_ExtraInfo = 1, // HasSideEffects, IsAlignStack
MIOp_FirstOperand = 2,
+ // Interpretation of the MIOp_ExtraInfo bit field.
Extra_HasSideEffects = 1,
Extra_IsAlignStack = 2,
-
- Kind_RegUse = 1,
- Kind_RegDef = 2,
- Kind_Imm = 3,
- Kind_Mem = 4,
- Kind_RegDefEarlyClobber = 6,
-
+
+ // Inline asm operands map to multiple SDNode / MachineInstr operands.
+ // The first operand is an immediate describing the asm operand, the low
+ // bits is the kind:
+ Kind_RegUse = 1, // Input register, "r".
+ Kind_RegDef = 2, // Output register, "=r".
+ Kind_RegDefEarlyClobber = 3, // Early-clobber output register, "=&r".
+ Kind_Clobber = 4, // Clobbered register, "~r".
+ Kind_Imm = 5, // Immediate.
+ Kind_Mem = 6, // Memory operand, "m".
+
Flag_MatchingOperand = 0x80000000
};
@@ -232,7 +240,10 @@ public:
static bool isRegDefEarlyClobberKind(unsigned Flag) {
return getKind(Flag) == Kind_RegDefEarlyClobber;
}
-
+ static bool isClobberKind(unsigned Flag) {
+ return getKind(Flag) == Kind_Clobber;
+ }
+
/// getNumOperandRegisters - Extract the number of registers field from the
/// inline asm operand flag.
static unsigned getNumOperandRegisters(unsigned Flag) {
diff --git a/contrib/llvm/include/llvm/Instructions.h b/contrib/llvm/include/llvm/Instructions.h
index 54dfe39..0bc9a3b 100644
--- a/contrib/llvm/include/llvm/Instructions.h
+++ b/contrib/llvm/include/llvm/Instructions.h
@@ -20,6 +20,7 @@
#include "llvm/DerivedTypes.h"
#include "llvm/Attributes.h"
#include "llvm/CallingConv.h"
+#include "llvm/ADT/ArrayRef.h"
#include "llvm/ADT/SmallVector.h"
#include <iterator>
@@ -76,7 +77,7 @@ public:
/// getAllocatedType - Return the type that is being allocated by the
/// instruction.
///
- const Type *getAllocatedType() const;
+ Type *getAllocatedType() const;
/// getAlignment - Return the alignment of the memory that is being allocated
/// by the instruction.
@@ -271,10 +272,10 @@ DEFINE_TRANSPARENT_OPERAND_ACCESSORS(StoreInst, Value)
// GetElementPtrInst Class
//===----------------------------------------------------------------------===//
-// checkType - Simple wrapper function to give a better assertion failure
+// checkGEPType - Simple wrapper function to give a better assertion failure
// message on bad indexes for a gep instruction.
//
-static inline const Type *checkType(const Type *Ty) {
+static inline const Type *checkGEPType(const Type *Ty) {
assert(Ty && "Invalid GetElementPtrInst indices for type!");
return Ty;
}
@@ -315,13 +316,13 @@ class GetElementPtrInst : public Instruction {
/// pointer type.
///
template<typename RandomAccessIterator>
- static const Type *getIndexedType(const Type *Ptr,
- RandomAccessIterator IdxBegin,
- RandomAccessIterator IdxEnd,
- // This argument ensures that we
- // have an iterator we can do
- // arithmetic on in constant time
- std::random_access_iterator_tag) {
+ static Type *getIndexedType(const Type *Ptr,
+ RandomAccessIterator IdxBegin,
+ RandomAccessIterator IdxEnd,
+ // This argument ensures that we
+ // have an iterator we can do
+ // arithmetic on in constant time
+ std::random_access_iterator_tag) {
unsigned NumIdx = static_cast<unsigned>(std::distance(IdxBegin, IdxEnd));
if (NumIdx > 0)
@@ -446,24 +447,22 @@ public:
/// pointer type.
///
template<typename RandomAccessIterator>
- static const Type *getIndexedType(const Type *Ptr,
- RandomAccessIterator IdxBegin,
- RandomAccessIterator IdxEnd) {
+ static Type *getIndexedType(const Type *Ptr, RandomAccessIterator IdxBegin,
+ RandomAccessIterator IdxEnd) {
return getIndexedType(Ptr, IdxBegin, IdxEnd,
typename std::iterator_traits<RandomAccessIterator>::
iterator_category());
}
- static const Type *getIndexedType(const Type *Ptr,
- Value* const *Idx, unsigned NumIdx);
+ // FIXME: Use ArrayRef
+ static Type *getIndexedType(const Type *Ptr,
+ Value* const *Idx, unsigned NumIdx);
+ static Type *getIndexedType(const Type *Ptr,
+ Constant* const *Idx, unsigned NumIdx);
- static const Type *getIndexedType(const Type *Ptr,
- Constant* const *Idx, unsigned NumIdx);
-
- static const Type *getIndexedType(const Type *Ptr,
- uint64_t const *Idx, unsigned NumIdx);
-
- static const Type *getIndexedType(const Type *Ptr, Value *Idx);
+ static Type *getIndexedType(const Type *Ptr,
+ uint64_t const *Idx, unsigned NumIdx);
+ static Type *getIndexedType(const Type *Ptr, Value *Idx);
inline op_iterator idx_begin() { return op_begin()+1; }
inline const_op_iterator idx_begin() const { return op_begin()+1; }
@@ -538,7 +537,7 @@ GetElementPtrInst::GetElementPtrInst(Value *Ptr,
unsigned Values,
const Twine &NameStr,
Instruction *InsertBefore)
- : Instruction(PointerType::get(checkType(
+ : Instruction(PointerType::get(checkGEPType(
getIndexedType(Ptr->getType(),
IdxBegin, IdxEnd)),
cast<PointerType>(Ptr->getType())
@@ -557,7 +556,7 @@ GetElementPtrInst::GetElementPtrInst(Value *Ptr,
unsigned Values,
const Twine &NameStr,
BasicBlock *InsertAtEnd)
- : Instruction(PointerType::get(checkType(
+ : Instruction(PointerType::get(checkGEPType(
getIndexedType(Ptr->getType(),
IdxBegin, IdxEnd)),
cast<PointerType>(Ptr->getType())
@@ -843,46 +842,17 @@ public:
class CallInst : public Instruction {
AttrListPtr AttributeList; ///< parameter attributes for call
CallInst(const CallInst &CI);
- void init(Value *Func, Value* const *Params, unsigned NumParams);
- void init(Value *Func, Value *Actual1, Value *Actual2);
- void init(Value *Func, Value *Actual);
- void init(Value *Func);
-
- template<typename RandomAccessIterator>
- void init(Value *Func,
- RandomAccessIterator ArgBegin,
- RandomAccessIterator ArgEnd,
- const Twine &NameStr,
- // This argument ensures that we have an iterator we can
- // do arithmetic on in constant time
- std::random_access_iterator_tag) {
- unsigned NumArgs = (unsigned)std::distance(ArgBegin, ArgEnd);
-
- // This requires that the iterator points to contiguous memory.
- init(Func, NumArgs ? &*ArgBegin : 0, NumArgs);
- setName(NameStr);
- }
+ void init(Value *Func, ArrayRef<Value *> Args, const Twine &NameStr);
+ void init(Value *Func, const Twine &NameStr);
- /// Construct a CallInst given a range of arguments. RandomAccessIterator
- /// must be a random-access iterator pointing to contiguous storage
- /// (e.g. a std::vector<>::iterator). Checks are made for
- /// random-accessness but not for contiguous storage as that would
- /// incur runtime overhead.
+ /// Construct a CallInst given a range of arguments.
/// @brief Construct a CallInst from a range of arguments
- template<typename RandomAccessIterator>
- CallInst(Value *Func,
- RandomAccessIterator ArgBegin, RandomAccessIterator ArgEnd,
- const Twine &NameStr, Instruction *InsertBefore);
-
- /// Construct a CallInst given a range of arguments. RandomAccessIterator
- /// must be a random-access iterator pointing to contiguous storage
- /// (e.g. a std::vector<>::iterator). Checks are made for
- /// random-accessness but not for contiguous storage as that would
- /// incur runtime overhead.
+ inline CallInst(Value *Func, ArrayRef<Value *> Args,
+ const Twine &NameStr, Instruction *InsertBefore);
+
+ /// Construct a CallInst given a range of arguments.
/// @brief Construct a CallInst from a range of arguments
- template<typename RandomAccessIterator>
- inline CallInst(Value *Func,
- RandomAccessIterator ArgBegin, RandomAccessIterator ArgEnd,
+ inline CallInst(Value *Func, ArrayRef<Value *> Args,
const Twine &NameStr, BasicBlock *InsertAtEnd);
CallInst(Value *F, Value *Actual, const Twine &NameStr,
@@ -895,31 +865,18 @@ class CallInst : public Instruction {
protected:
virtual CallInst *clone_impl() const;
public:
- template<typename RandomAccessIterator>
static CallInst *Create(Value *Func,
- RandomAccessIterator ArgBegin,
- RandomAccessIterator ArgEnd,
+ ArrayRef<Value *> Args,
const Twine &NameStr = "",
Instruction *InsertBefore = 0) {
- return new(unsigned(ArgEnd - ArgBegin + 1))
- CallInst(Func, ArgBegin, ArgEnd, NameStr, InsertBefore);
+ return new(unsigned(Args.size() + 1))
+ CallInst(Func, Args, NameStr, InsertBefore);
}
- template<typename RandomAccessIterator>
static CallInst *Create(Value *Func,
- RandomAccessIterator ArgBegin,
- RandomAccessIterator ArgEnd,
+ ArrayRef<Value *> Args,
const Twine &NameStr, BasicBlock *InsertAtEnd) {
- return new(unsigned(ArgEnd - ArgBegin + 1))
- CallInst(Func, ArgBegin, ArgEnd, NameStr, InsertAtEnd);
- }
- static CallInst *Create(Value *F, Value *Actual,
- const Twine &NameStr = "",
- Instruction *InsertBefore = 0) {
- return new(2) CallInst(F, Actual, NameStr, InsertBefore);
- }
- static CallInst *Create(Value *F, Value *Actual, const Twine &NameStr,
- BasicBlock *InsertAtEnd) {
- return new(2) CallInst(F, Actual, NameStr, InsertAtEnd);
+ return new(unsigned(Args.size() + 1))
+ CallInst(Func, Args, NameStr, InsertAtEnd);
}
static CallInst *Create(Value *F, const Twine &NameStr = "",
Instruction *InsertBefore = 0) {
@@ -1094,32 +1051,24 @@ template <>
struct OperandTraits<CallInst> : public VariadicOperandTraits<CallInst, 1> {
};
-template<typename RandomAccessIterator>
-CallInst::CallInst(Value *Func,
- RandomAccessIterator ArgBegin, RandomAccessIterator ArgEnd,
+CallInst::CallInst(Value *Func, ArrayRef<Value *> Args,
const Twine &NameStr, BasicBlock *InsertAtEnd)
: Instruction(cast<FunctionType>(cast<PointerType>(Func->getType())
->getElementType())->getReturnType(),
Instruction::Call,
- OperandTraits<CallInst>::op_end(this) - (ArgEnd - ArgBegin + 1),
- unsigned(ArgEnd - ArgBegin + 1), InsertAtEnd) {
- init(Func, ArgBegin, ArgEnd, NameStr,
- typename std::iterator_traits<RandomAccessIterator>
- ::iterator_category());
+ OperandTraits<CallInst>::op_end(this) - (Args.size() + 1),
+ unsigned(Args.size() + 1), InsertAtEnd) {
+ init(Func, Args, NameStr);
}
-template<typename RandomAccessIterator>
-CallInst::CallInst(Value *Func,
- RandomAccessIterator ArgBegin, RandomAccessIterator ArgEnd,
+CallInst::CallInst(Value *Func, ArrayRef<Value *> Args,
const Twine &NameStr, Instruction *InsertBefore)
: Instruction(cast<FunctionType>(cast<PointerType>(Func->getType())
->getElementType())->getReturnType(),
Instruction::Call,
- OperandTraits<CallInst>::op_end(this) - (ArgEnd - ArgBegin + 1),
- unsigned(ArgEnd - ArgBegin + 1), InsertBefore) {
- init(Func, ArgBegin, ArgEnd, NameStr,
- typename std::iterator_traits<RandomAccessIterator>
- ::iterator_category());
+ OperandTraits<CallInst>::op_end(this) - (Args.size() + 1),
+ unsigned(Args.size() + 1), InsertBefore) {
+ init(Func, Args, NameStr);
}
@@ -1430,69 +1379,18 @@ class ExtractValueInst : public UnaryInstruction {
SmallVector<unsigned, 4> Indices;
ExtractValueInst(const ExtractValueInst &EVI);
- void init(const unsigned *Idx, unsigned NumIdx,
- const Twine &NameStr);
- void init(unsigned Idx, const Twine &NameStr);
-
- template<typename RandomAccessIterator>
- void init(RandomAccessIterator IdxBegin,
- RandomAccessIterator IdxEnd,
- const Twine &NameStr,
- // This argument ensures that we have an iterator we can
- // do arithmetic on in constant time
- std::random_access_iterator_tag) {
- unsigned NumIdx = static_cast<unsigned>(std::distance(IdxBegin, IdxEnd));
-
- // There's no fundamental reason why we require at least one index
- // (other than weirdness with &*IdxBegin being invalid; see
- // getelementptr's init routine for example). But there's no
- // present need to support it.
- assert(NumIdx > 0 && "ExtractValueInst must have at least one index");
-
- // This requires that the iterator points to contiguous memory.
- init(&*IdxBegin, NumIdx, NameStr); // FIXME: for the general case
- // we have to build an array here
- }
-
- /// getIndexedType - Returns the type of the element that would be extracted
- /// with an extractvalue instruction with the specified parameters.
- ///
- /// Null is returned if the indices are invalid for the specified type.
- ///
- static const Type *getIndexedType(const Type *Agg,
- const unsigned *Idx, unsigned NumIdx);
-
- template<typename RandomAccessIterator>
- static const Type *getIndexedType(const Type *Ptr,
- RandomAccessIterator IdxBegin,
- RandomAccessIterator IdxEnd,
- // This argument ensures that we
- // have an iterator we can do
- // arithmetic on in constant time
- std::random_access_iterator_tag) {
- unsigned NumIdx = static_cast<unsigned>(std::distance(IdxBegin, IdxEnd));
-
- if (NumIdx > 0)
- // This requires that the iterator points to contiguous memory.
- return getIndexedType(Ptr, &*IdxBegin, NumIdx);
- else
- return getIndexedType(Ptr, (const unsigned *)0, NumIdx);
- }
+ void init(ArrayRef<unsigned> Idxs, const Twine &NameStr);
/// Constructors - Create a extractvalue instruction with a base aggregate
/// value and a list of indices. The first ctor can optionally insert before
/// an existing instruction, the second appends the new instruction to the
/// specified BasicBlock.
- template<typename RandomAccessIterator>
inline ExtractValueInst(Value *Agg,
- RandomAccessIterator IdxBegin,
- RandomAccessIterator IdxEnd,
+ ArrayRef<unsigned> Idxs,
const Twine &NameStr,
Instruction *InsertBefore);
- template<typename RandomAccessIterator>
inline ExtractValueInst(Value *Agg,
- RandomAccessIterator IdxBegin,
- RandomAccessIterator IdxEnd,
+ ArrayRef<unsigned> Idxs,
const Twine &NameStr, BasicBlock *InsertAtEnd);
// allocate space for exactly one operand
@@ -1503,54 +1401,25 @@ protected:
virtual ExtractValueInst *clone_impl() const;
public:
- template<typename RandomAccessIterator>
static ExtractValueInst *Create(Value *Agg,
- RandomAccessIterator IdxBegin,
- RandomAccessIterator IdxEnd,
+ ArrayRef<unsigned> Idxs,
const Twine &NameStr = "",
Instruction *InsertBefore = 0) {
return new
- ExtractValueInst(Agg, IdxBegin, IdxEnd, NameStr, InsertBefore);
+ ExtractValueInst(Agg, Idxs, NameStr, InsertBefore);
}
- template<typename RandomAccessIterator>
static ExtractValueInst *Create(Value *Agg,
- RandomAccessIterator IdxBegin,
- RandomAccessIterator IdxEnd,
+ ArrayRef<unsigned> Idxs,
const Twine &NameStr,
BasicBlock *InsertAtEnd) {
- return new ExtractValueInst(Agg, IdxBegin, IdxEnd, NameStr, InsertAtEnd);
- }
-
- /// Constructors - These two creators are convenience methods because one
- /// index extractvalue instructions are much more common than those with
- /// more than one.
- static ExtractValueInst *Create(Value *Agg, unsigned Idx,
- const Twine &NameStr = "",
- Instruction *InsertBefore = 0) {
- unsigned Idxs[1] = { Idx };
- return new ExtractValueInst(Agg, Idxs, Idxs + 1, NameStr, InsertBefore);
- }
- static ExtractValueInst *Create(Value *Agg, unsigned Idx,
- const Twine &NameStr,
- BasicBlock *InsertAtEnd) {
- unsigned Idxs[1] = { Idx };
- return new ExtractValueInst(Agg, Idxs, Idxs + 1, NameStr, InsertAtEnd);
+ return new ExtractValueInst(Agg, Idxs, NameStr, InsertAtEnd);
}
/// getIndexedType - Returns the type of the element that would be extracted
/// with an extractvalue instruction with the specified parameters.
///
/// Null is returned if the indices are invalid for the specified type.
- ///
- template<typename RandomAccessIterator>
- static const Type *getIndexedType(const Type *Ptr,
- RandomAccessIterator IdxBegin,
- RandomAccessIterator IdxEnd) {
- return getIndexedType(Ptr, IdxBegin, IdxEnd,
- typename std::iterator_traits<RandomAccessIterator>::
- iterator_category());
- }
- static const Type *getIndexedType(const Type *Ptr, unsigned Idx);
+ static Type *getIndexedType(const Type *Agg, ArrayRef<unsigned> Idxs);
typedef const unsigned* idx_iterator;
inline idx_iterator idx_begin() const { return Indices.begin(); }
@@ -1566,7 +1435,11 @@ public:
return 0U; // get index for modifying correct operand
}
- unsigned getNumIndices() const { // Note: always non-negative
+ ArrayRef<unsigned> getIndices() const {
+ return Indices;
+ }
+
+ unsigned getNumIndices() const {
return (unsigned)Indices.size();
}
@@ -1584,31 +1457,21 @@ public:
}
};
-template<typename RandomAccessIterator>
ExtractValueInst::ExtractValueInst(Value *Agg,
- RandomAccessIterator IdxBegin,
- RandomAccessIterator IdxEnd,
+ ArrayRef<unsigned> Idxs,
const Twine &NameStr,
Instruction *InsertBefore)
- : UnaryInstruction(checkType(getIndexedType(Agg->getType(),
- IdxBegin, IdxEnd)),
+ : UnaryInstruction(checkGEPType(getIndexedType(Agg->getType(), Idxs)),
ExtractValue, Agg, InsertBefore) {
- init(IdxBegin, IdxEnd, NameStr,
- typename std::iterator_traits<RandomAccessIterator>
- ::iterator_category());
+ init(Idxs, NameStr);
}
-template<typename RandomAccessIterator>
ExtractValueInst::ExtractValueInst(Value *Agg,
- RandomAccessIterator IdxBegin,
- RandomAccessIterator IdxEnd,
+ ArrayRef<unsigned> Idxs,
const Twine &NameStr,
BasicBlock *InsertAtEnd)
- : UnaryInstruction(checkType(getIndexedType(Agg->getType(),
- IdxBegin, IdxEnd)),
+ : UnaryInstruction(checkGEPType(getIndexedType(Agg->getType(), Idxs)),
ExtractValue, Agg, InsertAtEnd) {
- init(IdxBegin, IdxEnd, NameStr,
- typename std::iterator_traits<RandomAccessIterator>
- ::iterator_category());
+ init(Idxs, NameStr);
}
@@ -1624,44 +1487,19 @@ class InsertValueInst : public Instruction {
void *operator new(size_t, unsigned); // Do not implement
InsertValueInst(const InsertValueInst &IVI);
- void init(Value *Agg, Value *Val, const unsigned *Idx, unsigned NumIdx,
+ void init(Value *Agg, Value *Val, ArrayRef<unsigned> Idxs,
const Twine &NameStr);
- void init(Value *Agg, Value *Val, unsigned Idx, const Twine &NameStr);
-
- template<typename RandomAccessIterator>
- void init(Value *Agg, Value *Val,
- RandomAccessIterator IdxBegin, RandomAccessIterator IdxEnd,
- const Twine &NameStr,
- // This argument ensures that we have an iterator we can
- // do arithmetic on in constant time
- std::random_access_iterator_tag) {
- unsigned NumIdx = static_cast<unsigned>(std::distance(IdxBegin, IdxEnd));
-
- // There's no fundamental reason why we require at least one index
- // (other than weirdness with &*IdxBegin being invalid; see
- // getelementptr's init routine for example). But there's no
- // present need to support it.
- assert(NumIdx > 0 && "InsertValueInst must have at least one index");
-
- // This requires that the iterator points to contiguous memory.
- init(Agg, Val, &*IdxBegin, NumIdx, NameStr); // FIXME: for the general case
- // we have to build an array here
- }
/// Constructors - Create a insertvalue instruction with a base aggregate
/// value, a value to insert, and a list of indices. The first ctor can
/// optionally insert before an existing instruction, the second appends
/// the new instruction to the specified BasicBlock.
- template<typename RandomAccessIterator>
inline InsertValueInst(Value *Agg, Value *Val,
- RandomAccessIterator IdxBegin,
- RandomAccessIterator IdxEnd,
+ ArrayRef<unsigned> Idxs,
const Twine &NameStr,
Instruction *InsertBefore);
- template<typename RandomAccessIterator>
inline InsertValueInst(Value *Agg, Value *Val,
- RandomAccessIterator IdxBegin,
- RandomAccessIterator IdxEnd,
+ ArrayRef<unsigned> Idxs,
const Twine &NameStr, BasicBlock *InsertAtEnd);
/// Constructors - These two constructors are convenience methods because one
@@ -1679,37 +1517,17 @@ public:
return User::operator new(s, 2);
}
- template<typename RandomAccessIterator>
static InsertValueInst *Create(Value *Agg, Value *Val,
- RandomAccessIterator IdxBegin,
- RandomAccessIterator IdxEnd,
+ ArrayRef<unsigned> Idxs,
const Twine &NameStr = "",
Instruction *InsertBefore = 0) {
- return new InsertValueInst(Agg, Val, IdxBegin, IdxEnd,
- NameStr, InsertBefore);
+ return new InsertValueInst(Agg, Val, Idxs, NameStr, InsertBefore);
}
- template<typename RandomAccessIterator>
static InsertValueInst *Create(Value *Agg, Value *Val,
- RandomAccessIterator IdxBegin,
- RandomAccessIterator IdxEnd,
+ ArrayRef<unsigned> Idxs,
const Twine &NameStr,
BasicBlock *InsertAtEnd) {
- return new InsertValueInst(Agg, Val, IdxBegin, IdxEnd,
- NameStr, InsertAtEnd);
- }
-
- /// Constructors - These two creators are convenience methods because one
- /// index insertvalue instructions are much more common than those with
- /// more than one.
- static InsertValueInst *Create(Value *Agg, Value *Val, unsigned Idx,
- const Twine &NameStr = "",
- Instruction *InsertBefore = 0) {
- return new InsertValueInst(Agg, Val, Idx, NameStr, InsertBefore);
- }
- static InsertValueInst *Create(Value *Agg, Value *Val, unsigned Idx,
- const Twine &NameStr,
- BasicBlock *InsertAtEnd) {
- return new InsertValueInst(Agg, Val, Idx, NameStr, InsertAtEnd);
+ return new InsertValueInst(Agg, Val, Idxs, NameStr, InsertAtEnd);
}
/// Transparently provide more efficient getOperand methods.
@@ -1739,7 +1557,11 @@ public:
return 1U; // get index for modifying correct operand
}
- unsigned getNumIndices() const { // Note: always non-negative
+ ArrayRef<unsigned> getIndices() const {
+ return Indices;
+ }
+
+ unsigned getNumIndices() const {
return (unsigned)Indices.size();
}
@@ -1762,33 +1584,25 @@ struct OperandTraits<InsertValueInst> :
public FixedNumOperandTraits<InsertValueInst, 2> {
};
-template<typename RandomAccessIterator>
InsertValueInst::InsertValueInst(Value *Agg,
Value *Val,
- RandomAccessIterator IdxBegin,
- RandomAccessIterator IdxEnd,
+ ArrayRef<unsigned> Idxs,
const Twine &NameStr,
Instruction *InsertBefore)
: Instruction(Agg->getType(), InsertValue,
OperandTraits<InsertValueInst>::op_begin(this),
2, InsertBefore) {
- init(Agg, Val, IdxBegin, IdxEnd, NameStr,
- typename std::iterator_traits<RandomAccessIterator>
- ::iterator_category());
+ init(Agg, Val, Idxs, NameStr);
}
-template<typename RandomAccessIterator>
InsertValueInst::InsertValueInst(Value *Agg,
Value *Val,
- RandomAccessIterator IdxBegin,
- RandomAccessIterator IdxEnd,
+ ArrayRef<unsigned> Idxs,
const Twine &NameStr,
BasicBlock *InsertAtEnd)
: Instruction(Agg->getType(), InsertValue,
OperandTraits<InsertValueInst>::op_begin(this),
2, InsertAtEnd) {
- init(Agg, Val, IdxBegin, IdxEnd, NameStr,
- typename std::iterator_traits<RandomAccessIterator>
- ::iterator_category());
+ init(Agg, Val, Idxs, NameStr);
}
DEFINE_TRANSPARENT_OPERAND_ACCESSORS(InsertValueInst, Value)
@@ -1814,7 +1628,7 @@ class PHINode : public Instruction {
explicit PHINode(const Type *Ty, unsigned NumReservedValues,
const Twine &NameStr = "", Instruction *InsertBefore = 0)
: Instruction(Ty, Instruction::PHI, 0, 0, InsertBefore),
- ReservedSpace(NumReservedValues * 2) {
+ ReservedSpace(NumReservedValues) {
setName(NameStr);
OperandList = allocHungoffUses(ReservedSpace);
}
@@ -1822,11 +1636,16 @@ class PHINode : public Instruction {
PHINode(const Type *Ty, unsigned NumReservedValues, const Twine &NameStr,
BasicBlock *InsertAtEnd)
: Instruction(Ty, Instruction::PHI, 0, 0, InsertAtEnd),
- ReservedSpace(NumReservedValues * 2) {
+ ReservedSpace(NumReservedValues) {
setName(NameStr);
OperandList = allocHungoffUses(ReservedSpace);
}
protected:
+ // allocHungoffUses - this is more complicated than the generic
+ // User::allocHungoffUses, because we have to allocate Uses for the incoming
+ // values and pointers to the incoming blocks, all in one allocation.
+ Use *allocHungoffUses(unsigned) const;
+
virtual PHINode *clone_impl() const;
public:
/// Constructors - NumReservedValues is a hint for the number of incoming
@@ -1845,32 +1664,55 @@ public:
/// Provide fast operand accessors
DECLARE_TRANSPARENT_OPERAND_ACCESSORS(Value);
+ // Block iterator interface. This provides access to the list of incoming
+ // basic blocks, which parallels the list of incoming values.
+
+ typedef BasicBlock **block_iterator;
+ typedef BasicBlock * const *const_block_iterator;
+
+ block_iterator block_begin() {
+ Use::UserRef *ref =
+ reinterpret_cast<Use::UserRef*>(op_begin() + ReservedSpace);
+ return reinterpret_cast<block_iterator>(ref + 1);
+ }
+
+ const_block_iterator block_begin() const {
+ const Use::UserRef *ref =
+ reinterpret_cast<const Use::UserRef*>(op_begin() + ReservedSpace);
+ return reinterpret_cast<const_block_iterator>(ref + 1);
+ }
+
+ block_iterator block_end() {
+ return block_begin() + getNumOperands();
+ }
+
+ const_block_iterator block_end() const {
+ return block_begin() + getNumOperands();
+ }
+
/// getNumIncomingValues - Return the number of incoming edges
///
- unsigned getNumIncomingValues() const { return getNumOperands()/2; }
+ unsigned getNumIncomingValues() const { return getNumOperands(); }
/// getIncomingValue - Return incoming value number x
///
Value *getIncomingValue(unsigned i) const {
- assert(i*2 < getNumOperands() && "Invalid value number!");
- return getOperand(i*2);
+ return getOperand(i);
}
void setIncomingValue(unsigned i, Value *V) {
- assert(i*2 < getNumOperands() && "Invalid value number!");
- setOperand(i*2, V);
+ setOperand(i, V);
}
static unsigned getOperandNumForIncomingValue(unsigned i) {
- return i*2;
+ return i;
}
static unsigned getIncomingValueNumForOperand(unsigned i) {
- assert(i % 2 == 0 && "Invalid incoming-value operand index!");
- return i/2;
+ return i;
}
/// getIncomingBlock - Return incoming basic block number @p i.
///
BasicBlock *getIncomingBlock(unsigned i) const {
- return cast<BasicBlock>(getOperand(i*2+1));
+ return block_begin()[i];
}
/// getIncomingBlock - Return incoming basic block corresponding
@@ -1878,7 +1720,7 @@ public:
///
BasicBlock *getIncomingBlock(const Use &U) const {
assert(this == U.getUser() && "Iterator doesn't point to PHI's Uses?");
- return cast<BasicBlock>((&U + 1)->get());
+ return getIncomingBlock(unsigned(&U - op_begin()));
}
/// getIncomingBlock - Return incoming basic block corresponding
@@ -1889,16 +1731,8 @@ public:
return getIncomingBlock(I.getUse());
}
-
void setIncomingBlock(unsigned i, BasicBlock *BB) {
- setOperand(i*2+1, (Value*)BB);
- }
- static unsigned getOperandNumForIncomingBlock(unsigned i) {
- return i*2+1;
- }
- static unsigned getIncomingBlockNumForOperand(unsigned i) {
- assert(i % 2 == 1 && "Invalid incoming-block operand index!");
- return i/2;
+ block_begin()[i] = BB;
}
/// addIncoming - Add an incoming value to the end of the PHI list
@@ -1908,13 +1742,12 @@ public:
assert(BB && "PHI node got a null basic block!");
assert(getType() == V->getType() &&
"All operands to PHI node must be the same type as the PHI node!");
- unsigned OpNo = NumOperands;
- if (OpNo+2 > ReservedSpace)
+ if (NumOperands == ReservedSpace)
growOperands(); // Get more space!
// Initialize some new operands.
- NumOperands = OpNo+2;
- OperandList[OpNo] = V;
- OperandList[OpNo+1] = (Value*)BB;
+ ++NumOperands;
+ setIncomingValue(NumOperands - 1, V);
+ setIncomingBlock(NumOperands - 1, BB);
}
/// removeIncomingValue - Remove an incoming value. This is useful if a
@@ -1937,14 +1770,16 @@ public:
/// block in the value list for this PHI. Returns -1 if no instance.
///
int getBasicBlockIndex(const BasicBlock *BB) const {
- Use *OL = OperandList;
- for (unsigned i = 0, e = getNumOperands(); i != e; i += 2)
- if (OL[i+1].get() == (const Value*)BB) return i/2;
+ for (unsigned i = 0, e = getNumOperands(); i != e; ++i)
+ if (block_begin()[i] == BB)
+ return i;
return -1;
}
Value *getIncomingValueForBlock(const BasicBlock *BB) const {
- return getIncomingValue(getBasicBlockIndex(BB));
+ int Idx = getBasicBlockIndex(BB);
+ assert(Idx >= 0 && "Invalid basic block argument!");
+ return getIncomingValue(Idx);
}
/// hasConstantValue - If the specified PHI node always merges together the
@@ -2397,71 +2232,39 @@ DEFINE_TRANSPARENT_OPERAND_ACCESSORS(IndirectBrInst, Value)
class InvokeInst : public TerminatorInst {
AttrListPtr AttributeList;
InvokeInst(const InvokeInst &BI);
- void init(Value *Fn, BasicBlock *IfNormal, BasicBlock *IfException,
- Value* const *Args, unsigned NumArgs);
-
- template<typename RandomAccessIterator>
void init(Value *Func, BasicBlock *IfNormal, BasicBlock *IfException,
- RandomAccessIterator ArgBegin, RandomAccessIterator ArgEnd,
- const Twine &NameStr,
- // This argument ensures that we have an iterator we can
- // do arithmetic on in constant time
- std::random_access_iterator_tag) {
- unsigned NumArgs = (unsigned)std::distance(ArgBegin, ArgEnd);
-
- // This requires that the iterator points to contiguous memory.
- init(Func, IfNormal, IfException, NumArgs ? &*ArgBegin : 0, NumArgs);
- setName(NameStr);
- }
+ ArrayRef<Value *> Args, const Twine &NameStr);
/// Construct an InvokeInst given a range of arguments.
- /// RandomAccessIterator must be a random-access iterator pointing to
- /// contiguous storage (e.g. a std::vector<>::iterator). Checks are
- /// made for random-accessness but not for contiguous storage as
- /// that would incur runtime overhead.
///
/// @brief Construct an InvokeInst from a range of arguments
- template<typename RandomAccessIterator>
inline InvokeInst(Value *Func, BasicBlock *IfNormal, BasicBlock *IfException,
- RandomAccessIterator ArgBegin, RandomAccessIterator ArgEnd,
- unsigned Values,
+ ArrayRef<Value *> Args, unsigned Values,
const Twine &NameStr, Instruction *InsertBefore);
/// Construct an InvokeInst given a range of arguments.
- /// RandomAccessIterator must be a random-access iterator pointing to
- /// contiguous storage (e.g. a std::vector<>::iterator). Checks are
- /// made for random-accessness but not for contiguous storage as
- /// that would incur runtime overhead.
///
/// @brief Construct an InvokeInst from a range of arguments
- template<typename RandomAccessIterator>
inline InvokeInst(Value *Func, BasicBlock *IfNormal, BasicBlock *IfException,
- RandomAccessIterator ArgBegin, RandomAccessIterator ArgEnd,
- unsigned Values,
+ ArrayRef<Value *> Args, unsigned Values,
const Twine &NameStr, BasicBlock *InsertAtEnd);
protected:
virtual InvokeInst *clone_impl() const;
public:
- template<typename RandomAccessIterator>
static InvokeInst *Create(Value *Func,
BasicBlock *IfNormal, BasicBlock *IfException,
- RandomAccessIterator ArgBegin,
- RandomAccessIterator ArgEnd,
- const Twine &NameStr = "",
+ ArrayRef<Value *> Args, const Twine &NameStr = "",
Instruction *InsertBefore = 0) {
- unsigned Values(ArgEnd - ArgBegin + 3);
- return new(Values) InvokeInst(Func, IfNormal, IfException, ArgBegin, ArgEnd,
+ unsigned Values = unsigned(Args.size()) + 3;
+ return new(Values) InvokeInst(Func, IfNormal, IfException, Args,
Values, NameStr, InsertBefore);
}
- template<typename RandomAccessIterator>
static InvokeInst *Create(Value *Func,
BasicBlock *IfNormal, BasicBlock *IfException,
- RandomAccessIterator ArgBegin,
- RandomAccessIterator ArgEnd,
- const Twine &NameStr,
+ ArrayRef<Value *> Args, const Twine &NameStr,
BasicBlock *InsertAtEnd) {
- unsigned Values(ArgEnd - ArgBegin + 3);
- return new(Values) InvokeInst(Func, IfNormal, IfException, ArgBegin, ArgEnd,
+ unsigned Values = unsigned(Args.size()) + 3;
+ return new(Values) InvokeInst(Func, IfNormal, IfException, Args,
Values, NameStr, InsertAtEnd);
}
@@ -2627,37 +2430,27 @@ template <>
struct OperandTraits<InvokeInst> : public VariadicOperandTraits<InvokeInst, 3> {
};
-template<typename RandomAccessIterator>
InvokeInst::InvokeInst(Value *Func,
BasicBlock *IfNormal, BasicBlock *IfException,
- RandomAccessIterator ArgBegin,
- RandomAccessIterator ArgEnd,
- unsigned Values,
+ ArrayRef<Value *> Args, unsigned Values,
const Twine &NameStr, Instruction *InsertBefore)
: TerminatorInst(cast<FunctionType>(cast<PointerType>(Func->getType())
->getElementType())->getReturnType(),
Instruction::Invoke,
OperandTraits<InvokeInst>::op_end(this) - Values,
Values, InsertBefore) {
- init(Func, IfNormal, IfException, ArgBegin, ArgEnd, NameStr,
- typename std::iterator_traits<RandomAccessIterator>
- ::iterator_category());
+ init(Func, IfNormal, IfException, Args, NameStr);
}
-template<typename RandomAccessIterator>
InvokeInst::InvokeInst(Value *Func,
BasicBlock *IfNormal, BasicBlock *IfException,
- RandomAccessIterator ArgBegin,
- RandomAccessIterator ArgEnd,
- unsigned Values,
+ ArrayRef<Value *> Args, unsigned Values,
const Twine &NameStr, BasicBlock *InsertAtEnd)
: TerminatorInst(cast<FunctionType>(cast<PointerType>(Func->getType())
->getElementType())->getReturnType(),
Instruction::Invoke,
OperandTraits<InvokeInst>::op_end(this) - Values,
Values, InsertAtEnd) {
- init(Func, IfNormal, IfException, ArgBegin, ArgEnd, NameStr,
- typename std::iterator_traits<RandomAccessIterator>
- ::iterator_category());
+ init(Func, IfNormal, IfException, Args, NameStr);
}
DEFINE_TRANSPARENT_OPERAND_ACCESSORS(InvokeInst, Value)
diff --git a/contrib/llvm/include/llvm/Intrinsics.h b/contrib/llvm/include/llvm/Intrinsics.h
index 5cfe551..46361ca 100644
--- a/contrib/llvm/include/llvm/Intrinsics.h
+++ b/contrib/llvm/include/llvm/Intrinsics.h
@@ -16,6 +16,7 @@
#ifndef LLVM_INTRINSICS_H
#define LLVM_INTRINSICS_H
+#include "llvm/ADT/ArrayRef.h"
#include <string>
namespace llvm {
@@ -44,12 +45,12 @@ namespace Intrinsic {
/// Intrinsic::getName(ID) - Return the LLVM name for an intrinsic, such as
/// "llvm.ppc.altivec.lvx".
- std::string getName(ID id, const Type **Tys = 0, unsigned numTys = 0);
+ std::string getName(ID id, ArrayRef<Type*> Tys = ArrayRef<Type*>());
/// Intrinsic::getType(ID) - Return the function type for an intrinsic.
///
const FunctionType *getType(LLVMContext &Context, ID id,
- const Type **Tys = 0, unsigned numTys = 0);
+ ArrayRef<Type*> Tys = ArrayRef<Type*>());
/// Intrinsic::isOverloaded(ID) - Returns true if the intrinsic can be
/// overloaded.
@@ -67,8 +68,8 @@ namespace Intrinsic {
/// overloaded intrinsic, Tys should point to an array of numTys pointers to
/// Type, and must provide exactly one type for each overloaded type in the
/// intrinsic.
- Function *getDeclaration(Module *M, ID id, const Type **Tys = 0,
- unsigned numTys = 0);
+ Function *getDeclaration(Module *M, ID id,
+ ArrayRef<Type*> Tys = ArrayRef<Type*>());
/// Map a GCC builtin name to an intrinsic ID.
ID getIntrinsicForGCCBuiltin(const char *Prefix, const char *BuiltinName);
diff --git a/contrib/llvm/include/llvm/Intrinsics.td b/contrib/llvm/include/llvm/Intrinsics.td
index d8f249a..947cf1b 100644
--- a/contrib/llvm/include/llvm/Intrinsics.td
+++ b/contrib/llvm/include/llvm/Intrinsics.td
@@ -211,7 +211,8 @@ def int_stackrestore : Intrinsic<[], [llvm_ptr_ty]>,
// however it does conveniently prevent the prefetch from being reordered
// with respect to nearby accesses to the same memory.
def int_prefetch : Intrinsic<[],
- [llvm_ptr_ty, llvm_i32_ty, llvm_i32_ty],
+ [llvm_ptr_ty, llvm_i32_ty, llvm_i32_ty,
+ llvm_i32_ty],
[IntrReadWriteArgMem, NoCapture<0>]>;
def int_pcmarker : Intrinsic<[], [llvm_i32_ty]>;
@@ -254,6 +255,12 @@ let Properties = [IntrReadMem] in {
def int_exp2 : Intrinsic<[llvm_anyfloat_ty], [LLVMMatchType<0>]>;
}
+let Properties = [IntrNoMem] in {
+ def int_fma : Intrinsic<[llvm_anyfloat_ty],
+ [LLVMMatchType<0>, LLVMMatchType<0>,
+ LLVMMatchType<0>]>;
+}
+
// NOTE: these are internal interfaces.
def int_setjmp : Intrinsic<[llvm_i32_ty], [llvm_ptr_ty]>;
def int_longjmp : Intrinsic<[], [llvm_ptr_ty, llvm_i32_ty]>;
@@ -265,6 +272,11 @@ def int_objectsize : Intrinsic<[llvm_anyint_ty], [llvm_ptr_ty, llvm_i1_ty],
[IntrNoMem]>,
GCCBuiltin<"__builtin_object_size">;
+//===------------------------- Expect Intrinsics --------------------------===//
+//
+def int_expect : Intrinsic<[llvm_anyint_ty], [LLVMMatchType<0>,
+ LLVMMatchType<0>], [IntrNoMem]>;
+
//===-------------------- Bit Manipulation Intrinsics ---------------------===//
//
@@ -311,7 +323,7 @@ let Properties = [IntrNoMem] in {
def int_eh_sjlj_lsda : Intrinsic<[llvm_ptr_ty]>;
def int_eh_sjlj_callsite: Intrinsic<[], [llvm_i32_ty]>;
}
-def int_eh_sjlj_dispatch_setup : Intrinsic<[], [llvm_i32_ty], [IntrReadMem]>;
+def int_eh_sjlj_dispatch_setup : Intrinsic<[], [llvm_i32_ty]>;
def int_eh_sjlj_setjmp : Intrinsic<[llvm_i32_ty], [llvm_ptr_ty]>;
def int_eh_sjlj_longjmp : Intrinsic<[], [llvm_ptr_ty]>;
diff --git a/contrib/llvm/include/llvm/LLVMContext.h b/contrib/llvm/include/llvm/LLVMContext.h
index 3502ff7..65146c3 100644
--- a/contrib/llvm/include/llvm/LLVMContext.h
+++ b/contrib/llvm/include/llvm/LLVMContext.h
@@ -39,7 +39,8 @@ public:
// compile-time performance optimization, not a correctness optimization.
enum {
MD_dbg = 0, // "dbg"
- MD_tbaa = 1 // "tbaa"
+ MD_tbaa = 1, // "tbaa"
+ MD_prof = 2 // "prof"
};
/// getMDKindID - Return a unique non-zero ID for the specified metadata kind.
diff --git a/contrib/llvm/include/llvm/LinkAllPasses.h b/contrib/llvm/include/llvm/LinkAllPasses.h
index c02e161..8467d11 100644
--- a/contrib/llvm/include/llvm/LinkAllPasses.h
+++ b/contrib/llvm/include/llvm/LinkAllPasses.h
@@ -62,7 +62,6 @@ namespace {
(void) llvm::createDeadCodeEliminationPass();
(void) llvm::createDeadInstEliminationPass();
(void) llvm::createDeadStoreEliminationPass();
- (void) llvm::createDeadTypeEliminationPass();
(void) llvm::createDomOnlyPrinterPass();
(void) llvm::createDomPrinterPass();
(void) llvm::createDomOnlyViewerPass();
@@ -92,11 +91,16 @@ namespace {
(void) llvm::createLoopUnswitchPass();
(void) llvm::createLoopIdiomPass();
(void) llvm::createLoopRotatePass();
+ (void) llvm::createLowerExpectIntrinsicPass();
(void) llvm::createLowerInvokePass();
(void) llvm::createLowerSetJmpPass();
(void) llvm::createLowerSwitchPass();
(void) llvm::createNoAAPass();
(void) llvm::createNoProfileInfoPass();
+ (void) llvm::createObjCARCAliasAnalysisPass();
+ (void) llvm::createObjCARCExpandPass();
+ (void) llvm::createObjCARCContractPass();
+ (void) llvm::createObjCARCOptPass();
(void) llvm::createProfileEstimatorPass();
(void) llvm::createProfileVerifierPass();
(void) llvm::createPathProfileVerifierPass();
diff --git a/contrib/llvm/include/llvm/MC/MCAsmInfo.h b/contrib/llvm/include/llvm/MC/MCAsmInfo.h
index 775d22b..41c1717 100644
--- a/contrib/llvm/include/llvm/MC/MCAsmInfo.h
+++ b/contrib/llvm/include/llvm/MC/MCAsmInfo.h
@@ -37,6 +37,18 @@ namespace llvm {
//===------------------------------------------------------------------===//
// Properties to be set by the target writer, used to configure asm printer.
//
+
+ /// PointerSize - Pointer size in bytes.
+ /// Default is 4.
+ unsigned PointerSize;
+
+ /// IsLittleEndian - True if target is little endian.
+ /// Default is true.
+ bool IsLittleEndian;
+
+ /// StackGrowsUp - True if target stack grow up.
+ /// Default is false.
+ bool StackGrowsUp;
/// HasSubsectionsViaSymbols - True if this target has the MachO
/// .subsections_via_symbols directive.
@@ -284,6 +296,10 @@ namespace llvm {
// use EmitLabelOffsetDifference.
bool DwarfUsesLabelOffsetForRanges;
+ /// DwarfRegNumForCFI - True if dwarf register numbers are printed
+ /// instead of symbolic register names in .cfi_* directives.
+ bool DwarfRegNumForCFI; // Defaults to false;
+
//===--- CBE Asm Translation Table -----------------------------------===//
const char *const *AsmTransCBE; // Defaults to empty
@@ -296,6 +312,21 @@ namespace llvm {
static unsigned getSLEB128Size(int Value);
static unsigned getULEB128Size(unsigned Value);
+ /// getPointerSize - Get the pointer size in bytes.
+ unsigned getPointerSize() const {
+ return PointerSize;
+ }
+
+ /// islittleendian - True if the target is little endian.
+ bool isLittleEndian() const {
+ return IsLittleEndian;
+ }
+
+ /// isStackGrowthDirectionUp - True if target stack grow up.
+ bool isStackGrowthDirectionUp() const {
+ return StackGrowsUp;
+ }
+
bool hasSubsectionsViaSymbols() const { return HasSubsectionsViaSymbols; }
// Data directive accessors.
@@ -475,6 +506,9 @@ namespace llvm {
bool doesDwarfUsesLabelOffsetForRanges() const {
return DwarfUsesLabelOffsetForRanges;
}
+ bool useDwarfRegNumForCFI() const {
+ return DwarfRegNumForCFI;
+ }
const char *const *getAsmCBE() const {
return AsmTransCBE;
}
diff --git a/contrib/llvm/include/llvm/MC/MCContext.h b/contrib/llvm/include/llvm/MC/MCContext.h
index 070089e..43a9ce6 100644
--- a/contrib/llvm/include/llvm/MC/MCContext.h
+++ b/contrib/llvm/include/llvm/MC/MCContext.h
@@ -39,6 +39,9 @@ namespace llvm {
class MCContext {
MCContext(const MCContext&); // DO NOT IMPLEMENT
MCContext &operator=(const MCContext&); // DO NOT IMPLEMENT
+ public:
+ typedef StringMap<MCSymbol*, BumpPtrAllocator&> SymbolTable;
+ private:
/// The MCAsmInfo for this target.
const MCAsmInfo &MAI;
@@ -52,7 +55,7 @@ namespace llvm {
BumpPtrAllocator Allocator;
/// Symbols - Bindings of names to symbols.
- StringMap<MCSymbol*, BumpPtrAllocator&> Symbols;
+ SymbolTable Symbols;
/// UsedNames - Keeps tracks of names that were used both for used declared
/// and artificial symbols.
@@ -142,6 +145,14 @@ namespace llvm {
/// LookupSymbol - Get the symbol for \p Name, or null.
MCSymbol *LookupSymbol(StringRef Name) const;
+ /// getSymbols - Get a reference for the symbol table for clients that
+ /// want to, for example, iterate over all symbols. 'const' because we
+ /// still want any modifications to the table itself to use the MCContext
+ /// APIs.
+ const SymbolTable &getSymbols() const {
+ return Symbols;
+ }
+
/// @}
/// @name Section Management
diff --git a/contrib/llvm/include/llvm/Target/TargetInstrDesc.h b/contrib/llvm/include/llvm/MC/MCInstrDesc.h
index 6e20e8a..4996914 100644
--- a/contrib/llvm/include/llvm/Target/TargetInstrDesc.h
+++ b/contrib/llvm/include/llvm/MC/MCInstrDesc.h
@@ -1,4 +1,4 @@
-//===-- llvm/Target/TargetInstrDesc.h - Instruction Descriptors -*- C++ -*-===//
+//===-- llvm/Mc/McInstrDesc.h - Instruction Descriptors -*- C++ -*-===//
//
// The LLVM Compiler Infrastructure
//
@@ -7,26 +7,23 @@
//
//===----------------------------------------------------------------------===//
//
-// This file defines the TargetOperandInfo and TargetInstrDesc classes, which
+// This file defines the MCOperandInfo and MCInstrDesc classes, which
// are used to describe target instructions and their operands.
//
//===----------------------------------------------------------------------===//
-#ifndef LLVM_TARGET_TARGETINSTRDESC_H
-#define LLVM_TARGET_TARGETINSTRDESC_H
+#ifndef LLVM_MC_MCINSTRDESC_H
+#define LLVM_MC_MCINSTRDESC_H
#include "llvm/Support/DataTypes.h"
namespace llvm {
-class TargetRegisterClass;
-class TargetRegisterInfo;
-
//===----------------------------------------------------------------------===//
// Machine Operand Flags and Description
//===----------------------------------------------------------------------===//
-namespace TOI {
+namespace MCOI {
// Operand constraints
enum OperandConstraint {
TIED_TO = 0, // Must be allocated the same register as.
@@ -34,54 +31,57 @@ namespace TOI {
};
/// OperandFlags - These are flags set on operands, but should be considered
- /// private, all access should go through the TargetOperandInfo accessors.
+ /// private, all access should go through the MCOperandInfo accessors.
/// See the accessors for a description of what these are.
enum OperandFlags {
LookupPtrRegClass = 0,
Predicate,
OptionalDef
};
+
+ /// Operand Type - Operands are tagged with one of the values of this enum.
+ enum OperandType {
+ OPERAND_UNKNOWN,
+ OPERAND_IMMEDIATE,
+ OPERAND_REGISTER,
+ OPERAND_MEMORY,
+ OPERAND_PCREL
+ };
}
-/// TargetOperandInfo - This holds information about one operand of a machine
+/// MCOperandInfo - This holds information about one operand of a machine
/// instruction, indicating the register class for register operands, etc.
///
-class TargetOperandInfo {
+class MCOperandInfo {
public:
/// RegClass - This specifies the register class enumeration of the operand
/// if the operand is a register. If isLookupPtrRegClass is set, then this is
/// an index that is passed to TargetRegisterInfo::getPointerRegClass(x) to
/// get a dynamic register class.
- ///
- /// NOTE: This member should be considered to be private, all access should go
- /// through "getRegClass(TRI)" below.
short RegClass;
- /// Flags - These are flags from the TOI::OperandFlags enum.
+ /// Flags - These are flags from the MCOI::OperandFlags enum.
unsigned short Flags;
/// Lower 16 bits are used to specify which constraints are set. The higher 16
/// bits are used to specify the value of constraints (4 bits each).
unsigned Constraints;
+
+ /// OperandType - Information about the type of the operand.
+ MCOI::OperandType OperandType;
/// Currently no other information.
- /// getRegClass - Get the register class for the operand, handling resolution
- /// of "symbolic" pointer register classes etc. If this is not a register
- /// operand, this returns null.
- const TargetRegisterClass *getRegClass(const TargetRegisterInfo *TRI) const;
-
-
/// isLookupPtrRegClass - Set if this operand is a pointer value and it
/// requires a callback to look up its register class.
- bool isLookupPtrRegClass() const { return Flags&(1 <<TOI::LookupPtrRegClass);}
+ bool isLookupPtrRegClass() const { return Flags&(1 <<MCOI::LookupPtrRegClass);}
/// isPredicate - Set if this is one of the operands that made up of
/// the predicate operand that controls an isPredicable() instruction.
- bool isPredicate() const { return Flags & (1 << TOI::Predicate); }
+ bool isPredicate() const { return Flags & (1 << MCOI::Predicate); }
/// isOptionalDef - Set if this operand is a optional def.
///
- bool isOptionalDef() const { return Flags & (1 << TOI::OptionalDef); }
+ bool isOptionalDef() const { return Flags & (1 << MCOI::OptionalDef); }
};
@@ -89,11 +89,11 @@ public:
// Machine Instruction Flags and Description
//===----------------------------------------------------------------------===//
-/// TargetInstrDesc flags - These should be considered private to the
-/// implementation of the TargetInstrDesc class. Clients should use the
-/// predicate methods on TargetInstrDesc, not use these directly. These
-/// all correspond to bitfields in the TargetInstrDesc::Flags field.
-namespace TID {
+/// MCInstrDesc flags - These should be considered private to the
+/// implementation of the MCInstrDesc class. Clients should use the predicate
+/// methods on MCInstrDesc, not use these directly. These all correspond to
+/// bitfields in the MCInstrDesc::Flags field.
+namespace MCID {
enum {
Variadic = 0,
HasOptionalDef,
@@ -123,29 +123,29 @@ namespace TID {
};
}
-/// TargetInstrDesc - Describe properties that are true of each
-/// instruction in the target description file. This captures information about
-/// side effects, register use and many other things. There is one instance of
-/// this struct for each target instruction class, and the MachineInstr class
-/// points to this struct directly to describe itself.
-class TargetInstrDesc {
+/// MCInstrDesc - Describe properties that are true of each instruction in the
+/// target description file. This captures information about side effects,
+/// register use and many other things. There is one instance of this struct
+/// for each target instruction class, and the MachineInstr class points to
+/// this struct directly to describe itself.
+class MCInstrDesc {
public:
unsigned short Opcode; // The opcode number
unsigned short NumOperands; // Num of args (may be more if variable_ops)
unsigned short NumDefs; // Num of args that are definitions
unsigned short SchedClass; // enum identifying instr sched class
+ unsigned short Size; // Number of bytes in encoding.
const char * Name; // Name of the instruction record in td file
unsigned Flags; // Flags identifying machine instr class
uint64_t TSFlags; // Target Specific Flag values
const unsigned *ImplicitUses; // Registers implicitly read by this instr
const unsigned *ImplicitDefs; // Registers implicitly defined by this instr
- const TargetRegisterClass **RCBarriers; // Reg classes completely "clobbered"
- const TargetOperandInfo *OpInfo; // 'NumOperands' entries about operands
+ const MCOperandInfo *OpInfo; // 'NumOperands' entries about operands
/// getOperandConstraint - Returns the value of the specific constraint if
/// it is set. Returns -1 if it is not set.
int getOperandConstraint(unsigned OpNum,
- TOI::OperandConstraint Constraint) const {
+ MCOI::OperandConstraint Constraint) const {
if (OpNum < NumOperands &&
(OpInfo[OpNum].Constraints & (1 << Constraint))) {
unsigned Pos = 16 + Constraint * 4;
@@ -154,12 +154,6 @@ public:
return -1;
}
- /// getRegClass - Returns the register class constraint for OpNum, or NULL.
- const TargetRegisterClass *getRegClass(unsigned OpNum,
- const TargetRegisterInfo *TRI) const {
- return OpNum < NumOperands ? OpInfo[OpNum].getRegClass(TRI) : 0;
- }
-
/// getOpcode - Return the opcode number for this descriptor.
unsigned getOpcode() const {
return Opcode;
@@ -193,13 +187,13 @@ public:
/// operands but before the implicit definitions and uses (if any are
/// present).
bool isVariadic() const {
- return Flags & (1 << TID::Variadic);
+ return Flags & (1 << MCID::Variadic);
}
/// hasOptionalDef - Set if this instruction has an optional definition, e.g.
/// ARM instructions which can set condition code if 's' bit is set.
bool hasOptionalDef() const {
- return Flags & (1 << TID::HasOptionalDef);
+ return Flags & (1 << MCID::HasOptionalDef);
}
/// getImplicitUses - Return a list of registers that are potentially
@@ -214,7 +208,7 @@ public:
const unsigned *getImplicitUses() const {
return ImplicitUses;
}
-
+
/// getNumImplicitUses - Return the number of implicit uses this instruction
/// has.
unsigned getNumImplicitUses() const {
@@ -223,8 +217,7 @@ public:
for (; ImplicitUses[i]; ++i) /*empty*/;
return i;
}
-
-
+
/// getImplicitDefs - Return a list of registers that are potentially
/// written by any instance of this machine instruction. For example, on X86,
/// many instructions implicitly set the flags register. In this case, they
@@ -266,17 +259,6 @@ public:
return false;
}
- /// getRegClassBarriers - Return a list of register classes that are
- /// completely clobbered by this machine instruction. For example, on X86
- /// the call instructions will completely clobber all the registers in the
- /// fp stack and XMM classes.
- ///
- /// This method returns null if the instruction doesn't completely clobber
- /// any register class.
- const TargetRegisterClass **getRegClassBarriers() const {
- return RCBarriers;
- }
-
/// getSchedClass - Return the scheduling class for this instruction. The
/// scheduling class is an index into the InstrItineraryData table. This
/// returns zero if there is no known scheduling information for the
@@ -286,19 +268,25 @@ public:
return SchedClass;
}
+ /// getSize - Return the number of bytes in the encoding of this instruction,
+ /// or zero if the encoding size cannot be known from the opcode.
+ unsigned getSize() const {
+ return Size;
+ }
+
bool isReturn() const {
- return Flags & (1 << TID::Return);
+ return Flags & (1 << MCID::Return);
}
bool isCall() const {
- return Flags & (1 << TID::Call);
+ return Flags & (1 << MCID::Call);
}
/// isBarrier - Returns true if the specified instruction stops control flow
/// from executing the instruction immediately following it. Examples include
/// unconditional branches and return instructions.
bool isBarrier() const {
- return Flags & (1 << TID::Barrier);
+ return Flags & (1 << MCID::Barrier);
}
/// isTerminator - Returns true if this instruction part of the terminator for
@@ -308,7 +296,7 @@ public:
/// Various passes use this to insert code into the bottom of a basic block,
/// but before control flow occurs.
bool isTerminator() const {
- return Flags & (1 << TID::Terminator);
+ return Flags & (1 << MCID::Terminator);
}
/// isBranch - Returns true if this is a conditional, unconditional, or
@@ -316,13 +304,13 @@ public:
/// these cases, and the TargetInstrInfo::AnalyzeBranch method can be used to
/// get more information.
bool isBranch() const {
- return Flags & (1 << TID::Branch);
+ return Flags & (1 << MCID::Branch);
}
/// isIndirectBranch - Return true if this is an indirect branch, such as a
/// branch through a register.
bool isIndirectBranch() const {
- return Flags & (1 << TID::IndirectBranch);
+ return Flags & (1 << MCID::IndirectBranch);
}
/// isConditionalBranch - Return true if this is a branch which may fall
@@ -346,37 +334,37 @@ public:
/// values. There are various methods in TargetInstrInfo that can be used to
/// control and modify the predicate in this instruction.
bool isPredicable() const {
- return Flags & (1 << TID::Predicable);
+ return Flags & (1 << MCID::Predicable);
}
/// isCompare - Return true if this instruction is a comparison.
bool isCompare() const {
- return Flags & (1 << TID::Compare);
+ return Flags & (1 << MCID::Compare);
}
/// isMoveImmediate - Return true if this instruction is a move immediate
/// (including conditional moves) instruction.
bool isMoveImmediate() const {
- return Flags & (1 << TID::MoveImm);
+ return Flags & (1 << MCID::MoveImm);
}
/// isBitcast - Return true if this instruction is a bitcast instruction.
///
bool isBitcast() const {
- return Flags & (1 << TID::Bitcast);
+ return Flags & (1 << MCID::Bitcast);
}
/// isNotDuplicable - Return true if this instruction cannot be safely
/// duplicated. For example, if the instruction has a unique labels attached
/// to it, duplicating it would cause multiple definition errors.
bool isNotDuplicable() const {
- return Flags & (1 << TID::NotDuplicable);
+ return Flags & (1 << MCID::NotDuplicable);
}
/// hasDelaySlot - Returns true if the specified instruction has a delay slot
/// which must be filled by the code generator.
bool hasDelaySlot() const {
- return Flags & (1 << TID::DelaySlot);
+ return Flags & (1 << MCID::DelaySlot);
}
/// canFoldAsLoad - Return true for instructions that can be folded as
@@ -388,7 +376,7 @@ public:
/// This should only be set on instructions that return a value in their
/// only virtual register definition.
bool canFoldAsLoad() const {
- return Flags & (1 << TID::FoldableAsLoad);
+ return Flags & (1 << MCID::FoldableAsLoad);
}
//===--------------------------------------------------------------------===//
@@ -399,7 +387,7 @@ public:
/// Instructions with this flag set are not necessarily simple load
/// instructions, they may load a value and modify it, for example.
bool mayLoad() const {
- return Flags & (1 << TID::MayLoad);
+ return Flags & (1 << MCID::MayLoad);
}
@@ -408,7 +396,7 @@ public:
/// instructions, they may store a modified value based on their operands, or
/// may not actually modify anything, for example.
bool mayStore() const {
- return Flags & (1 << TID::MayStore);
+ return Flags & (1 << MCID::MayStore);
}
/// hasUnmodeledSideEffects - Return true if this instruction has side
@@ -425,7 +413,7 @@ public:
/// LLVM, etc.
///
bool hasUnmodeledSideEffects() const {
- return Flags & (1 << TID::UnmodeledSideEffects);
+ return Flags & (1 << MCID::UnmodeledSideEffects);
}
//===--------------------------------------------------------------------===//
@@ -443,7 +431,7 @@ public:
/// Also note that some instructions require non-trivial modification to
/// commute them.
bool isCommutable() const {
- return Flags & (1 << TID::Commutable);
+ return Flags & (1 << MCID::Commutable);
}
/// isConvertibleTo3Addr - Return true if this is a 2-address instruction
@@ -461,7 +449,7 @@ public:
/// instruction (e.g. shl reg, 4 on x86).
///
bool isConvertibleTo3Addr() const {
- return Flags & (1 << TID::ConvertibleTo3Addr);
+ return Flags & (1 << MCID::ConvertibleTo3Addr);
}
/// usesCustomInsertionHook - Return true if this instruction requires
@@ -473,7 +461,7 @@ public:
/// If this is true, the TargetLoweringInfo::InsertAtEndOfBasicBlock method
/// is used to insert this into the MachineBasicBlock.
bool usesCustomInsertionHook() const {
- return Flags & (1 << TID::UsesCustomInserter);
+ return Flags & (1 << MCID::UsesCustomInserter);
}
/// isRematerializable - Returns true if this instruction is a candidate for
@@ -481,7 +469,7 @@ public:
/// flag is set, the isReallyTriviallyReMaterializable() method is called to
/// verify the instruction is really rematable.
bool isRematerializable() const {
- return Flags & (1 << TID::Rematerializable);
+ return Flags & (1 << MCID::Rematerializable);
}
/// isAsCheapAsAMove - Returns true if this instruction has the same cost (or
@@ -491,7 +479,7 @@ public:
/// more than moving the instruction into the appropriate register. Note, we
/// are not marking copies from and to the same register class with this flag.
bool isAsCheapAsAMove() const {
- return Flags & (1 << TID::CheapAsAMove);
+ return Flags & (1 << MCID::CheapAsAMove);
}
/// hasExtraSrcRegAllocReq - Returns true if this instruction source operands
@@ -501,7 +489,7 @@ public:
/// Post-register allocation passes should not attempt to change allocations
/// for sources of instructions with this flag.
bool hasExtraSrcRegAllocReq() const {
- return Flags & (1 << TID::ExtraSrcRegAllocReq);
+ return Flags & (1 << MCID::ExtraSrcRegAllocReq);
}
/// hasExtraDefRegAllocReq - Returns true if this instruction def operands
@@ -511,7 +499,7 @@ public:
/// Post-register allocation passes should not attempt to change allocations
/// for definitions of instructions with this flag.
bool hasExtraDefRegAllocReq() const {
- return Flags & (1 << TID::ExtraDefRegAllocReq);
+ return Flags & (1 << MCID::ExtraDefRegAllocReq);
}
};
diff --git a/contrib/llvm/include/llvm/MC/MCInstrInfo.h b/contrib/llvm/include/llvm/MC/MCInstrInfo.h
new file mode 100644
index 0000000..a63e5fa
--- /dev/null
+++ b/contrib/llvm/include/llvm/MC/MCInstrInfo.h
@@ -0,0 +1,51 @@
+//===-- llvm/MC/MCInstrInfo.h - Target Instruction Info ---------*- C++ -*-===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+//
+// This file describes the target machine instruction set.
+//
+//===----------------------------------------------------------------------===//
+
+#ifndef LLVM_MC_MCINSTRINFO_H
+#define LLVM_MC_MCINSTRINFO_H
+
+#include "llvm/MC/MCInstrDesc.h"
+#include <cassert>
+
+namespace llvm {
+
+//---------------------------------------------------------------------------
+///
+/// MCInstrInfo - Interface to description of machine instruction set
+///
+class MCInstrInfo {
+ const MCInstrDesc *Desc; // Raw array to allow static init'n
+ unsigned NumOpcodes; // Number of entries in the desc array
+
+public:
+ /// InitMCInstrInfo - Initialize MCInstrInfo, called by TableGen
+ /// auto-generated routines. *DO NOT USE*.
+ void InitMCInstrInfo(const MCInstrDesc *D, unsigned NO) {
+ Desc = D;
+ NumOpcodes = NO;
+ }
+
+ unsigned getNumOpcodes() const { return NumOpcodes; }
+
+ /// get - Return the machine instruction descriptor that corresponds to the
+ /// specified instruction opcode.
+ ///
+ const MCInstrDesc &get(unsigned Opcode) const {
+ assert(Opcode < NumOpcodes && "Invalid opcode!");
+ return Desc[Opcode];
+ }
+};
+
+} // End llvm namespace
+
+#endif
diff --git a/contrib/llvm/include/llvm/Target/TargetInstrItineraries.h b/contrib/llvm/include/llvm/MC/MCInstrItineraries.h
index 6011402..e942892 100644
--- a/contrib/llvm/include/llvm/Target/TargetInstrItineraries.h
+++ b/contrib/llvm/include/llvm/MC/MCInstrItineraries.h
@@ -1,4 +1,4 @@
-//===-- llvm/Target/TargetInstrItineraries.h - Scheduling -------*- C++ -*-===//
+//===-- llvm/MC/MCInstrItineraries.h - Scheduling ---------------*- C++ -*-===//
//
// The LLVM Compiler Infrastructure
//
@@ -13,8 +13,8 @@
//
//===----------------------------------------------------------------------===//
-#ifndef LLVM_TARGET_TARGETINSTRITINERARIES_H
-#define LLVM_TARGET_TARGETINSTRITINERARIES_H
+#ifndef LLVM_MC_MCINSTRITINERARIES_H
+#define LLVM_MC_MCINSTRITINERARIES_H
#include <algorithm>
diff --git a/contrib/llvm/include/llvm/MC/MCMachObjectWriter.h b/contrib/llvm/include/llvm/MC/MCMachObjectWriter.h
index ec51031..9bb598f 100644
--- a/contrib/llvm/include/llvm/MC/MCMachObjectWriter.h
+++ b/contrib/llvm/include/llvm/MC/MCMachObjectWriter.h
@@ -10,11 +10,20 @@
#ifndef LLVM_MC_MCMACHOBJECTWRITER_H
#define LLVM_MC_MCMACHOBJECTWRITER_H
+#include "llvm/ADT/DenseMap.h"
+#include "llvm/ADT/OwningPtr.h"
+#include "llvm/ADT/SmallString.h"
+#include "llvm/MC/MCExpr.h"
#include "llvm/MC/MCObjectWriter.h"
+#include "llvm/Object/MachOFormat.h"
#include "llvm/Support/DataTypes.h"
+#include <vector>
namespace llvm {
+class MCSectionData;
+class MachObjectWriter;
+
class MCMachObjectTargetWriter {
const unsigned Is64Bit : 1;
const uint32_t CPUType;
@@ -48,8 +57,191 @@ public:
}
/// @}
+
+ /// @name API
+ /// @{
+
+ virtual void RecordRelocation(MachObjectWriter *Writer,
+ const MCAssembler &Asm,
+ const MCAsmLayout &Layout,
+ const MCFragment *Fragment,
+ const MCFixup &Fixup,
+ MCValue Target,
+ uint64_t &FixedValue) = 0;
+
+ /// @}
};
+class MachObjectWriter : public MCObjectWriter {
+ /// MachSymbolData - Helper struct for containing some precomputed information
+ /// on symbols.
+ struct MachSymbolData {
+ MCSymbolData *SymbolData;
+ uint64_t StringIndex;
+ uint8_t SectionIndex;
+
+ // Support lexicographic sorting.
+ bool operator<(const MachSymbolData &RHS) const;
+ };
+
+ /// The target specific Mach-O writer instance.
+ llvm::OwningPtr<MCMachObjectTargetWriter> TargetObjectWriter;
+
+ /// @name Relocation Data
+ /// @{
+
+ llvm::DenseMap<const MCSectionData*,
+ std::vector<object::macho::RelocationEntry> > Relocations;
+ llvm::DenseMap<const MCSectionData*, unsigned> IndirectSymBase;
+
+ /// @}
+ /// @name Symbol Table Data
+ /// @{
+
+ SmallString<256> StringTable;
+ std::vector<MachSymbolData> LocalSymbolData;
+ std::vector<MachSymbolData> ExternalSymbolData;
+ std::vector<MachSymbolData> UndefinedSymbolData;
+
+ /// @}
+
+public:
+ MachObjectWriter(MCMachObjectTargetWriter *MOTW, raw_ostream &_OS,
+ bool _IsLittleEndian)
+ : MCObjectWriter(_OS, _IsLittleEndian), TargetObjectWriter(MOTW) {
+ }
+
+ /// @name Utility Methods
+ /// @{
+
+ bool isFixupKindPCRel(const MCAssembler &Asm, unsigned Kind);
+
+ SectionAddrMap SectionAddress;
+
+ SectionAddrMap &getSectionAddressMap() { return SectionAddress; }
+
+ uint64_t getSectionAddress(const MCSectionData* SD) const {
+ return SectionAddress.lookup(SD);
+ }
+ uint64_t getSymbolAddress(const MCSymbolData* SD,
+ const MCAsmLayout &Layout) const;
+
+ uint64_t getFragmentAddress(const MCFragment *Fragment,
+ const MCAsmLayout &Layout) const;
+
+ uint64_t getPaddingSize(const MCSectionData *SD,
+ const MCAsmLayout &Layout) const;
+
+ bool doesSymbolRequireExternRelocation(const MCSymbolData *SD);
+
+ /// @}
+
+ /// @name Target Writer Proxy Accessors
+ /// @{
+
+ bool is64Bit() const { return TargetObjectWriter->is64Bit(); }
+ bool isARM() const {
+ uint32_t CPUType = TargetObjectWriter->getCPUType() &
+ ~object::mach::CTFM_ArchMask;
+ return CPUType == object::mach::CTM_ARM;
+ }
+
+ /// @}
+
+ void WriteHeader(unsigned NumLoadCommands, unsigned LoadCommandsSize,
+ bool SubsectionsViaSymbols);
+
+ /// WriteSegmentLoadCommand - Write a segment load command.
+ ///
+ /// \arg NumSections - The number of sections in this segment.
+ /// \arg SectionDataSize - The total size of the sections.
+ void WriteSegmentLoadCommand(unsigned NumSections,
+ uint64_t VMSize,
+ uint64_t SectionDataStartOffset,
+ uint64_t SectionDataSize);
+
+ void WriteSection(const MCAssembler &Asm, const MCAsmLayout &Layout,
+ const MCSectionData &SD, uint64_t FileOffset,
+ uint64_t RelocationsStart, unsigned NumRelocations);
+
+ void WriteSymtabLoadCommand(uint32_t SymbolOffset, uint32_t NumSymbols,
+ uint32_t StringTableOffset,
+ uint32_t StringTableSize);
+
+ void WriteDysymtabLoadCommand(uint32_t FirstLocalSymbol,
+ uint32_t NumLocalSymbols,
+ uint32_t FirstExternalSymbol,
+ uint32_t NumExternalSymbols,
+ uint32_t FirstUndefinedSymbol,
+ uint32_t NumUndefinedSymbols,
+ uint32_t IndirectSymbolOffset,
+ uint32_t NumIndirectSymbols);
+
+ void WriteNlist(MachSymbolData &MSD, const MCAsmLayout &Layout);
+
+ // FIXME: We really need to improve the relocation validation. Basically, we
+ // want to implement a separate computation which evaluates the relocation
+ // entry as the linker would, and verifies that the resultant fixup value is
+ // exactly what the encoder wanted. This will catch several classes of
+ // problems:
+ //
+ // - Relocation entry bugs, the two algorithms are unlikely to have the same
+ // exact bug.
+ //
+ // - Relaxation issues, where we forget to relax something.
+ //
+ // - Input errors, where something cannot be correctly encoded. 'as' allows
+ // these through in many cases.
+
+ void addRelocation(const MCSectionData *SD,
+ object::macho::RelocationEntry &MRE) {
+ Relocations[SD].push_back(MRE);
+ }
+
+ void RecordScatteredRelocation(const MCAssembler &Asm,
+ const MCAsmLayout &Layout,
+ const MCFragment *Fragment,
+ const MCFixup &Fixup, MCValue Target,
+ unsigned Log2Size,
+ uint64_t &FixedValue);
+
+ void RecordTLVPRelocation(const MCAssembler &Asm,
+ const MCAsmLayout &Layout,
+ const MCFragment *Fragment,
+ const MCFixup &Fixup, MCValue Target,
+ uint64_t &FixedValue);
+
+ void RecordRelocation(const MCAssembler &Asm, const MCAsmLayout &Layout,
+ const MCFragment *Fragment, const MCFixup &Fixup,
+ MCValue Target, uint64_t &FixedValue);
+
+ void BindIndirectSymbols(MCAssembler &Asm);
+
+ /// ComputeSymbolTable - Compute the symbol table data
+ ///
+ /// \param StringTable [out] - The string table data.
+ /// \param StringIndexMap [out] - Map from symbol names to offsets in the
+ /// string table.
+ void ComputeSymbolTable(MCAssembler &Asm, SmallString<256> &StringTable,
+ std::vector<MachSymbolData> &LocalSymbolData,
+ std::vector<MachSymbolData> &ExternalSymbolData,
+ std::vector<MachSymbolData> &UndefinedSymbolData);
+
+ void computeSectionAddresses(const MCAssembler &Asm,
+ const MCAsmLayout &Layout);
+
+ void ExecutePostLayoutBinding(MCAssembler &Asm, const MCAsmLayout &Layout);
+
+ virtual bool IsSymbolRefDifferenceFullyResolvedImpl(const MCAssembler &Asm,
+ const MCSymbolData &DataA,
+ const MCFragment &FB,
+ bool InSet,
+ bool IsPCRel) const;
+
+ void WriteObject(MCAssembler &Asm, const MCAsmLayout &Layout);
+};
+
+
/// \brief Construct a new Mach-O writer instance.
///
/// This routine takes ownership of the target writer subclass.
diff --git a/contrib/llvm/include/llvm/MC/MCObjectStreamer.h b/contrib/llvm/include/llvm/MC/MCObjectStreamer.h
index 8b0d87a..a89933b 100644
--- a/contrib/llvm/include/llvm/MC/MCObjectStreamer.h
+++ b/contrib/llvm/include/llvm/MC/MCObjectStreamer.h
@@ -73,7 +73,8 @@ public:
virtual void EmitValueToOffset(const MCExpr *Offset, unsigned char Value);
virtual void EmitDwarfAdvanceLineAddr(int64_t LineDelta,
const MCSymbol *LastLabel,
- const MCSymbol *Label);
+ const MCSymbol *Label,
+ unsigned PointerSize);
virtual void EmitDwarfAdvanceFrameAddr(const MCSymbol *LastLabel,
const MCSymbol *Label);
virtual void Finish();
diff --git a/contrib/llvm/include/llvm/MC/MCParser/MCParsedAsmOperand.h b/contrib/llvm/include/llvm/MC/MCParser/MCParsedAsmOperand.h
index 91f5773..2556e5f 100644
--- a/contrib/llvm/include/llvm/MC/MCParser/MCParsedAsmOperand.h
+++ b/contrib/llvm/include/llvm/MC/MCParser/MCParsedAsmOperand.h
@@ -28,10 +28,20 @@ public:
/// getEndLoc - Get the location of the last token of this operand.
virtual SMLoc getEndLoc() const = 0;
- /// dump - Print a debug representation of the operand to the given stream.
- virtual void dump(raw_ostream &OS) const = 0;
+ /// print - Print a debug representation of the operand to the given stream.
+ virtual void print(raw_ostream &OS) const = 0;
+ /// dump - Print to the debug stream.
+ virtual void dump() const;
};
+//===----------------------------------------------------------------------===//
+// Debugging Support
+
+inline raw_ostream& operator<<(raw_ostream &OS, const MCParsedAsmOperand &MO) {
+ MO.print(OS);
+ return OS;
+}
+
} // end namespace llvm.
#endif
diff --git a/contrib/llvm/include/llvm/MC/MCRegisterInfo.h b/contrib/llvm/include/llvm/MC/MCRegisterInfo.h
new file mode 100644
index 0000000..caf98bb
--- /dev/null
+++ b/contrib/llvm/include/llvm/MC/MCRegisterInfo.h
@@ -0,0 +1,129 @@
+//=== MC/MCRegisterInfo.h - Target Register Description ---------*- C++ -*-===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+//
+// This file describes an abstract interface used to get information about a
+// target machines register file. This information is used for a variety of
+// purposed, especially register allocation.
+//
+//===----------------------------------------------------------------------===//
+
+#ifndef LLVM_MC_MCREGISTERINFO_H
+#define LLVM_MC_MCREGISTERINFO_H
+
+#include <cassert>
+
+namespace llvm {
+
+/// MCRegisterDesc - This record contains all of the information known about
+/// a particular register. The Overlaps field contains a pointer to a zero
+/// terminated array of registers that this register aliases, starting with
+/// itself. This is needed for architectures like X86 which have AL alias AX
+/// alias EAX. The SubRegs field is a zero terminated array of registers that
+/// are sub-registers of the specific register, e.g. AL, AH are sub-registers of
+/// AX. The SuperRegs field is a zero terminated array of registers that are
+/// super-registers of the specific register, e.g. RAX, EAX, are super-registers
+/// of AX.
+///
+struct MCRegisterDesc {
+ const char *Name; // Printable name for the reg (for debugging)
+ const unsigned *Overlaps; // Overlapping registers, described above
+ const unsigned *SubRegs; // Sub-register set, described above
+ const unsigned *SuperRegs; // Super-register set, described above
+};
+
+/// MCRegisterInfo base class - We assume that the target defines a static
+/// array of MCRegisterDesc objects that represent all of the machine
+/// registers that the target has. As such, we simply have to track a pointer
+/// to this array so that we can turn register number into a register
+/// descriptor.
+///
+/// Note this class is designed to be a base class of TargetRegisterInfo, which
+/// is the interface used by codegen. However, specific targets *should never*
+/// specialize this class. MCRegisterInfo should only contain getters to access
+/// TableGen generated physical register data. It must not be extended with
+/// virtual methods.
+///
+class MCRegisterInfo {
+private:
+ const MCRegisterDesc *Desc; // Pointer to the descriptor array
+ unsigned NumRegs; // Number of entries in the array
+
+public:
+ /// InitMCRegisterInfo - Initialize MCRegisterInfo, called by TableGen
+ /// auto-generated routines. *DO NOT USE*.
+ void InitMCRegisterInfo(const MCRegisterDesc *D, unsigned NR) {
+ Desc = D;
+ NumRegs = NR;
+ }
+
+ const MCRegisterDesc &operator[](unsigned RegNo) const {
+ assert(RegNo < NumRegs &&
+ "Attempting to access record for invalid register number!");
+ return Desc[RegNo];
+ }
+
+ /// Provide a get method, equivalent to [], but more useful if we have a
+ /// pointer to this object.
+ ///
+ const MCRegisterDesc &get(unsigned RegNo) const {
+ return operator[](RegNo);
+ }
+
+ /// getAliasSet - Return the set of registers aliased by the specified
+ /// register, or a null list of there are none. The list returned is zero
+ /// terminated.
+ ///
+ const unsigned *getAliasSet(unsigned RegNo) const {
+ // The Overlaps set always begins with Reg itself.
+ return get(RegNo).Overlaps + 1;
+ }
+
+ /// getOverlaps - Return a list of registers that overlap Reg, including
+ /// itself. This is the same as the alias set except Reg is included in the
+ /// list.
+ /// These are exactly the registers in { x | regsOverlap(x, Reg) }.
+ ///
+ const unsigned *getOverlaps(unsigned RegNo) const {
+ return get(RegNo).Overlaps;
+ }
+
+ /// getSubRegisters - Return the list of registers that are sub-registers of
+ /// the specified register, or a null list of there are none. The list
+ /// returned is zero terminated and sorted according to super-sub register
+ /// relations. e.g. X86::RAX's sub-register list is EAX, AX, AL, AH.
+ ///
+ const unsigned *getSubRegisters(unsigned RegNo) const {
+ return get(RegNo).SubRegs;
+ }
+
+ /// getSuperRegisters - Return the list of registers that are super-registers
+ /// of the specified register, or a null list of there are none. The list
+ /// returned is zero terminated and sorted according to super-sub register
+ /// relations. e.g. X86::AL's super-register list is AX, EAX, RAX.
+ ///
+ const unsigned *getSuperRegisters(unsigned RegNo) const {
+ return get(RegNo).SuperRegs;
+ }
+
+ /// getName - Return the human-readable symbolic target-specific name for the
+ /// specified physical register.
+ const char *getName(unsigned RegNo) const {
+ return get(RegNo).Name;
+ }
+
+ /// getNumRegs - Return the number of registers this target has (useful for
+ /// sizing arrays holding per register information)
+ unsigned getNumRegs() const {
+ return NumRegs;
+ }
+};
+
+} // End llvm namespace
+
+#endif
diff --git a/contrib/llvm/include/llvm/MC/MCStreamer.h b/contrib/llvm/include/llvm/MC/MCStreamer.h
index c05a925..7bdba5f 100644
--- a/contrib/llvm/include/llvm/MC/MCStreamer.h
+++ b/contrib/llvm/include/llvm/MC/MCStreamer.h
@@ -460,7 +460,8 @@ namespace llvm {
virtual void EmitDwarfAdvanceLineAddr(int64_t LineDelta,
const MCSymbol *LastLabel,
- const MCSymbol *Label) = 0;
+ const MCSymbol *Label,
+ unsigned PointerSize) = 0;
virtual void EmitDwarfAdvanceFrameAddr(const MCSymbol *LastLabel,
const MCSymbol *Label) {
@@ -547,6 +548,9 @@ namespace llvm {
///
/// \param ShowInst - Whether to show the MCInst representation inline with
/// the assembly.
+ ///
+ /// \param DecodeLSDA - If true, emit comments that translates the LSDA into a
+ /// human readable format. Only usable with CFI.
MCStreamer *createAsmStreamer(MCContext &Ctx, formatted_raw_ostream &OS,
bool isVerboseAsm,
bool useLoc,
diff --git a/contrib/llvm/include/llvm/MC/MCSubtargetInfo.h b/contrib/llvm/include/llvm/MC/MCSubtargetInfo.h
new file mode 100644
index 0000000..3b53f20
--- /dev/null
+++ b/contrib/llvm/include/llvm/MC/MCSubtargetInfo.h
@@ -0,0 +1,79 @@
+//==-- llvm/MC/MCSubtargetInfo.h - Subtarget Information ---------*- C++ -*-==//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+//
+// This file describes the subtarget options of a Target machine.
+//
+//===----------------------------------------------------------------------===//
+
+#ifndef LLVM_MC_MCSUBTARGET_H
+#define LLVM_MC_MCSUBTARGET_H
+
+#include "llvm/MC/SubtargetFeature.h"
+#include "llvm/MC/MCInstrItineraries.h"
+#include <string>
+
+namespace llvm {
+
+class StringRef;
+
+//===----------------------------------------------------------------------===//
+///
+/// MCSubtargetInfo - Generic base class for all target subtargets.
+///
+class MCSubtargetInfo {
+ std::string TargetTriple; // Target triple
+ const SubtargetFeatureKV *ProcFeatures; // Processor feature list
+ const SubtargetFeatureKV *ProcDesc; // Processor descriptions
+ const SubtargetInfoKV *ProcItins; // Scheduling itineraries
+ const InstrStage *Stages; // Instruction stages
+ const unsigned *OperandCycles; // Operand cycles
+ const unsigned *ForwardingPathes; // Forwarding pathes
+ unsigned NumFeatures; // Number of processor features
+ unsigned NumProcs; // Number of processors
+ uint64_t FeatureBits; // Feature bits for current CPU + FS
+
+public:
+ void InitMCSubtargetInfo(StringRef TT, StringRef CPU, StringRef FS,
+ const SubtargetFeatureKV *PF,
+ const SubtargetFeatureKV *PD,
+ const SubtargetInfoKV *PI, const InstrStage *IS,
+ const unsigned *OC, const unsigned *FP,
+ unsigned NF, unsigned NP);
+
+ /// getTargetTriple - Return the target triple string.
+ StringRef getTargetTriple() const {
+ return TargetTriple;
+ }
+
+ /// getFeatureBits - Return the feature bits.
+ ///
+ uint64_t getFeatureBits() const {
+ return FeatureBits;
+ }
+
+ /// ReInitMCSubtargetInfo - Change CPU (and optionally supplemented with
+ /// feature string), recompute and return feature bits.
+ uint64_t ReInitMCSubtargetInfo(StringRef CPU, StringRef FS);
+
+ /// ToggleFeature - Toggle a feature and returns the re-computed feature
+ /// bits. This version does not change the implied bits.
+ uint64_t ToggleFeature(uint64_t FB);
+
+ /// ToggleFeature - Toggle a feature and returns the re-computed feature
+ /// bits. This version will also change all implied bits.
+ uint64_t ToggleFeature(StringRef FS);
+
+ /// getInstrItineraryForCPU - Get scheduling itinerary of a CPU.
+ ///
+ InstrItineraryData getInstrItineraryForCPU(StringRef CPU) const;
+};
+
+} // End llvm namespace
+
+#endif
diff --git a/contrib/llvm/include/llvm/Target/SubtargetFeature.h b/contrib/llvm/include/llvm/MC/SubtargetFeature.h
index 4213d9b..1a7dc92 100644
--- a/contrib/llvm/include/llvm/Target/SubtargetFeature.h
+++ b/contrib/llvm/include/llvm/MC/SubtargetFeature.h
@@ -1,4 +1,4 @@
-//===-- llvm/Target/SubtargetFeature.h - CPU characteristics ----*- C++ -*-===//
+//===-- llvm/MC/SubtargetFeature.h - CPU characteristics --------*- C++ -*-===//
//
// The LLVM Compiler Infrastructure
//
@@ -15,17 +15,16 @@
//
//===----------------------------------------------------------------------===//
-#ifndef LLVM_TARGET_SUBTARGETFEATURE_H
-#define LLVM_TARGET_SUBTARGETFEATURE_H
+#ifndef LLVM_MC_SUBTARGETFEATURE_H
+#define LLVM_MC_SUBTARGETFEATURE_H
-#include <string>
#include <vector>
-#include <cstring>
#include "llvm/ADT/Triple.h"
#include "llvm/Support/DataTypes.h"
namespace llvm {
class raw_ostream;
+ class StringRef;
//===----------------------------------------------------------------------===//
///
@@ -75,32 +74,30 @@ struct SubtargetInfoKV {
class SubtargetFeatures {
std::vector<std::string> Features; // Subtarget features as a vector
public:
- explicit SubtargetFeatures(const std::string &Initial = std::string());
+ explicit SubtargetFeatures(const StringRef Initial = "");
/// Features string accessors.
std::string getString() const;
- void setString(const std::string &Initial);
-
- /// Set the CPU string. Replaces previous setting. Setting to "" clears CPU.
- void setCPU(const std::string &String);
-
- /// Setting CPU string only if no string is set.
- void setCPUIfNone(const std::string &String);
-
- /// Returns current CPU string.
- const std::string & getCPU() const;
/// Adding Features.
- void AddFeature(const std::string &String, bool IsEnabled = true);
+ void AddFeature(const StringRef String, bool IsEnabled = true);
- /// Get feature bits.
- uint64_t getBits(const SubtargetFeatureKV *CPUTable,
- size_t CPUTableSize,
- const SubtargetFeatureKV *FeatureTable,
+ /// ToggleFeature - Toggle a feature and returns the newly updated feature
+ /// bits.
+ uint64_t ToggleFeature(uint64_t Bits, const StringRef String,
+ const SubtargetFeatureKV *FeatureTable,
size_t FeatureTableSize);
+
+ /// Get feature bits of a CPU.
+ uint64_t getFeatureBits(const StringRef CPU,
+ const SubtargetFeatureKV *CPUTable,
+ size_t CPUTableSize,
+ const SubtargetFeatureKV *FeatureTable,
+ size_t FeatureTableSize);
- /// Get info pointer
- void *getInfo(const SubtargetInfoKV *Table, size_t TableSize);
+ /// Get scheduling itinerary of a CPU.
+ void *getItinerary(const StringRef CPU,
+ const SubtargetInfoKV *Table, size_t TableSize);
/// Print feature string.
void print(raw_ostream &OS) const;
@@ -110,8 +107,7 @@ public:
/// Retrieve a formatted string of the default features for the specified
/// target triple.
- void getDefaultSubtargetFeatures(const std::string &CPU,
- const Triple& Triple);
+ void getDefaultSubtargetFeatures(const Triple& Triple);
};
} // End namespace llvm
diff --git a/contrib/llvm/include/llvm/Module.h b/contrib/llvm/include/llvm/Module.h
index aef8eb8..47d23f3 100644
--- a/contrib/llvm/include/llvm/Module.h
+++ b/contrib/llvm/include/llvm/Module.h
@@ -28,6 +28,10 @@ namespace llvm {
class FunctionType;
class GVMaterializer;
class LLVMContext;
+class StructType;
+template<typename T> struct DenseMapInfo;
+template<typename KeyT, typename ValueT,
+ typename KeyInfoT, typename ValueInfoT> class DenseMap;
template<> struct ilist_traits<Function>
: public SymbolTableListTraits<Function, Module> {
@@ -145,7 +149,6 @@ private:
NamedMDListType NamedMDList; ///< The named metadata in the module
std::string GlobalScopeAsm; ///< Inline Asm at global scope.
ValueSymbolTable *ValSymTab; ///< Symbol table for values
- TypeSymbolTable *TypeSymTab; ///< Symbol table for types
OwningPtr<GVMaterializer> Materializer; ///< Used to materialize GlobalValues
std::string ModuleID; ///< Human readable identifier for the module
std::string TargetTriple; ///< Platform target triple Module compiled on
@@ -231,7 +234,7 @@ public:
/// @name Generic Value Accessors
/// @{
- /// getNamedValue - Return the first global value in the module with
+ /// getNamedValue - Return the global value in the module with
/// the specified name, of arbitrary type. This method returns null
/// if a global with the specified name is not found.
GlobalValue *getNamedValue(StringRef Name) const;
@@ -244,6 +247,18 @@ public:
/// custom metadata IDs registered in this LLVMContext.
void getMDKindNames(SmallVectorImpl<StringRef> &Result) const;
+
+ typedef DenseMap<StructType*, unsigned, DenseMapInfo<StructType*>,
+ DenseMapInfo<unsigned> > NumeredTypesMapTy;
+
+ /// findUsedStructTypes - Walk the entire module and find all of the
+ /// struct types that are in use, returning them in a vector.
+ void findUsedStructTypes(std::vector<StructType*> &StructTypes) const;
+
+ /// getTypeByName - Return the type with the specified name, or null if there
+ /// is none by that name.
+ StructType *getTypeByName(StringRef Name) const;
+
/// @}
/// @name Function Accessors
/// @{
@@ -296,7 +311,7 @@ public:
GlobalVariable *getGlobalVariable(StringRef Name,
bool AllowInternal = false) const;
- /// getNamedGlobal - Return the first global variable in the module with the
+ /// getNamedGlobal - Return the global variable in the module with the
/// specified name, of arbitrary type. This method returns null if a global
/// with the specified name is not found.
GlobalVariable *getNamedGlobal(StringRef Name) const {
@@ -316,7 +331,7 @@ public:
/// @name Global Alias Accessors
/// @{
- /// getNamedAlias - Return the first global alias in the module with the
+ /// getNamedAlias - Return the global alias in the module with the
/// specified name, of arbitrary type. This method returns null if a global
/// with the specified name is not found.
GlobalAlias *getNamedAlias(StringRef Name) const;
@@ -325,12 +340,12 @@ public:
/// @name Named Metadata Accessors
/// @{
- /// getNamedMetadata - Return the first NamedMDNode in the module with the
+ /// getNamedMetadata - Return the NamedMDNode in the module with the
/// specified name. This method returns null if a NamedMDNode with the
/// specified name is not found.
NamedMDNode *getNamedMetadata(const Twine &Name) const;
- /// getOrInsertNamedMetadata - Return the first named MDNode in the module
+ /// getOrInsertNamedMetadata - Return the named MDNode in the module
/// with the specified name. This method returns a new NamedMDNode if a
/// NamedMDNode with the specified name is not found.
NamedMDNode *getOrInsertNamedMetadata(StringRef Name);
@@ -340,23 +355,6 @@ public:
void eraseNamedMetadata(NamedMDNode *NMD);
/// @}
-/// @name Type Accessors
-/// @{
-
- /// addTypeName - Insert an entry in the symbol table mapping Str to Type. If
- /// there is already an entry for this name, true is returned and the symbol
- /// table is not modified.
- bool addTypeName(StringRef Name, const Type *Ty);
-
- /// getTypeName - If there is at least one entry in the symbol table for the
- /// specified type, return it.
- std::string getTypeName(const Type *Ty) const;
-
- /// getTypeByName - Return the type with the specified name in this module, or
- /// null if there is none by that name.
- const Type *getTypeByName(StringRef Name) const;
-
-/// @}
/// @name Materialization
/// @{
@@ -429,41 +427,26 @@ public:
const ValueSymbolTable &getValueSymbolTable() const { return *ValSymTab; }
/// Get the Module's symbol table of global variable and function identifiers.
ValueSymbolTable &getValueSymbolTable() { return *ValSymTab; }
- /// Get the symbol table of types
- const TypeSymbolTable &getTypeSymbolTable() const { return *TypeSymTab; }
- /// Get the Module's symbol table of types
- TypeSymbolTable &getTypeSymbolTable() { return *TypeSymTab; }
/// @}
/// @name Global Variable Iteration
/// @{
- /// Get an iterator to the first global variable
global_iterator global_begin() { return GlobalList.begin(); }
- /// Get a constant iterator to the first global variable
const_global_iterator global_begin() const { return GlobalList.begin(); }
- /// Get an iterator to the last global variable
global_iterator global_end () { return GlobalList.end(); }
- /// Get a constant iterator to the last global variable
const_global_iterator global_end () const { return GlobalList.end(); }
- /// Determine if the list of globals is empty.
bool global_empty() const { return GlobalList.empty(); }
/// @}
/// @name Function Iteration
/// @{
- /// Get an iterator to the first function.
iterator begin() { return FunctionList.begin(); }
- /// Get a constant iterator to the first function.
const_iterator begin() const { return FunctionList.begin(); }
- /// Get an iterator to the last function.
iterator end () { return FunctionList.end(); }
- /// Get a constant iterator to the last function.
const_iterator end () const { return FunctionList.end(); }
- /// Determine how many functions are in the Module's list of functions.
size_t size() const { return FunctionList.size(); }
- /// Determine if the list of functions is empty.
bool empty() const { return FunctionList.empty(); }
/// @}
@@ -487,17 +470,11 @@ public:
/// @name Alias Iteration
/// @{
- /// Get an iterator to the first alias.
alias_iterator alias_begin() { return AliasList.begin(); }
- /// Get a constant iterator to the first alias.
const_alias_iterator alias_begin() const { return AliasList.begin(); }
- /// Get an iterator to the last alias.
alias_iterator alias_end () { return AliasList.end(); }
- /// Get a constant iterator to the last alias.
const_alias_iterator alias_end () const { return AliasList.end(); }
- /// Determine how many aliases are in the Module's list of aliases.
size_t alias_size () const { return AliasList.size(); }
- /// Determine if the list of aliases is empty.
bool alias_empty() const { return AliasList.empty(); }
@@ -505,24 +482,17 @@ public:
/// @name Named Metadata Iteration
/// @{
- /// Get an iterator to the first named metadata.
named_metadata_iterator named_metadata_begin() { return NamedMDList.begin(); }
- /// Get a constant iterator to the first named metadata.
const_named_metadata_iterator named_metadata_begin() const {
return NamedMDList.begin();
}
- /// Get an iterator to the last named metadata.
named_metadata_iterator named_metadata_end() { return NamedMDList.end(); }
- /// Get a constant iterator to the last named metadata.
const_named_metadata_iterator named_metadata_end() const {
return NamedMDList.end();
}
- /// Determine how many NamedMDNodes are in the Module's list of named
- /// metadata.
size_t named_metadata_size() const { return NamedMDList.size(); }
- /// Determine if the list of named metadata is empty.
bool named_metadata_empty() const { return NamedMDList.empty(); }
@@ -530,11 +500,13 @@ public:
/// @name Utility functions for printing and dumping Module objects
/// @{
- /// Print the module to an output stream with AssemblyAnnotationWriter.
+ /// Print the module to an output stream with an optional
+ /// AssemblyAnnotationWriter.
void print(raw_ostream &OS, AssemblyAnnotationWriter *AAW) const;
/// Dump the module to stderr (for debugging).
void dump() const;
+
/// This function causes all the subinstructions to "let go" of all references
/// that they are maintaining. This allows one to 'delete' a whole class at
/// a time, even though there may be circular references... first all
diff --git a/contrib/llvm/include/llvm/Object/Binary.h b/contrib/llvm/include/llvm/Object/Binary.h
new file mode 100644
index 0000000..cd092fd
--- /dev/null
+++ b/contrib/llvm/include/llvm/Object/Binary.h
@@ -0,0 +1,67 @@
+//===- Binary.h - A generic binary file -------------------------*- C++ -*-===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+//
+// This file declares the Binary class.
+//
+//===----------------------------------------------------------------------===//
+
+#ifndef LLVM_OBJECT_BINARY_H
+#define LLVM_OBJECT_BINARY_H
+
+#include "llvm/ADT/OwningPtr.h"
+#include "llvm/Object/Error.h"
+
+namespace llvm {
+
+class MemoryBuffer;
+class StringRef;
+
+namespace object {
+
+class Binary {
+private:
+ Binary(); // = delete
+ Binary(const Binary &other); // = delete
+
+ unsigned int TypeID;
+
+protected:
+ MemoryBuffer *Data;
+
+ Binary(unsigned int Type, MemoryBuffer *Source);
+
+ enum {
+ isArchive,
+
+ // Object and children.
+ isObject,
+ isCOFF,
+ isELF,
+ isMachO,
+ lastObject
+ };
+
+public:
+ virtual ~Binary();
+
+ StringRef getData() const;
+ StringRef getFileName() const;
+
+ // Cast methods.
+ unsigned int getType() const { return TypeID; }
+ static inline bool classof(const Binary *v) { return true; }
+};
+
+error_code createBinary(MemoryBuffer *Source, OwningPtr<Binary> &Result);
+error_code createBinary(StringRef Path, OwningPtr<Binary> &Result);
+
+}
+}
+
+#endif
diff --git a/contrib/llvm/include/llvm/Object/COFF.h b/contrib/llvm/include/llvm/Object/COFF.h
new file mode 100644
index 0000000..121f9e8
--- /dev/null
+++ b/contrib/llvm/include/llvm/Object/COFF.h
@@ -0,0 +1,117 @@
+//===- COFF.h - COFF object file implementation -----------------*- C++ -*-===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+//
+// This file declares the COFFObjectFile class.
+//
+//===----------------------------------------------------------------------===//
+
+#ifndef LLVM_OBJECT_COFF_H
+#define LLVM_OBJECT_COFF_H
+
+#include "llvm/Object/ObjectFile.h"
+#include "llvm/Support/COFF.h"
+#include "llvm/Support/Endian.h"
+
+namespace llvm {
+namespace object {
+
+struct coff_file_header {
+ support::ulittle16_t Machine;
+ support::ulittle16_t NumberOfSections;
+ support::ulittle32_t TimeDateStamp;
+ support::ulittle32_t PointerToSymbolTable;
+ support::ulittle32_t NumberOfSymbols;
+ support::ulittle16_t SizeOfOptionalHeader;
+ support::ulittle16_t Characteristics;
+};
+
+struct coff_symbol {
+ struct StringTableOffset {
+ support::ulittle32_t Zeroes;
+ support::ulittle32_t Offset;
+ };
+
+ union {
+ char ShortName[8];
+ StringTableOffset Offset;
+ } Name;
+
+ support::ulittle32_t Value;
+ support::little16_t SectionNumber;
+
+ struct {
+ support::ulittle8_t BaseType;
+ support::ulittle8_t ComplexType;
+ } Type;
+
+ support::ulittle8_t StorageClass;
+ support::ulittle8_t NumberOfAuxSymbols;
+};
+
+struct coff_section {
+ char Name[8];
+ support::ulittle32_t VirtualSize;
+ support::ulittle32_t VirtualAddress;
+ support::ulittle32_t SizeOfRawData;
+ support::ulittle32_t PointerToRawData;
+ support::ulittle32_t PointerToRelocations;
+ support::ulittle32_t PointerToLinenumbers;
+ support::ulittle16_t NumberOfRelocations;
+ support::ulittle16_t NumberOfLinenumbers;
+ support::ulittle32_t Characteristics;
+};
+
+class COFFObjectFile : public ObjectFile {
+private:
+ const coff_file_header *Header;
+ const coff_section *SectionTable;
+ const coff_symbol *SymbolTable;
+ const char *StringTable;
+ uint32_t StringTableSize;
+
+ error_code getSection(int32_t index,
+ const coff_section *&Res) const;
+ error_code getString(uint32_t offset, StringRef &Res) const;
+
+ const coff_symbol *toSymb(DataRefImpl Symb) const;
+ const coff_section *toSec(DataRefImpl Sec) const;
+
+protected:
+ virtual error_code getSymbolNext(DataRefImpl Symb, SymbolRef &Res) const;
+ virtual error_code getSymbolName(DataRefImpl Symb, StringRef &Res) const;
+ virtual error_code getSymbolAddress(DataRefImpl Symb, uint64_t &Res) const;
+ virtual error_code getSymbolSize(DataRefImpl Symb, uint64_t &Res) const;
+ virtual error_code getSymbolNMTypeChar(DataRefImpl Symb, char &Res) const;
+ virtual error_code isSymbolInternal(DataRefImpl Symb, bool &Res) const;
+
+ virtual error_code getSectionNext(DataRefImpl Sec, SectionRef &Res) const;
+ virtual error_code getSectionName(DataRefImpl Sec, StringRef &Res) const;
+ virtual error_code getSectionAddress(DataRefImpl Sec, uint64_t &Res) const;
+ virtual error_code getSectionSize(DataRefImpl Sec, uint64_t &Res) const;
+ virtual error_code getSectionContents(DataRefImpl Sec, StringRef &Res) const;
+ virtual error_code isSectionText(DataRefImpl Sec, bool &Res) const;
+ virtual error_code sectionContainsSymbol(DataRefImpl Sec, DataRefImpl Symb,
+ bool &Result) const;
+
+public:
+ COFFObjectFile(MemoryBuffer *Object, error_code &ec);
+ virtual symbol_iterator begin_symbols() const;
+ virtual symbol_iterator end_symbols() const;
+ virtual section_iterator begin_sections() const;
+ virtual section_iterator end_sections() const;
+
+ virtual uint8_t getBytesInAddress() const;
+ virtual StringRef getFileFormatName() const;
+ virtual unsigned getArch() const;
+};
+
+}
+}
+
+#endif
diff --git a/contrib/llvm/include/llvm/Object/Error.h b/contrib/llvm/include/llvm/Object/Error.h
new file mode 100644
index 0000000..fbaf71c
--- /dev/null
+++ b/contrib/llvm/include/llvm/Object/Error.h
@@ -0,0 +1,50 @@
+//===- Error.h - system_error extensions for Object -------------*- C++ -*-===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+//
+// This declares a new error_category for the Object library.
+//
+//===----------------------------------------------------------------------===//
+
+#ifndef LLVM_OBJECT_ERROR_H
+#define LLVM_OBJECT_ERROR_H
+
+#include "llvm/Support/system_error.h"
+
+namespace llvm {
+namespace object {
+
+const error_category &object_category();
+
+struct object_error {
+enum _ {
+ success = 0,
+ invalid_file_type,
+ parse_failed,
+ unexpected_eof
+};
+ _ v_;
+
+ object_error(_ v) : v_(v) {}
+ explicit object_error(int v) : v_(_(v)) {}
+ operator int() const {return v_;}
+};
+
+inline error_code make_error_code(object_error e) {
+ return error_code(static_cast<int>(e), object_category());
+}
+
+} // end namespace object.
+
+template <> struct is_error_code_enum<object::object_error> : true_type { };
+
+template <> struct is_error_code_enum<object::object_error::_> : true_type { };
+
+} // end namespace llvm.
+
+#endif
diff --git a/contrib/llvm/include/llvm/Object/ObjectFile.h b/contrib/llvm/include/llvm/Object/ObjectFile.h
index eee9d44..98ac067 100644
--- a/contrib/llvm/include/llvm/Object/ObjectFile.h
+++ b/contrib/llvm/include/llvm/Object/ObjectFile.h
@@ -14,15 +14,14 @@
#ifndef LLVM_OBJECT_OBJECT_FILE_H
#define LLVM_OBJECT_OBJECT_FILE_H
+#include "llvm/Object/Binary.h"
#include "llvm/ADT/StringRef.h"
#include "llvm/Support/DataTypes.h"
+#include "llvm/Support/ErrorHandling.h"
+#include "llvm/Support/MemoryBuffer.h"
#include <cstring>
namespace llvm {
-
-class MemoryBuffer;
-class StringRef;
-
namespace object {
class ObjectFile;
@@ -31,7 +30,7 @@ union DataRefImpl {
struct {
uint32_t a, b;
} d;
- intptr_t p;
+ uintptr_t p;
};
static bool operator ==(const DataRefImpl &a, const DataRefImpl &b) {
@@ -40,52 +39,80 @@ static bool operator ==(const DataRefImpl &a, const DataRefImpl &b) {
return std::memcmp(&a, &b, sizeof(DataRefImpl)) == 0;
}
+class RelocationRef {
+ DataRefImpl RelocationPimpl;
+ const ObjectFile *OwningObject;
+
+public:
+ RelocationRef() : OwningObject(NULL) {
+ std::memset(&RelocationPimpl, 0, sizeof(RelocationPimpl));
+ }
+
+ RelocationRef(DataRefImpl RelocationP, const ObjectFile *Owner);
+
+ bool operator==(const RelocationRef &Other) const;
+
+ error_code getNext(RelocationRef &Result);
+};
+
/// SymbolRef - This is a value type class that represents a single symbol in
/// the list of symbols in the object file.
class SymbolRef {
+ friend class SectionRef;
DataRefImpl SymbolPimpl;
const ObjectFile *OwningObject;
public:
+ SymbolRef() : OwningObject(NULL) {
+ std::memset(&SymbolPimpl, 0, sizeof(SymbolPimpl));
+ }
+
SymbolRef(DataRefImpl SymbolP, const ObjectFile *Owner);
bool operator==(const SymbolRef &Other) const;
- SymbolRef getNext() const;
+ error_code getNext(SymbolRef &Result) const;
- StringRef getName() const;
- uint64_t getAddress() const;
- uint64_t getSize() const;
+ error_code getName(StringRef &Result) const;
+ error_code getAddress(uint64_t &Result) const;
+ error_code getSize(uint64_t &Result) const;
/// Returns the ascii char that should be displayed in a symbol table dump via
/// nm for this symbol.
- char getNMTypeChar() const;
+ error_code getNMTypeChar(char &Result) const;
/// Returns true for symbols that are internal to the object file format such
/// as section symbols.
- bool isInternal() const;
+ error_code isInternal(bool &Result) const;
};
/// SectionRef - This is a value type class that represents a single section in
/// the list of sections in the object file.
class SectionRef {
+ friend class SymbolRef;
DataRefImpl SectionPimpl;
const ObjectFile *OwningObject;
public:
+ SectionRef() : OwningObject(NULL) {
+ std::memset(&SectionPimpl, 0, sizeof(SectionPimpl));
+ }
+
SectionRef(DataRefImpl SectionP, const ObjectFile *Owner);
bool operator==(const SectionRef &Other) const;
- SectionRef getNext() const;
+ error_code getNext(SectionRef &Result) const;
- StringRef getName() const;
- uint64_t getAddress() const;
- uint64_t getSize() const;
- StringRef getContents() const;
+ error_code getName(StringRef &Result) const;
+ error_code getAddress(uint64_t &Result) const;
+ error_code getSize(uint64_t &Result) const;
+ error_code getContents(StringRef &Result) const;
// FIXME: Move to the normalization layer when it's created.
- bool isText() const;
+ error_code isText(bool &Result) const;
+
+ error_code containsSymbol(SymbolRef S, bool &Result) const;
};
const uint64_t UnknownAddressOrSize = ~0ULL;
@@ -93,38 +120,44 @@ const uint64_t UnknownAddressOrSize = ~0ULL;
/// ObjectFile - This class is the base class for all object file types.
/// Concrete instances of this object are created by createObjectFile, which
/// figure out which type to create.
-class ObjectFile {
+class ObjectFile : public Binary {
private:
ObjectFile(); // = delete
ObjectFile(const ObjectFile &other); // = delete
protected:
- MemoryBuffer *MapFile;
- const uint8_t *base;
+ ObjectFile(unsigned int Type, MemoryBuffer *source, error_code &ec);
- ObjectFile(MemoryBuffer *Object);
+ const uint8_t *base() const {
+ return reinterpret_cast<const uint8_t *>(Data->getBufferStart());
+ }
// These functions are for SymbolRef to call internally. The main goal of
// this is to allow SymbolRef::SymbolPimpl to point directly to the symbol
// entry in the memory mapped object file. SymbolPimpl cannot contain any
// virtual functions because then it could not point into the memory mapped
// file.
+ //
+ // Implementations assume that the DataRefImpl is valid and has not been
+ // modified externally. It's UB otherwise.
friend class SymbolRef;
- virtual SymbolRef getSymbolNext(DataRefImpl Symb) const = 0;
- virtual StringRef getSymbolName(DataRefImpl Symb) const = 0;
- virtual uint64_t getSymbolAddress(DataRefImpl Symb) const = 0;
- virtual uint64_t getSymbolSize(DataRefImpl Symb) const = 0;
- virtual char getSymbolNMTypeChar(DataRefImpl Symb) const = 0;
- virtual bool isSymbolInternal(DataRefImpl Symb) const = 0;
+ virtual error_code getSymbolNext(DataRefImpl Symb, SymbolRef &Res) const = 0;
+ virtual error_code getSymbolName(DataRefImpl Symb, StringRef &Res) const = 0;
+ virtual error_code getSymbolAddress(DataRefImpl Symb, uint64_t &Res) const =0;
+ virtual error_code getSymbolSize(DataRefImpl Symb, uint64_t &Res) const = 0;
+ virtual error_code getSymbolNMTypeChar(DataRefImpl Symb, char &Res) const = 0;
+ virtual error_code isSymbolInternal(DataRefImpl Symb, bool &Res) const = 0;
// Same as above for SectionRef.
friend class SectionRef;
- virtual SectionRef getSectionNext(DataRefImpl Sec) const = 0;
- virtual StringRef getSectionName(DataRefImpl Sec) const = 0;
- virtual uint64_t getSectionAddress(DataRefImpl Sec) const = 0;
- virtual uint64_t getSectionSize(DataRefImpl Sec) const = 0;
- virtual StringRef getSectionContents(DataRefImpl Sec) const = 0;
- virtual bool isSectionText(DataRefImpl Sec) const = 0;
+ virtual error_code getSectionNext(DataRefImpl Sec, SectionRef &Res) const = 0;
+ virtual error_code getSectionName(DataRefImpl Sec, StringRef &Res) const = 0;
+ virtual error_code getSectionAddress(DataRefImpl Sec, uint64_t &Res) const =0;
+ virtual error_code getSectionSize(DataRefImpl Sec, uint64_t &Res) const = 0;
+ virtual error_code getSectionContents(DataRefImpl Sec, StringRef &Res)const=0;
+ virtual error_code isSectionText(DataRefImpl Sec, bool &Res) const = 0;
+ virtual error_code sectionContainsSymbol(DataRefImpl Sec, DataRefImpl Symb,
+ bool &Result) const = 0;
public:
@@ -139,6 +172,10 @@ public:
return &Current;
}
+ const content_type &operator*() const {
+ return Current;
+ }
+
bool operator==(const content_iterator &other) const {
return Current == other.Current;
}
@@ -147,8 +184,12 @@ public:
return !(*this == other);
}
- content_iterator& operator++() { // Preincrement
- Current = Current.getNext();
+ content_iterator& increment(error_code &err) {
+ content_type next;
+ if (error_code ec = Current.getNext(next))
+ err = ec;
+ else
+ Current = next;
return *this;
}
};
@@ -156,8 +197,6 @@ public:
typedef content_iterator<SymbolRef> symbol_iterator;
typedef content_iterator<SectionRef> section_iterator;
- virtual ~ObjectFile();
-
virtual symbol_iterator begin_symbols() const = 0;
virtual symbol_iterator end_symbols() const = 0;
@@ -171,8 +210,6 @@ public:
virtual StringRef getFileFormatName() const = 0;
virtual /* Triple::ArchType */ unsigned getArch() const = 0;
- StringRef getFilename() const;
-
/// @returns Pointer to ObjectFile subclass to handle this type of object.
/// @param ObjectPath The path to the object file. ObjectPath.isObject must
/// return true.
@@ -180,12 +217,16 @@ public:
static ObjectFile *createObjectFile(StringRef ObjectPath);
static ObjectFile *createObjectFile(MemoryBuffer *Object);
-private:
+ static inline bool classof(const Binary *v) {
+ return v->getType() >= isObject &&
+ v->getType() < lastObject;
+ }
+ static inline bool classof(const ObjectFile *v) { return true; }
+
+public:
static ObjectFile *createCOFFObjectFile(MemoryBuffer *Object);
static ObjectFile *createELFObjectFile(MemoryBuffer *Object);
static ObjectFile *createMachOObjectFile(MemoryBuffer *Object);
- static ObjectFile *createArchiveObjectFile(MemoryBuffer *Object);
- static ObjectFile *createLibObjectFile(MemoryBuffer *Object);
};
// Inline function definitions.
@@ -197,28 +238,28 @@ inline bool SymbolRef::operator==(const SymbolRef &Other) const {
return SymbolPimpl == Other.SymbolPimpl;
}
-inline SymbolRef SymbolRef::getNext() const {
- return OwningObject->getSymbolNext(SymbolPimpl);
+inline error_code SymbolRef::getNext(SymbolRef &Result) const {
+ return OwningObject->getSymbolNext(SymbolPimpl, Result);
}
-inline StringRef SymbolRef::getName() const {
- return OwningObject->getSymbolName(SymbolPimpl);
+inline error_code SymbolRef::getName(StringRef &Result) const {
+ return OwningObject->getSymbolName(SymbolPimpl, Result);
}
-inline uint64_t SymbolRef::getAddress() const {
- return OwningObject->getSymbolAddress(SymbolPimpl);
+inline error_code SymbolRef::getAddress(uint64_t &Result) const {
+ return OwningObject->getSymbolAddress(SymbolPimpl, Result);
}
-inline uint64_t SymbolRef::getSize() const {
- return OwningObject->getSymbolSize(SymbolPimpl);
+inline error_code SymbolRef::getSize(uint64_t &Result) const {
+ return OwningObject->getSymbolSize(SymbolPimpl, Result);
}
-inline char SymbolRef::getNMTypeChar() const {
- return OwningObject->getSymbolNMTypeChar(SymbolPimpl);
+inline error_code SymbolRef::getNMTypeChar(char &Result) const {
+ return OwningObject->getSymbolNMTypeChar(SymbolPimpl, Result);
}
-inline bool SymbolRef::isInternal() const {
- return OwningObject->isSymbolInternal(SymbolPimpl);
+inline error_code SymbolRef::isInternal(bool &Result) const {
+ return OwningObject->isSymbolInternal(SymbolPimpl, Result);
}
@@ -232,28 +273,33 @@ inline bool SectionRef::operator==(const SectionRef &Other) const {
return SectionPimpl == Other.SectionPimpl;
}
-inline SectionRef SectionRef::getNext() const {
- return OwningObject->getSectionNext(SectionPimpl);
+inline error_code SectionRef::getNext(SectionRef &Result) const {
+ return OwningObject->getSectionNext(SectionPimpl, Result);
+}
+
+inline error_code SectionRef::getName(StringRef &Result) const {
+ return OwningObject->getSectionName(SectionPimpl, Result);
}
-inline StringRef SectionRef::getName() const {
- return OwningObject->getSectionName(SectionPimpl);
+inline error_code SectionRef::getAddress(uint64_t &Result) const {
+ return OwningObject->getSectionAddress(SectionPimpl, Result);
}
-inline uint64_t SectionRef::getAddress() const {
- return OwningObject->getSectionAddress(SectionPimpl);
+inline error_code SectionRef::getSize(uint64_t &Result) const {
+ return OwningObject->getSectionSize(SectionPimpl, Result);
}
-inline uint64_t SectionRef::getSize() const {
- return OwningObject->getSectionSize(SectionPimpl);
+inline error_code SectionRef::getContents(StringRef &Result) const {
+ return OwningObject->getSectionContents(SectionPimpl, Result);
}
-inline StringRef SectionRef::getContents() const {
- return OwningObject->getSectionContents(SectionPimpl);
+inline error_code SectionRef::isText(bool &Result) const {
+ return OwningObject->isSectionText(SectionPimpl, Result);
}
-inline bool SectionRef::isText() const {
- return OwningObject->isSectionText(SectionPimpl);
+inline error_code SectionRef::containsSymbol(SymbolRef S, bool &Result) const {
+ return OwningObject->sectionContainsSymbol(SectionPimpl, S.SymbolPimpl,
+ Result);
}
} // end namespace object
diff --git a/contrib/llvm/include/llvm/Support/BranchProbability.h b/contrib/llvm/include/llvm/Support/BranchProbability.h
index 7ba6491..2e81490 100644
--- a/contrib/llvm/include/llvm/Support/BranchProbability.h
+++ b/contrib/llvm/include/llvm/Support/BranchProbability.h
@@ -19,15 +19,9 @@
namespace llvm {
class raw_ostream;
-class BranchProbabilityInfo;
-class MachineBranchProbabilityInfo;
-class MachineBasicBlock;
// This class represents Branch Probability as a non-negative fraction.
class BranchProbability {
- friend class BranchProbabilityInfo;
- friend class MachineBranchProbabilityInfo;
- friend class MachineBasicBlock;
// Numerator
uint32_t N;
@@ -35,9 +29,17 @@ class BranchProbability {
// Denominator
uint32_t D;
+public:
BranchProbability(uint32_t n, uint32_t d);
-public:
+ uint32_t getNumerator() const { return N; }
+ uint32_t getDenominator() const { return D; }
+
+ // Return (1 - Probability).
+ BranchProbability getCompl() {
+ return BranchProbability(D - N, D);
+ }
+
raw_ostream &print(raw_ostream &OS) const;
void dump() const;
diff --git a/contrib/llvm/include/llvm/Support/CFG.h b/contrib/llvm/include/llvm/Support/CFG.h
index d2ea123..29313ef 100644
--- a/contrib/llvm/include/llvm/Support/CFG.h
+++ b/contrib/llvm/include/llvm/Support/CFG.h
@@ -33,7 +33,7 @@ class PredIterator : public std::iterator<std::forward_iterator_tag,
USE_iterator It;
inline void advancePastNonTerminators() {
- // Loop to ignore non terminator uses (for example PHI nodes).
+ // Loop to ignore non terminator uses (for example BlockAddresses).
while (!It.atEnd() && !isa<TerminatorInst>(*It))
++It;
}
@@ -109,11 +109,18 @@ public:
// TODO: This can be random access iterator, only operator[] missing.
explicit inline SuccIterator(Term_ T) : Term(T), idx(0) {// begin iterator
- assert(T && "getTerminator returned null!");
}
inline SuccIterator(Term_ T, bool) // end iterator
- : Term(T), idx(Term->getNumSuccessors()) {
- assert(T && "getTerminator returned null!");
+ : Term(T) {
+ if (Term)
+ idx = Term->getNumSuccessors();
+ else
+ // Term == NULL happens, if a basic block is not fully constructed and
+ // consequently getTerminator() returns NULL. In this case we construct a
+ // SuccIterator which describes a basic block that has zero successors.
+ // Defining SuccIterator for incomplete and malformed CFGs is especially
+ // useful for debugging.
+ idx = 0;
}
inline const Self &operator=(const Self &I) {
@@ -201,6 +208,7 @@ public:
/// Get the source BB of this iterator.
inline BB_ *getSource() {
+ assert(Term && "Source not available, if basic block was malformed");
return Term->getParent();
}
};
diff --git a/contrib/llvm/include/llvm/Support/ConstantFolder.h b/contrib/llvm/include/llvm/Support/ConstantFolder.h
index d0eaa3e..7330235 100644
--- a/contrib/llvm/include/llvm/Support/ConstantFolder.h
+++ b/contrib/llvm/include/llvm/Support/ConstantFolder.h
@@ -210,14 +210,14 @@ public:
return ConstantExpr::getShuffleVector(V1, V2, Mask);
}
- Constant *CreateExtractValue(Constant *Agg, const unsigned *IdxList,
- unsigned NumIdx) const {
- return ConstantExpr::getExtractValue(Agg, IdxList, NumIdx);
+ Constant *CreateExtractValue(Constant *Agg,
+ ArrayRef<unsigned> IdxList) const {
+ return ConstantExpr::getExtractValue(Agg, IdxList);
}
Constant *CreateInsertValue(Constant *Agg, Constant *Val,
- const unsigned *IdxList, unsigned NumIdx) const {
- return ConstantExpr::getInsertValue(Agg, Val, IdxList, NumIdx);
+ ArrayRef<unsigned> IdxList) const {
+ return ConstantExpr::getInsertValue(Agg, Val, IdxList);
}
};
diff --git a/contrib/llvm/include/llvm/Support/DebugLoc.h b/contrib/llvm/include/llvm/Support/DebugLoc.h
index 98a05a4..2ee9f87 100644
--- a/contrib/llvm/include/llvm/Support/DebugLoc.h
+++ b/contrib/llvm/include/llvm/Support/DebugLoc.h
@@ -61,7 +61,10 @@ namespace llvm {
/// getFromDILocation - Translate the DILocation quad into a DebugLoc.
static DebugLoc getFromDILocation(MDNode *N);
-
+
+ /// getFromDILexicalBlock - Translate the DILexicalBlock into a DebugLoc.
+ static DebugLoc getFromDILexicalBlock(MDNode *N);
+
/// isUnknown - Return true if this is an unknown location.
bool isUnknown() const { return ScopeIdx == 0; }
@@ -94,6 +97,8 @@ namespace llvm {
return LineCol == DL.LineCol && ScopeIdx == DL.ScopeIdx;
}
bool operator!=(const DebugLoc &DL) const { return !(*this == DL); }
+
+ void dump(const LLVMContext &Ctx) const;
};
template <>
diff --git a/contrib/llvm/include/llvm/Support/ELF.h b/contrib/llvm/include/llvm/Support/ELF.h
index cc72bd5..be48112 100644
--- a/contrib/llvm/include/llvm/Support/ELF.h
+++ b/contrib/llvm/include/llvm/Support/ELF.h
@@ -487,11 +487,11 @@ enum {
SHT_REL = 9, // Relocation entries; no explicit addends.
SHT_SHLIB = 10, // Reserved.
SHT_DYNSYM = 11, // Symbol table.
- SHT_INIT_ARRAY = 14, // Pointers to initialisation functions.
+ SHT_INIT_ARRAY = 14, // Pointers to initialization functions.
SHT_FINI_ARRAY = 15, // Pointers to termination functions.
SHT_PREINIT_ARRAY = 16, // Pointers to pre-init functions.
SHT_GROUP = 17, // Section group.
- SHT_SYMTAB_SHNDX = 18, // Indicies for SHN_XINDEX entries.
+ SHT_SYMTAB_SHNDX = 18, // Indices for SHN_XINDEX entries.
SHT_LOOS = 0x60000000, // Lowest operating system-specific type.
SHT_HIOS = 0x6fffffff, // Highest operating system-specific type.
SHT_LOPROC = 0x70000000, // Lowest processor architecture-specific type.
@@ -630,7 +630,7 @@ enum {
STT_FUNC = 2, // Symbol is executable code (function, etc.)
STT_SECTION = 3, // Symbol refers to a section
STT_FILE = 4, // Local, absolute symbol that refers to a file
- STT_COMMON = 5, // An uninitialised common block
+ STT_COMMON = 5, // An uninitialized common block
STT_TLS = 6, // Thread local data object
STT_LOPROC = 13, // Lowest processor-specific symbol type
STT_HIPROC = 15 // Highest processor-specific symbol type
@@ -804,7 +804,7 @@ enum {
DT_RELENT = 19, // Size of a Rel relocation entry.
DT_PLTREL = 20, // Type of relocation entry used for linking.
DT_DEBUG = 21, // Reserved for debugger.
- DT_TEXTREL = 22, // Relocations exist for non-writable segements.
+ DT_TEXTREL = 22, // Relocations exist for non-writable segments.
DT_JMPREL = 23, // Address of relocations associated with PLT.
DT_BIND_NOW = 24, // Process all relocations before execution.
DT_INIT_ARRAY = 25, // Pointer to array of initialization functions.
diff --git a/contrib/llvm/include/llvm/Support/Endian.h b/contrib/llvm/include/llvm/Support/Endian.h
index f62eab0..af1b506 100644
--- a/contrib/llvm/include/llvm/Support/Endian.h
+++ b/contrib/llvm/include/llvm/Support/Endian.h
@@ -14,7 +14,6 @@
#ifndef LLVM_SUPPORT_ENDIAN_H
#define LLVM_SUPPORT_ENDIAN_H
-#include "llvm/Config/config.h"
#include "llvm/Support/Host.h"
#include "llvm/Support/SwapByteOrder.h"
#include "llvm/Support/type_traits.h"
diff --git a/contrib/llvm/include/llvm/Support/IRBuilder.h b/contrib/llvm/include/llvm/Support/IRBuilder.h
index 6a7c277..91cd78e 100644
--- a/contrib/llvm/include/llvm/Support/IRBuilder.h
+++ b/contrib/llvm/include/llvm/Support/IRBuilder.h
@@ -82,7 +82,7 @@ public:
InsertPt = I;
SetCurrentDebugLocation(I->getDebugLoc());
}
-
+
/// SetInsertPoint - This specifies that created instructions should be
/// inserted at the specified point.
void SetInsertPoint(BasicBlock *TheBB, BasicBlock::iterator IP) {
@@ -90,6 +90,19 @@ public:
InsertPt = IP;
}
+ /// SetInsertPoint(Use) - Find the nearest point that dominates this use, and
+ /// specify that created instructions should be inserted at this point.
+ void SetInsertPoint(Use &U) {
+ Instruction *UseInst = cast<Instruction>(U.getUser());
+ if (PHINode *Phi = dyn_cast<PHINode>(UseInst)) {
+ BasicBlock *PredBB = Phi->getIncomingBlock(U);
+ assert(U != PredBB->getTerminator() && "critical edge not split");
+ SetInsertPoint(PredBB, PredBB->getTerminator());
+ return;
+ }
+ SetInsertPoint(UseInst);
+ }
+
/// SetCurrentDebugLocation - Set location information used by debugging
/// information.
void SetCurrentDebugLocation(const DebugLoc &L) {
@@ -98,7 +111,7 @@ public:
/// getCurrentDebugLocation - Get location information used by debugging
/// information.
- const DebugLoc &getCurrentDebugLocation() const { return CurDbgLocation; }
+ DebugLoc getCurrentDebugLocation() const { return CurDbgLocation; }
/// SetInstDebugLocation - If this builder has a current debug location, set
/// it on the specified instruction.
@@ -109,8 +122,8 @@ public:
/// getCurrentFunctionReturnType - Get the return type of the current function
/// that we're emitting into.
- const Type *getCurrentFunctionReturnType() const;
-
+ Type *getCurrentFunctionReturnType() const;
+
/// InsertPoint - A saved insertion point.
class InsertPoint {
BasicBlock *Block;
@@ -198,7 +211,7 @@ public:
ConstantInt *getInt64(uint64_t C) {
return ConstantInt::get(getInt64Ty(), C);
}
-
+
/// getInt - Get a constant integer value.
ConstantInt *getInt(const APInt &AI) {
return ConstantInt::get(Context, AI);
@@ -209,46 +222,46 @@ public:
//===--------------------------------------------------------------------===//
/// getInt1Ty - Fetch the type representing a single bit
- const IntegerType *getInt1Ty() {
+ IntegerType *getInt1Ty() {
return Type::getInt1Ty(Context);
}
/// getInt8Ty - Fetch the type representing an 8-bit integer.
- const IntegerType *getInt8Ty() {
+ IntegerType *getInt8Ty() {
return Type::getInt8Ty(Context);
}
/// getInt16Ty - Fetch the type representing a 16-bit integer.
- const IntegerType *getInt16Ty() {
+ IntegerType *getInt16Ty() {
return Type::getInt16Ty(Context);
}
/// getInt32Ty - Fetch the type resepresenting a 32-bit integer.
- const IntegerType *getInt32Ty() {
+ IntegerType *getInt32Ty() {
return Type::getInt32Ty(Context);
}
/// getInt64Ty - Fetch the type representing a 64-bit integer.
- const IntegerType *getInt64Ty() {
+ IntegerType *getInt64Ty() {
return Type::getInt64Ty(Context);
}
/// getFloatTy - Fetch the type representing a 32-bit floating point value.
- const Type *getFloatTy() {
+ Type *getFloatTy() {
return Type::getFloatTy(Context);
}
/// getDoubleTy - Fetch the type representing a 64-bit floating point value.
- const Type *getDoubleTy() {
+ Type *getDoubleTy() {
return Type::getDoubleTy(Context);
}
/// getVoidTy - Fetch the type representing void.
- const Type *getVoidTy() {
+ Type *getVoidTy() {
return Type::getVoidTy(Context);
}
- const PointerType *getInt8PtrTy(unsigned AddrSpace = 0) {
+ PointerType *getInt8PtrTy(unsigned AddrSpace = 0) {
return Type::getInt8PtrTy(Context, AddrSpace);
}
@@ -263,7 +276,7 @@ public:
bool isVolatile = false, MDNode *TBAATag = 0) {
return CreateMemSet(Ptr, Val, getInt64(Size), Align, isVolatile, TBAATag);
}
-
+
CallInst *CreateMemSet(Value *Ptr, Value *Val, Value *Size, unsigned Align,
bool isVolatile = false, MDNode *TBAATag = 0);
@@ -274,7 +287,7 @@ public:
bool isVolatile = false, MDNode *TBAATag = 0) {
return CreateMemCpy(Dst, Src, getInt64(Size), Align, isVolatile, TBAATag);
}
-
+
CallInst *CreateMemCpy(Value *Dst, Value *Src, Value *Size, unsigned Align,
bool isVolatile = false, MDNode *TBAATag = 0);
@@ -285,9 +298,9 @@ public:
bool isVolatile = false, MDNode *TBAATag = 0) {
return CreateMemMove(Dst, Src, getInt64(Size), Align, isVolatile, TBAATag);
}
-
+
CallInst *CreateMemMove(Value *Dst, Value *Src, Value *Size, unsigned Align,
- bool isVolatile = false, MDNode *TBAATag = 0);
+ bool isVolatile = false, MDNode *TBAATag = 0);
/// CreateLifetimeStart - Create a lifetime.start intrinsic. If the pointer
/// isn't i8* it will be converted.
@@ -341,7 +354,13 @@ public:
SetInsertPoint(IP);
SetCurrentDebugLocation(IP->getDebugLoc());
}
-
+
+ explicit IRBuilder(Use &U)
+ : IRBuilderBase(U->getContext()), Folder() {
+ SetInsertPoint(U);
+ SetCurrentDebugLocation(cast<Instruction>(U.getUser())->getDebugLoc());
+ }
+
IRBuilder(BasicBlock *TheBB, BasicBlock::iterator IP, const T& F)
: IRBuilderBase(TheBB->getContext()), Folder(F) {
SetInsertPoint(TheBB, IP);
@@ -430,34 +449,30 @@ public:
InvokeInst *CreateInvoke(Value *Callee, BasicBlock *NormalDest,
BasicBlock *UnwindDest, const Twine &Name = "") {
- Value *Args[] = { 0 };
- return Insert(InvokeInst::Create(Callee, NormalDest, UnwindDest, Args,
- Args), Name);
+ return Insert(InvokeInst::Create(Callee, NormalDest, UnwindDest,
+ ArrayRef<Value *>()),
+ Name);
}
InvokeInst *CreateInvoke(Value *Callee, BasicBlock *NormalDest,
BasicBlock *UnwindDest, Value *Arg1,
const Twine &Name = "") {
- Value *Args[] = { Arg1 };
- return Insert(InvokeInst::Create(Callee, NormalDest, UnwindDest, Args,
- Args+1), Name);
+ return Insert(InvokeInst::Create(Callee, NormalDest, UnwindDest, Arg1),
+ Name);
}
InvokeInst *CreateInvoke3(Value *Callee, BasicBlock *NormalDest,
BasicBlock *UnwindDest, Value *Arg1,
Value *Arg2, Value *Arg3,
const Twine &Name = "") {
Value *Args[] = { Arg1, Arg2, Arg3 };
- return Insert(InvokeInst::Create(Callee, NormalDest, UnwindDest, Args,
- Args+3), Name);
+ return Insert(InvokeInst::Create(Callee, NormalDest, UnwindDest, Args),
+ Name);
}
/// CreateInvoke - Create an invoke instruction.
- template<typename RandomAccessIterator>
InvokeInst *CreateInvoke(Value *Callee, BasicBlock *NormalDest,
- BasicBlock *UnwindDest,
- RandomAccessIterator ArgBegin,
- RandomAccessIterator ArgEnd,
+ BasicBlock *UnwindDest, ArrayRef<Value *> Args,
const Twine &Name = "") {
- return Insert(InvokeInst::Create(Callee, NormalDest, UnwindDest,
- ArgBegin, ArgEnd), Name);
+ return Insert(InvokeInst::Create(Callee, NormalDest, UnwindDest, Args),
+ Name);
}
UnwindInst *CreateUnwind() {
@@ -1107,33 +1122,27 @@ public:
CallInst *CreateCall2(Value *Callee, Value *Arg1, Value *Arg2,
const Twine &Name = "") {
Value *Args[] = { Arg1, Arg2 };
- return Insert(CallInst::Create(Callee, Args, Args+2), Name);
+ return Insert(CallInst::Create(Callee, Args), Name);
}
CallInst *CreateCall3(Value *Callee, Value *Arg1, Value *Arg2, Value *Arg3,
const Twine &Name = "") {
Value *Args[] = { Arg1, Arg2, Arg3 };
- return Insert(CallInst::Create(Callee, Args, Args+3), Name);
+ return Insert(CallInst::Create(Callee, Args), Name);
}
CallInst *CreateCall4(Value *Callee, Value *Arg1, Value *Arg2, Value *Arg3,
Value *Arg4, const Twine &Name = "") {
Value *Args[] = { Arg1, Arg2, Arg3, Arg4 };
- return Insert(CallInst::Create(Callee, Args, Args+4), Name);
+ return Insert(CallInst::Create(Callee, Args), Name);
}
CallInst *CreateCall5(Value *Callee, Value *Arg1, Value *Arg2, Value *Arg3,
Value *Arg4, Value *Arg5, const Twine &Name = "") {
Value *Args[] = { Arg1, Arg2, Arg3, Arg4, Arg5 };
- return Insert(CallInst::Create(Callee, Args, Args+5), Name);
+ return Insert(CallInst::Create(Callee, Args), Name);
}
- CallInst *CreateCall(Value *Callee, ArrayRef<Value *> Arg,
+ CallInst *CreateCall(Value *Callee, ArrayRef<Value *> Args,
const Twine &Name = "") {
- return Insert(CallInst::Create(Callee, Arg.begin(), Arg.end(), Name));
- }
-
- template<typename RandomAccessIterator>
- CallInst *CreateCall(Value *Callee, RandomAccessIterator ArgBegin,
- RandomAccessIterator ArgEnd, const Twine &Name = "") {
- return Insert(CallInst::Create(Callee, ArgBegin, ArgEnd), Name);
+ return Insert(CallInst::Create(Callee, Args, Name));
}
Value *CreateSelect(Value *C, Value *True, Value *False,
@@ -1175,43 +1184,21 @@ public:
return Insert(new ShuffleVectorInst(V1, V2, Mask), Name);
}
- Value *CreateExtractValue(Value *Agg, unsigned Idx,
- const Twine &Name = "") {
- if (Constant *AggC = dyn_cast<Constant>(Agg))
- return Insert(Folder.CreateExtractValue(AggC, &Idx, 1), Name);
- return Insert(ExtractValueInst::Create(Agg, Idx), Name);
- }
-
- template<typename RandomAccessIterator>
Value *CreateExtractValue(Value *Agg,
- RandomAccessIterator IdxBegin,
- RandomAccessIterator IdxEnd,
+ ArrayRef<unsigned> Idxs,
const Twine &Name = "") {
if (Constant *AggC = dyn_cast<Constant>(Agg))
- return Insert(Folder.CreateExtractValue(AggC, IdxBegin, IdxEnd-IdxBegin),
- Name);
- return Insert(ExtractValueInst::Create(Agg, IdxBegin, IdxEnd), Name);
+ return Insert(Folder.CreateExtractValue(AggC, Idxs), Name);
+ return Insert(ExtractValueInst::Create(Agg, Idxs), Name);
}
- Value *CreateInsertValue(Value *Agg, Value *Val, unsigned Idx,
- const Twine &Name = "") {
- if (Constant *AggC = dyn_cast<Constant>(Agg))
- if (Constant *ValC = dyn_cast<Constant>(Val))
- return Insert(Folder.CreateInsertValue(AggC, ValC, &Idx, 1), Name);
- return Insert(InsertValueInst::Create(Agg, Val, Idx), Name);
- }
-
- template<typename RandomAccessIterator>
Value *CreateInsertValue(Value *Agg, Value *Val,
- RandomAccessIterator IdxBegin,
- RandomAccessIterator IdxEnd,
+ ArrayRef<unsigned> Idxs,
const Twine &Name = "") {
if (Constant *AggC = dyn_cast<Constant>(Agg))
if (Constant *ValC = dyn_cast<Constant>(Val))
- return Insert(Folder.CreateInsertValue(AggC, ValC, IdxBegin,
- IdxEnd - IdxBegin),
- Name);
- return Insert(InsertValueInst::Create(Agg, Val, IdxBegin, IdxEnd), Name);
+ return Insert(Folder.CreateInsertValue(AggC, ValC, Idxs), Name);
+ return Insert(InsertValueInst::Create(Agg, Val, Idxs), Name);
}
//===--------------------------------------------------------------------===//
@@ -1238,7 +1225,7 @@ public:
Value *CreatePtrDiff(Value *LHS, Value *RHS, const Twine &Name = "") {
assert(LHS->getType() == RHS->getType() &&
"Pointer subtraction operand types must match!");
- const PointerType *ArgType = cast<PointerType>(LHS->getType());
+ PointerType *ArgType = cast<PointerType>(LHS->getType());
Value *LHS_int = CreatePtrToInt(LHS, Type::getInt64Ty(Context));
Value *RHS_int = CreatePtrToInt(RHS, Type::getInt64Ty(Context));
Value *Difference = CreateSub(LHS_int, RHS_int);
diff --git a/contrib/llvm/include/llvm/Support/NoFolder.h b/contrib/llvm/include/llvm/Support/NoFolder.h
index 5ead26e..94359a5 100644
--- a/contrib/llvm/include/llvm/Support/NoFolder.h
+++ b/contrib/llvm/include/llvm/Support/NoFolder.h
@@ -22,6 +22,7 @@
#ifndef LLVM_SUPPORT_NOFOLDER_H
#define LLVM_SUPPORT_NOFOLDER_H
+#include "llvm/ADT/ArrayRef.h"
#include "llvm/Constants.h"
#include "llvm/Instructions.h"
@@ -269,15 +270,14 @@ public:
return new ShuffleVectorInst(V1, V2, Mask);
}
- Instruction *CreateExtractValue(Constant *Agg, const unsigned *IdxList,
- unsigned NumIdx) const {
- return ExtractValueInst::Create(Agg, IdxList, IdxList+NumIdx);
+ Instruction *CreateExtractValue(Constant *Agg,
+ ArrayRef<unsigned> IdxList) const {
+ return ExtractValueInst::Create(Agg, IdxList);
}
Instruction *CreateInsertValue(Constant *Agg, Constant *Val,
- const unsigned *IdxList,
- unsigned NumIdx) const {
- return InsertValueInst::Create(Agg, Val, IdxList, IdxList+NumIdx);
+ ArrayRef<unsigned> IdxList) const {
+ return InsertValueInst::Create(Agg, Val, IdxList);
}
};
diff --git a/contrib/llvm/include/llvm/Support/PassManagerBuilder.h b/contrib/llvm/include/llvm/Support/PassManagerBuilder.h
index 513bb88..b0cec6e 100644
--- a/contrib/llvm/include/llvm/Support/PassManagerBuilder.h
+++ b/contrib/llvm/include/llvm/Support/PassManagerBuilder.h
@@ -67,7 +67,12 @@ public:
/// EP_LoopOptimizerEnd - This extension point allows adding loop passes to
/// the end of the loop optimizer.
- EP_LoopOptimizerEnd
+ EP_LoopOptimizerEnd,
+
+ /// EP_ScalarOptimizerLate - This extension point allows adding optimization
+ /// passes after most of the main optimizations, but before the last
+ /// cleanup-ish optimizations.
+ EP_ScalarOptimizerLate
};
/// The Optimization Level - Specify the basic optimization level.
@@ -147,6 +152,7 @@ public:
FPM.add(createCFGSimplificationPass());
FPM.add(createScalarReplAggregatesPass());
FPM.add(createEarlyCSEPass());
+ FPM.add(createLowerExpectIntrinsicPass());
}
/// populateModulePassManager - This sets up the primary pass manager.
@@ -223,13 +229,16 @@ public:
MPM.add(createJumpThreadingPass()); // Thread jumps
MPM.add(createCorrelatedValuePropagationPass());
MPM.add(createDeadStoreEliminationPass()); // Delete dead stores
+
+ addExtensionsToPM(EP_ScalarOptimizerLate, MPM);
+
MPM.add(createAggressiveDCEPass()); // Delete dead instructions
MPM.add(createCFGSimplificationPass()); // Merge & remove BBs
MPM.add(createInstructionCombiningPass()); // Clean up after everything.
if (!DisableUnitAtATime) {
+ // FIXME: We shouldn't bother with this anymore.
MPM.add(createStripDeadPrototypesPass()); // Get rid of dead prototypes
- MPM.add(createDeadTypeEliminationPass()); // Eliminate dead types
// GlobalOpt already deletes dead functions and globals, at -O3 try a
// late pass of GlobalDCE. It is capable of deleting dead cycles.
diff --git a/contrib/llvm/include/llvm/Support/TargetFolder.h b/contrib/llvm/include/llvm/Support/TargetFolder.h
index 20ca557..3233a98 100644
--- a/contrib/llvm/include/llvm/Support/TargetFolder.h
+++ b/contrib/llvm/include/llvm/Support/TargetFolder.h
@@ -21,6 +21,7 @@
#include "llvm/Constants.h"
#include "llvm/InstrTypes.h"
+#include "llvm/ADT/ArrayRef.h"
#include "llvm/Analysis/ConstantFolding.h"
namespace llvm {
@@ -226,14 +227,14 @@ public:
return Fold(ConstantExpr::getShuffleVector(V1, V2, Mask));
}
- Constant *CreateExtractValue(Constant *Agg, const unsigned *IdxList,
- unsigned NumIdx) const {
- return Fold(ConstantExpr::getExtractValue(Agg, IdxList, NumIdx));
+ Constant *CreateExtractValue(Constant *Agg,
+ ArrayRef<unsigned> IdxList) const {
+ return Fold(ConstantExpr::getExtractValue(Agg, IdxList));
}
Constant *CreateInsertValue(Constant *Agg, Constant *Val,
- const unsigned *IdxList, unsigned NumIdx) const {
- return Fold(ConstantExpr::getInsertValue(Agg, Val, IdxList, NumIdx));
+ ArrayRef<unsigned> IdxList) const {
+ return Fold(ConstantExpr::getInsertValue(Agg, Val, IdxList));
}
};
diff --git a/contrib/llvm/include/llvm/Support/TypeBuilder.h b/contrib/llvm/include/llvm/Support/TypeBuilder.h
index ea63da0..1800778 100644
--- a/contrib/llvm/include/llvm/Support/TypeBuilder.h
+++ b/contrib/llvm/include/llvm/Support/TypeBuilder.h
@@ -18,6 +18,7 @@
#include "llvm/DerivedTypes.h"
#include "llvm/LLVMContext.h"
#include <limits.h>
+#include <vector>
namespace llvm {
@@ -50,7 +51,7 @@ namespace llvm {
/// namespace llvm {
/// template<bool xcompile> class TypeBuilder<MyType, xcompile> {
/// public:
-/// static const StructType *get(LLVMContext &Context) {
+/// static StructType *get(LLVMContext &Context) {
/// // If you cache this result, be sure to cache it separately
/// // for each LLVMContext.
/// return StructType::get(
@@ -103,7 +104,7 @@ template<typename T, bool cross> class TypeBuilder<const volatile T, cross>
// Pointers
template<typename T, bool cross> class TypeBuilder<T*, cross> {
public:
- static const PointerType *get(LLVMContext &Context) {
+ static PointerType *get(LLVMContext &Context) {
return PointerType::getUnqual(TypeBuilder<T,cross>::get(Context));
}
};
@@ -114,14 +115,14 @@ template<typename T, bool cross> class TypeBuilder<T&, cross> {};
// Arrays
template<typename T, size_t N, bool cross> class TypeBuilder<T[N], cross> {
public:
- static const ArrayType *get(LLVMContext &Context) {
+ static ArrayType *get(LLVMContext &Context) {
return ArrayType::get(TypeBuilder<T, cross>::get(Context), N);
}
};
/// LLVM uses an array of length 0 to represent an unknown-length array.
template<typename T, bool cross> class TypeBuilder<T[], cross> {
public:
- static const ArrayType *get(LLVMContext &Context) {
+ static ArrayType *get(LLVMContext &Context) {
return ArrayType::get(TypeBuilder<T, cross>::get(Context), 0);
}
};
@@ -151,7 +152,7 @@ public:
#define DEFINE_INTEGRAL_TYPEBUILDER(T) \
template<> class TypeBuilder<T, false> { \
public: \
- static const IntegerType *get(LLVMContext &Context) { \
+ static IntegerType *get(LLVMContext &Context) { \
return IntegerType::get(Context, sizeof(T) * CHAR_BIT); \
} \
}; \
@@ -180,14 +181,14 @@ DEFINE_INTEGRAL_TYPEBUILDER(unsigned long long);
template<uint32_t num_bits, bool cross>
class TypeBuilder<types::i<num_bits>, cross> {
public:
- static const IntegerType *get(LLVMContext &C) {
+ static IntegerType *get(LLVMContext &C) {
return IntegerType::get(C, num_bits);
}
};
template<> class TypeBuilder<float, false> {
public:
- static const Type *get(LLVMContext& C) {
+ static Type *get(LLVMContext& C) {
return Type::getFloatTy(C);
}
};
@@ -195,7 +196,7 @@ template<> class TypeBuilder<float, true> {};
template<> class TypeBuilder<double, false> {
public:
- static const Type *get(LLVMContext& C) {
+ static Type *get(LLVMContext& C) {
return Type::getDoubleTy(C);
}
};
@@ -203,32 +204,32 @@ template<> class TypeBuilder<double, true> {};
template<bool cross> class TypeBuilder<types::ieee_float, cross> {
public:
- static const Type *get(LLVMContext& C) { return Type::getFloatTy(C); }
+ static Type *get(LLVMContext& C) { return Type::getFloatTy(C); }
};
template<bool cross> class TypeBuilder<types::ieee_double, cross> {
public:
- static const Type *get(LLVMContext& C) { return Type::getDoubleTy(C); }
+ static Type *get(LLVMContext& C) { return Type::getDoubleTy(C); }
};
template<bool cross> class TypeBuilder<types::x86_fp80, cross> {
public:
- static const Type *get(LLVMContext& C) { return Type::getX86_FP80Ty(C); }
+ static Type *get(LLVMContext& C) { return Type::getX86_FP80Ty(C); }
};
template<bool cross> class TypeBuilder<types::fp128, cross> {
public:
- static const Type *get(LLVMContext& C) { return Type::getFP128Ty(C); }
+ static Type *get(LLVMContext& C) { return Type::getFP128Ty(C); }
};
template<bool cross> class TypeBuilder<types::ppc_fp128, cross> {
public:
- static const Type *get(LLVMContext& C) { return Type::getPPC_FP128Ty(C); }
+ static Type *get(LLVMContext& C) { return Type::getPPC_FP128Ty(C); }
};
template<bool cross> class TypeBuilder<types::x86_mmx, cross> {
public:
- static const Type *get(LLVMContext& C) { return Type::getX86_MMXTy(C); }
+ static Type *get(LLVMContext& C) { return Type::getX86_MMXTy(C); }
};
template<bool cross> class TypeBuilder<void, cross> {
public:
- static const Type *get(LLVMContext &C) {
+ static Type *get(LLVMContext &C) {
return Type::getVoidTy(C);
}
};
@@ -246,14 +247,14 @@ template<> class TypeBuilder<const volatile void*, false>
template<typename R, bool cross> class TypeBuilder<R(), cross> {
public:
- static const FunctionType *get(LLVMContext &Context) {
+ static FunctionType *get(LLVMContext &Context) {
return FunctionType::get(TypeBuilder<R, cross>::get(Context), false);
}
};
template<typename R, typename A1, bool cross> class TypeBuilder<R(A1), cross> {
public:
- static const FunctionType *get(LLVMContext &Context) {
- std::vector<const Type*> params;
+ static FunctionType *get(LLVMContext &Context) {
+ std::vector<Type*> params;
params.reserve(1);
params.push_back(TypeBuilder<A1, cross>::get(Context));
return FunctionType::get(TypeBuilder<R, cross>::get(Context),
@@ -263,8 +264,8 @@ public:
template<typename R, typename A1, typename A2, bool cross>
class TypeBuilder<R(A1, A2), cross> {
public:
- static const FunctionType *get(LLVMContext &Context) {
- std::vector<const Type*> params;
+ static FunctionType *get(LLVMContext &Context) {
+ std::vector<Type*> params;
params.reserve(2);
params.push_back(TypeBuilder<A1, cross>::get(Context));
params.push_back(TypeBuilder<A2, cross>::get(Context));
@@ -275,8 +276,8 @@ public:
template<typename R, typename A1, typename A2, typename A3, bool cross>
class TypeBuilder<R(A1, A2, A3), cross> {
public:
- static const FunctionType *get(LLVMContext &Context) {
- std::vector<const Type*> params;
+ static FunctionType *get(LLVMContext &Context) {
+ std::vector<Type*> params;
params.reserve(3);
params.push_back(TypeBuilder<A1, cross>::get(Context));
params.push_back(TypeBuilder<A2, cross>::get(Context));
@@ -290,8 +291,8 @@ template<typename R, typename A1, typename A2, typename A3, typename A4,
bool cross>
class TypeBuilder<R(A1, A2, A3, A4), cross> {
public:
- static const FunctionType *get(LLVMContext &Context) {
- std::vector<const Type*> params;
+ static FunctionType *get(LLVMContext &Context) {
+ std::vector<Type*> params;
params.reserve(4);
params.push_back(TypeBuilder<A1, cross>::get(Context));
params.push_back(TypeBuilder<A2, cross>::get(Context));
@@ -306,8 +307,8 @@ template<typename R, typename A1, typename A2, typename A3, typename A4,
typename A5, bool cross>
class TypeBuilder<R(A1, A2, A3, A4, A5), cross> {
public:
- static const FunctionType *get(LLVMContext &Context) {
- std::vector<const Type*> params;
+ static FunctionType *get(LLVMContext &Context) {
+ std::vector<Type*> params;
params.reserve(5);
params.push_back(TypeBuilder<A1, cross>::get(Context));
params.push_back(TypeBuilder<A2, cross>::get(Context));
@@ -321,15 +322,15 @@ public:
template<typename R, bool cross> class TypeBuilder<R(...), cross> {
public:
- static const FunctionType *get(LLVMContext &Context) {
+ static FunctionType *get(LLVMContext &Context) {
return FunctionType::get(TypeBuilder<R, cross>::get(Context), true);
}
};
template<typename R, typename A1, bool cross>
class TypeBuilder<R(A1, ...), cross> {
public:
- static const FunctionType *get(LLVMContext &Context) {
- std::vector<const Type*> params;
+ static FunctionType *get(LLVMContext &Context) {
+ std::vector<Type*> params;
params.reserve(1);
params.push_back(TypeBuilder<A1, cross>::get(Context));
return FunctionType::get(TypeBuilder<R, cross>::get(Context), params, true);
@@ -338,8 +339,8 @@ public:
template<typename R, typename A1, typename A2, bool cross>
class TypeBuilder<R(A1, A2, ...), cross> {
public:
- static const FunctionType *get(LLVMContext &Context) {
- std::vector<const Type*> params;
+ static FunctionType *get(LLVMContext &Context) {
+ std::vector<Type*> params;
params.reserve(2);
params.push_back(TypeBuilder<A1, cross>::get(Context));
params.push_back(TypeBuilder<A2, cross>::get(Context));
@@ -350,8 +351,8 @@ public:
template<typename R, typename A1, typename A2, typename A3, bool cross>
class TypeBuilder<R(A1, A2, A3, ...), cross> {
public:
- static const FunctionType *get(LLVMContext &Context) {
- std::vector<const Type*> params;
+ static FunctionType *get(LLVMContext &Context) {
+ std::vector<Type*> params;
params.reserve(3);
params.push_back(TypeBuilder<A1, cross>::get(Context));
params.push_back(TypeBuilder<A2, cross>::get(Context));
@@ -365,8 +366,8 @@ template<typename R, typename A1, typename A2, typename A3, typename A4,
bool cross>
class TypeBuilder<R(A1, A2, A3, A4, ...), cross> {
public:
- static const FunctionType *get(LLVMContext &Context) {
- std::vector<const Type*> params;
+ static FunctionType *get(LLVMContext &Context) {
+ std::vector<Type*> params;
params.reserve(4);
params.push_back(TypeBuilder<A1, cross>::get(Context));
params.push_back(TypeBuilder<A2, cross>::get(Context));
@@ -381,8 +382,8 @@ template<typename R, typename A1, typename A2, typename A3, typename A4,
typename A5, bool cross>
class TypeBuilder<R(A1, A2, A3, A4, A5, ...), cross> {
public:
- static const FunctionType *get(LLVMContext &Context) {
- std::vector<const Type*> params;
+ static FunctionType *get(LLVMContext &Context) {
+ std::vector<Type*> params;
params.reserve(5);
params.push_back(TypeBuilder<A1, cross>::get(Context));
params.push_back(TypeBuilder<A2, cross>::get(Context));
diff --git a/contrib/llvm/include/llvm/Support/system_error.h b/contrib/llvm/include/llvm/Support/system_error.h
index 47759b9..2c15b69 100644
--- a/contrib/llvm/include/llvm/Support/system_error.h
+++ b/contrib/llvm/include/llvm/Support/system_error.h
@@ -222,7 +222,7 @@ template <> struct hash<std::error_code>;
*/
-#include "llvm/Config/config.h"
+#include "llvm/Config/llvm-config.h"
#include "llvm/Support/type_traits.h"
#include <cerrno>
#include <string>
@@ -669,7 +669,7 @@ const error_category& generic_category();
const error_category& system_category();
/// Get the error_category used for errno values from POSIX functions. This is
-/// the same as the system_category on POISIX systems, but is the same as the
+/// the same as the system_category on POSIX systems, but is the same as the
/// generic_category on Windows.
const error_category& posix_category();
diff --git a/contrib/llvm/include/llvm/Target/Target.td b/contrib/llvm/include/llvm/Target/Target.td
index ab6a4e2..018ccbd 100644
--- a/contrib/llvm/include/llvm/Target/Target.td
+++ b/contrib/llvm/include/llvm/Target/Target.td
@@ -26,11 +26,19 @@ class SubRegIndex {
string Namespace = "";
}
+// RegAltNameIndex - The alternate name set to use for register operands of
+// this register class when printing.
+class RegAltNameIndex {
+ string Namespace = "";
+}
+def NoRegAltName : RegAltNameIndex;
+
// Register - You should define one instance of this class for each register
// in the target machine. String n will become the "name" of the register.
-class Register<string n> {
+class Register<string n, list<string> altNames = []> {
string Namespace = "";
string AsmName = n;
+ list<string> AltNames = altNames;
// Aliases - A list of registers that this register overlaps with. A read or
// modification of this register can potentially read or modify the aliased
@@ -48,6 +56,10 @@ class Register<string n> {
// SubRegs.
list<SubRegIndex> SubRegIndices = [];
+ // RegAltNameIndices - The alternate name indices which are valid for this
+ // register.
+ list<RegAltNameIndex> RegAltNameIndices = [];
+
// CompositeIndices - Specify subreg indices that don't correspond directly to
// a register in SubRegs and are not inherited. The following formats are
// supported:
@@ -92,7 +104,7 @@ class RegisterWithSubRegs<string n, list<Register> subregs> : Register<n> {
// registers by register allocators.
//
class RegisterClass<string namespace, list<ValueType> regTypes, int alignment,
- list<Register> regList> {
+ dag regList, RegAltNameIndex idx = NoRegAltName> {
string Namespace = namespace;
// RegType - Specify the list ValueType of the registers in this register
@@ -122,7 +134,12 @@ class RegisterClass<string namespace, list<ValueType> regTypes, int alignment,
// allocation_order_* method are not specified, this also defines the order of
// allocation used by the register allocator.
//
- list<Register> MemberList = regList;
+ dag MemberList = regList;
+
+ // AltNameIndex - The alternate register name to use when printing operands
+ // of this register class. Every register in the register class must have
+ // a valid alternate name for the given index.
+ RegAltNameIndex altNameIndex = idx;
// SubRegClasses - Specify the register class of subregisters as a list of
// dags: (RegClass SubRegIndex, SubRegindex, ...)
@@ -133,11 +150,91 @@ class RegisterClass<string namespace, list<ValueType> regTypes, int alignment,
// model instruction operand constraints, and should have isAllocatable = 0.
bit isAllocatable = 1;
- // MethodProtos/MethodBodies - These members can be used to insert arbitrary
- // code into a generated register class. The normal usage of this is to
- // overload virtual methods.
- code MethodProtos = [{}];
- code MethodBodies = [{}];
+ // AltOrders - List of alternative allocation orders. The default order is
+ // MemberList itself, and that is good enough for most targets since the
+ // register allocators automatically remove reserved registers and move
+ // callee-saved registers to the end.
+ list<dag> AltOrders = [];
+
+ // AltOrderSelect - The body of a function that selects the allocation order
+ // to use in a given machine function. The code will be inserted in a
+ // function like this:
+ //
+ // static inline unsigned f(const MachineFunction &MF) { ... }
+ //
+ // The function should return 0 to select the default order defined by
+ // MemberList, 1 to select the first AltOrders entry and so on.
+ code AltOrderSelect = [{}];
+}
+
+// The memberList in a RegisterClass is a dag of set operations. TableGen
+// evaluates these set operations and expand them into register lists. These
+// are the most common operation, see test/TableGen/SetTheory.td for more
+// examples of what is possible:
+//
+// (add R0, R1, R2) - Set Union. Each argument can be an individual register, a
+// register class, or a sub-expression. This is also the way to simply list
+// registers.
+//
+// (sub GPR, SP) - Set difference. Subtract the last arguments from the first.
+//
+// (and GPR, CSR) - Set intersection. All registers from the first set that are
+// also in the second set.
+//
+// (sequence "R%u", 0, 15) -> [R0, R1, ..., R15]. Generate a sequence of
+// numbered registers.
+//
+// (shl GPR, 4) - Remove the first N elements.
+//
+// (trunc GPR, 4) - Truncate after the first N elements.
+//
+// (rotl GPR, 1) - Rotate N places to the left.
+//
+// (rotr GPR, 1) - Rotate N places to the right.
+//
+// (decimate GPR, 2) - Pick every N'th element, starting with the first.
+//
+// All of these operators work on ordered sets, not lists. That means
+// duplicates are removed from sub-expressions.
+
+// Set operators. The rest is defined in TargetSelectionDAG.td.
+def sequence;
+def decimate;
+
+// RegisterTuples - Automatically generate super-registers by forming tuples of
+// sub-registers. This is useful for modeling register sequence constraints
+// with pseudo-registers that are larger than the architectural registers.
+//
+// The sub-register lists are zipped together:
+//
+// def EvenOdd : RegisterTuples<[sube, subo], [(add R0, R2), (add R1, R3)]>;
+//
+// Generates the same registers as:
+//
+// let SubRegIndices = [sube, subo] in {
+// def R0_R1 : RegisterWithSubRegs<"", [R0, R1]>;
+// def R2_R3 : RegisterWithSubRegs<"", [R2, R3]>;
+// }
+//
+// The generated pseudo-registers inherit super-classes and fields from their
+// first sub-register. Most fields from the Register class are inferred, and
+// the AsmName and Dwarf numbers are cleared.
+//
+// RegisterTuples instances can be used in other set operations to form
+// register classes and so on. This is the only way of using the generated
+// registers.
+class RegisterTuples<list<SubRegIndex> Indices, list<dag> Regs> {
+ // SubRegs - N lists of registers to be zipped up. Super-registers are
+ // synthesized from the first element of each SubRegs list, the second
+ // element and so on.
+ list<dag> SubRegs = Regs;
+
+ // SubRegIndices - N SubRegIndex instances. This provides the names of the
+ // sub-registers in the synthesized super-registers.
+ list<SubRegIndex> SubRegIndices = Indices;
+
+ // Compose sub-register indices like in a normal Register.
+ list<dag> CompositeIndices = [];
}
@@ -196,7 +293,12 @@ class Instruction {
// code.
list<Predicate> Predicates = [];
- // Code size.
+ // Size - Size of encoded instruction, or zero if the size cannot be determined
+ // from the opcode.
+ int Size = 0;
+
+ // Code size, for instruction selection.
+ // FIXME: What does this actually mean?
int CodeSize = 0;
// Added complexity passed onto matching pattern.
@@ -227,6 +329,9 @@ class Instruction {
bit isAsCheapAsAMove = 0; // As cheap (or cheaper) than a move instruction.
bit hasExtraSrcRegAllocReq = 0; // Sources have special regalloc requirement?
bit hasExtraDefRegAllocReq = 0; // Defs have special regalloc requirement?
+ bit isPseudo = 0; // Is this instruction a pseudo-instruction?
+ // If so, won't have encoding information for
+ // the [MC]CodeEmitter stuff.
// Side effect flags - When set, the flags have these meanings:
//
@@ -241,6 +346,11 @@ class Instruction {
// Is this instruction a "real" instruction (with a distinct machine
// encoding), or is it a pseudo instruction used for codegen modeling
// purposes.
+ // FIXME: For now this is distinct from isPseudo, above, as code-gen-only
+ // instructions can (and often do) still have encoding information
+ // associated with them. Once we've migrated all of them over to true
+ // pseudo-instructions that are lowered to real instructions prior to
+ // the printer/emitter, we can remove this attribute and just use isPseudo.
bit isCodeGenOnly = 0;
// Is this instruction a pseudo instruction for use by the assembler parser.
@@ -268,6 +378,14 @@ class Instruction {
///@}
}
+/// PseudoInstExpansion - Expansion information for a pseudo-instruction.
+/// Which instruction it expands to and how the operands map from the
+/// pseudo.
+class PseudoInstExpansion<dag Result> {
+ dag ResultInst = Result; // The instruction to generate.
+ bit isPseudo = 1;
+}
+
/// Predicates - These are extra conditionals which are turned into instruction
/// selector matching code. Currently each predicate is just a string.
class Predicate<string cond> {
@@ -277,6 +395,15 @@ class Predicate<string cond> {
/// matcher, this is true. Targets should set this by inheriting their
/// feature from the AssemblerPredicate class in addition to Predicate.
bit AssemblerMatcherPredicate = 0;
+
+ /// AssemblerCondString - Name of the subtarget feature being tested used
+ /// as alternative condition string used for assembler matcher.
+ /// e.g. "ModeThumb" is translated to "(Bits & ModeThumb) != 0".
+ /// "!ModeThumb" is translated to "(Bits & ModeThumb) == 0".
+ /// It can also list multiple features separated by ",".
+ /// e.g. "ModeThumb,FeatureThumb2" is translated to
+ /// "(Bits & ModeThumb) != 0 && (Bits & FeatureThumb2) != 0".
+ string AssemblerCondString = "";
}
/// NoHonorSignDependentRounding - This predicate is true if support for
@@ -373,6 +500,7 @@ class Operand<ValueType ty> {
string EncoderMethod = "";
string DecoderMethod = "";
string AsmOperandLowerMethod = ?;
+ string OperandType = "OPERAND_UNKNOWN";
dag MIOperandInfo = (ops);
// ParserMatchClass - The "match class" that operands of this type fit
@@ -386,6 +514,25 @@ class Operand<ValueType ty> {
AsmOperandClass ParserMatchClass = ImmAsmOperand;
}
+class RegisterOperand<RegisterClass regclass, string pm = "printOperand"> {
+ // RegClass - The register class of the operand.
+ RegisterClass RegClass = regclass;
+ // PrintMethod - The target method to call to print register operands of
+ // this type. The method normally will just use an alt-name index to look
+ // up the name to print. Default to the generic printOperand().
+ string PrintMethod = pm;
+ // ParserMatchClass - The "match class" that operands of this type fit
+ // in. Match classes are used to define the order in which instructions are
+ // match, to ensure that which instructions gets matched is deterministic.
+ //
+ // The target specific parser must be able to classify an parsed operand into
+ // a unique class, which does not partially overlap with any other classes. It
+ // can match a subset of some other class, in which case the AsmOperandClass
+ // should declare the other operand as one of its super classes.
+ AsmOperandClass ParserMatchClass;
+}
+
+let OperandType = "OPERAND_IMMEDIATE" in {
def i1imm : Operand<i1>;
def i8imm : Operand<i8>;
def i16imm : Operand<i16>;
@@ -394,6 +541,7 @@ def i64imm : Operand<i64>;
def f32imm : Operand<f32>;
def f64imm : Operand<f64>;
+}
/// zero_reg definition - Special node to stand for the zero register.
///
@@ -566,8 +714,9 @@ def DefaultAsmParser : AsmParser;
/// AssemblerPredicate - This is a Predicate that can be used when the assembler
/// matches instructions and aliases.
-class AssemblerPredicate {
+class AssemblerPredicate<string cond> {
bit AssemblerMatcherPredicate = 1;
+ string AssemblerCondString = cond;
}
diff --git a/contrib/llvm/include/llvm/Target/TargetAsmInfo.h b/contrib/llvm/include/llvm/Target/TargetAsmInfo.h
index 743a2d4..5a526dc 100644
--- a/contrib/llvm/include/llvm/Target/TargetAsmInfo.h
+++ b/contrib/llvm/include/llvm/Target/TargetAsmInfo.h
@@ -20,6 +20,7 @@
#include "llvm/Target/TargetRegisterInfo.h"
namespace llvm {
+ template <typename T> class ArrayRef;
class MCSection;
class MCContext;
class MachineFunction;
@@ -27,30 +28,14 @@ namespace llvm {
class TargetLoweringObjectFile;
class TargetAsmInfo {
- unsigned PointerSize;
- bool IsLittleEndian;
- TargetFrameLowering::StackDirection StackDir;
- const TargetRegisterInfo *TRI;
std::vector<MachineMove> InitialFrameState;
+ const TargetRegisterInfo *TRI;
+ const TargetFrameLowering *TFI;
const TargetLoweringObjectFile *TLOF;
public:
explicit TargetAsmInfo(const TargetMachine &TM);
- /// getPointerSize - Get the pointer size in bytes.
- unsigned getPointerSize() const {
- return PointerSize;
- }
-
- /// islittleendian - True if the target is little endian.
- bool isLittleEndian() const {
- return IsLittleEndian;
- }
-
- TargetFrameLowering::StackDirection getStackGrowthDirection() const {
- return StackDir;
- }
-
const MCSection *getDwarfLineSection() const {
return TLOF->getDwarfLineSection();
}
@@ -59,6 +44,10 @@ public:
return TLOF->getEHFrameSection();
}
+ const MCSection *getCompactUnwindSection() const {
+ return TLOF->getCompactUnwindSection();
+ }
+
const MCSection *getDwarfFrameSection() const {
return TLOF->getDwarfFrameSection();
}
@@ -79,6 +68,12 @@ public:
return TLOF->isFunctionEHFrameSymbolPrivate();
}
+ int getCompactUnwindEncoding(ArrayRef<MCCFIInstruction> Instrs,
+ int DataAlignmentFactor,
+ bool IsEH) const {
+ return TFI->getCompactUnwindEncoding(Instrs, DataAlignmentFactor, IsEH);
+ }
+
const unsigned *getCalleeSavedRegs(MachineFunction *MF = 0) const {
return TRI->getCalleeSavedRegs(MF);
}
diff --git a/contrib/llvm/include/llvm/Target/TargetAsmParser.h b/contrib/llvm/include/llvm/Target/TargetAsmParser.h
index 9ff50cb..df84231 100644
--- a/contrib/llvm/include/llvm/Target/TargetAsmParser.h
+++ b/contrib/llvm/include/llvm/Target/TargetAsmParser.h
@@ -15,7 +15,6 @@
namespace llvm {
class MCStreamer;
class StringRef;
-class Target;
class SMLoc;
class AsmToken;
class MCParsedAsmOperand;
@@ -26,23 +25,19 @@ class TargetAsmParser : public MCAsmParserExtension {
TargetAsmParser(const TargetAsmParser &); // DO NOT IMPLEMENT
void operator=(const TargetAsmParser &); // DO NOT IMPLEMENT
protected: // Can only create subclasses.
- TargetAsmParser(const Target &);
+ TargetAsmParser();
- /// The Target that this machine was created for.
- const Target &TheTarget;
-
- /// The current set of available features.
+ /// AvailableFeatures - The current set of available features.
unsigned AvailableFeatures;
public:
virtual ~TargetAsmParser();
- const Target &getTarget() const { return TheTarget; }
-
unsigned getAvailableFeatures() const { return AvailableFeatures; }
void setAvailableFeatures(unsigned Value) { AvailableFeatures = Value; }
- virtual bool ParseRegister(unsigned &RegNo, SMLoc &StartLoc, SMLoc &EndLoc) = 0;
+ virtual bool ParseRegister(unsigned &RegNo, SMLoc &StartLoc,
+ SMLoc &EndLoc) = 0;
/// ParseInstruction - Parse one assembly instruction.
///
diff --git a/contrib/llvm/include/llvm/Target/TargetData.h b/contrib/llvm/include/llvm/Target/TargetData.h
index 32e3e2b..c280810 100644
--- a/contrib/llvm/include/llvm/Target/TargetData.h
+++ b/contrib/llvm/include/llvm/Target/TargetData.h
@@ -259,7 +259,7 @@ public:
/// getIntPtrType - Return an unsigned integer type that is the same size or
/// greater to the host pointer size.
///
- const IntegerType *getIntPtrType(LLVMContext &C) const;
+ IntegerType *getIntPtrType(LLVMContext &C) const;
/// getIndexedOffset - return the offset from the beginning of the type for
/// the specified indices. This is used to implement getelementptr.
@@ -272,12 +272,6 @@ public:
/// information is lazily cached.
const StructLayout *getStructLayout(const StructType *Ty) const;
- /// InvalidateStructLayoutInfo - TargetData speculatively caches StructLayout
- /// objects. If a TargetData object is alive when types are being refined and
- /// removed, this method must be called whenever a StructType is removed to
- /// avoid a dangling pointer in this cache.
- void InvalidateStructLayoutInfo(const StructType *Ty) const;
-
/// getPreferredAlignment - Return the preferred alignment of the specified
/// global. This includes an explicitly requested alignment (if the global
/// has one).
diff --git a/contrib/llvm/include/llvm/Target/TargetFrameLowering.h b/contrib/llvm/include/llvm/Target/TargetFrameLowering.h
index e104b16..e3d77cf 100644
--- a/contrib/llvm/include/llvm/Target/TargetFrameLowering.h
+++ b/contrib/llvm/include/llvm/Target/TargetFrameLowering.h
@@ -15,6 +15,8 @@
#define LLVM_TARGET_TARGETFRAMELOWERING_H
#include "llvm/CodeGen/MachineBasicBlock.h"
+#include "llvm/MC/MCDwarf.h"
+#include "llvm/ADT/ArrayRef.h"
#include <utility>
#include <vector>
@@ -189,6 +191,14 @@ public:
///
virtual void processFunctionBeforeFrameFinalized(MachineFunction &MF) const {
}
+
+ /// getCompactUnwindEncoding - Get the compact unwind encoding for the
+ /// function. Return 0 if the compact unwind isn't available.
+ virtual uint32_t getCompactUnwindEncoding(ArrayRef<MCCFIInstruction> Instrs,
+ int DataAlignmentFactor,
+ bool IsEH) const {
+ return 0;
+ }
};
} // End llvm namespace
diff --git a/contrib/llvm/include/llvm/Target/TargetInstrInfo.h b/contrib/llvm/include/llvm/Target/TargetInstrInfo.h
index 418f3fe..f663566 100644
--- a/contrib/llvm/include/llvm/Target/TargetInstrInfo.h
+++ b/contrib/llvm/include/llvm/Target/TargetInstrInfo.h
@@ -14,7 +14,7 @@
#ifndef LLVM_TARGET_TARGETINSTRINFO_H
#define LLVM_TARGET_TARGETINSTRINFO_H
-#include "llvm/Target/TargetInstrDesc.h"
+#include "llvm/MC/MCInstrInfo.h"
#include "llvm/CodeGen/MachineFunction.h"
namespace llvm {
@@ -32,6 +32,7 @@ class SelectionDAG;
class ScheduleDAG;
class TargetRegisterClass;
class TargetRegisterInfo;
+class BranchProbability;
template<class T> class SmallVectorImpl;
@@ -40,25 +41,22 @@ template<class T> class SmallVectorImpl;
///
/// TargetInstrInfo - Interface to description of machine instruction set
///
-class TargetInstrInfo {
- const TargetInstrDesc *Descriptors; // Raw array to allow static init'n
- unsigned NumOpcodes; // Number of entries in the desc array
-
+class TargetInstrInfo : public MCInstrInfo {
TargetInstrInfo(const TargetInstrInfo &); // DO NOT IMPLEMENT
void operator=(const TargetInstrInfo &); // DO NOT IMPLEMENT
public:
- TargetInstrInfo(const TargetInstrDesc *desc, unsigned NumOpcodes);
+ TargetInstrInfo(int CFSetupOpcode = -1, int CFDestroyOpcode = -1)
+ : CallFrameSetupOpcode(CFSetupOpcode),
+ CallFrameDestroyOpcode(CFDestroyOpcode) {
+ }
+
virtual ~TargetInstrInfo();
- unsigned getNumOpcodes() const { return NumOpcodes; }
-
- /// get - Return the machine instruction descriptor that corresponds to the
- /// specified instruction opcode.
- ///
- const TargetInstrDesc &get(unsigned Opcode) const {
- assert(Opcode < NumOpcodes && "Invalid opcode!");
- return Descriptors[Opcode];
- }
+ /// getRegClass - Givem a machine instruction descriptor, returns the register
+ /// class constraint for OpNum, or NULL.
+ const TargetRegisterClass *getRegClass(const MCInstrDesc &TID,
+ unsigned OpNum,
+ const TargetRegisterInfo *TRI) const;
/// isTriviallyReMaterializable - Return true if the instruction is trivially
/// rematerializable, meaning it has no side effects and requires no operands
@@ -93,6 +91,15 @@ private:
AliasAnalysis *AA) const;
public:
+ /// getCallFrameSetup/DestroyOpcode - These methods return the opcode of the
+ /// frame setup/destroy instructions if they exist (-1 otherwise). Some
+ /// targets use pseudo instructions in order to abstract away the difference
+ /// between operating with a frame pointer and operating without, through the
+ /// use of these two instructions.
+ ///
+ int getCallFrameSetupOpcode() const { return CallFrameSetupOpcode; }
+ int getCallFrameDestroyOpcode() const { return CallFrameDestroyOpcode; }
+
/// isCoalescableExtInstr - Return true if the instruction is a "coalescable"
/// extension instruction. That is, it's like a copy where it's legal for the
/// source to overlap the destination. e.g. X86::MOVSX64rr32. If this returns
@@ -315,7 +322,7 @@ public:
virtual
bool isProfitableToIfCvt(MachineBasicBlock &MBB, unsigned NumCyles,
unsigned ExtraPredCycles,
- float Probability, float Confidence) const {
+ const BranchProbability &Probability) const {
return false;
}
@@ -330,7 +337,7 @@ public:
unsigned NumTCycles, unsigned ExtraTCycles,
MachineBasicBlock &FMBB,
unsigned NumFCycles, unsigned ExtraFCycles,
- float Probability, float Confidence) const {
+ const BranchProbability &Probability) const {
return false;
}
@@ -342,7 +349,7 @@ public:
/// will be properly predicted.
virtual bool
isProfitableToDupForIfCvt(MachineBasicBlock &MBB, unsigned NumCyles,
- float Probability, float Confidence) const {
+ const BranchProbability &Probability) const {
return false;
}
@@ -663,6 +670,9 @@ public:
virtual
bool hasLowDefLatency(const InstrItineraryData *ItinData,
const MachineInstr *DefMI, unsigned DefIdx) const;
+
+private:
+ int CallFrameSetupOpcode, CallFrameDestroyOpcode;
};
/// TargetInstrInfoImpl - This is the default implementation of
@@ -671,8 +681,9 @@ public:
/// libcodegen, not in libtarget.
class TargetInstrInfoImpl : public TargetInstrInfo {
protected:
- TargetInstrInfoImpl(const TargetInstrDesc *desc, unsigned NumOpcodes)
- : TargetInstrInfo(desc, NumOpcodes) {}
+ TargetInstrInfoImpl(int CallFrameSetupOpcode = -1,
+ int CallFrameDestroyOpcode = -1)
+ : TargetInstrInfo(CallFrameSetupOpcode, CallFrameDestroyOpcode) {}
public:
virtual void ReplaceTailWithBranchTo(MachineBasicBlock::iterator OldInst,
MachineBasicBlock *NewDest) const;
diff --git a/contrib/llvm/include/llvm/Target/TargetLowering.h b/contrib/llvm/include/llvm/Target/TargetLowering.h
index 3e36fb7..533c3ac 100644
--- a/contrib/llvm/include/llvm/Target/TargetLowering.h
+++ b/contrib/llvm/include/llvm/Target/TargetLowering.h
@@ -1421,13 +1421,6 @@ public:
/// is for this target.
virtual ConstraintType getConstraintType(const std::string &Constraint) const;
- /// getRegClassForInlineAsmConstraint - Given a constraint letter (e.g. "r"),
- /// return a list of registers that can be used to satisfy the constraint.
- /// This should only be used for C_RegisterClass constraints.
- virtual std::vector<unsigned>
- getRegClassForInlineAsmConstraint(const std::string &Constraint,
- EVT VT) const;
-
/// getRegForInlineAsmConstraint - Given a physical register constraint (e.g.
/// {edx}), return the register number and the register class for the
/// register.
@@ -1547,6 +1540,8 @@ public:
//===--------------------------------------------------------------------===//
// Div utility functions
//
+ SDValue BuildExactSDIV(SDValue Op1, SDValue Op2, DebugLoc dl,
+ SelectionDAG &DAG) const;
SDValue BuildSDIV(SDNode *N, SelectionDAG &DAG,
std::vector<SDNode*>* Created) const;
SDValue BuildUDIV(SDNode *N, SelectionDAG &DAG,
@@ -1836,9 +1831,8 @@ private:
// Build a new vector type and check if it is legal.
MVT NVT = MVT::getVectorVT(EltVT.getSimpleVT(), NumElts);
-
// Found a legal promoted vector type.
- if (ValueTypeActions.getTypeAction(NVT) == TypeLegal)
+ if (NVT != MVT() && ValueTypeActions.getTypeAction(NVT) == TypeLegal)
return LegalizeKind(TypePromoteInteger,
EVT::getVectorVT(Context, EltVT, NumElts));
}
@@ -1853,6 +1847,7 @@ private:
// If there is no simple vector type with this many elements then there
// cannot be a larger legal vector type. Note that this assumes that
// there are no skipped intermediate vector types in the simple types.
+ if (!EltVT.isSimple()) break;
MVT LargerVector = MVT::getVectorVT(EltVT.getSimpleVT(), NumElts);
if (LargerVector == MVT()) break;
diff --git a/contrib/llvm/include/llvm/Target/TargetLoweringObjectFile.h b/contrib/llvm/include/llvm/Target/TargetLoweringObjectFile.h
index 3991035..2e1d6b9 100644
--- a/contrib/llvm/include/llvm/Target/TargetLoweringObjectFile.h
+++ b/contrib/llvm/include/llvm/Target/TargetLoweringObjectFile.h
@@ -68,6 +68,11 @@ protected:
/// LSDASection - If exception handling is supported by the target, this is
/// the section the Language Specific Data Area information is emitted to.
const MCSection *LSDASection;
+
+ /// CompactUnwindSection - If exception handling is supported by the target
+ /// and the target can support a compact representation of the CIE and FDE,
+ /// this is the section to emit them into.
+ const MCSection *CompactUnwindSection;
// Dwarf sections for debug info. If a target supports debug info, these must
// be set.
@@ -102,8 +107,8 @@ protected:
/// private linkage, aka an L or .L label) or false if it should be a normal
/// non-.globl label. This defaults to true.
bool IsFunctionEHFrameSymbolPrivate;
+
public:
-
MCContext &getContext() const { return *Ctx; }
virtual ~TargetLoweringObjectFile();
@@ -121,7 +126,6 @@ public:
bool getSupportsWeakOmittedEHFrame() const {
return SupportsWeakOmittedEHFrame;
}
-
bool getCommDirectiveSupportsAlignment() const {
return CommDirectiveSupportsAlignment;
}
@@ -132,6 +136,7 @@ public:
const MCSection *getStaticCtorSection() const { return StaticCtorSection; }
const MCSection *getStaticDtorSection() const { return StaticDtorSection; }
const MCSection *getLSDASection() const { return LSDASection; }
+ const MCSection *getCompactUnwindSection() const{return CompactUnwindSection;}
virtual const MCSection *getEHFrameSection() const = 0;
virtual void emitPersonalityValue(MCStreamer &Streamer,
const TargetMachine &TM,
diff --git a/contrib/llvm/include/llvm/Target/TargetMachine.h b/contrib/llvm/include/llvm/Target/TargetMachine.h
index 78f770c..ac41a58 100644
--- a/contrib/llvm/include/llvm/Target/TargetMachine.h
+++ b/contrib/llvm/include/llvm/Target/TargetMachine.h
@@ -14,29 +14,30 @@
#ifndef LLVM_TARGET_TARGETMACHINE_H
#define LLVM_TARGET_TARGETMACHINE_H
-#include "llvm/Target/TargetInstrItineraries.h"
+#include "llvm/ADT/StringRef.h"
#include <cassert>
#include <string>
namespace llvm {
-class Target;
+class InstrItineraryData;
+class JITCodeEmitter;
class MCAsmInfo;
+class MCContext;
+class Pass;
+class PassManager;
+class PassManagerBase;
+class Target;
class TargetData;
-class TargetSubtarget;
+class TargetELFWriterInfo;
+class TargetFrameLowering;
class TargetInstrInfo;
class TargetIntrinsicInfo;
class TargetJITInfo;
class TargetLowering;
-class TargetSelectionDAGInfo;
-class TargetFrameLowering;
-class JITCodeEmitter;
-class MCContext;
class TargetRegisterInfo;
-class PassManagerBase;
-class PassManager;
-class Pass;
-class TargetELFWriterInfo;
+class TargetSelectionDAGInfo;
+class TargetSubtargetInfo;
class formatted_raw_ostream;
class raw_ostream;
@@ -91,15 +92,22 @@ class TargetMachine {
TargetMachine(const TargetMachine &); // DO NOT IMPLEMENT
void operator=(const TargetMachine &); // DO NOT IMPLEMENT
protected: // Can only create subclasses.
- TargetMachine(const Target &);
+ TargetMachine(const Target &T, StringRef TargetTriple,
+ StringRef CPU, StringRef FS);
/// getSubtargetImpl - virtual method implemented by subclasses that returns
- /// a reference to that target's TargetSubtarget-derived member variable.
- virtual const TargetSubtarget *getSubtargetImpl() const { return 0; }
+ /// a reference to that target's TargetSubtargetInfo-derived member variable.
+ virtual const TargetSubtargetInfo *getSubtargetImpl() const { return 0; }
/// TheTarget - The Target that this machine was created for.
const Target &TheTarget;
+ /// TargetTriple, TargetCPU, TargetFS - Triple string, CPU name, and target
+ /// feature strings the TargetMachine instance is created with.
+ std::string TargetTriple;
+ std::string TargetCPU;
+ std::string TargetFS;
+
/// AsmInfo - Contains target specific asm information.
///
const MCAsmInfo *AsmInfo;
@@ -115,6 +123,10 @@ public:
const Target &getTarget() const { return TheTarget; }
+ const StringRef getTargetTriple() const { return TargetTriple; }
+ const StringRef getTargetCPU() const { return TargetCPU; }
+ const StringRef getTargetFeatureString() const { return TargetFS; }
+
// Interfaces to the major aspects of target machine information:
// -- Instruction opcode and operand information
// -- Pipelines and scheduling information
@@ -132,7 +144,7 @@ public:
const MCAsmInfo *getMCAsmInfo() const { return AsmInfo; }
/// getSubtarget - This method returns a pointer to the specified type of
- /// TargetSubtarget. In debug builds, it verifies that the object being
+ /// TargetSubtargetInfo. In debug builds, it verifies that the object being
/// returned is of the correct type.
template<typename STC> const STC &getSubtarget() const {
return *static_cast<const STC*>(getSubtargetImpl());
@@ -295,10 +307,9 @@ public:
/// implemented with the LLVM target-independent code generator.
///
class LLVMTargetMachine : public TargetMachine {
- std::string TargetTriple;
-
protected: // Can only create subclasses.
- LLVMTargetMachine(const Target &T, const std::string &TargetTriple);
+ LLVMTargetMachine(const Target &T, StringRef TargetTriple,
+ StringRef CPU, StringRef FS);
private:
/// addCommonCodeGenPasses - Add standard LLVM codegen passes used for
@@ -311,9 +322,6 @@ private:
virtual void setCodeModelForStatic();
public:
-
- const std::string &getTargetTriple() const { return TargetTriple; }
-
/// addPassesToEmitFile - Add passes to the specified pass manager to get the
/// specified file emitted. Typically this will involve several steps of code
/// generation. If OptLevel is None, the code generator should emit code as
diff --git a/contrib/llvm/include/llvm/Target/TargetOpcodes.h b/contrib/llvm/include/llvm/Target/TargetOpcodes.h
index 01fba66..37f7b2f 100644
--- a/contrib/llvm/include/llvm/Target/TargetOpcodes.h
+++ b/contrib/llvm/include/llvm/Target/TargetOpcodes.h
@@ -71,6 +71,10 @@ namespace TargetOpcode {
/// REG_SEQUENCE - This variadic instruction is used to form a register that
/// represent a consecutive sequence of sub-registers. It's used as register
/// coalescing / allocation aid and must be eliminated before code emission.
+ // In SDNode form, the first operand encodes the register class created by
+ // the REG_SEQUENCE, while each subsequent pair names a vreg + subreg index
+ // pair. Once it has been lowered to a MachineInstr, the regclass operand
+ // is no longer present.
/// e.g. v1027 = REG_SEQUENCE v1024, 3, v1025, 4, v1026, 5
/// After register coalescing references of v1024 should be replace with
/// v1027:3, v1025 with v1027:4, etc.
diff --git a/contrib/llvm/include/llvm/Target/TargetOptions.h b/contrib/llvm/include/llvm/Target/TargetOptions.h
index beed039..55d50d9 100644
--- a/contrib/llvm/include/llvm/Target/TargetOptions.h
+++ b/contrib/llvm/include/llvm/Target/TargetOptions.h
@@ -133,8 +133,8 @@ namespace llvm {
/// as their parent function, etc.), using an alternate ABI if necessary.
extern bool GuaranteedTailCallOpt;
- /// StackAlignment - Override default stack alignment for target.
- extern unsigned StackAlignment;
+ /// StackAlignmentOverride - Override default stack alignment for target.
+ extern unsigned StackAlignmentOverride;
/// RealignStack - This flag indicates whether the stack should be
/// automatically realigned, if needed.
diff --git a/contrib/llvm/include/llvm/Target/TargetRegisterInfo.h b/contrib/llvm/include/llvm/Target/TargetRegisterInfo.h
index f6a8414..8d827f1 100644
--- a/contrib/llvm/include/llvm/Target/TargetRegisterInfo.h
+++ b/contrib/llvm/include/llvm/Target/TargetRegisterInfo.h
@@ -16,8 +16,10 @@
#ifndef LLVM_TARGET_TARGETREGISTERINFO_H
#define LLVM_TARGET_TARGETREGISTERINFO_H
+#include "llvm/MC/MCRegisterInfo.h"
#include "llvm/CodeGen/MachineBasicBlock.h"
#include "llvm/CodeGen/ValueTypes.h"
+#include "llvm/ADT/ArrayRef.h"
#include "llvm/ADT/DenseSet.h"
#include <cassert>
#include <functional>
@@ -26,30 +28,10 @@ namespace llvm {
class BitVector;
class MachineFunction;
-class MachineMove;
class RegScavenger;
template<class T> class SmallVectorImpl;
class raw_ostream;
-/// TargetRegisterDesc - This record contains all of the information known about
-/// a particular register. The Overlaps field contains a pointer to a zero
-/// terminated array of registers that this register aliases, starting with
-/// itself. This is needed for architectures like X86 which have AL alias AX
-/// alias EAX. The SubRegs field is a zero terminated array of registers that
-/// are sub-registers of the specific register, e.g. AL, AH are sub-registers of
-/// AX. The SuperRegs field is a zero terminated array of registers that are
-/// super-registers of the specific register, e.g. RAX, EAX, are super-registers
-/// of AX.
-///
-struct TargetRegisterDesc {
- const char *Name; // Printable name for the reg (for debugging)
- const unsigned *Overlaps; // Overlapping registers, described above
- const unsigned *SubRegs; // Sub-register set, described above
- const unsigned *SuperRegs; // Super-register set, described above
- unsigned CostPerUse; // Extra cost of instructions using register.
- bool inAllocatableClass; // Register belongs to an allocatable regclass.
-};
-
class TargetRegisterClass {
public:
typedef const unsigned* iterator;
@@ -236,27 +218,23 @@ public:
return SuperClasses[0] != 0;
}
- /// allocation_order_begin/end - These methods define a range of registers
- /// which specify the registers in this class that are valid to register
- /// allocate, and the preferred order to allocate them in. For example,
- /// callee saved registers should be at the end of the list, because it is
- /// cheaper to allocate caller saved registers.
- ///
- /// These methods take a MachineFunction argument, which can be used to tune
- /// the allocatable registers based on the characteristics of the function,
- /// subtarget, or other criteria.
+ /// getRawAllocationOrder - Returns the preferred order for allocating
+ /// registers from this register class in MF. The raw order comes directly
+ /// from the .td file and may include reserved registers that are not
+ /// allocatable. Register allocators should also make sure to allocate
+ /// callee-saved registers only after all the volatiles are used. The
+ /// RegisterClassInfo class provides filtered allocation orders with
+ /// callee-saved registers moved to the end.
///
- /// Register allocators should account for the fact that an allocation
- /// order iterator may return a reserved register and always check
- /// if the register is allocatable (getAllocatableSet()) before using it.
+ /// The MachineFunction argument can be used to tune the allocatable
+ /// registers based on the characteristics of the function, subtarget, or
+ /// other criteria.
///
- /// By default, these methods return all registers in the class.
+ /// By default, this method returns all registers in the class.
///
- virtual iterator allocation_order_begin(const MachineFunction &MF) const {
- return begin();
- }
- virtual iterator allocation_order_end(const MachineFunction &MF) const {
- return end();
+ virtual
+ ArrayRef<unsigned> getRawAllocationOrder(const MachineFunction &MF) const {
+ return ArrayRef<unsigned>(begin(), getNumRegs());
}
/// getSize - Return the size of the register in bytes, which is also the size
@@ -277,6 +255,12 @@ public:
bool isAllocatable() const { return Allocatable; }
};
+/// TargetRegisterInfoDesc - Extra information, not in MCRegisterDesc, about
+/// registers. These are used by codegen, not by MC.
+struct TargetRegisterInfoDesc {
+ unsigned CostPerUse; // Extra cost of instructions using register.
+ bool inAllocatableClass; // Register belongs to an allocatable regclass.
+};
/// TargetRegisterInfo base class - We assume that the target defines a static
/// array of TargetRegisterDesc objects that represent all of the machine
@@ -284,34 +268,19 @@ public:
/// to this array so that we can turn register number into a register
/// descriptor.
///
-class TargetRegisterInfo {
-protected:
- const unsigned* SubregHash;
- const unsigned SubregHashSize;
- const unsigned* AliasesHash;
- const unsigned AliasesHashSize;
+class TargetRegisterInfo : public MCRegisterInfo {
public:
typedef const TargetRegisterClass * const * regclass_iterator;
private:
- const TargetRegisterDesc *Desc; // Pointer to the descriptor array
+ const TargetRegisterInfoDesc *InfoDesc; // Extra desc array for codegen
const char *const *SubRegIndexNames; // Names of subreg indexes.
- unsigned NumRegs; // Number of entries in the array
-
regclass_iterator RegClassBegin, RegClassEnd; // List of regclasses
- int CallFrameSetupOpcode, CallFrameDestroyOpcode;
-
protected:
- TargetRegisterInfo(const TargetRegisterDesc *D, unsigned NR,
+ TargetRegisterInfo(const TargetRegisterInfoDesc *ID,
regclass_iterator RegClassBegin,
regclass_iterator RegClassEnd,
- const char *const *subregindexnames,
- int CallFrameSetupOpcode = -1,
- int CallFrameDestroyOpcode = -1,
- const unsigned* subregs = 0,
- const unsigned subregsize = 0,
- const unsigned* aliases = 0,
- const unsigned aliasessize = 0);
+ const char *const *subregindexnames);
virtual ~TargetRegisterInfo();
public:
@@ -391,71 +360,16 @@ public:
BitVector getAllocatableSet(const MachineFunction &MF,
const TargetRegisterClass *RC = NULL) const;
- const TargetRegisterDesc &operator[](unsigned RegNo) const {
- assert(RegNo < NumRegs &&
- "Attempting to access record for invalid register number!");
- return Desc[RegNo];
- }
-
- /// Provide a get method, equivalent to [], but more useful if we have a
- /// pointer to this object.
- ///
- const TargetRegisterDesc &get(unsigned RegNo) const {
- return operator[](RegNo);
- }
-
- /// getAliasSet - Return the set of registers aliased by the specified
- /// register, or a null list of there are none. The list returned is zero
- /// terminated.
- ///
- const unsigned *getAliasSet(unsigned RegNo) const {
- // The Overlaps set always begins with Reg itself.
- return get(RegNo).Overlaps + 1;
- }
-
- /// getOverlaps - Return a list of registers that overlap Reg, including
- /// itself. This is the same as the alias set except Reg is included in the
- /// list.
- /// These are exactly the registers in { x | regsOverlap(x, Reg) }.
- ///
- const unsigned *getOverlaps(unsigned RegNo) const {
- return get(RegNo).Overlaps;
- }
-
- /// getSubRegisters - Return the list of registers that are sub-registers of
- /// the specified register, or a null list of there are none. The list
- /// returned is zero terminated and sorted according to super-sub register
- /// relations. e.g. X86::RAX's sub-register list is EAX, AX, AL, AH.
- ///
- const unsigned *getSubRegisters(unsigned RegNo) const {
- return get(RegNo).SubRegs;
- }
-
- /// getSuperRegisters - Return the list of registers that are super-registers
- /// of the specified register, or a null list of there are none. The list
- /// returned is zero terminated and sorted according to super-sub register
- /// relations. e.g. X86::AL's super-register list is RAX, EAX, AX.
- ///
- const unsigned *getSuperRegisters(unsigned RegNo) const {
- return get(RegNo).SuperRegs;
- }
-
- /// getName - Return the human-readable symbolic target-specific name for the
- /// specified physical register.
- const char *getName(unsigned RegNo) const {
- return get(RegNo).Name;
- }
-
/// getCostPerUse - Return the additional cost of using this register instead
/// of other registers in its class.
unsigned getCostPerUse(unsigned RegNo) const {
- return get(RegNo).CostPerUse;
+ return InfoDesc[RegNo].CostPerUse;
}
- /// getNumRegs - Return the number of registers this target has (useful for
- /// sizing arrays holding per register information)
- unsigned getNumRegs() const {
- return NumRegs;
+ /// isInAllocatableClass - Return true if the register is in the allocation
+ /// of any register class.
+ bool isInAllocatableClass(unsigned RegNo) const {
+ return InfoDesc[RegNo].inAllocatableClass;
}
/// getSubRegIndexName - Return the human-readable symbolic target-specific
@@ -468,49 +382,28 @@ public:
/// regsOverlap - Returns true if the two registers are equal or alias each
/// other. The registers may be virtual register.
bool regsOverlap(unsigned regA, unsigned regB) const {
- if (regA == regB)
- return true;
-
+ if (regA == regB) return true;
if (isVirtualRegister(regA) || isVirtualRegister(regB))
return false;
-
- // regA and regB are distinct physical registers. Do they alias?
- size_t index = (regA + regB * 37) & (AliasesHashSize-1);
- unsigned ProbeAmt = 0;
- while (AliasesHash[index*2] != 0 &&
- AliasesHash[index*2+1] != 0) {
- if (AliasesHash[index*2] == regA && AliasesHash[index*2+1] == regB)
- return true;
-
- index = (index + ProbeAmt) & (AliasesHashSize-1);
- ProbeAmt += 2;
+ for (const unsigned *regList = getOverlaps(regA)+1; *regList; ++regList) {
+ if (*regList == regB) return true;
}
-
return false;
}
/// isSubRegister - Returns true if regB is a sub-register of regA.
///
bool isSubRegister(unsigned regA, unsigned regB) const {
- // SubregHash is a simple quadratically probed hash table.
- size_t index = (regA + regB * 37) & (SubregHashSize-1);
- unsigned ProbeAmt = 2;
- while (SubregHash[index*2] != 0 &&
- SubregHash[index*2+1] != 0) {
- if (SubregHash[index*2] == regA && SubregHash[index*2+1] == regB)
- return true;
-
- index = (index + ProbeAmt) & (SubregHashSize-1);
- ProbeAmt += 2;
- }
-
- return false;
+ return isSuperRegister(regB, regA);
}
/// isSuperRegister - Returns true if regB is a super-register of regA.
///
bool isSuperRegister(unsigned regA, unsigned regB) const {
- return isSubRegister(regB, regA);
+ for (const unsigned *regList = getSuperRegisters(regA); *regList;++regList){
+ if (*regList == regB) return true;
+ }
+ return false;
}
/// getCalleeSavedRegs - Return a null-terminated list of all of the
@@ -599,7 +492,7 @@ public:
}
/// getRegClass - Returns the register class associated with the enumeration
- /// value. See class TargetOperandInfo.
+ /// value. See class MCOperandInfo.
const TargetRegisterClass *getRegClass(unsigned i) const {
assert(i < getNumRegClasses() && "Register Class ID out of range");
return RegClassBegin[i];
@@ -642,14 +535,17 @@ public:
return 0;
}
- /// getAllocationOrder - Returns the register allocation order for a specified
- /// register class in the form of a pair of TargetRegisterClass iterators.
- virtual std::pair<TargetRegisterClass::iterator,TargetRegisterClass::iterator>
- getAllocationOrder(const TargetRegisterClass *RC,
- unsigned HintType, unsigned HintReg,
- const MachineFunction &MF) const {
- return std::make_pair(RC->allocation_order_begin(MF),
- RC->allocation_order_end(MF));
+ /// getRawAllocationOrder - Returns the register allocation order for a
+ /// specified register class with a target-dependent hint. The returned list
+ /// may contain reserved registers that cannot be allocated.
+ ///
+ /// Register allocators need only call this function to resolve
+ /// target-dependent hints, but it should work without hinting as well.
+ virtual ArrayRef<unsigned>
+ getRawAllocationOrder(const TargetRegisterClass *RC,
+ unsigned HintType, unsigned HintReg,
+ const MachineFunction &MF) const {
+ return RC->getRawAllocationOrder(MF);
}
/// ResolveRegAllocHint - Resolves the specified register allocation hint
@@ -762,15 +658,6 @@ public:
return false; // Must return a value in order to compile with VS 2005
}
- /// getCallFrameSetup/DestroyOpcode - These methods return the opcode of the
- /// frame setup/destroy instructions if they exist (-1 otherwise). Some
- /// targets use pseudo instructions in order to abstract away the difference
- /// between operating with a frame pointer and operating without, through the
- /// use of these two instructions.
- ///
- int getCallFrameSetupOpcode() const { return CallFrameSetupOpcode; }
- int getCallFrameDestroyOpcode() const { return CallFrameDestroyOpcode; }
-
/// eliminateCallFramePseudoInstr - This method is called during prolog/epilog
/// code insertion to eliminate call frame setup and destroy pseudo
/// instructions (but only if the Target is using them). It is responsible
@@ -782,9 +669,6 @@ public:
eliminateCallFramePseudoInstr(MachineFunction &MF,
MachineBasicBlock &MBB,
MachineBasicBlock::iterator MI) const {
- assert(getCallFrameSetupOpcode()== -1 && getCallFrameDestroyOpcode()== -1 &&
- "eliminateCallFramePseudoInstr must be implemented if using"
- " call frame setup/destroy pseudo instructions!");
assert(0 && "Call Frame Pseudo Instructions do not exist on this target!");
}
@@ -836,6 +720,12 @@ public:
virtual int getSEHRegNum(unsigned i) const {
return i;
}
+
+ /// getCompactUnwindRegNum - This function maps the register to the number for
+ /// compact unwind encoding. Return -1 if the register isn't valid.
+ virtual int getCompactUnwindRegNum(unsigned, bool) const {
+ return -1;
+ }
};
diff --git a/contrib/llvm/include/llvm/Target/TargetRegistry.h b/contrib/llvm/include/llvm/Target/TargetRegistry.h
index a464822..7e0ce19 100644
--- a/contrib/llvm/include/llvm/Target/TargetRegistry.h
+++ b/contrib/llvm/include/llvm/Target/TargetRegistry.h
@@ -33,7 +33,10 @@ namespace llvm {
class MCContext;
class MCDisassembler;
class MCInstPrinter;
+ class MCInstrInfo;
+ class MCRegisterInfo;
class MCStreamer;
+ class MCSubtargetInfo;
class TargetAsmBackend;
class TargetAsmLexer;
class TargetAsmParser;
@@ -63,10 +66,16 @@ namespace llvm {
typedef unsigned (*TripleMatchQualityFnTy)(const std::string &TT);
- typedef MCAsmInfo *(*AsmInfoCtorFnTy)(const Target &T,
- StringRef TT);
+ typedef MCAsmInfo *(*MCAsmInfoCtorFnTy)(const Target &T,
+ StringRef TT);
+ typedef MCInstrInfo *(*MCInstrInfoCtorFnTy)(void);
+ typedef MCRegisterInfo *(*MCRegInfoCtorFnTy)(void);
+ typedef MCSubtargetInfo *(*MCSubtargetInfoCtorFnTy)(StringRef TT,
+ StringRef CPU,
+ StringRef Features);
typedef TargetMachine *(*TargetMachineCtorTy)(const Target &T,
const std::string &TT,
+ const std::string &CPU,
const std::string &Features);
typedef AsmPrinter *(*AsmPrinterCtorTy)(TargetMachine &TM,
MCStreamer &Streamer);
@@ -74,15 +83,14 @@ namespace llvm {
const std::string &TT);
typedef TargetAsmLexer *(*AsmLexerCtorTy)(const Target &T,
const MCAsmInfo &MAI);
- typedef TargetAsmParser *(*AsmParserCtorTy)(const Target &T,MCAsmParser &P,
- TargetMachine &TM);
+ typedef TargetAsmParser *(*AsmParserCtorTy)(MCSubtargetInfo &STI,
+ MCAsmParser &P);
typedef MCDisassembler *(*MCDisassemblerCtorTy)(const Target &T);
typedef MCInstPrinter *(*MCInstPrinterCtorTy)(const Target &T,
- TargetMachine &TM,
unsigned SyntaxVariant,
const MCAsmInfo &MAI);
- typedef MCCodeEmitter *(*CodeEmitterCtorTy)(const Target &T,
- TargetMachine &TM,
+ typedef MCCodeEmitter *(*CodeEmitterCtorTy)(const MCInstrInfo &II,
+ const MCSubtargetInfo &STI,
MCContext &Ctx);
typedef MCStreamer *(*ObjectStreamerCtorTy)(const Target &T,
const std::string &TT,
@@ -120,7 +128,21 @@ namespace llvm {
/// HasJIT - Whether this target supports the JIT.
bool HasJIT;
- AsmInfoCtorFnTy AsmInfoCtorFn;
+ /// MCAsmInfoCtorFn - Constructor function for this target's MCAsmInfo, if
+ /// registered.
+ MCAsmInfoCtorFnTy MCAsmInfoCtorFn;
+
+ /// MCInstrInfoCtorFn - Constructor function for this target's MCInstrInfo,
+ /// if registered.
+ MCInstrInfoCtorFnTy MCInstrInfoCtorFn;
+
+ /// MCRegInfoCtorFn - Constructor function for this target's MCRegisterInfo,
+ /// if registered.
+ MCRegInfoCtorFnTy MCRegInfoCtorFn;
+
+ /// MCSubtargetInfoCtorFn - Constructor function for this target's
+ /// MCSubtargetInfo, if registered.
+ MCSubtargetInfoCtorFnTy MCSubtargetInfoCtorFn;
/// TargetMachineCtorFn - Construction function for this target's
/// TargetMachine, if registered.
@@ -218,17 +240,49 @@ namespace llvm {
/// @name Feature Constructors
/// @{
- /// createAsmInfo - Create a MCAsmInfo implementation for the specified
+ /// createMCAsmInfo - Create a MCAsmInfo implementation for the specified
/// target triple.
///
/// \arg Triple - This argument is used to determine the target machine
/// feature set; it should always be provided. Generally this should be
/// either the target triple from the module, or the target triple of the
/// host if that does not exist.
- MCAsmInfo *createAsmInfo(StringRef Triple) const {
- if (!AsmInfoCtorFn)
+ MCAsmInfo *createMCAsmInfo(StringRef Triple) const {
+ if (!MCAsmInfoCtorFn)
+ return 0;
+ return MCAsmInfoCtorFn(*this, Triple);
+ }
+
+ /// createMCInstrInfo - Create a MCInstrInfo implementation.
+ ///
+ MCInstrInfo *createMCInstrInfo() const {
+ if (!MCInstrInfoCtorFn)
+ return 0;
+ return MCInstrInfoCtorFn();
+ }
+
+ /// createMCRegInfo - Create a MCRegisterInfo implementation.
+ ///
+ MCRegisterInfo *createMCRegInfo() const {
+ if (!MCRegInfoCtorFn)
+ return 0;
+ return MCRegInfoCtorFn();
+ }
+
+ /// createMCSubtargetInfo - Create a MCSubtargetInfo implementation.
+ ///
+ /// \arg Triple - This argument is used to determine the target machine
+ /// feature set; it should always be provided. Generally this should be
+ /// either the target triple from the module, or the target triple of the
+ /// host if that does not exist.
+ /// \arg CPU - This specifies the name of the target CPU.
+ /// \arg Features - This specifies the string representation of the
+ /// additional target features.
+ MCSubtargetInfo *createMCSubtargetInfo(StringRef Triple, StringRef CPU,
+ StringRef Features) const {
+ if (!MCSubtargetInfoCtorFn)
return 0;
- return AsmInfoCtorFn(*this, Triple);
+ return MCSubtargetInfoCtorFn(Triple, CPU, Features);
}
/// createTargetMachine - Create a target specific machine implementation
@@ -239,10 +293,11 @@ namespace llvm {
/// either the target triple from the module, or the target triple of the
/// host if that does not exist.
TargetMachine *createTargetMachine(const std::string &Triple,
+ const std::string &CPU,
const std::string &Features) const {
if (!TargetMachineCtorFn)
return 0;
- return TargetMachineCtorFn(*this, Triple, Features);
+ return TargetMachineCtorFn(*this, Triple, CPU, Features);
}
/// createAsmBackend - Create a target specific assembly parser.
@@ -267,11 +322,11 @@ namespace llvm {
///
/// \arg Parser - The target independent parser implementation to use for
/// parsing and lexing.
- TargetAsmParser *createAsmParser(MCAsmParser &Parser,
- TargetMachine &TM) const {
+ TargetAsmParser *createAsmParser(MCSubtargetInfo &STI,
+ MCAsmParser &Parser) const {
if (!AsmParserCtorFn)
return 0;
- return AsmParserCtorFn(*this, Parser, TM);
+ return AsmParserCtorFn(STI, Parser);
}
/// createAsmPrinter - Create a target specific assembly printer pass. This
@@ -288,20 +343,21 @@ namespace llvm {
return MCDisassemblerCtorFn(*this);
}
- MCInstPrinter *createMCInstPrinter(TargetMachine &TM,
- unsigned SyntaxVariant,
+ MCInstPrinter *createMCInstPrinter(unsigned SyntaxVariant,
const MCAsmInfo &MAI) const {
if (!MCInstPrinterCtorFn)
return 0;
- return MCInstPrinterCtorFn(*this, TM, SyntaxVariant, MAI);
+ return MCInstPrinterCtorFn(*this, SyntaxVariant, MAI);
}
/// createCodeEmitter - Create a target specific code emitter.
- MCCodeEmitter *createCodeEmitter(TargetMachine &TM, MCContext &Ctx) const {
+ MCCodeEmitter *createCodeEmitter(const MCInstrInfo &II,
+ const MCSubtargetInfo &STI,
+ MCContext &Ctx) const {
if (!CodeEmitterCtorFn)
return 0;
- return CodeEmitterCtorFn(*this, TM, Ctx);
+ return CodeEmitterCtorFn(II, STI, Ctx);
}
/// createObjectStreamer - Create a target specific MCStreamer.
@@ -429,7 +485,7 @@ namespace llvm {
Target::TripleMatchQualityFnTy TQualityFn,
bool HasJIT = false);
- /// RegisterAsmInfo - Register a MCAsmInfo implementation for the
+ /// RegisterMCAsmInfo - Register a MCAsmInfo implementation for the
/// given target.
///
/// Clients are responsible for ensuring that registration doesn't occur
@@ -438,10 +494,56 @@ namespace llvm {
///
/// @param T - The target being registered.
/// @param Fn - A function to construct a MCAsmInfo for the target.
- static void RegisterAsmInfo(Target &T, Target::AsmInfoCtorFnTy Fn) {
+ static void RegisterMCAsmInfo(Target &T, Target::MCAsmInfoCtorFnTy Fn) {
+ // Ignore duplicate registration.
+ if (!T.MCAsmInfoCtorFn)
+ T.MCAsmInfoCtorFn = Fn;
+ }
+
+ /// RegisterMCInstrInfo - Register a MCInstrInfo implementation for the
+ /// given target.
+ ///
+ /// Clients are responsible for ensuring that registration doesn't occur
+ /// while another thread is attempting to access the registry. Typically
+ /// this is done by initializing all targets at program startup.
+ ///
+ /// @param T - The target being registered.
+ /// @param Fn - A function to construct a MCInstrInfo for the target.
+ static void RegisterMCInstrInfo(Target &T, Target::MCInstrInfoCtorFnTy Fn) {
+ // Ignore duplicate registration.
+ if (!T.MCInstrInfoCtorFn)
+ T.MCInstrInfoCtorFn = Fn;
+ }
+
+ /// RegisterMCRegInfo - Register a MCRegisterInfo implementation for the
+ /// given target.
+ ///
+ /// Clients are responsible for ensuring that registration doesn't occur
+ /// while another thread is attempting to access the registry. Typically
+ /// this is done by initializing all targets at program startup.
+ ///
+ /// @param T - The target being registered.
+ /// @param Fn - A function to construct a MCRegisterInfo for the target.
+ static void RegisterMCRegInfo(Target &T, Target::MCRegInfoCtorFnTy Fn) {
+ // Ignore duplicate registration.
+ if (!T.MCRegInfoCtorFn)
+ T.MCRegInfoCtorFn = Fn;
+ }
+
+ /// RegisterMCSubtargetInfo - Register a MCSubtargetInfo implementation for
+ /// the given target.
+ ///
+ /// Clients are responsible for ensuring that registration doesn't occur
+ /// while another thread is attempting to access the registry. Typically
+ /// this is done by initializing all targets at program startup.
+ ///
+ /// @param T - The target being registered.
+ /// @param Fn - A function to construct a MCSubtargetInfo for the target.
+ static void RegisterMCSubtargetInfo(Target &T,
+ Target::MCSubtargetInfoCtorFnTy Fn) {
// Ignore duplicate registration.
- if (!T.AsmInfoCtorFn)
- T.AsmInfoCtorFn = Fn;
+ if (!T.MCSubtargetInfoCtorFn)
+ T.MCSubtargetInfoCtorFn = Fn;
}
/// RegisterTargetMachine - Register a TargetMachine implementation for the
@@ -620,18 +722,18 @@ namespace llvm {
}
};
- /// RegisterAsmInfo - Helper template for registering a target assembly info
+ /// RegisterMCAsmInfo - Helper template for registering a target assembly info
/// implementation. This invokes the static "Create" method on the class to
/// actually do the construction. Usage:
///
/// extern "C" void LLVMInitializeFooTarget() {
/// extern Target TheFooTarget;
- /// RegisterAsmInfo<FooMCAsmInfo> X(TheFooTarget);
+ /// RegisterMCAsmInfo<FooMCAsmInfo> X(TheFooTarget);
/// }
template<class MCAsmInfoImpl>
- struct RegisterAsmInfo {
- RegisterAsmInfo(Target &T) {
- TargetRegistry::RegisterAsmInfo(T, &Allocator);
+ struct RegisterMCAsmInfo {
+ RegisterMCAsmInfo(Target &T) {
+ TargetRegistry::RegisterMCAsmInfo(T, &Allocator);
}
private:
static MCAsmInfo *Allocator(const Target &T, StringRef TT) {
@@ -640,20 +742,119 @@ namespace llvm {
};
- /// RegisterAsmInfoFn - Helper template for registering a target assembly info
+ /// RegisterMCAsmInfoFn - Helper template for registering a target assembly info
/// implementation. This invokes the specified function to do the
/// construction. Usage:
///
/// extern "C" void LLVMInitializeFooTarget() {
/// extern Target TheFooTarget;
- /// RegisterAsmInfoFn X(TheFooTarget, TheFunction);
+ /// RegisterMCAsmInfoFn X(TheFooTarget, TheFunction);
/// }
- struct RegisterAsmInfoFn {
- RegisterAsmInfoFn(Target &T, Target::AsmInfoCtorFnTy Fn) {
- TargetRegistry::RegisterAsmInfo(T, Fn);
+ struct RegisterMCAsmInfoFn {
+ RegisterMCAsmInfoFn(Target &T, Target::MCAsmInfoCtorFnTy Fn) {
+ TargetRegistry::RegisterMCAsmInfo(T, Fn);
}
};
+ /// RegisterMCInstrInfo - Helper template for registering a target instruction
+ /// info implementation. This invokes the static "Create" method on the class
+ /// to actually do the construction. Usage:
+ ///
+ /// extern "C" void LLVMInitializeFooTarget() {
+ /// extern Target TheFooTarget;
+ /// RegisterMCInstrInfo<FooMCInstrInfo> X(TheFooTarget);
+ /// }
+ template<class MCInstrInfoImpl>
+ struct RegisterMCInstrInfo {
+ RegisterMCInstrInfo(Target &T) {
+ TargetRegistry::RegisterMCInstrInfo(T, &Allocator);
+ }
+ private:
+ static MCInstrInfo *Allocator() {
+ return new MCInstrInfoImpl();
+ }
+ };
+
+ /// RegisterMCInstrInfoFn - Helper template for registering a target
+ /// instruction info implementation. This invokes the specified function to
+ /// do the construction. Usage:
+ ///
+ /// extern "C" void LLVMInitializeFooTarget() {
+ /// extern Target TheFooTarget;
+ /// RegisterMCInstrInfoFn X(TheFooTarget, TheFunction);
+ /// }
+ struct RegisterMCInstrInfoFn {
+ RegisterMCInstrInfoFn(Target &T, Target::MCInstrInfoCtorFnTy Fn) {
+ TargetRegistry::RegisterMCInstrInfo(T, Fn);
+ }
+ };
+
+ /// RegisterMCRegInfo - Helper template for registering a target register info
+ /// implementation. This invokes the static "Create" method on the class to
+ /// actually do the construction. Usage:
+ ///
+ /// extern "C" void LLVMInitializeFooTarget() {
+ /// extern Target TheFooTarget;
+ /// RegisterMCRegInfo<FooMCRegInfo> X(TheFooTarget);
+ /// }
+ template<class MCRegisterInfoImpl>
+ struct RegisterMCRegInfo {
+ RegisterMCRegInfo(Target &T) {
+ TargetRegistry::RegisterMCRegInfo(T, &Allocator);
+ }
+ private:
+ static MCRegisterInfo *Allocator() {
+ return new MCRegisterInfoImpl();
+ }
+ };
+
+ /// RegisterMCRegInfoFn - Helper template for registering a target register
+ /// info implementation. This invokes the specified function to do the
+ /// construction. Usage:
+ ///
+ /// extern "C" void LLVMInitializeFooTarget() {
+ /// extern Target TheFooTarget;
+ /// RegisterMCRegInfoFn X(TheFooTarget, TheFunction);
+ /// }
+ struct RegisterMCRegInfoFn {
+ RegisterMCRegInfoFn(Target &T, Target::MCRegInfoCtorFnTy Fn) {
+ TargetRegistry::RegisterMCRegInfo(T, Fn);
+ }
+ };
+
+ /// RegisterMCSubtargetInfo - Helper template for registering a target
+ /// subtarget info implementation. This invokes the static "Create" method
+ /// on the class to actually do the construction. Usage:
+ ///
+ /// extern "C" void LLVMInitializeFooTarget() {
+ /// extern Target TheFooTarget;
+ /// RegisterMCSubtargetInfo<FooMCSubtargetInfo> X(TheFooTarget);
+ /// }
+ template<class MCSubtargetInfoImpl>
+ struct RegisterMCSubtargetInfo {
+ RegisterMCSubtargetInfo(Target &T) {
+ TargetRegistry::RegisterMCSubtargetInfo(T, &Allocator);
+ }
+ private:
+ static MCSubtargetInfo *Allocator(StringRef TT, StringRef CPU,
+ StringRef FS) {
+ return new MCSubtargetInfoImpl();
+ }
+ };
+
+ /// RegisterMCSubtargetInfoFn - Helper template for registering a target
+ /// subtarget info implementation. This invokes the specified function to
+ /// do the construction. Usage:
+ ///
+ /// extern "C" void LLVMInitializeFooTarget() {
+ /// extern Target TheFooTarget;
+ /// RegisterMCSubtargetInfoFn X(TheFooTarget, TheFunction);
+ /// }
+ struct RegisterMCSubtargetInfoFn {
+ RegisterMCSubtargetInfoFn(Target &T, Target::MCSubtargetInfoCtorFnTy Fn) {
+ TargetRegistry::RegisterMCSubtargetInfo(T, Fn);
+ }
+ };
/// RegisterTargetMachine - Helper template for registering a target machine
/// implementation, for use in the target machine initialization
@@ -671,8 +872,9 @@ namespace llvm {
private:
static TargetMachine *Allocator(const Target &T, const std::string &TT,
+ const std::string &CPU,
const std::string &FS) {
- return new TargetMachineImpl(T, TT, FS);
+ return new TargetMachineImpl(T, TT, CPU, FS);
}
};
@@ -731,9 +933,8 @@ namespace llvm {
}
private:
- static TargetAsmParser *Allocator(const Target &T, MCAsmParser &P,
- TargetMachine &TM) {
- return new AsmParserImpl(T, P, TM);
+ static TargetAsmParser *Allocator(MCSubtargetInfo &STI, MCAsmParser &P) {
+ return new AsmParserImpl(STI, P);
}
};
@@ -772,9 +973,10 @@ namespace llvm {
}
private:
- static MCCodeEmitter *Allocator(const Target &T, TargetMachine &TM,
+ static MCCodeEmitter *Allocator(const MCInstrInfo &II,
+ const MCSubtargetInfo &STI,
MCContext &Ctx) {
- return new CodeEmitterImpl(T, TM, Ctx);
+ return new CodeEmitterImpl();
}
};
diff --git a/contrib/llvm/include/llvm/Target/TargetSelect.h b/contrib/llvm/include/llvm/Target/TargetSelect.h
index c5ab90b..272ee09 100644
--- a/contrib/llvm/include/llvm/Target/TargetSelect.h
+++ b/contrib/llvm/include/llvm/Target/TargetSelect.h
@@ -26,6 +26,18 @@ extern "C" {
#define LLVM_TARGET(TargetName) void LLVMInitialize##TargetName##Target();
#include "llvm/Config/Targets.def"
+#define LLVM_TARGET(TargetName) \
+ void LLVMInitialize##TargetName##MCAsmInfo();
+#include "llvm/Config/Targets.def"
+
+#define LLVM_TARGET(TargetName) \
+ void LLVMInitialize##TargetName##MCInstrInfo();
+#include "llvm/Config/Targets.def"
+
+#define LLVM_TARGET(TargetName) \
+ void LLVMInitialize##TargetName##MCSubtargetInfo();
+#include "llvm/Config/Targets.def"
+
// Declare all of the available assembly printer initialization functions.
#define LLVM_ASM_PRINTER(TargetName) void LLVMInitialize##TargetName##AsmPrinter();
#include "llvm/Config/AsmPrinters.def"
@@ -35,7 +47,8 @@ extern "C" {
#include "llvm/Config/AsmParsers.def"
// Declare all of the available disassembler initialization functions.
-#define LLVM_DISASSEMBLER(TargetName) void LLVMInitialize##TargetName##Disassembler();
+#define LLVM_DISASSEMBLER(TargetName) \
+ void LLVMInitialize##TargetName##Disassembler();
#include "llvm/Config/Disassemblers.def"
}
@@ -63,6 +76,38 @@ namespace llvm {
#include "llvm/Config/Targets.def"
}
+ /// InitializeAllMCAsmInfos - The main program should call this function
+ /// if it wants access to all available assembly infos for targets that
+ /// LLVM is configured to support, to make them available via the
+ /// TargetRegistry.
+ ///
+ /// It is legal for a client to make multiple calls to this function.
+ inline void InitializeAllMCAsmInfos() {
+#define LLVM_TARGET(TargetName) LLVMInitialize##TargetName##MCAsmInfo();
+#include "llvm/Config/Targets.def"
+ }
+
+ /// InitializeAllMCInstrInfos - The main program should call this function
+ /// if it wants access to all available instruction infos for targets that
+ /// LLVM is configured to support, to make them available via the
+ /// TargetRegistry.
+ ///
+ /// It is legal for a client to make multiple calls to this function.
+ inline void InitializeAllMCInstrInfos() {
+#define LLVM_TARGET(TargetName) LLVMInitialize##TargetName##MCInstrInfo();
+#include "llvm/Config/Targets.def"
+ }
+
+ /// InitializeAllMCSubtargetInfos - The main program should call this function
+ /// if it wants access to all available subtarget infos for targets that LLVM
+ /// is configured to support, to make them available via the TargetRegistry.
+ ///
+ /// It is legal for a client to make multiple calls to this function.
+ inline void InitializeAllMCSubtargetInfos() {
+#define LLVM_TARGET(TargetName) LLVMInitialize##TargetName##MCSubtargetInfo();
+#include "llvm/Config/Targets.def"
+ }
+
/// InitializeAllAsmPrinters - The main program should call this function if
/// it wants all asm printers that LLVM is configured to support, to make them
/// available via the TargetRegistry.
@@ -103,6 +148,7 @@ namespace llvm {
#ifdef LLVM_NATIVE_TARGET
LLVM_NATIVE_TARGETINFO();
LLVM_NATIVE_TARGET();
+ LLVM_NATIVE_MCASMINFO();
return false;
#else
return true;
diff --git a/contrib/llvm/include/llvm/Target/TargetSelectionDAG.td b/contrib/llvm/include/llvm/Target/TargetSelectionDAG.td
index 672117f..9d1ef2c 100644
--- a/contrib/llvm/include/llvm/Target/TargetSelectionDAG.td
+++ b/contrib/llvm/include/llvm/Target/TargetSelectionDAG.td
@@ -197,8 +197,8 @@ def SDTSubVecInsert : SDTypeProfile<1, 3, [ // subvector insert
SDTCisSubVecOfVec<2, 1>, SDTCisSameAs<0,1>, SDTCisInt<3>
]>;
-def SDTPrefetch : SDTypeProfile<0, 3, [ // prefetch
- SDTCisPtrTy<0>, SDTCisSameAs<1, 2>, SDTCisInt<1>
+def SDTPrefetch : SDTypeProfile<0, 4, [ // prefetch
+ SDTCisPtrTy<0>, SDTCisSameAs<1, 2>, SDTCisSameAs<1, 3>, SDTCisInt<1>
]>;
def SDTMemBarrier : SDTypeProfile<0, 5, [ // memory barier
@@ -353,6 +353,7 @@ def fsub : SDNode<"ISD::FSUB" , SDTFPBinOp>;
def fmul : SDNode<"ISD::FMUL" , SDTFPBinOp, [SDNPCommutative]>;
def fdiv : SDNode<"ISD::FDIV" , SDTFPBinOp>;
def frem : SDNode<"ISD::FREM" , SDTFPBinOp>;
+def fma : SDNode<"ISD::FMA" , SDTFPTernaryOp>;
def fabs : SDNode<"ISD::FABS" , SDTFPUnaryOp>;
def fgetsign : SDNode<"ISD::FGETSIGN" , SDTFPToIntOp>;
def fneg : SDNode<"ISD::FNEG" , SDTFPUnaryOp>;
diff --git a/contrib/llvm/include/llvm/Target/TargetSubtarget.h b/contrib/llvm/include/llvm/Target/TargetSubtargetInfo.h
index 22b09ba..9556c7a 100644
--- a/contrib/llvm/include/llvm/Target/TargetSubtarget.h
+++ b/contrib/llvm/include/llvm/Target/TargetSubtargetInfo.h
@@ -1,4 +1,4 @@
-//==-- llvm/Target/TargetSubtarget.h - Target Information --------*- C++ -*-==//
+//==-- llvm/Target/TargetSubtargetInfo.h - Target Information ----*- C++ -*-==//
//
// The LLVM Compiler Infrastructure
//
@@ -11,9 +11,10 @@
//
//===----------------------------------------------------------------------===//
-#ifndef LLVM_TARGET_TARGETSUBTARGET_H
-#define LLVM_TARGET_TARGETSUBTARGET_H
+#ifndef LLVM_TARGET_TARGETSUBTARGETINFO_H
+#define LLVM_TARGET_TARGETSUBTARGETINFO_H
+#include "llvm/MC/MCSubtargetInfo.h"
#include "llvm/Target/TargetMachine.h"
namespace llvm {
@@ -25,22 +26,22 @@ template <typename T> class SmallVectorImpl;
//===----------------------------------------------------------------------===//
///
-/// TargetSubtarget - Generic base class for all target subtargets. All
+/// TargetSubtargetInfo - Generic base class for all target subtargets. All
/// Target-specific options that control code generation and printing should
-/// be exposed through a TargetSubtarget-derived class.
+/// be exposed through a TargetSubtargetInfo-derived class.
///
-class TargetSubtarget {
- TargetSubtarget(const TargetSubtarget&); // DO NOT IMPLEMENT
- void operator=(const TargetSubtarget&); // DO NOT IMPLEMENT
+class TargetSubtargetInfo : public MCSubtargetInfo {
+ TargetSubtargetInfo(const TargetSubtargetInfo&); // DO NOT IMPLEMENT
+ void operator=(const TargetSubtargetInfo&); // DO NOT IMPLEMENT
protected: // Can only create subclasses...
- TargetSubtarget();
+ TargetSubtargetInfo();
public:
// AntiDepBreakMode - Type of anti-dependence breaking that should
// be performed before post-RA scheduling.
typedef enum { ANTIDEP_NONE, ANTIDEP_CRITICAL, ANTIDEP_ALL } AntiDepBreakMode;
typedef SmallVectorImpl<TargetRegisterClass*> RegClassVector;
- virtual ~TargetSubtarget();
+ virtual ~TargetSubtargetInfo();
/// getSpecialAddressLatency - For targets where it is beneficial to
/// backschedule instructions that compute addresses, return a value
diff --git a/contrib/llvm/include/llvm/Transforms/IPO.h b/contrib/llvm/include/llvm/Transforms/IPO.h
index d12fd1d..f025e180 100644
--- a/contrib/llvm/include/llvm/Transforms/IPO.h
+++ b/contrib/llvm/include/llvm/Transforms/IPO.h
@@ -74,13 +74,6 @@ ModulePass *createGlobalOptimizerPass();
//===----------------------------------------------------------------------===//
-/// createDeadTypeEliminationPass - Return a new pass that eliminates symbol
-/// table entries for types that are never used.
-///
-ModulePass *createDeadTypeEliminationPass();
-
-
-//===----------------------------------------------------------------------===//
/// createGlobalDCEPass - This transform is designed to eliminate unreachable
/// internal globals (functions or global variables)
///
diff --git a/contrib/llvm/include/llvm/Transforms/Scalar.h b/contrib/llvm/include/llvm/Transforms/Scalar.h
index de46a8d..2187d4e 100644
--- a/contrib/llvm/include/llvm/Transforms/Scalar.h
+++ b/contrib/llvm/include/llvm/Transforms/Scalar.h
@@ -338,11 +338,37 @@ Pass *createCorrelatedValuePropagationPass();
//===----------------------------------------------------------------------===//
//
+// ObjCARCExpand - ObjC ARC preliminary simplifications.
+//
+Pass *createObjCARCExpandPass();
+
+//===----------------------------------------------------------------------===//
+//
+// ObjCARCContract - Late ObjC ARC cleanups.
+//
+Pass *createObjCARCContractPass();
+
+//===----------------------------------------------------------------------===//
+//
+// ObjCARCOpt - ObjC ARC optimization.
+//
+Pass *createObjCARCOptPass();
+
+//===----------------------------------------------------------------------===//
+//
// InstructionSimplifier - Remove redundant instructions.
//
FunctionPass *createInstructionSimplifierPass();
extern char &InstructionSimplifierID;
+
+//===----------------------------------------------------------------------===//
+//
+// LowerExpectIntriniscs - Removes llvm.expect intrinsics and creates
+// "block_weights" metadata.
+FunctionPass *createLowerExpectIntrinsicPass();
+
+
} // End llvm namespace
#endif
diff --git a/contrib/llvm/include/llvm/Transforms/Utils/Cloning.h b/contrib/llvm/include/llvm/Transforms/Utils/Cloning.h
index 853de2d..674c2d0 100644
--- a/contrib/llvm/include/llvm/Transforms/Utils/Cloning.h
+++ b/contrib/llvm/include/llvm/Transforms/Utils/Cloning.h
@@ -107,12 +107,6 @@ BasicBlock *CloneBasicBlock(const BasicBlock *BB,
const Twine &NameSuffix = "", Function *F = 0,
ClonedCodeInfo *CodeInfo = 0);
-
-/// CloneLoop - Clone Loop. Clone dominator info for loop insiders. Populate
-/// VMap using old blocks to new blocks mapping.
-Loop *CloneLoop(Loop *L, LPPassManager *LPM, LoopInfo *LI,
- ValueToValueMapTy &VMap, Pass *P);
-
/// CloneFunction - Return a copy of the specified function, but without
/// embedding the function into another module. Also, any references specified
/// in the VMap are changed to refer to their mapped value instead of the
diff --git a/contrib/llvm/include/llvm/Transforms/Utils/SSAUpdater.h b/contrib/llvm/include/llvm/Transforms/Utils/SSAUpdater.h
index 51c8467..063d413 100644
--- a/contrib/llvm/include/llvm/Transforms/Utils/SSAUpdater.h
+++ b/contrib/llvm/include/llvm/Transforms/Utils/SSAUpdater.h
@@ -122,12 +122,9 @@ private:
class LoadAndStorePromoter {
protected:
SSAUpdater &SSA;
- DbgDeclareInst *DDI;
- DIBuilder *DIB;
public:
LoadAndStorePromoter(const SmallVectorImpl<Instruction*> &Insts,
- SSAUpdater &S, DbgDeclareInst *DDI, DIBuilder *DIB,
- StringRef Name = StringRef());
+ SSAUpdater &S, StringRef Name = StringRef());
virtual ~LoadAndStorePromoter() {}
/// run - This does the promotion. Insts is a list of loads and stores to
@@ -161,6 +158,10 @@ public:
virtual void instructionDeleted(Instruction *I) const {
}
+ /// updateDebugInfo - This is called to update debug info associated with the
+ /// instruction.
+ virtual void updateDebugInfo(Instruction *I) const {
+ }
};
} // End llvm namespace
diff --git a/contrib/llvm/include/llvm/Transforms/Utils/ValueMapper.h b/contrib/llvm/include/llvm/Transforms/Utils/ValueMapper.h
index d612213..2194373 100644
--- a/contrib/llvm/include/llvm/Transforms/Utils/ValueMapper.h
+++ b/contrib/llvm/include/llvm/Transforms/Utils/ValueMapper.h
@@ -22,6 +22,18 @@ namespace llvm {
class Instruction;
typedef ValueMap<const Value *, TrackingVH<Value> > ValueToValueMapTy;
+ /// ValueMapTypeRemapper - This is a class that can be implemented by clients
+ /// to remap types when cloning constants and instructions.
+ class ValueMapTypeRemapper {
+ virtual void Anchor(); // Out of line method.
+ public:
+ virtual ~ValueMapTypeRemapper() {}
+
+ /// remapType - The client should implement this method if they want to
+ /// remap types while mapping values.
+ virtual Type *remapType(Type *SrcTy) = 0;
+ };
+
/// RemapFlags - These are flags that the value mapping APIs allow.
enum RemapFlags {
RF_None = 0,
@@ -42,9 +54,27 @@ namespace llvm {
}
Value *MapValue(const Value *V, ValueToValueMapTy &VM,
- RemapFlags Flags = RF_None);
+ RemapFlags Flags = RF_None,
+ ValueMapTypeRemapper *TypeMapper = 0);
+
void RemapInstruction(Instruction *I, ValueToValueMapTy &VM,
- RemapFlags Flags = RF_None);
+ RemapFlags Flags = RF_None,
+ ValueMapTypeRemapper *TypeMapper = 0);
+
+ /// MapValue - provide versions that preserve type safety for MDNode and
+ /// Constants.
+ inline MDNode *MapValue(const MDNode *V, ValueToValueMapTy &VM,
+ RemapFlags Flags = RF_None,
+ ValueMapTypeRemapper *TypeMapper = 0) {
+ return (MDNode*)MapValue((const Value*)V, VM, Flags, TypeMapper);
+ }
+ inline Constant *MapValue(const Constant *V, ValueToValueMapTy &VM,
+ RemapFlags Flags = RF_None,
+ ValueMapTypeRemapper *TypeMapper = 0) {
+ return (Constant*)MapValue((const Value*)V, VM, Flags, TypeMapper);
+ }
+
+
} // End llvm namespace
#endif
diff --git a/contrib/llvm/include/llvm/Type.h b/contrib/llvm/include/llvm/Type.h
index 3bda91d..e4ff3e1 100644
--- a/contrib/llvm/include/llvm/Type.h
+++ b/contrib/llvm/include/llvm/Type.h
@@ -6,86 +6,64 @@
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
+//
+// This file contains the declaration of the Type class. For more "Type"
+// stuff, look in DerivedTypes.h.
+//
+//===----------------------------------------------------------------------===//
#ifndef LLVM_TYPE_H
#define LLVM_TYPE_H
-#include "llvm/AbstractTypeUser.h"
#include "llvm/Support/Casting.h"
-#include "llvm/ADT/GraphTraits.h"
-#include <string>
-#include <vector>
namespace llvm {
-class DerivedType;
class PointerType;
class IntegerType;
-class TypeMapBase;
class raw_ostream;
class Module;
class LLVMContext;
+class LLVMContextImpl;
+template<class GraphType> struct GraphTraits;
-/// This file contains the declaration of the Type class. For more "Type" type
-/// stuff, look in DerivedTypes.h.
-///
/// The instances of the Type class are immutable: once they are created,
/// they are never changed. Also note that only one instance of a particular
/// type is ever created. Thus seeing if two types are equal is a matter of
/// doing a trivial pointer comparison. To enforce that no two equal instances
/// are created, Type instances can only be created via static factory methods
-/// in class Type and in derived classes.
+/// in class Type and in derived classes. Once allocated, Types are never
+/// free'd.
///
-/// Once allocated, Types are never free'd, unless they are an abstract type
-/// that is resolved to a more concrete type.
-///
-/// Types themself don't have a name, and can be named either by:
-/// - using SymbolTable instance, typically from some Module,
-/// - using convenience methods in the Module class (which uses module's
-/// SymbolTable too).
-///
-/// Opaque types are simple derived types with no state. There may be many
-/// different Opaque type objects floating around, but two are only considered
-/// identical if they are pointer equals of each other. This allows us to have
-/// two opaque types that end up resolving to different concrete types later.
-///
-/// Opaque types are also kinda weird and scary and different because they have
-/// to keep a list of uses of the type. When, through linking, parsing, or
-/// bitcode reading, they become resolved, they need to find and update all
-/// users of the unknown type, causing them to reference a new, more concrete
-/// type. Opaque types are deleted when their use list dwindles to zero users.
-///
-/// @brief Root of type hierarchy
-class Type : public AbstractTypeUser {
+class Type {
public:
- //===-------------------------------------------------------------------===//
+ //===--------------------------------------------------------------------===//
/// Definitions of all of the base types for the Type system. Based on this
- /// value, you can cast to a "DerivedType" subclass (see DerivedTypes.h)
+ /// value, you can cast to a class defined in DerivedTypes.h.
/// Note: If you add an element to this, you need to add an element to the
/// Type::getPrimitiveType function, or else things will break!
/// Also update LLVMTypeKind and LLVMGetTypeKind () in the C binding.
///
enum TypeID {
- // PrimitiveTypes .. make sure LastPrimitiveTyID stays up to date
+ // PrimitiveTypes - make sure LastPrimitiveTyID stays up to date.
VoidTyID = 0, ///< 0: type with no size
- FloatTyID, ///< 1: 32 bit floating point type
- DoubleTyID, ///< 2: 64 bit floating point type
- X86_FP80TyID, ///< 3: 80 bit floating point type (X87)
- FP128TyID, ///< 4: 128 bit floating point type (112-bit mantissa)
- PPC_FP128TyID, ///< 5: 128 bit floating point type (two 64-bits)
+ FloatTyID, ///< 1: 32-bit floating point type
+ DoubleTyID, ///< 2: 64-bit floating point type
+ X86_FP80TyID, ///< 3: 80-bit floating point type (X87)
+ FP128TyID, ///< 4: 128-bit floating point type (112-bit mantissa)
+ PPC_FP128TyID, ///< 5: 128-bit floating point type (two 64-bits, PowerPC)
LabelTyID, ///< 6: Labels
MetadataTyID, ///< 7: Metadata
- X86_MMXTyID, ///< 8: MMX vectors (64 bits)
+ X86_MMXTyID, ///< 8: MMX vectors (64 bits, X86 specific)
- // Derived types... see DerivedTypes.h file...
- // Make sure FirstDerivedTyID stays up to date!!!
+ // Derived types... see DerivedTypes.h file.
+ // Make sure FirstDerivedTyID stays up to date!
IntegerTyID, ///< 9: Arbitrary bit width integers
FunctionTyID, ///< 10: Functions
StructTyID, ///< 11: Structures
ArrayTyID, ///< 12: Arrays
PointerTyID, ///< 13: Pointers
- OpaqueTyID, ///< 14: Opaque: type with unknown structure
- VectorTyID, ///< 15: SIMD 'packed' format, or other vector type
+ VectorTyID, ///< 14: SIMD 'packed' format, or other vector type
NumTypeIDs, // Must remain as last defined ID
LastPrimitiveTyID = X86_MMXTyID,
@@ -93,101 +71,52 @@ public:
};
private:
- TypeID ID : 8; // The current base type of this type.
- bool Abstract : 1; // True if type contains an OpaqueType
- unsigned SubclassData : 23; //Space for subclasses to store data
-
- /// RefCount - This counts the number of PATypeHolders that are pointing to
- /// this type. When this number falls to zero, if the type is abstract and
- /// has no AbstractTypeUsers, the type is deleted. This is only sensical for
- /// derived types.
- ///
- mutable unsigned RefCount;
-
/// Context - This refers to the LLVMContext in which this type was uniqued.
LLVMContext &Context;
- friend class LLVMContextImpl;
-
- const Type *getForwardedTypeInternal() const;
- // Some Type instances are allocated as arrays, some aren't. So we provide
- // this method to get the right kind of destruction for the type of Type.
- void destroy() const; // const is a lie, this does "delete this"!
+ TypeID ID : 8; // The current base type of this type.
+ unsigned SubclassData : 24; // Space for subclasses to store data
protected:
- explicit Type(LLVMContext &C, TypeID id) :
- ID(id), Abstract(false), SubclassData(0),
- RefCount(0), Context(C),
- ForwardType(0), NumContainedTys(0),
- ContainedTys(0) {}
- virtual ~Type() {
- assert(AbstractTypeUsers.empty() && "Abstract types remain");
- }
-
- /// Types can become nonabstract later, if they are refined.
- ///
- inline void setAbstract(bool Val) { Abstract = Val; }
-
- unsigned getRefCount() const { return RefCount; }
+ friend class LLVMContextImpl;
+ explicit Type(LLVMContext &C, TypeID tid)
+ : Context(C), ID(tid), SubclassData(0),
+ NumContainedTys(0), ContainedTys(0) {}
+ ~Type() {}
unsigned getSubclassData() const { return SubclassData; }
- void setSubclassData(unsigned val) { SubclassData = val; }
-
- /// ForwardType - This field is used to implement the union find scheme for
- /// abstract types. When types are refined to other types, this field is set
- /// to the more refined type. Only abstract types can be forwarded.
- mutable const Type *ForwardType;
-
-
- /// AbstractTypeUsers - Implement a list of the users that need to be notified
- /// if I am a type, and I get resolved into a more concrete type.
- ///
- mutable std::vector<AbstractTypeUser *> AbstractTypeUsers;
+ void setSubclassData(unsigned val) {
+ SubclassData = val;
+ // Ensure we don't have any accidental truncation.
+ assert(SubclassData == val && "Subclass data too large for field");
+ }
- /// NumContainedTys - Keeps track of how many PATypeHandle instances there
- /// are at the end of this type instance for the list of contained types. It
- /// is the subclasses responsibility to set this up. Set to 0 if there are no
- /// contained types in this type.
+ /// NumContainedTys - Keeps track of how many Type*'s there are in the
+ /// ContainedTys list.
unsigned NumContainedTys;
- /// ContainedTys - A pointer to the array of Types (PATypeHandle) contained
- /// by this Type. For example, this includes the arguments of a function
- /// type, the elements of a structure, the pointee of a pointer, the element
- /// type of an array, etc. This pointer may be 0 for types that don't
- /// contain other types (Integer, Double, Float). In general, the subclass
- /// should arrange for space for the PATypeHandles to be included in the
- /// allocation of the type object and set this pointer to the address of the
- /// first element. This allows the Type class to manipulate the ContainedTys
- /// without understanding the subclass's placement for this array. keeping
- /// it here also allows the subtype_* members to be implemented MUCH more
- /// efficiently, and dynamically very few types do not contain any elements.
- PATypeHandle *ContainedTys;
+ /// ContainedTys - A pointer to the array of Types contained by this Type.
+ /// For example, this includes the arguments of a function type, the elements
+ /// of a structure, the pointee of a pointer, the element type of an array,
+ /// etc. This pointer may be 0 for types that don't contain other types
+ /// (Integer, Double, Float).
+ Type * const *ContainedTys;
public:
void print(raw_ostream &O) const;
-
- /// @brief Debugging support: print to stderr
void dump() const;
- /// @brief Debugging support: print to stderr (use type names from context
- /// module).
- void dump(const Module *Context) const;
-
- /// getContext - Fetch the LLVMContext in which this type was uniqued.
+ /// getContext - Return the LLVMContext in which this type was uniqued.
LLVMContext &getContext() const { return Context; }
//===--------------------------------------------------------------------===//
- // Property accessors for dealing with types... Some of these virtual methods
- // are defined in private classes defined in Type.cpp for primitive types.
+ // Accessors for working with types.
//
- /// getDescription - Return the string representation of the type.
- std::string getDescription() const;
-
/// getTypeID - Return the type id for the type. This will return one
/// of the TypeID enum elements defined above.
///
- inline TypeID getTypeID() const { return ID; }
+ TypeID getTypeID() const { return ID; }
/// isVoidTy - Return true if this is 'void'.
bool isVoidTy() const { return ID == VoidTyID; }
@@ -209,8 +138,10 @@ public:
/// isFloatingPointTy - Return true if this is one of the five floating point
/// types
- bool isFloatingPointTy() const { return ID == FloatTyID || ID == DoubleTyID ||
- ID == X86_FP80TyID || ID == FP128TyID || ID == PPC_FP128TyID; }
+ bool isFloatingPointTy() const {
+ return ID == FloatTyID || ID == DoubleTyID ||
+ ID == X86_FP80TyID || ID == FP128TyID || ID == PPC_FP128TyID;
+ }
/// isX86_MMXTy - Return true if this is X86 MMX.
bool isX86_MMXTy() const { return ID == X86_MMXTyID; }
@@ -253,19 +184,10 @@ public:
///
bool isPointerTy() const { return ID == PointerTyID; }
- /// isOpaqueTy - True if this is an instance of OpaqueType.
- ///
- bool isOpaqueTy() const { return ID == OpaqueTyID; }
-
/// isVectorTy - True if this is an instance of VectorType.
///
bool isVectorTy() const { return ID == VectorTyID; }
- /// isAbstract - True if the type is either an Opaque type, or is a derived
- /// type that includes an opaque type somewhere in it.
- ///
- inline bool isAbstract() const { return Abstract; }
-
/// canLosslesslyBitCastTo - Return true if this type could be converted
/// with a lossless BitCast to type 'Ty'. For example, i8* to i32*. BitCasts
/// are valid for types of the same size only where no re-interpretation of
@@ -280,24 +202,22 @@ public:
/// Here are some useful little methods to query what type derived types are
/// Note that all other types can just compare to see if this == Type::xxxTy;
///
- inline bool isPrimitiveType() const { return ID <= LastPrimitiveTyID; }
- inline bool isDerivedType() const { return ID >= FirstDerivedTyID; }
+ bool isPrimitiveType() const { return ID <= LastPrimitiveTyID; }
+ bool isDerivedType() const { return ID >= FirstDerivedTyID; }
/// isFirstClassType - Return true if the type is "first class", meaning it
/// is a valid type for a Value.
///
- inline bool isFirstClassType() const {
- // There are more first-class kinds than non-first-class kinds, so a
- // negative test is simpler than a positive one.
- return ID != FunctionTyID && ID != VoidTyID && ID != OpaqueTyID;
+ bool isFirstClassType() const {
+ return ID != FunctionTyID && ID != VoidTyID;
}
/// isSingleValueType - Return true if the type is a valid type for a
- /// virtual register in codegen. This includes all first-class types
- /// except struct and array types.
+ /// register in codegen. This includes all first-class types except struct
+ /// and array types.
///
- inline bool isSingleValueType() const {
- return (ID != VoidTyID && ID <= LastPrimitiveTyID) ||
+ bool isSingleValueType() const {
+ return (ID != VoidTyID && isPrimitiveType()) ||
ID == IntegerTyID || ID == PointerTyID || ID == VectorTyID;
}
@@ -306,7 +226,7 @@ public:
/// extractvalue instruction. This includes struct and array types, but
/// does not include vector types.
///
- inline bool isAggregateType() const {
+ bool isAggregateType() const {
return ID == StructTyID || ID == ArrayTyID;
}
@@ -323,9 +243,8 @@ public:
// it doesn't have a size.
if (ID != StructTyID && ID != ArrayTyID && ID != VectorTyID)
return false;
- // If it is something that can have a size and it's concrete, it definitely
- // has a size, otherwise we have to try harder to decide.
- return !isAbstract() || isSizedDerivedType();
+ // Otherwise we have to try harder to decide.
+ return isSizedDerivedType();
}
/// getPrimitiveSizeInBits - Return the basic size of this type if it is a
@@ -350,28 +269,14 @@ public:
/// have a stable mantissa (e.g. ppc long double), this method returns -1.
int getFPMantissaWidth() const;
- /// getForwardedType - Return the type that this type has been resolved to if
- /// it has been resolved to anything. This is used to implement the
- /// union-find algorithm for type resolution, and shouldn't be used by general
- /// purpose clients.
- const Type *getForwardedType() const {
- if (!ForwardType) return 0;
- return getForwardedTypeInternal();
- }
-
- /// getVAArgsPromotedType - Return the type an argument of this type
- /// will be promoted to if passed through a variable argument
- /// function.
- const Type *getVAArgsPromotedType(LLVMContext &C) const;
-
/// getScalarType - If this is a vector type, return the element type,
- /// otherwise return this.
+ /// otherwise return 'this'.
const Type *getScalarType() const;
//===--------------------------------------------------------------------===//
- // Type Iteration support
+ // Type Iteration support.
//
- typedef PATypeHandle *subtype_iterator;
+ typedef Type * const *subtype_iterator;
subtype_iterator subtype_begin() const { return ContainedTys; }
subtype_iterator subtype_end() const { return &ContainedTys[NumContainedTys];}
@@ -379,9 +284,9 @@ public:
/// (defined a the end of the file). For derived types, this returns the
/// types 'contained' in the derived type.
///
- const Type *getContainedType(unsigned i) const {
+ Type *getContainedType(unsigned i) const {
assert(i < NumContainedTys && "Index out of range!");
- return ContainedTys[i].get();
+ return ContainedTys[i];
}
/// getNumContainedTypes - Return the number of types in the derived type.
@@ -394,139 +299,76 @@ public:
//
/// getPrimitiveType - Return a type based on an identifier.
- static const Type *getPrimitiveType(LLVMContext &C, TypeID IDNumber);
+ static Type *getPrimitiveType(LLVMContext &C, TypeID IDNumber);
//===--------------------------------------------------------------------===//
- // These are the builtin types that are always available...
+ // These are the builtin types that are always available.
//
- static const Type *getVoidTy(LLVMContext &C);
- static const Type *getLabelTy(LLVMContext &C);
- static const Type *getFloatTy(LLVMContext &C);
- static const Type *getDoubleTy(LLVMContext &C);
- static const Type *getMetadataTy(LLVMContext &C);
- static const Type *getX86_FP80Ty(LLVMContext &C);
- static const Type *getFP128Ty(LLVMContext &C);
- static const Type *getPPC_FP128Ty(LLVMContext &C);
- static const Type *getX86_MMXTy(LLVMContext &C);
- static const IntegerType *getIntNTy(LLVMContext &C, unsigned N);
- static const IntegerType *getInt1Ty(LLVMContext &C);
- static const IntegerType *getInt8Ty(LLVMContext &C);
- static const IntegerType *getInt16Ty(LLVMContext &C);
- static const IntegerType *getInt32Ty(LLVMContext &C);
- static const IntegerType *getInt64Ty(LLVMContext &C);
+ static Type *getVoidTy(LLVMContext &C);
+ static Type *getLabelTy(LLVMContext &C);
+ static Type *getFloatTy(LLVMContext &C);
+ static Type *getDoubleTy(LLVMContext &C);
+ static Type *getMetadataTy(LLVMContext &C);
+ static Type *getX86_FP80Ty(LLVMContext &C);
+ static Type *getFP128Ty(LLVMContext &C);
+ static Type *getPPC_FP128Ty(LLVMContext &C);
+ static Type *getX86_MMXTy(LLVMContext &C);
+ static IntegerType *getIntNTy(LLVMContext &C, unsigned N);
+ static IntegerType *getInt1Ty(LLVMContext &C);
+ static IntegerType *getInt8Ty(LLVMContext &C);
+ static IntegerType *getInt16Ty(LLVMContext &C);
+ static IntegerType *getInt32Ty(LLVMContext &C);
+ static IntegerType *getInt64Ty(LLVMContext &C);
//===--------------------------------------------------------------------===//
// Convenience methods for getting pointer types with one of the above builtin
// types as pointee.
//
- static const PointerType *getFloatPtrTy(LLVMContext &C, unsigned AS = 0);
- static const PointerType *getDoublePtrTy(LLVMContext &C, unsigned AS = 0);
- static const PointerType *getX86_FP80PtrTy(LLVMContext &C, unsigned AS = 0);
- static const PointerType *getFP128PtrTy(LLVMContext &C, unsigned AS = 0);
- static const PointerType *getPPC_FP128PtrTy(LLVMContext &C, unsigned AS = 0);
- static const PointerType *getX86_MMXPtrTy(LLVMContext &C, unsigned AS = 0);
- static const PointerType *getIntNPtrTy(LLVMContext &C, unsigned N,
- unsigned AS = 0);
- static const PointerType *getInt1PtrTy(LLVMContext &C, unsigned AS = 0);
- static const PointerType *getInt8PtrTy(LLVMContext &C, unsigned AS = 0);
- static const PointerType *getInt16PtrTy(LLVMContext &C, unsigned AS = 0);
- static const PointerType *getInt32PtrTy(LLVMContext &C, unsigned AS = 0);
- static const PointerType *getInt64PtrTy(LLVMContext &C, unsigned AS = 0);
+ static PointerType *getFloatPtrTy(LLVMContext &C, unsigned AS = 0);
+ static PointerType *getDoublePtrTy(LLVMContext &C, unsigned AS = 0);
+ static PointerType *getX86_FP80PtrTy(LLVMContext &C, unsigned AS = 0);
+ static PointerType *getFP128PtrTy(LLVMContext &C, unsigned AS = 0);
+ static PointerType *getPPC_FP128PtrTy(LLVMContext &C, unsigned AS = 0);
+ static PointerType *getX86_MMXPtrTy(LLVMContext &C, unsigned AS = 0);
+ static PointerType *getIntNPtrTy(LLVMContext &C, unsigned N, unsigned AS = 0);
+ static PointerType *getInt1PtrTy(LLVMContext &C, unsigned AS = 0);
+ static PointerType *getInt8PtrTy(LLVMContext &C, unsigned AS = 0);
+ static PointerType *getInt16PtrTy(LLVMContext &C, unsigned AS = 0);
+ static PointerType *getInt32PtrTy(LLVMContext &C, unsigned AS = 0);
+ static PointerType *getInt64PtrTy(LLVMContext &C, unsigned AS = 0);
/// Methods for support type inquiry through isa, cast, and dyn_cast:
static inline bool classof(const Type *) { return true; }
- void addRef() const {
- assert(isAbstract() && "Cannot add a reference to a non-abstract type!");
- ++RefCount;
- }
-
- void dropRef() const {
- assert(isAbstract() && "Cannot drop a reference to a non-abstract type!");
- assert(RefCount && "No objects are currently referencing this object!");
-
- // If this is the last PATypeHolder using this object, and there are no
- // PATypeHandles using it, the type is dead, delete it now.
- if (--RefCount == 0 && AbstractTypeUsers.empty())
- this->destroy();
- }
-
- /// addAbstractTypeUser - Notify an abstract type that there is a new user of
- /// it. This function is called primarily by the PATypeHandle class.
- ///
- void addAbstractTypeUser(AbstractTypeUser *U) const;
-
- /// removeAbstractTypeUser - Notify an abstract type that a user of the class
- /// no longer has a handle to the type. This function is called primarily by
- /// the PATypeHandle class. When there are no users of the abstract type, it
- /// is annihilated, because there is no way to get a reference to it ever
- /// again.
- ///
- void removeAbstractTypeUser(AbstractTypeUser *U) const;
-
/// getPointerTo - Return a pointer to the current type. This is equivalent
/// to PointerType::get(Foo, AddrSpace).
- const PointerType *getPointerTo(unsigned AddrSpace = 0) const;
+ PointerType *getPointerTo(unsigned AddrSpace = 0) const;
private:
/// isSizedDerivedType - Derived types like structures and arrays are sized
/// iff all of the members of the type are sized as well. Since asking for
/// their size is relatively uncommon, move this operation out of line.
bool isSizedDerivedType() const;
-
- virtual void refineAbstractType(const DerivedType *OldTy, const Type *NewTy);
- virtual void typeBecameConcrete(const DerivedType *AbsTy);
-
-protected:
- // PromoteAbstractToConcrete - This is an internal method used to calculate
- // change "Abstract" from true to false when types are refined.
- void PromoteAbstractToConcrete();
- friend class TypeMapBase;
};
-//===----------------------------------------------------------------------===//
-// Define some inline methods for the AbstractTypeUser.h:PATypeHandle class.
-// These are defined here because they MUST be inlined, yet are dependent on
-// the definition of the Type class.
-//
-inline void PATypeHandle::addUser() {
- assert(Ty && "Type Handle has a null type!");
- if (Ty->isAbstract())
- Ty->addAbstractTypeUser(User);
-}
-inline void PATypeHandle::removeUser() {
- if (Ty->isAbstract())
- Ty->removeAbstractTypeUser(User);
-}
-
-// Define inline methods for PATypeHolder.
-
-/// get - This implements the forwarding part of the union-find algorithm for
-/// abstract types. Before every access to the Type*, we check to see if the
-/// type we are pointing to is forwarding to a new type. If so, we drop our
-/// reference to the type.
-///
-inline Type* PATypeHolder::get() const {
- if (Ty == 0) return 0;
- const Type *NewTy = Ty->getForwardedType();
- if (!NewTy) return const_cast<Type*>(Ty);
- return *const_cast<PATypeHolder*>(this) = NewTy;
-}
-
-inline void PATypeHolder::addRef() {
- if (Ty && Ty->isAbstract())
- Ty->addRef();
-}
-
-inline void PATypeHolder::dropRef() {
- if (Ty && Ty->isAbstract())
- Ty->dropRef();
+// Printing of types.
+static inline raw_ostream &operator<<(raw_ostream &OS, const Type &T) {
+ T.print(OS);
+ return OS;
}
+// allow isa<PointerType>(x) to work without DerivedTypes.h included.
+template <> struct isa_impl<PointerType, Type> {
+ static inline bool doit(const Type &Ty) {
+ return Ty.getTypeID() == Type::PointerTyID;
+ }
+};
+
//===----------------------------------------------------------------------===//
// Provide specializations of GraphTraits to be able to treat a type as a
-// graph of sub types...
+// graph of sub types.
+
template <> struct GraphTraits<Type*> {
typedef Type NodeType;
@@ -554,14 +396,6 @@ template <> struct GraphTraits<const Type*> {
}
};
-template <> struct isa_impl<PointerType, Type> {
- static inline bool doit(const Type &Ty) {
- return Ty.getTypeID() == Type::PointerTyID;
- }
-};
-
-raw_ostream &operator<<(raw_ostream &OS, const Type &T);
-
} // End llvm namespace
#endif
diff --git a/contrib/llvm/include/llvm/TypeSymbolTable.h b/contrib/llvm/include/llvm/TypeSymbolTable.h
deleted file mode 100644
index 89ad534..0000000
--- a/contrib/llvm/include/llvm/TypeSymbolTable.h
+++ /dev/null
@@ -1,152 +0,0 @@
-//===-- llvm/TypeSymbolTable.h - Implement a Type Symtab --------*- C++ -*-===//
-//
-// The LLVM Compiler Infrastructure
-//
-// This file is distributed under the University of Illinois Open Source
-// License. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-//
-// This file implements the name/type symbol table for LLVM.
-//
-//===----------------------------------------------------------------------===//
-
-#ifndef LLVM_TYPE_SYMBOL_TABLE_H
-#define LLVM_TYPE_SYMBOL_TABLE_H
-
-#include "llvm/Type.h"
-#include "llvm/ADT/StringRef.h"
-#include "llvm/Support/DataTypes.h"
-#include <map>
-
-namespace llvm {
-
-/// This class provides a symbol table of name/type pairs with operations to
-/// support constructing, searching and iterating over the symbol table. The
-/// class derives from AbstractTypeUser so that the contents of the symbol
-/// table can be updated when abstract types become concrete.
-class TypeSymbolTable : public AbstractTypeUser {
-
-/// @name Types
-/// @{
-public:
-
- /// @brief A mapping of names to types.
- typedef std::map<const std::string, const Type*> TypeMap;
-
- /// @brief An iterator over the TypeMap.
- typedef TypeMap::iterator iterator;
-
- /// @brief A const_iterator over the TypeMap.
- typedef TypeMap::const_iterator const_iterator;
-
-/// @}
-/// @name Constructors
-/// @{
-public:
-
- TypeSymbolTable():LastUnique(0) {}
- ~TypeSymbolTable();
-
-/// @}
-/// @name Accessors
-/// @{
-public:
-
- /// Generates a unique name for a type based on the \p BaseName by
- /// incrementing an integer and appending it to the name, if necessary
- /// @returns the unique name
- /// @brief Get a unique name for a type
- std::string getUniqueName(StringRef BaseName) const;
-
- /// This method finds the type with the given \p name in the type map
- /// and returns it.
- /// @returns null if the name is not found, otherwise the Type
- /// associated with the \p name.
- /// @brief Lookup a type by name.
- Type *lookup(StringRef name) const;
-
- /// Lookup the type associated with name.
- /// @returns end() if the name is not found, or an iterator at the entry for
- /// Type.
- iterator find(StringRef Name) {
- return tmap.find(Name);
- }
-
- /// Lookup the type associated with name.
- /// @returns end() if the name is not found, or an iterator at the entry for
- /// Type.
- const_iterator find(StringRef Name) const {
- return tmap.find(Name);
- }
-
- /// @returns true iff the symbol table is empty.
- /// @brief Determine if the symbol table is empty
- inline bool empty() const { return tmap.empty(); }
-
- /// @returns the size of the symbol table
- /// @brief The number of name/type pairs is returned.
- inline unsigned size() const { return unsigned(tmap.size()); }
-
- /// This function can be used from the debugger to display the
- /// content of the symbol table while debugging.
- /// @brief Print out symbol table on stderr
- void dump() const;
-
-/// @}
-/// @name Iteration
-/// @{
-public:
- /// Get an iterator to the start of the symbol table
- inline iterator begin() { return tmap.begin(); }
-
- /// @brief Get a const_iterator to the start of the symbol table
- inline const_iterator begin() const { return tmap.begin(); }
-
- /// Get an iterator to the end of the symbol table.
- inline iterator end() { return tmap.end(); }
-
- /// Get a const_iterator to the end of the symbol table.
- inline const_iterator end() const { return tmap.end(); }
-
-/// @}
-/// @name Mutators
-/// @{
-public:
-
- /// Inserts a type into the symbol table with the specified name. There can be
- /// a many-to-one mapping between names and types. This method allows a type
- /// with an existing entry in the symbol table to get a new name.
- /// @brief Insert a type under a new name.
- void insert(StringRef Name, const Type *Typ);
-
- /// Remove a type at the specified position in the symbol table.
- /// @returns the removed Type.
- /// @returns the Type that was erased from the symbol table.
- Type* remove(iterator TI);
-
-/// @}
-/// @name AbstractTypeUser Methods
-/// @{
-private:
- /// This function is called when one of the types in the type plane
- /// is refined.
- virtual void refineAbstractType(const DerivedType *OldTy, const Type *NewTy);
-
- /// This function marks a type as being concrete (defined).
- virtual void typeBecameConcrete(const DerivedType *AbsTy);
-
-/// @}
-/// @name Internal Data
-/// @{
-private:
- TypeMap tmap; ///< This is the mapping of names to types.
- mutable uint32_t LastUnique; ///< Counter for tracking unique names
-
-/// @}
-
-};
-
-} // End llvm namespace
-
-#endif
diff --git a/contrib/llvm/include/llvm/Use.h b/contrib/llvm/include/llvm/Use.h
index ccbdd7f..a496325 100644
--- a/contrib/llvm/include/llvm/Use.h
+++ b/contrib/llvm/include/llvm/Use.h
@@ -60,6 +60,10 @@ public:
/// that also works with less standard-compliant compilers
void swap(Use &RHS);
+ // A type for the word following an array of hung-off Uses in memory, which is
+ // a pointer back to their User with the bottom bit set.
+ typedef PointerIntPair<User*, 1, unsigned> UserRef;
+
private:
/// Copy ctor - do not implement
Use(const Use &U);
@@ -108,13 +112,16 @@ public:
Use *getNext() const { return Next; }
+ /// initTags - initialize the waymarking tags on an array of Uses, so that
+ /// getUser() can find the User from any of those Uses.
+ static Use *initTags(Use *Start, Use *Stop);
+
/// zap - This is used to destroy Use operands when the number of operands of
/// a User changes.
static void zap(Use *Start, const Use *Stop, bool del = false);
private:
const Use* getImpliedUser() const;
- static Use *initTags(Use *Start, Use *Stop);
Value *Val;
Use *Next;
@@ -136,7 +143,6 @@ private:
}
friend class Value;
- friend class User;
};
// simplify_type - Allow clients to treat uses just like values when using
@@ -208,15 +214,6 @@ public:
unsigned getOperandNo() const;
};
-//===----------------------------------------------------------------------===//
-// AugmentedUse layout struct
-//===----------------------------------------------------------------------===//
-
-struct AugmentedUse : public Use {
- PointerIntPair<User*, 1, unsigned> ref;
- AugmentedUse(); // not implemented
-};
-
} // End llvm namespace
#endif
diff --git a/contrib/llvm/include/llvm/Value.h b/contrib/llvm/include/llvm/Value.h
index 3a1c3ca..08fa1c9 100644
--- a/contrib/llvm/include/llvm/Value.h
+++ b/contrib/llvm/include/llvm/Value.h
@@ -14,7 +14,6 @@
#ifndef LLVM_VALUE_H
#define LLVM_VALUE_H
-#include "llvm/AbstractTypeUser.h"
#include "llvm/Use.h"
#include "llvm/ADT/StringRef.h"
#include "llvm/Support/Casting.h"
@@ -32,7 +31,6 @@ class GlobalVariable;
class GlobalAlias;
class InlineAsm;
class ValueSymbolTable;
-class TypeSymbolTable;
template<typename ValueTy> class StringMapEntry;
template <typename ValueTy = Value>
class AssertingVH;
@@ -43,6 +41,7 @@ class ValueHandleBase;
class LLVMContext;
class Twine;
class MDNode;
+class Type;
//===----------------------------------------------------------------------===//
// Value Class
@@ -77,12 +76,11 @@ private:
/// This field is initialized to zero by the ctor.
unsigned short SubclassData;
- PATypeHolder VTy;
+ Type *VTy;
Use *UseList;
friend class ValueSymbolTable; // Allow ValueSymbolTable to directly mod Name.
friend class ValueHandleBase;
- friend class AbstractTypeUser;
ValueName *Name;
void operator=(const Value &); // Do not implement
@@ -107,13 +105,13 @@ public:
/// All values are typed, get the type of this value.
///
- inline const Type *getType() const { return VTy; }
+ Type *getType() const { return VTy; }
/// All values hold a context through their type.
LLVMContext &getContext() const;
// All values can potentially be named...
- inline bool hasName() const { return Name != 0; }
+ bool hasName() const { return Name != 0; }
ValueName *getValueName() const { return Name; }
/// getName() - Return a constant reference to the value's name. This is cheap
@@ -149,10 +147,6 @@ public:
///
void replaceAllUsesWith(Value *V);
- // uncheckedReplaceAllUsesWith - Just like replaceAllUsesWith but dangerous.
- // Only use when in type resolution situations!
- void uncheckedReplaceAllUsesWith(Value *V);
-
//----------------------------------------------------------------------
// Methods for handling the chain of uses of this Value.
//
@@ -279,10 +273,6 @@ public:
return true; // Values are always values.
}
- /// getRawType - This should only be used to implement the vmcore library.
- ///
- const Type *getRawType() const { return VTy.getRawType(); }
-
/// stripPointerCasts - This method strips off any unneeded pointer
/// casts from the specified value, returning the original uncasted value.
/// Note that the returned value has pointer type if the specified value does.
@@ -310,6 +300,15 @@ public:
/// load, store, and alloca instructions, and global values.
static const unsigned MaximumAlignment = 1u << 29;
+ /// mutateType - Mutate the type of this Value to be of the specified type.
+ /// Note that this is an extremely dangerous operation which can create
+ /// completely invalid IR very easily. It is strongly recommended that you
+ /// recreate IR objects with the right types instead of mutating them in
+ /// place.
+ void mutateType(Type *Ty) {
+ VTy = Ty;
+ }
+
protected:
unsigned short getSubclassDataFromValue() const { return SubclassData; }
void setValueSubclassData(unsigned short D) { SubclassData = D; }
diff --git a/contrib/llvm/lib/Analysis/Analysis.cpp b/contrib/llvm/lib/Analysis/Analysis.cpp
index e57ba78..71e0a83 100644
--- a/contrib/llvm/lib/Analysis/Analysis.cpp
+++ b/contrib/llvm/lib/Analysis/Analysis.cpp
@@ -23,6 +23,7 @@ void llvm::initializeAnalysis(PassRegistry &Registry) {
initializeAliasSetPrinterPass(Registry);
initializeNoAAPass(Registry);
initializeBasicAliasAnalysisPass(Registry);
+ initializeBlockFrequencyPass(Registry);
initializeBranchProbabilityInfoPass(Registry);
initializeCFGViewerPass(Registry);
initializeCFGPrinterPass(Registry);
diff --git a/contrib/llvm/lib/Analysis/BlockFrequency.cpp b/contrib/llvm/lib/Analysis/BlockFrequency.cpp
new file mode 100644
index 0000000..4b86d1d
--- /dev/null
+++ b/contrib/llvm/lib/Analysis/BlockFrequency.cpp
@@ -0,0 +1,59 @@
+//=======-------- BlockFrequency.cpp - Block Frequency Analysis -------=======//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+//
+// Loops should be simplified before this analysis.
+//
+//===----------------------------------------------------------------------===//
+
+#include "llvm/InitializePasses.h"
+#include "llvm/Analysis/BlockFrequencyImpl.h"
+#include "llvm/Analysis/BlockFrequency.h"
+#include "llvm/Analysis/LoopInfo.h"
+#include "llvm/Analysis/Passes.h"
+#include "llvm/Analysis/BranchProbabilityInfo.h"
+
+using namespace llvm;
+
+INITIALIZE_PASS_BEGIN(BlockFrequency, "block-freq", "Block Frequency Analysis",
+ true, true)
+INITIALIZE_PASS_DEPENDENCY(BranchProbabilityInfo)
+INITIALIZE_PASS_END(BlockFrequency, "block-freq", "Block Frequency Analysis",
+ true, true)
+
+char BlockFrequency::ID = 0;
+
+
+BlockFrequency::BlockFrequency() : FunctionPass(ID) {
+ initializeBlockFrequencyPass(*PassRegistry::getPassRegistry());
+ BFI = new BlockFrequencyImpl<BasicBlock, Function, BranchProbabilityInfo>();
+}
+
+BlockFrequency::~BlockFrequency() {
+ delete BFI;
+}
+
+void BlockFrequency::getAnalysisUsage(AnalysisUsage &AU) const {
+ AU.addRequired<BranchProbabilityInfo>();
+ AU.setPreservesAll();
+}
+
+bool BlockFrequency::runOnFunction(Function &F) {
+ BranchProbabilityInfo &BPI = getAnalysis<BranchProbabilityInfo>();
+ BFI->doFunction(&F, &BPI);
+ return false;
+}
+
+/// getblockFreq - Return block frequency. Never return 0, value must be
+/// positive. Please note that initial frequency is equal to 1024. It means that
+/// we should not rely on the value itself, but only on the comparison to the
+/// other block frequencies. We do this to avoid using of floating points.
+///
+uint32_t BlockFrequency::getBlockFreq(BasicBlock *BB) {
+ return BFI->getBlockFreq(BB);
+}
diff --git a/contrib/llvm/lib/Analysis/BranchProbabilityInfo.cpp b/contrib/llvm/lib/Analysis/BranchProbabilityInfo.cpp
index 812fac0..e39cd22 100644
--- a/contrib/llvm/lib/Analysis/BranchProbabilityInfo.cpp
+++ b/contrib/llvm/lib/Analysis/BranchProbabilityInfo.cpp
@@ -13,6 +13,7 @@
#include "llvm/Instructions.h"
#include "llvm/Analysis/BranchProbabilityInfo.h"
+#include "llvm/Analysis/LoopInfo.h"
#include "llvm/Support/Debug.h"
using namespace llvm;
@@ -25,7 +26,7 @@ INITIALIZE_PASS_END(BranchProbabilityInfo, "branch-prob",
char BranchProbabilityInfo::ID = 0;
-
+namespace {
// Please note that BranchProbabilityAnalysis is not a FunctionPass.
// It is created by BranchProbabilityInfo (which is a FunctionPass), which
// provides a clear interface. Thanks to that, all heuristics and other
@@ -143,6 +144,7 @@ public:
bool runOnFunction(Function &F);
};
+} // end anonymous namespace
// Calculate Edge Weights using "Return Heuristics". Predict a successor which
// leads directly to Return Instruction will not be taken.
@@ -167,7 +169,7 @@ void BranchProbabilityAnalysis::calcPointerHeuristics(BasicBlock *BB) {
Value *Cond = BI->getCondition();
ICmpInst *CI = dyn_cast<ICmpInst>(Cond);
- if (!CI)
+ if (!CI || !CI->isEquality())
return;
Value *LHS = CI->getOperand(0);
@@ -184,7 +186,7 @@ void BranchProbabilityAnalysis::calcPointerHeuristics(BasicBlock *BB) {
// p == 0 -> isProb = false
// p != q -> isProb = true
// p == q -> isProb = false;
- bool isProb = !CI->isEquality();
+ bool isProb = CI->getPredicate() == ICmpInst::ICMP_NE;
if (!isProb)
std::swap(Taken, NonTaken);
@@ -256,6 +258,10 @@ bool BranchProbabilityAnalysis::runOnFunction(Function &F) {
return false;
}
+void BranchProbabilityInfo::getAnalysisUsage(AnalysisUsage &AU) const {
+ AU.addRequired<LoopInfo>();
+ AU.setPreservesAll();
+}
bool BranchProbabilityInfo::runOnFunction(Function &F) {
LoopInfo &LI = getAnalysis<LoopInfo>();
@@ -347,8 +353,8 @@ getEdgeProbability(BasicBlock *Src, BasicBlock *Dst) const {
raw_ostream &
BranchProbabilityInfo::printEdgeProbability(raw_ostream &OS, BasicBlock *Src,
BasicBlock *Dst) const {
- BranchProbability Prob = getEdgeProbability(Src, Dst);
+ const BranchProbability Prob = getEdgeProbability(Src, Dst);
OS << "edge " << Src->getNameStr() << " -> " << Dst->getNameStr()
<< " probability is " << Prob
<< (isEdgeHot(Src, Dst) ? " [HOT edge]\n" : "\n");
diff --git a/contrib/llvm/lib/Analysis/ConstantFolding.cpp b/contrib/llvm/lib/Analysis/ConstantFolding.cpp
index 08a6065..7fca17e 100644
--- a/contrib/llvm/lib/Analysis/ConstantFolding.cpp
+++ b/contrib/llvm/lib/Analysis/ConstantFolding.cpp
@@ -771,12 +771,12 @@ Constant *llvm::ConstantFoldInstruction(Instruction *I, const TargetData *TD) {
return ConstantExpr::getInsertValue(
cast<Constant>(IVI->getAggregateOperand()),
cast<Constant>(IVI->getInsertedValueOperand()),
- IVI->idx_begin(), IVI->getNumIndices());
+ IVI->getIndices());
if (ExtractValueInst *EVI = dyn_cast<ExtractValueInst>(I))
return ConstantExpr::getExtractValue(
cast<Constant>(EVI->getAggregateOperand()),
- EVI->idx_begin(), EVI->getNumIndices());
+ EVI->getIndices());
return ConstantFoldInstOperands(I->getOpcode(), I->getType(),
Ops.data(), Ops.size(), TD);
@@ -1399,7 +1399,7 @@ llvm::ConstantFoldCall(Function *F,
ConstantInt::get(F->getContext(), Res),
ConstantInt::get(Type::getInt1Ty(F->getContext()), Overflow)
};
- return ConstantStruct::get(F->getContext(), Ops, 2, false);
+ return ConstantStruct::get(cast<StructType>(F->getReturnType()), Ops);
}
}
}
diff --git a/contrib/llvm/lib/Analysis/DIBuilder.cpp b/contrib/llvm/lib/Analysis/DIBuilder.cpp
index ef5d03a..ac5eeeb 100644
--- a/contrib/llvm/lib/Analysis/DIBuilder.cpp
+++ b/contrib/llvm/lib/Analysis/DIBuilder.cpp
@@ -219,7 +219,7 @@ DIType DIBuilder::createInheritance(DIType Ty, DIType BaseTy,
}
/// createMemberType - Create debugging information entry for a member.
-DIType DIBuilder::createMemberType(StringRef Name,
+DIType DIBuilder::createMemberType(DIDescriptor Scope, StringRef Name,
DIFile File, unsigned LineNumber,
uint64_t SizeInBits, uint64_t AlignInBits,
uint64_t OffsetInBits, unsigned Flags,
@@ -227,7 +227,7 @@ DIType DIBuilder::createMemberType(StringRef Name,
// TAG_member is encoded in DIDerivedType format.
Value *Elts[] = {
GetTagConstant(VMContext, dwarf::DW_TAG_member),
- File, // Or TheCU ? Ty ?
+ Scope,
MDString::get(VMContext, Name),
File,
ConstantInt::get(Type::getInt32Ty(VMContext), LineNumber),
@@ -786,7 +786,7 @@ Instruction *DIBuilder::insertDeclare(Value *Storage, DIVariable VarInfo,
DeclareFn = Intrinsic::getDeclaration(&M, Intrinsic::dbg_declare);
Value *Args[] = { MDNode::get(Storage->getContext(), Storage), VarInfo };
- return CallInst::Create(DeclareFn, Args, Args+2, "", InsertBefore);
+ return CallInst::Create(DeclareFn, Args, "", InsertBefore);
}
/// insertDeclare - Insert a new llvm.dbg.declare intrinsic call.
@@ -802,9 +802,9 @@ Instruction *DIBuilder::insertDeclare(Value *Storage, DIVariable VarInfo,
// If this block already has a terminator then insert this intrinsic
// before the terminator.
if (TerminatorInst *T = InsertAtEnd->getTerminator())
- return CallInst::Create(DeclareFn, Args, Args+2, "", T);
+ return CallInst::Create(DeclareFn, Args, "", T);
else
- return CallInst::Create(DeclareFn, Args, Args+2, "", InsertAtEnd);
+ return CallInst::Create(DeclareFn, Args, "", InsertAtEnd);
}
/// insertDbgValueIntrinsic - Insert a new llvm.dbg.value intrinsic call.
@@ -819,7 +819,7 @@ Instruction *DIBuilder::insertDbgValueIntrinsic(Value *V, uint64_t Offset,
Value *Args[] = { MDNode::get(V->getContext(), V),
ConstantInt::get(Type::getInt64Ty(V->getContext()), Offset),
VarInfo };
- return CallInst::Create(ValueFn, Args, Args+3, "", InsertBefore);
+ return CallInst::Create(ValueFn, Args, "", InsertBefore);
}
/// insertDbgValueIntrinsic - Insert a new llvm.dbg.value intrinsic call.
@@ -834,6 +834,6 @@ Instruction *DIBuilder::insertDbgValueIntrinsic(Value *V, uint64_t Offset,
Value *Args[] = { MDNode::get(V->getContext(), V),
ConstantInt::get(Type::getInt64Ty(V->getContext()), Offset),
VarInfo };
- return CallInst::Create(ValueFn, Args, Args+3, "", InsertAtEnd);
+ return CallInst::Create(ValueFn, Args, "", InsertAtEnd);
}
diff --git a/contrib/llvm/lib/Analysis/DebugInfo.cpp b/contrib/llvm/lib/Analysis/DebugInfo.cpp
index 67f8147..b42e946 100644
--- a/contrib/llvm/lib/Analysis/DebugInfo.cpp
+++ b/contrib/llvm/lib/Analysis/DebugInfo.cpp
@@ -727,37 +727,37 @@ void DIVariable::dump() const {
/// fixupObjcLikeName - Replace contains special characters used
/// in a typical Objective-C names with '.' in a given string.
-static void fixupObjcLikeName(std::string &Str) {
+static void fixupObjcLikeName(StringRef Str, SmallVectorImpl<char> &Out) {
+ bool isObjCLike = false;
for (size_t i = 0, e = Str.size(); i < e; ++i) {
char C = Str[i];
- if (C == '[' || C == ']' || C == ' ' || C == ':' || C == '+' ||
- C == '(' || C == ')')
- Str[i] = '.';
+ if (C == '[')
+ isObjCLike = true;
+
+ if (isObjCLike && (C == '[' || C == ']' || C == ' ' || C == ':' ||
+ C == '+' || C == '(' || C == ')'))
+ Out.push_back('.');
+ else
+ Out.push_back(C);
}
}
/// getFnSpecificMDNode - Return a NameMDNode, if available, that is
/// suitable to hold function specific information.
NamedMDNode *llvm::getFnSpecificMDNode(const Module &M, StringRef FuncName) {
- if (FuncName.find('[') == StringRef::npos)
- return M.getNamedMetadata(Twine("llvm.dbg.lv.", FuncName));
- std::string Name = FuncName;
- fixupObjcLikeName(Name);
- return M.getNamedMetadata(Twine("llvm.dbg.lv.", Name));
+ SmallString<32> Name = StringRef("llvm.dbg.lv.");
+ fixupObjcLikeName(FuncName, Name);
+
+ return M.getNamedMetadata(Name.str());
}
/// getOrInsertFnSpecificMDNode - Return a NameMDNode that is suitable
/// to hold function specific information.
NamedMDNode *llvm::getOrInsertFnSpecificMDNode(Module &M, StringRef FuncName) {
- SmallString<32> Out;
- if (FuncName.find('[') == StringRef::npos)
- return M.getOrInsertNamedMetadata(Twine("llvm.dbg.lv.", FuncName)
- .toStringRef(Out));
-
- std::string Name = FuncName;
- fixupObjcLikeName(Name);
- return M.getOrInsertNamedMetadata(Twine("llvm.dbg.lv.", Name)
- .toStringRef(Out));
+ SmallString<32> Name = StringRef("llvm.dbg.lv.");
+ fixupObjcLikeName(FuncName, Name);
+
+ return M.getOrInsertNamedMetadata(Name.str());
}
diff --git a/contrib/llvm/lib/Analysis/IPA/FindUsedTypes.cpp b/contrib/llvm/lib/Analysis/IPA/FindUsedTypes.cpp
index dde2556..6535786 100644
--- a/contrib/llvm/lib/Analysis/IPA/FindUsedTypes.cpp
+++ b/contrib/llvm/lib/Analysis/IPA/FindUsedTypes.cpp
@@ -96,8 +96,6 @@ void FindUsedTypes::print(raw_ostream &OS, const Module *M) const {
OS << "Types in use by this module:\n";
for (SetVector<const Type *>::const_iterator I = UsedTypes.begin(),
E = UsedTypes.end(); I != E; ++I) {
- OS << " ";
- WriteTypeSymbolic(OS, *I, M);
- OS << '\n';
+ OS << " " << **I << '\n';
}
}
diff --git a/contrib/llvm/lib/Analysis/IVUsers.cpp b/contrib/llvm/lib/Analysis/IVUsers.cpp
index a0c42f0..e5f0a77 100644
--- a/contrib/llvm/lib/Analysis/IVUsers.cpp
+++ b/contrib/llvm/lib/Analysis/IVUsers.cpp
@@ -21,7 +21,6 @@
#include "llvm/Analysis/Dominators.h"
#include "llvm/Analysis/LoopPass.h"
#include "llvm/Analysis/ScalarEvolutionExpressions.h"
-#include "llvm/Support/CommandLine.h"
#include "llvm/Target/TargetData.h"
#include "llvm/Assembly/Writer.h"
#include "llvm/ADT/STLExtras.h"
@@ -39,15 +38,6 @@ INITIALIZE_PASS_DEPENDENCY(ScalarEvolution)
INITIALIZE_PASS_END(IVUsers, "iv-users",
"Induction Variable Users", false, true)
-// IVUsers behavior currently depends on this temporary indvars mode. The
-// option must be defined upstream from its uses.
-namespace llvm {
- bool DisableIVRewrite = false;
-}
-cl::opt<bool, true> DisableIVRewriteOpt(
- "disable-iv-rewrite", cl::Hidden, cl::location(llvm::DisableIVRewrite),
- cl::desc("Disable canonical induction variable rewriting"));
-
Pass *llvm::createIVUsersPass() {
return new IVUsers();
}
@@ -56,17 +46,20 @@ Pass *llvm::createIVUsersPass() {
/// used by the given expression, within the context of analyzing the
/// given loop.
static bool isInteresting(const SCEV *S, const Instruction *I, const Loop *L,
- ScalarEvolution *SE) {
+ ScalarEvolution *SE, LoopInfo *LI) {
// An addrec is interesting if it's affine or if it has an interesting start.
if (const SCEVAddRecExpr *AR = dyn_cast<SCEVAddRecExpr>(S)) {
- // Keep things simple. Don't touch loop-variant strides.
+ // Keep things simple. Don't touch loop-variant strides unless they're
+ // only used outside the loop and we can simplify them.
if (AR->getLoop() == L)
- return AR->isAffine() || !L->contains(I);
+ return AR->isAffine() ||
+ (!L->contains(I) &&
+ SE->getSCEVAtScope(AR, LI->getLoopFor(I->getParent())) != AR);
// Otherwise recurse to see if the start value is interesting, and that
// the step value is not interesting, since we don't yet know how to
// do effective SCEV expansions for addrecs with interesting steps.
- return isInteresting(AR->getStart(), I, L, SE) &&
- !isInteresting(AR->getStepRecurrence(*SE), I, L, SE);
+ return isInteresting(AR->getStart(), I, L, SE, LI) &&
+ !isInteresting(AR->getStepRecurrence(*SE), I, L, SE, LI);
}
// An add is interesting if exactly one of its operands is interesting.
@@ -74,7 +67,7 @@ static bool isInteresting(const SCEV *S, const Instruction *I, const Loop *L,
bool AnyInterestingYet = false;
for (SCEVAddExpr::op_iterator OI = Add->op_begin(), OE = Add->op_end();
OI != OE; ++OI)
- if (isInteresting(*OI, I, L, SE)) {
+ if (isInteresting(*OI, I, L, SE, LI)) {
if (AnyInterestingYet)
return false;
AnyInterestingYet = true;
@@ -89,7 +82,7 @@ static bool isInteresting(const SCEV *S, const Instruction *I, const Loop *L,
/// AddUsersIfInteresting - Inspect the specified instruction. If it is a
/// reducible SCEV, recursively add its users to the IVUsesByStride set and
/// return true. Otherwise, return false.
-bool IVUsers::AddUsersIfInteresting(Instruction *I, PHINode *Phi) {
+bool IVUsers::AddUsersIfInteresting(Instruction *I) {
if (!SE->isSCEVable(I->getType()))
return false; // Void and FP expressions cannot be reduced.
@@ -100,11 +93,6 @@ bool IVUsers::AddUsersIfInteresting(Instruction *I, PHINode *Phi) {
if (Width > 64 || (TD && !TD->isLegalInteger(Width)))
return false;
- // We expect Sign/Zero extension to be eliminated from the IR before analyzing
- // any downstream uses.
- if (DisableIVRewrite && (isa<SExtInst>(I) || isa<ZExtInst>(I)))
- return false;
-
if (!Processed.insert(I))
return true; // Instruction already handled.
@@ -113,7 +101,7 @@ bool IVUsers::AddUsersIfInteresting(Instruction *I, PHINode *Phi) {
// If we've come to an uninteresting expression, stop the traversal and
// call this a user.
- if (!isInteresting(ISE, I, L, SE))
+ if (!isInteresting(ISE, I, L, SE, LI))
return false;
SmallPtrSet<Instruction *, 4> UniqueUsers;
@@ -136,13 +124,12 @@ bool IVUsers::AddUsersIfInteresting(Instruction *I, PHINode *Phi) {
bool AddUserToIVUsers = false;
if (LI->getLoopFor(User->getParent()) != L) {
if (isa<PHINode>(User) || Processed.count(User) ||
- !AddUsersIfInteresting(User, Phi)) {
+ !AddUsersIfInteresting(User)) {
DEBUG(dbgs() << "FOUND USER in other loop: " << *User << '\n'
<< " OF SCEV: " << *ISE << '\n');
AddUserToIVUsers = true;
}
- } else if (Processed.count(User) ||
- !AddUsersIfInteresting(User, Phi)) {
+ } else if (Processed.count(User) || !AddUsersIfInteresting(User)) {
DEBUG(dbgs() << "FOUND USER: " << *User << '\n'
<< " OF SCEV: " << *ISE << '\n');
AddUserToIVUsers = true;
@@ -150,7 +137,7 @@ bool IVUsers::AddUsersIfInteresting(Instruction *I, PHINode *Phi) {
if (AddUserToIVUsers) {
// Okay, we found a user that we cannot reduce.
- IVUses.push_back(new IVStrideUse(this, User, I, Phi));
+ IVUses.push_back(new IVStrideUse(this, User, I));
IVStrideUse &NewUse = IVUses.back();
// Autodetect the post-inc loop set, populating NewUse.PostIncLoops.
// The regular return value here is discarded; instead of recording
@@ -165,8 +152,8 @@ bool IVUsers::AddUsersIfInteresting(Instruction *I, PHINode *Phi) {
return true;
}
-IVStrideUse &IVUsers::AddUser(Instruction *User, Value *Operand, PHINode *Phi) {
- IVUses.push_back(new IVStrideUse(this, User, Operand, Phi));
+IVStrideUse &IVUsers::AddUser(Instruction *User, Value *Operand) {
+ IVUses.push_back(new IVStrideUse(this, User, Operand));
return IVUses.back();
}
@@ -194,7 +181,7 @@ bool IVUsers::runOnLoop(Loop *l, LPPassManager &LPM) {
// them by stride. Start by finding all of the PHI nodes in the header for
// this loop. If they are induction variables, inspect their uses.
for (BasicBlock::iterator I = L->getHeader()->begin(); isa<PHINode>(I); ++I)
- (void)AddUsersIfInteresting(I, cast<PHINode>(I));
+ (void)AddUsersIfInteresting(I);
return false;
}
diff --git a/contrib/llvm/lib/Analysis/InstructionSimplify.cpp b/contrib/llvm/lib/Analysis/InstructionSimplify.cpp
index 9d78f8b..8709f6b 100644
--- a/contrib/llvm/lib/Analysis/InstructionSimplify.cpp
+++ b/contrib/llvm/lib/Analysis/InstructionSimplify.cpp
@@ -2204,15 +2204,15 @@ Value *llvm::SimplifySelectInst(Value *CondVal, Value *TrueVal, Value *FalseVal,
if (TrueVal == FalseVal)
return TrueVal;
- if (isa<UndefValue>(TrueVal)) // select C, undef, X -> X
- return FalseVal;
- if (isa<UndefValue>(FalseVal)) // select C, X, undef -> X
- return TrueVal;
if (isa<UndefValue>(CondVal)) { // select undef, X, Y -> X or Y
if (isa<Constant>(TrueVal))
return TrueVal;
return FalseVal;
}
+ if (isa<UndefValue>(TrueVal)) // select C, undef, X -> X
+ return FalseVal;
+ if (isa<UndefValue>(FalseVal)) // select C, X, undef -> X
+ return TrueVal;
return 0;
}
diff --git a/contrib/llvm/lib/Analysis/Lint.cpp b/contrib/llvm/lib/Analysis/Lint.cpp
index f130f30..89755da 100644
--- a/contrib/llvm/lib/Analysis/Lint.cpp
+++ b/contrib/llvm/lib/Analysis/Lint.cpp
@@ -592,8 +592,7 @@ Value *Lint::findValueImpl(Value *V, bool OffsetOk,
return findValueImpl(CI->getOperand(0), OffsetOk, Visited);
} else if (ExtractValueInst *Ex = dyn_cast<ExtractValueInst>(V)) {
if (Value *W = FindInsertedValue(Ex->getAggregateOperand(),
- Ex->idx_begin(),
- Ex->idx_end()))
+ Ex->getIndices()))
if (W != V)
return findValueImpl(W, OffsetOk, Visited);
} else if (ConstantExpr *CE = dyn_cast<ConstantExpr>(V)) {
@@ -607,9 +606,7 @@ Value *Lint::findValueImpl(Value *V, bool OffsetOk,
return findValueImpl(CE->getOperand(0), OffsetOk, Visited);
} else if (CE->getOpcode() == Instruction::ExtractValue) {
ArrayRef<unsigned> Indices = CE->getIndices();
- if (Value *W = FindInsertedValue(CE->getOperand(0),
- Indices.begin(),
- Indices.end()))
+ if (Value *W = FindInsertedValue(CE->getOperand(0), Indices))
if (W != V)
return findValueImpl(W, OffsetOk, Visited);
}
diff --git a/contrib/llvm/lib/Analysis/MemDepPrinter.cpp b/contrib/llvm/lib/Analysis/MemDepPrinter.cpp
index 64d215c..2283db0 100644
--- a/contrib/llvm/lib/Analysis/MemDepPrinter.cpp
+++ b/contrib/llvm/lib/Analysis/MemDepPrinter.cpp
@@ -79,8 +79,8 @@ bool MemDepPrinter::runOnFunction(Function &F) {
MemDepResult Res = MDA.getDependency(Inst);
if (!Res.isNonLocal()) {
- assert(Res.isClobber() != Res.isDef() &&
- "Local dep should be def or clobber!");
+ assert((Res.isUnknown() || Res.isClobber() || Res.isDef()) &&
+ "Local dep should be unknown, def or clobber!");
Deps[Inst].insert(std::make_pair(InstAndClobberFlag(Res.getInst(),
Res.isClobber()),
static_cast<BasicBlock *>(0)));
@@ -92,8 +92,9 @@ bool MemDepPrinter::runOnFunction(Function &F) {
for (MemoryDependenceAnalysis::NonLocalDepInfo::const_iterator
I = NLDI.begin(), E = NLDI.end(); I != E; ++I) {
const MemDepResult &Res = I->getResult();
- assert(Res.isClobber() != Res.isDef() &&
- "Resolved non-local call dep should be def or clobber!");
+ assert((Res.isUnknown() || Res.isClobber() || Res.isDef()) &&
+ "Resolved non-local call dep should be unknown, def or "
+ "clobber!");
InstDeps.insert(std::make_pair(InstAndClobberFlag(Res.getInst(),
Res.isClobber()),
I->getBB()));
@@ -148,16 +149,24 @@ void MemDepPrinter::print(raw_ostream &OS, const Module *M) const {
bool isClobber = I->first.getInt();
const BasicBlock *DepBB = I->second;
- OS << " " << (isClobber ? "Clobber" : " Def");
+ OS << " ";
+ if (!DepInst)
+ OS << "Unknown";
+ else if (isClobber)
+ OS << "Clobber";
+ else
+ OS << " Def";
if (DepBB) {
OS << " in block ";
WriteAsOperand(OS, DepBB, /*PrintType=*/false, M);
}
- OS << " from: ";
- if (DepInst == Inst)
- OS << "<unspecified>";
- else
- DepInst->print(OS);
+ if (DepInst) {
+ OS << " from: ";
+ if (DepInst == Inst)
+ OS << "<unspecified>";
+ else
+ DepInst->print(OS);
+ }
OS << "\n";
}
diff --git a/contrib/llvm/lib/Analysis/MemoryBuiltins.cpp b/contrib/llvm/lib/Analysis/MemoryBuiltins.cpp
index 769c68c..53d4304 100644
--- a/contrib/llvm/lib/Analysis/MemoryBuiltins.cpp
+++ b/contrib/llvm/lib/Analysis/MemoryBuiltins.cpp
@@ -50,13 +50,8 @@ static bool isMallocCall(const CallInst *CI) {
const FunctionType *FTy = Callee->getFunctionType();
if (FTy->getNumParams() != 1)
return false;
- if (IntegerType *ITy = dyn_cast<IntegerType>(FTy->param_begin()->get())) {
- if (ITy->getBitWidth() != 32 && ITy->getBitWidth() != 64)
- return false;
- return true;
- }
-
- return false;
+ return FTy->getParamType(0)->isIntegerTy(32) ||
+ FTy->getParamType(0)->isIntegerTy(64);
}
/// extractMallocCall - Returns the corresponding CallInst if the instruction
@@ -211,7 +206,7 @@ const CallInst *llvm::isFreeCall(const Value *I) {
return 0;
if (FTy->getNumParams() != 1)
return 0;
- if (FTy->param_begin()->get() != Type::getInt8PtrTy(Callee->getContext()))
+ if (FTy->getParamType(0) != Type::getInt8PtrTy(Callee->getContext()))
return 0;
return CI;
diff --git a/contrib/llvm/lib/Analysis/MemoryDependenceAnalysis.cpp b/contrib/llvm/lib/Analysis/MemoryDependenceAnalysis.cpp
index 5f640c0..bba4482 100644
--- a/contrib/llvm/lib/Analysis/MemoryDependenceAnalysis.cpp
+++ b/contrib/llvm/lib/Analysis/MemoryDependenceAnalysis.cpp
@@ -47,6 +47,11 @@ STATISTIC(NumUncacheNonLocalPtr,
STATISTIC(NumCacheCompleteNonLocalPtr,
"Number of block queries that were completely cached");
+// Limit for the number of instructions to scan in a block.
+// FIXME: Figure out what a sane value is for this.
+// (500 is relatively insane.)
+static const int BlockScanLimit = 500;
+
char MemoryDependenceAnalysis::ID = 0;
// Register this pass...
@@ -180,8 +185,16 @@ AliasAnalysis::ModRefResult GetLocation(const Instruction *Inst,
MemDepResult MemoryDependenceAnalysis::
getCallSiteDependencyFrom(CallSite CS, bool isReadOnlyCall,
BasicBlock::iterator ScanIt, BasicBlock *BB) {
+ unsigned Limit = BlockScanLimit;
+
// Walk backwards through the block, looking for dependencies
while (ScanIt != BB->begin()) {
+ // Limit the amount of scanning we do so we don't end up with quadratic
+ // running time on extreme testcases.
+ --Limit;
+ if (!Limit)
+ return MemDepResult::getUnknown();
+
Instruction *Inst = --ScanIt;
// If this inst is a memory op, get the pointer it accessed
@@ -215,11 +228,11 @@ getCallSiteDependencyFrom(CallSite CS, bool isReadOnlyCall,
}
}
- // No dependence found. If this is the entry block of the function, it is a
- // clobber, otherwise it is non-local.
+ // No dependence found. If this is the entry block of the function, it is
+ // unknown, otherwise it is non-local.
if (BB != &BB->getParent()->getEntryBlock())
return MemDepResult::getNonLocal();
- return MemDepResult::getClobber(ScanIt);
+ return MemDepResult::getUnknown();
}
/// isLoadLoadClobberIfExtendedToFullWidth - Return true if LI is a load that
@@ -322,9 +335,17 @@ getPointerDependencyFrom(const AliasAnalysis::Location &MemLoc, bool isLoad,
const Value *MemLocBase = 0;
int64_t MemLocOffset = 0;
-
+
+ unsigned Limit = BlockScanLimit;
+
// Walk backwards through the basic block, looking for dependencies.
while (ScanIt != BB->begin()) {
+ // Limit the amount of scanning we do so we don't end up with quadratic
+ // running time on extreme testcases.
+ --Limit;
+ if (!Limit)
+ return MemDepResult::getUnknown();
+
Instruction *Inst = --ScanIt;
if (IntrinsicInst *II = dyn_cast<IntrinsicInst>(Inst)) {
@@ -458,11 +479,11 @@ getPointerDependencyFrom(const AliasAnalysis::Location &MemLoc, bool isLoad,
}
}
- // No dependence found. If this is the entry block of the function, it is a
- // clobber, otherwise it is non-local.
+ // No dependence found. If this is the entry block of the function, it is
+ // unknown, otherwise it is non-local.
if (BB != &BB->getParent()->getEntryBlock())
return MemDepResult::getNonLocal();
- return MemDepResult::getClobber(ScanIt);
+ return MemDepResult::getUnknown();
}
/// getDependency - Return the instruction on which a memory operation
@@ -490,12 +511,12 @@ MemDepResult MemoryDependenceAnalysis::getDependency(Instruction *QueryInst) {
// Do the scan.
if (BasicBlock::iterator(QueryInst) == QueryParent->begin()) {
- // No dependence found. If this is the entry block of the function, it is a
- // clobber, otherwise it is non-local.
+ // No dependence found. If this is the entry block of the function, it is
+ // unknown, otherwise it is non-local.
if (QueryParent != &QueryParent->getParent()->getEntryBlock())
LocalCache = MemDepResult::getNonLocal();
else
- LocalCache = MemDepResult::getClobber(QueryInst);
+ LocalCache = MemDepResult::getUnknown();
} else {
AliasAnalysis::Location MemLoc;
AliasAnalysis::ModRefResult MR = GetLocation(QueryInst, MemLoc, AA);
@@ -514,7 +535,7 @@ MemDepResult MemoryDependenceAnalysis::getDependency(Instruction *QueryInst) {
QueryParent);
} else
// Non-memory instruction.
- LocalCache = MemDepResult::getClobber(--BasicBlock::iterator(ScanPos));
+ LocalCache = MemDepResult::getUnknown();
}
// Remember the result!
@@ -648,10 +669,10 @@ MemoryDependenceAnalysis::getNonLocalCallDependency(CallSite QueryCS) {
Dep = getCallSiteDependencyFrom(QueryCS, isReadonlyCall,ScanPos, DirtyBB);
} else if (DirtyBB != &DirtyBB->getParent()->getEntryBlock()) {
// No dependence found. If this is the entry block of the function, it is
- // a clobber, otherwise it is non-local.
+ // a clobber, otherwise it is unknown.
Dep = MemDepResult::getNonLocal();
} else {
- Dep = MemDepResult::getClobber(ScanPos);
+ Dep = MemDepResult::getUnknown();
}
// If we had a dirty entry for the block, update it. Otherwise, just add
@@ -707,7 +728,7 @@ getNonLocalPointerDependency(const AliasAnalysis::Location &Loc, bool isLoad,
return;
Result.clear();
Result.push_back(NonLocalDepResult(FromBB,
- MemDepResult::getClobber(FromBB->begin()),
+ MemDepResult::getUnknown(),
const_cast<Value *>(Loc.Ptr)));
}
@@ -769,7 +790,7 @@ GetNonLocalInfoForBlock(const AliasAnalysis::Location &Loc,
// If the block has a dependency (i.e. it isn't completely transparent to
// the value), remember the reverse association because we just added it
// to Cache!
- if (Dep.isNonLocal())
+ if (Dep.isNonLocal() || Dep.isUnknown())
return Dep;
// Keep the ReverseNonLocalPtrDeps map up to date so we can efficiently
@@ -1091,16 +1112,14 @@ getNonLocalPointerDepFromBB(const PHITransAddr &Pointer,
// If getNonLocalPointerDepFromBB fails here, that means the cached
// result conflicted with the Visited list; we have to conservatively
- // assume a clobber, but this also does not block PRE of the load.
+ // assume it is unknown, but this also does not block PRE of the load.
if (!CanTranslate ||
getNonLocalPointerDepFromBB(PredPointer,
Loc.getWithNewPtr(PredPtrVal),
isLoad, Pred,
Result, Visited)) {
// Add the entry to the Result list.
- NonLocalDepResult Entry(Pred,
- MemDepResult::getClobber(Pred->getTerminator()),
- PredPtrVal);
+ NonLocalDepResult Entry(Pred, MemDepResult::getUnknown(), PredPtrVal);
Result.push_back(Entry);
// Since we had a phi translation failure, the cache for CacheKey won't
@@ -1145,8 +1164,7 @@ getNonLocalPointerDepFromBB(const PHITransAddr &Pointer,
// results from the set". Clear out the indicator for this.
CacheInfo->Pair = BBSkipFirstBlockPair();
- // If *nothing* works, mark the pointer as being clobbered by the first
- // instruction in this block.
+ // If *nothing* works, mark the pointer as unknown.
//
// If this is the magic first block, return this as a clobber of the whole
// incoming value. Since we can't phi translate to one of the predecessors,
@@ -1161,8 +1179,7 @@ getNonLocalPointerDepFromBB(const PHITransAddr &Pointer,
assert(I->getResult().isNonLocal() &&
"Should only be here with transparent block");
- I->setResult(MemDepResult::getClobber(BB->getTerminator()));
- ReverseNonLocalPtrDeps[BB->getTerminator()].insert(CacheKey);
+ I->setResult(MemDepResult::getUnknown());
Result.push_back(NonLocalDepResult(I->getBB(), I->getResult(),
Pointer.getAddr()));
break;
diff --git a/contrib/llvm/lib/Analysis/ScalarEvolutionExpander.cpp b/contrib/llvm/lib/Analysis/ScalarEvolutionExpander.cpp
index 8e5a400..befe6d2 100644
--- a/contrib/llvm/lib/Analysis/ScalarEvolutionExpander.cpp
+++ b/contrib/llvm/lib/Analysis/ScalarEvolutionExpander.cpp
@@ -19,6 +19,7 @@
#include "llvm/LLVMContext.h"
#include "llvm/Target/TargetData.h"
#include "llvm/ADT/STLExtras.h"
+
using namespace llvm;
/// ReuseOrCreateCast - Arrange for there to be a cast of V to Ty at IP,
@@ -159,7 +160,8 @@ Value *SCEVExpander::InsertBinop(Instruction::BinaryOps Opcode,
}
// If we haven't found this binop, insert it.
- Value *BO = Builder.CreateBinOp(Opcode, LHS, RHS, "tmp");
+ Instruction *BO = cast<Instruction>(Builder.CreateBinOp(Opcode, LHS, RHS, "tmp"));
+ BO->setDebugLoc(SaveInsertPt->getDebugLoc());
rememberInstruction(BO);
// Restore the original insert point.
@@ -847,6 +849,8 @@ SCEVExpander::getAddRecExprPHILiterally(const SCEVAddRecExpr *Normalized,
const Loop *L,
const Type *ExpandTy,
const Type *IntTy) {
+ assert((!IVIncInsertLoop||IVIncInsertPos) && "Uninitialized insert position");
+
// Reuse a previously-inserted PHI, if present.
for (BasicBlock::iterator I = L->getHeader()->begin();
PHINode *PN = dyn_cast<PHINode>(I); ++I)
@@ -871,13 +875,15 @@ SCEVExpander::getAddRecExprPHILiterally(const SCEVAddRecExpr *Normalized,
// If any of the operands don't dominate the insert position, bail.
// Addrec operands are always loop-invariant, so this can only happen
// if there are instructions which haven't been hoisted.
- for (User::op_iterator OI = IncV->op_begin()+1,
- OE = IncV->op_end(); OI != OE; ++OI)
- if (Instruction *OInst = dyn_cast<Instruction>(OI))
- if (!SE.DT->dominates(OInst, IVIncInsertPos)) {
- IncV = 0;
- break;
- }
+ if (L == IVIncInsertLoop) {
+ for (User::op_iterator OI = IncV->op_begin()+1,
+ OE = IncV->op_end(); OI != OE; ++OI)
+ if (Instruction *OInst = dyn_cast<Instruction>(OI))
+ if (!SE.DT->dominates(OInst, IVIncInsertPos)) {
+ IncV = 0;
+ break;
+ }
+ }
if (!IncV)
break;
// Advance to the next instruction.
@@ -919,6 +925,11 @@ SCEVExpander::getAddRecExprPHILiterally(const SCEVAddRecExpr *Normalized,
Value *StartV = expandCodeFor(Normalized->getStart(), ExpandTy,
L->getHeader()->begin());
+ // StartV must be hoisted into L's preheader to dominate the new phi.
+ assert(!isa<Instruction>(StartV) ||
+ SE.DT->properlyDominates(cast<Instruction>(StartV)->getParent(),
+ L->getHeader()));
+
// Expand code for the step value. Insert instructions right before the
// terminator corresponding to the back-edge. Do this before creating the PHI
// so that PHI reuse code doesn't see an incomplete PHI. If the stride is
@@ -935,7 +946,8 @@ SCEVExpander::getAddRecExprPHILiterally(const SCEVAddRecExpr *Normalized,
BasicBlock *Header = L->getHeader();
Builder.SetInsertPoint(Header, Header->begin());
pred_iterator HPB = pred_begin(Header), HPE = pred_end(Header);
- PHINode *PN = Builder.CreatePHI(ExpandTy, std::distance(HPB, HPE), "lsr.iv");
+ PHINode *PN = Builder.CreatePHI(ExpandTy, std::distance(HPB, HPE),
+ Twine(IVName) + ".iv");
rememberInstruction(PN);
// Create the step instructions and populate the PHI.
@@ -953,7 +965,7 @@ SCEVExpander::getAddRecExprPHILiterally(const SCEVAddRecExpr *Normalized,
// at IVIncInsertPos.
Instruction *InsertPos = L == IVIncInsertLoop ?
IVIncInsertPos : Pred->getTerminator();
- Builder.SetInsertPoint(InsertPos->getParent(), InsertPos);
+ Builder.SetInsertPoint(InsertPos);
Value *IncV;
// If the PHI is a pointer, use a GEP, otherwise use an add or sub.
if (isPointer) {
@@ -971,8 +983,8 @@ SCEVExpander::getAddRecExprPHILiterally(const SCEVAddRecExpr *Normalized,
}
} else {
IncV = isNegative ?
- Builder.CreateSub(PN, StepV, "lsr.iv.next") :
- Builder.CreateAdd(PN, StepV, "lsr.iv.next");
+ Builder.CreateSub(PN, StepV, Twine(IVName) + ".iv.next") :
+ Builder.CreateAdd(PN, StepV, Twine(IVName) + ".iv.next");
rememberInstruction(IncV);
}
PN->addIncoming(IncV, Pred);
@@ -1155,6 +1167,7 @@ Value *SCEVExpander::visitAddRecExpr(const SCEVAddRecExpr *S) {
Instruction *Add = BinaryOperator::CreateAdd(CanonicalIV, One,
"indvar.next",
HP->getTerminator());
+ Add->setDebugLoc(HP->getTerminator()->getDebugLoc());
rememberInstruction(Add);
CanonicalIV->addIncoming(Add, HP);
} else {
diff --git a/contrib/llvm/lib/Analysis/ValueTracking.cpp b/contrib/llvm/lib/Analysis/ValueTracking.cpp
index dab5aeb..455c910 100644
--- a/contrib/llvm/lib/Analysis/ValueTracking.cpp
+++ b/contrib/llvm/lib/Analysis/ValueTracking.cpp
@@ -1352,14 +1352,15 @@ static Value *BuildSubAggregate(Value *From, Value* To, const Type *IndexedType,
// we might be able to find the complete struct somewhere.
// Find the value that is at that particular spot
- Value *V = FindInsertedValue(From, Idxs.begin(), Idxs.end());
+ Value *V = FindInsertedValue(From, Idxs);
if (!V)
return NULL;
// Insert the value in the new (sub) aggregrate
- return llvm::InsertValueInst::Create(To, V, Idxs.begin() + IdxSkip,
- Idxs.end(), "tmp", InsertBefore);
+ return llvm::InsertValueInst::Create(To, V,
+ ArrayRef<unsigned>(Idxs).slice(IdxSkip),
+ "tmp", InsertBefore);
}
// This helper takes a nested struct and extracts a part of it (which is again a
@@ -1374,15 +1375,13 @@ static Value *BuildSubAggregate(Value *From, Value* To, const Type *IndexedType,
// insertvalue instruction somewhere).
//
// All inserted insertvalue instructions are inserted before InsertBefore
-static Value *BuildSubAggregate(Value *From, const unsigned *idx_begin,
- const unsigned *idx_end,
+static Value *BuildSubAggregate(Value *From, ArrayRef<unsigned> idx_range,
Instruction *InsertBefore) {
assert(InsertBefore && "Must have someplace to insert!");
const Type *IndexedType = ExtractValueInst::getIndexedType(From->getType(),
- idx_begin,
- idx_end);
+ idx_range);
Value *To = UndefValue::get(IndexedType);
- SmallVector<unsigned, 10> Idxs(idx_begin, idx_end);
+ SmallVector<unsigned, 10> Idxs(idx_range.begin(), idx_range.end());
unsigned IdxSkip = Idxs.size();
return BuildSubAggregate(From, To, IndexedType, Idxs, IdxSkip, InsertBefore);
@@ -1394,39 +1393,37 @@ static Value *BuildSubAggregate(Value *From, const unsigned *idx_begin,
///
/// If InsertBefore is not null, this function will duplicate (modified)
/// insertvalues when a part of a nested struct is extracted.
-Value *llvm::FindInsertedValue(Value *V, const unsigned *idx_begin,
- const unsigned *idx_end, Instruction *InsertBefore) {
+Value *llvm::FindInsertedValue(Value *V, ArrayRef<unsigned> idx_range,
+ Instruction *InsertBefore) {
// Nothing to index? Just return V then (this is useful at the end of our
// recursion)
- if (idx_begin == idx_end)
+ if (idx_range.empty())
return V;
// We have indices, so V should have an indexable type
assert((V->getType()->isStructTy() || V->getType()->isArrayTy())
&& "Not looking at a struct or array?");
- assert(ExtractValueInst::getIndexedType(V->getType(), idx_begin, idx_end)
+ assert(ExtractValueInst::getIndexedType(V->getType(), idx_range)
&& "Invalid indices for type?");
const CompositeType *PTy = cast<CompositeType>(V->getType());
if (isa<UndefValue>(V))
return UndefValue::get(ExtractValueInst::getIndexedType(PTy,
- idx_begin,
- idx_end));
+ idx_range));
else if (isa<ConstantAggregateZero>(V))
return Constant::getNullValue(ExtractValueInst::getIndexedType(PTy,
- idx_begin,
- idx_end));
+ idx_range));
else if (Constant *C = dyn_cast<Constant>(V)) {
if (isa<ConstantArray>(C) || isa<ConstantStruct>(C))
// Recursively process this constant
- return FindInsertedValue(C->getOperand(*idx_begin), idx_begin + 1,
- idx_end, InsertBefore);
+ return FindInsertedValue(C->getOperand(idx_range[0]), idx_range.slice(1),
+ InsertBefore);
} else if (InsertValueInst *I = dyn_cast<InsertValueInst>(V)) {
// Loop the indices for the insertvalue instruction in parallel with the
// requested indices
- const unsigned *req_idx = idx_begin;
+ const unsigned *req_idx = idx_range.begin();
for (const unsigned *i = I->idx_begin(), *e = I->idx_end();
i != e; ++i, ++req_idx) {
- if (req_idx == idx_end) {
+ if (req_idx == idx_range.end()) {
if (InsertBefore)
// The requested index identifies a part of a nested aggregate. Handle
// this specially. For example,
@@ -1438,7 +1435,10 @@ Value *llvm::FindInsertedValue(Value *V, const unsigned *idx_begin,
// %C = insertvalue {i32, i32 } %A, i32 11, 1
// which allows the unused 0,0 element from the nested struct to be
// removed.
- return BuildSubAggregate(V, idx_begin, req_idx, InsertBefore);
+ return BuildSubAggregate(V,
+ ArrayRef<unsigned>(idx_range.begin(),
+ req_idx),
+ InsertBefore);
else
// We can't handle this without inserting insertvalues
return 0;
@@ -1448,13 +1448,14 @@ Value *llvm::FindInsertedValue(Value *V, const unsigned *idx_begin,
// See if the (aggregrate) value inserted into has the value we are
// looking for, then.
if (*req_idx != *i)
- return FindInsertedValue(I->getAggregateOperand(), idx_begin, idx_end,
+ return FindInsertedValue(I->getAggregateOperand(), idx_range,
InsertBefore);
}
// If we end up here, the indices of the insertvalue match with those
// requested (though possibly only partially). Now we recursively look at
// the inserted value, passing any remaining indices.
- return FindInsertedValue(I->getInsertedValueOperand(), req_idx, idx_end,
+ return FindInsertedValue(I->getInsertedValueOperand(),
+ ArrayRef<unsigned>(req_idx, idx_range.end()),
InsertBefore);
} else if (ExtractValueInst *I = dyn_cast<ExtractValueInst>(V)) {
// If we're extracting a value from an aggregrate that was extracted from
@@ -1462,24 +1463,20 @@ Value *llvm::FindInsertedValue(Value *V, const unsigned *idx_begin,
// However, we will need to chain I's indices with the requested indices.
// Calculate the number of indices required
- unsigned size = I->getNumIndices() + (idx_end - idx_begin);
+ unsigned size = I->getNumIndices() + idx_range.size();
// Allocate some space to put the new indices in
SmallVector<unsigned, 5> Idxs;
Idxs.reserve(size);
// Add indices from the extract value instruction
- for (const unsigned *i = I->idx_begin(), *e = I->idx_end();
- i != e; ++i)
- Idxs.push_back(*i);
+ Idxs.append(I->idx_begin(), I->idx_end());
// Add requested indices
- for (const unsigned *i = idx_begin, *e = idx_end; i != e; ++i)
- Idxs.push_back(*i);
+ Idxs.append(idx_range.begin(), idx_range.end());
assert(Idxs.size() == size
&& "Number of indices added not correct?");
- return FindInsertedValue(I->getAggregateOperand(), Idxs.begin(), Idxs.end(),
- InsertBefore);
+ return FindInsertedValue(I->getAggregateOperand(), Idxs, InsertBefore);
}
// Otherwise, we don't know (such as, extracting from a function return value
// or load instruction)
@@ -1783,3 +1780,19 @@ llvm::GetUnderlyingObject(Value *V, const TargetData *TD, unsigned MaxLookup) {
}
return V;
}
+
+/// onlyUsedByLifetimeMarkers - Return true if the only users of this pointer
+/// are lifetime markers.
+///
+bool llvm::onlyUsedByLifetimeMarkers(const Value *V) {
+ for (Value::const_use_iterator UI = V->use_begin(), UE = V->use_end();
+ UI != UE; ++UI) {
+ const IntrinsicInst *II = dyn_cast<IntrinsicInst>(*UI);
+ if (!II) return false;
+
+ if (II->getIntrinsicID() != Intrinsic::lifetime_start &&
+ II->getIntrinsicID() != Intrinsic::lifetime_end)
+ return false;
+ }
+ return true;
+}
diff --git a/contrib/llvm/lib/AsmParser/LLLexer.cpp b/contrib/llvm/lib/AsmParser/LLLexer.cpp
index 014e816..3c63106 100644
--- a/contrib/llvm/lib/AsmParser/LLLexer.cpp
+++ b/contrib/llvm/lib/AsmParser/LLLexer.cpp
@@ -406,29 +406,20 @@ lltok::Kind LLLexer::LexQuote() {
return kind;
}
-static bool JustWhitespaceNewLine(const char *&Ptr) {
- const char *ThisPtr = Ptr;
- while (*ThisPtr == ' ' || *ThisPtr == '\t')
- ++ThisPtr;
- if (*ThisPtr == '\n' || *ThisPtr == '\r') {
- Ptr = ThisPtr;
- return true;
- }
- return false;
-}
-
/// LexExclaim:
/// !foo
/// !
lltok::Kind LLLexer::LexExclaim() {
// Lex a metadata name as a MetadataVar.
- if (isalpha(CurPtr[0])) {
+ if (isalpha(CurPtr[0]) || CurPtr[0] == '-' || CurPtr[0] == '$' ||
+ CurPtr[0] == '.' || CurPtr[0] == '_' || CurPtr[0] == '\\') {
++CurPtr;
while (isalnum(CurPtr[0]) || CurPtr[0] == '-' || CurPtr[0] == '$' ||
- CurPtr[0] == '.' || CurPtr[0] == '_')
+ CurPtr[0] == '.' || CurPtr[0] == '_' || CurPtr[0] == '\\')
++CurPtr;
StrVal.assign(TokStart+1, CurPtr); // Skip !
+ UnEscapeLexed(StrVal);
return lltok::MetadataVar;
}
return lltok::exclaim;
@@ -480,7 +471,6 @@ lltok::Kind LLLexer::LexIdentifier() {
if (Len == strlen(#STR) && !memcmp(StartChar, #STR, strlen(#STR))) \
return lltok::kw_##STR;
- KEYWORD(begin); KEYWORD(end);
KEYWORD(true); KEYWORD(false);
KEYWORD(declare); KEYWORD(define);
KEYWORD(global); KEYWORD(constant);
@@ -570,6 +560,7 @@ lltok::Kind LLLexer::LexIdentifier() {
KEYWORD(noimplicitfloat);
KEYWORD(naked);
KEYWORD(hotpatch);
+ KEYWORD(nonlazybind);
KEYWORD(type);
KEYWORD(opaque);
@@ -598,26 +589,6 @@ lltok::Kind LLLexer::LexIdentifier() {
TYPEKEYWORD("x86_mmx", Type::getX86_MMXTy(Context));
#undef TYPEKEYWORD
- // Handle special forms for autoupgrading. Drop these in LLVM 3.0. This is
- // to avoid conflicting with the sext/zext instructions, below.
- if (Len == 4 && !memcmp(StartChar, "sext", 4)) {
- // Scan CurPtr ahead, seeing if there is just whitespace before the newline.
- if (JustWhitespaceNewLine(CurPtr))
- return lltok::kw_signext;
- } else if (Len == 4 && !memcmp(StartChar, "zext", 4)) {
- // Scan CurPtr ahead, seeing if there is just whitespace before the newline.
- if (JustWhitespaceNewLine(CurPtr))
- return lltok::kw_zeroext;
- } else if (Len == 6 && !memcmp(StartChar, "malloc", 6)) {
- // FIXME: Remove in LLVM 3.0.
- // Autoupgrade malloc instruction.
- return lltok::kw_malloc;
- } else if (Len == 4 && !memcmp(StartChar, "free", 4)) {
- // FIXME: Remove in LLVM 3.0.
- // Autoupgrade malloc instruction.
- return lltok::kw_free;
- }
-
// Keywords for instructions.
#define INSTKEYWORD(STR, Enum) \
if (Len == strlen(#STR) && !memcmp(StartChar, #STR, strlen(#STR))) { \
@@ -664,7 +635,6 @@ lltok::Kind LLLexer::LexIdentifier() {
INSTKEYWORD(extractelement, ExtractElement);
INSTKEYWORD(insertelement, InsertElement);
INSTKEYWORD(shufflevector, ShuffleVector);
- INSTKEYWORD(getresult, ExtractValue);
INSTKEYWORD(extractvalue, ExtractValue);
INSTKEYWORD(insertvalue, InsertValue);
#undef INSTKEYWORD
@@ -689,14 +659,6 @@ lltok::Kind LLLexer::LexIdentifier() {
return lltok::kw_cc;
}
- // If this starts with "call", return it as CALL. This is to support old
- // broken .ll files. FIXME: remove this with LLVM 3.0.
- if (CurPtr-TokStart > 4 && !memcmp(TokStart, "call", 4)) {
- CurPtr = TokStart+4;
- UIntVal = Instruction::Call;
- return lltok::kw_call;
- }
-
// Finally, if this isn't known, return an error.
CurPtr = TokStart+1;
return lltok::Error;
diff --git a/contrib/llvm/lib/AsmParser/LLLexer.h b/contrib/llvm/lib/AsmParser/LLLexer.h
index 4fe705e..33b9135 100644
--- a/contrib/llvm/lib/AsmParser/LLLexer.h
+++ b/contrib/llvm/lib/AsmParser/LLLexer.h
@@ -38,7 +38,7 @@ namespace llvm {
lltok::Kind CurKind;
std::string StrVal;
unsigned UIntVal;
- const Type *TyVal;
+ Type *TyVal;
APFloat APFloatVal;
APSInt APSIntVal;
@@ -56,7 +56,7 @@ namespace llvm {
LocTy getLoc() const { return SMLoc::getFromPointer(TokStart); }
lltok::Kind getKind() const { return CurKind; }
const std::string &getStrVal() const { return StrVal; }
- const Type *getTyVal() const { return TyVal; }
+ Type *getTyVal() const { return TyVal; }
unsigned getUIntVal() const { return UIntVal; }
const APSInt &getAPSIntVal() const { return APSIntVal; }
const APFloat &getAPFloatVal() const { return APFloatVal; }
diff --git a/contrib/llvm/lib/AsmParser/LLParser.cpp b/contrib/llvm/lib/AsmParser/LLParser.cpp
index 81e0747..cfc31f3 100644
--- a/contrib/llvm/lib/AsmParser/LLParser.cpp
+++ b/contrib/llvm/lib/AsmParser/LLParser.cpp
@@ -26,6 +26,13 @@
#include "llvm/Support/raw_ostream.h"
using namespace llvm;
+static std::string getTypeString(const Type *T) {
+ std::string Result;
+ raw_string_ostream Tmp(Result);
+ Tmp << *T;
+ return Tmp.str();
+}
+
/// Run: module ::= toplevelentity*
bool LLParser::Run() {
// Prime the lexer.
@@ -59,24 +66,6 @@ bool LLParser::ValidateEndOfModule() {
}
- // Update auto-upgraded malloc calls to "malloc".
- // FIXME: Remove in LLVM 3.0.
- if (MallocF) {
- MallocF->setName("malloc");
- // If setName() does not set the name to "malloc", then there is already a
- // declaration of "malloc". In that case, iterate over all calls to MallocF
- // and get them to call the declared "malloc" instead.
- if (MallocF->getName() != "malloc") {
- Constant *RealMallocF = M->getFunction("malloc");
- if (RealMallocF->getType() != MallocF->getType())
- RealMallocF = ConstantExpr::getBitCast(RealMallocF, MallocF->getType());
- MallocF->replaceAllUsesWith(RealMallocF);
- MallocF->eraseFromParent();
- MallocF = NULL;
- }
- }
-
-
// If there are entries in ForwardRefBlockAddresses at this point, they are
// references after the function was defined. Resolve those now.
while (!ForwardRefBlockAddresses.empty()) {
@@ -100,15 +89,16 @@ bool LLParser::ValidateEndOfModule() {
ForwardRefBlockAddresses.erase(ForwardRefBlockAddresses.begin());
}
-
- if (!ForwardRefTypes.empty())
- return Error(ForwardRefTypes.begin()->second.second,
- "use of undefined type named '" +
- ForwardRefTypes.begin()->first + "'");
- if (!ForwardRefTypeIDs.empty())
- return Error(ForwardRefTypeIDs.begin()->second.second,
- "use of undefined type '%" +
- Twine(ForwardRefTypeIDs.begin()->first) + "'");
+ for (unsigned i = 0, e = NumberedTypes.size(); i != e; ++i)
+ if (NumberedTypes[i].second.isValid())
+ return Error(NumberedTypes[i].second,
+ "use of undefined type '%" + Twine(i) + "'");
+
+ for (StringMap<std::pair<Type*, LocTy> >::iterator I =
+ NamedTypes.begin(), E = NamedTypes.end(); I != E; ++I)
+ if (I->second.second.isValid())
+ return Error(I->second.second,
+ "use of undefined type named '" + I->getKey() + "'");
if (!ForwardRefVals.empty())
return Error(ForwardRefVals.begin()->second.second,
@@ -176,15 +166,12 @@ bool LLParser::ParseTopLevelEntities() {
switch (Lex.getKind()) {
default: return TokError("expected top-level entity");
case lltok::Eof: return false;
- //case lltok::kw_define:
case lltok::kw_declare: if (ParseDeclare()) return true; break;
case lltok::kw_define: if (ParseDefine()) return true; break;
case lltok::kw_module: if (ParseModuleAsm()) return true; break;
case lltok::kw_target: if (ParseTargetDefinition()) return true; break;
case lltok::kw_deplibs: if (ParseDepLibs()) return true; break;
- case lltok::kw_type: if (ParseUnnamedType()) return true; break;
case lltok::LocalVarID: if (ParseUnnamedType()) return true; break;
- case lltok::StringConstant: // FIXME: REMOVE IN LLVM 3.0
case lltok::LocalVar: if (ParseNamedType()) return true; break;
case lltok::GlobalID: if (ParseUnnamedGlobal()) return true; break;
case lltok::GlobalVar: if (ParseNamedGlobal()) return true; break;
@@ -304,45 +291,35 @@ bool LLParser::ParseDepLibs() {
}
/// ParseUnnamedType:
-/// ::= 'type' type
/// ::= LocalVarID '=' 'type' type
bool LLParser::ParseUnnamedType() {
- unsigned TypeID = NumberedTypes.size();
-
- // Handle the LocalVarID form.
- if (Lex.getKind() == lltok::LocalVarID) {
- if (Lex.getUIntVal() != TypeID)
- return Error(Lex.getLoc(), "type expected to be numbered '%" +
- Twine(TypeID) + "'");
- Lex.Lex(); // eat LocalVarID;
-
- if (ParseToken(lltok::equal, "expected '=' after name"))
- return true;
- }
-
LocTy TypeLoc = Lex.getLoc();
- if (ParseToken(lltok::kw_type, "expected 'type' after '='")) return true;
+ unsigned TypeID = Lex.getUIntVal();
+ Lex.Lex(); // eat LocalVarID;
- PATypeHolder Ty(Type::getVoidTy(Context));
- if (ParseType(Ty)) return true;
-
- // See if this type was previously referenced.
- std::map<unsigned, std::pair<PATypeHolder, LocTy> >::iterator
- FI = ForwardRefTypeIDs.find(TypeID);
- if (FI != ForwardRefTypeIDs.end()) {
- if (FI->second.first.get() == Ty)
- return Error(TypeLoc, "self referential type is invalid");
+ if (ParseToken(lltok::equal, "expected '=' after name") ||
+ ParseToken(lltok::kw_type, "expected 'type' after '='"))
+ return true;
- cast<DerivedType>(FI->second.first.get())->refineAbstractTypeTo(Ty);
- Ty = FI->second.first.get();
- ForwardRefTypeIDs.erase(FI);
+ if (TypeID >= NumberedTypes.size())
+ NumberedTypes.resize(TypeID+1);
+
+ Type *Result = 0;
+ if (ParseStructDefinition(TypeLoc, "",
+ NumberedTypes[TypeID], Result)) return true;
+
+ if (!isa<StructType>(Result)) {
+ std::pair<Type*, LocTy> &Entry = NumberedTypes[TypeID];
+ if (Entry.first)
+ return Error(TypeLoc, "non-struct types may not be recursive");
+ Entry.first = Result;
+ Entry.second = SMLoc();
}
- NumberedTypes.push_back(Ty);
-
return false;
}
+
/// toplevelentity
/// ::= LocalVar '=' 'type' type
bool LLParser::ParseNamedType() {
@@ -350,42 +327,23 @@ bool LLParser::ParseNamedType() {
LocTy NameLoc = Lex.getLoc();
Lex.Lex(); // eat LocalVar.
- PATypeHolder Ty(Type::getVoidTy(Context));
-
if (ParseToken(lltok::equal, "expected '=' after name") ||
- ParseToken(lltok::kw_type, "expected 'type' after name") ||
- ParseType(Ty))
+ ParseToken(lltok::kw_type, "expected 'type' after name"))
return true;
-
- // Set the type name, checking for conflicts as we do so.
- bool AlreadyExists = M->addTypeName(Name, Ty);
- if (!AlreadyExists) return false;
-
- // See if this type is a forward reference. We need to eagerly resolve
- // types to allow recursive type redefinitions below.
- std::map<std::string, std::pair<PATypeHolder, LocTy> >::iterator
- FI = ForwardRefTypes.find(Name);
- if (FI != ForwardRefTypes.end()) {
- if (FI->second.first.get() == Ty)
- return Error(NameLoc, "self referential type is invalid");
-
- cast<DerivedType>(FI->second.first.get())->refineAbstractTypeTo(Ty);
- Ty = FI->second.first.get();
- ForwardRefTypes.erase(FI);
+
+ Type *Result = 0;
+ if (ParseStructDefinition(NameLoc, Name,
+ NamedTypes[Name], Result)) return true;
+
+ if (!isa<StructType>(Result)) {
+ std::pair<Type*, LocTy> &Entry = NamedTypes[Name];
+ if (Entry.first)
+ return Error(NameLoc, "non-struct types may not be recursive");
+ Entry.first = Result;
+ Entry.second = SMLoc();
}
-
- // Inserting a name that is already defined, get the existing name.
- const Type *Existing = M->getTypeByName(Name);
- assert(Existing && "Conflict but no matching type?!");
-
- // Otherwise, this is an attempt to redefine a type. That's okay if
- // the redefinition is identical to the original.
- // FIXME: REMOVE REDEFINITIONS IN LLVM 3.0
- if (Existing == Ty) return false;
-
- // Any other kind of (non-equivalent) redefinition is an error.
- return Error(NameLoc, "redefinition of type named '" + Name + "' of type '" +
- Ty->getDescription() + "'");
+
+ return false;
}
@@ -561,7 +519,7 @@ bool LLParser::ParseStandaloneMetadata() {
unsigned MetadataID = 0;
LocTy TyLoc;
- PATypeHolder Ty(Type::getVoidTy(Context));
+ Type *Ty = 0;
SmallVector<Value *, 16> Elts;
if (ParseUInt32(MetadataID) ||
ParseToken(lltok::equal, "expected '=' here") ||
@@ -693,7 +651,7 @@ bool LLParser::ParseGlobal(const std::string &Name, LocTy NameLoc,
LocTy UnnamedAddrLoc;
LocTy TyLoc;
- PATypeHolder Ty(Type::getVoidTy(Context));
+ Type *Ty = 0;
if (ParseOptionalToken(lltok::kw_thread_local, ThreadLocal) ||
ParseOptionalAddrSpace(AddrSpace) ||
ParseOptionalToken(lltok::kw_unnamed_addr, UnnamedAddr,
@@ -811,24 +769,17 @@ GlobalValue *LLParser::GetGlobalVal(const std::string &Name, const Type *Ty,
if (Val) {
if (Val->getType() == Ty) return Val;
Error(Loc, "'@" + Name + "' defined with type '" +
- Val->getType()->getDescription() + "'");
+ getTypeString(Val->getType()) + "'");
return 0;
}
// Otherwise, create a new forward reference for this value and remember it.
GlobalValue *FwdVal;
- if (const FunctionType *FT = dyn_cast<FunctionType>(PTy->getElementType())) {
- // Function types can return opaque but functions can't.
- if (FT->getReturnType()->isOpaqueTy()) {
- Error(Loc, "function may not return opaque type");
- return 0;
- }
-
+ if (const FunctionType *FT = dyn_cast<FunctionType>(PTy->getElementType()))
FwdVal = Function::Create(FT, GlobalValue::ExternalWeakLinkage, Name, M);
- } else {
+ else
FwdVal = new GlobalVariable(*M, PTy->getElementType(), false,
GlobalValue::ExternalWeakLinkage, 0, Name);
- }
ForwardRefVals[Name] = std::make_pair(FwdVal, Loc);
return FwdVal;
@@ -856,23 +807,17 @@ GlobalValue *LLParser::GetGlobalVal(unsigned ID, const Type *Ty, LocTy Loc) {
if (Val) {
if (Val->getType() == Ty) return Val;
Error(Loc, "'@" + Twine(ID) + "' defined with type '" +
- Val->getType()->getDescription() + "'");
+ getTypeString(Val->getType()) + "'");
return 0;
}
// Otherwise, create a new forward reference for this value and remember it.
GlobalValue *FwdVal;
- if (const FunctionType *FT = dyn_cast<FunctionType>(PTy->getElementType())) {
- // Function types can return opaque but functions can't.
- if (FT->getReturnType()->isOpaqueTy()) {
- Error(Loc, "function may not return opaque type");
- return 0;
- }
+ if (const FunctionType *FT = dyn_cast<FunctionType>(PTy->getElementType()))
FwdVal = Function::Create(FT, GlobalValue::ExternalWeakLinkage, "", M);
- } else {
+ else
FwdVal = new GlobalVariable(*M, PTy->getElementType(), false,
GlobalValue::ExternalWeakLinkage, 0, "");
- }
ForwardRefValIDs[ID] = std::make_pair(FwdVal, Loc);
return FwdVal;
@@ -931,33 +876,23 @@ bool LLParser::ParseOptionalAddrSpace(unsigned &AddrSpace) {
/// ParseOptionalAttrs - Parse a potentially empty attribute list. AttrKind
/// indicates what kind of attribute list this is: 0: function arg, 1: result,
/// 2: function attr.
-/// 3: function arg after value: FIXME: REMOVE IN LLVM 3.0
bool LLParser::ParseOptionalAttrs(unsigned &Attrs, unsigned AttrKind) {
Attrs = Attribute::None;
LocTy AttrLoc = Lex.getLoc();
while (1) {
switch (Lex.getKind()) {
- case lltok::kw_sext:
- case lltok::kw_zext:
- // Treat these as signext/zeroext if they occur in the argument list after
- // the value, as in "call i8 @foo(i8 10 sext)". If they occur before the
- // value, as in "call i8 @foo(i8 sext (" then it is part of a constant
- // expr.
- // FIXME: REMOVE THIS IN LLVM 3.0
- if (AttrKind == 3) {
- if (Lex.getKind() == lltok::kw_sext)
- Attrs |= Attribute::SExt;
- else
- Attrs |= Attribute::ZExt;
- break;
- }
- // FALL THROUGH.
default: // End of attributes.
if (AttrKind != 2 && (Attrs & Attribute::FunctionOnly))
return Error(AttrLoc, "invalid use of function-only attribute");
- if (AttrKind != 0 && AttrKind != 3 && (Attrs & Attribute::ParameterOnly))
+ // As a hack, we allow "align 2" on functions as a synonym for
+ // "alignstack 2".
+ if (AttrKind == 2 &&
+ (Attrs & ~(Attribute::FunctionOnly | Attribute::Alignment)))
+ return Error(AttrLoc, "invalid use of attribute on a function");
+
+ if (AttrKind != 0 && (Attrs & Attribute::ParameterOnly))
return Error(AttrLoc, "invalid use of parameter-only attribute");
return false;
@@ -985,6 +920,7 @@ bool LLParser::ParseOptionalAttrs(unsigned &Attrs, unsigned AttrKind) {
case lltok::kw_noimplicitfloat: Attrs |= Attribute::NoImplicitFloat; break;
case lltok::kw_naked: Attrs |= Attribute::Naked; break;
case lltok::kw_hotpatch: Attrs |= Attribute::Hotpatch; break;
+ case lltok::kw_nonlazybind: Attrs |= Attribute::NonLazyBind; break;
case lltok::kw_alignstack: {
unsigned Alignment;
@@ -1262,166 +1198,68 @@ bool LLParser::ParseIndexList(SmallVectorImpl<unsigned> &Indices,
// Type Parsing.
//===----------------------------------------------------------------------===//
-/// ParseType - Parse and resolve a full type.
-bool LLParser::ParseType(PATypeHolder &Result, bool AllowVoid) {
- LocTy TypeLoc = Lex.getLoc();
- if (ParseTypeRec(Result)) return true;
-
- // Verify no unresolved uprefs.
- if (!UpRefs.empty())
- return Error(UpRefs.back().Loc, "invalid unresolved type up reference");
-
- if (!AllowVoid && Result.get()->isVoidTy())
- return Error(TypeLoc, "void type only allowed for function results");
-
- return false;
-}
-
-/// HandleUpRefs - Every time we finish a new layer of types, this function is
-/// called. It loops through the UpRefs vector, which is a list of the
-/// currently active types. For each type, if the up-reference is contained in
-/// the newly completed type, we decrement the level count. When the level
-/// count reaches zero, the up-referenced type is the type that is passed in:
-/// thus we can complete the cycle.
-///
-PATypeHolder LLParser::HandleUpRefs(const Type *ty) {
- // If Ty isn't abstract, or if there are no up-references in it, then there is
- // nothing to resolve here.
- if (!ty->isAbstract() || UpRefs.empty()) return ty;
-
- PATypeHolder Ty(ty);
-#if 0
- dbgs() << "Type '" << Ty->getDescription()
- << "' newly formed. Resolving upreferences.\n"
- << UpRefs.size() << " upreferences active!\n";
-#endif
-
- // If we find any resolvable upreferences (i.e., those whose NestingLevel goes
- // to zero), we resolve them all together before we resolve them to Ty. At
- // the end of the loop, if there is anything to resolve to Ty, it will be in
- // this variable.
- OpaqueType *TypeToResolve = 0;
-
- for (unsigned i = 0; i != UpRefs.size(); ++i) {
- // Determine if 'Ty' directly contains this up-references 'LastContainedTy'.
- bool ContainsType =
- std::find(Ty->subtype_begin(), Ty->subtype_end(),
- UpRefs[i].LastContainedTy) != Ty->subtype_end();
-
-#if 0
- dbgs() << " UR#" << i << " - TypeContains(" << Ty->getDescription() << ", "
- << UpRefs[i].LastContainedTy->getDescription() << ") = "
- << (ContainsType ? "true" : "false")
- << " level=" << UpRefs[i].NestingLevel << "\n";
-#endif
- if (!ContainsType)
- continue;
-
- // Decrement level of upreference
- unsigned Level = --UpRefs[i].NestingLevel;
- UpRefs[i].LastContainedTy = Ty;
-
- // If the Up-reference has a non-zero level, it shouldn't be resolved yet.
- if (Level != 0)
- continue;
-
-#if 0
- dbgs() << " * Resolving upreference for " << UpRefs[i].UpRefTy << "\n";
-#endif
- if (!TypeToResolve)
- TypeToResolve = UpRefs[i].UpRefTy;
- else
- UpRefs[i].UpRefTy->refineAbstractTypeTo(TypeToResolve);
- UpRefs.erase(UpRefs.begin()+i); // Remove from upreference list.
- --i; // Do not skip the next element.
- }
-
- if (TypeToResolve)
- TypeToResolve->refineAbstractTypeTo(Ty);
-
- return Ty;
-}
-
-
-/// ParseTypeRec - The recursive function used to process the internal
-/// implementation details of types.
-bool LLParser::ParseTypeRec(PATypeHolder &Result) {
+/// ParseType - Parse a type.
+bool LLParser::ParseType(Type *&Result, bool AllowVoid) {
+ SMLoc TypeLoc = Lex.getLoc();
switch (Lex.getKind()) {
default:
return TokError("expected type");
case lltok::Type:
- // TypeRec ::= 'float' | 'void' (etc)
+ // Type ::= 'float' | 'void' (etc)
Result = Lex.getTyVal();
Lex.Lex();
break;
- case lltok::kw_opaque:
- // TypeRec ::= 'opaque'
- Result = OpaqueType::get(Context);
- Lex.Lex();
- break;
case lltok::lbrace:
- // TypeRec ::= '{' ... '}'
- if (ParseStructType(Result, false))
+ // Type ::= StructType
+ if (ParseAnonStructType(Result, false))
return true;
break;
case lltok::lsquare:
- // TypeRec ::= '[' ... ']'
+ // Type ::= '[' ... ']'
Lex.Lex(); // eat the lsquare.
if (ParseArrayVectorType(Result, false))
return true;
break;
case lltok::less: // Either vector or packed struct.
- // TypeRec ::= '<' ... '>'
+ // Type ::= '<' ... '>'
Lex.Lex();
if (Lex.getKind() == lltok::lbrace) {
- if (ParseStructType(Result, true) ||
+ if (ParseAnonStructType(Result, true) ||
ParseToken(lltok::greater, "expected '>' at end of packed struct"))
return true;
} else if (ParseArrayVectorType(Result, true))
return true;
break;
- case lltok::LocalVar:
- case lltok::StringConstant: // FIXME: REMOVE IN LLVM 3.0
- // TypeRec ::= %foo
- if (const Type *T = M->getTypeByName(Lex.getStrVal())) {
- Result = T;
- } else {
- Result = OpaqueType::get(Context);
- ForwardRefTypes.insert(std::make_pair(Lex.getStrVal(),
- std::make_pair(Result,
- Lex.getLoc())));
- M->addTypeName(Lex.getStrVal(), Result.get());
+ case lltok::LocalVar: {
+ // Type ::= %foo
+ std::pair<Type*, LocTy> &Entry = NamedTypes[Lex.getStrVal()];
+
+ // If the type hasn't been defined yet, create a forward definition and
+ // remember where that forward def'n was seen (in case it never is defined).
+ if (Entry.first == 0) {
+ Entry.first = StructType::createNamed(Context, Lex.getStrVal());
+ Entry.second = Lex.getLoc();
}
+ Result = Entry.first;
Lex.Lex();
break;
+ }
- case lltok::LocalVarID:
- // TypeRec ::= %4
- if (Lex.getUIntVal() < NumberedTypes.size())
- Result = NumberedTypes[Lex.getUIntVal()];
- else {
- std::map<unsigned, std::pair<PATypeHolder, LocTy> >::iterator
- I = ForwardRefTypeIDs.find(Lex.getUIntVal());
- if (I != ForwardRefTypeIDs.end())
- Result = I->second.first;
- else {
- Result = OpaqueType::get(Context);
- ForwardRefTypeIDs.insert(std::make_pair(Lex.getUIntVal(),
- std::make_pair(Result,
- Lex.getLoc())));
- }
+ case lltok::LocalVarID: {
+ // Type ::= %4
+ if (Lex.getUIntVal() >= NumberedTypes.size())
+ NumberedTypes.resize(Lex.getUIntVal()+1);
+ std::pair<Type*, LocTy> &Entry = NumberedTypes[Lex.getUIntVal()];
+
+ // If the type hasn't been defined yet, create a forward definition and
+ // remember where that forward def'n was seen (in case it never is defined).
+ if (Entry.first == 0) {
+ Entry.first = StructType::createNamed(Context, "");
+ Entry.second = Lex.getLoc();
}
+ Result = Entry.first;
Lex.Lex();
break;
- case lltok::backslash: {
- // TypeRec ::= '\' 4
- Lex.Lex();
- unsigned Val;
- if (ParseUInt32(Val)) return true;
- OpaqueType *OT = OpaqueType::get(Context); //Use temporary placeholder.
- UpRefs.push_back(UpRefRecord(Lex.getLoc(), Val, OT));
- Result = OT;
- break;
}
}
@@ -1429,34 +1267,37 @@ bool LLParser::ParseTypeRec(PATypeHolder &Result) {
while (1) {
switch (Lex.getKind()) {
// End of type.
- default: return false;
+ default:
+ if (!AllowVoid && Result->isVoidTy())
+ return Error(TypeLoc, "void type only allowed for function results");
+ return false;
- // TypeRec ::= TypeRec '*'
+ // Type ::= Type '*'
case lltok::star:
- if (Result.get()->isLabelTy())
+ if (Result->isLabelTy())
return TokError("basic block pointers are invalid");
- if (Result.get()->isVoidTy())
- return TokError("pointers to void are invalid; use i8* instead");
- if (!PointerType::isValidElementType(Result.get()))
+ if (Result->isVoidTy())
+ return TokError("pointers to void are invalid - use i8* instead");
+ if (!PointerType::isValidElementType(Result))
return TokError("pointer to this type is invalid");
- Result = HandleUpRefs(PointerType::getUnqual(Result.get()));
+ Result = PointerType::getUnqual(Result);
Lex.Lex();
break;
- // TypeRec ::= TypeRec 'addrspace' '(' uint32 ')' '*'
+ // Type ::= Type 'addrspace' '(' uint32 ')' '*'
case lltok::kw_addrspace: {
- if (Result.get()->isLabelTy())
+ if (Result->isLabelTy())
return TokError("basic block pointers are invalid");
- if (Result.get()->isVoidTy())
+ if (Result->isVoidTy())
return TokError("pointers to void are invalid; use i8* instead");
- if (!PointerType::isValidElementType(Result.get()))
+ if (!PointerType::isValidElementType(Result))
return TokError("pointer to this type is invalid");
unsigned AddrSpace;
if (ParseOptionalAddrSpace(AddrSpace) ||
ParseToken(lltok::star, "expected '*' in address space"))
return true;
- Result = HandleUpRefs(PointerType::get(Result.get(), AddrSpace));
+ Result = PointerType::get(Result, AddrSpace);
break;
}
@@ -1487,7 +1328,7 @@ bool LLParser::ParseParameterList(SmallVectorImpl<ParamInfo> &ArgList,
// Parse the argument.
LocTy ArgLoc;
- PATypeHolder ArgTy(Type::getVoidTy(Context));
+ Type *ArgTy = 0;
unsigned ArgAttrs1 = Attribute::None;
unsigned ArgAttrs2 = Attribute::None;
Value *V;
@@ -1495,11 +1336,7 @@ bool LLParser::ParseParameterList(SmallVectorImpl<ParamInfo> &ArgList,
return true;
// Otherwise, handle normal operands.
- if (ParseOptionalAttrs(ArgAttrs1, 0) ||
- ParseValue(ArgTy, V, PFS) ||
- // FIXME: Should not allow attributes after the argument, remove this
- // in LLVM 3.0.
- ParseOptionalAttrs(ArgAttrs2, 3))
+ if (ParseOptionalAttrs(ArgAttrs1, 0) || ParseValue(ArgTy, V, PFS))
return true;
ArgList.push_back(ParamInfo(ArgLoc, V, ArgAttrs1|ArgAttrs2));
}
@@ -1511,7 +1348,7 @@ bool LLParser::ParseParameterList(SmallVectorImpl<ParamInfo> &ArgList,
/// ParseArgumentList - Parse the argument list for a function type or function
-/// prototype. If 'inType' is true then we are parsing a FunctionType.
+/// prototype.
/// ::= '(' ArgTypeListI ')'
/// ArgTypeListI
/// ::= /*empty*/
@@ -1519,8 +1356,8 @@ bool LLParser::ParseParameterList(SmallVectorImpl<ParamInfo> &ArgList,
/// ::= ArgTypeList ',' '...'
/// ::= ArgType (',' ArgType)*
///
-bool LLParser::ParseArgumentList(std::vector<ArgInfo> &ArgList,
- bool &isVarArg, bool inType) {
+bool LLParser::ParseArgumentList(SmallVectorImpl<ArgInfo> &ArgList,
+ bool &isVarArg){
isVarArg = false;
assert(Lex.getKind() == lltok::lparen);
Lex.Lex(); // eat the (.
@@ -1532,21 +1369,17 @@ bool LLParser::ParseArgumentList(std::vector<ArgInfo> &ArgList,
Lex.Lex();
} else {
LocTy TypeLoc = Lex.getLoc();
- PATypeHolder ArgTy(Type::getVoidTy(Context));
+ Type *ArgTy = 0;
unsigned Attrs;
std::string Name;
- // If we're parsing a type, use ParseTypeRec, because we allow recursive
- // types (such as a function returning a pointer to itself). If parsing a
- // function prototype, we require fully resolved types.
- if ((inType ? ParseTypeRec(ArgTy) : ParseType(ArgTy)) ||
+ if (ParseType(ArgTy) ||
ParseOptionalAttrs(Attrs, 0)) return true;
if (ArgTy->isVoidTy())
return Error(TypeLoc, "argument can not have void type");
- if (Lex.getKind() == lltok::LocalVar ||
- Lex.getKind() == lltok::StringConstant) { // FIXME: REMOVE IN LLVM 3.0
+ if (Lex.getKind() == lltok::LocalVar) {
Name = Lex.getStrVal();
Lex.Lex();
}
@@ -1565,21 +1398,19 @@ bool LLParser::ParseArgumentList(std::vector<ArgInfo> &ArgList,
// Otherwise must be an argument type.
TypeLoc = Lex.getLoc();
- if ((inType ? ParseTypeRec(ArgTy) : ParseType(ArgTy)) ||
- ParseOptionalAttrs(Attrs, 0)) return true;
+ if (ParseType(ArgTy) || ParseOptionalAttrs(Attrs, 0)) return true;
if (ArgTy->isVoidTy())
return Error(TypeLoc, "argument can not have void type");
- if (Lex.getKind() == lltok::LocalVar ||
- Lex.getKind() == lltok::StringConstant) { // FIXME: REMOVE IN LLVM 3.0
+ if (Lex.getKind() == lltok::LocalVar) {
Name = Lex.getStrVal();
Lex.Lex();
} else {
Name = "";
}
- if (!ArgTy->isFirstClassType() && !ArgTy->isOpaqueTy())
+ if (!ArgTy->isFirstClassType())
return Error(TypeLoc, "invalid type for function argument");
ArgList.push_back(ArgInfo(TypeLoc, ArgTy, Attrs, Name));
@@ -1591,94 +1422,142 @@ bool LLParser::ParseArgumentList(std::vector<ArgInfo> &ArgList,
/// ParseFunctionType
/// ::= Type ArgumentList OptionalAttrs
-bool LLParser::ParseFunctionType(PATypeHolder &Result) {
+bool LLParser::ParseFunctionType(Type *&Result) {
assert(Lex.getKind() == lltok::lparen);
if (!FunctionType::isValidReturnType(Result))
return TokError("invalid function return type");
- std::vector<ArgInfo> ArgList;
+ SmallVector<ArgInfo, 8> ArgList;
bool isVarArg;
- unsigned Attrs;
- if (ParseArgumentList(ArgList, isVarArg, true) ||
- // FIXME: Allow, but ignore attributes on function types!
- // FIXME: Remove in LLVM 3.0
- ParseOptionalAttrs(Attrs, 2))
+ if (ParseArgumentList(ArgList, isVarArg))
return true;
// Reject names on the arguments lists.
for (unsigned i = 0, e = ArgList.size(); i != e; ++i) {
if (!ArgList[i].Name.empty())
return Error(ArgList[i].Loc, "argument name invalid in function type");
- if (!ArgList[i].Attrs != 0) {
- // Allow but ignore attributes on function types; this permits
- // auto-upgrade.
- // FIXME: REJECT ATTRIBUTES ON FUNCTION TYPES in LLVM 3.0
- }
+ if (ArgList[i].Attrs != 0)
+ return Error(ArgList[i].Loc,
+ "argument attributes invalid in function type");
}
- std::vector<const Type*> ArgListTy;
+ SmallVector<Type*, 16> ArgListTy;
for (unsigned i = 0, e = ArgList.size(); i != e; ++i)
- ArgListTy.push_back(ArgList[i].Type);
+ ArgListTy.push_back(ArgList[i].Ty);
+
+ Result = FunctionType::get(Result, ArgListTy, isVarArg);
+ return false;
+}
- Result = HandleUpRefs(FunctionType::get(Result.get(),
- ArgListTy, isVarArg));
+/// ParseAnonStructType - Parse an anonymous struct type, which is inlined into
+/// other structs.
+bool LLParser::ParseAnonStructType(Type *&Result, bool Packed) {
+ SmallVector<Type*, 8> Elts;
+ if (ParseStructBody(Elts)) return true;
+
+ Result = StructType::get(Context, Elts, Packed);
return false;
}
+/// ParseStructDefinition - Parse a struct in a 'type' definition.
+bool LLParser::ParseStructDefinition(SMLoc TypeLoc, StringRef Name,
+ std::pair<Type*, LocTy> &Entry,
+ Type *&ResultTy) {
+ // If the type was already defined, diagnose the redefinition.
+ if (Entry.first && !Entry.second.isValid())
+ return Error(TypeLoc, "redefinition of type");
+
+ // If we have opaque, just return without filling in the definition for the
+ // struct. This counts as a definition as far as the .ll file goes.
+ if (EatIfPresent(lltok::kw_opaque)) {
+ // This type is being defined, so clear the location to indicate this.
+ Entry.second = SMLoc();
+
+ // If this type number has never been uttered, create it.
+ if (Entry.first == 0)
+ Entry.first = StructType::createNamed(Context, Name);
+ ResultTy = Entry.first;
+ return false;
+ }
+
+ // If the type starts with '<', then it is either a packed struct or a vector.
+ bool isPacked = EatIfPresent(lltok::less);
+
+ // If we don't have a struct, then we have a random type alias, which we
+ // accept for compatibility with old files. These types are not allowed to be
+ // forward referenced and not allowed to be recursive.
+ if (Lex.getKind() != lltok::lbrace) {
+ if (Entry.first)
+ return Error(TypeLoc, "forward references to non-struct type");
+
+ ResultTy = 0;
+ if (isPacked)
+ return ParseArrayVectorType(ResultTy, true);
+ return ParseType(ResultTy);
+ }
+
+ // This type is being defined, so clear the location to indicate this.
+ Entry.second = SMLoc();
+
+ // If this type number has never been uttered, create it.
+ if (Entry.first == 0)
+ Entry.first = StructType::createNamed(Context, Name);
+
+ StructType *STy = cast<StructType>(Entry.first);
+
+ SmallVector<Type*, 8> Body;
+ if (ParseStructBody(Body) ||
+ (isPacked && ParseToken(lltok::greater, "expected '>' in packed struct")))
+ return true;
+
+ STy->setBody(Body, isPacked);
+ ResultTy = STy;
+ return false;
+}
+
+
/// ParseStructType: Handles packed and unpacked types. </> parsed elsewhere.
-/// TypeRec
+/// StructType
/// ::= '{' '}'
-/// ::= '{' TypeRec (',' TypeRec)* '}'
+/// ::= '{' Type (',' Type)* '}'
/// ::= '<' '{' '}' '>'
-/// ::= '<' '{' TypeRec (',' TypeRec)* '}' '>'
-bool LLParser::ParseStructType(PATypeHolder &Result, bool Packed) {
+/// ::= '<' '{' Type (',' Type)* '}' '>'
+bool LLParser::ParseStructBody(SmallVectorImpl<Type*> &Body) {
assert(Lex.getKind() == lltok::lbrace);
Lex.Lex(); // Consume the '{'
- if (EatIfPresent(lltok::rbrace)) {
- Result = StructType::get(Context, Packed);
+ // Handle the empty struct.
+ if (EatIfPresent(lltok::rbrace))
return false;
- }
- std::vector<PATypeHolder> ParamsList;
LocTy EltTyLoc = Lex.getLoc();
- if (ParseTypeRec(Result)) return true;
- ParamsList.push_back(Result);
+ Type *Ty = 0;
+ if (ParseType(Ty)) return true;
+ Body.push_back(Ty);
- if (Result->isVoidTy())
- return Error(EltTyLoc, "struct element can not have void type");
- if (!StructType::isValidElementType(Result))
+ if (!StructType::isValidElementType(Ty))
return Error(EltTyLoc, "invalid element type for struct");
while (EatIfPresent(lltok::comma)) {
EltTyLoc = Lex.getLoc();
- if (ParseTypeRec(Result)) return true;
+ if (ParseType(Ty)) return true;
- if (Result->isVoidTy())
- return Error(EltTyLoc, "struct element can not have void type");
- if (!StructType::isValidElementType(Result))
+ if (!StructType::isValidElementType(Ty))
return Error(EltTyLoc, "invalid element type for struct");
- ParamsList.push_back(Result);
+ Body.push_back(Ty);
}
- if (ParseToken(lltok::rbrace, "expected '}' at end of struct"))
- return true;
-
- std::vector<const Type*> ParamsListTy;
- for (unsigned i = 0, e = ParamsList.size(); i != e; ++i)
- ParamsListTy.push_back(ParamsList[i].get());
- Result = HandleUpRefs(StructType::get(Context, ParamsListTy, Packed));
- return false;
+ return ParseToken(lltok::rbrace, "expected '}' at end of struct");
}
/// ParseArrayVectorType - Parse an array or vector type, assuming the first
/// token has already been consumed.
-/// TypeRec
+/// Type
/// ::= '[' APSINTVAL 'x' Types ']'
/// ::= '<' APSINTVAL 'x' Types '>'
-bool LLParser::ParseArrayVectorType(PATypeHolder &Result, bool isVector) {
+bool LLParser::ParseArrayVectorType(Type *&Result, bool isVector) {
if (Lex.getKind() != lltok::APSInt || Lex.getAPSIntVal().isSigned() ||
Lex.getAPSIntVal().getBitWidth() > 64)
return TokError("expected number in address space");
@@ -1691,11 +1570,8 @@ bool LLParser::ParseArrayVectorType(PATypeHolder &Result, bool isVector) {
return true;
LocTy TypeLoc = Lex.getLoc();
- PATypeHolder EltTy(Type::getVoidTy(Context));
- if (ParseTypeRec(EltTy)) return true;
-
- if (EltTy->isVoidTy())
- return Error(TypeLoc, "array and vector element type cannot be void");
+ Type *EltTy = 0;
+ if (ParseType(EltTy)) return true;
if (ParseToken(isVector ? lltok::greater : lltok::rsquare,
"expected end of sequential type"))
@@ -1712,7 +1588,7 @@ bool LLParser::ParseArrayVectorType(PATypeHolder &Result, bool isVector) {
} else {
if (!ArrayType::isValidElementType(EltTy))
return Error(TypeLoc, "invalid array element type");
- Result = HandleUpRefs(ArrayType::get(EltTy, Size));
+ Result = ArrayType::get(EltTy, Size);
}
return false;
}
@@ -1812,12 +1688,12 @@ Value *LLParser::PerFunctionState::GetVal(const std::string &Name,
P.Error(Loc, "'%" + Name + "' is not a basic block");
else
P.Error(Loc, "'%" + Name + "' defined with type '" +
- Val->getType()->getDescription() + "'");
+ getTypeString(Val->getType()) + "'");
return 0;
}
// Don't make placeholders with invalid type.
- if (!Ty->isFirstClassType() && !Ty->isOpaqueTy() && !Ty->isLabelTy()) {
+ if (!Ty->isFirstClassType() && !Ty->isLabelTy()) {
P.Error(Loc, "invalid use of a non-first-class type");
return 0;
}
@@ -1854,11 +1730,11 @@ Value *LLParser::PerFunctionState::GetVal(unsigned ID, const Type *Ty,
P.Error(Loc, "'%" + Twine(ID) + "' is not a basic block");
else
P.Error(Loc, "'%" + Twine(ID) + "' defined with type '" +
- Val->getType()->getDescription() + "'");
+ getTypeString(Val->getType()) + "'");
return 0;
}
- if (!Ty->isFirstClassType() && !Ty->isOpaqueTy() && !Ty->isLabelTy()) {
+ if (!Ty->isFirstClassType() && !Ty->isLabelTy()) {
P.Error(Loc, "invalid use of a non-first-class type");
return 0;
}
@@ -1902,7 +1778,7 @@ bool LLParser::PerFunctionState::SetInstName(int NameID,
if (FI != ForwardRefValIDs.end()) {
if (FI->second.first->getType() != Inst->getType())
return P.Error(NameLoc, "instruction forward referenced with type '" +
- FI->second.first->getType()->getDescription() + "'");
+ getTypeString(FI->second.first->getType()) + "'");
FI->second.first->replaceAllUsesWith(Inst);
delete FI->second.first;
ForwardRefValIDs.erase(FI);
@@ -1918,7 +1794,7 @@ bool LLParser::PerFunctionState::SetInstName(int NameID,
if (FI != ForwardRefVals.end()) {
if (FI->second.first->getType() != Inst->getType())
return P.Error(NameLoc, "instruction forward referenced with type '" +
- FI->second.first->getType()->getDescription() + "'");
+ getTypeString(FI->second.first->getType()) + "'");
FI->second.first->replaceAllUsesWith(Inst);
delete FI->second.first;
ForwardRefVals.erase(FI);
@@ -2001,7 +1877,6 @@ bool LLParser::ParseValID(ValID &ID, PerFunctionState *PFS) {
ID.Kind = ValID::t_LocalID;
break;
case lltok::LocalVar: // %foo
- case lltok::StringConstant: // "foo" - FIXME: REMOVE IN LLVM 3.0
ID.StrVal = Lex.getStrVal();
ID.Kind = ValID::t_LocalName;
break;
@@ -2035,9 +1910,10 @@ bool LLParser::ParseValID(ValID &ID, PerFunctionState *PFS) {
ParseToken(lltok::rbrace, "expected end of struct constant"))
return true;
- ID.ConstantVal = ConstantStruct::get(Context, Elts.data(),
- Elts.size(), false);
- ID.Kind = ValID::t_Constant;
+ ID.ConstantStructElts = new Constant*[Elts.size()];
+ ID.UIntVal = Elts.size();
+ memcpy(ID.ConstantStructElts, Elts.data(), Elts.size()*sizeof(Elts[0]));
+ ID.Kind = ValID::t_ConstantStruct;
return false;
}
case lltok::less: {
@@ -2055,9 +1931,10 @@ bool LLParser::ParseValID(ValID &ID, PerFunctionState *PFS) {
return true;
if (isPackedStruct) {
- ID.ConstantVal =
- ConstantStruct::get(Context, Elts.data(), Elts.size(), true);
- ID.Kind = ValID::t_Constant;
+ ID.ConstantStructElts = new Constant*[Elts.size()];
+ memcpy(ID.ConstantStructElts, Elts.data(), Elts.size()*sizeof(Elts[0]));
+ ID.UIntVal = Elts.size();
+ ID.Kind = ValID::t_PackedConstantStruct;
return false;
}
@@ -2074,7 +1951,7 @@ bool LLParser::ParseValID(ValID &ID, PerFunctionState *PFS) {
if (Elts[i]->getType() != Elts[0]->getType())
return Error(FirstEltLoc,
"vector element #" + Twine(i) +
- " is not of type '" + Elts[0]->getType()->getDescription());
+ " is not of type '" + getTypeString(Elts[0]->getType()));
ID.ConstantVal = ConstantVector::get(Elts);
ID.Kind = ValID::t_Constant;
@@ -2098,7 +1975,7 @@ bool LLParser::ParseValID(ValID &ID, PerFunctionState *PFS) {
if (!Elts[0]->getType()->isFirstClassType())
return Error(FirstEltLoc, "invalid array element type: " +
- Elts[0]->getType()->getDescription());
+ getTypeString(Elts[0]->getType()));
ArrayType *ATy = ArrayType::get(Elts[0]->getType(), Elts.size());
@@ -2107,10 +1984,10 @@ bool LLParser::ParseValID(ValID &ID, PerFunctionState *PFS) {
if (Elts[i]->getType() != Elts[0]->getType())
return Error(FirstEltLoc,
"array element #" + Twine(i) +
- " is not of type '" +Elts[0]->getType()->getDescription());
+ " is not of type '" + getTypeString(Elts[0]->getType()));
}
- ID.ConstantVal = ConstantArray::get(ATy, Elts.data(), Elts.size());
+ ID.ConstantVal = ConstantArray::get(ATy, Elts);
ID.Kind = ValID::t_Constant;
return false;
}
@@ -2179,7 +2056,7 @@ bool LLParser::ParseValID(ValID &ID, PerFunctionState *PFS) {
case lltok::kw_inttoptr:
case lltok::kw_ptrtoint: {
unsigned Opc = Lex.getUIntVal();
- PATypeHolder DestTy(Type::getVoidTy(Context));
+ Type *DestTy = 0;
Constant *SrcVal;
Lex.Lex();
if (ParseToken(lltok::lparen, "expected '(' after constantexpr cast") ||
@@ -2190,8 +2067,8 @@ bool LLParser::ParseValID(ValID &ID, PerFunctionState *PFS) {
return true;
if (!CastInst::castIsValid((Instruction::CastOps)Opc, SrcVal, DestTy))
return Error(ID.Loc, "invalid cast opcode for cast from '" +
- SrcVal->getType()->getDescription() + "' to '" +
- DestTy->getDescription() + "'");
+ getTypeString(SrcVal->getType()) + "' to '" +
+ getTypeString(DestTy) + "'");
ID.ConstantVal = ConstantExpr::getCast((Instruction::CastOps)Opc,
SrcVal, DestTy);
ID.Kind = ValID::t_Constant;
@@ -2209,11 +2086,9 @@ bool LLParser::ParseValID(ValID &ID, PerFunctionState *PFS) {
if (!Val->getType()->isAggregateType())
return Error(ID.Loc, "extractvalue operand must be aggregate type");
- if (!ExtractValueInst::getIndexedType(Val->getType(), Indices.begin(),
- Indices.end()))
+ if (!ExtractValueInst::getIndexedType(Val->getType(), Indices))
return Error(ID.Loc, "invalid indices for extractvalue");
- ID.ConstantVal =
- ConstantExpr::getExtractValue(Val, Indices.data(), Indices.size());
+ ID.ConstantVal = ConstantExpr::getExtractValue(Val, Indices);
ID.Kind = ValID::t_Constant;
return false;
}
@@ -2230,11 +2105,9 @@ bool LLParser::ParseValID(ValID &ID, PerFunctionState *PFS) {
return true;
if (!Val0->getType()->isAggregateType())
return Error(ID.Loc, "insertvalue operand must be aggregate type");
- if (!ExtractValueInst::getIndexedType(Val0->getType(), Indices.begin(),
- Indices.end()))
+ if (!ExtractValueInst::getIndexedType(Val0->getType(), Indices))
return Error(ID.Loc, "invalid indices for insertvalue");
- ID.ConstantVal = ConstantExpr::getInsertValue(Val0, Val1,
- Indices.data(), Indices.size());
+ ID.ConstantVal = ConstantExpr::getInsertValue(Val0, Val1, Indices);
ID.Kind = ValID::t_Constant;
return false;
}
@@ -2462,9 +2335,9 @@ bool LLParser::ParseGlobalValue(const Type *Ty, Constant *&C) {
}
bool LLParser::ParseGlobalTypeAndValue(Constant *&V) {
- PATypeHolder Type(Type::getVoidTy(Context));
- return ParseType(Type) ||
- ParseGlobalValue(Type, V);
+ Type *Ty = 0;
+ return ParseType(Ty) ||
+ ParseGlobalValue(Ty, V);
}
/// ParseGlobalValueVector
@@ -2600,7 +2473,7 @@ bool LLParser::ConvertValIDToValue(const Type *Ty, ValID &ID, Value *&V,
if (V->getType() != Ty)
return Error(ID.Loc, "floating point constant does not have type '" +
- Ty->getDescription() + "'");
+ getTypeString(Ty) + "'");
return false;
case ValID::t_Null:
@@ -2610,8 +2483,7 @@ bool LLParser::ConvertValIDToValue(const Type *Ty, ValID &ID, Value *&V,
return false;
case ValID::t_Undef:
// FIXME: LabelTy should not be a first-class type.
- if ((!Ty->isFirstClassType() || Ty->isLabelTy()) &&
- !Ty->isOpaqueTy())
+ if (!Ty->isFirstClassType() || Ty->isLabelTy())
return Error(ID.Loc, "invalid type for undef constant");
V = UndefValue::get(Ty);
return false;
@@ -2632,20 +2504,40 @@ bool LLParser::ConvertValIDToValue(const Type *Ty, ValID &ID, Value *&V,
V = ID.ConstantVal;
return false;
+ case ValID::t_ConstantStruct:
+ case ValID::t_PackedConstantStruct:
+ if (const StructType *ST = dyn_cast<StructType>(Ty)) {
+ if (ST->getNumElements() != ID.UIntVal)
+ return Error(ID.Loc,
+ "initializer with struct type has wrong # elements");
+ if (ST->isPacked() != (ID.Kind == ValID::t_PackedConstantStruct))
+ return Error(ID.Loc, "packed'ness of initializer and type don't match");
+
+ // Verify that the elements are compatible with the structtype.
+ for (unsigned i = 0, e = ID.UIntVal; i != e; ++i)
+ if (ID.ConstantStructElts[i]->getType() != ST->getElementType(i))
+ return Error(ID.Loc, "element " + Twine(i) +
+ " of struct initializer doesn't match struct element type");
+
+ V = ConstantStruct::get(ST, ArrayRef<Constant*>(ID.ConstantStructElts,
+ ID.UIntVal));
+ } else
+ return Error(ID.Loc, "constant expression type mismatch");
+ return false;
}
}
-bool LLParser::ParseValue(const Type *Ty, Value *&V, PerFunctionState &PFS) {
+bool LLParser::ParseValue(const Type *Ty, Value *&V, PerFunctionState *PFS) {
V = 0;
ValID ID;
- return ParseValID(ID, &PFS) ||
- ConvertValIDToValue(Ty, ID, V, &PFS);
+ return ParseValID(ID, PFS) ||
+ ConvertValIDToValue(Ty, ID, V, PFS);
}
-bool LLParser::ParseTypeAndValue(Value *&V, PerFunctionState &PFS) {
- PATypeHolder T(Type::getVoidTy(Context));
- return ParseType(T) ||
- ParseValue(T, V, PFS);
+bool LLParser::ParseTypeAndValue(Value *&V, PerFunctionState *PFS) {
+ Type *Ty = 0;
+ return ParseType(Ty) ||
+ ParseValue(Ty, V, PFS);
}
bool LLParser::ParseTypeAndBasicBlock(BasicBlock *&BB, LocTy &Loc,
@@ -2671,7 +2563,7 @@ bool LLParser::ParseFunctionHeader(Function *&Fn, bool isDefine) {
unsigned Visibility, RetAttrs;
CallingConv::ID CC;
- PATypeHolder RetType(Type::getVoidTy(Context));
+ Type *RetType = 0;
LocTy RetTypeLoc = Lex.getLoc();
if (ParseOptionalLinkage(Linkage) ||
ParseOptionalVisibility(Visibility) ||
@@ -2708,8 +2600,7 @@ bool LLParser::ParseFunctionHeader(Function *&Fn, bool isDefine) {
return Error(LinkageLoc, "invalid function linkage type");
}
- if (!FunctionType::isValidReturnType(RetType) ||
- RetType->isOpaqueTy())
+ if (!FunctionType::isValidReturnType(RetType))
return Error(RetTypeLoc, "invalid function return type");
LocTy NameLoc = Lex.getLoc();
@@ -2732,7 +2623,7 @@ bool LLParser::ParseFunctionHeader(Function *&Fn, bool isDefine) {
if (Lex.getKind() != lltok::lparen)
return TokError("expected '(' in function argument list");
- std::vector<ArgInfo> ArgList;
+ SmallVector<ArgInfo, 8> ArgList;
bool isVarArg;
unsigned FuncAttrs;
std::string Section;
@@ -2741,7 +2632,7 @@ bool LLParser::ParseFunctionHeader(Function *&Fn, bool isDefine) {
bool UnnamedAddr;
LocTy UnnamedAddrLoc;
- if (ParseArgumentList(ArgList, isVarArg, false) ||
+ if (ParseArgumentList(ArgList, isVarArg) ||
ParseOptionalToken(lltok::kw_unnamed_addr, UnnamedAddr,
&UnnamedAddrLoc) ||
ParseOptionalAttrs(FuncAttrs, 2) ||
@@ -2760,21 +2651,14 @@ bool LLParser::ParseFunctionHeader(Function *&Fn, bool isDefine) {
// Okay, if we got here, the function is syntactically valid. Convert types
// and do semantic checks.
- std::vector<const Type*> ParamTypeList;
+ std::vector<Type*> ParamTypeList;
SmallVector<AttributeWithIndex, 8> Attrs;
- // FIXME : In 3.0, stop accepting zext, sext and inreg as optional function
- // attributes.
- unsigned ObsoleteFuncAttrs = Attribute::ZExt|Attribute::SExt|Attribute::InReg;
- if (FuncAttrs & ObsoleteFuncAttrs) {
- RetAttrs |= FuncAttrs & ObsoleteFuncAttrs;
- FuncAttrs &= ~ObsoleteFuncAttrs;
- }
if (RetAttrs != Attribute::None)
Attrs.push_back(AttributeWithIndex::get(0, RetAttrs));
for (unsigned i = 0, e = ArgList.size(); i != e; ++i) {
- ParamTypeList.push_back(ArgList[i].Type);
+ ParamTypeList.push_back(ArgList[i].Ty);
if (ArgList[i].Attrs != Attribute::None)
Attrs.push_back(AttributeWithIndex::get(i+1, ArgList[i].Attrs));
}
@@ -2805,21 +2689,9 @@ bool LLParser::ParseFunctionHeader(Function *&Fn, bool isDefine) {
ForwardRefVals.erase(FRVI);
} else if ((Fn = M->getFunction(FunctionName))) {
- // If this function already exists in the symbol table, then it is
- // multiply defined. We accept a few cases for old backwards compat.
- // FIXME: Remove this stuff for LLVM 3.0.
- if (Fn->getType() != PFT || Fn->getAttributes() != PAL ||
- (!Fn->isDeclaration() && isDefine)) {
- // If the redefinition has different type or different attributes,
- // reject it. If both have bodies, reject it.
- return Error(NameLoc, "invalid redefinition of function '" +
- FunctionName + "'");
- } else if (Fn->isDeclaration()) {
- // Make sure to strip off any argument names so we can't get conflicts.
- for (Function::arg_iterator AI = Fn->arg_begin(), AE = Fn->arg_end();
- AI != AE; ++AI)
- AI->setName("");
- }
+ // Reject redefinitions.
+ return Error(NameLoc, "invalid redefinition of function '" +
+ FunctionName + "'");
} else if (M->getNamedValue(FunctionName)) {
return Error(NameLoc, "redefinition of function '@" + FunctionName + "'");
}
@@ -2858,10 +2730,6 @@ bool LLParser::ParseFunctionHeader(Function *&Fn, bool isDefine) {
// Add all of the arguments we parsed to the function.
Function::arg_iterator ArgIt = Fn->arg_begin();
for (unsigned i = 0, e = ArgList.size(); i != e; ++i, ++ArgIt) {
- // If we run out of arguments in the Function prototype, exit early.
- // FIXME: REMOVE THIS IN LLVM 3.0, this is just for the mismatch case above.
- if (ArgIt == Fn->arg_end()) break;
-
// If the argument has a name, insert it into the argument symbol table.
if (ArgList[i].Name.empty()) continue;
@@ -2879,10 +2747,9 @@ bool LLParser::ParseFunctionHeader(Function *&Fn, bool isDefine) {
/// ParseFunctionBody
/// ::= '{' BasicBlock+ '}'
-/// ::= 'begin' BasicBlock+ 'end' // FIXME: remove in LLVM 3.0
///
bool LLParser::ParseFunctionBody(Function &Fn) {
- if (Lex.getKind() != lltok::lbrace && Lex.getKind() != lltok::kw_begin)
+ if (Lex.getKind() != lltok::lbrace)
return TokError("expected '{' in function body");
Lex.Lex(); // eat the {.
@@ -2892,10 +2759,10 @@ bool LLParser::ParseFunctionBody(Function &Fn) {
PerFunctionState PFS(*this, Fn, FunctionNumber);
// We need at least one basic block.
- if (Lex.getKind() == lltok::rbrace || Lex.getKind() == lltok::kw_end)
+ if (Lex.getKind() == lltok::rbrace)
return TokError("function body requires at least one basic block");
- while (Lex.getKind() != lltok::rbrace && Lex.getKind() != lltok::kw_end)
+ while (Lex.getKind() != lltok::rbrace)
if (ParseBasicBlock(PFS)) return true;
// Eat the }.
@@ -2936,9 +2803,7 @@ bool LLParser::ParseBasicBlock(PerFunctionState &PFS) {
Lex.Lex();
if (ParseToken(lltok::equal, "expected '=' after instruction id"))
return true;
- } else if (Lex.getKind() == lltok::LocalVar ||
- // FIXME: REMOVE IN LLVM 3.0
- Lex.getKind() == lltok::StringConstant) {
+ } else if (Lex.getKind() == lltok::LocalVar) {
NameStr = Lex.getStrVal();
Lex.Lex();
if (ParseToken(lltok::equal, "expected '=' after instruction name"))
@@ -3062,8 +2927,6 @@ int LLParser::ParseInstruction(Instruction *&Inst, BasicBlock *BB,
case lltok::kw_tail: return ParseCall(Inst, PFS, true);
// Memory.
case lltok::kw_alloca: return ParseAlloc(Inst, PFS);
- case lltok::kw_malloc: return ParseAlloc(Inst, PFS, BB, false);
- case lltok::kw_free: return ParseFree(Inst, PFS, BB);
case lltok::kw_load: return ParseLoad(Inst, PFS, false);
case lltok::kw_store: return ParseStore(Inst, PFS, false);
case lltok::kw_volatile:
@@ -3073,7 +2936,6 @@ int LLParser::ParseInstruction(Instruction *&Inst, BasicBlock *BB,
return ParseStore(Inst, PFS, true);
else
return TokError("expected 'load' or 'store'");
- case lltok::kw_getresult: return ParseGetResult(Inst, PFS);
case lltok::kw_getelementptr: return ParseGetElementPtr(Inst, PFS);
case lltok::kw_extractvalue: return ParseExtractValue(Inst, PFS);
case lltok::kw_insertvalue: return ParseInsertValue(Inst, PFS);
@@ -3128,14 +2990,19 @@ bool LLParser::ParseCmpPredicate(unsigned &P, unsigned Opc) {
/// ParseRet - Parse a return instruction.
/// ::= 'ret' void (',' !dbg, !1)*
/// ::= 'ret' TypeAndValue (',' !dbg, !1)*
-/// ::= 'ret' TypeAndValue (',' TypeAndValue)+ (',' !dbg, !1)*
-/// [[obsolete: LLVM 3.0]]
-int LLParser::ParseRet(Instruction *&Inst, BasicBlock *BB,
- PerFunctionState &PFS) {
- PATypeHolder Ty(Type::getVoidTy(Context));
+bool LLParser::ParseRet(Instruction *&Inst, BasicBlock *BB,
+ PerFunctionState &PFS) {
+ SMLoc TypeLoc = Lex.getLoc();
+ Type *Ty = 0;
if (ParseType(Ty, true /*void allowed*/)) return true;
+ Type *ResType = PFS.getFunction().getReturnType();
+
if (Ty->isVoidTy()) {
+ if (!ResType->isVoidTy())
+ return Error(TypeLoc, "value doesn't match function result type '" +
+ getTypeString(ResType) + "'");
+
Inst = ReturnInst::Create(Context);
return false;
}
@@ -3143,38 +3010,12 @@ int LLParser::ParseRet(Instruction *&Inst, BasicBlock *BB,
Value *RV;
if (ParseValue(Ty, RV, PFS)) return true;
- bool ExtraComma = false;
- if (EatIfPresent(lltok::comma)) {
- // Parse optional custom metadata, e.g. !dbg
- if (Lex.getKind() == lltok::MetadataVar) {
- ExtraComma = true;
- } else {
- // The normal case is one return value.
- // FIXME: LLVM 3.0 remove MRV support for 'ret i32 1, i32 2', requiring
- // use of 'ret {i32,i32} {i32 1, i32 2}'
- SmallVector<Value*, 8> RVs;
- RVs.push_back(RV);
-
- do {
- // If optional custom metadata, e.g. !dbg is seen then this is the
- // end of MRV.
- if (Lex.getKind() == lltok::MetadataVar)
- break;
- if (ParseTypeAndValue(RV, PFS)) return true;
- RVs.push_back(RV);
- } while (EatIfPresent(lltok::comma));
-
- RV = UndefValue::get(PFS.getFunction().getReturnType());
- for (unsigned i = 0, e = RVs.size(); i != e; ++i) {
- Instruction *I = InsertValueInst::Create(RV, RVs[i], i, "mrv");
- BB->getInstList().push_back(I);
- RV = I;
- }
- }
- }
-
+ if (ResType != RV->getType())
+ return Error(TypeLoc, "value doesn't match function result type '" +
+ getTypeString(ResType) + "'");
+
Inst = ReturnInst::Create(Context, RV);
- return ExtraComma ? InstExtraComma : InstNormal;
+ return false;
}
@@ -3300,7 +3141,7 @@ bool LLParser::ParseInvoke(Instruction *&Inst, PerFunctionState &PFS) {
LocTy CallLoc = Lex.getLoc();
unsigned RetAttrs, FnAttrs;
CallingConv::ID CC;
- PATypeHolder RetType(Type::getVoidTy(Context));
+ Type *RetType = 0;
LocTy RetTypeLoc;
ValID CalleeID;
SmallVector<ParamInfo, 16> ArgList;
@@ -3326,7 +3167,7 @@ bool LLParser::ParseInvoke(Instruction *&Inst, PerFunctionState &PFS) {
if (!(PFTy = dyn_cast<PointerType>(RetType)) ||
!(Ty = dyn_cast<FunctionType>(PFTy->getElementType()))) {
// Pull out the types of all of the arguments...
- std::vector<const Type*> ParamTypes;
+ std::vector<Type*> ParamTypes;
for (unsigned i = 0, e = ArgList.size(); i != e; ++i)
ParamTypes.push_back(ArgList[i].V->getType());
@@ -3341,14 +3182,6 @@ bool LLParser::ParseInvoke(Instruction *&Inst, PerFunctionState &PFS) {
Value *Callee;
if (ConvertValIDToValue(PFTy, CalleeID, Callee, &PFS)) return true;
- // FIXME: In LLVM 3.0, stop accepting zext, sext and inreg as optional
- // function attributes.
- unsigned ObsoleteFuncAttrs = Attribute::ZExt|Attribute::SExt|Attribute::InReg;
- if (FnAttrs & ObsoleteFuncAttrs) {
- RetAttrs |= FnAttrs & ObsoleteFuncAttrs;
- FnAttrs &= ~ObsoleteFuncAttrs;
- }
-
// Set up the Attributes for the function.
SmallVector<AttributeWithIndex, 8> Attrs;
if (RetAttrs != Attribute::None)
@@ -3370,7 +3203,7 @@ bool LLParser::ParseInvoke(Instruction *&Inst, PerFunctionState &PFS) {
if (ExpectedTy && ExpectedTy != ArgList[i].V->getType())
return Error(ArgList[i].Loc, "argument is not of expected type '" +
- ExpectedTy->getDescription() + "'");
+ getTypeString(ExpectedTy) + "'");
Args.push_back(ArgList[i].V);
if (ArgList[i].Attrs != Attribute::None)
Attrs.push_back(AttributeWithIndex::get(i+1, ArgList[i].Attrs));
@@ -3385,8 +3218,7 @@ bool LLParser::ParseInvoke(Instruction *&Inst, PerFunctionState &PFS) {
// Finish off the Attributes and check them
AttrListPtr PAL = AttrListPtr::get(Attrs.begin(), Attrs.end());
- InvokeInst *II = InvokeInst::Create(Callee, NormalBB, UnwindBB,
- Args.begin(), Args.end());
+ InvokeInst *II = InvokeInst::Create(Callee, NormalBB, UnwindBB, Args);
II->setCallingConv(CC);
II->setAttributes(PAL);
Inst = II;
@@ -3486,8 +3318,9 @@ bool LLParser::ParseCompare(Instruction *&Inst, PerFunctionState &PFS,
/// ::= CastOpc TypeAndValue 'to' Type
bool LLParser::ParseCast(Instruction *&Inst, PerFunctionState &PFS,
unsigned Opc) {
- LocTy Loc; Value *Op;
- PATypeHolder DestTy(Type::getVoidTy(Context));
+ LocTy Loc;
+ Value *Op;
+ Type *DestTy = 0;
if (ParseTypeAndValue(Op, Loc, PFS) ||
ParseToken(lltok::kw_to, "expected 'to' after cast value") ||
ParseType(DestTy))
@@ -3496,8 +3329,8 @@ bool LLParser::ParseCast(Instruction *&Inst, PerFunctionState &PFS,
if (!CastInst::castIsValid((Instruction::CastOps)Opc, Op, DestTy)) {
CastInst::castIsValid((Instruction::CastOps)Opc, Op, DestTy);
return Error(Loc, "invalid cast opcode for cast from '" +
- Op->getType()->getDescription() + "' to '" +
- DestTy->getDescription() + "'");
+ getTypeString(Op->getType()) + "' to '" +
+ getTypeString(DestTy) + "'");
}
Inst = CastInst::Create((Instruction::CastOps)Opc, Op, DestTy);
return false;
@@ -3526,7 +3359,7 @@ bool LLParser::ParseSelect(Instruction *&Inst, PerFunctionState &PFS) {
/// ::= 'va_arg' TypeAndValue ',' Type
bool LLParser::ParseVA_Arg(Instruction *&Inst, PerFunctionState &PFS) {
Value *Op;
- PATypeHolder EltTy(Type::getVoidTy(Context));
+ Type *EltTy = 0;
LocTy TypeLoc;
if (ParseTypeAndValue(Op, PFS) ||
ParseToken(lltok::comma, "expected ',' after vaarg operand") ||
@@ -3598,11 +3431,10 @@ bool LLParser::ParseShuffleVector(Instruction *&Inst, PerFunctionState &PFS) {
/// ParsePHI
/// ::= 'phi' Type '[' Value ',' Value ']' (',' '[' Value ',' Value ']')*
int LLParser::ParsePHI(Instruction *&Inst, PerFunctionState &PFS) {
- PATypeHolder Ty(Type::getVoidTy(Context));
+ Type *Ty = 0; LocTy TypeLoc;
Value *Op0, *Op1;
- LocTy TypeLoc = Lex.getLoc();
- if (ParseType(Ty) ||
+ if (ParseType(Ty, TypeLoc) ||
ParseToken(lltok::lsquare, "expected '[' in phi value list") ||
ParseValue(Ty, Op0, PFS) ||
ParseToken(lltok::comma, "expected ',' after insertelement value") ||
@@ -3648,7 +3480,7 @@ bool LLParser::ParseCall(Instruction *&Inst, PerFunctionState &PFS,
bool isTail) {
unsigned RetAttrs, FnAttrs;
CallingConv::ID CC;
- PATypeHolder RetType(Type::getVoidTy(Context));
+ Type *RetType = 0;
LocTy RetTypeLoc;
ValID CalleeID;
SmallVector<ParamInfo, 16> ArgList;
@@ -3671,7 +3503,7 @@ bool LLParser::ParseCall(Instruction *&Inst, PerFunctionState &PFS,
if (!(PFTy = dyn_cast<PointerType>(RetType)) ||
!(Ty = dyn_cast<FunctionType>(PFTy->getElementType()))) {
// Pull out the types of all of the arguments...
- std::vector<const Type*> ParamTypes;
+ std::vector<Type*> ParamTypes;
for (unsigned i = 0, e = ArgList.size(); i != e; ++i)
ParamTypes.push_back(ArgList[i].V->getType());
@@ -3686,14 +3518,6 @@ bool LLParser::ParseCall(Instruction *&Inst, PerFunctionState &PFS,
Value *Callee;
if (ConvertValIDToValue(PFTy, CalleeID, Callee, &PFS)) return true;
- // FIXME: In LLVM 3.0, stop accepting zext, sext and inreg as optional
- // function attributes.
- unsigned ObsoleteFuncAttrs = Attribute::ZExt|Attribute::SExt|Attribute::InReg;
- if (FnAttrs & ObsoleteFuncAttrs) {
- RetAttrs |= FnAttrs & ObsoleteFuncAttrs;
- FnAttrs &= ~ObsoleteFuncAttrs;
- }
-
// Set up the Attributes for the function.
SmallVector<AttributeWithIndex, 8> Attrs;
if (RetAttrs != Attribute::None)
@@ -3715,7 +3539,7 @@ bool LLParser::ParseCall(Instruction *&Inst, PerFunctionState &PFS,
if (ExpectedTy && ExpectedTy != ArgList[i].V->getType())
return Error(ArgList[i].Loc, "argument is not of expected type '" +
- ExpectedTy->getDescription() + "'");
+ getTypeString(ExpectedTy) + "'");
Args.push_back(ArgList[i].V);
if (ArgList[i].Attrs != Attribute::None)
Attrs.push_back(AttributeWithIndex::get(i+1, ArgList[i].Attrs));
@@ -3730,7 +3554,7 @@ bool LLParser::ParseCall(Instruction *&Inst, PerFunctionState &PFS,
// Finish off the Attributes and check them
AttrListPtr PAL = AttrListPtr::get(Attrs.begin(), Attrs.end());
- CallInst *CI = CallInst::Create(Callee, Args.begin(), Args.end());
+ CallInst *CI = CallInst::Create(Callee, Args);
CI->setTailCall(isTail);
CI->setCallingConv(CC);
CI->setAttributes(PAL);
@@ -3743,14 +3567,12 @@ bool LLParser::ParseCall(Instruction *&Inst, PerFunctionState &PFS,
//===----------------------------------------------------------------------===//
/// ParseAlloc
-/// ::= 'malloc' Type (',' TypeAndValue)? (',' OptionalInfo)?
/// ::= 'alloca' Type (',' TypeAndValue)? (',' OptionalInfo)?
-int LLParser::ParseAlloc(Instruction *&Inst, PerFunctionState &PFS,
- BasicBlock* BB, bool isAlloca) {
- PATypeHolder Ty(Type::getVoidTy(Context));
+int LLParser::ParseAlloc(Instruction *&Inst, PerFunctionState &PFS) {
Value *Size = 0;
LocTy SizeLoc;
unsigned Alignment = 0;
+ Type *Ty = 0;
if (ParseType(Ty)) return true;
bool AteExtraComma = false;
@@ -3769,37 +3591,8 @@ int LLParser::ParseAlloc(Instruction *&Inst, PerFunctionState &PFS,
if (Size && !Size->getType()->isIntegerTy())
return Error(SizeLoc, "element count must have integer type");
- if (isAlloca) {
- Inst = new AllocaInst(Ty, Size, Alignment);
- return AteExtraComma ? InstExtraComma : InstNormal;
- }
-
- // Autoupgrade old malloc instruction to malloc call.
- // FIXME: Remove in LLVM 3.0.
- if (Size && !Size->getType()->isIntegerTy(32))
- return Error(SizeLoc, "element count must be i32");
- const Type *IntPtrTy = Type::getInt32Ty(Context);
- Constant *AllocSize = ConstantExpr::getSizeOf(Ty);
- AllocSize = ConstantExpr::getTruncOrBitCast(AllocSize, IntPtrTy);
- if (!MallocF)
- // Prototype malloc as "void *(int32)".
- // This function is renamed as "malloc" in ValidateEndOfModule().
- MallocF = cast<Function>(
- M->getOrInsertFunction("", Type::getInt8PtrTy(Context), IntPtrTy, NULL));
- Inst = CallInst::CreateMalloc(BB, IntPtrTy, Ty, AllocSize, Size, MallocF);
-return AteExtraComma ? InstExtraComma : InstNormal;
-}
-
-/// ParseFree
-/// ::= 'free' TypeAndValue
-bool LLParser::ParseFree(Instruction *&Inst, PerFunctionState &PFS,
- BasicBlock* BB) {
- Value *Val; LocTy Loc;
- if (ParseTypeAndValue(Val, Loc, PFS)) return true;
- if (!Val->getType()->isPointerTy())
- return Error(Loc, "operand to free must be a pointer");
- Inst = CallInst::CreateFree(Val, BB);
- return false;
+ Inst = new AllocaInst(Ty, Size, Alignment);
+ return AteExtraComma ? InstExtraComma : InstNormal;
}
/// ParseLoad
@@ -3845,25 +3638,6 @@ int LLParser::ParseStore(Instruction *&Inst, PerFunctionState &PFS,
return AteExtraComma ? InstExtraComma : InstNormal;
}
-/// ParseGetResult
-/// ::= 'getresult' TypeAndValue ',' i32
-/// FIXME: Remove support for getresult in LLVM 3.0
-bool LLParser::ParseGetResult(Instruction *&Inst, PerFunctionState &PFS) {
- Value *Val; LocTy ValLoc, EltLoc;
- unsigned Element;
- if (ParseTypeAndValue(Val, ValLoc, PFS) ||
- ParseToken(lltok::comma, "expected ',' after getresult operand") ||
- ParseUInt32(Element, EltLoc))
- return true;
-
- if (!Val->getType()->isStructTy() && !Val->getType()->isArrayTy())
- return Error(ValLoc, "getresult inst requires an aggregate operand");
- if (!ExtractValueInst::getIndexedType(Val->getType(), Element))
- return Error(EltLoc, "invalid getresult index for value");
- Inst = ExtractValueInst::Create(Val, Element);
- return false;
-}
-
/// ParseGetElementPtr
/// ::= 'getelementptr' 'inbounds'? TypeAndValue (',' TypeAndValue)*
int LLParser::ParseGetElementPtr(Instruction *&Inst, PerFunctionState &PFS) {
@@ -3911,10 +3685,9 @@ int LLParser::ParseExtractValue(Instruction *&Inst, PerFunctionState &PFS) {
if (!Val->getType()->isAggregateType())
return Error(Loc, "extractvalue operand must be aggregate type");
- if (!ExtractValueInst::getIndexedType(Val->getType(), Indices.begin(),
- Indices.end()))
+ if (!ExtractValueInst::getIndexedType(Val->getType(), Indices))
return Error(Loc, "invalid indices for extractvalue");
- Inst = ExtractValueInst::Create(Val, Indices.begin(), Indices.end());
+ Inst = ExtractValueInst::Create(Val, Indices);
return AteExtraComma ? InstExtraComma : InstNormal;
}
@@ -3933,10 +3706,9 @@ int LLParser::ParseInsertValue(Instruction *&Inst, PerFunctionState &PFS) {
if (!Val0->getType()->isAggregateType())
return Error(Loc0, "insertvalue operand must be aggregate type");
- if (!ExtractValueInst::getIndexedType(Val0->getType(), Indices.begin(),
- Indices.end()))
+ if (!ExtractValueInst::getIndexedType(Val0->getType(), Indices))
return Error(Loc0, "invalid indices for insertvalue");
- Inst = InsertValueInst::Create(Val0, Val1, Indices.begin(), Indices.end());
+ Inst = InsertValueInst::Create(Val0, Val1, Indices);
return AteExtraComma ? InstExtraComma : InstNormal;
}
@@ -3962,12 +3734,7 @@ bool LLParser::ParseMDNodeVector(SmallVectorImpl<Value*> &Elts,
}
Value *V = 0;
- PATypeHolder Ty(Type::getVoidTy(Context));
- ValID ID;
- if (ParseType(Ty) || ParseValID(ID, PFS) ||
- ConvertValIDToValue(Ty, ID, V, PFS))
- return true;
-
+ if (ParseTypeAndValue(V, PFS)) return true;
Elts.push_back(V);
} while (EatIfPresent(lltok::comma));
diff --git a/contrib/llvm/lib/AsmParser/LLParser.h b/contrib/llvm/lib/AsmParser/LLParser.h
index 93e7f77..9630657 100644
--- a/contrib/llvm/lib/AsmParser/LLParser.h
+++ b/contrib/llvm/lib/AsmParser/LLParser.h
@@ -18,6 +18,7 @@
#include "llvm/Module.h"
#include "llvm/Type.h"
#include "llvm/ADT/DenseMap.h"
+#include "llvm/ADT/StringMap.h"
#include "llvm/Support/ValueHandle.h"
#include <map>
@@ -32,6 +33,7 @@ namespace llvm {
class GlobalValue;
class MDString;
class MDNode;
+ class StructType;
/// ValID - Represents a reference of a definition of some sort with no type.
/// There are several cases where we have to parse the value but where the
@@ -47,7 +49,9 @@ namespace llvm {
t_Constant, // Value in ConstantVal.
t_InlineAsm, // Value in StrVal/StrVal2/UIntVal.
t_MDNode, // Value in MDNodeVal.
- t_MDString // Value in MDStringVal.
+ t_MDString, // Value in MDStringVal.
+ t_ConstantStruct, // Value in ConstantStructElts.
+ t_PackedConstantStruct // Value in ConstantStructElts.
} Kind;
LLLexer::LocTy Loc;
@@ -58,12 +62,19 @@ namespace llvm {
Constant *ConstantVal;
MDNode *MDNodeVal;
MDString *MDStringVal;
- ValID() : APFloatVal(0.0) {}
+ Constant **ConstantStructElts;
+
+ ValID() : Kind(t_LocalID), APFloatVal(0.0) {}
+ ~ValID() {
+ if (Kind == t_ConstantStruct || Kind == t_PackedConstantStruct)
+ delete [] ConstantStructElts;
+ }
bool operator<(const ValID &RHS) const {
if (Kind == t_LocalID || Kind == t_GlobalID)
return UIntVal < RHS.UIntVal;
- assert((Kind == t_LocalName || Kind == t_GlobalName) &&
+ assert((Kind == t_LocalName || Kind == t_GlobalName ||
+ Kind == t_ConstantStruct || Kind == t_PackedConstantStruct) &&
"Ordering not defined for this ValID kind yet");
return StrVal < RHS.StrVal;
}
@@ -93,33 +104,13 @@ namespace llvm {
};
DenseMap<Instruction*, std::vector<MDRef> > ForwardRefInstMetadata;
- // Type resolution handling data structures.
- std::map<std::string, std::pair<PATypeHolder, LocTy> > ForwardRefTypes;
- std::map<unsigned, std::pair<PATypeHolder, LocTy> > ForwardRefTypeIDs;
- std::vector<PATypeHolder> NumberedTypes;
+ // Type resolution handling data structures. The location is set when we
+ // have processed a use of the type but not a definition yet.
+ StringMap<std::pair<Type*, LocTy> > NamedTypes;
+ std::vector<std::pair<Type*, LocTy> > NumberedTypes;
+
std::vector<TrackingVH<MDNode> > NumberedMetadata;
std::map<unsigned, std::pair<TrackingVH<MDNode>, LocTy> > ForwardRefMDNodes;
- struct UpRefRecord {
- /// Loc - This is the location of the upref.
- LocTy Loc;
-
- /// NestingLevel - The number of nesting levels that need to be popped
- /// before this type is resolved.
- unsigned NestingLevel;
-
- /// LastContainedTy - This is the type at the current binding level for
- /// the type. Every time we reduce the nesting level, this gets updated.
- const Type *LastContainedTy;
-
- /// UpRefTy - This is the actual opaque type that the upreference is
- /// represented with.
- OpaqueType *UpRefTy;
-
- UpRefRecord(LocTy L, unsigned NL, OpaqueType *URTy)
- : Loc(L), NestingLevel(NL), LastContainedTy((Type*)URTy),
- UpRefTy(URTy) {}
- };
- std::vector<UpRefRecord> UpRefs;
// Global Value reference information.
std::map<std::string, std::pair<GlobalValue*, LocTy> > ForwardRefVals;
@@ -131,14 +122,13 @@ namespace llvm {
std::map<ValID, std::vector<std::pair<ValID, GlobalValue*> > >
ForwardRefBlockAddresses;
- Function *MallocF;
public:
LLParser(MemoryBuffer *F, SourceMgr &SM, SMDiagnostic &Err, Module *m) :
Context(m->getContext()), Lex(F, SM, Err, m->getContext()),
- M(m), MallocF(NULL) {}
+ M(m) {}
bool Run();
- LLVMContext& getContext() { return Context; }
+ LLVMContext &getContext() { return Context; }
private:
@@ -223,16 +213,19 @@ namespace llvm {
bool ParseMDNodeID(MDNode *&Result, unsigned &SlotNo);
// Type Parsing.
- bool ParseType(PATypeHolder &Result, bool AllowVoid = false);
- bool ParseType(PATypeHolder &Result, LocTy &Loc, bool AllowVoid = false) {
+ bool ParseType(Type *&Result, bool AllowVoid = false);
+ bool ParseType(Type *&Result, LocTy &Loc, bool AllowVoid = false) {
Loc = Lex.getLoc();
return ParseType(Result, AllowVoid);
}
- bool ParseTypeRec(PATypeHolder &H);
- bool ParseStructType(PATypeHolder &H, bool Packed);
- bool ParseArrayVectorType(PATypeHolder &H, bool isVector);
- bool ParseFunctionType(PATypeHolder &Result);
- PATypeHolder HandleUpRefs(const Type *Ty);
+ bool ParseAnonStructType(Type *&Result, bool Packed);
+ bool ParseStructBody(SmallVectorImpl<Type*> &Body);
+ bool ParseStructDefinition(SMLoc TypeLoc, StringRef Name,
+ std::pair<Type*, LocTy> &Entry,
+ Type *&ResultTy);
+
+ bool ParseArrayVectorType(Type *&Result, bool isVector);
+ bool ParseFunctionType(Type *&Result);
// Function Semantic Analysis.
class PerFunctionState {
@@ -279,14 +272,20 @@ namespace llvm {
bool ConvertValIDToValue(const Type *Ty, ValID &ID, Value *&V,
PerFunctionState *PFS);
- bool ParseValue(const Type *Ty, Value *&V, PerFunctionState &PFS);
+ bool ParseValue(const Type *Ty, Value *&V, PerFunctionState *PFS);
+ bool ParseValue(const Type *Ty, Value *&V, PerFunctionState &PFS) {
+ return ParseValue(Ty, V, &PFS);
+ }
bool ParseValue(const Type *Ty, Value *&V, LocTy &Loc,
PerFunctionState &PFS) {
Loc = Lex.getLoc();
- return ParseValue(Ty, V, PFS);
+ return ParseValue(Ty, V, &PFS);
}
- bool ParseTypeAndValue(Value *&V, PerFunctionState &PFS);
+ bool ParseTypeAndValue(Value *&V, PerFunctionState *PFS);
+ bool ParseTypeAndValue(Value *&V, PerFunctionState &PFS) {
+ return ParseTypeAndValue(V, &PFS);
+ }
bool ParseTypeAndValue(Value *&V, LocTy &Loc, PerFunctionState &PFS) {
Loc = Lex.getLoc();
return ParseTypeAndValue(V, PFS);
@@ -322,14 +321,13 @@ namespace llvm {
// Function Parsing.
struct ArgInfo {
LocTy Loc;
- PATypeHolder Type;
+ Type *Ty;
unsigned Attrs;
std::string Name;
- ArgInfo(LocTy L, PATypeHolder Ty, unsigned Attr, const std::string &N)
- : Loc(L), Type(Ty), Attrs(Attr), Name(N) {}
+ ArgInfo(LocTy L, Type *ty, unsigned Attr, const std::string &N)
+ : Loc(L), Ty(ty), Attrs(Attr), Name(N) {}
};
- bool ParseArgumentList(std::vector<ArgInfo> &ArgList,
- bool &isVarArg, bool inType);
+ bool ParseArgumentList(SmallVectorImpl<ArgInfo> &ArgList, bool &isVarArg);
bool ParseFunctionHeader(Function *&Fn, bool isDefine);
bool ParseFunctionBody(Function &Fn);
bool ParseBasicBlock(PerFunctionState &PFS);
@@ -341,7 +339,7 @@ namespace llvm {
PerFunctionState &PFS);
bool ParseCmpPredicate(unsigned &Pred, unsigned Opc);
- int ParseRet(Instruction *&Inst, BasicBlock *BB, PerFunctionState &PFS);
+ bool ParseRet(Instruction *&Inst, BasicBlock *BB, PerFunctionState &PFS);
bool ParseBr(Instruction *&Inst, PerFunctionState &PFS);
bool ParseSwitch(Instruction *&Inst, PerFunctionState &PFS);
bool ParseIndirectBr(Instruction *&Inst, PerFunctionState &PFS);
@@ -359,12 +357,9 @@ namespace llvm {
bool ParseShuffleVector(Instruction *&I, PerFunctionState &PFS);
int ParsePHI(Instruction *&I, PerFunctionState &PFS);
bool ParseCall(Instruction *&I, PerFunctionState &PFS, bool isTail);
- int ParseAlloc(Instruction *&I, PerFunctionState &PFS,
- BasicBlock *BB = 0, bool isAlloca = true);
- bool ParseFree(Instruction *&I, PerFunctionState &PFS, BasicBlock *BB);
+ int ParseAlloc(Instruction *&I, PerFunctionState &PFS);
int ParseLoad(Instruction *&I, PerFunctionState &PFS, bool isVolatile);
int ParseStore(Instruction *&I, PerFunctionState &PFS, bool isVolatile);
- bool ParseGetResult(Instruction *&I, PerFunctionState &PFS);
int ParseGetElementPtr(Instruction *&I, PerFunctionState &PFS);
int ParseExtractValue(Instruction *&I, PerFunctionState &PFS);
int ParseInsertValue(Instruction *&I, PerFunctionState &PFS);
diff --git a/contrib/llvm/lib/AsmParser/LLToken.h b/contrib/llvm/lib/AsmParser/LLToken.h
index 02f97a3..a5f89fc 100644
--- a/contrib/llvm/lib/AsmParser/LLToken.h
+++ b/contrib/llvm/lib/AsmParser/LLToken.h
@@ -32,7 +32,6 @@ namespace lltok {
exclaim, // !
kw_x,
- kw_begin, kw_end,
kw_true, kw_false,
kw_declare, kw_define,
kw_global, kw_constant,
@@ -99,6 +98,7 @@ namespace lltok {
kw_noimplicitfloat,
kw_naked,
kw_hotpatch,
+ kw_nonlazybind,
kw_type,
kw_opaque,
@@ -121,9 +121,9 @@ namespace lltok {
kw_ret, kw_br, kw_switch, kw_indirectbr, kw_invoke, kw_unwind,
kw_unreachable,
- kw_malloc, kw_alloca, kw_free, kw_load, kw_store, kw_getelementptr,
+ kw_alloca, kw_load, kw_store, kw_getelementptr,
- kw_extractelement, kw_insertelement, kw_shufflevector, kw_getresult,
+ kw_extractelement, kw_insertelement, kw_shufflevector,
kw_extractvalue, kw_insertvalue, kw_blockaddress,
// Unsigned Valued tokens (UIntVal).
diff --git a/contrib/llvm/lib/Bitcode/Reader/BitcodeReader.cpp b/contrib/llvm/lib/Bitcode/Reader/BitcodeReader.cpp
index bc995ae..24c2994 100644
--- a/contrib/llvm/lib/Bitcode/Reader/BitcodeReader.cpp
+++ b/contrib/llvm/lib/Bitcode/Reader/BitcodeReader.cpp
@@ -31,7 +31,7 @@ void BitcodeReader::FreeState() {
if (BufferOwned)
delete Buffer;
Buffer = 0;
- std::vector<PATypeHolder>().swap(TypeList);
+ std::vector<Type*>().swap(TypeList);
ValueList.clear();
MDValueList.clear();
@@ -292,11 +292,9 @@ void BitcodeReaderValueList::ResolveConstantForwardRefs() {
// Make the new constant.
Constant *NewC;
if (ConstantArray *UserCA = dyn_cast<ConstantArray>(UserC)) {
- NewC = ConstantArray::get(UserCA->getType(), &NewOps[0],
- NewOps.size());
+ NewC = ConstantArray::get(UserCA->getType(), NewOps);
} else if (ConstantStruct *UserCS = dyn_cast<ConstantStruct>(UserC)) {
- NewC = ConstantStruct::get(Context, &NewOps[0], NewOps.size(),
- UserCS->getType()->isPacked());
+ NewC = ConstantStruct::get(UserCS->getType(), NewOps);
} else if (isa<ConstantVector>(UserC)) {
NewC = ConstantVector::get(NewOps);
} else {
@@ -354,19 +352,28 @@ Value *BitcodeReaderMDValueList::getValueFwdRef(unsigned Idx) {
return V;
}
-const Type *BitcodeReader::getTypeByID(unsigned ID, bool isTypeTable) {
- // If the TypeID is in range, return it.
- if (ID < TypeList.size())
- return TypeList[ID].get();
- if (!isTypeTable) return 0;
-
- // The type table allows forward references. Push as many Opaque types as
- // needed to get up to ID.
- while (TypeList.size() <= ID)
- TypeList.push_back(OpaqueType::get(Context));
- return TypeList.back().get();
+Type *BitcodeReader::getTypeByID(unsigned ID) {
+ // The type table size is always specified correctly.
+ if (ID >= TypeList.size())
+ return 0;
+
+ if (Type *Ty = TypeList[ID])
+ return Ty;
+
+ // If we have a forward reference, the only possible case is when it is to a
+ // named struct. Just create a placeholder for now.
+ return TypeList[ID] = StructType::createNamed(Context, "");
}
+/// FIXME: Remove in LLVM 3.1, only used by ParseOldTypeTable.
+Type *BitcodeReader::getTypeByIDOrNull(unsigned ID) {
+ if (ID >= TypeList.size())
+ TypeList.resize(ID+1);
+
+ return TypeList[ID];
+}
+
+
//===----------------------------------------------------------------------===//
// Functions for parsing blocks from the bitcode file
//===----------------------------------------------------------------------===//
@@ -473,17 +480,22 @@ bool BitcodeReader::ParseAttributeBlock() {
}
}
-
bool BitcodeReader::ParseTypeTable() {
- if (Stream.EnterSubBlock(bitc::TYPE_BLOCK_ID))
+ if (Stream.EnterSubBlock(bitc::TYPE_BLOCK_ID_NEW))
return Error("Malformed block record");
+
+ return ParseTypeTableBody();
+}
+bool BitcodeReader::ParseTypeTableBody() {
if (!TypeList.empty())
return Error("Multiple TYPE_BLOCKs found!");
SmallVector<uint64_t, 64> Record;
unsigned NumRecords = 0;
+ SmallString<64> TypeName;
+
// Read all the records for this type table.
while (1) {
unsigned Code = Stream.ReadCode();
@@ -510,17 +522,15 @@ bool BitcodeReader::ParseTypeTable() {
// Read a record.
Record.clear();
- const Type *ResultTy = 0;
+ Type *ResultTy = 0;
switch (Stream.ReadRecord(Code, Record)) {
- default: // Default behavior: unknown type.
- ResultTy = 0;
- break;
+ default: return Error("unknown type in type table");
case bitc::TYPE_CODE_NUMENTRY: // TYPE_CODE_NUMENTRY: [numentries]
// TYPE_CODE_NUMENTRY contains a count of the number of types in the
// type list. This allows us to reserve space.
if (Record.size() < 1)
return Error("Invalid TYPE_CODE_NUMENTRY record");
- TypeList.reserve(Record[0]);
+ TypeList.resize(Record[0]);
continue;
case bitc::TYPE_CODE_VOID: // VOID
ResultTy = Type::getVoidTy(Context);
@@ -543,9 +553,6 @@ bool BitcodeReader::ParseTypeTable() {
case bitc::TYPE_CODE_LABEL: // LABEL
ResultTy = Type::getLabelTy(Context);
break;
- case bitc::TYPE_CODE_OPAQUE: // OPAQUE
- ResultTy = 0;
- break;
case bitc::TYPE_CODE_METADATA: // METADATA
ResultTy = Type::getMetadataTy(Context);
break;
@@ -565,8 +572,9 @@ bool BitcodeReader::ParseTypeTable() {
unsigned AddressSpace = 0;
if (Record.size() == 2)
AddressSpace = Record[1];
- ResultTy = PointerType::get(getTypeByID(Record[0], true),
- AddressSpace);
+ ResultTy = getTypeByID(Record[0]);
+ if (ResultTy == 0) return Error("invalid element type in pointer type");
+ ResultTy = PointerType::get(ResultTy, AddressSpace);
break;
}
case bitc::TYPE_CODE_FUNCTION: {
@@ -574,69 +582,306 @@ bool BitcodeReader::ParseTypeTable() {
// FUNCTION: [vararg, attrid, retty, paramty x N]
if (Record.size() < 3)
return Error("Invalid FUNCTION type record");
- std::vector<const Type*> ArgTys;
- for (unsigned i = 3, e = Record.size(); i != e; ++i)
- ArgTys.push_back(getTypeByID(Record[i], true));
+ std::vector<Type*> ArgTys;
+ for (unsigned i = 3, e = Record.size(); i != e; ++i) {
+ if (Type *T = getTypeByID(Record[i]))
+ ArgTys.push_back(T);
+ else
+ break;
+ }
+
+ ResultTy = getTypeByID(Record[2]);
+ if (ResultTy == 0 || ArgTys.size() < Record.size()-3)
+ return Error("invalid type in function type");
- ResultTy = FunctionType::get(getTypeByID(Record[2], true), ArgTys,
- Record[0]);
+ ResultTy = FunctionType::get(ResultTy, ArgTys, Record[0]);
break;
}
- case bitc::TYPE_CODE_STRUCT: { // STRUCT: [ispacked, eltty x N]
+ case bitc::TYPE_CODE_STRUCT_ANON: { // STRUCT: [ispacked, eltty x N]
if (Record.size() < 1)
return Error("Invalid STRUCT type record");
- std::vector<const Type*> EltTys;
- for (unsigned i = 1, e = Record.size(); i != e; ++i)
- EltTys.push_back(getTypeByID(Record[i], true));
+ std::vector<Type*> EltTys;
+ for (unsigned i = 1, e = Record.size(); i != e; ++i) {
+ if (Type *T = getTypeByID(Record[i]))
+ EltTys.push_back(T);
+ else
+ break;
+ }
+ if (EltTys.size() != Record.size()-1)
+ return Error("invalid type in struct type");
ResultTy = StructType::get(Context, EltTys, Record[0]);
break;
}
+ case bitc::TYPE_CODE_STRUCT_NAME: // STRUCT_NAME: [strchr x N]
+ if (ConvertToString(Record, 0, TypeName))
+ return Error("Invalid STRUCT_NAME record");
+ continue;
+
+ case bitc::TYPE_CODE_STRUCT_NAMED: { // STRUCT: [ispacked, eltty x N]
+ if (Record.size() < 1)
+ return Error("Invalid STRUCT type record");
+
+ if (NumRecords >= TypeList.size())
+ return Error("invalid TYPE table");
+
+ // Check to see if this was forward referenced, if so fill in the temp.
+ StructType *Res = cast_or_null<StructType>(TypeList[NumRecords]);
+ if (Res) {
+ Res->setName(TypeName);
+ TypeList[NumRecords] = 0;
+ } else // Otherwise, create a new struct.
+ Res = StructType::createNamed(Context, TypeName);
+ TypeName.clear();
+
+ SmallVector<Type*, 8> EltTys;
+ for (unsigned i = 1, e = Record.size(); i != e; ++i) {
+ if (Type *T = getTypeByID(Record[i]))
+ EltTys.push_back(T);
+ else
+ break;
+ }
+ if (EltTys.size() != Record.size()-1)
+ return Error("invalid STRUCT type record");
+ Res->setBody(EltTys, Record[0]);
+ ResultTy = Res;
+ break;
+ }
+ case bitc::TYPE_CODE_OPAQUE: { // OPAQUE: []
+ if (Record.size() != 1)
+ return Error("Invalid OPAQUE type record");
+
+ if (NumRecords >= TypeList.size())
+ return Error("invalid TYPE table");
+
+ // Check to see if this was forward referenced, if so fill in the temp.
+ StructType *Res = cast_or_null<StructType>(TypeList[NumRecords]);
+ if (Res) {
+ Res->setName(TypeName);
+ TypeList[NumRecords] = 0;
+ } else // Otherwise, create a new struct with no body.
+ Res = StructType::createNamed(Context, TypeName);
+ TypeName.clear();
+ ResultTy = Res;
+ break;
+ }
case bitc::TYPE_CODE_ARRAY: // ARRAY: [numelts, eltty]
if (Record.size() < 2)
return Error("Invalid ARRAY type record");
- ResultTy = ArrayType::get(getTypeByID(Record[1], true), Record[0]);
+ if ((ResultTy = getTypeByID(Record[1])))
+ ResultTy = ArrayType::get(ResultTy, Record[0]);
+ else
+ return Error("Invalid ARRAY type element");
break;
case bitc::TYPE_CODE_VECTOR: // VECTOR: [numelts, eltty]
if (Record.size() < 2)
return Error("Invalid VECTOR type record");
- ResultTy = VectorType::get(getTypeByID(Record[1], true), Record[0]);
+ if ((ResultTy = getTypeByID(Record[1])))
+ ResultTy = VectorType::get(ResultTy, Record[0]);
+ else
+ return Error("Invalid ARRAY type element");
break;
}
- if (NumRecords == TypeList.size()) {
- // If this is a new type slot, just append it.
- TypeList.push_back(ResultTy ? ResultTy : OpaqueType::get(Context));
- ++NumRecords;
- } else if (ResultTy == 0) {
- // Otherwise, this was forward referenced, so an opaque type was created,
- // but the result type is actually just an opaque. Leave the one we
- // created previously.
- ++NumRecords;
- } else {
- // Otherwise, this was forward referenced, so an opaque type was created.
- // Resolve the opaque type to the real type now.
- assert(NumRecords < TypeList.size() && "Typelist imbalance");
- const OpaqueType *OldTy = cast<OpaqueType>(TypeList[NumRecords++].get());
-
- // Don't directly push the new type on the Tab. Instead we want to replace
- // the opaque type we previously inserted with the new concrete value. The
- // refinement from the abstract (opaque) type to the new type causes all
- // uses of the abstract type to use the concrete type (NewTy). This will
- // also cause the opaque type to be deleted.
- const_cast<OpaqueType*>(OldTy)->refineAbstractTypeTo(ResultTy);
-
- // This should have replaced the old opaque type with the new type in the
- // value table... or with a preexisting type that was already in the
- // system. Let's just make sure it did.
- assert(TypeList[NumRecords-1].get() != OldTy &&
- "refineAbstractType didn't work!");
+ if (NumRecords >= TypeList.size())
+ return Error("invalid TYPE table");
+ assert(ResultTy && "Didn't read a type?");
+ assert(TypeList[NumRecords] == 0 && "Already read type?");
+ TypeList[NumRecords++] = ResultTy;
+ }
+}
+
+// FIXME: Remove in LLVM 3.1
+bool BitcodeReader::ParseOldTypeTable() {
+ if (Stream.EnterSubBlock(bitc::TYPE_BLOCK_ID_OLD))
+ return Error("Malformed block record");
+
+ if (!TypeList.empty())
+ return Error("Multiple TYPE_BLOCKs found!");
+
+
+ // While horrible, we have no good ordering of types in the bc file. Just
+ // iteratively parse types out of the bc file in multiple passes until we get
+ // them all. Do this by saving a cursor for the start of the type block.
+ BitstreamCursor StartOfTypeBlockCursor(Stream);
+
+ unsigned NumTypesRead = 0;
+
+ SmallVector<uint64_t, 64> Record;
+RestartScan:
+ unsigned NextTypeID = 0;
+ bool ReadAnyTypes = false;
+
+ // Read all the records for this type table.
+ while (1) {
+ unsigned Code = Stream.ReadCode();
+ if (Code == bitc::END_BLOCK) {
+ if (NextTypeID != TypeList.size())
+ return Error("Invalid type forward reference in TYPE_BLOCK_ID_OLD");
+
+ // If we haven't read all of the types yet, iterate again.
+ if (NumTypesRead != TypeList.size()) {
+ // If we didn't successfully read any types in this pass, then we must
+ // have an unhandled forward reference.
+ if (!ReadAnyTypes)
+ return Error("Obsolete bitcode contains unhandled recursive type");
+
+ Stream = StartOfTypeBlockCursor;
+ goto RestartScan;
+ }
+
+ if (Stream.ReadBlockEnd())
+ return Error("Error at end of type table block");
+ return false;
+ }
+
+ if (Code == bitc::ENTER_SUBBLOCK) {
+ // No known subblocks, always skip them.
+ Stream.ReadSubBlockID();
+ if (Stream.SkipBlock())
+ return Error("Malformed block record");
+ continue;
+ }
+
+ if (Code == bitc::DEFINE_ABBREV) {
+ Stream.ReadAbbrevRecord();
+ continue;
}
+
+ // Read a record.
+ Record.clear();
+ Type *ResultTy = 0;
+ switch (Stream.ReadRecord(Code, Record)) {
+ default: return Error("unknown type in type table");
+ case bitc::TYPE_CODE_NUMENTRY: // TYPE_CODE_NUMENTRY: [numentries]
+ // TYPE_CODE_NUMENTRY contains a count of the number of types in the
+ // type list. This allows us to reserve space.
+ if (Record.size() < 1)
+ return Error("Invalid TYPE_CODE_NUMENTRY record");
+ TypeList.resize(Record[0]);
+ continue;
+ case bitc::TYPE_CODE_VOID: // VOID
+ ResultTy = Type::getVoidTy(Context);
+ break;
+ case bitc::TYPE_CODE_FLOAT: // FLOAT
+ ResultTy = Type::getFloatTy(Context);
+ break;
+ case bitc::TYPE_CODE_DOUBLE: // DOUBLE
+ ResultTy = Type::getDoubleTy(Context);
+ break;
+ case bitc::TYPE_CODE_X86_FP80: // X86_FP80
+ ResultTy = Type::getX86_FP80Ty(Context);
+ break;
+ case bitc::TYPE_CODE_FP128: // FP128
+ ResultTy = Type::getFP128Ty(Context);
+ break;
+ case bitc::TYPE_CODE_PPC_FP128: // PPC_FP128
+ ResultTy = Type::getPPC_FP128Ty(Context);
+ break;
+ case bitc::TYPE_CODE_LABEL: // LABEL
+ ResultTy = Type::getLabelTy(Context);
+ break;
+ case bitc::TYPE_CODE_METADATA: // METADATA
+ ResultTy = Type::getMetadataTy(Context);
+ break;
+ case bitc::TYPE_CODE_X86_MMX: // X86_MMX
+ ResultTy = Type::getX86_MMXTy(Context);
+ break;
+ case bitc::TYPE_CODE_INTEGER: // INTEGER: [width]
+ if (Record.size() < 1)
+ return Error("Invalid Integer type record");
+ ResultTy = IntegerType::get(Context, Record[0]);
+ break;
+ case bitc::TYPE_CODE_OPAQUE: // OPAQUE
+ if (NextTypeID < TypeList.size() && TypeList[NextTypeID] == 0)
+ ResultTy = StructType::createNamed(Context, "");
+ break;
+ case bitc::TYPE_CODE_STRUCT_OLD: {// STRUCT_OLD
+ if (NextTypeID >= TypeList.size()) break;
+ // If we already read it, don't reprocess.
+ if (TypeList[NextTypeID] &&
+ !cast<StructType>(TypeList[NextTypeID])->isOpaque())
+ break;
+
+ // Set a type.
+ if (TypeList[NextTypeID] == 0)
+ TypeList[NextTypeID] = StructType::createNamed(Context, "");
+
+ std::vector<Type*> EltTys;
+ for (unsigned i = 1, e = Record.size(); i != e; ++i) {
+ if (Type *Elt = getTypeByIDOrNull(Record[i]))
+ EltTys.push_back(Elt);
+ else
+ break;
+ }
+
+ if (EltTys.size() != Record.size()-1)
+ break; // Not all elements are ready.
+
+ cast<StructType>(TypeList[NextTypeID])->setBody(EltTys, Record[0]);
+ ResultTy = TypeList[NextTypeID];
+ TypeList[NextTypeID] = 0;
+ break;
+ }
+ case bitc::TYPE_CODE_POINTER: { // POINTER: [pointee type] or
+ // [pointee type, address space]
+ if (Record.size() < 1)
+ return Error("Invalid POINTER type record");
+ unsigned AddressSpace = 0;
+ if (Record.size() == 2)
+ AddressSpace = Record[1];
+ if ((ResultTy = getTypeByIDOrNull(Record[0])))
+ ResultTy = PointerType::get(ResultTy, AddressSpace);
+ break;
+ }
+ case bitc::TYPE_CODE_FUNCTION: {
+ // FIXME: attrid is dead, remove it in LLVM 3.0
+ // FUNCTION: [vararg, attrid, retty, paramty x N]
+ if (Record.size() < 3)
+ return Error("Invalid FUNCTION type record");
+ std::vector<Type*> ArgTys;
+ for (unsigned i = 3, e = Record.size(); i != e; ++i) {
+ if (Type *Elt = getTypeByIDOrNull(Record[i]))
+ ArgTys.push_back(Elt);
+ else
+ break;
+ }
+ if (ArgTys.size()+3 != Record.size())
+ break; // Something was null.
+ if ((ResultTy = getTypeByIDOrNull(Record[2])))
+ ResultTy = FunctionType::get(ResultTy, ArgTys, Record[0]);
+ break;
+ }
+ case bitc::TYPE_CODE_ARRAY: // ARRAY: [numelts, eltty]
+ if (Record.size() < 2)
+ return Error("Invalid ARRAY type record");
+ if ((ResultTy = getTypeByIDOrNull(Record[1])))
+ ResultTy = ArrayType::get(ResultTy, Record[0]);
+ break;
+ case bitc::TYPE_CODE_VECTOR: // VECTOR: [numelts, eltty]
+ if (Record.size() < 2)
+ return Error("Invalid VECTOR type record");
+ if ((ResultTy = getTypeByIDOrNull(Record[1])))
+ ResultTy = VectorType::get(ResultTy, Record[0]);
+ break;
+ }
+
+ if (NextTypeID >= TypeList.size())
+ return Error("invalid TYPE table");
+
+ if (ResultTy && TypeList[NextTypeID] == 0) {
+ ++NumTypesRead;
+ ReadAnyTypes = true;
+
+ TypeList[NextTypeID] = ResultTy;
+ }
+
+ ++NextTypeID;
}
}
-bool BitcodeReader::ParseTypeSymbolTable() {
- if (Stream.EnterSubBlock(bitc::TYPE_SYMTAB_BLOCK_ID))
+bool BitcodeReader::ParseOldTypeSymbolTable() {
+ if (Stream.EnterSubBlock(bitc::TYPE_SYMTAB_BLOCK_ID_OLD))
return Error("Malformed block record");
SmallVector<uint64_t, 64> Record;
@@ -676,7 +921,10 @@ bool BitcodeReader::ParseTypeSymbolTable() {
if (TypeID >= TypeList.size())
return Error("Invalid Type ID in TST_ENTRY record");
- TheModule->addTypeName(TypeName, TypeList[TypeID].get());
+ // Only apply the type name to a struct type with no name.
+ if (StructType *STy = dyn_cast<StructType>(TypeList[TypeID]))
+ if (!STy->isAnonymous() && !STy->hasName())
+ STy->setName(TypeName);
TypeName.clear();
break;
}
@@ -790,13 +1038,9 @@ bool BitcodeReader::ParseMetadata() {
Record.clear();
Code = Stream.ReadCode();
- // METADATA_NAME is always followed by METADATA_NAMED_NODE2.
- // Or METADATA_NAMED_NODE in LLVM 2.7. FIXME: Remove this in LLVM 3.0.
+ // METADATA_NAME is always followed by METADATA_NAMED_NODE.
unsigned NextBitCode = Stream.ReadRecord(Code, Record);
- if (NextBitCode == bitc::METADATA_NAMED_NODE) {
- LLVM2_7MetadataDetected = true;
- } else if (NextBitCode != bitc::METADATA_NAMED_NODE2)
- assert ( 0 && "Invalid Named Metadata record");
+ assert(NextBitCode == bitc::METADATA_NAMED_NODE); (void)NextBitCode;
// Read named metadata elements.
unsigned Size = Record.size();
@@ -807,35 +1051,20 @@ bool BitcodeReader::ParseMetadata() {
return Error("Malformed metadata record");
NMD->addOperand(MD);
}
- // Backwards compatibility hack: NamedMDValues used to be Values,
- // and they got their own slots in the value numbering. They are no
- // longer Values, however we still need to account for them in the
- // numbering in order to be able to read old bitcode files.
- // FIXME: Remove this in LLVM 3.0.
- if (LLVM2_7MetadataDetected)
- MDValueList.AssignValue(0, NextMDValueNo++);
break;
}
- case bitc::METADATA_FN_NODE: // FIXME: Remove in LLVM 3.0.
- case bitc::METADATA_FN_NODE2:
+ case bitc::METADATA_FN_NODE:
IsFunctionLocal = true;
// fall-through
- case bitc::METADATA_NODE: // FIXME: Remove in LLVM 3.0.
- case bitc::METADATA_NODE2: {
-
- // Detect 2.7-era metadata.
- // FIXME: Remove in LLVM 3.0.
- if (Code == bitc::METADATA_FN_NODE || Code == bitc::METADATA_NODE)
- LLVM2_7MetadataDetected = true;
-
+ case bitc::METADATA_NODE: {
if (Record.size() % 2 == 1)
- return Error("Invalid METADATA_NODE2 record");
+ return Error("Invalid METADATA_NODE record");
unsigned Size = Record.size();
SmallVector<Value*, 8> Elts;
for (unsigned i = 0; i != Size; i += 2) {
const Type *Ty = getTypeByID(Record[i]);
- if (!Ty) return Error("Invalid METADATA_NODE2 record");
+ if (!Ty) return Error("Invalid METADATA_NODE record");
if (Ty->isMetadataTy())
Elts.push_back(MDValueList.getValueFwdRef(Record[i+1]));
else if (!Ty->isVoidTy())
@@ -1331,12 +1560,16 @@ bool BitcodeReader::ParseModule() {
if (ParseAttributeBlock())
return true;
break;
- case bitc::TYPE_BLOCK_ID:
+ case bitc::TYPE_BLOCK_ID_NEW:
if (ParseTypeTable())
return true;
break;
- case bitc::TYPE_SYMTAB_BLOCK_ID:
- if (ParseTypeSymbolTable())
+ case bitc::TYPE_BLOCK_ID_OLD:
+ if (ParseOldTypeTable())
+ return true;
+ break;
+ case bitc::TYPE_SYMTAB_BLOCK_ID_OLD:
+ if (ParseOldTypeSymbolTable())
return true;
break;
case bitc::VALUE_SYMTAB_BLOCK_ID:
@@ -1755,10 +1988,7 @@ bool BitcodeReader::ParseMetadataAttachment() {
switch (Stream.ReadRecord(Code, Record)) {
default: // Default behavior: ignore.
break;
- // FIXME: Remove in LLVM 3.0.
- case bitc::METADATA_ATTACHMENT:
- LLVM2_7MetadataDetected = true;
- case bitc::METADATA_ATTACHMENT2: {
+ case bitc::METADATA_ATTACHMENT: {
unsigned RecordLength = Record.size();
if (Record.empty() || (RecordLength - 1) % 2 == 1)
return Error ("Invalid METADATA_ATTACHMENT reader!");
@@ -1870,10 +2100,7 @@ bool BitcodeReader::ParseFunctionBody(Function *F) {
I = 0;
continue;
- // FIXME: Remove this in LLVM 3.0.
- case bitc::FUNC_CODE_DEBUG_LOC:
- LLVM2_7MetadataDetected = true;
- case bitc::FUNC_CODE_DEBUG_LOC2: { // DEBUG_LOC: [line, col, scope, ia]
+ case bitc::FUNC_CODE_DEBUG_LOC: { // DEBUG_LOC: [line, col, scope, ia]
I = 0; // Get the last instruction emitted.
if (CurBB && !CurBB->empty())
I = &CurBB->back();
@@ -1979,8 +2206,7 @@ bool BitcodeReader::ParseFunctionBody(Function *F) {
EXTRACTVALIdx.push_back((unsigned)Index);
}
- I = ExtractValueInst::Create(Agg,
- EXTRACTVALIdx.begin(), EXTRACTVALIdx.end());
+ I = ExtractValueInst::Create(Agg, EXTRACTVALIdx);
InstructionList.push_back(I);
break;
}
@@ -2004,8 +2230,7 @@ bool BitcodeReader::ParseFunctionBody(Function *F) {
INSERTVALIdx.push_back((unsigned)Index);
}
- I = InsertValueInst::Create(Agg, Val,
- INSERTVALIdx.begin(), INSERTVALIdx.end());
+ I = InsertValueInst::Create(Agg, Val, INSERTVALIdx);
InstructionList.push_back(I);
break;
}
@@ -2112,18 +2337,6 @@ bool BitcodeReader::ParseFunctionBody(Function *F) {
break;
}
- case bitc::FUNC_CODE_INST_GETRESULT: { // GETRESULT: [ty, val, n]
- if (Record.size() != 2)
- return Error("Invalid GETRESULT record");
- unsigned OpNum = 0;
- Value *Op;
- getValueTypePair(Record, OpNum, NextValueNo, Op);
- unsigned Index = Record[1];
- I = ExtractValueInst::Create(Op, Index);
- InstructionList.push_back(I);
- break;
- }
-
case bitc::FUNC_CODE_INST_RET: // RET: [opty,opval<optional>]
{
unsigned Size = Record.size();
@@ -2134,33 +2347,13 @@ bool BitcodeReader::ParseFunctionBody(Function *F) {
}
unsigned OpNum = 0;
- SmallVector<Value *,4> Vs;
- do {
- Value *Op = NULL;
- if (getValueTypePair(Record, OpNum, NextValueNo, Op))
- return Error("Invalid RET record");
- Vs.push_back(Op);
- } while(OpNum != Record.size());
-
- const Type *ReturnType = F->getReturnType();
- // Handle multiple return values. FIXME: Remove in LLVM 3.0.
- if (Vs.size() > 1 ||
- (ReturnType->isStructTy() &&
- (Vs.empty() || Vs[0]->getType() != ReturnType))) {
- Value *RV = UndefValue::get(ReturnType);
- for (unsigned i = 0, e = Vs.size(); i != e; ++i) {
- I = InsertValueInst::Create(RV, Vs[i], i, "mrv");
- InstructionList.push_back(I);
- CurBB->getInstList().push_back(I);
- ValueList.AssignValue(I, NextValueNo++);
- RV = I;
- }
- I = ReturnInst::Create(Context, RV);
- InstructionList.push_back(I);
- break;
- }
+ Value *Op = NULL;
+ if (getValueTypePair(Record, OpNum, NextValueNo, Op))
+ return Error("Invalid RET record");
+ if (OpNum != Record.size())
+ return Error("Invalid RET record");
- I = ReturnInst::Create(Context, Vs[0]);
+ I = ReturnInst::Create(Context, Op);
InstructionList.push_back(I);
break;
}
@@ -2272,8 +2465,7 @@ bool BitcodeReader::ParseFunctionBody(Function *F) {
}
}
- I = InvokeInst::Create(Callee, NormalBB, UnwindBB,
- Ops.begin(), Ops.end());
+ I = InvokeInst::Create(Callee, NormalBB, UnwindBB, Ops);
InstructionList.push_back(I);
cast<InvokeInst>(I)->setCallingConv(
static_cast<CallingConv::ID>(CCInfo));
@@ -2307,47 +2499,14 @@ bool BitcodeReader::ParseFunctionBody(Function *F) {
break;
}
- case bitc::FUNC_CODE_INST_MALLOC: { // MALLOC: [instty, op, align]
- // Autoupgrade malloc instruction to malloc call.
- // FIXME: Remove in LLVM 3.0.
- if (Record.size() < 3)
- return Error("Invalid MALLOC record");
- const PointerType *Ty =
- dyn_cast_or_null<PointerType>(getTypeByID(Record[0]));
- Value *Size = getFnValueByID(Record[1], Type::getInt32Ty(Context));
- if (!Ty || !Size) return Error("Invalid MALLOC record");
- if (!CurBB) return Error("Invalid malloc instruction with no BB");
- const Type *Int32Ty = IntegerType::getInt32Ty(CurBB->getContext());
- Constant *AllocSize = ConstantExpr::getSizeOf(Ty->getElementType());
- AllocSize = ConstantExpr::getTruncOrBitCast(AllocSize, Int32Ty);
- I = CallInst::CreateMalloc(CurBB, Int32Ty, Ty->getElementType(),
- AllocSize, Size, NULL);
- InstructionList.push_back(I);
- break;
- }
- case bitc::FUNC_CODE_INST_FREE: { // FREE: [op, opty]
- unsigned OpNum = 0;
- Value *Op;
- if (getValueTypePair(Record, OpNum, NextValueNo, Op) ||
- OpNum != Record.size())
- return Error("Invalid FREE record");
- if (!CurBB) return Error("Invalid free instruction with no BB");
- I = CallInst::CreateFree(Op, CurBB);
- InstructionList.push_back(I);
- break;
- }
case bitc::FUNC_CODE_INST_ALLOCA: { // ALLOCA: [instty, opty, op, align]
- // For backward compatibility, tolerate a lack of an opty, and use i32.
- // Remove this in LLVM 3.0.
- if (Record.size() < 3 || Record.size() > 4)
+ if (Record.size() != 4)
return Error("Invalid ALLOCA record");
- unsigned OpNum = 0;
const PointerType *Ty =
- dyn_cast_or_null<PointerType>(getTypeByID(Record[OpNum++]));
- const Type *OpTy = Record.size() == 4 ? getTypeByID(Record[OpNum++]) :
- Type::getInt32Ty(Context);
- Value *Size = getFnValueByID(Record[OpNum++], OpTy);
- unsigned Align = Record[OpNum++];
+ dyn_cast_or_null<PointerType>(getTypeByID(Record[0]));
+ const Type *OpTy = getTypeByID(Record[1]);
+ Value *Size = getFnValueByID(Record[2], OpTy);
+ unsigned Align = Record[3];
if (!Ty || !Size) return Error("Invalid ALLOCA record");
I = new AllocaInst(Ty->getElementType(), Size, (1 << Align) >> 1);
InstructionList.push_back(I);
@@ -2364,7 +2523,7 @@ bool BitcodeReader::ParseFunctionBody(Function *F) {
InstructionList.push_back(I);
break;
}
- case bitc::FUNC_CODE_INST_STORE2: { // STORE2:[ptrty, ptr, val, align, vol]
+ case bitc::FUNC_CODE_INST_STORE: { // STORE2:[ptrty, ptr, val, align, vol]
unsigned OpNum = 0;
Value *Val, *Ptr;
if (getValueTypePair(Record, OpNum, NextValueNo, Ptr) ||
@@ -2377,24 +2536,7 @@ bool BitcodeReader::ParseFunctionBody(Function *F) {
InstructionList.push_back(I);
break;
}
- case bitc::FUNC_CODE_INST_STORE: { // STORE:[val, valty, ptr, align, vol]
- // FIXME: Legacy form of store instruction. Should be removed in LLVM 3.0.
- unsigned OpNum = 0;
- Value *Val, *Ptr;
- if (getValueTypePair(Record, OpNum, NextValueNo, Val) ||
- getValue(Record, OpNum,
- PointerType::getUnqual(Val->getType()), Ptr)||
- OpNum+2 != Record.size())
- return Error("Invalid STORE record");
-
- I = new StoreInst(Val, Ptr, Record[OpNum+1], (1 << Record[OpNum]) >> 1);
- InstructionList.push_back(I);
- break;
- }
- // FIXME: Remove this in LLVM 3.0.
- case bitc::FUNC_CODE_INST_CALL:
- LLVM2_7MetadataDetected = true;
- case bitc::FUNC_CODE_INST_CALL2: {
+ case bitc::FUNC_CODE_INST_CALL: {
// CALL: [paramattrs, cc, fnty, fnid, arg0, arg1...]
if (Record.size() < 3)
return Error("Invalid CALL record");
@@ -2416,7 +2558,7 @@ bool BitcodeReader::ParseFunctionBody(Function *F) {
SmallVector<Value*, 16> Args;
// Read the fixed params.
for (unsigned i = 0, e = FTy->getNumParams(); i != e; ++i, ++OpNum) {
- if (FTy->getParamType(i)->getTypeID()==Type::LabelTyID)
+ if (FTy->getParamType(i)->isLabelTy())
Args.push_back(getBasicBlock(Record[OpNum]));
else
Args.push_back(getFnValueByID(Record[OpNum], FTy->getParamType(i)));
@@ -2436,7 +2578,7 @@ bool BitcodeReader::ParseFunctionBody(Function *F) {
}
}
- I = CallInst::Create(Callee, Args.begin(), Args.end());
+ I = CallInst::Create(Callee, Args);
InstructionList.push_back(I);
cast<CallInst>(I)->setCallingConv(
static_cast<CallingConv::ID>(CCInfo>>1));
@@ -2513,23 +2655,10 @@ bool BitcodeReader::ParseFunctionBody(Function *F) {
BlockAddrFwdRefs.erase(BAFRI);
}
- // FIXME: Remove this in LLVM 3.0.
- unsigned NewMDValueListSize = MDValueList.size();
-
// Trim the value list down to the size it was before we parsed this function.
ValueList.shrinkTo(ModuleValueListSize);
MDValueList.shrinkTo(ModuleMDValueListSize);
-
- // Backwards compatibility hack: Function-local metadata numbers
- // were previously not reset between functions. This is now fixed,
- // however we still need to understand the old numbering in order
- // to be able to read old bitcode files.
- // FIXME: Remove this in LLVM 3.0.
- if (LLVM2_7MetadataDetected)
- MDValueList.resize(NewMDValueListSize);
-
std::vector<BasicBlock*>().swap(FunctionBBs);
-
return false;
}
diff --git a/contrib/llvm/lib/Bitcode/Reader/BitcodeReader.h b/contrib/llvm/lib/Bitcode/Reader/BitcodeReader.h
index f8fc079..1b3bf1a 100644
--- a/contrib/llvm/lib/Bitcode/Reader/BitcodeReader.h
+++ b/contrib/llvm/lib/Bitcode/Reader/BitcodeReader.h
@@ -44,9 +44,9 @@ class BitcodeReaderValueList {
/// number that holds the resolved value.
typedef std::vector<std::pair<Constant*, unsigned> > ResolveConstantsTy;
ResolveConstantsTy ResolveConstants;
- LLVMContext& Context;
+ LLVMContext &Context;
public:
- BitcodeReaderValueList(LLVMContext& C) : Context(C) {}
+ BitcodeReaderValueList(LLVMContext &C) : Context(C) {}
~BitcodeReaderValueList() {
assert(ResolveConstants.empty() && "Constants not resolved?");
}
@@ -131,7 +131,7 @@ class BitcodeReader : public GVMaterializer {
const char *ErrorString;
- std::vector<PATypeHolder> TypeList;
+ std::vector<Type*> TypeList;
BitcodeReaderValueList ValueList;
BitcodeReaderMDValueList MDValueList;
SmallVector<Instruction *, 64> InstructionList;
@@ -174,17 +174,10 @@ class BitcodeReader : public GVMaterializer {
typedef std::pair<unsigned, GlobalVariable*> BlockAddrRefTy;
DenseMap<Function*, std::vector<BlockAddrRefTy> > BlockAddrFwdRefs;
- /// LLVM2_7MetadataDetected - True if metadata produced by LLVM 2.7 or
- /// earlier was detected, in which case we behave slightly differently,
- /// for compatibility.
- /// FIXME: Remove in LLVM 3.0.
- bool LLVM2_7MetadataDetected;
-
public:
explicit BitcodeReader(MemoryBuffer *buffer, LLVMContext &C)
: Context(C), TheModule(0), Buffer(buffer), BufferOwned(false),
- ErrorString(0), ValueList(C), MDValueList(C),
- LLVM2_7MetadataDetected(false) {
+ ErrorString(0), ValueList(C), MDValueList(C) {
HasReversedFunctionsWithBodies = false;
}
~BitcodeReader() {
@@ -217,12 +210,12 @@ public:
/// @returns true if an error occurred.
bool ParseTriple(std::string &Triple);
private:
- const Type *getTypeByID(unsigned ID, bool isTypeTable = false);
+ Type *getTypeByID(unsigned ID);
+ Type *getTypeByIDOrNull(unsigned ID);
Value *getFnValueByID(unsigned ID, const Type *Ty) {
- if (Ty == Type::getMetadataTy(Context))
+ if (Ty && Ty->isMetadataTy())
return MDValueList.getValueFwdRef(ID);
- else
- return ValueList.getValueFwdRef(ID, Ty);
+ return ValueList.getValueFwdRef(ID, Ty);
}
BasicBlock *getBasicBlock(unsigned ID) const {
if (ID >= FunctionBBs.size()) return 0; // Invalid ID
@@ -266,7 +259,10 @@ private:
bool ParseModule();
bool ParseAttributeBlock();
bool ParseTypeTable();
- bool ParseTypeSymbolTable();
+ bool ParseOldTypeTable(); // FIXME: Remove in LLVM 3.1
+ bool ParseTypeTableBody();
+
+ bool ParseOldTypeSymbolTable(); // FIXME: Remove in LLVM 3.1
bool ParseValueSymbolTable();
bool ParseConstants();
bool RememberAndSkipFunctionBody();
diff --git a/contrib/llvm/lib/Bitcode/Writer/BitcodeWriter.cpp b/contrib/llvm/lib/Bitcode/Writer/BitcodeWriter.cpp
index 6972a45..85d67ce 100644
--- a/contrib/llvm/lib/Bitcode/Writer/BitcodeWriter.cpp
+++ b/contrib/llvm/lib/Bitcode/Writer/BitcodeWriter.cpp
@@ -21,13 +21,14 @@
#include "llvm/Instructions.h"
#include "llvm/Module.h"
#include "llvm/Operator.h"
-#include "llvm/TypeSymbolTable.h"
#include "llvm/ValueSymbolTable.h"
+#include "llvm/ADT/Triple.h"
#include "llvm/Support/ErrorHandling.h"
#include "llvm/Support/MathExtras.h"
#include "llvm/Support/raw_ostream.h"
#include "llvm/Support/Program.h"
#include <cctype>
+#include <map>
using namespace llvm;
/// These are manifest constants used by the bitcode writer. They do not need to
@@ -100,13 +101,16 @@ static unsigned GetEncodedBinaryOpcode(unsigned Opcode) {
}
}
-static void WriteStringRecord(unsigned Code, const std::string &Str,
+static void WriteStringRecord(unsigned Code, StringRef Str,
unsigned AbbrevToUse, BitstreamWriter &Stream) {
SmallVector<unsigned, 64> Vals;
// Code: [strchar x N]
- for (unsigned i = 0, e = Str.size(); i != e; ++i)
+ for (unsigned i = 0, e = Str.size(); i != e; ++i) {
+ if (AbbrevToUse && !BitCodeAbbrevOp::isChar6(Str[i]))
+ AbbrevToUse = 0;
Vals.push_back(Str[i]);
+ }
// Emit the finished record.
Stream.EmitRecord(Code, Vals, AbbrevToUse);
@@ -150,7 +154,7 @@ static void WriteAttributeTable(const ValueEnumerator &VE,
static void WriteTypeTable(const ValueEnumerator &VE, BitstreamWriter &Stream) {
const ValueEnumerator::TypeList &TypeList = VE.getTypes();
- Stream.EnterSubblock(bitc::TYPE_BLOCK_ID, 4 /*count from # abbrevs */);
+ Stream.EnterSubblock(bitc::TYPE_BLOCK_ID_NEW, 4 /*count from # abbrevs */);
SmallVector<uint64_t, 64> TypeVals;
// Abbrev for TYPE_CODE_POINTER.
@@ -171,15 +175,32 @@ static void WriteTypeTable(const ValueEnumerator &VE, BitstreamWriter &Stream) {
Log2_32_Ceil(VE.getTypes().size()+1)));
unsigned FunctionAbbrev = Stream.EmitAbbrev(Abbv);
- // Abbrev for TYPE_CODE_STRUCT.
+ // Abbrev for TYPE_CODE_STRUCT_ANON.
Abbv = new BitCodeAbbrev();
- Abbv->Add(BitCodeAbbrevOp(bitc::TYPE_CODE_STRUCT));
+ Abbv->Add(BitCodeAbbrevOp(bitc::TYPE_CODE_STRUCT_ANON));
Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1)); // ispacked
Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Array));
Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed,
Log2_32_Ceil(VE.getTypes().size()+1)));
- unsigned StructAbbrev = Stream.EmitAbbrev(Abbv);
+ unsigned StructAnonAbbrev = Stream.EmitAbbrev(Abbv);
+
+ // Abbrev for TYPE_CODE_STRUCT_NAME.
+ Abbv = new BitCodeAbbrev();
+ Abbv->Add(BitCodeAbbrevOp(bitc::TYPE_CODE_STRUCT_NAME));
+ Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Array));
+ Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Char6));
+ unsigned StructNameAbbrev = Stream.EmitAbbrev(Abbv);
+ // Abbrev for TYPE_CODE_STRUCT_NAMED.
+ Abbv = new BitCodeAbbrev();
+ Abbv->Add(BitCodeAbbrevOp(bitc::TYPE_CODE_STRUCT_NAMED));
+ Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1)); // ispacked
+ Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Array));
+ Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed,
+ Log2_32_Ceil(VE.getTypes().size()+1)));
+ unsigned StructNamedAbbrev = Stream.EmitAbbrev(Abbv);
+
+
// Abbrev for TYPE_CODE_ARRAY.
Abbv = new BitCodeAbbrev();
Abbv->Add(BitCodeAbbrevOp(bitc::TYPE_CODE_ARRAY));
@@ -201,16 +222,15 @@ static void WriteTypeTable(const ValueEnumerator &VE, BitstreamWriter &Stream) {
switch (T->getTypeID()) {
default: llvm_unreachable("Unknown type!");
- case Type::VoidTyID: Code = bitc::TYPE_CODE_VOID; break;
- case Type::FloatTyID: Code = bitc::TYPE_CODE_FLOAT; break;
- case Type::DoubleTyID: Code = bitc::TYPE_CODE_DOUBLE; break;
- case Type::X86_FP80TyID: Code = bitc::TYPE_CODE_X86_FP80; break;
- case Type::FP128TyID: Code = bitc::TYPE_CODE_FP128; break;
+ case Type::VoidTyID: Code = bitc::TYPE_CODE_VOID; break;
+ case Type::FloatTyID: Code = bitc::TYPE_CODE_FLOAT; break;
+ case Type::DoubleTyID: Code = bitc::TYPE_CODE_DOUBLE; break;
+ case Type::X86_FP80TyID: Code = bitc::TYPE_CODE_X86_FP80; break;
+ case Type::FP128TyID: Code = bitc::TYPE_CODE_FP128; break;
case Type::PPC_FP128TyID: Code = bitc::TYPE_CODE_PPC_FP128; break;
- case Type::LabelTyID: Code = bitc::TYPE_CODE_LABEL; break;
- case Type::OpaqueTyID: Code = bitc::TYPE_CODE_OPAQUE; break;
- case Type::MetadataTyID: Code = bitc::TYPE_CODE_METADATA; break;
- case Type::X86_MMXTyID: Code = bitc::TYPE_CODE_X86_MMX; break;
+ case Type::LabelTyID: Code = bitc::TYPE_CODE_LABEL; break;
+ case Type::MetadataTyID: Code = bitc::TYPE_CODE_METADATA; break;
+ case Type::X86_MMXTyID: Code = bitc::TYPE_CODE_X86_MMX; break;
case Type::IntegerTyID:
// INTEGER: [width]
Code = bitc::TYPE_CODE_INTEGER;
@@ -241,13 +261,28 @@ static void WriteTypeTable(const ValueEnumerator &VE, BitstreamWriter &Stream) {
case Type::StructTyID: {
const StructType *ST = cast<StructType>(T);
// STRUCT: [ispacked, eltty x N]
- Code = bitc::TYPE_CODE_STRUCT;
TypeVals.push_back(ST->isPacked());
// Output all of the element types.
for (StructType::element_iterator I = ST->element_begin(),
E = ST->element_end(); I != E; ++I)
TypeVals.push_back(VE.getTypeID(*I));
- AbbrevToUse = StructAbbrev;
+
+ if (ST->isAnonymous()) {
+ Code = bitc::TYPE_CODE_STRUCT_ANON;
+ AbbrevToUse = StructAnonAbbrev;
+ } else {
+ if (ST->isOpaque()) {
+ Code = bitc::TYPE_CODE_OPAQUE;
+ } else {
+ Code = bitc::TYPE_CODE_STRUCT_NAMED;
+ AbbrevToUse = StructNamedAbbrev;
+ }
+
+ // Emit the name if it is present.
+ if (!ST->getName().empty())
+ WriteStringRecord(bitc::TYPE_CODE_STRUCT_NAME, ST->getName(),
+ StructNameAbbrev, Stream);
+ }
break;
}
case Type::ArrayTyID: {
@@ -489,8 +524,8 @@ static void WriteMDNode(const MDNode *N,
Record.push_back(0);
}
}
- unsigned MDCode = N->isFunctionLocal() ? bitc::METADATA_FN_NODE2 :
- bitc::METADATA_NODE2;
+ unsigned MDCode = N->isFunctionLocal() ? bitc::METADATA_FN_NODE :
+ bitc::METADATA_NODE;
Stream.EmitRecord(MDCode, Record, 0);
Record.clear();
}
@@ -553,7 +588,7 @@ static void WriteModuleMetadata(const Module *M,
// Write named metadata operands.
for (unsigned i = 0, e = NMD->getNumOperands(); i != e; ++i)
Record.push_back(VE.getValueID(NMD->getOperand(i)));
- Stream.EmitRecord(bitc::METADATA_NAMED_NODE2, Record, 0);
+ Stream.EmitRecord(bitc::METADATA_NAMED_NODE, Record, 0);
Record.clear();
}
@@ -589,7 +624,7 @@ static void WriteMetadataAttachment(const Function &F,
SmallVector<uint64_t, 64> Record;
// Write metadata attachments
- // METADATA_ATTACHMENT2 - [m x [value, [n x [id, mdnode]]]
+ // METADATA_ATTACHMENT - [m x [value, [n x [id, mdnode]]]
SmallVector<std::pair<unsigned, MDNode*>, 4> MDs;
for (Function::const_iterator BB = F.begin(), E = F.end(); BB != E; ++BB)
@@ -607,7 +642,7 @@ static void WriteMetadataAttachment(const Function &F,
Record.push_back(MDs[i].first);
Record.push_back(VE.getValueID(MDs[i].second));
}
- Stream.EmitRecord(bitc::METADATA_ATTACHMENT2, Record, 0);
+ Stream.EmitRecord(bitc::METADATA_ATTACHMENT, Record, 0);
Record.clear();
}
@@ -1078,12 +1113,16 @@ static void WriteInstruction(const Instruction &I, unsigned InstID,
AbbrevToUse = FUNCTION_INST_UNREACHABLE_ABBREV;
break;
- case Instruction::PHI:
+ case Instruction::PHI: {
+ const PHINode &PN = cast<PHINode>(I);
Code = bitc::FUNC_CODE_INST_PHI;
- Vals.push_back(VE.getTypeID(I.getType()));
- for (unsigned i = 0, e = I.getNumOperands(); i != e; ++i)
- Vals.push_back(VE.getValueID(I.getOperand(i)));
+ Vals.push_back(VE.getTypeID(PN.getType()));
+ for (unsigned i = 0, e = PN.getNumIncomingValues(); i != e; ++i) {
+ Vals.push_back(VE.getValueID(PN.getIncomingValue(i)));
+ Vals.push_back(VE.getValueID(PN.getIncomingBlock(i)));
+ }
break;
+ }
case Instruction::Alloca:
Code = bitc::FUNC_CODE_INST_ALLOCA;
@@ -1102,7 +1141,7 @@ static void WriteInstruction(const Instruction &I, unsigned InstID,
Vals.push_back(cast<LoadInst>(I).isVolatile());
break;
case Instruction::Store:
- Code = bitc::FUNC_CODE_INST_STORE2;
+ Code = bitc::FUNC_CODE_INST_STORE;
PushValueAndType(I.getOperand(1), InstID, Vals, VE); // ptrty + ptr
Vals.push_back(VE.getValueID(I.getOperand(0))); // val.
Vals.push_back(Log2_32(cast<StoreInst>(I).getAlignment())+1);
@@ -1113,7 +1152,7 @@ static void WriteInstruction(const Instruction &I, unsigned InstID,
const PointerType *PTy = cast<PointerType>(CI.getCalledValue()->getType());
const FunctionType *FTy = cast<FunctionType>(PTy->getElementType());
- Code = bitc::FUNC_CODE_INST_CALL2;
+ Code = bitc::FUNC_CODE_INST_CALL;
Vals.push_back(VE.getAttributeID(CI.getAttributes()));
Vals.push_back((CI.getCallingConv() << 1) | unsigned(CI.isTailCall()));
@@ -1257,7 +1296,7 @@ static void WriteFunction(const Function &F, ValueEnumerator &VE,
Vals.push_back(DL.getCol());
Vals.push_back(Scope ? VE.getValueID(Scope)+1 : 0);
Vals.push_back(IA ? VE.getValueID(IA)+1 : 0);
- Stream.EmitRecord(bitc::FUNC_CODE_DEBUG_LOC2, Vals);
+ Stream.EmitRecord(bitc::FUNC_CODE_DEBUG_LOC, Vals);
Vals.clear();
LastDL = DL;
@@ -1273,46 +1312,6 @@ static void WriteFunction(const Function &F, ValueEnumerator &VE,
Stream.ExitBlock();
}
-/// WriteTypeSymbolTable - Emit a block for the specified type symtab.
-static void WriteTypeSymbolTable(const TypeSymbolTable &TST,
- const ValueEnumerator &VE,
- BitstreamWriter &Stream) {
- if (TST.empty()) return;
-
- Stream.EnterSubblock(bitc::TYPE_SYMTAB_BLOCK_ID, 3);
-
- // 7-bit fixed width VST_CODE_ENTRY strings.
- BitCodeAbbrev *Abbv = new BitCodeAbbrev();
- Abbv->Add(BitCodeAbbrevOp(bitc::VST_CODE_ENTRY));
- Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed,
- Log2_32_Ceil(VE.getTypes().size()+1)));
- Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Array));
- Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 7));
- unsigned V7Abbrev = Stream.EmitAbbrev(Abbv);
-
- SmallVector<unsigned, 64> NameVals;
-
- for (TypeSymbolTable::const_iterator TI = TST.begin(), TE = TST.end();
- TI != TE; ++TI) {
- // TST_ENTRY: [typeid, namechar x N]
- NameVals.push_back(VE.getTypeID(TI->second));
-
- const std::string &Str = TI->first;
- bool is7Bit = true;
- for (unsigned i = 0, e = Str.size(); i != e; ++i) {
- NameVals.push_back((unsigned char)Str[i]);
- if (Str[i] & 128)
- is7Bit = false;
- }
-
- // Emit the finished record.
- Stream.EmitRecord(bitc::VST_CODE_ENTRY, NameVals, is7Bit ? V7Abbrev : 0);
- NameVals.clear();
- }
-
- Stream.ExitBlock();
-}
-
// Emit blockinfo, which defines the standard abbreviations etc.
static void WriteBlockInfo(const ValueEnumerator &VE, BitstreamWriter &Stream) {
// We only want to emit block info records for blocks that have multiple
@@ -1516,9 +1515,6 @@ static void WriteModule(const Module *M, BitstreamWriter &Stream) {
// Emit metadata.
WriteModuleMetadataStore(M, Stream);
- // Emit the type symbol table information.
- WriteTypeSymbolTable(M->getTypeSymbolTable(), VE, Stream);
-
// Emit names for globals/functions etc.
WriteValueSymbolTable(M->getValueSymbolTable(), VE, Stream);
@@ -1543,40 +1539,7 @@ enum {
DarwinBCHeaderSize = 5*4
};
-/// isARMTriplet - Return true if the triplet looks like:
-/// arm-*, thumb-*, armv[0-9]-*, thumbv[0-9]-*, armv5te-*, or armv6t2-*.
-static bool isARMTriplet(const std::string &TT) {
- size_t Pos = 0;
- size_t Size = TT.size();
- if (Size >= 6 &&
- TT[0] == 't' && TT[1] == 'h' && TT[2] == 'u' &&
- TT[3] == 'm' && TT[4] == 'b')
- Pos = 5;
- else if (Size >= 4 && TT[0] == 'a' && TT[1] == 'r' && TT[2] == 'm')
- Pos = 3;
- else
- return false;
-
- if (TT[Pos] == '-')
- return true;
- else if (TT[Pos] == 'v') {
- if (Size >= Pos+4 &&
- TT[Pos+1] == '6' && TT[Pos+2] == 't' && TT[Pos+3] == '2')
- return true;
- else if (Size >= Pos+4 &&
- TT[Pos+1] == '5' && TT[Pos+2] == 't' && TT[Pos+3] == 'e')
- return true;
- } else
- return false;
- while (++Pos < Size && TT[Pos] != '-') {
- if (!isdigit(TT[Pos]))
- return false;
- }
- return true;
-}
-
-static void EmitDarwinBCHeader(BitstreamWriter &Stream,
- const std::string &TT) {
+static void EmitDarwinBCHeader(BitstreamWriter &Stream, const Triple &TT) {
unsigned CPUType = ~0U;
// Match x86_64-*, i[3-9]86-*, powerpc-*, powerpc64-*, arm-*, thumb-*,
@@ -1590,16 +1553,16 @@ static void EmitDarwinBCHeader(BitstreamWriter &Stream,
DARWIN_CPU_TYPE_POWERPC = 18
};
- if (TT.find("x86_64-") == 0)
+ Triple::ArchType Arch = TT.getArch();
+ if (Arch == Triple::x86_64)
CPUType = DARWIN_CPU_TYPE_X86 | DARWIN_CPU_ARCH_ABI64;
- else if (TT.size() >= 5 && TT[0] == 'i' && TT[2] == '8' && TT[3] == '6' &&
- TT[4] == '-' && TT[1] - '3' < 6)
+ else if (Arch == Triple::x86)
CPUType = DARWIN_CPU_TYPE_X86;
- else if (TT.find("powerpc-") == 0)
+ else if (Arch == Triple::ppc)
CPUType = DARWIN_CPU_TYPE_POWERPC;
- else if (TT.find("powerpc64-") == 0)
+ else if (Arch == Triple::ppc64)
CPUType = DARWIN_CPU_TYPE_POWERPC | DARWIN_CPU_ARCH_ABI64;
- else if (isARMTriplet(TT))
+ else if (Arch == Triple::arm || Arch == Triple::thumb)
CPUType = DARWIN_CPU_TYPE_ARM;
// Traditional Bitcode starts after header.
@@ -1645,11 +1608,9 @@ void llvm::WriteBitcodeToFile(const Module *M, raw_ostream &Out) {
void llvm::WriteBitcodeToStream(const Module *M, BitstreamWriter &Stream) {
// If this is darwin or another generic macho target, emit a file header and
// trailer if needed.
- bool isMacho =
- M->getTargetTriple().find("-darwin") != std::string::npos ||
- M->getTargetTriple().find("-macho") != std::string::npos;
- if (isMacho)
- EmitDarwinBCHeader(Stream, M->getTargetTriple());
+ Triple TT(M->getTargetTriple());
+ if (TT.isOSDarwin())
+ EmitDarwinBCHeader(Stream, TT);
// Emit the file header.
Stream.Emit((unsigned)'B', 8);
@@ -1662,6 +1623,6 @@ void llvm::WriteBitcodeToStream(const Module *M, BitstreamWriter &Stream) {
// Emit the module.
WriteModule(M, Stream);
- if (isMacho)
+ if (TT.isOSDarwin())
EmitDarwinBCTrailer(Stream, Stream.getBuffer().size());
}
diff --git a/contrib/llvm/lib/Bitcode/Writer/ValueEnumerator.cpp b/contrib/llvm/lib/Bitcode/Writer/ValueEnumerator.cpp
index 5138c3c..b68bf92 100644
--- a/contrib/llvm/lib/Bitcode/Writer/ValueEnumerator.cpp
+++ b/contrib/llvm/lib/Bitcode/Writer/ValueEnumerator.cpp
@@ -17,7 +17,6 @@
#include "llvm/Constants.h"
#include "llvm/DerivedTypes.h"
#include "llvm/Module.h"
-#include "llvm/TypeSymbolTable.h"
#include "llvm/ValueSymbolTable.h"
#include "llvm/Instructions.h"
#include <algorithm>
@@ -59,9 +58,6 @@ ValueEnumerator::ValueEnumerator(const Module *M) {
I != E; ++I)
EnumerateValue(I->getAliasee());
- // Enumerate types used by the type symbol table.
- EnumerateTypeSymbolTable(M->getTypeSymbolTable());
-
// Insert constants and metadata that are named at module level into the slot
// pool so that the module symbol table can refer to them...
EnumerateValueSymbolTable(M->getValueSymbolTable());
@@ -109,78 +105,12 @@ ValueEnumerator::ValueEnumerator(const Module *M) {
// Optimize constant ordering.
OptimizeConstants(FirstConstant, Values.size());
-
- OptimizeTypes();
-
- // Now that we rearranged the type table, rebuild TypeMap.
- for (unsigned i = 0, e = Types.size(); i != e; ++i)
- TypeMap[Types[i]] = i+1;
-}
-
-struct TypeAndDeps {
- const Type *Ty;
- unsigned NumDeps;
-};
-
-static int CompareByDeps(const void *a, const void *b) {
- const TypeAndDeps &ta = *(const TypeAndDeps*) a;
- const TypeAndDeps &tb = *(const TypeAndDeps*) b;
- return ta.NumDeps - tb.NumDeps;
-}
-
-static void VisitType(const Type *Ty, SmallPtrSet<const Type*, 16> &Visited,
- std::vector<const Type*> &Out) {
- if (Visited.count(Ty))
- return;
-
- Visited.insert(Ty);
-
- for (Type::subtype_iterator I2 = Ty->subtype_begin(),
- E2 = Ty->subtype_end(); I2 != E2; ++I2) {
- const Type *InnerType = I2->get();
- VisitType(InnerType, Visited, Out);
- }
-
- Out.push_back(Ty);
}
-void ValueEnumerator::OptimizeTypes(void) {
- // If the types form a DAG, this will compute a topological sort and
- // no forward references will be needed when reading them in.
- // If there are cycles, this is a simple but reasonable heuristic for
- // the minimum feedback arc set problem.
- const unsigned NumTypes = Types.size();
- std::vector<TypeAndDeps> TypeDeps;
- TypeDeps.resize(NumTypes);
-
- for (unsigned I = 0; I < NumTypes; ++I) {
- const Type *Ty = Types[I];
- TypeDeps[I].Ty = Ty;
- TypeDeps[I].NumDeps = 0;
- }
-
- for (unsigned I = 0; I < NumTypes; ++I) {
- const Type *Ty = TypeDeps[I].Ty;
- for (Type::subtype_iterator I2 = Ty->subtype_begin(),
- E2 = Ty->subtype_end(); I2 != E2; ++I2) {
- const Type *InnerType = I2->get();
- unsigned InnerIndex = TypeMap.lookup(InnerType) - 1;
- TypeDeps[InnerIndex].NumDeps++;
- }
- }
- array_pod_sort(TypeDeps.begin(), TypeDeps.end(), CompareByDeps);
-
- SmallPtrSet<const Type*, 16> Visited;
- Types.clear();
- Types.reserve(NumTypes);
- for (unsigned I = 0; I < NumTypes; ++I) {
- VisitType(TypeDeps[I].Ty, Visited, Types);
- }
-}
unsigned ValueEnumerator::getInstructionID(const Instruction *Inst) const {
InstructionMapType::const_iterator I = InstructionMap.find(Inst);
- assert (I != InstructionMap.end() && "Instruction is not mapped!");
+ assert(I != InstructionMap.end() && "Instruction is not mapped!");
return I->second;
}
@@ -235,14 +165,6 @@ void ValueEnumerator::OptimizeConstants(unsigned CstStart, unsigned CstEnd) {
}
-/// EnumerateTypeSymbolTable - Insert all of the types in the specified symbol
-/// table.
-void ValueEnumerator::EnumerateTypeSymbolTable(const TypeSymbolTable &TST) {
- for (TypeSymbolTable::const_iterator TI = TST.begin(), TE = TST.end();
- TI != TE; ++TI)
- EnumerateType(TI->second);
-}
-
/// EnumerateValueSymbolTable - Insert all of the values in the specified symbol
/// table into the values table.
void ValueEnumerator::EnumerateValueSymbolTable(const ValueSymbolTable &VST) {
@@ -394,20 +316,40 @@ void ValueEnumerator::EnumerateValue(const Value *V) {
void ValueEnumerator::EnumerateType(const Type *Ty) {
- unsigned &TypeID = TypeMap[Ty];
+ unsigned *TypeID = &TypeMap[Ty];
// We've already seen this type.
- if (TypeID)
+ if (*TypeID)
return;
- // First time we saw this type, add it.
- Types.push_back(Ty);
- TypeID = Types.size();
-
- // Enumerate subtypes.
+ // If it is a non-anonymous struct, mark the type as being visited so that we
+ // don't recursively visit it. This is safe because we allow forward
+ // references of these in the bitcode reader.
+ if (const StructType *STy = dyn_cast<StructType>(Ty))
+ if (!STy->isAnonymous())
+ *TypeID = ~0U;
+
+ // Enumerate all of the subtypes before we enumerate this type. This ensures
+ // that the type will be enumerated in an order that can be directly built.
for (Type::subtype_iterator I = Ty->subtype_begin(), E = Ty->subtype_end();
I != E; ++I)
EnumerateType(*I);
+
+ // Refresh the TypeID pointer in case the table rehashed.
+ TypeID = &TypeMap[Ty];
+
+ // Check to see if we got the pointer another way. This can happen when
+ // enumerating recursive types that hit the base case deeper than they start.
+ //
+ // If this is actually a struct that we are treating as forward ref'able,
+ // then emit the definition now that all of its contents are available.
+ if (*TypeID && *TypeID != ~0U)
+ return;
+
+ // Add this type now that its contents are all happily enumerated.
+ Types.push_back(Ty);
+
+ *TypeID = Types.size();
}
// Enumerate the types for the specified value. If the value is a constant,
diff --git a/contrib/llvm/lib/Bitcode/Writer/ValueEnumerator.h b/contrib/llvm/lib/Bitcode/Writer/ValueEnumerator.h
index 1e42a26..6617b60 100644
--- a/contrib/llvm/lib/Bitcode/Writer/ValueEnumerator.h
+++ b/contrib/llvm/lib/Bitcode/Writer/ValueEnumerator.h
@@ -30,7 +30,6 @@ class Module;
class MDNode;
class NamedMDNode;
class AttrListPtr;
-class TypeSymbolTable;
class ValueSymbolTable;
class MDSymbolTable;
@@ -135,7 +134,6 @@ public:
private:
void OptimizeConstants(unsigned CstStart, unsigned CstEnd);
- void OptimizeTypes();
void EnumerateMDNodeOperands(const MDNode *N);
void EnumerateMetadata(const Value *MD);
@@ -146,7 +144,6 @@ private:
void EnumerateOperandType(const Value *V);
void EnumerateAttributes(const AttrListPtr &PAL);
- void EnumerateTypeSymbolTable(const TypeSymbolTable &ST);
void EnumerateValueSymbolTable(const ValueSymbolTable &ST);
void EnumerateNamedMetadata(const Module *M);
};
diff --git a/contrib/llvm/lib/CodeGen/AggressiveAntiDepBreaker.cpp b/contrib/llvm/lib/CodeGen/AggressiveAntiDepBreaker.cpp
index dca1d29..25842a7 100644
--- a/contrib/llvm/lib/CodeGen/AggressiveAntiDepBreaker.cpp
+++ b/contrib/llvm/lib/CodeGen/AggressiveAntiDepBreaker.cpp
@@ -16,6 +16,7 @@
#define DEBUG_TYPE "post-RA-sched"
#include "AggressiveAntiDepBreaker.h"
+#include "RegisterClassInfo.h"
#include "llvm/CodeGen/MachineBasicBlock.h"
#include "llvm/CodeGen/MachineFrameInfo.h"
#include "llvm/CodeGen/MachineInstr.h"
@@ -114,12 +115,13 @@ bool AggressiveAntiDepState::IsLive(unsigned Reg)
AggressiveAntiDepBreaker::
AggressiveAntiDepBreaker(MachineFunction& MFi,
- TargetSubtarget::RegClassVector& CriticalPathRCs) :
+ const RegisterClassInfo &RCI,
+ TargetSubtargetInfo::RegClassVector& CriticalPathRCs) :
AntiDepBreaker(), MF(MFi),
MRI(MF.getRegInfo()),
TII(MF.getTarget().getInstrInfo()),
TRI(MF.getTarget().getRegisterInfo()),
- AllocatableSet(TRI->getAllocatableSet(MF)),
+ RegClassInfo(RCI),
State(NULL) {
/* Collect a bitset of all registers that are only broken if they
are on the critical path. */
@@ -402,7 +404,7 @@ void AggressiveAntiDepBreaker::PrescanInstruction(MachineInstr *MI,
// Note register reference...
const TargetRegisterClass *RC = NULL;
if (i < MI->getDesc().getNumOperands())
- RC = MI->getDesc().OpInfo[i].getRegClass(TRI);
+ RC = TII->getRegClass(MI->getDesc(), i, TRI);
AggressiveAntiDepState::RegisterReference RR = { &MO, RC };
RegRefs.insert(std::make_pair(Reg, RR));
}
@@ -477,7 +479,7 @@ void AggressiveAntiDepBreaker::ScanInstruction(MachineInstr *MI,
// Note register reference...
const TargetRegisterClass *RC = NULL;
if (i < MI->getDesc().getNumOperands())
- RC = MI->getDesc().OpInfo[i].getRegClass(TRI);
+ RC = TII->getRegClass(MI->getDesc(), i, TRI);
AggressiveAntiDepState::RegisterReference RR = { &MO, RC };
RegRefs.insert(std::make_pair(Reg, RR));
}
@@ -618,9 +620,8 @@ bool AggressiveAntiDepBreaker::FindSuitableFreeRegisters(
const TargetRegisterClass *SuperRC =
TRI->getMinimalPhysRegClass(SuperReg, MVT::Other);
- const TargetRegisterClass::iterator RB = SuperRC->allocation_order_begin(MF);
- const TargetRegisterClass::iterator RE = SuperRC->allocation_order_end(MF);
- if (RB == RE) {
+ ArrayRef<unsigned> Order = RegClassInfo.getOrder(SuperRC);
+ if (Order.empty()) {
DEBUG(dbgs() << "\tEmpty Super Regclass!!\n");
return false;
}
@@ -628,17 +629,17 @@ bool AggressiveAntiDepBreaker::FindSuitableFreeRegisters(
DEBUG(dbgs() << "\tFind Registers:");
if (RenameOrder.count(SuperRC) == 0)
- RenameOrder.insert(RenameOrderType::value_type(SuperRC, RE));
+ RenameOrder.insert(RenameOrderType::value_type(SuperRC, Order.size()));
- const TargetRegisterClass::iterator OrigR = RenameOrder[SuperRC];
- const TargetRegisterClass::iterator EndR = ((OrigR == RE) ? RB : OrigR);
- TargetRegisterClass::iterator R = OrigR;
+ unsigned OrigR = RenameOrder[SuperRC];
+ unsigned EndR = ((OrigR == Order.size()) ? 0 : OrigR);
+ unsigned R = OrigR;
do {
- if (R == RB) R = RE;
+ if (R == 0) R = Order.size();
--R;
- const unsigned NewSuperReg = *R;
+ const unsigned NewSuperReg = Order[R];
// Don't consider non-allocatable registers
- if (!AllocatableSet.test(NewSuperReg)) continue;
+ if (!RegClassInfo.isAllocatable(NewSuperReg)) continue;
// Don't replace a register with itself.
if (NewSuperReg == SuperReg) continue;
@@ -819,7 +820,7 @@ unsigned AggressiveAntiDepBreaker::BreakAntiDependencies(
DEBUG(dbgs() << "\tAntidep reg: " << TRI->getName(AntiDepReg));
assert(AntiDepReg != 0 && "Anti-dependence on reg0?");
- if (!AllocatableSet.test(AntiDepReg)) {
+ if (!RegClassInfo.isAllocatable(AntiDepReg)) {
// Don't break anti-dependencies on non-allocatable registers.
DEBUG(dbgs() << " (non-allocatable)\n");
continue;
diff --git a/contrib/llvm/lib/CodeGen/AggressiveAntiDepBreaker.h b/contrib/llvm/lib/CodeGen/AggressiveAntiDepBreaker.h
index b7ddafc..7067784 100644
--- a/contrib/llvm/lib/CodeGen/AggressiveAntiDepBreaker.h
+++ b/contrib/llvm/lib/CodeGen/AggressiveAntiDepBreaker.h
@@ -23,13 +23,15 @@
#include "llvm/CodeGen/MachineFunction.h"
#include "llvm/CodeGen/MachineRegisterInfo.h"
#include "llvm/CodeGen/ScheduleDAG.h"
-#include "llvm/Target/TargetSubtarget.h"
+#include "llvm/Target/TargetSubtargetInfo.h"
#include "llvm/Target/TargetRegisterInfo.h"
#include "llvm/ADT/BitVector.h"
#include "llvm/ADT/SmallSet.h"
#include <map>
namespace llvm {
+class RegisterClassInfo;
+
/// Class AggressiveAntiDepState
/// Contains all the state necessary for anti-dep breaking.
class AggressiveAntiDepState {
@@ -117,11 +119,7 @@ namespace llvm {
MachineRegisterInfo &MRI;
const TargetInstrInfo *TII;
const TargetRegisterInfo *TRI;
-
- /// AllocatableSet - The set of allocatable registers.
- /// We'll be ignoring anti-dependencies on non-allocatable registers,
- /// because they may not be safe to break.
- const BitVector AllocatableSet;
+ const RegisterClassInfo &RegClassInfo;
/// CriticalPathSet - The set of registers that should only be
/// renamed if they are on the critical path.
@@ -133,7 +131,8 @@ namespace llvm {
public:
AggressiveAntiDepBreaker(MachineFunction& MFi,
- TargetSubtarget::RegClassVector& CriticalPathRCs);
+ const RegisterClassInfo &RCI,
+ TargetSubtargetInfo::RegClassVector& CriticalPathRCs);
~AggressiveAntiDepBreaker();
/// Start - Initialize anti-dep breaking for a new basic block.
@@ -158,8 +157,8 @@ namespace llvm {
void FinishBlock();
private:
- typedef std::map<const TargetRegisterClass *,
- TargetRegisterClass::const_iterator> RenameOrderType;
+ /// Keep track of a position in the allocation order for each regclass.
+ typedef std::map<const TargetRegisterClass *, unsigned> RenameOrderType;
/// IsImplicitDefUse - Return true if MO represents a register
/// that is both implicitly used and defined in MI
diff --git a/contrib/llvm/lib/CodeGen/AllocationOrder.cpp b/contrib/llvm/lib/CodeGen/AllocationOrder.cpp
index a8ee2b6..1005f10 100644
--- a/contrib/llvm/lib/CodeGen/AllocationOrder.cpp
+++ b/contrib/llvm/lib/CodeGen/AllocationOrder.cpp
@@ -41,21 +41,19 @@ AllocationOrder::AllocationOrder(unsigned VirtReg,
if (HintPair.first) {
const TargetRegisterInfo &TRI = VRM.getTargetRegInfo();
// The remaining allocation order may depend on the hint.
- const unsigned *B, *E;
- tie(B, E) = TRI.getAllocationOrder(RC, HintPair.first, Hint,
- VRM.getMachineFunction());
-
- // Empty allocation order?
- if (B == E)
+ ArrayRef<unsigned> Order =
+ TRI.getRawAllocationOrder(RC, HintPair.first, Hint,
+ VRM.getMachineFunction());
+ if (Order.empty())
return;
// Copy the allocation order with reserved registers removed.
OwnedBegin = true;
- unsigned *P = new unsigned[E - B];
+ unsigned *P = new unsigned[Order.size()];
Begin = P;
- for (; B != E; ++B)
- if (!RCI.isReserved(*B))
- *P++ = *B;
+ for (unsigned i = 0; i != Order.size(); ++i)
+ if (!RCI.isReserved(Order[i]))
+ *P++ = Order[i];
End = P;
// Target-dependent hints require resolution.
diff --git a/contrib/llvm/lib/CodeGen/AsmPrinter/AsmPrinter.cpp b/contrib/llvm/lib/CodeGen/AsmPrinter/AsmPrinter.cpp
index 161afba..7f314ee 100644
--- a/contrib/llvm/lib/CodeGen/AsmPrinter/AsmPrinter.cpp
+++ b/contrib/llvm/lib/CodeGen/AsmPrinter/AsmPrinter.cpp
@@ -575,6 +575,8 @@ static bool EmitDebugValueComment(const MachineInstr *MI, AsmPrinter &AP) {
}
} else if (MI->getOperand(0).isImm()) {
OS << MI->getOperand(0).getImm();
+ } else if (MI->getOperand(0).isCImm()) {
+ MI->getOperand(0).getCImm()->getValue().print(OS, false /*isSigned*/);
} else {
assert(MI->getOperand(0).isReg() && "Unknown operand type");
if (MI->getOperand(0).getReg() == 0) {
@@ -1211,9 +1213,9 @@ bool AsmPrinter::EmitSpecialLLVMGlobal(const GlobalVariable *GV) {
/// EmitLLVMUsedList - For targets that define a MAI::UsedDirective, mark each
/// global in the specified llvm.used list for which emitUsedDirectiveFor
/// is true, as being used with this directive.
-void AsmPrinter::EmitLLVMUsedList(Constant *List) {
+void AsmPrinter::EmitLLVMUsedList(const Constant *List) {
// Should be an array of 'i8*'.
- ConstantArray *InitList = dyn_cast<ConstantArray>(List);
+ const ConstantArray *InitList = dyn_cast<ConstantArray>(List);
if (InitList == 0) return;
for (unsigned i = 0, e = InitList->getNumOperands(); i != e; ++i) {
@@ -1226,11 +1228,11 @@ void AsmPrinter::EmitLLVMUsedList(Constant *List) {
/// EmitXXStructorList - Emit the ctor or dtor list. This just prints out the
/// function pointers, ignoring the init priority.
-void AsmPrinter::EmitXXStructorList(Constant *List) {
+void AsmPrinter::EmitXXStructorList(const Constant *List) {
// Should be an array of '{ int, void ()* }' structs. The first value is the
// init priority, which we ignore.
if (!isa<ConstantArray>(List)) return;
- ConstantArray *InitList = cast<ConstantArray>(List);
+ const ConstantArray *InitList = cast<ConstantArray>(List);
for (unsigned i = 0, e = InitList->getNumOperands(); i != e; ++i)
if (ConstantStruct *CS = dyn_cast<ConstantStruct>(InitList->getOperand(i))){
if (CS->getNumOperands() != 2) return; // Not array of 2-element structs.
@@ -1516,6 +1518,13 @@ static void EmitGlobalConstantVector(const ConstantVector *CV,
unsigned AddrSpace, AsmPrinter &AP) {
for (unsigned i = 0, e = CV->getType()->getNumElements(); i != e; ++i)
EmitGlobalConstantImpl(CV->getOperand(i), AddrSpace, AP);
+
+ const TargetData &TD = *AP.TM.getTargetData();
+ unsigned Size = TD.getTypeAllocSize(CV->getType());
+ unsigned EmittedSize = TD.getTypeAllocSize(CV->getType()->getElementType()) *
+ CV->getType()->getNumElements();
+ if (unsigned Padding = Size - EmittedSize)
+ AP.OutStreamer.EmitZeros(Padding, AddrSpace);
}
static void EmitGlobalConstantStruct(const ConstantStruct *CS,
@@ -1925,7 +1934,7 @@ isBlockOnlyReachableByFallthrough(const MachineBasicBlock *MBB) const {
return false;
// The predecessor has to be immediately before this block.
- const MachineBasicBlock *Pred = *PI;
+ MachineBasicBlock *Pred = *PI;
if (!Pred->isLayoutSuccessor(MBB))
return false;
@@ -1934,9 +1943,28 @@ isBlockOnlyReachableByFallthrough(const MachineBasicBlock *MBB) const {
if (Pred->empty())
return true;
- // Otherwise, check the last instruction.
- const MachineInstr &LastInst = Pred->back();
- return !LastInst.getDesc().isBarrier();
+ // Check the terminators in the previous blocks
+ for (MachineBasicBlock::iterator II = Pred->getFirstTerminator(),
+ IE = Pred->end(); II != IE; ++II) {
+ MachineInstr &MI = *II;
+
+ // If it is not a simple branch, we are in a table somewhere.
+ if (!MI.getDesc().isBranch() || MI.getDesc().isIndirectBranch())
+ return false;
+
+ // If we are the operands of one of the branches, this is not
+ // a fall through.
+ for (MachineInstr::mop_iterator OI = MI.operands_begin(),
+ OE = MI.operands_end(); OI != OE; ++OI) {
+ const MachineOperand& OP = *OI;
+ if (OP.isJTI())
+ return false;
+ if (OP.isMBB() && OP.getMBB() == MBB)
+ return false;
+ }
+ }
+
+ return true;
}
diff --git a/contrib/llvm/lib/CodeGen/AsmPrinter/AsmPrinterInlineAsm.cpp b/contrib/llvm/lib/CodeGen/AsmPrinter/AsmPrinterInlineAsm.cpp
index c6166e2..5ac455e 100644
--- a/contrib/llvm/lib/CodeGen/AsmPrinter/AsmPrinterInlineAsm.cpp
+++ b/contrib/llvm/lib/CodeGen/AsmPrinter/AsmPrinterInlineAsm.cpp
@@ -21,6 +21,7 @@
#include "llvm/CodeGen/MachineModuleInfo.h"
#include "llvm/MC/MCAsmInfo.h"
#include "llvm/MC/MCStreamer.h"
+#include "llvm/MC/MCSubtargetInfo.h"
#include "llvm/MC/MCSymbol.h"
#include "llvm/Target/TargetAsmParser.h"
#include "llvm/Target/TargetMachine.h"
@@ -111,7 +112,16 @@ void AsmPrinter::EmitInlineAsm(StringRef Str, const MDNode *LocMDNode) const {
OwningPtr<MCAsmParser> Parser(createMCAsmParser(TM.getTarget(), SrcMgr,
OutContext, OutStreamer,
*MAI));
- OwningPtr<TargetAsmParser> TAP(TM.getTarget().createAsmParser(*Parser, TM));
+
+ // FIXME: It would be nice if we can avoid createing a new instance of
+ // MCSubtargetInfo here given TargetSubtargetInfo is available. However,
+ // we have to watch out for asm directives which can change subtarget
+ // state. e.g. .code 16, .code 32.
+ OwningPtr<MCSubtargetInfo>
+ STI(TM.getTarget().createMCSubtargetInfo(TM.getTargetTriple(),
+ TM.getTargetCPU(),
+ TM.getTargetFeatureString()));
+ OwningPtr<TargetAsmParser> TAP(TM.getTarget().createAsmParser(*STI, *Parser));
if (!TAP)
report_fatal_error("Inline asm not supported by this streamer because"
" we don't have an asm parser for this target\n");
diff --git a/contrib/llvm/lib/CodeGen/AsmPrinter/DwarfCompileUnit.cpp b/contrib/llvm/lib/CodeGen/AsmPrinter/DwarfCompileUnit.cpp
index bff1a35..1fe035e 100644
--- a/contrib/llvm/lib/CodeGen/AsmPrinter/DwarfCompileUnit.cpp
+++ b/contrib/llvm/lib/CodeGen/AsmPrinter/DwarfCompileUnit.cpp
@@ -491,7 +491,7 @@ bool CompileUnit::addConstantFPValue(DIE *Die, const MachineOperand &MO) {
}
/// addConstantValue - Add constant value entry in variable DIE.
-bool CompileUnit::addConstantValue(DIE *Die, ConstantInt *CI,
+bool CompileUnit::addConstantValue(DIE *Die, const ConstantInt *CI,
bool Unsigned) {
unsigned CIBitWidth = CI->getBitWidth();
if (CIBitWidth <= 64) {
diff --git a/contrib/llvm/lib/CodeGen/AsmPrinter/DwarfCompileUnit.h b/contrib/llvm/lib/CodeGen/AsmPrinter/DwarfCompileUnit.h
index 60a9b28..213c7fc 100644
--- a/contrib/llvm/lib/CodeGen/AsmPrinter/DwarfCompileUnit.h
+++ b/contrib/llvm/lib/CodeGen/AsmPrinter/DwarfCompileUnit.h
@@ -181,7 +181,7 @@ public:
/// addConstantValue - Add constant value entry in variable DIE.
bool addConstantValue(DIE *Die, const MachineOperand &MO, DIType Ty);
- bool addConstantValue(DIE *Die, ConstantInt *CI, bool Unsigned);
+ bool addConstantValue(DIE *Die, const ConstantInt *CI, bool Unsigned);
/// addConstantFPValue - Add constant value entry in variable DIE.
bool addConstantFPValue(DIE *Die, const MachineOperand &MO);
diff --git a/contrib/llvm/lib/CodeGen/AsmPrinter/DwarfDebug.cpp b/contrib/llvm/lib/CodeGen/AsmPrinter/DwarfDebug.cpp
index 8845bfa..125e1e8 100644
--- a/contrib/llvm/lib/CodeGen/AsmPrinter/DwarfDebug.cpp
+++ b/contrib/llvm/lib/CodeGen/AsmPrinter/DwarfDebug.cpp
@@ -229,6 +229,7 @@ public:
void DbgScope::dump() const {
raw_ostream &err = dbgs();
err.indent(IndentLevel);
+ err << "DFSIn: " << DFSIn << " DFSOut: " << DFSOut << "\n";
const MDNode *N = Desc;
N->dump();
if (AbstractScope)
@@ -618,6 +619,21 @@ DIE *DwarfDebug::constructInlinedScopeDIE(DbgScope *Scope) {
return ScopeDIE;
}
+/// isUnsignedDIType - Return true if type encoding is unsigned.
+static bool isUnsignedDIType(DIType Ty) {
+ DIDerivedType DTy(Ty);
+ if (DTy.Verify())
+ return isUnsignedDIType(DTy.getTypeDerivedFrom());
+
+ DIBasicType BTy(Ty);
+ if (BTy.Verify()) {
+ unsigned Encoding = BTy.getEncoding();
+ if (Encoding == dwarf::DW_ATE_unsigned ||
+ Encoding == dwarf::DW_ATE_unsigned_char)
+ return true;
+ }
+ return false;
+}
/// constructVariableDIE - Construct a DIE for the given DbgVariable.
DIE *DwarfDebug::constructVariableDIE(DbgVariable *DV, DbgScope *Scope) {
@@ -718,6 +734,11 @@ DIE *DwarfDebug::constructVariableDIE(DbgVariable *DV, DbgScope *Scope) {
else if (DVInsn->getOperand(0).isFPImm())
updated =
VariableCU->addConstantFPValue(VariableDie, DVInsn->getOperand(0));
+ else if (DVInsn->getOperand(0).isCImm())
+ updated =
+ VariableCU->addConstantValue(VariableDie,
+ DVInsn->getOperand(0).getCImm(),
+ isUnsignedDIType(DV->getType()));
} else {
VariableCU->addVariableAddress(DV, VariableDie,
Asm->getDebugValueLocation(DVInsn));
@@ -913,22 +934,6 @@ CompileUnit *DwarfDebug::getCompileUnit(const MDNode *N) const {
return I->second;
}
-/// isUnsignedDIType - Return true if type encoding is unsigned.
-static bool isUnsignedDIType(DIType Ty) {
- DIDerivedType DTy(Ty);
- if (DTy.Verify())
- return isUnsignedDIType(DTy.getTypeDerivedFrom());
-
- DIBasicType BTy(Ty);
- if (BTy.Verify()) {
- unsigned Encoding = BTy.getEncoding();
- if (Encoding == dwarf::DW_ATE_unsigned ||
- Encoding == dwarf::DW_ATE_unsigned_char)
- return true;
- }
- return false;
-}
-
// Return const exprssion if value is a GEP to access merged global
// constant. e.g.
// i8* getelementptr ({ i8, i8, i8, i8 }* @_MergedGlobals, i32 0, i32 0)
@@ -1017,7 +1022,7 @@ void DwarfDebug::constructGlobalVariableDIE(const MDNode *N) {
} else {
TheCU->addBlock(VariableDIE, dwarf::DW_AT_location, 0, Block);
}
- } else if (ConstantInt *CI =
+ } else if (const ConstantInt *CI =
dyn_cast_or_null<ConstantInt>(GV.getConstant()))
TheCU->addConstantValue(VariableDIE, CI, isUnsignedDIType(GTy));
else if (const ConstantExpr *CE = getMergedGlobalExpr(N->getOperand(11))) {
@@ -1310,7 +1315,6 @@ bool DwarfDebug::addCurrentFnArgument(const MachineFunction *MF,
void
DwarfDebug::collectVariableInfoFromMMITable(const MachineFunction * MF,
SmallPtrSet<const MDNode *, 16> &Processed) {
- const LLVMContext &Ctx = Asm->MF->getFunction()->getContext();
MachineModuleInfo::VariableDbgInfoMapTy &VMap = MMI->getVariableDbgInfo();
for (MachineModuleInfo::VariableDbgInfoMapTy::iterator VI = VMap.begin(),
VE = VMap.end(); VI != VE; ++VI) {
@@ -1320,11 +1324,7 @@ DwarfDebug::collectVariableInfoFromMMITable(const MachineFunction * MF,
DIVariable DV(Var);
const std::pair<unsigned, DebugLoc> &VP = VI->second;
- DbgScope *Scope = 0;
- if (const MDNode *IA = VP.second.getInlinedAt(Ctx))
- Scope = ConcreteScopes.lookup(IA);
- if (Scope == 0)
- Scope = DbgScopeMap.lookup(VP.second.getScope(Ctx));
+ DbgScope *Scope = findDbgScope(VP.second);
// If variable scope is not found then skip this variable.
if (Scope == 0)
@@ -1351,6 +1351,34 @@ static bool isDbgValueInDefinedReg(const MachineInstr *MI) {
MI->getOperand(1).isImm() && MI->getOperand(1).getImm() == 0;
}
+/// getDebugLocEntry - Get .debug_loc entry for the instraction range starting
+/// at MI.
+static DotDebugLocEntry getDebugLocEntry(AsmPrinter *Asm,
+ const MCSymbol *FLabel,
+ const MCSymbol *SLabel,
+ const MachineInstr *MI) {
+ const MDNode *Var = MI->getOperand(MI->getNumOperands() - 1).getMetadata();
+
+ if (MI->getNumOperands() != 3) {
+ MachineLocation MLoc = Asm->getDebugValueLocation(MI);
+ return DotDebugLocEntry(FLabel, SLabel, MLoc, Var);
+ }
+ if (MI->getOperand(0).isReg() && MI->getOperand(1).isImm()) {
+ MachineLocation MLoc;
+ MLoc.set(MI->getOperand(0).getReg(), MI->getOperand(1).getImm());
+ return DotDebugLocEntry(FLabel, SLabel, MLoc, Var);
+ }
+ if (MI->getOperand(0).isImm())
+ return DotDebugLocEntry(FLabel, SLabel, MI->getOperand(0).getImm());
+ if (MI->getOperand(0).isFPImm())
+ return DotDebugLocEntry(FLabel, SLabel, MI->getOperand(0).getFPImm());
+ if (MI->getOperand(0).isCImm())
+ return DotDebugLocEntry(FLabel, SLabel, MI->getOperand(0).getCImm());
+
+ assert (0 && "Unexpected 3 operand DBG_VALUE instruction!");
+ return DotDebugLocEntry();
+}
+
/// collectVariableInfo - Populate DbgScope entries with variables' info.
void
DwarfDebug::collectVariableInfo(const MachineFunction *MF,
@@ -1379,7 +1407,7 @@ DwarfDebug::collectVariableInfo(const MachineFunction *MF,
DISubprogram(DV.getContext()).describes(MF->getFunction()))
Scope = CurrentFnDbgScope;
else
- Scope = findDbgScope(MInsn);
+ Scope = findDbgScope(MInsn->getDebugLoc());
// If variable scope is not found then skip this variable.
if (!Scope)
continue;
@@ -1424,6 +1452,8 @@ DwarfDebug::collectVariableInfo(const MachineFunction *MF,
SLabel = FunctionEndSym;
else {
const MachineInstr *End = HI[1];
+ DEBUG(dbgs() << "DotDebugLoc Pair:\n"
+ << "\t" << *Begin << "\t" << *End << "\n");
if (End->isDebugValue())
SLabel = getLabelBeforeInsn(End);
else {
@@ -1435,25 +1465,7 @@ DwarfDebug::collectVariableInfo(const MachineFunction *MF,
}
// The value is valid until the next DBG_VALUE or clobber.
- MachineLocation MLoc;
- if (Begin->getNumOperands() == 3) {
- if (Begin->getOperand(0).isReg() && Begin->getOperand(1).isImm()) {
- MLoc.set(Begin->getOperand(0).getReg(),
- Begin->getOperand(1).getImm());
- DotDebugLocEntries.
- push_back(DotDebugLocEntry(FLabel, SLabel, MLoc, Var));
- }
- // FIXME: Handle isFPImm also.
- else if (Begin->getOperand(0).isImm()) {
- DotDebugLocEntries.
- push_back(DotDebugLocEntry(FLabel, SLabel,
- Begin->getOperand(0).getImm()));
- }
- } else {
- MLoc = Asm->getDebugValueLocation(Begin);
- DotDebugLocEntries.
- push_back(DotDebugLocEntry(FLabel, SLabel, MLoc, Var));
- }
+ DotDebugLocEntries.push_back(getDebugLocEntry(Asm, FLabel, SLabel, Begin));
}
DotDebugLocEntries.push_back(DotDebugLocEntry());
}
@@ -1550,8 +1562,12 @@ void DwarfDebug::endInstruction(const MachineInstr *MI) {
}
/// getOrCreateDbgScope - Create DbgScope for the scope.
-DbgScope *DwarfDebug::getOrCreateDbgScope(const MDNode *Scope,
- const MDNode *InlinedAt) {
+DbgScope *DwarfDebug::getOrCreateDbgScope(DebugLoc DL) {
+ LLVMContext &Ctx = Asm->MF->getFunction()->getContext();
+ MDNode *Scope = NULL;
+ MDNode *InlinedAt = NULL;
+ DL.getScopeAndInlinedAt(Scope, InlinedAt, Ctx);
+
if (!InlinedAt) {
DbgScope *WScope = DbgScopeMap.lookup(Scope);
if (WScope)
@@ -1560,22 +1576,12 @@ DbgScope *DwarfDebug::getOrCreateDbgScope(const MDNode *Scope,
DbgScopeMap.insert(std::make_pair(Scope, WScope));
if (DIDescriptor(Scope).isLexicalBlock()) {
DbgScope *Parent =
- getOrCreateDbgScope(DILexicalBlock(Scope).getContext(), NULL);
+ getOrCreateDbgScope(DebugLoc::getFromDILexicalBlock(Scope));
WScope->setParent(Parent);
Parent->addScope(WScope);
- }
-
- if (!WScope->getParent()) {
- StringRef SPName = DISubprogram(Scope).getLinkageName();
- // We used to check only for a linkage name, but that fails
- // since we began omitting the linkage name for private
- // functions. The new way is to check for the name in metadata,
- // but that's not supported in old .ll test cases. Ergo, we
- // check both.
- if (SPName == Asm->MF->getFunction()->getName() ||
- DISubprogram(Scope).getFunction() == Asm->MF->getFunction())
- CurrentFnDbgScope = WScope;
- }
+ } else if (DIDescriptor(Scope).isSubprogram()
+ && DISubprogram(Scope).describes(Asm->MF->getFunction()))
+ CurrentFnDbgScope = WScope;
return WScope;
}
@@ -1587,37 +1593,14 @@ DbgScope *DwarfDebug::getOrCreateDbgScope(const MDNode *Scope,
WScope = new DbgScope(NULL, DIDescriptor(Scope), InlinedAt);
DbgScopeMap.insert(std::make_pair(InlinedAt, WScope));
- DILocation DL(InlinedAt);
+ InlinedDbgScopeMap[DebugLoc::getFromDILocation(InlinedAt)] = WScope;
DbgScope *Parent =
- getOrCreateDbgScope(DL.getScope(), DL.getOrigLocation());
+ getOrCreateDbgScope(DebugLoc::getFromDILocation(InlinedAt));
WScope->setParent(Parent);
Parent->addScope(WScope);
-
- ConcreteScopes[InlinedAt] = WScope;
-
return WScope;
}
-/// hasValidLocation - Return true if debug location entry attached with
-/// machine instruction encodes valid location info.
-static bool hasValidLocation(LLVMContext &Ctx,
- const MachineInstr *MInsn,
- const MDNode *&Scope, const MDNode *&InlinedAt) {
- DebugLoc DL = MInsn->getDebugLoc();
- if (DL.isUnknown()) return false;
-
- const MDNode *S = DL.getScope(Ctx);
-
- // There is no need to create another DIE for compile unit. For all
- // other scopes, create one DbgScope now. This will be translated
- // into a scope DIE at the end.
- if (DIScope(S).isCompileUnit()) return false;
-
- Scope = S;
- InlinedAt = DL.getInlinedAt(Ctx);
- return true;
-}
-
/// calculateDominanceGraph - Calculate dominance graph for DbgScope
/// hierarchy.
static void calculateDominanceGraph(DbgScope *Scope) {
@@ -1648,21 +1631,24 @@ static void calculateDominanceGraph(DbgScope *Scope) {
/// printDbgScopeInfo - Print DbgScope info for each machine instruction.
static
-void printDbgScopeInfo(LLVMContext &Ctx, const MachineFunction *MF,
+void printDbgScopeInfo(const MachineFunction *MF,
DenseMap<const MachineInstr *, DbgScope *> &MI2ScopeMap)
{
#ifndef NDEBUG
+ LLVMContext &Ctx = MF->getFunction()->getContext();
unsigned PrevDFSIn = 0;
for (MachineFunction::const_iterator I = MF->begin(), E = MF->end();
I != E; ++I) {
for (MachineBasicBlock::const_iterator II = I->begin(), IE = I->end();
II != IE; ++II) {
const MachineInstr *MInsn = II;
- const MDNode *Scope = NULL;
- const MDNode *InlinedAt = NULL;
+ MDNode *Scope = NULL;
+ MDNode *InlinedAt = NULL;
// Check if instruction has valid location information.
- if (hasValidLocation(Ctx, MInsn, Scope, InlinedAt)) {
+ DebugLoc MIDL = MInsn->getDebugLoc();
+ if (!MIDL.isUnknown()) {
+ MIDL.getScopeAndInlinedAt(Scope, InlinedAt, Ctx);
dbgs() << " [ ";
if (InlinedAt)
dbgs() << "*";
@@ -1692,11 +1678,9 @@ bool DwarfDebug::extractScopeInformation() {
return false;
// Scan each instruction and create scopes. First build working set of scopes.
- LLVMContext &Ctx = Asm->MF->getFunction()->getContext();
SmallVector<DbgRange, 4> MIRanges;
DenseMap<const MachineInstr *, DbgScope *> MI2ScopeMap;
- const MDNode *PrevScope = NULL;
- const MDNode *PrevInlinedAt = NULL;
+ DebugLoc PrevDL;
const MachineInstr *RangeBeginMI = NULL;
const MachineInstr *PrevMI = NULL;
for (MachineFunction::const_iterator I = Asm->MF->begin(), E = Asm->MF->end();
@@ -1704,17 +1688,16 @@ bool DwarfDebug::extractScopeInformation() {
for (MachineBasicBlock::const_iterator II = I->begin(), IE = I->end();
II != IE; ++II) {
const MachineInstr *MInsn = II;
- const MDNode *Scope = NULL;
- const MDNode *InlinedAt = NULL;
// Check if instruction has valid location information.
- if (!hasValidLocation(Ctx, MInsn, Scope, InlinedAt)) {
+ const DebugLoc MIDL = MInsn->getDebugLoc();
+ if (MIDL.isUnknown()) {
PrevMI = MInsn;
continue;
}
// If scope has not changed then skip this instruction.
- if (Scope == PrevScope && PrevInlinedAt == InlinedAt) {
+ if (MIDL == PrevDL) {
PrevMI = MInsn;
continue;
}
@@ -1727,9 +1710,13 @@ bool DwarfDebug::extractScopeInformation() {
// If we have alread seen a beginning of a instruction range and
// current instruction scope does not match scope of first instruction
// in this range then create a new instruction range.
+ DEBUG(dbgs() << "Creating new instruction range :\n");
+ DEBUG(dbgs() << "Begin Range at " << *RangeBeginMI);
+ DEBUG(dbgs() << "End Range at " << *PrevMI);
+ DEBUG(dbgs() << "Next Range starting at " << *MInsn);
+ DEBUG(dbgs() << "------------------------\n");
DbgRange R(RangeBeginMI, PrevMI);
- MI2ScopeMap[RangeBeginMI] = getOrCreateDbgScope(PrevScope,
- PrevInlinedAt);
+ MI2ScopeMap[RangeBeginMI] = getOrCreateDbgScope(PrevDL);
MIRanges.push_back(R);
}
@@ -1738,16 +1725,15 @@ bool DwarfDebug::extractScopeInformation() {
// Reset previous markers.
PrevMI = MInsn;
- PrevScope = Scope;
- PrevInlinedAt = InlinedAt;
+ PrevDL = MIDL;
}
}
// Create last instruction range.
- if (RangeBeginMI && PrevMI && PrevScope) {
+ if (RangeBeginMI && PrevMI && !PrevDL.isUnknown()) {
DbgRange R(RangeBeginMI, PrevMI);
MIRanges.push_back(R);
- MI2ScopeMap[RangeBeginMI] = getOrCreateDbgScope(PrevScope, PrevInlinedAt);
+ MI2ScopeMap[RangeBeginMI] = getOrCreateDbgScope(PrevDL);
}
if (!CurrentFnDbgScope)
@@ -1755,7 +1741,7 @@ bool DwarfDebug::extractScopeInformation() {
calculateDominanceGraph(CurrentFnDbgScope);
if (PrintDbgScope)
- printDbgScopeInfo(Ctx, Asm->MF, MI2ScopeMap);
+ printDbgScopeInfo(Asm->MF, MI2ScopeMap);
// Find ranges of instructions covered by each DbgScope;
DbgScope *PrevDbgScope = NULL;
@@ -1842,8 +1828,6 @@ void DwarfDebug::beginFunction(const MachineFunction *MF) {
assert(UserVariables.empty() && DbgValues.empty() && "Maps weren't cleaned");
- /// ProcessedArgs - Collection of arguments already processed.
- SmallPtrSet<const MDNode *, 8> ProcessedArgs;
const TargetRegisterInfo *TRI = Asm->TM.getRegisterInfo();
/// LiveUserVar - Map physreg numbers to the MDNode they contain.
std::vector<const MDNode*> LiveUserVar(TRI->getNumRegs());
@@ -1883,8 +1867,12 @@ void DwarfDebug::beginFunction(const MachineFunction *MF) {
if (Prev->isDebugValue()) {
// Coalesce identical entries at the end of History.
if (History.size() >= 2 &&
- Prev->isIdenticalTo(History[History.size() - 2]))
+ Prev->isIdenticalTo(History[History.size() - 2])) {
+ DEBUG(dbgs() << "Coalesce identical DBG_VALUE entries:\n"
+ << "\t" << *Prev
+ << "\t" << *History[History.size() - 2] << "\n");
History.pop_back();
+ }
// Terminate old register assignments that don't reach MI;
MachineFunction::const_iterator PrevMBB = Prev->getParent();
@@ -1894,9 +1882,12 @@ void DwarfDebug::beginFunction(const MachineFunction *MF) {
// its basic block.
MachineBasicBlock::const_iterator LastMI =
PrevMBB->getLastNonDebugInstr();
- if (LastMI == PrevMBB->end())
+ if (LastMI == PrevMBB->end()) {
// Drop DBG_VALUE for empty range.
+ DEBUG(dbgs() << "Drop DBG_VALUE for empty range:\n"
+ << "\t" << *Prev << "\n");
History.pop_back();
+ }
else {
// Terminate after LastMI.
History.push_back(LastMI);
@@ -2053,10 +2044,10 @@ void DwarfDebug::endFunction(const MachineFunction *MF) {
DbgVariableToFrameIndexMap.clear();
VarToAbstractVarMap.clear();
DbgVariableToDbgInstMap.clear();
+ InlinedDbgScopeMap.clear();
DeleteContainerSeconds(DbgScopeMap);
UserVariables.clear();
DbgValues.clear();
- ConcreteScopes.clear();
DeleteContainerSeconds(AbstractScopes);
AbstractScopesList.clear();
AbstractVariables.clear();
@@ -2083,22 +2074,17 @@ bool DwarfDebug::findVariableFrameIndex(const DbgVariable *V, int *FI) {
return true;
}
-/// findDbgScope - Find DbgScope for the debug loc attached with an
-/// instruction.
-DbgScope *DwarfDebug::findDbgScope(const MachineInstr *MInsn) {
- DbgScope *Scope = NULL;
- LLVMContext &Ctx =
- MInsn->getParent()->getParent()->getFunction()->getContext();
- DebugLoc DL = MInsn->getDebugLoc();
-
+/// findDbgScope - Find DbgScope for the debug loc.
+DbgScope *DwarfDebug::findDbgScope(DebugLoc DL) {
if (DL.isUnknown())
- return Scope;
+ return NULL;
- if (const MDNode *IA = DL.getInlinedAt(Ctx))
- Scope = ConcreteScopes.lookup(IA);
- if (Scope == 0)
+ DbgScope *Scope = NULL;
+ LLVMContext &Ctx = Asm->MF->getFunction()->getContext();
+ if (MDNode *IA = DL.getInlinedAt(Ctx))
+ Scope = InlinedDbgScopeMap.lookup(DebugLoc::getFromDILocation(IA));
+ else
Scope = DbgScopeMap.lookup(DL.getScope(Ctx));
-
return Scope;
}
@@ -2597,56 +2583,61 @@ void DwarfDebug::emitDebugLoc() {
MCSymbol *end = Asm->OutStreamer.getContext().CreateTempSymbol();
Asm->EmitLabelDifference(end, begin, 2);
Asm->OutStreamer.EmitLabel(begin);
- if (Entry.isConstant()) {
+ if (Entry.isInt()) {
DIBasicType BTy(DV.getType());
if (BTy.Verify() &&
(BTy.getEncoding() == dwarf::DW_ATE_signed
|| BTy.getEncoding() == dwarf::DW_ATE_signed_char)) {
Asm->OutStreamer.AddComment("DW_OP_consts");
Asm->EmitInt8(dwarf::DW_OP_consts);
- Asm->EmitSLEB128(Entry.getConstant());
+ Asm->EmitSLEB128(Entry.getInt());
} else {
Asm->OutStreamer.AddComment("DW_OP_constu");
Asm->EmitInt8(dwarf::DW_OP_constu);
- Asm->EmitULEB128(Entry.getConstant());
+ Asm->EmitULEB128(Entry.getInt());
}
- } else if (DV.hasComplexAddress()) {
- unsigned N = DV.getNumAddrElements();
- unsigned i = 0;
- if (N >= 2 && DV.getAddrElement(0) == DIBuilder::OpPlus) {
- if (Entry.Loc.getOffset()) {
- i = 2;
- Asm->EmitDwarfRegOp(Entry.Loc);
- Asm->OutStreamer.AddComment("DW_OP_deref");
- Asm->EmitInt8(dwarf::DW_OP_deref);
- Asm->OutStreamer.AddComment("DW_OP_plus_uconst");
- Asm->EmitInt8(dwarf::DW_OP_plus_uconst);
- Asm->EmitSLEB128(DV.getAddrElement(1));
+ } else if (Entry.isLocation()) {
+ if (!DV.hasComplexAddress())
+ // Regular entry.
+ Asm->EmitDwarfRegOp(Entry.Loc);
+ else {
+ // Complex address entry.
+ unsigned N = DV.getNumAddrElements();
+ unsigned i = 0;
+ if (N >= 2 && DV.getAddrElement(0) == DIBuilder::OpPlus) {
+ if (Entry.Loc.getOffset()) {
+ i = 2;
+ Asm->EmitDwarfRegOp(Entry.Loc);
+ Asm->OutStreamer.AddComment("DW_OP_deref");
+ Asm->EmitInt8(dwarf::DW_OP_deref);
+ Asm->OutStreamer.AddComment("DW_OP_plus_uconst");
+ Asm->EmitInt8(dwarf::DW_OP_plus_uconst);
+ Asm->EmitSLEB128(DV.getAddrElement(1));
+ } else {
+ // If first address element is OpPlus then emit
+ // DW_OP_breg + Offset instead of DW_OP_reg + Offset.
+ MachineLocation Loc(Entry.Loc.getReg(), DV.getAddrElement(1));
+ Asm->EmitDwarfRegOp(Loc);
+ i = 2;
+ }
} else {
- // If first address element is OpPlus then emit
- // DW_OP_breg + Offset instead of DW_OP_reg + Offset.
- MachineLocation Loc(Entry.Loc.getReg(), DV.getAddrElement(1));
- Asm->EmitDwarfRegOp(Loc);
- i = 2;
+ Asm->EmitDwarfRegOp(Entry.Loc);
+ }
+
+ // Emit remaining complex address elements.
+ for (; i < N; ++i) {
+ uint64_t Element = DV.getAddrElement(i);
+ if (Element == DIBuilder::OpPlus) {
+ Asm->EmitInt8(dwarf::DW_OP_plus_uconst);
+ Asm->EmitULEB128(DV.getAddrElement(++i));
+ } else if (Element == DIBuilder::OpDeref)
+ Asm->EmitInt8(dwarf::DW_OP_deref);
+ else llvm_unreachable("unknown Opcode found in complex address");
}
- } else {
- Asm->EmitDwarfRegOp(Entry.Loc);
- }
-
- // Emit remaining complex address elements.
- for (; i < N; ++i) {
- uint64_t Element = DV.getAddrElement(i);
- if (Element == DIBuilder::OpPlus) {
- Asm->EmitInt8(dwarf::DW_OP_plus_uconst);
- Asm->EmitULEB128(DV.getAddrElement(++i));
- } else if (Element == DIBuilder::OpDeref)
- Asm->EmitInt8(dwarf::DW_OP_deref);
- else llvm_unreachable("unknown Opcode found in complex address");
}
- } else {
- // Regular entry.
- Asm->EmitDwarfRegOp(Entry.Loc);
}
+ // else ... ignore constant fp. There is not any good way to
+ // to represent them here in dwarf.
Asm->OutStreamer.EmitLabel(end);
}
}
diff --git a/contrib/llvm/lib/CodeGen/AsmPrinter/DwarfDebug.h b/contrib/llvm/lib/CodeGen/AsmPrinter/DwarfDebug.h
index abda2e6..b245006 100644
--- a/contrib/llvm/lib/CodeGen/AsmPrinter/DwarfDebug.h
+++ b/contrib/llvm/lib/CodeGen/AsmPrinter/DwarfDebug.h
@@ -69,17 +69,35 @@ typedef struct DotDebugLocEntry {
const MDNode *Variable;
bool Merged;
bool Constant;
- int64_t iConstant;
+ enum EntryType {
+ E_Location,
+ E_Integer,
+ E_ConstantFP,
+ E_ConstantInt
+ };
+ enum EntryType EntryKind;
+
+ union {
+ int64_t Int;
+ const ConstantFP *CFP;
+ const ConstantInt *CIP;
+ } Constants;
DotDebugLocEntry()
: Begin(0), End(0), Variable(0), Merged(false),
- Constant(false), iConstant(0) {}
+ Constant(false) { Constants.Int = 0;}
DotDebugLocEntry(const MCSymbol *B, const MCSymbol *E, MachineLocation &L,
const MDNode *V)
: Begin(B), End(E), Loc(L), Variable(V), Merged(false),
- Constant(false), iConstant(0) {}
+ Constant(false) { Constants.Int = 0; EntryKind = E_Location; }
DotDebugLocEntry(const MCSymbol *B, const MCSymbol *E, int64_t i)
: Begin(B), End(E), Variable(0), Merged(false),
- Constant(true), iConstant(i) {}
+ Constant(true) { Constants.Int = i; EntryKind = E_Integer; }
+ DotDebugLocEntry(const MCSymbol *B, const MCSymbol *E, const ConstantFP *FPtr)
+ : Begin(B), End(E), Variable(0), Merged(false),
+ Constant(true) { Constants.CFP = FPtr; EntryKind = E_ConstantFP; }
+ DotDebugLocEntry(const MCSymbol *B, const MCSymbol *E, const ConstantInt *IPtr)
+ : Begin(B), End(E), Variable(0), Merged(false),
+ Constant(true) { Constants.CIP = IPtr; EntryKind = E_ConstantInt; }
/// Empty entries are also used as a trigger to emit temp label. Such
/// labels are referenced is used to find debug_loc offset for a given DIE.
@@ -91,8 +109,13 @@ typedef struct DotDebugLocEntry {
Next->Begin = Begin;
Merged = true;
}
- bool isConstant() { return Constant; }
- int64_t getConstant() { return iConstant; }
+ bool isLocation() const { return EntryKind == E_Location; }
+ bool isInt() const { return EntryKind == E_Integer; }
+ bool isConstantFP() const { return EntryKind == E_ConstantFP; }
+ bool isConstantInt() const { return EntryKind == E_ConstantInt; }
+ int64_t getInt() { return Constants.Int; }
+ const ConstantFP *getConstantFP() { return Constants.CFP; }
+ const ConstantInt *getConstantInt() { return Constants.CIP; }
} DotDebugLocEntry;
//===----------------------------------------------------------------------===//
@@ -178,12 +201,10 @@ class DwarfDebug {
/// DbgScopeMap - Tracks the scopes in the current function. Owns the
/// contained DbgScope*s.
- ///
DenseMap<const MDNode *, DbgScope *> DbgScopeMap;
- /// ConcreteScopes - Tracks the concrete scopees in the current function.
- /// These scopes are also included in DbgScopeMap.
- DenseMap<const MDNode *, DbgScope *> ConcreteScopes;
+ /// InlinedDbgScopeMap - Tracks inlined function scopes in current function.
+ DenseMap<DebugLoc, DbgScope *> InlinedDbgScopeMap;
/// AbstractScopes - Tracks the abstract scopes a module. These scopes are
/// not included DbgScopeMap. AbstractScopes owns its DbgScope*s.
@@ -296,7 +317,7 @@ private:
void assignAbbrevNumber(DIEAbbrev &Abbrev);
/// getOrCreateDbgScope - Create DbgScope for the scope.
- DbgScope *getOrCreateDbgScope(const MDNode *Scope, const MDNode *InlinedAt);
+ DbgScope *getOrCreateDbgScope(DebugLoc DL);
DbgScope *getOrCreateAbstractScope(const MDNode *N);
@@ -427,9 +448,8 @@ private:
/// is found. Update FI to hold value of the index.
bool findVariableFrameIndex(const DbgVariable *V, int *FI);
- /// findDbgScope - Find DbgScope for the debug loc attached with an
- /// instruction.
- DbgScope *findDbgScope(const MachineInstr *MI);
+ /// findDbgScope - Find DbgScope for the debug loc.
+ DbgScope *findDbgScope(DebugLoc DL);
/// identifyScopeMarkers() - Indentify instructions that are marking
/// beginning of or end of a scope.
diff --git a/contrib/llvm/lib/CodeGen/AsmPrinter/DwarfException.cpp b/contrib/llvm/lib/CodeGen/AsmPrinter/DwarfException.cpp
index 967a278..1f992fa 100644
--- a/contrib/llvm/lib/CodeGen/AsmPrinter/DwarfException.cpp
+++ b/contrib/llvm/lib/CodeGen/AsmPrinter/DwarfException.cpp
@@ -512,6 +512,8 @@ void DwarfException::EmitExceptionTable() {
SizeAlign = 0;
}
+ bool VerboseAsm = Asm->OutStreamer.isVerboseAsm();
+
// SjLj Exception handling
if (IsSJLJ) {
Asm->EmitEncodingByte(dwarf::DW_EH_PE_udata4, "Call site");
@@ -525,14 +527,30 @@ void DwarfException::EmitExceptionTable() {
I = CallSites.begin(), E = CallSites.end(); I != E; ++I, ++idx) {
const CallSiteEntry &S = *I;
+ if (VerboseAsm) {
+ // Emit comments that decode the call site.
+ Asm->OutStreamer.AddComment(Twine(">> Call Site ") +
+ llvm::utostr(idx) + " <<");
+ Asm->OutStreamer.AddComment(Twine(" On exception at call site ") +
+ llvm::utostr(idx));
+
+ if (S.Action == 0)
+ Asm->OutStreamer.AddComment(" Action: cleanup");
+ else
+ Asm->OutStreamer.AddComment(Twine(" Action: ") +
+ llvm::utostr((S.Action - 1) / 2 + 1));
+
+ Asm->OutStreamer.AddBlankLine();
+ }
+
// Offset of the landing pad, counted in 16-byte bundles relative to the
// @LPStart address.
- Asm->EmitULEB128(idx, "Landing pad");
+ Asm->EmitULEB128(idx);
// Offset of the first associated action record, relative to the start of
// the action table. This value is biased by 1 (1 indicates the start of
// the action table), and 0 indicates that there are no actions.
- Asm->EmitULEB128(S.Action, "Action");
+ Asm->EmitULEB128(S.Action);
}
} else {
// DWARF Exception handling
@@ -562,6 +580,7 @@ void DwarfException::EmitExceptionTable() {
// Add extra padding if it wasn't added to the TType base offset.
Asm->EmitULEB128(CallSiteTableLength, "Call site table length", SizeAlign);
+ unsigned Entry = 0;
for (SmallVectorImpl<CallSiteEntry>::const_iterator
I = CallSites.begin(), E = CallSites.end(); I != E; ++I) {
const CallSiteEntry &S = *I;
@@ -576,19 +595,38 @@ void DwarfException::EmitExceptionTable() {
if (EndLabel == 0)
EndLabel = Asm->GetTempSymbol("eh_func_end", Asm->getFunctionNumber());
+ if (VerboseAsm) {
+ // Emit comments that decode the call site.
+ Asm->OutStreamer.AddComment(Twine(">> Call Site ") +
+ llvm::utostr(++Entry) + " <<");
+ Asm->OutStreamer.AddComment(Twine(" Call between ") +
+ BeginLabel->getName() + " and " +
+ EndLabel->getName());
+
+ if (!S.PadLabel) {
+ Asm->OutStreamer.AddComment(" has no landing pad");
+ } else {
+ Asm->OutStreamer.AddComment(Twine(" jumps to ") +
+ S.PadLabel->getName());
+
+ if (S.Action == 0)
+ Asm->OutStreamer.AddComment(" On action: cleanup");
+ else
+ Asm->OutStreamer.AddComment(Twine(" On action: ") +
+ llvm::utostr((S.Action - 1) / 2 + 1));
+ }
+
+ Asm->OutStreamer.AddBlankLine();
+ }
+
// Offset of the call site relative to the previous call site, counted in
// number of 16-byte bundles. The first call site is counted relative to
// the start of the procedure fragment.
- Asm->OutStreamer.AddComment("Region start");
Asm->EmitLabelDifference(BeginLabel, EHFuncBeginSym, 4);
-
- Asm->OutStreamer.AddComment("Region length");
Asm->EmitLabelDifference(EndLabel, BeginLabel, 4);
-
// Offset of the landing pad, counted in 16-byte bundles relative to the
// @LPStart address.
- Asm->OutStreamer.AddComment("Landing pad");
if (!S.PadLabel)
Asm->OutStreamer.EmitIntValue(0, 4/*size*/, 0/*addrspace*/);
else
@@ -597,45 +635,63 @@ void DwarfException::EmitExceptionTable() {
// Offset of the first associated action record, relative to the start of
// the action table. This value is biased by 1 (1 indicates the start of
// the action table), and 0 indicates that there are no actions.
- Asm->EmitULEB128(S.Action, "Action");
+ Asm->EmitULEB128(S.Action);
}
}
// Emit the Action Table.
- if (Actions.size() != 0) {
- Asm->OutStreamer.AddComment("-- Action Record Table --");
- Asm->OutStreamer.AddBlankLine();
- }
-
+ int Entry = 0;
for (SmallVectorImpl<ActionEntry>::const_iterator
I = Actions.begin(), E = Actions.end(); I != E; ++I) {
const ActionEntry &Action = *I;
- Asm->OutStreamer.AddComment("Action Record");
- Asm->OutStreamer.AddBlankLine();
+
+ if (VerboseAsm) {
+ // Emit comments that decode the action table.
+ Asm->OutStreamer.AddComment(Twine(">> Action Record ") +
+ llvm::utostr(++Entry) + " <<");
+ if (Action.ValueForTypeID >= 0)
+ Asm->OutStreamer.AddComment(Twine(" Catch TypeInfo ") +
+ llvm::itostr(Action.ValueForTypeID));
+ else
+ Asm->OutStreamer.AddComment(Twine(" Filter TypeInfo ") +
+ llvm::itostr(Action.ValueForTypeID));
+
+ if (Action.NextAction == 0) {
+ Asm->OutStreamer.AddComment(" No further actions");
+ } else {
+ unsigned NextAction = Entry + (Action.NextAction + 1) / 2;
+ Asm->OutStreamer.AddComment(Twine(" Continue to action ") +
+ llvm::utostr(NextAction));
+ }
+
+ Asm->OutStreamer.AddBlankLine();
+ }
// Type Filter
//
// Used by the runtime to match the type of the thrown exception to the
// type of the catch clauses or the types in the exception specification.
- Asm->EmitSLEB128(Action.ValueForTypeID, " TypeInfo index");
+ Asm->EmitSLEB128(Action.ValueForTypeID);
// Action Record
//
// Self-relative signed displacement in bytes of the next action record,
// or 0 if there is no next action record.
- Asm->EmitSLEB128(Action.NextAction, " Next action");
+ Asm->EmitSLEB128(Action.NextAction);
}
// Emit the Catch TypeInfos.
- if (!TypeInfos.empty()) {
- Asm->OutStreamer.AddComment("-- Catch TypeInfos --");
+ if (VerboseAsm && !TypeInfos.empty()) {
+ Asm->OutStreamer.AddComment(">> Catch TypeInfos <<");
Asm->OutStreamer.AddBlankLine();
+ Entry = TypeInfos.size();
}
+
for (std::vector<const GlobalVariable *>::const_reverse_iterator
I = TypeInfos.rbegin(), E = TypeInfos.rend(); I != E; ++I) {
const GlobalVariable *GV = *I;
-
- Asm->OutStreamer.AddComment("TypeInfo");
+ if (VerboseAsm)
+ Asm->OutStreamer.AddComment(Twine("TypeInfo ") + llvm::utostr(Entry--));
if (GV)
Asm->EmitReference(GV, TTypeEncoding);
else
@@ -644,14 +700,21 @@ void DwarfException::EmitExceptionTable() {
}
// Emit the Exception Specifications.
- if (!FilterIds.empty()) {
- Asm->OutStreamer.AddComment("-- Filter IDs --");
+ if (VerboseAsm && !FilterIds.empty()) {
+ Asm->OutStreamer.AddComment(">> Filter TypeInfos <<");
Asm->OutStreamer.AddBlankLine();
+ Entry = 0;
}
for (std::vector<unsigned>::const_iterator
I = FilterIds.begin(), E = FilterIds.end(); I < E; ++I) {
unsigned TypeID = *I;
- Asm->EmitULEB128(TypeID, TypeID != 0 ? "Exception specification" : 0);
+ if (VerboseAsm) {
+ --Entry;
+ if (TypeID != 0)
+ Asm->OutStreamer.AddComment(Twine("FilterInfo ") + llvm::itostr(Entry));
+ }
+
+ Asm->EmitULEB128(TypeID);
}
Asm->EmitAlignment(2);
diff --git a/contrib/llvm/lib/CodeGen/BranchFolding.cpp b/contrib/llvm/lib/CodeGen/BranchFolding.cpp
index 719cd26..99090a8 100644
--- a/contrib/llvm/lib/CodeGen/BranchFolding.cpp
+++ b/contrib/llvm/lib/CodeGen/BranchFolding.cpp
@@ -108,6 +108,9 @@ void BranchFolder::RemoveDeadBlock(MachineBasicBlock *MBB) {
while (!MBB->succ_empty())
MBB->removeSuccessor(MBB->succ_end()-1);
+ // Avoid matching if this pointer gets reused.
+ TriedMerging.erase(MBB);
+
// Remove the block.
MF->erase(MBB);
}
@@ -171,6 +174,8 @@ bool BranchFolder::OptimizeFunction(MachineFunction &MF,
MachineModuleInfo *mmi) {
if (!tii) return false;
+ TriedMerging.clear();
+
TII = tii;
TRI = tri;
MMI = mmi;
@@ -361,11 +366,31 @@ static unsigned ComputeCommonTailLength(MachineBasicBlock *MBB1,
return TailLen;
}
+void BranchFolder::MaintainLiveIns(MachineBasicBlock *CurMBB,
+ MachineBasicBlock *NewMBB) {
+ if (RS) {
+ RS->enterBasicBlock(CurMBB);
+ if (!CurMBB->empty())
+ RS->forward(prior(CurMBB->end()));
+ BitVector RegsLiveAtExit(TRI->getNumRegs());
+ RS->getRegsUsed(RegsLiveAtExit, false);
+ for (unsigned int i = 0, e = TRI->getNumRegs(); i != e; i++)
+ if (RegsLiveAtExit[i])
+ NewMBB->addLiveIn(i);
+ }
+}
+
/// ReplaceTailWithBranchTo - Delete the instruction OldInst and everything
/// after it, replacing it with an unconditional branch to NewDest.
void BranchFolder::ReplaceTailWithBranchTo(MachineBasicBlock::iterator OldInst,
MachineBasicBlock *NewDest) {
+ MachineBasicBlock *CurMBB = OldInst->getParent();
+
TII->ReplaceTailWithBranchTo(OldInst, NewDest);
+
+ // For targets that use the register scavenger, we must maintain LiveIns.
+ MaintainLiveIns(CurMBB, NewDest);
+
++NumTailMerge;
}
@@ -394,16 +419,7 @@ MachineBasicBlock *BranchFolder::SplitMBBAt(MachineBasicBlock &CurMBB,
NewMBB->splice(NewMBB->end(), &CurMBB, BBI1, CurMBB.end());
// For targets that use the register scavenger, we must maintain LiveIns.
- if (RS) {
- RS->enterBasicBlock(&CurMBB);
- if (!CurMBB.empty())
- RS->forward(prior(CurMBB.end()));
- BitVector RegsLiveAtExit(TRI->getNumRegs());
- RS->getRegsUsed(RegsLiveAtExit, false);
- for (unsigned int i = 0, e = TRI->getNumRegs(); i != e; i++)
- if (RegsLiveAtExit[i])
- NewMBB->addLiveIn(i);
- }
+ MaintainLiveIns(&CurMBB, NewMBB);
return NewMBB;
}
@@ -416,10 +432,10 @@ static unsigned EstimateRuntime(MachineBasicBlock::iterator I,
for (; I != E; ++I) {
if (I->isDebugValue())
continue;
- const TargetInstrDesc &TID = I->getDesc();
- if (TID.isCall())
+ const MCInstrDesc &MCID = I->getDesc();
+ if (MCID.isCall())
Time += 10;
- else if (TID.mayLoad() || TID.mayStore())
+ else if (MCID.mayLoad() || MCID.mayStore())
Time += 2;
else
++Time;
@@ -799,14 +815,21 @@ bool BranchFolder::TailMergeBlocks(MachineFunction &MF) {
// First find blocks with no successors.
MergePotentials.clear();
- for (MachineFunction::iterator I = MF.begin(), E = MF.end(); I != E; ++I) {
+ for (MachineFunction::iterator I = MF.begin(), E = MF.end();
+ I != E && MergePotentials.size() < TailMergeThreshold; ++I) {
+ if (TriedMerging.count(I))
+ continue;
if (I->succ_empty())
MergePotentials.push_back(MergePotentialsElt(HashEndOfMBB(I), I));
}
+ // If this is a large problem, avoid visiting the same basic blocks
+ // multiple times.
+ if (MergePotentials.size() == TailMergeThreshold)
+ for (unsigned i = 0, e = MergePotentials.size(); i != e; ++i)
+ TriedMerging.insert(MergePotentials[i].getBlock());
// See if we can do any tail merging on those.
- if (MergePotentials.size() < TailMergeThreshold &&
- MergePotentials.size() >= 2)
+ if (MergePotentials.size() >= 2)
MadeChange |= TryTailMergeBlocks(NULL, NULL);
// Look at blocks (IBB) with multiple predecessors (PBB).
@@ -830,15 +853,17 @@ bool BranchFolder::TailMergeBlocks(MachineFunction &MF) {
for (MachineFunction::iterator I = llvm::next(MF.begin()), E = MF.end();
I != E; ++I) {
- if (I->pred_size() >= 2 && I->pred_size() < TailMergeThreshold) {
+ if (I->pred_size() >= 2) {
SmallPtrSet<MachineBasicBlock *, 8> UniquePreds;
MachineBasicBlock *IBB = I;
MachineBasicBlock *PredBB = prior(I);
MergePotentials.clear();
for (MachineBasicBlock::pred_iterator P = I->pred_begin(),
E2 = I->pred_end();
- P != E2; ++P) {
+ P != E2 && MergePotentials.size() < TailMergeThreshold; ++P) {
MachineBasicBlock *PBB = *P;
+ if (TriedMerging.count(PBB))
+ continue;
// Skip blocks that loop to themselves, can't tail merge these.
if (PBB == IBB)
continue;
@@ -891,6 +916,11 @@ bool BranchFolder::TailMergeBlocks(MachineFunction &MF) {
MergePotentials.push_back(MergePotentialsElt(HashEndOfMBB(PBB), *P));
}
}
+ // If this is a large problem, avoid visiting the same basic blocks
+ // multiple times.
+ if (MergePotentials.size() == TailMergeThreshold)
+ for (unsigned i = 0, e = MergePotentials.size(); i != e; ++i)
+ TriedMerging.insert(MergePotentials[i].getBlock());
if (MergePotentials.size() >= 2)
MadeChange |= TryTailMergeBlocks(IBB, PredBB);
// Reinsert an unconditional branch if needed.
diff --git a/contrib/llvm/lib/CodeGen/BranchFolding.h b/contrib/llvm/lib/CodeGen/BranchFolding.h
index 4daf4ec..df795df 100644
--- a/contrib/llvm/lib/CodeGen/BranchFolding.h
+++ b/contrib/llvm/lib/CodeGen/BranchFolding.h
@@ -10,6 +10,7 @@
#ifndef LLVM_CODEGEN_BRANCHFOLDING_HPP
#define LLVM_CODEGEN_BRANCHFOLDING_HPP
+#include "llvm/ADT/SmallPtrSet.h"
#include "llvm/CodeGen/MachineBasicBlock.h"
#include <vector>
@@ -47,6 +48,7 @@ namespace llvm {
};
typedef std::vector<MergePotentialsElt>::iterator MPIterator;
std::vector<MergePotentialsElt> MergePotentials;
+ SmallPtrSet<const MachineBasicBlock*, 2> TriedMerging;
class SameTailElt {
MPIterator MPIter;
@@ -93,6 +95,8 @@ namespace llvm {
bool TailMergeBlocks(MachineFunction &MF);
bool TryTailMergeBlocks(MachineBasicBlock* SuccBB,
MachineBasicBlock* PredBB);
+ void MaintainLiveIns(MachineBasicBlock *CurMBB,
+ MachineBasicBlock *NewMBB);
void ReplaceTailWithBranchTo(MachineBasicBlock::iterator OldInst,
MachineBasicBlock *NewDest);
MachineBasicBlock *SplitMBBAt(MachineBasicBlock &CurMBB,
diff --git a/contrib/llvm/lib/CodeGen/CalcSpillWeights.cpp b/contrib/llvm/lib/CodeGen/CalcSpillWeights.cpp
index 5d722ee..e6b3bbc 100644
--- a/contrib/llvm/lib/CodeGen/CalcSpillWeights.cpp
+++ b/contrib/llvm/lib/CodeGen/CalcSpillWeights.cpp
@@ -188,6 +188,7 @@ void VirtRegAuxInfo::CalculateWeightAndHint(LiveInterval &li) {
void VirtRegAuxInfo::CalculateRegClass(unsigned reg) {
MachineRegisterInfo &MRI = MF.getRegInfo();
+ const TargetInstrInfo *TII = MF.getTarget().getInstrInfo();
const TargetRegisterInfo *TRI = MF.getTarget().getRegisterInfo();
const TargetRegisterClass *OldRC = MRI.getRegClass(reg);
const TargetRegisterClass *NewRC = TRI->getLargestLegalSuperClass(OldRC);
@@ -202,8 +203,11 @@ void VirtRegAuxInfo::CalculateRegClass(unsigned reg) {
// TRI doesn't have accurate enough information to model this yet.
if (I.getOperand().getSubReg())
return;
+ // Inline asm instuctions don't remember their constraints.
+ if (I->isInlineAsm())
+ return;
const TargetRegisterClass *OpRC =
- I->getDesc().getRegClass(I.getOperandNo(), TRI);
+ TII->getRegClass(I->getDesc(), I.getOperandNo(), TRI);
if (OpRC)
NewRC = getCommonSubClass(NewRC, OpRC);
if (!NewRC || NewRC == OldRC)
diff --git a/contrib/llvm/lib/CodeGen/CodeGen.cpp b/contrib/llvm/lib/CodeGen/CodeGen.cpp
index 515e6f9..489746c 100644
--- a/contrib/llvm/lib/CodeGen/CodeGen.cpp
+++ b/contrib/llvm/lib/CodeGen/CodeGen.cpp
@@ -37,13 +37,11 @@ void llvm::initializeCodeGen(PassRegistry &Registry) {
initializeOptimizePHIsPass(Registry);
initializePHIEliminationPass(Registry);
initializePeepholeOptimizerPass(Registry);
- initializePreAllocSplittingPass(Registry);
initializeProcessImplicitDefsPass(Registry);
initializePEIPass(Registry);
initializeRALinScanPass(Registry);
- initializeRegisterCoalescerAnalysisGroup(Registry);
+ initializeRegisterCoalescerPass(Registry);
initializeRenderMachineFunctionPass(Registry);
- initializeSimpleRegisterCoalescingPass(Registry);
initializeSlotIndexesPass(Registry);
initializeLoopSplitterPass(Registry);
initializeStackProtectorPass(Registry);
diff --git a/contrib/llvm/lib/CodeGen/CriticalAntiDepBreaker.cpp b/contrib/llvm/lib/CodeGen/CriticalAntiDepBreaker.cpp
index 51d984f..84c4d59 100644
--- a/contrib/llvm/lib/CodeGen/CriticalAntiDepBreaker.cpp
+++ b/contrib/llvm/lib/CodeGen/CriticalAntiDepBreaker.cpp
@@ -27,12 +27,12 @@
using namespace llvm;
CriticalAntiDepBreaker::
-CriticalAntiDepBreaker(MachineFunction& MFi) :
+CriticalAntiDepBreaker(MachineFunction& MFi, const RegisterClassInfo &RCI) :
AntiDepBreaker(), MF(MFi),
MRI(MF.getRegInfo()),
TII(MF.getTarget().getInstrInfo()),
TRI(MF.getTarget().getRegisterInfo()),
- AllocatableSet(TRI->getAllocatableSet(MF)),
+ RegClassInfo(RCI),
Classes(TRI->getNumRegs(), static_cast<const TargetRegisterClass *>(0)),
KillIndices(TRI->getNumRegs(), 0),
DefIndices(TRI->getNumRegs(), 0) {}
@@ -207,7 +207,7 @@ void CriticalAntiDepBreaker::PrescanInstruction(MachineInstr *MI) {
const TargetRegisterClass *NewRC = 0;
if (i < MI->getDesc().getNumOperands())
- NewRC = MI->getDesc().OpInfo[i].getRegClass(TRI);
+ NewRC = TII->getRegClass(MI->getDesc(), i, TRI);
// For now, only allow the register to be changed if its register
// class is consistent across all uses.
@@ -295,7 +295,7 @@ void CriticalAntiDepBreaker::ScanInstruction(MachineInstr *MI,
const TargetRegisterClass *NewRC = 0;
if (i < MI->getDesc().getNumOperands())
- NewRC = MI->getDesc().OpInfo[i].getRegClass(TRI);
+ NewRC = TII->getRegClass(MI->getDesc(), i, TRI);
// For now, only allow the register to be changed if its register
// class is consistent across all uses.
@@ -385,11 +385,9 @@ CriticalAntiDepBreaker::findSuitableFreeRegister(RegRefIter RegRefBegin,
unsigned LastNewReg,
const TargetRegisterClass *RC)
{
- for (TargetRegisterClass::iterator R = RC->allocation_order_begin(MF),
- RE = RC->allocation_order_end(MF); R != RE; ++R) {
- unsigned NewReg = *R;
- // Don't consider non-allocatable registers
- if (!AllocatableSet.test(NewReg)) continue;
+ ArrayRef<unsigned> Order = RegClassInfo.getOrder(RC);
+ for (unsigned i = 0; i != Order.size(); ++i) {
+ unsigned NewReg = Order[i];
// Don't replace a register with itself.
if (NewReg == AntiDepReg) continue;
// Don't replace a register with one that was recently used to repair
@@ -534,7 +532,7 @@ BreakAntiDependencies(const std::vector<SUnit>& SUnits,
if (Edge->getKind() == SDep::Anti) {
AntiDepReg = Edge->getReg();
assert(AntiDepReg != 0 && "Anti-dependence on reg0?");
- if (!AllocatableSet.test(AntiDepReg))
+ if (!RegClassInfo.isAllocatable(AntiDepReg))
// Don't break anti-dependencies on non-allocatable registers.
AntiDepReg = 0;
else if (KeepRegs.count(AntiDepReg))
diff --git a/contrib/llvm/lib/CodeGen/CriticalAntiDepBreaker.h b/contrib/llvm/lib/CodeGen/CriticalAntiDepBreaker.h
index 5bbb8f5..0710780 100644
--- a/contrib/llvm/lib/CodeGen/CriticalAntiDepBreaker.h
+++ b/contrib/llvm/lib/CodeGen/CriticalAntiDepBreaker.h
@@ -17,6 +17,7 @@
#define LLVM_CODEGEN_CRITICALANTIDEPBREAKER_H
#include "AntiDepBreaker.h"
+#include "RegisterClassInfo.h"
#include "llvm/CodeGen/MachineBasicBlock.h"
#include "llvm/CodeGen/MachineFrameInfo.h"
#include "llvm/CodeGen/MachineFunction.h"
@@ -27,6 +28,7 @@
#include <map>
namespace llvm {
+class RegisterClassInfo;
class TargetInstrInfo;
class TargetRegisterInfo;
@@ -35,6 +37,7 @@ class TargetRegisterInfo;
MachineRegisterInfo &MRI;
const TargetInstrInfo *TII;
const TargetRegisterInfo *TRI;
+ const RegisterClassInfo &RegClassInfo;
/// AllocatableSet - The set of allocatable registers.
/// We'll be ignoring anti-dependencies on non-allocatable registers,
@@ -66,7 +69,7 @@ class TargetRegisterInfo;
SmallSet<unsigned, 4> KeepRegs;
public:
- CriticalAntiDepBreaker(MachineFunction& MFi);
+ CriticalAntiDepBreaker(MachineFunction& MFi, const RegisterClassInfo&);
~CriticalAntiDepBreaker();
/// Start - Initialize anti-dep breaking for a new basic block.
diff --git a/contrib/llvm/lib/CodeGen/DeadMachineInstructionElim.cpp b/contrib/llvm/lib/CodeGen/DeadMachineInstructionElim.cpp
index fdc1d91..6de6c0c 100644
--- a/contrib/llvm/lib/CodeGen/DeadMachineInstructionElim.cpp
+++ b/contrib/llvm/lib/CodeGen/DeadMachineInstructionElim.cpp
@@ -110,9 +110,14 @@ bool DeadMachineInstructionElim::runOnMachineFunction(MachineFunction &MF) {
LivePhysRegs.set(Reg);
}
- // FIXME: Add live-ins from sucessors to LivePhysRegs. Normally, physregs
- // are not live across blocks, but some targets (x86) can have flags live
- // out of a block.
+ // Add live-ins from sucessors to LivePhysRegs. Normally, physregs are not
+ // live across blocks, but some targets (x86) can have flags live out of a
+ // block.
+ for (MachineBasicBlock::succ_iterator S = MBB->succ_begin(),
+ E = MBB->succ_end(); S != E; S++)
+ for (MachineBasicBlock::livein_iterator LI = (*S)->livein_begin();
+ LI != (*S)->livein_end(); LI++)
+ LivePhysRegs.set(*LI);
// Now scan the instructions and delete dead ones, tracking physreg
// liveness as we go.
diff --git a/contrib/llvm/lib/CodeGen/DwarfEHPrepare.cpp b/contrib/llvm/lib/CodeGen/DwarfEHPrepare.cpp
index 22c5465..03604b0 100644
--- a/contrib/llvm/lib/CodeGen/DwarfEHPrepare.cpp
+++ b/contrib/llvm/lib/CodeGen/DwarfEHPrepare.cpp
@@ -336,8 +336,7 @@ bool DwarfEHPrepare::HandleURoRInvokes() {
Args.push_back(EHCatchAllValue->getInitializer()); // Catch-all indicator.
CallInst *NewSelector =
- CallInst::Create(SelectorIntrinsic, Args.begin(), Args.end(),
- "eh.sel.catch.all", II);
+ CallInst::Create(SelectorIntrinsic, Args, "eh.sel.catch.all", II);
NewSelector->setTailCall(II->isTailCall());
NewSelector->setAttributes(II->getAttributes());
@@ -497,10 +496,8 @@ bool DwarfEHPrepare::LowerUnwindsAndResumes() {
// Find the rewind function if we didn't already.
if (!RewindFunction) {
LLVMContext &Ctx = ResumeInsts[0]->getContext();
- std::vector<const Type*>
- Params(1, Type::getInt8PtrTy(Ctx));
FunctionType *FTy = FunctionType::get(Type::getVoidTy(Ctx),
- Params, false);
+ Type::getInt8PtrTy(Ctx), false);
const char *RewindName = TLI->getLibcallName(RTLIB::UNWIND_RESUME);
RewindFunction = F->getParent()->getOrInsertFunction(RewindName, FTy);
}
diff --git a/contrib/llvm/lib/CodeGen/ELFWriter.cpp b/contrib/llvm/lib/CodeGen/ELFWriter.cpp
index fa2319b..d977651 100644
--- a/contrib/llvm/lib/CodeGen/ELFWriter.cpp
+++ b/contrib/llvm/lib/CodeGen/ELFWriter.cpp
@@ -659,11 +659,11 @@ bool ELFWriter::EmitSpecialLLVMGlobal(const GlobalVariable *GV) {
/// EmitXXStructorList - Emit the ctor or dtor list. This just emits out the
/// function pointers, ignoring the init priority.
-void ELFWriter::EmitXXStructorList(Constant *List, ELFSection &Xtor) {
+void ELFWriter::EmitXXStructorList(const Constant *List, ELFSection &Xtor) {
// Should be an array of '{ i32, void ()* }' structs. The first value is the
// init priority, which we ignore.
if (List->isNullValue()) return;
- ConstantArray *InitList = cast<ConstantArray>(List);
+ const ConstantArray *InitList = cast<ConstantArray>(List);
for (unsigned i = 0, e = InitList->getNumOperands(); i != e; ++i) {
if (InitList->getOperand(i)->isNullValue())
continue;
diff --git a/contrib/llvm/lib/CodeGen/ELFWriter.h b/contrib/llvm/lib/CodeGen/ELFWriter.h
index b8bac55..6f7fbac 100644
--- a/contrib/llvm/lib/CodeGen/ELFWriter.h
+++ b/contrib/llvm/lib/CodeGen/ELFWriter.h
@@ -232,7 +232,7 @@ namespace llvm {
void EmitGlobalDataRelocation(const GlobalValue *GV, unsigned Size,
ELFSection &GblS, int64_t Offset = 0);
bool EmitSpecialLLVMGlobal(const GlobalVariable *GV);
- void EmitXXStructorList(Constant *List, ELFSection &Xtor);
+ void EmitXXStructorList(const Constant *List, ELFSection &Xtor);
void EmitRelocations();
void EmitRelocation(BinaryObject &RelSec, ELFRelocation &Rel, bool HasRelA);
void EmitSectionHeader(BinaryObject &SHdrTab, const ELFSection &SHdr);
diff --git a/contrib/llvm/lib/CodeGen/EdgeBundles.cpp b/contrib/llvm/lib/CodeGen/EdgeBundles.cpp
index 646e014..a7aba89 100644
--- a/contrib/llvm/lib/CodeGen/EdgeBundles.cpp
+++ b/contrib/llvm/lib/CodeGen/EdgeBundles.cpp
@@ -39,7 +39,7 @@ void EdgeBundles::getAnalysisUsage(AnalysisUsage &AU) const {
bool EdgeBundles::runOnMachineFunction(MachineFunction &mf) {
MF = &mf;
EC.clear();
- EC.grow(2 * MF->size());
+ EC.grow(2 * MF->getNumBlockIDs());
for (MachineFunction::const_iterator I = MF->begin(), E = MF->end(); I != E;
++I) {
diff --git a/contrib/llvm/lib/CodeGen/ExpandISelPseudos.cpp b/contrib/llvm/lib/CodeGen/ExpandISelPseudos.cpp
index ebc2fc9..a67140e 100644
--- a/contrib/llvm/lib/CodeGen/ExpandISelPseudos.cpp
+++ b/contrib/llvm/lib/CodeGen/ExpandISelPseudos.cpp
@@ -62,8 +62,8 @@ bool ExpandISelPseudos::runOnMachineFunction(MachineFunction &MF) {
MachineInstr *MI = MBBI++;
// If MI is a pseudo, expand it.
- const TargetInstrDesc &TID = MI->getDesc();
- if (TID.usesCustomInsertionHook()) {
+ const MCInstrDesc &MCID = MI->getDesc();
+ if (MCID.usesCustomInsertionHook()) {
Changed = true;
MachineBasicBlock *NewMBB =
TLI->EmitInstrWithCustomInserter(MI, MBB);
diff --git a/contrib/llvm/lib/CodeGen/IfConversion.cpp b/contrib/llvm/lib/CodeGen/IfConversion.cpp
index 8b2c981..6cb2277 100644
--- a/contrib/llvm/lib/CodeGen/IfConversion.cpp
+++ b/contrib/llvm/lib/CodeGen/IfConversion.cpp
@@ -18,11 +18,12 @@
#include "llvm/CodeGen/MachineModuleInfo.h"
#include "llvm/CodeGen/MachineFunctionPass.h"
#include "llvm/CodeGen/MachineLoopInfo.h"
+#include "llvm/MC/MCInstrItineraries.h"
#include "llvm/Target/TargetInstrInfo.h"
-#include "llvm/Target/TargetInstrItineraries.h"
#include "llvm/Target/TargetLowering.h"
#include "llvm/Target/TargetMachine.h"
#include "llvm/Target/TargetRegisterInfo.h"
+#include "llvm/Support/BranchProbability.h"
#include "llvm/Support/CommandLine.h"
#include "llvm/Support/Debug.h"
#include "llvm/Support/ErrorHandling.h"
@@ -173,10 +174,10 @@ namespace {
private:
bool ReverseBranchCondition(BBInfo &BBI);
bool ValidSimple(BBInfo &TrueBBI, unsigned &Dups,
- float Prediction, float Confidence) const;
+ const BranchProbability &Prediction) const;
bool ValidTriangle(BBInfo &TrueBBI, BBInfo &FalseBBI,
bool FalseBranch, unsigned &Dups,
- float Prediction, float Confidence) const;
+ const BranchProbability &Prediction) const;
bool ValidDiamond(BBInfo &TrueBBI, BBInfo &FalseBBI,
unsigned &Dups1, unsigned &Dups2) const;
void ScanInstructions(BBInfo &BBI);
@@ -203,19 +204,19 @@ namespace {
bool MeetIfcvtSizeLimit(MachineBasicBlock &BB,
unsigned Cycle, unsigned Extra,
- float Prediction, float Confidence) const {
+ const BranchProbability &Prediction) const {
return Cycle > 0 && TII->isProfitableToIfCvt(BB, Cycle, Extra,
- Prediction, Confidence);
+ Prediction);
}
bool MeetIfcvtSizeLimit(MachineBasicBlock &TBB,
unsigned TCycle, unsigned TExtra,
MachineBasicBlock &FBB,
unsigned FCycle, unsigned FExtra,
- float Prediction, float Confidence) const {
+ const BranchProbability &Prediction) const {
return TCycle > 0 && FCycle > 0 &&
TII->isProfitableToIfCvt(TBB, TCycle, TExtra, FBB, FCycle, FExtra,
- Prediction, Confidence);
+ Prediction);
}
// blockAlwaysFallThrough - Block ends without a terminator.
@@ -450,7 +451,7 @@ static inline MachineBasicBlock *getNextBlock(MachineBasicBlock *BB) {
/// number of instructions that the ifcvt would need to duplicate if performed
/// in Dups.
bool IfConverter::ValidSimple(BBInfo &TrueBBI, unsigned &Dups,
- float Prediction, float Confidence) const {
+ const BranchProbability &Prediction) const {
Dups = 0;
if (TrueBBI.IsBeingAnalyzed || TrueBBI.IsDone)
return false;
@@ -461,7 +462,7 @@ bool IfConverter::ValidSimple(BBInfo &TrueBBI, unsigned &Dups,
if (TrueBBI.BB->pred_size() > 1) {
if (TrueBBI.CannotBeCopied ||
!TII->isProfitableToDupForIfCvt(*TrueBBI.BB, TrueBBI.NonPredSize,
- Prediction, Confidence))
+ Prediction))
return false;
Dups = TrueBBI.NonPredSize;
}
@@ -477,7 +478,7 @@ bool IfConverter::ValidSimple(BBInfo &TrueBBI, unsigned &Dups,
/// if performed in 'Dups'.
bool IfConverter::ValidTriangle(BBInfo &TrueBBI, BBInfo &FalseBBI,
bool FalseBranch, unsigned &Dups,
- float Prediction, float Confidence) const {
+ const BranchProbability &Prediction) const {
Dups = 0;
if (TrueBBI.IsBeingAnalyzed || TrueBBI.IsDone)
return false;
@@ -499,8 +500,7 @@ bool IfConverter::ValidTriangle(BBInfo &TrueBBI, BBInfo &FalseBBI,
++Size;
}
}
- if (!TII->isProfitableToDupForIfCvt(*TrueBBI.BB, Size,
- Prediction, Confidence))
+ if (!TII->isProfitableToDupForIfCvt(*TrueBBI.BB, Size, Prediction))
return false;
Dups = Size;
}
@@ -651,12 +651,12 @@ void IfConverter::ScanInstructions(BBInfo &BBI) {
if (I->isDebugValue())
continue;
- const TargetInstrDesc &TID = I->getDesc();
- if (TID.isNotDuplicable())
+ const MCInstrDesc &MCID = I->getDesc();
+ if (MCID.isNotDuplicable())
BBI.CannotBeCopied = true;
bool isPredicated = TII->isPredicated(I);
- bool isCondBr = BBI.IsBrAnalyzable && TID.isConditionalBranch();
+ bool isCondBr = BBI.IsBrAnalyzable && MCID.isConditionalBranch();
if (!isCondBr) {
if (!isPredicated) {
@@ -751,8 +751,9 @@ IfConverter::BBInfo &IfConverter::AnalyzeBlock(MachineBasicBlock *BB,
ScanInstructions(BBI);
- // Unanalyzable or ends with fallthrough or unconditional branch.
- if (!BBI.IsBrAnalyzable || BBI.BrCond.empty()) {
+ // Unanalyzable or ends with fallthrough or unconditional branch, or if is not
+ // considered for ifcvt anymore.
+ if (!BBI.IsBrAnalyzable || BBI.BrCond.empty() || BBI.IsDone) {
BBI.IsBeingAnalyzed = false;
BBI.IsAnalyzed = true;
return BBI;
@@ -795,21 +796,20 @@ IfConverter::BBInfo &IfConverter::AnalyzeBlock(MachineBasicBlock *BB,
// - backedge -> 90% taken
// - early exit -> 20% taken
// - branch predictor confidence -> 90%
- float Prediction = 0.5f;
- float Confidence = 0.9f;
+ BranchProbability Prediction(5, 10);
MachineLoop *Loop = MLI->getLoopFor(BB);
if (Loop) {
if (TrueBBI.BB == Loop->getHeader())
- Prediction = 0.9f;
+ Prediction = BranchProbability(9, 10);
else if (FalseBBI.BB == Loop->getHeader())
- Prediction = 0.1f;
+ Prediction = BranchProbability(1, 10);
MachineLoop *TrueLoop = MLI->getLoopFor(TrueBBI.BB);
MachineLoop *FalseLoop = MLI->getLoopFor(FalseBBI.BB);
if (!TrueLoop || TrueLoop->getParentLoop() == Loop)
- Prediction = 0.2f;
+ Prediction = BranchProbability(2, 10);
else if (!FalseLoop || FalseLoop->getParentLoop() == Loop)
- Prediction = 0.8f;
+ Prediction = BranchProbability(8, 10);
}
if (CanRevCond && ValidDiamond(TrueBBI, FalseBBI, Dups, Dups2) &&
@@ -817,7 +817,7 @@ IfConverter::BBInfo &IfConverter::AnalyzeBlock(MachineBasicBlock *BB,
TrueBBI.ExtraCost), TrueBBI.ExtraCost2,
*FalseBBI.BB, (FalseBBI.NonPredSize - (Dups + Dups2) +
FalseBBI.ExtraCost),FalseBBI.ExtraCost2,
- Prediction, Confidence) &&
+ Prediction) &&
FeasibilityAnalysis(TrueBBI, BBI.BrCond) &&
FeasibilityAnalysis(FalseBBI, RevCond)) {
// Diamond:
@@ -833,9 +833,9 @@ IfConverter::BBInfo &IfConverter::AnalyzeBlock(MachineBasicBlock *BB,
Enqueued = true;
}
- if (ValidTriangle(TrueBBI, FalseBBI, false, Dups, Prediction, Confidence) &&
+ if (ValidTriangle(TrueBBI, FalseBBI, false, Dups, Prediction) &&
MeetIfcvtSizeLimit(*TrueBBI.BB, TrueBBI.NonPredSize + TrueBBI.ExtraCost,
- TrueBBI.ExtraCost2, Prediction, Confidence) &&
+ TrueBBI.ExtraCost2, Prediction) &&
FeasibilityAnalysis(TrueBBI, BBI.BrCond, true)) {
// Triangle:
// EBB
@@ -848,17 +848,17 @@ IfConverter::BBInfo &IfConverter::AnalyzeBlock(MachineBasicBlock *BB,
Enqueued = true;
}
- if (ValidTriangle(TrueBBI, FalseBBI, true, Dups, Prediction, Confidence) &&
+ if (ValidTriangle(TrueBBI, FalseBBI, true, Dups, Prediction) &&
MeetIfcvtSizeLimit(*TrueBBI.BB, TrueBBI.NonPredSize + TrueBBI.ExtraCost,
- TrueBBI.ExtraCost2, Prediction, Confidence) &&
+ TrueBBI.ExtraCost2, Prediction) &&
FeasibilityAnalysis(TrueBBI, BBI.BrCond, true, true)) {
Tokens.push_back(new IfcvtToken(BBI, ICTriangleRev, TNeedSub, Dups));
Enqueued = true;
}
- if (ValidSimple(TrueBBI, Dups, Prediction, Confidence) &&
+ if (ValidSimple(TrueBBI, Dups, Prediction) &&
MeetIfcvtSizeLimit(*TrueBBI.BB, TrueBBI.NonPredSize + TrueBBI.ExtraCost,
- TrueBBI.ExtraCost2, Prediction, Confidence) &&
+ TrueBBI.ExtraCost2, Prediction) &&
FeasibilityAnalysis(TrueBBI, BBI.BrCond)) {
// Simple (split, no rejoin):
// EBB
@@ -874,29 +874,29 @@ IfConverter::BBInfo &IfConverter::AnalyzeBlock(MachineBasicBlock *BB,
if (CanRevCond) {
// Try the other path...
if (ValidTriangle(FalseBBI, TrueBBI, false, Dups,
- 1.0-Prediction, Confidence) &&
+ Prediction.getCompl()) &&
MeetIfcvtSizeLimit(*FalseBBI.BB,
FalseBBI.NonPredSize + FalseBBI.ExtraCost,
- FalseBBI.ExtraCost2, 1.0-Prediction, Confidence) &&
+ FalseBBI.ExtraCost2, Prediction.getCompl()) &&
FeasibilityAnalysis(FalseBBI, RevCond, true)) {
Tokens.push_back(new IfcvtToken(BBI, ICTriangleFalse, FNeedSub, Dups));
Enqueued = true;
}
if (ValidTriangle(FalseBBI, TrueBBI, true, Dups,
- 1.0-Prediction, Confidence) &&
+ Prediction.getCompl()) &&
MeetIfcvtSizeLimit(*FalseBBI.BB,
FalseBBI.NonPredSize + FalseBBI.ExtraCost,
- FalseBBI.ExtraCost2, 1.0-Prediction, Confidence) &&
+ FalseBBI.ExtraCost2, Prediction.getCompl()) &&
FeasibilityAnalysis(FalseBBI, RevCond, true, true)) {
Tokens.push_back(new IfcvtToken(BBI, ICTriangleFRev, FNeedSub, Dups));
Enqueued = true;
}
- if (ValidSimple(FalseBBI, Dups, 1.0-Prediction, Confidence) &&
+ if (ValidSimple(FalseBBI, Dups, Prediction.getCompl()) &&
MeetIfcvtSizeLimit(*FalseBBI.BB,
FalseBBI.NonPredSize + FalseBBI.ExtraCost,
- FalseBBI.ExtraCost2, 1.0-Prediction, Confidence) &&
+ FalseBBI.ExtraCost2, Prediction.getCompl()) &&
FeasibilityAnalysis(FalseBBI, RevCond)) {
Tokens.push_back(new IfcvtToken(BBI, ICSimpleFalse, FNeedSub, Dups));
Enqueued = true;
@@ -1414,9 +1414,9 @@ void IfConverter::CopyAndPredicateBlock(BBInfo &ToBBI, BBInfo &FromBBI,
for (MachineBasicBlock::iterator I = FromBBI.BB->begin(),
E = FromBBI.BB->end(); I != E; ++I) {
- const TargetInstrDesc &TID = I->getDesc();
+ const MCInstrDesc &MCID = I->getDesc();
// Do not copy the end of the block branches.
- if (IgnoreBr && TID.isBranch())
+ if (IgnoreBr && MCID.isBranch())
break;
MachineInstr *MI = MF.CloneMachineInstr(I);
diff --git a/contrib/llvm/lib/CodeGen/InlineSpiller.cpp b/contrib/llvm/lib/CodeGen/InlineSpiller.cpp
index 19ae333..5547f73 100644
--- a/contrib/llvm/lib/CodeGen/InlineSpiller.cpp
+++ b/contrib/llvm/lib/CodeGen/InlineSpiller.cpp
@@ -180,11 +180,7 @@ Spiller *createInlineSpiller(MachineFunctionPass &pass,
/// isFullCopyOf - If MI is a COPY to or from Reg, return the other register,
/// otherwise return 0.
static unsigned isFullCopyOf(const MachineInstr *MI, unsigned Reg) {
- if (!MI->isCopy())
- return 0;
- if (MI->getOperand(0).getSubReg() != 0)
- return 0;
- if (MI->getOperand(1).getSubReg() != 0)
+ if (!MI->isFullCopy())
return 0;
if (MI->getOperand(0).getReg() == Reg)
return MI->getOperand(1).getReg();
@@ -307,7 +303,8 @@ MachineInstr *InlineSpiller::traceSiblingValue(unsigned UseReg, VNInfo *UseVNI,
// Best spill candidate seen so far. This must dominate UseVNI.
SibValueInfo SVI(UseReg, UseVNI);
MachineBasicBlock *UseMBB = LIS.getMBBFromIndex(UseVNI->def);
- unsigned SpillDepth = Loops.getLoopDepth(UseMBB);
+ MachineBasicBlock *SpillMBB = UseMBB;
+ unsigned SpillDepth = Loops.getLoopDepth(SpillMBB);
bool SeenOrigPHI = false; // Original PHI met.
do {
@@ -320,7 +317,30 @@ MachineInstr *InlineSpiller::traceSiblingValue(unsigned UseReg, VNInfo *UseVNI,
// Is this value a better spill candidate?
if (!isRegToSpill(Reg)) {
MachineBasicBlock *MBB = LIS.getMBBFromIndex(VNI->def);
- if (MBB != UseMBB && MDT.dominates(MBB, UseMBB)) {
+ if (MBB == SpillMBB) {
+ // This is an alternative def earlier in the same MBB.
+ // Hoist the spill as far as possible in SpillMBB. This can ease
+ // register pressure:
+ //
+ // x = def
+ // y = use x
+ // s = copy x
+ //
+ // Hoisting the spill of s to immediately after the def removes the
+ // interference between x and y:
+ //
+ // x = def
+ // spill x
+ // y = use x<kill>
+ //
+ if (VNI->def < SVI.SpillVNI->def) {
+ DEBUG(dbgs() << " hoist in BB#" << MBB->getNumber() << ": "
+ << PrintReg(Reg) << ':' << VNI->id << '@' << VNI->def
+ << '\n');
+ SVI.SpillReg = Reg;
+ SVI.SpillVNI = VNI;
+ }
+ } else if (MBB != UseMBB && MDT.dominates(MBB, UseMBB)) {
// This is a valid spill location dominating UseVNI.
// Prefer to spill at a smaller loop depth.
unsigned Depth = Loops.getLoopDepth(MBB);
@@ -329,6 +349,7 @@ MachineInstr *InlineSpiller::traceSiblingValue(unsigned UseReg, VNInfo *UseVNI,
<< ':' << VNI->id << '@' << VNI->def << '\n');
SVI.SpillReg = Reg;
SVI.SpillVNI = VNI;
+ SpillMBB = MBB;
SpillDepth = Depth;
}
}
@@ -429,6 +450,7 @@ void InlineSpiller::analyzeSiblingValues() {
// Check possible sibling copies.
if (VNI->isPHIDef() || VNI->getCopy()) {
VNInfo *OrigVNI = OrigLI.getVNInfoAt(VNI->def);
+ assert(OrigVNI && "Def outside original live range");
if (OrigVNI->def != VNI->def)
DefMI = traceSiblingValue(Reg, VNI, OrigVNI);
}
diff --git a/contrib/llvm/lib/CodeGen/InterferenceCache.cpp b/contrib/llvm/lib/CodeGen/InterferenceCache.cpp
index b1014a9..a09bb39 100644
--- a/contrib/llvm/lib/CodeGen/InterferenceCache.cpp
+++ b/contrib/llvm/lib/CodeGen/InterferenceCache.cpp
@@ -14,6 +14,7 @@
#define DEBUG_TYPE "regalloc"
#include "InterferenceCache.h"
#include "llvm/Target/TargetRegisterInfo.h"
+#include "llvm/Support/ErrorHandling.h"
using namespace llvm;
@@ -40,9 +41,18 @@ InterferenceCache::Entry *InterferenceCache::get(unsigned PhysReg) {
E = RoundRobin;
if (++RoundRobin == CacheEntries)
RoundRobin = 0;
- Entries[E].reset(PhysReg, LIUArray, TRI, MF);
- PhysRegEntries[PhysReg] = E;
- return &Entries[E];
+ for (unsigned i = 0; i != CacheEntries; ++i) {
+ // Skip entries that are in use.
+ if (Entries[E].hasRefs()) {
+ if (++E == CacheEntries)
+ E = 0;
+ continue;
+ }
+ Entries[E].reset(PhysReg, LIUArray, TRI, MF);
+ PhysRegEntries[PhysReg] = E;
+ return &Entries[E];
+ }
+ llvm_unreachable("Ran out of interference cache entries.");
}
/// revalidate - LIU contents have changed, update tags.
@@ -59,6 +69,7 @@ void InterferenceCache::Entry::reset(unsigned physReg,
LiveIntervalUnion *LIUArray,
const TargetRegisterInfo *TRI,
const MachineFunction *MF) {
+ assert(!hasRefs() && "Cannot reset cache entry with references");
// LIU's changed, invalidate cache.
++Tag;
PhysReg = physReg;
diff --git a/contrib/llvm/lib/CodeGen/InterferenceCache.h b/contrib/llvm/lib/CodeGen/InterferenceCache.h
index 6c36fa4..7f0a27a 100644
--- a/contrib/llvm/lib/CodeGen/InterferenceCache.h
+++ b/contrib/llvm/lib/CodeGen/InterferenceCache.h
@@ -43,6 +43,9 @@ class InterferenceCache {
/// change.
unsigned Tag;
+ /// RefCount - The total number of Cursor instances referring to this Entry.
+ unsigned RefCount;
+
/// MF - The current function.
MachineFunction *MF;
@@ -68,9 +71,10 @@ class InterferenceCache {
void update(unsigned MBBNum);
public:
- Entry() : PhysReg(0), Tag(0), Indexes(0) {}
+ Entry() : PhysReg(0), Tag(0), RefCount(0), Indexes(0) {}
void clear(MachineFunction *mf, SlotIndexes *indexes) {
+ assert(!hasRefs() && "Cannot clear cache entry with references");
PhysReg = 0;
MF = mf;
Indexes = indexes;
@@ -78,6 +82,10 @@ class InterferenceCache {
unsigned getPhysReg() const { return PhysReg; }
+ void addRef(int Delta) { RefCount += Delta; }
+
+ bool hasRefs() const { return RefCount > 0; }
+
void revalidate();
/// valid - Return true if this is a valid entry for physReg.
@@ -122,15 +130,48 @@ public:
void init(MachineFunction*, LiveIntervalUnion*, SlotIndexes*,
const TargetRegisterInfo *);
+ /// getMaxCursors - Return the maximum number of concurrent cursors that can
+ /// be supported.
+ unsigned getMaxCursors() const { return CacheEntries; }
+
/// Cursor - The primary query interface for the block interference cache.
class Cursor {
Entry *CacheEntry;
BlockInterference *Current;
+
+ void setEntry(Entry *E) {
+ Current = 0;
+ // Update reference counts. Nothing happens when RefCount reaches 0, so
+ // we don't have to check for E == CacheEntry etc.
+ if (CacheEntry)
+ CacheEntry->addRef(-1);
+ CacheEntry = E;
+ if (CacheEntry)
+ CacheEntry->addRef(+1);
+ }
+
public:
- /// Cursor - Create a cursor for the interference allocated to PhysReg and
- /// all its aliases.
- Cursor(InterferenceCache &Cache, unsigned PhysReg)
- : CacheEntry(Cache.get(PhysReg)), Current(0) {}
+ /// Cursor - Create a dangling cursor.
+ Cursor() : CacheEntry(0), Current(0) {}
+ ~Cursor() { setEntry(0); }
+
+ Cursor(const Cursor &O) : CacheEntry(0), Current(0) {
+ setEntry(O.CacheEntry);
+ }
+
+ Cursor &operator=(const Cursor &O) {
+ setEntry(O.CacheEntry);
+ return *this;
+ }
+
+ /// setPhysReg - Point this cursor to PhysReg's interference.
+ void setPhysReg(InterferenceCache &Cache, unsigned PhysReg) {
+ // Release reference before getting a new one. That guarantees we can
+ // actually have CacheEntries live cursors.
+ setEntry(0);
+ if (PhysReg)
+ setEntry(Cache.get(PhysReg));
+ }
/// moveTo - Move cursor to basic block MBBNum.
void moveToBlock(unsigned MBBNum) {
diff --git a/contrib/llvm/lib/CodeGen/IntrinsicLowering.cpp b/contrib/llvm/lib/CodeGen/IntrinsicLowering.cpp
index 3861dda..611886f 100644
--- a/contrib/llvm/lib/CodeGen/IntrinsicLowering.cpp
+++ b/contrib/llvm/lib/CodeGen/IntrinsicLowering.cpp
@@ -29,7 +29,7 @@ static void EnsureFunctionExists(Module &M, const char *Name,
ArgIt ArgBegin, ArgIt ArgEnd,
const Type *RetTy) {
// Insert a correctly-typed definition now.
- std::vector<const Type *> ParamTys;
+ std::vector<Type *> ParamTys;
for (ArgIt I = ArgBegin; I != ArgEnd; ++I)
ParamTys.push_back(I->getType());
M.getOrInsertFunction(Name, FunctionType::get(RetTy, ParamTys, false));
@@ -69,7 +69,7 @@ static CallInst *ReplaceCallWith(const char *NewFn, CallInst *CI,
// program already contains a function with this name.
Module *M = CI->getParent()->getParent()->getParent();
// Get or insert the definition now.
- std::vector<const Type *> ParamTys;
+ std::vector<Type *> ParamTys;
for (ArgIt I = ArgBegin; I != ArgEnd; ++I)
ParamTys.push_back((*I)->getType());
Constant* FCache = M->getOrInsertFunction(NewFn,
@@ -77,7 +77,7 @@ static CallInst *ReplaceCallWith(const char *NewFn, CallInst *CI,
IRBuilder<> Builder(CI->getParent(), CI);
SmallVector<Value *, 8> Args(ArgBegin, ArgEnd);
- CallInst *NewCI = Builder.CreateCall(FCache, Args.begin(), Args.end());
+ CallInst *NewCI = Builder.CreateCall(FCache, Args);
NewCI->setName(CI->getName());
if (!CI->use_empty())
CI->replaceAllUsesWith(NewCI);
@@ -353,6 +353,13 @@ void IntrinsicLowering::LowerIntrinsicCall(CallInst *CI) {
report_fatal_error("Code generator does not support intrinsic function '"+
Callee->getName()+"'!");
+ case Intrinsic::expect: {
+ // Just replace __builtin_expect(exp, c) with EXP.
+ Value *V = CI->getArgOperand(0);
+ CI->replaceAllUsesWith(V);
+ break;
+ }
+
// The setjmp/longjmp intrinsics should only exist in the code if it was
// never optimized (ie, right out of the CFE), or if it has been hacked on
// by the lowerinvoke pass. In both cases, the right thing to do is to
@@ -546,14 +553,13 @@ bool IntrinsicLowering::LowerToByteSwap(CallInst *CI) {
!CI->getType()->isIntegerTy())
return false;
- const IntegerType *Ty = dyn_cast<IntegerType>(CI->getType());
+ IntegerType *Ty = dyn_cast<IntegerType>(CI->getType());
if (!Ty)
return false;
// Okay, we can do this xform, do so now.
- const Type *Tys[] = { Ty };
Module *M = CI->getParent()->getParent()->getParent();
- Constant *Int = Intrinsic::getDeclaration(M, Intrinsic::bswap, Tys, 1);
+ Constant *Int = Intrinsic::getDeclaration(M, Intrinsic::bswap, Ty);
Value *Op = CI->getArgOperand(0);
Op = CallInst::Create(Int, Op, CI->getName(), CI);
diff --git a/contrib/llvm/lib/CodeGen/LLVMTargetMachine.cpp b/contrib/llvm/lib/CodeGen/LLVMTargetMachine.cpp
index 589d0a9..f985af8 100644
--- a/contrib/llvm/lib/CodeGen/LLVMTargetMachine.cpp
+++ b/contrib/llvm/lib/CodeGen/LLVMTargetMachine.cpp
@@ -24,10 +24,14 @@
#include "llvm/Target/TargetLowering.h"
#include "llvm/Target/TargetOptions.h"
#include "llvm/MC/MCAsmInfo.h"
+#include "llvm/MC/MCInstrInfo.h"
#include "llvm/MC/MCStreamer.h"
+#include "llvm/MC/MCSubtargetInfo.h"
#include "llvm/Target/TargetAsmInfo.h"
#include "llvm/Target/TargetData.h"
+#include "llvm/Target/TargetInstrInfo.h"
#include "llvm/Target/TargetRegistry.h"
+#include "llvm/Target/TargetSubtargetInfo.h"
#include "llvm/Transforms/Scalar.h"
#include "llvm/ADT/OwningPtr.h"
#include "llvm/Support/CommandLine.h"
@@ -98,10 +102,10 @@ static cl::opt<cl::boolOrDefault>
EnableFastISelOption("fast-isel", cl::Hidden,
cl::desc("Enable the \"fast\" instruction selector"));
-LLVMTargetMachine::LLVMTargetMachine(const Target &T,
- const std::string &Triple)
- : TargetMachine(T), TargetTriple(Triple) {
- AsmInfo = T.createAsmInfo(TargetTriple);
+LLVMTargetMachine::LLVMTargetMachine(const Target &T, StringRef Triple,
+ StringRef CPU, StringRef FS)
+ : TargetMachine(T, Triple, CPU, FS) {
+ AsmInfo = T.createMCAsmInfo(Triple);
}
// Set the default code model for the JIT for a generic target.
@@ -136,14 +140,15 @@ bool LLVMTargetMachine::addPassesToEmitFile(PassManagerBase &PM,
default: return true;
case CGFT_AssemblyFile: {
MCInstPrinter *InstPrinter =
- getTarget().createMCInstPrinter(*this, MAI.getAssemblerDialect(), MAI);
+ getTarget().createMCInstPrinter(MAI.getAssemblerDialect(), MAI);
// Create a code emitter if asked to show the encoding.
MCCodeEmitter *MCE = 0;
TargetAsmBackend *TAB = 0;
if (ShowMCEncoding) {
- MCE = getTarget().createCodeEmitter(*this, *Context);
- TAB = getTarget().createAsmBackend(TargetTriple);
+ const MCSubtargetInfo &STI = getSubtarget<MCSubtargetInfo>();
+ MCE = getTarget().createCodeEmitter(*getInstrInfo(), STI, *Context);
+ TAB = getTarget().createAsmBackend(getTargetTriple());
}
MCStreamer *S = getTarget().createAsmStreamer(*Context, Out,
@@ -159,13 +164,15 @@ bool LLVMTargetMachine::addPassesToEmitFile(PassManagerBase &PM,
case CGFT_ObjectFile: {
// Create the code emitter for the target if it exists. If not, .o file
// emission fails.
- MCCodeEmitter *MCE = getTarget().createCodeEmitter(*this, *Context);
- TargetAsmBackend *TAB = getTarget().createAsmBackend(TargetTriple);
+ const MCSubtargetInfo &STI = getSubtarget<MCSubtargetInfo>();
+ MCCodeEmitter *MCE = getTarget().createCodeEmitter(*getInstrInfo(), STI,
+ *Context);
+ TargetAsmBackend *TAB = getTarget().createAsmBackend(getTargetTriple());
if (MCE == 0 || TAB == 0)
return true;
- AsmStreamer.reset(getTarget().createObjectStreamer(TargetTriple, *Context,
- *TAB, Out, MCE,
+ AsmStreamer.reset(getTarget().createObjectStreamer(getTargetTriple(),
+ *Context, *TAB, Out, MCE,
hasMCRelaxAll(),
hasMCNoExecStack()));
AsmStreamer.get()->InitSections();
@@ -240,13 +247,14 @@ bool LLVMTargetMachine::addPassesToEmitMC(PassManagerBase &PM,
// Create the code emitter for the target if it exists. If not, .o file
// emission fails.
- MCCodeEmitter *MCE = getTarget().createCodeEmitter(*this, *Ctx);
- TargetAsmBackend *TAB = getTarget().createAsmBackend(TargetTriple);
+ const MCSubtargetInfo &STI = getSubtarget<MCSubtargetInfo>();
+ MCCodeEmitter *MCE = getTarget().createCodeEmitter(*getInstrInfo(),STI, *Ctx);
+ TargetAsmBackend *TAB = getTarget().createAsmBackend(getTargetTriple());
if (MCE == 0 || TAB == 0)
return true;
OwningPtr<MCStreamer> AsmStreamer;
- AsmStreamer.reset(getTarget().createObjectStreamer(TargetTriple, *Ctx,
+ AsmStreamer.reset(getTarget().createObjectStreamer(getTargetTriple(), *Ctx,
*TAB, Out, MCE,
hasMCRelaxAll(),
hasMCNoExecStack()));
@@ -384,6 +392,12 @@ bool LLVMTargetMachine::addCommonCodeGenPasses(PassManagerBase &PM,
// Expand pseudo-instructions emitted by ISel.
PM.add(createExpandISelPseudosPass());
+ // Pre-ra tail duplication.
+ if (OptLevel != CodeGenOpt::None && !DisableEarlyTailDup) {
+ PM.add(createTailDuplicatePass(true));
+ printAndVerify(PM, "After Pre-RegAlloc TailDuplicate");
+ }
+
// Optimize PHIs before DCE: removing dead PHI cycles may make more
// instructions dead.
if (OptLevel != CodeGenOpt::None)
@@ -412,12 +426,6 @@ bool LLVMTargetMachine::addCommonCodeGenPasses(PassManagerBase &PM,
printAndVerify(PM, "After codegen peephole optimization pass");
}
- // Pre-ra tail duplication.
- if (OptLevel != CodeGenOpt::None && !DisableEarlyTailDup) {
- PM.add(createTailDuplicatePass(true));
- printAndVerify(PM, "After Pre-RegAlloc TailDuplicate");
- }
-
// Run pre-ra passes.
if (addPreRegAlloc(PM, OptLevel))
printAndVerify(PM, "After PreRegAlloc passes");
diff --git a/contrib/llvm/lib/CodeGen/LiveDebugVariables.cpp b/contrib/llvm/lib/CodeGen/LiveDebugVariables.cpp
index 292928f..5d38c83 100644
--- a/contrib/llvm/lib/CodeGen/LiveDebugVariables.cpp
+++ b/contrib/llvm/lib/CodeGen/LiveDebugVariables.cpp
@@ -123,7 +123,7 @@ public:
/// getNext - Return the next UserValue in the equivalence class.
UserValue *getNext() const { return next; }
- /// match - Does this UserValue match the aprameters?
+ /// match - Does this UserValue match the parameters?
bool match(const MDNode *Var, unsigned Offset) const {
return Var == variable && Offset == offset;
}
diff --git a/contrib/llvm/lib/CodeGen/LiveIntervalUnion.cpp b/contrib/llvm/lib/CodeGen/LiveIntervalUnion.cpp
index b67f966..70003e7 100644
--- a/contrib/llvm/lib/CodeGen/LiveIntervalUnion.cpp
+++ b/contrib/llvm/lib/CodeGen/LiveIntervalUnion.cpp
@@ -244,7 +244,7 @@ bool LiveIntervalUnion::Query::isSeenInterference(LiveInterval *VirtReg) const {
//
// For comments on how to speed it up, see Query::findIntersection().
unsigned LiveIntervalUnion::Query::
-collectInterferingVRegs(unsigned MaxInterferingRegs, float MaxWeight) {
+collectInterferingVRegs(unsigned MaxInterferingRegs) {
InterferenceResult IR = firstInterference();
LiveInterval::iterator VirtRegEnd = VirtReg->end();
LiveInterval *RecentInterferingVReg = NULL;
@@ -287,10 +287,6 @@ collectInterferingVRegs(unsigned MaxInterferingRegs, float MaxWeight) {
RecentInterferingVReg = IR.LiveUnionI.value();
++IR.LiveUnionI;
- // Stop collecting when the max weight is exceeded.
- if (RecentInterferingVReg->weight >= MaxWeight)
- return InterferingVRegs.size();
-
continue;
}
// VirtRegI may have advanced far beyond LiveUnionI,
diff --git a/contrib/llvm/lib/CodeGen/LiveIntervalUnion.h b/contrib/llvm/lib/CodeGen/LiveIntervalUnion.h
index c83578e..5e78d5e 100644
--- a/contrib/llvm/lib/CodeGen/LiveIntervalUnion.h
+++ b/contrib/llvm/lib/CodeGen/LiveIntervalUnion.h
@@ -229,8 +229,7 @@ public:
// Count the virtual registers in this union that interfere with this
// query's live virtual register, up to maxInterferingRegs.
- unsigned collectInterferingVRegs(unsigned MaxInterferingRegs = UINT_MAX,
- float MaxWeight = HUGE_VALF);
+ unsigned collectInterferingVRegs(unsigned MaxInterferingRegs = UINT_MAX);
// Was this virtual register visited during collectInterferingVRegs?
bool isSeenInterference(LiveInterval *VReg) const;
diff --git a/contrib/llvm/lib/CodeGen/LiveRangeEdit.cpp b/contrib/llvm/lib/CodeGen/LiveRangeEdit.cpp
index 052abad..b385fb3 100644
--- a/contrib/llvm/lib/CodeGen/LiveRangeEdit.cpp
+++ b/contrib/llvm/lib/CodeGen/LiveRangeEdit.cpp
@@ -298,10 +298,16 @@ void LiveRangeEdit::eliminateDeadDefs(SmallVectorImpl<MachineInstr*> &Dead,
if (NumComp <= 1)
continue;
++NumFracRanges;
+ bool IsOriginal = VRM.getOriginal(LI->reg) == LI->reg;
DEBUG(dbgs() << NumComp << " components: " << *LI << '\n');
SmallVector<LiveInterval*, 8> Dups(1, LI);
for (unsigned i = 1; i != NumComp; ++i) {
Dups.push_back(&createFrom(LI->reg, LIS, VRM));
+ // If LI is an original interval that hasn't been split yet, make the new
+ // intervals their own originals instead of referring to LI. The original
+ // interval must contain all the split products, and LI doesn't.
+ if (IsOriginal)
+ VRM.setIsSplitFromReg(Dups.back()->reg, 0);
if (delegate_)
delegate_->LRE_DidCloneVirtReg(Dups.back()->reg, LI->reg);
}
diff --git a/contrib/llvm/lib/CodeGen/MachineBasicBlock.cpp b/contrib/llvm/lib/CodeGen/MachineBasicBlock.cpp
index 68946a2..8f0fb46 100644
--- a/contrib/llvm/lib/CodeGen/MachineBasicBlock.cpp
+++ b/contrib/llvm/lib/CodeGen/MachineBasicBlock.cpp
@@ -22,7 +22,6 @@
#include "llvm/MC/MCContext.h"
#include "llvm/Target/TargetRegisterInfo.h"
#include "llvm/Target/TargetData.h"
-#include "llvm/Target/TargetInstrDesc.h"
#include "llvm/Target/TargetInstrInfo.h"
#include "llvm/Target/TargetMachine.h"
#include "llvm/Assembly/Writer.h"
@@ -61,7 +60,7 @@ raw_ostream &llvm::operator<<(raw_ostream &OS, const MachineBasicBlock &MBB) {
return OS;
}
-/// addNodeToList (MBB) - When an MBB is added to an MF, we need to update the
+/// addNodeToList (MBB) - When an MBB is added to an MF, we need to update the
/// parent pointer of the MBB, the MBB numbering, and any instructions in the
/// MBB to be on the right operand list for registers.
///
@@ -93,7 +92,7 @@ void ilist_traits<MachineBasicBlock>::removeNodeFromList(MachineBasicBlock *N) {
void ilist_traits<MachineInstr>::addNodeToList(MachineInstr *N) {
assert(N->getParent() == 0 && "machine instruction already in a basic block");
N->setParent(Parent);
-
+
// Add the instruction's register operands to their corresponding
// use/def lists.
MachineFunction *MF = Parent->getParent();
@@ -110,7 +109,7 @@ void ilist_traits<MachineInstr>::removeNodeFromList(MachineInstr *N) {
// Remove from the use/def lists.
N->RemoveRegOperandsFromUseLists();
-
+
N->setParent(0);
LeakDetector::addGarbageObject(N);
@@ -339,25 +338,64 @@ void MachineBasicBlock::updateTerminator() {
}
}
-void MachineBasicBlock::addSuccessor(MachineBasicBlock *succ) {
- Successors.push_back(succ);
- succ->addPredecessor(this);
-}
+void MachineBasicBlock::addSuccessor(MachineBasicBlock *succ, uint32_t weight) {
+
+ // If we see non-zero value for the first time it means we actually use Weight
+ // list, so we fill all Weights with 0's.
+ if (weight != 0 && Weights.empty())
+ Weights.resize(Successors.size());
+
+ if (weight != 0 || !Weights.empty())
+ Weights.push_back(weight);
+
+ Successors.push_back(succ);
+ succ->addPredecessor(this);
+ }
void MachineBasicBlock::removeSuccessor(MachineBasicBlock *succ) {
succ->removePredecessor(this);
succ_iterator I = std::find(Successors.begin(), Successors.end(), succ);
assert(I != Successors.end() && "Not a current successor!");
+
+ // If Weight list is empty it means we don't use it (disabled optimization).
+ if (!Weights.empty()) {
+ weight_iterator WI = getWeightIterator(I);
+ Weights.erase(WI);
+ }
+
Successors.erase(I);
}
-MachineBasicBlock::succ_iterator
+MachineBasicBlock::succ_iterator
MachineBasicBlock::removeSuccessor(succ_iterator I) {
assert(I != Successors.end() && "Not a current successor!");
+
+ // If Weight list is empty it means we don't use it (disabled optimization).
+ if (!Weights.empty()) {
+ weight_iterator WI = getWeightIterator(I);
+ Weights.erase(WI);
+ }
+
(*I)->removePredecessor(this);
return Successors.erase(I);
}
+void MachineBasicBlock::replaceSuccessor(MachineBasicBlock *Old,
+ MachineBasicBlock *New) {
+ uint32_t weight = 0;
+ succ_iterator SI = std::find(Successors.begin(), Successors.end(), Old);
+
+ // If Weight list is empty it means we don't use it (disabled optimization).
+ if (!Weights.empty()) {
+ weight_iterator WI = getWeightIterator(SI);
+ weight = *WI;
+ }
+
+ // Update the successor information.
+ removeSuccessor(SI);
+ addSuccessor(New, weight);
+}
+
void MachineBasicBlock::addPredecessor(MachineBasicBlock *pred) {
Predecessors.push_back(pred);
}
@@ -371,10 +409,17 @@ void MachineBasicBlock::removePredecessor(MachineBasicBlock *pred) {
void MachineBasicBlock::transferSuccessors(MachineBasicBlock *fromMBB) {
if (this == fromMBB)
return;
-
+
while (!fromMBB->succ_empty()) {
MachineBasicBlock *Succ = *fromMBB->succ_begin();
- addSuccessor(Succ);
+ uint32_t weight = 0;
+
+
+ // If Weight list is empty it means we don't use it (disabled optimization).
+ if (!fromMBB->Weights.empty())
+ weight = *fromMBB->Weights.begin();
+
+ addSuccessor(Succ, weight);
fromMBB->removeSuccessor(Succ);
}
}
@@ -383,7 +428,7 @@ void
MachineBasicBlock::transferSuccessorsAndUpdatePHIs(MachineBasicBlock *fromMBB) {
if (this == fromMBB)
return;
-
+
while (!fromMBB->succ_empty()) {
MachineBasicBlock *Succ = *fromMBB->succ_begin();
addSuccessor(Succ);
@@ -637,15 +682,14 @@ void MachineBasicBlock::ReplaceUsesOfBlockWith(MachineBasicBlock *Old,
}
// Update the successor information.
- removeSuccessor(Old);
- addSuccessor(New);
+ replaceSuccessor(Old, New);
}
/// CorrectExtraCFGEdges - Various pieces of code can cause excess edges in the
/// CFG to be inserted. If we have proven that MBB can only branch to DestA and
/// DestB, remove any other MBB successors from the CFG. DestA and DestB can be
/// null.
-///
+///
/// Besides DestA and DestB, retain other edges leading to LandingPads
/// (currently there can be only one; we don't check or require that here).
/// Note it is possible that DestA and/or DestB are LandingPads.
@@ -720,6 +764,26 @@ MachineBasicBlock::findDebugLoc(MachineBasicBlock::iterator &MBBI) {
return DL;
}
+/// getSuccWeight - Return weight of the edge from this block to MBB.
+///
+uint32_t MachineBasicBlock::getSuccWeight(MachineBasicBlock *succ) {
+ if (Weights.empty())
+ return 0;
+
+ succ_iterator I = std::find(Successors.begin(), Successors.end(), succ);
+ return *getWeightIterator(I);
+}
+
+/// getWeightIterator - Return wight iterator corresonding to the I successor
+/// iterator
+MachineBasicBlock::weight_iterator MachineBasicBlock::
+getWeightIterator(MachineBasicBlock::succ_iterator I) {
+ assert(Weights.size() == Successors.size() && "Async weight list!");
+ size_t index = std::distance(Successors.begin(), I);
+ assert(index < Weights.size() && "Not a current successor!");
+ return Weights.begin() + index;
+}
+
void llvm::WriteAsOperand(raw_ostream &OS, const MachineBasicBlock *MBB,
bool t) {
OS << "BB#" << MBB->getNumber();
diff --git a/contrib/llvm/lib/CodeGen/MachineBlockFrequency.cpp b/contrib/llvm/lib/CodeGen/MachineBlockFrequency.cpp
new file mode 100644
index 0000000..893a320
--- /dev/null
+++ b/contrib/llvm/lib/CodeGen/MachineBlockFrequency.cpp
@@ -0,0 +1,59 @@
+//====----- MachineBlockFrequency.cpp - Machine Block Frequency Analysis ----====//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+//
+// Loops should be simplified before this analysis.
+//
+//===----------------------------------------------------------------------===//
+
+#include "llvm/InitializePasses.h"
+#include "llvm/Analysis/BlockFrequencyImpl.h"
+#include "llvm/CodeGen/MachineBlockFrequency.h"
+#include "llvm/CodeGen/Passes.h"
+#include "llvm/CodeGen/MachineBranchProbabilityInfo.h"
+
+using namespace llvm;
+
+INITIALIZE_PASS_BEGIN(MachineBlockFrequency, "machine-block-freq",
+ "Machine Block Frequency Analysis", true, true)
+INITIALIZE_PASS_DEPENDENCY(MachineBranchProbabilityInfo)
+INITIALIZE_PASS_END(MachineBlockFrequency, "machine-block-freq",
+ "Machine Block Frequency Analysis", true, true)
+
+char MachineBlockFrequency::ID = 0;
+
+
+MachineBlockFrequency::MachineBlockFrequency() : MachineFunctionPass(ID) {
+ initializeMachineBlockFrequencyPass(*PassRegistry::getPassRegistry());
+ MBFI = new BlockFrequencyImpl<MachineBasicBlock, MachineFunction,
+ MachineBranchProbabilityInfo>();
+}
+
+MachineBlockFrequency::~MachineBlockFrequency() {
+ delete MBFI;
+}
+
+void MachineBlockFrequency::getAnalysisUsage(AnalysisUsage &AU) const {
+ AU.addRequired<MachineBranchProbabilityInfo>();
+ AU.setPreservesAll();
+}
+
+bool MachineBlockFrequency::runOnMachineFunction(MachineFunction &F) {
+ MachineBranchProbabilityInfo &MBPI = getAnalysis<MachineBranchProbabilityInfo>();
+ MBFI->doFunction(&F, &MBPI);
+ return false;
+}
+
+/// getblockFreq - Return block frequency. Never return 0, value must be
+/// positive. Please note that initial frequency is equal to 1024. It means that
+/// we should not rely on the value itself, but only on the comparison to the
+/// other block frequencies. We do this to avoid using of floating points.
+///
+uint32_t MachineBlockFrequency::getBlockFreq(MachineBasicBlock *MBB) {
+ return MBFI->getBlockFreq(MBB);
+}
diff --git a/contrib/llvm/lib/CodeGen/MachineBranchProbabilityInfo.cpp b/contrib/llvm/lib/CodeGen/MachineBranchProbabilityInfo.cpp
new file mode 100644
index 0000000..c13fa6b
--- /dev/null
+++ b/contrib/llvm/lib/CodeGen/MachineBranchProbabilityInfo.cpp
@@ -0,0 +1,113 @@
+//===- MachineBranchProbabilityInfo.cpp - Machine Branch Probability Info -===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+//
+// This analysis uses probability info stored in Machine Basic Blocks.
+//
+//===----------------------------------------------------------------------===//
+
+#include "llvm/Instructions.h"
+#include "llvm/CodeGen/MachineBranchProbabilityInfo.h"
+#include "llvm/CodeGen/MachineBasicBlock.h"
+#include "llvm/Support/Debug.h"
+#include "llvm/Support/raw_ostream.h"
+
+using namespace llvm;
+
+INITIALIZE_PASS_BEGIN(MachineBranchProbabilityInfo, "machine-branch-prob",
+ "Machine Branch Probability Analysis", false, true)
+INITIALIZE_PASS_END(MachineBranchProbabilityInfo, "machine-branch-prob",
+ "Machine Branch Probability Analysis", false, true)
+
+char MachineBranchProbabilityInfo::ID = 0;
+
+uint32_t MachineBranchProbabilityInfo::
+getSumForBlock(MachineBasicBlock *MBB) const {
+ uint32_t Sum = 0;
+
+ for (MachineBasicBlock::const_succ_iterator I = MBB->succ_begin(),
+ E = MBB->succ_end(); I != E; ++I) {
+ MachineBasicBlock *Succ = *I;
+ uint32_t Weight = getEdgeWeight(MBB, Succ);
+ uint32_t PrevSum = Sum;
+
+ Sum += Weight;
+ assert(Sum > PrevSum); (void) PrevSum;
+ }
+
+ return Sum;
+}
+
+uint32_t
+MachineBranchProbabilityInfo::getEdgeWeight(MachineBasicBlock *Src,
+ MachineBasicBlock *Dst) const {
+ uint32_t Weight = Src->getSuccWeight(Dst);
+ if (!Weight)
+ return DEFAULT_WEIGHT;
+ return Weight;
+}
+
+bool MachineBranchProbabilityInfo::isEdgeHot(MachineBasicBlock *Src,
+ MachineBasicBlock *Dst) const {
+ // Hot probability is at least 4/5 = 80%
+ uint32_t Weight = getEdgeWeight(Src, Dst);
+ uint32_t Sum = getSumForBlock(Src);
+
+ // FIXME: Implement BranchProbability::compare then change this code to
+ // compare this BranchProbability against a static "hot" BranchProbability.
+ return (uint64_t)Weight * 5 > (uint64_t)Sum * 4;
+}
+
+MachineBasicBlock *
+MachineBranchProbabilityInfo::getHotSucc(MachineBasicBlock *MBB) const {
+ uint32_t Sum = 0;
+ uint32_t MaxWeight = 0;
+ MachineBasicBlock *MaxSucc = 0;
+
+ for (MachineBasicBlock::const_succ_iterator I = MBB->succ_begin(),
+ E = MBB->succ_end(); I != E; ++I) {
+ MachineBasicBlock *Succ = *I;
+ uint32_t Weight = getEdgeWeight(MBB, Succ);
+ uint32_t PrevSum = Sum;
+
+ Sum += Weight;
+ assert(Sum > PrevSum); (void) PrevSum;
+
+ if (Weight > MaxWeight) {
+ MaxWeight = Weight;
+ MaxSucc = Succ;
+ }
+ }
+
+ // FIXME: Use BranchProbability::compare.
+ if ((uint64_t)MaxWeight * 5 >= (uint64_t)Sum * 4)
+ return MaxSucc;
+
+ return 0;
+}
+
+BranchProbability
+MachineBranchProbabilityInfo::getEdgeProbability(MachineBasicBlock *Src,
+ MachineBasicBlock *Dst) const {
+ uint32_t N = getEdgeWeight(Src, Dst);
+ uint32_t D = getSumForBlock(Src);
+
+ return BranchProbability(N, D);
+}
+
+raw_ostream &MachineBranchProbabilityInfo::
+printEdgeProbability(raw_ostream &OS, MachineBasicBlock *Src,
+ MachineBasicBlock *Dst) const {
+
+ const BranchProbability Prob = getEdgeProbability(Src, Dst);
+ OS << "edge MBB#" << Src->getNumber() << " -> MBB#" << Dst->getNumber()
+ << " probability is " << Prob
+ << (isEdgeHot(Src, Dst) ? " [HOT edge]\n" : "\n");
+
+ return OS;
+}
diff --git a/contrib/llvm/lib/CodeGen/MachineCSE.cpp b/contrib/llvm/lib/CodeGen/MachineCSE.cpp
index f97ccf6..3a60a37 100644
--- a/contrib/llvm/lib/CodeGen/MachineCSE.cpp
+++ b/contrib/llvm/lib/CodeGen/MachineCSE.cpp
@@ -260,12 +260,12 @@ bool MachineCSE::isCSECandidate(MachineInstr *MI) {
return false;
// Ignore stuff that we obviously can't move.
- const TargetInstrDesc &TID = MI->getDesc();
- if (TID.mayStore() || TID.isCall() || TID.isTerminator() ||
+ const MCInstrDesc &MCID = MI->getDesc();
+ if (MCID.mayStore() || MCID.isCall() || MCID.isTerminator() ||
MI->hasUnmodeledSideEffects())
return false;
- if (TID.mayLoad()) {
+ if (MCID.mayLoad()) {
// Okay, this instruction does a load. As a refinement, we allow the target
// to decide whether the loaded value is actually a constant. If so, we can
// actually use it as a load.
diff --git a/contrib/llvm/lib/CodeGen/MachineFunction.cpp b/contrib/llvm/lib/CodeGen/MachineFunction.cpp
index 50750a5..cd25156 100644
--- a/contrib/llvm/lib/CodeGen/MachineFunction.cpp
+++ b/contrib/llvm/lib/CodeGen/MachineFunction.cpp
@@ -152,10 +152,10 @@ void MachineFunction::RenumberBlocks(MachineBasicBlock *MBB) {
/// of `new MachineInstr'.
///
MachineInstr *
-MachineFunction::CreateMachineInstr(const TargetInstrDesc &TID,
+MachineFunction::CreateMachineInstr(const MCInstrDesc &MCID,
DebugLoc DL, bool NoImp) {
return new (InstructionRecycler.Allocate<MachineInstr>(Allocator))
- MachineInstr(TID, DL, NoImp);
+ MachineInstr(MCID, DL, NoImp);
}
/// CloneMachineInstr - Create a new MachineInstr which is a copy of the
diff --git a/contrib/llvm/lib/CodeGen/MachineInstr.cpp b/contrib/llvm/lib/CodeGen/MachineInstr.cpp
index 36b0b83..143a29b 100644
--- a/contrib/llvm/lib/CodeGen/MachineInstr.cpp
+++ b/contrib/llvm/lib/CodeGen/MachineInstr.cpp
@@ -15,19 +15,22 @@
#include "llvm/Constants.h"
#include "llvm/Function.h"
#include "llvm/InlineAsm.h"
+#include "llvm/LLVMContext.h"
#include "llvm/Metadata.h"
+#include "llvm/Module.h"
#include "llvm/Type.h"
#include "llvm/Value.h"
#include "llvm/Assembly/Writer.h"
#include "llvm/CodeGen/MachineConstantPool.h"
#include "llvm/CodeGen/MachineFunction.h"
#include "llvm/CodeGen/MachineMemOperand.h"
+#include "llvm/CodeGen/MachineModuleInfo.h"
#include "llvm/CodeGen/MachineRegisterInfo.h"
#include "llvm/CodeGen/PseudoSourceValue.h"
+#include "llvm/MC/MCInstrDesc.h"
#include "llvm/MC/MCSymbol.h"
#include "llvm/Target/TargetMachine.h"
#include "llvm/Target/TargetInstrInfo.h"
-#include "llvm/Target/TargetInstrDesc.h"
#include "llvm/Target/TargetRegisterInfo.h"
#include "llvm/Analysis/AliasAnalysis.h"
#include "llvm/Analysis/DebugInfo.h"
@@ -194,6 +197,8 @@ bool MachineOperand::isIdenticalTo(const MachineOperand &Other) const {
getSubReg() == Other.getSubReg();
case MachineOperand::MO_Immediate:
return getImm() == Other.getImm();
+ case MachineOperand::MO_CImmediate:
+ return getCImm() == Other.getCImm();
case MachineOperand::MO_FPImmediate:
return getFPImm() == Other.getFPImm();
case MachineOperand::MO_MachineBasicBlock:
@@ -267,6 +272,9 @@ void MachineOperand::print(raw_ostream &OS, const TargetMachine *TM) const {
case MachineOperand::MO_Immediate:
OS << getImm();
break;
+ case MachineOperand::MO_CImmediate:
+ getCImm()->getValue().print(OS, false);
+ break;
case MachineOperand::MO_FPImmediate:
if (getFPImm()->getType()->isFloatTy())
OS << getFPImm()->getValueAPF().convertToFloat();
@@ -454,9 +462,9 @@ raw_ostream &llvm::operator<<(raw_ostream &OS, const MachineMemOperand &MMO) {
//===----------------------------------------------------------------------===//
/// MachineInstr ctor - This constructor creates a dummy MachineInstr with
-/// TID NULL and no operands.
+/// MCID NULL and no operands.
MachineInstr::MachineInstr()
- : TID(0), NumImplicitOps(0), Flags(0), AsmPrinterFlags(0),
+ : MCID(0), NumImplicitOps(0), Flags(0), AsmPrinterFlags(0),
MemRefs(0), MemRefsEnd(0),
Parent(0) {
// Make sure that we get added to a machine basicblock
@@ -464,23 +472,23 @@ MachineInstr::MachineInstr()
}
void MachineInstr::addImplicitDefUseOperands() {
- if (TID->ImplicitDefs)
- for (const unsigned *ImpDefs = TID->ImplicitDefs; *ImpDefs; ++ImpDefs)
+ if (MCID->ImplicitDefs)
+ for (const unsigned *ImpDefs = MCID->ImplicitDefs; *ImpDefs; ++ImpDefs)
addOperand(MachineOperand::CreateReg(*ImpDefs, true, true));
- if (TID->ImplicitUses)
- for (const unsigned *ImpUses = TID->ImplicitUses; *ImpUses; ++ImpUses)
+ if (MCID->ImplicitUses)
+ for (const unsigned *ImpUses = MCID->ImplicitUses; *ImpUses; ++ImpUses)
addOperand(MachineOperand::CreateReg(*ImpUses, false, true));
}
/// MachineInstr ctor - This constructor creates a MachineInstr and adds the
/// implicit operands. It reserves space for the number of operands specified by
-/// the TargetInstrDesc.
-MachineInstr::MachineInstr(const TargetInstrDesc &tid, bool NoImp)
- : TID(&tid), NumImplicitOps(0), Flags(0), AsmPrinterFlags(0),
+/// the MCInstrDesc.
+MachineInstr::MachineInstr(const MCInstrDesc &tid, bool NoImp)
+ : MCID(&tid), NumImplicitOps(0), Flags(0), AsmPrinterFlags(0),
MemRefs(0), MemRefsEnd(0), Parent(0) {
if (!NoImp)
- NumImplicitOps = TID->getNumImplicitDefs() + TID->getNumImplicitUses();
- Operands.reserve(NumImplicitOps + TID->getNumOperands());
+ NumImplicitOps = MCID->getNumImplicitDefs() + MCID->getNumImplicitUses();
+ Operands.reserve(NumImplicitOps + MCID->getNumOperands());
if (!NoImp)
addImplicitDefUseOperands();
// Make sure that we get added to a machine basicblock
@@ -488,13 +496,13 @@ MachineInstr::MachineInstr(const TargetInstrDesc &tid, bool NoImp)
}
/// MachineInstr ctor - As above, but with a DebugLoc.
-MachineInstr::MachineInstr(const TargetInstrDesc &tid, const DebugLoc dl,
+MachineInstr::MachineInstr(const MCInstrDesc &tid, const DebugLoc dl,
bool NoImp)
- : TID(&tid), NumImplicitOps(0), Flags(0), AsmPrinterFlags(0),
+ : MCID(&tid), NumImplicitOps(0), Flags(0), AsmPrinterFlags(0),
MemRefs(0), MemRefsEnd(0), Parent(0), debugLoc(dl) {
if (!NoImp)
- NumImplicitOps = TID->getNumImplicitDefs() + TID->getNumImplicitUses();
- Operands.reserve(NumImplicitOps + TID->getNumOperands());
+ NumImplicitOps = MCID->getNumImplicitDefs() + MCID->getNumImplicitUses();
+ Operands.reserve(NumImplicitOps + MCID->getNumOperands());
if (!NoImp)
addImplicitDefUseOperands();
// Make sure that we get added to a machine basicblock
@@ -504,12 +512,12 @@ MachineInstr::MachineInstr(const TargetInstrDesc &tid, const DebugLoc dl,
/// MachineInstr ctor - Work exactly the same as the ctor two above, except
/// that the MachineInstr is created and added to the end of the specified
/// basic block.
-MachineInstr::MachineInstr(MachineBasicBlock *MBB, const TargetInstrDesc &tid)
- : TID(&tid), NumImplicitOps(0), Flags(0), AsmPrinterFlags(0),
+MachineInstr::MachineInstr(MachineBasicBlock *MBB, const MCInstrDesc &tid)
+ : MCID(&tid), NumImplicitOps(0), Flags(0), AsmPrinterFlags(0),
MemRefs(0), MemRefsEnd(0), Parent(0) {
assert(MBB && "Cannot use inserting ctor with null basic block!");
- NumImplicitOps = TID->getNumImplicitDefs() + TID->getNumImplicitUses();
- Operands.reserve(NumImplicitOps + TID->getNumOperands());
+ NumImplicitOps = MCID->getNumImplicitDefs() + MCID->getNumImplicitUses();
+ Operands.reserve(NumImplicitOps + MCID->getNumOperands());
addImplicitDefUseOperands();
// Make sure that we get added to a machine basicblock
LeakDetector::addGarbageObject(this);
@@ -519,12 +527,12 @@ MachineInstr::MachineInstr(MachineBasicBlock *MBB, const TargetInstrDesc &tid)
/// MachineInstr ctor - As above, but with a DebugLoc.
///
MachineInstr::MachineInstr(MachineBasicBlock *MBB, const DebugLoc dl,
- const TargetInstrDesc &tid)
- : TID(&tid), NumImplicitOps(0), Flags(0), AsmPrinterFlags(0),
+ const MCInstrDesc &tid)
+ : MCID(&tid), NumImplicitOps(0), Flags(0), AsmPrinterFlags(0),
MemRefs(0), MemRefsEnd(0), Parent(0), debugLoc(dl) {
assert(MBB && "Cannot use inserting ctor with null basic block!");
- NumImplicitOps = TID->getNumImplicitDefs() + TID->getNumImplicitUses();
- Operands.reserve(NumImplicitOps + TID->getNumOperands());
+ NumImplicitOps = MCID->getNumImplicitDefs() + MCID->getNumImplicitUses();
+ Operands.reserve(NumImplicitOps + MCID->getNumOperands());
addImplicitDefUseOperands();
// Make sure that we get added to a machine basicblock
LeakDetector::addGarbageObject(this);
@@ -534,7 +542,7 @@ MachineInstr::MachineInstr(MachineBasicBlock *MBB, const DebugLoc dl,
/// MachineInstr ctor - Copies MachineInstr arg exactly
///
MachineInstr::MachineInstr(MachineFunction &MF, const MachineInstr &MI)
- : TID(&MI.getDesc()), NumImplicitOps(0), Flags(0), AsmPrinterFlags(0),
+ : MCID(&MI.getDesc()), NumImplicitOps(0), Flags(0), AsmPrinterFlags(0),
MemRefs(MI.MemRefs), MemRefsEnd(MI.MemRefsEnd),
Parent(0), debugLoc(MI.getDebugLoc()) {
Operands.reserve(MI.getNumOperands());
@@ -621,7 +629,7 @@ void MachineInstr::addOperand(const MachineOperand &Op) {
Operands.back().AddRegOperandToRegInfo(RegInfo);
// If the register operand is flagged as early, mark the operand as such
unsigned OpNo = Operands.size() - 1;
- if (TID->getOperandConstraint(OpNo, TOI::EARLY_CLOBBER) != -1)
+ if (MCID->getOperandConstraint(OpNo, MCOI::EARLY_CLOBBER) != -1)
Operands[OpNo].setIsEarlyClobber(true);
}
return;
@@ -643,7 +651,7 @@ void MachineInstr::addOperand(const MachineOperand &Op) {
if (Operands[OpNo].isReg()) {
Operands[OpNo].AddRegOperandToRegInfo(0);
// If the register operand is flagged as early, mark the operand as such
- if (TID->getOperandConstraint(OpNo, TOI::EARLY_CLOBBER) != -1)
+ if (MCID->getOperandConstraint(OpNo, MCOI::EARLY_CLOBBER) != -1)
Operands[OpNo].setIsEarlyClobber(true);
}
@@ -668,7 +676,7 @@ void MachineInstr::addOperand(const MachineOperand &Op) {
if (Operands[OpNo].isReg()) {
Operands[OpNo].AddRegOperandToRegInfo(RegInfo);
// If the register operand is flagged as early, mark the operand as such
- if (TID->getOperandConstraint(OpNo, TOI::EARLY_CLOBBER) != -1)
+ if (MCID->getOperandConstraint(OpNo, MCOI::EARLY_CLOBBER) != -1)
Operands[OpNo].setIsEarlyClobber(true);
}
@@ -691,7 +699,7 @@ void MachineInstr::addOperand(const MachineOperand &Op) {
// If the register operand is flagged as early, mark the operand as such
if (Operands[OpNo].isReg()
- && TID->getOperandConstraint(OpNo, TOI::EARLY_CLOBBER) != -1)
+ && MCID->getOperandConstraint(OpNo, MCOI::EARLY_CLOBBER) != -1)
Operands[OpNo].setIsEarlyClobber(true);
}
}
@@ -794,6 +802,11 @@ bool MachineInstr::isIdenticalTo(const MachineInstr *Other,
return false;
}
}
+ // If DebugLoc does not match then two dbg.values are not identical.
+ if (isDebugValue())
+ if (!getDebugLoc().isUnknown() && !Other->getDebugLoc().isUnknown()
+ && getDebugLoc() != Other->getDebugLoc())
+ return false;
return true;
}
@@ -817,8 +830,8 @@ void MachineInstr::eraseFromParent() {
/// OperandComplete - Return true if it's illegal to add a new operand
///
bool MachineInstr::OperandsComplete() const {
- unsigned short NumOperands = TID->getNumOperands();
- if (!TID->isVariadic() && getNumOperands()-NumImplicitOps >= NumOperands)
+ unsigned short NumOperands = MCID->getNumOperands();
+ if (!MCID->isVariadic() && getNumOperands()-NumImplicitOps >= NumOperands)
return true; // Broken: we have all the operands of this instruction!
return false;
}
@@ -826,8 +839,8 @@ bool MachineInstr::OperandsComplete() const {
/// getNumExplicitOperands - Returns the number of non-implicit operands.
///
unsigned MachineInstr::getNumExplicitOperands() const {
- unsigned NumOperands = TID->getNumOperands();
- if (!TID->isVariadic())
+ unsigned NumOperands = MCID->getNumOperands();
+ if (!MCID->isVariadic())
return NumOperands;
for (unsigned i = NumOperands, e = getNumOperands(); i != e; ++i) {
@@ -928,10 +941,10 @@ MachineInstr::findRegisterDefOperandIdx(unsigned Reg, bool isDead, bool Overlap,
/// operand list that is used to represent the predicate. It returns -1 if
/// none is found.
int MachineInstr::findFirstPredOperandIdx() const {
- const TargetInstrDesc &TID = getDesc();
- if (TID.isPredicable()) {
+ const MCInstrDesc &MCID = getDesc();
+ if (MCID.isPredicable()) {
for (unsigned i = 0, e = getNumOperands(); i != e; ++i)
- if (TID.OpInfo[i].isPredicate())
+ if (MCID.OpInfo[i].isPredicate())
return i;
}
@@ -987,11 +1000,11 @@ isRegTiedToUseOperand(unsigned DefOpIdx, unsigned *UseOpIdx) const {
}
assert(getOperand(DefOpIdx).isDef() && "DefOpIdx is not a def!");
- const TargetInstrDesc &TID = getDesc();
- for (unsigned i = 0, e = TID.getNumOperands(); i != e; ++i) {
+ const MCInstrDesc &MCID = getDesc();
+ for (unsigned i = 0, e = MCID.getNumOperands(); i != e; ++i) {
const MachineOperand &MO = getOperand(i);
if (MO.isReg() && MO.isUse() &&
- TID.getOperandConstraint(i, TOI::TIED_TO) == (int)DefOpIdx) {
+ MCID.getOperandConstraint(i, MCOI::TIED_TO) == (int)DefOpIdx) {
if (UseOpIdx)
*UseOpIdx = (unsigned)i;
return true;
@@ -1047,13 +1060,13 @@ isRegTiedToDefOperand(unsigned UseOpIdx, unsigned *DefOpIdx) const {
return false;
}
- const TargetInstrDesc &TID = getDesc();
- if (UseOpIdx >= TID.getNumOperands())
+ const MCInstrDesc &MCID = getDesc();
+ if (UseOpIdx >= MCID.getNumOperands())
return false;
const MachineOperand &MO = getOperand(UseOpIdx);
if (!MO.isReg() || !MO.isUse())
return false;
- int DefIdx = TID.getOperandConstraint(UseOpIdx, TOI::TIED_TO);
+ int DefIdx = MCID.getOperandConstraint(UseOpIdx, MCOI::TIED_TO);
if (DefIdx == -1)
return false;
if (DefOpIdx)
@@ -1093,11 +1106,11 @@ void MachineInstr::copyKillDeadInfo(const MachineInstr *MI) {
/// copyPredicates - Copies predicate operand(s) from MI.
void MachineInstr::copyPredicates(const MachineInstr *MI) {
- const TargetInstrDesc &TID = MI->getDesc();
- if (!TID.isPredicable())
+ const MCInstrDesc &MCID = MI->getDesc();
+ if (!MCID.isPredicable())
return;
for (unsigned i = 0, e = MI->getNumOperands(); i != e; ++i) {
- if (TID.OpInfo[i].isPredicate()) {
+ if (MCID.OpInfo[i].isPredicate()) {
// Predicated operands must be last operands.
addOperand(MI->getOperand(i));
}
@@ -1134,13 +1147,13 @@ bool MachineInstr::isSafeToMove(const TargetInstrInfo *TII,
AliasAnalysis *AA,
bool &SawStore) const {
// Ignore stuff that we obviously can't move.
- if (TID->mayStore() || TID->isCall()) {
+ if (MCID->mayStore() || MCID->isCall()) {
SawStore = true;
return false;
}
if (isLabel() || isDebugValue() ||
- TID->isTerminator() || hasUnmodeledSideEffects())
+ MCID->isTerminator() || hasUnmodeledSideEffects())
return false;
// See if this instruction does a load. If so, we have to guarantee that the
@@ -1148,7 +1161,7 @@ bool MachineInstr::isSafeToMove(const TargetInstrInfo *TII,
// destination. The check for isInvariantLoad gives the targe the chance to
// classify the load as always returning a constant, e.g. a constant pool
// load.
- if (TID->mayLoad() && !isInvariantLoad(AA))
+ if (MCID->mayLoad() && !isInvariantLoad(AA))
// Otherwise, this is a real load. If there is a store between the load and
// end of block, or if the load is volatile, we can't move it.
return !SawStore && !hasVolatileMemoryRef();
@@ -1188,9 +1201,9 @@ bool MachineInstr::isSafeToReMat(const TargetInstrInfo *TII,
/// have no volatile memory references.
bool MachineInstr::hasVolatileMemoryRef() const {
// An instruction known never to access memory won't have a volatile access.
- if (!TID->mayStore() &&
- !TID->mayLoad() &&
- !TID->isCall() &&
+ if (!MCID->mayStore() &&
+ !MCID->mayLoad() &&
+ !MCID->isCall() &&
!hasUnmodeledSideEffects())
return false;
@@ -1214,7 +1227,7 @@ bool MachineInstr::hasVolatileMemoryRef() const {
/// *all* loads the instruction does are invariant (if it does multiple loads).
bool MachineInstr::isInvariantLoad(AliasAnalysis *AA) const {
// If the instruction doesn't load at all, it isn't an invariant load.
- if (!TID->mayLoad())
+ if (!MCID->mayLoad())
return false;
// If the instruction has lost its memoperands, conservatively assume that
@@ -1364,6 +1377,8 @@ void MachineInstr::print(raw_ostream &OS, const TargetMachine *TM) const {
// Print the rest of the operands.
bool OmittedAnyCallClobbers = false;
bool FirstOp = true;
+ unsigned AsmDescOp = ~0u;
+ unsigned AsmOpCount = 0;
if (isInlineAsm()) {
// Print asm string.
@@ -1377,7 +1392,7 @@ void MachineInstr::print(raw_ostream &OS, const TargetMachine *TM) const {
if (ExtraInfo & InlineAsm::Extra_IsAlignStack)
OS << " [alignstack]";
- StartOp = InlineAsm::MIOp_FirstOperand;
+ StartOp = AsmDescOp = InlineAsm::MIOp_FirstOperand;
FirstOp = false;
}
@@ -1416,10 +1431,10 @@ void MachineInstr::print(raw_ostream &OS, const TargetMachine *TM) const {
if (FirstOp) FirstOp = false; else OS << ",";
OS << " ";
if (i < getDesc().NumOperands) {
- const TargetOperandInfo &TOI = getDesc().OpInfo[i];
- if (TOI.isPredicate())
+ const MCOperandInfo &MCOI = getDesc().OpInfo[i];
+ if (MCOI.isPredicate())
OS << "pred:";
- if (TOI.isOptionalDef())
+ if (MCOI.isOptionalDef())
OS << "opt:";
}
if (isDebugValue() && MO.isMetadata()) {
@@ -1431,6 +1446,26 @@ void MachineInstr::print(raw_ostream &OS, const TargetMachine *TM) const {
MO.print(OS, TM);
} else if (TM && (isInsertSubreg() || isRegSequence()) && MO.isImm()) {
OS << TM->getRegisterInfo()->getSubRegIndexName(MO.getImm());
+ } else if (i == AsmDescOp && MO.isImm()) {
+ // Pretty print the inline asm operand descriptor.
+ OS << '$' << AsmOpCount++;
+ unsigned Flag = MO.getImm();
+ switch (InlineAsm::getKind(Flag)) {
+ case InlineAsm::Kind_RegUse: OS << ":[reguse]"; break;
+ case InlineAsm::Kind_RegDef: OS << ":[regdef]"; break;
+ case InlineAsm::Kind_RegDefEarlyClobber: OS << ":[regdef-ec]"; break;
+ case InlineAsm::Kind_Clobber: OS << ":[clobber]"; break;
+ case InlineAsm::Kind_Imm: OS << ":[imm]"; break;
+ case InlineAsm::Kind_Mem: OS << ":[mem]"; break;
+ default: OS << ":[??" << InlineAsm::getKind(Flag) << ']'; break;
+ }
+
+ unsigned TiedTo = 0;
+ if (InlineAsm::isUseOperandTiedToDef(Flag, TiedTo))
+ OS << " [tiedto:$" << TiedTo << ']';
+
+ // Compute the index of the next operand descriptor.
+ AsmDescOp += 1 + InlineAsm::getNumOperandRegisters(Flag);
} else
MO.print(OS, TM);
}
@@ -1685,3 +1720,24 @@ MachineInstrExpressionTrait::getHashValue(const MachineInstr* const &MI) {
}
return Hash;
}
+
+void MachineInstr::emitError(StringRef Msg) const {
+ // Find the source location cookie.
+ unsigned LocCookie = 0;
+ const MDNode *LocMD = 0;
+ for (unsigned i = getNumOperands(); i != 0; --i) {
+ if (getOperand(i-1).isMetadata() &&
+ (LocMD = getOperand(i-1).getMetadata()) &&
+ LocMD->getNumOperands() != 0) {
+ if (const ConstantInt *CI = dyn_cast<ConstantInt>(LocMD->getOperand(0))) {
+ LocCookie = CI->getZExtValue();
+ break;
+ }
+ }
+ }
+
+ if (const MachineBasicBlock *MBB = getParent())
+ if (const MachineFunction *MF = MBB->getParent())
+ return MF->getMMI().getModule()->getContext().emitError(LocCookie, Msg);
+ report_fatal_error(Msg);
+}
diff --git a/contrib/llvm/lib/CodeGen/MachineLICM.cpp b/contrib/llvm/lib/CodeGen/MachineLICM.cpp
index b315702..722ceb2 100644
--- a/contrib/llvm/lib/CodeGen/MachineLICM.cpp
+++ b/contrib/llvm/lib/CodeGen/MachineLICM.cpp
@@ -28,10 +28,10 @@
#include "llvm/CodeGen/MachineMemOperand.h"
#include "llvm/CodeGen/MachineRegisterInfo.h"
#include "llvm/CodeGen/PseudoSourceValue.h"
+#include "llvm/MC/MCInstrItineraries.h"
#include "llvm/Target/TargetLowering.h"
#include "llvm/Target/TargetRegisterInfo.h"
#include "llvm/Target/TargetInstrInfo.h"
-#include "llvm/Target/TargetInstrItineraries.h"
#include "llvm/Target/TargetMachine.h"
#include "llvm/Analysis/AliasAnalysis.h"
#include "llvm/ADT/DenseMap.h"
@@ -1018,9 +1018,9 @@ MachineInstr *MachineLICM::ExtractHoistableLoad(MachineInstr *MI) {
/*UnfoldStore=*/false,
&LoadRegIndex);
if (NewOpc == 0) return 0;
- const TargetInstrDesc &TID = TII->get(NewOpc);
- if (TID.getNumDefs() != 1) return 0;
- const TargetRegisterClass *RC = TID.OpInfo[LoadRegIndex].getRegClass(TRI);
+ const MCInstrDesc &MID = TII->get(NewOpc);
+ if (MID.getNumDefs() != 1) return 0;
+ const TargetRegisterClass *RC = TII->getRegClass(MID, LoadRegIndex, TRI);
// Ok, we're unfolding. Create a temporary register and do the unfold.
unsigned Reg = MRI->createVirtualRegister(RC);
diff --git a/contrib/llvm/lib/CodeGen/MachineRegisterInfo.cpp b/contrib/llvm/lib/CodeGen/MachineRegisterInfo.cpp
index 08ff5bb..4b3e64c 100644
--- a/contrib/llvm/lib/CodeGen/MachineRegisterInfo.cpp
+++ b/contrib/llvm/lib/CodeGen/MachineRegisterInfo.cpp
@@ -20,7 +20,6 @@ using namespace llvm;
MachineRegisterInfo::MachineRegisterInfo(const TargetRegisterInfo &TRI) {
VRegInfo.reserve(256);
RegAllocHints.reserve(256);
- RegClass2VRegMap = new std::vector<unsigned>[TRI.getNumRegClasses()];
UsedPhysRegs.resize(TRI.getNumRegs());
// Create the physreg use/def lists.
@@ -38,25 +37,13 @@ MachineRegisterInfo::~MachineRegisterInfo() {
"PhysRegUseDefLists has entries after all instructions are deleted");
#endif
delete [] PhysRegUseDefLists;
- delete [] RegClass2VRegMap;
}
/// setRegClass - Set the register class of the specified virtual register.
///
void
MachineRegisterInfo::setRegClass(unsigned Reg, const TargetRegisterClass *RC) {
- const TargetRegisterClass *OldRC = VRegInfo[Reg].first;
VRegInfo[Reg].first = RC;
-
- // Remove from old register class's vregs list. This may be slow but
- // fortunately this operation is rarely needed.
- std::vector<unsigned> &VRegs = RegClass2VRegMap[OldRC->getID()];
- std::vector<unsigned>::iterator I =
- std::find(VRegs.begin(), VRegs.end(), Reg);
- VRegs.erase(I);
-
- // Add to new register class's vregs list.
- RegClass2VRegMap[RC->getID()].push_back(Reg);
}
const TargetRegisterClass *
@@ -95,7 +82,6 @@ MachineRegisterInfo::createVirtualRegister(const TargetRegisterClass *RegClass){
if (ArrayBase && &VRegInfo[FirstVirtReg] != ArrayBase)
// The vector reallocated, handle this now.
HandleVRegListReallocation();
- RegClass2VRegMap[RegClass->getID()].push_back(Reg);
return Reg;
}
diff --git a/contrib/llvm/lib/CodeGen/MachineVerifier.cpp b/contrib/llvm/lib/CodeGen/MachineVerifier.cpp
index 471463b..7a55852 100644
--- a/contrib/llvm/lib/CodeGen/MachineVerifier.cpp
+++ b/contrib/llvm/lib/CodeGen/MachineVerifier.cpp
@@ -62,6 +62,7 @@ namespace {
raw_ostream *OS;
const MachineFunction *MF;
const TargetMachine *TM;
+ const TargetInstrInfo *TII;
const TargetRegisterInfo *TRI;
const MachineRegisterInfo *MRI;
@@ -255,6 +256,7 @@ bool MachineVerifier::runOnMachineFunction(MachineFunction &MF) {
this->MF = &MF;
TM = &MF.getTarget();
+ TII = TM->getInstrInfo();
TRI = TM->getRegisterInfo();
MRI = &MF.getRegInfo();
@@ -387,8 +389,6 @@ static bool matchPair(MachineBasicBlock::const_succ_iterator i,
void
MachineVerifier::visitMachineBasicBlockBefore(const MachineBasicBlock *MBB) {
- const TargetInstrInfo *TII = MF->getTarget().getInstrInfo();
-
// Count the number of landing pad successors.
SmallPtrSet<MachineBasicBlock*, 4> LandingPadSuccs;
for (MachineBasicBlock::const_succ_iterator I = MBB->succ_begin(),
@@ -541,19 +541,19 @@ MachineVerifier::visitMachineBasicBlockBefore(const MachineBasicBlock *MBB) {
}
void MachineVerifier::visitMachineInstrBefore(const MachineInstr *MI) {
- const TargetInstrDesc &TI = MI->getDesc();
- if (MI->getNumOperands() < TI.getNumOperands()) {
+ const MCInstrDesc &MCID = MI->getDesc();
+ if (MI->getNumOperands() < MCID.getNumOperands()) {
report("Too few operands", MI);
- *OS << TI.getNumOperands() << " operands expected, but "
+ *OS << MCID.getNumOperands() << " operands expected, but "
<< MI->getNumExplicitOperands() << " given.\n";
}
// Check the MachineMemOperands for basic consistency.
for (MachineInstr::mmo_iterator I = MI->memoperands_begin(),
E = MI->memoperands_end(); I != E; ++I) {
- if ((*I)->isLoad() && !TI.mayLoad())
+ if ((*I)->isLoad() && !MCID.mayLoad())
report("Missing mayLoad flag", MI);
- if ((*I)->isStore() && !TI.mayStore())
+ if ((*I)->isStore() && !MCID.mayStore())
report("Missing mayStore flag", MI);
}
@@ -575,29 +575,30 @@ void MachineVerifier::visitMachineInstrBefore(const MachineInstr *MI) {
void
MachineVerifier::visitMachineOperand(const MachineOperand *MO, unsigned MONum) {
const MachineInstr *MI = MO->getParent();
- const TargetInstrDesc &TI = MI->getDesc();
- const TargetOperandInfo &TOI = TI.OpInfo[MONum];
+ const MCInstrDesc &MCID = MI->getDesc();
+ const MCOperandInfo &MCOI = MCID.OpInfo[MONum];
- // The first TI.NumDefs operands must be explicit register defines
- if (MONum < TI.getNumDefs()) {
+ // The first MCID.NumDefs operands must be explicit register defines
+ if (MONum < MCID.getNumDefs()) {
if (!MO->isReg())
report("Explicit definition must be a register", MO, MONum);
else if (!MO->isDef())
report("Explicit definition marked as use", MO, MONum);
else if (MO->isImplicit())
report("Explicit definition marked as implicit", MO, MONum);
- } else if (MONum < TI.getNumOperands()) {
+ } else if (MONum < MCID.getNumOperands()) {
// Don't check if it's the last operand in a variadic instruction. See,
// e.g., LDM_RET in the arm back end.
- if (MO->isReg() && !(TI.isVariadic() && MONum == TI.getNumOperands()-1)) {
- if (MO->isDef() && !TOI.isOptionalDef())
+ if (MO->isReg() &&
+ !(MCID.isVariadic() && MONum == MCID.getNumOperands()-1)) {
+ if (MO->isDef() && !MCOI.isOptionalDef())
report("Explicit operand marked as def", MO, MONum);
if (MO->isImplicit())
report("Explicit operand marked as implicit", MO, MONum);
}
} else {
// ARM adds %reg0 operands to indicate predicates. We'll allow that.
- if (MO->isReg() && !MO->isImplicit() && !TI.isVariadic() && MO->getReg())
+ if (MO->isReg() && !MO->isImplicit() && !MCID.isVariadic() && MO->getReg())
report("Extra explicit operand on non-variadic instruction", MO, MONum);
}
@@ -709,7 +710,7 @@ MachineVerifier::visitMachineOperand(const MachineOperand *MO, unsigned MONum) {
}
// Check register classes.
- if (MONum < TI.getNumOperands() && !MO->isImplicit()) {
+ if (MONum < MCID.getNumOperands() && !MO->isImplicit()) {
unsigned SubIdx = MO->getSubReg();
if (TargetRegisterInfo::isPhysicalRegister(Reg)) {
@@ -723,7 +724,7 @@ MachineVerifier::visitMachineOperand(const MachineOperand *MO, unsigned MONum) {
}
sr = s;
}
- if (const TargetRegisterClass *DRC = TOI.getRegClass(TRI)) {
+ if (const TargetRegisterClass *DRC = TII->getRegClass(MCID,MONum,TRI)) {
if (!DRC->contains(sr)) {
report("Illegal physical register for instruction", MO, MONum);
*OS << TRI->getName(sr) << " is not a "
@@ -743,7 +744,7 @@ MachineVerifier::visitMachineOperand(const MachineOperand *MO, unsigned MONum) {
}
RC = SRC;
}
- if (const TargetRegisterClass *DRC = TOI.getRegClass(TRI)) {
+ if (const TargetRegisterClass *DRC = TII->getRegClass(MCID,MONum,TRI)) {
if (!RC->hasSuperClassEq(DRC)) {
report("Illegal virtual register for instruction", MO, MONum);
*OS << "Expected a " << DRC->getName() << " register, but got a "
@@ -765,11 +766,11 @@ MachineVerifier::visitMachineOperand(const MachineOperand *MO, unsigned MONum) {
LiveInts && !LiveInts->isNotInMIMap(MI)) {
LiveInterval &LI = LiveStks->getInterval(MO->getIndex());
SlotIndex Idx = LiveInts->getInstructionIndex(MI);
- if (TI.mayLoad() && !LI.liveAt(Idx.getUseIndex())) {
+ if (MCID.mayLoad() && !LI.liveAt(Idx.getUseIndex())) {
report("Instruction loads from dead spill slot", MO, MONum);
*OS << "Live stack: " << LI << '\n';
}
- if (TI.mayStore() && !LI.liveAt(Idx.getDefIndex())) {
+ if (MCID.mayStore() && !LI.liveAt(Idx.getDefIndex())) {
report("Instruction stores to dead spill slot", MO, MONum);
*OS << "Live stack: " << LI << '\n';
}
diff --git a/contrib/llvm/lib/CodeGen/PeepholeOptimizer.cpp b/contrib/llvm/lib/CodeGen/PeepholeOptimizer.cpp
index c105bb0..c523e39 100644
--- a/contrib/llvm/lib/CodeGen/PeepholeOptimizer.cpp
+++ b/contrib/llvm/lib/CodeGen/PeepholeOptimizer.cpp
@@ -353,10 +353,10 @@ bool PeepholeOptimizer::OptimizeCmpInstr(MachineInstr *MI,
bool PeepholeOptimizer::isMoveImmediate(MachineInstr *MI,
SmallSet<unsigned, 4> &ImmDefRegs,
DenseMap<unsigned, MachineInstr*> &ImmDefMIs) {
- const TargetInstrDesc &TID = MI->getDesc();
- if (!TID.isMoveImmediate())
+ const MCInstrDesc &MCID = MI->getDesc();
+ if (!MCID.isMoveImmediate())
return false;
- if (TID.getNumDefs() != 1)
+ if (MCID.getNumDefs() != 1)
return false;
unsigned Reg = MI->getOperand(0).getReg();
if (TargetRegisterInfo::isVirtualRegister(Reg)) {
@@ -429,16 +429,16 @@ bool PeepholeOptimizer::runOnMachineFunction(MachineFunction &MF) {
continue;
}
- const TargetInstrDesc &TID = MI->getDesc();
+ const MCInstrDesc &MCID = MI->getDesc();
- if (TID.isBitcast()) {
+ if (MCID.isBitcast()) {
if (OptimizeBitcastInstr(MI, MBB)) {
// MI is deleted.
Changed = true;
MII = First ? I->begin() : llvm::next(PMII);
continue;
}
- } else if (TID.isCompare()) {
+ } else if (MCID.isCompare()) {
if (OptimizeCmpInstr(MI, MBB)) {
// MI is deleted.
Changed = true;
diff --git a/contrib/llvm/lib/CodeGen/PostRASchedulerList.cpp b/contrib/llvm/lib/CodeGen/PostRASchedulerList.cpp
index ba8501f..c73e877 100644
--- a/contrib/llvm/lib/CodeGen/PostRASchedulerList.cpp
+++ b/contrib/llvm/lib/CodeGen/PostRASchedulerList.cpp
@@ -22,6 +22,7 @@
#include "AntiDepBreaker.h"
#include "AggressiveAntiDepBreaker.h"
#include "CriticalAntiDepBreaker.h"
+#include "RegisterClassInfo.h"
#include "ScheduleDAGInstrs.h"
#include "llvm/CodeGen/Passes.h"
#include "llvm/CodeGen/LatencyPriorityQueue.h"
@@ -37,7 +38,7 @@
#include "llvm/Target/TargetMachine.h"
#include "llvm/Target/TargetInstrInfo.h"
#include "llvm/Target/TargetRegisterInfo.h"
-#include "llvm/Target/TargetSubtarget.h"
+#include "llvm/Target/TargetSubtargetInfo.h"
#include "llvm/Support/CommandLine.h"
#include "llvm/Support/Debug.h"
#include "llvm/Support/ErrorHandling.h"
@@ -52,7 +53,7 @@ STATISTIC(NumStalls, "Number of pipeline stalls");
STATISTIC(NumFixedAnti, "Number of fixed anti-dependencies");
// Post-RA scheduling is enabled with
-// TargetSubtarget.enablePostRAScheduler(). This flag can be used to
+// TargetSubtargetInfo.enablePostRAScheduler(). This flag can be used to
// override the target.
static cl::opt<bool>
EnablePostRAScheduler("post-RA-scheduler",
@@ -80,6 +81,7 @@ namespace {
class PostRAScheduler : public MachineFunctionPass {
AliasAnalysis *AA;
const TargetInstrInfo *TII;
+ RegisterClassInfo RegClassInfo;
CodeGenOpt::Level OptLevel;
public:
@@ -135,7 +137,8 @@ namespace {
public:
SchedulePostRATDList(
MachineFunction &MF, MachineLoopInfo &MLI, MachineDominatorTree &MDT,
- AliasAnalysis *AA, TargetSubtarget::AntiDepBreakMode AntiDepMode,
+ AliasAnalysis *AA, const RegisterClassInfo&,
+ TargetSubtargetInfo::AntiDepBreakMode AntiDepMode,
SmallVectorImpl<TargetRegisterClass*> &CriticalPathRCs);
~SchedulePostRATDList();
@@ -179,7 +182,8 @@ namespace {
SchedulePostRATDList::SchedulePostRATDList(
MachineFunction &MF, MachineLoopInfo &MLI, MachineDominatorTree &MDT,
- AliasAnalysis *AA, TargetSubtarget::AntiDepBreakMode AntiDepMode,
+ AliasAnalysis *AA, const RegisterClassInfo &RCI,
+ TargetSubtargetInfo::AntiDepBreakMode AntiDepMode,
SmallVectorImpl<TargetRegisterClass*> &CriticalPathRCs)
: ScheduleDAGInstrs(MF, MLI, MDT), Topo(SUnits), AA(AA),
KillIndices(TRI->getNumRegs())
@@ -189,10 +193,10 @@ SchedulePostRATDList::SchedulePostRATDList(
HazardRec =
TM.getInstrInfo()->CreateTargetPostRAHazardRecognizer(InstrItins, this);
AntiDepBreak =
- ((AntiDepMode == TargetSubtarget::ANTIDEP_ALL) ?
- (AntiDepBreaker *)new AggressiveAntiDepBreaker(MF, CriticalPathRCs) :
- ((AntiDepMode == TargetSubtarget::ANTIDEP_CRITICAL) ?
- (AntiDepBreaker *)new CriticalAntiDepBreaker(MF) : NULL));
+ ((AntiDepMode == TargetSubtargetInfo::ANTIDEP_ALL) ?
+ (AntiDepBreaker *)new AggressiveAntiDepBreaker(MF, RCI, CriticalPathRCs) :
+ ((AntiDepMode == TargetSubtargetInfo::ANTIDEP_CRITICAL) ?
+ (AntiDepBreaker *)new CriticalAntiDepBreaker(MF, RCI) : NULL));
}
SchedulePostRATDList::~SchedulePostRATDList() {
@@ -205,9 +209,10 @@ bool PostRAScheduler::runOnMachineFunction(MachineFunction &Fn) {
MachineLoopInfo &MLI = getAnalysis<MachineLoopInfo>();
MachineDominatorTree &MDT = getAnalysis<MachineDominatorTree>();
AliasAnalysis *AA = &getAnalysis<AliasAnalysis>();
+ RegClassInfo.runOnMachineFunction(Fn);
// Check for explicit enable/disable of post-ra scheduling.
- TargetSubtarget::AntiDepBreakMode AntiDepMode = TargetSubtarget::ANTIDEP_NONE;
+ TargetSubtargetInfo::AntiDepBreakMode AntiDepMode = TargetSubtargetInfo::ANTIDEP_NONE;
SmallVector<TargetRegisterClass*, 4> CriticalPathRCs;
if (EnablePostRAScheduler.getPosition() > 0) {
if (!EnablePostRAScheduler)
@@ -215,22 +220,23 @@ bool PostRAScheduler::runOnMachineFunction(MachineFunction &Fn) {
} else {
// Check that post-RA scheduling is enabled for this target.
// This may upgrade the AntiDepMode.
- const TargetSubtarget &ST = Fn.getTarget().getSubtarget<TargetSubtarget>();
+ const TargetSubtargetInfo &ST = Fn.getTarget().getSubtarget<TargetSubtargetInfo>();
if (!ST.enablePostRAScheduler(OptLevel, AntiDepMode, CriticalPathRCs))
return false;
}
// Check for antidep breaking override...
if (EnableAntiDepBreaking.getPosition() > 0) {
- AntiDepMode = (EnableAntiDepBreaking == "all") ?
- TargetSubtarget::ANTIDEP_ALL :
- (EnableAntiDepBreaking == "critical")
- ? TargetSubtarget::ANTIDEP_CRITICAL : TargetSubtarget::ANTIDEP_NONE;
+ AntiDepMode = (EnableAntiDepBreaking == "all")
+ ? TargetSubtargetInfo::ANTIDEP_ALL
+ : ((EnableAntiDepBreaking == "critical")
+ ? TargetSubtargetInfo::ANTIDEP_CRITICAL
+ : TargetSubtargetInfo::ANTIDEP_NONE);
}
DEBUG(dbgs() << "PostRAScheduler\n");
- SchedulePostRATDList Scheduler(Fn, MLI, MDT, AA, AntiDepMode,
+ SchedulePostRATDList Scheduler(Fn, MLI, MDT, AA, RegClassInfo, AntiDepMode,
CriticalPathRCs);
// Loop over all of the basic blocks
diff --git a/contrib/llvm/lib/CodeGen/PreAllocSplitting.cpp b/contrib/llvm/lib/CodeGen/PreAllocSplitting.cpp
deleted file mode 100644
index d6e31da..0000000
--- a/contrib/llvm/lib/CodeGen/PreAllocSplitting.cpp
+++ /dev/null
@@ -1,1430 +0,0 @@
-//===-- PreAllocSplitting.cpp - Pre-allocation Interval Spltting Pass. ----===//
-//
-// The LLVM Compiler Infrastructure
-//
-// This file is distributed under the University of Illinois Open Source
-// License. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-//
-// This file implements the machine instruction level pre-register allocation
-// live interval splitting pass. It finds live interval barriers, i.e.
-// instructions which will kill all physical registers in certain register
-// classes, and split all live intervals which cross the barrier.
-//
-//===----------------------------------------------------------------------===//
-
-#define DEBUG_TYPE "pre-alloc-split"
-#include "VirtRegMap.h"
-#include "llvm/CodeGen/CalcSpillWeights.h"
-#include "llvm/CodeGen/LiveIntervalAnalysis.h"
-#include "llvm/CodeGen/LiveStackAnalysis.h"
-#include "llvm/CodeGen/MachineDominators.h"
-#include "llvm/CodeGen/MachineFrameInfo.h"
-#include "llvm/CodeGen/MachineFunctionPass.h"
-#include "llvm/CodeGen/MachineLoopInfo.h"
-#include "llvm/CodeGen/MachineRegisterInfo.h"
-#include "llvm/CodeGen/Passes.h"
-#include "llvm/CodeGen/RegisterCoalescer.h"
-#include "llvm/Target/TargetInstrInfo.h"
-#include "llvm/Target/TargetMachine.h"
-#include "llvm/Target/TargetOptions.h"
-#include "llvm/Target/TargetRegisterInfo.h"
-#include "llvm/Support/CommandLine.h"
-#include "llvm/Support/Debug.h"
-#include "llvm/Support/ErrorHandling.h"
-#include "llvm/ADT/DenseMap.h"
-#include "llvm/ADT/DepthFirstIterator.h"
-#include "llvm/ADT/SmallPtrSet.h"
-#include "llvm/ADT/Statistic.h"
-using namespace llvm;
-
-static cl::opt<int> PreSplitLimit("pre-split-limit", cl::init(-1), cl::Hidden);
-static cl::opt<int> DeadSplitLimit("dead-split-limit", cl::init(-1),
- cl::Hidden);
-static cl::opt<int> RestoreFoldLimit("restore-fold-limit", cl::init(-1),
- cl::Hidden);
-
-STATISTIC(NumSplits, "Number of intervals split");
-STATISTIC(NumRemats, "Number of intervals split by rematerialization");
-STATISTIC(NumFolds, "Number of intervals split with spill folding");
-STATISTIC(NumRestoreFolds, "Number of intervals split with restore folding");
-STATISTIC(NumRenumbers, "Number of intervals renumbered into new registers");
-STATISTIC(NumDeadSpills, "Number of dead spills removed");
-
-namespace {
- class PreAllocSplitting : public MachineFunctionPass {
- MachineFunction *CurrMF;
- const TargetMachine *TM;
- const TargetInstrInfo *TII;
- const TargetRegisterInfo* TRI;
- MachineFrameInfo *MFI;
- MachineRegisterInfo *MRI;
- SlotIndexes *SIs;
- LiveIntervals *LIs;
- LiveStacks *LSs;
- VirtRegMap *VRM;
-
- // Barrier - Current barrier being processed.
- MachineInstr *Barrier;
-
- // BarrierMBB - Basic block where the barrier resides in.
- MachineBasicBlock *BarrierMBB;
-
- // Barrier - Current barrier index.
- SlotIndex BarrierIdx;
-
- // CurrLI - Current live interval being split.
- LiveInterval *CurrLI;
-
- // CurrSLI - Current stack slot live interval.
- LiveInterval *CurrSLI;
-
- // CurrSValNo - Current val# for the stack slot live interval.
- VNInfo *CurrSValNo;
-
- // IntervalSSMap - A map from live interval to spill slots.
- DenseMap<unsigned, int> IntervalSSMap;
-
- // Def2SpillMap - A map from a def instruction index to spill index.
- DenseMap<SlotIndex, SlotIndex> Def2SpillMap;
-
- public:
- static char ID;
- PreAllocSplitting() : MachineFunctionPass(ID) {
- initializePreAllocSplittingPass(*PassRegistry::getPassRegistry());
- }
-
- virtual bool runOnMachineFunction(MachineFunction &MF);
-
- virtual void getAnalysisUsage(AnalysisUsage &AU) const {
- AU.setPreservesCFG();
- AU.addRequired<SlotIndexes>();
- AU.addPreserved<SlotIndexes>();
- AU.addRequired<LiveIntervals>();
- AU.addPreserved<LiveIntervals>();
- AU.addRequired<LiveStacks>();
- AU.addPreserved<LiveStacks>();
- AU.addPreserved<RegisterCoalescer>();
- AU.addPreserved<CalculateSpillWeights>();
- AU.addPreservedID(StrongPHIEliminationID);
- AU.addPreservedID(PHIEliminationID);
- AU.addRequired<MachineDominatorTree>();
- AU.addRequired<MachineLoopInfo>();
- AU.addRequired<VirtRegMap>();
- AU.addPreserved<MachineDominatorTree>();
- AU.addPreserved<MachineLoopInfo>();
- AU.addPreserved<VirtRegMap>();
- MachineFunctionPass::getAnalysisUsage(AU);
- }
-
- virtual void releaseMemory() {
- IntervalSSMap.clear();
- Def2SpillMap.clear();
- }
-
- virtual const char *getPassName() const {
- return "Pre-Register Allocaton Live Interval Splitting";
- }
-
- /// print - Implement the dump method.
- virtual void print(raw_ostream &O, const Module* M = 0) const {
- LIs->print(O, M);
- }
-
-
- private:
-
- MachineBasicBlock::iterator
- findSpillPoint(MachineBasicBlock*, MachineInstr*, MachineInstr*,
- SmallPtrSet<MachineInstr*, 4>&);
-
- MachineBasicBlock::iterator
- findRestorePoint(MachineBasicBlock*, MachineInstr*, SlotIndex,
- SmallPtrSet<MachineInstr*, 4>&);
-
- int CreateSpillStackSlot(unsigned, const TargetRegisterClass *);
-
- bool IsAvailableInStack(MachineBasicBlock*, unsigned,
- SlotIndex, SlotIndex,
- SlotIndex&, int&) const;
-
- void UpdateSpillSlotInterval(VNInfo*, SlotIndex, SlotIndex);
-
- bool SplitRegLiveInterval(LiveInterval*);
-
- bool SplitRegLiveIntervals(const TargetRegisterClass **,
- SmallPtrSet<LiveInterval*, 8>&);
-
- bool createsNewJoin(LiveRange* LR, MachineBasicBlock* DefMBB,
- MachineBasicBlock* BarrierMBB);
- bool Rematerialize(unsigned vreg, VNInfo* ValNo,
- MachineInstr* DefMI,
- MachineBasicBlock::iterator RestorePt,
- SmallPtrSet<MachineInstr*, 4>& RefsInMBB);
- MachineInstr* FoldSpill(unsigned vreg, const TargetRegisterClass* RC,
- MachineInstr* DefMI,
- MachineInstr* Barrier,
- MachineBasicBlock* MBB,
- int& SS,
- SmallPtrSet<MachineInstr*, 4>& RefsInMBB);
- MachineInstr* FoldRestore(unsigned vreg,
- const TargetRegisterClass* RC,
- MachineInstr* Barrier,
- MachineBasicBlock* MBB,
- int SS,
- SmallPtrSet<MachineInstr*, 4>& RefsInMBB);
- void RenumberValno(VNInfo* VN);
- void ReconstructLiveInterval(LiveInterval* LI);
- bool removeDeadSpills(SmallPtrSet<LiveInterval*, 8>& split);
- unsigned getNumberOfNonSpills(SmallPtrSet<MachineInstr*, 4>& MIs,
- unsigned Reg, int FrameIndex, bool& TwoAddr);
- VNInfo* PerformPHIConstruction(MachineBasicBlock::iterator Use,
- MachineBasicBlock* MBB, LiveInterval* LI,
- SmallPtrSet<MachineInstr*, 4>& Visited,
- DenseMap<MachineBasicBlock*, SmallPtrSet<MachineInstr*, 2> >& Defs,
- DenseMap<MachineBasicBlock*, SmallPtrSet<MachineInstr*, 2> >& Uses,
- DenseMap<MachineInstr*, VNInfo*>& NewVNs,
- DenseMap<MachineBasicBlock*, VNInfo*>& LiveOut,
- DenseMap<MachineBasicBlock*, VNInfo*>& Phis,
- bool IsTopLevel, bool IsIntraBlock);
- VNInfo* PerformPHIConstructionFallBack(MachineBasicBlock::iterator Use,
- MachineBasicBlock* MBB, LiveInterval* LI,
- SmallPtrSet<MachineInstr*, 4>& Visited,
- DenseMap<MachineBasicBlock*, SmallPtrSet<MachineInstr*, 2> >& Defs,
- DenseMap<MachineBasicBlock*, SmallPtrSet<MachineInstr*, 2> >& Uses,
- DenseMap<MachineInstr*, VNInfo*>& NewVNs,
- DenseMap<MachineBasicBlock*, VNInfo*>& LiveOut,
- DenseMap<MachineBasicBlock*, VNInfo*>& Phis,
- bool IsTopLevel, bool IsIntraBlock);
-};
-} // end anonymous namespace
-
-char PreAllocSplitting::ID = 0;
-
-INITIALIZE_PASS_BEGIN(PreAllocSplitting, "pre-alloc-splitting",
- "Pre-Register Allocation Live Interval Splitting",
- false, false)
-INITIALIZE_PASS_DEPENDENCY(SlotIndexes)
-INITIALIZE_PASS_DEPENDENCY(LiveIntervals)
-INITIALIZE_PASS_DEPENDENCY(LiveStacks)
-INITIALIZE_PASS_DEPENDENCY(MachineDominatorTree)
-INITIALIZE_PASS_DEPENDENCY(MachineLoopInfo)
-INITIALIZE_PASS_DEPENDENCY(VirtRegMap)
-INITIALIZE_PASS_END(PreAllocSplitting, "pre-alloc-splitting",
- "Pre-Register Allocation Live Interval Splitting",
- false, false)
-
-char &llvm::PreAllocSplittingID = PreAllocSplitting::ID;
-
-/// findSpillPoint - Find a gap as far away from the given MI that's suitable
-/// for spilling the current live interval. The index must be before any
-/// defs and uses of the live interval register in the mbb. Return begin() if
-/// none is found.
-MachineBasicBlock::iterator
-PreAllocSplitting::findSpillPoint(MachineBasicBlock *MBB, MachineInstr *MI,
- MachineInstr *DefMI,
- SmallPtrSet<MachineInstr*, 4> &RefsInMBB) {
- MachineBasicBlock::iterator Pt = MBB->begin();
-
- MachineBasicBlock::iterator MII = MI;
- MachineBasicBlock::iterator EndPt = DefMI
- ? MachineBasicBlock::iterator(DefMI) : MBB->begin();
-
- while (MII != EndPt && !RefsInMBB.count(MII) &&
- MII->getOpcode() != TRI->getCallFrameSetupOpcode())
- --MII;
- if (MII == EndPt || RefsInMBB.count(MII)) return Pt;
-
- while (MII != EndPt && !RefsInMBB.count(MII)) {
- // We can't insert the spill between the barrier (a call), and its
- // corresponding call frame setup.
- if (MII->getOpcode() == TRI->getCallFrameDestroyOpcode()) {
- while (MII->getOpcode() != TRI->getCallFrameSetupOpcode()) {
- --MII;
- if (MII == EndPt) {
- return Pt;
- }
- }
- continue;
- } else {
- Pt = MII;
- }
-
- if (RefsInMBB.count(MII))
- return Pt;
-
-
- --MII;
- }
-
- return Pt;
-}
-
-/// findRestorePoint - Find a gap in the instruction index map that's suitable
-/// for restoring the current live interval value. The index must be before any
-/// uses of the live interval register in the mbb. Return end() if none is
-/// found.
-MachineBasicBlock::iterator
-PreAllocSplitting::findRestorePoint(MachineBasicBlock *MBB, MachineInstr *MI,
- SlotIndex LastIdx,
- SmallPtrSet<MachineInstr*, 4> &RefsInMBB) {
- // FIXME: Allow spill to be inserted to the beginning of the mbb. Update mbb
- // begin index accordingly.
- MachineBasicBlock::iterator Pt = MBB->end();
- MachineBasicBlock::iterator EndPt = MBB->getFirstTerminator();
-
- // We start at the call, so walk forward until we find the call frame teardown
- // since we can't insert restores before that. Bail if we encounter a use
- // during this time.
- MachineBasicBlock::iterator MII = MI;
- if (MII == EndPt) return Pt;
-
- while (MII != EndPt && !RefsInMBB.count(MII) &&
- MII->getOpcode() != TRI->getCallFrameDestroyOpcode())
- ++MII;
- if (MII == EndPt || RefsInMBB.count(MII)) return Pt;
- ++MII;
-
- // FIXME: Limit the number of instructions to examine to reduce
- // compile time?
- while (MII != EndPt) {
- SlotIndex Index = LIs->getInstructionIndex(MII);
- if (Index > LastIdx)
- break;
-
- // We can't insert a restore between the barrier (a call) and its
- // corresponding call frame teardown.
- if (MII->getOpcode() == TRI->getCallFrameSetupOpcode()) {
- do {
- if (MII == EndPt || RefsInMBB.count(MII)) return Pt;
- ++MII;
- } while (MII->getOpcode() != TRI->getCallFrameDestroyOpcode());
- } else {
- Pt = MII;
- }
-
- if (RefsInMBB.count(MII))
- return Pt;
-
- ++MII;
- }
-
- return Pt;
-}
-
-/// CreateSpillStackSlot - Create a stack slot for the live interval being
-/// split. If the live interval was previously split, just reuse the same
-/// slot.
-int PreAllocSplitting::CreateSpillStackSlot(unsigned Reg,
- const TargetRegisterClass *RC) {
- int SS;
- DenseMap<unsigned, int>::iterator I = IntervalSSMap.find(Reg);
- if (I != IntervalSSMap.end()) {
- SS = I->second;
- } else {
- SS = MFI->CreateSpillStackObject(RC->getSize(), RC->getAlignment());
- IntervalSSMap[Reg] = SS;
- }
-
- // Create live interval for stack slot.
- CurrSLI = &LSs->getOrCreateInterval(SS, RC);
- if (CurrSLI->hasAtLeastOneValue())
- CurrSValNo = CurrSLI->getValNumInfo(0);
- else
- CurrSValNo = CurrSLI->getNextValue(SlotIndex(), 0,
- LSs->getVNInfoAllocator());
- return SS;
-}
-
-/// IsAvailableInStack - Return true if register is available in a split stack
-/// slot at the specified index.
-bool
-PreAllocSplitting::IsAvailableInStack(MachineBasicBlock *DefMBB,
- unsigned Reg, SlotIndex DefIndex,
- SlotIndex RestoreIndex,
- SlotIndex &SpillIndex,
- int& SS) const {
- if (!DefMBB)
- return false;
-
- DenseMap<unsigned, int>::const_iterator I = IntervalSSMap.find(Reg);
- if (I == IntervalSSMap.end())
- return false;
- DenseMap<SlotIndex, SlotIndex>::const_iterator
- II = Def2SpillMap.find(DefIndex);
- if (II == Def2SpillMap.end())
- return false;
-
- // If last spill of def is in the same mbb as barrier mbb (where restore will
- // be), make sure it's not below the intended restore index.
- // FIXME: Undo the previous spill?
- assert(LIs->getMBBFromIndex(II->second) == DefMBB);
- if (DefMBB == BarrierMBB && II->second >= RestoreIndex)
- return false;
-
- SS = I->second;
- SpillIndex = II->second;
- return true;
-}
-
-/// UpdateSpillSlotInterval - Given the specified val# of the register live
-/// interval being split, and the spill and restore indicies, update the live
-/// interval of the spill stack slot.
-void
-PreAllocSplitting::UpdateSpillSlotInterval(VNInfo *ValNo, SlotIndex SpillIndex,
- SlotIndex RestoreIndex) {
- assert(LIs->getMBBFromIndex(RestoreIndex) == BarrierMBB &&
- "Expect restore in the barrier mbb");
-
- MachineBasicBlock *MBB = LIs->getMBBFromIndex(SpillIndex);
- if (MBB == BarrierMBB) {
- // Intra-block spill + restore. We are done.
- LiveRange SLR(SpillIndex, RestoreIndex, CurrSValNo);
- CurrSLI->addRange(SLR);
- return;
- }
-
- SmallPtrSet<MachineBasicBlock*, 4> Processed;
- SlotIndex EndIdx = LIs->getMBBEndIdx(MBB);
- LiveRange SLR(SpillIndex, EndIdx, CurrSValNo);
- CurrSLI->addRange(SLR);
- Processed.insert(MBB);
-
- // Start from the spill mbb, figure out the extend of the spill slot's
- // live interval.
- SmallVector<MachineBasicBlock*, 4> WorkList;
- const LiveRange *LR = CurrLI->getLiveRangeContaining(SpillIndex);
- if (LR->end > EndIdx)
- // If live range extend beyond end of mbb, add successors to work list.
- for (MachineBasicBlock::succ_iterator SI = MBB->succ_begin(),
- SE = MBB->succ_end(); SI != SE; ++SI)
- WorkList.push_back(*SI);
-
- while (!WorkList.empty()) {
- MachineBasicBlock *MBB = WorkList.back();
- WorkList.pop_back();
- if (Processed.count(MBB))
- continue;
- SlotIndex Idx = LIs->getMBBStartIdx(MBB);
- LR = CurrLI->getLiveRangeContaining(Idx);
- if (LR && LR->valno == ValNo) {
- EndIdx = LIs->getMBBEndIdx(MBB);
- if (Idx <= RestoreIndex && RestoreIndex < EndIdx) {
- // Spill slot live interval stops at the restore.
- LiveRange SLR(Idx, RestoreIndex, CurrSValNo);
- CurrSLI->addRange(SLR);
- } else if (LR->end > EndIdx) {
- // Live range extends beyond end of mbb, process successors.
- LiveRange SLR(Idx, EndIdx.getNextIndex(), CurrSValNo);
- CurrSLI->addRange(SLR);
- for (MachineBasicBlock::succ_iterator SI = MBB->succ_begin(),
- SE = MBB->succ_end(); SI != SE; ++SI)
- WorkList.push_back(*SI);
- } else {
- LiveRange SLR(Idx, LR->end, CurrSValNo);
- CurrSLI->addRange(SLR);
- }
- Processed.insert(MBB);
- }
- }
-}
-
-/// PerformPHIConstruction - From properly set up use and def lists, use a PHI
-/// construction algorithm to compute the ranges and valnos for an interval.
-VNInfo*
-PreAllocSplitting::PerformPHIConstruction(MachineBasicBlock::iterator UseI,
- MachineBasicBlock* MBB, LiveInterval* LI,
- SmallPtrSet<MachineInstr*, 4>& Visited,
- DenseMap<MachineBasicBlock*, SmallPtrSet<MachineInstr*, 2> >& Defs,
- DenseMap<MachineBasicBlock*, SmallPtrSet<MachineInstr*, 2> >& Uses,
- DenseMap<MachineInstr*, VNInfo*>& NewVNs,
- DenseMap<MachineBasicBlock*, VNInfo*>& LiveOut,
- DenseMap<MachineBasicBlock*, VNInfo*>& Phis,
- bool IsTopLevel, bool IsIntraBlock) {
- // Return memoized result if it's available.
- if (IsTopLevel && Visited.count(UseI) && NewVNs.count(UseI))
- return NewVNs[UseI];
- else if (!IsTopLevel && IsIntraBlock && NewVNs.count(UseI))
- return NewVNs[UseI];
- else if (!IsIntraBlock && LiveOut.count(MBB))
- return LiveOut[MBB];
-
- // Check if our block contains any uses or defs.
- bool ContainsDefs = Defs.count(MBB);
- bool ContainsUses = Uses.count(MBB);
-
- VNInfo* RetVNI = 0;
-
- // Enumerate the cases of use/def contaning blocks.
- if (!ContainsDefs && !ContainsUses) {
- return PerformPHIConstructionFallBack(UseI, MBB, LI, Visited, Defs, Uses,
- NewVNs, LiveOut, Phis,
- IsTopLevel, IsIntraBlock);
- } else if (ContainsDefs && !ContainsUses) {
- SmallPtrSet<MachineInstr*, 2>& BlockDefs = Defs[MBB];
-
- // Search for the def in this block. If we don't find it before the
- // instruction we care about, go to the fallback case. Note that that
- // should never happen: this cannot be intrablock, so use should
- // always be an end() iterator.
- assert(UseI == MBB->end() && "No use marked in intrablock");
-
- MachineBasicBlock::iterator Walker = UseI;
- --Walker;
- while (Walker != MBB->begin()) {
- if (BlockDefs.count(Walker))
- break;
- --Walker;
- }
-
- // Once we've found it, extend its VNInfo to our instruction.
- SlotIndex DefIndex = LIs->getInstructionIndex(Walker);
- DefIndex = DefIndex.getDefIndex();
- SlotIndex EndIndex = LIs->getMBBEndIdx(MBB);
-
- RetVNI = NewVNs[Walker];
- LI->addRange(LiveRange(DefIndex, EndIndex, RetVNI));
- } else if (!ContainsDefs && ContainsUses) {
- SmallPtrSet<MachineInstr*, 2>& BlockUses = Uses[MBB];
-
- // Search for the use in this block that precedes the instruction we care
- // about, going to the fallback case if we don't find it.
- MachineBasicBlock::iterator Walker = UseI;
- bool found = false;
- while (Walker != MBB->begin()) {
- --Walker;
- if (BlockUses.count(Walker)) {
- found = true;
- break;
- }
- }
-
- if (!found)
- return PerformPHIConstructionFallBack(UseI, MBB, LI, Visited, Defs,
- Uses, NewVNs, LiveOut, Phis,
- IsTopLevel, IsIntraBlock);
-
- SlotIndex UseIndex = LIs->getInstructionIndex(Walker);
- UseIndex = UseIndex.getUseIndex();
- SlotIndex EndIndex;
- if (IsIntraBlock) {
- EndIndex = LIs->getInstructionIndex(UseI).getDefIndex();
- } else
- EndIndex = LIs->getMBBEndIdx(MBB);
-
- // Now, recursively phi construct the VNInfo for the use we found,
- // and then extend it to include the instruction we care about
- RetVNI = PerformPHIConstruction(Walker, MBB, LI, Visited, Defs, Uses,
- NewVNs, LiveOut, Phis, false, true);
-
- LI->addRange(LiveRange(UseIndex, EndIndex, RetVNI));
-
- // FIXME: Need to set kills properly for inter-block stuff.
- } else if (ContainsDefs && ContainsUses) {
- SmallPtrSet<MachineInstr*, 2>& BlockDefs = Defs[MBB];
- SmallPtrSet<MachineInstr*, 2>& BlockUses = Uses[MBB];
-
- // This case is basically a merging of the two preceding case, with the
- // special note that checking for defs must take precedence over checking
- // for uses, because of two-address instructions.
- MachineBasicBlock::iterator Walker = UseI;
- bool foundDef = false;
- bool foundUse = false;
- while (Walker != MBB->begin()) {
- --Walker;
- if (BlockDefs.count(Walker)) {
- foundDef = true;
- break;
- } else if (BlockUses.count(Walker)) {
- foundUse = true;
- break;
- }
- }
-
- if (!foundDef && !foundUse)
- return PerformPHIConstructionFallBack(UseI, MBB, LI, Visited, Defs,
- Uses, NewVNs, LiveOut, Phis,
- IsTopLevel, IsIntraBlock);
-
- SlotIndex StartIndex = LIs->getInstructionIndex(Walker);
- StartIndex = foundDef ? StartIndex.getDefIndex() : StartIndex.getUseIndex();
- SlotIndex EndIndex;
- if (IsIntraBlock) {
- EndIndex = LIs->getInstructionIndex(UseI).getDefIndex();
- } else
- EndIndex = LIs->getMBBEndIdx(MBB);
-
- if (foundDef)
- RetVNI = NewVNs[Walker];
- else
- RetVNI = PerformPHIConstruction(Walker, MBB, LI, Visited, Defs, Uses,
- NewVNs, LiveOut, Phis, false, true);
-
- LI->addRange(LiveRange(StartIndex, EndIndex, RetVNI));
- }
-
- // Memoize results so we don't have to recompute them.
- if (!IsIntraBlock) LiveOut[MBB] = RetVNI;
- else {
- if (!NewVNs.count(UseI))
- NewVNs[UseI] = RetVNI;
- Visited.insert(UseI);
- }
-
- return RetVNI;
-}
-
-/// PerformPHIConstructionFallBack - PerformPHIConstruction fall back path.
-///
-VNInfo*
-PreAllocSplitting::PerformPHIConstructionFallBack(MachineBasicBlock::iterator UseI,
- MachineBasicBlock* MBB, LiveInterval* LI,
- SmallPtrSet<MachineInstr*, 4>& Visited,
- DenseMap<MachineBasicBlock*, SmallPtrSet<MachineInstr*, 2> >& Defs,
- DenseMap<MachineBasicBlock*, SmallPtrSet<MachineInstr*, 2> >& Uses,
- DenseMap<MachineInstr*, VNInfo*>& NewVNs,
- DenseMap<MachineBasicBlock*, VNInfo*>& LiveOut,
- DenseMap<MachineBasicBlock*, VNInfo*>& Phis,
- bool IsTopLevel, bool IsIntraBlock) {
- // NOTE: Because this is the fallback case from other cases, we do NOT
- // assume that we are not intrablock here.
- if (Phis.count(MBB)) return Phis[MBB];
-
- SlotIndex StartIndex = LIs->getMBBStartIdx(MBB);
- VNInfo *RetVNI = Phis[MBB] =
- LI->getNextValue(SlotIndex(), /*FIXME*/ 0,
- LIs->getVNInfoAllocator());
-
- if (!IsIntraBlock) LiveOut[MBB] = RetVNI;
-
- // If there are no uses or defs between our starting point and the
- // beginning of the block, then recursive perform phi construction
- // on our predecessors.
- DenseMap<MachineBasicBlock*, VNInfo*> IncomingVNs;
- for (MachineBasicBlock::pred_iterator PI = MBB->pred_begin(),
- PE = MBB->pred_end(); PI != PE; ++PI) {
- VNInfo* Incoming = PerformPHIConstruction((*PI)->end(), *PI, LI,
- Visited, Defs, Uses, NewVNs,
- LiveOut, Phis, false, false);
- if (Incoming != 0)
- IncomingVNs[*PI] = Incoming;
- }
-
- if (MBB->pred_size() == 1 && !RetVNI->hasPHIKill()) {
- VNInfo* OldVN = RetVNI;
- VNInfo* NewVN = IncomingVNs.begin()->second;
- VNInfo* MergedVN = LI->MergeValueNumberInto(OldVN, NewVN);
- if (MergedVN == OldVN) std::swap(OldVN, NewVN);
-
- for (DenseMap<MachineBasicBlock*, VNInfo*>::iterator LOI = LiveOut.begin(),
- LOE = LiveOut.end(); LOI != LOE; ++LOI)
- if (LOI->second == OldVN)
- LOI->second = MergedVN;
- for (DenseMap<MachineInstr*, VNInfo*>::iterator NVI = NewVNs.begin(),
- NVE = NewVNs.end(); NVI != NVE; ++NVI)
- if (NVI->second == OldVN)
- NVI->second = MergedVN;
- for (DenseMap<MachineBasicBlock*, VNInfo*>::iterator PI = Phis.begin(),
- PE = Phis.end(); PI != PE; ++PI)
- if (PI->second == OldVN)
- PI->second = MergedVN;
- RetVNI = MergedVN;
- } else {
- // Otherwise, merge the incoming VNInfos with a phi join. Create a new
- // VNInfo to represent the joined value.
- for (DenseMap<MachineBasicBlock*, VNInfo*>::iterator I =
- IncomingVNs.begin(), E = IncomingVNs.end(); I != E; ++I) {
- I->second->setHasPHIKill(true);
- }
- }
-
- SlotIndex EndIndex;
- if (IsIntraBlock) {
- EndIndex = LIs->getInstructionIndex(UseI).getDefIndex();
- } else
- EndIndex = LIs->getMBBEndIdx(MBB);
- LI->addRange(LiveRange(StartIndex, EndIndex, RetVNI));
-
- // Memoize results so we don't have to recompute them.
- if (!IsIntraBlock)
- LiveOut[MBB] = RetVNI;
- else {
- if (!NewVNs.count(UseI))
- NewVNs[UseI] = RetVNI;
- Visited.insert(UseI);
- }
-
- return RetVNI;
-}
-
-/// ReconstructLiveInterval - Recompute a live interval from scratch.
-void PreAllocSplitting::ReconstructLiveInterval(LiveInterval* LI) {
- VNInfo::Allocator& Alloc = LIs->getVNInfoAllocator();
-
- // Clear the old ranges and valnos;
- LI->clear();
-
- // Cache the uses and defs of the register
- typedef DenseMap<MachineBasicBlock*, SmallPtrSet<MachineInstr*, 2> > RegMap;
- RegMap Defs, Uses;
-
- // Keep track of the new VNs we're creating.
- DenseMap<MachineInstr*, VNInfo*> NewVNs;
- SmallPtrSet<VNInfo*, 2> PhiVNs;
-
- // Cache defs, and create a new VNInfo for each def.
- for (MachineRegisterInfo::def_iterator DI = MRI->def_begin(LI->reg),
- DE = MRI->def_end(); DI != DE; ++DI) {
- Defs[(*DI).getParent()].insert(&*DI);
-
- SlotIndex DefIdx = LIs->getInstructionIndex(&*DI);
- DefIdx = DefIdx.getDefIndex();
-
- assert(!DI->isPHI() && "PHI instr in code during pre-alloc splitting.");
- VNInfo* NewVN = LI->getNextValue(DefIdx, 0, Alloc);
-
- // If the def is a move, set the copy field.
- if (DI->isCopyLike() && DI->getOperand(0).getReg() == LI->reg)
- NewVN->setCopy(&*DI);
-
- NewVNs[&*DI] = NewVN;
- }
-
- // Cache uses as a separate pass from actually processing them.
- for (MachineRegisterInfo::use_iterator UI = MRI->use_begin(LI->reg),
- UE = MRI->use_end(); UI != UE; ++UI)
- Uses[(*UI).getParent()].insert(&*UI);
-
- // Now, actually process every use and use a phi construction algorithm
- // to walk from it to its reaching definitions, building VNInfos along
- // the way.
- DenseMap<MachineBasicBlock*, VNInfo*> LiveOut;
- DenseMap<MachineBasicBlock*, VNInfo*> Phis;
- SmallPtrSet<MachineInstr*, 4> Visited;
- for (MachineRegisterInfo::use_iterator UI = MRI->use_begin(LI->reg),
- UE = MRI->use_end(); UI != UE; ++UI) {
- PerformPHIConstruction(&*UI, UI->getParent(), LI, Visited, Defs,
- Uses, NewVNs, LiveOut, Phis, true, true);
- }
-
- // Add ranges for dead defs
- for (MachineRegisterInfo::def_iterator DI = MRI->def_begin(LI->reg),
- DE = MRI->def_end(); DI != DE; ++DI) {
- SlotIndex DefIdx = LIs->getInstructionIndex(&*DI);
- DefIdx = DefIdx.getDefIndex();
-
- if (LI->liveAt(DefIdx)) continue;
-
- VNInfo* DeadVN = NewVNs[&*DI];
- LI->addRange(LiveRange(DefIdx, DefIdx.getNextSlot(), DeadVN));
- }
-}
-
-/// RenumberValno - Split the given valno out into a new vreg, allowing it to
-/// be allocated to a different register. This function creates a new vreg,
-/// copies the valno and its live ranges over to the new vreg's interval,
-/// removes them from the old interval, and rewrites all uses and defs of
-/// the original reg to the new vreg within those ranges.
-void PreAllocSplitting::RenumberValno(VNInfo* VN) {
- SmallVector<VNInfo*, 4> Stack;
- SmallVector<VNInfo*, 4> VNsToCopy;
- Stack.push_back(VN);
-
- // Walk through and copy the valno we care about, and any other valnos
- // that are two-address redefinitions of the one we care about. These
- // will need to be rewritten as well. We also check for safety of the
- // renumbering here, by making sure that none of the valno involved has
- // phi kills.
- while (!Stack.empty()) {
- VNInfo* OldVN = Stack.back();
- Stack.pop_back();
-
- // Bail out if we ever encounter a valno that has a PHI kill. We can't
- // renumber these.
- if (OldVN->hasPHIKill()) return;
-
- VNsToCopy.push_back(OldVN);
-
- // Locate two-address redefinitions
- for (MachineRegisterInfo::def_iterator DI = MRI->def_begin(CurrLI->reg),
- DE = MRI->def_end(); DI != DE; ++DI) {
- if (!DI->isRegTiedToUseOperand(DI.getOperandNo())) continue;
- SlotIndex DefIdx = LIs->getInstructionIndex(&*DI).getDefIndex();
- VNInfo* NextVN = CurrLI->findDefinedVNInfoForRegInt(DefIdx);
- if (std::find(VNsToCopy.begin(), VNsToCopy.end(), NextVN) !=
- VNsToCopy.end())
- Stack.push_back(NextVN);
- }
- }
-
- // Create the new vreg
- unsigned NewVReg = MRI->createVirtualRegister(MRI->getRegClass(CurrLI->reg));
-
- // Create the new live interval
- LiveInterval& NewLI = LIs->getOrCreateInterval(NewVReg);
-
- for (SmallVector<VNInfo*, 4>::iterator OI = VNsToCopy.begin(), OE =
- VNsToCopy.end(); OI != OE; ++OI) {
- VNInfo* OldVN = *OI;
-
- // Copy the valno over
- VNInfo* NewVN = NewLI.createValueCopy(OldVN, LIs->getVNInfoAllocator());
- NewLI.MergeValueInAsValue(*CurrLI, OldVN, NewVN);
-
- // Remove the valno from the old interval
- CurrLI->removeValNo(OldVN);
- }
-
- // Rewrite defs and uses. This is done in two stages to avoid invalidating
- // the reg_iterator.
- SmallVector<std::pair<MachineInstr*, unsigned>, 8> OpsToChange;
-
- for (MachineRegisterInfo::reg_iterator I = MRI->reg_begin(CurrLI->reg),
- E = MRI->reg_end(); I != E; ++I) {
- MachineOperand& MO = I.getOperand();
- SlotIndex InstrIdx = LIs->getInstructionIndex(&*I);
-
- if ((MO.isUse() && NewLI.liveAt(InstrIdx.getUseIndex())) ||
- (MO.isDef() && NewLI.liveAt(InstrIdx.getDefIndex())))
- OpsToChange.push_back(std::make_pair(&*I, I.getOperandNo()));
- }
-
- for (SmallVector<std::pair<MachineInstr*, unsigned>, 8>::iterator I =
- OpsToChange.begin(), E = OpsToChange.end(); I != E; ++I) {
- MachineInstr* Inst = I->first;
- unsigned OpIdx = I->second;
- MachineOperand& MO = Inst->getOperand(OpIdx);
- MO.setReg(NewVReg);
- }
-
- // Grow the VirtRegMap, since we've created a new vreg.
- VRM->grow();
-
- // The renumbered vreg shares a stack slot with the old register.
- if (IntervalSSMap.count(CurrLI->reg))
- IntervalSSMap[NewVReg] = IntervalSSMap[CurrLI->reg];
-
- ++NumRenumbers;
-}
-
-bool PreAllocSplitting::Rematerialize(unsigned VReg, VNInfo* ValNo,
- MachineInstr* DefMI,
- MachineBasicBlock::iterator RestorePt,
- SmallPtrSet<MachineInstr*, 4>& RefsInMBB) {
- MachineBasicBlock& MBB = *RestorePt->getParent();
-
- MachineBasicBlock::iterator KillPt = BarrierMBB->end();
- if (!DefMI || DefMI->getParent() == BarrierMBB)
- KillPt = findSpillPoint(BarrierMBB, Barrier, NULL, RefsInMBB);
- else
- KillPt = llvm::next(MachineBasicBlock::iterator(DefMI));
-
- if (KillPt == DefMI->getParent()->end())
- return false;
-
- TII->reMaterialize(MBB, RestorePt, VReg, 0, DefMI, *TRI);
- SlotIndex RematIdx = LIs->InsertMachineInstrInMaps(prior(RestorePt));
-
- ReconstructLiveInterval(CurrLI);
- RematIdx = RematIdx.getDefIndex();
- RenumberValno(CurrLI->findDefinedVNInfoForRegInt(RematIdx));
-
- ++NumSplits;
- ++NumRemats;
- return true;
-}
-
-MachineInstr* PreAllocSplitting::FoldSpill(unsigned vreg,
- const TargetRegisterClass* RC,
- MachineInstr* DefMI,
- MachineInstr* Barrier,
- MachineBasicBlock* MBB,
- int& SS,
- SmallPtrSet<MachineInstr*, 4>& RefsInMBB) {
- // Go top down if RefsInMBB is empty.
- if (RefsInMBB.empty())
- return 0;
-
- MachineBasicBlock::iterator FoldPt = Barrier;
- while (&*FoldPt != DefMI && FoldPt != MBB->begin() &&
- !RefsInMBB.count(FoldPt))
- --FoldPt;
-
- int OpIdx = FoldPt->findRegisterDefOperandIdx(vreg);
- if (OpIdx == -1)
- return 0;
-
- SmallVector<unsigned, 1> Ops;
- Ops.push_back(OpIdx);
-
- if (!TII->canFoldMemoryOperand(FoldPt, Ops))
- return 0;
-
- DenseMap<unsigned, int>::iterator I = IntervalSSMap.find(vreg);
- if (I != IntervalSSMap.end()) {
- SS = I->second;
- } else {
- SS = MFI->CreateSpillStackObject(RC->getSize(), RC->getAlignment());
- }
-
- MachineInstr* FMI = TII->foldMemoryOperand(FoldPt, Ops, SS);
-
- if (FMI) {
- LIs->ReplaceMachineInstrInMaps(FoldPt, FMI);
- FoldPt->eraseFromParent();
- ++NumFolds;
-
- IntervalSSMap[vreg] = SS;
- CurrSLI = &LSs->getOrCreateInterval(SS, RC);
- if (CurrSLI->hasAtLeastOneValue())
- CurrSValNo = CurrSLI->getValNumInfo(0);
- else
- CurrSValNo = CurrSLI->getNextValue(SlotIndex(), 0,
- LSs->getVNInfoAllocator());
- }
-
- return FMI;
-}
-
-MachineInstr* PreAllocSplitting::FoldRestore(unsigned vreg,
- const TargetRegisterClass* RC,
- MachineInstr* Barrier,
- MachineBasicBlock* MBB,
- int SS,
- SmallPtrSet<MachineInstr*, 4>& RefsInMBB) {
- if ((int)RestoreFoldLimit != -1 && RestoreFoldLimit == (int)NumRestoreFolds)
- return 0;
-
- // Go top down if RefsInMBB is empty.
- if (RefsInMBB.empty())
- return 0;
-
- // Can't fold a restore between a call stack setup and teardown.
- MachineBasicBlock::iterator FoldPt = Barrier;
-
- // Advance from barrier to call frame teardown.
- while (FoldPt != MBB->getFirstTerminator() &&
- FoldPt->getOpcode() != TRI->getCallFrameDestroyOpcode()) {
- if (RefsInMBB.count(FoldPt))
- return 0;
-
- ++FoldPt;
- }
-
- if (FoldPt == MBB->getFirstTerminator())
- return 0;
- else
- ++FoldPt;
-
- // Now find the restore point.
- while (FoldPt != MBB->getFirstTerminator() && !RefsInMBB.count(FoldPt)) {
- if (FoldPt->getOpcode() == TRI->getCallFrameSetupOpcode()) {
- while (FoldPt != MBB->getFirstTerminator() &&
- FoldPt->getOpcode() != TRI->getCallFrameDestroyOpcode()) {
- if (RefsInMBB.count(FoldPt))
- return 0;
-
- ++FoldPt;
- }
-
- if (FoldPt == MBB->getFirstTerminator())
- return 0;
- }
-
- ++FoldPt;
- }
-
- if (FoldPt == MBB->getFirstTerminator())
- return 0;
-
- int OpIdx = FoldPt->findRegisterUseOperandIdx(vreg, true);
- if (OpIdx == -1)
- return 0;
-
- SmallVector<unsigned, 1> Ops;
- Ops.push_back(OpIdx);
-
- if (!TII->canFoldMemoryOperand(FoldPt, Ops))
- return 0;
-
- MachineInstr* FMI = TII->foldMemoryOperand(FoldPt, Ops, SS);
-
- if (FMI) {
- LIs->ReplaceMachineInstrInMaps(FoldPt, FMI);
- FoldPt->eraseFromParent();
- ++NumRestoreFolds;
- }
-
- return FMI;
-}
-
-/// SplitRegLiveInterval - Split (spill and restore) the given live interval
-/// so it would not cross the barrier that's being processed. Shrink wrap
-/// (minimize) the live interval to the last uses.
-bool PreAllocSplitting::SplitRegLiveInterval(LiveInterval *LI) {
- DEBUG(dbgs() << "Pre-alloc splitting " << LI->reg << " for " << *Barrier
- << " result: ");
-
- CurrLI = LI;
-
- // Find live range where current interval cross the barrier.
- LiveInterval::iterator LR =
- CurrLI->FindLiveRangeContaining(BarrierIdx.getUseIndex());
- VNInfo *ValNo = LR->valno;
-
- assert(!ValNo->isUnused() && "Val# is defined by a dead def?");
-
- MachineInstr *DefMI = LIs->getInstructionFromIndex(ValNo->def);
-
- // If this would create a new join point, do not split.
- if (DefMI && createsNewJoin(LR, DefMI->getParent(), Barrier->getParent())) {
- DEBUG(dbgs() << "FAILED (would create a new join point).\n");
- return false;
- }
-
- // Find all references in the barrier mbb.
- SmallPtrSet<MachineInstr*, 4> RefsInMBB;
- for (MachineRegisterInfo::reg_iterator I = MRI->reg_begin(CurrLI->reg),
- E = MRI->reg_end(); I != E; ++I) {
- MachineInstr *RefMI = &*I;
- if (RefMI->getParent() == BarrierMBB)
- RefsInMBB.insert(RefMI);
- }
-
- // Find a point to restore the value after the barrier.
- MachineBasicBlock::iterator RestorePt =
- findRestorePoint(BarrierMBB, Barrier, LR->end, RefsInMBB);
- if (RestorePt == BarrierMBB->end()) {
- DEBUG(dbgs() << "FAILED (could not find a suitable restore point).\n");
- return false;
- }
-
- if (DefMI && LIs->isReMaterializable(*LI, ValNo, DefMI))
- if (Rematerialize(LI->reg, ValNo, DefMI, RestorePt, RefsInMBB)) {
- DEBUG(dbgs() << "success (remat).\n");
- return true;
- }
-
- // Add a spill either before the barrier or after the definition.
- MachineBasicBlock *DefMBB = DefMI ? DefMI->getParent() : NULL;
- const TargetRegisterClass *RC = MRI->getRegClass(CurrLI->reg);
- SlotIndex SpillIndex;
- MachineInstr *SpillMI = NULL;
- int SS = -1;
- if (!DefMI) {
- // If we don't know where the def is we must split just before the barrier.
- if ((SpillMI = FoldSpill(LI->reg, RC, 0, Barrier,
- BarrierMBB, SS, RefsInMBB))) {
- SpillIndex = LIs->getInstructionIndex(SpillMI);
- } else {
- MachineBasicBlock::iterator SpillPt =
- findSpillPoint(BarrierMBB, Barrier, NULL, RefsInMBB);
- if (SpillPt == BarrierMBB->begin()) {
- DEBUG(dbgs() << "FAILED (could not find a suitable spill point).\n");
- return false; // No gap to insert spill.
- }
- // Add spill.
-
- SS = CreateSpillStackSlot(CurrLI->reg, RC);
- TII->storeRegToStackSlot(*BarrierMBB, SpillPt, CurrLI->reg, true, SS, RC,
- TRI);
- SpillMI = prior(SpillPt);
- SpillIndex = LIs->InsertMachineInstrInMaps(SpillMI);
- }
- } else if (!IsAvailableInStack(DefMBB, CurrLI->reg, ValNo->def,
- LIs->getZeroIndex(), SpillIndex, SS)) {
- // If it's already split, just restore the value. There is no need to spill
- // the def again.
- if (!DefMI) {
- DEBUG(dbgs() << "FAILED (def is dead).\n");
- return false; // Def is dead. Do nothing.
- }
-
- if ((SpillMI = FoldSpill(LI->reg, RC, DefMI, Barrier,
- BarrierMBB, SS, RefsInMBB))) {
- SpillIndex = LIs->getInstructionIndex(SpillMI);
- } else {
- // Check if it's possible to insert a spill after the def MI.
- MachineBasicBlock::iterator SpillPt;
- if (DefMBB == BarrierMBB) {
- // Add spill after the def and the last use before the barrier.
- SpillPt = findSpillPoint(BarrierMBB, Barrier, DefMI,
- RefsInMBB);
- if (SpillPt == DefMBB->begin()) {
- DEBUG(dbgs() << "FAILED (could not find a suitable spill point).\n");
- return false; // No gap to insert spill.
- }
- } else {
- SpillPt = llvm::next(MachineBasicBlock::iterator(DefMI));
- if (SpillPt == DefMBB->end()) {
- DEBUG(dbgs() << "FAILED (could not find a suitable spill point).\n");
- return false; // No gap to insert spill.
- }
- }
- // Add spill.
- SS = CreateSpillStackSlot(CurrLI->reg, RC);
- TII->storeRegToStackSlot(*DefMBB, SpillPt, CurrLI->reg, false, SS, RC,
- TRI);
- SpillMI = prior(SpillPt);
- SpillIndex = LIs->InsertMachineInstrInMaps(SpillMI);
- }
- }
-
- // Remember def instruction index to spill index mapping.
- if (DefMI && SpillMI)
- Def2SpillMap[ValNo->def] = SpillIndex;
-
- // Add restore.
- bool FoldedRestore = false;
- SlotIndex RestoreIndex;
- if (MachineInstr* LMI = FoldRestore(CurrLI->reg, RC, Barrier,
- BarrierMBB, SS, RefsInMBB)) {
- RestorePt = LMI;
- RestoreIndex = LIs->getInstructionIndex(RestorePt);
- FoldedRestore = true;
- } else {
- TII->loadRegFromStackSlot(*BarrierMBB, RestorePt, CurrLI->reg, SS, RC, TRI);
- MachineInstr *LoadMI = prior(RestorePt);
- RestoreIndex = LIs->InsertMachineInstrInMaps(LoadMI);
- }
-
- // Update spill stack slot live interval.
- UpdateSpillSlotInterval(ValNo, SpillIndex.getUseIndex().getNextSlot(),
- RestoreIndex.getDefIndex());
-
- ReconstructLiveInterval(CurrLI);
-
- if (!FoldedRestore) {
- SlotIndex RestoreIdx = LIs->getInstructionIndex(prior(RestorePt));
- RestoreIdx = RestoreIdx.getDefIndex();
- RenumberValno(CurrLI->findDefinedVNInfoForRegInt(RestoreIdx));
- }
-
- ++NumSplits;
- DEBUG(dbgs() << "success.\n");
- return true;
-}
-
-/// SplitRegLiveIntervals - Split all register live intervals that cross the
-/// barrier that's being processed.
-bool
-PreAllocSplitting::SplitRegLiveIntervals(const TargetRegisterClass **RCs,
- SmallPtrSet<LiveInterval*, 8>& Split) {
- // First find all the virtual registers whose live intervals are intercepted
- // by the current barrier.
- SmallVector<LiveInterval*, 8> Intervals;
- for (const TargetRegisterClass **RC = RCs; *RC; ++RC) {
- // FIXME: If it's not safe to move any instruction that defines the barrier
- // register class, then it means there are some special dependencies which
- // codegen is not modelling. Ignore these barriers for now.
- if (!TII->isSafeToMoveRegClassDefs(*RC))
- continue;
- const std::vector<unsigned> &VRs = MRI->getRegClassVirtRegs(*RC);
- for (unsigned i = 0, e = VRs.size(); i != e; ++i) {
- unsigned Reg = VRs[i];
- if (!LIs->hasInterval(Reg))
- continue;
- LiveInterval *LI = &LIs->getInterval(Reg);
- if (LI->liveAt(BarrierIdx) && !Barrier->readsRegister(Reg))
- // Virtual register live interval is intercepted by the barrier. We
- // should split and shrink wrap its interval if possible.
- Intervals.push_back(LI);
- }
- }
-
- // Process the affected live intervals.
- bool Change = false;
- while (!Intervals.empty()) {
- if (PreSplitLimit != -1 && (int)NumSplits == PreSplitLimit)
- break;
- LiveInterval *LI = Intervals.back();
- Intervals.pop_back();
- bool result = SplitRegLiveInterval(LI);
- if (result) Split.insert(LI);
- Change |= result;
- }
-
- return Change;
-}
-
-unsigned PreAllocSplitting::getNumberOfNonSpills(
- SmallPtrSet<MachineInstr*, 4>& MIs,
- unsigned Reg, int FrameIndex,
- bool& FeedsTwoAddr) {
- unsigned NonSpills = 0;
- for (SmallPtrSet<MachineInstr*, 4>::iterator UI = MIs.begin(), UE = MIs.end();
- UI != UE; ++UI) {
- int StoreFrameIndex;
- unsigned StoreVReg = TII->isStoreToStackSlot(*UI, StoreFrameIndex);
- if (StoreVReg != Reg || StoreFrameIndex != FrameIndex)
- ++NonSpills;
-
- int DefIdx = (*UI)->findRegisterDefOperandIdx(Reg);
- if (DefIdx != -1 && (*UI)->isRegTiedToUseOperand(DefIdx))
- FeedsTwoAddr = true;
- }
-
- return NonSpills;
-}
-
-/// removeDeadSpills - After doing splitting, filter through all intervals we've
-/// split, and see if any of the spills are unnecessary. If so, remove them.
-bool PreAllocSplitting::removeDeadSpills(SmallPtrSet<LiveInterval*, 8>& split) {
- bool changed = false;
-
- // Walk over all of the live intervals that were touched by the splitter,
- // and see if we can do any DCE and/or folding.
- for (SmallPtrSet<LiveInterval*, 8>::iterator LI = split.begin(),
- LE = split.end(); LI != LE; ++LI) {
- DenseMap<VNInfo*, SmallPtrSet<MachineInstr*, 4> > VNUseCount;
-
- // First, collect all the uses of the vreg, and sort them by their
- // reaching definition (VNInfo).
- for (MachineRegisterInfo::use_iterator UI = MRI->use_begin((*LI)->reg),
- UE = MRI->use_end(); UI != UE; ++UI) {
- SlotIndex index = LIs->getInstructionIndex(&*UI);
- index = index.getUseIndex();
-
- const LiveRange* LR = (*LI)->getLiveRangeContaining(index);
- VNUseCount[LR->valno].insert(&*UI);
- }
-
- // Now, take the definitions (VNInfo's) one at a time and try to DCE
- // and/or fold them away.
- for (LiveInterval::vni_iterator VI = (*LI)->vni_begin(),
- VE = (*LI)->vni_end(); VI != VE; ++VI) {
-
- if (DeadSplitLimit != -1 && (int)NumDeadSpills == DeadSplitLimit)
- return changed;
-
- VNInfo* CurrVN = *VI;
-
- // We don't currently try to handle definitions with PHI kills, because
- // it would involve processing more than one VNInfo at once.
- if (CurrVN->hasPHIKill()) continue;
-
- // We also don't try to handle the results of PHI joins, since there's
- // no defining instruction to analyze.
- MachineInstr* DefMI = LIs->getInstructionFromIndex(CurrVN->def);
- if (!DefMI || CurrVN->isUnused()) continue;
-
- // We're only interested in eliminating cruft introduced by the splitter,
- // is of the form load-use or load-use-store. First, check that the
- // definition is a load, and remember what stack slot we loaded it from.
- int FrameIndex;
- if (!TII->isLoadFromStackSlot(DefMI, FrameIndex)) continue;
-
- // If the definition has no uses at all, just DCE it.
- if (VNUseCount[CurrVN].size() == 0) {
- LIs->RemoveMachineInstrFromMaps(DefMI);
- (*LI)->removeValNo(CurrVN);
- DefMI->eraseFromParent();
- VNUseCount.erase(CurrVN);
- ++NumDeadSpills;
- changed = true;
- continue;
- }
-
- // Second, get the number of non-store uses of the definition, as well as
- // a flag indicating whether it feeds into a later two-address definition.
- bool FeedsTwoAddr = false;
- unsigned NonSpillCount = getNumberOfNonSpills(VNUseCount[CurrVN],
- (*LI)->reg, FrameIndex,
- FeedsTwoAddr);
-
- // If there's one non-store use and it doesn't feed a two-addr, then
- // this is a load-use-store case that we can try to fold.
- if (NonSpillCount == 1 && !FeedsTwoAddr) {
- // Start by finding the non-store use MachineInstr.
- SmallPtrSet<MachineInstr*, 4>::iterator UI = VNUseCount[CurrVN].begin();
- int StoreFrameIndex;
- unsigned StoreVReg = TII->isStoreToStackSlot(*UI, StoreFrameIndex);
- while (UI != VNUseCount[CurrVN].end() &&
- (StoreVReg == (*LI)->reg && StoreFrameIndex == FrameIndex)) {
- ++UI;
- if (UI != VNUseCount[CurrVN].end())
- StoreVReg = TII->isStoreToStackSlot(*UI, StoreFrameIndex);
- }
- if (UI == VNUseCount[CurrVN].end()) continue;
-
- MachineInstr* use = *UI;
-
- // Attempt to fold it away!
- int OpIdx = use->findRegisterUseOperandIdx((*LI)->reg, false);
- if (OpIdx == -1) continue;
- SmallVector<unsigned, 1> Ops;
- Ops.push_back(OpIdx);
- if (!TII->canFoldMemoryOperand(use, Ops)) continue;
-
- MachineInstr* NewMI = TII->foldMemoryOperand(use, Ops, FrameIndex);
-
- if (!NewMI) continue;
-
- // Update relevant analyses.
- LIs->RemoveMachineInstrFromMaps(DefMI);
- LIs->ReplaceMachineInstrInMaps(use, NewMI);
- (*LI)->removeValNo(CurrVN);
-
- DefMI->eraseFromParent();
- use->eraseFromParent();
- VNUseCount[CurrVN].erase(use);
-
- // Remove deleted instructions. Note that we need to remove them from
- // the VNInfo->use map as well, just to be safe.
- for (SmallPtrSet<MachineInstr*, 4>::iterator II =
- VNUseCount[CurrVN].begin(), IE = VNUseCount[CurrVN].end();
- II != IE; ++II) {
- for (DenseMap<VNInfo*, SmallPtrSet<MachineInstr*, 4> >::iterator
- VNI = VNUseCount.begin(), VNE = VNUseCount.end(); VNI != VNE;
- ++VNI)
- if (VNI->first != CurrVN)
- VNI->second.erase(*II);
- LIs->RemoveMachineInstrFromMaps(*II);
- (*II)->eraseFromParent();
- }
-
- VNUseCount.erase(CurrVN);
-
- for (DenseMap<VNInfo*, SmallPtrSet<MachineInstr*, 4> >::iterator
- VI = VNUseCount.begin(), VE = VNUseCount.end(); VI != VE; ++VI)
- if (VI->second.erase(use))
- VI->second.insert(NewMI);
-
- ++NumDeadSpills;
- changed = true;
- continue;
- }
-
- // If there's more than one non-store instruction, we can't profitably
- // fold it, so bail.
- if (NonSpillCount) continue;
-
- // Otherwise, this is a load-store case, so DCE them.
- for (SmallPtrSet<MachineInstr*, 4>::iterator UI =
- VNUseCount[CurrVN].begin(), UE = VNUseCount[CurrVN].end();
- UI != UE; ++UI) {
- LIs->RemoveMachineInstrFromMaps(*UI);
- (*UI)->eraseFromParent();
- }
-
- VNUseCount.erase(CurrVN);
-
- LIs->RemoveMachineInstrFromMaps(DefMI);
- (*LI)->removeValNo(CurrVN);
- DefMI->eraseFromParent();
- ++NumDeadSpills;
- changed = true;
- }
- }
-
- return changed;
-}
-
-bool PreAllocSplitting::createsNewJoin(LiveRange* LR,
- MachineBasicBlock* DefMBB,
- MachineBasicBlock* BarrierMBB) {
- if (DefMBB == BarrierMBB)
- return false;
-
- if (LR->valno->hasPHIKill())
- return false;
-
- SlotIndex MBBEnd = LIs->getMBBEndIdx(BarrierMBB);
- if (LR->end < MBBEnd)
- return false;
-
- MachineLoopInfo& MLI = getAnalysis<MachineLoopInfo>();
- if (MLI.getLoopFor(DefMBB) != MLI.getLoopFor(BarrierMBB))
- return true;
-
- MachineDominatorTree& MDT = getAnalysis<MachineDominatorTree>();
- SmallPtrSet<MachineBasicBlock*, 4> Visited;
- typedef std::pair<MachineBasicBlock*,
- MachineBasicBlock::succ_iterator> ItPair;
- SmallVector<ItPair, 4> Stack;
- Stack.push_back(std::make_pair(BarrierMBB, BarrierMBB->succ_begin()));
-
- while (!Stack.empty()) {
- ItPair P = Stack.back();
- Stack.pop_back();
-
- MachineBasicBlock* PredMBB = P.first;
- MachineBasicBlock::succ_iterator S = P.second;
-
- if (S == PredMBB->succ_end())
- continue;
- else if (Visited.count(*S)) {
- Stack.push_back(std::make_pair(PredMBB, ++S));
- continue;
- } else
- Stack.push_back(std::make_pair(PredMBB, S+1));
-
- MachineBasicBlock* MBB = *S;
- Visited.insert(MBB);
-
- if (MBB == BarrierMBB)
- return true;
-
- MachineDomTreeNode* DefMDTN = MDT.getNode(DefMBB);
- MachineDomTreeNode* BarrierMDTN = MDT.getNode(BarrierMBB);
- MachineDomTreeNode* MDTN = MDT.getNode(MBB)->getIDom();
- while (MDTN) {
- if (MDTN == DefMDTN)
- return true;
- else if (MDTN == BarrierMDTN)
- break;
- MDTN = MDTN->getIDom();
- }
-
- MBBEnd = LIs->getMBBEndIdx(MBB);
- if (LR->end > MBBEnd)
- Stack.push_back(std::make_pair(MBB, MBB->succ_begin()));
- }
-
- return false;
-}
-
-
-bool PreAllocSplitting::runOnMachineFunction(MachineFunction &MF) {
- CurrMF = &MF;
- TM = &MF.getTarget();
- TRI = TM->getRegisterInfo();
- TII = TM->getInstrInfo();
- MFI = MF.getFrameInfo();
- MRI = &MF.getRegInfo();
- SIs = &getAnalysis<SlotIndexes>();
- LIs = &getAnalysis<LiveIntervals>();
- LSs = &getAnalysis<LiveStacks>();
- VRM = &getAnalysis<VirtRegMap>();
-
- bool MadeChange = false;
-
- // Make sure blocks are numbered in order.
- MF.RenumberBlocks();
-
- MachineBasicBlock *Entry = MF.begin();
- SmallPtrSet<MachineBasicBlock*,16> Visited;
-
- SmallPtrSet<LiveInterval*, 8> Split;
-
- for (df_ext_iterator<MachineBasicBlock*, SmallPtrSet<MachineBasicBlock*,16> >
- DFI = df_ext_begin(Entry, Visited), E = df_ext_end(Entry, Visited);
- DFI != E; ++DFI) {
- BarrierMBB = *DFI;
- for (MachineBasicBlock::iterator I = BarrierMBB->begin(),
- E = BarrierMBB->end(); I != E; ++I) {
- Barrier = &*I;
- const TargetRegisterClass **BarrierRCs =
- Barrier->getDesc().getRegClassBarriers();
- if (!BarrierRCs)
- continue;
- BarrierIdx = LIs->getInstructionIndex(Barrier);
- MadeChange |= SplitRegLiveIntervals(BarrierRCs, Split);
- }
- }
-
- MadeChange |= removeDeadSpills(Split);
-
- return MadeChange;
-}
diff --git a/contrib/llvm/lib/CodeGen/PrologEpilogInserter.cpp b/contrib/llvm/lib/CodeGen/PrologEpilogInserter.cpp
index f1f3c99..a901c5f 100644
--- a/contrib/llvm/lib/CodeGen/PrologEpilogInserter.cpp
+++ b/contrib/llvm/lib/CodeGen/PrologEpilogInserter.cpp
@@ -145,6 +145,7 @@ void PEI::getAnalysisUsage(AnalysisUsage &AU) const {
/// pseudo instructions.
void PEI::calculateCallsInformation(MachineFunction &Fn) {
const TargetRegisterInfo *RegInfo = Fn.getTarget().getRegisterInfo();
+ const TargetInstrInfo &TII = *Fn.getTarget().getInstrInfo();
const TargetFrameLowering *TFI = Fn.getTarget().getFrameLowering();
MachineFrameInfo *MFI = Fn.getFrameInfo();
@@ -152,8 +153,8 @@ void PEI::calculateCallsInformation(MachineFunction &Fn) {
bool AdjustsStack = MFI->adjustsStack();
// Get the function call frame set-up and tear-down instruction opcode
- int FrameSetupOpcode = RegInfo->getCallFrameSetupOpcode();
- int FrameDestroyOpcode = RegInfo->getCallFrameDestroyOpcode();
+ int FrameSetupOpcode = TII.getCallFrameSetupOpcode();
+ int FrameDestroyOpcode = TII.getCallFrameDestroyOpcode();
// Early exit for targets which have no call frame setup/destroy pseudo
// instructions.
@@ -705,12 +706,13 @@ void PEI::replaceFrameIndices(MachineFunction &Fn) {
const TargetMachine &TM = Fn.getTarget();
assert(TM.getRegisterInfo() && "TM::getRegisterInfo() must be implemented!");
+ const TargetInstrInfo &TII = *Fn.getTarget().getInstrInfo();
const TargetRegisterInfo &TRI = *TM.getRegisterInfo();
const TargetFrameLowering *TFI = TM.getFrameLowering();
bool StackGrowsDown =
TFI->getStackGrowthDirection() == TargetFrameLowering::StackGrowsDown;
- int FrameSetupOpcode = TRI.getCallFrameSetupOpcode();
- int FrameDestroyOpcode = TRI.getCallFrameDestroyOpcode();
+ int FrameSetupOpcode = TII.getCallFrameSetupOpcode();
+ int FrameDestroyOpcode = TII.getCallFrameDestroyOpcode();
for (MachineFunction::iterator BB = Fn.begin(),
E = Fn.end(); BB != E; ++BB) {
diff --git a/contrib/llvm/lib/CodeGen/RegAllocBasic.cpp b/contrib/llvm/lib/CodeGen/RegAllocBasic.cpp
index 1d77b29..5ea26ad 100644
--- a/contrib/llvm/lib/CodeGen/RegAllocBasic.cpp
+++ b/contrib/llvm/lib/CodeGen/RegAllocBasic.cpp
@@ -20,6 +20,7 @@
#include "RenderMachineFunction.h"
#include "Spiller.h"
#include "VirtRegMap.h"
+#include "RegisterCoalescer.h"
#include "llvm/ADT/OwningPtr.h"
#include "llvm/ADT/Statistic.h"
#include "llvm/Analysis/AliasAnalysis.h"
@@ -34,7 +35,6 @@
#include "llvm/CodeGen/MachineRegisterInfo.h"
#include "llvm/CodeGen/Passes.h"
#include "llvm/CodeGen/RegAllocRegistry.h"
-#include "llvm/CodeGen/RegisterCoalescer.h"
#include "llvm/Target/TargetMachine.h"
#include "llvm/Target/TargetOptions.h"
#include "llvm/Target/TargetRegisterInfo.h"
@@ -141,7 +141,7 @@ RABasic::RABasic(): MachineFunctionPass(ID) {
initializeLiveIntervalsPass(*PassRegistry::getPassRegistry());
initializeSlotIndexesPass(*PassRegistry::getPassRegistry());
initializeStrongPHIEliminationPass(*PassRegistry::getPassRegistry());
- initializeRegisterCoalescerAnalysisGroup(*PassRegistry::getPassRegistry());
+ initializeRegisterCoalescerPass(*PassRegistry::getPassRegistry());
initializeCalculateSpillWeightsPass(*PassRegistry::getPassRegistry());
initializeLiveStacksPass(*PassRegistry::getPassRegistry());
initializeMachineDominatorTreePass(*PassRegistry::getPassRegistry());
@@ -324,19 +324,21 @@ void RegAllocBase::allocatePhysRegs() {
if (AvailablePhysReg == ~0u) {
// selectOrSplit failed to find a register!
- std::string msg;
- raw_string_ostream Msg(msg);
- Msg << "Ran out of registers during register allocation!"
- "\nCannot allocate: " << *VirtReg;
+ const char *Msg = "ran out of registers during register allocation";
+ // Probably caused by an inline asm.
+ MachineInstr *MI;
for (MachineRegisterInfo::reg_iterator I = MRI->reg_begin(VirtReg->reg);
- MachineInstr *MI = I.skipInstruction();) {
- if (!MI->isInlineAsm())
- continue;
- Msg << "\nPlease check your inline asm statement for "
- "invalid constraints:\n";
- MI->print(Msg, &VRM->getMachineFunction().getTarget());
- }
- report_fatal_error(Msg.str());
+ (MI = I.skipInstruction());)
+ if (MI->isInlineAsm())
+ break;
+ if (MI)
+ MI->emitError(Msg);
+ else
+ report_fatal_error(Msg);
+ // Keep going after reporting the error.
+ VRM->assignVirt2Phys(VirtReg->reg,
+ RegClassInfo.getOrder(MRI->getRegClass(VirtReg->reg)).front());
+ continue;
}
if (AvailablePhysReg)
diff --git a/contrib/llvm/lib/CodeGen/RegAllocFast.cpp b/contrib/llvm/lib/CodeGen/RegAllocFast.cpp
index 9765203..b36a445 100644
--- a/contrib/llvm/lib/CodeGen/RegAllocFast.cpp
+++ b/contrib/llvm/lib/CodeGen/RegAllocFast.cpp
@@ -86,7 +86,7 @@ namespace {
// that is currently available in a physical register.
LiveRegMap LiveVirtRegs;
- DenseMap<unsigned, MachineInstr *> LiveDbgValueMap;
+ DenseMap<unsigned, SmallVector<MachineInstr *, 4> > LiveDbgValueMap;
// RegState - Track the state of a physical register.
enum RegState {
@@ -118,7 +118,7 @@ namespace {
// SkippedInstrs - Descriptors of instructions whose clobber list was
// ignored because all registers were spilled. It is still necessary to
// mark all the clobbered registers as used by the function.
- SmallPtrSet<const TargetInstrDesc*, 4> SkippedInstrs;
+ SmallPtrSet<const MCInstrDesc*, 4> SkippedInstrs;
// isBulkSpilling - This flag is set when LiveRegMap will be cleared
// completely after spilling all live registers. LiveRegMap entries should
@@ -272,7 +272,9 @@ void RAFast::spillVirtReg(MachineBasicBlock::iterator MI,
// If this register is used by DBG_VALUE then insert new DBG_VALUE to
// identify spilled location as the place to find corresponding variable's
// value.
- if (MachineInstr *DBG = LiveDbgValueMap.lookup(LRI->first)) {
+ SmallVector<MachineInstr *, 4> &LRIDbgValues = LiveDbgValueMap[LRI->first];
+ for (unsigned li = 0, le = LRIDbgValues.size(); li != le; ++li) {
+ MachineInstr *DBG = LRIDbgValues[li];
const MDNode *MDPtr =
DBG->getOperand(DBG->getNumOperands()-1).getMetadata();
int64_t Offset = 0;
@@ -291,9 +293,11 @@ void RAFast::spillVirtReg(MachineBasicBlock::iterator MI,
MachineBasicBlock *MBB = DBG->getParent();
MBB->insert(MI, NewDV);
DEBUG(dbgs() << "Inserting debug info due to spill:" << "\n" << *NewDV);
- LiveDbgValueMap[LRI->first] = NewDV;
}
}
+ // Now this register is spilled there is should not be any DBG_VALUE pointing
+ // to this register because they are all pointing to spilled value now.
+ LRIDbgValues.clear();
if (SpillKill)
LR.LastUse = 0; // Don't kill register again
}
@@ -419,7 +423,7 @@ void RAFast::definePhysReg(MachineInstr *MI, unsigned PhysReg,
// Returns spillImpossible when PhysReg or an alias can't be spilled.
unsigned RAFast::calcSpillCost(unsigned PhysReg) const {
if (UsedInInstr.test(PhysReg)) {
- DEBUG(dbgs() << "PhysReg: " << PhysReg << " is already used in instr.\n");
+ DEBUG(dbgs() << PrintReg(PhysReg, TRI) << " is already used in instr.\n");
return spillImpossible;
}
switch (unsigned VirtReg = PhysRegState[PhysReg]) {
@@ -428,15 +432,15 @@ unsigned RAFast::calcSpillCost(unsigned PhysReg) const {
case regFree:
return 0;
case regReserved:
- DEBUG(dbgs() << "VirtReg: " << VirtReg << " corresponding to PhysReg: "
- << PhysReg << " is reserved already.\n");
+ DEBUG(dbgs() << PrintReg(VirtReg, TRI) << " corresponding "
+ << PrintReg(PhysReg, TRI) << " is reserved already.\n");
return spillImpossible;
default:
return LiveVirtRegs.lookup(VirtReg).Dirty ? spillDirty : spillClean;
}
// This is a disabled register, add up cost of aliases.
- DEBUG(dbgs() << "\tRegister: " << PhysReg << " is disabled.\n");
+ DEBUG(dbgs() << PrintReg(PhysReg, TRI) << " is disabled.\n");
unsigned Cost = 0;
for (const unsigned *AS = TRI->getAliasSet(PhysReg);
unsigned Alias = *AS; ++AS) {
@@ -487,14 +491,12 @@ void RAFast::allocVirtReg(MachineInstr *MI, LiveRegEntry &LRE, unsigned Hint) {
// Take hint when possible.
if (Hint) {
- switch(calcSpillCost(Hint)) {
- default:
- definePhysReg(MI, Hint, regFree);
- // Fall through.
- case 0:
+ // Ignore the hint if we would have to spill a dirty register.
+ unsigned Cost = calcSpillCost(Hint);
+ if (Cost < spillDirty) {
+ if (Cost)
+ definePhysReg(MI, Hint, regFree);
return assignVirtToPhysReg(LRE, Hint);
- case spillImpossible:
- break;
}
}
@@ -513,7 +515,7 @@ void RAFast::allocVirtReg(MachineInstr *MI, LiveRegEntry &LRE, unsigned Hint) {
unsigned BestReg = 0, BestCost = spillImpossible;
for (ArrayRef<unsigned>::iterator I = AO.begin(), E = AO.end(); I != E; ++I) {
unsigned Cost = calcSpillCost(*I);
- DEBUG(dbgs() << "\tRegister: " << *I << "\n");
+ DEBUG(dbgs() << "\tRegister: " << PrintReg(*I, TRI) << "\n");
DEBUG(dbgs() << "\tCost: " << Cost << "\n");
DEBUG(dbgs() << "\tBestCost: " << BestCost << "\n");
// Cost is 0 when all aliases are already disabled.
@@ -528,16 +530,10 @@ void RAFast::allocVirtReg(MachineInstr *MI, LiveRegEntry &LRE, unsigned Hint) {
return assignVirtToPhysReg(LRE, BestReg);
}
- // Nothing we can do.
- std::string msg;
- raw_string_ostream Msg(msg);
- Msg << "Ran out of registers during register allocation!";
- if (MI->isInlineAsm()) {
- Msg << "\nPlease check your inline asm statement for "
- << "invalid constraints:\n";
- MI->print(Msg, TM);
- }
- report_fatal_error(Msg.str());
+ // Nothing we can do. Report an error and keep going with a bad allocation.
+ MI->emitError("ran out of registers during register allocation");
+ definePhysReg(MI, *AO.begin(), regFree);
+ assignVirtToPhysReg(LRE, *AO.begin());
}
/// defineVirtReg - Allocate a register for VirtReg and mark it as dirty.
@@ -724,7 +720,8 @@ void RAFast::handleThroughOperands(MachineInstr *MI,
if (!MO.isReg() || (MO.isDef() && !MO.isEarlyClobber())) continue;
unsigned Reg = MO.getReg();
if (!Reg || !TargetRegisterInfo::isPhysicalRegister(Reg)) continue;
- DEBUG(dbgs() << "\tSetting reg " << Reg << " as used in instr\n");
+ DEBUG(dbgs() << "\tSetting " << PrintReg(Reg, TRI)
+ << " as used in instr\n");
UsedInInstr.set(Reg);
}
@@ -774,7 +771,7 @@ void RAFast::AllocateBasicBlock() {
// Otherwise, sequentially allocate each instruction in the MBB.
while (MII != MBB->end()) {
MachineInstr *MI = MII++;
- const TargetInstrDesc &TID = MI->getDesc();
+ const MCInstrDesc &MCID = MI->getDesc();
DEBUG({
dbgs() << "\n>> " << *MI << "Regs:";
for (unsigned Reg = 1, E = TRI->getNumRegs(); Reg != E; ++Reg) {
@@ -818,7 +815,7 @@ void RAFast::AllocateBasicBlock() {
if (!MO.isReg()) continue;
unsigned Reg = MO.getReg();
if (!TargetRegisterInfo::isVirtualRegister(Reg)) continue;
- LiveDbgValueMap[Reg] = MI;
+ LiveDbgValueMap[Reg].push_back(MI);
LiveRegMap::iterator LRI = LiveVirtRegs.find(Reg);
if (LRI != LiveVirtRegs.end())
setPhysReg(MI, i, LRI->second.PhysReg);
@@ -887,7 +884,7 @@ void RAFast::AllocateBasicBlock() {
VirtOpEnd = i+1;
if (MO.isUse()) {
hasTiedOps = hasTiedOps ||
- TID.getOperandConstraint(i, TOI::TIED_TO) != -1;
+ MCID.getOperandConstraint(i, MCOI::TIED_TO) != -1;
} else {
if (MO.isEarlyClobber())
hasEarlyClobbers = true;
@@ -917,7 +914,7 @@ void RAFast::AllocateBasicBlock() {
// We didn't detect inline asm tied operands above, so just make this extra
// pass for all inline asm.
if (MI->isInlineAsm() || hasEarlyClobbers || hasPartialRedefs ||
- (hasTiedOps && (hasPhysDefs || TID.getNumDefs() > 1))) {
+ (hasTiedOps && (hasPhysDefs || MCID.getNumDefs() > 1))) {
handleThroughOperands(MI, VirtDead);
// Don't attempt coalescing when we have funny stuff going on.
CopyDst = 0;
@@ -962,7 +959,7 @@ void RAFast::AllocateBasicBlock() {
}
unsigned DefOpEnd = MI->getNumOperands();
- if (TID.isCall()) {
+ if (MCID.isCall()) {
// Spill all virtregs before a call. This serves two purposes: 1. If an
// exception is thrown, the landing pad is going to expect to find
// registers in their spill slots, and 2. we don't have to wade through
@@ -973,7 +970,7 @@ void RAFast::AllocateBasicBlock() {
// The imp-defs are skipped below, but we still need to mark those
// registers as used by the function.
- SkippedInstrs.insert(&TID);
+ SkippedInstrs.insert(&MCID);
}
// Third scan.
@@ -1059,7 +1056,7 @@ bool RAFast::runOnMachineFunction(MachineFunction &Fn) {
MRI->closePhysRegsUsed(*TRI);
// Add the clobber lists for all the instructions we skipped earlier.
- for (SmallPtrSet<const TargetInstrDesc*, 4>::const_iterator
+ for (SmallPtrSet<const MCInstrDesc*, 4>::const_iterator
I = SkippedInstrs.begin(), E = SkippedInstrs.end(); I != E; ++I)
if (const unsigned *Defs = (*I)->getImplicitDefs())
while (*Defs)
diff --git a/contrib/llvm/lib/CodeGen/RegAllocGreedy.cpp b/contrib/llvm/lib/CodeGen/RegAllocGreedy.cpp
index 8d06325..e235e87 100644
--- a/contrib/llvm/lib/CodeGen/RegAllocGreedy.cpp
+++ b/contrib/llvm/lib/CodeGen/RegAllocGreedy.cpp
@@ -22,6 +22,7 @@
#include "SpillPlacement.h"
#include "SplitKit.h"
#include "VirtRegMap.h"
+#include "RegisterCoalescer.h"
#include "llvm/ADT/Statistic.h"
#include "llvm/Analysis/AliasAnalysis.h"
#include "llvm/Function.h"
@@ -33,11 +34,9 @@
#include "llvm/CodeGen/MachineDominators.h"
#include "llvm/CodeGen/MachineFunctionPass.h"
#include "llvm/CodeGen/MachineLoopInfo.h"
-#include "llvm/CodeGen/MachineLoopRanges.h"
#include "llvm/CodeGen/MachineRegisterInfo.h"
#include "llvm/CodeGen/Passes.h"
#include "llvm/CodeGen/RegAllocRegistry.h"
-#include "llvm/CodeGen/RegisterCoalescer.h"
#include "llvm/Target/TargetOptions.h"
#include "llvm/Support/Debug.h"
#include "llvm/Support/ErrorHandling.h"
@@ -68,7 +67,6 @@ class RAGreedy : public MachineFunctionPass,
LiveStacks *LS;
MachineDominatorTree *DomTree;
MachineLoopInfo *Loops;
- MachineLoopRanges *LoopRanges;
EdgeBundles *Bundles;
SpillPlacement *SpillPlacer;
LiveDebugVariables *DebugVars;
@@ -76,6 +74,7 @@ class RAGreedy : public MachineFunctionPass,
// state
std::auto_ptr<Spiller> SpillerInstance;
std::priority_queue<std::pair<unsigned, unsigned> > Queue;
+ unsigned NextCascade;
// Live ranges pass through a number of stages as we try to allocate them.
// Some of the stages may also create new live ranges:
@@ -101,29 +100,49 @@ class RAGreedy : public MachineFunctionPass,
static const char *const StageName[];
- IndexedMap<unsigned char, VirtReg2IndexFunctor> LRStage;
+ // RegInfo - Keep additional information about each live range.
+ struct RegInfo {
+ LiveRangeStage Stage;
+
+ // Cascade - Eviction loop prevention. See canEvictInterference().
+ unsigned Cascade;
+
+ RegInfo() : Stage(RS_New), Cascade(0) {}
+ };
+
+ IndexedMap<RegInfo, VirtReg2IndexFunctor> ExtraRegInfo;
LiveRangeStage getStage(const LiveInterval &VirtReg) const {
- return LiveRangeStage(LRStage[VirtReg.reg]);
+ return ExtraRegInfo[VirtReg.reg].Stage;
+ }
+
+ void setStage(const LiveInterval &VirtReg, LiveRangeStage Stage) {
+ ExtraRegInfo.resize(MRI->getNumVirtRegs());
+ ExtraRegInfo[VirtReg.reg].Stage = Stage;
}
template<typename Iterator>
void setStage(Iterator Begin, Iterator End, LiveRangeStage NewStage) {
- LRStage.resize(MRI->getNumVirtRegs());
+ ExtraRegInfo.resize(MRI->getNumVirtRegs());
for (;Begin != End; ++Begin) {
unsigned Reg = (*Begin)->reg;
- if (LRStage[Reg] == RS_New)
- LRStage[Reg] = NewStage;
+ if (ExtraRegInfo[Reg].Stage == RS_New)
+ ExtraRegInfo[Reg].Stage = NewStage;
}
}
- // Eviction. Sometimes an assigned live range can be evicted without
- // conditions, but other times it must be split after being evicted to avoid
- // infinite loops.
- enum CanEvict {
- CE_Never, ///< Can never evict.
- CE_Always, ///< Can always evict.
- CE_WithSplit ///< Can evict only if range is also split or spilled.
+ /// Cost of evicting interference.
+ struct EvictionCost {
+ unsigned BrokenHints; ///< Total number of broken hints.
+ float MaxWeight; ///< Maximum spill weight evicted.
+
+ EvictionCost(unsigned B = 0) : BrokenHints(B), MaxWeight(0) {}
+
+ bool operator<(const EvictionCost &O) const {
+ if (BrokenHints != O.BrokenHints)
+ return BrokenHints < O.BrokenHints;
+ return MaxWeight < O.MaxWeight;
+ }
};
// splitting state.
@@ -139,11 +158,13 @@ class RAGreedy : public MachineFunctionPass,
/// Global live range splitting candidate info.
struct GlobalSplitCandidate {
unsigned PhysReg;
+ InterferenceCache::Cursor Intf;
BitVector LiveBundles;
SmallVector<unsigned, 8> ActiveBlocks;
- void reset(unsigned Reg) {
+ void reset(InterferenceCache &Cache, unsigned Reg) {
PhysReg = Reg;
+ Intf.setPhysReg(Cache, Reg);
LiveBundles.clear();
ActiveBlocks.clear();
}
@@ -185,13 +206,15 @@ private:
float calcSpillCost();
bool addSplitConstraints(InterferenceCache::Cursor, float&);
void addThroughConstraints(InterferenceCache::Cursor, ArrayRef<unsigned>);
- void growRegion(GlobalSplitCandidate &Cand, InterferenceCache::Cursor);
- float calcGlobalSplitCost(GlobalSplitCandidate&, InterferenceCache::Cursor);
+ void growRegion(GlobalSplitCandidate &Cand);
+ float calcGlobalSplitCost(GlobalSplitCandidate&);
void splitAroundRegion(LiveInterval&, GlobalSplitCandidate&,
SmallVectorImpl<LiveInterval*>&);
void calcGapWeights(unsigned, SmallVectorImpl<float>&);
- CanEvict canEvict(LiveInterval &A, LiveInterval &B);
- bool canEvictInterference(LiveInterval&, unsigned, float&);
+ bool shouldEvict(LiveInterval &A, bool, LiveInterval &B, bool);
+ bool canEvictInterference(LiveInterval&, unsigned, bool, EvictionCost&);
+ void evictInterference(LiveInterval&, unsigned,
+ SmallVectorImpl<LiveInterval*>&);
unsigned tryAssign(LiveInterval&, AllocationOrder&,
SmallVectorImpl<LiveInterval*>&);
@@ -228,18 +251,17 @@ FunctionPass* llvm::createGreedyRegisterAllocator() {
return new RAGreedy();
}
-RAGreedy::RAGreedy(): MachineFunctionPass(ID), LRStage(RS_New) {
+RAGreedy::RAGreedy(): MachineFunctionPass(ID) {
initializeLiveDebugVariablesPass(*PassRegistry::getPassRegistry());
initializeSlotIndexesPass(*PassRegistry::getPassRegistry());
initializeLiveIntervalsPass(*PassRegistry::getPassRegistry());
initializeSlotIndexesPass(*PassRegistry::getPassRegistry());
initializeStrongPHIEliminationPass(*PassRegistry::getPassRegistry());
- initializeRegisterCoalescerAnalysisGroup(*PassRegistry::getPassRegistry());
+ initializeRegisterCoalescerPass(*PassRegistry::getPassRegistry());
initializeCalculateSpillWeightsPass(*PassRegistry::getPassRegistry());
initializeLiveStacksPass(*PassRegistry::getPassRegistry());
initializeMachineDominatorTreePass(*PassRegistry::getPassRegistry());
initializeMachineLoopInfoPass(*PassRegistry::getPassRegistry());
- initializeMachineLoopRangesPass(*PassRegistry::getPassRegistry());
initializeVirtRegMapPass(*PassRegistry::getPassRegistry());
initializeEdgeBundlesPass(*PassRegistry::getPassRegistry());
initializeSpillPlacementPass(*PassRegistry::getPassRegistry());
@@ -264,8 +286,6 @@ void RAGreedy::getAnalysisUsage(AnalysisUsage &AU) const {
AU.addPreserved<MachineDominatorTree>();
AU.addRequired<MachineLoopInfo>();
AU.addPreserved<MachineLoopInfo>();
- AU.addRequired<MachineLoopRanges>();
- AU.addPreserved<MachineLoopRanges>();
AU.addRequired<VirtRegMap>();
AU.addPreserved<VirtRegMap>();
AU.addRequired<EdgeBundles>();
@@ -308,13 +328,13 @@ void RAGreedy::LRE_DidCloneVirtReg(unsigned New, unsigned Old) {
// LRE may clone a virtual register because dead code elimination causes it to
// be split into connected components. Ensure that the new register gets the
// same stage as the parent.
- LRStage.grow(New);
- LRStage[New] = LRStage[Old];
+ ExtraRegInfo.grow(New);
+ ExtraRegInfo[New] = ExtraRegInfo[Old];
}
void RAGreedy::releaseMemory() {
SpillerInstance.reset(0);
- LRStage.clear();
+ ExtraRegInfo.clear();
GlobalCand.clear();
RegAllocBase::releaseMemory();
}
@@ -328,11 +348,11 @@ void RAGreedy::enqueue(LiveInterval *LI) {
"Can only enqueue virtual registers");
unsigned Prio;
- LRStage.grow(Reg);
- if (LRStage[Reg] == RS_New)
- LRStage[Reg] = RS_First;
+ ExtraRegInfo.grow(Reg);
+ if (ExtraRegInfo[Reg].Stage == RS_New)
+ ExtraRegInfo[Reg].Stage = RS_First;
- if (LRStage[Reg] == RS_Second)
+ if (ExtraRegInfo[Reg].Stage == RS_Second)
// Unsplit ranges that couldn't be allocated immediately are deferred until
// everything else has been allocated. Long ranges are allocated last so
// they are split against realistic interference.
@@ -375,7 +395,21 @@ unsigned RAGreedy::tryAssign(LiveInterval &VirtReg,
if (!PhysReg || Order.isHint(PhysReg))
return PhysReg;
- // PhysReg is available. Try to evict interference from a cheaper alternative.
+ // PhysReg is available, but there may be a better choice.
+
+ // If we missed a simple hint, try to cheaply evict interference from the
+ // preferred register.
+ if (unsigned Hint = MRI->getSimpleHint(VirtReg.reg))
+ if (Order.isHint(Hint)) {
+ DEBUG(dbgs() << "missed hint " << PrintReg(Hint, TRI) << '\n');
+ EvictionCost MaxCost(1);
+ if (canEvictInterference(VirtReg, Hint, true, MaxCost)) {
+ evictInterference(VirtReg, Hint, NewVRegs);
+ return Hint;
+ }
+ }
+
+ // Try to evict interference from a cheaper alternative.
unsigned Cost = TRI->getCostPerUse(PhysReg);
// Most registers have 0 additional cost.
@@ -393,31 +427,58 @@ unsigned RAGreedy::tryAssign(LiveInterval &VirtReg,
// Interference eviction
//===----------------------------------------------------------------------===//
-/// canEvict - determine if A can evict the assigned live range B. The eviction
-/// policy defined by this function together with the allocation order defined
-/// by enqueue() decides which registers ultimately end up being split and
-/// spilled.
+/// shouldEvict - determine if A should evict the assigned live range B. The
+/// eviction policy defined by this function together with the allocation order
+/// defined by enqueue() decides which registers ultimately end up being split
+/// and spilled.
+///
+/// Cascade numbers are used to prevent infinite loops if this function is a
+/// cyclic relation.
///
-/// This function must define a non-circular relation when it returns CE_Always,
-/// otherwise infinite eviction loops are possible. When evicting a <= RS_Second
-/// range, it is possible to return CE_WithSplit which forces the evicted
-/// register to be split or spilled before it can evict anything again. That
-/// guarantees progress.
-RAGreedy::CanEvict RAGreedy::canEvict(LiveInterval &A, LiveInterval &B) {
- return A.weight > B.weight ? CE_Always : CE_Never;
+/// @param A The live range to be assigned.
+/// @param IsHint True when A is about to be assigned to its preferred
+/// register.
+/// @param B The live range to be evicted.
+/// @param BreaksHint True when B is already assigned to its preferred register.
+bool RAGreedy::shouldEvict(LiveInterval &A, bool IsHint,
+ LiveInterval &B, bool BreaksHint) {
+ bool CanSplit = getStage(B) <= RS_Second;
+
+ // Be fairly aggressive about following hints as long as the evictee can be
+ // split.
+ if (CanSplit && IsHint && !BreaksHint)
+ return true;
+
+ return A.weight > B.weight;
}
-/// canEvict - Return true if all interferences between VirtReg and PhysReg can
-/// be evicted.
-/// Return false if any interference is heavier than MaxWeight.
-/// On return, set MaxWeight to the maximal spill weight of an interference.
+/// canEvictInterference - Return true if all interferences between VirtReg and
+/// PhysReg can be evicted. When OnlyCheap is set, don't do anything
+///
+/// @param VirtReg Live range that is about to be assigned.
+/// @param PhysReg Desired register for assignment.
+/// @prarm IsHint True when PhysReg is VirtReg's preferred register.
+/// @param MaxCost Only look for cheaper candidates and update with new cost
+/// when returning true.
+/// @returns True when interference can be evicted cheaper than MaxCost.
bool RAGreedy::canEvictInterference(LiveInterval &VirtReg, unsigned PhysReg,
- float &MaxWeight) {
- float Weight = 0;
+ bool IsHint, EvictionCost &MaxCost) {
+ // Find VirtReg's cascade number. This will be unassigned if VirtReg was never
+ // involved in an eviction before. If a cascade number was assigned, deny
+ // evicting anything with the same or a newer cascade number. This prevents
+ // infinite eviction loops.
+ //
+ // This works out so a register without a cascade number is allowed to evict
+ // anything, and it can be evicted by anything.
+ unsigned Cascade = ExtraRegInfo[VirtReg.reg].Cascade;
+ if (!Cascade)
+ Cascade = NextCascade;
+
+ EvictionCost Cost;
for (const unsigned *AliasI = TRI->getOverlaps(PhysReg); *AliasI; ++AliasI) {
LiveIntervalUnion::Query &Q = query(VirtReg, *AliasI);
// If there is 10 or more interferences, chances are one is heavier.
- if (Q.collectInterferingVRegs(10, MaxWeight) >= 10)
+ if (Q.collectInterferingVRegs(10) >= 10)
return false;
// Check if any interfering live range is heavier than MaxWeight.
@@ -425,25 +486,69 @@ bool RAGreedy::canEvictInterference(LiveInterval &VirtReg, unsigned PhysReg,
LiveInterval *Intf = Q.interferingVRegs()[i - 1];
if (TargetRegisterInfo::isPhysicalRegister(Intf->reg))
return false;
- if (Intf->weight >= MaxWeight)
- return false;
- switch (canEvict(VirtReg, *Intf)) {
- case CE_Always:
- break;
- case CE_Never:
+ // Never evict spill products. They cannot split or spill.
+ if (getStage(*Intf) == RS_Spill)
return false;
- case CE_WithSplit:
- if (getStage(*Intf) > RS_Second)
+ // Once a live range becomes small enough, it is urgent that we find a
+ // register for it. This is indicated by an infinite spill weight. These
+ // urgent live ranges get to evict almost anything.
+ bool Urgent = !VirtReg.isSpillable() && Intf->isSpillable();
+ // Only evict older cascades or live ranges without a cascade.
+ unsigned IntfCascade = ExtraRegInfo[Intf->reg].Cascade;
+ if (Cascade <= IntfCascade) {
+ if (!Urgent)
return false;
- break;
+ // We permit breaking cascades for urgent evictions. It should be the
+ // last resort, though, so make it really expensive.
+ Cost.BrokenHints += 10;
}
- Weight = std::max(Weight, Intf->weight);
+ // Would this break a satisfied hint?
+ bool BreaksHint = VRM->hasPreferredPhys(Intf->reg);
+ // Update eviction cost.
+ Cost.BrokenHints += BreaksHint;
+ Cost.MaxWeight = std::max(Cost.MaxWeight, Intf->weight);
+ // Abort if this would be too expensive.
+ if (!(Cost < MaxCost))
+ return false;
+ // Finally, apply the eviction policy for non-urgent evictions.
+ if (!Urgent && !shouldEvict(VirtReg, IsHint, *Intf, BreaksHint))
+ return false;
}
}
- MaxWeight = Weight;
+ MaxCost = Cost;
return true;
}
+/// evictInterference - Evict any interferring registers that prevent VirtReg
+/// from being assigned to Physreg. This assumes that canEvictInterference
+/// returned true.
+void RAGreedy::evictInterference(LiveInterval &VirtReg, unsigned PhysReg,
+ SmallVectorImpl<LiveInterval*> &NewVRegs) {
+ // Make sure that VirtReg has a cascade number, and assign that cascade
+ // number to every evicted register. These live ranges than then only be
+ // evicted by a newer cascade, preventing infinite loops.
+ unsigned Cascade = ExtraRegInfo[VirtReg.reg].Cascade;
+ if (!Cascade)
+ Cascade = ExtraRegInfo[VirtReg.reg].Cascade = NextCascade++;
+
+ DEBUG(dbgs() << "evicting " << PrintReg(PhysReg, TRI)
+ << " interference: Cascade " << Cascade << '\n');
+ for (const unsigned *AliasI = TRI->getOverlaps(PhysReg); *AliasI; ++AliasI) {
+ LiveIntervalUnion::Query &Q = query(VirtReg, *AliasI);
+ assert(Q.seenAllInterferences() && "Didn't check all interfererences.");
+ for (unsigned i = 0, e = Q.interferingVRegs().size(); i != e; ++i) {
+ LiveInterval *Intf = Q.interferingVRegs()[i];
+ unassign(*Intf, VRM->getPhys(Intf->reg));
+ assert((ExtraRegInfo[Intf->reg].Cascade < Cascade ||
+ VirtReg.isSpillable() < Intf->isSpillable()) &&
+ "Cannot decrease cascade number, illegal eviction");
+ ExtraRegInfo[Intf->reg].Cascade = Cascade;
+ ++NumEvicted;
+ NewVRegs.push_back(Intf);
+ }
+ }
+}
+
/// tryEvict - Try to evict all interferences for a physreg.
/// @param VirtReg Currently unassigned virtual register.
/// @param Order Physregs to try.
@@ -454,31 +559,37 @@ unsigned RAGreedy::tryEvict(LiveInterval &VirtReg,
unsigned CostPerUseLimit) {
NamedRegionTimer T("Evict", TimerGroupName, TimePassesIsEnabled);
- // Keep track of the lightest single interference seen so far.
- float BestWeight = HUGE_VALF;
+ // Keep track of the cheapest interference seen so far.
+ EvictionCost BestCost(~0u);
unsigned BestPhys = 0;
+ // When we are just looking for a reduced cost per use, don't break any
+ // hints, and only evict smaller spill weights.
+ if (CostPerUseLimit < ~0u) {
+ BestCost.BrokenHints = 0;
+ BestCost.MaxWeight = VirtReg.weight;
+ }
+
Order.rewind();
while (unsigned PhysReg = Order.next()) {
if (TRI->getCostPerUse(PhysReg) >= CostPerUseLimit)
continue;
- // The first use of a register in a function has cost 1.
- if (CostPerUseLimit == 1 && !MRI->isPhysRegUsed(PhysReg))
- continue;
-
- float Weight = BestWeight;
- if (!canEvictInterference(VirtReg, PhysReg, Weight))
- continue;
-
- // This is an eviction candidate.
- DEBUG(dbgs() << PrintReg(PhysReg, TRI) << " interference = "
- << Weight << '\n');
- if (BestPhys && Weight >= BestWeight)
+ // The first use of a callee-saved register in a function has cost 1.
+ // Don't start using a CSR when the CostPerUseLimit is low.
+ if (CostPerUseLimit == 1)
+ if (unsigned CSR = RegClassInfo.getLastCalleeSavedAlias(PhysReg))
+ if (!MRI->isPhysRegUsed(CSR)) {
+ DEBUG(dbgs() << PrintReg(PhysReg, TRI) << " would clobber CSR "
+ << PrintReg(CSR, TRI) << '\n');
+ continue;
+ }
+
+ if (!canEvictInterference(VirtReg, PhysReg, false, BestCost))
continue;
// Best so far.
BestPhys = PhysReg;
- BestWeight = Weight;
+
// Stop if the hint can be used.
if (Order.isHint(PhysReg))
break;
@@ -487,22 +598,7 @@ unsigned RAGreedy::tryEvict(LiveInterval &VirtReg,
if (!BestPhys)
return 0;
- DEBUG(dbgs() << "evicting " << PrintReg(BestPhys, TRI) << " interference\n");
- for (const unsigned *AliasI = TRI->getOverlaps(BestPhys); *AliasI; ++AliasI) {
- LiveIntervalUnion::Query &Q = query(VirtReg, *AliasI);
- assert(Q.seenAllInterferences() && "Didn't check all interfererences.");
- for (unsigned i = 0, e = Q.interferingVRegs().size(); i != e; ++i) {
- LiveInterval *Intf = Q.interferingVRegs()[i];
- unassign(*Intf, VRM->getPhys(Intf->reg));
- ++NumEvicted;
- NewVRegs.push_back(Intf);
- // Prevent looping by forcing the evicted ranges to be split before they
- // can evict anything else.
- if (getStage(*Intf) < RS_Second &&
- canEvict(VirtReg, *Intf) == CE_WithSplit)
- LRStage[Intf->reg] = RS_Second;
- }
- }
+ evictInterference(VirtReg, BestPhys, NewVRegs);
return BestPhys;
}
@@ -621,8 +717,7 @@ void RAGreedy::addThroughConstraints(InterferenceCache::Cursor Intf,
SpillPlacer->addLinks(ArrayRef<unsigned>(TBS, T));
}
-void RAGreedy::growRegion(GlobalSplitCandidate &Cand,
- InterferenceCache::Cursor Intf) {
+void RAGreedy::growRegion(GlobalSplitCandidate &Cand) {
// Keep track of through blocks that have not been added to SpillPlacer.
BitVector Todo = SA->getThroughBlocks();
SmallVectorImpl<unsigned> &ActiveBlocks = Cand.ActiveBlocks;
@@ -633,8 +728,6 @@ void RAGreedy::growRegion(GlobalSplitCandidate &Cand,
for (;;) {
ArrayRef<unsigned> NewBundles = SpillPlacer->getRecentPositive();
- if (NewBundles.empty())
- break;
// Find new through blocks in the periphery of PrefRegBundles.
for (int i = 0, e = NewBundles.size(); i != e; ++i) {
unsigned Bundle = NewBundles[i];
@@ -654,12 +747,12 @@ void RAGreedy::growRegion(GlobalSplitCandidate &Cand,
}
}
// Any new blocks to add?
- if (ActiveBlocks.size() > AddedTo) {
- ArrayRef<unsigned> Add(&ActiveBlocks[AddedTo],
- ActiveBlocks.size() - AddedTo);
- addThroughConstraints(Intf, Add);
- AddedTo = ActiveBlocks.size();
- }
+ if (ActiveBlocks.size() == AddedTo)
+ break;
+ addThroughConstraints(Cand.Intf,
+ ArrayRef<unsigned>(ActiveBlocks).slice(AddedTo));
+ AddedTo = ActiveBlocks.size();
+
// Perhaps iterating can enable more bundles?
SpillPlacer->iterate();
}
@@ -697,8 +790,7 @@ float RAGreedy::calcSpillCost() {
/// pattern in LiveBundles. This cost should be added to the local cost of the
/// interference pattern in SplitConstraints.
///
-float RAGreedy::calcGlobalSplitCost(GlobalSplitCandidate &Cand,
- InterferenceCache::Cursor Intf) {
+float RAGreedy::calcGlobalSplitCost(GlobalSplitCandidate &Cand) {
float GlobalCost = 0;
const BitVector &LiveBundles = Cand.LiveBundles;
ArrayRef<SplitAnalysis::BlockInfo> UseBlocks = SA->getUseBlocks();
@@ -725,8 +817,8 @@ float RAGreedy::calcGlobalSplitCost(GlobalSplitCandidate &Cand,
continue;
if (RegIn && RegOut) {
// We need double spill code if this block has interference.
- Intf.moveToBlock(Number);
- if (Intf.hasInterference())
+ Cand.Intf.moveToBlock(Number);
+ if (Cand.Intf.hasInterference())
GlobalCost += 2*SpillPlacer->getBlockFrequency(Number);
continue;
}
@@ -756,188 +848,42 @@ void RAGreedy::splitAroundRegion(LiveInterval &VirtReg,
dbgs() << ".\n";
});
- InterferenceCache::Cursor Intf(IntfCache, Cand.PhysReg);
+ InterferenceCache::Cursor &Intf = Cand.Intf;
LiveRangeEdit LREdit(VirtReg, NewVRegs, this);
SE->reset(LREdit);
// Create the main cross-block interval.
const unsigned MainIntv = SE->openIntv();
- // First add all defs that are live out of a block.
+ // First handle all the blocks with uses.
ArrayRef<SplitAnalysis::BlockInfo> UseBlocks = SA->getUseBlocks();
for (unsigned i = 0; i != UseBlocks.size(); ++i) {
const SplitAnalysis::BlockInfo &BI = UseBlocks[i];
- bool RegIn = LiveBundles[Bundles->getBundle(BI.MBB->getNumber(), 0)];
- bool RegOut = LiveBundles[Bundles->getBundle(BI.MBB->getNumber(), 1)];
+ bool RegIn = BI.LiveIn &&
+ LiveBundles[Bundles->getBundle(BI.MBB->getNumber(), 0)];
+ bool RegOut = BI.LiveOut &&
+ LiveBundles[Bundles->getBundle(BI.MBB->getNumber(), 1)];
// Create separate intervals for isolated blocks with multiple uses.
- if (!RegIn && !RegOut && BI.FirstUse != BI.LastUse) {
+ if (!RegIn && !RegOut) {
DEBUG(dbgs() << "BB#" << BI.MBB->getNumber() << " isolated.\n");
- SE->splitSingleBlock(BI);
- SE->selectIntv(MainIntv);
- continue;
- }
-
- // Should the register be live out?
- if (!BI.LiveOut || !RegOut)
- continue;
-
- SlotIndex Start, Stop;
- tie(Start, Stop) = Indexes->getMBBRange(BI.MBB);
- Intf.moveToBlock(BI.MBB->getNumber());
- DEBUG(dbgs() << "BB#" << BI.MBB->getNumber() << " -> EB#"
- << Bundles->getBundle(BI.MBB->getNumber(), 1)
- << " [" << Start << ';'
- << SA->getLastSplitPoint(BI.MBB->getNumber()) << '-' << Stop
- << ") intf [" << Intf.first() << ';' << Intf.last() << ')');
-
- // The interference interval should either be invalid or overlap MBB.
- assert((!Intf.hasInterference() || Intf.first() < Stop)
- && "Bad interference");
- assert((!Intf.hasInterference() || Intf.last() > Start)
- && "Bad interference");
-
- // Check interference leaving the block.
- if (!Intf.hasInterference()) {
- // Block is interference-free.
- DEBUG(dbgs() << ", no interference");
- if (!BI.LiveThrough) {
- DEBUG(dbgs() << ", not live-through.\n");
- SE->useIntv(SE->enterIntvBefore(BI.FirstUse), Stop);
- continue;
+ if (!BI.isOneInstr()) {
+ SE->splitSingleBlock(BI);
+ SE->selectIntv(MainIntv);
}
- if (!RegIn) {
- // Block is live-through, but entry bundle is on the stack.
- // Reload just before the first use.
- DEBUG(dbgs() << ", not live-in, enter before first use.\n");
- SE->useIntv(SE->enterIntvBefore(BI.FirstUse), Stop);
- continue;
- }
- DEBUG(dbgs() << ", live-through.\n");
continue;
}
- // Block has interference.
- DEBUG(dbgs() << ", interference to " << Intf.last());
-
- if (!BI.LiveThrough && Intf.last() <= BI.FirstUse) {
- // The interference doesn't reach the outgoing segment.
- DEBUG(dbgs() << " doesn't affect def from " << BI.FirstUse << '\n');
- SE->useIntv(BI.FirstUse, Stop);
- continue;
- }
-
- SlotIndex LastSplitPoint = SA->getLastSplitPoint(BI.MBB->getNumber());
- if (Intf.last().getBoundaryIndex() < BI.LastUse) {
- // There are interference-free uses at the end of the block.
- // Find the first use that can get the live-out register.
- SmallVectorImpl<SlotIndex>::const_iterator UI =
- std::lower_bound(SA->UseSlots.begin(), SA->UseSlots.end(),
- Intf.last().getBoundaryIndex());
- assert(UI != SA->UseSlots.end() && "Couldn't find last use");
- SlotIndex Use = *UI;
- assert(Use <= BI.LastUse && "Couldn't find last use");
- // Only attempt a split befroe the last split point.
- if (Use.getBaseIndex() <= LastSplitPoint) {
- DEBUG(dbgs() << ", free use at " << Use << ".\n");
- SlotIndex SegStart = SE->enterIntvBefore(Use);
- assert(SegStart >= Intf.last() && "Couldn't avoid interference");
- assert(SegStart < LastSplitPoint && "Impossible split point");
- SE->useIntv(SegStart, Stop);
- continue;
- }
- }
-
- // Interference is after the last use.
- DEBUG(dbgs() << " after last use.\n");
- SlotIndex SegStart = SE->enterIntvAtEnd(*BI.MBB);
- assert(SegStart >= Intf.last() && "Couldn't avoid interference");
- }
-
- // Now all defs leading to live bundles are handled, do everything else.
- for (unsigned i = 0; i != UseBlocks.size(); ++i) {
- const SplitAnalysis::BlockInfo &BI = UseBlocks[i];
- bool RegIn = LiveBundles[Bundles->getBundle(BI.MBB->getNumber(), 0)];
- bool RegOut = LiveBundles[Bundles->getBundle(BI.MBB->getNumber(), 1)];
-
- // Is the register live-in?
- if (!BI.LiveIn || !RegIn)
- continue;
-
- // We have an incoming register. Check for interference.
- SlotIndex Start, Stop;
- tie(Start, Stop) = Indexes->getMBBRange(BI.MBB);
Intf.moveToBlock(BI.MBB->getNumber());
- DEBUG(dbgs() << "EB#" << Bundles->getBundle(BI.MBB->getNumber(), 0)
- << " -> BB#" << BI.MBB->getNumber() << " [" << Start << ';'
- << SA->getLastSplitPoint(BI.MBB->getNumber()) << '-' << Stop
- << ')');
- // Check interference entering the block.
- if (!Intf.hasInterference()) {
- // Block is interference-free.
- DEBUG(dbgs() << ", no interference");
- if (!BI.LiveThrough) {
- DEBUG(dbgs() << ", killed in block.\n");
- SE->useIntv(Start, SE->leaveIntvAfter(BI.LastUse));
- continue;
- }
- if (!RegOut) {
- SlotIndex LastSplitPoint = SA->getLastSplitPoint(BI.MBB->getNumber());
- // Block is live-through, but exit bundle is on the stack.
- // Spill immediately after the last use.
- if (BI.LastUse < LastSplitPoint) {
- DEBUG(dbgs() << ", uses, stack-out.\n");
- SE->useIntv(Start, SE->leaveIntvAfter(BI.LastUse));
- continue;
- }
- // The last use is after the last split point, it is probably an
- // indirect jump.
- DEBUG(dbgs() << ", uses at " << BI.LastUse << " after split point "
- << LastSplitPoint << ", stack-out.\n");
- SlotIndex SegEnd = SE->leaveIntvBefore(LastSplitPoint);
- SE->useIntv(Start, SegEnd);
- // Run a double interval from the split to the last use.
- // This makes it possible to spill the complement without affecting the
- // indirect branch.
- SE->overlapIntv(SegEnd, BI.LastUse);
- continue;
- }
- // Register is live-through.
- DEBUG(dbgs() << ", uses, live-through.\n");
- SE->useIntv(Start, Stop);
- continue;
- }
-
- // Block has interference.
- DEBUG(dbgs() << ", interference from " << Intf.first());
-
- if (!BI.LiveThrough && Intf.first() >= BI.LastUse) {
- // The interference doesn't reach the outgoing segment.
- DEBUG(dbgs() << " doesn't affect kill at " << BI.LastUse << '\n');
- SE->useIntv(Start, BI.LastUse);
- continue;
- }
-
- if (Intf.first().getBaseIndex() > BI.FirstUse) {
- // There are interference-free uses at the beginning of the block.
- // Find the last use that can get the register.
- SmallVectorImpl<SlotIndex>::const_iterator UI =
- std::lower_bound(SA->UseSlots.begin(), SA->UseSlots.end(),
- Intf.first().getBaseIndex());
- assert(UI != SA->UseSlots.begin() && "Couldn't find first use");
- SlotIndex Use = (--UI)->getBoundaryIndex();
- DEBUG(dbgs() << ", free use at " << *UI << ".\n");
- SlotIndex SegEnd = SE->leaveIntvAfter(Use);
- assert(SegEnd <= Intf.first() && "Couldn't avoid interference");
- SE->useIntv(Start, SegEnd);
- continue;
- }
-
- // Interference is before the first use.
- DEBUG(dbgs() << " before first use.\n");
- SlotIndex SegEnd = SE->leaveIntvAtTop(*BI.MBB);
- assert(SegEnd <= Intf.first() && "Couldn't avoid interference");
+ if (RegIn && RegOut)
+ SE->splitLiveThroughBlock(BI.MBB->getNumber(),
+ MainIntv, Intf.first(),
+ MainIntv, Intf.last());
+ else if (RegIn)
+ SE->splitRegInBlock(BI, MainIntv, Intf.first());
+ else
+ SE->splitRegOutBlock(BI, MainIntv, Intf.last());
}
// Handle live-through blocks.
@@ -945,20 +891,11 @@ void RAGreedy::splitAroundRegion(LiveInterval &VirtReg,
unsigned Number = Cand.ActiveBlocks[i];
bool RegIn = LiveBundles[Bundles->getBundle(Number, 0)];
bool RegOut = LiveBundles[Bundles->getBundle(Number, 1)];
- DEBUG(dbgs() << "Live through BB#" << Number << '\n');
- if (RegIn && RegOut) {
- Intf.moveToBlock(Number);
- if (!Intf.hasInterference()) {
- SE->useIntv(Indexes->getMBBStartIdx(Number),
- Indexes->getMBBEndIdx(Number));
- continue;
- }
- }
- MachineBasicBlock *MBB = MF->getBlockNumbered(Number);
- if (RegIn)
- SE->leaveIntvAtTop(*MBB);
- if (RegOut)
- SE->enterIntvAtEnd(*MBB);
+ if (!RegIn && !RegOut)
+ continue;
+ Intf.moveToBlock(Number);
+ SE->splitLiveThroughBlock(Number, RegIn ? MainIntv : 0, Intf.first(),
+ RegOut ? MainIntv : 0, Intf.last());
}
++NumGlobalSplits;
@@ -967,7 +904,7 @@ void RAGreedy::splitAroundRegion(LiveInterval &VirtReg,
SE->finish(&IntvMap);
DebugVars->splitRegister(VirtReg.reg, LREdit.regs());
- LRStage.resize(MRI->getNumVirtRegs());
+ ExtraRegInfo.resize(MRI->getNumVirtRegs());
unsigned OrigBlocks = SA->getNumLiveBlocks();
// Sort out the new intervals created by splitting. We get four kinds:
@@ -976,27 +913,27 @@ void RAGreedy::splitAroundRegion(LiveInterval &VirtReg,
// - Block-local splits are candidates for local splitting.
// - DCE leftovers should go back on the queue.
for (unsigned i = 0, e = LREdit.size(); i != e; ++i) {
- unsigned Reg = LREdit.get(i)->reg;
+ LiveInterval &Reg = *LREdit.get(i);
// Ignore old intervals from DCE.
- if (LRStage[Reg] != RS_New)
+ if (getStage(Reg) != RS_New)
continue;
// Remainder interval. Don't try splitting again, spill if it doesn't
// allocate.
if (IntvMap[i] == 0) {
- LRStage[Reg] = RS_Global;
+ setStage(Reg, RS_Global);
continue;
}
// Main interval. Allow repeated splitting as long as the number of live
// blocks is strictly decreasing.
if (IntvMap[i] == MainIntv) {
- if (SA->countLiveBlocks(LREdit.get(i)) >= OrigBlocks) {
+ if (SA->countLiveBlocks(&Reg) >= OrigBlocks) {
DEBUG(dbgs() << "Main interval covers the same " << OrigBlocks
<< " blocks as original.\n");
// Don't allow repeated splitting as a safe guard against looping.
- LRStage[Reg] = RS_Global;
+ setStage(Reg, RS_Global);
}
continue;
}
@@ -1015,17 +952,34 @@ unsigned RAGreedy::tryRegionSplit(LiveInterval &VirtReg, AllocationOrder &Order,
DEBUG(dbgs() << "Cost of isolating all blocks = " << BestCost << '\n');
const unsigned NoCand = ~0u;
unsigned BestCand = NoCand;
+ unsigned NumCands = 0;
Order.rewind();
- for (unsigned Cand = 0; unsigned PhysReg = Order.next(); ++Cand) {
- if (GlobalCand.size() <= Cand)
- GlobalCand.resize(Cand+1);
- GlobalCand[Cand].reset(PhysReg);
+ while (unsigned PhysReg = Order.next()) {
+ // Discard bad candidates before we run out of interference cache cursors.
+ // This will only affect register classes with a lot of registers (>32).
+ if (NumCands == IntfCache.getMaxCursors()) {
+ unsigned WorstCount = ~0u;
+ unsigned Worst = 0;
+ for (unsigned i = 0; i != NumCands; ++i) {
+ if (i == BestCand)
+ continue;
+ unsigned Count = GlobalCand[i].LiveBundles.count();
+ if (Count < WorstCount)
+ Worst = i, WorstCount = Count;
+ }
+ --NumCands;
+ GlobalCand[Worst] = GlobalCand[NumCands];
+ }
+
+ if (GlobalCand.size() <= NumCands)
+ GlobalCand.resize(NumCands+1);
+ GlobalSplitCandidate &Cand = GlobalCand[NumCands];
+ Cand.reset(IntfCache, PhysReg);
- SpillPlacer->prepare(GlobalCand[Cand].LiveBundles);
+ SpillPlacer->prepare(Cand.LiveBundles);
float Cost;
- InterferenceCache::Cursor Intf(IntfCache, PhysReg);
- if (!addSplitConstraints(Intf, Cost)) {
+ if (!addSplitConstraints(Cand.Intf, Cost)) {
DEBUG(dbgs() << PrintReg(PhysReg, TRI) << "\tno positive bundles\n");
continue;
}
@@ -1040,28 +994,29 @@ unsigned RAGreedy::tryRegionSplit(LiveInterval &VirtReg, AllocationOrder &Order,
});
continue;
}
- growRegion(GlobalCand[Cand], Intf);
+ growRegion(Cand);
SpillPlacer->finish();
// No live bundles, defer to splitSingleBlocks().
- if (!GlobalCand[Cand].LiveBundles.any()) {
+ if (!Cand.LiveBundles.any()) {
DEBUG(dbgs() << " no bundles.\n");
continue;
}
- Cost += calcGlobalSplitCost(GlobalCand[Cand], Intf);
+ Cost += calcGlobalSplitCost(Cand);
DEBUG({
dbgs() << ", total = " << Cost << " with bundles";
- for (int i = GlobalCand[Cand].LiveBundles.find_first(); i>=0;
- i = GlobalCand[Cand].LiveBundles.find_next(i))
+ for (int i = Cand.LiveBundles.find_first(); i>=0;
+ i = Cand.LiveBundles.find_next(i))
dbgs() << " EB#" << i;
dbgs() << ".\n";
});
if (Cost < BestCost) {
- BestCand = Cand;
+ BestCand = NumCands;
BestCost = Hysteresis * Cost; // Prevent rounding effects.
}
+ ++NumCands;
}
if (BestCand == NoCand)
@@ -1302,10 +1257,9 @@ unsigned RAGreedy::tryLocalSplit(LiveInterval &VirtReg, AllocationOrder &Order,
if (NewGaps >= NumGaps) {
DEBUG(dbgs() << "Tagging non-progress ranges: ");
assert(!ProgressRequired && "Didn't make progress when it was required.");
- LRStage.resize(MRI->getNumVirtRegs());
for (unsigned i = 0, e = IntvMap.size(); i != e; ++i)
if (IntvMap[i] == 1) {
- LRStage[LREdit.get(i)->reg] = RS_Local;
+ setStage(*LREdit.get(i), RS_Local);
DEBUG(dbgs() << PrintReg(LREdit.get(i)->reg));
}
DEBUG(dbgs() << '\n');
@@ -1384,7 +1338,8 @@ unsigned RAGreedy::selectOrSplit(LiveInterval &VirtReg,
return PhysReg;
LiveRangeStage Stage = getStage(VirtReg);
- DEBUG(dbgs() << StageName[Stage] << '\n');
+ DEBUG(dbgs() << StageName[Stage]
+ << " Cascade " << ExtraRegInfo[VirtReg.reg].Cascade << '\n');
// Try to evict a less worthy live range, but only for ranges from the primary
// queue. The RS_Second ranges already failed to do this, and they should not
@@ -1399,7 +1354,7 @@ unsigned RAGreedy::selectOrSplit(LiveInterval &VirtReg,
// Wait until the second time, when all smaller ranges have been allocated.
// This gives a better picture of the interference to split around.
if (Stage == RS_First) {
- LRStage[VirtReg.reg] = RS_Second;
+ setStage(VirtReg, RS_Second);
DEBUG(dbgs() << "wait for second round\n");
NewVRegs.push_back(&VirtReg);
return 0;
@@ -1407,7 +1362,7 @@ unsigned RAGreedy::selectOrSplit(LiveInterval &VirtReg,
// If we couldn't allocate a register from spilling, there is probably some
// invalid inline assembly. The base class wil report it.
- if (Stage >= RS_Spill)
+ if (Stage >= RS_Spill || !VirtReg.isSpillable())
return ~0u;
// Try splitting VirtReg or interferences.
@@ -1443,15 +1398,15 @@ bool RAGreedy::runOnMachineFunction(MachineFunction &mf) {
DomTree = &getAnalysis<MachineDominatorTree>();
SpillerInstance.reset(createInlineSpiller(*this, *MF, *VRM));
Loops = &getAnalysis<MachineLoopInfo>();
- LoopRanges = &getAnalysis<MachineLoopRanges>();
Bundles = &getAnalysis<EdgeBundles>();
SpillPlacer = &getAnalysis<SpillPlacement>();
DebugVars = &getAnalysis<LiveDebugVariables>();
SA.reset(new SplitAnalysis(*VRM, *LIS, *Loops));
SE.reset(new SplitEditor(*SA, *LIS, *VRM, *DomTree));
- LRStage.clear();
- LRStage.resize(MRI->getNumVirtRegs());
+ ExtraRegInfo.clear();
+ ExtraRegInfo.resize(MRI->getNumVirtRegs());
+ NextCascade = 1;
IntfCache.init(MF, &PhysReg2LiveUnion[0], Indexes, TRI);
allocatePhysRegs();
diff --git a/contrib/llvm/lib/CodeGen/RegAllocLinearScan.cpp b/contrib/llvm/lib/CodeGen/RegAllocLinearScan.cpp
index 5ef88cb..0dd3c598 100644
--- a/contrib/llvm/lib/CodeGen/RegAllocLinearScan.cpp
+++ b/contrib/llvm/lib/CodeGen/RegAllocLinearScan.cpp
@@ -16,7 +16,9 @@
#include "LiveRangeEdit.h"
#include "VirtRegMap.h"
#include "VirtRegRewriter.h"
+#include "RegisterClassInfo.h"
#include "Spiller.h"
+#include "RegisterCoalescer.h"
#include "llvm/Analysis/AliasAnalysis.h"
#include "llvm/Function.h"
#include "llvm/CodeGen/CalcSpillWeights.h"
@@ -27,7 +29,6 @@
#include "llvm/CodeGen/MachineRegisterInfo.h"
#include "llvm/CodeGen/Passes.h"
#include "llvm/CodeGen/RegAllocRegistry.h"
-#include "llvm/CodeGen/RegisterCoalescer.h"
#include "llvm/Target/TargetRegisterInfo.h"
#include "llvm/Target/TargetMachine.h"
#include "llvm/Target/TargetOptions.h"
@@ -57,11 +58,6 @@ NewHeuristic("new-spilling-heuristic",
cl::init(false), cl::Hidden);
static cl::opt<bool>
-PreSplitIntervals("pre-alloc-split",
- cl::desc("Pre-register allocation live interval splitting"),
- cl::init(false), cl::Hidden);
-
-static cl::opt<bool>
TrivCoalesceEnds("trivial-coalesce-ends",
cl::desc("Attempt trivial coalescing of interval ends"),
cl::init(false), cl::Hidden);
@@ -100,10 +96,9 @@ namespace {
initializeLiveDebugVariablesPass(*PassRegistry::getPassRegistry());
initializeLiveIntervalsPass(*PassRegistry::getPassRegistry());
initializeStrongPHIEliminationPass(*PassRegistry::getPassRegistry());
- initializeRegisterCoalescerAnalysisGroup(
+ initializeRegisterCoalescerPass(
*PassRegistry::getPassRegistry());
initializeCalculateSpillWeightsPass(*PassRegistry::getPassRegistry());
- initializePreAllocSplittingPass(*PassRegistry::getPassRegistry());
initializeLiveStacksPass(*PassRegistry::getPassRegistry());
initializeMachineDominatorTreePass(*PassRegistry::getPassRegistry());
initializeMachineLoopInfoPass(*PassRegistry::getPassRegistry());
@@ -148,6 +143,7 @@ namespace {
BitVector reservedRegs_;
LiveIntervals* li_;
MachineLoopInfo *loopInfo;
+ RegisterClassInfo RegClassInfo;
/// handled_ - Intervals are added to the handled_ set in the order of their
/// start value. This is uses for backtracking.
@@ -215,8 +211,6 @@ namespace {
// to coalescing and which analyses coalescing invalidates.
AU.addRequiredTransitive<RegisterCoalescer>();
AU.addRequired<CalculateSpillWeights>();
- if (PreSplitIntervals)
- AU.addRequiredID(PreAllocSplittingID);
AU.addRequiredID(LiveStacksID);
AU.addPreservedID(LiveStacksID);
AU.addRequired<MachineLoopInfo>();
@@ -366,13 +360,10 @@ namespace {
/// getFirstNonReservedPhysReg - return the first non-reserved physical
/// register in the register class.
unsigned getFirstNonReservedPhysReg(const TargetRegisterClass *RC) {
- TargetRegisterClass::iterator aoe = RC->allocation_order_end(*mf_);
- TargetRegisterClass::iterator i = RC->allocation_order_begin(*mf_);
- while (i != aoe && reservedRegs_.test(*i))
- ++i;
- assert(i != aoe && "All registers reserved?!");
- return *i;
- }
+ ArrayRef<unsigned> O = RegClassInfo.getOrder(RC);
+ assert(!O.empty() && "All registers reserved?!");
+ return O.front();
+ }
void ComputeRelatedRegClasses();
@@ -402,11 +393,10 @@ INITIALIZE_PASS_BEGIN(RALinScan, "linearscan-regalloc",
INITIALIZE_PASS_DEPENDENCY(LiveIntervals)
INITIALIZE_PASS_DEPENDENCY(StrongPHIElimination)
INITIALIZE_PASS_DEPENDENCY(CalculateSpillWeights)
-INITIALIZE_PASS_DEPENDENCY(PreAllocSplitting)
INITIALIZE_PASS_DEPENDENCY(LiveStacks)
INITIALIZE_PASS_DEPENDENCY(MachineLoopInfo)
INITIALIZE_PASS_DEPENDENCY(VirtRegMap)
-INITIALIZE_AG_DEPENDENCY(RegisterCoalescer)
+INITIALIZE_PASS_DEPENDENCY(RegisterCoalescer)
INITIALIZE_AG_DEPENDENCY(AliasAnalysis)
INITIALIZE_PASS_END(RALinScan, "linearscan-regalloc",
"Linear Scan Register Allocator", false, false)
@@ -524,6 +514,7 @@ bool RALinScan::runOnMachineFunction(MachineFunction &fn) {
reservedRegs_ = tri_->getReservedRegs(fn);
li_ = &getAnalysis<LiveIntervals>();
loopInfo = &getAnalysis<MachineLoopInfo>();
+ RegClassInfo.runOnMachineFunction(fn);
// We don't run the coalescer here because we have no reason to
// interact with it. If the coalescer requires interaction, it
@@ -1166,14 +1157,11 @@ void RALinScan::assignRegOrStackSlotAtInterval(LiveInterval* cur) {
bool Found = false;
std::vector<std::pair<unsigned,float> > RegsWeights;
+ ArrayRef<unsigned> Order = RegClassInfo.getOrder(RC);
if (!minReg || SpillWeights[minReg] == HUGE_VALF)
- for (TargetRegisterClass::iterator i = RC->allocation_order_begin(*mf_),
- e = RC->allocation_order_end(*mf_); i != e; ++i) {
- unsigned reg = *i;
+ for (unsigned i = 0; i != Order.size(); ++i) {
+ unsigned reg = Order[i];
float regWeight = SpillWeights[reg];
- // Don't even consider reserved regs.
- if (reservedRegs_.test(reg))
- continue;
// Skip recently allocated registers and reserved registers.
if (minWeight > regWeight && !isRecentlyUsed(reg))
Found = true;
@@ -1182,11 +1170,8 @@ void RALinScan::assignRegOrStackSlotAtInterval(LiveInterval* cur) {
// If we didn't find a register that is spillable, try aliases?
if (!Found) {
- for (TargetRegisterClass::iterator i = RC->allocation_order_begin(*mf_),
- e = RC->allocation_order_end(*mf_); i != e; ++i) {
- unsigned reg = *i;
- if (reservedRegs_.test(reg))
- continue;
+ for (unsigned i = 0; i != Order.size(); ++i) {
+ unsigned reg = Order[i];
// No need to worry about if the alias register size < regsize of RC.
// We are going to spill all registers that alias it anyway.
for (const unsigned* as = tri_->getAliasSet(reg); *as; ++as)
@@ -1446,13 +1431,17 @@ unsigned RALinScan::getFreePhysReg(LiveInterval* cur,
if (TargetRegisterInfo::isVirtualRegister(physReg) && vrm_->hasPhys(physReg))
physReg = vrm_->getPhys(physReg);
- TargetRegisterClass::iterator I, E;
- tie(I, E) = tri_->getAllocationOrder(RC, Hint.first, physReg, *mf_);
- assert(I != E && "No allocatable register in this register class!");
+ ArrayRef<unsigned> Order;
+ if (Hint.first)
+ Order = tri_->getRawAllocationOrder(RC, Hint.first, physReg, *mf_);
+ else
+ Order = RegClassInfo.getOrder(RC);
+
+ assert(!Order.empty() && "No allocatable register in this register class!");
// Scan for the first available register.
- for (; I != E; ++I) {
- unsigned Reg = *I;
+ for (unsigned i = 0; i != Order.size(); ++i) {
+ unsigned Reg = Order[i];
// Ignore "downgraded" registers.
if (SkipDGRegs && DowngradedRegs.count(Reg))
continue;
@@ -1482,8 +1471,8 @@ unsigned RALinScan::getFreePhysReg(LiveInterval* cur,
// inactive count. Alkis found that this reduced register pressure very
// slightly on X86 (in rev 1.94 of this file), though this should probably be
// reevaluated now.
- for (; I != E; ++I) {
- unsigned Reg = *I;
+ for (unsigned i = 0; i != Order.size(); ++i) {
+ unsigned Reg = Order[i];
// Ignore "downgraded" registers.
if (SkipDGRegs && DowngradedRegs.count(Reg))
continue;
diff --git a/contrib/llvm/lib/CodeGen/RegAllocPBQP.cpp b/contrib/llvm/lib/CodeGen/RegAllocPBQP.cpp
index 1e1f1e0..72230d4 100644
--- a/contrib/llvm/lib/CodeGen/RegAllocPBQP.cpp
+++ b/contrib/llvm/lib/CodeGen/RegAllocPBQP.cpp
@@ -35,6 +35,7 @@
#include "Splitter.h"
#include "VirtRegMap.h"
#include "VirtRegRewriter.h"
+#include "RegisterCoalescer.h"
#include "llvm/CodeGen/CalcSpillWeights.h"
#include "llvm/CodeGen/LiveIntervalAnalysis.h"
#include "llvm/CodeGen/LiveStackAnalysis.h"
@@ -46,7 +47,6 @@
#include "llvm/CodeGen/PBQP/Graph.h"
#include "llvm/CodeGen/PBQP/Heuristics/Briggs.h"
#include "llvm/CodeGen/RegAllocRegistry.h"
-#include "llvm/CodeGen/RegisterCoalescer.h"
#include "llvm/Support/Debug.h"
#include "llvm/Support/raw_ostream.h"
#include "llvm/Target/TargetInstrInfo.h"
@@ -84,11 +84,11 @@ public:
static char ID;
/// Construct a PBQP register allocator.
- RegAllocPBQP(std::auto_ptr<PBQPBuilder> b)
- : MachineFunctionPass(ID), builder(b) {
+ RegAllocPBQP(std::auto_ptr<PBQPBuilder> b, char *cPassID=0)
+ : MachineFunctionPass(ID), builder(b), customPassID(cPassID) {
initializeSlotIndexesPass(*PassRegistry::getPassRegistry());
initializeLiveIntervalsPass(*PassRegistry::getPassRegistry());
- initializeRegisterCoalescerAnalysisGroup(*PassRegistry::getPassRegistry());
+ initializeRegisterCoalescerPass(*PassRegistry::getPassRegistry());
initializeCalculateSpillWeightsPass(*PassRegistry::getPassRegistry());
initializeLiveStacksPass(*PassRegistry::getPassRegistry());
initializeMachineLoopInfoPass(*PassRegistry::getPassRegistry());
@@ -122,6 +122,8 @@ private:
std::auto_ptr<PBQPBuilder> builder;
+ char *customPassID;
+
MachineFunction *mf;
const TargetMachine *tm;
const TargetRegisterInfo *tri;
@@ -222,10 +224,9 @@ std::auto_ptr<PBQPRAProblem> PBQPBuilder::build(MachineFunction *mf,
// Compute an initial allowed set for the current vreg.
typedef std::vector<unsigned> VRAllowed;
VRAllowed vrAllowed;
- for (TargetRegisterClass::iterator aoItr = trc->allocation_order_begin(*mf),
- aoEnd = trc->allocation_order_end(*mf);
- aoItr != aoEnd; ++aoItr) {
- unsigned preg = *aoItr;
+ ArrayRef<unsigned> rawOrder = trc->getRawAllocationOrder(*mf);
+ for (unsigned i = 0; i != rawOrder.size(); ++i) {
+ unsigned preg = rawOrder[i];
if (!reservedRegs.test(preg)) {
vrAllowed.push_back(preg);
}
@@ -450,6 +451,8 @@ void RegAllocPBQP::getAnalysisUsage(AnalysisUsage &au) const {
au.addRequired<LiveIntervals>();
//au.addRequiredID(SplitCriticalEdgesID);
au.addRequired<RegisterCoalescer>();
+ if (customPassID)
+ au.addRequiredID(*customPassID);
au.addRequired<CalculateSpillWeights>();
au.addRequired<LiveStacks>();
au.addPreserved<LiveStacks>();
@@ -581,7 +584,7 @@ void RegAllocPBQP::finalizeAlloc() const {
if (physReg == 0) {
const TargetRegisterClass *liRC = mri->getRegClass(li->reg);
- physReg = *liRC->allocation_order_begin(*mf);
+ physReg = liRC->getRawAllocationOrder(*mf).front();
}
vrm->assignVirt2Phys(li->reg, physReg);
@@ -703,8 +706,9 @@ bool RegAllocPBQP::runOnMachineFunction(MachineFunction &MF) {
}
FunctionPass* llvm::createPBQPRegisterAllocator(
- std::auto_ptr<PBQPBuilder> builder) {
- return new RegAllocPBQP(builder);
+ std::auto_ptr<PBQPBuilder> builder,
+ char *customPassID) {
+ return new RegAllocPBQP(builder, customPassID);
}
FunctionPass* llvm::createDefaultPBQPRegisterAllocator() {
diff --git a/contrib/llvm/lib/CodeGen/RegisterClassInfo.cpp b/contrib/llvm/lib/CodeGen/RegisterClassInfo.cpp
index 75b0c90..5a77e47 100644
--- a/contrib/llvm/lib/CodeGen/RegisterClassInfo.cpp
+++ b/contrib/llvm/lib/CodeGen/RegisterClassInfo.cpp
@@ -81,11 +81,9 @@ void RegisterClassInfo::compute(const TargetRegisterClass *RC) const {
// FIXME: Once targets reserve registers instead of removing them from the
// allocation order, we can simply use begin/end here.
- TargetRegisterClass::iterator AOB = RC->allocation_order_begin(*MF);
- TargetRegisterClass::iterator AOE = RC->allocation_order_end(*MF);
-
- for (TargetRegisterClass::iterator I = AOB; I != AOE; ++I) {
- unsigned PhysReg = *I;
+ ArrayRef<unsigned> RawOrder = RC->getRawAllocationOrder(*MF);
+ for (unsigned i = 0; i != RawOrder.size(); ++i) {
+ unsigned PhysReg = RawOrder[i];
// Remove reserved registers from the allocation order.
if (Reserved.test(PhysReg))
continue;
@@ -103,7 +101,7 @@ void RegisterClassInfo::compute(const TargetRegisterClass *RC) const {
DEBUG({
dbgs() << "AllocationOrder(" << RC->getName() << ") = [";
- for (unsigned I = 0; I != N; ++I)
+ for (unsigned I = 0; I != RCI.NumRegs; ++I)
dbgs() << ' ' << PrintReg(RCI.Order[I], TRI);
dbgs() << " ]\n";
});
diff --git a/contrib/llvm/lib/CodeGen/RegisterClassInfo.h b/contrib/llvm/lib/CodeGen/RegisterClassInfo.h
index 6f7d9c9..d21fd67 100644
--- a/contrib/llvm/lib/CodeGen/RegisterClassInfo.h
+++ b/contrib/llvm/lib/CodeGen/RegisterClassInfo.h
@@ -112,7 +112,7 @@ public:
/// register, so a register allocator needs to track its liveness and
/// availability.
bool isAllocatable(unsigned PhysReg) const {
- return TRI->get(PhysReg).inAllocatableClass && !isReserved(PhysReg);
+ return TRI->isInAllocatableClass(PhysReg) && !isReserved(PhysReg);
}
};
} // end namespace llvm
diff --git a/contrib/llvm/lib/CodeGen/RegisterCoalescer.cpp b/contrib/llvm/lib/CodeGen/RegisterCoalescer.cpp
index 407559a..b91f92c 100644
--- a/contrib/llvm/lib/CodeGen/RegisterCoalescer.cpp
+++ b/contrib/llvm/lib/CodeGen/RegisterCoalescer.cpp
@@ -13,38 +13,92 @@
//
//===----------------------------------------------------------------------===//
-#include "llvm/CodeGen/RegisterCoalescer.h"
+#define DEBUG_TYPE "regcoalescing"
+#include "RegisterCoalescer.h"
+#include "VirtRegMap.h"
+#include "LiveDebugVariables.h"
+
+#include "llvm/Pass.h"
+#include "llvm/Value.h"
#include "llvm/CodeGen/LiveIntervalAnalysis.h"
#include "llvm/CodeGen/MachineInstr.h"
#include "llvm/CodeGen/MachineRegisterInfo.h"
#include "llvm/Target/TargetInstrInfo.h"
#include "llvm/Target/TargetRegisterInfo.h"
-#include "llvm/Pass.h"
-
+#include "llvm/CodeGen/LiveIntervalAnalysis.h"
+#include "llvm/Analysis/AliasAnalysis.h"
+#include "llvm/CodeGen/MachineFrameInfo.h"
+#include "llvm/CodeGen/MachineInstr.h"
+#include "llvm/CodeGen/MachineLoopInfo.h"
+#include "llvm/CodeGen/MachineRegisterInfo.h"
+#include "llvm/CodeGen/Passes.h"
+#include "llvm/Target/TargetInstrInfo.h"
+#include "llvm/Target/TargetMachine.h"
+#include "llvm/Target/TargetOptions.h"
+#include "llvm/Support/CommandLine.h"
+#include "llvm/Support/Debug.h"
+#include "llvm/Support/ErrorHandling.h"
+#include "llvm/Support/raw_ostream.h"
+#include "llvm/ADT/OwningPtr.h"
+#include "llvm/ADT/SmallSet.h"
+#include "llvm/ADT/Statistic.h"
+#include "llvm/ADT/STLExtras.h"
+#include <algorithm>
+#include <cmath>
using namespace llvm;
-// Register the RegisterCoalescer interface, providing a nice name to refer to.
-INITIALIZE_ANALYSIS_GROUP(RegisterCoalescer, "Register Coalescer",
- SimpleRegisterCoalescing)
-char RegisterCoalescer::ID = 0;
+STATISTIC(numJoins , "Number of interval joins performed");
+STATISTIC(numCrossRCs , "Number of cross class joins performed");
+STATISTIC(numCommutes , "Number of instruction commuting performed");
+STATISTIC(numExtends , "Number of copies extended");
+STATISTIC(NumReMats , "Number of instructions re-materialized");
+STATISTIC(numPeep , "Number of identity moves eliminated after coalescing");
+STATISTIC(numAborts , "Number of times interval joining aborted");
-// RegisterCoalescer destructor: DO NOT move this to the header file
-// for RegisterCoalescer or else clients of the RegisterCoalescer
-// class may not depend on the RegisterCoalescer.o file in the current
-// .a file, causing alias analysis support to not be included in the
-// tool correctly!
-//
-RegisterCoalescer::~RegisterCoalescer() {}
+static cl::opt<bool>
+EnableJoining("join-liveintervals",
+ cl::desc("Coalesce copies (default=true)"),
+ cl::init(true));
+
+static cl::opt<bool>
+DisableCrossClassJoin("disable-cross-class-join",
+ cl::desc("Avoid coalescing cross register class copies"),
+ cl::init(false), cl::Hidden);
-unsigned CoalescerPair::compose(unsigned a, unsigned b) const {
+static cl::opt<bool>
+EnablePhysicalJoin("join-physregs",
+ cl::desc("Join physical register copies"),
+ cl::init(false), cl::Hidden);
+
+static cl::opt<bool>
+VerifyCoalescing("verify-coalescing",
+ cl::desc("Verify machine instrs before and after register coalescing"),
+ cl::Hidden);
+
+INITIALIZE_PASS_BEGIN(RegisterCoalescer, "simple-register-coalescing",
+ "Simple Register Coalescing", false, false)
+INITIALIZE_PASS_DEPENDENCY(LiveIntervals)
+INITIALIZE_PASS_DEPENDENCY(LiveDebugVariables)
+INITIALIZE_PASS_DEPENDENCY(SlotIndexes)
+INITIALIZE_PASS_DEPENDENCY(MachineLoopInfo)
+INITIALIZE_PASS_DEPENDENCY(StrongPHIElimination)
+INITIALIZE_PASS_DEPENDENCY(PHIElimination)
+INITIALIZE_PASS_DEPENDENCY(TwoAddressInstructionPass)
+INITIALIZE_AG_DEPENDENCY(AliasAnalysis)
+INITIALIZE_PASS_END(RegisterCoalescer, "simple-register-coalescing",
+ "Simple Register Coalescing", false, false)
+
+char RegisterCoalescer::ID = 0;
+
+static unsigned compose(const TargetRegisterInfo &tri, unsigned a, unsigned b) {
if (!a) return b;
if (!b) return a;
- return tri_.composeSubRegIndices(a, b);
+ return tri.composeSubRegIndices(a, b);
}
-bool CoalescerPair::isMoveInstr(const MachineInstr *MI,
- unsigned &Src, unsigned &Dst,
- unsigned &SrcSub, unsigned &DstSub) const {
+static bool isMoveInstr(const TargetRegisterInfo &tri, const MachineInstr *MI,
+ unsigned &Src, unsigned &Dst,
+ unsigned &SrcSub, unsigned &DstSub) {
if (MI->isCopy()) {
Dst = MI->getOperand(0).getReg();
DstSub = MI->getOperand(0).getSubReg();
@@ -52,7 +106,8 @@ bool CoalescerPair::isMoveInstr(const MachineInstr *MI,
SrcSub = MI->getOperand(1).getSubReg();
} else if (MI->isSubregToReg()) {
Dst = MI->getOperand(0).getReg();
- DstSub = compose(MI->getOperand(0).getSubReg(), MI->getOperand(3).getImm());
+ DstSub = compose(tri, MI->getOperand(0).getSubReg(),
+ MI->getOperand(3).getImm());
Src = MI->getOperand(2).getReg();
SrcSub = MI->getOperand(2).getSubReg();
} else
@@ -66,7 +121,7 @@ bool CoalescerPair::setRegisters(const MachineInstr *MI) {
flipped_ = crossClass_ = false;
unsigned Src, Dst, SrcSub, DstSub;
- if (!isMoveInstr(MI, Src, Dst, SrcSub, DstSub))
+ if (!isMoveInstr(tri_, MI, Src, Dst, SrcSub, DstSub))
return false;
partial_ = SrcSub || DstSub;
@@ -156,7 +211,7 @@ bool CoalescerPair::isCoalescable(const MachineInstr *MI) const {
if (!MI)
return false;
unsigned Src, Dst, SrcSub, DstSub;
- if (!isMoveInstr(MI, Src, Dst, SrcSub, DstSub))
+ if (!isMoveInstr(tri_, MI, Src, Dst, SrcSub, DstSub))
return false;
// Find the virtual register that is srcReg_.
@@ -185,13 +240,1558 @@ bool CoalescerPair::isCoalescable(const MachineInstr *MI) const {
if (dstReg_ != Dst)
return false;
// Registers match, do the subregisters line up?
- return compose(subIdx_, SrcSub) == DstSub;
+ return compose(tri_, subIdx_, SrcSub) == DstSub;
+ }
+}
+
+void RegisterCoalescer::getAnalysisUsage(AnalysisUsage &AU) const {
+ AU.setPreservesCFG();
+ AU.addRequired<AliasAnalysis>();
+ AU.addRequired<LiveIntervals>();
+ AU.addPreserved<LiveIntervals>();
+ AU.addRequired<LiveDebugVariables>();
+ AU.addPreserved<LiveDebugVariables>();
+ AU.addPreserved<SlotIndexes>();
+ AU.addRequired<MachineLoopInfo>();
+ AU.addPreserved<MachineLoopInfo>();
+ AU.addPreservedID(MachineDominatorsID);
+ AU.addPreservedID(StrongPHIEliminationID);
+ AU.addPreservedID(PHIEliminationID);
+ AU.addPreservedID(TwoAddressInstructionPassID);
+ MachineFunctionPass::getAnalysisUsage(AU);
+}
+
+void RegisterCoalescer::markAsJoined(MachineInstr *CopyMI) {
+ /// Joined copies are not deleted immediately, but kept in JoinedCopies.
+ JoinedCopies.insert(CopyMI);
+
+ /// Mark all register operands of CopyMI as <undef> so they won't affect dead
+ /// code elimination.
+ for (MachineInstr::mop_iterator I = CopyMI->operands_begin(),
+ E = CopyMI->operands_end(); I != E; ++I)
+ if (I->isReg())
+ I->setIsUndef(true);
+}
+
+/// AdjustCopiesBackFrom - We found a non-trivially-coalescable copy with IntA
+/// being the source and IntB being the dest, thus this defines a value number
+/// in IntB. If the source value number (in IntA) is defined by a copy from B,
+/// see if we can merge these two pieces of B into a single value number,
+/// eliminating a copy. For example:
+///
+/// A3 = B0
+/// ...
+/// B1 = A3 <- this copy
+///
+/// In this case, B0 can be extended to where the B1 copy lives, allowing the B1
+/// value number to be replaced with B0 (which simplifies the B liveinterval).
+///
+/// This returns true if an interval was modified.
+///
+bool RegisterCoalescer::AdjustCopiesBackFrom(const CoalescerPair &CP,
+ MachineInstr *CopyMI) {
+ // Bail if there is no dst interval - can happen when merging physical subreg
+ // operations.
+ if (!li_->hasInterval(CP.getDstReg()))
+ return false;
+
+ LiveInterval &IntA =
+ li_->getInterval(CP.isFlipped() ? CP.getDstReg() : CP.getSrcReg());
+ LiveInterval &IntB =
+ li_->getInterval(CP.isFlipped() ? CP.getSrcReg() : CP.getDstReg());
+ SlotIndex CopyIdx = li_->getInstructionIndex(CopyMI).getDefIndex();
+
+ // BValNo is a value number in B that is defined by a copy from A. 'B3' in
+ // the example above.
+ LiveInterval::iterator BLR = IntB.FindLiveRangeContaining(CopyIdx);
+ if (BLR == IntB.end()) return false;
+ VNInfo *BValNo = BLR->valno;
+
+ // Get the location that B is defined at. Two options: either this value has
+ // an unknown definition point or it is defined at CopyIdx. If unknown, we
+ // can't process it.
+ if (!BValNo->isDefByCopy()) return false;
+ assert(BValNo->def == CopyIdx && "Copy doesn't define the value?");
+
+ // AValNo is the value number in A that defines the copy, A3 in the example.
+ SlotIndex CopyUseIdx = CopyIdx.getUseIndex();
+ LiveInterval::iterator ALR = IntA.FindLiveRangeContaining(CopyUseIdx);
+ // The live range might not exist after fun with physreg coalescing.
+ if (ALR == IntA.end()) return false;
+ VNInfo *AValNo = ALR->valno;
+ // If it's re-defined by an early clobber somewhere in the live range, then
+ // it's not safe to eliminate the copy. FIXME: This is a temporary workaround.
+ // See PR3149:
+ // 172 %ECX<def> = MOV32rr %reg1039<kill>
+ // 180 INLINEASM <es:subl $5,$1
+ // sbbl $3,$0>, 10, %EAX<def>, 14, %ECX<earlyclobber,def>, 9,
+ // %EAX<kill>,
+ // 36, <fi#0>, 1, %reg0, 0, 9, %ECX<kill>, 36, <fi#1>, 1, %reg0, 0
+ // 188 %EAX<def> = MOV32rr %EAX<kill>
+ // 196 %ECX<def> = MOV32rr %ECX<kill>
+ // 204 %ECX<def> = MOV32rr %ECX<kill>
+ // 212 %EAX<def> = MOV32rr %EAX<kill>
+ // 220 %EAX<def> = MOV32rr %EAX
+ // 228 %reg1039<def> = MOV32rr %ECX<kill>
+ // The early clobber operand ties ECX input to the ECX def.
+ //
+ // The live interval of ECX is represented as this:
+ // %reg20,inf = [46,47:1)[174,230:0) 0@174-(230) 1@46-(47)
+ // The coalescer has no idea there was a def in the middle of [174,230].
+ if (AValNo->hasRedefByEC())
+ return false;
+
+ // If AValNo is defined as a copy from IntB, we can potentially process this.
+ // Get the instruction that defines this value number.
+ if (!CP.isCoalescable(AValNo->getCopy()))
+ return false;
+
+ // Get the LiveRange in IntB that this value number starts with.
+ LiveInterval::iterator ValLR =
+ IntB.FindLiveRangeContaining(AValNo->def.getPrevSlot());
+ if (ValLR == IntB.end())
+ return false;
+
+ // Make sure that the end of the live range is inside the same block as
+ // CopyMI.
+ MachineInstr *ValLREndInst =
+ li_->getInstructionFromIndex(ValLR->end.getPrevSlot());
+ if (!ValLREndInst || ValLREndInst->getParent() != CopyMI->getParent())
+ return false;
+
+ // Okay, we now know that ValLR ends in the same block that the CopyMI
+ // live-range starts. If there are no intervening live ranges between them in
+ // IntB, we can merge them.
+ if (ValLR+1 != BLR) return false;
+
+ // If a live interval is a physical register, conservatively check if any
+ // of its aliases is overlapping the live interval of the virtual register.
+ // If so, do not coalesce.
+ if (TargetRegisterInfo::isPhysicalRegister(IntB.reg)) {
+ for (const unsigned *AS = tri_->getAliasSet(IntB.reg); *AS; ++AS)
+ if (li_->hasInterval(*AS) && IntA.overlaps(li_->getInterval(*AS))) {
+ DEBUG({
+ dbgs() << "\t\tInterfere with alias ";
+ li_->getInterval(*AS).print(dbgs(), tri_);
+ });
+ return false;
+ }
+ }
+
+ DEBUG({
+ dbgs() << "Extending: ";
+ IntB.print(dbgs(), tri_);
+ });
+
+ SlotIndex FillerStart = ValLR->end, FillerEnd = BLR->start;
+ // We are about to delete CopyMI, so need to remove it as the 'instruction
+ // that defines this value #'. Update the valnum with the new defining
+ // instruction #.
+ BValNo->def = FillerStart;
+ BValNo->setCopy(0);
+
+ // Okay, we can merge them. We need to insert a new liverange:
+ // [ValLR.end, BLR.begin) of either value number, then we merge the
+ // two value numbers.
+ IntB.addRange(LiveRange(FillerStart, FillerEnd, BValNo));
+
+ // If the IntB live range is assigned to a physical register, and if that
+ // physreg has sub-registers, update their live intervals as well.
+ if (TargetRegisterInfo::isPhysicalRegister(IntB.reg)) {
+ for (const unsigned *SR = tri_->getSubRegisters(IntB.reg); *SR; ++SR) {
+ if (!li_->hasInterval(*SR))
+ continue;
+ LiveInterval &SRLI = li_->getInterval(*SR);
+ SRLI.addRange(LiveRange(FillerStart, FillerEnd,
+ SRLI.getNextValue(FillerStart, 0,
+ li_->getVNInfoAllocator())));
+ }
+ }
+
+ // Okay, merge "B1" into the same value number as "B0".
+ if (BValNo != ValLR->valno) {
+ // If B1 is killed by a PHI, then the merged live range must also be killed
+ // by the same PHI, as B0 and B1 can not overlap.
+ bool HasPHIKill = BValNo->hasPHIKill();
+ IntB.MergeValueNumberInto(BValNo, ValLR->valno);
+ if (HasPHIKill)
+ ValLR->valno->setHasPHIKill(true);
+ }
+ DEBUG({
+ dbgs() << " result = ";
+ IntB.print(dbgs(), tri_);
+ dbgs() << "\n";
+ });
+
+ // If the source instruction was killing the source register before the
+ // merge, unset the isKill marker given the live range has been extended.
+ int UIdx = ValLREndInst->findRegisterUseOperandIdx(IntB.reg, true);
+ if (UIdx != -1) {
+ ValLREndInst->getOperand(UIdx).setIsKill(false);
+ }
+
+ // If the copy instruction was killing the destination register before the
+ // merge, find the last use and trim the live range. That will also add the
+ // isKill marker.
+ if (ALR->end == CopyIdx)
+ li_->shrinkToUses(&IntA);
+
+ ++numExtends;
+ return true;
+}
+
+/// HasOtherReachingDefs - Return true if there are definitions of IntB
+/// other than BValNo val# that can reach uses of AValno val# of IntA.
+bool RegisterCoalescer::HasOtherReachingDefs(LiveInterval &IntA,
+ LiveInterval &IntB,
+ VNInfo *AValNo,
+ VNInfo *BValNo) {
+ for (LiveInterval::iterator AI = IntA.begin(), AE = IntA.end();
+ AI != AE; ++AI) {
+ if (AI->valno != AValNo) continue;
+ LiveInterval::Ranges::iterator BI =
+ std::upper_bound(IntB.ranges.begin(), IntB.ranges.end(), AI->start);
+ if (BI != IntB.ranges.begin())
+ --BI;
+ for (; BI != IntB.ranges.end() && AI->end >= BI->start; ++BI) {
+ if (BI->valno == BValNo)
+ continue;
+ if (BI->start <= AI->start && BI->end > AI->start)
+ return true;
+ if (BI->start > AI->start && BI->start < AI->end)
+ return true;
+ }
}
+ return false;
}
-// Because of the way .a files work, we must force the SimpleRC
-// implementation to be pulled in if the RegisterCoalescer classes are
-// pulled in. Otherwise we run the risk of RegisterCoalescer being
-// used, but the default implementation not being linked into the tool
-// that uses it.
-DEFINING_FILE_FOR(RegisterCoalescer)
+/// RemoveCopyByCommutingDef - We found a non-trivially-coalescable copy with
+/// IntA being the source and IntB being the dest, thus this defines a value
+/// number in IntB. If the source value number (in IntA) is defined by a
+/// commutable instruction and its other operand is coalesced to the copy dest
+/// register, see if we can transform the copy into a noop by commuting the
+/// definition. For example,
+///
+/// A3 = op A2 B0<kill>
+/// ...
+/// B1 = A3 <- this copy
+/// ...
+/// = op A3 <- more uses
+///
+/// ==>
+///
+/// B2 = op B0 A2<kill>
+/// ...
+/// B1 = B2 <- now an identify copy
+/// ...
+/// = op B2 <- more uses
+///
+/// This returns true if an interval was modified.
+///
+bool RegisterCoalescer::RemoveCopyByCommutingDef(const CoalescerPair &CP,
+ MachineInstr *CopyMI) {
+ // FIXME: For now, only eliminate the copy by commuting its def when the
+ // source register is a virtual register. We want to guard against cases
+ // where the copy is a back edge copy and commuting the def lengthen the
+ // live interval of the source register to the entire loop.
+ if (CP.isPhys() && CP.isFlipped())
+ return false;
+
+ // Bail if there is no dst interval.
+ if (!li_->hasInterval(CP.getDstReg()))
+ return false;
+
+ SlotIndex CopyIdx = li_->getInstructionIndex(CopyMI).getDefIndex();
+
+ LiveInterval &IntA =
+ li_->getInterval(CP.isFlipped() ? CP.getDstReg() : CP.getSrcReg());
+ LiveInterval &IntB =
+ li_->getInterval(CP.isFlipped() ? CP.getSrcReg() : CP.getDstReg());
+
+ // BValNo is a value number in B that is defined by a copy from A. 'B3' in
+ // the example above.
+ VNInfo *BValNo = IntB.getVNInfoAt(CopyIdx);
+ if (!BValNo || !BValNo->isDefByCopy())
+ return false;
+
+ assert(BValNo->def == CopyIdx && "Copy doesn't define the value?");
+
+ // AValNo is the value number in A that defines the copy, A3 in the example.
+ VNInfo *AValNo = IntA.getVNInfoAt(CopyIdx.getUseIndex());
+ assert(AValNo && "COPY source not live");
+
+ // If other defs can reach uses of this def, then it's not safe to perform
+ // the optimization.
+ if (AValNo->isPHIDef() || AValNo->isUnused() || AValNo->hasPHIKill())
+ return false;
+ MachineInstr *DefMI = li_->getInstructionFromIndex(AValNo->def);
+ if (!DefMI)
+ return false;
+ const MCInstrDesc &MCID = DefMI->getDesc();
+ if (!MCID.isCommutable())
+ return false;
+ // If DefMI is a two-address instruction then commuting it will change the
+ // destination register.
+ int DefIdx = DefMI->findRegisterDefOperandIdx(IntA.reg);
+ assert(DefIdx != -1);
+ unsigned UseOpIdx;
+ if (!DefMI->isRegTiedToUseOperand(DefIdx, &UseOpIdx))
+ return false;
+ unsigned Op1, Op2, NewDstIdx;
+ if (!tii_->findCommutedOpIndices(DefMI, Op1, Op2))
+ return false;
+ if (Op1 == UseOpIdx)
+ NewDstIdx = Op2;
+ else if (Op2 == UseOpIdx)
+ NewDstIdx = Op1;
+ else
+ return false;
+
+ MachineOperand &NewDstMO = DefMI->getOperand(NewDstIdx);
+ unsigned NewReg = NewDstMO.getReg();
+ if (NewReg != IntB.reg || !NewDstMO.isKill())
+ return false;
+
+ // Make sure there are no other definitions of IntB that would reach the
+ // uses which the new definition can reach.
+ if (HasOtherReachingDefs(IntA, IntB, AValNo, BValNo))
+ return false;
+
+ // Abort if the aliases of IntB.reg have values that are not simply the
+ // clobbers from the superreg.
+ if (TargetRegisterInfo::isPhysicalRegister(IntB.reg))
+ for (const unsigned *AS = tri_->getAliasSet(IntB.reg); *AS; ++AS)
+ if (li_->hasInterval(*AS) &&
+ HasOtherReachingDefs(IntA, li_->getInterval(*AS), AValNo, 0))
+ return false;
+
+ // If some of the uses of IntA.reg is already coalesced away, return false.
+ // It's not possible to determine whether it's safe to perform the coalescing.
+ for (MachineRegisterInfo::use_nodbg_iterator UI =
+ mri_->use_nodbg_begin(IntA.reg),
+ UE = mri_->use_nodbg_end(); UI != UE; ++UI) {
+ MachineInstr *UseMI = &*UI;
+ SlotIndex UseIdx = li_->getInstructionIndex(UseMI);
+ LiveInterval::iterator ULR = IntA.FindLiveRangeContaining(UseIdx);
+ if (ULR == IntA.end())
+ continue;
+ if (ULR->valno == AValNo && JoinedCopies.count(UseMI))
+ return false;
+ }
+
+ DEBUG(dbgs() << "\tRemoveCopyByCommutingDef: " << AValNo->def << '\t'
+ << *DefMI);
+
+ // At this point we have decided that it is legal to do this
+ // transformation. Start by commuting the instruction.
+ MachineBasicBlock *MBB = DefMI->getParent();
+ MachineInstr *NewMI = tii_->commuteInstruction(DefMI);
+ if (!NewMI)
+ return false;
+ if (TargetRegisterInfo::isVirtualRegister(IntA.reg) &&
+ TargetRegisterInfo::isVirtualRegister(IntB.reg) &&
+ !mri_->constrainRegClass(IntB.reg, mri_->getRegClass(IntA.reg)))
+ return false;
+ if (NewMI != DefMI) {
+ li_->ReplaceMachineInstrInMaps(DefMI, NewMI);
+ MBB->insert(DefMI, NewMI);
+ MBB->erase(DefMI);
+ }
+ unsigned OpIdx = NewMI->findRegisterUseOperandIdx(IntA.reg, false);
+ NewMI->getOperand(OpIdx).setIsKill();
+
+ // If ALR and BLR overlaps and end of BLR extends beyond end of ALR, e.g.
+ // A = or A, B
+ // ...
+ // B = A
+ // ...
+ // C = A<kill>
+ // ...
+ // = B
+
+ // Update uses of IntA of the specific Val# with IntB.
+ for (MachineRegisterInfo::use_iterator UI = mri_->use_begin(IntA.reg),
+ UE = mri_->use_end(); UI != UE;) {
+ MachineOperand &UseMO = UI.getOperand();
+ MachineInstr *UseMI = &*UI;
+ ++UI;
+ if (JoinedCopies.count(UseMI))
+ continue;
+ if (UseMI->isDebugValue()) {
+ // FIXME These don't have an instruction index. Not clear we have enough
+ // info to decide whether to do this replacement or not. For now do it.
+ UseMO.setReg(NewReg);
+ continue;
+ }
+ SlotIndex UseIdx = li_->getInstructionIndex(UseMI).getUseIndex();
+ LiveInterval::iterator ULR = IntA.FindLiveRangeContaining(UseIdx);
+ if (ULR == IntA.end() || ULR->valno != AValNo)
+ continue;
+ if (TargetRegisterInfo::isPhysicalRegister(NewReg))
+ UseMO.substPhysReg(NewReg, *tri_);
+ else
+ UseMO.setReg(NewReg);
+ if (UseMI == CopyMI)
+ continue;
+ if (!UseMI->isCopy())
+ continue;
+ if (UseMI->getOperand(0).getReg() != IntB.reg ||
+ UseMI->getOperand(0).getSubReg())
+ continue;
+
+ // This copy will become a noop. If it's defining a new val#, merge it into
+ // BValNo.
+ SlotIndex DefIdx = UseIdx.getDefIndex();
+ VNInfo *DVNI = IntB.getVNInfoAt(DefIdx);
+ if (!DVNI)
+ continue;
+ DEBUG(dbgs() << "\t\tnoop: " << DefIdx << '\t' << *UseMI);
+ assert(DVNI->def == DefIdx);
+ BValNo = IntB.MergeValueNumberInto(BValNo, DVNI);
+ markAsJoined(UseMI);
+ }
+
+ // Extend BValNo by merging in IntA live ranges of AValNo. Val# definition
+ // is updated.
+ VNInfo *ValNo = BValNo;
+ ValNo->def = AValNo->def;
+ ValNo->setCopy(0);
+ for (LiveInterval::iterator AI = IntA.begin(), AE = IntA.end();
+ AI != AE; ++AI) {
+ if (AI->valno != AValNo) continue;
+ IntB.addRange(LiveRange(AI->start, AI->end, ValNo));
+ }
+ DEBUG(dbgs() << "\t\textended: " << IntB << '\n');
+
+ IntA.removeValNo(AValNo);
+ DEBUG(dbgs() << "\t\ttrimmed: " << IntA << '\n');
+ ++numCommutes;
+ return true;
+}
+
+/// ReMaterializeTrivialDef - If the source of a copy is defined by a trivial
+/// computation, replace the copy by rematerialize the definition.
+bool RegisterCoalescer::ReMaterializeTrivialDef(LiveInterval &SrcInt,
+ bool preserveSrcInt,
+ unsigned DstReg,
+ unsigned DstSubIdx,
+ MachineInstr *CopyMI) {
+ SlotIndex CopyIdx = li_->getInstructionIndex(CopyMI).getUseIndex();
+ LiveInterval::iterator SrcLR = SrcInt.FindLiveRangeContaining(CopyIdx);
+ assert(SrcLR != SrcInt.end() && "Live range not found!");
+ VNInfo *ValNo = SrcLR->valno;
+ // If other defs can reach uses of this def, then it's not safe to perform
+ // the optimization.
+ if (ValNo->isPHIDef() || ValNo->isUnused() || ValNo->hasPHIKill())
+ return false;
+ MachineInstr *DefMI = li_->getInstructionFromIndex(ValNo->def);
+ if (!DefMI)
+ return false;
+ assert(DefMI && "Defining instruction disappeared");
+ const MCInstrDesc &MCID = DefMI->getDesc();
+ if (!MCID.isAsCheapAsAMove())
+ return false;
+ if (!tii_->isTriviallyReMaterializable(DefMI, AA))
+ return false;
+ bool SawStore = false;
+ if (!DefMI->isSafeToMove(tii_, AA, SawStore))
+ return false;
+ if (MCID.getNumDefs() != 1)
+ return false;
+ if (!DefMI->isImplicitDef()) {
+ // Make sure the copy destination register class fits the instruction
+ // definition register class. The mismatch can happen as a result of earlier
+ // extract_subreg, insert_subreg, subreg_to_reg coalescing.
+ const TargetRegisterClass *RC = tii_->getRegClass(MCID, 0, tri_);
+ if (TargetRegisterInfo::isVirtualRegister(DstReg)) {
+ if (mri_->getRegClass(DstReg) != RC)
+ return false;
+ } else if (!RC->contains(DstReg))
+ return false;
+ }
+
+ // If destination register has a sub-register index on it, make sure it
+ // matches the instruction register class.
+ if (DstSubIdx) {
+ const MCInstrDesc &MCID = DefMI->getDesc();
+ if (MCID.getNumDefs() != 1)
+ return false;
+ const TargetRegisterClass *DstRC = mri_->getRegClass(DstReg);
+ const TargetRegisterClass *DstSubRC =
+ DstRC->getSubRegisterRegClass(DstSubIdx);
+ const TargetRegisterClass *DefRC = tii_->getRegClass(MCID, 0, tri_);
+ if (DefRC == DstRC)
+ DstSubIdx = 0;
+ else if (DefRC != DstSubRC)
+ return false;
+ }
+
+ RemoveCopyFlag(DstReg, CopyMI);
+
+ MachineBasicBlock *MBB = CopyMI->getParent();
+ MachineBasicBlock::iterator MII =
+ llvm::next(MachineBasicBlock::iterator(CopyMI));
+ tii_->reMaterialize(*MBB, MII, DstReg, DstSubIdx, DefMI, *tri_);
+ MachineInstr *NewMI = prior(MII);
+
+ // CopyMI may have implicit operands, transfer them over to the newly
+ // rematerialized instruction. And update implicit def interval valnos.
+ for (unsigned i = CopyMI->getDesc().getNumOperands(),
+ e = CopyMI->getNumOperands(); i != e; ++i) {
+ MachineOperand &MO = CopyMI->getOperand(i);
+ if (MO.isReg() && MO.isImplicit())
+ NewMI->addOperand(MO);
+ if (MO.isDef())
+ RemoveCopyFlag(MO.getReg(), CopyMI);
+ }
+
+ NewMI->copyImplicitOps(CopyMI);
+ li_->ReplaceMachineInstrInMaps(CopyMI, NewMI);
+ CopyMI->eraseFromParent();
+ ReMatCopies.insert(CopyMI);
+ ReMatDefs.insert(DefMI);
+ DEBUG(dbgs() << "Remat: " << *NewMI);
+ ++NumReMats;
+
+ // The source interval can become smaller because we removed a use.
+ if (preserveSrcInt)
+ li_->shrinkToUses(&SrcInt);
+
+ return true;
+}
+
+/// UpdateRegDefsUses - Replace all defs and uses of SrcReg to DstReg and
+/// update the subregister number if it is not zero. If DstReg is a
+/// physical register and the existing subregister number of the def / use
+/// being updated is not zero, make sure to set it to the correct physical
+/// subregister.
+void
+RegisterCoalescer::UpdateRegDefsUses(const CoalescerPair &CP) {
+ bool DstIsPhys = CP.isPhys();
+ unsigned SrcReg = CP.getSrcReg();
+ unsigned DstReg = CP.getDstReg();
+ unsigned SubIdx = CP.getSubIdx();
+
+ // Update LiveDebugVariables.
+ ldv_->renameRegister(SrcReg, DstReg, SubIdx);
+
+ for (MachineRegisterInfo::reg_iterator I = mri_->reg_begin(SrcReg);
+ MachineInstr *UseMI = I.skipInstruction();) {
+ // A PhysReg copy that won't be coalesced can perhaps be rematerialized
+ // instead.
+ if (DstIsPhys) {
+ if (UseMI->isCopy() &&
+ !UseMI->getOperand(1).getSubReg() &&
+ !UseMI->getOperand(0).getSubReg() &&
+ UseMI->getOperand(1).getReg() == SrcReg &&
+ UseMI->getOperand(0).getReg() != SrcReg &&
+ UseMI->getOperand(0).getReg() != DstReg &&
+ !JoinedCopies.count(UseMI) &&
+ ReMaterializeTrivialDef(li_->getInterval(SrcReg), false,
+ UseMI->getOperand(0).getReg(), 0, UseMI))
+ continue;
+ }
+
+ SmallVector<unsigned,8> Ops;
+ bool Reads, Writes;
+ tie(Reads, Writes) = UseMI->readsWritesVirtualRegister(SrcReg, &Ops);
+ bool Kills = false, Deads = false;
+
+ // Replace SrcReg with DstReg in all UseMI operands.
+ for (unsigned i = 0, e = Ops.size(); i != e; ++i) {
+ MachineOperand &MO = UseMI->getOperand(Ops[i]);
+ Kills |= MO.isKill();
+ Deads |= MO.isDead();
+
+ if (DstIsPhys)
+ MO.substPhysReg(DstReg, *tri_);
+ else
+ MO.substVirtReg(DstReg, SubIdx, *tri_);
+ }
+
+ // This instruction is a copy that will be removed.
+ if (JoinedCopies.count(UseMI))
+ continue;
+
+ if (SubIdx) {
+ // If UseMI was a simple SrcReg def, make sure we didn't turn it into a
+ // read-modify-write of DstReg.
+ if (Deads)
+ UseMI->addRegisterDead(DstReg, tri_);
+ else if (!Reads && Writes)
+ UseMI->addRegisterDefined(DstReg, tri_);
+
+ // Kill flags apply to the whole physical register.
+ if (DstIsPhys && Kills)
+ UseMI->addRegisterKilled(DstReg, tri_);
+ }
+
+ DEBUG({
+ dbgs() << "\t\tupdated: ";
+ if (!UseMI->isDebugValue())
+ dbgs() << li_->getInstructionIndex(UseMI) << "\t";
+ dbgs() << *UseMI;
+ });
+ }
+}
+
+/// removeIntervalIfEmpty - Check if the live interval of a physical register
+/// is empty, if so remove it and also remove the empty intervals of its
+/// sub-registers. Return true if live interval is removed.
+static bool removeIntervalIfEmpty(LiveInterval &li, LiveIntervals *li_,
+ const TargetRegisterInfo *tri_) {
+ if (li.empty()) {
+ if (TargetRegisterInfo::isPhysicalRegister(li.reg))
+ for (const unsigned* SR = tri_->getSubRegisters(li.reg); *SR; ++SR) {
+ if (!li_->hasInterval(*SR))
+ continue;
+ LiveInterval &sli = li_->getInterval(*SR);
+ if (sli.empty())
+ li_->removeInterval(*SR);
+ }
+ li_->removeInterval(li.reg);
+ return true;
+ }
+ return false;
+}
+
+/// RemoveDeadDef - If a def of a live interval is now determined dead, remove
+/// the val# it defines. If the live interval becomes empty, remove it as well.
+bool RegisterCoalescer::RemoveDeadDef(LiveInterval &li,
+ MachineInstr *DefMI) {
+ SlotIndex DefIdx = li_->getInstructionIndex(DefMI).getDefIndex();
+ LiveInterval::iterator MLR = li.FindLiveRangeContaining(DefIdx);
+ if (DefIdx != MLR->valno->def)
+ return false;
+ li.removeValNo(MLR->valno);
+ return removeIntervalIfEmpty(li, li_, tri_);
+}
+
+void RegisterCoalescer::RemoveCopyFlag(unsigned DstReg,
+ const MachineInstr *CopyMI) {
+ SlotIndex DefIdx = li_->getInstructionIndex(CopyMI).getDefIndex();
+ if (li_->hasInterval(DstReg)) {
+ LiveInterval &LI = li_->getInterval(DstReg);
+ if (const LiveRange *LR = LI.getLiveRangeContaining(DefIdx))
+ if (LR->valno->def == DefIdx)
+ LR->valno->setCopy(0);
+ }
+ if (!TargetRegisterInfo::isPhysicalRegister(DstReg))
+ return;
+ for (const unsigned* AS = tri_->getAliasSet(DstReg); *AS; ++AS) {
+ if (!li_->hasInterval(*AS))
+ continue;
+ LiveInterval &LI = li_->getInterval(*AS);
+ if (const LiveRange *LR = LI.getLiveRangeContaining(DefIdx))
+ if (LR->valno->def == DefIdx)
+ LR->valno->setCopy(0);
+ }
+}
+
+/// shouldJoinPhys - Return true if a copy involving a physreg should be joined.
+/// We need to be careful about coalescing a source physical register with a
+/// virtual register. Once the coalescing is done, it cannot be broken and these
+/// are not spillable! If the destination interval uses are far away, think
+/// twice about coalescing them!
+bool RegisterCoalescer::shouldJoinPhys(CoalescerPair &CP) {
+ bool Allocatable = li_->isAllocatable(CP.getDstReg());
+ LiveInterval &JoinVInt = li_->getInterval(CP.getSrcReg());
+
+ /// Always join simple intervals that are defined by a single copy from a
+ /// reserved register. This doesn't increase register pressure, so it is
+ /// always beneficial.
+ if (!Allocatable && CP.isFlipped() && JoinVInt.containsOneValue())
+ return true;
+
+ if (!EnablePhysicalJoin) {
+ DEBUG(dbgs() << "\tPhysreg joins disabled.\n");
+ return false;
+ }
+
+ // Only coalesce to allocatable physreg, we don't want to risk modifying
+ // reserved registers.
+ if (!Allocatable) {
+ DEBUG(dbgs() << "\tRegister is an unallocatable physreg.\n");
+ return false; // Not coalescable.
+ }
+
+ // Don't join with physregs that have a ridiculous number of live
+ // ranges. The data structure performance is really bad when that
+ // happens.
+ if (li_->hasInterval(CP.getDstReg()) &&
+ li_->getInterval(CP.getDstReg()).ranges.size() > 1000) {
+ ++numAborts;
+ DEBUG(dbgs()
+ << "\tPhysical register live interval too complicated, abort!\n");
+ return false;
+ }
+
+ // FIXME: Why are we skipping this test for partial copies?
+ // CodeGen/X86/phys_subreg_coalesce-3.ll needs it.
+ if (!CP.isPartial()) {
+ const TargetRegisterClass *RC = mri_->getRegClass(CP.getSrcReg());
+ unsigned Threshold = RegClassInfo.getNumAllocatableRegs(RC) * 2;
+ unsigned Length = li_->getApproximateInstructionCount(JoinVInt);
+ if (Length > Threshold) {
+ ++numAborts;
+ DEBUG(dbgs() << "\tMay tie down a physical register, abort!\n");
+ return false;
+ }
+ }
+ return true;
+}
+
+/// isWinToJoinCrossClass - Return true if it's profitable to coalesce
+/// two virtual registers from different register classes.
+bool
+RegisterCoalescer::isWinToJoinCrossClass(unsigned SrcReg,
+ unsigned DstReg,
+ const TargetRegisterClass *SrcRC,
+ const TargetRegisterClass *DstRC,
+ const TargetRegisterClass *NewRC) {
+ unsigned NewRCCount = RegClassInfo.getNumAllocatableRegs(NewRC);
+ // This heuristics is good enough in practice, but it's obviously not *right*.
+ // 4 is a magic number that works well enough for x86, ARM, etc. It filter
+ // out all but the most restrictive register classes.
+ if (NewRCCount > 4 ||
+ // Early exit if the function is fairly small, coalesce aggressively if
+ // that's the case. For really special register classes with 3 or
+ // fewer registers, be a bit more careful.
+ (li_->getFuncInstructionCount() / NewRCCount) < 8)
+ return true;
+ LiveInterval &SrcInt = li_->getInterval(SrcReg);
+ LiveInterval &DstInt = li_->getInterval(DstReg);
+ unsigned SrcSize = li_->getApproximateInstructionCount(SrcInt);
+ unsigned DstSize = li_->getApproximateInstructionCount(DstInt);
+
+ // Coalesce aggressively if the intervals are small compared to the number of
+ // registers in the new class. The number 4 is fairly arbitrary, chosen to be
+ // less aggressive than the 8 used for the whole function size.
+ const unsigned ThresSize = 4 * NewRCCount;
+ if (SrcSize <= ThresSize && DstSize <= ThresSize)
+ return true;
+
+ // Estimate *register use density*. If it doubles or more, abort.
+ unsigned SrcUses = std::distance(mri_->use_nodbg_begin(SrcReg),
+ mri_->use_nodbg_end());
+ unsigned DstUses = std::distance(mri_->use_nodbg_begin(DstReg),
+ mri_->use_nodbg_end());
+ unsigned NewUses = SrcUses + DstUses;
+ unsigned NewSize = SrcSize + DstSize;
+ if (SrcRC != NewRC && SrcSize > ThresSize) {
+ unsigned SrcRCCount = RegClassInfo.getNumAllocatableRegs(SrcRC);
+ if (NewUses*SrcSize*SrcRCCount > 2*SrcUses*NewSize*NewRCCount)
+ return false;
+ }
+ if (DstRC != NewRC && DstSize > ThresSize) {
+ unsigned DstRCCount = RegClassInfo.getNumAllocatableRegs(DstRC);
+ if (NewUses*DstSize*DstRCCount > 2*DstUses*NewSize*NewRCCount)
+ return false;
+ }
+ return true;
+}
+
+
+/// JoinCopy - Attempt to join intervals corresponding to SrcReg/DstReg,
+/// which are the src/dst of the copy instruction CopyMI. This returns true
+/// if the copy was successfully coalesced away. If it is not currently
+/// possible to coalesce this interval, but it may be possible if other
+/// things get coalesced, then it returns true by reference in 'Again'.
+bool RegisterCoalescer::JoinCopy(MachineInstr *CopyMI, bool &Again) {
+
+ Again = false;
+ if (JoinedCopies.count(CopyMI) || ReMatCopies.count(CopyMI))
+ return false; // Already done.
+
+ DEBUG(dbgs() << li_->getInstructionIndex(CopyMI) << '\t' << *CopyMI);
+
+ CoalescerPair CP(*tii_, *tri_);
+ if (!CP.setRegisters(CopyMI)) {
+ DEBUG(dbgs() << "\tNot coalescable.\n");
+ return false;
+ }
+
+ // If they are already joined we continue.
+ if (CP.getSrcReg() == CP.getDstReg()) {
+ markAsJoined(CopyMI);
+ DEBUG(dbgs() << "\tCopy already coalesced.\n");
+ return false; // Not coalescable.
+ }
+
+ DEBUG(dbgs() << "\tConsidering merging " << PrintReg(CP.getSrcReg(), tri_)
+ << " with " << PrintReg(CP.getDstReg(), tri_, CP.getSubIdx())
+ << "\n");
+
+ // Enforce policies.
+ if (CP.isPhys()) {
+ if (!shouldJoinPhys(CP)) {
+ // Before giving up coalescing, if definition of source is defined by
+ // trivial computation, try rematerializing it.
+ if (!CP.isFlipped() &&
+ ReMaterializeTrivialDef(li_->getInterval(CP.getSrcReg()), true,
+ CP.getDstReg(), 0, CopyMI))
+ return true;
+ return false;
+ }
+ } else {
+ // Avoid constraining virtual register regclass too much.
+ if (CP.isCrossClass()) {
+ DEBUG(dbgs() << "\tCross-class to " << CP.getNewRC()->getName() << ".\n");
+ if (DisableCrossClassJoin) {
+ DEBUG(dbgs() << "\tCross-class joins disabled.\n");
+ return false;
+ }
+ if (!isWinToJoinCrossClass(CP.getSrcReg(), CP.getDstReg(),
+ mri_->getRegClass(CP.getSrcReg()),
+ mri_->getRegClass(CP.getDstReg()),
+ CP.getNewRC())) {
+ DEBUG(dbgs() << "\tAvoid coalescing to constrained register class.\n");
+ Again = true; // May be possible to coalesce later.
+ return false;
+ }
+ }
+
+ // When possible, let DstReg be the larger interval.
+ if (!CP.getSubIdx() && li_->getInterval(CP.getSrcReg()).ranges.size() >
+ li_->getInterval(CP.getDstReg()).ranges.size())
+ CP.flip();
+ }
+
+ // Okay, attempt to join these two intervals. On failure, this returns false.
+ // Otherwise, if one of the intervals being joined is a physreg, this method
+ // always canonicalizes DstInt to be it. The output "SrcInt" will not have
+ // been modified, so we can use this information below to update aliases.
+ if (!JoinIntervals(CP)) {
+ // Coalescing failed.
+
+ // If definition of source is defined by trivial computation, try
+ // rematerializing it.
+ if (!CP.isFlipped() &&
+ ReMaterializeTrivialDef(li_->getInterval(CP.getSrcReg()), true,
+ CP.getDstReg(), 0, CopyMI))
+ return true;
+
+ // If we can eliminate the copy without merging the live ranges, do so now.
+ if (!CP.isPartial()) {
+ if (AdjustCopiesBackFrom(CP, CopyMI) ||
+ RemoveCopyByCommutingDef(CP, CopyMI)) {
+ markAsJoined(CopyMI);
+ DEBUG(dbgs() << "\tTrivial!\n");
+ return true;
+ }
+ }
+
+ // Otherwise, we are unable to join the intervals.
+ DEBUG(dbgs() << "\tInterference!\n");
+ Again = true; // May be possible to coalesce later.
+ return false;
+ }
+
+ // Coalescing to a virtual register that is of a sub-register class of the
+ // other. Make sure the resulting register is set to the right register class.
+ if (CP.isCrossClass()) {
+ ++numCrossRCs;
+ mri_->setRegClass(CP.getDstReg(), CP.getNewRC());
+ }
+
+ // Remember to delete the copy instruction.
+ markAsJoined(CopyMI);
+
+ UpdateRegDefsUses(CP);
+
+ // If we have extended the live range of a physical register, make sure we
+ // update live-in lists as well.
+ if (CP.isPhys()) {
+ SmallVector<MachineBasicBlock*, 16> BlockSeq;
+ // JoinIntervals invalidates the VNInfos in SrcInt, but we only need the
+ // ranges for this, and they are preserved.
+ LiveInterval &SrcInt = li_->getInterval(CP.getSrcReg());
+ for (LiveInterval::const_iterator I = SrcInt.begin(), E = SrcInt.end();
+ I != E; ++I ) {
+ li_->findLiveInMBBs(I->start, I->end, BlockSeq);
+ for (unsigned idx = 0, size = BlockSeq.size(); idx != size; ++idx) {
+ MachineBasicBlock &block = *BlockSeq[idx];
+ if (!block.isLiveIn(CP.getDstReg()))
+ block.addLiveIn(CP.getDstReg());
+ }
+ BlockSeq.clear();
+ }
+ }
+
+ // SrcReg is guarateed to be the register whose live interval that is
+ // being merged.
+ li_->removeInterval(CP.getSrcReg());
+
+ // Update regalloc hint.
+ tri_->UpdateRegAllocHint(CP.getSrcReg(), CP.getDstReg(), *mf_);
+
+ DEBUG({
+ LiveInterval &DstInt = li_->getInterval(CP.getDstReg());
+ dbgs() << "\tJoined. Result = ";
+ DstInt.print(dbgs(), tri_);
+ dbgs() << "\n";
+ });
+
+ ++numJoins;
+ return true;
+}
+
+/// ComputeUltimateVN - Assuming we are going to join two live intervals,
+/// compute what the resultant value numbers for each value in the input two
+/// ranges will be. This is complicated by copies between the two which can
+/// and will commonly cause multiple value numbers to be merged into one.
+///
+/// VN is the value number that we're trying to resolve. InstDefiningValue
+/// keeps track of the new InstDefiningValue assignment for the result
+/// LiveInterval. ThisFromOther/OtherFromThis are sets that keep track of
+/// whether a value in this or other is a copy from the opposite set.
+/// ThisValNoAssignments/OtherValNoAssignments keep track of value #'s that have
+/// already been assigned.
+///
+/// ThisFromOther[x] - If x is defined as a copy from the other interval, this
+/// contains the value number the copy is from.
+///
+static unsigned ComputeUltimateVN(VNInfo *VNI,
+ SmallVector<VNInfo*, 16> &NewVNInfo,
+ DenseMap<VNInfo*, VNInfo*> &ThisFromOther,
+ DenseMap<VNInfo*, VNInfo*> &OtherFromThis,
+ SmallVector<int, 16> &ThisValNoAssignments,
+ SmallVector<int, 16> &OtherValNoAssignments) {
+ unsigned VN = VNI->id;
+
+ // If the VN has already been computed, just return it.
+ if (ThisValNoAssignments[VN] >= 0)
+ return ThisValNoAssignments[VN];
+ assert(ThisValNoAssignments[VN] != -2 && "Cyclic value numbers");
+
+ // If this val is not a copy from the other val, then it must be a new value
+ // number in the destination.
+ DenseMap<VNInfo*, VNInfo*>::iterator I = ThisFromOther.find(VNI);
+ if (I == ThisFromOther.end()) {
+ NewVNInfo.push_back(VNI);
+ return ThisValNoAssignments[VN] = NewVNInfo.size()-1;
+ }
+ VNInfo *OtherValNo = I->second;
+
+ // Otherwise, this *is* a copy from the RHS. If the other side has already
+ // been computed, return it.
+ if (OtherValNoAssignments[OtherValNo->id] >= 0)
+ return ThisValNoAssignments[VN] = OtherValNoAssignments[OtherValNo->id];
+
+ // Mark this value number as currently being computed, then ask what the
+ // ultimate value # of the other value is.
+ ThisValNoAssignments[VN] = -2;
+ unsigned UltimateVN =
+ ComputeUltimateVN(OtherValNo, NewVNInfo, OtherFromThis, ThisFromOther,
+ OtherValNoAssignments, ThisValNoAssignments);
+ return ThisValNoAssignments[VN] = UltimateVN;
+}
+
+
+// Find out if we have something like
+// A = X
+// B = X
+// if so, we can pretend this is actually
+// A = X
+// B = A
+// which allows us to coalesce A and B.
+// VNI is the definition of B. LR is the life range of A that includes
+// the slot just before B. If we return true, we add "B = X" to DupCopies.
+static bool RegistersDefinedFromSameValue(LiveIntervals &li,
+ const TargetRegisterInfo &tri,
+ CoalescerPair &CP,
+ VNInfo *VNI,
+ LiveRange *LR,
+ SmallVector<MachineInstr*, 8> &DupCopies) {
+ // FIXME: This is very conservative. For example, we don't handle
+ // physical registers.
+
+ MachineInstr *MI = VNI->getCopy();
+
+ if (!MI->isFullCopy() || CP.isPartial() || CP.isPhys())
+ return false;
+
+ unsigned Dst = MI->getOperand(0).getReg();
+ unsigned Src = MI->getOperand(1).getReg();
+
+ if (!TargetRegisterInfo::isVirtualRegister(Src) ||
+ !TargetRegisterInfo::isVirtualRegister(Dst))
+ return false;
+
+ unsigned A = CP.getDstReg();
+ unsigned B = CP.getSrcReg();
+
+ if (B == Dst)
+ std::swap(A, B);
+ assert(Dst == A);
+
+ VNInfo *Other = LR->valno;
+ if (!Other->isDefByCopy())
+ return false;
+ const MachineInstr *OtherMI = Other->getCopy();
+
+ if (!OtherMI->isFullCopy())
+ return false;
+
+ unsigned OtherDst = OtherMI->getOperand(0).getReg();
+ unsigned OtherSrc = OtherMI->getOperand(1).getReg();
+
+ if (!TargetRegisterInfo::isVirtualRegister(OtherSrc) ||
+ !TargetRegisterInfo::isVirtualRegister(OtherDst))
+ return false;
+
+ assert(OtherDst == B);
+
+ if (Src != OtherSrc)
+ return false;
+
+ // If the copies use two different value numbers of X, we cannot merge
+ // A and B.
+ LiveInterval &SrcInt = li.getInterval(Src);
+ if (SrcInt.getVNInfoAt(Other->def) != SrcInt.getVNInfoAt(VNI->def))
+ return false;
+
+ DupCopies.push_back(MI);
+
+ return true;
+}
+
+/// JoinIntervals - Attempt to join these two intervals. On failure, this
+/// returns false.
+bool RegisterCoalescer::JoinIntervals(CoalescerPair &CP) {
+ LiveInterval &RHS = li_->getInterval(CP.getSrcReg());
+ DEBUG({ dbgs() << "\t\tRHS = "; RHS.print(dbgs(), tri_); dbgs() << "\n"; });
+
+ // If a live interval is a physical register, check for interference with any
+ // aliases. The interference check implemented here is a bit more conservative
+ // than the full interfeence check below. We allow overlapping live ranges
+ // only when one is a copy of the other.
+ if (CP.isPhys()) {
+ for (const unsigned *AS = tri_->getAliasSet(CP.getDstReg()); *AS; ++AS){
+ if (!li_->hasInterval(*AS))
+ continue;
+ const LiveInterval &LHS = li_->getInterval(*AS);
+ LiveInterval::const_iterator LI = LHS.begin();
+ for (LiveInterval::const_iterator RI = RHS.begin(), RE = RHS.end();
+ RI != RE; ++RI) {
+ LI = std::lower_bound(LI, LHS.end(), RI->start);
+ // Does LHS have an overlapping live range starting before RI?
+ if ((LI != LHS.begin() && LI[-1].end > RI->start) &&
+ (RI->start != RI->valno->def ||
+ !CP.isCoalescable(li_->getInstructionFromIndex(RI->start)))) {
+ DEBUG({
+ dbgs() << "\t\tInterference from alias: ";
+ LHS.print(dbgs(), tri_);
+ dbgs() << "\n\t\tOverlap at " << RI->start << " and no copy.\n";
+ });
+ return false;
+ }
+
+ // Check that LHS ranges beginning in this range are copies.
+ for (; LI != LHS.end() && LI->start < RI->end; ++LI) {
+ if (LI->start != LI->valno->def ||
+ !CP.isCoalescable(li_->getInstructionFromIndex(LI->start))) {
+ DEBUG({
+ dbgs() << "\t\tInterference from alias: ";
+ LHS.print(dbgs(), tri_);
+ dbgs() << "\n\t\tDef at " << LI->start << " is not a copy.\n";
+ });
+ return false;
+ }
+ }
+ }
+ }
+ }
+
+ // Compute the final value assignment, assuming that the live ranges can be
+ // coalesced.
+ SmallVector<int, 16> LHSValNoAssignments;
+ SmallVector<int, 16> RHSValNoAssignments;
+ DenseMap<VNInfo*, VNInfo*> LHSValsDefinedFromRHS;
+ DenseMap<VNInfo*, VNInfo*> RHSValsDefinedFromLHS;
+ SmallVector<VNInfo*, 16> NewVNInfo;
+
+ SmallVector<MachineInstr*, 8> DupCopies;
+
+ LiveInterval &LHS = li_->getOrCreateInterval(CP.getDstReg());
+ DEBUG({ dbgs() << "\t\tLHS = "; LHS.print(dbgs(), tri_); dbgs() << "\n"; });
+
+ // Loop over the value numbers of the LHS, seeing if any are defined from
+ // the RHS.
+ for (LiveInterval::vni_iterator i = LHS.vni_begin(), e = LHS.vni_end();
+ i != e; ++i) {
+ VNInfo *VNI = *i;
+ if (VNI->isUnused() || !VNI->isDefByCopy()) // Src not defined by a copy?
+ continue;
+
+ // Never join with a register that has EarlyClobber redefs.
+ if (VNI->hasRedefByEC())
+ return false;
+
+ // Figure out the value # from the RHS.
+ LiveRange *lr = RHS.getLiveRangeContaining(VNI->def.getPrevSlot());
+ // The copy could be to an aliased physreg.
+ if (!lr) continue;
+
+ // DstReg is known to be a register in the LHS interval. If the src is
+ // from the RHS interval, we can use its value #.
+ MachineInstr *MI = VNI->getCopy();
+ if (!CP.isCoalescable(MI) &&
+ !RegistersDefinedFromSameValue(*li_, *tri_, CP, VNI, lr, DupCopies))
+ continue;
+
+ LHSValsDefinedFromRHS[VNI] = lr->valno;
+ }
+
+ // Loop over the value numbers of the RHS, seeing if any are defined from
+ // the LHS.
+ for (LiveInterval::vni_iterator i = RHS.vni_begin(), e = RHS.vni_end();
+ i != e; ++i) {
+ VNInfo *VNI = *i;
+ if (VNI->isUnused() || !VNI->isDefByCopy()) // Src not defined by a copy?
+ continue;
+
+ // Never join with a register that has EarlyClobber redefs.
+ if (VNI->hasRedefByEC())
+ return false;
+
+ // Figure out the value # from the LHS.
+ LiveRange *lr = LHS.getLiveRangeContaining(VNI->def.getPrevSlot());
+ // The copy could be to an aliased physreg.
+ if (!lr) continue;
+
+ // DstReg is known to be a register in the RHS interval. If the src is
+ // from the LHS interval, we can use its value #.
+ MachineInstr *MI = VNI->getCopy();
+ if (!CP.isCoalescable(MI) &&
+ !RegistersDefinedFromSameValue(*li_, *tri_, CP, VNI, lr, DupCopies))
+ continue;
+
+ RHSValsDefinedFromLHS[VNI] = lr->valno;
+ }
+
+ LHSValNoAssignments.resize(LHS.getNumValNums(), -1);
+ RHSValNoAssignments.resize(RHS.getNumValNums(), -1);
+ NewVNInfo.reserve(LHS.getNumValNums() + RHS.getNumValNums());
+
+ for (LiveInterval::vni_iterator i = LHS.vni_begin(), e = LHS.vni_end();
+ i != e; ++i) {
+ VNInfo *VNI = *i;
+ unsigned VN = VNI->id;
+ if (LHSValNoAssignments[VN] >= 0 || VNI->isUnused())
+ continue;
+ ComputeUltimateVN(VNI, NewVNInfo,
+ LHSValsDefinedFromRHS, RHSValsDefinedFromLHS,
+ LHSValNoAssignments, RHSValNoAssignments);
+ }
+ for (LiveInterval::vni_iterator i = RHS.vni_begin(), e = RHS.vni_end();
+ i != e; ++i) {
+ VNInfo *VNI = *i;
+ unsigned VN = VNI->id;
+ if (RHSValNoAssignments[VN] >= 0 || VNI->isUnused())
+ continue;
+ // If this value number isn't a copy from the LHS, it's a new number.
+ if (RHSValsDefinedFromLHS.find(VNI) == RHSValsDefinedFromLHS.end()) {
+ NewVNInfo.push_back(VNI);
+ RHSValNoAssignments[VN] = NewVNInfo.size()-1;
+ continue;
+ }
+
+ ComputeUltimateVN(VNI, NewVNInfo,
+ RHSValsDefinedFromLHS, LHSValsDefinedFromRHS,
+ RHSValNoAssignments, LHSValNoAssignments);
+ }
+
+ // Armed with the mappings of LHS/RHS values to ultimate values, walk the
+ // interval lists to see if these intervals are coalescable.
+ LiveInterval::const_iterator I = LHS.begin();
+ LiveInterval::const_iterator IE = LHS.end();
+ LiveInterval::const_iterator J = RHS.begin();
+ LiveInterval::const_iterator JE = RHS.end();
+
+ // Skip ahead until the first place of potential sharing.
+ if (I != IE && J != JE) {
+ if (I->start < J->start) {
+ I = std::upper_bound(I, IE, J->start);
+ if (I != LHS.begin()) --I;
+ } else if (J->start < I->start) {
+ J = std::upper_bound(J, JE, I->start);
+ if (J != RHS.begin()) --J;
+ }
+ }
+
+ while (I != IE && J != JE) {
+ // Determine if these two live ranges overlap.
+ bool Overlaps;
+ if (I->start < J->start) {
+ Overlaps = I->end > J->start;
+ } else {
+ Overlaps = J->end > I->start;
+ }
+
+ // If so, check value # info to determine if they are really different.
+ if (Overlaps) {
+ // If the live range overlap will map to the same value number in the
+ // result liverange, we can still coalesce them. If not, we can't.
+ if (LHSValNoAssignments[I->valno->id] !=
+ RHSValNoAssignments[J->valno->id])
+ return false;
+ // If it's re-defined by an early clobber somewhere in the live range,
+ // then conservatively abort coalescing.
+ if (NewVNInfo[LHSValNoAssignments[I->valno->id]]->hasRedefByEC())
+ return false;
+ }
+
+ if (I->end < J->end)
+ ++I;
+ else
+ ++J;
+ }
+
+ // Update kill info. Some live ranges are extended due to copy coalescing.
+ for (DenseMap<VNInfo*, VNInfo*>::iterator I = LHSValsDefinedFromRHS.begin(),
+ E = LHSValsDefinedFromRHS.end(); I != E; ++I) {
+ VNInfo *VNI = I->first;
+ unsigned LHSValID = LHSValNoAssignments[VNI->id];
+ if (VNI->hasPHIKill())
+ NewVNInfo[LHSValID]->setHasPHIKill(true);
+ }
+
+ // Update kill info. Some live ranges are extended due to copy coalescing.
+ for (DenseMap<VNInfo*, VNInfo*>::iterator I = RHSValsDefinedFromLHS.begin(),
+ E = RHSValsDefinedFromLHS.end(); I != E; ++I) {
+ VNInfo *VNI = I->first;
+ unsigned RHSValID = RHSValNoAssignments[VNI->id];
+ if (VNI->hasPHIKill())
+ NewVNInfo[RHSValID]->setHasPHIKill(true);
+ }
+
+ if (LHSValNoAssignments.empty())
+ LHSValNoAssignments.push_back(-1);
+ if (RHSValNoAssignments.empty())
+ RHSValNoAssignments.push_back(-1);
+
+ SmallVector<unsigned, 8> SourceRegisters;
+ for (SmallVector<MachineInstr*, 8>::iterator I = DupCopies.begin(),
+ E = DupCopies.end(); I != E; ++I) {
+ MachineInstr *MI = *I;
+
+ // We have pretended that the assignment to B in
+ // A = X
+ // B = X
+ // was actually a copy from A. Now that we decided to coalesce A and B,
+ // transform the code into
+ // A = X
+ // X = X
+ // and mark the X as coalesced to keep the illusion.
+ unsigned Src = MI->getOperand(1).getReg();
+ SourceRegisters.push_back(Src);
+ MI->getOperand(0).substVirtReg(Src, 0, *tri_);
+
+ markAsJoined(MI);
+ }
+
+ // If B = X was the last use of X in a liverange, we have to shrink it now
+ // that B = X is gone.
+ for (SmallVector<unsigned, 8>::iterator I = SourceRegisters.begin(),
+ E = SourceRegisters.end(); I != E; ++I) {
+ li_->shrinkToUses(&li_->getInterval(*I));
+ }
+
+ // If we get here, we know that we can coalesce the live ranges. Ask the
+ // intervals to coalesce themselves now.
+ LHS.join(RHS, &LHSValNoAssignments[0], &RHSValNoAssignments[0], NewVNInfo,
+ mri_);
+ return true;
+}
+
+namespace {
+ // DepthMBBCompare - Comparison predicate that sort first based on the loop
+ // depth of the basic block (the unsigned), and then on the MBB number.
+ struct DepthMBBCompare {
+ typedef std::pair<unsigned, MachineBasicBlock*> DepthMBBPair;
+ bool operator()(const DepthMBBPair &LHS, const DepthMBBPair &RHS) const {
+ // Deeper loops first
+ if (LHS.first != RHS.first)
+ return LHS.first > RHS.first;
+
+ // Prefer blocks that are more connected in the CFG. This takes care of
+ // the most difficult copies first while intervals are short.
+ unsigned cl = LHS.second->pred_size() + LHS.second->succ_size();
+ unsigned cr = RHS.second->pred_size() + RHS.second->succ_size();
+ if (cl != cr)
+ return cl > cr;
+
+ // As a last resort, sort by block number.
+ return LHS.second->getNumber() < RHS.second->getNumber();
+ }
+ };
+}
+
+void RegisterCoalescer::CopyCoalesceInMBB(MachineBasicBlock *MBB,
+ std::vector<MachineInstr*> &TryAgain) {
+ DEBUG(dbgs() << MBB->getName() << ":\n");
+
+ SmallVector<MachineInstr*, 8> VirtCopies;
+ SmallVector<MachineInstr*, 8> PhysCopies;
+ SmallVector<MachineInstr*, 8> ImpDefCopies;
+ for (MachineBasicBlock::iterator MII = MBB->begin(), E = MBB->end();
+ MII != E;) {
+ MachineInstr *Inst = MII++;
+
+ // If this isn't a copy nor a extract_subreg, we can't join intervals.
+ unsigned SrcReg, DstReg;
+ if (Inst->isCopy()) {
+ DstReg = Inst->getOperand(0).getReg();
+ SrcReg = Inst->getOperand(1).getReg();
+ } else if (Inst->isSubregToReg()) {
+ DstReg = Inst->getOperand(0).getReg();
+ SrcReg = Inst->getOperand(2).getReg();
+ } else
+ continue;
+
+ bool SrcIsPhys = TargetRegisterInfo::isPhysicalRegister(SrcReg);
+ bool DstIsPhys = TargetRegisterInfo::isPhysicalRegister(DstReg);
+ if (li_->hasInterval(SrcReg) && li_->getInterval(SrcReg).empty())
+ ImpDefCopies.push_back(Inst);
+ else if (SrcIsPhys || DstIsPhys)
+ PhysCopies.push_back(Inst);
+ else
+ VirtCopies.push_back(Inst);
+ }
+
+ // Try coalescing implicit copies and insert_subreg <undef> first,
+ // followed by copies to / from physical registers, then finally copies
+ // from virtual registers to virtual registers.
+ for (unsigned i = 0, e = ImpDefCopies.size(); i != e; ++i) {
+ MachineInstr *TheCopy = ImpDefCopies[i];
+ bool Again = false;
+ if (!JoinCopy(TheCopy, Again))
+ if (Again)
+ TryAgain.push_back(TheCopy);
+ }
+ for (unsigned i = 0, e = PhysCopies.size(); i != e; ++i) {
+ MachineInstr *TheCopy = PhysCopies[i];
+ bool Again = false;
+ if (!JoinCopy(TheCopy, Again))
+ if (Again)
+ TryAgain.push_back(TheCopy);
+ }
+ for (unsigned i = 0, e = VirtCopies.size(); i != e; ++i) {
+ MachineInstr *TheCopy = VirtCopies[i];
+ bool Again = false;
+ if (!JoinCopy(TheCopy, Again))
+ if (Again)
+ TryAgain.push_back(TheCopy);
+ }
+}
+
+void RegisterCoalescer::joinIntervals() {
+ DEBUG(dbgs() << "********** JOINING INTERVALS ***********\n");
+
+ std::vector<MachineInstr*> TryAgainList;
+ if (loopInfo->empty()) {
+ // If there are no loops in the function, join intervals in function order.
+ for (MachineFunction::iterator I = mf_->begin(), E = mf_->end();
+ I != E; ++I)
+ CopyCoalesceInMBB(I, TryAgainList);
+ } else {
+ // Otherwise, join intervals in inner loops before other intervals.
+ // Unfortunately we can't just iterate over loop hierarchy here because
+ // there may be more MBB's than BB's. Collect MBB's for sorting.
+
+ // Join intervals in the function prolog first. We want to join physical
+ // registers with virtual registers before the intervals got too long.
+ std::vector<std::pair<unsigned, MachineBasicBlock*> > MBBs;
+ for (MachineFunction::iterator I = mf_->begin(), E = mf_->end();I != E;++I){
+ MachineBasicBlock *MBB = I;
+ MBBs.push_back(std::make_pair(loopInfo->getLoopDepth(MBB), I));
+ }
+
+ // Sort by loop depth.
+ std::sort(MBBs.begin(), MBBs.end(), DepthMBBCompare());
+
+ // Finally, join intervals in loop nest order.
+ for (unsigned i = 0, e = MBBs.size(); i != e; ++i)
+ CopyCoalesceInMBB(MBBs[i].second, TryAgainList);
+ }
+
+ // Joining intervals can allow other intervals to be joined. Iteratively join
+ // until we make no progress.
+ bool ProgressMade = true;
+ while (ProgressMade) {
+ ProgressMade = false;
+
+ for (unsigned i = 0, e = TryAgainList.size(); i != e; ++i) {
+ MachineInstr *&TheCopy = TryAgainList[i];
+ if (!TheCopy)
+ continue;
+
+ bool Again = false;
+ bool Success = JoinCopy(TheCopy, Again);
+ if (Success || !Again) {
+ TheCopy= 0; // Mark this one as done.
+ ProgressMade = true;
+ }
+ }
+ }
+}
+
+void RegisterCoalescer::releaseMemory() {
+ JoinedCopies.clear();
+ ReMatCopies.clear();
+ ReMatDefs.clear();
+}
+
+bool RegisterCoalescer::runOnMachineFunction(MachineFunction &fn) {
+ mf_ = &fn;
+ mri_ = &fn.getRegInfo();
+ tm_ = &fn.getTarget();
+ tri_ = tm_->getRegisterInfo();
+ tii_ = tm_->getInstrInfo();
+ li_ = &getAnalysis<LiveIntervals>();
+ ldv_ = &getAnalysis<LiveDebugVariables>();
+ AA = &getAnalysis<AliasAnalysis>();
+ loopInfo = &getAnalysis<MachineLoopInfo>();
+
+ DEBUG(dbgs() << "********** SIMPLE REGISTER COALESCING **********\n"
+ << "********** Function: "
+ << ((Value*)mf_->getFunction())->getName() << '\n');
+
+ if (VerifyCoalescing)
+ mf_->verify(this, "Before register coalescing");
+
+ RegClassInfo.runOnMachineFunction(fn);
+
+ // Join (coalesce) intervals if requested.
+ if (EnableJoining) {
+ joinIntervals();
+ DEBUG({
+ dbgs() << "********** INTERVALS POST JOINING **********\n";
+ for (LiveIntervals::iterator I = li_->begin(), E = li_->end();
+ I != E; ++I){
+ I->second->print(dbgs(), tri_);
+ dbgs() << "\n";
+ }
+ });
+ }
+
+ // Perform a final pass over the instructions and compute spill weights
+ // and remove identity moves.
+ SmallVector<unsigned, 4> DeadDefs;
+ for (MachineFunction::iterator mbbi = mf_->begin(), mbbe = mf_->end();
+ mbbi != mbbe; ++mbbi) {
+ MachineBasicBlock* mbb = mbbi;
+ for (MachineBasicBlock::iterator mii = mbb->begin(), mie = mbb->end();
+ mii != mie; ) {
+ MachineInstr *MI = mii;
+ if (JoinedCopies.count(MI)) {
+ // Delete all coalesced copies.
+ bool DoDelete = true;
+ assert(MI->isCopyLike() && "Unrecognized copy instruction");
+ unsigned SrcReg = MI->getOperand(MI->isSubregToReg() ? 2 : 1).getReg();
+ if (TargetRegisterInfo::isPhysicalRegister(SrcReg) &&
+ MI->getNumOperands() > 2)
+ // Do not delete extract_subreg, insert_subreg of physical
+ // registers unless the definition is dead. e.g.
+ // %DO<def> = INSERT_SUBREG %D0<undef>, %S0<kill>, 1
+ // or else the scavenger may complain. LowerSubregs will
+ // delete them later.
+ DoDelete = false;
+
+ if (MI->allDefsAreDead()) {
+ if (TargetRegisterInfo::isVirtualRegister(SrcReg) &&
+ li_->hasInterval(SrcReg))
+ li_->shrinkToUses(&li_->getInterval(SrcReg));
+ DoDelete = true;
+ }
+ if (!DoDelete) {
+ // We need the instruction to adjust liveness, so make it a KILL.
+ if (MI->isSubregToReg()) {
+ MI->RemoveOperand(3);
+ MI->RemoveOperand(1);
+ }
+ MI->setDesc(tii_->get(TargetOpcode::KILL));
+ mii = llvm::next(mii);
+ } else {
+ li_->RemoveMachineInstrFromMaps(MI);
+ mii = mbbi->erase(mii);
+ ++numPeep;
+ }
+ continue;
+ }
+
+ // Now check if this is a remat'ed def instruction which is now dead.
+ if (ReMatDefs.count(MI)) {
+ bool isDead = true;
+ for (unsigned i = 0, e = MI->getNumOperands(); i != e; ++i) {
+ const MachineOperand &MO = MI->getOperand(i);
+ if (!MO.isReg())
+ continue;
+ unsigned Reg = MO.getReg();
+ if (!Reg)
+ continue;
+ if (TargetRegisterInfo::isVirtualRegister(Reg))
+ DeadDefs.push_back(Reg);
+ if (MO.isDead())
+ continue;
+ if (TargetRegisterInfo::isPhysicalRegister(Reg) ||
+ !mri_->use_nodbg_empty(Reg)) {
+ isDead = false;
+ break;
+ }
+ }
+ if (isDead) {
+ while (!DeadDefs.empty()) {
+ unsigned DeadDef = DeadDefs.back();
+ DeadDefs.pop_back();
+ RemoveDeadDef(li_->getInterval(DeadDef), MI);
+ }
+ li_->RemoveMachineInstrFromMaps(mii);
+ mii = mbbi->erase(mii);
+ continue;
+ } else
+ DeadDefs.clear();
+ }
+
+ ++mii;
+
+ // Check for now unnecessary kill flags.
+ if (li_->isNotInMIMap(MI)) continue;
+ SlotIndex DefIdx = li_->getInstructionIndex(MI).getDefIndex();
+ for (unsigned i = 0, e = MI->getNumOperands(); i != e; ++i) {
+ MachineOperand &MO = MI->getOperand(i);
+ if (!MO.isReg() || !MO.isKill()) continue;
+ unsigned reg = MO.getReg();
+ if (!reg || !li_->hasInterval(reg)) continue;
+ if (!li_->getInterval(reg).killedAt(DefIdx)) {
+ MO.setIsKill(false);
+ continue;
+ }
+ // When leaving a kill flag on a physreg, check if any subregs should
+ // remain alive.
+ if (!TargetRegisterInfo::isPhysicalRegister(reg))
+ continue;
+ for (const unsigned *SR = tri_->getSubRegisters(reg);
+ unsigned S = *SR; ++SR)
+ if (li_->hasInterval(S) && li_->getInterval(S).liveAt(DefIdx))
+ MI->addRegisterDefined(S, tri_);
+ }
+ }
+ }
+
+ DEBUG(dump());
+ DEBUG(ldv_->dump());
+ if (VerifyCoalescing)
+ mf_->verify(this, "After register coalescing");
+ return true;
+}
+
+/// print - Implement the dump method.
+void RegisterCoalescer::print(raw_ostream &O, const Module* m) const {
+ li_->print(O, m);
+}
+
+RegisterCoalescer *llvm::createRegisterCoalescer() {
+ return new RegisterCoalescer();
+}
diff --git a/contrib/llvm/lib/CodeGen/SimpleRegisterCoalescing.h b/contrib/llvm/lib/CodeGen/RegisterCoalescer.h
index 92f6c64..4131d91 100644
--- a/contrib/llvm/lib/CodeGen/SimpleRegisterCoalescing.h
+++ b/contrib/llvm/lib/CodeGen/RegisterCoalescer.h
@@ -1,4 +1,4 @@
-//===-- SimpleRegisterCoalescing.h - Register Coalescing --------*- C++ -*-===//
+//===-- RegisterCoalescer.h - Register Coalescing Interface ------*- C++ -*-===//
//
// The LLVM Compiler Infrastructure
//
@@ -7,37 +7,38 @@
//
//===----------------------------------------------------------------------===//
//
-// This file implements a simple register copy coalescing phase.
+// This file contains the abstract interface for register coalescers,
+// allowing them to interact with and query register allocators.
//
//===----------------------------------------------------------------------===//
-#ifndef LLVM_CODEGEN_SIMPLE_REGISTER_COALESCING_H
-#define LLVM_CODEGEN_SIMPLE_REGISTER_COALESCING_H
-
-#include "llvm/CodeGen/MachineFunctionPass.h"
-#include "llvm/CodeGen/LiveIntervalAnalysis.h"
-#include "llvm/CodeGen/RegisterCoalescer.h"
#include "RegisterClassInfo.h"
+#include "llvm/Support/IncludeFile.h"
+#include "llvm/CodeGen/LiveInterval.h"
+#include "llvm/ADT/SmallPtrSet.h"
+
+#ifndef LLVM_CODEGEN_REGISTER_COALESCER_H
+#define LLVM_CODEGEN_REGISTER_COALESCER_H
namespace llvm {
- class SimpleRegisterCoalescing;
- class LiveDebugVariables;
+
+ class MachineFunction;
+ class RegallocQuery;
+ class AnalysisUsage;
+ class MachineInstr;
class TargetRegisterInfo;
+ class TargetRegisterClass;
class TargetInstrInfo;
+ class LiveDebugVariables;
class VirtRegMap;
class MachineLoopInfo;
- /// CopyRec - Representation for copy instructions in coalescer queue.
- ///
- struct CopyRec {
- MachineInstr *MI;
- unsigned LoopDepth;
- CopyRec(MachineInstr *mi, unsigned depth)
- : MI(mi), LoopDepth(depth) {}
- };
+ class CoalescerPair;
- class SimpleRegisterCoalescing : public MachineFunctionPass,
- public RegisterCoalescer {
+ /// An abstract interface for register coalescers. Coalescers must
+ /// implement this interface to be part of the coalescer analysis
+ /// group.
+ class RegisterCoalescer : public MachineFunctionPass {
MachineFunction* mf_;
MachineRegisterInfo* mri_;
const TargetMachine* tm_;
@@ -61,41 +62,20 @@ namespace llvm {
/// been remat'ed.
SmallPtrSet<MachineInstr*, 8> ReMatDefs;
- public:
- static char ID; // Pass identifcation, replacement for typeid
- SimpleRegisterCoalescing() : MachineFunctionPass(ID) {
- initializeSimpleRegisterCoalescingPass(*PassRegistry::getPassRegistry());
- }
-
- virtual void getAnalysisUsage(AnalysisUsage &AU) const;
- virtual void releaseMemory();
-
- /// runOnMachineFunction - pass entry point
- virtual bool runOnMachineFunction(MachineFunction&);
-
- bool coalesceFunction(MachineFunction &mf, RegallocQuery &) {
- // This runs as an independent pass, so don't do anything.
- return false;
- }
-
- /// print - Implement the dump method.
- virtual void print(raw_ostream &O, const Module* = 0) const;
-
- private:
/// joinIntervals - join compatible live intervals
void joinIntervals();
/// CopyCoalesceInMBB - Coalesce copies in the specified MBB, putting
/// copies that cannot yet be coalesced into the "TryAgain" list.
void CopyCoalesceInMBB(MachineBasicBlock *MBB,
- std::vector<CopyRec> &TryAgain);
+ std::vector<MachineInstr*> &TryAgain);
/// JoinCopy - Attempt to join intervals corresponding to SrcReg/DstReg,
/// which are the src/dst of the copy instruction CopyMI. This returns true
/// if the copy was successfully coalesced away. If it is not currently
/// possible to coalesce this interval, but it may be possible if other
/// things get coalesced, then it returns true by reference in 'Again'.
- bool JoinCopy(CopyRec &TheCopy, bool &Again);
+ bool JoinCopy(MachineInstr *TheCopy, bool &Again);
/// JoinIntervals - Attempt to join these two intervals. On failure, this
/// returns false. The output "SrcInt" will not have been modified, so we can
@@ -155,8 +135,109 @@ namespace llvm {
/// markAsJoined - Remember that CopyMI has already been joined.
void markAsJoined(MachineInstr *CopyMI);
+
+ public:
+ static char ID; // Class identification, replacement for typeinfo
+ RegisterCoalescer() : MachineFunctionPass(ID) {
+ initializeRegisterCoalescerPass(*PassRegistry::getPassRegistry());
+ }
+
+ /// Register allocators must call this from their own
+ /// getAnalysisUsage to cover the case where the coalescer is not
+ /// a Pass in the proper sense and isn't managed by PassManager.
+ /// PassManager needs to know which analyses to make available and
+ /// which to invalidate when running the register allocator or any
+ /// pass that might call coalescing. The long-term solution is to
+ /// allow hierarchies of PassManagers.
+ virtual void getAnalysisUsage(AnalysisUsage &AU) const;
+
+ virtual void releaseMemory();
+
+ /// runOnMachineFunction - pass entry point
+ virtual bool runOnMachineFunction(MachineFunction&);
+
+ /// print - Implement the dump method.
+ virtual void print(raw_ostream &O, const Module* = 0) const;
};
+ /// CoalescerPair - A helper class for register coalescers. When deciding if
+ /// two registers can be coalesced, CoalescerPair can determine if a copy
+ /// instruction would become an identity copy after coalescing.
+ class CoalescerPair {
+ const TargetInstrInfo &tii_;
+ const TargetRegisterInfo &tri_;
+
+ /// dstReg_ - The register that will be left after coalescing. It can be a
+ /// virtual or physical register.
+ unsigned dstReg_;
+
+ /// srcReg_ - the virtual register that will be coalesced into dstReg.
+ unsigned srcReg_;
+
+ /// subReg_ - The subregister index of srcReg in dstReg_. It is possible the
+ /// coalesce srcReg_ into a subreg of the larger dstReg_ when dstReg_ is a
+ /// virtual register.
+ unsigned subIdx_;
+
+ /// partial_ - True when the original copy was a partial subregister copy.
+ bool partial_;
+
+ /// crossClass_ - True when both regs are virtual, and newRC is constrained.
+ bool crossClass_;
+
+ /// flipped_ - True when DstReg and SrcReg are reversed from the oriignal copy
+ /// instruction.
+ bool flipped_;
+
+ /// newRC_ - The register class of the coalesced register, or NULL if dstReg_
+ /// is a physreg.
+ const TargetRegisterClass *newRC_;
+
+ public:
+ CoalescerPair(const TargetInstrInfo &tii, const TargetRegisterInfo &tri)
+ : tii_(tii), tri_(tri), dstReg_(0), srcReg_(0), subIdx_(0),
+ partial_(false), crossClass_(false), flipped_(false), newRC_(0) {}
+
+ /// setRegisters - set registers to match the copy instruction MI. Return
+ /// false if MI is not a coalescable copy instruction.
+ bool setRegisters(const MachineInstr*);
+
+ /// flip - Swap srcReg_ and dstReg_. Return false if swapping is impossible
+ /// because dstReg_ is a physical register, or subIdx_ is set.
+ bool flip();
+
+ /// isCoalescable - Return true if MI is a copy instruction that will become
+ /// an identity copy after coalescing.
+ bool isCoalescable(const MachineInstr*) const;
+
+ /// isPhys - Return true if DstReg is a physical register.
+ bool isPhys() const { return !newRC_; }
+
+ /// isPartial - Return true if the original copy instruction did not copy the
+ /// full register, but was a subreg operation.
+ bool isPartial() const { return partial_; }
+
+ /// isCrossClass - Return true if DstReg is virtual and NewRC is a smaller register class than DstReg's.
+ bool isCrossClass() const { return crossClass_; }
+
+ /// isFlipped - Return true when getSrcReg is the register being defined by
+ /// the original copy instruction.
+ bool isFlipped() const { return flipped_; }
+
+ /// getDstReg - Return the register (virtual or physical) that will remain
+ /// after coalescing.
+ unsigned getDstReg() const { return dstReg_; }
+
+ /// getSrcReg - Return the virtual register that will be coalesced away.
+ unsigned getSrcReg() const { return srcReg_; }
+
+ /// getSubIdx - Return the subregister index in DstReg that SrcReg will be
+ /// coalesced into, or 0.
+ unsigned getSubIdx() const { return subIdx_; }
+
+ /// getNewRC - Return the register class of the coalesced register.
+ const TargetRegisterClass *getNewRC() const { return newRC_; }
+ };
} // End llvm namespace
#endif
diff --git a/contrib/llvm/lib/CodeGen/RenderMachineFunction.cpp b/contrib/llvm/lib/CodeGen/RenderMachineFunction.cpp
index c8de382..8b02ec4 100644
--- a/contrib/llvm/lib/CodeGen/RenderMachineFunction.cpp
+++ b/contrib/llvm/lib/CodeGen/RenderMachineFunction.cpp
@@ -434,8 +434,7 @@ namespace llvm {
rcEnd = tri->regclass_end();
rcItr != rcEnd; ++rcItr) {
const TargetRegisterClass *trc = *rcItr;
- unsigned capacity = std::distance(trc->allocation_order_begin(*mf),
- trc->allocation_order_end(*mf));
+ unsigned capacity = trc->getRawAllocationOrder(*mf).size();
if (capacity != 0)
capacityMap[trc] = capacity;
@@ -482,8 +481,7 @@ namespace llvm {
rcItr != rcEnd; ++rcItr) {
const TargetRegisterClass *trc = *rcItr;
- if (trc->allocation_order_begin(*mf) ==
- trc->allocation_order_end(*mf))
+ if (trc->getRawAllocationOrder(*mf).empty())
continue;
unsigned worstAtI = getWorst(li->reg, trc);
diff --git a/contrib/llvm/lib/CodeGen/ScheduleDAG.cpp b/contrib/llvm/lib/CodeGen/ScheduleDAG.cpp
index 1302395..21375b2 100644
--- a/contrib/llvm/lib/CodeGen/ScheduleDAG.cpp
+++ b/contrib/llvm/lib/CodeGen/ScheduleDAG.cpp
@@ -19,23 +19,33 @@
#include "llvm/Target/TargetMachine.h"
#include "llvm/Target/TargetInstrInfo.h"
#include "llvm/Target/TargetRegisterInfo.h"
+#include "llvm/Support/CommandLine.h"
#include "llvm/Support/Debug.h"
#include "llvm/Support/raw_ostream.h"
#include <climits>
using namespace llvm;
+#ifndef NDEBUG
+cl::opt<bool> StressSchedOpt(
+ "stress-sched", cl::Hidden, cl::init(false),
+ cl::desc("Stress test instruction scheduling"));
+#endif
+
ScheduleDAG::ScheduleDAG(MachineFunction &mf)
: TM(mf.getTarget()),
TII(TM.getInstrInfo()),
TRI(TM.getRegisterInfo()),
MF(mf), MRI(mf.getRegInfo()),
EntrySU(), ExitSU() {
+#ifndef NDEBUG
+ StressSched = StressSchedOpt;
+#endif
}
ScheduleDAG::~ScheduleDAG() {}
/// getInstrDesc helper to handle SDNodes.
-const TargetInstrDesc *ScheduleDAG::getNodeDesc(const SDNode *Node) const {
+const MCInstrDesc *ScheduleDAG::getNodeDesc(const SDNode *Node) const {
if (!Node || !Node->isMachineOpcode()) return NULL;
return &TII->get(Node->getMachineOpcode());
}
@@ -307,6 +317,8 @@ void SUnit::dumpAll(const ScheduleDAG *G) const {
if (I->isArtificial())
dbgs() << " *";
dbgs() << ": Latency=" << I->getLatency();
+ if (I->isAssignedRegDep())
+ dbgs() << " Reg=" << G->TRI->getName(I->getReg());
dbgs() << "\n";
}
}
diff --git a/contrib/llvm/lib/CodeGen/ScheduleDAGEmit.cpp b/contrib/llvm/lib/CodeGen/ScheduleDAGEmit.cpp
index 6b7a8c64..f8b1bc7 100644
--- a/contrib/llvm/lib/CodeGen/ScheduleDAGEmit.cpp
+++ b/contrib/llvm/lib/CodeGen/ScheduleDAGEmit.cpp
@@ -45,6 +45,7 @@ void ScheduleDAG::EmitPhysRegCopy(SUnit *SU,
unsigned Reg = 0;
for (SUnit::const_succ_iterator II = SU->Succs.begin(),
EE = SU->Succs.end(); II != EE; ++II) {
+ if (II->isCtrl()) continue; // ignore chain preds
if (II->getReg()) {
Reg = II->getReg();
break;
diff --git a/contrib/llvm/lib/CodeGen/ScheduleDAGInstrs.cpp b/contrib/llvm/lib/CodeGen/ScheduleDAGInstrs.cpp
index 2363df4..446adfc 100644
--- a/contrib/llvm/lib/CodeGen/ScheduleDAGInstrs.cpp
+++ b/contrib/llvm/lib/CodeGen/ScheduleDAGInstrs.cpp
@@ -21,10 +21,11 @@
#include "llvm/CodeGen/MachineMemOperand.h"
#include "llvm/CodeGen/MachineRegisterInfo.h"
#include "llvm/CodeGen/PseudoSourceValue.h"
+#include "llvm/MC/MCInstrItineraries.h"
#include "llvm/Target/TargetMachine.h"
#include "llvm/Target/TargetInstrInfo.h"
#include "llvm/Target/TargetRegisterInfo.h"
-#include "llvm/Target/TargetSubtarget.h"
+#include "llvm/Target/TargetSubtargetInfo.h"
#include "llvm/Support/Debug.h"
#include "llvm/Support/raw_ostream.h"
#include "llvm/ADT/SmallSet.h"
@@ -205,7 +206,7 @@ void ScheduleDAGInstrs::BuildSchedGraph(AliasAnalysis *AA) {
bool UnitLatencies = ForceUnitLatencies();
// Ask the target if address-backscheduling is desirable, and if so how much.
- const TargetSubtarget &ST = TM.getSubtarget<TargetSubtarget>();
+ const TargetSubtargetInfo &ST = TM.getSubtarget<TargetSubtargetInfo>();
unsigned SpecialAddressLatency = ST.getSpecialAddressLatency();
// Remove any stale debug info; sometimes BuildSchedGraph is called again
@@ -236,13 +237,13 @@ void ScheduleDAGInstrs::BuildSchedGraph(AliasAnalysis *AA) {
continue;
}
- const TargetInstrDesc &TID = MI->getDesc();
- assert(!TID.isTerminator() && !MI->isLabel() &&
+ const MCInstrDesc &MCID = MI->getDesc();
+ assert(!MCID.isTerminator() && !MI->isLabel() &&
"Cannot schedule terminators or labels!");
// Create the SUnit for this MI.
SUnit *SU = NewSUnit(MI);
- SU->isCall = TID.isCall();
- SU->isCommutable = TID.isCommutable();
+ SU->isCall = MCID.isCall();
+ SU->isCommutable = MCID.isCommutable();
// Assign the Latency field of SU using target-provided information.
if (UnitLatencies)
@@ -309,13 +310,13 @@ void ScheduleDAGInstrs::BuildSchedGraph(AliasAnalysis *AA) {
if (SpecialAddressLatency != 0 && !UnitLatencies &&
UseSU != &ExitSU) {
MachineInstr *UseMI = UseSU->getInstr();
- const TargetInstrDesc &UseTID = UseMI->getDesc();
+ const MCInstrDesc &UseMCID = UseMI->getDesc();
int RegUseIndex = UseMI->findRegisterUseOperandIdx(Reg);
assert(RegUseIndex >= 0 && "UseMI doesn's use register!");
if (RegUseIndex >= 0 &&
- (UseTID.mayLoad() || UseTID.mayStore()) &&
- (unsigned)RegUseIndex < UseTID.getNumOperands() &&
- UseTID.OpInfo[RegUseIndex].isLookupPtrRegClass())
+ (UseMCID.mayLoad() || UseMCID.mayStore()) &&
+ (unsigned)RegUseIndex < UseMCID.getNumOperands() &&
+ UseMCID.OpInfo[RegUseIndex].isLookupPtrRegClass())
LDataLatency += SpecialAddressLatency;
}
// Adjust the dependence latency using operand def/use
@@ -352,17 +353,17 @@ void ScheduleDAGInstrs::BuildSchedGraph(AliasAnalysis *AA) {
unsigned Count = I->second.second;
const MachineInstr *UseMI = UseMO->getParent();
unsigned UseMOIdx = UseMO - &UseMI->getOperand(0);
- const TargetInstrDesc &UseTID = UseMI->getDesc();
+ const MCInstrDesc &UseMCID = UseMI->getDesc();
// TODO: If we knew the total depth of the region here, we could
// handle the case where the whole loop is inside the region but
// is large enough that the isScheduleHigh trick isn't needed.
- if (UseMOIdx < UseTID.getNumOperands()) {
+ if (UseMOIdx < UseMCID.getNumOperands()) {
// Currently, we only support scheduling regions consisting of
// single basic blocks. Check to see if the instruction is in
// the same region by checking to see if it has the same parent.
if (UseMI->getParent() != MI->getParent()) {
unsigned Latency = SU->Latency;
- if (UseTID.OpInfo[UseMOIdx].isLookupPtrRegClass())
+ if (UseMCID.OpInfo[UseMOIdx].isLookupPtrRegClass())
Latency += SpecialAddressLatency;
// This is a wild guess as to the portion of the latency which
// will be overlapped by work done outside the current
@@ -374,7 +375,7 @@ void ScheduleDAGInstrs::BuildSchedGraph(AliasAnalysis *AA) {
/*isMustAlias=*/false,
/*isArtificial=*/true));
} else if (SpecialAddressLatency > 0 &&
- UseTID.OpInfo[UseMOIdx].isLookupPtrRegClass()) {
+ UseMCID.OpInfo[UseMOIdx].isLookupPtrRegClass()) {
// The entire loop body is within the current scheduling region
// and the latency of this operation is assumed to be greater
// than the latency of the loop.
@@ -417,9 +418,9 @@ void ScheduleDAGInstrs::BuildSchedGraph(AliasAnalysis *AA) {
// produce more precise dependence information.
#define STORE_LOAD_LATENCY 1
unsigned TrueMemOrderLatency = 0;
- if (TID.isCall() || MI->hasUnmodeledSideEffects() ||
+ if (MCID.isCall() || MI->hasUnmodeledSideEffects() ||
(MI->hasVolatileMemoryRef() &&
- (!TID.mayLoad() || !MI->isInvariantLoad(AA)))) {
+ (!MCID.mayLoad() || !MI->isInvariantLoad(AA)))) {
// Be conservative with these and add dependencies on all memory
// references, even those that are known to not alias.
for (std::map<const Value *, SUnit *>::iterator I =
@@ -458,7 +459,7 @@ void ScheduleDAGInstrs::BuildSchedGraph(AliasAnalysis *AA) {
PendingLoads.clear();
AliasMemDefs.clear();
AliasMemUses.clear();
- } else if (TID.mayStore()) {
+ } else if (MCID.mayStore()) {
bool MayAlias = true;
TrueMemOrderLatency = STORE_LOAD_LATENCY;
if (const Value *V = getUnderlyingObjectForInstr(MI, MFI, MayAlias)) {
@@ -514,7 +515,7 @@ void ScheduleDAGInstrs::BuildSchedGraph(AliasAnalysis *AA) {
/*Reg=*/0, /*isNormalMemory=*/false,
/*isMustAlias=*/false,
/*isArtificial=*/true));
- } else if (TID.mayLoad()) {
+ } else if (MCID.mayLoad()) {
bool MayAlias = true;
TrueMemOrderLatency = 0;
if (MI->isInvariantLoad(AA)) {
diff --git a/contrib/llvm/lib/CodeGen/ScoreboardHazardRecognizer.cpp b/contrib/llvm/lib/CodeGen/ScoreboardHazardRecognizer.cpp
index e6d7ded..0e005d3 100644
--- a/contrib/llvm/lib/CodeGen/ScoreboardHazardRecognizer.cpp
+++ b/contrib/llvm/lib/CodeGen/ScoreboardHazardRecognizer.cpp
@@ -16,11 +16,11 @@
#define DEBUG_TYPE ::llvm::ScoreboardHazardRecognizer::DebugType
#include "llvm/CodeGen/ScoreboardHazardRecognizer.h"
#include "llvm/CodeGen/ScheduleDAG.h"
+#include "llvm/MC/MCInstrItineraries.h"
#include "llvm/Support/Debug.h"
#include "llvm/Support/ErrorHandling.h"
#include "llvm/Support/raw_ostream.h"
#include "llvm/Target/TargetInstrInfo.h"
-#include "llvm/Target/TargetInstrItineraries.h"
using namespace llvm;
@@ -115,12 +115,12 @@ ScoreboardHazardRecognizer::getHazardType(SUnit *SU, int Stalls) {
// Use the itinerary for the underlying instruction to check for
// free FU's in the scoreboard at the appropriate future cycles.
- const TargetInstrDesc *TID = DAG->getInstrDesc(SU);
- if (TID == NULL) {
+ const MCInstrDesc *MCID = DAG->getInstrDesc(SU);
+ if (MCID == NULL) {
// Don't check hazards for non-machineinstr Nodes.
return NoHazard;
}
- unsigned idx = TID->getSchedClass();
+ unsigned idx = MCID->getSchedClass();
for (const InstrStage *IS = ItinData->beginStage(idx),
*E = ItinData->endStage(idx); IS != E; ++IS) {
// We must find one of the stage's units free for every cycle the
@@ -173,16 +173,16 @@ void ScoreboardHazardRecognizer::EmitInstruction(SUnit *SU) {
// Use the itinerary for the underlying instruction to reserve FU's
// in the scoreboard at the appropriate future cycles.
- const TargetInstrDesc *TID = DAG->getInstrDesc(SU);
- assert(TID && "The scheduler must filter non-machineinstrs");
- if (DAG->TII->isZeroCost(TID->Opcode))
+ const MCInstrDesc *MCID = DAG->getInstrDesc(SU);
+ assert(MCID && "The scheduler must filter non-machineinstrs");
+ if (DAG->TII->isZeroCost(MCID->Opcode))
return;
++IssueCount;
unsigned cycle = 0;
- unsigned idx = TID->getSchedClass();
+ unsigned idx = MCID->getSchedClass();
for (const InstrStage *IS = ItinData->beginStage(idx),
*E = ItinData->endStage(idx); IS != E; ++IS) {
// We must reserve one of the stage's units for every cycle the
diff --git a/contrib/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp b/contrib/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp
index e843f5f..4f0d2ca 100644
--- a/contrib/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp
+++ b/contrib/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp
@@ -138,6 +138,10 @@ namespace {
SDValue PromoteExtend(SDValue Op);
bool PromoteLoad(SDValue Op);
+ void ExtendSetCCUses(SmallVector<SDNode*, 4> SetCCs,
+ SDValue Trunc, SDValue ExtLoad, DebugLoc DL,
+ ISD::NodeType ExtType);
+
/// combine - call the node-specific routine that knows how to fold each
/// particular type of node. If that doesn't do anything, try the
/// target-specific DAG combines.
@@ -234,6 +238,9 @@ namespace {
SDValue ConstantFoldBITCASTofBUILD_VECTOR(SDNode *, EVT);
SDValue BuildSDIV(SDNode *N);
SDValue BuildUDIV(SDNode *N);
+ SDValue MatchBSwapHWordLow(SDNode *N, SDValue N0, SDValue N1,
+ bool DemandHighBits = true);
+ SDValue MatchBSwapHWord(SDNode *N, SDValue N0, SDValue N1);
SDNode *MatchRotate(SDValue LHS, SDValue RHS, DebugLoc DL);
SDValue ReduceLoadWidth(SDNode *N);
SDValue ReduceLoadOpStoreWidth(SDNode *N);
@@ -994,7 +1001,7 @@ void DAGCombiner::Run(CombineLevel AtLevel) {
dbgs() << "\nWith: ";
RV.getNode()->dump(&DAG);
dbgs() << '\n');
-
+
// Transfer debug value.
DAG.TransferDbgValues(SDValue(N, 0), RV);
WorkListRemover DeadNodes(*this);
@@ -1303,16 +1310,6 @@ SDValue combineShlAddConstant(DebugLoc DL, SDValue N0, SDValue N1,
return SDValue();
}
-/// isCarryMaterialization - Returns true if V is an ADDE node that is known to
-/// return 0 or 1 depending on the carry flag.
-static bool isCarryMaterialization(SDValue V) {
- if (V.getOpcode() != ISD::ADDE)
- return false;
-
- ConstantSDNode *C = dyn_cast<ConstantSDNode>(V.getOperand(0));
- return C && C->isNullValue() && V.getOperand(0) == V.getOperand(1);
-}
-
SDValue DAGCombiner::visitADD(SDNode *N) {
SDValue N0 = N->getOperand(0);
SDValue N1 = N->getOperand(1);
@@ -1476,18 +1473,6 @@ SDValue DAGCombiner::visitADD(SDNode *N) {
return DAG.getNode(ISD::SUB, DL, VT, N1, ZExt);
}
- // add (adde 0, 0, glue), X -> adde X, 0, glue
- if (N0->hasOneUse() && isCarryMaterialization(N0))
- return DAG.getNode(ISD::ADDE, N->getDebugLoc(),
- DAG.getVTList(VT, MVT::Glue), N1, N0.getOperand(0),
- N0.getOperand(2));
-
- // add X, (adde 0, 0, glue) -> adde X, 0, glue
- if (N1->hasOneUse() && isCarryMaterialization(N1))
- return DAG.getNode(ISD::ADDE, N->getDebugLoc(),
- DAG.getVTList(VT, MVT::Glue), N0, N1.getOperand(0),
- N1.getOperand(2));
-
return SDValue();
}
@@ -1531,16 +1516,6 @@ SDValue DAGCombiner::visitADDC(SDNode *N) {
N->getDebugLoc(), MVT::Glue));
}
- // addc (adde 0, 0, glue), X -> adde X, 0, glue
- if (N0->hasOneUse() && isCarryMaterialization(N0))
- return DAG.getNode(ISD::ADDE, N->getDebugLoc(), N->getVTList(), N1,
- DAG.getConstant(0, VT), N0.getOperand(2));
-
- // addc X, (adde 0, 0, glue) -> adde X, 0, glue
- if (N1->hasOneUse() && isCarryMaterialization(N1))
- return DAG.getNode(ISD::ADDE, N->getDebugLoc(), N->getVTList(), N0,
- DAG.getConstant(0, VT), N1.getOperand(2));
-
return SDValue();
}
@@ -1591,6 +1566,8 @@ SDValue DAGCombiner::visitSUB(SDNode *N) {
SDValue N1 = N->getOperand(1);
ConstantSDNode *N0C = dyn_cast<ConstantSDNode>(N0.getNode());
ConstantSDNode *N1C = dyn_cast<ConstantSDNode>(N1.getNode());
+ ConstantSDNode *N1C1 = N1.getOpcode() != ISD::ADD ? 0 :
+ dyn_cast<ConstantSDNode>(N1.getOperand(1).getNode());
EVT VT = N0.getValueType();
// fold vector ops
@@ -1622,6 +1599,12 @@ SDValue DAGCombiner::visitSUB(SDNode *N) {
// fold (A+B)-B -> A
if (N0.getOpcode() == ISD::ADD && N0.getOperand(1) == N1)
return N0.getOperand(0);
+ // fold C2-(A+C1) -> (C2-C1)-A
+ if (N1.getOpcode() == ISD::ADD && N0C && N1C1) {
+ SDValue NewC = DAG.getConstant((N0C->getAPIntValue() - N1C1->getAPIntValue()), VT);
+ return DAG.getNode(ISD::SUB, N->getDebugLoc(), VT, NewC,
+ N1.getOperand(0));
+ }
// fold ((A+(B+or-C))-B) -> A+or-C
if (N0.getOpcode() == ISD::ADD &&
(N0.getOperand(1).getOpcode() == ISD::SUB ||
@@ -2508,6 +2491,244 @@ SDValue DAGCombiner::visitAND(SDNode *N) {
return SDValue();
}
+/// MatchBSwapHWord - Match (a >> 8) | (a << 8) as (bswap a) >> 16
+///
+SDValue DAGCombiner::MatchBSwapHWordLow(SDNode *N, SDValue N0, SDValue N1,
+ bool DemandHighBits) {
+ if (!LegalOperations)
+ return SDValue();
+
+ EVT VT = N->getValueType(0);
+ if (VT != MVT::i64 && VT != MVT::i32 && VT != MVT::i16)
+ return SDValue();
+ if (!TLI.isOperationLegal(ISD::BSWAP, VT))
+ return SDValue();
+
+ // Recognize (and (shl a, 8), 0xff), (and (srl a, 8), 0xff00)
+ bool LookPassAnd0 = false;
+ bool LookPassAnd1 = false;
+ if (N0.getOpcode() == ISD::AND && N0.getOperand(0).getOpcode() == ISD::SRL)
+ std::swap(N0, N1);
+ if (N1.getOpcode() == ISD::AND && N1.getOperand(0).getOpcode() == ISD::SHL)
+ std::swap(N0, N1);
+ if (N0.getOpcode() == ISD::AND) {
+ if (!N0.getNode()->hasOneUse())
+ return SDValue();
+ ConstantSDNode *N01C = dyn_cast<ConstantSDNode>(N0.getOperand(1));
+ if (!N01C || N01C->getZExtValue() != 0xFF00)
+ return SDValue();
+ N0 = N0.getOperand(0);
+ LookPassAnd0 = true;
+ }
+
+ if (N1.getOpcode() == ISD::AND) {
+ if (!N1.getNode()->hasOneUse())
+ return SDValue();
+ ConstantSDNode *N11C = dyn_cast<ConstantSDNode>(N1.getOperand(1));
+ if (!N11C || N11C->getZExtValue() != 0xFF)
+ return SDValue();
+ N1 = N1.getOperand(0);
+ LookPassAnd1 = true;
+ }
+
+ if (N0.getOpcode() == ISD::SRL && N1.getOpcode() == ISD::SHL)
+ std::swap(N0, N1);
+ if (N0.getOpcode() != ISD::SHL || N1.getOpcode() != ISD::SRL)
+ return SDValue();
+ if (!N0.getNode()->hasOneUse() ||
+ !N1.getNode()->hasOneUse())
+ return SDValue();
+
+ ConstantSDNode *N01C = dyn_cast<ConstantSDNode>(N0.getOperand(1));
+ ConstantSDNode *N11C = dyn_cast<ConstantSDNode>(N1.getOperand(1));
+ if (!N01C || !N11C)
+ return SDValue();
+ if (N01C->getZExtValue() != 8 || N11C->getZExtValue() != 8)
+ return SDValue();
+
+ // Look for (shl (and a, 0xff), 8), (srl (and a, 0xff00), 8)
+ SDValue N00 = N0->getOperand(0);
+ if (!LookPassAnd0 && N00.getOpcode() == ISD::AND) {
+ if (!N00.getNode()->hasOneUse())
+ return SDValue();
+ ConstantSDNode *N001C = dyn_cast<ConstantSDNode>(N00.getOperand(1));
+ if (!N001C || N001C->getZExtValue() != 0xFF)
+ return SDValue();
+ N00 = N00.getOperand(0);
+ LookPassAnd0 = true;
+ }
+
+ SDValue N10 = N1->getOperand(0);
+ if (!LookPassAnd1 && N10.getOpcode() == ISD::AND) {
+ if (!N10.getNode()->hasOneUse())
+ return SDValue();
+ ConstantSDNode *N101C = dyn_cast<ConstantSDNode>(N10.getOperand(1));
+ if (!N101C || N101C->getZExtValue() != 0xFF00)
+ return SDValue();
+ N10 = N10.getOperand(0);
+ LookPassAnd1 = true;
+ }
+
+ if (N00 != N10)
+ return SDValue();
+
+ // Make sure everything beyond the low halfword is zero since the SRL 16
+ // will clear the top bits.
+ unsigned OpSizeInBits = VT.getSizeInBits();
+ if (DemandHighBits && OpSizeInBits > 16 &&
+ (!LookPassAnd0 || !LookPassAnd1) &&
+ !DAG.MaskedValueIsZero(N10, APInt::getHighBitsSet(OpSizeInBits, 16)))
+ return SDValue();
+
+ SDValue Res = DAG.getNode(ISD::BSWAP, N->getDebugLoc(), VT, N00);
+ if (OpSizeInBits > 16)
+ Res = DAG.getNode(ISD::SRL, N->getDebugLoc(), VT, Res,
+ DAG.getConstant(OpSizeInBits-16, getShiftAmountTy(VT)));
+ return Res;
+}
+
+/// isBSwapHWordElement - Return true if the specified node is an element
+/// that makes up a 32-bit packed halfword byteswap. i.e.
+/// ((x&0xff)<<8)|((x&0xff00)>>8)|((x&0x00ff0000)<<8)|((x&0xff000000)>>8)
+static bool isBSwapHWordElement(SDValue N, SmallVector<SDNode*,4> &Parts) {
+ if (!N.getNode()->hasOneUse())
+ return false;
+
+ unsigned Opc = N.getOpcode();
+ if (Opc != ISD::AND && Opc != ISD::SHL && Opc != ISD::SRL)
+ return false;
+
+ ConstantSDNode *N1C = dyn_cast<ConstantSDNode>(N.getOperand(1));
+ if (!N1C)
+ return false;
+
+ unsigned Num;
+ switch (N1C->getZExtValue()) {
+ default:
+ return false;
+ case 0xFF: Num = 0; break;
+ case 0xFF00: Num = 1; break;
+ case 0xFF0000: Num = 2; break;
+ case 0xFF000000: Num = 3; break;
+ }
+
+ // Look for (x & 0xff) << 8 as well as ((x << 8) & 0xff00).
+ SDValue N0 = N.getOperand(0);
+ if (Opc == ISD::AND) {
+ if (Num == 0 || Num == 2) {
+ // (x >> 8) & 0xff
+ // (x >> 8) & 0xff0000
+ if (N0.getOpcode() != ISD::SRL)
+ return false;
+ ConstantSDNode *C = dyn_cast<ConstantSDNode>(N0.getOperand(1));
+ if (!C || C->getZExtValue() != 8)
+ return false;
+ } else {
+ // (x << 8) & 0xff00
+ // (x << 8) & 0xff000000
+ if (N0.getOpcode() != ISD::SHL)
+ return false;
+ ConstantSDNode *C = dyn_cast<ConstantSDNode>(N0.getOperand(1));
+ if (!C || C->getZExtValue() != 8)
+ return false;
+ }
+ } else if (Opc == ISD::SHL) {
+ // (x & 0xff) << 8
+ // (x & 0xff0000) << 8
+ if (Num != 0 && Num != 2)
+ return false;
+ ConstantSDNode *C = dyn_cast<ConstantSDNode>(N.getOperand(1));
+ if (!C || C->getZExtValue() != 8)
+ return false;
+ } else { // Opc == ISD::SRL
+ // (x & 0xff00) >> 8
+ // (x & 0xff000000) >> 8
+ if (Num != 1 && Num != 3)
+ return false;
+ ConstantSDNode *C = dyn_cast<ConstantSDNode>(N.getOperand(1));
+ if (!C || C->getZExtValue() != 8)
+ return false;
+ }
+
+ if (Parts[Num])
+ return false;
+
+ Parts[Num] = N0.getOperand(0).getNode();
+ return true;
+}
+
+/// MatchBSwapHWord - Match a 32-bit packed halfword bswap. That is
+/// ((x&0xff)<<8)|((x&0xff00)>>8)|((x&0x00ff0000)<<8)|((x&0xff000000)>>8)
+/// => (rotl (bswap x), 16)
+SDValue DAGCombiner::MatchBSwapHWord(SDNode *N, SDValue N0, SDValue N1) {
+ if (!LegalOperations)
+ return SDValue();
+
+ EVT VT = N->getValueType(0);
+ if (VT != MVT::i32)
+ return SDValue();
+ if (!TLI.isOperationLegal(ISD::BSWAP, VT))
+ return SDValue();
+
+ SmallVector<SDNode*,4> Parts(4, (SDNode*)0);
+ // Look for either
+ // (or (or (and), (and)), (or (and), (and)))
+ // (or (or (or (and), (and)), (and)), (and))
+ if (N0.getOpcode() != ISD::OR)
+ return SDValue();
+ SDValue N00 = N0.getOperand(0);
+ SDValue N01 = N0.getOperand(1);
+
+ if (N1.getOpcode() == ISD::OR) {
+ // (or (or (and), (and)), (or (and), (and)))
+ SDValue N000 = N00.getOperand(0);
+ if (!isBSwapHWordElement(N000, Parts))
+ return SDValue();
+
+ SDValue N001 = N00.getOperand(1);
+ if (!isBSwapHWordElement(N001, Parts))
+ return SDValue();
+ SDValue N010 = N01.getOperand(0);
+ if (!isBSwapHWordElement(N010, Parts))
+ return SDValue();
+ SDValue N011 = N01.getOperand(1);
+ if (!isBSwapHWordElement(N011, Parts))
+ return SDValue();
+ } else {
+ // (or (or (or (and), (and)), (and)), (and))
+ if (!isBSwapHWordElement(N1, Parts))
+ return SDValue();
+ if (!isBSwapHWordElement(N01, Parts))
+ return SDValue();
+ if (N00.getOpcode() != ISD::OR)
+ return SDValue();
+ SDValue N000 = N00.getOperand(0);
+ if (!isBSwapHWordElement(N000, Parts))
+ return SDValue();
+ SDValue N001 = N00.getOperand(1);
+ if (!isBSwapHWordElement(N001, Parts))
+ return SDValue();
+ }
+
+ // Make sure the parts are all coming from the same node.
+ if (Parts[0] != Parts[1] || Parts[0] != Parts[2] || Parts[0] != Parts[3])
+ return SDValue();
+
+ SDValue BSwap = DAG.getNode(ISD::BSWAP, N->getDebugLoc(), VT,
+ SDValue(Parts[0],0));
+
+ // Result of the bswap should be rotated by 16. If it's not legal, than
+ // do (x << 16) | (x >> 16).
+ SDValue ShAmt = DAG.getConstant(16, getShiftAmountTy(VT));
+ if (TLI.isOperationLegalOrCustom(ISD::ROTL, VT))
+ return DAG.getNode(ISD::ROTL, N->getDebugLoc(), VT, BSwap, ShAmt);
+ else if (TLI.isOperationLegalOrCustom(ISD::ROTR, VT))
+ return DAG.getNode(ISD::ROTR, N->getDebugLoc(), VT, BSwap, ShAmt);
+ return DAG.getNode(ISD::OR, N->getDebugLoc(), VT,
+ DAG.getNode(ISD::SHL, N->getDebugLoc(), VT, BSwap, ShAmt),
+ DAG.getNode(ISD::SRL, N->getDebugLoc(), VT, BSwap, ShAmt));
+}
+
SDValue DAGCombiner::visitOR(SDNode *N) {
SDValue N0 = N->getOperand(0);
SDValue N1 = N->getOperand(1);
@@ -2543,6 +2764,15 @@ SDValue DAGCombiner::visitOR(SDNode *N) {
// fold (or x, c) -> c iff (x & ~c) == 0
if (N1C && DAG.MaskedValueIsZero(N0, ~N1C->getAPIntValue()))
return N1;
+
+ // Recognize halfword bswaps as (bswap + rotl 16) or (bswap + shl 16)
+ SDValue BSwap = MatchBSwapHWord(N, N0, N1);
+ if (BSwap.getNode() != 0)
+ return BSwap;
+ BSwap = MatchBSwapHWordLow(N, N0, N1);
+ if (BSwap.getNode() != 0)
+ return BSwap;
+
// reassociate or
SDValue ROR = ReassociateOps(ISD::OR, N->getDebugLoc(), N0, N1);
if (ROR.getNode() != 0)
@@ -3030,6 +3260,9 @@ SDValue DAGCombiner::visitSHL(SDNode *N) {
// fold (shl x, 0) -> x
if (N1C && N1C->isNullValue())
return N0;
+ // fold (shl undef, x) -> 0
+ if (N0.getOpcode() == ISD::UNDEF)
+ return DAG.getConstant(0, VT);
// if (shl x, c) is known to be zero, return 0
if (DAG.MaskedValueIsZero(SDValue(N, 0),
APInt::getAllOnesValue(OpSizeInBits)))
@@ -3696,6 +3929,28 @@ static bool ExtendUsesToFormExtLoad(SDNode *N, SDValue N0,
return true;
}
+void DAGCombiner::ExtendSetCCUses(SmallVector<SDNode*, 4> SetCCs,
+ SDValue Trunc, SDValue ExtLoad, DebugLoc DL,
+ ISD::NodeType ExtType) {
+ // Extend SetCC uses if necessary.
+ for (unsigned i = 0, e = SetCCs.size(); i != e; ++i) {
+ SDNode *SetCC = SetCCs[i];
+ SmallVector<SDValue, 4> Ops;
+
+ for (unsigned j = 0; j != 2; ++j) {
+ SDValue SOp = SetCC->getOperand(j);
+ if (SOp == Trunc)
+ Ops.push_back(ExtLoad);
+ else
+ Ops.push_back(DAG.getNode(ExtType, DL, ExtLoad->getValueType(0), SOp));
+ }
+
+ Ops.push_back(SetCC->getOperand(2));
+ CombineTo(SetCC, DAG.getNode(ISD::SETCC, DL, SetCC->getValueType(0),
+ &Ops[0], Ops.size()));
+ }
+}
+
SDValue DAGCombiner::visitSIGN_EXTEND(SDNode *N) {
SDValue N0 = N->getOperand(0);
EVT VT = N->getValueType(0);
@@ -3784,27 +4039,8 @@ SDValue DAGCombiner::visitSIGN_EXTEND(SDNode *N) {
SDValue Trunc = DAG.getNode(ISD::TRUNCATE, N0.getDebugLoc(),
N0.getValueType(), ExtLoad);
CombineTo(N0.getNode(), Trunc, ExtLoad.getValue(1));
-
- // Extend SetCC uses if necessary.
- for (unsigned i = 0, e = SetCCs.size(); i != e; ++i) {
- SDNode *SetCC = SetCCs[i];
- SmallVector<SDValue, 4> Ops;
-
- for (unsigned j = 0; j != 2; ++j) {
- SDValue SOp = SetCC->getOperand(j);
- if (SOp == Trunc)
- Ops.push_back(ExtLoad);
- else
- Ops.push_back(DAG.getNode(ISD::SIGN_EXTEND,
- N->getDebugLoc(), VT, SOp));
- }
-
- Ops.push_back(SetCC->getOperand(2));
- CombineTo(SetCC, DAG.getNode(ISD::SETCC, N->getDebugLoc(),
- SetCC->getValueType(0),
- &Ops[0], Ops.size()));
- }
-
+ ExtendSetCCUses(SetCCs, Trunc, ExtLoad, N->getDebugLoc(),
+ ISD::SIGN_EXTEND);
return SDValue(N, 0); // Return N so it doesn't get rechecked!
}
}
@@ -3832,6 +4068,45 @@ SDValue DAGCombiner::visitSIGN_EXTEND(SDNode *N) {
}
}
+ // fold (sext (and/or/xor (load x), cst)) ->
+ // (and/or/xor (sextload x), (sext cst))
+ if ((N0.getOpcode() == ISD::AND || N0.getOpcode() == ISD::OR ||
+ N0.getOpcode() == ISD::XOR) &&
+ isa<LoadSDNode>(N0.getOperand(0)) &&
+ N0.getOperand(1).getOpcode() == ISD::Constant &&
+ TLI.isLoadExtLegal(ISD::SEXTLOAD, N0.getValueType()) &&
+ (!LegalOperations && TLI.isOperationLegal(N0.getOpcode(), VT))) {
+ LoadSDNode *LN0 = cast<LoadSDNode>(N0.getOperand(0));
+ if (LN0->getExtensionType() != ISD::ZEXTLOAD) {
+ bool DoXform = true;
+ SmallVector<SDNode*, 4> SetCCs;
+ if (!N0.hasOneUse())
+ DoXform = ExtendUsesToFormExtLoad(N, N0.getOperand(0), ISD::SIGN_EXTEND,
+ SetCCs, TLI);
+ if (DoXform) {
+ SDValue ExtLoad = DAG.getExtLoad(ISD::SEXTLOAD, LN0->getDebugLoc(), VT,
+ LN0->getChain(), LN0->getBasePtr(),
+ LN0->getPointerInfo(),
+ LN0->getMemoryVT(),
+ LN0->isVolatile(),
+ LN0->isNonTemporal(),
+ LN0->getAlignment());
+ APInt Mask = cast<ConstantSDNode>(N0.getOperand(1))->getAPIntValue();
+ Mask = Mask.sext(VT.getSizeInBits());
+ SDValue And = DAG.getNode(N0.getOpcode(), N->getDebugLoc(), VT,
+ ExtLoad, DAG.getConstant(Mask, VT));
+ SDValue Trunc = DAG.getNode(ISD::TRUNCATE,
+ N0.getOperand(0).getDebugLoc(),
+ N0.getOperand(0).getValueType(), ExtLoad);
+ CombineTo(N, And);
+ CombineTo(N0.getOperand(0).getNode(), Trunc, ExtLoad.getValue(1));
+ ExtendSetCCUses(SetCCs, Trunc, ExtLoad, N->getDebugLoc(),
+ ISD::SIGN_EXTEND);
+ return SDValue(N, 0); // Return N so it doesn't get rechecked!
+ }
+ }
+ }
+
if (N0.getOpcode() == ISD::SETCC) {
// sext(setcc) -> sext_in_reg(vsetcc) for vectors.
// Only do this before legalize for now.
@@ -3990,27 +4265,48 @@ SDValue DAGCombiner::visitZERO_EXTEND(SDNode *N) {
N0.getValueType(), ExtLoad);
CombineTo(N0.getNode(), Trunc, ExtLoad.getValue(1));
- // Extend SetCC uses if necessary.
- for (unsigned i = 0, e = SetCCs.size(); i != e; ++i) {
- SDNode *SetCC = SetCCs[i];
- SmallVector<SDValue, 4> Ops;
-
- for (unsigned j = 0; j != 2; ++j) {
- SDValue SOp = SetCC->getOperand(j);
- if (SOp == Trunc)
- Ops.push_back(ExtLoad);
- else
- Ops.push_back(DAG.getNode(ISD::ZERO_EXTEND,
- N->getDebugLoc(), VT, SOp));
- }
+ ExtendSetCCUses(SetCCs, Trunc, ExtLoad, N->getDebugLoc(),
+ ISD::ZERO_EXTEND);
+ return SDValue(N, 0); // Return N so it doesn't get rechecked!
+ }
+ }
- Ops.push_back(SetCC->getOperand(2));
- CombineTo(SetCC, DAG.getNode(ISD::SETCC, N->getDebugLoc(),
- SetCC->getValueType(0),
- &Ops[0], Ops.size()));
+ // fold (zext (and/or/xor (load x), cst)) ->
+ // (and/or/xor (zextload x), (zext cst))
+ if ((N0.getOpcode() == ISD::AND || N0.getOpcode() == ISD::OR ||
+ N0.getOpcode() == ISD::XOR) &&
+ isa<LoadSDNode>(N0.getOperand(0)) &&
+ N0.getOperand(1).getOpcode() == ISD::Constant &&
+ TLI.isLoadExtLegal(ISD::ZEXTLOAD, N0.getValueType()) &&
+ (!LegalOperations && TLI.isOperationLegal(N0.getOpcode(), VT))) {
+ LoadSDNode *LN0 = cast<LoadSDNode>(N0.getOperand(0));
+ if (LN0->getExtensionType() != ISD::SEXTLOAD) {
+ bool DoXform = true;
+ SmallVector<SDNode*, 4> SetCCs;
+ if (!N0.hasOneUse())
+ DoXform = ExtendUsesToFormExtLoad(N, N0.getOperand(0), ISD::ZERO_EXTEND,
+ SetCCs, TLI);
+ if (DoXform) {
+ SDValue ExtLoad = DAG.getExtLoad(ISD::ZEXTLOAD, LN0->getDebugLoc(), VT,
+ LN0->getChain(), LN0->getBasePtr(),
+ LN0->getPointerInfo(),
+ LN0->getMemoryVT(),
+ LN0->isVolatile(),
+ LN0->isNonTemporal(),
+ LN0->getAlignment());
+ APInt Mask = cast<ConstantSDNode>(N0.getOperand(1))->getAPIntValue();
+ Mask = Mask.zext(VT.getSizeInBits());
+ SDValue And = DAG.getNode(N0.getOpcode(), N->getDebugLoc(), VT,
+ ExtLoad, DAG.getConstant(Mask, VT));
+ SDValue Trunc = DAG.getNode(ISD::TRUNCATE,
+ N0.getOperand(0).getDebugLoc(),
+ N0.getOperand(0).getValueType(), ExtLoad);
+ CombineTo(N, And);
+ CombineTo(N0.getOperand(0).getNode(), Trunc, ExtLoad.getValue(1));
+ ExtendSetCCUses(SetCCs, Trunc, ExtLoad, N->getDebugLoc(),
+ ISD::ZERO_EXTEND);
+ return SDValue(N, 0); // Return N so it doesn't get rechecked!
}
-
- return SDValue(N, 0); // Return N so it doesn't get rechecked!
}
}
@@ -4198,27 +4494,8 @@ SDValue DAGCombiner::visitANY_EXTEND(SDNode *N) {
SDValue Trunc = DAG.getNode(ISD::TRUNCATE, N0.getDebugLoc(),
N0.getValueType(), ExtLoad);
CombineTo(N0.getNode(), Trunc, ExtLoad.getValue(1));
-
- // Extend SetCC uses if necessary.
- for (unsigned i = 0, e = SetCCs.size(); i != e; ++i) {
- SDNode *SetCC = SetCCs[i];
- SmallVector<SDValue, 4> Ops;
-
- for (unsigned j = 0; j != 2; ++j) {
- SDValue SOp = SetCC->getOperand(j);
- if (SOp == Trunc)
- Ops.push_back(ExtLoad);
- else
- Ops.push_back(DAG.getNode(ISD::ANY_EXTEND,
- N->getDebugLoc(), VT, SOp));
- }
-
- Ops.push_back(SetCC->getOperand(2));
- CombineTo(SetCC, DAG.getNode(ISD::SETCC, N->getDebugLoc(),
- SetCC->getValueType(0),
- &Ops[0], Ops.size()));
- }
-
+ ExtendSetCCUses(SetCCs, Trunc, ExtLoad, N->getDebugLoc(),
+ ISD::ANY_EXTEND);
return SDValue(N, 0); // Return N so it doesn't get rechecked!
}
}
@@ -4555,6 +4832,16 @@ SDValue DAGCombiner::visitSIGN_EXTEND_INREG(SDNode *N) {
CombineTo(N0.getNode(), ExtLoad, ExtLoad.getValue(1));
return SDValue(N, 0); // Return N so it doesn't get rechecked!
}
+
+ // Form (sext_inreg (bswap >> 16)) or (sext_inreg (rotl (bswap) 16))
+ if (EVTBits <= 16 && N0.getOpcode() == ISD::OR) {
+ SDValue BSwap = MatchBSwapHWordLow(N0.getNode(), N0.getOperand(0),
+ N0.getOperand(1), false);
+ if (BSwap.getNode() != 0)
+ return DAG.getNode(ISD::SIGN_EXTEND_INREG, N->getDebugLoc(), VT,
+ BSwap, N1);
+ }
+
return SDValue();
}
@@ -5180,7 +5467,8 @@ SDValue DAGCombiner::visitSINT_TO_FP(SDNode *N) {
// fold (sint_to_fp c1) -> c1fp
if (N0C && OpVT != MVT::ppcf128 &&
// ...but only if the target supports immediate floating-point values
- (Level == llvm::Unrestricted || TLI.isOperationLegalOrCustom(llvm::ISD::ConstantFP, VT)))
+ (Level == llvm::Unrestricted ||
+ TLI.isOperationLegalOrCustom(llvm::ISD::ConstantFP, VT)))
return DAG.getNode(ISD::SINT_TO_FP, N->getDebugLoc(), VT, N0);
// If the input is a legal type, and SINT_TO_FP is not legal on this target,
@@ -5204,7 +5492,8 @@ SDValue DAGCombiner::visitUINT_TO_FP(SDNode *N) {
// fold (uint_to_fp c1) -> c1fp
if (N0C && OpVT != MVT::ppcf128 &&
// ...but only if the target supports immediate floating-point values
- (Level == llvm::Unrestricted || TLI.isOperationLegalOrCustom(llvm::ISD::ConstantFP, VT)))
+ (Level == llvm::Unrestricted ||
+ TLI.isOperationLegalOrCustom(llvm::ISD::ConstantFP, VT)))
return DAG.getNode(ISD::UINT_TO_FP, N->getDebugLoc(), VT, N0);
// If the input is a legal type, and UINT_TO_FP is not legal on this target,
@@ -5648,12 +5937,17 @@ bool DAGCombiner::CombineToPreIndexedLoadStore(SDNode *N) {
// Now check for #3 and #4.
bool RealUse = false;
+
+ // Caches for hasPredecessorHelper
+ SmallPtrSet<const SDNode *, 32> Visited;
+ SmallVector<const SDNode *, 16> Worklist;
+
for (SDNode::use_iterator I = Ptr.getNode()->use_begin(),
E = Ptr.getNode()->use_end(); I != E; ++I) {
SDNode *Use = *I;
if (Use == N)
continue;
- if (Use->isPredecessorOf(N))
+ if (N->hasPredecessorHelper(Use, Visited, Worklist))
return false;
if (!((Use->getOpcode() == ISD::LOAD &&
@@ -6431,8 +6725,9 @@ SDValue DAGCombiner::visitSTORE(SDNode *N) {
// "truncstore (or (shl x, 8), y), i8" -> "truncstore y, i8"
SDValue Shorter =
GetDemandedBits(Value,
- APInt::getLowBitsSet(Value.getValueSizeInBits(),
- ST->getMemoryVT().getSizeInBits()));
+ APInt::getLowBitsSet(
+ Value.getValueType().getScalarType().getSizeInBits(),
+ ST->getMemoryVT().getScalarType().getSizeInBits()));
AddToWorkList(Value.getNode());
if (Shorter.getNode())
return DAG.getTruncStore(Chain, N->getDebugLoc(), Shorter,
@@ -7156,7 +7451,7 @@ SDValue DAGCombiner::SimplifySelectCC(DebugLoc DL, SDValue N0, SDValue N1,
const TargetData &TD = *TLI.getTargetData();
// Create a ConstantArray of the two constants.
- Constant *CA = ConstantArray::get(ArrayType::get(FPTy, 2), Elts, 2);
+ Constant *CA = ConstantArray::get(ArrayType::get(FPTy, 2), Elts);
SDValue CPIdx = DAG.getConstantPool(CA, TLI.getPointerTy(),
TD.getPrefTypeAlignment(FPTy));
unsigned Alignment = cast<ConstantPoolSDNode>(CPIdx)->getAlignment();
diff --git a/contrib/llvm/lib/CodeGen/SelectionDAG/FastISel.cpp b/contrib/llvm/lib/CodeGen/SelectionDAG/FastISel.cpp
index 797f174..54a7d43 100644
--- a/contrib/llvm/lib/CodeGen/SelectionDAG/FastISel.cpp
+++ b/contrib/llvm/lib/CodeGen/SelectionDAG/FastISel.cpp
@@ -547,7 +547,7 @@ bool FastISel::SelectCall(const User *I) {
case Intrinsic::dbg_value: {
// This form of DBG_VALUE is target-independent.
const DbgValueInst *DI = cast<DbgValueInst>(Call);
- const TargetInstrDesc &II = TII.get(TargetOpcode::DBG_VALUE);
+ const MCInstrDesc &II = TII.get(TargetOpcode::DBG_VALUE);
const Value *V = DI->getValue();
if (!V) {
// Currently the optimizer can produce this; insert an undef to
@@ -556,9 +556,14 @@ bool FastISel::SelectCall(const User *I) {
.addReg(0U).addImm(DI->getOffset())
.addMetadata(DI->getVariable());
} else if (const ConstantInt *CI = dyn_cast<ConstantInt>(V)) {
- BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, DL, II)
- .addImm(CI->getZExtValue()).addImm(DI->getOffset())
- .addMetadata(DI->getVariable());
+ if (CI->getBitWidth() > 64)
+ BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, DL, II)
+ .addCImm(CI).addImm(DI->getOffset())
+ .addMetadata(DI->getVariable());
+ else
+ BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, DL, II)
+ .addImm(CI->getZExtValue()).addImm(DI->getOffset())
+ .addMetadata(DI->getVariable());
} else if (const ConstantFP *CF = dyn_cast<ConstantFP>(V)) {
BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, DL, II)
.addFPImm(CF).addImm(DI->getOffset())
@@ -847,7 +852,7 @@ FastISel::SelectExtractValue(const User *U) {
return false; // fast-isel can't handle aggregate constants at the moment
// Get the actual result register, which is an offset from the base register.
- unsigned VTIndex = ComputeLinearIndex(AggTy, EVI->idx_begin(), EVI->idx_end());
+ unsigned VTIndex = ComputeLinearIndex(AggTy, EVI->getIndices());
SmallVector<EVT, 4> AggValueVTs;
ComputeValueVTs(TLI, AggTy, AggValueVTs);
@@ -1085,7 +1090,7 @@ unsigned FastISel::createResultReg(const TargetRegisterClass* RC) {
unsigned FastISel::FastEmitInst_(unsigned MachineInstOpcode,
const TargetRegisterClass* RC) {
unsigned ResultReg = createResultReg(RC);
- const TargetInstrDesc &II = TII.get(MachineInstOpcode);
+ const MCInstrDesc &II = TII.get(MachineInstOpcode);
BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, DL, II, ResultReg);
return ResultReg;
@@ -1095,7 +1100,7 @@ unsigned FastISel::FastEmitInst_r(unsigned MachineInstOpcode,
const TargetRegisterClass *RC,
unsigned Op0, bool Op0IsKill) {
unsigned ResultReg = createResultReg(RC);
- const TargetInstrDesc &II = TII.get(MachineInstOpcode);
+ const MCInstrDesc &II = TII.get(MachineInstOpcode);
if (II.getNumDefs() >= 1)
BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, DL, II, ResultReg)
@@ -1115,7 +1120,7 @@ unsigned FastISel::FastEmitInst_rr(unsigned MachineInstOpcode,
unsigned Op0, bool Op0IsKill,
unsigned Op1, bool Op1IsKill) {
unsigned ResultReg = createResultReg(RC);
- const TargetInstrDesc &II = TII.get(MachineInstOpcode);
+ const MCInstrDesc &II = TII.get(MachineInstOpcode);
if (II.getNumDefs() >= 1)
BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, DL, II, ResultReg)
@@ -1137,7 +1142,7 @@ unsigned FastISel::FastEmitInst_rrr(unsigned MachineInstOpcode,
unsigned Op1, bool Op1IsKill,
unsigned Op2, bool Op2IsKill) {
unsigned ResultReg = createResultReg(RC);
- const TargetInstrDesc &II = TII.get(MachineInstOpcode);
+ const MCInstrDesc &II = TII.get(MachineInstOpcode);
if (II.getNumDefs() >= 1)
BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, DL, II, ResultReg)
@@ -1160,7 +1165,7 @@ unsigned FastISel::FastEmitInst_ri(unsigned MachineInstOpcode,
unsigned Op0, bool Op0IsKill,
uint64_t Imm) {
unsigned ResultReg = createResultReg(RC);
- const TargetInstrDesc &II = TII.get(MachineInstOpcode);
+ const MCInstrDesc &II = TII.get(MachineInstOpcode);
if (II.getNumDefs() >= 1)
BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, DL, II, ResultReg)
@@ -1181,7 +1186,7 @@ unsigned FastISel::FastEmitInst_rii(unsigned MachineInstOpcode,
unsigned Op0, bool Op0IsKill,
uint64_t Imm1, uint64_t Imm2) {
unsigned ResultReg = createResultReg(RC);
- const TargetInstrDesc &II = TII.get(MachineInstOpcode);
+ const MCInstrDesc &II = TII.get(MachineInstOpcode);
if (II.getNumDefs() >= 1)
BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, DL, II, ResultReg)
@@ -1204,7 +1209,7 @@ unsigned FastISel::FastEmitInst_rf(unsigned MachineInstOpcode,
unsigned Op0, bool Op0IsKill,
const ConstantFP *FPImm) {
unsigned ResultReg = createResultReg(RC);
- const TargetInstrDesc &II = TII.get(MachineInstOpcode);
+ const MCInstrDesc &II = TII.get(MachineInstOpcode);
if (II.getNumDefs() >= 1)
BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, DL, II, ResultReg)
@@ -1226,7 +1231,7 @@ unsigned FastISel::FastEmitInst_rri(unsigned MachineInstOpcode,
unsigned Op1, bool Op1IsKill,
uint64_t Imm) {
unsigned ResultReg = createResultReg(RC);
- const TargetInstrDesc &II = TII.get(MachineInstOpcode);
+ const MCInstrDesc &II = TII.get(MachineInstOpcode);
if (II.getNumDefs() >= 1)
BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, DL, II, ResultReg)
@@ -1248,7 +1253,7 @@ unsigned FastISel::FastEmitInst_i(unsigned MachineInstOpcode,
const TargetRegisterClass *RC,
uint64_t Imm) {
unsigned ResultReg = createResultReg(RC);
- const TargetInstrDesc &II = TII.get(MachineInstOpcode);
+ const MCInstrDesc &II = TII.get(MachineInstOpcode);
if (II.getNumDefs() >= 1)
BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, DL, II, ResultReg).addImm(Imm);
@@ -1264,7 +1269,7 @@ unsigned FastISel::FastEmitInst_ii(unsigned MachineInstOpcode,
const TargetRegisterClass *RC,
uint64_t Imm1, uint64_t Imm2) {
unsigned ResultReg = createResultReg(RC);
- const TargetInstrDesc &II = TII.get(MachineInstOpcode);
+ const MCInstrDesc &II = TII.get(MachineInstOpcode);
if (II.getNumDefs() >= 1)
BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, DL, II, ResultReg)
diff --git a/contrib/llvm/lib/CodeGen/SelectionDAG/InstrEmitter.cpp b/contrib/llvm/lib/CodeGen/SelectionDAG/InstrEmitter.cpp
index cb49a80..f0f4743 100644
--- a/contrib/llvm/lib/CodeGen/SelectionDAG/InstrEmitter.cpp
+++ b/contrib/llvm/lib/CodeGen/SelectionDAG/InstrEmitter.cpp
@@ -76,6 +76,12 @@ EmitCopyFromReg(SDNode *Node, unsigned ResNo, bool IsClone, bool IsCloned,
// the CopyToReg'd destination register instead of creating a new vreg.
bool MatchReg = true;
const TargetRegisterClass *UseRC = NULL;
+ EVT VT = Node->getValueType(ResNo);
+
+ // Stick to the preferred register classes for legal types.
+ if (TLI->isTypeLegal(VT))
+ UseRC = TLI->getRegClassFor(VT);
+
if (!IsClone && !IsCloned)
for (SDNode::use_iterator UI = Node->use_begin(), E = Node->use_end();
UI != E; ++UI) {
@@ -100,10 +106,10 @@ EmitCopyFromReg(SDNode *Node, unsigned ResNo, bool IsClone, bool IsCloned,
continue;
Match = false;
if (User->isMachineOpcode()) {
- const TargetInstrDesc &II = TII->get(User->getMachineOpcode());
+ const MCInstrDesc &II = TII->get(User->getMachineOpcode());
const TargetRegisterClass *RC = 0;
if (i+II.getNumDefs() < II.getNumOperands())
- RC = II.OpInfo[i+II.getNumDefs()].getRegClass(TRI);
+ RC = TII->getRegClass(II, i+II.getNumDefs(), TRI);
if (!UseRC)
UseRC = RC;
else if (RC) {
@@ -121,10 +127,9 @@ EmitCopyFromReg(SDNode *Node, unsigned ResNo, bool IsClone, bool IsCloned,
break;
}
- EVT VT = Node->getValueType(ResNo);
const TargetRegisterClass *SrcRC = 0, *DstRC = 0;
SrcRC = TRI->getMinimalPhysRegClass(SrcReg, VT);
-
+
// Figure out the register class to create for the destreg.
if (VRBase) {
DstRC = MRI->getRegClass(VRBase);
@@ -173,7 +178,7 @@ unsigned InstrEmitter::getDstOfOnlyCopyToRegUse(SDNode *Node,
}
void InstrEmitter::CreateVirtualRegisters(SDNode *Node, MachineInstr *MI,
- const TargetInstrDesc &II,
+ const MCInstrDesc &II,
bool IsClone, bool IsCloned,
DenseMap<SDValue, unsigned> &VRBaseMap) {
assert(Node->getMachineOpcode() != TargetOpcode::IMPLICIT_DEF &&
@@ -184,7 +189,7 @@ void InstrEmitter::CreateVirtualRegisters(SDNode *Node, MachineInstr *MI,
// is a vreg in the same register class, use the CopyToReg'd destination
// register instead of creating a new vreg.
unsigned VRBase = 0;
- const TargetRegisterClass *RC = II.OpInfo[i].getRegClass(TRI);
+ const TargetRegisterClass *RC = TII->getRegClass(II, i, TRI);
if (II.OpInfo[i].isOptionalDef()) {
// Optional def must be a physical register.
unsigned NumResults = CountResults(Node);
@@ -237,7 +242,7 @@ unsigned InstrEmitter::getVR(SDValue Op,
Op.getMachineOpcode() == TargetOpcode::IMPLICIT_DEF) {
// Add an IMPLICIT_DEF instruction before every use.
unsigned VReg = getDstOfOnlyCopyToRegUse(Op.getNode(), Op.getResNo());
- // IMPLICIT_DEF can produce any type of result so its TargetInstrDesc
+ // IMPLICIT_DEF can produce any type of result so its MCInstrDesc
// does not include operand register class info.
if (!VReg) {
const TargetRegisterClass *RC = TLI->getRegClassFor(Op.getValueType());
@@ -260,7 +265,7 @@ unsigned InstrEmitter::getVR(SDValue Op,
void
InstrEmitter::AddRegisterOperand(MachineInstr *MI, SDValue Op,
unsigned IIOpNum,
- const TargetInstrDesc *II,
+ const MCInstrDesc *II,
DenseMap<SDValue, unsigned> &VRBaseMap,
bool IsDebug, bool IsClone, bool IsCloned) {
assert(Op.getValueType() != MVT::Other &&
@@ -270,9 +275,9 @@ InstrEmitter::AddRegisterOperand(MachineInstr *MI, SDValue Op,
unsigned VReg = getVR(Op, VRBaseMap);
assert(TargetRegisterInfo::isVirtualRegister(VReg) && "Not a vreg?");
- const TargetInstrDesc &TID = MI->getDesc();
- bool isOptDef = IIOpNum < TID.getNumOperands() &&
- TID.OpInfo[IIOpNum].isOptionalDef();
+ const MCInstrDesc &MCID = MI->getDesc();
+ bool isOptDef = IIOpNum < MCID.getNumOperands() &&
+ MCID.OpInfo[IIOpNum].isOptionalDef();
// If the instruction requires a register in a different class, create
// a new virtual register and copy the value into it.
@@ -280,8 +285,8 @@ InstrEmitter::AddRegisterOperand(MachineInstr *MI, SDValue Op,
const TargetRegisterClass *SrcRC = MRI->getRegClass(VReg);
const TargetRegisterClass *DstRC = 0;
if (IIOpNum < II->getNumOperands())
- DstRC = II->OpInfo[IIOpNum].getRegClass(TRI);
- assert((DstRC || (TID.isVariadic() && IIOpNum >= TID.getNumOperands())) &&
+ DstRC = TII->getRegClass(*II, IIOpNum, TRI);
+ assert((DstRC || (MCID.isVariadic() && IIOpNum >= MCID.getNumOperands())) &&
"Don't have operand info for this instruction!");
if (DstRC && !SrcRC->hasSuperClassEq(DstRC)) {
unsigned NewVReg = MRI->createVirtualRegister(DstRC);
@@ -307,7 +312,7 @@ InstrEmitter::AddRegisterOperand(MachineInstr *MI, SDValue Op,
while (Idx > 0 &&
MI->getOperand(Idx-1).isReg() && MI->getOperand(Idx-1).isImplicit())
--Idx;
- bool isTied = MI->getDesc().getOperandConstraint(Idx, TOI::TIED_TO) != -1;
+ bool isTied = MI->getDesc().getOperandConstraint(Idx, MCOI::TIED_TO) != -1;
if (isTied)
isKill = false;
}
@@ -325,7 +330,7 @@ InstrEmitter::AddRegisterOperand(MachineInstr *MI, SDValue Op,
/// assertions only.
void InstrEmitter::AddOperand(MachineInstr *MI, SDValue Op,
unsigned IIOpNum,
- const TargetInstrDesc *II,
+ const MCInstrDesc *II,
DenseMap<SDValue, unsigned> &VRBaseMap,
bool IsDebug, bool IsClone, bool IsCloned) {
if (Op.isMachineOpcode()) {
@@ -543,17 +548,18 @@ InstrEmitter::EmitCopyToRegClassNode(SDNode *Node,
void InstrEmitter::EmitRegSequence(SDNode *Node,
DenseMap<SDValue, unsigned> &VRBaseMap,
bool IsClone, bool IsCloned) {
- const TargetRegisterClass *RC = TLI->getRegClassFor(Node->getValueType(0));
+ unsigned DstRCIdx = cast<ConstantSDNode>(Node->getOperand(0))->getZExtValue();
+ const TargetRegisterClass *RC = TRI->getRegClass(DstRCIdx);
unsigned NewVReg = MRI->createVirtualRegister(RC);
MachineInstr *MI = BuildMI(*MF, Node->getDebugLoc(),
TII->get(TargetOpcode::REG_SEQUENCE), NewVReg);
unsigned NumOps = Node->getNumOperands();
- assert((NumOps & 1) == 0 &&
- "REG_SEQUENCE must have an even number of operands!");
- const TargetInstrDesc &II = TII->get(TargetOpcode::REG_SEQUENCE);
- for (unsigned i = 0; i != NumOps; ++i) {
+ assert((NumOps & 1) == 1 &&
+ "REG_SEQUENCE must have an odd number of operands!");
+ const MCInstrDesc &II = TII->get(TargetOpcode::REG_SEQUENCE);
+ for (unsigned i = 1; i != NumOps; ++i) {
SDValue Op = Node->getOperand(i);
- if (i & 1) {
+ if ((i & 1) == 0) {
unsigned SubIdx = cast<ConstantSDNode>(Op)->getZExtValue();
unsigned SubReg = getVR(Node->getOperand(i-1), VRBaseMap);
const TargetRegisterClass *TRC = MRI->getRegClass(SubReg);
@@ -591,7 +597,7 @@ InstrEmitter::EmitDbgValue(SDDbgValue *SD,
return TII->emitFrameIndexDebugValue(*MF, FrameIx, Offset, MDPtr, DL);
}
// Otherwise, we're going to create an instruction here.
- const TargetInstrDesc &II = TII->get(TargetOpcode::DBG_VALUE);
+ const MCInstrDesc &II = TII->get(TargetOpcode::DBG_VALUE);
MachineInstrBuilder MIB = BuildMI(*MF, DL, II);
if (SD->getKind() == SDDbgValue::SDNODE) {
SDNode *Node = SD->getSDNode();
@@ -610,12 +616,8 @@ InstrEmitter::EmitDbgValue(SDDbgValue *SD,
} else if (SD->getKind() == SDDbgValue::CONST) {
const Value *V = SD->getConst();
if (const ConstantInt *CI = dyn_cast<ConstantInt>(V)) {
- // FIXME: SDDbgValue constants aren't updated with legalization, so it's
- // possible to have i128 constants in them at this point. Dwarf writer
- // does not handle i128 constants at the moment so, as a crude workaround,
- // just drop the debug info if this happens.
- if (!CI->getValue().isSignedIntN(64))
- MIB.addReg(0U);
+ if (CI->getBitWidth() > 64)
+ MIB.addCImm(CI);
else
MIB.addImm(CI->getSExtValue());
} else if (const ConstantFP *CF = dyn_cast<ConstantFP>(V)) {
@@ -666,7 +668,7 @@ EmitMachineNode(SDNode *Node, bool IsClone, bool IsCloned,
// We want a unique VR for each IMPLICIT_DEF use.
return;
- const TargetInstrDesc &II = TII->get(Opc);
+ const MCInstrDesc &II = TII->get(Opc);
unsigned NumResults = CountResults(Node);
unsigned NodeOperands = CountOperands(Node);
bool HasPhysRegOuts = NumResults > II.getNumDefs() && II.getImplicitDefs()!=0;
@@ -695,9 +697,9 @@ EmitMachineNode(SDNode *Node, bool IsClone, bool IsCloned,
UsedRegs.push_back(cast<RegisterSDNode>(F->getOperand(1))->getReg());
else {
// Collect declared implicit uses.
- const TargetInstrDesc &TID = TII->get(F->getMachineOpcode());
- UsedRegs.append(TID.getImplicitUses(),
- TID.getImplicitUses() + TID.getNumImplicitUses());
+ const MCInstrDesc &MCID = TII->get(F->getMachineOpcode());
+ UsedRegs.append(MCID.getImplicitUses(),
+ MCID.getImplicitUses() + MCID.getNumImplicitUses());
// In addition to declared implicit uses, we must also check for
// direct RegisterSDNode operands.
for (unsigned i = 0, e = F->getNumOperands(); i != e; ++i)
@@ -849,6 +851,7 @@ EmitSpecialNode(SDNode *Node, bool IsClone, bool IsCloned,
}
break;
case InlineAsm::Kind_RegDefEarlyClobber:
+ case InlineAsm::Kind_Clobber:
for (; NumVals; --NumVals, ++i) {
unsigned Reg = cast<RegisterSDNode>(Node->getOperand(i))->getReg();
MI->addOperand(MachineOperand::CreateReg(Reg, /*isDef=*/ true,
diff --git a/contrib/llvm/lib/CodeGen/SelectionDAG/InstrEmitter.h b/contrib/llvm/lib/CodeGen/SelectionDAG/InstrEmitter.h
index 02c044c..19fc044 100644
--- a/contrib/llvm/lib/CodeGen/SelectionDAG/InstrEmitter.h
+++ b/contrib/llvm/lib/CodeGen/SelectionDAG/InstrEmitter.h
@@ -22,7 +22,7 @@
namespace llvm {
-class TargetInstrDesc;
+class MCInstrDesc;
class SDDbgValue;
class InstrEmitter {
@@ -49,7 +49,7 @@ class InstrEmitter {
unsigned ResNo) const;
void CreateVirtualRegisters(SDNode *Node, MachineInstr *MI,
- const TargetInstrDesc &II,
+ const MCInstrDesc &II,
bool IsClone, bool IsCloned,
DenseMap<SDValue, unsigned> &VRBaseMap);
@@ -63,7 +63,7 @@ class InstrEmitter {
/// not in the required register class.
void AddRegisterOperand(MachineInstr *MI, SDValue Op,
unsigned IIOpNum,
- const TargetInstrDesc *II,
+ const MCInstrDesc *II,
DenseMap<SDValue, unsigned> &VRBaseMap,
bool IsDebug, bool IsClone, bool IsCloned);
@@ -73,7 +73,7 @@ class InstrEmitter {
/// assertions only.
void AddOperand(MachineInstr *MI, SDValue Op,
unsigned IIOpNum,
- const TargetInstrDesc *II,
+ const MCInstrDesc *II,
DenseMap<SDValue, unsigned> &VRBaseMap,
bool IsDebug, bool IsClone, bool IsCloned);
diff --git a/contrib/llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp b/contrib/llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp
index 62d777c..d06e2bd 100644
--- a/contrib/llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp
+++ b/contrib/llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp
@@ -58,17 +58,6 @@ class SelectionDAGLegalize {
/// against each other, including inserted libcalls.
SmallVector<SDValue, 8> LastCALLSEQ;
- enum LegalizeAction {
- Legal, // The target natively supports this operation.
- Promote, // This operation should be executed in a larger type.
- Expand // Try to expand this to other ops, otherwise use a libcall.
- };
-
- /// ValueTypeActions - This is a bitvector that contains two bits for each
- /// value type, where the two bits correspond to the LegalizeAction enum.
- /// This can be queried with "getTypeAction(VT)".
- TargetLowering::ValueTypeActionImpl ValueTypeActions;
-
/// LegalizedNodes - For nodes that are of legal width, and that have more
/// than one use, this map indicates what regularized operand to use. This
/// allows us to avoid legalizing the same thing more than once.
@@ -87,25 +76,11 @@ class SelectionDAGLegalize {
public:
explicit SelectionDAGLegalize(SelectionDAG &DAG);
- /// getTypeAction - Return how we should legalize values of this type, either
- /// it is already legal or we need to expand it into multiple registers of
- /// smaller integer type, or we need to promote it to a larger type.
- LegalizeAction getTypeAction(EVT VT) const {
- return (LegalizeAction)TLI.getTypeAction(*DAG.getContext(), VT);
- }
-
- /// isTypeLegal - Return true if this type is legal on this target.
- ///
- bool isTypeLegal(EVT VT) const {
- return getTypeAction(VT) == Legal;
- }
-
void LegalizeDAG();
private:
- /// LegalizeOp - We know that the specified value has a legal type.
- /// Recursively ensure that the operands have legal types, then return the
- /// result.
+ /// LegalizeOp - Return a legal replacement for the given operation, with
+ /// all legal operands.
SDValue LegalizeOp(SDValue O);
SDValue OptimizeFloatStore(StoreSDNode *ST);
@@ -220,10 +195,7 @@ SelectionDAGLegalize::ShuffleWithNarrowerEltType(EVT NVT, EVT VT, DebugLoc dl,
SelectionDAGLegalize::SelectionDAGLegalize(SelectionDAG &dag)
: TM(dag.getTarget()), TLI(dag.getTargetLoweringInfo()),
- DAG(dag),
- ValueTypeActions(TLI.getValueTypeActions()) {
- assert(MVT::LAST_VALUETYPE <= MVT::MAX_ALLOWED_VALUETYPE &&
- "Too many value types for ValueTypeActions to hold!");
+ DAG(dag) {
}
void SelectionDAGLegalize::LegalizeDAG() {
@@ -753,7 +725,7 @@ SDValue SelectionDAGLegalize::OptimizeFloatStore(StoreSDNode* ST) {
DebugLoc dl = ST->getDebugLoc();
if (ConstantFPSDNode *CFP = dyn_cast<ConstantFPSDNode>(ST->getValue())) {
if (CFP->getValueType(0) == MVT::f32 &&
- getTypeAction(MVT::i32) == Legal) {
+ TLI.isTypeLegal(MVT::i32)) {
Tmp3 = DAG.getConstant(CFP->getValueAPF().
bitcastToAPInt().zextOrTrunc(32),
MVT::i32);
@@ -763,14 +735,14 @@ SDValue SelectionDAGLegalize::OptimizeFloatStore(StoreSDNode* ST) {
if (CFP->getValueType(0) == MVT::f64) {
// If this target supports 64-bit registers, do a single 64-bit store.
- if (getTypeAction(MVT::i64) == Legal) {
+ if (TLI.isTypeLegal(MVT::i64)) {
Tmp3 = DAG.getConstant(CFP->getValueAPF().bitcastToAPInt().
zextOrTrunc(64), MVT::i64);
return DAG.getStore(Tmp1, dl, Tmp3, Tmp2, ST->getPointerInfo(),
isVolatile, isNonTemporal, Alignment);
}
- if (getTypeAction(MVT::i32) == Legal && !ST->isVolatile()) {
+ if (TLI.isTypeLegal(MVT::i32) && !ST->isVolatile()) {
// Otherwise, if the target supports 32-bit registers, use 2 32-bit
// stores. If the target supports neither 32- nor 64-bits, this
// xform is certainly not worth it.
@@ -794,10 +766,8 @@ SDValue SelectionDAGLegalize::OptimizeFloatStore(StoreSDNode* ST) {
return SDValue(0, 0);
}
-/// LegalizeOp - We know that the specified value has a legal type, and
-/// that its operands are legal. Now ensure that the operation itself
-/// is legal, recursively ensuring that the operands' operations remain
-/// legal.
+/// LegalizeOp - Return a legal replacement for the given operation, with
+/// all legal operands.
SDValue SelectionDAGLegalize::LegalizeOp(SDValue Op) {
if (Op.getOpcode() == ISD::TargetConstant) // Allow illegal target nodes.
return Op;
@@ -806,11 +776,14 @@ SDValue SelectionDAGLegalize::LegalizeOp(SDValue Op) {
DebugLoc dl = Node->getDebugLoc();
for (unsigned i = 0, e = Node->getNumValues(); i != e; ++i)
- assert(getTypeAction(Node->getValueType(i)) == Legal &&
+ assert(TLI.getTypeAction(*DAG.getContext(), Node->getValueType(i)) ==
+ TargetLowering::TypeLegal &&
"Unexpected illegal type!");
for (unsigned i = 0, e = Node->getNumOperands(); i != e; ++i)
- assert((isTypeLegal(Node->getOperand(i).getValueType()) ||
+ assert((TLI.getTypeAction(*DAG.getContext(),
+ Node->getOperand(i).getValueType()) ==
+ TargetLowering::TypeLegal ||
Node->getOperand(i).getOpcode() == ISD::TargetConstant) &&
"Unexpected illegal type!");
@@ -1354,7 +1327,7 @@ SDValue SelectionDAGLegalize::LegalizeOp(SDValue Op) {
}
break;
case TargetLowering::Expand:
- if (!TLI.isLoadExtLegal(ISD::EXTLOAD, SrcVT) && isTypeLegal(SrcVT)) {
+ if (!TLI.isLoadExtLegal(ISD::EXTLOAD, SrcVT) && TLI.isTypeLegal(SrcVT)) {
SDValue Load = DAG.getLoad(SrcVT, dl, Tmp1, Tmp2,
LD->getPointerInfo(),
LD->isVolatile(), LD->isNonTemporal(),
@@ -1374,6 +1347,91 @@ SDValue SelectionDAGLegalize::LegalizeOp(SDValue Op) {
Tmp2 = LegalizeOp(Load.getValue(1));
break;
}
+
+ // If this is a promoted vector load, and the vector element types are
+ // legal, then scalarize it.
+ if (ExtType == ISD::EXTLOAD && SrcVT.isVector() &&
+ TLI.isTypeLegal(Node->getValueType(0).getScalarType())) {
+ SmallVector<SDValue, 8> LoadVals;
+ SmallVector<SDValue, 8> LoadChains;
+ unsigned NumElem = SrcVT.getVectorNumElements();
+ unsigned Stride = SrcVT.getScalarType().getSizeInBits()/8;
+
+ for (unsigned Idx=0; Idx<NumElem; Idx++) {
+ Tmp2 = DAG.getNode(ISD::ADD, dl, Tmp2.getValueType(), Tmp2,
+ DAG.getIntPtrConstant(Stride));
+ SDValue ScalarLoad = DAG.getExtLoad(ISD::EXTLOAD, dl,
+ Node->getValueType(0).getScalarType(),
+ Tmp1, Tmp2, LD->getPointerInfo().getWithOffset(Idx * Stride),
+ SrcVT.getScalarType(),
+ LD->isVolatile(), LD->isNonTemporal(),
+ LD->getAlignment());
+
+ LoadVals.push_back(ScalarLoad.getValue(0));
+ LoadChains.push_back(ScalarLoad.getValue(1));
+ }
+ Result = DAG.getNode(ISD::TokenFactor, dl, MVT::Other,
+ &LoadChains[0], LoadChains.size());
+ SDValue ValRes = DAG.getNode(ISD::BUILD_VECTOR, dl,
+ Node->getValueType(0), &LoadVals[0], LoadVals.size());
+
+ Tmp1 = LegalizeOp(ValRes); // Relegalize new nodes.
+ Tmp2 = LegalizeOp(Result.getValue(0)); // Relegalize new nodes.
+ break;
+ }
+
+ // If this is a promoted vector load, and the vector element types are
+ // illegal, create the promoted vector from bitcasted segments.
+ if (ExtType == ISD::EXTLOAD && SrcVT.isVector()) {
+ EVT MemElemTy = Node->getValueType(0).getScalarType();
+ EVT SrcSclrTy = SrcVT.getScalarType();
+ unsigned SizeRatio =
+ (MemElemTy.getSizeInBits() / SrcSclrTy.getSizeInBits());
+
+ SmallVector<SDValue, 8> LoadVals;
+ SmallVector<SDValue, 8> LoadChains;
+ unsigned NumElem = SrcVT.getVectorNumElements();
+ unsigned Stride = SrcVT.getScalarType().getSizeInBits()/8;
+
+ for (unsigned Idx=0; Idx<NumElem; Idx++) {
+ Tmp2 = DAG.getNode(ISD::ADD, dl, Tmp2.getValueType(), Tmp2,
+ DAG.getIntPtrConstant(Stride));
+ SDValue ScalarLoad = DAG.getExtLoad(ISD::EXTLOAD, dl,
+ SrcVT.getScalarType(),
+ Tmp1, Tmp2, LD->getPointerInfo().getWithOffset(Idx * Stride),
+ SrcVT.getScalarType(),
+ LD->isVolatile(), LD->isNonTemporal(),
+ LD->getAlignment());
+ if (TLI.isBigEndian()) {
+ // MSB (which is garbage, comes first)
+ LoadVals.push_back(ScalarLoad.getValue(0));
+ for (unsigned i = 0; i<SizeRatio-1; ++i)
+ LoadVals.push_back(DAG.getUNDEF(SrcVT.getScalarType()));
+ } else {
+ // LSB (which is data, comes first)
+ for (unsigned i = 0; i<SizeRatio-1; ++i)
+ LoadVals.push_back(DAG.getUNDEF(SrcVT.getScalarType()));
+ LoadVals.push_back(ScalarLoad.getValue(0));
+ }
+ LoadChains.push_back(ScalarLoad.getValue(1));
+ }
+
+ Result = DAG.getNode(ISD::TokenFactor, dl, MVT::Other,
+ &LoadChains[0], LoadChains.size());
+ EVT TempWideVector = EVT::getVectorVT(*DAG.getContext(),
+ SrcVT.getScalarType(), NumElem*SizeRatio);
+ SDValue ValRes = DAG.getNode(ISD::BUILD_VECTOR, dl,
+ TempWideVector, &LoadVals[0], LoadVals.size());
+
+ // Cast to the correct type
+ ValRes = DAG.getNode(ISD::BITCAST, dl, Node->getValueType(0), ValRes);
+
+ Tmp1 = LegalizeOp(ValRes); // Relegalize new nodes.
+ Tmp2 = LegalizeOp(Result.getValue(0)); // Relegalize new nodes.
+ break;
+
+ }
+
// FIXME: This does not work for vectors on most targets. Sign- and
// zero-extend operations are currently folded into extending loads,
// whether they are legal or not, and then we end up here without any
@@ -1548,9 +1606,91 @@ SDValue SelectionDAGLegalize::LegalizeOp(SDValue Op) {
case TargetLowering::Custom:
Result = TLI.LowerOperation(Result, DAG);
break;
- case Expand:
+ case TargetLowering::Expand:
+
+ EVT WideScalarVT = Tmp3.getValueType().getScalarType();
+ EVT NarrowScalarVT = StVT.getScalarType();
+
+ // The Store type is illegal, must scalarize the vector store.
+ SmallVector<SDValue, 8> Stores;
+ bool ScalarLegal = TLI.isTypeLegal(WideScalarVT);
+ if (!TLI.isTypeLegal(StVT) && StVT.isVector() && ScalarLegal) {
+ unsigned NumElem = StVT.getVectorNumElements();
+
+ unsigned ScalarSize = StVT.getScalarType().getSizeInBits();
+ // Round odd types to the next pow of two.
+ if (!isPowerOf2_32(ScalarSize))
+ ScalarSize = NextPowerOf2(ScalarSize);
+ // Types smaller than 8 bits are promoted to 8 bits.
+ ScalarSize = std::max<unsigned>(ScalarSize, 8);
+ // Store stride
+ unsigned Stride = ScalarSize/8;
+ assert(isPowerOf2_32(Stride) && "Stride must be a power of two");
+
+ for (unsigned Idx=0; Idx<NumElem; Idx++) {
+ SDValue Ex = DAG.getNode(ISD::EXTRACT_VECTOR_ELT, dl,
+ WideScalarVT, Tmp3, DAG.getIntPtrConstant(Idx));
+
+
+ EVT NVT = EVT::getIntegerVT(*DAG.getContext(), ScalarSize);
+
+ Ex = DAG.getNode(ISD::TRUNCATE, dl, NVT, Ex);
+ Tmp2 = DAG.getNode(ISD::ADD, dl, Tmp2.getValueType(), Tmp2,
+ DAG.getIntPtrConstant(Stride));
+ SDValue Store = DAG.getStore(Tmp1, dl, Ex, Tmp2,
+ ST->getPointerInfo().getWithOffset(Idx*Stride),
+ isVolatile, isNonTemporal, Alignment);
+ Stores.push_back(Store);
+ }
+ Result = DAG.getNode(ISD::TokenFactor, dl, MVT::Other,
+ &Stores[0], Stores.size());
+ break;
+ }
+
+ // The Store type is illegal, must scalarize the vector store.
+ // However, the scalar type is illegal. Must bitcast the result
+ // and store it in smaller parts.
+ if (!TLI.isTypeLegal(StVT) && StVT.isVector()) {
+ unsigned WideNumElem = StVT.getVectorNumElements();
+ unsigned Stride = NarrowScalarVT.getSizeInBits()/8;
+
+ unsigned SizeRatio =
+ (WideScalarVT.getSizeInBits() / NarrowScalarVT.getSizeInBits());
+
+ EVT CastValueVT = EVT::getVectorVT(*DAG.getContext(), NarrowScalarVT,
+ SizeRatio*WideNumElem);
+
+ // Cast the wide elem vector to wider vec with smaller elem type.
+ // Example <2 x i64> -> <4 x i32>
+ Tmp3 = DAG.getNode(ISD::BITCAST, dl, CastValueVT, Tmp3);
+
+ for (unsigned Idx=0; Idx<WideNumElem*SizeRatio; Idx++) {
+ // Extract elment i
+ SDValue Ex = DAG.getNode(ISD::EXTRACT_VECTOR_ELT, dl,
+ NarrowScalarVT, Tmp3, DAG.getIntPtrConstant(Idx));
+ // bump pointer.
+ Tmp2 = DAG.getNode(ISD::ADD, dl, Tmp2.getValueType(), Tmp2,
+ DAG.getIntPtrConstant(Stride));
+
+ // Store if, this element is:
+ // - First element on big endian, or
+ // - Last element on little endian
+ if (( TLI.isBigEndian() && (Idx%SizeRatio == 0)) ||
+ ((!TLI.isBigEndian() && (Idx%SizeRatio == SizeRatio-1)))) {
+ SDValue Store = DAG.getStore(Tmp1, dl, Ex, Tmp2,
+ ST->getPointerInfo().getWithOffset(Idx*Stride),
+ isVolatile, isNonTemporal, Alignment);
+ Stores.push_back(Store);
+ }
+ }
+ Result = DAG.getNode(ISD::TokenFactor, dl, MVT::Other,
+ &Stores[0], Stores.size());
+ break;
+ }
+
+
// TRUNCSTORE:i16 i32 -> STORE i16
- assert(isTypeLegal(StVT) && "Do not know how to expand this store!");
+ assert(TLI.isTypeLegal(StVT) && "Do not know how to expand this store!");
Tmp3 = DAG.getNode(ISD::TRUNCATE, dl, StVT, Tmp3);
Result = DAG.getStore(Tmp1, dl, Tmp3, Tmp2, ST->getPointerInfo(),
isVolatile, isNonTemporal, Alignment);
@@ -1709,7 +1849,7 @@ SDValue SelectionDAGLegalize::ExpandFCOPYSIGN(SDNode* Node) {
SDValue SignBit;
EVT FloatVT = Tmp2.getValueType();
EVT IVT = EVT::getIntegerVT(*DAG.getContext(), FloatVT.getSizeInBits());
- if (isTypeLegal(IVT)) {
+ if (TLI.isTypeLegal(IVT)) {
// Convert to an integer with the same sign bit.
SignBit = DAG.getNode(ISD::BITCAST, dl, IVT, Tmp2);
} else {
@@ -3031,7 +3171,7 @@ void SelectionDAGLegalize::ExpandNode(SDNode *Node,
EVT VT = Node->getValueType(0);
EVT EltVT = VT.getVectorElementType();
- if (getTypeAction(EltVT) == Promote)
+ if (!TLI.isTypeLegal(EltVT))
EltVT = TLI.getTypeToTransformTo(*DAG.getContext(), EltVT);
unsigned NumElems = VT.getVectorNumElements();
SmallVector<SDValue, 8> Ops;
@@ -3184,6 +3324,10 @@ void SelectionDAGLegalize::ExpandNode(SDNode *Node,
Results.push_back(ExpandFPLibCall(Node, RTLIB::REM_F32, RTLIB::REM_F64,
RTLIB::REM_F80, RTLIB::REM_PPCF128));
break;
+ case ISD::FMA:
+ Results.push_back(ExpandFPLibCall(Node, RTLIB::FMA_F32, RTLIB::FMA_F64,
+ RTLIB::FMA_F80, RTLIB::FMA_PPCF128));
+ break;
case ISD::FP16_TO_FP32:
Results.push_back(ExpandLibCall(RTLIB::FPEXT_F16_F32, Node, false));
break;
diff --git a/contrib/llvm/lib/CodeGen/SelectionDAG/LegalizeFloatTypes.cpp b/contrib/llvm/lib/CodeGen/SelectionDAG/LegalizeFloatTypes.cpp
index 27a466b..e6835d8 100644
--- a/contrib/llvm/lib/CodeGen/SelectionDAG/LegalizeFloatTypes.cpp
+++ b/contrib/llvm/lib/CodeGen/SelectionDAG/LegalizeFloatTypes.cpp
@@ -74,6 +74,7 @@ void DAGTypeLegalizer::SoftenFloatResult(SDNode *N, unsigned ResNo) {
case ISD::FLOG: R = SoftenFloatRes_FLOG(N); break;
case ISD::FLOG2: R = SoftenFloatRes_FLOG2(N); break;
case ISD::FLOG10: R = SoftenFloatRes_FLOG10(N); break;
+ case ISD::FMA: R = SoftenFloatRes_FMA(N); break;
case ISD::FMUL: R = SoftenFloatRes_FMUL(N); break;
case ISD::FNEARBYINT: R = SoftenFloatRes_FNEARBYINT(N); break;
case ISD::FNEG: R = SoftenFloatRes_FNEG(N); break;
@@ -294,6 +295,19 @@ SDValue DAGTypeLegalizer::SoftenFloatRes_FLOG10(SDNode *N) {
NVT, &Op, 1, false, N->getDebugLoc());
}
+SDValue DAGTypeLegalizer::SoftenFloatRes_FMA(SDNode *N) {
+ EVT NVT = TLI.getTypeToTransformTo(*DAG.getContext(), N->getValueType(0));
+ SDValue Ops[3] = { GetSoftenedFloat(N->getOperand(0)),
+ GetSoftenedFloat(N->getOperand(1)),
+ GetSoftenedFloat(N->getOperand(2)) };
+ return MakeLibCall(GetFPLibCall(N->getValueType(0),
+ RTLIB::FMA_F32,
+ RTLIB::FMA_F64,
+ RTLIB::FMA_F80,
+ RTLIB::FMA_PPCF128),
+ NVT, Ops, 3, false, N->getDebugLoc());
+}
+
SDValue DAGTypeLegalizer::SoftenFloatRes_FMUL(SDNode *N) {
EVT NVT = TLI.getTypeToTransformTo(*DAG.getContext(), N->getValueType(0));
SDValue Ops[2] = { GetSoftenedFloat(N->getOperand(0)),
@@ -837,6 +851,7 @@ void DAGTypeLegalizer::ExpandFloatResult(SDNode *N, unsigned ResNo) {
case ISD::FLOG: ExpandFloatRes_FLOG(N, Lo, Hi); break;
case ISD::FLOG2: ExpandFloatRes_FLOG2(N, Lo, Hi); break;
case ISD::FLOG10: ExpandFloatRes_FLOG10(N, Lo, Hi); break;
+ case ISD::FMA: ExpandFloatRes_FMA(N, Lo, Hi); break;
case ISD::FMUL: ExpandFloatRes_FMUL(N, Lo, Hi); break;
case ISD::FNEARBYINT: ExpandFloatRes_FNEARBYINT(N, Lo, Hi); break;
case ISD::FNEG: ExpandFloatRes_FNEG(N, Lo, Hi); break;
@@ -989,6 +1004,19 @@ void DAGTypeLegalizer::ExpandFloatRes_FLOG10(SDNode *N,
GetPairElements(Call, Lo, Hi);
}
+void DAGTypeLegalizer::ExpandFloatRes_FMA(SDNode *N, SDValue &Lo,
+ SDValue &Hi) {
+ SDValue Ops[3] = { N->getOperand(0), N->getOperand(1), N->getOperand(2) };
+ SDValue Call = MakeLibCall(GetFPLibCall(N->getValueType(0),
+ RTLIB::FMA_F32,
+ RTLIB::FMA_F64,
+ RTLIB::FMA_F80,
+ RTLIB::FMA_PPCF128),
+ N->getValueType(0), Ops, 3, false,
+ N->getDebugLoc());
+ GetPairElements(Call, Lo, Hi);
+}
+
void DAGTypeLegalizer::ExpandFloatRes_FMUL(SDNode *N, SDValue &Lo,
SDValue &Hi) {
SDValue Ops[2] = { N->getOperand(0), N->getOperand(1) };
diff --git a/contrib/llvm/lib/CodeGen/SelectionDAG/LegalizeIntegerTypes.cpp b/contrib/llvm/lib/CodeGen/SelectionDAG/LegalizeIntegerTypes.cpp
index b8da57f..e7c77dd 100644
--- a/contrib/llvm/lib/CodeGen/SelectionDAG/LegalizeIntegerTypes.cpp
+++ b/contrib/llvm/lib/CodeGen/SelectionDAG/LegalizeIntegerTypes.cpp
@@ -19,6 +19,7 @@
//===----------------------------------------------------------------------===//
#include "LegalizeTypes.h"
+#include "llvm/DerivedTypes.h"
#include "llvm/CodeGen/PseudoSourceValue.h"
#include "llvm/Support/ErrorHandling.h"
#include "llvm/Support/raw_ostream.h"
@@ -191,10 +192,6 @@ SDValue DAGTypeLegalizer::PromoteIntRes_BITCAST(SDNode *N) {
if (NOutVT.bitsEq(NInVT))
// The input promotes to the same size. Convert the promoted value.
return DAG.getNode(ISD::BITCAST, dl, NOutVT, GetPromotedInteger(InOp));
- if (NInVT.isVector())
- // Promote vector element via memory load/store.
- return DAG.getNode(ISD::ANY_EXTEND, dl, NOutVT,
- CreateStackStoreLoad(InOp, OutVT));
break;
case TargetLowering::TypeSoftenFloat:
// Promote the integer operand by hand.
@@ -204,8 +201,10 @@ SDValue DAGTypeLegalizer::PromoteIntRes_BITCAST(SDNode *N) {
break;
case TargetLowering::TypeScalarizeVector:
// Convert the element to an integer and promote it by hand.
- return DAG.getNode(ISD::ANY_EXTEND, dl, NOutVT,
- BitConvertToInteger(GetScalarizedVector(InOp)));
+ if (!NOutVT.isVector())
+ return DAG.getNode(ISD::ANY_EXTEND, dl, NOutVT,
+ BitConvertToInteger(GetScalarizedVector(InOp)));
+ break;
case TargetLowering::TypeSplitVector: {
// For example, i32 = BITCAST v2i16 on alpha. Convert the split
// pieces of the input into integers and reassemble in the final type.
@@ -339,8 +338,8 @@ SDValue DAGTypeLegalizer::PromoteIntRes_FP_TO_XINT(SDNode *N) {
// (eg: because the value being converted is too big), then the result of the
// original operation was undefined anyway, so the assert is still correct.
return DAG.getNode(N->getOpcode() == ISD::FP_TO_UINT ?
- ISD::AssertZext : ISD::AssertSext, dl,
- NVT, Res, DAG.getValueType(N->getValueType(0)));
+ ISD::AssertZext : ISD::AssertSext, dl, NVT, Res,
+ DAG.getValueType(N->getValueType(0).getScalarType()));
}
SDValue DAGTypeLegalizer::PromoteIntRes_FP32_TO_FP16(SDNode *N) {
@@ -370,7 +369,8 @@ SDValue DAGTypeLegalizer::PromoteIntRes_INT_EXTEND(SDNode *N) {
return DAG.getNode(ISD::SIGN_EXTEND_INREG, dl, NVT, Res,
DAG.getValueType(N->getOperand(0).getValueType()));
if (N->getOpcode() == ISD::ZERO_EXTEND)
- return DAG.getZeroExtendInReg(Res, dl, N->getOperand(0).getValueType());
+ return DAG.getZeroExtendInReg(Res, dl,
+ N->getOperand(0).getValueType().getScalarType());
assert(N->getOpcode() == ISD::ANY_EXTEND && "Unknown integer extension!");
return Res;
}
@@ -520,20 +520,44 @@ SDValue DAGTypeLegalizer::PromoteIntRes_SRL(SDNode *N) {
SDValue DAGTypeLegalizer::PromoteIntRes_TRUNCATE(SDNode *N) {
EVT NVT = TLI.getTypeToTransformTo(*DAG.getContext(), N->getValueType(0));
SDValue Res;
+ SDValue InOp = N->getOperand(0);
+ DebugLoc dl = N->getDebugLoc();
- switch (getTypeAction(N->getOperand(0).getValueType())) {
+ switch (getTypeAction(InOp.getValueType())) {
default: llvm_unreachable("Unknown type action!");
case TargetLowering::TypeLegal:
case TargetLowering::TypeExpandInteger:
- Res = N->getOperand(0);
+ Res = InOp;
break;
case TargetLowering::TypePromoteInteger:
- Res = GetPromotedInteger(N->getOperand(0));
+ Res = GetPromotedInteger(InOp);
break;
+ case TargetLowering::TypeSplitVector:
+ EVT InVT = InOp.getValueType();
+ assert(InVT.isVector() && "Cannot split scalar types");
+ unsigned NumElts = InVT.getVectorNumElements();
+ assert(NumElts == NVT.getVectorNumElements() &&
+ "Dst and Src must have the same number of elements");
+ EVT EltVT = InVT.getScalarType();
+ assert(isPowerOf2_32(NumElts) &&
+ "Promoted vector type must be a power of two");
+
+ EVT HalfVT = EVT::getVectorVT(*DAG.getContext(), EltVT, NumElts/2);
+ EVT HalfNVT = EVT::getVectorVT(*DAG.getContext(), NVT.getScalarType(),
+ NumElts/2);
+
+ SDValue EOp1 = DAG.getNode(ISD::EXTRACT_SUBVECTOR, dl, HalfVT, InOp,
+ DAG.getIntPtrConstant(0));
+ SDValue EOp2 = DAG.getNode(ISD::EXTRACT_SUBVECTOR, dl, HalfVT, InOp,
+ DAG.getIntPtrConstant(NumElts/2));
+ EOp1 = DAG.getNode(ISD::TRUNCATE, dl, HalfNVT, EOp1);
+ EOp2 = DAG.getNode(ISD::TRUNCATE, dl, HalfNVT, EOp2);
+
+ return DAG.getNode(ISD::CONCAT_VECTORS, dl, NVT, EOp1, EOp2);
}
// Truncate to NVT instead of VT
- return DAG.getNode(ISD::TRUNCATE, N->getDebugLoc(), NVT, Res);
+ return DAG.getNode(ISD::TRUNCATE, dl, NVT, Res);
}
SDValue DAGTypeLegalizer::PromoteIntRes_UADDSUBO(SDNode *N, unsigned ResNo) {
@@ -970,7 +994,8 @@ SDValue DAGTypeLegalizer::PromoteIntOp_ZERO_EXTEND(SDNode *N) {
DebugLoc dl = N->getDebugLoc();
SDValue Op = GetPromotedInteger(N->getOperand(0));
Op = DAG.getNode(ISD::ANY_EXTEND, dl, N->getValueType(0), Op);
- return DAG.getZeroExtendInReg(Op, dl, N->getOperand(0).getValueType());
+ return DAG.getZeroExtendInReg(Op, dl,
+ N->getOperand(0).getValueType().getScalarType());
}
@@ -1069,6 +1094,8 @@ void DAGTypeLegalizer::ExpandIntegerResult(SDNode *N, unsigned ResNo) {
case ISD::SSUBO: ExpandIntRes_SADDSUBO(N, Lo, Hi); break;
case ISD::UADDO:
case ISD::USUBO: ExpandIntRes_UADDSUBO(N, Lo, Hi); break;
+ case ISD::UMULO:
+ case ISD::SMULO: ExpandIntRes_XMULO(N, Lo, Hi); break;
}
// If Lo/Hi is null, the sub-method took care of registering results etc.
@@ -2146,6 +2173,86 @@ void DAGTypeLegalizer::ExpandIntRes_UADDSUBO(SDNode *N,
ReplaceValueWith(SDValue(N, 1), Ofl);
}
+void DAGTypeLegalizer::ExpandIntRes_XMULO(SDNode *N,
+ SDValue &Lo, SDValue &Hi) {
+ EVT VT = N->getValueType(0);
+ const Type *RetTy = VT.getTypeForEVT(*DAG.getContext());
+ EVT PtrVT = TLI.getPointerTy();
+ const Type *PtrTy = PtrVT.getTypeForEVT(*DAG.getContext());
+ DebugLoc dl = N->getDebugLoc();
+
+ // A divide for UMULO should be faster than a function call.
+ if (N->getOpcode() == ISD::UMULO) {
+ SDValue LHS = N->getOperand(0), RHS = N->getOperand(1);
+ DebugLoc DL = N->getDebugLoc();
+
+ SDValue MUL = DAG.getNode(ISD::MUL, DL, LHS.getValueType(), LHS, RHS);
+ SplitInteger(MUL, Lo, Hi);
+
+ // A divide for UMULO will be faster than a function call. Select to
+ // make sure we aren't using 0.
+ SDValue isZero = DAG.getSetCC(dl, TLI.getSetCCResultType(VT),
+ RHS, DAG.getConstant(0, VT), ISD::SETNE);
+ SDValue NotZero = DAG.getNode(ISD::SELECT, dl, VT, isZero,
+ DAG.getConstant(1, VT), RHS);
+ SDValue DIV = DAG.getNode(ISD::UDIV, DL, LHS.getValueType(), MUL, NotZero);
+ SDValue Overflow;
+ Overflow = DAG.getSetCC(DL, N->getValueType(1), DIV, LHS, ISD::SETNE);
+ ReplaceValueWith(SDValue(N, 1), Overflow);
+ return;
+ }
+
+ // Replace this with a libcall that will check overflow.
+ RTLIB::Libcall LC = RTLIB::UNKNOWN_LIBCALL;
+ if (VT == MVT::i32)
+ LC = RTLIB::MULO_I32;
+ else if (VT == MVT::i64)
+ LC = RTLIB::MULO_I64;
+ else if (VT == MVT::i128)
+ LC = RTLIB::MULO_I128;
+ assert(LC != RTLIB::UNKNOWN_LIBCALL && "Unsupported XMULO!");
+
+ SDValue Temp = DAG.CreateStackTemporary(PtrVT);
+ // Temporary for the overflow value, default it to zero.
+ SDValue Chain = DAG.getStore(DAG.getEntryNode(), dl,
+ DAG.getConstant(0, PtrVT), Temp,
+ MachinePointerInfo(), false, false, 0);
+
+ TargetLowering::ArgListTy Args;
+ TargetLowering::ArgListEntry Entry;
+ for (unsigned i = 0, e = N->getNumOperands(); i != e; ++i) {
+ EVT ArgVT = N->getOperand(i).getValueType();
+ const Type *ArgTy = ArgVT.getTypeForEVT(*DAG.getContext());
+ Entry.Node = N->getOperand(i);
+ Entry.Ty = ArgTy;
+ Entry.isSExt = true;
+ Entry.isZExt = false;
+ Args.push_back(Entry);
+ }
+
+ // Also pass the address of the overflow check.
+ Entry.Node = Temp;
+ Entry.Ty = PtrTy->getPointerTo();
+ Entry.isSExt = true;
+ Entry.isZExt = false;
+ Args.push_back(Entry);
+
+ SDValue Func = DAG.getExternalSymbol(TLI.getLibcallName(LC), PtrVT);
+ std::pair<SDValue, SDValue> CallInfo =
+ TLI.LowerCallTo(Chain, RetTy, true, false, false, false,
+ 0, TLI.getLibcallCallingConv(LC), false,
+ true, Func, Args, DAG, dl);
+
+ SplitInteger(CallInfo.first, Lo, Hi);
+ SDValue Temp2 = DAG.getLoad(PtrVT, dl, CallInfo.second, Temp,
+ MachinePointerInfo(), false, false, 0);
+ SDValue Ofl = DAG.getSetCC(dl, N->getValueType(1), Temp2,
+ DAG.getConstant(0, PtrVT),
+ ISD::SETNE);
+ // Use the overflow from the libcall everywhere.
+ ReplaceValueWith(SDValue(N, 1), Ofl);
+}
+
void DAGTypeLegalizer::ExpandIntRes_UDIV(SDNode *N,
SDValue &Lo, SDValue &Hi) {
EVT VT = N->getValueType(0);
@@ -2638,18 +2745,18 @@ SDValue DAGTypeLegalizer::ExpandIntOp_UINT_TO_FP(SDNode *N) {
SDValue DAGTypeLegalizer::PromoteIntRes_EXTRACT_SUBVECTOR(SDNode *N) {
SDValue InOp0 = N->getOperand(0);
EVT InVT = InOp0.getValueType();
- EVT NInVT = TLI.getTypeToTransformTo(*DAG.getContext(), InVT);
EVT OutVT = N->getValueType(0);
EVT NOutVT = TLI.getTypeToTransformTo(*DAG.getContext(), OutVT);
assert(NOutVT.isVector() && "This type must be promoted to a vector type");
- unsigned OutNumElems = N->getValueType(0).getVectorNumElements();
+ unsigned OutNumElems = OutVT.getVectorNumElements();
EVT NOutVTElem = NOutVT.getVectorElementType();
DebugLoc dl = N->getDebugLoc();
SDValue BaseIdx = N->getOperand(1);
SmallVector<SDValue, 8> Ops;
+ Ops.reserve(OutNumElems);
for (unsigned i = 0; i != OutNumElems; ++i) {
// Extract the element from the original vector.
@@ -2681,18 +2788,13 @@ SDValue DAGTypeLegalizer::PromoteIntRes_VECTOR_SHUFFLE(SDNode *N) {
SDValue V0 = GetPromotedInteger(N->getOperand(0));
SDValue V1 = GetPromotedInteger(N->getOperand(1));
- EVT OutVT = TLI.getTypeToTransformTo(*DAG.getContext(), VT);
+ EVT OutVT = V0.getValueType();
- return DAG.getVectorShuffle(OutVT, dl, V0,V1, &NewMask[0]);
+ return DAG.getVectorShuffle(OutVT, dl, V0, V1, &NewMask[0]);
}
SDValue DAGTypeLegalizer::PromoteIntRes_BUILD_VECTOR(SDNode *N) {
-
- SDValue InOp0 = N->getOperand(0);
- EVT InVT = InOp0.getValueType();
- EVT NInVT = TLI.getTypeToTransformTo(*DAG.getContext(), InVT);
-
EVT OutVT = N->getValueType(0);
EVT NOutVT = TLI.getTypeToTransformTo(*DAG.getContext(), OutVT);
assert(NOutVT.isVector() && "This type must be promoted to a vector type");
@@ -2702,6 +2804,7 @@ SDValue DAGTypeLegalizer::PromoteIntRes_BUILD_VECTOR(SDNode *N) {
DebugLoc dl = N->getDebugLoc();
SmallVector<SDValue, 8> Ops;
+ Ops.reserve(NumElems);
for (unsigned i = 0; i != NumElems; ++i) {
SDValue Op = DAG.getNode(ISD::ANY_EXTEND, dl, NOutVTElem, N->getOperand(i));
Ops.push_back(Op);
@@ -2714,10 +2817,8 @@ SDValue DAGTypeLegalizer::PromoteIntRes_SCALAR_TO_VECTOR(SDNode *N) {
DebugLoc dl = N->getDebugLoc();
- SDValue InOp0 = N->getOperand(0);
- EVT InVT = InOp0.getValueType();
- EVT NInVT = TLI.getTypeToTransformTo(*DAG.getContext(), InVT);
- assert(!InVT.isVector() && "Input must not be a scalar");
+ assert(!N->getOperand(0).getValueType().isVector() &&
+ "Input must be a scalar");
EVT OutVT = N->getValueType(0);
EVT NOutVT = TLI.getTypeToTransformTo(*DAG.getContext(), OutVT);
@@ -2730,12 +2831,6 @@ SDValue DAGTypeLegalizer::PromoteIntRes_SCALAR_TO_VECTOR(SDNode *N) {
}
SDValue DAGTypeLegalizer::PromoteIntRes_INSERT_VECTOR_ELT(SDNode *N) {
-
- SDValue InOp0 = N->getOperand(0);
- EVT InVT = InOp0.getValueType();
- EVT InElVT = InVT.getVectorElementType();
- EVT NInVT = TLI.getTypeToTransformTo(*DAG.getContext(), InVT);
-
EVT OutVT = N->getValueType(0);
EVT NOutVT = TLI.getTypeToTransformTo(*DAG.getContext(), OutVT);
assert(NOutVT.isVector() && "This type must be promoted to a vector type");
@@ -2744,7 +2839,8 @@ SDValue DAGTypeLegalizer::PromoteIntRes_INSERT_VECTOR_ELT(SDNode *N) {
DebugLoc dl = N->getDebugLoc();
- SDValue ConvertedVector = DAG.getNode(ISD::ANY_EXTEND, dl, NOutVT, InOp0);
+ SDValue ConvertedVector = DAG.getNode(ISD::ANY_EXTEND, dl, NOutVT,
+ N->getOperand(0));
SDValue ConvElem = DAG.getNode(ISD::ANY_EXTEND, dl,
NOutVTElem, N->getOperand(1));
diff --git a/contrib/llvm/lib/CodeGen/SelectionDAG/LegalizeTypes.h b/contrib/llvm/lib/CodeGen/SelectionDAG/LegalizeTypes.h
index b2f966b..952797d 100644
--- a/contrib/llvm/lib/CodeGen/SelectionDAG/LegalizeTypes.h
+++ b/contrib/llvm/lib/CodeGen/SelectionDAG/LegalizeTypes.h
@@ -201,7 +201,7 @@ private:
EVT OldVT = Op.getValueType();
DebugLoc dl = Op.getDebugLoc();
Op = GetPromotedInteger(Op);
- return DAG.getZeroExtendInReg(Op, dl, OldVT);
+ return DAG.getZeroExtendInReg(Op, dl, OldVT.getScalarType());
}
// Integer Result Promotion.
@@ -318,6 +318,7 @@ private:
void ExpandIntRes_SADDSUBO (SDNode *N, SDValue &Lo, SDValue &Hi);
void ExpandIntRes_UADDSUBO (SDNode *N, SDValue &Lo, SDValue &Hi);
+ void ExpandIntRes_XMULO (SDNode *N, SDValue &Lo, SDValue &Hi);
void ExpandShiftByConstant(SDNode *N, unsigned Amt,
SDValue &Lo, SDValue &Hi);
@@ -377,6 +378,7 @@ private:
SDValue SoftenFloatRes_FLOG(SDNode *N);
SDValue SoftenFloatRes_FLOG2(SDNode *N);
SDValue SoftenFloatRes_FLOG10(SDNode *N);
+ SDValue SoftenFloatRes_FMA(SDNode *N);
SDValue SoftenFloatRes_FMUL(SDNode *N);
SDValue SoftenFloatRes_FNEARBYINT(SDNode *N);
SDValue SoftenFloatRes_FNEG(SDNode *N);
@@ -441,6 +443,7 @@ private:
void ExpandFloatRes_FLOG (SDNode *N, SDValue &Lo, SDValue &Hi);
void ExpandFloatRes_FLOG2 (SDNode *N, SDValue &Lo, SDValue &Hi);
void ExpandFloatRes_FLOG10 (SDNode *N, SDValue &Lo, SDValue &Hi);
+ void ExpandFloatRes_FMA (SDNode *N, SDValue &Lo, SDValue &Hi);
void ExpandFloatRes_FMUL (SDNode *N, SDValue &Lo, SDValue &Hi);
void ExpandFloatRes_FNEARBYINT(SDNode *N, SDValue &Lo, SDValue &Hi);
void ExpandFloatRes_FNEG (SDNode *N, SDValue &Lo, SDValue &Hi);
diff --git a/contrib/llvm/lib/CodeGen/SelectionDAG/LegalizeVectorOps.cpp b/contrib/llvm/lib/CodeGen/SelectionDAG/LegalizeVectorOps.cpp
index 5d0f923..ffff10c 100644
--- a/contrib/llvm/lib/CodeGen/SelectionDAG/LegalizeVectorOps.cpp
+++ b/contrib/llvm/lib/CodeGen/SelectionDAG/LegalizeVectorOps.cpp
@@ -182,9 +182,9 @@ SDValue VectorLegalizer::LegalizeOp(SDValue Op) {
case ISD::FRINT:
case ISD::FNEARBYINT:
case ISD::FFLOOR:
+ case ISD::SIGN_EXTEND_INREG:
QueryType = Node->getValueType(0);
break;
- case ISD::SIGN_EXTEND_INREG:
case ISD::FP_ROUND_INREG:
QueryType = cast<VTSDNode>(Node->getOperand(1))->getVT();
break;
diff --git a/contrib/llvm/lib/CodeGen/SelectionDAG/LegalizeVectorTypes.cpp b/contrib/llvm/lib/CodeGen/SelectionDAG/LegalizeVectorTypes.cpp
index 9595f69..b5698f9 100644
--- a/contrib/llvm/lib/CodeGen/SelectionDAG/LegalizeVectorTypes.cpp
+++ b/contrib/llvm/lib/CodeGen/SelectionDAG/LegalizeVectorTypes.cpp
@@ -2164,6 +2164,7 @@ static EVT FindMemType(SelectionDAG& DAG, const TargetLowering &TLI,
if (MemVT.getSizeInBits() <= WidenEltWidth)
break;
if (TLI.isTypeLegal(MemVT) && (WidenWidth % MemVTWidth) == 0 &&
+ isPowerOf2_32(WidenWidth / MemVTWidth) &&
(MemVTWidth <= Width ||
(Align!=0 && MemVTWidth<=AlignInBits && MemVTWidth<=Width+WidenEx))) {
RetVT = MemVT;
@@ -2179,6 +2180,7 @@ static EVT FindMemType(SelectionDAG& DAG, const TargetLowering &TLI,
unsigned MemVTWidth = MemVT.getSizeInBits();
if (TLI.isTypeLegal(MemVT) && WidenEltVT == MemVT.getVectorElementType() &&
(WidenWidth % MemVTWidth) == 0 &&
+ isPowerOf2_32(WidenWidth / MemVTWidth) &&
(MemVTWidth <= Width ||
(Align!=0 && MemVTWidth<=AlignInBits && MemVTWidth<=Width+WidenEx))) {
if (RetVT.getSizeInBits() < MemVTWidth || MemVT == WidenVT)
diff --git a/contrib/llvm/lib/CodeGen/SelectionDAG/ScheduleDAGFast.cpp b/contrib/llvm/lib/CodeGen/SelectionDAG/ScheduleDAGFast.cpp
index 7b560d1..b275c63 100644
--- a/contrib/llvm/lib/CodeGen/SelectionDAG/ScheduleDAGFast.cpp
+++ b/contrib/llvm/lib/CodeGen/SelectionDAG/ScheduleDAGFast.cpp
@@ -249,14 +249,14 @@ SUnit *ScheduleDAGFast::CopyAndMoveSuccessors(SUnit *SU) {
assert(N->getNodeId() == -1 && "Node already inserted!");
N->setNodeId(NewSU->NodeNum);
- const TargetInstrDesc &TID = TII->get(N->getMachineOpcode());
- for (unsigned i = 0; i != TID.getNumOperands(); ++i) {
- if (TID.getOperandConstraint(i, TOI::TIED_TO) != -1) {
+ const MCInstrDesc &MCID = TII->get(N->getMachineOpcode());
+ for (unsigned i = 0; i != MCID.getNumOperands(); ++i) {
+ if (MCID.getOperandConstraint(i, MCOI::TIED_TO) != -1) {
NewSU->isTwoAddress = true;
break;
}
}
- if (TID.isCommutable())
+ if (MCID.isCommutable())
NewSU->isCommutable = true;
// LoadNode may already exist. This can happen when there is another
@@ -422,10 +422,10 @@ void ScheduleDAGFast::InsertCopiesAndMoveSuccs(SUnit *SU, unsigned Reg,
/// FIXME: Move to SelectionDAG?
static EVT getPhysicalRegisterVT(SDNode *N, unsigned Reg,
const TargetInstrInfo *TII) {
- const TargetInstrDesc &TID = TII->get(N->getMachineOpcode());
- assert(TID.ImplicitDefs && "Physical reg def must be in implicit def list!");
- unsigned NumRes = TID.getNumDefs();
- for (const unsigned *ImpDef = TID.getImplicitDefs(); *ImpDef; ++ImpDef) {
+ const MCInstrDesc &MCID = TII->get(N->getMachineOpcode());
+ assert(MCID.ImplicitDefs && "Physical reg def must be in implicit def list!");
+ unsigned NumRes = MCID.getNumDefs();
+ for (const unsigned *ImpDef = MCID.getImplicitDefs(); *ImpDef; ++ImpDef) {
if (Reg == *ImpDef)
break;
++NumRes;
@@ -490,7 +490,8 @@ bool ScheduleDAGFast::DelayForLiveRegsBottomUp(SUnit *SU,
++i; // Skip the ID value.
if (InlineAsm::isRegDefKind(Flags) ||
- InlineAsm::isRegDefEarlyClobberKind(Flags)) {
+ InlineAsm::isRegDefEarlyClobberKind(Flags) ||
+ InlineAsm::isClobberKind(Flags)) {
// Check for def of register or earlyclobber register.
for (; NumVals; --NumVals, ++i) {
unsigned Reg = cast<RegisterSDNode>(Node->getOperand(i))->getReg();
@@ -504,10 +505,10 @@ bool ScheduleDAGFast::DelayForLiveRegsBottomUp(SUnit *SU,
}
if (!Node->isMachineOpcode())
continue;
- const TargetInstrDesc &TID = TII->get(Node->getMachineOpcode());
- if (!TID.ImplicitDefs)
+ const MCInstrDesc &MCID = TII->get(Node->getMachineOpcode());
+ if (!MCID.ImplicitDefs)
continue;
- for (const unsigned *Reg = TID.ImplicitDefs; *Reg; ++Reg) {
+ for (const unsigned *Reg = MCID.ImplicitDefs; *Reg; ++Reg) {
CheckForLiveRegDef(SU, *Reg, LiveRegDefs, RegAdded, LRegs, TRI);
}
}
diff --git a/contrib/llvm/lib/CodeGen/SelectionDAG/ScheduleDAGRRList.cpp b/contrib/llvm/lib/CodeGen/SelectionDAG/ScheduleDAGRRList.cpp
index 8d61a89..12b1838 100644
--- a/contrib/llvm/lib/CodeGen/SelectionDAG/ScheduleDAGRRList.cpp
+++ b/contrib/llvm/lib/CodeGen/SelectionDAG/ScheduleDAGRRList.cpp
@@ -276,6 +276,43 @@ private:
};
} // end anonymous namespace
+/// GetCostForDef - Looks up the register class and cost for a given definition.
+/// Typically this just means looking up the representative register class,
+/// but for untyped values (MVT::untyped) it means inspecting the node's
+/// opcode to determine what register class is being generated.
+static void GetCostForDef(const ScheduleDAGSDNodes::RegDefIter &RegDefPos,
+ const TargetLowering *TLI,
+ const TargetInstrInfo *TII,
+ const TargetRegisterInfo *TRI,
+ unsigned &RegClass, unsigned &Cost) {
+ EVT VT = RegDefPos.GetValue();
+
+ // Special handling for untyped values. These values can only come from
+ // the expansion of custom DAG-to-DAG patterns.
+ if (VT == MVT::untyped) {
+ const SDNode *Node = RegDefPos.GetNode();
+ unsigned Opcode = Node->getMachineOpcode();
+
+ if (Opcode == TargetOpcode::REG_SEQUENCE) {
+ unsigned DstRCIdx = cast<ConstantSDNode>(Node->getOperand(0))->getZExtValue();
+ const TargetRegisterClass *RC = TRI->getRegClass(DstRCIdx);
+ RegClass = RC->getID();
+ Cost = 1;
+ return;
+ }
+
+ unsigned Idx = RegDefPos.GetIdx();
+ const MCInstrDesc Desc = TII->get(Opcode);
+ const TargetRegisterClass *RC = TII->getRegClass(Desc, Idx, TRI);
+ RegClass = RC->getID();
+ // FIXME: Cost arbitrarily set to 1 because there doesn't seem to be a
+ // better way to determine it.
+ Cost = 1;
+ } else {
+ RegClass = TLI->getRepRegClassFor(VT)->getID();
+ Cost = TLI->getRepRegClassCostFor(VT);
+ }
+}
/// Schedule - Schedule the DAG using list scheduling.
void ScheduleDAGRRList::Schedule() {
@@ -800,14 +837,14 @@ SUnit *ScheduleDAGRRList::CopyAndMoveSuccessors(SUnit *SU) {
assert(N->getNodeId() == -1 && "Node already inserted!");
N->setNodeId(NewSU->NodeNum);
- const TargetInstrDesc &TID = TII->get(N->getMachineOpcode());
- for (unsigned i = 0; i != TID.getNumOperands(); ++i) {
- if (TID.getOperandConstraint(i, TOI::TIED_TO) != -1) {
+ const MCInstrDesc &MCID = TII->get(N->getMachineOpcode());
+ for (unsigned i = 0; i != MCID.getNumOperands(); ++i) {
+ if (MCID.getOperandConstraint(i, MCOI::TIED_TO) != -1) {
NewSU->isTwoAddress = true;
break;
}
}
- if (TID.isCommutable())
+ if (MCID.isCommutable())
NewSU->isCommutable = true;
InitNumRegDefsLeft(NewSU);
@@ -987,10 +1024,10 @@ void ScheduleDAGRRList::InsertCopiesAndMoveSuccs(SUnit *SU, unsigned Reg,
/// FIXME: Move to SelectionDAG?
static EVT getPhysicalRegisterVT(SDNode *N, unsigned Reg,
const TargetInstrInfo *TII) {
- const TargetInstrDesc &TID = TII->get(N->getMachineOpcode());
- assert(TID.ImplicitDefs && "Physical reg def must be in implicit def list!");
- unsigned NumRes = TID.getNumDefs();
- for (const unsigned *ImpDef = TID.getImplicitDefs(); *ImpDef; ++ImpDef) {
+ const MCInstrDesc &MCID = TII->get(N->getMachineOpcode());
+ assert(MCID.ImplicitDefs && "Physical reg def must be in implicit def list!");
+ unsigned NumRes = MCID.getNumDefs();
+ for (const unsigned *ImpDef = MCID.getImplicitDefs(); *ImpDef; ++ImpDef) {
if (Reg == *ImpDef)
break;
++NumRes;
@@ -1055,7 +1092,8 @@ DelayForLiveRegsBottomUp(SUnit *SU, SmallVector<unsigned, 4> &LRegs) {
++i; // Skip the ID value.
if (InlineAsm::isRegDefKind(Flags) ||
- InlineAsm::isRegDefEarlyClobberKind(Flags)) {
+ InlineAsm::isRegDefEarlyClobberKind(Flags) ||
+ InlineAsm::isClobberKind(Flags)) {
// Check for def of register or earlyclobber register.
for (; NumVals; --NumVals, ++i) {
unsigned Reg = cast<RegisterSDNode>(Node->getOperand(i))->getReg();
@@ -1070,10 +1108,10 @@ DelayForLiveRegsBottomUp(SUnit *SU, SmallVector<unsigned, 4> &LRegs) {
if (!Node->isMachineOpcode())
continue;
- const TargetInstrDesc &TID = TII->get(Node->getMachineOpcode());
- if (!TID.ImplicitDefs)
+ const MCInstrDesc &MCID = TII->get(Node->getMachineOpcode());
+ if (!MCID.ImplicitDefs)
continue;
- for (const unsigned *Reg = TID.ImplicitDefs; *Reg; ++Reg)
+ for (const unsigned *Reg = MCID.ImplicitDefs; *Reg; ++Reg)
CheckForLiveRegDef(SU, *Reg, LiveRegDefs, RegAdded, LRegs, TRI);
}
@@ -1369,6 +1407,21 @@ struct queue_sort : public std::binary_function<SUnit*, SUnit*, bool> {
bool isReady(SUnit* SU, unsigned CurCycle) const { return true; }
};
+#ifndef NDEBUG
+template<class SF>
+struct reverse_sort : public queue_sort {
+ SF &SortFunc;
+ reverse_sort(SF &sf) : SortFunc(sf) {}
+ reverse_sort(const reverse_sort &RHS) : SortFunc(RHS.SortFunc) {}
+
+ bool operator()(SUnit* left, SUnit* right) const {
+ // reverse left/right rather than simply !SortFunc(left, right)
+ // to expose different paths in the comparison logic.
+ return SortFunc(right, left);
+ }
+};
+#endif // NDEBUG
+
/// bu_ls_rr_sort - Priority function for bottom up register pressure
// reduction scheduler.
struct bu_ls_rr_sort : public queue_sort {
@@ -1569,20 +1622,33 @@ protected:
};
template<class SF>
-class RegReductionPriorityQueue : public RegReductionPQBase {
- static SUnit *popFromQueue(std::vector<SUnit*> &Q, SF &Picker) {
- std::vector<SUnit *>::iterator Best = Q.begin();
- for (std::vector<SUnit *>::iterator I = llvm::next(Q.begin()),
- E = Q.end(); I != E; ++I)
- if (Picker(*Best, *I))
- Best = I;
- SUnit *V = *Best;
- if (Best != prior(Q.end()))
- std::swap(*Best, Q.back());
- Q.pop_back();
- return V;
+static SUnit *popFromQueueImpl(std::vector<SUnit*> &Q, SF &Picker) {
+ std::vector<SUnit *>::iterator Best = Q.begin();
+ for (std::vector<SUnit *>::iterator I = llvm::next(Q.begin()),
+ E = Q.end(); I != E; ++I)
+ if (Picker(*Best, *I))
+ Best = I;
+ SUnit *V = *Best;
+ if (Best != prior(Q.end()))
+ std::swap(*Best, Q.back());
+ Q.pop_back();
+ return V;
+}
+
+template<class SF>
+SUnit *popFromQueue(std::vector<SUnit*> &Q, SF &Picker, ScheduleDAG *DAG) {
+#ifndef NDEBUG
+ if (DAG->StressSched) {
+ reverse_sort<SF> RPicker(Picker);
+ return popFromQueueImpl(Q, RPicker);
}
+#endif
+ (void)DAG;
+ return popFromQueueImpl(Q, Picker);
+}
+template<class SF>
+class RegReductionPriorityQueue : public RegReductionPQBase {
SF Picker;
public:
@@ -1603,7 +1669,7 @@ public:
SUnit *pop() {
if (Queue.empty()) return NULL;
- SUnit *V = popFromQueue(Queue, Picker);
+ SUnit *V = popFromQueue(Queue, Picker, scheduleDAG);
V->NodeQueueId = 0;
return V;
}
@@ -1613,7 +1679,7 @@ public:
std::vector<SUnit*> DumpQueue = Queue;
SF DumpPicker = Picker;
while (!DumpQueue.empty()) {
- SUnit *SU = popFromQueue(DumpQueue, DumpPicker);
+ SUnit *SU = popFromQueue(DumpQueue, DumpPicker, scheduleDAG);
if (isBottomUp())
dbgs() << "Height " << SU->getHeight() << ": ";
else
@@ -1778,9 +1844,9 @@ bool RegReductionPQBase::HighRegPressure(const SUnit *SU) const {
}
for (ScheduleDAGSDNodes::RegDefIter RegDefPos(PredSU, scheduleDAG);
RegDefPos.IsValid(); RegDefPos.Advance()) {
- EVT VT = RegDefPos.GetValue();
- unsigned RCId = TLI->getRepRegClassFor(VT)->getID();
- unsigned Cost = TLI->getRepRegClassCostFor(VT);
+ unsigned RCId, Cost;
+ GetCostForDef(RegDefPos, TLI, TII, TRI, RCId, Cost);
+
if ((RegPressure[RCId] + Cost) >= RegLimit[RCId])
return true;
}
@@ -1891,9 +1957,10 @@ void RegReductionPQBase::ScheduledNode(SUnit *SU) {
RegDefPos.IsValid(); RegDefPos.Advance(), --SkipRegDefs) {
if (SkipRegDefs)
continue;
- EVT VT = RegDefPos.GetValue();
- unsigned RCId = TLI->getRepRegClassFor(VT)->getID();
- RegPressure[RCId] += TLI->getRepRegClassCostFor(VT);
+
+ unsigned RCId, Cost;
+ GetCostForDef(RegDefPos, TLI, TII, TRI, RCId, Cost);
+ RegPressure[RCId] += Cost;
break;
}
}
@@ -1906,16 +1973,16 @@ void RegReductionPQBase::ScheduledNode(SUnit *SU) {
RegDefPos.IsValid(); RegDefPos.Advance(), --SkipRegDefs) {
if (SkipRegDefs > 0)
continue;
- EVT VT = RegDefPos.GetValue();
- unsigned RCId = TLI->getRepRegClassFor(VT)->getID();
- if (RegPressure[RCId] < TLI->getRepRegClassCostFor(VT)) {
+ unsigned RCId, Cost;
+ GetCostForDef(RegDefPos, TLI, TII, TRI, RCId, Cost);
+ if (RegPressure[RCId] < Cost) {
// Register pressure tracking is imprecise. This can happen. But we try
// hard not to let it happen because it likely results in poor scheduling.
DEBUG(dbgs() << " SU(" << SU->NodeNum << ") has too many regdefs\n");
RegPressure[RCId] = 0;
}
else {
- RegPressure[RCId] -= TLI->getRepRegClassCostFor(VT);
+ RegPressure[RCId] -= Cost;
}
}
dumpRegPressure();
@@ -1962,13 +2029,9 @@ void RegReductionPQBase::UnscheduledNode(SUnit *SU) {
unsigned POpc = PN->getMachineOpcode();
if (POpc == TargetOpcode::IMPLICIT_DEF)
continue;
- if (POpc == TargetOpcode::EXTRACT_SUBREG) {
- EVT VT = PN->getOperand(0).getValueType();
- unsigned RCId = TLI->getRepRegClassFor(VT)->getID();
- RegPressure[RCId] += TLI->getRepRegClassCostFor(VT);
- continue;
- } else if (POpc == TargetOpcode::INSERT_SUBREG ||
- POpc == TargetOpcode::SUBREG_TO_REG) {
+ if (POpc == TargetOpcode::EXTRACT_SUBREG ||
+ POpc == TargetOpcode::INSERT_SUBREG ||
+ POpc == TargetOpcode::SUBREG_TO_REG) {
EVT VT = PN->getValueType(0);
unsigned RCId = TLI->getRepRegClassFor(VT)->getID();
RegPressure[RCId] += TLI->getRepRegClassCostFor(VT);
@@ -2543,11 +2606,11 @@ void RegReductionPQBase::initNodes(std::vector<SUnit> &sunits) {
bool RegReductionPQBase::canClobber(const SUnit *SU, const SUnit *Op) {
if (SU->isTwoAddress) {
unsigned Opc = SU->getNode()->getMachineOpcode();
- const TargetInstrDesc &TID = TII->get(Opc);
- unsigned NumRes = TID.getNumDefs();
- unsigned NumOps = TID.getNumOperands() - NumRes;
+ const MCInstrDesc &MCID = TII->get(Opc);
+ unsigned NumRes = MCID.getNumDefs();
+ unsigned NumOps = MCID.getNumOperands() - NumRes;
for (unsigned i = 0; i != NumOps; ++i) {
- if (TID.getOperandConstraint(i+NumRes, TOI::TIED_TO) != -1) {
+ if (MCID.getOperandConstraint(i+NumRes, MCOI::TIED_TO) != -1) {
SDNode *DU = SU->getNode()->getOperand(i).getNode();
if (DU->getNodeId() != -1 &&
Op->OrigNode == &(*SUnits)[DU->getNodeId()])
@@ -2727,11 +2790,11 @@ void RegReductionPQBase::AddPseudoTwoAddrDeps() {
bool isLiveOut = hasOnlyLiveOutUses(SU);
unsigned Opc = Node->getMachineOpcode();
- const TargetInstrDesc &TID = TII->get(Opc);
- unsigned NumRes = TID.getNumDefs();
- unsigned NumOps = TID.getNumOperands() - NumRes;
+ const MCInstrDesc &MCID = TII->get(Opc);
+ unsigned NumRes = MCID.getNumDefs();
+ unsigned NumOps = MCID.getNumOperands() - NumRes;
for (unsigned j = 0; j != NumOps; ++j) {
- if (TID.getOperandConstraint(j+NumRes, TOI::TIED_TO) == -1)
+ if (MCID.getOperandConstraint(j+NumRes, MCOI::TIED_TO) == -1)
continue;
SDNode *DU = SU->getNode()->getOperand(j).getNode();
if (DU->getNodeId() == -1)
diff --git a/contrib/llvm/lib/CodeGen/SelectionDAG/ScheduleDAGSDNodes.cpp b/contrib/llvm/lib/CodeGen/SelectionDAG/ScheduleDAGSDNodes.cpp
index 9f2f012..71f07d6 100644
--- a/contrib/llvm/lib/CodeGen/SelectionDAG/ScheduleDAGSDNodes.cpp
+++ b/contrib/llvm/lib/CodeGen/SelectionDAG/ScheduleDAGSDNodes.cpp
@@ -17,11 +17,12 @@
#include "ScheduleDAGSDNodes.h"
#include "InstrEmitter.h"
#include "llvm/CodeGen/SelectionDAG.h"
+#include "llvm/MC/MCInstrItineraries.h"
#include "llvm/Target/TargetMachine.h"
#include "llvm/Target/TargetInstrInfo.h"
#include "llvm/Target/TargetLowering.h"
#include "llvm/Target/TargetRegisterInfo.h"
-#include "llvm/Target/TargetSubtarget.h"
+#include "llvm/Target/TargetSubtargetInfo.h"
#include "llvm/ADT/DenseMap.h"
#include "llvm/ADT/SmallPtrSet.h"
#include "llvm/ADT/SmallSet.h"
@@ -111,7 +112,7 @@ static void CheckForPhysRegDependency(SDNode *Def, SDNode *User, unsigned Op,
unsigned ResNo = User->getOperand(2).getResNo();
if (Def->isMachineOpcode()) {
- const TargetInstrDesc &II = TII->get(Def->getMachineOpcode());
+ const MCInstrDesc &II = TII->get(Def->getMachineOpcode());
if (ResNo >= II.getNumDefs() &&
II.ImplicitDefs[ResNo - II.getNumDefs()] == Reg) {
PhysReg = Reg;
@@ -255,8 +256,8 @@ void ScheduleDAGSDNodes::ClusterNodes() {
continue;
unsigned Opc = Node->getMachineOpcode();
- const TargetInstrDesc &TID = TII->get(Opc);
- if (TID.mayLoad())
+ const MCInstrDesc &MCID = TII->get(Opc);
+ if (MCID.mayLoad())
// Cluster loads from "near" addresses into combined SUnits.
ClusterNeighboringLoads(Node);
}
@@ -378,7 +379,7 @@ void ScheduleDAGSDNodes::BuildSchedUnits() {
}
void ScheduleDAGSDNodes::AddSchedEdges() {
- const TargetSubtarget &ST = TM.getSubtarget<TargetSubtarget>();
+ const TargetSubtargetInfo &ST = TM.getSubtarget<TargetSubtargetInfo>();
// Check to see if the scheduler cares about latencies.
bool UnitLatencies = ForceUnitLatencies();
@@ -390,14 +391,14 @@ void ScheduleDAGSDNodes::AddSchedEdges() {
if (MainNode->isMachineOpcode()) {
unsigned Opc = MainNode->getMachineOpcode();
- const TargetInstrDesc &TID = TII->get(Opc);
- for (unsigned i = 0; i != TID.getNumOperands(); ++i) {
- if (TID.getOperandConstraint(i, TOI::TIED_TO) != -1) {
+ const MCInstrDesc &MCID = TII->get(Opc);
+ for (unsigned i = 0; i != MCID.getNumOperands(); ++i) {
+ if (MCID.getOperandConstraint(i, MCOI::TIED_TO) != -1) {
SU->isTwoAddress = true;
break;
}
}
- if (TID.isCommutable())
+ if (MCID.isCommutable())
SU->isCommutable = true;
}
@@ -435,7 +436,7 @@ void ScheduleDAGSDNodes::AddSchedEdges() {
// it requires a cross class copy (cost < 0). That means we are only
// treating "expensive to copy" register dependency as physical register
// dependency. This may change in the future though.
- if (Cost >= 0)
+ if (Cost >= 0 && !StressSched)
PhysReg = 0;
// If this is a ctrl dep, latency is 1.
@@ -520,14 +521,7 @@ void ScheduleDAGSDNodes::RegDefIter::Advance() {
for (;DefIdx < NodeNumDefs; ++DefIdx) {
if (!Node->hasAnyUseOfValue(DefIdx))
continue;
- if (Node->isMachineOpcode() &&
- Node->getMachineOpcode() == TargetOpcode::EXTRACT_SUBREG) {
- // Propagate the incoming (full-register) type. I doubt it's needed.
- ValueType = Node->getOperand(0).getValueType();
- }
- else {
- ValueType = Node->getValueType(DefIdx);
- }
+ ValueType = Node->getValueType(DefIdx);
++DefIdx;
return; // Found a normal regdef.
}
@@ -649,7 +643,7 @@ static void ProcessSDDbgValues(SDNode *N, SelectionDAG *DAG,
// order number right after the N.
MachineBasicBlock *BB = Emitter.getBlock();
MachineBasicBlock::iterator InsertPos = Emitter.getInsertPos();
- SmallVector<SDDbgValue*,2> &DVs = DAG->GetDbgValues(N);
+ ArrayRef<SDDbgValue*> DVs = DAG->GetDbgValues(N);
for (unsigned i = 0, e = DVs.size(); i != e; ++i) {
if (DVs[i]->isInvalidated())
continue;
diff --git a/contrib/llvm/lib/CodeGen/SelectionDAG/ScheduleDAGSDNodes.h b/contrib/llvm/lib/CodeGen/SelectionDAG/ScheduleDAGSDNodes.h
index b5f68f3..9c27b2e 100644
--- a/contrib/llvm/lib/CodeGen/SelectionDAG/ScheduleDAGSDNodes.h
+++ b/contrib/llvm/lib/CodeGen/SelectionDAG/ScheduleDAGSDNodes.h
@@ -135,6 +135,14 @@ namespace llvm {
return ValueType;
}
+ const SDNode *GetNode() const {
+ return Node;
+ }
+
+ unsigned GetIdx() const {
+ return DefIdx-1;
+ }
+
void Advance();
private:
void InitNodeNumDefs();
diff --git a/contrib/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp b/contrib/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp
index 68eeb60..35ea0bb 100644
--- a/contrib/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp
+++ b/contrib/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp
@@ -598,7 +598,7 @@ void SelectionDAG::DeallocateNode(SDNode *N) {
Ordering->remove(N);
// If any of the SDDbgValue nodes refer to this SDNode, invalidate them.
- SmallVector<SDDbgValue*, 2> &DbgVals = DbgInfo->getSDDbgValues(N);
+ ArrayRef<SDDbgValue*> DbgVals = DbgInfo->getSDDbgValues(N);
for (unsigned i = 0, e = DbgVals.size(); i != e; ++i)
DbgVals[i]->setIsInvalidated();
}
@@ -3326,13 +3326,13 @@ static bool FindOptimalMemOpLowering(std::vector<EVT> &MemOps,
const TargetLowering &TLI) {
assert((SrcAlign == 0 || SrcAlign >= DstAlign) &&
"Expecting memcpy / memset source to meet alignment requirement!");
- // If 'SrcAlign' is zero, that means the memory operation does not need load
- // the value, i.e. memset or memcpy from constant string. Otherwise, it's
- // the inferred alignment of the source. 'DstAlign', on the other hand, is the
- // specified alignment of the memory operation. If it is zero, that means
- // it's possible to change the alignment of the destination. 'MemcpyStrSrc'
- // indicates whether the memcpy source is constant so it does not need to be
- // loaded.
+ // If 'SrcAlign' is zero, that means the memory operation does not need to
+ // load the value, i.e. memset or memcpy from constant string. Otherwise,
+ // it's the inferred alignment of the source. 'DstAlign', on the other hand,
+ // is the specified alignment of the memory operation. If it is zero, that
+ // means it's possible to change the alignment of the destination.
+ // 'MemcpyStrSrc' indicates whether the memcpy source is constant so it does
+ // not need to be loaded.
EVT VT = TLI.getOptimalMemOpType(Size, DstAlign, SrcAlign,
NonScalarIntSafe, MemcpyStrSrc,
DAG.getMachineFunction());
@@ -4037,6 +4037,8 @@ SelectionDAG::getLoad(ISD::MemIndexedMode AM, ISD::LoadExtType ExtType,
MachinePointerInfo PtrInfo, EVT MemVT,
bool isVolatile, bool isNonTemporal,
unsigned Alignment, const MDNode *TBAAInfo) {
+ assert(Chain.getValueType() == MVT::Other &&
+ "Invalid chain type");
if (Alignment == 0) // Ensure that codegen never sees alignment 0
Alignment = getEVTAlignment(VT);
@@ -4142,6 +4144,8 @@ SDValue SelectionDAG::getStore(SDValue Chain, DebugLoc dl, SDValue Val,
SDValue Ptr, MachinePointerInfo PtrInfo,
bool isVolatile, bool isNonTemporal,
unsigned Alignment, const MDNode *TBAAInfo) {
+ assert(Chain.getValueType() == MVT::Other &&
+ "Invalid chain type");
if (Alignment == 0) // Ensure that codegen never sees alignment 0
Alignment = getEVTAlignment(Val.getValueType());
@@ -4165,6 +4169,8 @@ SDValue SelectionDAG::getStore(SDValue Chain, DebugLoc dl, SDValue Val,
SDValue SelectionDAG::getStore(SDValue Chain, DebugLoc dl, SDValue Val,
SDValue Ptr, MachineMemOperand *MMO) {
+ assert(Chain.getValueType() == MVT::Other &&
+ "Invalid chain type");
EVT VT = Val.getValueType();
SDVTList VTs = getVTList(MVT::Other);
SDValue Undef = getUNDEF(Ptr.getValueType());
@@ -4191,6 +4197,8 @@ SDValue SelectionDAG::getTruncStore(SDValue Chain, DebugLoc dl, SDValue Val,
EVT SVT,bool isVolatile, bool isNonTemporal,
unsigned Alignment,
const MDNode *TBAAInfo) {
+ assert(Chain.getValueType() == MVT::Other &&
+ "Invalid chain type");
if (Alignment == 0) // Ensure that codegen never sees alignment 0
Alignment = getEVTAlignment(SVT);
@@ -4216,6 +4224,8 @@ SDValue SelectionDAG::getTruncStore(SDValue Chain, DebugLoc dl, SDValue Val,
MachineMemOperand *MMO) {
EVT VT = Val.getValueType();
+ assert(Chain.getValueType() == MVT::Other &&
+ "Invalid chain type");
if (VT == SVT)
return getStore(Chain, dl, Val, Ptr, MMO);
@@ -5508,9 +5518,9 @@ void SelectionDAG::TransferDbgValues(SDValue From, SDValue To) {
return;
SDNode *FromNode = From.getNode();
SDNode *ToNode = To.getNode();
- SmallVector<SDDbgValue *, 2> &DVs = GetDbgValues(FromNode);
+ ArrayRef<SDDbgValue *> DVs = GetDbgValues(FromNode);
SmallVector<SDDbgValue *, 2> ClonedDVs;
- for (SmallVector<SDDbgValue *, 2>::iterator I = DVs.begin(), E = DVs.end();
+ for (ArrayRef<SDDbgValue *>::iterator I = DVs.begin(), E = DVs.end();
I != E; ++I) {
SDDbgValue *Dbg = *I;
if (Dbg->getKind() == SDDbgValue::SDNODE) {
@@ -5691,24 +5701,39 @@ bool SDValue::reachesChainWithoutSideEffects(SDValue Dest,
return false;
}
-/// isPredecessorOf - Return true if this node is a predecessor of N. This node
-/// is either an operand of N or it can be reached by traversing up the operands.
-/// NOTE: this is an expensive method. Use it carefully.
-bool SDNode::isPredecessorOf(SDNode *N) const {
- SmallPtrSet<SDNode *, 32> Visited;
- SmallVector<SDNode *, 16> Worklist;
- Worklist.push_back(N);
+/// hasPredecessor - Return true if N is a predecessor of this node.
+/// N is either an operand of this node, or can be reached by recursively
+/// traversing up the operands.
+/// NOTE: This is an expensive method. Use it carefully.
+bool SDNode::hasPredecessor(const SDNode *N) const {
+ SmallPtrSet<const SDNode *, 32> Visited;
+ SmallVector<const SDNode *, 16> Worklist;
+ return hasPredecessorHelper(N, Visited, Worklist);
+}
- do {
- N = Worklist.pop_back_val();
- for (unsigned i = 0, e = N->getNumOperands(); i != e; ++i) {
- SDNode *Op = N->getOperand(i).getNode();
- if (Op == this)
- return true;
+bool SDNode::hasPredecessorHelper(const SDNode *N,
+ SmallPtrSet<const SDNode *, 32> &Visited,
+ SmallVector<const SDNode *, 16> &Worklist) const {
+ if (Visited.empty()) {
+ Worklist.push_back(this);
+ } else {
+ // Take a look in the visited set. If we've already encountered this node
+ // we needn't search further.
+ if (Visited.count(N))
+ return true;
+ }
+
+ // Haven't visited N yet. Continue the search.
+ while (!Worklist.empty()) {
+ const SDNode *M = Worklist.pop_back_val();
+ for (unsigned i = 0, e = M->getNumOperands(); i != e; ++i) {
+ SDNode *Op = M->getOperand(i).getNode();
if (Visited.insert(Op))
Worklist.push_back(Op);
+ if (Op == N)
+ return true;
}
- } while (!Worklist.empty());
+ }
return false;
}
@@ -5863,6 +5888,7 @@ std::string SDNode::getOperationName(const SelectionDAG *G) const {
case ISD::FSUB: return "fsub";
case ISD::FMUL: return "fmul";
case ISD::FDIV: return "fdiv";
+ case ISD::FMA: return "fma";
case ISD::FREM: return "frem";
case ISD::FCOPYSIGN: return "fcopysign";
case ISD::FGETSIGN: return "fgetsign";
diff --git a/contrib/llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp b/contrib/llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp
index 7a8a975..81b03ee 100644
--- a/contrib/llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp
+++ b/contrib/llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp
@@ -286,22 +286,10 @@ static SDValue getCopyFromPartsVector(SelectionDAG &DAG, DebugLoc DL,
assert(PartVT.getVectorNumElements() == ValueVT.getVectorNumElements() &&
"Cannot handle this kind of promotion");
// Promoted vector extract
- unsigned NumElts = ValueVT.getVectorNumElements();
- SmallVector<SDValue, 8> NewOps;
- for (unsigned i = 0; i < NumElts; ++i) {
- SDValue Ext = DAG.getNode(ISD::EXTRACT_VECTOR_ELT, DL,
- PartVT.getScalarType(), Val ,DAG.getIntPtrConstant(i));
- SDValue Cast;
+ bool Smaller = ValueVT.bitsLE(PartVT);
+ return DAG.getNode((Smaller ? ISD::TRUNCATE : ISD::ANY_EXTEND),
+ DL, ValueVT, Val);
- bool Smaller = ValueVT.bitsLE(PartVT);
-
- Cast = DAG.getNode((Smaller ? ISD::TRUNCATE : ISD::ANY_EXTEND),
- DL, ValueVT.getScalarType(), Ext);
-
- NewOps.push_back(Cast);
- }
- return DAG.getNode(ISD::BUILD_VECTOR, DL, ValueVT,
- &NewOps[0], NewOps.size());
}
// Trivial bitcast if the types are the same size and the destination
@@ -310,9 +298,17 @@ static SDValue getCopyFromPartsVector(SelectionDAG &DAG, DebugLoc DL,
TLI.isTypeLegal(ValueVT))
return DAG.getNode(ISD::BITCAST, DL, ValueVT, Val);
- assert(ValueVT.getVectorElementType() == PartVT &&
- ValueVT.getVectorNumElements() == 1 &&
+ // Handle cases such as i8 -> <1 x i1>
+ assert(ValueVT.getVectorNumElements() == 1 &&
"Only trivial scalar-to-vector conversions should get here!");
+
+ if (ValueVT.getVectorNumElements() == 1 &&
+ ValueVT.getVectorElementType() != PartVT) {
+ bool Smaller = ValueVT.bitsLE(PartVT);
+ Val = DAG.getNode((Smaller ? ISD::TRUNCATE : ISD::ANY_EXTEND),
+ DL, ValueVT.getScalarType(), Val);
+ }
+
return DAG.getNode(ISD::BUILD_VECTOR, DL, ValueVT, Val);
}
@@ -453,7 +449,7 @@ static void getCopyToPartsVector(SelectionDAG &DAG, DebugLoc DL,
// Bitconvert vector->vector case.
Val = DAG.getNode(ISD::BITCAST, DL, PartVT, Val);
} else if (PartVT.isVector() &&
- PartVT.getVectorElementType() == ValueVT.getVectorElementType()&&
+ PartVT.getVectorElementType() == ValueVT.getVectorElementType() &&
PartVT.getVectorNumElements() > ValueVT.getVectorNumElements()) {
EVT ElementVT = PartVT.getVectorElementType();
// Vector widening case, e.g. <2 x float> -> <4 x float>. Shuffle in
@@ -475,28 +471,23 @@ static void getCopyToPartsVector(SelectionDAG &DAG, DebugLoc DL,
//Val = DAG.getNode(ISD::CONCAT_VECTORS, DL, PartVT, Val, UndefElts);
} else if (PartVT.isVector() &&
PartVT.getVectorElementType().bitsGE(
- ValueVT.getVectorElementType())&&
+ ValueVT.getVectorElementType()) &&
PartVT.getVectorNumElements() == ValueVT.getVectorNumElements()) {
// Promoted vector extract
- unsigned NumElts = ValueVT.getVectorNumElements();
- SmallVector<SDValue, 8> NewOps;
- for (unsigned i = 0; i < NumElts; ++i) {
- SDValue Ext = DAG.getNode(ISD::EXTRACT_VECTOR_ELT, DL,
- ValueVT.getScalarType(), Val ,DAG.getIntPtrConstant(i));
- SDValue Cast = DAG.getNode(ISD::ANY_EXTEND,
- DL, PartVT.getScalarType(), Ext);
- NewOps.push_back(Cast);
- }
- Val = DAG.getNode(ISD::BUILD_VECTOR, DL, PartVT,
- &NewOps[0], NewOps.size());
+ bool Smaller = PartVT.bitsLE(ValueVT);
+ Val = DAG.getNode((Smaller ? ISD::TRUNCATE : ISD::ANY_EXTEND),
+ DL, PartVT, Val);
} else{
// Vector -> scalar conversion.
- assert(ValueVT.getVectorElementType() == PartVT &&
- ValueVT.getVectorNumElements() == 1 &&
+ assert(ValueVT.getVectorNumElements() == 1 &&
"Only trivial vector-to-scalar conversions should get here!");
Val = DAG.getNode(ISD::EXTRACT_VECTOR_ELT, DL,
PartVT, Val, DAG.getIntPtrConstant(0));
+
+ bool Smaller = ValueVT.bitsLE(PartVT);
+ Val = DAG.getNode((Smaller ? ISD::TRUNCATE : ISD::ANY_EXTEND),
+ DL, PartVT, Val);
}
Parts[0] = Val;
@@ -1280,6 +1271,24 @@ bool SelectionDAGBuilder::isExportableFromCurrentBlock(const Value *V,
return true;
}
+/// Return branch probability calculated by BranchProbabilityInfo for IR blocks.
+uint32_t SelectionDAGBuilder::getEdgeWeight(MachineBasicBlock *Src,
+ MachineBasicBlock *Dst) {
+ BranchProbabilityInfo *BPI = FuncInfo.BPI;
+ if (!BPI)
+ return 0;
+ BasicBlock *SrcBB = const_cast<BasicBlock*>(Src->getBasicBlock());
+ BasicBlock *DstBB = const_cast<BasicBlock*>(Dst->getBasicBlock());
+ return BPI->getEdgeWeight(SrcBB, DstBB);
+}
+
+void SelectionDAGBuilder::addSuccessorWithWeight(MachineBasicBlock *Src,
+ MachineBasicBlock *Dst) {
+ uint32_t weight = getEdgeWeight(Src, Dst);
+ Src->addSuccessor(Dst, weight);
+}
+
+
static bool InBlock(const Value *V, const BasicBlock *BB) {
if (const Instruction *I = dyn_cast<Instruction>(V))
return I->getParent() == BB;
@@ -1549,8 +1558,8 @@ void SelectionDAGBuilder::visitSwitchCase(CaseBlock &CB,
}
// Update successor info
- SwitchBB->addSuccessor(CB.TrueBB);
- SwitchBB->addSuccessor(CB.FalseBB);
+ addSuccessorWithWeight(SwitchBB, CB.TrueBB);
+ addSuccessorWithWeight(SwitchBB, CB.FalseBB);
// Set NextBlock to be the MBB immediately after the current one, if any.
// This is used to avoid emitting unnecessary branches to the next block.
@@ -1694,8 +1703,8 @@ void SelectionDAGBuilder::visitBitTestHeader(BitTestBlock &B,
MachineBasicBlock* MBB = B.Cases[0].ThisBB;
- SwitchBB->addSuccessor(B.Default);
- SwitchBB->addSuccessor(MBB);
+ addSuccessorWithWeight(SwitchBB, B.Default);
+ addSuccessorWithWeight(SwitchBB, MBB);
SDValue BrRange = DAG.getNode(ISD::BRCOND, getCurDebugLoc(),
MVT::Other, CopyTo, RangeCmp,
@@ -1718,7 +1727,8 @@ void SelectionDAGBuilder::visitBitTestCase(BitTestBlock &BB,
SDValue ShiftOp = DAG.getCopyFromReg(getControlRoot(), getCurDebugLoc(),
Reg, VT);
SDValue Cmp;
- if (CountPopulation_64(B.Mask) == 1) {
+ unsigned PopCount = CountPopulation_64(B.Mask);
+ if (PopCount == 1) {
// Testing for a single bit; just compare the shift count with what it
// would need to be to shift a 1 bit in that position.
Cmp = DAG.getSetCC(getCurDebugLoc(),
@@ -1726,6 +1736,13 @@ void SelectionDAGBuilder::visitBitTestCase(BitTestBlock &BB,
ShiftOp,
DAG.getConstant(CountTrailingZeros_64(B.Mask), VT),
ISD::SETEQ);
+ } else if (PopCount == BB.Range) {
+ // There is only one zero bit in the range, test for it directly.
+ Cmp = DAG.getSetCC(getCurDebugLoc(),
+ TLI.getSetCCResultType(VT),
+ ShiftOp,
+ DAG.getConstant(CountTrailingOnes_64(B.Mask), VT),
+ ISD::SETNE);
} else {
// Make desired shift
SDValue SwitchVal = DAG.getNode(ISD::SHL, getCurDebugLoc(), VT,
@@ -1740,8 +1757,8 @@ void SelectionDAGBuilder::visitBitTestCase(BitTestBlock &BB,
ISD::SETNE);
}
- SwitchBB->addSuccessor(B.TargetBB);
- SwitchBB->addSuccessor(NextMBB);
+ addSuccessorWithWeight(SwitchBB, B.TargetBB);
+ addSuccessorWithWeight(SwitchBB, NextMBB);
SDValue BrAnd = DAG.getNode(ISD::BRCOND, getCurDebugLoc(),
MVT::Other, getControlRoot(),
@@ -1981,8 +1998,9 @@ bool SelectionDAGBuilder::handleJTSwitchCase(CaseRec& CR,
// table.
MachineBasicBlock *JumpTableBB = CurMF->CreateMachineBasicBlock(LLVMBB);
CurMF->insert(BBI, JumpTableBB);
- CR.CaseBB->addSuccessor(Default);
- CR.CaseBB->addSuccessor(JumpTableBB);
+
+ addSuccessorWithWeight(CR.CaseBB, Default);
+ addSuccessorWithWeight(CR.CaseBB, JumpTableBB);
// Build a vector of destination BBs, corresponding to each target
// of the jump table. If the value of the jump table slot corresponds to
@@ -2009,7 +2027,7 @@ bool SelectionDAGBuilder::handleJTSwitchCase(CaseRec& CR,
E = DestBBs.end(); I != E; ++I) {
if (!SuccsHandled[(*I)->getNumber()]) {
SuccsHandled[(*I)->getNumber()] = true;
- JumpTableBB->addSuccessor(*I);
+ addSuccessorWithWeight(JumpTableBB, *I);
}
}
@@ -2428,8 +2446,10 @@ void SelectionDAGBuilder::visitIndirectBr(const IndirectBrInst &I) {
succs.push_back(I.getSuccessor(i));
array_pod_sort(succs.begin(), succs.end());
succs.erase(std::unique(succs.begin(), succs.end()), succs.end());
- for (unsigned i = 0, e = succs.size(); i != e; ++i)
- IndirectBrMBB->addSuccessor(FuncInfo.MBBMap[succs[i]]);
+ for (unsigned i = 0, e = succs.size(); i != e; ++i) {
+ MachineBasicBlock *Succ = FuncInfo.MBBMap[succs[i]];
+ addSuccessorWithWeight(IndirectBrMBB, Succ);
+ }
DAG.setRoot(DAG.getNode(ISD::BRIND, getCurDebugLoc(),
MVT::Other, getControlRoot(),
@@ -2489,6 +2509,22 @@ void SelectionDAGBuilder::visitShift(const User &I, unsigned Opcode) {
Op1.getValueType(), Op1, Op2));
}
+void SelectionDAGBuilder::visitSDiv(const User &I) {
+ SDValue Op1 = getValue(I.getOperand(0));
+ SDValue Op2 = getValue(I.getOperand(1));
+
+ // Turn exact SDivs into multiplications.
+ // FIXME: This should be in DAGCombiner, but it doesn't have access to the
+ // exact bit.
+ if (isa<BinaryOperator>(&I) && cast<BinaryOperator>(&I)->isExact() &&
+ !isa<ConstantSDNode>(Op1) &&
+ isa<ConstantSDNode>(Op2) && !cast<ConstantSDNode>(Op2)->isNullValue())
+ setValue(&I, TLI.BuildExactSDIV(Op1, Op2, getCurDebugLoc(), DAG));
+ else
+ setValue(&I, DAG.getNode(ISD::SDIV, getCurDebugLoc(), Op1.getValueType(),
+ Op1, Op2));
+}
+
void SelectionDAGBuilder::visitICmp(const User &I) {
ICmpInst::Predicate predicate = ICmpInst::BAD_ICMP_PREDICATE;
if (const ICmpInst *IC = dyn_cast<ICmpInst>(&I))
@@ -2855,7 +2891,7 @@ void SelectionDAGBuilder::visitInsertValue(const InsertValueInst &I) {
bool IntoUndef = isa<UndefValue>(Op0);
bool FromUndef = isa<UndefValue>(Op1);
- unsigned LinearIndex = ComputeLinearIndex(AggTy, I.idx_begin(), I.idx_end());
+ unsigned LinearIndex = ComputeLinearIndex(AggTy, I.getIndices());
SmallVector<EVT, 4> AggValueVTs;
ComputeValueVTs(TLI, AggTy, AggValueVTs);
@@ -2895,7 +2931,7 @@ void SelectionDAGBuilder::visitExtractValue(const ExtractValueInst &I) {
const Type *ValTy = I.getType();
bool OutOfUndef = isa<UndefValue>(Op0);
- unsigned LinearIndex = ComputeLinearIndex(AggTy, I.idx_begin(), I.idx_end());
+ unsigned LinearIndex = ComputeLinearIndex(AggTy, I.getIndices());
SmallVector<EVT, 4> ValValueVTs;
ComputeValueVTs(TLI, ValTy, ValValueVTs);
@@ -4623,6 +4659,13 @@ SelectionDAGBuilder::visitIntrinsicCall(const CallInst &I, unsigned Intrinsic) {
case Intrinsic::pow:
visitPow(I);
return 0;
+ case Intrinsic::fma:
+ setValue(&I, DAG.getNode(ISD::FMA, dl,
+ getValue(I.getArgOperand(0)).getValueType(),
+ getValue(I.getArgOperand(0)),
+ getValue(I.getArgOperand(1)),
+ getValue(I.getArgOperand(2))));
+ return 0;
case Intrinsic::convert_to_fp16:
setValue(&I, DAG.getNode(ISD::FP32_TO_FP16, dl,
MVT::i16, getValue(I.getArgOperand(0))));
@@ -4759,6 +4802,13 @@ SelectionDAGBuilder::visitIntrinsicCall(const CallInst &I, unsigned Intrinsic) {
case Intrinsic::flt_rounds:
setValue(&I, DAG.getNode(ISD::FLT_ROUNDS_, dl, MVT::i32));
return 0;
+
+ case Intrinsic::expect: {
+ // Just replace __builtin_expect(exp, c) with EXP.
+ setValue(&I, getValue(I.getArgOperand(0)));
+ return 0;
+ }
+
case Intrinsic::trap: {
StringRef TrapFuncName = getTrapFunctionName();
if (TrapFuncName.empty()) {
@@ -4789,15 +4839,16 @@ SelectionDAGBuilder::visitIntrinsicCall(const CallInst &I, unsigned Intrinsic) {
return implVisitAluOverflow(I, ISD::SMULO);
case Intrinsic::prefetch: {
- SDValue Ops[4];
+ SDValue Ops[5];
unsigned rw = cast<ConstantInt>(I.getArgOperand(1))->getZExtValue();
Ops[0] = getRoot();
Ops[1] = getValue(I.getArgOperand(0));
Ops[2] = getValue(I.getArgOperand(1));
Ops[3] = getValue(I.getArgOperand(2));
+ Ops[4] = getValue(I.getArgOperand(3));
DAG.setRoot(DAG.getMemIntrinsicNode(ISD::PREFETCH, dl,
DAG.getVTList(MVT::Other),
- &Ops[0], 4,
+ &Ops[0], 5,
EVT::getIntegerVT(*Context, 8),
MachinePointerInfo(I.getArgOperand(0)),
0, /* align */
@@ -5415,54 +5466,6 @@ typedef SmallVector<SDISelAsmOperandInfo,16> SDISelAsmOperandInfoVector;
} // end anonymous namespace
-/// isAllocatableRegister - If the specified register is safe to allocate,
-/// i.e. it isn't a stack pointer or some other special register, return the
-/// register class for the register. Otherwise, return null.
-static const TargetRegisterClass *
-isAllocatableRegister(unsigned Reg, MachineFunction &MF,
- const TargetLowering &TLI,
- const TargetRegisterInfo *TRI) {
- EVT FoundVT = MVT::Other;
- const TargetRegisterClass *FoundRC = 0;
- for (TargetRegisterInfo::regclass_iterator RCI = TRI->regclass_begin(),
- E = TRI->regclass_end(); RCI != E; ++RCI) {
- EVT ThisVT = MVT::Other;
-
- const TargetRegisterClass *RC = *RCI;
- // If none of the value types for this register class are valid, we
- // can't use it. For example, 64-bit reg classes on 32-bit targets.
- for (TargetRegisterClass::vt_iterator I = RC->vt_begin(), E = RC->vt_end();
- I != E; ++I) {
- if (TLI.isTypeLegal(*I)) {
- // If we have already found this register in a different register class,
- // choose the one with the largest VT specified. For example, on
- // PowerPC, we favor f64 register classes over f32.
- if (FoundVT == MVT::Other || FoundVT.bitsLT(*I)) {
- ThisVT = *I;
- break;
- }
- }
- }
-
- if (ThisVT == MVT::Other) continue;
-
- // NOTE: This isn't ideal. In particular, this might allocate the
- // frame pointer in functions that need it (due to them not being taken
- // out of allocation, because a variable sized allocation hasn't been seen
- // yet). This is a slight code pessimization, but should still work.
- for (TargetRegisterClass::iterator I = RC->allocation_order_begin(MF),
- E = RC->allocation_order_end(MF); I != E; ++I)
- if (*I == Reg) {
- // We found a matching register class. Keep looking at others in case
- // we find one with larger registers that this physreg is also in.
- FoundRC = RC;
- FoundVT = ThisVT;
- break;
- }
- }
- return FoundRC;
-}
-
/// GetRegistersForValue - Assign registers (virtual or physical) for the
/// specified operand. We prefer to assign virtual registers, to allow the
/// register allocator to handle the assignment process. However, if the asm
@@ -5597,52 +5600,6 @@ static void GetRegistersForValue(SelectionDAG &DAG,
return;
}
- // This is a reference to a register class that doesn't directly correspond
- // to an LLVM register class. Allocate NumRegs consecutive, available,
- // registers from the class.
- std::vector<unsigned> RegClassRegs
- = TLI.getRegClassForInlineAsmConstraint(OpInfo.ConstraintCode,
- OpInfo.ConstraintVT);
-
- const TargetRegisterInfo *TRI = DAG.getTarget().getRegisterInfo();
- unsigned NumAllocated = 0;
- for (unsigned i = 0, e = RegClassRegs.size(); i != e; ++i) {
- unsigned Reg = RegClassRegs[i];
- // See if this register is available.
- if ((isOutReg && OutputRegs.count(Reg)) || // Already used.
- (isInReg && InputRegs.count(Reg))) { // Already used.
- // Make sure we find consecutive registers.
- NumAllocated = 0;
- continue;
- }
-
- // Check to see if this register is allocatable (i.e. don't give out the
- // stack pointer).
- const TargetRegisterClass *RC = isAllocatableRegister(Reg, MF, TLI, TRI);
- if (!RC) { // Couldn't allocate this register.
- // Reset NumAllocated to make sure we return consecutive registers.
- NumAllocated = 0;
- continue;
- }
-
- // Okay, this register is good, we can use it.
- ++NumAllocated;
-
- // If we allocated enough consecutive registers, succeed.
- if (NumAllocated == NumRegs) {
- unsigned RegStart = (i-NumAllocated)+1;
- unsigned RegEnd = i+1;
- // Mark all of the allocated registers used.
- for (unsigned i = RegStart; i != RegEnd; ++i)
- Regs.push_back(RegClassRegs[i]);
-
- OpInfo.AssignedRegs = RegsForValue(Regs, *RC->vt_begin(),
- OpInfo.ConstraintVT);
- OpInfo.MarkAllocatedRegs(isOutReg, isInReg, OutputRegs, InputRegs, *TRI);
- return;
- }
- }
-
// Otherwise, we couldn't allocate enough registers for this.
}
@@ -5749,10 +5706,13 @@ void SelectionDAGBuilder::visitInlineAsm(ImmutableCallSite CS) {
SDISelAsmOperandInfo &Input = ConstraintOperands[OpInfo.MatchingInput];
if (OpInfo.ConstraintVT != Input.ConstraintVT) {
+ std::pair<unsigned, const TargetRegisterClass*> MatchRC =
+ TLI.getRegForInlineAsmConstraint(OpInfo.ConstraintCode, OpInfo.ConstraintVT);
+ std::pair<unsigned, const TargetRegisterClass*> InputRC =
+ TLI.getRegForInlineAsmConstraint(Input.ConstraintCode, Input.ConstraintVT);
if ((OpInfo.ConstraintVT.isInteger() !=
Input.ConstraintVT.isInteger()) ||
- (OpInfo.ConstraintVT.getSizeInBits() !=
- Input.ConstraintVT.getSizeInBits())) {
+ (MatchRC.second != InputRC.second)) {
report_fatal_error("Unsupported asm: input constraint"
" with a matching output constraint of"
" incompatible type!");
@@ -6015,8 +5975,7 @@ void SelectionDAGBuilder::visitInlineAsm(ImmutableCallSite CS) {
"Don't know how to handle indirect register inputs yet!");
// Copy the input into the appropriate registers.
- if (OpInfo.AssignedRegs.Regs.empty() ||
- !OpInfo.AssignedRegs.areValueTypesLegal(TLI))
+ if (OpInfo.AssignedRegs.Regs.empty())
report_fatal_error("Couldn't allocate input reg for constraint '" +
Twine(OpInfo.ConstraintCode) + "'!");
@@ -6031,8 +5990,7 @@ void SelectionDAGBuilder::visitInlineAsm(ImmutableCallSite CS) {
// Add the clobbered value to the operand list, so that the register
// allocator is aware that the physreg got clobbered.
if (!OpInfo.AssignedRegs.Regs.empty())
- OpInfo.AssignedRegs.AddInlineAsmOperands(
- InlineAsm::Kind_RegDefEarlyClobber,
+ OpInfo.AssignedRegs.AddInlineAsmOperands(InlineAsm::Kind_Clobber,
false, 0, DAG,
AsmNodeOperands);
break;
diff --git a/contrib/llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.h b/contrib/llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.h
index 8376d41..a0884eb 100644
--- a/contrib/llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.h
+++ b/contrib/llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.h
@@ -434,6 +434,9 @@ private:
const Value* SV,
MachineBasicBlock* Default,
MachineBasicBlock *SwitchBB);
+
+ uint32_t getEdgeWeight(MachineBasicBlock *Src, MachineBasicBlock *Dst);
+ void addSuccessorWithWeight(MachineBasicBlock *Src, MachineBasicBlock *Dst);
public:
void visitSwitchCase(CaseBlock &CB,
MachineBasicBlock *SwitchBB);
@@ -464,7 +467,7 @@ private:
void visitSRem(const User &I) { visitBinary(I, ISD::SREM); }
void visitFRem(const User &I) { visitBinary(I, ISD::FREM); }
void visitUDiv(const User &I) { visitBinary(I, ISD::UDIV); }
- void visitSDiv(const User &I) { visitBinary(I, ISD::SDIV); }
+ void visitSDiv(const User &I);
void visitFDiv(const User &I) { visitBinary(I, ISD::FDIV); }
void visitAnd (const User &I) { visitBinary(I, ISD::AND); }
void visitOr (const User &I) { visitBinary(I, ISD::OR); }
diff --git a/contrib/llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp b/contrib/llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp
index 771b008..87bb296 100644
--- a/contrib/llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp
+++ b/contrib/llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp
@@ -17,6 +17,7 @@
#include "llvm/CodeGen/FunctionLoweringInfo.h"
#include "llvm/CodeGen/SelectionDAGISel.h"
#include "llvm/Analysis/AliasAnalysis.h"
+#include "llvm/Analysis/BranchProbabilityInfo.h"
#include "llvm/Analysis/DebugInfo.h"
#include "llvm/Constants.h"
#include "llvm/Function.h"
@@ -68,6 +69,11 @@ static cl::opt<bool>
EnableFastISelAbort("fast-isel-abort", cl::Hidden,
cl::desc("Enable abort calls when \"fast\" instruction fails"));
+static cl::opt<bool>
+UseMBPI("use-mbpi",
+ cl::desc("use Machine Branch Probability Info"),
+ cl::init(true), cl::Hidden);
+
#ifndef NDEBUG
static cl::opt<bool>
ViewDAGCombine1("view-dag-combine1-dags", cl::Hidden,
@@ -186,6 +192,7 @@ SelectionDAGISel::SelectionDAGISel(const TargetMachine &tm,
DAGSize(0) {
initializeGCModuleInfoPass(*PassRegistry::getPassRegistry());
initializeAliasAnalysisAnalysisGroup(*PassRegistry::getPassRegistry());
+ initializeBranchProbabilityInfoPass(*PassRegistry::getPassRegistry());
}
SelectionDAGISel::~SelectionDAGISel() {
@@ -199,6 +206,8 @@ void SelectionDAGISel::getAnalysisUsage(AnalysisUsage &AU) const {
AU.addPreserved<AliasAnalysis>();
AU.addRequired<GCModuleInfo>();
AU.addPreserved<GCModuleInfo>();
+ if (UseMBPI && OptLevel != CodeGenOpt::None)
+ AU.addRequired<BranchProbabilityInfo>();
MachineFunctionPass::getAnalysisUsage(AU);
}
@@ -262,6 +271,12 @@ bool SelectionDAGISel::runOnMachineFunction(MachineFunction &mf) {
CurDAG->init(*MF);
FuncInfo->set(Fn, *MF);
+
+ if (UseMBPI && OptLevel != CodeGenOpt::None)
+ FuncInfo->BPI = &getAnalysis<BranchProbabilityInfo>();
+ else
+ FuncInfo->BPI = 0;
+
SDB->init(GFI, *AA);
SelectAllBasicBlocks(Fn);
@@ -339,9 +354,9 @@ bool SelectionDAGISel::runOnMachineFunction(MachineFunction &mf) {
const MachineBasicBlock *MBB = I;
for (MachineBasicBlock::const_iterator
II = MBB->begin(), IE = MBB->end(); II != IE; ++II) {
- const TargetInstrDesc &TID = TM.getInstrInfo()->get(II->getOpcode());
+ const MCInstrDesc &MCID = TM.getInstrInfo()->get(II->getOpcode());
- if ((TID.isCall() && !TID.isReturn()) ||
+ if ((MCID.isCall() && !MCID.isReturn()) ||
II->isStackAligningInlineAsm()) {
MFI->setHasCalls(true);
goto done;
@@ -666,7 +681,7 @@ void SelectionDAGISel::PrepareEHLandingPad() {
// landing pad can thus be detected via the MachineModuleInfo.
MCSymbol *Label = MF->getMMI().addLandingPad(FuncInfo->MBB);
- const TargetInstrDesc &II = TM.getInstrInfo()->get(TargetOpcode::EH_LABEL);
+ const MCInstrDesc &II = TM.getInstrInfo()->get(TargetOpcode::EH_LABEL);
BuildMI(*FuncInfo->MBB, FuncInfo->InsertPt, SDB->getCurDebugLoc(), II)
.addSym(Label);
@@ -2596,9 +2611,9 @@ SelectCodeCommon(SDNode *NodeToMatch, const unsigned char *MatcherTable,
if (EmitNodeInfo & OPFL_MemRefs) {
// Only attach load or store memory operands if the generated
// instruction may load or store.
- const TargetInstrDesc &TID = TM.getInstrInfo()->get(TargetOpc);
- bool mayLoad = TID.mayLoad();
- bool mayStore = TID.mayStore();
+ const MCInstrDesc &MCID = TM.getInstrInfo()->get(TargetOpc);
+ bool mayLoad = MCID.mayLoad();
+ bool mayStore = MCID.mayStore();
unsigned NumMemRefs = 0;
for (SmallVector<MachineMemOperand*, 2>::const_iterator I =
diff --git a/contrib/llvm/lib/CodeGen/SelectionDAG/TargetLowering.cpp b/contrib/llvm/lib/CodeGen/SelectionDAG/TargetLowering.cpp
index cf6069a..2626ac3 100644
--- a/contrib/llvm/lib/CodeGen/SelectionDAG/TargetLowering.cpp
+++ b/contrib/llvm/lib/CodeGen/SelectionDAG/TargetLowering.cpp
@@ -81,6 +81,9 @@ static void InitLibcallNames(const char **Names) {
Names[RTLIB::MUL_I32] = "__mulsi3";
Names[RTLIB::MUL_I64] = "__muldi3";
Names[RTLIB::MUL_I128] = "__multi3";
+ Names[RTLIB::MULO_I32] = "__mulosi4";
+ Names[RTLIB::MULO_I64] = "__mulodi4";
+ Names[RTLIB::MULO_I128] = "__muloti4";
Names[RTLIB::SDIV_I8] = "__divqi3";
Names[RTLIB::SDIV_I16] = "__divhi3";
Names[RTLIB::SDIV_I32] = "__divsi3";
@@ -136,6 +139,10 @@ static void InitLibcallNames(const char **Names) {
Names[RTLIB::REM_F64] = "fmod";
Names[RTLIB::REM_F80] = "fmodl";
Names[RTLIB::REM_PPCF128] = "fmodl";
+ Names[RTLIB::FMA_F32] = "fmaf";
+ Names[RTLIB::FMA_F64] = "fma";
+ Names[RTLIB::FMA_F80] = "fmal";
+ Names[RTLIB::FMA_PPCF128] = "fmal";
Names[RTLIB::POWI_F32] = "__powisf2";
Names[RTLIB::POWI_F64] = "__powidf2";
Names[RTLIB::POWI_F80] = "__powixf2";
@@ -673,10 +680,16 @@ static unsigned getVectorTypeBreakdownMVT(MVT VT, MVT &IntermediateVT,
NewVT = EltTy;
IntermediateVT = NewVT;
+ unsigned NewVTSize = NewVT.getSizeInBits();
+
+ // Convert sizes such as i33 to i64.
+ if (!isPowerOf2_32(NewVTSize))
+ NewVTSize = NextPowerOf2(NewVTSize);
+
EVT DestVT = TLI->getRegisterType(NewVT);
RegisterVT = DestVT;
if (EVT(DestVT).bitsLT(NewVT)) // Value is expanded, e.g. i64 -> i16.
- return NumVectorRegs*(NewVT.getSizeInBits()/DestVT.getSizeInBits());
+ return NumVectorRegs*(NewVTSize/DestVT.getSizeInBits());
// Otherwise, promotion or legal types use the same number of registers as
// the vector decimated to the appropriate level.
@@ -965,8 +978,14 @@ unsigned TargetLowering::getVectorTypeBreakdown(LLVMContext &Context, EVT VT,
EVT DestVT = getRegisterType(Context, NewVT);
RegisterVT = DestVT;
+ unsigned NewVTSize = NewVT.getSizeInBits();
+
+ // Convert sizes such as i33 to i64.
+ if (!isPowerOf2_32(NewVTSize))
+ NewVTSize = NextPowerOf2(NewVTSize);
+
if (DestVT.bitsLT(NewVT)) // Value is expanded, e.g. i64 -> i16.
- return NumVectorRegs*(NewVT.getSizeInBits()/DestVT.getSizeInBits());
+ return NumVectorRegs*(NewVTSize/DestVT.getSizeInBits());
// Otherwise, promotion or legal types use the same number of registers as
// the vector decimated to the appropriate level.
@@ -1762,9 +1781,9 @@ bool TargetLowering::SimplifyDemandedBits(SDValue Op,
case ISD::BITCAST:
// If this is an FP->Int bitcast and if the sign bit is the only
// thing demanded, turn this into a FGETSIGN.
- if (NewMask == APInt::getSignBit(Op.getValueType().getSizeInBits()) &&
- Op.getOperand(0).getValueType().isFloatingPoint() &&
- !Op.getOperand(0).getValueType().isVector()) {
+ if (!Op.getOperand(0).getValueType().isVector() &&
+ NewMask == APInt::getSignBit(Op.getValueType().getSizeInBits()) &&
+ Op.getOperand(0).getValueType().isFloatingPoint()) {
bool OpVTLegal = isOperationLegalOrCustom(ISD::FGETSIGN, Op.getValueType());
bool i32Legal = isOperationLegalOrCustom(ISD::FGETSIGN, MVT::i32);
if ((OpVTLegal || i32Legal) && Op.getValueType().isSimple()) {
@@ -1902,7 +1921,7 @@ TargetLowering::SimplifySetCC(EVT VT, SDValue N0, SDValue N1,
// comparisons.
if (isa<ConstantSDNode>(N0.getNode()))
return DAG.getSetCC(dl, VT, N1, N0, ISD::getSetCCSwappedOperands(Cond));
-
+
if (ConstantSDNode *N1C = dyn_cast<ConstantSDNode>(N1.getNode())) {
const APInt &C1 = N1C->getAPIntValue();
@@ -2608,7 +2627,6 @@ PerformDAGCombine(SDNode *N, DAGCombinerInfo &DCI) const {
TargetLowering::ConstraintType
TargetLowering::getConstraintType(const std::string &Constraint) const {
- // FIXME: lots more standard ones to handle.
if (Constraint.size() == 1) {
switch (Constraint[0]) {
default: break;
@@ -2661,9 +2679,9 @@ void TargetLowering::LowerAsmOperandForConstraint(SDValue Op,
std::string &Constraint,
std::vector<SDValue> &Ops,
SelectionDAG &DAG) const {
-
+
if (Constraint.length() > 1) return;
-
+
char ConstraintLetter = Constraint[0];
switch (ConstraintLetter) {
default: break;
@@ -2722,13 +2740,6 @@ void TargetLowering::LowerAsmOperandForConstraint(SDValue Op,
}
}
-std::vector<unsigned> TargetLowering::
-getRegClassForInlineAsmConstraint(const std::string &Constraint,
- EVT VT) const {
- return std::vector<unsigned>();
-}
-
-
std::pair<unsigned, const TargetRegisterClass*> TargetLowering::
getRegForInlineAsmConstraint(const std::string &Constraint,
EVT VT) const {
@@ -2853,7 +2864,7 @@ TargetLowering::AsmOperandInfoVector TargetLowering::ParseConstraints(
report_fatal_error("Indirect operand for inline asm not a pointer!");
OpTy = PtrTy->getElementType();
}
-
+
// Look for vector wrapped in a struct. e.g. { <16 x i8> }.
if (const StructType *STy = dyn_cast<StructType>(OpTy))
if (STy->getNumElements() == 1)
@@ -2955,10 +2966,13 @@ TargetLowering::AsmOperandInfoVector TargetLowering::ParseConstraints(
AsmOperandInfo &Input = ConstraintOperands[OpInfo.MatchingInput];
if (OpInfo.ConstraintVT != Input.ConstraintVT) {
+ std::pair<unsigned, const TargetRegisterClass*> MatchRC =
+ getRegForInlineAsmConstraint(OpInfo.ConstraintCode, OpInfo.ConstraintVT);
+ std::pair<unsigned, const TargetRegisterClass*> InputRC =
+ getRegForInlineAsmConstraint(Input.ConstraintCode, Input.ConstraintVT);
if ((OpInfo.ConstraintVT.isInteger() !=
Input.ConstraintVT.isInteger()) ||
- (OpInfo.ConstraintVT.getSizeInBits() !=
- Input.ConstraintVT.getSizeInBits())) {
+ (MatchRC.second != InputRC.second)) {
report_fatal_error("Unsupported asm: input constraint"
" with a matching output constraint of"
" incompatible type!");
@@ -3204,6 +3218,32 @@ bool TargetLowering::isLegalAddressingMode(const AddrMode &AM,
return true;
}
+/// BuildExactDiv - Given an exact SDIV by a constant, create a multiplication
+/// with the multiplicative inverse of the constant.
+SDValue TargetLowering::BuildExactSDIV(SDValue Op1, SDValue Op2, DebugLoc dl,
+ SelectionDAG &DAG) const {
+ ConstantSDNode *C = cast<ConstantSDNode>(Op2);
+ APInt d = C->getAPIntValue();
+ assert(d != 0 && "Division by zero!");
+
+ // Shift the value upfront if it is even, so the LSB is one.
+ unsigned ShAmt = d.countTrailingZeros();
+ if (ShAmt) {
+ // TODO: For UDIV use SRL instead of SRA.
+ SDValue Amt = DAG.getConstant(ShAmt, getShiftAmountTy(Op1.getValueType()));
+ Op1 = DAG.getNode(ISD::SRA, dl, Op1.getValueType(), Op1, Amt);
+ d = d.ashr(ShAmt);
+ }
+
+ // Calculate the multiplicative inverse, using Newton's method.
+ APInt t, xn = d;
+ while ((t = d*xn) != 1)
+ xn *= APInt(d.getBitWidth(), 2) - t;
+
+ Op2 = DAG.getConstant(xn, Op1.getValueType());
+ return DAG.getNode(ISD::MUL, dl, Op1.getValueType(), Op1, Op2);
+}
+
/// BuildSDIVSequence - Given an ISD::SDIV node expressing a divide by constant,
/// return a DAG expression to select that will generate the same value by
/// multiplying by a magic number. See:
diff --git a/contrib/llvm/lib/CodeGen/ShadowStackGC.cpp b/contrib/llvm/lib/CodeGen/ShadowStackGC.cpp
index 6ab0cb0..5a253a4 100644
--- a/contrib/llvm/lib/CodeGen/ShadowStackGC.cpp
+++ b/contrib/llvm/lib/CodeGen/ShadowStackGC.cpp
@@ -45,7 +45,8 @@ namespace {
/// StackEntryTy - Abstract type of a link in the shadow stack.
///
- const StructType *StackEntryTy;
+ StructType *StackEntryTy;
+ StructType *FrameMapTy;
/// Roots - GC roots in the current function. Each is a pair of the
/// intrinsic call and its corresponding alloca.
@@ -164,8 +165,7 @@ namespace {
InvokeInst *II = InvokeInst::Create(CI->getCalledValue(),
NewBB, CleanupBB,
- Args.begin(), Args.end(),
- CI->getName(), CallBB);
+ Args, CI->getName(), CallBB);
II->setCallingConv(CI->getCallingConv());
II->setAttributes(CI->getAttributes());
CI->replaceAllUsesWith(II);
@@ -194,31 +194,31 @@ Constant *ShadowStackGC::GetFrameMap(Function &F) {
// Truncate the ShadowStackDescriptor if some metadata is null.
unsigned NumMeta = 0;
- SmallVector<Constant*,16> Metadata;
+ SmallVector<Constant*, 16> Metadata;
for (unsigned I = 0; I != Roots.size(); ++I) {
Constant *C = cast<Constant>(Roots[I].first->getArgOperand(1));
if (!C->isNullValue())
NumMeta = I + 1;
Metadata.push_back(ConstantExpr::getBitCast(C, VoidPtr));
}
+ Metadata.resize(NumMeta);
+ const Type *Int32Ty = Type::getInt32Ty(F.getContext());
+
Constant *BaseElts[] = {
- ConstantInt::get(Type::getInt32Ty(F.getContext()), Roots.size(), false),
- ConstantInt::get(Type::getInt32Ty(F.getContext()), NumMeta, false),
+ ConstantInt::get(Int32Ty, Roots.size(), false),
+ ConstantInt::get(Int32Ty, NumMeta, false),
};
Constant *DescriptorElts[] = {
- ConstantStruct::get(F.getContext(), BaseElts, 2, false),
- ConstantArray::get(ArrayType::get(VoidPtr, NumMeta),
- Metadata.begin(), NumMeta)
+ ConstantStruct::get(FrameMapTy, BaseElts),
+ ConstantArray::get(ArrayType::get(VoidPtr, NumMeta), Metadata)
};
- Constant *FrameMap = ConstantStruct::get(F.getContext(), DescriptorElts, 2,
- false);
-
- std::string TypeName("gc_map.");
- TypeName += utostr(NumMeta);
- F.getParent()->addTypeName(TypeName, FrameMap->getType());
+ Type *EltTys[] = { DescriptorElts[0]->getType(),DescriptorElts[1]->getType()};
+ StructType *STy = StructType::createNamed("gc_map."+utostr(NumMeta), EltTys);
+
+ Constant *FrameMap = ConstantStruct::get(STy, DescriptorElts);
// FIXME: Is this actually dangerous as WritingAnLLVMPass.html claims? Seems
// that, short of multithreaded LLVM, it should be safe; all that is
@@ -246,17 +246,12 @@ Constant *ShadowStackGC::GetFrameMap(Function &F) {
const Type* ShadowStackGC::GetConcreteStackEntryType(Function &F) {
// doInitialization creates the generic version of this type.
- std::vector<const Type*> EltTys;
+ std::vector<Type*> EltTys;
EltTys.push_back(StackEntryTy);
for (size_t I = 0; I != Roots.size(); I++)
EltTys.push_back(Roots[I].second->getAllocatedType());
- Type *Ty = StructType::get(F.getContext(), EltTys);
-
- std::string TypeName("gc_stackentry.");
- TypeName += F.getName();
- F.getParent()->addTypeName(TypeName, Ty);
-
- return Ty;
+
+ return StructType::createNamed("gc_stackentry."+F.getName().str(), EltTys);
}
/// doInitialization - If this module uses the GC intrinsics, find them now. If
@@ -267,13 +262,12 @@ bool ShadowStackGC::initializeCustomLowering(Module &M) {
// int32_t NumMeta; // Number of metadata descriptors. May be < NumRoots.
// void *Meta[]; // May be absent for roots without metadata.
// };
- std::vector<const Type*> EltTys;
+ std::vector<Type*> EltTys;
// 32 bits is ok up to a 32GB stack frame. :)
EltTys.push_back(Type::getInt32Ty(M.getContext()));
// Specifies length of variable length array.
EltTys.push_back(Type::getInt32Ty(M.getContext()));
- StructType *FrameMapTy = StructType::get(M.getContext(), EltTys);
- M.addTypeName("gc_map", FrameMapTy);
+ FrameMapTy = StructType::createNamed("gc_map", EltTys);
PointerType *FrameMapPtrTy = PointerType::getUnqual(FrameMapTy);
// struct StackEntry {
@@ -281,18 +275,14 @@ bool ShadowStackGC::initializeCustomLowering(Module &M) {
// FrameMap *Map; // Pointer to constant FrameMap.
// void *Roots[]; // Stack roots (in-place array, so we pretend).
// };
- OpaqueType *RecursiveTy = OpaqueType::get(M.getContext());
-
+
+ StackEntryTy = StructType::createNamed(M.getContext(), "gc_stackentry");
+
EltTys.clear();
- EltTys.push_back(PointerType::getUnqual(RecursiveTy));
+ EltTys.push_back(PointerType::getUnqual(StackEntryTy));
EltTys.push_back(FrameMapPtrTy);
- PATypeHolder LinkTyH = StructType::get(M.getContext(), EltTys);
-
- RecursiveTy->refineAbstractTypeTo(LinkTyH.get());
- StackEntryTy = cast<StructType>(LinkTyH.get());
+ StackEntryTy->setBody(EltTys);
const PointerType *StackEntryPtrTy = PointerType::getUnqual(StackEntryTy);
- M.addTypeName("gc_stackentry", LinkTyH.get()); // FIXME: Is this safe from
- // a FunctionPass?
// Get the root chain if it already exists.
Head = M.getGlobalVariable("llvm_gc_root_chain");
@@ -399,7 +389,7 @@ bool ShadowStackGC::performCustomLowering(Function &F) {
Instruction *CurrentHead = AtEntry.CreateLoad(Head, "gc_currhead");
Instruction *EntryMapPtr = CreateGEP(Context, AtEntry, StackEntry,
0,1,"gc_frame.map");
- AtEntry.CreateStore(FrameMap, EntryMapPtr);
+ AtEntry.CreateStore(FrameMap, EntryMapPtr);
// After all the allocas...
for (unsigned I = 0, E = Roots.size(); I != E; ++I) {
diff --git a/contrib/llvm/lib/CodeGen/SimpleRegisterCoalescing.cpp b/contrib/llvm/lib/CodeGen/SimpleRegisterCoalescing.cpp
deleted file mode 100644
index 221bec5..0000000
--- a/contrib/llvm/lib/CodeGen/SimpleRegisterCoalescing.cpp
+++ /dev/null
@@ -1,1539 +0,0 @@
-//===-- SimpleRegisterCoalescing.cpp - Register Coalescing ----------------===//
-//
-// The LLVM Compiler Infrastructure
-//
-// This file is distributed under the University of Illinois Open Source
-// License. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-//
-// This file implements a simple register coalescing pass that attempts to
-// aggressively coalesce every register copy that it can.
-//
-//===----------------------------------------------------------------------===//
-
-#define DEBUG_TYPE "regcoalescing"
-#include "SimpleRegisterCoalescing.h"
-#include "VirtRegMap.h"
-#include "LiveDebugVariables.h"
-#include "llvm/CodeGen/LiveIntervalAnalysis.h"
-#include "llvm/Value.h"
-#include "llvm/Analysis/AliasAnalysis.h"
-#include "llvm/CodeGen/MachineFrameInfo.h"
-#include "llvm/CodeGen/MachineInstr.h"
-#include "llvm/CodeGen/MachineLoopInfo.h"
-#include "llvm/CodeGen/MachineRegisterInfo.h"
-#include "llvm/CodeGen/Passes.h"
-#include "llvm/CodeGen/RegisterCoalescer.h"
-#include "llvm/Target/TargetInstrInfo.h"
-#include "llvm/Target/TargetMachine.h"
-#include "llvm/Target/TargetOptions.h"
-#include "llvm/Support/CommandLine.h"
-#include "llvm/Support/Debug.h"
-#include "llvm/Support/ErrorHandling.h"
-#include "llvm/Support/raw_ostream.h"
-#include "llvm/ADT/OwningPtr.h"
-#include "llvm/ADT/SmallSet.h"
-#include "llvm/ADT/Statistic.h"
-#include "llvm/ADT/STLExtras.h"
-#include <algorithm>
-#include <cmath>
-using namespace llvm;
-
-STATISTIC(numJoins , "Number of interval joins performed");
-STATISTIC(numCrossRCs , "Number of cross class joins performed");
-STATISTIC(numCommutes , "Number of instruction commuting performed");
-STATISTIC(numExtends , "Number of copies extended");
-STATISTIC(NumReMats , "Number of instructions re-materialized");
-STATISTIC(numPeep , "Number of identity moves eliminated after coalescing");
-STATISTIC(numAborts , "Number of times interval joining aborted");
-
-char SimpleRegisterCoalescing::ID = 0;
-static cl::opt<bool>
-EnableJoining("join-liveintervals",
- cl::desc("Coalesce copies (default=true)"),
- cl::init(true));
-
-static cl::opt<bool>
-DisableCrossClassJoin("disable-cross-class-join",
- cl::desc("Avoid coalescing cross register class copies"),
- cl::init(false), cl::Hidden);
-
-static cl::opt<bool>
-EnablePhysicalJoin("join-physregs",
- cl::desc("Join physical register copies"),
- cl::init(false), cl::Hidden);
-
-static cl::opt<bool>
-VerifyCoalescing("verify-coalescing",
- cl::desc("Verify machine instrs before and after register coalescing"),
- cl::Hidden);
-
-INITIALIZE_AG_PASS_BEGIN(SimpleRegisterCoalescing, RegisterCoalescer,
- "simple-register-coalescing", "Simple Register Coalescing",
- false, false, true)
-INITIALIZE_PASS_DEPENDENCY(LiveIntervals)
-INITIALIZE_PASS_DEPENDENCY(LiveDebugVariables)
-INITIALIZE_PASS_DEPENDENCY(SlotIndexes)
-INITIALIZE_PASS_DEPENDENCY(MachineLoopInfo)
-INITIALIZE_PASS_DEPENDENCY(StrongPHIElimination)
-INITIALIZE_PASS_DEPENDENCY(PHIElimination)
-INITIALIZE_PASS_DEPENDENCY(TwoAddressInstructionPass)
-INITIALIZE_AG_DEPENDENCY(AliasAnalysis)
-INITIALIZE_AG_PASS_END(SimpleRegisterCoalescing, RegisterCoalescer,
- "simple-register-coalescing", "Simple Register Coalescing",
- false, false, true)
-
-char &llvm::SimpleRegisterCoalescingID = SimpleRegisterCoalescing::ID;
-
-void SimpleRegisterCoalescing::getAnalysisUsage(AnalysisUsage &AU) const {
- AU.setPreservesCFG();
- AU.addRequired<AliasAnalysis>();
- AU.addRequired<LiveIntervals>();
- AU.addPreserved<LiveIntervals>();
- AU.addRequired<LiveDebugVariables>();
- AU.addPreserved<LiveDebugVariables>();
- AU.addPreserved<SlotIndexes>();
- AU.addRequired<MachineLoopInfo>();
- AU.addPreserved<MachineLoopInfo>();
- AU.addPreservedID(MachineDominatorsID);
- AU.addPreservedID(StrongPHIEliminationID);
- AU.addPreservedID(PHIEliminationID);
- AU.addPreservedID(TwoAddressInstructionPassID);
- MachineFunctionPass::getAnalysisUsage(AU);
-}
-
-void SimpleRegisterCoalescing::markAsJoined(MachineInstr *CopyMI) {
- /// Joined copies are not deleted immediately, but kept in JoinedCopies.
- JoinedCopies.insert(CopyMI);
-
- /// Mark all register operands of CopyMI as <undef> so they won't affect dead
- /// code elimination.
- for (MachineInstr::mop_iterator I = CopyMI->operands_begin(),
- E = CopyMI->operands_end(); I != E; ++I)
- if (I->isReg())
- I->setIsUndef(true);
-}
-
-/// AdjustCopiesBackFrom - We found a non-trivially-coalescable copy with IntA
-/// being the source and IntB being the dest, thus this defines a value number
-/// in IntB. If the source value number (in IntA) is defined by a copy from B,
-/// see if we can merge these two pieces of B into a single value number,
-/// eliminating a copy. For example:
-///
-/// A3 = B0
-/// ...
-/// B1 = A3 <- this copy
-///
-/// In this case, B0 can be extended to where the B1 copy lives, allowing the B1
-/// value number to be replaced with B0 (which simplifies the B liveinterval).
-///
-/// This returns true if an interval was modified.
-///
-bool SimpleRegisterCoalescing::AdjustCopiesBackFrom(const CoalescerPair &CP,
- MachineInstr *CopyMI) {
- // Bail if there is no dst interval - can happen when merging physical subreg
- // operations.
- if (!li_->hasInterval(CP.getDstReg()))
- return false;
-
- LiveInterval &IntA =
- li_->getInterval(CP.isFlipped() ? CP.getDstReg() : CP.getSrcReg());
- LiveInterval &IntB =
- li_->getInterval(CP.isFlipped() ? CP.getSrcReg() : CP.getDstReg());
- SlotIndex CopyIdx = li_->getInstructionIndex(CopyMI).getDefIndex();
-
- // BValNo is a value number in B that is defined by a copy from A. 'B3' in
- // the example above.
- LiveInterval::iterator BLR = IntB.FindLiveRangeContaining(CopyIdx);
- if (BLR == IntB.end()) return false;
- VNInfo *BValNo = BLR->valno;
-
- // Get the location that B is defined at. Two options: either this value has
- // an unknown definition point or it is defined at CopyIdx. If unknown, we
- // can't process it.
- if (!BValNo->isDefByCopy()) return false;
- assert(BValNo->def == CopyIdx && "Copy doesn't define the value?");
-
- // AValNo is the value number in A that defines the copy, A3 in the example.
- SlotIndex CopyUseIdx = CopyIdx.getUseIndex();
- LiveInterval::iterator ALR = IntA.FindLiveRangeContaining(CopyUseIdx);
- // The live range might not exist after fun with physreg coalescing.
- if (ALR == IntA.end()) return false;
- VNInfo *AValNo = ALR->valno;
- // If it's re-defined by an early clobber somewhere in the live range, then
- // it's not safe to eliminate the copy. FIXME: This is a temporary workaround.
- // See PR3149:
- // 172 %ECX<def> = MOV32rr %reg1039<kill>
- // 180 INLINEASM <es:subl $5,$1
- // sbbl $3,$0>, 10, %EAX<def>, 14, %ECX<earlyclobber,def>, 9,
- // %EAX<kill>,
- // 36, <fi#0>, 1, %reg0, 0, 9, %ECX<kill>, 36, <fi#1>, 1, %reg0, 0
- // 188 %EAX<def> = MOV32rr %EAX<kill>
- // 196 %ECX<def> = MOV32rr %ECX<kill>
- // 204 %ECX<def> = MOV32rr %ECX<kill>
- // 212 %EAX<def> = MOV32rr %EAX<kill>
- // 220 %EAX<def> = MOV32rr %EAX
- // 228 %reg1039<def> = MOV32rr %ECX<kill>
- // The early clobber operand ties ECX input to the ECX def.
- //
- // The live interval of ECX is represented as this:
- // %reg20,inf = [46,47:1)[174,230:0) 0@174-(230) 1@46-(47)
- // The coalescer has no idea there was a def in the middle of [174,230].
- if (AValNo->hasRedefByEC())
- return false;
-
- // If AValNo is defined as a copy from IntB, we can potentially process this.
- // Get the instruction that defines this value number.
- if (!CP.isCoalescable(AValNo->getCopy()))
- return false;
-
- // Get the LiveRange in IntB that this value number starts with.
- LiveInterval::iterator ValLR =
- IntB.FindLiveRangeContaining(AValNo->def.getPrevSlot());
- if (ValLR == IntB.end())
- return false;
-
- // Make sure that the end of the live range is inside the same block as
- // CopyMI.
- MachineInstr *ValLREndInst =
- li_->getInstructionFromIndex(ValLR->end.getPrevSlot());
- if (!ValLREndInst || ValLREndInst->getParent() != CopyMI->getParent())
- return false;
-
- // Okay, we now know that ValLR ends in the same block that the CopyMI
- // live-range starts. If there are no intervening live ranges between them in
- // IntB, we can merge them.
- if (ValLR+1 != BLR) return false;
-
- // If a live interval is a physical register, conservatively check if any
- // of its aliases is overlapping the live interval of the virtual register.
- // If so, do not coalesce.
- if (TargetRegisterInfo::isPhysicalRegister(IntB.reg)) {
- for (const unsigned *AS = tri_->getAliasSet(IntB.reg); *AS; ++AS)
- if (li_->hasInterval(*AS) && IntA.overlaps(li_->getInterval(*AS))) {
- DEBUG({
- dbgs() << "\t\tInterfere with alias ";
- li_->getInterval(*AS).print(dbgs(), tri_);
- });
- return false;
- }
- }
-
- DEBUG({
- dbgs() << "Extending: ";
- IntB.print(dbgs(), tri_);
- });
-
- SlotIndex FillerStart = ValLR->end, FillerEnd = BLR->start;
- // We are about to delete CopyMI, so need to remove it as the 'instruction
- // that defines this value #'. Update the valnum with the new defining
- // instruction #.
- BValNo->def = FillerStart;
- BValNo->setCopy(0);
-
- // Okay, we can merge them. We need to insert a new liverange:
- // [ValLR.end, BLR.begin) of either value number, then we merge the
- // two value numbers.
- IntB.addRange(LiveRange(FillerStart, FillerEnd, BValNo));
-
- // If the IntB live range is assigned to a physical register, and if that
- // physreg has sub-registers, update their live intervals as well.
- if (TargetRegisterInfo::isPhysicalRegister(IntB.reg)) {
- for (const unsigned *SR = tri_->getSubRegisters(IntB.reg); *SR; ++SR) {
- if (!li_->hasInterval(*SR))
- continue;
- LiveInterval &SRLI = li_->getInterval(*SR);
- SRLI.addRange(LiveRange(FillerStart, FillerEnd,
- SRLI.getNextValue(FillerStart, 0,
- li_->getVNInfoAllocator())));
- }
- }
-
- // Okay, merge "B1" into the same value number as "B0".
- if (BValNo != ValLR->valno) {
- // If B1 is killed by a PHI, then the merged live range must also be killed
- // by the same PHI, as B0 and B1 can not overlap.
- bool HasPHIKill = BValNo->hasPHIKill();
- IntB.MergeValueNumberInto(BValNo, ValLR->valno);
- if (HasPHIKill)
- ValLR->valno->setHasPHIKill(true);
- }
- DEBUG({
- dbgs() << " result = ";
- IntB.print(dbgs(), tri_);
- dbgs() << "\n";
- });
-
- // If the source instruction was killing the source register before the
- // merge, unset the isKill marker given the live range has been extended.
- int UIdx = ValLREndInst->findRegisterUseOperandIdx(IntB.reg, true);
- if (UIdx != -1) {
- ValLREndInst->getOperand(UIdx).setIsKill(false);
- }
-
- // If the copy instruction was killing the destination register before the
- // merge, find the last use and trim the live range. That will also add the
- // isKill marker.
- if (ALR->end == CopyIdx)
- li_->shrinkToUses(&IntA);
-
- ++numExtends;
- return true;
-}
-
-/// HasOtherReachingDefs - Return true if there are definitions of IntB
-/// other than BValNo val# that can reach uses of AValno val# of IntA.
-bool SimpleRegisterCoalescing::HasOtherReachingDefs(LiveInterval &IntA,
- LiveInterval &IntB,
- VNInfo *AValNo,
- VNInfo *BValNo) {
- for (LiveInterval::iterator AI = IntA.begin(), AE = IntA.end();
- AI != AE; ++AI) {
- if (AI->valno != AValNo) continue;
- LiveInterval::Ranges::iterator BI =
- std::upper_bound(IntB.ranges.begin(), IntB.ranges.end(), AI->start);
- if (BI != IntB.ranges.begin())
- --BI;
- for (; BI != IntB.ranges.end() && AI->end >= BI->start; ++BI) {
- if (BI->valno == BValNo)
- continue;
- if (BI->start <= AI->start && BI->end > AI->start)
- return true;
- if (BI->start > AI->start && BI->start < AI->end)
- return true;
- }
- }
- return false;
-}
-
-/// RemoveCopyByCommutingDef - We found a non-trivially-coalescable copy with
-/// IntA being the source and IntB being the dest, thus this defines a value
-/// number in IntB. If the source value number (in IntA) is defined by a
-/// commutable instruction and its other operand is coalesced to the copy dest
-/// register, see if we can transform the copy into a noop by commuting the
-/// definition. For example,
-///
-/// A3 = op A2 B0<kill>
-/// ...
-/// B1 = A3 <- this copy
-/// ...
-/// = op A3 <- more uses
-///
-/// ==>
-///
-/// B2 = op B0 A2<kill>
-/// ...
-/// B1 = B2 <- now an identify copy
-/// ...
-/// = op B2 <- more uses
-///
-/// This returns true if an interval was modified.
-///
-bool SimpleRegisterCoalescing::RemoveCopyByCommutingDef(const CoalescerPair &CP,
- MachineInstr *CopyMI) {
- // FIXME: For now, only eliminate the copy by commuting its def when the
- // source register is a virtual register. We want to guard against cases
- // where the copy is a back edge copy and commuting the def lengthen the
- // live interval of the source register to the entire loop.
- if (CP.isPhys() && CP.isFlipped())
- return false;
-
- // Bail if there is no dst interval.
- if (!li_->hasInterval(CP.getDstReg()))
- return false;
-
- SlotIndex CopyIdx = li_->getInstructionIndex(CopyMI).getDefIndex();
-
- LiveInterval &IntA =
- li_->getInterval(CP.isFlipped() ? CP.getDstReg() : CP.getSrcReg());
- LiveInterval &IntB =
- li_->getInterval(CP.isFlipped() ? CP.getSrcReg() : CP.getDstReg());
-
- // BValNo is a value number in B that is defined by a copy from A. 'B3' in
- // the example above.
- VNInfo *BValNo = IntB.getVNInfoAt(CopyIdx);
- if (!BValNo || !BValNo->isDefByCopy())
- return false;
-
- assert(BValNo->def == CopyIdx && "Copy doesn't define the value?");
-
- // AValNo is the value number in A that defines the copy, A3 in the example.
- VNInfo *AValNo = IntA.getVNInfoAt(CopyIdx.getUseIndex());
- assert(AValNo && "COPY source not live");
-
- // If other defs can reach uses of this def, then it's not safe to perform
- // the optimization.
- if (AValNo->isPHIDef() || AValNo->isUnused() || AValNo->hasPHIKill())
- return false;
- MachineInstr *DefMI = li_->getInstructionFromIndex(AValNo->def);
- if (!DefMI)
- return false;
- const TargetInstrDesc &TID = DefMI->getDesc();
- if (!TID.isCommutable())
- return false;
- // If DefMI is a two-address instruction then commuting it will change the
- // destination register.
- int DefIdx = DefMI->findRegisterDefOperandIdx(IntA.reg);
- assert(DefIdx != -1);
- unsigned UseOpIdx;
- if (!DefMI->isRegTiedToUseOperand(DefIdx, &UseOpIdx))
- return false;
- unsigned Op1, Op2, NewDstIdx;
- if (!tii_->findCommutedOpIndices(DefMI, Op1, Op2))
- return false;
- if (Op1 == UseOpIdx)
- NewDstIdx = Op2;
- else if (Op2 == UseOpIdx)
- NewDstIdx = Op1;
- else
- return false;
-
- MachineOperand &NewDstMO = DefMI->getOperand(NewDstIdx);
- unsigned NewReg = NewDstMO.getReg();
- if (NewReg != IntB.reg || !NewDstMO.isKill())
- return false;
-
- // Make sure there are no other definitions of IntB that would reach the
- // uses which the new definition can reach.
- if (HasOtherReachingDefs(IntA, IntB, AValNo, BValNo))
- return false;
-
- // Abort if the aliases of IntB.reg have values that are not simply the
- // clobbers from the superreg.
- if (TargetRegisterInfo::isPhysicalRegister(IntB.reg))
- for (const unsigned *AS = tri_->getAliasSet(IntB.reg); *AS; ++AS)
- if (li_->hasInterval(*AS) &&
- HasOtherReachingDefs(IntA, li_->getInterval(*AS), AValNo, 0))
- return false;
-
- // If some of the uses of IntA.reg is already coalesced away, return false.
- // It's not possible to determine whether it's safe to perform the coalescing.
- for (MachineRegisterInfo::use_nodbg_iterator UI =
- mri_->use_nodbg_begin(IntA.reg),
- UE = mri_->use_nodbg_end(); UI != UE; ++UI) {
- MachineInstr *UseMI = &*UI;
- SlotIndex UseIdx = li_->getInstructionIndex(UseMI);
- LiveInterval::iterator ULR = IntA.FindLiveRangeContaining(UseIdx);
- if (ULR == IntA.end())
- continue;
- if (ULR->valno == AValNo && JoinedCopies.count(UseMI))
- return false;
- }
-
- DEBUG(dbgs() << "\tRemoveCopyByCommutingDef: " << AValNo->def << '\t'
- << *DefMI);
-
- // At this point we have decided that it is legal to do this
- // transformation. Start by commuting the instruction.
- MachineBasicBlock *MBB = DefMI->getParent();
- MachineInstr *NewMI = tii_->commuteInstruction(DefMI);
- if (!NewMI)
- return false;
- if (TargetRegisterInfo::isVirtualRegister(IntA.reg) &&
- TargetRegisterInfo::isVirtualRegister(IntB.reg) &&
- !mri_->constrainRegClass(IntB.reg, mri_->getRegClass(IntA.reg)))
- return false;
- if (NewMI != DefMI) {
- li_->ReplaceMachineInstrInMaps(DefMI, NewMI);
- MBB->insert(DefMI, NewMI);
- MBB->erase(DefMI);
- }
- unsigned OpIdx = NewMI->findRegisterUseOperandIdx(IntA.reg, false);
- NewMI->getOperand(OpIdx).setIsKill();
-
- // If ALR and BLR overlaps and end of BLR extends beyond end of ALR, e.g.
- // A = or A, B
- // ...
- // B = A
- // ...
- // C = A<kill>
- // ...
- // = B
-
- // Update uses of IntA of the specific Val# with IntB.
- for (MachineRegisterInfo::use_iterator UI = mri_->use_begin(IntA.reg),
- UE = mri_->use_end(); UI != UE;) {
- MachineOperand &UseMO = UI.getOperand();
- MachineInstr *UseMI = &*UI;
- ++UI;
- if (JoinedCopies.count(UseMI))
- continue;
- if (UseMI->isDebugValue()) {
- // FIXME These don't have an instruction index. Not clear we have enough
- // info to decide whether to do this replacement or not. For now do it.
- UseMO.setReg(NewReg);
- continue;
- }
- SlotIndex UseIdx = li_->getInstructionIndex(UseMI).getUseIndex();
- LiveInterval::iterator ULR = IntA.FindLiveRangeContaining(UseIdx);
- if (ULR == IntA.end() || ULR->valno != AValNo)
- continue;
- if (TargetRegisterInfo::isPhysicalRegister(NewReg))
- UseMO.substPhysReg(NewReg, *tri_);
- else
- UseMO.setReg(NewReg);
- if (UseMI == CopyMI)
- continue;
- if (!UseMI->isCopy())
- continue;
- if (UseMI->getOperand(0).getReg() != IntB.reg ||
- UseMI->getOperand(0).getSubReg())
- continue;
-
- // This copy will become a noop. If it's defining a new val#, merge it into
- // BValNo.
- SlotIndex DefIdx = UseIdx.getDefIndex();
- VNInfo *DVNI = IntB.getVNInfoAt(DefIdx);
- if (!DVNI)
- continue;
- DEBUG(dbgs() << "\t\tnoop: " << DefIdx << '\t' << *UseMI);
- assert(DVNI->def == DefIdx);
- BValNo = IntB.MergeValueNumberInto(BValNo, DVNI);
- markAsJoined(UseMI);
- }
-
- // Extend BValNo by merging in IntA live ranges of AValNo. Val# definition
- // is updated.
- VNInfo *ValNo = BValNo;
- ValNo->def = AValNo->def;
- ValNo->setCopy(0);
- for (LiveInterval::iterator AI = IntA.begin(), AE = IntA.end();
- AI != AE; ++AI) {
- if (AI->valno != AValNo) continue;
- IntB.addRange(LiveRange(AI->start, AI->end, ValNo));
- }
- DEBUG(dbgs() << "\t\textended: " << IntB << '\n');
-
- IntA.removeValNo(AValNo);
- DEBUG(dbgs() << "\t\ttrimmed: " << IntA << '\n');
- ++numCommutes;
- return true;
-}
-
-/// ReMaterializeTrivialDef - If the source of a copy is defined by a trivial
-/// computation, replace the copy by rematerialize the definition.
-bool SimpleRegisterCoalescing::ReMaterializeTrivialDef(LiveInterval &SrcInt,
- bool preserveSrcInt,
- unsigned DstReg,
- unsigned DstSubIdx,
- MachineInstr *CopyMI) {
- SlotIndex CopyIdx = li_->getInstructionIndex(CopyMI).getUseIndex();
- LiveInterval::iterator SrcLR = SrcInt.FindLiveRangeContaining(CopyIdx);
- assert(SrcLR != SrcInt.end() && "Live range not found!");
- VNInfo *ValNo = SrcLR->valno;
- // If other defs can reach uses of this def, then it's not safe to perform
- // the optimization.
- if (ValNo->isPHIDef() || ValNo->isUnused() || ValNo->hasPHIKill())
- return false;
- MachineInstr *DefMI = li_->getInstructionFromIndex(ValNo->def);
- if (!DefMI)
- return false;
- assert(DefMI && "Defining instruction disappeared");
- const TargetInstrDesc &TID = DefMI->getDesc();
- if (!TID.isAsCheapAsAMove())
- return false;
- if (!tii_->isTriviallyReMaterializable(DefMI, AA))
- return false;
- bool SawStore = false;
- if (!DefMI->isSafeToMove(tii_, AA, SawStore))
- return false;
- if (TID.getNumDefs() != 1)
- return false;
- if (!DefMI->isImplicitDef()) {
- // Make sure the copy destination register class fits the instruction
- // definition register class. The mismatch can happen as a result of earlier
- // extract_subreg, insert_subreg, subreg_to_reg coalescing.
- const TargetRegisterClass *RC = TID.OpInfo[0].getRegClass(tri_);
- if (TargetRegisterInfo::isVirtualRegister(DstReg)) {
- if (mri_->getRegClass(DstReg) != RC)
- return false;
- } else if (!RC->contains(DstReg))
- return false;
- }
-
- // If destination register has a sub-register index on it, make sure it
- // matches the instruction register class.
- if (DstSubIdx) {
- const TargetInstrDesc &TID = DefMI->getDesc();
- if (TID.getNumDefs() != 1)
- return false;
- const TargetRegisterClass *DstRC = mri_->getRegClass(DstReg);
- const TargetRegisterClass *DstSubRC =
- DstRC->getSubRegisterRegClass(DstSubIdx);
- const TargetRegisterClass *DefRC = TID.OpInfo[0].getRegClass(tri_);
- if (DefRC == DstRC)
- DstSubIdx = 0;
- else if (DefRC != DstSubRC)
- return false;
- }
-
- RemoveCopyFlag(DstReg, CopyMI);
-
- MachineBasicBlock *MBB = CopyMI->getParent();
- MachineBasicBlock::iterator MII =
- llvm::next(MachineBasicBlock::iterator(CopyMI));
- tii_->reMaterialize(*MBB, MII, DstReg, DstSubIdx, DefMI, *tri_);
- MachineInstr *NewMI = prior(MII);
-
- // CopyMI may have implicit operands, transfer them over to the newly
- // rematerialized instruction. And update implicit def interval valnos.
- for (unsigned i = CopyMI->getDesc().getNumOperands(),
- e = CopyMI->getNumOperands(); i != e; ++i) {
- MachineOperand &MO = CopyMI->getOperand(i);
- if (MO.isReg() && MO.isImplicit())
- NewMI->addOperand(MO);
- if (MO.isDef())
- RemoveCopyFlag(MO.getReg(), CopyMI);
- }
-
- NewMI->copyImplicitOps(CopyMI);
- li_->ReplaceMachineInstrInMaps(CopyMI, NewMI);
- CopyMI->eraseFromParent();
- ReMatCopies.insert(CopyMI);
- ReMatDefs.insert(DefMI);
- DEBUG(dbgs() << "Remat: " << *NewMI);
- ++NumReMats;
-
- // The source interval can become smaller because we removed a use.
- if (preserveSrcInt)
- li_->shrinkToUses(&SrcInt);
-
- return true;
-}
-
-/// UpdateRegDefsUses - Replace all defs and uses of SrcReg to DstReg and
-/// update the subregister number if it is not zero. If DstReg is a
-/// physical register and the existing subregister number of the def / use
-/// being updated is not zero, make sure to set it to the correct physical
-/// subregister.
-void
-SimpleRegisterCoalescing::UpdateRegDefsUses(const CoalescerPair &CP) {
- bool DstIsPhys = CP.isPhys();
- unsigned SrcReg = CP.getSrcReg();
- unsigned DstReg = CP.getDstReg();
- unsigned SubIdx = CP.getSubIdx();
-
- // Update LiveDebugVariables.
- ldv_->renameRegister(SrcReg, DstReg, SubIdx);
-
- for (MachineRegisterInfo::reg_iterator I = mri_->reg_begin(SrcReg);
- MachineInstr *UseMI = I.skipInstruction();) {
- // A PhysReg copy that won't be coalesced can perhaps be rematerialized
- // instead.
- if (DstIsPhys) {
- if (UseMI->isCopy() &&
- !UseMI->getOperand(1).getSubReg() &&
- !UseMI->getOperand(0).getSubReg() &&
- UseMI->getOperand(1).getReg() == SrcReg &&
- UseMI->getOperand(0).getReg() != SrcReg &&
- UseMI->getOperand(0).getReg() != DstReg &&
- !JoinedCopies.count(UseMI) &&
- ReMaterializeTrivialDef(li_->getInterval(SrcReg), false,
- UseMI->getOperand(0).getReg(), 0, UseMI))
- continue;
- }
-
- SmallVector<unsigned,8> Ops;
- bool Reads, Writes;
- tie(Reads, Writes) = UseMI->readsWritesVirtualRegister(SrcReg, &Ops);
- bool Kills = false, Deads = false;
-
- // Replace SrcReg with DstReg in all UseMI operands.
- for (unsigned i = 0, e = Ops.size(); i != e; ++i) {
- MachineOperand &MO = UseMI->getOperand(Ops[i]);
- Kills |= MO.isKill();
- Deads |= MO.isDead();
-
- if (DstIsPhys)
- MO.substPhysReg(DstReg, *tri_);
- else
- MO.substVirtReg(DstReg, SubIdx, *tri_);
- }
-
- // This instruction is a copy that will be removed.
- if (JoinedCopies.count(UseMI))
- continue;
-
- if (SubIdx) {
- // If UseMI was a simple SrcReg def, make sure we didn't turn it into a
- // read-modify-write of DstReg.
- if (Deads)
- UseMI->addRegisterDead(DstReg, tri_);
- else if (!Reads && Writes)
- UseMI->addRegisterDefined(DstReg, tri_);
-
- // Kill flags apply to the whole physical register.
- if (DstIsPhys && Kills)
- UseMI->addRegisterKilled(DstReg, tri_);
- }
-
- DEBUG({
- dbgs() << "\t\tupdated: ";
- if (!UseMI->isDebugValue())
- dbgs() << li_->getInstructionIndex(UseMI) << "\t";
- dbgs() << *UseMI;
- });
- }
-}
-
-/// removeIntervalIfEmpty - Check if the live interval of a physical register
-/// is empty, if so remove it and also remove the empty intervals of its
-/// sub-registers. Return true if live interval is removed.
-static bool removeIntervalIfEmpty(LiveInterval &li, LiveIntervals *li_,
- const TargetRegisterInfo *tri_) {
- if (li.empty()) {
- if (TargetRegisterInfo::isPhysicalRegister(li.reg))
- for (const unsigned* SR = tri_->getSubRegisters(li.reg); *SR; ++SR) {
- if (!li_->hasInterval(*SR))
- continue;
- LiveInterval &sli = li_->getInterval(*SR);
- if (sli.empty())
- li_->removeInterval(*SR);
- }
- li_->removeInterval(li.reg);
- return true;
- }
- return false;
-}
-
-/// RemoveDeadDef - If a def of a live interval is now determined dead, remove
-/// the val# it defines. If the live interval becomes empty, remove it as well.
-bool SimpleRegisterCoalescing::RemoveDeadDef(LiveInterval &li,
- MachineInstr *DefMI) {
- SlotIndex DefIdx = li_->getInstructionIndex(DefMI).getDefIndex();
- LiveInterval::iterator MLR = li.FindLiveRangeContaining(DefIdx);
- if (DefIdx != MLR->valno->def)
- return false;
- li.removeValNo(MLR->valno);
- return removeIntervalIfEmpty(li, li_, tri_);
-}
-
-void SimpleRegisterCoalescing::RemoveCopyFlag(unsigned DstReg,
- const MachineInstr *CopyMI) {
- SlotIndex DefIdx = li_->getInstructionIndex(CopyMI).getDefIndex();
- if (li_->hasInterval(DstReg)) {
- LiveInterval &LI = li_->getInterval(DstReg);
- if (const LiveRange *LR = LI.getLiveRangeContaining(DefIdx))
- if (LR->valno->def == DefIdx)
- LR->valno->setCopy(0);
- }
- if (!TargetRegisterInfo::isPhysicalRegister(DstReg))
- return;
- for (const unsigned* AS = tri_->getAliasSet(DstReg); *AS; ++AS) {
- if (!li_->hasInterval(*AS))
- continue;
- LiveInterval &LI = li_->getInterval(*AS);
- if (const LiveRange *LR = LI.getLiveRangeContaining(DefIdx))
- if (LR->valno->def == DefIdx)
- LR->valno->setCopy(0);
- }
-}
-
-/// shouldJoinPhys - Return true if a copy involving a physreg should be joined.
-/// We need to be careful about coalescing a source physical register with a
-/// virtual register. Once the coalescing is done, it cannot be broken and these
-/// are not spillable! If the destination interval uses are far away, think
-/// twice about coalescing them!
-bool SimpleRegisterCoalescing::shouldJoinPhys(CoalescerPair &CP) {
- bool Allocatable = li_->isAllocatable(CP.getDstReg());
- LiveInterval &JoinVInt = li_->getInterval(CP.getSrcReg());
-
- /// Always join simple intervals that are defined by a single copy from a
- /// reserved register. This doesn't increase register pressure, so it is
- /// always beneficial.
- if (!Allocatable && CP.isFlipped() && JoinVInt.containsOneValue())
- return true;
-
- if (!EnablePhysicalJoin) {
- DEBUG(dbgs() << "\tPhysreg joins disabled.\n");
- return false;
- }
-
- // Only coalesce to allocatable physreg, we don't want to risk modifying
- // reserved registers.
- if (!Allocatable) {
- DEBUG(dbgs() << "\tRegister is an unallocatable physreg.\n");
- return false; // Not coalescable.
- }
-
- // Don't join with physregs that have a ridiculous number of live
- // ranges. The data structure performance is really bad when that
- // happens.
- if (li_->hasInterval(CP.getDstReg()) &&
- li_->getInterval(CP.getDstReg()).ranges.size() > 1000) {
- ++numAborts;
- DEBUG(dbgs()
- << "\tPhysical register live interval too complicated, abort!\n");
- return false;
- }
-
- // FIXME: Why are we skipping this test for partial copies?
- // CodeGen/X86/phys_subreg_coalesce-3.ll needs it.
- if (!CP.isPartial()) {
- const TargetRegisterClass *RC = mri_->getRegClass(CP.getSrcReg());
- unsigned Threshold = RegClassInfo.getNumAllocatableRegs(RC) * 2;
- unsigned Length = li_->getApproximateInstructionCount(JoinVInt);
- if (Length > Threshold) {
- ++numAborts;
- DEBUG(dbgs() << "\tMay tie down a physical register, abort!\n");
- return false;
- }
- }
- return true;
-}
-
-/// isWinToJoinCrossClass - Return true if it's profitable to coalesce
-/// two virtual registers from different register classes.
-bool
-SimpleRegisterCoalescing::isWinToJoinCrossClass(unsigned SrcReg,
- unsigned DstReg,
- const TargetRegisterClass *SrcRC,
- const TargetRegisterClass *DstRC,
- const TargetRegisterClass *NewRC) {
- unsigned NewRCCount = RegClassInfo.getNumAllocatableRegs(NewRC);
- // This heuristics is good enough in practice, but it's obviously not *right*.
- // 4 is a magic number that works well enough for x86, ARM, etc. It filter
- // out all but the most restrictive register classes.
- if (NewRCCount > 4 ||
- // Early exit if the function is fairly small, coalesce aggressively if
- // that's the case. For really special register classes with 3 or
- // fewer registers, be a bit more careful.
- (li_->getFuncInstructionCount() / NewRCCount) < 8)
- return true;
- LiveInterval &SrcInt = li_->getInterval(SrcReg);
- LiveInterval &DstInt = li_->getInterval(DstReg);
- unsigned SrcSize = li_->getApproximateInstructionCount(SrcInt);
- unsigned DstSize = li_->getApproximateInstructionCount(DstInt);
-
- // Coalesce aggressively if the intervals are small compared to the number of
- // registers in the new class. The number 4 is fairly arbitrary, chosen to be
- // less aggressive than the 8 used for the whole function size.
- const unsigned ThresSize = 4 * NewRCCount;
- if (SrcSize <= ThresSize && DstSize <= ThresSize)
- return true;
-
- // Estimate *register use density*. If it doubles or more, abort.
- unsigned SrcUses = std::distance(mri_->use_nodbg_begin(SrcReg),
- mri_->use_nodbg_end());
- unsigned DstUses = std::distance(mri_->use_nodbg_begin(DstReg),
- mri_->use_nodbg_end());
- unsigned NewUses = SrcUses + DstUses;
- unsigned NewSize = SrcSize + DstSize;
- if (SrcRC != NewRC && SrcSize > ThresSize) {
- unsigned SrcRCCount = RegClassInfo.getNumAllocatableRegs(SrcRC);
- if (NewUses*SrcSize*SrcRCCount > 2*SrcUses*NewSize*NewRCCount)
- return false;
- }
- if (DstRC != NewRC && DstSize > ThresSize) {
- unsigned DstRCCount = RegClassInfo.getNumAllocatableRegs(DstRC);
- if (NewUses*DstSize*DstRCCount > 2*DstUses*NewSize*NewRCCount)
- return false;
- }
- return true;
-}
-
-
-/// JoinCopy - Attempt to join intervals corresponding to SrcReg/DstReg,
-/// which are the src/dst of the copy instruction CopyMI. This returns true
-/// if the copy was successfully coalesced away. If it is not currently
-/// possible to coalesce this interval, but it may be possible if other
-/// things get coalesced, then it returns true by reference in 'Again'.
-bool SimpleRegisterCoalescing::JoinCopy(CopyRec &TheCopy, bool &Again) {
- MachineInstr *CopyMI = TheCopy.MI;
-
- Again = false;
- if (JoinedCopies.count(CopyMI) || ReMatCopies.count(CopyMI))
- return false; // Already done.
-
- DEBUG(dbgs() << li_->getInstructionIndex(CopyMI) << '\t' << *CopyMI);
-
- CoalescerPair CP(*tii_, *tri_);
- if (!CP.setRegisters(CopyMI)) {
- DEBUG(dbgs() << "\tNot coalescable.\n");
- return false;
- }
-
- // If they are already joined we continue.
- if (CP.getSrcReg() == CP.getDstReg()) {
- markAsJoined(CopyMI);
- DEBUG(dbgs() << "\tCopy already coalesced.\n");
- return false; // Not coalescable.
- }
-
- DEBUG(dbgs() << "\tConsidering merging " << PrintReg(CP.getSrcReg(), tri_)
- << " with " << PrintReg(CP.getDstReg(), tri_, CP.getSubIdx())
- << "\n");
-
- // Enforce policies.
- if (CP.isPhys()) {
- if (!shouldJoinPhys(CP)) {
- // Before giving up coalescing, if definition of source is defined by
- // trivial computation, try rematerializing it.
- if (!CP.isFlipped() &&
- ReMaterializeTrivialDef(li_->getInterval(CP.getSrcReg()), true,
- CP.getDstReg(), 0, CopyMI))
- return true;
- return false;
- }
- } else {
- // Avoid constraining virtual register regclass too much.
- if (CP.isCrossClass()) {
- DEBUG(dbgs() << "\tCross-class to " << CP.getNewRC()->getName() << ".\n");
- if (DisableCrossClassJoin) {
- DEBUG(dbgs() << "\tCross-class joins disabled.\n");
- return false;
- }
- if (!isWinToJoinCrossClass(CP.getSrcReg(), CP.getDstReg(),
- mri_->getRegClass(CP.getSrcReg()),
- mri_->getRegClass(CP.getDstReg()),
- CP.getNewRC())) {
- DEBUG(dbgs() << "\tAvoid coalescing to constrained register class.\n");
- Again = true; // May be possible to coalesce later.
- return false;
- }
- }
-
- // When possible, let DstReg be the larger interval.
- if (!CP.getSubIdx() && li_->getInterval(CP.getSrcReg()).ranges.size() >
- li_->getInterval(CP.getDstReg()).ranges.size())
- CP.flip();
- }
-
- // Okay, attempt to join these two intervals. On failure, this returns false.
- // Otherwise, if one of the intervals being joined is a physreg, this method
- // always canonicalizes DstInt to be it. The output "SrcInt" will not have
- // been modified, so we can use this information below to update aliases.
- if (!JoinIntervals(CP)) {
- // Coalescing failed.
-
- // If definition of source is defined by trivial computation, try
- // rematerializing it.
- if (!CP.isFlipped() &&
- ReMaterializeTrivialDef(li_->getInterval(CP.getSrcReg()), true,
- CP.getDstReg(), 0, CopyMI))
- return true;
-
- // If we can eliminate the copy without merging the live ranges, do so now.
- if (!CP.isPartial()) {
- if (AdjustCopiesBackFrom(CP, CopyMI) ||
- RemoveCopyByCommutingDef(CP, CopyMI)) {
- markAsJoined(CopyMI);
- DEBUG(dbgs() << "\tTrivial!\n");
- return true;
- }
- }
-
- // Otherwise, we are unable to join the intervals.
- DEBUG(dbgs() << "\tInterference!\n");
- Again = true; // May be possible to coalesce later.
- return false;
- }
-
- // Coalescing to a virtual register that is of a sub-register class of the
- // other. Make sure the resulting register is set to the right register class.
- if (CP.isCrossClass()) {
- ++numCrossRCs;
- mri_->setRegClass(CP.getDstReg(), CP.getNewRC());
- }
-
- // Remember to delete the copy instruction.
- markAsJoined(CopyMI);
-
- UpdateRegDefsUses(CP);
-
- // If we have extended the live range of a physical register, make sure we
- // update live-in lists as well.
- if (CP.isPhys()) {
- SmallVector<MachineBasicBlock*, 16> BlockSeq;
- // JoinIntervals invalidates the VNInfos in SrcInt, but we only need the
- // ranges for this, and they are preserved.
- LiveInterval &SrcInt = li_->getInterval(CP.getSrcReg());
- for (LiveInterval::const_iterator I = SrcInt.begin(), E = SrcInt.end();
- I != E; ++I ) {
- li_->findLiveInMBBs(I->start, I->end, BlockSeq);
- for (unsigned idx = 0, size = BlockSeq.size(); idx != size; ++idx) {
- MachineBasicBlock &block = *BlockSeq[idx];
- if (!block.isLiveIn(CP.getDstReg()))
- block.addLiveIn(CP.getDstReg());
- }
- BlockSeq.clear();
- }
- }
-
- // SrcReg is guarateed to be the register whose live interval that is
- // being merged.
- li_->removeInterval(CP.getSrcReg());
-
- // Update regalloc hint.
- tri_->UpdateRegAllocHint(CP.getSrcReg(), CP.getDstReg(), *mf_);
-
- DEBUG({
- LiveInterval &DstInt = li_->getInterval(CP.getDstReg());
- dbgs() << "\tJoined. Result = ";
- DstInt.print(dbgs(), tri_);
- dbgs() << "\n";
- });
-
- ++numJoins;
- return true;
-}
-
-/// ComputeUltimateVN - Assuming we are going to join two live intervals,
-/// compute what the resultant value numbers for each value in the input two
-/// ranges will be. This is complicated by copies between the two which can
-/// and will commonly cause multiple value numbers to be merged into one.
-///
-/// VN is the value number that we're trying to resolve. InstDefiningValue
-/// keeps track of the new InstDefiningValue assignment for the result
-/// LiveInterval. ThisFromOther/OtherFromThis are sets that keep track of
-/// whether a value in this or other is a copy from the opposite set.
-/// ThisValNoAssignments/OtherValNoAssignments keep track of value #'s that have
-/// already been assigned.
-///
-/// ThisFromOther[x] - If x is defined as a copy from the other interval, this
-/// contains the value number the copy is from.
-///
-static unsigned ComputeUltimateVN(VNInfo *VNI,
- SmallVector<VNInfo*, 16> &NewVNInfo,
- DenseMap<VNInfo*, VNInfo*> &ThisFromOther,
- DenseMap<VNInfo*, VNInfo*> &OtherFromThis,
- SmallVector<int, 16> &ThisValNoAssignments,
- SmallVector<int, 16> &OtherValNoAssignments) {
- unsigned VN = VNI->id;
-
- // If the VN has already been computed, just return it.
- if (ThisValNoAssignments[VN] >= 0)
- return ThisValNoAssignments[VN];
- assert(ThisValNoAssignments[VN] != -2 && "Cyclic value numbers");
-
- // If this val is not a copy from the other val, then it must be a new value
- // number in the destination.
- DenseMap<VNInfo*, VNInfo*>::iterator I = ThisFromOther.find(VNI);
- if (I == ThisFromOther.end()) {
- NewVNInfo.push_back(VNI);
- return ThisValNoAssignments[VN] = NewVNInfo.size()-1;
- }
- VNInfo *OtherValNo = I->second;
-
- // Otherwise, this *is* a copy from the RHS. If the other side has already
- // been computed, return it.
- if (OtherValNoAssignments[OtherValNo->id] >= 0)
- return ThisValNoAssignments[VN] = OtherValNoAssignments[OtherValNo->id];
-
- // Mark this value number as currently being computed, then ask what the
- // ultimate value # of the other value is.
- ThisValNoAssignments[VN] = -2;
- unsigned UltimateVN =
- ComputeUltimateVN(OtherValNo, NewVNInfo, OtherFromThis, ThisFromOther,
- OtherValNoAssignments, ThisValNoAssignments);
- return ThisValNoAssignments[VN] = UltimateVN;
-}
-
-/// JoinIntervals - Attempt to join these two intervals. On failure, this
-/// returns false.
-bool SimpleRegisterCoalescing::JoinIntervals(CoalescerPair &CP) {
- LiveInterval &RHS = li_->getInterval(CP.getSrcReg());
- DEBUG({ dbgs() << "\t\tRHS = "; RHS.print(dbgs(), tri_); dbgs() << "\n"; });
-
- // If a live interval is a physical register, check for interference with any
- // aliases. The interference check implemented here is a bit more conservative
- // than the full interfeence check below. We allow overlapping live ranges
- // only when one is a copy of the other.
- if (CP.isPhys()) {
- for (const unsigned *AS = tri_->getAliasSet(CP.getDstReg()); *AS; ++AS){
- if (!li_->hasInterval(*AS))
- continue;
- const LiveInterval &LHS = li_->getInterval(*AS);
- LiveInterval::const_iterator LI = LHS.begin();
- for (LiveInterval::const_iterator RI = RHS.begin(), RE = RHS.end();
- RI != RE; ++RI) {
- LI = std::lower_bound(LI, LHS.end(), RI->start);
- // Does LHS have an overlapping live range starting before RI?
- if ((LI != LHS.begin() && LI[-1].end > RI->start) &&
- (RI->start != RI->valno->def ||
- !CP.isCoalescable(li_->getInstructionFromIndex(RI->start)))) {
- DEBUG({
- dbgs() << "\t\tInterference from alias: ";
- LHS.print(dbgs(), tri_);
- dbgs() << "\n\t\tOverlap at " << RI->start << " and no copy.\n";
- });
- return false;
- }
-
- // Check that LHS ranges beginning in this range are copies.
- for (; LI != LHS.end() && LI->start < RI->end; ++LI) {
- if (LI->start != LI->valno->def ||
- !CP.isCoalescable(li_->getInstructionFromIndex(LI->start))) {
- DEBUG({
- dbgs() << "\t\tInterference from alias: ";
- LHS.print(dbgs(), tri_);
- dbgs() << "\n\t\tDef at " << LI->start << " is not a copy.\n";
- });
- return false;
- }
- }
- }
- }
- }
-
- // Compute the final value assignment, assuming that the live ranges can be
- // coalesced.
- SmallVector<int, 16> LHSValNoAssignments;
- SmallVector<int, 16> RHSValNoAssignments;
- DenseMap<VNInfo*, VNInfo*> LHSValsDefinedFromRHS;
- DenseMap<VNInfo*, VNInfo*> RHSValsDefinedFromLHS;
- SmallVector<VNInfo*, 16> NewVNInfo;
-
- LiveInterval &LHS = li_->getOrCreateInterval(CP.getDstReg());
- DEBUG({ dbgs() << "\t\tLHS = "; LHS.print(dbgs(), tri_); dbgs() << "\n"; });
-
- // Loop over the value numbers of the LHS, seeing if any are defined from
- // the RHS.
- for (LiveInterval::vni_iterator i = LHS.vni_begin(), e = LHS.vni_end();
- i != e; ++i) {
- VNInfo *VNI = *i;
- if (VNI->isUnused() || !VNI->isDefByCopy()) // Src not defined by a copy?
- continue;
-
- // Never join with a register that has EarlyClobber redefs.
- if (VNI->hasRedefByEC())
- return false;
-
- // DstReg is known to be a register in the LHS interval. If the src is
- // from the RHS interval, we can use its value #.
- if (!CP.isCoalescable(VNI->getCopy()))
- continue;
-
- // Figure out the value # from the RHS.
- LiveRange *lr = RHS.getLiveRangeContaining(VNI->def.getPrevSlot());
- // The copy could be to an aliased physreg.
- if (!lr) continue;
- LHSValsDefinedFromRHS[VNI] = lr->valno;
- }
-
- // Loop over the value numbers of the RHS, seeing if any are defined from
- // the LHS.
- for (LiveInterval::vni_iterator i = RHS.vni_begin(), e = RHS.vni_end();
- i != e; ++i) {
- VNInfo *VNI = *i;
- if (VNI->isUnused() || !VNI->isDefByCopy()) // Src not defined by a copy?
- continue;
-
- // Never join with a register that has EarlyClobber redefs.
- if (VNI->hasRedefByEC())
- return false;
-
- // DstReg is known to be a register in the RHS interval. If the src is
- // from the LHS interval, we can use its value #.
- if (!CP.isCoalescable(VNI->getCopy()))
- continue;
-
- // Figure out the value # from the LHS.
- LiveRange *lr = LHS.getLiveRangeContaining(VNI->def.getPrevSlot());
- // The copy could be to an aliased physreg.
- if (!lr) continue;
- RHSValsDefinedFromLHS[VNI] = lr->valno;
- }
-
- LHSValNoAssignments.resize(LHS.getNumValNums(), -1);
- RHSValNoAssignments.resize(RHS.getNumValNums(), -1);
- NewVNInfo.reserve(LHS.getNumValNums() + RHS.getNumValNums());
-
- for (LiveInterval::vni_iterator i = LHS.vni_begin(), e = LHS.vni_end();
- i != e; ++i) {
- VNInfo *VNI = *i;
- unsigned VN = VNI->id;
- if (LHSValNoAssignments[VN] >= 0 || VNI->isUnused())
- continue;
- ComputeUltimateVN(VNI, NewVNInfo,
- LHSValsDefinedFromRHS, RHSValsDefinedFromLHS,
- LHSValNoAssignments, RHSValNoAssignments);
- }
- for (LiveInterval::vni_iterator i = RHS.vni_begin(), e = RHS.vni_end();
- i != e; ++i) {
- VNInfo *VNI = *i;
- unsigned VN = VNI->id;
- if (RHSValNoAssignments[VN] >= 0 || VNI->isUnused())
- continue;
- // If this value number isn't a copy from the LHS, it's a new number.
- if (RHSValsDefinedFromLHS.find(VNI) == RHSValsDefinedFromLHS.end()) {
- NewVNInfo.push_back(VNI);
- RHSValNoAssignments[VN] = NewVNInfo.size()-1;
- continue;
- }
-
- ComputeUltimateVN(VNI, NewVNInfo,
- RHSValsDefinedFromLHS, LHSValsDefinedFromRHS,
- RHSValNoAssignments, LHSValNoAssignments);
- }
-
- // Armed with the mappings of LHS/RHS values to ultimate values, walk the
- // interval lists to see if these intervals are coalescable.
- LiveInterval::const_iterator I = LHS.begin();
- LiveInterval::const_iterator IE = LHS.end();
- LiveInterval::const_iterator J = RHS.begin();
- LiveInterval::const_iterator JE = RHS.end();
-
- // Skip ahead until the first place of potential sharing.
- if (I != IE && J != JE) {
- if (I->start < J->start) {
- I = std::upper_bound(I, IE, J->start);
- if (I != LHS.begin()) --I;
- } else if (J->start < I->start) {
- J = std::upper_bound(J, JE, I->start);
- if (J != RHS.begin()) --J;
- }
- }
-
- while (I != IE && J != JE) {
- // Determine if these two live ranges overlap.
- bool Overlaps;
- if (I->start < J->start) {
- Overlaps = I->end > J->start;
- } else {
- Overlaps = J->end > I->start;
- }
-
- // If so, check value # info to determine if they are really different.
- if (Overlaps) {
- // If the live range overlap will map to the same value number in the
- // result liverange, we can still coalesce them. If not, we can't.
- if (LHSValNoAssignments[I->valno->id] !=
- RHSValNoAssignments[J->valno->id])
- return false;
- // If it's re-defined by an early clobber somewhere in the live range,
- // then conservatively abort coalescing.
- if (NewVNInfo[LHSValNoAssignments[I->valno->id]]->hasRedefByEC())
- return false;
- }
-
- if (I->end < J->end)
- ++I;
- else
- ++J;
- }
-
- // Update kill info. Some live ranges are extended due to copy coalescing.
- for (DenseMap<VNInfo*, VNInfo*>::iterator I = LHSValsDefinedFromRHS.begin(),
- E = LHSValsDefinedFromRHS.end(); I != E; ++I) {
- VNInfo *VNI = I->first;
- unsigned LHSValID = LHSValNoAssignments[VNI->id];
- if (VNI->hasPHIKill())
- NewVNInfo[LHSValID]->setHasPHIKill(true);
- }
-
- // Update kill info. Some live ranges are extended due to copy coalescing.
- for (DenseMap<VNInfo*, VNInfo*>::iterator I = RHSValsDefinedFromLHS.begin(),
- E = RHSValsDefinedFromLHS.end(); I != E; ++I) {
- VNInfo *VNI = I->first;
- unsigned RHSValID = RHSValNoAssignments[VNI->id];
- if (VNI->hasPHIKill())
- NewVNInfo[RHSValID]->setHasPHIKill(true);
- }
-
- if (LHSValNoAssignments.empty())
- LHSValNoAssignments.push_back(-1);
- if (RHSValNoAssignments.empty())
- RHSValNoAssignments.push_back(-1);
-
- // If we get here, we know that we can coalesce the live ranges. Ask the
- // intervals to coalesce themselves now.
- LHS.join(RHS, &LHSValNoAssignments[0], &RHSValNoAssignments[0], NewVNInfo,
- mri_);
- return true;
-}
-
-namespace {
- // DepthMBBCompare - Comparison predicate that sort first based on the loop
- // depth of the basic block (the unsigned), and then on the MBB number.
- struct DepthMBBCompare {
- typedef std::pair<unsigned, MachineBasicBlock*> DepthMBBPair;
- bool operator()(const DepthMBBPair &LHS, const DepthMBBPair &RHS) const {
- // Deeper loops first
- if (LHS.first != RHS.first)
- return LHS.first > RHS.first;
-
- // Prefer blocks that are more connected in the CFG. This takes care of
- // the most difficult copies first while intervals are short.
- unsigned cl = LHS.second->pred_size() + LHS.second->succ_size();
- unsigned cr = RHS.second->pred_size() + RHS.second->succ_size();
- if (cl != cr)
- return cl > cr;
-
- // As a last resort, sort by block number.
- return LHS.second->getNumber() < RHS.second->getNumber();
- }
- };
-}
-
-void SimpleRegisterCoalescing::CopyCoalesceInMBB(MachineBasicBlock *MBB,
- std::vector<CopyRec> &TryAgain) {
- DEBUG(dbgs() << MBB->getName() << ":\n");
-
- SmallVector<CopyRec, 8> VirtCopies;
- SmallVector<CopyRec, 8> PhysCopies;
- SmallVector<CopyRec, 8> ImpDefCopies;
- for (MachineBasicBlock::iterator MII = MBB->begin(), E = MBB->end();
- MII != E;) {
- MachineInstr *Inst = MII++;
-
- // If this isn't a copy nor a extract_subreg, we can't join intervals.
- unsigned SrcReg, DstReg;
- if (Inst->isCopy()) {
- DstReg = Inst->getOperand(0).getReg();
- SrcReg = Inst->getOperand(1).getReg();
- } else if (Inst->isSubregToReg()) {
- DstReg = Inst->getOperand(0).getReg();
- SrcReg = Inst->getOperand(2).getReg();
- } else
- continue;
-
- bool SrcIsPhys = TargetRegisterInfo::isPhysicalRegister(SrcReg);
- bool DstIsPhys = TargetRegisterInfo::isPhysicalRegister(DstReg);
- if (li_->hasInterval(SrcReg) && li_->getInterval(SrcReg).empty())
- ImpDefCopies.push_back(CopyRec(Inst, 0));
- else if (SrcIsPhys || DstIsPhys)
- PhysCopies.push_back(CopyRec(Inst, 0));
- else
- VirtCopies.push_back(CopyRec(Inst, 0));
- }
-
- // Try coalescing implicit copies and insert_subreg <undef> first,
- // followed by copies to / from physical registers, then finally copies
- // from virtual registers to virtual registers.
- for (unsigned i = 0, e = ImpDefCopies.size(); i != e; ++i) {
- CopyRec &TheCopy = ImpDefCopies[i];
- bool Again = false;
- if (!JoinCopy(TheCopy, Again))
- if (Again)
- TryAgain.push_back(TheCopy);
- }
- for (unsigned i = 0, e = PhysCopies.size(); i != e; ++i) {
- CopyRec &TheCopy = PhysCopies[i];
- bool Again = false;
- if (!JoinCopy(TheCopy, Again))
- if (Again)
- TryAgain.push_back(TheCopy);
- }
- for (unsigned i = 0, e = VirtCopies.size(); i != e; ++i) {
- CopyRec &TheCopy = VirtCopies[i];
- bool Again = false;
- if (!JoinCopy(TheCopy, Again))
- if (Again)
- TryAgain.push_back(TheCopy);
- }
-}
-
-void SimpleRegisterCoalescing::joinIntervals() {
- DEBUG(dbgs() << "********** JOINING INTERVALS ***********\n");
-
- std::vector<CopyRec> TryAgainList;
- if (loopInfo->empty()) {
- // If there are no loops in the function, join intervals in function order.
- for (MachineFunction::iterator I = mf_->begin(), E = mf_->end();
- I != E; ++I)
- CopyCoalesceInMBB(I, TryAgainList);
- } else {
- // Otherwise, join intervals in inner loops before other intervals.
- // Unfortunately we can't just iterate over loop hierarchy here because
- // there may be more MBB's than BB's. Collect MBB's for sorting.
-
- // Join intervals in the function prolog first. We want to join physical
- // registers with virtual registers before the intervals got too long.
- std::vector<std::pair<unsigned, MachineBasicBlock*> > MBBs;
- for (MachineFunction::iterator I = mf_->begin(), E = mf_->end();I != E;++I){
- MachineBasicBlock *MBB = I;
- MBBs.push_back(std::make_pair(loopInfo->getLoopDepth(MBB), I));
- }
-
- // Sort by loop depth.
- std::sort(MBBs.begin(), MBBs.end(), DepthMBBCompare());
-
- // Finally, join intervals in loop nest order.
- for (unsigned i = 0, e = MBBs.size(); i != e; ++i)
- CopyCoalesceInMBB(MBBs[i].second, TryAgainList);
- }
-
- // Joining intervals can allow other intervals to be joined. Iteratively join
- // until we make no progress.
- bool ProgressMade = true;
- while (ProgressMade) {
- ProgressMade = false;
-
- for (unsigned i = 0, e = TryAgainList.size(); i != e; ++i) {
- CopyRec &TheCopy = TryAgainList[i];
- if (!TheCopy.MI)
- continue;
-
- bool Again = false;
- bool Success = JoinCopy(TheCopy, Again);
- if (Success || !Again) {
- TheCopy.MI = 0; // Mark this one as done.
- ProgressMade = true;
- }
- }
- }
-}
-
-void SimpleRegisterCoalescing::releaseMemory() {
- JoinedCopies.clear();
- ReMatCopies.clear();
- ReMatDefs.clear();
-}
-
-bool SimpleRegisterCoalescing::runOnMachineFunction(MachineFunction &fn) {
- mf_ = &fn;
- mri_ = &fn.getRegInfo();
- tm_ = &fn.getTarget();
- tri_ = tm_->getRegisterInfo();
- tii_ = tm_->getInstrInfo();
- li_ = &getAnalysis<LiveIntervals>();
- ldv_ = &getAnalysis<LiveDebugVariables>();
- AA = &getAnalysis<AliasAnalysis>();
- loopInfo = &getAnalysis<MachineLoopInfo>();
-
- DEBUG(dbgs() << "********** SIMPLE REGISTER COALESCING **********\n"
- << "********** Function: "
- << ((Value*)mf_->getFunction())->getName() << '\n');
-
- if (VerifyCoalescing)
- mf_->verify(this, "Before register coalescing");
-
- RegClassInfo.runOnMachineFunction(fn);
-
- // Join (coalesce) intervals if requested.
- if (EnableJoining) {
- joinIntervals();
- DEBUG({
- dbgs() << "********** INTERVALS POST JOINING **********\n";
- for (LiveIntervals::iterator I = li_->begin(), E = li_->end();
- I != E; ++I){
- I->second->print(dbgs(), tri_);
- dbgs() << "\n";
- }
- });
- }
-
- // Perform a final pass over the instructions and compute spill weights
- // and remove identity moves.
- SmallVector<unsigned, 4> DeadDefs;
- for (MachineFunction::iterator mbbi = mf_->begin(), mbbe = mf_->end();
- mbbi != mbbe; ++mbbi) {
- MachineBasicBlock* mbb = mbbi;
- for (MachineBasicBlock::iterator mii = mbb->begin(), mie = mbb->end();
- mii != mie; ) {
- MachineInstr *MI = mii;
- if (JoinedCopies.count(MI)) {
- // Delete all coalesced copies.
- bool DoDelete = true;
- assert(MI->isCopyLike() && "Unrecognized copy instruction");
- unsigned SrcReg = MI->getOperand(MI->isSubregToReg() ? 2 : 1).getReg();
- if (TargetRegisterInfo::isPhysicalRegister(SrcReg) &&
- MI->getNumOperands() > 2)
- // Do not delete extract_subreg, insert_subreg of physical
- // registers unless the definition is dead. e.g.
- // %DO<def> = INSERT_SUBREG %D0<undef>, %S0<kill>, 1
- // or else the scavenger may complain. LowerSubregs will
- // delete them later.
- DoDelete = false;
-
- if (MI->allDefsAreDead()) {
- if (TargetRegisterInfo::isVirtualRegister(SrcReg) &&
- li_->hasInterval(SrcReg))
- li_->shrinkToUses(&li_->getInterval(SrcReg));
- DoDelete = true;
- }
- if (!DoDelete) {
- // We need the instruction to adjust liveness, so make it a KILL.
- if (MI->isSubregToReg()) {
- MI->RemoveOperand(3);
- MI->RemoveOperand(1);
- }
- MI->setDesc(tii_->get(TargetOpcode::KILL));
- mii = llvm::next(mii);
- } else {
- li_->RemoveMachineInstrFromMaps(MI);
- mii = mbbi->erase(mii);
- ++numPeep;
- }
- continue;
- }
-
- // Now check if this is a remat'ed def instruction which is now dead.
- if (ReMatDefs.count(MI)) {
- bool isDead = true;
- for (unsigned i = 0, e = MI->getNumOperands(); i != e; ++i) {
- const MachineOperand &MO = MI->getOperand(i);
- if (!MO.isReg())
- continue;
- unsigned Reg = MO.getReg();
- if (!Reg)
- continue;
- if (TargetRegisterInfo::isVirtualRegister(Reg))
- DeadDefs.push_back(Reg);
- if (MO.isDead())
- continue;
- if (TargetRegisterInfo::isPhysicalRegister(Reg) ||
- !mri_->use_nodbg_empty(Reg)) {
- isDead = false;
- break;
- }
- }
- if (isDead) {
- while (!DeadDefs.empty()) {
- unsigned DeadDef = DeadDefs.back();
- DeadDefs.pop_back();
- RemoveDeadDef(li_->getInterval(DeadDef), MI);
- }
- li_->RemoveMachineInstrFromMaps(mii);
- mii = mbbi->erase(mii);
- continue;
- } else
- DeadDefs.clear();
- }
-
- ++mii;
-
- // Check for now unnecessary kill flags.
- if (li_->isNotInMIMap(MI)) continue;
- SlotIndex DefIdx = li_->getInstructionIndex(MI).getDefIndex();
- for (unsigned i = 0, e = MI->getNumOperands(); i != e; ++i) {
- MachineOperand &MO = MI->getOperand(i);
- if (!MO.isReg() || !MO.isKill()) continue;
- unsigned reg = MO.getReg();
- if (!reg || !li_->hasInterval(reg)) continue;
- if (!li_->getInterval(reg).killedAt(DefIdx)) {
- MO.setIsKill(false);
- continue;
- }
- // When leaving a kill flag on a physreg, check if any subregs should
- // remain alive.
- if (!TargetRegisterInfo::isPhysicalRegister(reg))
- continue;
- for (const unsigned *SR = tri_->getSubRegisters(reg);
- unsigned S = *SR; ++SR)
- if (li_->hasInterval(S) && li_->getInterval(S).liveAt(DefIdx))
- MI->addRegisterDefined(S, tri_);
- }
- }
- }
-
- DEBUG(dump());
- DEBUG(ldv_->dump());
- if (VerifyCoalescing)
- mf_->verify(this, "After register coalescing");
- return true;
-}
-
-/// print - Implement the dump method.
-void SimpleRegisterCoalescing::print(raw_ostream &O, const Module* m) const {
- li_->print(O, m);
-}
-
-RegisterCoalescer* llvm::createSimpleRegisterCoalescer() {
- return new SimpleRegisterCoalescing();
-}
-
-// Make sure that anything that uses RegisterCoalescer pulls in this file...
-DEFINING_FILE_FOR(SimpleRegisterCoalescing)
diff --git a/contrib/llvm/lib/CodeGen/SjLjEHPrepare.cpp b/contrib/llvm/lib/CodeGen/SjLjEHPrepare.cpp
index 92970e4..65a33da 100644
--- a/contrib/llvm/lib/CodeGen/SjLjEHPrepare.cpp
+++ b/contrib/llvm/lib/CodeGen/SjLjEHPrepare.cpp
@@ -87,12 +87,10 @@ FunctionPass *llvm::createSjLjEHPass(const TargetLowering *TLI) {
bool SjLjEHPass::doInitialization(Module &M) {
// Build the function context structure.
// builtin_setjmp uses a five word jbuf
- const Type *VoidPtrTy =
- Type::getInt8PtrTy(M.getContext());
- const Type *Int32Ty = Type::getInt32Ty(M.getContext());
+ Type *VoidPtrTy = Type::getInt8PtrTy(M.getContext());
+ Type *Int32Ty = Type::getInt32Ty(M.getContext());
FunctionContextTy =
- StructType::get(M.getContext(),
- VoidPtrTy, // __prev
+ StructType::get(VoidPtrTy, // __prev
Int32Ty, // call_site
ArrayType::get(Int32Ty, 4), // __data
VoidPtrTy, // __personality
diff --git a/contrib/llvm/lib/CodeGen/SplitKit.cpp b/contrib/llvm/lib/CodeGen/SplitKit.cpp
index bf27cc8..761cab7 100644
--- a/contrib/llvm/lib/CodeGen/SplitKit.cpp
+++ b/contrib/llvm/lib/CodeGen/SplitKit.cpp
@@ -76,12 +76,14 @@ SlotIndex SplitAnalysis::computeLastSplitPoint(unsigned Num) {
return LSP.first;
// There may not be a call instruction (?) in which case we ignore LPad.
LSP.second = LSP.first;
- for (MachineBasicBlock::const_iterator I = FirstTerm, E = MBB->begin();
- I != E; --I)
+ for (MachineBasicBlock::const_iterator I = MBB->end(), E = MBB->begin();
+ I != E;) {
+ --I;
if (I->getDesc().isCall()) {
LSP.second = LIS.getInstructionIndex(I);
break;
}
+ }
}
// If CurLI is live into a landing pad successor, move the last split point
@@ -122,7 +124,7 @@ void SplitAnalysis::analyzeUses() {
// Compute per-live block info.
if (!calcLiveBlockInfo()) {
// FIXME: calcLiveBlockInfo found inconsistencies in the live range.
- // I am looking at you, SimpleRegisterCoalescing!
+ // I am looking at you, RegisterCoalescer!
DidRepairRange = true;
++NumRepairs;
DEBUG(dbgs() << "*** Fixing inconsistent live interval! ***\n");
@@ -165,7 +167,7 @@ bool SplitAnalysis::calcLiveBlockInfo() {
tie(Start, Stop) = LIS.getSlotIndexes()->getMBBRange(BI.MBB);
// If the block contains no uses, the range must be live through. At one
- // point, SimpleRegisterCoalescing could create dangling ranges that ended
+ // point, RegisterCoalescer could create dangling ranges that ended
// mid-block.
if (UseI == UseE || *UseI >= Stop) {
++NumThroughBlocks;
@@ -634,6 +636,7 @@ unsigned SplitEditor::openIntv() {
void SplitEditor::selectIntv(unsigned Idx) {
assert(Idx != 0 && "Cannot select the complement interval");
assert(Idx < Edit->size() && "Can only select previously opened interval");
+ DEBUG(dbgs() << " selectIntv " << OpenIdx << " -> " << Idx << '\n');
OpenIdx = Idx;
}
@@ -654,6 +657,24 @@ SlotIndex SplitEditor::enterIntvBefore(SlotIndex Idx) {
return VNI->def;
}
+SlotIndex SplitEditor::enterIntvAfter(SlotIndex Idx) {
+ assert(OpenIdx && "openIntv not called before enterIntvAfter");
+ DEBUG(dbgs() << " enterIntvAfter " << Idx);
+ Idx = Idx.getBoundaryIndex();
+ VNInfo *ParentVNI = Edit->getParent().getVNInfoAt(Idx);
+ if (!ParentVNI) {
+ DEBUG(dbgs() << ": not live\n");
+ return Idx;
+ }
+ DEBUG(dbgs() << ": valno " << ParentVNI->id << '\n');
+ MachineInstr *MI = LIS.getInstructionFromIndex(Idx);
+ assert(MI && "enterIntvAfter called with invalid index");
+
+ VNInfo *VNI = defFromParent(OpenIdx, ParentVNI, Idx, *MI->getParent(),
+ llvm::next(MachineBasicBlock::iterator(MI)));
+ return VNI->def;
+}
+
SlotIndex SplitEditor::enterIntvAtEnd(MachineBasicBlock &MBB) {
assert(OpenIdx && "openIntv not called before enterIntvAtEnd");
SlotIndex End = LIS.getMBBEndIdx(&MBB);
@@ -1005,12 +1026,6 @@ void SplitEditor::finish(SmallVectorImpl<unsigned> *LRMap) {
markComplexMapped(i, ParentVNI);
}
-#ifndef NDEBUG
- // Every new interval must have a def by now, otherwise the split is bogus.
- for (LiveRangeEdit::iterator I = Edit->begin(), E = Edit->end(); I != E; ++I)
- assert((*I)->hasAtLeastOneValue() && "Split interval has no value");
-#endif
-
// Transfer the simply mapped values, check if any are skipped.
bool Skipped = transferValues();
if (Skipped)
@@ -1109,3 +1124,263 @@ void SplitEditor::splitSingleBlocks(const SplitAnalysis::BlockPtrSet &Blocks) {
}
finish();
}
+
+
+//===----------------------------------------------------------------------===//
+// Global Live Range Splitting Support
+//===----------------------------------------------------------------------===//
+
+// These methods support a method of global live range splitting that uses a
+// global algorithm to decide intervals for CFG edges. They will insert split
+// points and color intervals in basic blocks while avoiding interference.
+//
+// Note that splitSingleBlock is also useful for blocks where both CFG edges
+// are on the stack.
+
+void SplitEditor::splitLiveThroughBlock(unsigned MBBNum,
+ unsigned IntvIn, SlotIndex LeaveBefore,
+ unsigned IntvOut, SlotIndex EnterAfter){
+ SlotIndex Start, Stop;
+ tie(Start, Stop) = LIS.getSlotIndexes()->getMBBRange(MBBNum);
+
+ DEBUG(dbgs() << "BB#" << MBBNum << " [" << Start << ';' << Stop
+ << ") intf " << LeaveBefore << '-' << EnterAfter
+ << ", live-through " << IntvIn << " -> " << IntvOut);
+
+ assert((IntvIn || IntvOut) && "Use splitSingleBlock for isolated blocks");
+
+ if (!IntvOut) {
+ DEBUG(dbgs() << ", spill on entry.\n");
+ //
+ // <<<<<<<<< Possible LeaveBefore interference.
+ // |-----------| Live through.
+ // -____________ Spill on entry.
+ //
+ selectIntv(IntvIn);
+ MachineBasicBlock *MBB = VRM.getMachineFunction().getBlockNumbered(MBBNum);
+ SlotIndex Idx = leaveIntvAtTop(*MBB);
+ assert((!LeaveBefore || Idx <= LeaveBefore) && "Interference");
+ (void)Idx;
+ return;
+ }
+
+ if (!IntvIn) {
+ DEBUG(dbgs() << ", reload on exit.\n");
+ //
+ // >>>>>>> Possible EnterAfter interference.
+ // |-----------| Live through.
+ // ___________-- Reload on exit.
+ //
+ selectIntv(IntvOut);
+ MachineBasicBlock *MBB = VRM.getMachineFunction().getBlockNumbered(MBBNum);
+ SlotIndex Idx = enterIntvAtEnd(*MBB);
+ assert((!EnterAfter || Idx >= EnterAfter) && "Interference");
+ (void)Idx;
+ return;
+ }
+
+ if (IntvIn == IntvOut && !LeaveBefore && !EnterAfter) {
+ DEBUG(dbgs() << ", straight through.\n");
+ //
+ // |-----------| Live through.
+ // ------------- Straight through, same intv, no interference.
+ //
+ selectIntv(IntvOut);
+ useIntv(Start, Stop);
+ return;
+ }
+
+ // We cannot legally insert splits after LSP.
+ SlotIndex LSP = SA.getLastSplitPoint(MBBNum);
+
+ if (IntvIn != IntvOut && (!LeaveBefore || !EnterAfter ||
+ LeaveBefore.getBaseIndex() > EnterAfter.getBoundaryIndex())) {
+ DEBUG(dbgs() << ", switch avoiding interference.\n");
+ //
+ // >>>> <<<< Non-overlapping EnterAfter/LeaveBefore interference.
+ // |-----------| Live through.
+ // ------======= Switch intervals between interference.
+ //
+ SlotIndex Cut = (LeaveBefore && LeaveBefore < LSP) ? LeaveBefore : LSP;
+ selectIntv(IntvOut);
+ SlotIndex Idx = enterIntvBefore(Cut);
+ useIntv(Idx, Stop);
+ selectIntv(IntvIn);
+ useIntv(Start, Idx);
+ assert((!LeaveBefore || Idx <= LeaveBefore) && "Interference");
+ assert((!EnterAfter || Idx >= EnterAfter) && "Interference");
+ return;
+ }
+
+ DEBUG(dbgs() << ", create local intv for interference.\n");
+ //
+ // >>><><><><<<< Overlapping EnterAfter/LeaveBefore interference.
+ // |-----------| Live through.
+ // ==---------== Switch intervals before/after interference.
+ //
+ assert(LeaveBefore <= EnterAfter && "Missed case");
+
+ selectIntv(IntvOut);
+ SlotIndex Idx = enterIntvAfter(EnterAfter);
+ useIntv(Idx, Stop);
+ assert((!EnterAfter || Idx >= EnterAfter) && "Interference");
+
+ selectIntv(IntvIn);
+ Idx = leaveIntvBefore(LeaveBefore);
+ useIntv(Start, Idx);
+ assert((!LeaveBefore || Idx <= LeaveBefore) && "Interference");
+}
+
+
+void SplitEditor::splitRegInBlock(const SplitAnalysis::BlockInfo &BI,
+ unsigned IntvIn, SlotIndex LeaveBefore) {
+ SlotIndex Start, Stop;
+ tie(Start, Stop) = LIS.getSlotIndexes()->getMBBRange(BI.MBB);
+
+ DEBUG(dbgs() << "BB#" << BI.MBB->getNumber() << " [" << Start << ';' << Stop
+ << "), uses " << BI.FirstUse << '-' << BI.LastUse
+ << ", reg-in " << IntvIn << ", leave before " << LeaveBefore
+ << (BI.LiveOut ? ", stack-out" : ", killed in block"));
+
+ assert(IntvIn && "Must have register in");
+ assert(BI.LiveIn && "Must be live-in");
+ assert((!LeaveBefore || LeaveBefore > Start) && "Bad interference");
+
+ if (!BI.LiveOut && (!LeaveBefore || LeaveBefore >= BI.LastUse)) {
+ DEBUG(dbgs() << " before interference.\n");
+ //
+ // <<< Interference after kill.
+ // |---o---x | Killed in block.
+ // ========= Use IntvIn everywhere.
+ //
+ selectIntv(IntvIn);
+ useIntv(Start, BI.LastUse);
+ return;
+ }
+
+ SlotIndex LSP = SA.getLastSplitPoint(BI.MBB->getNumber());
+
+ if (!LeaveBefore || LeaveBefore > BI.LastUse.getBoundaryIndex()) {
+ //
+ // <<< Possible interference after last use.
+ // |---o---o---| Live-out on stack.
+ // =========____ Leave IntvIn after last use.
+ //
+ // < Interference after last use.
+ // |---o---o--o| Live-out on stack, late last use.
+ // ============ Copy to stack after LSP, overlap IntvIn.
+ // \_____ Stack interval is live-out.
+ //
+ if (BI.LastUse < LSP) {
+ DEBUG(dbgs() << ", spill after last use before interference.\n");
+ selectIntv(IntvIn);
+ SlotIndex Idx = leaveIntvAfter(BI.LastUse);
+ useIntv(Start, Idx);
+ assert((!LeaveBefore || Idx <= LeaveBefore) && "Interference");
+ } else {
+ DEBUG(dbgs() << ", spill before last split point.\n");
+ selectIntv(IntvIn);
+ SlotIndex Idx = leaveIntvBefore(LSP);
+ overlapIntv(Idx, BI.LastUse);
+ useIntv(Start, Idx);
+ assert((!LeaveBefore || Idx <= LeaveBefore) && "Interference");
+ }
+ return;
+ }
+
+ // The interference is overlapping somewhere we wanted to use IntvIn. That
+ // means we need to create a local interval that can be allocated a
+ // different register.
+ unsigned LocalIntv = openIntv();
+ (void)LocalIntv;
+ DEBUG(dbgs() << ", creating local interval " << LocalIntv << ".\n");
+
+ if (!BI.LiveOut || BI.LastUse < LSP) {
+ //
+ // <<<<<<< Interference overlapping uses.
+ // |---o---o---| Live-out on stack.
+ // =====----____ Leave IntvIn before interference, then spill.
+ //
+ SlotIndex To = leaveIntvAfter(BI.LastUse);
+ SlotIndex From = enterIntvBefore(LeaveBefore);
+ useIntv(From, To);
+ selectIntv(IntvIn);
+ useIntv(Start, From);
+ assert((!LeaveBefore || From <= LeaveBefore) && "Interference");
+ return;
+ }
+
+ // <<<<<<< Interference overlapping uses.
+ // |---o---o--o| Live-out on stack, late last use.
+ // =====------- Copy to stack before LSP, overlap LocalIntv.
+ // \_____ Stack interval is live-out.
+ //
+ SlotIndex To = leaveIntvBefore(LSP);
+ overlapIntv(To, BI.LastUse);
+ SlotIndex From = enterIntvBefore(std::min(To, LeaveBefore));
+ useIntv(From, To);
+ selectIntv(IntvIn);
+ useIntv(Start, From);
+ assert((!LeaveBefore || From <= LeaveBefore) && "Interference");
+}
+
+void SplitEditor::splitRegOutBlock(const SplitAnalysis::BlockInfo &BI,
+ unsigned IntvOut, SlotIndex EnterAfter) {
+ SlotIndex Start, Stop;
+ tie(Start, Stop) = LIS.getSlotIndexes()->getMBBRange(BI.MBB);
+
+ DEBUG(dbgs() << "BB#" << BI.MBB->getNumber() << " [" << Start << ';' << Stop
+ << "), uses " << BI.FirstUse << '-' << BI.LastUse
+ << ", reg-out " << IntvOut << ", enter after " << EnterAfter
+ << (BI.LiveIn ? ", stack-in" : ", defined in block"));
+
+ SlotIndex LSP = SA.getLastSplitPoint(BI.MBB->getNumber());
+
+ assert(IntvOut && "Must have register out");
+ assert(BI.LiveOut && "Must be live-out");
+ assert((!EnterAfter || EnterAfter < LSP) && "Bad interference");
+
+ if (!BI.LiveIn && (!EnterAfter || EnterAfter <= BI.FirstUse)) {
+ DEBUG(dbgs() << " after interference.\n");
+ //
+ // >>>> Interference before def.
+ // | o---o---| Defined in block.
+ // ========= Use IntvOut everywhere.
+ //
+ selectIntv(IntvOut);
+ useIntv(BI.FirstUse, Stop);
+ return;
+ }
+
+ if (!EnterAfter || EnterAfter < BI.FirstUse.getBaseIndex()) {
+ DEBUG(dbgs() << ", reload after interference.\n");
+ //
+ // >>>> Interference before def.
+ // |---o---o---| Live-through, stack-in.
+ // ____========= Enter IntvOut before first use.
+ //
+ selectIntv(IntvOut);
+ SlotIndex Idx = enterIntvBefore(std::min(LSP, BI.FirstUse));
+ useIntv(Idx, Stop);
+ assert((!EnterAfter || Idx >= EnterAfter) && "Interference");
+ return;
+ }
+
+ // The interference is overlapping somewhere we wanted to use IntvOut. That
+ // means we need to create a local interval that can be allocated a
+ // different register.
+ DEBUG(dbgs() << ", interference overlaps uses.\n");
+ //
+ // >>>>>>> Interference overlapping uses.
+ // |---o---o---| Live-through, stack-in.
+ // ____---====== Create local interval for interference range.
+ //
+ selectIntv(IntvOut);
+ SlotIndex Idx = enterIntvAfter(EnterAfter);
+ useIntv(Idx, Stop);
+ assert((!EnterAfter || Idx >= EnterAfter) && "Interference");
+
+ openIntv();
+ SlotIndex From = enterIntvBefore(std::min(Idx, BI.FirstUse));
+ useIntv(From, Idx);
+}
diff --git a/contrib/llvm/lib/CodeGen/SplitKit.h b/contrib/llvm/lib/CodeGen/SplitKit.h
index 7174c0b..7948b72 100644
--- a/contrib/llvm/lib/CodeGen/SplitKit.h
+++ b/contrib/llvm/lib/CodeGen/SplitKit.h
@@ -81,6 +81,12 @@ public:
bool LiveThrough; ///< Live in whole block (Templ 5. above).
bool LiveIn; ///< Current reg is live in.
bool LiveOut; ///< Current reg is live out.
+
+ /// isOneInstr - Returns true when this BlockInfo describes a single
+ /// instruction.
+ bool isOneInstr() const {
+ return SlotIndex::isSameInstr(FirstUse, LastUse);
+ }
};
private:
@@ -360,6 +366,10 @@ public:
/// Return the beginning of the new live range.
SlotIndex enterIntvBefore(SlotIndex Idx);
+ /// enterIntvAfter - Enter the open interval after the instruction at Idx.
+ /// Return the beginning of the new live range.
+ SlotIndex enterIntvAfter(SlotIndex Idx);
+
/// enterIntvAtEnd - Enter the open interval at the end of MBB.
/// Use the open interval from he inserted copy to the MBB end.
/// Return the beginning of the new live range.
@@ -416,6 +426,42 @@ public:
/// splitSingleBlocks - Split CurLI into a separate live interval inside each
/// basic block in Blocks.
void splitSingleBlocks(const SplitAnalysis::BlockPtrSet &Blocks);
+
+ /// splitLiveThroughBlock - Split CurLI in the given block such that it
+ /// enters the block in IntvIn and leaves it in IntvOut. There may be uses in
+ /// the block, but they will be ignored when placing split points.
+ ///
+ /// @param MBBNum Block number.
+ /// @param IntvIn Interval index entering the block.
+ /// @param LeaveBefore When set, leave IntvIn before this point.
+ /// @param IntvOut Interval index leaving the block.
+ /// @param EnterAfter When set, enter IntvOut after this point.
+ void splitLiveThroughBlock(unsigned MBBNum,
+ unsigned IntvIn, SlotIndex LeaveBefore,
+ unsigned IntvOut, SlotIndex EnterAfter);
+
+ /// splitRegInBlock - Split CurLI in the given block such that it enters the
+ /// block in IntvIn and leaves it on the stack (or not at all). Split points
+ /// are placed in a way that avoids putting uses in the stack interval. This
+ /// may require creating a local interval when there is interference.
+ ///
+ /// @param BI Block descriptor.
+ /// @param IntvIn Interval index entering the block. Not 0.
+ /// @param LeaveBefore When set, leave IntvIn before this point.
+ void splitRegInBlock(const SplitAnalysis::BlockInfo &BI,
+ unsigned IntvIn, SlotIndex LeaveBefore);
+
+ /// splitRegOutBlock - Split CurLI in the given block such that it enters the
+ /// block on the stack (or isn't live-in at all) and leaves it in IntvOut.
+ /// Split points are placed to avoid interference and such that the uses are
+ /// not in the stack interval. This may require creating a local interval
+ /// when there is interference.
+ ///
+ /// @param BI Block descriptor.
+ /// @param IntvOut Interval index leaving the block.
+ /// @param EnterAfter When set, enter IntvOut after this point.
+ void splitRegOutBlock(const SplitAnalysis::BlockInfo &BI,
+ unsigned IntvOut, SlotIndex EnterAfter);
};
}
diff --git a/contrib/llvm/lib/CodeGen/Splitter.cpp b/contrib/llvm/lib/CodeGen/Splitter.cpp
index 08aee82..ec75df4 100644
--- a/contrib/llvm/lib/CodeGen/Splitter.cpp
+++ b/contrib/llvm/lib/CodeGen/Splitter.cpp
@@ -11,7 +11,7 @@
#include "Splitter.h"
-#include "SimpleRegisterCoalescing.h"
+#include "RegisterCoalescer.h"
#include "llvm/Module.h"
#include "llvm/CodeGen/CalcSpillWeights.h"
#include "llvm/CodeGen/LiveIntervalAnalysis.h"
diff --git a/contrib/llvm/lib/CodeGen/StackProtector.cpp b/contrib/llvm/lib/CodeGen/StackProtector.cpp
index f0a44ab..d3cbd15 100644
--- a/contrib/llvm/lib/CodeGen/StackProtector.cpp
+++ b/contrib/llvm/lib/CodeGen/StackProtector.cpp
@@ -186,7 +186,7 @@ bool StackProtector::InsertStackProtectors() {
Value *Args[] = { LI, AI };
CallInst::
Create(Intrinsic::getDeclaration(M, Intrinsic::stackprotector),
- &Args[0], array_endof(Args), "", InsPt);
+ Args, "", InsPt);
// Create the basic block to jump to when the guard check fails.
FailBB = CreateFailBB();
diff --git a/contrib/llvm/lib/CodeGen/StackSlotColoring.cpp b/contrib/llvm/lib/CodeGen/StackSlotColoring.cpp
index 01f5b56..57cbe1ba 100644
--- a/contrib/llvm/lib/CodeGen/StackSlotColoring.cpp
+++ b/contrib/llvm/lib/CodeGen/StackSlotColoring.cpp
@@ -504,7 +504,7 @@ bool StackSlotColoring::PropagateBackward(MachineBasicBlock::iterator MII,
bool FoundDef = false; // Not counting 2address def.
Uses.clear();
- const TargetInstrDesc &TID = MII->getDesc();
+ const MCInstrDesc &MCID = MII->getDesc();
for (unsigned i = 0, e = MII->getNumOperands(); i != e; ++i) {
MachineOperand &MO = MII->getOperand(i);
if (!MO.isReg())
@@ -521,7 +521,7 @@ bool StackSlotColoring::PropagateBackward(MachineBasicBlock::iterator MII,
if (MO.getSubReg() || MII->isSubregToReg())
return false;
- const TargetRegisterClass *RC = TID.OpInfo[i].getRegClass(TRI);
+ const TargetRegisterClass *RC = TII->getRegClass(MCID, i, TRI);
if (RC && !RC->contains(NewReg))
return false;
@@ -566,7 +566,7 @@ bool StackSlotColoring::PropagateForward(MachineBasicBlock::iterator MII,
SmallVector<MachineOperand*, 4> Uses;
while (++MII != MBB->end()) {
bool FoundKill = false;
- const TargetInstrDesc &TID = MII->getDesc();
+ const MCInstrDesc &MCID = MII->getDesc();
for (unsigned i = 0, e = MII->getNumOperands(); i != e; ++i) {
MachineOperand &MO = MII->getOperand(i);
if (!MO.isReg())
@@ -583,7 +583,7 @@ bool StackSlotColoring::PropagateForward(MachineBasicBlock::iterator MII,
if (MO.getSubReg())
return false;
- const TargetRegisterClass *RC = TID.OpInfo[i].getRegClass(TRI);
+ const TargetRegisterClass *RC = TII->getRegClass(MCID, i, TRI);
if (RC && !RC->contains(NewReg))
return false;
if (MO.isKill())
diff --git a/contrib/llvm/lib/CodeGen/TailDuplication.cpp b/contrib/llvm/lib/CodeGen/TailDuplication.cpp
index e8eab8f..6b801cb 100644
--- a/contrib/llvm/lib/CodeGen/TailDuplication.cpp
+++ b/contrib/llvm/lib/CodeGen/TailDuplication.cpp
@@ -95,10 +95,22 @@ namespace {
SmallSetVector<MachineBasicBlock*, 8> &Succs);
bool TailDuplicateBlocks(MachineFunction &MF);
bool shouldTailDuplicate(const MachineFunction &MF,
- MachineBasicBlock &TailBB);
- bool TailDuplicate(MachineBasicBlock *TailBB, MachineFunction &MF,
+ bool IsSimple, MachineBasicBlock &TailBB);
+ bool isSimpleBB(MachineBasicBlock *TailBB);
+ bool canCompletelyDuplicateBB(MachineBasicBlock &BB);
+ bool duplicateSimpleBB(MachineBasicBlock *TailBB,
+ SmallVector<MachineBasicBlock*, 8> &TDBBs,
+ const DenseSet<unsigned> &RegsUsedByPhi,
+ SmallVector<MachineInstr*, 16> &Copies);
+ bool TailDuplicate(MachineBasicBlock *TailBB,
+ bool IsSimple,
+ MachineFunction &MF,
SmallVector<MachineBasicBlock*, 8> &TDBBs,
SmallVector<MachineInstr*, 16> &Copies);
+ bool TailDuplicateAndUpdate(MachineBasicBlock *MBB,
+ bool IsSimple,
+ MachineFunction &MF);
+
void RemoveDeadBlock(MachineBasicBlock *MBB);
};
@@ -169,6 +181,109 @@ static void VerifyPHIs(MachineFunction &MF, bool CheckExtra) {
}
}
+/// TailDuplicateAndUpdate - Tail duplicate the block and cleanup.
+bool
+TailDuplicatePass::TailDuplicateAndUpdate(MachineBasicBlock *MBB,
+ bool IsSimple,
+ MachineFunction &MF) {
+ // Save the successors list.
+ SmallSetVector<MachineBasicBlock*, 8> Succs(MBB->succ_begin(),
+ MBB->succ_end());
+
+ SmallVector<MachineBasicBlock*, 8> TDBBs;
+ SmallVector<MachineInstr*, 16> Copies;
+ if (!TailDuplicate(MBB, IsSimple, MF, TDBBs, Copies))
+ return false;
+
+ ++NumTails;
+
+ SmallVector<MachineInstr*, 8> NewPHIs;
+ MachineSSAUpdater SSAUpdate(MF, &NewPHIs);
+
+ // TailBB's immediate successors are now successors of those predecessors
+ // which duplicated TailBB. Add the predecessors as sources to the PHI
+ // instructions.
+ bool isDead = MBB->pred_empty() && !MBB->hasAddressTaken();
+ if (PreRegAlloc)
+ UpdateSuccessorsPHIs(MBB, isDead, TDBBs, Succs);
+
+ // If it is dead, remove it.
+ if (isDead) {
+ NumInstrDups -= MBB->size();
+ RemoveDeadBlock(MBB);
+ ++NumDeadBlocks;
+ }
+
+ // Update SSA form.
+ if (!SSAUpdateVRs.empty()) {
+ for (unsigned i = 0, e = SSAUpdateVRs.size(); i != e; ++i) {
+ unsigned VReg = SSAUpdateVRs[i];
+ SSAUpdate.Initialize(VReg);
+
+ // If the original definition is still around, add it as an available
+ // value.
+ MachineInstr *DefMI = MRI->getVRegDef(VReg);
+ MachineBasicBlock *DefBB = 0;
+ if (DefMI) {
+ DefBB = DefMI->getParent();
+ SSAUpdate.AddAvailableValue(DefBB, VReg);
+ }
+
+ // Add the new vregs as available values.
+ DenseMap<unsigned, AvailableValsTy>::iterator LI =
+ SSAUpdateVals.find(VReg);
+ for (unsigned j = 0, ee = LI->second.size(); j != ee; ++j) {
+ MachineBasicBlock *SrcBB = LI->second[j].first;
+ unsigned SrcReg = LI->second[j].second;
+ SSAUpdate.AddAvailableValue(SrcBB, SrcReg);
+ }
+
+ // Rewrite uses that are outside of the original def's block.
+ MachineRegisterInfo::use_iterator UI = MRI->use_begin(VReg);
+ while (UI != MRI->use_end()) {
+ MachineOperand &UseMO = UI.getOperand();
+ MachineInstr *UseMI = &*UI;
+ ++UI;
+ if (UseMI->isDebugValue()) {
+ // SSAUpdate can replace the use with an undef. That creates
+ // a debug instruction that is a kill.
+ // FIXME: Should it SSAUpdate job to delete debug instructions
+ // instead of replacing the use with undef?
+ UseMI->eraseFromParent();
+ continue;
+ }
+ if (UseMI->getParent() == DefBB && !UseMI->isPHI())
+ continue;
+ SSAUpdate.RewriteUse(UseMO);
+ }
+ }
+
+ SSAUpdateVRs.clear();
+ SSAUpdateVals.clear();
+ }
+
+ // Eliminate some of the copies inserted by tail duplication to maintain
+ // SSA form.
+ for (unsigned i = 0, e = Copies.size(); i != e; ++i) {
+ MachineInstr *Copy = Copies[i];
+ if (!Copy->isCopy())
+ continue;
+ unsigned Dst = Copy->getOperand(0).getReg();
+ unsigned Src = Copy->getOperand(1).getReg();
+ MachineRegisterInfo::use_iterator UI = MRI->use_begin(Src);
+ if (++UI == MRI->use_end()) {
+ // Copy is the only use. Do trivial copy propagation here.
+ MRI->replaceRegWith(Dst, Src);
+ Copy->eraseFromParent();
+ }
+ }
+
+ if (NewPHIs.size())
+ NumAddedPHIs += NewPHIs.size();
+
+ return true;
+}
+
/// TailDuplicateBlocks - Look for small blocks that are unconditionally
/// branched to and do not fall through. Tail-duplicate their instructions
/// into their predecessors to eliminate (dynamic) branches.
@@ -180,100 +295,22 @@ bool TailDuplicatePass::TailDuplicateBlocks(MachineFunction &MF) {
VerifyPHIs(MF, true);
}
- SmallVector<MachineInstr*, 8> NewPHIs;
- MachineSSAUpdater SSAUpdate(MF, &NewPHIs);
-
for (MachineFunction::iterator I = ++MF.begin(), E = MF.end(); I != E; ) {
MachineBasicBlock *MBB = I++;
if (NumTails == TailDupLimit)
break;
- // Save the successors list.
- SmallSetVector<MachineBasicBlock*, 8> Succs(MBB->succ_begin(),
- MBB->succ_end());
-
- SmallVector<MachineBasicBlock*, 8> TDBBs;
- SmallVector<MachineInstr*, 16> Copies;
- if (TailDuplicate(MBB, MF, TDBBs, Copies)) {
- ++NumTails;
-
- // TailBB's immediate successors are now successors of those predecessors
- // which duplicated TailBB. Add the predecessors as sources to the PHI
- // instructions.
- bool isDead = MBB->pred_empty();
- if (PreRegAlloc)
- UpdateSuccessorsPHIs(MBB, isDead, TDBBs, Succs);
-
- // If it is dead, remove it.
- if (isDead) {
- NumInstrDups -= MBB->size();
- RemoveDeadBlock(MBB);
- ++NumDeadBlocks;
- }
-
- // Update SSA form.
- if (!SSAUpdateVRs.empty()) {
- for (unsigned i = 0, e = SSAUpdateVRs.size(); i != e; ++i) {
- unsigned VReg = SSAUpdateVRs[i];
- SSAUpdate.Initialize(VReg);
-
- // If the original definition is still around, add it as an available
- // value.
- MachineInstr *DefMI = MRI->getVRegDef(VReg);
- MachineBasicBlock *DefBB = 0;
- if (DefMI) {
- DefBB = DefMI->getParent();
- SSAUpdate.AddAvailableValue(DefBB, VReg);
- }
-
- // Add the new vregs as available values.
- DenseMap<unsigned, AvailableValsTy>::iterator LI =
- SSAUpdateVals.find(VReg);
- for (unsigned j = 0, ee = LI->second.size(); j != ee; ++j) {
- MachineBasicBlock *SrcBB = LI->second[j].first;
- unsigned SrcReg = LI->second[j].second;
- SSAUpdate.AddAvailableValue(SrcBB, SrcReg);
- }
-
- // Rewrite uses that are outside of the original def's block.
- MachineRegisterInfo::use_iterator UI = MRI->use_begin(VReg);
- while (UI != MRI->use_end()) {
- MachineOperand &UseMO = UI.getOperand();
- MachineInstr *UseMI = &*UI;
- ++UI;
- if (UseMI->getParent() == DefBB && !UseMI->isPHI())
- continue;
- SSAUpdate.RewriteUse(UseMO);
- }
- }
+ bool IsSimple = isSimpleBB(MBB);
- SSAUpdateVRs.clear();
- SSAUpdateVals.clear();
- }
-
- // Eliminate some of the copies inserted by tail duplication to maintain
- // SSA form.
- for (unsigned i = 0, e = Copies.size(); i != e; ++i) {
- MachineInstr *Copy = Copies[i];
- if (!Copy->isCopy())
- continue;
- unsigned Dst = Copy->getOperand(0).getReg();
- unsigned Src = Copy->getOperand(1).getReg();
- MachineRegisterInfo::use_iterator UI = MRI->use_begin(Src);
- if (++UI == MRI->use_end()) {
- // Copy is the only use. Do trivial copy propagation here.
- MRI->replaceRegWith(Dst, Src);
- Copy->eraseFromParent();
- }
- }
+ if (!shouldTailDuplicate(MF, IsSimple, *MBB))
+ continue;
- if (PreRegAlloc && TailDupVerify)
- VerifyPHIs(MF, false);
- MadeChange = true;
- }
+ MadeChange |= TailDuplicateAndUpdate(MBB, IsSimple, MF);
}
- NumAddedPHIs += NewPHIs.size();
+
+ if (PreRegAlloc && TailDupVerify)
+ VerifyPHIs(MF, false);
return MadeChange;
}
@@ -283,6 +320,8 @@ static bool isDefLiveOut(unsigned Reg, MachineBasicBlock *BB,
for (MachineRegisterInfo::use_iterator UI = MRI->use_begin(Reg),
UE = MRI->use_end(); UI != UE; ++UI) {
MachineInstr *UseMI = &*UI;
+ if (UseMI->isDebugValue())
+ continue;
if (UseMI->getParent() != BB)
return true;
}
@@ -485,11 +524,16 @@ TailDuplicatePass::UpdateSuccessorsPHIs(MachineBasicBlock *FromBB, bool isDead,
/// shouldTailDuplicate - Determine if it is profitable to duplicate this block.
bool
TailDuplicatePass::shouldTailDuplicate(const MachineFunction &MF,
+ bool IsSimple,
MachineBasicBlock &TailBB) {
// Only duplicate blocks that end with unconditional branches.
if (TailBB.canFallThrough())
return false;
+ // Don't try to tail-duplicate single-block loops.
+ if (TailBB.isSuccessor(&TailBB))
+ return false;
+
// Set the limit on the cost to duplicate. When optimizing for size,
// duplicate only one, because one branch instruction can be eliminated to
// compensate for the duplication.
@@ -500,73 +544,208 @@ TailDuplicatePass::shouldTailDuplicate(const MachineFunction &MF,
else
MaxDuplicateCount = TailDuplicateSize;
- if (PreRegAlloc) {
- if (TailBB.empty())
- return false;
- const TargetInstrDesc &TID = TailBB.back().getDesc();
- // Pre-regalloc tail duplication hurts compile time and doesn't help
- // much except for indirect branches.
- if (!TID.isIndirectBranch())
- return false;
- // If the target has hardware branch prediction that can handle indirect
- // branches, duplicating them can often make them predictable when there
- // are common paths through the code. The limit needs to be high enough
- // to allow undoing the effects of tail merging and other optimizations
- // that rearrange the predecessors of the indirect branch.
- MaxDuplicateCount = 20;
- }
+ // If the target has hardware branch prediction that can handle indirect
+ // branches, duplicating them can often make them predictable when there
+ // are common paths through the code. The limit needs to be high enough
+ // to allow undoing the effects of tail merging and other optimizations
+ // that rearrange the predecessors of the indirect branch.
- // Don't try to tail-duplicate single-block loops.
- if (TailBB.isSuccessor(&TailBB))
- return false;
+ bool HasIndirectbr = false;
+ if (!TailBB.empty())
+ HasIndirectbr = TailBB.back().getDesc().isIndirectBranch();
+
+ if (HasIndirectbr && PreRegAlloc)
+ MaxDuplicateCount = 20;
// Check the instructions in the block to determine whether tail-duplication
// is invalid or unlikely to be profitable.
unsigned InstrCount = 0;
- bool HasCall = false;
for (MachineBasicBlock::const_iterator I = TailBB.begin(); I != TailBB.end();
++I) {
// Non-duplicable things shouldn't be tail-duplicated.
- if (I->getDesc().isNotDuplicable()) return false;
+ if (I->getDesc().isNotDuplicable())
+ return false;
+
// Do not duplicate 'return' instructions if this is a pre-regalloc run.
// A return may expand into a lot more instructions (e.g. reload of callee
// saved registers) after PEI.
- if (PreRegAlloc && I->getDesc().isReturn()) return false;
- // Don't duplicate more than the threshold.
- if (InstrCount == MaxDuplicateCount) return false;
- // Remember if we saw a call.
- if (I->getDesc().isCall()) HasCall = true;
+ if (PreRegAlloc && I->getDesc().isReturn())
+ return false;
+
+ // Avoid duplicating calls before register allocation. Calls presents a
+ // barrier to register allocation so duplicating them may end up increasing
+ // spills.
+ if (PreRegAlloc && I->getDesc().isCall())
+ return false;
+
if (!I->isPHI() && !I->isDebugValue())
InstrCount += 1;
+
+ if (InstrCount > MaxDuplicateCount)
+ return false;
}
- // Don't tail-duplicate calls before register allocation. Calls presents a
- // barrier to register allocation so duplicating them may end up increasing
- // spills.
- if (InstrCount > 1 && (PreRegAlloc && HasCall))
+
+ if (HasIndirectbr && PreRegAlloc)
+ return true;
+
+ if (IsSimple)
+ return true;
+
+ if (!PreRegAlloc)
+ return true;
+
+ return canCompletelyDuplicateBB(TailBB);
+}
+
+/// isSimpleBB - True if this BB has only one unconditional jump.
+bool
+TailDuplicatePass::isSimpleBB(MachineBasicBlock *TailBB) {
+ if (TailBB->succ_size() != 1)
+ return false;
+ if (TailBB->pred_empty())
return false;
+ MachineBasicBlock::iterator I = TailBB->begin();
+ MachineBasicBlock::iterator E = TailBB->end();
+ while (I != E && I->isDebugValue())
+ ++I;
+ if (I == E)
+ return true;
+ return I->getDesc().isUnconditionalBranch();
+}
+
+static bool
+bothUsedInPHI(const MachineBasicBlock &A,
+ SmallPtrSet<MachineBasicBlock*, 8> SuccsB) {
+ for (MachineBasicBlock::const_succ_iterator SI = A.succ_begin(),
+ SE = A.succ_end(); SI != SE; ++SI) {
+ MachineBasicBlock *BB = *SI;
+ if (SuccsB.count(BB) && !BB->empty() && BB->begin()->isPHI())
+ return true;
+ }
+
+ return false;
+}
+
+bool
+TailDuplicatePass::canCompletelyDuplicateBB(MachineBasicBlock &BB) {
+ SmallPtrSet<MachineBasicBlock*, 8> Succs(BB.succ_begin(), BB.succ_end());
+
+ for (MachineBasicBlock::pred_iterator PI = BB.pred_begin(),
+ PE = BB.pred_end(); PI != PE; ++PI) {
+ MachineBasicBlock *PredBB = *PI;
+
+ if (PredBB->succ_size() > 1)
+ return false;
+
+ MachineBasicBlock *PredTBB = NULL, *PredFBB = NULL;
+ SmallVector<MachineOperand, 4> PredCond;
+ if (TII->AnalyzeBranch(*PredBB, PredTBB, PredFBB, PredCond, true))
+ return false;
+ if (!PredCond.empty())
+ return false;
+ }
return true;
}
+bool
+TailDuplicatePass::duplicateSimpleBB(MachineBasicBlock *TailBB,
+ SmallVector<MachineBasicBlock*, 8> &TDBBs,
+ const DenseSet<unsigned> &UsedByPhi,
+ SmallVector<MachineInstr*, 16> &Copies) {
+ SmallPtrSet<MachineBasicBlock*, 8> Succs(TailBB->succ_begin(),
+ TailBB->succ_end());
+ SmallVector<MachineBasicBlock*, 8> Preds(TailBB->pred_begin(),
+ TailBB->pred_end());
+ bool Changed = false;
+ for (SmallSetVector<MachineBasicBlock *, 8>::iterator PI = Preds.begin(),
+ PE = Preds.end(); PI != PE; ++PI) {
+ MachineBasicBlock *PredBB = *PI;
+
+ if (PredBB->getLandingPadSuccessor())
+ continue;
+
+ if (bothUsedInPHI(*PredBB, Succs))
+ continue;
+
+ MachineBasicBlock *PredTBB = NULL, *PredFBB = NULL;
+ SmallVector<MachineOperand, 4> PredCond;
+ if (TII->AnalyzeBranch(*PredBB, PredTBB, PredFBB, PredCond, true))
+ continue;
+
+ Changed = true;
+ DEBUG(dbgs() << "\nTail-duplicating into PredBB: " << *PredBB
+ << "From simple Succ: " << *TailBB);
+
+ MachineBasicBlock *NewTarget = *TailBB->succ_begin();
+ MachineBasicBlock *NextBB = llvm::next(MachineFunction::iterator(PredBB));
+
+ // Make PredFBB explicit.
+ if (PredCond.empty())
+ PredFBB = PredTBB;
+
+ // Make fall through explicit.
+ if (!PredTBB)
+ PredTBB = NextBB;
+ if (!PredFBB)
+ PredFBB = NextBB;
+
+ // Redirect
+ if (PredFBB == TailBB)
+ PredFBB = NewTarget;
+ if (PredTBB == TailBB)
+ PredTBB = NewTarget;
+
+ // Make the branch unconditional if possible
+ if (PredTBB == PredFBB) {
+ PredCond.clear();
+ PredFBB = NULL;
+ }
+
+ // Avoid adding fall through branches.
+ if (PredFBB == NextBB)
+ PredFBB = NULL;
+ if (PredTBB == NextBB && PredFBB == NULL)
+ PredTBB = NULL;
+
+ TII->RemoveBranch(*PredBB);
+
+ if (PredTBB)
+ TII->InsertBranch(*PredBB, PredTBB, PredFBB, PredCond, DebugLoc());
+
+ PredBB->removeSuccessor(TailBB);
+ unsigned NumSuccessors = PredBB->succ_size();
+ assert(NumSuccessors <= 1);
+ if (NumSuccessors == 0 || *PredBB->succ_begin() != NewTarget)
+ PredBB->addSuccessor(NewTarget);
+
+ TDBBs.push_back(PredBB);
+ }
+ return Changed;
+}
+
/// TailDuplicate - If it is profitable, duplicate TailBB's contents in each
/// of its predecessors.
bool
-TailDuplicatePass::TailDuplicate(MachineBasicBlock *TailBB, MachineFunction &MF,
+TailDuplicatePass::TailDuplicate(MachineBasicBlock *TailBB,
+ bool IsSimple,
+ MachineFunction &MF,
SmallVector<MachineBasicBlock*, 8> &TDBBs,
SmallVector<MachineInstr*, 16> &Copies) {
- if (!shouldTailDuplicate(MF, *TailBB))
- return false;
-
DEBUG(dbgs() << "\n*** Tail-duplicating BB#" << TailBB->getNumber() << '\n');
+ DenseSet<unsigned> UsedByPhi;
+ getRegsUsedByPHIs(*TailBB, &UsedByPhi);
+
+ if (IsSimple)
+ return duplicateSimpleBB(TailBB, TDBBs, UsedByPhi, Copies);
+
// Iterate through all the unique predecessors and tail-duplicate this
// block into them, if possible. Copying the list ahead of time also
// avoids trouble with the predecessor list reallocating.
bool Changed = false;
SmallSetVector<MachineBasicBlock*, 8> Preds(TailBB->pred_begin(),
TailBB->pred_end());
- DenseSet<unsigned> UsedByPhi;
- getRegsUsedByPHIs(*TailBB, &UsedByPhi);
for (SmallSetVector<MachineBasicBlock *, 8>::iterator PI = Preds.begin(),
PE = Preds.end(); PI != PE; ++PI) {
MachineBasicBlock *PredBB = *PI;
@@ -618,6 +797,10 @@ TailDuplicatePass::TailDuplicate(MachineBasicBlock *TailBB, MachineFunction &MF,
TII->get(TargetOpcode::COPY),
CopyInfos[i].first).addReg(CopyInfos[i].second));
}
+
+ // Simplify
+ TII->AnalyzeBranch(*PredBB, PredTBB, PredFBB, PredCond, true);
+
NumInstrDups += TailBB->size() - 1; // subtract one for removed branch
// Update the CFG.
diff --git a/contrib/llvm/lib/CodeGen/TargetInstrInfoImpl.cpp b/contrib/llvm/lib/CodeGen/TargetInstrInfoImpl.cpp
index 34e2b33..86e71d8 100644
--- a/contrib/llvm/lib/CodeGen/TargetInstrInfoImpl.cpp
+++ b/contrib/llvm/lib/CodeGen/TargetInstrInfoImpl.cpp
@@ -59,8 +59,8 @@ TargetInstrInfoImpl::ReplaceTailWithBranchTo(MachineBasicBlock::iterator Tail,
// the two operands returned by findCommutedOpIndices.
MachineInstr *TargetInstrInfoImpl::commuteInstruction(MachineInstr *MI,
bool NewMI) const {
- const TargetInstrDesc &TID = MI->getDesc();
- bool HasDef = TID.getNumDefs();
+ const MCInstrDesc &MCID = MI->getDesc();
+ bool HasDef = MCID.getNumDefs();
if (HasDef && !MI->getOperand(0).isReg())
// No idea how to commute this instruction. Target should implement its own.
return 0;
@@ -81,7 +81,7 @@ MachineInstr *TargetInstrInfoImpl::commuteInstruction(MachineInstr *MI,
bool ChangeReg0 = false;
if (HasDef && MI->getOperand(0).getReg() == Reg1) {
// Must be two address instruction!
- assert(MI->getDesc().getOperandConstraint(0, TOI::TIED_TO) &&
+ assert(MI->getDesc().getOperandConstraint(0, MCOI::TIED_TO) &&
"Expecting a two-address instruction!");
Reg2IsKill = false;
ChangeReg0 = true;
@@ -119,12 +119,12 @@ MachineInstr *TargetInstrInfoImpl::commuteInstruction(MachineInstr *MI,
bool TargetInstrInfoImpl::findCommutedOpIndices(MachineInstr *MI,
unsigned &SrcOpIdx1,
unsigned &SrcOpIdx2) const {
- const TargetInstrDesc &TID = MI->getDesc();
- if (!TID.isCommutable())
+ const MCInstrDesc &MCID = MI->getDesc();
+ if (!MCID.isCommutable())
return false;
// This assumes v0 = op v1, v2 and commuting would swap v1 and v2. If this
// is not true, then the target must implement this.
- SrcOpIdx1 = TID.getNumDefs();
+ SrcOpIdx1 = MCID.getNumDefs();
SrcOpIdx2 = SrcOpIdx1 + 1;
if (!MI->getOperand(SrcOpIdx1).isReg() ||
!MI->getOperand(SrcOpIdx2).isReg())
@@ -137,12 +137,12 @@ bool TargetInstrInfoImpl::findCommutedOpIndices(MachineInstr *MI,
bool TargetInstrInfoImpl::PredicateInstruction(MachineInstr *MI,
const SmallVectorImpl<MachineOperand> &Pred) const {
bool MadeChange = false;
- const TargetInstrDesc &TID = MI->getDesc();
- if (!TID.isPredicable())
+ const MCInstrDesc &MCID = MI->getDesc();
+ if (!MCID.isPredicable())
return false;
for (unsigned j = 0, i = 0, e = MI->getNumOperands(); i != e; ++i) {
- if (TID.OpInfo[i].isPredicate()) {
+ if (MCID.OpInfo[i].isPredicate()) {
MachineOperand &MO = MI->getOperand(i);
if (MO.isReg()) {
MO.setReg(Pred[j].getReg());
@@ -332,10 +332,10 @@ isReallyTriviallyReMaterializableGeneric(const MachineInstr *MI,
MF.getFrameInfo()->isImmutableObjectIndex(FrameIdx))
return true;
- const TargetInstrDesc &TID = MI->getDesc();
+ const MCInstrDesc &MCID = MI->getDesc();
// Avoid instructions obviously unsafe for remat.
- if (TID.isNotDuplicable() || TID.mayStore() ||
+ if (MCID.isNotDuplicable() || MCID.mayStore() ||
MI->hasUnmodeledSideEffects())
return false;
@@ -345,7 +345,7 @@ isReallyTriviallyReMaterializableGeneric(const MachineInstr *MI,
return false;
// Avoid instructions which load from potentially varying memory.
- if (TID.mayLoad() && !MI->isInvariantLoad(AA))
+ if (MCID.mayLoad() && !MI->isInvariantLoad(AA))
return false;
// If any of the registers accessed are non-constant, conservatively assume
diff --git a/contrib/llvm/lib/CodeGen/TargetLoweringObjectFileImpl.cpp b/contrib/llvm/lib/CodeGen/TargetLoweringObjectFileImpl.cpp
index cdac42d..a3c5620 100644
--- a/contrib/llvm/lib/CodeGen/TargetLoweringObjectFileImpl.cpp
+++ b/contrib/llvm/lib/CodeGen/TargetLoweringObjectFileImpl.cpp
@@ -43,6 +43,19 @@ using namespace dwarf;
// ELF
//===----------------------------------------------------------------------===//
+TargetLoweringObjectFileELF::TargetLoweringObjectFileELF()
+ : TargetLoweringObjectFile(),
+ TLSDataSection(0),
+ TLSBSSSection(0),
+ DataRelSection(0),
+ DataRelLocalSection(0),
+ DataRelROSection(0),
+ DataRelROLocalSection(0),
+ MergeableConst4Section(0),
+ MergeableConst8Section(0),
+ MergeableConst16Section(0) {
+}
+
void TargetLoweringObjectFileELF::Initialize(MCContext &Ctx,
const TargetMachine &TM) {
TargetLoweringObjectFile::Initialize(Ctx, TM);
@@ -189,8 +202,8 @@ TargetLoweringObjectFileELF::getCFIPersonalitySymbol(const GlobalValue *GV,
return Mang->getSymbol(GV);
break;
case dwarf::DW_EH_PE_pcrel: {
- Twine FullName = StringRef("DW.ref.") + Mang->getSymbol(GV)->getName();
- return getContext().GetOrCreateSymbol(FullName);
+ return getContext().GetOrCreateSymbol(StringRef("DW.ref.") +
+ Mang->getSymbol(GV)->getName());
break;
}
}
@@ -199,13 +212,13 @@ TargetLoweringObjectFileELF::getCFIPersonalitySymbol(const GlobalValue *GV,
void TargetLoweringObjectFileELF::emitPersonalityValue(MCStreamer &Streamer,
const TargetMachine &TM,
const MCSymbol *Sym) const {
- Twine FullName = StringRef("DW.ref.") + Sym->getName();
- MCSymbol *Label = getContext().GetOrCreateSymbol(FullName);
+ SmallString<64> NameData("DW.ref.");
+ NameData += Sym->getName();
+ MCSymbol *Label = getContext().GetOrCreateSymbol(NameData);
Streamer.EmitSymbolAttribute(Label, MCSA_Hidden);
Streamer.EmitSymbolAttribute(Label, MCSA_Weak);
- Twine SectionName = StringRef(".data.") + Label->getName();
- SmallString<64> NameData;
- SectionName.toVector(NameData);
+ StringRef Prefix = ".data.";
+ NameData.insert(NameData.begin(), Prefix.begin(), Prefix.end());
unsigned Flags = ELF::SHF_ALLOC | ELF::SHF_WRITE | ELF::SHF_GROUP;
const MCSection *Sec = getContext().getELFSection(NameData,
ELF::SHT_PROGBITS,
@@ -480,6 +493,27 @@ getExprForDwarfGlobalReference(const GlobalValue *GV, Mangler *Mang,
// MachO
//===----------------------------------------------------------------------===//
+TargetLoweringObjectFileMachO::TargetLoweringObjectFileMachO()
+ : TargetLoweringObjectFile(),
+ TLSDataSection(0),
+ TLSBSSSection(0),
+ TLSTLVSection(0),
+ TLSThreadInitSection(0),
+ CStringSection(0),
+ UStringSection(0),
+ TextCoalSection(0),
+ ConstTextCoalSection(0),
+ ConstDataSection(0),
+ DataCoalSection(0),
+ DataCommonSection(0),
+ DataBSSSection(0),
+ FourByteConstantSection(0),
+ EightByteConstantSection(0),
+ SixteenByteConstantSection(0),
+ LazySymbolPointerSection(0),
+ NonLazySymbolPointerSection(0) {
+}
+
void TargetLoweringObjectFileMachO::Initialize(MCContext &Ctx,
const TargetMachine &TM) {
IsFunctionEHFrameSymbolPrivate = false;
@@ -605,6 +639,13 @@ void TargetLoweringObjectFileMachO::Initialize(MCContext &Ctx,
// Exception Handling.
LSDASection = getContext().getMachOSection("__TEXT", "__gcc_except_tab", 0,
SectionKind::getReadOnlyWithRel());
+
+ if (T.isMacOSX() && !T.isMacOSXVersionLT(10, 6))
+ CompactUnwindSection =
+ getContext().getMachOSection("__LD", "__compact_unwind",
+ MCSectionMachO::S_ATTR_DEBUG,
+ SectionKind::getReadOnly());
+
// Debug Information.
DwarfAbbrevSection =
getContext().getMachOSection("__DWARF", "__debug_abbrev",
@@ -884,6 +925,13 @@ unsigned TargetLoweringObjectFileMachO::getTTypeEncoding() const {
// COFF
//===----------------------------------------------------------------------===//
+TargetLoweringObjectFileCOFF::TargetLoweringObjectFileCOFF()
+ : TargetLoweringObjectFile(),
+ DrectveSection(0),
+ PDataSection(0),
+ XDataSection(0) {
+}
+
void TargetLoweringObjectFileCOFF::Initialize(MCContext &Ctx,
const TargetMachine &TM) {
TargetLoweringObjectFile::Initialize(Ctx, TM);
diff --git a/contrib/llvm/lib/CodeGen/TwoAddressInstructionPass.cpp b/contrib/llvm/lib/CodeGen/TwoAddressInstructionPass.cpp
index f54d879..6d6244e 100644
--- a/contrib/llvm/lib/CodeGen/TwoAddressInstructionPass.cpp
+++ b/contrib/llvm/lib/CodeGen/TwoAddressInstructionPass.cpp
@@ -280,8 +280,8 @@ bool TwoAddressInstructionPass::Sink3AddrInstruction(MachineBasicBlock *MBB,
/// isTwoAddrUse - Return true if the specified MI is using the specified
/// register as a two-address operand.
static bool isTwoAddrUse(MachineInstr *UseMI, unsigned Reg) {
- const TargetInstrDesc &TID = UseMI->getDesc();
- for (unsigned i = 0, e = TID.getNumOperands(); i != e; ++i) {
+ const MCInstrDesc &MCID = UseMI->getDesc();
+ for (unsigned i = 0, e = MCID.getNumOperands(); i != e; ++i) {
MachineOperand &MO = UseMI->getOperand(i);
if (MO.isReg() && MO.getReg() == Reg &&
(MO.isDef() || UseMI->isRegTiedToDefOperand(i)))
@@ -443,8 +443,9 @@ static bool isKilled(MachineInstr &MI, unsigned Reg,
/// isTwoAddrUse - Return true if the specified MI uses the specified register
/// as a two-address use. If so, return the destination register by reference.
static bool isTwoAddrUse(MachineInstr &MI, unsigned Reg, unsigned &DstReg) {
- const TargetInstrDesc &TID = MI.getDesc();
- unsigned NumOps = MI.isInlineAsm() ? MI.getNumOperands():TID.getNumOperands();
+ const MCInstrDesc &MCID = MI.getDesc();
+ unsigned NumOps = MI.isInlineAsm()
+ ? MI.getNumOperands() : MCID.getNumOperands();
for (unsigned i = 0; i != NumOps; ++i) {
const MachineOperand &MO = MI.getOperand(i);
if (!MO.isReg() || !MO.isUse() || MO.getReg() != Reg)
@@ -761,10 +762,10 @@ void TwoAddressInstructionPass::ProcessCopy(MachineInstr *MI,
static bool isSafeToDelete(MachineInstr *MI,
const TargetInstrInfo *TII,
SmallVector<unsigned, 4> &Kills) {
- const TargetInstrDesc &TID = MI->getDesc();
- if (TID.mayStore() || TID.isCall())
+ const MCInstrDesc &MCID = MI->getDesc();
+ if (MCID.mayStore() || MCID.isCall())
return false;
- if (TID.isTerminator() || MI->hasUnmodeledSideEffects())
+ if (MCID.isTerminator() || MI->hasUnmodeledSideEffects())
return false;
for (unsigned i = 0, e = MI->getNumOperands(); i != e; ++i) {
@@ -854,7 +855,7 @@ TryInstructionTransform(MachineBasicBlock::iterator &mi,
MachineFunction::iterator &mbbi,
unsigned SrcIdx, unsigned DstIdx, unsigned Dist,
SmallPtrSet<MachineInstr*, 8> &Processed) {
- const TargetInstrDesc &TID = mi->getDesc();
+ const MCInstrDesc &MCID = mi->getDesc();
unsigned regA = mi->getOperand(DstIdx).getReg();
unsigned regB = mi->getOperand(SrcIdx).getReg();
@@ -876,7 +877,7 @@ TryInstructionTransform(MachineBasicBlock::iterator &mi,
unsigned regCIdx = ~0U;
bool TryCommute = false;
bool AggressiveCommute = false;
- if (TID.isCommutable() && mi->getNumOperands() >= 3 &&
+ if (MCID.isCommutable() && mi->getNumOperands() >= 3 &&
TII->findCommutedOpIndices(mi, SrcOp1, SrcOp2)) {
if (SrcIdx == SrcOp1)
regCIdx = SrcOp2;
@@ -907,7 +908,7 @@ TryInstructionTransform(MachineBasicBlock::iterator &mi,
if (TargetRegisterInfo::isVirtualRegister(regA))
ScanUses(regA, &*mbbi, Processed);
- if (TID.isConvertibleTo3Addr()) {
+ if (MCID.isConvertibleTo3Addr()) {
// This instruction is potentially convertible to a true
// three-address instruction. Check if it is profitable.
if (!regBKilled || isProfitableToConv3Addr(regA, regB)) {
@@ -927,7 +928,7 @@ TryInstructionTransform(MachineBasicBlock::iterator &mi,
// movq (%rax), %rcx
// addq %rdx, %rcx
// because it's preferable to schedule a load than a register copy.
- if (TID.mayLoad() && !regBKilled) {
+ if (MCID.mayLoad() && !regBKilled) {
// Determine if a load can be unfolded.
unsigned LoadRegIndex;
unsigned NewOpc =
@@ -936,14 +937,14 @@ TryInstructionTransform(MachineBasicBlock::iterator &mi,
/*UnfoldStore=*/false,
&LoadRegIndex);
if (NewOpc != 0) {
- const TargetInstrDesc &UnfoldTID = TII->get(NewOpc);
- if (UnfoldTID.getNumDefs() == 1) {
+ const MCInstrDesc &UnfoldMCID = TII->get(NewOpc);
+ if (UnfoldMCID.getNumDefs() == 1) {
MachineFunction &MF = *mbbi->getParent();
// Unfold the load.
DEBUG(dbgs() << "2addr: UNFOLDING: " << *mi);
const TargetRegisterClass *RC =
- UnfoldTID.OpInfo[LoadRegIndex].getRegClass(TRI);
+ TII->getRegClass(UnfoldMCID, LoadRegIndex, TRI);
unsigned Reg = MRI->createVirtualRegister(RC);
SmallVector<MachineInstr *, 2> NewMIs;
if (!TII->unfoldMemoryOperand(MF, mi, Reg,
@@ -1067,7 +1068,7 @@ bool TwoAddressInstructionPass::runOnMachineFunction(MachineFunction &MF) {
if (mi->isRegSequence())
RegSequences.push_back(&*mi);
- const TargetInstrDesc &TID = mi->getDesc();
+ const MCInstrDesc &MCID = mi->getDesc();
bool FirstTied = true;
DistanceMap.insert(std::make_pair(mi, ++Dist));
@@ -1077,7 +1078,7 @@ bool TwoAddressInstructionPass::runOnMachineFunction(MachineFunction &MF) {
// First scan through all the tied register uses in this instruction
// and record a list of pairs of tied operands for each register.
unsigned NumOps = mi->isInlineAsm()
- ? mi->getNumOperands() : TID.getNumOperands();
+ ? mi->getNumOperands() : MCID.getNumOperands();
for (unsigned SrcIdx = 0; SrcIdx < NumOps; ++SrcIdx) {
unsigned DstIdx = 0;
if (!mi->isRegTiedToDefOperand(SrcIdx, &DstIdx))
@@ -1095,12 +1096,7 @@ bool TwoAddressInstructionPass::runOnMachineFunction(MachineFunction &MF) {
"two address instruction invalid");
unsigned regB = mi->getOperand(SrcIdx).getReg();
- TiedOperandMap::iterator OI = TiedOperands.find(regB);
- if (OI == TiedOperands.end()) {
- SmallVector<std::pair<unsigned, unsigned>, 4> TiedPair;
- OI = TiedOperands.insert(std::make_pair(regB, TiedPair)).first;
- }
- OI->second.push_back(std::make_pair(SrcIdx, DstIdx));
+ TiedOperands[regB].push_back(std::make_pair(SrcIdx, DstIdx));
}
// Now iterate over the information collected above.
diff --git a/contrib/llvm/lib/CodeGen/VirtRegMap.h b/contrib/llvm/lib/CodeGen/VirtRegMap.h
index ba50f4e..03abff3 100644
--- a/contrib/llvm/lib/CodeGen/VirtRegMap.h
+++ b/contrib/llvm/lib/CodeGen/VirtRegMap.h
@@ -208,6 +208,11 @@ namespace llvm {
/// @brief returns the register allocation preference.
unsigned getRegAllocPref(unsigned virtReg);
+ /// @brief returns true if VirtReg is assigned to its preferred physreg.
+ bool hasPreferredPhys(unsigned VirtReg) {
+ return getPhys(VirtReg) == getRegAllocPref(VirtReg);
+ }
+
/// @brief records virtReg is a split live interval from SReg.
void setIsSplitFromReg(unsigned virtReg, unsigned SReg) {
Virt2SplitMap[virtReg] = SReg;
diff --git a/contrib/llvm/lib/CodeGen/VirtRegRewriter.cpp b/contrib/llvm/lib/CodeGen/VirtRegRewriter.cpp
index 1850658..a5ec797 100644
--- a/contrib/llvm/lib/CodeGen/VirtRegRewriter.cpp
+++ b/contrib/llvm/lib/CodeGen/VirtRegRewriter.cpp
@@ -679,8 +679,8 @@ static void ReMaterialize(MachineBasicBlock &MBB,
VirtRegMap &VRM) {
MachineInstr *ReMatDefMI = VRM.getReMaterializedMI(Reg);
#ifndef NDEBUG
- const TargetInstrDesc &TID = ReMatDefMI->getDesc();
- assert(TID.getNumDefs() == 1 &&
+ const MCInstrDesc &MCID = ReMatDefMI->getDesc();
+ assert(MCID.getNumDefs() == 1 &&
"Don't know how to remat instructions that define > 1 values!");
#endif
TII->reMaterialize(MBB, MII, DestReg, 0, ReMatDefMI, *TRI);
@@ -1483,11 +1483,11 @@ OptimizeByUnfold(MachineBasicBlock::iterator &MII,
/// where SrcReg is r1 and it is tied to r0. Return true if after
/// commuting this instruction it will be r0 = op r2, r1.
static bool CommuteChangesDestination(MachineInstr *DefMI,
- const TargetInstrDesc &TID,
+ const MCInstrDesc &MCID,
unsigned SrcReg,
const TargetInstrInfo *TII,
unsigned &DstIdx) {
- if (TID.getNumDefs() != 1 && TID.getNumOperands() != 3)
+ if (MCID.getNumDefs() != 1 && MCID.getNumOperands() != 3)
return false;
if (!DefMI->getOperand(1).isReg() ||
DefMI->getOperand(1).getReg() != SrcReg)
@@ -1527,11 +1527,11 @@ CommuteToFoldReload(MachineBasicBlock::iterator &MII,
MachineInstr &MI = *MII;
MachineBasicBlock::iterator DefMII = prior(MII);
MachineInstr *DefMI = DefMII;
- const TargetInstrDesc &TID = DefMI->getDesc();
+ const MCInstrDesc &MCID = DefMI->getDesc();
unsigned NewDstIdx;
if (DefMII != MBB->begin() &&
- TID.isCommutable() &&
- CommuteChangesDestination(DefMI, TID, SrcReg, TII, NewDstIdx)) {
+ MCID.isCommutable() &&
+ CommuteChangesDestination(DefMI, MCID, SrcReg, TII, NewDstIdx)) {
MachineOperand &NewDstMO = DefMI->getOperand(NewDstIdx);
unsigned NewReg = NewDstMO.getReg();
if (!NewDstMO.isKill() || TRI->regsOverlap(NewReg, SrcReg))
@@ -1658,9 +1658,9 @@ SpillRegToStackSlot(MachineBasicBlock::iterator &MII,
/// isSafeToDelete - Return true if this instruction doesn't produce any side
/// effect and all of its defs are dead.
static bool isSafeToDelete(MachineInstr &MI) {
- const TargetInstrDesc &TID = MI.getDesc();
- if (TID.mayLoad() || TID.mayStore() || TID.isTerminator() ||
- TID.isCall() || TID.isBarrier() || TID.isReturn() ||
+ const MCInstrDesc &MCID = MI.getDesc();
+ if (MCID.mayLoad() || MCID.mayStore() || MCID.isTerminator() ||
+ MCID.isCall() || MCID.isBarrier() || MCID.isReturn() ||
MI.isLabel() || MI.isDebugValue() ||
MI.hasUnmodeledSideEffects())
return false;
diff --git a/contrib/llvm/lib/ExecutionEngine/Interpreter/ExternalFunctions.cpp b/contrib/llvm/lib/ExecutionEngine/Interpreter/ExternalFunctions.cpp
index 062256a..f7e2a4d 100644
--- a/contrib/llvm/lib/ExecutionEngine/Interpreter/ExternalFunctions.cpp
+++ b/contrib/llvm/lib/ExecutionEngine/Interpreter/ExternalFunctions.cpp
@@ -78,7 +78,6 @@ static char getTypeID(const Type *Ty) {
case Type::FunctionTyID:return 'M';
case Type::StructTyID: return 'T';
case Type::ArrayTyID: return 'A';
- case Type::OpaqueTyID: return 'O';
default: return 'U';
}
}
@@ -282,10 +281,10 @@ GenericValue Interpreter::callExternalFunction(Function *F,
if (F->getName() == "__main")
errs() << "Tried to execute an unknown external function: "
- << F->getType()->getDescription() << " __main\n";
+ << *F->getType() << " __main\n";
else
report_fatal_error("Tried to execute an unknown external function: " +
- F->getType()->getDescription() + " " +F->getName());
+ F->getName());
#ifndef USE_LIBFFI
errs() << "Recompiling LLVM with --enable-libffi might help.\n";
#endif
diff --git a/contrib/llvm/lib/ExecutionEngine/JIT/JIT.cpp b/contrib/llvm/lib/ExecutionEngine/JIT/JIT.cpp
index 8fceaf2..445d2d0 100644
--- a/contrib/llvm/lib/ExecutionEngine/JIT/JIT.cpp
+++ b/contrib/llvm/lib/ExecutionEngine/JIT/JIT.cpp
@@ -533,8 +533,7 @@ GenericValue JIT::runFunction(Function *F,
Args.push_back(C);
}
- CallInst *TheCall = CallInst::Create(F, Args.begin(), Args.end(),
- "", StubBB);
+ CallInst *TheCall = CallInst::Create(F, Args, "", StubBB);
TheCall->setCallingConv(F->getCallingConv());
TheCall->setTailCall();
if (!TheCall->getType()->isVoidTy())
diff --git a/contrib/llvm/lib/ExecutionEngine/RuntimeDyld/RuntimeDyld.cpp b/contrib/llvm/lib/ExecutionEngine/RuntimeDyld/RuntimeDyld.cpp
index eda4cbb..33dd705 100644
--- a/contrib/llvm/lib/ExecutionEngine/RuntimeDyld/RuntimeDyld.cpp
+++ b/contrib/llvm/lib/ExecutionEngine/RuntimeDyld/RuntimeDyld.cpp
@@ -1,4 +1,4 @@
-//===-- RuntimeDyld.h - Run-time dynamic linker for MC-JIT ------*- C++ -*-===//
+//===-- RuntimeDyld.cpp - Run-time dynamic linker for MC-JIT ------*- C++ -*-===//
//
// The LLVM Compiler Infrastructure
//
@@ -12,118 +12,15 @@
//===----------------------------------------------------------------------===//
#define DEBUG_TYPE "dyld"
-#include "llvm/ADT/OwningPtr.h"
-#include "llvm/ADT/SmallVector.h"
-#include "llvm/ADT/StringMap.h"
-#include "llvm/ADT/StringRef.h"
-#include "llvm/ADT/STLExtras.h"
-#include "llvm/ADT/Twine.h"
-#include "llvm/ExecutionEngine/RuntimeDyld.h"
-#include "llvm/Object/MachOObject.h"
-#include "llvm/Support/Debug.h"
-#include "llvm/Support/ErrorHandling.h"
-#include "llvm/Support/Format.h"
-#include "llvm/Support/Memory.h"
-#include "llvm/Support/MemoryBuffer.h"
-#include "llvm/Support/system_error.h"
-#include "llvm/Support/raw_ostream.h"
+#include "RuntimeDyldImpl.h"
using namespace llvm;
using namespace llvm::object;
// Empty out-of-line virtual destructor as the key function.
RTDyldMemoryManager::~RTDyldMemoryManager() {}
+RuntimeDyldImpl::~RuntimeDyldImpl() {}
namespace llvm {
-class RuntimeDyldImpl {
- unsigned CPUType;
- unsigned CPUSubtype;
-
- // The MemoryManager to load objects into.
- RTDyldMemoryManager *MemMgr;
-
- // FIXME: This all assumes we're dealing with external symbols for anything
- // explicitly referenced. I.e., we can index by name and things
- // will work out. In practice, this may not be the case, so we
- // should find a way to effectively generalize.
-
- // For each function, we have a MemoryBlock of it's instruction data.
- StringMap<sys::MemoryBlock> Functions;
-
- // Master symbol table. As modules are loaded and external symbols are
- // resolved, their addresses are stored here.
- StringMap<uint8_t*> SymbolTable;
-
- // For each symbol, keep a list of relocations based on it. Anytime
- // its address is reassigned (the JIT re-compiled the function, e.g.),
- // the relocations get re-resolved.
- struct RelocationEntry {
- std::string Target; // Object this relocation is contained in.
- uint64_t Offset; // Offset into the object for the relocation.
- uint32_t Data; // Second word of the raw macho relocation entry.
- int64_t Addend; // Addend encoded in the instruction itself, if any.
- bool isResolved; // Has this relocation been resolved previously?
-
- RelocationEntry(StringRef t, uint64_t offset, uint32_t data, int64_t addend)
- : Target(t), Offset(offset), Data(data), Addend(addend),
- isResolved(false) {}
- };
- typedef SmallVector<RelocationEntry, 4> RelocationList;
- StringMap<RelocationList> Relocations;
-
- // FIXME: Also keep a map of all the relocations contained in an object. Use
- // this to dynamically answer whether all of the relocations in it have
- // been resolved or not.
-
- bool HasError;
- std::string ErrorStr;
-
- // Set the error state and record an error string.
- bool Error(const Twine &Msg) {
- ErrorStr = Msg.str();
- HasError = true;
- return true;
- }
-
- void extractFunction(StringRef Name, uint8_t *StartAddress,
- uint8_t *EndAddress);
- bool resolveRelocation(uint8_t *Address, uint8_t *Value, bool isPCRel,
- unsigned Type, unsigned Size);
- bool resolveX86_64Relocation(uintptr_t Address, uintptr_t Value, bool isPCRel,
- unsigned Type, unsigned Size);
- bool resolveARMRelocation(uintptr_t Address, uintptr_t Value, bool isPCRel,
- unsigned Type, unsigned Size);
-
- bool loadSegment32(const MachOObject *Obj,
- const MachOObject::LoadCommandInfo *SegmentLCI,
- const InMemoryStruct<macho::SymtabLoadCommand> &SymtabLC);
- bool loadSegment64(const MachOObject *Obj,
- const MachOObject::LoadCommandInfo *SegmentLCI,
- const InMemoryStruct<macho::SymtabLoadCommand> &SymtabLC);
-
-public:
- RuntimeDyldImpl(RTDyldMemoryManager *mm) : MemMgr(mm), HasError(false) {}
-
- bool loadObject(MemoryBuffer *InputBuffer);
-
- void *getSymbolAddress(StringRef Name) {
- // FIXME: Just look up as a function for now. Overly simple of course.
- // Work in progress.
- return SymbolTable.lookup(Name);
- }
-
- void resolveRelocations();
-
- void reassignSymbolAddress(StringRef Name, uint8_t *Addr);
-
- // Is the linker in an error state?
- bool hasError() { return HasError; }
-
- // Mark the error condition as handled and continue.
- void clearError() { HasError = false; }
-
- // Get the error message.
- StringRef getErrorString() { return ErrorStr; }
-};
void RuntimeDyldImpl::extractFunction(StringRef Name, uint8_t *StartAddress,
uint8_t *EndAddress) {
@@ -144,472 +41,6 @@ void RuntimeDyldImpl::extractFunction(StringRef Name, uint8_t *StartAddress,
DEBUG(dbgs() << " allocated to [" << Mem << ", " << Mem + Size << "]\n");
}
-bool RuntimeDyldImpl::
-resolveRelocation(uint8_t *Address, uint8_t *Value, bool isPCRel,
- unsigned Type, unsigned Size) {
- // This just dispatches to the proper target specific routine.
- switch (CPUType) {
- default: assert(0 && "Unsupported CPU type!");
- case mach::CTM_x86_64:
- return resolveX86_64Relocation((uintptr_t)Address, (uintptr_t)Value,
- isPCRel, Type, Size);
- case mach::CTM_ARM:
- return resolveARMRelocation((uintptr_t)Address, (uintptr_t)Value,
- isPCRel, Type, Size);
- }
- llvm_unreachable("");
-}
-
-bool RuntimeDyldImpl::
-resolveX86_64Relocation(uintptr_t Address, uintptr_t Value,
- bool isPCRel, unsigned Type,
- unsigned Size) {
- // If the relocation is PC-relative, the value to be encoded is the
- // pointer difference.
- if (isPCRel)
- // FIXME: It seems this value needs to be adjusted by 4 for an effective PC
- // address. Is that expected? Only for branches, perhaps?
- Value -= Address + 4;
-
- switch(Type) {
- default:
- llvm_unreachable("Invalid relocation type!");
- case macho::RIT_X86_64_Unsigned:
- case macho::RIT_X86_64_Branch: {
- // Mask in the target value a byte at a time (we don't have an alignment
- // guarantee for the target address, so this is safest).
- uint8_t *p = (uint8_t*)Address;
- for (unsigned i = 0; i < Size; ++i) {
- *p++ = (uint8_t)Value;
- Value >>= 8;
- }
- return false;
- }
- case macho::RIT_X86_64_Signed:
- case macho::RIT_X86_64_GOTLoad:
- case macho::RIT_X86_64_GOT:
- case macho::RIT_X86_64_Subtractor:
- case macho::RIT_X86_64_Signed1:
- case macho::RIT_X86_64_Signed2:
- case macho::RIT_X86_64_Signed4:
- case macho::RIT_X86_64_TLV:
- return Error("Relocation type not implemented yet!");
- }
- return false;
-}
-
-bool RuntimeDyldImpl::resolveARMRelocation(uintptr_t Address, uintptr_t Value,
- bool isPCRel, unsigned Type,
- unsigned Size) {
- // If the relocation is PC-relative, the value to be encoded is the
- // pointer difference.
- if (isPCRel) {
- Value -= Address;
- // ARM PCRel relocations have an effective-PC offset of two instructions
- // (four bytes in Thumb mode, 8 bytes in ARM mode).
- // FIXME: For now, assume ARM mode.
- Value -= 8;
- }
-
- switch(Type) {
- default:
- llvm_unreachable("Invalid relocation type!");
- case macho::RIT_Vanilla: {
- llvm_unreachable("Invalid relocation type!");
- // Mask in the target value a byte at a time (we don't have an alignment
- // guarantee for the target address, so this is safest).
- uint8_t *p = (uint8_t*)Address;
- for (unsigned i = 0; i < Size; ++i) {
- *p++ = (uint8_t)Value;
- Value >>= 8;
- }
- break;
- }
- case macho::RIT_ARM_Branch24Bit: {
- // Mask the value into the target address. We know instructions are
- // 32-bit aligned, so we can do it all at once.
- uint32_t *p = (uint32_t*)Address;
- // The low two bits of the value are not encoded.
- Value >>= 2;
- // Mask the value to 24 bits.
- Value &= 0xffffff;
- // FIXME: If the destination is a Thumb function (and the instruction
- // is a non-predicated BL instruction), we need to change it to a BLX
- // instruction instead.
-
- // Insert the value into the instruction.
- *p = (*p & ~0xffffff) | Value;
- break;
- }
- case macho::RIT_ARM_ThumbBranch22Bit:
- case macho::RIT_ARM_ThumbBranch32Bit:
- case macho::RIT_ARM_Half:
- case macho::RIT_ARM_HalfDifference:
- case macho::RIT_Pair:
- case macho::RIT_Difference:
- case macho::RIT_ARM_LocalDifference:
- case macho::RIT_ARM_PreboundLazyPointer:
- return Error("Relocation type not implemented yet!");
- }
- return false;
-}
-
-bool RuntimeDyldImpl::
-loadSegment32(const MachOObject *Obj,
- const MachOObject::LoadCommandInfo *SegmentLCI,
- const InMemoryStruct<macho::SymtabLoadCommand> &SymtabLC) {
- InMemoryStruct<macho::SegmentLoadCommand> SegmentLC;
- Obj->ReadSegmentLoadCommand(*SegmentLCI, SegmentLC);
- if (!SegmentLC)
- return Error("unable to load segment load command");
-
- for (unsigned SectNum = 0; SectNum != SegmentLC->NumSections; ++SectNum) {
- InMemoryStruct<macho::Section> Sect;
- Obj->ReadSection(*SegmentLCI, SectNum, Sect);
- if (!Sect)
- return Error("unable to load section: '" + Twine(SectNum) + "'");
-
- // FIXME: For the time being, we're only loading text segments.
- if (Sect->Flags != 0x80000400)
- continue;
-
- // Address and names of symbols in the section.
- typedef std::pair<uint64_t, StringRef> SymbolEntry;
- SmallVector<SymbolEntry, 64> Symbols;
- // Index of all the names, in this section or not. Used when we're
- // dealing with relocation entries.
- SmallVector<StringRef, 64> SymbolNames;
- for (unsigned i = 0; i != SymtabLC->NumSymbolTableEntries; ++i) {
- InMemoryStruct<macho::SymbolTableEntry> STE;
- Obj->ReadSymbolTableEntry(SymtabLC->SymbolTableOffset, i, STE);
- if (!STE)
- return Error("unable to read symbol: '" + Twine(i) + "'");
- if (STE->SectionIndex > SegmentLC->NumSections)
- return Error("invalid section index for symbol: '" + Twine(i) + "'");
- // Get the symbol name.
- StringRef Name = Obj->getStringAtIndex(STE->StringIndex);
- SymbolNames.push_back(Name);
-
- // Just skip symbols not defined in this section.
- if ((unsigned)STE->SectionIndex - 1 != SectNum)
- continue;
-
- // FIXME: Check the symbol type and flags.
- if (STE->Type != 0xF) // external, defined in this section.
- continue;
- // Flags == 0x8 marks a thumb function for ARM, which is fine as it
- // doesn't require any special handling here.
- if (STE->Flags != 0x0 && STE->Flags != 0x8)
- continue;
-
- // Remember the symbol.
- Symbols.push_back(SymbolEntry(STE->Value, Name));
-
- DEBUG(dbgs() << "Function sym: '" << Name << "' @ " <<
- (Sect->Address + STE->Value) << "\n");
- }
- // Sort the symbols by address, just in case they didn't come in that way.
- array_pod_sort(Symbols.begin(), Symbols.end());
-
- // If there weren't any functions (odd, but just in case...)
- if (!Symbols.size())
- continue;
-
- // Extract the function data.
- uint8_t *Base = (uint8_t*)Obj->getData(SegmentLC->FileOffset,
- SegmentLC->FileSize).data();
- for (unsigned i = 0, e = Symbols.size() - 1; i != e; ++i) {
- uint64_t StartOffset = Sect->Address + Symbols[i].first;
- uint64_t EndOffset = Symbols[i + 1].first - 1;
- DEBUG(dbgs() << "Extracting function: " << Symbols[i].second
- << " from [" << StartOffset << ", " << EndOffset << "]\n");
- extractFunction(Symbols[i].second, Base + StartOffset, Base + EndOffset);
- }
- // The last symbol we do after since the end address is calculated
- // differently because there is no next symbol to reference.
- uint64_t StartOffset = Symbols[Symbols.size() - 1].first;
- uint64_t EndOffset = Sect->Size - 1;
- DEBUG(dbgs() << "Extracting function: " << Symbols[Symbols.size()-1].second
- << " from [" << StartOffset << ", " << EndOffset << "]\n");
- extractFunction(Symbols[Symbols.size()-1].second,
- Base + StartOffset, Base + EndOffset);
-
- // Now extract the relocation information for each function and process it.
- for (unsigned j = 0; j != Sect->NumRelocationTableEntries; ++j) {
- InMemoryStruct<macho::RelocationEntry> RE;
- Obj->ReadRelocationEntry(Sect->RelocationTableOffset, j, RE);
- if (RE->Word0 & macho::RF_Scattered)
- return Error("NOT YET IMPLEMENTED: scattered relocations.");
- // Word0 of the relocation is the offset into the section where the
- // relocation should be applied. We need to translate that into an
- // offset into a function since that's our atom.
- uint32_t Offset = RE->Word0;
- // Look for the function containing the address. This is used for JIT
- // code, so the number of functions in section is almost always going
- // to be very small (usually just one), so until we have use cases
- // where that's not true, just use a trivial linear search.
- unsigned SymbolNum;
- unsigned NumSymbols = Symbols.size();
- assert(NumSymbols > 0 && Symbols[0].first <= Offset &&
- "No symbol containing relocation!");
- for (SymbolNum = 0; SymbolNum < NumSymbols - 1; ++SymbolNum)
- if (Symbols[SymbolNum + 1].first > Offset)
- break;
- // Adjust the offset to be relative to the symbol.
- Offset -= Symbols[SymbolNum].first;
- // Get the name of the symbol containing the relocation.
- StringRef TargetName = SymbolNames[SymbolNum];
-
- bool isExtern = (RE->Word1 >> 27) & 1;
- // Figure out the source symbol of the relocation. If isExtern is true,
- // this relocation references the symbol table, otherwise it references
- // a section in the same object, numbered from 1 through NumSections
- // (SectionBases is [0, NumSections-1]).
- // FIXME: Some targets (ARM) use internal relocations even for
- // externally visible symbols, if the definition is in the same
- // file as the reference. We need to convert those back to by-name
- // references. We can resolve the address based on the section
- // offset and see if we have a symbol at that address. If we do,
- // use that; otherwise, puke.
- if (!isExtern)
- return Error("Internal relocations not supported.");
- uint32_t SourceNum = RE->Word1 & 0xffffff; // 24-bit value
- StringRef SourceName = SymbolNames[SourceNum];
-
- // FIXME: Get the relocation addend from the target address.
-
- // Now store the relocation information. Associate it with the source
- // symbol.
- Relocations[SourceName].push_back(RelocationEntry(TargetName,
- Offset,
- RE->Word1,
- 0 /*Addend*/));
- DEBUG(dbgs() << "Relocation at '" << TargetName << "' + " << Offset
- << " from '" << SourceName << "(Word1: "
- << format("0x%x", RE->Word1) << ")\n");
- }
- }
- return false;
-}
-
-
-bool RuntimeDyldImpl::
-loadSegment64(const MachOObject *Obj,
- const MachOObject::LoadCommandInfo *SegmentLCI,
- const InMemoryStruct<macho::SymtabLoadCommand> &SymtabLC) {
- InMemoryStruct<macho::Segment64LoadCommand> Segment64LC;
- Obj->ReadSegment64LoadCommand(*SegmentLCI, Segment64LC);
- if (!Segment64LC)
- return Error("unable to load segment load command");
-
- for (unsigned SectNum = 0; SectNum != Segment64LC->NumSections; ++SectNum) {
- InMemoryStruct<macho::Section64> Sect;
- Obj->ReadSection64(*SegmentLCI, SectNum, Sect);
- if (!Sect)
- return Error("unable to load section: '" + Twine(SectNum) + "'");
-
- // FIXME: For the time being, we're only loading text segments.
- if (Sect->Flags != 0x80000400)
- continue;
-
- // Address and names of symbols in the section.
- typedef std::pair<uint64_t, StringRef> SymbolEntry;
- SmallVector<SymbolEntry, 64> Symbols;
- // Index of all the names, in this section or not. Used when we're
- // dealing with relocation entries.
- SmallVector<StringRef, 64> SymbolNames;
- for (unsigned i = 0; i != SymtabLC->NumSymbolTableEntries; ++i) {
- InMemoryStruct<macho::Symbol64TableEntry> STE;
- Obj->ReadSymbol64TableEntry(SymtabLC->SymbolTableOffset, i, STE);
- if (!STE)
- return Error("unable to read symbol: '" + Twine(i) + "'");
- if (STE->SectionIndex > Segment64LC->NumSections)
- return Error("invalid section index for symbol: '" + Twine(i) + "'");
- // Get the symbol name.
- StringRef Name = Obj->getStringAtIndex(STE->StringIndex);
- SymbolNames.push_back(Name);
-
- // Just skip symbols not defined in this section.
- if ((unsigned)STE->SectionIndex - 1 != SectNum)
- continue;
-
- // FIXME: Check the symbol type and flags.
- if (STE->Type != 0xF) // external, defined in this section.
- continue;
- if (STE->Flags != 0x0)
- continue;
-
- // Remember the symbol.
- Symbols.push_back(SymbolEntry(STE->Value, Name));
-
- DEBUG(dbgs() << "Function sym: '" << Name << "' @ " <<
- (Sect->Address + STE->Value) << "\n");
- }
- // Sort the symbols by address, just in case they didn't come in that way.
- array_pod_sort(Symbols.begin(), Symbols.end());
-
- // If there weren't any functions (odd, but just in case...)
- if (!Symbols.size())
- continue;
-
- // Extract the function data.
- uint8_t *Base = (uint8_t*)Obj->getData(Segment64LC->FileOffset,
- Segment64LC->FileSize).data();
- for (unsigned i = 0, e = Symbols.size() - 1; i != e; ++i) {
- uint64_t StartOffset = Sect->Address + Symbols[i].first;
- uint64_t EndOffset = Symbols[i + 1].first - 1;
- DEBUG(dbgs() << "Extracting function: " << Symbols[i].second
- << " from [" << StartOffset << ", " << EndOffset << "]\n");
- extractFunction(Symbols[i].second, Base + StartOffset, Base + EndOffset);
- }
- // The last symbol we do after since the end address is calculated
- // differently because there is no next symbol to reference.
- uint64_t StartOffset = Symbols[Symbols.size() - 1].first;
- uint64_t EndOffset = Sect->Size - 1;
- DEBUG(dbgs() << "Extracting function: " << Symbols[Symbols.size()-1].second
- << " from [" << StartOffset << ", " << EndOffset << "]\n");
- extractFunction(Symbols[Symbols.size()-1].second,
- Base + StartOffset, Base + EndOffset);
-
- // Now extract the relocation information for each function and process it.
- for (unsigned j = 0; j != Sect->NumRelocationTableEntries; ++j) {
- InMemoryStruct<macho::RelocationEntry> RE;
- Obj->ReadRelocationEntry(Sect->RelocationTableOffset, j, RE);
- if (RE->Word0 & macho::RF_Scattered)
- return Error("NOT YET IMPLEMENTED: scattered relocations.");
- // Word0 of the relocation is the offset into the section where the
- // relocation should be applied. We need to translate that into an
- // offset into a function since that's our atom.
- uint32_t Offset = RE->Word0;
- // Look for the function containing the address. This is used for JIT
- // code, so the number of functions in section is almost always going
- // to be very small (usually just one), so until we have use cases
- // where that's not true, just use a trivial linear search.
- unsigned SymbolNum;
- unsigned NumSymbols = Symbols.size();
- assert(NumSymbols > 0 && Symbols[0].first <= Offset &&
- "No symbol containing relocation!");
- for (SymbolNum = 0; SymbolNum < NumSymbols - 1; ++SymbolNum)
- if (Symbols[SymbolNum + 1].first > Offset)
- break;
- // Adjust the offset to be relative to the symbol.
- Offset -= Symbols[SymbolNum].first;
- // Get the name of the symbol containing the relocation.
- StringRef TargetName = SymbolNames[SymbolNum];
-
- bool isExtern = (RE->Word1 >> 27) & 1;
- // Figure out the source symbol of the relocation. If isExtern is true,
- // this relocation references the symbol table, otherwise it references
- // a section in the same object, numbered from 1 through NumSections
- // (SectionBases is [0, NumSections-1]).
- if (!isExtern)
- return Error("Internal relocations not supported.");
- uint32_t SourceNum = RE->Word1 & 0xffffff; // 24-bit value
- StringRef SourceName = SymbolNames[SourceNum];
-
- // FIXME: Get the relocation addend from the target address.
-
- // Now store the relocation information. Associate it with the source
- // symbol.
- Relocations[SourceName].push_back(RelocationEntry(TargetName,
- Offset,
- RE->Word1,
- 0 /*Addend*/));
- DEBUG(dbgs() << "Relocation at '" << TargetName << "' + " << Offset
- << " from '" << SourceName << "(Word1: "
- << format("0x%x", RE->Word1) << ")\n");
- }
- }
- return false;
-}
-
-bool RuntimeDyldImpl::loadObject(MemoryBuffer *InputBuffer) {
- // If the linker is in an error state, don't do anything.
- if (hasError())
- return true;
- // Load the Mach-O wrapper object.
- std::string ErrorStr;
- OwningPtr<MachOObject> Obj(
- MachOObject::LoadFromBuffer(InputBuffer, &ErrorStr));
- if (!Obj)
- return Error("unable to load object: '" + ErrorStr + "'");
-
- // Get the CPU type information from the header.
- const macho::Header &Header = Obj->getHeader();
-
- // FIXME: Error checking that the loaded object is compatible with
- // the system we're running on.
- CPUType = Header.CPUType;
- CPUSubtype = Header.CPUSubtype;
-
- // Validate that the load commands match what we expect.
- const MachOObject::LoadCommandInfo *SegmentLCI = 0, *SymtabLCI = 0,
- *DysymtabLCI = 0;
- for (unsigned i = 0; i != Header.NumLoadCommands; ++i) {
- const MachOObject::LoadCommandInfo &LCI = Obj->getLoadCommandInfo(i);
- switch (LCI.Command.Type) {
- case macho::LCT_Segment:
- case macho::LCT_Segment64:
- if (SegmentLCI)
- return Error("unexpected input object (multiple segments)");
- SegmentLCI = &LCI;
- break;
- case macho::LCT_Symtab:
- if (SymtabLCI)
- return Error("unexpected input object (multiple symbol tables)");
- SymtabLCI = &LCI;
- break;
- case macho::LCT_Dysymtab:
- if (DysymtabLCI)
- return Error("unexpected input object (multiple symbol tables)");
- DysymtabLCI = &LCI;
- break;
- default:
- return Error("unexpected input object (unexpected load command");
- }
- }
-
- if (!SymtabLCI)
- return Error("no symbol table found in object");
- if (!SegmentLCI)
- return Error("no symbol table found in object");
-
- // Read and register the symbol table data.
- InMemoryStruct<macho::SymtabLoadCommand> SymtabLC;
- Obj->ReadSymtabLoadCommand(*SymtabLCI, SymtabLC);
- if (!SymtabLC)
- return Error("unable to load symbol table load command");
- Obj->RegisterStringTable(*SymtabLC);
-
- // Read the dynamic link-edit information, if present (not present in static
- // objects).
- if (DysymtabLCI) {
- InMemoryStruct<macho::DysymtabLoadCommand> DysymtabLC;
- Obj->ReadDysymtabLoadCommand(*DysymtabLCI, DysymtabLC);
- if (!DysymtabLC)
- return Error("unable to load dynamic link-exit load command");
-
- // FIXME: We don't support anything interesting yet.
-// if (DysymtabLC->LocalSymbolsIndex != 0)
-// return Error("NOT YET IMPLEMENTED: local symbol entries");
-// if (DysymtabLC->ExternalSymbolsIndex != 0)
-// return Error("NOT YET IMPLEMENTED: non-external symbol entries");
-// if (DysymtabLC->UndefinedSymbolsIndex != SymtabLC->NumSymbolTableEntries)
-// return Error("NOT YET IMPLEMENTED: undefined symbol entries");
- }
-
- // Load the segment load command.
- if (SegmentLCI->Command.Type == macho::LCT_Segment) {
- if (loadSegment32(Obj.get(), SegmentLCI, SymtabLC))
- return true;
- } else {
- if (loadSegment64(Obj.get(), SegmentLCI, SymtabLC))
- return true;
- }
-
- return false;
-}
-
// Resolve the relocations for all symbols we currently know about.
void RuntimeDyldImpl::resolveRelocations() {
// Just iterate over the symbols in our symbol table and assign their
@@ -620,35 +51,11 @@ void RuntimeDyldImpl::resolveRelocations() {
reassignSymbolAddress(i->getKey(), i->getValue());
}
-// Assign an address to a symbol name and resolve all the relocations
-// associated with it.
-void RuntimeDyldImpl::reassignSymbolAddress(StringRef Name, uint8_t *Addr) {
- // Assign the address in our symbol table.
- SymbolTable[Name] = Addr;
-
- RelocationList &Relocs = Relocations[Name];
- for (unsigned i = 0, e = Relocs.size(); i != e; ++i) {
- RelocationEntry &RE = Relocs[i];
- uint8_t *Target = SymbolTable[RE.Target] + RE.Offset;
- bool isPCRel = (RE.Data >> 24) & 1;
- unsigned Type = (RE.Data >> 28) & 0xf;
- unsigned Size = 1 << ((RE.Data >> 25) & 3);
-
- DEBUG(dbgs() << "Resolving relocation at '" << RE.Target
- << "' + " << RE.Offset << " (" << format("%p", Target) << ")"
- << " from '" << Name << " (" << format("%p", Addr) << ")"
- << "(" << (isPCRel ? "pcrel" : "absolute")
- << ", type: " << Type << ", Size: " << Size << ").\n");
-
- resolveRelocation(Target, Addr, isPCRel, Type, Size);
- RE.isResolved = true;
- }
-}
-
//===----------------------------------------------------------------------===//
// RuntimeDyld class implementation
-RuntimeDyld::RuntimeDyld(RTDyldMemoryManager *MM) {
- Dyld = new RuntimeDyldImpl(MM);
+RuntimeDyld::RuntimeDyld(RTDyldMemoryManager *mm) {
+ Dyld = 0;
+ MM = mm;
}
RuntimeDyld::~RuntimeDyld() {
@@ -656,6 +63,16 @@ RuntimeDyld::~RuntimeDyld() {
}
bool RuntimeDyld::loadObject(MemoryBuffer *InputBuffer) {
+ if (!Dyld) {
+ if (RuntimeDyldMachO::isKnownFormat(InputBuffer))
+ Dyld = new RuntimeDyldMachO(MM);
+ else
+ report_fatal_error("Unknown object format!");
+ } else {
+ if(!Dyld->isCompatibleFormat(InputBuffer))
+ report_fatal_error("Incompatible object format!");
+ }
+
return Dyld->loadObject(InputBuffer);
}
diff --git a/contrib/llvm/lib/ExecutionEngine/RuntimeDyld/RuntimeDyldImpl.h b/contrib/llvm/lib/ExecutionEngine/RuntimeDyld/RuntimeDyldImpl.h
new file mode 100644
index 0000000..bcdfb04
--- /dev/null
+++ b/contrib/llvm/lib/ExecutionEngine/RuntimeDyld/RuntimeDyldImpl.h
@@ -0,0 +1,152 @@
+//===-- RuntimeDyldImpl.h - Run-time dynamic linker for MC-JIT ------*- C++ -*-===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+//
+// Interface for the implementations of runtime dynamic linker facilities.
+//
+//===----------------------------------------------------------------------===//
+
+#ifndef LLVM_RUNTIME_DYLD_IMPL_H
+#define LLVM_RUNTIME_DYLD_IMPL_H
+
+#include "llvm/ExecutionEngine/RuntimeDyld.h"
+#include "llvm/Object/MachOObject.h"
+#include "llvm/ADT/StringMap.h"
+#include "llvm/ADT/Twine.h"
+#include "llvm/ADT/SmallVector.h"
+#include "llvm/ExecutionEngine/ExecutionEngine.h"
+#include "llvm/Support/Format.h"
+#include "llvm/Support/Memory.h"
+#include "llvm/Support/MemoryBuffer.h"
+#include "llvm/Support/system_error.h"
+#include "llvm/Support/raw_ostream.h"
+#include "llvm/Support/Debug.h"
+#include "llvm/Support/ErrorHandling.h"
+
+using namespace llvm;
+using namespace llvm::object;
+
+namespace llvm {
+class RuntimeDyldImpl {
+protected:
+ unsigned CPUType;
+ unsigned CPUSubtype;
+
+ // The MemoryManager to load objects into.
+ RTDyldMemoryManager *MemMgr;
+
+ // FIXME: This all assumes we're dealing with external symbols for anything
+ // explicitly referenced. I.e., we can index by name and things
+ // will work out. In practice, this may not be the case, so we
+ // should find a way to effectively generalize.
+
+ // For each function, we have a MemoryBlock of it's instruction data.
+ StringMap<sys::MemoryBlock> Functions;
+
+ // Master symbol table. As modules are loaded and external symbols are
+ // resolved, their addresses are stored here.
+ StringMap<uint8_t*> SymbolTable;
+
+ bool HasError;
+ std::string ErrorStr;
+
+ // Set the error state and record an error string.
+ bool Error(const Twine &Msg) {
+ ErrorStr = Msg.str();
+ HasError = true;
+ return true;
+ }
+
+ void extractFunction(StringRef Name, uint8_t *StartAddress,
+ uint8_t *EndAddress);
+
+public:
+ RuntimeDyldImpl(RTDyldMemoryManager *mm) : MemMgr(mm), HasError(false) {}
+
+ virtual ~RuntimeDyldImpl();
+
+ virtual bool loadObject(MemoryBuffer *InputBuffer) = 0;
+
+ void *getSymbolAddress(StringRef Name) {
+ // FIXME: Just look up as a function for now. Overly simple of course.
+ // Work in progress.
+ return SymbolTable.lookup(Name);
+ }
+
+ void resolveRelocations();
+
+ virtual void reassignSymbolAddress(StringRef Name, uint8_t *Addr) = 0;
+
+ // Is the linker in an error state?
+ bool hasError() { return HasError; }
+
+ // Mark the error condition as handled and continue.
+ void clearError() { HasError = false; }
+
+ // Get the error message.
+ StringRef getErrorString() { return ErrorStr; }
+
+ virtual bool isCompatibleFormat(const MemoryBuffer *InputBuffer) const = 0;
+};
+
+
+class RuntimeDyldMachO : public RuntimeDyldImpl {
+
+ // For each symbol, keep a list of relocations based on it. Anytime
+ // its address is reassigned (the JIT re-compiled the function, e.g.),
+ // the relocations get re-resolved.
+ struct RelocationEntry {
+ std::string Target; // Object this relocation is contained in.
+ uint64_t Offset; // Offset into the object for the relocation.
+ uint32_t Data; // Second word of the raw macho relocation entry.
+ int64_t Addend; // Addend encoded in the instruction itself, if any.
+ bool isResolved; // Has this relocation been resolved previously?
+
+ RelocationEntry(StringRef t, uint64_t offset, uint32_t data, int64_t addend)
+ : Target(t), Offset(offset), Data(data), Addend(addend),
+ isResolved(false) {}
+ };
+ typedef SmallVector<RelocationEntry, 4> RelocationList;
+ StringMap<RelocationList> Relocations;
+
+ // FIXME: Also keep a map of all the relocations contained in an object. Use
+ // this to dynamically answer whether all of the relocations in it have
+ // been resolved or not.
+
+ bool resolveRelocation(uint8_t *Address, uint8_t *Value, bool isPCRel,
+ unsigned Type, unsigned Size);
+ bool resolveX86_64Relocation(uintptr_t Address, uintptr_t Value, bool isPCRel,
+ unsigned Type, unsigned Size);
+ bool resolveARMRelocation(uintptr_t Address, uintptr_t Value, bool isPCRel,
+ unsigned Type, unsigned Size);
+
+ bool loadSegment32(const MachOObject *Obj,
+ const MachOObject::LoadCommandInfo *SegmentLCI,
+ const InMemoryStruct<macho::SymtabLoadCommand> &SymtabLC);
+ bool loadSegment64(const MachOObject *Obj,
+ const MachOObject::LoadCommandInfo *SegmentLCI,
+ const InMemoryStruct<macho::SymtabLoadCommand> &SymtabLC);
+
+public:
+ RuntimeDyldMachO(RTDyldMemoryManager *mm) : RuntimeDyldImpl(mm) {}
+
+ bool loadObject(MemoryBuffer *InputBuffer);
+
+ void reassignSymbolAddress(StringRef Name, uint8_t *Addr);
+
+ static bool isKnownFormat(const MemoryBuffer *InputBuffer);
+
+ bool isCompatibleFormat(const MemoryBuffer *InputBuffer) const {
+ return isKnownFormat(InputBuffer);
+ };
+};
+
+} // end namespace llvm
+
+
+#endif
diff --git a/contrib/llvm/lib/ExecutionEngine/RuntimeDyld/RuntimeDyldMachO.cpp b/contrib/llvm/lib/ExecutionEngine/RuntimeDyld/RuntimeDyldMachO.cpp
new file mode 100644
index 0000000..623e9b2
--- /dev/null
+++ b/contrib/llvm/lib/ExecutionEngine/RuntimeDyld/RuntimeDyldMachO.cpp
@@ -0,0 +1,524 @@
+//===-- RuntimeDyldMachO.cpp - Run-time dynamic linker for MC-JIT ------*- C++ -*-===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+//
+// Implementation of the MC-JIT runtime dynamic linker.
+//
+//===----------------------------------------------------------------------===//
+
+#define DEBUG_TYPE "dyld"
+#include "llvm/ADT/OwningPtr.h"
+#include "llvm/ADT/StringRef.h"
+#include "llvm/ADT/STLExtras.h"
+#include "RuntimeDyldImpl.h"
+using namespace llvm;
+using namespace llvm::object;
+
+namespace llvm {
+
+bool RuntimeDyldMachO::
+resolveRelocation(uint8_t *Address, uint8_t *Value, bool isPCRel,
+ unsigned Type, unsigned Size) {
+ // This just dispatches to the proper target specific routine.
+ switch (CPUType) {
+ default: assert(0 && "Unsupported CPU type!");
+ case mach::CTM_x86_64:
+ return resolveX86_64Relocation((uintptr_t)Address, (uintptr_t)Value,
+ isPCRel, Type, Size);
+ case mach::CTM_ARM:
+ return resolveARMRelocation((uintptr_t)Address, (uintptr_t)Value,
+ isPCRel, Type, Size);
+ }
+ llvm_unreachable("");
+}
+
+bool RuntimeDyldMachO::
+resolveX86_64Relocation(uintptr_t Address, uintptr_t Value,
+ bool isPCRel, unsigned Type,
+ unsigned Size) {
+ // If the relocation is PC-relative, the value to be encoded is the
+ // pointer difference.
+ if (isPCRel)
+ // FIXME: It seems this value needs to be adjusted by 4 for an effective PC
+ // address. Is that expected? Only for branches, perhaps?
+ Value -= Address + 4;
+
+ switch(Type) {
+ default:
+ llvm_unreachable("Invalid relocation type!");
+ case macho::RIT_X86_64_Unsigned:
+ case macho::RIT_X86_64_Branch: {
+ // Mask in the target value a byte at a time (we don't have an alignment
+ // guarantee for the target address, so this is safest).
+ uint8_t *p = (uint8_t*)Address;
+ for (unsigned i = 0; i < Size; ++i) {
+ *p++ = (uint8_t)Value;
+ Value >>= 8;
+ }
+ return false;
+ }
+ case macho::RIT_X86_64_Signed:
+ case macho::RIT_X86_64_GOTLoad:
+ case macho::RIT_X86_64_GOT:
+ case macho::RIT_X86_64_Subtractor:
+ case macho::RIT_X86_64_Signed1:
+ case macho::RIT_X86_64_Signed2:
+ case macho::RIT_X86_64_Signed4:
+ case macho::RIT_X86_64_TLV:
+ return Error("Relocation type not implemented yet!");
+ }
+ return false;
+}
+
+bool RuntimeDyldMachO::resolveARMRelocation(uintptr_t Address, uintptr_t Value,
+ bool isPCRel, unsigned Type,
+ unsigned Size) {
+ // If the relocation is PC-relative, the value to be encoded is the
+ // pointer difference.
+ if (isPCRel) {
+ Value -= Address;
+ // ARM PCRel relocations have an effective-PC offset of two instructions
+ // (four bytes in Thumb mode, 8 bytes in ARM mode).
+ // FIXME: For now, assume ARM mode.
+ Value -= 8;
+ }
+
+ switch(Type) {
+ default:
+ llvm_unreachable("Invalid relocation type!");
+ case macho::RIT_Vanilla: {
+ llvm_unreachable("Invalid relocation type!");
+ // Mask in the target value a byte at a time (we don't have an alignment
+ // guarantee for the target address, so this is safest).
+ uint8_t *p = (uint8_t*)Address;
+ for (unsigned i = 0; i < Size; ++i) {
+ *p++ = (uint8_t)Value;
+ Value >>= 8;
+ }
+ break;
+ }
+ case macho::RIT_ARM_Branch24Bit: {
+ // Mask the value into the target address. We know instructions are
+ // 32-bit aligned, so we can do it all at once.
+ uint32_t *p = (uint32_t*)Address;
+ // The low two bits of the value are not encoded.
+ Value >>= 2;
+ // Mask the value to 24 bits.
+ Value &= 0xffffff;
+ // FIXME: If the destination is a Thumb function (and the instruction
+ // is a non-predicated BL instruction), we need to change it to a BLX
+ // instruction instead.
+
+ // Insert the value into the instruction.
+ *p = (*p & ~0xffffff) | Value;
+ break;
+ }
+ case macho::RIT_ARM_ThumbBranch22Bit:
+ case macho::RIT_ARM_ThumbBranch32Bit:
+ case macho::RIT_ARM_Half:
+ case macho::RIT_ARM_HalfDifference:
+ case macho::RIT_Pair:
+ case macho::RIT_Difference:
+ case macho::RIT_ARM_LocalDifference:
+ case macho::RIT_ARM_PreboundLazyPointer:
+ return Error("Relocation type not implemented yet!");
+ }
+ return false;
+}
+
+bool RuntimeDyldMachO::
+loadSegment32(const MachOObject *Obj,
+ const MachOObject::LoadCommandInfo *SegmentLCI,
+ const InMemoryStruct<macho::SymtabLoadCommand> &SymtabLC) {
+ InMemoryStruct<macho::SegmentLoadCommand> SegmentLC;
+ Obj->ReadSegmentLoadCommand(*SegmentLCI, SegmentLC);
+ if (!SegmentLC)
+ return Error("unable to load segment load command");
+
+ for (unsigned SectNum = 0; SectNum != SegmentLC->NumSections; ++SectNum) {
+ InMemoryStruct<macho::Section> Sect;
+ Obj->ReadSection(*SegmentLCI, SectNum, Sect);
+ if (!Sect)
+ return Error("unable to load section: '" + Twine(SectNum) + "'");
+
+ // FIXME: For the time being, we're only loading text segments.
+ if (Sect->Flags != 0x80000400)
+ continue;
+
+ // Address and names of symbols in the section.
+ typedef std::pair<uint64_t, StringRef> SymbolEntry;
+ SmallVector<SymbolEntry, 64> Symbols;
+ // Index of all the names, in this section or not. Used when we're
+ // dealing with relocation entries.
+ SmallVector<StringRef, 64> SymbolNames;
+ for (unsigned i = 0; i != SymtabLC->NumSymbolTableEntries; ++i) {
+ InMemoryStruct<macho::SymbolTableEntry> STE;
+ Obj->ReadSymbolTableEntry(SymtabLC->SymbolTableOffset, i, STE);
+ if (!STE)
+ return Error("unable to read symbol: '" + Twine(i) + "'");
+ if (STE->SectionIndex > SegmentLC->NumSections)
+ return Error("invalid section index for symbol: '" + Twine(i) + "'");
+ // Get the symbol name.
+ StringRef Name = Obj->getStringAtIndex(STE->StringIndex);
+ SymbolNames.push_back(Name);
+
+ // Just skip symbols not defined in this section.
+ if ((unsigned)STE->SectionIndex - 1 != SectNum)
+ continue;
+
+ // FIXME: Check the symbol type and flags.
+ if (STE->Type != 0xF) // external, defined in this section.
+ continue;
+ // Flags == 0x8 marks a thumb function for ARM, which is fine as it
+ // doesn't require any special handling here.
+ if (STE->Flags != 0x0 && STE->Flags != 0x8)
+ continue;
+
+ // Remember the symbol.
+ Symbols.push_back(SymbolEntry(STE->Value, Name));
+
+ DEBUG(dbgs() << "Function sym: '" << Name << "' @ " <<
+ (Sect->Address + STE->Value) << "\n");
+ }
+ // Sort the symbols by address, just in case they didn't come in that way.
+ array_pod_sort(Symbols.begin(), Symbols.end());
+
+ // If there weren't any functions (odd, but just in case...)
+ if (!Symbols.size())
+ continue;
+
+ // Extract the function data.
+ uint8_t *Base = (uint8_t*)Obj->getData(SegmentLC->FileOffset,
+ SegmentLC->FileSize).data();
+ for (unsigned i = 0, e = Symbols.size() - 1; i != e; ++i) {
+ uint64_t StartOffset = Sect->Address + Symbols[i].first;
+ uint64_t EndOffset = Symbols[i + 1].first - 1;
+ DEBUG(dbgs() << "Extracting function: " << Symbols[i].second
+ << " from [" << StartOffset << ", " << EndOffset << "]\n");
+ extractFunction(Symbols[i].second, Base + StartOffset, Base + EndOffset);
+ }
+ // The last symbol we do after since the end address is calculated
+ // differently because there is no next symbol to reference.
+ uint64_t StartOffset = Symbols[Symbols.size() - 1].first;
+ uint64_t EndOffset = Sect->Size - 1;
+ DEBUG(dbgs() << "Extracting function: " << Symbols[Symbols.size()-1].second
+ << " from [" << StartOffset << ", " << EndOffset << "]\n");
+ extractFunction(Symbols[Symbols.size()-1].second,
+ Base + StartOffset, Base + EndOffset);
+
+ // Now extract the relocation information for each function and process it.
+ for (unsigned j = 0; j != Sect->NumRelocationTableEntries; ++j) {
+ InMemoryStruct<macho::RelocationEntry> RE;
+ Obj->ReadRelocationEntry(Sect->RelocationTableOffset, j, RE);
+ if (RE->Word0 & macho::RF_Scattered)
+ return Error("NOT YET IMPLEMENTED: scattered relocations.");
+ // Word0 of the relocation is the offset into the section where the
+ // relocation should be applied. We need to translate that into an
+ // offset into a function since that's our atom.
+ uint32_t Offset = RE->Word0;
+ // Look for the function containing the address. This is used for JIT
+ // code, so the number of functions in section is almost always going
+ // to be very small (usually just one), so until we have use cases
+ // where that's not true, just use a trivial linear search.
+ unsigned SymbolNum;
+ unsigned NumSymbols = Symbols.size();
+ assert(NumSymbols > 0 && Symbols[0].first <= Offset &&
+ "No symbol containing relocation!");
+ for (SymbolNum = 0; SymbolNum < NumSymbols - 1; ++SymbolNum)
+ if (Symbols[SymbolNum + 1].first > Offset)
+ break;
+ // Adjust the offset to be relative to the symbol.
+ Offset -= Symbols[SymbolNum].first;
+ // Get the name of the symbol containing the relocation.
+ StringRef TargetName = SymbolNames[SymbolNum];
+
+ bool isExtern = (RE->Word1 >> 27) & 1;
+ // Figure out the source symbol of the relocation. If isExtern is true,
+ // this relocation references the symbol table, otherwise it references
+ // a section in the same object, numbered from 1 through NumSections
+ // (SectionBases is [0, NumSections-1]).
+ // FIXME: Some targets (ARM) use internal relocations even for
+ // externally visible symbols, if the definition is in the same
+ // file as the reference. We need to convert those back to by-name
+ // references. We can resolve the address based on the section
+ // offset and see if we have a symbol at that address. If we do,
+ // use that; otherwise, puke.
+ if (!isExtern)
+ return Error("Internal relocations not supported.");
+ uint32_t SourceNum = RE->Word1 & 0xffffff; // 24-bit value
+ StringRef SourceName = SymbolNames[SourceNum];
+
+ // FIXME: Get the relocation addend from the target address.
+
+ // Now store the relocation information. Associate it with the source
+ // symbol.
+ Relocations[SourceName].push_back(RelocationEntry(TargetName,
+ Offset,
+ RE->Word1,
+ 0 /*Addend*/));
+ DEBUG(dbgs() << "Relocation at '" << TargetName << "' + " << Offset
+ << " from '" << SourceName << "(Word1: "
+ << format("0x%x", RE->Word1) << ")\n");
+ }
+ }
+ return false;
+}
+
+
+bool RuntimeDyldMachO::
+loadSegment64(const MachOObject *Obj,
+ const MachOObject::LoadCommandInfo *SegmentLCI,
+ const InMemoryStruct<macho::SymtabLoadCommand> &SymtabLC) {
+ InMemoryStruct<macho::Segment64LoadCommand> Segment64LC;
+ Obj->ReadSegment64LoadCommand(*SegmentLCI, Segment64LC);
+ if (!Segment64LC)
+ return Error("unable to load segment load command");
+
+ for (unsigned SectNum = 0; SectNum != Segment64LC->NumSections; ++SectNum) {
+ InMemoryStruct<macho::Section64> Sect;
+ Obj->ReadSection64(*SegmentLCI, SectNum, Sect);
+ if (!Sect)
+ return Error("unable to load section: '" + Twine(SectNum) + "'");
+
+ // FIXME: For the time being, we're only loading text segments.
+ if (Sect->Flags != 0x80000400)
+ continue;
+
+ // Address and names of symbols in the section.
+ typedef std::pair<uint64_t, StringRef> SymbolEntry;
+ SmallVector<SymbolEntry, 64> Symbols;
+ // Index of all the names, in this section or not. Used when we're
+ // dealing with relocation entries.
+ SmallVector<StringRef, 64> SymbolNames;
+ for (unsigned i = 0; i != SymtabLC->NumSymbolTableEntries; ++i) {
+ InMemoryStruct<macho::Symbol64TableEntry> STE;
+ Obj->ReadSymbol64TableEntry(SymtabLC->SymbolTableOffset, i, STE);
+ if (!STE)
+ return Error("unable to read symbol: '" + Twine(i) + "'");
+ if (STE->SectionIndex > Segment64LC->NumSections)
+ return Error("invalid section index for symbol: '" + Twine(i) + "'");
+ // Get the symbol name.
+ StringRef Name = Obj->getStringAtIndex(STE->StringIndex);
+ SymbolNames.push_back(Name);
+
+ // Just skip symbols not defined in this section.
+ if ((unsigned)STE->SectionIndex - 1 != SectNum)
+ continue;
+
+ // FIXME: Check the symbol type and flags.
+ if (STE->Type != 0xF) // external, defined in this section.
+ continue;
+ if (STE->Flags != 0x0)
+ continue;
+
+ // Remember the symbol.
+ Symbols.push_back(SymbolEntry(STE->Value, Name));
+
+ DEBUG(dbgs() << "Function sym: '" << Name << "' @ " <<
+ (Sect->Address + STE->Value) << "\n");
+ }
+ // Sort the symbols by address, just in case they didn't come in that way.
+ array_pod_sort(Symbols.begin(), Symbols.end());
+
+ // If there weren't any functions (odd, but just in case...)
+ if (!Symbols.size())
+ continue;
+
+ // Extract the function data.
+ uint8_t *Base = (uint8_t*)Obj->getData(Segment64LC->FileOffset,
+ Segment64LC->FileSize).data();
+ for (unsigned i = 0, e = Symbols.size() - 1; i != e; ++i) {
+ uint64_t StartOffset = Sect->Address + Symbols[i].first;
+ uint64_t EndOffset = Symbols[i + 1].first - 1;
+ DEBUG(dbgs() << "Extracting function: " << Symbols[i].second
+ << " from [" << StartOffset << ", " << EndOffset << "]\n");
+ extractFunction(Symbols[i].second, Base + StartOffset, Base + EndOffset);
+ }
+ // The last symbol we do after since the end address is calculated
+ // differently because there is no next symbol to reference.
+ uint64_t StartOffset = Symbols[Symbols.size() - 1].first;
+ uint64_t EndOffset = Sect->Size - 1;
+ DEBUG(dbgs() << "Extracting function: " << Symbols[Symbols.size()-1].second
+ << " from [" << StartOffset << ", " << EndOffset << "]\n");
+ extractFunction(Symbols[Symbols.size()-1].second,
+ Base + StartOffset, Base + EndOffset);
+
+ // Now extract the relocation information for each function and process it.
+ for (unsigned j = 0; j != Sect->NumRelocationTableEntries; ++j) {
+ InMemoryStruct<macho::RelocationEntry> RE;
+ Obj->ReadRelocationEntry(Sect->RelocationTableOffset, j, RE);
+ if (RE->Word0 & macho::RF_Scattered)
+ return Error("NOT YET IMPLEMENTED: scattered relocations.");
+ // Word0 of the relocation is the offset into the section where the
+ // relocation should be applied. We need to translate that into an
+ // offset into a function since that's our atom.
+ uint32_t Offset = RE->Word0;
+ // Look for the function containing the address. This is used for JIT
+ // code, so the number of functions in section is almost always going
+ // to be very small (usually just one), so until we have use cases
+ // where that's not true, just use a trivial linear search.
+ unsigned SymbolNum;
+ unsigned NumSymbols = Symbols.size();
+ assert(NumSymbols > 0 && Symbols[0].first <= Offset &&
+ "No symbol containing relocation!");
+ for (SymbolNum = 0; SymbolNum < NumSymbols - 1; ++SymbolNum)
+ if (Symbols[SymbolNum + 1].first > Offset)
+ break;
+ // Adjust the offset to be relative to the symbol.
+ Offset -= Symbols[SymbolNum].first;
+ // Get the name of the symbol containing the relocation.
+ StringRef TargetName = SymbolNames[SymbolNum];
+
+ bool isExtern = (RE->Word1 >> 27) & 1;
+ // Figure out the source symbol of the relocation. If isExtern is true,
+ // this relocation references the symbol table, otherwise it references
+ // a section in the same object, numbered from 1 through NumSections
+ // (SectionBases is [0, NumSections-1]).
+ if (!isExtern)
+ return Error("Internal relocations not supported.");
+ uint32_t SourceNum = RE->Word1 & 0xffffff; // 24-bit value
+ StringRef SourceName = SymbolNames[SourceNum];
+
+ // FIXME: Get the relocation addend from the target address.
+
+ // Now store the relocation information. Associate it with the source
+ // symbol.
+ Relocations[SourceName].push_back(RelocationEntry(TargetName,
+ Offset,
+ RE->Word1,
+ 0 /*Addend*/));
+ DEBUG(dbgs() << "Relocation at '" << TargetName << "' + " << Offset
+ << " from '" << SourceName << "(Word1: "
+ << format("0x%x", RE->Word1) << ")\n");
+ }
+ }
+ return false;
+}
+
+bool RuntimeDyldMachO::loadObject(MemoryBuffer *InputBuffer) {
+ // If the linker is in an error state, don't do anything.
+ if (hasError())
+ return true;
+ // Load the Mach-O wrapper object.
+ std::string ErrorStr;
+ OwningPtr<MachOObject> Obj(
+ MachOObject::LoadFromBuffer(InputBuffer, &ErrorStr));
+ if (!Obj)
+ return Error("unable to load object: '" + ErrorStr + "'");
+
+ // Get the CPU type information from the header.
+ const macho::Header &Header = Obj->getHeader();
+
+ // FIXME: Error checking that the loaded object is compatible with
+ // the system we're running on.
+ CPUType = Header.CPUType;
+ CPUSubtype = Header.CPUSubtype;
+
+ // Validate that the load commands match what we expect.
+ const MachOObject::LoadCommandInfo *SegmentLCI = 0, *SymtabLCI = 0,
+ *DysymtabLCI = 0;
+ for (unsigned i = 0; i != Header.NumLoadCommands; ++i) {
+ const MachOObject::LoadCommandInfo &LCI = Obj->getLoadCommandInfo(i);
+ switch (LCI.Command.Type) {
+ case macho::LCT_Segment:
+ case macho::LCT_Segment64:
+ if (SegmentLCI)
+ return Error("unexpected input object (multiple segments)");
+ SegmentLCI = &LCI;
+ break;
+ case macho::LCT_Symtab:
+ if (SymtabLCI)
+ return Error("unexpected input object (multiple symbol tables)");
+ SymtabLCI = &LCI;
+ break;
+ case macho::LCT_Dysymtab:
+ if (DysymtabLCI)
+ return Error("unexpected input object (multiple symbol tables)");
+ DysymtabLCI = &LCI;
+ break;
+ default:
+ return Error("unexpected input object (unexpected load command");
+ }
+ }
+
+ if (!SymtabLCI)
+ return Error("no symbol table found in object");
+ if (!SegmentLCI)
+ return Error("no symbol table found in object");
+
+ // Read and register the symbol table data.
+ InMemoryStruct<macho::SymtabLoadCommand> SymtabLC;
+ Obj->ReadSymtabLoadCommand(*SymtabLCI, SymtabLC);
+ if (!SymtabLC)
+ return Error("unable to load symbol table load command");
+ Obj->RegisterStringTable(*SymtabLC);
+
+ // Read the dynamic link-edit information, if present (not present in static
+ // objects).
+ if (DysymtabLCI) {
+ InMemoryStruct<macho::DysymtabLoadCommand> DysymtabLC;
+ Obj->ReadDysymtabLoadCommand(*DysymtabLCI, DysymtabLC);
+ if (!DysymtabLC)
+ return Error("unable to load dynamic link-exit load command");
+
+ // FIXME: We don't support anything interesting yet.
+// if (DysymtabLC->LocalSymbolsIndex != 0)
+// return Error("NOT YET IMPLEMENTED: local symbol entries");
+// if (DysymtabLC->ExternalSymbolsIndex != 0)
+// return Error("NOT YET IMPLEMENTED: non-external symbol entries");
+// if (DysymtabLC->UndefinedSymbolsIndex != SymtabLC->NumSymbolTableEntries)
+// return Error("NOT YET IMPLEMENTED: undefined symbol entries");
+ }
+
+ // Load the segment load command.
+ if (SegmentLCI->Command.Type == macho::LCT_Segment) {
+ if (loadSegment32(Obj.get(), SegmentLCI, SymtabLC))
+ return true;
+ } else {
+ if (loadSegment64(Obj.get(), SegmentLCI, SymtabLC))
+ return true;
+ }
+
+ return false;
+}
+
+// Assign an address to a symbol name and resolve all the relocations
+// associated with it.
+void RuntimeDyldMachO::reassignSymbolAddress(StringRef Name, uint8_t *Addr) {
+ // Assign the address in our symbol table.
+ SymbolTable[Name] = Addr;
+
+ RelocationList &Relocs = Relocations[Name];
+ for (unsigned i = 0, e = Relocs.size(); i != e; ++i) {
+ RelocationEntry &RE = Relocs[i];
+ uint8_t *Target = SymbolTable[RE.Target] + RE.Offset;
+ bool isPCRel = (RE.Data >> 24) & 1;
+ unsigned Type = (RE.Data >> 28) & 0xf;
+ unsigned Size = 1 << ((RE.Data >> 25) & 3);
+
+ DEBUG(dbgs() << "Resolving relocation at '" << RE.Target
+ << "' + " << RE.Offset << " (" << format("%p", Target) << ")"
+ << " from '" << Name << " (" << format("%p", Addr) << ")"
+ << "(" << (isPCRel ? "pcrel" : "absolute")
+ << ", type: " << Type << ", Size: " << Size << ").\n");
+
+ resolveRelocation(Target, Addr, isPCRel, Type, Size);
+ RE.isResolved = true;
+ }
+}
+
+bool RuntimeDyldMachO::isKnownFormat(const MemoryBuffer *InputBuffer) {
+ StringRef Magic = InputBuffer->getBuffer().slice(0, 4);
+ if (Magic == "\xFE\xED\xFA\xCE") return true;
+ if (Magic == "\xCE\xFA\xED\xFE") return true;
+ if (Magic == "\xFE\xED\xFA\xCF") return true;
+ if (Magic == "\xCF\xFA\xED\xFE") return true;
+ return false;
+}
+
+} // end namespace llvm
diff --git a/contrib/llvm/lib/ExecutionEngine/TargetSelect.cpp b/contrib/llvm/lib/ExecutionEngine/TargetSelect.cpp
index a8822e5..f51aff3 100644
--- a/contrib/llvm/lib/ExecutionEngine/TargetSelect.cpp
+++ b/contrib/llvm/lib/ExecutionEngine/TargetSelect.cpp
@@ -16,10 +16,10 @@
#include "llvm/ExecutionEngine/ExecutionEngine.h"
#include "llvm/Module.h"
#include "llvm/ADT/Triple.h"
+#include "llvm/MC/SubtargetFeature.h"
#include "llvm/Support/CommandLine.h"
#include "llvm/Support/raw_ostream.h"
#include "llvm/Support/Host.h"
-#include "llvm/Target/SubtargetFeature.h"
#include "llvm/Target/TargetMachine.h"
#include "llvm/Target/TargetRegistry.h"
using namespace llvm;
@@ -75,9 +75,8 @@ TargetMachine *EngineBuilder::selectTarget(Module *Mod,
// Package up features to be passed to target/subtarget
std::string FeaturesStr;
- if (!MCPU.empty() || !MAttrs.empty()) {
+ if (!MAttrs.empty()) {
SubtargetFeatures Features;
- Features.setCPU(MCPU);
for (unsigned i = 0; i != MAttrs.size(); ++i)
Features.AddFeature(MAttrs[i]);
FeaturesStr = Features.getString();
@@ -85,7 +84,7 @@ TargetMachine *EngineBuilder::selectTarget(Module *Mod,
// Allocate a target...
TargetMachine *Target =
- TheTarget->createTargetMachine(TheTriple.getTriple(), FeaturesStr);
+ TheTarget->createTargetMachine(TheTriple.getTriple(), MCPU, FeaturesStr);
assert(Target && "Could not allocate target machine!");
return Target;
}
diff --git a/contrib/llvm/lib/Linker/LinkModules.cpp b/contrib/llvm/lib/Linker/LinkModules.cpp
index f372db2..55aa9bf 100644
--- a/contrib/llvm/lib/Linker/LinkModules.cpp
+++ b/contrib/llvm/lib/Linker/LinkModules.cpp
@@ -9,337 +9,404 @@
//
// This file implements the LLVM module linker.
//
-// Specifically, this:
-// * Merges global variables between the two modules
-// * Uninit + Uninit = Init, Init + Uninit = Init, Init + Init = Error if !=
-// * Merges functions between two modules
-//
//===----------------------------------------------------------------------===//
#include "llvm/Linker.h"
#include "llvm/Constants.h"
#include "llvm/DerivedTypes.h"
-#include "llvm/LLVMContext.h"
#include "llvm/Module.h"
-#include "llvm/TypeSymbolTable.h"
-#include "llvm/ValueSymbolTable.h"
-#include "llvm/Instructions.h"
-#include "llvm/Assembly/Writer.h"
-#include "llvm/Support/Debug.h"
-#include "llvm/Support/ErrorHandling.h"
#include "llvm/Support/raw_ostream.h"
#include "llvm/Support/Path.h"
#include "llvm/Transforms/Utils/ValueMapper.h"
-#include "llvm/ADT/DenseMap.h"
using namespace llvm;
-// Error - Simple wrapper function to conditionally assign to E and return true.
-// This just makes error return conditions a little bit simpler...
-static inline bool Error(std::string *E, const Twine &Message) {
- if (E) *E = Message.str();
- return true;
-}
-
-// Function: ResolveTypes()
-//
-// Description:
-// Attempt to link the two specified types together.
-//
-// Inputs:
-// DestTy - The type to which we wish to resolve.
-// SrcTy - The original type which we want to resolve.
-//
-// Outputs:
-// DestST - The symbol table in which the new type should be placed.
-//
-// Return value:
-// true - There is an error and the types cannot yet be linked.
-// false - No errors.
-//
-static bool ResolveTypes(const Type *DestTy, const Type *SrcTy) {
- if (DestTy == SrcTy) return false; // If already equal, noop
- assert(DestTy && SrcTy && "Can't handle null types");
-
- if (const OpaqueType *OT = dyn_cast<OpaqueType>(DestTy)) {
- // Type _is_ in module, just opaque...
- const_cast<OpaqueType*>(OT)->refineAbstractTypeTo(SrcTy);
- } else if (const OpaqueType *OT = dyn_cast<OpaqueType>(SrcTy)) {
- const_cast<OpaqueType*>(OT)->refineAbstractTypeTo(DestTy);
- } else {
- return true; // Cannot link types... not-equal and neither is opaque.
- }
- return false;
-}
+//===----------------------------------------------------------------------===//
+// TypeMap implementation.
+//===----------------------------------------------------------------------===//
-/// LinkerTypeMap - This implements a map of types that is stable
-/// even if types are resolved/refined to other types. This is not a general
-/// purpose map, it is specific to the linker's use.
namespace {
-class LinkerTypeMap : public AbstractTypeUser {
- typedef DenseMap<const Type*, PATypeHolder> TheMapTy;
- TheMapTy TheMap;
-
- LinkerTypeMap(const LinkerTypeMap&); // DO NOT IMPLEMENT
- void operator=(const LinkerTypeMap&); // DO NOT IMPLEMENT
+class TypeMapTy : public ValueMapTypeRemapper {
+ /// MappedTypes - This is a mapping from a source type to a destination type
+ /// to use.
+ DenseMap<Type*, Type*> MappedTypes;
+
+ /// SpeculativeTypes - When checking to see if two subgraphs are isomorphic,
+ /// we speculatively add types to MappedTypes, but keep track of them here in
+ /// case we need to roll back.
+ SmallVector<Type*, 16> SpeculativeTypes;
+
+ /// DefinitionsToResolve - This is a list of non-opaque structs in the source
+ /// module that are mapped to an opaque struct in the destination module.
+ SmallVector<StructType*, 16> DefinitionsToResolve;
public:
- LinkerTypeMap() {}
- ~LinkerTypeMap() {
- for (DenseMap<const Type*, PATypeHolder>::iterator I = TheMap.begin(),
- E = TheMap.end(); I != E; ++I)
- I->first->removeAbstractTypeUser(this);
- }
-
- /// lookup - Return the value for the specified type or null if it doesn't
- /// exist.
- const Type *lookup(const Type *Ty) const {
- TheMapTy::const_iterator I = TheMap.find(Ty);
- if (I != TheMap.end()) return I->second;
- return 0;
- }
-
- /// insert - This returns true if the pointer was new to the set, false if it
- /// was already in the set.
- bool insert(const Type *Src, const Type *Dst) {
- if (!TheMap.insert(std::make_pair(Src, PATypeHolder(Dst))).second)
- return false; // Already in map.
- if (Src->isAbstract())
- Src->addAbstractTypeUser(this);
- return true;
- }
-
-protected:
- /// refineAbstractType - The callback method invoked when an abstract type is
- /// resolved to another type. An object must override this method to update
- /// its internal state to reference NewType instead of OldType.
- ///
- virtual void refineAbstractType(const DerivedType *OldTy,
- const Type *NewTy) {
- TheMapTy::iterator I = TheMap.find(OldTy);
- const Type *DstTy = I->second;
-
- TheMap.erase(I);
- if (OldTy->isAbstract())
- OldTy->removeAbstractTypeUser(this);
-
- // Don't reinsert into the map if the key is concrete now.
- if (NewTy->isAbstract())
- insert(NewTy, DstTy);
+
+ /// addTypeMapping - Indicate that the specified type in the destination
+ /// module is conceptually equivalent to the specified type in the source
+ /// module.
+ void addTypeMapping(Type *DstTy, Type *SrcTy);
+
+ /// linkDefinedTypeBodies - Produce a body for an opaque type in the dest
+ /// module from a type definition in the source module.
+ void linkDefinedTypeBodies();
+
+ /// get - Return the mapped type to use for the specified input type from the
+ /// source module.
+ Type *get(Type *SrcTy);
+
+ FunctionType *get(FunctionType *T) {return cast<FunctionType>(get((Type*)T));}
+
+private:
+ Type *getImpl(Type *T);
+ /// remapType - Implement the ValueMapTypeRemapper interface.
+ Type *remapType(Type *SrcTy) {
+ return get(SrcTy);
}
+
+ bool areTypesIsomorphic(Type *DstTy, Type *SrcTy);
+};
+}
- /// The other case which AbstractTypeUsers must be aware of is when a type
- /// makes the transition from being abstract (where it has clients on it's
- /// AbstractTypeUsers list) to concrete (where it does not). This method
- /// notifies ATU's when this occurs for a type.
- virtual void typeBecameConcrete(const DerivedType *AbsTy) {
- TheMap.erase(AbsTy);
- AbsTy->removeAbstractTypeUser(this);
+void TypeMapTy::addTypeMapping(Type *DstTy, Type *SrcTy) {
+ Type *&Entry = MappedTypes[SrcTy];
+ if (Entry) return;
+
+ if (DstTy == SrcTy) {
+ Entry = DstTy;
+ return;
}
-
- // for debugging...
- virtual void dump() const {
- dbgs() << "AbstractTypeSet!\n";
+
+ // Check to see if these types are recursively isomorphic and establish a
+ // mapping between them if so.
+ if (!areTypesIsomorphic(DstTy, SrcTy)) {
+ // Oops, they aren't isomorphic. Just discard this request by rolling out
+ // any speculative mappings we've established.
+ for (unsigned i = 0, e = SpeculativeTypes.size(); i != e; ++i)
+ MappedTypes.erase(SpeculativeTypes[i]);
}
-};
+ SpeculativeTypes.clear();
}
-
-// RecursiveResolveTypes - This is just like ResolveTypes, except that it
-// recurses down into derived types, merging the used types if the parent types
-// are compatible.
-static bool RecursiveResolveTypesI(const Type *DstTy, const Type *SrcTy,
- LinkerTypeMap &Pointers) {
- if (DstTy == SrcTy) return false; // If already equal, noop
-
- // If we found our opaque type, resolve it now!
- if (DstTy->isOpaqueTy() || SrcTy->isOpaqueTy())
- return ResolveTypes(DstTy, SrcTy);
-
- // Two types cannot be resolved together if they are of different primitive
- // type. For example, we cannot resolve an int to a float.
- if (DstTy->getTypeID() != SrcTy->getTypeID()) return true;
-
- // If neither type is abstract, then they really are just different types.
- if (!DstTy->isAbstract() && !SrcTy->isAbstract())
- return true;
-
- // Otherwise, resolve the used type used by this derived type...
- switch (DstTy->getTypeID()) {
- default:
+/// areTypesIsomorphic - Recursively walk this pair of types, returning true
+/// if they are isomorphic, false if they are not.
+bool TypeMapTy::areTypesIsomorphic(Type *DstTy, Type *SrcTy) {
+ // Two types with differing kinds are clearly not isomorphic.
+ if (DstTy->getTypeID() != SrcTy->getTypeID()) return false;
+
+ // If we have an entry in the MappedTypes table, then we have our answer.
+ Type *&Entry = MappedTypes[SrcTy];
+ if (Entry)
+ return Entry == DstTy;
+
+ // Two identical types are clearly isomorphic. Remember this
+ // non-speculatively.
+ if (DstTy == SrcTy) {
+ Entry = DstTy;
return true;
- case Type::FunctionTyID: {
- const FunctionType *DstFT = cast<FunctionType>(DstTy);
- const FunctionType *SrcFT = cast<FunctionType>(SrcTy);
- if (DstFT->isVarArg() != SrcFT->isVarArg() ||
- DstFT->getNumContainedTypes() != SrcFT->getNumContainedTypes())
- return true;
-
- // Use TypeHolder's so recursive resolution won't break us.
- PATypeHolder ST(SrcFT), DT(DstFT);
- for (unsigned i = 0, e = DstFT->getNumContainedTypes(); i != e; ++i) {
- const Type *SE = ST->getContainedType(i), *DE = DT->getContainedType(i);
- if (SE != DE && RecursiveResolveTypesI(DE, SE, Pointers))
- return true;
- }
- return false;
}
- case Type::StructTyID: {
- const StructType *DstST = cast<StructType>(DstTy);
- const StructType *SrcST = cast<StructType>(SrcTy);
- if (DstST->getNumContainedTypes() != SrcST->getNumContainedTypes())
+
+ // Okay, we have two types with identical kinds that we haven't seen before.
+
+ // If this is an opaque struct type, special case it.
+ if (StructType *SSTy = dyn_cast<StructType>(SrcTy)) {
+ // Mapping an opaque type to any struct, just keep the dest struct.
+ if (SSTy->isOpaque()) {
+ Entry = DstTy;
+ SpeculativeTypes.push_back(SrcTy);
return true;
+ }
- PATypeHolder ST(SrcST), DT(DstST);
- for (unsigned i = 0, e = DstST->getNumContainedTypes(); i != e; ++i) {
- const Type *SE = ST->getContainedType(i), *DE = DT->getContainedType(i);
- if (SE != DE && RecursiveResolveTypesI(DE, SE, Pointers))
- return true;
+ // Mapping a non-opaque source type to an opaque dest. Keep the dest, but
+ // fill it in later. This doesn't need to be speculative.
+ if (cast<StructType>(DstTy)->isOpaque()) {
+ Entry = DstTy;
+ DefinitionsToResolve.push_back(SSTy);
+ return true;
}
- return false;
- }
- case Type::ArrayTyID: {
- const ArrayType *DAT = cast<ArrayType>(DstTy);
- const ArrayType *SAT = cast<ArrayType>(SrcTy);
- if (DAT->getNumElements() != SAT->getNumElements()) return true;
- return RecursiveResolveTypesI(DAT->getElementType(), SAT->getElementType(),
- Pointers);
}
- case Type::VectorTyID: {
- const VectorType *DVT = cast<VectorType>(DstTy);
- const VectorType *SVT = cast<VectorType>(SrcTy);
- if (DVT->getNumElements() != SVT->getNumElements()) return true;
- return RecursiveResolveTypesI(DVT->getElementType(), SVT->getElementType(),
- Pointers);
+
+ // If the number of subtypes disagree between the two types, then we fail.
+ if (SrcTy->getNumContainedTypes() != DstTy->getNumContainedTypes())
+ return false;
+
+ // Fail if any of the extra properties (e.g. array size) of the type disagree.
+ if (isa<IntegerType>(DstTy))
+ return false; // bitwidth disagrees.
+ if (PointerType *PT = dyn_cast<PointerType>(DstTy)) {
+ if (PT->getAddressSpace() != cast<PointerType>(SrcTy)->getAddressSpace())
+ return false;
+ } else if (FunctionType *FT = dyn_cast<FunctionType>(DstTy)) {
+ if (FT->isVarArg() != cast<FunctionType>(SrcTy)->isVarArg())
+ return false;
+ } else if (StructType *DSTy = dyn_cast<StructType>(DstTy)) {
+ StructType *SSTy = cast<StructType>(SrcTy);
+ if (DSTy->isAnonymous() != SSTy->isAnonymous() ||
+ DSTy->isPacked() != SSTy->isPacked())
+ return false;
+ } else if (ArrayType *DATy = dyn_cast<ArrayType>(DstTy)) {
+ if (DATy->getNumElements() != cast<ArrayType>(SrcTy)->getNumElements())
+ return false;
+ } else if (VectorType *DVTy = dyn_cast<VectorType>(DstTy)) {
+ if (DVTy->getNumElements() != cast<ArrayType>(SrcTy)->getNumElements())
+ return false;
}
- case Type::PointerTyID: {
- const PointerType *DstPT = cast<PointerType>(DstTy);
- const PointerType *SrcPT = cast<PointerType>(SrcTy);
- if (DstPT->getAddressSpace() != SrcPT->getAddressSpace())
- return true;
+ // Otherwise, we speculate that these two types will line up and recursively
+ // check the subelements.
+ Entry = DstTy;
+ SpeculativeTypes.push_back(SrcTy);
+
+ for (unsigned i = 0, e = SrcTy->getNumContainedTypes(); i != e; ++i)
+ if (!areTypesIsomorphic(DstTy->getContainedType(i),
+ SrcTy->getContainedType(i)))
+ return false;
+
+ // If everything seems to have lined up, then everything is great.
+ return true;
+}
- // If this is a pointer type, check to see if we have already seen it. If
- // so, we are in a recursive branch. Cut off the search now. We cannot use
- // an associative container for this search, because the type pointers (keys
- // in the container) change whenever types get resolved.
- if (SrcPT->isAbstract())
- if (const Type *ExistingDestTy = Pointers.lookup(SrcPT))
- return ExistingDestTy != DstPT;
-
- if (DstPT->isAbstract())
- if (const Type *ExistingSrcTy = Pointers.lookup(DstPT))
- return ExistingSrcTy != SrcPT;
- // Otherwise, add the current pointers to the vector to stop recursion on
- // this pair.
- if (DstPT->isAbstract())
- Pointers.insert(DstPT, SrcPT);
- if (SrcPT->isAbstract())
- Pointers.insert(SrcPT, DstPT);
-
- return RecursiveResolveTypesI(DstPT->getElementType(),
- SrcPT->getElementType(), Pointers);
- }
+/// linkDefinedTypeBodies - Produce a body for an opaque type in the dest
+/// module from a type definition in the source module.
+void TypeMapTy::linkDefinedTypeBodies() {
+ SmallVector<Type*, 16> Elements;
+ SmallString<16> TmpName;
+
+ // Note that processing entries in this loop (calling 'get') can add new
+ // entries to the DefinitionsToResolve vector.
+ while (!DefinitionsToResolve.empty()) {
+ StructType *SrcSTy = DefinitionsToResolve.pop_back_val();
+ StructType *DstSTy = cast<StructType>(MappedTypes[SrcSTy]);
+
+ // TypeMap is a many-to-one mapping, if there were multiple types that
+ // provide a body for DstSTy then previous iterations of this loop may have
+ // already handled it. Just ignore this case.
+ if (!DstSTy->isOpaque()) continue;
+ assert(!SrcSTy->isOpaque() && "Not resolving a definition?");
+
+ // Map the body of the source type over to a new body for the dest type.
+ Elements.resize(SrcSTy->getNumElements());
+ for (unsigned i = 0, e = Elements.size(); i != e; ++i)
+ Elements[i] = getImpl(SrcSTy->getElementType(i));
+
+ DstSTy->setBody(Elements, SrcSTy->isPacked());
+
+ // If DstSTy has no name or has a longer name than STy, then viciously steal
+ // STy's name.
+ if (!SrcSTy->hasName()) continue;
+ StringRef SrcName = SrcSTy->getName();
+
+ if (!DstSTy->hasName() || DstSTy->getName().size() > SrcName.size()) {
+ TmpName.insert(TmpName.end(), SrcName.begin(), SrcName.end());
+ SrcSTy->setName("");
+ DstSTy->setName(TmpName.str());
+ TmpName.clear();
+ }
}
}
-static bool RecursiveResolveTypes(const Type *DestTy, const Type *SrcTy) {
- LinkerTypeMap PointerTypes;
- return RecursiveResolveTypesI(DestTy, SrcTy, PointerTypes);
-}
+/// get - Return the mapped type to use for the specified input type from the
+/// source module.
+Type *TypeMapTy::get(Type *Ty) {
+ Type *Result = getImpl(Ty);
+
+ // If this caused a reference to any struct type, resolve it before returning.
+ if (!DefinitionsToResolve.empty())
+ linkDefinedTypeBodies();
+ return Result;
+}
-// LinkTypes - Go through the symbol table of the Src module and see if any
-// types are named in the src module that are not named in the Dst module.
-// Make sure there are no type name conflicts.
-static bool LinkTypes(Module *Dest, const Module *Src, std::string *Err) {
- TypeSymbolTable *DestST = &Dest->getTypeSymbolTable();
- const TypeSymbolTable *SrcST = &Src->getTypeSymbolTable();
-
- // Look for a type plane for Type's...
- TypeSymbolTable::const_iterator TI = SrcST->begin();
- TypeSymbolTable::const_iterator TE = SrcST->end();
- if (TI == TE) return false; // No named types, do nothing.
-
- // Some types cannot be resolved immediately because they depend on other
- // types being resolved to each other first. This contains a list of types we
- // are waiting to recheck.
- std::vector<std::string> DelayedTypesToResolve;
-
- for ( ; TI != TE; ++TI ) {
- const std::string &Name = TI->first;
- const Type *RHS = TI->second;
-
- // Check to see if this type name is already in the dest module.
- Type *Entry = DestST->lookup(Name);
-
- // If the name is just in the source module, bring it over to the dest.
- if (Entry == 0) {
- if (!Name.empty())
- DestST->insert(Name, const_cast<Type*>(RHS));
- } else if (ResolveTypes(Entry, RHS)) {
- // They look different, save the types 'till later to resolve.
- DelayedTypesToResolve.push_back(Name);
+/// getImpl - This is the recursive version of get().
+Type *TypeMapTy::getImpl(Type *Ty) {
+ // If we already have an entry for this type, return it.
+ Type **Entry = &MappedTypes[Ty];
+ if (*Entry) return *Entry;
+
+ // If this is not a named struct type, then just map all of the elements and
+ // then rebuild the type from inside out.
+ if (!isa<StructType>(Ty) || cast<StructType>(Ty)->isAnonymous()) {
+ // If there are no element types to map, then the type is itself. This is
+ // true for the anonymous {} struct, things like 'float', integers, etc.
+ if (Ty->getNumContainedTypes() == 0)
+ return *Entry = Ty;
+
+ // Remap all of the elements, keeping track of whether any of them change.
+ bool AnyChange = false;
+ SmallVector<Type*, 4> ElementTypes;
+ ElementTypes.resize(Ty->getNumContainedTypes());
+ for (unsigned i = 0, e = Ty->getNumContainedTypes(); i != e; ++i) {
+ ElementTypes[i] = getImpl(Ty->getContainedType(i));
+ AnyChange |= ElementTypes[i] != Ty->getContainedType(i);
+ }
+
+ // If we found our type while recursively processing stuff, just use it.
+ Entry = &MappedTypes[Ty];
+ if (*Entry) return *Entry;
+
+ // If all of the element types mapped directly over, then the type is usable
+ // as-is.
+ if (!AnyChange)
+ return *Entry = Ty;
+
+ // Otherwise, rebuild a modified type.
+ switch (Ty->getTypeID()) {
+ default: assert(0 && "unknown derived type to remap");
+ case Type::ArrayTyID:
+ return *Entry = ArrayType::get(ElementTypes[0],
+ cast<ArrayType>(Ty)->getNumElements());
+ case Type::VectorTyID:
+ return *Entry = VectorType::get(ElementTypes[0],
+ cast<VectorType>(Ty)->getNumElements());
+ case Type::PointerTyID:
+ return *Entry = PointerType::get(ElementTypes[0],
+ cast<PointerType>(Ty)->getAddressSpace());
+ case Type::FunctionTyID:
+ return *Entry = FunctionType::get(ElementTypes[0],
+ ArrayRef<Type*>(ElementTypes).slice(1),
+ cast<FunctionType>(Ty)->isVarArg());
+ case Type::StructTyID:
+ // Note that this is only reached for anonymous structs.
+ return *Entry = StructType::get(Ty->getContext(), ElementTypes,
+ cast<StructType>(Ty)->isPacked());
}
}
- // Iteratively resolve types while we can...
- while (!DelayedTypesToResolve.empty()) {
- // Loop over all of the types, attempting to resolve them if possible...
- unsigned OldSize = DelayedTypesToResolve.size();
-
- // Try direct resolution by name...
- for (unsigned i = 0; i != DelayedTypesToResolve.size(); ++i) {
- const std::string &Name = DelayedTypesToResolve[i];
- Type *T1 = SrcST->lookup(Name);
- Type *T2 = DestST->lookup(Name);
- if (!ResolveTypes(T2, T1)) {
- // We are making progress!
- DelayedTypesToResolve.erase(DelayedTypesToResolve.begin()+i);
- --i;
- }
- }
+ // Otherwise, this is an unmapped named struct. If the struct can be directly
+ // mapped over, just use it as-is. This happens in a case when the linked-in
+ // module has something like:
+ // %T = type {%T*, i32}
+ // @GV = global %T* null
+ // where T does not exist at all in the destination module.
+ //
+ // The other case we watch for is when the type is not in the destination
+ // module, but that it has to be rebuilt because it refers to something that
+ // is already mapped. For example, if the destination module has:
+ // %A = type { i32 }
+ // and the source module has something like
+ // %A' = type { i32 }
+ // %B = type { %A'* }
+ // @GV = global %B* null
+ // then we want to create a new type: "%B = type { %A*}" and have it take the
+ // pristine "%B" name from the source module.
+ //
+ // To determine which case this is, we have to recursively walk the type graph
+ // speculating that we'll be able to reuse it unmodified. Only if this is
+ // safe would we map the entire thing over. Because this is an optimization,
+ // and is not required for the prettiness of the linked module, we just skip
+ // it and always rebuild a type here.
+ StructType *STy = cast<StructType>(Ty);
+
+ // If the type is opaque, we can just use it directly.
+ if (STy->isOpaque())
+ return *Entry = STy;
+
+ // Otherwise we create a new type and resolve its body later. This will be
+ // resolved by the top level of get().
+ DefinitionsToResolve.push_back(STy);
+ return *Entry = StructType::createNamed(STy->getContext(), "");
+}
- // Did we not eliminate any types?
- if (DelayedTypesToResolve.size() == OldSize) {
- // Attempt to resolve subelements of types. This allows us to merge these
- // two types: { int* } and { opaque* }
- for (unsigned i = 0, e = DelayedTypesToResolve.size(); i != e; ++i) {
- const std::string &Name = DelayedTypesToResolve[i];
- if (!RecursiveResolveTypes(SrcST->lookup(Name), DestST->lookup(Name))) {
- // We are making progress!
- DelayedTypesToResolve.erase(DelayedTypesToResolve.begin()+i);
-
- // Go back to the main loop, perhaps we can resolve directly by name
- // now...
- break;
- }
- }
- // If we STILL cannot resolve the types, then there is something wrong.
- if (DelayedTypesToResolve.size() == OldSize) {
- // Remove the symbol name from the destination.
- DelayedTypesToResolve.pop_back();
- }
- }
- }
+//===----------------------------------------------------------------------===//
+// ModuleLinker implementation.
+//===----------------------------------------------------------------------===//
- return false;
+namespace {
+ /// ModuleLinker - This is an implementation class for the LinkModules
+ /// function, which is the entrypoint for this file.
+ class ModuleLinker {
+ Module *DstM, *SrcM;
+
+ TypeMapTy TypeMap;
+
+ /// ValueMap - Mapping of values from what they used to be in Src, to what
+ /// they are now in DstM. ValueToValueMapTy is a ValueMap, which involves
+ /// some overhead due to the use of Value handles which the Linker doesn't
+ /// actually need, but this allows us to reuse the ValueMapper code.
+ ValueToValueMapTy ValueMap;
+
+ struct AppendingVarInfo {
+ GlobalVariable *NewGV; // New aggregate global in dest module.
+ Constant *DstInit; // Old initializer from dest module.
+ Constant *SrcInit; // Old initializer from src module.
+ };
+
+ std::vector<AppendingVarInfo> AppendingVars;
+
+ public:
+ std::string ErrorMsg;
+
+ ModuleLinker(Module *dstM, Module *srcM) : DstM(dstM), SrcM(srcM) { }
+
+ bool run();
+
+ private:
+ /// emitError - Helper method for setting a message and returning an error
+ /// code.
+ bool emitError(const Twine &Message) {
+ ErrorMsg = Message.str();
+ return true;
+ }
+
+ /// getLinkageResult - This analyzes the two global values and determines
+ /// what the result will look like in the destination module.
+ bool getLinkageResult(GlobalValue *Dest, const GlobalValue *Src,
+ GlobalValue::LinkageTypes &LT, bool &LinkFromSrc);
+
+ /// getLinkedToGlobal - Given a global in the source module, return the
+ /// global in the destination module that is being linked to, if any.
+ GlobalValue *getLinkedToGlobal(GlobalValue *SrcGV) {
+ // If the source has no name it can't link. If it has local linkage,
+ // there is no name match-up going on.
+ if (!SrcGV->hasName() || SrcGV->hasLocalLinkage())
+ return 0;
+
+ // Otherwise see if we have a match in the destination module's symtab.
+ GlobalValue *DGV = DstM->getNamedValue(SrcGV->getName());
+ if (DGV == 0) return 0;
+
+ // If we found a global with the same name in the dest module, but it has
+ // internal linkage, we are really not doing any linkage here.
+ if (DGV->hasLocalLinkage())
+ return 0;
+
+ // Otherwise, we do in fact link to the destination global.
+ return DGV;
+ }
+
+ void computeTypeMapping();
+
+ bool linkAppendingVarProto(GlobalVariable *DstGV, GlobalVariable *SrcGV);
+ bool linkGlobalProto(GlobalVariable *SrcGV);
+ bool linkFunctionProto(Function *SrcF);
+ bool linkAliasProto(GlobalAlias *SrcA);
+
+ void linkAppendingVarInit(const AppendingVarInfo &AVI);
+ void linkGlobalInits();
+ void linkFunctionBody(Function *Dst, Function *Src);
+ void linkAliasBodies();
+ void linkNamedMDNodes();
+ };
}
-/// ForceRenaming - The LLVM SymbolTable class autorenames globals that conflict
+
+
+/// forceRenaming - The LLVM SymbolTable class autorenames globals that conflict
/// in the symbol table. This is good for all clients except for us. Go
/// through the trouble to force this back.
-static void ForceRenaming(GlobalValue *GV, const std::string &Name) {
- assert(GV->getName() != Name && "Can't force rename to self");
- ValueSymbolTable &ST = GV->getParent()->getValueSymbolTable();
+static void forceRenaming(GlobalValue *GV, StringRef Name) {
+ // If the global doesn't force its name or if it already has the right name,
+ // there is nothing for us to do.
+ if (GV->hasLocalLinkage() || GV->getName() == Name)
+ return;
+
+ Module *M = GV->getParent();
// If there is a conflict, rename the conflict.
- if (GlobalValue *ConflictGV = cast_or_null<GlobalValue>(ST.lookup(Name))) {
- assert(ConflictGV->hasLocalLinkage() &&
- "Not conflicting with a static global, should link instead!");
+ if (GlobalValue *ConflictGV = M->getNamedValue(Name)) {
GV->takeName(ConflictGV);
ConflictGV->setName(Name); // This will cause ConflictGV to get renamed
- assert(ConflictGV->getName() != Name && "ForceRenaming didn't work");
+ assert(ConflictGV->getName() != Name && "forceRenaming didn't work");
} else {
GV->setName(Name); // Force the name back
}
@@ -352,30 +419,33 @@ static void CopyGVAttributes(GlobalValue *DestGV, const GlobalValue *SrcGV) {
unsigned Alignment = std::max(DestGV->getAlignment(), SrcGV->getAlignment());
DestGV->copyAttributesFrom(SrcGV);
DestGV->setAlignment(Alignment);
+
+ forceRenaming(DestGV, SrcGV->getName());
}
-/// GetLinkageResult - This analyzes the two global values and determines what
+/// getLinkageResult - This analyzes the two global values and determines what
/// the result will look like in the destination module. In particular, it
/// computes the resultant linkage type, computes whether the global in the
/// source should be copied over to the destination (replacing the existing
/// one), and computes whether this linkage is an error or not. It also performs
/// visibility checks: we cannot link together two symbols with different
/// visibilities.
-static bool GetLinkageResult(GlobalValue *Dest, const GlobalValue *Src,
- GlobalValue::LinkageTypes &LT, bool &LinkFromSrc,
- std::string *Err) {
- assert((!Dest || !Src->hasLocalLinkage()) &&
+bool ModuleLinker::getLinkageResult(GlobalValue *Dest, const GlobalValue *Src,
+ GlobalValue::LinkageTypes &LT,
+ bool &LinkFromSrc) {
+ assert(Dest && "Must have two globals being queried");
+ assert(!Src->hasLocalLinkage() &&
"If Src has internal linkage, Dest shouldn't be set!");
- if (!Dest) {
- // Linking something to nothing.
- LinkFromSrc = true;
- LT = Src->getLinkage();
- } else if (Src->isDeclaration()) {
+
+ bool SrcIsDeclaration = Src->isDeclaration();
+ bool DestIsDeclaration = Dest->isDeclaration();
+
+ if (SrcIsDeclaration) {
// If Src is external or if both Src & Dest are external.. Just link the
// external globals, we aren't adding anything.
if (Src->hasDLLImportLinkage()) {
// If one of GVs has DLLImport linkage, result should be dllimport'ed.
- if (Dest->isDeclaration()) {
+ if (DestIsDeclaration) {
LinkFromSrc = true;
LT = Src->getLinkage();
}
@@ -387,16 +457,10 @@ static bool GetLinkageResult(GlobalValue *Dest, const GlobalValue *Src,
LinkFromSrc = false;
LT = Dest->getLinkage();
}
- } else if (Dest->isDeclaration() && !Dest->hasDLLImportLinkage()) {
+ } else if (DestIsDeclaration && !Dest->hasDLLImportLinkage()) {
// If Dest is external but Src is not:
LinkFromSrc = true;
LT = Src->getLinkage();
- } else if (Src->hasAppendingLinkage() || Dest->hasAppendingLinkage()) {
- if (Src->getLinkage() != Dest->getLinkage())
- return Error(Err, "Linking globals named '" + Src->getName() +
- "': can only link appending global with another appending global!");
- LinkFromSrc = true; // Special cased.
- LT = Src->getLinkage();
} else if (Src->isWeakForLinker()) {
// At this point we know that Dest has LinkOnce, External*, Weak, Common,
// or DLL* linkage.
@@ -420,883 +484,485 @@ static bool GetLinkageResult(GlobalValue *Dest, const GlobalValue *Src,
LT = GlobalValue::ExternalLinkage;
}
} else {
- assert((Dest->hasExternalLinkage() ||
- Dest->hasDLLImportLinkage() ||
- Dest->hasDLLExportLinkage() ||
- Dest->hasExternalWeakLinkage()) &&
- (Src->hasExternalLinkage() ||
- Src->hasDLLImportLinkage() ||
- Src->hasDLLExportLinkage() ||
- Src->hasExternalWeakLinkage()) &&
+ assert((Dest->hasExternalLinkage() || Dest->hasDLLImportLinkage() ||
+ Dest->hasDLLExportLinkage() || Dest->hasExternalWeakLinkage()) &&
+ (Src->hasExternalLinkage() || Src->hasDLLImportLinkage() ||
+ Src->hasDLLExportLinkage() || Src->hasExternalWeakLinkage()) &&
"Unexpected linkage type!");
- return Error(Err, "Linking globals named '" + Src->getName() +
+ return emitError("Linking globals named '" + Src->getName() +
"': symbol multiply defined!");
}
// Check visibility
- if (Dest && Src->getVisibility() != Dest->getVisibility() &&
- !Src->isDeclaration() && !Dest->isDeclaration() &&
+ if (Src->getVisibility() != Dest->getVisibility() &&
+ !SrcIsDeclaration && !DestIsDeclaration &&
!Src->hasAvailableExternallyLinkage() &&
!Dest->hasAvailableExternallyLinkage())
- return Error(Err, "Linking globals named '" + Src->getName() +
+ return emitError("Linking globals named '" + Src->getName() +
"': symbols have different visibilities!");
return false;
}
-// Insert all of the named mdnoes in Src into the Dest module.
-static void LinkNamedMDNodes(Module *Dest, Module *Src,
- ValueToValueMapTy &ValueMap) {
- for (Module::const_named_metadata_iterator I = Src->named_metadata_begin(),
- E = Src->named_metadata_end(); I != E; ++I) {
- const NamedMDNode *SrcNMD = I;
- NamedMDNode *DestNMD = Dest->getOrInsertNamedMetadata(SrcNMD->getName());
- // Add Src elements into Dest node.
- for (unsigned i = 0, e = SrcNMD->getNumOperands(); i != e; ++i)
- DestNMD->addOperand(cast<MDNode>(MapValue(SrcNMD->getOperand(i),
- ValueMap)));
+/// computeTypeMapping - Loop over all of the linked values to compute type
+/// mappings. For example, if we link "extern Foo *x" and "Foo *x = NULL", then
+/// we have two struct types 'Foo' but one got renamed when the module was
+/// loaded into the same LLVMContext.
+void ModuleLinker::computeTypeMapping() {
+ // Incorporate globals.
+ for (Module::global_iterator I = SrcM->global_begin(),
+ E = SrcM->global_end(); I != E; ++I) {
+ GlobalValue *DGV = getLinkedToGlobal(I);
+ if (DGV == 0) continue;
+
+ if (!DGV->hasAppendingLinkage() || !I->hasAppendingLinkage()) {
+ TypeMap.addTypeMapping(DGV->getType(), I->getType());
+ continue;
+ }
+
+ // Unify the element type of appending arrays.
+ ArrayType *DAT = cast<ArrayType>(DGV->getType()->getElementType());
+ ArrayType *SAT = cast<ArrayType>(I->getType()->getElementType());
+ TypeMap.addTypeMapping(DAT->getElementType(), SAT->getElementType());
+ }
+
+ // Incorporate functions.
+ for (Module::iterator I = SrcM->begin(), E = SrcM->end(); I != E; ++I) {
+ if (GlobalValue *DGV = getLinkedToGlobal(I))
+ TypeMap.addTypeMapping(DGV->getType(), I->getType());
}
+
+ // Don't bother incorporating aliases, they aren't generally typed well.
+
+ // Now that we have discovered all of the type equivalences, get a body for
+ // any 'opaque' types in the dest module that are now resolved.
+ TypeMap.linkDefinedTypeBodies();
}
-// LinkGlobals - Loop through the global variables in the src module and merge
-// them into the dest module.
-static bool LinkGlobals(Module *Dest, const Module *Src,
- ValueToValueMapTy &ValueMap,
- std::multimap<std::string, GlobalVariable *> &AppendingVars,
- std::string *Err) {
- ValueSymbolTable &DestSymTab = Dest->getValueSymbolTable();
-
- // Loop over all of the globals in the src module, mapping them over as we go
- for (Module::const_global_iterator I = Src->global_begin(),
- E = Src->global_end(); I != E; ++I) {
- const GlobalVariable *SGV = I;
- GlobalValue *DGV = 0;
-
- // Check to see if may have to link the global with the global, alias or
- // function.
- if (SGV->hasName() && !SGV->hasLocalLinkage())
- DGV = cast_or_null<GlobalValue>(DestSymTab.lookup(SGV->getName()));
-
- // If we found a global with the same name in the dest module, but it has
- // internal linkage, we are really not doing any linkage here.
- if (DGV && DGV->hasLocalLinkage())
- DGV = 0;
-
- // If types don't agree due to opaque types, try to resolve them.
- if (DGV && DGV->getType() != SGV->getType())
- RecursiveResolveTypes(SGV->getType(), DGV->getType());
-
- assert((SGV->hasInitializer() || SGV->hasExternalWeakLinkage() ||
- SGV->hasExternalLinkage() || SGV->hasDLLImportLinkage()) &&
- "Global must either be external or have an initializer!");
+/// linkAppendingVarProto - If there were any appending global variables, link
+/// them together now. Return true on error.
+bool ModuleLinker::linkAppendingVarProto(GlobalVariable *DstGV,
+ GlobalVariable *SrcGV) {
+
+ if (!SrcGV->hasAppendingLinkage() || !DstGV->hasAppendingLinkage())
+ return emitError("Linking globals named '" + SrcGV->getName() +
+ "': can only link appending global with another appending global!");
+
+ ArrayType *DstTy = cast<ArrayType>(DstGV->getType()->getElementType());
+ ArrayType *SrcTy =
+ cast<ArrayType>(TypeMap.get(SrcGV->getType()->getElementType()));
+ Type *EltTy = DstTy->getElementType();
+
+ // Check to see that they two arrays agree on type.
+ if (EltTy != SrcTy->getElementType())
+ return emitError("Appending variables with different element types!");
+ if (DstGV->isConstant() != SrcGV->isConstant())
+ return emitError("Appending variables linked with different const'ness!");
+
+ if (DstGV->getAlignment() != SrcGV->getAlignment())
+ return emitError(
+ "Appending variables with different alignment need to be linked!");
+
+ if (DstGV->getVisibility() != SrcGV->getVisibility())
+ return emitError(
+ "Appending variables with different visibility need to be linked!");
+
+ if (DstGV->getSection() != SrcGV->getSection())
+ return emitError(
+ "Appending variables with different section name need to be linked!");
+
+ uint64_t NewSize = DstTy->getNumElements() + SrcTy->getNumElements();
+ ArrayType *NewType = ArrayType::get(EltTy, NewSize);
+
+ // Create the new global variable.
+ GlobalVariable *NG =
+ new GlobalVariable(*DstGV->getParent(), NewType, SrcGV->isConstant(),
+ DstGV->getLinkage(), /*init*/0, /*name*/"", DstGV,
+ DstGV->isThreadLocal(),
+ DstGV->getType()->getAddressSpace());
+
+ // Propagate alignment, visibility and section info.
+ CopyGVAttributes(NG, DstGV);
+
+ AppendingVarInfo AVI;
+ AVI.NewGV = NG;
+ AVI.DstInit = DstGV->getInitializer();
+ AVI.SrcInit = SrcGV->getInitializer();
+ AppendingVars.push_back(AVI);
+
+ // Replace any uses of the two global variables with uses of the new
+ // global.
+ ValueMap[SrcGV] = ConstantExpr::getBitCast(NG, TypeMap.get(SrcGV->getType()));
+
+ DstGV->replaceAllUsesWith(ConstantExpr::getBitCast(NG, DstGV->getType()));
+ DstGV->eraseFromParent();
+
+ // Zap the initializer in the source variable so we don't try to link it.
+ SrcGV->setInitializer(0);
+ SrcGV->setLinkage(GlobalValue::ExternalLinkage);
+ return false;
+}
+/// linkGlobalProto - Loop through the global variables in the src module and
+/// merge them into the dest module.
+bool ModuleLinker::linkGlobalProto(GlobalVariable *SGV) {
+ GlobalValue *DGV = getLinkedToGlobal(SGV);
+
+ if (DGV) {
+ // Concatenation of appending linkage variables is magic and handled later.
+ if (DGV->hasAppendingLinkage() || SGV->hasAppendingLinkage())
+ return linkAppendingVarProto(cast<GlobalVariable>(DGV), SGV);
+
+ // Determine whether linkage of these two globals follows the source
+ // module's definition or the destination module's definition.
GlobalValue::LinkageTypes NewLinkage = GlobalValue::InternalLinkage;
bool LinkFromSrc = false;
- if (GetLinkageResult(DGV, SGV, NewLinkage, LinkFromSrc, Err))
+ if (getLinkageResult(DGV, SGV, NewLinkage, LinkFromSrc))
return true;
- if (DGV == 0) {
- // No linking to be performed, simply create an identical version of the
- // symbol over in the dest module... the initializer will be filled in
- // later by LinkGlobalInits.
- GlobalVariable *NewDGV =
- new GlobalVariable(*Dest, SGV->getType()->getElementType(),
- SGV->isConstant(), SGV->getLinkage(), /*init*/0,
- SGV->getName(), 0, false,
- SGV->getType()->getAddressSpace());
- // Propagate alignment, visibility and section info.
- CopyGVAttributes(NewDGV, SGV);
- NewDGV->setUnnamedAddr(SGV->hasUnnamedAddr());
-
- // If the LLVM runtime renamed the global, but it is an externally visible
- // symbol, DGV must be an existing global with internal linkage. Rename
- // it.
- if (!NewDGV->hasLocalLinkage() && NewDGV->getName() != SGV->getName())
- ForceRenaming(NewDGV, SGV->getName());
-
- // Make sure to remember this mapping.
- ValueMap[SGV] = NewDGV;
-
- // Keep track that this is an appending variable.
- if (SGV->hasAppendingLinkage())
- AppendingVars.insert(std::make_pair(SGV->getName(), NewDGV));
- continue;
- }
-
- bool HasUnnamedAddr = SGV->hasUnnamedAddr() && DGV->hasUnnamedAddr();
-
- // If the visibilities of the symbols disagree and the destination is a
- // prototype, take the visibility of its input.
- if (DGV->isDeclaration())
- DGV->setVisibility(SGV->getVisibility());
-
- if (DGV->hasAppendingLinkage()) {
- // No linking is performed yet. Just insert a new copy of the global, and
- // keep track of the fact that it is an appending variable in the
- // AppendingVars map. The name is cleared out so that no linkage is
- // performed.
- GlobalVariable *NewDGV =
- new GlobalVariable(*Dest, SGV->getType()->getElementType(),
- SGV->isConstant(), SGV->getLinkage(), /*init*/0,
- "", 0, false,
- SGV->getType()->getAddressSpace());
-
- // Set alignment allowing CopyGVAttributes merge it with alignment of SGV.
- NewDGV->setAlignment(DGV->getAlignment());
- // Propagate alignment, section and visibility info.
- CopyGVAttributes(NewDGV, SGV);
-
- // Make sure to remember this mapping...
- ValueMap[SGV] = NewDGV;
-
- // Keep track that this is an appending variable...
- AppendingVars.insert(std::make_pair(SGV->getName(), NewDGV));
- continue;
- }
-
- if (LinkFromSrc) {
- if (isa<GlobalAlias>(DGV))
- return Error(Err, "Global-Alias Collision on '" + SGV->getName() +
- "': symbol multiple defined");
-
- // If the types don't match, and if we are to link from the source, nuke
- // DGV and create a new one of the appropriate type. Note that the thing
- // we are replacing may be a function (if a prototype, weak, etc) or a
- // global variable.
- GlobalVariable *NewDGV =
- new GlobalVariable(*Dest, SGV->getType()->getElementType(),
- SGV->isConstant(), NewLinkage, /*init*/0,
- DGV->getName(), 0, false,
- SGV->getType()->getAddressSpace());
-
- // Set the unnamed_addr.
- NewDGV->setUnnamedAddr(HasUnnamedAddr);
-
- // Propagate alignment, section, and visibility info.
- CopyGVAttributes(NewDGV, SGV);
- DGV->replaceAllUsesWith(ConstantExpr::getBitCast(NewDGV,
- DGV->getType()));
-
- // DGV will conflict with NewDGV because they both had the same
- // name. We must erase this now so ForceRenaming doesn't assert
- // because DGV might not have internal linkage.
- if (GlobalVariable *Var = dyn_cast<GlobalVariable>(DGV))
- Var->eraseFromParent();
- else
- cast<Function>(DGV)->eraseFromParent();
-
- // If the symbol table renamed the global, but it is an externally visible
- // symbol, DGV must be an existing global with internal linkage. Rename.
- if (NewDGV->getName() != SGV->getName() && !NewDGV->hasLocalLinkage())
- ForceRenaming(NewDGV, SGV->getName());
-
- // Inherit const as appropriate.
- NewDGV->setConstant(SGV->isConstant());
-
+ // If we're not linking from the source, then keep the definition that we
+ // have.
+ if (!LinkFromSrc) {
+ // Special case for const propagation.
+ if (GlobalVariable *DGVar = dyn_cast<GlobalVariable>(DGV))
+ if (DGVar->isDeclaration() && SGV->isConstant() && !DGVar->isConstant())
+ DGVar->setConstant(true);
+
+ // Set calculated linkage.
+ DGV->setLinkage(NewLinkage);
+
// Make sure to remember this mapping.
- ValueMap[SGV] = NewDGV;
- continue;
+ ValueMap[SGV] = ConstantExpr::getBitCast(DGV,TypeMap.get(SGV->getType()));
+
+ // Destroy the source global's initializer (and convert it to a prototype)
+ // so that we don't attempt to copy it over when processing global
+ // initializers.
+ SGV->setInitializer(0);
+ SGV->setLinkage(GlobalValue::ExternalLinkage);
+ return false;
}
-
- // Not "link from source", keep the one in the DestModule and remap the
- // input onto it.
-
- // Special case for const propagation.
- if (GlobalVariable *DGVar = dyn_cast<GlobalVariable>(DGV))
- if (DGVar->isDeclaration() && SGV->isConstant() && !DGVar->isConstant())
- DGVar->setConstant(true);
-
- // SGV is global, but DGV is alias.
- if (isa<GlobalAlias>(DGV)) {
- // The only valid mappings are:
- // - SGV is external declaration, which is effectively a no-op.
- // - SGV is weak, when we just need to throw SGV out.
- if (!SGV->isDeclaration() && !SGV->isWeakForLinker())
- return Error(Err, "Global-Alias Collision on '" + SGV->getName() +
- "': symbol multiple defined");
- }
-
- // Set calculated linkage and unnamed_addr
- DGV->setLinkage(NewLinkage);
- DGV->setUnnamedAddr(HasUnnamedAddr);
-
- // Make sure to remember this mapping...
- ValueMap[SGV] = ConstantExpr::getBitCast(DGV, SGV->getType());
}
- return false;
-}
-
-static GlobalValue::LinkageTypes
-CalculateAliasLinkage(const GlobalValue *SGV, const GlobalValue *DGV) {
- GlobalValue::LinkageTypes SL = SGV->getLinkage();
- GlobalValue::LinkageTypes DL = DGV->getLinkage();
- if (SL == GlobalValue::ExternalLinkage || DL == GlobalValue::ExternalLinkage)
- return GlobalValue::ExternalLinkage;
- else if (SL == GlobalValue::WeakAnyLinkage ||
- DL == GlobalValue::WeakAnyLinkage)
- return GlobalValue::WeakAnyLinkage;
- else if (SL == GlobalValue::WeakODRLinkage ||
- DL == GlobalValue::WeakODRLinkage)
- return GlobalValue::WeakODRLinkage;
- else if (SL == GlobalValue::InternalLinkage &&
- DL == GlobalValue::InternalLinkage)
- return GlobalValue::InternalLinkage;
- else if (SL == GlobalValue::LinkerPrivateLinkage &&
- DL == GlobalValue::LinkerPrivateLinkage)
- return GlobalValue::LinkerPrivateLinkage;
- else if (SL == GlobalValue::LinkerPrivateWeakLinkage &&
- DL == GlobalValue::LinkerPrivateWeakLinkage)
- return GlobalValue::LinkerPrivateWeakLinkage;
- else if (SL == GlobalValue::LinkerPrivateWeakDefAutoLinkage &&
- DL == GlobalValue::LinkerPrivateWeakDefAutoLinkage)
- return GlobalValue::LinkerPrivateWeakDefAutoLinkage;
- else {
- assert (SL == GlobalValue::PrivateLinkage &&
- DL == GlobalValue::PrivateLinkage && "Unexpected linkage type");
- return GlobalValue::PrivateLinkage;
+
+ // No linking to be performed or linking from the source: simply create an
+ // identical version of the symbol over in the dest module... the
+ // initializer will be filled in later by LinkGlobalInits.
+ GlobalVariable *NewDGV =
+ new GlobalVariable(*DstM, TypeMap.get(SGV->getType()->getElementType()),
+ SGV->isConstant(), SGV->getLinkage(), /*init*/0,
+ SGV->getName(), /*insertbefore*/0,
+ SGV->isThreadLocal(),
+ SGV->getType()->getAddressSpace());
+ // Propagate alignment, visibility and section info.
+ CopyGVAttributes(NewDGV, SGV);
+
+ if (DGV) {
+ DGV->replaceAllUsesWith(ConstantExpr::getBitCast(NewDGV, DGV->getType()));
+ DGV->eraseFromParent();
}
-}
-
-// LinkAlias - Loop through the alias in the src module and link them into the
-// dest module. We're assuming, that all functions/global variables were already
-// linked in.
-static bool LinkAlias(Module *Dest, const Module *Src,
- ValueToValueMapTy &ValueMap,
- std::string *Err) {
- // Loop over all alias in the src module
- for (Module::const_alias_iterator I = Src->alias_begin(),
- E = Src->alias_end(); I != E; ++I) {
- const GlobalAlias *SGA = I;
- const GlobalValue *SAliasee = SGA->getAliasedGlobal();
- GlobalAlias *NewGA = NULL;
-
- // Globals were already linked, thus we can just query ValueMap for variant
- // of SAliasee in Dest.
- ValueToValueMapTy::const_iterator VMI = ValueMap.find(SAliasee);
- assert(VMI != ValueMap.end() && "Aliasee not linked");
- GlobalValue* DAliasee = cast<GlobalValue>(VMI->second);
- GlobalValue* DGV = NULL;
-
- // Fixup aliases to bitcasts. Note that aliases to GEPs are still broken
- // by this, but aliases to GEPs are broken to a lot of other things, so
- // it's less important.
- Constant *DAliaseeConst = DAliasee;
- if (SGA->getType() != DAliasee->getType())
- DAliaseeConst = ConstantExpr::getBitCast(DAliasee, SGA->getType());
-
- // Try to find something 'similar' to SGA in destination module.
- if (!DGV && !SGA->hasLocalLinkage()) {
- DGV = Dest->getNamedAlias(SGA->getName());
-
- // If types don't agree due to opaque types, try to resolve them.
- if (DGV && DGV->getType() != SGA->getType())
- RecursiveResolveTypes(SGA->getType(), DGV->getType());
- }
-
- if (!DGV && !SGA->hasLocalLinkage()) {
- DGV = Dest->getGlobalVariable(SGA->getName());
-
- // If types don't agree due to opaque types, try to resolve them.
- if (DGV && DGV->getType() != SGA->getType())
- RecursiveResolveTypes(SGA->getType(), DGV->getType());
- }
-
- if (!DGV && !SGA->hasLocalLinkage()) {
- DGV = Dest->getFunction(SGA->getName());
-
- // If types don't agree due to opaque types, try to resolve them.
- if (DGV && DGV->getType() != SGA->getType())
- RecursiveResolveTypes(SGA->getType(), DGV->getType());
- }
-
- // No linking to be performed on internal stuff.
- if (DGV && DGV->hasLocalLinkage())
- DGV = NULL;
-
- if (GlobalAlias *DGA = dyn_cast_or_null<GlobalAlias>(DGV)) {
- // Types are known to be the same, check whether aliasees equal. As
- // globals are already linked we just need query ValueMap to find the
- // mapping.
- if (DAliasee == DGA->getAliasedGlobal()) {
- // This is just two copies of the same alias. Propagate linkage, if
- // necessary.
- DGA->setLinkage(CalculateAliasLinkage(SGA, DGA));
-
- NewGA = DGA;
- // Proceed to 'common' steps
- } else
- return Error(Err, "Alias Collision on '" + SGA->getName()+
- "': aliases have different aliasees");
- } else if (GlobalVariable *DGVar = dyn_cast_or_null<GlobalVariable>(DGV)) {
- // The only allowed way is to link alias with external declaration or weak
- // symbol..
- if (DGVar->isDeclaration() || DGVar->isWeakForLinker()) {
- // But only if aliasee is global too...
- if (!isa<GlobalVariable>(DAliasee))
- return Error(Err, "Global-Alias Collision on '" + SGA->getName() +
- "': aliasee is not global variable");
-
- NewGA = new GlobalAlias(SGA->getType(), SGA->getLinkage(),
- SGA->getName(), DAliaseeConst, Dest);
- CopyGVAttributes(NewGA, SGA);
-
- // Any uses of DGV need to change to NewGA, with cast, if needed.
- if (SGA->getType() != DGVar->getType())
- DGVar->replaceAllUsesWith(ConstantExpr::getBitCast(NewGA,
- DGVar->getType()));
- else
- DGVar->replaceAllUsesWith(NewGA);
-
- // DGVar will conflict with NewGA because they both had the same
- // name. We must erase this now so ForceRenaming doesn't assert
- // because DGV might not have internal linkage.
- DGVar->eraseFromParent();
-
- // Proceed to 'common' steps
- } else
- return Error(Err, "Global-Alias Collision on '" + SGA->getName() +
- "': symbol multiple defined");
- } else if (Function *DF = dyn_cast_or_null<Function>(DGV)) {
- // The only allowed way is to link alias with external declaration or weak
- // symbol...
- if (DF->isDeclaration() || DF->isWeakForLinker()) {
- // But only if aliasee is function too...
- if (!isa<Function>(DAliasee))
- return Error(Err, "Function-Alias Collision on '" + SGA->getName() +
- "': aliasee is not function");
-
- NewGA = new GlobalAlias(SGA->getType(), SGA->getLinkage(),
- SGA->getName(), DAliaseeConst, Dest);
- CopyGVAttributes(NewGA, SGA);
-
- // Any uses of DF need to change to NewGA, with cast, if needed.
- if (SGA->getType() != DF->getType())
- DF->replaceAllUsesWith(ConstantExpr::getBitCast(NewGA,
- DF->getType()));
- else
- DF->replaceAllUsesWith(NewGA);
-
- // DF will conflict with NewGA because they both had the same
- // name. We must erase this now so ForceRenaming doesn't assert
- // because DF might not have internal linkage.
- DF->eraseFromParent();
-
- // Proceed to 'common' steps
- } else
- return Error(Err, "Function-Alias Collision on '" + SGA->getName() +
- "': symbol multiple defined");
- } else {
- // No linking to be performed, simply create an identical version of the
- // alias over in the dest module...
- NewGA = new GlobalAlias(SGA->getType(), SGA->getLinkage(),
- SGA->getName(), DAliaseeConst, Dest);
- CopyGVAttributes(NewGA, SGA);
-
- // Proceed to 'common' steps
- }
-
- assert(NewGA && "No alias was created in destination module!");
-
- // If the symbol table renamed the alias, but it is an externally visible
- // symbol, DGA must be an global value with internal linkage. Rename it.
- if (NewGA->getName() != SGA->getName() &&
- !NewGA->hasLocalLinkage())
- ForceRenaming(NewGA, SGA->getName());
-
- // Remember this mapping so uses in the source module get remapped
- // later by MapValue.
- ValueMap[SGA] = NewGA;
- }
-
+
+ // Make sure to remember this mapping.
+ ValueMap[SGV] = NewDGV;
return false;
}
+/// linkFunctionProto - Link the function in the source module into the
+/// destination module if needed, setting up mapping information.
+bool ModuleLinker::linkFunctionProto(Function *SF) {
+ GlobalValue *DGV = getLinkedToGlobal(SF);
-// LinkGlobalInits - Update the initializers in the Dest module now that all
-// globals that may be referenced are in Dest.
-static bool LinkGlobalInits(Module *Dest, const Module *Src,
- ValueToValueMapTy &ValueMap,
- std::string *Err) {
- // Loop over all of the globals in the src module, mapping them over as we go
- for (Module::const_global_iterator I = Src->global_begin(),
- E = Src->global_end(); I != E; ++I) {
- const GlobalVariable *SGV = I;
-
- if (SGV->hasInitializer()) { // Only process initialized GV's
- // Figure out what the initializer looks like in the dest module.
- Constant *SInit =
- cast<Constant>(MapValue(SGV->getInitializer(), ValueMap));
- // Grab destination global variable or alias.
- GlobalValue *DGV = cast<GlobalValue>(ValueMap[SGV]->stripPointerCasts());
-
- // If dest if global variable, check that initializers match.
- if (GlobalVariable *DGVar = dyn_cast<GlobalVariable>(DGV)) {
- if (DGVar->hasInitializer()) {
- if (SGV->hasExternalLinkage()) {
- if (DGVar->getInitializer() != SInit)
- return Error(Err, "Global Variable Collision on '" +
- SGV->getName() +
- "': global variables have different initializers");
- } else if (DGVar->isWeakForLinker()) {
- // Nothing is required, mapped values will take the new global
- // automatically.
- } else if (SGV->isWeakForLinker()) {
- // Nothing is required, mapped values will take the new global
- // automatically.
- } else if (DGVar->hasAppendingLinkage()) {
- llvm_unreachable("Appending linkage unimplemented!");
- } else {
- llvm_unreachable("Unknown linkage!");
- }
- } else {
- // Copy the initializer over now...
- DGVar->setInitializer(SInit);
- }
- } else {
- // Destination is alias, the only valid situation is when source is
- // weak. Also, note, that we already checked linkage in LinkGlobals(),
- // thus we assert here.
- // FIXME: Should we weaken this assumption, 'dereference' alias and
- // check for initializer of aliasee?
- assert(SGV->isWeakForLinker());
- }
+ if (DGV) {
+ GlobalValue::LinkageTypes NewLinkage = GlobalValue::InternalLinkage;
+ bool LinkFromSrc = false;
+ if (getLinkageResult(DGV, SF, NewLinkage, LinkFromSrc))
+ return true;
+
+ if (!LinkFromSrc) {
+ // Set calculated linkage
+ DGV->setLinkage(NewLinkage);
+
+ // Make sure to remember this mapping.
+ ValueMap[SF] = ConstantExpr::getBitCast(DGV, TypeMap.get(SF->getType()));
+
+ // Remove the body from the source module so we don't attempt to remap it.
+ SF->deleteBody();
+ return false;
}
}
+
+ // If there is no linkage to be performed or we are linking from the source,
+ // bring SF over.
+ Function *NewDF = Function::Create(TypeMap.get(SF->getFunctionType()),
+ SF->getLinkage(), SF->getName(), DstM);
+ CopyGVAttributes(NewDF, SF);
+
+ if (DGV) {
+ // Any uses of DF need to change to NewDF, with cast.
+ DGV->replaceAllUsesWith(ConstantExpr::getBitCast(NewDF, DGV->getType()));
+ DGV->eraseFromParent();
+ }
+
+ ValueMap[SF] = NewDF;
return false;
}
-// LinkFunctionProtos - Link the functions together between the two modules,
-// without doing function bodies... this just adds external function prototypes
-// to the Dest function...
-//
-static bool LinkFunctionProtos(Module *Dest, const Module *Src,
- ValueToValueMapTy &ValueMap,
- std::string *Err) {
- ValueSymbolTable &DestSymTab = Dest->getValueSymbolTable();
-
- // Loop over all of the functions in the src module, mapping them over
- for (Module::const_iterator I = Src->begin(), E = Src->end(); I != E; ++I) {
- const Function *SF = I; // SrcFunction
- GlobalValue *DGV = 0;
-
- // Check to see if may have to link the function with the global, alias or
- // function.
- if (SF->hasName() && !SF->hasLocalLinkage())
- DGV = cast_or_null<GlobalValue>(DestSymTab.lookup(SF->getName()));
-
- // If we found a global with the same name in the dest module, but it has
- // internal linkage, we are really not doing any linkage here.
- if (DGV && DGV->hasLocalLinkage())
- DGV = 0;
-
- // If types don't agree due to opaque types, try to resolve them.
- if (DGV && DGV->getType() != SF->getType())
- RecursiveResolveTypes(SF->getType(), DGV->getType());
-
+/// LinkAliasProto - Set up prototypes for any aliases that come over from the
+/// source module.
+bool ModuleLinker::linkAliasProto(GlobalAlias *SGA) {
+ GlobalValue *DGV = getLinkedToGlobal(SGA);
+
+ if (DGV) {
GlobalValue::LinkageTypes NewLinkage = GlobalValue::InternalLinkage;
bool LinkFromSrc = false;
- if (GetLinkageResult(DGV, SF, NewLinkage, LinkFromSrc, Err))
+ if (getLinkageResult(DGV, SGA, NewLinkage, LinkFromSrc))
return true;
-
- // If there is no linkage to be performed, just bring over SF without
- // modifying it.
- if (DGV == 0) {
- // Function does not already exist, simply insert an function signature
- // identical to SF into the dest module.
- Function *NewDF = Function::Create(SF->getFunctionType(),
- SF->getLinkage(),
- SF->getName(), Dest);
- CopyGVAttributes(NewDF, SF);
-
- // If the LLVM runtime renamed the function, but it is an externally
- // visible symbol, DF must be an existing function with internal linkage.
- // Rename it.
- if (!NewDF->hasLocalLinkage() && NewDF->getName() != SF->getName())
- ForceRenaming(NewDF, SF->getName());
-
- // ... and remember this mapping...
- ValueMap[SF] = NewDF;
- continue;
- }
-
- // If the visibilities of the symbols disagree and the destination is a
- // prototype, take the visibility of its input.
- if (DGV->isDeclaration())
- DGV->setVisibility(SF->getVisibility());
-
- if (LinkFromSrc) {
- if (isa<GlobalAlias>(DGV))
- return Error(Err, "Function-Alias Collision on '" + SF->getName() +
- "': symbol multiple defined");
-
- // We have a definition of the same name but different type in the
- // source module. Copy the prototype to the destination and replace
- // uses of the destination's prototype with the new prototype.
- Function *NewDF = Function::Create(SF->getFunctionType(), NewLinkage,
- SF->getName(), Dest);
- CopyGVAttributes(NewDF, SF);
-
- // Any uses of DF need to change to NewDF, with cast
- DGV->replaceAllUsesWith(ConstantExpr::getBitCast(NewDF,
- DGV->getType()));
-
- // DF will conflict with NewDF because they both had the same. We must
- // erase this now so ForceRenaming doesn't assert because DF might
- // not have internal linkage.
- if (GlobalVariable *Var = dyn_cast<GlobalVariable>(DGV))
- Var->eraseFromParent();
- else
- cast<Function>(DGV)->eraseFromParent();
-
- // If the symbol table renamed the function, but it is an externally
- // visible symbol, DF must be an existing function with internal
- // linkage. Rename it.
- if (NewDF->getName() != SF->getName() && !NewDF->hasLocalLinkage())
- ForceRenaming(NewDF, SF->getName());
-
- // Remember this mapping so uses in the source module get remapped
- // later by MapValue.
- ValueMap[SF] = NewDF;
- continue;
+
+ if (!LinkFromSrc) {
+ // Set calculated linkage.
+ DGV->setLinkage(NewLinkage);
+
+ // Make sure to remember this mapping.
+ ValueMap[SGA] = ConstantExpr::getBitCast(DGV,TypeMap.get(SGA->getType()));
+
+ // Remove the body from the source module so we don't attempt to remap it.
+ SGA->setAliasee(0);
+ return false;
}
+ }
+
+ // If there is no linkage to be performed or we're linking from the source,
+ // bring over SGA.
+ GlobalAlias *NewDA = new GlobalAlias(TypeMap.get(SGA->getType()),
+ SGA->getLinkage(), SGA->getName(),
+ /*aliasee*/0, DstM);
+ CopyGVAttributes(NewDA, SGA);
+
+ if (DGV) {
+ // Any uses of DGV need to change to NewDA, with cast.
+ DGV->replaceAllUsesWith(ConstantExpr::getBitCast(NewDA, DGV->getType()));
+ DGV->eraseFromParent();
+ }
+
+ ValueMap[SGA] = NewDA;
+ return false;
+}
- // Not "link from source", keep the one in the DestModule and remap the
- // input onto it.
-
- if (isa<GlobalAlias>(DGV)) {
- // The only valid mappings are:
- // - SF is external declaration, which is effectively a no-op.
- // - SF is weak, when we just need to throw SF out.
- if (!SF->isDeclaration() && !SF->isWeakForLinker())
- return Error(Err, "Function-Alias Collision on '" + SF->getName() +
- "': symbol multiple defined");
- }
+void ModuleLinker::linkAppendingVarInit(const AppendingVarInfo &AVI) {
+ // Merge the initializer.
+ SmallVector<Constant*, 16> Elements;
+ if (ConstantArray *I = dyn_cast<ConstantArray>(AVI.DstInit)) {
+ for (unsigned i = 0, e = I->getNumOperands(); i != e; ++i)
+ Elements.push_back(I->getOperand(i));
+ } else {
+ assert(isa<ConstantAggregateZero>(AVI.DstInit));
+ ArrayType *DstAT = cast<ArrayType>(AVI.DstInit->getType());
+ Type *EltTy = DstAT->getElementType();
+ Elements.append(DstAT->getNumElements(), Constant::getNullValue(EltTy));
+ }
+
+ Constant *SrcInit = MapValue(AVI.SrcInit, ValueMap, RF_None, &TypeMap);
+ if (const ConstantArray *I = dyn_cast<ConstantArray>(SrcInit)) {
+ for (unsigned i = 0, e = I->getNumOperands(); i != e; ++i)
+ Elements.push_back(I->getOperand(i));
+ } else {
+ assert(isa<ConstantAggregateZero>(SrcInit));
+ ArrayType *SrcAT = cast<ArrayType>(SrcInit->getType());
+ Type *EltTy = SrcAT->getElementType();
+ Elements.append(SrcAT->getNumElements(), Constant::getNullValue(EltTy));
+ }
+ ArrayType *NewType = cast<ArrayType>(AVI.NewGV->getType()->getElementType());
+ AVI.NewGV->setInitializer(ConstantArray::get(NewType, Elements));
+}
- // Set calculated linkage
- DGV->setLinkage(NewLinkage);
- // Make sure to remember this mapping.
- ValueMap[SF] = ConstantExpr::getBitCast(DGV, SF->getType());
+// linkGlobalInits - Update the initializers in the Dest module now that all
+// globals that may be referenced are in Dest.
+void ModuleLinker::linkGlobalInits() {
+ // Loop over all of the globals in the src module, mapping them over as we go
+ for (Module::const_global_iterator I = SrcM->global_begin(),
+ E = SrcM->global_end(); I != E; ++I) {
+ if (!I->hasInitializer()) continue; // Only process initialized GV's.
+
+ // Grab destination global variable.
+ GlobalVariable *DGV = cast<GlobalVariable>(ValueMap[I]);
+ // Figure out what the initializer looks like in the dest module.
+ DGV->setInitializer(MapValue(I->getInitializer(), ValueMap,
+ RF_None, &TypeMap));
}
- return false;
}
-// LinkFunctionBody - Copy the source function over into the dest function and
+// linkFunctionBody - Copy the source function over into the dest function and
// fix up references to values. At this point we know that Dest is an external
// function, and that Src is not.
-static bool LinkFunctionBody(Function *Dest, Function *Src,
- ValueToValueMapTy &ValueMap,
- std::string *Err) {
- assert(Src && Dest && Dest->isDeclaration() && !Src->isDeclaration());
+void ModuleLinker::linkFunctionBody(Function *Dst, Function *Src) {
+ assert(Src && Dst && Dst->isDeclaration() && !Src->isDeclaration());
// Go through and convert function arguments over, remembering the mapping.
- Function::arg_iterator DI = Dest->arg_begin();
+ Function::arg_iterator DI = Dst->arg_begin();
for (Function::arg_iterator I = Src->arg_begin(), E = Src->arg_end();
I != E; ++I, ++DI) {
- DI->setName(I->getName()); // Copy the name information over...
+ DI->setName(I->getName()); // Copy the name over.
- // Add a mapping to our local map
+ // Add a mapping to our mapping.
ValueMap[I] = DI;
}
// Splice the body of the source function into the dest function.
- Dest->getBasicBlockList().splice(Dest->end(), Src->getBasicBlockList());
+ Dst->getBasicBlockList().splice(Dst->end(), Src->getBasicBlockList());
// At this point, all of the instructions and values of the function are now
// copied over. The only problem is that they are still referencing values in
// the Source function as operands. Loop through all of the operands of the
// functions and patch them up to point to the local versions.
- for (Function::iterator BB = Dest->begin(), BE = Dest->end(); BB != BE; ++BB)
+ for (Function::iterator BB = Dst->begin(), BE = Dst->end(); BB != BE; ++BB)
for (BasicBlock::iterator I = BB->begin(), E = BB->end(); I != E; ++I)
- RemapInstruction(I, ValueMap, RF_IgnoreMissingEntries);
+ RemapInstruction(I, ValueMap, RF_IgnoreMissingEntries, &TypeMap);
// There is no need to map the arguments anymore.
for (Function::arg_iterator I = Src->arg_begin(), E = Src->arg_end();
I != E; ++I)
ValueMap.erase(I);
-
- return false;
}
-// LinkFunctionBodies - Link in the function bodies that are defined in the
-// source module into the DestModule. This consists basically of copying the
-// function over and fixing up references to values.
-static bool LinkFunctionBodies(Module *Dest, Module *Src,
- ValueToValueMapTy &ValueMap,
- std::string *Err) {
-
- // Loop over all of the functions in the src module, mapping them over as we
- // go
- for (Module::iterator SF = Src->begin(), E = Src->end(); SF != E; ++SF) {
- if (!SF->isDeclaration()) { // No body if function is external
- Function *DF = dyn_cast<Function>(ValueMap[SF]); // Destination function
-
- // DF not external SF external?
- if (DF && DF->isDeclaration())
- // Only provide the function body if there isn't one already.
- if (LinkFunctionBody(DF, SF, ValueMap, Err))
- return true;
+void ModuleLinker::linkAliasBodies() {
+ for (Module::alias_iterator I = SrcM->alias_begin(), E = SrcM->alias_end();
+ I != E; ++I)
+ if (Constant *Aliasee = I->getAliasee()) {
+ GlobalAlias *DA = cast<GlobalAlias>(ValueMap[I]);
+ DA->setAliasee(MapValue(Aliasee, ValueMap, RF_None, &TypeMap));
}
- }
- return false;
}
-// LinkAppendingVars - If there were any appending global variables, link them
-// together now. Return true on error.
-static bool LinkAppendingVars(Module *M,
- std::multimap<std::string, GlobalVariable *> &AppendingVars,
- std::string *ErrorMsg) {
- if (AppendingVars.empty()) return false; // Nothing to do.
-
- // Loop over the multimap of appending vars, processing any variables with the
- // same name, forming a new appending global variable with both of the
- // initializers merged together, then rewrite references to the old variables
- // and delete them.
- std::vector<Constant*> Inits;
- while (AppendingVars.size() > 1) {
- // Get the first two elements in the map...
- std::multimap<std::string,
- GlobalVariable*>::iterator Second = AppendingVars.begin(), First=Second++;
-
- // If the first two elements are for different names, there is no pair...
- // Otherwise there is a pair, so link them together...
- if (First->first == Second->first) {
- GlobalVariable *G1 = First->second, *G2 = Second->second;
- const ArrayType *T1 = cast<ArrayType>(G1->getType()->getElementType());
- const ArrayType *T2 = cast<ArrayType>(G2->getType()->getElementType());
-
- // Check to see that they two arrays agree on type...
- if (T1->getElementType() != T2->getElementType())
- return Error(ErrorMsg,
- "Appending variables with different element types need to be linked!");
- if (G1->isConstant() != G2->isConstant())
- return Error(ErrorMsg,
- "Appending variables linked with different const'ness!");
-
- if (G1->getAlignment() != G2->getAlignment())
- return Error(ErrorMsg,
- "Appending variables with different alignment need to be linked!");
-
- if (G1->getVisibility() != G2->getVisibility())
- return Error(ErrorMsg,
- "Appending variables with different visibility need to be linked!");
-
- if (G1->getSection() != G2->getSection())
- return Error(ErrorMsg,
- "Appending variables with different section name need to be linked!");
-
- unsigned NewSize = T1->getNumElements() + T2->getNumElements();
- ArrayType *NewType = ArrayType::get(T1->getElementType(),
- NewSize);
-
- G1->setName(""); // Clear G1's name in case of a conflict!
-
- // Create the new global variable...
- GlobalVariable *NG =
- new GlobalVariable(*M, NewType, G1->isConstant(), G1->getLinkage(),
- /*init*/0, First->first, 0, G1->isThreadLocal(),
- G1->getType()->getAddressSpace());
-
- // Propagate alignment, visibility and section info.
- CopyGVAttributes(NG, G1);
-
- // Merge the initializer...
- Inits.reserve(NewSize);
- if (ConstantArray *I = dyn_cast<ConstantArray>(G1->getInitializer())) {
- for (unsigned i = 0, e = T1->getNumElements(); i != e; ++i)
- Inits.push_back(I->getOperand(i));
- } else {
- assert(isa<ConstantAggregateZero>(G1->getInitializer()));
- Constant *CV = Constant::getNullValue(T1->getElementType());
- for (unsigned i = 0, e = T1->getNumElements(); i != e; ++i)
- Inits.push_back(CV);
- }
- if (ConstantArray *I = dyn_cast<ConstantArray>(G2->getInitializer())) {
- for (unsigned i = 0, e = T2->getNumElements(); i != e; ++i)
- Inits.push_back(I->getOperand(i));
- } else {
- assert(isa<ConstantAggregateZero>(G2->getInitializer()));
- Constant *CV = Constant::getNullValue(T2->getElementType());
- for (unsigned i = 0, e = T2->getNumElements(); i != e; ++i)
- Inits.push_back(CV);
- }
- NG->setInitializer(ConstantArray::get(NewType, Inits));
- Inits.clear();
-
- // Replace any uses of the two global variables with uses of the new
- // global...
-
- // FIXME: This should rewrite simple/straight-forward uses such as
- // getelementptr instructions to not use the Cast!
- G1->replaceAllUsesWith(ConstantExpr::getBitCast(NG,
- G1->getType()));
- G2->replaceAllUsesWith(ConstantExpr::getBitCast(NG,
- G2->getType()));
-
- // Remove the two globals from the module now...
- M->getGlobalList().erase(G1);
- M->getGlobalList().erase(G2);
-
- // Put the new global into the AppendingVars map so that we can handle
- // linking of more than two vars...
- Second->second = NG;
- }
- AppendingVars.erase(First);
+/// linkNamedMDNodes - Insert all of the named mdnodes in Src into the Dest
+/// module.
+void ModuleLinker::linkNamedMDNodes() {
+ for (Module::const_named_metadata_iterator I = SrcM->named_metadata_begin(),
+ E = SrcM->named_metadata_end(); I != E; ++I) {
+ NamedMDNode *DestNMD = DstM->getOrInsertNamedMetadata(I->getName());
+ // Add Src elements into Dest node.
+ for (unsigned i = 0, e = I->getNumOperands(); i != e; ++i)
+ DestNMD->addOperand(MapValue(I->getOperand(i), ValueMap,
+ RF_None, &TypeMap));
}
-
- return false;
}
+
+bool ModuleLinker::run() {
+ assert(DstM && "Null Destination module");
+ assert(SrcM && "Null Source Module");
-static bool ResolveAliases(Module *Dest) {
- for (Module::alias_iterator I = Dest->alias_begin(), E = Dest->alias_end();
- I != E; ++I)
- // We can't sue resolveGlobalAlias here because we need to preserve
- // bitcasts and GEPs.
- if (const Constant *C = I->getAliasee()) {
- while (dyn_cast<GlobalAlias>(C))
- C = cast<GlobalAlias>(C)->getAliasee();
- const GlobalValue *GV = dyn_cast<GlobalValue>(C);
- if (C != I && !(GV && GV->isDeclaration()))
- I->replaceAllUsesWith(const_cast<Constant*>(C));
- }
-
- return false;
-}
-
-// LinkModules - This function links two modules together, with the resulting
-// left module modified to be the composite of the two input modules. If an
-// error occurs, true is returned and ErrorMsg (if not null) is set to indicate
-// the problem. Upon failure, the Dest module could be in a modified state, and
-// shouldn't be relied on to be consistent.
-bool
-Linker::LinkModules(Module *Dest, Module *Src, std::string *ErrorMsg) {
- assert(Dest != 0 && "Invalid Destination module");
- assert(Src != 0 && "Invalid Source Module");
-
- if (Dest->getDataLayout().empty()) {
- if (!Src->getDataLayout().empty()) {
- Dest->setDataLayout(Src->getDataLayout());
- } else {
- std::string DataLayout;
-
- if (Dest->getEndianness() == Module::AnyEndianness) {
- if (Src->getEndianness() == Module::BigEndian)
- DataLayout.append("E");
- else if (Src->getEndianness() == Module::LittleEndian)
- DataLayout.append("e");
- }
-
- if (Dest->getPointerSize() == Module::AnyPointerSize) {
- if (Src->getPointerSize() == Module::Pointer64)
- DataLayout.append(DataLayout.length() == 0 ? "p:64:64" : "-p:64:64");
- else if (Src->getPointerSize() == Module::Pointer32)
- DataLayout.append(DataLayout.length() == 0 ? "p:32:32" : "-p:32:32");
- }
- Dest->setDataLayout(DataLayout);
- }
- }
+ // Inherit the target data from the source module if the destination module
+ // doesn't have one already.
+ if (DstM->getDataLayout().empty() && !SrcM->getDataLayout().empty())
+ DstM->setDataLayout(SrcM->getDataLayout());
// Copy the target triple from the source to dest if the dest's is empty.
- if (Dest->getTargetTriple().empty() && !Src->getTargetTriple().empty())
- Dest->setTargetTriple(Src->getTargetTriple());
+ if (DstM->getTargetTriple().empty() && !SrcM->getTargetTriple().empty())
+ DstM->setTargetTriple(SrcM->getTargetTriple());
- if (!Src->getDataLayout().empty() && !Dest->getDataLayout().empty() &&
- Src->getDataLayout() != Dest->getDataLayout())
+ if (!SrcM->getDataLayout().empty() && !DstM->getDataLayout().empty() &&
+ SrcM->getDataLayout() != DstM->getDataLayout())
errs() << "WARNING: Linking two modules of different data layouts!\n";
- if (!Src->getTargetTriple().empty() &&
- Dest->getTargetTriple() != Src->getTargetTriple()) {
+ if (!SrcM->getTargetTriple().empty() &&
+ DstM->getTargetTriple() != SrcM->getTargetTriple()) {
errs() << "WARNING: Linking two modules of different target triples: ";
- if (!Src->getModuleIdentifier().empty())
- errs() << Src->getModuleIdentifier() << ": ";
- errs() << "'" << Src->getTargetTriple() << "' and '"
- << Dest->getTargetTriple() << "'\n";
+ if (!SrcM->getModuleIdentifier().empty())
+ errs() << SrcM->getModuleIdentifier() << ": ";
+ errs() << "'" << SrcM->getTargetTriple() << "' and '"
+ << DstM->getTargetTriple() << "'\n";
}
// Append the module inline asm string.
- if (!Src->getModuleInlineAsm().empty()) {
- if (Dest->getModuleInlineAsm().empty())
- Dest->setModuleInlineAsm(Src->getModuleInlineAsm());
+ if (!SrcM->getModuleInlineAsm().empty()) {
+ if (DstM->getModuleInlineAsm().empty())
+ DstM->setModuleInlineAsm(SrcM->getModuleInlineAsm());
else
- Dest->setModuleInlineAsm(Dest->getModuleInlineAsm()+"\n"+
- Src->getModuleInlineAsm());
+ DstM->setModuleInlineAsm(DstM->getModuleInlineAsm()+"\n"+
+ SrcM->getModuleInlineAsm());
}
// Update the destination module's dependent libraries list with the libraries
// from the source module. There's no opportunity for duplicates here as the
// Module ensures that duplicate insertions are discarded.
- for (Module::lib_iterator SI = Src->lib_begin(), SE = Src->lib_end();
+ for (Module::lib_iterator SI = SrcM->lib_begin(), SE = SrcM->lib_end();
SI != SE; ++SI)
- Dest->addLibrary(*SI);
+ DstM->addLibrary(*SI);
+
+ // If the source library's module id is in the dependent library list of the
+ // destination library, remove it since that module is now linked in.
+ StringRef ModuleId = SrcM->getModuleIdentifier();
+ if (!ModuleId.empty())
+ DstM->removeLibrary(sys::path::stem(ModuleId));
- // LinkTypes - Go through the symbol table of the Src module and see if any
- // types are named in the src module that are not named in the Dst module.
- // Make sure there are no type name conflicts.
- if (LinkTypes(Dest, Src, ErrorMsg))
- return true;
+
+ // Loop over all of the linked values to compute type mappings.
+ computeTypeMapping();
- // ValueMap - Mapping of values from what they used to be in Src, to what they
- // are now in Dest. ValueToValueMapTy is a ValueMap, which involves some
- // overhead due to the use of Value handles which the Linker doesn't actually
- // need, but this allows us to reuse the ValueMapper code.
- ValueToValueMapTy ValueMap;
-
- // AppendingVars - Keep track of global variables in the destination module
- // with appending linkage. After the module is linked together, they are
- // appended and the module is rewritten.
- std::multimap<std::string, GlobalVariable *> AppendingVars;
- for (Module::global_iterator I = Dest->global_begin(), E = Dest->global_end();
- I != E; ++I) {
- // Add all of the appending globals already in the Dest module to
- // AppendingVars.
- if (I->hasAppendingLinkage())
- AppendingVars.insert(std::make_pair(I->getName(), I));
- }
+ // Remap all of the named mdnoes in Src into the DstM module. We do this
+ // after linking GlobalValues so that MDNodes that reference GlobalValues
+ // are properly remapped.
+ linkNamedMDNodes();
- // Insert all of the globals in src into the Dest module... without linking
+ // Insert all of the globals in src into the DstM module... without linking
// initializers (which could refer to functions not yet mapped over).
- if (LinkGlobals(Dest, Src, ValueMap, AppendingVars, ErrorMsg))
- return true;
+ for (Module::global_iterator I = SrcM->global_begin(),
+ E = SrcM->global_end(); I != E; ++I)
+ if (linkGlobalProto(I))
+ return true;
// Link the functions together between the two modules, without doing function
- // bodies... this just adds external function prototypes to the Dest
+ // bodies... this just adds external function prototypes to the DstM
// function... We do this so that when we begin processing function bodies,
// all of the global values that may be referenced are available in our
// ValueMap.
- if (LinkFunctionProtos(Dest, Src, ValueMap, ErrorMsg))
- return true;
-
- // If there were any alias, link them now. We really need to do this now,
- // because all of the aliases that may be referenced need to be available in
- // ValueMap
- if (LinkAlias(Dest, Src, ValueMap, ErrorMsg)) return true;
-
- // Update the initializers in the Dest module now that all globals that may
- // be referenced are in Dest.
- if (LinkGlobalInits(Dest, Src, ValueMap, ErrorMsg)) return true;
+ for (Module::iterator I = SrcM->begin(), E = SrcM->end(); I != E; ++I)
+ if (linkFunctionProto(I))
+ return true;
- // Link in the function bodies that are defined in the source module into the
- // DestModule. This consists basically of copying the function over and
- // fixing up references to values.
- if (LinkFunctionBodies(Dest, Src, ValueMap, ErrorMsg)) return true;
+ // If there were any aliases, link them now.
+ for (Module::alias_iterator I = SrcM->alias_begin(),
+ E = SrcM->alias_end(); I != E; ++I)
+ if (linkAliasProto(I))
+ return true;
- // If there were any appending global variables, link them together now.
- if (LinkAppendingVars(Dest, AppendingVars, ErrorMsg)) return true;
+ for (unsigned i = 0, e = AppendingVars.size(); i != e; ++i)
+ linkAppendingVarInit(AppendingVars[i]);
+
+ // Update the initializers in the DstM module now that all globals that may
+ // be referenced are in DstM.
+ linkGlobalInits();
+
+ // Link in the function bodies that are defined in the source module into
+ // DstM.
+ for (Module::iterator SF = SrcM->begin(), E = SrcM->end(); SF != E; ++SF) {
+ if (SF->isDeclaration()) continue; // No body if function is external.
+
+ linkFunctionBody(cast<Function>(ValueMap[SF]), SF);
+ }
- // Resolve all uses of aliases with aliasees
- if (ResolveAliases(Dest)) return true;
+ // Resolve all uses of aliases with aliasees.
+ linkAliasBodies();
- // Remap all of the named mdnoes in Src into the Dest module. We do this
- // after linking GlobalValues so that MDNodes that reference GlobalValues
- // are properly remapped.
- LinkNamedMDNodes(Dest, Src, ValueMap);
+ // Now that all of the types from the source are used, resolve any structs
+ // copied over to the dest that didn't exist there.
+ TypeMap.linkDefinedTypeBodies();
+
+ return false;
+}
- // If the source library's module id is in the dependent library list of the
- // destination library, remove it since that module is now linked in.
- const std::string &modId = Src->getModuleIdentifier();
- if (!modId.empty())
- Dest->removeLibrary(sys::path::stem(modId));
+//===----------------------------------------------------------------------===//
+// LinkModules entrypoint.
+//===----------------------------------------------------------------------===//
+// LinkModules - This function links two modules together, with the resulting
+// left module modified to be the composite of the two input modules. If an
+// error occurs, true is returned and ErrorMsg (if not null) is set to indicate
+// the problem. Upon failure, the Dest module could be in a modified state, and
+// shouldn't be relied on to be consistent.
+bool Linker::LinkModules(Module *Dest, Module *Src, std::string *ErrorMsg) {
+ ModuleLinker TheLinker(Dest, Src);
+ if (TheLinker.run()) {
+ if (ErrorMsg) *ErrorMsg = TheLinker.ErrorMsg;
+ return true;
+ }
+
return false;
}
-
-// vim: sw=2
diff --git a/contrib/llvm/lib/MC/MCAsmInfo.cpp b/contrib/llvm/lib/MC/MCAsmInfo.cpp
index 73b259e..502b60b 100644
--- a/contrib/llvm/lib/MC/MCAsmInfo.cpp
+++ b/contrib/llvm/lib/MC/MCAsmInfo.cpp
@@ -23,6 +23,9 @@
using namespace llvm;
MCAsmInfo::MCAsmInfo() {
+ PointerSize = 4;
+ IsLittleEndian = true;
+ StackGrowsUp = false;
HasSubsectionsViaSymbols = false;
HasMachoZeroFillDirective = false;
HasMachoTBSSDirective = false;
@@ -78,6 +81,7 @@ MCAsmInfo::MCAsmInfo() {
DwarfRequiresRelocationForSectionOffset = true;
DwarfSectionOffsetDirective = 0;
DwarfUsesLabelOffsetForRanges = true;
+ DwarfRegNumForCFI = false;
HasMicrosoftFastStdCallMangling = false;
AsmTransCBE = 0;
diff --git a/contrib/llvm/lib/MC/MCAsmStreamer.cpp b/contrib/llvm/lib/MC/MCAsmStreamer.cpp
index e8b09fc..d5d08e8 100644
--- a/contrib/llvm/lib/MC/MCAsmStreamer.cpp
+++ b/contrib/llvm/lib/MC/MCAsmStreamer.cpp
@@ -19,6 +19,7 @@
#include "llvm/MC/MCSymbol.h"
#include "llvm/ADT/OwningPtr.h"
#include "llvm/ADT/SmallString.h"
+#include "llvm/ADT/StringExtras.h"
#include "llvm/ADT/Twine.h"
#include "llvm/Support/ErrorHandling.h"
#include "llvm/Support/MathExtras.h"
@@ -33,8 +34,10 @@ using namespace llvm;
namespace {
class MCAsmStreamer : public MCStreamer {
+protected:
formatted_raw_ostream &OS;
const MCAsmInfo &MAI;
+private:
OwningPtr<MCInstPrinter> InstPrinter;
OwningPtr<MCCodeEmitter> Emitter;
OwningPtr<TargetAsmBackend> AsmBackend;
@@ -134,7 +137,8 @@ public:
virtual void EmitWeakReference(MCSymbol *Alias, const MCSymbol *Symbol);
virtual void EmitDwarfAdvanceLineAddr(int64_t LineDelta,
const MCSymbol *LastLabel,
- const MCSymbol *Label);
+ const MCSymbol *Label,
+ unsigned PointerSize);
virtual void EmitDwarfAdvanceFrameAddr(const MCSymbol *LastLabel,
const MCSymbol *Label);
@@ -361,9 +365,9 @@ void MCAsmStreamer::EmitWeakReference(MCSymbol *Alias, const MCSymbol *Symbol) {
void MCAsmStreamer::EmitDwarfAdvanceLineAddr(int64_t LineDelta,
const MCSymbol *LastLabel,
- const MCSymbol *Label) {
- EmitDwarfSetLineAddr(LineDelta, Label,
- getContext().getTargetAsmInfo().getPointerSize());
+ const MCSymbol *Label,
+ unsigned PointerSize) {
+ EmitDwarfSetLineAddr(LineDelta, Label, PointerSize);
}
void MCAsmStreamer::EmitDwarfAdvanceFrameAddr(const MCSymbol *LastLabel,
@@ -600,7 +604,7 @@ void MCAsmStreamer::EmitValueImpl(const MCExpr *Value, unsigned Size,
int64_t IntValue;
if (!Value->EvaluateAsAbsolute(IntValue))
report_fatal_error("Don't know how to emit this value.");
- if (getContext().getTargetAsmInfo().isLittleEndian()) {
+ if (getContext().getAsmInfo().isLittleEndian()) {
EmitIntValue((uint32_t)(IntValue >> 0 ), 4, AddrSpace);
EmitIntValue((uint32_t)(IntValue >> 32), 4, AddrSpace);
} else {
@@ -822,9 +826,9 @@ void MCAsmStreamer::EmitCFIEndProc() {
}
void MCAsmStreamer::EmitRegisterName(int64_t Register) {
- if (InstPrinter) {
- const TargetAsmInfo &asmInfo = getContext().getTargetAsmInfo();
- unsigned LLVMRegister = asmInfo.getLLVMRegNum(Register, true);
+ if (InstPrinter && !MAI.useDwarfRegNumForCFI()) {
+ const TargetAsmInfo &TAI = getContext().getTargetAsmInfo();
+ unsigned LLVMRegister = TAI.getLLVMRegNum(Register, true);
InstPrinter->printRegName(OS, LLVMRegister);
} else {
OS << Register;
@@ -1085,7 +1089,7 @@ void MCAsmStreamer::AddEncodingComment(const MCInst &Inst) {
}
}
- // FIXME: Node the fixup comments for Thumb2 are completely bogus since the
+ // FIXME: Note the fixup comments for Thumb2 are completely bogus since the
// high order halfword of a 32-bit Thumb2 instruction is emitted first.
OS << "encoding: [";
for (unsigned i = 0, e = Code.size(); i != e; ++i) {
@@ -1120,7 +1124,7 @@ void MCAsmStreamer::AddEncodingComment(const MCInst &Inst) {
unsigned Bit = (Code[i] >> j) & 1;
unsigned FixupBit;
- if (getContext().getTargetAsmInfo().isLittleEndian())
+ if (getContext().getAsmInfo().isLittleEndian())
FixupBit = i * 8 + j;
else
FixupBit = i * 8 + (7-j);
@@ -1241,13 +1245,12 @@ void MCAsmStreamer::Finish() {
if (!UseCFI)
EmitFrames(false);
}
-
MCStreamer *llvm::createAsmStreamer(MCContext &Context,
formatted_raw_ostream &OS,
bool isVerboseAsm, bool useLoc,
- bool useCFI,
- MCInstPrinter *IP, MCCodeEmitter *CE,
- TargetAsmBackend *TAB, bool ShowInst) {
+ bool useCFI, MCInstPrinter *IP,
+ MCCodeEmitter *CE, TargetAsmBackend *TAB,
+ bool ShowInst) {
return new MCAsmStreamer(Context, OS, isVerboseAsm, useLoc, useCFI,
IP, CE, TAB, ShowInst);
}
diff --git a/contrib/llvm/lib/MC/MCDisassembler/Disassembler.cpp b/contrib/llvm/lib/MC/MCDisassembler/Disassembler.cpp
index 6e636f0..5480b4b 100644
--- a/contrib/llvm/lib/MC/MCDisassembler/Disassembler.cpp
+++ b/contrib/llvm/lib/MC/MCDisassembler/Disassembler.cpp
@@ -40,6 +40,7 @@ LLVMDisasmContextRef LLVMCreateDisasm(const char *TripleName, void *DisInfo,
llvm::InitializeAllTargetInfos();
// FIXME: We shouldn't need to initialize the Target(Machine)s.
llvm::InitializeAllTargets();
+ llvm::InitializeAllMCAsmInfos();
llvm::InitializeAllAsmPrinters();
llvm::InitializeAllAsmParsers();
llvm::InitializeAllDisassemblers();
@@ -50,16 +51,18 @@ LLVMDisasmContextRef LLVMCreateDisasm(const char *TripleName, void *DisInfo,
assert(TheTarget && "Unable to create target!");
// Get the assembler info needed to setup the MCContext.
- const MCAsmInfo *MAI = TheTarget->createAsmInfo(TripleName);
+ const MCAsmInfo *MAI = TheTarget->createMCAsmInfo(TripleName);
assert(MAI && "Unable to create target asm info!");
// Package up features to be passed to target/subtarget
std::string FeaturesStr;
+ std::string CPU;
// FIXME: We shouldn't need to do this (and link in codegen).
// When we split this out, we should do it in a way that makes
// it straightforward to switch subtargets on the fly.
- TargetMachine *TM = TheTarget->createTargetMachine(TripleName, FeaturesStr);
+ TargetMachine *TM = TheTarget->createTargetMachine(TripleName, CPU,
+ FeaturesStr);
assert(TM && "Unable to create target machine!");
// Get the target assembler info needed to setup the context.
@@ -77,7 +80,7 @@ LLVMDisasmContextRef LLVMCreateDisasm(const char *TripleName, void *DisInfo,
// Set up the instruction printer.
int AsmPrinterVariant = MAI->getAssemblerDialect();
- MCInstPrinter *IP = TheTarget->createMCInstPrinter(*TM, AsmPrinterVariant,
+ MCInstPrinter *IP = TheTarget->createMCInstPrinter(AsmPrinterVariant,
*MAI);
assert(IP && "Unable to create instruction printer!");
diff --git a/contrib/llvm/lib/MC/MCDisassembler/EDDisassembler.cpp b/contrib/llvm/lib/MC/MCDisassembler/EDDisassembler.cpp
index 91c5284..bdd99af 100644
--- a/contrib/llvm/lib/MC/MCDisassembler/EDDisassembler.cpp
+++ b/contrib/llvm/lib/MC/MCDisassembler/EDDisassembler.cpp
@@ -23,6 +23,7 @@
#include "llvm/MC/MCInst.h"
#include "llvm/MC/MCInstPrinter.h"
#include "llvm/MC/MCStreamer.h"
+#include "llvm/MC/MCSubtargetInfo.h"
#include "llvm/MC/MCParser/AsmLexer.h"
#include "llvm/MC/MCParser/MCAsmParser.h"
#include "llvm/MC/MCParser/MCParsedAsmOperand.h"
@@ -106,6 +107,7 @@ void EDDisassembler::initialize() {
InitializeAllTargetInfos();
InitializeAllTargets();
+ InitializeAllMCAsmInfos();
InitializeAllAsmPrinters();
InitializeAllAsmParsers();
InitializeAllDisassemblers();
@@ -167,11 +169,11 @@ EDDisassembler::EDDisassembler(CPUKey &key) :
if (!Tgt)
return;
+ std::string CPU;
std::string featureString;
-
- TargetMachine.reset(Tgt->createTargetMachine(tripleString,
+ TargetMachine.reset(Tgt->createTargetMachine(tripleString, CPU,
featureString));
-
+
const TargetRegisterInfo *registerInfo = TargetMachine->getRegisterInfo();
if (!registerInfo)
@@ -179,11 +181,11 @@ EDDisassembler::EDDisassembler(CPUKey &key) :
initMaps(*registerInfo);
- AsmInfo.reset(Tgt->createAsmInfo(tripleString));
+ AsmInfo.reset(Tgt->createMCAsmInfo(tripleString));
if (!AsmInfo)
return;
-
+
Disassembler.reset(Tgt->createMCDisassembler());
if (!Disassembler)
@@ -193,8 +195,7 @@ EDDisassembler::EDDisassembler(CPUKey &key) :
InstString.reset(new std::string);
InstStream.reset(new raw_string_ostream(*InstString));
- InstPrinter.reset(Tgt->createMCInstPrinter(*TargetMachine, LLVMSyntaxVariant,
- *AsmInfo));
+ InstPrinter.reset(Tgt->createMCInstPrinter(LLVMSyntaxVariant, *AsmInfo));
if (!InstPrinter)
return;
@@ -372,8 +373,11 @@ int EDDisassembler::parseInst(SmallVectorImpl<MCParsedAsmOperand*> &operands,
OwningPtr<MCAsmParser> genericParser(createMCAsmParser(*Tgt, sourceMgr,
context, *streamer,
*AsmInfo));
- OwningPtr<TargetAsmParser> TargetParser(Tgt->createAsmParser(*genericParser,
- *TargetMachine));
+
+ StringRef triple = tripleFromArch(Key.Arch);
+ OwningPtr<MCSubtargetInfo> STI(Tgt->createMCSubtargetInfo(triple, "", ""));
+ OwningPtr<TargetAsmParser> TargetParser(Tgt->createAsmParser(*STI,
+ *genericParser));
AsmToken OpcodeToken = genericParser->Lex();
AsmToken NextToken = genericParser->Lex(); // consume next token, because specificParser expects us to
diff --git a/contrib/llvm/lib/MC/MCDisassembler/EDDisassembler.h b/contrib/llvm/lib/MC/MCDisassembler/EDDisassembler.h
index 2fcc09d..11d69c1 100644
--- a/contrib/llvm/lib/MC/MCDisassembler/EDDisassembler.h
+++ b/contrib/llvm/lib/MC/MCDisassembler/EDDisassembler.h
@@ -41,6 +41,7 @@ class MCInstPrinter;
class MCInst;
class MCParsedAsmOperand;
class MCStreamer;
+class MCSubtargetInfo;
template <typename T> class SmallVectorImpl;
class SourceMgr;
class Target;
diff --git a/contrib/llvm/lib/MC/MCDisassembler/EDInfo.h b/contrib/llvm/lib/MC/MCDisassembler/EDInfo.h
index ad57282..e43ad16 100644
--- a/contrib/llvm/lib/MC/MCDisassembler/EDInfo.h
+++ b/contrib/llvm/lib/MC/MCDisassembler/EDInfo.h
@@ -25,8 +25,11 @@ enum OperandTypes {
kOperandTypeARMBranchTarget,
kOperandTypeARMSoReg,
kOperandTypeARMSoImm,
+ kOperandTypeARMRotImm,
kOperandTypeARMSoImm2Part,
kOperandTypeARMPredicate,
+ kOperandTypeAddrModeImm12,
+ kOperandTypeLdStSOReg,
kOperandTypeARMAddrMode2,
kOperandTypeARMAddrMode2Offset,
kOperandTypeARMAddrMode3,
@@ -38,13 +41,20 @@ enum OperandTypes {
kOperandTypeARMAddrMode7,
kOperandTypeARMAddrModePC,
kOperandTypeARMRegisterList,
+ kOperandTypeARMDPRRegisterList,
+ kOperandTypeARMSPRRegisterList,
kOperandTypeARMTBAddrMode,
kOperandTypeThumbITMask,
- kOperandTypeThumbAddrModeS1,
- kOperandTypeThumbAddrModeS2,
- kOperandTypeThumbAddrModeS4,
+ kOperandTypeThumbAddrModeRegS1,
+ kOperandTypeThumbAddrModeRegS2,
+ kOperandTypeThumbAddrModeRegS4,
+ kOperandTypeThumbAddrModeImmS1,
+ kOperandTypeThumbAddrModeImmS2,
+ kOperandTypeThumbAddrModeImmS4,
kOperandTypeThumbAddrModeRR,
kOperandTypeThumbAddrModeSP,
+ kOperandTypeThumbAddrModePC,
+ kOperandTypeThumb2AddrModeReg,
kOperandTypeThumb2SoReg,
kOperandTypeThumb2SoImm,
kOperandTypeThumb2AddrModeImm8,
@@ -52,8 +62,7 @@ enum OperandTypes {
kOperandTypeThumb2AddrModeImm12,
kOperandTypeThumb2AddrModeSoReg,
kOperandTypeThumb2AddrModeImm8s4,
- kOperandTypeThumb2AddrModeImm8s4Offset,
- kOperandTypeThumb2AddrModeReg
+ kOperandTypeThumb2AddrModeImm8s4Offset
};
enum OperandFlags {
diff --git a/contrib/llvm/lib/MC/MCDisassembler/EDOperand.cpp b/contrib/llvm/lib/MC/MCDisassembler/EDOperand.cpp
index 492bb08..6a4e56f 100644
--- a/contrib/llvm/lib/MC/MCDisassembler/EDOperand.cpp
+++ b/contrib/llvm/lib/MC/MCDisassembler/EDOperand.cpp
@@ -61,11 +61,14 @@ EDOperand::EDOperand(const EDDisassembler &disassembler,
switch (operandType) {
default:
case kOperandTypeARMRegisterList:
+ case kOperandTypeARMDPRRegisterList:
+ case kOperandTypeARMSPRRegisterList:
break;
case kOperandTypeImmediate:
case kOperandTypeRegister:
case kOperandTypeARMBranchTarget:
case kOperandTypeARMSoImm:
+ case kOperandTypeARMRotImm:
case kOperandTypeThumb2SoImm:
case kOperandTypeARMSoImm2Part:
case kOperandTypeARMPredicate:
@@ -78,6 +81,7 @@ EDOperand::EDOperand(const EDDisassembler &disassembler,
numMCOperands = 1;
break;
case kOperandTypeThumb2SoReg:
+ case kOperandTypeAddrModeImm12:
case kOperandTypeARMAddrMode2Offset:
case kOperandTypeARMAddrMode3Offset:
case kOperandTypeARMAddrMode4:
@@ -86,17 +90,22 @@ EDOperand::EDOperand(const EDDisassembler &disassembler,
case kOperandTypeThumb2AddrModeImm8:
case kOperandTypeThumb2AddrModeImm12:
case kOperandTypeThumb2AddrModeImm8s4:
+ case kOperandTypeThumbAddrModeImmS1:
+ case kOperandTypeThumbAddrModeImmS2:
+ case kOperandTypeThumbAddrModeImmS4:
case kOperandTypeThumbAddrModeRR:
case kOperandTypeThumbAddrModeSP:
+ case kOperandTypeThumbAddrModePC:
numMCOperands = 2;
break;
case kOperandTypeARMSoReg:
+ case kOperandTypeLdStSOReg:
case kOperandTypeARMAddrMode2:
case kOperandTypeARMAddrMode3:
case kOperandTypeThumb2AddrModeSoReg:
- case kOperandTypeThumbAddrModeS1:
- case kOperandTypeThumbAddrModeS2:
- case kOperandTypeThumbAddrModeS4:
+ case kOperandTypeThumbAddrModeRegS1:
+ case kOperandTypeThumbAddrModeRegS2:
+ case kOperandTypeThumbAddrModeRegS4:
case kOperandTypeARMAddrMode6Offset:
numMCOperands = 3;
break;
@@ -270,9 +279,9 @@ int EDOperand::isMemory() {
case kOperandTypeARMAddrMode7:
case kOperandTypeARMAddrModePC:
case kOperandTypeARMBranchTarget:
- case kOperandTypeThumbAddrModeS1:
- case kOperandTypeThumbAddrModeS2:
- case kOperandTypeThumbAddrModeS4:
+ case kOperandTypeThumbAddrModeRegS1:
+ case kOperandTypeThumbAddrModeRegS2:
+ case kOperandTypeThumbAddrModeRegS4:
case kOperandTypeThumbAddrModeRR:
case kOperandTypeThumbAddrModeSP:
case kOperandTypeThumb2SoImm:
diff --git a/contrib/llvm/lib/MC/MCDwarf.cpp b/contrib/llvm/lib/MC/MCDwarf.cpp
index 13cb81a..ad86db1 100644
--- a/contrib/llvm/lib/MC/MCDwarf.cpp
+++ b/contrib/llvm/lib/MC/MCDwarf.cpp
@@ -7,22 +7,21 @@
//
//===----------------------------------------------------------------------===//
-#include "llvm/ADT/FoldingSet.h"
#include "llvm/MC/MCAsmInfo.h"
#include "llvm/MC/MCDwarf.h"
-#include "llvm/MC/MCAssembler.h"
#include "llvm/MC/MCStreamer.h"
#include "llvm/MC/MCSymbol.h"
#include "llvm/MC/MCExpr.h"
#include "llvm/MC/MCContext.h"
#include "llvm/MC/MCObjectWriter.h"
-#include "llvm/ADT/SmallString.h"
-#include "llvm/ADT/Twine.h"
#include "llvm/Support/Debug.h"
#include "llvm/Support/ErrorHandling.h"
#include "llvm/Support/raw_ostream.h"
-#include "llvm/Target/TargetAsmBackend.h"
#include "llvm/Target/TargetAsmInfo.h"
+#include "llvm/ADT/FoldingSet.h"
+#include "llvm/ADT/SmallString.h"
+#include "llvm/ADT/StringExtras.h"
+#include "llvm/ADT/Twine.h"
using namespace llvm;
// Given a special op, return the address skip amount (in units of
@@ -30,28 +29,27 @@ using namespace llvm;
#define SPECIAL_ADDR(op) (((op) - DWARF2_LINE_OPCODE_BASE)/DWARF2_LINE_RANGE)
// The maximum address skip amount that can be encoded with a special op.
-#define MAX_SPECIAL_ADDR_DELTA SPECIAL_ADDR(255)
+#define MAX_SPECIAL_ADDR_DELTA SPECIAL_ADDR(255)
// First special line opcode - leave room for the standard opcodes.
// Note: If you want to change this, you'll have to update the
// "standard_opcode_lengths" table that is emitted in DwarfFileTable::Emit().
-#define DWARF2_LINE_OPCODE_BASE 13
+#define DWARF2_LINE_OPCODE_BASE 13
// Minimum line offset in a special line info. opcode. This value
// was chosen to give a reasonable range of values.
-#define DWARF2_LINE_BASE -5
+#define DWARF2_LINE_BASE -5
// Range of line offsets in a special line info. opcode.
-# define DWARF2_LINE_RANGE 14
+#define DWARF2_LINE_RANGE 14
// Define the architecture-dependent minimum instruction length (in bytes).
// This value should be rather too small than too big.
-# define DWARF2_LINE_MIN_INSN_LENGTH 1
+#define DWARF2_LINE_MIN_INSN_LENGTH 1
// Note: when DWARF2_LINE_MIN_INSN_LENGTH == 1 which is the current setting,
// this routine is a nop and will be optimized away.
-static inline uint64_t ScaleAddrDelta(uint64_t AddrDelta)
-{
+static inline uint64_t ScaleAddrDelta(uint64_t AddrDelta) {
if (DWARF2_LINE_MIN_INSN_LENGTH == 1)
return AddrDelta;
if (AddrDelta % DWARF2_LINE_MIN_INSN_LENGTH != 0) {
@@ -174,7 +172,9 @@ static inline void EmitDwarfLineTable(MCStreamer *MCOS,
// At this point we want to emit/create the sequence to encode the delta in
// line numbers and the increment of the address from the previous Label
// and the current Label.
- MCOS->EmitDwarfAdvanceLineAddr(LineDelta, LastLabel, Label);
+ const MCAsmInfo &asmInfo = MCOS->getContext().getAsmInfo();
+ MCOS->EmitDwarfAdvanceLineAddr(LineDelta, LastLabel, Label,
+ asmInfo.getPointerSize());
LastLine = it->getLine();
LastLabel = Label;
@@ -198,7 +198,9 @@ static inline void EmitDwarfLineTable(MCStreamer *MCOS,
// Switch back the the dwarf line section.
MCOS->SwitchSection(context.getTargetAsmInfo().getDwarfLineSection());
- MCOS->EmitDwarfAdvanceLineAddr(INT64_MAX, LastLabel, SectionEnd);
+ const MCAsmInfo &asmInfo = MCOS->getContext().getAsmInfo();
+ MCOS->EmitDwarfAdvanceLineAddr(INT64_MAX, LastLabel, SectionEnd,
+ asmInfo.getPointerSize());
}
//
@@ -291,7 +293,7 @@ void MCDwarfFileTable::Emit(MCStreamer *MCOS) {
const std::vector<const MCSection *> &MCLineSectionOrder =
MCOS->getContext().getMCLineSectionOrder();
for (std::vector<const MCSection*>::const_iterator it =
- MCLineSectionOrder.begin(), ie = MCLineSectionOrder.end(); it != ie;
+ MCLineSectionOrder.begin(), ie = MCLineSectionOrder.end(); it != ie;
++it) {
const MCSection *Sec = *it;
const MCLineSection *Line = MCLineSections.lookup(Sec);
@@ -354,10 +356,7 @@ void MCDwarfLineAddr::Encode(int64_t LineDelta, uint64_t AddrDelta,
OS << char(dwarf::DW_LNS_const_add_pc);
else {
OS << char(dwarf::DW_LNS_advance_pc);
- SmallString<32> Tmp;
- raw_svector_ostream OSE(Tmp);
- MCObjectWriter::EncodeULEB128(AddrDelta, OSE);
- OS << OSE.str();
+ MCObjectWriter::EncodeULEB128(AddrDelta, OS);
}
OS << char(dwarf::DW_LNS_extended_op);
OS << char(1);
@@ -432,25 +431,24 @@ void MCDwarfFile::dump() const {
static int getDataAlignmentFactor(MCStreamer &streamer) {
MCContext &context = streamer.getContext();
- const TargetAsmInfo &asmInfo = context.getTargetAsmInfo();
+ const MCAsmInfo &asmInfo = context.getAsmInfo();
int size = asmInfo.getPointerSize();
- if (asmInfo.getStackGrowthDirection() == TargetFrameLowering::StackGrowsUp)
+ if (asmInfo.isStackGrowthDirectionUp())
return size;
- else
- return -size;
+ else
+ return -size;
}
static unsigned getSizeForEncoding(MCStreamer &streamer,
unsigned symbolEncoding) {
MCContext &context = streamer.getContext();
- const TargetAsmInfo &asmInfo = context.getTargetAsmInfo();
unsigned format = symbolEncoding & 0x0f;
switch (format) {
default:
assert(0 && "Unknown Encoding");
case dwarf::DW_EH_PE_absptr:
case dwarf::DW_EH_PE_signed:
- return asmInfo.getPointerSize();
+ return context.getAsmInfo().getPointerSize();
case dwarf::DW_EH_PE_udata2:
case dwarf::DW_EH_PE_sdata2:
return 2;
@@ -464,13 +462,14 @@ static unsigned getSizeForEncoding(MCStreamer &streamer,
}
static void EmitSymbol(MCStreamer &streamer, const MCSymbol &symbol,
- unsigned symbolEncoding) {
+ unsigned symbolEncoding, const char *comment = 0) {
MCContext &context = streamer.getContext();
const MCAsmInfo &asmInfo = context.getAsmInfo();
const MCExpr *v = asmInfo.getExprForFDESymbol(&symbol,
symbolEncoding,
streamer);
unsigned size = getSizeForEncoding(streamer, symbolEncoding);
+ if (streamer.isVerboseAsm() && comment) streamer.AddComment(comment);
streamer.EmitAbsValue(v, size);
}
@@ -486,11 +485,11 @@ static void EmitPersonality(MCStreamer &streamer, const MCSymbol &symbol,
}
static const MachineLocation TranslateMachineLocation(
- const TargetAsmInfo &AsmInfo,
+ const TargetAsmInfo &TAI,
const MachineLocation &Loc) {
unsigned Reg = Loc.getReg() == MachineLocation::VirtualFP ?
MachineLocation::VirtualFP :
- unsigned(AsmInfo.getDwarfRegNum(Loc.getReg(), true));
+ unsigned(TAI.getDwarfRegNum(Loc.getReg(), true));
const MachineLocation &NewLoc = Loc.isReg() ?
MachineLocation(Reg) : MachineLocation(Reg, Loc.getOffset());
return NewLoc;
@@ -503,13 +502,18 @@ namespace {
bool UsingCFI;
bool IsEH;
const MCSymbol *SectionStart;
-
public:
FrameEmitterImpl(bool usingCFI, bool isEH, const MCSymbol *sectionStart) :
CFAOffset(0), CIENum(0), UsingCFI(usingCFI), IsEH(isEH),
SectionStart(sectionStart) {
}
+ /// EmitCompactUnwind - Emit the unwind information in a compact way. If
+ /// we're successful, return 'true'. Otherwise, return 'false' and it will
+ /// emit the normal CIE and FDE.
+ bool EmitCompactUnwind(MCStreamer &streamer,
+ const MCDwarfFrameInfo &frame);
+
const MCSymbol &EmitCIE(MCStreamer &streamer,
const MCSymbol *personality,
unsigned personalityEncoding,
@@ -524,11 +528,46 @@ namespace {
void EmitCFIInstruction(MCStreamer &Streamer,
const MCCFIInstruction &Instr);
};
+
+} // end anonymous namespace
+
+static void EmitEncodingByte(MCStreamer &Streamer, unsigned Encoding,
+ StringRef Prefix) {
+ if (Streamer.isVerboseAsm()) {
+ const char *EncStr = 0;
+ switch (Encoding) {
+ default: EncStr = "<unknown encoding>";
+ case dwarf::DW_EH_PE_absptr: EncStr = "absptr";
+ case dwarf::DW_EH_PE_omit: EncStr = "omit";
+ case dwarf::DW_EH_PE_pcrel: EncStr = "pcrel";
+ case dwarf::DW_EH_PE_udata4: EncStr = "udata4";
+ case dwarf::DW_EH_PE_udata8: EncStr = "udata8";
+ case dwarf::DW_EH_PE_sdata4: EncStr = "sdata4";
+ case dwarf::DW_EH_PE_sdata8: EncStr = "sdata8";
+ case dwarf::DW_EH_PE_pcrel |dwarf::DW_EH_PE_udata4: EncStr = "pcrel udata4";
+ case dwarf::DW_EH_PE_pcrel |dwarf::DW_EH_PE_sdata4: EncStr = "pcrel sdata4";
+ case dwarf::DW_EH_PE_pcrel |dwarf::DW_EH_PE_udata8: EncStr = "pcrel udata8";
+ case dwarf::DW_EH_PE_pcrel |dwarf::DW_EH_PE_sdata8: EncStr = "pcrel sdata8";
+ case dwarf::DW_EH_PE_indirect |dwarf::DW_EH_PE_pcrel|dwarf::DW_EH_PE_udata4:
+ EncStr = "indirect pcrel udata4";
+ case dwarf::DW_EH_PE_indirect |dwarf::DW_EH_PE_pcrel|dwarf::DW_EH_PE_sdata4:
+ EncStr = "indirect pcrel sdata4";
+ case dwarf::DW_EH_PE_indirect |dwarf::DW_EH_PE_pcrel|dwarf::DW_EH_PE_udata8:
+ EncStr = "indirect pcrel udata8";
+ case dwarf::DW_EH_PE_indirect |dwarf::DW_EH_PE_pcrel|dwarf::DW_EH_PE_sdata8:
+ EncStr = "indirect pcrel sdata8";
+ }
+
+ Streamer.AddComment(Twine(Prefix) + " = " + EncStr);
+ }
+
+ Streamer.EmitIntValue(Encoding, 1);
}
void FrameEmitterImpl::EmitCFIInstruction(MCStreamer &Streamer,
const MCCFIInstruction &Instr) {
int dataAlignmentFactor = getDataAlignmentFactor(Streamer);
+ bool VerboseAsm = Streamer.isVerboseAsm();
switch (Instr.getOperation()) {
case MCCFIInstruction::Move:
@@ -540,9 +579,13 @@ void FrameEmitterImpl::EmitCFIInstruction(MCStreamer &Streamer,
// If advancing cfa.
if (Dst.isReg() && Dst.getReg() == MachineLocation::VirtualFP) {
if (Src.getReg() == MachineLocation::VirtualFP) {
+ if (VerboseAsm) Streamer.AddComment("DW_CFA_def_cfa_offset");
Streamer.EmitIntValue(dwarf::DW_CFA_def_cfa_offset, 1);
} else {
+ if (VerboseAsm) Streamer.AddComment("DW_CFA_def_cfa");
Streamer.EmitIntValue(dwarf::DW_CFA_def_cfa, 1);
+ if (VerboseAsm) Streamer.AddComment(Twine("Reg ") +
+ Twine(Src.getReg()));
Streamer.EmitULEB128IntValue(Src.getReg());
}
@@ -551,47 +594,62 @@ void FrameEmitterImpl::EmitCFIInstruction(MCStreamer &Streamer,
else
CFAOffset = -Src.getOffset();
+ if (VerboseAsm) Streamer.AddComment(Twine("Offset " + Twine(CFAOffset)));
Streamer.EmitULEB128IntValue(CFAOffset);
return;
}
if (Src.isReg() && Src.getReg() == MachineLocation::VirtualFP) {
assert(Dst.isReg() && "Machine move not supported yet.");
+ if (VerboseAsm) Streamer.AddComment("DW_CFA_def_cfa_register");
Streamer.EmitIntValue(dwarf::DW_CFA_def_cfa_register, 1);
+ if (VerboseAsm) Streamer.AddComment(Twine("Reg ") + Twine(Dst.getReg()));
Streamer.EmitULEB128IntValue(Dst.getReg());
return;
}
unsigned Reg = Src.getReg();
-
int Offset = Dst.getOffset();
if (IsRelative)
Offset -= CFAOffset;
Offset = Offset / dataAlignmentFactor;
if (Offset < 0) {
+ if (VerboseAsm) Streamer.AddComment("DW_CFA_offset_extended_sf");
Streamer.EmitIntValue(dwarf::DW_CFA_offset_extended_sf, 1);
+ if (VerboseAsm) Streamer.AddComment(Twine("Reg ") + Twine(Reg));
Streamer.EmitULEB128IntValue(Reg);
+ if (VerboseAsm) Streamer.AddComment(Twine("Offset ") + Twine(Offset));
Streamer.EmitSLEB128IntValue(Offset);
} else if (Reg < 64) {
+ if (VerboseAsm) Streamer.AddComment(Twine("DW_CFA_offset + Reg(") +
+ Twine(Reg) + ")");
Streamer.EmitIntValue(dwarf::DW_CFA_offset + Reg, 1);
+ if (VerboseAsm) Streamer.AddComment(Twine("Offset ") + Twine(Offset));
Streamer.EmitULEB128IntValue(Offset);
} else {
+ if (VerboseAsm) Streamer.AddComment("DW_CFA_offset_extended");
Streamer.EmitIntValue(dwarf::DW_CFA_offset_extended, 1);
+ if (VerboseAsm) Streamer.AddComment(Twine("Reg ") + Twine(Reg));
Streamer.EmitULEB128IntValue(Reg);
+ if (VerboseAsm) Streamer.AddComment(Twine("Offset ") + Twine(Offset));
Streamer.EmitULEB128IntValue(Offset);
}
return;
}
case MCCFIInstruction::Remember:
+ if (VerboseAsm) Streamer.AddComment("DW_CFA_remember_state");
Streamer.EmitIntValue(dwarf::DW_CFA_remember_state, 1);
return;
case MCCFIInstruction::Restore:
+ if (VerboseAsm) Streamer.AddComment("DW_CFA_restore_state");
Streamer.EmitIntValue(dwarf::DW_CFA_restore_state, 1);
return;
case MCCFIInstruction::SameValue: {
unsigned Reg = Instr.getDestination().getReg();
+ if (VerboseAsm) Streamer.AddComment("DW_CFA_same_value");
Streamer.EmitIntValue(dwarf::DW_CFA_same_value, 1);
+ if (VerboseAsm) Streamer.AddComment(Twine("Reg ") + Twine(Reg));
Streamer.EmitULEB128IntValue(Reg);
return;
}
@@ -614,6 +672,7 @@ void FrameEmitterImpl::EmitCFIInstructions(MCStreamer &streamer,
if (BaseLabel && Label) {
MCSymbol *ThisSym = Label;
if (ThisSym != BaseLabel) {
+ if (streamer.isVerboseAsm()) streamer.AddComment("DW_CFA_advance_loc4");
streamer.EmitDwarfAdvanceFrameAddr(BaseLabel, ThisSym);
BaseLabel = ThisSym;
}
@@ -623,40 +682,128 @@ void FrameEmitterImpl::EmitCFIInstructions(MCStreamer &streamer,
}
}
+/// EmitCompactUnwind - Emit the unwind information in a compact way. If we're
+/// successful, return 'true'. Otherwise, return 'false' and it will emit the
+/// normal CIE and FDE.
+bool FrameEmitterImpl::EmitCompactUnwind(MCStreamer &Streamer,
+ const MCDwarfFrameInfo &Frame) {
+#if 1
+ return false;
+#else
+ MCContext &Context = Streamer.getContext();
+ const TargetAsmInfo &TAI = Context.getTargetAsmInfo();
+ bool VerboseAsm = Streamer.isVerboseAsm();
+
+ // range-start range-length compact-unwind-enc personality-func lsda
+ // _foo LfooEnd-_foo 0x00000023 0 0
+ // _bar LbarEnd-_bar 0x00000025 __gxx_personality except_tab1
+ //
+ // .section __LD,__compact_unwind,regular,debug
+ //
+ // # compact unwind for _foo
+ // .quad _foo
+ // .set L1,LfooEnd-_foo
+ // .long L1
+ // .long 0x01010001
+ // .quad 0
+ // .quad 0
+ //
+ // # compact unwind for _bar
+ // .quad _bar
+ // .set L2,LbarEnd-_bar
+ // .long L2
+ // .long 0x01020011
+ // .quad __gxx_personality
+ // .quad except_tab1
+
+ uint32_t Encoding =
+ TAI.getCompactUnwindEncoding(Frame.Instructions,
+ getDataAlignmentFactor(Streamer), IsEH);
+ if (!Encoding) return false;
+
+ // The encoding needs to know we have an LSDA.
+ if (Frame.Lsda)
+ Encoding |= 0x40000000;
+
+ Streamer.SwitchSection(TAI.getCompactUnwindSection());
+
+ // Range Start
+ unsigned FDEEncoding = TAI.getFDEEncoding(UsingCFI);
+ unsigned Size = getSizeForEncoding(Streamer, FDEEncoding);
+ if (VerboseAsm) Streamer.AddComment("Range Start");
+ Streamer.EmitSymbolValue(Frame.Function, Size);
+
+ // Range Length
+ const MCExpr *Range = MakeStartMinusEndExpr(Streamer, *Frame.Begin,
+ *Frame.End, 0);
+ if (VerboseAsm) Streamer.AddComment("Range Length");
+ Streamer.EmitAbsValue(Range, 4);
+
+ // Compact Encoding
+ Size = getSizeForEncoding(Streamer, dwarf::DW_EH_PE_udata4);
+ if (VerboseAsm) Streamer.AddComment(Twine("Compact Unwind Encoding: 0x") +
+ Twine(llvm::utohexstr(Encoding)));
+ Streamer.EmitIntValue(Encoding, Size);
+
+ // Personality Function
+ Size = getSizeForEncoding(Streamer, dwarf::DW_EH_PE_absptr);
+ if (VerboseAsm) Streamer.AddComment("Personality Function");
+ if (Frame.Personality)
+ Streamer.EmitSymbolValue(Frame.Personality, Size);
+ else
+ Streamer.EmitIntValue(0, Size); // No personality fn
+
+ // LSDA
+ Size = getSizeForEncoding(Streamer, Frame.LsdaEncoding);
+ if (VerboseAsm) Streamer.AddComment("LSDA");
+ if (Frame.Lsda)
+ Streamer.EmitSymbolValue(Frame.Lsda, Size);
+ else
+ Streamer.EmitIntValue(0, Size); // No LSDA
+
+ return true;
+#endif
+}
+
const MCSymbol &FrameEmitterImpl::EmitCIE(MCStreamer &streamer,
const MCSymbol *personality,
unsigned personalityEncoding,
const MCSymbol *lsda,
unsigned lsdaEncoding) {
MCContext &context = streamer.getContext();
- const TargetAsmInfo &asmInfo = context.getTargetAsmInfo();
+ const TargetAsmInfo &TAI = context.getTargetAsmInfo();
+ bool verboseAsm = streamer.isVerboseAsm();
MCSymbol *sectionStart;
- if (asmInfo.isFunctionEHFrameSymbolPrivate() || !IsEH)
+ if (TAI.isFunctionEHFrameSymbolPrivate() || !IsEH)
sectionStart = context.CreateTempSymbol();
else
sectionStart = context.GetOrCreateSymbol(Twine("EH_frame") + Twine(CIENum));
+ streamer.EmitLabel(sectionStart);
CIENum++;
- MCSymbol *sectionEnd = streamer.getContext().CreateTempSymbol();
+ MCSymbol *sectionEnd = context.CreateTempSymbol();
// Length
const MCExpr *Length = MakeStartMinusEndExpr(streamer, *sectionStart,
*sectionEnd, 4);
- streamer.EmitLabel(sectionStart);
+ if (verboseAsm) streamer.AddComment("CIE Length");
streamer.EmitAbsValue(Length, 4);
// CIE ID
unsigned CIE_ID = IsEH ? 0 : -1;
+ if (verboseAsm) streamer.AddComment("CIE ID Tag");
streamer.EmitIntValue(CIE_ID, 4);
// Version
+ if (verboseAsm) streamer.AddComment("DW_CIE_VERSION");
streamer.EmitIntValue(dwarf::DW_CIE_VERSION, 1);
// Augmentation String
SmallString<8> Augmentation;
if (IsEH) {
+ if (verboseAsm) streamer.AddComment("CIE Augmentation");
Augmentation += "z";
if (personality)
Augmentation += "P";
@@ -668,13 +815,16 @@ const MCSymbol &FrameEmitterImpl::EmitCIE(MCStreamer &streamer,
streamer.EmitIntValue(0, 1);
// Code Alignment Factor
+ if (verboseAsm) streamer.AddComment("CIE Code Alignment Factor");
streamer.EmitULEB128IntValue(1);
// Data Alignment Factor
+ if (verboseAsm) streamer.AddComment("CIE Data Alignment Factor");
streamer.EmitSLEB128IntValue(getDataAlignmentFactor(streamer));
// Return Address Register
- streamer.EmitULEB128IntValue(asmInfo.getDwarfRARegNum(true));
+ if (verboseAsm) streamer.AddComment("CIE Return Address Column");
+ streamer.EmitULEB128IntValue(TAI.getDwarfRARegNum(true));
// Augmentation Data Length (optional)
@@ -691,32 +841,38 @@ const MCSymbol &FrameEmitterImpl::EmitCIE(MCStreamer &streamer,
// Encoding of the FDE pointers
augmentationLength += 1;
+ if (verboseAsm) streamer.AddComment("Augmentation Size");
streamer.EmitULEB128IntValue(augmentationLength);
// Augmentation Data (optional)
if (personality) {
// Personality Encoding
- streamer.EmitIntValue(personalityEncoding, 1);
+ EmitEncodingByte(streamer, personalityEncoding,
+ "Personality Encoding");
// Personality
+ if (verboseAsm) streamer.AddComment("Personality");
EmitPersonality(streamer, *personality, personalityEncoding);
}
+
if (lsda)
- streamer.EmitIntValue(lsdaEncoding, 1); // LSDA Encoding
+ EmitEncodingByte(streamer, lsdaEncoding, "LSDA Encoding");
+
// Encoding of the FDE pointers
- streamer.EmitIntValue(asmInfo.getFDEEncoding(UsingCFI), 1);
+ EmitEncodingByte(streamer, TAI.getFDEEncoding(UsingCFI),
+ "FDE Encoding");
}
// Initial Instructions
- const std::vector<MachineMove> Moves = asmInfo.getInitialFrameState();
+ const std::vector<MachineMove> &Moves = TAI.getInitialFrameState();
std::vector<MCCFIInstruction> Instructions;
for (int i = 0, n = Moves.size(); i != n; ++i) {
MCSymbol *Label = Moves[i].getLabel();
const MachineLocation &Dst =
- TranslateMachineLocation(asmInfo, Moves[i].getDestination());
+ TranslateMachineLocation(TAI, Moves[i].getDestination());
const MachineLocation &Src =
- TranslateMachineLocation(asmInfo, Moves[i].getSource());
+ TranslateMachineLocation(TAI, Moves[i].getSource());
MCCFIInstruction Inst(Label, Dst, Src);
Instructions.push_back(Inst);
}
@@ -724,7 +880,8 @@ const MCSymbol &FrameEmitterImpl::EmitCIE(MCStreamer &streamer,
EmitCFIInstructions(streamer, Instructions, NULL);
// Padding
- streamer.EmitValueToAlignment(IsEH ? 4 : asmInfo.getPointerSize());
+ streamer.EmitValueToAlignment(IsEH
+ ? 4 : context.getAsmInfo().getPointerSize());
streamer.EmitLabel(sectionEnd);
return *sectionStart;
@@ -736,17 +893,19 @@ MCSymbol *FrameEmitterImpl::EmitFDE(MCStreamer &streamer,
MCContext &context = streamer.getContext();
MCSymbol *fdeStart = context.CreateTempSymbol();
MCSymbol *fdeEnd = context.CreateTempSymbol();
- const TargetAsmInfo &TAsmInfo = context.getTargetAsmInfo();
+ const TargetAsmInfo &TAI = context.getTargetAsmInfo();
+ bool verboseAsm = streamer.isVerboseAsm();
- if (!TAsmInfo.isFunctionEHFrameSymbolPrivate() && IsEH) {
- MCSymbol *EHSym = context.GetOrCreateSymbol(
- frame.Function->getName() + Twine(".eh"));
+ if (!TAI.isFunctionEHFrameSymbolPrivate() && IsEH) {
+ MCSymbol *EHSym =
+ context.GetOrCreateSymbol(frame.Function->getName() + Twine(".eh"));
streamer.EmitEHSymAttributes(frame.Function, EHSym);
streamer.EmitLabel(EHSym);
}
// Length
const MCExpr *Length = MakeStartMinusEndExpr(streamer, *fdeStart, *fdeEnd, 0);
+ if (verboseAsm) streamer.AddComment("FDE Length");
streamer.EmitAbsValue(Length, 4);
streamer.EmitLabel(fdeStart);
@@ -756,6 +915,7 @@ MCSymbol *FrameEmitterImpl::EmitFDE(MCStreamer &streamer,
if (IsEH) {
const MCExpr *offset = MakeStartMinusEndExpr(streamer, cieStart, *fdeStart,
0);
+ if (verboseAsm) streamer.AddComment("FDE CIE Offset");
streamer.EmitAbsValue(offset, 4);
} else if (!asmInfo.doesDwarfRequireRelocationForSectionOffset()) {
const MCExpr *offset = MakeStartMinusEndExpr(streamer, *SectionStart,
@@ -764,18 +924,20 @@ MCSymbol *FrameEmitterImpl::EmitFDE(MCStreamer &streamer,
} else {
streamer.EmitSymbolValue(&cieStart, 4);
}
- unsigned fdeEncoding = TAsmInfo.getFDEEncoding(UsingCFI);
+
+ unsigned fdeEncoding = TAI.getFDEEncoding(UsingCFI);
unsigned size = getSizeForEncoding(streamer, fdeEncoding);
// PC Begin
unsigned PCBeginEncoding = IsEH ? fdeEncoding :
(unsigned)dwarf::DW_EH_PE_absptr;
unsigned PCBeginSize = getSizeForEncoding(streamer, PCBeginEncoding);
- EmitSymbol(streamer, *frame.Begin, PCBeginEncoding);
+ EmitSymbol(streamer, *frame.Begin, PCBeginEncoding, "FDE initial location");
// PC Range
const MCExpr *Range = MakeStartMinusEndExpr(streamer, *frame.Begin,
*frame.End, 0);
+ if (verboseAsm) streamer.AddComment("FDE address range");
streamer.EmitAbsValue(Range, size);
if (IsEH) {
@@ -785,11 +947,13 @@ MCSymbol *FrameEmitterImpl::EmitFDE(MCStreamer &streamer,
if (frame.Lsda)
augmentationLength += getSizeForEncoding(streamer, frame.LsdaEncoding);
+ if (verboseAsm) streamer.AddComment("Augmentation size");
streamer.EmitULEB128IntValue(augmentationLength);
// Augmentation Data
if (frame.Lsda)
- EmitSymbol(streamer, *frame.Lsda, frame.LsdaEncoding);
+ EmitSymbol(streamer, *frame.Lsda, frame.LsdaEncoding,
+ "Language Specific Data Area");
}
// Call Frame Instructions
@@ -843,39 +1007,47 @@ namespace llvm {
};
}
-void MCDwarfFrameEmitter::Emit(MCStreamer &streamer,
- bool usingCFI,
- bool isEH) {
- MCContext &context = streamer.getContext();
- const TargetAsmInfo &asmInfo = context.getTargetAsmInfo();
- const MCSection &section = isEH ?
- *asmInfo.getEHFrameSection() : *asmInfo.getDwarfFrameSection();
- streamer.SwitchSection(&section);
- MCSymbol *SectionStart = context.CreateTempSymbol();
- streamer.EmitLabel(SectionStart);
-
- MCSymbol *fdeEnd = NULL;
+void MCDwarfFrameEmitter::Emit(MCStreamer &Streamer,
+ bool UsingCFI,
+ bool IsEH) {
+ MCContext &Context = Streamer.getContext();
+ const TargetAsmInfo &TAI = Context.getTargetAsmInfo();
+ const MCSection &Section = IsEH ? *TAI.getEHFrameSection() :
+ *TAI.getDwarfFrameSection();
+ Streamer.SwitchSection(&Section);
+ MCSymbol *SectionStart = Context.CreateTempSymbol();
+ Streamer.EmitLabel(SectionStart);
+
+ MCSymbol *FDEEnd = NULL;
DenseMap<CIEKey, const MCSymbol*> CIEStarts;
- FrameEmitterImpl Emitter(usingCFI, isEH, SectionStart);
+ FrameEmitterImpl Emitter(UsingCFI, IsEH, SectionStart);
const MCSymbol *DummyDebugKey = NULL;
- for (unsigned i = 0, n = streamer.getNumFrameInfos(); i < n; ++i) {
- const MCDwarfFrameInfo &frame = streamer.getFrameInfo(i);
- CIEKey key(frame.Personality, frame.PersonalityEncoding,
- frame.LsdaEncoding);
- const MCSymbol *&cieStart = isEH ? CIEStarts[key] : DummyDebugKey;
- if (!cieStart)
- cieStart = &Emitter.EmitCIE(streamer, frame.Personality,
- frame.PersonalityEncoding, frame.Lsda,
- frame.LsdaEncoding);
- fdeEnd = Emitter.EmitFDE(streamer, *cieStart, frame);
+ for (unsigned i = 0, n = Streamer.getNumFrameInfos(); i < n; ++i) {
+ const MCDwarfFrameInfo &Frame = Streamer.getFrameInfo(i);
+ if (IsEH && TAI.getCompactUnwindSection() &&
+ Emitter.EmitCompactUnwind(Streamer, Frame)) {
+ FDEEnd = NULL;
+ continue;
+ }
+
+ CIEKey Key(Frame.Personality, Frame.PersonalityEncoding,
+ Frame.LsdaEncoding);
+ const MCSymbol *&CIEStart = IsEH ? CIEStarts[Key] : DummyDebugKey;
+ if (!CIEStart)
+ CIEStart = &Emitter.EmitCIE(Streamer, Frame.Personality,
+ Frame.PersonalityEncoding, Frame.Lsda,
+ Frame.LsdaEncoding);
+
+ FDEEnd = Emitter.EmitFDE(Streamer, *CIEStart, Frame);
+
if (i != n - 1)
- streamer.EmitLabel(fdeEnd);
+ Streamer.EmitLabel(FDEEnd);
}
- streamer.EmitValueToAlignment(asmInfo.getPointerSize());
- if (fdeEnd)
- streamer.EmitLabel(fdeEnd);
+ Streamer.EmitValueToAlignment(Context.getAsmInfo().getPointerSize());
+ if (FDEEnd)
+ Streamer.EmitLabel(FDEEnd);
}
void MCDwarfFrameEmitter::EmitAdvanceLoc(MCStreamer &Streamer,
diff --git a/contrib/llvm/lib/MC/MCELFStreamer.cpp b/contrib/llvm/lib/MC/MCELFStreamer.cpp
index bbb2789..49340ed 100644
--- a/contrib/llvm/lib/MC/MCELFStreamer.cpp
+++ b/contrib/llvm/lib/MC/MCELFStreamer.cpp
@@ -26,7 +26,6 @@
#include "llvm/Support/ErrorHandling.h"
#include "llvm/Support/raw_ostream.h"
#include "llvm/Target/TargetAsmBackend.h"
-#include "llvm/Target/TargetAsmInfo.h"
using namespace llvm;
diff --git a/contrib/llvm/lib/MC/MCELFStreamer.h b/contrib/llvm/lib/MC/MCELFStreamer.h
index db34d58..855e7e9 100644
--- a/contrib/llvm/lib/MC/MCELFStreamer.h
+++ b/contrib/llvm/lib/MC/MCELFStreamer.h
@@ -138,137 +138,3 @@ private:
} // end llvm namespace
#endif
-//===- lib/MC/MCELFStreamer.h - ELF Object Output -------------------------===//
-//
-// The LLVM Compiler Infrastructure
-//
-// This file is distributed under the University of Illinois Open Source
-// License. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-//
-// This file assembles .s files and emits ELF .o object files.
-//
-//===----------------------------------------------------------------------===//
-
-#ifndef LLVM_MC_MCELFSTREAMER_H
-#define LLVM_MC_MCELFSTREAMER_H
-
-#include "llvm/ADT/SmallPtrSet.h"
-#include "llvm/ADT/DenseMap.h"
-#include "llvm/MC/MCAssembler.h"
-#include "llvm/MC/MCContext.h"
-#include "llvm/MC/MCObjectStreamer.h"
-#include "llvm/MC/MCSectionELF.h"
-
-namespace llvm {
-
-class MCELFStreamer : public MCObjectStreamer {
-public:
- MCELFStreamer(MCContext &Context, TargetAsmBackend &TAB,
- raw_ostream &OS, MCCodeEmitter *Emitter)
- : MCObjectStreamer(Context, TAB, OS, Emitter) {}
-
- ~MCELFStreamer() {}
-
- /// @name MCStreamer Interface
- /// @{
-
- virtual void InitSections();
- virtual void ChangeSection(const MCSection *Section);
- virtual void EmitLabel(MCSymbol *Symbol);
- virtual void EmitAssemblerFlag(MCAssemblerFlag Flag);
- virtual void EmitThumbFunc(MCSymbol *Func);
- virtual void EmitAssignment(MCSymbol *Symbol, const MCExpr *Value);
- virtual void EmitWeakReference(MCSymbol *Alias, const MCSymbol *Symbol);
- virtual void EmitSymbolAttribute(MCSymbol *Symbol, MCSymbolAttr Attribute);
- virtual void EmitSymbolDesc(MCSymbol *Symbol, unsigned DescValue) {
- assert(0 && "ELF doesn't support this directive");
- }
- virtual void EmitCommonSymbol(MCSymbol *Symbol, uint64_t Size,
- unsigned ByteAlignment);
- virtual void BeginCOFFSymbolDef(const MCSymbol *Symbol) {
- assert(0 && "ELF doesn't support this directive");
- }
-
- virtual void EmitCOFFSymbolStorageClass(int StorageClass) {
- assert(0 && "ELF doesn't support this directive");
- }
-
- virtual void EmitCOFFSymbolType(int Type) {
- assert(0 && "ELF doesn't support this directive");
- }
-
- virtual void EndCOFFSymbolDef() {
- assert(0 && "ELF doesn't support this directive");
- }
-
- virtual void EmitELFSize(MCSymbol *Symbol, const MCExpr *Value) {
- MCSymbolData &SD = getAssembler().getOrCreateSymbolData(*Symbol);
- SD.setSize(Value);
- }
-
- virtual void EmitLocalCommonSymbol(MCSymbol *Symbol, uint64_t Size);
-
- virtual void EmitZerofill(const MCSection *Section, MCSymbol *Symbol = 0,
- unsigned Size = 0, unsigned ByteAlignment = 0) {
- assert(0 && "ELF doesn't support this directive");
- }
- virtual void EmitTBSSSymbol(const MCSection *Section, MCSymbol *Symbol,
- uint64_t Size, unsigned ByteAlignment = 0) {
- assert(0 && "ELF doesn't support this directive");
- }
- virtual void EmitBytes(StringRef Data, unsigned AddrSpace);
- virtual void EmitValueToAlignment(unsigned ByteAlignment, int64_t Value = 0,
- unsigned ValueSize = 1,
- unsigned MaxBytesToEmit = 0);
- virtual void EmitCodeAlignment(unsigned ByteAlignment,
- unsigned MaxBytesToEmit = 0);
-
- virtual void EmitFileDirective(StringRef Filename);
-
- virtual void Finish();
-
-private:
- virtual void EmitInstToFragment(const MCInst &Inst);
- virtual void EmitInstToData(const MCInst &Inst);
-
- void fixSymbolsInTLSFixups(const MCExpr *expr);
-
- struct LocalCommon {
- MCSymbolData *SD;
- uint64_t Size;
- unsigned ByteAlignment;
- };
- std::vector<LocalCommon> LocalCommons;
-
- SmallPtrSet<MCSymbol *, 16> BindingExplicitlySet;
- /// @}
- void SetSection(StringRef Section, unsigned Type, unsigned Flags,
- SectionKind Kind) {
- SwitchSection(getContext().getELFSection(Section, Type, Flags, Kind));
- }
-
- void SetSectionData() {
- SetSection(".data", ELF::SHT_PROGBITS,
- ELF::SHF_WRITE |ELF::SHF_ALLOC,
- SectionKind::getDataRel());
- EmitCodeAlignment(4, 0);
- }
- void SetSectionText() {
- SetSection(".text", ELF::SHT_PROGBITS,
- ELF::SHF_EXECINSTR |
- ELF::SHF_ALLOC, SectionKind::getText());
- EmitCodeAlignment(4, 0);
- }
- void SetSectionBss() {
- SetSection(".bss", ELF::SHT_NOBITS,
- ELF::SHF_WRITE |
- ELF::SHF_ALLOC, SectionKind::getBSS());
- EmitCodeAlignment(4, 0);
- }
-};
-
-} // end llvm namespace
-
-#endif
diff --git a/contrib/llvm/lib/MC/MCLoggingStreamer.cpp b/contrib/llvm/lib/MC/MCLoggingStreamer.cpp
index 46ea9b8..309752e 100644
--- a/contrib/llvm/lib/MC/MCLoggingStreamer.cpp
+++ b/contrib/llvm/lib/MC/MCLoggingStreamer.cpp
@@ -85,9 +85,11 @@ public:
virtual void EmitDwarfAdvanceLineAddr(int64_t LineDelta,
const MCSymbol *LastLabel,
- const MCSymbol *Label) {
+ const MCSymbol *Label,
+ unsigned PointerSize) {
LogCall("EmitDwarfAdvanceLineAddr");
- return Child->EmitDwarfAdvanceLineAddr(LineDelta, LastLabel, Label);
+ return Child->EmitDwarfAdvanceLineAddr(LineDelta, LastLabel, Label,
+ PointerSize);
}
virtual void EmitSymbolAttribute(MCSymbol *Symbol, MCSymbolAttr Attribute) {
diff --git a/contrib/llvm/lib/MC/MCMachOStreamer.cpp b/contrib/llvm/lib/MC/MCMachOStreamer.cpp
index 12aeb4f..1b21249 100644
--- a/contrib/llvm/lib/MC/MCMachOStreamer.cpp
+++ b/contrib/llvm/lib/MC/MCMachOStreamer.cpp
@@ -24,7 +24,6 @@
#include "llvm/Support/ErrorHandling.h"
#include "llvm/Support/raw_ostream.h"
#include "llvm/Target/TargetAsmBackend.h"
-#include "llvm/Target/TargetAsmInfo.h"
using namespace llvm;
diff --git a/contrib/llvm/lib/MC/MCNullStreamer.cpp b/contrib/llvm/lib/MC/MCNullStreamer.cpp
index f38b822..9577af0 100644
--- a/contrib/llvm/lib/MC/MCNullStreamer.cpp
+++ b/contrib/llvm/lib/MC/MCNullStreamer.cpp
@@ -44,7 +44,8 @@ namespace {
virtual void EmitWeakReference(MCSymbol *Alias, const MCSymbol *Symbol){}
virtual void EmitDwarfAdvanceLineAddr(int64_t LineDelta,
const MCSymbol *LastLabel,
- const MCSymbol *Label) {}
+ const MCSymbol *Label,
+ unsigned PointerSize) {}
virtual void EmitSymbolAttribute(MCSymbol *Symbol, MCSymbolAttr Attribute){}
diff --git a/contrib/llvm/lib/MC/MCObjectStreamer.cpp b/contrib/llvm/lib/MC/MCObjectStreamer.cpp
index e230c53..8635aac 100644
--- a/contrib/llvm/lib/MC/MCObjectStreamer.cpp
+++ b/contrib/llvm/lib/MC/MCObjectStreamer.cpp
@@ -18,7 +18,6 @@
#include "llvm/MC/MCExpr.h"
#include "llvm/MC/MCSymbol.h"
#include "llvm/Target/TargetAsmBackend.h"
-#include "llvm/Target/TargetAsmInfo.h"
using namespace llvm;
MCObjectStreamer::MCObjectStreamer(MCContext &Context, TargetAsmBackend &TAB,
@@ -197,9 +196,9 @@ void MCObjectStreamer::EmitInstToFragment(const MCInst &Inst) {
void MCObjectStreamer::EmitDwarfAdvanceLineAddr(int64_t LineDelta,
const MCSymbol *LastLabel,
- const MCSymbol *Label) {
+ const MCSymbol *Label,
+ unsigned PointerSize) {
if (!LastLabel) {
- int PointerSize = getContext().getTargetAsmInfo().getPointerSize();
EmitDwarfSetLineAddr(LineDelta, Label, PointerSize);
return;
}
diff --git a/contrib/llvm/lib/MC/MCParser/AsmParser.cpp b/contrib/llvm/lib/MC/MCParser/AsmParser.cpp
index 4f55cea..0c181f3 100644
--- a/contrib/llvm/lib/MC/MCParser/AsmParser.cpp
+++ b/contrib/llvm/lib/MC/MCParser/AsmParser.cpp
@@ -28,6 +28,7 @@
#include "llvm/MC/MCSymbol.h"
#include "llvm/MC/MCDwarf.h"
#include "llvm/Support/CommandLine.h"
+#include "llvm/Support/MathExtras.h"
#include "llvm/Support/MemoryBuffer.h"
#include "llvm/Support/SourceMgr.h"
#include "llvm/Support/raw_ostream.h"
@@ -84,6 +85,7 @@ private:
AsmLexer Lexer;
MCContext &Ctx;
MCStreamer &Out;
+ const MCAsmInfo &MAI;
SourceMgr &SrcMgr;
MCAsmParserExtension *GenericParser;
MCAsmParserExtension *PlatformParser;
@@ -135,7 +137,7 @@ public:
virtual MCContext &getContext() { return Ctx; }
virtual MCStreamer &getStreamer() { return Out; }
- virtual bool Warning(SMLoc L, const Twine &Meg);
+ virtual bool Warning(SMLoc L, const Twine &Msg);
virtual bool Error(SMLoc L, const Twine &Msg);
const AsmToken &Lex();
@@ -160,8 +162,9 @@ private:
void HandleMacroExit();
void PrintMacroInstantiations();
- void PrintMessage(SMLoc Loc, const Twine &Msg, const char *Type) const {
- SrcMgr.PrintMessage(Loc, Msg, Type);
+ void PrintMessage(SMLoc Loc, const Twine &Msg, const char *Type,
+ bool ShowLine = true) const {
+ SrcMgr.PrintMessage(Loc, Msg, Type, ShowLine);
}
/// EnterIncludeFile - Enter the specified file. This returns true on failure.
@@ -337,7 +340,7 @@ enum { DEFAULT_ADDRSPACE = 0 };
AsmParser::AsmParser(const Target &T, SourceMgr &_SM, MCContext &_Ctx,
MCStreamer &_Out, const MCAsmInfo &_MAI)
- : Lexer(_MAI), Ctx(_Ctx), Out(_Out), SrcMgr(_SM),
+ : Lexer(_MAI), Ctx(_Ctx), Out(_Out), MAI(_MAI), SrcMgr(_SM),
GenericParser(new GenericAsmParser), PlatformParser(0),
CurBuffer(0), MacrosEnabled(true) {
Lexer.setBuffer(SrcMgr.getMemoryBuffer(CurBuffer));
@@ -466,6 +469,29 @@ bool AsmParser::Run(bool NoInitialTextSection, bool NoFinalize) {
TokError("unassigned file number: " + Twine(i) + " for .file directives");
}
+ // Check to see that all assembler local symbols were actually defined.
+ // Targets that don't do subsections via symbols may not want this, though,
+ // so conservatively exclude them. Only do this if we're finalizing, though,
+ // as otherwise we won't necessarilly have seen everything yet.
+ if (!NoFinalize && MAI.hasSubsectionsViaSymbols()) {
+ const MCContext::SymbolTable &Symbols = getContext().getSymbols();
+ for (MCContext::SymbolTable::const_iterator i = Symbols.begin(),
+ e = Symbols.end();
+ i != e; ++i) {
+ MCSymbol *Sym = i->getValue();
+ // Variable symbols may not be marked as defined, so check those
+ // explicitly. If we know it's a variable, we have a definition for
+ // the purposes of this check.
+ if (Sym->isTemporary() && !Sym->isVariable() && !Sym->isDefined())
+ // FIXME: We would really like to refer back to where the symbol was
+ // first referenced for a source location. We need to add something
+ // to track that. Currently, we just point to the end of the file.
+ PrintMessage(getLexer().getLoc(), "assembler local symbol '" +
+ Sym->getName() + "' not defined", "error", false);
+ }
+ }
+
+
// Finalize the output stream if there are no errors and if the client wants
// us to.
if (!HadError && !NoFinalize)
@@ -1121,7 +1147,7 @@ bool AsmParser::ParseStatement() {
if (IDVal == ".weak_def_can_be_hidden")
return ParseDirectiveSymbolAttribute(MCSA_WeakDefAutoPrivate);
- if (IDVal == ".comm")
+ if (IDVal == ".comm" || IDVal == ".common")
return ParseDirectiveComm(/*IsLocal=*/false);
if (IDVal == ".lcomm")
return ParseDirectiveComm(/*IsLocal=*/true);
@@ -1168,7 +1194,7 @@ bool AsmParser::ParseStatement() {
for (unsigned i = 0; i != ParsedOperands.size(); ++i) {
if (i != 0)
OS << ", ";
- ParsedOperands[i]->dump(OS);
+ ParsedOperands[i]->print(OS);
}
OS << "]";
@@ -1587,13 +1613,18 @@ bool AsmParser::ParseDirectiveValue(unsigned Size) {
for (;;) {
const MCExpr *Value;
+ SMLoc ExprLoc = getLexer().getLoc();
if (ParseExpression(Value))
return true;
// Special case constant expressions to match code generator.
- if (const MCConstantExpr *MCE = dyn_cast<MCConstantExpr>(Value))
- getStreamer().EmitIntValue(MCE->getValue(), Size, DEFAULT_ADDRSPACE);
- else
+ if (const MCConstantExpr *MCE = dyn_cast<MCConstantExpr>(Value)) {
+ assert(Size <= 8 && "Invalid size");
+ uint64_t IntValue = MCE->getValue();
+ if (!isUIntN(8 * Size, IntValue) && !isIntN(8 * Size, IntValue))
+ return Error(ExprLoc, "literal value out of range for directive");
+ getStreamer().EmitIntValue(IntValue, Size, DEFAULT_ADDRSPACE);
+ } else
getStreamer().EmitValue(Value, Size, DEFAULT_ADDRSPACE);
if (getLexer().is(AsmToken::EndOfStatement))
diff --git a/contrib/llvm/lib/MC/MCParser/COFFAsmParser.cpp b/contrib/llvm/lib/MC/MCParser/COFFAsmParser.cpp
index 64f6355..66ad384 100644
--- a/contrib/llvm/lib/MC/MCParser/COFFAsmParser.cpp
+++ b/contrib/llvm/lib/MC/MCParser/COFFAsmParser.cpp
@@ -401,14 +401,14 @@ bool COFFAsmParser::ParseAtUnwindOrAtExcept(bool &unwind, bool &except) {
bool COFFAsmParser::ParseSEHRegisterNumber(unsigned &RegNo) {
SMLoc startLoc = getLexer().getLoc();
if (getLexer().is(AsmToken::Percent)) {
- const TargetAsmInfo &asmInfo = getContext().getTargetAsmInfo();
+ const TargetAsmInfo &TAI = getContext().getTargetAsmInfo();
SMLoc endLoc;
unsigned LLVMRegNo;
if (getParser().getTargetParser().ParseRegister(LLVMRegNo,startLoc,endLoc))
return true;
// Check that this is a non-volatile register.
- const unsigned *NVRegs = asmInfo.getCalleeSavedRegs();
+ const unsigned *NVRegs = TAI.getCalleeSavedRegs();
unsigned i;
for (i = 0; NVRegs[i] != 0; ++i)
if (NVRegs[i] == LLVMRegNo)
@@ -416,7 +416,7 @@ bool COFFAsmParser::ParseSEHRegisterNumber(unsigned &RegNo) {
if (NVRegs[i] == 0)
return Error(startLoc, "expected non-volatile register");
- int SEHRegNo = asmInfo.getSEHRegNum(LLVMRegNo);
+ int SEHRegNo = TAI.getSEHRegNum(LLVMRegNo);
if (SEHRegNo < 0)
return Error(startLoc,"register can't be represented in SEH unwind info");
RegNo = SEHRegNo;
diff --git a/contrib/llvm/lib/MC/MCParser/MCAsmParser.cpp b/contrib/llvm/lib/MC/MCParser/MCAsmParser.cpp
index 70295ef..4030e41 100644
--- a/contrib/llvm/lib/MC/MCParser/MCAsmParser.cpp
+++ b/contrib/llvm/lib/MC/MCParser/MCAsmParser.cpp
@@ -12,6 +12,8 @@
#include "llvm/MC/MCParser/MCAsmLexer.h"
#include "llvm/MC/MCParser/MCParsedAsmOperand.h"
#include "llvm/Support/SourceMgr.h"
+#include "llvm/Support/raw_ostream.h"
+#include "llvm/Support/Debug.h"
#include "llvm/Target/TargetAsmParser.h"
using namespace llvm;
@@ -41,4 +43,6 @@ bool MCAsmParser::ParseExpression(const MCExpr *&Res) {
return ParseExpression(Res, L);
}
-
+void MCParsedAsmOperand::dump() const {
+ dbgs() << " " << *this;
+}
diff --git a/contrib/llvm/lib/MC/MCParser/TargetAsmParser.cpp b/contrib/llvm/lib/MC/MCParser/TargetAsmParser.cpp
index 8d43c21..512f6b0 100644
--- a/contrib/llvm/lib/MC/MCParser/TargetAsmParser.cpp
+++ b/contrib/llvm/lib/MC/MCParser/TargetAsmParser.cpp
@@ -10,8 +10,8 @@
#include "llvm/Target/TargetAsmParser.h"
using namespace llvm;
-TargetAsmParser::TargetAsmParser(const Target &T)
- : TheTarget(T), AvailableFeatures(0)
+TargetAsmParser::TargetAsmParser()
+ : AvailableFeatures(0)
{
}
diff --git a/contrib/llvm/lib/MC/MCStreamer.cpp b/contrib/llvm/lib/MC/MCStreamer.cpp
index ae3ed0f..6e96b78 100644
--- a/contrib/llvm/lib/MC/MCStreamer.cpp
+++ b/contrib/llvm/lib/MC/MCStreamer.cpp
@@ -15,7 +15,6 @@
#include "llvm/MC/MCSymbol.h"
#include "llvm/Support/ErrorHandling.h"
#include "llvm/Support/raw_ostream.h"
-#include "llvm/Target/TargetAsmInfo.h"
#include "llvm/ADT/SmallString.h"
#include "llvm/ADT/Twine.h"
#include <cstdlib>
@@ -81,7 +80,7 @@ void MCStreamer::EmitIntValue(uint64_t Value, unsigned Size,
assert((isUIntN(8 * Size, Value) || isIntN(8 * Size, Value)) &&
"Invalid size");
char buf[8];
- const bool isLittleEndian = Context.getTargetAsmInfo().isLittleEndian();
+ const bool isLittleEndian = Context.getAsmInfo().isLittleEndian();
for (unsigned i = 0; i != Size; ++i) {
unsigned index = isLittleEndian ? i : (Size - i - 1);
buf[i] = uint8_t(Value >> (index * 8));
diff --git a/contrib/llvm/lib/MC/MCSubtargetInfo.cpp b/contrib/llvm/lib/MC/MCSubtargetInfo.cpp
new file mode 100644
index 0000000..86dc108
--- /dev/null
+++ b/contrib/llvm/lib/MC/MCSubtargetInfo.cpp
@@ -0,0 +1,96 @@
+//===-- MCSubtargetInfo.cpp - Subtarget Information -----------------------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+#include "llvm/MC/MCSubtargetInfo.h"
+#include "llvm/MC/MCInstrItineraries.h"
+#include "llvm/MC/SubtargetFeature.h"
+#include "llvm/ADT/StringRef.h"
+#include "llvm/ADT/Triple.h"
+#include "llvm/Support/raw_ostream.h"
+#include <algorithm>
+
+using namespace llvm;
+
+void
+MCSubtargetInfo::InitMCSubtargetInfo(StringRef TT, StringRef CPU, StringRef FS,
+ const SubtargetFeatureKV *PF,
+ const SubtargetFeatureKV *PD,
+ const SubtargetInfoKV *PI,
+ const InstrStage *IS,
+ const unsigned *OC,
+ const unsigned *FP,
+ unsigned NF, unsigned NP) {
+ TargetTriple = TT;
+ ProcFeatures = PF;
+ ProcDesc = PD;
+ ProcItins = PI;
+ Stages = IS;
+ OperandCycles = OC;
+ ForwardingPathes = FP;
+ NumFeatures = NF;
+ NumProcs = NP;
+
+ SubtargetFeatures Features(FS);
+ FeatureBits = Features.getFeatureBits(CPU, ProcDesc, NumProcs,
+ ProcFeatures, NumFeatures);
+}
+
+
+/// ReInitMCSubtargetInfo - Change CPU (and optionally supplemented with
+/// feature string) and recompute feature bits.
+uint64_t MCSubtargetInfo::ReInitMCSubtargetInfo(StringRef CPU, StringRef FS) {
+ SubtargetFeatures Features(FS);
+ FeatureBits = Features.getFeatureBits(CPU, ProcDesc, NumProcs,
+ ProcFeatures, NumFeatures);
+ return FeatureBits;
+}
+
+/// ToggleFeature - Toggle a feature and returns the re-computed feature
+/// bits. This version does not change the implied bits.
+uint64_t MCSubtargetInfo::ToggleFeature(uint64_t FB) {
+ FeatureBits ^= FB;
+ return FeatureBits;
+}
+
+/// ToggleFeature - Toggle a feature and returns the re-computed feature
+/// bits. This version will also change all implied bits.
+uint64_t MCSubtargetInfo::ToggleFeature(StringRef FS) {
+ SubtargetFeatures Features;
+ FeatureBits = Features.ToggleFeature(FeatureBits, FS,
+ ProcFeatures, NumFeatures);
+ return FeatureBits;
+}
+
+
+InstrItineraryData
+MCSubtargetInfo::getInstrItineraryForCPU(StringRef CPU) const {
+ assert(ProcItins && "Instruction itineraries information not available!");
+
+#ifndef NDEBUG
+ for (size_t i = 1; i < NumProcs; i++) {
+ assert(strcmp(ProcItins[i - 1].Key, ProcItins[i].Key) < 0 &&
+ "Itineraries table is not sorted");
+ }
+#endif
+
+ // Find entry
+ SubtargetInfoKV KV;
+ KV.Key = CPU.data();
+ const SubtargetInfoKV *Found =
+ std::lower_bound(ProcItins, ProcItins+NumProcs, KV);
+ if (Found == ProcItins+NumProcs || StringRef(Found->Key) != CPU) {
+ errs() << "'" << CPU
+ << "' is not a recognized processor for this target"
+ << " (ignoring processor)\n";
+ return InstrItineraryData();
+ }
+
+ return InstrItineraryData(Stages, OperandCycles, ForwardingPathes,
+ (InstrItinerary *)Found->Value);
+}
diff --git a/contrib/llvm/lib/MC/MCWin64EH.cpp b/contrib/llvm/lib/MC/MCWin64EH.cpp
index 9453f5c..e698384 100644
--- a/contrib/llvm/lib/MC/MCWin64EH.cpp
+++ b/contrib/llvm/lib/MC/MCWin64EH.cpp
@@ -225,9 +225,9 @@ void MCWin64EHUnwindEmitter::EmitUnwindInfo(MCStreamer &streamer,
// Switch sections (the static function above is meant to be called from
// here and from Emit().
MCContext &context = streamer.getContext();
- const TargetAsmInfo &asmInfo = context.getTargetAsmInfo();
+ const TargetAsmInfo &TAI = context.getTargetAsmInfo();
const MCSection *xdataSect =
- asmInfo.getWin64EHTableSection(GetSectionSuffix(info->Function));
+ TAI.getWin64EHTableSection(GetSectionSuffix(info->Function));
streamer.SwitchSection(xdataSect);
llvm::EmitUnwindInfo(streamer, info);
@@ -236,11 +236,11 @@ void MCWin64EHUnwindEmitter::EmitUnwindInfo(MCStreamer &streamer,
void MCWin64EHUnwindEmitter::Emit(MCStreamer &streamer) {
MCContext &context = streamer.getContext();
// Emit the unwind info structs first.
- const TargetAsmInfo &asmInfo = context.getTargetAsmInfo();
+ const TargetAsmInfo &TAI = context.getTargetAsmInfo();
for (unsigned i = 0; i < streamer.getNumW64UnwindInfos(); ++i) {
MCWin64EHUnwindInfo &info = streamer.getW64UnwindInfo(i);
const MCSection *xdataSect =
- asmInfo.getWin64EHTableSection(GetSectionSuffix(info.Function));
+ TAI.getWin64EHTableSection(GetSectionSuffix(info.Function));
streamer.SwitchSection(xdataSect);
llvm::EmitUnwindInfo(streamer, &info);
}
@@ -248,7 +248,7 @@ void MCWin64EHUnwindEmitter::Emit(MCStreamer &streamer) {
for (unsigned i = 0; i < streamer.getNumW64UnwindInfos(); ++i) {
MCWin64EHUnwindInfo &info = streamer.getW64UnwindInfo(i);
const MCSection *pdataSect =
- asmInfo.getWin64EHFuncTableSection(GetSectionSuffix(info.Function));
+ TAI.getWin64EHFuncTableSection(GetSectionSuffix(info.Function));
streamer.SwitchSection(pdataSect);
EmitRuntimeFunction(streamer, &info);
}
diff --git a/contrib/llvm/lib/MC/MachObjectWriter.cpp b/contrib/llvm/lib/MC/MachObjectWriter.cpp
index f049b1c..69efe23 100644
--- a/contrib/llvm/lib/MC/MachObjectWriter.cpp
+++ b/contrib/llvm/lib/MC/MachObjectWriter.cpp
@@ -23,34 +23,12 @@
#include "llvm/Support/ErrorHandling.h"
#include "llvm/Target/TargetAsmBackend.h"
-// FIXME: Gross.
-#include "../Target/ARM/ARMFixupKinds.h"
-#include "../Target/X86/X86FixupKinds.h"
-
#include <vector>
using namespace llvm;
using namespace llvm::object;
-// FIXME: this has been copied from (or to) X86AsmBackend.cpp
-static unsigned getFixupKindLog2Size(unsigned Kind) {
- switch (Kind) {
- default:
- llvm_unreachable("invalid fixup kind!");
- case FK_PCRel_1:
- case FK_Data_1: return 0;
- case FK_PCRel_2:
- case FK_Data_2: return 1;
- case FK_PCRel_4:
- // FIXME: Remove these!!!
- case X86::reloc_riprel_4byte:
- case X86::reloc_riprel_4byte_movq_load:
- case X86::reloc_signed_4byte:
- case FK_Data_4: return 2;
- case FK_Data_8: return 3;
- }
-}
-
-static bool doesSymbolRequireExternRelocation(MCSymbolData *SD) {
+bool MachObjectWriter::
+doesSymbolRequireExternRelocation(const MCSymbolData *SD) {
// Undefined symbols are always extern.
if (SD->Symbol->isUndefined())
return true;
@@ -64,1557 +42,740 @@ static bool doesSymbolRequireExternRelocation(MCSymbolData *SD) {
return false;
}
-namespace {
-
-class MachObjectWriter : public MCObjectWriter {
- /// MachSymbolData - Helper struct for containing some precomputed information
- /// on symbols.
- struct MachSymbolData {
- MCSymbolData *SymbolData;
- uint64_t StringIndex;
- uint8_t SectionIndex;
+bool MachObjectWriter::
+MachSymbolData::operator<(const MachSymbolData &RHS) const {
+ return SymbolData->getSymbol().getName() <
+ RHS.SymbolData->getSymbol().getName();
+}
- // Support lexicographic sorting.
- bool operator<(const MachSymbolData &RHS) const {
- return SymbolData->getSymbol().getName() <
- RHS.SymbolData->getSymbol().getName();
- }
- };
+bool MachObjectWriter::isFixupKindPCRel(const MCAssembler &Asm, unsigned Kind) {
+ const MCFixupKindInfo &FKI = Asm.getBackend().getFixupKindInfo(
+ (MCFixupKind) Kind);
- /// The target specific Mach-O writer instance.
- llvm::OwningPtr<MCMachObjectTargetWriter> TargetObjectWriter;
+ return FKI.Flags & MCFixupKindInfo::FKF_IsPCRel;
+}
- /// @name Relocation Data
- /// @{
+uint64_t MachObjectWriter::getFragmentAddress(const MCFragment *Fragment,
+ const MCAsmLayout &Layout) const {
+ return getSectionAddress(Fragment->getParent()) +
+ Layout.getFragmentOffset(Fragment);
+}
- llvm::DenseMap<const MCSectionData*,
- std::vector<macho::RelocationEntry> > Relocations;
- llvm::DenseMap<const MCSectionData*, unsigned> IndirectSymBase;
+uint64_t MachObjectWriter::getSymbolAddress(const MCSymbolData* SD,
+ const MCAsmLayout &Layout) const {
+ const MCSymbol &S = SD->getSymbol();
+
+ // If this is a variable, then recursively evaluate now.
+ if (S.isVariable()) {
+ MCValue Target;
+ if (!S.getVariableValue()->EvaluateAsRelocatable(Target, Layout))
+ report_fatal_error("unable to evaluate offset for variable '" +
+ S.getName() + "'");
+
+ // Verify that any used symbols are defined.
+ if (Target.getSymA() && Target.getSymA()->getSymbol().isUndefined())
+ report_fatal_error("unable to evaluate offset to undefined symbol '" +
+ Target.getSymA()->getSymbol().getName() + "'");
+ if (Target.getSymB() && Target.getSymB()->getSymbol().isUndefined())
+ report_fatal_error("unable to evaluate offset to undefined symbol '" +
+ Target.getSymB()->getSymbol().getName() + "'");
+
+ uint64_t Address = Target.getConstant();
+ if (Target.getSymA())
+ Address += getSymbolAddress(&Layout.getAssembler().getSymbolData(
+ Target.getSymA()->getSymbol()), Layout);
+ if (Target.getSymB())
+ Address += getSymbolAddress(&Layout.getAssembler().getSymbolData(
+ Target.getSymB()->getSymbol()), Layout);
+ return Address;
+ }
- /// @}
- /// @name Symbol Table Data
- /// @{
+ return getSectionAddress(SD->getFragment()->getParent()) +
+ Layout.getSymbolOffset(SD);
+}
- SmallString<256> StringTable;
- std::vector<MachSymbolData> LocalSymbolData;
- std::vector<MachSymbolData> ExternalSymbolData;
- std::vector<MachSymbolData> UndefinedSymbolData;
+uint64_t MachObjectWriter::getPaddingSize(const MCSectionData *SD,
+ const MCAsmLayout &Layout) const {
+ uint64_t EndAddr = getSectionAddress(SD) + Layout.getSectionAddressSize(SD);
+ unsigned Next = SD->getLayoutOrder() + 1;
+ if (Next >= Layout.getSectionOrder().size())
+ return 0;
+
+ const MCSectionData &NextSD = *Layout.getSectionOrder()[Next];
+ if (NextSD.getSection().isVirtualSection())
+ return 0;
+ return OffsetToAlignment(EndAddr, NextSD.getAlignment());
+}
- /// @}
+void MachObjectWriter::WriteHeader(unsigned NumLoadCommands,
+ unsigned LoadCommandsSize,
+ bool SubsectionsViaSymbols) {
+ uint32_t Flags = 0;
-private:
- /// @name Utility Methods
- /// @{
+ if (SubsectionsViaSymbols)
+ Flags |= macho::HF_SubsectionsViaSymbols;
- bool isFixupKindPCRel(const MCAssembler &Asm, unsigned Kind) {
- const MCFixupKindInfo &FKI = Asm.getBackend().getFixupKindInfo(
- (MCFixupKind) Kind);
+ // struct mach_header (28 bytes) or
+ // struct mach_header_64 (32 bytes)
- return FKI.Flags & MCFixupKindInfo::FKF_IsPCRel;
- }
+ uint64_t Start = OS.tell();
+ (void) Start;
- /// @}
+ Write32(is64Bit() ? macho::HM_Object64 : macho::HM_Object32);
- SectionAddrMap SectionAddress;
- uint64_t getSectionAddress(const MCSectionData* SD) const {
- return SectionAddress.lookup(SD);
- }
- uint64_t getSymbolAddress(const MCSymbolData* SD,
- const MCAsmLayout &Layout) const {
- const MCSymbol &S = SD->getSymbol();
-
- // If this is a variable, then recursively evaluate now.
- if (S.isVariable()) {
- MCValue Target;
- if (!S.getVariableValue()->EvaluateAsRelocatable(Target, Layout))
- report_fatal_error("unable to evaluate offset for variable '" +
- S.getName() + "'");
-
- // Verify that any used symbols are defined.
- if (Target.getSymA() && Target.getSymA()->getSymbol().isUndefined())
- report_fatal_error("unable to evaluate offset to undefined symbol '" +
- Target.getSymA()->getSymbol().getName() + "'");
- if (Target.getSymB() && Target.getSymB()->getSymbol().isUndefined())
- report_fatal_error("unable to evaluate offset to undefined symbol '" +
- Target.getSymB()->getSymbol().getName() + "'");
-
- uint64_t Address = Target.getConstant();
- if (Target.getSymA())
- Address += getSymbolAddress(&Layout.getAssembler().getSymbolData(
- Target.getSymA()->getSymbol()), Layout);
- if (Target.getSymB())
- Address += getSymbolAddress(&Layout.getAssembler().getSymbolData(
- Target.getSymB()->getSymbol()), Layout);
- return Address;
- }
+ Write32(TargetObjectWriter->getCPUType());
+ Write32(TargetObjectWriter->getCPUSubtype());
- return getSectionAddress(SD->getFragment()->getParent()) +
- Layout.getSymbolOffset(SD);
- }
- uint64_t getFragmentAddress(const MCFragment *Fragment,
- const MCAsmLayout &Layout) const {
- return getSectionAddress(Fragment->getParent()) +
- Layout.getFragmentOffset(Fragment);
- }
+ Write32(macho::HFT_Object);
+ Write32(NumLoadCommands);
+ Write32(LoadCommandsSize);
+ Write32(Flags);
+ if (is64Bit())
+ Write32(0); // reserved
- uint64_t getPaddingSize(const MCSectionData *SD,
- const MCAsmLayout &Layout) const {
- uint64_t EndAddr = getSectionAddress(SD) + Layout.getSectionAddressSize(SD);
- unsigned Next = SD->getLayoutOrder() + 1;
- if (Next >= Layout.getSectionOrder().size())
- return 0;
-
- const MCSectionData &NextSD = *Layout.getSectionOrder()[Next];
- if (NextSD.getSection().isVirtualSection())
- return 0;
- return OffsetToAlignment(EndAddr, NextSD.getAlignment());
- }
+ assert(OS.tell() - Start ==
+ (is64Bit() ? macho::Header64Size : macho::Header32Size));
+}
-public:
- MachObjectWriter(MCMachObjectTargetWriter *MOTW, raw_ostream &_OS,
- bool _IsLittleEndian)
- : MCObjectWriter(_OS, _IsLittleEndian), TargetObjectWriter(MOTW) {
+/// WriteSegmentLoadCommand - Write a segment load command.
+///
+/// \arg NumSections - The number of sections in this segment.
+/// \arg SectionDataSize - The total size of the sections.
+void MachObjectWriter::WriteSegmentLoadCommand(unsigned NumSections,
+ uint64_t VMSize,
+ uint64_t SectionDataStartOffset,
+ uint64_t SectionDataSize) {
+ // struct segment_command (56 bytes) or
+ // struct segment_command_64 (72 bytes)
+
+ uint64_t Start = OS.tell();
+ (void) Start;
+
+ unsigned SegmentLoadCommandSize =
+ is64Bit() ? macho::SegmentLoadCommand64Size:
+ macho::SegmentLoadCommand32Size;
+ Write32(is64Bit() ? macho::LCT_Segment64 : macho::LCT_Segment);
+ Write32(SegmentLoadCommandSize +
+ NumSections * (is64Bit() ? macho::Section64Size :
+ macho::Section32Size));
+
+ WriteBytes("", 16);
+ if (is64Bit()) {
+ Write64(0); // vmaddr
+ Write64(VMSize); // vmsize
+ Write64(SectionDataStartOffset); // file offset
+ Write64(SectionDataSize); // file size
+ } else {
+ Write32(0); // vmaddr
+ Write32(VMSize); // vmsize
+ Write32(SectionDataStartOffset); // file offset
+ Write32(SectionDataSize); // file size
}
+ Write32(0x7); // maxprot
+ Write32(0x7); // initprot
+ Write32(NumSections);
+ Write32(0); // flags
- /// @name Target Writer Proxy Accessors
- /// @{
+ assert(OS.tell() - Start == SegmentLoadCommandSize);
+}
- bool is64Bit() const { return TargetObjectWriter->is64Bit(); }
- bool isARM() const {
- uint32_t CPUType = TargetObjectWriter->getCPUType() & ~mach::CTFM_ArchMask;
- return CPUType == mach::CTM_ARM;
+void MachObjectWriter::WriteSection(const MCAssembler &Asm,
+ const MCAsmLayout &Layout,
+ const MCSectionData &SD,
+ uint64_t FileOffset,
+ uint64_t RelocationsStart,
+ unsigned NumRelocations) {
+ uint64_t SectionSize = Layout.getSectionAddressSize(&SD);
+
+ // The offset is unused for virtual sections.
+ if (SD.getSection().isVirtualSection()) {
+ assert(Layout.getSectionFileSize(&SD) == 0 && "Invalid file size!");
+ FileOffset = 0;
}
- /// @}
-
- void WriteHeader(unsigned NumLoadCommands, unsigned LoadCommandsSize,
- bool SubsectionsViaSymbols) {
- uint32_t Flags = 0;
-
- if (SubsectionsViaSymbols)
- Flags |= macho::HF_SubsectionsViaSymbols;
-
- // struct mach_header (28 bytes) or
- // struct mach_header_64 (32 bytes)
-
- uint64_t Start = OS.tell();
- (void) Start;
-
- Write32(is64Bit() ? macho::HM_Object64 : macho::HM_Object32);
-
- Write32(TargetObjectWriter->getCPUType());
- Write32(TargetObjectWriter->getCPUSubtype());
-
- Write32(macho::HFT_Object);
- Write32(NumLoadCommands);
- Write32(LoadCommandsSize);
- Write32(Flags);
- if (is64Bit())
- Write32(0); // reserved
-
- assert(OS.tell() - Start ==
- (is64Bit() ? macho::Header64Size : macho::Header32Size));
+ // struct section (68 bytes) or
+ // struct section_64 (80 bytes)
+
+ uint64_t Start = OS.tell();
+ (void) Start;
+
+ const MCSectionMachO &Section = cast<MCSectionMachO>(SD.getSection());
+ WriteBytes(Section.getSectionName(), 16);
+ WriteBytes(Section.getSegmentName(), 16);
+ if (is64Bit()) {
+ Write64(getSectionAddress(&SD)); // address
+ Write64(SectionSize); // size
+ } else {
+ Write32(getSectionAddress(&SD)); // address
+ Write32(SectionSize); // size
}
+ Write32(FileOffset);
+
+ unsigned Flags = Section.getTypeAndAttributes();
+ if (SD.hasInstructions())
+ Flags |= MCSectionMachO::S_ATTR_SOME_INSTRUCTIONS;
+
+ assert(isPowerOf2_32(SD.getAlignment()) && "Invalid alignment!");
+ Write32(Log2_32(SD.getAlignment()));
+ Write32(NumRelocations ? RelocationsStart : 0);
+ Write32(NumRelocations);
+ Write32(Flags);
+ Write32(IndirectSymBase.lookup(&SD)); // reserved1
+ Write32(Section.getStubSize()); // reserved2
+ if (is64Bit())
+ Write32(0); // reserved3
+
+ assert(OS.tell() - Start == (is64Bit() ? macho::Section64Size :
+ macho::Section32Size));
+}
- /// WriteSegmentLoadCommand - Write a segment load command.
- ///
- /// \arg NumSections - The number of sections in this segment.
- /// \arg SectionDataSize - The total size of the sections.
- void WriteSegmentLoadCommand(unsigned NumSections,
- uint64_t VMSize,
- uint64_t SectionDataStartOffset,
- uint64_t SectionDataSize) {
- // struct segment_command (56 bytes) or
- // struct segment_command_64 (72 bytes)
-
- uint64_t Start = OS.tell();
- (void) Start;
-
- unsigned SegmentLoadCommandSize =
- is64Bit() ? macho::SegmentLoadCommand64Size:
- macho::SegmentLoadCommand32Size;
- Write32(is64Bit() ? macho::LCT_Segment64 : macho::LCT_Segment);
- Write32(SegmentLoadCommandSize +
- NumSections * (is64Bit() ? macho::Section64Size :
- macho::Section32Size));
-
- WriteBytes("", 16);
- if (is64Bit()) {
- Write64(0); // vmaddr
- Write64(VMSize); // vmsize
- Write64(SectionDataStartOffset); // file offset
- Write64(SectionDataSize); // file size
- } else {
- Write32(0); // vmaddr
- Write32(VMSize); // vmsize
- Write32(SectionDataStartOffset); // file offset
- Write32(SectionDataSize); // file size
- }
- Write32(0x7); // maxprot
- Write32(0x7); // initprot
- Write32(NumSections);
- Write32(0); // flags
+void MachObjectWriter::WriteSymtabLoadCommand(uint32_t SymbolOffset,
+ uint32_t NumSymbols,
+ uint32_t StringTableOffset,
+ uint32_t StringTableSize) {
+ // struct symtab_command (24 bytes)
- assert(OS.tell() - Start == SegmentLoadCommandSize);
- }
+ uint64_t Start = OS.tell();
+ (void) Start;
- void WriteSection(const MCAssembler &Asm, const MCAsmLayout &Layout,
- const MCSectionData &SD, uint64_t FileOffset,
- uint64_t RelocationsStart, unsigned NumRelocations) {
- uint64_t SectionSize = Layout.getSectionAddressSize(&SD);
+ Write32(macho::LCT_Symtab);
+ Write32(macho::SymtabLoadCommandSize);
+ Write32(SymbolOffset);
+ Write32(NumSymbols);
+ Write32(StringTableOffset);
+ Write32(StringTableSize);
- // The offset is unused for virtual sections.
- if (SD.getSection().isVirtualSection()) {
- assert(Layout.getSectionFileSize(&SD) == 0 && "Invalid file size!");
- FileOffset = 0;
- }
+ assert(OS.tell() - Start == macho::SymtabLoadCommandSize);
+}
- // struct section (68 bytes) or
- // struct section_64 (80 bytes)
+void MachObjectWriter::WriteDysymtabLoadCommand(uint32_t FirstLocalSymbol,
+ uint32_t NumLocalSymbols,
+ uint32_t FirstExternalSymbol,
+ uint32_t NumExternalSymbols,
+ uint32_t FirstUndefinedSymbol,
+ uint32_t NumUndefinedSymbols,
+ uint32_t IndirectSymbolOffset,
+ uint32_t NumIndirectSymbols) {
+ // struct dysymtab_command (80 bytes)
+
+ uint64_t Start = OS.tell();
+ (void) Start;
+
+ Write32(macho::LCT_Dysymtab);
+ Write32(macho::DysymtabLoadCommandSize);
+ Write32(FirstLocalSymbol);
+ Write32(NumLocalSymbols);
+ Write32(FirstExternalSymbol);
+ Write32(NumExternalSymbols);
+ Write32(FirstUndefinedSymbol);
+ Write32(NumUndefinedSymbols);
+ Write32(0); // tocoff
+ Write32(0); // ntoc
+ Write32(0); // modtaboff
+ Write32(0); // nmodtab
+ Write32(0); // extrefsymoff
+ Write32(0); // nextrefsyms
+ Write32(IndirectSymbolOffset);
+ Write32(NumIndirectSymbols);
+ Write32(0); // extreloff
+ Write32(0); // nextrel
+ Write32(0); // locreloff
+ Write32(0); // nlocrel
+
+ assert(OS.tell() - Start == macho::DysymtabLoadCommandSize);
+}
- uint64_t Start = OS.tell();
- (void) Start;
+void MachObjectWriter::WriteNlist(MachSymbolData &MSD,
+ const MCAsmLayout &Layout) {
+ MCSymbolData &Data = *MSD.SymbolData;
+ const MCSymbol &Symbol = Data.getSymbol();
+ uint8_t Type = 0;
+ uint16_t Flags = Data.getFlags();
+ uint32_t Address = 0;
- const MCSectionMachO &Section = cast<MCSectionMachO>(SD.getSection());
- WriteBytes(Section.getSectionName(), 16);
- WriteBytes(Section.getSegmentName(), 16);
- if (is64Bit()) {
- Write64(getSectionAddress(&SD)); // address
- Write64(SectionSize); // size
+ // Set the N_TYPE bits. See <mach-o/nlist.h>.
+ //
+ // FIXME: Are the prebound or indirect fields possible here?
+ if (Symbol.isUndefined())
+ Type = macho::STT_Undefined;
+ else if (Symbol.isAbsolute())
+ Type = macho::STT_Absolute;
+ else
+ Type = macho::STT_Section;
+
+ // FIXME: Set STAB bits.
+
+ if (Data.isPrivateExtern())
+ Type |= macho::STF_PrivateExtern;
+
+ // Set external bit.
+ if (Data.isExternal() || Symbol.isUndefined())
+ Type |= macho::STF_External;
+
+ // Compute the symbol address.
+ if (Symbol.isDefined()) {
+ if (Symbol.isAbsolute()) {
+ Address = cast<MCConstantExpr>(Symbol.getVariableValue())->getValue();
} else {
- Write32(getSectionAddress(&SD)); // address
- Write32(SectionSize); // size
+ Address = getSymbolAddress(&Data, Layout);
+ }
+ } else if (Data.isCommon()) {
+ // Common symbols are encoded with the size in the address
+ // field, and their alignment in the flags.
+ Address = Data.getCommonSize();
+
+ // Common alignment is packed into the 'desc' bits.
+ if (unsigned Align = Data.getCommonAlignment()) {
+ unsigned Log2Size = Log2_32(Align);
+ assert((1U << Log2Size) == Align && "Invalid 'common' alignment!");
+ if (Log2Size > 15)
+ report_fatal_error("invalid 'common' alignment '" +
+ Twine(Align) + "'");
+ // FIXME: Keep this mask with the SymbolFlags enumeration.
+ Flags = (Flags & 0xF0FF) | (Log2Size << 8);
}
- Write32(FileOffset);
-
- unsigned Flags = Section.getTypeAndAttributes();
- if (SD.hasInstructions())
- Flags |= MCSectionMachO::S_ATTR_SOME_INSTRUCTIONS;
-
- assert(isPowerOf2_32(SD.getAlignment()) && "Invalid alignment!");
- Write32(Log2_32(SD.getAlignment()));
- Write32(NumRelocations ? RelocationsStart : 0);
- Write32(NumRelocations);
- Write32(Flags);
- Write32(IndirectSymBase.lookup(&SD)); // reserved1
- Write32(Section.getStubSize()); // reserved2
- if (is64Bit())
- Write32(0); // reserved3
-
- assert(OS.tell() - Start == (is64Bit() ? macho::Section64Size :
- macho::Section32Size));
}
- void WriteSymtabLoadCommand(uint32_t SymbolOffset, uint32_t NumSymbols,
- uint32_t StringTableOffset,
- uint32_t StringTableSize) {
- // struct symtab_command (24 bytes)
+ // struct nlist (12 bytes)
- uint64_t Start = OS.tell();
- (void) Start;
+ Write32(MSD.StringIndex);
+ Write8(Type);
+ Write8(MSD.SectionIndex);
- Write32(macho::LCT_Symtab);
- Write32(macho::SymtabLoadCommandSize);
- Write32(SymbolOffset);
- Write32(NumSymbols);
- Write32(StringTableOffset);
- Write32(StringTableSize);
-
- assert(OS.tell() - Start == macho::SymtabLoadCommandSize);
- }
-
- void WriteDysymtabLoadCommand(uint32_t FirstLocalSymbol,
- uint32_t NumLocalSymbols,
- uint32_t FirstExternalSymbol,
- uint32_t NumExternalSymbols,
- uint32_t FirstUndefinedSymbol,
- uint32_t NumUndefinedSymbols,
- uint32_t IndirectSymbolOffset,
- uint32_t NumIndirectSymbols) {
- // struct dysymtab_command (80 bytes)
-
- uint64_t Start = OS.tell();
- (void) Start;
-
- Write32(macho::LCT_Dysymtab);
- Write32(macho::DysymtabLoadCommandSize);
- Write32(FirstLocalSymbol);
- Write32(NumLocalSymbols);
- Write32(FirstExternalSymbol);
- Write32(NumExternalSymbols);
- Write32(FirstUndefinedSymbol);
- Write32(NumUndefinedSymbols);
- Write32(0); // tocoff
- Write32(0); // ntoc
- Write32(0); // modtaboff
- Write32(0); // nmodtab
- Write32(0); // extrefsymoff
- Write32(0); // nextrefsyms
- Write32(IndirectSymbolOffset);
- Write32(NumIndirectSymbols);
- Write32(0); // extreloff
- Write32(0); // nextrel
- Write32(0); // locreloff
- Write32(0); // nlocrel
-
- assert(OS.tell() - Start == macho::DysymtabLoadCommandSize);
- }
-
- void WriteNlist(MachSymbolData &MSD, const MCAsmLayout &Layout) {
- MCSymbolData &Data = *MSD.SymbolData;
- const MCSymbol &Symbol = Data.getSymbol();
- uint8_t Type = 0;
- uint16_t Flags = Data.getFlags();
- uint32_t Address = 0;
+ // The Mach-O streamer uses the lowest 16-bits of the flags for the 'desc'
+ // value.
+ Write16(Flags);
+ if (is64Bit())
+ Write64(Address);
+ else
+ Write32(Address);
+}
- // Set the N_TYPE bits. See <mach-o/nlist.h>.
- //
- // FIXME: Are the prebound or indirect fields possible here?
- if (Symbol.isUndefined())
- Type = macho::STT_Undefined;
- else if (Symbol.isAbsolute())
- Type = macho::STT_Absolute;
- else
- Type = macho::STT_Section;
-
- // FIXME: Set STAB bits.
-
- if (Data.isPrivateExtern())
- Type |= macho::STF_PrivateExtern;
-
- // Set external bit.
- if (Data.isExternal() || Symbol.isUndefined())
- Type |= macho::STF_External;
-
- // Compute the symbol address.
- if (Symbol.isDefined()) {
- if (Symbol.isAbsolute()) {
- Address = cast<MCConstantExpr>(Symbol.getVariableValue())->getValue();
- } else {
- Address = getSymbolAddress(&Data, Layout);
- }
- } else if (Data.isCommon()) {
- // Common symbols are encoded with the size in the address
- // field, and their alignment in the flags.
- Address = Data.getCommonSize();
-
- // Common alignment is packed into the 'desc' bits.
- if (unsigned Align = Data.getCommonAlignment()) {
- unsigned Log2Size = Log2_32(Align);
- assert((1U << Log2Size) == Align && "Invalid 'common' alignment!");
- if (Log2Size > 15)
- report_fatal_error("invalid 'common' alignment '" +
- Twine(Align) + "'");
- // FIXME: Keep this mask with the SymbolFlags enumeration.
- Flags = (Flags & 0xF0FF) | (Log2Size << 8);
- }
- }
+void MachObjectWriter::RecordRelocation(const MCAssembler &Asm,
+ const MCAsmLayout &Layout,
+ const MCFragment *Fragment,
+ const MCFixup &Fixup,
+ MCValue Target,
+ uint64_t &FixedValue) {
+ TargetObjectWriter->RecordRelocation(this, Asm, Layout, Fragment, Fixup,
+ Target, FixedValue);
+}
- // struct nlist (12 bytes)
+void MachObjectWriter::BindIndirectSymbols(MCAssembler &Asm) {
+ // This is the point where 'as' creates actual symbols for indirect symbols
+ // (in the following two passes). It would be easier for us to do this sooner
+ // when we see the attribute, but that makes getting the order in the symbol
+ // table much more complicated than it is worth.
+ //
+ // FIXME: Revisit this when the dust settles.
- Write32(MSD.StringIndex);
- Write8(Type);
- Write8(MSD.SectionIndex);
+ // Bind non lazy symbol pointers first.
+ unsigned IndirectIndex = 0;
+ for (MCAssembler::indirect_symbol_iterator it = Asm.indirect_symbol_begin(),
+ ie = Asm.indirect_symbol_end(); it != ie; ++it, ++IndirectIndex) {
+ const MCSectionMachO &Section =
+ cast<MCSectionMachO>(it->SectionData->getSection());
- // The Mach-O streamer uses the lowest 16-bits of the flags for the 'desc'
- // value.
- Write16(Flags);
- if (is64Bit())
- Write64(Address);
- else
- Write32(Address);
- }
+ if (Section.getType() != MCSectionMachO::S_NON_LAZY_SYMBOL_POINTERS)
+ continue;
- // FIXME: We really need to improve the relocation validation. Basically, we
- // want to implement a separate computation which evaluates the relocation
- // entry as the linker would, and verifies that the resultant fixup value is
- // exactly what the encoder wanted. This will catch several classes of
- // problems:
- //
- // - Relocation entry bugs, the two algorithms are unlikely to have the same
- // exact bug.
- //
- // - Relaxation issues, where we forget to relax something.
- //
- // - Input errors, where something cannot be correctly encoded. 'as' allows
- // these through in many cases.
+ // Initialize the section indirect symbol base, if necessary.
+ if (!IndirectSymBase.count(it->SectionData))
+ IndirectSymBase[it->SectionData] = IndirectIndex;
- static bool isFixupKindRIPRel(unsigned Kind) {
- return Kind == X86::reloc_riprel_4byte ||
- Kind == X86::reloc_riprel_4byte_movq_load;
+ Asm.getOrCreateSymbolData(*it->Symbol);
}
- void RecordX86_64Relocation(const MCAssembler &Asm, const MCAsmLayout &Layout,
- const MCFragment *Fragment,
- const MCFixup &Fixup, MCValue Target,
- uint64_t &FixedValue) {
- unsigned IsPCRel = isFixupKindPCRel(Asm, Fixup.getKind());
- unsigned IsRIPRel = isFixupKindRIPRel(Fixup.getKind());
- unsigned Log2Size = getFixupKindLog2Size(Fixup.getKind());
-
- // See <reloc.h>.
- uint32_t FixupOffset =
- Layout.getFragmentOffset(Fragment) + Fixup.getOffset();
- uint32_t FixupAddress =
- getFragmentAddress(Fragment, Layout) + Fixup.getOffset();
- int64_t Value = 0;
- unsigned Index = 0;
- unsigned IsExtern = 0;
- unsigned Type = 0;
-
- Value = Target.getConstant();
-
- if (IsPCRel) {
- // Compensate for the relocation offset, Darwin x86_64 relocations only
- // have the addend and appear to have attempted to define it to be the
- // actual expression addend without the PCrel bias. However, instructions
- // with data following the relocation are not accommodated for (see comment
- // below regarding SIGNED{1,2,4}), so it isn't exactly that either.
- Value += 1LL << Log2Size;
- }
- if (Target.isAbsolute()) { // constant
- // SymbolNum of 0 indicates the absolute section.
- Type = macho::RIT_X86_64_Unsigned;
- Index = 0;
-
- // FIXME: I believe this is broken, I don't think the linker can
- // understand it. I think it would require a local relocation, but I'm not
- // sure if that would work either. The official way to get an absolute
- // PCrel relocation is to use an absolute symbol (which we don't support
- // yet).
- if (IsPCRel) {
- IsExtern = 1;
- Type = macho::RIT_X86_64_Branch;
- }
- } else if (Target.getSymB()) { // A - B + constant
- const MCSymbol *A = &Target.getSymA()->getSymbol();
- MCSymbolData &A_SD = Asm.getSymbolData(*A);
- const MCSymbolData *A_Base = Asm.getAtom(&A_SD);
-
- const MCSymbol *B = &Target.getSymB()->getSymbol();
- MCSymbolData &B_SD = Asm.getSymbolData(*B);
- const MCSymbolData *B_Base = Asm.getAtom(&B_SD);
-
- // Neither symbol can be modified.
- if (Target.getSymA()->getKind() != MCSymbolRefExpr::VK_None ||
- Target.getSymB()->getKind() != MCSymbolRefExpr::VK_None)
- report_fatal_error("unsupported relocation of modified symbol");
-
- // We don't support PCrel relocations of differences. Darwin 'as' doesn't
- // implement most of these correctly.
- if (IsPCRel)
- report_fatal_error("unsupported pc-relative relocation of difference");
-
- // The support for the situation where one or both of the symbols would
- // require a local relocation is handled just like if the symbols were
- // external. This is certainly used in the case of debug sections where
- // the section has only temporary symbols and thus the symbols don't have
- // base symbols. This is encoded using the section ordinal and
- // non-extern relocation entries.
-
- // Darwin 'as' doesn't emit correct relocations for this (it ends up with
- // a single SIGNED relocation); reject it for now. Except the case where
- // both symbols don't have a base, equal but both NULL.
- if (A_Base == B_Base && A_Base)
- report_fatal_error("unsupported relocation with identical base");
-
- Value += getSymbolAddress(&A_SD, Layout) -
- (A_Base == NULL ? 0 : getSymbolAddress(A_Base, Layout));
- Value -= getSymbolAddress(&B_SD, Layout) -
- (B_Base == NULL ? 0 : getSymbolAddress(B_Base, Layout));
-
- if (A_Base) {
- Index = A_Base->getIndex();
- IsExtern = 1;
- }
- else {
- Index = A_SD.getFragment()->getParent()->getOrdinal() + 1;
- IsExtern = 0;
- }
- Type = macho::RIT_X86_64_Unsigned;
-
- macho::RelocationEntry MRE;
- MRE.Word0 = FixupOffset;
- MRE.Word1 = ((Index << 0) |
- (IsPCRel << 24) |
- (Log2Size << 25) |
- (IsExtern << 27) |
- (Type << 28));
- Relocations[Fragment->getParent()].push_back(MRE);
-
- if (B_Base) {
- Index = B_Base->getIndex();
- IsExtern = 1;
- }
- else {
- Index = B_SD.getFragment()->getParent()->getOrdinal() + 1;
- IsExtern = 0;
- }
- Type = macho::RIT_X86_64_Subtractor;
- } else {
- const MCSymbol *Symbol = &Target.getSymA()->getSymbol();
- MCSymbolData &SD = Asm.getSymbolData(*Symbol);
- const MCSymbolData *Base = Asm.getAtom(&SD);
-
- // Relocations inside debug sections always use local relocations when
- // possible. This seems to be done because the debugger doesn't fully
- // understand x86_64 relocation entries, and expects to find values that
- // have already been fixed up.
- if (Symbol->isInSection()) {
- const MCSectionMachO &Section = static_cast<const MCSectionMachO&>(
- Fragment->getParent()->getSection());
- if (Section.hasAttribute(MCSectionMachO::S_ATTR_DEBUG))
- Base = 0;
- }
+ // Then lazy symbol pointers and symbol stubs.
+ IndirectIndex = 0;
+ for (MCAssembler::indirect_symbol_iterator it = Asm.indirect_symbol_begin(),
+ ie = Asm.indirect_symbol_end(); it != ie; ++it, ++IndirectIndex) {
+ const MCSectionMachO &Section =
+ cast<MCSectionMachO>(it->SectionData->getSection());
- // x86_64 almost always uses external relocations, except when there is no
- // symbol to use as a base address (a local symbol with no preceding
- // non-local symbol).
- if (Base) {
- Index = Base->getIndex();
- IsExtern = 1;
-
- // Add the local offset, if needed.
- if (Base != &SD)
- Value += Layout.getSymbolOffset(&SD) - Layout.getSymbolOffset(Base);
- } else if (Symbol->isInSection() && !Symbol->isVariable()) {
- // The index is the section ordinal (1-based).
- Index = SD.getFragment()->getParent()->getOrdinal() + 1;
- IsExtern = 0;
- Value += getSymbolAddress(&SD, Layout);
-
- if (IsPCRel)
- Value -= FixupAddress + (1 << Log2Size);
- } else if (Symbol->isVariable()) {
- const MCExpr *Value = Symbol->getVariableValue();
- int64_t Res;
- bool isAbs = Value->EvaluateAsAbsolute(Res, Layout, SectionAddress);
- if (isAbs) {
- FixedValue = Res;
- return;
- } else {
- report_fatal_error("unsupported relocation of variable '" +
- Symbol->getName() + "'");
- }
- } else {
- report_fatal_error("unsupported relocation of undefined symbol '" +
- Symbol->getName() + "'");
- }
+ if (Section.getType() != MCSectionMachO::S_LAZY_SYMBOL_POINTERS &&
+ Section.getType() != MCSectionMachO::S_SYMBOL_STUBS)
+ continue;
- MCSymbolRefExpr::VariantKind Modifier = Target.getSymA()->getKind();
- if (IsPCRel) {
- if (IsRIPRel) {
- if (Modifier == MCSymbolRefExpr::VK_GOTPCREL) {
- // x86_64 distinguishes movq foo@GOTPCREL so that the linker can
- // rewrite the movq to an leaq at link time if the symbol ends up in
- // the same linkage unit.
- if (unsigned(Fixup.getKind()) == X86::reloc_riprel_4byte_movq_load)
- Type = macho::RIT_X86_64_GOTLoad;
- else
- Type = macho::RIT_X86_64_GOT;
- } else if (Modifier == MCSymbolRefExpr::VK_TLVP) {
- Type = macho::RIT_X86_64_TLV;
- } else if (Modifier != MCSymbolRefExpr::VK_None) {
- report_fatal_error("unsupported symbol modifier in relocation");
- } else {
- Type = macho::RIT_X86_64_Signed;
-
- // The Darwin x86_64 relocation format has a problem where it cannot
- // encode an address (L<foo> + <constant>) which is outside the atom
- // containing L<foo>. Generally, this shouldn't occur but it does
- // happen when we have a RIPrel instruction with data following the
- // relocation entry (e.g., movb $012, L0(%rip)). Even with the PCrel
- // adjustment Darwin x86_64 uses, the offset is still negative and
- // the linker has no way to recognize this.
- //
- // To work around this, Darwin uses several special relocation types
- // to indicate the offsets. However, the specification or
- // implementation of these seems to also be incomplete; they should
- // adjust the addend as well based on the actual encoded instruction
- // (the additional bias), but instead appear to just look at the
- // final offset.
- switch (-(Target.getConstant() + (1LL << Log2Size))) {
- case 1: Type = macho::RIT_X86_64_Signed1; break;
- case 2: Type = macho::RIT_X86_64_Signed2; break;
- case 4: Type = macho::RIT_X86_64_Signed4; break;
- }
- }
- } else {
- if (Modifier != MCSymbolRefExpr::VK_None)
- report_fatal_error("unsupported symbol modifier in branch "
- "relocation");
-
- Type = macho::RIT_X86_64_Branch;
- }
- } else {
- if (Modifier == MCSymbolRefExpr::VK_GOT) {
- Type = macho::RIT_X86_64_GOT;
- } else if (Modifier == MCSymbolRefExpr::VK_GOTPCREL) {
- // GOTPCREL is allowed as a modifier on non-PCrel instructions, in
- // which case all we do is set the PCrel bit in the relocation entry;
- // this is used with exception handling, for example. The source is
- // required to include any necessary offset directly.
- Type = macho::RIT_X86_64_GOT;
- IsPCRel = 1;
- } else if (Modifier == MCSymbolRefExpr::VK_TLVP) {
- report_fatal_error("TLVP symbol modifier should have been rip-rel");
- } else if (Modifier != MCSymbolRefExpr::VK_None)
- report_fatal_error("unsupported symbol modifier in relocation");
- else
- Type = macho::RIT_X86_64_Unsigned;
- }
- }
+ // Initialize the section indirect symbol base, if necessary.
+ if (!IndirectSymBase.count(it->SectionData))
+ IndirectSymBase[it->SectionData] = IndirectIndex;
- // x86_64 always writes custom values into the fixups.
- FixedValue = Value;
-
- // struct relocation_info (8 bytes)
- macho::RelocationEntry MRE;
- MRE.Word0 = FixupOffset;
- MRE.Word1 = ((Index << 0) |
- (IsPCRel << 24) |
- (Log2Size << 25) |
- (IsExtern << 27) |
- (Type << 28));
- Relocations[Fragment->getParent()].push_back(MRE);
+ // Set the symbol type to undefined lazy, but only on construction.
+ //
+ // FIXME: Do not hardcode.
+ bool Created;
+ MCSymbolData &Entry = Asm.getOrCreateSymbolData(*it->Symbol, &Created);
+ if (Created)
+ Entry.setFlags(Entry.getFlags() | 0x0001);
}
+}
- void RecordScatteredRelocation(const MCAssembler &Asm,
- const MCAsmLayout &Layout,
- const MCFragment *Fragment,
- const MCFixup &Fixup, MCValue Target,
- unsigned Log2Size,
- uint64_t &FixedValue) {
- uint32_t FixupOffset = Layout.getFragmentOffset(Fragment)+Fixup.getOffset();
- unsigned IsPCRel = isFixupKindPCRel(Asm, Fixup.getKind());
- unsigned Type = macho::RIT_Vanilla;
-
- // See <reloc.h>.
- const MCSymbol *A = &Target.getSymA()->getSymbol();
- MCSymbolData *A_SD = &Asm.getSymbolData(*A);
-
- if (!A_SD->getFragment())
- report_fatal_error("symbol '" + A->getName() +
- "' can not be undefined in a subtraction expression");
-
- uint32_t Value = getSymbolAddress(A_SD, Layout);
- uint64_t SecAddr = getSectionAddress(A_SD->getFragment()->getParent());
- FixedValue += SecAddr;
- uint32_t Value2 = 0;
-
- if (const MCSymbolRefExpr *B = Target.getSymB()) {
- MCSymbolData *B_SD = &Asm.getSymbolData(B->getSymbol());
-
- if (!B_SD->getFragment())
- report_fatal_error("symbol '" + B->getSymbol().getName() +
- "' can not be undefined in a subtraction expression");
-
- // Select the appropriate difference relocation type.
- //
- // Note that there is no longer any semantic difference between these two
- // relocation types from the linkers point of view, this is done solely
- // for pedantic compatibility with 'as'.
- Type = A_SD->isExternal() ? (unsigned)macho::RIT_Difference :
- (unsigned)macho::RIT_Generic_LocalDifference;
- Value2 = getSymbolAddress(B_SD, Layout);
- FixedValue -= getSectionAddress(B_SD->getFragment()->getParent());
- }
-
- // Relocations are written out in reverse order, so the PAIR comes first.
- if (Type == macho::RIT_Difference ||
- Type == macho::RIT_Generic_LocalDifference) {
- macho::RelocationEntry MRE;
- MRE.Word0 = ((0 << 0) |
- (macho::RIT_Pair << 24) |
- (Log2Size << 28) |
- (IsPCRel << 30) |
- macho::RF_Scattered);
- MRE.Word1 = Value2;
- Relocations[Fragment->getParent()].push_back(MRE);
+/// ComputeSymbolTable - Compute the symbol table data
+///
+/// \param StringTable [out] - The string table data.
+/// \param StringIndexMap [out] - Map from symbol names to offsets in the
+/// string table.
+void MachObjectWriter::
+ComputeSymbolTable(MCAssembler &Asm, SmallString<256> &StringTable,
+ std::vector<MachSymbolData> &LocalSymbolData,
+ std::vector<MachSymbolData> &ExternalSymbolData,
+ std::vector<MachSymbolData> &UndefinedSymbolData) {
+ // Build section lookup table.
+ DenseMap<const MCSection*, uint8_t> SectionIndexMap;
+ unsigned Index = 1;
+ for (MCAssembler::iterator it = Asm.begin(),
+ ie = Asm.end(); it != ie; ++it, ++Index)
+ SectionIndexMap[&it->getSection()] = Index;
+ assert(Index <= 256 && "Too many sections!");
+
+ // Index 0 is always the empty string.
+ StringMap<uint64_t> StringIndexMap;
+ StringTable += '\x00';
+
+ // Build the symbol arrays and the string table, but only for non-local
+ // symbols.
+ //
+ // The particular order that we collect the symbols and create the string
+ // table, then sort the symbols is chosen to match 'as'. Even though it
+ // doesn't matter for correctness, this is important for letting us diff .o
+ // files.
+ for (MCAssembler::symbol_iterator it = Asm.symbol_begin(),
+ ie = Asm.symbol_end(); it != ie; ++it) {
+ const MCSymbol &Symbol = it->getSymbol();
+
+ // Ignore non-linker visible symbols.
+ if (!Asm.isSymbolLinkerVisible(it->getSymbol()))
+ continue;
+
+ if (!it->isExternal() && !Symbol.isUndefined())
+ continue;
+
+ uint64_t &Entry = StringIndexMap[Symbol.getName()];
+ if (!Entry) {
+ Entry = StringTable.size();
+ StringTable += Symbol.getName();
+ StringTable += '\x00';
}
- macho::RelocationEntry MRE;
- MRE.Word0 = ((FixupOffset << 0) |
- (Type << 24) |
- (Log2Size << 28) |
- (IsPCRel << 30) |
- macho::RF_Scattered);
- MRE.Word1 = Value;
- Relocations[Fragment->getParent()].push_back(MRE);
- }
-
- void RecordARMScatteredRelocation(const MCAssembler &Asm,
- const MCAsmLayout &Layout,
- const MCFragment *Fragment,
- const MCFixup &Fixup, MCValue Target,
- unsigned Log2Size,
- uint64_t &FixedValue) {
- uint32_t FixupOffset = Layout.getFragmentOffset(Fragment)+Fixup.getOffset();
- unsigned IsPCRel = isFixupKindPCRel(Asm, Fixup.getKind());
- unsigned Type = macho::RIT_Vanilla;
-
- // See <reloc.h>.
- const MCSymbol *A = &Target.getSymA()->getSymbol();
- MCSymbolData *A_SD = &Asm.getSymbolData(*A);
-
- if (!A_SD->getFragment())
- report_fatal_error("symbol '" + A->getName() +
- "' can not be undefined in a subtraction expression");
-
- uint32_t Value = getSymbolAddress(A_SD, Layout);
- uint64_t SecAddr = getSectionAddress(A_SD->getFragment()->getParent());
- FixedValue += SecAddr;
- uint32_t Value2 = 0;
-
- if (const MCSymbolRefExpr *B = Target.getSymB()) {
- MCSymbolData *B_SD = &Asm.getSymbolData(B->getSymbol());
-
- if (!B_SD->getFragment())
- report_fatal_error("symbol '" + B->getSymbol().getName() +
- "' can not be undefined in a subtraction expression");
-
- // Select the appropriate difference relocation type.
- Type = macho::RIT_Difference;
- Value2 = getSymbolAddress(B_SD, Layout);
- FixedValue -= getSectionAddress(B_SD->getFragment()->getParent());
- }
+ MachSymbolData MSD;
+ MSD.SymbolData = it;
+ MSD.StringIndex = Entry;
- // Relocations are written out in reverse order, so the PAIR comes first.
- if (Type == macho::RIT_Difference ||
- Type == macho::RIT_Generic_LocalDifference) {
- macho::RelocationEntry MRE;
- MRE.Word0 = ((0 << 0) |
- (macho::RIT_Pair << 24) |
- (Log2Size << 28) |
- (IsPCRel << 30) |
- macho::RF_Scattered);
- MRE.Word1 = Value2;
- Relocations[Fragment->getParent()].push_back(MRE);
+ if (Symbol.isUndefined()) {
+ MSD.SectionIndex = 0;
+ UndefinedSymbolData.push_back(MSD);
+ } else if (Symbol.isAbsolute()) {
+ MSD.SectionIndex = 0;
+ ExternalSymbolData.push_back(MSD);
+ } else {
+ MSD.SectionIndex = SectionIndexMap.lookup(&Symbol.getSection());
+ assert(MSD.SectionIndex && "Invalid section index!");
+ ExternalSymbolData.push_back(MSD);
}
-
- macho::RelocationEntry MRE;
- MRE.Word0 = ((FixupOffset << 0) |
- (Type << 24) |
- (Log2Size << 28) |
- (IsPCRel << 30) |
- macho::RF_Scattered);
- MRE.Word1 = Value;
- Relocations[Fragment->getParent()].push_back(MRE);
}
- void RecordARMMovwMovtRelocation(const MCAssembler &Asm,
- const MCAsmLayout &Layout,
- const MCFragment *Fragment,
- const MCFixup &Fixup, MCValue Target,
- uint64_t &FixedValue) {
- uint32_t FixupOffset = Layout.getFragmentOffset(Fragment)+Fixup.getOffset();
- unsigned IsPCRel = isFixupKindPCRel(Asm, Fixup.getKind());
- unsigned Type = macho::RIT_ARM_Half;
-
- // See <reloc.h>.
- const MCSymbol *A = &Target.getSymA()->getSymbol();
- MCSymbolData *A_SD = &Asm.getSymbolData(*A);
-
- if (!A_SD->getFragment())
- report_fatal_error("symbol '" + A->getName() +
- "' can not be undefined in a subtraction expression");
-
- uint32_t Value = getSymbolAddress(A_SD, Layout);
- uint32_t Value2 = 0;
- uint64_t SecAddr = getSectionAddress(A_SD->getFragment()->getParent());
- FixedValue += SecAddr;
-
- if (const MCSymbolRefExpr *B = Target.getSymB()) {
- MCSymbolData *B_SD = &Asm.getSymbolData(B->getSymbol());
-
- if (!B_SD->getFragment())
- report_fatal_error("symbol '" + B->getSymbol().getName() +
- "' can not be undefined in a subtraction expression");
-
- // Select the appropriate difference relocation type.
- Type = macho::RIT_ARM_HalfDifference;
- Value2 = getSymbolAddress(B_SD, Layout);
- FixedValue -= getSectionAddress(B_SD->getFragment()->getParent());
- }
-
- // Relocations are written out in reverse order, so the PAIR comes first.
- // ARM_RELOC_HALF and ARM_RELOC_HALF_SECTDIFF abuse the r_length field:
- //
- // For these two r_type relocations they always have a pair following them
- // and the r_length bits are used differently. The encoding of the
- // r_length is as follows:
- // low bit of r_length:
- // 0 - :lower16: for movw instructions
- // 1 - :upper16: for movt instructions
- // high bit of r_length:
- // 0 - arm instructions
- // 1 - thumb instructions
- // the other half of the relocated expression is in the following pair
- // relocation entry in the the low 16 bits of r_address field.
- unsigned ThumbBit = 0;
- unsigned MovtBit = 0;
- switch ((unsigned)Fixup.getKind()) {
- default: break;
- case ARM::fixup_arm_movt_hi16:
- case ARM::fixup_arm_movt_hi16_pcrel:
- MovtBit = 1;
- break;
- case ARM::fixup_t2_movt_hi16:
- case ARM::fixup_t2_movt_hi16_pcrel:
- MovtBit = 1;
- // Fallthrough
- case ARM::fixup_t2_movw_lo16:
- case ARM::fixup_t2_movw_lo16_pcrel:
- ThumbBit = 1;
- break;
- }
+ // Now add the data for local symbols.
+ for (MCAssembler::symbol_iterator it = Asm.symbol_begin(),
+ ie = Asm.symbol_end(); it != ie; ++it) {
+ const MCSymbol &Symbol = it->getSymbol();
+ // Ignore non-linker visible symbols.
+ if (!Asm.isSymbolLinkerVisible(it->getSymbol()))
+ continue;
- if (Type == macho::RIT_ARM_HalfDifference) {
- uint32_t OtherHalf = MovtBit
- ? (FixedValue & 0xffff) : ((FixedValue & 0xffff0000) >> 16);
+ if (it->isExternal() || Symbol.isUndefined())
+ continue;
- macho::RelocationEntry MRE;
- MRE.Word0 = ((OtherHalf << 0) |
- (macho::RIT_Pair << 24) |
- (MovtBit << 28) |
- (ThumbBit << 29) |
- (IsPCRel << 30) |
- macho::RF_Scattered);
- MRE.Word1 = Value2;
- Relocations[Fragment->getParent()].push_back(MRE);
+ uint64_t &Entry = StringIndexMap[Symbol.getName()];
+ if (!Entry) {
+ Entry = StringTable.size();
+ StringTable += Symbol.getName();
+ StringTable += '\x00';
}
- macho::RelocationEntry MRE;
- MRE.Word0 = ((FixupOffset << 0) |
- (Type << 24) |
- (MovtBit << 28) |
- (ThumbBit << 29) |
- (IsPCRel << 30) |
- macho::RF_Scattered);
- MRE.Word1 = Value;
- Relocations[Fragment->getParent()].push_back(MRE);
- }
+ MachSymbolData MSD;
+ MSD.SymbolData = it;
+ MSD.StringIndex = Entry;
- void RecordTLVPRelocation(const MCAssembler &Asm,
- const MCAsmLayout &Layout,
- const MCFragment *Fragment,
- const MCFixup &Fixup, MCValue Target,
- uint64_t &FixedValue) {
- assert(Target.getSymA()->getKind() == MCSymbolRefExpr::VK_TLVP &&
- !is64Bit() &&
- "Should only be called with a 32-bit TLVP relocation!");
-
- unsigned Log2Size = getFixupKindLog2Size(Fixup.getKind());
- uint32_t Value = Layout.getFragmentOffset(Fragment)+Fixup.getOffset();
- unsigned IsPCRel = 0;
-
- // Get the symbol data.
- MCSymbolData *SD_A = &Asm.getSymbolData(Target.getSymA()->getSymbol());
- unsigned Index = SD_A->getIndex();
-
- // We're only going to have a second symbol in pic mode and it'll be a
- // subtraction from the picbase. For 32-bit pic the addend is the difference
- // between the picbase and the next address. For 32-bit static the addend
- // is zero.
- if (Target.getSymB()) {
- // If this is a subtraction then we're pcrel.
- uint32_t FixupAddress =
- getFragmentAddress(Fragment, Layout) + Fixup.getOffset();
- MCSymbolData *SD_B = &Asm.getSymbolData(Target.getSymB()->getSymbol());
- IsPCRel = 1;
- FixedValue = (FixupAddress - getSymbolAddress(SD_B, Layout) +
- Target.getConstant());
- FixedValue += 1ULL << Log2Size;
+ if (Symbol.isAbsolute()) {
+ MSD.SectionIndex = 0;
+ LocalSymbolData.push_back(MSD);
} else {
- FixedValue = 0;
+ MSD.SectionIndex = SectionIndexMap.lookup(&Symbol.getSection());
+ assert(MSD.SectionIndex && "Invalid section index!");
+ LocalSymbolData.push_back(MSD);
}
-
- // struct relocation_info (8 bytes)
- macho::RelocationEntry MRE;
- MRE.Word0 = Value;
- MRE.Word1 = ((Index << 0) |
- (IsPCRel << 24) |
- (Log2Size << 25) |
- (1 << 27) | // Extern
- (macho::RIT_Generic_TLV << 28)); // Type
- Relocations[Fragment->getParent()].push_back(MRE);
}
- static bool getARMFixupKindMachOInfo(unsigned Kind, unsigned &RelocType,
- unsigned &Log2Size) {
- RelocType = unsigned(macho::RIT_Vanilla);
- Log2Size = ~0U;
+ // External and undefined symbols are required to be in lexicographic order.
+ std::sort(ExternalSymbolData.begin(), ExternalSymbolData.end());
+ std::sort(UndefinedSymbolData.begin(), UndefinedSymbolData.end());
+
+ // Set the symbol indices.
+ Index = 0;
+ for (unsigned i = 0, e = LocalSymbolData.size(); i != e; ++i)
+ LocalSymbolData[i].SymbolData->setIndex(Index++);
+ for (unsigned i = 0, e = ExternalSymbolData.size(); i != e; ++i)
+ ExternalSymbolData[i].SymbolData->setIndex(Index++);
+ for (unsigned i = 0, e = UndefinedSymbolData.size(); i != e; ++i)
+ UndefinedSymbolData[i].SymbolData->setIndex(Index++);
+
+ // The string table is padded to a multiple of 4.
+ while (StringTable.size() % 4)
+ StringTable += '\x00';
+}
- switch (Kind) {
- default:
- return false;
+void MachObjectWriter::computeSectionAddresses(const MCAssembler &Asm,
+ const MCAsmLayout &Layout) {
+ uint64_t StartAddress = 0;
+ const SmallVectorImpl<MCSectionData*> &Order = Layout.getSectionOrder();
+ for (int i = 0, n = Order.size(); i != n ; ++i) {
+ const MCSectionData *SD = Order[i];
+ StartAddress = RoundUpToAlignment(StartAddress, SD->getAlignment());
+ SectionAddress[SD] = StartAddress;
+ StartAddress += Layout.getSectionAddressSize(SD);
+
+ // Explicitly pad the section to match the alignment requirements of the
+ // following one. This is for 'gas' compatibility, it shouldn't
+ /// strictly be necessary.
+ StartAddress += getPaddingSize(SD, Layout);
+ }
+}
- case FK_Data_1:
- Log2Size = llvm::Log2_32(1);
- return true;
- case FK_Data_2:
- Log2Size = llvm::Log2_32(2);
- return true;
- case FK_Data_4:
- Log2Size = llvm::Log2_32(4);
- return true;
- case FK_Data_8:
- Log2Size = llvm::Log2_32(8);
- return true;
+void MachObjectWriter::ExecutePostLayoutBinding(MCAssembler &Asm,
+ const MCAsmLayout &Layout) {
+ computeSectionAddresses(Asm, Layout);
- // Handle 24-bit branch kinds.
- case ARM::fixup_arm_ldst_pcrel_12:
- case ARM::fixup_arm_pcrel_10:
- case ARM::fixup_arm_adr_pcrel_12:
- case ARM::fixup_arm_condbranch:
- case ARM::fixup_arm_uncondbranch:
- RelocType = unsigned(macho::RIT_ARM_Branch24Bit);
- // Report as 'long', even though that is not quite accurate.
- Log2Size = llvm::Log2_32(4);
- return true;
+ // Create symbol data for any indirect symbols.
+ BindIndirectSymbols(Asm);
- // Handle Thumb branches.
- case ARM::fixup_arm_thumb_br:
- RelocType = unsigned(macho::RIT_ARM_ThumbBranch22Bit);
- Log2Size = llvm::Log2_32(2);
- return true;
-
- case ARM::fixup_arm_thumb_bl:
- case ARM::fixup_arm_thumb_blx:
- RelocType = unsigned(macho::RIT_ARM_ThumbBranch22Bit);
- Log2Size = llvm::Log2_32(4);
- return true;
+ // Compute symbol table information and bind symbol indices.
+ ComputeSymbolTable(Asm, StringTable, LocalSymbolData, ExternalSymbolData,
+ UndefinedSymbolData);
+}
- case ARM::fixup_arm_movt_hi16:
- case ARM::fixup_arm_movt_hi16_pcrel:
- case ARM::fixup_t2_movt_hi16:
- case ARM::fixup_t2_movt_hi16_pcrel:
- RelocType = unsigned(macho::RIT_ARM_HalfDifference);
- // Report as 'long', even though that is not quite accurate.
- Log2Size = llvm::Log2_32(4);
- return true;
+bool MachObjectWriter::
+IsSymbolRefDifferenceFullyResolvedImpl(const MCAssembler &Asm,
+ const MCSymbolData &DataA,
+ const MCFragment &FB,
+ bool InSet,
+ bool IsPCRel) const {
+ if (InSet)
+ return true;
- case ARM::fixup_arm_movw_lo16:
- case ARM::fixup_arm_movw_lo16_pcrel:
- case ARM::fixup_t2_movw_lo16:
- case ARM::fixup_t2_movw_lo16_pcrel:
- RelocType = unsigned(macho::RIT_ARM_Half);
- // Report as 'long', even though that is not quite accurate.
- Log2Size = llvm::Log2_32(4);
+ // The effective address is
+ // addr(atom(A)) + offset(A)
+ // - addr(atom(B)) - offset(B)
+ // and the offsets are not relocatable, so the fixup is fully resolved when
+ // addr(atom(A)) - addr(atom(B)) == 0.
+ const MCSymbolData *A_Base = 0, *B_Base = 0;
+
+ const MCSymbol &SA = DataA.getSymbol().AliasedSymbol();
+ const MCSection &SecA = SA.getSection();
+ const MCSection &SecB = FB.getParent()->getSection();
+
+ if (IsPCRel) {
+ // The simple (Darwin, except on x86_64) way of dealing with this was to
+ // assume that any reference to a temporary symbol *must* be a temporary
+ // symbol in the same atom, unless the sections differ. Therefore, any PCrel
+ // relocation to a temporary symbol (in the same section) is fully
+ // resolved. This also works in conjunction with absolutized .set, which
+ // requires the compiler to use .set to absolutize the differences between
+ // symbols which the compiler knows to be assembly time constants, so we
+ // don't need to worry about considering symbol differences fully resolved.
+
+ if (!Asm.getBackend().hasReliableSymbolDifference()) {
+ if (!SA.isTemporary() || !SA.isInSection() || &SecA != &SecB)
+ return false;
return true;
}
+ } else {
+ if (!TargetObjectWriter->useAggressiveSymbolFolding())
+ return false;
}
- void RecordARMRelocation(const MCAssembler &Asm, const MCAsmLayout &Layout,
- const MCFragment *Fragment, const MCFixup &Fixup,
- MCValue Target, uint64_t &FixedValue) {
- unsigned IsPCRel = isFixupKindPCRel(Asm, Fixup.getKind());
- unsigned Log2Size;
- unsigned RelocType = macho::RIT_Vanilla;
- if (!getARMFixupKindMachOInfo(Fixup.getKind(), RelocType, Log2Size)) {
- report_fatal_error("unknown ARM fixup kind!");
- return;
- }
- // If this is a difference or a defined symbol plus an offset, then we need
- // a scattered relocation entry. Differences always require scattered
- // relocations.
- if (Target.getSymB()) {
- if (RelocType == macho::RIT_ARM_Half ||
- RelocType == macho::RIT_ARM_HalfDifference)
- return RecordARMMovwMovtRelocation(Asm, Layout, Fragment, Fixup,
- Target, FixedValue);
- return RecordARMScatteredRelocation(Asm, Layout, Fragment, Fixup,
- Target, Log2Size, FixedValue);
- }
+ const MCFragment &FA = *Asm.getSymbolData(SA).getFragment();
- // Get the symbol data, if any.
- MCSymbolData *SD = 0;
- if (Target.getSymA())
- SD = &Asm.getSymbolData(Target.getSymA()->getSymbol());
+ A_Base = FA.getAtom();
+ if (!A_Base)
+ return false;
- // FIXME: For other platforms, we need to use scattered relocations for
- // internal relocations with offsets. If this is an internal relocation
- // with an offset, it also needs a scattered relocation entry.
- //
- // Is this right for ARM?
- uint32_t Offset = Target.getConstant();
- if (IsPCRel && RelocType == macho::RIT_Vanilla)
- Offset += 1 << Log2Size;
- if (Offset && SD && !doesSymbolRequireExternRelocation(SD))
- return RecordARMScatteredRelocation(Asm, Layout, Fragment, Fixup, Target,
- Log2Size, FixedValue);
-
- // See <reloc.h>.
- uint32_t FixupOffset = Layout.getFragmentOffset(Fragment)+Fixup.getOffset();
- unsigned Index = 0;
- unsigned IsExtern = 0;
- unsigned Type = 0;
-
- if (Target.isAbsolute()) { // constant
- // FIXME!
- report_fatal_error("FIXME: relocations to absolute targets "
- "not yet implemented");
- } else {
- // Resolve constant variables.
- if (SD->getSymbol().isVariable()) {
- int64_t Res;
- if (SD->getSymbol().getVariableValue()->EvaluateAsAbsolute(
- Res, Layout, SectionAddress)) {
- FixedValue = Res;
- return;
- }
- }
+ B_Base = FB.getAtom();
+ if (!B_Base)
+ return false;
- // Check whether we need an external or internal relocation.
- if (doesSymbolRequireExternRelocation(SD)) {
- IsExtern = 1;
- Index = SD->getIndex();
- // For external relocations, make sure to offset the fixup value to
- // compensate for the addend of the symbol address, if it was
- // undefined. This occurs with weak definitions, for example.
- if (!SD->Symbol->isUndefined())
- FixedValue -= Layout.getSymbolOffset(SD);
- } else {
- // The index is the section ordinal (1-based).
- const MCSectionData &SymSD = Asm.getSectionData(
- SD->getSymbol().getSection());
- Index = SymSD.getOrdinal() + 1;
- FixedValue += getSectionAddress(&SymSD);
- }
- if (IsPCRel)
- FixedValue -= getSectionAddress(Fragment->getParent());
+ // If the atoms are the same, they are guaranteed to have the same address.
+ if (A_Base == B_Base)
+ return true;
- // The type is determined by the fixup kind.
- Type = RelocType;
- }
+ // Otherwise, we can't prove this is fully resolved.
+ return false;
+}
- // struct relocation_info (8 bytes)
- macho::RelocationEntry MRE;
- MRE.Word0 = FixupOffset;
- MRE.Word1 = ((Index << 0) |
- (IsPCRel << 24) |
- (Log2Size << 25) |
- (IsExtern << 27) |
- (Type << 28));
- Relocations[Fragment->getParent()].push_back(MRE);
+void MachObjectWriter::WriteObject(MCAssembler &Asm, const MCAsmLayout &Layout) {
+ unsigned NumSections = Asm.size();
+
+ // The section data starts after the header, the segment load command (and
+ // section headers) and the symbol table.
+ unsigned NumLoadCommands = 1;
+ uint64_t LoadCommandsSize = is64Bit() ?
+ macho::SegmentLoadCommand64Size + NumSections * macho::Section64Size :
+ macho::SegmentLoadCommand32Size + NumSections * macho::Section32Size;
+
+ // Add the symbol table load command sizes, if used.
+ unsigned NumSymbols = LocalSymbolData.size() + ExternalSymbolData.size() +
+ UndefinedSymbolData.size();
+ if (NumSymbols) {
+ NumLoadCommands += 2;
+ LoadCommandsSize += (macho::SymtabLoadCommandSize +
+ macho::DysymtabLoadCommandSize);
}
- void RecordRelocation(const MCAssembler &Asm, const MCAsmLayout &Layout,
- const MCFragment *Fragment, const MCFixup &Fixup,
- MCValue Target, uint64_t &FixedValue) {
- // FIXME: These needs to be factored into the target Mach-O writer.
- if (isARM()) {
- RecordARMRelocation(Asm, Layout, Fragment, Fixup, Target, FixedValue);
- return;
- }
- if (is64Bit()) {
- RecordX86_64Relocation(Asm, Layout, Fragment, Fixup, Target, FixedValue);
- return;
- }
-
- unsigned IsPCRel = isFixupKindPCRel(Asm, Fixup.getKind());
- unsigned Log2Size = getFixupKindLog2Size(Fixup.getKind());
-
- // If this is a 32-bit TLVP reloc it's handled a bit differently.
- if (Target.getSymA() &&
- Target.getSymA()->getKind() == MCSymbolRefExpr::VK_TLVP) {
- RecordTLVPRelocation(Asm, Layout, Fragment, Fixup, Target, FixedValue);
- return;
- }
-
- // If this is a difference or a defined symbol plus an offset, then we need
- // a scattered relocation entry.
- // Differences always require scattered relocations.
- if (Target.getSymB())
- return RecordScatteredRelocation(Asm, Layout, Fragment, Fixup,
- Target, Log2Size, FixedValue);
-
- // Get the symbol data, if any.
- MCSymbolData *SD = 0;
- if (Target.getSymA())
- SD = &Asm.getSymbolData(Target.getSymA()->getSymbol());
-
- // If this is an internal relocation with an offset, it also needs a
- // scattered relocation entry.
- uint32_t Offset = Target.getConstant();
- if (IsPCRel)
- Offset += 1 << Log2Size;
- if (Offset && SD && !doesSymbolRequireExternRelocation(SD))
- return RecordScatteredRelocation(Asm, Layout, Fragment, Fixup,
- Target, Log2Size, FixedValue);
-
- // See <reloc.h>.
- uint32_t FixupOffset = Layout.getFragmentOffset(Fragment)+Fixup.getOffset();
- unsigned Index = 0;
- unsigned IsExtern = 0;
- unsigned Type = 0;
-
- if (Target.isAbsolute()) { // constant
- // SymbolNum of 0 indicates the absolute section.
- //
- // FIXME: Currently, these are never generated (see code below). I cannot
- // find a case where they are actually emitted.
- Type = macho::RIT_Vanilla;
- } else {
- // Resolve constant variables.
- if (SD->getSymbol().isVariable()) {
- int64_t Res;
- if (SD->getSymbol().getVariableValue()->EvaluateAsAbsolute(
- Res, Layout, SectionAddress)) {
- FixedValue = Res;
- return;
- }
- }
-
- // Check whether we need an external or internal relocation.
- if (doesSymbolRequireExternRelocation(SD)) {
- IsExtern = 1;
- Index = SD->getIndex();
- // For external relocations, make sure to offset the fixup value to
- // compensate for the addend of the symbol address, if it was
- // undefined. This occurs with weak definitions, for example.
- if (!SD->Symbol->isUndefined())
- FixedValue -= Layout.getSymbolOffset(SD);
- } else {
- // The index is the section ordinal (1-based).
- const MCSectionData &SymSD = Asm.getSectionData(
- SD->getSymbol().getSection());
- Index = SymSD.getOrdinal() + 1;
- FixedValue += getSectionAddress(&SymSD);
- }
- if (IsPCRel)
- FixedValue -= getSectionAddress(Fragment->getParent());
-
- Type = macho::RIT_Vanilla;
- }
-
- // struct relocation_info (8 bytes)
- macho::RelocationEntry MRE;
- MRE.Word0 = FixupOffset;
- MRE.Word1 = ((Index << 0) |
- (IsPCRel << 24) |
- (Log2Size << 25) |
- (IsExtern << 27) |
- (Type << 28));
- Relocations[Fragment->getParent()].push_back(MRE);
+ // Compute the total size of the section data, as well as its file size and vm
+ // size.
+ uint64_t SectionDataStart = (is64Bit() ? macho::Header64Size :
+ macho::Header32Size) + LoadCommandsSize;
+ uint64_t SectionDataSize = 0;
+ uint64_t SectionDataFileSize = 0;
+ uint64_t VMSize = 0;
+ for (MCAssembler::const_iterator it = Asm.begin(),
+ ie = Asm.end(); it != ie; ++it) {
+ const MCSectionData &SD = *it;
+ uint64_t Address = getSectionAddress(&SD);
+ uint64_t Size = Layout.getSectionAddressSize(&SD);
+ uint64_t FileSize = Layout.getSectionFileSize(&SD);
+ FileSize += getPaddingSize(&SD, Layout);
+
+ VMSize = std::max(VMSize, Address + Size);
+
+ if (SD.getSection().isVirtualSection())
+ continue;
+
+ SectionDataSize = std::max(SectionDataSize, Address + Size);
+ SectionDataFileSize = std::max(SectionDataFileSize, Address + FileSize);
}
- void BindIndirectSymbols(MCAssembler &Asm) {
- // This is the point where 'as' creates actual symbols for indirect symbols
- // (in the following two passes). It would be easier for us to do this
- // sooner when we see the attribute, but that makes getting the order in the
- // symbol table much more complicated than it is worth.
- //
- // FIXME: Revisit this when the dust settles.
+ // The section data is padded to 4 bytes.
+ //
+ // FIXME: Is this machine dependent?
+ unsigned SectionDataPadding = OffsetToAlignment(SectionDataFileSize, 4);
+ SectionDataFileSize += SectionDataPadding;
+
+ // Write the prolog, starting with the header and load command...
+ WriteHeader(NumLoadCommands, LoadCommandsSize,
+ Asm.getSubsectionsViaSymbols());
+ WriteSegmentLoadCommand(NumSections, VMSize,
+ SectionDataStart, SectionDataSize);
+
+ // ... and then the section headers.
+ uint64_t RelocTableEnd = SectionDataStart + SectionDataFileSize;
+ for (MCAssembler::const_iterator it = Asm.begin(),
+ ie = Asm.end(); it != ie; ++it) {
+ std::vector<macho::RelocationEntry> &Relocs = Relocations[it];
+ unsigned NumRelocs = Relocs.size();
+ uint64_t SectionStart = SectionDataStart + getSectionAddress(it);
+ WriteSection(Asm, Layout, *it, SectionStart, RelocTableEnd, NumRelocs);
+ RelocTableEnd += NumRelocs * macho::RelocationInfoSize;
+ }
- // Bind non lazy symbol pointers first.
- unsigned IndirectIndex = 0;
- for (MCAssembler::indirect_symbol_iterator it = Asm.indirect_symbol_begin(),
- ie = Asm.indirect_symbol_end(); it != ie; ++it, ++IndirectIndex) {
- const MCSectionMachO &Section =
- cast<MCSectionMachO>(it->SectionData->getSection());
+ // Write the symbol table load command, if used.
+ if (NumSymbols) {
+ unsigned FirstLocalSymbol = 0;
+ unsigned NumLocalSymbols = LocalSymbolData.size();
+ unsigned FirstExternalSymbol = FirstLocalSymbol + NumLocalSymbols;
+ unsigned NumExternalSymbols = ExternalSymbolData.size();
+ unsigned FirstUndefinedSymbol = FirstExternalSymbol + NumExternalSymbols;
+ unsigned NumUndefinedSymbols = UndefinedSymbolData.size();
+ unsigned NumIndirectSymbols = Asm.indirect_symbol_size();
+ unsigned NumSymTabSymbols =
+ NumLocalSymbols + NumExternalSymbols + NumUndefinedSymbols;
+ uint64_t IndirectSymbolSize = NumIndirectSymbols * 4;
+ uint64_t IndirectSymbolOffset = 0;
+
+ // If used, the indirect symbols are written after the section data.
+ if (NumIndirectSymbols)
+ IndirectSymbolOffset = RelocTableEnd;
+
+ // The symbol table is written after the indirect symbol data.
+ uint64_t SymbolTableOffset = RelocTableEnd + IndirectSymbolSize;
+
+ // The string table is written after symbol table.
+ uint64_t StringTableOffset =
+ SymbolTableOffset + NumSymTabSymbols * (is64Bit() ? macho::Nlist64Size :
+ macho::Nlist32Size);
+ WriteSymtabLoadCommand(SymbolTableOffset, NumSymTabSymbols,
+ StringTableOffset, StringTable.size());
+
+ WriteDysymtabLoadCommand(FirstLocalSymbol, NumLocalSymbols,
+ FirstExternalSymbol, NumExternalSymbols,
+ FirstUndefinedSymbol, NumUndefinedSymbols,
+ IndirectSymbolOffset, NumIndirectSymbols);
+ }
- if (Section.getType() != MCSectionMachO::S_NON_LAZY_SYMBOL_POINTERS)
- continue;
+ // Write the actual section data.
+ for (MCAssembler::const_iterator it = Asm.begin(),
+ ie = Asm.end(); it != ie; ++it) {
+ Asm.WriteSectionData(it, Layout);
- // Initialize the section indirect symbol base, if necessary.
- if (!IndirectSymBase.count(it->SectionData))
- IndirectSymBase[it->SectionData] = IndirectIndex;
+ uint64_t Pad = getPaddingSize(it, Layout);
+ for (unsigned int i = 0; i < Pad; ++i)
+ Write8(0);
+ }
- Asm.getOrCreateSymbolData(*it->Symbol);
- }
+ // Write the extra padding.
+ WriteZeros(SectionDataPadding);
- // Then lazy symbol pointers and symbol stubs.
- IndirectIndex = 0;
- for (MCAssembler::indirect_symbol_iterator it = Asm.indirect_symbol_begin(),
- ie = Asm.indirect_symbol_end(); it != ie; ++it, ++IndirectIndex) {
- const MCSectionMachO &Section =
- cast<MCSectionMachO>(it->SectionData->getSection());
-
- if (Section.getType() != MCSectionMachO::S_LAZY_SYMBOL_POINTERS &&
- Section.getType() != MCSectionMachO::S_SYMBOL_STUBS)
- continue;
-
- // Initialize the section indirect symbol base, if necessary.
- if (!IndirectSymBase.count(it->SectionData))
- IndirectSymBase[it->SectionData] = IndirectIndex;
-
- // Set the symbol type to undefined lazy, but only on construction.
- //
- // FIXME: Do not hardcode.
- bool Created;
- MCSymbolData &Entry = Asm.getOrCreateSymbolData(*it->Symbol, &Created);
- if (Created)
- Entry.setFlags(Entry.getFlags() | 0x0001);
+ // Write the relocation entries.
+ for (MCAssembler::const_iterator it = Asm.begin(),
+ ie = Asm.end(); it != ie; ++it) {
+ // Write the section relocation entries, in reverse order to match 'as'
+ // (approximately, the exact algorithm is more complicated than this).
+ std::vector<macho::RelocationEntry> &Relocs = Relocations[it];
+ for (unsigned i = 0, e = Relocs.size(); i != e; ++i) {
+ Write32(Relocs[e - i - 1].Word0);
+ Write32(Relocs[e - i - 1].Word1);
}
}
- /// ComputeSymbolTable - Compute the symbol table data
- ///
- /// \param StringTable [out] - The string table data.
- /// \param StringIndexMap [out] - Map from symbol names to offsets in the
- /// string table.
- void ComputeSymbolTable(MCAssembler &Asm, SmallString<256> &StringTable,
- std::vector<MachSymbolData> &LocalSymbolData,
- std::vector<MachSymbolData> &ExternalSymbolData,
- std::vector<MachSymbolData> &UndefinedSymbolData) {
- // Build section lookup table.
- DenseMap<const MCSection*, uint8_t> SectionIndexMap;
- unsigned Index = 1;
- for (MCAssembler::iterator it = Asm.begin(),
- ie = Asm.end(); it != ie; ++it, ++Index)
- SectionIndexMap[&it->getSection()] = Index;
- assert(Index <= 256 && "Too many sections!");
-
- // Index 0 is always the empty string.
- StringMap<uint64_t> StringIndexMap;
- StringTable += '\x00';
-
- // Build the symbol arrays and the string table, but only for non-local
- // symbols.
- //
- // The particular order that we collect the symbols and create the string
- // table, then sort the symbols is chosen to match 'as'. Even though it
- // doesn't matter for correctness, this is important for letting us diff .o
- // files.
- for (MCAssembler::symbol_iterator it = Asm.symbol_begin(),
- ie = Asm.symbol_end(); it != ie; ++it) {
- const MCSymbol &Symbol = it->getSymbol();
-
- // Ignore non-linker visible symbols.
- if (!Asm.isSymbolLinkerVisible(it->getSymbol()))
- continue;
-
- if (!it->isExternal() && !Symbol.isUndefined())
- continue;
-
- uint64_t &Entry = StringIndexMap[Symbol.getName()];
- if (!Entry) {
- Entry = StringTable.size();
- StringTable += Symbol.getName();
- StringTable += '\x00';
+ // Write the symbol table data, if used.
+ if (NumSymbols) {
+ // Write the indirect symbol entries.
+ for (MCAssembler::const_indirect_symbol_iterator
+ it = Asm.indirect_symbol_begin(),
+ ie = Asm.indirect_symbol_end(); it != ie; ++it) {
+ // Indirect symbols in the non lazy symbol pointer section have some
+ // special handling.
+ const MCSectionMachO &Section =
+ static_cast<const MCSectionMachO&>(it->SectionData->getSection());
+ if (Section.getType() == MCSectionMachO::S_NON_LAZY_SYMBOL_POINTERS) {
+ // If this symbol is defined and internal, mark it as such.
+ if (it->Symbol->isDefined() &&
+ !Asm.getSymbolData(*it->Symbol).isExternal()) {
+ uint32_t Flags = macho::ISF_Local;
+ if (it->Symbol->isAbsolute())
+ Flags |= macho::ISF_Absolute;
+ Write32(Flags);
+ continue;
+ }
}
- MachSymbolData MSD;
- MSD.SymbolData = it;
- MSD.StringIndex = Entry;
-
- if (Symbol.isUndefined()) {
- MSD.SectionIndex = 0;
- UndefinedSymbolData.push_back(MSD);
- } else if (Symbol.isAbsolute()) {
- MSD.SectionIndex = 0;
- ExternalSymbolData.push_back(MSD);
- } else {
- MSD.SectionIndex = SectionIndexMap.lookup(&Symbol.getSection());
- assert(MSD.SectionIndex && "Invalid section index!");
- ExternalSymbolData.push_back(MSD);
- }
+ Write32(Asm.getSymbolData(*it->Symbol).getIndex());
}
- // Now add the data for local symbols.
- for (MCAssembler::symbol_iterator it = Asm.symbol_begin(),
- ie = Asm.symbol_end(); it != ie; ++it) {
- const MCSymbol &Symbol = it->getSymbol();
-
- // Ignore non-linker visible symbols.
- if (!Asm.isSymbolLinkerVisible(it->getSymbol()))
- continue;
-
- if (it->isExternal() || Symbol.isUndefined())
- continue;
-
- uint64_t &Entry = StringIndexMap[Symbol.getName()];
- if (!Entry) {
- Entry = StringTable.size();
- StringTable += Symbol.getName();
- StringTable += '\x00';
- }
-
- MachSymbolData MSD;
- MSD.SymbolData = it;
- MSD.StringIndex = Entry;
-
- if (Symbol.isAbsolute()) {
- MSD.SectionIndex = 0;
- LocalSymbolData.push_back(MSD);
- } else {
- MSD.SectionIndex = SectionIndexMap.lookup(&Symbol.getSection());
- assert(MSD.SectionIndex && "Invalid section index!");
- LocalSymbolData.push_back(MSD);
- }
- }
+ // FIXME: Check that offsets match computed ones.
- // External and undefined symbols are required to be in lexicographic order.
- std::sort(ExternalSymbolData.begin(), ExternalSymbolData.end());
- std::sort(UndefinedSymbolData.begin(), UndefinedSymbolData.end());
-
- // Set the symbol indices.
- Index = 0;
+ // Write the symbol table entries.
for (unsigned i = 0, e = LocalSymbolData.size(); i != e; ++i)
- LocalSymbolData[i].SymbolData->setIndex(Index++);
+ WriteNlist(LocalSymbolData[i], Layout);
for (unsigned i = 0, e = ExternalSymbolData.size(); i != e; ++i)
- ExternalSymbolData[i].SymbolData->setIndex(Index++);
+ WriteNlist(ExternalSymbolData[i], Layout);
for (unsigned i = 0, e = UndefinedSymbolData.size(); i != e; ++i)
- UndefinedSymbolData[i].SymbolData->setIndex(Index++);
-
- // The string table is padded to a multiple of 4.
- while (StringTable.size() % 4)
- StringTable += '\x00';
- }
-
- void computeSectionAddresses(const MCAssembler &Asm,
- const MCAsmLayout &Layout) {
- uint64_t StartAddress = 0;
- const SmallVectorImpl<MCSectionData*> &Order = Layout.getSectionOrder();
- for (int i = 0, n = Order.size(); i != n ; ++i) {
- const MCSectionData *SD = Order[i];
- StartAddress = RoundUpToAlignment(StartAddress, SD->getAlignment());
- SectionAddress[SD] = StartAddress;
- StartAddress += Layout.getSectionAddressSize(SD);
- // Explicitly pad the section to match the alignment requirements of the
- // following one. This is for 'gas' compatibility, it shouldn't
- /// strictly be necessary.
- StartAddress += getPaddingSize(SD, Layout);
- }
- }
-
- void ExecutePostLayoutBinding(MCAssembler &Asm, const MCAsmLayout &Layout) {
- computeSectionAddresses(Asm, Layout);
-
- // Create symbol data for any indirect symbols.
- BindIndirectSymbols(Asm);
-
- // Compute symbol table information and bind symbol indices.
- ComputeSymbolTable(Asm, StringTable, LocalSymbolData, ExternalSymbolData,
- UndefinedSymbolData);
- }
-
- virtual bool IsSymbolRefDifferenceFullyResolvedImpl(const MCAssembler &Asm,
- const MCSymbolData &DataA,
- const MCFragment &FB,
- bool InSet,
- bool IsPCRel) const {
- if (InSet)
- return true;
+ WriteNlist(UndefinedSymbolData[i], Layout);
- // The effective address is
- // addr(atom(A)) + offset(A)
- // - addr(atom(B)) - offset(B)
- // and the offsets are not relocatable, so the fixup is fully resolved when
- // addr(atom(A)) - addr(atom(B)) == 0.
- const MCSymbolData *A_Base = 0, *B_Base = 0;
-
- const MCSymbol &SA = DataA.getSymbol().AliasedSymbol();
- const MCSection &SecA = SA.getSection();
- const MCSection &SecB = FB.getParent()->getSection();
-
- if (IsPCRel) {
- // The simple (Darwin, except on x86_64) way of dealing with this was to
- // assume that any reference to a temporary symbol *must* be a temporary
- // symbol in the same atom, unless the sections differ. Therefore, any
- // PCrel relocation to a temporary symbol (in the same section) is fully
- // resolved. This also works in conjunction with absolutized .set, which
- // requires the compiler to use .set to absolutize the differences between
- // symbols which the compiler knows to be assembly time constants, so we
- // don't need to worry about considering symbol differences fully
- // resolved.
-
- if (!Asm.getBackend().hasReliableSymbolDifference()) {
- if (!SA.isTemporary() || !SA.isInSection() || &SecA != &SecB)
- return false;
- return true;
- }
- } else {
- if (!TargetObjectWriter->useAggressiveSymbolFolding())
- return false;
- }
-
- const MCFragment &FA = *Asm.getSymbolData(SA).getFragment();
-
- A_Base = FA.getAtom();
- if (!A_Base)
- return false;
-
- B_Base = FB.getAtom();
- if (!B_Base)
- return false;
-
- // If the atoms are the same, they are guaranteed to have the same address.
- if (A_Base == B_Base)
- return true;
-
- // Otherwise, we can't prove this is fully resolved.
- return false;
+ // Write the string table.
+ OS << StringTable.str();
}
-
- void WriteObject(MCAssembler &Asm, const MCAsmLayout &Layout) {
- unsigned NumSections = Asm.size();
-
- // The section data starts after the header, the segment load command (and
- // section headers) and the symbol table.
- unsigned NumLoadCommands = 1;
- uint64_t LoadCommandsSize = is64Bit() ?
- macho::SegmentLoadCommand64Size + NumSections * macho::Section64Size :
- macho::SegmentLoadCommand32Size + NumSections * macho::Section32Size;
-
- // Add the symbol table load command sizes, if used.
- unsigned NumSymbols = LocalSymbolData.size() + ExternalSymbolData.size() +
- UndefinedSymbolData.size();
- if (NumSymbols) {
- NumLoadCommands += 2;
- LoadCommandsSize += (macho::SymtabLoadCommandSize +
- macho::DysymtabLoadCommandSize);
- }
-
- // Compute the total size of the section data, as well as its file size and
- // vm size.
- uint64_t SectionDataStart = (is64Bit() ? macho::Header64Size :
- macho::Header32Size) + LoadCommandsSize;
- uint64_t SectionDataSize = 0;
- uint64_t SectionDataFileSize = 0;
- uint64_t VMSize = 0;
- for (MCAssembler::const_iterator it = Asm.begin(),
- ie = Asm.end(); it != ie; ++it) {
- const MCSectionData &SD = *it;
- uint64_t Address = getSectionAddress(&SD);
- uint64_t Size = Layout.getSectionAddressSize(&SD);
- uint64_t FileSize = Layout.getSectionFileSize(&SD);
- FileSize += getPaddingSize(&SD, Layout);
-
- VMSize = std::max(VMSize, Address + Size);
-
- if (SD.getSection().isVirtualSection())
- continue;
-
- SectionDataSize = std::max(SectionDataSize, Address + Size);
- SectionDataFileSize = std::max(SectionDataFileSize, Address + FileSize);
- }
-
- // The section data is padded to 4 bytes.
- //
- // FIXME: Is this machine dependent?
- unsigned SectionDataPadding = OffsetToAlignment(SectionDataFileSize, 4);
- SectionDataFileSize += SectionDataPadding;
-
- // Write the prolog, starting with the header and load command...
- WriteHeader(NumLoadCommands, LoadCommandsSize,
- Asm.getSubsectionsViaSymbols());
- WriteSegmentLoadCommand(NumSections, VMSize,
- SectionDataStart, SectionDataSize);
-
- // ... and then the section headers.
- uint64_t RelocTableEnd = SectionDataStart + SectionDataFileSize;
- for (MCAssembler::const_iterator it = Asm.begin(),
- ie = Asm.end(); it != ie; ++it) {
- std::vector<macho::RelocationEntry> &Relocs = Relocations[it];
- unsigned NumRelocs = Relocs.size();
- uint64_t SectionStart = SectionDataStart + getSectionAddress(it);
- WriteSection(Asm, Layout, *it, SectionStart, RelocTableEnd, NumRelocs);
- RelocTableEnd += NumRelocs * macho::RelocationInfoSize;
- }
-
- // Write the symbol table load command, if used.
- if (NumSymbols) {
- unsigned FirstLocalSymbol = 0;
- unsigned NumLocalSymbols = LocalSymbolData.size();
- unsigned FirstExternalSymbol = FirstLocalSymbol + NumLocalSymbols;
- unsigned NumExternalSymbols = ExternalSymbolData.size();
- unsigned FirstUndefinedSymbol = FirstExternalSymbol + NumExternalSymbols;
- unsigned NumUndefinedSymbols = UndefinedSymbolData.size();
- unsigned NumIndirectSymbols = Asm.indirect_symbol_size();
- unsigned NumSymTabSymbols =
- NumLocalSymbols + NumExternalSymbols + NumUndefinedSymbols;
- uint64_t IndirectSymbolSize = NumIndirectSymbols * 4;
- uint64_t IndirectSymbolOffset = 0;
-
- // If used, the indirect symbols are written after the section data.
- if (NumIndirectSymbols)
- IndirectSymbolOffset = RelocTableEnd;
-
- // The symbol table is written after the indirect symbol data.
- uint64_t SymbolTableOffset = RelocTableEnd + IndirectSymbolSize;
-
- // The string table is written after symbol table.
- uint64_t StringTableOffset =
- SymbolTableOffset + NumSymTabSymbols * (is64Bit() ? macho::Nlist64Size :
- macho::Nlist32Size);
- WriteSymtabLoadCommand(SymbolTableOffset, NumSymTabSymbols,
- StringTableOffset, StringTable.size());
-
- WriteDysymtabLoadCommand(FirstLocalSymbol, NumLocalSymbols,
- FirstExternalSymbol, NumExternalSymbols,
- FirstUndefinedSymbol, NumUndefinedSymbols,
- IndirectSymbolOffset, NumIndirectSymbols);
- }
-
- // Write the actual section data.
- for (MCAssembler::const_iterator it = Asm.begin(),
- ie = Asm.end(); it != ie; ++it) {
- Asm.WriteSectionData(it, Layout);
-
- uint64_t Pad = getPaddingSize(it, Layout);
- for (unsigned int i = 0; i < Pad; ++i)
- Write8(0);
- }
-
- // Write the extra padding.
- WriteZeros(SectionDataPadding);
-
- // Write the relocation entries.
- for (MCAssembler::const_iterator it = Asm.begin(),
- ie = Asm.end(); it != ie; ++it) {
- // Write the section relocation entries, in reverse order to match 'as'
- // (approximately, the exact algorithm is more complicated than this).
- std::vector<macho::RelocationEntry> &Relocs = Relocations[it];
- for (unsigned i = 0, e = Relocs.size(); i != e; ++i) {
- Write32(Relocs[e - i - 1].Word0);
- Write32(Relocs[e - i - 1].Word1);
- }
- }
-
- // Write the symbol table data, if used.
- if (NumSymbols) {
- // Write the indirect symbol entries.
- for (MCAssembler::const_indirect_symbol_iterator
- it = Asm.indirect_symbol_begin(),
- ie = Asm.indirect_symbol_end(); it != ie; ++it) {
- // Indirect symbols in the non lazy symbol pointer section have some
- // special handling.
- const MCSectionMachO &Section =
- static_cast<const MCSectionMachO&>(it->SectionData->getSection());
- if (Section.getType() == MCSectionMachO::S_NON_LAZY_SYMBOL_POINTERS) {
- // If this symbol is defined and internal, mark it as such.
- if (it->Symbol->isDefined() &&
- !Asm.getSymbolData(*it->Symbol).isExternal()) {
- uint32_t Flags = macho::ISF_Local;
- if (it->Symbol->isAbsolute())
- Flags |= macho::ISF_Absolute;
- Write32(Flags);
- continue;
- }
- }
-
- Write32(Asm.getSymbolData(*it->Symbol).getIndex());
- }
-
- // FIXME: Check that offsets match computed ones.
-
- // Write the symbol table entries.
- for (unsigned i = 0, e = LocalSymbolData.size(); i != e; ++i)
- WriteNlist(LocalSymbolData[i], Layout);
- for (unsigned i = 0, e = ExternalSymbolData.size(); i != e; ++i)
- WriteNlist(ExternalSymbolData[i], Layout);
- for (unsigned i = 0, e = UndefinedSymbolData.size(); i != e; ++i)
- WriteNlist(UndefinedSymbolData[i], Layout);
-
- // Write the string table.
- OS << StringTable.str();
- }
- }
-};
-
}
MCObjectWriter *llvm::createMachObjectWriter(MCMachObjectTargetWriter *MOTW,
diff --git a/contrib/llvm/lib/Target/SubtargetFeature.cpp b/contrib/llvm/lib/MC/SubtargetFeature.cpp
index e0a9de8..348cd4c 100644
--- a/contrib/llvm/lib/Target/SubtargetFeature.cpp
+++ b/contrib/llvm/lib/MC/SubtargetFeature.cpp
@@ -11,7 +11,7 @@
//
//===----------------------------------------------------------------------===//
-#include "llvm/Target/SubtargetFeature.h"
+#include "llvm/MC/SubtargetFeature.h"
#include "llvm/Support/Debug.h"
#include "llvm/Support/raw_ostream.h"
#include "llvm/ADT/StringExtras.h"
@@ -27,7 +27,7 @@ using namespace llvm;
/// hasFlag - Determine if a feature has a flag; '+' or '-'
///
-static inline bool hasFlag(const std::string &Feature) {
+static inline bool hasFlag(const StringRef Feature) {
assert(!Feature.empty() && "Empty string");
// Get first character
char Ch = Feature[0];
@@ -37,13 +37,13 @@ static inline bool hasFlag(const std::string &Feature) {
/// StripFlag - Return string stripped of flag.
///
-static inline std::string StripFlag(const std::string &Feature) {
+static inline std::string StripFlag(const StringRef Feature) {
return hasFlag(Feature) ? Feature.substr(1) : Feature;
}
/// isEnabled - Return true if enable flag; '+'.
///
-static inline bool isEnabled(const std::string &Feature) {
+static inline bool isEnabled(const StringRef Feature) {
assert(!Feature.empty() && "Empty string");
// Get first character
char Ch = Feature[0];
@@ -53,16 +53,22 @@ static inline bool isEnabled(const std::string &Feature) {
/// PrependFlag - Return a string with a prepended flag; '+' or '-'.
///
-static inline std::string PrependFlag(const std::string &Feature,
- bool IsEnabled) {
+static inline std::string PrependFlag(const StringRef Feature,
+ bool IsEnabled) {
assert(!Feature.empty() && "Empty string");
- if (hasFlag(Feature)) return Feature;
- return std::string(IsEnabled ? "+" : "-") + Feature;
+ if (hasFlag(Feature))
+ return Feature;
+ std::string Prefix = IsEnabled ? "+" : "-";
+ Prefix += Feature;
+ return Prefix;
}
/// Split - Splits a string of comma separated items in to a vector of strings.
///
-static void Split(std::vector<std::string> &V, const std::string &S) {
+static void Split(std::vector<std::string> &V, const StringRef S) {
+ if (S.empty())
+ return;
+
// Start at beginning of string.
size_t Pos = 0;
while (true) {
@@ -88,7 +94,7 @@ static std::string Join(const std::vector<std::string> &V) {
std::string Result;
// If the vector is not empty
if (!V.empty()) {
- // Start with the CPU feature
+ // Start with the first feature
Result = V[0];
// For each successive feature
for (size_t i = 1; i < V.size(); i++) {
@@ -103,7 +109,7 @@ static std::string Join(const std::vector<std::string> &V) {
}
/// Adding features.
-void SubtargetFeatures::AddFeature(const std::string &String,
+void SubtargetFeatures::AddFeature(const StringRef String,
bool IsEnabled) {
// Don't add empty features
if (!String.empty()) {
@@ -113,16 +119,16 @@ void SubtargetFeatures::AddFeature(const std::string &String,
}
/// Find KV in array using binary search.
-template<typename T> const T *Find(const std::string &S, const T *A, size_t L) {
+template<typename T> const T *Find(const StringRef S, const T *A, size_t L) {
// Make the lower bound element we're looking for
T KV;
- KV.Key = S.c_str();
+ KV.Key = S.data();
// Determine the end of the array
const T *Hi = A + L;
// Binary search the array
const T *F = std::lower_bound(A, Hi, KV);
// If not found then return NULL
- if (F == Hi || std::string(F->Key) != S) return NULL;
+ if (F == Hi || StringRef(F->Key) != S) return NULL;
// Return the found array item
return F;
}
@@ -170,7 +176,7 @@ static void Help(const SubtargetFeatureKV *CPUTable, size_t CPUTableSize,
// SubtargetFeatures Implementation
//===----------------------------------------------------------------------===//
-SubtargetFeatures::SubtargetFeatures(const std::string &Initial) {
+SubtargetFeatures::SubtargetFeatures(const StringRef Initial) {
// Break up string into separate features
Split(Features, Initial);
}
@@ -179,33 +185,6 @@ SubtargetFeatures::SubtargetFeatures(const std::string &Initial) {
std::string SubtargetFeatures::getString() const {
return Join(Features);
}
-void SubtargetFeatures::setString(const std::string &Initial) {
- // Throw out old features
- Features.clear();
- // Break up string into separate features
- Split(Features, LowercaseString(Initial));
-}
-
-
-/// setCPU - Set the CPU string. Replaces previous setting. Setting to ""
-/// clears CPU.
-void SubtargetFeatures::setCPU(const std::string &String) {
- Features[0] = LowercaseString(String);
-}
-
-
-/// setCPUIfNone - Setting CPU string only if no string is set.
-///
-void SubtargetFeatures::setCPUIfNone(const std::string &String) {
- if (Features[0].empty()) setCPU(String);
-}
-
-/// getCPU - Returns current CPU.
-///
-const std::string & SubtargetFeatures::getCPU() const {
- return Features[0];
-}
-
/// SetImpliedBits - For each feature that is (transitively) implied by this
/// feature, set it.
@@ -245,14 +224,48 @@ void ClearImpliedBits(uint64_t &Bits, const SubtargetFeatureKV *FeatureEntry,
}
}
-/// getBits - Get feature bits.
+/// ToggleFeature - Toggle a feature and returns the newly updated feature
+/// bits.
+uint64_t
+SubtargetFeatures::ToggleFeature(uint64_t Bits, const StringRef Feature,
+ const SubtargetFeatureKV *FeatureTable,
+ size_t FeatureTableSize) {
+ // Find feature in table.
+ const SubtargetFeatureKV *FeatureEntry =
+ Find(StripFlag(Feature), FeatureTable, FeatureTableSize);
+ // If there is a match
+ if (FeatureEntry) {
+ if ((Bits & FeatureEntry->Value) == FeatureEntry->Value) {
+ Bits &= ~FeatureEntry->Value;
+
+ // For each feature that implies this, clear it.
+ ClearImpliedBits(Bits, FeatureEntry, FeatureTable, FeatureTableSize);
+ } else {
+ Bits |= FeatureEntry->Value;
+
+ // For each feature that this implies, set it.
+ SetImpliedBits(Bits, FeatureEntry, FeatureTable, FeatureTableSize);
+ }
+ } else {
+ errs() << "'" << Feature
+ << "' is not a recognized feature for this target"
+ << " (ignoring feature)\n";
+ }
+
+ return Bits;
+}
+
+
+/// getFeatureBits - Get feature bits a CPU.
///
-uint64_t SubtargetFeatures::getBits(const SubtargetFeatureKV *CPUTable,
- size_t CPUTableSize,
- const SubtargetFeatureKV *FeatureTable,
- size_t FeatureTableSize) {
- assert(CPUTable && "missing CPU table");
- assert(FeatureTable && "missing features table");
+uint64_t SubtargetFeatures::getFeatureBits(const StringRef CPU,
+ const SubtargetFeatureKV *CPUTable,
+ size_t CPUTableSize,
+ const SubtargetFeatureKV *FeatureTable,
+ size_t FeatureTableSize) {
+ if (!FeatureTableSize || !CPUTableSize)
+ return 0;
+
#ifndef NDEBUG
for (size_t i = 1; i < CPUTableSize; i++) {
assert(strcmp(CPUTable[i - 1].Key, CPUTable[i].Key) < 0 &&
@@ -266,31 +279,33 @@ uint64_t SubtargetFeatures::getBits(const SubtargetFeatureKV *CPUTable,
uint64_t Bits = 0; // Resulting bits
// Check if help is needed
- if (Features[0] == "help")
+ if (CPU == "help")
Help(CPUTable, CPUTableSize, FeatureTable, FeatureTableSize);
- // Find CPU entry
- const SubtargetFeatureKV *CPUEntry =
- Find(Features[0], CPUTable, CPUTableSize);
- // If there is a match
- if (CPUEntry) {
- // Set base feature bits
- Bits = CPUEntry->Value;
-
- // Set the feature implied by this CPU feature, if any.
- for (size_t i = 0; i < FeatureTableSize; ++i) {
- const SubtargetFeatureKV &FE = FeatureTable[i];
- if (CPUEntry->Value & FE.Value)
- SetImpliedBits(Bits, &FE, FeatureTable, FeatureTableSize);
+ // Find CPU entry if CPU name is specified.
+ if (!CPU.empty()) {
+ const SubtargetFeatureKV *CPUEntry = Find(CPU, CPUTable, CPUTableSize);
+ // If there is a match
+ if (CPUEntry) {
+ // Set base feature bits
+ Bits = CPUEntry->Value;
+
+ // Set the feature implied by this CPU feature, if any.
+ for (size_t i = 0; i < FeatureTableSize; ++i) {
+ const SubtargetFeatureKV &FE = FeatureTable[i];
+ if (CPUEntry->Value & FE.Value)
+ SetImpliedBits(Bits, &FE, FeatureTable, FeatureTableSize);
+ }
+ } else {
+ errs() << "'" << CPU
+ << "' is not a recognized processor for this target"
+ << " (ignoring processor)\n";
}
- } else {
- errs() << "'" << Features[0]
- << "' is not a recognized processor for this target"
- << " (ignoring processor)\n";
}
+
// Iterate through each feature
- for (size_t i = 1; i < Features.size(); i++) {
- const std::string &Feature = Features[i];
+ for (size_t i = 0, E = Features.size(); i < E; i++) {
+ const StringRef Feature = Features[i];
// Check for help
if (Feature == "+help")
@@ -323,9 +338,10 @@ uint64_t SubtargetFeatures::getBits(const SubtargetFeatureKV *CPUTable,
return Bits;
}
-/// Get info pointer
-void *SubtargetFeatures::getInfo(const SubtargetInfoKV *Table,
- size_t TableSize) {
+/// Get scheduling itinerary of a CPU.
+void *SubtargetFeatures::getItinerary(const StringRef CPU,
+ const SubtargetInfoKV *Table,
+ size_t TableSize) {
assert(Table && "missing table");
#ifndef NDEBUG
for (size_t i = 1; i < TableSize; i++) {
@@ -334,12 +350,12 @@ void *SubtargetFeatures::getInfo(const SubtargetInfoKV *Table,
#endif
// Find entry
- const SubtargetInfoKV *Entry = Find(Features[0], Table, TableSize);
+ const SubtargetInfoKV *Entry = Find(CPU, Table, TableSize);
if (Entry) {
return Entry->Value;
} else {
- errs() << "'" << Features[0]
+ errs() << "'" << CPU
<< "' is not a recognized processor for this target"
<< " (ignoring processor)\n";
return NULL;
@@ -367,10 +383,7 @@ void SubtargetFeatures::dump() const {
/// subtarget. It would be better if we could encode this information
/// into the IR. See <rdar://5972456>.
///
-void SubtargetFeatures::getDefaultSubtargetFeatures(const std::string &CPU,
- const Triple& Triple) {
- setCPU(CPU);
-
+void SubtargetFeatures::getDefaultSubtargetFeatures(const Triple& Triple) {
if (Triple.getVendor() == Triple::Apple) {
if (Triple.getArch() == Triple::ppc) {
// powerpc-apple-*
diff --git a/contrib/llvm/lib/Object/Binary.cpp b/contrib/llvm/lib/Object/Binary.cpp
new file mode 100644
index 0000000..4b31c75
--- /dev/null
+++ b/contrib/llvm/lib/Object/Binary.cpp
@@ -0,0 +1,96 @@
+//===- Binary.cpp - A generic binary file -----------------------*- C++ -*-===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+//
+// This file defines the Binary class.
+//
+//===----------------------------------------------------------------------===//
+
+#include "llvm/Object/Binary.h"
+#include "llvm/ADT/StringRef.h"
+#include "llvm/Support/MemoryBuffer.h"
+#include "llvm/Support/Path.h"
+
+// Include headers for createBinary.
+#include "llvm/Object/ObjectFile.h"
+#include "llvm/Object/COFF.h"
+
+using namespace llvm;
+using namespace object;
+
+Binary::~Binary() {
+ delete Data;
+}
+
+Binary::Binary(unsigned int Type, MemoryBuffer *Source)
+ : TypeID(Type)
+ , Data(Source) {}
+
+StringRef Binary::getData() const {
+ return Data->getBuffer();
+}
+
+StringRef Binary::getFileName() const {
+ return Data->getBufferIdentifier();
+}
+
+error_code object::createBinary(MemoryBuffer *Source,
+ OwningPtr<Binary> &Result) {
+ OwningPtr<MemoryBuffer> scopedSource(Source);
+ if (!Source)
+ return make_error_code(errc::invalid_argument);
+ if (Source->getBufferSize() < 64)
+ return object_error::invalid_file_type;
+ sys::LLVMFileType type = sys::IdentifyFileType(Source->getBufferStart(),
+ static_cast<unsigned>(Source->getBufferSize()));
+ error_code ec;
+ switch (type) {
+ case sys::ELF_Relocatable_FileType:
+ case sys::ELF_Executable_FileType:
+ case sys::ELF_SharedObject_FileType:
+ case sys::ELF_Core_FileType: {
+ OwningPtr<Binary> ret(
+ ObjectFile::createELFObjectFile(scopedSource.take()));
+ if (!ret)
+ return object_error::invalid_file_type;
+ Result.swap(ret);
+ return object_error::success;
+ }
+ case sys::Mach_O_Object_FileType:
+ case sys::Mach_O_Executable_FileType:
+ case sys::Mach_O_FixedVirtualMemorySharedLib_FileType:
+ case sys::Mach_O_Core_FileType:
+ case sys::Mach_O_PreloadExecutable_FileType:
+ case sys::Mach_O_DynamicallyLinkedSharedLib_FileType:
+ case sys::Mach_O_DynamicLinker_FileType:
+ case sys::Mach_O_Bundle_FileType:
+ case sys::Mach_O_DynamicallyLinkedSharedLibStub_FileType: {
+ OwningPtr<Binary> ret(
+ ObjectFile::createMachOObjectFile(scopedSource.take()));
+ if (!ret)
+ return object_error::invalid_file_type;
+ Result.swap(ret);
+ return object_error::success;
+ }
+ case sys::COFF_FileType: {
+ OwningPtr<Binary> ret(new COFFObjectFile(scopedSource.take(), ec));
+ if (ec) return ec;
+ Result.swap(ret);
+ return object_error::success;
+ }
+ default: // Unrecognized object file format.
+ return object_error::invalid_file_type;
+ }
+}
+
+error_code object::createBinary(StringRef Path, OwningPtr<Binary> &Result) {
+ OwningPtr<MemoryBuffer> File;
+ if (error_code ec = MemoryBuffer::getFile(Path, File))
+ return ec;
+ return createBinary(File.take(), Result);
+}
diff --git a/contrib/llvm/lib/Object/COFFObjectFile.cpp b/contrib/llvm/lib/Object/COFFObjectFile.cpp
index 86bf44b..07de6bc 100644
--- a/contrib/llvm/lib/Object/COFFObjectFile.cpp
+++ b/contrib/llvm/lib/Object/COFFObjectFile.cpp
@@ -11,11 +11,9 @@
//
//===----------------------------------------------------------------------===//
+#include "llvm/Object/COFF.h"
#include "llvm/ADT/StringSwitch.h"
#include "llvm/ADT/Triple.h"
-#include "llvm/Object/ObjectFile.h"
-#include "llvm/Support/COFF.h"
-#include "llvm/Support/Endian.h"
using namespace llvm;
using namespace object;
@@ -28,174 +26,164 @@ using support::little16_t;
}
namespace {
-struct coff_file_header {
- ulittle16_t Machine;
- ulittle16_t NumberOfSections;
- ulittle32_t TimeDateStamp;
- ulittle32_t PointerToSymbolTable;
- ulittle32_t NumberOfSymbols;
- ulittle16_t SizeOfOptionalHeader;
- ulittle16_t Characteristics;
-};
+// Returns false if size is greater than the buffer size. And sets ec.
+bool checkSize(const MemoryBuffer *m, error_code &ec, uint64_t size) {
+ if (m->getBufferSize() < size) {
+ ec = object_error::unexpected_eof;
+ return false;
+ }
+ return true;
}
-extern char coff_file_header_layout_static_assert
- [sizeof(coff_file_header) == 20 ? 1 : -1];
-
-namespace {
-struct coff_symbol {
- struct StringTableOffset {
- ulittle32_t Zeroes;
- ulittle32_t Offset;
- };
-
- union {
- char ShortName[8];
- StringTableOffset Offset;
- } Name;
-
- ulittle32_t Value;
- little16_t SectionNumber;
-
- struct {
- ulittle8_t BaseType;
- ulittle8_t ComplexType;
- } Type;
-
- ulittle8_t StorageClass;
- ulittle8_t NumberOfAuxSymbols;
-};
+// Returns false if any bytes in [addr, addr + size) fall outsize of m.
+bool checkAddr(const MemoryBuffer *m,
+ error_code &ec,
+ uintptr_t addr,
+ uint64_t size) {
+ if (addr + size < addr ||
+ addr + size < size ||
+ addr + size > uintptr_t(m->getBufferEnd())) {
+ ec = object_error::unexpected_eof;
+ return false;
+ }
+ return true;
+}
}
-extern char coff_coff_symbol_layout_static_assert
- [sizeof(coff_symbol) == 18 ? 1 : -1];
+const coff_symbol *COFFObjectFile::toSymb(DataRefImpl Symb) const {
+ const coff_symbol *addr = reinterpret_cast<const coff_symbol*>(Symb.p);
-namespace {
-struct coff_section {
- char Name[8];
- ulittle32_t VirtualSize;
- ulittle32_t VirtualAddress;
- ulittle32_t SizeOfRawData;
- ulittle32_t PointerToRawData;
- ulittle32_t PointerToRelocations;
- ulittle32_t PointerToLinenumbers;
- ulittle16_t NumberOfRelocations;
- ulittle16_t NumberOfLinenumbers;
- ulittle32_t Characteristics;
-};
+# ifndef NDEBUG
+ // Verify that the symbol points to a valid entry in the symbol table.
+ uintptr_t offset = uintptr_t(addr) - uintptr_t(base());
+ if (offset < Header->PointerToSymbolTable
+ || offset >= Header->PointerToSymbolTable
+ + (Header->NumberOfSymbols * sizeof(coff_symbol)))
+ report_fatal_error("Symbol was outside of symbol table.");
+
+ assert((offset - Header->PointerToSymbolTable) % sizeof(coff_symbol)
+ == 0 && "Symbol did not point to the beginning of a symbol");
+# endif
+
+ return addr;
}
-extern char coff_coff_section_layout_static_assert
- [sizeof(coff_section) == 40 ? 1 : -1];
+const coff_section *COFFObjectFile::toSec(DataRefImpl Sec) const {
+ const coff_section *addr = reinterpret_cast<const coff_section*>(Sec.p);
-namespace {
-class COFFObjectFile : public ObjectFile {
-private:
- uint64_t HeaderOff;
- const coff_file_header *Header;
- const coff_section *SectionTable;
- const coff_symbol *SymbolTable;
- const char *StringTable;
-
- const coff_section *getSection(std::size_t index) const;
- const char *getString(std::size_t offset) const;
-
-protected:
- virtual SymbolRef getSymbolNext(DataRefImpl Symb) const;
- virtual StringRef getSymbolName(DataRefImpl Symb) const;
- virtual uint64_t getSymbolAddress(DataRefImpl Symb) const;
- virtual uint64_t getSymbolSize(DataRefImpl Symb) const;
- virtual char getSymbolNMTypeChar(DataRefImpl Symb) const;
- virtual bool isSymbolInternal(DataRefImpl Symb) const;
-
- virtual SectionRef getSectionNext(DataRefImpl Sec) const;
- virtual StringRef getSectionName(DataRefImpl Sec) const;
- virtual uint64_t getSectionAddress(DataRefImpl Sec) const;
- virtual uint64_t getSectionSize(DataRefImpl Sec) const;
- virtual StringRef getSectionContents(DataRefImpl Sec) const;
- virtual bool isSectionText(DataRefImpl Sec) const;
-
-public:
- COFFObjectFile(MemoryBuffer *Object);
- virtual symbol_iterator begin_symbols() const;
- virtual symbol_iterator end_symbols() const;
- virtual section_iterator begin_sections() const;
- virtual section_iterator end_sections() const;
-
- virtual uint8_t getBytesInAddress() const;
- virtual StringRef getFileFormatName() const;
- virtual unsigned getArch() const;
-};
-} // end namespace
-
-SymbolRef COFFObjectFile::getSymbolNext(DataRefImpl Symb) const {
- const coff_symbol *symb = reinterpret_cast<const coff_symbol*>(Symb.p);
+# ifndef NDEBUG
+ // Verify that the section points to a valid entry in the section table.
+ if (addr < SectionTable
+ || addr >= (SectionTable + Header->NumberOfSections))
+ report_fatal_error("Section was outside of section table.");
+
+ uintptr_t offset = uintptr_t(addr) - uintptr_t(SectionTable);
+ assert(offset % sizeof(coff_section) == 0 &&
+ "Section did not point to the beginning of a section");
+# endif
+
+ return addr;
+}
+
+error_code COFFObjectFile::getSymbolNext(DataRefImpl Symb,
+ SymbolRef &Result) const {
+ const coff_symbol *symb = toSymb(Symb);
symb += 1 + symb->NumberOfAuxSymbols;
- Symb.p = reinterpret_cast<intptr_t>(symb);
- return SymbolRef(Symb, this);
+ Symb.p = reinterpret_cast<uintptr_t>(symb);
+ Result = SymbolRef(Symb, this);
+ return object_error::success;
}
-StringRef COFFObjectFile::getSymbolName(DataRefImpl Symb) const {
- const coff_symbol *symb = reinterpret_cast<const coff_symbol*>(Symb.p);
+ error_code COFFObjectFile::getSymbolName(DataRefImpl Symb,
+ StringRef &Result) const {
+ const coff_symbol *symb = toSymb(Symb);
// Check for string table entry. First 4 bytes are 0.
if (symb->Name.Offset.Zeroes == 0) {
uint32_t Offset = symb->Name.Offset.Offset;
- return StringRef(getString(Offset));
+ if (error_code ec = getString(Offset, Result))
+ return ec;
+ return object_error::success;
}
if (symb->Name.ShortName[7] == 0)
// Null terminated, let ::strlen figure out the length.
- return StringRef(symb->Name.ShortName);
- // Not null terminated, use all 8 bytes.
- return StringRef(symb->Name.ShortName, 8);
+ Result = StringRef(symb->Name.ShortName);
+ else
+ // Not null terminated, use all 8 bytes.
+ Result = StringRef(symb->Name.ShortName, 8);
+ return object_error::success;
}
-uint64_t COFFObjectFile::getSymbolAddress(DataRefImpl Symb) const {
- const coff_symbol *symb = reinterpret_cast<const coff_symbol*>(Symb.p);
- const coff_section *Section = getSection(symb->SectionNumber);
- char Type = getSymbolNMTypeChar(Symb);
+error_code COFFObjectFile::getSymbolAddress(DataRefImpl Symb,
+ uint64_t &Result) const {
+ const coff_symbol *symb = toSymb(Symb);
+ const coff_section *Section = NULL;
+ if (error_code ec = getSection(symb->SectionNumber, Section))
+ return ec;
+ char Type;
+ if (error_code ec = getSymbolNMTypeChar(Symb, Type))
+ return ec;
if (Type == 'U' || Type == 'w')
- return UnknownAddressOrSize;
- if (Section)
- return Section->VirtualAddress + symb->Value;
- return symb->Value;
+ Result = UnknownAddressOrSize;
+ else if (Section)
+ Result = Section->VirtualAddress + symb->Value;
+ else
+ Result = symb->Value;
+ return object_error::success;
}
-uint64_t COFFObjectFile::getSymbolSize(DataRefImpl Symb) const {
+error_code COFFObjectFile::getSymbolSize(DataRefImpl Symb,
+ uint64_t &Result) const {
// FIXME: Return the correct size. This requires looking at all the symbols
// in the same section as this symbol, and looking for either the next
// symbol, or the end of the section.
- const coff_symbol *symb = reinterpret_cast<const coff_symbol*>(Symb.p);
- const coff_section *Section = getSection(symb->SectionNumber);
- char Type = getSymbolNMTypeChar(Symb);
+ const coff_symbol *symb = toSymb(Symb);
+ const coff_section *Section = NULL;
+ if (error_code ec = getSection(symb->SectionNumber, Section))
+ return ec;
+ char Type;
+ if (error_code ec = getSymbolNMTypeChar(Symb, Type))
+ return ec;
if (Type == 'U' || Type == 'w')
- return UnknownAddressOrSize;
- if (Section)
- return Section->SizeOfRawData - symb->Value;
- return 0;
+ Result = UnknownAddressOrSize;
+ else if (Section)
+ Result = Section->SizeOfRawData - symb->Value;
+ else
+ Result = 0;
+ return object_error::success;
}
-char COFFObjectFile::getSymbolNMTypeChar(DataRefImpl Symb) const {
- const coff_symbol *symb = reinterpret_cast<const coff_symbol*>(Symb.p);
- char ret = StringSwitch<char>(getSymbolName(Symb))
+error_code COFFObjectFile::getSymbolNMTypeChar(DataRefImpl Symb,
+ char &Result) const {
+ const coff_symbol *symb = toSymb(Symb);
+ StringRef name;
+ if (error_code ec = getSymbolName(Symb, name))
+ return ec;
+ char ret = StringSwitch<char>(name)
.StartsWith(".debug", 'N')
.StartsWith(".sxdata", 'N')
.Default('?');
- if (ret != '?')
- return ret;
+ if (ret != '?') {
+ Result = ret;
+ return object_error::success;
+ }
uint32_t Characteristics = 0;
- if (const coff_section *Section = getSection(symb->SectionNumber)) {
+ if (symb->SectionNumber > 0) {
+ const coff_section *Section = NULL;
+ if (error_code ec = getSection(symb->SectionNumber, Section))
+ return ec;
Characteristics = Section->Characteristics;
}
switch (symb->SectionNumber) {
case COFF::IMAGE_SYM_UNDEFINED:
// Check storage classes.
- if (symb->StorageClass == COFF::IMAGE_SYM_CLASS_WEAK_EXTERNAL)
- return 'w'; // Don't do ::toupper.
- else
+ if (symb->StorageClass == COFF::IMAGE_SYM_CLASS_WEAK_EXTERNAL) {
+ Result = 'w';
+ return object_error::success; // Don't do ::toupper.
+ } else
ret = 'u';
break;
case COFF::IMAGE_SYM_ABSOLUTE:
@@ -227,22 +215,28 @@ char COFFObjectFile::getSymbolNMTypeChar(DataRefImpl Symb) const {
if (symb->StorageClass == COFF::IMAGE_SYM_CLASS_EXTERNAL)
ret = ::toupper(ret);
- return ret;
+ Result = ret;
+ return object_error::success;
}
-bool COFFObjectFile::isSymbolInternal(DataRefImpl Symb) const {
- return false;
+error_code COFFObjectFile::isSymbolInternal(DataRefImpl Symb,
+ bool &Result) const {
+ Result = false;
+ return object_error::success;
}
-SectionRef COFFObjectFile::getSectionNext(DataRefImpl Sec) const {
- const coff_section *sec = reinterpret_cast<const coff_section*>(Sec.p);
+error_code COFFObjectFile::getSectionNext(DataRefImpl Sec,
+ SectionRef &Result) const {
+ const coff_section *sec = toSec(Sec);
sec += 1;
- Sec.p = reinterpret_cast<intptr_t>(sec);
- return SectionRef(Sec, this);
+ Sec.p = reinterpret_cast<uintptr_t>(sec);
+ Result = SectionRef(Sec, this);
+ return object_error::success;
}
-StringRef COFFObjectFile::getSectionName(DataRefImpl Sec) const {
- const coff_section *sec = reinterpret_cast<const coff_section*>(Sec.p);
+error_code COFFObjectFile::getSectionName(DataRefImpl Sec,
+ StringRef &Result) const {
+ const coff_section *sec = toSec(Sec);
StringRef name;
if (sec->Name[7] == 0)
// Null terminated, let ::strlen figure out the length.
@@ -255,64 +249,124 @@ StringRef COFFObjectFile::getSectionName(DataRefImpl Sec) const {
if (name[0] == '/') {
uint32_t Offset;
name.substr(1).getAsInteger(10, Offset);
- return StringRef(getString(Offset));
+ if (error_code ec = getString(Offset, name))
+ return ec;
}
- // It's just a normal name.
- return name;
+ Result = name;
+ return object_error::success;
+}
+
+error_code COFFObjectFile::getSectionAddress(DataRefImpl Sec,
+ uint64_t &Result) const {
+ const coff_section *sec = toSec(Sec);
+ Result = sec->VirtualAddress;
+ return object_error::success;
}
-uint64_t COFFObjectFile::getSectionAddress(DataRefImpl Sec) const {
- const coff_section *sec = reinterpret_cast<const coff_section*>(Sec.p);
- return sec->VirtualAddress;
+error_code COFFObjectFile::getSectionSize(DataRefImpl Sec,
+ uint64_t &Result) const {
+ const coff_section *sec = toSec(Sec);
+ Result = sec->SizeOfRawData;
+ return object_error::success;
}
-uint64_t COFFObjectFile::getSectionSize(DataRefImpl Sec) const {
- const coff_section *sec = reinterpret_cast<const coff_section*>(Sec.p);
- return sec->SizeOfRawData;
+error_code COFFObjectFile::getSectionContents(DataRefImpl Sec,
+ StringRef &Result) const {
+ const coff_section *sec = toSec(Sec);
+ // The only thing that we need to verify is that the contents is contained
+ // within the file bounds. We don't need to make sure it doesn't cover other
+ // data, as there's nothing that says that is not allowed.
+ uintptr_t con_start = uintptr_t(base()) + sec->PointerToRawData;
+ uintptr_t con_end = con_start + sec->SizeOfRawData;
+ if (con_end >= uintptr_t(Data->getBufferEnd()))
+ return object_error::parse_failed;
+ Result = StringRef(reinterpret_cast<const char*>(con_start),
+ sec->SizeOfRawData);
+ return object_error::success;
}
-StringRef COFFObjectFile::getSectionContents(DataRefImpl Sec) const {
- const coff_section *sec = reinterpret_cast<const coff_section*>(Sec.p);
- return StringRef(reinterpret_cast<const char *>(base + sec->PointerToRawData),
- sec->SizeOfRawData);
+error_code COFFObjectFile::isSectionText(DataRefImpl Sec,
+ bool &Result) const {
+ const coff_section *sec = toSec(Sec);
+ Result = sec->Characteristics & COFF::IMAGE_SCN_CNT_CODE;
+ return object_error::success;
}
-bool COFFObjectFile::isSectionText(DataRefImpl Sec) const {
- const coff_section *sec = reinterpret_cast<const coff_section*>(Sec.p);
- return sec->Characteristics & COFF::IMAGE_SCN_CNT_CODE;
+error_code COFFObjectFile::sectionContainsSymbol(DataRefImpl Sec,
+ DataRefImpl Symb,
+ bool &Result) const {
+ // FIXME: Unimplemented.
+ Result = false;
+ return object_error::success;
}
-COFFObjectFile::COFFObjectFile(MemoryBuffer *Object)
- : ObjectFile(Object) {
+COFFObjectFile::COFFObjectFile(MemoryBuffer *Object, error_code &ec)
+ : ObjectFile(Binary::isCOFF, Object, ec) {
+ // Check that we at least have enough room for a header.
+ if (!checkSize(Data, ec, sizeof(coff_file_header))) return;
- HeaderOff = 0;
+ // The actual starting location of the COFF header in the file. This can be
+ // non-zero in PE/COFF files.
+ uint64_t HeaderStart = 0;
- if (base[0] == 0x4d && base[1] == 0x5a) {
+ // Check if this is a PE/COFF file.
+ if (base()[0] == 0x4d && base()[1] == 0x5a) {
// PE/COFF, seek through MS-DOS compatibility stub and 4-byte
// PE signature to find 'normal' COFF header.
- HeaderOff += *reinterpret_cast<const ulittle32_t *>(base + 0x3c);
- HeaderOff += 4;
+ if (!checkSize(Data, ec, 0x3c + 8)) return;
+ HeaderStart += *reinterpret_cast<const ulittle32_t *>(base() + 0x3c);
+ // Check the PE header. ("PE\0\0")
+ if (std::memcmp(base() + HeaderStart, "PE\0\0", 4) != 0) {
+ ec = object_error::parse_failed;
+ return;
+ }
+ HeaderStart += 4; // Skip the PE Header.
}
- Header = reinterpret_cast<const coff_file_header *>(base + HeaderOff);
+ Header = reinterpret_cast<const coff_file_header *>(base() + HeaderStart);
+ if (!checkAddr(Data, ec, uintptr_t(Header), sizeof(coff_file_header)))
+ return;
+
SectionTable =
- reinterpret_cast<const coff_section *>( base
- + HeaderOff
+ reinterpret_cast<const coff_section *>( base()
+ + HeaderStart
+ sizeof(coff_file_header)
+ Header->SizeOfOptionalHeader);
+ if (!checkAddr(Data, ec, uintptr_t(SectionTable),
+ Header->NumberOfSections * sizeof(coff_section)))
+ return;
+
SymbolTable =
- reinterpret_cast<const coff_symbol *>(base + Header->PointerToSymbolTable);
+ reinterpret_cast<const coff_symbol *>(base()
+ + Header->PointerToSymbolTable);
+ if (!checkAddr(Data, ec, uintptr_t(SymbolTable),
+ Header->NumberOfSymbols * sizeof(coff_symbol)))
+ return;
// Find string table.
- StringTable = reinterpret_cast<const char *>(base)
- + Header->PointerToSymbolTable
- + Header->NumberOfSymbols * 18;
+ StringTable = reinterpret_cast<const char *>(base())
+ + Header->PointerToSymbolTable
+ + Header->NumberOfSymbols * sizeof(coff_symbol);
+ if (!checkAddr(Data, ec, uintptr_t(StringTable), sizeof(ulittle32_t)))
+ return;
+
+ StringTableSize = *reinterpret_cast<const ulittle32_t *>(StringTable);
+ if (!checkAddr(Data, ec, uintptr_t(StringTable), StringTableSize))
+ return;
+ // Check that the string table is null terminated if has any in it.
+ if (StringTableSize < 4
+ || (StringTableSize > 4 && StringTable[StringTableSize - 1] != 0)) {
+ ec = object_error::parse_failed;
+ return;
+ }
+
+ ec = object_error::success;
}
ObjectFile::symbol_iterator COFFObjectFile::begin_symbols() const {
DataRefImpl ret;
- memset(&ret, 0, sizeof(DataRefImpl));
+ std::memset(&ret, 0, sizeof(DataRefImpl));
ret.p = reinterpret_cast<intptr_t>(SymbolTable);
return symbol_iterator(SymbolRef(ret, this));
}
@@ -320,21 +374,21 @@ ObjectFile::symbol_iterator COFFObjectFile::begin_symbols() const {
ObjectFile::symbol_iterator COFFObjectFile::end_symbols() const {
// The symbol table ends where the string table begins.
DataRefImpl ret;
- memset(&ret, 0, sizeof(DataRefImpl));
+ std::memset(&ret, 0, sizeof(DataRefImpl));
ret.p = reinterpret_cast<intptr_t>(StringTable);
return symbol_iterator(SymbolRef(ret, this));
}
ObjectFile::section_iterator COFFObjectFile::begin_sections() const {
DataRefImpl ret;
- memset(&ret, 0, sizeof(DataRefImpl));
+ std::memset(&ret, 0, sizeof(DataRefImpl));
ret.p = reinterpret_cast<intptr_t>(SectionTable);
return section_iterator(SectionRef(ret, this));
}
ObjectFile::section_iterator COFFObjectFile::end_sections() const {
DataRefImpl ret;
- memset(&ret, 0, sizeof(DataRefImpl));
+ std::memset(&ret, 0, sizeof(DataRefImpl));
ret.p = reinterpret_cast<intptr_t>(SectionTable + Header->NumberOfSections);
return section_iterator(SectionRef(ret, this));
}
@@ -365,24 +419,37 @@ unsigned COFFObjectFile::getArch() const {
}
}
-const coff_section *COFFObjectFile::getSection(std::size_t index) const {
- if (index > 0 && index <= Header->NumberOfSections)
- return SectionTable + (index - 1);
- return 0;
+error_code COFFObjectFile::getSection(int32_t index,
+ const coff_section *&Result) const {
+ // Check for special index values.
+ if (index == COFF::IMAGE_SYM_UNDEFINED ||
+ index == COFF::IMAGE_SYM_ABSOLUTE ||
+ index == COFF::IMAGE_SYM_DEBUG)
+ Result = NULL;
+ else if (index > 0 && index <= Header->NumberOfSections)
+ // We already verified the section table data, so no need to check again.
+ Result = SectionTable + (index - 1);
+ else
+ return object_error::parse_failed;
+ return object_error::success;
}
-const char *COFFObjectFile::getString(std::size_t offset) const {
- const ulittle32_t *StringTableSize =
- reinterpret_cast<const ulittle32_t *>(StringTable);
- if (offset < *StringTableSize)
- return StringTable + offset;
- return 0;
+error_code COFFObjectFile::getString(uint32_t offset,
+ StringRef &Result) const {
+ if (StringTableSize <= 4)
+ // Tried to get a string from an empty string table.
+ return object_error::parse_failed;
+ if (offset >= StringTableSize)
+ return object_error::unexpected_eof;
+ Result = StringRef(StringTable + offset);
+ return object_error::success;
}
namespace llvm {
ObjectFile *ObjectFile::createCOFFObjectFile(MemoryBuffer *Object) {
- return new COFFObjectFile(Object);
+ error_code ec;
+ return new COFFObjectFile(Object, ec);
}
} // end namespace llvm
diff --git a/contrib/llvm/lib/Object/ELFObjectFile.cpp b/contrib/llvm/lib/Object/ELFObjectFile.cpp
index d2a2726..e2ff4df 100644
--- a/contrib/llvm/lib/Object/ELFObjectFile.cpp
+++ b/contrib/llvm/lib/Object/ELFObjectFile.cpp
@@ -222,22 +222,24 @@ class ELFObjectFile : public ObjectFile {
const char *getString(const Elf_Shdr *section, uint32_t offset) const;
protected:
- virtual SymbolRef getSymbolNext(DataRefImpl Symb) const;
- virtual StringRef getSymbolName(DataRefImpl Symb) const;
- virtual uint64_t getSymbolAddress(DataRefImpl Symb) const;
- virtual uint64_t getSymbolSize(DataRefImpl Symb) const;
- virtual char getSymbolNMTypeChar(DataRefImpl Symb) const;
- virtual bool isSymbolInternal(DataRefImpl Symb) const;
-
- virtual SectionRef getSectionNext(DataRefImpl Sec) const;
- virtual StringRef getSectionName(DataRefImpl Sec) const;
- virtual uint64_t getSectionAddress(DataRefImpl Sec) const;
- virtual uint64_t getSectionSize(DataRefImpl Sec) const;
- virtual StringRef getSectionContents(DataRefImpl Sec) const;
- virtual bool isSectionText(DataRefImpl Sec) const;
+ virtual error_code getSymbolNext(DataRefImpl Symb, SymbolRef &Res) const;
+ virtual error_code getSymbolName(DataRefImpl Symb, StringRef &Res) const;
+ virtual error_code getSymbolAddress(DataRefImpl Symb, uint64_t &Res) const;
+ virtual error_code getSymbolSize(DataRefImpl Symb, uint64_t &Res) const;
+ virtual error_code getSymbolNMTypeChar(DataRefImpl Symb, char &Res) const;
+ virtual error_code isSymbolInternal(DataRefImpl Symb, bool &Res) const;
+
+ virtual error_code getSectionNext(DataRefImpl Sec, SectionRef &Res) const;
+ virtual error_code getSectionName(DataRefImpl Sec, StringRef &Res) const;
+ virtual error_code getSectionAddress(DataRefImpl Sec, uint64_t &Res) const;
+ virtual error_code getSectionSize(DataRefImpl Sec, uint64_t &Res) const;
+ virtual error_code getSectionContents(DataRefImpl Sec, StringRef &Res) const;
+ virtual error_code isSectionText(DataRefImpl Sec, bool &Res) const;
+ virtual error_code sectionContainsSymbol(DataRefImpl Sec, DataRefImpl Symb,
+ bool &Result) const;
public:
- ELFObjectFile(MemoryBuffer *Object);
+ ELFObjectFile(MemoryBuffer *Object, error_code &ec);
virtual symbol_iterator begin_symbols() const;
virtual symbol_iterator end_symbols() const;
virtual section_iterator begin_sections() const;
@@ -259,9 +261,9 @@ void ELFObjectFile<target_endianness, is64Bits>
// an error object around.
if (!( symb
&& SymbolTableSection
- && symb >= (const Elf_Sym*)(base
+ && symb >= (const Elf_Sym*)(base()
+ SymbolTableSection->sh_offset)
- && symb < (const Elf_Sym*)(base
+ && symb < (const Elf_Sym*)(base()
+ SymbolTableSection->sh_offset
+ SymbolTableSection->sh_size)))
// FIXME: Proper error handling.
@@ -269,8 +271,9 @@ void ELFObjectFile<target_endianness, is64Bits>
}
template<support::endianness target_endianness, bool is64Bits>
-SymbolRef ELFObjectFile<target_endianness, is64Bits>
- ::getSymbolNext(DataRefImpl Symb) const {
+error_code ELFObjectFile<target_endianness, is64Bits>
+ ::getSymbolNext(DataRefImpl Symb,
+ SymbolRef &Result) const {
validateSymbol(Symb);
const Elf_Shdr *SymbolTableSection = SymbolTableSections[Symb.d.b];
@@ -287,63 +290,80 @@ SymbolRef ELFObjectFile<target_endianness, is64Bits>
}
}
- return SymbolRef(Symb, this);
+ Result = SymbolRef(Symb, this);
+ return object_error::success;
}
template<support::endianness target_endianness, bool is64Bits>
-StringRef ELFObjectFile<target_endianness, is64Bits>
- ::getSymbolName(DataRefImpl Symb) const {
+error_code ELFObjectFile<target_endianness, is64Bits>
+ ::getSymbolName(DataRefImpl Symb,
+ StringRef &Result) const {
validateSymbol(Symb);
const Elf_Sym *symb = getSymbol(Symb);
if (symb->st_name == 0) {
const Elf_Shdr *section = getSection(symb->st_shndx);
if (!section)
- return "";
- return getString(dot_shstrtab_sec, section->sh_name);
+ Result = "";
+ else
+ Result = getString(dot_shstrtab_sec, section->sh_name);
+ return object_error::success;
}
// Use the default symbol table name section.
- return getString(dot_strtab_sec, symb->st_name);
+ Result = getString(dot_strtab_sec, symb->st_name);
+ return object_error::success;
}
template<support::endianness target_endianness, bool is64Bits>
-uint64_t ELFObjectFile<target_endianness, is64Bits>
- ::getSymbolAddress(DataRefImpl Symb) const {
+error_code ELFObjectFile<target_endianness, is64Bits>
+ ::getSymbolAddress(DataRefImpl Symb,
+ uint64_t &Result) const {
validateSymbol(Symb);
const Elf_Sym *symb = getSymbol(Symb);
const Elf_Shdr *Section;
switch (symb->st_shndx) {
case ELF::SHN_COMMON:
// Undefined symbols have no address yet.
- case ELF::SHN_UNDEF: return UnknownAddressOrSize;
- case ELF::SHN_ABS: return symb->st_value;
+ case ELF::SHN_UNDEF:
+ Result = UnknownAddressOrSize;
+ return object_error::success;
+ case ELF::SHN_ABS:
+ Result = symb->st_value;
+ return object_error::success;
default: Section = getSection(symb->st_shndx);
}
switch (symb->getType()) {
- case ELF::STT_SECTION: return Section ? Section->sh_addr
- : UnknownAddressOrSize;
+ case ELF::STT_SECTION:
+ Result = Section ? Section->sh_addr : UnknownAddressOrSize;
+ return object_error::success;
case ELF::STT_FUNC:
case ELF::STT_OBJECT:
case ELF::STT_NOTYPE:
- return symb->st_value;
- default: return UnknownAddressOrSize;
+ Result = symb->st_value;
+ return object_error::success;
+ default:
+ Result = UnknownAddressOrSize;
+ return object_error::success;
}
}
template<support::endianness target_endianness, bool is64Bits>
-uint64_t ELFObjectFile<target_endianness, is64Bits>
- ::getSymbolSize(DataRefImpl Symb) const {
+error_code ELFObjectFile<target_endianness, is64Bits>
+ ::getSymbolSize(DataRefImpl Symb,
+ uint64_t &Result) const {
validateSymbol(Symb);
const Elf_Sym *symb = getSymbol(Symb);
if (symb->st_size == 0)
- return UnknownAddressOrSize;
- return symb->st_size;
+ Result = UnknownAddressOrSize;
+ Result = symb->st_size;
+ return object_error::success;
}
template<support::endianness target_endianness, bool is64Bits>
-char ELFObjectFile<target_endianness, is64Bits>
- ::getSymbolNMTypeChar(DataRefImpl Symb) const {
+error_code ELFObjectFile<target_endianness, is64Bits>
+ ::getSymbolNMTypeChar(DataRefImpl Symb,
+ char &Result) const {
validateSymbol(Symb);
const Elf_Sym *symb = getSymbol(Symb);
const Elf_Shdr *Section = getSection(symb->st_shndx);
@@ -390,89 +410,120 @@ char ELFObjectFile<target_endianness, is64Bits>
ret = 'W';
}
- if (ret == '?' && symb->getType() == ELF::STT_SECTION)
- return StringSwitch<char>(getSymbolName(Symb))
+ if (ret == '?' && symb->getType() == ELF::STT_SECTION) {
+ StringRef name;
+ if (error_code ec = getSymbolName(Symb, name))
+ return ec;
+ Result = StringSwitch<char>(name)
.StartsWith(".debug", 'N')
.StartsWith(".note", 'n');
+ return object_error::success;
+ }
- return ret;
+ Result = ret;
+ return object_error::success;
}
template<support::endianness target_endianness, bool is64Bits>
-bool ELFObjectFile<target_endianness, is64Bits>
- ::isSymbolInternal(DataRefImpl Symb) const {
+error_code ELFObjectFile<target_endianness, is64Bits>
+ ::isSymbolInternal(DataRefImpl Symb,
+ bool &Result) const {
validateSymbol(Symb);
const Elf_Sym *symb = getSymbol(Symb);
if ( symb->getType() == ELF::STT_FILE
|| symb->getType() == ELF::STT_SECTION)
- return true;
- return false;
+ Result = true;
+ Result = false;
+ return object_error::success;
}
template<support::endianness target_endianness, bool is64Bits>
-SectionRef ELFObjectFile<target_endianness, is64Bits>
- ::getSectionNext(DataRefImpl Sec) const {
+error_code ELFObjectFile<target_endianness, is64Bits>
+ ::getSectionNext(DataRefImpl Sec, SectionRef &Result) const {
const uint8_t *sec = reinterpret_cast<const uint8_t *>(Sec.p);
sec += Header->e_shentsize;
Sec.p = reinterpret_cast<intptr_t>(sec);
- return SectionRef(Sec, this);
+ Result = SectionRef(Sec, this);
+ return object_error::success;
}
template<support::endianness target_endianness, bool is64Bits>
-StringRef ELFObjectFile<target_endianness, is64Bits>
- ::getSectionName(DataRefImpl Sec) const {
+error_code ELFObjectFile<target_endianness, is64Bits>
+ ::getSectionName(DataRefImpl Sec,
+ StringRef &Result) const {
const Elf_Shdr *sec = reinterpret_cast<const Elf_Shdr *>(Sec.p);
- return StringRef(getString(dot_shstrtab_sec, sec->sh_name));
+ Result = StringRef(getString(dot_shstrtab_sec, sec->sh_name));
+ return object_error::success;
}
template<support::endianness target_endianness, bool is64Bits>
-uint64_t ELFObjectFile<target_endianness, is64Bits>
- ::getSectionAddress(DataRefImpl Sec) const {
+error_code ELFObjectFile<target_endianness, is64Bits>
+ ::getSectionAddress(DataRefImpl Sec,
+ uint64_t &Result) const {
const Elf_Shdr *sec = reinterpret_cast<const Elf_Shdr *>(Sec.p);
- return sec->sh_addr;
+ Result = sec->sh_addr;
+ return object_error::success;
}
template<support::endianness target_endianness, bool is64Bits>
-uint64_t ELFObjectFile<target_endianness, is64Bits>
- ::getSectionSize(DataRefImpl Sec) const {
+error_code ELFObjectFile<target_endianness, is64Bits>
+ ::getSectionSize(DataRefImpl Sec,
+ uint64_t &Result) const {
const Elf_Shdr *sec = reinterpret_cast<const Elf_Shdr *>(Sec.p);
- return sec->sh_size;
+ Result = sec->sh_size;
+ return object_error::success;
}
template<support::endianness target_endianness, bool is64Bits>
-StringRef ELFObjectFile<target_endianness, is64Bits>
- ::getSectionContents(DataRefImpl Sec) const {
+error_code ELFObjectFile<target_endianness, is64Bits>
+ ::getSectionContents(DataRefImpl Sec,
+ StringRef &Result) const {
const Elf_Shdr *sec = reinterpret_cast<const Elf_Shdr *>(Sec.p);
- const char *start = (char*)base + sec->sh_offset;
- return StringRef(start, sec->sh_size);
+ const char *start = (const char*)base() + sec->sh_offset;
+ Result = StringRef(start, sec->sh_size);
+ return object_error::success;
}
template<support::endianness target_endianness, bool is64Bits>
-bool ELFObjectFile<target_endianness, is64Bits>
- ::isSectionText(DataRefImpl Sec) const {
+error_code ELFObjectFile<target_endianness, is64Bits>
+ ::isSectionText(DataRefImpl Sec,
+ bool &Result) const {
const Elf_Shdr *sec = reinterpret_cast<const Elf_Shdr *>(Sec.p);
if (sec->sh_flags & ELF::SHF_EXECINSTR)
- return true;
- return false;
+ Result = true;
+ else
+ Result = false;
+ return object_error::success;
+}
+
+template<support::endianness target_endianness, bool is64Bits>
+error_code ELFObjectFile<target_endianness, is64Bits>
+ ::sectionContainsSymbol(DataRefImpl Sec,
+ DataRefImpl Symb,
+ bool &Result) const {
+ // FIXME: Unimplemented.
+ Result = false;
+ return object_error::success;
}
template<support::endianness target_endianness, bool is64Bits>
-ELFObjectFile<target_endianness, is64Bits>::ELFObjectFile(MemoryBuffer *Object)
- : ObjectFile(Object)
+ELFObjectFile<target_endianness, is64Bits>::ELFObjectFile(MemoryBuffer *Object
+ , error_code &ec)
+ : ObjectFile(Binary::isELF, Object, ec)
, SectionHeaderTable(0)
, dot_shstrtab_sec(0)
, dot_strtab_sec(0) {
- Header = reinterpret_cast<const Elf_Ehdr *>(base);
+ Header = reinterpret_cast<const Elf_Ehdr *>(base());
if (Header->e_shoff == 0)
return;
SectionHeaderTable =
- reinterpret_cast<const Elf_Shdr *>(base + Header->e_shoff);
+ reinterpret_cast<const Elf_Shdr *>(base() + Header->e_shoff);
uint32_t SectionTableSize = Header->e_shnum * Header->e_shentsize;
if (!( (const uint8_t *)SectionHeaderTable + SectionTableSize
- <= base + MapFile->getBufferSize()))
+ <= base() + Data->getBufferSize()))
// FIXME: Proper error handling.
report_fatal_error("Section table goes past end of file!");
@@ -491,7 +542,7 @@ ELFObjectFile<target_endianness, is64Bits>::ELFObjectFile(MemoryBuffer *Object)
dot_shstrtab_sec = getSection(Header->e_shstrndx);
if (dot_shstrtab_sec) {
// Verify that the last byte in the string table in a null.
- if (((const char*)base + dot_shstrtab_sec->sh_offset)
+ if (((const char*)base() + dot_shstrtab_sec->sh_offset)
[dot_shstrtab_sec->sh_size - 1] != 0)
// FIXME: Proper error handling.
report_fatal_error("String table must end with a null terminator!");
@@ -509,7 +560,7 @@ ELFObjectFile<target_endianness, is64Bits>::ELFObjectFile(MemoryBuffer *Object)
// FIXME: Proper error handling.
report_fatal_error("Already found section named .strtab!");
dot_strtab_sec = sh;
- const char *dot_strtab = (const char*)base + sh->sh_offset;
+ const char *dot_strtab = (const char*)base() + sh->sh_offset;
if (dot_strtab[sh->sh_size - 1] != 0)
// FIXME: Proper error handling.
report_fatal_error("String table must end with a null terminator!");
@@ -548,7 +599,7 @@ ObjectFile::section_iterator ELFObjectFile<target_endianness, is64Bits>
::begin_sections() const {
DataRefImpl ret;
memset(&ret, 0, sizeof(DataRefImpl));
- ret.p = reinterpret_cast<intptr_t>(base + Header->e_shoff);
+ ret.p = reinterpret_cast<intptr_t>(base() + Header->e_shoff);
return section_iterator(SectionRef(ret, this));
}
@@ -557,7 +608,7 @@ ObjectFile::section_iterator ELFObjectFile<target_endianness, is64Bits>
::end_sections() const {
DataRefImpl ret;
memset(&ret, 0, sizeof(DataRefImpl));
- ret.p = reinterpret_cast<intptr_t>(base
+ ret.p = reinterpret_cast<intptr_t>(base()
+ Header->e_shoff
+ (Header->e_shentsize * Header->e_shnum));
return section_iterator(SectionRef(ret, this));
@@ -613,7 +664,7 @@ const typename ELFObjectFile<target_endianness, is64Bits>::Elf_Sym *
ELFObjectFile<target_endianness, is64Bits>::getSymbol(DataRefImpl Symb) const {
const Elf_Shdr *sec = SymbolTableSections[Symb.d.b];
return reinterpret_cast<const Elf_Sym *>(
- base
+ base()
+ sec->sh_offset
+ (Symb.d.a * sec->sh_entsize));
}
@@ -656,8 +707,8 @@ const char *ELFObjectFile<target_endianness, is64Bits>
assert(section && section->sh_type == ELF::SHT_STRTAB && "Invalid section!");
if (offset >= section->sh_size)
// FIXME: Proper error handling.
- report_fatal_error("Sybol name offset outside of string table!");
- return (const char *)base + section->sh_offset + offset;
+ report_fatal_error("Symbol name offset outside of string table!");
+ return (const char *)base() + section->sh_offset + offset;
}
// EI_CLASS, EI_DATA.
@@ -673,14 +724,15 @@ namespace llvm {
ObjectFile *ObjectFile::createELFObjectFile(MemoryBuffer *Object) {
std::pair<unsigned char, unsigned char> Ident = getElfArchType(Object);
+ error_code ec;
if (Ident.first == ELF::ELFCLASS32 && Ident.second == ELF::ELFDATA2LSB)
- return new ELFObjectFile<support::little, false>(Object);
+ return new ELFObjectFile<support::little, false>(Object, ec);
else if (Ident.first == ELF::ELFCLASS32 && Ident.second == ELF::ELFDATA2MSB)
- return new ELFObjectFile<support::big, false>(Object);
+ return new ELFObjectFile<support::big, false>(Object, ec);
else if (Ident.first == ELF::ELFCLASS64 && Ident.second == ELF::ELFDATA2LSB)
- return new ELFObjectFile<support::little, true>(Object);
+ return new ELFObjectFile<support::little, true>(Object, ec);
else if (Ident.first == ELF::ELFCLASS64 && Ident.second == ELF::ELFDATA2MSB)
- return new ELFObjectFile<support::big, true>(Object);
+ return new ELFObjectFile<support::big, true>(Object, ec);
// FIXME: Proper error handling.
report_fatal_error("Not an ELF object file!");
}
diff --git a/contrib/llvm/lib/Object/Error.cpp b/contrib/llvm/lib/Object/Error.cpp
new file mode 100644
index 0000000..2594625
--- /dev/null
+++ b/contrib/llvm/lib/Object/Error.cpp
@@ -0,0 +1,57 @@
+//===- Error.cpp - system_error extensions for Object -----------*- C++ -*-===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+//
+// This defines a new error_category for the Object library.
+//
+//===----------------------------------------------------------------------===//
+
+#include "llvm/Object/Error.h"
+#include "llvm/Support/ErrorHandling.h"
+
+using namespace llvm;
+using namespace object;
+
+namespace {
+class _object_error_category : public _do_message {
+public:
+ virtual const char* name() const;
+ virtual std::string message(int ev) const;
+ virtual error_condition default_error_condition(int ev) const;
+};
+}
+
+const char *_object_error_category::name() const {
+ return "llvm.object";
+}
+
+std::string _object_error_category::message(int ev) const {
+ switch (ev) {
+ case object_error::success: return "Success";
+ case object_error::invalid_file_type:
+ return "The file was not recognized as a valid object file";
+ case object_error::parse_failed:
+ return "Invalid data was encountered while parsing the file";
+ case object_error::unexpected_eof:
+ return "The end of the file was unexpectedly encountered";
+ default:
+ llvm_unreachable("An enumerator of object_error does not have a message "
+ "defined.");
+ }
+}
+
+error_condition _object_error_category::default_error_condition(int ev) const {
+ if (ev == object_error::success)
+ return errc::success;
+ return errc::invalid_argument;
+}
+
+const error_category &object::object_category() {
+ static _object_error_category o;
+ return o;
+}
diff --git a/contrib/llvm/lib/Object/MachOObjectFile.cpp b/contrib/llvm/lib/Object/MachOObjectFile.cpp
index 877cbfb..26a6e13 100644
--- a/contrib/llvm/lib/Object/MachOObjectFile.cpp
+++ b/contrib/llvm/lib/Object/MachOObjectFile.cpp
@@ -32,8 +32,8 @@ typedef MachOObject::LoadCommandInfo LoadCommandInfo;
class MachOObjectFile : public ObjectFile {
public:
- MachOObjectFile(MemoryBuffer *Object, MachOObject *MOO)
- : ObjectFile(Object),
+ MachOObjectFile(MemoryBuffer *Object, MachOObject *MOO, error_code &ec)
+ : ObjectFile(Binary::isMachO, Object, ec),
MachOObj(MOO),
RegisteredStringTable(std::numeric_limits<uint32_t>::max()) {}
@@ -47,19 +47,21 @@ public:
virtual unsigned getArch() const;
protected:
- virtual SymbolRef getSymbolNext(DataRefImpl Symb) const;
- virtual StringRef getSymbolName(DataRefImpl Symb) const;
- virtual uint64_t getSymbolAddress(DataRefImpl Symb) const;
- virtual uint64_t getSymbolSize(DataRefImpl Symb) const;
- virtual char getSymbolNMTypeChar(DataRefImpl Symb) const;
- virtual bool isSymbolInternal(DataRefImpl Symb) const;
-
- virtual SectionRef getSectionNext(DataRefImpl Sec) const;
- virtual StringRef getSectionName(DataRefImpl Sec) const;
- virtual uint64_t getSectionAddress(DataRefImpl Sec) const;
- virtual uint64_t getSectionSize(DataRefImpl Sec) const;
- virtual StringRef getSectionContents(DataRefImpl Sec) const;
- virtual bool isSectionText(DataRefImpl Sec) const;
+ virtual error_code getSymbolNext(DataRefImpl Symb, SymbolRef &Res) const;
+ virtual error_code getSymbolName(DataRefImpl Symb, StringRef &Res) const;
+ virtual error_code getSymbolAddress(DataRefImpl Symb, uint64_t &Res) const;
+ virtual error_code getSymbolSize(DataRefImpl Symb, uint64_t &Res) const;
+ virtual error_code getSymbolNMTypeChar(DataRefImpl Symb, char &Res) const;
+ virtual error_code isSymbolInternal(DataRefImpl Symb, bool &Res) const;
+
+ virtual error_code getSectionNext(DataRefImpl Sec, SectionRef &Res) const;
+ virtual error_code getSectionName(DataRefImpl Sec, StringRef &Res) const;
+ virtual error_code getSectionAddress(DataRefImpl Sec, uint64_t &Res) const;
+ virtual error_code getSectionSize(DataRefImpl Sec, uint64_t &Res) const;
+ virtual error_code getSectionContents(DataRefImpl Sec, StringRef &Res) const;
+ virtual error_code isSectionText(DataRefImpl Sec, bool &Res) const;
+ virtual error_code sectionContainsSymbol(DataRefImpl DRI, DataRefImpl S,
+ bool &Result) const;
private:
MachOObject *MachOObj;
@@ -68,16 +70,21 @@ private:
void moveToNextSection(DataRefImpl &DRI) const;
void getSymbolTableEntry(DataRefImpl DRI,
InMemoryStruct<macho::SymbolTableEntry> &Res) const;
+ void getSymbol64TableEntry(DataRefImpl DRI,
+ InMemoryStruct<macho::Symbol64TableEntry> &Res) const;
void moveToNextSymbol(DataRefImpl &DRI) const;
void getSection(DataRefImpl DRI, InMemoryStruct<macho::Section> &Res) const;
+ void getSection64(DataRefImpl DRI,
+ InMemoryStruct<macho::Section64> &Res) const;
};
ObjectFile *ObjectFile::createMachOObjectFile(MemoryBuffer *Buffer) {
+ error_code ec;
std::string Err;
MachOObject *MachOObj = MachOObject::LoadFromBuffer(Buffer, &Err);
if (!MachOObj)
return NULL;
- return new MachOObjectFile(Buffer, MachOObj);
+ return new MachOObjectFile(Buffer, MachOObj, ec);
}
/*===-- Symbols -----------------------------------------------------------===*/
@@ -113,35 +120,81 @@ void MachOObjectFile::getSymbolTableEntry(DataRefImpl DRI,
Res);
}
+void MachOObjectFile::getSymbol64TableEntry(DataRefImpl DRI,
+ InMemoryStruct<macho::Symbol64TableEntry> &Res) const {
+ InMemoryStruct<macho::SymtabLoadCommand> SymtabLoadCmd;
+ LoadCommandInfo LCI = MachOObj->getLoadCommandInfo(DRI.d.a);
+ MachOObj->ReadSymtabLoadCommand(LCI, SymtabLoadCmd);
+
+ if (RegisteredStringTable != DRI.d.a) {
+ MachOObj->RegisterStringTable(*SymtabLoadCmd);
+ RegisteredStringTable = DRI.d.a;
+ }
+
+ MachOObj->ReadSymbol64TableEntry(SymtabLoadCmd->SymbolTableOffset, DRI.d.b,
+ Res);
+}
-SymbolRef MachOObjectFile::getSymbolNext(DataRefImpl DRI) const {
+
+error_code MachOObjectFile::getSymbolNext(DataRefImpl DRI,
+ SymbolRef &Result) const {
DRI.d.b++;
moveToNextSymbol(DRI);
- return SymbolRef(DRI, this);
+ Result = SymbolRef(DRI, this);
+ return object_error::success;
}
-StringRef MachOObjectFile::getSymbolName(DataRefImpl DRI) const {
- InMemoryStruct<macho::SymbolTableEntry> Entry;
- getSymbolTableEntry(DRI, Entry);
- return MachOObj->getStringAtIndex(Entry->StringIndex);
+error_code MachOObjectFile::getSymbolName(DataRefImpl DRI,
+ StringRef &Result) const {
+ if (MachOObj->is64Bit()) {
+ InMemoryStruct<macho::Symbol64TableEntry> Entry;
+ getSymbol64TableEntry(DRI, Entry);
+ Result = MachOObj->getStringAtIndex(Entry->StringIndex);
+ } else {
+ InMemoryStruct<macho::SymbolTableEntry> Entry;
+ getSymbolTableEntry(DRI, Entry);
+ Result = MachOObj->getStringAtIndex(Entry->StringIndex);
+ }
+ return object_error::success;
}
-uint64_t MachOObjectFile::getSymbolAddress(DataRefImpl DRI) const {
- InMemoryStruct<macho::SymbolTableEntry> Entry;
- getSymbolTableEntry(DRI, Entry);
- return Entry->Value;
+error_code MachOObjectFile::getSymbolAddress(DataRefImpl DRI,
+ uint64_t &Result) const {
+ if (MachOObj->is64Bit()) {
+ InMemoryStruct<macho::Symbol64TableEntry> Entry;
+ getSymbol64TableEntry(DRI, Entry);
+ Result = Entry->Value;
+ } else {
+ InMemoryStruct<macho::SymbolTableEntry> Entry;
+ getSymbolTableEntry(DRI, Entry);
+ Result = Entry->Value;
+ }
+ return object_error::success;
}
-uint64_t MachOObjectFile::getSymbolSize(DataRefImpl DRI) const {
- return UnknownAddressOrSize;
+error_code MachOObjectFile::getSymbolSize(DataRefImpl DRI,
+ uint64_t &Result) const {
+ Result = UnknownAddressOrSize;
+ return object_error::success;
}
-char MachOObjectFile::getSymbolNMTypeChar(DataRefImpl DRI) const {
- InMemoryStruct<macho::SymbolTableEntry> Entry;
- getSymbolTableEntry(DRI, Entry);
+error_code MachOObjectFile::getSymbolNMTypeChar(DataRefImpl DRI,
+ char &Result) const {
+ uint8_t Type, Flags;
+ if (MachOObj->is64Bit()) {
+ InMemoryStruct<macho::Symbol64TableEntry> Entry;
+ getSymbol64TableEntry(DRI, Entry);
+ Type = Entry->Type;
+ Flags = Entry->Flags;
+ } else {
+ InMemoryStruct<macho::SymbolTableEntry> Entry;
+ getSymbolTableEntry(DRI, Entry);
+ Type = Entry->Type;
+ Flags = Entry->Flags;
+ }
char Char;
- switch (Entry->Type & macho::STF_TypeMask) {
+ switch (Type & macho::STF_TypeMask) {
case macho::STT_Undefined:
Char = 'u';
break;
@@ -154,15 +207,24 @@ char MachOObjectFile::getSymbolNMTypeChar(DataRefImpl DRI) const {
break;
}
- if (Entry->Flags & (macho::STF_External | macho::STF_PrivateExtern))
+ if (Flags & (macho::STF_External | macho::STF_PrivateExtern))
Char = toupper(Char);
- return Char;
+ Result = Char;
+ return object_error::success;
}
-bool MachOObjectFile::isSymbolInternal(DataRefImpl DRI) const {
- InMemoryStruct<macho::SymbolTableEntry> Entry;
- getSymbolTableEntry(DRI, Entry);
- return Entry->Flags & macho::STF_StabsEntryMask;
+error_code MachOObjectFile::isSymbolInternal(DataRefImpl DRI,
+ bool &Result) const {
+ if (MachOObj->is64Bit()) {
+ InMemoryStruct<macho::Symbol64TableEntry> Entry;
+ getSymbol64TableEntry(DRI, Entry);
+ Result = Entry->Flags & macho::STF_StabsEntryMask;
+ } else {
+ InMemoryStruct<macho::SymbolTableEntry> Entry;
+ getSymbolTableEntry(DRI, Entry);
+ Result = Entry->Flags & macho::STF_StabsEntryMask;
+ }
+ return object_error::success;
}
ObjectFile::symbol_iterator MachOObjectFile::begin_symbols() const {
@@ -204,10 +266,12 @@ void MachOObjectFile::moveToNextSection(DataRefImpl &DRI) const {
}
}
-SectionRef MachOObjectFile::getSectionNext(DataRefImpl DRI) const {
+error_code MachOObjectFile::getSectionNext(DataRefImpl DRI,
+ SectionRef &Result) const {
DRI.d.b++;
moveToNextSection(DRI);
- return SectionRef(DRI, this);
+ Result = SectionRef(DRI, this);
+ return object_error::success;
}
void
@@ -219,43 +283,121 @@ MachOObjectFile::getSection(DataRefImpl DRI,
MachOObj->ReadSection(LCI, DRI.d.b, Res);
}
-StringRef MachOObjectFile::getSectionName(DataRefImpl DRI) const {
- InMemoryStruct<macho::SegmentLoadCommand> SLC;
+void
+MachOObjectFile::getSection64(DataRefImpl DRI,
+ InMemoryStruct<macho::Section64> &Res) const {
+ InMemoryStruct<macho::Segment64LoadCommand> SLC;
LoadCommandInfo LCI = MachOObj->getLoadCommandInfo(DRI.d.a);
- MachOObj->ReadSegmentLoadCommand(LCI, SLC);
- InMemoryStruct<macho::Section> Sect;
- MachOObj->ReadSection(LCI, DRI.d.b, Sect);
-
- static char Result[34];
- strcpy(Result, SLC->Name);
- strcat(Result, ",");
- strcat(Result, Sect->Name);
- return StringRef(Result);
+ MachOObj->ReadSegment64LoadCommand(LCI, SLC);
+ MachOObj->ReadSection64(LCI, DRI.d.b, Res);
}
-uint64_t MachOObjectFile::getSectionAddress(DataRefImpl DRI) const {
- InMemoryStruct<macho::Section> Sect;
- getSection(DRI, Sect);
- return Sect->Address;
+static bool is64BitLoadCommand(const MachOObject *MachOObj, DataRefImpl DRI) {
+ LoadCommandInfo LCI = MachOObj->getLoadCommandInfo(DRI.d.a);
+ if (LCI.Command.Type == macho::LCT_Segment64)
+ return true;
+ assert(LCI.Command.Type == macho::LCT_Segment && "Unexpected Type.");
+ return false;
}
-uint64_t MachOObjectFile::getSectionSize(DataRefImpl DRI) const {
- InMemoryStruct<macho::Section> Sect;
- getSection(DRI, Sect);
- return Sect->Size;
+error_code MachOObjectFile::getSectionName(DataRefImpl DRI,
+ StringRef &Result) const {
+ // FIXME: thread safety.
+ static char result[34];
+ if (is64BitLoadCommand(MachOObj, DRI)) {
+ InMemoryStruct<macho::Segment64LoadCommand> SLC;
+ LoadCommandInfo LCI = MachOObj->getLoadCommandInfo(DRI.d.a);
+ MachOObj->ReadSegment64LoadCommand(LCI, SLC);
+ InMemoryStruct<macho::Section64> Sect;
+ MachOObj->ReadSection64(LCI, DRI.d.b, Sect);
+
+ strcpy(result, Sect->SegmentName);
+ strcat(result, ",");
+ strcat(result, Sect->Name);
+ } else {
+ InMemoryStruct<macho::SegmentLoadCommand> SLC;
+ LoadCommandInfo LCI = MachOObj->getLoadCommandInfo(DRI.d.a);
+ MachOObj->ReadSegmentLoadCommand(LCI, SLC);
+ InMemoryStruct<macho::Section> Sect;
+ MachOObj->ReadSection(LCI, DRI.d.b, Sect);
+
+ strcpy(result, Sect->SegmentName);
+ strcat(result, ",");
+ strcat(result, Sect->Name);
+ }
+ Result = StringRef(result);
+ return object_error::success;
}
-StringRef MachOObjectFile::getSectionContents(DataRefImpl DRI) const {
- InMemoryStruct<macho::Section> Sect;
- getSection(DRI, Sect);
- return MachOObj->getData(Sect->Offset, Sect->Size);
+error_code MachOObjectFile::getSectionAddress(DataRefImpl DRI,
+ uint64_t &Result) const {
+ if (is64BitLoadCommand(MachOObj, DRI)) {
+ InMemoryStruct<macho::Section64> Sect;
+ getSection64(DRI, Sect);
+ Result = Sect->Address;
+ } else {
+ InMemoryStruct<macho::Section> Sect;
+ getSection(DRI, Sect);
+ Result = Sect->Address;
+ }
+ return object_error::success;
}
-bool MachOObjectFile::isSectionText(DataRefImpl DRI) const {
- InMemoryStruct<macho::SegmentLoadCommand> SLC;
- LoadCommandInfo LCI = MachOObj->getLoadCommandInfo(DRI.d.a);
- MachOObj->ReadSegmentLoadCommand(LCI, SLC);
- return !strcmp(SLC->Name, "__TEXT");
+error_code MachOObjectFile::getSectionSize(DataRefImpl DRI,
+ uint64_t &Result) const {
+ if (is64BitLoadCommand(MachOObj, DRI)) {
+ InMemoryStruct<macho::Section64> Sect;
+ getSection64(DRI, Sect);
+ Result = Sect->Size;
+ } else {
+ InMemoryStruct<macho::Section> Sect;
+ getSection(DRI, Sect);
+ Result = Sect->Size;
+ }
+ return object_error::success;
+}
+
+error_code MachOObjectFile::getSectionContents(DataRefImpl DRI,
+ StringRef &Result) const {
+ if (is64BitLoadCommand(MachOObj, DRI)) {
+ InMemoryStruct<macho::Section64> Sect;
+ getSection64(DRI, Sect);
+ Result = MachOObj->getData(Sect->Offset, Sect->Size);
+ } else {
+ InMemoryStruct<macho::Section> Sect;
+ getSection(DRI, Sect);
+ Result = MachOObj->getData(Sect->Offset, Sect->Size);
+ }
+ return object_error::success;
+}
+
+error_code MachOObjectFile::isSectionText(DataRefImpl DRI,
+ bool &Result) const {
+ if (is64BitLoadCommand(MachOObj, DRI)) {
+ InMemoryStruct<macho::Section64> Sect;
+ getSection64(DRI, Sect);
+ Result = !strcmp(Sect->Name, "__text");
+ } else {
+ InMemoryStruct<macho::Section> Sect;
+ getSection(DRI, Sect);
+ Result = !strcmp(Sect->Name, "__text");
+ }
+ return object_error::success;
+}
+
+error_code MachOObjectFile::sectionContainsSymbol(DataRefImpl Sec,
+ DataRefImpl Symb,
+ bool &Result) const {
+ if (MachOObj->is64Bit()) {
+ InMemoryStruct<macho::Symbol64TableEntry> Entry;
+ getSymbol64TableEntry(Symb, Entry);
+ Result = Entry->SectionIndex == 1 + Sec.d.a + Sec.d.b;
+ } else {
+ InMemoryStruct<macho::SymbolTableEntry> Entry;
+ getSymbolTableEntry(Symb, Entry);
+ Result = Entry->SectionIndex == 1 + Sec.d.a + Sec.d.b;
+ }
+ return object_error::success;
}
ObjectFile::section_iterator MachOObjectFile::begin_sections() const {
diff --git a/contrib/llvm/lib/Object/Object.cpp b/contrib/llvm/lib/Object/Object.cpp
index 603b23c..9a373ad 100644
--- a/contrib/llvm/lib/Object/Object.cpp
+++ b/contrib/llvm/lib/Object/Object.cpp
@@ -41,19 +41,28 @@ LLVMBool LLVMIsSectionIteratorAtEnd(LLVMObjectFileRef ObjectFile,
}
void LLVMMoveToNextSection(LLVMSectionIteratorRef SI) {
- // We can't use unwrap() here because the argument to ++ must be an lvalue.
- ++*reinterpret_cast<ObjectFile::section_iterator*>(SI);
+ error_code ec;
+ unwrap(SI)->increment(ec);
+ if (ec) report_fatal_error("LLVMMoveToNextSection failed: " + ec.message());
}
const char *LLVMGetSectionName(LLVMSectionIteratorRef SI) {
- return (*unwrap(SI))->getName().data();
+ StringRef ret;
+ if (error_code ec = (*unwrap(SI))->getName(ret))
+ report_fatal_error(ec.message());
+ return ret.data();
}
uint64_t LLVMGetSectionSize(LLVMSectionIteratorRef SI) {
- return (*unwrap(SI))->getSize();
+ uint64_t ret;
+ if (error_code ec = (*unwrap(SI))->getSize(ret))
+ report_fatal_error(ec.message());
+ return ret;
}
const char *LLVMGetSectionContents(LLVMSectionIteratorRef SI) {
- return (*unwrap(SI))->getContents().data();
+ StringRef ret;
+ if (error_code ec = (*unwrap(SI))->getContents(ret))
+ report_fatal_error(ec.message());
+ return ret.data();
}
-
diff --git a/contrib/llvm/lib/Object/ObjectFile.cpp b/contrib/llvm/lib/Object/ObjectFile.cpp
index 47b6311..a7798df 100644
--- a/contrib/llvm/lib/Object/ObjectFile.cpp
+++ b/contrib/llvm/lib/Object/ObjectFile.cpp
@@ -21,18 +21,8 @@
using namespace llvm;
using namespace object;
-ObjectFile::ObjectFile(MemoryBuffer *Object)
- : MapFile(Object) {
- assert(MapFile && "Must be a valid MemoryBuffer!");
- base = reinterpret_cast<const uint8_t *>(MapFile->getBufferStart());
-}
-
-ObjectFile::~ObjectFile() {
- delete MapFile;
-}
-
-StringRef ObjectFile::getFilename() const {
- return MapFile->getBufferIdentifier();
+ObjectFile::ObjectFile(unsigned int Type, MemoryBuffer *source, error_code &ec)
+ : Binary(Type, source) {
}
ObjectFile *ObjectFile::createObjectFile(MemoryBuffer *Object) {
diff --git a/contrib/llvm/lib/Support/APFloat.cpp b/contrib/llvm/lib/Support/APFloat.cpp
index c3169ac..c64da6e 100644
--- a/contrib/llvm/lib/Support/APFloat.cpp
+++ b/contrib/llvm/lib/Support/APFloat.cpp
@@ -13,6 +13,7 @@
//===----------------------------------------------------------------------===//
#include "llvm/ADT/APFloat.h"
+#include "llvm/ADT/APSInt.h"
#include "llvm/ADT/StringRef.h"
#include "llvm/ADT/FoldingSet.h"
#include "llvm/Support/ErrorHandling.h"
@@ -2084,6 +2085,23 @@ APFloat::convertToInteger(integerPart *parts, unsigned int width,
return fs;
}
+/* Same as convertToInteger(integerPart*, ...), except the result is returned in
+ an APSInt, whose initial bit-width and signed-ness are used to determine the
+ precision of the conversion.
+ */
+APFloat::opStatus
+APFloat::convertToInteger(APSInt &result,
+ roundingMode rounding_mode, bool *isExact) const
+{
+ unsigned bitWidth = result.getBitWidth();
+ SmallVector<uint64_t, 4> parts(result.getNumWords());
+ opStatus status = convertToInteger(
+ parts.data(), bitWidth, result.isSigned(), rounding_mode, isExact);
+ // Keeps the original signed-ness.
+ result = APInt(bitWidth, (unsigned)parts.size(), parts.data());
+ return status;
+}
+
/* Convert an unsigned integer SRC to a floating point number,
rounding according to ROUNDING_MODE. The sign of the floating
point number is not modified. */
diff --git a/contrib/llvm/lib/Support/APInt.cpp b/contrib/llvm/lib/Support/APInt.cpp
index 74d61c1..76265d4 100644
--- a/contrib/llvm/lib/Support/APInt.cpp
+++ b/contrib/llvm/lib/Support/APInt.cpp
@@ -2164,12 +2164,33 @@ void APInt::fromString(unsigned numbits, StringRef str, uint8_t radix) {
}
void APInt::toString(SmallVectorImpl<char> &Str, unsigned Radix,
- bool Signed) const {
+ bool Signed, bool formatAsCLiteral) const {
assert((Radix == 10 || Radix == 8 || Radix == 16 || Radix == 2) &&
"Radix should be 2, 8, 10, or 16!");
+ const char *Prefix = "";
+ if (formatAsCLiteral) {
+ switch (Radix) {
+ case 2:
+ // Binary literals are a non-standard extension added in gcc 4.3:
+ // http://gcc.gnu.org/onlinedocs/gcc-4.3.0/gcc/Binary-constants.html
+ Prefix = "0b";
+ break;
+ case 8:
+ Prefix = "0";
+ break;
+ case 16:
+ Prefix = "0x";
+ break;
+ }
+ }
+
// First, check for a zero value and just short circuit the logic below.
if (*this == 0) {
+ while (*Prefix) {
+ Str.push_back(*Prefix);
+ ++Prefix;
+ };
Str.push_back('0');
return;
}
@@ -2193,6 +2214,11 @@ void APInt::toString(SmallVectorImpl<char> &Str, unsigned Radix,
}
}
+ while (*Prefix) {
+ Str.push_back(*Prefix);
+ ++Prefix;
+ };
+
while (N) {
*--BufPtr = Digits[N % Radix];
N /= Radix;
@@ -2212,6 +2238,11 @@ void APInt::toString(SmallVectorImpl<char> &Str, unsigned Radix,
Str.push_back('-');
}
+ while (*Prefix) {
+ Str.push_back(*Prefix);
+ ++Prefix;
+ };
+
// We insert the digits backward, then reverse them to get the right order.
unsigned StartDig = Str.size();
@@ -2251,7 +2282,7 @@ void APInt::toString(SmallVectorImpl<char> &Str, unsigned Radix,
/// to the methods above.
std::string APInt::toString(unsigned Radix = 10, bool Signed = true) const {
SmallString<40> S;
- toString(S, Radix, Signed);
+ toString(S, Radix, Signed, /* formatAsCLiteral = */false);
return S.str();
}
@@ -2266,7 +2297,7 @@ void APInt::dump() const {
void APInt::print(raw_ostream &OS, bool isSigned) const {
SmallString<40> S;
- this->toString(S, 10, isSigned);
+ this->toString(S, 10, isSigned, /* formatAsCLiteral = */false);
OS << S.str();
}
diff --git a/contrib/llvm/lib/Support/Atomic.cpp b/contrib/llvm/lib/Support/Atomic.cpp
index cf0a562..8214521 100644
--- a/contrib/llvm/lib/Support/Atomic.cpp
+++ b/contrib/llvm/lib/Support/Atomic.cpp
@@ -22,7 +22,7 @@ using namespace llvm;
#endif
void sys::MemoryFence() {
-#if !defined(LLVM_MULTITHREADED)
+#if !defined(LLVM_MULTITHREADED) || LLVM_MULTITHREADED == 0
return;
#else
# if defined(__GNUC__)
@@ -38,7 +38,7 @@ void sys::MemoryFence() {
sys::cas_flag sys::CompareAndSwap(volatile sys::cas_flag* ptr,
sys::cas_flag new_value,
sys::cas_flag old_value) {
-#if !defined(LLVM_MULTITHREADED)
+#if !defined(LLVM_MULTITHREADED) || LLVM_MULTITHREADED == 0
sys::cas_flag result = *ptr;
if (result == old_value)
*ptr = new_value;
@@ -53,7 +53,7 @@ sys::cas_flag sys::CompareAndSwap(volatile sys::cas_flag* ptr,
}
sys::cas_flag sys::AtomicIncrement(volatile sys::cas_flag* ptr) {
-#if !defined(LLVM_MULTITHREADED)
+#if !defined(LLVM_MULTITHREADED) || LLVM_MULTITHREADED == 0
++(*ptr);
return *ptr;
#elif defined(__GNUC__)
@@ -66,7 +66,7 @@ sys::cas_flag sys::AtomicIncrement(volatile sys::cas_flag* ptr) {
}
sys::cas_flag sys::AtomicDecrement(volatile sys::cas_flag* ptr) {
-#if !defined(LLVM_MULTITHREADED)
+#if !defined(LLVM_MULTITHREADED) || LLVM_MULTITHREADED == 0
--(*ptr);
return *ptr;
#elif defined(__GNUC__)
@@ -79,7 +79,7 @@ sys::cas_flag sys::AtomicDecrement(volatile sys::cas_flag* ptr) {
}
sys::cas_flag sys::AtomicAdd(volatile sys::cas_flag* ptr, sys::cas_flag val) {
-#if !defined(LLVM_MULTITHREADED)
+#if !defined(LLVM_MULTITHREADED) || LLVM_MULTITHREADED == 0
*ptr += val;
return *ptr;
#elif defined(__GNUC__)
diff --git a/contrib/llvm/lib/Support/CommandLine.cpp b/contrib/llvm/lib/Support/CommandLine.cpp
index 7f1c0d3..92c60a9 100644
--- a/contrib/llvm/lib/Support/CommandLine.cpp
+++ b/contrib/llvm/lib/Support/CommandLine.cpp
@@ -911,8 +911,8 @@ size_t alias::getOptionWidth() const {
// Print out the option for the alias.
void alias::printOptionInfo(size_t GlobalWidth) const {
size_t L = std::strlen(ArgStr);
- errs() << " -" << ArgStr;
- errs().indent(GlobalWidth-L-6) << " - " << HelpStr << "\n";
+ outs() << " -" << ArgStr;
+ outs().indent(GlobalWidth-L-6) << " - " << HelpStr << "\n";
}
//===----------------------------------------------------------------------===//
@@ -1357,7 +1357,7 @@ public:
std::string CPU = sys::getHostCPUName();
if (CPU == "generic") CPU = "(unknown)";
OS << ".\n"
-#if (ENABLE_TIMESTAMPS == 1)
+#if defined(ENABLE_TIMESTAMPS) && ENABLE_TIMESTAMPS == 1
<< " Built " << __DATE__ << " (" << __TIME__ << ").\n"
#endif
<< " Host: " << sys::getHostTriple() << '\n'
diff --git a/contrib/llvm/lib/Support/ConstantRange.cpp b/contrib/llvm/lib/Support/ConstantRange.cpp
index 493f708..81382d0 100644
--- a/contrib/llvm/lib/Support/ConstantRange.cpp
+++ b/contrib/llvm/lib/Support/ConstantRange.cpp
@@ -529,8 +529,8 @@ ConstantRange::sub(const ConstantRange &Other) const {
return ConstantRange(getBitWidth(), /*isFullSet=*/true);
APInt Spread_X = getSetSize(), Spread_Y = Other.getSetSize();
- APInt NewLower = getLower() - Other.getLower();
- APInt NewUpper = getUpper() - Other.getUpper() + 1;
+ APInt NewLower = getLower() - Other.getUpper() + 1;
+ APInt NewUpper = getUpper() - Other.getLower();
if (NewLower == NewUpper)
return ConstantRange(getBitWidth(), /*isFullSet=*/true);
diff --git a/contrib/llvm/lib/Support/Host.cpp b/contrib/llvm/lib/Support/Host.cpp
index 4299aa4..c525a12 100644
--- a/contrib/llvm/lib/Support/Host.cpp
+++ b/contrib/llvm/lib/Support/Host.cpp
@@ -214,7 +214,12 @@ std::string sys::getHostCPUName() {
// As found in a Summer 2010 model iMac.
case 37: // Intel Core i7, laptop version.
return "corei7";
- case 42: // SandyBridge
+
+ // SandyBridge:
+ case 42: // Intel Core i7 processor. All processors are manufactured
+ // using the 32 nm process.
+ case 44: // Intel Core i7 processor and Intel Xeon processor. All
+ // processors are manufactured using the 32 nm process.
case 45:
return "corei7-avx";
diff --git a/contrib/llvm/lib/Support/Threading.cpp b/contrib/llvm/lib/Support/Threading.cpp
index 2957956..b62b1a9 100644
--- a/contrib/llvm/lib/Support/Threading.cpp
+++ b/contrib/llvm/lib/Support/Threading.cpp
@@ -24,7 +24,7 @@ static bool multithreaded_mode = false;
static sys::Mutex* global_lock = 0;
bool llvm::llvm_start_multithreaded() {
-#ifdef LLVM_MULTITHREADED
+#if defined(LLVM_MULTITHREADED) && LLVM_MULTITHREADED == 1
assert(!multithreaded_mode && "Already multithreaded!");
multithreaded_mode = true;
global_lock = new sys::Mutex(true);
@@ -39,7 +39,7 @@ bool llvm::llvm_start_multithreaded() {
}
void llvm::llvm_stop_multithreaded() {
-#ifdef LLVM_MULTITHREADED
+#if defined(LLVM_MULTITHREADED) && LLVM_MULTITHREADED == 1
assert(multithreaded_mode && "Not currently multithreaded!");
// We fence here to insure that all threaded operations are complete BEFORE we
@@ -63,7 +63,7 @@ void llvm::llvm_release_global_lock() {
if (multithreaded_mode) global_lock->release();
}
-#if defined(LLVM_MULTITHREADED) && defined(HAVE_PTHREAD_H)
+#if defined(LLVM_MULTITHREADED) && LLVM_MULTITHREADED == 1 && defined(HAVE_PTHREAD_H)
#include <pthread.h>
struct ThreadInfo {
diff --git a/contrib/llvm/lib/Support/Triple.cpp b/contrib/llvm/lib/Support/Triple.cpp
index dbdb303..7e094ee 100644
--- a/contrib/llvm/lib/Support/Triple.cpp
+++ b/contrib/llvm/lib/Support/Triple.cpp
@@ -113,6 +113,7 @@ const char *Triple::getOSTypeName(OSType Kind) {
case Win32: return "win32";
case Haiku: return "haiku";
case Minix: return "minix";
+ case RTEMS: return "rtems";
}
return "<invalid>";
@@ -281,7 +282,8 @@ Triple::ArchType Triple::ParseArch(StringRef ArchName) {
return cellspu;
else if (ArchName == "msp430")
return msp430;
- else if (ArchName == "mips" || ArchName == "mipsallegrex")
+ else if (ArchName == "mips" || ArchName == "mipseb" ||
+ ArchName == "mipsallegrex")
return mips;
else if (ArchName == "mipsel" || ArchName == "mipsallegrexel" ||
ArchName == "psp")
@@ -350,6 +352,8 @@ Triple::OSType Triple::ParseOS(StringRef OSName) {
return Haiku;
else if (OSName.startswith("minix"))
return Minix;
+ else if (OSName.startswith("rtems"))
+ return RTEMS;
else
return UnknownOS;
}
diff --git a/contrib/llvm/lib/Support/Twine.cpp b/contrib/llvm/lib/Support/Twine.cpp
index 75cea29..d62123c 100644
--- a/contrib/llvm/lib/Support/Twine.cpp
+++ b/contrib/llvm/lib/Support/Twine.cpp
@@ -14,6 +14,11 @@
using namespace llvm;
std::string Twine::str() const {
+ // If we're storing only a std::string, just return it.
+ if (LHSKind == StdStringKind && RHSKind == EmptyKind)
+ return *static_cast<const std::string*>(LHS);
+
+ // Otherwise, flatten and copy the contents first.
SmallString<256> Vec;
return toStringRef(Vec).str();
}
@@ -37,9 +42,9 @@ StringRef Twine::toNullTerminatedStringRef(SmallVectorImpl<char> &Out) const {
// Already null terminated, yay!
return StringRef(static_cast<const char*>(LHS));
case StdStringKind: {
- const std::string *str = static_cast<const std::string*>(LHS);
- return StringRef(str->c_str(), str->size());
- }
+ const std::string *str = static_cast<const std::string*>(LHS);
+ return StringRef(str->c_str(), str->size());
+ }
default:
break;
}
diff --git a/contrib/llvm/lib/Support/Unix/Path.inc b/contrib/llvm/lib/Support/Unix/Path.inc
index 430cf2e..f295b92 100644
--- a/contrib/llvm/lib/Support/Unix/Path.inc
+++ b/contrib/llvm/lib/Support/Unix/Path.inc
@@ -842,6 +842,9 @@ Path::makeUnique(bool reuse_current, std::string* ErrMsg) {
// Save the name
path = FNBuffer;
+
+ // By default mkstemp sets the mode to 0600, so update mode bits now.
+ AddPermissionBits (*this, 0666);
#elif defined(HAVE_MKTEMP)
// If we don't have mkstemp, use the old and obsolete mktemp function.
if (mktemp(FNBuffer) == 0)
diff --git a/contrib/llvm/lib/Support/Windows/DynamicLibrary.inc b/contrib/llvm/lib/Support/Windows/DynamicLibrary.inc
index 4227844..fc5f580 100644
--- a/contrib/llvm/lib/Support/Windows/DynamicLibrary.inc
+++ b/contrib/llvm/lib/Support/Windows/DynamicLibrary.inc
@@ -115,7 +115,7 @@ void* DynamicLibrary::SearchForAddressOfSymbol(const char* symbolName) {
E = OpenedHandles.end(); I != E; ++I) {
FARPROC ptr = GetProcAddress((HMODULE)*I, symbolName);
if (ptr) {
- return (void *) ptr;
+ return (void *)(intptr_t)ptr;
}
}
diff --git a/contrib/llvm/lib/Support/Windows/explicit_symbols.inc b/contrib/llvm/lib/Support/Windows/explicit_symbols.inc
index 84862d6..379645d 100644
--- a/contrib/llvm/lib/Support/Windows/explicit_symbols.inc
+++ b/contrib/llvm/lib/Support/Windows/explicit_symbols.inc
@@ -2,7 +2,7 @@
#ifdef HAVE__ALLOCA
EXPLICIT_SYMBOL(_alloca)
- EXPLICIT_SYMBOL2(alloca, _alloca);
+ EXPLICIT_SYMBOL2(alloca, _alloca)
#endif
#ifdef HAVE___ALLOCA
EXPLICIT_SYMBOL(__alloca)
@@ -62,5 +62,5 @@
/* msvcrt */
#if defined(_MSC_VER)
- EXPLICIT_SYMBOL2(alloca, _alloca_probe);
+ EXPLICIT_SYMBOL2(alloca, _alloca_probe)
#endif
diff --git a/contrib/llvm/lib/Target/ARM/ARM.h b/contrib/llvm/lib/Target/ARM/ARM.h
index 4679f74..08dc340 100644
--- a/contrib/llvm/lib/Target/ARM/ARM.h
+++ b/contrib/llvm/lib/Target/ARM/ARM.h
@@ -16,24 +16,29 @@
#define TARGET_ARM_H
#include "ARMBaseInfo.h"
+#include "MCTargetDesc/ARMMCTargetDesc.h"
+#include "llvm/Support/DataTypes.h"
#include "llvm/Support/ErrorHandling.h"
#include "llvm/Target/TargetMachine.h"
#include <cassert>
namespace llvm {
+class ARMAsmPrinter;
class ARMBaseTargetMachine;
class FunctionPass;
class JITCodeEmitter;
-class formatted_raw_ostream;
-class MCCodeEmitter;
-class TargetAsmBackend;
class MachineInstr;
-class ARMAsmPrinter;
+class MCCodeEmitter;
class MCInst;
+class MCInstrInfo;
+class MCObjectWriter;
+class MCSubtargetInfo;
+class TargetAsmBackend;
+class formatted_raw_ostream;
-MCCodeEmitter *createARMMCCodeEmitter(const Target &,
- TargetMachine &TM,
+MCCodeEmitter *createARMMCCodeEmitter(const MCInstrInfo &MCII,
+ const MCSubtargetInfo &STI,
MCContext &Ctx);
TargetAsmBackend *createARMAsmBackend(const Target &, const std::string &);
@@ -53,11 +58,15 @@ FunctionPass *createMLxExpansionPass();
FunctionPass *createThumb2ITBlockPass();
FunctionPass *createThumb2SizeReductionPass();
-extern Target TheARMTarget, TheThumbTarget;
-
void LowerARMMachineInstrToMCInst(const MachineInstr *MI, MCInst &OutMI,
ARMAsmPrinter &AP);
+/// createARMMachObjectWriter - Construct an ARM Mach-O object writer.
+MCObjectWriter *createARMMachObjectWriter(raw_ostream &OS,
+ bool Is64Bit,
+ uint32_t CPUType,
+ uint32_t CPUSubtype);
+
} // end namespace llvm;
#endif
diff --git a/contrib/llvm/lib/Target/ARM/ARM.td b/contrib/llvm/lib/Target/ARM/ARM.td
index 6af5f85..cf333cc 100644
--- a/contrib/llvm/lib/Target/ARM/ARM.td
+++ b/contrib/llvm/lib/Target/ARM/ARM.td
@@ -16,18 +16,26 @@
include "llvm/Target/Target.td"
+//===----------------------------------------------------------------------===//
+// ARM Subtarget state.
+//
+
+def ModeThumb : SubtargetFeature<"thumb-mode", "InThumbMode", "true",
+ "Thumb mode">;
//===----------------------------------------------------------------------===//
// ARM Subtarget features.
//
-def FeatureVFP2 : SubtargetFeature<"vfp2", "ARMFPUType", "VFPv2",
+def FeatureVFP2 : SubtargetFeature<"vfp2", "HasVFPv2", "true",
"Enable VFP2 instructions">;
-def FeatureVFP3 : SubtargetFeature<"vfp3", "ARMFPUType", "VFPv3",
- "Enable VFP3 instructions">;
-def FeatureNEON : SubtargetFeature<"neon", "ARMFPUType", "NEON",
- "Enable NEON instructions">;
-def FeatureThumb2 : SubtargetFeature<"thumb2", "ThumbMode", "Thumb2",
+def FeatureVFP3 : SubtargetFeature<"vfp3", "HasVFPv3", "true",
+ "Enable VFP3 instructions",
+ [FeatureVFP2]>;
+def FeatureNEON : SubtargetFeature<"neon", "HasNEON", "true",
+ "Enable NEON instructions",
+ [FeatureVFP3]>;
+def FeatureThumb2 : SubtargetFeature<"thumb2", "HasThumb2", "true",
"Enable Thumb2 instructions">;
def FeatureNoARM : SubtargetFeature<"noarm", "NoARM", "true",
"Does not support ARM mode execution">;
@@ -75,32 +83,32 @@ def FeatureAvoidPartialCPSR : SubtargetFeature<"avoid-partial-cpsr",
"AvoidCPSRPartialUpdate", "true",
"Avoid CPSR partial update for OOO execution">;
+/// Some M architectures don't have the DSP extension (v7E-M vs. v7M)
+def FeatureDSPThumb2 : SubtargetFeature<"t2dsp", "Thumb2DSP", "true",
+ "Supports v7 DSP instructions in Thumb2.">;
+
// Multiprocessing extension.
def FeatureMP : SubtargetFeature<"mp", "HasMPExtension", "true",
"Supports Multiprocessing extension">;
-// ARM architectures.
-def ArchV4T : SubtargetFeature<"v4t", "ARMArchVersion", "V4T",
- "ARM v4T">;
-def ArchV5T : SubtargetFeature<"v5t", "ARMArchVersion", "V5T",
- "ARM v5T">;
-def ArchV5TE : SubtargetFeature<"v5te", "ARMArchVersion", "V5TE",
- "ARM v5TE, v5TEj, v5TExp">;
-def ArchV6 : SubtargetFeature<"v6", "ARMArchVersion", "V6",
- "ARM v6">;
-def ArchV6M : SubtargetFeature<"v6m", "ARMArchVersion", "V6M",
- "ARM v6m",
- [FeatureNoARM, FeatureDB]>;
-def ArchV6T2 : SubtargetFeature<"v6t2", "ARMArchVersion", "V6T2",
- "ARM v6t2",
- [FeatureThumb2]>;
-def ArchV7A : SubtargetFeature<"v7a", "ARMArchVersion", "V7A",
- "ARM v7A",
- [FeatureThumb2, FeatureNEON, FeatureDB]>;
-def ArchV7M : SubtargetFeature<"v7m", "ARMArchVersion", "V7M",
- "ARM v7M",
- [FeatureThumb2, FeatureNoARM, FeatureDB,
- FeatureHWDiv]>;
+// ARM ISAs.
+def HasV4TOps : SubtargetFeature<"v4t", "HasV4TOps", "true",
+ "Support ARM v4T instructions">;
+def HasV5TOps : SubtargetFeature<"v5t", "HasV5TOps", "true",
+ "Support ARM v5T instructions",
+ [HasV4TOps]>;
+def HasV5TEOps : SubtargetFeature<"v5te", "HasV5TEOps", "true",
+ "Support ARM v5TE, v5TEj, and v5TExp instructions",
+ [HasV5TOps]>;
+def HasV6Ops : SubtargetFeature<"v6", "HasV6Ops", "true",
+ "Support ARM v6 instructions",
+ [HasV5TEOps]>;
+def HasV6T2Ops : SubtargetFeature<"v6t2", "HasV6T2Ops", "true",
+ "Support ARM v6t2 instructions",
+ [HasV6Ops, FeatureThumb2, FeatureDSPThumb2]>;
+def HasV7Ops : SubtargetFeature<"v7", "HasV7Ops", "true",
+ "Support ARM v7 instructions",
+ [HasV6T2Ops]>;
//===----------------------------------------------------------------------===//
// ARM Processors supported.
@@ -109,8 +117,6 @@ def ArchV7M : SubtargetFeature<"v7m", "ARMArchVersion", "V7M",
include "ARMSchedule.td"
// ARM processor families.
-def ProcOthers : SubtargetFeature<"others", "ARMProcFamily", "Others",
- "One of the other ARM processor families">;
def ProcA8 : SubtargetFeature<"a8", "ARMProcFamily", "CortexA8",
"Cortex-A8 ARM processors",
[FeatureSlowFPBrcc, FeatureNEONForFP,
@@ -135,64 +141,76 @@ def : ProcNoItin<"strongarm1100", []>;
def : ProcNoItin<"strongarm1110", []>;
// V4T Processors.
-def : ProcNoItin<"arm7tdmi", [ArchV4T]>;
-def : ProcNoItin<"arm7tdmi-s", [ArchV4T]>;
-def : ProcNoItin<"arm710t", [ArchV4T]>;
-def : ProcNoItin<"arm720t", [ArchV4T]>;
-def : ProcNoItin<"arm9", [ArchV4T]>;
-def : ProcNoItin<"arm9tdmi", [ArchV4T]>;
-def : ProcNoItin<"arm920", [ArchV4T]>;
-def : ProcNoItin<"arm920t", [ArchV4T]>;
-def : ProcNoItin<"arm922t", [ArchV4T]>;
-def : ProcNoItin<"arm940t", [ArchV4T]>;
-def : ProcNoItin<"ep9312", [ArchV4T]>;
+def : ProcNoItin<"arm7tdmi", [HasV4TOps]>;
+def : ProcNoItin<"arm7tdmi-s", [HasV4TOps]>;
+def : ProcNoItin<"arm710t", [HasV4TOps]>;
+def : ProcNoItin<"arm720t", [HasV4TOps]>;
+def : ProcNoItin<"arm9", [HasV4TOps]>;
+def : ProcNoItin<"arm9tdmi", [HasV4TOps]>;
+def : ProcNoItin<"arm920", [HasV4TOps]>;
+def : ProcNoItin<"arm920t", [HasV4TOps]>;
+def : ProcNoItin<"arm922t", [HasV4TOps]>;
+def : ProcNoItin<"arm940t", [HasV4TOps]>;
+def : ProcNoItin<"ep9312", [HasV4TOps]>;
// V5T Processors.
-def : ProcNoItin<"arm10tdmi", [ArchV5T]>;
-def : ProcNoItin<"arm1020t", [ArchV5T]>;
+def : ProcNoItin<"arm10tdmi", [HasV5TOps]>;
+def : ProcNoItin<"arm1020t", [HasV5TOps]>;
// V5TE Processors.
-def : ProcNoItin<"arm9e", [ArchV5TE]>;
-def : ProcNoItin<"arm926ej-s", [ArchV5TE]>;
-def : ProcNoItin<"arm946e-s", [ArchV5TE]>;
-def : ProcNoItin<"arm966e-s", [ArchV5TE]>;
-def : ProcNoItin<"arm968e-s", [ArchV5TE]>;
-def : ProcNoItin<"arm10e", [ArchV5TE]>;
-def : ProcNoItin<"arm1020e", [ArchV5TE]>;
-def : ProcNoItin<"arm1022e", [ArchV5TE]>;
-def : ProcNoItin<"xscale", [ArchV5TE]>;
-def : ProcNoItin<"iwmmxt", [ArchV5TE]>;
+def : ProcNoItin<"arm9e", [HasV5TEOps]>;
+def : ProcNoItin<"arm926ej-s", [HasV5TEOps]>;
+def : ProcNoItin<"arm946e-s", [HasV5TEOps]>;
+def : ProcNoItin<"arm966e-s", [HasV5TEOps]>;
+def : ProcNoItin<"arm968e-s", [HasV5TEOps]>;
+def : ProcNoItin<"arm10e", [HasV5TEOps]>;
+def : ProcNoItin<"arm1020e", [HasV5TEOps]>;
+def : ProcNoItin<"arm1022e", [HasV5TEOps]>;
+def : ProcNoItin<"xscale", [HasV5TEOps]>;
+def : ProcNoItin<"iwmmxt", [HasV5TEOps]>;
// V6 Processors.
-def : Processor<"arm1136j-s", ARMV6Itineraries, [ArchV6]>;
-def : Processor<"arm1136jf-s", ARMV6Itineraries, [ArchV6, FeatureVFP2,
+def : Processor<"arm1136j-s", ARMV6Itineraries, [HasV6Ops]>;
+def : Processor<"arm1136jf-s", ARMV6Itineraries, [HasV6Ops, FeatureVFP2,
FeatureHasSlowFPVMLx]>;
-def : Processor<"arm1176jz-s", ARMV6Itineraries, [ArchV6]>;
-def : Processor<"arm1176jzf-s", ARMV6Itineraries, [ArchV6, FeatureVFP2,
+def : Processor<"arm1176jz-s", ARMV6Itineraries, [HasV6Ops]>;
+def : Processor<"arm1176jzf-s", ARMV6Itineraries, [HasV6Ops, FeatureVFP2,
FeatureHasSlowFPVMLx]>;
-def : Processor<"mpcorenovfp", ARMV6Itineraries, [ArchV6]>;
-def : Processor<"mpcore", ARMV6Itineraries, [ArchV6, FeatureVFP2,
+def : Processor<"mpcorenovfp", ARMV6Itineraries, [HasV6Ops]>;
+def : Processor<"mpcore", ARMV6Itineraries, [HasV6Ops, FeatureVFP2,
FeatureHasSlowFPVMLx]>;
// V6M Processors.
-def : Processor<"cortex-m0", ARMV6Itineraries, [ArchV6M]>;
+def : Processor<"cortex-m0", ARMV6Itineraries, [HasV6Ops, FeatureNoARM,
+ FeatureDB]>;
// V6T2 Processors.
-def : Processor<"arm1156t2-s", ARMV6Itineraries, [ArchV6T2]>;
-def : Processor<"arm1156t2f-s", ARMV6Itineraries, [ArchV6T2, FeatureVFP2,
+def : Processor<"arm1156t2-s", ARMV6Itineraries, [HasV6T2Ops]>;
+def : Processor<"arm1156t2f-s", ARMV6Itineraries, [HasV6T2Ops, FeatureVFP2,
FeatureHasSlowFPVMLx]>;
-// V7 Processors.
+// V7a Processors.
def : Processor<"cortex-a8", CortexA8Itineraries,
- [ArchV7A, ProcA8]>;
+ [ProcA8, HasV7Ops, FeatureNEON, FeatureDB,
+ FeatureDSPThumb2]>;
def : Processor<"cortex-a9", CortexA9Itineraries,
- [ArchV7A, ProcA9]>;
+ [ProcA9, HasV7Ops, FeatureNEON, FeatureDB,
+ FeatureDSPThumb2]>;
def : Processor<"cortex-a9-mp", CortexA9Itineraries,
- [ArchV7A, ProcA9, FeatureMP]>;
+ [ProcA9, HasV7Ops, FeatureNEON, FeatureDB,
+ FeatureDSPThumb2, FeatureMP]>;
// V7M Processors.
-def : ProcNoItin<"cortex-m3", [ArchV7M]>;
-def : ProcNoItin<"cortex-m4", [ArchV7M, FeatureVFP2, FeatureVFPOnlySP]>;
+def : ProcNoItin<"cortex-m3", [HasV7Ops,
+ FeatureThumb2, FeatureNoARM, FeatureDB,
+ FeatureHWDiv]>;
+
+// V7EM Processors.
+def : ProcNoItin<"cortex-m4", [HasV7Ops,
+ FeatureThumb2, FeatureNoARM, FeatureDB,
+ FeatureHWDiv, FeatureDSPThumb2,
+ FeatureT2XtPk, FeatureVFP2,
+ FeatureVFPOnlySP]>;
//===----------------------------------------------------------------------===//
// Register File Description
diff --git a/contrib/llvm/lib/Target/ARM/ARMAsmBackend.cpp b/contrib/llvm/lib/Target/ARM/ARMAsmBackend.cpp
index 618a2b5..5e438a9 100644
--- a/contrib/llvm/lib/Target/ARM/ARMAsmBackend.cpp
+++ b/contrib/llvm/lib/Target/ARM/ARMAsmBackend.cpp
@@ -28,14 +28,6 @@
using namespace llvm;
namespace {
-class ARMMachObjectWriter : public MCMachObjectTargetWriter {
-public:
- ARMMachObjectWriter(bool Is64Bit, uint32_t CPUType,
- uint32_t CPUSubtype)
- : MCMachObjectTargetWriter(Is64Bit, CPUType, CPUSubtype,
- /*UseAggressiveSymbolFolding=*/true) {}
-};
-
class ARMELFObjectWriter : public MCELFObjectTargetWriter {
public:
ARMELFObjectWriter(Triple::OSType OSType)
@@ -182,7 +174,8 @@ static unsigned adjustFixupValue(unsigned Kind, uint64_t Value) {
Value >>= 16;
// Fallthrough
case ARM::fixup_t2_movw_lo16:
- case ARM::fixup_t2_movt_hi16_pcrel:
+ case ARM::fixup_t2_movt_hi16_pcrel: //FIXME: Shouldn't this be shifted like
+ // the other hi16 fixup?
case ARM::fixup_t2_movw_lo16_pcrel: {
unsigned Hi4 = (Value & 0xF000) >> 12;
unsigned i = (Value & 0x800) >> 11;
@@ -192,8 +185,10 @@ static unsigned adjustFixupValue(unsigned Kind, uint64_t Value) {
// inst{26} = i;
// inst{14-12} = Mid3;
// inst{7-0} = Lo8;
- assert ((((int64_t)Value) >= -0x8000) && (((int64_t)Value) <= 0x7fff) &&
- "Out of range pc-relative fixup value!");
+ // The value comes in as the whole thing, not just the portion required
+ // for this fixup, so we need to mask off the bits not handled by this
+ // portion (lo vs. hi).
+ Value &= 0xffff;
Value = (Hi4 << 16) | (i << 26) | (Mid3 << 12) | (Lo8);
uint64_t swapped = (Value & 0xFFFF0000) >> 16;
swapped |= (Value & 0x0000FFFF) << 16;
@@ -423,12 +418,9 @@ public:
: ARMAsmBackend(T), Subtype(st) { }
MCObjectWriter *createObjectWriter(raw_ostream &OS) const {
- return createMachObjectWriter(new ARMMachObjectWriter(
- /*Is64Bit=*/false,
- object::mach::CTM_ARM,
- Subtype),
- OS,
- /*IsLittleEndian=*/true);
+ return createARMMachObjectWriter(OS, /*Is64Bit=*/false,
+ object::mach::CTM_ARM,
+ Subtype);
}
void ApplyFixup(const MCFixup &Fixup, char *Data, unsigned DataSize,
@@ -505,7 +497,13 @@ TargetAsmBackend *llvm::createARMAsmBackend(const Target &T,
Triple TheTriple(TT);
if (TheTriple.isOSDarwin()) {
- if (TheTriple.getArchName() == "armv6" ||
+ if (TheTriple.getArchName() == "armv4t" ||
+ TheTriple.getArchName() == "thumbv4t")
+ return new DarwinARMAsmBackend(T, object::mach::CSARM_V4T);
+ else if (TheTriple.getArchName() == "armv5e" ||
+ TheTriple.getArchName() == "thumbv5e")
+ return new DarwinARMAsmBackend(T, object::mach::CSARM_V5TEJ);
+ else if (TheTriple.getArchName() == "armv6" ||
TheTriple.getArchName() == "thumbv6")
return new DarwinARMAsmBackend(T, object::mach::CSARM_V6);
return new DarwinARMAsmBackend(T, object::mach::CSARM_V7);
diff --git a/contrib/llvm/lib/Target/ARM/ARMAsmPrinter.cpp b/contrib/llvm/lib/Target/ARM/ARMAsmPrinter.cpp
index eb73902..dbc3ee4 100644
--- a/contrib/llvm/lib/Target/ARM/ARMAsmPrinter.cpp
+++ b/contrib/llvm/lib/Target/ARM/ARMAsmPrinter.cpp
@@ -654,7 +654,7 @@ void ARMAsmPrinter::emitAttributes() {
}
/* TODO: ARMBuildAttrs::Allowed is not completely accurate,
- * since NEON can have 1 (allowed) or 2 (fused MAC operations) */
+ * since NEON can have 1 (allowed) or 2 (MAC operations) */
if (Subtarget->hasNEON()) {
AttrEmitter->EmitAttribute(ARMBuildAttrs::Advanced_SIMD_arch,
ARMBuildAttrs::Allowed);
@@ -1010,19 +1010,16 @@ void ARMAsmPrinter::EmitUnwindingInstruction(const MachineInstr *MI) {
MI->dump();
assert(0 && "Unsupported opcode for unwinding information");
case ARM::MOVr:
- case ARM::tMOVgpr2gpr:
- case ARM::tMOVgpr2tgpr:
Offset = 0;
break;
case ARM::ADDri:
Offset = -MI->getOperand(2).getImm();
break;
case ARM::SUBri:
- case ARM::t2SUBrSPi:
- Offset = MI->getOperand(2).getImm();
+ Offset = MI->getOperand(2).getImm();
break;
case ARM::tSUBspi:
- Offset = MI->getOperand(2).getImm()*4;
+ Offset = MI->getOperand(2).getImm()*4;
break;
case ARM::tADDspi:
case ARM::tADDrSPi:
@@ -1072,39 +1069,18 @@ void ARMAsmPrinter::EmitUnwindingInstruction(const MachineInstr *MI) {
extern cl::opt<bool> EnableARMEHABI;
+// Simple pseudo-instructions have their lowering (with expansion to real
+// instructions) auto-generated.
+#include "ARMGenMCPseudoLowering.inc"
+
void ARMAsmPrinter::EmitInstruction(const MachineInstr *MI) {
- unsigned Opc = MI->getOpcode();
- switch (Opc) {
- default: break;
- case ARM::B: {
- // B is just a Bcc with an 'always' predicate.
- MCInst TmpInst;
- LowerARMMachineInstrToMCInst(MI, TmpInst, *this);
- TmpInst.setOpcode(ARM::Bcc);
- // Add predicate operands.
- TmpInst.addOperand(MCOperand::CreateImm(ARMCC::AL));
- TmpInst.addOperand(MCOperand::CreateReg(0));
- OutStreamer.EmitInstruction(TmpInst);
- return;
- }
- case ARM::LDMIA_RET: {
- // LDMIA_RET is just a normal LDMIA_UPD instruction that targets PC and as
- // such has additional code-gen properties and scheduling information.
- // To emit it, we just construct as normal and set the opcode to LDMIA_UPD.
- MCInst TmpInst;
- LowerARMMachineInstrToMCInst(MI, TmpInst, *this);
- TmpInst.setOpcode(ARM::LDMIA_UPD);
- OutStreamer.EmitInstruction(TmpInst);
+ // Do any auto-generated pseudo lowerings.
+ if (emitPseudoExpansionLowering(OutStreamer, MI))
return;
- }
- case ARM::t2ADDrSPi:
- case ARM::t2ADDrSPi12:
- case ARM::t2SUBrSPi:
- case ARM::t2SUBrSPi12:
- assert ((MI->getOperand(1).getReg() == ARM::SP) &&
- "Unexpected source register!");
- break;
+ // Check for manual lowerings.
+ unsigned Opc = MI->getOpcode();
+ switch (Opc) {
case ARM::t2MOVi32imm: assert(0 && "Should be lowered by thumb2it pass");
case ARM::DBG_VALUE: {
if (isVerbose() && OutStreamer.hasRawTextSupport()) {
@@ -1115,14 +1091,6 @@ void ARMAsmPrinter::EmitInstruction(const MachineInstr *MI) {
}
return;
}
- case ARM::tBfar: {
- MCInst TmpInst;
- TmpInst.setOpcode(ARM::tBL);
- TmpInst.addOperand(MCOperand::CreateExpr(MCSymbolRefExpr::Create(
- MI->getOperand(0).getMBB()->getSymbol(), OutContext)));
- OutStreamer.EmitInstruction(TmpInst);
- return;
- }
case ARM::LEApcrel:
case ARM::tLEApcrel:
case ARM::t2LEApcrel: {
@@ -1153,39 +1121,8 @@ void ARMAsmPrinter::EmitInstruction(const MachineInstr *MI) {
OutStreamer.EmitInstruction(TmpInst);
return;
}
- case ARM::MOVPCRX: {
- MCInst TmpInst;
- TmpInst.setOpcode(ARM::MOVr);
- TmpInst.addOperand(MCOperand::CreateReg(ARM::PC));
- TmpInst.addOperand(MCOperand::CreateReg(MI->getOperand(0).getReg()));
- // Add predicate operands.
- TmpInst.addOperand(MCOperand::CreateImm(ARMCC::AL));
- TmpInst.addOperand(MCOperand::CreateReg(0));
- // Add 's' bit operand (always reg0 for this)
- TmpInst.addOperand(MCOperand::CreateReg(0));
- OutStreamer.EmitInstruction(TmpInst);
- return;
- }
// Darwin call instructions are just normal call instructions with different
// clobber semantics (they clobber R9).
- case ARM::BLr9:
- case ARM::BLr9_pred:
- case ARM::BLXr9:
- case ARM::BLXr9_pred: {
- unsigned newOpc;
- switch (Opc) {
- default: assert(0);
- case ARM::BLr9: newOpc = ARM::BL; break;
- case ARM::BLr9_pred: newOpc = ARM::BL_pred; break;
- case ARM::BLXr9: newOpc = ARM::BLX; break;
- case ARM::BLXr9_pred: newOpc = ARM::BLX_pred; break;
- }
- MCInst TmpInst;
- LowerARMMachineInstrToMCInst(MI, TmpInst, *this);
- TmpInst.setOpcode(newOpc);
- OutStreamer.EmitInstruction(TmpInst);
- return;
- }
case ARM::BXr9_CALL:
case ARM::BX_CALL: {
{
@@ -1215,6 +1152,9 @@ void ARMAsmPrinter::EmitInstruction(const MachineInstr *MI) {
TmpInst.setOpcode(ARM::tMOVr);
TmpInst.addOperand(MCOperand::CreateReg(ARM::LR));
TmpInst.addOperand(MCOperand::CreateReg(ARM::PC));
+ // Add predicate operands.
+ TmpInst.addOperand(MCOperand::CreateImm(ARMCC::AL));
+ TmpInst.addOperand(MCOperand::CreateReg(0));
OutStreamer.EmitInstruction(TmpInst);
}
{
@@ -1445,7 +1385,7 @@ void ARMAsmPrinter::EmitInstruction(const MachineInstr *MI) {
case ARM::t2BR_JT: {
// Lower and emit the instruction itself, then the jump table following it.
MCInst TmpInst;
- TmpInst.setOpcode(ARM::tMOVgpr2gpr);
+ TmpInst.setOpcode(ARM::tMOVr);
TmpInst.addOperand(MCOperand::CreateReg(ARM::PC));
TmpInst.addOperand(MCOperand::CreateReg(MI->getOperand(0).getReg()));
// Add predicate operands.
@@ -1494,7 +1434,7 @@ void ARMAsmPrinter::EmitInstruction(const MachineInstr *MI) {
// mov pc, target
MCInst TmpInst;
unsigned Opc = MI->getOpcode() == ARM::BR_JTr ?
- ARM::MOVr : ARM::tMOVgpr2gpr;
+ ARM::MOVr : ARM::tMOVr;
TmpInst.setOpcode(Opc);
TmpInst.addOperand(MCOperand::CreateReg(ARM::PC));
TmpInst.addOperand(MCOperand::CreateReg(MI->getOperand(0).getReg()));
@@ -1507,7 +1447,7 @@ void ARMAsmPrinter::EmitInstruction(const MachineInstr *MI) {
OutStreamer.EmitInstruction(TmpInst);
// Make sure the Thumb jump table is 4-byte aligned.
- if (Opc == ARM::tMOVgpr2gpr)
+ if (Opc == ARM::tMOVr)
EmitAlignment(2);
// Output the data for the jump table itself
@@ -1599,11 +1539,12 @@ void ARMAsmPrinter::EmitInstruction(const MachineInstr *MI) {
MCSymbol *Label = GetARMSJLJEHLabel();
{
MCInst TmpInst;
- TmpInst.setOpcode(ARM::tMOVgpr2tgpr);
+ TmpInst.setOpcode(ARM::tMOVr);
TmpInst.addOperand(MCOperand::CreateReg(ValReg));
TmpInst.addOperand(MCOperand::CreateReg(ARM::PC));
- // 's' bit operand
- TmpInst.addOperand(MCOperand::CreateReg(ARM::CPSR));
+ // Predicate.
+ TmpInst.addOperand(MCOperand::CreateImm(ARMCC::AL));
+ TmpInst.addOperand(MCOperand::CreateReg(0));
OutStreamer.AddComment("eh_setjmp begin");
OutStreamer.EmitInstruction(TmpInst);
}
@@ -1817,7 +1758,7 @@ void ARMAsmPrinter::EmitInstruction(const MachineInstr *MI) {
}
{
MCInst TmpInst;
- TmpInst.setOpcode(ARM::tMOVtgpr2gpr);
+ TmpInst.setOpcode(ARM::tMOVr);
TmpInst.addOperand(MCOperand::CreateReg(ARM::SP));
TmpInst.addOperand(MCOperand::CreateReg(ScratchReg));
// Predicate.
@@ -1858,75 +1799,6 @@ void ARMAsmPrinter::EmitInstruction(const MachineInstr *MI) {
}
return;
}
- // Tail jump branches are really just branch instructions with additional
- // code-gen attributes. Convert them to the canonical form here.
- case ARM::TAILJMPd:
- case ARM::TAILJMPdND: {
- MCInst TmpInst, TmpInst2;
- // Lower the instruction as-is to get the operands properly converted.
- LowerARMMachineInstrToMCInst(MI, TmpInst2, *this);
- TmpInst.setOpcode(ARM::Bcc);
- TmpInst.addOperand(TmpInst2.getOperand(0));
- // Add predicate operands.
- TmpInst.addOperand(MCOperand::CreateImm(ARMCC::AL));
- TmpInst.addOperand(MCOperand::CreateReg(0));
- OutStreamer.AddComment("TAILCALL");
- OutStreamer.EmitInstruction(TmpInst);
- return;
- }
- case ARM::tTAILJMPd:
- case ARM::tTAILJMPdND: {
- MCInst TmpInst, TmpInst2;
- LowerARMMachineInstrToMCInst(MI, TmpInst2, *this);
- // The Darwin toolchain doesn't support tail call relocations of 16-bit
- // branches.
- TmpInst.setOpcode(Opc == ARM::tTAILJMPd ? ARM::t2B : ARM::tB);
- TmpInst.addOperand(TmpInst2.getOperand(0));
- OutStreamer.AddComment("TAILCALL");
- OutStreamer.EmitInstruction(TmpInst);
- return;
- }
- case ARM::TAILJMPrND:
- case ARM::tTAILJMPrND:
- case ARM::TAILJMPr:
- case ARM::tTAILJMPr: {
- unsigned newOpc = (Opc == ARM::TAILJMPr || Opc == ARM::TAILJMPrND)
- ? ARM::BX : ARM::tBX;
- MCInst TmpInst;
- TmpInst.setOpcode(newOpc);
- TmpInst.addOperand(MCOperand::CreateReg(MI->getOperand(0).getReg()));
- // Predicate.
- TmpInst.addOperand(MCOperand::CreateImm(ARMCC::AL));
- TmpInst.addOperand(MCOperand::CreateReg(0));
- OutStreamer.AddComment("TAILCALL");
- OutStreamer.EmitInstruction(TmpInst);
- return;
- }
-
- // These are the pseudos created to comply with stricter operand restrictions
- // on ARMv5. Lower them now to "normal" instructions, since all the
- // restrictions are already satisfied.
- case ARM::MULv5:
- EmitPatchedInstruction(MI, ARM::MUL);
- return;
- case ARM::MLAv5:
- EmitPatchedInstruction(MI, ARM::MLA);
- return;
- case ARM::SMULLv5:
- EmitPatchedInstruction(MI, ARM::SMULL);
- return;
- case ARM::UMULLv5:
- EmitPatchedInstruction(MI, ARM::UMULL);
- return;
- case ARM::SMLALv5:
- EmitPatchedInstruction(MI, ARM::SMLAL);
- return;
- case ARM::UMLALv5:
- EmitPatchedInstruction(MI, ARM::UMLAL);
- return;
- case ARM::UMAALv5:
- EmitPatchedInstruction(MI, ARM::UMAAL);
- return;
}
MCInst TmpInst;
@@ -1944,11 +1816,10 @@ void ARMAsmPrinter::EmitInstruction(const MachineInstr *MI) {
//===----------------------------------------------------------------------===//
static MCInstPrinter *createARMMCInstPrinter(const Target &T,
- TargetMachine &TM,
unsigned SyntaxVariant,
const MCAsmInfo &MAI) {
if (SyntaxVariant == 0)
- return new ARMInstPrinter(TM, MAI);
+ return new ARMInstPrinter(MAI);
return 0;
}
diff --git a/contrib/llvm/lib/Target/ARM/ARMAsmPrinter.h b/contrib/llvm/lib/Target/ARM/ARMAsmPrinter.h
index 5f9169e..7741fc4 100644
--- a/contrib/llvm/lib/Target/ARM/ARMAsmPrinter.h
+++ b/contrib/llvm/lib/Target/ARM/ARMAsmPrinter.h
@@ -21,6 +21,8 @@
namespace llvm {
+class MCOperand;
+
namespace ARM {
enum DW_ISA {
DW_ISA_ARM_thumb = 1,
@@ -72,6 +74,9 @@ public:
void EmitStartOfAsmFile(Module &M);
void EmitEndOfAsmFile(Module &M);
+ // lowerOperand - Convert a MachineOperand into the equivalent MCOperand.
+ bool lowerOperand(const MachineOperand &MO, MCOperand &MCOp);
+
private:
// Helpers for EmitStartOfAsmFile() and EmitEndOfAsmFile()
void emitAttributes();
@@ -84,6 +89,10 @@ private:
void EmitUnwindingInstruction(const MachineInstr *MI);
+ // emitPseudoExpansionLowering - tblgen'erated.
+ bool emitPseudoExpansionLowering(MCStreamer &OutStreamer,
+ const MachineInstr *MI);
+
public:
void PrintDebugValueComment(const MachineInstr *MI, raw_ostream &OS);
@@ -100,6 +109,7 @@ public:
llvm::ARM::DW_ISA_ARM_thumb : llvm::ARM::DW_ISA_ARM_arm;
}
+ MCOperand GetSymbolRef(const MachineOperand &MO, const MCSymbol *Symbol);
MCSymbol *GetARMSetPICJumpTableLabel2(unsigned uid, unsigned uid2,
const MachineBasicBlock *MBB) const;
MCSymbol *GetARMJTIPICJumpTableLabel2(unsigned uid, unsigned uid2) const;
@@ -107,7 +117,7 @@ public:
MCSymbol *GetARMSJLJEHLabel(void) const;
MCSymbol *GetARMGVSymbol(const GlobalValue *GV);
-
+
/// EmitMachineConstantPoolValue - Print a machine constantpool value to
/// the .s file.
virtual void EmitMachineConstantPoolValue(MachineConstantPoolValue *MCPV);
diff --git a/contrib/llvm/lib/Target/ARM/ARMBaseInfo.h b/contrib/llvm/lib/Target/ARM/ARMBaseInfo.h
index 36edbad..458f7dd 100644
--- a/contrib/llvm/lib/Target/ARM/ARMBaseInfo.h
+++ b/contrib/llvm/lib/Target/ARM/ARMBaseInfo.h
@@ -17,20 +17,12 @@
#ifndef ARMBASEINFO_H
#define ARMBASEINFO_H
+#include "MCTargetDesc/ARMMCTargetDesc.h"
#include "llvm/Support/ErrorHandling.h"
// Note that the following auto-generated files only defined enum types, and
// so are safe to include here.
-// Defines symbolic names for ARM registers. This defines a mapping from
-// register name to register number.
-//
-#include "ARMGenRegisterNames.inc"
-
-// Defines symbolic names for the ARM instructions.
-//
-#include "ARMGenInstrNames.inc"
-
namespace llvm {
// Enums corresponding to ARM condition codes
diff --git a/contrib/llvm/lib/Target/ARM/ARMBaseInstrInfo.cpp b/contrib/llvm/lib/Target/ARM/ARMBaseInstrInfo.cpp
index 44a3976..649bd7d 100644
--- a/contrib/llvm/lib/Target/ARM/ARMBaseInstrInfo.cpp
+++ b/contrib/llvm/lib/Target/ARM/ARMBaseInstrInfo.cpp
@@ -18,7 +18,6 @@
#include "ARMHazardRecognizer.h"
#include "ARMMachineFunctionInfo.h"
#include "ARMRegisterInfo.h"
-#include "ARMGenInstrInfo.inc"
#include "llvm/Constants.h"
#include "llvm/Function.h"
#include "llvm/GlobalValue.h"
@@ -31,10 +30,15 @@
#include "llvm/CodeGen/MachineRegisterInfo.h"
#include "llvm/CodeGen/PseudoSourceValue.h"
#include "llvm/MC/MCAsmInfo.h"
+#include "llvm/Support/BranchProbability.h"
#include "llvm/Support/CommandLine.h"
#include "llvm/Support/Debug.h"
#include "llvm/Support/ErrorHandling.h"
#include "llvm/ADT/STLExtras.h"
+
+#define GET_INSTRINFO_CTOR
+#include "ARMGenInstrInfo.inc"
+
using namespace llvm;
static cl::opt<bool>
@@ -74,7 +78,7 @@ static const ARM_MLxEntry ARM_MLxTable[] = {
};
ARMBaseInstrInfo::ARMBaseInstrInfo(const ARMSubtarget& STI)
- : TargetInstrInfoImpl(ARMInsts, array_lengthof(ARMInsts)),
+ : ARMGenInstrInfo(ARM::ADJCALLSTACKDOWN, ARM::ADJCALLSTACKUP),
Subtarget(STI) {
for (unsigned i = 0, e = array_lengthof(ARM_MLxTable); i != e; ++i) {
if (!MLxEntryMap.insert(std::make_pair(ARM_MLxTable[i].MLxOpc, i)).second)
@@ -136,9 +140,9 @@ ARMBaseInstrInfo::convertToThreeAddress(MachineFunction::iterator &MFI,
MachineInstr *UpdateMI = NULL;
MachineInstr *MemMI = NULL;
unsigned AddrMode = (TSFlags & ARMII::AddrModeMask);
- const TargetInstrDesc &TID = MI->getDesc();
- unsigned NumOps = TID.getNumOperands();
- bool isLoad = !TID.mayStore();
+ const MCInstrDesc &MCID = MI->getDesc();
+ unsigned NumOps = MCID.getNumOperands();
+ bool isLoad = !MCID.mayStore();
const MachineOperand &WB = isLoad ? MI->getOperand(1) : MI->getOperand(0);
const MachineOperand &Base = MI->getOperand(2);
const MachineOperand &Offset = MI->getOperand(NumOps-3);
@@ -475,8 +479,8 @@ SubsumesPredicate(const SmallVectorImpl<MachineOperand> &Pred1,
bool ARMBaseInstrInfo::DefinesPredicate(MachineInstr *MI,
std::vector<MachineOperand> &Pred) const {
// FIXME: This confuses implicit_def with optional CPSR def.
- const TargetInstrDesc &TID = MI->getDesc();
- if (!TID.getImplicitDefs() && !TID.hasOptionalDef())
+ const MCInstrDesc &MCID = MI->getDesc();
+ if (!MCID.getImplicitDefs() && !MCID.hasOptionalDef())
return false;
bool Found = false;
@@ -495,11 +499,11 @@ bool ARMBaseInstrInfo::DefinesPredicate(MachineInstr *MI,
/// By default, this returns true for every instruction with a
/// PredicateOperand.
bool ARMBaseInstrInfo::isPredicable(MachineInstr *MI) const {
- const TargetInstrDesc &TID = MI->getDesc();
- if (!TID.isPredicable())
+ const MCInstrDesc &MCID = MI->getDesc();
+ if (!MCID.isPredicable())
return false;
- if ((TID.TSFlags & ARMII::DomainMask) == ARMII::DomainNEON) {
+ if ((MCID.TSFlags & ARMII::DomainMask) == ARMII::DomainNEON) {
ARMFunctionInfo *AFI =
MI->getParent()->getParent()->getInfo<ARMFunctionInfo>();
return AFI->isThumb2Function();
@@ -524,35 +528,23 @@ unsigned ARMBaseInstrInfo::GetInstSizeInBytes(const MachineInstr *MI) const {
const MachineFunction *MF = MBB.getParent();
const MCAsmInfo *MAI = MF->getTarget().getMCAsmInfo();
- // Basic size info comes from the TSFlags field.
- const TargetInstrDesc &TID = MI->getDesc();
- uint64_t TSFlags = TID.TSFlags;
+ const MCInstrDesc &MCID = MI->getDesc();
+ if (MCID.getSize())
+ return MCID.getSize();
- unsigned Opc = MI->getOpcode();
- switch ((TSFlags & ARMII::SizeMask) >> ARMII::SizeShift) {
- default: {
// If this machine instr is an inline asm, measure it.
if (MI->getOpcode() == ARM::INLINEASM)
return getInlineAsmLength(MI->getOperand(0).getSymbolName(), *MAI);
if (MI->isLabel())
return 0;
+ unsigned Opc = MI->getOpcode();
switch (Opc) {
- default:
- llvm_unreachable("Unknown or unset size field for instr!");
case TargetOpcode::IMPLICIT_DEF:
case TargetOpcode::KILL:
case TargetOpcode::PROLOG_LABEL:
case TargetOpcode::EH_LABEL:
case TargetOpcode::DBG_VALUE:
return 0;
- }
- break;
- }
- case ARMII::Size8Bytes: return 8; // ARM instruction x 2.
- case ARMII::Size4Bytes: return 4; // ARM / Thumb2 instruction.
- case ARMII::Size2Bytes: return 2; // Thumb1 instruction.
- case ARMII::SizeSpecial: {
- switch (Opc) {
case ARM::MOVi16_ga_pcrel:
case ARM::MOVTi16_ga_pcrel:
case ARM::t2MOVi16_ga_pcrel:
@@ -588,9 +580,9 @@ unsigned ARMBaseInstrInfo::GetInstSizeInBytes(const MachineInstr *MI) const {
// entry is one byte; TBH two byte each.
unsigned EntrySize = (Opc == ARM::t2TBB_JT)
? 1 : ((Opc == ARM::t2TBH_JT) ? 2 : 4);
- unsigned NumOps = TID.getNumOperands();
+ unsigned NumOps = MCID.getNumOperands();
MachineOperand JTOP =
- MI->getOperand(NumOps - (TID.isPredicable() ? 3 : 2));
+ MI->getOperand(NumOps - (MCID.isPredicable() ? 3 : 2));
unsigned JTI = JTOP.getIndex();
const MachineJumpTableInfo *MJTI = MF->getJumpTableInfo();
assert(MJTI != 0);
@@ -616,8 +608,6 @@ unsigned ARMBaseInstrInfo::GetInstSizeInBytes(const MachineInstr *MI) const {
// Otherwise, pseudo-instruction sizes are zero.
return 0;
}
- }
- }
return 0; // Not reached
}
@@ -647,7 +637,7 @@ void ARMBaseInstrInfo::copyPhysReg(MachineBasicBlock &MBB,
else if (ARM::DPRRegClass.contains(DestReg, SrcReg))
Opc = ARM::VMOVD;
else if (ARM::QPRRegClass.contains(DestReg, SrcReg))
- Opc = ARM::VMOVQ;
+ Opc = ARM::VORRq;
else if (ARM::QQPRRegClass.contains(DestReg, SrcReg))
Opc = ARM::VMOVQQ;
else if (ARM::QQQQPRRegClass.contains(DestReg, SrcReg))
@@ -657,6 +647,8 @@ void ARMBaseInstrInfo::copyPhysReg(MachineBasicBlock &MBB,
MachineInstrBuilder MIB = BuildMI(MBB, I, DL, get(Opc), DestReg);
MIB.addReg(SrcReg, getKillRegState(KillSrc));
+ if (Opc == ARM::VORRq)
+ MIB.addReg(SrcReg, getKillRegState(KillSrc));
if (Opc != ARM::VMOVQQ && Opc != ARM::VMOVQQQQ)
AddDefaultPred(MIB);
}
@@ -788,7 +780,7 @@ ARMBaseInstrInfo::isStoreToStackSlot(const MachineInstr *MI,
break;
case ARM::STRi12:
case ARM::t2STRi12:
- case ARM::tSpill:
+ case ARM::tSTRspi:
case ARM::VSTRD:
case ARM::VSTRS:
if (MI->getOperand(1).isFI() &&
@@ -923,7 +915,7 @@ ARMBaseInstrInfo::isLoadFromStackSlot(const MachineInstr *MI,
break;
case ARM::LDRi12:
case ARM::t2LDRi12:
- case ARM::tRestore:
+ case ARM::tLDRspi:
case ARM::VLDRD:
case ARM::VLDRS:
if (MI->getOperand(1).isFI() &&
@@ -1269,20 +1261,20 @@ bool ARMBaseInstrInfo::isSchedulingBoundary(const MachineInstr *MI,
return false;
}
-bool ARMBaseInstrInfo::isProfitableToIfCvt(MachineBasicBlock &MBB,
- unsigned NumCycles,
- unsigned ExtraPredCycles,
- float Probability,
- float Confidence) const {
+bool ARMBaseInstrInfo::
+isProfitableToIfCvt(MachineBasicBlock &MBB,
+ unsigned NumCycles, unsigned ExtraPredCycles,
+ const BranchProbability &Probability) const {
if (!NumCycles)
return false;
// Attempt to estimate the relative costs of predication versus branching.
- float UnpredCost = Probability * NumCycles;
- UnpredCost += 1.0; // The branch itself
- UnpredCost += (1.0 - Confidence) * Subtarget.getMispredictionPenalty();
+ unsigned UnpredCost = Probability.getNumerator() * NumCycles;
+ UnpredCost /= Probability.getDenominator();
+ UnpredCost += 1; // The branch itself
+ UnpredCost += Subtarget.getMispredictionPenalty() / 10;
- return (float)(NumCycles + ExtraPredCycles) < UnpredCost;
+ return (NumCycles + ExtraPredCycles) <= UnpredCost;
}
bool ARMBaseInstrInfo::
@@ -1290,16 +1282,23 @@ isProfitableToIfCvt(MachineBasicBlock &TMBB,
unsigned TCycles, unsigned TExtra,
MachineBasicBlock &FMBB,
unsigned FCycles, unsigned FExtra,
- float Probability, float Confidence) const {
+ const BranchProbability &Probability) const {
if (!TCycles || !FCycles)
return false;
// Attempt to estimate the relative costs of predication versus branching.
- float UnpredCost = Probability * TCycles + (1.0 - Probability) * FCycles;
- UnpredCost += 1.0; // The branch itself
- UnpredCost += (1.0 - Confidence) * Subtarget.getMispredictionPenalty();
-
- return (float)(TCycles + FCycles + TExtra + FExtra) < UnpredCost;
+ unsigned TUnpredCost = Probability.getNumerator() * TCycles;
+ TUnpredCost /= Probability.getDenominator();
+
+ uint32_t Comp = Probability.getDenominator() - Probability.getNumerator();
+ unsigned FUnpredCost = Comp * FCycles;
+ FUnpredCost /= Probability.getDenominator();
+
+ unsigned UnpredCost = TUnpredCost + FUnpredCost;
+ UnpredCost += 1; // The branch itself
+ UnpredCost += Subtarget.getMispredictionPenalty() / 10;
+
+ return (TCycles + FCycles + TExtra + FExtra) <= UnpredCost;
}
/// getInstrPredicate - If instruction is predicated, returns its predicate
@@ -1363,7 +1362,7 @@ bool llvm::rewriteARMFrameIndex(MachineInstr &MI, unsigned FrameRegIdx,
unsigned FrameReg, int &Offset,
const ARMBaseInstrInfo &TII) {
unsigned Opcode = MI.getOpcode();
- const TargetInstrDesc &Desc = MI.getDesc();
+ const MCInstrDesc &Desc = MI.getDesc();
unsigned AddrMode = (Desc.TSFlags & ARMII::AddrModeMask);
bool isSub = false;
@@ -1803,7 +1802,7 @@ ARMBaseInstrInfo::getNumMicroOps(const InstrItineraryData *ItinData,
if (!ItinData || ItinData->isEmpty())
return 1;
- const TargetInstrDesc &Desc = MI->getDesc();
+ const MCInstrDesc &Desc = MI->getDesc();
unsigned Class = Desc.getSchedClass();
unsigned UOps = ItinData->Itineraries[Class].NumMicroOps;
if (UOps)
@@ -1906,10 +1905,10 @@ ARMBaseInstrInfo::getNumMicroOps(const InstrItineraryData *ItinData,
int
ARMBaseInstrInfo::getVLDMDefCycle(const InstrItineraryData *ItinData,
- const TargetInstrDesc &DefTID,
+ const MCInstrDesc &DefMCID,
unsigned DefClass,
unsigned DefIdx, unsigned DefAlign) const {
- int RegNo = (int)(DefIdx+1) - DefTID.getNumOperands() + 1;
+ int RegNo = (int)(DefIdx+1) - DefMCID.getNumOperands() + 1;
if (RegNo <= 0)
// Def is the address writeback.
return ItinData->getOperandCycle(DefClass, DefIdx);
@@ -1924,7 +1923,7 @@ ARMBaseInstrInfo::getVLDMDefCycle(const InstrItineraryData *ItinData,
DefCycle = RegNo;
bool isSLoad = false;
- switch (DefTID.getOpcode()) {
+ switch (DefMCID.getOpcode()) {
default: break;
case ARM::VLDMSIA:
case ARM::VLDMSIA_UPD:
@@ -1947,10 +1946,10 @@ ARMBaseInstrInfo::getVLDMDefCycle(const InstrItineraryData *ItinData,
int
ARMBaseInstrInfo::getLDMDefCycle(const InstrItineraryData *ItinData,
- const TargetInstrDesc &DefTID,
+ const MCInstrDesc &DefMCID,
unsigned DefClass,
unsigned DefIdx, unsigned DefAlign) const {
- int RegNo = (int)(DefIdx+1) - DefTID.getNumOperands() + 1;
+ int RegNo = (int)(DefIdx+1) - DefMCID.getNumOperands() + 1;
if (RegNo <= 0)
// Def is the address writeback.
return ItinData->getOperandCycle(DefClass, DefIdx);
@@ -1982,10 +1981,10 @@ ARMBaseInstrInfo::getLDMDefCycle(const InstrItineraryData *ItinData,
int
ARMBaseInstrInfo::getVSTMUseCycle(const InstrItineraryData *ItinData,
- const TargetInstrDesc &UseTID,
+ const MCInstrDesc &UseMCID,
unsigned UseClass,
unsigned UseIdx, unsigned UseAlign) const {
- int RegNo = (int)(UseIdx+1) - UseTID.getNumOperands() + 1;
+ int RegNo = (int)(UseIdx+1) - UseMCID.getNumOperands() + 1;
if (RegNo <= 0)
return ItinData->getOperandCycle(UseClass, UseIdx);
@@ -1999,7 +1998,7 @@ ARMBaseInstrInfo::getVSTMUseCycle(const InstrItineraryData *ItinData,
UseCycle = RegNo;
bool isSStore = false;
- switch (UseTID.getOpcode()) {
+ switch (UseMCID.getOpcode()) {
default: break;
case ARM::VSTMSIA:
case ARM::VSTMSIA_UPD:
@@ -2022,10 +2021,10 @@ ARMBaseInstrInfo::getVSTMUseCycle(const InstrItineraryData *ItinData,
int
ARMBaseInstrInfo::getSTMUseCycle(const InstrItineraryData *ItinData,
- const TargetInstrDesc &UseTID,
+ const MCInstrDesc &UseMCID,
unsigned UseClass,
unsigned UseIdx, unsigned UseAlign) const {
- int RegNo = (int)(UseIdx+1) - UseTID.getNumOperands() + 1;
+ int RegNo = (int)(UseIdx+1) - UseMCID.getNumOperands() + 1;
if (RegNo <= 0)
return ItinData->getOperandCycle(UseClass, UseIdx);
@@ -2051,14 +2050,14 @@ ARMBaseInstrInfo::getSTMUseCycle(const InstrItineraryData *ItinData,
int
ARMBaseInstrInfo::getOperandLatency(const InstrItineraryData *ItinData,
- const TargetInstrDesc &DefTID,
+ const MCInstrDesc &DefMCID,
unsigned DefIdx, unsigned DefAlign,
- const TargetInstrDesc &UseTID,
+ const MCInstrDesc &UseMCID,
unsigned UseIdx, unsigned UseAlign) const {
- unsigned DefClass = DefTID.getSchedClass();
- unsigned UseClass = UseTID.getSchedClass();
+ unsigned DefClass = DefMCID.getSchedClass();
+ unsigned UseClass = UseMCID.getSchedClass();
- if (DefIdx < DefTID.getNumDefs() && UseIdx < UseTID.getNumOperands())
+ if (DefIdx < DefMCID.getNumDefs() && UseIdx < UseMCID.getNumOperands())
return ItinData->getOperandLatency(DefClass, DefIdx, UseClass, UseIdx);
// This may be a def / use of a variable_ops instruction, the operand
@@ -2066,7 +2065,7 @@ ARMBaseInstrInfo::getOperandLatency(const InstrItineraryData *ItinData,
// figure it out.
int DefCycle = -1;
bool LdmBypass = false;
- switch (DefTID.getOpcode()) {
+ switch (DefMCID.getOpcode()) {
default:
DefCycle = ItinData->getOperandCycle(DefClass, DefIdx);
break;
@@ -2077,7 +2076,7 @@ ARMBaseInstrInfo::getOperandLatency(const InstrItineraryData *ItinData,
case ARM::VLDMSIA:
case ARM::VLDMSIA_UPD:
case ARM::VLDMSDB_UPD:
- DefCycle = getVLDMDefCycle(ItinData, DefTID, DefClass, DefIdx, DefAlign);
+ DefCycle = getVLDMDefCycle(ItinData, DefMCID, DefClass, DefIdx, DefAlign);
break;
case ARM::LDMIA_RET:
@@ -2098,7 +2097,7 @@ ARMBaseInstrInfo::getOperandLatency(const InstrItineraryData *ItinData,
case ARM::t2LDMIA_UPD:
case ARM::t2LDMDB_UPD:
LdmBypass = 1;
- DefCycle = getLDMDefCycle(ItinData, DefTID, DefClass, DefIdx, DefAlign);
+ DefCycle = getLDMDefCycle(ItinData, DefMCID, DefClass, DefIdx, DefAlign);
break;
}
@@ -2107,7 +2106,7 @@ ARMBaseInstrInfo::getOperandLatency(const InstrItineraryData *ItinData,
DefCycle = 2;
int UseCycle = -1;
- switch (UseTID.getOpcode()) {
+ switch (UseMCID.getOpcode()) {
default:
UseCycle = ItinData->getOperandCycle(UseClass, UseIdx);
break;
@@ -2118,7 +2117,7 @@ ARMBaseInstrInfo::getOperandLatency(const InstrItineraryData *ItinData,
case ARM::VSTMSIA:
case ARM::VSTMSIA_UPD:
case ARM::VSTMSDB_UPD:
- UseCycle = getVSTMUseCycle(ItinData, UseTID, UseClass, UseIdx, UseAlign);
+ UseCycle = getVSTMUseCycle(ItinData, UseMCID, UseClass, UseIdx, UseAlign);
break;
case ARM::STMIA:
@@ -2137,7 +2136,7 @@ ARMBaseInstrInfo::getOperandLatency(const InstrItineraryData *ItinData,
case ARM::t2STMDB:
case ARM::t2STMIA_UPD:
case ARM::t2STMDB_UPD:
- UseCycle = getSTMUseCycle(ItinData, UseTID, UseClass, UseIdx, UseAlign);
+ UseCycle = getSTMUseCycle(ItinData, UseMCID, UseClass, UseIdx, UseAlign);
break;
}
@@ -2150,7 +2149,7 @@ ARMBaseInstrInfo::getOperandLatency(const InstrItineraryData *ItinData,
if (LdmBypass) {
// It's a variable_ops instruction so we can't use DefIdx here. Just use
// first def operand.
- if (ItinData->hasPipelineForwarding(DefClass, DefTID.getNumOperands()-1,
+ if (ItinData->hasPipelineForwarding(DefClass, DefMCID.getNumOperands()-1,
UseClass, UseIdx))
--UseCycle;
} else if (ItinData->hasPipelineForwarding(DefClass, DefIdx,
@@ -2170,11 +2169,11 @@ ARMBaseInstrInfo::getOperandLatency(const InstrItineraryData *ItinData,
DefMI->isRegSequence() || DefMI->isImplicitDef())
return 1;
- const TargetInstrDesc &DefTID = DefMI->getDesc();
+ const MCInstrDesc &DefMCID = DefMI->getDesc();
if (!ItinData || ItinData->isEmpty())
- return DefTID.mayLoad() ? 3 : 1;
+ return DefMCID.mayLoad() ? 3 : 1;
- const TargetInstrDesc &UseTID = UseMI->getDesc();
+ const MCInstrDesc &UseMCID = UseMI->getDesc();
const MachineOperand &DefMO = DefMI->getOperand(DefIdx);
if (DefMO.getReg() == ARM::CPSR) {
if (DefMI->getOpcode() == ARM::FMSTAT) {
@@ -2183,7 +2182,7 @@ ARMBaseInstrInfo::getOperandLatency(const InstrItineraryData *ItinData,
}
// CPSR set and branch can be paired in the same cycle.
- if (UseTID.isBranch())
+ if (UseMCID.isBranch())
return 0;
}
@@ -2191,14 +2190,14 @@ ARMBaseInstrInfo::getOperandLatency(const InstrItineraryData *ItinData,
? (*DefMI->memoperands_begin())->getAlignment() : 0;
unsigned UseAlign = UseMI->hasOneMemOperand()
? (*UseMI->memoperands_begin())->getAlignment() : 0;
- int Latency = getOperandLatency(ItinData, DefTID, DefIdx, DefAlign,
- UseTID, UseIdx, UseAlign);
+ int Latency = getOperandLatency(ItinData, DefMCID, DefIdx, DefAlign,
+ UseMCID, UseIdx, UseAlign);
if (Latency > 1 &&
(Subtarget.isCortexA8() || Subtarget.isCortexA9())) {
// FIXME: Shifter op hack: no shift (i.e. [r +/- r]) or [r + r << 2]
// variants are one cycle cheaper.
- switch (DefTID.getOpcode()) {
+ switch (DefMCID.getOpcode()) {
default: break;
case ARM::LDRrs:
case ARM::LDRBrs: {
@@ -2223,7 +2222,7 @@ ARMBaseInstrInfo::getOperandLatency(const InstrItineraryData *ItinData,
}
if (DefAlign < 8 && Subtarget.isCortexA9())
- switch (DefTID.getOpcode()) {
+ switch (DefMCID.getOpcode()) {
default: break;
case ARM::VLD1q8:
case ARM::VLD1q16:
@@ -2327,37 +2326,37 @@ ARMBaseInstrInfo::getOperandLatency(const InstrItineraryData *ItinData,
if (!DefNode->isMachineOpcode())
return 1;
- const TargetInstrDesc &DefTID = get(DefNode->getMachineOpcode());
+ const MCInstrDesc &DefMCID = get(DefNode->getMachineOpcode());
- if (isZeroCost(DefTID.Opcode))
+ if (isZeroCost(DefMCID.Opcode))
return 0;
if (!ItinData || ItinData->isEmpty())
- return DefTID.mayLoad() ? 3 : 1;
+ return DefMCID.mayLoad() ? 3 : 1;
if (!UseNode->isMachineOpcode()) {
- int Latency = ItinData->getOperandCycle(DefTID.getSchedClass(), DefIdx);
+ int Latency = ItinData->getOperandCycle(DefMCID.getSchedClass(), DefIdx);
if (Subtarget.isCortexA9())
return Latency <= 2 ? 1 : Latency - 1;
else
return Latency <= 3 ? 1 : Latency - 2;
}
- const TargetInstrDesc &UseTID = get(UseNode->getMachineOpcode());
+ const MCInstrDesc &UseMCID = get(UseNode->getMachineOpcode());
const MachineSDNode *DefMN = dyn_cast<MachineSDNode>(DefNode);
unsigned DefAlign = !DefMN->memoperands_empty()
? (*DefMN->memoperands_begin())->getAlignment() : 0;
const MachineSDNode *UseMN = dyn_cast<MachineSDNode>(UseNode);
unsigned UseAlign = !UseMN->memoperands_empty()
? (*UseMN->memoperands_begin())->getAlignment() : 0;
- int Latency = getOperandLatency(ItinData, DefTID, DefIdx, DefAlign,
- UseTID, UseIdx, UseAlign);
+ int Latency = getOperandLatency(ItinData, DefMCID, DefIdx, DefAlign,
+ UseMCID, UseIdx, UseAlign);
if (Latency > 1 &&
(Subtarget.isCortexA8() || Subtarget.isCortexA9())) {
// FIXME: Shifter op hack: no shift (i.e. [r +/- r]) or [r + r << 2]
// variants are one cycle cheaper.
- switch (DefTID.getOpcode()) {
+ switch (DefMCID.getOpcode()) {
default: break;
case ARM::LDRrs:
case ARM::LDRBrs: {
@@ -2384,7 +2383,7 @@ ARMBaseInstrInfo::getOperandLatency(const InstrItineraryData *ItinData,
}
if (DefAlign < 8 && Subtarget.isCortexA9())
- switch (DefTID.getOpcode()) {
+ switch (DefMCID.getOpcode()) {
default: break;
case ARM::VLD1q8Pseudo:
case ARM::VLD1q16Pseudo:
@@ -2503,10 +2502,10 @@ int ARMBaseInstrInfo::getInstrLatency(const InstrItineraryData *ItinData,
if (!ItinData || ItinData->isEmpty())
return 1;
- const TargetInstrDesc &TID = MI->getDesc();
- unsigned Class = TID.getSchedClass();
+ const MCInstrDesc &MCID = MI->getDesc();
+ unsigned Class = MCID.getSchedClass();
unsigned UOps = ItinData->Itineraries[Class].NumMicroOps;
- if (PredCost && TID.hasImplicitDefOfPhysReg(ARM::CPSR))
+ if (PredCost && MCID.hasImplicitDefOfPhysReg(ARM::CPSR))
// When predicated, CPSR is an additional source operand for CPSR updating
// instructions, this apparently increases their latencies.
*PredCost = 1;
diff --git a/contrib/llvm/lib/Target/ARM/ARMBaseInstrInfo.h b/contrib/llvm/lib/Target/ARM/ARMBaseInstrInfo.h
index 9a2faf8..507e897 100644
--- a/contrib/llvm/lib/Target/ARM/ARMBaseInstrInfo.h
+++ b/contrib/llvm/lib/Target/ARM/ARMBaseInstrInfo.h
@@ -20,6 +20,9 @@
#include "llvm/ADT/DenseMap.h"
#include "llvm/ADT/SmallSet.h"
+#define GET_INSTRINFO_HEADER
+#include "ARMGenInstrInfo.inc"
+
namespace llvm {
class ARMSubtarget;
class ARMBaseRegisterInfo;
@@ -36,24 +39,16 @@ namespace ARMII {
// This four-bit field describes the addressing mode used.
AddrModeMask = 0x1f, // The AddrMode enums are declared in ARMBaseInfo.h
- // Size* - Flags to keep track of the size of an instruction.
- SizeShift = 5,
- SizeMask = 7 << SizeShift,
- SizeSpecial = 1, // 0 byte pseudo or special case.
- Size8Bytes = 2,
- Size4Bytes = 3,
- Size2Bytes = 4,
-
// IndexMode - Unindex, pre-indexed, or post-indexed are valid for load
// and store ops only. Generic "updating" flag is used for ld/st multiple.
// The index mode enums are declared in ARMBaseInfo.h
- IndexModeShift = 8,
+ IndexModeShift = 5,
IndexModeMask = 3 << IndexModeShift,
//===------------------------------------------------------------------===//
// Instruction encoding formats.
//
- FormShift = 10,
+ FormShift = 7,
FormMask = 0x3f << FormShift,
// Pseudo instructions
@@ -126,15 +121,15 @@ namespace ARMII {
// UnaryDP - Indicates this is a unary data processing instruction, i.e.
// it doesn't have a Rn operand.
- UnaryDP = 1 << 16,
+ UnaryDP = 1 << 13,
// Xform16Bit - Indicates this Thumb2 instruction may be transformed into
// a 16-bit Thumb instruction if certain conditions are met.
- Xform16Bit = 1 << 17,
+ Xform16Bit = 1 << 14,
//===------------------------------------------------------------------===//
// Code domain.
- DomainShift = 18,
+ DomainShift = 15,
DomainMask = 7 << DomainShift,
DomainGeneral = 0 << DomainShift,
DomainVFP = 1 << DomainShift,
@@ -172,7 +167,7 @@ namespace ARMII {
};
}
-class ARMBaseInstrInfo : public TargetInstrInfoImpl {
+class ARMBaseInstrInfo : public ARMGenInstrInfo {
const ARMSubtarget &Subtarget;
protected:
@@ -291,8 +286,8 @@ public:
int64_t &Offset1, int64_t &Offset2)const;
/// shouldScheduleLoadsNear - This is a used by the pre-regalloc scheduler to
- /// determine (in conjunction with areLoadsFromSameBasePtr) if two loads should
- /// be scheduled togther. On some targets if two loads are loading from
+ /// determine (in conjunction with areLoadsFromSameBasePtr) if two loads
+ /// should be scheduled togther. On some targets if two loads are loading from
/// addresses in the same cache line, it's better if they are scheduled
/// together. This function takes two integers that represent the load offsets
/// from the common base address. It returns true if it decides it's desirable
@@ -308,18 +303,18 @@ public:
virtual bool isProfitableToIfCvt(MachineBasicBlock &MBB,
unsigned NumCycles, unsigned ExtraPredCycles,
- float Prob, float Confidence) const;
+ const BranchProbability &Probability) const;
virtual bool isProfitableToIfCvt(MachineBasicBlock &TMBB,
unsigned NumT, unsigned ExtraT,
MachineBasicBlock &FMBB,
unsigned NumF, unsigned ExtraF,
- float Probability, float Confidence) const;
+ const BranchProbability &Probability) const;
virtual bool isProfitableToDupForIfCvt(MachineBasicBlock &MBB,
unsigned NumCycles,
- float Probability,
- float Confidence) const {
+ const BranchProbability
+ &Probability) const {
return NumCycles == 1;
}
@@ -353,25 +348,25 @@ public:
SDNode *UseNode, unsigned UseIdx) const;
private:
int getVLDMDefCycle(const InstrItineraryData *ItinData,
- const TargetInstrDesc &DefTID,
+ const MCInstrDesc &DefMCID,
unsigned DefClass,
unsigned DefIdx, unsigned DefAlign) const;
int getLDMDefCycle(const InstrItineraryData *ItinData,
- const TargetInstrDesc &DefTID,
+ const MCInstrDesc &DefMCID,
unsigned DefClass,
unsigned DefIdx, unsigned DefAlign) const;
int getVSTMUseCycle(const InstrItineraryData *ItinData,
- const TargetInstrDesc &UseTID,
+ const MCInstrDesc &UseMCID,
unsigned UseClass,
unsigned UseIdx, unsigned UseAlign) const;
int getSTMUseCycle(const InstrItineraryData *ItinData,
- const TargetInstrDesc &UseTID,
+ const MCInstrDesc &UseMCID,
unsigned UseClass,
unsigned UseIdx, unsigned UseAlign) const;
int getOperandLatency(const InstrItineraryData *ItinData,
- const TargetInstrDesc &DefTID,
+ const MCInstrDesc &DefMCID,
unsigned DefIdx, unsigned DefAlign,
- const TargetInstrDesc &UseTID,
+ const MCInstrDesc &UseMCID,
unsigned UseIdx, unsigned UseAlign) const;
int getInstrLatency(const InstrItineraryData *ItinData,
diff --git a/contrib/llvm/lib/Target/ARM/ARMBaseRegisterInfo.cpp b/contrib/llvm/lib/Target/ARM/ARMBaseRegisterInfo.cpp
index 4ab37f6..ba42295 100644
--- a/contrib/llvm/lib/Target/ARM/ARMBaseRegisterInfo.cpp
+++ b/contrib/llvm/lib/Target/ARM/ARMBaseRegisterInfo.cpp
@@ -40,6 +40,9 @@
#include "llvm/ADT/SmallVector.h"
#include "llvm/Support/CommandLine.h"
+#define GET_REGINFO_TARGET_DESC
+#include "ARMGenRegisterInfo.inc"
+
using namespace llvm;
static cl::opt<bool>
@@ -54,8 +57,7 @@ EnableBasePointer("arm-use-base-pointer", cl::Hidden, cl::init(true),
ARMBaseRegisterInfo::ARMBaseRegisterInfo(const ARMBaseInstrInfo &tii,
const ARMSubtarget &sti)
- : ARMGenRegisterInfo(ARM::ADJCALLSTACKDOWN, ARM::ADJCALLSTACKUP),
- TII(tii), STI(sti),
+ : ARMGenRegisterInfo(), TII(tii), STI(sti),
FramePtr((STI.isTargetDarwin() || STI.isThumb()) ? ARM::R7 : ARM::R11),
BasePtr(ARM::R6) {
}
@@ -100,6 +102,12 @@ getReservedRegs(const MachineFunction &MF) const {
// Some targets reserve R9.
if (STI.isR9Reserved())
Reserved.set(ARM::R9);
+ // Reserve D16-D31 if the subtarget doesn't support them.
+ if (!STI.hasVFP3() || STI.hasD16()) {
+ assert(ARM::D31 == ARM::D16 + 15);
+ for (unsigned i = 0; i != 16; ++i)
+ Reserved.set(ARM::D16 + i);
+ }
return Reserved;
}
@@ -387,12 +395,12 @@ ARMBaseRegisterInfo::getRegPressureLimit(const TargetRegisterClass *RC,
}
}
-/// getAllocationOrder - Returns the register allocation order for a specified
-/// register class in the form of a pair of TargetRegisterClass iterators.
-std::pair<TargetRegisterClass::iterator,TargetRegisterClass::iterator>
-ARMBaseRegisterInfo::getAllocationOrder(const TargetRegisterClass *RC,
- unsigned HintType, unsigned HintReg,
- const MachineFunction &MF) const {
+/// getRawAllocationOrder - Returns the register allocation order for a
+/// specified register class with a target-dependent hint.
+ArrayRef<unsigned>
+ARMBaseRegisterInfo::getRawAllocationOrder(const TargetRegisterClass *RC,
+ unsigned HintType, unsigned HintReg,
+ const MachineFunction &MF) const {
const TargetFrameLowering *TFI = MF.getTarget().getFrameLowering();
// Alternative register allocation orders when favoring even / odd registers
// of register pairs.
@@ -469,70 +477,54 @@ ARMBaseRegisterInfo::getAllocationOrder(const TargetRegisterClass *RC,
// We only support even/odd hints for GPR and rGPR.
if (RC != ARM::GPRRegisterClass && RC != ARM::rGPRRegisterClass)
- return std::make_pair(RC->allocation_order_begin(MF),
- RC->allocation_order_end(MF));
+ return RC->getRawAllocationOrder(MF);
if (HintType == ARMRI::RegPairEven) {
if (isPhysicalRegister(HintReg) && getRegisterPairEven(HintReg, MF) == 0)
// It's no longer possible to fulfill this hint. Return the default
// allocation order.
- return std::make_pair(RC->allocation_order_begin(MF),
- RC->allocation_order_end(MF));
+ return RC->getRawAllocationOrder(MF);
if (!TFI->hasFP(MF)) {
if (!STI.isR9Reserved())
- return std::make_pair(GPREven1,
- GPREven1 + (sizeof(GPREven1)/sizeof(unsigned)));
+ return ArrayRef<unsigned>(GPREven1);
else
- return std::make_pair(GPREven4,
- GPREven4 + (sizeof(GPREven4)/sizeof(unsigned)));
+ return ArrayRef<unsigned>(GPREven4);
} else if (FramePtr == ARM::R7) {
if (!STI.isR9Reserved())
- return std::make_pair(GPREven2,
- GPREven2 + (sizeof(GPREven2)/sizeof(unsigned)));
+ return ArrayRef<unsigned>(GPREven2);
else
- return std::make_pair(GPREven5,
- GPREven5 + (sizeof(GPREven5)/sizeof(unsigned)));
+ return ArrayRef<unsigned>(GPREven5);
} else { // FramePtr == ARM::R11
if (!STI.isR9Reserved())
- return std::make_pair(GPREven3,
- GPREven3 + (sizeof(GPREven3)/sizeof(unsigned)));
+ return ArrayRef<unsigned>(GPREven3);
else
- return std::make_pair(GPREven6,
- GPREven6 + (sizeof(GPREven6)/sizeof(unsigned)));
+ return ArrayRef<unsigned>(GPREven6);
}
} else if (HintType == ARMRI::RegPairOdd) {
if (isPhysicalRegister(HintReg) && getRegisterPairOdd(HintReg, MF) == 0)
// It's no longer possible to fulfill this hint. Return the default
// allocation order.
- return std::make_pair(RC->allocation_order_begin(MF),
- RC->allocation_order_end(MF));
+ return RC->getRawAllocationOrder(MF);
if (!TFI->hasFP(MF)) {
if (!STI.isR9Reserved())
- return std::make_pair(GPROdd1,
- GPROdd1 + (sizeof(GPROdd1)/sizeof(unsigned)));
+ return ArrayRef<unsigned>(GPROdd1);
else
- return std::make_pair(GPROdd4,
- GPROdd4 + (sizeof(GPROdd4)/sizeof(unsigned)));
+ return ArrayRef<unsigned>(GPROdd4);
} else if (FramePtr == ARM::R7) {
if (!STI.isR9Reserved())
- return std::make_pair(GPROdd2,
- GPROdd2 + (sizeof(GPROdd2)/sizeof(unsigned)));
+ return ArrayRef<unsigned>(GPROdd2);
else
- return std::make_pair(GPROdd5,
- GPROdd5 + (sizeof(GPROdd5)/sizeof(unsigned)));
+ return ArrayRef<unsigned>(GPROdd5);
} else { // FramePtr == ARM::R11
if (!STI.isR9Reserved())
- return std::make_pair(GPROdd3,
- GPROdd3 + (sizeof(GPROdd3)/sizeof(unsigned)));
+ return ArrayRef<unsigned>(GPROdd3);
else
- return std::make_pair(GPROdd6,
- GPROdd6 + (sizeof(GPROdd6)/sizeof(unsigned)));
+ return ArrayRef<unsigned>(GPROdd6);
}
}
- return std::make_pair(RC->allocation_order_begin(MF),
- RC->allocation_order_end(MF));
+ return RC->getRawAllocationOrder(MF);
}
/// ResolveRegAllocHint - Resolves the specified register allocation hint
@@ -965,7 +957,7 @@ eliminateCallFramePseudoInstr(MachineFunction &MF, MachineBasicBlock &MBB,
int64_t ARMBaseRegisterInfo::
getFrameIndexInstrOffset(const MachineInstr *MI, int Idx) const {
- const TargetInstrDesc &Desc = MI->getDesc();
+ const MCInstrDesc &Desc = MI->getDesc();
unsigned AddrMode = (Desc.TSFlags & ARMII::AddrModeMask);
int64_t InstrOffs = 0;;
int Scale = 1;
@@ -1115,11 +1107,11 @@ materializeFrameBaseRegister(MachineBasicBlock *MBB,
if (Ins != MBB->end())
DL = Ins->getDebugLoc();
- const TargetInstrDesc &TID = TII.get(ADDriOpc);
+ const MCInstrDesc &MCID = TII.get(ADDriOpc);
MachineRegisterInfo &MRI = MBB->getParent()->getRegInfo();
- MRI.constrainRegClass(BaseReg, TID.OpInfo[0].getRegClass(this));
+ MRI.constrainRegClass(BaseReg, TII.getRegClass(MCID, 0, this));
- MachineInstrBuilder MIB = BuildMI(*MBB, Ins, DL, TID, BaseReg)
+ MachineInstrBuilder MIB = BuildMI(*MBB, Ins, DL, MCID, BaseReg)
.addFrameIndex(FrameIdx).addImm(Offset);
if (!AFI->isThumb1OnlyFunction())
@@ -1155,7 +1147,7 @@ ARMBaseRegisterInfo::resolveFrameIndex(MachineBasicBlock::iterator I,
bool ARMBaseRegisterInfo::isFrameOffsetLegal(const MachineInstr *MI,
int64_t Offset) const {
- const TargetInstrDesc &Desc = MI->getDesc();
+ const MCInstrDesc &Desc = MI->getDesc();
unsigned AddrMode = (Desc.TSFlags & ARMII::AddrModeMask);
unsigned i = 0;
@@ -1291,11 +1283,5 @@ ARMBaseRegisterInfo::eliminateFrameIndex(MachineBasicBlock::iterator II,
}
// Update the original instruction to use the scratch register.
MI.getOperand(i).ChangeToRegister(ScratchReg, false, false, true);
- if (MI.getOpcode() == ARM::t2ADDrSPi)
- MI.setDesc(TII.get(ARM::t2ADDri));
- else if (MI.getOpcode() == ARM::t2SUBrSPi)
- MI.setDesc(TII.get(ARM::t2SUBri));
}
}
-
-#include "ARMGenRegisterInfo.inc"
diff --git a/contrib/llvm/lib/Target/ARM/ARMBaseRegisterInfo.h b/contrib/llvm/lib/Target/ARM/ARMBaseRegisterInfo.h
index c60d75a..b4b4059 100644
--- a/contrib/llvm/lib/Target/ARM/ARMBaseRegisterInfo.h
+++ b/contrib/llvm/lib/Target/ARM/ARMBaseRegisterInfo.h
@@ -16,7 +16,9 @@
#include "ARM.h"
#include "llvm/Target/TargetRegisterInfo.h"
-#include "ARMGenRegisterInfo.h.inc"
+
+#define GET_REGINFO_HEADER
+#include "ARMGenRegisterInfo.inc"
namespace llvm {
class ARMSubtarget;
@@ -134,10 +136,9 @@ public:
unsigned getRegPressureLimit(const TargetRegisterClass *RC,
MachineFunction &MF) const;
- std::pair<TargetRegisterClass::iterator,TargetRegisterClass::iterator>
- getAllocationOrder(const TargetRegisterClass *RC,
- unsigned HintType, unsigned HintReg,
- const MachineFunction &MF) const;
+ ArrayRef<unsigned> getRawAllocationOrder(const TargetRegisterClass *RC,
+ unsigned HintType, unsigned HintReg,
+ const MachineFunction &MF) const;
unsigned ResolveRegAllocHint(unsigned Type, unsigned Reg,
const MachineFunction &MF) const;
diff --git a/contrib/llvm/lib/Target/ARM/ARMCodeEmitter.cpp b/contrib/llvm/lib/Target/ARM/ARMCodeEmitter.cpp
index 16d4ca5..d6fca62 100644
--- a/contrib/llvm/lib/Target/ARM/ARMCodeEmitter.cpp
+++ b/contrib/llvm/lib/Target/ARM/ARMCodeEmitter.cpp
@@ -96,13 +96,13 @@ namespace {
void addPCLabel(unsigned LabelID);
void emitPseudoInstruction(const MachineInstr &MI);
unsigned getMachineSoRegOpValue(const MachineInstr &MI,
- const TargetInstrDesc &TID,
+ const MCInstrDesc &MCID,
const MachineOperand &MO,
unsigned OpIdx);
unsigned getMachineSoImmOpValue(unsigned SoImm);
unsigned getAddrModeSBit(const MachineInstr &MI,
- const TargetInstrDesc &TID) const;
+ const MCInstrDesc &MCID) const;
void emitDataProcessingInstruction(const MachineInstr &MI,
unsigned ImplicitRd = 0,
@@ -443,9 +443,9 @@ unsigned ARMCodeEmitter::getMachineOpValue(const MachineInstr &MI,
else if (MO.isSymbol())
emitExternalSymbolAddress(MO.getSymbolName(), ARM::reloc_arm_branch);
else if (MO.isCPI()) {
- const TargetInstrDesc &TID = MI.getDesc();
+ const MCInstrDesc &MCID = MI.getDesc();
// For VFP load, the immediate offset is multiplied by 4.
- unsigned Reloc = ((TID.TSFlags & ARMII::FormMask) == ARMII::VFPLdStFrm)
+ unsigned Reloc = ((MCID.TSFlags & ARMII::FormMask) == ARMII::VFPLdStFrm)
? ARM::reloc_arm_vfp_cp_entry : ARM::reloc_arm_cp_entry;
emitConstPoolAddress(MO.getIndex(), Reloc);
} else if (MO.isJTI())
@@ -757,7 +757,7 @@ void ARMCodeEmitter::emitMOVi2piecesInstruction(const MachineInstr &MI) {
void ARMCodeEmitter::emitLEApcrelJTInstruction(const MachineInstr &MI) {
// It's basically add r, pc, (LJTI - $+8)
- const TargetInstrDesc &TID = MI.getDesc();
+ const MCInstrDesc &MCID = MI.getDesc();
// Emit the 'add' instruction.
unsigned Binary = 0x4 << 21; // add: Insts{24-21} = 0b0100
@@ -766,7 +766,7 @@ void ARMCodeEmitter::emitLEApcrelJTInstruction(const MachineInstr &MI) {
Binary |= II->getPredicate(&MI) << ARMII::CondShift;
// Encode S bit if MI modifies CPSR.
- Binary |= getAddrModeSBit(MI, TID);
+ Binary |= getAddrModeSBit(MI, MCID);
// Encode Rd.
Binary |= getMachineOpValue(MI, 0) << ARMII::RegRdShift;
@@ -912,7 +912,7 @@ void ARMCodeEmitter::emitPseudoInstruction(const MachineInstr &MI) {
}
unsigned ARMCodeEmitter::getMachineSoRegOpValue(const MachineInstr &MI,
- const TargetInstrDesc &TID,
+ const MCInstrDesc &MCID,
const MachineOperand &MO,
unsigned OpIdx) {
unsigned Binary = getMachineOpValue(MI, MO);
@@ -982,8 +982,8 @@ unsigned ARMCodeEmitter::getMachineSoImmOpValue(unsigned SoImm) {
}
unsigned ARMCodeEmitter::getAddrModeSBit(const MachineInstr &MI,
- const TargetInstrDesc &TID) const {
- for (unsigned i = MI.getNumOperands(), e = TID.getNumOperands(); i >= e; --i){
+ const MCInstrDesc &MCID) const {
+ for (unsigned i = MI.getNumOperands(), e = MCID.getNumOperands(); i >= e; --i){
const MachineOperand &MO = MI.getOperand(i-1);
if (MO.isReg() && MO.isDef() && MO.getReg() == ARM::CPSR)
return 1 << ARMII::S_BitShift;
@@ -994,7 +994,7 @@ unsigned ARMCodeEmitter::getAddrModeSBit(const MachineInstr &MI,
void ARMCodeEmitter::emitDataProcessingInstruction(const MachineInstr &MI,
unsigned ImplicitRd,
unsigned ImplicitRn) {
- const TargetInstrDesc &TID = MI.getDesc();
+ const MCInstrDesc &MCID = MI.getDesc();
// Part of binary is determined by TableGn.
unsigned Binary = getBinaryCodeForInstr(MI);
@@ -1003,10 +1003,10 @@ void ARMCodeEmitter::emitDataProcessingInstruction(const MachineInstr &MI,
Binary |= II->getPredicate(&MI) << ARMII::CondShift;
// Encode S bit if MI modifies CPSR.
- Binary |= getAddrModeSBit(MI, TID);
+ Binary |= getAddrModeSBit(MI, MCID);
// Encode register def if there is one.
- unsigned NumDefs = TID.getNumDefs();
+ unsigned NumDefs = MCID.getNumDefs();
unsigned OpIdx = 0;
if (NumDefs)
Binary |= getMachineOpValue(MI, OpIdx++) << ARMII::RegRdShift;
@@ -1014,7 +1014,7 @@ void ARMCodeEmitter::emitDataProcessingInstruction(const MachineInstr &MI,
// Special handling for implicit use (e.g. PC).
Binary |= (getARMRegisterNumbering(ImplicitRd) << ARMII::RegRdShift);
- if (TID.Opcode == ARM::MOVi16) {
+ if (MCID.Opcode == ARM::MOVi16) {
// Get immediate from MI.
unsigned Lo16 = getMovi32Value(MI, MI.getOperand(OpIdx),
ARM::reloc_arm_movw);
@@ -1023,14 +1023,14 @@ void ARMCodeEmitter::emitDataProcessingInstruction(const MachineInstr &MI,
Binary |= ((Lo16 >> 12) & 0xF) << 16;
emitWordLE(Binary);
return;
- } else if(TID.Opcode == ARM::MOVTi16) {
+ } else if(MCID.Opcode == ARM::MOVTi16) {
unsigned Hi16 = (getMovi32Value(MI, MI.getOperand(OpIdx),
ARM::reloc_arm_movt) >> 16);
Binary |= Hi16 & 0xFFF;
Binary |= ((Hi16 >> 12) & 0xF) << 16;
emitWordLE(Binary);
return;
- } else if ((TID.Opcode == ARM::BFC) || (TID.Opcode == ARM::BFI)) {
+ } else if ((MCID.Opcode == ARM::BFC) || (MCID.Opcode == ARM::BFI)) {
uint32_t v = ~MI.getOperand(2).getImm();
int32_t lsb = CountTrailingZeros_32(v);
int32_t msb = (32 - CountLeadingZeros_32(v)) - 1;
@@ -1039,7 +1039,7 @@ void ARMCodeEmitter::emitDataProcessingInstruction(const MachineInstr &MI,
Binary |= (lsb & 0x1F) << 7;
emitWordLE(Binary);
return;
- } else if ((TID.Opcode == ARM::UBFX) || (TID.Opcode == ARM::SBFX)) {
+ } else if ((MCID.Opcode == ARM::UBFX) || (MCID.Opcode == ARM::SBFX)) {
// Encode Rn in Instr{0-3}
Binary |= getMachineOpValue(MI, OpIdx++);
@@ -1054,11 +1054,11 @@ void ARMCodeEmitter::emitDataProcessingInstruction(const MachineInstr &MI,
}
// If this is a two-address operand, skip it. e.g. MOVCCr operand 1.
- if (TID.getOperandConstraint(OpIdx, TOI::TIED_TO) != -1)
+ if (MCID.getOperandConstraint(OpIdx, MCOI::TIED_TO) != -1)
++OpIdx;
// Encode first non-shifter register operand if there is one.
- bool isUnary = TID.TSFlags & ARMII::UnaryDP;
+ bool isUnary = MCID.TSFlags & ARMII::UnaryDP;
if (!isUnary) {
if (ImplicitRn)
// Special handling for implicit use (e.g. PC).
@@ -1071,9 +1071,9 @@ void ARMCodeEmitter::emitDataProcessingInstruction(const MachineInstr &MI,
// Encode shifter operand.
const MachineOperand &MO = MI.getOperand(OpIdx);
- if ((TID.TSFlags & ARMII::FormMask) == ARMII::DPSoRegFrm) {
+ if ((MCID.TSFlags & ARMII::FormMask) == ARMII::DPSoRegFrm) {
// Encode SoReg.
- emitWordLE(Binary | getMachineSoRegOpValue(MI, TID, MO, OpIdx));
+ emitWordLE(Binary | getMachineSoRegOpValue(MI, MCID, MO, OpIdx));
return;
}
@@ -1092,9 +1092,9 @@ void ARMCodeEmitter::emitDataProcessingInstruction(const MachineInstr &MI,
void ARMCodeEmitter::emitLoadStoreInstruction(const MachineInstr &MI,
unsigned ImplicitRd,
unsigned ImplicitRn) {
- const TargetInstrDesc &TID = MI.getDesc();
- unsigned Form = TID.TSFlags & ARMII::FormMask;
- bool IsPrePost = (TID.TSFlags & ARMII::IndexModeMask) != 0;
+ const MCInstrDesc &MCID = MI.getDesc();
+ unsigned Form = MCID.TSFlags & ARMII::FormMask;
+ bool IsPrePost = (MCID.TSFlags & ARMII::IndexModeMask) != 0;
// Part of binary is determined by TableGn.
unsigned Binary = getBinaryCodeForInstr(MI);
@@ -1134,7 +1134,7 @@ void ARMCodeEmitter::emitLoadStoreInstruction(const MachineInstr &MI,
Binary |= getMachineOpValue(MI, OpIdx++) << ARMII::RegRnShift;
// If this is a two-address operand, skip it. e.g. LDR_PRE.
- if (!Skipped && TID.getOperandConstraint(OpIdx, TOI::TIED_TO) != -1)
+ if (!Skipped && MCID.getOperandConstraint(OpIdx, MCOI::TIED_TO) != -1)
++OpIdx;
const MachineOperand &MO2 = MI.getOperand(OpIdx);
@@ -1170,9 +1170,9 @@ void ARMCodeEmitter::emitLoadStoreInstruction(const MachineInstr &MI,
void ARMCodeEmitter::emitMiscLoadStoreInstruction(const MachineInstr &MI,
unsigned ImplicitRn) {
- const TargetInstrDesc &TID = MI.getDesc();
- unsigned Form = TID.TSFlags & ARMII::FormMask;
- bool IsPrePost = (TID.TSFlags & ARMII::IndexModeMask) != 0;
+ const MCInstrDesc &MCID = MI.getDesc();
+ unsigned Form = MCID.TSFlags & ARMII::FormMask;
+ bool IsPrePost = (MCID.TSFlags & ARMII::IndexModeMask) != 0;
// Part of binary is determined by TableGn.
unsigned Binary = getBinaryCodeForInstr(MI);
@@ -1194,7 +1194,7 @@ void ARMCodeEmitter::emitMiscLoadStoreInstruction(const MachineInstr &MI,
Binary |= getMachineOpValue(MI, OpIdx++) << ARMII::RegRdShift;
// Skip LDRD and STRD's second operand.
- if (TID.Opcode == ARM::LDRD || TID.Opcode == ARM::STRD)
+ if (MCID.Opcode == ARM::LDRD || MCID.Opcode == ARM::STRD)
++OpIdx;
// Set second operand
@@ -1205,7 +1205,7 @@ void ARMCodeEmitter::emitMiscLoadStoreInstruction(const MachineInstr &MI,
Binary |= getMachineOpValue(MI, OpIdx++) << ARMII::RegRnShift;
// If this is a two-address operand, skip it. e.g. LDRH_POST.
- if (!Skipped && TID.getOperandConstraint(OpIdx, TOI::TIED_TO) != -1)
+ if (!Skipped && MCID.getOperandConstraint(OpIdx, MCOI::TIED_TO) != -1)
++OpIdx;
const MachineOperand &MO2 = MI.getOperand(OpIdx);
@@ -1255,8 +1255,8 @@ static unsigned getAddrModeUPBits(unsigned Mode) {
}
void ARMCodeEmitter::emitLoadStoreMultipleInstruction(const MachineInstr &MI) {
- const TargetInstrDesc &TID = MI.getDesc();
- bool IsUpdating = (TID.TSFlags & ARMII::IndexModeMask) != 0;
+ const MCInstrDesc &MCID = MI.getDesc();
+ bool IsUpdating = (MCID.TSFlags & ARMII::IndexModeMask) != 0;
// Part of binary is determined by TableGn.
unsigned Binary = getBinaryCodeForInstr(MI);
@@ -1295,7 +1295,7 @@ void ARMCodeEmitter::emitLoadStoreMultipleInstruction(const MachineInstr &MI) {
}
void ARMCodeEmitter::emitMulFrmInstruction(const MachineInstr &MI) {
- const TargetInstrDesc &TID = MI.getDesc();
+ const MCInstrDesc &MCID = MI.getDesc();
// Part of binary is determined by TableGn.
unsigned Binary = getBinaryCodeForInstr(MI);
@@ -1304,12 +1304,12 @@ void ARMCodeEmitter::emitMulFrmInstruction(const MachineInstr &MI) {
Binary |= II->getPredicate(&MI) << ARMII::CondShift;
// Encode S bit if MI modifies CPSR.
- Binary |= getAddrModeSBit(MI, TID);
+ Binary |= getAddrModeSBit(MI, MCID);
// 32x32->64bit operations have two destination registers. The number
// of register definitions will tell us if that's what we're dealing with.
unsigned OpIdx = 0;
- if (TID.getNumDefs() == 2)
+ if (MCID.getNumDefs() == 2)
Binary |= getMachineOpValue (MI, OpIdx++) << ARMII::RegRdLoShift;
// Encode Rd
@@ -1323,16 +1323,16 @@ void ARMCodeEmitter::emitMulFrmInstruction(const MachineInstr &MI) {
// Many multiple instructions (e.g. MLA) have three src operands. Encode
// it as Rn (for multiply, that's in the same offset as RdLo.
- if (TID.getNumOperands() > OpIdx &&
- !TID.OpInfo[OpIdx].isPredicate() &&
- !TID.OpInfo[OpIdx].isOptionalDef())
+ if (MCID.getNumOperands() > OpIdx &&
+ !MCID.OpInfo[OpIdx].isPredicate() &&
+ !MCID.OpInfo[OpIdx].isOptionalDef())
Binary |= getMachineOpValue(MI, OpIdx) << ARMII::RegRdLoShift;
emitWordLE(Binary);
}
void ARMCodeEmitter::emitExtendInstruction(const MachineInstr &MI) {
- const TargetInstrDesc &TID = MI.getDesc();
+ const MCInstrDesc &MCID = MI.getDesc();
// Part of binary is determined by TableGn.
unsigned Binary = getBinaryCodeForInstr(MI);
@@ -1361,15 +1361,15 @@ void ARMCodeEmitter::emitExtendInstruction(const MachineInstr &MI) {
// Encode rot imm (0, 8, 16, or 24) if it has a rotate immediate operand.
if (MI.getOperand(OpIdx).isImm() &&
- !TID.OpInfo[OpIdx].isPredicate() &&
- !TID.OpInfo[OpIdx].isOptionalDef())
+ !MCID.OpInfo[OpIdx].isPredicate() &&
+ !MCID.OpInfo[OpIdx].isOptionalDef())
Binary |= (getMachineOpValue(MI, OpIdx) / 8) << ARMII::ExtRotImmShift;
emitWordLE(Binary);
}
void ARMCodeEmitter::emitMiscArithInstruction(const MachineInstr &MI) {
- const TargetInstrDesc &TID = MI.getDesc();
+ const MCInstrDesc &MCID = MI.getDesc();
// Part of binary is determined by TableGn.
unsigned Binary = getBinaryCodeForInstr(MI);
@@ -1378,7 +1378,7 @@ void ARMCodeEmitter::emitMiscArithInstruction(const MachineInstr &MI) {
Binary |= II->getPredicate(&MI) << ARMII::CondShift;
// PKH instructions are finished at this point
- if (TID.Opcode == ARM::PKHBT || TID.Opcode == ARM::PKHTB) {
+ if (MCID.Opcode == ARM::PKHBT || MCID.Opcode == ARM::PKHTB) {
emitWordLE(Binary);
return;
}
@@ -1389,9 +1389,9 @@ void ARMCodeEmitter::emitMiscArithInstruction(const MachineInstr &MI) {
Binary |= getMachineOpValue(MI, OpIdx++) << ARMII::RegRdShift;
const MachineOperand &MO = MI.getOperand(OpIdx++);
- if (OpIdx == TID.getNumOperands() ||
- TID.OpInfo[OpIdx].isPredicate() ||
- TID.OpInfo[OpIdx].isOptionalDef()) {
+ if (OpIdx == MCID.getNumOperands() ||
+ MCID.OpInfo[OpIdx].isPredicate() ||
+ MCID.OpInfo[OpIdx].isOptionalDef()) {
// Encode Rm and it's done.
Binary |= getMachineOpValue(MI, MO);
emitWordLE(Binary);
@@ -1406,7 +1406,7 @@ void ARMCodeEmitter::emitMiscArithInstruction(const MachineInstr &MI) {
// Encode shift_imm.
unsigned ShiftAmt = MI.getOperand(OpIdx).getImm();
- if (TID.Opcode == ARM::PKHTB) {
+ if (MCID.Opcode == ARM::PKHTB) {
assert(ShiftAmt != 0 && "PKHTB shift_imm is 0!");
if (ShiftAmt == 32)
ShiftAmt = 0;
@@ -1418,7 +1418,7 @@ void ARMCodeEmitter::emitMiscArithInstruction(const MachineInstr &MI) {
}
void ARMCodeEmitter::emitSaturateInstruction(const MachineInstr &MI) {
- const TargetInstrDesc &TID = MI.getDesc();
+ const MCInstrDesc &MCID = MI.getDesc();
// Part of binary is determined by TableGen.
unsigned Binary = getBinaryCodeForInstr(MI);
@@ -1431,11 +1431,11 @@ void ARMCodeEmitter::emitSaturateInstruction(const MachineInstr &MI) {
// Encode saturate bit position.
unsigned Pos = MI.getOperand(1).getImm();
- if (TID.Opcode == ARM::SSAT || TID.Opcode == ARM::SSAT16)
+ if (MCID.Opcode == ARM::SSAT || MCID.Opcode == ARM::SSAT16)
Pos -= 1;
assert((Pos < 16 || (Pos < 32 &&
- TID.Opcode != ARM::SSAT16 &&
- TID.Opcode != ARM::USAT16)) &&
+ MCID.Opcode != ARM::SSAT16 &&
+ MCID.Opcode != ARM::USAT16)) &&
"saturate bit position out of range");
Binary |= Pos << 16;
@@ -1443,7 +1443,7 @@ void ARMCodeEmitter::emitSaturateInstruction(const MachineInstr &MI) {
Binary |= getMachineOpValue(MI, 2);
// Encode shift_imm.
- if (TID.getNumOperands() == 4) {
+ if (MCID.getNumOperands() == 4) {
unsigned ShiftOp = MI.getOperand(3).getImm();
ARM_AM::ShiftOpc Opc = ARM_AM::getSORegShOp(ShiftOp);
if (Opc == ARM_AM::asr)
@@ -1459,9 +1459,9 @@ void ARMCodeEmitter::emitSaturateInstruction(const MachineInstr &MI) {
}
void ARMCodeEmitter::emitBranchInstruction(const MachineInstr &MI) {
- const TargetInstrDesc &TID = MI.getDesc();
+ const MCInstrDesc &MCID = MI.getDesc();
- if (TID.Opcode == ARM::TPsoft) {
+ if (MCID.Opcode == ARM::TPsoft) {
llvm_unreachable("ARM::TPsoft FIXME"); // FIXME
}
@@ -1498,20 +1498,20 @@ void ARMCodeEmitter::emitInlineJumpTable(unsigned JTIndex) {
}
void ARMCodeEmitter::emitMiscBranchInstruction(const MachineInstr &MI) {
- const TargetInstrDesc &TID = MI.getDesc();
+ const MCInstrDesc &MCID = MI.getDesc();
// Handle jump tables.
- if (TID.Opcode == ARM::BR_JTr || TID.Opcode == ARM::BR_JTadd) {
+ if (MCID.Opcode == ARM::BR_JTr || MCID.Opcode == ARM::BR_JTadd) {
// First emit a ldr pc, [] instruction.
emitDataProcessingInstruction(MI, ARM::PC);
// Then emit the inline jump table.
unsigned JTIndex =
- (TID.Opcode == ARM::BR_JTr)
+ (MCID.Opcode == ARM::BR_JTr)
? MI.getOperand(1).getIndex() : MI.getOperand(2).getIndex();
emitInlineJumpTable(JTIndex);
return;
- } else if (TID.Opcode == ARM::BR_JTm) {
+ } else if (MCID.Opcode == ARM::BR_JTm) {
// First emit a ldr pc, [] instruction.
emitLoadStoreInstruction(MI, ARM::PC);
@@ -1526,7 +1526,7 @@ void ARMCodeEmitter::emitMiscBranchInstruction(const MachineInstr &MI) {
// Set the conditional execution predicate
Binary |= II->getPredicate(&MI) << ARMII::CondShift;
- if (TID.Opcode == ARM::BX_RET || TID.Opcode == ARM::MOVPCLR)
+ if (MCID.Opcode == ARM::BX_RET || MCID.Opcode == ARM::MOVPCLR)
// The return register is LR.
Binary |= getARMRegisterNumbering(ARM::LR);
else
@@ -1579,7 +1579,7 @@ static unsigned encodeVFPRm(const MachineInstr &MI, unsigned OpIdx) {
}
void ARMCodeEmitter::emitVFPArithInstruction(const MachineInstr &MI) {
- const TargetInstrDesc &TID = MI.getDesc();
+ const MCInstrDesc &MCID = MI.getDesc();
// Part of binary is determined by TableGn.
unsigned Binary = getBinaryCodeForInstr(MI);
@@ -1596,16 +1596,16 @@ void ARMCodeEmitter::emitVFPArithInstruction(const MachineInstr &MI) {
Binary |= encodeVFPRd(MI, OpIdx++);
// If this is a two-address operand, skip it, e.g. FMACD.
- if (TID.getOperandConstraint(OpIdx, TOI::TIED_TO) != -1)
+ if (MCID.getOperandConstraint(OpIdx, MCOI::TIED_TO) != -1)
++OpIdx;
// Encode Dn / Sn.
- if ((TID.TSFlags & ARMII::FormMask) == ARMII::VFPBinaryFrm)
+ if ((MCID.TSFlags & ARMII::FormMask) == ARMII::VFPBinaryFrm)
Binary |= encodeVFPRn(MI, OpIdx++);
- if (OpIdx == TID.getNumOperands() ||
- TID.OpInfo[OpIdx].isPredicate() ||
- TID.OpInfo[OpIdx].isOptionalDef()) {
+ if (OpIdx == MCID.getNumOperands() ||
+ MCID.OpInfo[OpIdx].isPredicate() ||
+ MCID.OpInfo[OpIdx].isOptionalDef()) {
// FCMPEZD etc. has only one operand.
emitWordLE(Binary);
return;
@@ -1618,8 +1618,8 @@ void ARMCodeEmitter::emitVFPArithInstruction(const MachineInstr &MI) {
}
void ARMCodeEmitter::emitVFPConversionInstruction(const MachineInstr &MI) {
- const TargetInstrDesc &TID = MI.getDesc();
- unsigned Form = TID.TSFlags & ARMII::FormMask;
+ const MCInstrDesc &MCID = MI.getDesc();
+ unsigned Form = MCID.TSFlags & ARMII::FormMask;
// Part of binary is determined by TableGn.
unsigned Binary = getBinaryCodeForInstr(MI);
@@ -1709,8 +1709,8 @@ void ARMCodeEmitter::emitVFPLoadStoreInstruction(const MachineInstr &MI) {
void
ARMCodeEmitter::emitVFPLoadStoreMultipleInstruction(const MachineInstr &MI) {
- const TargetInstrDesc &TID = MI.getDesc();
- bool IsUpdating = (TID.TSFlags & ARMII::IndexModeMask) != 0;
+ const MCInstrDesc &MCID = MI.getDesc();
+ bool IsUpdating = (MCID.TSFlags & ARMII::IndexModeMask) != 0;
// Part of binary is determined by TableGn.
unsigned Binary = getBinaryCodeForInstr(MI);
@@ -1795,8 +1795,8 @@ void ARMCodeEmitter::emitNEONLaneInstruction(const MachineInstr &MI) {
unsigned Binary = getBinaryCodeForInstr(MI);
unsigned RegTOpIdx, RegNOpIdx, LnOpIdx;
- const TargetInstrDesc &TID = MI.getDesc();
- if ((TID.TSFlags & ARMII::FormMask) == ARMII::NGetLnFrm) {
+ const MCInstrDesc &MCID = MI.getDesc();
+ if ((MCID.TSFlags & ARMII::FormMask) == ARMII::NGetLnFrm) {
RegTOpIdx = 0;
RegNOpIdx = 1;
LnOpIdx = 2;
@@ -1863,12 +1863,12 @@ void ARMCodeEmitter::emitNEON1RegModImmInstruction(const MachineInstr &MI) {
}
void ARMCodeEmitter::emitNEON2RegInstruction(const MachineInstr &MI) {
- const TargetInstrDesc &TID = MI.getDesc();
+ const MCInstrDesc &MCID = MI.getDesc();
unsigned Binary = getBinaryCodeForInstr(MI);
// Destination register is encoded in Dd; source register in Dm.
unsigned OpIdx = 0;
Binary |= encodeNEONRd(MI, OpIdx++);
- if (TID.getOperandConstraint(OpIdx, TOI::TIED_TO) != -1)
+ if (MCID.getOperandConstraint(OpIdx, MCOI::TIED_TO) != -1)
++OpIdx;
Binary |= encodeNEONRm(MI, OpIdx);
if (IsThumb)
@@ -1878,15 +1878,15 @@ void ARMCodeEmitter::emitNEON2RegInstruction(const MachineInstr &MI) {
}
void ARMCodeEmitter::emitNEON3RegInstruction(const MachineInstr &MI) {
- const TargetInstrDesc &TID = MI.getDesc();
+ const MCInstrDesc &MCID = MI.getDesc();
unsigned Binary = getBinaryCodeForInstr(MI);
// Destination register is encoded in Dd; source registers in Dn and Dm.
unsigned OpIdx = 0;
Binary |= encodeNEONRd(MI, OpIdx++);
- if (TID.getOperandConstraint(OpIdx, TOI::TIED_TO) != -1)
+ if (MCID.getOperandConstraint(OpIdx, MCOI::TIED_TO) != -1)
++OpIdx;
Binary |= encodeNEONRn(MI, OpIdx++);
- if (TID.getOperandConstraint(OpIdx, TOI::TIED_TO) != -1)
+ if (MCID.getOperandConstraint(OpIdx, MCOI::TIED_TO) != -1)
++OpIdx;
Binary |= encodeNEONRm(MI, OpIdx);
if (IsThumb)
diff --git a/contrib/llvm/lib/Target/ARM/ARMConstantIslandPass.cpp b/contrib/llvm/lib/Target/ARM/ARMConstantIslandPass.cpp
index baf95a3..f45ebdc 100644
--- a/contrib/llvm/lib/Target/ARM/ARMConstantIslandPass.cpp
+++ b/contrib/llvm/lib/Target/ARM/ARMConstantIslandPass.cpp
@@ -1538,7 +1538,10 @@ bool ARMConstantIslands::UndoLRSpillRestore() {
if (MI->getOpcode() == ARM::tPOP_RET &&
MI->getOperand(2).getReg() == ARM::PC &&
MI->getNumExplicitOperands() == 3) {
- BuildMI(MI->getParent(), MI->getDebugLoc(), TII->get(ARM::tBX_RET));
+ // Create the new insn and copy the predicate from the old.
+ BuildMI(MI->getParent(), MI->getDebugLoc(), TII->get(ARM::tBX_RET))
+ .addOperand(MI->getOperand(0))
+ .addOperand(MI->getOperand(1));
MI->eraseFromParent();
MadeChange = true;
}
@@ -1692,9 +1695,9 @@ bool ARMConstantIslands::OptimizeThumb2JumpTables(MachineFunction &MF) {
const std::vector<MachineJumpTableEntry> &JT = MJTI->getJumpTables();
for (unsigned i = 0, e = T2JumpTables.size(); i != e; ++i) {
MachineInstr *MI = T2JumpTables[i];
- const TargetInstrDesc &TID = MI->getDesc();
- unsigned NumOps = TID.getNumOperands();
- unsigned JTOpIdx = NumOps - (TID.isPredicable() ? 3 : 2);
+ const MCInstrDesc &MCID = MI->getDesc();
+ unsigned NumOps = MCID.getNumOperands();
+ unsigned JTOpIdx = NumOps - (MCID.isPredicable() ? 3 : 2);
MachineOperand JTOP = MI->getOperand(JTOpIdx);
unsigned JTI = JTOP.getIndex();
assert(JTI < JT.size());
@@ -1815,9 +1818,9 @@ bool ARMConstantIslands::ReorderThumb2JumpTables(MachineFunction &MF) {
const std::vector<MachineJumpTableEntry> &JT = MJTI->getJumpTables();
for (unsigned i = 0, e = T2JumpTables.size(); i != e; ++i) {
MachineInstr *MI = T2JumpTables[i];
- const TargetInstrDesc &TID = MI->getDesc();
- unsigned NumOps = TID.getNumOperands();
- unsigned JTOpIdx = NumOps - (TID.isPredicable() ? 3 : 2);
+ const MCInstrDesc &MCID = MI->getDesc();
+ unsigned NumOps = MCID.getNumOperands();
+ unsigned JTOpIdx = NumOps - (MCID.isPredicable() ? 3 : 2);
MachineOperand JTOP = MI->getOperand(JTOpIdx);
unsigned JTI = JTOP.getIndex();
assert(JTI < JT.size());
diff --git a/contrib/llvm/lib/Target/ARM/ARMExpandPseudoInsts.cpp b/contrib/llvm/lib/Target/ARM/ARMExpandPseudoInsts.cpp
index b6b3c75..94b72fd 100644
--- a/contrib/llvm/lib/Target/ARM/ARMExpandPseudoInsts.cpp
+++ b/contrib/llvm/lib/Target/ARM/ARMExpandPseudoInsts.cpp
@@ -68,7 +68,7 @@ namespace {
void ARMExpandPseudo::TransferImpOps(MachineInstr &OldMI,
MachineInstrBuilder &UseMI,
MachineInstrBuilder &DefMI) {
- const TargetInstrDesc &Desc = OldMI.getDesc();
+ const MCInstrDesc &Desc = OldMI.getDesc();
for (unsigned i = Desc.getNumOperands(), e = OldMI.getNumOperands();
i != e; ++i) {
const MachineOperand &MO = OldMI.getOperand(i);
@@ -727,8 +727,10 @@ bool ARMExpandPseudo::ExpandMI(MachineBasicBlock &MBB,
MI.eraseFromParent();
return true;
}
+ case ARM::t2MOVCCr:
case ARM::MOVCCr: {
- BuildMI(MBB, MBBI, MI.getDebugLoc(), TII->get(ARM::MOVr),
+ unsigned Opc = AFI->isThumbFunction() ? ARM::t2MOVr : ARM::MOVr;
+ BuildMI(MBB, MBBI, MI.getDebugLoc(), TII->get(Opc),
MI.getOperand(1).getReg())
.addReg(MI.getOperand(2).getReg(),
getKillRegState(MI.getOperand(2).isKill()))
@@ -764,8 +766,10 @@ bool ARMExpandPseudo::ExpandMI(MachineBasicBlock &MBB,
MI.eraseFromParent();
return true;
}
+ case ARM::t2MOVCCi:
case ARM::MOVCCi: {
- BuildMI(MBB, MBBI, MI.getDebugLoc(), TII->get(ARM::MOVi),
+ unsigned Opc = AFI->isThumbFunction() ? ARM::t2MOVi : ARM::MOVi;
+ BuildMI(MBB, MBBI, MI.getDebugLoc(), TII->get(Opc),
MI.getOperand(1).getReg())
.addImm(MI.getOperand(2).getImm())
.addImm(MI.getOperand(3).getImm()) // 'pred'
@@ -837,8 +841,9 @@ bool ARMExpandPseudo::ExpandMI(MachineBasicBlock &MBB,
MI.getOperand(0).getReg())
.addOperand(MI.getOperand(1))
.addReg(0)
- .addImm(ARM_AM::getSORegOpc((Opcode == ARM::MOVsrl_flag ? ARM_AM::lsr
- : ARM_AM::asr), 1)))
+ .addImm(ARM_AM::getSORegOpc((Opcode == ARM::MOVsrl_flag ?
+ ARM_AM::lsr : ARM_AM::asr),
+ 1)))
.addReg(ARM::CPSR, RegState::Define);
MI.eraseFromParent();
return true;
@@ -856,10 +861,11 @@ bool ARMExpandPseudo::ExpandMI(MachineBasicBlock &MBB,
MI.eraseFromParent();
return true;
}
+ case ARM::tTPsoft:
case ARM::TPsoft: {
MachineInstrBuilder MIB =
BuildMI(MBB, MBBI, MI.getDebugLoc(),
- TII->get(ARM::BL))
+ TII->get(Opcode == ARM::tTPsoft ? ARM::tBL : ARM::BL))
.addExternalSymbol("__aeabi_read_tp", 0);
MIB->setMemRefs(MI.memoperands_begin(), MI.memoperands_end());
@@ -900,10 +906,10 @@ bool ARMExpandPseudo::ExpandMI(MachineBasicBlock &MBB,
const MachineOperand &MO1 = MI.getOperand(1);
const GlobalValue *GV = MO1.getGlobal();
unsigned TF = MO1.getTargetFlags();
- bool isARM = (Opcode != ARM::t2MOV_ga_pcrel && Opcode != ARM::t2MOV_ga_dyn);
+ bool isARM = (Opcode != ARM::t2MOV_ga_pcrel && Opcode!=ARM::t2MOV_ga_dyn);
bool isPIC = (Opcode != ARM::MOV_ga_dyn && Opcode != ARM::t2MOV_ga_dyn);
unsigned LO16Opc = isARM ? ARM::MOVi16_ga_pcrel : ARM::t2MOVi16_ga_pcrel;
- unsigned HI16Opc = isARM ? ARM::MOVTi16_ga_pcrel : ARM::t2MOVTi16_ga_pcrel;
+ unsigned HI16Opc = isARM ? ARM::MOVTi16_ga_pcrel :ARM::t2MOVTi16_ga_pcrel;
unsigned LO16TF = isPIC
? ARMII::MO_LO16_NONLAZY_PIC : ARMII::MO_LO16_NONLAZY;
unsigned HI16TF = isPIC
@@ -958,15 +964,17 @@ bool ARMExpandPseudo::ExpandMI(MachineBasicBlock &MBB,
unsigned OddSrc = TRI->getSubReg(SrcReg, ARM::qsub_1);
MachineInstrBuilder Even =
AddDefaultPred(BuildMI(MBB, MBBI, MI.getDebugLoc(),
- TII->get(ARM::VMOVQ))
+ TII->get(ARM::VORRq))
.addReg(EvenDst,
RegState::Define | getDeadRegState(DstIsDead))
+ .addReg(EvenSrc, getKillRegState(SrcIsKill))
.addReg(EvenSrc, getKillRegState(SrcIsKill)));
MachineInstrBuilder Odd =
AddDefaultPred(BuildMI(MBB, MBBI, MI.getDebugLoc(),
- TII->get(ARM::VMOVQ))
+ TII->get(ARM::VORRq))
.addReg(OddDst,
RegState::Define | getDeadRegState(DstIsDead))
+ .addReg(OddSrc, getKillRegState(SrcIsKill))
.addReg(OddSrc, getKillRegState(SrcIsKill)));
TransferImpOps(MI, Even, Odd);
MI.eraseFromParent();
diff --git a/contrib/llvm/lib/Target/ARM/ARMFastISel.cpp b/contrib/llvm/lib/Target/ARM/ARMFastISel.cpp
index 5cf73c4..f469d7e 100644
--- a/contrib/llvm/lib/Target/ARM/ARMFastISel.cpp
+++ b/contrib/llvm/lib/Target/ARM/ARMFastISel.cpp
@@ -219,8 +219,8 @@ class ARMFastISel : public FastISel {
// we don't care about implicit defs here, just places we'll need to add a
// default CCReg argument. Sets CPSR if we're setting CPSR instead of CCR.
bool ARMFastISel::DefinesOptionalPredicate(MachineInstr *MI, bool *CPSR) {
- const TargetInstrDesc &TID = MI->getDesc();
- if (!TID.hasOptionalDef())
+ const MCInstrDesc &MCID = MI->getDesc();
+ if (!MCID.hasOptionalDef())
return false;
// Look to see if our OptionalDef is defining CPSR or CCR.
@@ -234,15 +234,15 @@ bool ARMFastISel::DefinesOptionalPredicate(MachineInstr *MI, bool *CPSR) {
}
bool ARMFastISel::isARMNEONPred(const MachineInstr *MI) {
- const TargetInstrDesc &TID = MI->getDesc();
+ const MCInstrDesc &MCID = MI->getDesc();
// If we're a thumb2 or not NEON function we were handled via isPredicable.
- if ((TID.TSFlags & ARMII::DomainMask) != ARMII::DomainNEON ||
+ if ((MCID.TSFlags & ARMII::DomainMask) != ARMII::DomainNEON ||
AFI->isThumb2Function())
return false;
- for (unsigned i = 0, e = TID.getNumOperands(); i != e; ++i)
- if (TID.OpInfo[i].isPredicate())
+ for (unsigned i = 0, e = MCID.getNumOperands(); i != e; ++i)
+ if (MCID.OpInfo[i].isPredicate())
return true;
return false;
@@ -278,7 +278,7 @@ ARMFastISel::AddOptionalDefs(const MachineInstrBuilder &MIB) {
unsigned ARMFastISel::FastEmitInst_(unsigned MachineInstOpcode,
const TargetRegisterClass* RC) {
unsigned ResultReg = createResultReg(RC);
- const TargetInstrDesc &II = TII.get(MachineInstOpcode);
+ const MCInstrDesc &II = TII.get(MachineInstOpcode);
AddOptionalDefs(BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, DL, II, ResultReg));
return ResultReg;
@@ -288,7 +288,7 @@ unsigned ARMFastISel::FastEmitInst_r(unsigned MachineInstOpcode,
const TargetRegisterClass *RC,
unsigned Op0, bool Op0IsKill) {
unsigned ResultReg = createResultReg(RC);
- const TargetInstrDesc &II = TII.get(MachineInstOpcode);
+ const MCInstrDesc &II = TII.get(MachineInstOpcode);
if (II.getNumDefs() >= 1)
AddOptionalDefs(BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, DL, II, ResultReg)
@@ -308,7 +308,7 @@ unsigned ARMFastISel::FastEmitInst_rr(unsigned MachineInstOpcode,
unsigned Op0, bool Op0IsKill,
unsigned Op1, bool Op1IsKill) {
unsigned ResultReg = createResultReg(RC);
- const TargetInstrDesc &II = TII.get(MachineInstOpcode);
+ const MCInstrDesc &II = TII.get(MachineInstOpcode);
if (II.getNumDefs() >= 1)
AddOptionalDefs(BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, DL, II, ResultReg)
@@ -331,7 +331,7 @@ unsigned ARMFastISel::FastEmitInst_rrr(unsigned MachineInstOpcode,
unsigned Op1, bool Op1IsKill,
unsigned Op2, bool Op2IsKill) {
unsigned ResultReg = createResultReg(RC);
- const TargetInstrDesc &II = TII.get(MachineInstOpcode);
+ const MCInstrDesc &II = TII.get(MachineInstOpcode);
if (II.getNumDefs() >= 1)
AddOptionalDefs(BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, DL, II, ResultReg)
@@ -355,7 +355,7 @@ unsigned ARMFastISel::FastEmitInst_ri(unsigned MachineInstOpcode,
unsigned Op0, bool Op0IsKill,
uint64_t Imm) {
unsigned ResultReg = createResultReg(RC);
- const TargetInstrDesc &II = TII.get(MachineInstOpcode);
+ const MCInstrDesc &II = TII.get(MachineInstOpcode);
if (II.getNumDefs() >= 1)
AddOptionalDefs(BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, DL, II, ResultReg)
@@ -377,7 +377,7 @@ unsigned ARMFastISel::FastEmitInst_rf(unsigned MachineInstOpcode,
unsigned Op0, bool Op0IsKill,
const ConstantFP *FPImm) {
unsigned ResultReg = createResultReg(RC);
- const TargetInstrDesc &II = TII.get(MachineInstOpcode);
+ const MCInstrDesc &II = TII.get(MachineInstOpcode);
if (II.getNumDefs() >= 1)
AddOptionalDefs(BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, DL, II, ResultReg)
@@ -400,7 +400,7 @@ unsigned ARMFastISel::FastEmitInst_rri(unsigned MachineInstOpcode,
unsigned Op1, bool Op1IsKill,
uint64_t Imm) {
unsigned ResultReg = createResultReg(RC);
- const TargetInstrDesc &II = TII.get(MachineInstOpcode);
+ const MCInstrDesc &II = TII.get(MachineInstOpcode);
if (II.getNumDefs() >= 1)
AddOptionalDefs(BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, DL, II, ResultReg)
@@ -423,7 +423,7 @@ unsigned ARMFastISel::FastEmitInst_i(unsigned MachineInstOpcode,
const TargetRegisterClass *RC,
uint64_t Imm) {
unsigned ResultReg = createResultReg(RC);
- const TargetInstrDesc &II = TII.get(MachineInstOpcode);
+ const MCInstrDesc &II = TII.get(MachineInstOpcode);
if (II.getNumDefs() >= 1)
AddOptionalDefs(BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, DL, II, ResultReg)
@@ -442,7 +442,7 @@ unsigned ARMFastISel::FastEmitInst_ii(unsigned MachineInstOpcode,
const TargetRegisterClass *RC,
uint64_t Imm1, uint64_t Imm2) {
unsigned ResultReg = createResultReg(RC);
- const TargetInstrDesc &II = TII.get(MachineInstOpcode);
+ const MCInstrDesc &II = TII.get(MachineInstOpcode);
if (II.getNumDefs() >= 1)
AddOptionalDefs(BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, DL, II, ResultReg)
@@ -1549,7 +1549,7 @@ bool ARMFastISel::ProcessCallArgs(SmallVectorImpl<Value*> &Args,
NumBytes = CCInfo.getNextStackOffset();
// Issue CALLSEQ_START
- unsigned AdjStackDown = TM.getRegisterInfo()->getCallFrameSetupOpcode();
+ unsigned AdjStackDown = TII.getCallFrameSetupOpcode();
AddOptionalDefs(BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, DL,
TII.get(AdjStackDown))
.addImm(NumBytes));
@@ -1647,7 +1647,7 @@ bool ARMFastISel::FinishCall(MVT RetVT, SmallVectorImpl<unsigned> &UsedRegs,
const Instruction *I, CallingConv::ID CC,
unsigned &NumBytes) {
// Issue CALLSEQ_END
- unsigned AdjStackUp = TM.getRegisterInfo()->getCallFrameDestroyOpcode();
+ unsigned AdjStackUp = TII.getCallFrameDestroyOpcode();
AddOptionalDefs(BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, DL,
TII.get(AdjStackUp))
.addImm(NumBytes).addImm(0));
diff --git a/contrib/llvm/lib/Target/ARM/ARMFrameLowering.cpp b/contrib/llvm/lib/Target/ARM/ARMFrameLowering.cpp
index e2e95d4..381b404 100644
--- a/contrib/llvm/lib/Target/ARM/ARMFrameLowering.cpp
+++ b/contrib/llvm/lib/Target/ARM/ARMFrameLowering.cpp
@@ -268,14 +268,14 @@ void ARMFrameLowering::emitPrologue(MachineFunction &MF) const {
// bic r4, r4, MaxAlign
// mov sp, r4
// FIXME: It will be better just to find spare register here.
- BuildMI(MBB, MBBI, dl, TII.get(ARM::tMOVgpr2tgpr), ARM::R4)
- .addReg(ARM::SP, RegState::Kill);
+ AddDefaultPred(BuildMI(MBB, MBBI, dl, TII.get(ARM::tMOVr), ARM::R4)
+ .addReg(ARM::SP, RegState::Kill));
AddDefaultCC(AddDefaultPred(BuildMI(MBB, MBBI, dl,
TII.get(ARM::t2BICri), ARM::R4)
.addReg(ARM::R4, RegState::Kill)
.addImm(MaxAlign-1)));
- BuildMI(MBB, MBBI, dl, TII.get(ARM::tMOVtgpr2gpr), ARM::SP)
- .addReg(ARM::R4, RegState::Kill);
+ AddDefaultPred(BuildMI(MBB, MBBI, dl, TII.get(ARM::tMOVr), ARM::SP)
+ .addReg(ARM::R4, RegState::Kill));
}
AFI->setShouldRestoreSPFromFP(true);
@@ -293,9 +293,9 @@ void ARMFrameLowering::emitPrologue(MachineFunction &MF) const {
.addReg(ARM::SP)
.addImm((unsigned)ARMCC::AL).addReg(0).addReg(0);
else
- BuildMI(MBB, MBBI, dl,
- TII.get(ARM::tMOVgpr2gpr), RegInfo->getBaseRegister())
- .addReg(ARM::SP);
+ AddDefaultPred(BuildMI(MBB, MBBI, dl, TII.get(ARM::tMOVr),
+ RegInfo->getBaseRegister())
+ .addReg(ARM::SP));
}
// If the frame has variable sized objects then the epilogue must restore
@@ -364,8 +364,9 @@ void ARMFrameLowering::emitEpilogue(MachineFunction &MF,
"No scratch register to restore SP from FP!");
emitT2RegPlusImmediate(MBB, MBBI, dl, ARM::R4, FramePtr, -NumBytes,
ARMCC::AL, 0, TII);
- BuildMI(MBB, MBBI, dl, TII.get(ARM::tMOVgpr2gpr), ARM::SP)
- .addReg(ARM::R4);
+ AddDefaultPred(BuildMI(MBB, MBBI, dl, TII.get(ARM::tMOVr),
+ ARM::SP)
+ .addReg(ARM::R4));
}
} else {
// Thumb2 or ARM.
@@ -373,8 +374,9 @@ void ARMFrameLowering::emitEpilogue(MachineFunction &MF,
BuildMI(MBB, MBBI, dl, TII.get(ARM::MOVr), ARM::SP)
.addReg(FramePtr).addImm((unsigned)ARMCC::AL).addReg(0).addReg(0);
else
- BuildMI(MBB, MBBI, dl, TII.get(ARM::tMOVgpr2gpr), ARM::SP)
- .addReg(FramePtr);
+ AddDefaultPred(BuildMI(MBB, MBBI, dl, TII.get(ARM::tMOVr),
+ ARM::SP)
+ .addReg(FramePtr));
}
} else if (NumBytes)
emitSPUpdate(isARM, MBB, MBBI, dl, TII, NumBytes);
@@ -427,6 +429,7 @@ void ARMFrameLowering::emitEpilogue(MachineFunction &MF,
// Delete the pseudo instruction TCRETURN.
MBB.erase(MBBI);
+ MBBI = NewMI;
}
if (VARegSaveSize)
@@ -736,20 +739,52 @@ static unsigned GetFunctionSizeInBytes(const MachineFunction &MF,
/// estimateStackSize - Estimate and return the size of the frame.
/// FIXME: Make generic?
static unsigned estimateStackSize(MachineFunction &MF) {
- const MachineFrameInfo *FFI = MF.getFrameInfo();
+ const MachineFrameInfo *MFI = MF.getFrameInfo();
+ const TargetFrameLowering *TFI = MF.getTarget().getFrameLowering();
+ const TargetRegisterInfo *RegInfo = MF.getTarget().getRegisterInfo();
+ unsigned MaxAlign = MFI->getMaxAlignment();
int Offset = 0;
- for (int i = FFI->getObjectIndexBegin(); i != 0; ++i) {
- int FixedOff = -FFI->getObjectOffset(i);
+
+ // This code is very, very similar to PEI::calculateFrameObjectOffsets().
+ // It really should be refactored to share code. Until then, changes
+ // should keep in mind that there's tight coupling between the two.
+
+ for (int i = MFI->getObjectIndexBegin(); i != 0; ++i) {
+ int FixedOff = -MFI->getObjectOffset(i);
if (FixedOff > Offset) Offset = FixedOff;
}
- for (unsigned i = 0, e = FFI->getObjectIndexEnd(); i != e; ++i) {
- if (FFI->isDeadObjectIndex(i))
+ for (unsigned i = 0, e = MFI->getObjectIndexEnd(); i != e; ++i) {
+ if (MFI->isDeadObjectIndex(i))
continue;
- Offset += FFI->getObjectSize(i);
- unsigned Align = FFI->getObjectAlignment(i);
+ Offset += MFI->getObjectSize(i);
+ unsigned Align = MFI->getObjectAlignment(i);
// Adjust to alignment boundary
Offset = (Offset+Align-1)/Align*Align;
+
+ MaxAlign = std::max(Align, MaxAlign);
}
+
+ if (MFI->adjustsStack() && TFI->hasReservedCallFrame(MF))
+ Offset += MFI->getMaxCallFrameSize();
+
+ // Round up the size to a multiple of the alignment. If the function has
+ // any calls or alloca's, align to the target's StackAlignment value to
+ // ensure that the callee's frame or the alloca data is suitably aligned;
+ // otherwise, for leaf functions, align to the TransientStackAlignment
+ // value.
+ unsigned StackAlign;
+ if (MFI->adjustsStack() || MFI->hasVarSizedObjects() ||
+ (RegInfo->needsStackRealignment(MF) && MFI->getObjectIndexEnd() != 0))
+ StackAlign = TFI->getStackAlignment();
+ else
+ StackAlign = TFI->getTransientStackAlignment();
+
+ // If the frame pointer is eliminated, all frame offsets will be relative to
+ // SP not FP. Align to MaxAlign so this works.
+ StackAlign = std::max(StackAlign, MaxAlign);
+ unsigned AlignMask = StackAlign - 1;
+ Offset = (Offset + AlignMask) & ~uint64_t(AlignMask);
+
return (unsigned)Offset;
}
@@ -841,9 +876,14 @@ ARMFrameLowering::processFunctionBeforeCalleeSavedScan(MachineFunction &MF,
if (AFI->getVarArgsRegSaveSize() > 0)
MF.getRegInfo().setPhysRegUsed(ARM::LR);
- // Spill R4 if Thumb1 epilogue has to restore SP from FP since
+ // Spill R4 if Thumb1 epilogue has to restore SP from FP. We don't know
+ // for sure what the stack size will be, but for this, an estimate is good
+ // enough. If there anything changes it, it'll be a spill, which implies
+ // we've used all the registers and so R4 is already used, so not marking
+ // it here will be OK.
// FIXME: It will be better just to find spare register here.
- if (MFI->hasVarSizedObjects())
+ unsigned StackSize = estimateStackSize(MF);
+ if (MFI->hasVarSizedObjects() || StackSize > 508)
MF.getRegInfo().setPhysRegUsed(ARM::R4);
}
diff --git a/contrib/llvm/lib/Target/ARM/ARMGlobalMerge.cpp b/contrib/llvm/lib/Target/ARM/ARMGlobalMerge.cpp
index 3f02383..8d77b2d 100644
--- a/contrib/llvm/lib/Target/ARM/ARMGlobalMerge.cpp
+++ b/contrib/llvm/lib/Target/ARM/ARMGlobalMerge.cpp
@@ -128,10 +128,10 @@ bool ARMGlobalMerge::doMerge(SmallVectorImpl<GlobalVariable*> &Globals,
for (size_t i = 0, e = Globals.size(); i != e; ) {
size_t j = 0;
uint64_t MergedSize = 0;
- std::vector<const Type*> Tys;
+ std::vector<Type*> Tys;
std::vector<Constant*> Inits;
for (j = i; j != e; ++j) {
- const Type *Ty = Globals[j]->getType()->getElementType();
+ Type *Ty = Globals[j]->getType()->getElementType();
MergedSize += TD->getTypeAllocSize(Ty);
if (MergedSize > MaxOffset) {
break;
@@ -175,7 +175,9 @@ bool ARMGlobalMerge::doInitialization(Module &M) {
continue;
// Ignore fancy-aligned globals for now.
- if (I->getAlignment() != 0)
+ unsigned Alignment = I->getAlignment();
+ const Type *Ty = I->getType()->getElementType();
+ if (Alignment > TD->getABITypeAlignment(Ty))
continue;
// Ignore all 'special' globals.
@@ -183,7 +185,7 @@ bool ARMGlobalMerge::doInitialization(Module &M) {
I->getName().startswith(".llvm."))
continue;
- if (TD->getTypeAllocSize(I->getType()->getElementType()) < MaxOffset) {
+ if (TD->getTypeAllocSize(Ty) < MaxOffset) {
const TargetLoweringObjectFile &TLOF = TLI->getObjFileLowering();
if (TLOF.getKindForGlobal(I, TLI->getTargetMachine()).isBSSLocal())
BSSGlobals.push_back(I);
diff --git a/contrib/llvm/lib/Target/ARM/ARMHazardRecognizer.cpp b/contrib/llvm/lib/Target/ARM/ARMHazardRecognizer.cpp
index 517bba8..787f6a2 100644
--- a/contrib/llvm/lib/Target/ARM/ARMHazardRecognizer.cpp
+++ b/contrib/llvm/lib/Target/ARM/ARMHazardRecognizer.cpp
@@ -19,11 +19,11 @@ using namespace llvm;
static bool hasRAWHazard(MachineInstr *DefMI, MachineInstr *MI,
const TargetRegisterInfo &TRI) {
// FIXME: Detect integer instructions properly.
- const TargetInstrDesc &TID = MI->getDesc();
- unsigned Domain = TID.TSFlags & ARMII::DomainMask;
- if (TID.mayStore())
+ const MCInstrDesc &MCID = MI->getDesc();
+ unsigned Domain = MCID.TSFlags & ARMII::DomainMask;
+ if (MCID.mayStore())
return false;
- unsigned Opcode = TID.getOpcode();
+ unsigned Opcode = MCID.getOpcode();
if (Opcode == ARM::VMOVRS || Opcode == ARM::VMOVRRD)
return false;
if ((Domain & ARMII::DomainVFP) || (Domain & ARMII::DomainNEON))
@@ -43,15 +43,15 @@ ARMHazardRecognizer::getHazardType(SUnit *SU, int Stalls) {
// Look for special VMLA / VMLS hazards. A VMUL / VADD / VSUB following
// a VMLA / VMLS will cause 4 cycle stall.
- const TargetInstrDesc &TID = MI->getDesc();
- if (LastMI && (TID.TSFlags & ARMII::DomainMask) != ARMII::DomainGeneral) {
+ const MCInstrDesc &MCID = MI->getDesc();
+ if (LastMI && (MCID.TSFlags & ARMII::DomainMask) != ARMII::DomainGeneral) {
MachineInstr *DefMI = LastMI;
- const TargetInstrDesc &LastTID = LastMI->getDesc();
+ const MCInstrDesc &LastMCID = LastMI->getDesc();
// Skip over one non-VFP / NEON instruction.
- if (!LastTID.isBarrier() &&
+ if (!LastMCID.isBarrier() &&
// On A9, AGU and NEON/FPU are muxed.
- !(STI.isCortexA9() && (LastTID.mayLoad() || LastTID.mayStore())) &&
- (LastTID.TSFlags & ARMII::DomainMask) == ARMII::DomainGeneral) {
+ !(STI.isCortexA9() && (LastMCID.mayLoad() || LastMCID.mayStore())) &&
+ (LastMCID.TSFlags & ARMII::DomainMask) == ARMII::DomainGeneral) {
MachineBasicBlock::iterator I = LastMI;
if (I != LastMI->getParent()->begin()) {
I = llvm::prior(I);
diff --git a/contrib/llvm/lib/Target/ARM/ARMISelDAGToDAG.cpp b/contrib/llvm/lib/Target/ARM/ARMISelDAGToDAG.cpp
index 9ad516d..2c9481b 100644
--- a/contrib/llvm/lib/Target/ARM/ARMISelDAGToDAG.cpp
+++ b/contrib/llvm/lib/Target/ARM/ARMISelDAGToDAG.cpp
@@ -329,10 +329,10 @@ bool ARMDAGToDAGISel::hasNoVMLxHazardUse(SDNode *N) const {
if (Use->getOpcode() == ISD::CopyToReg)
return true;
if (Use->isMachineOpcode()) {
- const TargetInstrDesc &TID = TII->get(Use->getMachineOpcode());
- if (TID.mayStore())
+ const MCInstrDesc &MCID = TII->get(Use->getMachineOpcode());
+ if (MCID.mayStore())
return true;
- unsigned Opcode = TID.getOpcode();
+ unsigned Opcode = MCID.getOpcode();
if (Opcode == ARM::VMOVRS || Opcode == ARM::VMOVRRD)
return true;
// vmlx feeding into another vmlx. We actually want to unfold
@@ -1354,30 +1354,34 @@ SDNode *ARMDAGToDAGISel::SelectT2IndexedLoad(SDNode *N) {
///
SDNode *ARMDAGToDAGISel::PairSRegs(EVT VT, SDValue V0, SDValue V1) {
DebugLoc dl = V0.getNode()->getDebugLoc();
+ SDValue RegClass =
+ CurDAG->getTargetConstant(ARM::DPR_VFP2RegClassID, MVT::i32);
SDValue SubReg0 = CurDAG->getTargetConstant(ARM::ssub_0, MVT::i32);
SDValue SubReg1 = CurDAG->getTargetConstant(ARM::ssub_1, MVT::i32);
- const SDValue Ops[] = { V0, SubReg0, V1, SubReg1 };
- return CurDAG->getMachineNode(TargetOpcode::REG_SEQUENCE, dl, VT, Ops, 4);
+ const SDValue Ops[] = { RegClass, V0, SubReg0, V1, SubReg1 };
+ return CurDAG->getMachineNode(TargetOpcode::REG_SEQUENCE, dl, VT, Ops, 5);
}
/// PairDRegs - Form a quad register from a pair of D registers.
///
SDNode *ARMDAGToDAGISel::PairDRegs(EVT VT, SDValue V0, SDValue V1) {
DebugLoc dl = V0.getNode()->getDebugLoc();
+ SDValue RegClass = CurDAG->getTargetConstant(ARM::QPRRegClassID, MVT::i32);
SDValue SubReg0 = CurDAG->getTargetConstant(ARM::dsub_0, MVT::i32);
SDValue SubReg1 = CurDAG->getTargetConstant(ARM::dsub_1, MVT::i32);
- const SDValue Ops[] = { V0, SubReg0, V1, SubReg1 };
- return CurDAG->getMachineNode(TargetOpcode::REG_SEQUENCE, dl, VT, Ops, 4);
+ const SDValue Ops[] = { RegClass, V0, SubReg0, V1, SubReg1 };
+ return CurDAG->getMachineNode(TargetOpcode::REG_SEQUENCE, dl, VT, Ops, 5);
}
/// PairQRegs - Form 4 consecutive D registers from a pair of Q registers.
///
SDNode *ARMDAGToDAGISel::PairQRegs(EVT VT, SDValue V0, SDValue V1) {
DebugLoc dl = V0.getNode()->getDebugLoc();
+ SDValue RegClass = CurDAG->getTargetConstant(ARM::QQPRRegClassID, MVT::i32);
SDValue SubReg0 = CurDAG->getTargetConstant(ARM::qsub_0, MVT::i32);
SDValue SubReg1 = CurDAG->getTargetConstant(ARM::qsub_1, MVT::i32);
- const SDValue Ops[] = { V0, SubReg0, V1, SubReg1 };
- return CurDAG->getMachineNode(TargetOpcode::REG_SEQUENCE, dl, VT, Ops, 4);
+ const SDValue Ops[] = { RegClass, V0, SubReg0, V1, SubReg1 };
+ return CurDAG->getMachineNode(TargetOpcode::REG_SEQUENCE, dl, VT, Ops, 5);
}
/// QuadSRegs - Form 4 consecutive S registers.
@@ -1385,12 +1389,15 @@ SDNode *ARMDAGToDAGISel::PairQRegs(EVT VT, SDValue V0, SDValue V1) {
SDNode *ARMDAGToDAGISel::QuadSRegs(EVT VT, SDValue V0, SDValue V1,
SDValue V2, SDValue V3) {
DebugLoc dl = V0.getNode()->getDebugLoc();
+ SDValue RegClass =
+ CurDAG->getTargetConstant(ARM::QPR_VFP2RegClassID, MVT::i32);
SDValue SubReg0 = CurDAG->getTargetConstant(ARM::ssub_0, MVT::i32);
SDValue SubReg1 = CurDAG->getTargetConstant(ARM::ssub_1, MVT::i32);
SDValue SubReg2 = CurDAG->getTargetConstant(ARM::ssub_2, MVT::i32);
SDValue SubReg3 = CurDAG->getTargetConstant(ARM::ssub_3, MVT::i32);
- const SDValue Ops[] = { V0, SubReg0, V1, SubReg1, V2, SubReg2, V3, SubReg3 };
- return CurDAG->getMachineNode(TargetOpcode::REG_SEQUENCE, dl, VT, Ops, 8);
+ const SDValue Ops[] = { RegClass, V0, SubReg0, V1, SubReg1,
+ V2, SubReg2, V3, SubReg3 };
+ return CurDAG->getMachineNode(TargetOpcode::REG_SEQUENCE, dl, VT, Ops, 9);
}
/// QuadDRegs - Form 4 consecutive D registers.
@@ -1398,12 +1405,14 @@ SDNode *ARMDAGToDAGISel::QuadSRegs(EVT VT, SDValue V0, SDValue V1,
SDNode *ARMDAGToDAGISel::QuadDRegs(EVT VT, SDValue V0, SDValue V1,
SDValue V2, SDValue V3) {
DebugLoc dl = V0.getNode()->getDebugLoc();
+ SDValue RegClass = CurDAG->getTargetConstant(ARM::QQPRRegClassID, MVT::i32);
SDValue SubReg0 = CurDAG->getTargetConstant(ARM::dsub_0, MVT::i32);
SDValue SubReg1 = CurDAG->getTargetConstant(ARM::dsub_1, MVT::i32);
SDValue SubReg2 = CurDAG->getTargetConstant(ARM::dsub_2, MVT::i32);
SDValue SubReg3 = CurDAG->getTargetConstant(ARM::dsub_3, MVT::i32);
- const SDValue Ops[] = { V0, SubReg0, V1, SubReg1, V2, SubReg2, V3, SubReg3 };
- return CurDAG->getMachineNode(TargetOpcode::REG_SEQUENCE, dl, VT, Ops, 8);
+ const SDValue Ops[] = { RegClass, V0, SubReg0, V1, SubReg1,
+ V2, SubReg2, V3, SubReg3 };
+ return CurDAG->getMachineNode(TargetOpcode::REG_SEQUENCE, dl, VT, Ops, 9);
}
/// QuadQRegs - Form 4 consecutive Q registers.
@@ -1411,12 +1420,14 @@ SDNode *ARMDAGToDAGISel::QuadDRegs(EVT VT, SDValue V0, SDValue V1,
SDNode *ARMDAGToDAGISel::QuadQRegs(EVT VT, SDValue V0, SDValue V1,
SDValue V2, SDValue V3) {
DebugLoc dl = V0.getNode()->getDebugLoc();
+ SDValue RegClass = CurDAG->getTargetConstant(ARM::QQQQPRRegClassID, MVT::i32);
SDValue SubReg0 = CurDAG->getTargetConstant(ARM::qsub_0, MVT::i32);
SDValue SubReg1 = CurDAG->getTargetConstant(ARM::qsub_1, MVT::i32);
SDValue SubReg2 = CurDAG->getTargetConstant(ARM::qsub_2, MVT::i32);
SDValue SubReg3 = CurDAG->getTargetConstant(ARM::qsub_3, MVT::i32);
- const SDValue Ops[] = { V0, SubReg0, V1, SubReg1, V2, SubReg2, V3, SubReg3 };
- return CurDAG->getMachineNode(TargetOpcode::REG_SEQUENCE, dl, VT, Ops, 8);
+ const SDValue Ops[] = { RegClass, V0, SubReg0, V1, SubReg1,
+ V2, SubReg2, V3, SubReg3 };
+ return CurDAG->getMachineNode(TargetOpcode::REG_SEQUENCE, dl, VT, Ops, 9);
}
/// GetVLDSTAlign - Get the alignment (in bytes) for the alignment operand
diff --git a/contrib/llvm/lib/Target/ARM/ARMISelLowering.cpp b/contrib/llvm/lib/Target/ARM/ARMISelLowering.cpp
index 339c858..cf8c5ba 100644
--- a/contrib/llvm/lib/Target/ARM/ARMISelLowering.cpp
+++ b/contrib/llvm/lib/Target/ARM/ARMISelLowering.cpp
@@ -506,6 +506,9 @@ ARMTargetLowering::ARMTargetLowering(TargetMachine &TM)
setTargetDAGCombine(ISD::VECTOR_SHUFFLE);
setTargetDAGCombine(ISD::INSERT_VECTOR_ELT);
setTargetDAGCombine(ISD::STORE);
+ setTargetDAGCombine(ISD::FP_TO_SINT);
+ setTargetDAGCombine(ISD::FP_TO_UINT);
+ setTargetDAGCombine(ISD::FDIV);
}
computeRegisterProperties();
@@ -538,7 +541,8 @@ ARMTargetLowering::ARMTargetLowering(TargetMachine &TM)
setOperationAction(ISD::UMUL_LOHI, MVT::i32, Expand);
setOperationAction(ISD::SMUL_LOHI, MVT::i32, Expand);
}
- if (Subtarget->isThumb1Only() || !Subtarget->hasV6Ops())
+ if (Subtarget->isThumb1Only() || !Subtarget->hasV6Ops()
+ || (Subtarget->isThumb2() && !Subtarget->hasThumb2DSP()))
setOperationAction(ISD::MULHS, MVT::i32, Expand);
setOperationAction(ISD::SHL_PARTS, MVT::i32, Custom);
@@ -704,6 +708,9 @@ ARMTargetLowering::ARMTargetLowering(TargetMachine &TM)
setOperationAction(ISD::FPOW, MVT::f64, Expand);
setOperationAction(ISD::FPOW, MVT::f32, Expand);
+ setOperationAction(ISD::FMA, MVT::f64, Expand);
+ setOperationAction(ISD::FMA, MVT::f32, Expand);
+
// Various VFP goodness
if (!UseSoftFloat && !Subtarget->isThumb1Only()) {
// int <-> fp are custom expanded into bit_convert + ARMISD ops.
@@ -974,12 +981,12 @@ Sched::Preference ARMTargetLowering::getSchedulingPreference(SDNode *N) const {
// Load are scheduled for latency even if there instruction itinerary
// is not available.
const TargetInstrInfo *TII = getTargetMachine().getInstrInfo();
- const TargetInstrDesc &TID = TII->get(N->getMachineOpcode());
+ const MCInstrDesc &MCID = TII->get(N->getMachineOpcode());
- if (TID.getNumDefs() == 0)
+ if (MCID.getNumDefs() == 0)
return Sched::RegPressure;
if (!Itins->isEmpty() &&
- Itins->getOperandCycle(TID.getSchedClass(), 0) > 2)
+ Itins->getOperandCycle(MCID.getSchedClass(), 0) > 2)
return Sched::Latency;
return Sched::RegPressure;
@@ -1633,7 +1640,11 @@ ARMTargetLowering::IsEligibleForTailCallOptimization(SDValue Callee,
return false;
// FIXME: Completely disable sibcall for Thumb1 since Thumb1RegisterInfo::
- // emitEpilogue is not ready for them.
+ // emitEpilogue is not ready for them. Thumb tail calls also use t2B, as
+ // the Thumb1 16-bit unconditional branch doesn't have sufficient relocation
+ // support in the assembler and linker to be used. This would need to be
+ // fixed to fully support tail calls in Thumb1.
+ //
// Doing this is tricky, since the LDM/POP instruction on Thumb doesn't take
// LR. This means if we need to reload LR, it takes an extra instructions,
// which outweighs the value of the tail call; but here we don't know yet
@@ -2281,12 +2292,13 @@ static SDValue LowerPREFETCH(SDValue Op, SelectionDAG &DAG,
// ARMv7 with MP extension has PLDW.
return Op.getOperand(0);
- if (Subtarget->isThumb())
+ unsigned isData = cast<ConstantSDNode>(Op.getOperand(4))->getZExtValue();
+ if (Subtarget->isThumb()) {
// Invert the bits.
isRead = ~isRead & 1;
- unsigned isData = Subtarget->isThumb() ? 0 : 1;
+ isData = ~isData & 1;
+ }
- // Currently there is no intrinsic that matches pli.
return DAG.getNode(ARMISD::PRELOAD, dl, MVT::Other, Op.getOperand(0),
Op.getOperand(1), DAG.getConstant(isRead, MVT::i32),
DAG.getConstant(isData, MVT::i32));
@@ -2742,7 +2754,7 @@ SDValue ARMTargetLowering::LowerSELECT_CC(SDValue Op, SelectionDAG &DAG) const {
SDValue ARMcc;
SDValue CCR = DAG.getRegister(ARM::CPSR, MVT::i32);
SDValue Cmp = getARMCmp(LHS, RHS, CC, ARMcc, DAG, dl);
- return DAG.getNode(ARMISD::CMOV, dl, VT, FalseVal, TrueVal, ARMcc, CCR,Cmp);
+ return DAG.getNode(ARMISD::CMOV, dl, VT, FalseVal, TrueVal, ARMcc, CCR, Cmp);
}
ARMCC::CondCodes CondCode, CondCode2;
@@ -5522,12 +5534,108 @@ SDValue combineSelectAndUse(SDNode *N, SDValue Slct, SDValue OtherOp,
return SDValue();
}
+// AddCombineToVPADDL- For pair-wise add on neon, use the vpaddl instruction
+// (only after legalization).
+static SDValue AddCombineToVPADDL(SDNode *N, SDValue N0, SDValue N1,
+ TargetLowering::DAGCombinerInfo &DCI,
+ const ARMSubtarget *Subtarget) {
+
+ // Only perform optimization if after legalize, and if NEON is available. We
+ // also expected both operands to be BUILD_VECTORs.
+ if (DCI.isBeforeLegalize() || !Subtarget->hasNEON()
+ || N0.getOpcode() != ISD::BUILD_VECTOR
+ || N1.getOpcode() != ISD::BUILD_VECTOR)
+ return SDValue();
+
+ // Check output type since VPADDL operand elements can only be 8, 16, or 32.
+ EVT VT = N->getValueType(0);
+ if (!VT.isInteger() || VT.getVectorElementType() == MVT::i64)
+ return SDValue();
+
+ // Check that the vector operands are of the right form.
+ // N0 and N1 are BUILD_VECTOR nodes with N number of EXTRACT_VECTOR
+ // operands, where N is the size of the formed vector.
+ // Each EXTRACT_VECTOR should have the same input vector and odd or even
+ // index such that we have a pair wise add pattern.
+
+ // Grab the vector that all EXTRACT_VECTOR nodes should be referencing.
+ if (N0->getOperand(0)->getOpcode() != ISD::EXTRACT_VECTOR_ELT)
+ return SDValue();
+ SDValue Vec = N0->getOperand(0)->getOperand(0);
+ SDNode *V = Vec.getNode();
+ unsigned nextIndex = 0;
+
+ // For each operands to the ADD which are BUILD_VECTORs,
+ // check to see if each of their operands are an EXTRACT_VECTOR with
+ // the same vector and appropriate index.
+ for (unsigned i = 0, e = N0->getNumOperands(); i != e; ++i) {
+ if (N0->getOperand(i)->getOpcode() == ISD::EXTRACT_VECTOR_ELT
+ && N1->getOperand(i)->getOpcode() == ISD::EXTRACT_VECTOR_ELT) {
+
+ SDValue ExtVec0 = N0->getOperand(i);
+ SDValue ExtVec1 = N1->getOperand(i);
+
+ // First operand is the vector, verify its the same.
+ if (V != ExtVec0->getOperand(0).getNode() ||
+ V != ExtVec1->getOperand(0).getNode())
+ return SDValue();
+
+ // Second is the constant, verify its correct.
+ ConstantSDNode *C0 = dyn_cast<ConstantSDNode>(ExtVec0->getOperand(1));
+ ConstantSDNode *C1 = dyn_cast<ConstantSDNode>(ExtVec1->getOperand(1));
+
+ // For the constant, we want to see all the even or all the odd.
+ if (!C0 || !C1 || C0->getZExtValue() != nextIndex
+ || C1->getZExtValue() != nextIndex+1)
+ return SDValue();
+
+ // Increment index.
+ nextIndex+=2;
+ } else
+ return SDValue();
+ }
+
+ // Create VPADDL node.
+ SelectionDAG &DAG = DCI.DAG;
+ const TargetLowering &TLI = DAG.getTargetLoweringInfo();
+
+ // Build operand list.
+ SmallVector<SDValue, 8> Ops;
+ Ops.push_back(DAG.getConstant(Intrinsic::arm_neon_vpaddls,
+ TLI.getPointerTy()));
+
+ // Input is the vector.
+ Ops.push_back(Vec);
+
+ // Get widened type and narrowed type.
+ MVT widenType;
+ unsigned numElem = VT.getVectorNumElements();
+ switch (VT.getVectorElementType().getSimpleVT().SimpleTy) {
+ case MVT::i8: widenType = MVT::getVectorVT(MVT::i16, numElem); break;
+ case MVT::i16: widenType = MVT::getVectorVT(MVT::i32, numElem); break;
+ case MVT::i32: widenType = MVT::getVectorVT(MVT::i64, numElem); break;
+ default:
+ assert(0 && "Invalid vector element type for padd optimization.");
+ }
+
+ SDValue tmp = DAG.getNode(ISD::INTRINSIC_WO_CHAIN, N->getDebugLoc(),
+ widenType, &Ops[0], Ops.size());
+ return DAG.getNode(ISD::TRUNCATE, N->getDebugLoc(), VT, tmp);
+}
+
/// PerformADDCombineWithOperands - Try DAG combinations for an ADD with
/// operands N0 and N1. This is a helper for PerformADDCombine that is
/// called with the default operands, and if that fails, with commuted
/// operands.
static SDValue PerformADDCombineWithOperands(SDNode *N, SDValue N0, SDValue N1,
- TargetLowering::DAGCombinerInfo &DCI) {
+ TargetLowering::DAGCombinerInfo &DCI,
+ const ARMSubtarget *Subtarget){
+
+ // Attempt to create vpaddl for this add.
+ SDValue Result = AddCombineToVPADDL(N, N0, N1, DCI, Subtarget);
+ if (Result.getNode())
+ return Result;
+
// fold (add (select cc, 0, c), x) -> (select cc, x, (add, x, c))
if (N0.getOpcode() == ISD::SELECT && N0.getNode()->hasOneUse()) {
SDValue Result = combineSelectAndUse(N, N0, N1, DCI);
@@ -5539,17 +5647,18 @@ static SDValue PerformADDCombineWithOperands(SDNode *N, SDValue N0, SDValue N1,
/// PerformADDCombine - Target-specific dag combine xforms for ISD::ADD.
///
static SDValue PerformADDCombine(SDNode *N,
- TargetLowering::DAGCombinerInfo &DCI) {
+ TargetLowering::DAGCombinerInfo &DCI,
+ const ARMSubtarget *Subtarget) {
SDValue N0 = N->getOperand(0);
SDValue N1 = N->getOperand(1);
// First try with the default operand order.
- SDValue Result = PerformADDCombineWithOperands(N, N0, N1, DCI);
+ SDValue Result = PerformADDCombineWithOperands(N, N0, N1, DCI, Subtarget);
if (Result.getNode())
return Result;
// If that didn't work, try again with the operands commuted.
- return PerformADDCombineWithOperands(N, N1, N0, DCI);
+ return PerformADDCombineWithOperands(N, N1, N0, DCI, Subtarget);
}
/// PerformSUBCombine - Target-specific dag combine xforms for ISD::SUB.
@@ -5588,7 +5697,7 @@ static SDValue PerformVMULCombine(SDNode *N,
unsigned Opcode = N0.getOpcode();
if (Opcode != ISD::ADD && Opcode != ISD::SUB &&
Opcode != ISD::FADD && Opcode != ISD::FSUB) {
- Opcode = N0.getOpcode();
+ Opcode = N1.getOpcode();
if (Opcode != ISD::ADD && Opcode != ISD::SUB &&
Opcode != ISD::FADD && Opcode != ISD::FSUB)
return SDValue();
@@ -5874,8 +5983,8 @@ static SDValue PerformORCombine(SDNode *N,
return SDValue();
}
-/// PerformBFICombine - (bfi A, (and B, C1), C2) -> (bfi A, B, C2) iff
-/// C1 & C2 == C1.
+/// PerformBFICombine - (bfi A, (and B, Mask1), Mask2) -> (bfi A, B, Mask2) iff
+/// the bits being cleared by the AND are not demanded by the BFI.
static SDValue PerformBFICombine(SDNode *N,
TargetLowering::DAGCombinerInfo &DCI) {
SDValue N1 = N->getOperand(1);
@@ -5883,9 +5992,12 @@ static SDValue PerformBFICombine(SDNode *N,
ConstantSDNode *N11C = dyn_cast<ConstantSDNode>(N1.getOperand(1));
if (!N11C)
return SDValue();
- unsigned Mask = cast<ConstantSDNode>(N->getOperand(2))->getZExtValue();
+ unsigned InvMask = cast<ConstantSDNode>(N->getOperand(2))->getZExtValue();
+ unsigned LSB = CountTrailingZeros_32(~InvMask);
+ unsigned Width = (32 - CountLeadingZeros_32(~InvMask)) - LSB;
+ unsigned Mask = (1 << Width)-1;
unsigned Mask2 = N11C->getZExtValue();
- if ((Mask & Mask2) == Mask2)
+ if ((Mask & (~Mask2)) == 0)
return DCI.DAG.getNode(ARMISD::BFI, N->getDebugLoc(), N->getValueType(0),
N->getOperand(0), N1.getOperand(0),
N->getOperand(2));
@@ -6378,7 +6490,105 @@ static SDValue PerformVDUPLANECombine(SDNode *N,
return DCI.DAG.getNode(ISD::BITCAST, N->getDebugLoc(), VT, Op);
}
-/// getVShiftImm - Check if this is a valid build_vector for the immediate
+// isConstVecPow2 - Return true if each vector element is a power of 2, all
+// elements are the same constant, C, and Log2(C) ranges from 1 to 32.
+static bool isConstVecPow2(SDValue ConstVec, bool isSigned, uint64_t &C)
+{
+ integerPart cN;
+ integerPart c0 = 0;
+ for (unsigned I = 0, E = ConstVec.getValueType().getVectorNumElements();
+ I != E; I++) {
+ ConstantFPSDNode *C = dyn_cast<ConstantFPSDNode>(ConstVec.getOperand(I));
+ if (!C)
+ return false;
+
+ bool isExact;
+ APFloat APF = C->getValueAPF();
+ if (APF.convertToInteger(&cN, 64, isSigned, APFloat::rmTowardZero, &isExact)
+ != APFloat::opOK || !isExact)
+ return false;
+
+ c0 = (I == 0) ? cN : c0;
+ if (!isPowerOf2_64(cN) || c0 != cN || Log2_64(c0) < 1 || Log2_64(c0) > 32)
+ return false;
+ }
+ C = c0;
+ return true;
+}
+
+/// PerformVCVTCombine - VCVT (floating-point to fixed-point, Advanced SIMD)
+/// can replace combinations of VMUL and VCVT (floating-point to integer)
+/// when the VMUL has a constant operand that is a power of 2.
+///
+/// Example (assume d17 = <float 8.000000e+00, float 8.000000e+00>):
+/// vmul.f32 d16, d17, d16
+/// vcvt.s32.f32 d16, d16
+/// becomes:
+/// vcvt.s32.f32 d16, d16, #3
+static SDValue PerformVCVTCombine(SDNode *N,
+ TargetLowering::DAGCombinerInfo &DCI,
+ const ARMSubtarget *Subtarget) {
+ SelectionDAG &DAG = DCI.DAG;
+ SDValue Op = N->getOperand(0);
+
+ if (!Subtarget->hasNEON() || !Op.getValueType().isVector() ||
+ Op.getOpcode() != ISD::FMUL)
+ return SDValue();
+
+ uint64_t C;
+ SDValue N0 = Op->getOperand(0);
+ SDValue ConstVec = Op->getOperand(1);
+ bool isSigned = N->getOpcode() == ISD::FP_TO_SINT;
+
+ if (ConstVec.getOpcode() != ISD::BUILD_VECTOR ||
+ !isConstVecPow2(ConstVec, isSigned, C))
+ return SDValue();
+
+ unsigned IntrinsicOpcode = isSigned ? Intrinsic::arm_neon_vcvtfp2fxs :
+ Intrinsic::arm_neon_vcvtfp2fxu;
+ return DAG.getNode(ISD::INTRINSIC_WO_CHAIN, N->getDebugLoc(),
+ N->getValueType(0),
+ DAG.getConstant(IntrinsicOpcode, MVT::i32), N0,
+ DAG.getConstant(Log2_64(C), MVT::i32));
+}
+
+/// PerformVDIVCombine - VCVT (fixed-point to floating-point, Advanced SIMD)
+/// can replace combinations of VCVT (integer to floating-point) and VDIV
+/// when the VDIV has a constant operand that is a power of 2.
+///
+/// Example (assume d17 = <float 8.000000e+00, float 8.000000e+00>):
+/// vcvt.f32.s32 d16, d16
+/// vdiv.f32 d16, d17, d16
+/// becomes:
+/// vcvt.f32.s32 d16, d16, #3
+static SDValue PerformVDIVCombine(SDNode *N,
+ TargetLowering::DAGCombinerInfo &DCI,
+ const ARMSubtarget *Subtarget) {
+ SelectionDAG &DAG = DCI.DAG;
+ SDValue Op = N->getOperand(0);
+ unsigned OpOpcode = Op.getNode()->getOpcode();
+
+ if (!Subtarget->hasNEON() || !N->getValueType(0).isVector() ||
+ (OpOpcode != ISD::SINT_TO_FP && OpOpcode != ISD::UINT_TO_FP))
+ return SDValue();
+
+ uint64_t C;
+ SDValue ConstVec = N->getOperand(1);
+ bool isSigned = OpOpcode == ISD::SINT_TO_FP;
+
+ if (ConstVec.getOpcode() != ISD::BUILD_VECTOR ||
+ !isConstVecPow2(ConstVec, isSigned, C))
+ return SDValue();
+
+ unsigned IntrinsicOpcode = isSigned ? Intrinsic::arm_neon_vcvtfxs2fp :
+ Intrinsic::arm_neon_vcvtfxu2fp;
+ return DAG.getNode(ISD::INTRINSIC_WO_CHAIN, N->getDebugLoc(),
+ Op.getValueType(),
+ DAG.getConstant(IntrinsicOpcode, MVT::i32),
+ Op.getOperand(0), DAG.getConstant(Log2_64(C), MVT::i32));
+}
+
+/// Getvshiftimm - Check if this is a valid build_vector for the immediate
/// operand of a vector shift operation, where all the elements of the
/// build_vector must have the same constant integer value.
static bool getVShiftImm(SDValue Op, unsigned ElementBits, int64_t &Cnt) {
@@ -6750,11 +6960,75 @@ static SDValue PerformSELECT_CCCombine(SDNode *N, SelectionDAG &DAG,
return DAG.getNode(Opcode, N->getDebugLoc(), N->getValueType(0), LHS, RHS);
}
+/// PerformCMOVCombine - Target-specific DAG combining for ARMISD::CMOV.
+SDValue
+ARMTargetLowering::PerformCMOVCombine(SDNode *N, SelectionDAG &DAG) const {
+ SDValue Cmp = N->getOperand(4);
+ if (Cmp.getOpcode() != ARMISD::CMPZ)
+ // Only looking at EQ and NE cases.
+ return SDValue();
+
+ EVT VT = N->getValueType(0);
+ DebugLoc dl = N->getDebugLoc();
+ SDValue LHS = Cmp.getOperand(0);
+ SDValue RHS = Cmp.getOperand(1);
+ SDValue FalseVal = N->getOperand(0);
+ SDValue TrueVal = N->getOperand(1);
+ SDValue ARMcc = N->getOperand(2);
+ ARMCC::CondCodes CC = (ARMCC::CondCodes)cast<ConstantSDNode>(ARMcc)->getZExtValue();
+
+ // Simplify
+ // mov r1, r0
+ // cmp r1, x
+ // mov r0, y
+ // moveq r0, x
+ // to
+ // cmp r0, x
+ // movne r0, y
+ //
+ // mov r1, r0
+ // cmp r1, x
+ // mov r0, x
+ // movne r0, y
+ // to
+ // cmp r0, x
+ // movne r0, y
+ /// FIXME: Turn this into a target neutral optimization?
+ SDValue Res;
+ if (CC == ARMCC::NE && FalseVal == RHS) {
+ Res = DAG.getNode(ARMISD::CMOV, dl, VT, LHS, TrueVal, ARMcc,
+ N->getOperand(3), Cmp);
+ } else if (CC == ARMCC::EQ && TrueVal == RHS) {
+ SDValue ARMcc;
+ SDValue NewCmp = getARMCmp(LHS, RHS, ISD::SETNE, ARMcc, DAG, dl);
+ Res = DAG.getNode(ARMISD::CMOV, dl, VT, LHS, FalseVal, ARMcc,
+ N->getOperand(3), NewCmp);
+ }
+
+ if (Res.getNode()) {
+ APInt KnownZero, KnownOne;
+ APInt Mask = APInt::getAllOnesValue(VT.getScalarType().getSizeInBits());
+ DAG.ComputeMaskedBits(SDValue(N,0), Mask, KnownZero, KnownOne);
+ // Capture demanded bits information that would be otherwise lost.
+ if (KnownZero == 0xfffffffe)
+ Res = DAG.getNode(ISD::AssertZext, dl, MVT::i32, Res,
+ DAG.getValueType(MVT::i1));
+ else if (KnownZero == 0xffffff00)
+ Res = DAG.getNode(ISD::AssertZext, dl, MVT::i32, Res,
+ DAG.getValueType(MVT::i8));
+ else if (KnownZero == 0xffff0000)
+ Res = DAG.getNode(ISD::AssertZext, dl, MVT::i32, Res,
+ DAG.getValueType(MVT::i16));
+ }
+
+ return Res;
+}
+
SDValue ARMTargetLowering::PerformDAGCombine(SDNode *N,
DAGCombinerInfo &DCI) const {
switch (N->getOpcode()) {
default: break;
- case ISD::ADD: return PerformADDCombine(N, DCI);
+ case ISD::ADD: return PerformADDCombine(N, DCI, Subtarget);
case ISD::SUB: return PerformSUBCombine(N, DCI);
case ISD::MUL: return PerformMULCombine(N, DCI, Subtarget);
case ISD::OR: return PerformORCombine(N, DCI, Subtarget);
@@ -6767,6 +7041,9 @@ SDValue ARMTargetLowering::PerformDAGCombine(SDNode *N,
case ISD::INSERT_VECTOR_ELT: return PerformInsertEltCombine(N, DCI);
case ISD::VECTOR_SHUFFLE: return PerformVECTOR_SHUFFLECombine(N, DCI.DAG);
case ARMISD::VDUPLANE: return PerformVDUPLANECombine(N, DCI);
+ case ISD::FP_TO_SINT:
+ case ISD::FP_TO_UINT: return PerformVCVTCombine(N, DCI, Subtarget);
+ case ISD::FDIV: return PerformVDIVCombine(N, DCI, Subtarget);
case ISD::INTRINSIC_WO_CHAIN: return PerformIntrinsicCombine(N, DCI.DAG);
case ISD::SHL:
case ISD::SRA:
@@ -6775,6 +7052,7 @@ SDValue ARMTargetLowering::PerformDAGCombine(SDNode *N,
case ISD::ZERO_EXTEND:
case ISD::ANY_EXTEND: return PerformExtendCombine(N, DCI.DAG, Subtarget);
case ISD::SELECT_CC: return PerformSELECT_CCCombine(N, DCI.DAG, Subtarget);
+ case ARMISD::CMOV: return PerformCMOVCombine(N, DCI.DAG);
case ARMISD::VLD2DUP:
case ARMISD::VLD3DUP:
case ARMISD::VLD4DUP:
@@ -7277,10 +7555,17 @@ ARMTargetLowering::getConstraintType(const std::string &Constraint) const {
default: break;
case 'l': return C_RegisterClass;
case 'w': return C_RegisterClass;
+ case 'h': return C_RegisterClass;
+ case 'x': return C_RegisterClass;
+ case 't': return C_RegisterClass;
+ case 'j': return C_Other; // Constant for movw.
+ }
+ } else if (Constraint.size() == 2) {
+ switch (Constraint[0]) {
+ default: break;
+ // All 'U+' constraints are addresses.
+ case 'U': return C_Memory;
}
- } else {
- if (Constraint == "Uv")
- return C_Memory;
}
return TargetLowering::getConstraintType(Constraint);
}
@@ -7319,26 +7604,43 @@ ARMTargetLowering::getSingleConstraintMatchWeight(
return weight;
}
-std::pair<unsigned, const TargetRegisterClass*>
+typedef std::pair<unsigned, const TargetRegisterClass*> RCPair;
+RCPair
ARMTargetLowering::getRegForInlineAsmConstraint(const std::string &Constraint,
EVT VT) const {
if (Constraint.size() == 1) {
// GCC ARM Constraint Letters
switch (Constraint[0]) {
- case 'l':
+ case 'l': // Low regs or general regs.
if (Subtarget->isThumb())
- return std::make_pair(0U, ARM::tGPRRegisterClass);
+ return RCPair(0U, ARM::tGPRRegisterClass);
else
- return std::make_pair(0U, ARM::GPRRegisterClass);
+ return RCPair(0U, ARM::GPRRegisterClass);
+ case 'h': // High regs or no regs.
+ if (Subtarget->isThumb())
+ return RCPair(0U, ARM::hGPRRegisterClass);
+ break;
case 'r':
- return std::make_pair(0U, ARM::GPRRegisterClass);
+ return RCPair(0U, ARM::GPRRegisterClass);
case 'w':
if (VT == MVT::f32)
- return std::make_pair(0U, ARM::SPRRegisterClass);
+ return RCPair(0U, ARM::SPRRegisterClass);
if (VT.getSizeInBits() == 64)
- return std::make_pair(0U, ARM::DPRRegisterClass);
+ return RCPair(0U, ARM::DPRRegisterClass);
if (VT.getSizeInBits() == 128)
- return std::make_pair(0U, ARM::QPRRegisterClass);
+ return RCPair(0U, ARM::QPRRegisterClass);
+ break;
+ case 'x':
+ if (VT == MVT::f32)
+ return RCPair(0U, ARM::SPR_8RegisterClass);
+ if (VT.getSizeInBits() == 64)
+ return RCPair(0U, ARM::DPR_8RegisterClass);
+ if (VT.getSizeInBits() == 128)
+ return RCPair(0U, ARM::QPR_8RegisterClass);
+ break;
+ case 't':
+ if (VT == MVT::f32)
+ return RCPair(0U, ARM::SPRRegisterClass);
break;
}
}
@@ -7348,47 +7650,6 @@ ARMTargetLowering::getRegForInlineAsmConstraint(const std::string &Constraint,
return TargetLowering::getRegForInlineAsmConstraint(Constraint, VT);
}
-std::vector<unsigned> ARMTargetLowering::
-getRegClassForInlineAsmConstraint(const std::string &Constraint,
- EVT VT) const {
- if (Constraint.size() != 1)
- return std::vector<unsigned>();
-
- switch (Constraint[0]) { // GCC ARM Constraint Letters
- default: break;
- case 'l':
- return make_vector<unsigned>(ARM::R0, ARM::R1, ARM::R2, ARM::R3,
- ARM::R4, ARM::R5, ARM::R6, ARM::R7,
- 0);
- case 'r':
- return make_vector<unsigned>(ARM::R0, ARM::R1, ARM::R2, ARM::R3,
- ARM::R4, ARM::R5, ARM::R6, ARM::R7,
- ARM::R8, ARM::R9, ARM::R10, ARM::R11,
- ARM::R12, ARM::LR, 0);
- case 'w':
- if (VT == MVT::f32)
- return make_vector<unsigned>(ARM::S0, ARM::S1, ARM::S2, ARM::S3,
- ARM::S4, ARM::S5, ARM::S6, ARM::S7,
- ARM::S8, ARM::S9, ARM::S10, ARM::S11,
- ARM::S12,ARM::S13,ARM::S14,ARM::S15,
- ARM::S16,ARM::S17,ARM::S18,ARM::S19,
- ARM::S20,ARM::S21,ARM::S22,ARM::S23,
- ARM::S24,ARM::S25,ARM::S26,ARM::S27,
- ARM::S28,ARM::S29,ARM::S30,ARM::S31, 0);
- if (VT.getSizeInBits() == 64)
- return make_vector<unsigned>(ARM::D0, ARM::D1, ARM::D2, ARM::D3,
- ARM::D4, ARM::D5, ARM::D6, ARM::D7,
- ARM::D8, ARM::D9, ARM::D10,ARM::D11,
- ARM::D12,ARM::D13,ARM::D14,ARM::D15, 0);
- if (VT.getSizeInBits() == 128)
- return make_vector<unsigned>(ARM::Q0, ARM::Q1, ARM::Q2, ARM::Q3,
- ARM::Q4, ARM::Q5, ARM::Q6, ARM::Q7, 0);
- break;
- }
-
- return std::vector<unsigned>();
-}
-
/// LowerAsmOperandForConstraint - Lower the specified operand into the Ops
/// vector. If it is invalid, don't add anything to Ops.
void ARMTargetLowering::LowerAsmOperandForConstraint(SDValue Op,
@@ -7403,6 +7664,7 @@ void ARMTargetLowering::LowerAsmOperandForConstraint(SDValue Op,
char ConstraintLetter = Constraint[0];
switch (ConstraintLetter) {
default: break;
+ case 'j':
case 'I': case 'J': case 'K': case 'L':
case 'M': case 'N': case 'O':
ConstantSDNode *C = dyn_cast<ConstantSDNode>(Op);
@@ -7417,6 +7679,13 @@ void ARMTargetLowering::LowerAsmOperandForConstraint(SDValue Op,
return;
switch (ConstraintLetter) {
+ case 'j':
+ // Constant suitable for movw, must be between 0 and
+ // 65535.
+ if (Subtarget->hasV6T2Ops())
+ if (CVal >= 0 && CVal <= 65535)
+ break;
+ return;
case 'I':
if (Subtarget->isThumb1Only()) {
// This must be a constant between 0 and 255, for ADD
@@ -7685,7 +7954,7 @@ bool ARMTargetLowering::getTgtMemIntrinsic(IntrinsicInfo &Info,
Info.ptrVal = I.getArgOperand(2);
Info.offset = 0;
Info.align = 8;
- Info.vol = false;
+ Info.vol = true;
Info.readMem = false;
Info.writeMem = true;
return true;
@@ -7696,7 +7965,7 @@ bool ARMTargetLowering::getTgtMemIntrinsic(IntrinsicInfo &Info,
Info.ptrVal = I.getArgOperand(0);
Info.offset = 0;
Info.align = 8;
- Info.vol = false;
+ Info.vol = true;
Info.readMem = true;
Info.writeMem = false;
return true;
diff --git a/contrib/llvm/lib/Target/ARM/ARMISelLowering.h b/contrib/llvm/lib/Target/ARM/ARMISelLowering.h
index 21a9a3a..980fb40 100644
--- a/contrib/llvm/lib/Target/ARM/ARMISelLowering.h
+++ b/contrib/llvm/lib/Target/ARM/ARMISelLowering.h
@@ -244,6 +244,7 @@ namespace llvm {
EmitInstrWithCustomInserter(MachineInstr *MI,
MachineBasicBlock *MBB) const;
+ SDValue PerformCMOVCombine(SDNode *N, SelectionDAG &DAG) const;
virtual SDValue PerformDAGCombine(SDNode *N, DAGCombinerInfo &DCI) const;
bool isDesirableToTransformToIntegerOp(unsigned Opc, EVT VT) const;
@@ -306,9 +307,6 @@ namespace llvm {
std::pair<unsigned, const TargetRegisterClass*>
getRegForInlineAsmConstraint(const std::string &Constraint,
EVT VT) const;
- std::vector<unsigned>
- getRegClassForInlineAsmConstraint(const std::string &Constraint,
- EVT VT) const;
/// LowerAsmOperandForConstraint - Lower the specified operand into the Ops
/// vector. If it is invalid, don't add anything to Ops. If hasMemory is
diff --git a/contrib/llvm/lib/Target/ARM/ARMInstrFormats.td b/contrib/llvm/lib/Target/ARM/ARMInstrFormats.td
index 897d8a5..3ccf22f 100644
--- a/contrib/llvm/lib/Target/ARM/ARMInstrFormats.td
+++ b/contrib/llvm/lib/Target/ARM/ARMInstrFormats.td
@@ -107,16 +107,6 @@ def AddrModeT2_pc : AddrMode<14>;
def AddrModeT2_i8s4 : AddrMode<15>;
def AddrMode_i12 : AddrMode<16>;
-// Instruction size.
-class SizeFlagVal<bits<3> val> {
- bits<3> Value = val;
-}
-def SizeInvalid : SizeFlagVal<0>; // Unset.
-def SizeSpecial : SizeFlagVal<1>; // Pseudo or special.
-def Size8Bytes : SizeFlagVal<2>;
-def Size4Bytes : SizeFlagVal<3>;
-def Size2Bytes : SizeFlagVal<4>;
-
// Load / store index mode.
class IndexMode<bits<2> val> {
bits<2> Value = val;
@@ -236,13 +226,13 @@ def shr_imm64 : Operand<i32> {
// ARM Instruction templates.
//
-class InstTemplate<AddrMode am, SizeFlagVal sz, IndexMode im,
+class InstTemplate<AddrMode am, int sz, IndexMode im,
Format f, Domain d, string cstr, InstrItinClass itin>
: Instruction {
let Namespace = "ARM";
AddrMode AM = am;
- SizeFlagVal SZ = sz;
+ int Size = sz;
IndexMode IM = im;
bits<2> IndexModeBits = IM.Value;
Format F = f;
@@ -256,12 +246,11 @@ class InstTemplate<AddrMode am, SizeFlagVal sz, IndexMode im,
// The layout of TSFlags should be kept in sync with ARMBaseInstrInfo.h.
let TSFlags{4-0} = AM.Value;
- let TSFlags{7-5} = SZ.Value;
- let TSFlags{9-8} = IndexModeBits;
- let TSFlags{15-10} = Form;
- let TSFlags{16} = isUnaryDataProc;
- let TSFlags{17} = canXformTo16Bit;
- let TSFlags{20-18} = D.Value;
+ let TSFlags{6-5} = IndexModeBits;
+ let TSFlags{12-7} = Form;
+ let TSFlags{13} = isUnaryDataProc;
+ let TSFlags{14} = canXformTo16Bit;
+ let TSFlags{17-15} = D.Value;
let Constraints = cstr;
let Itinerary = itin;
@@ -271,53 +260,70 @@ class Encoding {
field bits<32> Inst;
}
-class InstARM<AddrMode am, SizeFlagVal sz, IndexMode im,
+class InstARM<AddrMode am, int sz, IndexMode im,
Format f, Domain d, string cstr, InstrItinClass itin>
: InstTemplate<am, sz, im, f, d, cstr, itin>, Encoding;
// This Encoding-less class is used by Thumb1 to specify the encoding bits later
// on by adding flavors to specific instructions.
-class InstThumb<AddrMode am, SizeFlagVal sz, IndexMode im,
+class InstThumb<AddrMode am, int sz, IndexMode im,
Format f, Domain d, string cstr, InstrItinClass itin>
: InstTemplate<am, sz, im, f, d, cstr, itin>;
class PseudoInst<dag oops, dag iops, InstrItinClass itin, list<dag> pattern>
- // FIXME: This really should derive from InstTemplate instead, as pseudos
- // don't need encoding information. TableGen doesn't like that
- // currently. Need to figure out why and fix it.
- : InstARM<AddrModeNone, SizeSpecial, IndexModeNone, Pseudo, GenericDomain,
- "", itin> {
+ : InstTemplate<AddrModeNone, 0, IndexModeNone, Pseudo,
+ GenericDomain, "", itin> {
let OutOperandList = oops;
let InOperandList = iops;
let Pattern = pattern;
let isCodeGenOnly = 1;
+ let isPseudo = 1;
}
// PseudoInst that's ARM-mode only.
-class ARMPseudoInst<dag oops, dag iops, SizeFlagVal sz, InstrItinClass itin,
+class ARMPseudoInst<dag oops, dag iops, int sz, InstrItinClass itin,
list<dag> pattern>
: PseudoInst<oops, iops, itin, pattern> {
- let SZ = sz;
+ let Size = sz;
list<Predicate> Predicates = [IsARM];
}
// PseudoInst that's Thumb-mode only.
-class tPseudoInst<dag oops, dag iops, SizeFlagVal sz, InstrItinClass itin,
+class tPseudoInst<dag oops, dag iops, int sz, InstrItinClass itin,
list<dag> pattern>
: PseudoInst<oops, iops, itin, pattern> {
- let SZ = sz;
+ let Size = sz;
list<Predicate> Predicates = [IsThumb];
}
// PseudoInst that's Thumb2-mode only.
-class t2PseudoInst<dag oops, dag iops, SizeFlagVal sz, InstrItinClass itin,
+class t2PseudoInst<dag oops, dag iops, int sz, InstrItinClass itin,
list<dag> pattern>
: PseudoInst<oops, iops, itin, pattern> {
- let SZ = sz;
+ let Size = sz;
list<Predicate> Predicates = [IsThumb2];
}
+
+class ARMPseudoExpand<dag oops, dag iops, int sz,
+ InstrItinClass itin, list<dag> pattern,
+ dag Result>
+ : ARMPseudoInst<oops, iops, sz, itin, pattern>,
+ PseudoInstExpansion<Result>;
+
+class tPseudoExpand<dag oops, dag iops, int sz,
+ InstrItinClass itin, list<dag> pattern,
+ dag Result>
+ : tPseudoInst<oops, iops, sz, itin, pattern>,
+ PseudoInstExpansion<Result>;
+
+class t2PseudoExpand<dag oops, dag iops, int sz,
+ InstrItinClass itin, list<dag> pattern,
+ dag Result>
+ : t2PseudoInst<oops, iops, sz, itin, pattern>,
+ PseudoInstExpansion<Result>;
+
// Almost all ARM instructions are predicable.
-class I<dag oops, dag iops, AddrMode am, SizeFlagVal sz,
+class I<dag oops, dag iops, AddrMode am, int sz,
IndexMode im, Format f, InstrItinClass itin,
string opc, string asm, string cstr,
list<dag> pattern>
@@ -332,7 +338,7 @@ class I<dag oops, dag iops, AddrMode am, SizeFlagVal sz,
}
// A few are not predicable
-class InoP<dag oops, dag iops, AddrMode am, SizeFlagVal sz,
+class InoP<dag oops, dag iops, AddrMode am, int sz,
IndexMode im, Format f, InstrItinClass itin,
string opc, string asm, string cstr,
list<dag> pattern>
@@ -348,7 +354,7 @@ class InoP<dag oops, dag iops, AddrMode am, SizeFlagVal sz,
// Same as I except it can optionally modify CPSR. Note it's modeled as an input
// operand since by default it's a zero register. It will become an implicit def
// once it's "flipped".
-class sI<dag oops, dag iops, AddrMode am, SizeFlagVal sz,
+class sI<dag oops, dag iops, AddrMode am, int sz,
IndexMode im, Format f, InstrItinClass itin,
string opc, string asm, string cstr,
list<dag> pattern>
@@ -366,7 +372,7 @@ class sI<dag oops, dag iops, AddrMode am, SizeFlagVal sz,
}
// Special cases
-class XI<dag oops, dag iops, AddrMode am, SizeFlagVal sz,
+class XI<dag oops, dag iops, AddrMode am, int sz,
IndexMode im, Format f, InstrItinClass itin,
string asm, string cstr, list<dag> pattern>
: InstARM<am, sz, im, f, GenericDomain, cstr, itin> {
@@ -379,31 +385,31 @@ class XI<dag oops, dag iops, AddrMode am, SizeFlagVal sz,
class AI<dag oops, dag iops, Format f, InstrItinClass itin,
string opc, string asm, list<dag> pattern>
- : I<oops, iops, AddrModeNone, Size4Bytes, IndexModeNone, f, itin,
+ : I<oops, iops, AddrModeNone, 4, IndexModeNone, f, itin,
opc, asm, "", pattern>;
class AsI<dag oops, dag iops, Format f, InstrItinClass itin,
string opc, string asm, list<dag> pattern>
- : sI<oops, iops, AddrModeNone, Size4Bytes, IndexModeNone, f, itin,
+ : sI<oops, iops, AddrModeNone, 4, IndexModeNone, f, itin,
opc, asm, "", pattern>;
class AXI<dag oops, dag iops, Format f, InstrItinClass itin,
string asm, list<dag> pattern>
- : XI<oops, iops, AddrModeNone, Size4Bytes, IndexModeNone, f, itin,
+ : XI<oops, iops, AddrModeNone, 4, IndexModeNone, f, itin,
asm, "", pattern>;
class AInoP<dag oops, dag iops, Format f, InstrItinClass itin,
string opc, string asm, list<dag> pattern>
- : InoP<oops, iops, AddrModeNone, Size4Bytes, IndexModeNone, f, itin,
+ : InoP<oops, iops, AddrModeNone, 4, IndexModeNone, f, itin,
opc, asm, "", pattern>;
// Ctrl flow instructions
class ABI<bits<4> opcod, dag oops, dag iops, InstrItinClass itin,
string opc, string asm, list<dag> pattern>
- : I<oops, iops, AddrModeNone, Size4Bytes, IndexModeNone, BrFrm, itin,
+ : I<oops, iops, AddrModeNone, 4, IndexModeNone, BrFrm, itin,
opc, asm, "", pattern> {
let Inst{27-24} = opcod;
}
class ABXI<bits<4> opcod, dag oops, dag iops, InstrItinClass itin,
string asm, list<dag> pattern>
- : XI<oops, iops, AddrModeNone, Size4Bytes, IndexModeNone, BrFrm, itin,
+ : XI<oops, iops, AddrModeNone, 4, IndexModeNone, BrFrm, itin,
asm, "", pattern> {
let Inst{27-24} = opcod;
}
@@ -411,13 +417,13 @@ class ABXI<bits<4> opcod, dag oops, dag iops, InstrItinClass itin,
// BR_JT instructions
class JTI<dag oops, dag iops, InstrItinClass itin,
string asm, list<dag> pattern>
- : XI<oops, iops, AddrModeNone, SizeSpecial, IndexModeNone, BrMiscFrm, itin,
+ : XI<oops, iops, AddrModeNone, 0, IndexModeNone, BrMiscFrm, itin,
asm, "", pattern>;
// Atomic load/store instructions
class AIldrex<bits<2> opcod, dag oops, dag iops, InstrItinClass itin,
string opc, string asm, list<dag> pattern>
- : I<oops, iops, AddrModeNone, Size4Bytes, IndexModeNone, LdStExFrm, itin,
+ : I<oops, iops, AddrModeNone, 4, IndexModeNone, LdStExFrm, itin,
opc, asm, "", pattern> {
bits<4> Rt;
bits<4> Rn;
@@ -430,7 +436,7 @@ class AIldrex<bits<2> opcod, dag oops, dag iops, InstrItinClass itin,
}
class AIstrex<bits<2> opcod, dag oops, dag iops, InstrItinClass itin,
string opc, string asm, list<dag> pattern>
- : I<oops, iops, AddrModeNone, Size4Bytes, IndexModeNone, LdStExFrm, itin,
+ : I<oops, iops, AddrModeNone, 4, IndexModeNone, LdStExFrm, itin,
opc, asm, "", pattern> {
bits<4> Rd;
bits<4> Rt;
@@ -460,21 +466,21 @@ class AIswp<bit b, dag oops, dag iops, string opc, list<dag> pattern>
// addrmode1 instructions
class AI1<bits<4> opcod, dag oops, dag iops, Format f, InstrItinClass itin,
string opc, string asm, list<dag> pattern>
- : I<oops, iops, AddrMode1, Size4Bytes, IndexModeNone, f, itin,
+ : I<oops, iops, AddrMode1, 4, IndexModeNone, f, itin,
opc, asm, "", pattern> {
let Inst{24-21} = opcod;
let Inst{27-26} = 0b00;
}
class AsI1<bits<4> opcod, dag oops, dag iops, Format f, InstrItinClass itin,
string opc, string asm, list<dag> pattern>
- : sI<oops, iops, AddrMode1, Size4Bytes, IndexModeNone, f, itin,
+ : sI<oops, iops, AddrMode1, 4, IndexModeNone, f, itin,
opc, asm, "", pattern> {
let Inst{24-21} = opcod;
let Inst{27-26} = 0b00;
}
class AXI1<bits<4> opcod, dag oops, dag iops, Format f, InstrItinClass itin,
string asm, list<dag> pattern>
- : XI<oops, iops, AddrMode1, Size4Bytes, IndexModeNone, f, itin,
+ : XI<oops, iops, AddrMode1, 4, IndexModeNone, f, itin,
asm, "", pattern> {
let Inst{24-21} = opcod;
let Inst{27-26} = 0b00;
@@ -486,7 +492,7 @@ class AXI1<bits<4> opcod, dag oops, dag iops, Format f, InstrItinClass itin,
class AI2ldst<bits<3> op, bit isLd, bit isByte, dag oops, dag iops, AddrMode am,
Format f, InstrItinClass itin, string opc, string asm,
list<dag> pattern>
- : I<oops, iops, am, Size4Bytes, IndexModeNone, f, itin, opc, asm,
+ : I<oops, iops, am, 4, IndexModeNone, f, itin, opc, asm,
"", pattern> {
let Inst{27-25} = op;
let Inst{24} = 1; // 24 == P
@@ -499,7 +505,7 @@ class AI2ldst<bits<3> op, bit isLd, bit isByte, dag oops, dag iops, AddrMode am,
class AI2ldstidx<bit isLd, bit isByte, bit isPre, dag oops, dag iops,
IndexMode im, Format f, InstrItinClass itin, string opc,
string asm, string cstr, list<dag> pattern>
- : I<oops, iops, AddrMode2, Size4Bytes, im, f, itin,
+ : I<oops, iops, AddrMode2, 4, im, f, itin,
opc, asm, cstr, pattern> {
bits<4> Rt;
let Inst{27-26} = 0b01;
@@ -547,7 +553,7 @@ class AI2stridxT<bit isByte, bit isPre, dag oops, dag iops,
// addrmode3 instructions
class AI3ld<bits<4> op, bit op20, dag oops, dag iops, Format f,
InstrItinClass itin, string opc, string asm, list<dag> pattern>
- : I<oops, iops, AddrMode3, Size4Bytes, IndexModeNone, f, itin,
+ : I<oops, iops, AddrMode3, 4, IndexModeNone, f, itin,
opc, asm, "", pattern> {
bits<14> addr;
bits<4> Rt;
@@ -567,7 +573,7 @@ class AI3ld<bits<4> op, bit op20, dag oops, dag iops, Format f,
class AI3ldstidx<bits<4> op, bit op20, bit isLd, bit isPre, dag oops, dag iops,
IndexMode im, Format f, InstrItinClass itin, string opc,
string asm, string cstr, list<dag> pattern>
- : I<oops, iops, AddrMode3, Size4Bytes, im, f, itin,
+ : I<oops, iops, AddrMode3, 4, im, f, itin,
opc, asm, cstr, pattern> {
bits<4> Rt;
let Inst{27-25} = 0b000;
@@ -583,7 +589,7 @@ class AI3ldstidx<bits<4> op, bit op20, bit isLd, bit isPre, dag oops, dag iops,
class AI3ldstidxT<bits<4> op, bit op20, bit isLd, bit isPre, dag oops, dag iops,
IndexMode im, Format f, InstrItinClass itin, string opc,
string asm, string cstr, list<dag> pattern>
- : I<oops, iops, AddrMode3, Size4Bytes, im, f, itin,
+ : I<oops, iops, AddrMode3, 4, im, f, itin,
opc, asm, cstr, pattern> {
// {13} 1 == imm8, 0 == Rm
// {12-9} Rn
@@ -627,7 +633,7 @@ class AI3stridx<bits<4> op, bit isByte, bit isPre, dag oops, dag iops,
// stores
class AI3str<bits<4> op, dag oops, dag iops, Format f, InstrItinClass itin,
string opc, string asm, list<dag> pattern>
- : I<oops, iops, AddrMode3, Size4Bytes, IndexModeNone, f, itin,
+ : I<oops, iops, AddrMode3, 4, IndexModeNone, f, itin,
opc, asm, "", pattern> {
bits<14> addr;
bits<4> Rt;
@@ -647,7 +653,7 @@ class AI3str<bits<4> op, dag oops, dag iops, Format f, InstrItinClass itin,
// Pre-indexed stores
class AI3sthpr<dag oops, dag iops, Format f, InstrItinClass itin,
string opc, string asm, string cstr, list<dag> pattern>
- : I<oops, iops, AddrMode3, Size4Bytes, IndexModePre, f, itin,
+ : I<oops, iops, AddrMode3, 4, IndexModePre, f, itin,
opc, asm, cstr, pattern> {
let Inst{4} = 1;
let Inst{5} = 1; // H bit
@@ -660,7 +666,7 @@ class AI3sthpr<dag oops, dag iops, Format f, InstrItinClass itin,
}
class AI3stdpr<dag oops, dag iops, Format f, InstrItinClass itin,
string opc, string asm, string cstr, list<dag> pattern>
- : I<oops, iops, AddrMode3, Size4Bytes, IndexModePre, f, itin,
+ : I<oops, iops, AddrMode3, 4, IndexModePre, f, itin,
opc, asm, cstr, pattern> {
let Inst{4} = 1;
let Inst{5} = 1; // H bit
@@ -675,7 +681,7 @@ class AI3stdpr<dag oops, dag iops, Format f, InstrItinClass itin,
// Post-indexed stores
class AI3sthpo<dag oops, dag iops, Format f, InstrItinClass itin,
string opc, string asm, string cstr, list<dag> pattern>
- : I<oops, iops, AddrMode3, Size4Bytes, IndexModePost, f, itin,
+ : I<oops, iops, AddrMode3, 4, IndexModePost, f, itin,
opc, asm, cstr,pattern> {
// {13} 1 == imm8, 0 == Rm
// {12-9} Rn
@@ -701,7 +707,7 @@ class AI3sthpo<dag oops, dag iops, Format f, InstrItinClass itin,
}
class AI3stdpo<dag oops, dag iops, Format f, InstrItinClass itin,
string opc, string asm, string cstr, list<dag> pattern>
- : I<oops, iops, AddrMode3, Size4Bytes, IndexModePost, f, itin,
+ : I<oops, iops, AddrMode3, 4, IndexModePost, f, itin,
opc, asm, cstr, pattern> {
let Inst{4} = 1;
let Inst{5} = 1; // H bit
@@ -716,7 +722,7 @@ class AI3stdpo<dag oops, dag iops, Format f, InstrItinClass itin,
// addrmode4 instructions
class AXI4<dag oops, dag iops, IndexMode im, Format f, InstrItinClass itin,
string asm, string cstr, list<dag> pattern>
- : XI<oops, iops, AddrMode4, Size4Bytes, im, f, itin, asm, cstr, pattern> {
+ : XI<oops, iops, AddrMode4, 4, im, f, itin, asm, cstr, pattern> {
bits<4> p;
bits<16> regs;
bits<4> Rn;
@@ -730,7 +736,7 @@ class AXI4<dag oops, dag iops, IndexMode im, Format f, InstrItinClass itin,
// Unsigned multiply, multiply-accumulate instructions.
class AMul1I<bits<7> opcod, dag oops, dag iops, InstrItinClass itin,
string opc, string asm, list<dag> pattern>
- : I<oops, iops, AddrModeNone, Size4Bytes, IndexModeNone, MulFrm, itin,
+ : I<oops, iops, AddrModeNone, 4, IndexModeNone, MulFrm, itin,
opc, asm, "", pattern> {
let Inst{7-4} = 0b1001;
let Inst{20} = 0; // S bit
@@ -738,7 +744,7 @@ class AMul1I<bits<7> opcod, dag oops, dag iops, InstrItinClass itin,
}
class AsMul1I<bits<7> opcod, dag oops, dag iops, InstrItinClass itin,
string opc, string asm, list<dag> pattern>
- : sI<oops, iops, AddrModeNone, Size4Bytes, IndexModeNone, MulFrm, itin,
+ : sI<oops, iops, AddrModeNone, 4, IndexModeNone, MulFrm, itin,
opc, asm, "", pattern> {
let Inst{7-4} = 0b1001;
let Inst{27-21} = opcod;
@@ -747,7 +753,7 @@ class AsMul1I<bits<7> opcod, dag oops, dag iops, InstrItinClass itin,
// Most significant word multiply
class AMul2I<bits<7> opcod, bits<4> opc7_4, dag oops, dag iops,
InstrItinClass itin, string opc, string asm, list<dag> pattern>
- : I<oops, iops, AddrModeNone, Size4Bytes, IndexModeNone, MulFrm, itin,
+ : I<oops, iops, AddrModeNone, 4, IndexModeNone, MulFrm, itin,
opc, asm, "", pattern> {
bits<4> Rd;
bits<4> Rn;
@@ -770,7 +776,7 @@ class AMul2Ia<bits<7> opcod, bits<4> opc7_4, dag oops, dag iops,
// SMUL<x><y> / SMULW<y> / SMLA<x><y> / SMLAW<x><y>
class AMulxyIbase<bits<7> opcod, bits<2> bit6_5, dag oops, dag iops,
InstrItinClass itin, string opc, string asm, list<dag> pattern>
- : I<oops, iops, AddrModeNone, Size4Bytes, IndexModeNone, MulFrm, itin,
+ : I<oops, iops, AddrModeNone, 4, IndexModeNone, MulFrm, itin,
opc, asm, "", pattern> {
bits<4> Rn;
bits<4> Rm;
@@ -809,7 +815,7 @@ class AMulxyI64<bits<7> opcod, bits<2> bit6_5, dag oops, dag iops,
// Extend instructions.
class AExtI<bits<8> opcod, dag oops, dag iops, InstrItinClass itin,
string opc, string asm, list<dag> pattern>
- : I<oops, iops, AddrModeNone, Size4Bytes, IndexModeNone, ExtFrm, itin,
+ : I<oops, iops, AddrModeNone, 4, IndexModeNone, ExtFrm, itin,
opc, asm, "", pattern> {
// All AExtI instructions have Rd and Rm register operands.
bits<4> Rd;
@@ -824,7 +830,7 @@ class AExtI<bits<8> opcod, dag oops, dag iops, InstrItinClass itin,
// Misc Arithmetic instructions.
class AMiscA1I<bits<8> opcod, bits<4> opc7_4, dag oops, dag iops,
InstrItinClass itin, string opc, string asm, list<dag> pattern>
- : I<oops, iops, AddrModeNone, Size4Bytes, IndexModeNone, ArithMiscFrm, itin,
+ : I<oops, iops, AddrModeNone, 4, IndexModeNone, ArithMiscFrm, itin,
opc, asm, "", pattern> {
bits<4> Rd;
bits<4> Rm;
@@ -839,7 +845,7 @@ class AMiscA1I<bits<8> opcod, bits<4> opc7_4, dag oops, dag iops,
// PKH instructions
class APKHI<bits<8> opcod, bit tb, dag oops, dag iops, InstrItinClass itin,
string opc, string asm, list<dag> pattern>
- : I<oops, iops, AddrModeNone, Size4Bytes, IndexModeNone, ArithMiscFrm, itin,
+ : I<oops, iops, AddrModeNone, 4, IndexModeNone, ArithMiscFrm, itin,
opc, asm, "", pattern> {
bits<4> Rd;
bits<4> Rn;
@@ -874,7 +880,7 @@ class ARMV6Pat<dag pattern, dag result> : Pat<pattern, result> {
// Thumb Instruction Format Definitions.
//
-class ThumbI<dag oops, dag iops, AddrMode am, SizeFlagVal sz,
+class ThumbI<dag oops, dag iops, AddrMode am, int sz,
InstrItinClass itin, string asm, string cstr, list<dag> pattern>
: InstThumb<am, sz, IndexModeNone, ThumbFrm, GenericDomain, cstr, itin> {
let OutOperandList = oops;
@@ -886,39 +892,32 @@ class ThumbI<dag oops, dag iops, AddrMode am, SizeFlagVal sz,
// TI - Thumb instruction.
class TI<dag oops, dag iops, InstrItinClass itin, string asm, list<dag> pattern>
- : ThumbI<oops, iops, AddrModeNone, Size2Bytes, itin, asm, "", pattern>;
+ : ThumbI<oops, iops, AddrModeNone, 2, itin, asm, "", pattern>;
// Two-address instructions
class TIt<dag oops, dag iops, InstrItinClass itin, string asm,
list<dag> pattern>
- : ThumbI<oops, iops, AddrModeNone, Size2Bytes, itin, asm, "$lhs = $dst",
+ : ThumbI<oops, iops, AddrModeNone, 2, itin, asm, "$lhs = $dst",
pattern>;
// tBL, tBX 32-bit instructions
class TIx2<bits<5> opcod1, bits<2> opcod2, bit opcod3,
dag oops, dag iops, InstrItinClass itin, string asm,
list<dag> pattern>
- : ThumbI<oops, iops, AddrModeNone, Size4Bytes, itin, asm, "", pattern>,
+ : ThumbI<oops, iops, AddrModeNone, 4, itin, asm, "", pattern>,
Encoding {
let Inst{31-27} = opcod1;
let Inst{15-14} = opcod2;
let Inst{12} = opcod3;
}
-// Move to/from coprocessor instructions
-class T1Cop<dag oops, dag iops, string asm, list<dag> pattern>
- : ThumbI<oops, iops, AddrModeNone, Size4Bytes, NoItinerary, asm, "", pattern>,
- Encoding, Requires<[IsThumb, HasV6]> {
- let Inst{31-28} = 0b1110;
-}
-
// BR_JT instructions
class TJTI<dag oops, dag iops, InstrItinClass itin, string asm,
list<dag> pattern>
- : ThumbI<oops, iops, AddrModeNone, SizeSpecial, itin, asm, "", pattern>;
+ : ThumbI<oops, iops, AddrModeNone, 0, itin, asm, "", pattern>;
// Thumb1 only
-class Thumb1I<dag oops, dag iops, AddrMode am, SizeFlagVal sz,
+class Thumb1I<dag oops, dag iops, AddrMode am, int sz,
InstrItinClass itin, string asm, string cstr, list<dag> pattern>
: InstThumb<am, sz, IndexModeNone, ThumbFrm, GenericDomain, cstr, itin> {
let OutOperandList = oops;
@@ -930,19 +929,19 @@ class Thumb1I<dag oops, dag iops, AddrMode am, SizeFlagVal sz,
class T1I<dag oops, dag iops, InstrItinClass itin,
string asm, list<dag> pattern>
- : Thumb1I<oops, iops, AddrModeNone, Size2Bytes, itin, asm, "", pattern>;
+ : Thumb1I<oops, iops, AddrModeNone, 2, itin, asm, "", pattern>;
class T1Ix2<dag oops, dag iops, InstrItinClass itin,
string asm, list<dag> pattern>
- : Thumb1I<oops, iops, AddrModeNone, Size4Bytes, itin, asm, "", pattern>;
+ : Thumb1I<oops, iops, AddrModeNone, 4, itin, asm, "", pattern>;
// Two-address instructions
class T1It<dag oops, dag iops, InstrItinClass itin,
string asm, string cstr, list<dag> pattern>
- : Thumb1I<oops, iops, AddrModeNone, Size2Bytes, itin,
+ : Thumb1I<oops, iops, AddrModeNone, 2, itin,
asm, cstr, pattern>;
// Thumb1 instruction that can either be predicated or set CPSR.
-class Thumb1sI<dag oops, dag iops, AddrMode am, SizeFlagVal sz,
+class Thumb1sI<dag oops, dag iops, AddrMode am, int sz,
InstrItinClass itin,
string opc, string asm, string cstr, list<dag> pattern>
: InstThumb<am, sz, IndexModeNone, ThumbFrm, GenericDomain, cstr, itin> {
@@ -955,16 +954,16 @@ class Thumb1sI<dag oops, dag iops, AddrMode am, SizeFlagVal sz,
class T1sI<dag oops, dag iops, InstrItinClass itin,
string opc, string asm, list<dag> pattern>
- : Thumb1sI<oops, iops, AddrModeNone, Size2Bytes, itin, opc, asm, "", pattern>;
+ : Thumb1sI<oops, iops, AddrModeNone, 2, itin, opc, asm, "", pattern>;
// Two-address instructions
class T1sIt<dag oops, dag iops, InstrItinClass itin,
string opc, string asm, list<dag> pattern>
- : Thumb1sI<oops, iops, AddrModeNone, Size2Bytes, itin, opc, asm,
+ : Thumb1sI<oops, iops, AddrModeNone, 2, itin, opc, asm,
"$Rn = $Rdn", pattern>;
// Thumb1 instruction that can be predicated.
-class Thumb1pI<dag oops, dag iops, AddrMode am, SizeFlagVal sz,
+class Thumb1pI<dag oops, dag iops, AddrMode am, int sz,
InstrItinClass itin,
string opc, string asm, string cstr, list<dag> pattern>
: InstThumb<am, sz, IndexModeNone, ThumbFrm, GenericDomain, cstr, itin> {
@@ -977,17 +976,17 @@ class Thumb1pI<dag oops, dag iops, AddrMode am, SizeFlagVal sz,
class T1pI<dag oops, dag iops, InstrItinClass itin,
string opc, string asm, list<dag> pattern>
- : Thumb1pI<oops, iops, AddrModeNone, Size2Bytes, itin, opc, asm, "", pattern>;
+ : Thumb1pI<oops, iops, AddrModeNone, 2, itin, opc, asm, "", pattern>;
// Two-address instructions
class T1pIt<dag oops, dag iops, InstrItinClass itin,
string opc, string asm, list<dag> pattern>
- : Thumb1pI<oops, iops, AddrModeNone, Size2Bytes, itin, opc, asm,
+ : Thumb1pI<oops, iops, AddrModeNone, 2, itin, opc, asm,
"$Rn = $Rdn", pattern>;
class T1pIs<dag oops, dag iops,
InstrItinClass itin, string opc, string asm, list<dag> pattern>
- : Thumb1pI<oops, iops, AddrModeT1_s, Size2Bytes, itin, opc, asm, "", pattern>;
+ : Thumb1pI<oops, iops, AddrModeT1_s, 2, itin, opc, asm, "", pattern>;
class Encoding16 : Encoding {
let Inst{31-16} = 0x0000;
@@ -1036,7 +1035,7 @@ class T1BranchCond<bits<4> opcode> : Encoding16 {
class T1pILdStEncode<bits<3> opcode, dag oops, dag iops, AddrMode am,
InstrItinClass itin, string opc, string asm,
list<dag> pattern>
- : Thumb1pI<oops, iops, am, Size2Bytes, itin, opc, asm, "", pattern>,
+ : Thumb1pI<oops, iops, am, 2, itin, opc, asm, "", pattern>,
T1LoadStore<0b0101, opcode> {
bits<3> Rt;
bits<8> addr;
@@ -1047,7 +1046,7 @@ class T1pILdStEncode<bits<3> opcode, dag oops, dag iops, AddrMode am,
class T1pILdStEncodeImm<bits<4> opA, bit opB, dag oops, dag iops, AddrMode am,
InstrItinClass itin, string opc, string asm,
list<dag> pattern>
- : Thumb1pI<oops, iops, am, Size2Bytes, itin, opc, asm, "", pattern>,
+ : Thumb1pI<oops, iops, am, 2, itin, opc, asm, "", pattern>,
T1LoadStore<opA, {opB,?,?}> {
bits<3> Rt;
bits<8> addr;
@@ -1063,7 +1062,7 @@ class T1Misc<bits<7> opcode> : Encoding16 {
}
// Thumb2I - Thumb2 instruction. Almost all Thumb2 instructions are predicable.
-class Thumb2I<dag oops, dag iops, AddrMode am, SizeFlagVal sz,
+class Thumb2I<dag oops, dag iops, AddrMode am, int sz,
InstrItinClass itin,
string opc, string asm, string cstr, list<dag> pattern>
: InstARM<am, sz, IndexModeNone, ThumbFrm, GenericDomain, cstr, itin> {
@@ -1080,7 +1079,7 @@ class Thumb2I<dag oops, dag iops, AddrMode am, SizeFlagVal sz,
//
// FIXME: This uses unified syntax so {s} comes before {p}. We should make it
// more consistent.
-class Thumb2sI<dag oops, dag iops, AddrMode am, SizeFlagVal sz,
+class Thumb2sI<dag oops, dag iops, AddrMode am, int sz,
InstrItinClass itin,
string opc, string asm, string cstr, list<dag> pattern>
: InstARM<am, sz, IndexModeNone, ThumbFrm, GenericDomain, cstr, itin> {
@@ -1095,7 +1094,7 @@ class Thumb2sI<dag oops, dag iops, AddrMode am, SizeFlagVal sz,
}
// Special cases
-class Thumb2XI<dag oops, dag iops, AddrMode am, SizeFlagVal sz,
+class Thumb2XI<dag oops, dag iops, AddrMode am, int sz,
InstrItinClass itin,
string asm, string cstr, list<dag> pattern>
: InstARM<am, sz, IndexModeNone, ThumbFrm, GenericDomain, cstr, itin> {
@@ -1106,7 +1105,7 @@ class Thumb2XI<dag oops, dag iops, AddrMode am, SizeFlagVal sz,
list<Predicate> Predicates = [IsThumb2];
}
-class ThumbXI<dag oops, dag iops, AddrMode am, SizeFlagVal sz,
+class ThumbXI<dag oops, dag iops, AddrMode am, int sz,
InstrItinClass itin,
string asm, string cstr, list<dag> pattern>
: InstARM<am, sz, IndexModeNone, ThumbFrm, GenericDomain, cstr, itin> {
@@ -1119,22 +1118,22 @@ class ThumbXI<dag oops, dag iops, AddrMode am, SizeFlagVal sz,
class T2I<dag oops, dag iops, InstrItinClass itin,
string opc, string asm, list<dag> pattern>
- : Thumb2I<oops, iops, AddrModeNone, Size4Bytes, itin, opc, asm, "", pattern>;
+ : Thumb2I<oops, iops, AddrModeNone, 4, itin, opc, asm, "", pattern>;
class T2Ii12<dag oops, dag iops, InstrItinClass itin,
string opc, string asm, list<dag> pattern>
- : Thumb2I<oops, iops, AddrModeT2_i12, Size4Bytes, itin, opc, asm, "",pattern>;
+ : Thumb2I<oops, iops, AddrModeT2_i12, 4, itin, opc, asm, "",pattern>;
class T2Ii8<dag oops, dag iops, InstrItinClass itin,
string opc, string asm, list<dag> pattern>
- : Thumb2I<oops, iops, AddrModeT2_i8, Size4Bytes, itin, opc, asm, "", pattern>;
+ : Thumb2I<oops, iops, AddrModeT2_i8, 4, itin, opc, asm, "", pattern>;
class T2Iso<dag oops, dag iops, InstrItinClass itin,
string opc, string asm, list<dag> pattern>
- : Thumb2I<oops, iops, AddrModeT2_so, Size4Bytes, itin, opc, asm, "", pattern>;
+ : Thumb2I<oops, iops, AddrModeT2_so, 4, itin, opc, asm, "", pattern>;
class T2Ipc<dag oops, dag iops, InstrItinClass itin,
string opc, string asm, list<dag> pattern>
- : Thumb2I<oops, iops, AddrModeT2_pc, Size4Bytes, itin, opc, asm, "", pattern>;
+ : Thumb2I<oops, iops, AddrModeT2_pc, 4, itin, opc, asm, "", pattern>;
class T2Ii8s4<bit P, bit W, bit isLoad, dag oops, dag iops, InstrItinClass itin,
string opc, string asm, list<dag> pattern>
- : Thumb2I<oops, iops, AddrModeT2_i8s4, Size4Bytes, itin, opc, asm, "",
+ : Thumb2I<oops, iops, AddrModeT2_i8s4, 4, itin, opc, asm, "",
pattern> {
bits<4> Rt;
bits<4> Rt2;
@@ -1153,32 +1152,32 @@ class T2Ii8s4<bit P, bit W, bit isLoad, dag oops, dag iops, InstrItinClass itin,
class T2sI<dag oops, dag iops, InstrItinClass itin,
string opc, string asm, list<dag> pattern>
- : Thumb2sI<oops, iops, AddrModeNone, Size4Bytes, itin, opc, asm, "", pattern>;
+ : Thumb2sI<oops, iops, AddrModeNone, 4, itin, opc, asm, "", pattern>;
class T2XI<dag oops, dag iops, InstrItinClass itin,
string asm, list<dag> pattern>
- : Thumb2XI<oops, iops, AddrModeNone, Size4Bytes, itin, asm, "", pattern>;
+ : Thumb2XI<oops, iops, AddrModeNone, 4, itin, asm, "", pattern>;
class T2JTI<dag oops, dag iops, InstrItinClass itin,
string asm, list<dag> pattern>
- : Thumb2XI<oops, iops, AddrModeNone, SizeSpecial, itin, asm, "", pattern>;
+ : Thumb2XI<oops, iops, AddrModeNone, 0, itin, asm, "", pattern>;
// Move to/from coprocessor instructions
-class T2Cop<dag oops, dag iops, string asm, list<dag> pattern>
- : T2XI<oops, iops, NoItinerary, asm, pattern>, Requires<[IsThumb2, HasV6]> {
- let Inst{31-28} = 0b1111;
+class T2Cop<bits<4> opc, dag oops, dag iops, string asm, list<dag> pattern>
+ : T2XI <oops, iops, NoItinerary, asm, pattern>, Requires<[IsThumb2]> {
+ let Inst{31-28} = opc;
}
// Two-address instructions
class T2XIt<dag oops, dag iops, InstrItinClass itin,
string asm, string cstr, list<dag> pattern>
- : Thumb2XI<oops, iops, AddrModeNone, Size4Bytes, itin, asm, cstr, pattern>;
+ : Thumb2XI<oops, iops, AddrModeNone, 4, itin, asm, cstr, pattern>;
// T2Iidxldst - Thumb2 indexed load / store instructions.
class T2Iidxldst<bit signed, bits<2> opcod, bit load, bit pre,
dag oops, dag iops,
AddrMode am, IndexMode im, InstrItinClass itin,
string opc, string asm, string cstr, list<dag> pattern>
- : InstARM<am, Size4Bytes, im, ThumbFrm, GenericDomain, cstr, itin> {
+ : InstARM<am, 4, im, ThumbFrm, GenericDomain, cstr, itin> {
let OutOperandList = oops;
let InOperandList = !con(iops, (ins pred:$p));
let AsmString = !strconcat(opc, "${p}", asm);
@@ -1232,7 +1231,7 @@ class T2Pat<dag pattern, dag result> : Pat<pattern, result> {
//
// Almost all VFP instructions are predicable.
-class VFPI<dag oops, dag iops, AddrMode am, SizeFlagVal sz,
+class VFPI<dag oops, dag iops, AddrMode am, int sz,
IndexMode im, Format f, InstrItinClass itin,
string opc, string asm, string cstr, list<dag> pattern>
: InstARM<am, sz, im, f, VFPDomain, cstr, itin> {
@@ -1247,7 +1246,7 @@ class VFPI<dag oops, dag iops, AddrMode am, SizeFlagVal sz,
}
// Special cases
-class VFPXI<dag oops, dag iops, AddrMode am, SizeFlagVal sz,
+class VFPXI<dag oops, dag iops, AddrMode am, int sz,
IndexMode im, Format f, InstrItinClass itin,
string asm, string cstr, list<dag> pattern>
: InstARM<am, sz, im, f, VFPDomain, cstr, itin> {
@@ -1263,7 +1262,7 @@ class VFPXI<dag oops, dag iops, AddrMode am, SizeFlagVal sz,
class VFPAI<dag oops, dag iops, Format f, InstrItinClass itin,
string opc, string asm, list<dag> pattern>
- : VFPI<oops, iops, AddrModeNone, Size4Bytes, IndexModeNone, f, itin,
+ : VFPI<oops, iops, AddrModeNone, 4, IndexModeNone, f, itin,
opc, asm, "", pattern> {
let PostEncoderMethod = "VFPThumb2PostEncoder";
}
@@ -1272,7 +1271,7 @@ class VFPAI<dag oops, dag iops, Format f, InstrItinClass itin,
class ADI5<bits<4> opcod1, bits<2> opcod2, dag oops, dag iops,
InstrItinClass itin,
string opc, string asm, list<dag> pattern>
- : VFPI<oops, iops, AddrMode5, Size4Bytes, IndexModeNone,
+ : VFPI<oops, iops, AddrMode5, 4, IndexModeNone,
VFPLdStFrm, itin, opc, asm, "", pattern> {
// Instruction operands.
bits<5> Dd;
@@ -1298,7 +1297,7 @@ class ADI5<bits<4> opcod1, bits<2> opcod2, dag oops, dag iops,
class ASI5<bits<4> opcod1, bits<2> opcod2, dag oops, dag iops,
InstrItinClass itin,
string opc, string asm, list<dag> pattern>
- : VFPI<oops, iops, AddrMode5, Size4Bytes, IndexModeNone,
+ : VFPI<oops, iops, AddrMode5, 4, IndexModeNone,
VFPLdStFrm, itin, opc, asm, "", pattern> {
// Instruction operands.
bits<5> Sd;
@@ -1324,7 +1323,7 @@ class ASI5<bits<4> opcod1, bits<2> opcod2, dag oops, dag iops,
// VFP Load / store multiple pseudo instructions.
class PseudoVFPLdStM<dag oops, dag iops, InstrItinClass itin, string cstr,
list<dag> pattern>
- : InstARM<AddrMode4, Size4Bytes, IndexModeNone, Pseudo, VFPNeonDomain,
+ : InstARM<AddrMode4, 4, IndexModeNone, Pseudo, VFPNeonDomain,
cstr, itin> {
let OutOperandList = oops;
let InOperandList = !con(iops, (ins pred:$p));
@@ -1335,7 +1334,7 @@ class PseudoVFPLdStM<dag oops, dag iops, InstrItinClass itin, string cstr,
// Load / store multiple
class AXDI4<dag oops, dag iops, IndexMode im, InstrItinClass itin,
string asm, string cstr, list<dag> pattern>
- : VFPXI<oops, iops, AddrMode4, Size4Bytes, im,
+ : VFPXI<oops, iops, AddrMode4, 4, im,
VFPLdStMulFrm, itin, asm, cstr, pattern> {
// Instruction operands.
bits<4> Rn;
@@ -1355,7 +1354,7 @@ class AXDI4<dag oops, dag iops, IndexMode im, InstrItinClass itin,
class AXSI4<dag oops, dag iops, IndexMode im, InstrItinClass itin,
string asm, string cstr, list<dag> pattern>
- : VFPXI<oops, iops, AddrMode4, Size4Bytes, im,
+ : VFPXI<oops, iops, AddrMode4, 4, im,
VFPLdStMulFrm, itin, asm, cstr, pattern> {
// Instruction operands.
bits<4> Rn;
@@ -1569,7 +1568,7 @@ class AVConv5I<bits<8> opcod1, bits<4> opcod2, dag oops, dag iops,
class NeonI<dag oops, dag iops, AddrMode am, IndexMode im, Format f,
InstrItinClass itin, string opc, string dt, string asm, string cstr,
list<dag> pattern>
- : InstARM<am, Size4Bytes, im, f, NeonDomain, cstr, itin> {
+ : InstARM<am, 4, im, f, NeonDomain, cstr, itin> {
let OutOperandList = oops;
let InOperandList = !con(iops, (ins pred:$p));
let AsmString = !strconcat(opc, "${p}", ".", dt, "\t", asm);
@@ -1581,7 +1580,7 @@ class NeonI<dag oops, dag iops, AddrMode am, IndexMode im, Format f,
class NeonXI<dag oops, dag iops, AddrMode am, IndexMode im, Format f,
InstrItinClass itin, string opc, string asm, string cstr,
list<dag> pattern>
- : InstARM<am, Size4Bytes, im, f, NeonDomain, cstr, itin> {
+ : InstARM<am, 4, im, f, NeonDomain, cstr, itin> {
let OutOperandList = oops;
let InOperandList = !con(iops, (ins pred:$p));
let AsmString = !strconcat(opc, "${p}", "\t", asm);
@@ -1621,7 +1620,7 @@ class NLdStLn<bit op23, bits<2> op21_20, bits<4> op11_8, bits<4> op7_4,
}
class PseudoNLdSt<dag oops, dag iops, InstrItinClass itin, string cstr>
- : InstARM<AddrMode6, Size4Bytes, IndexModeNone, Pseudo, NeonDomain, cstr,
+ : InstARM<AddrMode6, 4, IndexModeNone, Pseudo, NeonDomain, cstr,
itin> {
let OutOperandList = oops;
let InOperandList = !con(iops, (ins pred:$p));
@@ -1630,7 +1629,7 @@ class PseudoNLdSt<dag oops, dag iops, InstrItinClass itin, string cstr>
class PseudoNeonI<dag oops, dag iops, InstrItinClass itin, string cstr,
list<dag> pattern>
- : InstARM<AddrModeNone, Size4Bytes, IndexModeNone, Pseudo, NeonDomain, cstr,
+ : InstARM<AddrModeNone, 4, IndexModeNone, Pseudo, NeonDomain, cstr,
itin> {
let OutOperandList = oops;
let InOperandList = !con(iops, (ins pred:$p));
@@ -1859,7 +1858,7 @@ class N3VX<bit op24, bit op23, bits<2> op21_20, bits<4> op11_8, bit op6,
class NVLaneOp<bits<8> opcod1, bits<4> opcod2, bits<2> opcod3,
dag oops, dag iops, Format f, InstrItinClass itin,
string opc, string dt, string asm, list<dag> pattern>
- : InstARM<AddrModeNone, Size4Bytes, IndexModeNone, f, NeonDomain,
+ : InstARM<AddrModeNone, 4, IndexModeNone, f, NeonDomain,
"", itin> {
let Inst{27-20} = opcod1;
let Inst{11-8} = opcod2;
diff --git a/contrib/llvm/lib/Target/ARM/ARMInstrInfo.cpp b/contrib/llvm/lib/Target/ARM/ARMInstrInfo.cpp
index 6f48d96..adcbf18 100644
--- a/contrib/llvm/lib/Target/ARM/ARMInstrInfo.cpp
+++ b/contrib/llvm/lib/Target/ARM/ARMInstrInfo.cpp
@@ -14,7 +14,6 @@
#include "ARMInstrInfo.h"
#include "ARM.h"
#include "ARMAddressingModes.h"
-#include "ARMGenInstrInfo.inc"
#include "ARMMachineFunctionInfo.h"
#include "llvm/ADT/STLExtras.h"
#include "llvm/CodeGen/LiveVariables.h"
diff --git a/contrib/llvm/lib/Target/ARM/ARMInstrInfo.td b/contrib/llvm/lib/Target/ARM/ARMInstrInfo.td
index 9af76df..a42dd1a 100644
--- a/contrib/llvm/lib/Target/ARM/ARMInstrInfo.td
+++ b/contrib/llvm/lib/Target/ARM/ARMInstrInfo.td
@@ -62,6 +62,9 @@ def SDT_ARMEH_SJLJ_DispatchSetup: SDTypeProfile<0, 1, [SDTCisInt<0>]>;
def SDT_ARMMEMBARRIER : SDTypeProfile<0, 1, [SDTCisInt<0>]>;
+def SDT_ARMPREFETCH : SDTypeProfile<0, 3, [SDTCisPtrTy<0>, SDTCisSameAs<1, 2>,
+ SDTCisInt<1>]>;
+
def SDT_ARMTCRET : SDTypeProfile<0, 1, [SDTCisPtrTy<0>]>;
def SDT_ARMBFI : SDTypeProfile<1, 3, [SDTCisVT<0, i32>, SDTCisVT<1, i32>,
@@ -130,7 +133,7 @@ def ARMMemBarrier : SDNode<"ARMISD::MEMBARRIER", SDT_ARMMEMBARRIER,
[SDNPHasChain]>;
def ARMMemBarrierMCR : SDNode<"ARMISD::MEMBARRIER_MCR", SDT_ARMMEMBARRIER,
[SDNPHasChain]>;
-def ARMPreload : SDNode<"ARMISD::PRELOAD", SDTPrefetch,
+def ARMPreload : SDNode<"ARMISD::PRELOAD", SDT_ARMPREFETCH,
[SDNPHasChain, SDNPMayLoad, SDNPMayStore]>;
def ARMrbit : SDNode<"ARMISD::RBIT", SDTIntUnaryOp>;
@@ -144,33 +147,48 @@ def ARMbfi : SDNode<"ARMISD::BFI", SDT_ARMBFI>;
//===----------------------------------------------------------------------===//
// ARM Instruction Predicate Definitions.
//
-def HasV4T : Predicate<"Subtarget->hasV4TOps()">, AssemblerPredicate;
+def HasV4T : Predicate<"Subtarget->hasV4TOps()">,
+ AssemblerPredicate<"HasV4TOps">;
def NoV4T : Predicate<"!Subtarget->hasV4TOps()">;
def HasV5T : Predicate<"Subtarget->hasV5TOps()">;
-def HasV5TE : Predicate<"Subtarget->hasV5TEOps()">, AssemblerPredicate;
-def HasV6 : Predicate<"Subtarget->hasV6Ops()">, AssemblerPredicate;
+def HasV5TE : Predicate<"Subtarget->hasV5TEOps()">,
+ AssemblerPredicate<"HasV5TEOps">;
+def HasV6 : Predicate<"Subtarget->hasV6Ops()">,
+ AssemblerPredicate<"HasV6Ops">;
def NoV6 : Predicate<"!Subtarget->hasV6Ops()">;
-def HasV6T2 : Predicate<"Subtarget->hasV6T2Ops()">, AssemblerPredicate;
+def HasV6T2 : Predicate<"Subtarget->hasV6T2Ops()">,
+ AssemblerPredicate<"HasV6T2Ops">;
def NoV6T2 : Predicate<"!Subtarget->hasV6T2Ops()">;
-def HasV7 : Predicate<"Subtarget->hasV7Ops()">, AssemblerPredicate;
+def HasV7 : Predicate<"Subtarget->hasV7Ops()">,
+ AssemblerPredicate<"HasV7Ops">;
def NoVFP : Predicate<"!Subtarget->hasVFP2()">;
-def HasVFP2 : Predicate<"Subtarget->hasVFP2()">, AssemblerPredicate;
-def HasVFP3 : Predicate<"Subtarget->hasVFP3()">, AssemblerPredicate;
-def HasNEON : Predicate<"Subtarget->hasNEON()">, AssemblerPredicate;
-def HasFP16 : Predicate<"Subtarget->hasFP16()">, AssemblerPredicate;
-def HasDivide : Predicate<"Subtarget->hasDivide()">, AssemblerPredicate;
+def HasVFP2 : Predicate<"Subtarget->hasVFP2()">,
+ AssemblerPredicate<"FeatureVFP2">;
+def HasVFP3 : Predicate<"Subtarget->hasVFP3()">,
+ AssemblerPredicate<"FeatureVFP3">;
+def HasNEON : Predicate<"Subtarget->hasNEON()">,
+ AssemblerPredicate<"FeatureNEON">;
+def HasFP16 : Predicate<"Subtarget->hasFP16()">,
+ AssemblerPredicate<"FeatureFP16">;
+def HasDivide : Predicate<"Subtarget->hasDivide()">,
+ AssemblerPredicate<"FeatureHWDiv">;
def HasT2ExtractPack : Predicate<"Subtarget->hasT2ExtractPack()">,
- AssemblerPredicate;
+ AssemblerPredicate<"FeatureT2XtPk">;
+def HasThumb2DSP : Predicate<"Subtarget->hasThumb2DSP()">,
+ AssemblerPredicate<"FeatureDSPThumb2">;
def HasDB : Predicate<"Subtarget->hasDataBarrier()">,
- AssemblerPredicate;
+ AssemblerPredicate<"FeatureDB">;
def HasMP : Predicate<"Subtarget->hasMPExtension()">,
- AssemblerPredicate;
+ AssemblerPredicate<"FeatureMP">;
def UseNEONForFP : Predicate<"Subtarget->useNEONForSinglePrecisionFP()">;
def DontUseNEONForFP : Predicate<"!Subtarget->useNEONForSinglePrecisionFP()">;
-def IsThumb : Predicate<"Subtarget->isThumb()">, AssemblerPredicate;
+def IsThumb : Predicate<"Subtarget->isThumb()">,
+ AssemblerPredicate<"ModeThumb">;
def IsThumb1Only : Predicate<"Subtarget->isThumb1Only()">;
-def IsThumb2 : Predicate<"Subtarget->isThumb2()">, AssemblerPredicate;
-def IsARM : Predicate<"!Subtarget->isThumb()">, AssemblerPredicate;
+def IsThumb2 : Predicate<"Subtarget->isThumb2()">,
+ AssemblerPredicate<"ModeThumb,FeatureThumb2">;
+def IsARM : Predicate<"!Subtarget->isThumb()">,
+ AssemblerPredicate<"!ModeThumb">;
def IsDarwin : Predicate<"Subtarget->isTargetDarwin()">;
def IsNotDarwin : Predicate<"!Subtarget->isTargetDarwin()">;
@@ -237,11 +255,13 @@ def lo16AllZero : PatLeaf<(i32 imm), [{
return (((uint32_t)N->getZExtValue()) & 0xFFFFUL) == 0;
}], hi16>;
-/// imm0_65535 predicate - True if the 32-bit immediate is in the range
-/// [0.65535].
-def imm0_65535 : ImmLeaf<i32, [{
+/// imm0_65535 - An immediate is in the range [0.65535].
+def Imm0_65535AsmOperand: AsmOperandClass { let Name = "Imm0_65535"; }
+def imm0_65535 : Operand<i32>, ImmLeaf<i32, [{
return Imm >= 0 && Imm < 65536;
-}]>;
+}]> {
+ let ParserMatchClass = Imm0_65535AsmOperand;
+}
class BinOpFrag<dag res> : PatFrag<(ops node:$LHS, node:$RHS), res>;
class UnOpFrag <dag res> : PatFrag<(ops node:$Src), res>;
@@ -294,16 +314,19 @@ def fsub_mlx : PatFrag<(ops node:$lhs, node:$rhs),(fsub node:$lhs, node:$rhs),[{
// FIXME: rename brtarget to t2_brtarget
def brtarget : Operand<OtherVT> {
let EncoderMethod = "getBranchTargetOpValue";
+ let OperandType = "OPERAND_PCREL";
}
// FIXME: get rid of this one?
def uncondbrtarget : Operand<OtherVT> {
let EncoderMethod = "getUnconditionalBranchTargetOpValue";
+ let OperandType = "OPERAND_PCREL";
}
// Branch target for ARM. Handles conditional/unconditional
def br_target : Operand<OtherVT> {
let EncoderMethod = "getARMBranchTargetOpValue";
+ let OperandType = "OPERAND_PCREL";
}
// Call target.
@@ -311,6 +334,7 @@ def br_target : Operand<OtherVT> {
def bltarget : Operand<i32> {
// Encoded the same as branch targets.
let EncoderMethod = "getBranchTargetOpValue";
+ let OperandType = "OPERAND_PCREL";
}
// Call target for ARM. Handles conditional/unconditional
@@ -318,6 +342,7 @@ def bltarget : Operand<i32> {
def bl_target : Operand<i32> {
// Encoded the same as branch targets.
let EncoderMethod = "getARMBranchTargetOpValue";
+ let OperandType = "OPERAND_PCREL";
}
@@ -394,14 +419,20 @@ def shift_imm : Operand<i32> {
let ParserMatchClass = ShifterAsmOperand;
}
+def ShiftedRegAsmOperand : AsmOperandClass {
+ let Name = "ShiftedReg";
+}
+
// shifter_operand operands: so_reg and so_imm.
def so_reg : Operand<i32>, // reg reg imm
ComplexPattern<i32, 3, "SelectShifterOperandReg",
[shl,srl,sra,rotr]> {
let EncoderMethod = "getSORegOpValue";
let PrintMethod = "printSORegOperand";
+ let ParserMatchClass = ShiftedRegAsmOperand;
let MIOperandInfo = (ops GPR, GPR, shift_imm);
}
+// FIXME: Does this need to be distinct from so_reg?
def shift_so_reg : Operand<i32>, // reg reg imm
ComplexPattern<i32, 3, "SelectShiftShifterOperandReg",
[shl,srl,sra,rotr]> {
@@ -416,7 +447,6 @@ def so_imm : Operand<i32>, ImmLeaf<i32, [{
return ARM_AM::getSOImmVal(Imm) != -1;
}]> {
let EncoderMethod = "getSOImmOpValue";
- let PrintMethod = "printSOImmOperand";
}
// Break so_imm's up into two pieces. This handles immediates with up to 16
@@ -434,6 +464,22 @@ def arm_i32imm : PatLeaf<(imm), [{
return ARM_AM::isSOImmTwoPartVal((unsigned)N->getZExtValue());
}]>;
+/// imm0_7 predicate - Immediate in the range [0,31].
+def Imm0_7AsmOperand: AsmOperandClass { let Name = "Imm0_7"; }
+def imm0_7 : Operand<i32>, ImmLeaf<i32, [{
+ return Imm >= 0 && Imm < 8;
+}]> {
+ let ParserMatchClass = Imm0_7AsmOperand;
+}
+
+/// imm0_15 predicate - Immediate in the range [0,31].
+def Imm0_15AsmOperand: AsmOperandClass { let Name = "Imm0_15"; }
+def imm0_15 : Operand<i32>, ImmLeaf<i32, [{
+ return Imm >= 0 && Imm < 16;
+}]> {
+ let ParserMatchClass = Imm0_15AsmOperand;
+}
+
/// imm0_31 predicate - True if the 32-bit immediate is in the range [0,31].
def imm0_31 : Operand<i32>, ImmLeaf<i32, [{
return Imm >= 0 && Imm < 32;
@@ -673,7 +719,7 @@ include "ARMInstrFormats.td"
/// binop that produces a value.
multiclass AsI1_bin_irs<bits<4> opcod, string opc,
InstrItinClass iii, InstrItinClass iir, InstrItinClass iis,
- PatFrag opnode, bit Commutable = 0> {
+ PatFrag opnode, string baseOpc, bit Commutable = 0> {
// The register-immediate version is re-materializable. This is useful
// in particular for taking the address of a local.
let isReMaterializable = 1 in {
@@ -713,6 +759,24 @@ multiclass AsI1_bin_irs<bits<4> opcod, string opc,
let Inst{15-12} = Rd;
let Inst{11-0} = shift;
}
+
+ // Assembly aliases for optional destination operand when it's the same
+ // as the source operand.
+ def : InstAlias<!strconcat(opc, "${s}${p} $Rdn, $imm"),
+ (!cast<Instruction>(!strconcat(baseOpc, "ri")) GPR:$Rdn, GPR:$Rdn,
+ so_imm:$imm, pred:$p,
+ cc_out:$s)>,
+ Requires<[IsARM]>;
+ def : InstAlias<!strconcat(opc, "${s}${p} $Rdn, $Rm"),
+ (!cast<Instruction>(!strconcat(baseOpc, "rr")) GPR:$Rdn, GPR:$Rdn,
+ GPR:$Rm, pred:$p,
+ cc_out:$s)>,
+ Requires<[IsARM]>;
+ def : InstAlias<!strconcat(opc, "${s}${p} $Rdn, $shift"),
+ (!cast<Instruction>(!strconcat(baseOpc, "rs")) GPR:$Rdn, GPR:$Rdn,
+ so_reg:$shift, pred:$p,
+ cc_out:$s)>,
+ Requires<[IsARM]>;
}
/// AI1_bin_s_irs - Similar to AsI1_bin_irs except it sets the 's' bit so the
@@ -909,9 +973,9 @@ multiclass AI_exta_rrot_np<bits<8> opcod, string opc> {
}
/// AI1_adde_sube_irs - Define instructions and patterns for adde and sube.
-let Uses = [CPSR] in {
multiclass AI1_adde_sube_irs<bits<4> opcod, string opc, PatFrag opnode,
- bit Commutable = 0> {
+ string baseOpc, bit Commutable = 0> {
+ let Uses = [CPSR] in {
def ri : AsI1<opcod, (outs GPR:$Rd), (ins GPR:$Rn, so_imm:$imm),
DPFrm, IIC_iALUi, opc, "\t$Rd, $Rn, $imm",
[(set GPR:$Rd, (opnode GPR:$Rn, so_imm:$imm))]>,
@@ -950,7 +1014,24 @@ multiclass AI1_adde_sube_irs<bits<4> opcod, string opc, PatFrag opnode,
let Inst{15-12} = Rd;
let Inst{19-16} = Rn;
}
-}
+ }
+ // Assembly aliases for optional destination operand when it's the same
+ // as the source operand.
+ def : InstAlias<!strconcat(opc, "${s}${p} $Rdn, $imm"),
+ (!cast<Instruction>(!strconcat(baseOpc, "ri")) GPR:$Rdn, GPR:$Rdn,
+ so_imm:$imm, pred:$p,
+ cc_out:$s)>,
+ Requires<[IsARM]>;
+ def : InstAlias<!strconcat(opc, "${s}${p} $Rdn, $Rm"),
+ (!cast<Instruction>(!strconcat(baseOpc, "rr")) GPR:$Rdn, GPR:$Rdn,
+ GPR:$Rm, pred:$p,
+ cc_out:$s)>,
+ Requires<[IsARM]>;
+ def : InstAlias<!strconcat(opc, "${s}${p} $Rdn, $shift"),
+ (!cast<Instruction>(!strconcat(baseOpc, "rs")) GPR:$Rdn, GPR:$Rdn,
+ so_reg:$shift, pred:$p,
+ cc_out:$s)>,
+ Requires<[IsARM]>;
}
// Carry setting variants
@@ -958,15 +1039,15 @@ multiclass AI1_adde_sube_irs<bits<4> opcod, string opc, PatFrag opnode,
let usesCustomInserter = 1 in {
multiclass AI1_adde_sube_s_irs<PatFrag opnode, bit Commutable = 0> {
def ri : ARMPseudoInst<(outs GPR:$Rd), (ins GPR:$Rn, so_imm:$imm),
- Size4Bytes, IIC_iALUi,
+ 4, IIC_iALUi,
[(set GPR:$Rd, (opnode GPR:$Rn, so_imm:$imm))]>;
def rr : ARMPseudoInst<(outs GPR:$Rd), (ins GPR:$Rn, GPR:$Rm),
- Size4Bytes, IIC_iALUr,
+ 4, IIC_iALUr,
[(set GPR:$Rd, (opnode GPR:$Rn, GPR:$Rm))]> {
let isCommutable = Commutable;
}
def rs : ARMPseudoInst<(outs GPR:$Rd), (ins GPR:$Rn, so_reg:$shift),
- Size4Bytes, IIC_iALUsr,
+ 4, IIC_iALUsr,
[(set GPR:$Rd, (opnode GPR:$Rn, so_reg:$shift))]>;
}
}
@@ -1116,9 +1197,8 @@ def SEV : AI<(outs), (ins), MiscFrm, NoItinerary, "sev", "",
// The i32imm operand $val can be used by a debugger to store more information
// about the breakpoint.
-def BKPT : AI<(outs), (ins i32imm:$val), MiscFrm, NoItinerary, "bkpt", "\t$val",
- [/* For disassembly only; pattern left blank */]>,
- Requires<[IsARM]> {
+def BKPT : AI<(outs), (ins imm0_65535:$val), MiscFrm, NoItinerary,
+ "bkpt", "\t$val", []>, Requires<[IsARM]> {
bits<16> val;
let Inst{3-0} = val{3-0};
let Inst{19-8} = val{15-4};
@@ -1208,9 +1288,8 @@ def SETEND : AXI<(outs),(ins setend_op:$end), MiscFrm, NoItinerary,
let Inst{8-0} = 0;
}
-def DBG : AI<(outs), (ins i32imm:$opt), MiscFrm, NoItinerary, "dbg", "\t$opt",
- [/* For disassembly only; pattern left blank */]>,
- Requires<[IsARM, HasV7]> {
+def DBG : AI<(outs), (ins imm0_15:$opt), MiscFrm, NoItinerary, "dbg", "\t$opt",
+ []>, Requires<[IsARM, HasV7]> {
bits<4> opt;
let Inst{27-4} = 0b001100100000111100001111;
let Inst{3-0} = opt;
@@ -1227,40 +1306,40 @@ def TRAP : AXI<(outs), (ins), MiscFrm, NoItinerary,
// Address computation and loads and stores in PIC mode.
let isNotDuplicable = 1 in {
def PICADD : ARMPseudoInst<(outs GPR:$dst), (ins GPR:$a, pclabel:$cp, pred:$p),
- Size4Bytes, IIC_iALUr,
+ 4, IIC_iALUr,
[(set GPR:$dst, (ARMpic_add GPR:$a, imm:$cp))]>;
let AddedComplexity = 10 in {
def PICLDR : ARMPseudoInst<(outs GPR:$dst), (ins addrmodepc:$addr, pred:$p),
- Size4Bytes, IIC_iLoad_r,
+ 4, IIC_iLoad_r,
[(set GPR:$dst, (load addrmodepc:$addr))]>;
def PICLDRH : ARMPseudoInst<(outs GPR:$Rt), (ins addrmodepc:$addr, pred:$p),
- Size4Bytes, IIC_iLoad_bh_r,
+ 4, IIC_iLoad_bh_r,
[(set GPR:$Rt, (zextloadi16 addrmodepc:$addr))]>;
def PICLDRB : ARMPseudoInst<(outs GPR:$Rt), (ins addrmodepc:$addr, pred:$p),
- Size4Bytes, IIC_iLoad_bh_r,
+ 4, IIC_iLoad_bh_r,
[(set GPR:$Rt, (zextloadi8 addrmodepc:$addr))]>;
def PICLDRSH : ARMPseudoInst<(outs GPR:$Rt), (ins addrmodepc:$addr, pred:$p),
- Size4Bytes, IIC_iLoad_bh_r,
+ 4, IIC_iLoad_bh_r,
[(set GPR:$Rt, (sextloadi16 addrmodepc:$addr))]>;
def PICLDRSB : ARMPseudoInst<(outs GPR:$Rt), (ins addrmodepc:$addr, pred:$p),
- Size4Bytes, IIC_iLoad_bh_r,
+ 4, IIC_iLoad_bh_r,
[(set GPR:$Rt, (sextloadi8 addrmodepc:$addr))]>;
}
let AddedComplexity = 10 in {
def PICSTR : ARMPseudoInst<(outs), (ins GPR:$src, addrmodepc:$addr, pred:$p),
- Size4Bytes, IIC_iStore_r, [(store GPR:$src, addrmodepc:$addr)]>;
+ 4, IIC_iStore_r, [(store GPR:$src, addrmodepc:$addr)]>;
def PICSTRH : ARMPseudoInst<(outs), (ins GPR:$src, addrmodepc:$addr, pred:$p),
- Size4Bytes, IIC_iStore_bh_r, [(truncstorei16 GPR:$src,
+ 4, IIC_iStore_bh_r, [(truncstorei16 GPR:$src,
addrmodepc:$addr)]>;
def PICSTRB : ARMPseudoInst<(outs), (ins GPR:$src, addrmodepc:$addr, pred:$p),
- Size4Bytes, IIC_iStore_bh_r, [(truncstorei8 GPR:$src, addrmodepc:$addr)]>;
+ 4, IIC_iStore_bh_r, [(truncstorei8 GPR:$src, addrmodepc:$addr)]>;
}
} // isNotDuplicable = 1
@@ -1282,11 +1361,11 @@ def ADR : AI1<{0,?,?,0}, (outs GPR:$Rd), (ins adrlabel:$label),
let Inst{11-0} = label;
}
def LEApcrel : ARMPseudoInst<(outs GPR:$Rd), (ins i32imm:$label, pred:$p),
- Size4Bytes, IIC_iALUi, []>;
+ 4, IIC_iALUi, []>;
def LEApcrelJT : ARMPseudoInst<(outs GPR:$Rd),
(ins i32imm:$label, nohash_imm:$id, pred:$p),
- Size4Bytes, IIC_iALUi, []>;
+ 4, IIC_iALUi, []>;
//===----------------------------------------------------------------------===//
// Control Flow Instructions.
@@ -1319,22 +1398,13 @@ let isBranch = 1, isTerminator = 1, isBarrier = 1, isIndirectBranch = 1 in {
let Inst{3-0} = dst;
}
- // For disassembly only.
- def BX_pred : AXI<(outs), (ins GPR:$dst, pred:$p), BrMiscFrm, IIC_Br,
- "bx$p\t$dst", [/* pattern left blank */]>,
+ def BX_pred : AI<(outs), (ins GPR:$dst), BrMiscFrm, IIC_Br,
+ "bx", "\t$dst", [/* pattern left blank */]>,
Requires<[IsARM, HasV4T]> {
bits<4> dst;
let Inst{27-4} = 0b000100101111111111110001;
let Inst{3-0} = dst;
}
-
- // ARMV4 only
- // FIXME: We would really like to define this as a vanilla ARMPat like:
- // ARMPat<(brind GPR:$dst), (MOVr PC, GPR:$dst)>
- // With that, however, we can't set isBranch, isTerminator, etc..
- def MOVPCRX : ARMPseudoInst<(outs), (ins GPR:$dst),
- Size4Bytes, IIC_Br, [(brind GPR:$dst)]>,
- Requires<[IsARM, NoV4T]>;
}
// All calls clobber the non-callee saved registers. SP is marked as
@@ -1386,12 +1456,12 @@ let isCall = 1,
// ARMv4T
// Note: Restrict $func to the tGPR regclass to prevent it being in LR.
def BX_CALL : ARMPseudoInst<(outs), (ins tGPR:$func, variable_ops),
- Size8Bytes, IIC_Br, [(ARMcall_nolink tGPR:$func)]>,
+ 8, IIC_Br, [(ARMcall_nolink tGPR:$func)]>,
Requires<[IsARM, HasV4T, IsNotDarwin]>;
// ARMv4
def BMOVPCRX_CALL : ARMPseudoInst<(outs), (ins tGPR:$func, variable_ops),
- Size8Bytes, IIC_Br, [(ARMcall_nolink tGPR:$func)]>,
+ 8, IIC_Br, [(ARMcall_nolink tGPR:$func)]>,
Requires<[IsARM, NoV4T, IsNotDarwin]>;
}
@@ -1401,131 +1471,82 @@ let isCall = 1,
// moved above / below calls.
Defs = [R0, R1, R2, R3, R9, R12, LR, QQQQ0, QQQQ2, QQQQ3, CPSR, FPSCR],
Uses = [R7, SP] in {
- def BLr9 : ARMPseudoInst<(outs), (ins bltarget:$func, variable_ops),
- Size4Bytes, IIC_Br,
- [(ARMcall tglobaladdr:$func)]>, Requires<[IsARM, IsDarwin]>;
-
- def BLr9_pred : ARMPseudoInst<(outs),
- (ins bltarget:$func, pred:$p, variable_ops),
- Size4Bytes, IIC_Br,
- [(ARMcall_pred tglobaladdr:$func)]>,
+ def BLr9 : ARMPseudoExpand<(outs), (ins bl_target:$func, variable_ops),
+ 4, IIC_Br,
+ [(ARMcall tglobaladdr:$func)], (BL bl_target:$func)>,
+ Requires<[IsARM, IsDarwin]>;
+
+ def BLr9_pred : ARMPseudoExpand<(outs),
+ (ins bl_target:$func, pred:$p, variable_ops),
+ 4, IIC_Br,
+ [(ARMcall_pred tglobaladdr:$func)],
+ (BL_pred bl_target:$func, pred:$p)>,
Requires<[IsARM, IsDarwin]>;
// ARMv5T and above
- def BLXr9 : ARMPseudoInst<(outs), (ins GPR:$func, variable_ops),
- Size4Bytes, IIC_Br,
- [(ARMcall GPR:$func)]>, Requires<[IsARM, HasV5T, IsDarwin]>;
-
- def BLXr9_pred: ARMPseudoInst<(outs), (ins GPR:$func, pred:$p, variable_ops),
- Size4Bytes, IIC_Br,
- [(ARMcall_pred GPR:$func)]>,
+ def BLXr9 : ARMPseudoExpand<(outs), (ins GPR:$func, variable_ops),
+ 4, IIC_Br,
+ [(ARMcall GPR:$func)],
+ (BLX GPR:$func)>,
+ Requires<[IsARM, HasV5T, IsDarwin]>;
+
+ def BLXr9_pred: ARMPseudoExpand<(outs), (ins GPR:$func, pred:$p,variable_ops),
+ 4, IIC_Br,
+ [(ARMcall_pred GPR:$func)],
+ (BLX_pred GPR:$func, pred:$p)>,
Requires<[IsARM, HasV5T, IsDarwin]>;
// ARMv4T
// Note: Restrict $func to the tGPR regclass to prevent it being in LR.
def BXr9_CALL : ARMPseudoInst<(outs), (ins tGPR:$func, variable_ops),
- Size8Bytes, IIC_Br, [(ARMcall_nolink tGPR:$func)]>,
+ 8, IIC_Br, [(ARMcall_nolink tGPR:$func)]>,
Requires<[IsARM, HasV4T, IsDarwin]>;
// ARMv4
def BMOVPCRXr9_CALL : ARMPseudoInst<(outs), (ins tGPR:$func, variable_ops),
- Size8Bytes, IIC_Br, [(ARMcall_nolink tGPR:$func)]>,
+ 8, IIC_Br, [(ARMcall_nolink tGPR:$func)]>,
Requires<[IsARM, NoV4T, IsDarwin]>;
}
-// Tail calls.
-
-// FIXME: The Thumb versions of these should live in ARMInstrThumb.td
-let isCall = 1, isTerminator = 1, isReturn = 1, isBarrier = 1 in {
- // Darwin versions.
- let Defs = [R0, R1, R2, R3, R9, R12, QQQQ0, QQQQ2, QQQQ3, PC],
- Uses = [SP] in {
- def TCRETURNdi : PseudoInst<(outs), (ins i32imm:$dst, variable_ops),
- IIC_Br, []>, Requires<[IsDarwin]>;
-
- def TCRETURNri : PseudoInst<(outs), (ins tcGPR:$dst, variable_ops),
- IIC_Br, []>, Requires<[IsDarwin]>;
-
- def TAILJMPd : ARMPseudoInst<(outs), (ins brtarget:$dst, variable_ops),
- Size4Bytes, IIC_Br,
- []>, Requires<[IsARM, IsDarwin]>;
-
- def tTAILJMPd: tPseudoInst<(outs), (ins brtarget:$dst, variable_ops),
- Size4Bytes, IIC_Br,
- []>, Requires<[IsThumb, IsDarwin]>;
-
- def TAILJMPr : ARMPseudoInst<(outs), (ins tcGPR:$dst, variable_ops),
- Size4Bytes, IIC_Br,
- []>, Requires<[IsARM, IsDarwin]>;
-
- def tTAILJMPr : tPseudoInst<(outs), (ins tcGPR:$dst, variable_ops),
- Size4Bytes, IIC_Br,
- []>, Requires<[IsThumb, IsDarwin]>;
- }
-
- // Non-Darwin versions (the difference is R9).
- let Defs = [R0, R1, R2, R3, R12, QQQQ0, QQQQ2, QQQQ3, PC],
- Uses = [SP] in {
- def TCRETURNdiND : PseudoInst<(outs), (ins i32imm:$dst, variable_ops),
- IIC_Br, []>, Requires<[IsNotDarwin]>;
-
- def TCRETURNriND : PseudoInst<(outs), (ins tcGPR:$dst, variable_ops),
- IIC_Br, []>, Requires<[IsNotDarwin]>;
-
- def TAILJMPdND : ARMPseudoInst<(outs), (ins brtarget:$dst, variable_ops),
- Size4Bytes, IIC_Br,
- []>, Requires<[IsARM, IsNotDarwin]>;
-
- def tTAILJMPdND : tPseudoInst<(outs), (ins brtarget:$dst, variable_ops),
- Size4Bytes, IIC_Br,
- []>, Requires<[IsThumb, IsNotDarwin]>;
-
- def TAILJMPrND : ARMPseudoInst<(outs), (ins tcGPR:$dst, variable_ops),
- Size4Bytes, IIC_Br,
- []>, Requires<[IsARM, IsNotDarwin]>;
- def tTAILJMPrND : tPseudoInst<(outs), (ins tcGPR:$dst, variable_ops),
- Size4Bytes, IIC_Br,
- []>, Requires<[IsThumb, IsNotDarwin]>;
+let isBranch = 1, isTerminator = 1 in {
+ // FIXME: should be able to write a pattern for ARMBrcond, but can't use
+ // a two-value operand where a dag node expects two operands. :(
+ def Bcc : ABI<0b1010, (outs), (ins br_target:$target),
+ IIC_Br, "b", "\t$target",
+ [/*(ARMbrcond bb:$target, imm:$cc, CCR:$ccr)*/]> {
+ bits<24> target;
+ let Inst{23-0} = target;
}
-}
-let isBranch = 1, isTerminator = 1 in {
- // B is "predicable" since it's just a Bcc with an 'always' condition.
let isBarrier = 1 in {
+ // B is "predicable" since it's just a Bcc with an 'always' condition.
let isPredicable = 1 in
// FIXME: We shouldn't need this pseudo at all. Just using Bcc directly
// should be sufficient.
- def B : ARMPseudoInst<(outs), (ins brtarget:$target), Size4Bytes, IIC_Br,
- [(br bb:$target)]>;
+ // FIXME: Is B really a Barrier? That doesn't seem right.
+ def B : ARMPseudoExpand<(outs), (ins br_target:$target), 4, IIC_Br,
+ [(br bb:$target)], (Bcc br_target:$target, (ops 14, zero_reg))>;
let isNotDuplicable = 1, isIndirectBranch = 1 in {
def BR_JTr : ARMPseudoInst<(outs),
(ins GPR:$target, i32imm:$jt, i32imm:$id),
- SizeSpecial, IIC_Br,
+ 0, IIC_Br,
[(ARMbrjt GPR:$target, tjumptable:$jt, imm:$id)]>;
// FIXME: This shouldn't use the generic "addrmode2," but rather be split
// into i12 and rs suffixed versions.
def BR_JTm : ARMPseudoInst<(outs),
(ins addrmode2:$target, i32imm:$jt, i32imm:$id),
- SizeSpecial, IIC_Br,
+ 0, IIC_Br,
[(ARMbrjt (i32 (load addrmode2:$target)), tjumptable:$jt,
imm:$id)]>;
def BR_JTadd : ARMPseudoInst<(outs),
(ins GPR:$target, GPR:$idx, i32imm:$jt, i32imm:$id),
- SizeSpecial, IIC_Br,
+ 0, IIC_Br,
[(ARMbrjt (add GPR:$target, GPR:$idx), tjumptable:$jt,
imm:$id)]>;
} // isNotDuplicable = 1, isIndirectBranch = 1
} // isBarrier = 1
- // FIXME: should be able to write a pattern for ARMBrcond, but can't use
- // a two-value operand where a dag node expects two operands. :(
- def Bcc : ABI<0b1010, (outs), (ins br_target:$target),
- IIC_Br, "b", "\t$target",
- [/*(ARMbrcond bb:$target, imm:$cc, CCR:$ccr)*/]> {
- bits<24> target;
- let Inst{23-0} = target;
- }
}
// BLX (immediate) -- for disassembly only
@@ -1538,14 +1559,65 @@ def BLXi : AXI<(outs), (ins br_target:$target), BrMiscFrm, NoItinerary,
let Inst{24} = target{0};
}
-// Branch and Exchange Jazelle -- for disassembly only
+// Branch and Exchange Jazelle
def BXJ : ABI<0b0001, (outs), (ins GPR:$func), NoItinerary, "bxj", "\t$func",
- [/* For disassembly only; pattern left blank */]> {
+ [/* pattern left blank */]> {
+ bits<4> func;
let Inst{23-20} = 0b0010;
- //let Inst{19-8} = 0xfff;
+ let Inst{19-8} = 0xfff;
let Inst{7-4} = 0b0010;
+ let Inst{3-0} = func;
+}
+
+// Tail calls.
+
+let isCall = 1, isTerminator = 1, isReturn = 1, isBarrier = 1 in {
+ // Darwin versions.
+ let Defs = [R0, R1, R2, R3, R9, R12, QQQQ0, QQQQ2, QQQQ3, PC],
+ Uses = [SP] in {
+ def TCRETURNdi : PseudoInst<(outs), (ins i32imm:$dst, variable_ops),
+ IIC_Br, []>, Requires<[IsDarwin]>;
+
+ def TCRETURNri : PseudoInst<(outs), (ins tcGPR:$dst, variable_ops),
+ IIC_Br, []>, Requires<[IsDarwin]>;
+
+ def TAILJMPd : ARMPseudoExpand<(outs), (ins br_target:$dst, variable_ops),
+ 4, IIC_Br, [],
+ (Bcc br_target:$dst, (ops 14, zero_reg))>,
+ Requires<[IsARM, IsDarwin]>;
+
+ def TAILJMPr : ARMPseudoExpand<(outs), (ins tcGPR:$dst, variable_ops),
+ 4, IIC_Br, [],
+ (BX GPR:$dst)>,
+ Requires<[IsARM, IsDarwin]>;
+
+ }
+
+ // Non-Darwin versions (the difference is R9).
+ let Defs = [R0, R1, R2, R3, R12, QQQQ0, QQQQ2, QQQQ3, PC],
+ Uses = [SP] in {
+ def TCRETURNdiND : PseudoInst<(outs), (ins i32imm:$dst, variable_ops),
+ IIC_Br, []>, Requires<[IsNotDarwin]>;
+
+ def TCRETURNriND : PseudoInst<(outs), (ins tcGPR:$dst, variable_ops),
+ IIC_Br, []>, Requires<[IsNotDarwin]>;
+
+ def TAILJMPdND : ARMPseudoExpand<(outs), (ins brtarget:$dst, variable_ops),
+ 4, IIC_Br, [],
+ (Bcc br_target:$dst, (ops 14, zero_reg))>,
+ Requires<[IsARM, IsNotDarwin]>;
+
+ def TAILJMPrND : ARMPseudoExpand<(outs), (ins tcGPR:$dst, variable_ops),
+ 4, IIC_Br, [],
+ (BX GPR:$dst)>,
+ Requires<[IsARM, IsNotDarwin]>;
+ }
}
+
+
+
+
// Secure Monitor Call is a system instruction -- for disassembly only
def SMC : ABI<0b0001, (outs), (ins i32imm:$opt), NoItinerary, "smc", "\t$opt",
[/* For disassembly only; pattern left blank */]> {
@@ -1562,7 +1634,6 @@ def SVC : ABI<0b1111, (outs), (ins i32imm:$svc), IIC_Br, "svc", "\t$svc",
let Inst{23-0} = svc;
}
}
-def : MnemonicAlias<"swi", "svc">;
// Store Return State is a system instruction -- for disassembly only
let isCodeGenOnly = 1 in { // FIXME: This should not use submode!
@@ -1908,10 +1979,12 @@ def STRHT: AI3sthpo<(outs GPR:$base_wb), (ins GPR:$Rt, addrmode3:$addr),
multiclass arm_ldst_mult<string asm, bit L_bit, Format f,
InstrItinClass itin, InstrItinClass itin_upd> {
+ // IA is the default, so no need for an explicit suffix on the
+ // mnemonic here. Without it is the cannonical spelling.
def IA :
AXI4<(outs), (ins GPR:$Rn, pred:$p, reglist:$regs, variable_ops),
IndexModeNone, f, itin,
- !strconcat(asm, "ia${p}\t$Rn, $regs"), "", []> {
+ !strconcat(asm, "${p}\t$Rn, $regs"), "", []> {
let Inst{24-23} = 0b01; // Increment After
let Inst{21} = 0; // No writeback
let Inst{20} = L_bit;
@@ -1919,7 +1992,7 @@ multiclass arm_ldst_mult<string asm, bit L_bit, Format f,
def IA_UPD :
AXI4<(outs GPR:$wb), (ins GPR:$Rn, pred:$p, reglist:$regs, variable_ops),
IndexModeUpd, f, itin_upd,
- !strconcat(asm, "ia${p}\t$Rn!, $regs"), "$Rn = $wb", []> {
+ !strconcat(asm, "${p}\t$Rn!, $regs"), "$Rn = $wb", []> {
let Inst{24-23} = 0b01; // Increment After
let Inst{21} = 1; // Writeback
let Inst{20} = L_bit;
@@ -1984,17 +2057,14 @@ defm STM : arm_ldst_mult<"stm", 0, LdStMulFrm, IIC_iStore_m, IIC_iStore_mu>;
} // neverHasSideEffects
-// Load / Store Multiple Mnemonic Aliases
-def : MnemonicAlias<"ldm", "ldmia">;
-def : MnemonicAlias<"stm", "stmia">;
-
// FIXME: remove when we have a way to marking a MI with these properties.
// FIXME: Should pc be an implicit operand like PICADD, etc?
let isReturn = 1, isTerminator = 1, isBarrier = 1, mayLoad = 1,
hasExtraDefRegAllocReq = 1, isCodeGenOnly = 1 in
-def LDMIA_RET : ARMPseudoInst<(outs GPR:$wb), (ins GPR:$Rn, pred:$p,
- reglist:$regs, variable_ops),
- Size4Bytes, IIC_iLoad_mBr, []>,
+def LDMIA_RET : ARMPseudoExpand<(outs GPR:$wb), (ins GPR:$Rn, pred:$p,
+ reglist:$regs, variable_ops),
+ 4, IIC_iLoad_mBr, [],
+ (LDMIA_UPD GPR:$wb, GPR:$Rn, pred:$p, reglist:$regs)>,
RegConstraint<"$Rn = $wb">;
//===----------------------------------------------------------------------===//
@@ -2164,7 +2234,7 @@ defm UXTAB16 : AI_exta_rrot_np<0b01101100, "uxtab16">;
def SBFX : I<(outs GPR:$Rd),
(ins GPR:$Rn, imm0_31:$lsb, imm0_31_m1:$width),
- AddrMode1, Size4Bytes, IndexModeNone, DPFrm, IIC_iUNAsi,
+ AddrMode1, 4, IndexModeNone, DPFrm, IIC_iUNAsi,
"sbfx", "\t$Rd, $Rn, $lsb, $width", "", []>,
Requires<[IsARM, HasV6T2]> {
bits<4> Rd;
@@ -2181,7 +2251,7 @@ def SBFX : I<(outs GPR:$Rd),
def UBFX : I<(outs GPR:$Rd),
(ins GPR:$Rn, imm0_31:$lsb, imm0_31_m1:$width),
- AddrMode1, Size4Bytes, IndexModeNone, DPFrm, IIC_iUNAsi,
+ AddrMode1, 4, IndexModeNone, DPFrm, IIC_iUNAsi,
"ubfx", "\t$Rd, $Rn, $lsb, $width", "", []>,
Requires<[IsARM, HasV6T2]> {
bits<4> Rd;
@@ -2202,10 +2272,10 @@ def UBFX : I<(outs GPR:$Rd),
defm ADD : AsI1_bin_irs<0b0100, "add",
IIC_iALUi, IIC_iALUr, IIC_iALUsr,
- BinOpFrag<(add node:$LHS, node:$RHS)>, 1>;
+ BinOpFrag<(add node:$LHS, node:$RHS)>, "ADD", 1>;
defm SUB : AsI1_bin_irs<0b0010, "sub",
IIC_iALUi, IIC_iALUr, IIC_iALUsr,
- BinOpFrag<(sub node:$LHS, node:$RHS)>>;
+ BinOpFrag<(sub node:$LHS, node:$RHS)>, "SUB">;
// ADD and SUB with 's' bit set.
defm ADDS : AI1_bin_s_irs<0b0100, "adds",
@@ -2216,9 +2286,11 @@ defm SUBS : AI1_bin_s_irs<0b0010, "subs",
BinOpFrag<(subc node:$LHS, node:$RHS)>>;
defm ADC : AI1_adde_sube_irs<0b0101, "adc",
- BinOpFrag<(adde_dead_carry node:$LHS, node:$RHS)>, 1>;
+ BinOpFrag<(adde_dead_carry node:$LHS, node:$RHS)>,
+ "ADC", 1>;
defm SBC : AI1_adde_sube_irs<0b0110, "sbc",
- BinOpFrag<(sube_dead_carry node:$LHS, node:$RHS)>>;
+ BinOpFrag<(sube_dead_carry node:$LHS, node:$RHS)>,
+ "SBC">;
// ADC and SUBC with 's' bit set.
let usesCustomInserter = 1 in {
@@ -2271,13 +2343,13 @@ def RSBrs : AsI1<0b0011, (outs GPR:$Rd), (ins GPR:$Rn, so_reg:$shift),
// NOTE: CPSR def omitted because it will be handled by the custom inserter.
let usesCustomInserter = 1 in {
def RSBSri : ARMPseudoInst<(outs GPR:$Rd), (ins GPR:$Rn, so_imm:$imm),
- Size4Bytes, IIC_iALUi,
+ 4, IIC_iALUi,
[(set GPR:$Rd, (subc so_imm:$imm, GPR:$Rn))]>;
def RSBSrr : ARMPseudoInst<(outs GPR:$Rd), (ins GPR:$Rn, GPR:$Rm),
- Size4Bytes, IIC_iALUr,
+ 4, IIC_iALUr,
[/* For disassembly only; pattern left blank */]>;
def RSBSrs : ARMPseudoInst<(outs GPR:$Rd), (ins GPR:$Rn, so_reg:$shift),
- Size4Bytes, IIC_iALUsr,
+ 4, IIC_iALUsr,
[(set GPR:$Rd, (subc so_reg:$shift, GPR:$Rn))]>;
}
@@ -2325,10 +2397,10 @@ def RSCrs : AsI1<0b0111, (outs GPR:$Rd), (ins GPR:$Rn, so_reg:$shift),
// NOTE: CPSR def omitted because it will be handled by the custom inserter.
let usesCustomInserter = 1, Uses = [CPSR] in {
def RSCSri : ARMPseudoInst<(outs GPR:$Rd), (ins GPR:$Rn, so_imm:$imm),
- Size4Bytes, IIC_iALUi,
+ 4, IIC_iALUi,
[(set GPR:$Rd, (sube_dead_carry so_imm:$imm, GPR:$Rn))]>;
def RSCSrs : ARMPseudoInst<(outs GPR:$Rd), (ins GPR:$Rn, so_reg:$shift),
- Size4Bytes, IIC_iALUsr,
+ 4, IIC_iALUsr,
[(set GPR:$Rd, (sube_dead_carry so_reg:$shift, GPR:$Rn))]>;
}
@@ -2528,19 +2600,19 @@ def : ARMV6Pat<(int_arm_usat GPR:$a, imm:$pos), (USAT imm:$pos, GPR:$a, 0)>;
defm AND : AsI1_bin_irs<0b0000, "and",
IIC_iBITi, IIC_iBITr, IIC_iBITsr,
- BinOpFrag<(and node:$LHS, node:$RHS)>, 1>;
+ BinOpFrag<(and node:$LHS, node:$RHS)>, "AND", 1>;
defm ORR : AsI1_bin_irs<0b1100, "orr",
IIC_iBITi, IIC_iBITr, IIC_iBITsr,
- BinOpFrag<(or node:$LHS, node:$RHS)>, 1>;
+ BinOpFrag<(or node:$LHS, node:$RHS)>, "ORR", 1>;
defm EOR : AsI1_bin_irs<0b0001, "eor",
IIC_iBITi, IIC_iBITr, IIC_iBITsr,
- BinOpFrag<(xor node:$LHS, node:$RHS)>, 1>;
+ BinOpFrag<(xor node:$LHS, node:$RHS)>, "EOR", 1>;
defm BIC : AsI1_bin_irs<0b1110, "bic",
IIC_iBITi, IIC_iBITr, IIC_iBITsr,
- BinOpFrag<(and node:$LHS, (not node:$RHS))>>;
+ BinOpFrag<(and node:$LHS, (not node:$RHS))>, "BIC">;
def BFC : I<(outs GPR:$Rd), (ins GPR:$src, bf_inv_mask_imm:$imm),
- AddrMode1, Size4Bytes, IndexModeNone, DPFrm, IIC_iUNAsi,
+ AddrMode1, 4, IndexModeNone, DPFrm, IIC_iUNAsi,
"bfc", "\t$Rd, $imm", "$src = $Rd",
[(set GPR:$Rd, (and GPR:$src, bf_inv_mask_imm:$imm))]>,
Requires<[IsARM, HasV6T2]> {
@@ -2555,7 +2627,7 @@ def BFC : I<(outs GPR:$Rd), (ins GPR:$src, bf_inv_mask_imm:$imm),
// A8.6.18 BFI - Bitfield insert (Encoding A1)
def BFI : I<(outs GPR:$Rd), (ins GPR:$src, GPR:$Rn, bf_inv_mask_imm:$imm),
- AddrMode1, Size4Bytes, IndexModeNone, DPFrm, IIC_iUNAsi,
+ AddrMode1, 4, IndexModeNone, DPFrm, IIC_iUNAsi,
"bfi", "\t$Rd, $Rn, $imm", "$src = $Rd",
[(set GPR:$Rd, (ARMbfi GPR:$src, GPR:$Rn,
bf_inv_mask_imm:$imm))]>,
@@ -2575,7 +2647,7 @@ def BFI : I<(outs GPR:$Rd), (ins GPR:$src, GPR:$Rn, bf_inv_mask_imm:$imm),
let isAsmParserOnly = 1 in
def BFI4p : I<(outs GPR:$Rd), (ins GPR:$src, GPR:$Rn,
lsb_pos_imm:$lsb, width_imm:$width),
- AddrMode1, Size4Bytes, IndexModeNone, DPFrm, IIC_iUNAsi,
+ AddrMode1, 4, IndexModeNone, DPFrm, IIC_iUNAsi,
"bfi", "\t$Rd, $Rn, $lsb, $width", "$src = $Rd",
[]>, Requires<[IsARM, HasV6T2]> {
bits<4> Rd;
@@ -2652,31 +2724,26 @@ class AsMul1I64<bits<7> opcod, dag oops, dag iops, InstrItinClass itin,
let Inst{3-0} = Rn;
}
+// FIXME: The v5 pseudos are only necessary for the additional Constraint
+// property. Remove them when it's possible to add those properties
+// on an individual MachineInstr, not just an instuction description.
let isCommutable = 1 in {
-let Constraints = "@earlyclobber $Rd" in
-def MULv5: ARMPseudoInst<(outs GPR:$Rd), (ins GPR:$Rn, GPR:$Rm,
- pred:$p, cc_out:$s),
- Size4Bytes, IIC_iMUL32,
- [(set GPR:$Rd, (mul GPR:$Rn, GPR:$Rm))]>,
- Requires<[IsARM, NoV6]>;
-
def MUL : AsMul1I32<0b0000000, (outs GPR:$Rd), (ins GPR:$Rn, GPR:$Rm),
IIC_iMUL32, "mul", "\t$Rd, $Rn, $Rm",
[(set GPR:$Rd, (mul GPR:$Rn, GPR:$Rm))]>,
Requires<[IsARM, HasV6]> {
let Inst{15-12} = 0b0000;
}
-}
let Constraints = "@earlyclobber $Rd" in
-def MLAv5: ARMPseudoInst<(outs GPR:$Rd),
- (ins GPR:$Rn, GPR:$Rm, GPR:$Ra, pred:$p, cc_out:$s),
- Size4Bytes, IIC_iMAC32,
- [(set GPR:$Rd, (add (mul GPR:$Rn, GPR:$Rm), GPR:$Ra))]>,
- Requires<[IsARM, NoV6]> {
- bits<4> Ra;
- let Inst{15-12} = Ra;
+def MULv5: ARMPseudoExpand<(outs GPR:$Rd), (ins GPR:$Rn, GPR:$Rm,
+ pred:$p, cc_out:$s),
+ 4, IIC_iMUL32,
+ [(set GPR:$Rd, (mul GPR:$Rn, GPR:$Rm))],
+ (MUL GPR:$Rd, GPR:$Rn, GPR:$Rm, pred:$p, cc_out:$s)>,
+ Requires<[IsARM, NoV6]>;
}
+
def MLA : AsMul1I32<0b0000001, (outs GPR:$Rd), (ins GPR:$Rn, GPR:$Rm, GPR:$Ra),
IIC_iMAC32, "mla", "\t$Rd, $Rn, $Rm, $Ra",
[(set GPR:$Rd, (add (mul GPR:$Rn, GPR:$Rm), GPR:$Ra))]>,
@@ -2685,6 +2752,14 @@ def MLA : AsMul1I32<0b0000001, (outs GPR:$Rd), (ins GPR:$Rn, GPR:$Rm, GPR:$Ra),
let Inst{15-12} = Ra;
}
+let Constraints = "@earlyclobber $Rd" in
+def MLAv5: ARMPseudoExpand<(outs GPR:$Rd),
+ (ins GPR:$Rn, GPR:$Rm, GPR:$Ra, pred:$p, cc_out:$s),
+ 4, IIC_iMAC32,
+ [(set GPR:$Rd, (add (mul GPR:$Rn, GPR:$Rm), GPR:$Ra))],
+ (MLA GPR:$Rd, GPR:$Rn, GPR:$Rm, GPR:$Ra, pred:$p, cc_out:$s)>,
+ Requires<[IsARM, NoV6]>;
+
def MLS : AMul1I<0b0000011, (outs GPR:$Rd), (ins GPR:$Rn, GPR:$Rm, GPR:$Ra),
IIC_iMAC32, "mls", "\t$Rd, $Rn, $Rm, $Ra",
[(set GPR:$Rd, (sub GPR:$Ra, (mul GPR:$Rn, GPR:$Rm)))]>,
@@ -2700,49 +2775,34 @@ def MLS : AMul1I<0b0000011, (outs GPR:$Rd), (ins GPR:$Rn, GPR:$Rm, GPR:$Ra),
}
// Extra precision multiplies with low / high results
-
let neverHasSideEffects = 1 in {
let isCommutable = 1 in {
-let Constraints = "@earlyclobber $RdLo,@earlyclobber $RdHi" in {
-def SMULLv5 : ARMPseudoInst<(outs GPR:$RdLo, GPR:$RdHi),
- (ins GPR:$Rn, GPR:$Rm, pred:$p, cc_out:$s),
- Size4Bytes, IIC_iMUL64, []>,
- Requires<[IsARM, NoV6]>;
-
-def UMULLv5 : ARMPseudoInst<(outs GPR:$RdLo, GPR:$RdHi),
- (ins GPR:$Rn, GPR:$Rm, pred:$p, cc_out:$s),
- Size4Bytes, IIC_iMUL64, []>,
- Requires<[IsARM, NoV6]>;
-}
-
def SMULL : AsMul1I64<0b0000110, (outs GPR:$RdLo, GPR:$RdHi),
- (ins GPR:$Rn, GPR:$Rm), IIC_iMUL64,
+ (ins GPR:$Rn, GPR:$Rm), IIC_iMUL64,
"smull", "\t$RdLo, $RdHi, $Rn, $Rm", []>,
Requires<[IsARM, HasV6]>;
def UMULL : AsMul1I64<0b0000100, (outs GPR:$RdLo, GPR:$RdHi),
- (ins GPR:$Rn, GPR:$Rm), IIC_iMUL64,
+ (ins GPR:$Rn, GPR:$Rm), IIC_iMUL64,
"umull", "\t$RdLo, $RdHi, $Rn, $Rm", []>,
Requires<[IsARM, HasV6]>;
-}
-// Multiply + accumulate
let Constraints = "@earlyclobber $RdLo,@earlyclobber $RdHi" in {
-def SMLALv5 : ARMPseudoInst<(outs GPR:$RdLo, GPR:$RdHi),
- (ins GPR:$Rn, GPR:$Rm, pred:$p, cc_out:$s),
- Size4Bytes, IIC_iMAC64, []>,
- Requires<[IsARM, NoV6]>;
-def UMLALv5 : ARMPseudoInst<(outs GPR:$RdLo, GPR:$RdHi),
+def SMULLv5 : ARMPseudoExpand<(outs GPR:$RdLo, GPR:$RdHi),
(ins GPR:$Rn, GPR:$Rm, pred:$p, cc_out:$s),
- Size4Bytes, IIC_iMAC64, []>,
+ 4, IIC_iMUL64, [],
+ (SMULL GPR:$RdLo, GPR:$RdHi, GPR:$Rn, GPR:$Rm, pred:$p, cc_out:$s)>,
Requires<[IsARM, NoV6]>;
-def UMAALv5 : ARMPseudoInst<(outs GPR:$RdLo, GPR:$RdHi),
+
+def UMULLv5 : ARMPseudoExpand<(outs GPR:$RdLo, GPR:$RdHi),
(ins GPR:$Rn, GPR:$Rm, pred:$p, cc_out:$s),
- Size4Bytes, IIC_iMAC64, []>,
+ 4, IIC_iMUL64, [],
+ (UMULL GPR:$RdLo, GPR:$RdHi, GPR:$Rn, GPR:$Rm, pred:$p, cc_out:$s)>,
Requires<[IsARM, NoV6]>;
-
+}
}
+// Multiply + accumulate
def SMLAL : AsMul1I64<0b0000111, (outs GPR:$RdLo, GPR:$RdHi),
(ins GPR:$Rn, GPR:$Rm), IIC_iMAC64,
"smlal", "\t$RdLo, $RdHi, $Rn, $Rm", []>,
@@ -2765,6 +2825,25 @@ def UMAAL : AMul1I <0b0000010, (outs GPR:$RdLo, GPR:$RdHi),
let Inst{11-8} = Rm;
let Inst{3-0} = Rn;
}
+
+let Constraints = "@earlyclobber $RdLo,@earlyclobber $RdHi" in {
+def SMLALv5 : ARMPseudoExpand<(outs GPR:$RdLo, GPR:$RdHi),
+ (ins GPR:$Rn, GPR:$Rm, pred:$p, cc_out:$s),
+ 4, IIC_iMAC64, [],
+ (SMLAL GPR:$RdLo, GPR:$RdHi, GPR:$Rn, GPR:$Rm, pred:$p, cc_out:$s)>,
+ Requires<[IsARM, NoV6]>;
+def UMLALv5 : ARMPseudoExpand<(outs GPR:$RdLo, GPR:$RdHi),
+ (ins GPR:$Rn, GPR:$Rm, pred:$p, cc_out:$s),
+ 4, IIC_iMAC64, [],
+ (UMLAL GPR:$RdLo, GPR:$RdHi, GPR:$Rn, GPR:$Rm, pred:$p, cc_out:$s)>,
+ Requires<[IsARM, NoV6]>;
+def UMAALv5 : ARMPseudoExpand<(outs GPR:$RdLo, GPR:$RdHi),
+ (ins GPR:$Rn, GPR:$Rm, pred:$p),
+ 4, IIC_iMAC64, [],
+ (UMAAL GPR:$RdLo, GPR:$RdHi, GPR:$Rn, GPR:$Rm, pred:$p)>,
+ Requires<[IsARM, NoV6]>;
+}
+
} // neverHasSideEffects
// Most significant word multiply
@@ -3005,31 +3084,22 @@ def REV : AMiscA1I<0b01101011, 0b0011, (outs GPR:$Rd), (ins GPR:$Rm),
IIC_iUNAr, "rev", "\t$Rd, $Rm",
[(set GPR:$Rd, (bswap GPR:$Rm))]>, Requires<[IsARM, HasV6]>;
+let AddedComplexity = 5 in
def REV16 : AMiscA1I<0b01101011, 0b1011, (outs GPR:$Rd), (ins GPR:$Rm),
IIC_iUNAr, "rev16", "\t$Rd, $Rm",
- [(set GPR:$Rd,
- (or (and (srl GPR:$Rm, (i32 8)), 0xFF),
- (or (and (shl GPR:$Rm, (i32 8)), 0xFF00),
- (or (and (srl GPR:$Rm, (i32 8)), 0xFF0000),
- (and (shl GPR:$Rm, (i32 8)), 0xFF000000)))))]>,
+ [(set GPR:$Rd, (rotr (bswap GPR:$Rm), (i32 16)))]>,
Requires<[IsARM, HasV6]>;
+let AddedComplexity = 5 in
def REVSH : AMiscA1I<0b01101111, 0b1011, (outs GPR:$Rd), (ins GPR:$Rm),
IIC_iUNAr, "revsh", "\t$Rd, $Rm",
- [(set GPR:$Rd,
- (sext_inreg
- (or (srl GPR:$Rm, (i32 8)),
- (shl GPR:$Rm, (i32 8))), i16))]>,
+ [(set GPR:$Rd, (sra (bswap GPR:$Rm), (i32 16)))]>,
Requires<[IsARM, HasV6]>;
-def : ARMV6Pat<(sext_inreg (or (srl (and GPR:$Rm, 0xFF00), (i32 8)),
- (shl GPR:$Rm, (i32 8))), i16),
+def : ARMV6Pat<(or (sra (shl GPR:$Rm, (i32 24)), (i32 16)),
+ (and (srl GPR:$Rm, (i32 8)), 0xFF)),
(REVSH GPR:$Rm)>;
-// Need the AddedComplexity or else MOVs + REV would be chosen.
-let AddedComplexity = 5 in
-def : ARMV6Pat<(sra (bswap GPR:$Rm), (i32 16)), (REVSH GPR:$Rm)>;
-
def lsl_shift_imm : SDNodeXForm<imm, [{
unsigned Sh = ARM_AM::getSORegOpc(ARM_AM::lsl, N->getZExtValue());
return CurDAG->getTargetConstant(Sh, MVT::i32);
@@ -3177,26 +3247,26 @@ def BCCZi64 : PseudoInst<(outs),
// a two-value operand where a dag node expects two operands. :(
let neverHasSideEffects = 1 in {
def MOVCCr : ARMPseudoInst<(outs GPR:$Rd), (ins GPR:$false, GPR:$Rm, pred:$p),
- Size4Bytes, IIC_iCMOVr,
+ 4, IIC_iCMOVr,
[/*(set GPR:$Rd, (ARMcmov GPR:$false, GPR:$Rm, imm:$cc, CCR:$ccr))*/]>,
RegConstraint<"$false = $Rd">;
def MOVCCs : ARMPseudoInst<(outs GPR:$Rd),
(ins GPR:$false, so_reg:$shift, pred:$p),
- Size4Bytes, IIC_iCMOVsr,
+ 4, IIC_iCMOVsr,
[/*(set GPR:$Rd, (ARMcmov GPR:$false, so_reg:$shift, imm:$cc, CCR:$ccr))*/]>,
RegConstraint<"$false = $Rd">;
let isMoveImm = 1 in
def MOVCCi16 : ARMPseudoInst<(outs GPR:$Rd),
(ins GPR:$false, i32imm_hilo16:$imm, pred:$p),
- Size4Bytes, IIC_iMOVi,
+ 4, IIC_iMOVi,
[]>,
RegConstraint<"$false = $Rd">, Requires<[IsARM, HasV6T2]>;
let isMoveImm = 1 in
def MOVCCi : ARMPseudoInst<(outs GPR:$Rd),
(ins GPR:$false, so_imm:$imm, pred:$p),
- Size4Bytes, IIC_iCMOVi,
+ 4, IIC_iCMOVi,
[/*(set GPR:$Rd, (ARMcmov GPR:$false, so_imm:$imm, imm:$cc, CCR:$ccr))*/]>,
RegConstraint<"$false = $Rd">;
@@ -3204,12 +3274,12 @@ def MOVCCi : ARMPseudoInst<(outs GPR:$Rd),
let isMoveImm = 1 in
def MOVCCi32imm : ARMPseudoInst<(outs GPR:$Rd),
(ins GPR:$false, i32imm:$src, pred:$p),
- Size8Bytes, IIC_iCMOVix2, []>, RegConstraint<"$false = $Rd">;
+ 8, IIC_iCMOVix2, []>, RegConstraint<"$false = $Rd">;
let isMoveImm = 1 in
def MVNCCi : ARMPseudoInst<(outs GPR:$Rd),
(ins GPR:$false, so_imm:$imm, pred:$p),
- Size4Bytes, IIC_iCMOVi,
+ 4, IIC_iCMOVi,
[/*(set GPR:$Rd, (ARMcmov GPR:$false, so_imm_not:$imm, imm:$cc, CCR:$ccr))*/]>,
RegConstraint<"$false = $Rd">;
} // neverHasSideEffects
@@ -3235,19 +3305,20 @@ def DMB : AInoP<(outs), (ins memb_opt:$opt), MiscFrm, NoItinerary,
}
def DSB : AInoP<(outs), (ins memb_opt:$opt), MiscFrm, NoItinerary,
- "dsb", "\t$opt",
- [/* For disassembly only; pattern left blank */]>,
+ "dsb", "\t$opt", []>,
Requires<[IsARM, HasDB]> {
bits<4> opt;
let Inst{31-4} = 0xf57ff04;
let Inst{3-0} = opt;
}
-// ISB has only full system option -- for disassembly only
-def ISB : AInoP<(outs), (ins), MiscFrm, NoItinerary, "isb", "", []>,
+// ISB has only full system option
+def ISB : AInoP<(outs), (ins memb_opt:$opt), MiscFrm, NoItinerary,
+ "isb", "\t$opt", []>,
Requires<[IsARM, HasDB]> {
+ bits<4> opt;
let Inst{31-4} = 0xf57ff06;
- let Inst{3-0} = 0b1111;
+ let Inst{3-0} = opt;
}
let usesCustomInserter = 1 in {
@@ -3410,8 +3481,8 @@ def SWPB : AIswp<1, (outs GPR:$Rt), (ins GPR:$Rt2, GPR:$Rn), "swpb",
// Coprocessor Instructions.
//
-def CDP : ABI<0b1110, (outs), (ins p_imm:$cop, i32imm:$opc1,
- c_imm:$CRd, c_imm:$CRn, c_imm:$CRm, i32imm:$opc2),
+def CDP : ABI<0b1110, (outs), (ins p_imm:$cop, imm0_15:$opc1,
+ c_imm:$CRd, c_imm:$CRn, c_imm:$CRm, imm0_7:$opc2),
NoItinerary, "cdp", "\t$cop, $opc1, $CRd, $CRn, $CRm, $opc2",
[(int_arm_cdp imm:$cop, imm:$opc1, imm:$CRd, imm:$CRn,
imm:$CRm, imm:$opc2)]> {
@@ -3431,8 +3502,8 @@ def CDP : ABI<0b1110, (outs), (ins p_imm:$cop, i32imm:$opc1,
let Inst{23-20} = opc1;
}
-def CDP2 : ABXI<0b1110, (outs), (ins p_imm:$cop, i32imm:$opc1,
- c_imm:$CRd, c_imm:$CRn, c_imm:$CRm, i32imm:$opc2),
+def CDP2 : ABXI<0b1110, (outs), (ins p_imm:$cop, imm0_15:$opc1,
+ c_imm:$CRd, c_imm:$CRn, c_imm:$CRm, imm0_7:$opc2),
NoItinerary, "cdp2\t$cop, $opc1, $CRd, $CRn, $CRm, $opc2",
[(int_arm_cdp2 imm:$cop, imm:$opc1, imm:$CRd, imm:$CRn,
imm:$CRm, imm:$opc2)]> {
@@ -3455,7 +3526,7 @@ def CDP2 : ABXI<0b1110, (outs), (ins p_imm:$cop, i32imm:$opc1,
class ACI<dag oops, dag iops, string opc, string asm,
IndexMode im = IndexModeNone>
- : InoP<oops, iops, AddrModeNone, Size4Bytes, im, BrFrm, NoItinerary,
+ : InoP<oops, iops, AddrModeNone, 4, im, BrFrm, NoItinerary,
opc, asm, "", [/* For disassembly only; pattern left blank */]> {
let Inst{27-25} = 0b110;
}
@@ -3583,8 +3654,8 @@ class MovRCopro<string opc, bit direction, dag oops, dag iops,
def MCR : MovRCopro<"mcr", 0 /* from ARM core register to coprocessor */,
(outs),
- (ins p_imm:$cop, i32imm:$opc1, GPR:$Rt, c_imm:$CRn,
- c_imm:$CRm, i32imm:$opc2),
+ (ins p_imm:$cop, imm0_7:$opc1, GPR:$Rt, c_imm:$CRn,
+ c_imm:$CRm, imm0_7:$opc2),
[(int_arm_mcr imm:$cop, imm:$opc1, GPR:$Rt, imm:$CRn,
imm:$CRm, imm:$opc2)]>;
def MRC : MovRCopro<"mrc", 1 /* from coprocessor to ARM core register */,
@@ -3620,8 +3691,8 @@ class MovRCopro2<string opc, bit direction, dag oops, dag iops,
def MCR2 : MovRCopro2<"mcr2", 0 /* from ARM core register to coprocessor */,
(outs),
- (ins p_imm:$cop, i32imm:$opc1, GPR:$Rt, c_imm:$CRn,
- c_imm:$CRm, i32imm:$opc2),
+ (ins p_imm:$cop, imm0_7:$opc1, GPR:$Rt, c_imm:$CRn,
+ c_imm:$CRm, imm0_7:$opc2),
[(int_arm_mcr2 imm:$cop, imm:$opc1, GPR:$Rt, imm:$CRn,
imm:$CRm, imm:$opc2)]>;
def MRC2 : MovRCopro2<"mrc2", 1 /* from coprocessor to ARM core register */,
@@ -3635,7 +3706,7 @@ def : ARMV5TPat<(int_arm_mrc2 imm:$cop, imm:$opc1, imm:$CRn,
class MovRRCopro<string opc, bit direction,
list<dag> pattern = [/* For disassembly only */]>
- : ABI<0b1100, (outs), (ins p_imm:$cop, i32imm:$opc1,
+ : ABI<0b1100, (outs), (ins p_imm:$cop, imm0_15:$opc1,
GPR:$Rt, GPR:$Rt2, c_imm:$CRm),
NoItinerary, opc, "\t$cop, $opc1, $Rt, $Rt2, $CRm", pattern> {
let Inst{23-21} = 0b010;
@@ -3661,7 +3732,7 @@ def MRRC : MovRRCopro<"mrrc", 1 /* from coprocessor to ARM core register */>;
class MovRRCopro2<string opc, bit direction,
list<dag> pattern = [/* For disassembly only */]>
- : ABXI<0b1100, (outs), (ins p_imm:$cop, i32imm:$opc1,
+ : ABXI<0b1100, (outs), (ins p_imm:$cop, imm0_15:$opc1,
GPR:$Rt, GPR:$Rt2, c_imm:$CRm), NoItinerary,
!strconcat(opc, "\t$cop, $opc1, $Rt, $Rt2, $CRm"), pattern> {
let Inst{31-28} = 0b1111;
@@ -3812,6 +3883,13 @@ def Int_eh_sjlj_dispatchsetup :
// Non-Instruction Patterns
//
+// ARMv4 indirect branch using (MOVr PC, dst)
+let isBranch = 1, isTerminator = 1, isBarrier = 1, isIndirectBranch = 1 in
+ def MOVPCRX : ARMPseudoExpand<(outs), (ins GPR:$dst),
+ 4, IIC_Br, [(brind GPR:$dst)],
+ (MOVr PC, GPR:$dst, (ops 14, zero_reg), zero_reg)>,
+ Requires<[IsARM, NoV4T]>;
+
// Large immediate handling.
// 32-bit immediate using two piece so_imms or movw + movt.
@@ -3977,3 +4055,22 @@ include "ARMInstrVFP.td"
include "ARMInstrNEON.td"
+//===----------------------------------------------------------------------===//
+// Assembler aliases
+//
+
+// Memory barriers
+def : InstAlias<"dmb", (DMB 0xf)>, Requires<[IsARM, HasDB]>;
+def : InstAlias<"dsb", (DSB 0xf)>, Requires<[IsARM, HasDB]>;
+def : InstAlias<"isb", (ISB 0xf)>, Requires<[IsARM, HasDB]>;
+
+// System instructions
+def : MnemonicAlias<"swi", "svc">;
+
+// Load / Store Multiple
+def : MnemonicAlias<"ldmfd", "ldm">;
+def : MnemonicAlias<"ldmia", "ldm">;
+def : MnemonicAlias<"stmfd", "stmdb">;
+def : MnemonicAlias<"stmia", "stm">;
+def : MnemonicAlias<"stmea", "stm">;
+
diff --git a/contrib/llvm/lib/Target/ARM/ARMInstrNEON.td b/contrib/llvm/lib/Target/ARM/ARMInstrNEON.td
index 79d95d9..0df62f4 100644
--- a/contrib/llvm/lib/Target/ARM/ARMInstrNEON.td
+++ b/contrib/llvm/lib/Target/ARM/ARMInstrNEON.td
@@ -175,7 +175,7 @@ class VLDQQWBPseudo<InstrItinClass itin>
(ins addrmode6:$addr, am6offset:$offset), itin,
"$addr.addr = $wb">;
class VLDQQQQPseudo<InstrItinClass itin>
- : PseudoNLdSt<(outs QQQQPR:$dst), (ins addrmode6:$addr, QQQQPR:$src), itin,"">;
+ : PseudoNLdSt<(outs QQQQPR:$dst), (ins addrmode6:$addr, QQQQPR:$src),itin,"">;
class VLDQQQQWBPseudo<InstrItinClass itin>
: PseudoNLdSt<(outs QQQQPR:$dst, GPR:$wb),
(ins addrmode6:$addr, am6offset:$offset, QQQQPR:$src), itin,
@@ -1387,7 +1387,7 @@ class VST1LN32<bits<4> op11_8, bits<4> op7_4, string Dt, ValueType Ty,
: NLdStLn<1, 0b00, op11_8, op7_4, (outs),
(ins addrmode6oneL32:$Rn, DPR:$Vd, nohash_imm:$lane),
IIC_VST1ln, "vst1", Dt, "\\{$Vd[$lane]\\}, $Rn", "",
- [(StoreOp (ExtractOp (Ty DPR:$Vd), imm:$lane), addrmode6oneL32:$Rn)]> {
+ [(StoreOp (ExtractOp (Ty DPR:$Vd), imm:$lane), addrmode6oneL32:$Rn)]>{
let Rm = 0b1111;
}
class VST1QLNPseudo<ValueType Ty, PatFrag StoreOp, SDNode ExtractOp>
@@ -3793,7 +3793,8 @@ def VBSLd : N3VX<1, 0, 0b01, 0b0001, 0, 1, (outs DPR:$Vd),
(ins DPR:$src1, DPR:$Vn, DPR:$Vm),
N3RegFrm, IIC_VCNTiD,
"vbsl", "$Vd, $Vn, $Vm", "$src1 = $Vd",
- [(set DPR:$Vd, (v2i32 (NEONvbsl DPR:$src1, DPR:$Vn, DPR:$Vm)))]>;
+ [(set DPR:$Vd,
+ (v2i32 (NEONvbsl DPR:$src1, DPR:$Vn, DPR:$Vm)))]>;
def : Pat<(v2i32 (or (and DPR:$Vn, DPR:$Vd),
(and DPR:$Vm, (vnotd DPR:$Vd)))),
@@ -3803,7 +3804,8 @@ def VBSLq : N3VX<1, 0, 0b01, 0b0001, 1, 1, (outs QPR:$Vd),
(ins QPR:$src1, QPR:$Vn, QPR:$Vm),
N3RegFrm, IIC_VCNTiQ,
"vbsl", "$Vd, $Vn, $Vm", "$src1 = $Vd",
- [(set QPR:$Vd, (v4i32 (NEONvbsl QPR:$src1, QPR:$Vn, QPR:$Vm)))]>;
+ [(set QPR:$Vd,
+ (v4i32 (NEONvbsl QPR:$src1, QPR:$Vn, QPR:$Vm)))]>;
def : Pat<(v4i32 (or (and QPR:$Vn, QPR:$Vd),
(and QPR:$Vm, (vnotq QPR:$Vd)))),
@@ -4212,17 +4214,12 @@ def VSWPq : N2VX<0b11, 0b11, 0b00, 0b10, 0b00000, 1, 0,
// Vector Move Operations.
// VMOV : Vector Move (Register)
+def : InstAlias<"vmov${p} $Vd, $Vm",
+ (VORRd DPR:$Vd, DPR:$Vm, DPR:$Vm, pred:$p)>;
+def : InstAlias<"vmov${p} $Vd, $Vm",
+ (VORRq QPR:$Vd, QPR:$Vm, QPR:$Vm, pred:$p)>;
let neverHasSideEffects = 1 in {
-def VMOVDneon: N3VX<0, 0, 0b10, 0b0001, 0, 1, (outs DPR:$Vd), (ins DPR:$Vm),
- N3RegFrm, IIC_VMOV, "vmov", "$Vd, $Vm", "", []> {
- let Vn{4-0} = Vm{4-0};
-}
-def VMOVQ : N3VX<0, 0, 0b10, 0b0001, 1, 1, (outs QPR:$Vd), (ins QPR:$Vm),
- N3RegFrm, IIC_VMOV, "vmov", "$Vd, $Vm", "", []> {
- let Vn{4-0} = Vm{4-0};
-}
-
// Pseudo vector move instructions for QQ and QQQQ registers. This should
// be expanded after register allocation is completed.
def VMOVQQ : PseudoInst<(outs QQPR:$dst), (ins QQPR:$src),
@@ -4702,11 +4699,10 @@ def VEXTd32 : VEXTd<"vext", "32", v2i32> {
let Inst{11-10} = index{1-0};
let Inst{9-8} = 0b00;
}
-def VEXTdf : VEXTd<"vext", "32", v2f32> {
- let Inst{11-10} = index{1-0};
- let Inst{9-8} = 0b00;
-
-}
+def : Pat<(v2f32 (NEONvext (v2f32 DPR:$Vn),
+ (v2f32 DPR:$Vm),
+ (i32 imm:$index))),
+ (VEXTd32 DPR:$Vn, DPR:$Vm, imm:$index)>;
def VEXTq8 : VEXTq<"vext", "8", v16i8> {
let Inst{11-8} = index{3-0};
@@ -4719,10 +4715,10 @@ def VEXTq32 : VEXTq<"vext", "32", v4i32> {
let Inst{11-10} = index{1-0};
let Inst{9-8} = 0b00;
}
-def VEXTqf : VEXTq<"vext", "32", v4f32> {
- let Inst{11-10} = index{1-0};
- let Inst{9-8} = 0b00;
-}
+def : Pat<(v4f32 (NEONvext (v4f32 QPR:$Vn),
+ (v4f32 QPR:$Vm),
+ (i32 imm:$index))),
+ (VEXTq32 QPR:$Vn, QPR:$Vm, imm:$index)>;
// VTRN : Vector Transpose
diff --git a/contrib/llvm/lib/Target/ARM/ARMInstrThumb.td b/contrib/llvm/lib/Target/ARM/ARMInstrThumb.td
index 4777189..bfe83ec 100644
--- a/contrib/llvm/lib/Target/ARM/ARMInstrThumb.td
+++ b/contrib/llvm/lib/Target/ARM/ARMInstrThumb.td
@@ -26,17 +26,14 @@ def imm_comp_XFORM : SDNodeXForm<imm, [{
return CurDAG->getTargetConstant(~((uint32_t)N->getZExtValue()), MVT::i32);
}]>;
-/// imm0_7 predicate - True if the 32-bit immediate is in the range [0,7].
-def imm0_7 : ImmLeaf<i32, [{
- return Imm >= 0 && Imm < 8;
-}]>;
def imm0_7_neg : PatLeaf<(i32 imm), [{
return (uint32_t)-N->getZExtValue() < 8;
}], imm_neg_XFORM>;
-def imm0_255 : ImmLeaf<i32, [{
- return Imm >= 0 && Imm < 256;
-}]>;
+def imm0_255_asmoperand : AsmOperandClass { let Name = "Imm0_255"; }
+def imm0_255 : Operand<i32>, ImmLeaf<i32, [{ return Imm >= 0 && Imm < 256; }]> {
+ let ParserMatchClass = imm0_255_asmoperand;
+}
def imm0_255_comp : PatLeaf<(i32 imm), [{
return ~((uint32_t)N->getZExtValue()) < 256;
}]>;
@@ -74,10 +71,12 @@ def t_adrlabel : Operand<i32> {
// Scaled 4 immediate.
def t_imm_s4 : Operand<i32> {
let PrintMethod = "printThumbS4ImmOperand";
+ let OperandType = "OPERAND_IMMEDIATE";
}
// Define Thumb specific addressing modes.
+let OperandType = "OPERAND_PCREL" in {
def t_brtarget : Operand<OtherVT> {
let EncoderMethod = "getThumbBRTargetOpValue";
}
@@ -97,6 +96,7 @@ def t_bltarget : Operand<i32> {
def t_blxtarget : Operand<i32> {
let EncoderMethod = "getThumbBLXTargetOpValue";
}
+}
def MemModeRegThumbAsmOperand : AsmOperandClass {
let Name = "MemModeRegThumb";
@@ -360,27 +360,6 @@ def tADDspr : TIt<(outs GPR:$dst), (ins GPR:$lhs, GPR:$rhs), IIC_iALUr,
// Control Flow Instructions.
//
-let isReturn = 1, isTerminator = 1, isBarrier = 1 in {
- def tBX_RET : TI<(outs), (ins), IIC_Br, "bx\tlr",
- [(ARMretflag)]>,
- T1Special<{1,1,0,?}> {
- // A6.2.3 & A8.6.25
- let Inst{6-3} = 0b1110; // Rm = lr
- let Inst{2-0} = 0b000;
- }
-
- // Alternative return instruction used by vararg functions.
- def tBX_RET_vararg : TI<(outs), (ins tGPR:$Rm),
- IIC_Br, "bx\t$Rm",
- []>,
- T1Special<{1,1,0,?}> {
- // A6.2.3 & A8.6.25
- bits<4> Rm;
- let Inst{6-3} = Rm;
- let Inst{2-0} = 0b000;
- }
-}
-
// Indirect branches
let isBranch = 1, isTerminator = 1, isBarrier = 1, isIndirectBranch = 1 in {
def tBX : TI<(outs), (ins GPR:$Rm, pred:$p), IIC_Br, "bx${p}\t$Rm", []>,
@@ -390,31 +369,16 @@ let isBranch = 1, isTerminator = 1, isBarrier = 1, isIndirectBranch = 1 in {
let Inst{6-3} = Rm;
let Inst{2-0} = 0b000;
}
-
- def tBRIND : TI<(outs), (ins GPR:$Rm),
- IIC_Br,
- "mov\tpc, $Rm",
- [(brind GPR:$Rm)]>,
- T1Special<{1,0,?,?}> {
- // A8.6.97
- bits<4> Rm;
- let Inst{7} = 1; // <Rd> = Inst{7:2-0} = pc
- let Inst{6-3} = Rm;
- let Inst{2-0} = 0b111;
- }
}
-// FIXME: remove when we have a way to marking a MI with these properties.
-let isReturn = 1, isTerminator = 1, isBarrier = 1, mayLoad = 1,
- hasExtraDefRegAllocReq = 1 in
-def tPOP_RET : T1I<(outs), (ins pred:$p, reglist:$regs, variable_ops),
- IIC_iPop_Br,
- "pop${p}\t$regs", []>,
- T1Misc<{1,1,0,?,?,?,?}> {
- // A8.6.121
- bits<16> regs;
- let Inst{8} = regs{15}; // registers = P:'0000000':register_list
- let Inst{7-0} = regs{7-0};
+let isReturn = 1, isTerminator = 1, isBarrier = 1 in {
+ def tBX_RET : tPseudoExpand<(outs), (ins pred:$p), 2, IIC_Br,
+ [(ARMretflag)], (tBX LR, pred:$p)>;
+
+ // Alternative return instruction used by vararg functions.
+ def tBX_RET_vararg : tPseudoExpand<(outs), (ins tGPR:$Rm, pred:$p),
+ 2, IIC_Br, [],
+ (tBX GPR:$Rm, pred:$p)>;
}
// All calls clobber the non-callee saved registers. SP is marked as a use to
@@ -464,7 +428,7 @@ let isCall = 1,
// ARMv4T
def tBX_CALL : tPseudoInst<(outs), (ins tGPR:$func, variable_ops),
- Size4Bytes, IIC_Br,
+ 4, IIC_Br,
[(ARMcall_nolink tGPR:$func)]>,
Requires<[IsThumb, IsThumb1Only, IsNotDarwin]>;
}
@@ -516,7 +480,7 @@ let isCall = 1,
// ARMv4T
def tBXr9_CALL : tPseudoInst<(outs), (ins tGPR:$func, variable_ops),
- Size4Bytes, IIC_Br,
+ 4, IIC_Br,
[(ARMcall_nolink tGPR:$func)]>,
Requires<[IsThumb, IsThumb1Only, IsDarwin]>;
}
@@ -534,12 +498,12 @@ let isBranch = 1, isTerminator = 1, isBarrier = 1 in {
// Just a pseudo for a tBL instruction. Needed to let regalloc know about
// the clobber of LR.
let Defs = [LR] in
- def tBfar : tPseudoInst<(outs), (ins t_bltarget:$target),
- Size4Bytes, IIC_Br, []>;
+ def tBfar : tPseudoExpand<(outs), (ins t_bltarget:$target),
+ 4, IIC_Br, [], (tBL t_bltarget:$target)>;
def tBR_JTr : tPseudoInst<(outs),
(ins tGPR:$target, i32imm:$jt, i32imm:$id),
- SizeSpecial, IIC_Br,
+ 0, IIC_Br,
[(ARMbrjt tGPR:$target, tjumptable:$jt, imm:$id)]> {
list<Predicate> Predicates = [IsThumb, IsThumb1Only];
}
@@ -583,6 +547,33 @@ let isBranch = 1, isTerminator = 1 in {
}
}
+// Tail calls
+let isCall = 1, isTerminator = 1, isReturn = 1, isBarrier = 1 in {
+ // Darwin versions.
+ let Defs = [R0, R1, R2, R3, R9, R12, QQQQ0, QQQQ2, QQQQ3, PC],
+ Uses = [SP] in {
+ // tTAILJMPd: Darwin version uses a Thumb2 branch (no Thumb1 tail calls
+ // on Darwin), so it's in ARMInstrThumb2.td.
+ def tTAILJMPr : tPseudoExpand<(outs), (ins tcGPR:$dst, variable_ops),
+ 4, IIC_Br, [],
+ (tBX GPR:$dst, (ops 14, zero_reg))>,
+ Requires<[IsThumb, IsDarwin]>;
+ }
+ // Non-Darwin versions (the difference is R9).
+ let Defs = [R0, R1, R2, R3, R12, QQQQ0, QQQQ2, QQQQ3, PC],
+ Uses = [SP] in {
+ def tTAILJMPdND : tPseudoExpand<(outs), (ins t_brtarget:$dst, variable_ops),
+ 4, IIC_Br, [],
+ (tB t_brtarget:$dst)>,
+ Requires<[IsThumb, IsNotDarwin]>;
+ def tTAILJMPrND : tPseudoExpand<(outs), (ins tcGPR:$dst, variable_ops),
+ 4, IIC_Br, [],
+ (tBX GPR:$dst, (ops 14, zero_reg))>,
+ Requires<[IsThumb, IsNotDarwin]>;
+ }
+}
+
+
// A8.6.218 Supervisor Call (Software Interrupt) -- for disassembly only
// A8.6.16 B: Encoding T1
// If Inst{11-8} == 0b1111 then SEE SVC
@@ -685,19 +676,6 @@ def tLDRspi : T1pIs<(outs tGPR:$Rt), (ins t_addrmode_sp:$addr), IIC_iLoad_i,
let Inst{7-0} = addr;
}
-// Special instruction for restore. It cannot clobber condition register
-// when it's expanded by eliminateCallFramePseudoInstr().
-let canFoldAsLoad = 1, mayLoad = 1, neverHasSideEffects = 1 in
-// FIXME: Pseudo for tLDRspi
-def tRestore : T1pIs<(outs tGPR:$dst), (ins t_addrmode_sp:$addr), IIC_iLoad_i,
- "ldr", "\t$dst, $addr", []>,
- T1LdStSP<{1,?,?}> {
- bits<3> Rt;
- bits<8> addr;
- let Inst{10-8} = Rt;
- let Inst{7-0} = addr;
-}
-
// Load tconstpool
// FIXME: Use ldr.n to work around a Darwin assembler bug.
let canFoldAsLoad = 1, isReMaterializable = 1 in
@@ -739,9 +717,9 @@ defm tSTRB : thumb_st_rr_ri_enc<0b010, 0b0111, t_addrmode_rrs1,
// A8.6.207 & A8.6.205
defm tSTRH : thumb_st_rr_ri_enc<0b001, 0b1000, t_addrmode_rrs2,
- t_addrmode_is2, AddrModeT1_2,
- IIC_iStore_bh_r, IIC_iStore_bh_i, "strh",
- BinOpFrag<(truncstorei16 node:$LHS, node:$RHS)>>;
+ t_addrmode_is2, AddrModeT1_2,
+ IIC_iStore_bh_r, IIC_iStore_bh_i, "strh",
+ BinOpFrag<(truncstorei16 node:$LHS, node:$RHS)>>;
def tSTRspi : T1pIs<(outs), (ins tGPR:$Rt, t_addrmode_sp:$addr), IIC_iStore_i,
@@ -754,19 +732,6 @@ def tSTRspi : T1pIs<(outs), (ins tGPR:$Rt, t_addrmode_sp:$addr), IIC_iStore_i,
let Inst{7-0} = addr;
}
-let mayStore = 1, neverHasSideEffects = 1 in
-// Special instruction for spill. It cannot clobber condition register when it's
-// expanded by eliminateCallFramePseudoInstr().
-// FIXME: Pseudo for tSTRspi
-def tSpill : T1pIs<(outs), (ins tGPR:$src, t_addrmode_sp:$addr), IIC_iStore_i,
- "str", "\t$src, $addr", []>,
- T1LdStSP<{0,?,?}> {
- bits<3> Rt;
- bits<8> addr;
- let Inst{10-8} = Rt;
- let Inst{7-0} = addr;
-}
-
//===----------------------------------------------------------------------===//
// Load / store multiple Instructions.
//
@@ -911,7 +876,8 @@ def tADC : // A8.6.2
// Add immediate
def tADDi3 : // A8.6.4 T1
- T1sIGenEncodeImm<0b01110, (outs tGPR:$Rd), (ins tGPR:$Rm, i32imm:$imm3), IIC_iALUi,
+ T1sIGenEncodeImm<0b01110, (outs tGPR:$Rd), (ins tGPR:$Rm, i32imm:$imm3),
+ IIC_iALUi,
"add", "\t$Rd, $Rm, $imm3",
[(set tGPR:$Rd, (add tGPR:$Rm, imm0_7:$imm3))]> {
bits<3> imm3;
@@ -1071,7 +1037,7 @@ def tLSRrr : // A8.6.91
// Move register
let isMoveImm = 1 in
-def tMOVi8 : T1sI<(outs tGPR:$Rd), (ins i32imm:$imm8), IIC_iMOVi,
+def tMOVi8 : T1sI<(outs tGPR:$Rd), (ins imm0_255:$imm8), IIC_iMOVi,
"mov", "\t$Rd, $imm8",
[(set tGPR:$Rd, imm0_255:$imm8)]>,
T1General<{1,0,0,?,?}> {
@@ -1082,18 +1048,18 @@ def tMOVi8 : T1sI<(outs tGPR:$Rd), (ins i32imm:$imm8), IIC_iMOVi,
let Inst{7-0} = imm8;
}
-// TODO: A7-73: MOV(2) - mov setting flag.
+// A7-73: MOV(2) - mov setting flag.
let neverHasSideEffects = 1 in {
-// FIXME: Make this predicable.
-def tMOVr : T1I<(outs tGPR:$Rd), (ins tGPR:$Rm), IIC_iMOVr,
- "mov\t$Rd, $Rm", []>,
- T1Special<0b1000> {
+def tMOVr : Thumb1pI<(outs GPR:$Rd), (ins GPR:$Rm), AddrModeNone,
+ 2, IIC_iMOVr,
+ "mov", "\t$Rd, $Rm", "", []>,
+ T1Special<{1,0,?,?}> {
// A8.6.97
bits<4> Rd;
bits<4> Rm;
- // Bits {7-6} are encoded by the T1Special value.
- let Inst{5-3} = Rm{2-0};
+ let Inst{7} = Rd{3};
+ let Inst{6-3} = Rm;
let Inst{2-0} = Rd{2-0};
}
let Defs = [CPSR] in
@@ -1106,39 +1072,6 @@ def tMOVSr : T1I<(outs tGPR:$Rd), (ins tGPR:$Rm), IIC_iMOVr,
let Inst{5-3} = Rm;
let Inst{2-0} = Rd;
}
-
-// FIXME: Make these predicable.
-def tMOVgpr2tgpr : T1I<(outs tGPR:$Rd), (ins GPR:$Rm), IIC_iMOVr,
- "mov\t$Rd, $Rm", []>,
- T1Special<{1,0,0,?}> {
- // A8.6.97
- bits<4> Rd;
- bits<4> Rm;
- // Bit {7} is encoded by the T1Special value.
- let Inst{6-3} = Rm;
- let Inst{2-0} = Rd{2-0};
-}
-def tMOVtgpr2gpr : T1I<(outs GPR:$Rd), (ins tGPR:$Rm), IIC_iMOVr,
- "mov\t$Rd, $Rm", []>,
- T1Special<{1,0,?,0}> {
- // A8.6.97
- bits<4> Rd;
- bits<4> Rm;
- // Bit {6} is encoded by the T1Special value.
- let Inst{7} = Rd{3};
- let Inst{5-3} = Rm{2-0};
- let Inst{2-0} = Rd{2-0};
-}
-def tMOVgpr2gpr : T1I<(outs GPR:$Rd), (ins GPR:$Rm), IIC_iMOVr,
- "mov\t$Rd, $Rm", []>,
- T1Special<{1,0,?,?}> {
- // A8.6.97
- bits<4> Rd;
- bits<4> Rm;
- let Inst{7} = Rd{3};
- let Inst{6-3} = Rm;
- let Inst{2-0} = Rd{2-0};
-}
} // neverHasSideEffects
// Multiply register
@@ -1175,31 +1108,16 @@ def tREV16 : // A8.6.135
T1pIMiscEncode<{1,0,1,0,0,1,?}, (outs tGPR:$Rd), (ins tGPR:$Rm),
IIC_iUNAr,
"rev16", "\t$Rd, $Rm",
- [(set tGPR:$Rd,
- (or (and (srl tGPR:$Rm, (i32 8)), 0xFF),
- (or (and (shl tGPR:$Rm, (i32 8)), 0xFF00),
- (or (and (srl tGPR:$Rm, (i32 8)), 0xFF0000),
- (and (shl tGPR:$Rm, (i32 8)), 0xFF000000)))))]>,
+ [(set tGPR:$Rd, (rotr (bswap tGPR:$Rm), (i32 16)))]>,
Requires<[IsThumb, IsThumb1Only, HasV6]>;
def tREVSH : // A8.6.136
T1pIMiscEncode<{1,0,1,0,1,1,?}, (outs tGPR:$Rd), (ins tGPR:$Rm),
IIC_iUNAr,
"revsh", "\t$Rd, $Rm",
- [(set tGPR:$Rd,
- (sext_inreg
- (or (srl tGPR:$Rm, (i32 8)),
- (shl tGPR:$Rm, (i32 8))), i16))]>,
+ [(set tGPR:$Rd, (sra (bswap tGPR:$Rm), (i32 16)))]>,
Requires<[IsThumb, IsThumb1Only, HasV6]>;
-def : T1Pat<(sext_inreg (or (srl (and tGPR:$Rm, 0xFF00), (i32 8)),
- (shl tGPR:$Rm, (i32 8))), i16),
- (tREVSH tGPR:$Rm)>,
- Requires<[IsThumb, IsThumb1Only, HasV6]>;
-
-def : T1Pat<(sra (bswap tGPR:$Rm), (i32 16)), (tREVSH tGPR:$Rm)>,
- Requires<[IsThumb, IsThumb1Only, HasV6]>;
-
// Rotate right register
def tROR : // A8.6.139
T1sItDPEncode<0b0111, (outs tGPR:$Rdn), (ins tGPR:$Rn, tGPR:$Rm),
@@ -1294,31 +1212,6 @@ let usesCustomInserter = 1 in // Expanded after instruction selection.
NoItinerary,
[/*(set tGPR:$dst, (ARMcmov tGPR:$false, tGPR:$true, imm:$cc))*/]>;
-
-// 16-bit movcc in IT blocks for Thumb2.
-let neverHasSideEffects = 1 in {
-def tMOVCCr : T1pIt<(outs GPR:$Rdn), (ins GPR:$Rn, GPR:$Rm), IIC_iCMOVr,
- "mov", "\t$Rdn, $Rm", []>,
- T1Special<{1,0,?,?}> {
- bits<4> Rdn;
- bits<4> Rm;
- let Inst{7} = Rdn{3};
- let Inst{6-3} = Rm;
- let Inst{2-0} = Rdn{2-0};
-}
-
-let isMoveImm = 1 in
-def tMOVCCi : T1pIt<(outs tGPR:$Rdn), (ins tGPR:$Rn, i32imm:$Rm), IIC_iCMOVi,
- "mov", "\t$Rdn, $Rm", []>,
- T1General<{1,0,0,?,?}> {
- bits<3> Rdn;
- bits<8> Rm;
- let Inst{10-8} = Rdn;
- let Inst{7-0} = Rm;
-}
-
-} // neverHasSideEffects
-
// tLEApcrel - Load a pc-relative address into a register without offending the
// assembler.
@@ -1333,118 +1226,22 @@ def tADR : T1I<(outs tGPR:$Rd), (ins t_adrlabel:$addr, pred:$p),
let neverHasSideEffects = 1, isReMaterializable = 1 in
def tLEApcrel : tPseudoInst<(outs tGPR:$Rd), (ins i32imm:$label, pred:$p),
- Size2Bytes, IIC_iALUi, []>;
+ 2, IIC_iALUi, []>;
def tLEApcrelJT : tPseudoInst<(outs tGPR:$Rd),
(ins i32imm:$label, nohash_imm:$id, pred:$p),
- Size2Bytes, IIC_iALUi, []>;
-
-//===----------------------------------------------------------------------===//
-// Move between coprocessor and ARM core register -- for disassembly only
-//
-
-class tMovRCopro<string opc, bit direction, dag oops, dag iops,
- list<dag> pattern>
- : T1Cop<oops, iops, !strconcat(opc, "\t$cop, $opc1, $Rt, $CRn, $CRm, $opc2"),
- pattern> {
- let Inst{27-24} = 0b1110;
- let Inst{20} = direction;
- let Inst{4} = 1;
-
- bits<4> Rt;
- bits<4> cop;
- bits<3> opc1;
- bits<3> opc2;
- bits<4> CRm;
- bits<4> CRn;
-
- let Inst{15-12} = Rt;
- let Inst{11-8} = cop;
- let Inst{23-21} = opc1;
- let Inst{7-5} = opc2;
- let Inst{3-0} = CRm;
- let Inst{19-16} = CRn;
-}
-
-def tMCR : tMovRCopro<"mcr", 0 /* from ARM core register to coprocessor */,
- (outs),
- (ins p_imm:$cop, i32imm:$opc1, GPR:$Rt, c_imm:$CRn,
- c_imm:$CRm, i32imm:$opc2),
- [(int_arm_mcr imm:$cop, imm:$opc1, GPR:$Rt, imm:$CRn,
- imm:$CRm, imm:$opc2)]>;
-def tMRC : tMovRCopro<"mrc", 1 /* from coprocessor to ARM core register */,
- (outs GPR:$Rt),
- (ins p_imm:$cop, i32imm:$opc1, c_imm:$CRn, c_imm:$CRm, i32imm:$opc2),
- []>;
-
-def : Pat<(int_arm_mrc imm:$cop, imm:$opc1, imm:$CRn, imm:$CRm, imm:$opc2),
- (tMRC imm:$cop, imm:$opc1, imm:$CRn, imm:$CRm, imm:$opc2)>,
- Requires<[IsThumb, HasV6T2]>;
-
-class tMovRRCopro<string opc, bit direction,
- list<dag> pattern = [/* For disassembly only */]>
- : T1Cop<(outs), (ins p_imm:$cop, i32imm:$opc1, GPR:$Rt, GPR:$Rt2, c_imm:$CRm),
- !strconcat(opc, "\t$cop, $opc1, $Rt, $Rt2, $CRm"), pattern> {
- let Inst{27-24} = 0b1100;
- let Inst{23-21} = 0b010;
- let Inst{20} = direction;
-
- bits<4> Rt;
- bits<4> Rt2;
- bits<4> cop;
- bits<4> opc1;
- bits<4> CRm;
-
- let Inst{15-12} = Rt;
- let Inst{19-16} = Rt2;
- let Inst{11-8} = cop;
- let Inst{7-4} = opc1;
- let Inst{3-0} = CRm;
-}
-
-def tMCRR : tMovRRCopro<"mcrr", 0 /* from ARM core register to coprocessor */,
- [(int_arm_mcrr imm:$cop, imm:$opc1, GPR:$Rt, GPR:$Rt2,
- imm:$CRm)]>;
-def tMRRC : tMovRRCopro<"mrrc", 1 /* from coprocessor to ARM core register */>;
-
-//===----------------------------------------------------------------------===//
-// Other Coprocessor Instructions. For disassembly only.
-//
-def tCDP : T1Cop<(outs), (ins p_imm:$cop, i32imm:$opc1,
- c_imm:$CRd, c_imm:$CRn, c_imm:$CRm, i32imm:$opc2),
- "cdp\t$cop, $opc1, $CRd, $CRn, $CRm, $opc2",
- [(int_arm_cdp imm:$cop, imm:$opc1, imm:$CRd, imm:$CRn,
- imm:$CRm, imm:$opc2)]> {
- let Inst{27-24} = 0b1110;
-
- bits<4> opc1;
- bits<4> CRn;
- bits<4> CRd;
- bits<4> cop;
- bits<3> opc2;
- bits<4> CRm;
-
- let Inst{3-0} = CRm;
- let Inst{4} = 0;
- let Inst{7-5} = opc2;
- let Inst{11-8} = cop;
- let Inst{15-12} = CRd;
- let Inst{19-16} = CRn;
- let Inst{23-20} = opc1;
-}
+ 2, IIC_iALUi, []>;
//===----------------------------------------------------------------------===//
// TLS Instructions
//
// __aeabi_read_tp preserves the registers r1-r3.
-let isCall = 1, Defs = [R0, LR], Uses = [SP] in
-def tTPsoft : TIx2<0b11110, 0b11, 1, (outs), (ins), IIC_Br,
- "bl\t__aeabi_read_tp",
- [(set R0, ARMthread_pointer)]> {
- // Encoding is 0xf7fffffe.
- let Inst = 0xf7fffffe;
-}
+// This is a pseudo inst so that we can get the encoding right,
+// complete with fixup for the aeabi_read_tp function.
+let isCall = 1, Defs = [R0, R12, LR, CPSR], Uses = [SP] in
+def tTPsoft : tPseudoInst<(outs), (ins), 4, IIC_Br,
+ [(set R0, ARMthread_pointer)]>;
//===----------------------------------------------------------------------===//
// SJLJ Exception handling intrinsics
@@ -1463,14 +1260,14 @@ def tTPsoft : TIx2<0b11110, 0b11, 1, (outs), (ins), IIC_Br,
let Defs = [ R0, R1, R2, R3, R4, R5, R6, R7, R12, CPSR ],
hasSideEffects = 1, isBarrier = 1, isCodeGenOnly = 1 in
def tInt_eh_sjlj_setjmp : ThumbXI<(outs),(ins tGPR:$src, tGPR:$val),
- AddrModeNone, SizeSpecial, NoItinerary, "","",
+ AddrModeNone, 0, NoItinerary, "","",
[(set R0, (ARMeh_sjlj_setjmp tGPR:$src, tGPR:$val))]>;
// FIXME: Non-Darwin version(s)
let isBarrier = 1, hasSideEffects = 1, isTerminator = 1, isCodeGenOnly = 1,
Defs = [ R7, LR, SP ] in
def tInt_eh_sjlj_longjmp : XI<(outs), (ins GPR:$src, GPR:$scratch),
- AddrModeNone, SizeSpecial, IndexModeNone,
+ AddrModeNone, 0, IndexModeNone,
Pseudo, NoItinerary, "", "",
[(ARMeh_sjlj_longjmp GPR:$src, GPR:$scratch)]>,
Requires<[IsThumb, IsDarwin]>;
@@ -1583,3 +1380,18 @@ def tLDRpci_pic : PseudoInst<(outs GPR:$dst), (ins i32imm:$addr, pclabel:$cp),
[(set GPR:$dst, (ARMpic_add (load (ARMWrapper tconstpool:$addr)),
imm:$cp))]>,
Requires<[IsThumb, IsThumb1Only]>;
+
+// Pseudo-instruction for merged POP and return.
+// FIXME: remove when we have a way to marking a MI with these properties.
+let isReturn = 1, isTerminator = 1, isBarrier = 1, mayLoad = 1,
+ hasExtraDefRegAllocReq = 1 in
+def tPOP_RET : tPseudoExpand<(outs), (ins pred:$p, reglist:$regs, variable_ops),
+ 2, IIC_iPop_Br, [],
+ (tPOP pred:$p, reglist:$regs)>;
+
+// Indirect branch using "mov pc, $Rm"
+let isBranch = 1, isTerminator = 1, isBarrier = 1, isIndirectBranch = 1 in {
+ def tBRIND : tPseudoExpand<(outs), (ins GPR:$Rm, pred:$p),
+ 2, IIC_Br, [(brind GPR:$Rm)],
+ (tMOVr PC, GPR:$Rm, pred:$p)>;
+}
diff --git a/contrib/llvm/lib/Target/ARM/ARMInstrThumb2.td b/contrib/llvm/lib/Target/ARM/ARMInstrThumb2.td
index 598660c..c2c6cbc 100644
--- a/contrib/llvm/lib/Target/ARM/ARMInstrThumb2.td
+++ b/contrib/llvm/lib/Target/ARM/ARMInstrThumb2.td
@@ -44,9 +44,11 @@ def t2_so_imm_neg_XFORM : SDNodeXForm<imm, [{
// t2_so_imm - Match a 32-bit immediate operand, which is an
// 8-bit immediate rotated by an arbitrary number of bits, or an 8-bit
// immediate splatted into multiple bytes of the word.
+def t2_so_imm_asmoperand : AsmOperandClass { let Name = "T2SOImm"; }
def t2_so_imm : Operand<i32>, ImmLeaf<i32, [{
return ARM_AM::getT2SOImmVal(Imm) != -1;
}]> {
+ let ParserMatchClass = t2_so_imm_asmoperand;
let EncoderMethod = "getT2SOImmOpValue";
}
@@ -463,7 +465,8 @@ multiclass T2I_un_irs<bits<4> opcod, string opc,
/// changed to modify CPSR.
multiclass T2I_bin_irs<bits<4> opcod, string opc,
InstrItinClass iii, InstrItinClass iir, InstrItinClass iis,
- PatFrag opnode, bit Commutable = 0, string wide = ""> {
+ PatFrag opnode, string baseOpc, bit Commutable = 0,
+ string wide = ""> {
// shifted imm
def ri : T2sTwoRegImm<
(outs rGPR:$Rd), (ins rGPR:$Rn, t2_so_imm:$imm), iii,
@@ -495,14 +498,31 @@ multiclass T2I_bin_irs<bits<4> opcod, string opc,
let Inst{26-25} = 0b01;
let Inst{24-21} = opcod;
}
+ // Assembly aliases for optional destination operand when it's the same
+ // as the source operand.
+ def : InstAlias<!strconcat(opc, "${s}${p} $Rdn, $imm"),
+ (!cast<Instruction>(!strconcat(baseOpc, "ri")) rGPR:$Rdn, rGPR:$Rdn,
+ t2_so_imm:$imm, pred:$p,
+ cc_out:$s)>,
+ Requires<[IsThumb2]>;
+ def : InstAlias<!strconcat(opc, "${s}${p}", wide, " $Rdn, $Rm"),
+ (!cast<Instruction>(!strconcat(baseOpc, "rr")) rGPR:$Rdn, rGPR:$Rdn,
+ rGPR:$Rm, pred:$p,
+ cc_out:$s)>,
+ Requires<[IsThumb2]>;
+ def : InstAlias<!strconcat(opc, "${s}${p}", wide, " $Rdn, $shift"),
+ (!cast<Instruction>(!strconcat(baseOpc, "rs")) rGPR:$Rdn, rGPR:$Rdn,
+ t2_so_reg:$shift, pred:$p,
+ cc_out:$s)>,
+ Requires<[IsThumb2]>;
}
/// T2I_bin_w_irs - Same as T2I_bin_irs except these operations need
-// the ".w" prefix to indicate that they are wide.
+// the ".w" suffix to indicate that they are wide.
multiclass T2I_bin_w_irs<bits<4> opcod, string opc,
InstrItinClass iii, InstrItinClass iir, InstrItinClass iis,
- PatFrag opnode, bit Commutable = 0> :
- T2I_bin_irs<opcod, opc, iii, iir, iis, opnode, Commutable, ".w">;
+ PatFrag opnode, string baseOpc, bit Commutable = 0> :
+ T2I_bin_irs<opcod, opc, iii, iir, iis, opnode, baseOpc, Commutable, ".w">;
/// T2I_rbin_is - Same as T2I_bin_irs except the order of operands are
/// reversed. The 'rr' form is only defined for the disassembler; for codegen
@@ -696,18 +716,18 @@ let usesCustomInserter = 1 in {
multiclass T2I_adde_sube_s_irs<PatFrag opnode, bit Commutable = 0> {
// shifted imm
def ri : t2PseudoInst<(outs rGPR:$Rd), (ins rGPR:$Rn, t2_so_imm:$imm),
- Size4Bytes, IIC_iALUi,
+ 4, IIC_iALUi,
[(set rGPR:$Rd, (opnode rGPR:$Rn, t2_so_imm:$imm))]>;
// register
def rr : t2PseudoInst<(outs rGPR:$Rd), (ins rGPR:$Rn, rGPR:$Rm),
- Size4Bytes, IIC_iALUr,
+ 4, IIC_iALUr,
[(set rGPR:$Rd, (opnode rGPR:$Rn, rGPR:$Rm))]> {
let isCommutable = Commutable;
}
// shifted register
def rs : t2PseudoInst<
(outs rGPR:$Rd), (ins rGPR:$Rn, t2_so_reg:$ShiftedRm),
- Size4Bytes, IIC_iALUsi,
+ 4, IIC_iALUsi,
[(set rGPR:$Rd, (opnode rGPR:$Rn, t2_so_reg:$ShiftedRm))]>;
}
}
@@ -1018,7 +1038,8 @@ multiclass T2I_ext_rrot_uxtb16<bits<3> opcod, string opc, PatFrag opnode> {
// supported yet.
multiclass T2I_ext_rrot_sxtb16<bits<3> opcod, string opc> {
def r : T2TwoReg<(outs rGPR:$Rd), (ins rGPR:$Rm), IIC_iEXTr,
- opc, "\t$Rd, $Rm", []> {
+ opc, "\t$Rd, $Rm", []>,
+ Requires<[IsThumb2, HasT2ExtractPack]> {
let Inst{31-27} = 0b11111;
let Inst{26-23} = 0b0100;
let Inst{22-20} = opcod;
@@ -1028,7 +1049,8 @@ multiclass T2I_ext_rrot_sxtb16<bits<3> opcod, string opc> {
let Inst{5-4} = 0b00; // rotate
}
def r_rot : T2TwoReg<(outs rGPR:$Rd), (ins rGPR:$Rm, i32imm:$rot), IIC_iEXTr,
- opc, "\t$Rd, $Rm, ror $rot", []> {
+ opc, "\t$Rd, $Rm, ror $rot", []>,
+ Requires<[IsThumb2, HasT2ExtractPack]> {
let Inst{31-27} = 0b11111;
let Inst{26-23} = 0b0100;
let Inst{22-20} = opcod;
@@ -1084,7 +1106,7 @@ multiclass T2I_exta_rrot_DO<bits<3> opcod, string opc> {
let Inst{7} = 1;
let Inst{5-4} = 0b00; // rotate
}
- def rr_rot : T2ThreeReg<(outs rGPR:$Rd), (ins rGPR:$Rn, rGPR:$Rm, i32imm:$rot),
+ def rr_rot :T2ThreeReg<(outs rGPR:$Rd), (ins rGPR:$Rn, rGPR:$Rm, i32imm:$rot),
IIC_iEXTAsr, opc, "\t$Rd, $Rn, $Rm, ror $rot", []> {
let Inst{31-27} = 0b11111;
let Inst{26-23} = 0b0100;
@@ -1142,93 +1164,13 @@ def t2ADR : T2PCOneRegImm<(outs rGPR:$Rd),
let neverHasSideEffects = 1, isReMaterializable = 1 in
def t2LEApcrel : t2PseudoInst<(outs rGPR:$Rd), (ins i32imm:$label, pred:$p),
- Size4Bytes, IIC_iALUi, []>;
+ 4, IIC_iALUi, []>;
def t2LEApcrelJT : t2PseudoInst<(outs rGPR:$Rd),
(ins i32imm:$label, nohash_imm:$id, pred:$p),
- Size4Bytes, IIC_iALUi,
+ 4, IIC_iALUi,
[]>;
-// FIXME: None of these add/sub SP special instructions should be necessary
-// at all for thumb2 since they use the same encodings as the generic
-// add/sub instructions. In thumb1 we need them since they have dedicated
-// encodings. At the least, they should be pseudo instructions.
-// ADD r, sp, {so_imm|i12}
-let isCodeGenOnly = 1 in {
-def t2ADDrSPi : T2sTwoRegImm<(outs GPR:$Rd), (ins GPR:$Rn, t2_so_imm:$imm),
- IIC_iALUi, "add", ".w\t$Rd, $Rn, $imm", []> {
- let Inst{31-27} = 0b11110;
- let Inst{25} = 0;
- let Inst{24-21} = 0b1000;
- let Inst{15} = 0;
-}
-def t2ADDrSPi12 : T2TwoRegImm<(outs GPR:$Rd), (ins GPR:$Rn, imm0_4095:$imm),
- IIC_iALUi, "addw", "\t$Rd, $Rn, $imm", []> {
- let Inst{31-27} = 0b11110;
- let Inst{25-20} = 0b100000;
- let Inst{15} = 0;
-}
-
-// ADD r, sp, so_reg
-def t2ADDrSPs : T2sTwoRegShiftedReg<
- (outs GPR:$Rd), (ins GPR:$Rn, t2_so_reg:$ShiftedRm),
- IIC_iALUsi, "add", ".w\t$Rd, $Rn, $ShiftedRm", []> {
- let Inst{31-27} = 0b11101;
- let Inst{26-25} = 0b01;
- let Inst{24-21} = 0b1000;
- let Inst{15} = 0;
-}
-
-// SUB r, sp, {so_imm|i12}
-def t2SUBrSPi : T2sTwoRegImm<(outs GPR:$Rd), (ins GPR:$Rn, t2_so_imm:$imm),
- IIC_iALUi, "sub", ".w\t$Rd, $Rn, $imm", []> {
- let Inst{31-27} = 0b11110;
- let Inst{25} = 0;
- let Inst{24-21} = 0b1101;
- let Inst{15} = 0;
-}
-def t2SUBrSPi12 : T2TwoRegImm<(outs GPR:$Rd), (ins GPR:$Rn, imm0_4095:$imm),
- IIC_iALUi, "subw", "\t$Rd, $Rn, $imm", []> {
- let Inst{31-27} = 0b11110;
- let Inst{25-20} = 0b101010;
- let Inst{15} = 0;
-}
-
-// SUB r, sp, so_reg
-def t2SUBrSPs : T2sTwoRegImm<(outs GPR:$Rd), (ins GPR:$Rn, t2_so_reg:$imm),
- IIC_iALUsi,
- "sub", "\t$Rd, $Rn, $imm", []> {
- let Inst{31-27} = 0b11101;
- let Inst{26-25} = 0b01;
- let Inst{24-21} = 0b1101;
- let Inst{19-16} = 0b1101; // Rn = sp
- let Inst{15} = 0;
-}
-} // end isCodeGenOnly = 1
-
-// Signed and unsigned division on v7-M
-def t2SDIV : T2ThreeReg<(outs rGPR:$Rd), (ins rGPR:$Rn, rGPR:$Rm), IIC_iALUi,
- "sdiv", "\t$Rd, $Rn, $Rm",
- [(set rGPR:$Rd, (sdiv rGPR:$Rn, rGPR:$Rm))]>,
- Requires<[HasDivide, IsThumb2]> {
- let Inst{31-27} = 0b11111;
- let Inst{26-21} = 0b011100;
- let Inst{20} = 0b1;
- let Inst{15-12} = 0b1111;
- let Inst{7-4} = 0b1111;
-}
-
-def t2UDIV : T2ThreeReg<(outs rGPR:$Rd), (ins rGPR:$Rn, rGPR:$Rm), IIC_iALUi,
- "udiv", "\t$Rd, $Rn, $Rm",
- [(set rGPR:$Rd, (udiv rGPR:$Rn, rGPR:$Rm))]>,
- Requires<[HasDivide, IsThumb2]> {
- let Inst{31-27} = 0b11111;
- let Inst{26-21} = 0b011101;
- let Inst{20} = 0b1;
- let Inst{15-12} = 0b1111;
- let Inst{7-4} = 0b1111;
-}
-
//===----------------------------------------------------------------------===//
// Load / store Instructions.
//
@@ -1668,6 +1610,10 @@ def t2MOVi : T2sOneRegImm<(outs rGPR:$Rd), (ins t2_so_imm:$imm), IIC_iMOVi,
let Inst{15} = 0;
}
+def : InstAlias<"mov${s}${p} $Rd, $imm", (t2MOVi rGPR:$Rd, t2_so_imm:$imm,
+ pred:$p, cc_out:$s)>,
+ Requires<[IsThumb2]>;
+
let isReMaterializable = 1, isAsCheapAsAMove = 1, isMoveImm = 1 in
def t2MOVi16 : T2I<(outs rGPR:$Rd), (ins i32imm_hilo16:$imm), IIC_iMOVi,
"movw", "\t$Rd, $imm",
@@ -1788,8 +1734,10 @@ defm t2ADC : T2I_adde_sube_irs<0b1010, "adc",
BinOpFrag<(adde_dead_carry node:$LHS, node:$RHS)>, 1>;
defm t2SBC : T2I_adde_sube_irs<0b1011, "sbc",
BinOpFrag<(sube_dead_carry node:$LHS, node:$RHS)>>;
-defm t2ADCS : T2I_adde_sube_s_irs<BinOpFrag<(adde_live_carry node:$LHS, node:$RHS)>, 1>;
-defm t2SBCS : T2I_adde_sube_s_irs<BinOpFrag<(sube_live_carry node:$LHS, node:$RHS)>>;
+defm t2ADCS : T2I_adde_sube_s_irs<BinOpFrag<(adde_live_carry node:$LHS,
+ node:$RHS)>, 1>;
+defm t2SBCS : T2I_adde_sube_s_irs<BinOpFrag<(sube_live_carry node:$LHS,
+ node:$RHS)>>;
// RSB
defm t2RSB : T2I_rbin_irs <0b1110, "rsb",
@@ -1833,7 +1781,8 @@ def : T2Pat<(adde_live_carry rGPR:$src, t2_so_imm_not:$imm),
// Select Bytes -- for disassembly only
def t2SEL : T2ThreeReg<(outs GPR:$Rd), (ins GPR:$Rn, GPR:$Rm),
- NoItinerary, "sel", "\t$Rd, $Rn, $Rm", []> {
+ NoItinerary, "sel", "\t$Rd, $Rn, $Rm", []>,
+ Requires<[IsThumb2, HasThumb2DSP]> {
let Inst{31-27} = 0b11111;
let Inst{26-24} = 0b010;
let Inst{23} = 0b1;
@@ -1849,7 +1798,8 @@ class T2I_pam<bits<3> op22_20, bits<4> op7_4, string opc,
list<dag> pat = [/* For disassembly only; pattern left blank */],
dag iops = (ins rGPR:$Rn, rGPR:$Rm),
string asm = "\t$Rd, $Rn, $Rm">
- : T2I<(outs rGPR:$Rd), iops, NoItinerary, opc, asm, pat> {
+ : T2I<(outs rGPR:$Rd), iops, NoItinerary, opc, asm, pat>,
+ Requires<[IsThumb2, HasThumb2DSP]> {
let Inst{31-27} = 0b11111;
let Inst{26-23} = 0b0101;
let Inst{22-20} = op22_20;
@@ -1947,12 +1897,14 @@ class T2FourReg_mac<bit long, bits<3> op22_20, bits<4> op7_4, dag oops,
def t2USAD8 : T2ThreeReg_mac<0, 0b111, 0b0000, (outs rGPR:$Rd),
(ins rGPR:$Rn, rGPR:$Rm),
- NoItinerary, "usad8", "\t$Rd, $Rn, $Rm", []> {
+ NoItinerary, "usad8", "\t$Rd, $Rn, $Rm", []>,
+ Requires<[IsThumb2, HasThumb2DSP]> {
let Inst{15-12} = 0b1111;
}
def t2USADA8 : T2FourReg_mac<0, 0b111, 0b0000, (outs rGPR:$Rd),
(ins rGPR:$Rn, rGPR:$Rm, rGPR:$Ra), NoItinerary,
- "usada8", "\t$Rd, $Rn, $Rm, $Ra", []>;
+ "usada8", "\t$Rd, $Rn, $Rm, $Ra", []>,
+ Requires<[IsThumb2, HasThumb2DSP]>;
// Signed/Unsigned saturate -- for disassembly only
@@ -1985,7 +1937,8 @@ def t2SSAT: T2SatI<
def t2SSAT16: T2SatI<
(outs rGPR:$Rd), (ins ssat_imm:$sat_imm, rGPR:$Rn), NoItinerary,
"ssat16", "\t$Rd, $sat_imm, $Rn",
- [/* For disassembly only; pattern left blank */]> {
+ [/* For disassembly only; pattern left blank */]>,
+ Requires<[IsThumb2, HasThumb2DSP]> {
let Inst{31-27} = 0b11110;
let Inst{25-22} = 0b1100;
let Inst{20} = 0;
@@ -2005,10 +1958,11 @@ def t2USAT: T2SatI<
let Inst{15} = 0;
}
-def t2USAT16: T2SatI<
- (outs rGPR:$dst), (ins i32imm:$sat_imm, rGPR:$Rn), NoItinerary,
- "usat16", "\t$dst, $sat_imm, $Rn",
- [/* For disassembly only; pattern left blank */]> {
+def t2USAT16: T2SatI<(outs rGPR:$dst), (ins i32imm:$sat_imm, rGPR:$Rn),
+ NoItinerary,
+ "usat16", "\t$dst, $sat_imm, $Rn",
+ [/* For disassembly only; pattern left blank */]>,
+ Requires<[IsThumb2, HasThumb2DSP]> {
let Inst{31-27} = 0b11110;
let Inst{25-22} = 0b1110;
let Inst{20} = 0;
@@ -2084,17 +2038,18 @@ def t2MOVsra_flag : T2TwoRegShiftImm<
defm t2AND : T2I_bin_w_irs<0b0000, "and",
IIC_iBITi, IIC_iBITr, IIC_iBITsi,
- BinOpFrag<(and node:$LHS, node:$RHS)>, 1>;
+ BinOpFrag<(and node:$LHS, node:$RHS)>, "t2AND", 1>;
defm t2ORR : T2I_bin_w_irs<0b0010, "orr",
IIC_iBITi, IIC_iBITr, IIC_iBITsi,
- BinOpFrag<(or node:$LHS, node:$RHS)>, 1>;
+ BinOpFrag<(or node:$LHS, node:$RHS)>, "t2ORR", 1>;
defm t2EOR : T2I_bin_w_irs<0b0100, "eor",
IIC_iBITi, IIC_iBITr, IIC_iBITsi,
- BinOpFrag<(xor node:$LHS, node:$RHS)>, 1>;
+ BinOpFrag<(xor node:$LHS, node:$RHS)>, "t2EOR", 1>;
defm t2BIC : T2I_bin_w_irs<0b0001, "bic",
IIC_iBITi, IIC_iBITr, IIC_iBITsi,
- BinOpFrag<(and node:$LHS, (not node:$RHS))>>;
+ BinOpFrag<(and node:$LHS, (not node:$RHS))>,
+ "t2BIC">;
class T2BitFI<dag oops, dag iops, InstrItinClass itin,
string opc, string asm, list<dag> pattern>
@@ -2194,7 +2149,8 @@ let Constraints = "$src = $Rd" in {
defm t2ORN : T2I_bin_irs<0b0011, "orn",
IIC_iBITi, IIC_iBITr, IIC_iBITsi,
- BinOpFrag<(or node:$LHS, (not node:$RHS))>, 0, "">;
+ BinOpFrag<(or node:$LHS, (not node:$RHS))>,
+ "t2ORN", 0, "">;
// Prefer over of t2EORri ra, rb, -1 because mvn has 16-bit version
let AddedComplexity = 1 in
@@ -2277,7 +2233,8 @@ def t2UMLAL : T2MulLong<0b110, 0b0000,
def t2UMAAL : T2MulLong<0b110, 0b0110,
(outs rGPR:$RdLo, rGPR:$RdHi),
(ins rGPR:$Rn, rGPR:$Rm), IIC_iMAC64,
- "umaal", "\t$RdLo, $RdHi, $Rn, $Rm", []>;
+ "umaal", "\t$RdLo, $RdHi, $Rn, $Rm", []>,
+ Requires<[IsThumb2, HasThumb2DSP]>;
} // neverHasSideEffects
// Rounding variants of the below included for disassembly only
@@ -2285,7 +2242,8 @@ def t2UMAAL : T2MulLong<0b110, 0b0110,
// Most significant word multiply
def t2SMMUL : T2ThreeReg<(outs rGPR:$Rd), (ins rGPR:$Rn, rGPR:$Rm), IIC_iMUL32,
"smmul", "\t$Rd, $Rn, $Rm",
- [(set rGPR:$Rd, (mulhs rGPR:$Rn, rGPR:$Rm))]> {
+ [(set rGPR:$Rd, (mulhs rGPR:$Rn, rGPR:$Rm))]>,
+ Requires<[IsThumb2, HasThumb2DSP]> {
let Inst{31-27} = 0b11111;
let Inst{26-23} = 0b0110;
let Inst{22-20} = 0b101;
@@ -2294,7 +2252,8 @@ def t2SMMUL : T2ThreeReg<(outs rGPR:$Rd), (ins rGPR:$Rn, rGPR:$Rm), IIC_iMUL32,
}
def t2SMMULR : T2ThreeReg<(outs rGPR:$Rd), (ins rGPR:$Rn, rGPR:$Rm), IIC_iMUL32,
- "smmulr", "\t$Rd, $Rn, $Rm", []> {
+ "smmulr", "\t$Rd, $Rn, $Rm", []>,
+ Requires<[IsThumb2, HasThumb2DSP]> {
let Inst{31-27} = 0b11111;
let Inst{26-23} = 0b0110;
let Inst{22-20} = 0b101;
@@ -2305,7 +2264,8 @@ def t2SMMULR : T2ThreeReg<(outs rGPR:$Rd), (ins rGPR:$Rn, rGPR:$Rm), IIC_iMUL32,
def t2SMMLA : T2FourReg<
(outs rGPR:$Rd), (ins rGPR:$Rn, rGPR:$Rm, rGPR:$Ra), IIC_iMAC32,
"smmla", "\t$Rd, $Rn, $Rm, $Ra",
- [(set rGPR:$Rd, (add (mulhs rGPR:$Rm, rGPR:$Rn), rGPR:$Ra))]> {
+ [(set rGPR:$Rd, (add (mulhs rGPR:$Rm, rGPR:$Rn), rGPR:$Ra))]>,
+ Requires<[IsThumb2, HasThumb2DSP]> {
let Inst{31-27} = 0b11111;
let Inst{26-23} = 0b0110;
let Inst{22-20} = 0b101;
@@ -2314,7 +2274,8 @@ def t2SMMLA : T2FourReg<
def t2SMMLAR: T2FourReg<
(outs rGPR:$Rd), (ins rGPR:$Rn, rGPR:$Rm, rGPR:$Ra), IIC_iMAC32,
- "smmlar", "\t$Rd, $Rn, $Rm, $Ra", []> {
+ "smmlar", "\t$Rd, $Rn, $Rm, $Ra", []>,
+ Requires<[IsThumb2, HasThumb2DSP]> {
let Inst{31-27} = 0b11111;
let Inst{26-23} = 0b0110;
let Inst{22-20} = 0b101;
@@ -2324,7 +2285,8 @@ def t2SMMLAR: T2FourReg<
def t2SMMLS: T2FourReg<
(outs rGPR:$Rd), (ins rGPR:$Rn, rGPR:$Rm, rGPR:$Ra), IIC_iMAC32,
"smmls", "\t$Rd, $Rn, $Rm, $Ra",
- [(set rGPR:$Rd, (sub rGPR:$Ra, (mulhs rGPR:$Rn, rGPR:$Rm)))]> {
+ [(set rGPR:$Rd, (sub rGPR:$Ra, (mulhs rGPR:$Rn, rGPR:$Rm)))]>,
+ Requires<[IsThumb2, HasThumb2DSP]> {
let Inst{31-27} = 0b11111;
let Inst{26-23} = 0b0110;
let Inst{22-20} = 0b110;
@@ -2333,7 +2295,8 @@ def t2SMMLS: T2FourReg<
def t2SMMLSR:T2FourReg<
(outs rGPR:$Rd), (ins rGPR:$Rn, rGPR:$Rm, rGPR:$Ra), IIC_iMAC32,
- "smmlsr", "\t$Rd, $Rn, $Rm, $Ra", []> {
+ "smmlsr", "\t$Rd, $Rn, $Rm, $Ra", []>,
+ Requires<[IsThumb2, HasThumb2DSP]> {
let Inst{31-27} = 0b11111;
let Inst{26-23} = 0b0110;
let Inst{22-20} = 0b110;
@@ -2344,7 +2307,8 @@ multiclass T2I_smul<string opc, PatFrag opnode> {
def BB : T2ThreeReg<(outs rGPR:$Rd), (ins rGPR:$Rn, rGPR:$Rm), IIC_iMUL16,
!strconcat(opc, "bb"), "\t$Rd, $Rn, $Rm",
[(set rGPR:$Rd, (opnode (sext_inreg rGPR:$Rn, i16),
- (sext_inreg rGPR:$Rm, i16)))]> {
+ (sext_inreg rGPR:$Rm, i16)))]>,
+ Requires<[IsThumb2, HasThumb2DSP]> {
let Inst{31-27} = 0b11111;
let Inst{26-23} = 0b0110;
let Inst{22-20} = 0b001;
@@ -2356,7 +2320,8 @@ multiclass T2I_smul<string opc, PatFrag opnode> {
def BT : T2ThreeReg<(outs rGPR:$Rd), (ins rGPR:$Rn, rGPR:$Rm), IIC_iMUL16,
!strconcat(opc, "bt"), "\t$Rd, $Rn, $Rm",
[(set rGPR:$Rd, (opnode (sext_inreg rGPR:$Rn, i16),
- (sra rGPR:$Rm, (i32 16))))]> {
+ (sra rGPR:$Rm, (i32 16))))]>,
+ Requires<[IsThumb2, HasThumb2DSP]> {
let Inst{31-27} = 0b11111;
let Inst{26-23} = 0b0110;
let Inst{22-20} = 0b001;
@@ -2368,7 +2333,8 @@ multiclass T2I_smul<string opc, PatFrag opnode> {
def TB : T2ThreeReg<(outs rGPR:$Rd), (ins rGPR:$Rn, rGPR:$Rm), IIC_iMUL16,
!strconcat(opc, "tb"), "\t$Rd, $Rn, $Rm",
[(set rGPR:$Rd, (opnode (sra rGPR:$Rn, (i32 16)),
- (sext_inreg rGPR:$Rm, i16)))]> {
+ (sext_inreg rGPR:$Rm, i16)))]>,
+ Requires<[IsThumb2, HasThumb2DSP]> {
let Inst{31-27} = 0b11111;
let Inst{26-23} = 0b0110;
let Inst{22-20} = 0b001;
@@ -2380,7 +2346,8 @@ multiclass T2I_smul<string opc, PatFrag opnode> {
def TT : T2ThreeReg<(outs rGPR:$Rd), (ins rGPR:$Rn, rGPR:$Rm), IIC_iMUL16,
!strconcat(opc, "tt"), "\t$Rd, $Rn, $Rm",
[(set rGPR:$Rd, (opnode (sra rGPR:$Rn, (i32 16)),
- (sra rGPR:$Rm, (i32 16))))]> {
+ (sra rGPR:$Rm, (i32 16))))]>,
+ Requires<[IsThumb2, HasThumb2DSP]> {
let Inst{31-27} = 0b11111;
let Inst{26-23} = 0b0110;
let Inst{22-20} = 0b001;
@@ -2392,7 +2359,8 @@ multiclass T2I_smul<string opc, PatFrag opnode> {
def WB : T2ThreeReg<(outs rGPR:$Rd), (ins rGPR:$Rn, rGPR:$Rm), IIC_iMUL16,
!strconcat(opc, "wb"), "\t$Rd, $Rn, $Rm",
[(set rGPR:$Rd, (sra (opnode rGPR:$Rn,
- (sext_inreg rGPR:$Rm, i16)), (i32 16)))]> {
+ (sext_inreg rGPR:$Rm, i16)), (i32 16)))]>,
+ Requires<[IsThumb2, HasThumb2DSP]> {
let Inst{31-27} = 0b11111;
let Inst{26-23} = 0b0110;
let Inst{22-20} = 0b011;
@@ -2404,7 +2372,8 @@ multiclass T2I_smul<string opc, PatFrag opnode> {
def WT : T2ThreeReg<(outs rGPR:$Rd), (ins rGPR:$Rn, rGPR:$Rm), IIC_iMUL16,
!strconcat(opc, "wt"), "\t$Rd, $Rn, $Rm",
[(set rGPR:$Rd, (sra (opnode rGPR:$Rn,
- (sra rGPR:$Rm, (i32 16))), (i32 16)))]> {
+ (sra rGPR:$Rm, (i32 16))), (i32 16)))]>,
+ Requires<[IsThumb2, HasThumb2DSP]> {
let Inst{31-27} = 0b11111;
let Inst{26-23} = 0b0110;
let Inst{22-20} = 0b011;
@@ -2421,7 +2390,8 @@ multiclass T2I_smla<string opc, PatFrag opnode> {
!strconcat(opc, "bb"), "\t$Rd, $Rn, $Rm, $Ra",
[(set rGPR:$Rd, (add rGPR:$Ra,
(opnode (sext_inreg rGPR:$Rn, i16),
- (sext_inreg rGPR:$Rm, i16))))]> {
+ (sext_inreg rGPR:$Rm, i16))))]>,
+ Requires<[IsThumb2, HasThumb2DSP]> {
let Inst{31-27} = 0b11111;
let Inst{26-23} = 0b0110;
let Inst{22-20} = 0b001;
@@ -2433,7 +2403,8 @@ multiclass T2I_smla<string opc, PatFrag opnode> {
(outs rGPR:$Rd), (ins rGPR:$Rn, rGPR:$Rm, rGPR:$Ra), IIC_iMAC16,
!strconcat(opc, "bt"), "\t$Rd, $Rn, $Rm, $Ra",
[(set rGPR:$Rd, (add rGPR:$Ra, (opnode (sext_inreg rGPR:$Rn, i16),
- (sra rGPR:$Rm, (i32 16)))))]> {
+ (sra rGPR:$Rm, (i32 16)))))]>,
+ Requires<[IsThumb2, HasThumb2DSP]> {
let Inst{31-27} = 0b11111;
let Inst{26-23} = 0b0110;
let Inst{22-20} = 0b001;
@@ -2445,7 +2416,8 @@ multiclass T2I_smla<string opc, PatFrag opnode> {
(outs rGPR:$Rd), (ins rGPR:$Rn, rGPR:$Rm, rGPR:$Ra), IIC_iMAC16,
!strconcat(opc, "tb"), "\t$Rd, $Rn, $Rm, $Ra",
[(set rGPR:$Rd, (add rGPR:$Ra, (opnode (sra rGPR:$Rn, (i32 16)),
- (sext_inreg rGPR:$Rm, i16))))]> {
+ (sext_inreg rGPR:$Rm, i16))))]>,
+ Requires<[IsThumb2, HasThumb2DSP]> {
let Inst{31-27} = 0b11111;
let Inst{26-23} = 0b0110;
let Inst{22-20} = 0b001;
@@ -2457,7 +2429,8 @@ multiclass T2I_smla<string opc, PatFrag opnode> {
(outs rGPR:$Rd), (ins rGPR:$Rn, rGPR:$Rm, rGPR:$Ra), IIC_iMAC16,
!strconcat(opc, "tt"), "\t$Rd, $Rn, $Rm, $Ra",
[(set rGPR:$Rd, (add rGPR:$Ra, (opnode (sra rGPR:$Rn, (i32 16)),
- (sra rGPR:$Rm, (i32 16)))))]> {
+ (sra rGPR:$Rm, (i32 16)))))]>,
+ Requires<[IsThumb2, HasThumb2DSP]> {
let Inst{31-27} = 0b11111;
let Inst{26-23} = 0b0110;
let Inst{22-20} = 0b001;
@@ -2469,7 +2442,8 @@ multiclass T2I_smla<string opc, PatFrag opnode> {
(outs rGPR:$Rd), (ins rGPR:$Rn, rGPR:$Rm, rGPR:$Ra), IIC_iMAC16,
!strconcat(opc, "wb"), "\t$Rd, $Rn, $Rm, $Ra",
[(set rGPR:$Rd, (add rGPR:$Ra, (sra (opnode rGPR:$Rn,
- (sext_inreg rGPR:$Rm, i16)), (i32 16))))]> {
+ (sext_inreg rGPR:$Rm, i16)), (i32 16))))]>,
+ Requires<[IsThumb2, HasThumb2DSP]> {
let Inst{31-27} = 0b11111;
let Inst{26-23} = 0b0110;
let Inst{22-20} = 0b011;
@@ -2481,7 +2455,8 @@ multiclass T2I_smla<string opc, PatFrag opnode> {
(outs rGPR:$Rd), (ins rGPR:$Rn, rGPR:$Rm, rGPR:$Ra), IIC_iMAC16,
!strconcat(opc, "wt"), "\t$Rd, $Rn, $Rm, $Ra",
[(set rGPR:$Rd, (add rGPR:$Ra, (sra (opnode rGPR:$Rn,
- (sra rGPR:$Rm, (i32 16))), (i32 16))))]> {
+ (sra rGPR:$Rm, (i32 16))), (i32 16))))]>,
+ Requires<[IsThumb2, HasThumb2DSP]> {
let Inst{31-27} = 0b11111;
let Inst{26-23} = 0b0110;
let Inst{22-20} = 0b011;
@@ -2496,66 +2471,108 @@ defm t2SMLA : T2I_smla<"smla", BinOpFrag<(mul node:$LHS, node:$RHS)>>;
// Halfword multiple accumulate long: SMLAL<x><y> -- for disassembly only
def t2SMLALBB : T2FourReg_mac<1, 0b100, 0b1000, (outs rGPR:$Ra,rGPR:$Rd),
(ins rGPR:$Rn,rGPR:$Rm), IIC_iMAC64, "smlalbb", "\t$Ra, $Rd, $Rn, $Rm",
- [/* For disassembly only; pattern left blank */]>;
+ [/* For disassembly only; pattern left blank */]>,
+ Requires<[IsThumb2, HasThumb2DSP]>;
def t2SMLALBT : T2FourReg_mac<1, 0b100, 0b1001, (outs rGPR:$Ra,rGPR:$Rd),
(ins rGPR:$Rn,rGPR:$Rm), IIC_iMAC64, "smlalbt", "\t$Ra, $Rd, $Rn, $Rm",
- [/* For disassembly only; pattern left blank */]>;
+ [/* For disassembly only; pattern left blank */]>,
+ Requires<[IsThumb2, HasThumb2DSP]>;
def t2SMLALTB : T2FourReg_mac<1, 0b100, 0b1010, (outs rGPR:$Ra,rGPR:$Rd),
(ins rGPR:$Rn,rGPR:$Rm), IIC_iMAC64, "smlaltb", "\t$Ra, $Rd, $Rn, $Rm",
- [/* For disassembly only; pattern left blank */]>;
+ [/* For disassembly only; pattern left blank */]>,
+ Requires<[IsThumb2, HasThumb2DSP]>;
def t2SMLALTT : T2FourReg_mac<1, 0b100, 0b1011, (outs rGPR:$Ra,rGPR:$Rd),
(ins rGPR:$Rn,rGPR:$Rm), IIC_iMAC64, "smlaltt", "\t$Ra, $Rd, $Rn, $Rm",
- [/* For disassembly only; pattern left blank */]>;
+ [/* For disassembly only; pattern left blank */]>,
+ Requires<[IsThumb2, HasThumb2DSP]>;
// Dual halfword multiple: SMUAD, SMUSD, SMLAD, SMLSD, SMLALD, SMLSLD
// These are for disassembly only.
def t2SMUAD: T2ThreeReg_mac<
0, 0b010, 0b0000, (outs rGPR:$Rd), (ins rGPR:$Rn, rGPR:$Rm),
- IIC_iMAC32, "smuad", "\t$Rd, $Rn, $Rm", []> {
+ IIC_iMAC32, "smuad", "\t$Rd, $Rn, $Rm", []>,
+ Requires<[IsThumb2, HasThumb2DSP]> {
let Inst{15-12} = 0b1111;
}
def t2SMUADX:T2ThreeReg_mac<
0, 0b010, 0b0001, (outs rGPR:$Rd), (ins rGPR:$Rn, rGPR:$Rm),
- IIC_iMAC32, "smuadx", "\t$Rd, $Rn, $Rm", []> {
+ IIC_iMAC32, "smuadx", "\t$Rd, $Rn, $Rm", []>,
+ Requires<[IsThumb2, HasThumb2DSP]> {
let Inst{15-12} = 0b1111;
}
def t2SMUSD: T2ThreeReg_mac<
0, 0b100, 0b0000, (outs rGPR:$Rd), (ins rGPR:$Rn, rGPR:$Rm),
- IIC_iMAC32, "smusd", "\t$Rd, $Rn, $Rm", []> {
+ IIC_iMAC32, "smusd", "\t$Rd, $Rn, $Rm", []>,
+ Requires<[IsThumb2, HasThumb2DSP]> {
let Inst{15-12} = 0b1111;
}
def t2SMUSDX:T2ThreeReg_mac<
0, 0b100, 0b0001, (outs rGPR:$Rd), (ins rGPR:$Rn, rGPR:$Rm),
- IIC_iMAC32, "smusdx", "\t$Rd, $Rn, $Rm", []> {
+ IIC_iMAC32, "smusdx", "\t$Rd, $Rn, $Rm", []>,
+ Requires<[IsThumb2, HasThumb2DSP]> {
let Inst{15-12} = 0b1111;
}
def t2SMLAD : T2ThreeReg_mac<
0, 0b010, 0b0000, (outs rGPR:$Rd),
(ins rGPR:$Rn, rGPR:$Rm, rGPR:$Ra), IIC_iMAC32, "smlad",
- "\t$Rd, $Rn, $Rm, $Ra", []>;
+ "\t$Rd, $Rn, $Rm, $Ra", []>,
+ Requires<[IsThumb2, HasThumb2DSP]>;
def t2SMLADX : T2FourReg_mac<
0, 0b010, 0b0001, (outs rGPR:$Rd),
(ins rGPR:$Rn, rGPR:$Rm, rGPR:$Ra), IIC_iMAC32, "smladx",
- "\t$Rd, $Rn, $Rm, $Ra", []>;
+ "\t$Rd, $Rn, $Rm, $Ra", []>,
+ Requires<[IsThumb2, HasThumb2DSP]>;
def t2SMLSD : T2FourReg_mac<0, 0b100, 0b0000, (outs rGPR:$Rd),
(ins rGPR:$Rn, rGPR:$Rm, rGPR:$Ra), IIC_iMAC32, "smlsd",
- "\t$Rd, $Rn, $Rm, $Ra", []>;
+ "\t$Rd, $Rn, $Rm, $Ra", []>,
+ Requires<[IsThumb2, HasThumb2DSP]>;
def t2SMLSDX : T2FourReg_mac<0, 0b100, 0b0001, (outs rGPR:$Rd),
(ins rGPR:$Rn, rGPR:$Rm, rGPR:$Ra), IIC_iMAC32, "smlsdx",
- "\t$Rd, $Rn, $Rm, $Ra", []>;
+ "\t$Rd, $Rn, $Rm, $Ra", []>,
+ Requires<[IsThumb2, HasThumb2DSP]>;
def t2SMLALD : T2FourReg_mac<1, 0b100, 0b1100, (outs rGPR:$Ra,rGPR:$Rd),
(ins rGPR:$Rm, rGPR:$Rn), IIC_iMAC64, "smlald",
- "\t$Ra, $Rd, $Rm, $Rn", []>;
+ "\t$Ra, $Rd, $Rm, $Rn", []>,
+ Requires<[IsThumb2, HasThumb2DSP]>;
def t2SMLALDX : T2FourReg_mac<1, 0b100, 0b1101, (outs rGPR:$Ra,rGPR:$Rd),
(ins rGPR:$Rm,rGPR:$Rn), IIC_iMAC64, "smlaldx",
- "\t$Ra, $Rd, $Rm, $Rn", []>;
+ "\t$Ra, $Rd, $Rm, $Rn", []>,
+ Requires<[IsThumb2, HasThumb2DSP]>;
def t2SMLSLD : T2FourReg_mac<1, 0b101, 0b1100, (outs rGPR:$Ra,rGPR:$Rd),
(ins rGPR:$Rm,rGPR:$Rn), IIC_iMAC64, "smlsld",
- "\t$Ra, $Rd, $Rm, $Rn", []>;
+ "\t$Ra, $Rd, $Rm, $Rn", []>,
+ Requires<[IsThumb2, HasThumb2DSP]>;
def t2SMLSLDX : T2FourReg_mac<1, 0b101, 0b1101, (outs rGPR:$Ra,rGPR:$Rd),
(ins rGPR:$Rm,rGPR:$Rn), IIC_iMAC64, "smlsldx",
- "\t$Ra, $Rd, $Rm, $Rn", []>;
+ "\t$Ra, $Rd, $Rm, $Rn", []>,
+ Requires<[IsThumb2, HasThumb2DSP]>;
+
+//===----------------------------------------------------------------------===//
+// Division Instructions.
+// Signed and unsigned division on v7-M
+//
+def t2SDIV : T2ThreeReg<(outs rGPR:$Rd), (ins rGPR:$Rn, rGPR:$Rm), IIC_iALUi,
+ "sdiv", "\t$Rd, $Rn, $Rm",
+ [(set rGPR:$Rd, (sdiv rGPR:$Rn, rGPR:$Rm))]>,
+ Requires<[HasDivide, IsThumb2]> {
+ let Inst{31-27} = 0b11111;
+ let Inst{26-21} = 0b011100;
+ let Inst{20} = 0b1;
+ let Inst{15-12} = 0b1111;
+ let Inst{7-4} = 0b1111;
+}
+
+def t2UDIV : T2ThreeReg<(outs rGPR:$Rd), (ins rGPR:$Rn, rGPR:$Rm), IIC_iALUi,
+ "udiv", "\t$Rd, $Rn, $Rm",
+ [(set rGPR:$Rd, (udiv rGPR:$Rn, rGPR:$Rm))]>,
+ Requires<[HasDivide, IsThumb2]> {
+ let Inst{31-27} = 0b11111;
+ let Inst{26-21} = 0b011101;
+ let Inst{20} = 0b1;
+ let Inst{15-12} = 0b1111;
+ let Inst{7-4} = 0b1111;
+}
//===----------------------------------------------------------------------===//
// Misc. Arithmetic Instructions.
@@ -2585,25 +2602,16 @@ def t2REV : T2I_misc<0b01, 0b00, (outs rGPR:$Rd), (ins rGPR:$Rm), IIC_iUNAr,
def t2REV16 : T2I_misc<0b01, 0b01, (outs rGPR:$Rd), (ins rGPR:$Rm), IIC_iUNAr,
"rev16", ".w\t$Rd, $Rm",
- [(set rGPR:$Rd,
- (or (and (srl rGPR:$Rm, (i32 8)), 0xFF),
- (or (and (shl rGPR:$Rm, (i32 8)), 0xFF00),
- (or (and (srl rGPR:$Rm, (i32 8)), 0xFF0000),
- (and (shl rGPR:$Rm, (i32 8)), 0xFF000000)))))]>;
+ [(set rGPR:$Rd, (rotr (bswap rGPR:$Rm), (i32 16)))]>;
def t2REVSH : T2I_misc<0b01, 0b11, (outs rGPR:$Rd), (ins rGPR:$Rm), IIC_iUNAr,
"revsh", ".w\t$Rd, $Rm",
- [(set rGPR:$Rd,
- (sext_inreg
- (or (srl rGPR:$Rm, (i32 8)),
- (shl rGPR:$Rm, (i32 8))), i16))]>;
+ [(set rGPR:$Rd, (sra (bswap rGPR:$Rm), (i32 16)))]>;
-def : T2Pat<(sext_inreg (or (srl (and rGPR:$Rm, 0xFF00), (i32 8)),
- (shl rGPR:$Rm, (i32 8))), i16),
+def : T2Pat<(or (sra (shl rGPR:$Rm, (i32 24)), (i32 16)),
+ (and (srl rGPR:$Rm, (i32 8)), 0xFF)),
(t2REVSH rGPR:$Rm)>;
-def : T2Pat<(sra (bswap rGPR:$Rm), (i32 16)), (t2REVSH rGPR:$Rm)>;
-
def t2PKHBT : T2ThreeReg<
(outs rGPR:$Rd), (ins rGPR:$Rn, rGPR:$Rm, shift_imm:$sh),
IIC_iBITsi, "pkhbt", "\t$Rd, $Rn, $Rm$sh",
@@ -2699,33 +2707,21 @@ defm t2TEQ : T2I_cmp_irs<0b0100, "teq",
// FIXME: should be able to write a pattern for ARMcmov, but can't use
// a two-value operand where a dag node expects two operands. :(
let neverHasSideEffects = 1 in {
-def t2MOVCCr : T2TwoReg<
- (outs rGPR:$Rd), (ins rGPR:$false, rGPR:$Rm), IIC_iCMOVr,
- "mov", ".w\t$Rd, $Rm",
+def t2MOVCCr : t2PseudoInst<(outs rGPR:$Rd),
+ (ins rGPR:$false, rGPR:$Rm, pred:$p),
+ 4, IIC_iCMOVr,
[/*(set rGPR:$Rd, (ARMcmov rGPR:$false, rGPR:$Rm, imm:$cc, CCR:$ccr))*/]>,
- RegConstraint<"$false = $Rd"> {
- let Inst{31-27} = 0b11101;
- let Inst{26-25} = 0b01;
- let Inst{24-21} = 0b0010;
- let Inst{20} = 0; // The S bit.
- let Inst{19-16} = 0b1111; // Rn
- let Inst{14-12} = 0b000;
- let Inst{7-4} = 0b0000;
-}
+ RegConstraint<"$false = $Rd">;
let isMoveImm = 1 in
-def t2MOVCCi : T2OneRegImm<(outs rGPR:$Rd), (ins rGPR:$false, t2_so_imm:$imm),
- IIC_iCMOVi, "mov", ".w\t$Rd, $imm",
+def t2MOVCCi : t2PseudoInst<(outs rGPR:$Rd),
+ (ins rGPR:$false, t2_so_imm:$imm, pred:$p),
+ 4, IIC_iCMOVi,
[/*(set rGPR:$Rd,(ARMcmov rGPR:$false,t2_so_imm:$imm, imm:$cc, CCR:$ccr))*/]>,
- RegConstraint<"$false = $Rd"> {
- let Inst{31-27} = 0b11110;
- let Inst{25} = 0;
- let Inst{24-21} = 0b0010;
- let Inst{20} = 0; // The S bit.
- let Inst{19-16} = 0b1111; // Rn
- let Inst{15} = 0;
-}
+ RegConstraint<"$false = $Rd">;
+// FIXME: Pseudo-ize these. For now, just mark codegen only.
+let isCodeGenOnly = 1 in {
let isMoveImm = 1 in
def t2MOVCCi16 : T2I<(outs rGPR:$Rd), (ins rGPR:$false, i32imm_hilo16:$imm),
IIC_iCMOVi,
@@ -2792,6 +2788,7 @@ def t2MOVCCror : T2I_movcc_sh<0b11, (outs rGPR:$Rd),
(ins rGPR:$false, rGPR:$Rm, i32imm:$imm),
IIC_iCMOVsi, "ror", ".w\t$Rd, $Rm, $imm", []>,
RegConstraint<"$false = $Rd">;
+} // isCodeGenOnly = 1
} // neverHasSideEffects
//===----------------------------------------------------------------------===//
@@ -2826,7 +2823,7 @@ def t2ISB : AInoP<(outs), (ins), ThumbFrm, NoItinerary, "isb", "",
let Inst{3-0} = 0b1111;
}
-class T2I_ldrex<bits<2> opcod, dag oops, dag iops, AddrMode am, SizeFlagVal sz,
+class T2I_ldrex<bits<2> opcod, dag oops, dag iops, AddrMode am, int sz,
InstrItinClass itin, string opc, string asm, string cstr,
list<dag> pattern, bits<4> rt2 = 0b1111>
: Thumb2I<oops, iops, am, sz, itin, opc, asm, cstr, pattern> {
@@ -2842,7 +2839,7 @@ class T2I_ldrex<bits<2> opcod, dag oops, dag iops, AddrMode am, SizeFlagVal sz,
let Inst{19-16} = addr;
let Inst{15-12} = Rt;
}
-class T2I_strex<bits<2> opcod, dag oops, dag iops, AddrMode am, SizeFlagVal sz,
+class T2I_strex<bits<2> opcod, dag oops, dag iops, AddrMode am, int sz,
InstrItinClass itin, string opc, string asm, string cstr,
list<dag> pattern, bits<4> rt2 = 0b1111>
: Thumb2I<oops, iops, am, sz, itin, opc, asm, cstr, pattern> {
@@ -2861,16 +2858,15 @@ class T2I_strex<bits<2> opcod, dag oops, dag iops, AddrMode am, SizeFlagVal sz,
}
let mayLoad = 1 in {
-def t2LDREXB : T2I_ldrex<0b00, (outs rGPR:$Rt), (ins t2addrmode_reg:$addr), AddrModeNone,
- Size4Bytes, NoItinerary, "ldrexb", "\t$Rt, $addr",
- "", []>;
-def t2LDREXH : T2I_ldrex<0b01, (outs rGPR:$Rt), (ins t2addrmode_reg:$addr), AddrModeNone,
- Size4Bytes, NoItinerary, "ldrexh", "\t$Rt, $addr",
- "", []>;
-def t2LDREX : Thumb2I<(outs rGPR:$Rt), (ins t2addrmode_reg:$addr), AddrModeNone,
- Size4Bytes, NoItinerary,
- "ldrex", "\t$Rt, $addr", "",
- []> {
+def t2LDREXB : T2I_ldrex<0b00, (outs rGPR:$Rt), (ins t2addrmode_reg:$addr),
+ AddrModeNone, 4, NoItinerary,
+ "ldrexb", "\t$Rt, $addr", "", []>;
+def t2LDREXH : T2I_ldrex<0b01, (outs rGPR:$Rt), (ins t2addrmode_reg:$addr),
+ AddrModeNone, 4, NoItinerary,
+ "ldrexh", "\t$Rt, $addr", "", []>;
+def t2LDREX : Thumb2I<(outs rGPR:$Rt), (ins t2addrmode_reg:$addr),
+ AddrModeNone, 4, NoItinerary,
+ "ldrex", "\t$Rt, $addr", "", []> {
let Inst{31-27} = 0b11101;
let Inst{26-20} = 0b0000101;
let Inst{11-8} = 0b1111;
@@ -2884,7 +2880,7 @@ def t2LDREX : Thumb2I<(outs rGPR:$Rt), (ins t2addrmode_reg:$addr), AddrModeNone
let hasExtraDefRegAllocReq = 1 in
def t2LDREXD : T2I_ldrex<0b11, (outs rGPR:$Rt, rGPR:$Rt2),
(ins t2addrmode_reg:$addr),
- AddrModeNone, Size4Bytes, NoItinerary,
+ AddrModeNone, 4, NoItinerary,
"ldrexd", "\t$Rt, $Rt2, $addr", "",
[], {?, ?, ?, ?}> {
bits<4> Rt2;
@@ -2893,14 +2889,16 @@ def t2LDREXD : T2I_ldrex<0b11, (outs rGPR:$Rt, rGPR:$Rt2),
}
let mayStore = 1, Constraints = "@earlyclobber $Rd" in {
-def t2STREXB : T2I_strex<0b00, (outs rGPR:$Rd), (ins rGPR:$Rt, t2addrmode_reg:$addr),
- AddrModeNone, Size4Bytes, NoItinerary,
- "strexb", "\t$Rd, $Rt, $addr", "", []>;
-def t2STREXH : T2I_strex<0b01, (outs rGPR:$Rd), (ins rGPR:$Rt, t2addrmode_reg:$addr),
- AddrModeNone, Size4Bytes, NoItinerary,
- "strexh", "\t$Rd, $Rt, $addr", "", []>;
+def t2STREXB : T2I_strex<0b00, (outs rGPR:$Rd),
+ (ins rGPR:$Rt, t2addrmode_reg:$addr),
+ AddrModeNone, 4, NoItinerary,
+ "strexb", "\t$Rd, $Rt, $addr", "", []>;
+def t2STREXH : T2I_strex<0b01, (outs rGPR:$Rd),
+ (ins rGPR:$Rt, t2addrmode_reg:$addr),
+ AddrModeNone, 4, NoItinerary,
+ "strexh", "\t$Rd, $Rt, $addr", "", []>;
def t2STREX : Thumb2I<(outs rGPR:$Rd), (ins rGPR:$Rt, t2addrmode_reg:$addr),
- AddrModeNone, Size4Bytes, NoItinerary,
+ AddrModeNone, 4, NoItinerary,
"strex", "\t$Rd, $Rt, $addr", "",
[]> {
let Inst{31-27} = 0b11101;
@@ -2919,7 +2917,7 @@ def t2STREX : Thumb2I<(outs rGPR:$Rd), (ins rGPR:$Rt, t2addrmode_reg:$addr),
let hasExtraSrcRegAllocReq = 1, Constraints = "@earlyclobber $Rd" in
def t2STREXD : T2I_strex<0b11, (outs rGPR:$Rd),
(ins rGPR:$Rt, rGPR:$Rt2, t2addrmode_reg:$addr),
- AddrModeNone, Size4Bytes, NoItinerary,
+ AddrModeNone, 4, NoItinerary,
"strexd", "\t$Rd, $Rt, $Rt2, $addr", "", [],
{?, ?, ?, ?}> {
bits<4> Rt2;
@@ -2940,22 +2938,6 @@ def t2CLREX : T2XI<(outs), (ins), NoItinerary, "clrex",
}
//===----------------------------------------------------------------------===//
-// TLS Instructions
-//
-
-// __aeabi_read_tp preserves the registers r1-r3.
-let isCall = 1,
- Defs = [R0, R12, LR, CPSR], Uses = [SP] in {
- def t2TPsoft : T2XI<(outs), (ins), IIC_Br,
- "bl\t__aeabi_read_tp",
- [(set R0, ARMthread_pointer)]> {
- let Inst{31-27} = 0b11110;
- let Inst{15-14} = 0b11;
- let Inst{12} = 1;
- }
-}
-
-//===----------------------------------------------------------------------===//
// SJLJ Exception handling intrinsics
// eh_sjlj_setjmp() is an instruction sequence to store the return
// address and save #0 in R0 for the non-longjmp case.
@@ -2973,7 +2955,7 @@ let Defs =
QQQQ0, QQQQ1, QQQQ2, QQQQ3 ],
hasSideEffects = 1, isBarrier = 1, isCodeGenOnly = 1 in {
def t2Int_eh_sjlj_setjmp : Thumb2XI<(outs), (ins tGPR:$src, tGPR:$val),
- AddrModeNone, SizeSpecial, NoItinerary, "", "",
+ AddrModeNone, 0, NoItinerary, "", "",
[(set R0, (ARMeh_sjlj_setjmp tGPR:$src, tGPR:$val))]>,
Requires<[IsThumb2, HasVFP2]>;
}
@@ -2982,7 +2964,7 @@ let Defs =
[ R0, R1, R2, R3, R4, R5, R6, R7, R8, R9, R10, R11, R12, LR, CPSR ],
hasSideEffects = 1, isBarrier = 1, isCodeGenOnly = 1 in {
def t2Int_eh_sjlj_setjmp_nofp : Thumb2XI<(outs), (ins tGPR:$src, tGPR:$val),
- AddrModeNone, SizeSpecial, NoItinerary, "", "",
+ AddrModeNone, 0, NoItinerary, "", "",
[(set R0, (ARMeh_sjlj_setjmp tGPR:$src, tGPR:$val))]>,
Requires<[IsThumb2, NoVFP]>;
}
@@ -2993,28 +2975,14 @@ let Defs =
//
// FIXME: remove when we have a way to marking a MI with these properties.
-// FIXME: $dst1 should be a def. But the extra ops must be in the end of the
-// operand list.
// FIXME: Should pc be an implicit operand like PICADD, etc?
let isReturn = 1, isTerminator = 1, isBarrier = 1, mayLoad = 1,
hasExtraDefRegAllocReq = 1, isCodeGenOnly = 1 in
-def t2LDMIA_RET: T2XIt<(outs GPR:$wb), (ins GPR:$Rn, pred:$p,
- reglist:$regs, variable_ops),
- IIC_iLoad_mBr,
- "ldmia${p}.w\t$Rn!, $regs",
- "$Rn = $wb", []> {
- bits<4> Rn;
- bits<16> regs;
-
- let Inst{31-27} = 0b11101;
- let Inst{26-25} = 0b00;
- let Inst{24-23} = 0b01; // Increment After
- let Inst{22} = 0;
- let Inst{21} = 1; // Writeback
- let Inst{20} = 1;
- let Inst{19-16} = Rn;
- let Inst{15-0} = regs;
-}
+def t2LDMIA_RET: t2PseudoExpand<(outs GPR:$wb), (ins GPR:$Rn, pred:$p,
+ reglist:$regs, variable_ops),
+ 4, IIC_iLoad_mBr, [],
+ (t2LDMIA_UPD GPR:$wb, GPR:$Rn, pred:$p, reglist:$regs)>,
+ RegConstraint<"$Rn = $wb">;
let isBranch = 1, isTerminator = 1, isBarrier = 1 in {
let isPredicable = 1 in
@@ -3036,17 +3004,17 @@ def t2B : T2XI<(outs), (ins uncondbrtarget:$target), IIC_Br,
let isNotDuplicable = 1, isIndirectBranch = 1 in {
def t2BR_JT : t2PseudoInst<(outs),
(ins GPR:$target, GPR:$index, i32imm:$jt, i32imm:$id),
- SizeSpecial, IIC_Br,
+ 0, IIC_Br,
[(ARMbr2jt GPR:$target, GPR:$index, tjumptable:$jt, imm:$id)]>;
// FIXME: Add a non-pc based case that can be predicated.
def t2TBB_JT : t2PseudoInst<(outs),
(ins GPR:$index, i32imm:$jt, i32imm:$id),
- SizeSpecial, IIC_Br, []>;
+ 0, IIC_Br, []>;
def t2TBH_JT : t2PseudoInst<(outs),
(ins GPR:$index, i32imm:$jt, i32imm:$id),
- SizeSpecial, IIC_Br, []>;
+ 0, IIC_Br, []>;
def t2TBB : T2I<(outs), (ins GPR:$Rn, GPR:$Rm), IIC_Br,
"tbb", "\t[$Rn, $Rm]", []> {
@@ -3094,11 +3062,22 @@ def t2Bcc : T2I<(outs), (ins brtarget:$target), IIC_Br,
let Inst{10-0} = target{11-1};
}
+// Tail calls. The Darwin version of thumb tail calls uses a t2 branch, so
+// it goes here.
+let isCall = 1, isTerminator = 1, isReturn = 1, isBarrier = 1 in {
+ // Darwin version.
+ let Defs = [R0, R1, R2, R3, R9, R12, QQQQ0, QQQQ2, QQQQ3, PC],
+ Uses = [SP] in
+ def tTAILJMPd: tPseudoExpand<(outs), (ins uncondbrtarget:$dst, variable_ops),
+ 4, IIC_Br, [],
+ (t2B uncondbrtarget:$dst)>,
+ Requires<[IsThumb2, IsDarwin]>;
+}
// IT block
let Defs = [ITSTATE] in
def t2IT : Thumb2XI<(outs), (ins it_pred:$cc, it_mask:$mask),
- AddrModeNone, Size2Bytes, IIC_iALUx,
+ AddrModeNone, 2, IIC_iALUx,
"it$mask\t$cc", "", []> {
// 16-bit instruction.
let Inst{31-16} = 0x0000;
@@ -3178,8 +3157,7 @@ def t2WFE : T2I_hint<0b00000010, "wfe", ".w">;
def t2WFI : T2I_hint<0b00000011, "wfi", ".w">;
def t2SEV : T2I_hint<0b00000100, "sev", ".w">;
-def t2DBG : T2I<(outs),(ins i32imm:$opt), NoItinerary, "dbg", "\t$opt",
- [/* For disassembly only; pattern left blank */]> {
+def t2DBG : T2I<(outs), (ins imm0_15:$opt), NoItinerary, "dbg", "\t$opt", []> {
let Inst{31-20} = 0xf3a;
let Inst{15-14} = 0b10;
let Inst{12} = 0;
@@ -3347,12 +3325,13 @@ def t2MSR : T2SpecialReg<0b111100111000 /* op31-20 */, 0b10 /* op15-14 */,
}
//===----------------------------------------------------------------------===//
-// Move between coprocessor and ARM core register -- for disassembly only
+// Move between coprocessor and ARM core register
//
-class t2MovRCopro<string opc, bit direction, dag oops, dag iops,
+class t2MovRCopro<bits<4> Op, string opc, bit direction, dag oops, dag iops,
list<dag> pattern>
- : T2Cop<oops, iops, !strconcat(opc, "\t$cop, $opc1, $Rt, $CRn, $CRm, $opc2"),
+ : T2Cop<Op, oops, iops,
+ !strconcat(opc, "\t$cop, $opc1, $Rt, $CRn, $CRm, $opc2"),
pattern> {
let Inst{27-24} = 0b1110;
let Inst{20} = direction;
@@ -3373,22 +3352,10 @@ class t2MovRCopro<string opc, bit direction, dag oops, dag iops,
let Inst{19-16} = CRn;
}
-def t2MCR2 : t2MovRCopro<"mcr2", 0 /* from ARM core register to coprocessor */,
- (outs), (ins p_imm:$cop, i32imm:$opc1, GPR:$Rt, c_imm:$CRn,
- c_imm:$CRm, i32imm:$opc2),
- [(int_arm_mcr2 imm:$cop, imm:$opc1, GPR:$Rt, imm:$CRn,
- imm:$CRm, imm:$opc2)]>;
-def t2MRC2 : t2MovRCopro<"mrc2", 1 /* from coprocessor to ARM core register */,
- (outs GPR:$Rt), (ins p_imm:$cop, i32imm:$opc1, c_imm:$CRn,
- c_imm:$CRm, i32imm:$opc2), []>;
-
-def : T2v6Pat<(int_arm_mrc2 imm:$cop, imm:$opc1, imm:$CRn,
- imm:$CRm, imm:$opc2),
- (t2MRC2 imm:$cop, imm:$opc1, imm:$CRn, imm:$CRm, imm:$opc2)>;
-
-class t2MovRRCopro<string opc, bit direction,
- list<dag> pattern = [/* For disassembly only */]>
- : T2Cop<(outs), (ins p_imm:$cop, i32imm:$opc1, GPR:$Rt, GPR:$Rt2, c_imm:$CRm),
+class t2MovRRCopro<bits<4> Op, string opc, bit direction,
+ list<dag> pattern = []>
+ : T2Cop<Op, (outs),
+ (ins p_imm:$cop, imm0_15:$opc1, GPR:$Rt, GPR:$Rt2, c_imm:$CRm),
!strconcat(opc, "\t$cop, $opc1, $Rt, $Rt2, $CRm"), pattern> {
let Inst{27-24} = 0b1100;
let Inst{23-21} = 0b010;
@@ -3407,19 +3374,77 @@ class t2MovRRCopro<string opc, bit direction,
let Inst{3-0} = CRm;
}
-def t2MCRR2 : t2MovRRCopro<"mcrr2",
- 0 /* from ARM core register to coprocessor */,
+/* from ARM core register to coprocessor */
+def t2MCR : t2MovRCopro<0b1110, "mcr", 0,
+ (outs),
+ (ins p_imm:$cop, imm0_7:$opc1, GPR:$Rt, c_imm:$CRn,
+ c_imm:$CRm, imm0_7:$opc2),
+ [(int_arm_mcr imm:$cop, imm:$opc1, GPR:$Rt, imm:$CRn,
+ imm:$CRm, imm:$opc2)]>;
+def t2MCR2 : t2MovRCopro<0b1111, "mcr2", 0,
+ (outs), (ins p_imm:$cop, imm0_7:$opc1, GPR:$Rt, c_imm:$CRn,
+ c_imm:$CRm, imm0_7:$opc2),
+ [(int_arm_mcr2 imm:$cop, imm:$opc1, GPR:$Rt, imm:$CRn,
+ imm:$CRm, imm:$opc2)]>;
+
+/* from coprocessor to ARM core register */
+def t2MRC : t2MovRCopro<0b1110, "mrc", 1,
+ (outs GPR:$Rt),
+ (ins p_imm:$cop, i32imm:$opc1, c_imm:$CRn, c_imm:$CRm, i32imm:$opc2),
+ []>;
+
+def t2MRC2 : t2MovRCopro<0b1111, "mrc2", 1,
+ (outs GPR:$Rt), (ins p_imm:$cop, i32imm:$opc1, c_imm:$CRn,
+ c_imm:$CRm, i32imm:$opc2), []>;
+
+def : T2v6Pat<(int_arm_mrc imm:$cop, imm:$opc1, imm:$CRn, imm:$CRm, imm:$opc2),
+ (t2MRC imm:$cop, imm:$opc1, imm:$CRn, imm:$CRm, imm:$opc2)>;
+
+def : T2v6Pat<(int_arm_mrc2 imm:$cop, imm:$opc1, imm:$CRn, imm:$CRm, imm:$opc2),
+ (t2MRC2 imm:$cop, imm:$opc1, imm:$CRn, imm:$CRm, imm:$opc2)>;
+
+
+/* from ARM core register to coprocessor */
+def t2MCRR : t2MovRRCopro<0b1110, "mcrr", 0,
+ [(int_arm_mcrr imm:$cop, imm:$opc1, GPR:$Rt, GPR:$Rt2,
+ imm:$CRm)]>;
+def t2MCRR2 : t2MovRRCopro<0b1111, "mcrr2", 0,
[(int_arm_mcrr2 imm:$cop, imm:$opc1, GPR:$Rt,
GPR:$Rt2, imm:$CRm)]>;
-def t2MRRC2 : t2MovRRCopro<"mrrc2",
- 1 /* from coprocessor to ARM core register */>;
+/* from coprocessor to ARM core register */
+def t2MRRC : t2MovRRCopro<0b1110, "mrrc", 1>;
+
+def t2MRRC2 : t2MovRRCopro<0b1111, "mrrc2", 1>;
//===----------------------------------------------------------------------===//
-// Other Coprocessor Instructions. For disassembly only.
+// Other Coprocessor Instructions.
//
-def t2CDP2 : T2Cop<(outs), (ins p_imm:$cop, i32imm:$opc1,
- c_imm:$CRd, c_imm:$CRn, c_imm:$CRm, i32imm:$opc2),
+def tCDP : T2Cop<0b1110, (outs), (ins p_imm:$cop, imm0_15:$opc1,
+ c_imm:$CRd, c_imm:$CRn, c_imm:$CRm, imm0_7:$opc2),
+ "cdp\t$cop, $opc1, $CRd, $CRn, $CRm, $opc2",
+ [(int_arm_cdp imm:$cop, imm:$opc1, imm:$CRd, imm:$CRn,
+ imm:$CRm, imm:$opc2)]> {
+ let Inst{27-24} = 0b1110;
+
+ bits<4> opc1;
+ bits<4> CRn;
+ bits<4> CRd;
+ bits<4> cop;
+ bits<3> opc2;
+ bits<4> CRm;
+
+ let Inst{3-0} = CRm;
+ let Inst{4} = 0;
+ let Inst{7-5} = opc2;
+ let Inst{11-8} = cop;
+ let Inst{15-12} = CRd;
+ let Inst{19-16} = CRn;
+ let Inst{23-20} = opc1;
+}
+
+def t2CDP2 : T2Cop<0b1111, (outs), (ins p_imm:$cop, imm0_15:$opc1,
+ c_imm:$CRd, c_imm:$CRn, c_imm:$CRm, imm0_7:$opc2),
"cdp2\t$cop, $opc1, $CRd, $CRn, $CRm, $opc2",
[(int_arm_cdp2 imm:$cop, imm:$opc1, imm:$CRd, imm:$CRn,
imm:$CRm, imm:$opc2)]> {
diff --git a/contrib/llvm/lib/Target/ARM/ARMInstrVFP.td b/contrib/llvm/lib/Target/ARM/ARMInstrVFP.td
index 376bd96..f1f3cb9 100644
--- a/contrib/llvm/lib/Target/ARM/ARMInstrVFP.td
+++ b/contrib/llvm/lib/Target/ARM/ARMInstrVFP.td
@@ -94,7 +94,8 @@ multiclass vfp_ldst_mult<string asm, bit L_bit,
let Inst{20} = L_bit;
}
def DIA_UPD :
- AXDI4<(outs GPR:$wb), (ins GPR:$Rn, pred:$p, dpr_reglist:$regs, variable_ops),
+ AXDI4<(outs GPR:$wb), (ins GPR:$Rn, pred:$p, dpr_reglist:$regs,
+ variable_ops),
IndexModeUpd, itin_upd,
!strconcat(asm, "ia${p}\t$Rn!, $regs"), "$Rn = $wb", []> {
let Inst{24-23} = 0b01; // Increment After
@@ -102,7 +103,8 @@ multiclass vfp_ldst_mult<string asm, bit L_bit,
let Inst{20} = L_bit;
}
def DDB_UPD :
- AXDI4<(outs GPR:$wb), (ins GPR:$Rn, pred:$p, dpr_reglist:$regs, variable_ops),
+ AXDI4<(outs GPR:$wb), (ins GPR:$Rn, pred:$p, dpr_reglist:$regs,
+ variable_ops),
IndexModeUpd, itin_upd,
!strconcat(asm, "db${p}\t$Rn!, $regs"), "$Rn = $wb", []> {
let Inst{24-23} = 0b10; // Decrement Before
@@ -124,7 +126,8 @@ multiclass vfp_ldst_mult<string asm, bit L_bit,
let D = VFPNeonDomain;
}
def SIA_UPD :
- AXSI4<(outs GPR:$wb), (ins GPR:$Rn, pred:$p, spr_reglist:$regs, variable_ops),
+ AXSI4<(outs GPR:$wb), (ins GPR:$Rn, pred:$p, spr_reglist:$regs,
+ variable_ops),
IndexModeUpd, itin_upd,
!strconcat(asm, "ia${p}\t$Rn!, $regs"), "$Rn = $wb", []> {
let Inst{24-23} = 0b01; // Increment After
@@ -136,7 +139,8 @@ multiclass vfp_ldst_mult<string asm, bit L_bit,
let D = VFPNeonDomain;
}
def SDB_UPD :
- AXSI4<(outs GPR:$wb), (ins GPR:$Rn, pred:$p, spr_reglist:$regs, variable_ops),
+ AXSI4<(outs GPR:$wb), (ins GPR:$Rn, pred:$p, spr_reglist:$regs,
+ variable_ops),
IndexModeUpd, itin_upd,
!strconcat(asm, "db${p}\t$Rn!, $regs"), "$Rn = $wb", []> {
let Inst{24-23} = 0b10; // Decrement Before
@@ -162,6 +166,15 @@ defm VSTM : vfp_ldst_mult<"vstm", 0, IIC_fpLoad_m, IIC_fpLoad_mu>;
def : MnemonicAlias<"vldm", "vldmia">;
def : MnemonicAlias<"vstm", "vstmia">;
+def : InstAlias<"vpush${p} $r", (VSTMDDB_UPD SP, pred:$p, dpr_reglist:$r)>,
+ Requires<[HasVFP2]>;
+def : InstAlias<"vpush${p} $r", (VSTMSDB_UPD SP, pred:$p, spr_reglist:$r)>,
+ Requires<[HasVFP2]>;
+def : InstAlias<"vpop${p} $r", (VLDMDIA_UPD SP, pred:$p, dpr_reglist:$r)>,
+ Requires<[HasVFP2]>;
+def : InstAlias<"vpop${p} $r", (VLDMSIA_UPD SP, pred:$p, spr_reglist:$r)>,
+ Requires<[HasVFP2]>;
+
// FLDMX, FSTMX - mixing S/D registers for pre-armv6 cores
//===----------------------------------------------------------------------===//
@@ -860,7 +873,7 @@ def VULTOD : AVConv1XI<0b11101, 0b11, 0b1011, 0b1011, 1,
} // End of 'let Constraints = "$a = $dst", isCodeGenOnly = 1 in'
//===----------------------------------------------------------------------===//
-// FP FMA Operations.
+// FP Multiply-Accumulate Operations.
//
def VMLAD : ADbI<0b11100, 0b00, 0, 0,
@@ -977,12 +990,12 @@ def : Pat<(fsub_mlx (fmul_su SPR:$a, SPR:$b), SPR:$dstin),
let neverHasSideEffects = 1 in {
def VMOVDcc : ARMPseudoInst<(outs DPR:$Dd), (ins DPR:$Dn, DPR:$Dm, pred:$p),
- Size4Bytes, IIC_fpUNA64,
+ 4, IIC_fpUNA64,
[/*(set DPR:$Dd, (ARMcmov DPR:$Dn, DPR:$Dm, imm:$cc))*/]>,
RegConstraint<"$Dn = $Dd">;
def VMOVScc : ARMPseudoInst<(outs SPR:$Sd), (ins SPR:$Sn, SPR:$Sm, pred:$p),
- Size4Bytes, IIC_fpUNA32,
+ 4, IIC_fpUNA32,
[/*(set SPR:$Sd, (ARMcmov SPR:$Sn, SPR:$Sm, imm:$cc))*/]>,
RegConstraint<"$Sn = $Sd">;
} // neverHasSideEffects
diff --git a/contrib/llvm/lib/Target/ARM/ARMLoadStoreOptimizer.cpp b/contrib/llvm/lib/Target/ARM/ARMLoadStoreOptimizer.cpp
index f4645f1..c6efea1 100644
--- a/contrib/llvm/lib/Target/ARM/ARMLoadStoreOptimizer.cpp
+++ b/contrib/llvm/lib/Target/ARM/ARMLoadStoreOptimizer.cpp
@@ -329,13 +329,9 @@ ARMLoadStoreOpt::MergeOps(MachineBasicBlock &MBB,
if (NewBase == 0)
return false;
}
- int BaseOpc = !isThumb2
- ? ARM::ADDri
- : ((Base == ARM::SP) ? ARM::t2ADDrSPi : ARM::t2ADDri);
+ int BaseOpc = !isThumb2 ? ARM::ADDri : ARM::t2ADDri;
if (Offset < 0) {
- BaseOpc = !isThumb2
- ? ARM::SUBri
- : ((Base == ARM::SP) ? ARM::t2SUBrSPi : ARM::t2SUBri);
+ BaseOpc = !isThumb2 ? ARM::SUBri : ARM::t2SUBri;
Offset = - Offset;
}
int ImmedOffset = isThumb2
@@ -516,8 +512,6 @@ static inline bool isMatchingDecrement(MachineInstr *MI, unsigned Base,
if (!MI)
return false;
if (MI->getOpcode() != ARM::t2SUBri &&
- MI->getOpcode() != ARM::t2SUBrSPi &&
- MI->getOpcode() != ARM::t2SUBrSPi12 &&
MI->getOpcode() != ARM::tSUBspi &&
MI->getOpcode() != ARM::SUBri)
return false;
@@ -541,8 +535,6 @@ static inline bool isMatchingIncrement(MachineInstr *MI, unsigned Base,
if (!MI)
return false;
if (MI->getOpcode() != ARM::t2ADDri &&
- MI->getOpcode() != ARM::t2ADDrSPi &&
- MI->getOpcode() != ARM::t2ADDrSPi12 &&
MI->getOpcode() != ARM::tADDspi &&
MI->getOpcode() != ARM::ADDri)
return false;
@@ -1461,19 +1453,19 @@ static bool IsSafeAndProfitableToMove(bool isLd, unsigned Base,
while (++I != E) {
if (I->isDebugValue() || MemOps.count(&*I))
continue;
- const TargetInstrDesc &TID = I->getDesc();
- if (TID.isCall() || TID.isTerminator() || I->hasUnmodeledSideEffects())
+ const MCInstrDesc &MCID = I->getDesc();
+ if (MCID.isCall() || MCID.isTerminator() || I->hasUnmodeledSideEffects())
return false;
- if (isLd && TID.mayStore())
+ if (isLd && MCID.mayStore())
return false;
if (!isLd) {
- if (TID.mayLoad())
+ if (MCID.mayLoad())
return false;
// It's not safe to move the first 'str' down.
// str r1, [r0]
// strh r5, [r0]
// str r4, [r0, #+4]
- if (TID.mayStore())
+ if (MCID.mayStore())
return false;
}
for (unsigned j = 0, NumOps = I->getNumOperands(); j != NumOps; ++j) {
@@ -1672,14 +1664,14 @@ bool ARMPreAllocLoadStoreOpt::RescheduleOps(MachineBasicBlock *MBB,
Ops.pop_back();
Ops.pop_back();
- const TargetInstrDesc &TID = TII->get(NewOpc);
- const TargetRegisterClass *TRC = TID.OpInfo[0].getRegClass(TRI);
+ const MCInstrDesc &MCID = TII->get(NewOpc);
+ const TargetRegisterClass *TRC = TII->getRegClass(MCID, 0, TRI);
MRI->constrainRegClass(EvenReg, TRC);
MRI->constrainRegClass(OddReg, TRC);
// Form the pair instruction.
if (isLd) {
- MachineInstrBuilder MIB = BuildMI(*MBB, InsertPos, dl, TID)
+ MachineInstrBuilder MIB = BuildMI(*MBB, InsertPos, dl, MCID)
.addReg(EvenReg, RegState::Define)
.addReg(OddReg, RegState::Define)
.addReg(BaseReg);
@@ -1691,7 +1683,7 @@ bool ARMPreAllocLoadStoreOpt::RescheduleOps(MachineBasicBlock *MBB,
MIB.addImm(Offset).addImm(Pred).addReg(PredReg);
++NumLDRDFormed;
} else {
- MachineInstrBuilder MIB = BuildMI(*MBB, InsertPos, dl, TID)
+ MachineInstrBuilder MIB = BuildMI(*MBB, InsertPos, dl, MCID)
.addReg(EvenReg)
.addReg(OddReg)
.addReg(BaseReg);
@@ -1742,8 +1734,8 @@ ARMPreAllocLoadStoreOpt::RescheduleLoadStoreInstrs(MachineBasicBlock *MBB) {
while (MBBI != E) {
for (; MBBI != E; ++MBBI) {
MachineInstr *MI = MBBI;
- const TargetInstrDesc &TID = MI->getDesc();
- if (TID.isCall() || TID.isTerminator()) {
+ const MCInstrDesc &MCID = MI->getDesc();
+ if (MCID.isCall() || MCID.isTerminator()) {
// Stop at barriers.
++MBBI;
break;
diff --git a/contrib/llvm/lib/Target/ARM/ARMMCCodeEmitter.cpp b/contrib/llvm/lib/Target/ARM/ARMMCCodeEmitter.cpp
index c5f727d..39be3f0 100644
--- a/contrib/llvm/lib/Target/ARM/ARMMCCodeEmitter.cpp
+++ b/contrib/llvm/lib/Target/ARM/ARMMCCodeEmitter.cpp
@@ -21,8 +21,11 @@
#include "llvm/MC/MCCodeEmitter.h"
#include "llvm/MC/MCExpr.h"
#include "llvm/MC/MCInst.h"
+#include "llvm/MC/MCInstrInfo.h"
+#include "llvm/MC/MCSubtargetInfo.h"
#include "llvm/ADT/Statistic.h"
#include "llvm/Support/raw_ostream.h"
+
using namespace llvm;
STATISTIC(MCNumEmitted, "Number of MC instructions emitted.");
@@ -32,19 +35,30 @@ namespace {
class ARMMCCodeEmitter : public MCCodeEmitter {
ARMMCCodeEmitter(const ARMMCCodeEmitter &); // DO NOT IMPLEMENT
void operator=(const ARMMCCodeEmitter &); // DO NOT IMPLEMENT
- const TargetMachine &TM;
- const TargetInstrInfo &TII;
- const ARMSubtarget *Subtarget;
- MCContext &Ctx;
+ const MCInstrInfo &MCII;
+ const MCSubtargetInfo &STI;
public:
- ARMMCCodeEmitter(TargetMachine &tm, MCContext &ctx)
- : TM(tm), TII(*TM.getInstrInfo()),
- Subtarget(&TM.getSubtarget<ARMSubtarget>()), Ctx(ctx) {
+ ARMMCCodeEmitter(const MCInstrInfo &mcii, const MCSubtargetInfo &sti,
+ MCContext &ctx)
+ : MCII(mcii), STI(sti) {
}
~ARMMCCodeEmitter() {}
+ bool isThumb() const {
+ // FIXME: Can tablegen auto-generate this?
+ return (STI.getFeatureBits() & ARM::ModeThumb) != 0;
+ }
+ bool isThumb2() const {
+ return isThumb() && (STI.getFeatureBits() & ARM::FeatureThumb2) != 0;
+ }
+ bool isTargetDarwin() const {
+ Triple TT(STI.getTargetTriple());
+ Triple::OSType OS = TT.getOS();
+ return OS == Triple::Darwin || OS == Triple::MacOSX || OS == Triple::IOS;
+ }
+
unsigned getMachineSoImmOpValue(unsigned SoImm) const;
// getBinaryCodeForInstr - TableGen'erated function for getting the
@@ -320,9 +334,10 @@ public:
} // end anonymous namespace
-MCCodeEmitter *llvm::createARMMCCodeEmitter(const Target &, TargetMachine &TM,
+MCCodeEmitter *llvm::createARMMCCodeEmitter(const MCInstrInfo &MCII,
+ const MCSubtargetInfo &STI,
MCContext &Ctx) {
- return new ARMMCCodeEmitter(TM, Ctx);
+ return new ARMMCCodeEmitter(MCII, STI, Ctx);
}
/// NEONThumb2DataIPostEncoder - Post-process encoded NEON data-processing
@@ -330,7 +345,7 @@ MCCodeEmitter *llvm::createARMMCCodeEmitter(const Target &, TargetMachine &TM,
/// Thumb2 mode.
unsigned ARMMCCodeEmitter::NEONThumb2DataIPostEncoder(const MCInst &MI,
unsigned EncodedValue) const {
- if (Subtarget->isThumb2()) {
+ if (isThumb2()) {
// NEON Thumb2 data-processsing encodings are very simple: bit 24 is moved
// to bit 12 of the high half-word (i.e. bit 28), and bits 27-24 are
// set to 1111.
@@ -349,7 +364,7 @@ unsigned ARMMCCodeEmitter::NEONThumb2DataIPostEncoder(const MCInst &MI,
/// Thumb2 mode.
unsigned ARMMCCodeEmitter::NEONThumb2LoadStorePostEncoder(const MCInst &MI,
unsigned EncodedValue) const {
- if (Subtarget->isThumb2()) {
+ if (isThumb2()) {
EncodedValue &= 0xF0FFFFFF;
EncodedValue |= 0x09000000;
}
@@ -362,7 +377,7 @@ unsigned ARMMCCodeEmitter::NEONThumb2LoadStorePostEncoder(const MCInst &MI,
/// Thumb2 mode.
unsigned ARMMCCodeEmitter::NEONThumb2DupPostEncoder(const MCInst &MI,
unsigned EncodedValue) const {
- if (Subtarget->isThumb2()) {
+ if (isThumb2()) {
EncodedValue &= 0x00FFFFFF;
EncodedValue |= 0xEE000000;
}
@@ -374,7 +389,7 @@ unsigned ARMMCCodeEmitter::NEONThumb2DupPostEncoder(const MCInst &MI,
/// them to their Thumb2 form if we are currently in Thumb2 mode.
unsigned ARMMCCodeEmitter::
VFPThumb2PostEncoder(const MCInst &MI, unsigned EncodedValue) const {
- if (Subtarget->isThumb2()) {
+ if (isThumb2()) {
EncodedValue &= 0x0FFFFFFF;
EncodedValue |= 0xE0000000;
}
@@ -515,7 +530,7 @@ getBranchTargetOpValue(const MCInst &MI, unsigned OpIdx,
SmallVectorImpl<MCFixup> &Fixups) const {
// FIXME: This really, really shouldn't use TargetMachine. We don't want
// coupling between MC and TM anywhere we can help it.
- if (Subtarget->isThumb2())
+ if (isThumb2())
return
::getBranchTargetOpValue(MI, OpIdx, ARM::fixup_t2_condbranch, Fixups);
return getARMBranchTargetOpValue(MI, OpIdx, Fixups);
@@ -624,7 +639,7 @@ getAddrModeImm12OpValue(const MCInst &MI, unsigned OpIdx,
const MCExpr *Expr = MO.getExpr();
MCFixupKind Kind;
- if (Subtarget->isThumb2())
+ if (isThumb2())
Kind = MCFixupKind(ARM::fixup_t2_ldst_pcrel_12);
else
Kind = MCFixupKind(ARM::fixup_arm_ldst_pcrel_12);
@@ -709,22 +724,22 @@ ARMMCCodeEmitter::getHiLo16ImmOpValue(const MCInst &MI, unsigned OpIdx,
switch (ARM16Expr->getKind()) {
default: assert(0 && "Unsupported ARMFixup");
case ARMMCExpr::VK_ARM_HI16:
- if (!Subtarget->isTargetDarwin() && EvaluateAsPCRel(E))
- Kind = MCFixupKind(Subtarget->isThumb2()
+ if (!isTargetDarwin() && EvaluateAsPCRel(E))
+ Kind = MCFixupKind(isThumb2()
? ARM::fixup_t2_movt_hi16_pcrel
: ARM::fixup_arm_movt_hi16_pcrel);
else
- Kind = MCFixupKind(Subtarget->isThumb2()
+ Kind = MCFixupKind(isThumb2()
? ARM::fixup_t2_movt_hi16
: ARM::fixup_arm_movt_hi16);
break;
case ARMMCExpr::VK_ARM_LO16:
- if (!Subtarget->isTargetDarwin() && EvaluateAsPCRel(E))
- Kind = MCFixupKind(Subtarget->isThumb2()
+ if (!isTargetDarwin() && EvaluateAsPCRel(E))
+ Kind = MCFixupKind(isThumb2()
? ARM::fixup_t2_movw_lo16_pcrel
: ARM::fixup_arm_movw_lo16_pcrel);
else
- Kind = MCFixupKind(Subtarget->isThumb2()
+ Kind = MCFixupKind(isThumb2()
? ARM::fixup_t2_movw_lo16
: ARM::fixup_arm_movw_lo16);
break;
@@ -898,7 +913,7 @@ getAddrMode5OpValue(const MCInst &MI, unsigned OpIdx,
assert(MO.isExpr() && "Unexpected machine operand type!");
const MCExpr *Expr = MO.getExpr();
MCFixupKind Kind;
- if (Subtarget->isThumb2())
+ if (isThumb2())
Kind = MCFixupKind(ARM::fixup_t2_pcrel_10);
else
Kind = MCFixupKind(ARM::fixup_arm_pcrel_10);
@@ -1274,21 +1289,21 @@ void ARMMCCodeEmitter::
EncodeInstruction(const MCInst &MI, raw_ostream &OS,
SmallVectorImpl<MCFixup> &Fixups) const {
// Pseudo instructions don't get encoded.
- const TargetInstrDesc &Desc = TII.get(MI.getOpcode());
+ const MCInstrDesc &Desc = MCII.get(MI.getOpcode());
uint64_t TSFlags = Desc.TSFlags;
if ((TSFlags & ARMII::FormMask) == ARMII::Pseudo)
return;
+
int Size;
- // Basic size info comes from the TSFlags field.
- switch ((TSFlags & ARMII::SizeMask) >> ARMII::SizeShift) {
- default: llvm_unreachable("Unexpected instruction size!");
- case ARMII::Size2Bytes: Size = 2; break;
- case ARMII::Size4Bytes: Size = 4; break;
- }
+ if (Desc.getSize() == 2 || Desc.getSize() == 4)
+ Size = Desc.getSize();
+ else
+ llvm_unreachable("Unexpected instruction size!");
+
uint32_t Binary = getBinaryCodeForInstr(MI, Fixups);
// Thumb 32-bit wide instructions need to emit the high order halfword
// first.
- if (Subtarget->isThumb() && Size == 4) {
+ if (isThumb() && Size == 4) {
EmitConstant(Binary >> 16, 2, OS);
EmitConstant(Binary & 0xffff, 2, OS);
} else
diff --git a/contrib/llvm/lib/Target/ARM/ARMMCInstLower.cpp b/contrib/llvm/lib/Target/ARM/ARMMCInstLower.cpp
index 59d6050..7411b59 100644
--- a/contrib/llvm/lib/Target/ARM/ARMMCInstLower.cpp
+++ b/contrib/llvm/lib/Target/ARM/ARMMCInstLower.cpp
@@ -23,43 +23,94 @@
using namespace llvm;
-static MCOperand GetSymbolRef(const MachineOperand &MO, const MCSymbol *Symbol,
- ARMAsmPrinter &Printer) {
- MCContext &Ctx = Printer.OutContext;
+MCOperand ARMAsmPrinter::GetSymbolRef(const MachineOperand &MO,
+ const MCSymbol *Symbol) {
const MCExpr *Expr;
switch (MO.getTargetFlags()) {
default: {
- Expr = MCSymbolRefExpr::Create(Symbol, MCSymbolRefExpr::VK_None, Ctx);
+ Expr = MCSymbolRefExpr::Create(Symbol, MCSymbolRefExpr::VK_None,
+ OutContext);
switch (MO.getTargetFlags()) {
default:
assert(0 && "Unknown target flag on symbol operand");
case 0:
break;
case ARMII::MO_LO16:
- Expr = MCSymbolRefExpr::Create(Symbol, MCSymbolRefExpr::VK_None, Ctx);
- Expr = ARMMCExpr::CreateLower16(Expr, Ctx);
+ Expr = MCSymbolRefExpr::Create(Symbol, MCSymbolRefExpr::VK_None,
+ OutContext);
+ Expr = ARMMCExpr::CreateLower16(Expr, OutContext);
break;
case ARMII::MO_HI16:
- Expr = MCSymbolRefExpr::Create(Symbol, MCSymbolRefExpr::VK_None, Ctx);
- Expr = ARMMCExpr::CreateUpper16(Expr, Ctx);
+ Expr = MCSymbolRefExpr::Create(Symbol, MCSymbolRefExpr::VK_None,
+ OutContext);
+ Expr = ARMMCExpr::CreateUpper16(Expr, OutContext);
break;
}
break;
}
case ARMII::MO_PLT:
- Expr = MCSymbolRefExpr::Create(Symbol, MCSymbolRefExpr::VK_ARM_PLT, Ctx);
+ Expr = MCSymbolRefExpr::Create(Symbol, MCSymbolRefExpr::VK_ARM_PLT,
+ OutContext);
break;
}
if (!MO.isJTI() && MO.getOffset())
Expr = MCBinaryExpr::CreateAdd(Expr,
- MCConstantExpr::Create(MO.getOffset(), Ctx),
- Ctx);
+ MCConstantExpr::Create(MO.getOffset(),
+ OutContext),
+ OutContext);
return MCOperand::CreateExpr(Expr);
}
+bool ARMAsmPrinter::lowerOperand(const MachineOperand &MO,
+ MCOperand &MCOp) {
+ switch (MO.getType()) {
+ default:
+ assert(0 && "unknown operand type");
+ return false;
+ case MachineOperand::MO_Register:
+ // Ignore all non-CPSR implicit register operands.
+ if (MO.isImplicit() && MO.getReg() != ARM::CPSR)
+ return false;
+ assert(!MO.getSubReg() && "Subregs should be eliminated!");
+ MCOp = MCOperand::CreateReg(MO.getReg());
+ break;
+ case MachineOperand::MO_Immediate:
+ MCOp = MCOperand::CreateImm(MO.getImm());
+ break;
+ case MachineOperand::MO_MachineBasicBlock:
+ MCOp = MCOperand::CreateExpr(MCSymbolRefExpr::Create(
+ MO.getMBB()->getSymbol(), OutContext));
+ break;
+ case MachineOperand::MO_GlobalAddress:
+ MCOp = GetSymbolRef(MO, Mang->getSymbol(MO.getGlobal()));
+ break;
+ case MachineOperand::MO_ExternalSymbol:
+ MCOp = GetSymbolRef(MO,
+ GetExternalSymbolSymbol(MO.getSymbolName()));
+ break;
+ case MachineOperand::MO_JumpTableIndex:
+ MCOp = GetSymbolRef(MO, GetJTISymbol(MO.getIndex()));
+ break;
+ case MachineOperand::MO_ConstantPoolIndex:
+ MCOp = GetSymbolRef(MO, GetCPISymbol(MO.getIndex()));
+ break;
+ case MachineOperand::MO_BlockAddress:
+ MCOp = GetSymbolRef(MO, GetBlockAddressSymbol(MO.getBlockAddress()));
+ break;
+ case MachineOperand::MO_FPImmediate: {
+ APFloat Val = MO.getFPImm()->getValueAPF();
+ bool ignored;
+ Val.convert(APFloat::IEEEdouble, APFloat::rmTowardZero, &ignored);
+ MCOp = MCOperand::CreateFPImm(Val.convertToDouble());
+ break;
+ }
+ }
+ return true;
+}
+
void llvm::LowerARMMachineInstrToMCInst(const MachineInstr *MI, MCInst &OutMI,
ARMAsmPrinter &AP) {
OutMI.setOpcode(MI->getOpcode());
@@ -68,48 +119,7 @@ void llvm::LowerARMMachineInstrToMCInst(const MachineInstr *MI, MCInst &OutMI,
const MachineOperand &MO = MI->getOperand(i);
MCOperand MCOp;
- switch (MO.getType()) {
- default:
- MI->dump();
- assert(0 && "unknown operand type");
- case MachineOperand::MO_Register:
- // Ignore all non-CPSR implicit register operands.
- if (MO.isImplicit() && MO.getReg() != ARM::CPSR) continue;
- assert(!MO.getSubReg() && "Subregs should be eliminated!");
- MCOp = MCOperand::CreateReg(MO.getReg());
- break;
- case MachineOperand::MO_Immediate:
- MCOp = MCOperand::CreateImm(MO.getImm());
- break;
- case MachineOperand::MO_MachineBasicBlock:
- MCOp = MCOperand::CreateExpr(MCSymbolRefExpr::Create(
- MO.getMBB()->getSymbol(), AP.OutContext));
- break;
- case MachineOperand::MO_GlobalAddress:
- MCOp = GetSymbolRef(MO, AP.Mang->getSymbol(MO.getGlobal()), AP);
- break;
- case MachineOperand::MO_ExternalSymbol:
- MCOp = GetSymbolRef(MO,
- AP.GetExternalSymbolSymbol(MO.getSymbolName()), AP);
- break;
- case MachineOperand::MO_JumpTableIndex:
- MCOp = GetSymbolRef(MO, AP.GetJTISymbol(MO.getIndex()), AP);
- break;
- case MachineOperand::MO_ConstantPoolIndex:
- MCOp = GetSymbolRef(MO, AP.GetCPISymbol(MO.getIndex()), AP);
- break;
- case MachineOperand::MO_BlockAddress:
- MCOp = GetSymbolRef(MO,AP.GetBlockAddressSymbol(MO.getBlockAddress()),AP);
- break;
- case MachineOperand::MO_FPImmediate: {
- APFloat Val = MO.getFPImm()->getValueAPF();
- bool ignored;
- Val.convert(APFloat::IEEEdouble, APFloat::rmTowardZero, &ignored);
- MCOp = MCOperand::CreateFPImm(Val.convertToDouble());
- break;
- }
- }
-
- OutMI.addOperand(MCOp);
+ if (AP.lowerOperand(MO, MCOp))
+ OutMI.addOperand(MCOp);
}
}
diff --git a/contrib/llvm/lib/Target/ARM/ARMMachObjectWriter.cpp b/contrib/llvm/lib/Target/ARM/ARMMachObjectWriter.cpp
new file mode 100644
index 0000000..a36e47d
--- /dev/null
+++ b/contrib/llvm/lib/Target/ARM/ARMMachObjectWriter.cpp
@@ -0,0 +1,389 @@
+//===-- ARMMachObjectWriter.cpp - ARM Mach Object Writer ------------------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+#include "ARM.h"
+#include "ARMFixupKinds.h"
+#include "llvm/ADT/Twine.h"
+#include "llvm/MC/MCAssembler.h"
+#include "llvm/MC/MCAsmLayout.h"
+#include "llvm/MC/MCMachObjectWriter.h"
+#include "llvm/MC/MCExpr.h"
+#include "llvm/MC/MCFixup.h"
+#include "llvm/MC/MCFixupKindInfo.h"
+#include "llvm/MC/MCValue.h"
+#include "llvm/Object/MachOFormat.h"
+#include "llvm/Support/ErrorHandling.h"
+#include "llvm/Target/TargetAsmBackend.h"
+using namespace llvm;
+using namespace llvm::object;
+
+namespace {
+class ARMMachObjectWriter : public MCMachObjectTargetWriter {
+ void RecordARMScatteredRelocation(MachObjectWriter *Writer,
+ const MCAssembler &Asm,
+ const MCAsmLayout &Layout,
+ const MCFragment *Fragment,
+ const MCFixup &Fixup,
+ MCValue Target,
+ unsigned Log2Size,
+ uint64_t &FixedValue);
+ void RecordARMMovwMovtRelocation(MachObjectWriter *Writer,
+ const MCAssembler &Asm,
+ const MCAsmLayout &Layout,
+ const MCFragment *Fragment,
+ const MCFixup &Fixup, MCValue Target,
+ uint64_t &FixedValue);
+
+public:
+ ARMMachObjectWriter(bool Is64Bit, uint32_t CPUType,
+ uint32_t CPUSubtype)
+ : MCMachObjectTargetWriter(Is64Bit, CPUType, CPUSubtype,
+ /*UseAggressiveSymbolFolding=*/true) {}
+
+ void RecordRelocation(MachObjectWriter *Writer,
+ const MCAssembler &Asm, const MCAsmLayout &Layout,
+ const MCFragment *Fragment, const MCFixup &Fixup,
+ MCValue Target, uint64_t &FixedValue);
+};
+}
+
+static bool getARMFixupKindMachOInfo(unsigned Kind, unsigned &RelocType,
+ unsigned &Log2Size) {
+ RelocType = unsigned(macho::RIT_Vanilla);
+ Log2Size = ~0U;
+
+ switch (Kind) {
+ default:
+ return false;
+
+ case FK_Data_1:
+ Log2Size = llvm::Log2_32(1);
+ return true;
+ case FK_Data_2:
+ Log2Size = llvm::Log2_32(2);
+ return true;
+ case FK_Data_4:
+ Log2Size = llvm::Log2_32(4);
+ return true;
+ case FK_Data_8:
+ Log2Size = llvm::Log2_32(8);
+ return true;
+
+ // Handle 24-bit branch kinds.
+ case ARM::fixup_arm_ldst_pcrel_12:
+ case ARM::fixup_arm_pcrel_10:
+ case ARM::fixup_arm_adr_pcrel_12:
+ case ARM::fixup_arm_condbranch:
+ case ARM::fixup_arm_uncondbranch:
+ RelocType = unsigned(macho::RIT_ARM_Branch24Bit);
+ // Report as 'long', even though that is not quite accurate.
+ Log2Size = llvm::Log2_32(4);
+ return true;
+
+ // Handle Thumb branches.
+ case ARM::fixup_arm_thumb_br:
+ RelocType = unsigned(macho::RIT_ARM_ThumbBranch22Bit);
+ Log2Size = llvm::Log2_32(2);
+ return true;
+
+ case ARM::fixup_t2_uncondbranch:
+ case ARM::fixup_arm_thumb_bl:
+ case ARM::fixup_arm_thumb_blx:
+ RelocType = unsigned(macho::RIT_ARM_ThumbBranch22Bit);
+ Log2Size = llvm::Log2_32(4);
+ return true;
+
+ case ARM::fixup_arm_movt_hi16:
+ case ARM::fixup_arm_movt_hi16_pcrel:
+ case ARM::fixup_t2_movt_hi16:
+ case ARM::fixup_t2_movt_hi16_pcrel:
+ RelocType = unsigned(macho::RIT_ARM_HalfDifference);
+ // Report as 'long', even though that is not quite accurate.
+ Log2Size = llvm::Log2_32(4);
+ return true;
+
+ case ARM::fixup_arm_movw_lo16:
+ case ARM::fixup_arm_movw_lo16_pcrel:
+ case ARM::fixup_t2_movw_lo16:
+ case ARM::fixup_t2_movw_lo16_pcrel:
+ RelocType = unsigned(macho::RIT_ARM_Half);
+ // Report as 'long', even though that is not quite accurate.
+ Log2Size = llvm::Log2_32(4);
+ return true;
+ }
+}
+
+void ARMMachObjectWriter::
+RecordARMMovwMovtRelocation(MachObjectWriter *Writer,
+ const MCAssembler &Asm,
+ const MCAsmLayout &Layout,
+ const MCFragment *Fragment,
+ const MCFixup &Fixup,
+ MCValue Target,
+ uint64_t &FixedValue) {
+ uint32_t FixupOffset = Layout.getFragmentOffset(Fragment)+Fixup.getOffset();
+ unsigned IsPCRel = Writer->isFixupKindPCRel(Asm, Fixup.getKind());
+ unsigned Type = macho::RIT_ARM_Half;
+
+ // See <reloc.h>.
+ const MCSymbol *A = &Target.getSymA()->getSymbol();
+ MCSymbolData *A_SD = &Asm.getSymbolData(*A);
+
+ if (!A_SD->getFragment())
+ report_fatal_error("symbol '" + A->getName() +
+ "' can not be undefined in a subtraction expression");
+
+ uint32_t Value = Writer->getSymbolAddress(A_SD, Layout);
+ uint32_t Value2 = 0;
+ uint64_t SecAddr =
+ Writer->getSectionAddress(A_SD->getFragment()->getParent());
+ FixedValue += SecAddr;
+
+ if (const MCSymbolRefExpr *B = Target.getSymB()) {
+ MCSymbolData *B_SD = &Asm.getSymbolData(B->getSymbol());
+
+ if (!B_SD->getFragment())
+ report_fatal_error("symbol '" + B->getSymbol().getName() +
+ "' can not be undefined in a subtraction expression");
+
+ // Select the appropriate difference relocation type.
+ Type = macho::RIT_ARM_HalfDifference;
+ Value2 = Writer->getSymbolAddress(B_SD, Layout);
+ FixedValue -= Writer->getSectionAddress(B_SD->getFragment()->getParent());
+ }
+
+ // Relocations are written out in reverse order, so the PAIR comes first.
+ // ARM_RELOC_HALF and ARM_RELOC_HALF_SECTDIFF abuse the r_length field:
+ //
+ // For these two r_type relocations they always have a pair following them and
+ // the r_length bits are used differently. The encoding of the r_length is as
+ // follows:
+ // low bit of r_length:
+ // 0 - :lower16: for movw instructions
+ // 1 - :upper16: for movt instructions
+ // high bit of r_length:
+ // 0 - arm instructions
+ // 1 - thumb instructions
+ // the other half of the relocated expression is in the following pair
+ // relocation entry in the the low 16 bits of r_address field.
+ unsigned ThumbBit = 0;
+ unsigned MovtBit = 0;
+ switch ((unsigned)Fixup.getKind()) {
+ default: break;
+ case ARM::fixup_arm_movt_hi16:
+ case ARM::fixup_arm_movt_hi16_pcrel:
+ MovtBit = 1;
+ break;
+ case ARM::fixup_t2_movt_hi16:
+ case ARM::fixup_t2_movt_hi16_pcrel:
+ MovtBit = 1;
+ // Fallthrough
+ case ARM::fixup_t2_movw_lo16:
+ case ARM::fixup_t2_movw_lo16_pcrel:
+ ThumbBit = 1;
+ break;
+ }
+
+
+ if (Type == macho::RIT_ARM_HalfDifference) {
+ uint32_t OtherHalf = MovtBit
+ ? (FixedValue & 0xffff) : ((FixedValue & 0xffff0000) >> 16);
+
+ macho::RelocationEntry MRE;
+ MRE.Word0 = ((OtherHalf << 0) |
+ (macho::RIT_Pair << 24) |
+ (MovtBit << 28) |
+ (ThumbBit << 29) |
+ (IsPCRel << 30) |
+ macho::RF_Scattered);
+ MRE.Word1 = Value2;
+ Writer->addRelocation(Fragment->getParent(), MRE);
+ }
+
+ macho::RelocationEntry MRE;
+ MRE.Word0 = ((FixupOffset << 0) |
+ (Type << 24) |
+ (MovtBit << 28) |
+ (ThumbBit << 29) |
+ (IsPCRel << 30) |
+ macho::RF_Scattered);
+ MRE.Word1 = Value;
+ Writer->addRelocation(Fragment->getParent(), MRE);
+}
+
+void ARMMachObjectWriter::RecordARMScatteredRelocation(MachObjectWriter *Writer,
+ const MCAssembler &Asm,
+ const MCAsmLayout &Layout,
+ const MCFragment *Fragment,
+ const MCFixup &Fixup,
+ MCValue Target,
+ unsigned Log2Size,
+ uint64_t &FixedValue) {
+ uint32_t FixupOffset = Layout.getFragmentOffset(Fragment)+Fixup.getOffset();
+ unsigned IsPCRel = Writer->isFixupKindPCRel(Asm, Fixup.getKind());
+ unsigned Type = macho::RIT_Vanilla;
+
+ // See <reloc.h>.
+ const MCSymbol *A = &Target.getSymA()->getSymbol();
+ MCSymbolData *A_SD = &Asm.getSymbolData(*A);
+
+ if (!A_SD->getFragment())
+ report_fatal_error("symbol '" + A->getName() +
+ "' can not be undefined in a subtraction expression");
+
+ uint32_t Value = Writer->getSymbolAddress(A_SD, Layout);
+ uint64_t SecAddr = Writer->getSectionAddress(A_SD->getFragment()->getParent());
+ FixedValue += SecAddr;
+ uint32_t Value2 = 0;
+
+ if (const MCSymbolRefExpr *B = Target.getSymB()) {
+ MCSymbolData *B_SD = &Asm.getSymbolData(B->getSymbol());
+
+ if (!B_SD->getFragment())
+ report_fatal_error("symbol '" + B->getSymbol().getName() +
+ "' can not be undefined in a subtraction expression");
+
+ // Select the appropriate difference relocation type.
+ Type = macho::RIT_Difference;
+ Value2 = Writer->getSymbolAddress(B_SD, Layout);
+ FixedValue -= Writer->getSectionAddress(B_SD->getFragment()->getParent());
+ }
+
+ // Relocations are written out in reverse order, so the PAIR comes first.
+ if (Type == macho::RIT_Difference ||
+ Type == macho::RIT_Generic_LocalDifference) {
+ macho::RelocationEntry MRE;
+ MRE.Word0 = ((0 << 0) |
+ (macho::RIT_Pair << 24) |
+ (Log2Size << 28) |
+ (IsPCRel << 30) |
+ macho::RF_Scattered);
+ MRE.Word1 = Value2;
+ Writer->addRelocation(Fragment->getParent(), MRE);
+ }
+
+ macho::RelocationEntry MRE;
+ MRE.Word0 = ((FixupOffset << 0) |
+ (Type << 24) |
+ (Log2Size << 28) |
+ (IsPCRel << 30) |
+ macho::RF_Scattered);
+ MRE.Word1 = Value;
+ Writer->addRelocation(Fragment->getParent(), MRE);
+}
+
+void ARMMachObjectWriter::RecordRelocation(MachObjectWriter *Writer,
+ const MCAssembler &Asm,
+ const MCAsmLayout &Layout,
+ const MCFragment *Fragment,
+ const MCFixup &Fixup,
+ MCValue Target,
+ uint64_t &FixedValue) {
+ unsigned IsPCRel = Writer->isFixupKindPCRel(Asm, Fixup.getKind());
+ unsigned Log2Size;
+ unsigned RelocType = macho::RIT_Vanilla;
+ if (!getARMFixupKindMachOInfo(Fixup.getKind(), RelocType, Log2Size)) {
+ report_fatal_error("unknown ARM fixup kind!");
+ return;
+ }
+
+ // If this is a difference or a defined symbol plus an offset, then we need a
+ // scattered relocation entry. Differences always require scattered
+ // relocations.
+ if (Target.getSymB()) {
+ if (RelocType == macho::RIT_ARM_Half ||
+ RelocType == macho::RIT_ARM_HalfDifference)
+ return RecordARMMovwMovtRelocation(Writer, Asm, Layout, Fragment, Fixup,
+ Target, FixedValue);
+ return RecordARMScatteredRelocation(Writer, Asm, Layout, Fragment, Fixup,
+ Target, Log2Size, FixedValue);
+ }
+
+ // Get the symbol data, if any.
+ MCSymbolData *SD = 0;
+ if (Target.getSymA())
+ SD = &Asm.getSymbolData(Target.getSymA()->getSymbol());
+
+ // FIXME: For other platforms, we need to use scattered relocations for
+ // internal relocations with offsets. If this is an internal relocation with
+ // an offset, it also needs a scattered relocation entry.
+ //
+ // Is this right for ARM?
+ uint32_t Offset = Target.getConstant();
+ if (IsPCRel && RelocType == macho::RIT_Vanilla)
+ Offset += 1 << Log2Size;
+ if (Offset && SD && !Writer->doesSymbolRequireExternRelocation(SD))
+ return RecordARMScatteredRelocation(Writer, Asm, Layout, Fragment, Fixup,
+ Target, Log2Size, FixedValue);
+
+ // See <reloc.h>.
+ uint32_t FixupOffset = Layout.getFragmentOffset(Fragment)+Fixup.getOffset();
+ unsigned Index = 0;
+ unsigned IsExtern = 0;
+ unsigned Type = 0;
+
+ if (Target.isAbsolute()) { // constant
+ // FIXME!
+ report_fatal_error("FIXME: relocations to absolute targets "
+ "not yet implemented");
+ } else {
+ // Resolve constant variables.
+ if (SD->getSymbol().isVariable()) {
+ int64_t Res;
+ if (SD->getSymbol().getVariableValue()->EvaluateAsAbsolute(
+ Res, Layout, Writer->getSectionAddressMap())) {
+ FixedValue = Res;
+ return;
+ }
+ }
+
+ // Check whether we need an external or internal relocation.
+ if (Writer->doesSymbolRequireExternRelocation(SD)) {
+ IsExtern = 1;
+ Index = SD->getIndex();
+
+ // For external relocations, make sure to offset the fixup value to
+ // compensate for the addend of the symbol address, if it was
+ // undefined. This occurs with weak definitions, for example.
+ if (!SD->Symbol->isUndefined())
+ FixedValue -= Layout.getSymbolOffset(SD);
+ } else {
+ // The index is the section ordinal (1-based).
+ const MCSectionData &SymSD = Asm.getSectionData(
+ SD->getSymbol().getSection());
+ Index = SymSD.getOrdinal() + 1;
+ FixedValue += Writer->getSectionAddress(&SymSD);
+ }
+ if (IsPCRel)
+ FixedValue -= Writer->getSectionAddress(Fragment->getParent());
+
+ // The type is determined by the fixup kind.
+ Type = RelocType;
+ }
+
+ // struct relocation_info (8 bytes)
+ macho::RelocationEntry MRE;
+ MRE.Word0 = FixupOffset;
+ MRE.Word1 = ((Index << 0) |
+ (IsPCRel << 24) |
+ (Log2Size << 25) |
+ (IsExtern << 27) |
+ (Type << 28));
+ Writer->addRelocation(Fragment->getParent(), MRE);
+}
+
+MCObjectWriter *llvm::createARMMachObjectWriter(raw_ostream &OS,
+ bool Is64Bit,
+ uint32_t CPUType,
+ uint32_t CPUSubtype) {
+ return createMachObjectWriter(new ARMMachObjectWriter(Is64Bit,
+ CPUType,
+ CPUSubtype),
+ OS, /*IsLittleEndian=*/true);
+}
diff --git a/contrib/llvm/lib/Target/ARM/ARMRegisterInfo.td b/contrib/llvm/lib/Target/ARM/ARMRegisterInfo.td
index 99418733..76eb496 100644
--- a/contrib/llvm/lib/Target/ARM/ARMRegisterInfo.td
+++ b/contrib/llvm/lib/Target/ARM/ARMRegisterInfo.td
@@ -200,45 +200,16 @@ def FPEXC : ARMReg<8, "fpexc">;
// r11 == Frame Pointer (arm-style backtraces)
// r10 == Stack Limit
//
-def GPR : RegisterClass<"ARM", [i32], 32, [R0, R1, R2, R3, R4, R5, R6,
- R7, R8, R9, R10, R11, R12,
- SP, LR, PC]> {
- let MethodProtos = [{
- iterator allocation_order_begin(const MachineFunction &MF) const;
- iterator allocation_order_end(const MachineFunction &MF) const;
- }];
- let MethodBodies = [{
- static const unsigned ARM_GPR_AO[] = {
- ARM::R0, ARM::R1, ARM::R2, ARM::R3,
- ARM::R12,ARM::LR,
- ARM::R4, ARM::R5, ARM::R6, ARM::R7,
- ARM::R8, ARM::R9, ARM::R10, ARM::R11 };
-
- // For Thumb1 mode, we don't want to allocate hi regs at all, as we
- // don't know how to spill them. If we make our prologue/epilogue code
- // smarter at some point, we can go back to using the above allocation
- // orders for the Thumb1 instructions that know how to use hi regs.
- static const unsigned THUMB_GPR_AO[] = {
- ARM::R0, ARM::R1, ARM::R2, ARM::R3,
- ARM::R4, ARM::R5, ARM::R6, ARM::R7 };
-
- GPRClass::iterator
- GPRClass::allocation_order_begin(const MachineFunction &MF) const {
- const TargetMachine &TM = MF.getTarget();
- const ARMSubtarget &Subtarget = TM.getSubtarget<ARMSubtarget>();
- if (Subtarget.isThumb1Only())
- return THUMB_GPR_AO;
- return ARM_GPR_AO;
- }
-
- GPRClass::iterator
- GPRClass::allocation_order_end(const MachineFunction &MF) const {
- const TargetMachine &TM = MF.getTarget();
- const ARMSubtarget &Subtarget = TM.getSubtarget<ARMSubtarget>();
- if (Subtarget.isThumb1Only())
- return THUMB_GPR_AO + (sizeof(THUMB_GPR_AO)/sizeof(unsigned));
- return ARM_GPR_AO + (sizeof(ARM_GPR_AO)/sizeof(unsigned));
- }
+def GPR : RegisterClass<"ARM", [i32], 32, (add (sequence "R%u", 0, 12),
+ SP, LR, PC)> {
+ // Allocate LR as the first CSR since it is always saved anyway.
+ // For Thumb1 mode, we don't want to allocate hi regs at all, as we don't
+ // know how to spill them. If we make our prologue/epilogue code smarter at
+ // some point, we can go back to using the above allocation orders for the
+ // Thumb1 instructions that know how to use hi regs.
+ let AltOrders = [(add LR, GPR), (trunc GPR, 8)];
+ let AltOrderSelect = [{
+ return 1 + MF.getTarget().getSubtarget<ARMSubtarget>().isThumb1Only();
}];
}
@@ -246,263 +217,98 @@ def GPR : RegisterClass<"ARM", [i32], 32, [R0, R1, R2, R3, R4, R5, R6,
// register range for operands, but have undefined behaviours when PC
// or SP (R13 or R15) are used. The ARM ISA refers to these operands
// via the BadReg() pseudo-code description.
-def rGPR : RegisterClass<"ARM", [i32], 32, [R0, R1, R2, R3, R4, R5, R6,
- R7, R8, R9, R10, R11, R12, LR]> {
- let MethodProtos = [{
- iterator allocation_order_begin(const MachineFunction &MF) const;
- iterator allocation_order_end(const MachineFunction &MF) const;
- }];
- let MethodBodies = [{
- static const unsigned ARM_rGPR_AO[] = {
- ARM::R0, ARM::R1, ARM::R2, ARM::R3,
- ARM::R12,ARM::LR,
- ARM::R4, ARM::R5, ARM::R6, ARM::R7,
- ARM::R8, ARM::R9, ARM::R10,
- ARM::R11 };
-
- // For Thumb1 mode, we don't want to allocate hi regs at all, as we
- // don't know how to spill them. If we make our prologue/epilogue code
- // smarter at some point, we can go back to using the above allocation
- // orders for the Thumb1 instructions that know how to use hi regs.
- static const unsigned THUMB_rGPR_AO[] = {
- ARM::R0, ARM::R1, ARM::R2, ARM::R3,
- ARM::R4, ARM::R5, ARM::R6, ARM::R7 };
-
- rGPRClass::iterator
- rGPRClass::allocation_order_begin(const MachineFunction &MF) const {
- const TargetMachine &TM = MF.getTarget();
- const ARMSubtarget &Subtarget = TM.getSubtarget<ARMSubtarget>();
- if (Subtarget.isThumb1Only())
- return THUMB_rGPR_AO;
- return ARM_rGPR_AO;
- }
-
- rGPRClass::iterator
- rGPRClass::allocation_order_end(const MachineFunction &MF) const {
- const TargetMachine &TM = MF.getTarget();
- const ARMSubtarget &Subtarget = TM.getSubtarget<ARMSubtarget>();
-
- if (Subtarget.isThumb1Only())
- return THUMB_rGPR_AO + (sizeof(THUMB_rGPR_AO)/sizeof(unsigned));
- return ARM_rGPR_AO + (sizeof(ARM_rGPR_AO)/sizeof(unsigned));
- }
+def rGPR : RegisterClass<"ARM", [i32], 32, (sub GPR, SP, PC)> {
+ let AltOrders = [(add LR, rGPR), (trunc rGPR, 8)];
+ let AltOrderSelect = [{
+ return 1 + MF.getTarget().getSubtarget<ARMSubtarget>().isThumb1Only();
}];
}
// Thumb registers are R0-R7 normally. Some instructions can still use
// the general GPR register class above (MOV, e.g.)
-def tGPR : RegisterClass<"ARM", [i32], 32, [R0, R1, R2, R3, R4, R5, R6, R7]> {}
+def tGPR : RegisterClass<"ARM", [i32], 32, (trunc GPR, 8)>;
+
+// The high registers in thumb mode, R8-R15.
+def hGPR : RegisterClass<"ARM", [i32], 32, (sub GPR, tGPR)>;
// For tail calls, we can't use callee-saved registers, as they are restored
// to the saved value before the tail call, which would clobber a call address.
// Note, getMinimalPhysRegClass(R0) returns tGPR because of the names of
// this class and the preceding one(!) This is what we want.
-def tcGPR : RegisterClass<"ARM", [i32], 32, [R0, R1, R2, R3, R9, R12]> {
- let MethodProtos = [{
- iterator allocation_order_begin(const MachineFunction &MF) const;
- iterator allocation_order_end(const MachineFunction &MF) const;
- }];
- let MethodBodies = [{
- // R9 is available.
- static const unsigned ARM_GPR_R9_TC[] = {
- ARM::R0, ARM::R1, ARM::R2, ARM::R3,
- ARM::R9, ARM::R12 };
- // R9 is not available.
- static const unsigned ARM_GPR_NOR9_TC[] = {
- ARM::R0, ARM::R1, ARM::R2, ARM::R3,
- ARM::R12 };
-
- // For Thumb1 mode, we don't want to allocate hi regs at all, as we
- // don't know how to spill them. If we make our prologue/epilogue code
- // smarter at some point, we can go back to using the above allocation
- // orders for the Thumb1 instructions that know how to use hi regs.
- static const unsigned THUMB_GPR_AO_TC[] = {
- ARM::R0, ARM::R1, ARM::R2, ARM::R3 };
-
- tcGPRClass::iterator
- tcGPRClass::allocation_order_begin(const MachineFunction &MF) const {
- const TargetMachine &TM = MF.getTarget();
- const ARMSubtarget &Subtarget = TM.getSubtarget<ARMSubtarget>();
- if (Subtarget.isThumb1Only())
- return THUMB_GPR_AO_TC;
- return Subtarget.isTargetDarwin() ? ARM_GPR_R9_TC : ARM_GPR_NOR9_TC;
- }
-
- tcGPRClass::iterator
- tcGPRClass::allocation_order_end(const MachineFunction &MF) const {
- const TargetMachine &TM = MF.getTarget();
- const ARMSubtarget &Subtarget = TM.getSubtarget<ARMSubtarget>();
-
- if (Subtarget.isThumb1Only())
- return THUMB_GPR_AO_TC + (sizeof(THUMB_GPR_AO_TC)/sizeof(unsigned));
-
- return Subtarget.isTargetDarwin() ?
- ARM_GPR_R9_TC + (sizeof(ARM_GPR_R9_TC)/sizeof(unsigned)) :
- ARM_GPR_NOR9_TC + (sizeof(ARM_GPR_NOR9_TC)/sizeof(unsigned));
- }
+def tcGPR : RegisterClass<"ARM", [i32], 32, (add R0, R1, R2, R3, R9, R12)> {
+ let AltOrders = [(and tcGPR, tGPR)];
+ let AltOrderSelect = [{
+ return MF.getTarget().getSubtarget<ARMSubtarget>().isThumb1Only();
}];
}
-
// Scalar single precision floating point register class..
-def SPR : RegisterClass<"ARM", [f32], 32, [S0, S1, S2, S3, S4, S5, S6, S7, S8,
- S9, S10, S11, S12, S13, S14, S15, S16, S17, S18, S19, S20, S21, S22,
- S23, S24, S25, S26, S27, S28, S29, S30, S31]>;
+def SPR : RegisterClass<"ARM", [f32], 32, (sequence "S%u", 0, 31)>;
// Subset of SPR which can be used as a source of NEON scalars for 16-bit
// operations
-def SPR_8 : RegisterClass<"ARM", [f32], 32,
- [S0, S1, S2, S3, S4, S5, S6, S7,
- S8, S9, S10, S11, S12, S13, S14, S15]>;
+def SPR_8 : RegisterClass<"ARM", [f32], 32, (trunc SPR, 16)>;
// Scalar double precision floating point / generic 64-bit vector register
// class.
// ARM requires only word alignment for double. It's more performant if it
// is double-word alignment though.
def DPR : RegisterClass<"ARM", [f64, v8i8, v4i16, v2i32, v1i64, v2f32], 64,
- [D0, D1, D2, D3, D4, D5, D6, D7,
- D8, D9, D10, D11, D12, D13, D14, D15,
- D16, D17, D18, D19, D20, D21, D22, D23,
- D24, D25, D26, D27, D28, D29, D30, D31]> {
- let MethodProtos = [{
- iterator allocation_order_begin(const MachineFunction &MF) const;
- iterator allocation_order_end(const MachineFunction &MF) const;
- }];
- let MethodBodies = [{
- // VFP2 / VFPv3-D16
- static const unsigned ARM_DPR_VFP2[] = {
- ARM::D0, ARM::D1, ARM::D2, ARM::D3,
- ARM::D4, ARM::D5, ARM::D6, ARM::D7,
- ARM::D8, ARM::D9, ARM::D10, ARM::D11,
- ARM::D12, ARM::D13, ARM::D14, ARM::D15 };
- // VFP3: D8-D15 are callee saved and should be allocated last.
- // Save other low registers for use as DPR_VFP2 and DPR_8 classes.
- static const unsigned ARM_DPR_VFP3[] = {
- ARM::D16, ARM::D17, ARM::D18, ARM::D19,
- ARM::D20, ARM::D21, ARM::D22, ARM::D23,
- ARM::D24, ARM::D25, ARM::D26, ARM::D27,
- ARM::D28, ARM::D29, ARM::D30, ARM::D31,
- ARM::D0, ARM::D1, ARM::D2, ARM::D3,
- ARM::D4, ARM::D5, ARM::D6, ARM::D7,
- ARM::D8, ARM::D9, ARM::D10, ARM::D11,
- ARM::D12, ARM::D13, ARM::D14, ARM::D15 };
-
- DPRClass::iterator
- DPRClass::allocation_order_begin(const MachineFunction &MF) const {
- const TargetMachine &TM = MF.getTarget();
- const ARMSubtarget &Subtarget = TM.getSubtarget<ARMSubtarget>();
- if (Subtarget.hasVFP3() && !Subtarget.hasD16())
- return ARM_DPR_VFP3;
- return ARM_DPR_VFP2;
- }
-
- DPRClass::iterator
- DPRClass::allocation_order_end(const MachineFunction &MF) const {
- const TargetMachine &TM = MF.getTarget();
- const ARMSubtarget &Subtarget = TM.getSubtarget<ARMSubtarget>();
- if (Subtarget.hasVFP3() && !Subtarget.hasD16())
- return ARM_DPR_VFP3 + (sizeof(ARM_DPR_VFP3)/sizeof(unsigned));
- else
- return ARM_DPR_VFP2 + (sizeof(ARM_DPR_VFP2)/sizeof(unsigned));
- }
- }];
+ (sequence "D%u", 0, 31)> {
+ // Allocate non-VFP2 registers D16-D31 first.
+ let AltOrders = [(rotl DPR, 16)];
+ let AltOrderSelect = [{ return 1; }];
}
// Subset of DPR that are accessible with VFP2 (and so that also have
// 32-bit SPR subregs).
def DPR_VFP2 : RegisterClass<"ARM", [f64, v8i8, v4i16, v2i32, v1i64, v2f32], 64,
- [D0, D1, D2, D3, D4, D5, D6, D7,
- D8, D9, D10, D11, D12, D13, D14, D15]> {
+ (trunc DPR, 16)> {
let SubRegClasses = [(SPR ssub_0, ssub_1)];
}
// Subset of DPR which can be used as a source of NEON scalars for 16-bit
// operations
def DPR_8 : RegisterClass<"ARM", [f64, v8i8, v4i16, v2i32, v1i64, v2f32], 64,
- [D0, D1, D2, D3, D4, D5, D6, D7]> {
+ (trunc DPR, 8)> {
let SubRegClasses = [(SPR_8 ssub_0, ssub_1)];
}
// Generic 128-bit vector register class.
def QPR : RegisterClass<"ARM", [v16i8, v8i16, v4i32, v2i64, v4f32, v2f64], 128,
- [Q0, Q1, Q2, Q3, Q4, Q5, Q6, Q7,
- Q8, Q9, Q10, Q11, Q12, Q13, Q14, Q15]> {
+ (sequence "Q%u", 0, 15)> {
let SubRegClasses = [(DPR dsub_0, dsub_1)];
- let MethodProtos = [{
- iterator allocation_order_begin(const MachineFunction &MF) const;
- iterator allocation_order_end(const MachineFunction &MF) const;
- }];
- let MethodBodies = [{
- // Q4-Q7 are callee saved and should be allocated last.
- // Save other low registers for use as QPR_VFP2 and QPR_8 classes.
- static const unsigned ARM_QPR[] = {
- ARM::Q8, ARM::Q9, ARM::Q10, ARM::Q11,
- ARM::Q12, ARM::Q13, ARM::Q14, ARM::Q15,
- ARM::Q0, ARM::Q1, ARM::Q2, ARM::Q3,
- ARM::Q4, ARM::Q5, ARM::Q6, ARM::Q7 };
-
- QPRClass::iterator
- QPRClass::allocation_order_begin(const MachineFunction &MF) const {
- return ARM_QPR;
- }
-
- QPRClass::iterator
- QPRClass::allocation_order_end(const MachineFunction &MF) const {
- return ARM_QPR + (sizeof(ARM_QPR)/sizeof(unsigned));
- }
- }];
+ // Allocate non-VFP2 aliases Q8-Q15 first.
+ let AltOrders = [(rotl QPR, 8)];
+ let AltOrderSelect = [{ return 1; }];
}
// Subset of QPR that have 32-bit SPR subregs.
def QPR_VFP2 : RegisterClass<"ARM", [v16i8, v8i16, v4i32, v2i64, v4f32, v2f64],
- 128,
- [Q0, Q1, Q2, Q3, Q4, Q5, Q6, Q7]> {
+ 128, (trunc QPR, 8)> {
let SubRegClasses = [(SPR ssub_0, ssub_1, ssub_2, ssub_3),
(DPR_VFP2 dsub_0, dsub_1)];
}
// Subset of QPR that have DPR_8 and SPR_8 subregs.
def QPR_8 : RegisterClass<"ARM", [v16i8, v8i16, v4i32, v2i64, v4f32, v2f64],
- 128,
- [Q0, Q1, Q2, Q3]> {
+ 128, (trunc QPR, 4)> {
let SubRegClasses = [(SPR_8 ssub_0, ssub_1, ssub_2, ssub_3),
(DPR_8 dsub_0, dsub_1)];
}
// Pseudo 256-bit vector register class to model pairs of Q registers
// (4 consecutive D registers).
-def QQPR : RegisterClass<"ARM", [v4i64],
- 256,
- [QQ0, QQ1, QQ2, QQ3, QQ4, QQ5, QQ6, QQ7]> {
+def QQPR : RegisterClass<"ARM", [v4i64], 256, (sequence "QQ%u", 0, 7)> {
let SubRegClasses = [(DPR dsub_0, dsub_1, dsub_2, dsub_3),
(QPR qsub_0, qsub_1)];
- let MethodProtos = [{
- iterator allocation_order_begin(const MachineFunction &MF) const;
- iterator allocation_order_end(const MachineFunction &MF) const;
- }];
- let MethodBodies = [{
- // QQ2-QQ3 are callee saved and should be allocated last.
- // Save other low registers for use as QPR_VFP2 and QPR_8 classes.
- static const unsigned ARM_QQPR[] = {
- ARM::QQ4, ARM::QQ5, ARM::QQ6, ARM::QQ7,
- ARM::QQ0, ARM::QQ1, ARM::QQ2, ARM::QQ3 };
-
- QQPRClass::iterator
- QQPRClass::allocation_order_begin(const MachineFunction &MF) const {
- return ARM_QQPR;
- }
-
- QQPRClass::iterator
- QQPRClass::allocation_order_end(const MachineFunction &MF) const {
- return ARM_QQPR + (sizeof(ARM_QQPR)/sizeof(unsigned));
- }
- }];
+ // Allocate non-VFP2 aliases first.
+ let AltOrders = [(rotl QQPR, 4)];
+ let AltOrderSelect = [{ return 1; }];
}
// Subset of QQPR that have 32-bit SPR subregs.
-def QQPR_VFP2 : RegisterClass<"ARM", [v4i64],
- 256,
- [QQ0, QQ1, QQ2, QQ3]> {
+def QQPR_VFP2 : RegisterClass<"ARM", [v4i64], 256, (trunc QQPR, 4)> {
let SubRegClasses = [(SPR ssub_0, ssub_1, ssub_2, ssub_3),
(DPR_VFP2 dsub_0, dsub_1, dsub_2, dsub_3),
(QPR_VFP2 qsub_0, qsub_1)];
@@ -511,35 +317,16 @@ def QQPR_VFP2 : RegisterClass<"ARM", [v4i64],
// Pseudo 512-bit vector register class to model 4 consecutive Q registers
// (8 consecutive D registers).
-def QQQQPR : RegisterClass<"ARM", [v8i64],
- 256,
- [QQQQ0, QQQQ1, QQQQ2, QQQQ3]> {
+def QQQQPR : RegisterClass<"ARM", [v8i64], 256, (sequence "QQQQ%u", 0, 3)> {
let SubRegClasses = [(DPR dsub_0, dsub_1, dsub_2, dsub_3,
dsub_4, dsub_5, dsub_6, dsub_7),
(QPR qsub_0, qsub_1, qsub_2, qsub_3)];
- let MethodProtos = [{
- iterator allocation_order_begin(const MachineFunction &MF) const;
- iterator allocation_order_end(const MachineFunction &MF) const;
- }];
- let MethodBodies = [{
- // QQQQ1 is callee saved and should be allocated last.
- // Save QQQQ0 for use as QPR_VFP2 and QPR_8 classes.
- static const unsigned ARM_QQQQPR[] = {
- ARM::QQQQ2, ARM::QQQQ3, ARM::QQQQ0, ARM::QQQQ1 };
-
- QQQQPRClass::iterator
- QQQQPRClass::allocation_order_begin(const MachineFunction &MF) const {
- return ARM_QQQQPR;
- }
-
- QQQQPRClass::iterator
- QQQQPRClass::allocation_order_end(const MachineFunction &MF) const {
- return ARM_QQQQPR + (sizeof(ARM_QQQQPR)/sizeof(unsigned));
- }
- }];
+ // Allocate non-VFP2 aliases first.
+ let AltOrders = [(rotl QQQQPR, 2)];
+ let AltOrderSelect = [{ return 1; }];
}
// Condition code registers.
-def CCR : RegisterClass<"ARM", [i32], 32, [CPSR]> {
+def CCR : RegisterClass<"ARM", [i32], 32, (add CPSR)> {
let isAllocatable = 0;
}
diff --git a/contrib/llvm/lib/Target/ARM/ARMSubtarget.cpp b/contrib/llvm/lib/Target/ARM/ARMSubtarget.cpp
index c6f266b..1cab9e4 100644
--- a/contrib/llvm/lib/Target/ARM/ARMSubtarget.cpp
+++ b/contrib/llvm/lib/Target/ARM/ARMSubtarget.cpp
@@ -7,17 +7,21 @@
//
//===----------------------------------------------------------------------===//
//
-// This file implements the ARM specific subclass of TargetSubtarget.
+// This file implements the ARM specific subclass of TargetSubtargetInfo.
//
//===----------------------------------------------------------------------===//
#include "ARMSubtarget.h"
-#include "ARMGenSubtarget.inc"
#include "ARMBaseRegisterInfo.h"
#include "llvm/GlobalValue.h"
-#include "llvm/Target/TargetOptions.h"
+#include "llvm/Target/TargetSubtargetInfo.h"
#include "llvm/Support/CommandLine.h"
#include "llvm/ADT/SmallVector.h"
+
+#define GET_SUBTARGETINFO_TARGET_DESC
+#define GET_SUBTARGETINFO_CTOR
+#include "ARMGenSubtargetInfo.inc"
+
using namespace llvm;
static cl::opt<bool>
@@ -31,17 +35,25 @@ static cl::opt<bool>
StrictAlign("arm-strict-align", cl::Hidden,
cl::desc("Disallow all unaligned memory accesses"));
-ARMSubtarget::ARMSubtarget(const std::string &TT, const std::string &FS,
- bool isT)
- : ARMArchVersion(V4)
+ARMSubtarget::ARMSubtarget(const std::string &TT, const std::string &CPU,
+ const std::string &FS)
+ : ARMGenSubtargetInfo(TT, CPU, FS)
, ARMProcFamily(Others)
- , ARMFPUType(None)
+ , HasV4TOps(false)
+ , HasV5TOps(false)
+ , HasV5TEOps(false)
+ , HasV6Ops(false)
+ , HasV6T2Ops(false)
+ , HasV7Ops(false)
+ , HasVFPv2(false)
+ , HasVFPv3(false)
+ , HasNEON(false)
, UseNEONForSinglePrecisionFP(false)
, SlowFPVMLx(false)
, HasVMLxForwarding(false)
, SlowFPBrcc(false)
- , IsThumb(isT)
- , ThumbMode(Thumb1)
+ , InThumbMode(false)
+ , HasThumb2(false)
, NoARM(false)
, PostRAScheduler(false)
, IsR9Reserved(ReserveR9)
@@ -56,94 +68,40 @@ ARMSubtarget::ARMSubtarget(const std::string &TT, const std::string &FS,
, HasMPExtension(false)
, FPOnlySP(false)
, AllowsUnalignedMem(false)
+ , Thumb2DSP(false)
, stackAlignment(4)
- , CPUString("generic")
+ , CPUString(CPU)
, TargetTriple(TT)
, TargetABI(ARM_ABI_APCS) {
- // Default to soft float ABI
- if (FloatABIType == FloatABI::Default)
- FloatABIType = FloatABI::Soft;
-
// Determine default and user specified characteristics
-
- // When no arch is specified either by CPU or by attributes, make the default
- // ARMv4T.
- const char *ARMArchFeature = "";
- if (CPUString == "generic" && (FS.empty() || FS == "generic")) {
- ARMArchVersion = V4T;
- ARMArchFeature = ",+v4t";
+ if (CPUString.empty())
+ CPUString = "generic";
+
+ // Insert the architecture feature derived from the target triple into the
+ // feature string. This is important for setting features that are implied
+ // based on the architecture version.
+ std::string ArchFS = ARM_MC::ParseARMTriple(TT);
+ if (!FS.empty()) {
+ if (!ArchFS.empty())
+ ArchFS = ArchFS + "," + FS;
+ else
+ ArchFS = FS;
}
+ ParseSubtargetFeatures(CPUString, ArchFS);
- // Set the boolean corresponding to the current target triple, or the default
- // if one cannot be determined, to true.
- unsigned Len = TT.length();
- unsigned Idx = 0;
+ // Thumb2 implies at least V6T2. FIXME: Fix tests to explicitly specify a
+ // ARM version or CPU and then remove this.
+ if (!HasV6T2Ops && hasThumb2())
+ HasV4TOps = HasV5TOps = HasV5TEOps = HasV6Ops = HasV6T2Ops = true;
- if (Len >= 5 && TT.substr(0, 4) == "armv")
- Idx = 4;
- else if (Len >= 6 && TT.substr(0, 5) == "thumb") {
- IsThumb = true;
- if (Len >= 7 && TT[5] == 'v')
- Idx = 6;
- }
- if (Idx) {
- unsigned SubVer = TT[Idx];
- if (SubVer >= '7' && SubVer <= '9') {
- ARMArchVersion = V7A;
- ARMArchFeature = ",+v7a";
- if (Len >= Idx+2 && TT[Idx+1] == 'm') {
- ARMArchVersion = V7M;
- ARMArchFeature = ",+v7m";
- }
- } else if (SubVer == '6') {
- ARMArchVersion = V6;
- ARMArchFeature = ",+v6";
- if (Len >= Idx+3 && TT[Idx+1] == 't' && TT[Idx+2] == '2') {
- ARMArchVersion = V6T2;
- ARMArchFeature = ",+v6t2";
- }
- } else if (SubVer == '5') {
- ARMArchVersion = V5T;
- ARMArchFeature = ",+v5t";
- if (Len >= Idx+3 && TT[Idx+1] == 't' && TT[Idx+2] == 'e') {
- ARMArchVersion = V5TE;
- ARMArchFeature = ",+v5te";
- }
- } else if (SubVer == '4') {
- if (Len >= Idx+2 && TT[Idx+1] == 't') {
- ARMArchVersion = V4T;
- ARMArchFeature = ",+v4t";
- } else {
- ARMArchVersion = V4;
- ARMArchFeature = "";
- }
- }
- }
-
- if (TT.find("eabi") != std::string::npos)
- TargetABI = ARM_ABI_AAPCS;
-
- // Parse features string. If the first entry in FS (the CPU) is missing,
- // insert the architecture feature derived from the target triple. This is
- // important for setting features that are implied based on the architecture
- // version.
- std::string FSWithArch;
- if (FS.empty())
- FSWithArch = std::string(ARMArchFeature);
- else if (FS.find(',') == 0)
- FSWithArch = std::string(ARMArchFeature) + FS;
- else
- FSWithArch = FS;
- CPUString = ParseSubtargetFeatures(FSWithArch, CPUString);
+ // Initialize scheduling itinerary for the specified CPU.
+ InstrItins = getInstrItineraryForCPU(CPUString);
// After parsing Itineraries, set ItinData.IssueWidth.
computeIssueWidth();
- // Thumb2 implies at least V6T2.
- if (ARMArchVersion >= V6T2)
- ThumbMode = Thumb2;
- else if (ThumbMode >= Thumb2)
- ARMArchVersion = V6T2;
+ if (TT.find("eabi") != std::string::npos)
+ TargetABI = ARM_ABI_AAPCS;
if (isAAPCS_ABI())
stackAlignment = 8;
@@ -151,7 +109,7 @@ ARMSubtarget::ARMSubtarget(const std::string &TT, const std::string &FS,
if (!isTargetDarwin())
UseMovt = hasV6T2Ops();
else {
- IsR9Reserved = ReserveR9 | (ARMArchVersion < V6);
+ IsR9Reserved = ReserveR9 | !HasV6Ops;
UseMovt = DarwinUseMOVT && hasV6T2Ops();
}
@@ -247,9 +205,9 @@ void ARMSubtarget::computeIssueWidth() {
bool ARMSubtarget::enablePostRAScheduler(
CodeGenOpt::Level OptLevel,
- TargetSubtarget::AntiDepBreakMode& Mode,
+ TargetSubtargetInfo::AntiDepBreakMode& Mode,
RegClassVector& CriticalPathRCs) const {
- Mode = TargetSubtarget::ANTIDEP_CRITICAL;
+ Mode = TargetSubtargetInfo::ANTIDEP_CRITICAL;
CriticalPathRCs.clear();
CriticalPathRCs.push_back(&ARM::GPRRegClass);
return PostRAScheduler && OptLevel >= CodeGenOpt::Default;
diff --git a/contrib/llvm/lib/Target/ARM/ARMSubtarget.h b/contrib/llvm/lib/Target/ARM/ARMSubtarget.h
index 0271c87..c650872 100644
--- a/contrib/llvm/lib/Target/ARM/ARMSubtarget.h
+++ b/contrib/llvm/lib/Target/ARM/ARMSubtarget.h
@@ -7,50 +7,49 @@
//
//===----------------------------------------------------------------------===//
//
-// This file declares the ARM specific subclass of TargetSubtarget.
+// This file declares the ARM specific subclass of TargetSubtargetInfo.
//
//===----------------------------------------------------------------------===//
#ifndef ARMSUBTARGET_H
#define ARMSUBTARGET_H
-#include "llvm/Target/TargetInstrItineraries.h"
-#include "llvm/Target/TargetMachine.h"
-#include "llvm/Target/TargetSubtarget.h"
+#include "MCTargetDesc/ARMMCTargetDesc.h"
+#include "llvm/Target/TargetSubtargetInfo.h"
+#include "llvm/MC/MCInstrItineraries.h"
#include "llvm/ADT/Triple.h"
#include <string>
+#define GET_SUBTARGETINFO_HEADER
+#include "ARMGenSubtargetInfo.inc"
+
namespace llvm {
class GlobalValue;
+class StringRef;
-class ARMSubtarget : public TargetSubtarget {
+class ARMSubtarget : public ARMGenSubtargetInfo {
protected:
- enum ARMArchEnum {
- V4, V4T, V5T, V5TE, V6, V6M, V6T2, V7A, V7M
- };
-
enum ARMProcFamilyEnum {
Others, CortexA8, CortexA9
};
- enum ARMFPEnum {
- None, VFPv2, VFPv3, NEON
- };
-
- enum ThumbTypeEnum {
- Thumb1,
- Thumb2
- };
-
- /// ARMArchVersion - ARM architecture version: V4, V4T (base), V5T, V5TE,
- /// V6, V6T2, V7A, V7M.
- ARMArchEnum ARMArchVersion;
-
/// ARMProcFamily - ARM processor family: Cortex-A8, Cortex-A9, and others.
ARMProcFamilyEnum ARMProcFamily;
- /// ARMFPUType - Floating Point Unit type.
- ARMFPEnum ARMFPUType;
+ /// HasV4TOps, HasV5TOps, HasV5TEOps, HasV6Ops, HasV6T2Ops, HasV7Ops -
+ /// Specify whether target support specific ARM ISA variants.
+ bool HasV4TOps;
+ bool HasV5TOps;
+ bool HasV5TEOps;
+ bool HasV6Ops;
+ bool HasV6T2Ops;
+ bool HasV7Ops;
+
+ /// HasVFPv2, HasVFPv3, HasNEON - Specify what floating point ISAs are
+ /// supported.
+ bool HasVFPv2;
+ bool HasVFPv3;
+ bool HasNEON;
/// UseNEONForSinglePrecisionFP - if the NEONFP attribute has been
/// specified. Use the method useNEONForSinglePrecisionFP() to
@@ -68,11 +67,11 @@ protected:
/// SlowFPBrcc - True if floating point compare + branch is slow.
bool SlowFPBrcc;
- /// IsThumb - True if we are in thumb mode, false if in ARM mode.
- bool IsThumb;
+ /// InThumbMode - True if compiling for Thumb, false for ARM.
+ bool InThumbMode;
- /// ThumbMode - Indicates supported Thumb version.
- ThumbTypeEnum ThumbMode;
+ /// HasThumb2 - True if Thumb2 instructions are supported.
+ bool HasThumb2;
/// NoARM - True if subtarget does not support ARM mode execution.
bool NoARM;
@@ -128,6 +127,10 @@ protected:
/// ARMTargetLowering::allowsUnalignedMemoryAccesses().
bool AllowsUnalignedMem;
+ /// Thumb2DSP - If true, the subtarget supports the v7 DSP (saturating arith
+ /// and such) instructions in Thumb2 code.
+ bool Thumb2DSP;
+
/// stackAlignment - The minimum alignment known to hold of the stack frame on
/// entry to the function and which must be maintained by every function.
unsigned stackAlignment;
@@ -154,7 +157,8 @@ protected:
/// This constructor initializes the data members to match that
/// of the specified triple.
///
- ARMSubtarget(const std::string &TT, const std::string &FS, bool isThumb);
+ ARMSubtarget(const std::string &TT, const std::string &CPU,
+ const std::string &FS);
/// getMaxInlineSizeThreshold - Returns the maximum memset / memcpy size
/// that still makes it profitable to inline the call.
@@ -165,28 +169,28 @@ protected:
}
/// ParseSubtargetFeatures - Parses features string setting specified
/// subtarget options. Definition of function is auto generated by tblgen.
- std::string ParseSubtargetFeatures(const std::string &FS,
- const std::string &CPU);
+ void ParseSubtargetFeatures(StringRef CPU, StringRef FS);
void computeIssueWidth();
- bool hasV4TOps() const { return ARMArchVersion >= V4T; }
- bool hasV5TOps() const { return ARMArchVersion >= V5T; }
- bool hasV5TEOps() const { return ARMArchVersion >= V5TE; }
- bool hasV6Ops() const { return ARMArchVersion >= V6; }
- bool hasV6T2Ops() const { return ARMArchVersion >= V6T2; }
- bool hasV7Ops() const { return ARMArchVersion >= V7A; }
+ bool hasV4TOps() const { return HasV4TOps; }
+ bool hasV5TOps() const { return HasV5TOps; }
+ bool hasV5TEOps() const { return HasV5TEOps; }
+ bool hasV6Ops() const { return HasV6Ops; }
+ bool hasV6T2Ops() const { return HasV6T2Ops; }
+ bool hasV7Ops() const { return HasV7Ops; }
bool isCortexA8() const { return ARMProcFamily == CortexA8; }
bool isCortexA9() const { return ARMProcFamily == CortexA9; }
bool hasARMOps() const { return !NoARM; }
- bool hasVFP2() const { return ARMFPUType >= VFPv2; }
- bool hasVFP3() const { return ARMFPUType >= VFPv3; }
- bool hasNEON() const { return ARMFPUType >= NEON; }
+ bool hasVFP2() const { return HasVFPv2; }
+ bool hasVFP3() const { return HasVFPv3; }
+ bool hasNEON() const { return HasNEON; }
bool useNEONForSinglePrecisionFP() const {
return hasNEON() && UseNEONForSinglePrecisionFP; }
+
bool hasDivide() const { return HasHardwareDivide; }
bool hasT2ExtractPack() const { return HasT2ExtractPack; }
bool hasDataBarrier() const { return HasDataBarrier; }
@@ -197,6 +201,7 @@ protected:
bool prefers32BitThumb() const { return Pref32BitThumb; }
bool avoidCPSRPartialUpdate() const { return AvoidCPSRPartialUpdate; }
bool hasMPExtension() const { return HasMPExtension; }
+ bool hasThumb2DSP() const { return Thumb2DSP; }
bool hasFP16() const { return HasFP16; }
bool hasD16() const { return HasD16; }
@@ -209,10 +214,10 @@ protected:
bool isAPCS_ABI() const { return TargetABI == ARM_ABI_APCS; }
bool isAAPCS_ABI() const { return TargetABI == ARM_ABI_AAPCS; }
- bool isThumb() const { return IsThumb; }
- bool isThumb1Only() const { return IsThumb && (ThumbMode == Thumb1); }
- bool isThumb2() const { return IsThumb && (ThumbMode == Thumb2); }
- bool hasThumb2() const { return ThumbMode >= Thumb2; }
+ bool isThumb() const { return InThumbMode; }
+ bool isThumb1Only() const { return InThumbMode && !HasThumb2; }
+ bool isThumb2() const { return InThumbMode && HasThumb2; }
+ bool hasThumb2() const { return HasThumb2; }
bool isR9Reserved() const { return IsR9Reserved; }
@@ -226,7 +231,7 @@ protected:
/// enablePostRAScheduler - True at 'More' optimization.
bool enablePostRAScheduler(CodeGenOpt::Level OptLevel,
- TargetSubtarget::AntiDepBreakMode& Mode,
+ TargetSubtargetInfo::AntiDepBreakMode& Mode,
RegClassVector& CriticalPathRCs) const;
/// getInstrItins - Return the instruction itineraies based on subtarget
diff --git a/contrib/llvm/lib/Target/ARM/ARMTargetMachine.cpp b/contrib/llvm/lib/Target/ARM/ARMTargetMachine.cpp
index 29aa4f7..f0b176a 100644
--- a/contrib/llvm/lib/Target/ARM/ARMTargetMachine.cpp
+++ b/contrib/llvm/lib/Target/ARM/ARMTargetMachine.cpp
@@ -11,7 +11,6 @@
//===----------------------------------------------------------------------===//
#include "ARMTargetMachine.h"
-#include "ARMMCAsmInfo.h"
#include "ARMFrameLowering.h"
#include "ARM.h"
#include "llvm/PassManager.h"
@@ -22,15 +21,6 @@
#include "llvm/Target/TargetRegistry.h"
using namespace llvm;
-static MCAsmInfo *createMCAsmInfo(const Target &T, StringRef TT) {
- Triple TheTriple(TT);
-
- if (TheTriple.isOSDarwin())
- return new ARMMCAsmInfoDarwin();
-
- return new ARMELFMCAsmInfo();
-}
-
// This is duplicated code. Refactor this.
static MCStreamer *createMCStreamer(const Target &T, const std::string &TT,
MCContext &Ctx, TargetAsmBackend &TAB,
@@ -56,10 +46,6 @@ extern "C" void LLVMInitializeARMTarget() {
RegisterTargetMachine<ARMTargetMachine> X(TheARMTarget);
RegisterTargetMachine<ThumbTargetMachine> Y(TheThumbTarget);
- // Register the target asm info.
- RegisterAsmInfoFn A(TheARMTarget, createMCAsmInfo);
- RegisterAsmInfoFn B(TheThumbTarget, createMCAsmInfo);
-
// Register the MC Code Emitter
TargetRegistry::RegisterCodeEmitter(TheARMTarget, createARMMCCodeEmitter);
TargetRegistry::RegisterCodeEmitter(TheThumbTarget, createARMMCCodeEmitter);
@@ -78,18 +64,23 @@ extern "C" void LLVMInitializeARMTarget() {
///
ARMBaseTargetMachine::ARMBaseTargetMachine(const Target &T,
const std::string &TT,
- const std::string &FS,
- bool isThumb)
- : LLVMTargetMachine(T, TT),
- Subtarget(TT, FS, isThumb),
+ const std::string &CPU,
+ const std::string &FS)
+ : LLVMTargetMachine(T, TT, CPU, FS),
+ Subtarget(TT, CPU, FS),
JITInfo(),
InstrItins(Subtarget.getInstrItineraryData()) {
DefRelocModel = getRelocationModel();
+
+ // Default to soft float ABI
+ if (FloatABIType == FloatABI::Default)
+ FloatABIType = FloatABI::Soft;
}
ARMTargetMachine::ARMTargetMachine(const Target &T, const std::string &TT,
+ const std::string &CPU,
const std::string &FS)
- : ARMBaseTargetMachine(T, TT, FS, false), InstrInfo(Subtarget),
+ : ARMBaseTargetMachine(T, TT, CPU, FS), InstrInfo(Subtarget),
DataLayout(Subtarget.isAPCS_ABI() ?
std::string("e-p:32:32-f64:32:64-i64:32:64-"
"v128:32:128-v64:32:64-n32") :
@@ -105,8 +96,9 @@ ARMTargetMachine::ARMTargetMachine(const Target &T, const std::string &TT,
}
ThumbTargetMachine::ThumbTargetMachine(const Target &T, const std::string &TT,
+ const std::string &CPU,
const std::string &FS)
- : ARMBaseTargetMachine(T, TT, FS, true),
+ : ARMBaseTargetMachine(T, TT, CPU, FS),
InstrInfo(Subtarget.hasThumb2()
? ((ARMBaseInstrInfo*)new Thumb2InstrInfo(Subtarget))
: ((ARMBaseInstrInfo*)new Thumb1InstrInfo(Subtarget))),
diff --git a/contrib/llvm/lib/Target/ARM/ARMTargetMachine.h b/contrib/llvm/lib/Target/ARM/ARMTargetMachine.h
index e0aa149..bc3d46a 100644
--- a/contrib/llvm/lib/Target/ARM/ARMTargetMachine.h
+++ b/contrib/llvm/lib/Target/ARM/ARMTargetMachine.h
@@ -41,7 +41,7 @@ private:
public:
ARMBaseTargetMachine(const Target &T, const std::string &TT,
- const std::string &FS, bool isThumb);
+ const std::string &CPU, const std::string &FS);
virtual ARMJITInfo *getJITInfo() { return &JITInfo; }
virtual const ARMSubtarget *getSubtargetImpl() const { return &Subtarget; }
@@ -70,7 +70,7 @@ class ARMTargetMachine : public ARMBaseTargetMachine {
ARMFrameLowering FrameLowering;
public:
ARMTargetMachine(const Target &T, const std::string &TT,
- const std::string &FS);
+ const std::string &CPU, const std::string &FS);
virtual const ARMRegisterInfo *getRegisterInfo() const {
return &InstrInfo.getRegisterInfo();
@@ -109,7 +109,7 @@ class ThumbTargetMachine : public ARMBaseTargetMachine {
OwningPtr<ARMFrameLowering> FrameLowering;
public:
ThumbTargetMachine(const Target &T, const std::string &TT,
- const std::string &FS);
+ const std::string &CPU, const std::string &FS);
/// returns either Thumb1RegisterInfo or Thumb2RegisterInfo
virtual const ARMBaseRegisterInfo *getRegisterInfo() const {
diff --git a/contrib/llvm/lib/Target/ARM/AsmParser/ARMAsmLexer.cpp b/contrib/llvm/lib/Target/ARM/AsmParser/ARMAsmLexer.cpp
index 2428ce1..d9a5fa2 100644
--- a/contrib/llvm/lib/Target/ARM/AsmParser/ARMAsmLexer.cpp
+++ b/contrib/llvm/lib/Target/ARM/AsmParser/ARMAsmLexer.cpp
@@ -87,8 +87,9 @@ public:
: ARMBaseAsmLexer(T, MAI) {
std::string tripleString("arm-unknown-unknown");
std::string featureString;
+ std::string CPU;
OwningPtr<const TargetMachine>
- targetMachine(T.createTargetMachine(tripleString, featureString));
+ targetMachine(T.createTargetMachine(tripleString, CPU, featureString));
InitRegisterMap(targetMachine->getRegisterInfo());
}
};
@@ -99,8 +100,9 @@ public:
: ARMBaseAsmLexer(T, MAI) {
std::string tripleString("thumb-unknown-unknown");
std::string featureString;
+ std::string CPU;
OwningPtr<const TargetMachine>
- targetMachine(T.createTargetMachine(tripleString, featureString));
+ targetMachine(T.createTargetMachine(tripleString, CPU, featureString));
InitRegisterMap(targetMachine->getRegisterInfo());
}
};
diff --git a/contrib/llvm/lib/Target/ARM/AsmParser/ARMAsmParser.cpp b/contrib/llvm/lib/Target/ARM/AsmParser/ARMAsmParser.cpp
index 4bc12c9..a474127 100644
--- a/contrib/llvm/lib/Target/ARM/AsmParser/ARMAsmParser.cpp
+++ b/contrib/llvm/lib/Target/ARM/AsmParser/ARMAsmParser.cpp
@@ -20,14 +20,17 @@
#include "llvm/MC/MCStreamer.h"
#include "llvm/MC/MCExpr.h"
#include "llvm/MC/MCInst.h"
+#include "llvm/MC/MCSubtargetInfo.h"
#include "llvm/Target/TargetRegistry.h"
#include "llvm/Target/TargetAsmParser.h"
#include "llvm/Support/SourceMgr.h"
#include "llvm/Support/raw_ostream.h"
+#include "llvm/ADT/OwningPtr.h"
#include "llvm/ADT/SmallVector.h"
#include "llvm/ADT/StringExtras.h"
#include "llvm/ADT/StringSwitch.h"
#include "llvm/ADT/Twine.h"
+
using namespace llvm;
namespace {
@@ -35,8 +38,8 @@ namespace {
class ARMOperand;
class ARMAsmParser : public TargetAsmParser {
+ MCSubtargetInfo &STI;
MCAsmParser &Parser;
- TargetMachine &TM;
MCAsmParser &getParser() const { return Parser; }
MCAsmLexer &getLexer() const { return Parser.getLexer(); }
@@ -47,7 +50,7 @@ class ARMAsmParser : public TargetAsmParser {
int TryParseRegister();
virtual bool ParseRegister(unsigned &RegNo, SMLoc &StartLoc, SMLoc &EndLoc);
bool TryParseRegisterWithWriteBack(SmallVectorImpl<MCParsedAsmOperand*> &);
- bool TryParseShiftRegister(SmallVectorImpl<MCParsedAsmOperand*> &);
+ int TryParseShiftRegister(SmallVectorImpl<MCParsedAsmOperand*> &);
bool ParseRegisterList(SmallVectorImpl<MCParsedAsmOperand*> &);
bool ParseMemory(SmallVectorImpl<MCParsedAsmOperand*> &,
ARMII::AddrMode AddrMode);
@@ -79,6 +82,18 @@ class ARMAsmParser : public TargetAsmParser {
void GetMnemonicAcceptInfo(StringRef Mnemonic, bool &CanAcceptCarrySet,
bool &CanAcceptPredicationCode);
+ bool isThumb() const {
+ // FIXME: Can tablegen auto-generate this?
+ return (STI.getFeatureBits() & ARM::ModeThumb) != 0;
+ }
+ bool isThumbOne() const {
+ return isThumb() && (STI.getFeatureBits() & ARM::FeatureThumb2) == 0;
+ }
+ void SwitchMode() {
+ unsigned FB = ComputeAvailableFeatures(STI.ToggleFeature(ARM::ModeThumb));
+ setAvailableFeatures(FB);
+ }
+
/// @name Auto-generated Match Functions
/// {
@@ -113,13 +128,13 @@ class ARMAsmParser : public TargetAsmParser {
const SmallVectorImpl<MCParsedAsmOperand*> &);
public:
- ARMAsmParser(const Target &T, MCAsmParser &_Parser, TargetMachine &_TM)
- : TargetAsmParser(T), Parser(_Parser), TM(_TM) {
- MCAsmParserExtension::Initialize(_Parser);
- // Initialize the set of available features.
- setAvailableFeatures(ComputeAvailableFeatures(
- &TM.getSubtarget<ARMSubtarget>()));
- }
+ ARMAsmParser(MCSubtargetInfo &_STI, MCAsmParser &_Parser)
+ : TargetAsmParser(), STI(_STI), Parser(_Parser) {
+ MCAsmParserExtension::Initialize(_Parser);
+
+ // Initialize the set of available features.
+ setAvailableFeatures(ComputeAvailableFeatures(STI.getFeatureBits()));
+ }
virtual bool ParseInstruction(StringRef Name, SMLoc NameLoc,
SmallVectorImpl<MCParsedAsmOperand*> &Operands);
@@ -146,6 +161,7 @@ class ARMOperand : public MCParsedAsmOperand {
RegisterList,
DPRRegisterList,
SPRRegisterList,
+ ShiftedRegister,
Shifter,
Token
} Kind;
@@ -207,8 +223,14 @@ class ARMOperand : public MCParsedAsmOperand {
struct {
ARM_AM::ShiftOpc ShiftTy;
- unsigned RegNum;
+ unsigned Imm;
} Shift;
+ struct {
+ ARM_AM::ShiftOpc ShiftTy;
+ unsigned SrcReg;
+ unsigned ShiftReg;
+ unsigned ShiftImm;
+ } ShiftedReg;
};
ARMOperand(KindTy K) : MCParsedAsmOperand(), Kind(K) {}
@@ -255,6 +277,9 @@ public:
case Shifter:
Shift = o.Shift;
break;
+ case ShiftedRegister:
+ ShiftedReg = o.ShiftedReg;
+ break;
}
}
@@ -350,6 +375,46 @@ public:
bool isCondCode() const { return Kind == CondCode; }
bool isCCOut() const { return Kind == CCOut; }
bool isImm() const { return Kind == Immediate; }
+ bool isImm0_255() const {
+ if (Kind != Immediate)
+ return false;
+ const MCConstantExpr *CE = dyn_cast<MCConstantExpr>(getImm());
+ if (!CE) return false;
+ int64_t Value = CE->getValue();
+ return Value >= 0 && Value < 256;
+ }
+ bool isImm0_7() const {
+ if (Kind != Immediate)
+ return false;
+ const MCConstantExpr *CE = dyn_cast<MCConstantExpr>(getImm());
+ if (!CE) return false;
+ int64_t Value = CE->getValue();
+ return Value >= 0 && Value < 8;
+ }
+ bool isImm0_15() const {
+ if (Kind != Immediate)
+ return false;
+ const MCConstantExpr *CE = dyn_cast<MCConstantExpr>(getImm());
+ if (!CE) return false;
+ int64_t Value = CE->getValue();
+ return Value >= 0 && Value < 16;
+ }
+ bool isImm0_65535() const {
+ if (Kind != Immediate)
+ return false;
+ const MCConstantExpr *CE = dyn_cast<MCConstantExpr>(getImm());
+ if (!CE) return false;
+ int64_t Value = CE->getValue();
+ return Value >= 0 && Value < 65536;
+ }
+ bool isT2SOImm() const {
+ if (Kind != Immediate)
+ return false;
+ const MCConstantExpr *CE = dyn_cast<MCConstantExpr>(getImm());
+ if (!CE) return false;
+ int64_t Value = CE->getValue();
+ return ARM_AM::getT2SOImmVal(Value) != -1;
+ }
bool isReg() const { return Kind == Register; }
bool isRegList() const { return Kind == RegisterList; }
bool isDPRRegList() const { return Kind == DPRRegisterList; }
@@ -358,6 +423,7 @@ public:
bool isMemBarrierOpt() const { return Kind == MemBarrierOpt; }
bool isMemory() const { return Kind == Memory; }
bool isShifter() const { return Kind == Shifter; }
+ bool isShiftedReg() const { return Kind == ShiftedRegister; }
bool isMemMode2() const {
if (getMemAddrMode() != ARMII::AddrMode2)
return false;
@@ -488,6 +554,18 @@ public:
Inst.addOperand(MCOperand::CreateReg(getReg()));
}
+ void addShiftedRegOperands(MCInst &Inst, unsigned N) const {
+ assert(N == 3 && "Invalid number of operands!");
+ assert(isShiftedReg() && "addShiftedRegOperands() on non ShiftedReg!");
+ assert((ShiftedReg.ShiftReg == 0 ||
+ ARM_AM::getSORegOffset(ShiftedReg.ShiftImm) == 0) &&
+ "Invalid shifted register operand!");
+ Inst.addOperand(MCOperand::CreateReg(ShiftedReg.SrcReg));
+ Inst.addOperand(MCOperand::CreateReg(ShiftedReg.ShiftReg));
+ Inst.addOperand(MCOperand::CreateImm(
+ ARM_AM::getSORegOpc(ShiftedReg.ShiftTy, ShiftedReg.ShiftImm)));
+ }
+
void addShifterOperands(MCInst &Inst, unsigned N) const {
assert(N == 1 && "Invalid number of operands!");
Inst.addOperand(MCOperand::CreateImm(
@@ -515,6 +593,31 @@ public:
addExpr(Inst, getImm());
}
+ void addImm0_255Operands(MCInst &Inst, unsigned N) const {
+ assert(N == 1 && "Invalid number of operands!");
+ addExpr(Inst, getImm());
+ }
+
+ void addImm0_7Operands(MCInst &Inst, unsigned N) const {
+ assert(N == 1 && "Invalid number of operands!");
+ addExpr(Inst, getImm());
+ }
+
+ void addImm0_15Operands(MCInst &Inst, unsigned N) const {
+ assert(N == 1 && "Invalid number of operands!");
+ addExpr(Inst, getImm());
+ }
+
+ void addImm0_65535Operands(MCInst &Inst, unsigned N) const {
+ assert(N == 1 && "Invalid number of operands!");
+ addExpr(Inst, getImm());
+ }
+
+ void addT2SOImmOperands(MCInst &Inst, unsigned N) const {
+ assert(N == 1 && "Invalid number of operands!");
+ addExpr(Inst, getImm());
+ }
+
void addMemBarrierOptOperands(MCInst &Inst, unsigned N) const {
assert(N == 1 && "Invalid number of operands!");
Inst.addOperand(MCOperand::CreateImm(unsigned(getMemBarrierOpt())));
@@ -648,7 +751,7 @@ public:
Inst.addOperand(MCOperand::CreateImm(unsigned(getProcIFlags())));
}
- virtual void dump(raw_ostream &OS) const;
+ virtual void print(raw_ostream &OS) const;
static ARMOperand *CreateCondCode(ARMCC::CondCodes CC, SMLoc S) {
ARMOperand *Op = new ARMOperand(CondCode);
@@ -699,6 +802,21 @@ public:
return Op;
}
+ static ARMOperand *CreateShiftedRegister(ARM_AM::ShiftOpc ShTy,
+ unsigned SrcReg,
+ unsigned ShiftReg,
+ unsigned ShiftImm,
+ SMLoc S, SMLoc E) {
+ ARMOperand *Op = new ARMOperand(ShiftedRegister);
+ Op->ShiftedReg.ShiftTy = ShTy;
+ Op->ShiftedReg.SrcReg = SrcReg;
+ Op->ShiftedReg.ShiftReg = ShiftReg;
+ Op->ShiftedReg.ShiftImm = ShiftImm;
+ Op->StartLoc = S;
+ Op->EndLoc = E;
+ return Op;
+ }
+
static ARMOperand *CreateShifter(ARM_AM::ShiftOpc ShTy,
SMLoc S, SMLoc E) {
ARMOperand *Op = new ARMOperand(Shifter);
@@ -802,7 +920,7 @@ public:
} // end anonymous namespace.
-void ARMOperand::dump(raw_ostream &OS) const {
+void ARMOperand::print(raw_ostream &OS) const {
switch (Kind) {
case CondCode:
OS << "<ARMCC::" << ARMCondCodeToString(getCondCode()) << ">";
@@ -863,7 +981,15 @@ void ARMOperand::dump(raw_ostream &OS) const {
OS << "<register " << getReg() << ">";
break;
case Shifter:
- OS << "<shifter " << getShiftOpcStr(Shift.ShiftTy) << ">";
+ OS << "<shifter " << ARM_AM::getShiftOpcStr(Shift.ShiftTy) << ">";
+ break;
+ case ShiftedRegister:
+ OS << "<so_reg"
+ << ShiftedReg.SrcReg
+ << ARM_AM::getShiftOpcStr(ARM_AM::getSORegShOp(ShiftedReg.ShiftImm))
+ << ", " << ShiftedReg.ShiftReg << ", "
+ << ARM_AM::getSORegOffset(ShiftedReg.ShiftImm)
+ << ">";
break;
case RegisterList:
case DPRRegisterList:
@@ -927,11 +1053,12 @@ int ARMAsmParser::TryParseRegister() {
return RegNum;
}
-/// Try to parse a register name. The token must be an Identifier when called,
-/// and if it is a register name the token is eaten and the register number is
-/// returned. Otherwise return -1.
-///
-bool ARMAsmParser::TryParseShiftRegister(
+// Try to parse a shifter (e.g., "lsl <amt>"). On success, return 0.
+// If a recoverable error occurs, return 1. If an irrecoverable error
+// occurs, return -1. An irrecoverable error is one where tokens have been
+// consumed in the process of trying to parse the shifter (i.e., when it is
+// indeed a shifter operand, but malformed).
+int ARMAsmParser::TryParseShiftRegister(
SmallVectorImpl<MCParsedAsmOperand*> &Operands) {
SMLoc S = Parser.getTok().getLoc();
const AsmToken &Tok = Parser.getTok();
@@ -948,18 +1075,69 @@ bool ARMAsmParser::TryParseShiftRegister(
.Default(ARM_AM::no_shift);
if (ShiftTy == ARM_AM::no_shift)
- return true;
-
- Parser.Lex(); // Eat shift-type operand;
- int RegNum = TryParseRegister();
- if (RegNum == -1)
- return Error(Parser.getTok().getLoc(), "register expected");
+ return 1;
+
+ Parser.Lex(); // Eat the operator.
+
+ // The source register for the shift has already been added to the
+ // operand list, so we need to pop it off and combine it into the shifted
+ // register operand instead.
+ OwningPtr<ARMOperand> PrevOp((ARMOperand*)Operands.pop_back_val());
+ if (!PrevOp->isReg())
+ return Error(PrevOp->getStartLoc(), "shift must be of a register");
+ int SrcReg = PrevOp->getReg();
+ int64_t Imm = 0;
+ int ShiftReg = 0;
+ if (ShiftTy == ARM_AM::rrx) {
+ // RRX Doesn't have an explicit shift amount. The encoder expects
+ // the shift register to be the same as the source register. Seems odd,
+ // but OK.
+ ShiftReg = SrcReg;
+ } else {
+ // Figure out if this is shifted by a constant or a register (for non-RRX).
+ if (Parser.getTok().is(AsmToken::Hash)) {
+ Parser.Lex(); // Eat hash.
+ SMLoc ImmLoc = Parser.getTok().getLoc();
+ const MCExpr *ShiftExpr = 0;
+ if (getParser().ParseExpression(ShiftExpr)) {
+ Error(ImmLoc, "invalid immediate shift value");
+ return -1;
+ }
+ // The expression must be evaluatable as an immediate.
+ const MCConstantExpr *CE = dyn_cast<MCConstantExpr>(ShiftExpr);
+ if (!CE) {
+ Error(ImmLoc, "invalid immediate shift value");
+ return -1;
+ }
+ // Range check the immediate.
+ // lsl, ror: 0 <= imm <= 31
+ // lsr, asr: 0 <= imm <= 32
+ Imm = CE->getValue();
+ if (Imm < 0 ||
+ ((ShiftTy == ARM_AM::lsl || ShiftTy == ARM_AM::ror) && Imm > 31) ||
+ ((ShiftTy == ARM_AM::lsr || ShiftTy == ARM_AM::asr) && Imm > 32)) {
+ Error(ImmLoc, "immediate shift value out of range");
+ return -1;
+ }
+ } else if (Parser.getTok().is(AsmToken::Identifier)) {
+ ShiftReg = TryParseRegister();
+ SMLoc L = Parser.getTok().getLoc();
+ if (ShiftReg == -1) {
+ Error (L, "expected immediate or register in shift operand");
+ return -1;
+ }
+ } else {
+ Error (Parser.getTok().getLoc(),
+ "expected immediate or register in shift operand");
+ return -1;
+ }
+ }
- Operands.push_back(ARMOperand::CreateReg(RegNum,S, Parser.getTok().getLoc()));
- Operands.push_back(ARMOperand::CreateShifter(ShiftTy,
+ Operands.push_back(ARMOperand::CreateShiftedRegister(ShiftTy, SrcReg,
+ ShiftReg, Imm,
S, Parser.getTok().getLoc()));
- return false;
+ return 0;
}
@@ -1162,10 +1340,14 @@ tryParseMemBarrierOptOperand(SmallVectorImpl<MCParsedAsmOperand*> &Operands) {
unsigned Opt = StringSwitch<unsigned>(OptStr.slice(0, OptStr.size()))
.Case("sy", ARM_MB::SY)
.Case("st", ARM_MB::ST)
+ .Case("sh", ARM_MB::ISH)
.Case("ish", ARM_MB::ISH)
+ .Case("shst", ARM_MB::ISHST)
.Case("ishst", ARM_MB::ISHST)
.Case("nsh", ARM_MB::NSH)
+ .Case("un", ARM_MB::NSH)
.Case("nshst", ARM_MB::NSHST)
+ .Case("unst", ARM_MB::NSHST)
.Case("osh", ARM_MB::OSH)
.Case("oshst", ARM_MB::OSHST)
.Default(~0U);
@@ -1604,15 +1786,18 @@ bool ARMAsmParser::ParseOperand(SmallVectorImpl<MCParsedAsmOperand*> &Operands,
default:
Error(Parser.getTok().getLoc(), "unexpected token in operand");
return true;
- case AsmToken::Identifier:
+ case AsmToken::Identifier: {
if (!TryParseRegisterWithWriteBack(Operands))
return false;
- if (!TryParseShiftRegister(Operands))
+ int Res = TryParseShiftRegister(Operands);
+ if (Res == 0) // success
return false;
-
+ else if (Res == -1) // irrecoverable error
+ return true;
// Fall though for the Identifier case that is not a register or a
// special name.
+ }
case AsmToken::Integer: // things like 1f and 2b as a branch targets
case AsmToken::Dot: { // . as a branch target
// This was not a register so parse other operands that start with an
@@ -1761,30 +1946,35 @@ static StringRef SplitMnemonic(StringRef Mnemonic,
Mnemonic == "vcle" ||
(Mnemonic == "smlal" || Mnemonic == "umaal" || Mnemonic == "umlal" ||
Mnemonic == "vabal" || Mnemonic == "vmlal" || Mnemonic == "vpadal" ||
- Mnemonic == "vqdmlal"))
+ Mnemonic == "vqdmlal" || Mnemonic == "bics"))
return Mnemonic;
- // First, split out any predication code.
- unsigned CC = StringSwitch<unsigned>(Mnemonic.substr(Mnemonic.size()-2))
- .Case("eq", ARMCC::EQ)
- .Case("ne", ARMCC::NE)
- .Case("hs", ARMCC::HS)
- .Case("lo", ARMCC::LO)
- .Case("mi", ARMCC::MI)
- .Case("pl", ARMCC::PL)
- .Case("vs", ARMCC::VS)
- .Case("vc", ARMCC::VC)
- .Case("hi", ARMCC::HI)
- .Case("ls", ARMCC::LS)
- .Case("ge", ARMCC::GE)
- .Case("lt", ARMCC::LT)
- .Case("gt", ARMCC::GT)
- .Case("le", ARMCC::LE)
- .Case("al", ARMCC::AL)
- .Default(~0U);
- if (CC != ~0U) {
- Mnemonic = Mnemonic.slice(0, Mnemonic.size() - 2);
- PredicationCode = CC;
+ // First, split out any predication code. Ignore mnemonics we know aren't
+ // predicated but do have a carry-set and so weren't caught above.
+ if (Mnemonic != "adcs") {
+ unsigned CC = StringSwitch<unsigned>(Mnemonic.substr(Mnemonic.size()-2))
+ .Case("eq", ARMCC::EQ)
+ .Case("ne", ARMCC::NE)
+ .Case("hs", ARMCC::HS)
+ .Case("cs", ARMCC::HS)
+ .Case("lo", ARMCC::LO)
+ .Case("cc", ARMCC::LO)
+ .Case("mi", ARMCC::MI)
+ .Case("pl", ARMCC::PL)
+ .Case("vs", ARMCC::VS)
+ .Case("vc", ARMCC::VC)
+ .Case("hi", ARMCC::HI)
+ .Case("ls", ARMCC::LS)
+ .Case("ge", ARMCC::GE)
+ .Case("lt", ARMCC::LT)
+ .Case("gt", ARMCC::GT)
+ .Case("le", ARMCC::LE)
+ .Case("al", ARMCC::AL)
+ .Default(~0U);
+ if (CC != ~0U) {
+ Mnemonic = Mnemonic.slice(0, Mnemonic.size() - 2);
+ PredicationCode = CC;
+ }
}
// Next, determine if we have a carry setting bit. We explicitly ignore all
@@ -1824,8 +2014,6 @@ static StringRef SplitMnemonic(StringRef Mnemonic,
void ARMAsmParser::
GetMnemonicAcceptInfo(StringRef Mnemonic, bool &CanAcceptCarrySet,
bool &CanAcceptPredicationCode) {
- bool isThumb = TM.getSubtarget<ARMSubtarget>().isThumb();
-
if (Mnemonic == "and" || Mnemonic == "lsl" || Mnemonic == "lsr" ||
Mnemonic == "rrx" || Mnemonic == "ror" || Mnemonic == "sub" ||
Mnemonic == "smull" || Mnemonic == "add" || Mnemonic == "adc" ||
@@ -1834,7 +2022,7 @@ GetMnemonicAcceptInfo(StringRef Mnemonic, bool &CanAcceptCarrySet,
Mnemonic == "rsb" || Mnemonic == "rsc" || Mnemonic == "orn" ||
Mnemonic == "sbc" || Mnemonic == "mla" || Mnemonic == "umull" ||
Mnemonic == "eor" || Mnemonic == "smlal" ||
- (Mnemonic == "mov" && !isThumb)) {
+ (Mnemonic == "mov" && !isThumbOne())) {
CanAcceptCarrySet = true;
} else {
CanAcceptCarrySet = false;
@@ -1851,10 +2039,9 @@ GetMnemonicAcceptInfo(StringRef Mnemonic, bool &CanAcceptCarrySet,
CanAcceptPredicationCode = true;
}
- if (isThumb)
+ if (isThumb())
if (Mnemonic == "bkpt" || Mnemonic == "mcr" || Mnemonic == "mcrr" ||
- Mnemonic == "mrc" || Mnemonic == "mrrc" || Mnemonic == "cdp" ||
- Mnemonic == "mov")
+ Mnemonic == "mrc" || Mnemonic == "mrrc" || Mnemonic == "cdp")
CanAcceptPredicationCode = false;
}
@@ -1884,20 +2071,22 @@ bool ARMAsmParser::ParseInstruction(StringRef Name, SMLoc NameLoc,
bool CanAcceptCarrySet, CanAcceptPredicationCode;
GetMnemonicAcceptInfo(Head, CanAcceptCarrySet, CanAcceptPredicationCode);
+ // If we had a carry-set on an instruction that can't do that, issue an
+ // error.
+ if (!CanAcceptCarrySet && CarrySetting) {
+ Parser.EatToEndOfStatement();
+ return Error(NameLoc, "instruction '" + Head +
+ "' can not set flags, but 's' suffix specified");
+ }
+
// Add the carry setting operand, if necessary.
//
// FIXME: It would be awesome if we could somehow invent a location such that
// match errors on this operand would print a nice diagnostic about how the
// 's' character in the mnemonic resulted in a CCOut operand.
- if (CanAcceptCarrySet) {
+ if (CanAcceptCarrySet)
Operands.push_back(ARMOperand::CreateCCOut(CarrySetting ? ARM::CPSR : 0,
NameLoc));
- } else {
- // This mnemonic can't ever accept a carry set, but the user wrote one (or
- // misspelled another mnemonic).
-
- // FIXME: Issue a nice error.
- }
// Add the predication code operand, if necessary.
if (CanAcceptPredicationCode) {
@@ -1988,7 +2177,7 @@ MatchAndEmitInstruction(SMLoc IDLoc,
// that updates the condition codes if it ends in 's'. So see if the
// mnemonic ends in 's' and if so try removing the 's' and adding a CCOut
// operand with a value of CPSR.
- else if(MatchResult == Match_MnemonicFail) {
+ else if (MatchResult == Match_MnemonicFail) {
// Get the instruction mnemonic, which is the first token.
StringRef Mnemonic = ((ARMOperand*)Operands[0])->getToken();
if (Mnemonic.substr(Mnemonic.size()-1) == "s") {
@@ -2174,20 +2363,15 @@ bool ARMAsmParser::ParseDirectiveCode(SMLoc L) {
return Error(Parser.getTok().getLoc(), "unexpected token in directive");
Parser.Lex();
- // FIXME: We need to be able switch subtargets at this point so that
- // MatchInstructionImpl() will work when it gets the AvailableFeatures which
- // includes Feature_IsThumb or not to match the right instructions. This is
- // blocked on the FIXME in llvm-mc.cpp when creating the TargetMachine.
- if (Val == 16){
- assert(TM.getSubtarget<ARMSubtarget>().isThumb() &&
- "switching between arm/thumb not yet suppported via .code 16)");
+ if (Val == 16) {
+ if (!isThumb())
+ SwitchMode();
getParser().getStreamer().EmitAssemblerFlag(MCAF_Code16);
- }
- else{
- assert(!TM.getSubtarget<ARMSubtarget>().isThumb() &&
- "switching between thumb/arm not yet suppported via .code 32)");
+ } else {
+ if (isThumb())
+ SwitchMode();
getParser().getStreamer().EmitAssemblerFlag(MCAF_Code32);
- }
+ }
return false;
}
diff --git a/contrib/llvm/lib/Target/ARM/Disassembler/ARMDisassemblerCore.cpp b/contrib/llvm/lib/Target/ARM/Disassembler/ARMDisassemblerCore.cpp
index 271ca8c..d89c80a 100644
--- a/contrib/llvm/lib/Target/ARM/Disassembler/ARMDisassemblerCore.cpp
+++ b/contrib/llvm/lib/Target/ARM/Disassembler/ARMDisassemblerCore.cpp
@@ -24,8 +24,8 @@
//#define DEBUG(X) do { X; } while (0)
/// ARMGenInstrInfo.inc - ARMGenInstrInfo.inc contains the static const
-/// TargetInstrDesc ARMInsts[] definition and the TargetOperandInfo[]'s
-/// describing the operand info for each ARMInsts[i].
+/// MCInstrDesc ARMInsts[] definition and the MCOperandInfo[]'s describing the
+/// operand info for each ARMInsts[i].
///
/// Together with an instruction's encoding format, we can take advantage of the
/// NumOperands and the OpInfo fields of the target instruction description in
@@ -46,10 +46,10 @@
/// dag DefaultOps = (ops (i32 14), (i32 zero_reg));
/// }
///
-/// which is manifested by the TargetOperandInfo[] of:
+/// which is manifested by the MCOperandInfo[] of:
///
-/// { 0, 0|(1<<TOI::Predicate), 0 },
-/// { ARM::CCRRegClassID, 0|(1<<TOI::Predicate), 0 }
+/// { 0, 0|(1<<MCOI::Predicate), 0 },
+/// { ARM::CCRRegClassID, 0|(1<<MCOI::Predicate), 0 }
///
/// So the first predicate MCOperand corresponds to the immediate part of the
/// ARM condition field (Inst{31-28}), and the second predicate MCOperand
@@ -66,12 +66,14 @@
/// dag DefaultOps = (ops (i32 zero_reg));
/// }
///
-/// which is manifested by the one TargetOperandInfo of:
+/// which is manifested by the one MCOperandInfo of:
///
-/// { ARM::CCRRegClassID, 0|(1<<TOI::OptionalDef), 0 }
+/// { ARM::CCRRegClassID, 0|(1<<MCOI::OptionalDef), 0 }
///
-/// And this maps to one MCOperand with the regsiter kind of ARM::CPSR.
-#include "ARMGenInstrInfo.inc"
+
+namespace llvm {
+extern MCInstrDesc ARMInsts[];
+}
using namespace llvm;
@@ -588,9 +590,9 @@ static bool BadRegsMulFrm(unsigned Opcode, uint32_t insn) {
static bool DisassembleMulFrm(MCInst &MI, unsigned Opcode, uint32_t insn,
unsigned short NumOps, unsigned &NumOpsAdded, BO B) {
- const TargetInstrDesc &TID = ARMInsts[Opcode];
- unsigned short NumDefs = TID.getNumDefs();
- const TargetOperandInfo *OpInfo = TID.OpInfo;
+ const MCInstrDesc &MCID = ARMInsts[Opcode];
+ unsigned short NumDefs = MCID.getNumDefs();
+ const MCOperandInfo *OpInfo = MCID.OpInfo;
unsigned &OpIdx = NumOpsAdded;
OpIdx = 0;
@@ -739,9 +741,9 @@ static bool DisassembleCoprocessor(MCInst &MI, unsigned Opcode, uint32_t insn,
if (PW) {
MI.addOperand(MCOperand::CreateReg(0));
ARM_AM::AddrOpc AddrOpcode = getUBit(insn) ? ARM_AM::add : ARM_AM::sub;
- const TargetInstrDesc &TID = ARMInsts[Opcode];
+ const MCInstrDesc &MCID = ARMInsts[Opcode];
unsigned IndexMode =
- (TID.TSFlags & ARMII::IndexModeMask) >> ARMII::IndexModeShift;
+ (MCID.TSFlags & ARMII::IndexModeMask) >> ARMII::IndexModeShift;
unsigned Offset = ARM_AM::getAM2Opc(AddrOpcode, slice(insn, 7, 0) << 2,
ARM_AM::no_shift, IndexMode);
MI.addOperand(MCOperand::CreateImm(Offset));
@@ -802,7 +804,7 @@ static bool DisassembleBrFrm(MCInst &MI, unsigned Opcode, uint32_t insn,
if (CoprocessorOpcode(Opcode))
return DisassembleCoprocessor(MI, Opcode, insn, NumOps, NumOpsAdded, B);
- const TargetOperandInfo *OpInfo = ARMInsts[Opcode].OpInfo;
+ const MCOperandInfo *OpInfo = ARMInsts[Opcode].OpInfo;
if (!OpInfo) return false;
// MRS and MRSsys take one GPR reg Rd.
@@ -901,7 +903,7 @@ static bool DisassembleBrFrm(MCInst &MI, unsigned Opcode, uint32_t insn,
static bool DisassembleBrMiscFrm(MCInst &MI, unsigned Opcode, uint32_t insn,
unsigned short NumOps, unsigned &NumOpsAdded, BO B) {
- const TargetOperandInfo *OpInfo = ARMInsts[Opcode].OpInfo;
+ const MCOperandInfo *OpInfo = ARMInsts[Opcode].OpInfo;
if (!OpInfo) return false;
unsigned &OpIdx = NumOpsAdded;
@@ -976,10 +978,10 @@ static bool BadRegsDPFrm(unsigned Opcode, uint32_t insn) {
static bool DisassembleDPFrm(MCInst &MI, unsigned Opcode, uint32_t insn,
unsigned short NumOps, unsigned &NumOpsAdded, BO B) {
- const TargetInstrDesc &TID = ARMInsts[Opcode];
- unsigned short NumDefs = TID.getNumDefs();
- bool isUnary = isUnaryDP(TID.TSFlags);
- const TargetOperandInfo *OpInfo = TID.OpInfo;
+ const MCInstrDesc &MCID = ARMInsts[Opcode];
+ unsigned short NumDefs = MCID.getNumDefs();
+ bool isUnary = isUnaryDP(MCID.TSFlags);
+ const MCOperandInfo *OpInfo = MCID.OpInfo;
unsigned &OpIdx = NumOpsAdded;
OpIdx = 0;
@@ -1041,7 +1043,7 @@ static bool DisassembleDPFrm(MCInst &MI, unsigned Opcode, uint32_t insn,
}
// If this is a two-address operand, skip it, e.g., MOVCCr operand 1.
- if (isUnary && (TID.getOperandConstraint(OpIdx, TOI::TIED_TO) != -1)) {
+ if (isUnary && (MCID.getOperandConstraint(OpIdx, MCOI::TIED_TO) != -1)) {
MI.addOperand(MCOperand::CreateReg(0));
++OpIdx;
}
@@ -1089,10 +1091,10 @@ static bool DisassembleDPFrm(MCInst &MI, unsigned Opcode, uint32_t insn,
static bool DisassembleDPSoRegFrm(MCInst &MI, unsigned Opcode, uint32_t insn,
unsigned short NumOps, unsigned &NumOpsAdded, BO B) {
- const TargetInstrDesc &TID = ARMInsts[Opcode];
- unsigned short NumDefs = TID.getNumDefs();
- bool isUnary = isUnaryDP(TID.TSFlags);
- const TargetOperandInfo *OpInfo = TID.OpInfo;
+ const MCInstrDesc &MCID = ARMInsts[Opcode];
+ unsigned short NumDefs = MCID.getNumDefs();
+ bool isUnary = isUnaryDP(MCID.TSFlags);
+ const MCOperandInfo *OpInfo = MCID.OpInfo;
unsigned &OpIdx = NumOpsAdded;
OpIdx = 0;
@@ -1118,7 +1120,7 @@ static bool DisassembleDPSoRegFrm(MCInst &MI, unsigned Opcode, uint32_t insn,
}
// If this is a two-address operand, skip it, e.g., MOVCCs operand 1.
- if (isUnary && (TID.getOperandConstraint(OpIdx, TOI::TIED_TO) != -1)) {
+ if (isUnary && (MCID.getOperandConstraint(OpIdx, MCOI::TIED_TO) != -1)) {
MI.addOperand(MCOperand::CreateReg(0));
++OpIdx;
}
@@ -1244,17 +1246,17 @@ static bool BadRegsLdStFrm(unsigned Opcode, uint32_t insn, bool Store, bool WBac
static bool DisassembleLdStFrm(MCInst &MI, unsigned Opcode, uint32_t insn,
unsigned short NumOps, unsigned &NumOpsAdded, bool isStore, BO B) {
- const TargetInstrDesc &TID = ARMInsts[Opcode];
- bool isPrePost = isPrePostLdSt(TID.TSFlags);
- const TargetOperandInfo *OpInfo = TID.OpInfo;
+ const MCInstrDesc &MCID = ARMInsts[Opcode];
+ bool isPrePost = isPrePostLdSt(MCID.TSFlags);
+ const MCOperandInfo *OpInfo = MCID.OpInfo;
if (!OpInfo) return false;
unsigned &OpIdx = NumOpsAdded;
OpIdx = 0;
- assert(((!isStore && TID.getNumDefs() > 0) ||
- (isStore && (TID.getNumDefs() == 0 || isPrePost)))
+ assert(((!isStore && MCID.getNumDefs() > 0) ||
+ (isStore && (MCID.getNumDefs() == 0 || isPrePost)))
&& "Invalid arguments");
// Operand 0 of a pre- and post-indexed store is the address base writeback.
@@ -1291,7 +1293,7 @@ static bool DisassembleLdStFrm(MCInst &MI, unsigned Opcode, uint32_t insn,
assert(OpInfo[OpIdx].RegClass == ARM::GPRRegClassID &&
"Reg operand expected");
- assert((!isPrePost || (TID.getOperandConstraint(OpIdx, TOI::TIED_TO) != -1))
+ assert((!isPrePost || (MCID.getOperandConstraint(OpIdx, MCOI::TIED_TO) != -1))
&& "Index mode or tied_to operand expected");
MI.addOperand(MCOperand::CreateReg(getRegisterEnum(B, ARM::GPRRegClassID,
decodeRn(insn))));
@@ -1308,7 +1310,7 @@ static bool DisassembleLdStFrm(MCInst &MI, unsigned Opcode, uint32_t insn,
ARM_AM::AddrOpc AddrOpcode = getUBit(insn) ? ARM_AM::add : ARM_AM::sub;
unsigned IndexMode =
- (TID.TSFlags & ARMII::IndexModeMask) >> ARMII::IndexModeShift;
+ (MCID.TSFlags & ARMII::IndexModeMask) >> ARMII::IndexModeShift;
if (getIBit(insn) == 0) {
// For pre- and post-indexed case, add a reg0 operand (Addressing Mode #2).
// Otherwise, skip the reg operand since for addrmode_imm12, Rn has already
@@ -1379,17 +1381,17 @@ static bool HasDualReg(unsigned Opcode) {
static bool DisassembleLdStMiscFrm(MCInst &MI, unsigned Opcode, uint32_t insn,
unsigned short NumOps, unsigned &NumOpsAdded, bool isStore, BO B) {
- const TargetInstrDesc &TID = ARMInsts[Opcode];
- bool isPrePost = isPrePostLdSt(TID.TSFlags);
- const TargetOperandInfo *OpInfo = TID.OpInfo;
+ const MCInstrDesc &MCID = ARMInsts[Opcode];
+ bool isPrePost = isPrePostLdSt(MCID.TSFlags);
+ const MCOperandInfo *OpInfo = MCID.OpInfo;
if (!OpInfo) return false;
unsigned &OpIdx = NumOpsAdded;
OpIdx = 0;
- assert(((!isStore && TID.getNumDefs() > 0) ||
- (isStore && (TID.getNumDefs() == 0 || isPrePost)))
+ assert(((!isStore && MCID.getNumDefs() > 0) ||
+ (isStore && (MCID.getNumDefs() == 0 || isPrePost)))
&& "Invalid arguments");
// Operand 0 of a pre- and post-indexed store is the address base writeback.
@@ -1433,7 +1435,7 @@ static bool DisassembleLdStMiscFrm(MCInst &MI, unsigned Opcode, uint32_t insn,
assert(OpInfo[OpIdx].RegClass == ARM::GPRRegClassID &&
"Reg operand expected");
- assert((!isPrePost || (TID.getOperandConstraint(OpIdx, TOI::TIED_TO) != -1))
+ assert((!isPrePost || (MCID.getOperandConstraint(OpIdx, MCOI::TIED_TO) != -1))
&& "Offset mode or tied_to operand expected");
MI.addOperand(MCOperand::CreateReg(getRegisterEnum(B, ARM::GPRRegClassID,
decodeRn(insn))));
@@ -1451,7 +1453,7 @@ static bool DisassembleLdStMiscFrm(MCInst &MI, unsigned Opcode, uint32_t insn,
ARM_AM::AddrOpc AddrOpcode = getUBit(insn) ? ARM_AM::add : ARM_AM::sub;
unsigned IndexMode =
- (TID.TSFlags & ARMII::IndexModeMask) >> ARMII::IndexModeShift;
+ (MCID.TSFlags & ARMII::IndexModeMask) >> ARMII::IndexModeShift;
if (getAM3IBit(insn) == 1) {
MI.addOperand(MCOperand::CreateReg(0));
@@ -1539,7 +1541,7 @@ static bool DisassembleLdStMulFrm(MCInst &MI, unsigned Opcode, uint32_t insn,
static bool DisassembleLdStExFrm(MCInst &MI, unsigned Opcode, uint32_t insn,
unsigned short NumOps, unsigned &NumOpsAdded, BO B) {
- const TargetOperandInfo *OpInfo = ARMInsts[Opcode].OpInfo;
+ const MCOperandInfo *OpInfo = ARMInsts[Opcode].OpInfo;
if (!OpInfo) return false;
unsigned &OpIdx = NumOpsAdded;
@@ -1591,7 +1593,7 @@ static bool DisassembleLdStExFrm(MCInst &MI, unsigned Opcode, uint32_t insn,
static bool DisassembleArithMiscFrm(MCInst &MI, unsigned Opcode, uint32_t insn,
unsigned short NumOps, unsigned &NumOpsAdded, BO B) {
- const TargetOperandInfo *OpInfo = ARMInsts[Opcode].OpInfo;
+ const MCOperandInfo *OpInfo = ARMInsts[Opcode].OpInfo;
unsigned &OpIdx = NumOpsAdded;
OpIdx = 0;
@@ -1653,8 +1655,8 @@ static bool DisassembleSatFrm(MCInst &MI, unsigned Opcode, uint32_t insn,
if (decodeRd(insn) == 15 || decodeRm(insn) == 15)
return false;
- const TargetInstrDesc &TID = ARMInsts[Opcode];
- NumOpsAdded = TID.getNumOperands() - 2; // ignore predicate operands
+ const MCInstrDesc &MCID = ARMInsts[Opcode];
+ NumOpsAdded = MCID.getNumOperands() - 2; // ignore predicate operands
// Disassemble register def.
MI.addOperand(MCOperand::CreateReg(getRegisterEnum(B, ARM::GPRRegClassID,
@@ -1696,7 +1698,7 @@ static bool DisassembleExtFrm(MCInst &MI, unsigned Opcode, uint32_t insn,
if (decodeRd(insn) == 15 || decodeRm(insn) == 15)
return false;
- const TargetOperandInfo *OpInfo = ARMInsts[Opcode].OpInfo;
+ const MCOperandInfo *OpInfo = ARMInsts[Opcode].OpInfo;
unsigned &OpIdx = NumOpsAdded;
OpIdx = 0;
@@ -1802,7 +1804,7 @@ static bool DisassembleVFPUnaryFrm(MCInst &MI, unsigned Opcode, uint32_t insn,
assert(NumOps >= 1 && "VFPUnaryFrm expects NumOps >= 1");
- const TargetOperandInfo *OpInfo = ARMInsts[Opcode].OpInfo;
+ const MCOperandInfo *OpInfo = ARMInsts[Opcode].OpInfo;
unsigned &OpIdx = NumOpsAdded;
OpIdx = 0;
@@ -1842,8 +1844,8 @@ static bool DisassembleVFPBinaryFrm(MCInst &MI, unsigned Opcode, uint32_t insn,
assert(NumOps >= 3 && "VFPBinaryFrm expects NumOps >= 3");
- const TargetInstrDesc &TID = ARMInsts[Opcode];
- const TargetOperandInfo *OpInfo = TID.OpInfo;
+ const MCInstrDesc &MCID = ARMInsts[Opcode];
+ const MCOperandInfo *OpInfo = MCID.OpInfo;
unsigned &OpIdx = NumOpsAdded;
OpIdx = 0;
@@ -1858,7 +1860,7 @@ static bool DisassembleVFPBinaryFrm(MCInst &MI, unsigned Opcode, uint32_t insn,
++OpIdx;
// Skip tied_to operand constraint.
- if (TID.getOperandConstraint(OpIdx, TOI::TIED_TO) != -1) {
+ if (MCID.getOperandConstraint(OpIdx, MCOI::TIED_TO) != -1) {
assert(NumOps >= 4 && "Expect >=4 operands");
MI.addOperand(MCOperand::CreateReg(0));
++OpIdx;
@@ -1886,8 +1888,8 @@ static bool DisassembleVFPConv1Frm(MCInst &MI, unsigned Opcode, uint32_t insn,
assert(NumOps >= 2 && "VFPConv1Frm expects NumOps >= 2");
- const TargetInstrDesc &TID = ARMInsts[Opcode];
- const TargetOperandInfo *OpInfo = TID.OpInfo;
+ const MCInstrDesc &MCID = ARMInsts[Opcode];
+ const MCOperandInfo *OpInfo = MCID.OpInfo;
if (!OpInfo) return false;
bool SP = slice(insn, 8, 8) == 0; // A8.6.295 & A8.6.297
@@ -1903,7 +1905,7 @@ static bool DisassembleVFPConv1Frm(MCInst &MI, unsigned Opcode, uint32_t insn,
getRegisterEnum(B, RegClassID,
decodeVFPRd(insn, SP))));
- assert(TID.getOperandConstraint(1, TOI::TIED_TO) != -1 &&
+ assert(MCID.getOperandConstraint(1, MCOI::TIED_TO) != -1 &&
"Tied to operand expected");
MI.addOperand(MI.getOperand(0));
@@ -1961,7 +1963,7 @@ static bool DisassembleVFPConv3Frm(MCInst &MI, unsigned Opcode, uint32_t insn,
assert(NumOps >= 3 && "VFPConv3Frm expects NumOps >= 3");
- const TargetOperandInfo *OpInfo = ARMInsts[Opcode].OpInfo;
+ const MCOperandInfo *OpInfo = ARMInsts[Opcode].OpInfo;
unsigned &OpIdx = NumOpsAdded;
MI.addOperand(MCOperand::CreateReg(getRegisterEnum(B, ARM::GPRRegClassID,
@@ -2011,7 +2013,7 @@ static bool DisassembleVFPConv5Frm(MCInst &MI, unsigned Opcode, uint32_t insn,
assert(NumOps >= 3 && "VFPConv5Frm expects NumOps >= 3");
- const TargetOperandInfo *OpInfo = ARMInsts[Opcode].OpInfo;
+ const MCOperandInfo *OpInfo = ARMInsts[Opcode].OpInfo;
unsigned &OpIdx = NumOpsAdded;
OpIdx = 0;
@@ -2136,7 +2138,7 @@ static bool DisassembleVFPLdStMulFrm(MCInst &MI, unsigned Opcode, uint32_t insn,
static bool DisassembleVFPMiscFrm(MCInst &MI, unsigned Opcode, uint32_t insn,
unsigned short NumOps, unsigned &NumOpsAdded, BO B) {
- const TargetOperandInfo *OpInfo = ARMInsts[Opcode].OpInfo;
+ const MCOperandInfo *OpInfo = ARMInsts[Opcode].OpInfo;
unsigned &OpIdx = NumOpsAdded;
OpIdx = 0;
@@ -2402,8 +2404,8 @@ static bool DisassembleNLdSt0(MCInst &MI, unsigned Opcode, uint32_t insn,
unsigned short NumOps, unsigned &NumOpsAdded, bool Store, bool DblSpaced,
unsigned alignment, BO B) {
- const TargetInstrDesc &TID = ARMInsts[Opcode];
- const TargetOperandInfo *OpInfo = TID.OpInfo;
+ const MCInstrDesc &MCID = ARMInsts[Opcode];
+ const MCOperandInfo *OpInfo = MCID.OpInfo;
// At least one DPR register plus addressing mode #6.
assert(NumOps >= 3 && "Expect >= 3 operands");
@@ -2507,7 +2509,7 @@ static bool DisassembleNLdSt0(MCInst &MI, unsigned Opcode, uint32_t insn,
}
while (OpIdx < NumOps && (unsigned)OpInfo[OpIdx].RegClass == RegClass) {
- assert(TID.getOperandConstraint(OpIdx, TOI::TIED_TO) != -1 &&
+ assert(MCID.getOperandConstraint(OpIdx, MCOI::TIED_TO) != -1 &&
"Tied to operand expected");
MI.addOperand(MCOperand::CreateReg(0));
++OpIdx;
@@ -2757,8 +2759,8 @@ static bool DisassembleNLdSt(MCInst &MI, unsigned Opcode, uint32_t insn,
static bool DisassembleN1RegModImmFrm(MCInst &MI, unsigned Opcode,
uint32_t insn, unsigned short NumOps, unsigned &NumOpsAdded, BO B) {
- const TargetInstrDesc &TID = ARMInsts[Opcode];
- const TargetOperandInfo *OpInfo = TID.OpInfo;
+ const MCInstrDesc &MCID = ARMInsts[Opcode];
+ const MCOperandInfo *OpInfo = MCID.OpInfo;
assert(NumOps >= 2 &&
(OpInfo[0].RegClass == ARM::DPRRegClassID ||
@@ -2848,8 +2850,8 @@ enum N2VFlag {
static bool DisassembleNVdVmOptImm(MCInst &MI, unsigned Opc, uint32_t insn,
unsigned short NumOps, unsigned &NumOpsAdded, N2VFlag Flag, BO B) {
- const TargetInstrDesc &TID = ARMInsts[Opc];
- const TargetOperandInfo *OpInfo = TID.OpInfo;
+ const MCInstrDesc &MCID = ARMInsts[Opc];
+ const MCOperandInfo *OpInfo = MCID.OpInfo;
assert(NumOps >= 2 &&
(OpInfo[0].RegClass == ARM::DPRRegClassID ||
@@ -2878,7 +2880,7 @@ static bool DisassembleNVdVmOptImm(MCInst &MI, unsigned Opc, uint32_t insn,
++OpIdx;
// VPADAL...
- if (TID.getOperandConstraint(OpIdx, TOI::TIED_TO) != -1) {
+ if (MCID.getOperandConstraint(OpIdx, MCOI::TIED_TO) != -1) {
// TIED_TO operand.
MI.addOperand(MCOperand::CreateReg(0));
++OpIdx;
@@ -2892,7 +2894,7 @@ static bool DisassembleNVdVmOptImm(MCInst &MI, unsigned Opc, uint32_t insn,
// VZIP and others have two TIED_TO reg operands.
int Idx;
while (OpIdx < NumOps &&
- (Idx = TID.getOperandConstraint(OpIdx, TOI::TIED_TO)) != -1) {
+ (Idx = MCID.getOperandConstraint(OpIdx, MCOI::TIED_TO)) != -1) {
// Add TIED_TO operand.
MI.addOperand(MI.getOperand(Idx));
++OpIdx;
@@ -2945,8 +2947,8 @@ static bool DisassembleNVecDupLnFrm(MCInst &MI, unsigned Opc, uint32_t insn,
static bool DisassembleNVectorShift(MCInst &MI, unsigned Opcode, uint32_t insn,
unsigned short NumOps, unsigned &NumOpsAdded, bool LeftShift, BO B) {
- const TargetInstrDesc &TID = ARMInsts[Opcode];
- const TargetOperandInfo *OpInfo = TID.OpInfo;
+ const MCInstrDesc &MCID = ARMInsts[Opcode];
+ const MCOperandInfo *OpInfo = MCID.OpInfo;
assert(NumOps >= 3 &&
(OpInfo[0].RegClass == ARM::DPRRegClassID ||
@@ -2964,7 +2966,7 @@ static bool DisassembleNVectorShift(MCInst &MI, unsigned Opcode, uint32_t insn,
decodeNEONRd(insn))));
++OpIdx;
- if (TID.getOperandConstraint(OpIdx, TOI::TIED_TO) != -1) {
+ if (MCID.getOperandConstraint(OpIdx, MCOI::TIED_TO) != -1) {
// TIED_TO operand.
MI.addOperand(MCOperand::CreateReg(0));
++OpIdx;
@@ -3044,8 +3046,8 @@ enum N3VFlag {
static bool DisassembleNVdVnVmOptImm(MCInst &MI, unsigned Opcode, uint32_t insn,
unsigned short NumOps, unsigned &NumOpsAdded, N3VFlag Flag, BO B) {
- const TargetInstrDesc &TID = ARMInsts[Opcode];
- const TargetOperandInfo *OpInfo = TID.OpInfo;
+ const MCInstrDesc &MCID = ARMInsts[Opcode];
+ const MCOperandInfo *OpInfo = MCID.OpInfo;
// No checking for OpInfo[2] because of MOVDneon/MOVQ with only two regs.
assert(NumOps >= 3 &&
@@ -3076,7 +3078,7 @@ static bool DisassembleNVdVnVmOptImm(MCInst &MI, unsigned Opcode, uint32_t insn,
++OpIdx;
// VABA, VABAL, VBSLd, VBSLq, ...
- if (TID.getOperandConstraint(OpIdx, TOI::TIED_TO) != -1) {
+ if (MCID.getOperandConstraint(OpIdx, MCOI::TIED_TO) != -1) {
// TIED_TO operand.
MI.addOperand(MCOperand::CreateReg(0));
++OpIdx;
@@ -3091,11 +3093,6 @@ static bool DisassembleNVdVnVmOptImm(MCInst &MI, unsigned Opcode, uint32_t insn,
: decodeNEONRm(insn))));
++OpIdx;
- // Special case handling for VMOVDneon and VMOVQ because they are marked as
- // N3RegFrm.
- if (Opcode == ARM::VMOVDneon || Opcode == ARM::VMOVQ)
- return true;
-
// Dm = Inst{5:3-0} => NEON Rm
// or
// Dm is restricted to D0-D7 if size is 16, D0-D15 otherwise
@@ -3163,8 +3160,8 @@ static bool DisassembleNVecMulScalarFrm(MCInst &MI, unsigned Opcode,
static bool DisassembleNVTBLFrm(MCInst &MI, unsigned Opcode, uint32_t insn,
unsigned short NumOps, unsigned &NumOpsAdded, BO B) {
- const TargetInstrDesc &TID = ARMInsts[Opcode];
- const TargetOperandInfo *OpInfo = TID.OpInfo;
+ const MCInstrDesc &MCID = ARMInsts[Opcode];
+ const MCOperandInfo *OpInfo = MCID.OpInfo;
if (!OpInfo) return false;
assert(NumOps >= 3 &&
@@ -3192,7 +3189,7 @@ static bool DisassembleNVTBLFrm(MCInst &MI, unsigned Opcode, uint32_t insn,
// Process tied_to operand constraint.
int Idx;
- if ((Idx = TID.getOperandConstraint(OpIdx, TOI::TIED_TO)) != -1) {
+ if ((Idx = MCID.getOperandConstraint(OpIdx, MCOI::TIED_TO)) != -1) {
MI.addOperand(MI.getOperand(Idx));
++OpIdx;
}
@@ -3221,11 +3218,11 @@ static bool DisassembleNVTBLFrm(MCInst &MI, unsigned Opcode, uint32_t insn,
static bool DisassembleNGetLnFrm(MCInst &MI, unsigned Opcode, uint32_t insn,
unsigned short NumOps, unsigned &NumOpsAdded, BO B) {
- const TargetInstrDesc &TID = ARMInsts[Opcode];
- const TargetOperandInfo *OpInfo = TID.OpInfo;
+ const MCInstrDesc &MCID = ARMInsts[Opcode];
+ const MCOperandInfo *OpInfo = MCID.OpInfo;
if (!OpInfo) return false;
- assert(TID.getNumDefs() == 1 && NumOps >= 3 &&
+ assert(MCID.getNumDefs() == 1 && NumOps >= 3 &&
OpInfo[0].RegClass == ARM::GPRRegClassID &&
OpInfo[1].RegClass == ARM::DPRRegClassID &&
OpInfo[2].RegClass < 0 &&
@@ -3255,14 +3252,14 @@ static bool DisassembleNGetLnFrm(MCInst &MI, unsigned Opcode, uint32_t insn,
static bool DisassembleNSetLnFrm(MCInst &MI, unsigned Opcode, uint32_t insn,
unsigned short NumOps, unsigned &NumOpsAdded, BO B) {
- const TargetInstrDesc &TID = ARMInsts[Opcode];
- const TargetOperandInfo *OpInfo = TID.OpInfo;
+ const MCInstrDesc &MCID = ARMInsts[Opcode];
+ const MCOperandInfo *OpInfo = MCID.OpInfo;
if (!OpInfo) return false;
- assert(TID.getNumDefs() == 1 && NumOps >= 3 &&
+ assert(MCID.getNumDefs() == 1 && NumOps >= 3 &&
OpInfo[0].RegClass == ARM::DPRRegClassID &&
OpInfo[1].RegClass == ARM::DPRRegClassID &&
- TID.getOperandConstraint(1, TOI::TIED_TO) != -1 &&
+ MCID.getOperandConstraint(1, MCOI::TIED_TO) != -1 &&
OpInfo[2].RegClass == ARM::GPRRegClassID &&
OpInfo[3].RegClass < 0 &&
"Expect >= 3 operands with one dst operand");
@@ -3294,7 +3291,7 @@ static bool DisassembleNSetLnFrm(MCInst &MI, unsigned Opcode, uint32_t insn,
static bool DisassembleNDupFrm(MCInst &MI, unsigned Opcode, uint32_t insn,
unsigned short NumOps, unsigned &NumOpsAdded, BO B) {
- const TargetOperandInfo *OpInfo = ARMInsts[Opcode].OpInfo;
+ const MCOperandInfo *OpInfo = ARMInsts[Opcode].OpInfo;
assert(NumOps >= 2 &&
(OpInfo[0].RegClass == ARM::DPRRegClassID ||
@@ -3379,7 +3376,7 @@ static bool DisassemblePreLoadFrm(MCInst &MI, unsigned Opcode, uint32_t insn,
static bool DisassembleMiscFrm(MCInst &MI, unsigned Opcode, uint32_t insn,
unsigned short NumOps, unsigned &NumOpsAdded, BO B) {
- if (Opcode == ARM::DMB || Opcode == ARM::DSB) {
+ if (Opcode == ARM::DMB || Opcode == ARM::DSB || Opcode == ARM::ISB) {
// Inst{3-0} encodes the memory barrier option for the variants.
unsigned opt = slice(insn, 3, 0);
switch (opt) {
@@ -3604,11 +3601,11 @@ bool ARMBasicMCBuilder::DoPredicateOperands(MCInst& MI, unsigned Opcode,
assert(NumOpsRemaining > 0 && "Invalid argument");
- const TargetOperandInfo *OpInfo = ARMInsts[Opcode].OpInfo;
+ const MCOperandInfo *OpInfo = ARMInsts[Opcode].OpInfo;
unsigned Idx = MI.getNumOperands();
// First, we check whether this instr specifies the PredicateOperand through
- // a pair of TargetOperandInfos with isPredicate() property.
+ // a pair of MCOperandInfos with isPredicate() property.
if (NumOpsRemaining >= 2 &&
OpInfo[Idx].isPredicate() && OpInfo[Idx+1].isPredicate() &&
OpInfo[Idx].RegClass < 0 &&
@@ -3636,13 +3633,13 @@ bool ARMBasicMCBuilder::TryPredicateAndSBitModifier(MCInst& MI, unsigned Opcode,
assert(NumOpsRemaining > 0 && "Invalid argument");
- const TargetOperandInfo *OpInfo = ARMInsts[Opcode].OpInfo;
+ const MCOperandInfo *OpInfo = ARMInsts[Opcode].OpInfo;
const std::string &Name = ARMInsts[Opcode].Name;
unsigned Idx = MI.getNumOperands();
uint64_t TSFlags = ARMInsts[Opcode].TSFlags;
// First, we check whether this instr specifies the PredicateOperand through
- // a pair of TargetOperandInfos with isPredicate() property.
+ // a pair of MCOperandInfos with isPredicate() property.
if (NumOpsRemaining >= 2 &&
OpInfo[Idx].isPredicate() && OpInfo[Idx+1].isPredicate() &&
OpInfo[Idx].RegClass < 0 &&
diff --git a/contrib/llvm/lib/Target/ARM/Disassembler/ThumbDisassemblerCore.h b/contrib/llvm/lib/Target/ARM/Disassembler/ThumbDisassemblerCore.h
index 9639c8a..834c6f6 100644
--- a/contrib/llvm/lib/Target/ARM/Disassembler/ThumbDisassemblerCore.h
+++ b/contrib/llvm/lib/Target/ARM/Disassembler/ThumbDisassemblerCore.h
@@ -350,7 +350,7 @@ static inline unsigned decodeRotate(uint32_t insn) {
static bool DisassembleThumb1General(MCInst &MI, unsigned Opcode, uint32_t insn,
unsigned short NumOps, unsigned &NumOpsAdded, BO B) {
- const TargetOperandInfo *OpInfo = ARMInsts[Opcode].OpInfo;
+ const MCOperandInfo *OpInfo = ARMInsts[Opcode].OpInfo;
unsigned &OpIdx = NumOpsAdded;
OpIdx = 0;
@@ -425,8 +425,8 @@ static bool DisassembleThumb1General(MCInst &MI, unsigned Opcode, uint32_t insn,
static bool DisassembleThumb1DP(MCInst &MI, unsigned Opcode, uint32_t insn,
unsigned short NumOps, unsigned &NumOpsAdded, BO B) {
- const TargetInstrDesc &TID = ARMInsts[Opcode];
- const TargetOperandInfo *OpInfo = TID.OpInfo;
+ const MCInstrDesc &MCID = ARMInsts[Opcode];
+ const MCOperandInfo *OpInfo = MCID.OpInfo;
unsigned &OpIdx = NumOpsAdded;
OpIdx = 0;
@@ -454,7 +454,7 @@ static bool DisassembleThumb1DP(MCInst &MI, unsigned Opcode, uint32_t insn,
assert(OpIdx < NumOps && OpInfo[OpIdx].RegClass == ARM::tGPRRegClassID
&& "Thumb reg operand expected");
int Idx;
- if ((Idx = TID.getOperandConstraint(OpIdx, TOI::TIED_TO)) != -1) {
+ if ((Idx = MCID.getOperandConstraint(OpIdx, MCOI::TIED_TO)) != -1) {
// The reg operand is tied to the first reg operand.
MI.addOperand(MI.getOperand(Idx));
++OpIdx;
@@ -511,8 +511,8 @@ static bool DisassembleThumb1Special(MCInst &MI, unsigned Opcode, uint32_t insn,
return true;
}
- const TargetInstrDesc &TID = ARMInsts[Opcode];
- const TargetOperandInfo *OpInfo = TID.OpInfo;
+ const MCInstrDesc &MCID = ARMInsts[Opcode];
+ const MCOperandInfo *OpInfo = MCID.OpInfo;
unsigned &OpIdx = NumOpsAdded;
OpIdx = 0;
@@ -530,7 +530,7 @@ static bool DisassembleThumb1Special(MCInst &MI, unsigned Opcode, uint32_t insn,
assert(OpIdx < NumOps && "More operands expected");
int Idx;
- if ((Idx = TID.getOperandConstraint(OpIdx, TOI::TIED_TO)) != -1) {
+ if ((Idx = MCID.getOperandConstraint(OpIdx, MCOI::TIED_TO)) != -1) {
// The reg operand is tied to the first reg operand.
MI.addOperand(MI.getOperand(Idx));
++OpIdx;
@@ -554,7 +554,7 @@ static bool DisassembleThumb1Special(MCInst &MI, unsigned Opcode, uint32_t insn,
static bool DisassembleThumb1LdPC(MCInst &MI, unsigned Opcode, uint32_t insn,
unsigned short NumOps, unsigned &NumOpsAdded, BO B) {
- const TargetOperandInfo *OpInfo = ARMInsts[Opcode].OpInfo;
+ const MCOperandInfo *OpInfo = ARMInsts[Opcode].OpInfo;
if (!OpInfo) return false;
assert(NumOps >= 2 && OpInfo[0].RegClass == ARM::tGPRRegClassID &&
@@ -602,7 +602,7 @@ static bool DisassembleThumb1LdPC(MCInst &MI, unsigned Opcode, uint32_t insn,
static bool DisassembleThumb2Ldpci(MCInst &MI, unsigned Opcode,
uint32_t insn, unsigned short NumOps, unsigned &NumOpsAdded, BO B) {
- const TargetOperandInfo *OpInfo = ARMInsts[Opcode].OpInfo;
+ const MCOperandInfo *OpInfo = ARMInsts[Opcode].OpInfo;
if (!OpInfo) return false;
assert(NumOps >= 2 &&
@@ -630,8 +630,8 @@ static bool DisassembleThumb2Ldpci(MCInst &MI, unsigned Opcode,
static bool DisassembleThumb1LdSt(unsigned opA, MCInst &MI, unsigned Opcode,
uint32_t insn, unsigned short NumOps, unsigned &NumOpsAdded, BO B) {
- const TargetInstrDesc &TID = ARMInsts[Opcode];
- const TargetOperandInfo *OpInfo = TID.OpInfo;
+ const MCInstrDesc &MCID = ARMInsts[Opcode];
+ const MCOperandInfo *OpInfo = MCID.OpInfo;
unsigned &OpIdx = NumOpsAdded;
assert(NumOps >= 2
@@ -680,7 +680,7 @@ static bool DisassembleThumb1LdStSP(MCInst &MI, unsigned Opcode, uint32_t insn,
assert((Opcode == ARM::tLDRspi || Opcode == ARM::tSTRspi)
&& "Unexpected opcode");
- const TargetOperandInfo *OpInfo = ARMInsts[Opcode].OpInfo;
+ const MCOperandInfo *OpInfo = ARMInsts[Opcode].OpInfo;
if (!OpInfo) return false;
assert(NumOps >= 3 &&
@@ -708,7 +708,7 @@ static bool DisassembleThumb1AddPCi(MCInst &MI, unsigned Opcode, uint32_t insn,
assert(Opcode == ARM::tADDrPCi && "Unexpected opcode");
- const TargetOperandInfo *OpInfo = ARMInsts[Opcode].OpInfo;
+ const MCOperandInfo *OpInfo = ARMInsts[Opcode].OpInfo;
if (!OpInfo) return false;
assert(NumOps >= 2 && OpInfo[0].RegClass == ARM::tGPRRegClassID &&
@@ -733,7 +733,7 @@ static bool DisassembleThumb1AddSPi(MCInst &MI, unsigned Opcode, uint32_t insn,
assert(Opcode == ARM::tADDrSPi && "Unexpected opcode");
- const TargetOperandInfo *OpInfo = ARMInsts[Opcode].OpInfo;
+ const MCOperandInfo *OpInfo = ARMInsts[Opcode].OpInfo;
if (!OpInfo) return false;
assert(NumOps >= 3 &&
@@ -810,7 +810,7 @@ static bool DisassembleThumb1Misc(MCInst &MI, unsigned Opcode, uint32_t insn,
if (Opcode == ARM::tPUSH || Opcode == ARM::tPOP)
return DisassembleThumb1PushPop(MI, Opcode, insn, NumOps, NumOpsAdded, B);
- const TargetOperandInfo *OpInfo = ARMInsts[Opcode].OpInfo;
+ const MCOperandInfo *OpInfo = ARMInsts[Opcode].OpInfo;
// Predicate operands are handled elsewhere.
if (NumOps == 2 &&
@@ -958,7 +958,7 @@ static bool DisassembleThumb1CondBr(MCInst &MI, unsigned Opcode, uint32_t insn,
if (Opcode == ARM::tTRAP)
return true;
- const TargetOperandInfo *OpInfo = ARMInsts[Opcode].OpInfo;
+ const MCOperandInfo *OpInfo = ARMInsts[Opcode].OpInfo;
if (!OpInfo) return false;
assert(NumOps == 3 && OpInfo[0].RegClass < 0 &&
@@ -989,7 +989,7 @@ static bool DisassembleThumb1CondBr(MCInst &MI, unsigned Opcode, uint32_t insn,
static bool DisassembleThumb1Br(MCInst &MI, unsigned Opcode, uint32_t insn,
unsigned short NumOps, unsigned &NumOpsAdded, BO) {
- const TargetOperandInfo *OpInfo = ARMInsts[Opcode].OpInfo;
+ const MCOperandInfo *OpInfo = ARMInsts[Opcode].OpInfo;
if (!OpInfo) return false;
assert(NumOps == 1 && OpInfo[0].RegClass < 0 && "1 imm operand expected");
@@ -1226,7 +1226,7 @@ static bool DisassembleThumb2LdStMul(MCInst &MI, unsigned Opcode, uint32_t insn,
static bool DisassembleThumb2LdStEx(MCInst &MI, unsigned Opcode, uint32_t insn,
unsigned short NumOps, unsigned &NumOpsAdded, BO B) {
- const TargetOperandInfo *OpInfo = ARMInsts[Opcode].OpInfo;
+ const MCOperandInfo *OpInfo = ARMInsts[Opcode].OpInfo;
if (!OpInfo) return false;
unsigned &OpIdx = NumOpsAdded;
@@ -1316,7 +1316,7 @@ static bool DisassembleThumb2LdStEx(MCInst &MI, unsigned Opcode, uint32_t insn,
static bool DisassembleThumb2LdStDual(MCInst &MI, unsigned Opcode,
uint32_t insn, unsigned short NumOps, unsigned &NumOpsAdded, BO B) {
- const TargetOperandInfo *OpInfo = ARMInsts[Opcode].OpInfo;
+ const MCOperandInfo *OpInfo = ARMInsts[Opcode].OpInfo;
if (!OpInfo) return false;
assert(NumOps >= 4
@@ -1423,8 +1423,8 @@ static inline bool Thumb2ShiftOpcode(unsigned Opcode) {
static bool DisassembleThumb2DPSoReg(MCInst &MI, unsigned Opcode, uint32_t insn,
unsigned short NumOps, unsigned &NumOpsAdded, BO B) {
- const TargetInstrDesc &TID = ARMInsts[Opcode];
- const TargetOperandInfo *OpInfo = TID.OpInfo;
+ const MCInstrDesc &MCID = ARMInsts[Opcode];
+ const MCOperandInfo *OpInfo = MCID.OpInfo;
unsigned &OpIdx = NumOpsAdded;
// Special case handling.
@@ -1467,7 +1467,7 @@ static bool DisassembleThumb2DPSoReg(MCInst &MI, unsigned Opcode, uint32_t insn,
if (ThreeReg) {
int Idx;
- if ((Idx = TID.getOperandConstraint(OpIdx, TOI::TIED_TO)) != -1) {
+ if ((Idx = MCID.getOperandConstraint(OpIdx, MCOI::TIED_TO)) != -1) {
// Process tied_to operand constraint.
MI.addOperand(MI.getOperand(Idx));
++OpIdx;
@@ -1521,8 +1521,8 @@ static bool DisassembleThumb2DPSoReg(MCInst &MI, unsigned Opcode, uint32_t insn,
static bool DisassembleThumb2DPModImm(MCInst &MI, unsigned Opcode,
uint32_t insn, unsigned short NumOps, unsigned &NumOpsAdded, BO B) {
- const TargetInstrDesc &TID = ARMInsts[Opcode];
- const TargetOperandInfo *OpInfo = TID.OpInfo;
+ const MCInstrDesc &MCID = ARMInsts[Opcode];
+ const MCOperandInfo *OpInfo = MCID.OpInfo;
unsigned &OpIdx = NumOpsAdded;
OpIdx = 0;
@@ -1550,7 +1550,7 @@ static bool DisassembleThumb2DPModImm(MCInst &MI, unsigned Opcode,
return false;
}
int Idx;
- if ((Idx = TID.getOperandConstraint(OpIdx, TOI::TIED_TO)) != -1) {
+ if ((Idx = MCID.getOperandConstraint(OpIdx, MCOI::TIED_TO)) != -1) {
// The reg operand is tied to the first reg operand.
MI.addOperand(MI.getOperand(Idx));
} else {
@@ -1590,8 +1590,8 @@ static inline bool Thumb2SaturateOpcode(unsigned Opcode) {
/// o t2SSAT16, t2USAT16: Rs sat_pos Rn
static bool DisassembleThumb2Sat(MCInst &MI, unsigned Opcode, uint32_t insn,
unsigned &NumOpsAdded, BO B) {
- const TargetInstrDesc &TID = ARMInsts[Opcode];
- NumOpsAdded = TID.getNumOperands() - 2; // ignore predicate operands
+ const MCInstrDesc &MCID = ARMInsts[Opcode];
+ NumOpsAdded = MCID.getNumOperands() - 2; // ignore predicate operands
// Disassemble the register def.
MI.addOperand(MCOperand::CreateReg(getRegisterEnum(B, ARM::rGPRRegClassID,
@@ -1635,8 +1635,8 @@ static bool DisassembleThumb2Sat(MCInst &MI, unsigned Opcode, uint32_t insn,
static bool DisassembleThumb2DPBinImm(MCInst &MI, unsigned Opcode,
uint32_t insn, unsigned short NumOps, unsigned &NumOpsAdded, BO B) {
- const TargetInstrDesc &TID = ARMInsts[Opcode];
- const TargetOperandInfo *OpInfo = TID.OpInfo;
+ const MCInstrDesc &MCID = ARMInsts[Opcode];
+ const MCOperandInfo *OpInfo = MCID.OpInfo;
unsigned &OpIdx = NumOpsAdded;
OpIdx = 0;
@@ -1659,7 +1659,7 @@ static bool DisassembleThumb2DPBinImm(MCInst &MI, unsigned Opcode,
if (TwoReg) {
assert(NumOps >= 3 && "Expect >= 3 operands");
int Idx;
- if ((Idx = TID.getOperandConstraint(OpIdx, TOI::TIED_TO)) != -1) {
+ if ((Idx = MCID.getOperandConstraint(OpIdx, MCOI::TIED_TO)) != -1) {
// Process tied_to operand constraint.
MI.addOperand(MI.getOperand(Idx));
} else {
@@ -1907,8 +1907,8 @@ static bool DisassembleThumb2PreLoad(MCInst &MI, unsigned Opcode, uint32_t insn,
// t2PLDs: Rn Rm imm2=Inst{5-4}
// Same pattern applies for t2PLDW* and t2PLI*.
- const TargetInstrDesc &TID = ARMInsts[Opcode];
- const TargetOperandInfo *OpInfo = TID.OpInfo;
+ const MCInstrDesc &MCID = ARMInsts[Opcode];
+ const MCOperandInfo *OpInfo = MCID.OpInfo;
unsigned &OpIdx = NumOpsAdded;
OpIdx = 0;
@@ -2073,8 +2073,8 @@ static bool DisassembleThumb2LdSt(bool Load, MCInst &MI, unsigned Opcode,
// See, for example, A6.3.7 Load word: Table A6-18 Load word.
if (Load && Rn == 15)
return DisassembleThumb2Ldpci(MI, Opcode, insn, NumOps, NumOpsAdded, B);
- const TargetInstrDesc &TID = ARMInsts[Opcode];
- const TargetOperandInfo *OpInfo = TID.OpInfo;
+ const MCInstrDesc &MCID = ARMInsts[Opcode];
+ const MCOperandInfo *OpInfo = MCID.OpInfo;
unsigned &OpIdx = NumOpsAdded;
OpIdx = 0;
@@ -2085,7 +2085,7 @@ static bool DisassembleThumb2LdSt(bool Load, MCInst &MI, unsigned Opcode,
"Expect >= 3 operands and first two as reg operands");
bool ThreeReg = (OpInfo[2].RegClass > 0);
- bool TIED_TO = ThreeReg && TID.getOperandConstraint(2, TOI::TIED_TO) != -1;
+ bool TIED_TO = ThreeReg && MCID.getOperandConstraint(2, MCOI::TIED_TO) != -1;
bool Imm12 = !ThreeReg && slice(insn, 23, 23) == 1; // ARMInstrThumb2.td
// Build the register operands, followed by the immediate.
@@ -2160,8 +2160,8 @@ static bool DisassembleThumb2LdSt(bool Load, MCInst &MI, unsigned Opcode,
static bool DisassembleThumb2DPReg(MCInst &MI, unsigned Opcode, uint32_t insn,
unsigned short NumOps, unsigned &NumOpsAdded, BO B) {
- const TargetInstrDesc &TID = ARMInsts[Opcode];
- const TargetOperandInfo *OpInfo = TID.OpInfo;
+ const MCInstrDesc &MCID = ARMInsts[Opcode];
+ const MCOperandInfo *OpInfo = MCID.OpInfo;
unsigned &OpIdx = NumOpsAdded;
OpIdx = 0;
@@ -2214,7 +2214,7 @@ static bool DisassembleThumb2DPReg(MCInst &MI, unsigned Opcode, uint32_t insn,
static bool DisassembleThumb2Mul(MCInst &MI, unsigned Opcode, uint32_t insn,
unsigned short NumOps, unsigned &NumOpsAdded, BO B) {
- const TargetOperandInfo *OpInfo = ARMInsts[Opcode].OpInfo;
+ const MCOperandInfo *OpInfo = ARMInsts[Opcode].OpInfo;
assert(NumOps >= 3 &&
OpInfo[0].RegClass == ARM::rGPRRegClassID &&
@@ -2259,7 +2259,7 @@ static bool DisassembleThumb2Mul(MCInst &MI, unsigned Opcode, uint32_t insn,
static bool DisassembleThumb2LongMul(MCInst &MI, unsigned Opcode, uint32_t insn,
unsigned short NumOps, unsigned &NumOpsAdded, BO B) {
- const TargetOperandInfo *OpInfo = ARMInsts[Opcode].OpInfo;
+ const MCOperandInfo *OpInfo = ARMInsts[Opcode].OpInfo;
assert(NumOps >= 3 &&
OpInfo[0].RegClass == ARM::rGPRRegClassID &&
diff --git a/contrib/llvm/lib/Target/ARM/InstPrinter/ARMInstPrinter.cpp b/contrib/llvm/lib/Target/ARM/InstPrinter/ARMInstPrinter.cpp
index 8ae87f8..78d3e47 100644
--- a/contrib/llvm/lib/Target/ARM/InstPrinter/ARMInstPrinter.cpp
+++ b/contrib/llvm/lib/Target/ARM/InstPrinter/ARMInstPrinter.cpp
@@ -126,38 +126,6 @@ void ARMInstPrinter::printOperand(const MCInst *MI, unsigned OpNo,
}
}
-static void printSOImm(raw_ostream &O, int64_t V, raw_ostream *CommentStream,
- const MCAsmInfo *MAI) {
- // Break it up into two parts that make up a shifter immediate.
- V = ARM_AM::getSOImmVal(V);
- assert(V != -1 && "Not a valid so_imm value!");
-
- unsigned Imm = ARM_AM::getSOImmValImm(V);
- unsigned Rot = ARM_AM::getSOImmValRot(V);
-
- // Print low-level immediate formation info, per
- // A5.2.3: Data-processing (immediate), and
- // A5.2.4: Modified immediate constants in ARM instructions
- if (Rot) {
- O << "#" << Imm << ", #" << Rot;
- // Pretty printed version.
- if (CommentStream)
- *CommentStream << (int)ARM_AM::rotr32(Imm, Rot) << "\n";
- } else {
- O << "#" << Imm;
- }
-}
-
-
-/// printSOImmOperand - SOImm is 4-bit rotate amount in bits 8-11 with 8-bit
-/// immediate in bits 0-7.
-void ARMInstPrinter::printSOImmOperand(const MCInst *MI, unsigned OpNum,
- raw_ostream &O) {
- const MCOperand &MO = MI->getOperand(OpNum);
- assert(MO.isImm() && "Not a valid so_imm value!");
- printSOImm(O, MO.getImm(), CommentStream, &MAI);
-}
-
// so_reg is a 4-operand unit corresponding to register forms of the A5.1
// "Addressing Mode 1 - Data-processing operands" forms. This includes:
// REG 0 0 - e.g. R5
@@ -174,6 +142,8 @@ void ARMInstPrinter::printSORegOperand(const MCInst *MI, unsigned OpNum,
// Print the shift opc.
ARM_AM::ShiftOpc ShOpc = ARM_AM::getSORegShOp(MO3.getImm());
O << ", " << ARM_AM::getShiftOpcStr(ShOpc);
+ if (ShOpc == ARM_AM::rrx)
+ return;
if (MO2.getReg()) {
O << ' ' << getRegisterName(MO2.getReg());
assert(ARM_AM::getSORegOffset(MO3.getImm()) == 0);
diff --git a/contrib/llvm/lib/Target/ARM/InstPrinter/ARMInstPrinter.h b/contrib/llvm/lib/Target/ARM/InstPrinter/ARMInstPrinter.h
index bde0eb9..d5f238b 100644
--- a/contrib/llvm/lib/Target/ARM/InstPrinter/ARMInstPrinter.h
+++ b/contrib/llvm/lib/Target/ARM/InstPrinter/ARMInstPrinter.h
@@ -19,11 +19,10 @@
namespace llvm {
class MCOperand;
-class TargetMachine;
class ARMInstPrinter : public MCInstPrinter {
public:
- ARMInstPrinter(TargetMachine &TM, const MCAsmInfo &MAI)
+ ARMInstPrinter(const MCAsmInfo &MAI)
: MCInstPrinter(MAI) {}
virtual void printInst(const MCInst *MI, raw_ostream &O);
@@ -39,8 +38,6 @@ public:
void printOperand(const MCInst *MI, unsigned OpNo, raw_ostream &O);
- void printSOImmOperand(const MCInst *MI, unsigned OpNum, raw_ostream &O);
-
void printSORegOperand(const MCInst *MI, unsigned OpNum, raw_ostream &O);
void printAddrMode2Operand(const MCInst *MI, unsigned OpNum, raw_ostream &O);
diff --git a/contrib/llvm/lib/Target/ARM/ARMMCAsmInfo.cpp b/contrib/llvm/lib/Target/ARM/MCTargetDesc/ARMMCAsmInfo.cpp
index 53b4c95..53b4c95 100644
--- a/contrib/llvm/lib/Target/ARM/ARMMCAsmInfo.cpp
+++ b/contrib/llvm/lib/Target/ARM/MCTargetDesc/ARMMCAsmInfo.cpp
diff --git a/contrib/llvm/lib/Target/ARM/ARMMCAsmInfo.h b/contrib/llvm/lib/Target/ARM/MCTargetDesc/ARMMCAsmInfo.h
index 90f7822..90f7822 100644
--- a/contrib/llvm/lib/Target/ARM/ARMMCAsmInfo.h
+++ b/contrib/llvm/lib/Target/ARM/MCTargetDesc/ARMMCAsmInfo.h
diff --git a/contrib/llvm/lib/Target/ARM/MCTargetDesc/ARMMCTargetDesc.cpp b/contrib/llvm/lib/Target/ARM/MCTargetDesc/ARMMCTargetDesc.cpp
new file mode 100644
index 0000000..f8fcf2b
--- /dev/null
+++ b/contrib/llvm/lib/Target/ARM/MCTargetDesc/ARMMCTargetDesc.cpp
@@ -0,0 +1,144 @@
+//===-- ARMMCTargetDesc.cpp - ARM Target Descriptions -----------*- C++ -*-===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+//
+// This file provides ARM specific target descriptions.
+//
+//===----------------------------------------------------------------------===//
+
+#include "ARMMCTargetDesc.h"
+#include "ARMMCAsmInfo.h"
+#include "llvm/MC/MCInstrInfo.h"
+#include "llvm/MC/MCRegisterInfo.h"
+#include "llvm/MC/MCSubtargetInfo.h"
+#include "llvm/Target/TargetRegistry.h"
+
+#define GET_REGINFO_MC_DESC
+#include "ARMGenRegisterInfo.inc"
+
+#define GET_INSTRINFO_MC_DESC
+#include "ARMGenInstrInfo.inc"
+
+#define GET_SUBTARGETINFO_MC_DESC
+#include "ARMGenSubtargetInfo.inc"
+
+using namespace llvm;
+
+std::string ARM_MC::ParseARMTriple(StringRef TT) {
+ // Set the boolean corresponding to the current target triple, or the default
+ // if one cannot be determined, to true.
+ unsigned Len = TT.size();
+ unsigned Idx = 0;
+
+ // FIXME: Enahnce Triple helper class to extract ARM version.
+ bool isThumb = false;
+ if (Len >= 5 && TT.substr(0, 4) == "armv")
+ Idx = 4;
+ else if (Len >= 6 && TT.substr(0, 5) == "thumb") {
+ isThumb = true;
+ if (Len >= 7 && TT[5] == 'v')
+ Idx = 6;
+ }
+
+ std::string ARMArchFeature;
+ if (Idx) {
+ unsigned SubVer = TT[Idx];
+ if (SubVer >= '7' && SubVer <= '9') {
+ if (Len >= Idx+2 && TT[Idx+1] == 'm') {
+ // v7m: FeatureNoARM, FeatureDB, FeatureHWDiv
+ ARMArchFeature = "+v7,+noarm,+db,+hwdiv";
+ } else if (Len >= Idx+3 && TT[Idx+1] == 'e'&& TT[Idx+2] == 'm') {
+ // v7em: FeatureNoARM, FeatureDB, FeatureHWDiv, FeatureDSPThumb2,
+ // FeatureT2XtPk
+ ARMArchFeature = "+v7,+noarm,+db,+hwdiv,+t2dsp,t2xtpk";
+ } else
+ // v7a: FeatureNEON, FeatureDB, FeatureDSPThumb2
+ ARMArchFeature = "+v7,+neon,+db,+t2dsp";
+ } else if (SubVer == '6') {
+ if (Len >= Idx+3 && TT[Idx+1] == 't' && TT[Idx+2] == '2')
+ ARMArchFeature = "+v6t2";
+ else
+ ARMArchFeature = "+v6";
+ } else if (SubVer == '5') {
+ if (Len >= Idx+3 && TT[Idx+1] == 't' && TT[Idx+2] == 'e')
+ ARMArchFeature = "+v5te";
+ else
+ ARMArchFeature = "+v5t";
+ } else if (SubVer == '4' && Len >= Idx+2 && TT[Idx+1] == 't')
+ ARMArchFeature = "+v4t";
+ }
+
+ if (isThumb) {
+ if (ARMArchFeature.empty())
+ ARMArchFeature = "+thumb-mode";
+ else
+ ARMArchFeature += ",+thumb-mode";
+ }
+
+ return ARMArchFeature;
+}
+
+MCSubtargetInfo *ARM_MC::createARMMCSubtargetInfo(StringRef TT, StringRef CPU,
+ StringRef FS) {
+ std::string ArchFS = ARM_MC::ParseARMTriple(TT);
+ if (!FS.empty()) {
+ if (!ArchFS.empty())
+ ArchFS = ArchFS + "," + FS.str();
+ else
+ ArchFS = FS;
+ }
+
+ MCSubtargetInfo *X = new MCSubtargetInfo();
+ InitARMMCSubtargetInfo(X, TT, CPU, ArchFS);
+ return X;
+}
+
+// Force static initialization.
+extern "C" void LLVMInitializeARMMCSubtargetInfo() {
+ TargetRegistry::RegisterMCSubtargetInfo(TheARMTarget,
+ ARM_MC::createARMMCSubtargetInfo);
+ TargetRegistry::RegisterMCSubtargetInfo(TheThumbTarget,
+ ARM_MC::createARMMCSubtargetInfo);
+}
+
+static MCInstrInfo *createARMMCInstrInfo() {
+ MCInstrInfo *X = new MCInstrInfo();
+ InitARMMCInstrInfo(X);
+ return X;
+}
+
+extern "C" void LLVMInitializeARMMCInstrInfo() {
+ TargetRegistry::RegisterMCInstrInfo(TheARMTarget, createARMMCInstrInfo);
+ TargetRegistry::RegisterMCInstrInfo(TheThumbTarget, createARMMCInstrInfo);
+}
+
+static MCRegisterInfo *createARMMCRegisterInfo() {
+ MCRegisterInfo *X = new MCRegisterInfo();
+ InitARMMCRegisterInfo(X);
+ return X;
+}
+
+extern "C" void LLVMInitializeARMMCRegInfo() {
+ TargetRegistry::RegisterMCRegInfo(TheARMTarget, createARMMCRegisterInfo);
+ TargetRegistry::RegisterMCRegInfo(TheThumbTarget, createARMMCRegisterInfo);
+}
+
+static MCAsmInfo *createARMMCAsmInfo(const Target &T, StringRef TT) {
+ Triple TheTriple(TT);
+
+ if (TheTriple.isOSDarwin())
+ return new ARMMCAsmInfoDarwin();
+
+ return new ARMELFMCAsmInfo();
+}
+
+extern "C" void LLVMInitializeARMMCAsmInfo() {
+ // Register the target asm info.
+ RegisterMCAsmInfoFn A(TheARMTarget, createARMMCAsmInfo);
+ RegisterMCAsmInfoFn B(TheThumbTarget, createARMMCAsmInfo);
+}
diff --git a/contrib/llvm/lib/Target/ARM/MCTargetDesc/ARMMCTargetDesc.h b/contrib/llvm/lib/Target/ARM/MCTargetDesc/ARMMCTargetDesc.h
new file mode 100644
index 0000000..74701e3
--- /dev/null
+++ b/contrib/llvm/lib/Target/ARM/MCTargetDesc/ARMMCTargetDesc.h
@@ -0,0 +1,52 @@
+//===-- ARMMCTargetDesc.h - ARM Target Descriptions -------------*- C++ -*-===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+//
+// This file provides ARM specific target descriptions.
+//
+//===----------------------------------------------------------------------===//
+
+#ifndef ARMMCTARGETDESC_H
+#define ARMMCTARGETDESC_H
+
+#include <string>
+
+namespace llvm {
+class MCSubtargetInfo;
+class Target;
+class StringRef;
+
+extern Target TheARMTarget, TheThumbTarget;
+
+namespace ARM_MC {
+ std::string ParseARMTriple(StringRef TT);
+
+ /// createARMMCSubtargetInfo - Create a ARM MCSubtargetInfo instance.
+ /// This is exposed so Asm parser, etc. do not need to go through
+ /// TargetRegistry.
+ MCSubtargetInfo *createARMMCSubtargetInfo(StringRef TT, StringRef CPU,
+ StringRef FS);
+}
+
+} // End llvm namespace
+
+// Defines symbolic names for ARM registers. This defines a mapping from
+// register name to register number.
+//
+#define GET_REGINFO_ENUM
+#include "ARMGenRegisterInfo.inc"
+
+// Defines symbolic names for the ARM instructions.
+//
+#define GET_INSTRINFO_ENUM
+#include "ARMGenInstrInfo.inc"
+
+#define GET_SUBTARGETINFO_ENUM
+#include "ARMGenSubtargetInfo.inc"
+
+#endif
diff --git a/contrib/llvm/lib/Target/ARM/MCTargetDesc/CMakeLists.txt b/contrib/llvm/lib/Target/ARM/MCTargetDesc/CMakeLists.txt
new file mode 100644
index 0000000..68daf42
--- /dev/null
+++ b/contrib/llvm/lib/Target/ARM/MCTargetDesc/CMakeLists.txt
@@ -0,0 +1,7 @@
+add_llvm_library(LLVMARMDesc
+ ARMMCTargetDesc.cpp
+ ARMMCAsmInfo.cpp
+ )
+
+# Hack: we need to include 'main' target directory to grab private headers
+include_directories(${CMAKE_CURRENT_SOURCE_DIR}/.. ${CMAKE_CURRENT_BINARY_DIR}/..)
diff --git a/contrib/llvm/lib/Target/ARM/MCTargetDesc/Makefile b/contrib/llvm/lib/Target/ARM/MCTargetDesc/Makefile
new file mode 100644
index 0000000..448ed9d
--- /dev/null
+++ b/contrib/llvm/lib/Target/ARM/MCTargetDesc/Makefile
@@ -0,0 +1,16 @@
+##===- lib/Target/ARM/TargetDesc/Makefile ------------------*- Makefile -*-===##
+#
+# The LLVM Compiler Infrastructure
+#
+# This file is distributed under the University of Illinois Open Source
+# License. See LICENSE.TXT for details.
+#
+##===----------------------------------------------------------------------===##
+
+LEVEL = ../../../..
+LIBRARYNAME = LLVMARMDesc
+
+# Hack: we need to include 'main' target directory to grab private headers
+CPP.Flags += -I$(PROJ_OBJ_DIR)/.. -I$(PROJ_SRC_DIR)/..
+
+include $(LEVEL)/Makefile.common
diff --git a/contrib/llvm/lib/Target/ARM/MLxExpansionPass.cpp b/contrib/llvm/lib/Target/ARM/MLxExpansionPass.cpp
index f6d0242..2df0053 100644
--- a/contrib/llvm/lib/Target/ARM/MLxExpansionPass.cpp
+++ b/contrib/llvm/lib/Target/ARM/MLxExpansionPass.cpp
@@ -137,11 +137,11 @@ unsigned MLxExpansion::getDefReg(MachineInstr *MI) const {
bool MLxExpansion::hasRAWHazard(unsigned Reg, MachineInstr *MI) const {
// FIXME: Detect integer instructions properly.
- const TargetInstrDesc &TID = MI->getDesc();
- unsigned Domain = TID.TSFlags & ARMII::DomainMask;
- if (TID.mayStore())
+ const MCInstrDesc &MCID = MI->getDesc();
+ unsigned Domain = MCID.TSFlags & ARMII::DomainMask;
+ if (MCID.mayStore())
return false;
- unsigned Opcode = TID.getOpcode();
+ unsigned Opcode = MCID.getOpcode();
if (Opcode == ARM::VMOVRS || Opcode == ARM::VMOVRRD)
return false;
if ((Domain & ARMII::DomainVFP) || (Domain & ARMII::DomainNEON))
@@ -218,18 +218,18 @@ MLxExpansion::ExpandFPMLxInstruction(MachineBasicBlock &MBB, MachineInstr *MI,
ARMCC::CondCodes Pred = (ARMCC::CondCodes)MI->getOperand(NextOp).getImm();
unsigned PredReg = MI->getOperand(++NextOp).getReg();
- const TargetInstrDesc &TID1 = TII->get(MulOpc);
- const TargetInstrDesc &TID2 = TII->get(AddSubOpc);
- unsigned TmpReg = MRI->createVirtualRegister(TID1.getRegClass(0, TRI));
+ const MCInstrDesc &MCID1 = TII->get(MulOpc);
+ const MCInstrDesc &MCID2 = TII->get(AddSubOpc);
+ unsigned TmpReg = MRI->createVirtualRegister(TII->getRegClass(MCID1, 0, TRI));
- MachineInstrBuilder MIB = BuildMI(MBB, *MI, MI->getDebugLoc(), TID1, TmpReg)
+ MachineInstrBuilder MIB = BuildMI(MBB, *MI, MI->getDebugLoc(), MCID1, TmpReg)
.addReg(Src1Reg, getKillRegState(Src1Kill))
.addReg(Src2Reg, getKillRegState(Src2Kill));
if (HasLane)
MIB.addImm(LaneImm);
MIB.addImm(Pred).addReg(PredReg);
- MIB = BuildMI(MBB, *MI, MI->getDebugLoc(), TID2)
+ MIB = BuildMI(MBB, *MI, MI->getDebugLoc(), MCID2)
.addReg(DstReg, getDefRegState(true) | getDeadRegState(DstDead));
if (NegAcc) {
@@ -273,15 +273,15 @@ bool MLxExpansion::ExpandFPMLxInstructions(MachineBasicBlock &MBB) {
continue;
}
- const TargetInstrDesc &TID = MI->getDesc();
- if (TID.isBarrier()) {
+ const MCInstrDesc &MCID = MI->getDesc();
+ if (MCID.isBarrier()) {
clearStack();
Skip = 0;
++MII;
continue;
}
- unsigned Domain = TID.TSFlags & ARMII::DomainMask;
+ unsigned Domain = MCID.TSFlags & ARMII::DomainMask;
if (Domain == ARMII::DomainGeneral) {
if (++Skip == 2)
// Assume dual issues of non-VFP / NEON instructions.
@@ -291,7 +291,7 @@ bool MLxExpansion::ExpandFPMLxInstructions(MachineBasicBlock &MBB) {
unsigned MulOpc, AddSubOpc;
bool NegAcc, HasLane;
- if (!TII->isFpMLxInstruction(TID.getOpcode(),
+ if (!TII->isFpMLxInstruction(MCID.getOpcode(),
MulOpc, AddSubOpc, NegAcc, HasLane) ||
!FindMLxHazard(MI))
pushStack(MI);
diff --git a/contrib/llvm/lib/Target/ARM/NEONMoveFix.cpp b/contrib/llvm/lib/Target/ARM/NEONMoveFix.cpp
index 965665c..c85d1e9 100644
--- a/contrib/llvm/lib/Target/ARM/NEONMoveFix.cpp
+++ b/contrib/llvm/lib/Target/ARM/NEONMoveFix.cpp
@@ -77,7 +77,7 @@ bool NEONMoveFixPass::InsertMoves(MachineBasicBlock &MBB) {
}
if (inNEONDomain(Domain, isA8)) {
- // Convert VMOVD to VMOVDneon
+ // Convert VMOVD to VORRd
unsigned DestReg = MI->getOperand(0).getReg();
DEBUG({errs() << "vmov convert: "; MI->dump();});
@@ -88,7 +88,8 @@ bool NEONMoveFixPass::InsertMoves(MachineBasicBlock &MBB) {
// - The imp-defs / imp-uses are superregs only, we don't care about
// them.
AddDefaultPred(BuildMI(MBB, *MI, MI->getDebugLoc(),
- TII->get(ARM::VMOVDneon), DestReg).addReg(SrcReg));
+ TII->get(ARM::VORRd), DestReg)
+ .addReg(SrcReg).addReg(SrcReg));
MBB.erase(MI);
MachineBasicBlock::iterator I = prior(NextMII);
MI = &*I;
diff --git a/contrib/llvm/lib/Target/ARM/Thumb1FrameLowering.cpp b/contrib/llvm/lib/Target/ARM/Thumb1FrameLowering.cpp
index dee3d27..c258870 100644
--- a/contrib/llvm/lib/Target/ARM/Thumb1FrameLowering.cpp
+++ b/contrib/llvm/lib/Target/ARM/Thumb1FrameLowering.cpp
@@ -136,8 +136,8 @@ void Thumb1FrameLowering::emitPrologue(MachineFunction &MF) const {
BuildMI(MBB, MBBI, dl, TII.get(ARM::tADDrSPi), FramePtr)
.addFrameIndex(FramePtrSpillFI).addImm(0)
.setMIFlags(MachineInstr::FrameSetup);
- if (NumBytes > 7)
- // If offset is > 7 then sp cannot be adjusted in a single instruction,
+ if (NumBytes > 508)
+ // If offset is > 508 then sp cannot be adjusted in a single instruction,
// try restoring from fp instead.
AFI->setShouldRestoreSPFromFP(true);
}
@@ -160,7 +160,8 @@ void Thumb1FrameLowering::emitPrologue(MachineFunction &MF) const {
// will be allocated after this, so we can still use the base pointer
// to reference locals.
if (RegInfo->hasBasePointer(MF))
- BuildMI(MBB, MBBI, dl, TII.get(ARM::tMOVgpr2gpr), BasePtr).addReg(ARM::SP);
+ AddDefaultPred(BuildMI(MBB, MBBI, dl, TII.get(ARM::tMOVr), BasePtr)
+ .addReg(ARM::SP));
// If the frame has variable sized objects then the epilogue must restore
// the sp from fp. We can assume there's an FP here since hasFP already
@@ -177,7 +178,7 @@ static bool isCalleeSavedRegister(unsigned Reg, const unsigned *CSRegs) {
}
static bool isCSRestore(MachineInstr *MI, const unsigned *CSRegs) {
- if (MI->getOpcode() == ARM::tRestore &&
+ if (MI->getOpcode() == ARM::tLDRspi &&
MI->getOperand(1).isFI() &&
isCalleeSavedRegister(MI->getOperand(0).getReg(), CSRegs))
return true;
@@ -239,11 +240,13 @@ void Thumb1FrameLowering::emitEpilogue(MachineFunction &MF,
"No scratch register to restore SP from FP!");
emitThumbRegPlusImmediate(MBB, MBBI, dl, ARM::R4, FramePtr, -NumBytes,
TII, *RegInfo);
- BuildMI(MBB, MBBI, dl, TII.get(ARM::tMOVtgpr2gpr), ARM::SP)
- .addReg(ARM::R4);
+ AddDefaultPred(BuildMI(MBB, MBBI, dl, TII.get(ARM::tMOVr),
+ ARM::SP)
+ .addReg(ARM::R4));
} else
- BuildMI(MBB, MBBI, dl, TII.get(ARM::tMOVtgpr2gpr), ARM::SP)
- .addReg(FramePtr);
+ AddDefaultPred(BuildMI(MBB, MBBI, dl, TII.get(ARM::tMOVr),
+ ARM::SP)
+ .addReg(FramePtr));
} else {
if (MBBI->getOpcode() == ARM::tBX_RET &&
&MBB.front() != MBBI &&
@@ -270,8 +273,8 @@ void Thumb1FrameLowering::emitEpilogue(MachineFunction &MF,
emitSPUpdate(MBB, MBBI, TII, dl, *RegInfo, VARegSaveSize);
- BuildMI(MBB, MBBI, dl, TII.get(ARM::tBX_RET_vararg))
- .addReg(ARM::R3, RegState::Kill);
+ AddDefaultPred(BuildMI(MBB, MBBI, dl, TII.get(ARM::tBX_RET_vararg))
+ .addReg(ARM::R3, RegState::Kill));
// erase the old tBX_RET instruction
MBB.erase(MBBI);
}
diff --git a/contrib/llvm/lib/Target/ARM/Thumb1InstrInfo.cpp b/contrib/llvm/lib/Target/ARM/Thumb1InstrInfo.cpp
index 3fbb433..218311d 100644
--- a/contrib/llvm/lib/Target/ARM/Thumb1InstrInfo.cpp
+++ b/contrib/llvm/lib/Target/ARM/Thumb1InstrInfo.cpp
@@ -13,7 +13,6 @@
#include "Thumb1InstrInfo.h"
#include "ARM.h"
-#include "ARMGenInstrInfo.inc"
#include "ARMMachineFunctionInfo.h"
#include "llvm/CodeGen/MachineFrameInfo.h"
#include "llvm/CodeGen/MachineInstrBuilder.h"
@@ -37,18 +36,8 @@ void Thumb1InstrInfo::copyPhysReg(MachineBasicBlock &MBB,
MachineBasicBlock::iterator I, DebugLoc DL,
unsigned DestReg, unsigned SrcReg,
bool KillSrc) const {
- bool tDest = ARM::tGPRRegClass.contains(DestReg);
- bool tSrc = ARM::tGPRRegClass.contains(SrcReg);
- unsigned Opc = ARM::tMOVgpr2gpr;
- if (tDest && tSrc)
- Opc = ARM::tMOVr;
- else if (tSrc)
- Opc = ARM::tMOVtgpr2gpr;
- else if (tDest)
- Opc = ARM::tMOVgpr2tgpr;
-
- BuildMI(MBB, I, DL, get(Opc), DestReg)
- .addReg(SrcReg, getKillRegState(KillSrc));
+ AddDefaultPred(BuildMI(MBB, I, DL, get(ARM::tMOVr), DestReg)
+ .addReg(SrcReg, getKillRegState(KillSrc)));
assert(ARM::GPRRegClass.contains(DestReg, SrcReg) &&
"Thumb1 can only copy GPR registers");
}
@@ -76,7 +65,7 @@ storeRegToStackSlot(MachineBasicBlock &MBB, MachineBasicBlock::iterator I,
MachineMemOperand::MOStore,
MFI.getObjectSize(FI),
MFI.getObjectAlignment(FI));
- AddDefaultPred(BuildMI(MBB, I, DL, get(ARM::tSpill))
+ AddDefaultPred(BuildMI(MBB, I, DL, get(ARM::tSTRspi))
.addReg(SrcReg, getKillRegState(isKill))
.addFrameIndex(FI).addImm(0).addMemOperand(MMO));
}
@@ -105,7 +94,7 @@ loadRegFromStackSlot(MachineBasicBlock &MBB, MachineBasicBlock::iterator I,
MachineMemOperand::MOLoad,
MFI.getObjectSize(FI),
MFI.getObjectAlignment(FI));
- AddDefaultPred(BuildMI(MBB, I, DL, get(ARM::tRestore), DestReg)
+ AddDefaultPred(BuildMI(MBB, I, DL, get(ARM::tLDRspi), DestReg)
.addFrameIndex(FI).addImm(0).addMemOperand(MMO));
}
}
diff --git a/contrib/llvm/lib/Target/ARM/Thumb1RegisterInfo.cpp b/contrib/llvm/lib/Target/ARM/Thumb1RegisterInfo.cpp
index 6bf5650..4eb0b6c 100644
--- a/contrib/llvm/lib/Target/ARM/Thumb1RegisterInfo.cpp
+++ b/contrib/llvm/lib/Target/ARM/Thumb1RegisterInfo.cpp
@@ -239,13 +239,13 @@ void llvm::emitThumbRegPlusImmediate(MachineBasicBlock &MBB,
unsigned Chunk = (1 << 3) - 1;
unsigned ThisVal = (Bytes > Chunk) ? Chunk : Bytes;
Bytes -= ThisVal;
- const TargetInstrDesc &TID = TII.get(isSub ? ARM::tSUBi3 : ARM::tADDi3);
+ const MCInstrDesc &MCID = TII.get(isSub ? ARM::tSUBi3 : ARM::tADDi3);
const MachineInstrBuilder MIB =
- AddDefaultT1CC(BuildMI(MBB, MBBI, dl, TID, DestReg).setMIFlags(MIFlags));
+ AddDefaultT1CC(BuildMI(MBB, MBBI, dl, MCID, DestReg).setMIFlags(MIFlags));
AddDefaultPred(MIB.addReg(BaseReg, RegState::Kill).addImm(ThisVal));
} else {
- BuildMI(MBB, MBBI, dl, TII.get(ARM::tMOVr), DestReg)
- .addReg(BaseReg, RegState::Kill)
+ AddDefaultPred(BuildMI(MBB, MBBI, dl, TII.get(ARM::tMOVr), DestReg)
+ .addReg(BaseReg, RegState::Kill))
.setMIFlags(MIFlags);
}
BaseReg = DestReg;
@@ -291,8 +291,8 @@ void llvm::emitThumbRegPlusImmediate(MachineBasicBlock &MBB,
}
if (ExtraOpc) {
- const TargetInstrDesc &TID = TII.get(ExtraOpc);
- AddDefaultPred(AddDefaultT1CC(BuildMI(MBB, MBBI, dl, TID, DestReg))
+ const MCInstrDesc &MCID = TII.get(ExtraOpc);
+ AddDefaultPred(AddDefaultT1CC(BuildMI(MBB, MBBI, dl, MCID, DestReg))
.addReg(DestReg, RegState::Kill)
.addImm(((unsigned)NumBytes) & 3)
.setMIFlags(MIFlags));
@@ -360,8 +360,8 @@ static void emitThumbConstant(MachineBasicBlock &MBB,
if (Imm > 0)
emitThumbRegPlusImmediate(MBB, MBBI, dl, DestReg, DestReg, Imm, TII, MRI);
if (isSub) {
- const TargetInstrDesc &TID = TII.get(ARM::tRSB);
- AddDefaultPred(AddDefaultT1CC(BuildMI(MBB, MBBI, dl, TID, DestReg))
+ const MCInstrDesc &MCID = TII.get(ARM::tRSB);
+ AddDefaultPred(AddDefaultT1CC(BuildMI(MBB, MBBI, dl, MCID, DestReg))
.addReg(DestReg, RegState::Kill));
}
}
@@ -377,11 +377,9 @@ static void removeOperands(MachineInstr &MI, unsigned i) {
static unsigned convertToNonSPOpcode(unsigned Opcode) {
switch (Opcode) {
case ARM::tLDRspi:
- case ARM::tRestore: // FIXME: Should this opcode be here?
return ARM::tLDRi;
case ARM::tSTRspi:
- case ARM::tSpill: // FIXME: Should this opcode be here?
return ARM::tSTRi;
}
@@ -396,7 +394,7 @@ rewriteFrameIndex(MachineBasicBlock::iterator II, unsigned FrameRegIdx,
MachineBasicBlock &MBB = *MI.getParent();
DebugLoc dl = MI.getDebugLoc();
unsigned Opcode = MI.getOpcode();
- const TargetInstrDesc &Desc = MI.getDesc();
+ const MCInstrDesc &Desc = MI.getDesc();
unsigned AddrMode = (Desc.TSFlags & ARMII::AddrModeMask);
if (Opcode == ARM::tADDrSPi) {
@@ -419,13 +417,12 @@ rewriteFrameIndex(MachineBasicBlock::iterator II, unsigned FrameRegIdx,
unsigned PredReg;
if (Offset == 0 && getInstrPredicate(&MI, PredReg) == ARMCC::AL) {
// Turn it into a move.
- MI.setDesc(TII.get(ARM::tMOVgpr2tgpr));
+ MI.setDesc(TII.get(ARM::tMOVr));
MI.getOperand(FrameRegIdx).ChangeToRegister(FrameReg, false);
- // Remove offset and remaining explicit predicate operands.
- do MI.RemoveOperand(FrameRegIdx+1);
- while (MI.getNumOperands() > FrameRegIdx+1 &&
- (!MI.getOperand(FrameRegIdx+1).isReg() ||
- !MI.getOperand(FrameRegIdx+1).isImm()));
+ // Remove offset and add predicate operands.
+ MI.RemoveOperand(FrameRegIdx+1);
+ MachineInstrBuilder MIB(&MI);
+ AddDefaultPred(MIB);
return true;
}
@@ -524,7 +521,7 @@ rewriteFrameIndex(MachineBasicBlock::iterator II, unsigned FrameRegIdx,
// If this is a thumb spill / restore, we will be using a constpool load to
// materialize the offset.
- if (Opcode == ARM::tRestore || Opcode == ARM::tSpill) {
+ if (Opcode == ARM::tLDRspi || Opcode == ARM::tSTRspi) {
ImmOp.ChangeToImmediate(0);
} else {
// Otherwise, it didn't fit. Pull in what we can to simplify the immed.
@@ -567,8 +564,9 @@ Thumb1RegisterInfo::saveScavengerRegister(MachineBasicBlock &MBB,
// the function, the offset will be negative. Use R12 instead since that's
// a call clobbered register that we know won't be used in Thumb1 mode.
DebugLoc DL;
- BuildMI(MBB, I, DL, TII.get(ARM::tMOVtgpr2gpr)).
- addReg(ARM::R12, RegState::Define).addReg(Reg, RegState::Kill);
+ AddDefaultPred(BuildMI(MBB, I, DL, TII.get(ARM::tMOVr))
+ .addReg(ARM::R12, RegState::Define)
+ .addReg(Reg, RegState::Kill));
// The UseMI is where we would like to restore the register. If there's
// interference with R12 before then, however, we'll need to restore it
@@ -591,8 +589,8 @@ Thumb1RegisterInfo::saveScavengerRegister(MachineBasicBlock &MBB,
}
}
// Restore the register from R12
- BuildMI(MBB, UseMI, DL, TII.get(ARM::tMOVgpr2tgpr)).
- addReg(Reg, RegState::Define).addReg(ARM::R12, RegState::Kill);
+ AddDefaultPred(BuildMI(MBB, UseMI, DL, TII.get(ARM::tMOVr)).
+ addReg(Reg, RegState::Define).addReg(ARM::R12, RegState::Kill));
return true;
}
@@ -653,7 +651,7 @@ Thumb1RegisterInfo::eliminateFrameIndex(MachineBasicBlock::iterator II,
assert(Offset && "This code isn't needed if offset already handled!");
unsigned Opcode = MI.getOpcode();
- const TargetInstrDesc &Desc = MI.getDesc();
+ const MCInstrDesc &Desc = MI.getDesc();
// Remove predicate first.
int PIdx = MI.findFirstPredOperandIdx();
@@ -664,7 +662,7 @@ Thumb1RegisterInfo::eliminateFrameIndex(MachineBasicBlock::iterator II,
// Use the destination register to materialize sp + offset.
unsigned TmpReg = MI.getOperand(0).getReg();
bool UseRR = false;
- if (Opcode == ARM::tRestore) {
+ if (Opcode == ARM::tLDRspi) {
if (FrameReg == ARM::SP)
emitThumbRegPlusImmInReg(MBB, II, dl, TmpReg, FrameReg,
Offset, false, TII, *this);
@@ -687,7 +685,7 @@ Thumb1RegisterInfo::eliminateFrameIndex(MachineBasicBlock::iterator II,
VReg = MF.getRegInfo().createVirtualRegister(ARM::tGPRRegisterClass);
bool UseRR = false;
- if (Opcode == ARM::tSpill) {
+ if (Opcode == ARM::tSTRspi) {
if (FrameReg == ARM::SP)
emitThumbRegPlusImmInReg(MBB, II, dl, VReg, FrameReg,
Offset, false, TII, *this);
diff --git a/contrib/llvm/lib/Target/ARM/Thumb2ITBlockPass.cpp b/contrib/llvm/lib/Target/ARM/Thumb2ITBlockPass.cpp
index 45e6937..360ec00 100644
--- a/contrib/llvm/lib/Target/ARM/Thumb2ITBlockPass.cpp
+++ b/contrib/llvm/lib/Target/ARM/Thumb2ITBlockPass.cpp
@@ -98,9 +98,6 @@ static bool isCopy(MachineInstr *MI) {
case ARM::MOVr:
case ARM::MOVr_TC:
case ARM::tMOVr:
- case ARM::tMOVgpr2tgpr:
- case ARM::tMOVtgpr2gpr:
- case ARM::tMOVgpr2gpr:
case ARM::t2MOVr:
return true;
}
diff --git a/contrib/llvm/lib/Target/ARM/Thumb2InstrInfo.cpp b/contrib/llvm/lib/Target/ARM/Thumb2InstrInfo.cpp
index d169dbb..51b56aa 100644
--- a/contrib/llvm/lib/Target/ARM/Thumb2InstrInfo.cpp
+++ b/contrib/llvm/lib/Target/ARM/Thumb2InstrInfo.cpp
@@ -15,7 +15,6 @@
#include "ARM.h"
#include "ARMConstantPoolValue.h"
#include "ARMAddressingModes.h"
-#include "ARMGenInstrInfo.inc"
#include "ARMMachineFunctionInfo.h"
#include "Thumb2InstrInfo.h"
#include "llvm/CodeGen/MachineFrameInfo.h"
@@ -113,18 +112,8 @@ void Thumb2InstrInfo::copyPhysReg(MachineBasicBlock &MBB,
if (!ARM::GPRRegClass.contains(DestReg, SrcReg))
return ARMBaseInstrInfo::copyPhysReg(MBB, I, DL, DestReg, SrcReg, KillSrc);
- bool tDest = ARM::tGPRRegClass.contains(DestReg);
- bool tSrc = ARM::tGPRRegClass.contains(SrcReg);
- unsigned Opc = ARM::tMOVgpr2gpr;
- if (tDest && tSrc)
- Opc = ARM::tMOVr;
- else if (tSrc)
- Opc = ARM::tMOVtgpr2gpr;
- else if (tDest)
- Opc = ARM::tMOVgpr2tgpr;
-
- BuildMI(MBB, I, DL, get(Opc), DestReg)
- .addReg(SrcReg, getKillRegState(KillSrc));
+ AddDefaultPred(BuildMI(MBB, I, DL, get(ARM::tMOVr), DestReg)
+ .addReg(SrcReg, getKillRegState(KillSrc)));
}
void Thumb2InstrInfo::
@@ -232,8 +221,8 @@ void llvm::emitT2RegPlusImmediate(MachineBasicBlock &MBB,
unsigned Opc = 0;
if (DestReg == ARM::SP && BaseReg != ARM::SP) {
// mov sp, rn. Note t2MOVr cannot be used.
- BuildMI(MBB, MBBI, dl, TII.get(ARM::tMOVgpr2gpr),DestReg)
- .addReg(BaseReg).setMIFlags(MIFlags);
+ AddDefaultPred(BuildMI(MBB, MBBI, dl, TII.get(ARM::tMOVr),DestReg)
+ .addReg(BaseReg).setMIFlags(MIFlags));
BaseReg = ARM::SP;
continue;
}
@@ -252,7 +241,7 @@ void llvm::emitT2RegPlusImmediate(MachineBasicBlock &MBB,
}
// sub rd, sp, so_imm
- Opc = isSub ? ARM::t2SUBrSPi : ARM::t2ADDrSPi;
+ Opc = isSub ? ARM::t2SUBri : ARM::t2ADDri;
if (ARM_AM::getT2SOImmVal(NumBytes) != -1) {
NumBytes = 0;
} else {
@@ -396,7 +385,7 @@ bool llvm::rewriteT2FrameIndex(MachineInstr &MI, unsigned FrameRegIdx,
unsigned FrameReg, int &Offset,
const ARMBaseInstrInfo &TII) {
unsigned Opcode = MI.getOpcode();
- const TargetInstrDesc &Desc = MI.getDesc();
+ const MCInstrDesc &Desc = MI.getDesc();
unsigned AddrMode = (Desc.TSFlags & ARMII::AddrModeMask);
bool isSub = false;
@@ -410,25 +399,24 @@ bool llvm::rewriteT2FrameIndex(MachineInstr &MI, unsigned FrameRegIdx,
unsigned PredReg;
if (Offset == 0 && getInstrPredicate(&MI, PredReg) == ARMCC::AL) {
// Turn it into a move.
- MI.setDesc(TII.get(ARM::tMOVgpr2gpr));
+ MI.setDesc(TII.get(ARM::tMOVr));
MI.getOperand(FrameRegIdx).ChangeToRegister(FrameReg, false);
// Remove offset and remaining explicit predicate operands.
do MI.RemoveOperand(FrameRegIdx+1);
- while (MI.getNumOperands() > FrameRegIdx+1 &&
- (!MI.getOperand(FrameRegIdx+1).isReg() ||
- !MI.getOperand(FrameRegIdx+1).isImm()));
+ while (MI.getNumOperands() > FrameRegIdx+1);
+ MachineInstrBuilder MIB(&MI);
+ AddDefaultPred(MIB);
return true;
}
- bool isSP = FrameReg == ARM::SP;
bool HasCCOut = Opcode != ARM::t2ADDri12;
if (Offset < 0) {
Offset = -Offset;
isSub = true;
- MI.setDesc(TII.get(isSP ? ARM::t2SUBrSPi : ARM::t2SUBri));
+ MI.setDesc(TII.get(ARM::t2SUBri));
} else {
- MI.setDesc(TII.get(isSP ? ARM::t2ADDrSPi : ARM::t2ADDri));
+ MI.setDesc(TII.get(ARM::t2ADDri));
}
// Common case: small offset, fits into instruction.
@@ -444,9 +432,7 @@ bool llvm::rewriteT2FrameIndex(MachineInstr &MI, unsigned FrameRegIdx,
// Another common case: imm12.
if (Offset < 4096 &&
(!HasCCOut || MI.getOperand(MI.getNumOperands()-1).getReg() == 0)) {
- unsigned NewOpc = isSP
- ? (isSub ? ARM::t2SUBrSPi12 : ARM::t2ADDrSPi12)
- : (isSub ? ARM::t2SUBri12 : ARM::t2ADDri12);
+ unsigned NewOpc = isSub ? ARM::t2SUBri12 : ARM::t2ADDri12;
MI.setDesc(TII.get(NewOpc));
MI.getOperand(FrameRegIdx).ChangeToRegister(FrameReg, false);
MI.getOperand(FrameRegIdx+1).ChangeToImmediate(Offset);
@@ -579,8 +565,7 @@ void
Thumb2InstrInfo::scheduleTwoAddrSource(MachineInstr *SrcMI,
MachineInstr *UseMI,
const TargetRegisterInfo &TRI) const {
- if (SrcMI->getOpcode() != ARM::tMOVgpr2gpr ||
- SrcMI->getOperand(1).isKill())
+ if (SrcMI->getOpcode() != ARM::tMOVr || SrcMI->getOperand(1).isKill())
return;
unsigned PredReg = 0;
diff --git a/contrib/llvm/lib/Target/ARM/Thumb2SizeReduction.cpp b/contrib/llvm/lib/Target/ARM/Thumb2SizeReduction.cpp
index ce2e966..c741a6e 100644
--- a/contrib/llvm/lib/Target/ARM/Thumb2SizeReduction.cpp
+++ b/contrib/llvm/lib/Target/ARM/Thumb2SizeReduction.cpp
@@ -57,10 +57,8 @@ namespace {
static const ReduceEntry ReduceTable[] = {
// Wide, Narrow1, Narrow2, imm1,imm2, lo1, lo2, P/C, PF, S
{ ARM::t2ADCrr, 0, ARM::tADC, 0, 0, 0, 1, 0,0, 0,0 },
- { ARM::t2ADDri, ARM::tADDi3, ARM::tADDi8, 3, 8, 1, 1, 0,0, 0,0 },
+ { ARM::t2ADDri, ARM::tADDi3, ARM::tADDi8, 3, 8, 1, 1, 0,0, 0,1 },
{ ARM::t2ADDrr, ARM::tADDrr, ARM::tADDhirr, 0, 0, 1, 0, 0,1, 0,0 },
- // Note: immediate scale is 4.
- { ARM::t2ADDrSPi,ARM::tADDrSPi,0, 8, 0, 1, 0, 1,0, 0,1 },
{ ARM::t2ADDSri,ARM::tADDi3, ARM::tADDi8, 3, 8, 1, 1, 2,2, 0,1 },
{ ARM::t2ADDSrr,ARM::tADDrr, 0, 0, 0, 1, 0, 2,0, 0,1 },
{ ARM::t2ANDrr, 0, ARM::tAND, 0, 0, 0, 1, 0,0, 1,0 },
@@ -84,9 +82,7 @@ namespace {
{ ARM::t2MOVi, ARM::tMOVi8, 0, 8, 0, 1, 0, 0,0, 0,0 },
{ ARM::t2MOVi16,ARM::tMOVi8, 0, 8, 0, 1, 0, 0,0, 0,1 },
// FIXME: Do we need the 16-bit 'S' variant?
- { ARM::t2MOVr,ARM::tMOVgpr2gpr,0, 0, 0, 0, 0, 1,0, 0,0 },
- { ARM::t2MOVCCr,0, ARM::tMOVCCr, 0, 0, 0, 0, 0,1, 0,0 },
- { ARM::t2MOVCCi,0, ARM::tMOVCCi, 0, 8, 0, 1, 0,1, 0,0 },
+ { ARM::t2MOVr,ARM::tMOVr, 0, 0, 0, 0, 0, 1,0, 0,0 },
{ ARM::t2MUL, 0, ARM::tMUL, 0, 0, 0, 1, 0,0, 1,0 },
{ ARM::t2MVNr, ARM::tMVN, 0, 0, 0, 1, 0, 0,0, 0,0 },
{ ARM::t2ORRrr, 0, ARM::tORR, 0, 0, 0, 1, 0,0, 1,0 },
@@ -189,8 +185,8 @@ Thumb2SizeReduce::Thumb2SizeReduce() : MachineFunctionPass(ID) {
}
}
-static bool HasImplicitCPSRDef(const TargetInstrDesc &TID) {
- for (const unsigned *Regs = TID.ImplicitDefs; *Regs; ++Regs)
+static bool HasImplicitCPSRDef(const MCInstrDesc &MCID) {
+ for (const unsigned *Regs = MCID.ImplicitDefs; *Regs; ++Regs)
if (*Regs == ARM::CPSR)
return true;
return false;
@@ -291,7 +287,7 @@ static bool VerifyLowRegs(MachineInstr *MI) {
Opc == ARM::t2LDMDB || Opc == ARM::t2LDMIA_UPD ||
Opc == ARM::t2LDMDB_UPD);
bool isLROk = (Opc == ARM::t2STMIA_UPD || Opc == ARM::t2STMDB_UPD);
- bool isSPOk = isPCOk || isLROk || (Opc == ARM::t2ADDrSPi);
+ bool isSPOk = isPCOk || isLROk;
for (unsigned i = 0, e = MI->getNumOperands(); i != e; ++i) {
const MachineOperand &MO = MI->getOperand(i);
if (!MO.isReg() || MO.isImplicit())
@@ -481,14 +477,54 @@ bool
Thumb2SizeReduce::ReduceSpecial(MachineBasicBlock &MBB, MachineInstr *MI,
const ReduceEntry &Entry,
bool LiveCPSR, MachineInstr *CPSRDef) {
+ unsigned Opc = MI->getOpcode();
+ if (Opc == ARM::t2ADDri) {
+ // If the source register is SP, try to reduce to tADDrSPi, otherwise
+ // it's a normal reduce.
+ if (MI->getOperand(1).getReg() != ARM::SP) {
+ if (ReduceTo2Addr(MBB, MI, Entry, LiveCPSR, CPSRDef))
+ return true;
+ return ReduceToNarrow(MBB, MI, Entry, LiveCPSR, CPSRDef);
+ }
+ // Try to reduce to tADDrSPi.
+ unsigned Imm = MI->getOperand(2).getImm();
+ // The immediate must be in range, the destination register must be a low
+ // reg, the predicate must be "always" and the condition flags must not
+ // be being set.
+ if (Imm & 3 || Imm > 1020)
+ return false;
+ if (!isARMLowRegister(MI->getOperand(0).getReg()))
+ return false;
+ if (MI->getOperand(3).getImm() != ARMCC::AL)
+ return false;
+ const MCInstrDesc &MCID = MI->getDesc();
+ if (MCID.hasOptionalDef() &&
+ MI->getOperand(MCID.getNumOperands()-1).getReg() == ARM::CPSR)
+ return false;
+
+ MachineInstrBuilder MIB = BuildMI(MBB, *MI, MI->getDebugLoc(),
+ TII->get(ARM::tADDrSPi))
+ .addOperand(MI->getOperand(0))
+ .addOperand(MI->getOperand(1))
+ .addImm(Imm / 4); // The tADDrSPi has an implied scale by four.
+
+ // Transfer MI flags.
+ MIB.setMIFlags(MI->getFlags());
+
+ DEBUG(errs() << "Converted 32-bit: " << *MI << " to 16-bit: " <<*MIB);
+
+ MBB.erase(MI);
+ ++NumNarrows;
+ return true;
+ }
+
if (Entry.LowRegs1 && !VerifyLowRegs(MI))
return false;
- const TargetInstrDesc &TID = MI->getDesc();
- if (TID.mayLoad() || TID.mayStore())
+ const MCInstrDesc &MCID = MI->getDesc();
+ if (MCID.mayLoad() || MCID.mayStore())
return ReduceLoadStore(MBB, MI, Entry);
- unsigned Opc = MI->getOpcode();
switch (Opc) {
default: break;
case ARM::t2ADDSri:
@@ -531,13 +567,6 @@ Thumb2SizeReduce::ReduceSpecial(MachineBasicBlock &MBB, MachineInstr *MI,
return true;
return ReduceToNarrow(MBB, MI, Entry, LiveCPSR, CPSRDef);
}
- case ARM::t2ADDrSPi: {
- static const ReduceEntry NarrowEntry =
- { ARM::t2ADDrSPi,ARM::tADDspi, 0, 7, 0, 1, 0, 1, 0, 0,1 };
- if (MI->getOperand(0).getReg() == ARM::SP)
- return ReduceToNarrow(MBB, MI, NarrowEntry, LiveCPSR, CPSRDef);
- return ReduceToNarrow(MBB, MI, Entry, LiveCPSR, CPSRDef);
- }
}
return false;
}
@@ -576,23 +605,23 @@ Thumb2SizeReduce::ReduceTo2Addr(MachineBasicBlock &MBB, MachineInstr *MI,
}
// Check if it's possible / necessary to transfer the predicate.
- const TargetInstrDesc &NewTID = TII->get(Entry.NarrowOpc2);
+ const MCInstrDesc &NewMCID = TII->get(Entry.NarrowOpc2);
unsigned PredReg = 0;
ARMCC::CondCodes Pred = getInstrPredicate(MI, PredReg);
bool SkipPred = false;
if (Pred != ARMCC::AL) {
- if (!NewTID.isPredicable())
+ if (!NewMCID.isPredicable())
// Can't transfer predicate, fail.
return false;
} else {
- SkipPred = !NewTID.isPredicable();
+ SkipPred = !NewMCID.isPredicable();
}
bool HasCC = false;
bool CCDead = false;
- const TargetInstrDesc &TID = MI->getDesc();
- if (TID.hasOptionalDef()) {
- unsigned NumOps = TID.getNumOperands();
+ const MCInstrDesc &MCID = MI->getDesc();
+ if (MCID.hasOptionalDef()) {
+ unsigned NumOps = MCID.getNumOperands();
HasCC = (MI->getOperand(NumOps-1).getReg() == ARM::CPSR);
if (HasCC && MI->getOperand(NumOps-1).isDead())
CCDead = true;
@@ -602,15 +631,15 @@ Thumb2SizeReduce::ReduceTo2Addr(MachineBasicBlock &MBB, MachineInstr *MI,
// Avoid adding a false dependency on partial flag update by some 16-bit
// instructions which has the 's' bit set.
- if (Entry.PartFlag && NewTID.hasOptionalDef() && HasCC &&
+ if (Entry.PartFlag && NewMCID.hasOptionalDef() && HasCC &&
canAddPseudoFlagDep(CPSRDef, MI))
return false;
// Add the 16-bit instruction.
DebugLoc dl = MI->getDebugLoc();
- MachineInstrBuilder MIB = BuildMI(MBB, *MI, dl, NewTID);
+ MachineInstrBuilder MIB = BuildMI(MBB, *MI, dl, NewMCID);
MIB.addOperand(MI->getOperand(0));
- if (NewTID.hasOptionalDef()) {
+ if (NewMCID.hasOptionalDef()) {
if (HasCC)
AddDefaultT1CC(MIB, CCDead);
else
@@ -618,11 +647,11 @@ Thumb2SizeReduce::ReduceTo2Addr(MachineBasicBlock &MBB, MachineInstr *MI,
}
// Transfer the rest of operands.
- unsigned NumOps = TID.getNumOperands();
+ unsigned NumOps = MCID.getNumOperands();
for (unsigned i = 1, e = MI->getNumOperands(); i != e; ++i) {
- if (i < NumOps && TID.OpInfo[i].isOptionalDef())
+ if (i < NumOps && MCID.OpInfo[i].isOptionalDef())
continue;
- if (SkipPred && TID.OpInfo[i].isPredicate())
+ if (SkipPred && MCID.OpInfo[i].isPredicate())
continue;
MIB.addOperand(MI->getOperand(i));
}
@@ -645,47 +674,44 @@ Thumb2SizeReduce::ReduceToNarrow(MachineBasicBlock &MBB, MachineInstr *MI,
return false;
unsigned Limit = ~0U;
- unsigned Scale = (Entry.WideOpc == ARM::t2ADDrSPi) ? 4 : 1;
if (Entry.Imm1Limit)
- Limit = ((1 << Entry.Imm1Limit) - 1) * Scale;
+ Limit = (1 << Entry.Imm1Limit) - 1;
- const TargetInstrDesc &TID = MI->getDesc();
- for (unsigned i = 0, e = TID.getNumOperands(); i != e; ++i) {
- if (TID.OpInfo[i].isPredicate())
+ const MCInstrDesc &MCID = MI->getDesc();
+ for (unsigned i = 0, e = MCID.getNumOperands(); i != e; ++i) {
+ if (MCID.OpInfo[i].isPredicate())
continue;
const MachineOperand &MO = MI->getOperand(i);
if (MO.isReg()) {
unsigned Reg = MO.getReg();
if (!Reg || Reg == ARM::CPSR)
continue;
- if (Entry.WideOpc == ARM::t2ADDrSPi && Reg == ARM::SP)
- continue;
if (Entry.LowRegs1 && !isARMLowRegister(Reg))
return false;
} else if (MO.isImm() &&
- !TID.OpInfo[i].isPredicate()) {
- if (((unsigned)MO.getImm()) > Limit || (MO.getImm() & (Scale-1)) != 0)
+ !MCID.OpInfo[i].isPredicate()) {
+ if (((unsigned)MO.getImm()) > Limit)
return false;
}
}
// Check if it's possible / necessary to transfer the predicate.
- const TargetInstrDesc &NewTID = TII->get(Entry.NarrowOpc1);
+ const MCInstrDesc &NewMCID = TII->get(Entry.NarrowOpc1);
unsigned PredReg = 0;
ARMCC::CondCodes Pred = getInstrPredicate(MI, PredReg);
bool SkipPred = false;
if (Pred != ARMCC::AL) {
- if (!NewTID.isPredicable())
+ if (!NewMCID.isPredicable())
// Can't transfer predicate, fail.
return false;
} else {
- SkipPred = !NewTID.isPredicable();
+ SkipPred = !NewMCID.isPredicable();
}
bool HasCC = false;
bool CCDead = false;
- if (TID.hasOptionalDef()) {
- unsigned NumOps = TID.getNumOperands();
+ if (MCID.hasOptionalDef()) {
+ unsigned NumOps = MCID.getNumOperands();
HasCC = (MI->getOperand(NumOps-1).getReg() == ARM::CPSR);
if (HasCC && MI->getOperand(NumOps-1).isDead())
CCDead = true;
@@ -695,15 +721,15 @@ Thumb2SizeReduce::ReduceToNarrow(MachineBasicBlock &MBB, MachineInstr *MI,
// Avoid adding a false dependency on partial flag update by some 16-bit
// instructions which has the 's' bit set.
- if (Entry.PartFlag && NewTID.hasOptionalDef() && HasCC &&
+ if (Entry.PartFlag && NewMCID.hasOptionalDef() && HasCC &&
canAddPseudoFlagDep(CPSRDef, MI))
return false;
// Add the 16-bit instruction.
DebugLoc dl = MI->getDebugLoc();
- MachineInstrBuilder MIB = BuildMI(MBB, *MI, dl, NewTID);
+ MachineInstrBuilder MIB = BuildMI(MBB, *MI, dl, NewMCID);
MIB.addOperand(MI->getOperand(0));
- if (NewTID.hasOptionalDef()) {
+ if (NewMCID.hasOptionalDef()) {
if (HasCC)
AddDefaultT1CC(MIB, CCDead);
else
@@ -711,29 +737,25 @@ Thumb2SizeReduce::ReduceToNarrow(MachineBasicBlock &MBB, MachineInstr *MI,
}
// Transfer the rest of operands.
- unsigned NumOps = TID.getNumOperands();
+ unsigned NumOps = MCID.getNumOperands();
for (unsigned i = 1, e = MI->getNumOperands(); i != e; ++i) {
- if (i < NumOps && TID.OpInfo[i].isOptionalDef())
+ if (i < NumOps && MCID.OpInfo[i].isOptionalDef())
continue;
- if ((TID.getOpcode() == ARM::t2RSBSri ||
- TID.getOpcode() == ARM::t2RSBri) && i == 2)
+ if ((MCID.getOpcode() == ARM::t2RSBSri ||
+ MCID.getOpcode() == ARM::t2RSBri) && i == 2)
// Skip the zero immediate operand, it's now implicit.
continue;
- bool isPred = (i < NumOps && TID.OpInfo[i].isPredicate());
+ bool isPred = (i < NumOps && MCID.OpInfo[i].isPredicate());
if (SkipPred && isPred)
continue;
const MachineOperand &MO = MI->getOperand(i);
- if (Scale > 1 && !isPred && MO.isImm())
- MIB.addImm(MO.getImm() / Scale);
- else {
- if (MO.isReg() && MO.isImplicit() && MO.getReg() == ARM::CPSR)
- // Skip implicit def of CPSR. Either it's modeled as an optional
- // def now or it's already an implicit def on the new instruction.
- continue;
- MIB.addOperand(MO);
- }
+ if (MO.isReg() && MO.isImplicit() && MO.getReg() == ARM::CPSR)
+ // Skip implicit def of CPSR. Either it's modeled as an optional
+ // def now or it's already an implicit def on the new instruction.
+ continue;
+ MIB.addOperand(MO);
}
- if (!TID.isPredicable() && NewTID.isPredicable())
+ if (!MCID.isPredicable() && NewMCID.isPredicable())
AddDefaultPred(MIB);
// Transfer MI flags.
diff --git a/contrib/llvm/lib/Target/Alpha/Alpha.h b/contrib/llvm/lib/Target/Alpha/Alpha.h
index 2c359da..6ffaf45 100644
--- a/contrib/llvm/lib/Target/Alpha/Alpha.h
+++ b/contrib/llvm/lib/Target/Alpha/Alpha.h
@@ -15,6 +15,7 @@
#ifndef TARGET_ALPHA_H
#define TARGET_ALPHA_H
+#include "MCTargetDesc/AlphaMCTargetDesc.h"
#include "llvm/Target/TargetMachine.h"
namespace llvm {
@@ -37,17 +38,6 @@ namespace llvm {
FunctionPass *createAlphaLLRPPass(AlphaTargetMachine &tm);
FunctionPass *createAlphaBranchSelectionPass();
- extern Target TheAlphaTarget;
-
} // end namespace llvm;
-// Defines symbolic names for Alpha registers. This defines a mapping from
-// register name to register number.
-//
-#include "AlphaGenRegisterNames.inc"
-
-// Defines symbolic names for the Alpha instructions.
-//
-#include "AlphaGenInstrNames.inc"
-
#endif
diff --git a/contrib/llvm/lib/Target/Alpha/AlphaISelLowering.cpp b/contrib/llvm/lib/Target/Alpha/AlphaISelLowering.cpp
index 0875cfd..de003fb 100644
--- a/contrib/llvm/lib/Target/Alpha/AlphaISelLowering.cpp
+++ b/contrib/llvm/lib/Target/Alpha/AlphaISelLowering.cpp
@@ -122,6 +122,9 @@ AlphaTargetLowering::AlphaTargetLowering(TargetMachine &TM)
setOperationAction(ISD::FPOW , MVT::f32, Expand);
setOperationAction(ISD::FPOW , MVT::f64, Expand);
+ setOperationAction(ISD::FMA, MVT::f64, Expand);
+ setOperationAction(ISD::FMA, MVT::f32, Expand);
+
setOperationAction(ISD::SETCC, MVT::f32, Promote);
setOperationAction(ISD::BITCAST, MVT::f32, Promote);
@@ -824,41 +827,24 @@ AlphaTargetLowering::getSingleConstraintMatchWeight(
return weight;
}
-std::vector<unsigned> AlphaTargetLowering::
-getRegClassForInlineAsmConstraint(const std::string &Constraint,
- EVT VT) const {
+/// Given a register class constraint, like 'r', if this corresponds directly
+/// to an LLVM register class, return a register of 0 and the register class
+/// pointer.
+std::pair<unsigned, const TargetRegisterClass*> AlphaTargetLowering::
+getRegForInlineAsmConstraint(const std::string &Constraint, EVT VT) const
+{
if (Constraint.size() == 1) {
switch (Constraint[0]) {
- default: break; // Unknown constriant letter
- case 'f':
- return make_vector<unsigned>(Alpha::F0 , Alpha::F1 , Alpha::F2 ,
- Alpha::F3 , Alpha::F4 , Alpha::F5 ,
- Alpha::F6 , Alpha::F7 , Alpha::F8 ,
- Alpha::F9 , Alpha::F10, Alpha::F11,
- Alpha::F12, Alpha::F13, Alpha::F14,
- Alpha::F15, Alpha::F16, Alpha::F17,
- Alpha::F18, Alpha::F19, Alpha::F20,
- Alpha::F21, Alpha::F22, Alpha::F23,
- Alpha::F24, Alpha::F25, Alpha::F26,
- Alpha::F27, Alpha::F28, Alpha::F29,
- Alpha::F30, Alpha::F31, 0);
case 'r':
- return make_vector<unsigned>(Alpha::R0 , Alpha::R1 , Alpha::R2 ,
- Alpha::R3 , Alpha::R4 , Alpha::R5 ,
- Alpha::R6 , Alpha::R7 , Alpha::R8 ,
- Alpha::R9 , Alpha::R10, Alpha::R11,
- Alpha::R12, Alpha::R13, Alpha::R14,
- Alpha::R15, Alpha::R16, Alpha::R17,
- Alpha::R18, Alpha::R19, Alpha::R20,
- Alpha::R21, Alpha::R22, Alpha::R23,
- Alpha::R24, Alpha::R25, Alpha::R26,
- Alpha::R27, Alpha::R28, Alpha::R29,
- Alpha::R30, Alpha::R31, 0);
+ return std::make_pair(0U, Alpha::GPRCRegisterClass);
+ case 'f':
+ return VT == MVT::f64 ? std::make_pair(0U, Alpha::F8RCRegisterClass) :
+ std::make_pair(0U, Alpha::F4RCRegisterClass);
}
}
-
- return std::vector<unsigned>();
+ return TargetLowering::getRegForInlineAsmConstraint(Constraint, VT);
}
+
//===----------------------------------------------------------------------===//
// Other Lowering Code
//===----------------------------------------------------------------------===//
diff --git a/contrib/llvm/lib/Target/Alpha/AlphaISelLowering.h b/contrib/llvm/lib/Target/Alpha/AlphaISelLowering.h
index d38c314..13383f4 100644
--- a/contrib/llvm/lib/Target/Alpha/AlphaISelLowering.h
+++ b/contrib/llvm/lib/Target/Alpha/AlphaISelLowering.h
@@ -94,9 +94,9 @@ namespace llvm {
ConstraintWeight getSingleConstraintMatchWeight(
AsmOperandInfo &info, const char *constraint) const;
- std::vector<unsigned>
- getRegClassForInlineAsmConstraint(const std::string &Constraint,
- EVT VT) const;
+ std::pair<unsigned, const TargetRegisterClass*>
+ getRegForInlineAsmConstraint(const std::string &Constraint,
+ EVT VT) const;
MachineBasicBlock *
EmitInstrWithCustomInserter(MachineInstr *MI,
diff --git a/contrib/llvm/lib/Target/Alpha/AlphaInstrInfo.cpp b/contrib/llvm/lib/Target/Alpha/AlphaInstrInfo.cpp
index 5a2f561..4dcec8f 100644
--- a/contrib/llvm/lib/Target/Alpha/AlphaInstrInfo.cpp
+++ b/contrib/llvm/lib/Target/Alpha/AlphaInstrInfo.cpp
@@ -14,17 +14,21 @@
#include "Alpha.h"
#include "AlphaInstrInfo.h"
#include "AlphaMachineFunctionInfo.h"
-#include "AlphaGenInstrInfo.inc"
+#include "llvm/CodeGen/MachineInstrBuilder.h"
#include "llvm/CodeGen/MachineRegisterInfo.h"
+#include "llvm/Target/TargetRegistry.h"
#include "llvm/ADT/STLExtras.h"
#include "llvm/ADT/SmallVector.h"
-#include "llvm/CodeGen/MachineInstrBuilder.h"
#include "llvm/Support/ErrorHandling.h"
+
+#define GET_INSTRINFO_CTOR
+#include "AlphaGenInstrInfo.inc"
using namespace llvm;
AlphaInstrInfo::AlphaInstrInfo()
- : TargetInstrInfoImpl(AlphaInsts, array_lengthof(AlphaInsts)),
- RI(*this) { }
+ : AlphaGenInstrInfo(Alpha::ADJUSTSTACKDOWN, Alpha::ADJUSTSTACKUP),
+ RI(*this) {
+}
unsigned
diff --git a/contrib/llvm/lib/Target/Alpha/AlphaInstrInfo.h b/contrib/llvm/lib/Target/Alpha/AlphaInstrInfo.h
index ee6077a..337a85c 100644
--- a/contrib/llvm/lib/Target/Alpha/AlphaInstrInfo.h
+++ b/contrib/llvm/lib/Target/Alpha/AlphaInstrInfo.h
@@ -17,9 +17,12 @@
#include "llvm/Target/TargetInstrInfo.h"
#include "AlphaRegisterInfo.h"
+#define GET_INSTRINFO_HEADER
+#include "AlphaGenInstrInfo.inc"
+
namespace llvm {
-class AlphaInstrInfo : public TargetInstrInfoImpl {
+class AlphaInstrInfo : public AlphaGenInstrInfo {
const AlphaRegisterInfo RI;
public:
AlphaInstrInfo();
diff --git a/contrib/llvm/lib/Target/Alpha/AlphaRegisterInfo.cpp b/contrib/llvm/lib/Target/Alpha/AlphaRegisterInfo.cpp
index d6c3809..df8f157 100644
--- a/contrib/llvm/lib/Target/Alpha/AlphaRegisterInfo.cpp
+++ b/contrib/llvm/lib/Target/Alpha/AlphaRegisterInfo.cpp
@@ -33,10 +33,14 @@
#include "llvm/ADT/BitVector.h"
#include "llvm/ADT/STLExtras.h"
#include <cstdlib>
+
+#define GET_REGINFO_TARGET_DESC
+#include "AlphaGenRegisterInfo.inc"
+
using namespace llvm;
AlphaRegisterInfo::AlphaRegisterInfo(const TargetInstrInfo &tii)
- : AlphaGenRegisterInfo(Alpha::ADJUSTSTACKDOWN, Alpha::ADJUSTSTACKUP),
+ : AlphaGenRegisterInfo(),
TII(tii) {
}
@@ -204,10 +208,8 @@ int AlphaRegisterInfo::getLLVMRegNum(unsigned DwarfRegNum, bool isEH) const {
return -1;
}
-#include "AlphaGenRegisterInfo.inc"
-
std::string AlphaRegisterInfo::getPrettyName(unsigned reg)
{
- std::string s(RegisterDescriptors[reg].Name);
+ std::string s(AlphaRegDesc[reg].Name);
return s;
}
diff --git a/contrib/llvm/lib/Target/Alpha/AlphaRegisterInfo.h b/contrib/llvm/lib/Target/Alpha/AlphaRegisterInfo.h
index ffe6cf1..1072bf7 100644
--- a/contrib/llvm/lib/Target/Alpha/AlphaRegisterInfo.h
+++ b/contrib/llvm/lib/Target/Alpha/AlphaRegisterInfo.h
@@ -15,7 +15,9 @@
#define ALPHAREGISTERINFO_H
#include "llvm/Target/TargetRegisterInfo.h"
-#include "AlphaGenRegisterInfo.h.inc"
+
+#define GET_REGINFO_HEADER
+#include "AlphaGenRegisterInfo.inc"
namespace llvm {
diff --git a/contrib/llvm/lib/Target/Alpha/AlphaRegisterInfo.td b/contrib/llvm/lib/Target/Alpha/AlphaRegisterInfo.td
index d644f05..32120d7 100644
--- a/contrib/llvm/lib/Target/Alpha/AlphaRegisterInfo.td
+++ b/contrib/llvm/lib/Target/Alpha/AlphaRegisterInfo.td
@@ -110,10 +110,10 @@ def F31 : FPR<31, "$f31">, DwarfRegNum<[64]>;
// $28 is undefined after any and all calls
/// Register classes
-def GPRC : RegisterClass<"Alpha", [i64], 64,
+def GPRC : RegisterClass<"Alpha", [i64], 64, (add
// Volatile
- [R0, R1, R2, R3, R4, R5, R6, R7, R8, R16, R17, R18, R19, R20, R21, R22,
- R23, R24, R25, R28,
+ R0, R1, R2, R3, R4, R5, R6, R7, R8, R16, R17, R18, R19, R20, R21, R22,
+ R23, R24, R25, R28,
//Special meaning, but volatile
R27, //procedure address
R26, //return address
@@ -121,18 +121,13 @@ def GPRC : RegisterClass<"Alpha", [i64], 64,
// Non-volatile
R9, R10, R11, R12, R13, R14,
// Don't allocate 15, 30, 31
- R15, R30, R31 ]>; //zero
+ R15, R30, R31)>; //zero
-def F4RC : RegisterClass<"Alpha", [f32], 64, [F0, F1,
+def F4RC : RegisterClass<"Alpha", [f32], 64, (add F0, F1,
F10, F11, F12, F13, F14, F15, F16, F17, F18, F19,
F20, F21, F22, F23, F24, F25, F26, F27, F28, F29, F30,
// Saved:
F2, F3, F4, F5, F6, F7, F8, F9,
- F31 ]>; //zero
+ F31)>; //zero
-def F8RC : RegisterClass<"Alpha", [f64], 64, [F0, F1,
- F10, F11, F12, F13, F14, F15, F16, F17, F18, F19,
- F20, F21, F22, F23, F24, F25, F26, F27, F28, F29, F30,
- // Saved:
- F2, F3, F4, F5, F6, F7, F8, F9,
- F31 ]>; //zero
+def F8RC : RegisterClass<"Alpha", [f64], 64, (add F4RC)>;
diff --git a/contrib/llvm/lib/Target/Alpha/AlphaSubtarget.cpp b/contrib/llvm/lib/Target/Alpha/AlphaSubtarget.cpp
index bda7104..624a5e2 100644
--- a/contrib/llvm/lib/Target/Alpha/AlphaSubtarget.cpp
+++ b/contrib/llvm/lib/Target/Alpha/AlphaSubtarget.cpp
@@ -7,19 +7,30 @@
//
//===----------------------------------------------------------------------===//
//
-// This file implements the Alpha specific subclass of TargetSubtarget.
+// This file implements the Alpha specific subclass of TargetSubtargetInfo.
//
//===----------------------------------------------------------------------===//
#include "AlphaSubtarget.h"
#include "Alpha.h"
-#include "AlphaGenSubtarget.inc"
+#include "llvm/Target/TargetRegistry.h"
+
+#define GET_SUBTARGETINFO_TARGET_DESC
+#define GET_SUBTARGETINFO_CTOR
+#include "AlphaGenSubtargetInfo.inc"
+
using namespace llvm;
-AlphaSubtarget::AlphaSubtarget(const std::string &TT, const std::string &FS)
- : HasCT(false) {
- std::string CPU = "generic";
+AlphaSubtarget::AlphaSubtarget(const std::string &TT, const std::string &CPU,
+ const std::string &FS)
+ : AlphaGenSubtargetInfo(TT, CPU, FS), HasCT(false) {
+ std::string CPUName = CPU;
+ if (CPUName.empty())
+ CPUName = "generic";
// Parse features string.
- ParseSubtargetFeatures(FS, CPU);
+ ParseSubtargetFeatures(CPUName, FS);
+
+ // Initialize scheduling itinerary for the specified CPU.
+ InstrItins = getInstrItineraryForCPU(CPUName);
}
diff --git a/contrib/llvm/lib/Target/Alpha/AlphaSubtarget.h b/contrib/llvm/lib/Target/Alpha/AlphaSubtarget.h
index f0eb93c..70b3116 100644
--- a/contrib/llvm/lib/Target/Alpha/AlphaSubtarget.h
+++ b/contrib/llvm/lib/Target/Alpha/AlphaSubtarget.h
@@ -7,21 +7,24 @@
//
//===----------------------------------------------------------------------===//
//
-// This file declares the Alpha specific subclass of TargetSubtarget.
+// This file declares the Alpha specific subclass of TargetSubtargetInfo.
//
//===----------------------------------------------------------------------===//
#ifndef ALPHASUBTARGET_H
#define ALPHASUBTARGET_H
-#include "llvm/Target/TargetInstrItineraries.h"
-#include "llvm/Target/TargetSubtarget.h"
-
+#include "llvm/Target/TargetSubtargetInfo.h"
+#include "llvm/MC/MCInstrItineraries.h"
#include <string>
+#define GET_SUBTARGETINFO_HEADER
+#include "AlphaGenSubtargetInfo.inc"
+
namespace llvm {
+class StringRe;
-class AlphaSubtarget : public TargetSubtarget {
+class AlphaSubtarget : public AlphaGenSubtargetInfo {
protected:
bool HasCT;
@@ -32,12 +35,12 @@ public:
/// This constructor initializes the data members to match that
/// of the specified triple.
///
- AlphaSubtarget(const std::string &TT, const std::string &FS);
+ AlphaSubtarget(const std::string &TT, const std::string &CPU,
+ const std::string &FS);
/// ParseSubtargetFeatures - Parses features string setting specified
/// subtarget options. Definition of function is auto generated by tblgen.
- std::string ParseSubtargetFeatures(const std::string &FS,
- const std::string &CPU);
+ void ParseSubtargetFeatures(StringRef CPU, StringRef FS);
bool hasCT() const { return HasCT; }
};
diff --git a/contrib/llvm/lib/Target/Alpha/AlphaTargetMachine.cpp b/contrib/llvm/lib/Target/Alpha/AlphaTargetMachine.cpp
index b53533b..3b65d41 100644
--- a/contrib/llvm/lib/Target/Alpha/AlphaTargetMachine.cpp
+++ b/contrib/llvm/lib/Target/Alpha/AlphaTargetMachine.cpp
@@ -11,7 +11,6 @@
//===----------------------------------------------------------------------===//
#include "Alpha.h"
-#include "AlphaMCAsmInfo.h"
#include "AlphaTargetMachine.h"
#include "llvm/PassManager.h"
#include "llvm/Support/FormattedStream.h"
@@ -21,15 +20,15 @@ using namespace llvm;
extern "C" void LLVMInitializeAlphaTarget() {
// Register the target.
RegisterTargetMachine<AlphaTargetMachine> X(TheAlphaTarget);
- RegisterAsmInfo<AlphaMCAsmInfo> Y(TheAlphaTarget);
}
AlphaTargetMachine::AlphaTargetMachine(const Target &T, const std::string &TT,
+ const std::string &CPU,
const std::string &FS)
- : LLVMTargetMachine(T, TT),
+ : LLVMTargetMachine(T, TT, CPU, FS),
DataLayout("e-f128:128:128-n64"),
FrameLowering(Subtarget),
- Subtarget(TT, FS),
+ Subtarget(TT, CPU, FS),
TLInfo(*this),
TSInfo(*this) {
setRelocationModel(Reloc::PIC_);
diff --git a/contrib/llvm/lib/Target/Alpha/AlphaTargetMachine.h b/contrib/llvm/lib/Target/Alpha/AlphaTargetMachine.h
index 26238fb..cf00e58 100644
--- a/contrib/llvm/lib/Target/Alpha/AlphaTargetMachine.h
+++ b/contrib/llvm/lib/Target/Alpha/AlphaTargetMachine.h
@@ -37,7 +37,7 @@ class AlphaTargetMachine : public LLVMTargetMachine {
public:
AlphaTargetMachine(const Target &T, const std::string &TT,
- const std::string &FS);
+ const std::string &CPU, const std::string &FS);
virtual const AlphaInstrInfo *getInstrInfo() const { return &InstrInfo; }
virtual const TargetFrameLowering *getFrameLowering() const {
diff --git a/contrib/llvm/lib/Target/Alpha/AlphaMCAsmInfo.cpp b/contrib/llvm/lib/Target/Alpha/MCTargetDesc/AlphaMCAsmInfo.cpp
index a35e884..a35e884 100644
--- a/contrib/llvm/lib/Target/Alpha/AlphaMCAsmInfo.cpp
+++ b/contrib/llvm/lib/Target/Alpha/MCTargetDesc/AlphaMCAsmInfo.cpp
diff --git a/contrib/llvm/lib/Target/Alpha/AlphaMCAsmInfo.h b/contrib/llvm/lib/Target/Alpha/MCTargetDesc/AlphaMCAsmInfo.h
index 837844b..837844b 100644
--- a/contrib/llvm/lib/Target/Alpha/AlphaMCAsmInfo.h
+++ b/contrib/llvm/lib/Target/Alpha/MCTargetDesc/AlphaMCAsmInfo.h
diff --git a/contrib/llvm/lib/Target/Alpha/MCTargetDesc/AlphaMCTargetDesc.cpp b/contrib/llvm/lib/Target/Alpha/MCTargetDesc/AlphaMCTargetDesc.cpp
new file mode 100644
index 0000000..562052b
--- /dev/null
+++ b/contrib/llvm/lib/Target/Alpha/MCTargetDesc/AlphaMCTargetDesc.cpp
@@ -0,0 +1,57 @@
+//===-- AlphaMCTargetDesc.cpp - Alpha Target Descriptions -------*- C++ -*-===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+//
+// This file provides Alpha specific target descriptions.
+//
+//===----------------------------------------------------------------------===//
+
+#include "AlphaMCTargetDesc.h"
+#include "AlphaMCAsmInfo.h"
+#include "llvm/MC/MCInstrInfo.h"
+#include "llvm/MC/MCRegisterInfo.h"
+#include "llvm/MC/MCSubtargetInfo.h"
+#include "llvm/Target/TargetRegistry.h"
+
+#define GET_INSTRINFO_MC_DESC
+#include "AlphaGenInstrInfo.inc"
+
+#define GET_SUBTARGETINFO_MC_DESC
+#include "AlphaGenSubtargetInfo.inc"
+
+#define GET_REGINFO_MC_DESC
+#include "AlphaGenRegisterInfo.inc"
+
+using namespace llvm;
+
+
+static MCInstrInfo *createAlphaMCInstrInfo() {
+ MCInstrInfo *X = new MCInstrInfo();
+ InitAlphaMCInstrInfo(X);
+ return X;
+}
+
+extern "C" void LLVMInitializeAlphaMCInstrInfo() {
+ TargetRegistry::RegisterMCInstrInfo(TheAlphaTarget, createAlphaMCInstrInfo);
+}
+
+static MCSubtargetInfo *createAlphaMCSubtargetInfo(StringRef TT, StringRef CPU,
+ StringRef FS) {
+ MCSubtargetInfo *X = new MCSubtargetInfo();
+ InitAlphaMCSubtargetInfo(X, TT, CPU, FS);
+ return X;
+}
+
+extern "C" void LLVMInitializeAlphaMCSubtargetInfo() {
+ TargetRegistry::RegisterMCSubtargetInfo(TheAlphaTarget,
+ createAlphaMCSubtargetInfo);
+}
+
+extern "C" void LLVMInitializeAlphaMCAsmInfo() {
+ RegisterMCAsmInfo<AlphaMCAsmInfo> X(TheAlphaTarget);
+}
diff --git a/contrib/llvm/lib/Target/Alpha/MCTargetDesc/AlphaMCTargetDesc.h b/contrib/llvm/lib/Target/Alpha/MCTargetDesc/AlphaMCTargetDesc.h
new file mode 100644
index 0000000..b0619e6
--- /dev/null
+++ b/contrib/llvm/lib/Target/Alpha/MCTargetDesc/AlphaMCTargetDesc.h
@@ -0,0 +1,40 @@
+//===-- AlphaMCTargetDesc.h - Alpha Target Descriptions ---------*- C++ -*-===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+//
+// This file provides Alpha specific target descriptions.
+//
+//===----------------------------------------------------------------------===//
+
+#ifndef ALPHAMCTARGETDESC_H
+#define ALPHAMCTARGETDESC_H
+
+namespace llvm {
+class MCSubtargetInfo;
+class Target;
+class StringRef;
+
+extern Target TheAlphaTarget;
+
+} // End llvm namespace
+
+// Defines symbolic names for Alpha registers. This defines a mapping from
+// register name to register number.
+//
+#define GET_REGINFO_ENUM
+#include "AlphaGenRegisterInfo.inc"
+
+// Defines symbolic names for the Alpha instructions.
+//
+#define GET_INSTRINFO_ENUM
+#include "AlphaGenInstrInfo.inc"
+
+#define GET_SUBTARGETINFO_ENUM
+#include "AlphaGenSubtargetInfo.inc"
+
+#endif
diff --git a/contrib/llvm/lib/Target/Alpha/MCTargetDesc/CMakeLists.txt b/contrib/llvm/lib/Target/Alpha/MCTargetDesc/CMakeLists.txt
new file mode 100644
index 0000000..ad0dd26
--- /dev/null
+++ b/contrib/llvm/lib/Target/Alpha/MCTargetDesc/CMakeLists.txt
@@ -0,0 +1,4 @@
+add_llvm_library(LLVMAlphaDesc
+ AlphaMCTargetDesc.cpp
+ AlphaMCAsmInfo.cpp
+ )
diff --git a/contrib/llvm/lib/Target/Alpha/MCTargetDesc/Makefile b/contrib/llvm/lib/Target/Alpha/MCTargetDesc/Makefile
new file mode 100644
index 0000000..d55175f
--- /dev/null
+++ b/contrib/llvm/lib/Target/Alpha/MCTargetDesc/Makefile
@@ -0,0 +1,16 @@
+##===- lib/Target/Alpha/TargetDesc/Makefile ----------------*- Makefile -*-===##
+#
+# The LLVM Compiler Infrastructure
+#
+# This file is distributed under the University of Illinois Open Source
+# License. See LICENSE.TXT for details.
+#
+##===----------------------------------------------------------------------===##
+
+LEVEL = ../../../..
+LIBRARYNAME = LLVMAlphaDesc
+
+# Hack: we need to include 'main' target directory to grab private headers
+CPP.Flags += -I$(PROJ_OBJ_DIR)/.. -I$(PROJ_SRC_DIR)/..
+
+include $(LEVEL)/Makefile.common
diff --git a/contrib/llvm/lib/Target/Blackfin/Blackfin.h b/contrib/llvm/lib/Target/Blackfin/Blackfin.h
index ec1fa86..a00ff4c 100644
--- a/contrib/llvm/lib/Target/Blackfin/Blackfin.h
+++ b/contrib/llvm/lib/Target/Blackfin/Blackfin.h
@@ -15,6 +15,7 @@
#ifndef TARGET_BLACKFIN_H
#define TARGET_BLACKFIN_H
+#include "MCTargetDesc/BlackfinMCTargetDesc.h"
#include "llvm/Target/TargetMachine.h"
namespace llvm {
@@ -24,15 +25,7 @@ namespace llvm {
FunctionPass *createBlackfinISelDag(BlackfinTargetMachine &TM,
CodeGenOpt::Level OptLevel);
- extern Target TheBlackfinTarget;
} // end namespace llvm
-// Defines symbolic names for Blackfin registers. This defines a mapping from
-// register name to register number.
-#include "BlackfinGenRegisterNames.inc"
-
-// Defines symbolic names for the Blackfin instructions.
-#include "BlackfinGenInstrNames.inc"
-
#endif
diff --git a/contrib/llvm/lib/Target/Blackfin/BlackfinISelDAGToDAG.cpp b/contrib/llvm/lib/Target/Blackfin/BlackfinISelDAGToDAG.cpp
index 42659ae..215ca43 100644
--- a/contrib/llvm/lib/Target/Blackfin/BlackfinISelDAGToDAG.cpp
+++ b/contrib/llvm/lib/Target/Blackfin/BlackfinISelDAGToDAG.cpp
@@ -146,21 +146,21 @@ void BlackfinDAGToDAGISel::FixRegisterClasses(SelectionDAG &DAG) {
NI != DAG.allnodes_end(); ++NI) {
if (NI->use_empty() || !NI->isMachineOpcode())
continue;
- const TargetInstrDesc &DefTID = TII.get(NI->getMachineOpcode());
+ const MCInstrDesc &DefMCID = TII.get(NI->getMachineOpcode());
for (SDNode::use_iterator UI = NI->use_begin(); !UI.atEnd(); ++UI) {
if (!UI->isMachineOpcode())
continue;
- if (UI.getUse().getResNo() >= DefTID.getNumDefs())
+ if (UI.getUse().getResNo() >= DefMCID.getNumDefs())
continue;
const TargetRegisterClass *DefRC =
- DefTID.OpInfo[UI.getUse().getResNo()].getRegClass(TRI);
+ TII.getRegClass(DefMCID, UI.getUse().getResNo(), TRI);
- const TargetInstrDesc &UseTID = TII.get(UI->getMachineOpcode());
- if (UseTID.getNumDefs()+UI.getOperandNo() >= UseTID.getNumOperands())
+ const MCInstrDesc &UseMCID = TII.get(UI->getMachineOpcode());
+ if (UseMCID.getNumDefs()+UI.getOperandNo() >= UseMCID.getNumOperands())
continue;
const TargetRegisterClass *UseRC =
- UseTID.OpInfo[UseTID.getNumDefs()+UI.getOperandNo()].getRegClass(TRI);
+ TII.getRegClass(UseMCID, UseMCID.getNumDefs()+UI.getOperandNo(), TRI);
if (!DefRC || !UseRC)
continue;
// We cannot copy CC <-> !(CC/D)
diff --git a/contrib/llvm/lib/Target/Blackfin/BlackfinISelLowering.cpp b/contrib/llvm/lib/Target/Blackfin/BlackfinISelLowering.cpp
index 588d9bd..d572832 100644
--- a/contrib/llvm/lib/Target/Blackfin/BlackfinISelLowering.cpp
+++ b/contrib/llvm/lib/Target/Blackfin/BlackfinISelLowering.cpp
@@ -621,39 +621,21 @@ getRegForInlineAsmConstraint(const std::string &Constraint, EVT VT) const {
case 'w': return Pair(0U, ALLRegisterClass);
case 'Z': return Pair(P3, PRegisterClass);
case 'Y': return Pair(P1, PRegisterClass);
+ case 'z': return Pair(0U, zConsRegisterClass);
+ case 'D': return Pair(0U, DConsRegisterClass);
+ case 'W': return Pair(0U, WConsRegisterClass);
+ case 'c': return Pair(0U, cConsRegisterClass);
+ case 't': return Pair(0U, tConsRegisterClass);
+ case 'u': return Pair(0U, uConsRegisterClass);
+ case 'k': return Pair(0U, kConsRegisterClass);
+ case 'y': return Pair(0U, yConsRegisterClass);
}
// Not implemented: q0-q7, qA. Use {R2} etc instead.
- // Constraints z, D, W, c, t, u, k, and y use non-existing classes, defer to
- // getRegClassForInlineAsmConstraint()
return TargetLowering::getRegForInlineAsmConstraint(Constraint, VT);
}
-std::vector<unsigned> BlackfinTargetLowering::
-getRegClassForInlineAsmConstraint(const std::string &Constraint, EVT VT) const {
- using namespace BF;
-
- if (Constraint.size() != 1)
- return std::vector<unsigned>();
-
- switch (Constraint[0]) {
- case 'z': return make_vector<unsigned>(P0, P1, P2, 0);
- case 'D': return make_vector<unsigned>(R0, R2, R4, R6, 0);
- case 'W': return make_vector<unsigned>(R1, R3, R5, R7, 0);
- case 'c': return make_vector<unsigned>(I0, I1, I2, I3,
- B0, B1, B2, B3,
- L0, L1, L2, L3, 0);
- case 't': return make_vector<unsigned>(LT0, LT1, 0);
- case 'u': return make_vector<unsigned>(LB0, LB1, 0);
- case 'k': return make_vector<unsigned>(LC0, LC1, 0);
- case 'y': return make_vector<unsigned>(RETS, RETN, RETI, RETX, RETE,
- ASTAT, SEQSTAT, USP, 0);
- }
-
- return std::vector<unsigned>();
-}
-
bool BlackfinTargetLowering::
isOffsetFoldingLegal(const GlobalAddressSDNode *GA) const {
// The Blackfin target isn't yet aware of offsets.
diff --git a/contrib/llvm/lib/Target/Blackfin/BlackfinISelLowering.h b/contrib/llvm/lib/Target/Blackfin/BlackfinISelLowering.h
index 9a54557..b65775b 100644
--- a/contrib/llvm/lib/Target/Blackfin/BlackfinISelLowering.h
+++ b/contrib/llvm/lib/Target/Blackfin/BlackfinISelLowering.h
@@ -48,9 +48,6 @@ namespace llvm {
std::pair<unsigned, const TargetRegisterClass*>
getRegForInlineAsmConstraint(const std::string &Constraint, EVT VT) const;
- std::vector<unsigned>
- getRegClassForInlineAsmConstraint(const std::string &Constraint,
- EVT VT) const;
virtual bool isOffsetFoldingLegal(const GlobalAddressSDNode *GA) const;
const char *getTargetNodeName(unsigned Opcode) const;
diff --git a/contrib/llvm/lib/Target/Blackfin/BlackfinInstrInfo.cpp b/contrib/llvm/lib/Target/Blackfin/BlackfinInstrInfo.cpp
index 598cf2a..d190ae7 100644
--- a/contrib/llvm/lib/Target/Blackfin/BlackfinInstrInfo.cpp
+++ b/contrib/llvm/lib/Target/Blackfin/BlackfinInstrInfo.cpp
@@ -14,17 +14,20 @@
#include "BlackfinInstrInfo.h"
#include "BlackfinSubtarget.h"
#include "Blackfin.h"
-#include "llvm/ADT/STLExtras.h"
-#include "llvm/ADT/SmallVector.h"
#include "llvm/CodeGen/MachineRegisterInfo.h"
#include "llvm/CodeGen/MachineInstrBuilder.h"
+#include "llvm/Target/TargetRegistry.h"
+#include "llvm/ADT/STLExtras.h"
+#include "llvm/ADT/SmallVector.h"
#include "llvm/Support/ErrorHandling.h"
+
+#define GET_INSTRINFO_CTOR
#include "BlackfinGenInstrInfo.inc"
using namespace llvm;
BlackfinInstrInfo::BlackfinInstrInfo(BlackfinSubtarget &ST)
- : TargetInstrInfoImpl(BlackfinInsts, array_lengthof(BlackfinInsts)),
+ : BlackfinGenInstrInfo(BF::ADJCALLSTACKDOWN, BF::ADJCALLSTACKUP),
RI(ST, *this),
Subtarget(ST) {}
diff --git a/contrib/llvm/lib/Target/Blackfin/BlackfinInstrInfo.h b/contrib/llvm/lib/Target/Blackfin/BlackfinInstrInfo.h
index fdc1029..d22ddf0 100644
--- a/contrib/llvm/lib/Target/Blackfin/BlackfinInstrInfo.h
+++ b/contrib/llvm/lib/Target/Blackfin/BlackfinInstrInfo.h
@@ -17,9 +17,12 @@
#include "llvm/Target/TargetInstrInfo.h"
#include "BlackfinRegisterInfo.h"
+#define GET_INSTRINFO_HEADER
+#include "BlackfinGenInstrInfo.inc"
+
namespace llvm {
- class BlackfinInstrInfo : public TargetInstrInfoImpl {
+ class BlackfinInstrInfo : public BlackfinGenInstrInfo {
const BlackfinRegisterInfo RI;
const BlackfinSubtarget& Subtarget;
public:
diff --git a/contrib/llvm/lib/Target/Blackfin/BlackfinIntrinsicInfo.cpp b/contrib/llvm/lib/Target/Blackfin/BlackfinIntrinsicInfo.cpp
index 34a8d38..ae8ee9e 100644
--- a/contrib/llvm/lib/Target/Blackfin/BlackfinIntrinsicInfo.cpp
+++ b/contrib/llvm/lib/Target/Blackfin/BlackfinIntrinsicInfo.cpp
@@ -83,7 +83,7 @@ bool BlackfinIntrinsicInfo::isOverloaded(unsigned IntrID) const {
static const FunctionType *getType(LLVMContext &Context, unsigned id) {
const Type *ResultTy = NULL;
- std::vector<const Type*> ArgTys;
+ std::vector<Type*> ArgTys;
bool IsVarArg = false;
#define GET_INTRINSIC_GENERATOR
diff --git a/contrib/llvm/lib/Target/Blackfin/BlackfinRegisterInfo.cpp b/contrib/llvm/lib/Target/Blackfin/BlackfinRegisterInfo.cpp
index 6ca460e..3a7c104 100644
--- a/contrib/llvm/lib/Target/Blackfin/BlackfinRegisterInfo.cpp
+++ b/contrib/llvm/lib/Target/Blackfin/BlackfinRegisterInfo.cpp
@@ -29,13 +29,15 @@
#include "llvm/Type.h"
#include "llvm/ADT/BitVector.h"
#include "llvm/ADT/STLExtras.h"
+
+#define GET_REGINFO_TARGET_DESC
+#include "BlackfinGenRegisterInfo.inc"
+
using namespace llvm;
BlackfinRegisterInfo::BlackfinRegisterInfo(BlackfinSubtarget &st,
const TargetInstrInfo &tii)
- : BlackfinGenRegisterInfo(BF::ADJCALLSTACKDOWN, BF::ADJCALLSTACKUP),
- Subtarget(st),
- TII(tii) {}
+ : BlackfinGenRegisterInfo(), Subtarget(st), TII(tii) {}
const unsigned*
BlackfinRegisterInfo::getCalleeSavedRegs(const MachineFunction *MF) const {
@@ -356,6 +358,3 @@ int BlackfinRegisterInfo::getLLVMRegNum(unsigned DwarfRegNum,
llvm_unreachable("What is the dwarf register number");
return -1;
}
-
-#include "BlackfinGenRegisterInfo.inc"
-
diff --git a/contrib/llvm/lib/Target/Blackfin/BlackfinRegisterInfo.h b/contrib/llvm/lib/Target/Blackfin/BlackfinRegisterInfo.h
index 375d277..86f45c1 100644
--- a/contrib/llvm/lib/Target/Blackfin/BlackfinRegisterInfo.h
+++ b/contrib/llvm/lib/Target/Blackfin/BlackfinRegisterInfo.h
@@ -16,7 +16,9 @@
#define BLACKFINREGISTERINFO_H
#include "llvm/Target/TargetRegisterInfo.h"
-#include "BlackfinGenRegisterInfo.h.inc"
+
+#define GET_REGINFO_HEADER
+#include "BlackfinGenRegisterInfo.inc"
namespace llvm {
diff --git a/contrib/llvm/lib/Target/Blackfin/BlackfinRegisterInfo.td b/contrib/llvm/lib/Target/Blackfin/BlackfinRegisterInfo.td
index d8fd302..1c42205 100644
--- a/contrib/llvm/lib/Target/Blackfin/BlackfinRegisterInfo.td
+++ b/contrib/llvm/lib/Target/Blackfin/BlackfinRegisterInfo.td
@@ -195,108 +195,83 @@ def LB0 : Ri<6, 2, "lb0">, DwarfRegNum<[48]>;
def LB1 : Ri<6, 5, "lb1">, DwarfRegNum<[49]>;
// Register classes.
-def D16 : RegisterClass<"BF", [i16], 16,
- [R0H, R0L, R1H, R1L, R2H, R2L, R3H, R3L,
- R4H, R4L, R5H, R5L, R6H, R6L, R7H, R7L]>;
+def D16L : RegisterClass<"BF", [i16], 16, (sequence "R%uL", 0, 7)>;
-def D16L : RegisterClass<"BF", [i16], 16,
- [R0L, R1L, R2L, R3L, R4L, R5L, R6L, R7L]>;
+def D16H : RegisterClass<"BF", [i16], 16, (sequence "R%uH", 0, 7)>;
-def D16H : RegisterClass<"BF", [i16], 16,
- [R0H, R1H, R2H, R3H, R4H, R5H, R6H, R7H]>;
-
-def P16 : RegisterClass<"BF", [i16], 16,
- [P0H, P0L, P1H, P1L, P2H, P2L, P3H, P3L,
- P4H, P4L, P5H, P5L, SPH, SPL, FPH, FPL]>;
+def D16 : RegisterClass<"BF", [i16], 16, (add D16L, D16H)>;
def P16L : RegisterClass<"BF", [i16], 16,
- [P0L, P1L, P2L, P3L, P4L, P5L, SPL, FPL]>;
+ (add (sequence "P%uL", 0, 5), SPL, FPL)>;
def P16H : RegisterClass<"BF", [i16], 16,
- [P0H, P1H, P2H, P3H, P4H, P5H, SPH, FPH]>;
+ (add (sequence "P%uH", 0, 5), SPH, FPH)>;
+
+def P16 : RegisterClass<"BF", [i16], 16, (add P16L, P16H)>;
-def DP16 : RegisterClass<"BF", [i16], 16,
- [R0H, R0L, R1H, R1L, R2H, R2L, R3H, R3L,
- R4H, R4L, R5H, R5L, R6H, R6L, R7H, R7L,
- P0H, P0L, P1H, P1L, P2H, P2L, P3H, P3L,
- P4H, P4L, P5H, P5L, SPH, SPL, FPH, FPL]>;
+def DP16 : RegisterClass<"BF", [i16], 16, (add D16, P16)>;
-def DP16L : RegisterClass<"BF", [i16], 16,
- [R0L, R1L, R2L, R3L, R4L, R5L, R6L, R7L,
- P0L, P1L, P2L, P3L, P4L, P5L, SPL, FPL]>;
+def DP16L : RegisterClass<"BF", [i16], 16, (add D16L, P16L)>;
-def DP16H : RegisterClass<"BF", [i16], 16,
- [R0H, R1H, R2H, R3H, R4H, R5H, R6H, R7H,
- P0H, P1H, P2H, P3H, P4H, P5H, SPH, FPH]>;
+def DP16H : RegisterClass<"BF", [i16], 16, (add D16H, P16H)>;
def GR16 : RegisterClass<"BF", [i16], 16,
- [R0H, R0L, R1H, R1L, R2H, R2L, R3H, R3L,
- R4H, R4L, R5H, R5L, R6H, R6L, R7H, R7L,
- P0H, P0L, P1H, P1L, P2H, P2L, P3H, P3L,
- P4H, P4L, P5H, P5L, SPH, SPL, FPH, FPL,
+ (add DP16,
I0H, I0L, I1H, I1L, I2H, I2L, I3H, I3L,
M0H, M0L, M1H, M1L, M2H, M2L, M3H, M3L,
B0H, B0L, B1H, B1L, B2H, B2L, B3H, B3L,
- L0H, L0L, L1H, L1L, L2H, L2L, L3H, L3L]>;
+ L0H, L0L, L1H, L1L, L2H, L2L, L3H, L3L)>;
-def D : RegisterClass<"BF", [i32], 32, [R0, R1, R2, R3, R4, R5, R6, R7]> {
+def D : RegisterClass<"BF", [i32], 32, (sequence "R%u", 0, 7)> {
let SubRegClasses = [(D16L lo16), (D16H hi16)];
}
-def P : RegisterClass<"BF", [i32], 32, [P0, P1, P2, P3, P4, P5, FP, SP]> {
+def P : RegisterClass<"BF", [i32], 32, (add (sequence "P%u", 0, 5), FP, SP)> {
let SubRegClasses = [(P16L lo16), (P16H hi16)];
}
-def I : RegisterClass<"BF", [i32], 32, [I0, I1, I2, I3]>;
-def M : RegisterClass<"BF", [i32], 32, [M0, M1, M2, M3]>;
-def B : RegisterClass<"BF", [i32], 32, [B0, B1, B2, B3]>;
-def L : RegisterClass<"BF", [i32], 32, [L0, L1, L2, L3]>;
-
-def DP : RegisterClass<"BF", [i32], 32,
- [R0, R1, R2, R3, R4, R5, R6, R7,
- P0, P1, P2, P3, P4, P5, FP, SP]> {
+def DP : RegisterClass<"BF", [i32], 32, (add D, P)> {
let SubRegClasses = [(DP16L lo16), (DP16H hi16)];
}
-def GR : RegisterClass<"BF", [i32], 32,
- [R0, R1, R2, R3, R4, R5, R6, R7,
- P0, P1, P2, P3, P4, P5,
- I0, I1, I2, I3, M0, M1, M2, M3,
- B0, B1, B2, B3, L0, L1, L2, L3,
- FP, SP]>;
+def I : RegisterClass<"BF", [i32], 32, (add I0, I1, I2, I3)>;
+def M : RegisterClass<"BF", [i32], 32, (add M0, M1, M2, M3)>;
+def B : RegisterClass<"BF", [i32], 32, (add B0, B1, B2, B3)>;
+def L : RegisterClass<"BF", [i32], 32, (add L0, L1, L2, L3)>;
+
+def GR : RegisterClass<"BF", [i32], 32, (add DP, I, M, B, L)>;
def ALL : RegisterClass<"BF", [i32], 32,
- [R0, R1, R2, R3, R4, R5, R6, R7,
- P0, P1, P2, P3, P4, P5,
- I0, I1, I2, I3, M0, M1, M2, M3,
- B0, B1, B2, B3, L0, L1, L2, L3,
- FP, SP,
+ (add GR,
A0X, A0W, A1X, A1W, ASTAT, RETS,
LC0, LT0, LB0, LC1, LT1, LB1, CYCLES, CYCLES2,
- USP, SEQSTAT, SYSCFG, RETI, RETX, RETN, RETE, EMUDAT]>;
+ USP, SEQSTAT, SYSCFG, RETI, RETX, RETN, RETE, EMUDAT)>;
-def PI : RegisterClass<"BF", [i32], 32,
- [P0, P1, P2, P3, P4, P5, I0, I1, I2, I3, FP, SP]>;
+def PI : RegisterClass<"BF", [i32], 32, (add P, I)>;
// We are going to pretend that CC and !CC are 32-bit registers, even though
// they only can hold 1 bit.
let CopyCost = -1, Size = 8 in {
-def JustCC : RegisterClass<"BF", [i32], 8, [CC]>;
-def NotCC : RegisterClass<"BF", [i32], 8, [NCC]>;
-def AnyCC : RegisterClass<"BF", [i32], 8, [CC, NCC]> {
- let MethodProtos = [{
- iterator allocation_order_end(const MachineFunction &MF) const;
- }];
- let MethodBodies = [{
- AnyCCClass::iterator
- AnyCCClass::allocation_order_end(const MachineFunction &MF) const {
- return allocation_order_begin(MF)+1;
- }
- }];
-}
+def JustCC : RegisterClass<"BF", [i32], 8, (add CC)>;
+def NotCC : RegisterClass<"BF", [i32], 8, (add NCC)>;
+def AnyCC : RegisterClass<"BF", [i32], 8, (add CC, NCC)>;
def StatBit : RegisterClass<"BF", [i1], 8,
- [AZ, AN, CC, AQ, AC0, AC1, AV0, AV0S, AV1, AV1S, V, VS]>;
+ (add AZ, AN, CC, AQ, AC0, AC1, AV0, AV0S, AV1, AV1S, V, VS)>;
}
// Should be i40, but that isn't defined. It is not a legal type yet anyway.
-def Accu : RegisterClass<"BF", [i64], 64, [A0, A1]>;
+def Accu : RegisterClass<"BF", [i64], 64, (add A0, A1)>;
+
+// Register classes to match inline asm constraints.
+def zCons : RegisterClass<"BF", [i32], 32, (add P0, P1, P2)>;
+def DCons : RegisterClass<"BF", [i32], 32, (add R0, R2, R4, R6)>;
+def WCons : RegisterClass<"BF", [i32], 32, (add R1, R3, R5, R7)>;
+def cCons : RegisterClass<"BF", [i32], 32, (add I0, I1, I2, I3,
+ B0, B1, B2, B3,
+ L0, L1, L2, L3)>;
+def tCons : RegisterClass<"BF", [i32], 32, (add LT0, LT1)>;
+def uCons : RegisterClass<"BF", [i32], 32, (add LB0, LB1)>;
+def kCons : RegisterClass<"BF", [i32], 32, (add LC0, LC1)>;
+def yCons : RegisterClass<"BF", [i32], 32, (add RETS, RETN, RETI, RETX,
+ RETE, ASTAT, SEQSTAT,
+ USP)>;
diff --git a/contrib/llvm/lib/Target/Blackfin/BlackfinSubtarget.cpp b/contrib/llvm/lib/Target/Blackfin/BlackfinSubtarget.cpp
index e104c52..ec919cd 100644
--- a/contrib/llvm/lib/Target/Blackfin/BlackfinSubtarget.cpp
+++ b/contrib/llvm/lib/Target/Blackfin/BlackfinSubtarget.cpp
@@ -7,18 +7,24 @@
//
//===----------------------------------------------------------------------===//
//
-// This file implements the blackfin specific subclass of TargetSubtarget.
+// This file implements the blackfin specific subclass of TargetSubtargetInfo.
//
//===----------------------------------------------------------------------===//
#include "BlackfinSubtarget.h"
-#include "BlackfinGenSubtarget.inc"
+#include "Blackfin.h"
+#include "llvm/Target/TargetRegistry.h"
+
+#define GET_SUBTARGETINFO_TARGET_DESC
+#define GET_SUBTARGETINFO_CTOR
+#include "BlackfinGenSubtargetInfo.inc"
using namespace llvm;
BlackfinSubtarget::BlackfinSubtarget(const std::string &TT,
+ const std::string &CPU,
const std::string &FS)
- : sdram(false),
+ : BlackfinGenSubtargetInfo(TT, CPU, FS), sdram(false),
icplb(false),
wa_mi_shift(false),
wa_csync(false),
@@ -30,7 +36,9 @@ BlackfinSubtarget::BlackfinSubtarget(const std::string &TT,
wa_killed_mmr(false),
wa_rets(false)
{
- std::string CPU = "generic";
+ std::string CPUName = CPU;
+ if (CPUName.empty())
+ CPUName = "generic";
// Parse features string.
- ParseSubtargetFeatures(FS, CPU);
+ ParseSubtargetFeatures(CPUName, FS);
}
diff --git a/contrib/llvm/lib/Target/Blackfin/BlackfinSubtarget.h b/contrib/llvm/lib/Target/Blackfin/BlackfinSubtarget.h
index d667fe2..1a01a81 100644
--- a/contrib/llvm/lib/Target/Blackfin/BlackfinSubtarget.h
+++ b/contrib/llvm/lib/Target/Blackfin/BlackfinSubtarget.h
@@ -7,19 +7,23 @@
//
//===----------------------------------------------------------------------===//
//
-// This file declares the BLACKFIN specific subclass of TargetSubtarget.
+// This file declares the BLACKFIN specific subclass of TargetSubtargetInfo.
//
//===----------------------------------------------------------------------===//
#ifndef BLACKFIN_SUBTARGET_H
#define BLACKFIN_SUBTARGET_H
-#include "llvm/Target/TargetSubtarget.h"
+#include "llvm/Target/TargetSubtargetInfo.h"
#include <string>
+#define GET_SUBTARGETINFO_HEADER
+#include "BlackfinGenSubtargetInfo.inc"
+
namespace llvm {
+class StringRef;
- class BlackfinSubtarget : public TargetSubtarget {
+ class BlackfinSubtarget : public BlackfinGenSubtargetInfo {
bool sdram;
bool icplb;
bool wa_mi_shift;
@@ -32,12 +36,12 @@ namespace llvm {
bool wa_killed_mmr;
bool wa_rets;
public:
- BlackfinSubtarget(const std::string &TT, const std::string &FS);
+ BlackfinSubtarget(const std::string &TT, const std::string &CPU,
+ const std::string &FS);
/// ParseSubtargetFeatures - Parses features string setting specified
/// subtarget options. Definition of function is auto generated by tblgen.
- std::string ParseSubtargetFeatures(const std::string &FS,
- const std::string &CPU);
+ void ParseSubtargetFeatures(StringRef CPU, StringRef FS);
};
} // end namespace llvm
diff --git a/contrib/llvm/lib/Target/Blackfin/BlackfinTargetMachine.cpp b/contrib/llvm/lib/Target/Blackfin/BlackfinTargetMachine.cpp
index e11920f..a1c9f1c 100644
--- a/contrib/llvm/lib/Target/Blackfin/BlackfinTargetMachine.cpp
+++ b/contrib/llvm/lib/Target/Blackfin/BlackfinTargetMachine.cpp
@@ -12,7 +12,6 @@
#include "BlackfinTargetMachine.h"
#include "Blackfin.h"
-#include "BlackfinMCAsmInfo.h"
#include "llvm/PassManager.h"
#include "llvm/Target/TargetRegistry.h"
@@ -20,16 +19,15 @@ using namespace llvm;
extern "C" void LLVMInitializeBlackfinTarget() {
RegisterTargetMachine<BlackfinTargetMachine> X(TheBlackfinTarget);
- RegisterAsmInfo<BlackfinMCAsmInfo> Y(TheBlackfinTarget);
-
}
BlackfinTargetMachine::BlackfinTargetMachine(const Target &T,
const std::string &TT,
+ const std::string &CPU,
const std::string &FS)
- : LLVMTargetMachine(T, TT),
+ : LLVMTargetMachine(T, TT, CPU, FS),
DataLayout("e-p:32:32-i64:32-f64:32-n32"),
- Subtarget(TT, FS),
+ Subtarget(TT, CPU, FS),
TLInfo(*this),
TSInfo(*this),
InstrInfo(Subtarget),
diff --git a/contrib/llvm/lib/Target/Blackfin/BlackfinTargetMachine.h b/contrib/llvm/lib/Target/Blackfin/BlackfinTargetMachine.h
index 29b2b17..bd7dc84 100644
--- a/contrib/llvm/lib/Target/Blackfin/BlackfinTargetMachine.h
+++ b/contrib/llvm/lib/Target/Blackfin/BlackfinTargetMachine.h
@@ -36,7 +36,7 @@ namespace llvm {
BlackfinIntrinsicInfo IntrinsicInfo;
public:
BlackfinTargetMachine(const Target &T, const std::string &TT,
- const std::string &FS);
+ const std::string &CPU, const std::string &FS);
virtual const BlackfinInstrInfo *getInstrInfo() const { return &InstrInfo; }
virtual const TargetFrameLowering *getFrameLowering() const {
diff --git a/contrib/llvm/lib/Target/Blackfin/BlackfinMCAsmInfo.cpp b/contrib/llvm/lib/Target/Blackfin/MCTargetDesc/BlackfinMCAsmInfo.cpp
index 5b9d4a2..5b9d4a2 100644
--- a/contrib/llvm/lib/Target/Blackfin/BlackfinMCAsmInfo.cpp
+++ b/contrib/llvm/lib/Target/Blackfin/MCTargetDesc/BlackfinMCAsmInfo.cpp
diff --git a/contrib/llvm/lib/Target/Blackfin/BlackfinMCAsmInfo.h b/contrib/llvm/lib/Target/Blackfin/MCTargetDesc/BlackfinMCAsmInfo.h
index c372aa2..c372aa2 100644
--- a/contrib/llvm/lib/Target/Blackfin/BlackfinMCAsmInfo.h
+++ b/contrib/llvm/lib/Target/Blackfin/MCTargetDesc/BlackfinMCAsmInfo.h
diff --git a/contrib/llvm/lib/Target/Blackfin/MCTargetDesc/BlackfinMCTargetDesc.cpp b/contrib/llvm/lib/Target/Blackfin/MCTargetDesc/BlackfinMCTargetDesc.cpp
new file mode 100644
index 0000000..0fa1471
--- /dev/null
+++ b/contrib/llvm/lib/Target/Blackfin/MCTargetDesc/BlackfinMCTargetDesc.cpp
@@ -0,0 +1,60 @@
+//===-- BlackfinMCTargetDesc.cpp - Blackfin Target Descriptions -*- C++ -*-===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+//
+// This file provides Blackfin specific target descriptions.
+//
+//===----------------------------------------------------------------------===//
+
+#include "BlackfinMCTargetDesc.h"
+#include "BlackfinMCAsmInfo.h"
+#include "llvm/MC/MCInstrInfo.h"
+#include "llvm/MC/MCRegisterInfo.h"
+#include "llvm/MC/MCSubtargetInfo.h"
+#include "llvm/Target/TargetRegistry.h"
+
+#define GET_INSTRINFO_MC_DESC
+#include "BlackfinGenInstrInfo.inc"
+
+#define GET_SUBTARGETINFO_MC_DESC
+#include "BlackfinGenSubtargetInfo.inc"
+
+#define GET_REGINFO_MC_DESC
+#include "BlackfinGenRegisterInfo.inc"
+
+using namespace llvm;
+
+
+static MCInstrInfo *createBlackfinMCInstrInfo() {
+ MCInstrInfo *X = new MCInstrInfo();
+ InitBlackfinMCInstrInfo(X);
+ return X;
+}
+
+extern "C" void LLVMInitializeBlackfinMCInstrInfo() {
+ TargetRegistry::RegisterMCInstrInfo(TheBlackfinTarget,
+ createBlackfinMCInstrInfo);
+}
+
+
+static MCSubtargetInfo *createBlackfinMCSubtargetInfo(StringRef TT,
+ StringRef CPU,
+ StringRef FS) {
+ MCSubtargetInfo *X = new MCSubtargetInfo();
+ InitBlackfinMCSubtargetInfo(X, TT, CPU, FS);
+ return X;
+}
+
+extern "C" void LLVMInitializeBlackfinMCSubtargetInfo() {
+ TargetRegistry::RegisterMCSubtargetInfo(TheBlackfinTarget,
+ createBlackfinMCSubtargetInfo);
+}
+
+extern "C" void LLVMInitializeBlackfinMCAsmInfo() {
+ RegisterMCAsmInfo<BlackfinMCAsmInfo> X(TheBlackfinTarget);
+}
diff --git a/contrib/llvm/lib/Target/Blackfin/MCTargetDesc/BlackfinMCTargetDesc.h b/contrib/llvm/lib/Target/Blackfin/MCTargetDesc/BlackfinMCTargetDesc.h
new file mode 100644
index 0000000..5bffe94
--- /dev/null
+++ b/contrib/llvm/lib/Target/Blackfin/MCTargetDesc/BlackfinMCTargetDesc.h
@@ -0,0 +1,38 @@
+//===-- BlackfinMCTargetDesc.h - Blackfin Target Descriptions ---*- C++ -*-===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+//
+// This file provides Blackfin specific target descriptions.
+//
+//===----------------------------------------------------------------------===//
+
+#ifndef BLACKFINMCTARGETDESC_H
+#define BLACKFINMCTARGETDESC_H
+
+namespace llvm {
+class MCSubtargetInfo;
+class Target;
+class StringRef;
+
+extern Target TheBlackfinTarget;
+
+} // End llvm namespace
+
+// Defines symbolic names for Blackfin registers. This defines a mapping from
+// register name to register number.
+#define GET_REGINFO_ENUM
+#include "BlackfinGenRegisterInfo.inc"
+
+// Defines symbolic names for the Blackfin instructions.
+#define GET_INSTRINFO_ENUM
+#include "BlackfinGenInstrInfo.inc"
+
+#define GET_SUBTARGETINFO_ENUM
+#include "BlackfinGenSubtargetInfo.inc"
+
+#endif
diff --git a/contrib/llvm/lib/Target/Blackfin/MCTargetDesc/CMakeLists.txt b/contrib/llvm/lib/Target/Blackfin/MCTargetDesc/CMakeLists.txt
new file mode 100644
index 0000000..8cd924f
--- /dev/null
+++ b/contrib/llvm/lib/Target/Blackfin/MCTargetDesc/CMakeLists.txt
@@ -0,0 +1,4 @@
+add_llvm_library(LLVMBlackfinDesc
+ BlackfinMCTargetDesc.cpp
+ BlackfinMCAsmInfo.cpp
+ )
diff --git a/contrib/llvm/lib/Target/Blackfin/MCTargetDesc/Makefile b/contrib/llvm/lib/Target/Blackfin/MCTargetDesc/Makefile
new file mode 100644
index 0000000..6b26101
--- /dev/null
+++ b/contrib/llvm/lib/Target/Blackfin/MCTargetDesc/Makefile
@@ -0,0 +1,16 @@
+##===- lib/Target/Blackfin/TargetDesc/Makefile -------------*- Makefile -*-===##
+#
+# The LLVM Compiler Infrastructure
+#
+# This file is distributed under the University of Illinois Open Source
+# License. See LICENSE.TXT for details.
+#
+##===----------------------------------------------------------------------===##
+
+LEVEL = ../../../..
+LIBRARYNAME = LLVMBlackfinDesc
+
+# Hack: we need to include 'main' target directory to grab private headers
+CPP.Flags += -I$(PROJ_OBJ_DIR)/.. -I$(PROJ_SRC_DIR)/..
+
+include $(LEVEL)/Makefile.common
diff --git a/contrib/llvm/lib/Target/CBackend/CBackend.cpp b/contrib/llvm/lib/Target/CBackend/CBackend.cpp
index fde2e29..415beb1 100644
--- a/contrib/llvm/lib/Target/CBackend/CBackend.cpp
+++ b/contrib/llvm/lib/Target/CBackend/CBackend.cpp
@@ -20,7 +20,6 @@
#include "llvm/Instructions.h"
#include "llvm/Pass.h"
#include "llvm/PassManager.h"
-#include "llvm/TypeSymbolTable.h"
#include "llvm/Intrinsics.h"
#include "llvm/IntrinsicInst.h"
#include "llvm/InlineAsm.h"
@@ -37,6 +36,8 @@
#include "llvm/Transforms/Scalar.h"
#include "llvm/MC/MCAsmInfo.h"
#include "llvm/MC/MCContext.h"
+#include "llvm/MC/MCInstrInfo.h"
+#include "llvm/MC/MCSubtargetInfo.h"
#include "llvm/MC/MCSymbol.h"
#include "llvm/Target/TargetData.h"
#include "llvm/Target/TargetRegistry.h"
@@ -61,6 +62,12 @@ extern "C" void LLVMInitializeCBackendTarget() {
RegisterTargetMachine<CTargetMachine> X(TheCBackendTarget);
}
+extern "C" void LLVMInitializeCBackendMCAsmInfo() {}
+
+extern "C" void LLVMInitializeCBackendMCInstrInfo() {}
+
+extern "C" void LLVMInitializeCBackendMCSubtargetInfo() {}
+
namespace {
class CBEMCAsmInfo : public MCAsmInfo {
public:
@@ -69,29 +76,6 @@ namespace {
PrivateGlobalPrefix = "";
}
};
- /// CBackendNameAllUsedStructsAndMergeFunctions - This pass inserts names for
- /// any unnamed structure types that are used by the program, and merges
- /// external functions with the same name.
- ///
- class CBackendNameAllUsedStructsAndMergeFunctions : public ModulePass {
- public:
- static char ID;
- CBackendNameAllUsedStructsAndMergeFunctions()
- : ModulePass(ID) {
- initializeFindUsedTypesPass(*PassRegistry::getPassRegistry());
- }
- void getAnalysisUsage(AnalysisUsage &AU) const {
- AU.addRequired<FindUsedTypes>();
- }
-
- virtual const char *getPassName() const {
- return "C backend type canonicalizer";
- }
-
- virtual bool runOnModule(Module &M);
- };
-
- char CBackendNameAllUsedStructsAndMergeFunctions::ID = 0;
/// CWriter - This class is the main chunk of code that converts an LLVM
/// module to a C translation unit.
@@ -104,7 +88,7 @@ namespace {
const MCAsmInfo* TAsm;
MCContext *TCtx;
const TargetData* TD;
- std::map<const Type *, std::string> TypeNames;
+
std::map<const ConstantFP *, unsigned> FPConstantMap;
std::set<Function*> intrinsicPrototypesAlreadyGenerated;
std::set<const Argument*> ByValParams;
@@ -113,6 +97,10 @@ namespace {
DenseMap<const Value*, unsigned> AnonValueNumbers;
unsigned NextAnonValueNumber;
+ /// UnnamedStructIDs - This contains a unique ID for each struct that is
+ /// either anonymous or has no name.
+ DenseMap<const StructType*, unsigned> UnnamedStructIDs;
+
public:
static char ID;
explicit CWriter(formatted_raw_ostream &o)
@@ -158,9 +146,9 @@ namespace {
delete TCtx;
delete TAsm;
FPConstantMap.clear();
- TypeNames.clear();
ByValParams.clear();
intrinsicPrototypesAlreadyGenerated.clear();
+ UnnamedStructIDs.clear();
return false;
}
@@ -177,6 +165,8 @@ namespace {
const AttrListPtr &PAL,
const PointerType *Ty);
+ std::string getStructName(const StructType *ST);
+
/// writeOperandDeref - Print the result of dereferencing the specified
/// operand with '*'. This is equivalent to printing '*' then using
/// writeOperand, but avoids excess syntax in some cases.
@@ -205,9 +195,12 @@ namespace {
std::string InterpretASMConstraint(InlineAsm::ConstraintInfo& c);
void lowerIntrinsics(Function &F);
+ /// Prints the definition of the intrinsic function F. Supports the
+ /// intrinsics which need to be explicitly defined in the CBackend.
+ void printIntrinsicDefinition(const Function &F, raw_ostream &Out);
- void printModuleTypes(const TypeSymbolTable &ST);
- void printContainedStructs(const Type *Ty, std::set<const Type *> &);
+ void printModuleTypes();
+ void printContainedStructs(const Type *Ty, SmallPtrSet<const Type *, 16> &);
void printFloatingPointConstants(Function &F);
void printFloatingPointConstants(const Constant *C);
void printFunctionSignature(const Function *F, bool Prototype);
@@ -278,7 +271,7 @@ namespace {
return AI;
}
- // isInlineAsm - Check if the instruction is a call to an inline asm chunk
+ // isInlineAsm - Check if the instruction is a call to an inline asm chunk.
static bool isInlineAsm(const Instruction& I) {
if (const CallInst *CI = dyn_cast<CallInst>(&I))
return isa<InlineAsm>(CI->getCalledValue());
@@ -351,6 +344,7 @@ namespace {
char CWriter::ID = 0;
+
static std::string CBEMangle(const std::string &S) {
std::string Result;
@@ -366,90 +360,14 @@ static std::string CBEMangle(const std::string &S) {
return Result;
}
-
-/// This method inserts names for any unnamed structure types that are used by
-/// the program, and removes names from structure types that are not used by the
-/// program.
-///
-bool CBackendNameAllUsedStructsAndMergeFunctions::runOnModule(Module &M) {
- // Get a set of types that are used by the program...
- SetVector<const Type *> UT = getAnalysis<FindUsedTypes>().getTypes();
-
- // Loop over the module symbol table, removing types from UT that are
- // already named, and removing names for types that are not used.
- //
- TypeSymbolTable &TST = M.getTypeSymbolTable();
- for (TypeSymbolTable::iterator TI = TST.begin(), TE = TST.end();
- TI != TE; ) {
- TypeSymbolTable::iterator I = TI++;
-
- // If this isn't a struct or array type, remove it from our set of types
- // to name. This simplifies emission later.
- if (!I->second->isStructTy() && !I->second->isOpaqueTy() &&
- !I->second->isArrayTy()) {
- TST.remove(I);
- } else {
- // If this is not used, remove it from the symbol table.
- if (!UT.count(I->second))
- TST.remove(I);
- else
- UT.remove(I->second); // Only keep one name for this type.
- }
- }
-
- // UT now contains types that are not named. Loop over it, naming
- // structure types.
- //
- bool Changed = false;
- unsigned RenameCounter = 0;
- for (SetVector<const Type *>::const_iterator I = UT.begin(), E = UT.end();
- I != E; ++I)
- if ((*I)->isStructTy() || (*I)->isArrayTy()) {
- while (M.addTypeName("unnamed"+utostr(RenameCounter), *I))
- ++RenameCounter;
- Changed = true;
- }
-
-
- // Loop over all external functions and globals. If we have two with
- // identical names, merge them.
- // FIXME: This code should disappear when we don't allow values with the same
- // names when they have different types!
- std::map<std::string, GlobalValue*> ExtSymbols;
- for (Module::iterator I = M.begin(), E = M.end(); I != E;) {
- Function *GV = I++;
- if (GV->isDeclaration() && GV->hasName()) {
- std::pair<std::map<std::string, GlobalValue*>::iterator, bool> X
- = ExtSymbols.insert(std::make_pair(GV->getName(), GV));
- if (!X.second) {
- // Found a conflict, replace this global with the previous one.
- GlobalValue *OldGV = X.first->second;
- GV->replaceAllUsesWith(ConstantExpr::getBitCast(OldGV, GV->getType()));
- GV->eraseFromParent();
- Changed = true;
- }
- }
- }
- // Do the same for globals.
- for (Module::global_iterator I = M.global_begin(), E = M.global_end();
- I != E;) {
- GlobalVariable *GV = I++;
- if (GV->isDeclaration() && GV->hasName()) {
- std::pair<std::map<std::string, GlobalValue*>::iterator, bool> X
- = ExtSymbols.insert(std::make_pair(GV->getName(), GV));
- if (!X.second) {
- // Found a conflict, replace this global with the previous one.
- GlobalValue *OldGV = X.first->second;
- GV->replaceAllUsesWith(ConstantExpr::getBitCast(OldGV, GV->getType()));
- GV->eraseFromParent();
- Changed = true;
- }
- }
- }
-
- return Changed;
+std::string CWriter::getStructName(const StructType *ST) {
+ if (!ST->isAnonymous() && !ST->getName().empty())
+ return CBEMangle("l_"+ST->getName().str());
+
+ return "l_unnamed_" + utostr(UnnamedStructIDs[ST]);
}
+
/// printStructReturnPointerFunctionType - This is like printType for a struct
/// return type, except, instead of printing the type as void (*)(Struct*, ...)
/// print it as "Struct (*)(...)", for struct return functions.
@@ -463,7 +381,7 @@ void CWriter::printStructReturnPointerFunctionType(raw_ostream &Out,
bool PrintedType = false;
FunctionType::param_iterator I = FTy->param_begin(), E = FTy->param_end();
- const Type *RetTy = cast<PointerType>(I->get())->getElementType();
+ const Type *RetTy = cast<PointerType>(*I)->getElementType();
unsigned Idx = 1;
for (++I, ++Idx; I != E; ++I, ++Idx) {
if (PrintedType)
@@ -551,12 +469,6 @@ raw_ostream &CWriter::printType(raw_ostream &Out, const Type *Ty,
return Out;
}
- // Check to see if the type is named.
- if (!IgnoreName || Ty->isOpaqueTy()) {
- std::map<const Type *, std::string>::iterator I = TypeNames.find(Ty);
- if (I != TypeNames.end()) return Out << I->second << ' ' << NameSoFar;
- }
-
switch (Ty->getTypeID()) {
case Type::FunctionTyID: {
const FunctionType *FTy = cast<FunctionType>(Ty);
@@ -591,6 +503,11 @@ raw_ostream &CWriter::printType(raw_ostream &Out, const Type *Ty,
}
case Type::StructTyID: {
const StructType *STy = cast<StructType>(Ty);
+
+ // Check to see if the type is named.
+ if (!IgnoreName)
+ return Out << getStructName(STy) << ' ' << NameSoFar;
+
Out << NameSoFar + " {\n";
unsigned Idx = 0;
for (StructType::element_iterator I = STy->element_begin(),
@@ -631,12 +548,6 @@ raw_ostream &CWriter::printType(raw_ostream &Out, const Type *Ty,
return Out << "; }";
}
- case Type::OpaqueTyID: {
- std::string TyName = "struct opaque_" + itostr(OpaqueCounter++);
- assert(TypeNames.find(Ty) == TypeNames.end());
- TypeNames[Ty] = TyName;
- return Out << TyName << ' ' << NameSoFar;
- }
default:
llvm_unreachable("Unhandled case in getTypeProps!");
}
@@ -660,7 +571,7 @@ void CWriter::printConstantArray(ConstantArray *CPA, bool Static) {
if (isString) {
Out << '\"';
- // Keep track of whether the last number was a hexadecimal escape
+ // Keep track of whether the last number was a hexadecimal escape.
bool LastWasHex = false;
// Do not include the last character, which we know is null
@@ -1751,7 +1662,7 @@ bool CWriter::doInitialization(Module &M) {
std::string E;
if (const Target *Match = TargetRegistry::lookupTarget(Triple, E))
- TAsm = Match->createAsmInfo(Triple);
+ TAsm = Match->createMCAsmInfo(Triple);
#endif
TAsm = new CBEMCAsmInfo();
TCtx = new MCContext(*TAsm, NULL);
@@ -1777,6 +1688,7 @@ bool CWriter::doInitialization(Module &M) {
Out << "/* Provide Declarations */\n";
Out << "#include <stdarg.h>\n"; // Varargs support
Out << "#include <setjmp.h>\n"; // Unwind support
+ Out << "#include <limits.h>\n"; // With overflow intrinsics support.
generateCompilerSpecificCode(Out, TD);
// Provide a definition for `bool' if not compiling with a C++ compiler.
@@ -1820,8 +1732,8 @@ bool CWriter::doInitialization(Module &M) {
<< "/* End Module asm statements */\n";
}
- // Loop over the symbol table, emitting all named constants...
- printModuleTypes(M.getTypeSymbolTable());
+ // Loop over the symbol table, emitting all named constants.
+ printModuleTypes();
// Global variable declarations...
if (!M.global_empty()) {
@@ -1855,29 +1767,46 @@ bool CWriter::doInitialization(Module &M) {
Out << "float fmodf(float, float);\n";
Out << "long double fmodl(long double, long double);\n";
+ // Store the intrinsics which will be declared/defined below.
+ SmallVector<const Function*, 8> intrinsicsToDefine;
+
for (Module::iterator I = M.begin(), E = M.end(); I != E; ++I) {
// Don't print declarations for intrinsic functions.
- if (!I->isIntrinsic() && I->getName() != "setjmp" &&
- I->getName() != "longjmp" && I->getName() != "_setjmp") {
- if (I->hasExternalWeakLinkage())
- Out << "extern ";
- printFunctionSignature(I, true);
- if (I->hasWeakLinkage() || I->hasLinkOnceLinkage())
- Out << " __ATTRIBUTE_WEAK__";
- if (I->hasExternalWeakLinkage())
- Out << " __EXTERNAL_WEAK__";
- if (StaticCtors.count(I))
- Out << " __ATTRIBUTE_CTOR__";
- if (StaticDtors.count(I))
- Out << " __ATTRIBUTE_DTOR__";
- if (I->hasHiddenVisibility())
- Out << " __HIDDEN__";
-
- if (I->hasName() && I->getName()[0] == 1)
- Out << " LLVM_ASM(\"" << I->getName().substr(1) << "\")";
+ // Store the used intrinsics, which need to be explicitly defined.
+ if (I->isIntrinsic()) {
+ switch (I->getIntrinsicID()) {
+ default:
+ break;
+ case Intrinsic::uadd_with_overflow:
+ case Intrinsic::sadd_with_overflow:
+ intrinsicsToDefine.push_back(I);
+ break;
+ }
+ continue;
+ }
+
+ if (I->getName() == "setjmp" ||
+ I->getName() == "longjmp" || I->getName() == "_setjmp")
+ continue;
+
+ if (I->hasExternalWeakLinkage())
+ Out << "extern ";
+ printFunctionSignature(I, true);
+ if (I->hasWeakLinkage() || I->hasLinkOnceLinkage())
+ Out << " __ATTRIBUTE_WEAK__";
+ if (I->hasExternalWeakLinkage())
+ Out << " __EXTERNAL_WEAK__";
+ if (StaticCtors.count(I))
+ Out << " __ATTRIBUTE_CTOR__";
+ if (StaticDtors.count(I))
+ Out << " __ATTRIBUTE_DTOR__";
+ if (I->hasHiddenVisibility())
+ Out << " __HIDDEN__";
+
+ if (I->hasName() && I->getName()[0] == 1)
+ Out << " LLVM_ASM(\"" << I->getName().substr(1) << "\")";
- Out << ";\n";
- }
+ Out << ";\n";
}
// Output the global variable declarations
@@ -2012,6 +1941,14 @@ bool CWriter::doInitialization(Module &M) {
Out << "return X <= Y ; }\n";
Out << "static inline int llvm_fcmp_oge(double X, double Y) { ";
Out << "return X >= Y ; }\n";
+
+ // Emit definitions of the intrinsics.
+ for (SmallVector<const Function*, 8>::const_iterator
+ I = intrinsicsToDefine.begin(),
+ E = intrinsicsToDefine.end(); I != E; ++I) {
+ printIntrinsicDefinition(**I, Out);
+ }
+
return false;
}
@@ -2085,11 +2022,10 @@ void CWriter::printFloatingPointConstants(const Constant *C) {
}
-
/// printSymbolTable - Run through symbol table looking for type names. If a
/// type name is found, emit its declaration...
///
-void CWriter::printModuleTypes(const TypeSymbolTable &TST) {
+void CWriter::printModuleTypes() {
Out << "/* Helper union for bitcasts */\n";
Out << "typedef union {\n";
Out << " unsigned int Int32;\n";
@@ -2098,46 +2034,42 @@ void CWriter::printModuleTypes(const TypeSymbolTable &TST) {
Out << " double Double;\n";
Out << "} llvmBitCastUnion;\n";
- // We are only interested in the type plane of the symbol table.
- TypeSymbolTable::const_iterator I = TST.begin();
- TypeSymbolTable::const_iterator End = TST.end();
+ // Get all of the struct types used in the module.
+ std::vector<StructType*> StructTypes;
+ TheModule->findUsedStructTypes(StructTypes);
- // If there are no type names, exit early.
- if (I == End) return;
+ if (StructTypes.empty()) return;
- // Print out forward declarations for structure types before anything else!
Out << "/* Structure forward decls */\n";
- for (; I != End; ++I) {
- std::string Name = "struct " + CBEMangle("l_"+I->first);
- Out << Name << ";\n";
- TypeNames.insert(std::make_pair(I->second, Name));
- }
- Out << '\n';
+ unsigned NextTypeID = 0;
+
+ // If any of them are missing names, add a unique ID to UnnamedStructIDs.
+ // Print out forward declarations for structure types.
+ for (unsigned i = 0, e = StructTypes.size(); i != e; ++i) {
+ StructType *ST = StructTypes[i];
- // Now we can print out typedefs. Above, we guaranteed that this can only be
- // for struct or opaque types.
- Out << "/* Typedefs */\n";
- for (I = TST.begin(); I != End; ++I) {
- std::string Name = CBEMangle("l_"+I->first);
- Out << "typedef ";
- printType(Out, I->second, false, Name);
- Out << ";\n";
+ if (ST->isAnonymous() || ST->getName().empty())
+ UnnamedStructIDs[ST] = NextTypeID++;
+
+ std::string Name = getStructName(ST);
+
+ Out << "typedef struct " << Name << ' ' << Name << ";\n";
}
Out << '\n';
- // Keep track of which structures have been printed so far...
- std::set<const Type *> StructPrinted;
+ // Keep track of which structures have been printed so far.
+ SmallPtrSet<const Type *, 16> StructPrinted;
// Loop over all structures then push them into the stack so they are
// printed in the correct order.
//
Out << "/* Structure contents */\n";
- for (I = TST.begin(); I != End; ++I)
- if (I->second->isStructTy() || I->second->isArrayTy())
+ for (unsigned i = 0, e = StructTypes.size(); i != e; ++i)
+ if (StructTypes[i]->isStructTy())
// Only print out used types!
- printContainedStructs(I->second, StructPrinted);
+ printContainedStructs(StructTypes[i], StructPrinted);
}
// Push the struct onto the stack and recursively push all structs
@@ -2146,7 +2078,7 @@ void CWriter::printModuleTypes(const TypeSymbolTable &TST) {
// TODO: Make this work properly with vector types
//
void CWriter::printContainedStructs(const Type *Ty,
- std::set<const Type*> &StructPrinted) {
+ SmallPtrSet<const Type *, 16> &StructPrinted) {
// Don't walk through pointers.
if (Ty->isPointerTy() || Ty->isPrimitiveType() || Ty->isIntegerTy())
return;
@@ -2156,14 +2088,13 @@ void CWriter::printContainedStructs(const Type *Ty,
E = Ty->subtype_end(); I != E; ++I)
printContainedStructs(*I, StructPrinted);
- if (Ty->isStructTy() || Ty->isArrayTy()) {
+ if (const StructType *ST = dyn_cast<StructType>(Ty)) {
// Check to see if we have already printed this struct.
- if (StructPrinted.insert(Ty).second) {
- // Print structure type out.
- std::string Name = TypeNames[Ty];
- printType(Out, Ty, false, Name, true);
- Out << ";\n\n";
- }
+ if (!StructPrinted.insert(Ty)) return;
+
+ // Print structure type out.
+ printType(Out, ST, false, getStructName(ST), true);
+ Out << ";\n\n";
}
}
@@ -2786,6 +2717,103 @@ void CWriter::visitSelectInst(SelectInst &I) {
Out << "))";
}
+// Returns the macro name or value of the max or min of an integer type
+// (as defined in limits.h).
+static void printLimitValue(const IntegerType &Ty, bool isSigned, bool isMax,
+ raw_ostream &Out) {
+ const char* type;
+ const char* sprefix = "";
+
+ unsigned NumBits = Ty.getBitWidth();
+ if (NumBits <= 8) {
+ type = "CHAR";
+ sprefix = "S";
+ } else if (NumBits <= 16) {
+ type = "SHRT";
+ } else if (NumBits <= 32) {
+ type = "INT";
+ } else if (NumBits <= 64) {
+ type = "LLONG";
+ } else {
+ llvm_unreachable("Bit widths > 64 not implemented yet");
+ }
+
+ if (isSigned)
+ Out << sprefix << type << (isMax ? "_MAX" : "_MIN");
+ else
+ Out << "U" << type << (isMax ? "_MAX" : "0");
+}
+
+#ifndef NDEBUG
+static bool isSupportedIntegerSize(const IntegerType &T) {
+ return T.getBitWidth() == 8 || T.getBitWidth() == 16 ||
+ T.getBitWidth() == 32 || T.getBitWidth() == 64;
+}
+#endif
+
+void CWriter::printIntrinsicDefinition(const Function &F, raw_ostream &Out) {
+ const FunctionType *funT = F.getFunctionType();
+ const Type *retT = F.getReturnType();
+ const IntegerType *elemT = cast<IntegerType>(funT->getParamType(1));
+
+ assert(isSupportedIntegerSize(*elemT) &&
+ "CBackend does not support arbitrary size integers.");
+ assert(cast<StructType>(retT)->getElementType(0) == elemT &&
+ elemT == funT->getParamType(0) && funT->getNumParams() == 2);
+
+ switch (F.getIntrinsicID()) {
+ default:
+ llvm_unreachable("Unsupported Intrinsic.");
+ case Intrinsic::uadd_with_overflow:
+ // static inline Rty uadd_ixx(unsigned ixx a, unsigned ixx b) {
+ // Rty r;
+ // r.field0 = a + b;
+ // r.field1 = (r.field0 < a);
+ // return r;
+ // }
+ Out << "static inline ";
+ printType(Out, retT);
+ Out << GetValueName(&F);
+ Out << "(";
+ printSimpleType(Out, elemT, false);
+ Out << "a,";
+ printSimpleType(Out, elemT, false);
+ Out << "b) {\n ";
+ printType(Out, retT);
+ Out << "r;\n";
+ Out << " r.field0 = a + b;\n";
+ Out << " r.field1 = (r.field0 < a);\n";
+ Out << " return r;\n}\n";
+ break;
+
+ case Intrinsic::sadd_with_overflow:
+ // static inline Rty sadd_ixx(ixx a, ixx b) {
+ // Rty r;
+ // r.field1 = (b > 0 && a > XX_MAX - b) ||
+ // (b < 0 && a < XX_MIN - b);
+ // r.field0 = r.field1 ? 0 : a + b;
+ // return r;
+ // }
+ Out << "static ";
+ printType(Out, retT);
+ Out << GetValueName(&F);
+ Out << "(";
+ printSimpleType(Out, elemT, true);
+ Out << "a,";
+ printSimpleType(Out, elemT, true);
+ Out << "b) {\n ";
+ printType(Out, retT);
+ Out << "r;\n";
+ Out << " r.field1 = (b > 0 && a > ";
+ printLimitValue(*elemT, true, true, Out);
+ Out << " - b) || (b < 0 && a < ";
+ printLimitValue(*elemT, true, false, Out);
+ Out << " - b);\n";
+ Out << " r.field0 = r.field1 ? 0 : a + b;\n";
+ Out << " return r;\n}\n";
+ break;
+ }
+}
void CWriter::lowerIntrinsics(Function &F) {
// This is used to keep track of intrinsics that get generated to a lowered
@@ -2816,6 +2844,8 @@ void CWriter::lowerIntrinsics(Function &F) {
case Intrinsic::x86_sse2_cmp_sd:
case Intrinsic::x86_sse2_cmp_pd:
case Intrinsic::ppc_altivec_lvsl:
+ case Intrinsic::uadd_with_overflow:
+ case Intrinsic::sadd_with_overflow:
// We directly implement these intrinsics
break;
default:
@@ -3109,6 +3139,14 @@ bool CWriter::visitBuiltinCall(CallInst &I, Intrinsic::ID ID,
writeOperand(I.getArgOperand(0));
Out << ")";
return true;
+ case Intrinsic::uadd_with_overflow:
+ case Intrinsic::sadd_with_overflow:
+ Out << GetValueName(I.getCalledFunction()) << "(";
+ writeOperand(I.getArgOperand(0));
+ Out << ", ";
+ writeOperand(I.getArgOperand(1));
+ Out << ")";
+ return true;
}
}
@@ -3127,7 +3165,7 @@ std::string CWriter::InterpretASMConstraint(InlineAsm::ConstraintInfo& c) {
std::string E;
if (const Target *Match = TargetRegistry::lookupTarget(Triple, E))
- TargetAsm = Match->createAsmInfo(Triple);
+ TargetAsm = Match->createMCAsmInfo(Triple);
else
return c.Codes[0];
@@ -3520,7 +3558,8 @@ void CWriter::visitInsertValueInst(InsertValueInst &IVI) {
for (const unsigned *b = IVI.idx_begin(), *i = b, *e = IVI.idx_end();
i != e; ++i) {
const Type *IndexedTy =
- ExtractValueInst::getIndexedType(IVI.getOperand(0)->getType(), b, i+1);
+ ExtractValueInst::getIndexedType(IVI.getOperand(0)->getType(),
+ ArrayRef<unsigned>(b, i+1));
if (IndexedTy->isArrayTy())
Out << ".array[" << *i << "]";
else
@@ -3541,7 +3580,8 @@ void CWriter::visitExtractValueInst(ExtractValueInst &EVI) {
for (const unsigned *b = EVI.idx_begin(), *i = b, *e = EVI.idx_end();
i != e; ++i) {
const Type *IndexedTy =
- ExtractValueInst::getIndexedType(EVI.getOperand(0)->getType(), b, i+1);
+ ExtractValueInst::getIndexedType(EVI.getOperand(0)->getType(),
+ ArrayRef<unsigned>(b, i+1));
if (IndexedTy->isArrayTy())
Out << ".array[" << *i << "]";
else
@@ -3565,7 +3605,6 @@ bool CTargetMachine::addPassesToEmitFile(PassManagerBase &PM,
PM.add(createGCLoweringPass());
PM.add(createLowerInvokePass());
PM.add(createCFGSimplificationPass()); // clean up after lower invoke.
- PM.add(new CBackendNameAllUsedStructsAndMergeFunctions());
PM.add(new CWriter(o));
PM.add(createGCInfoDeleter());
return false;
diff --git a/contrib/llvm/lib/Target/CBackend/CTargetMachine.h b/contrib/llvm/lib/Target/CBackend/CTargetMachine.h
index 6fed195..e64216b 100644
--- a/contrib/llvm/lib/Target/CBackend/CTargetMachine.h
+++ b/contrib/llvm/lib/Target/CBackend/CTargetMachine.h
@@ -20,8 +20,9 @@
namespace llvm {
struct CTargetMachine : public TargetMachine {
- CTargetMachine(const Target &T, const std::string &TT, const std::string &FS)
- : TargetMachine(T) {}
+ CTargetMachine(const Target &T, const std::string &TT,
+ const std::string &CPU, const std::string &FS)
+ : TargetMachine(T, TT, CPU, FS) {}
virtual bool addPassesToEmitFile(PassManagerBase &PM,
formatted_raw_ostream &Out,
diff --git a/contrib/llvm/lib/Target/CellSPU/MCTargetDesc/CMakeLists.txt b/contrib/llvm/lib/Target/CellSPU/MCTargetDesc/CMakeLists.txt
new file mode 100644
index 0000000..85fb258
--- /dev/null
+++ b/contrib/llvm/lib/Target/CellSPU/MCTargetDesc/CMakeLists.txt
@@ -0,0 +1,4 @@
+add_llvm_library(LLVMCellSPUDesc
+ SPUMCTargetDesc.cpp
+ SPUMCAsmInfo.cpp
+ )
diff --git a/contrib/llvm/lib/Target/CellSPU/MCTargetDesc/Makefile b/contrib/llvm/lib/Target/CellSPU/MCTargetDesc/Makefile
new file mode 100644
index 0000000..10d9a42
--- /dev/null
+++ b/contrib/llvm/lib/Target/CellSPU/MCTargetDesc/Makefile
@@ -0,0 +1,16 @@
+##===- lib/Target/CellSPU/TargetDesc/Makefile --------------*- Makefile -*-===##
+#
+# The LLVM Compiler Infrastructure
+#
+# This file is distributed under the University of Illinois Open Source
+# License. See LICENSE.TXT for details.
+#
+##===----------------------------------------------------------------------===##
+
+LEVEL = ../../../..
+LIBRARYNAME = LLVMCellSPUDesc
+
+# Hack: we need to include 'main' target directory to grab private headers
+CPP.Flags += -I$(PROJ_OBJ_DIR)/.. -I$(PROJ_SRC_DIR)/..
+
+include $(LEVEL)/Makefile.common
diff --git a/contrib/llvm/lib/Target/CellSPU/SPUMCAsmInfo.cpp b/contrib/llvm/lib/Target/CellSPU/MCTargetDesc/SPUMCAsmInfo.cpp
index 99aaeb0..8c1176a 100644
--- a/contrib/llvm/lib/Target/CellSPU/SPUMCAsmInfo.cpp
+++ b/contrib/llvm/lib/Target/CellSPU/MCTargetDesc/SPUMCAsmInfo.cpp
@@ -15,6 +15,8 @@
using namespace llvm;
SPULinuxMCAsmInfo::SPULinuxMCAsmInfo(const Target &T, StringRef TT) {
+ IsLittleEndian = false;
+
ZeroDirective = "\t.space\t";
Data64bitsDirective = "\t.quad\t";
AlignmentIsInBytes = false;
diff --git a/contrib/llvm/lib/Target/CellSPU/SPUMCAsmInfo.h b/contrib/llvm/lib/Target/CellSPU/MCTargetDesc/SPUMCAsmInfo.h
index 7f850d3..7f850d3 100644
--- a/contrib/llvm/lib/Target/CellSPU/SPUMCAsmInfo.h
+++ b/contrib/llvm/lib/Target/CellSPU/MCTargetDesc/SPUMCAsmInfo.h
diff --git a/contrib/llvm/lib/Target/CellSPU/MCTargetDesc/SPUMCTargetDesc.cpp b/contrib/llvm/lib/Target/CellSPU/MCTargetDesc/SPUMCTargetDesc.cpp
new file mode 100644
index 0000000..26c5a4b
--- /dev/null
+++ b/contrib/llvm/lib/Target/CellSPU/MCTargetDesc/SPUMCTargetDesc.cpp
@@ -0,0 +1,56 @@
+//===-- SPUMCTargetDesc.cpp - Cell SPU Target Descriptions -----*- C++ -*-===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+//
+// This file provides Cell SPU specific target descriptions.
+//
+//===----------------------------------------------------------------------===//
+
+#include "SPUMCTargetDesc.h"
+#include "SPUMCAsmInfo.h"
+#include "llvm/MC/MCInstrInfo.h"
+#include "llvm/MC/MCRegisterInfo.h"
+#include "llvm/MC/MCSubtargetInfo.h"
+#include "llvm/Target/TargetRegistry.h"
+
+#define GET_INSTRINFO_MC_DESC
+#include "SPUGenInstrInfo.inc"
+
+#define GET_SUBTARGETINFO_MC_DESC
+#include "SPUGenSubtargetInfo.inc"
+
+#define GET_REGINFO_MC_DESC
+#include "SPUGenRegisterInfo.inc"
+
+using namespace llvm;
+
+static MCInstrInfo *createSPUMCInstrInfo() {
+ MCInstrInfo *X = new MCInstrInfo();
+ InitSPUMCInstrInfo(X);
+ return X;
+}
+
+extern "C" void LLVMInitializeCellSPUMCInstrInfo() {
+ TargetRegistry::RegisterMCInstrInfo(TheCellSPUTarget, createSPUMCInstrInfo);
+}
+
+static MCSubtargetInfo *createSPUMCSubtargetInfo(StringRef TT, StringRef CPU,
+ StringRef FS) {
+ MCSubtargetInfo *X = new MCSubtargetInfo();
+ InitSPUMCSubtargetInfo(X, TT, CPU, FS);
+ return X;
+}
+
+extern "C" void LLVMInitializeCellSPUMCSubtargetInfo() {
+ TargetRegistry::RegisterMCSubtargetInfo(TheCellSPUTarget,
+ createSPUMCSubtargetInfo);
+}
+
+extern "C" void LLVMInitializeCellSPUMCAsmInfo() {
+ RegisterMCAsmInfo<SPULinuxMCAsmInfo> X(TheCellSPUTarget);
+}
diff --git a/contrib/llvm/lib/Target/CellSPU/MCTargetDesc/SPUMCTargetDesc.h b/contrib/llvm/lib/Target/CellSPU/MCTargetDesc/SPUMCTargetDesc.h
new file mode 100644
index 0000000..c5c037d
--- /dev/null
+++ b/contrib/llvm/lib/Target/CellSPU/MCTargetDesc/SPUMCTargetDesc.h
@@ -0,0 +1,40 @@
+//===-- SPUMCTargetDesc.h - Alpha Target Descriptions ---------*- C++ -*-===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+//
+// This file provides Alpha specific target descriptions.
+//
+//===----------------------------------------------------------------------===//
+
+#ifndef SPUMCTARGETDESC_H
+#define SPUMCTARGETDESC_H
+
+namespace llvm {
+class MCSubtargetInfo;
+class Target;
+class StringRef;
+
+extern Target TheCellSPUTarget;
+
+} // End llvm namespace
+
+// Define symbolic names for Cell registers. This defines a mapping from
+// register name to register number.
+//
+#define GET_REGINFO_ENUM
+#include "SPUGenRegisterInfo.inc"
+
+// Defines symbolic names for the SPU instructions.
+//
+#define GET_INSTRINFO_ENUM
+#include "SPUGenInstrInfo.inc"
+
+#define GET_SUBTARGETINFO_ENUM
+#include "SPUGenSubtargetInfo.inc"
+
+#endif
diff --git a/contrib/llvm/lib/Target/CellSPU/SPU.h b/contrib/llvm/lib/Target/CellSPU/SPU.h
index 72f8430..b51fbc7 100644
--- a/contrib/llvm/lib/Target/CellSPU/SPU.h
+++ b/contrib/llvm/lib/Target/CellSPU/SPU.h
@@ -15,6 +15,7 @@
#ifndef LLVM_TARGET_IBMCELLSPU_H
#define LLVM_TARGET_IBMCELLSPU_H
+#include "MCTargetDesc/SPUMCTargetDesc.h"
#include "llvm/Target/TargetMachine.h"
namespace llvm {
@@ -25,11 +26,6 @@ namespace llvm {
FunctionPass *createSPUISelDag(SPUTargetMachine &TM);
FunctionPass *createSPUNopFillerPass(SPUTargetMachine &tm);
- extern Target TheCellSPUTarget;
}
-// Defines symbolic names for the SPU instructions.
-//
-#include "SPUGenInstrNames.inc"
-
#endif /* LLVM_TARGET_IBMCELLSPU_H */
diff --git a/contrib/llvm/lib/Target/CellSPU/SPUFrameLowering.cpp b/contrib/llvm/lib/Target/CellSPU/SPUFrameLowering.cpp
index 432f4a1..a3e7e73 100644
--- a/contrib/llvm/lib/Target/CellSPU/SPUFrameLowering.cpp
+++ b/contrib/llvm/lib/Target/CellSPU/SPUFrameLowering.cpp
@@ -13,7 +13,6 @@
#include "SPU.h"
#include "SPUFrameLowering.h"
-#include "SPURegisterNames.h"
#include "SPUInstrBuilder.h"
#include "SPUInstrInfo.h"
#include "llvm/Function.h"
diff --git a/contrib/llvm/lib/Target/CellSPU/SPUISelDAGToDAG.cpp b/contrib/llvm/lib/Target/CellSPU/SPUISelDAGToDAG.cpp
index 9351ffd..a297d03 100644
--- a/contrib/llvm/lib/Target/CellSPU/SPUISelDAGToDAG.cpp
+++ b/contrib/llvm/lib/Target/CellSPU/SPUISelDAGToDAG.cpp
@@ -16,7 +16,6 @@
#include "SPUTargetMachine.h"
#include "SPUHazardRecognizers.h"
#include "SPUFrameLowering.h"
-#include "SPURegisterNames.h"
#include "SPUTargetMachine.h"
#include "llvm/CodeGen/MachineConstantPool.h"
#include "llvm/CodeGen/MachineInstrBuilder.h"
diff --git a/contrib/llvm/lib/Target/CellSPU/SPUISelLowering.cpp b/contrib/llvm/lib/Target/CellSPU/SPUISelLowering.cpp
index f9b5041..f0ceee2 100644
--- a/contrib/llvm/lib/Target/CellSPU/SPUISelLowering.cpp
+++ b/contrib/llvm/lib/Target/CellSPU/SPUISelLowering.cpp
@@ -10,7 +10,6 @@
//
//===----------------------------------------------------------------------===//
-#include "SPURegisterNames.h"
#include "SPUISelLowering.h"
#include "SPUTargetMachine.h"
#include "SPUFrameLowering.h"
@@ -221,6 +220,9 @@ SPUTargetLowering::SPUTargetLowering(SPUTargetMachine &TM)
setOperationAction(ISD::FSQRT, MVT::f64, Expand);
setOperationAction(ISD::FSQRT, MVT::f32, Expand);
+ setOperationAction(ISD::FMA, MVT::f64, Expand);
+ setOperationAction(ISD::FMA, MVT::f32, Expand);
+
setOperationAction(ISD::FCOPYSIGN, MVT::f64, Expand);
setOperationAction(ISD::FCOPYSIGN, MVT::f32, Expand);
diff --git a/contrib/llvm/lib/Target/CellSPU/SPUInstrInfo.cpp b/contrib/llvm/lib/Target/CellSPU/SPUInstrInfo.cpp
index 080434d..e67b10c 100644
--- a/contrib/llvm/lib/Target/CellSPU/SPUInstrInfo.cpp
+++ b/contrib/llvm/lib/Target/CellSPU/SPUInstrInfo.cpp
@@ -11,17 +11,19 @@
//
//===----------------------------------------------------------------------===//
-#include "SPURegisterNames.h"
#include "SPUInstrInfo.h"
#include "SPUInstrBuilder.h"
#include "SPUTargetMachine.h"
-#include "SPUGenInstrInfo.inc"
#include "SPUHazardRecognizers.h"
#include "llvm/CodeGen/MachineInstrBuilder.h"
+#include "llvm/MC/MCContext.h"
+#include "llvm/Target/TargetRegistry.h"
#include "llvm/Support/Debug.h"
#include "llvm/Support/ErrorHandling.h"
#include "llvm/Support/raw_ostream.h"
-#include "llvm/MC/MCContext.h"
+
+#define GET_INSTRINFO_CTOR
+#include "SPUGenInstrInfo.inc"
using namespace llvm;
@@ -51,7 +53,7 @@ namespace {
}
SPUInstrInfo::SPUInstrInfo(SPUTargetMachine &tm)
- : TargetInstrInfoImpl(SPUInsts, sizeof(SPUInsts)/sizeof(SPUInsts[0])),
+ : SPUGenInstrInfo(SPU::ADJCALLSTACKDOWN, SPU::ADJCALLSTACKUP),
TM(tm),
RI(*TM.getSubtargetImpl(), *this)
{ /* NOP */ }
diff --git a/contrib/llvm/lib/Target/CellSPU/SPUInstrInfo.h b/contrib/llvm/lib/Target/CellSPU/SPUInstrInfo.h
index e5e9148..bc1ba71 100644
--- a/contrib/llvm/lib/Target/CellSPU/SPUInstrInfo.h
+++ b/contrib/llvm/lib/Target/CellSPU/SPUInstrInfo.h
@@ -18,9 +18,12 @@
#include "llvm/Target/TargetInstrInfo.h"
#include "SPURegisterInfo.h"
+#define GET_INSTRINFO_HEADER
+#include "SPUGenInstrInfo.inc"
+
namespace llvm {
//! Cell SPU instruction information class
- class SPUInstrInfo : public TargetInstrInfoImpl {
+ class SPUInstrInfo : public SPUGenInstrInfo {
SPUTargetMachine &TM;
const SPURegisterInfo RI;
public:
diff --git a/contrib/llvm/lib/Target/CellSPU/SPURegisterInfo.cpp b/contrib/llvm/lib/Target/CellSPU/SPURegisterInfo.cpp
index 623ae76..19896c0 100644
--- a/contrib/llvm/lib/Target/CellSPU/SPURegisterInfo.cpp
+++ b/contrib/llvm/lib/Target/CellSPU/SPURegisterInfo.cpp
@@ -14,7 +14,6 @@
#define DEBUG_TYPE "reginfo"
#include "SPU.h"
#include "SPURegisterInfo.h"
-#include "SPURegisterNames.h"
#include "SPUInstrBuilder.h"
#include "SPUSubtarget.h"
#include "SPUMachineFunction.h"
@@ -43,6 +42,9 @@
#include "llvm/ADT/STLExtras.h"
#include <cstdlib>
+#define GET_REGINFO_TARGET_DESC
+#include "SPUGenRegisterInfo.inc"
+
using namespace llvm;
/// getRegisterNumbering - Given the enum value for some register, e.g.
@@ -185,9 +187,7 @@ unsigned SPURegisterInfo::getRegisterNumbering(unsigned RegEnum) {
SPURegisterInfo::SPURegisterInfo(const SPUSubtarget &subtarget,
const TargetInstrInfo &tii) :
- SPUGenRegisterInfo(SPU::ADJCALLSTACKDOWN, SPU::ADJCALLSTACKUP),
- Subtarget(subtarget),
- TII(tii)
+ SPUGenRegisterInfo(), Subtarget(subtarget), TII(tii)
{
}
@@ -371,5 +371,3 @@ SPURegisterInfo::findScratchRegister(MachineBasicBlock::iterator II,
assert( Reg && "Register scavenger failed");
return Reg;
}
-
-#include "SPUGenRegisterInfo.inc"
diff --git a/contrib/llvm/lib/Target/CellSPU/SPURegisterInfo.h b/contrib/llvm/lib/Target/CellSPU/SPURegisterInfo.h
index 6ecf0f2..5e014f8 100644
--- a/contrib/llvm/lib/Target/CellSPU/SPURegisterInfo.h
+++ b/contrib/llvm/lib/Target/CellSPU/SPURegisterInfo.h
@@ -16,7 +16,9 @@
#define SPU_REGISTERINFO_H
#include "SPU.h"
-#include "SPUGenRegisterInfo.h.inc"
+
+#define GET_REGINFO_HEADER
+#include "SPUGenRegisterInfo.inc"
namespace llvm {
class SPUSubtarget;
diff --git a/contrib/llvm/lib/Target/CellSPU/SPURegisterInfo.td b/contrib/llvm/lib/Target/CellSPU/SPURegisterInfo.td
index cce0c82..e16f51f 100644
--- a/contrib/llvm/lib/Target/CellSPU/SPURegisterInfo.td
+++ b/contrib/llvm/lib/Target/CellSPU/SPURegisterInfo.td
@@ -155,147 +155,29 @@ def R127 : SPUVecReg<127, "$127">, DwarfRegNum<[127]>;
// The SPU's registers as 128-bit wide entities, and can function as general
// purpose registers, where the operands are in the "preferred slot":
+// The non-volatile registers are allocated in reverse order, like PPC does it.
def GPRC : RegisterClass<"SPU", [i128], 128,
- [
- /* volatile register */
- R3, R4, R5, R6, R7, R8, R9, R10, R11, R12, R13, R14, R15, R16,
- R17, R18, R19, R20, R21, R22, R23, R24, R25, R26, R27, R28, R29, R30, R31,
- R32, R33, R34, R35, R36, R37, R38, R39, R40, R41, R42, R43, R44, R45, R46,
- R47, R48, R49, R50, R51, R52, R53, R54, R55, R56, R57, R58, R59, R60, R61,
- R62, R63, R64, R65, R66, R67, R68, R69, R70, R71, R72, R73, R74, R75, R76,
- R77, R78, R79,
- /* non-volatile register: take hint from PPC and allocate in reverse order */
- R127, R126, R125, R124, R123, R122, R121, R120, R119, R118, R117, R116, R115,
- R114, R113, R112, R111, R110, R109, R108, R107, R106, R105, R104, R103, R102,
- R101, R100, R99, R98, R97, R96, R95, R94, R93, R92, R91, R90, R89, R88, R87,
- R86, R85, R84, R83, R82, R81, R80,
- /* environment ptr, SP, LR */
- R2, R1, R0 ]>;
+ (add (sequence "R%u", 0, 79),
+ (sequence "R%u", 127, 80))>;
// The SPU's registers as 64-bit wide (double word integer) "preferred slot":
-def R64C : RegisterClass<"SPU", [i64], 128,
- [
- /* volatile register */
- R3, R4, R5, R6, R7, R8, R9, R10, R11, R12, R13, R14, R15, R16,
- R17, R18, R19, R20, R21, R22, R23, R24, R25, R26, R27, R28, R29, R30, R31,
- R32, R33, R34, R35, R36, R37, R38, R39, R40, R41, R42, R43, R44, R45, R46,
- R47, R48, R49, R50, R51, R52, R53, R54, R55, R56, R57, R58, R59, R60, R61,
- R62, R63, R64, R65, R66, R67, R68, R69, R70, R71, R72, R73, R74, R75, R76,
- R77, R78, R79,
- /* non-volatile register: take hint from PPC and allocate in reverse order */
- R127, R126, R125, R124, R123, R122, R121, R120, R119, R118, R117, R116, R115,
- R114, R113, R112, R111, R110, R109, R108, R107, R106, R105, R104, R103, R102,
- R101, R100, R99, R98, R97, R96, R95, R94, R93, R92, R91, R90, R89, R88, R87,
- R86, R85, R84, R83, R82, R81, R80,
- /* environment ptr, SP, LR */
- R2, R1, R0 ]>;
+def R64C : RegisterClass<"SPU", [i64], 128, (add GPRC)>;
// The SPU's registers as 64-bit wide (double word) FP "preferred slot":
-def R64FP : RegisterClass<"SPU", [f64], 128,
- [
- /* volatile register */
- R3, R4, R5, R6, R7, R8, R9, R10, R11, R12, R13, R14, R15, R16,
- R17, R18, R19, R20, R21, R22, R23, R24, R25, R26, R27, R28, R29, R30, R31,
- R32, R33, R34, R35, R36, R37, R38, R39, R40, R41, R42, R43, R44, R45, R46,
- R47, R48, R49, R50, R51, R52, R53, R54, R55, R56, R57, R58, R59, R60, R61,
- R62, R63, R64, R65, R66, R67, R68, R69, R70, R71, R72, R73, R74, R75, R76,
- R77, R78, R79,
- /* non-volatile register: take hint from PPC and allocate in reverse order */
- R127, R126, R125, R124, R123, R122, R121, R120, R119, R118, R117, R116, R115,
- R114, R113, R112, R111, R110, R109, R108, R107, R106, R105, R104, R103, R102,
- R101, R100, R99, R98, R97, R96, R95, R94, R93, R92, R91, R90, R89, R88, R87,
- R86, R85, R84, R83, R82, R81, R80,
- /* environment ptr, SP, LR */
- R2, R1, R0 ]>;
+def R64FP : RegisterClass<"SPU", [f64], 128, (add GPRC)>;
// The SPU's registers as 32-bit wide (word) "preferred slot":
-def R32C : RegisterClass<"SPU", [i32], 128,
- [
- /* volatile register */
- R3, R4, R5, R6, R7, R8, R9, R10, R11, R12, R13, R14, R15, R16,
- R17, R18, R19, R20, R21, R22, R23, R24, R25, R26, R27, R28, R29, R30, R31,
- R32, R33, R34, R35, R36, R37, R38, R39, R40, R41, R42, R43, R44, R45, R46,
- R47, R48, R49, R50, R51, R52, R53, R54, R55, R56, R57, R58, R59, R60, R61,
- R62, R63, R64, R65, R66, R67, R68, R69, R70, R71, R72, R73, R74, R75, R76,
- R77, R78, R79,
- /* non-volatile register: take hint from PPC and allocate in reverse order */
- R127, R126, R125, R124, R123, R122, R121, R120, R119, R118, R117, R116, R115,
- R114, R113, R112, R111, R110, R109, R108, R107, R106, R105, R104, R103, R102,
- R101, R100, R99, R98, R97, R96, R95, R94, R93, R92, R91, R90, R89, R88, R87,
- R86, R85, R84, R83, R82, R81, R80,
- /* environment ptr, SP, LR */
- R2, R1, R0 ]>;
+def R32C : RegisterClass<"SPU", [i32], 128, (add GPRC)>;
// The SPU's registers as single precision floating point "preferred slot":
-def R32FP : RegisterClass<"SPU", [f32], 128,
- [
- /* volatile register */
- R3, R4, R5, R6, R7, R8, R9, R10, R11, R12, R13, R14, R15, R16,
- R17, R18, R19, R20, R21, R22, R23, R24, R25, R26, R27, R28, R29, R30, R31,
- R32, R33, R34, R35, R36, R37, R38, R39, R40, R41, R42, R43, R44, R45, R46,
- R47, R48, R49, R50, R51, R52, R53, R54, R55, R56, R57, R58, R59, R60, R61,
- R62, R63, R64, R65, R66, R67, R68, R69, R70, R71, R72, R73, R74, R75, R76,
- R77, R78, R79,
- /* non-volatile register: take hint from PPC and allocate in reverse order */
- R127, R126, R125, R124, R123, R122, R121, R120, R119, R118, R117, R116, R115,
- R114, R113, R112, R111, R110, R109, R108, R107, R106, R105, R104, R103, R102,
- R101, R100, R99, R98, R97, R96, R95, R94, R93, R92, R91, R90, R89, R88, R87,
- R86, R85, R84, R83, R82, R81, R80,
- /* environment ptr, SP, LR */
- R2, R1, R0 ]>;
+def R32FP : RegisterClass<"SPU", [f32], 128, (add GPRC)>;
// The SPU's registers as 16-bit wide (halfword) "preferred slot":
-def R16C : RegisterClass<"SPU", [i16], 128,
- [
- /* volatile register */
- R3, R4, R5, R6, R7, R8, R9, R10, R11, R12, R13, R14, R15, R16,
- R17, R18, R19, R20, R21, R22, R23, R24, R25, R26, R27, R28, R29, R30, R31,
- R32, R33, R34, R35, R36, R37, R38, R39, R40, R41, R42, R43, R44, R45, R46,
- R47, R48, R49, R50, R51, R52, R53, R54, R55, R56, R57, R58, R59, R60, R61,
- R62, R63, R64, R65, R66, R67, R68, R69, R70, R71, R72, R73, R74, R75, R76,
- R77, R78, R79,
- /* non-volatile register: take hint from PPC and allocate in reverse order */
- R127, R126, R125, R124, R123, R122, R121, R120, R119, R118, R117, R116, R115,
- R114, R113, R112, R111, R110, R109, R108, R107, R106, R105, R104, R103, R102,
- R101, R100, R99, R98, R97, R96, R95, R94, R93, R92, R91, R90, R89, R88, R87,
- R86, R85, R84, R83, R82, R81, R80,
- /* environment ptr, SP, LR */
- R2, R1, R0 ]>;
+def R16C : RegisterClass<"SPU", [i16], 128, (add GPRC)>;
// The SPU's registers as 8-bit wide (byte) "preferred slot":
-def R8C : RegisterClass<"SPU", [i8], 128,
- [
- /* volatile register */
- R3, R4, R5, R6, R7, R8, R9, R10, R11, R12, R13, R14, R15, R16,
- R17, R18, R19, R20, R21, R22, R23, R24, R25, R26, R27, R28, R29, R30, R31,
- R32, R33, R34, R35, R36, R37, R38, R39, R40, R41, R42, R43, R44, R45, R46,
- R47, R48, R49, R50, R51, R52, R53, R54, R55, R56, R57, R58, R59, R60, R61,
- R62, R63, R64, R65, R66, R67, R68, R69, R70, R71, R72, R73, R74, R75, R76,
- R77, R78, R79,
- /* non-volatile register: take hint from PPC and allocate in reverse order */
- R127, R126, R125, R124, R123, R122, R121, R120, R119, R118, R117, R116, R115,
- R114, R113, R112, R111, R110, R109, R108, R107, R106, R105, R104, R103, R102,
- R101, R100, R99, R98, R97, R96, R95, R94, R93, R92, R91, R90, R89, R88, R87,
- R86, R85, R84, R83, R82, R81, R80,
- /* environment ptr, SP, LR */
- R2, R1, R0 ]>;
+def R8C : RegisterClass<"SPU", [i8], 128, (add GPRC)>;
// The SPU's registers as vector registers:
-def VECREG : RegisterClass<"SPU",
- [v16i8,v8i16,v4i32,v4f32,v2i64,v2f64],
- 128,
- [
- /* volatile register */
- R3, R4, R5, R6, R7, R8, R9, R10, R11, R12, R13, R14, R15, R16,
- R17, R18, R19, R20, R21, R22, R23, R24, R25, R26, R27, R28, R29, R30, R31,
- R32, R33, R34, R35, R36, R37, R38, R39, R40, R41, R42, R43, R44, R45, R46,
- R47, R48, R49, R50, R51, R52, R53, R54, R55, R56, R57, R58, R59, R60, R61,
- R62, R63, R64, R65, R66, R67, R68, R69, R70, R71, R72, R73, R74, R75, R76,
- R77, R78, R79,
- /* non-volatile register: take hint from PPC and allocate in reverse order */
- R127, R126, R125, R124, R123, R122, R121, R120, R119, R118, R117, R116, R115,
- R114, R113, R112, R111, R110, R109, R108, R107, R106, R105, R104, R103, R102,
- R101, R100, R99, R98, R97, R96, R95, R94, R93, R92, R91, R90, R89, R88, R87,
- R86, R85, R84, R83, R82, R81, R80,
- /* environment ptr, SP, LR */
- R2, R1, R0 ]>;
+def VECREG : RegisterClass<"SPU", [v16i8,v8i16,v4i32,v4f32,v2i64,v2f64], 128,
+ (add GPRC)>;
diff --git a/contrib/llvm/lib/Target/CellSPU/SPURegisterNames.h b/contrib/llvm/lib/Target/CellSPU/SPURegisterNames.h
index 6c3afdf..e557ed3 100644
--- a/contrib/llvm/lib/Target/CellSPU/SPURegisterNames.h
+++ b/contrib/llvm/lib/Target/CellSPU/SPURegisterNames.h
@@ -13,6 +13,7 @@
// Define symbolic names for Cell registers. This defines a mapping from
// register name to register number.
//
-#include "SPUGenRegisterNames.inc"
+#define GET_REGINFO_ENUM
+#include "SPUGenRegisterInfo.inc"
#endif
diff --git a/contrib/llvm/lib/Target/CellSPU/SPUSubtarget.cpp b/contrib/llvm/lib/Target/CellSPU/SPUSubtarget.cpp
index 07c8352..856dc82 100644
--- a/contrib/llvm/lib/Target/CellSPU/SPUSubtarget.cpp
+++ b/contrib/llvm/lib/Target/CellSPU/SPUSubtarget.cpp
@@ -7,19 +7,25 @@
//
//===----------------------------------------------------------------------===//
//
-// This file implements the CellSPU-specific subclass of TargetSubtarget.
+// This file implements the CellSPU-specific subclass of TargetSubtargetInfo.
//
//===----------------------------------------------------------------------===//
#include "SPUSubtarget.h"
#include "SPU.h"
-#include "SPUGenSubtarget.inc"
-#include "llvm/ADT/SmallVector.h"
#include "SPURegisterInfo.h"
+#include "llvm/Target/TargetRegistry.h"
+#include "llvm/ADT/SmallVector.h"
+
+#define GET_SUBTARGETINFO_TARGET_DESC
+#define GET_SUBTARGETINFO_CTOR
+#include "SPUGenSubtargetInfo.inc"
using namespace llvm;
-SPUSubtarget::SPUSubtarget(const std::string &TT, const std::string &FS) :
+SPUSubtarget::SPUSubtarget(const std::string &TT, const std::string &CPU,
+ const std::string &FS) :
+ SPUGenSubtargetInfo(TT, CPU, FS),
StackAlignment(16),
ProcDirective(SPU::DEFAULT_PROC),
UseLargeMem(false)
@@ -29,7 +35,10 @@ SPUSubtarget::SPUSubtarget(const std::string &TT, const std::string &FS) :
std::string default_cpu("v0");
// Parse features string.
- ParseSubtargetFeatures(FS, default_cpu);
+ ParseSubtargetFeatures(default_cpu, FS);
+
+ // Initialize scheduling itinerary for the specified CPU.
+ InstrItins = getInstrItineraryForCPU(default_cpu);
}
/// SetJITMode - This is called to inform the subtarget info that we are
@@ -40,9 +49,9 @@ void SPUSubtarget::SetJITMode() {
/// Enable PostRA scheduling for optimization levels -O2 and -O3.
bool SPUSubtarget::enablePostRAScheduler(
CodeGenOpt::Level OptLevel,
- TargetSubtarget::AntiDepBreakMode& Mode,
+ TargetSubtargetInfo::AntiDepBreakMode& Mode,
RegClassVector& CriticalPathRCs) const {
- Mode = TargetSubtarget::ANTIDEP_CRITICAL;
+ Mode = TargetSubtargetInfo::ANTIDEP_CRITICAL;
// CriticalPathsRCs seems to be the set of
// RegisterClasses that antidep breakings are performed for.
// Do it for all register classes
diff --git a/contrib/llvm/lib/Target/CellSPU/SPUSubtarget.h b/contrib/llvm/lib/Target/CellSPU/SPUSubtarget.h
index d7929302..7c4aa14 100644
--- a/contrib/llvm/lib/Target/CellSPU/SPUSubtarget.h
+++ b/contrib/llvm/lib/Target/CellSPU/SPUSubtarget.h
@@ -7,20 +7,23 @@
//
//===----------------------------------------------------------------------===//
//
-// This file declares the Cell SPU-specific subclass of TargetSubtarget.
+// This file declares the Cell SPU-specific subclass of TargetSubtargetInfo.
//
//===----------------------------------------------------------------------===//
#ifndef CELLSUBTARGET_H
#define CELLSUBTARGET_H
-#include "llvm/Target/TargetInstrItineraries.h"
-#include "llvm/Target/TargetSubtarget.h"
-
+#include "llvm/Target/TargetSubtargetInfo.h"
+#include "llvm/MC/MCInstrItineraries.h"
#include <string>
+#define GET_SUBTARGETINFO_HEADER
+#include "SPUGenSubtargetInfo.inc"
+
namespace llvm {
class GlobalValue;
+ class StringRef;
namespace SPU {
enum {
@@ -29,7 +32,7 @@ namespace llvm {
};
}
- class SPUSubtarget : public TargetSubtarget {
+ class SPUSubtarget : public SPUGenSubtargetInfo {
protected:
/// stackAlignment - The minimum alignment known to hold of the stack frame
/// on entry to the function and which must be maintained by every function.
@@ -50,12 +53,12 @@ namespace llvm {
/// This constructor initializes the data members to match that
/// of the specified triple.
///
- SPUSubtarget(const std::string &TT, const std::string &FS);
+ SPUSubtarget(const std::string &TT, const std::string &CPU,
+ const std::string &FS);
/// ParseSubtargetFeatures - Parses features string setting specified
/// subtarget options. Definition of function is auto generated by tblgen.
- std::string ParseSubtargetFeatures(const std::string &FS,
- const std::string &CPU);
+ void ParseSubtargetFeatures(StringRef CPU, StringRef FS);
/// SetJITMode - This is called to inform the subtarget info that we are
/// producing code for the JIT.
@@ -86,7 +89,7 @@ namespace llvm {
}
bool enablePostRAScheduler(CodeGenOpt::Level OptLevel,
- TargetSubtarget::AntiDepBreakMode& Mode,
+ TargetSubtargetInfo::AntiDepBreakMode& Mode,
RegClassVector& CriticalPathRCs) const;
};
} // End llvm namespace
diff --git a/contrib/llvm/lib/Target/CellSPU/SPUTargetMachine.cpp b/contrib/llvm/lib/Target/CellSPU/SPUTargetMachine.cpp
index 3ed7361..3542a2b 100644
--- a/contrib/llvm/lib/Target/CellSPU/SPUTargetMachine.cpp
+++ b/contrib/llvm/lib/Target/CellSPU/SPUTargetMachine.cpp
@@ -12,8 +12,6 @@
//===----------------------------------------------------------------------===//
#include "SPU.h"
-#include "SPURegisterNames.h"
-#include "SPUMCAsmInfo.h"
#include "SPUTargetMachine.h"
#include "llvm/PassManager.h"
#include "llvm/CodeGen/RegAllocRegistry.h"
@@ -25,7 +23,6 @@ using namespace llvm;
extern "C" void LLVMInitializeCellSPUTarget() {
// Register the target.
RegisterTargetMachine<SPUTargetMachine> X(TheCellSPUTarget);
- RegisterAsmInfo<SPULinuxMCAsmInfo> Y(TheCellSPUTarget);
}
const std::pair<unsigned, int> *
@@ -35,9 +32,9 @@ SPUFrameLowering::getCalleeSaveSpillSlots(unsigned &NumEntries) const {
}
SPUTargetMachine::SPUTargetMachine(const Target &T, const std::string &TT,
- const std::string &FS)
- : LLVMTargetMachine(T, TT),
- Subtarget(TT, FS),
+ const std::string &CPU,const std::string &FS)
+ : LLVMTargetMachine(T, TT, CPU, FS),
+ Subtarget(TT, CPU, FS),
DataLayout(Subtarget.getTargetDataString()),
InstrInfo(*this),
FrameLowering(Subtarget),
diff --git a/contrib/llvm/lib/Target/CellSPU/SPUTargetMachine.h b/contrib/llvm/lib/Target/CellSPU/SPUTargetMachine.h
index 75abd5e..d96f86d 100644
--- a/contrib/llvm/lib/Target/CellSPU/SPUTargetMachine.h
+++ b/contrib/llvm/lib/Target/CellSPU/SPUTargetMachine.h
@@ -39,7 +39,7 @@ class SPUTargetMachine : public LLVMTargetMachine {
InstrItineraryData InstrItins;
public:
SPUTargetMachine(const Target &T, const std::string &TT,
- const std::string &FS);
+ const std::string &CPU, const std::string &FS);
/// Return the subtarget implementation object
virtual const SPUSubtarget *getSubtargetImpl() const {
diff --git a/contrib/llvm/lib/Target/CppBackend/CPPBackend.cpp b/contrib/llvm/lib/Target/CppBackend/CPPBackend.cpp
index 797cfd5..10d18f6 100644
--- a/contrib/llvm/lib/Target/CppBackend/CPPBackend.cpp
+++ b/contrib/llvm/lib/Target/CppBackend/CPPBackend.cpp
@@ -22,7 +22,9 @@
#include "llvm/Module.h"
#include "llvm/Pass.h"
#include "llvm/PassManager.h"
-#include "llvm/TypeSymbolTable.h"
+#include "llvm/MC/MCAsmInfo.h"
+#include "llvm/MC/MCInstrInfo.h"
+#include "llvm/MC/MCSubtargetInfo.h"
#include "llvm/ADT/SmallPtrSet.h"
#include "llvm/Support/CommandLine.h"
#include "llvm/Support/ErrorHandling.h"
@@ -32,7 +34,7 @@
#include "llvm/Config/config.h"
#include <algorithm>
#include <set>
-
+#include <map>
using namespace llvm;
static cl::opt<std::string>
@@ -75,6 +77,16 @@ extern "C" void LLVMInitializeCppBackendTarget() {
RegisterTargetMachine<CPPTargetMachine> X(TheCppBackendTarget);
}
+extern "C" void LLVMInitializeCppBackendMCAsmInfo() {}
+
+extern "C" void LLVMInitializeCppBackendMCInstrInfo() {
+ RegisterMCInstrInfo<MCInstrInfo> X(TheCppBackendTarget);
+}
+
+extern "C" void LLVMInitializeCppBackendMCSubtargetInfo() {
+ RegisterMCSubtargetInfo<MCSubtargetInfo> X(TheCppBackendTarget);
+}
+
namespace {
typedef std::vector<const Type*> TypeList;
typedef std::map<const Type*,std::string> TypeMap;
@@ -92,8 +104,6 @@ namespace {
uint64_t uniqueNum;
TypeMap TypeNames;
ValueMap ValueNames;
- TypeMap UnresolvedTypes;
- TypeList TypeStack;
NameSet UsedNames;
TypeSet DefinedTypes;
ValueSet DefinedValues;
@@ -140,8 +150,7 @@ namespace {
inline void printCppName(const Value* val);
void printAttributes(const AttrListPtr &PAL, const std::string &name);
- bool printTypeInternal(const Type* Ty);
- inline void printType(const Type* Ty);
+ void printType(const Type* Ty);
void printTypes(const Module* M);
void printConstant(const Constant *CPV);
@@ -188,26 +197,11 @@ static std::string getTypePrefix(const Type *Ty) {
case Type::ArrayTyID: return "array_";
case Type::PointerTyID: return "ptr_";
case Type::VectorTyID: return "packed_";
- case Type::OpaqueTyID: return "opaque_";
default: return "other_";
}
return "unknown_";
}
-// Looks up the type in the symbol table and returns a pointer to its name or
-// a null pointer if it wasn't found. Note that this isn't the same as the
-// Mode::getTypeName function which will return an empty string, not a null
-// pointer if the name is not found.
-static const std::string *
-findTypeName(const TypeSymbolTable& ST, const Type* Ty) {
- TypeSymbolTable::const_iterator TI = ST.begin();
- TypeSymbolTable::const_iterator TE = ST.end();
- for (;TI != TE; ++TI)
- if (TI->second == Ty)
- return &(TI->first);
- return 0;
-}
-
void CppWriter::error(const std::string& msg) {
report_fatal_error(msg);
}
@@ -379,18 +373,20 @@ std::string CppWriter::getCppName(const Type* Ty) {
case Type::StructTyID: prefix = "StructTy_"; break;
case Type::ArrayTyID: prefix = "ArrayTy_"; break;
case Type::PointerTyID: prefix = "PointerTy_"; break;
- case Type::OpaqueTyID: prefix = "OpaqueTy_"; break;
case Type::VectorTyID: prefix = "VectorTy_"; break;
default: prefix = "OtherTy_"; break; // prevent breakage
}
// See if the type has a name in the symboltable and build accordingly
- const std::string* tName = findTypeName(TheModule->getTypeSymbolTable(), Ty);
std::string name;
- if (tName)
- name = std::string(prefix) + *tName;
- else
- name = std::string(prefix) + utostr(uniqueNum++);
+ if (const StructType *STy = dyn_cast<StructType>(Ty))
+ if (STy->hasName())
+ name = STy->getName();
+
+ if (name.empty())
+ name = utostr(uniqueNum++);
+
+ name = std::string(prefix) + name;
sanitize(name);
// Save the name
@@ -503,65 +499,38 @@ void CppWriter::printAttributes(const AttrListPtr &PAL,
}
}
-bool CppWriter::printTypeInternal(const Type* Ty) {
+void CppWriter::printType(const Type* Ty) {
// We don't print definitions for primitive types
if (Ty->isPrimitiveType() || Ty->isIntegerTy())
- return false;
+ return;
// If we already defined this type, we don't need to define it again.
if (DefinedTypes.find(Ty) != DefinedTypes.end())
- return false;
+ return;
// Everything below needs the name for the type so get it now.
std::string typeName(getCppName(Ty));
- // Search the type stack for recursion. If we find it, then generate this
- // as an OpaqueType, but make sure not to do this multiple times because
- // the type could appear in multiple places on the stack. Once the opaque
- // definition is issued, it must not be re-issued. Consequently we have to
- // check the UnresolvedTypes list as well.
- TypeList::const_iterator TI = std::find(TypeStack.begin(), TypeStack.end(),
- Ty);
- if (TI != TypeStack.end()) {
- TypeMap::const_iterator I = UnresolvedTypes.find(Ty);
- if (I == UnresolvedTypes.end()) {
- Out << "PATypeHolder " << typeName;
- Out << "_fwd = OpaqueType::get(mod->getContext());";
- nl(Out);
- UnresolvedTypes[Ty] = typeName;
- }
- return true;
- }
-
- // We're going to print a derived type which, by definition, contains other
- // types. So, push this one we're printing onto the type stack to assist with
- // recursive definitions.
- TypeStack.push_back(Ty);
-
// Print the type definition
switch (Ty->getTypeID()) {
case Type::FunctionTyID: {
const FunctionType* FT = cast<FunctionType>(Ty);
- Out << "std::vector<const Type*>" << typeName << "_args;";
+ Out << "std::vector<Type*>" << typeName << "_args;";
nl(Out);
FunctionType::param_iterator PI = FT->param_begin();
FunctionType::param_iterator PE = FT->param_end();
for (; PI != PE; ++PI) {
const Type* argTy = static_cast<const Type*>(*PI);
- bool isForward = printTypeInternal(argTy);
+ printType(argTy);
std::string argName(getCppName(argTy));
Out << typeName << "_args.push_back(" << argName;
- if (isForward)
- Out << "_fwd";
Out << ");";
nl(Out);
}
- bool isForward = printTypeInternal(FT->getReturnType());
+ printType(FT->getReturnType());
std::string retTypeName(getCppName(FT->getReturnType()));
Out << "FunctionType* " << typeName << " = FunctionType::get(";
in(); nl(Out) << "/*Result=*/" << retTypeName;
- if (isForward)
- Out << "_fwd";
Out << ",";
nl(Out) << "/*Params=*/" << typeName << "_args,";
nl(Out) << "/*isVarArg=*/" << (FT->isVarArg() ? "true" : "false") << ");";
@@ -571,23 +540,37 @@ bool CppWriter::printTypeInternal(const Type* Ty) {
}
case Type::StructTyID: {
const StructType* ST = cast<StructType>(Ty);
- Out << "std::vector<const Type*>" << typeName << "_fields;";
+ if (!ST->isAnonymous()) {
+ Out << "StructType *" << typeName << " = ";
+ Out << "StructType::createNamed(mod->getContext(), \"";
+ printEscapedString(ST->getName());
+ Out << "\");";
+ nl(Out);
+ // Indicate that this type is now defined.
+ DefinedTypes.insert(Ty);
+ }
+
+ Out << "std::vector<Type*>" << typeName << "_fields;";
nl(Out);
StructType::element_iterator EI = ST->element_begin();
StructType::element_iterator EE = ST->element_end();
for (; EI != EE; ++EI) {
const Type* fieldTy = static_cast<const Type*>(*EI);
- bool isForward = printTypeInternal(fieldTy);
+ printType(fieldTy);
std::string fieldName(getCppName(fieldTy));
Out << typeName << "_fields.push_back(" << fieldName;
- if (isForward)
- Out << "_fwd";
Out << ");";
nl(Out);
}
- Out << "StructType* " << typeName << " = StructType::get("
- << "mod->getContext(), "
- << typeName << "_fields, /*isPacked=*/"
+
+ if (ST->isAnonymous()) {
+ Out << "StructType *" << typeName << " = ";
+ Out << "StructType::get(" << "mod->getContext(), ";
+ } else {
+ Out << typeName << "->setBody(";
+ }
+
+ Out << typeName << "_fields, /*isPacked=*/"
<< (ST->isPacked() ? "true" : "false") << ");";
nl(Out);
break;
@@ -595,122 +578,55 @@ bool CppWriter::printTypeInternal(const Type* Ty) {
case Type::ArrayTyID: {
const ArrayType* AT = cast<ArrayType>(Ty);
const Type* ET = AT->getElementType();
- bool isForward = printTypeInternal(ET);
- std::string elemName(getCppName(ET));
- Out << "ArrayType* " << typeName << " = ArrayType::get("
- << elemName << (isForward ? "_fwd" : "")
- << ", " << utostr(AT->getNumElements()) << ");";
- nl(Out);
+ printType(ET);
+ if (DefinedTypes.find(Ty) == DefinedTypes.end()) {
+ std::string elemName(getCppName(ET));
+ Out << "ArrayType* " << typeName << " = ArrayType::get("
+ << elemName
+ << ", " << utostr(AT->getNumElements()) << ");";
+ nl(Out);
+ }
break;
}
case Type::PointerTyID: {
const PointerType* PT = cast<PointerType>(Ty);
const Type* ET = PT->getElementType();
- bool isForward = printTypeInternal(ET);
- std::string elemName(getCppName(ET));
- Out << "PointerType* " << typeName << " = PointerType::get("
- << elemName << (isForward ? "_fwd" : "")
- << ", " << utostr(PT->getAddressSpace()) << ");";
- nl(Out);
+ printType(ET);
+ if (DefinedTypes.find(Ty) == DefinedTypes.end()) {
+ std::string elemName(getCppName(ET));
+ Out << "PointerType* " << typeName << " = PointerType::get("
+ << elemName
+ << ", " << utostr(PT->getAddressSpace()) << ");";
+ nl(Out);
+ }
break;
}
case Type::VectorTyID: {
const VectorType* PT = cast<VectorType>(Ty);
const Type* ET = PT->getElementType();
- bool isForward = printTypeInternal(ET);
- std::string elemName(getCppName(ET));
- Out << "VectorType* " << typeName << " = VectorType::get("
- << elemName << (isForward ? "_fwd" : "")
- << ", " << utostr(PT->getNumElements()) << ");";
- nl(Out);
- break;
- }
- case Type::OpaqueTyID: {
- Out << "OpaqueType* " << typeName;
- Out << " = OpaqueType::get(mod->getContext());";
- nl(Out);
+ printType(ET);
+ if (DefinedTypes.find(Ty) == DefinedTypes.end()) {
+ std::string elemName(getCppName(ET));
+ Out << "VectorType* " << typeName << " = VectorType::get("
+ << elemName
+ << ", " << utostr(PT->getNumElements()) << ");";
+ nl(Out);
+ }
break;
}
default:
error("Invalid TypeID");
}
- // If the type had a name, make sure we recreate it.
- const std::string* progTypeName =
- findTypeName(TheModule->getTypeSymbolTable(),Ty);
- if (progTypeName) {
- Out << "mod->addTypeName(\"" << *progTypeName << "\", "
- << typeName << ");";
- nl(Out);
- }
-
- // Pop us off the type stack
- TypeStack.pop_back();
-
// Indicate that this type is now defined.
DefinedTypes.insert(Ty);
- // Early resolve as many unresolved types as possible. Search the unresolved
- // types map for the type we just printed. Now that its definition is complete
- // we can resolve any previous references to it. This prevents a cascade of
- // unresolved types.
- TypeMap::iterator I = UnresolvedTypes.find(Ty);
- if (I != UnresolvedTypes.end()) {
- Out << "cast<OpaqueType>(" << I->second
- << "_fwd.get())->refineAbstractTypeTo(" << I->second << ");";
- nl(Out);
- Out << I->second << " = cast<";
- switch (Ty->getTypeID()) {
- case Type::FunctionTyID: Out << "FunctionType"; break;
- case Type::ArrayTyID: Out << "ArrayType"; break;
- case Type::StructTyID: Out << "StructType"; break;
- case Type::VectorTyID: Out << "VectorType"; break;
- case Type::PointerTyID: Out << "PointerType"; break;
- case Type::OpaqueTyID: Out << "OpaqueType"; break;
- default: Out << "NoSuchDerivedType"; break;
- }
- Out << ">(" << I->second << "_fwd.get());";
- nl(Out); nl(Out);
- UnresolvedTypes.erase(I);
- }
-
// Finally, separate the type definition from other with a newline.
nl(Out);
-
- // We weren't a recursive type
- return false;
-}
-
-// Prints a type definition. Returns true if it could not resolve all the
-// types in the definition but had to use a forward reference.
-void CppWriter::printType(const Type* Ty) {
- assert(TypeStack.empty());
- TypeStack.clear();
- printTypeInternal(Ty);
- assert(TypeStack.empty());
}
void CppWriter::printTypes(const Module* M) {
- // Walk the symbol table and print out all its types
- const TypeSymbolTable& symtab = M->getTypeSymbolTable();
- for (TypeSymbolTable::const_iterator TI = symtab.begin(), TE = symtab.end();
- TI != TE; ++TI) {
-
- // For primitive types and types already defined, just add a name
- TypeMap::const_iterator TNI = TypeNames.find(TI->second);
- if (TI->second->isIntegerTy() || TI->second->isPrimitiveType() ||
- TNI != TypeNames.end()) {
- Out << "mod->addTypeName(\"";
- printEscapedString(TI->first);
- Out << "\", " << getCppName(TI->second) << ");";
- nl(Out);
- // For everything else, define the type
- } else {
- printType(TI->second);
- }
- }
-
- // Add all of the global variables to the value table...
+ // Add all of the global variables to the value table.
for (Module::const_global_iterator I = TheModule->global_begin(),
E = TheModule->global_end(); I != E; ++I) {
if (I->hasInitializer())
@@ -989,12 +905,12 @@ void CppWriter::printVariableUses(const GlobalVariable *GV) {
nl(Out);
printType(GV->getType());
if (GV->hasInitializer()) {
- Constant *Init = GV->getInitializer();
+ const Constant *Init = GV->getInitializer();
printType(Init->getType());
- if (Function *F = dyn_cast<Function>(Init)) {
+ if (const Function *F = dyn_cast<Function>(Init)) {
nl(Out)<< "/ Function Declarations"; nl(Out);
printFunctionHead(F);
- } else if (GlobalVariable* gv = dyn_cast<GlobalVariable>(Init)) {
+ } else if (const GlobalVariable* gv = dyn_cast<GlobalVariable>(Init)) {
nl(Out) << "// Global Variable Declarations"; nl(Out);
printVariableHead(gv);
@@ -1353,9 +1269,10 @@ void CppWriter::printInstruction(const Instruction *I,
printEscapedString(phi->getName());
Out << "\", " << bbname << ");";
nl(Out);
- for (unsigned i = 0; i < phi->getNumOperands(); i+=2) {
+ for (unsigned i = 0; i < phi->getNumIncomingValues(); ++i) {
Out << iName << "->addIncoming("
- << opNames[i] << ", " << opNames[i+1] << ");";
+ << opNames[PHINode::getOperandNumForIncomingValue(i)] << ", "
+ << getOpName(phi->getIncomingBlock(i)) << ");";
nl(Out);
}
break;
@@ -1954,8 +1871,8 @@ void CppWriter::printVariable(const std::string& fname,
Out << "}\n";
}
-void CppWriter::printType(const std::string& fname,
- const std::string& typeName) {
+void CppWriter::printType(const std::string &fname,
+ const std::string &typeName) {
const Type* Ty = TheModule->getTypeByName(typeName);
if (!Ty) {
error(std::string("Type '") + typeName + "' not found in input module");
diff --git a/contrib/llvm/lib/Target/CppBackend/CPPTargetMachine.h b/contrib/llvm/lib/Target/CppBackend/CPPTargetMachine.h
index e42166e..7322e3e 100644
--- a/contrib/llvm/lib/Target/CppBackend/CPPTargetMachine.h
+++ b/contrib/llvm/lib/Target/CppBackend/CPPTargetMachine.h
@@ -23,8 +23,8 @@ class formatted_raw_ostream;
struct CPPTargetMachine : public TargetMachine {
CPPTargetMachine(const Target &T, const std::string &TT,
- const std::string &FS)
- : TargetMachine(T) {}
+ const std::string &CPU, const std::string &FS)
+ : TargetMachine(T, TT, CPU, FS) {}
virtual bool addPassesToEmitFile(PassManagerBase &PM,
formatted_raw_ostream &Out,
diff --git a/contrib/llvm/lib/Target/MBlaze/AsmParser/MBlazeAsmLexer.cpp b/contrib/llvm/lib/Target/MBlaze/AsmParser/MBlazeAsmLexer.cpp
index 1903796..1596596 100644
--- a/contrib/llvm/lib/Target/MBlaze/AsmParser/MBlazeAsmLexer.cpp
+++ b/contrib/llvm/lib/Target/MBlaze/AsmParser/MBlazeAsmLexer.cpp
@@ -86,8 +86,9 @@ namespace {
: MBlazeBaseAsmLexer(T, MAI) {
std::string tripleString("mblaze-unknown-unknown");
std::string featureString;
+ std::string CPU;
OwningPtr<const TargetMachine>
- targetMachine(T.createTargetMachine(tripleString, featureString));
+ targetMachine(T.createTargetMachine(tripleString, CPU, featureString));
InitRegisterMap(targetMachine->getRegisterInfo());
}
};
diff --git a/contrib/llvm/lib/Target/MBlaze/AsmParser/MBlazeAsmParser.cpp b/contrib/llvm/lib/Target/MBlaze/AsmParser/MBlazeAsmParser.cpp
index 524f33d..eebd9d8 100644
--- a/contrib/llvm/lib/Target/MBlaze/AsmParser/MBlazeAsmParser.cpp
+++ b/contrib/llvm/lib/Target/MBlaze/AsmParser/MBlazeAsmParser.cpp
@@ -32,7 +32,6 @@ struct MBlazeOperand;
class MBlazeAsmParser : public TargetAsmParser {
MCAsmParser &Parser;
- TargetMachine &TM;
MCAsmParser &getParser() const { return Parser; }
MCAsmLexer &getLexer() const { return Parser.getLexer(); }
@@ -64,8 +63,8 @@ class MBlazeAsmParser : public TargetAsmParser {
public:
- MBlazeAsmParser(const Target &T, MCAsmParser &_Parser, TargetMachine &_TM)
- : TargetAsmParser(T), Parser(_Parser), TM(_TM) {}
+ MBlazeAsmParser(MCSubtargetInfo &_STI, MCAsmParser &_Parser)
+ : TargetAsmParser(), Parser(_Parser) {}
virtual bool ParseInstruction(StringRef Name, SMLoc NameLoc,
SmallVectorImpl<MCParsedAsmOperand*> &Operands);
@@ -220,7 +219,7 @@ public:
return StringRef(Tok.Data, Tok.Length);
}
- virtual void dump(raw_ostream &OS) const;
+ virtual void print(raw_ostream &OS) const;
static MBlazeOperand *CreateToken(StringRef Str, SMLoc S) {
MBlazeOperand *Op = new MBlazeOperand(Token);
@@ -280,7 +279,7 @@ public:
} // end anonymous namespace.
-void MBlazeOperand::dump(raw_ostream &OS) const {
+void MBlazeOperand::print(raw_ostream &OS) const {
switch (Kind) {
case Immediate:
getImm()->print(OS);
diff --git a/contrib/llvm/lib/Target/MBlaze/Disassembler/MBlazeDisassembler.cpp b/contrib/llvm/lib/Target/MBlaze/Disassembler/MBlazeDisassembler.cpp
index 060a87b..88d80a1 100644
--- a/contrib/llvm/lib/Target/MBlaze/Disassembler/MBlazeDisassembler.cpp
+++ b/contrib/llvm/lib/Target/MBlaze/Disassembler/MBlazeDisassembler.cpp
@@ -27,9 +27,12 @@
// #include "MBlazeGenDecoderTables.inc"
// #include "MBlazeGenRegisterNames.inc"
-#include "MBlazeGenInstrInfo.inc"
#include "MBlazeGenEDInfo.inc"
+namespace llvm {
+extern MCInstrDesc MBlazeInsts[];
+}
+
using namespace llvm;
const unsigned UNSUPPORTED = -1;
diff --git a/contrib/llvm/lib/Target/MBlaze/InstPrinter/MBlazeInstPrinter.h b/contrib/llvm/lib/Target/MBlaze/InstPrinter/MBlazeInstPrinter.h
index 13c4b49..eacca41 100644
--- a/contrib/llvm/lib/Target/MBlaze/InstPrinter/MBlazeInstPrinter.h
+++ b/contrib/llvm/lib/Target/MBlaze/InstPrinter/MBlazeInstPrinter.h
@@ -18,11 +18,10 @@
namespace llvm {
class MCOperand;
- class TargetMachine;
class MBlazeInstPrinter : public MCInstPrinter {
public:
- MBlazeInstPrinter(TargetMachine &TM, const MCAsmInfo &MAI)
+ MBlazeInstPrinter(const MCAsmInfo &MAI)
: MCInstPrinter(MAI) {}
virtual void printInst(const MCInst *MI, raw_ostream &O);
diff --git a/contrib/llvm/lib/Target/MBlaze/MBlaze.h b/contrib/llvm/lib/Target/MBlaze/MBlaze.h
index 00c73f0..3390794 100644
--- a/contrib/llvm/lib/Target/MBlaze/MBlaze.h
+++ b/contrib/llvm/lib/Target/MBlaze/MBlaze.h
@@ -15,6 +15,7 @@
#ifndef TARGET_MBLAZE_H
#define TARGET_MBLAZE_H
+#include "MCTargetDesc/MBlazeMCTargetDesc.h"
#include "llvm/Target/TargetMachine.h"
namespace llvm {
@@ -22,26 +23,20 @@ namespace llvm {
class FunctionPass;
class MachineCodeEmitter;
class MCCodeEmitter;
+ class MCInstrInfo;
+ class MCSubtargetInfo;
class TargetAsmBackend;
class formatted_raw_ostream;
- MCCodeEmitter *createMBlazeMCCodeEmitter(const Target &,
- TargetMachine &TM,
+ MCCodeEmitter *createMBlazeMCCodeEmitter(const MCInstrInfo &MCII,
+ const MCSubtargetInfo &STI,
MCContext &Ctx);
-
+
TargetAsmBackend *createMBlazeAsmBackend(const Target &, const std::string &);
FunctionPass *createMBlazeISelDag(MBlazeTargetMachine &TM);
FunctionPass *createMBlazeDelaySlotFillerPass(MBlazeTargetMachine &TM);
- extern Target TheMBlazeTarget;
} // end namespace llvm;
-// Defines symbolic names for MBlaze registers. This defines a mapping from
-// register name to register number.
-#include "MBlazeGenRegisterNames.inc"
-
-// Defines symbolic names for the MBlaze instructions.
-#include "MBlazeGenInstrNames.inc"
-
#endif
diff --git a/contrib/llvm/lib/Target/MBlaze/MBlazeAsmPrinter.cpp b/contrib/llvm/lib/Target/MBlaze/MBlazeAsmPrinter.cpp
index 0f0f60e..0016df5 100644
--- a/contrib/llvm/lib/Target/MBlaze/MBlazeAsmPrinter.cpp
+++ b/contrib/llvm/lib/Target/MBlaze/MBlazeAsmPrinter.cpp
@@ -319,11 +319,10 @@ isBlockOnlyReachableByFallthrough(const MachineBasicBlock *MBB) const {
}
static MCInstPrinter *createMBlazeMCInstPrinter(const Target &T,
- TargetMachine &TM,
unsigned SyntaxVariant,
const MCAsmInfo &MAI) {
if (SyntaxVariant == 0)
- return new MBlazeInstPrinter(TM, MAI);
+ return new MBlazeInstPrinter(MAI);
return 0;
}
diff --git a/contrib/llvm/lib/Target/MBlaze/MBlazeDelaySlotFiller.cpp b/contrib/llvm/lib/Target/MBlaze/MBlazeDelaySlotFiller.cpp
index 973e968..c07570a 100644
--- a/contrib/llvm/lib/Target/MBlaze/MBlazeDelaySlotFiller.cpp
+++ b/contrib/llvm/lib/Target/MBlaze/MBlazeDelaySlotFiller.cpp
@@ -109,7 +109,7 @@ static bool delayHasHazard(MachineBasicBlock::iterator &candidate,
// Hazard check
MachineBasicBlock::iterator a = candidate;
MachineBasicBlock::iterator b = slot;
- TargetInstrDesc desc = candidate->getDesc();
+ MCInstrDesc desc = candidate->getDesc();
// MBB layout:-
// candidate := a0 = operation(a1, a2)
@@ -183,7 +183,7 @@ static bool isDelayFiller(MachineBasicBlock &MBB,
if (candidate == MBB.begin())
return false;
- TargetInstrDesc brdesc = (--candidate)->getDesc();
+ MCInstrDesc brdesc = (--candidate)->getDesc();
return (brdesc.hasDelaySlot());
}
@@ -211,7 +211,7 @@ findDelayInstr(MachineBasicBlock &MBB,MachineBasicBlock::iterator slot) {
break;
--I;
- TargetInstrDesc desc = I->getDesc();
+ MCInstrDesc desc = I->getDesc();
if (desc.hasDelaySlot() || desc.isBranch() || isDelayFiller(MBB,I) ||
desc.isCall() || desc.isReturn() || desc.isBarrier() ||
hasUnknownSideEffects(I))
diff --git a/contrib/llvm/lib/Target/MBlaze/MBlazeISelLowering.cpp b/contrib/llvm/lib/Target/MBlaze/MBlazeISelLowering.cpp
index c5e0a89..62dfdcc 100644
--- a/contrib/llvm/lib/Target/MBlaze/MBlazeISelLowering.cpp
+++ b/contrib/llvm/lib/Target/MBlaze/MBlazeISelLowering.cpp
@@ -69,6 +69,7 @@ MBlazeTargetLowering::MBlazeTargetLowering(MBlazeTargetMachine &TM)
// Floating point operations which are not supported
setOperationAction(ISD::FREM, MVT::f32, Expand);
+ setOperationAction(ISD::FMA, MVT::f32, Expand);
setOperationAction(ISD::UINT_TO_FP, MVT::i8, Expand);
setOperationAction(ISD::UINT_TO_FP, MVT::i16, Expand);
setOperationAction(ISD::UINT_TO_FP, MVT::i32, Expand);
@@ -1114,15 +1115,19 @@ MBlazeTargetLowering::getSingleConstraintMatchWeight(
return weight;
}
-/// getRegClassForInlineAsmConstraint - Given a constraint letter (e.g. "r"),
-/// return a list of registers that can be used to satisfy the constraint.
-/// This should only be used for C_RegisterClass constraints.
+/// Given a register class constraint, like 'r', if this corresponds directly
+/// to an LLVM register class, return a register of 0 and the register class
+/// pointer.
std::pair<unsigned, const TargetRegisterClass*> MBlazeTargetLowering::
getRegForInlineAsmConstraint(const std::string &Constraint, EVT VT) const {
if (Constraint.size() == 1) {
switch (Constraint[0]) {
case 'r':
return std::make_pair(0U, MBlaze::GPRRegisterClass);
+ // TODO: These can't possibly be right, but match what was in
+ // getRegClassForInlineAsmConstraint.
+ case 'd':
+ case 'y':
case 'f':
if (VT == MVT::f32)
return std::make_pair(0U, MBlaze::GPRRegisterClass);
@@ -1131,32 +1136,6 @@ getRegForInlineAsmConstraint(const std::string &Constraint, EVT VT) const {
return TargetLowering::getRegForInlineAsmConstraint(Constraint, VT);
}
-/// Given a register class constraint, like 'r', if this corresponds directly
-/// to an LLVM register class, return a register of 0 and the register class
-/// pointer.
-std::vector<unsigned> MBlazeTargetLowering::
-getRegClassForInlineAsmConstraint(const std::string &Constraint, EVT VT) const {
- if (Constraint.size() != 1)
- return std::vector<unsigned>();
-
- switch (Constraint[0]) {
- default : break;
- case 'r':
- // GCC MBlaze Constraint Letters
- case 'd':
- case 'y':
- case 'f':
- return make_vector<unsigned>(
- MBlaze::R3, MBlaze::R4, MBlaze::R5, MBlaze::R6,
- MBlaze::R7, MBlaze::R9, MBlaze::R10, MBlaze::R11,
- MBlaze::R12, MBlaze::R19, MBlaze::R20, MBlaze::R21,
- MBlaze::R22, MBlaze::R23, MBlaze::R24, MBlaze::R25,
- MBlaze::R26, MBlaze::R27, MBlaze::R28, MBlaze::R29,
- MBlaze::R30, MBlaze::R31, 0);
- }
- return std::vector<unsigned>();
-}
-
bool MBlazeTargetLowering::
isOffsetFoldingLegal(const GlobalAddressSDNode *GA) const {
// The MBlaze target isn't yet aware of offsets.
diff --git a/contrib/llvm/lib/Target/MBlaze/MBlazeISelLowering.h b/contrib/llvm/lib/Target/MBlaze/MBlazeISelLowering.h
index 265c1a7..bb128da 100644
--- a/contrib/llvm/lib/Target/MBlaze/MBlazeISelLowering.h
+++ b/contrib/llvm/lib/Target/MBlaze/MBlazeISelLowering.h
@@ -173,10 +173,6 @@ namespace llvm {
getRegForInlineAsmConstraint(const std::string &Constraint,
EVT VT) const;
- std::vector<unsigned>
- getRegClassForInlineAsmConstraint(const std::string &Constraint,
- EVT VT) const;
-
virtual bool isOffsetFoldingLegal(const GlobalAddressSDNode *GA) const;
/// isFPImmLegal - Returns true if the target can instruction select the
diff --git a/contrib/llvm/lib/Target/MBlaze/MBlazeInstrInfo.cpp b/contrib/llvm/lib/Target/MBlaze/MBlazeInstrInfo.cpp
index 794ebed..188f10a 100644
--- a/contrib/llvm/lib/Target/MBlaze/MBlazeInstrInfo.cpp
+++ b/contrib/llvm/lib/Target/MBlaze/MBlazeInstrInfo.cpp
@@ -14,18 +14,21 @@
#include "MBlazeInstrInfo.h"
#include "MBlazeTargetMachine.h"
#include "MBlazeMachineFunction.h"
-#include "llvm/ADT/STLExtras.h"
#include "llvm/CodeGen/MachineInstrBuilder.h"
#include "llvm/CodeGen/MachineRegisterInfo.h"
#include "llvm/CodeGen/ScoreboardHazardRecognizer.h"
+#include "llvm/Target/TargetRegistry.h"
#include "llvm/Support/CommandLine.h"
#include "llvm/Support/ErrorHandling.h"
+#include "llvm/ADT/STLExtras.h"
+
+#define GET_INSTRINFO_CTOR
#include "MBlazeGenInstrInfo.inc"
using namespace llvm;
MBlazeInstrInfo::MBlazeInstrInfo(MBlazeTargetMachine &tm)
- : TargetInstrInfoImpl(MBlazeInsts, array_lengthof(MBlazeInsts)),
+ : MBlazeGenInstrInfo(MBlaze::ADJCALLSTACKDOWN, MBlaze::ADJCALLSTACKUP),
TM(tm), RI(*TM.getSubtargetImpl(), *this) {}
static bool isZeroImm(const MachineOperand &op) {
diff --git a/contrib/llvm/lib/Target/MBlaze/MBlazeInstrInfo.h b/contrib/llvm/lib/Target/MBlaze/MBlazeInstrInfo.h
index b717da8..79f962b 100644
--- a/contrib/llvm/lib/Target/MBlaze/MBlazeInstrInfo.h
+++ b/contrib/llvm/lib/Target/MBlaze/MBlazeInstrInfo.h
@@ -19,6 +19,9 @@
#include "llvm/Target/TargetInstrInfo.h"
#include "MBlazeRegisterInfo.h"
+#define GET_INSTRINFO_HEADER
+#include "MBlazeGenInstrInfo.inc"
+
namespace llvm {
namespace MBlaze {
@@ -219,7 +222,7 @@ namespace MBlazeII {
};
}
-class MBlazeInstrInfo : public TargetInstrInfoImpl {
+class MBlazeInstrInfo : public MBlazeGenInstrInfo {
MBlazeTargetMachine &TM;
const MBlazeRegisterInfo RI;
public:
diff --git a/contrib/llvm/lib/Target/MBlaze/MBlazeIntrinsicInfo.cpp b/contrib/llvm/lib/Target/MBlaze/MBlazeIntrinsicInfo.cpp
index 7e4a2f5..32d67b2 100644
--- a/contrib/llvm/lib/Target/MBlaze/MBlazeIntrinsicInfo.cpp
+++ b/contrib/llvm/lib/Target/MBlaze/MBlazeIntrinsicInfo.cpp
@@ -92,7 +92,7 @@ bool MBlazeIntrinsicInfo::isOverloaded(unsigned IntrID) const {
static const FunctionType *getType(LLVMContext &Context, unsigned id) {
const Type *ResultTy = NULL;
- std::vector<const Type*> ArgTys;
+ std::vector<Type*> ArgTys;
bool IsVarArg = false;
#define GET_INTRINSIC_GENERATOR
diff --git a/contrib/llvm/lib/Target/MBlaze/MBlazeMCCodeEmitter.cpp b/contrib/llvm/lib/Target/MBlaze/MBlazeMCCodeEmitter.cpp
index 3ece1a8..ddc636d 100644
--- a/contrib/llvm/lib/Target/MBlaze/MBlazeMCCodeEmitter.cpp
+++ b/contrib/llvm/lib/Target/MBlaze/MBlazeMCCodeEmitter.cpp
@@ -29,13 +29,12 @@ namespace {
class MBlazeMCCodeEmitter : public MCCodeEmitter {
MBlazeMCCodeEmitter(const MBlazeMCCodeEmitter &); // DO NOT IMPLEMENT
void operator=(const MBlazeMCCodeEmitter &); // DO NOT IMPLEMENT
- const TargetMachine &TM;
- const TargetInstrInfo &TII;
- MCContext &Ctx;
+ const MCInstrInfo &MCII;
public:
- MBlazeMCCodeEmitter(TargetMachine &tm, MCContext &ctx)
- : TM(tm), TII(*TM.getInstrInfo()), Ctx(ctx) {
+ MBlazeMCCodeEmitter(const MCInstrInfo &mcii, const MCSubtargetInfo &sti,
+ MCContext &ctx)
+ : MCII(mcii) {
}
~MBlazeMCCodeEmitter() {}
@@ -96,10 +95,10 @@ public:
} // end anonymous namespace
-MCCodeEmitter *llvm::createMBlazeMCCodeEmitter(const Target &,
- TargetMachine &TM,
+MCCodeEmitter *llvm::createMBlazeMCCodeEmitter(const MCInstrInfo &MCII,
+ const MCSubtargetInfo &STI,
MCContext &Ctx) {
- return new MBlazeMCCodeEmitter(TM, Ctx);
+ return new MBlazeMCCodeEmitter(MCII, STI, Ctx);
}
/// getMachineOpValue - Return binary encoding of operand. If the machine
@@ -179,7 +178,7 @@ void MBlazeMCCodeEmitter::
EncodeInstruction(const MCInst &MI, raw_ostream &OS,
SmallVectorImpl<MCFixup> &Fixups) const {
unsigned Opcode = MI.getOpcode();
- const TargetInstrDesc &Desc = TII.get(Opcode);
+ const MCInstrDesc &Desc = MCII.get(Opcode);
uint64_t TSFlags = Desc.TSFlags;
// Keep track of the current byte being emitted.
unsigned CurByte = 0;
diff --git a/contrib/llvm/lib/Target/MBlaze/MBlazeRegisterInfo.cpp b/contrib/llvm/lib/Target/MBlaze/MBlazeRegisterInfo.cpp
index 517279f..f0b201a 100644
--- a/contrib/llvm/lib/Target/MBlaze/MBlazeRegisterInfo.cpp
+++ b/contrib/llvm/lib/Target/MBlaze/MBlazeRegisterInfo.cpp
@@ -37,12 +37,14 @@
#include "llvm/ADT/BitVector.h"
#include "llvm/ADT/STLExtras.h"
+#define GET_REGINFO_TARGET_DESC
+#include "MBlazeGenRegisterInfo.inc"
+
using namespace llvm;
MBlazeRegisterInfo::
MBlazeRegisterInfo(const MBlazeSubtarget &ST, const TargetInstrInfo &tii)
- : MBlazeGenRegisterInfo(MBlaze::ADJCALLSTACKDOWN, MBlaze::ADJCALLSTACKUP),
- Subtarget(ST), TII(tii) {}
+ : MBlazeGenRegisterInfo(), Subtarget(ST), TII(tii) {}
/// getRegisterNumbering - Given the enum value for some register, e.g.
/// MBlaze::R0, return the number that it corresponds to (e.g. 0).
@@ -359,6 +361,3 @@ int MBlazeRegisterInfo::getDwarfRegNum(unsigned RegNo, bool isEH) const {
int MBlazeRegisterInfo::getLLVMRegNum(unsigned DwarfRegNo, bool isEH) const {
return MBlazeGenRegisterInfo::getLLVMRegNumFull(DwarfRegNo,0);
}
-
-#include "MBlazeGenRegisterInfo.inc"
-
diff --git a/contrib/llvm/lib/Target/MBlaze/MBlazeRegisterInfo.h b/contrib/llvm/lib/Target/MBlaze/MBlazeRegisterInfo.h
index 3807839..7ebce21 100644
--- a/contrib/llvm/lib/Target/MBlaze/MBlazeRegisterInfo.h
+++ b/contrib/llvm/lib/Target/MBlaze/MBlazeRegisterInfo.h
@@ -17,7 +17,9 @@
#include "MBlaze.h"
#include "llvm/Target/TargetRegisterInfo.h"
-#include "MBlazeGenRegisterInfo.h.inc"
+
+#define GET_REGINFO_HEADER
+#include "MBlazeGenRegisterInfo.inc"
namespace llvm {
class MBlazeSubtarget;
diff --git a/contrib/llvm/lib/Target/MBlaze/MBlazeRegisterInfo.td b/contrib/llvm/lib/Target/MBlaze/MBlazeRegisterInfo.td
index bd396ed..13c46ba 100644
--- a/contrib/llvm/lib/Target/MBlaze/MBlazeRegisterInfo.td
+++ b/contrib/llvm/lib/Target/MBlaze/MBlazeRegisterInfo.td
@@ -109,32 +109,9 @@ let Namespace = "MBlaze" in {
// Register Classes
//===----------------------------------------------------------------------===//
-def GPR : RegisterClass<"MBlaze", [i32,f32], 32,
- [
- // Return Values and Arguments
- R3, R4, R5, R6, R7, R8, R9, R10,
+def GPR : RegisterClass<"MBlaze", [i32,f32], 32, (sequence "R%u", 0, 31)>;
- // Not preserved across procedure calls
- R11, R12,
-
- // Callee save
- R20, R21, R22, R23, R24, R25, R26, R27, R28, R29, R30, R31,
-
- // Reserved
- R0, // Always zero
- R1, // The stack pointer
- R2, // Read-only small data area anchor
- R13, // Read-write small data area anchor
- R14, // Return address for interrupts
- R15, // Return address for sub-routines
- R16, // Return address for trap
- R17, // Return address for exceptions
- R18, // Reserved for assembler
- R19 // The frame-pointer
- ]>;
-
-def SPR : RegisterClass<"MBlaze", [i32], 32,
- [
+def SPR : RegisterClass<"MBlaze", [i32], 32, (add
// Reserved
RPC,
RMSR,
@@ -160,12 +137,12 @@ def SPR : RegisterClass<"MBlaze", [i32], 32,
RPVR9,
RPVR10,
RPVR11
- ]>
+ )>
{
// None of the special purpose registers are allocatable.
let isAllocatable = 0;
}
-def CRC : RegisterClass<"MBlaze", [i32], 32, [CARRY]> {
+def CRC : RegisterClass<"MBlaze", [i32], 32, (add CARRY)> {
let CopyCost = -1;
}
diff --git a/contrib/llvm/lib/Target/MBlaze/MBlazeSubtarget.cpp b/contrib/llvm/lib/Target/MBlaze/MBlazeSubtarget.cpp
index a80744a..eda141d 100644
--- a/contrib/llvm/lib/Target/MBlaze/MBlazeSubtarget.cpp
+++ b/contrib/llvm/lib/Target/MBlaze/MBlazeSubtarget.cpp
@@ -7,29 +7,42 @@
//
//===----------------------------------------------------------------------===//
//
-// This file implements the MBlaze specific subclass of TargetSubtarget.
+// This file implements the MBlaze specific subclass of TargetSubtargetInfo.
//
//===----------------------------------------------------------------------===//
#include "MBlazeSubtarget.h"
#include "MBlaze.h"
#include "MBlazeRegisterInfo.h"
-#include "MBlazeGenSubtarget.inc"
#include "llvm/Support/CommandLine.h"
+#include "llvm/Target/TargetRegistry.h"
+
+#define GET_SUBTARGETINFO_TARGET_DESC
+#define GET_SUBTARGETINFO_CTOR
+#include "MBlazeGenSubtargetInfo.inc"
+
using namespace llvm;
-MBlazeSubtarget::MBlazeSubtarget(const std::string &TT, const std::string &FS):
+MBlazeSubtarget::MBlazeSubtarget(const std::string &TT,
+ const std::string &CPU,
+ const std::string &FS):
+ MBlazeGenSubtargetInfo(TT, CPU, FS),
HasBarrel(false), HasDiv(false), HasMul(false), HasPatCmp(false),
HasFPU(false), HasMul64(false), HasSqrt(false)
{
// Parse features string.
- std::string CPU = "mblaze";
- CPU = ParseSubtargetFeatures(FS, CPU);
+ std::string CPUName = CPU;
+ if (CPUName.empty())
+ CPUName = "mblaze";
+ ParseSubtargetFeatures(CPUName, FS);
// Only use instruction scheduling if the selected CPU has an instruction
// itinerary (the default CPU is the only one that doesn't).
- HasItin = CPU != "mblaze";
- DEBUG(dbgs() << "CPU " << CPU << "(" << HasItin << ")\n");
+ HasItin = CPUName != "mblaze";
+ DEBUG(dbgs() << "CPU " << CPUName << "(" << HasItin << ")\n");
+
+ // Initialize scheduling itinerary for the specified CPU.
+ InstrItins = getInstrItineraryForCPU(CPUName);
// Compute the issue width of the MBlaze itineraries
computeIssueWidth();
@@ -41,11 +54,10 @@ void MBlazeSubtarget::computeIssueWidth() {
bool MBlazeSubtarget::
enablePostRAScheduler(CodeGenOpt::Level OptLevel,
- TargetSubtarget::AntiDepBreakMode& Mode,
+ TargetSubtargetInfo::AntiDepBreakMode& Mode,
RegClassVector& CriticalPathRCs) const {
- Mode = TargetSubtarget::ANTIDEP_CRITICAL;
+ Mode = TargetSubtargetInfo::ANTIDEP_CRITICAL;
CriticalPathRCs.clear();
CriticalPathRCs.push_back(&MBlaze::GPRRegClass);
return HasItin && OptLevel >= CodeGenOpt::Default;
}
-
diff --git a/contrib/llvm/lib/Target/MBlaze/MBlazeSubtarget.h b/contrib/llvm/lib/Target/MBlaze/MBlazeSubtarget.h
index 2255b28..43b0197 100644
--- a/contrib/llvm/lib/Target/MBlaze/MBlazeSubtarget.h
+++ b/contrib/llvm/lib/Target/MBlaze/MBlazeSubtarget.h
@@ -7,21 +7,24 @@
//
//===----------------------------------------------------------------------===//
//
-// This file declares the MBlaze specific subclass of TargetSubtarget.
+// This file declares the MBlaze specific subclass of TargetSubtargetInfo.
//
//===----------------------------------------------------------------------===//
#ifndef MBLAZESUBTARGET_H
#define MBLAZESUBTARGET_H
-#include "llvm/Target/TargetSubtarget.h"
-#include "llvm/Target/TargetMachine.h"
-
+#include "llvm/Target/TargetSubtargetInfo.h"
+#include "llvm/MC/MCInstrItineraries.h"
#include <string>
+#define GET_SUBTARGETINFO_HEADER
+#include "MBlazeGenSubtargetInfo.inc"
+
namespace llvm {
+class StringRef;
-class MBlazeSubtarget : public TargetSubtarget {
+class MBlazeSubtarget : public MBlazeGenSubtargetInfo {
protected:
bool HasBarrel;
@@ -39,12 +42,12 @@ public:
/// This constructor initializes the data members to match that
/// of the specified triple.
- MBlazeSubtarget(const std::string &TT, const std::string &FS);
+ MBlazeSubtarget(const std::string &TT, const std::string &CPU,
+ const std::string &FS);
/// ParseSubtargetFeatures - Parses features string setting specified
/// subtarget options. Definition of function is auto generated by tblgen.
- std::string ParseSubtargetFeatures(const std::string &FS,
- const std::string &CPU);
+ void ParseSubtargetFeatures(StringRef CPU, StringRef FS);
/// Compute the number of maximum number of issues per cycle for the
/// MBlaze scheduling itineraries.
@@ -52,7 +55,7 @@ public:
/// enablePostRAScheduler - True at 'More' optimization.
bool enablePostRAScheduler(CodeGenOpt::Level OptLevel,
- TargetSubtarget::AntiDepBreakMode& Mode,
+ TargetSubtargetInfo::AntiDepBreakMode& Mode,
RegClassVector& CriticalPathRCs) const;
/// getInstrItins - Return the instruction itineraies based on subtarget.
diff --git a/contrib/llvm/lib/Target/MBlaze/MBlazeTargetMachine.cpp b/contrib/llvm/lib/Target/MBlaze/MBlazeTargetMachine.cpp
index df34a83..7208874 100644
--- a/contrib/llvm/lib/Target/MBlaze/MBlazeTargetMachine.cpp
+++ b/contrib/llvm/lib/Target/MBlaze/MBlazeTargetMachine.cpp
@@ -12,7 +12,6 @@
//===----------------------------------------------------------------------===//
#include "MBlaze.h"
-#include "MBlazeMCAsmInfo.h"
#include "MBlazeTargetMachine.h"
#include "llvm/PassManager.h"
#include "llvm/CodeGen/Passes.h"
@@ -21,14 +20,6 @@
#include "llvm/Target/TargetRegistry.h"
using namespace llvm;
-static MCAsmInfo *createMCAsmInfo(const Target &T, StringRef TT) {
- Triple TheTriple(TT);
- switch (TheTriple.getOS()) {
- default:
- return new MBlazeMCAsmInfo();
- }
-}
-
static MCStreamer *createMCStreamer(const Target &T, const std::string &TT,
MCContext &Ctx, TargetAsmBackend &TAB,
raw_ostream &_OS,
@@ -55,9 +46,6 @@ extern "C" void LLVMInitializeMBlazeTarget() {
// Register the target.
RegisterTargetMachine<MBlazeTargetMachine> X(TheMBlazeTarget);
- // Register the target asm info.
- RegisterAsmInfoFn A(TheMBlazeTarget, createMCAsmInfo);
-
// Register the MC code emitter
TargetRegistry::RegisterCodeEmitter(TheMBlazeTarget,
llvm::createMBlazeMCCodeEmitter);
@@ -80,9 +68,9 @@ extern "C" void LLVMInitializeMBlazeTarget() {
// an easier handling.
MBlazeTargetMachine::
MBlazeTargetMachine(const Target &T, const std::string &TT,
- const std::string &FS):
- LLVMTargetMachine(T, TT),
- Subtarget(TT, FS),
+ const std::string &CPU, const std::string &FS):
+ LLVMTargetMachine(T, TT, CPU, FS),
+ Subtarget(TT, CPU, FS),
DataLayout("E-p:32:32:32-i8:8:8-i16:16:16"),
InstrInfo(*this),
FrameLowering(Subtarget),
diff --git a/contrib/llvm/lib/Target/MBlaze/MBlazeTargetMachine.h b/contrib/llvm/lib/Target/MBlaze/MBlazeTargetMachine.h
index 48ce37a..cd6caaf 100644
--- a/contrib/llvm/lib/Target/MBlaze/MBlazeTargetMachine.h
+++ b/contrib/llvm/lib/Target/MBlaze/MBlazeTargetMachine.h
@@ -42,7 +42,7 @@ namespace llvm {
public:
MBlazeTargetMachine(const Target &T, const std::string &TT,
- const std::string &FS);
+ const std::string &CPU, const std::string &FS);
virtual const MBlazeInstrInfo *getInstrInfo() const
{ return &InstrInfo; }
diff --git a/contrib/llvm/lib/Target/MBlaze/MCTargetDesc/CMakeLists.txt b/contrib/llvm/lib/Target/MBlaze/MCTargetDesc/CMakeLists.txt
new file mode 100644
index 0000000..3d15708
--- /dev/null
+++ b/contrib/llvm/lib/Target/MBlaze/MCTargetDesc/CMakeLists.txt
@@ -0,0 +1,4 @@
+add_llvm_library(LLVMMBlazeDesc
+ MBlazeMCTargetDesc.cpp
+ MBlazeMCAsmInfo.cpp
+ )
diff --git a/contrib/llvm/lib/Target/MBlaze/MBlazeMCAsmInfo.cpp b/contrib/llvm/lib/Target/MBlaze/MCTargetDesc/MBlazeMCAsmInfo.cpp
index 1467141..0d88466 100644
--- a/contrib/llvm/lib/Target/MBlaze/MBlazeMCAsmInfo.cpp
+++ b/contrib/llvm/lib/Target/MBlaze/MCTargetDesc/MBlazeMCAsmInfo.cpp
@@ -15,6 +15,8 @@
using namespace llvm;
MBlazeMCAsmInfo::MBlazeMCAsmInfo() {
+ IsLittleEndian = false;
+ StackGrowsUp = false;
SupportsDebugInformation = true;
AlignmentIsInBytes = false;
PrivateGlobalPrefix = "$";
diff --git a/contrib/llvm/lib/Target/MBlaze/MBlazeMCAsmInfo.h b/contrib/llvm/lib/Target/MBlaze/MCTargetDesc/MBlazeMCAsmInfo.h
index e68dd58..e68dd58 100644
--- a/contrib/llvm/lib/Target/MBlaze/MBlazeMCAsmInfo.h
+++ b/contrib/llvm/lib/Target/MBlaze/MCTargetDesc/MBlazeMCAsmInfo.h
diff --git a/contrib/llvm/lib/Target/MBlaze/MCTargetDesc/MBlazeMCTargetDesc.cpp b/contrib/llvm/lib/Target/MBlaze/MCTargetDesc/MBlazeMCTargetDesc.cpp
new file mode 100644
index 0000000..20d6c0b
--- /dev/null
+++ b/contrib/llvm/lib/Target/MBlaze/MCTargetDesc/MBlazeMCTargetDesc.cpp
@@ -0,0 +1,65 @@
+//===-- MBlazeMCTargetDesc.cpp - MBlaze Target Descriptions -----*- C++ -*-===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+//
+// This file provides MBlaze specific target descriptions.
+//
+//===----------------------------------------------------------------------===//
+
+#include "MBlazeMCTargetDesc.h"
+#include "MBlazeMCAsmInfo.h"
+#include "llvm/MC/MCInstrInfo.h"
+#include "llvm/MC/MCRegisterInfo.h"
+#include "llvm/MC/MCSubtargetInfo.h"
+#include "llvm/Target/TargetRegistry.h"
+
+#define GET_INSTRINFO_MC_DESC
+#include "MBlazeGenInstrInfo.inc"
+
+#define GET_SUBTARGETINFO_MC_DESC
+#include "MBlazeGenSubtargetInfo.inc"
+
+#define GET_REGINFO_MC_DESC
+#include "MBlazeGenRegisterInfo.inc"
+
+using namespace llvm;
+
+
+static MCInstrInfo *createMBlazeMCInstrInfo() {
+ MCInstrInfo *X = new MCInstrInfo();
+ InitMBlazeMCInstrInfo(X);
+ return X;
+}
+
+extern "C" void LLVMInitializeMBlazeMCInstrInfo() {
+ TargetRegistry::RegisterMCInstrInfo(TheMBlazeTarget, createMBlazeMCInstrInfo);
+}
+
+static MCSubtargetInfo *createMBlazeMCSubtargetInfo(StringRef TT, StringRef CPU,
+ StringRef FS) {
+ MCSubtargetInfo *X = new MCSubtargetInfo();
+ InitMBlazeMCSubtargetInfo(X, TT, CPU, FS);
+ return X;
+}
+
+extern "C" void LLVMInitializeMBlazeMCSubtargetInfo() {
+ TargetRegistry::RegisterMCSubtargetInfo(TheMBlazeTarget,
+ createMBlazeMCSubtargetInfo);
+}
+
+static MCAsmInfo *createMCAsmInfo(const Target &T, StringRef TT) {
+ Triple TheTriple(TT);
+ switch (TheTriple.getOS()) {
+ default:
+ return new MBlazeMCAsmInfo();
+ }
+}
+
+extern "C" void LLVMInitializeMBlazeMCAsmInfo() {
+ RegisterMCAsmInfoFn X(TheMBlazeTarget, createMCAsmInfo);
+}
diff --git a/contrib/llvm/lib/Target/MBlaze/MCTargetDesc/MBlazeMCTargetDesc.h b/contrib/llvm/lib/Target/MBlaze/MCTargetDesc/MBlazeMCTargetDesc.h
new file mode 100644
index 0000000..b14772e
--- /dev/null
+++ b/contrib/llvm/lib/Target/MBlaze/MCTargetDesc/MBlazeMCTargetDesc.h
@@ -0,0 +1,38 @@
+//===-- MBlazeMCTargetDesc.h - MBlaze Target Descriptions -------*- C++ -*-===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+//
+// This file provides MBlaze specific target descriptions.
+//
+//===----------------------------------------------------------------------===//
+
+#ifndef MBLAZEMCTARGETDESC_H
+#define MBLAZEMCTARGETDESC_H
+
+namespace llvm {
+class MCSubtargetInfo;
+class Target;
+class StringRef;
+
+extern Target TheMBlazeTarget;
+
+} // End llvm namespace
+
+// Defines symbolic names for MBlaze registers. This defines a mapping from
+// register name to register number.
+#define GET_REGINFO_ENUM
+#include "MBlazeGenRegisterInfo.inc"
+
+// Defines symbolic names for the MBlaze instructions.
+#define GET_INSTRINFO_ENUM
+#include "MBlazeGenInstrInfo.inc"
+
+#define GET_SUBTARGETINFO_ENUM
+#include "MBlazeGenSubtargetInfo.inc"
+
+#endif
diff --git a/contrib/llvm/lib/Target/MBlaze/MCTargetDesc/Makefile b/contrib/llvm/lib/Target/MBlaze/MCTargetDesc/Makefile
new file mode 100644
index 0000000..71075ff
--- /dev/null
+++ b/contrib/llvm/lib/Target/MBlaze/MCTargetDesc/Makefile
@@ -0,0 +1,16 @@
+##===- lib/Target/MBlaze/TargetDesc/Makefile ---------------*- Makefile -*-===##
+#
+# The LLVM Compiler Infrastructure
+#
+# This file is distributed under the University of Illinois Open Source
+# License. See LICENSE.TXT for details.
+#
+##===----------------------------------------------------------------------===##
+
+LEVEL = ../../../..
+LIBRARYNAME = LLVMMBlazeDesc
+
+# Hack: we need to include 'main' target directory to grab private headers
+CPP.Flags += -I$(PROJ_OBJ_DIR)/.. -I$(PROJ_SRC_DIR)/..
+
+include $(LEVEL)/Makefile.common
diff --git a/contrib/llvm/lib/Target/MSP430/InstPrinter/MSP430InstPrinter.h b/contrib/llvm/lib/Target/MSP430/InstPrinter/MSP430InstPrinter.h
index 63860dc..50d98b7 100644
--- a/contrib/llvm/lib/Target/MSP430/InstPrinter/MSP430InstPrinter.h
+++ b/contrib/llvm/lib/Target/MSP430/InstPrinter/MSP430InstPrinter.h
@@ -18,11 +18,10 @@
namespace llvm {
class MCOperand;
- class TargetMachine;
class MSP430InstPrinter : public MCInstPrinter {
public:
- MSP430InstPrinter(TargetMachine &TM, const MCAsmInfo &MAI)
+ MSP430InstPrinter(const MCAsmInfo &MAI)
: MCInstPrinter(MAI) {}
virtual void printInst(const MCInst *MI, raw_ostream &O);
diff --git a/contrib/llvm/lib/Target/MSP430/MCTargetDesc/CMakeLists.txt b/contrib/llvm/lib/Target/MSP430/MCTargetDesc/CMakeLists.txt
new file mode 100644
index 0000000..0f3ebd3
--- /dev/null
+++ b/contrib/llvm/lib/Target/MSP430/MCTargetDesc/CMakeLists.txt
@@ -0,0 +1,4 @@
+add_llvm_library(LLVMMSP430Desc
+ MSP430MCTargetDesc.cpp
+ MSP430MCAsmInfo.cpp
+ )
diff --git a/contrib/llvm/lib/Target/MSP430/MSP430MCAsmInfo.cpp b/contrib/llvm/lib/Target/MSP430/MCTargetDesc/MSP430MCAsmInfo.cpp
index 3f44944..ad7d380 100644
--- a/contrib/llvm/lib/Target/MSP430/MSP430MCAsmInfo.cpp
+++ b/contrib/llvm/lib/Target/MSP430/MCTargetDesc/MSP430MCAsmInfo.cpp
@@ -15,6 +15,8 @@
using namespace llvm;
MSP430MCAsmInfo::MSP430MCAsmInfo(const Target &T, StringRef TT) {
+ PointerSize = 2;
+
PrivateGlobalPrefix = ".L";
WeakRefDirective ="\t.weak\t";
PCSymbol=".";
diff --git a/contrib/llvm/lib/Target/MSP430/MSP430MCAsmInfo.h b/contrib/llvm/lib/Target/MSP430/MCTargetDesc/MSP430MCAsmInfo.h
index f3138a2..f3138a2 100644
--- a/contrib/llvm/lib/Target/MSP430/MSP430MCAsmInfo.h
+++ b/contrib/llvm/lib/Target/MSP430/MCTargetDesc/MSP430MCAsmInfo.h
diff --git a/contrib/llvm/lib/Target/MSP430/MCTargetDesc/MSP430MCTargetDesc.cpp b/contrib/llvm/lib/Target/MSP430/MCTargetDesc/MSP430MCTargetDesc.cpp
new file mode 100644
index 0000000..43a704d
--- /dev/null
+++ b/contrib/llvm/lib/Target/MSP430/MCTargetDesc/MSP430MCTargetDesc.cpp
@@ -0,0 +1,58 @@
+//===-- MSP430MCTargetDesc.cpp - MSP430 Target Descriptions -----*- C++ -*-===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+//
+// This file provides MSP430 specific target descriptions.
+//
+//===----------------------------------------------------------------------===//
+
+#include "MSP430MCTargetDesc.h"
+#include "MSP430MCAsmInfo.h"
+#include "llvm/MC/MCInstrInfo.h"
+#include "llvm/MC/MCRegisterInfo.h"
+#include "llvm/MC/MCSubtargetInfo.h"
+#include "llvm/Target/TargetRegistry.h"
+
+#define GET_INSTRINFO_MC_DESC
+#include "MSP430GenInstrInfo.inc"
+
+#define GET_SUBTARGETINFO_MC_DESC
+#include "MSP430GenSubtargetInfo.inc"
+
+#define GET_REGINFO_MC_DESC
+#include "MSP430GenRegisterInfo.inc"
+
+using namespace llvm;
+
+
+static MCInstrInfo *createMSP430MCInstrInfo() {
+ MCInstrInfo *X = new MCInstrInfo();
+ InitMSP430MCInstrInfo(X);
+ return X;
+}
+
+extern "C" void LLVMInitializeMSP430MCInstrInfo() {
+ TargetRegistry::RegisterMCInstrInfo(TheMSP430Target, createMSP430MCInstrInfo);
+}
+
+
+static MCSubtargetInfo *createMSP430MCSubtargetInfo(StringRef TT, StringRef CPU,
+ StringRef FS) {
+ MCSubtargetInfo *X = new MCSubtargetInfo();
+ InitMSP430MCSubtargetInfo(X, TT, CPU, FS);
+ return X;
+}
+
+extern "C" void LLVMInitializeMSP430MCSubtargetInfo() {
+ TargetRegistry::RegisterMCSubtargetInfo(TheMSP430Target,
+ createMSP430MCSubtargetInfo);
+}
+
+extern "C" void LLVMInitializeMSP430MCAsmInfo() {
+ RegisterMCAsmInfo<MSP430MCAsmInfo> X(TheMSP430Target);
+}
diff --git a/contrib/llvm/lib/Target/MSP430/MCTargetDesc/MSP430MCTargetDesc.h b/contrib/llvm/lib/Target/MSP430/MCTargetDesc/MSP430MCTargetDesc.h
new file mode 100644
index 0000000..0d8a6bd
--- /dev/null
+++ b/contrib/llvm/lib/Target/MSP430/MCTargetDesc/MSP430MCTargetDesc.h
@@ -0,0 +1,38 @@
+//===-- MSP430MCTargetDesc.h - MSP430 Target Descriptions -------*- C++ -*-===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+//
+// This file provides MSP430 specific target descriptions.
+//
+//===----------------------------------------------------------------------===//
+
+#ifndef ALPHAMCTARGETDESC_H
+#define ALPHAMCTARGETDESC_H
+
+namespace llvm {
+class MCSubtargetInfo;
+class Target;
+class StringRef;
+
+extern Target TheMSP430Target;
+
+} // End llvm namespace
+
+// Defines symbolic names for MSP430 registers.
+// This defines a mapping from register name to register number.
+#define GET_REGINFO_ENUM
+#include "MSP430GenRegisterInfo.inc"
+
+// Defines symbolic names for the MSP430 instructions.
+#define GET_INSTRINFO_ENUM
+#include "MSP430GenInstrInfo.inc"
+
+#define GET_SUBTARGETINFO_ENUM
+#include "MSP430GenSubtargetInfo.inc"
+
+#endif
diff --git a/contrib/llvm/lib/Target/MSP430/MCTargetDesc/Makefile b/contrib/llvm/lib/Target/MSP430/MCTargetDesc/Makefile
new file mode 100644
index 0000000..bb85799
--- /dev/null
+++ b/contrib/llvm/lib/Target/MSP430/MCTargetDesc/Makefile
@@ -0,0 +1,16 @@
+##===- lib/Target/MSP430/TargetDesc/Makefile ---------------*- Makefile -*-===##
+#
+# The LLVM Compiler Infrastructure
+#
+# This file is distributed under the University of Illinois Open Source
+# License. See LICENSE.TXT for details.
+#
+##===----------------------------------------------------------------------===##
+
+LEVEL = ../../../..
+LIBRARYNAME = LLVMMSP430Desc
+
+# Hack: we need to include 'main' target directory to grab private headers
+CPP.Flags += -I$(PROJ_OBJ_DIR)/.. -I$(PROJ_SRC_DIR)/..
+
+include $(LEVEL)/Makefile.common
diff --git a/contrib/llvm/lib/Target/MSP430/MSP430.h b/contrib/llvm/lib/Target/MSP430/MSP430.h
index e742118..4574ce5 100644
--- a/contrib/llvm/lib/Target/MSP430/MSP430.h
+++ b/contrib/llvm/lib/Target/MSP430/MSP430.h
@@ -15,6 +15,7 @@
#ifndef LLVM_TARGET_MSP430_H
#define LLVM_TARGET_MSP430_H
+#include "MCTargetDesc/MSP430MCTargetDesc.h"
#include "llvm/Target/TargetMachine.h"
namespace MSP430CC {
@@ -41,15 +42,6 @@ namespace llvm {
FunctionPass *createMSP430BranchSelectionPass();
- extern Target TheMSP430Target;
-
} // end namespace llvm;
-// Defines symbolic names for MSP430 registers.
-// This defines a mapping from register name to register number.
-#include "MSP430GenRegisterNames.inc"
-
-// Defines symbolic names for the MSP430 instructions.
-#include "MSP430GenInstrNames.inc"
-
#endif
diff --git a/contrib/llvm/lib/Target/MSP430/MSP430AsmPrinter.cpp b/contrib/llvm/lib/Target/MSP430/MSP430AsmPrinter.cpp
index 5264d68..2042056 100644
--- a/contrib/llvm/lib/Target/MSP430/MSP430AsmPrinter.cpp
+++ b/contrib/llvm/lib/Target/MSP430/MSP430AsmPrinter.cpp
@@ -15,7 +15,6 @@
#define DEBUG_TYPE "asm-printer"
#include "MSP430.h"
#include "MSP430InstrInfo.h"
-#include "MSP430MCAsmInfo.h"
#include "MSP430MCInstLower.h"
#include "MSP430TargetMachine.h"
#include "InstPrinter/MSP430InstPrinter.h"
@@ -28,6 +27,7 @@
#include "llvm/CodeGen/MachineFunctionPass.h"
#include "llvm/CodeGen/MachineConstantPool.h"
#include "llvm/CodeGen/MachineInstr.h"
+#include "llvm/MC/MCAsmInfo.h"
#include "llvm/MC/MCInst.h"
#include "llvm/MC/MCStreamer.h"
#include "llvm/MC/MCSymbol.h"
@@ -164,11 +164,10 @@ void MSP430AsmPrinter::EmitInstruction(const MachineInstr *MI) {
}
static MCInstPrinter *createMSP430MCInstPrinter(const Target &T,
- TargetMachine &TM,
unsigned SyntaxVariant,
const MCAsmInfo &MAI) {
if (SyntaxVariant == 0)
- return new MSP430InstPrinter(TM, MAI);
+ return new MSP430InstPrinter(MAI);
return 0;
}
diff --git a/contrib/llvm/lib/Target/MSP430/MSP430InstrInfo.cpp b/contrib/llvm/lib/Target/MSP430/MSP430InstrInfo.cpp
index 424df13..846d093 100644
--- a/contrib/llvm/lib/Target/MSP430/MSP430InstrInfo.cpp
+++ b/contrib/llvm/lib/Target/MSP430/MSP430InstrInfo.cpp
@@ -15,18 +15,21 @@
#include "MSP430InstrInfo.h"
#include "MSP430MachineFunctionInfo.h"
#include "MSP430TargetMachine.h"
-#include "MSP430GenInstrInfo.inc"
#include "llvm/Function.h"
#include "llvm/CodeGen/MachineFrameInfo.h"
#include "llvm/CodeGen/MachineInstrBuilder.h"
#include "llvm/CodeGen/MachineRegisterInfo.h"
#include "llvm/CodeGen/PseudoSourceValue.h"
+#include "llvm/Target/TargetRegistry.h"
#include "llvm/Support/ErrorHandling.h"
+#define GET_INSTRINFO_CTOR
+#include "MSP430GenInstrInfo.inc"
+
using namespace llvm;
MSP430InstrInfo::MSP430InstrInfo(MSP430TargetMachine &tm)
- : TargetInstrInfoImpl(MSP430Insts, array_lengthof(MSP430Insts)),
+ : MSP430GenInstrInfo(MSP430::ADJCALLSTACKDOWN, MSP430::ADJCALLSTACKUP),
RI(tm, *this), TM(tm) {}
void MSP430InstrInfo::storeRegToStackSlot(MachineBasicBlock &MBB,
@@ -158,13 +161,13 @@ ReverseBranchCondition(SmallVectorImpl<MachineOperand> &Cond) const {
}
bool MSP430InstrInfo::isUnpredicatedTerminator(const MachineInstr *MI) const {
- const TargetInstrDesc &TID = MI->getDesc();
- if (!TID.isTerminator()) return false;
+ const MCInstrDesc &MCID = MI->getDesc();
+ if (!MCID.isTerminator()) return false;
// Conditional branch is a special case.
- if (TID.isBranch() && !TID.isBarrier())
+ if (MCID.isBranch() && !MCID.isBarrier())
return true;
- if (!TID.isPredicable())
+ if (!MCID.isPredicable())
return true;
return !isPredicated(MI);
}
@@ -293,7 +296,7 @@ MSP430InstrInfo::InsertBranch(MachineBasicBlock &MBB, MachineBasicBlock *TBB,
/// instruction may be. This returns the maximum number of bytes.
///
unsigned MSP430InstrInfo::GetInstSizeInBytes(const MachineInstr *MI) const {
- const TargetInstrDesc &Desc = MI->getDesc();
+ const MCInstrDesc &Desc = MI->getDesc();
switch (Desc.TSFlags & MSP430II::SizeMask) {
default:
diff --git a/contrib/llvm/lib/Target/MSP430/MSP430InstrInfo.h b/contrib/llvm/lib/Target/MSP430/MSP430InstrInfo.h
index e885cd3..90013f5 100644
--- a/contrib/llvm/lib/Target/MSP430/MSP430InstrInfo.h
+++ b/contrib/llvm/lib/Target/MSP430/MSP430InstrInfo.h
@@ -17,6 +17,9 @@
#include "llvm/Target/TargetInstrInfo.h"
#include "MSP430RegisterInfo.h"
+#define GET_INSTRINFO_HEADER
+#include "MSP430GenInstrInfo.inc"
+
namespace llvm {
class MSP430TargetMachine;
@@ -37,7 +40,7 @@ namespace MSP430II {
};
}
-class MSP430InstrInfo : public TargetInstrInfoImpl {
+class MSP430InstrInfo : public MSP430GenInstrInfo {
const MSP430RegisterInfo RI;
MSP430TargetMachine &TM;
public:
diff --git a/contrib/llvm/lib/Target/MSP430/MSP430RegisterInfo.cpp b/contrib/llvm/lib/Target/MSP430/MSP430RegisterInfo.cpp
index 53f4c2e..1cc60bb 100644
--- a/contrib/llvm/lib/Target/MSP430/MSP430RegisterInfo.cpp
+++ b/contrib/llvm/lib/Target/MSP430/MSP430RegisterInfo.cpp
@@ -26,13 +26,15 @@
#include "llvm/ADT/BitVector.h"
#include "llvm/Support/ErrorHandling.h"
+#define GET_REGINFO_TARGET_DESC
+#include "MSP430GenRegisterInfo.inc"
+
using namespace llvm;
// FIXME: Provide proper call frame setup / destroy opcodes.
MSP430RegisterInfo::MSP430RegisterInfo(MSP430TargetMachine &tm,
const TargetInstrInfo &tii)
- : MSP430GenRegisterInfo(MSP430::ADJCALLSTACKDOWN, MSP430::ADJCALLSTACKUP),
- TM(tm), TII(tii) {
+ : MSP430GenRegisterInfo(), TM(tm), TII(tii) {
StackAlign = TM.getFrameLowering()->getStackAlignment();
}
@@ -117,12 +119,12 @@ eliminateCallFramePseudoInstr(MachineFunction &MF, MachineBasicBlock &MBB,
Amount = (Amount+StackAlign-1)/StackAlign*StackAlign;
MachineInstr *New = 0;
- if (Old->getOpcode() == getCallFrameSetupOpcode()) {
+ if (Old->getOpcode() == TII.getCallFrameSetupOpcode()) {
New = BuildMI(MF, Old->getDebugLoc(),
TII.get(MSP430::SUB16ri), MSP430::SPW)
.addReg(MSP430::SPW).addImm(Amount);
} else {
- assert(Old->getOpcode() == getCallFrameDestroyOpcode());
+ assert(Old->getOpcode() == TII.getCallFrameDestroyOpcode());
// factor out the amount the callee already popped.
uint64_t CalleeAmt = Old->getOperand(1).getImm();
Amount -= CalleeAmt;
@@ -140,7 +142,7 @@ eliminateCallFramePseudoInstr(MachineFunction &MF, MachineBasicBlock &MBB,
MBB.insert(I, New);
}
}
- } else if (I->getOpcode() == getCallFrameDestroyOpcode()) {
+ } else if (I->getOpcode() == TII.getCallFrameDestroyOpcode()) {
// If we are performing frame pointer elimination and if the callee pops
// something off the stack pointer, add it back.
if (uint64_t CalleeAmt = I->getOperand(1).getImm()) {
@@ -250,5 +252,3 @@ int MSP430RegisterInfo::getLLVMRegNum(unsigned RegNum, bool isEH) const {
llvm_unreachable("Not implemented yet!");
return 0;
}
-
-#include "MSP430GenRegisterInfo.inc"
diff --git a/contrib/llvm/lib/Target/MSP430/MSP430RegisterInfo.h b/contrib/llvm/lib/Target/MSP430/MSP430RegisterInfo.h
index e820558..fb70594 100644
--- a/contrib/llvm/lib/Target/MSP430/MSP430RegisterInfo.h
+++ b/contrib/llvm/lib/Target/MSP430/MSP430RegisterInfo.h
@@ -15,7 +15,9 @@
#define LLVM_TARGET_MSP430REGISTERINFO_H
#include "llvm/Target/TargetRegisterInfo.h"
-#include "MSP430GenRegisterInfo.h.inc"
+
+#define GET_REGINFO_HEADER
+#include "MSP430GenRegisterInfo.inc"
namespace llvm {
diff --git a/contrib/llvm/lib/Target/MSP430/MSP430RegisterInfo.td b/contrib/llvm/lib/Target/MSP430/MSP430RegisterInfo.td
index 3ef6ab2..d1c2e3f 100644
--- a/contrib/llvm/lib/Target/MSP430/MSP430RegisterInfo.td
+++ b/contrib/llvm/lib/Target/MSP430/MSP430RegisterInfo.td
@@ -66,19 +66,19 @@ def R15W : MSP430RegWithSubregs<15, "r15", [R15B]>;
def GR8 : RegisterClass<"MSP430", [i8], 8,
// Volatile registers
- [R12B, R13B, R14B, R15B, R11B, R10B, R9B, R8B, R7B, R6B, R5B,
+ (add R12B, R13B, R14B, R15B, R11B, R10B, R9B, R8B, R7B, R6B, R5B,
// Frame pointer, sometimes allocable
FPB,
// Volatile, but not allocable
- PCB, SPB, SRB, CGB]>;
+ PCB, SPB, SRB, CGB)>;
def GR16 : RegisterClass<"MSP430", [i16], 16,
// Volatile registers
- [R12W, R13W, R14W, R15W, R11W, R10W, R9W, R8W, R7W, R6W, R5W,
+ (add R12W, R13W, R14W, R15W, R11W, R10W, R9W, R8W, R7W, R6W, R5W,
// Frame pointer, sometimes allocable
FPW,
// Volatile, but not allocable
- PCW, SPW, SRW, CGW]>
+ PCW, SPW, SRW, CGW)>
{
let SubRegClasses = [(GR8 subreg_8bit)];
}
diff --git a/contrib/llvm/lib/Target/MSP430/MSP430Subtarget.cpp b/contrib/llvm/lib/Target/MSP430/MSP430Subtarget.cpp
index 1346cb9..b58c50a 100644
--- a/contrib/llvm/lib/Target/MSP430/MSP430Subtarget.cpp
+++ b/contrib/llvm/lib/Target/MSP430/MSP430Subtarget.cpp
@@ -7,19 +7,26 @@
//
//===----------------------------------------------------------------------===//
//
-// This file implements the MSP430 specific subclass of TargetSubtarget.
+// This file implements the MSP430 specific subclass of TargetSubtargetInfo.
//
//===----------------------------------------------------------------------===//
#include "MSP430Subtarget.h"
#include "MSP430.h"
-#include "MSP430GenSubtarget.inc"
+#include "llvm/Target/TargetRegistry.h"
+
+#define GET_SUBTARGETINFO_TARGET_DESC
+#define GET_SUBTARGETINFO_CTOR
+#include "MSP430GenSubtargetInfo.inc"
using namespace llvm;
-MSP430Subtarget::MSP430Subtarget(const std::string &TT, const std::string &FS) {
- std::string CPU = "generic";
+MSP430Subtarget::MSP430Subtarget(const std::string &TT,
+ const std::string &CPU,
+ const std::string &FS) :
+ MSP430GenSubtargetInfo(TT, CPU, FS) {
+ std::string CPUName = "generic";
// Parse features string.
- ParseSubtargetFeatures(FS, CPU);
+ ParseSubtargetFeatures(CPUName, FS);
}
diff --git a/contrib/llvm/lib/Target/MSP430/MSP430Subtarget.h b/contrib/llvm/lib/Target/MSP430/MSP430Subtarget.h
index 1070544..1ce5f11 100644
--- a/contrib/llvm/lib/Target/MSP430/MSP430Subtarget.h
+++ b/contrib/llvm/lib/Target/MSP430/MSP430Subtarget.h
@@ -7,31 +7,35 @@
//
//===----------------------------------------------------------------------===//
//
-// This file declares the MSP430 specific subclass of TargetSubtarget.
+// This file declares the MSP430 specific subclass of TargetSubtargetInfo.
//
//===----------------------------------------------------------------------===//
#ifndef LLVM_TARGET_MSP430_SUBTARGET_H
#define LLVM_TARGET_MSP430_SUBTARGET_H
-#include "llvm/Target/TargetSubtarget.h"
+#include "llvm/Target/TargetSubtargetInfo.h"
+
+#define GET_SUBTARGETINFO_HEADER
+#include "MSP430GenSubtargetInfo.inc"
#include <string>
namespace llvm {
+class StringRef;
-class MSP430Subtarget : public TargetSubtarget {
+class MSP430Subtarget : public MSP430GenSubtargetInfo {
bool ExtendedInsts;
public:
/// This constructor initializes the data members to match that
/// of the specified triple.
///
- MSP430Subtarget(const std::string &TT, const std::string &FS);
+ MSP430Subtarget(const std::string &TT, const std::string &CPU,
+ const std::string &FS);
/// ParseSubtargetFeatures - Parses features string setting specified
/// subtarget options. Definition of function is auto generated by tblgen.
- std::string ParseSubtargetFeatures(const std::string &FS,
- const std::string &CPU);
+ void ParseSubtargetFeatures(StringRef CPU, StringRef FS);
};
} // End llvm namespace
diff --git a/contrib/llvm/lib/Target/MSP430/MSP430TargetMachine.cpp b/contrib/llvm/lib/Target/MSP430/MSP430TargetMachine.cpp
index fba9536..971f512 100644
--- a/contrib/llvm/lib/Target/MSP430/MSP430TargetMachine.cpp
+++ b/contrib/llvm/lib/Target/MSP430/MSP430TargetMachine.cpp
@@ -12,7 +12,6 @@
//===----------------------------------------------------------------------===//
#include "MSP430.h"
-#include "MSP430MCAsmInfo.h"
#include "MSP430TargetMachine.h"
#include "llvm/PassManager.h"
#include "llvm/CodeGen/Passes.h"
@@ -23,14 +22,14 @@ using namespace llvm;
extern "C" void LLVMInitializeMSP430Target() {
// Register the target.
RegisterTargetMachine<MSP430TargetMachine> X(TheMSP430Target);
- RegisterAsmInfo<MSP430MCAsmInfo> Z(TheMSP430Target);
}
MSP430TargetMachine::MSP430TargetMachine(const Target &T,
const std::string &TT,
+ const std::string &CPU,
const std::string &FS)
- : LLVMTargetMachine(T, TT),
- Subtarget(TT, FS),
+ : LLVMTargetMachine(T, TT, CPU, FS),
+ Subtarget(TT, CPU, FS),
// FIXME: Check TargetData string.
DataLayout("e-p:16:16:16-i8:8:8-i16:16:16-i32:16:32-n8:16"),
InstrInfo(*this), TLInfo(*this), TSInfo(*this),
diff --git a/contrib/llvm/lib/Target/MSP430/MSP430TargetMachine.h b/contrib/llvm/lib/Target/MSP430/MSP430TargetMachine.h
index cee3b04..2a9eea0 100644
--- a/contrib/llvm/lib/Target/MSP430/MSP430TargetMachine.h
+++ b/contrib/llvm/lib/Target/MSP430/MSP430TargetMachine.h
@@ -39,7 +39,7 @@ class MSP430TargetMachine : public LLVMTargetMachine {
public:
MSP430TargetMachine(const Target &T, const std::string &TT,
- const std::string &FS);
+ const std::string &CPU, const std::string &FS);
virtual const TargetFrameLowering *getFrameLowering() const {
return &FrameLowering;
diff --git a/contrib/llvm/lib/Target/Mips/InstPrinter/CMakeLists.txt b/contrib/llvm/lib/Target/Mips/InstPrinter/CMakeLists.txt
new file mode 100644
index 0000000..8852fd4
--- /dev/null
+++ b/contrib/llvm/lib/Target/Mips/InstPrinter/CMakeLists.txt
@@ -0,0 +1,6 @@
+include_directories( ${CMAKE_CURRENT_BINARY_DIR}/.. ${CMAKE_CURRENT_SOURCE_DIR}/.. )
+
+add_llvm_library(LLVMMipsAsmPrinter
+ MipsInstPrinter.cpp
+ )
+add_dependencies(LLVMMipsAsmPrinter MipsCodeGenTable_gen)
diff --git a/contrib/llvm/lib/Target/Mips/InstPrinter/Makefile b/contrib/llvm/lib/Target/Mips/InstPrinter/Makefile
new file mode 100644
index 0000000..63e38ef
--- /dev/null
+++ b/contrib/llvm/lib/Target/Mips/InstPrinter/Makefile
@@ -0,0 +1,16 @@
+##===- lib/Target/Mips/AsmPrinter/Makefile --------------*- Makefile -*-===##
+#
+# The LLVM Compiler Infrastructure
+#
+# This file is distributed under the University of Illinois Open Source
+# License. See LICENSE.TXT for details.
+#
+##===----------------------------------------------------------------------===##
+
+LEVEL = ../../../..
+LIBRARYNAME = LLVMMipsAsmPrinter
+
+# Hack: we need to include 'main' arm target directory to grab private headers
+CPP.Flags += -I$(PROJ_OBJ_DIR)/.. -I$(PROJ_SRC_DIR)/..
+
+include $(LEVEL)/Makefile.common
diff --git a/contrib/llvm/lib/Target/Mips/InstPrinter/MipsInstPrinter.cpp b/contrib/llvm/lib/Target/Mips/InstPrinter/MipsInstPrinter.cpp
new file mode 100644
index 0000000..41c1dd3
--- /dev/null
+++ b/contrib/llvm/lib/Target/Mips/InstPrinter/MipsInstPrinter.cpp
@@ -0,0 +1,127 @@
+//===-- MipsInstPrinter.cpp - Convert Mips MCInst to assembly syntax --------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+//
+// This class prints an Mips MCInst to a .s file.
+//
+//===----------------------------------------------------------------------===//
+
+#define DEBUG_TYPE "asm-printer"
+#include "MipsInstPrinter.h"
+#include "llvm/MC/MCExpr.h"
+#include "llvm/MC/MCInst.h"
+#include "llvm/Support/ErrorHandling.h"
+#include "llvm/Support/raw_ostream.h"
+#include "llvm/ADT/StringExtras.h"
+using namespace llvm;
+
+#define GET_INSTRUCTION_NAME
+#include "MipsGenAsmWriter.inc"
+
+const char* Mips::MipsFCCToString(Mips::CondCode CC) {
+ switch (CC) {
+ case FCOND_F:
+ case FCOND_T: return "f";
+ case FCOND_UN:
+ case FCOND_OR: return "un";
+ case FCOND_OEQ:
+ case FCOND_UNE: return "eq";
+ case FCOND_UEQ:
+ case FCOND_ONE: return "ueq";
+ case FCOND_OLT:
+ case FCOND_UGE: return "olt";
+ case FCOND_ULT:
+ case FCOND_OGE: return "ult";
+ case FCOND_OLE:
+ case FCOND_UGT: return "ole";
+ case FCOND_ULE:
+ case FCOND_OGT: return "ule";
+ case FCOND_SF:
+ case FCOND_ST: return "sf";
+ case FCOND_NGLE:
+ case FCOND_GLE: return "ngle";
+ case FCOND_SEQ:
+ case FCOND_SNE: return "seq";
+ case FCOND_NGL:
+ case FCOND_GL: return "ngl";
+ case FCOND_LT:
+ case FCOND_NLT: return "lt";
+ case FCOND_NGE:
+ case FCOND_GE: return "nge";
+ case FCOND_LE:
+ case FCOND_NLE: return "le";
+ case FCOND_NGT:
+ case FCOND_GT: return "ngt";
+ }
+ llvm_unreachable("Impossible condition code!");
+}
+
+StringRef MipsInstPrinter::getOpcodeName(unsigned Opcode) const {
+ return getInstructionName(Opcode);
+}
+
+void MipsInstPrinter::printRegName(raw_ostream &OS, unsigned RegNo) const {
+ OS << '$' << LowercaseString(getRegisterName(RegNo));
+}
+
+void MipsInstPrinter::printInst(const MCInst *MI, raw_ostream &O) {
+ printInstruction(MI, O);
+}
+
+void MipsInstPrinter::printOperand(const MCInst *MI, unsigned OpNo,
+ raw_ostream &O) {
+ const MCOperand &Op = MI->getOperand(OpNo);
+ if (Op.isReg()) {
+ printRegName(O, Op.getReg());
+ return;
+ }
+
+ if (Op.isImm()) {
+ O << Op.getImm();
+ return;
+ }
+
+ assert(Op.isExpr() && "unknown operand kind in printOperand");
+ O << *Op.getExpr();
+}
+
+void MipsInstPrinter::printUnsignedImm(const MCInst *MI, int opNum,
+ raw_ostream &O) {
+ const MCOperand &MO = MI->getOperand(opNum);
+ if (MO.isImm())
+ O << (unsigned short int)MO.getImm();
+ else
+ printOperand(MI, opNum, O);
+}
+
+void MipsInstPrinter::
+printMemOperand(const MCInst *MI, int opNum, raw_ostream &O) {
+ // Load/Store memory operands -- imm($reg)
+ // If PIC target the target is loaded as the
+ // pattern lw $25,%call16($28)
+ printOperand(MI, opNum+1, O);
+ O << "(";
+ printOperand(MI, opNum, O);
+ O << ")";
+}
+
+void MipsInstPrinter::
+printMemOperandEA(const MCInst *MI, int opNum, raw_ostream &O) {
+ // when using stack locations for not load/store instructions
+ // print the same way as all normal 3 operand instructions.
+ printOperand(MI, opNum, O);
+ O << ", ";
+ printOperand(MI, opNum+1, O);
+ return;
+}
+
+void MipsInstPrinter::
+printFCCOperand(const MCInst *MI, int opNum, raw_ostream &O) {
+ const MCOperand& MO = MI->getOperand(opNum);
+ O << MipsFCCToString((Mips::CondCode)MO.getImm());
+}
diff --git a/contrib/llvm/lib/Target/Mips/InstPrinter/MipsInstPrinter.h b/contrib/llvm/lib/Target/Mips/InstPrinter/MipsInstPrinter.h
new file mode 100644
index 0000000..680208e
--- /dev/null
+++ b/contrib/llvm/lib/Target/Mips/InstPrinter/MipsInstPrinter.h
@@ -0,0 +1,100 @@
+//===-- MipsInstPrinter.h - Convert Mips MCInst to assembly syntax ----------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+//
+// This class prints a Mips MCInst to a .s file.
+//
+//===----------------------------------------------------------------------===//
+
+#ifndef MIPSINSTPRINTER_H
+#define MIPSINSTPRINTER_H
+#include "llvm/MC/MCInstPrinter.h"
+
+namespace llvm {
+// These enumeration declarations were orignally in MipsInstrInfo.h but
+// had to be moved here to avoid circular dependencies between
+// LLVMMipsCodeGen and LLVMMipsAsmPrinter.
+namespace Mips {
+// Mips Branch Codes
+enum FPBranchCode {
+ BRANCH_F,
+ BRANCH_T,
+ BRANCH_FL,
+ BRANCH_TL,
+ BRANCH_INVALID
+};
+
+// Mips Condition Codes
+enum CondCode {
+ // To be used with float branch True
+ FCOND_F,
+ FCOND_UN,
+ FCOND_OEQ,
+ FCOND_UEQ,
+ FCOND_OLT,
+ FCOND_ULT,
+ FCOND_OLE,
+ FCOND_ULE,
+ FCOND_SF,
+ FCOND_NGLE,
+ FCOND_SEQ,
+ FCOND_NGL,
+ FCOND_LT,
+ FCOND_NGE,
+ FCOND_LE,
+ FCOND_NGT,
+
+ // To be used with float branch False
+ // This conditions have the same mnemonic as the
+ // above ones, but are used with a branch False;
+ FCOND_T,
+ FCOND_OR,
+ FCOND_UNE,
+ FCOND_ONE,
+ FCOND_UGE,
+ FCOND_OGE,
+ FCOND_UGT,
+ FCOND_OGT,
+ FCOND_ST,
+ FCOND_GLE,
+ FCOND_SNE,
+ FCOND_GL,
+ FCOND_NLT,
+ FCOND_GE,
+ FCOND_NLE,
+ FCOND_GT
+};
+
+const char *MipsFCCToString(Mips::CondCode CC);
+} // end namespace Mips
+
+class TargetMachine;
+
+class MipsInstPrinter : public MCInstPrinter {
+public:
+ MipsInstPrinter(const MCAsmInfo &MAI) : MCInstPrinter(MAI) {}
+
+ // Autogenerated by tblgen.
+ void printInstruction(const MCInst *MI, raw_ostream &O);
+ static const char *getInstructionName(unsigned Opcode);
+ static const char *getRegisterName(unsigned RegNo);
+
+ virtual StringRef getOpcodeName(unsigned Opcode) const;
+ virtual void printRegName(raw_ostream &OS, unsigned RegNo) const;
+ virtual void printInst(const MCInst *MI, raw_ostream &O);
+
+private:
+ void printOperand(const MCInst *MI, unsigned OpNo, raw_ostream &O);
+ void printUnsignedImm(const MCInst *MI, int opNum, raw_ostream &O);
+ void printMemOperand(const MCInst *MI, int opNum, raw_ostream &O);
+ void printMemOperandEA(const MCInst *MI, int opNum, raw_ostream &O);
+ void printFCCOperand(const MCInst *MI, int opNum, raw_ostream &O);
+};
+} // end namespace llvm
+
+#endif
diff --git a/contrib/llvm/lib/Target/Mips/MCTargetDesc/CMakeLists.txt b/contrib/llvm/lib/Target/Mips/MCTargetDesc/CMakeLists.txt
new file mode 100644
index 0000000..97de75d
--- /dev/null
+++ b/contrib/llvm/lib/Target/Mips/MCTargetDesc/CMakeLists.txt
@@ -0,0 +1,4 @@
+add_llvm_library(LLVMMipsDesc
+ MipsMCTargetDesc.cpp
+ MipsMCAsmInfo.cpp
+ )
diff --git a/contrib/llvm/lib/Target/Mips/MCTargetDesc/Makefile b/contrib/llvm/lib/Target/Mips/MCTargetDesc/Makefile
new file mode 100644
index 0000000..7fe2086
--- /dev/null
+++ b/contrib/llvm/lib/Target/Mips/MCTargetDesc/Makefile
@@ -0,0 +1,16 @@
+##===- lib/Target/Mips/TargetDesc/Makefile -----------------*- Makefile -*-===##
+#
+# The LLVM Compiler Infrastructure
+#
+# This file is distributed under the University of Illinois Open Source
+# License. See LICENSE.TXT for details.
+#
+##===----------------------------------------------------------------------===##
+
+LEVEL = ../../../..
+LIBRARYNAME = LLVMMipsDesc
+
+# Hack: we need to include 'main' target directory to grab private headers
+CPP.Flags += -I$(PROJ_OBJ_DIR)/.. -I$(PROJ_SRC_DIR)/..
+
+include $(LEVEL)/Makefile.common
diff --git a/contrib/llvm/lib/Target/Mips/MipsMCAsmInfo.cpp b/contrib/llvm/lib/Target/Mips/MCTargetDesc/MipsMCAsmInfo.cpp
index c86bf405..5d92425 100644
--- a/contrib/llvm/lib/Target/Mips/MipsMCAsmInfo.cpp
+++ b/contrib/llvm/lib/Target/Mips/MCTargetDesc/MipsMCAsmInfo.cpp
@@ -12,11 +12,17 @@
//===----------------------------------------------------------------------===//
#include "MipsMCAsmInfo.h"
+#include "llvm/ADT/Triple.h"
+
using namespace llvm;
MipsMCAsmInfo::MipsMCAsmInfo(const Target &T, StringRef TT) {
+ Triple TheTriple(TT);
+ if (TheTriple.getArch() == Triple::mips)
+ IsLittleEndian = false;
+
AlignmentIsInBytes = false;
- Data16bitsDirective = "\t.half\t";
+ Data16bitsDirective = "\t.2byte\t";
Data32bitsDirective = "\t.4byte\t";
Data64bitsDirective = 0;
PrivateGlobalPrefix = "$";
@@ -28,4 +34,5 @@ MipsMCAsmInfo::MipsMCAsmInfo(const Target &T, StringRef TT) {
SupportsDebugInformation = true;
ExceptionsType = ExceptionHandling::DwarfCFI;
HasLEB128 = true;
+ DwarfRegNumForCFI = true;
}
diff --git a/contrib/llvm/lib/Target/Mips/MipsMCAsmInfo.h b/contrib/llvm/lib/Target/Mips/MCTargetDesc/MipsMCAsmInfo.h
index 41b7192..41b7192 100644
--- a/contrib/llvm/lib/Target/Mips/MipsMCAsmInfo.h
+++ b/contrib/llvm/lib/Target/Mips/MCTargetDesc/MipsMCAsmInfo.h
diff --git a/contrib/llvm/lib/Target/Mips/MCTargetDesc/MipsMCTargetDesc.cpp b/contrib/llvm/lib/Target/Mips/MCTargetDesc/MipsMCTargetDesc.cpp
new file mode 100644
index 0000000..06f0d0b
--- /dev/null
+++ b/contrib/llvm/lib/Target/Mips/MCTargetDesc/MipsMCTargetDesc.cpp
@@ -0,0 +1,58 @@
+//===-- MipsMCTargetDesc.cpp - Mips Target Descriptions ---------*- C++ -*-===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+//
+// This file provides Mips specific target descriptions.
+//
+//===----------------------------------------------------------------------===//
+
+#include "MipsMCTargetDesc.h"
+#include "MipsMCAsmInfo.h"
+#include "llvm/MC/MCInstrInfo.h"
+#include "llvm/MC/MCRegisterInfo.h"
+#include "llvm/MC/MCSubtargetInfo.h"
+#include "llvm/Target/TargetRegistry.h"
+
+#define GET_INSTRINFO_MC_DESC
+#include "MipsGenInstrInfo.inc"
+
+#define GET_SUBTARGETINFO_MC_DESC
+#include "MipsGenSubtargetInfo.inc"
+
+#define GET_REGINFO_MC_DESC
+#include "MipsGenRegisterInfo.inc"
+
+using namespace llvm;
+
+static MCInstrInfo *createMipsMCInstrInfo() {
+ MCInstrInfo *X = new MCInstrInfo();
+ InitMipsMCInstrInfo(X);
+ return X;
+}
+
+extern "C" void LLVMInitializeMipsMCInstrInfo() {
+ TargetRegistry::RegisterMCInstrInfo(TheMipsTarget, createMipsMCInstrInfo);
+}
+
+
+static MCSubtargetInfo *createMipsMCSubtargetInfo(StringRef TT, StringRef CPU,
+ StringRef FS) {
+ MCSubtargetInfo *X = new MCSubtargetInfo();
+ InitMipsMCSubtargetInfo(X, TT, CPU, FS);
+ return X;
+}
+
+extern "C" void LLVMInitializeMipsMCSubtargetInfo() {
+ TargetRegistry::RegisterMCSubtargetInfo(TheMipsTarget,
+ createMipsMCSubtargetInfo);
+}
+
+extern "C" void LLVMInitializeMipsMCAsmInfo() {
+ RegisterMCAsmInfo<MipsMCAsmInfo> X(TheMipsTarget);
+ RegisterMCAsmInfo<MipsMCAsmInfo> Y(TheMipselTarget);
+}
diff --git a/contrib/llvm/lib/Target/Mips/MCTargetDesc/MipsMCTargetDesc.h b/contrib/llvm/lib/Target/Mips/MCTargetDesc/MipsMCTargetDesc.h
new file mode 100644
index 0000000..3d18f11
--- /dev/null
+++ b/contrib/llvm/lib/Target/Mips/MCTargetDesc/MipsMCTargetDesc.h
@@ -0,0 +1,39 @@
+//===-- AlphaMCTargetDesc.h - Alpha Target Descriptions ---------*- C++ -*-===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+//
+// This file provides Alpha specific target descriptions.
+//
+//===----------------------------------------------------------------------===//
+
+#ifndef ALPHAMCTARGETDESC_H
+#define ALPHAMCTARGETDESC_H
+
+namespace llvm {
+class MCSubtargetInfo;
+class Target;
+class StringRef;
+
+extern Target TheMipsTarget;
+extern Target TheMipselTarget;
+
+} // End llvm namespace
+
+// Defines symbolic names for Mips registers. This defines a mapping from
+// register name to register number.
+#define GET_REGINFO_ENUM
+#include "MipsGenRegisterInfo.inc"
+
+// Defines symbolic names for the Mips instructions.
+#define GET_INSTRINFO_ENUM
+#include "MipsGenInstrInfo.inc"
+
+#define GET_SUBTARGETINFO_ENUM
+#include "MipsGenSubtargetInfo.inc"
+
+#endif
diff --git a/contrib/llvm/lib/Target/Mips/Mips.h b/contrib/llvm/lib/Target/Mips/Mips.h
index 76a26a9..984b5ad 100644
--- a/contrib/llvm/lib/Target/Mips/Mips.h
+++ b/contrib/llvm/lib/Target/Mips/Mips.h
@@ -15,6 +15,7 @@
#ifndef TARGET_MIPS_H
#define TARGET_MIPS_H
+#include "MCTargetDesc/MipsMCTargetDesc.h"
#include "llvm/Target/TargetMachine.h"
namespace llvm {
@@ -28,16 +29,6 @@ namespace llvm {
FunctionPass *createMipsExpandPseudoPass(MipsTargetMachine &TM);
FunctionPass *createMipsEmitGPRestorePass(MipsTargetMachine &TM);
- extern Target TheMipsTarget;
- extern Target TheMipselTarget;
-
} // end namespace llvm;
-// Defines symbolic names for Mips registers. This defines a mapping from
-// register name to register number.
-#include "MipsGenRegisterNames.inc"
-
-// Defines symbolic names for the Mips instructions.
-#include "MipsGenInstrNames.inc"
-
#endif
diff --git a/contrib/llvm/lib/Target/Mips/Mips.td b/contrib/llvm/lib/Target/Mips/Mips.td
index b79016d..433cd57 100644
--- a/contrib/llvm/lib/Target/Mips/Mips.td
+++ b/contrib/llvm/lib/Target/Mips/Mips.td
@@ -88,6 +88,14 @@ def : Proc<"allegrex", [FeatureMips2, FeatureSingleFloat, FeatureEABI,
FeatureVFPU, FeatureSEInReg, FeatureCondMov, FeatureMulDivAdd,
FeatureMinMax, FeatureSwap, FeatureBitCount]>;
+def MipsAsmWriter : AsmWriter {
+ string AsmWriterClassName = "InstPrinter";
+ bit isMCAsmWriter = 1;
+}
+
def Mips : Target {
let InstructionSet = MipsInstrInfo;
+
+ let AssemblyWriters = [MipsAsmWriter];
}
+
diff --git a/contrib/llvm/lib/Target/Mips/MipsAsmPrinter.cpp b/contrib/llvm/lib/Target/Mips/MipsAsmPrinter.cpp
index 8caa7cd..69e03bd 100644
--- a/contrib/llvm/lib/Target/Mips/MipsAsmPrinter.cpp
+++ b/contrib/llvm/lib/Target/Mips/MipsAsmPrinter.cpp
@@ -13,80 +13,49 @@
//===----------------------------------------------------------------------===//
#define DEBUG_TYPE "mips-asm-printer"
+#include "MipsAsmPrinter.h"
#include "Mips.h"
-#include "MipsSubtarget.h"
#include "MipsInstrInfo.h"
-#include "MipsTargetMachine.h"
#include "MipsMachineFunction.h"
+#include "MipsMCInstLower.h"
+#include "InstPrinter/MipsInstPrinter.h"
#include "llvm/BasicBlock.h"
#include "llvm/Instructions.h"
-#include "llvm/CodeGen/AsmPrinter.h"
#include "llvm/CodeGen/MachineFunctionPass.h"
#include "llvm/CodeGen/MachineConstantPool.h"
#include "llvm/CodeGen/MachineFrameInfo.h"
#include "llvm/CodeGen/MachineInstr.h"
#include "llvm/MC/MCStreamer.h"
#include "llvm/MC/MCAsmInfo.h"
+#include "llvm/MC/MCInst.h"
#include "llvm/MC/MCSymbol.h"
#include "llvm/Target/Mangler.h"
#include "llvm/Target/TargetData.h"
#include "llvm/Target/TargetLoweringObjectFile.h"
-#include "llvm/Target/TargetMachine.h"
#include "llvm/Target/TargetOptions.h"
#include "llvm/Target/TargetRegistry.h"
#include "llvm/ADT/SmallString.h"
#include "llvm/ADT/StringExtras.h"
#include "llvm/ADT/Twine.h"
#include "llvm/Support/raw_ostream.h"
-using namespace llvm;
-
-namespace {
- class MipsAsmPrinter : public AsmPrinter {
- const MipsSubtarget *Subtarget;
- public:
- explicit MipsAsmPrinter(TargetMachine &TM, MCStreamer &Streamer)
- : AsmPrinter(TM, Streamer) {
- Subtarget = &TM.getSubtarget<MipsSubtarget>();
- }
+#include "llvm/Analysis/DebugInfo.h"
- virtual const char *getPassName() const {
- return "Mips Assembly Printer";
- }
+using namespace llvm;
- bool PrintAsmOperand(const MachineInstr *MI, unsigned OpNo,
- unsigned AsmVariant, const char *ExtraCode,
- raw_ostream &O);
- void printOperand(const MachineInstr *MI, int opNum, raw_ostream &O);
- void printUnsignedImm(const MachineInstr *MI, int opNum, raw_ostream &O);
- void printMemOperand(const MachineInstr *MI, int opNum, raw_ostream &O,
- const char *Modifier = 0);
- void printFCCOperand(const MachineInstr *MI, int opNum, raw_ostream &O,
- const char *Modifier = 0);
- void printSavedRegsBitmask(raw_ostream &O);
- void printHex32(unsigned int Value, raw_ostream &O);
-
- const char *getCurrentABIString() const;
- void emitFrameDirective();
-
- void printInstruction(const MachineInstr *MI, raw_ostream &O); // autogen'd.
- void EmitInstruction(const MachineInstr *MI) {
- SmallString<128> Str;
- raw_svector_ostream OS(Str);
- printInstruction(MI, OS);
- OutStreamer.EmitRawText(OS.str());
- }
- virtual void EmitFunctionBodyStart();
- virtual void EmitFunctionBodyEnd();
- virtual bool isBlockOnlyReachableByFallthrough(const MachineBasicBlock*
- MBB) const;
- static const char *getRegisterName(unsigned RegNo);
+void MipsAsmPrinter::EmitInstruction(const MachineInstr *MI) {
+ SmallString<128> Str;
+ raw_svector_ostream OS(Str);
- virtual void EmitFunctionEntryLabel();
- void EmitStartOfAsmFile(Module &M);
- };
-} // end of anonymous namespace
+ if (MI->isDebugValue()) {
+ PrintDebugValueComment(MI, OS);
+ return;
+ }
-#include "MipsGenAsmWriter.inc"
+ MipsMCInstLower MCInstLowering(Mang, *MF, *this);
+ MCInst TmpInst0;
+ MCInstLowering.Lower(MI, TmpInst0);
+ OutStreamer.EmitInstruction(TmpInst0);
+}
//===----------------------------------------------------------------------===//
//
@@ -202,9 +171,9 @@ void MipsAsmPrinter::emitFrameDirective() {
unsigned stackSize = MF->getFrameInfo()->getStackSize();
OutStreamer.EmitRawText("\t.frame\t$" +
- Twine(LowercaseString(getRegisterName(stackReg))) +
- "," + Twine(stackSize) + ",$" +
- Twine(LowercaseString(getRegisterName(returnReg))));
+ Twine(LowercaseString(MipsInstPrinter::getRegisterName(stackReg))) +
+ "," + Twine(stackSize) + ",$" +
+ Twine(LowercaseString(MipsInstPrinter::getRegisterName(returnReg))));
}
/// Emit Set directives.
@@ -304,6 +273,19 @@ bool MipsAsmPrinter::PrintAsmOperand(const MachineInstr *MI, unsigned OpNo,
return false;
}
+bool MipsAsmPrinter::PrintAsmMemoryOperand(const MachineInstr *MI,
+ unsigned OpNum, unsigned AsmVariant,
+ const char *ExtraCode,
+ raw_ostream &O) {
+ if (ExtraCode && ExtraCode[0])
+ return true; // Unknown modifier.
+
+ const MachineOperand &MO = MI->getOperand(OpNum);
+ assert(MO.isReg() && "unexpected inline asm memory operand");
+ O << "0($" << MipsInstPrinter::getRegisterName(MO.getReg()) << ")";
+ return false;
+}
+
void MipsAsmPrinter::printOperand(const MachineInstr *MI, int opNum,
raw_ostream &O) {
const MachineOperand &MO = MI->getOperand(opNum);
@@ -326,7 +308,8 @@ void MipsAsmPrinter::printOperand(const MachineInstr *MI, int opNum,
switch (MO.getType()) {
case MachineOperand::MO_Register:
- O << '$' << LowercaseString(getRegisterName(MO.getReg()));
+ O << '$'
+ << LowercaseString(MipsInstPrinter::getRegisterName(MO.getReg()));
break;
case MachineOperand::MO_Immediate:
@@ -380,27 +363,27 @@ void MipsAsmPrinter::printUnsignedImm(const MachineInstr *MI, int opNum,
}
void MipsAsmPrinter::
-printMemOperand(const MachineInstr *MI, int opNum, raw_ostream &O,
- const char *Modifier) {
- // when using stack locations for not load/store instructions
- // print the same way as all normal 3 operand instructions.
- if (Modifier && !strcmp(Modifier, "stackloc")) {
- printOperand(MI, opNum+1, O);
- O << ", ";
- printOperand(MI, opNum, O);
- return;
- }
-
+printMemOperand(const MachineInstr *MI, int opNum, raw_ostream &O) {
// Load/Store memory operands -- imm($reg)
// If PIC target the target is loaded as the
// pattern lw $25,%call16($28)
- printOperand(MI, opNum, O);
- O << "(";
printOperand(MI, opNum+1, O);
+ O << "(";
+ printOperand(MI, opNum, O);
O << ")";
}
void MipsAsmPrinter::
+printMemOperandEA(const MachineInstr *MI, int opNum, raw_ostream &O) {
+ // when using stack locations for not load/store instructions
+ // print the same way as all normal 3 operand instructions.
+ printOperand(MI, opNum, O);
+ O << ", ";
+ printOperand(MI, opNum+1, O);
+ return;
+}
+
+void MipsAsmPrinter::
printFCCOperand(const MachineInstr *MI, int opNum, raw_ostream &O,
const char *Modifier) {
const MachineOperand& MO = MI->getOperand(opNum);
@@ -425,8 +408,33 @@ void MipsAsmPrinter::EmitStartOfAsmFile(Module &M) {
OutStreamer.EmitRawText(StringRef("\t.previous"));
}
+MachineLocation
+MipsAsmPrinter::getDebugValueLocation(const MachineInstr *MI) const {
+ // Handles frame addresses emitted in MipsInstrInfo::emitFrameIndexDebugValue.
+ assert(MI->getNumOperands() == 4 && "Invalid no. of machine operands!");
+ assert(MI->getOperand(0).isReg() && MI->getOperand(1).isImm() &&
+ "Unexpected MachineOperand types");
+ return MachineLocation(MI->getOperand(0).getReg(),
+ MI->getOperand(1).getImm());
+}
+
+void MipsAsmPrinter::PrintDebugValueComment(const MachineInstr *MI,
+ raw_ostream &OS) {
+ // TODO: implement
+}
+
// Force static initialization.
+static MCInstPrinter *createMipsMCInstPrinter(const Target &T,
+ unsigned SyntaxVariant,
+ const MCAsmInfo &MAI) {
+ return new MipsInstPrinter(MAI);
+}
+
extern "C" void LLVMInitializeMipsAsmPrinter() {
RegisterAsmPrinter<MipsAsmPrinter> X(TheMipsTarget);
RegisterAsmPrinter<MipsAsmPrinter> Y(TheMipselTarget);
+
+ TargetRegistry::RegisterMCInstPrinter(TheMipsTarget, createMipsMCInstPrinter);
+ TargetRegistry::RegisterMCInstPrinter(TheMipselTarget,
+ createMipsMCInstPrinter);
}
diff --git a/contrib/llvm/lib/Target/Mips/MipsAsmPrinter.h b/contrib/llvm/lib/Target/Mips/MipsAsmPrinter.h
new file mode 100644
index 0000000..16461ff
--- /dev/null
+++ b/contrib/llvm/lib/Target/Mips/MipsAsmPrinter.h
@@ -0,0 +1,71 @@
+//===-- MipsAsmPrinter.h - Mips LLVM assembly writer ----------------------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+//
+// Mips Assembly printer class.
+//
+//===----------------------------------------------------------------------===//
+
+#ifndef MIPSASMPRINTER_H
+#define MIPSASMPRINTER_H
+
+#include "MipsSubtarget.h"
+#include "llvm/CodeGen/AsmPrinter.h"
+#include "llvm/Support/Compiler.h"
+#include "llvm/Target/TargetMachine.h"
+
+namespace llvm {
+class MCStreamer;
+class MachineInstr;
+class raw_ostream;
+class MachineBasicBlock;
+class Module;
+
+class LLVM_LIBRARY_VISIBILITY MipsAsmPrinter : public AsmPrinter {
+ const MipsSubtarget *Subtarget;
+
+public:
+ explicit MipsAsmPrinter(TargetMachine &TM, MCStreamer &Streamer)
+ : AsmPrinter(TM, Streamer) {
+ Subtarget = &TM.getSubtarget<MipsSubtarget>();
+ }
+
+ virtual const char *getPassName() const {
+ return "Mips Assembly Printer";
+ }
+
+ void EmitInstruction(const MachineInstr *MI);
+ void printSavedRegsBitmask(raw_ostream &O);
+ void printHex32(unsigned int Value, raw_ostream &O);
+ void emitFrameDirective();
+ const char *getCurrentABIString() const;
+ virtual void EmitFunctionEntryLabel();
+ virtual void EmitFunctionBodyStart();
+ virtual void EmitFunctionBodyEnd();
+ virtual bool isBlockOnlyReachableByFallthrough(const MachineBasicBlock*
+ MBB) const;
+ bool PrintAsmOperand(const MachineInstr *MI, unsigned OpNo,
+ unsigned AsmVariant, const char *ExtraCode,
+ raw_ostream &O);
+ bool PrintAsmMemoryOperand(const MachineInstr *MI, unsigned OpNum,
+ unsigned AsmVariant, const char *ExtraCode,
+ raw_ostream &O);
+ void printOperand(const MachineInstr *MI, int opNum, raw_ostream &O);
+ void printUnsignedImm(const MachineInstr *MI, int opNum, raw_ostream &O);
+ void printMemOperand(const MachineInstr *MI, int opNum, raw_ostream &O);
+ void printMemOperandEA(const MachineInstr *MI, int opNum, raw_ostream &O);
+ void printFCCOperand(const MachineInstr *MI, int opNum, raw_ostream &O,
+ const char *Modifier = 0);
+ void EmitStartOfAsmFile(Module &M);
+ virtual MachineLocation getDebugValueLocation(const MachineInstr *MI) const;
+ void PrintDebugValueComment(const MachineInstr *MI, raw_ostream &OS);
+};
+}
+
+#endif
+
diff --git a/contrib/llvm/lib/Target/Mips/MipsCallingConv.td b/contrib/llvm/lib/Target/Mips/MipsCallingConv.td
index 57aeb1d..876f0fc 100644
--- a/contrib/llvm/lib/Target/Mips/MipsCallingConv.td
+++ b/contrib/llvm/lib/Target/Mips/MipsCallingConv.td
@@ -20,8 +20,8 @@ class CCIfSubtarget<string F, CCAction A>:
// Only the return rules are defined here for O32. The rules for argument
// passing are defined in MipsISelLowering.cpp.
def RetCC_MipsO32 : CallingConv<[
- // i32 are returned in registers V0, V1
- CCIfType<[i32], CCAssignToReg<[V0, V1]>>,
+ // i32 are returned in registers V0, V1, A0, A1
+ CCIfType<[i32], CCAssignToReg<[V0, V1, A0, A1]>>,
// f32 are returned in registers F0, F2
CCIfType<[f32], CCAssignToReg<[F0, F2]>>,
diff --git a/contrib/llvm/lib/Target/Mips/MipsDelaySlotFiller.cpp b/contrib/llvm/lib/Target/Mips/MipsDelaySlotFiller.cpp
index b44a0af..c3a6211 100644
--- a/contrib/llvm/lib/Target/Mips/MipsDelaySlotFiller.cpp
+++ b/contrib/llvm/lib/Target/Mips/MipsDelaySlotFiller.cpp
@@ -59,10 +59,10 @@ runOnMachineBasicBlock(MachineBasicBlock &MBB)
{
bool Changed = false;
for (MachineBasicBlock::iterator I = MBB.begin(); I != MBB.end(); ++I) {
- const TargetInstrDesc& Tid = I->getDesc();
- if (Tid.hasDelaySlot() &&
+ const MCInstrDesc& MCid = I->getDesc();
+ if (MCid.hasDelaySlot() &&
(TM.getSubtarget<MipsSubtarget>().isMips1() ||
- Tid.isCall() || Tid.isBranch() || Tid.isReturn())) {
+ MCid.isCall() || MCid.isBranch() || MCid.isReturn())) {
MachineBasicBlock::iterator J = I;
++J;
BuildMI(MBB, J, I->getDebugLoc(), TII->get(Mips::NOP));
diff --git a/contrib/llvm/lib/Target/Mips/MipsEmitGPRestore.cpp b/contrib/llvm/lib/Target/Mips/MipsEmitGPRestore.cpp
index f49d490..03d922f 100644
--- a/contrib/llvm/lib/Target/Mips/MipsEmitGPRestore.cpp
+++ b/contrib/llvm/lib/Target/Mips/MipsEmitGPRestore.cpp
@@ -64,8 +64,8 @@ bool Inserter::runOnMachineFunction(MachineFunction &F) {
// Insert lw.
++I;
DebugLoc dl = I != MBB.end() ? I->getDebugLoc() : DebugLoc();
- BuildMI(MBB, I, dl, TII->get(Mips::LW), Mips::GP).addImm(0)
- .addFrameIndex(FI);
+ BuildMI(MBB, I, dl, TII->get(Mips::LW), Mips::GP).addFrameIndex(FI)
+ .addImm(0);
Changed = true;
}
@@ -77,8 +77,8 @@ bool Inserter::runOnMachineFunction(MachineFunction &F) {
DebugLoc dl = I->getDebugLoc();
// emit lw $gp, ($gp save slot on stack) after jalr
- BuildMI(MBB, ++I, dl, TII->get(Mips::LW), Mips::GP).addImm(0)
- .addFrameIndex(FI);
+ BuildMI(MBB, ++I, dl, TII->get(Mips::LW), Mips::GP).addFrameIndex(FI)
+ .addImm(0);
Changed = true;
}
}
diff --git a/contrib/llvm/lib/Target/Mips/MipsExpandPseudo.cpp b/contrib/llvm/lib/Target/Mips/MipsExpandPseudo.cpp
index 4423f51..a622258 100644
--- a/contrib/llvm/lib/Target/Mips/MipsExpandPseudo.cpp
+++ b/contrib/llvm/lib/Target/Mips/MipsExpandPseudo.cpp
@@ -61,9 +61,9 @@ bool MipsExpandPseudo::runOnMachineBasicBlock(MachineBasicBlock& MBB) {
bool Changed = false;
for (MachineBasicBlock::iterator I = MBB.begin(); I != MBB.end();) {
- const TargetInstrDesc& Tid = I->getDesc();
+ const MCInstrDesc& MCid = I->getDesc();
- switch(Tid.getOpcode()) {
+ switch(MCid.getOpcode()) {
default:
++I;
continue;
@@ -87,7 +87,7 @@ void MipsExpandPseudo::ExpandBuildPairF64(MachineBasicBlock& MBB,
MachineBasicBlock::iterator I) {
unsigned DstReg = I->getOperand(0).getReg();
unsigned LoReg = I->getOperand(1).getReg(), HiReg = I->getOperand(2).getReg();
- const TargetInstrDesc& Mtc1Tdd = TII->get(Mips::MTC1);
+ const MCInstrDesc& Mtc1Tdd = TII->get(Mips::MTC1);
DebugLoc dl = I->getDebugLoc();
const unsigned* SubReg =
TM.getRegisterInfo()->getSubRegisters(DstReg);
@@ -103,7 +103,7 @@ void MipsExpandPseudo::ExpandExtractElementF64(MachineBasicBlock& MBB,
unsigned DstReg = I->getOperand(0).getReg();
unsigned SrcReg = I->getOperand(1).getReg();
unsigned N = I->getOperand(2).getImm();
- const TargetInstrDesc& Mfc1Tdd = TII->get(Mips::MFC1);
+ const MCInstrDesc& Mfc1Tdd = TII->get(Mips::MFC1);
DebugLoc dl = I->getDebugLoc();
const unsigned* SubReg = TM.getRegisterInfo()->getSubRegisters(SrcReg);
diff --git a/contrib/llvm/lib/Target/Mips/MipsISelDAGToDAG.cpp b/contrib/llvm/lib/Target/Mips/MipsISelDAGToDAG.cpp
index d8a84ce..90aaeb6 100644
--- a/contrib/llvm/lib/Target/Mips/MipsISelDAGToDAG.cpp
+++ b/contrib/llvm/lib/Target/Mips/MipsISelDAGToDAG.cpp
@@ -94,6 +94,10 @@ private:
inline SDValue getI32Imm(unsigned Imm) {
return CurDAG->getTargetConstant(Imm, MVT::i32);
}
+
+ virtual bool SelectInlineAsmMemoryOperand(const SDValue &Op,
+ char ConstraintCode,
+ std::vector<SDValue> &OutOps);
};
}
@@ -109,7 +113,7 @@ SDNode *MipsDAGToDAGISel::getGlobalBaseReg() {
/// ComplexPattern used on MipsInstrInfo
/// Used on Mips Load/Store instructions
bool MipsDAGToDAGISel::
-SelectAddr(SDValue Addr, SDValue &Offset, SDValue &Base) {
+SelectAddr(SDValue Addr, SDValue &Base, SDValue &Offset) {
// if Address is FI, get the TargetFrameIndex.
if (FrameIndexSDNode *FIN = dyn_cast<FrameIndexSDNode>(Addr)) {
Base = CurDAG->getTargetFrameIndex(FIN->getIndex(), MVT::i32);
@@ -166,7 +170,8 @@ SelectAddr(SDValue Addr, SDValue &Offset, SDValue &Base) {
Addr.getOperand(0).getOpcode() == ISD::LOAD) &&
Addr.getOperand(1).getOpcode() == MipsISD::Lo) {
SDValue LoVal = Addr.getOperand(1);
- if (dyn_cast<ConstantPoolSDNode>(LoVal.getOperand(0))) {
+ if (isa<ConstantPoolSDNode>(LoVal.getOperand(0)) ||
+ isa<GlobalAddressSDNode>(LoVal.getOperand(0))) {
Base = Addr.getOperand(0);
Offset = LoVal.getOperand(0);
return true;
@@ -195,7 +200,7 @@ SDNode *MipsDAGToDAGISel::SelectLoadFp64(SDNode *N) {
SDValue N1 = N->getOperand(1);
SDValue Offset0, Offset1, Base;
- if (!SelectAddr(N1, Offset0, Base) ||
+ if (!SelectAddr(N1, Base, Offset0) ||
N1.getValueType() != MVT::i32)
return NULL;
@@ -225,14 +230,14 @@ SDNode *MipsDAGToDAGISel::SelectLoadFp64(SDNode *N) {
// lwc $f0, X($3)
// lwc $f1, X+4($3)
SDNode *LD0 = CurDAG->getMachineNode(Mips::LWC1, dl, MVT::f32,
- MVT::Other, Offset0, Base, Chain);
+ MVT::Other, Base, Offset0, Chain);
SDValue Undef = SDValue(CurDAG->getMachineNode(TargetOpcode::IMPLICIT_DEF,
dl, NVT), 0);
SDValue I0 = CurDAG->getTargetInsertSubreg(Mips::sub_fpeven, dl,
MVT::f64, Undef, SDValue(LD0, 0));
SDNode *LD1 = CurDAG->getMachineNode(Mips::LWC1, dl, MVT::f32,
- MVT::Other, Offset1, Base, SDValue(LD0, 1));
+ MVT::Other, Base, Offset1, SDValue(LD0, 1));
SDValue I1 = CurDAG->getTargetInsertSubreg(Mips::sub_fpodd, dl,
MVT::f64, I0, SDValue(LD1, 0));
@@ -259,7 +264,7 @@ SDNode *MipsDAGToDAGISel::SelectStoreFp64(SDNode *N) {
SDValue N2 = N->getOperand(2);
SDValue Offset0, Offset1, Base;
- if (!SelectAddr(N2, Offset0, Base) ||
+ if (!SelectAddr(N2, Base, Offset0) ||
N1.getValueType() != MVT::f64 ||
N2.getValueType() != MVT::i32)
return NULL;
@@ -289,12 +294,12 @@ SDNode *MipsDAGToDAGISel::SelectStoreFp64(SDNode *N) {
// Generate:
// swc $f0, X($3)
// swc $f1, X+4($3)
- SDValue Ops0[] = { FPEven, Offset0, Base, Chain };
+ SDValue Ops0[] = { FPEven, Base, Offset0, Chain };
Chain = SDValue(CurDAG->getMachineNode(Mips::SWC1, dl,
MVT::Other, Ops0, 4), 0);
cast<MachineSDNode>(Chain.getNode())->setMemRefs(MemRefs0, MemRefs0 + 1);
- SDValue Ops1[] = { FPOdd, Offset1, Base, Chain };
+ SDValue Ops1[] = { FPOdd, Base, Offset1, Chain };
Chain = SDValue(CurDAG->getMachineNode(Mips::SWC1, dl,
MVT::Other, Ops1, 4), 0);
cast<MachineSDNode>(Chain.getNode())->setMemRefs(MemRefs0, MemRefs0 + 1);
@@ -462,6 +467,14 @@ SDNode* MipsDAGToDAGISel::Select(SDNode *Node) {
return ResNode;
}
+bool MipsDAGToDAGISel::
+SelectInlineAsmMemoryOperand(const SDValue &Op, char ConstraintCode,
+ std::vector<SDValue> &OutOps) {
+ assert(ConstraintCode == 'm' && "unexpected asm memory constraint");
+ OutOps.push_back(Op);
+ return false;
+}
+
/// createMipsISelDag - This pass converts a legalized DAG into a
/// MIPS-specific DAG, ready for instruction scheduling.
FunctionPass *llvm::createMipsISelDag(MipsTargetMachine &TM) {
diff --git a/contrib/llvm/lib/Target/Mips/MipsISelLowering.cpp b/contrib/llvm/lib/Target/Mips/MipsISelLowering.cpp
index fd90731..b4f4b1b 100644
--- a/contrib/llvm/lib/Target/Mips/MipsISelLowering.cpp
+++ b/contrib/llvm/lib/Target/Mips/MipsISelLowering.cpp
@@ -23,6 +23,7 @@
#include "llvm/GlobalVariable.h"
#include "llvm/Intrinsics.h"
#include "llvm/CallingConv.h"
+#include "InstPrinter/MipsInstPrinter.h"
#include "llvm/CodeGen/CallingConvLower.h"
#include "llvm/CodeGen/MachineFrameInfo.h"
#include "llvm/CodeGen/MachineFunction.h"
@@ -59,6 +60,7 @@ const char *MipsTargetLowering::getTargetNodeName(unsigned Opcode) const {
case MipsISD::BuildPairF64: return "MipsISD::BuildPairF64";
case MipsISD::ExtractElementF64: return "MipsISD::ExtractElementF64";
case MipsISD::WrapperPIC: return "MipsISD::WrapperPIC";
+ case MipsISD::DynAlloc: return "MipsISD::DynAlloc";
default: return NULL;
}
}
@@ -144,6 +146,8 @@ MipsTargetLowering(MipsTargetMachine &TM)
setOperationAction(ISD::FLOG2, MVT::f32, Expand);
setOperationAction(ISD::FLOG10, MVT::f32, Expand);
setOperationAction(ISD::FEXP, MVT::f32, Expand);
+ setOperationAction(ISD::FMA, MVT::f32, Expand);
+ setOperationAction(ISD::FMA, MVT::f64, Expand);
setOperationAction(ISD::EXCEPTIONADDR, MVT::i32, Expand);
setOperationAction(ISD::EHSELECTION, MVT::i32, Expand);
@@ -773,7 +777,7 @@ MipsTargetLowering::EmitAtomicBinary(MachineInstr *MI, MachineBasicBlock *BB,
}
BuildMI(BB, dl, TII->get(Mips::SW))
- .addReg(Incr).addImm(0).addFrameIndex(fi);
+ .addReg(Incr).addFrameIndex(fi).addImm(0);
}
BB->addSuccessor(loopMBB);
@@ -784,7 +788,7 @@ MipsTargetLowering::EmitAtomicBinary(MachineInstr *MI, MachineBasicBlock *BB,
// sc tmp1, 0(ptr)
// beq tmp1, $0, loopMBB
BB = loopMBB;
- BuildMI(BB, dl, TII->get(Mips::LL), Oldval).addImm(0).addReg(Ptr);
+ BuildMI(BB, dl, TII->get(Mips::LL), Oldval).addReg(Ptr).addImm(0);
BuildMI(BB, dl, TII->get(Mips::OR), Dest).addReg(Mips::ZERO).addReg(Oldval);
if (Nand) {
// and tmp2, oldval, incr
@@ -797,10 +801,10 @@ MipsTargetLowering::EmitAtomicBinary(MachineInstr *MI, MachineBasicBlock *BB,
} else {
// lw tmp2, fi(sp) // load incr from stack
// or tmp1, $zero, tmp2
- BuildMI(BB, dl, TII->get(Mips::LW), Tmp2).addImm(0).addFrameIndex(fi);;
+ BuildMI(BB, dl, TII->get(Mips::LW), Tmp2).addFrameIndex(fi).addImm(0);
BuildMI(BB, dl, TII->get(Mips::OR), Tmp1).addReg(Mips::ZERO).addReg(Tmp2);
}
- BuildMI(BB, dl, TII->get(Mips::SC), Tmp1).addReg(Tmp1).addImm(0).addReg(Ptr);
+ BuildMI(BB, dl, TII->get(Mips::SC), Tmp1).addReg(Tmp1).addReg(Ptr).addImm(0);
BuildMI(BB, dl, TII->get(Mips::BEQ))
.addReg(Tmp1).addReg(Mips::ZERO).addMBB(loopMBB);
BB->addSuccessor(loopMBB);
@@ -909,7 +913,7 @@ MipsTargetLowering::EmitAtomicBinaryPartword(MachineInstr *MI,
}
BuildMI(BB, dl, TII->get(Mips::SW))
- .addReg(Incr2).addImm(0).addFrameIndex(fi);
+ .addReg(Incr2).addFrameIndex(fi).addImm(0);
}
BB->addSuccessor(loopMBB);
@@ -922,7 +926,7 @@ MipsTargetLowering::EmitAtomicBinaryPartword(MachineInstr *MI,
// sc tmp9,0(addr)
// beq tmp9,$0,loopMBB
BB = loopMBB;
- BuildMI(BB, dl, TII->get(Mips::LL), Oldval).addImm(0).addReg(Addr);
+ BuildMI(BB, dl, TII->get(Mips::LL), Oldval).addReg(Addr).addImm(0);
if (Nand) {
// and tmp6, oldval, incr2
// nor tmp7, $0, tmp6
@@ -937,13 +941,13 @@ MipsTargetLowering::EmitAtomicBinaryPartword(MachineInstr *MI,
} else {
// lw tmp6, fi(sp) // load incr2 from stack
// or tmp7, $zero, tmp6
- BuildMI(BB, dl, TII->get(Mips::LW), Tmp6).addImm(0).addFrameIndex(fi);;
+ BuildMI(BB, dl, TII->get(Mips::LW), Tmp6).addFrameIndex(fi).addImm(0);
BuildMI(BB, dl, TII->get(Mips::OR), Tmp7).addReg(Mips::ZERO).addReg(Tmp6);
}
BuildMI(BB, dl, TII->get(Mips::AND), Newval).addReg(Tmp7).addReg(Mask);
BuildMI(BB, dl, TII->get(Mips::AND), Tmp8).addReg(Oldval).addReg(Mask2);
BuildMI(BB, dl, TII->get(Mips::OR), Tmp9).addReg(Tmp8).addReg(Newval);
- BuildMI(BB, dl, TII->get(Mips::SC), Tmp9).addReg(Tmp9).addImm(0).addReg(Addr);
+ BuildMI(BB, dl, TII->get(Mips::SC), Tmp9).addReg(Tmp9).addReg(Addr).addImm(0);
BuildMI(BB, dl, TII->get(Mips::BEQ))
.addReg(Tmp9).addReg(Mips::ZERO).addMBB(loopMBB);
BB->addSuccessor(loopMBB);
@@ -1026,14 +1030,14 @@ MipsTargetLowering::EmitAtomicCmpSwap(MachineInstr *MI,
// hoist "or" instruction out of the block loop2MBB.
BuildMI(BB, dl, TII->get(Mips::SW))
- .addReg(Newval).addImm(0).addFrameIndex(fi);
+ .addReg(Newval).addFrameIndex(fi).addImm(0);
BB->addSuccessor(loop1MBB);
// loop1MBB:
// ll dest, 0(ptr)
// bne dest, oldval, exitMBB
BB = loop1MBB;
- BuildMI(BB, dl, TII->get(Mips::LL), Dest).addImm(0).addReg(Ptr);
+ BuildMI(BB, dl, TII->get(Mips::LL), Dest).addReg(Ptr).addImm(0);
BuildMI(BB, dl, TII->get(Mips::BNE))
.addReg(Dest).addReg(Oldval).addMBB(exitMBB);
BB->addSuccessor(exitMBB);
@@ -1045,9 +1049,9 @@ MipsTargetLowering::EmitAtomicCmpSwap(MachineInstr *MI,
// sc tmp1, 0(ptr)
// beq tmp1, $0, loop1MBB
BB = loop2MBB;
- BuildMI(BB, dl, TII->get(Mips::LW), Tmp2).addImm(0).addFrameIndex(fi);;
+ BuildMI(BB, dl, TII->get(Mips::LW), Tmp2).addFrameIndex(fi).addImm(0);
BuildMI(BB, dl, TII->get(Mips::OR), Tmp1).addReg(Mips::ZERO).addReg(Tmp2);
- BuildMI(BB, dl, TII->get(Mips::SC), Tmp1).addReg(Tmp1).addImm(0).addReg(Ptr);
+ BuildMI(BB, dl, TII->get(Mips::SC), Tmp1).addReg(Tmp1).addReg(Ptr).addImm(0);
BuildMI(BB, dl, TII->get(Mips::BEQ))
.addReg(Tmp1).addReg(Mips::ZERO).addMBB(loop1MBB);
BB->addSuccessor(loop1MBB);
@@ -1142,7 +1146,7 @@ MipsTargetLowering::EmitAtomicCmpSwapPartword(MachineInstr *MI,
// and oldval4,oldval3,mask
// bne oldval4,oldval2,exitMBB
BB = loop1MBB;
- BuildMI(BB, dl, TII->get(Mips::LL), Oldval3).addImm(0).addReg(Addr);
+ BuildMI(BB, dl, TII->get(Mips::LL), Oldval3).addReg(Addr).addImm(0);
BuildMI(BB, dl, TII->get(Mips::AND), Oldval4).addReg(Oldval3).addReg(Mask);
BuildMI(BB, dl, TII->get(Mips::BNE))
.addReg(Oldval4).addReg(Oldval2).addMBB(exitMBB);
@@ -1158,7 +1162,7 @@ MipsTargetLowering::EmitAtomicCmpSwapPartword(MachineInstr *MI,
BuildMI(BB, dl, TII->get(Mips::AND), Tmp6).addReg(Oldval3).addReg(Mask2);
BuildMI(BB, dl, TII->get(Mips::OR), Tmp7).addReg(Tmp6).addReg(Newval2);
BuildMI(BB, dl, TII->get(Mips::SC), Tmp7)
- .addReg(Tmp7).addImm(0).addReg(Addr);
+ .addReg(Tmp7).addReg(Addr).addImm(0);
BuildMI(BB, dl, TII->get(Mips::BEQ))
.addReg(Tmp7).addReg(Mips::ZERO).addMBB(loop1MBB);
BB->addSuccessor(loop1MBB);
@@ -1189,9 +1193,10 @@ MipsTargetLowering::EmitAtomicCmpSwapPartword(MachineInstr *MI,
SDValue MipsTargetLowering::
LowerDYNAMIC_STACKALLOC(SDValue Op, SelectionDAG &DAG) const
{
- unsigned StackAlignment =
- getTargetMachine().getFrameLowering()->getStackAlignment();
- assert(StackAlignment >=
+ MachineFunction &MF = DAG.getMachineFunction();
+ MipsFunctionInfo *MipsFI = MF.getInfo<MipsFunctionInfo>();
+
+ assert(getTargetMachine().getFrameLowering()->getStackAlignment() >=
cast<ConstantSDNode>(Op.getOperand(2).getNode())->getZExtValue() &&
"Cannot lower if the alignment of the allocated space is larger than \
that of the stack.");
@@ -1211,24 +1216,14 @@ LowerDYNAMIC_STACKALLOC(SDValue Op, SelectionDAG &DAG) const
// must be placed in the stack pointer register.
Chain = DAG.getCopyToReg(StackPointer.getValue(1), dl, Mips::SP, Sub,
SDValue());
- // Retrieve updated $sp. There is a glue input to prevent instructions that
- // clobber $sp from being inserted between copytoreg and copyfromreg.
- SDValue NewSP = DAG.getCopyFromReg(Chain, dl, Mips::SP, MVT::i32,
- Chain.getValue(1));
-
- // The stack space reserved by alloca is located right above the argument
- // area. It is aligned on a boundary that is a multiple of StackAlignment.
- MachineFunction &MF = DAG.getMachineFunction();
- MipsFunctionInfo *MipsFI = MF.getInfo<MipsFunctionInfo>();
- unsigned SPOffset = (MipsFI->getMaxCallFrameSize() + StackAlignment - 1) /
- StackAlignment * StackAlignment;
- SDValue AllocPtr = DAG.getNode(ISD::ADD, dl, MVT::i32, NewSP,
- DAG.getConstant(SPOffset, MVT::i32));
// This node always has two return values: a new stack pointer
// value and a chain
- SDValue Ops[2] = { AllocPtr, NewSP.getValue(1) };
- return DAG.getMergeValues(Ops, 2, dl);
+ SDVTList VTLs = DAG.getVTList(MVT::i32, MVT::Other);
+ SDValue Ptr = DAG.getFrameIndex(MipsFI->getDynAllocFI(), getPointerTy());
+ SDValue Ops[] = { Chain, Ptr, Chain.getValue(1) };
+
+ return DAG.getNode(MipsISD::DynAlloc, dl, VTLs, Ops, 3);
}
SDValue MipsTargetLowering::
@@ -1358,7 +1353,7 @@ LowerGlobalTLSAddress(SDValue Op, SelectionDAG &DAG) const
if (getTargetMachine().getRelocationModel() == Reloc::PIC_) {
// General Dynamic TLS Model
SDValue TGA = DAG.getTargetGlobalAddress(GV, dl, MVT::i32,
- 0, MipsII::MO_TLSGD);
+ 0, MipsII::MO_TLSGD);
SDValue Tlsgd = DAG.getNode(MipsISD::TlsGd, dl, MVT::i32, TGA);
SDValue GP = DAG.getRegister(Mips::GP, MVT::i32);
SDValue Argument = DAG.getNode(ISD::ADD, dl, MVT::i32, GP, Tlsgd);
@@ -1370,36 +1365,36 @@ LowerGlobalTLSAddress(SDValue Op, SelectionDAG &DAG) const
Args.push_back(Entry);
std::pair<SDValue, SDValue> CallResult =
LowerCallTo(DAG.getEntryNode(),
- (const Type *) Type::getInt32Ty(*DAG.getContext()),
- false, false, false, false,
- 0, CallingConv::C, false, true,
- DAG.getExternalSymbol("__tls_get_addr", PtrVT), Args, DAG, dl);
+ (const Type *) Type::getInt32Ty(*DAG.getContext()),
+ false, false, false, false, 0, CallingConv::C, false, true,
+ DAG.getExternalSymbol("__tls_get_addr", PtrVT), Args, DAG,
+ dl);
return CallResult.first;
- } else {
- SDValue Offset;
- if (GV->isDeclaration()) {
- // Initial Exec TLS Model
- SDValue TGA = DAG.getTargetGlobalAddress(GV, dl, MVT::i32, 0,
- MipsII::MO_GOTTPREL);
- Offset = DAG.getLoad(MVT::i32, dl,
- DAG.getEntryNode(), TGA, MachinePointerInfo(),
- false, false, 0);
- } else {
- // Local Exec TLS Model
- SDVTList VTs = DAG.getVTList(MVT::i32);
- SDValue TGAHi = DAG.getTargetGlobalAddress(GV, dl, MVT::i32, 0,
- MipsII::MO_TPREL_HI);
- SDValue TGALo = DAG.getTargetGlobalAddress(GV, dl, MVT::i32, 0,
- MipsII::MO_TPREL_LO);
- SDValue Hi = DAG.getNode(MipsISD::TprelHi, dl, VTs, &TGAHi, 1);
- SDValue Lo = DAG.getNode(MipsISD::TprelLo, dl, MVT::i32, TGALo);
- Offset = DAG.getNode(ISD::ADD, dl, MVT::i32, Hi, Lo);
- }
+ }
- SDValue ThreadPointer = DAG.getNode(MipsISD::ThreadPointer, dl, PtrVT);
- return DAG.getNode(ISD::ADD, dl, PtrVT, ThreadPointer, Offset);
+ SDValue Offset;
+ if (GV->isDeclaration()) {
+ // Initial Exec TLS Model
+ SDValue TGA = DAG.getTargetGlobalAddress(GV, dl, MVT::i32, 0,
+ MipsII::MO_GOTTPREL);
+ Offset = DAG.getLoad(MVT::i32, dl,
+ DAG.getEntryNode(), TGA, MachinePointerInfo(),
+ false, false, 0);
+ } else {
+ // Local Exec TLS Model
+ SDVTList VTs = DAG.getVTList(MVT::i32);
+ SDValue TGAHi = DAG.getTargetGlobalAddress(GV, dl, MVT::i32, 0,
+ MipsII::MO_TPREL_HI);
+ SDValue TGALo = DAG.getTargetGlobalAddress(GV, dl, MVT::i32, 0,
+ MipsII::MO_TPREL_LO);
+ SDValue Hi = DAG.getNode(MipsISD::TprelHi, dl, VTs, &TGAHi, 1);
+ SDValue Lo = DAG.getNode(MipsISD::TprelLo, dl, MVT::i32, TGALo);
+ Offset = DAG.getNode(ISD::ADD, dl, MVT::i32, Hi, Lo);
}
+
+ SDValue ThreadPointer = DAG.getNode(MipsISD::ThreadPointer, dl, PtrVT);
+ return DAG.getNode(ISD::ADD, dl, PtrVT, ThreadPointer, Offset);
}
SDValue MipsTargetLowering::
@@ -1550,8 +1545,8 @@ SDValue MipsTargetLowering::LowerFCOPYSIGN(SDValue Op, SelectionDAG &DAG)
SDValue MipsTargetLowering::
LowerFRAMEADDR(SDValue Op, SelectionDAG &DAG) const {
- unsigned Depth = cast<ConstantSDNode>(Op.getOperand(0))->getZExtValue();
- assert((Depth == 0) &&
+ // check the depth
+ assert((cast<ConstantSDNode>(Op.getOperand(0))->getZExtValue() == 0) &&
"Frame address can only be determined for current frame.");
MachineFrameInfo *MFI = DAG.getMachineFunction().getFrameInfo();
@@ -1770,6 +1765,10 @@ MipsTargetLowering::LowerCall(SDValue Chain, SDValue Callee,
if (IsPIC && !MipsFI->getGPFI())
MipsFI->setGPFI(MFI->CreateFixedObject(4, 0, true));
+ // Get the frame index of the stack frame object that points to the location
+ // of dynamically allocated area on the stack.
+ int DynAllocFI = MipsFI->getDynAllocFI();
+
// Update size of the maximum argument space.
// For O32, a minimum of four words (16 bytes) of argument space is
// allocated.
@@ -1781,14 +1780,17 @@ MipsTargetLowering::LowerCall(SDValue Chain, SDValue Callee,
if (MaxCallFrameSize < NextStackOffset) {
MipsFI->setMaxCallFrameSize(NextStackOffset);
- if (IsPIC) {
- // $gp restore slot must be aligned.
- unsigned StackAlignment = TFL->getStackAlignment();
- NextStackOffset = (NextStackOffset + StackAlignment - 1) /
- StackAlignment * StackAlignment;
- int GPFI = MipsFI->getGPFI();
- MFI->setObjectOffset(GPFI, NextStackOffset);
- }
+ // Set the offsets relative to $sp of the $gp restore slot and dynamically
+ // allocated stack space. These offsets must be aligned to a boundary
+ // determined by the stack alignment of the ABI.
+ unsigned StackAlignment = TFL->getStackAlignment();
+ NextStackOffset = (NextStackOffset + StackAlignment - 1) /
+ StackAlignment * StackAlignment;
+
+ if (IsPIC)
+ MFI->setObjectOffset(MipsFI->getGPFI(), NextStackOffset);
+
+ MFI->setObjectOffset(DynAllocFI, NextStackOffset);
}
// With EABI is it possible to have 16 args on registers.
@@ -1912,7 +1914,7 @@ MipsTargetLowering::LowerCall(SDValue Chain, SDValue Callee,
if (LoadSymAddr) {
// Load callee address
Callee = DAG.getNode(MipsISD::WrapperPIC, dl, MVT::i32, Callee);
- SDValue LoadValue = DAG.getLoad(MVT::i32, dl, Chain, Callee,
+ SDValue LoadValue = DAG.getLoad(MVT::i32, dl, DAG.getEntryNode(), Callee,
MachinePointerInfo::getGOT(),
false, false, 0);
@@ -1922,9 +1924,6 @@ MipsTargetLowering::LowerCall(SDValue Chain, SDValue Callee,
Callee = DAG.getNode(ISD::ADD, dl, MVT::i32, LoadValue, Lo);
} else
Callee = LoadValue;
-
- // Use chain output from LoadValue
- Chain = LoadValue.getValue(1);
}
// copy to T9
@@ -1965,7 +1964,8 @@ MipsTargetLowering::LowerCall(SDValue Chain, SDValue Callee,
InFlag = Chain.getValue(1);
// Create the CALLSEQ_END node.
- Chain = DAG.getCALLSEQ_END(Chain, DAG.getIntPtrConstant(NextStackOffset, true),
+ Chain = DAG.getCALLSEQ_END(Chain,
+ DAG.getIntPtrConstant(NextStackOffset, true),
DAG.getIntPtrConstant(0, true), InFlag);
InFlag = Chain.getValue(1);
@@ -2332,14 +2332,16 @@ MipsTargetLowering::getSingleConstraintMatchWeight(
return weight;
}
-/// getRegClassForInlineAsmConstraint - Given a constraint letter (e.g. "r"),
-/// return a list of registers that can be used to satisfy the constraint.
-/// This should only be used for C_RegisterClass constraints.
+/// Given a register class constraint, like 'r', if this corresponds directly
+/// to an LLVM register class, return a register of 0 and the register class
+/// pointer.
std::pair<unsigned, const TargetRegisterClass*> MipsTargetLowering::
getRegForInlineAsmConstraint(const std::string &Constraint, EVT VT) const
{
if (Constraint.size() == 1) {
switch (Constraint[0]) {
+ case 'd': // Address register. Same as 'r' unless generating MIPS16 code.
+ case 'y': // Same as 'r'. Exists for compatibility.
case 'r':
return std::make_pair(0U, Mips::CPURegsRegisterClass);
case 'f':
@@ -2348,55 +2350,12 @@ getRegForInlineAsmConstraint(const std::string &Constraint, EVT VT) const
if (VT == MVT::f64)
if ((!Subtarget->isSingleFloat()) && (!Subtarget->isFP64bit()))
return std::make_pair(0U, Mips::AFGR64RegisterClass);
+ break;
}
}
return TargetLowering::getRegForInlineAsmConstraint(Constraint, VT);
}
-/// Given a register class constraint, like 'r', if this corresponds directly
-/// to an LLVM register class, return a register of 0 and the register class
-/// pointer.
-std::vector<unsigned> MipsTargetLowering::
-getRegClassForInlineAsmConstraint(const std::string &Constraint,
- EVT VT) const
-{
- if (Constraint.size() != 1)
- return std::vector<unsigned>();
-
- switch (Constraint[0]) {
- default : break;
- case 'r':
- // GCC Mips Constraint Letters
- case 'd':
- case 'y':
- return make_vector<unsigned>(Mips::T0, Mips::T1, Mips::T2, Mips::T3,
- Mips::T4, Mips::T5, Mips::T6, Mips::T7, Mips::S0, Mips::S1,
- Mips::S2, Mips::S3, Mips::S4, Mips::S5, Mips::S6, Mips::S7,
- Mips::T8, 0);
-
- case 'f':
- if (VT == MVT::f32) {
- if (Subtarget->isSingleFloat())
- return make_vector<unsigned>(Mips::F2, Mips::F3, Mips::F4, Mips::F5,
- Mips::F6, Mips::F7, Mips::F8, Mips::F9, Mips::F10, Mips::F11,
- Mips::F20, Mips::F21, Mips::F22, Mips::F23, Mips::F24,
- Mips::F25, Mips::F26, Mips::F27, Mips::F28, Mips::F29,
- Mips::F30, Mips::F31, 0);
- else
- return make_vector<unsigned>(Mips::F2, Mips::F4, Mips::F6, Mips::F8,
- Mips::F10, Mips::F20, Mips::F22, Mips::F24, Mips::F26,
- Mips::F28, Mips::F30, 0);
- }
-
- if (VT == MVT::f64)
- if ((!Subtarget->isSingleFloat()) && (!Subtarget->isFP64bit()))
- return make_vector<unsigned>(Mips::D1, Mips::D2, Mips::D3, Mips::D4,
- Mips::D5, Mips::D10, Mips::D11, Mips::D12, Mips::D13,
- Mips::D14, Mips::D15, 0);
- }
- return std::vector<unsigned>();
-}
-
bool
MipsTargetLowering::isOffsetFoldingLegal(const GlobalAddressSDNode *GA) const {
// The Mips target isn't yet aware of offsets.
diff --git a/contrib/llvm/lib/Target/Mips/MipsISelLowering.h b/contrib/llvm/lib/Target/Mips/MipsISelLowering.h
index fbcedfd..bda26a2 100644
--- a/contrib/llvm/lib/Target/Mips/MipsISelLowering.h
+++ b/contrib/llvm/lib/Target/Mips/MipsISelLowering.h
@@ -79,7 +79,9 @@ namespace llvm {
BuildPairF64,
ExtractElementF64,
- WrapperPIC
+ WrapperPIC,
+
+ DynAlloc
};
}
@@ -167,10 +169,6 @@ namespace llvm {
getRegForInlineAsmConstraint(const std::string &Constraint,
EVT VT) const;
- std::vector<unsigned>
- getRegClassForInlineAsmConstraint(const std::string &Constraint,
- EVT VT) const;
-
virtual bool isOffsetFoldingLegal(const GlobalAddressSDNode *GA) const;
/// isFPImmLegal - Returns true if the target can instruction select the
diff --git a/contrib/llvm/lib/Target/Mips/MipsInstrInfo.cpp b/contrib/llvm/lib/Target/Mips/MipsInstrInfo.cpp
index be044fa..0a7a7f2 100644
--- a/contrib/llvm/lib/Target/Mips/MipsInstrInfo.cpp
+++ b/contrib/llvm/lib/Target/Mips/MipsInstrInfo.cpp
@@ -14,18 +14,27 @@
#include "MipsInstrInfo.h"
#include "MipsTargetMachine.h"
#include "MipsMachineFunction.h"
-#include "llvm/ADT/STLExtras.h"
+#include "InstPrinter/MipsInstPrinter.h"
#include "llvm/CodeGen/MachineInstrBuilder.h"
#include "llvm/CodeGen/MachineRegisterInfo.h"
+#include "llvm/Target/TargetRegistry.h"
#include "llvm/Support/ErrorHandling.h"
+#include "llvm/ADT/STLExtras.h"
+
+#define GET_INSTRINFO_CTOR
#include "MipsGenInstrInfo.inc"
using namespace llvm;
MipsInstrInfo::MipsInstrInfo(MipsTargetMachine &tm)
- : TargetInstrInfoImpl(MipsInsts, array_lengthof(MipsInsts)),
+ : MipsGenInstrInfo(Mips::ADJCALLSTACKDOWN, Mips::ADJCALLSTACKUP),
TM(tm), RI(*TM.getSubtargetImpl(), *this) {}
+
+const MipsRegisterInfo &MipsInstrInfo::getRegisterInfo() const {
+ return RI;
+}
+
static bool isZeroImm(const MachineOperand &op) {
return op.isImm() && op.getImm() == 0;
}
@@ -40,10 +49,10 @@ isLoadFromStackSlot(const MachineInstr *MI, int &FrameIndex) const
{
if ((MI->getOpcode() == Mips::LW) || (MI->getOpcode() == Mips::LWC1) ||
(MI->getOpcode() == Mips::LDC1)) {
- if ((MI->getOperand(2).isFI()) && // is a stack slot
- (MI->getOperand(1).isImm()) && // the imm is zero
- (isZeroImm(MI->getOperand(1)))) {
- FrameIndex = MI->getOperand(2).getIndex();
+ if ((MI->getOperand(1).isFI()) && // is a stack slot
+ (MI->getOperand(2).isImm()) && // the imm is zero
+ (isZeroImm(MI->getOperand(2)))) {
+ FrameIndex = MI->getOperand(1).getIndex();
return MI->getOperand(0).getReg();
}
}
@@ -61,10 +70,10 @@ isStoreToStackSlot(const MachineInstr *MI, int &FrameIndex) const
{
if ((MI->getOpcode() == Mips::SW) || (MI->getOpcode() == Mips::SWC1) ||
(MI->getOpcode() == Mips::SDC1)) {
- if ((MI->getOperand(2).isFI()) && // is a stack slot
- (MI->getOperand(1).isImm()) && // the imm is zero
- (isZeroImm(MI->getOperand(1)))) {
- FrameIndex = MI->getOperand(2).getIndex();
+ if ((MI->getOperand(1).isFI()) && // is a stack slot
+ (MI->getOperand(2).isImm()) && // the imm is zero
+ (isZeroImm(MI->getOperand(2)))) {
+ FrameIndex = MI->getOperand(1).getIndex();
return MI->getOperand(0).getReg();
}
}
@@ -161,25 +170,25 @@ storeRegToStackSlot(MachineBasicBlock &MBB, MachineBasicBlock::iterator I,
if (RC == Mips::CPURegsRegisterClass)
BuildMI(MBB, I, DL, get(Mips::SW)).addReg(SrcReg, getKillRegState(isKill))
- .addImm(0).addFrameIndex(FI);
+ .addFrameIndex(FI).addImm(0);
else if (RC == Mips::FGR32RegisterClass)
BuildMI(MBB, I, DL, get(Mips::SWC1)).addReg(SrcReg, getKillRegState(isKill))
- .addImm(0).addFrameIndex(FI);
+ .addFrameIndex(FI).addImm(0);
else if (RC == Mips::AFGR64RegisterClass) {
if (!TM.getSubtarget<MipsSubtarget>().isMips1()) {
BuildMI(MBB, I, DL, get(Mips::SDC1))
.addReg(SrcReg, getKillRegState(isKill))
- .addImm(0).addFrameIndex(FI);
+ .addFrameIndex(FI).addImm(0);
} else {
const TargetRegisterInfo *TRI =
MBB.getParent()->getTarget().getRegisterInfo();
const unsigned *SubSet = TRI->getSubRegisters(SrcReg);
BuildMI(MBB, I, DL, get(Mips::SWC1))
.addReg(SubSet[0], getKillRegState(isKill))
- .addImm(0).addFrameIndex(FI);
+ .addFrameIndex(FI).addImm(0);
BuildMI(MBB, I, DL, get(Mips::SWC1))
.addReg(SubSet[1], getKillRegState(isKill))
- .addImm(4).addFrameIndex(FI);
+ .addFrameIndex(FI).addImm(4);
}
} else
llvm_unreachable("Register class not handled!");
@@ -195,25 +204,34 @@ loadRegFromStackSlot(MachineBasicBlock &MBB, MachineBasicBlock::iterator I,
if (I != MBB.end()) DL = I->getDebugLoc();
if (RC == Mips::CPURegsRegisterClass)
- BuildMI(MBB, I, DL, get(Mips::LW), DestReg).addImm(0).addFrameIndex(FI);
+ BuildMI(MBB, I, DL, get(Mips::LW), DestReg).addFrameIndex(FI).addImm(0);
else if (RC == Mips::FGR32RegisterClass)
- BuildMI(MBB, I, DL, get(Mips::LWC1), DestReg).addImm(0).addFrameIndex(FI);
+ BuildMI(MBB, I, DL, get(Mips::LWC1), DestReg).addFrameIndex(FI).addImm(0);
else if (RC == Mips::AFGR64RegisterClass) {
if (!TM.getSubtarget<MipsSubtarget>().isMips1()) {
- BuildMI(MBB, I, DL, get(Mips::LDC1), DestReg).addImm(0).addFrameIndex(FI);
+ BuildMI(MBB, I, DL, get(Mips::LDC1), DestReg).addFrameIndex(FI).addImm(0);
} else {
const TargetRegisterInfo *TRI =
MBB.getParent()->getTarget().getRegisterInfo();
const unsigned *SubSet = TRI->getSubRegisters(DestReg);
BuildMI(MBB, I, DL, get(Mips::LWC1), SubSet[0])
- .addImm(0).addFrameIndex(FI);
+ .addFrameIndex(FI).addImm(0);
BuildMI(MBB, I, DL, get(Mips::LWC1), SubSet[1])
- .addImm(4).addFrameIndex(FI);
+ .addFrameIndex(FI).addImm(4);
}
} else
llvm_unreachable("Register class not handled!");
}
+MachineInstr*
+MipsInstrInfo::emitFrameIndexDebugValue(MachineFunction &MF, int FrameIx,
+ uint64_t Offset, const MDNode *MDPtr,
+ DebugLoc DL) const {
+ MachineInstrBuilder MIB = BuildMI(MF, DL, get(Mips::DBG_VALUE))
+ .addFrameIndex(FrameIx).addImm(0).addImm(Offset).addMetadata(MDPtr);
+ return &*MIB;
+}
+
//===----------------------------------------------------------------------===//
// Branch Analysis
//===----------------------------------------------------------------------===//
@@ -341,8 +359,8 @@ void MipsInstrInfo::BuildCondBr(MachineBasicBlock &MBB,
const SmallVectorImpl<MachineOperand>& Cond)
const {
unsigned Opc = Cond[0].getImm();
- const TargetInstrDesc &TID = get(Opc);
- MachineInstrBuilder MIB = BuildMI(&MBB, DL, TID);
+ const MCInstrDesc &MCID = get(Opc);
+ MachineInstrBuilder MIB = BuildMI(&MBB, DL, MCID);
for (unsigned i = 1; i < Cond.size(); ++i)
MIB.addReg(Cond[i].getReg());
diff --git a/contrib/llvm/lib/Target/Mips/MipsInstrInfo.h b/contrib/llvm/lib/Target/Mips/MipsInstrInfo.h
index abf6773..4421c48 100644
--- a/contrib/llvm/lib/Target/Mips/MipsInstrInfo.h
+++ b/contrib/llvm/lib/Target/Mips/MipsInstrInfo.h
@@ -19,103 +19,15 @@
#include "llvm/Target/TargetInstrInfo.h"
#include "MipsRegisterInfo.h"
+#define GET_INSTRINFO_HEADER
+#include "MipsGenInstrInfo.inc"
+
namespace llvm {
namespace Mips {
-
- // Mips Branch Codes
- enum FPBranchCode {
- BRANCH_F,
- BRANCH_T,
- BRANCH_FL,
- BRANCH_TL,
- BRANCH_INVALID
- };
-
- // Mips Condition Codes
- enum CondCode {
- // To be used with float branch True
- FCOND_F,
- FCOND_UN,
- FCOND_OEQ,
- FCOND_UEQ,
- FCOND_OLT,
- FCOND_ULT,
- FCOND_OLE,
- FCOND_ULE,
- FCOND_SF,
- FCOND_NGLE,
- FCOND_SEQ,
- FCOND_NGL,
- FCOND_LT,
- FCOND_NGE,
- FCOND_LE,
- FCOND_NGT,
-
- // To be used with float branch False
- // This conditions have the same mnemonic as the
- // above ones, but are used with a branch False;
- FCOND_T,
- FCOND_OR,
- FCOND_UNE,
- FCOND_ONE,
- FCOND_UGE,
- FCOND_OGE,
- FCOND_UGT,
- FCOND_OGT,
- FCOND_ST,
- FCOND_GLE,
- FCOND_SNE,
- FCOND_GL,
- FCOND_NLT,
- FCOND_GE,
- FCOND_NLE,
- FCOND_GT
- };
-
/// GetOppositeBranchOpc - Return the inverse of the specified
/// opcode, e.g. turning BEQ to BNE.
unsigned GetOppositeBranchOpc(unsigned Opc);
-
- /// MipsCCToString - Map each FP condition code to its string
- inline static const char *MipsFCCToString(Mips::CondCode CC)
- {
- switch (CC) {
- default: llvm_unreachable("Unknown condition code");
- case FCOND_F:
- case FCOND_T: return "f";
- case FCOND_UN:
- case FCOND_OR: return "un";
- case FCOND_OEQ:
- case FCOND_UNE: return "eq";
- case FCOND_UEQ:
- case FCOND_ONE: return "ueq";
- case FCOND_OLT:
- case FCOND_UGE: return "olt";
- case FCOND_ULT:
- case FCOND_OGE: return "ult";
- case FCOND_OLE:
- case FCOND_UGT: return "ole";
- case FCOND_ULE:
- case FCOND_OGT: return "ule";
- case FCOND_SF:
- case FCOND_ST: return "sf";
- case FCOND_NGLE:
- case FCOND_GLE: return "ngle";
- case FCOND_SEQ:
- case FCOND_SNE: return "seq";
- case FCOND_NGL:
- case FCOND_GL: return "ngl";
- case FCOND_LT:
- case FCOND_NLT: return "lt";
- case FCOND_NGE:
- case FCOND_GE: return "nge";
- case FCOND_LE:
- case FCOND_NLE: return "le";
- case FCOND_NGT:
- case FCOND_GT: return "ngt";
- }
- }
}
/// MipsII - This namespace holds all of the target specific flags that
@@ -164,7 +76,7 @@ namespace MipsII {
};
}
-class MipsInstrInfo : public TargetInstrInfoImpl {
+class MipsInstrInfo : public MipsGenInstrInfo {
MipsTargetMachine &TM;
const MipsRegisterInfo RI;
public:
@@ -174,7 +86,7 @@ public:
/// such, whenever a client has an instance of instruction info, it should
/// always be able to get register info as well (through this method).
///
- virtual const MipsRegisterInfo &getRegisterInfo() const { return RI; }
+ virtual const MipsRegisterInfo &getRegisterInfo() const;
/// isLoadFromStackSlot - If the specified machine instruction is a direct
/// load from a stack slot, return the virtual or physical register number of
@@ -224,6 +136,11 @@ public:
const TargetRegisterClass *RC,
const TargetRegisterInfo *TRI) const;
+ virtual MachineInstr* emitFrameIndexDebugValue(MachineFunction &MF,
+ int FrameIx, uint64_t Offset,
+ const MDNode *MDPtr,
+ DebugLoc DL) const;
+
virtual
bool ReverseBranchCondition(SmallVectorImpl<MachineOperand> &Cond) const;
diff --git a/contrib/llvm/lib/Target/Mips/MipsInstrInfo.td b/contrib/llvm/lib/Target/Mips/MipsInstrInfo.td
index 329a002..d1a0587 100644
--- a/contrib/llvm/lib/Target/Mips/MipsInstrInfo.td
+++ b/contrib/llvm/lib/Target/Mips/MipsInstrInfo.td
@@ -39,6 +39,9 @@ def SDT_MipsDivRem : SDTypeProfile<0, 2,
def SDT_MipsThreadPointer : SDTypeProfile<1, 0, [SDTCisPtrTy<0>]>;
+def SDT_MipsDynAlloc : SDTypeProfile<1, 1, [SDTCisVT<0, i32>,
+ SDTCisVT<1, iPTR>]>;
+
// Call
def MipsJmpLink : SDNode<"MipsISD::JmpLink",SDT_MipsJmpLink,
[SDNPHasChain, SDNPOutGlue, SDNPOptInGlue,
@@ -99,6 +102,10 @@ def MipsDivRemU : SDNode<"MipsISD::DivRemU", SDT_MipsDivRem,
def MipsWrapperPIC : SDNode<"MipsISD::WrapperPIC", SDTIntUnaryOp>;
+// Pointer to dynamically allocated stack area.
+def MipsDynAlloc : SDNode<"MipsISD::DynAlloc", SDT_MipsDynAlloc,
+ [SDNPHasChain, SDNPInGlue]>;
+
//===----------------------------------------------------------------------===//
// Mips Instruction Predicate Definitions.
//===----------------------------------------------------------------------===//
@@ -127,7 +134,12 @@ def uimm16 : Operand<i32> {
// Address operand
def mem : Operand<i32> {
let PrintMethod = "printMemOperand";
- let MIOperandInfo = (ops simm16, CPURegs);
+ let MIOperandInfo = (ops CPURegs, simm16);
+}
+
+def mem_ea : Operand<i32> {
+ let PrintMethod = "printMemOperandEA";
+ let MIOperandInfo = (ops CPURegs, simm16);
}
// Transformation Function - get the lower 16 bits.
@@ -344,7 +356,7 @@ class MoveToLOHI<bits<6> func, string instr_asm>:
!strconcat(instr_asm, "\t$src"), [], IIHiLo>;
class EffectiveAddress<string instr_asm> :
- FI<0x09, (outs CPURegs:$dst), (ins mem:$addr),
+ FI<0x09, (outs CPURegs:$dst), (ins mem_ea:$addr),
instr_asm, [(set CPURegs:$dst, addr:$addr)], IIAlu>;
// Count Leading Ones/Zeros in Word
@@ -412,7 +424,7 @@ def ATMACRO : MipsPseudo<(outs), (ins), ".set\tat", []>;
// are used, we have the same behavior, but get also a bunch of warnings
// from the assembler.
def CPLOAD : MipsPseudo<(outs), (ins CPURegs:$picreg), ".cpload\t$picreg", []>;
-def CPRESTORE : MipsPseudo<(outs), (ins i32imm:$loc), ".cprestore\t$loc\n", []>;
+def CPRESTORE : MipsPseudo<(outs), (ins i32imm:$loc), ".cprestore\t$loc", []>;
let usesCustomInserter = 1 in {
def ATOMIC_LOAD_ADD_I8 : MipsPseudo<
@@ -673,7 +685,13 @@ let addr=0 in
// instructions. The same not happens for stack address copies, so an
// add op with mem ComplexPattern is used and the stack address copy
// can be matched. It's similar to Sparc LEA_ADDRi
-def LEA_ADDiu : EffectiveAddress<"addiu\t$dst, ${addr:stackloc}">;
+def LEA_ADDiu : EffectiveAddress<"addiu\t$dst, $addr">;
+
+// DynAlloc node points to dynamically allocated stack space.
+// $sp is added to the list of implicitly used registers to prevent dead code
+// elimination from removing instructions that modify $sp.
+let Uses = [SP] in
+def DynAlloc : EffectiveAddress<"addiu\t$dst, $addr">;
// MADD*/MSUB*
def MADD : MArithR<0, "madd", MipsMAdd, 1>;
@@ -852,6 +870,9 @@ def : Pat<(setge CPURegs:$lhs, immSExt16:$rhs),
def : Pat<(setuge CPURegs:$lhs, immSExt16:$rhs),
(XORi (SLTiu CPURegs:$lhs, immSExt16:$rhs), 1)>;
+// select MipsDynAlloc
+def : Pat<(MipsDynAlloc addr:$f), (DynAlloc addr:$f)>;
+
//===----------------------------------------------------------------------===//
// Floating Point Support
//===----------------------------------------------------------------------===//
diff --git a/contrib/llvm/lib/Target/Mips/MipsMCInstLower.cpp b/contrib/llvm/lib/Target/Mips/MipsMCInstLower.cpp
new file mode 100644
index 0000000..f5cc3aa
--- /dev/null
+++ b/contrib/llvm/lib/Target/Mips/MipsMCInstLower.cpp
@@ -0,0 +1,118 @@
+//===-- MipsMCInstLower.cpp - Convert Mips MachineInstr to MCInst ---------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+//
+// This file contains code to lower Mips MachineInstrs to their corresponding
+// MCInst records.
+//
+//===----------------------------------------------------------------------===//
+
+#include "MipsMCInstLower.h"
+#include "MipsAsmPrinter.h"
+#include "MipsInstrInfo.h"
+#include "MipsMCSymbolRefExpr.h"
+#include "llvm/CodeGen/MachineFunction.h"
+#include "llvm/CodeGen/MachineInstr.h"
+#include "llvm/CodeGen/MachineOperand.h"
+#include "llvm/MC/MCContext.h"
+#include "llvm/MC/MCInst.h"
+#include "llvm/Target/Mangler.h"
+using namespace llvm;
+
+MipsMCInstLower::MipsMCInstLower(Mangler *mang, const MachineFunction &mf,
+ MipsAsmPrinter &asmprinter)
+ : Ctx(mf.getContext()), Mang(mang), AsmPrinter(asmprinter) {}
+
+MCOperand MipsMCInstLower::LowerSymbolOperand(const MachineOperand &MO,
+ MachineOperandType MOTy) const {
+ MipsMCSymbolRefExpr::VariantKind Kind;
+ const MCSymbol *Symbol;
+ int Offset = 0;
+
+ switch(MO.getTargetFlags()) {
+ default: assert(0 && "Invalid target flag!");
+ case MipsII::MO_NO_FLAG: Kind = MipsMCSymbolRefExpr::VK_Mips_None; break;
+ case MipsII::MO_GPREL: Kind = MipsMCSymbolRefExpr::VK_Mips_GPREL; break;
+ case MipsII::MO_GOT_CALL: Kind = MipsMCSymbolRefExpr::VK_Mips_GOT_CALL; break;
+ case MipsII::MO_GOT: Kind = MipsMCSymbolRefExpr::VK_Mips_GOT; break;
+ case MipsII::MO_ABS_HI: Kind = MipsMCSymbolRefExpr::VK_Mips_ABS_HI; break;
+ case MipsII::MO_ABS_LO: Kind = MipsMCSymbolRefExpr::VK_Mips_ABS_LO; break;
+ case MipsII::MO_TLSGD: Kind = MipsMCSymbolRefExpr::VK_Mips_TLSGD; break;
+ case MipsII::MO_GOTTPREL: Kind = MipsMCSymbolRefExpr::VK_Mips_GOTTPREL; break;
+ case MipsII::MO_TPREL_HI: Kind = MipsMCSymbolRefExpr::VK_Mips_TPREL_HI; break;
+ case MipsII::MO_TPREL_LO: Kind = MipsMCSymbolRefExpr::VK_Mips_TPREL_LO; break;
+ }
+
+ switch (MOTy) {
+ case MachineOperand::MO_MachineBasicBlock:
+ Symbol = MO.getMBB()->getSymbol();
+ break;
+
+ case MachineOperand::MO_GlobalAddress:
+ Symbol = Mang->getSymbol(MO.getGlobal());
+ break;
+
+ case MachineOperand::MO_BlockAddress:
+ Symbol = AsmPrinter.GetBlockAddressSymbol(MO.getBlockAddress());
+ break;
+
+ case MachineOperand::MO_ExternalSymbol:
+ Symbol = AsmPrinter.GetExternalSymbolSymbol(MO.getSymbolName());
+ break;
+
+ case MachineOperand::MO_JumpTableIndex:
+ Symbol = AsmPrinter.GetJTISymbol(MO.getIndex());
+ break;
+
+ case MachineOperand::MO_ConstantPoolIndex:
+ Symbol = AsmPrinter.GetCPISymbol(MO.getIndex());
+ if (MO.getOffset())
+ Offset = MO.getOffset();
+ break;
+
+ default:
+ llvm_unreachable("<unknown operand type>");
+ }
+
+ return MCOperand::CreateExpr(MipsMCSymbolRefExpr::Create(Kind, Symbol, Offset,
+ Ctx));
+}
+
+void MipsMCInstLower::Lower(const MachineInstr *MI, MCInst &OutMI) const {
+ OutMI.setOpcode(MI->getOpcode());
+
+ for (unsigned i = 0, e = MI->getNumOperands(); i != e; ++i) {
+ const MachineOperand &MO = MI->getOperand(i);
+ MCOperand MCOp;
+ MachineOperandType MOTy = MO.getType();
+
+ switch (MOTy) {
+ default:
+ MI->dump();
+ llvm_unreachable("unknown operand type");
+ case MachineOperand::MO_Register:
+ // Ignore all implicit register operands.
+ if (MO.isImplicit()) continue;
+ MCOp = MCOperand::CreateReg(MO.getReg());
+ break;
+ case MachineOperand::MO_Immediate:
+ MCOp = MCOperand::CreateImm(MO.getImm());
+ break;
+ case MachineOperand::MO_MachineBasicBlock:
+ case MachineOperand::MO_GlobalAddress:
+ case MachineOperand::MO_ExternalSymbol:
+ case MachineOperand::MO_JumpTableIndex:
+ case MachineOperand::MO_ConstantPoolIndex:
+ case MachineOperand::MO_BlockAddress:
+ MCOp = LowerSymbolOperand(MO, MOTy);
+ break;
+ }
+
+ OutMI.addOperand(MCOp);
+ }
+}
diff --git a/contrib/llvm/lib/Target/Mips/MipsMCInstLower.h b/contrib/llvm/lib/Target/Mips/MipsMCInstLower.h
new file mode 100644
index 0000000..ec5201b
--- /dev/null
+++ b/contrib/llvm/lib/Target/Mips/MipsMCInstLower.h
@@ -0,0 +1,43 @@
+//===-- MipsMCInstLower.h - Lower MachineInstr to MCInst -------------------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+#ifndef MIPSMCINSTLOWER_H
+#define MIPSMCINSTLOWER_H
+#include "llvm/CodeGen/MachineOperand.h"
+#include "llvm/Support/Compiler.h"
+
+namespace llvm {
+ class MCAsmInfo;
+ class MCContext;
+ class MCInst;
+ class MCOperand;
+ class MCSymbol;
+ class MachineInstr;
+ class MachineFunction;
+ class Mangler;
+ class MipsAsmPrinter;
+
+/// MipsMCInstLower - This class is used to lower an MachineInstr into an
+// MCInst.
+class LLVM_LIBRARY_VISIBILITY MipsMCInstLower {
+ typedef MachineOperand::MachineOperandType MachineOperandType;
+ MCContext &Ctx;
+ Mangler *Mang;
+ MipsAsmPrinter &AsmPrinter;
+public:
+ MipsMCInstLower(Mangler *mang, const MachineFunction &MF,
+ MipsAsmPrinter &asmprinter);
+ void Lower(const MachineInstr *MI, MCInst &OutMI) const;
+private:
+ MCOperand LowerSymbolOperand(const MachineOperand &MO,
+ MachineOperandType MOTy) const;
+};
+}
+
+#endif
diff --git a/contrib/llvm/lib/Target/Mips/MipsMCSymbolRefExpr.cpp b/contrib/llvm/lib/Target/Mips/MipsMCSymbolRefExpr.cpp
new file mode 100644
index 0000000..9a2bdae
--- /dev/null
+++ b/contrib/llvm/lib/Target/Mips/MipsMCSymbolRefExpr.cpp
@@ -0,0 +1,63 @@
+//===-- MipsMCSymbolRefExpr.cpp - Mips specific MC expression classes -----===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+#define DEBUG_TYPE "mipsmcsymbolrefexpr"
+#include "MipsMCSymbolRefExpr.h"
+#include "llvm/MC/MCAssembler.h"
+#include "llvm/MC/MCContext.h"
+#include "llvm/MC/MCSymbol.h"
+using namespace llvm;
+
+const MipsMCSymbolRefExpr*
+MipsMCSymbolRefExpr::Create(VariantKind Kind, const MCSymbol *Symbol,
+ int Offset, MCContext &Ctx) {
+ return new (Ctx) MipsMCSymbolRefExpr(Kind, Symbol, Offset);
+}
+
+void MipsMCSymbolRefExpr::PrintImpl(raw_ostream &OS) const {
+ switch (Kind) {
+ default: assert(0 && "Invalid kind!");
+ case VK_Mips_None: break;
+ case VK_Mips_GPREL: OS << "%gp_rel("; break;
+ case VK_Mips_GOT_CALL: OS << "%call16("; break;
+ case VK_Mips_GOT: OS << "%got("; break;
+ case VK_Mips_ABS_HI: OS << "%hi("; break;
+ case VK_Mips_ABS_LO: OS << "%lo("; break;
+ case VK_Mips_TLSGD: OS << "%tlsgd("; break;
+ case VK_Mips_GOTTPREL: OS << "%gottprel("; break;
+ case VK_Mips_TPREL_HI: OS << "%tprel_hi("; break;
+ case VK_Mips_TPREL_LO: OS << "%tprel_lo("; break;
+ }
+
+ OS << *Symbol;
+
+ if (Offset) {
+ if (Offset > 0)
+ OS << '+';
+ OS << Offset;
+ }
+
+ if (Kind != VK_Mips_None)
+ OS << ')';
+}
+
+bool
+MipsMCSymbolRefExpr::EvaluateAsRelocatableImpl(MCValue &Res,
+ const MCAsmLayout *Layout) const {
+ return false;
+}
+
+void MipsMCSymbolRefExpr::AddValueSymbols(MCAssembler *Asm) const {
+ Asm->getOrCreateSymbolData(*Symbol);
+}
+
+const MCSection *MipsMCSymbolRefExpr::FindAssociatedSection() const {
+ return Symbol->isDefined() ? &Symbol->getSection() : NULL;
+}
+
diff --git a/contrib/llvm/lib/Target/Mips/MipsMCSymbolRefExpr.h b/contrib/llvm/lib/Target/Mips/MipsMCSymbolRefExpr.h
new file mode 100644
index 0000000..3e69596
--- /dev/null
+++ b/contrib/llvm/lib/Target/Mips/MipsMCSymbolRefExpr.h
@@ -0,0 +1,62 @@
+//===-- MipsMCSymbolRefExpr.h - Mips specific MCSymbolRefExpr class -------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+#ifndef MIPSMCSYMBOLREFEXPR_H
+#define MIPSMCSYMBOLREFEXPR_H
+#include "llvm/MC/MCExpr.h"
+
+namespace llvm {
+
+class MipsMCSymbolRefExpr : public MCTargetExpr {
+public:
+ enum VariantKind {
+ VK_Mips_None,
+ VK_Mips_GPREL,
+ VK_Mips_GOT_CALL,
+ VK_Mips_GOT,
+ VK_Mips_ABS_HI,
+ VK_Mips_ABS_LO,
+ VK_Mips_TLSGD,
+ VK_Mips_GOTTPREL,
+ VK_Mips_TPREL_HI,
+ VK_Mips_TPREL_LO
+ };
+
+private:
+ const VariantKind Kind;
+ const MCSymbol *Symbol;
+ int Offset;
+
+ explicit MipsMCSymbolRefExpr(VariantKind _Kind, const MCSymbol *_Symbol,
+ int _Offset)
+ : Kind(_Kind), Symbol(_Symbol), Offset(_Offset) {}
+
+public:
+ static const MipsMCSymbolRefExpr *Create(VariantKind Kind,
+ const MCSymbol *Symbol, int Offset,
+ MCContext &Ctx);
+
+ void PrintImpl(raw_ostream &OS) const;
+ bool EvaluateAsRelocatableImpl(MCValue &Res,
+ const MCAsmLayout *Layout) const;
+ void AddValueSymbols(MCAssembler *) const;
+ const MCSection *FindAssociatedSection() const;
+
+ static bool classof(const MCExpr *E) {
+ return E->getKind() == MCExpr::Target;
+ }
+
+ static bool classof(const MipsMCSymbolRefExpr *) { return true; }
+
+ int getOffset() const { return Offset; }
+ void setOffset(int O) { Offset = O; }
+};
+} // end namespace llvm
+
+#endif
diff --git a/contrib/llvm/lib/Target/Mips/MipsMachineFunction.h b/contrib/llvm/lib/Target/Mips/MipsMachineFunction.h
index df40e6c..dbb7a67 100644
--- a/contrib/llvm/lib/Target/Mips/MipsMachineFunction.h
+++ b/contrib/llvm/lib/Target/Mips/MipsMachineFunction.h
@@ -27,6 +27,7 @@ namespace llvm {
class MipsFunctionInfo : public MachineFunctionInfo {
private:
+ MachineFunction& MF;
/// SRetReturnReg - Some subtargets require that sret lowering includes
/// returning the value of the returned struct in a register. This field
/// holds the virtual register into which the sret argument is passed.
@@ -47,6 +48,7 @@ private:
// LowerCall except for the frame object for restoring $gp.
std::pair<int, int> InArgFIRange, OutArgFIRange;
int GPFI; // Index of the frame object for restoring $gp
+ mutable int DynAllocFI; // Frame index of dynamically allocated stack area.
unsigned MaxCallFrameSize;
/// AtomicFrameIndex - To implement atomic.swap and atomic.cmp.swap
@@ -55,10 +57,10 @@ private:
int AtomicFrameIndex;
public:
MipsFunctionInfo(MachineFunction& MF)
- : SRetReturnReg(0), GlobalBaseReg(0),
+ : MF(MF), SRetReturnReg(0), GlobalBaseReg(0),
VarArgsFrameIndex(0), InArgFIRange(std::make_pair(-1, 0)),
- OutArgFIRange(std::make_pair(-1, 0)), GPFI(0), MaxCallFrameSize(0),
- AtomicFrameIndex(-1)
+ OutArgFIRange(std::make_pair(-1, 0)), GPFI(0), DynAllocFI(0),
+ MaxCallFrameSize(0), AtomicFrameIndex(-1)
{}
bool isInArgFI(int FI) const {
@@ -81,6 +83,16 @@ public:
bool needGPSaveRestore() const { return getGPFI(); }
bool isGPFI(int FI) const { return GPFI && GPFI == FI; }
+ // The first call to this function creates a frame object for dynamically
+ // allocated stack area.
+ int getDynAllocFI() const {
+ if (!DynAllocFI)
+ DynAllocFI = MF.getFrameInfo()->CreateFixedObject(4, 0, true);
+
+ return DynAllocFI;
+ }
+ bool isDynAllocFI(int FI) const { return DynAllocFI && DynAllocFI == FI; }
+
unsigned getSRetReturnReg() const { return SRetReturnReg; }
void setSRetReturnReg(unsigned Reg) { SRetReturnReg = Reg; }
diff --git a/contrib/llvm/lib/Target/Mips/MipsRegisterInfo.cpp b/contrib/llvm/lib/Target/Mips/MipsRegisterInfo.cpp
index b0984af..24390da 100644
--- a/contrib/llvm/lib/Target/Mips/MipsRegisterInfo.cpp
+++ b/contrib/llvm/lib/Target/Mips/MipsRegisterInfo.cpp
@@ -35,13 +35,16 @@
#include "llvm/Support/raw_ostream.h"
#include "llvm/ADT/BitVector.h"
#include "llvm/ADT/STLExtras.h"
+#include "llvm/Analysis/DebugInfo.h"
+
+#define GET_REGINFO_TARGET_DESC
+#include "MipsGenRegisterInfo.inc"
using namespace llvm;
MipsRegisterInfo::MipsRegisterInfo(const MipsSubtarget &ST,
const TargetInstrInfo &tii)
- : MipsGenRegisterInfo(Mips::ADJCALLSTACKDOWN, Mips::ADJCALLSTACKUP),
- Subtarget(ST), TII(tii) {}
+ : MipsGenRegisterInfo(), Subtarget(ST), TII(tii) {}
/// getRegisterNumbering - Given the enum value for some register, e.g.
/// Mips::RA, return the number that it corresponds to (e.g. 31).
@@ -176,28 +179,6 @@ eliminateFrameIndex(MachineBasicBlock::iterator II, int SPAdj,
<< "spOffset : " << spOffset << "\n"
<< "stackSize : " << stackSize << "\n");
- int Offset;
-
- // Calculate final offset.
- // - There is no need to change the offset if the frame object is an outgoing
- // argument or a $gp restore location,
- // - If the frame object is any of the following, its offset must be adjusted
- // by adding the size of the stack:
- // incoming argument, callee-saved register location or local variable.
- if (MipsFI->isOutArgFI(FrameIndex) || MipsFI->isGPFI(FrameIndex))
- Offset = spOffset;
- else
- Offset = spOffset + stackSize;
-
- Offset += MI.getOperand(i-1).getImm();
-
- DEBUG(errs() << "Offset : " << Offset << "\n" << "<--------->\n");
-
- unsigned NewReg = 0;
- int NewImm = 0;
- MachineBasicBlock &MBB = *MI.getParent();
- bool ATUsed;
- unsigned FrameReg;
const std::vector<CalleeSavedInfo> &CSI = MFI->getCalleeSavedInfo();
int MinCSFI = 0;
int MaxCSFI = -1;
@@ -213,42 +194,54 @@ eliminateFrameIndex(MachineBasicBlock::iterator II, int SPAdj,
// 3. Locations for callee-saved registers.
// Everything else is referenced relative to whatever register
// getFrameRegister() returns.
- if (MipsFI->isOutArgFI(FrameIndex) ||
+ unsigned FrameReg;
+
+ if (MipsFI->isOutArgFI(FrameIndex) || MipsFI->isDynAllocFI(FrameIndex) ||
(FrameIndex >= MinCSFI && FrameIndex <= MaxCSFI))
FrameReg = Mips::SP;
else
FrameReg = getFrameRegister(MF);
- // Offset fits in the 16-bit field
- if (Offset < 0x8000 && Offset >= -0x8000) {
- NewReg = FrameReg;
- NewImm = Offset;
- ATUsed = false;
- }
- else {
- const TargetInstrInfo *TII = MF.getTarget().getInstrInfo();
+ // Calculate final offset.
+ // - There is no need to change the offset if the frame object is one of the
+ // following: an outgoing argument, pointer to a dynamically allocated
+ // stack space or a $gp restore location,
+ // - If the frame object is any of the following, its offset must be adjusted
+ // by adding the size of the stack:
+ // incoming argument, callee-saved register location or local variable.
+ int Offset;
+
+ if (MipsFI->isOutArgFI(FrameIndex) || MipsFI->isGPFI(FrameIndex) ||
+ MipsFI->isDynAllocFI(FrameIndex))
+ Offset = spOffset;
+ else
+ Offset = spOffset + stackSize;
+
+ Offset += MI.getOperand(i+1).getImm();
+
+ DEBUG(errs() << "Offset : " << Offset << "\n" << "<--------->\n");
+
+ // If MI is not a debug value, make sure Offset fits in the 16-bit immediate
+ // field.
+ if (!MI.isDebugValue() && (Offset >= 0x8000 || Offset < -0x8000)) {
+ MachineBasicBlock &MBB = *MI.getParent();
DebugLoc DL = II->getDebugLoc();
- int ImmLo = (short)(Offset & 0xffff);
int ImmHi = (((unsigned)Offset & 0xffff0000) >> 16) +
((Offset & 0x8000) != 0);
// FIXME: change this when mips goes MC".
- BuildMI(MBB, II, DL, TII->get(Mips::NOAT));
- BuildMI(MBB, II, DL, TII->get(Mips::LUi), Mips::AT).addImm(ImmHi);
- BuildMI(MBB, II, DL, TII->get(Mips::ADDu), Mips::AT).addReg(FrameReg)
- .addReg(Mips::AT);
- NewReg = Mips::AT;
- NewImm = ImmLo;
-
- ATUsed = true;
- }
+ BuildMI(MBB, II, DL, TII.get(Mips::NOAT));
+ BuildMI(MBB, II, DL, TII.get(Mips::LUi), Mips::AT).addImm(ImmHi);
+ BuildMI(MBB, II, DL, TII.get(Mips::ADDu), Mips::AT).addReg(FrameReg)
+ .addReg(Mips::AT);
+ FrameReg = Mips::AT;
+ Offset = (short)(Offset & 0xffff);
- // FIXME: change this when mips goes MC".
- if (ATUsed)
BuildMI(MBB, ++II, MI.getDebugLoc(), TII.get(Mips::ATMACRO));
+ }
- MI.getOperand(i).ChangeToRegister(NewReg, false);
- MI.getOperand(i-1).ChangeToImmediate(NewImm);
+ MI.getOperand(i).ChangeToRegister(FrameReg, false);
+ MI.getOperand(i+1).ChangeToImmediate(Offset);
}
unsigned MipsRegisterInfo::
@@ -283,5 +276,3 @@ getDwarfRegNum(unsigned RegNum, bool isEH) const {
int MipsRegisterInfo::getLLVMRegNum(unsigned DwarfRegNo, bool isEH) const {
return MipsGenRegisterInfo::getLLVMRegNumFull(DwarfRegNo,0);
}
-
-#include "MipsGenRegisterInfo.inc"
diff --git a/contrib/llvm/lib/Target/Mips/MipsRegisterInfo.h b/contrib/llvm/lib/Target/Mips/MipsRegisterInfo.h
index 76b0035..646369b 100644
--- a/contrib/llvm/lib/Target/Mips/MipsRegisterInfo.h
+++ b/contrib/llvm/lib/Target/Mips/MipsRegisterInfo.h
@@ -16,7 +16,9 @@
#include "Mips.h"
#include "llvm/Target/TargetRegisterInfo.h"
-#include "MipsGenRegisterInfo.h.inc"
+
+#define GET_REGINFO_HEADER
+#include "MipsGenRegisterInfo.inc"
namespace llvm {
class MipsSubtarget;
diff --git a/contrib/llvm/lib/Target/Mips/MipsRegisterInfo.td b/contrib/llvm/lib/Target/Mips/MipsRegisterInfo.td
index e97d450..f0db518 100644
--- a/contrib/llvm/lib/Target/Mips/MipsRegisterInfo.td
+++ b/contrib/llvm/lib/Target/Mips/MipsRegisterInfo.td
@@ -157,15 +157,15 @@ let Namespace = "Mips" in {
// Register Classes
//===----------------------------------------------------------------------===//
-def CPURegs : RegisterClass<"Mips", [i32], 32,
+def CPURegs : RegisterClass<"Mips", [i32], 32, (add
// Return Values and Arguments
- [V0, V1, A0, A1, A2, A3,
+ V0, V1, A0, A1, A2, A3,
// Not preserved across procedure calls
T0, T1, T2, T3, T4, T5, T6, T7, T8, T9,
// Callee save
S0, S1, S2, S3, S4, S5, S6, S7,
// Reserved
- ZERO, AT, K0, K1, GP, SP, FP, RA]>;
+ ZERO, AT, K0, K1, GP, SP, FP, RA)>;
// 64bit fp:
// * FGR64 - 32 64-bit registers
@@ -174,33 +174,25 @@ def CPURegs : RegisterClass<"Mips", [i32], 32,
// 32bit fp:
// * FGR32 - 16 32-bit even registers
// * FGR32 - 32 32-bit registers (single float only mode)
-def FGR32 : RegisterClass<"Mips", [f32], 32,
- // Return Values and Arguments
- [F0, F1, F2, F3, F12, F13, F14, F15,
- // Not preserved across procedure calls
- F4, F5, F6, F7, F8, F9, F10, F11, F16, F17, F18, F19,
- // Callee save
- F20, F21, F22, F23, F24, F25, F26, F27, F28, F29, F30,
- // Reserved
- F31]>;
+def FGR32 : RegisterClass<"Mips", [f32], 32, (sequence "F%u", 0, 31)>;
-def AFGR64 : RegisterClass<"Mips", [f64], 64,
+def AFGR64 : RegisterClass<"Mips", [f64], 64, (add
// Return Values and Arguments
- [D0, D1, D6, D7,
+ D0, D1, D6, D7,
// Not preserved across procedure calls
D2, D3, D4, D5, D8, D9,
// Callee save
D10, D11, D12, D13, D14,
// Reserved
- D15]> {
+ D15)> {
let SubRegClasses = [(FGR32 sub_fpeven, sub_fpodd)];
}
// Condition Register for floating point operations
-def CCR : RegisterClass<"Mips", [i32], 32, [FCR31]>;
+def CCR : RegisterClass<"Mips", [i32], 32, (add FCR31)>;
// Hi/Lo Registers
-def HILO : RegisterClass<"Mips", [i32], 32, [HI, LO]>;
+def HILO : RegisterClass<"Mips", [i32], 32, (add HI, LO)>;
// Hardware registers
-def HWRegs : RegisterClass<"Mips", [i32], 32, [HWR29]>;
+def HWRegs : RegisterClass<"Mips", [i32], 32, (add HWR29)>;
diff --git a/contrib/llvm/lib/Target/Mips/MipsSubtarget.cpp b/contrib/llvm/lib/Target/Mips/MipsSubtarget.cpp
index 70747f5d..6eee333 100644
--- a/contrib/llvm/lib/Target/Mips/MipsSubtarget.cpp
+++ b/contrib/llvm/lib/Target/Mips/MipsSubtarget.cpp
@@ -7,27 +7,38 @@
//
//===----------------------------------------------------------------------===//
//
-// This file implements the Mips specific subclass of TargetSubtarget.
+// This file implements the Mips specific subclass of TargetSubtargetInfo.
//
//===----------------------------------------------------------------------===//
#include "MipsSubtarget.h"
#include "Mips.h"
-#include "MipsGenSubtarget.inc"
+#include "llvm/Target/TargetRegistry.h"
+
+#define GET_SUBTARGETINFO_TARGET_DESC
+#define GET_SUBTARGETINFO_CTOR
+#include "MipsGenSubtargetInfo.inc"
+
using namespace llvm;
-MipsSubtarget::MipsSubtarget(const std::string &TT, const std::string &FS,
- bool little) :
+MipsSubtarget::MipsSubtarget(const std::string &TT, const std::string &CPU,
+ const std::string &FS, bool little) :
+ MipsGenSubtargetInfo(TT, CPU, FS),
MipsArchVersion(Mips1), MipsABI(O32), IsLittle(little), IsSingleFloat(false),
IsFP64bit(false), IsGP64bit(false), HasVFPU(false), IsLinux(true),
HasSEInReg(false), HasCondMov(false), HasMulDivAdd(false), HasMinMax(false),
HasSwap(false), HasBitCount(false)
{
- std::string CPU = "mips1";
+ std::string CPUName = CPU;
+ if (CPUName.empty())
+ CPUName = "mips1";
MipsArchVersion = Mips1;
// Parse features string.
- ParseSubtargetFeatures(FS, CPU);
+ ParseSubtargetFeatures(CPUName, FS);
+
+ // Initialize scheduling itinerary for the specified CPU.
+ InstrItins = getInstrItineraryForCPU(CPUName);
// Is the target system Linux ?
if (TT.find("linux") == std::string::npos)
diff --git a/contrib/llvm/lib/Target/Mips/MipsSubtarget.h b/contrib/llvm/lib/Target/Mips/MipsSubtarget.h
index 096bbed..533d4af 100644
--- a/contrib/llvm/lib/Target/Mips/MipsSubtarget.h
+++ b/contrib/llvm/lib/Target/Mips/MipsSubtarget.h
@@ -7,21 +7,24 @@
//
//===----------------------------------------------------------------------===//
//
-// This file declares the Mips specific subclass of TargetSubtarget.
+// This file declares the Mips specific subclass of TargetSubtargetInfo.
//
//===----------------------------------------------------------------------===//
#ifndef MIPSSUBTARGET_H
#define MIPSSUBTARGET_H
-#include "llvm/Target/TargetSubtarget.h"
-#include "llvm/Target/TargetMachine.h"
-
+#include "llvm/Target/TargetSubtargetInfo.h"
+#include "llvm/MC/MCInstrItineraries.h"
#include <string>
+#define GET_SUBTARGETINFO_HEADER
+#include "MipsGenSubtargetInfo.inc"
+
namespace llvm {
+class StringRef;
-class MipsSubtarget : public TargetSubtarget {
+class MipsSubtarget : public MipsGenSubtargetInfo {
public:
enum MipsABIEnum {
@@ -92,12 +95,12 @@ public:
/// This constructor initializes the data members to match that
/// of the specified triple.
- MipsSubtarget(const std::string &TT, const std::string &FS, bool little);
+ MipsSubtarget(const std::string &TT, const std::string &CPU,
+ const std::string &FS, bool little);
/// ParseSubtargetFeatures - Parses features string setting specified
/// subtarget options. Definition of function is auto generated by tblgen.
- std::string ParseSubtargetFeatures(const std::string &FS,
- const std::string &CPU);
+ void ParseSubtargetFeatures(StringRef CPU, StringRef FS);
bool isMips1() const { return MipsArchVersion == Mips1; }
bool isMips32() const { return MipsArchVersion >= Mips32; }
diff --git a/contrib/llvm/lib/Target/Mips/MipsTargetMachine.cpp b/contrib/llvm/lib/Target/Mips/MipsTargetMachine.cpp
index cfbb92c..20b9f4e 100644
--- a/contrib/llvm/lib/Target/Mips/MipsTargetMachine.cpp
+++ b/contrib/llvm/lib/Target/Mips/MipsTargetMachine.cpp
@@ -12,7 +12,6 @@
//===----------------------------------------------------------------------===//
#include "Mips.h"
-#include "MipsMCAsmInfo.h"
#include "MipsTargetMachine.h"
#include "llvm/PassManager.h"
#include "llvm/Target/TargetRegistry.h"
@@ -22,8 +21,6 @@ extern "C" void LLVMInitializeMipsTarget() {
// Register the target.
RegisterTargetMachine<MipsTargetMachine> X(TheMipsTarget);
RegisterTargetMachine<MipselTargetMachine> Y(TheMipselTarget);
- RegisterAsmInfo<MipsMCAsmInfo> A(TheMipsTarget);
- RegisterAsmInfo<MipsMCAsmInfo> B(TheMipselTarget);
}
// DataLayout --> Big-endian, 32-bit pointer/ABI/alignment
@@ -34,10 +31,11 @@ extern "C" void LLVMInitializeMipsTarget() {
// an easier handling.
// Using CodeModel::Large enables different CALL behavior.
MipsTargetMachine::
-MipsTargetMachine(const Target &T, const std::string &TT, const std::string &FS,
+MipsTargetMachine(const Target &T, const std::string &TT,
+ const std::string &CPU, const std::string &FS,
bool isLittle=false):
- LLVMTargetMachine(T, TT),
- Subtarget(TT, FS, isLittle),
+ LLVMTargetMachine(T, TT, CPU, FS),
+ Subtarget(TT, CPU, FS, isLittle),
DataLayout(isLittle ?
std::string("e-p:32:32:32-i8:8:32-i16:16:32-i64:64:64-n32") :
std::string("E-p:32:32:32-i8:8:32-i16:16:32-i64:64:64-n32")),
@@ -55,8 +53,8 @@ MipsTargetMachine(const Target &T, const std::string &TT, const std::string &FS,
MipselTargetMachine::
MipselTargetMachine(const Target &T, const std::string &TT,
- const std::string &FS) :
- MipsTargetMachine(T, TT, FS, true) {}
+ const std::string &CPU, const std::string &FS) :
+ MipsTargetMachine(T, TT, CPU, FS, true) {}
// Install an instruction selector pass using
// the ISelDag to gen Mips code.
diff --git a/contrib/llvm/lib/Target/Mips/MipsTargetMachine.h b/contrib/llvm/lib/Target/Mips/MipsTargetMachine.h
index 102dd85..a021af2 100644
--- a/contrib/llvm/lib/Target/Mips/MipsTargetMachine.h
+++ b/contrib/llvm/lib/Target/Mips/MipsTargetMachine.h
@@ -35,7 +35,8 @@ namespace llvm {
MipsSelectionDAGInfo TSInfo;
public:
MipsTargetMachine(const Target &T, const std::string &TT,
- const std::string &FS, bool isLittle);
+ const std::string &CPU, const std::string &FS,
+ bool isLittle);
virtual const MipsInstrInfo *getInstrInfo() const
{ return &InstrInfo; }
@@ -73,7 +74,7 @@ namespace llvm {
class MipselTargetMachine : public MipsTargetMachine {
public:
MipselTargetMachine(const Target &T, const std::string &TT,
- const std::string &FS);
+ const std::string &CPU, const std::string &FS);
};
} // End llvm namespace
diff --git a/contrib/llvm/lib/Target/PTX/MCTargetDesc/CMakeLists.txt b/contrib/llvm/lib/Target/PTX/MCTargetDesc/CMakeLists.txt
new file mode 100644
index 0000000..df0f63f
--- /dev/null
+++ b/contrib/llvm/lib/Target/PTX/MCTargetDesc/CMakeLists.txt
@@ -0,0 +1,4 @@
+add_llvm_library(LLVMPTXDesc
+ PTXMCTargetDesc.cpp
+ PTXMCAsmInfo.cpp
+ )
diff --git a/contrib/llvm/lib/Target/PTX/MCTargetDesc/Makefile b/contrib/llvm/lib/Target/PTX/MCTargetDesc/Makefile
new file mode 100644
index 0000000..35f5a7b
--- /dev/null
+++ b/contrib/llvm/lib/Target/PTX/MCTargetDesc/Makefile
@@ -0,0 +1,16 @@
+##===- lib/Target/PTX/TargetDesc/Makefile ------------------*- Makefile -*-===##
+#
+# The LLVM Compiler Infrastructure
+#
+# This file is distributed under the University of Illinois Open Source
+# License. See LICENSE.TXT for details.
+#
+##===----------------------------------------------------------------------===##
+
+LEVEL = ../../../..
+LIBRARYNAME = LLVMPTXDesc
+
+# Hack: we need to include 'main' target directory to grab private headers
+CPP.Flags += -I$(PROJ_OBJ_DIR)/.. -I$(PROJ_SRC_DIR)/..
+
+include $(LEVEL)/Makefile.common
diff --git a/contrib/llvm/lib/Target/PTX/PTXMCAsmInfo.cpp b/contrib/llvm/lib/Target/PTX/MCTargetDesc/PTXMCAsmInfo.cpp
index b670abd..efefead 100644
--- a/contrib/llvm/lib/Target/PTX/PTXMCAsmInfo.cpp
+++ b/contrib/llvm/lib/Target/PTX/MCTargetDesc/PTXMCAsmInfo.cpp
@@ -12,10 +12,15 @@
//===----------------------------------------------------------------------===//
#include "PTXMCAsmInfo.h"
+#include "llvm/ADT/Triple.h"
using namespace llvm;
PTXMCAsmInfo::PTXMCAsmInfo(const Target &T, const StringRef &TT) {
+ Triple TheTriple(TT);
+ if (TheTriple.getArch() == Triple::ptx64)
+ PointerSize = 8;
+
CommentString = "//";
PrivateGlobalPrefix = "$L__";
diff --git a/contrib/llvm/lib/Target/PTX/PTXMCAsmInfo.h b/contrib/llvm/lib/Target/PTX/MCTargetDesc/PTXMCAsmInfo.h
index 03f5d66..03f5d66 100644
--- a/contrib/llvm/lib/Target/PTX/PTXMCAsmInfo.h
+++ b/contrib/llvm/lib/Target/PTX/MCTargetDesc/PTXMCAsmInfo.h
diff --git a/contrib/llvm/lib/Target/PTX/MCTargetDesc/PTXMCTargetDesc.cpp b/contrib/llvm/lib/Target/PTX/MCTargetDesc/PTXMCTargetDesc.cpp
new file mode 100644
index 0000000..23f70bd
--- /dev/null
+++ b/contrib/llvm/lib/Target/PTX/MCTargetDesc/PTXMCTargetDesc.cpp
@@ -0,0 +1,60 @@
+//===-- PTXMCTargetDesc.cpp - PTX Target Descriptions -----------*- C++ -*-===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+//
+// This file provides PTX specific target descriptions.
+//
+//===----------------------------------------------------------------------===//
+
+#include "PTXMCTargetDesc.h"
+#include "PTXMCAsmInfo.h"
+#include "llvm/MC/MCInstrInfo.h"
+#include "llvm/MC/MCRegisterInfo.h"
+#include "llvm/MC/MCSubtargetInfo.h"
+#include "llvm/Target/TargetRegistry.h"
+
+#define GET_INSTRINFO_MC_DESC
+#include "PTXGenInstrInfo.inc"
+
+#define GET_SUBTARGETINFO_MC_DESC
+#include "PTXGenSubtargetInfo.inc"
+
+#define GET_REGINFO_MC_DESC
+#include "PTXGenRegisterInfo.inc"
+
+using namespace llvm;
+
+static MCInstrInfo *createPTXMCInstrInfo() {
+ MCInstrInfo *X = new MCInstrInfo();
+ InitPTXMCInstrInfo(X);
+ return X;
+}
+
+extern "C" void LLVMInitializePTXMCInstrInfo() {
+ TargetRegistry::RegisterMCInstrInfo(ThePTX32Target, createPTXMCInstrInfo);
+ TargetRegistry::RegisterMCInstrInfo(ThePTX64Target, createPTXMCInstrInfo);
+}
+
+static MCSubtargetInfo *createPTXMCSubtargetInfo(StringRef TT, StringRef CPU,
+ StringRef FS) {
+ MCSubtargetInfo *X = new MCSubtargetInfo();
+ InitPTXMCSubtargetInfo(X, TT, CPU, FS);
+ return X;
+}
+
+extern "C" void LLVMInitializePTXMCSubtargetInfo() {
+ TargetRegistry::RegisterMCSubtargetInfo(ThePTX32Target,
+ createPTXMCSubtargetInfo);
+ TargetRegistry::RegisterMCSubtargetInfo(ThePTX64Target,
+ createPTXMCSubtargetInfo);
+}
+
+extern "C" void LLVMInitializePTXMCAsmInfo() {
+ RegisterMCAsmInfo<PTXMCAsmInfo> X(ThePTX32Target);
+ RegisterMCAsmInfo<PTXMCAsmInfo> Y(ThePTX64Target);
+}
diff --git a/contrib/llvm/lib/Target/PTX/MCTargetDesc/PTXMCTargetDesc.h b/contrib/llvm/lib/Target/PTX/MCTargetDesc/PTXMCTargetDesc.h
new file mode 100644
index 0000000..1003b0b
--- /dev/null
+++ b/contrib/llvm/lib/Target/PTX/MCTargetDesc/PTXMCTargetDesc.h
@@ -0,0 +1,38 @@
+//===-- PTXMCTargetDesc.h - PTX Target Descriptions ------------*- C++ -*-===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+//
+// This file provides PTX specific target descriptions.
+//
+//===----------------------------------------------------------------------===//
+
+#ifndef PTXMCTARGETDESC_H
+#define PTXMCTARGETDESC_H
+
+namespace llvm {
+class MCSubtargetInfo;
+class Target;
+class StringRef;
+
+extern Target ThePTX32Target;
+extern Target ThePTX64Target;
+
+} // End llvm namespace
+
+// Defines symbolic names for PTX registers.
+#define GET_REGINFO_ENUM
+#include "PTXGenRegisterInfo.inc"
+
+// Defines symbolic names for the PTX instructions.
+#define GET_INSTRINFO_ENUM
+#include "PTXGenInstrInfo.inc"
+
+#define GET_SUBTARGETINFO_ENUM
+#include "PTXGenSubtargetInfo.inc"
+
+#endif
diff --git a/contrib/llvm/lib/Target/PTX/PTX.h b/contrib/llvm/lib/Target/PTX/PTX.h
index ec2be92..28cab24 100644
--- a/contrib/llvm/lib/Target/PTX/PTX.h
+++ b/contrib/llvm/lib/Target/PTX/PTX.h
@@ -15,6 +15,7 @@
#ifndef PTX_H
#define PTX_H
+#include "MCTargetDesc/PTXMCTargetDesc.h"
#include "llvm/Target/TargetMachine.h"
namespace llvm {
@@ -42,14 +43,6 @@ namespace llvm {
FunctionPass *createPTXMFInfoExtract(PTXTargetMachine &TM,
CodeGenOpt::Level OptLevel);
- extern Target ThePTX32Target;
- extern Target ThePTX64Target;
} // namespace llvm;
-// Defines symbolic names for PTX registers.
-#include "PTXGenRegisterNames.inc"
-
-// Defines symbolic names for the PTX instructions.
-#include "PTXGenInstrNames.inc"
-
#endif // PTX_H
diff --git a/contrib/llvm/lib/Target/PTX/PTX.td b/contrib/llvm/lib/Target/PTX/PTX.td
index 231866a..f6fbe9f 100644
--- a/contrib/llvm/lib/Target/PTX/PTX.td
+++ b/contrib/llvm/lib/Target/PTX/PTX.td
@@ -16,7 +16,7 @@
include "llvm/Target/Target.td"
//===----------------------------------------------------------------------===//
-// Subtarget Features.
+// Subtarget Features
//===----------------------------------------------------------------------===//
//===- Architectural Features ---------------------------------------------===//
@@ -30,34 +30,54 @@ def FeatureNoFMA : SubtargetFeature<"no-fma","SupportsFMA", "false",
//===- PTX Version --------------------------------------------------------===//
def FeaturePTX20 : SubtargetFeature<"ptx20", "PTXVersion", "PTX_VERSION_2_0",
- "Use PTX Language Version 2.0",
- []>;
+ "Use PTX Language Version 2.0">;
def FeaturePTX21 : SubtargetFeature<"ptx21", "PTXVersion", "PTX_VERSION_2_1",
- "Use PTX Language Version 2.1",
- [FeaturePTX20]>;
+ "Use PTX Language Version 2.1">;
def FeaturePTX22 : SubtargetFeature<"ptx22", "PTXVersion", "PTX_VERSION_2_2",
- "Use PTX Language Version 2.2",
- [FeaturePTX21]>;
+ "Use PTX Language Version 2.2">;
def FeaturePTX23 : SubtargetFeature<"ptx23", "PTXVersion", "PTX_VERSION_2_3",
- "Use PTX Language Version 2.3",
- [FeaturePTX22]>;
-
-//===- PTX Shader Model ---------------------------------------------------===//
-
-def FeatureSM10 : SubtargetFeature<"sm10", "PTXShaderModel", "PTX_SM_1_0",
- "Enable Shader Model 1.0 compliance">;
-def FeatureSM13 : SubtargetFeature<"sm13", "PTXShaderModel", "PTX_SM_1_3",
- "Enable Shader Model 1.3 compliance",
- [FeatureSM10, FeatureDouble]>;
-def FeatureSM20 : SubtargetFeature<"sm20", "PTXShaderModel", "PTX_SM_2_0",
- "Enable Shader Model 2.0 compliance",
- [FeatureSM13]>;
+ "Use PTX Language Version 2.3">;
+
+//===- PTX Target ---------------------------------------------------------===//
+
+def FeatureSM10 : SubtargetFeature<"sm10", "PTXTarget", "PTX_SM_1_0",
+ "Use Shader Model 1.0">;
+def FeatureSM11 : SubtargetFeature<"sm11", "PTXTarget", "PTX_SM_1_1",
+ "Use Shader Model 1.1">;
+def FeatureSM12 : SubtargetFeature<"sm12", "PTXTarget", "PTX_SM_1_2",
+ "Use Shader Model 1.2">;
+def FeatureSM13 : SubtargetFeature<"sm13", "PTXTarget", "PTX_SM_1_3",
+ "Use Shader Model 1.3">;
+def FeatureSM20 : SubtargetFeature<"sm20", "PTXTarget", "PTX_SM_2_0",
+ "Use Shader Model 2.0">;
+def FeatureSM21 : SubtargetFeature<"sm21", "PTXTarget", "PTX_SM_2_1",
+ "Use Shader Model 2.1">;
+def FeatureSM22 : SubtargetFeature<"sm22", "PTXTarget", "PTX_SM_2_2",
+ "Use Shader Model 2.2">;
+def FeatureSM23 : SubtargetFeature<"sm23", "PTXTarget", "PTX_SM_2_3",
+ "Use Shader Model 2.3">;
+
+def FeatureCOMPUTE10 : SubtargetFeature<"compute10", "PTXTarget",
+ "PTX_COMPUTE_1_0",
+ "Use Compute Compatibility 1.0">;
+def FeatureCOMPUTE11 : SubtargetFeature<"compute11", "PTXTarget",
+ "PTX_COMPUTE_1_1",
+ "Use Compute Compatibility 1.1">;
+def FeatureCOMPUTE12 : SubtargetFeature<"compute12", "PTXTarget",
+ "PTX_COMPUTE_1_2",
+ "Use Compute Compatibility 1.2">;
+def FeatureCOMPUTE13 : SubtargetFeature<"compute13", "PTXTarget",
+ "PTX_COMPUTE_1_3",
+ "Use Compute Compatibility 1.3">;
+def FeatureCOMPUTE20 : SubtargetFeature<"compute20", "PTXTarget",
+ "PTX_COMPUTE_2_0",
+ "Use Compute Compatibility 2.0">;
//===----------------------------------------------------------------------===//
-// PTX supported processors.
+// PTX supported processors
//===----------------------------------------------------------------------===//
class Proc<string Name, list<SubtargetFeature> Features>
@@ -65,6 +85,27 @@ class Proc<string Name, list<SubtargetFeature> Features>
def : Proc<"generic", []>;
+// Processor definitions for compute/shader models
+def : Proc<"compute_10", [FeatureCOMPUTE10]>;
+def : Proc<"compute_11", [FeatureCOMPUTE11]>;
+def : Proc<"compute_12", [FeatureCOMPUTE12]>;
+def : Proc<"compute_13", [FeatureCOMPUTE13]>;
+def : Proc<"compute_20", [FeatureCOMPUTE20]>;
+def : Proc<"sm_10", [FeatureSM10]>;
+def : Proc<"sm_11", [FeatureSM11]>;
+def : Proc<"sm_12", [FeatureSM12]>;
+def : Proc<"sm_13", [FeatureSM13]>;
+def : Proc<"sm_20", [FeatureSM20]>;
+def : Proc<"sm_21", [FeatureSM21]>;
+def : Proc<"sm_22", [FeatureSM22]>;
+def : Proc<"sm_23", [FeatureSM23]>;
+
+// Processor definitions for common GPU architectures
+def : Proc<"g80", [FeatureSM10]>;
+def : Proc<"gt200", [FeatureSM13]>;
+def : Proc<"gf100", [FeatureSM20, FeatureDouble]>;
+def : Proc<"fermi", [FeatureSM20, FeatureDouble]>;
+
//===----------------------------------------------------------------------===//
// Register File Description
//===----------------------------------------------------------------------===//
@@ -72,6 +113,12 @@ def : Proc<"generic", []>;
include "PTXRegisterInfo.td"
//===----------------------------------------------------------------------===//
+// Calling Conventions
+//===----------------------------------------------------------------------===//
+
+include "PTXCallingConv.td"
+
+//===----------------------------------------------------------------------===//
// Instruction Descriptions
//===----------------------------------------------------------------------===//
diff --git a/contrib/llvm/lib/Target/PTX/PTXAsmPrinter.cpp b/contrib/llvm/lib/Target/PTX/PTXAsmPrinter.cpp
index 29c4781..2848d54 100644
--- a/contrib/llvm/lib/Target/PTX/PTXAsmPrinter.cpp
+++ b/contrib/llvm/lib/Target/PTX/PTXAsmPrinter.cpp
@@ -22,9 +22,12 @@
#include "llvm/ADT/SmallString.h"
#include "llvm/ADT/StringExtras.h"
#include "llvm/ADT/Twine.h"
+#include "llvm/Analysis/DebugInfo.h"
#include "llvm/CodeGen/AsmPrinter.h"
+#include "llvm/CodeGen/MachineFrameInfo.h"
#include "llvm/CodeGen/MachineInstr.h"
#include "llvm/CodeGen/MachineRegisterInfo.h"
+#include "llvm/MC/MCContext.h"
#include "llvm/MC/MCStreamer.h"
#include "llvm/MC/MCSymbol.h"
#include "llvm/Target/Mangler.h"
@@ -34,6 +37,7 @@
#include "llvm/Support/Debug.h"
#include "llvm/Support/ErrorHandling.h"
#include "llvm/Support/MathExtras.h"
+#include "llvm/Support/Path.h"
#include "llvm/Support/raw_ostream.h"
using namespace llvm;
@@ -62,8 +66,13 @@ public:
const char *Modifier = 0);
void printParamOperand(const MachineInstr *MI, int opNum, raw_ostream &OS,
const char *Modifier = 0);
+ void printReturnOperand(const MachineInstr *MI, int opNum, raw_ostream &OS,
+ const char *Modifier = 0);
void printPredicateOperand(const MachineInstr *MI, raw_ostream &O);
+ unsigned GetOrCreateSourceID(StringRef FileName,
+ StringRef DirName);
+
// autogen'd.
void printInstruction(const MachineInstr *MI, raw_ostream &OS);
static const char *getRegisterName(unsigned RegNo);
@@ -71,20 +80,23 @@ public:
private:
void EmitVariableDeclaration(const GlobalVariable *gv);
void EmitFunctionDeclaration();
+
+ StringMap<unsigned> SourceIdMap;
}; // class PTXAsmPrinter
} // namespace
static const char PARAM_PREFIX[] = "__param_";
+static const char RETURN_PREFIX[] = "__ret_";
static const char *getRegisterTypeName(unsigned RegNo) {
#define TEST_REGCLS(cls, clsstr) \
if (PTX::cls ## RegisterClass->contains(RegNo)) return # clsstr;
- TEST_REGCLS(Preds, pred);
- TEST_REGCLS(RRegu16, u16);
- TEST_REGCLS(RRegu32, u32);
- TEST_REGCLS(RRegu64, u64);
- TEST_REGCLS(RRegf32, f32);
- TEST_REGCLS(RRegf64, f64);
+ TEST_REGCLS(RegPred, pred);
+ TEST_REGCLS(RegI16, b16);
+ TEST_REGCLS(RegI32, b32);
+ TEST_REGCLS(RegI64, b64);
+ TEST_REGCLS(RegF32, b32);
+ TEST_REGCLS(RegF64, b64);
#undef TEST_REGCLS
llvm_unreachable("Not in any register class!");
@@ -162,6 +174,27 @@ void PTXAsmPrinter::EmitStartOfAsmFile(Module &M)
OutStreamer.EmitRawText(Twine("\t.target " + ST.getTargetString() +
(ST.supportsDouble() ? ""
: ", map_f64_to_f32")));
+ // .address_size directive is optional, but it must immediately follow
+ // the .target directive if present within a module
+ if (ST.supportsPTX23()) {
+ std::string addrSize = ST.is64Bit() ? "64" : "32";
+ OutStreamer.EmitRawText(Twine("\t.address_size " + addrSize));
+ }
+
+ OutStreamer.AddBlankLine();
+
+ // Define any .file directives
+ DebugInfoFinder DbgFinder;
+ DbgFinder.processModule(M);
+
+ for (DebugInfoFinder::iterator I = DbgFinder.compile_unit_begin(),
+ E = DbgFinder.compile_unit_end(); I != E; ++I) {
+ DICompileUnit DIUnit(*I);
+ StringRef FN = DIUnit.getFilename();
+ StringRef Dir = DIUnit.getDirectory();
+ GetOrCreateSourceID(FN, Dir);
+ }
+
OutStreamer.AddBlankLine();
// declare global variables
@@ -194,6 +227,21 @@ void PTXAsmPrinter::EmitFunctionBodyStart() {
def += ';';
OutStreamer.EmitRawText(Twine(def));
}
+
+ const MachineFrameInfo* FrameInfo = MF->getFrameInfo();
+ DEBUG(dbgs() << "Have " << FrameInfo->getNumObjects()
+ << " frame object(s)\n");
+ for (unsigned i = 0, e = FrameInfo->getNumObjects(); i != e; ++i) {
+ DEBUG(dbgs() << "Size of object: " << FrameInfo->getObjectSize(i) << "\n");
+ if (FrameInfo->getObjectSize(i) > 0) {
+ std::string def = "\t.reg .b";
+ def += utostr(FrameInfo->getObjectSize(i)*8); // Convert to bits
+ def += " s";
+ def += utostr(i);
+ def += ";";
+ OutStreamer.EmitRawText(Twine(def));
+ }
+ }
}
void PTXAsmPrinter::EmitInstruction(const MachineInstr *MI) {
@@ -202,6 +250,54 @@ void PTXAsmPrinter::EmitInstruction(const MachineInstr *MI) {
raw_string_ostream OS(str);
+ DebugLoc DL = MI->getDebugLoc();
+ if (!DL.isUnknown()) {
+
+ const MDNode *S = DL.getScope(MF->getFunction()->getContext());
+
+ // This is taken from DwarfDebug.cpp, which is conveniently not a public
+ // LLVM class.
+ StringRef Fn;
+ StringRef Dir;
+ unsigned Src = 1;
+ if (S) {
+ DIDescriptor Scope(S);
+ if (Scope.isCompileUnit()) {
+ DICompileUnit CU(S);
+ Fn = CU.getFilename();
+ Dir = CU.getDirectory();
+ } else if (Scope.isFile()) {
+ DIFile F(S);
+ Fn = F.getFilename();
+ Dir = F.getDirectory();
+ } else if (Scope.isSubprogram()) {
+ DISubprogram SP(S);
+ Fn = SP.getFilename();
+ Dir = SP.getDirectory();
+ } else if (Scope.isLexicalBlock()) {
+ DILexicalBlock DB(S);
+ Fn = DB.getFilename();
+ Dir = DB.getDirectory();
+ } else
+ assert(0 && "Unexpected scope info");
+
+ Src = GetOrCreateSourceID(Fn, Dir);
+ }
+ OutStreamer.EmitDwarfLocDirective(Src, DL.getLine(), DL.getCol(),
+ 0, 0, 0, Fn);
+
+ const MCDwarfLoc& MDL = OutContext.getCurrentDwarfLoc();
+
+ OS << "\t.loc ";
+ OS << utostr(MDL.getFileNum());
+ OS << " ";
+ OS << utostr(MDL.getLine());
+ OS << " ";
+ OS << utostr(MDL.getColumn());
+ OS << "\n";
+ }
+
+
// Emit predicate
printPredicateOperand(MI, OS);
@@ -275,6 +371,11 @@ void PTXAsmPrinter::printParamOperand(const MachineInstr *MI, int opNum,
OS << PARAM_PREFIX << (int) MI->getOperand(opNum).getImm() + 1;
}
+void PTXAsmPrinter::printReturnOperand(const MachineInstr *MI, int opNum,
+ raw_ostream &OS, const char *Modifier) {
+ OS << RETURN_PREFIX << (int) MI->getOperand(opNum).getImm() + 1;
+}
+
void PTXAsmPrinter::EmitVariableDeclaration(const GlobalVariable *gv) {
// Check to see if this is a special global used by LLVM, if so, emit it.
if (EmitSpecialLLVMGlobal(gv))
@@ -311,7 +412,7 @@ void PTXAsmPrinter::EmitVariableDeclaration(const GlobalVariable *gv) {
decl += ".b8 ";
decl += gvsym->getName();
decl += "[";
-
+
if (elementTy->isArrayTy())
{
assert(elementTy->isArrayTy() && "Only pointers to arrays are supported");
@@ -320,7 +421,7 @@ void PTXAsmPrinter::EmitVariableDeclaration(const GlobalVariable *gv) {
elementTy = arrayTy->getElementType();
unsigned numElements = arrayTy->getNumElements();
-
+
while (elementTy->isArrayTy()) {
arrayTy = dyn_cast<const ArrayType>(elementTy);
@@ -336,17 +437,17 @@ void PTXAsmPrinter::EmitVariableDeclaration(const GlobalVariable *gv) {
// Compute the size of the array, in bytes.
uint64_t arraySize = (elementTy->getPrimitiveSizeInBits() >> 3)
* numElements;
-
+
decl += utostr(arraySize);
}
-
+
decl += "]";
-
+
// handle string constants (assume ConstantArray means string)
-
+
if (gv->hasInitializer())
{
- Constant *C = gv->getInitializer();
+ const Constant *C = gv->getInitializer();
if (const ConstantArray *CA = dyn_cast<ConstantArray>(C))
{
decl += " = {";
@@ -354,10 +455,11 @@ void PTXAsmPrinter::EmitVariableDeclaration(const GlobalVariable *gv) {
for (unsigned i = 0, e = C->getNumOperands(); i != e; ++i)
{
if (i > 0) decl += ",";
-
- decl += "0x" + utohexstr(cast<ConstantInt>(CA->getOperand(i))->getZExtValue());
+
+ decl += "0x" +
+ utohexstr(cast<ConstantInt>(CA->getOperand(i))->getZExtValue());
}
-
+
decl += "}";
}
}
@@ -393,17 +495,25 @@ void PTXAsmPrinter::EmitFunctionDeclaration() {
const PTXMachineFunctionInfo *MFI = MF->getInfo<PTXMachineFunctionInfo>();
const bool isKernel = MFI->isKernel();
- unsigned reg;
+ const PTXSubtarget& ST = TM.getSubtarget<PTXSubtarget>();
std::string decl = isKernel ? ".entry" : ".func";
- // Print return register
- reg = MFI->retReg();
- if (!isKernel && reg != PTX::NoRegister) {
- decl += " (.reg ."; // FIXME: could it return in .param space?
- decl += getRegisterTypeName(reg);
- decl += " ";
- decl += getRegisterName(reg);
+ unsigned cnt = 0;
+
+ if (!isKernel) {
+ decl += " (";
+ for (PTXMachineFunctionInfo::ret_iterator
+ i = MFI->retRegBegin(), e = MFI->retRegEnd(), b = i;
+ i != e; ++i) {
+ if (i != b) {
+ decl += ", ";
+ }
+ decl += ".reg .";
+ decl += getRegisterTypeName(*i);
+ decl += " ";
+ decl += getRegisterName(*i);
+ }
decl += ")";
}
@@ -411,40 +521,31 @@ void PTXAsmPrinter::EmitFunctionDeclaration() {
decl += " ";
decl += CurrentFnSym->getName().str();
- // Print parameter list
- if (!MFI->argRegEmpty()) {
- decl += " (";
- if (isKernel) {
- unsigned cnt = 0;
- for(PTXMachineFunctionInfo::reg_iterator
- i = MFI->argRegBegin(), e = MFI->argRegEnd(), b = i;
- i != e; ++i) {
- reg = *i;
- assert(reg != PTX::NoRegister && "Not a valid register!");
- if (i != b)
- decl += ", ";
- decl += ".param .";
- decl += getRegisterTypeName(reg);
- decl += " ";
- decl += PARAM_PREFIX;
- decl += utostr(++cnt);
- }
+ decl += " (";
+
+ cnt = 0;
+
+ // Print parameters
+ for (PTXMachineFunctionInfo::reg_iterator
+ i = MFI->argRegBegin(), e = MFI->argRegEnd(), b = i;
+ i != e; ++i) {
+ if (i != b) {
+ decl += ", ";
+ }
+ if (isKernel || ST.useParamSpaceForDeviceArgs()) {
+ decl += ".param .b";
+ decl += utostr(*i);
+ decl += " ";
+ decl += PARAM_PREFIX;
+ decl += utostr(++cnt);
} else {
- for (PTXMachineFunctionInfo::reg_iterator
- i = MFI->argRegBegin(), e = MFI->argRegEnd(), b = i;
- i != e; ++i) {
- reg = *i;
- assert(reg != PTX::NoRegister && "Not a valid register!");
- if (i != b)
- decl += ", ";
- decl += ".reg .";
- decl += getRegisterTypeName(reg);
- decl += " ";
- decl += getRegisterName(reg);
- }
+ decl += ".reg .";
+ decl += getRegisterTypeName(*i);
+ decl += " ";
+ decl += getRegisterName(*i);
}
- decl += ")";
}
+ decl += ")";
OutStreamer.EmitRawText(Twine(decl));
}
@@ -468,6 +569,33 @@ printPredicateOperand(const MachineInstr *MI, raw_ostream &O) {
}
}
+unsigned PTXAsmPrinter::GetOrCreateSourceID(StringRef FileName,
+ StringRef DirName) {
+ // If FE did not provide a file name, then assume stdin.
+ if (FileName.empty())
+ return GetOrCreateSourceID("<stdin>", StringRef());
+
+ // MCStream expects full path name as filename.
+ if (!DirName.empty() && !sys::path::is_absolute(FileName)) {
+ SmallString<128> FullPathName = DirName;
+ sys::path::append(FullPathName, FileName);
+ // Here FullPathName will be copied into StringMap by GetOrCreateSourceID.
+ return GetOrCreateSourceID(StringRef(FullPathName), StringRef());
+ }
+
+ StringMapEntry<unsigned> &Entry = SourceIdMap.GetOrCreateValue(FileName);
+ if (Entry.getValue())
+ return Entry.getValue();
+
+ unsigned SrcId = SourceIdMap.size();
+ Entry.setValue(SrcId);
+
+ // Print out a .file directive to specify files for .loc directives.
+ OutStreamer.EmitDwarfFileDirective(SrcId, Entry.getKey());
+
+ return SrcId;
+}
+
#include "PTXGenAsmWriter.inc"
// Force static initialization.
diff --git a/contrib/llvm/lib/Target/PTX/PTXCallingConv.td b/contrib/llvm/lib/Target/PTX/PTXCallingConv.td
new file mode 100644
index 0000000..3e3ff48
--- /dev/null
+++ b/contrib/llvm/lib/Target/PTX/PTXCallingConv.td
@@ -0,0 +1,29 @@
+
+//===--- PTXCallingConv.td - Calling Conventions -----------*- tablegen -*-===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+//
+// This describes the calling conventions for the PTX architecture.
+//
+//===----------------------------------------------------------------------===//
+
+// PTX Formal Parameter Calling Convention
+def CC_PTX : CallingConv<[
+ CCIfType<[i1], CCAssignToReg<[P12, P13, P14, P15, P16, P17, P18, P19, P20, P21, P22, P23, P24, P25, P26, P27, P28, P29, P30, P31, P32, P33, P34, P35, P36, P37, P38, P39, P40, P41, P42, P43, P44, P45, P46, P47, P48, P49, P50, P51, P52, P53, P54, P55, P56, P57, P58, P59, P60, P61, P62, P63, P64, P65, P66, P67, P68, P69, P70, P71, P72, P73, P74, P75, P76, P77, P78, P79, P80, P81, P82, P83, P84, P85, P86, P87, P88, P89, P90, P91, P92, P93, P94, P95, P96, P97, P98, P99, P100, P101, P102, P103, P104, P105, P106, P107, P108, P109, P110, P111, P112, P113, P114, P115, P116, P117, P118, P119, P120, P121, P122, P123, P124, P125, P126, P127]>>,
+ CCIfType<[i16], CCAssignToReg<[RH12, RH13, RH14, RH15, RH16, RH17, RH18, RH19, RH20, RH21, RH22, RH23, RH24, RH25, RH26, RH27, RH28, RH29, RH30, RH31, RH32, RH33, RH34, RH35, RH36, RH37, RH38, RH39, RH40, RH41, RH42, RH43, RH44, RH45, RH46, RH47, RH48, RH49, RH50, RH51, RH52, RH53, RH54, RH55, RH56, RH57, RH58, RH59, RH60, RH61, RH62, RH63, RH64, RH65, RH66, RH67, RH68, RH69, RH70, RH71, RH72, RH73, RH74, RH75, RH76, RH77, RH78, RH79, RH80, RH81, RH82, RH83, RH84, RH85, RH86, RH87, RH88, RH89, RH90, RH91, RH92, RH93, RH94, RH95, RH96, RH97, RH98, RH99, RH100, RH101, RH102, RH103, RH104, RH105, RH106, RH107, RH108, RH109, RH110, RH111, RH112, RH113, RH114, RH115, RH116, RH117, RH118, RH119, RH120, RH121, RH122, RH123, RH124, RH125, RH126, RH127]>>,
+ CCIfType<[i32,f32], CCAssignToReg<[R12, R13, R14, R15, R16, R17, R18, R19, R20, R21, R22, R23, R24, R25, R26, R27, R28, R29, R30, R31, R32, R33, R34, R35, R36, R37, R38, R39, R40, R41, R42, R43, R44, R45, R46, R47, R48, R49, R50, R51, R52, R53, R54, R55, R56, R57, R58, R59, R60, R61, R62, R63, R64, R65, R66, R67, R68, R69, R70, R71, R72, R73, R74, R75, R76, R77, R78, R79, R80, R81, R82, R83, R84, R85, R86, R87, R88, R89, R90, R91, R92, R93, R94, R95, R96, R97, R98, R99, R100, R101, R102, R103, R104, R105, R106, R107, R108, R109, R110, R111, R112, R113, R114, R115, R116, R117, R118, R119, R120, R121, R122, R123, R124, R125, R126, R127]>>,
+ CCIfType<[i64,f64], CCAssignToReg<[RD12, RD13, RD14, RD15, RD16, RD17, RD18, RD19, RD20, RD21, RD22, RD23, RD24, RD25, RD26, RD27, RD28, RD29, RD30, RD31, RD32, RD33, RD34, RD35, RD36, RD37, RD38, RD39, RD40, RD41, RD42, RD43, RD44, RD45, RD46, RD47, RD48, RD49, RD50, RD51, RD52, RD53, RD54, RD55, RD56, RD57, RD58, RD59, RD60, RD61, RD62, RD63, RD64, RD65, RD66, RD67, RD68, RD69, RD70, RD71, RD72, RD73, RD74, RD75, RD76, RD77, RD78, RD79, RD80, RD81, RD82, RD83, RD84, RD85, RD86, RD87, RD88, RD89, RD90, RD91, RD92, RD93, RD94, RD95, RD96, RD97, RD98, RD99, RD100, RD101, RD102, RD103, RD104, RD105, RD106, RD107, RD108, RD109, RD110, RD111, RD112, RD113, RD114, RD115, RD116, RD117, RD118, RD119, RD120, RD121, RD122, RD123, RD124, RD125, RD126, RD127]>>
+]>;
+
+// PTX Return Value Calling Convention
+def RetCC_PTX : CallingConv<[
+ CCIfType<[i1], CCAssignToReg<[P0, P1, P2, P3, P4, P5, P6, P7, P8, P9, P10, P11]>>,
+ CCIfType<[i16], CCAssignToReg<[RH0, RH1, RH2, RH3, RH4, RH5, RH6, RH7, RH8, RH9, RH10, RH11]>>,
+ CCIfType<[i32,f32], CCAssignToReg<[R0, R1, R2, R3, R4, R5, R6, R7, R8, R9, R10, R11]>>,
+ CCIfType<[i64,f64], CCAssignToReg<[RD0, RD1, RD2, RD3, RD4, RD5, RD6, RD7, RD8, RD9, RD10, RD11]>>
+]>;
diff --git a/contrib/llvm/lib/Target/PTX/PTXISelDAGToDAG.cpp b/contrib/llvm/lib/Target/PTX/PTXISelDAGToDAG.cpp
index b3c85da..9adfa62 100644
--- a/contrib/llvm/lib/Target/PTX/PTXISelDAGToDAG.cpp
+++ b/contrib/llvm/lib/Target/PTX/PTXISelDAGToDAG.cpp
@@ -15,6 +15,7 @@
#include "PTXTargetMachine.h"
#include "llvm/CodeGen/SelectionDAGISel.h"
#include "llvm/DerivedTypes.h"
+#include "llvm/Support/Debug.h"
#include "llvm/Support/raw_ostream.h"
using namespace llvm;
@@ -41,8 +42,6 @@ class PTXDAGToDAGISel : public SelectionDAGISel {
#include "PTXGenDAGISel.inc"
private:
- SDNode *SelectREAD_PARAM(SDNode *Node);
-
// We need this only because we can't match intruction BRAdp
// pattern (PTXbrcond bb:$d, ...) in PTXInstrInfo.td
SDNode *SelectBRCOND(SDNode *Node);
@@ -67,8 +66,6 @@ PTXDAGToDAGISel::PTXDAGToDAGISel(PTXTargetMachine &TM,
SDNode *PTXDAGToDAGISel::Select(SDNode *Node) {
switch (Node->getOpcode()) {
- case PTXISD::READ_PARAM:
- return SelectREAD_PARAM(Node);
case ISD::BRCOND:
return SelectBRCOND(Node);
default:
@@ -76,37 +73,6 @@ SDNode *PTXDAGToDAGISel::Select(SDNode *Node) {
}
}
-SDNode *PTXDAGToDAGISel::SelectREAD_PARAM(SDNode *Node) {
- SDValue index = Node->getOperand(1);
- DebugLoc dl = Node->getDebugLoc();
- unsigned opcode;
-
- if (index.getOpcode() != ISD::TargetConstant)
- llvm_unreachable("READ_PARAM: index is not ISD::TargetConstant");
-
- if (Node->getValueType(0) == MVT::i16) {
- opcode = PTX::LDpiU16;
- }
- else if (Node->getValueType(0) == MVT::i32) {
- opcode = PTX::LDpiU32;
- }
- else if (Node->getValueType(0) == MVT::i64) {
- opcode = PTX::LDpiU64;
- }
- else if (Node->getValueType(0) == MVT::f32) {
- opcode = PTX::LDpiF32;
- }
- else if (Node->getValueType(0) == MVT::f64) {
- opcode = PTX::LDpiF64;
- }
- else {
- llvm_unreachable("Unknown parameter type for ld.param");
- }
-
- return PTXInstrInfo::
- GetPTXMachineNode(CurDAG, opcode, dl, Node->getValueType(0), index);
-}
-
SDNode *PTXDAGToDAGISel::SelectBRCOND(SDNode *Node) {
assert(Node->getNumOperands() >= 3);
diff --git a/contrib/llvm/lib/Target/PTX/PTXISelLowering.cpp b/contrib/llvm/lib/Target/PTX/PTXISelLowering.cpp
index e9b1d8c..6fcf710 100644
--- a/contrib/llvm/lib/Target/PTX/PTXISelLowering.cpp
+++ b/contrib/llvm/lib/Target/PTX/PTXISelLowering.cpp
@@ -15,7 +15,9 @@
#include "PTXISelLowering.h"
#include "PTXMachineFunctionInfo.h"
#include "PTXRegisterInfo.h"
+#include "PTXSubtarget.h"
#include "llvm/Support/ErrorHandling.h"
+#include "llvm/CodeGen/CallingConvLower.h"
#include "llvm/CodeGen/MachineFunction.h"
#include "llvm/CodeGen/MachineRegisterInfo.h"
#include "llvm/CodeGen/SelectionDAG.h"
@@ -24,49 +26,80 @@
using namespace llvm;
+//===----------------------------------------------------------------------===//
+// Calling Convention Implementation
+//===----------------------------------------------------------------------===//
+
+#include "PTXGenCallingConv.inc"
+
+//===----------------------------------------------------------------------===//
+// TargetLowering Implementation
+//===----------------------------------------------------------------------===//
+
PTXTargetLowering::PTXTargetLowering(TargetMachine &TM)
: TargetLowering(TM, new TargetLoweringObjectFileELF()) {
// Set up the register classes.
- addRegisterClass(MVT::i1, PTX::PredsRegisterClass);
- addRegisterClass(MVT::i16, PTX::RRegu16RegisterClass);
- addRegisterClass(MVT::i32, PTX::RRegu32RegisterClass);
- addRegisterClass(MVT::i64, PTX::RRegu64RegisterClass);
- addRegisterClass(MVT::f32, PTX::RRegf32RegisterClass);
- addRegisterClass(MVT::f64, PTX::RRegf64RegisterClass);
+ addRegisterClass(MVT::i1, PTX::RegPredRegisterClass);
+ addRegisterClass(MVT::i16, PTX::RegI16RegisterClass);
+ addRegisterClass(MVT::i32, PTX::RegI32RegisterClass);
+ addRegisterClass(MVT::i64, PTX::RegI64RegisterClass);
+ addRegisterClass(MVT::f32, PTX::RegF32RegisterClass);
+ addRegisterClass(MVT::f64, PTX::RegF64RegisterClass);
setBooleanContents(ZeroOrOneBooleanContent);
+ setMinFunctionAlignment(2);
- setOperationAction(ISD::EXCEPTIONADDR, MVT::i32, Expand);
-
- setOperationAction(ISD::ConstantFP, MVT::f32, Legal);
- setOperationAction(ISD::ConstantFP, MVT::f64, Legal);
+ ////////////////////////////////////
+ /////////// Expansion //////////////
+ ////////////////////////////////////
+
+ // (any/zero/sign) extload => load + (any/zero/sign) extend
- // Turn i16 (z)extload into load + (z)extend
setLoadExtAction(ISD::EXTLOAD, MVT::i16, Expand);
setLoadExtAction(ISD::ZEXTLOAD, MVT::i16, Expand);
-
- // Turn f32 extload into load + fextend
- setLoadExtAction(ISD::EXTLOAD, MVT::f32, Expand);
+ setLoadExtAction(ISD::SEXTLOAD, MVT::i16, Expand);
- // Turn f64 truncstore into trunc + store.
- setTruncStoreAction(MVT::f64, MVT::f32, Expand);
+ // f32 extload => load + fextend
+
+ setLoadExtAction(ISD::EXTLOAD, MVT::f32, Expand);
+
+ // f64 truncstore => trunc + store
+
+ setTruncStoreAction(MVT::f64, MVT::f32, Expand);
+
+ // sign_extend_inreg => sign_extend
+
+ setOperationAction(ISD::SIGN_EXTEND_INREG, MVT::i1, Expand);
+
+ // br_cc => brcond
- // Customize translation of memory addresses
- setOperationAction(ISD::GlobalAddress, MVT::i32, Custom);
- setOperationAction(ISD::GlobalAddress, MVT::i64, Custom);
-
- // Expand BR_CC into BRCOND
setOperationAction(ISD::BR_CC, MVT::Other, Expand);
- // Expand SELECT_CC into SETCC
+ // select_cc => setcc
+
setOperationAction(ISD::SELECT_CC, MVT::Other, Expand);
setOperationAction(ISD::SELECT_CC, MVT::f32, Expand);
setOperationAction(ISD::SELECT_CC, MVT::f64, Expand);
- // need to lower SETCC of Preds into bitwise logic
+ ////////////////////////////////////
+ //////////// Legal /////////////////
+ ////////////////////////////////////
+
+ setOperationAction(ISD::ConstantFP, MVT::f32, Legal);
+ setOperationAction(ISD::ConstantFP, MVT::f64, Legal);
+
+ ////////////////////////////////////
+ //////////// Custom ////////////////
+ ////////////////////////////////////
+
+ // customise setcc to use bitwise logic if possible
+
setOperationAction(ISD::SETCC, MVT::i1, Custom);
- setMinFunctionAlignment(2);
+ // customize translation of memory addresses
+
+ setOperationAction(ISD::GlobalAddress, MVT::i32, Custom);
+ setOperationAction(ISD::GlobalAddress, MVT::i64, Custom);
// Compute derived properties from the register classes
computeRegisterProperties();
@@ -93,8 +126,10 @@ const char *PTXTargetLowering::getTargetNodeName(unsigned Opcode) const {
llvm_unreachable("Unknown opcode");
case PTXISD::COPY_ADDRESS:
return "PTXISD::COPY_ADDRESS";
- case PTXISD::READ_PARAM:
- return "PTXISD::READ_PARAM";
+ case PTXISD::LOAD_PARAM:
+ return "PTXISD::LOAD_PARAM";
+ case PTXISD::STORE_PARAM:
+ return "PTXISD::STORE_PARAM";
case PTXISD::EXIT:
return "PTXISD::EXIT";
case PTXISD::RET:
@@ -113,18 +148,18 @@ SDValue PTXTargetLowering::LowerSETCC(SDValue Op, SelectionDAG &DAG) const {
SDValue Op2 = Op.getOperand(2);
DebugLoc dl = Op.getDebugLoc();
ISD::CondCode CC = cast<CondCodeSDNode>(Op.getOperand(2))->get();
-
+
// Look for X == 0, X == 1, X != 0, or X != 1
// We can simplify these to bitwise logic
-
+
if (Op1.getOpcode() == ISD::Constant &&
(cast<ConstantSDNode>(Op1)->getZExtValue() == 1 ||
cast<ConstantSDNode>(Op1)->isNullValue()) &&
(CC == ISD::SETEQ || CC == ISD::SETNE)) {
- return DAG.getNode(ISD::AND, dl, MVT::i1, Op0, Op1);
+ return DAG.getNode(ISD::AND, dl, MVT::i1, Op0, Op1);
}
-
+
return DAG.getNode(ISD::SETCC, dl, MVT::i1, Op0, Op1, Op2);
}
@@ -149,27 +184,6 @@ LowerGlobalAddress(SDValue Op, SelectionDAG &DAG) const {
// Calling Convention Implementation
//===----------------------------------------------------------------------===//
-namespace {
-struct argmap_entry {
- MVT::SimpleValueType VT;
- TargetRegisterClass *RC;
- TargetRegisterClass::iterator loc;
-
- argmap_entry(MVT::SimpleValueType _VT, TargetRegisterClass *_RC)
- : VT(_VT), RC(_RC), loc(_RC->begin()) {}
-
- void reset() { loc = RC->begin(); }
- bool operator==(MVT::SimpleValueType _VT) const { return VT == _VT; }
-} argmap[] = {
- argmap_entry(MVT::i1, PTX::PredsRegisterClass),
- argmap_entry(MVT::i16, PTX::RRegu16RegisterClass),
- argmap_entry(MVT::i32, PTX::RRegu32RegisterClass),
- argmap_entry(MVT::i64, PTX::RRegu64RegisterClass),
- argmap_entry(MVT::f32, PTX::RRegf32RegisterClass),
- argmap_entry(MVT::f64, PTX::RRegf64RegisterClass)
-};
-} // end anonymous namespace
-
SDValue PTXTargetLowering::
LowerFormalArguments(SDValue Chain,
CallingConv::ID CallConv,
@@ -181,6 +195,7 @@ SDValue PTXTargetLowering::
if (isVarArg) llvm_unreachable("PTX does not support varargs");
MachineFunction &MF = DAG.getMachineFunction();
+ const PTXSubtarget& ST = getTargetMachine().getSubtarget<PTXSubtarget>();
PTXMachineFunctionInfo *MFI = MF.getInfo<PTXMachineFunctionInfo>();
switch (CallConv) {
@@ -195,44 +210,76 @@ SDValue PTXTargetLowering::
break;
}
- // Make sure we don't add argument registers twice
- if (MFI->isDoneAddArg())
- llvm_unreachable("cannot add argument registers twice");
-
- // Reset argmap before allocation
- for (struct argmap_entry *i = argmap, *e = argmap + array_lengthof(argmap);
- i != e; ++ i)
- i->reset();
-
- for (int i = 0, e = Ins.size(); i != e; ++ i) {
- MVT::SimpleValueType VT = Ins[i].VT.SimpleTy;
-
- struct argmap_entry *entry = std::find(argmap,
- argmap + array_lengthof(argmap), VT);
- if (entry == argmap + array_lengthof(argmap))
- llvm_unreachable("Type of argument is not supported");
-
- if (MFI->isKernel() && entry->RC == PTX::PredsRegisterClass)
- llvm_unreachable("cannot pass preds to kernel");
-
- MachineRegisterInfo &RegInfo = DAG.getMachineFunction().getRegInfo();
-
- unsigned preg = *++(entry->loc); // allocate start from register 1
- unsigned vreg = RegInfo.createVirtualRegister(entry->RC);
- RegInfo.addLiveIn(preg, vreg);
-
- MFI->addArgReg(preg);
-
- SDValue inval;
- if (MFI->isKernel())
- inval = DAG.getNode(PTXISD::READ_PARAM, dl, VT, Chain,
- DAG.getTargetConstant(i, MVT::i32));
- else
- inval = DAG.getCopyFromReg(Chain, dl, vreg, VT);
- InVals.push_back(inval);
+ // We do one of two things here:
+ // IsKernel || SM >= 2.0 -> Use param space for arguments
+ // SM < 2.0 -> Use registers for arguments
+ if (MFI->isKernel() || ST.useParamSpaceForDeviceArgs()) {
+ // We just need to emit the proper LOAD_PARAM ISDs
+ for (unsigned i = 0, e = Ins.size(); i != e; ++i) {
+
+ assert((!MFI->isKernel() || Ins[i].VT != MVT::i1) &&
+ "Kernels cannot take pred operands");
+
+ SDValue ArgValue = DAG.getNode(PTXISD::LOAD_PARAM, dl, Ins[i].VT, Chain,
+ DAG.getTargetConstant(i, MVT::i32));
+ InVals.push_back(ArgValue);
+
+ // Instead of storing a physical register in our argument list, we just
+ // store the total size of the parameter, in bits. The ASM printer
+ // knows how to process this.
+ MFI->addArgReg(Ins[i].VT.getStoreSizeInBits());
+ }
+ }
+ else {
+ // For device functions, we use the PTX calling convention to do register
+ // assignments then create CopyFromReg ISDs for the allocated registers
+
+ SmallVector<CCValAssign, 16> ArgLocs;
+ CCState CCInfo(CallConv, isVarArg, MF, getTargetMachine(), ArgLocs,
+ *DAG.getContext());
+
+ CCInfo.AnalyzeFormalArguments(Ins, CC_PTX);
+
+ for (unsigned i = 0, e = ArgLocs.size(); i != e; ++i) {
+
+ CCValAssign& VA = ArgLocs[i];
+ EVT RegVT = VA.getLocVT();
+ TargetRegisterClass* TRC = 0;
+
+ assert(VA.isRegLoc() && "CCValAssign must be RegLoc");
+
+ // Determine which register class we need
+ if (RegVT == MVT::i1) {
+ TRC = PTX::RegPredRegisterClass;
+ }
+ else if (RegVT == MVT::i16) {
+ TRC = PTX::RegI16RegisterClass;
+ }
+ else if (RegVT == MVT::i32) {
+ TRC = PTX::RegI32RegisterClass;
+ }
+ else if (RegVT == MVT::i64) {
+ TRC = PTX::RegI64RegisterClass;
+ }
+ else if (RegVT == MVT::f32) {
+ TRC = PTX::RegF32RegisterClass;
+ }
+ else if (RegVT == MVT::f64) {
+ TRC = PTX::RegF64RegisterClass;
+ }
+ else {
+ llvm_unreachable("Unknown parameter type");
+ }
+
+ unsigned Reg = MF.getRegInfo().createVirtualRegister(TRC);
+ MF.getRegInfo().addLiveIn(VA.getLocReg(), Reg);
+
+ SDValue ArgValue = DAG.getCopyFromReg(Chain, dl, Reg, RegVT);
+ InVals.push_back(ArgValue);
+
+ MFI->addArgReg(VA.getLocReg());
+ }
}
-
- MFI->doneAddArg();
return Chain;
}
@@ -254,51 +301,47 @@ SDValue PTXTargetLowering::
assert(Outs.size() == 0 && "Kernel must return void.");
return DAG.getNode(PTXISD::EXIT, dl, MVT::Other, Chain);
case CallingConv::PTX_Device:
- assert(Outs.size() <= 1 && "Can at most return one value.");
+ //assert(Outs.size() <= 1 && "Can at most return one value.");
break;
}
- // PTX_Device
-
- // return void
- if (Outs.size() == 0)
- return DAG.getNode(PTXISD::RET, dl, MVT::Other, Chain);
+ MachineFunction& MF = DAG.getMachineFunction();
+ PTXMachineFunctionInfo *MFI = MF.getInfo<PTXMachineFunctionInfo>();
SDValue Flag;
- unsigned reg;
- if (Outs[0].VT == MVT::i16) {
- reg = PTX::RH0;
- }
- else if (Outs[0].VT == MVT::i32) {
- reg = PTX::R0;
- }
- else if (Outs[0].VT == MVT::i64) {
- reg = PTX::RD0;
- }
- else if (Outs[0].VT == MVT::f32) {
- reg = PTX::F0;
- }
- else {
- assert(Outs[0].VT == MVT::f64 && "Can return only basic types");
- reg = PTX::FD0;
- }
+ // Even though we could use the .param space for return arguments for
+ // device functions if SM >= 2.0 and the number of return arguments is
+ // only 1, we just always use registers since this makes the codegen
+ // easier.
+ SmallVector<CCValAssign, 16> RVLocs;
+ CCState CCInfo(CallConv, isVarArg, DAG.getMachineFunction(),
+ getTargetMachine(), RVLocs, *DAG.getContext());
- MachineFunction &MF = DAG.getMachineFunction();
- PTXMachineFunctionInfo *MFI = MF.getInfo<PTXMachineFunctionInfo>();
- MFI->setRetReg(reg);
+ CCInfo.AnalyzeReturn(Outs, RetCC_PTX);
+
+ for (unsigned i = 0, e = RVLocs.size(); i != e; ++i) {
+ CCValAssign& VA = RVLocs[i];
- // If this is the first return lowered for this function, add the regs to the
- // liveout set for the function
- if (DAG.getMachineFunction().getRegInfo().liveout_empty())
- DAG.getMachineFunction().getRegInfo().addLiveOut(reg);
+ assert(VA.isRegLoc() && "CCValAssign must be RegLoc");
- // Copy the result values into the output registers
- Chain = DAG.getCopyToReg(Chain, dl, reg, OutVals[0], Flag);
+ unsigned Reg = VA.getLocReg();
- // Guarantee that all emitted copies are stuck together,
- // avoiding something bad
- Flag = Chain.getValue(1);
+ DAG.getMachineFunction().getRegInfo().addLiveOut(Reg);
- return DAG.getNode(PTXISD::RET, dl, MVT::Other, Chain, Flag);
+ Chain = DAG.getCopyToReg(Chain, dl, Reg, OutVals[i], Flag);
+
+ // Guarantee that all emitted copies are stuck together,
+ // avoiding something bad
+ Flag = Chain.getValue(1);
+
+ MFI->addRetReg(Reg);
+ }
+
+ if (Flag.getNode() == 0) {
+ return DAG.getNode(PTXISD::RET, dl, MVT::Other, Chain);
+ }
+ else {
+ return DAG.getNode(PTXISD::RET, dl, MVT::Other, Chain, Flag);
+ }
}
diff --git a/contrib/llvm/lib/Target/PTX/PTXISelLowering.h b/contrib/llvm/lib/Target/PTX/PTXISelLowering.h
index 225c000..4318541 100644
--- a/contrib/llvm/lib/Target/PTX/PTXISelLowering.h
+++ b/contrib/llvm/lib/Target/PTX/PTXISelLowering.h
@@ -24,12 +24,13 @@ class PTXTargetMachine;
namespace PTXISD {
enum NodeType {
FIRST_NUMBER = ISD::BUILTIN_OP_END,
- READ_PARAM,
+ LOAD_PARAM,
+ STORE_PARAM,
EXIT,
RET,
COPY_ADDRESS
};
-} // namespace PTXISD
+} // namespace PTXISD
class PTXTargetLowering : public TargetLowering {
public:
@@ -40,7 +41,7 @@ class PTXTargetLowering : public TargetLowering {
virtual SDValue LowerOperation(SDValue Op, SelectionDAG &DAG) const;
virtual SDValue LowerSETCC(SDValue Op, SelectionDAG &DAG) const;
-
+
virtual SDValue
LowerFormalArguments(SDValue Chain,
CallingConv::ID CallConv,
@@ -58,9 +59,9 @@ class PTXTargetLowering : public TargetLowering {
const SmallVectorImpl<SDValue> &OutVals,
DebugLoc dl,
SelectionDAG &DAG) const;
-
+
virtual MVT::SimpleValueType getSetCCResultType(EVT VT) const;
-
+
private:
SDValue LowerGlobalAddress(SDValue Op, SelectionDAG &DAG) const;
}; // class PTXTargetLowering
diff --git a/contrib/llvm/lib/Target/PTX/PTXInstrFormats.td b/contrib/llvm/lib/Target/PTX/PTXInstrFormats.td
index e4e0999..8cee351 100644
--- a/contrib/llvm/lib/Target/PTX/PTXInstrFormats.td
+++ b/contrib/llvm/lib/Target/PTX/PTXInstrFormats.td
@@ -9,7 +9,7 @@
// PTX Predicate operand, default to (0, 0) = (zero-reg, always).
// Leave PrintMethod empty; predicate printing is defined elsewhere.
-def pred : PredicateOperand<OtherVT, (ops Preds, i32imm),
+def pred : PredicateOperand<OtherVT, (ops RegPred, i32imm),
(ops (i1 zero_reg), (i32 0))>;
let Namespace = "PTX" in {
diff --git a/contrib/llvm/lib/Target/PTX/PTXInstrInfo.cpp b/contrib/llvm/lib/Target/PTX/PTXInstrInfo.cpp
index a12a6d0..425265a 100644
--- a/contrib/llvm/lib/Target/PTX/PTXInstrInfo.cpp
+++ b/contrib/llvm/lib/Target/PTX/PTXInstrInfo.cpp
@@ -18,27 +18,29 @@
#include "llvm/CodeGen/MachineInstrBuilder.h"
#include "llvm/CodeGen/SelectionDAG.h"
#include "llvm/CodeGen/SelectionDAGNodes.h"
+#include "llvm/Target/TargetRegistry.h"
#include "llvm/Support/Debug.h"
#include "llvm/Support/raw_ostream.h"
-using namespace llvm;
-
+#define GET_INSTRINFO_CTOR
#include "PTXGenInstrInfo.inc"
+using namespace llvm;
+
PTXInstrInfo::PTXInstrInfo(PTXTargetMachine &_TM)
- : TargetInstrInfoImpl(PTXInsts, array_lengthof(PTXInsts)),
+ : PTXGenInstrInfo(),
RI(_TM, *this), TM(_TM) {}
static const struct map_entry {
const TargetRegisterClass *cls;
const int opcode;
} map[] = {
- { &PTX::RRegu16RegClass, PTX::MOVU16rr },
- { &PTX::RRegu32RegClass, PTX::MOVU32rr },
- { &PTX::RRegu64RegClass, PTX::MOVU64rr },
- { &PTX::RRegf32RegClass, PTX::MOVF32rr },
- { &PTX::RRegf64RegClass, PTX::MOVF64rr },
- { &PTX::PredsRegClass, PTX::MOVPREDrr }
+ { &PTX::RegI16RegClass, PTX::MOVU16rr },
+ { &PTX::RegI32RegClass, PTX::MOVU32rr },
+ { &PTX::RegI64RegClass, PTX::MOVU64rr },
+ { &PTX::RegF32RegClass, PTX::MOVF32rr },
+ { &PTX::RegF64RegClass, PTX::MOVF64rr },
+ { &PTX::RegPredRegClass, PTX::MOVPREDrr }
};
void PTXInstrInfo::copyPhysReg(MachineBasicBlock &MBB,
@@ -47,8 +49,8 @@ void PTXInstrInfo::copyPhysReg(MachineBasicBlock &MBB,
bool KillSrc) const {
for (int i = 0, e = sizeof(map)/sizeof(map[0]); i != e; ++ i) {
if (map[i].cls->contains(DstReg, SrcReg)) {
- const TargetInstrDesc &TID = get(map[i].opcode);
- MachineInstr *MI = BuildMI(MBB, I, DL, TID, DstReg).
+ const MCInstrDesc &MCID = get(map[i].opcode);
+ MachineInstr *MI = BuildMI(MBB, I, DL, MCID, DstReg).
addReg(SrcReg, getKillRegState(KillSrc));
AddDefaultPredicate(MI);
return;
@@ -69,8 +71,8 @@ bool PTXInstrInfo::copyRegToReg(MachineBasicBlock &MBB,
for (int i = 0, e = sizeof(map)/sizeof(map[0]); i != e; ++ i)
if (DstRC == map[i].cls) {
- const TargetInstrDesc &TID = get(map[i].opcode);
- MachineInstr *MI = BuildMI(MBB, I, DL, TID, DstReg).addReg(SrcReg);
+ const MCInstrDesc &MCID = get(map[i].opcode);
+ MachineInstr *MI = BuildMI(MBB, I, DL, MCID, DstReg).addReg(SrcReg);
AddDefaultPredicate(MI);
return true;
}
@@ -155,7 +157,7 @@ DefinesPredicate(MachineInstr *MI,
const MachineOperand &MO = MI->getOperand(0);
- if (!MO.isReg() || RI.getRegClass(MO.getReg()) != &PTX::PredsRegClass)
+ if (!MO.isReg() || RI.getRegClass(MO.getReg()) != &PTX::RegPredRegClass)
return false;
Pred.push_back(MO);
@@ -178,13 +180,13 @@ AnalyzeBranch(MachineBasicBlock &MBB,
MachineBasicBlock::const_iterator iter = MBB.end();
const MachineInstr& instLast1 = *--iter;
- const TargetInstrDesc &desc1 = instLast1.getDesc();
+ const MCInstrDesc &desc1 = instLast1.getDesc();
// for special case that MBB has only 1 instruction
const bool IsSizeOne = MBB.size() == 1;
// if IsSizeOne is true, *--iter and instLast2 are invalid
// we put a dummy value in instLast2 and desc2 since they are used
const MachineInstr& instLast2 = IsSizeOne ? instLast1 : *--iter;
- const TargetInstrDesc &desc2 = IsSizeOne ? desc1 : instLast2.getDesc();
+ const MCInstrDesc &desc2 = IsSizeOne ? desc1 : instLast2.getDesc();
DEBUG(dbgs() << "\n");
DEBUG(dbgs() << "AnalyzeBranch: opcode: " << instLast1.getOpcode() << "\n");
@@ -288,6 +290,77 @@ InsertBranch(MachineBasicBlock &MBB,
}
}
+// Memory operand folding for spills
+void PTXInstrInfo::storeRegToStackSlot(MachineBasicBlock &MBB,
+ MachineBasicBlock::iterator MII,
+ unsigned SrcReg, bool isKill, int FrameIdx,
+ const TargetRegisterClass *RC,
+ const TargetRegisterInfo *TRI) const {
+ MachineInstr& MI = *MII;
+ DebugLoc DL = MI.getDebugLoc();
+
+ DEBUG(dbgs() << "storeRegToStackSlot: " << MI);
+
+ int OpCode;
+
+ // Select the appropriate opcode based on the register class
+ if (RC == PTX::RegI16RegisterClass) {
+ OpCode = PTX::STACKSTOREI16;
+ } else if (RC == PTX::RegI32RegisterClass) {
+ OpCode = PTX::STACKSTOREI32;
+ } else if (RC == PTX::RegI64RegisterClass) {
+ OpCode = PTX::STACKSTOREI32;
+ } else if (RC == PTX::RegF32RegisterClass) {
+ OpCode = PTX::STACKSTOREF32;
+ } else if (RC == PTX::RegF64RegisterClass) {
+ OpCode = PTX::STACKSTOREF64;
+ } else {
+ llvm_unreachable("Unknown PTX register class!");
+ }
+
+ // Build the store instruction (really a mov)
+ MachineInstrBuilder MIB = BuildMI(MBB, MII, DL, get(OpCode));
+ MIB.addFrameIndex(FrameIdx);
+ MIB.addReg(SrcReg);
+
+ AddDefaultPredicate(MIB);
+}
+
+void PTXInstrInfo::loadRegFromStackSlot(MachineBasicBlock &MBB,
+ MachineBasicBlock::iterator MII,
+ unsigned DestReg, int FrameIdx,
+ const TargetRegisterClass *RC,
+ const TargetRegisterInfo *TRI) const {
+ MachineInstr& MI = *MII;
+ DebugLoc DL = MI.getDebugLoc();
+
+ DEBUG(dbgs() << "loadRegToStackSlot: " << MI);
+
+ int OpCode;
+
+ // Select the appropriate opcode based on the register class
+ if (RC == PTX::RegI16RegisterClass) {
+ OpCode = PTX::STACKLOADI16;
+ } else if (RC == PTX::RegI32RegisterClass) {
+ OpCode = PTX::STACKLOADI32;
+ } else if (RC == PTX::RegI64RegisterClass) {
+ OpCode = PTX::STACKLOADI32;
+ } else if (RC == PTX::RegF32RegisterClass) {
+ OpCode = PTX::STACKLOADF32;
+ } else if (RC == PTX::RegF64RegisterClass) {
+ OpCode = PTX::STACKLOADF64;
+ } else {
+ llvm_unreachable("Unknown PTX register class!");
+ }
+
+ // Build the load instruction (really a mov)
+ MachineInstrBuilder MIB = BuildMI(MBB, MII, DL, get(OpCode));
+ MIB.addReg(DestReg);
+ MIB.addFrameIndex(FrameIdx);
+
+ AddDefaultPredicate(MIB);
+}
+
// static helper routines
MachineSDNode *PTXInstrInfo::
@@ -316,7 +389,7 @@ void PTXInstrInfo::AddDefaultPredicate(MachineInstr *MI) {
}
bool PTXInstrInfo::IsAnyKindOfBranch(const MachineInstr& inst) {
- const TargetInstrDesc &desc = inst.getDesc();
+ const MCInstrDesc &desc = inst.getDesc();
return desc.isTerminator() || desc.isBranch() || desc.isIndirectBranch();
}
diff --git a/contrib/llvm/lib/Target/PTX/PTXInstrInfo.h b/contrib/llvm/lib/Target/PTX/PTXInstrInfo.h
index a04be77..871f1ac 100644
--- a/contrib/llvm/lib/Target/PTX/PTXInstrInfo.h
+++ b/contrib/llvm/lib/Target/PTX/PTXInstrInfo.h
@@ -17,6 +17,9 @@
#include "PTXRegisterInfo.h"
#include "llvm/Target/TargetInstrInfo.h"
+#define GET_INSTRINFO_HEADER
+#include "PTXGenInstrInfo.inc"
+
namespace llvm {
class PTXTargetMachine;
@@ -24,7 +27,7 @@ class MachineSDNode;
class SDValue;
class SelectionDAG;
-class PTXInstrInfo : public TargetInstrInfoImpl {
+class PTXInstrInfo : public PTXGenInstrInfo {
private:
const PTXRegisterInfo RI;
PTXTargetMachine &TM;
@@ -84,6 +87,29 @@ public:
const SmallVectorImpl<MachineOperand> &Cond,
DebugLoc DL) const;
+ // Memory operand folding for spills
+ // TODO: Implement this eventually and get rid of storeRegToStackSlot and
+ // loadRegFromStackSlot. Doing so will get rid of the "stack" registers
+ // we currently use to spill, though I doubt the overall effect on ptxas
+ // output will be large. I have yet to see a case where ptxas is unable
+ // to see through the "stack" register usage and hence generates
+ // efficient code anyway.
+ // virtual MachineInstr* foldMemoryOperandImpl(MachineFunction &MF,
+ // MachineInstr* MI,
+ // const SmallVectorImpl<unsigned> &Ops,
+ // int FrameIndex) const;
+
+ virtual void storeRegToStackSlot(MachineBasicBlock& MBB,
+ MachineBasicBlock::iterator MII,
+ unsigned SrcReg, bool isKill, int FrameIndex,
+ const TargetRegisterClass* RC,
+ const TargetRegisterInfo* TRI) const;
+ virtual void loadRegFromStackSlot(MachineBasicBlock &MBB,
+ MachineBasicBlock::iterator MII,
+ unsigned DestReg, int FrameIdx,
+ const TargetRegisterClass *RC,
+ const TargetRegisterInfo *TRI) const;
+
// static helper routines
static MachineSDNode *GetPTXMachineNode(SelectionDAG *DAG, unsigned Opcode,
diff --git a/contrib/llvm/lib/Target/PTX/PTXInstrInfo.td b/contrib/llvm/lib/Target/PTX/PTXInstrInfo.td
index d5d08be..6bfe906 100644
--- a/contrib/llvm/lib/Target/PTX/PTXInstrInfo.td
+++ b/contrib/llvm/lib/Target/PTX/PTXInstrInfo.td
@@ -26,10 +26,10 @@ def Use32BitAddresses : Predicate<"!getSubtarget().is64Bit()">;
def Use64BitAddresses : Predicate<"getSubtarget().is64Bit()">;
// Shader Model Support
-def SupportsSM13 : Predicate<"getSubtarget().supportsSM13()">;
-def DoesNotSupportSM13 : Predicate<"!getSubtarget().supportsSM13()">;
-def SupportsSM20 : Predicate<"getSubtarget().supportsSM20()">;
-def DoesNotSupportSM20 : Predicate<"!getSubtarget().supportsSM20()">;
+def FDivNeedsRoundingMode : Predicate<"getSubtarget().fdivNeedsRoundingMode()">;
+def FDivNoRoundingMode : Predicate<"!getSubtarget().fdivNeedsRoundingMode()">;
+def FMadNeedsRoundingMode : Predicate<"getSubtarget().fmadNeedsRoundingMode()">;
+def FMadNoRoundingMode : Predicate<"!getSubtarget().fmadNeedsRoundingMode()">;
// PTX Version Support
def SupportsPTX21 : Predicate<"getSubtarget().supportsPTX21()">;
@@ -143,11 +143,11 @@ def ADDRii64 : ComplexPattern<i64, 2, "SelectADDRii", [], []>;
// Address operands
def MEMri32 : Operand<i32> {
let PrintMethod = "printMemOperand";
- let MIOperandInfo = (ops RRegu32, i32imm);
+ let MIOperandInfo = (ops RegI32, i32imm);
}
def MEMri64 : Operand<i64> {
let PrintMethod = "printMemOperand";
- let MIOperandInfo = (ops RRegu64, i64imm);
+ let MIOperandInfo = (ops RegI64, i64imm);
}
def MEMii32 : Operand<i32> {
let PrintMethod = "printMemOperand";
@@ -163,6 +163,10 @@ def MEMpi : Operand<i32> {
let PrintMethod = "printParamOperand";
let MIOperandInfo = (ops i32imm);
}
+def MEMret : Operand<i32> {
+ let PrintMethod = "printReturnOperand";
+ let MIOperandInfo = (ops i32imm);
+}
// Branch & call targets have OtherVT type.
def brtarget : Operand<OtherVT>;
@@ -180,181 +184,190 @@ def PTXsra : SDNode<"ISD::SRA", SDTIntBinOp>;
def PTXexit
: SDNode<"PTXISD::EXIT", SDTNone, [SDNPHasChain]>;
def PTXret
- : SDNode<"PTXISD::RET", SDTNone, [SDNPHasChain]>;
+ : SDNode<"PTXISD::RET", SDTNone,
+ [SDNPHasChain, SDNPOptInGlue, SDNPVariadic]>;
def PTXcopyaddress
: SDNode<"PTXISD::COPY_ADDRESS", SDTypeProfile<1, 1, []>, []>;
+// Load/store .param space
+def PTXloadparam
+ : SDNode<"PTXISD::LOAD_PARAM", SDTypeProfile<1, 1, [SDTCisVT<1, i32>]>,
+ [SDNPHasChain, SDNPOutGlue, SDNPOptInGlue]>;
+def PTXstoreparam
+ : SDNode<"PTXISD::STORE_PARAM", SDTypeProfile<0, 2, [SDTCisVT<0, i32>]>,
+ [SDNPHasChain, SDNPOutGlue, SDNPOptInGlue]>;
+
//===----------------------------------------------------------------------===//
// Instruction Class Templates
//===----------------------------------------------------------------------===//
//===- Floating-Point Instructions - 2 Operand Form -----------------------===//
multiclass PTX_FLOAT_2OP<string opcstr, SDNode opnode> {
- def rr32 : InstPTX<(outs RRegf32:$d),
- (ins RRegf32:$a),
+ def rr32 : InstPTX<(outs RegF32:$d),
+ (ins RegF32:$a),
!strconcat(opcstr, ".f32\t$d, $a"),
- [(set RRegf32:$d, (opnode RRegf32:$a))]>;
- def ri32 : InstPTX<(outs RRegf32:$d),
+ [(set RegF32:$d, (opnode RegF32:$a))]>;
+ def ri32 : InstPTX<(outs RegF32:$d),
(ins f32imm:$a),
!strconcat(opcstr, ".f32\t$d, $a"),
- [(set RRegf32:$d, (opnode fpimm:$a))]>;
- def rr64 : InstPTX<(outs RRegf64:$d),
- (ins RRegf64:$a),
+ [(set RegF32:$d, (opnode fpimm:$a))]>;
+ def rr64 : InstPTX<(outs RegF64:$d),
+ (ins RegF64:$a),
!strconcat(opcstr, ".f64\t$d, $a"),
- [(set RRegf64:$d, (opnode RRegf64:$a))]>;
- def ri64 : InstPTX<(outs RRegf64:$d),
+ [(set RegF64:$d, (opnode RegF64:$a))]>;
+ def ri64 : InstPTX<(outs RegF64:$d),
(ins f64imm:$a),
!strconcat(opcstr, ".f64\t$d, $a"),
- [(set RRegf64:$d, (opnode fpimm:$a))]>;
+ [(set RegF64:$d, (opnode fpimm:$a))]>;
}
//===- Floating-Point Instructions - 3 Operand Form -----------------------===//
multiclass PTX_FLOAT_3OP<string opcstr, SDNode opnode> {
- def rr32 : InstPTX<(outs RRegf32:$d),
- (ins RRegf32:$a, RRegf32:$b),
+ def rr32 : InstPTX<(outs RegF32:$d),
+ (ins RegF32:$a, RegF32:$b),
!strconcat(opcstr, ".f32\t$d, $a, $b"),
- [(set RRegf32:$d, (opnode RRegf32:$a, RRegf32:$b))]>;
- def ri32 : InstPTX<(outs RRegf32:$d),
- (ins RRegf32:$a, f32imm:$b),
+ [(set RegF32:$d, (opnode RegF32:$a, RegF32:$b))]>;
+ def ri32 : InstPTX<(outs RegF32:$d),
+ (ins RegF32:$a, f32imm:$b),
!strconcat(opcstr, ".f32\t$d, $a, $b"),
- [(set RRegf32:$d, (opnode RRegf32:$a, fpimm:$b))]>;
- def rr64 : InstPTX<(outs RRegf64:$d),
- (ins RRegf64:$a, RRegf64:$b),
+ [(set RegF32:$d, (opnode RegF32:$a, fpimm:$b))]>;
+ def rr64 : InstPTX<(outs RegF64:$d),
+ (ins RegF64:$a, RegF64:$b),
!strconcat(opcstr, ".f64\t$d, $a, $b"),
- [(set RRegf64:$d, (opnode RRegf64:$a, RRegf64:$b))]>;
- def ri64 : InstPTX<(outs RRegf64:$d),
- (ins RRegf64:$a, f64imm:$b),
+ [(set RegF64:$d, (opnode RegF64:$a, RegF64:$b))]>;
+ def ri64 : InstPTX<(outs RegF64:$d),
+ (ins RegF64:$a, f64imm:$b),
!strconcat(opcstr, ".f64\t$d, $a, $b"),
- [(set RRegf64:$d, (opnode RRegf64:$a, fpimm:$b))]>;
+ [(set RegF64:$d, (opnode RegF64:$a, fpimm:$b))]>;
}
//===- Floating-Point Instructions - 4 Operand Form -----------------------===//
multiclass PTX_FLOAT_4OP<string opcstr, SDNode opnode1, SDNode opnode2> {
- def rrr32 : InstPTX<(outs RRegf32:$d),
- (ins RRegf32:$a, RRegf32:$b, RRegf32:$c),
+ def rrr32 : InstPTX<(outs RegF32:$d),
+ (ins RegF32:$a, RegF32:$b, RegF32:$c),
!strconcat(opcstr, ".f32\t$d, $a, $b, $c"),
- [(set RRegf32:$d, (opnode2 (opnode1 RRegf32:$a,
- RRegf32:$b),
- RRegf32:$c))]>;
- def rri32 : InstPTX<(outs RRegf32:$d),
- (ins RRegf32:$a, RRegf32:$b, f32imm:$c),
+ [(set RegF32:$d, (opnode2 (opnode1 RegF32:$a,
+ RegF32:$b),
+ RegF32:$c))]>;
+ def rri32 : InstPTX<(outs RegF32:$d),
+ (ins RegF32:$a, RegF32:$b, f32imm:$c),
!strconcat(opcstr, ".f32\t$d, $a, $b, $c"),
- [(set RRegf32:$d, (opnode2 (opnode1 RRegf32:$a,
- RRegf32:$b),
+ [(set RegF32:$d, (opnode2 (opnode1 RegF32:$a,
+ RegF32:$b),
fpimm:$c))]>;
- def rrr64 : InstPTX<(outs RRegf64:$d),
- (ins RRegf64:$a, RRegf64:$b, RRegf64:$c),
+ def rrr64 : InstPTX<(outs RegF64:$d),
+ (ins RegF64:$a, RegF64:$b, RegF64:$c),
!strconcat(opcstr, ".f64\t$d, $a, $b, $c"),
- [(set RRegf64:$d, (opnode2 (opnode1 RRegf64:$a,
- RRegf64:$b),
- RRegf64:$c))]>;
- def rri64 : InstPTX<(outs RRegf64:$d),
- (ins RRegf64:$a, RRegf64:$b, f64imm:$c),
+ [(set RegF64:$d, (opnode2 (opnode1 RegF64:$a,
+ RegF64:$b),
+ RegF64:$c))]>;
+ def rri64 : InstPTX<(outs RegF64:$d),
+ (ins RegF64:$a, RegF64:$b, f64imm:$c),
!strconcat(opcstr, ".f64\t$d, $a, $b, $c"),
- [(set RRegf64:$d, (opnode2 (opnode1 RRegf64:$a,
- RRegf64:$b),
+ [(set RegF64:$d, (opnode2 (opnode1 RegF64:$a,
+ RegF64:$b),
fpimm:$c))]>;
}
multiclass INT3<string opcstr, SDNode opnode> {
- def rr16 : InstPTX<(outs RRegu16:$d),
- (ins RRegu16:$a, RRegu16:$b),
+ def rr16 : InstPTX<(outs RegI16:$d),
+ (ins RegI16:$a, RegI16:$b),
!strconcat(opcstr, ".u16\t$d, $a, $b"),
- [(set RRegu16:$d, (opnode RRegu16:$a, RRegu16:$b))]>;
- def ri16 : InstPTX<(outs RRegu16:$d),
- (ins RRegu16:$a, i16imm:$b),
+ [(set RegI16:$d, (opnode RegI16:$a, RegI16:$b))]>;
+ def ri16 : InstPTX<(outs RegI16:$d),
+ (ins RegI16:$a, i16imm:$b),
!strconcat(opcstr, ".u16\t$d, $a, $b"),
- [(set RRegu16:$d, (opnode RRegu16:$a, imm:$b))]>;
- def rr32 : InstPTX<(outs RRegu32:$d),
- (ins RRegu32:$a, RRegu32:$b),
+ [(set RegI16:$d, (opnode RegI16:$a, imm:$b))]>;
+ def rr32 : InstPTX<(outs RegI32:$d),
+ (ins RegI32:$a, RegI32:$b),
!strconcat(opcstr, ".u32\t$d, $a, $b"),
- [(set RRegu32:$d, (opnode RRegu32:$a, RRegu32:$b))]>;
- def ri32 : InstPTX<(outs RRegu32:$d),
- (ins RRegu32:$a, i32imm:$b),
+ [(set RegI32:$d, (opnode RegI32:$a, RegI32:$b))]>;
+ def ri32 : InstPTX<(outs RegI32:$d),
+ (ins RegI32:$a, i32imm:$b),
!strconcat(opcstr, ".u32\t$d, $a, $b"),
- [(set RRegu32:$d, (opnode RRegu32:$a, imm:$b))]>;
- def rr64 : InstPTX<(outs RRegu64:$d),
- (ins RRegu64:$a, RRegu64:$b),
+ [(set RegI32:$d, (opnode RegI32:$a, imm:$b))]>;
+ def rr64 : InstPTX<(outs RegI64:$d),
+ (ins RegI64:$a, RegI64:$b),
!strconcat(opcstr, ".u64\t$d, $a, $b"),
- [(set RRegu64:$d, (opnode RRegu64:$a, RRegu64:$b))]>;
- def ri64 : InstPTX<(outs RRegu64:$d),
- (ins RRegu64:$a, i64imm:$b),
+ [(set RegI64:$d, (opnode RegI64:$a, RegI64:$b))]>;
+ def ri64 : InstPTX<(outs RegI64:$d),
+ (ins RegI64:$a, i64imm:$b),
!strconcat(opcstr, ".u64\t$d, $a, $b"),
- [(set RRegu64:$d, (opnode RRegu64:$a, imm:$b))]>;
+ [(set RegI64:$d, (opnode RegI64:$a, imm:$b))]>;
}
multiclass PTX_LOGIC<string opcstr, SDNode opnode> {
- def ripreds : InstPTX<(outs Preds:$d),
- (ins Preds:$a, i1imm:$b),
+ def ripreds : InstPTX<(outs RegPred:$d),
+ (ins RegPred:$a, i1imm:$b),
!strconcat(opcstr, ".pred\t$d, $a, $b"),
- [(set Preds:$d, (opnode Preds:$a, imm:$b))]>;
- def rrpreds : InstPTX<(outs Preds:$d),
- (ins Preds:$a, Preds:$b),
+ [(set RegPred:$d, (opnode RegPred:$a, imm:$b))]>;
+ def rrpreds : InstPTX<(outs RegPred:$d),
+ (ins RegPred:$a, RegPred:$b),
!strconcat(opcstr, ".pred\t$d, $a, $b"),
- [(set Preds:$d, (opnode Preds:$a, Preds:$b))]>;
- def rr16 : InstPTX<(outs RRegu16:$d),
- (ins RRegu16:$a, RRegu16:$b),
+ [(set RegPred:$d, (opnode RegPred:$a, RegPred:$b))]>;
+ def rr16 : InstPTX<(outs RegI16:$d),
+ (ins RegI16:$a, RegI16:$b),
!strconcat(opcstr, ".b16\t$d, $a, $b"),
- [(set RRegu16:$d, (opnode RRegu16:$a, RRegu16:$b))]>;
- def ri16 : InstPTX<(outs RRegu16:$d),
- (ins RRegu16:$a, i16imm:$b),
+ [(set RegI16:$d, (opnode RegI16:$a, RegI16:$b))]>;
+ def ri16 : InstPTX<(outs RegI16:$d),
+ (ins RegI16:$a, i16imm:$b),
!strconcat(opcstr, ".b16\t$d, $a, $b"),
- [(set RRegu16:$d, (opnode RRegu16:$a, imm:$b))]>;
- def rr32 : InstPTX<(outs RRegu32:$d),
- (ins RRegu32:$a, RRegu32:$b),
+ [(set RegI16:$d, (opnode RegI16:$a, imm:$b))]>;
+ def rr32 : InstPTX<(outs RegI32:$d),
+ (ins RegI32:$a, RegI32:$b),
!strconcat(opcstr, ".b32\t$d, $a, $b"),
- [(set RRegu32:$d, (opnode RRegu32:$a, RRegu32:$b))]>;
- def ri32 : InstPTX<(outs RRegu32:$d),
- (ins RRegu32:$a, i32imm:$b),
+ [(set RegI32:$d, (opnode RegI32:$a, RegI32:$b))]>;
+ def ri32 : InstPTX<(outs RegI32:$d),
+ (ins RegI32:$a, i32imm:$b),
!strconcat(opcstr, ".b32\t$d, $a, $b"),
- [(set RRegu32:$d, (opnode RRegu32:$a, imm:$b))]>;
- def rr64 : InstPTX<(outs RRegu64:$d),
- (ins RRegu64:$a, RRegu64:$b),
+ [(set RegI32:$d, (opnode RegI32:$a, imm:$b))]>;
+ def rr64 : InstPTX<(outs RegI64:$d),
+ (ins RegI64:$a, RegI64:$b),
!strconcat(opcstr, ".b64\t$d, $a, $b"),
- [(set RRegu64:$d, (opnode RRegu64:$a, RRegu64:$b))]>;
- def ri64 : InstPTX<(outs RRegu64:$d),
- (ins RRegu64:$a, i64imm:$b),
+ [(set RegI64:$d, (opnode RegI64:$a, RegI64:$b))]>;
+ def ri64 : InstPTX<(outs RegI64:$d),
+ (ins RegI64:$a, i64imm:$b),
!strconcat(opcstr, ".b64\t$d, $a, $b"),
- [(set RRegu64:$d, (opnode RRegu64:$a, imm:$b))]>;
+ [(set RegI64:$d, (opnode RegI64:$a, imm:$b))]>;
}
multiclass INT3ntnc<string opcstr, SDNode opnode> {
- def rr16 : InstPTX<(outs RRegu16:$d),
- (ins RRegu16:$a, RRegu16:$b),
+ def rr16 : InstPTX<(outs RegI16:$d),
+ (ins RegI16:$a, RegI16:$b),
!strconcat(opcstr, "16\t$d, $a, $b"),
- [(set RRegu16:$d, (opnode RRegu16:$a, RRegu16:$b))]>;
- def rr32 : InstPTX<(outs RRegu32:$d),
- (ins RRegu32:$a, RRegu32:$b),
+ [(set RegI16:$d, (opnode RegI16:$a, RegI16:$b))]>;
+ def rr32 : InstPTX<(outs RegI32:$d),
+ (ins RegI32:$a, RegI32:$b),
!strconcat(opcstr, "32\t$d, $a, $b"),
- [(set RRegu32:$d, (opnode RRegu32:$a, RRegu32:$b))]>;
- def rr64 : InstPTX<(outs RRegu64:$d),
- (ins RRegu64:$a, RRegu64:$b),
+ [(set RegI32:$d, (opnode RegI32:$a, RegI32:$b))]>;
+ def rr64 : InstPTX<(outs RegI64:$d),
+ (ins RegI64:$a, RegI64:$b),
!strconcat(opcstr, "64\t$d, $a, $b"),
- [(set RRegu64:$d, (opnode RRegu64:$a, RRegu64:$b))]>;
- def ri16 : InstPTX<(outs RRegu16:$d),
- (ins RRegu16:$a, i16imm:$b),
+ [(set RegI64:$d, (opnode RegI64:$a, RegI64:$b))]>;
+ def ri16 : InstPTX<(outs RegI16:$d),
+ (ins RegI16:$a, i16imm:$b),
!strconcat(opcstr, "16\t$d, $a, $b"),
- [(set RRegu16:$d, (opnode RRegu16:$a, imm:$b))]>;
- def ri32 : InstPTX<(outs RRegu32:$d),
- (ins RRegu32:$a, i32imm:$b),
+ [(set RegI16:$d, (opnode RegI16:$a, imm:$b))]>;
+ def ri32 : InstPTX<(outs RegI32:$d),
+ (ins RegI32:$a, i32imm:$b),
!strconcat(opcstr, "32\t$d, $a, $b"),
- [(set RRegu32:$d, (opnode RRegu32:$a, imm:$b))]>;
- def ri64 : InstPTX<(outs RRegu64:$d),
- (ins RRegu64:$a, i64imm:$b),
+ [(set RegI32:$d, (opnode RegI32:$a, imm:$b))]>;
+ def ri64 : InstPTX<(outs RegI64:$d),
+ (ins RegI64:$a, i64imm:$b),
!strconcat(opcstr, "64\t$d, $a, $b"),
- [(set RRegu64:$d, (opnode RRegu64:$a, imm:$b))]>;
- def ir16 : InstPTX<(outs RRegu16:$d),
- (ins i16imm:$a, RRegu16:$b),
+ [(set RegI64:$d, (opnode RegI64:$a, imm:$b))]>;
+ def ir16 : InstPTX<(outs RegI16:$d),
+ (ins i16imm:$a, RegI16:$b),
!strconcat(opcstr, "16\t$d, $a, $b"),
- [(set RRegu16:$d, (opnode imm:$a, RRegu16:$b))]>;
- def ir32 : InstPTX<(outs RRegu32:$d),
- (ins i32imm:$a, RRegu32:$b),
+ [(set RegI16:$d, (opnode imm:$a, RegI16:$b))]>;
+ def ir32 : InstPTX<(outs RegI32:$d),
+ (ins i32imm:$a, RegI32:$b),
!strconcat(opcstr, "32\t$d, $a, $b"),
- [(set RRegu32:$d, (opnode imm:$a, RRegu32:$b))]>;
- def ir64 : InstPTX<(outs RRegu64:$d),
- (ins i64imm:$a, RRegu64:$b),
+ [(set RegI32:$d, (opnode imm:$a, RegI32:$b))]>;
+ def ir64 : InstPTX<(outs RegI64:$d),
+ (ins i64imm:$a, RegI64:$b),
!strconcat(opcstr, "64\t$d, $a, $b"),
- [(set RRegu64:$d, (opnode imm:$a, RRegu64:$b))]>;
+ [(set RegI64:$d, (opnode imm:$a, RegI64:$b))]>;
}
multiclass PTX_SETP_I<RegisterClass RC, string regclsname, Operand immcls,
@@ -362,63 +375,63 @@ multiclass PTX_SETP_I<RegisterClass RC, string regclsname, Operand immcls,
// TODO support 5-operand format: p|q, a, b, c
def rr
- : InstPTX<(outs Preds:$p), (ins RC:$a, RC:$b),
+ : InstPTX<(outs RegPred:$p), (ins RC:$a, RC:$b),
!strconcat("setp.", cmpstr, ".", regclsname, "\t$p, $a, $b"),
- [(set Preds:$p, (setcc RC:$a, RC:$b, cmp))]>;
+ [(set RegPred:$p, (setcc RC:$a, RC:$b, cmp))]>;
def ri
- : InstPTX<(outs Preds:$p), (ins RC:$a, immcls:$b),
+ : InstPTX<(outs RegPred:$p), (ins RC:$a, immcls:$b),
!strconcat("setp.", cmpstr, ".", regclsname, "\t$p, $a, $b"),
- [(set Preds:$p, (setcc RC:$a, imm:$b, cmp))]>;
+ [(set RegPred:$p, (setcc RC:$a, imm:$b, cmp))]>;
def rr_and_r
- : InstPTX<(outs Preds:$p), (ins RC:$a, RC:$b, Preds:$c),
+ : InstPTX<(outs RegPred:$p), (ins RC:$a, RC:$b, RegPred:$c),
!strconcat("setp.", cmpstr, ".and.", regclsname, "\t$p, $a, $b, $c"),
- [(set Preds:$p, (and (setcc RC:$a, RC:$b, cmp), Preds:$c))]>;
+ [(set RegPred:$p, (and (setcc RC:$a, RC:$b, cmp), RegPred:$c))]>;
def ri_and_r
- : InstPTX<(outs Preds:$p), (ins RC:$a, immcls:$b, Preds:$c),
+ : InstPTX<(outs RegPred:$p), (ins RC:$a, immcls:$b, RegPred:$c),
!strconcat("setp.", cmpstr, ".and.", regclsname, "\t$p, $a, $b, $c"),
- [(set Preds:$p, (and (setcc RC:$a, imm:$b, cmp), Preds:$c))]>;
+ [(set RegPred:$p, (and (setcc RC:$a, imm:$b, cmp), RegPred:$c))]>;
def rr_or_r
- : InstPTX<(outs Preds:$p), (ins RC:$a, RC:$b, Preds:$c),
+ : InstPTX<(outs RegPred:$p), (ins RC:$a, RC:$b, RegPred:$c),
!strconcat("setp.", cmpstr, ".or.", regclsname, "\t$p, $a, $b, $c"),
- [(set Preds:$p, (or (setcc RC:$a, RC:$b, cmp), Preds:$c))]>;
+ [(set RegPred:$p, (or (setcc RC:$a, RC:$b, cmp), RegPred:$c))]>;
def ri_or_r
- : InstPTX<(outs Preds:$p), (ins RC:$a, immcls:$b, Preds:$c),
+ : InstPTX<(outs RegPred:$p), (ins RC:$a, immcls:$b, RegPred:$c),
!strconcat("setp.", cmpstr, ".or.", regclsname, "\t$p, $a, $b, $c"),
- [(set Preds:$p, (or (setcc RC:$a, imm:$b, cmp), Preds:$c))]>;
+ [(set RegPred:$p, (or (setcc RC:$a, imm:$b, cmp), RegPred:$c))]>;
def rr_xor_r
- : InstPTX<(outs Preds:$p), (ins RC:$a, RC:$b, Preds:$c),
+ : InstPTX<(outs RegPred:$p), (ins RC:$a, RC:$b, RegPred:$c),
!strconcat("setp.", cmpstr, ".xor.", regclsname, "\t$p, $a, $b, $c"),
- [(set Preds:$p, (xor (setcc RC:$a, RC:$b, cmp), Preds:$c))]>;
+ [(set RegPred:$p, (xor (setcc RC:$a, RC:$b, cmp), RegPred:$c))]>;
def ri_xor_r
- : InstPTX<(outs Preds:$p), (ins RC:$a, immcls:$b, Preds:$c),
+ : InstPTX<(outs RegPred:$p), (ins RC:$a, immcls:$b, RegPred:$c),
!strconcat("setp.", cmpstr, ".xor.", regclsname, "\t$p, $a, $b, $c"),
- [(set Preds:$p, (xor (setcc RC:$a, imm:$b, cmp), Preds:$c))]>;
+ [(set RegPred:$p, (xor (setcc RC:$a, imm:$b, cmp), RegPred:$c))]>;
def rr_and_not_r
- : InstPTX<(outs Preds:$p), (ins RC:$a, RC:$b, Preds:$c),
+ : InstPTX<(outs RegPred:$p), (ins RC:$a, RC:$b, RegPred:$c),
!strconcat("setp.", cmpstr, ".and.", regclsname, "\t$p, $a, $b, !$c"),
- [(set Preds:$p, (and (setcc RC:$a, RC:$b, cmp), (not Preds:$c)))]>;
+ [(set RegPred:$p, (and (setcc RC:$a, RC:$b, cmp), (not RegPred:$c)))]>;
def ri_and_not_r
- : InstPTX<(outs Preds:$p), (ins RC:$a, immcls:$b, Preds:$c),
+ : InstPTX<(outs RegPred:$p), (ins RC:$a, immcls:$b, RegPred:$c),
!strconcat("setp.", cmpstr, ".and.", regclsname, "\t$p, $a, $b, !$c"),
- [(set Preds:$p, (and (setcc RC:$a, imm:$b, cmp), (not Preds:$c)))]>;
+ [(set RegPred:$p, (and (setcc RC:$a, imm:$b, cmp), (not RegPred:$c)))]>;
def rr_or_not_r
- : InstPTX<(outs Preds:$p), (ins RC:$a, RC:$b, Preds:$c),
+ : InstPTX<(outs RegPred:$p), (ins RC:$a, RC:$b, RegPred:$c),
!strconcat("setp.", cmpstr, ".or.", regclsname, "\t$p, $a, $b, !$c"),
- [(set Preds:$p, (or (setcc RC:$a, RC:$b, cmp), (not Preds:$c)))]>;
+ [(set RegPred:$p, (or (setcc RC:$a, RC:$b, cmp), (not RegPred:$c)))]>;
def ri_or_not_r
- : InstPTX<(outs Preds:$p), (ins RC:$a, immcls:$b, Preds:$c),
+ : InstPTX<(outs RegPred:$p), (ins RC:$a, immcls:$b, RegPred:$c),
!strconcat("setp.", cmpstr, ".or.", regclsname, "\t$p, $a, $b, !$c"),
- [(set Preds:$p, (or (setcc RC:$a, imm:$b, cmp), (not Preds:$c)))]>;
+ [(set RegPred:$p, (or (setcc RC:$a, imm:$b, cmp), (not RegPred:$c)))]>;
def rr_xor_not_r
- : InstPTX<(outs Preds:$p), (ins RC:$a, RC:$b, Preds:$c),
+ : InstPTX<(outs RegPred:$p), (ins RC:$a, RC:$b, RegPred:$c),
!strconcat("setp.", cmpstr, ".xor.", regclsname, "\t$p, $a, $b, !$c"),
- [(set Preds:$p, (xor (setcc RC:$a, RC:$b, cmp), (not Preds:$c)))]>;
+ [(set RegPred:$p, (xor (setcc RC:$a, RC:$b, cmp), (not RegPred:$c)))]>;
def ri_xor_not_r
- : InstPTX<(outs Preds:$p), (ins RC:$a, immcls:$b, Preds:$c),
+ : InstPTX<(outs RegPred:$p), (ins RC:$a, immcls:$b, RegPred:$c),
!strconcat("setp.", cmpstr, ".xor.", regclsname, "\t$p, $a, $b, !$c"),
- [(set Preds:$p, (xor (setcc RC:$a, imm:$b, cmp), (not Preds:$c)))]>;
+ [(set RegPred:$p, (xor (setcc RC:$a, imm:$b, cmp), (not RegPred:$c)))]>;
}
multiclass PTX_SETP_FP<RegisterClass RC, string regclsname,
@@ -426,74 +439,74 @@ multiclass PTX_SETP_FP<RegisterClass RC, string regclsname,
// TODO support 5-operand format: p|q, a, b, c
def rr_u
- : InstPTX<(outs Preds:$p), (ins RC:$a, RC:$b),
+ : InstPTX<(outs RegPred:$p), (ins RC:$a, RC:$b),
!strconcat("setp.", cmpstr, "u.", regclsname, "\t$p, $a, $b"),
- [(set Preds:$p, (setcc RC:$a, RC:$b, ucmp))]>;
+ [(set RegPred:$p, (setcc RC:$a, RC:$b, ucmp))]>;
def rr_o
- : InstPTX<(outs Preds:$p), (ins RC:$a, RC:$b),
+ : InstPTX<(outs RegPred:$p), (ins RC:$a, RC:$b),
!strconcat("setp.", cmpstr, ".", regclsname, "\t$p, $a, $b"),
- [(set Preds:$p, (setcc RC:$a, RC:$b, ocmp))]>;
+ [(set RegPred:$p, (setcc RC:$a, RC:$b, ocmp))]>;
def rr_and_r_u
- : InstPTX<(outs Preds:$p), (ins RC:$a, RC:$b, Preds:$c),
+ : InstPTX<(outs RegPred:$p), (ins RC:$a, RC:$b, RegPred:$c),
!strconcat("setp.", cmpstr, "u.and.", regclsname, "\t$p, $a, $b, $c"),
- [(set Preds:$p, (and (setcc RC:$a, RC:$b, ucmp), Preds:$c))]>;
+ [(set RegPred:$p, (and (setcc RC:$a, RC:$b, ucmp), RegPred:$c))]>;
def rr_and_r_o
- : InstPTX<(outs Preds:$p), (ins RC:$a, RC:$b, Preds:$c),
+ : InstPTX<(outs RegPred:$p), (ins RC:$a, RC:$b, RegPred:$c),
!strconcat("setp.", cmpstr, ".and.", regclsname, "\t$p, $a, $b, $c"),
- [(set Preds:$p, (and (setcc RC:$a, RC:$b, ocmp), Preds:$c))]>;
+ [(set RegPred:$p, (and (setcc RC:$a, RC:$b, ocmp), RegPred:$c))]>;
def rr_or_r_u
- : InstPTX<(outs Preds:$p), (ins RC:$a, RC:$b, Preds:$c),
+ : InstPTX<(outs RegPred:$p), (ins RC:$a, RC:$b, RegPred:$c),
!strconcat("setp.", cmpstr, "u.or.", regclsname, "\t$p, $a, $b, $c"),
- [(set Preds:$p, (or (setcc RC:$a, RC:$b, ucmp), Preds:$c))]>;
+ [(set RegPred:$p, (or (setcc RC:$a, RC:$b, ucmp), RegPred:$c))]>;
def rr_or_r_o
- : InstPTX<(outs Preds:$p), (ins RC:$a, RC:$b, Preds:$c),
+ : InstPTX<(outs RegPred:$p), (ins RC:$a, RC:$b, RegPred:$c),
!strconcat("setp.", cmpstr, ".or.", regclsname, "\t$p, $a, $b, $c"),
- [(set Preds:$p, (or (setcc RC:$a, RC:$b, ocmp), Preds:$c))]>;
+ [(set RegPred:$p, (or (setcc RC:$a, RC:$b, ocmp), RegPred:$c))]>;
def rr_xor_r_u
- : InstPTX<(outs Preds:$p), (ins RC:$a, RC:$b, Preds:$c),
+ : InstPTX<(outs RegPred:$p), (ins RC:$a, RC:$b, RegPred:$c),
!strconcat("setp.", cmpstr, "u.xor.", regclsname, "\t$p, $a, $b, $c"),
- [(set Preds:$p, (xor (setcc RC:$a, RC:$b, ucmp), Preds:$c))]>;
+ [(set RegPred:$p, (xor (setcc RC:$a, RC:$b, ucmp), RegPred:$c))]>;
def rr_xor_r_o
- : InstPTX<(outs Preds:$p), (ins RC:$a, RC:$b, Preds:$c),
+ : InstPTX<(outs RegPred:$p), (ins RC:$a, RC:$b, RegPred:$c),
!strconcat("setp.", cmpstr, ".xor.", regclsname, "\t$p, $a, $b, $c"),
- [(set Preds:$p, (xor (setcc RC:$a, RC:$b, ocmp), Preds:$c))]>;
+ [(set RegPred:$p, (xor (setcc RC:$a, RC:$b, ocmp), RegPred:$c))]>;
def rr_and_not_r_u
- : InstPTX<(outs Preds:$p), (ins RC:$a, RC:$b, Preds:$c),
+ : InstPTX<(outs RegPred:$p), (ins RC:$a, RC:$b, RegPred:$c),
!strconcat("setp.", cmpstr, "u.and.", regclsname, "\t$p, $a, $b, !$c"),
- [(set Preds:$p, (and (setcc RC:$a, RC:$b, ucmp), (not Preds:$c)))]>;
+ [(set RegPred:$p, (and (setcc RC:$a, RC:$b, ucmp), (not RegPred:$c)))]>;
def rr_and_not_r_o
- : InstPTX<(outs Preds:$p), (ins RC:$a, RC:$b, Preds:$c),
+ : InstPTX<(outs RegPred:$p), (ins RC:$a, RC:$b, RegPred:$c),
!strconcat("setp.", cmpstr, ".and.", regclsname, "\t$p, $a, $b, !$c"),
- [(set Preds:$p, (and (setcc RC:$a, RC:$b, ocmp), (not Preds:$c)))]>;
+ [(set RegPred:$p, (and (setcc RC:$a, RC:$b, ocmp), (not RegPred:$c)))]>;
def rr_or_not_r_u
- : InstPTX<(outs Preds:$p), (ins RC:$a, RC:$b, Preds:$c),
+ : InstPTX<(outs RegPred:$p), (ins RC:$a, RC:$b, RegPred:$c),
!strconcat("setp.", cmpstr, "u.or.", regclsname, "\t$p, $a, $b, !$c"),
- [(set Preds:$p, (or (setcc RC:$a, RC:$b, ucmp), (not Preds:$c)))]>;
+ [(set RegPred:$p, (or (setcc RC:$a, RC:$b, ucmp), (not RegPred:$c)))]>;
def rr_or_not_r_o
- : InstPTX<(outs Preds:$p), (ins RC:$a, RC:$b, Preds:$c),
+ : InstPTX<(outs RegPred:$p), (ins RC:$a, RC:$b, RegPred:$c),
!strconcat("setp.", cmpstr, ".or.", regclsname, "\t$p, $a, $b, !$c"),
- [(set Preds:$p, (or (setcc RC:$a, RC:$b, ocmp), (not Preds:$c)))]>;
+ [(set RegPred:$p, (or (setcc RC:$a, RC:$b, ocmp), (not RegPred:$c)))]>;
def rr_xor_not_r_u
- : InstPTX<(outs Preds:$p), (ins RC:$a, RC:$b, Preds:$c),
+ : InstPTX<(outs RegPred:$p), (ins RC:$a, RC:$b, RegPred:$c),
!strconcat("setp.", cmpstr, "u.xor.", regclsname, "\t$p, $a, $b, !$c"),
- [(set Preds:$p, (xor (setcc RC:$a, RC:$b, ucmp), (not Preds:$c)))]>;
+ [(set RegPred:$p, (xor (setcc RC:$a, RC:$b, ucmp), (not RegPred:$c)))]>;
def rr_xor_not_r_o
- : InstPTX<(outs Preds:$p), (ins RC:$a, RC:$b, Preds:$c),
+ : InstPTX<(outs RegPred:$p), (ins RC:$a, RC:$b, RegPred:$c),
!strconcat("setp.", cmpstr, ".xor.", regclsname, "\t$p, $a, $b, !$c"),
- [(set Preds:$p, (xor (setcc RC:$a, RC:$b, ocmp), (not Preds:$c)))]>;
+ [(set RegPred:$p, (xor (setcc RC:$a, RC:$b, ocmp), (not RegPred:$c)))]>;
}
multiclass PTX_SELP<RegisterClass RC, string regclsname> {
def rr
- : InstPTX<(outs RC:$r), (ins Preds:$a, RC:$b, RC:$c),
+ : InstPTX<(outs RC:$r), (ins RegPred:$a, RC:$b, RC:$c),
!strconcat("selp.", regclsname, "\t$r, $b, $c, $a"),
- [(set RC:$r, (select Preds:$a, RC:$b, RC:$c))]>;
+ [(set RC:$r, (select RegPred:$a, RC:$b, RC:$c))]>;
}
multiclass PTX_LD<string opstr, string typestr, RegisterClass RC, PatFrag pat_load> {
@@ -524,11 +537,11 @@ multiclass PTX_LD<string opstr, string typestr, RegisterClass RC, PatFrag pat_lo
}
multiclass PTX_LD_ALL<string opstr, PatFrag pat_load> {
- defm u16 : PTX_LD<opstr, ".u16", RRegu16, pat_load>;
- defm u32 : PTX_LD<opstr, ".u32", RRegu32, pat_load>;
- defm u64 : PTX_LD<opstr, ".u64", RRegu64, pat_load>;
- defm f32 : PTX_LD<opstr, ".f32", RRegf32, pat_load>;
- defm f64 : PTX_LD<opstr, ".f64", RRegf64, pat_load>;
+ defm u16 : PTX_LD<opstr, ".u16", RegI16, pat_load>;
+ defm u32 : PTX_LD<opstr, ".u32", RegI32, pat_load>;
+ defm u64 : PTX_LD<opstr, ".u64", RegI64, pat_load>;
+ defm f32 : PTX_LD<opstr, ".f32", RegF32, pat_load>;
+ defm f64 : PTX_LD<opstr, ".f64", RegF64, pat_load>;
}
multiclass PTX_ST<string opstr, string typestr, RegisterClass RC, PatFrag pat_store> {
@@ -559,11 +572,11 @@ multiclass PTX_ST<string opstr, string typestr, RegisterClass RC, PatFrag pat_st
}
multiclass PTX_ST_ALL<string opstr, PatFrag pat_store> {
- defm u16 : PTX_ST<opstr, ".u16", RRegu16, pat_store>;
- defm u32 : PTX_ST<opstr, ".u32", RRegu32, pat_store>;
- defm u64 : PTX_ST<opstr, ".u64", RRegu64, pat_store>;
- defm f32 : PTX_ST<opstr, ".f32", RRegf32, pat_store>;
- defm f64 : PTX_ST<opstr, ".f64", RRegf64, pat_store>;
+ defm u16 : PTX_ST<opstr, ".u16", RegI16, pat_store>;
+ defm u32 : PTX_ST<opstr, ".u32", RegI32, pat_store>;
+ defm u64 : PTX_ST<opstr, ".u64", RegI64, pat_store>;
+ defm f32 : PTX_ST<opstr, ".f32", RegF32, pat_store>;
+ defm f64 : PTX_ST<opstr, ".f64", RegF64, pat_store>;
}
//===----------------------------------------------------------------------===//
@@ -584,44 +597,59 @@ defm REM : INT3<"rem", urem>;
defm FNEG : PTX_FLOAT_2OP<"neg", fneg>;
// Standard Binary Operations
-defm FADD : PTX_FLOAT_3OP<"add", fadd>;
-defm FSUB : PTX_FLOAT_3OP<"sub", fsub>;
-defm FMUL : PTX_FLOAT_3OP<"mul", fmul>;
-
-// TODO: Allow user selection of rounding modes for fdiv.
-// For division, we need to have f32 and f64 differently.
-// For f32, we just always use .approx since it is supported on all hardware
-// for PTX 1.4+, which is our minimum target.
-def FDIVrr32 : InstPTX<(outs RRegf32:$d),
- (ins RRegf32:$a, RRegf32:$b),
- "div.approx.f32\t$d, $a, $b",
- [(set RRegf32:$d, (fdiv RRegf32:$a, RRegf32:$b))]>;
-def FDIVri32 : InstPTX<(outs RRegf32:$d),
- (ins RRegf32:$a, f32imm:$b),
- "div.approx.f32\t$d, $a, $b",
- [(set RRegf32:$d, (fdiv RRegf32:$a, fpimm:$b))]>;
-
-// For f64, we must specify a rounding for sm 1.3+ but *not* for sm 1.0.
-def FDIVrr64SM13 : InstPTX<(outs RRegf64:$d),
- (ins RRegf64:$a, RRegf64:$b),
+defm FADD : PTX_FLOAT_3OP<"add.rn", fadd>;
+defm FSUB : PTX_FLOAT_3OP<"sub.rn", fsub>;
+defm FMUL : PTX_FLOAT_3OP<"mul.rn", fmul>;
+
+// For floating-point division:
+// SM_13+ defaults to .rn for f32 and f64,
+// SM10 must *not* provide a rounding
+
+// TODO:
+// - Allow user selection of rounding modes for fdiv
+// - Add support for -prec-div=false (.approx)
+
+def FDIVrr32SM13 : InstPTX<(outs RegF32:$d),
+ (ins RegF32:$a, RegF32:$b),
+ "div.rn.f32\t$d, $a, $b",
+ [(set RegF32:$d, (fdiv RegF32:$a, RegF32:$b))]>,
+ Requires<[FDivNeedsRoundingMode]>;
+def FDIVri32SM13 : InstPTX<(outs RegF32:$d),
+ (ins RegF32:$a, f32imm:$b),
+ "div.rn.f32\t$d, $a, $b",
+ [(set RegF32:$d, (fdiv RegF32:$a, fpimm:$b))]>,
+ Requires<[FDivNeedsRoundingMode]>;
+def FDIVrr32SM10 : InstPTX<(outs RegF32:$d),
+ (ins RegF32:$a, RegF32:$b),
+ "div.f32\t$d, $a, $b",
+ [(set RegF32:$d, (fdiv RegF32:$a, RegF32:$b))]>,
+ Requires<[FDivNoRoundingMode]>;
+def FDIVri32SM10 : InstPTX<(outs RegF32:$d),
+ (ins RegF32:$a, f32imm:$b),
+ "div.f32\t$d, $a, $b",
+ [(set RegF32:$d, (fdiv RegF32:$a, fpimm:$b))]>,
+ Requires<[FDivNoRoundingMode]>;
+
+def FDIVrr64SM13 : InstPTX<(outs RegF64:$d),
+ (ins RegF64:$a, RegF64:$b),
"div.rn.f64\t$d, $a, $b",
- [(set RRegf64:$d, (fdiv RRegf64:$a, RRegf64:$b))]>,
- Requires<[SupportsSM13]>;
-def FDIVri64SM13 : InstPTX<(outs RRegf64:$d),
- (ins RRegf64:$a, f64imm:$b),
+ [(set RegF64:$d, (fdiv RegF64:$a, RegF64:$b))]>,
+ Requires<[FDivNeedsRoundingMode]>;
+def FDIVri64SM13 : InstPTX<(outs RegF64:$d),
+ (ins RegF64:$a, f64imm:$b),
"div.rn.f64\t$d, $a, $b",
- [(set RRegf64:$d, (fdiv RRegf64:$a, fpimm:$b))]>,
- Requires<[SupportsSM13]>;
-def FDIVrr64SM10 : InstPTX<(outs RRegf64:$d),
- (ins RRegf64:$a, RRegf64:$b),
+ [(set RegF64:$d, (fdiv RegF64:$a, fpimm:$b))]>,
+ Requires<[FDivNeedsRoundingMode]>;
+def FDIVrr64SM10 : InstPTX<(outs RegF64:$d),
+ (ins RegF64:$a, RegF64:$b),
"div.f64\t$d, $a, $b",
- [(set RRegf64:$d, (fdiv RRegf64:$a, RRegf64:$b))]>,
- Requires<[DoesNotSupportSM13]>;
-def FDIVri64SM10 : InstPTX<(outs RRegf64:$d),
- (ins RRegf64:$a, f64imm:$b),
+ [(set RegF64:$d, (fdiv RegF64:$a, RegF64:$b))]>,
+ Requires<[FDivNoRoundingMode]>;
+def FDIVri64SM10 : InstPTX<(outs RegF64:$d),
+ (ins RegF64:$a, f64imm:$b),
"div.f64\t$d, $a, $b",
- [(set RRegf64:$d, (fdiv RRegf64:$a, fpimm:$b))]>,
- Requires<[DoesNotSupportSM13]>;
+ [(set RegF64:$d, (fdiv RegF64:$a, fpimm:$b))]>,
+ Requires<[FDivNoRoundingMode]>;
@@ -633,40 +661,42 @@ def FDIVri64SM10 : InstPTX<(outs RRegf64:$d),
// In the short term, mad is supported on all PTX versions and we use a
// default rounding mode no matter what shader model or PTX version.
// TODO: Allow the rounding mode to be selectable through llc.
-defm FMADSM13 : PTX_FLOAT_4OP<"mad.rn", fmul, fadd>, Requires<[SupportsSM13, SupportsFMA]>;
-defm FMAD : PTX_FLOAT_4OP<"mad", fmul, fadd>, Requires<[DoesNotSupportSM13, SupportsFMA]>;
+defm FMADSM13 : PTX_FLOAT_4OP<"mad.rn", fmul, fadd>,
+ Requires<[FMadNeedsRoundingMode, SupportsFMA]>;
+defm FMAD : PTX_FLOAT_4OP<"mad", fmul, fadd>,
+ Requires<[FMadNoRoundingMode, SupportsFMA]>;
///===- Floating-Point Intrinsic Instructions -----------------------------===//
-def FSQRT32 : InstPTX<(outs RRegf32:$d),
- (ins RRegf32:$a),
+def FSQRT32 : InstPTX<(outs RegF32:$d),
+ (ins RegF32:$a),
"sqrt.rn.f32\t$d, $a",
- [(set RRegf32:$d, (fsqrt RRegf32:$a))]>;
+ [(set RegF32:$d, (fsqrt RegF32:$a))]>;
-def FSQRT64 : InstPTX<(outs RRegf64:$d),
- (ins RRegf64:$a),
+def FSQRT64 : InstPTX<(outs RegF64:$d),
+ (ins RegF64:$a),
"sqrt.rn.f64\t$d, $a",
- [(set RRegf64:$d, (fsqrt RRegf64:$a))]>;
+ [(set RegF64:$d, (fsqrt RegF64:$a))]>;
-def FSIN32 : InstPTX<(outs RRegf32:$d),
- (ins RRegf32:$a),
+def FSIN32 : InstPTX<(outs RegF32:$d),
+ (ins RegF32:$a),
"sin.approx.f32\t$d, $a",
- [(set RRegf32:$d, (fsin RRegf32:$a))]>;
+ [(set RegF32:$d, (fsin RegF32:$a))]>;
-def FSIN64 : InstPTX<(outs RRegf64:$d),
- (ins RRegf64:$a),
+def FSIN64 : InstPTX<(outs RegF64:$d),
+ (ins RegF64:$a),
"sin.approx.f64\t$d, $a",
- [(set RRegf64:$d, (fsin RRegf64:$a))]>;
+ [(set RegF64:$d, (fsin RegF64:$a))]>;
-def FCOS32 : InstPTX<(outs RRegf32:$d),
- (ins RRegf32:$a),
+def FCOS32 : InstPTX<(outs RegF32:$d),
+ (ins RegF32:$a),
"cos.approx.f32\t$d, $a",
- [(set RRegf32:$d, (fcos RRegf32:$a))]>;
+ [(set RegF32:$d, (fcos RegF32:$a))]>;
-def FCOS64 : InstPTX<(outs RRegf64:$d),
- (ins RRegf64:$a),
+def FCOS64 : InstPTX<(outs RegF64:$d),
+ (ins RegF64:$a),
"cos.approx.f64\t$d, $a",
- [(set RRegf64:$d, (fcos RRegf64:$a))]>;
+ [(set RegF64:$d, (fcos RegF64:$a))]>;
///===- Comparison and Selection Instructions -----------------------------===//
@@ -675,56 +705,68 @@ def FCOS64 : InstPTX<(outs RRegf64:$d),
// Compare u16
-defm SETPEQu16 : PTX_SETP_I<RRegu16, "u16", i16imm, SETEQ, "eq">;
-defm SETPNEu16 : PTX_SETP_I<RRegu16, "u16", i16imm, SETNE, "ne">;
-defm SETPLTu16 : PTX_SETP_I<RRegu16, "u16", i16imm, SETULT, "lt">;
-defm SETPLEu16 : PTX_SETP_I<RRegu16, "u16", i16imm, SETULE, "le">;
-defm SETPGTu16 : PTX_SETP_I<RRegu16, "u16", i16imm, SETUGT, "gt">;
-defm SETPGEu16 : PTX_SETP_I<RRegu16, "u16", i16imm, SETUGE, "ge">;
+defm SETPEQu16 : PTX_SETP_I<RegI16, "u16", i16imm, SETEQ, "eq">;
+defm SETPNEu16 : PTX_SETP_I<RegI16, "u16", i16imm, SETNE, "ne">;
+defm SETPLTu16 : PTX_SETP_I<RegI16, "u16", i16imm, SETULT, "lt">;
+defm SETPLEu16 : PTX_SETP_I<RegI16, "u16", i16imm, SETULE, "le">;
+defm SETPGTu16 : PTX_SETP_I<RegI16, "u16", i16imm, SETUGT, "gt">;
+defm SETPGEu16 : PTX_SETP_I<RegI16, "u16", i16imm, SETUGE, "ge">;
+defm SETPLTs16 : PTX_SETP_I<RegI16, "s16", i16imm, SETLT, "lt">;
+defm SETPLEs16 : PTX_SETP_I<RegI16, "s16", i16imm, SETLE, "le">;
+defm SETPGTs16 : PTX_SETP_I<RegI16, "s16", i16imm, SETGT, "gt">;
+defm SETPGEs16 : PTX_SETP_I<RegI16, "s16", i16imm, SETGE, "ge">;
// Compare u32
-defm SETPEQu32 : PTX_SETP_I<RRegu32, "u32", i32imm, SETEQ, "eq">;
-defm SETPNEu32 : PTX_SETP_I<RRegu32, "u32", i32imm, SETNE, "ne">;
-defm SETPLTu32 : PTX_SETP_I<RRegu32, "u32", i32imm, SETULT, "lt">;
-defm SETPLEu32 : PTX_SETP_I<RRegu32, "u32", i32imm, SETULE, "le">;
-defm SETPGTu32 : PTX_SETP_I<RRegu32, "u32", i32imm, SETUGT, "gt">;
-defm SETPGEu32 : PTX_SETP_I<RRegu32, "u32", i32imm, SETUGE, "ge">;
+defm SETPEQu32 : PTX_SETP_I<RegI32, "u32", i32imm, SETEQ, "eq">;
+defm SETPNEu32 : PTX_SETP_I<RegI32, "u32", i32imm, SETNE, "ne">;
+defm SETPLTu32 : PTX_SETP_I<RegI32, "u32", i32imm, SETULT, "lt">;
+defm SETPLEu32 : PTX_SETP_I<RegI32, "u32", i32imm, SETULE, "le">;
+defm SETPGTu32 : PTX_SETP_I<RegI32, "u32", i32imm, SETUGT, "gt">;
+defm SETPGEu32 : PTX_SETP_I<RegI32, "u32", i32imm, SETUGE, "ge">;
+defm SETPLTs32 : PTX_SETP_I<RegI32, "s32", i32imm, SETLT, "lt">;
+defm SETPLEs32 : PTX_SETP_I<RegI32, "s32", i32imm, SETLE, "le">;
+defm SETPGTs32 : PTX_SETP_I<RegI32, "s32", i32imm, SETGT, "gt">;
+defm SETPGEs32 : PTX_SETP_I<RegI32, "s32", i32imm, SETGE, "ge">;
// Compare u64
-defm SETPEQu64 : PTX_SETP_I<RRegu64, "u64", i64imm, SETEQ, "eq">;
-defm SETPNEu64 : PTX_SETP_I<RRegu64, "u64", i64imm, SETNE, "ne">;
-defm SETPLTu64 : PTX_SETP_I<RRegu64, "u64", i64imm, SETULT, "lt">;
-defm SETPLEu64 : PTX_SETP_I<RRegu64, "u64", i64imm, SETULE, "le">;
-defm SETPGTu64 : PTX_SETP_I<RRegu64, "u64", i64imm, SETUGT, "gt">;
-defm SETPGEu64 : PTX_SETP_I<RRegu64, "u64", i64imm, SETUGE, "ge">;
+defm SETPEQu64 : PTX_SETP_I<RegI64, "u64", i64imm, SETEQ, "eq">;
+defm SETPNEu64 : PTX_SETP_I<RegI64, "u64", i64imm, SETNE, "ne">;
+defm SETPLTu64 : PTX_SETP_I<RegI64, "u64", i64imm, SETULT, "lt">;
+defm SETPLEu64 : PTX_SETP_I<RegI64, "u64", i64imm, SETULE, "le">;
+defm SETPGTu64 : PTX_SETP_I<RegI64, "u64", i64imm, SETUGT, "gt">;
+defm SETPGEu64 : PTX_SETP_I<RegI64, "u64", i64imm, SETUGE, "ge">;
+defm SETPLTs64 : PTX_SETP_I<RegI64, "s64", i64imm, SETLT, "lt">;
+defm SETPLEs64 : PTX_SETP_I<RegI64, "s64", i64imm, SETLE, "le">;
+defm SETPGTs64 : PTX_SETP_I<RegI64, "s64", i64imm, SETGT, "gt">;
+defm SETPGEs64 : PTX_SETP_I<RegI64, "s64", i64imm, SETGE, "ge">;
// Compare f32
-defm SETPEQf32 : PTX_SETP_FP<RRegf32, "f32", SETUEQ, SETOEQ, "eq">;
-defm SETPNEf32 : PTX_SETP_FP<RRegf32, "f32", SETUNE, SETONE, "ne">;
-defm SETPLTf32 : PTX_SETP_FP<RRegf32, "f32", SETULT, SETOLT, "lt">;
-defm SETPLEf32 : PTX_SETP_FP<RRegf32, "f32", SETULE, SETOLE, "le">;
-defm SETPGTf32 : PTX_SETP_FP<RRegf32, "f32", SETUGT, SETOGT, "gt">;
-defm SETPGEf32 : PTX_SETP_FP<RRegf32, "f32", SETUGE, SETOGE, "ge">;
+defm SETPEQf32 : PTX_SETP_FP<RegF32, "f32", SETUEQ, SETOEQ, "eq">;
+defm SETPNEf32 : PTX_SETP_FP<RegF32, "f32", SETUNE, SETONE, "ne">;
+defm SETPLTf32 : PTX_SETP_FP<RegF32, "f32", SETULT, SETOLT, "lt">;
+defm SETPLEf32 : PTX_SETP_FP<RegF32, "f32", SETULE, SETOLE, "le">;
+defm SETPGTf32 : PTX_SETP_FP<RegF32, "f32", SETUGT, SETOGT, "gt">;
+defm SETPGEf32 : PTX_SETP_FP<RegF32, "f32", SETUGE, SETOGE, "ge">;
// Compare f64
-defm SETPEQf64 : PTX_SETP_FP<RRegf64, "f64", SETUEQ, SETOEQ, "eq">;
-defm SETPNEf64 : PTX_SETP_FP<RRegf64, "f64", SETUNE, SETONE, "ne">;
-defm SETPLTf64 : PTX_SETP_FP<RRegf64, "f64", SETULT, SETOLT, "lt">;
-defm SETPLEf64 : PTX_SETP_FP<RRegf64, "f64", SETULE, SETOLE, "le">;
-defm SETPGTf64 : PTX_SETP_FP<RRegf64, "f64", SETUGT, SETOGT, "gt">;
-defm SETPGEf64 : PTX_SETP_FP<RRegf64, "f64", SETUGE, SETOGE, "ge">;
+defm SETPEQf64 : PTX_SETP_FP<RegF64, "f64", SETUEQ, SETOEQ, "eq">;
+defm SETPNEf64 : PTX_SETP_FP<RegF64, "f64", SETUNE, SETONE, "ne">;
+defm SETPLTf64 : PTX_SETP_FP<RegF64, "f64", SETULT, SETOLT, "lt">;
+defm SETPLEf64 : PTX_SETP_FP<RegF64, "f64", SETULE, SETOLE, "le">;
+defm SETPGTf64 : PTX_SETP_FP<RegF64, "f64", SETUGT, SETOGT, "gt">;
+defm SETPGEf64 : PTX_SETP_FP<RegF64, "f64", SETUGE, SETOGE, "ge">;
// .selp
-defm PTX_SELPu16 : PTX_SELP<RRegu16, "u16">;
-defm PTX_SELPu32 : PTX_SELP<RRegu32, "u32">;
-defm PTX_SELPu64 : PTX_SELP<RRegu64, "u64">;
-defm PTX_SELPf32 : PTX_SELP<RRegf32, "f32">;
-defm PTX_SELPf64 : PTX_SELP<RRegf64, "f64">;
+defm PTX_SELPu16 : PTX_SELP<RegI16, "u16">;
+defm PTX_SELPu32 : PTX_SELP<RegI32, "u32">;
+defm PTX_SELPu64 : PTX_SELP<RegI64, "u64">;
+defm PTX_SELPf32 : PTX_SELP<RegF32, "f32">;
+defm PTX_SELPf64 : PTX_SELP<RegF64, "f64">;
///===- Logic and Shift Instructions --------------------------------------===//
@@ -740,47 +782,47 @@ defm XOR : PTX_LOGIC<"xor", xor>;
let neverHasSideEffects = 1 in {
def MOVPREDrr
- : InstPTX<(outs Preds:$d), (ins Preds:$a), "mov.pred\t$d, $a", []>;
+ : InstPTX<(outs RegPred:$d), (ins RegPred:$a), "mov.pred\t$d, $a", []>;
def MOVU16rr
- : InstPTX<(outs RRegu16:$d), (ins RRegu16:$a), "mov.u16\t$d, $a", []>;
+ : InstPTX<(outs RegI16:$d), (ins RegI16:$a), "mov.u16\t$d, $a", []>;
def MOVU32rr
- : InstPTX<(outs RRegu32:$d), (ins RRegu32:$a), "mov.u32\t$d, $a", []>;
+ : InstPTX<(outs RegI32:$d), (ins RegI32:$a), "mov.u32\t$d, $a", []>;
def MOVU64rr
- : InstPTX<(outs RRegu64:$d), (ins RRegu64:$a), "mov.u64\t$d, $a", []>;
+ : InstPTX<(outs RegI64:$d), (ins RegI64:$a), "mov.u64\t$d, $a", []>;
def MOVF32rr
- : InstPTX<(outs RRegf32:$d), (ins RRegf32:$a), "mov.f32\t$d, $a", []>;
+ : InstPTX<(outs RegF32:$d), (ins RegF32:$a), "mov.f32\t$d, $a", []>;
def MOVF64rr
- : InstPTX<(outs RRegf64:$d), (ins RRegf64:$a), "mov.f64\t$d, $a", []>;
+ : InstPTX<(outs RegF64:$d), (ins RegF64:$a), "mov.f64\t$d, $a", []>;
}
let isReMaterializable = 1, isAsCheapAsAMove = 1 in {
def MOVPREDri
- : InstPTX<(outs Preds:$d), (ins i1imm:$a), "mov.pred\t$d, $a",
- [(set Preds:$d, imm:$a)]>;
+ : InstPTX<(outs RegPred:$d), (ins i1imm:$a), "mov.pred\t$d, $a",
+ [(set RegPred:$d, imm:$a)]>;
def MOVU16ri
- : InstPTX<(outs RRegu16:$d), (ins i16imm:$a), "mov.u16\t$d, $a",
- [(set RRegu16:$d, imm:$a)]>;
+ : InstPTX<(outs RegI16:$d), (ins i16imm:$a), "mov.u16\t$d, $a",
+ [(set RegI16:$d, imm:$a)]>;
def MOVU32ri
- : InstPTX<(outs RRegu32:$d), (ins i32imm:$a), "mov.u32\t$d, $a",
- [(set RRegu32:$d, imm:$a)]>;
+ : InstPTX<(outs RegI32:$d), (ins i32imm:$a), "mov.u32\t$d, $a",
+ [(set RegI32:$d, imm:$a)]>;
def MOVU64ri
- : InstPTX<(outs RRegu64:$d), (ins i64imm:$a), "mov.u64\t$d, $a",
- [(set RRegu64:$d, imm:$a)]>;
+ : InstPTX<(outs RegI64:$d), (ins i64imm:$a), "mov.u64\t$d, $a",
+ [(set RegI64:$d, imm:$a)]>;
def MOVF32ri
- : InstPTX<(outs RRegf32:$d), (ins f32imm:$a), "mov.f32\t$d, $a",
- [(set RRegf32:$d, fpimm:$a)]>;
+ : InstPTX<(outs RegF32:$d), (ins f32imm:$a), "mov.f32\t$d, $a",
+ [(set RegF32:$d, fpimm:$a)]>;
def MOVF64ri
- : InstPTX<(outs RRegf64:$d), (ins f64imm:$a), "mov.f64\t$d, $a",
- [(set RRegf64:$d, fpimm:$a)]>;
+ : InstPTX<(outs RegF64:$d), (ins f64imm:$a), "mov.f64\t$d, $a",
+ [(set RegF64:$d, fpimm:$a)]>;
}
let isReMaterializable = 1, isAsCheapAsAMove = 1 in {
def MOVaddr32
- : InstPTX<(outs RRegu32:$d), (ins i32imm:$a), "mov.u32\t$d, $a",
- [(set RRegu32:$d, (PTXcopyaddress tglobaladdr:$a))]>;
+ : InstPTX<(outs RegI32:$d), (ins i32imm:$a), "mov.u32\t$d, $a",
+ [(set RegI32:$d, (PTXcopyaddress tglobaladdr:$a))]>;
def MOVaddr64
- : InstPTX<(outs RRegu64:$d), (ins i64imm:$a), "mov.u64\t$d, $a",
- [(set RRegu64:$d, (PTXcopyaddress tglobaladdr:$a))]>;
+ : InstPTX<(outs RegI64:$d), (ins i64imm:$a), "mov.u64\t$d, $a",
+ [(set RegI64:$d, (PTXcopyaddress tglobaladdr:$a))]>;
}
// Loads
@@ -789,17 +831,48 @@ defm LDc : PTX_LD_ALL<"ld.const", load_constant>;
defm LDl : PTX_LD_ALL<"ld.local", load_local>;
defm LDs : PTX_LD_ALL<"ld.shared", load_shared>;
-// This is a special instruction that is manually inserted for kernel parameters
-def LDpiU16 : InstPTX<(outs RRegu16:$d), (ins MEMpi:$a),
- "ld.param.u16\t$d, [$a]", []>;
-def LDpiU32 : InstPTX<(outs RRegu32:$d), (ins MEMpi:$a),
- "ld.param.u32\t$d, [$a]", []>;
-def LDpiU64 : InstPTX<(outs RRegu64:$d), (ins MEMpi:$a),
- "ld.param.u64\t$d, [$a]", []>;
-def LDpiF32 : InstPTX<(outs RRegf32:$d), (ins MEMpi:$a),
- "ld.param.f32\t$d, [$a]", []>;
-def LDpiF64 : InstPTX<(outs RRegf64:$d), (ins MEMpi:$a),
- "ld.param.f64\t$d, [$a]", []>;
+// These instructions are used to load/store from the .param space for
+// device and kernel parameters
+
+let hasSideEffects = 1 in {
+ def LDpiPred : InstPTX<(outs RegPred:$d), (ins MEMpi:$a),
+ "ld.param.pred\t$d, [$a]",
+ [(set RegPred:$d, (PTXloadparam timm:$a))]>;
+ def LDpiU16 : InstPTX<(outs RegI16:$d), (ins MEMpi:$a),
+ "ld.param.u16\t$d, [$a]",
+ [(set RegI16:$d, (PTXloadparam timm:$a))]>;
+ def LDpiU32 : InstPTX<(outs RegI32:$d), (ins MEMpi:$a),
+ "ld.param.u32\t$d, [$a]",
+ [(set RegI32:$d, (PTXloadparam timm:$a))]>;
+ def LDpiU64 : InstPTX<(outs RegI64:$d), (ins MEMpi:$a),
+ "ld.param.u64\t$d, [$a]",
+ [(set RegI64:$d, (PTXloadparam timm:$a))]>;
+ def LDpiF32 : InstPTX<(outs RegF32:$d), (ins MEMpi:$a),
+ "ld.param.f32\t$d, [$a]",
+ [(set RegF32:$d, (PTXloadparam timm:$a))]>;
+ def LDpiF64 : InstPTX<(outs RegF64:$d), (ins MEMpi:$a),
+ "ld.param.f64\t$d, [$a]",
+ [(set RegF64:$d, (PTXloadparam timm:$a))]>;
+
+ def STpiPred : InstPTX<(outs), (ins MEMret:$d, RegPred:$a),
+ "st.param.pred\t[$d], $a",
+ [(PTXstoreparam timm:$d, RegPred:$a)]>;
+ def STpiU16 : InstPTX<(outs), (ins MEMret:$d, RegI16:$a),
+ "st.param.u16\t[$d], $a",
+ [(PTXstoreparam timm:$d, RegI16:$a)]>;
+ def STpiU32 : InstPTX<(outs), (ins MEMret:$d, RegI32:$a),
+ "st.param.u32\t[$d], $a",
+ [(PTXstoreparam timm:$d, RegI32:$a)]>;
+ def STpiU64 : InstPTX<(outs), (ins MEMret:$d, RegI64:$a),
+ "st.param.u64\t[$d], $a",
+ [(PTXstoreparam timm:$d, RegI64:$a)]>;
+ def STpiF32 : InstPTX<(outs), (ins MEMret:$d, RegF32:$a),
+ "st.param.f32\t[$d], $a",
+ [(PTXstoreparam timm:$d, RegF32:$a)]>;
+ def STpiF64 : InstPTX<(outs), (ins MEMret:$d, RegF64:$a),
+ "st.param.f64\t[$d], $a",
+ [(PTXstoreparam timm:$d, RegF64:$a)]>;
+}
// Stores
defm STg : PTX_ST_ALL<"st.global", store_global>;
@@ -811,136 +884,174 @@ defm STs : PTX_ST_ALL<"st.shared", store_shared>;
// TODO: Do something with st.param if/when it is needed.
// Conversion to pred
-
+// PTX does not directly support converting to a predicate type, so we fake it
+// by performing a greater-than test between the value and zero. This follows
+// the C convention that any non-zero value is equivalent to 'true'.
def CVT_pred_u16
- : InstPTX<(outs Preds:$d), (ins RRegu16:$a), "cvt.pred.u16\t$d, $a",
- [(set Preds:$d, (trunc RRegu16:$a))]>;
+ : InstPTX<(outs RegPred:$d), (ins RegI16:$a), "setp.gt.u16\t$d, $a, 0",
+ [(set RegPred:$d, (trunc RegI16:$a))]>;
def CVT_pred_u32
- : InstPTX<(outs Preds:$d), (ins RRegu32:$a), "cvt.pred.u32\t$d, $a",
- [(set Preds:$d, (trunc RRegu32:$a))]>;
+ : InstPTX<(outs RegPred:$d), (ins RegI32:$a), "setp.gt.u32\t$d, $a, 0",
+ [(set RegPred:$d, (trunc RegI32:$a))]>;
def CVT_pred_u64
- : InstPTX<(outs Preds:$d), (ins RRegu64:$a), "cvt.pred.u64\t$d, $a",
- [(set Preds:$d, (trunc RRegu64:$a))]>;
+ : InstPTX<(outs RegPred:$d), (ins RegI64:$a), "setp.gt.u64\t$d, $a, 0",
+ [(set RegPred:$d, (trunc RegI64:$a))]>;
def CVT_pred_f32
- : InstPTX<(outs Preds:$d), (ins RRegf32:$a), "cvt.rni.pred.f32\t$d, $a",
- [(set Preds:$d, (fp_to_uint RRegf32:$a))]>;
+ : InstPTX<(outs RegPred:$d), (ins RegF32:$a), "setp.gt.f32\t$d, $a, 0",
+ [(set RegPred:$d, (fp_to_uint RegF32:$a))]>;
def CVT_pred_f64
- : InstPTX<(outs Preds:$d), (ins RRegf64:$a), "cvt.rni.pred.f64\t$d, $a",
- [(set Preds:$d, (fp_to_uint RRegf64:$a))]>;
+ : InstPTX<(outs RegPred:$d), (ins RegF64:$a), "setp.gt.f64\t$d, $a, 0",
+ [(set RegPred:$d, (fp_to_uint RegF64:$a))]>;
// Conversion to u16
+// PTX does not directly support converting a predicate to a value, so we
+// use a select instruction to select either 0 or 1 (integer or fp) based
+// on the truth value of the predicate.
+def CVT_u16_preda
+ : InstPTX<(outs RegI16:$d), (ins RegPred:$a), "selp.u16\t$d, 1, 0, $a",
+ [(set RegI16:$d, (anyext RegPred:$a))]>;
def CVT_u16_pred
- : InstPTX<(outs RRegu16:$d), (ins Preds:$a), "cvt.u16.pred\t$d, $a",
- [(set RRegu16:$d, (zext Preds:$a))]>;
+ : InstPTX<(outs RegI16:$d), (ins RegPred:$a), "selp.u16\t$d, 1, 0, $a",
+ [(set RegI16:$d, (zext RegPred:$a))]>;
+
+def CVT_u16_preds
+ : InstPTX<(outs RegI16:$d), (ins RegPred:$a), "selp.u16\t$d, 1, 0, $a",
+ [(set RegI16:$d, (sext RegPred:$a))]>;
def CVT_u16_u32
- : InstPTX<(outs RRegu16:$d), (ins RRegu32:$a), "cvt.u16.u32\t$d, $a",
- [(set RRegu16:$d, (trunc RRegu32:$a))]>;
+ : InstPTX<(outs RegI16:$d), (ins RegI32:$a), "cvt.u16.u32\t$d, $a",
+ [(set RegI16:$d, (trunc RegI32:$a))]>;
def CVT_u16_u64
- : InstPTX<(outs RRegu16:$d), (ins RRegu64:$a), "cvt.u16.u64\t$d, $a",
- [(set RRegu16:$d, (trunc RRegu64:$a))]>;
+ : InstPTX<(outs RegI16:$d), (ins RegI64:$a), "cvt.u16.u64\t$d, $a",
+ [(set RegI16:$d, (trunc RegI64:$a))]>;
def CVT_u16_f32
- : InstPTX<(outs RRegu16:$d), (ins RRegf32:$a), "cvt.rni.u16.f32\t$d, $a",
- [(set RRegu16:$d, (fp_to_uint RRegf32:$a))]>;
+ : InstPTX<(outs RegI16:$d), (ins RegF32:$a), "cvt.rzi.u16.f32\t$d, $a",
+ [(set RegI16:$d, (fp_to_uint RegF32:$a))]>;
def CVT_u16_f64
- : InstPTX<(outs RRegu16:$d), (ins RRegf64:$a), "cvt.rni.u16.f64\t$d, $a",
- [(set RRegu16:$d, (fp_to_uint RRegf64:$a))]>;
+ : InstPTX<(outs RegI16:$d), (ins RegF64:$a), "cvt.rzi.u16.f64\t$d, $a",
+ [(set RegI16:$d, (fp_to_uint RegF64:$a))]>;
// Conversion to u32
def CVT_u32_pred
- : InstPTX<(outs RRegu32:$d), (ins Preds:$a), "cvt.u32.pred\t$d, $a",
- [(set RRegu32:$d, (zext Preds:$a))]>;
+ : InstPTX<(outs RegI32:$d), (ins RegPred:$a), "selp.u32\t$d, 1, 0, $a",
+ [(set RegI32:$d, (zext RegPred:$a))]>;
+
+def CVT_u32_b16
+ : InstPTX<(outs RegI32:$d), (ins RegI16:$a), "cvt.u32.u16\t$d, $a",
+ [(set RegI32:$d, (anyext RegI16:$a))]>;
def CVT_u32_u16
- : InstPTX<(outs RRegu32:$d), (ins RRegu16:$a), "cvt.u32.u16\t$d, $a",
- [(set RRegu32:$d, (zext RRegu16:$a))]>;
+ : InstPTX<(outs RegI32:$d), (ins RegI16:$a), "cvt.u32.u16\t$d, $a",
+ [(set RegI32:$d, (zext RegI16:$a))]>;
+
+def CVT_u32_preds
+ : InstPTX<(outs RegI32:$d), (ins RegPred:$a), "selp.u32\t$d, 1, 0, $a",
+ [(set RegI32:$d, (sext RegPred:$a))]>;
+
+def CVT_u32_s16
+ : InstPTX<(outs RegI32:$d), (ins RegI16:$a), "cvt.u32.s16\t$d, $a",
+ [(set RegI32:$d, (sext RegI16:$a))]>;
def CVT_u32_u64
- : InstPTX<(outs RRegu32:$d), (ins RRegu64:$a), "cvt.u32.u64\t$d, $a",
- [(set RRegu32:$d, (trunc RRegu64:$a))]>;
+ : InstPTX<(outs RegI32:$d), (ins RegI64:$a), "cvt.u32.u64\t$d, $a",
+ [(set RegI32:$d, (trunc RegI64:$a))]>;
def CVT_u32_f32
- : InstPTX<(outs RRegu32:$d), (ins RRegf32:$a), "cvt.rni.u32.f32\t$d, $a",
- [(set RRegu32:$d, (fp_to_uint RRegf32:$a))]>;
+ : InstPTX<(outs RegI32:$d), (ins RegF32:$a), "cvt.rzi.u32.f32\t$d, $a",
+ [(set RegI32:$d, (fp_to_uint RegF32:$a))]>;
def CVT_u32_f64
- : InstPTX<(outs RRegu32:$d), (ins RRegf64:$a), "cvt.rni.u32.f64\t$d, $a",
- [(set RRegu32:$d, (fp_to_uint RRegf64:$a))]>;
+ : InstPTX<(outs RegI32:$d), (ins RegF64:$a), "cvt.rzi.u32.f64\t$d, $a",
+ [(set RegI32:$d, (fp_to_uint RegF64:$a))]>;
// Conversion to u64
def CVT_u64_pred
- : InstPTX<(outs RRegu64:$d), (ins Preds:$a), "cvt.u64.pred\t$d, $a",
- [(set RRegu64:$d, (zext Preds:$a))]>;
+ : InstPTX<(outs RegI64:$d), (ins RegPred:$a), "selp.u64\t$d, 1, 0, $a",
+ [(set RegI64:$d, (zext RegPred:$a))]>;
+
+def CVT_u64_preds
+ : InstPTX<(outs RegI64:$d), (ins RegPred:$a), "selp.u64\t$d, 1, 0, $a",
+ [(set RegI64:$d, (sext RegPred:$a))]>;
def CVT_u64_u16
- : InstPTX<(outs RRegu64:$d), (ins RRegu16:$a), "cvt.u64.u16\t$d, $a",
- [(set RRegu64:$d, (zext RRegu16:$a))]>;
+ : InstPTX<(outs RegI64:$d), (ins RegI16:$a), "cvt.u64.u16\t$d, $a",
+ [(set RegI64:$d, (zext RegI16:$a))]>;
+
+def CVT_u64_s16
+ : InstPTX<(outs RegI64:$d), (ins RegI16:$a), "cvt.u64.s16\t$d, $a",
+ [(set RegI64:$d, (sext RegI16:$a))]>;
def CVT_u64_u32
- : InstPTX<(outs RRegu64:$d), (ins RRegu32:$a), "cvt.u64.u32\t$d, $a",
- [(set RRegu64:$d, (zext RRegu32:$a))]>;
+ : InstPTX<(outs RegI64:$d), (ins RegI32:$a), "cvt.u64.u32\t$d, $a",
+ [(set RegI64:$d, (zext RegI32:$a))]>;
+
+def CVT_u64_s32
+ : InstPTX<(outs RegI64:$d), (ins RegI32:$a), "cvt.u64.s32\t$d, $a",
+ [(set RegI64:$d, (sext RegI32:$a))]>;
def CVT_u64_f32
- : InstPTX<(outs RRegu64:$d), (ins RRegf32:$a), "cvt.rni.u64.f32\t$d, $a",
- [(set RRegu64:$d, (fp_to_uint RRegf32:$a))]>;
+ : InstPTX<(outs RegI64:$d), (ins RegF32:$a), "cvt.rzi.u64.f32\t$d, $a",
+ [(set RegI64:$d, (fp_to_uint RegF32:$a))]>;
def CVT_u64_f64
- : InstPTX<(outs RRegu64:$d), (ins RRegf64:$a), "cvt.rni.u64.f64\t$d, $a",
- [(set RRegu64:$d, (fp_to_uint RRegf64:$a))]>;
+ : InstPTX<(outs RegI64:$d), (ins RegF64:$a), "cvt.rzi.u64.f64\t$d, $a",
+ [(set RegI64:$d, (fp_to_uint RegF64:$a))]>;
// Conversion to f32
def CVT_f32_pred
- : InstPTX<(outs RRegf32:$d), (ins Preds:$a), "cvt.rn.f32.pred\t$d, $a",
- [(set RRegf32:$d, (uint_to_fp Preds:$a))]>;
+ : InstPTX<(outs RegF32:$d), (ins RegPred:$a),
+ "selp.f32\t$d, 0F3F800000, 0F00000000, $a", // 1.0
+ [(set RegF32:$d, (uint_to_fp RegPred:$a))]>;
def CVT_f32_u16
- : InstPTX<(outs RRegf32:$d), (ins RRegu16:$a), "cvt.rn.f32.u16\t$d, $a",
- [(set RRegf32:$d, (uint_to_fp RRegu16:$a))]>;
+ : InstPTX<(outs RegF32:$d), (ins RegI16:$a), "cvt.rn.f32.u16\t$d, $a",
+ [(set RegF32:$d, (uint_to_fp RegI16:$a))]>;
def CVT_f32_u32
- : InstPTX<(outs RRegf32:$d), (ins RRegu32:$a), "cvt.rn.f32.u32\t$d, $a",
- [(set RRegf32:$d, (uint_to_fp RRegu32:$a))]>;
+ : InstPTX<(outs RegF32:$d), (ins RegI32:$a), "cvt.rn.f32.u32\t$d, $a",
+ [(set RegF32:$d, (uint_to_fp RegI32:$a))]>;
def CVT_f32_u64
- : InstPTX<(outs RRegf32:$d), (ins RRegu64:$a), "cvt.rn.f32.u64\t$d, $a",
- [(set RRegf32:$d, (uint_to_fp RRegu64:$a))]>;
+ : InstPTX<(outs RegF32:$d), (ins RegI64:$a), "cvt.rn.f32.u64\t$d, $a",
+ [(set RegF32:$d, (uint_to_fp RegI64:$a))]>;
def CVT_f32_f64
- : InstPTX<(outs RRegf32:$d), (ins RRegf64:$a), "cvt.rn.f32.f64\t$d, $a",
- [(set RRegf32:$d, (fround RRegf64:$a))]>;
+ : InstPTX<(outs RegF32:$d), (ins RegF64:$a), "cvt.rn.f32.f64\t$d, $a",
+ [(set RegF32:$d, (fround RegF64:$a))]>;
// Conversion to f64
def CVT_f64_pred
- : InstPTX<(outs RRegf64:$d), (ins Preds:$a), "cvt.rn.f64.pred\t$d, $a",
- [(set RRegf64:$d, (uint_to_fp Preds:$a))]>;
+ : InstPTX<(outs RegF64:$d), (ins RegPred:$a),
+ "selp.f64\t$d, 0D3F80000000000000, 0D0000000000000000, $a", // 1.0
+ [(set RegF64:$d, (uint_to_fp RegPred:$a))]>;
def CVT_f64_u16
- : InstPTX<(outs RRegf64:$d), (ins RRegu16:$a), "cvt.rn.f64.u16\t$d, $a",
- [(set RRegf64:$d, (uint_to_fp RRegu16:$a))]>;
+ : InstPTX<(outs RegF64:$d), (ins RegI16:$a), "cvt.rn.f64.u16\t$d, $a",
+ [(set RegF64:$d, (uint_to_fp RegI16:$a))]>;
def CVT_f64_u32
- : InstPTX<(outs RRegf64:$d), (ins RRegu32:$a), "cvt.rn.f64.u32\t$d, $a",
- [(set RRegf64:$d, (uint_to_fp RRegu32:$a))]>;
+ : InstPTX<(outs RegF64:$d), (ins RegI32:$a), "cvt.rn.f64.u32\t$d, $a",
+ [(set RegF64:$d, (uint_to_fp RegI32:$a))]>;
def CVT_f64_u64
- : InstPTX<(outs RRegf64:$d), (ins RRegu64:$a), "cvt.rn.f64.u64\t$d, $a",
- [(set RRegf64:$d, (uint_to_fp RRegu64:$a))]>;
+ : InstPTX<(outs RegF64:$d), (ins RegI64:$a), "cvt.rn.f64.u64\t$d, $a",
+ [(set RegF64:$d, (uint_to_fp RegI64:$a))]>;
def CVT_f64_f32
- : InstPTX<(outs RRegf64:$d), (ins RRegf32:$a), "cvt.f64.f32\t$d, $a",
- [(set RRegf64:$d, (fextend RRegf32:$a))]>;
+ : InstPTX<(outs RegF64:$d), (ins RegF32:$a), "cvt.f64.f32\t$d, $a",
+ [(set RegF64:$d, (fextend RegF32:$a))]>;
///===- Control Flow Instructions -----------------------------------------===//
@@ -951,7 +1062,7 @@ let isBranch = 1, isTerminator = 1, isBarrier = 1 in {
let isBranch = 1, isTerminator = 1 in {
// FIXME: The pattern part is blank because I cannot (or do not yet know
- // how to) use the first operand of PredicateOperand (a Preds register) here
+ // how to) use the first operand of PredicateOperand (a RegPred register) here
def BRAdp
: InstPTX<(outs), (ins brtarget:$d), "bra\t$d",
[/*(brcond pred:$_p, bb:$d)*/]>;
@@ -962,6 +1073,30 @@ let isReturn = 1, isTerminator = 1, isBarrier = 1 in {
def RET : InstPTX<(outs), (ins), "ret", [(PTXret)]>;
}
+///===- Spill Instructions ------------------------------------------------===//
+// Special instructions used for stack spilling
+def STACKSTOREI16 : InstPTX<(outs), (ins i32imm:$d, RegI16:$a),
+ "mov.u16\ts$d, $a", []>;
+def STACKSTOREI32 : InstPTX<(outs), (ins i32imm:$d, RegI32:$a),
+ "mov.u32\ts$d, $a", []>;
+def STACKSTOREI64 : InstPTX<(outs), (ins i32imm:$d, RegI64:$a),
+ "mov.u64\ts$d, $a", []>;
+def STACKSTOREF32 : InstPTX<(outs), (ins i32imm:$d, RegF32:$a),
+ "mov.f32\ts$d, $a", []>;
+def STACKSTOREF64 : InstPTX<(outs), (ins i32imm:$d, RegF64:$a),
+ "mov.f64\ts$d, $a", []>;
+
+def STACKLOADI16 : InstPTX<(outs), (ins RegI16:$d, i32imm:$a),
+ "mov.u16\t$d, s$a", []>;
+def STACKLOADI32 : InstPTX<(outs), (ins RegI32:$d, i32imm:$a),
+ "mov.u32\t$d, s$a", []>;
+def STACKLOADI64 : InstPTX<(outs), (ins RegI64:$d, i32imm:$a),
+ "mov.u64\t$d, s$a", []>;
+def STACKLOADF32 : InstPTX<(outs), (ins RegF32:$d, i32imm:$a),
+ "mov.f32\t$d, s$a", []>;
+def STACKLOADF64 : InstPTX<(outs), (ins RegF64:$d, i32imm:$a),
+ "mov.f64\t$d, s$a", []>;
+
///===- Intrinsic Instructions --------------------------------------------===//
include "PTXIntrinsicInstrInfo.td"
diff --git a/contrib/llvm/lib/Target/PTX/PTXIntrinsicInstrInfo.td b/contrib/llvm/lib/Target/PTX/PTXIntrinsicInstrInfo.td
index 320934a..8d97909 100644
--- a/contrib/llvm/lib/Target/PTX/PTXIntrinsicInstrInfo.td
+++ b/contrib/llvm/lib/Target/PTX/PTXIntrinsicInstrInfo.td
@@ -14,14 +14,14 @@
// PTX Special Purpose Register Accessor Intrinsics
class PTX_READ_SPECIAL_REGISTER_R64<string regname, Intrinsic intop>
- : InstPTX<(outs RRegu64:$d), (ins),
+ : InstPTX<(outs RegI64:$d), (ins),
!strconcat("mov.u64\t$d, %", regname),
- [(set RRegu64:$d, (intop))]>;
+ [(set RegI64:$d, (intop))]>;
class PTX_READ_SPECIAL_REGISTER_R32<string regname, Intrinsic intop>
- : InstPTX<(outs RRegu32:$d), (ins),
+ : InstPTX<(outs RegI32:$d), (ins),
!strconcat("mov.u32\t$d, %", regname),
- [(set RRegu32:$d, (intop))]>;
+ [(set RegI32:$d, (intop))]>;
// TODO Add read vector-version of special registers
diff --git a/contrib/llvm/lib/Target/PTX/PTXMCAsmStreamer.cpp b/contrib/llvm/lib/Target/PTX/PTXMCAsmStreamer.cpp
index 1574670..b13a3da 100644
--- a/contrib/llvm/lib/Target/PTX/PTXMCAsmStreamer.cpp
+++ b/contrib/llvm/lib/Target/PTX/PTXMCAsmStreamer.cpp
@@ -23,7 +23,6 @@
#include "llvm/Support/Format.h"
#include "llvm/Support/FormattedStream.h"
#include "llvm/Support/raw_ostream.h"
-#include "llvm/Target/TargetAsmInfo.h"
using namespace llvm;
@@ -115,7 +114,8 @@ public:
virtual void EmitDwarfAdvanceLineAddr(int64_t LineDelta,
const MCSymbol *LastLabel,
- const MCSymbol *Label);
+ const MCSymbol *Label,
+ unsigned PointerSize);
virtual void EmitSymbolAttribute(MCSymbol *Symbol, MCSymbolAttr Attribute);
@@ -260,7 +260,8 @@ void PTXMCAsmStreamer::EmitWeakReference(MCSymbol *Alias,
void PTXMCAsmStreamer::EmitDwarfAdvanceLineAddr(int64_t LineDelta,
const MCSymbol *LastLabel,
- const MCSymbol *Label) {
+ const MCSymbol *Label,
+ unsigned PointerSize) {
report_fatal_error("Unimplemented.");
}
@@ -367,7 +368,7 @@ void PTXMCAsmStreamer::EmitValueImpl(const MCExpr *Value, unsigned Size,
int64_t IntValue;
if (!Value->EvaluateAsAbsolute(IntValue))
report_fatal_error("Don't know how to emit this value.");
- if (getContext().getTargetAsmInfo().isLittleEndian()) {
+ if (getContext().getAsmInfo().isLittleEndian()) {
EmitIntValue((uint32_t)(IntValue >> 0 ), 4, AddrSpace);
EmitIntValue((uint32_t)(IntValue >> 32), 4, AddrSpace);
} else {
diff --git a/contrib/llvm/lib/Target/PTX/PTXMFInfoExtract.cpp b/contrib/llvm/lib/Target/PTX/PTXMFInfoExtract.cpp
index c5e1910..6fe9e6c 100644
--- a/contrib/llvm/lib/Target/PTX/PTXMFInfoExtract.cpp
+++ b/contrib/llvm/lib/Target/PTX/PTXMFInfoExtract.cpp
@@ -54,8 +54,6 @@ bool PTXMFInfoExtract::runOnMachineFunction(MachineFunction &MF) {
DEBUG(dbgs() << "******** PTX FUNCTION LOCAL VAR REG DEF ********\n");
- unsigned retreg = MFI->retReg();
-
DEBUG(dbgs()
<< "PTX::NoRegister == " << PTX::NoRegister << "\n"
<< "PTX::NUM_TARGET_REGS == " << PTX::NUM_TARGET_REGS << "\n");
@@ -68,15 +66,13 @@ bool PTXMFInfoExtract::runOnMachineFunction(MachineFunction &MF) {
// FIXME: This is a slow linear scanning
for (unsigned reg = PTX::NoRegister + 1; reg < PTX::NUM_TARGET_REGS; ++reg)
if (MRI.isPhysRegUsed(reg) &&
- reg != retreg &&
+ !MFI->isRetReg(reg) &&
(MFI->isKernel() || !MFI->isArgReg(reg)))
MFI->addLocalVarReg(reg);
// Notify MachineFunctionInfo that I've done adding local var reg
MFI->doneAddLocalVar();
- DEBUG(dbgs() << "Return Reg: " << retreg << "\n");
-
DEBUG(for (PTXMachineFunctionInfo::reg_iterator
i = MFI->argRegBegin(), e = MFI->argRegEnd();
i != e; ++i)
diff --git a/contrib/llvm/lib/Target/PTX/PTXMachineFunctionInfo.h b/contrib/llvm/lib/Target/PTX/PTXMachineFunctionInfo.h
index 81df1c2..9d65f5b 100644
--- a/contrib/llvm/lib/Target/PTX/PTXMachineFunctionInfo.h
+++ b/contrib/llvm/lib/Target/PTX/PTXMachineFunctionInfo.h
@@ -15,6 +15,7 @@
#define PTX_MACHINE_FUNCTION_INFO_H
#include "PTX.h"
+#include "llvm/ADT/DenseSet.h"
#include "llvm/CodeGen/MachineFunction.h"
namespace llvm {
@@ -25,7 +26,7 @@ class PTXMachineFunctionInfo : public MachineFunctionInfo {
private:
bool is_kernel;
std::vector<unsigned> reg_arg, reg_local_var;
- unsigned reg_ret;
+ std::vector<unsigned> reg_ret;
bool _isDoneAddArg;
public:
@@ -39,19 +40,22 @@ public:
void addArgReg(unsigned reg) { reg_arg.push_back(reg); }
void addLocalVarReg(unsigned reg) { reg_local_var.push_back(reg); }
- void setRetReg(unsigned reg) { reg_ret = reg; }
+ void addRetReg(unsigned reg) {
+ if (!isRetReg(reg)) {
+ reg_ret.push_back(reg);
+ }
+ }
void doneAddArg(void) {
_isDoneAddArg = true;
}
void doneAddLocalVar(void) {}
- bool isDoneAddArg(void) { return _isDoneAddArg; }
-
bool isKernel() const { return is_kernel; }
typedef std::vector<unsigned>::const_iterator reg_iterator;
typedef std::vector<unsigned>::const_reverse_iterator reg_reverse_iterator;
+ typedef std::vector<unsigned>::const_iterator ret_iterator;
bool argRegEmpty() const { return reg_arg.empty(); }
int getNumArg() const { return reg_arg.size(); }
@@ -64,12 +68,19 @@ public:
reg_iterator localVarRegBegin() const { return reg_local_var.begin(); }
reg_iterator localVarRegEnd() const { return reg_local_var.end(); }
- unsigned retReg() const { return reg_ret; }
+ bool retRegEmpty() const { return reg_ret.empty(); }
+ int getNumRet() const { return reg_ret.size(); }
+ ret_iterator retRegBegin() const { return reg_ret.begin(); }
+ ret_iterator retRegEnd() const { return reg_ret.end(); }
bool isArgReg(unsigned reg) const {
return std::find(reg_arg.begin(), reg_arg.end(), reg) != reg_arg.end();
}
+ bool isRetReg(unsigned reg) const {
+ return std::find(reg_ret.begin(), reg_ret.end(), reg) != reg_ret.end();
+ }
+
bool isLocalVarReg(unsigned reg) const {
return std::find(reg_local_var.begin(), reg_local_var.end(), reg)
!= reg_local_var.end();
diff --git a/contrib/llvm/lib/Target/PTX/PTXRegisterInfo.cpp b/contrib/llvm/lib/Target/PTX/PTXRegisterInfo.cpp
index 0f3e7bc..cb56ea9 100644
--- a/contrib/llvm/lib/Target/PTX/PTXRegisterInfo.cpp
+++ b/contrib/llvm/lib/Target/PTX/PTXRegisterInfo.cpp
@@ -13,7 +13,39 @@
#include "PTX.h"
#include "PTXRegisterInfo.h"
+#include "llvm/CodeGen/MachineFunction.h"
+#include "llvm/Support/Debug.h"
+#include "llvm/Support/raw_ostream.h"
+
+#define GET_REGINFO_TARGET_DESC
+#include "PTXGenRegisterInfo.inc"
using namespace llvm;
-#include "PTXGenRegisterInfo.inc"
+PTXRegisterInfo::PTXRegisterInfo(PTXTargetMachine &TM,
+ const TargetInstrInfo &TII)
+ : PTXGenRegisterInfo() {
+}
+
+void PTXRegisterInfo::eliminateFrameIndex(MachineBasicBlock::iterator II,
+ int SPAdj,
+ RegScavenger *RS) const {
+ unsigned Index;
+ MachineInstr& MI = *II;
+
+ Index = 0;
+ while (!MI.getOperand(Index).isFI()) {
+ ++Index;
+ assert(Index < MI.getNumOperands() &&
+ "Instr does not have a FrameIndex operand!");
+ }
+
+ int FrameIndex = MI.getOperand(Index).getIndex();
+
+ DEBUG(dbgs() << "eliminateFrameIndex: " << MI);
+ DEBUG(dbgs() << "- SPAdj: " << SPAdj << "\n");
+ DEBUG(dbgs() << "- FrameIndex: " << FrameIndex << "\n");
+
+ // This frame index is post stack slot re-use assignments
+ MI.getOperand(Index).ChangeToImmediate(FrameIndex);
+}
diff --git a/contrib/llvm/lib/Target/PTX/PTXRegisterInfo.h b/contrib/llvm/lib/Target/PTX/PTXRegisterInfo.h
index dc56352..0b63cb6 100644
--- a/contrib/llvm/lib/Target/PTX/PTXRegisterInfo.h
+++ b/contrib/llvm/lib/Target/PTX/PTXRegisterInfo.h
@@ -17,7 +17,8 @@
#include "llvm/Support/ErrorHandling.h"
#include "llvm/ADT/BitVector.h"
-#include "PTXGenRegisterInfo.h.inc"
+#define GET_REGINFO_HEADER
+#include "PTXGenRegisterInfo.inc"
namespace llvm {
class PTXTargetMachine;
@@ -25,7 +26,7 @@ class MachineFunction;
struct PTXRegisterInfo : public PTXGenRegisterInfo {
PTXRegisterInfo(PTXTargetMachine &TM,
- const TargetInstrInfo &TII) {}
+ const TargetInstrInfo &TII);
virtual const unsigned
*getCalleeSavedRegs(const MachineFunction *MF = 0) const {
@@ -38,11 +39,9 @@ struct PTXRegisterInfo : public PTXGenRegisterInfo {
return Reserved; // reserve no regs
}
- virtual void eliminateFrameIndex(MachineBasicBlock::iterator MI,
+ virtual void eliminateFrameIndex(MachineBasicBlock::iterator II,
int SPAdj,
- RegScavenger *RS = NULL) const {
- llvm_unreachable("PTX does not support general function call");
- }
+ RegScavenger *RS = NULL) const;
virtual unsigned getFrameRegister(const MachineFunction &MF) const {
llvm_unreachable("PTX does not have a frame register");
diff --git a/contrib/llvm/lib/Target/PTX/PTXRegisterInfo.td b/contrib/llvm/lib/Target/PTX/PTXRegisterInfo.td
index f616141..1313d24 100644
--- a/contrib/llvm/lib/Target/PTX/PTXRegisterInfo.td
+++ b/contrib/llvm/lib/Target/PTX/PTXRegisterInfo.td
@@ -1,3 +1,4 @@
+
//===- PTXRegisterInfo.td - PTX Register defs ----------------*- tblgen -*-===//
//
// The LLVM Compiler Infrastructure
@@ -21,16 +22,16 @@ class PTXReg<string n> : Register<n> {
///===- Predicate Registers -----------------------------------------------===//
-def P0 : PTXReg<"p0">;
-def P1 : PTXReg<"p1">;
-def P2 : PTXReg<"p2">;
-def P3 : PTXReg<"p3">;
-def P4 : PTXReg<"p4">;
-def P5 : PTXReg<"p5">;
-def P6 : PTXReg<"p6">;
-def P7 : PTXReg<"p7">;
-def P8 : PTXReg<"p8">;
-def P9 : PTXReg<"p9">;
+def P0 : PTXReg<"p0">;
+def P1 : PTXReg<"p1">;
+def P2 : PTXReg<"p2">;
+def P3 : PTXReg<"p3">;
+def P4 : PTXReg<"p4">;
+def P5 : PTXReg<"p5">;
+def P6 : PTXReg<"p6">;
+def P7 : PTXReg<"p7">;
+def P8 : PTXReg<"p8">;
+def P9 : PTXReg<"p9">;
def P10 : PTXReg<"p10">;
def P11 : PTXReg<"p11">;
def P12 : PTXReg<"p12">;
@@ -85,19 +86,83 @@ def P60 : PTXReg<"p60">;
def P61 : PTXReg<"p61">;
def P62 : PTXReg<"p62">;
def P63 : PTXReg<"p63">;
+def P64 : PTXReg<"p64">;
+def P65 : PTXReg<"p65">;
+def P66 : PTXReg<"p66">;
+def P67 : PTXReg<"p67">;
+def P68 : PTXReg<"p68">;
+def P69 : PTXReg<"p69">;
+def P70 : PTXReg<"p70">;
+def P71 : PTXReg<"p71">;
+def P72 : PTXReg<"p72">;
+def P73 : PTXReg<"p73">;
+def P74 : PTXReg<"p74">;
+def P75 : PTXReg<"p75">;
+def P76 : PTXReg<"p76">;
+def P77 : PTXReg<"p77">;
+def P78 : PTXReg<"p78">;
+def P79 : PTXReg<"p79">;
+def P80 : PTXReg<"p80">;
+def P81 : PTXReg<"p81">;
+def P82 : PTXReg<"p82">;
+def P83 : PTXReg<"p83">;
+def P84 : PTXReg<"p84">;
+def P85 : PTXReg<"p85">;
+def P86 : PTXReg<"p86">;
+def P87 : PTXReg<"p87">;
+def P88 : PTXReg<"p88">;
+def P89 : PTXReg<"p89">;
+def P90 : PTXReg<"p90">;
+def P91 : PTXReg<"p91">;
+def P92 : PTXReg<"p92">;
+def P93 : PTXReg<"p93">;
+def P94 : PTXReg<"p94">;
+def P95 : PTXReg<"p95">;
+def P96 : PTXReg<"p96">;
+def P97 : PTXReg<"p97">;
+def P98 : PTXReg<"p98">;
+def P99 : PTXReg<"p99">;
+def P100 : PTXReg<"p100">;
+def P101 : PTXReg<"p101">;
+def P102 : PTXReg<"p102">;
+def P103 : PTXReg<"p103">;
+def P104 : PTXReg<"p104">;
+def P105 : PTXReg<"p105">;
+def P106 : PTXReg<"p106">;
+def P107 : PTXReg<"p107">;
+def P108 : PTXReg<"p108">;
+def P109 : PTXReg<"p109">;
+def P110 : PTXReg<"p110">;
+def P111 : PTXReg<"p111">;
+def P112 : PTXReg<"p112">;
+def P113 : PTXReg<"p113">;
+def P114 : PTXReg<"p114">;
+def P115 : PTXReg<"p115">;
+def P116 : PTXReg<"p116">;
+def P117 : PTXReg<"p117">;
+def P118 : PTXReg<"p118">;
+def P119 : PTXReg<"p119">;
+def P120 : PTXReg<"p120">;
+def P121 : PTXReg<"p121">;
+def P122 : PTXReg<"p122">;
+def P123 : PTXReg<"p123">;
+def P124 : PTXReg<"p124">;
+def P125 : PTXReg<"p125">;
+def P126 : PTXReg<"p126">;
+def P127 : PTXReg<"p127">;
-///===- 16-bit Integer Registers ------------------------------------------===//
+///===- 16-Bit Registers --------------------------------------------------===//
-def RH0 : PTXReg<"rh0">;
-def RH1 : PTXReg<"rh1">;
-def RH2 : PTXReg<"rh2">;
-def RH3 : PTXReg<"rh3">;
-def RH4 : PTXReg<"rh4">;
-def RH5 : PTXReg<"rh5">;
-def RH6 : PTXReg<"rh6">;
-def RH7 : PTXReg<"rh7">;
-def RH8 : PTXReg<"rh8">;
-def RH9 : PTXReg<"rh9">;
+def RH0 : PTXReg<"rh0">;
+def RH1 : PTXReg<"rh1">;
+def RH2 : PTXReg<"rh2">;
+def RH3 : PTXReg<"rh3">;
+def RH4 : PTXReg<"rh4">;
+def RH5 : PTXReg<"rh5">;
+def RH6 : PTXReg<"rh6">;
+def RH7 : PTXReg<"rh7">;
+def RH8 : PTXReg<"rh8">;
+def RH9 : PTXReg<"rh9">;
def RH10 : PTXReg<"rh10">;
def RH11 : PTXReg<"rh11">;
def RH12 : PTXReg<"rh12">;
@@ -152,20 +217,83 @@ def RH60 : PTXReg<"rh60">;
def RH61 : PTXReg<"rh61">;
def RH62 : PTXReg<"rh62">;
def RH63 : PTXReg<"rh63">;
+def RH64 : PTXReg<"rh64">;
+def RH65 : PTXReg<"rh65">;
+def RH66 : PTXReg<"rh66">;
+def RH67 : PTXReg<"rh67">;
+def RH68 : PTXReg<"rh68">;
+def RH69 : PTXReg<"rh69">;
+def RH70 : PTXReg<"rh70">;
+def RH71 : PTXReg<"rh71">;
+def RH72 : PTXReg<"rh72">;
+def RH73 : PTXReg<"rh73">;
+def RH74 : PTXReg<"rh74">;
+def RH75 : PTXReg<"rh75">;
+def RH76 : PTXReg<"rh76">;
+def RH77 : PTXReg<"rh77">;
+def RH78 : PTXReg<"rh78">;
+def RH79 : PTXReg<"rh79">;
+def RH80 : PTXReg<"rh80">;
+def RH81 : PTXReg<"rh81">;
+def RH82 : PTXReg<"rh82">;
+def RH83 : PTXReg<"rh83">;
+def RH84 : PTXReg<"rh84">;
+def RH85 : PTXReg<"rh85">;
+def RH86 : PTXReg<"rh86">;
+def RH87 : PTXReg<"rh87">;
+def RH88 : PTXReg<"rh88">;
+def RH89 : PTXReg<"rh89">;
+def RH90 : PTXReg<"rh90">;
+def RH91 : PTXReg<"rh91">;
+def RH92 : PTXReg<"rh92">;
+def RH93 : PTXReg<"rh93">;
+def RH94 : PTXReg<"rh94">;
+def RH95 : PTXReg<"rh95">;
+def RH96 : PTXReg<"rh96">;
+def RH97 : PTXReg<"rh97">;
+def RH98 : PTXReg<"rh98">;
+def RH99 : PTXReg<"rh99">;
+def RH100 : PTXReg<"rh100">;
+def RH101 : PTXReg<"rh101">;
+def RH102 : PTXReg<"rh102">;
+def RH103 : PTXReg<"rh103">;
+def RH104 : PTXReg<"rh104">;
+def RH105 : PTXReg<"rh105">;
+def RH106 : PTXReg<"rh106">;
+def RH107 : PTXReg<"rh107">;
+def RH108 : PTXReg<"rh108">;
+def RH109 : PTXReg<"rh109">;
+def RH110 : PTXReg<"rh110">;
+def RH111 : PTXReg<"rh111">;
+def RH112 : PTXReg<"rh112">;
+def RH113 : PTXReg<"rh113">;
+def RH114 : PTXReg<"rh114">;
+def RH115 : PTXReg<"rh115">;
+def RH116 : PTXReg<"rh116">;
+def RH117 : PTXReg<"rh117">;
+def RH118 : PTXReg<"rh118">;
+def RH119 : PTXReg<"rh119">;
+def RH120 : PTXReg<"rh120">;
+def RH121 : PTXReg<"rh121">;
+def RH122 : PTXReg<"rh122">;
+def RH123 : PTXReg<"rh123">;
+def RH124 : PTXReg<"rh124">;
+def RH125 : PTXReg<"rh125">;
+def RH126 : PTXReg<"rh126">;
+def RH127 : PTXReg<"rh127">;
+///===- 32-Bit Registers --------------------------------------------------===//
-///===- 32-bit Integer Registers ------------------------------------------===//
-
-def R0 : PTXReg<"r0">;
-def R1 : PTXReg<"r1">;
-def R2 : PTXReg<"r2">;
-def R3 : PTXReg<"r3">;
-def R4 : PTXReg<"r4">;
-def R5 : PTXReg<"r5">;
-def R6 : PTXReg<"r6">;
-def R7 : PTXReg<"r7">;
-def R8 : PTXReg<"r8">;
-def R9 : PTXReg<"r9">;
+def R0 : PTXReg<"r0">;
+def R1 : PTXReg<"r1">;
+def R2 : PTXReg<"r2">;
+def R3 : PTXReg<"r3">;
+def R4 : PTXReg<"r4">;
+def R5 : PTXReg<"r5">;
+def R6 : PTXReg<"r6">;
+def R7 : PTXReg<"r7">;
+def R8 : PTXReg<"r8">;
+def R9 : PTXReg<"r9">;
def R10 : PTXReg<"r10">;
def R11 : PTXReg<"r11">;
def R12 : PTXReg<"r12">;
@@ -220,20 +348,83 @@ def R60 : PTXReg<"r60">;
def R61 : PTXReg<"r61">;
def R62 : PTXReg<"r62">;
def R63 : PTXReg<"r63">;
+def R64 : PTXReg<"r64">;
+def R65 : PTXReg<"r65">;
+def R66 : PTXReg<"r66">;
+def R67 : PTXReg<"r67">;
+def R68 : PTXReg<"r68">;
+def R69 : PTXReg<"r69">;
+def R70 : PTXReg<"r70">;
+def R71 : PTXReg<"r71">;
+def R72 : PTXReg<"r72">;
+def R73 : PTXReg<"r73">;
+def R74 : PTXReg<"r74">;
+def R75 : PTXReg<"r75">;
+def R76 : PTXReg<"r76">;
+def R77 : PTXReg<"r77">;
+def R78 : PTXReg<"r78">;
+def R79 : PTXReg<"r79">;
+def R80 : PTXReg<"r80">;
+def R81 : PTXReg<"r81">;
+def R82 : PTXReg<"r82">;
+def R83 : PTXReg<"r83">;
+def R84 : PTXReg<"r84">;
+def R85 : PTXReg<"r85">;
+def R86 : PTXReg<"r86">;
+def R87 : PTXReg<"r87">;
+def R88 : PTXReg<"r88">;
+def R89 : PTXReg<"r89">;
+def R90 : PTXReg<"r90">;
+def R91 : PTXReg<"r91">;
+def R92 : PTXReg<"r92">;
+def R93 : PTXReg<"r93">;
+def R94 : PTXReg<"r94">;
+def R95 : PTXReg<"r95">;
+def R96 : PTXReg<"r96">;
+def R97 : PTXReg<"r97">;
+def R98 : PTXReg<"r98">;
+def R99 : PTXReg<"r99">;
+def R100 : PTXReg<"r100">;
+def R101 : PTXReg<"r101">;
+def R102 : PTXReg<"r102">;
+def R103 : PTXReg<"r103">;
+def R104 : PTXReg<"r104">;
+def R105 : PTXReg<"r105">;
+def R106 : PTXReg<"r106">;
+def R107 : PTXReg<"r107">;
+def R108 : PTXReg<"r108">;
+def R109 : PTXReg<"r109">;
+def R110 : PTXReg<"r110">;
+def R111 : PTXReg<"r111">;
+def R112 : PTXReg<"r112">;
+def R113 : PTXReg<"r113">;
+def R114 : PTXReg<"r114">;
+def R115 : PTXReg<"r115">;
+def R116 : PTXReg<"r116">;
+def R117 : PTXReg<"r117">;
+def R118 : PTXReg<"r118">;
+def R119 : PTXReg<"r119">;
+def R120 : PTXReg<"r120">;
+def R121 : PTXReg<"r121">;
+def R122 : PTXReg<"r122">;
+def R123 : PTXReg<"r123">;
+def R124 : PTXReg<"r124">;
+def R125 : PTXReg<"r125">;
+def R126 : PTXReg<"r126">;
+def R127 : PTXReg<"r127">;
+///===- 64-Bit Registers --------------------------------------------------===//
-///===- 64-bit Integer Registers ------------------------------------------===//
-
-def RD0 : PTXReg<"rd0">;
-def RD1 : PTXReg<"rd1">;
-def RD2 : PTXReg<"rd2">;
-def RD3 : PTXReg<"rd3">;
-def RD4 : PTXReg<"rd4">;
-def RD5 : PTXReg<"rd5">;
-def RD6 : PTXReg<"rd6">;
-def RD7 : PTXReg<"rd7">;
-def RD8 : PTXReg<"rd8">;
-def RD9 : PTXReg<"rd9">;
+def RD0 : PTXReg<"rd0">;
+def RD1 : PTXReg<"rd1">;
+def RD2 : PTXReg<"rd2">;
+def RD3 : PTXReg<"rd3">;
+def RD4 : PTXReg<"rd4">;
+def RD5 : PTXReg<"rd5">;
+def RD6 : PTXReg<"rd6">;
+def RD7 : PTXReg<"rd7">;
+def RD8 : PTXReg<"rd8">;
+def RD9 : PTXReg<"rd9">;
def RD10 : PTXReg<"rd10">;
def RD11 : PTXReg<"rd11">;
def RD12 : PTXReg<"rd12">;
@@ -288,204 +479,77 @@ def RD60 : PTXReg<"rd60">;
def RD61 : PTXReg<"rd61">;
def RD62 : PTXReg<"rd62">;
def RD63 : PTXReg<"rd63">;
-
-
-///===- 32-bit Floating-Point Registers -----------------------------------===//
-
-def F0 : PTXReg<"f0">;
-def F1 : PTXReg<"f1">;
-def F2 : PTXReg<"f2">;
-def F3 : PTXReg<"f3">;
-def F4 : PTXReg<"f4">;
-def F5 : PTXReg<"f5">;
-def F6 : PTXReg<"f6">;
-def F7 : PTXReg<"f7">;
-def F8 : PTXReg<"f8">;
-def F9 : PTXReg<"f9">;
-def F10 : PTXReg<"f10">;
-def F11 : PTXReg<"f11">;
-def F12 : PTXReg<"f12">;
-def F13 : PTXReg<"f13">;
-def F14 : PTXReg<"f14">;
-def F15 : PTXReg<"f15">;
-def F16 : PTXReg<"f16">;
-def F17 : PTXReg<"f17">;
-def F18 : PTXReg<"f18">;
-def F19 : PTXReg<"f19">;
-def F20 : PTXReg<"f20">;
-def F21 : PTXReg<"f21">;
-def F22 : PTXReg<"f22">;
-def F23 : PTXReg<"f23">;
-def F24 : PTXReg<"f24">;
-def F25 : PTXReg<"f25">;
-def F26 : PTXReg<"f26">;
-def F27 : PTXReg<"f27">;
-def F28 : PTXReg<"f28">;
-def F29 : PTXReg<"f29">;
-def F30 : PTXReg<"f30">;
-def F31 : PTXReg<"f31">;
-def F32 : PTXReg<"f32">;
-def F33 : PTXReg<"f33">;
-def F34 : PTXReg<"f34">;
-def F35 : PTXReg<"f35">;
-def F36 : PTXReg<"f36">;
-def F37 : PTXReg<"f37">;
-def F38 : PTXReg<"f38">;
-def F39 : PTXReg<"f39">;
-def F40 : PTXReg<"f40">;
-def F41 : PTXReg<"f41">;
-def F42 : PTXReg<"f42">;
-def F43 : PTXReg<"f43">;
-def F44 : PTXReg<"f44">;
-def F45 : PTXReg<"f45">;
-def F46 : PTXReg<"f46">;
-def F47 : PTXReg<"f47">;
-def F48 : PTXReg<"f48">;
-def F49 : PTXReg<"f49">;
-def F50 : PTXReg<"f50">;
-def F51 : PTXReg<"f51">;
-def F52 : PTXReg<"f52">;
-def F53 : PTXReg<"f53">;
-def F54 : PTXReg<"f54">;
-def F55 : PTXReg<"f55">;
-def F56 : PTXReg<"f56">;
-def F57 : PTXReg<"f57">;
-def F58 : PTXReg<"f58">;
-def F59 : PTXReg<"f59">;
-def F60 : PTXReg<"f60">;
-def F61 : PTXReg<"f61">;
-def F62 : PTXReg<"f62">;
-def F63 : PTXReg<"f63">;
-
-
-///===- 64-bit Floating-Point Registers -----------------------------------===//
-
-def FD0 : PTXReg<"fd0">;
-def FD1 : PTXReg<"fd1">;
-def FD2 : PTXReg<"fd2">;
-def FD3 : PTXReg<"fd3">;
-def FD4 : PTXReg<"fd4">;
-def FD5 : PTXReg<"fd5">;
-def FD6 : PTXReg<"fd6">;
-def FD7 : PTXReg<"fd7">;
-def FD8 : PTXReg<"fd8">;
-def FD9 : PTXReg<"fd9">;
-def FD10 : PTXReg<"fd10">;
-def FD11 : PTXReg<"fd11">;
-def FD12 : PTXReg<"fd12">;
-def FD13 : PTXReg<"fd13">;
-def FD14 : PTXReg<"fd14">;
-def FD15 : PTXReg<"fd15">;
-def FD16 : PTXReg<"fd16">;
-def FD17 : PTXReg<"fd17">;
-def FD18 : PTXReg<"fd18">;
-def FD19 : PTXReg<"fd19">;
-def FD20 : PTXReg<"fd20">;
-def FD21 : PTXReg<"fd21">;
-def FD22 : PTXReg<"fd22">;
-def FD23 : PTXReg<"fd23">;
-def FD24 : PTXReg<"fd24">;
-def FD25 : PTXReg<"fd25">;
-def FD26 : PTXReg<"fd26">;
-def FD27 : PTXReg<"fd27">;
-def FD28 : PTXReg<"fd28">;
-def FD29 : PTXReg<"fd29">;
-def FD30 : PTXReg<"fd30">;
-def FD31 : PTXReg<"fd31">;
-def FD32 : PTXReg<"fd32">;
-def FD33 : PTXReg<"fd33">;
-def FD34 : PTXReg<"fd34">;
-def FD35 : PTXReg<"fd35">;
-def FD36 : PTXReg<"fd36">;
-def FD37 : PTXReg<"fd37">;
-def FD38 : PTXReg<"fd38">;
-def FD39 : PTXReg<"fd39">;
-def FD40 : PTXReg<"fd40">;
-def FD41 : PTXReg<"fd41">;
-def FD42 : PTXReg<"fd42">;
-def FD43 : PTXReg<"fd43">;
-def FD44 : PTXReg<"fd44">;
-def FD45 : PTXReg<"fd45">;
-def FD46 : PTXReg<"f4d6">;
-def FD47 : PTXReg<"fd47">;
-def FD48 : PTXReg<"fd48">;
-def FD49 : PTXReg<"fd49">;
-def FD50 : PTXReg<"fd50">;
-def FD51 : PTXReg<"fd51">;
-def FD52 : PTXReg<"fd52">;
-def FD53 : PTXReg<"fd53">;
-def FD54 : PTXReg<"fd54">;
-def FD55 : PTXReg<"fd55">;
-def FD56 : PTXReg<"fd56">;
-def FD57 : PTXReg<"fd57">;
-def FD58 : PTXReg<"fd58">;
-def FD59 : PTXReg<"fd59">;
-def FD60 : PTXReg<"fd60">;
-def FD61 : PTXReg<"fd61">;
-def FD62 : PTXReg<"fd62">;
-def FD63 : PTXReg<"fd63">;
-
+def RD64 : PTXReg<"rd64">;
+def RD65 : PTXReg<"rd65">;
+def RD66 : PTXReg<"rd66">;
+def RD67 : PTXReg<"rd67">;
+def RD68 : PTXReg<"rd68">;
+def RD69 : PTXReg<"rd69">;
+def RD70 : PTXReg<"rd70">;
+def RD71 : PTXReg<"rd71">;
+def RD72 : PTXReg<"rd72">;
+def RD73 : PTXReg<"rd73">;
+def RD74 : PTXReg<"rd74">;
+def RD75 : PTXReg<"rd75">;
+def RD76 : PTXReg<"rd76">;
+def RD77 : PTXReg<"rd77">;
+def RD78 : PTXReg<"rd78">;
+def RD79 : PTXReg<"rd79">;
+def RD80 : PTXReg<"rd80">;
+def RD81 : PTXReg<"rd81">;
+def RD82 : PTXReg<"rd82">;
+def RD83 : PTXReg<"rd83">;
+def RD84 : PTXReg<"rd84">;
+def RD85 : PTXReg<"rd85">;
+def RD86 : PTXReg<"rd86">;
+def RD87 : PTXReg<"rd87">;
+def RD88 : PTXReg<"rd88">;
+def RD89 : PTXReg<"rd89">;
+def RD90 : PTXReg<"rd90">;
+def RD91 : PTXReg<"rd91">;
+def RD92 : PTXReg<"rd92">;
+def RD93 : PTXReg<"rd93">;
+def RD94 : PTXReg<"rd94">;
+def RD95 : PTXReg<"rd95">;
+def RD96 : PTXReg<"rd96">;
+def RD97 : PTXReg<"rd97">;
+def RD98 : PTXReg<"rd98">;
+def RD99 : PTXReg<"rd99">;
+def RD100 : PTXReg<"rd100">;
+def RD101 : PTXReg<"rd101">;
+def RD102 : PTXReg<"rd102">;
+def RD103 : PTXReg<"rd103">;
+def RD104 : PTXReg<"rd104">;
+def RD105 : PTXReg<"rd105">;
+def RD106 : PTXReg<"rd106">;
+def RD107 : PTXReg<"rd107">;
+def RD108 : PTXReg<"rd108">;
+def RD109 : PTXReg<"rd109">;
+def RD110 : PTXReg<"rd110">;
+def RD111 : PTXReg<"rd111">;
+def RD112 : PTXReg<"rd112">;
+def RD113 : PTXReg<"rd113">;
+def RD114 : PTXReg<"rd114">;
+def RD115 : PTXReg<"rd115">;
+def RD116 : PTXReg<"rd116">;
+def RD117 : PTXReg<"rd117">;
+def RD118 : PTXReg<"rd118">;
+def RD119 : PTXReg<"rd119">;
+def RD120 : PTXReg<"rd120">;
+def RD121 : PTXReg<"rd121">;
+def RD122 : PTXReg<"rd122">;
+def RD123 : PTXReg<"rd123">;
+def RD124 : PTXReg<"rd124">;
+def RD125 : PTXReg<"rd125">;
+def RD126 : PTXReg<"rd126">;
+def RD127 : PTXReg<"rd127">;
//===----------------------------------------------------------------------===//
// Register classes
//===----------------------------------------------------------------------===//
-
-def Preds : RegisterClass<"PTX", [i1], 8,
- [P0, P1, P2, P3, P4, P5, P6, P7,
- P8, P9, P10, P11, P12, P13, P14, P15,
- P16, P17, P18, P19, P20, P21, P22, P23,
- P24, P25, P26, P27, P28, P29, P30, P31,
- P32, P33, P34, P35, P36, P37, P38, P39,
- P40, P41, P42, P43, P44, P45, P46, P47,
- P48, P49, P50, P51, P52, P53, P54, P55,
- P56, P57, P58, P59, P60, P61, P62, P63]>;
-
-def RRegu16 : RegisterClass<"PTX", [i16], 16,
- [RH0, RH1, RH2, RH3, RH4, RH5, RH6, RH7,
- RH8, RH9, RH10, RH11, RH12, RH13, RH14, RH15,
- RH16, RH17, RH18, RH19, RH20, RH21, RH22, RH23,
- RH24, RH25, RH26, RH27, RH28, RH29, RH30, RH31,
- RH32, RH33, RH34, RH35, RH36, RH37, RH38, RH39,
- RH40, RH41, RH42, RH43, RH44, RH45, RH46, RH47,
- RH48, RH49, RH50, RH51, RH52, RH53, RH54, RH55,
- RH56, RH57, RH58, RH59, RH60, RH61, RH62, RH63]>;
-
-def RRegu32 : RegisterClass<"PTX", [i32], 32,
- [R0, R1, R2, R3, R4, R5, R6, R7,
- R8, R9, R10, R11, R12, R13, R14, R15,
- R16, R17, R18, R19, R20, R21, R22, R23,
- R24, R25, R26, R27, R28, R29, R30, R31,
- R32, R33, R34, R35, R36, R37, R38, R39,
- R40, R41, R42, R43, R44, R45, R46, R47,
- R48, R49, R50, R51, R52, R53, R54, R55,
- R56, R57, R58, R59, R60, R61, R62, R63]>;
-
-def RRegu64 : RegisterClass<"PTX", [i64], 64,
- [RD0, RD1, RD2, RD3, RD4, RD5, RD6, RD7,
- RD8, RD9, RD10, RD11, RD12, RD13, RD14, RD15,
- RD16, RD17, RD18, RD19, RD20, RD21, RD22, RD23,
- RD24, RD25, RD26, RD27, RD28, RD29, RD30, RD31,
- RD32, RD33, RD34, RD35, RD36, RD37, RD38, RD39,
- RD40, RD41, RD42, RD43, RD44, RD45, RD46, RD47,
- RD48, RD49, RD50, RD51, RD52, RD53, RD54, RD55,
- RD56, RD57, RD58, RD59, RD60, RD61, RD62, RD63]>;
-
-def RRegf32 : RegisterClass<"PTX", [f32], 32,
- [F0, F1, F2, F3, F4, F5, F6, F7,
- F8, F9, F10, F11, F12, F13, F14, F15,
- F16, F17, F18, F19, F20, F21, F22, F23,
- F24, F25, F26, F27, F28, F29, F30, F31,
- F32, F33, F34, F35, F36, F37, F38, F39,
- F40, F41, F42, F43, F44, F45, F46, F47,
- F48, F49, F50, F51, F52, F53, F54, F55,
- F56, F57, F58, F59, F60, F61, F62, F63]>;
-
-def RRegf64 : RegisterClass<"PTX", [f64], 64,
- [FD0, FD1, FD2, FD3, FD4, FD5, FD6, FD7,
- FD8, FD9, FD10, FD11, FD12, FD13, FD14, FD15,
- FD16, FD17, FD18, FD19, FD20, FD21, FD22, FD23,
- FD24, FD25, FD26, FD27, FD28, FD29, FD30, FD31,
- FD32, FD33, FD34, FD35, FD36, FD37, FD38, FD39,
- FD40, FD41, FD42, FD43, FD44, FD45, FD46, FD47,
- FD48, FD49, FD50, FD51, FD52, FD53, FD54, FD55,
- FD56, FD57, FD58, FD59, FD60, FD61, FD62, FD63]>;
+def RegPred : RegisterClass<"PTX", [i1], 8, (sequence "P%u", 0, 127)>;
+def RegI16 : RegisterClass<"PTX", [i16], 16, (sequence "RH%u", 0, 127)>;
+def RegI32 : RegisterClass<"PTX", [i32], 32, (sequence "R%u", 0, 127)>;
+def RegI64 : RegisterClass<"PTX", [i64], 64, (sequence "RD%u", 0, 127)>;
+def RegF32 : RegisterClass<"PTX", [f32], 32, (sequence "R%u", 0, 127)>;
+def RegF64 : RegisterClass<"PTX", [f64], 64, (sequence "RD%u", 0, 127)>;
diff --git a/contrib/llvm/lib/Target/PTX/PTXSubtarget.cpp b/contrib/llvm/lib/Target/PTX/PTXSubtarget.cpp
index e8a1dfe..8ec646e 100644
--- a/contrib/llvm/lib/Target/PTX/PTXSubtarget.cpp
+++ b/contrib/llvm/lib/Target/PTX/PTXSubtarget.cpp
@@ -7,32 +7,51 @@
//
//===----------------------------------------------------------------------===//
//
-// This file implements the PTX specific subclass of TargetSubtarget.
+// This file implements the PTX specific subclass of TargetSubtargetInfo.
//
//===----------------------------------------------------------------------===//
#include "PTXSubtarget.h"
+#include "PTX.h"
#include "llvm/Support/ErrorHandling.h"
+#include "llvm/Target/TargetRegistry.h"
+
+#define GET_SUBTARGETINFO_TARGET_DESC
+#define GET_SUBTARGETINFO_CTOR
+#include "PTXGenSubtargetInfo.inc"
using namespace llvm;
-PTXSubtarget::PTXSubtarget(const std::string &TT, const std::string &FS,
- bool is64Bit)
- : PTXShaderModel(PTX_SM_1_0),
+PTXSubtarget::PTXSubtarget(const std::string &TT, const std::string &CPU,
+ const std::string &FS, bool is64Bit)
+ : PTXGenSubtargetInfo(TT, CPU, FS),
+ PTXTarget(PTX_COMPUTE_1_0),
PTXVersion(PTX_VERSION_2_0),
SupportsDouble(false),
SupportsFMA(true),
- Is64Bit(is64Bit) {
- std::string TARGET = "generic";
- ParseSubtargetFeatures(FS, TARGET);
+ Is64Bit(is64Bit) {
+ std::string TARGET = CPU;
+ if (TARGET.empty())
+ TARGET = "generic";
+ ParseSubtargetFeatures(TARGET, FS);
}
std::string PTXSubtarget::getTargetString() const {
- switch(PTXShaderModel) {
- default: llvm_unreachable("Unknown shader model");
+ switch(PTXTarget) {
+ default: llvm_unreachable("Unknown PTX target");
case PTX_SM_1_0: return "sm_10";
+ case PTX_SM_1_1: return "sm_11";
+ case PTX_SM_1_2: return "sm_12";
case PTX_SM_1_3: return "sm_13";
case PTX_SM_2_0: return "sm_20";
+ case PTX_SM_2_1: return "sm_21";
+ case PTX_SM_2_2: return "sm_22";
+ case PTX_SM_2_3: return "sm_23";
+ case PTX_COMPUTE_1_0: return "compute_10";
+ case PTX_COMPUTE_1_1: return "compute_11";
+ case PTX_COMPUTE_1_2: return "compute_12";
+ case PTX_COMPUTE_1_3: return "compute_13";
+ case PTX_COMPUTE_2_0: return "compute_20";
}
}
@@ -45,5 +64,3 @@ std::string PTXSubtarget::getPTXVersionString() const {
case PTX_VERSION_2_3: return "2.3";
}
}
-
-#include "PTXGenSubtarget.inc"
diff --git a/contrib/llvm/lib/Target/PTX/PTXSubtarget.h b/contrib/llvm/lib/Target/PTX/PTXSubtarget.h
index 59fa696..0921f1f 100644
--- a/contrib/llvm/lib/Target/PTX/PTXSubtarget.h
+++ b/contrib/llvm/lib/Target/PTX/PTXSubtarget.h
@@ -7,26 +7,44 @@
//
//===----------------------------------------------------------------------===//
//
-// This file declares the PTX specific subclass of TargetSubtarget.
+// This file declares the PTX specific subclass of TargetSubtargetInfo.
//
//===----------------------------------------------------------------------===//
#ifndef PTX_SUBTARGET_H
#define PTX_SUBTARGET_H
-#include "llvm/Target/TargetSubtarget.h"
+#include "llvm/Target/TargetSubtargetInfo.h"
+
+#define GET_SUBTARGETINFO_HEADER
+#include "PTXGenSubtargetInfo.inc"
namespace llvm {
- class PTXSubtarget : public TargetSubtarget {
- private:
+class StringRef;
+
+ class PTXSubtarget : public PTXGenSubtargetInfo {
+ public:
/**
* Enumeration of Shader Models supported by the back-end.
*/
- enum PTXShaderModelEnum {
+ enum PTXTargetEnum {
+ PTX_COMPUTE_1_0, /*< Compute Compatibility 1.0 */
+ PTX_COMPUTE_1_1, /*< Compute Compatibility 1.1 */
+ PTX_COMPUTE_1_2, /*< Compute Compatibility 1.2 */
+ PTX_COMPUTE_1_3, /*< Compute Compatibility 1.3 */
+ PTX_COMPUTE_2_0, /*< Compute Compatibility 2.0 */
+ PTX_LAST_COMPUTE,
+
PTX_SM_1_0, /*< Shader Model 1.0 */
+ PTX_SM_1_1, /*< Shader Model 1.1 */
+ PTX_SM_1_2, /*< Shader Model 1.2 */
PTX_SM_1_3, /*< Shader Model 1.3 */
- PTX_SM_2_0 /*< Shader Model 2.0 */
+ PTX_SM_2_0, /*< Shader Model 2.0 */
+ PTX_SM_2_1, /*< Shader Model 2.1 */
+ PTX_SM_2_2, /*< Shader Model 2.2 */
+ PTX_SM_2_3, /*< Shader Model 2.3 */
+ PTX_LAST_SM
};
/**
@@ -41,24 +59,30 @@ namespace llvm {
PTX_VERSION_2_3 /*< PTX Version 2.3 */
};
+ private:
+
/// Shader Model supported on the target GPU.
- PTXShaderModelEnum PTXShaderModel;
+ PTXTargetEnum PTXTarget;
/// PTX Language Version.
PTXVersionEnum PTXVersion;
// The native .f64 type is supported on the hardware.
bool SupportsDouble;
-
- // Support the fused-multiply add (FMA) and multiply-add (MAD) instructions
+
+ // Support the fused-multiply add (FMA) and multiply-add (MAD)
+ // instructions
bool SupportsFMA;
-
+
// Use .u64 instead of .u32 for addresses.
bool Is64Bit;
public:
- PTXSubtarget(const std::string &TT, const std::string &FS, bool is64Bit);
+ PTXSubtarget(const std::string &TT, const std::string &CPU,
+ const std::string &FS, bool is64Bit);
+
+ // Target architecture accessors
std::string getTargetString() const;
std::string getPTXVersionString() const;
@@ -68,10 +92,6 @@ namespace llvm {
bool is64Bit() const { return Is64Bit; }
bool supportsFMA() const { return SupportsFMA; }
-
- bool supportsSM13() const { return PTXShaderModel >= PTX_SM_1_3; }
-
- bool supportsSM20() const { return PTXShaderModel >= PTX_SM_2_0; }
bool supportsPTX21() const { return PTXVersion >= PTX_VERSION_2_1; }
@@ -79,8 +99,22 @@ namespace llvm {
bool supportsPTX23() const { return PTXVersion >= PTX_VERSION_2_3; }
- std::string ParseSubtargetFeatures(const std::string &FS,
- const std::string &CPU);
+ bool fdivNeedsRoundingMode() const {
+ return (PTXTarget >= PTX_SM_1_3 && PTXTarget < PTX_LAST_SM) ||
+ (PTXTarget >= PTX_COMPUTE_1_3 && PTXTarget < PTX_LAST_COMPUTE);
+ }
+
+ bool fmadNeedsRoundingMode() const {
+ return (PTXTarget >= PTX_SM_1_3 && PTXTarget < PTX_LAST_SM) ||
+ (PTXTarget >= PTX_COMPUTE_1_3 && PTXTarget < PTX_LAST_COMPUTE);
+ }
+
+ bool useParamSpaceForDeviceArgs() const {
+ return (PTXTarget >= PTX_SM_2_0 && PTXTarget < PTX_LAST_SM) ||
+ (PTXTarget >= PTX_COMPUTE_2_0 && PTXTarget < PTX_LAST_COMPUTE);
+ }
+
+ void ParseSubtargetFeatures(StringRef CPU, StringRef FS);
}; // class PTXSubtarget
} // namespace llvm
diff --git a/contrib/llvm/lib/Target/PTX/PTXTargetMachine.cpp b/contrib/llvm/lib/Target/PTX/PTXTargetMachine.cpp
index 1b737c9..ab926e0 100644
--- a/contrib/llvm/lib/Target/PTX/PTXTargetMachine.cpp
+++ b/contrib/llvm/lib/Target/PTX/PTXTargetMachine.cpp
@@ -12,7 +12,6 @@
//===----------------------------------------------------------------------===//
#include "PTX.h"
-#include "PTXMCAsmInfo.h"
#include "PTXTargetMachine.h"
#include "llvm/PassManager.h"
#include "llvm/Target/TargetRegistry.h"
@@ -35,9 +34,6 @@ extern "C" void LLVMInitializePTXTarget() {
RegisterTargetMachine<PTX32TargetMachine> X(ThePTX32Target);
RegisterTargetMachine<PTX64TargetMachine> Y(ThePTX64Target);
- RegisterAsmInfo<PTXMCAsmInfo> Z(ThePTX32Target);
- RegisterAsmInfo<PTXMCAsmInfo> W(ThePTX64Target);
-
TargetRegistry::RegisterAsmStreamer(ThePTX32Target, createPTXAsmStreamer);
TargetRegistry::RegisterAsmStreamer(ThePTX64Target, createPTXAsmStreamer);
}
@@ -52,11 +48,12 @@ namespace {
// DataLayout and FrameLowering are filled with dummy data
PTXTargetMachine::PTXTargetMachine(const Target &T,
const std::string &TT,
+ const std::string &CPU,
const std::string &FS,
bool is64Bit)
- : LLVMTargetMachine(T, TT),
+ : LLVMTargetMachine(T, TT, CPU, FS),
DataLayout(is64Bit ? DataLayout64 : DataLayout32),
- Subtarget(TT, FS, is64Bit),
+ Subtarget(TT, CPU, FS, is64Bit),
FrameLowering(Subtarget),
InstrInfo(*this),
TLInfo(*this) {
@@ -64,14 +61,16 @@ PTXTargetMachine::PTXTargetMachine(const Target &T,
PTX32TargetMachine::PTX32TargetMachine(const Target &T,
const std::string& TT,
+ const std::string& CPU,
const std::string& FS)
- : PTXTargetMachine(T, TT, FS, false) {
+ : PTXTargetMachine(T, TT, CPU, FS, false) {
}
PTX64TargetMachine::PTX64TargetMachine(const Target &T,
const std::string& TT,
+ const std::string& CPU,
const std::string& FS)
- : PTXTargetMachine(T, TT, FS, true) {
+ : PTXTargetMachine(T, TT, CPU, FS, true) {
}
bool PTXTargetMachine::addInstSelector(PassManagerBase &PM,
diff --git a/contrib/llvm/lib/Target/PTX/PTXTargetMachine.h b/contrib/llvm/lib/Target/PTX/PTXTargetMachine.h
index 149be8e..ae42153 100644
--- a/contrib/llvm/lib/Target/PTX/PTXTargetMachine.h
+++ b/contrib/llvm/lib/Target/PTX/PTXTargetMachine.h
@@ -33,7 +33,8 @@ class PTXTargetMachine : public LLVMTargetMachine {
public:
PTXTargetMachine(const Target &T, const std::string &TT,
- const std::string &FS, bool is64Bit);
+ const std::string &CPU, const std::string &FS,
+ bool is64Bit);
virtual const TargetData *getTargetData() const { return &DataLayout; }
@@ -61,14 +62,14 @@ class PTX32TargetMachine : public PTXTargetMachine {
public:
PTX32TargetMachine(const Target &T, const std::string &TT,
- const std::string& FS);
+ const std::string& CPU, const std::string& FS);
}; // class PTX32TargetMachine
class PTX64TargetMachine : public PTXTargetMachine {
public:
PTX64TargetMachine(const Target &T, const std::string &TT,
- const std::string& FS);
+ const std::string& CPU, const std::string& FS);
}; // class PTX32TargetMachine
} // namespace llvm
diff --git a/contrib/llvm/lib/Target/PTX/generate-register-td.py b/contrib/llvm/lib/Target/PTX/generate-register-td.py
new file mode 100755
index 0000000..1528690
--- /dev/null
+++ b/contrib/llvm/lib/Target/PTX/generate-register-td.py
@@ -0,0 +1,163 @@
+#!/usr/bin/env python
+##===- generate-register-td.py --------------------------------*-python-*--===##
+##
+## The LLVM Compiler Infrastructure
+##
+## This file is distributed under the University of Illinois Open Source
+## License. See LICENSE.TXT for details.
+##
+##===----------------------------------------------------------------------===##
+##
+## This file describes the PTX register file generator.
+##
+##===----------------------------------------------------------------------===##
+
+from sys import argv, exit, stdout
+
+
+if len(argv) != 5:
+ print('Usage: generate-register-td.py <num_preds> <num_16> <num_32> <num_64>')
+ exit(1)
+
+try:
+ num_pred = int(argv[1])
+ num_16bit = int(argv[2])
+ num_32bit = int(argv[3])
+ num_64bit = int(argv[4])
+except:
+ print('ERROR: Invalid integer parameter')
+ exit(1)
+
+## Print the register definition file
+td_file = open('PTXRegisterInfo.td', 'w')
+
+td_file.write('''
+//===- PTXRegisterInfo.td - PTX Register defs ----------------*- tblgen -*-===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+//===----------------------------------------------------------------------===//
+// Declarations that describe the PTX register file
+//===----------------------------------------------------------------------===//
+
+class PTXReg<string n> : Register<n> {
+ let Namespace = "PTX";
+}
+
+//===----------------------------------------------------------------------===//
+// Registers
+//===----------------------------------------------------------------------===//
+''')
+
+
+# Print predicate registers
+td_file.write('\n///===- Predicate Registers -----------------------------------------------===//\n\n')
+for r in range(0, num_pred):
+ td_file.write('def P%d : PTXReg<"p%d">;\n' % (r, r))
+
+# Print 16-bit registers
+td_file.write('\n///===- 16-Bit Registers --------------------------------------------------===//\n\n')
+for r in range(0, num_16bit):
+ td_file.write('def RH%d : PTXReg<"rh%d">;\n' % (r, r))
+
+# Print 32-bit registers
+td_file.write('\n///===- 32-Bit Registers --------------------------------------------------===//\n\n')
+for r in range(0, num_32bit):
+ td_file.write('def R%d : PTXReg<"r%d">;\n' % (r, r))
+
+# Print 64-bit registers
+td_file.write('\n///===- 64-Bit Registers --------------------------------------------------===//\n\n')
+for r in range(0, num_64bit):
+ td_file.write('def RD%d : PTXReg<"rd%d">;\n' % (r, r))
+
+
+td_file.write('''
+//===----------------------------------------------------------------------===//
+// Register classes
+//===----------------------------------------------------------------------===//
+''')
+
+
+# Print register classes
+
+td_file.write('def RegPred : RegisterClass<"PTX", [i1], 8, (sequence "P%%u", 0, %d)>;\n' % (num_pred-1))
+td_file.write('def RegI16 : RegisterClass<"PTX", [i16], 16, (sequence "RH%%u", 0, %d)>;\n' % (num_16bit-1))
+td_file.write('def RegI32 : RegisterClass<"PTX", [i32], 32, (sequence "R%%u", 0, %d)>;\n' % (num_32bit-1))
+td_file.write('def RegI64 : RegisterClass<"PTX", [i64], 64, (sequence "RD%%u", 0, %d)>;\n' % (num_64bit-1))
+td_file.write('def RegF32 : RegisterClass<"PTX", [f32], 32, (sequence "R%%u", 0, %d)>;\n' % (num_32bit-1))
+td_file.write('def RegF64 : RegisterClass<"PTX", [f64], 64, (sequence "RD%%u", 0, %d)>;\n' % (num_64bit-1))
+
+
+td_file.close()
+
+## Now write the PTXCallingConv.td file
+td_file = open('PTXCallingConv.td', 'w')
+
+# Reserve 10% of the available registers for return values, and the other 90%
+# for parameters
+num_ret_pred = int(0.1 * num_pred)
+num_ret_16bit = int(0.1 * num_16bit)
+num_ret_32bit = int(0.1 * num_32bit)
+num_ret_64bit = int(0.1 * num_64bit)
+num_param_pred = num_pred - num_ret_pred
+num_param_16bit = num_16bit - num_ret_16bit
+num_param_32bit = num_32bit - num_ret_32bit
+num_param_64bit = num_64bit - num_ret_64bit
+
+param_regs_pred = [('P%d' % (i+num_ret_pred)) for i in range(0, num_param_pred)]
+ret_regs_pred = ['P%d' % i for i in range(0, num_ret_pred)]
+param_regs_16bit = [('RH%d' % (i+num_ret_16bit)) for i in range(0, num_param_16bit)]
+ret_regs_16bit = ['RH%d' % i for i in range(0, num_ret_16bit)]
+param_regs_32bit = [('R%d' % (i+num_ret_32bit)) for i in range(0, num_param_32bit)]
+ret_regs_32bit = ['R%d' % i for i in range(0, num_ret_32bit)]
+param_regs_64bit = [('RD%d' % (i+num_ret_64bit)) for i in range(0, num_param_64bit)]
+ret_regs_64bit = ['RD%d' % i for i in range(0, num_ret_64bit)]
+
+param_list_pred = reduce(lambda x, y: '%s, %s' % (x, y), param_regs_pred)
+ret_list_pred = reduce(lambda x, y: '%s, %s' % (x, y), ret_regs_pred)
+param_list_16bit = reduce(lambda x, y: '%s, %s' % (x, y), param_regs_16bit)
+ret_list_16bit = reduce(lambda x, y: '%s, %s' % (x, y), ret_regs_16bit)
+param_list_32bit = reduce(lambda x, y: '%s, %s' % (x, y), param_regs_32bit)
+ret_list_32bit = reduce(lambda x, y: '%s, %s' % (x, y), ret_regs_32bit)
+param_list_64bit = reduce(lambda x, y: '%s, %s' % (x, y), param_regs_64bit)
+ret_list_64bit = reduce(lambda x, y: '%s, %s' % (x, y), ret_regs_64bit)
+
+td_file.write('''
+//===--- PTXCallingConv.td - Calling Conventions -----------*- tablegen -*-===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+//
+// This describes the calling conventions for the PTX architecture.
+//
+//===----------------------------------------------------------------------===//
+
+// PTX Formal Parameter Calling Convention
+def CC_PTX : CallingConv<[
+ CCIfType<[i1], CCAssignToReg<[%s]>>,
+ CCIfType<[i16], CCAssignToReg<[%s]>>,
+ CCIfType<[i32,f32], CCAssignToReg<[%s]>>,
+ CCIfType<[i64,f64], CCAssignToReg<[%s]>>
+]>;
+
+// PTX Return Value Calling Convention
+def RetCC_PTX : CallingConv<[
+ CCIfType<[i1], CCAssignToReg<[%s]>>,
+ CCIfType<[i16], CCAssignToReg<[%s]>>,
+ CCIfType<[i32,f32], CCAssignToReg<[%s]>>,
+ CCIfType<[i64,f64], CCAssignToReg<[%s]>>
+]>;
+''' % (param_list_pred, param_list_16bit, param_list_32bit, param_list_64bit,
+ ret_list_pred, ret_list_16bit, ret_list_32bit, ret_list_64bit))
+
+
+td_file.close()
diff --git a/contrib/llvm/lib/Target/PowerPC/InstPrinter/PPCInstPrinter.h b/contrib/llvm/lib/Target/PowerPC/InstPrinter/PPCInstPrinter.h
index adfa0aa..d022a44 100644
--- a/contrib/llvm/lib/Target/PowerPC/InstPrinter/PPCInstPrinter.h
+++ b/contrib/llvm/lib/Target/PowerPC/InstPrinter/PPCInstPrinter.h
@@ -19,14 +19,12 @@
namespace llvm {
class MCOperand;
-class TargetMachine;
class PPCInstPrinter : public MCInstPrinter {
// 0 -> AIX, 1 -> Darwin.
unsigned SyntaxVariant;
public:
- PPCInstPrinter(TargetMachine &TM, const MCAsmInfo &MAI,
- unsigned syntaxVariant)
+ PPCInstPrinter(const MCAsmInfo &MAI, unsigned syntaxVariant)
: MCInstPrinter(MAI), SyntaxVariant(syntaxVariant) {}
bool isDarwinSyntax() const {
diff --git a/contrib/llvm/lib/Target/PowerPC/MCTargetDesc/CMakeLists.txt b/contrib/llvm/lib/Target/PowerPC/MCTargetDesc/CMakeLists.txt
new file mode 100644
index 0000000..a1b8166
--- /dev/null
+++ b/contrib/llvm/lib/Target/PowerPC/MCTargetDesc/CMakeLists.txt
@@ -0,0 +1,4 @@
+add_llvm_library(LLVMPowerPCDesc
+ PPCMCTargetDesc.cpp
+ PPCMCAsmInfo.cpp
+ )
diff --git a/contrib/llvm/lib/Target/PowerPC/MCTargetDesc/Makefile b/contrib/llvm/lib/Target/PowerPC/MCTargetDesc/Makefile
new file mode 100644
index 0000000..9db6662
--- /dev/null
+++ b/contrib/llvm/lib/Target/PowerPC/MCTargetDesc/Makefile
@@ -0,0 +1,16 @@
+##===- lib/Target/PowerPC/TargetDesc/Makefile --------------*- Makefile -*-===##
+#
+# The LLVM Compiler Infrastructure
+#
+# This file is distributed under the University of Illinois Open Source
+# License. See LICENSE.TXT for details.
+#
+##===----------------------------------------------------------------------===##
+
+LEVEL = ../../../..
+LIBRARYNAME = LLVMPowerPCDesc
+
+# Hack: we need to include 'main' target directory to grab private headers
+CPP.Flags += -I$(PROJ_OBJ_DIR)/.. -I$(PROJ_SRC_DIR)/..
+
+include $(LEVEL)/Makefile.common
diff --git a/contrib/llvm/lib/Target/PowerPC/PPCMCAsmInfo.cpp b/contrib/llvm/lib/Target/PowerPC/MCTargetDesc/PPCMCAsmInfo.cpp
index 2d5c880..b6dca83 100644
--- a/contrib/llvm/lib/Target/PowerPC/PPCMCAsmInfo.cpp
+++ b/contrib/llvm/lib/Target/PowerPC/MCTargetDesc/PPCMCAsmInfo.cpp
@@ -15,6 +15,10 @@
using namespace llvm;
PPCMCAsmInfoDarwin::PPCMCAsmInfoDarwin(bool is64Bit) {
+ if (is64Bit)
+ PointerSize = 8;
+ IsLittleEndian = false;
+
PCSymbol = ".";
CommentString = ";";
ExceptionsType = ExceptionHandling::DwarfCFI;
diff --git a/contrib/llvm/lib/Target/PowerPC/PPCMCAsmInfo.h b/contrib/llvm/lib/Target/PowerPC/MCTargetDesc/PPCMCAsmInfo.h
index 96ae6fb..96ae6fb 100644
--- a/contrib/llvm/lib/Target/PowerPC/PPCMCAsmInfo.h
+++ b/contrib/llvm/lib/Target/PowerPC/MCTargetDesc/PPCMCAsmInfo.h
diff --git a/contrib/llvm/lib/Target/PowerPC/MCTargetDesc/PPCMCTargetDesc.cpp b/contrib/llvm/lib/Target/PowerPC/MCTargetDesc/PPCMCTargetDesc.cpp
new file mode 100644
index 0000000..02b887f
--- /dev/null
+++ b/contrib/llvm/lib/Target/PowerPC/MCTargetDesc/PPCMCTargetDesc.cpp
@@ -0,0 +1,70 @@
+//===-- PPCMCTargetDesc.cpp - PowerPC Target Descriptions -------*- C++ -*-===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+//
+// This file provides PowerPC specific target descriptions.
+//
+//===----------------------------------------------------------------------===//
+
+#include "PPCMCTargetDesc.h"
+#include "PPCMCAsmInfo.h"
+#include "llvm/MC/MCInstrInfo.h"
+#include "llvm/MC/MCRegisterInfo.h"
+#include "llvm/MC/MCSubtargetInfo.h"
+#include "llvm/Target/TargetRegistry.h"
+
+#define GET_INSTRINFO_MC_DESC
+#include "PPCGenInstrInfo.inc"
+
+#define GET_SUBTARGETINFO_MC_DESC
+#include "PPCGenSubtargetInfo.inc"
+
+#define GET_REGINFO_MC_DESC
+#include "PPCGenRegisterInfo.inc"
+
+using namespace llvm;
+
+static MCInstrInfo *createPPCMCInstrInfo() {
+ MCInstrInfo *X = new MCInstrInfo();
+ InitPPCMCInstrInfo(X);
+ return X;
+}
+
+extern "C" void LLVMInitializePowerPCMCInstrInfo() {
+ TargetRegistry::RegisterMCInstrInfo(ThePPC32Target, createPPCMCInstrInfo);
+ TargetRegistry::RegisterMCInstrInfo(ThePPC64Target, createPPCMCInstrInfo);
+}
+
+
+static MCSubtargetInfo *createPPCMCSubtargetInfo(StringRef TT, StringRef CPU,
+ StringRef FS) {
+ MCSubtargetInfo *X = new MCSubtargetInfo();
+ InitPPCMCSubtargetInfo(X, TT, CPU, FS);
+ return X;
+}
+
+extern "C" void LLVMInitializePowerPCMCSubtargetInfo() {
+ TargetRegistry::RegisterMCSubtargetInfo(ThePPC32Target,
+ createPPCMCSubtargetInfo);
+ TargetRegistry::RegisterMCSubtargetInfo(ThePPC64Target,
+ createPPCMCSubtargetInfo);
+}
+
+static MCAsmInfo *createMCAsmInfo(const Target &T, StringRef TT) {
+ Triple TheTriple(TT);
+ bool isPPC64 = TheTriple.getArch() == Triple::ppc64;
+ if (TheTriple.isOSDarwin())
+ return new PPCMCAsmInfoDarwin(isPPC64);
+ return new PPCLinuxMCAsmInfo(isPPC64);
+
+}
+
+extern "C" void LLVMInitializePowerPCMCAsmInfo() {
+ RegisterMCAsmInfoFn C(ThePPC32Target, createMCAsmInfo);
+ RegisterMCAsmInfoFn D(ThePPC64Target, createMCAsmInfo);
+}
diff --git a/contrib/llvm/lib/Target/PowerPC/MCTargetDesc/PPCMCTargetDesc.h b/contrib/llvm/lib/Target/PowerPC/MCTargetDesc/PPCMCTargetDesc.h
new file mode 100644
index 0000000..cee2350
--- /dev/null
+++ b/contrib/llvm/lib/Target/PowerPC/MCTargetDesc/PPCMCTargetDesc.h
@@ -0,0 +1,41 @@
+//===-- PPCMCTargetDesc.h - PowerPC Target Descriptions ---------*- C++ -*-===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+//
+// This file provides PowerPC specific target descriptions.
+//
+//===----------------------------------------------------------------------===//
+
+#ifndef PPCMCTARGETDESC_H
+#define PPCMCTARGETDESC_H
+
+namespace llvm {
+class MCSubtargetInfo;
+class Target;
+class StringRef;
+
+extern Target ThePPC32Target;
+extern Target ThePPC64Target;
+
+} // End llvm namespace
+
+// Defines symbolic names for PowerPC registers. This defines a mapping from
+// register name to register number.
+//
+#define GET_REGINFO_ENUM
+#include "PPCGenRegisterInfo.inc"
+
+// Defines symbolic names for the PowerPC instructions.
+//
+#define GET_INSTRINFO_ENUM
+#include "PPCGenInstrInfo.inc"
+
+#define GET_SUBTARGETINFO_ENUM
+#include "PPCGenSubtargetInfo.inc"
+
+#endif
diff --git a/contrib/llvm/lib/Target/PowerPC/PPC.h b/contrib/llvm/lib/Target/PowerPC/PPC.h
index 92672b5..7191dd1 100644
--- a/contrib/llvm/lib/Target/PowerPC/PPC.h
+++ b/contrib/llvm/lib/Target/PowerPC/PPC.h
@@ -15,6 +15,7 @@
#ifndef LLVM_TARGET_POWERPC_H
#define LLVM_TARGET_POWERPC_H
+#include "MCTargetDesc/PPCMCTargetDesc.h"
#include <string>
// GCC #defines PPC on Linux but we use it as our namespace name
@@ -31,6 +32,8 @@ namespace llvm {
class MCInst;
class MCCodeEmitter;
class MCContext;
+ class MCInstrInfo;
+ class MCSubtargetInfo;
class TargetMachine;
class TargetAsmBackend;
@@ -38,16 +41,14 @@ namespace llvm {
FunctionPass *createPPCISelDag(PPCTargetMachine &TM);
FunctionPass *createPPCJITCodeEmitterPass(PPCTargetMachine &TM,
JITCodeEmitter &MCE);
- MCCodeEmitter *createPPCMCCodeEmitter(const Target &, TargetMachine &TM,
+ MCCodeEmitter *createPPCMCCodeEmitter(const MCInstrInfo &MCII,
+ const MCSubtargetInfo &STI,
MCContext &Ctx);
TargetAsmBackend *createPPCAsmBackend(const Target &, const std::string &);
void LowerPPCMachineInstrToMCInst(const MachineInstr *MI, MCInst &OutMI,
AsmPrinter &AP, bool isDarwin);
- extern Target ThePPC32Target;
- extern Target ThePPC64Target;
-
namespace PPCII {
/// Target Operand Flag enum.
@@ -81,13 +82,4 @@ namespace llvm {
} // end namespace llvm;
-// Defines symbolic names for PowerPC registers. This defines a mapping from
-// register name to register number.
-//
-#include "PPCGenRegisterNames.inc"
-
-// Defines symbolic names for the PowerPC instructions.
-//
-#include "PPCGenInstrNames.inc"
-
#endif
diff --git a/contrib/llvm/lib/Target/PowerPC/PPCAsmBackend.cpp b/contrib/llvm/lib/Target/PowerPC/PPCAsmBackend.cpp
index f562a3f..4b8cbb7 100644
--- a/contrib/llvm/lib/Target/PowerPC/PPCAsmBackend.cpp
+++ b/contrib/llvm/lib/Target/PowerPC/PPCAsmBackend.cpp
@@ -13,6 +13,7 @@
#include "llvm/MC/MCMachObjectWriter.h"
#include "llvm/MC/MCSectionMachO.h"
#include "llvm/MC/MCObjectWriter.h"
+#include "llvm/MC/MCValue.h"
#include "llvm/Object/MachOFormat.h"
#include "llvm/Target/TargetRegistry.h"
using namespace llvm;
@@ -23,6 +24,11 @@ public:
PPCMachObjectWriter(bool Is64Bit, uint32_t CPUType,
uint32_t CPUSubtype)
: MCMachObjectTargetWriter(Is64Bit, CPUType, CPUSubtype) {}
+
+ void RecordRelocation(MachObjectWriter *Writer,
+ const MCAssembler &Asm, const MCAsmLayout &Layout,
+ const MCFragment *Fragment, const MCFixup &Fixup,
+ MCValue Target, uint64_t &FixedValue) {}
};
class PPCAsmBackend : public TargetAsmBackend {
diff --git a/contrib/llvm/lib/Target/PowerPC/PPCAsmPrinter.cpp b/contrib/llvm/lib/Target/PowerPC/PPCAsmPrinter.cpp
index b795db9..9de2200 100644
--- a/contrib/llvm/lib/Target/PowerPC/PPCAsmPrinter.cpp
+++ b/contrib/llvm/lib/Target/PowerPC/PPCAsmPrinter.cpp
@@ -680,10 +680,9 @@ static AsmPrinter *createPPCAsmPrinterPass(TargetMachine &tm,
}
static MCInstPrinter *createPPCMCInstPrinter(const Target &T,
- TargetMachine &TM,
unsigned SyntaxVariant,
const MCAsmInfo &MAI) {
- return new PPCInstPrinter(TM, MAI, SyntaxVariant);
+ return new PPCInstPrinter(MAI, SyntaxVariant);
}
diff --git a/contrib/llvm/lib/Target/PowerPC/PPCHazardRecognizers.cpp b/contrib/llvm/lib/Target/PowerPC/PPCHazardRecognizers.cpp
index 74ecff5..cddc9d8 100644
--- a/contrib/llvm/lib/Target/PowerPC/PPCHazardRecognizers.cpp
+++ b/contrib/llvm/lib/Target/PowerPC/PPCHazardRecognizers.cpp
@@ -73,12 +73,12 @@ PPCHazardRecognizer970::GetInstrType(unsigned Opcode,
}
Opcode = ~Opcode;
- const TargetInstrDesc &TID = TII.get(Opcode);
+ const MCInstrDesc &MCID = TII.get(Opcode);
- isLoad = TID.mayLoad();
- isStore = TID.mayStore();
+ isLoad = MCID.mayLoad();
+ isStore = MCID.mayStore();
- uint64_t TSFlags = TID.TSFlags;
+ uint64_t TSFlags = MCID.TSFlags;
isFirst = TSFlags & PPCII::PPC970_First;
isSingle = TSFlags & PPCII::PPC970_Single;
diff --git a/contrib/llvm/lib/Target/PowerPC/PPCISelDAGToDAG.cpp b/contrib/llvm/lib/Target/PowerPC/PPCISelDAGToDAG.cpp
index 511bb22..2176c02 100644
--- a/contrib/llvm/lib/Target/PowerPC/PPCISelDAGToDAG.cpp
+++ b/contrib/llvm/lib/Target/PowerPC/PPCISelDAGToDAG.cpp
@@ -610,6 +610,9 @@ SDNode *PPCDAGToDAGISel::SelectSETCC(SDNode *N) {
DebugLoc dl = N->getDebugLoc();
unsigned Imm;
ISD::CondCode CC = cast<CondCodeSDNode>(N->getOperand(2))->get();
+ EVT PtrVT = CurDAG->getTargetLoweringInfo().getPointerTy();
+ bool isPPC64 = (PtrVT == MVT::i64);
+
if (isInt32Immediate(N->getOperand(1), Imm)) {
// We can codegen setcc op, imm very efficiently compared to a brcond.
// Check for those cases here.
@@ -624,6 +627,7 @@ SDNode *PPCDAGToDAGISel::SelectSETCC(SDNode *N) {
return CurDAG->SelectNodeTo(N, PPC::RLWINM, MVT::i32, Ops, 4);
}
case ISD::SETNE: {
+ if (isPPC64) break;
SDValue AD =
SDValue(CurDAG->getMachineNode(PPC::ADDIC, dl, MVT::i32, MVT::Glue,
Op, getI32Imm(~0U)), 0);
@@ -647,6 +651,7 @@ SDNode *PPCDAGToDAGISel::SelectSETCC(SDNode *N) {
switch (CC) {
default: break;
case ISD::SETEQ:
+ if (isPPC64) break;
Op = SDValue(CurDAG->getMachineNode(PPC::ADDIC, dl, MVT::i32, MVT::Glue,
Op, getI32Imm(1)), 0);
return CurDAG->SelectNodeTo(N, PPC::ADDZE, MVT::i32,
@@ -655,6 +660,7 @@ SDNode *PPCDAGToDAGISel::SelectSETCC(SDNode *N) {
getI32Imm(0)), 0),
Op.getValue(1));
case ISD::SETNE: {
+ if (isPPC64) break;
Op = SDValue(CurDAG->getMachineNode(PPC::NOR, dl, MVT::i32, Op, Op), 0);
SDNode *AD = CurDAG->getMachineNode(PPC::ADDIC, dl, MVT::i32, MVT::Glue,
Op, getI32Imm(~0U));
@@ -996,22 +1002,25 @@ SDNode *PPCDAGToDAGISel::Select(SDNode *N) {
}
case ISD::SELECT_CC: {
ISD::CondCode CC = cast<CondCodeSDNode>(N->getOperand(4))->get();
+ EVT PtrVT = CurDAG->getTargetLoweringInfo().getPointerTy();
+ bool isPPC64 = (PtrVT == MVT::i64);
// Handle the setcc cases here. select_cc lhs, 0, 1, 0, cc
- if (ConstantSDNode *N1C = dyn_cast<ConstantSDNode>(N->getOperand(1)))
- if (ConstantSDNode *N2C = dyn_cast<ConstantSDNode>(N->getOperand(2)))
- if (ConstantSDNode *N3C = dyn_cast<ConstantSDNode>(N->getOperand(3)))
- if (N1C->isNullValue() && N3C->isNullValue() &&
- N2C->getZExtValue() == 1ULL && CC == ISD::SETNE &&
- // FIXME: Implement this optzn for PPC64.
- N->getValueType(0) == MVT::i32) {
- SDNode *Tmp =
- CurDAG->getMachineNode(PPC::ADDIC, dl, MVT::i32, MVT::Glue,
- N->getOperand(0), getI32Imm(~0U));
- return CurDAG->SelectNodeTo(N, PPC::SUBFE, MVT::i32,
- SDValue(Tmp, 0), N->getOperand(0),
- SDValue(Tmp, 1));
- }
+ if (!isPPC64)
+ if (ConstantSDNode *N1C = dyn_cast<ConstantSDNode>(N->getOperand(1)))
+ if (ConstantSDNode *N2C = dyn_cast<ConstantSDNode>(N->getOperand(2)))
+ if (ConstantSDNode *N3C = dyn_cast<ConstantSDNode>(N->getOperand(3)))
+ if (N1C->isNullValue() && N3C->isNullValue() &&
+ N2C->getZExtValue() == 1ULL && CC == ISD::SETNE &&
+ // FIXME: Implement this optzn for PPC64.
+ N->getValueType(0) == MVT::i32) {
+ SDNode *Tmp =
+ CurDAG->getMachineNode(PPC::ADDIC, dl, MVT::i32, MVT::Glue,
+ N->getOperand(0), getI32Imm(~0U));
+ return CurDAG->SelectNodeTo(N, PPC::SUBFE, MVT::i32,
+ SDValue(Tmp, 0), N->getOperand(0),
+ SDValue(Tmp, 1));
+ }
SDValue CCReg = SelectCC(N->getOperand(0), N->getOperand(1), CC, dl);
unsigned BROpc = getPredicateForSetCC(CC);
diff --git a/contrib/llvm/lib/Target/PowerPC/PPCISelLowering.cpp b/contrib/llvm/lib/Target/PowerPC/PPCISelLowering.cpp
index dbb184c..9741a39 100644
--- a/contrib/llvm/lib/Target/PowerPC/PPCISelLowering.cpp
+++ b/contrib/llvm/lib/Target/PowerPC/PPCISelLowering.cpp
@@ -125,10 +125,12 @@ PPCTargetLowering::PPCTargetLowering(PPCTargetMachine &TM)
setOperationAction(ISD::FCOS , MVT::f64, Expand);
setOperationAction(ISD::FREM , MVT::f64, Expand);
setOperationAction(ISD::FPOW , MVT::f64, Expand);
+ setOperationAction(ISD::FMA , MVT::f64, Expand);
setOperationAction(ISD::FSIN , MVT::f32, Expand);
setOperationAction(ISD::FCOS , MVT::f32, Expand);
setOperationAction(ISD::FREM , MVT::f32, Expand);
setOperationAction(ISD::FPOW , MVT::f32, Expand);
+ setOperationAction(ISD::FMA , MVT::f32, Expand);
setOperationAction(ISD::FLT_ROUNDS_, MVT::i32, Custom);
@@ -215,10 +217,11 @@ PPCTargetLowering::PPCTargetLowering(PPCTargetMachine &TM)
setOperationAction(ISD::VASTART , MVT::Other, Custom);
// VAARG is custom lowered with the 32-bit SVR4 ABI.
- if ( TM.getSubtarget<PPCSubtarget>().isSVR4ABI()
- && !TM.getSubtarget<PPCSubtarget>().isPPC64())
+ if (TM.getSubtarget<PPCSubtarget>().isSVR4ABI()
+ && !TM.getSubtarget<PPCSubtarget>().isPPC64()) {
setOperationAction(ISD::VAARG, MVT::Other, Custom);
- else
+ setOperationAction(ISD::VAARG, MVT::i64, Custom);
+ } else
setOperationAction(ISD::VAARG, MVT::Other, Expand);
// Use the default implementation.
@@ -1262,9 +1265,107 @@ SDValue PPCTargetLowering::LowerSETCC(SDValue Op, SelectionDAG &DAG) const {
SDValue PPCTargetLowering::LowerVAARG(SDValue Op, SelectionDAG &DAG,
const PPCSubtarget &Subtarget) const {
+ SDNode *Node = Op.getNode();
+ EVT VT = Node->getValueType(0);
+ EVT PtrVT = DAG.getTargetLoweringInfo().getPointerTy();
+ SDValue InChain = Node->getOperand(0);
+ SDValue VAListPtr = Node->getOperand(1);
+ const Value *SV = cast<SrcValueSDNode>(Node->getOperand(2))->getValue();
+ DebugLoc dl = Node->getDebugLoc();
+
+ assert(!Subtarget.isPPC64() && "LowerVAARG is PPC32 only");
+
+ // gpr_index
+ SDValue GprIndex = DAG.getExtLoad(ISD::ZEXTLOAD, dl, MVT::i32, InChain,
+ VAListPtr, MachinePointerInfo(SV), MVT::i8,
+ false, false, 0);
+ InChain = GprIndex.getValue(1);
+
+ if (VT == MVT::i64) {
+ // Check if GprIndex is even
+ SDValue GprAnd = DAG.getNode(ISD::AND, dl, MVT::i32, GprIndex,
+ DAG.getConstant(1, MVT::i32));
+ SDValue CC64 = DAG.getSetCC(dl, MVT::i32, GprAnd,
+ DAG.getConstant(0, MVT::i32), ISD::SETNE);
+ SDValue GprIndexPlusOne = DAG.getNode(ISD::ADD, dl, MVT::i32, GprIndex,
+ DAG.getConstant(1, MVT::i32));
+ // Align GprIndex to be even if it isn't
+ GprIndex = DAG.getNode(ISD::SELECT, dl, MVT::i32, CC64, GprIndexPlusOne,
+ GprIndex);
+ }
+
+ // fpr index is 1 byte after gpr
+ SDValue FprPtr = DAG.getNode(ISD::ADD, dl, PtrVT, VAListPtr,
+ DAG.getConstant(1, MVT::i32));
+
+ // fpr
+ SDValue FprIndex = DAG.getExtLoad(ISD::ZEXTLOAD, dl, MVT::i32, InChain,
+ FprPtr, MachinePointerInfo(SV), MVT::i8,
+ false, false, 0);
+ InChain = FprIndex.getValue(1);
+
+ SDValue RegSaveAreaPtr = DAG.getNode(ISD::ADD, dl, PtrVT, VAListPtr,
+ DAG.getConstant(8, MVT::i32));
+
+ SDValue OverflowAreaPtr = DAG.getNode(ISD::ADD, dl, PtrVT, VAListPtr,
+ DAG.getConstant(4, MVT::i32));
- llvm_unreachable("VAARG not yet implemented for the SVR4 ABI!");
- return SDValue(); // Not reached
+ // areas
+ SDValue OverflowArea = DAG.getLoad(MVT::i32, dl, InChain, OverflowAreaPtr,
+ MachinePointerInfo(), false, false, 0);
+ InChain = OverflowArea.getValue(1);
+
+ SDValue RegSaveArea = DAG.getLoad(MVT::i32, dl, InChain, RegSaveAreaPtr,
+ MachinePointerInfo(), false, false, 0);
+ InChain = RegSaveArea.getValue(1);
+
+ // select overflow_area if index > 8
+ SDValue CC = DAG.getSetCC(dl, MVT::i32, VT.isInteger() ? GprIndex : FprIndex,
+ DAG.getConstant(8, MVT::i32), ISD::SETLT);
+
+ // adjustment constant gpr_index * 4/8
+ SDValue RegConstant = DAG.getNode(ISD::MUL, dl, MVT::i32,
+ VT.isInteger() ? GprIndex : FprIndex,
+ DAG.getConstant(VT.isInteger() ? 4 : 8,
+ MVT::i32));
+
+ // OurReg = RegSaveArea + RegConstant
+ SDValue OurReg = DAG.getNode(ISD::ADD, dl, PtrVT, RegSaveArea,
+ RegConstant);
+
+ // Floating types are 32 bytes into RegSaveArea
+ if (VT.isFloatingPoint())
+ OurReg = DAG.getNode(ISD::ADD, dl, PtrVT, OurReg,
+ DAG.getConstant(32, MVT::i32));
+
+ // increase {f,g}pr_index by 1 (or 2 if VT is i64)
+ SDValue IndexPlus1 = DAG.getNode(ISD::ADD, dl, MVT::i32,
+ VT.isInteger() ? GprIndex : FprIndex,
+ DAG.getConstant(VT == MVT::i64 ? 2 : 1,
+ MVT::i32));
+
+ InChain = DAG.getTruncStore(InChain, dl, IndexPlus1,
+ VT.isInteger() ? VAListPtr : FprPtr,
+ MachinePointerInfo(SV),
+ MVT::i8, false, false, 0);
+
+ // determine if we should load from reg_save_area or overflow_area
+ SDValue Result = DAG.getNode(ISD::SELECT, dl, PtrVT, CC, OurReg, OverflowArea);
+
+ // increase overflow_area by 4/8 if gpr/fpr > 8
+ SDValue OverflowAreaPlusN = DAG.getNode(ISD::ADD, dl, PtrVT, OverflowArea,
+ DAG.getConstant(VT.isInteger() ? 4 : 8,
+ MVT::i32));
+
+ OverflowArea = DAG.getNode(ISD::SELECT, dl, MVT::i32, CC, OverflowArea,
+ OverflowAreaPlusN);
+
+ InChain = DAG.getTruncStore(InChain, dl, OverflowArea,
+ OverflowAreaPtr,
+ MachinePointerInfo(),
+ MVT::i32, false, false, 0);
+
+ return DAG.getLoad(VT, dl, InChain, Result, MachinePointerInfo(), false, false, 0);
}
SDValue PPCTargetLowering::LowerTRAMPOLINE(SDValue Op,
@@ -1870,7 +1971,11 @@ PPCTargetLowering::LowerFormalArguments_Darwin(
InVals.push_back(FIN);
if (ObjSize==1 || ObjSize==2) {
if (GPR_idx != Num_GPR_Regs) {
- unsigned VReg = MF.addLiveIn(GPR[GPR_idx], &PPC::GPRCRegClass);
+ unsigned VReg;
+ if (isPPC64)
+ VReg = MF.addLiveIn(GPR[GPR_idx], &PPC::G8RCRegClass);
+ else
+ VReg = MF.addLiveIn(GPR[GPR_idx], &PPC::GPRCRegClass);
SDValue Val = DAG.getCopyFromReg(Chain, dl, VReg, PtrVT);
SDValue Store = DAG.getTruncStore(Val.getValue(1), dl, Val, FIN,
MachinePointerInfo(),
@@ -1889,7 +1994,11 @@ PPCTargetLowering::LowerFormalArguments_Darwin(
// to memory. ArgVal will be address of the beginning of
// the object.
if (GPR_idx != Num_GPR_Regs) {
- unsigned VReg = MF.addLiveIn(GPR[GPR_idx], &PPC::GPRCRegClass);
+ unsigned VReg;
+ if (isPPC64)
+ VReg = MF.addLiveIn(GPR[GPR_idx], &PPC::G8RCRegClass);
+ else
+ VReg = MF.addLiveIn(GPR[GPR_idx], &PPC::GPRCRegClass);
int FI = MFI->CreateFixedObject(PtrByteSize, ArgOffset, true);
SDValue FIN = DAG.getFrameIndex(FI, PtrVT);
SDValue Val = DAG.getCopyFromReg(Chain, dl, VReg, PtrVT);
@@ -2902,6 +3011,12 @@ PPCTargetLowering::LowerCall_SVR4(SDValue Chain, SDValue Callee,
Chain = DAG.getNode(ISD::TokenFactor, dl, MVT::Other,
&MemOpChains[0], MemOpChains.size());
+ // Set CR6 to true if this is a vararg call.
+ if (isVarArg) {
+ SDValue SetCR(DAG.getMachineNode(PPC::CRSET, dl, MVT::i32), 0);
+ RegsToPass.push_back(std::make_pair(unsigned(PPC::CR1EQ), SetCR));
+ }
+
// Build a sequence of copy-to-reg nodes chained together with token chain
// and flag operands which copy the outgoing args into the appropriate regs.
SDValue InFlag;
@@ -2911,13 +3026,6 @@ PPCTargetLowering::LowerCall_SVR4(SDValue Chain, SDValue Callee,
InFlag = Chain.getValue(1);
}
- // Set CR6 to true if this is a vararg call.
- if (isVarArg) {
- SDValue SetCR(DAG.getMachineNode(PPC::CRSET, dl, MVT::i32), 0);
- Chain = DAG.getCopyToReg(Chain, dl, PPC::CR1EQ, SetCR, InFlag);
- InFlag = Chain.getValue(1);
- }
-
if (isTailCall)
PrepareTailCall(DAG, InFlag, Chain, dl, false, SPDiff, NumBytes, LROp, FPOp,
false, TailCallArguments);
@@ -4422,11 +4530,27 @@ SDValue PPCTargetLowering::LowerOperation(SDValue Op, SelectionDAG &DAG) const {
void PPCTargetLowering::ReplaceNodeResults(SDNode *N,
SmallVectorImpl<SDValue>&Results,
SelectionDAG &DAG) const {
+ const TargetMachine &TM = getTargetMachine();
DebugLoc dl = N->getDebugLoc();
switch (N->getOpcode()) {
default:
assert(false && "Do not know how to custom type legalize this operation!");
return;
+ case ISD::VAARG: {
+ if (!TM.getSubtarget<PPCSubtarget>().isSVR4ABI()
+ || TM.getSubtarget<PPCSubtarget>().isPPC64())
+ return;
+
+ EVT VT = N->getValueType(0);
+
+ if (VT == MVT::i64) {
+ SDValue NewNode = LowerVAARG(SDValue(N, 1), DAG, PPCSubTarget);
+
+ Results.push_back(NewNode);
+ Results.push_back(NewNode.getValue(1));
+ }
+ return;
+ }
case ISD::FP_ROUND_INREG: {
assert(N->getValueType(0) == MVT::ppcf128);
assert(N->getOperand(0).getValueType() == MVT::ppcf128);
@@ -4676,7 +4800,7 @@ PPCTargetLowering::EmitPartwordAtomicBinary(MachineInstr *MI,
.addReg(TmpReg).addReg(MaskReg);
BuildMI(BB, dl, TII->get(is64bit ? PPC::OR8 : PPC::OR), Tmp4Reg)
.addReg(Tmp3Reg).addReg(Tmp2Reg);
- BuildMI(BB, dl, TII->get(PPC::STWCX))
+ BuildMI(BB, dl, TII->get(is64bit ? PPC::STDCX : PPC::STWCX))
.addReg(Tmp4Reg).addReg(ZeroReg).addReg(PtrReg);
BuildMI(BB, dl, TII->get(PPC::BCC))
.addImm(PPC::PRED_NE).addReg(PPC::CR0).addMBB(loopMBB);
diff --git a/contrib/llvm/lib/Target/PowerPC/PPCInstrInfo.cpp b/contrib/llvm/lib/Target/PowerPC/PPCInstrInfo.cpp
index 53b0491..143444f 100644
--- a/contrib/llvm/lib/Target/PowerPC/PPCInstrInfo.cpp
+++ b/contrib/llvm/lib/Target/PowerPC/PPCInstrInfo.cpp
@@ -12,22 +12,26 @@
//===----------------------------------------------------------------------===//
#include "PPCInstrInfo.h"
+#include "PPC.h"
#include "PPCInstrBuilder.h"
#include "PPCMachineFunctionInfo.h"
#include "PPCPredicates.h"
-#include "PPCGenInstrInfo.inc"
#include "PPCTargetMachine.h"
#include "PPCHazardRecognizers.h"
-#include "llvm/ADT/STLExtras.h"
#include "llvm/CodeGen/MachineFrameInfo.h"
#include "llvm/CodeGen/MachineInstrBuilder.h"
#include "llvm/CodeGen/MachineMemOperand.h"
#include "llvm/CodeGen/MachineRegisterInfo.h"
#include "llvm/CodeGen/PseudoSourceValue.h"
+#include "llvm/MC/MCAsmInfo.h"
+#include "llvm/Target/TargetRegistry.h"
#include "llvm/Support/CommandLine.h"
#include "llvm/Support/ErrorHandling.h"
#include "llvm/Support/raw_ostream.h"
-#include "llvm/MC/MCAsmInfo.h"
+#include "llvm/ADT/STLExtras.h"
+
+#define GET_INSTRINFO_CTOR
+#include "PPCGenInstrInfo.inc"
namespace llvm {
extern cl::opt<bool> EnablePPC32RS; // FIXME (64-bit): See PPCRegisterInfo.cpp.
@@ -37,8 +41,8 @@ extern cl::opt<bool> EnablePPC64RS; // FIXME (64-bit): See PPCRegisterInfo.cpp.
using namespace llvm;
PPCInstrInfo::PPCInstrInfo(PPCTargetMachine &tm)
- : TargetInstrInfoImpl(PPCInsts, array_lengthof(PPCInsts)), TM(tm),
- RI(*TM.getSubtargetImpl(), *this) {}
+ : PPCGenInstrInfo(PPC::ADJCALLSTACKDOWN, PPC::ADJCALLSTACKUP),
+ TM(tm), RI(*TM.getSubtargetImpl(), *this) {}
/// CreateTargetHazardRecognizer - Return the hazard recognizer to use for
/// this target when scheduling the DAG.
@@ -120,7 +124,7 @@ PPCInstrInfo::commuteInstruction(MachineInstr *MI, bool NewMI) const {
// destination register as well.
if (Reg0 == Reg1) {
// Must be two address instruction!
- assert(MI->getDesc().getOperandConstraint(0, TOI::TIED_TO) &&
+ assert(MI->getDesc().getOperandConstraint(0, MCOI::TIED_TO) &&
"Expecting a two-address instruction!");
Reg2IsKill = false;
ChangeReg0 = true;
@@ -315,12 +319,12 @@ void PPCInstrInfo::copyPhysReg(MachineBasicBlock &MBB,
else
llvm_unreachable("Impossible reg-to-reg copy");
- const TargetInstrDesc &TID = get(Opc);
- if (TID.getNumOperands() == 3)
- BuildMI(MBB, I, DL, TID, DestReg)
+ const MCInstrDesc &MCID = get(Opc);
+ if (MCID.getNumOperands() == 3)
+ BuildMI(MBB, I, DL, MCID, DestReg)
.addReg(SrcReg).addReg(SrcReg, getKillRegState(KillSrc));
else
- BuildMI(MBB, I, DL, TID, DestReg).addReg(SrcReg, getKillRegState(KillSrc));
+ BuildMI(MBB, I, DL, MCID, DestReg).addReg(SrcReg, getKillRegState(KillSrc));
}
bool
diff --git a/contrib/llvm/lib/Target/PowerPC/PPCInstrInfo.h b/contrib/llvm/lib/Target/PowerPC/PPCInstrInfo.h
index b5249ae..90bacc9 100644
--- a/contrib/llvm/lib/Target/PowerPC/PPCInstrInfo.h
+++ b/contrib/llvm/lib/Target/PowerPC/PPCInstrInfo.h
@@ -18,6 +18,9 @@
#include "llvm/Target/TargetInstrInfo.h"
#include "PPCRegisterInfo.h"
+#define GET_INSTRINFO_HEADER
+#include "PPCGenInstrInfo.inc"
+
namespace llvm {
/// PPCII - This namespace holds all of the PowerPC target-specific
@@ -61,7 +64,7 @@ enum PPC970_Unit {
} // end namespace PPCII
-class PPCInstrInfo : public TargetInstrInfoImpl {
+class PPCInstrInfo : public PPCGenInstrInfo {
PPCTargetMachine &TM;
const PPCRegisterInfo RI;
diff --git a/contrib/llvm/lib/Target/PowerPC/PPCJITInfo.cpp b/contrib/llvm/lib/Target/PowerPC/PPCJITInfo.cpp
index 78383e0..4590f00 100644
--- a/contrib/llvm/lib/Target/PowerPC/PPCJITInfo.cpp
+++ b/contrib/llvm/lib/Target/PowerPC/PPCJITInfo.cpp
@@ -87,7 +87,7 @@ asm(
// FIXME: could shrink frame
// Set up a proper stack frame
// FIXME Layout
- // PowerPC64 ABI linkage - 24 bytes
+ // PowerPC32 ABI linkage - 24 bytes
// parameters - 32 bytes
// 13 double registers - 104 bytes
// 8 int registers - 32 bytes
@@ -205,11 +205,27 @@ void PPC32CompilationCallback() {
#if (defined(__POWERPC__) || defined (__ppc__) || defined(_POWER)) && \
defined(__ppc64__)
+#ifdef __ELF__
+asm(
+ ".text\n"
+ ".align 2\n"
+ ".globl PPC64CompilationCallback\n"
+ ".section \".opd\",\"aw\"\n"
+ ".align 3\n"
+"PPC64CompilationCallback:\n"
+ ".quad .L.PPC64CompilationCallback,.TOC.@tocbase,0\n"
+ ".size PPC64CompilationCallback,24\n"
+ ".previous\n"
+ ".align 4\n"
+ ".type PPC64CompilationCallback,@function\n"
+".L.PPC64CompilationCallback:\n"
+#else
asm(
".text\n"
".align 2\n"
".globl _PPC64CompilationCallback\n"
"_PPC64CompilationCallback:\n"
+#endif
// Make space for 8 ints r[3-10] and 13 doubles f[1-13] and the
// FIXME: need to save v[0-19] for altivec?
// Set up a proper stack frame
@@ -218,49 +234,55 @@ asm(
// parameters - 64 bytes
// 13 double registers - 104 bytes
// 8 int registers - 64 bytes
- "mflr r0\n"
- "std r0, 16(r1)\n"
- "stdu r1, -280(r1)\n"
+ "mflr 0\n"
+ "std 0, 16(1)\n"
+ "stdu 1, -280(1)\n"
// Save all int arg registers
- "std r10, 272(r1)\n" "std r9, 264(r1)\n"
- "std r8, 256(r1)\n" "std r7, 248(r1)\n"
- "std r6, 240(r1)\n" "std r5, 232(r1)\n"
- "std r4, 224(r1)\n" "std r3, 216(r1)\n"
+ "std 10, 272(1)\n" "std 9, 264(1)\n"
+ "std 8, 256(1)\n" "std 7, 248(1)\n"
+ "std 6, 240(1)\n" "std 5, 232(1)\n"
+ "std 4, 224(1)\n" "std 3, 216(1)\n"
// Save all call-clobbered FP regs.
- "stfd f13, 208(r1)\n" "stfd f12, 200(r1)\n"
- "stfd f11, 192(r1)\n" "stfd f10, 184(r1)\n"
- "stfd f9, 176(r1)\n" "stfd f8, 168(r1)\n"
- "stfd f7, 160(r1)\n" "stfd f6, 152(r1)\n"
- "stfd f5, 144(r1)\n" "stfd f4, 136(r1)\n"
- "stfd f3, 128(r1)\n" "stfd f2, 120(r1)\n"
- "stfd f1, 112(r1)\n"
+ "stfd 13, 208(1)\n" "stfd 12, 200(1)\n"
+ "stfd 11, 192(1)\n" "stfd 10, 184(1)\n"
+ "stfd 9, 176(1)\n" "stfd 8, 168(1)\n"
+ "stfd 7, 160(1)\n" "stfd 6, 152(1)\n"
+ "stfd 5, 144(1)\n" "stfd 4, 136(1)\n"
+ "stfd 3, 128(1)\n" "stfd 2, 120(1)\n"
+ "stfd 1, 112(1)\n"
// Arguments to Compilation Callback:
// r3 - our lr (address of the call instruction in stub plus 4)
// r4 - stub's lr (address of instruction that called the stub plus 4)
// r5 - is64Bit - always 1.
- "mr r3, r0\n"
- "ld r2, 280(r1)\n" // stub's frame
- "ld r4, 16(r2)\n" // stub's lr
- "li r5, 1\n" // 1 == 64 bit
+ "mr 3, 0\n" // return address (still in r0)
+ "ld 5, 280(1)\n" // stub's frame
+ "ld 4, 16(5)\n" // stub's lr
+ "li 5, 1\n" // 1 == 64 bit
+#ifdef __ELF__
+ "bl PPCCompilationCallbackC\n"
+ "nop\n"
+#else
"bl _PPCCompilationCallbackC\n"
- "mtctr r3\n"
+#endif
+ "mtctr 3\n"
// Restore all int arg registers
- "ld r10, 272(r1)\n" "ld r9, 264(r1)\n"
- "ld r8, 256(r1)\n" "ld r7, 248(r1)\n"
- "ld r6, 240(r1)\n" "ld r5, 232(r1)\n"
- "ld r4, 224(r1)\n" "ld r3, 216(r1)\n"
+ "ld 10, 272(1)\n" "ld 9, 264(1)\n"
+ "ld 8, 256(1)\n" "ld 7, 248(1)\n"
+ "ld 6, 240(1)\n" "ld 5, 232(1)\n"
+ "ld 4, 224(1)\n" "ld 3, 216(1)\n"
// Restore all FP arg registers
- "lfd f13, 208(r1)\n" "lfd f12, 200(r1)\n"
- "lfd f11, 192(r1)\n" "lfd f10, 184(r1)\n"
- "lfd f9, 176(r1)\n" "lfd f8, 168(r1)\n"
- "lfd f7, 160(r1)\n" "lfd f6, 152(r1)\n"
- "lfd f5, 144(r1)\n" "lfd f4, 136(r1)\n"
- "lfd f3, 128(r1)\n" "lfd f2, 120(r1)\n"
- "lfd f1, 112(r1)\n"
+ "lfd 13, 208(1)\n" "lfd 12, 200(1)\n"
+ "lfd 11, 192(1)\n" "lfd 10, 184(1)\n"
+ "lfd 9, 176(1)\n" "lfd 8, 168(1)\n"
+ "lfd 7, 160(1)\n" "lfd 6, 152(1)\n"
+ "lfd 5, 144(1)\n" "lfd 4, 136(1)\n"
+ "lfd 3, 128(1)\n" "lfd 2, 120(1)\n"
+ "lfd 1, 112(1)\n"
// Pop 3 frames off the stack and branch to target
- "ld r1, 280(r1)\n"
- "ld r2, 16(r1)\n"
- "mtlr r2\n"
+ "ld 1, 280(1)\n"
+ "ld 0, 16(1)\n"
+ "mtlr 0\n"
+ // XXX: any special TOC handling in the ELF case for JIT?
"bctr\n"
);
#else
diff --git a/contrib/llvm/lib/Target/PowerPC/PPCMCCodeEmitter.cpp b/contrib/llvm/lib/Target/PowerPC/PPCMCCodeEmitter.cpp
index 65c2c82..cf73d86 100644
--- a/contrib/llvm/lib/Target/PowerPC/PPCMCCodeEmitter.cpp
+++ b/contrib/llvm/lib/Target/PowerPC/PPCMCCodeEmitter.cpp
@@ -28,12 +28,10 @@ namespace {
class PPCMCCodeEmitter : public MCCodeEmitter {
PPCMCCodeEmitter(const PPCMCCodeEmitter &); // DO NOT IMPLEMENT
void operator=(const PPCMCCodeEmitter &); // DO NOT IMPLEMENT
- const TargetMachine &TM;
- MCContext &Ctx;
public:
- PPCMCCodeEmitter(TargetMachine &tm, MCContext &ctx)
- : TM(tm), Ctx(ctx) {
+ PPCMCCodeEmitter(const MCInstrInfo &mcii, const MCSubtargetInfo &sti,
+ MCContext &ctx) {
}
~PPCMCCodeEmitter() {}
@@ -79,9 +77,10 @@ public:
} // end anonymous namespace
-MCCodeEmitter *llvm::createPPCMCCodeEmitter(const Target &, TargetMachine &TM,
+MCCodeEmitter *llvm::createPPCMCCodeEmitter(const MCInstrInfo &MCII,
+ const MCSubtargetInfo &STI,
MCContext &Ctx) {
- return new PPCMCCodeEmitter(TM, Ctx);
+ return new PPCMCCodeEmitter(MCII, STI, Ctx);
}
unsigned PPCMCCodeEmitter::
diff --git a/contrib/llvm/lib/Target/PowerPC/PPCRegisterInfo.cpp b/contrib/llvm/lib/Target/PowerPC/PPCRegisterInfo.cpp
index 3374e9b..9c2428b 100644
--- a/contrib/llvm/lib/Target/PowerPC/PPCRegisterInfo.cpp
+++ b/contrib/llvm/lib/Target/PowerPC/PPCRegisterInfo.cpp
@@ -44,6 +44,9 @@
#include "llvm/ADT/STLExtras.h"
#include <cstdlib>
+#define GET_REGINFO_TARGET_DESC
+#include "PPCGenRegisterInfo.inc"
+
// FIXME (64-bit): Eventually enable by default.
namespace llvm {
cl::opt<bool> EnablePPC32RS("enable-ppc32-regscavenger",
@@ -110,8 +113,7 @@ unsigned PPCRegisterInfo::getRegisterNumbering(unsigned RegEnum) {
PPCRegisterInfo::PPCRegisterInfo(const PPCSubtarget &ST,
const TargetInstrInfo &tii)
- : PPCGenRegisterInfo(PPC::ADJCALLSTACKDOWN, PPC::ADJCALLSTACKUP),
- Subtarget(ST), TII(tii) {
+ : PPCGenRegisterInfo(), Subtarget(ST), TII(tii) {
ImmToIdxMap[PPC::LD] = PPC::LDX; ImmToIdxMap[PPC::STD] = PPC::STDX;
ImmToIdxMap[PPC::LBZ] = PPC::LBZX; ImmToIdxMap[PPC::STB] = PPC::STBX;
ImmToIdxMap[PPC::LHZ] = PPC::LHZX; ImmToIdxMap[PPC::LHA] = PPC::LHAX;
@@ -504,6 +506,7 @@ void PPCRegisterInfo::lowerCRSpilling(MachineBasicBlock::iterator II,
const TargetRegisterClass *RC = Subtarget.isPPC64() ? G8RC : GPRC;
unsigned Reg = findScratchRegister(II, RS, RC, SPAdj);
unsigned SrcReg = MI.getOperand(0).getReg();
+ bool LP64 = Subtarget.isPPC64();
// We need to store the CR in the low 4-bits of the saved value. First, issue
// an MFCRpsued to save all of the CRBits and, if needed, kill the SrcReg.
@@ -520,7 +523,7 @@ void PPCRegisterInfo::lowerCRSpilling(MachineBasicBlock::iterator II,
.addImm(0)
.addImm(31);
- addFrameReference(BuildMI(MBB, II, dl, TII.get(PPC::STW))
+ addFrameReference(BuildMI(MBB, II, dl, TII.get(LP64 ? PPC::STW8 : PPC::STW))
.addReg(Reg, getKillRegState(MI.getOperand(1).getImm())),
FrameIndex);
@@ -709,5 +712,3 @@ int PPCRegisterInfo::getLLVMRegNum(unsigned RegNum, bool isEH) const {
return PPCGenRegisterInfo::getLLVMRegNumFull(RegNum, Flavour);
}
-
-#include "PPCGenRegisterInfo.inc"
diff --git a/contrib/llvm/lib/Target/PowerPC/PPCRegisterInfo.h b/contrib/llvm/lib/Target/PowerPC/PPCRegisterInfo.h
index 48c2562..33fe5eb 100644
--- a/contrib/llvm/lib/Target/PowerPC/PPCRegisterInfo.h
+++ b/contrib/llvm/lib/Target/PowerPC/PPCRegisterInfo.h
@@ -16,9 +16,11 @@
#define POWERPC32_REGISTERINFO_H
#include "PPC.h"
-#include "PPCGenRegisterInfo.h.inc"
#include <map>
+#define GET_REGINFO_HEADER
+#include "PPCGenRegisterInfo.inc"
+
namespace llvm {
class PPCSubtarget;
class TargetInstrInfo;
diff --git a/contrib/llvm/lib/Target/PowerPC/PPCRegisterInfo.td b/contrib/llvm/lib/Target/PowerPC/PPCRegisterInfo.td
index 3c01901..1acdf4e 100644
--- a/contrib/llvm/lib/Target/PowerPC/PPCRegisterInfo.td
+++ b/contrib/llvm/lib/Target/PowerPC/PPCRegisterInfo.td
@@ -276,15 +276,13 @@ def RM: SPR<512, "**ROUNDING MODE**">;
/// Register classes
// Allocate volatiles first
// then nonvolatiles in reverse order since stmw/lmw save from rN to r31
-def GPRC : RegisterClass<"PPC", [i32], 32,
- [R2, R3, R4, R5, R6, R7, R8, R9, R10, R11, R12,
- R30, R29, R28, R27, R26, R25, R24, R23, R22, R21, R20, R19, R18, R17,
- R16, R15, R14, R13, R31, R0, R1, LR]>;
+def GPRC : RegisterClass<"PPC", [i32], 32, (add (sequence "R%u", 2, 12),
+ (sequence "R%u", 30, 13),
+ R31, R0, R1, LR)>;
-def G8RC : RegisterClass<"PPC", [i64], 64,
- [X2, X3, X4, X5, X6, X7, X8, X9, X10, X11, X12,
- X30, X29, X28, X27, X26, X25, X24, X23, X22, X21, X20, X19, X18, X17,
- X16, X15, X14, X31, X13, X0, X1, LR8]>;
+def G8RC : RegisterClass<"PPC", [i64], 64, (add (sequence "X%u", 2, 12),
+ (sequence "X%u", 30, 14),
+ X31, X13, X0, X1, LR8)>;
// Allocate volatiles first, then non-volatiles in reverse order. With the SVR4
// ABI the size of the Floating-point register save area is determined by the
@@ -293,41 +291,36 @@ def G8RC : RegisterClass<"PPC", [i64], 64,
// previous stack frame. By allocating non-volatiles in reverse order we make
// sure that the Floating-point register save area is always as small as
// possible because there aren't any unused spill slots.
-def F8RC : RegisterClass<"PPC", [f64], 64, [F0, F1, F2, F3, F4, F5, F6, F7,
- F8, F9, F10, F11, F12, F13, F31, F30, F29, F28, F27, F26, F25, F24, F23,
- F22, F21, F20, F19, F18, F17, F16, F15, F14]>;
-def F4RC : RegisterClass<"PPC", [f32], 32, [F0, F1, F2, F3, F4, F5, F6, F7,
- F8, F9, F10, F11, F12, F13, F31, F30, F29, F28, F27, F26, F25, F24, F23,
- F22, F21, F20, F19, F18, F17, F16, F15, F14]>;
+def F8RC : RegisterClass<"PPC", [f64], 64, (add (sequence "F%u", 0, 13),
+ (sequence "F%u", 31, 14))>;
+def F4RC : RegisterClass<"PPC", [f32], 32, (add F8RC)>;
def VRRC : RegisterClass<"PPC", [v16i8,v8i16,v4i32,v4f32], 128,
- [V2, V3, V4, V5, V0, V1,
- V6, V7, V8, V9, V10, V11, V12, V13, V14, V15, V16, V17, V18, V19, V31, V30,
- V29, V28, V27, V26, V25, V24, V23, V22, V21, V20]>;
+ (add V2, V3, V4, V5, V0, V1, V6, V7, V8, V9, V10, V11,
+ V12, V13, V14, V15, V16, V17, V18, V19, V31, V30,
+ V29, V28, V27, V26, V25, V24, V23, V22, V21, V20)>;
def CRBITRC : RegisterClass<"PPC", [i32], 32,
- [CR0LT, CR0GT, CR0EQ, CR0UN,
- CR1LT, CR1GT, CR1EQ, CR1UN,
- CR2LT, CR2GT, CR2EQ, CR2UN,
- CR3LT, CR3GT, CR3EQ, CR3UN,
- CR4LT, CR4GT, CR4EQ, CR4UN,
- CR5LT, CR5GT, CR5EQ, CR5UN,
- CR6LT, CR6GT, CR6EQ, CR6UN,
- CR7LT, CR7GT, CR7EQ, CR7UN
- ]>
+ (add CR0LT, CR0GT, CR0EQ, CR0UN,
+ CR1LT, CR1GT, CR1EQ, CR1UN,
+ CR2LT, CR2GT, CR2EQ, CR2UN,
+ CR3LT, CR3GT, CR3EQ, CR3UN,
+ CR4LT, CR4GT, CR4EQ, CR4UN,
+ CR5LT, CR5GT, CR5EQ, CR5UN,
+ CR6LT, CR6GT, CR6EQ, CR6UN,
+ CR7LT, CR7GT, CR7EQ, CR7UN)>
{
let CopyCost = -1;
}
-def CRRC : RegisterClass<"PPC", [i32], 32, [CR0, CR1, CR5, CR6, CR7, CR2,
- CR3, CR4]>
-{
+def CRRC : RegisterClass<"PPC", [i32], 32, (add CR0, CR1, CR5, CR6,
+ CR7, CR2, CR3, CR4)> {
let SubRegClasses = [(CRBITRC sub_lt, sub_gt, sub_eq, sub_un)];
}
-def CTRRC : RegisterClass<"PPC", [i32], 32, [CTR]>;
-def CTRRC8 : RegisterClass<"PPC", [i64], 64, [CTR8]>;
-def VRSAVERC : RegisterClass<"PPC", [i32], 32, [VRSAVE]>;
-def CARRYRC : RegisterClass<"PPC", [i32], 32, [CARRY]> {
+def CTRRC : RegisterClass<"PPC", [i32], 32, (add CTR)>;
+def CTRRC8 : RegisterClass<"PPC", [i64], 64, (add CTR8)>;
+def VRSAVERC : RegisterClass<"PPC", [i32], 32, (add VRSAVE)>;
+def CARRYRC : RegisterClass<"PPC", [i32], 32, (add CARRY)> {
let CopyCost = -1;
}
diff --git a/contrib/llvm/lib/Target/PowerPC/PPCSubtarget.cpp b/contrib/llvm/lib/Target/PowerPC/PPCSubtarget.cpp
index 5f3aa23..5ea9b0f 100644
--- a/contrib/llvm/lib/Target/PowerPC/PPCSubtarget.cpp
+++ b/contrib/llvm/lib/Target/PowerPC/PPCSubtarget.cpp
@@ -7,7 +7,7 @@
//
//===----------------------------------------------------------------------===//
//
-// This file implements the PPC specific subclass of TargetSubtarget.
+// This file implements the PPC specific subclass of TargetSubtargetInfo.
//
//===----------------------------------------------------------------------===//
@@ -15,8 +15,13 @@
#include "PPC.h"
#include "llvm/GlobalValue.h"
#include "llvm/Target/TargetMachine.h"
-#include "PPCGenSubtarget.inc"
+#include "llvm/Target/TargetRegistry.h"
#include <cstdlib>
+
+#define GET_SUBTARGETINFO_TARGET_DESC
+#define GET_SUBTARGETINFO_CTOR
+#include "PPCGenSubtargetInfo.inc"
+
using namespace llvm;
#if defined(__APPLE__)
@@ -57,9 +62,10 @@ static const char *GetCurrentPowerPCCPU() {
#endif
-PPCSubtarget::PPCSubtarget(const std::string &TT, const std::string &FS,
- bool is64Bit)
- : StackAlignment(16)
+PPCSubtarget::PPCSubtarget(const std::string &TT, const std::string &CPU,
+ const std::string &FS, bool is64Bit)
+ : PPCGenSubtargetInfo(TT, CPU, FS)
+ , StackAlignment(16)
, DarwinDirective(PPC::DIR_NONE)
, IsGigaProcessor(false)
, Has64BitSupport(false)
@@ -73,13 +79,19 @@ PPCSubtarget::PPCSubtarget(const std::string &TT, const std::string &FS,
, TargetTriple(TT) {
// Determine default and user specified characteristics
- std::string CPU = "generic";
+ std::string CPUName = CPU;
+ if (CPUName.empty())
+ CPUName = "generic";
#if defined(__APPLE__)
- CPU = GetCurrentPowerPCCPU();
+ if (CPUName == "generic")
+ CPUName = GetCurrentPowerPCCPU();
#endif
// Parse features string.
- ParseSubtargetFeatures(FS, CPU);
+ ParseSubtargetFeatures(CPUName, FS);
+
+ // Initialize scheduling itinerary for the specified CPU.
+ InstrItins = getInstrItineraryForCPU(CPUName);
// If we are generating code for ppc64, verify that options make sense.
if (is64Bit) {
diff --git a/contrib/llvm/lib/Target/PowerPC/PPCSubtarget.h b/contrib/llvm/lib/Target/PowerPC/PPCSubtarget.h
index 8fd1a44..e028de6 100644
--- a/contrib/llvm/lib/Target/PowerPC/PPCSubtarget.h
+++ b/contrib/llvm/lib/Target/PowerPC/PPCSubtarget.h
@@ -7,23 +7,26 @@
//
//===----------------------------------------------------------------------===//
//
-// This file declares the PowerPC specific subclass of TargetSubtarget.
+// This file declares the PowerPC specific subclass of TargetSubtargetInfo.
//
//===----------------------------------------------------------------------===//
#ifndef POWERPCSUBTARGET_H
#define POWERPCSUBTARGET_H
+#include "llvm/Target/TargetSubtargetInfo.h"
+#include "llvm/MC/MCInstrItineraries.h"
#include "llvm/ADT/Triple.h"
-#include "llvm/Target/TargetInstrItineraries.h"
-#include "llvm/Target/TargetSubtarget.h"
-
#include <string>
+#define GET_SUBTARGETINFO_HEADER
+#include "PPCGenSubtargetInfo.inc"
+
// GCC #defines PPC on Linux but we use it as our namespace name
#undef PPC
namespace llvm {
+class StringRef;
namespace PPC {
// -m directive values.
@@ -43,7 +46,7 @@ namespace PPC {
class GlobalValue;
class TargetMachine;
-class PPCSubtarget : public TargetSubtarget {
+class PPCSubtarget : public PPCGenSubtargetInfo {
protected:
/// stackAlignment - The minimum alignment known to hold of the stack frame on
/// entry to the function and which must be maintained by every function.
@@ -73,13 +76,12 @@ public:
/// This constructor initializes the data members to match that
/// of the specified triple.
///
- PPCSubtarget(const std::string &TT, const std::string &FS, bool is64Bit);
+ PPCSubtarget(const std::string &TT, const std::string &CPU,
+ const std::string &FS, bool is64Bit);
/// ParseSubtargetFeatures - Parses features string setting specified
/// subtarget options. Definition of function is auto generated by tblgen.
- std::string ParseSubtargetFeatures(const std::string &FS,
- const std::string &CPU);
-
+ void ParseSubtargetFeatures(StringRef CPU, StringRef FS);
/// SetJITMode - This is called to inform the subtarget info that we are
/// producing code for the JIT.
@@ -104,7 +106,7 @@ public:
// Note, the alignment values for f64 and i64 on ppc64 in Darwin
// documentation are wrong; these are correct (i.e. "what gcc does").
return isPPC64() ? "E-p:64:64-f64:64:64-i64:64:64-f128:64:128-n32:64"
- : "E-p:32:32-f64:32:64-i64:32:64-f128:64:128-n32";
+ : "E-p:32:32-f64:64:64-i64:64:64-f128:64:128-n32";
}
/// isPPC64 - Return true if we are generating code for 64-bit pointer mode.
diff --git a/contrib/llvm/lib/Target/PowerPC/PPCTargetMachine.cpp b/contrib/llvm/lib/Target/PowerPC/PPCTargetMachine.cpp
index d27e54e..e0ea5ad 100644
--- a/contrib/llvm/lib/Target/PowerPC/PPCTargetMachine.cpp
+++ b/contrib/llvm/lib/Target/PowerPC/PPCTargetMachine.cpp
@@ -12,7 +12,6 @@
//===----------------------------------------------------------------------===//
#include "PPC.h"
-#include "PPCMCAsmInfo.h"
#include "PPCTargetMachine.h"
#include "llvm/PassManager.h"
#include "llvm/MC/MCStreamer.h"
@@ -21,15 +20,6 @@
#include "llvm/Support/FormattedStream.h"
using namespace llvm;
-static MCAsmInfo *createMCAsmInfo(const Target &T, StringRef TT) {
- Triple TheTriple(TT);
- bool isPPC64 = TheTriple.getArch() == Triple::ppc64;
- if (TheTriple.isOSDarwin())
- return new PPCMCAsmInfoDarwin(isPPC64);
- return new PPCLinuxMCAsmInfo(isPPC64);
-
-}
-
// This is duplicated code. Refactor this.
static MCStreamer *createMCStreamer(const Target &T, const std::string &TT,
MCContext &Ctx, TargetAsmBackend &TAB,
@@ -48,9 +38,6 @@ extern "C" void LLVMInitializePowerPCTarget() {
RegisterTargetMachine<PPC32TargetMachine> A(ThePPC32Target);
RegisterTargetMachine<PPC64TargetMachine> B(ThePPC64Target);
- RegisterAsmInfoFn C(ThePPC32Target, createMCAsmInfo);
- RegisterAsmInfoFn D(ThePPC64Target, createMCAsmInfo);
-
// Register the MC Code Emitter
TargetRegistry::RegisterCodeEmitter(ThePPC32Target, createPPCMCCodeEmitter);
TargetRegistry::RegisterCodeEmitter(ThePPC64Target, createPPCMCCodeEmitter);
@@ -67,9 +54,10 @@ extern "C" void LLVMInitializePowerPCTarget() {
PPCTargetMachine::PPCTargetMachine(const Target &T, const std::string &TT,
+ const std::string &CPU,
const std::string &FS, bool is64Bit)
- : LLVMTargetMachine(T, TT),
- Subtarget(TT, FS, is64Bit),
+ : LLVMTargetMachine(T, TT, CPU, FS),
+ Subtarget(TT, CPU, FS, is64Bit),
DataLayout(Subtarget.getTargetDataString()), InstrInfo(*this),
FrameLowering(Subtarget), JITInfo(*this, is64Bit),
TLInfo(*this), TSInfo(*this),
@@ -88,14 +76,16 @@ PPCTargetMachine::PPCTargetMachine(const Target &T, const std::string &TT,
bool PPCTargetMachine::getEnableTailMergeDefault() const { return false; }
PPC32TargetMachine::PPC32TargetMachine(const Target &T, const std::string &TT,
+ const std::string &CPU,
const std::string &FS)
- : PPCTargetMachine(T, TT, FS, false) {
+ : PPCTargetMachine(T, TT, CPU, FS, false) {
}
PPC64TargetMachine::PPC64TargetMachine(const Target &T, const std::string &TT,
+ const std::string &CPU,
const std::string &FS)
- : PPCTargetMachine(T, TT, FS, true) {
+ : PPCTargetMachine(T, TT, CPU, FS, true) {
}
diff --git a/contrib/llvm/lib/Target/PowerPC/PPCTargetMachine.h b/contrib/llvm/lib/Target/PowerPC/PPCTargetMachine.h
index 2d24989..baf07e3 100644
--- a/contrib/llvm/lib/Target/PowerPC/PPCTargetMachine.h
+++ b/contrib/llvm/lib/Target/PowerPC/PPCTargetMachine.h
@@ -41,7 +41,8 @@ class PPCTargetMachine : public LLVMTargetMachine {
public:
PPCTargetMachine(const Target &T, const std::string &TT,
- const std::string &FS, bool is64Bit);
+ const std::string &CPU, const std::string &FS,
+ bool is64Bit);
virtual const PPCInstrInfo *getInstrInfo() const { return &InstrInfo; }
virtual const PPCFrameLowering *getFrameLowering() const {
@@ -77,7 +78,7 @@ public:
class PPC32TargetMachine : public PPCTargetMachine {
public:
PPC32TargetMachine(const Target &T, const std::string &TT,
- const std::string &FS);
+ const std::string &CPU, const std::string &FS);
};
/// PPC64TargetMachine - PowerPC 64-bit target machine.
@@ -85,7 +86,7 @@ public:
class PPC64TargetMachine : public PPCTargetMachine {
public:
PPC64TargetMachine(const Target &T, const std::string &TT,
- const std::string &FS);
+ const std::string &CPU, const std::string &FS);
};
} // end namespace llvm
diff --git a/contrib/llvm/lib/Target/Sparc/DelaySlotFiller.cpp b/contrib/llvm/lib/Target/Sparc/DelaySlotFiller.cpp
index 4b12852..dab35e5 100644
--- a/contrib/llvm/lib/Target/Sparc/DelaySlotFiller.cpp
+++ b/contrib/llvm/lib/Target/Sparc/DelaySlotFiller.cpp
@@ -298,7 +298,7 @@ bool Filler::isDelayFiller(MachineBasicBlock &MBB,
return false;
if (candidate->getOpcode() == SP::UNIMP)
return true;
- const TargetInstrDesc &prevdesc = (--candidate)->getDesc();
+ const MCInstrDesc &prevdesc = (--candidate)->getDesc();
return prevdesc.hasDelaySlot();
}
diff --git a/contrib/llvm/lib/Target/Sparc/MCTargetDesc/CMakeLists.txt b/contrib/llvm/lib/Target/Sparc/MCTargetDesc/CMakeLists.txt
new file mode 100644
index 0000000..1e8c029
--- /dev/null
+++ b/contrib/llvm/lib/Target/Sparc/MCTargetDesc/CMakeLists.txt
@@ -0,0 +1,4 @@
+add_llvm_library(LLVMSparcDesc
+ SparcMCTargetDesc.cpp
+ SparcMCAsmInfo.cpp
+ )
diff --git a/contrib/llvm/lib/Target/Sparc/MCTargetDesc/Makefile b/contrib/llvm/lib/Target/Sparc/MCTargetDesc/Makefile
new file mode 100644
index 0000000..abcbe2d
--- /dev/null
+++ b/contrib/llvm/lib/Target/Sparc/MCTargetDesc/Makefile
@@ -0,0 +1,16 @@
+##===- lib/Target/Sparc/TargetDesc/Makefile ----------------*- Makefile -*-===##
+#
+# The LLVM Compiler Infrastructure
+#
+# This file is distributed under the University of Illinois Open Source
+# License. See LICENSE.TXT for details.
+#
+##===----------------------------------------------------------------------===##
+
+LEVEL = ../../../..
+LIBRARYNAME = LLVMSparcDesc
+
+# Hack: we need to include 'main' target directory to grab private headers
+CPP.Flags += -I$(PROJ_OBJ_DIR)/.. -I$(PROJ_SRC_DIR)/..
+
+include $(LEVEL)/Makefile.common
diff --git a/contrib/llvm/lib/Target/Sparc/SparcMCAsmInfo.cpp b/contrib/llvm/lib/Target/Sparc/MCTargetDesc/SparcMCAsmInfo.cpp
index d37d6d2..6a7e090 100644
--- a/contrib/llvm/lib/Target/Sparc/SparcMCAsmInfo.cpp
+++ b/contrib/llvm/lib/Target/Sparc/MCTargetDesc/SparcMCAsmInfo.cpp
@@ -12,9 +12,16 @@
//===----------------------------------------------------------------------===//
#include "SparcMCAsmInfo.h"
+#include "llvm/ADT/Triple.h"
+
using namespace llvm;
SparcELFMCAsmInfo::SparcELFMCAsmInfo(const Target &T, StringRef TT) {
+ IsLittleEndian = false;
+ Triple TheTriple(TT);
+ if (TheTriple.getArch() == Triple::sparcv9)
+ PointerSize = 8;
+
Data16bitsDirective = "\t.half\t";
Data32bitsDirective = "\t.word\t";
Data64bitsDirective = 0; // .xword is only supported by V9.
diff --git a/contrib/llvm/lib/Target/Sparc/SparcMCAsmInfo.h b/contrib/llvm/lib/Target/Sparc/MCTargetDesc/SparcMCAsmInfo.h
index 0cb6827..0cb6827 100644
--- a/contrib/llvm/lib/Target/Sparc/SparcMCAsmInfo.h
+++ b/contrib/llvm/lib/Target/Sparc/MCTargetDesc/SparcMCAsmInfo.h
diff --git a/contrib/llvm/lib/Target/Sparc/MCTargetDesc/SparcMCTargetDesc.cpp b/contrib/llvm/lib/Target/Sparc/MCTargetDesc/SparcMCTargetDesc.cpp
new file mode 100644
index 0000000..cb92a2b
--- /dev/null
+++ b/contrib/llvm/lib/Target/Sparc/MCTargetDesc/SparcMCTargetDesc.cpp
@@ -0,0 +1,57 @@
+//===-- SparcMCTargetDesc.cpp - Sparc Target Descriptions --------*- C++ -*-===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+//
+// This file provides Sparc specific target descriptions.
+//
+//===----------------------------------------------------------------------===//
+
+#include "SparcMCTargetDesc.h"
+#include "SparcMCAsmInfo.h"
+#include "llvm/MC/MCInstrInfo.h"
+#include "llvm/MC/MCRegisterInfo.h"
+#include "llvm/MC/MCSubtargetInfo.h"
+#include "llvm/Target/TargetRegistry.h"
+
+#define GET_INSTRINFO_MC_DESC
+#include "SparcGenInstrInfo.inc"
+
+#define GET_SUBTARGETINFO_MC_DESC
+#include "SparcGenSubtargetInfo.inc"
+
+#define GET_REGINFO_MC_DESC
+#include "SparcGenRegisterInfo.inc"
+
+using namespace llvm;
+
+static MCInstrInfo *createSparcMCInstrInfo() {
+ MCInstrInfo *X = new MCInstrInfo();
+ InitSparcMCInstrInfo(X);
+ return X;
+}
+
+extern "C" void LLVMInitializeSparcMCInstrInfo() {
+ TargetRegistry::RegisterMCInstrInfo(TheSparcTarget, createSparcMCInstrInfo);
+}
+
+static MCSubtargetInfo *createSparcMCSubtargetInfo(StringRef TT, StringRef CPU,
+ StringRef FS) {
+ MCSubtargetInfo *X = new MCSubtargetInfo();
+ InitSparcMCSubtargetInfo(X, TT, CPU, FS);
+ return X;
+}
+
+extern "C" void LLVMInitializeSparcMCSubtargetInfo() {
+ TargetRegistry::RegisterMCSubtargetInfo(TheSparcTarget,
+ createSparcMCSubtargetInfo);
+}
+
+extern "C" void LLVMInitializeSparcMCAsmInfo() {
+ RegisterMCAsmInfo<SparcELFMCAsmInfo> X(TheSparcTarget);
+ RegisterMCAsmInfo<SparcELFMCAsmInfo> Y(TheSparcV9Target);
+}
diff --git a/contrib/llvm/lib/Target/Sparc/MCTargetDesc/SparcMCTargetDesc.h b/contrib/llvm/lib/Target/Sparc/MCTargetDesc/SparcMCTargetDesc.h
new file mode 100644
index 0000000..2fd9e3f
--- /dev/null
+++ b/contrib/llvm/lib/Target/Sparc/MCTargetDesc/SparcMCTargetDesc.h
@@ -0,0 +1,41 @@
+//===-- SparcMCTargetDesc.h - Sparc Target Descriptions ---------*- C++ -*-===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+//
+// This file provides Sparc specific target descriptions.
+//
+//===----------------------------------------------------------------------===//
+
+#ifndef SPARCMCTARGETDESC_H
+#define SPARCMCTARGETDESC_H
+
+namespace llvm {
+class MCSubtargetInfo;
+class Target;
+class StringRef;
+
+extern Target TheSparcTarget;
+extern Target TheSparcV9Target;
+
+} // End llvm namespace
+
+// Defines symbolic names for Sparc registers. This defines a mapping from
+// register name to register number.
+//
+#define GET_REGINFO_ENUM
+#include "SparcGenRegisterInfo.inc"
+
+// Defines symbolic names for the Sparc instructions.
+//
+#define GET_INSTRINFO_ENUM
+#include "SparcGenInstrInfo.inc"
+
+#define GET_SUBTARGETINFO_ENUM
+#include "SparcGenSubtargetInfo.inc"
+
+#endif
diff --git a/contrib/llvm/lib/Target/Sparc/Sparc.h b/contrib/llvm/lib/Target/Sparc/Sparc.h
index a37920d..7b2c614 100644
--- a/contrib/llvm/lib/Target/Sparc/Sparc.h
+++ b/contrib/llvm/lib/Target/Sparc/Sparc.h
@@ -15,6 +15,7 @@
#ifndef TARGET_SPARC_H
#define TARGET_SPARC_H
+#include "MCTargetDesc/SparcMCTargetDesc.h"
#include "llvm/Support/ErrorHandling.h"
#include "llvm/Target/TargetMachine.h"
#include <cassert>
@@ -28,21 +29,8 @@ namespace llvm {
FunctionPass *createSparcDelaySlotFillerPass(TargetMachine &TM);
FunctionPass *createSparcFPMoverPass(TargetMachine &TM);
- extern Target TheSparcTarget;
- extern Target TheSparcV9Target;
-
} // end namespace llvm;
-// Defines symbolic names for Sparc registers. This defines a mapping from
-// register name to register number.
-//
-#include "SparcGenRegisterNames.inc"
-
-// Defines symbolic names for the Sparc instructions.
-//
-#include "SparcGenInstrNames.inc"
-
-
namespace llvm {
// Enums corresponding to Sparc condition codes, both icc's and fcc's. These
// values must be kept in sync with the ones in the .td file.
diff --git a/contrib/llvm/lib/Target/Sparc/SparcISelLowering.cpp b/contrib/llvm/lib/Target/Sparc/SparcISelLowering.cpp
index 0b4612d..6f30d3f 100644
--- a/contrib/llvm/lib/Target/Sparc/SparcISelLowering.cpp
+++ b/contrib/llvm/lib/Target/Sparc/SparcISelLowering.cpp
@@ -1,4 +1,3 @@
-
//===-- SparcISelLowering.cpp - Sparc DAG Lowering Implementation ---------===//
//
// The LLVM Compiler Infrastructure
@@ -755,9 +754,11 @@ SparcTargetLowering::SparcTargetLowering(TargetMachine &TM)
setOperationAction(ISD::FSIN , MVT::f64, Expand);
setOperationAction(ISD::FCOS , MVT::f64, Expand);
setOperationAction(ISD::FREM , MVT::f64, Expand);
+ setOperationAction(ISD::FMA , MVT::f64, Expand);
setOperationAction(ISD::FSIN , MVT::f32, Expand);
setOperationAction(ISD::FCOS , MVT::f32, Expand);
setOperationAction(ISD::FREM , MVT::f32, Expand);
+ setOperationAction(ISD::FMA , MVT::f32, Expand);
setOperationAction(ISD::CTPOP, MVT::i32, Expand);
setOperationAction(ISD::CTTZ , MVT::i32, Expand);
setOperationAction(ISD::CTLZ , MVT::i32, Expand);
@@ -1265,26 +1266,6 @@ SparcTargetLowering::getRegForInlineAsmConstraint(const std::string &Constraint,
return TargetLowering::getRegForInlineAsmConstraint(Constraint, VT);
}
-std::vector<unsigned> SparcTargetLowering::
-getRegClassForInlineAsmConstraint(const std::string &Constraint,
- EVT VT) const {
- if (Constraint.size() != 1)
- return std::vector<unsigned>();
-
- switch (Constraint[0]) {
- default: break;
- case 'r':
- return make_vector<unsigned>(SP::L0, SP::L1, SP::L2, SP::L3,
- SP::L4, SP::L5, SP::L6, SP::L7,
- SP::I0, SP::I1, SP::I2, SP::I3,
- SP::I4, SP::I5,
- SP::O0, SP::O1, SP::O2, SP::O3,
- SP::O4, SP::O5, SP::O7, 0);
- }
-
- return std::vector<unsigned>();
-}
-
bool
SparcTargetLowering::isOffsetFoldingLegal(const GlobalAddressSDNode *GA) const {
// The Sparc target isn't yet aware of offsets.
diff --git a/contrib/llvm/lib/Target/Sparc/SparcISelLowering.h b/contrib/llvm/lib/Target/Sparc/SparcISelLowering.h
index 9ea6e16..8a1886a 100644
--- a/contrib/llvm/lib/Target/Sparc/SparcISelLowering.h
+++ b/contrib/llvm/lib/Target/Sparc/SparcISelLowering.h
@@ -65,9 +65,6 @@ namespace llvm {
ConstraintType getConstraintType(const std::string &Constraint) const;
std::pair<unsigned, const TargetRegisterClass*>
getRegForInlineAsmConstraint(const std::string &Constraint, EVT VT) const;
- std::vector<unsigned>
- getRegClassForInlineAsmConstraint(const std::string &Constraint,
- EVT VT) const;
virtual bool isOffsetFoldingLegal(const GlobalAddressSDNode *GA) const;
diff --git a/contrib/llvm/lib/Target/Sparc/SparcInstrInfo.cpp b/contrib/llvm/lib/Target/Sparc/SparcInstrInfo.cpp
index afa3c1f..4e3ddf8 100644
--- a/contrib/llvm/lib/Target/Sparc/SparcInstrInfo.cpp
+++ b/contrib/llvm/lib/Target/Sparc/SparcInstrInfo.cpp
@@ -12,19 +12,23 @@
//===----------------------------------------------------------------------===//
#include "SparcInstrInfo.h"
-#include "SparcSubtarget.h"
#include "Sparc.h"
-#include "llvm/ADT/STLExtras.h"
-#include "llvm/ADT/SmallVector.h"
+#include "SparcMachineFunctionInfo.h"
+#include "SparcSubtarget.h"
#include "llvm/CodeGen/MachineInstrBuilder.h"
#include "llvm/CodeGen/MachineRegisterInfo.h"
+#include "llvm/Target/TargetRegistry.h"
#include "llvm/Support/ErrorHandling.h"
+#include "llvm/ADT/STLExtras.h"
+#include "llvm/ADT/SmallVector.h"
+
+#define GET_INSTRINFO_CTOR
#include "SparcGenInstrInfo.inc"
-#include "SparcMachineFunctionInfo.h"
+
using namespace llvm;
SparcInstrInfo::SparcInstrInfo(SparcSubtarget &ST)
- : TargetInstrInfoImpl(SparcInsts, array_lengthof(SparcInsts)),
+ : SparcGenInstrInfo(SP::ADJCALLSTACKDOWN, SP::ADJCALLSTACKUP),
RI(ST, *this), Subtarget(ST) {
}
diff --git a/contrib/llvm/lib/Target/Sparc/SparcInstrInfo.h b/contrib/llvm/lib/Target/Sparc/SparcInstrInfo.h
index b2d24f5..eda64ef 100644
--- a/contrib/llvm/lib/Target/Sparc/SparcInstrInfo.h
+++ b/contrib/llvm/lib/Target/Sparc/SparcInstrInfo.h
@@ -17,6 +17,9 @@
#include "llvm/Target/TargetInstrInfo.h"
#include "SparcRegisterInfo.h"
+#define GET_INSTRINFO_HEADER
+#include "SparcGenInstrInfo.inc"
+
namespace llvm {
/// SPII - This namespace holds all of the target specific flags that
@@ -31,7 +34,7 @@ namespace SPII {
};
}
-class SparcInstrInfo : public TargetInstrInfoImpl {
+class SparcInstrInfo : public SparcGenInstrInfo {
const SparcRegisterInfo RI;
const SparcSubtarget& Subtarget;
public:
diff --git a/contrib/llvm/lib/Target/Sparc/SparcRegisterInfo.cpp b/contrib/llvm/lib/Target/Sparc/SparcRegisterInfo.cpp
index 9fcf028..0acdd2c 100644
--- a/contrib/llvm/lib/Target/Sparc/SparcRegisterInfo.cpp
+++ b/contrib/llvm/lib/Target/Sparc/SparcRegisterInfo.cpp
@@ -23,12 +23,15 @@
#include "llvm/Type.h"
#include "llvm/ADT/BitVector.h"
#include "llvm/ADT/STLExtras.h"
+
+#define GET_REGINFO_TARGET_DESC
+#include "SparcGenRegisterInfo.inc"
+
using namespace llvm;
SparcRegisterInfo::SparcRegisterInfo(SparcSubtarget &st,
const TargetInstrInfo &tii)
- : SparcGenRegisterInfo(SP::ADJCALLSTACKDOWN, SP::ADJCALLSTACKUP),
- Subtarget(st), TII(tii) {
+ : SparcGenRegisterInfo(), Subtarget(st), TII(tii) {
}
const unsigned* SparcRegisterInfo::getCalleeSavedRegs(const MachineFunction *MF)
@@ -135,6 +138,3 @@ int SparcRegisterInfo::getDwarfRegNum(unsigned RegNum, bool isEH) const {
int SparcRegisterInfo::getLLVMRegNum(unsigned DwarfRegNo, bool isEH) const {
return SparcGenRegisterInfo::getLLVMRegNumFull(DwarfRegNo,0);
}
-
-#include "SparcGenRegisterInfo.inc"
-
diff --git a/contrib/llvm/lib/Target/Sparc/SparcRegisterInfo.h b/contrib/llvm/lib/Target/Sparc/SparcRegisterInfo.h
index 56c8068..ec9e63a 100644
--- a/contrib/llvm/lib/Target/Sparc/SparcRegisterInfo.h
+++ b/contrib/llvm/lib/Target/Sparc/SparcRegisterInfo.h
@@ -15,7 +15,9 @@
#define SPARCREGISTERINFO_H
#include "llvm/Target/TargetRegisterInfo.h"
-#include "SparcGenRegisterInfo.h.inc"
+
+#define GET_REGINFO_HEADER
+#include "SparcGenRegisterInfo.inc"
namespace llvm {
diff --git a/contrib/llvm/lib/Target/Sparc/SparcRegisterInfo.td b/contrib/llvm/lib/Target/Sparc/SparcRegisterInfo.td
index 0729818..cf92829 100644
--- a/contrib/llvm/lib/Target/Sparc/SparcRegisterInfo.td
+++ b/contrib/llvm/lib/Target/Sparc/SparcRegisterInfo.td
@@ -139,23 +139,21 @@ def D15 : Rd<30, "F30", [F30, F31]>, DwarfRegNum<[87]>;
// FIXME: the register order should be defined in terms of the preferred
// allocation order...
//
-def IntRegs : RegisterClass<"SP", [i32], 32, [L0, L1, L2, L3, L4, L5, L6, L7,
- I0, I1, I2, I3, I4, I5,
- O0, O1, O2, O3, O4, O5, O7,
- G1,
- // Non-allocatable regs:
- G2, G3, G4, // FIXME: OK for use only in
- // applications, not libraries.
- O6, // stack ptr
- I6, // frame ptr
- I7, // return address
- G0, // constant zero
- G5, G6, G7 // reserved for kernel
- ]>;
+def IntRegs : RegisterClass<"SP", [i32], 32,
+ (add L0, L1, L2, L3, L4, L5, L6,
+ L7, I0, I1, I2, I3, I4, I5,
+ O0, O1, O2, O3, O4, O5, O7,
+ G1,
+ // Non-allocatable regs:
+ G2, G3, G4, // FIXME: OK for use only in
+ // applications, not libraries.
+ O6, // stack ptr
+ I6, // frame ptr
+ I7, // return address
+ G0, // constant zero
+ G5, G6, G7 // reserved for kernel
+ )>;
-def FPRegs : RegisterClass<"SP", [f32], 32, [F0, F1, F2, F3, F4, F5, F6, F7, F8,
- F9, F10, F11, F12, F13, F14, F15, F16, F17, F18, F19, F20, F21, F22,
- F23, F24, F25, F26, F27, F28, F29, F30, F31]>;
+def FPRegs : RegisterClass<"SP", [f32], 32, (sequence "F%u", 0, 31)>;
-def DFPRegs : RegisterClass<"SP", [f64], 64, [D0, D1, D2, D3, D4, D5, D6, D7,
- D8, D9, D10, D11, D12, D13, D14, D15]>;
+def DFPRegs : RegisterClass<"SP", [f64], 64, (sequence "D%u", 0, 15)>;
diff --git a/contrib/llvm/lib/Target/Sparc/SparcSubtarget.cpp b/contrib/llvm/lib/Target/Sparc/SparcSubtarget.cpp
index ce11af1..de647e8 100644
--- a/contrib/llvm/lib/Target/Sparc/SparcSubtarget.cpp
+++ b/contrib/llvm/lib/Target/Sparc/SparcSubtarget.cpp
@@ -7,28 +7,38 @@
//
//===----------------------------------------------------------------------===//
//
-// This file implements the SPARC specific subclass of TargetSubtarget.
+// This file implements the SPARC specific subclass of TargetSubtargetInfo.
//
//===----------------------------------------------------------------------===//
#include "SparcSubtarget.h"
-#include "SparcGenSubtarget.inc"
+#include "Sparc.h"
+#include "llvm/Target/TargetRegistry.h"
+
+#define GET_SUBTARGETINFO_TARGET_DESC
+#define GET_SUBTARGETINFO_CTOR
+#include "SparcGenSubtargetInfo.inc"
+
using namespace llvm;
-SparcSubtarget::SparcSubtarget(const std::string &TT, const std::string &FS,
- bool is64Bit) :
+SparcSubtarget::SparcSubtarget(const std::string &TT, const std::string &CPU,
+ const std::string &FS, bool is64Bit) :
+ SparcGenSubtargetInfo(TT, CPU, FS),
IsV9(false),
V8DeprecatedInsts(false),
IsVIS(false),
Is64Bit(is64Bit) {
// Determine default and user specified characteristics
- const char *CPU = "v8";
- if (is64Bit) {
- CPU = "v9";
- IsV9 = true;
+ std::string CPUName = CPU;
+ if (CPUName.empty()) {
+ if (is64Bit)
+ CPUName = "v9";
+ else
+ CPUName = "v8";
}
+ IsV9 = CPUName == "v9";
// Parse features string.
- ParseSubtargetFeatures(FS, CPU);
+ ParseSubtargetFeatures(CPUName, FS);
}
diff --git a/contrib/llvm/lib/Target/Sparc/SparcSubtarget.h b/contrib/llvm/lib/Target/Sparc/SparcSubtarget.h
index cec0ab4..00a04c3 100644
--- a/contrib/llvm/lib/Target/Sparc/SparcSubtarget.h
+++ b/contrib/llvm/lib/Target/Sparc/SparcSubtarget.h
@@ -7,26 +7,31 @@
//
//===----------------------------------------------------------------------===//
//
-// This file declares the SPARC specific subclass of TargetSubtarget.
+// This file declares the SPARC specific subclass of TargetSubtargetInfo.
//
//===----------------------------------------------------------------------===//
#ifndef SPARC_SUBTARGET_H
#define SPARC_SUBTARGET_H
-#include "llvm/Target/TargetSubtarget.h"
+#include "llvm/Target/TargetSubtargetInfo.h"
#include <string>
+#define GET_SUBTARGETINFO_HEADER
+#include "SparcGenSubtargetInfo.inc"
+
namespace llvm {
+class StringRef;
-class SparcSubtarget : public TargetSubtarget {
+class SparcSubtarget : public SparcGenSubtargetInfo {
bool IsV9;
bool V8DeprecatedInsts;
bool IsVIS;
bool Is64Bit;
public:
- SparcSubtarget(const std::string &TT, const std::string &FS, bool is64bit);
+ SparcSubtarget(const std::string &TT, const std::string &CPU,
+ const std::string &FS, bool is64bit);
bool isV9() const { return IsV9; }
bool isVIS() const { return IsVIS; }
@@ -34,8 +39,7 @@ public:
/// ParseSubtargetFeatures - Parses features string setting specified
/// subtarget options. Definition of function is auto generated by tblgen.
- std::string ParseSubtargetFeatures(const std::string &FS,
- const std::string &CPU);
+ void ParseSubtargetFeatures(StringRef CPU, StringRef FS);
bool is64Bit() const { return Is64Bit; }
std::string getDataLayout() const {
diff --git a/contrib/llvm/lib/Target/Sparc/SparcTargetMachine.cpp b/contrib/llvm/lib/Target/Sparc/SparcTargetMachine.cpp
index b84eab5..cbe6d87 100644
--- a/contrib/llvm/lib/Target/Sparc/SparcTargetMachine.cpp
+++ b/contrib/llvm/lib/Target/Sparc/SparcTargetMachine.cpp
@@ -11,7 +11,6 @@
//===----------------------------------------------------------------------===//
#include "Sparc.h"
-#include "SparcMCAsmInfo.h"
#include "SparcTargetMachine.h"
#include "llvm/PassManager.h"
#include "llvm/Target/TargetRegistry.h"
@@ -21,18 +20,15 @@ extern "C" void LLVMInitializeSparcTarget() {
// Register the target.
RegisterTargetMachine<SparcV8TargetMachine> X(TheSparcTarget);
RegisterTargetMachine<SparcV9TargetMachine> Y(TheSparcV9Target);
-
- RegisterAsmInfo<SparcELFMCAsmInfo> A(TheSparcTarget);
- RegisterAsmInfo<SparcELFMCAsmInfo> B(TheSparcV9Target);
-
}
/// SparcTargetMachine ctor - Create an ILP32 architecture model
///
SparcTargetMachine::SparcTargetMachine(const Target &T, const std::string &TT,
+ const std::string &CPU,
const std::string &FS, bool is64bit)
- : LLVMTargetMachine(T, TT),
- Subtarget(TT, FS, is64bit),
+ : LLVMTargetMachine(T, TT, CPU, FS),
+ Subtarget(TT, CPU, FS, is64bit),
DataLayout(Subtarget.getDataLayout()),
TLInfo(*this), TSInfo(*this), InstrInfo(Subtarget),
FrameLowering(Subtarget) {
@@ -56,12 +52,14 @@ bool SparcTargetMachine::addPreEmitPass(PassManagerBase &PM,
SparcV8TargetMachine::SparcV8TargetMachine(const Target &T,
const std::string &TT,
+ const std::string &CPU,
const std::string &FS)
- : SparcTargetMachine(T, TT, FS, false) {
+ : SparcTargetMachine(T, TT, CPU, FS, false) {
}
SparcV9TargetMachine::SparcV9TargetMachine(const Target &T,
const std::string &TT,
+ const std::string &CPU,
const std::string &FS)
- : SparcTargetMachine(T, TT, FS, true) {
+ : SparcTargetMachine(T, TT, CPU, FS, true) {
}
diff --git a/contrib/llvm/lib/Target/Sparc/SparcTargetMachine.h b/contrib/llvm/lib/Target/Sparc/SparcTargetMachine.h
index c4bb6bd..799fc49 100644
--- a/contrib/llvm/lib/Target/Sparc/SparcTargetMachine.h
+++ b/contrib/llvm/lib/Target/Sparc/SparcTargetMachine.h
@@ -34,7 +34,8 @@ class SparcTargetMachine : public LLVMTargetMachine {
SparcFrameLowering FrameLowering;
public:
SparcTargetMachine(const Target &T, const std::string &TT,
- const std::string &FS, bool is64bit);
+ const std::string &CPU, const std::string &FS,
+ bool is64bit);
virtual const SparcInstrInfo *getInstrInfo() const { return &InstrInfo; }
virtual const TargetFrameLowering *getFrameLowering() const {
@@ -62,7 +63,7 @@ public:
class SparcV8TargetMachine : public SparcTargetMachine {
public:
SparcV8TargetMachine(const Target &T, const std::string &TT,
- const std::string &FS);
+ const std::string &CPU, const std::string &FS);
};
/// SparcV9TargetMachine - Sparc 64-bit target machine
@@ -70,7 +71,7 @@ public:
class SparcV9TargetMachine : public SparcTargetMachine {
public:
SparcV9TargetMachine(const Target &T, const std::string &TT,
- const std::string &FS);
+ const std::string &CPU, const std::string &FS);
};
} // end namespace llvm
diff --git a/contrib/llvm/lib/Target/SystemZ/MCTargetDesc/CMakeLists.txt b/contrib/llvm/lib/Target/SystemZ/MCTargetDesc/CMakeLists.txt
new file mode 100644
index 0000000..2ac9016
--- /dev/null
+++ b/contrib/llvm/lib/Target/SystemZ/MCTargetDesc/CMakeLists.txt
@@ -0,0 +1,7 @@
+add_llvm_library(LLVMSystemZDesc
+ SystemZMCTargetDesc.cpp
+ SystemZMCAsmInfo.cpp
+ )
+
+# Hack: we need to include 'main' target directory to grab private headers
+include_directories(${CMAKE_CURRENT_SOURCE_DIR}/.. ${CMAKE_CURRENT_BINARY_DIR}/..)
diff --git a/contrib/llvm/lib/Target/SystemZ/MCTargetDesc/Makefile b/contrib/llvm/lib/Target/SystemZ/MCTargetDesc/Makefile
new file mode 100644
index 0000000..08f1a9d
--- /dev/null
+++ b/contrib/llvm/lib/Target/SystemZ/MCTargetDesc/Makefile
@@ -0,0 +1,16 @@
+##===- lib/Target/SystemZ/TargetDesc/Makefile --------------*- Makefile -*-===##
+#
+# The LLVM Compiler Infrastructure
+#
+# This file is distributed under the University of Illinois Open Source
+# License. See LICENSE.TXT for details.
+#
+##===----------------------------------------------------------------------===##
+
+LEVEL = ../../../..
+LIBRARYNAME = LLVMSystemZDesc
+
+# Hack: we need to include 'main' target directory to grab private headers
+CPP.Flags += -I$(PROJ_OBJ_DIR)/.. -I$(PROJ_SRC_DIR)/..
+
+include $(LEVEL)/Makefile.common
diff --git a/contrib/llvm/lib/Target/SystemZ/SystemZMCAsmInfo.cpp b/contrib/llvm/lib/Target/SystemZ/MCTargetDesc/SystemZMCAsmInfo.cpp
index 2dc7e7b..8540546 100644
--- a/contrib/llvm/lib/Target/SystemZ/SystemZMCAsmInfo.cpp
+++ b/contrib/llvm/lib/Target/SystemZ/MCTargetDesc/SystemZMCAsmInfo.cpp
@@ -18,6 +18,8 @@
using namespace llvm;
SystemZMCAsmInfo::SystemZMCAsmInfo(const Target &T, StringRef TT) {
+ IsLittleEndian = false;
+ PointerSize = 8;
PrivateGlobalPrefix = ".L";
WeakRefDirective = "\t.weak\t";
PCSymbol = ".";
diff --git a/contrib/llvm/lib/Target/SystemZ/SystemZMCAsmInfo.h b/contrib/llvm/lib/Target/SystemZ/MCTargetDesc/SystemZMCAsmInfo.h
index a6a27e2..a6a27e2 100644
--- a/contrib/llvm/lib/Target/SystemZ/SystemZMCAsmInfo.h
+++ b/contrib/llvm/lib/Target/SystemZ/MCTargetDesc/SystemZMCAsmInfo.h
diff --git a/contrib/llvm/lib/Target/SystemZ/MCTargetDesc/SystemZMCTargetDesc.cpp b/contrib/llvm/lib/Target/SystemZ/MCTargetDesc/SystemZMCTargetDesc.cpp
new file mode 100644
index 0000000..5a826a6
--- /dev/null
+++ b/contrib/llvm/lib/Target/SystemZ/MCTargetDesc/SystemZMCTargetDesc.cpp
@@ -0,0 +1,58 @@
+//===-- SystemZMCTargetDesc.cpp - SystemZ Target Descriptions ---*- C++ -*-===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+//
+// This file provides SystemZ specific target descriptions.
+//
+//===----------------------------------------------------------------------===//
+
+#include "SystemZMCTargetDesc.h"
+#include "SystemZMCAsmInfo.h"
+#include "llvm/MC/MCInstrInfo.h"
+#include "llvm/MC/MCRegisterInfo.h"
+#include "llvm/MC/MCSubtargetInfo.h"
+#include "llvm/Target/TargetRegistry.h"
+
+#define GET_INSTRINFO_MC_DESC
+#include "SystemZGenInstrInfo.inc"
+
+#define GET_SUBTARGETINFO_MC_DESC
+#include "SystemZGenSubtargetInfo.inc"
+
+#define GET_REGINFO_MC_DESC
+#include "SystemZGenRegisterInfo.inc"
+
+using namespace llvm;
+
+static MCInstrInfo *createSystemZMCInstrInfo() {
+ MCInstrInfo *X = new MCInstrInfo();
+ InitSystemZMCInstrInfo(X);
+ return X;
+}
+
+extern "C" void LLVMInitializeSystemZMCInstrInfo() {
+ TargetRegistry::RegisterMCInstrInfo(TheSystemZTarget,
+ createSystemZMCInstrInfo);
+}
+
+static MCSubtargetInfo *createSystemZMCSubtargetInfo(StringRef TT,
+ StringRef CPU,
+ StringRef FS) {
+ MCSubtargetInfo *X = new MCSubtargetInfo();
+ InitSystemZMCSubtargetInfo(X, TT, CPU, FS);
+ return X;
+}
+
+extern "C" void LLVMInitializeSystemZMCSubtargetInfo() {
+ TargetRegistry::RegisterMCSubtargetInfo(TheSystemZTarget,
+ createSystemZMCSubtargetInfo);
+}
+
+extern "C" void LLVMInitializeSystemZMCAsmInfo() {
+ RegisterMCAsmInfo<SystemZMCAsmInfo> X(TheSystemZTarget);
+}
diff --git a/contrib/llvm/lib/Target/SystemZ/MCTargetDesc/SystemZMCTargetDesc.h b/contrib/llvm/lib/Target/SystemZ/MCTargetDesc/SystemZMCTargetDesc.h
new file mode 100644
index 0000000..e2ad5af
--- /dev/null
+++ b/contrib/llvm/lib/Target/SystemZ/MCTargetDesc/SystemZMCTargetDesc.h
@@ -0,0 +1,38 @@
+//===-- SystemZMCTargetDesc.h - SystemZ Target Descriptions -----*- C++ -*-===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+//
+// This file provides SystemZ specific target descriptions.
+//
+//===----------------------------------------------------------------------===//
+
+#ifndef SYSTEMZMCTARGETDESC_H
+#define SYSTEMZMCTARGETDESC_H
+
+namespace llvm {
+class MCSubtargetInfo;
+class Target;
+class StringRef;
+
+extern Target TheSystemZTarget;
+
+} // End llvm namespace
+
+// Defines symbolic names for SystemZ registers.
+// This defines a mapping from register name to register number.
+#define GET_REGINFO_ENUM
+#include "SystemZGenRegisterInfo.inc"
+
+// Defines symbolic names for the SystemZ instructions.
+#define GET_INSTRINFO_ENUM
+#include "SystemZGenInstrInfo.inc"
+
+#define GET_SUBTARGETINFO_ENUM
+#include "SystemZGenSubtargetInfo.inc"
+
+#endif
diff --git a/contrib/llvm/lib/Target/SystemZ/SystemZ.h b/contrib/llvm/lib/Target/SystemZ/SystemZ.h
index ea5240a..88960b9 100644
--- a/contrib/llvm/lib/Target/SystemZ/SystemZ.h
+++ b/contrib/llvm/lib/Target/SystemZ/SystemZ.h
@@ -15,6 +15,7 @@
#ifndef LLVM_TARGET_SystemZ_H
#define LLVM_TARGET_SystemZ_H
+#include "MCTargetDesc/SystemZMCTargetDesc.h"
#include "llvm/Target/TargetMachine.h"
namespace llvm {
@@ -47,15 +48,5 @@ namespace llvm {
FunctionPass *createSystemZISelDag(SystemZTargetMachine &TM,
CodeGenOpt::Level OptLevel);
- extern Target TheSystemZTarget;
-
} // end namespace llvm;
-
-// Defines symbolic names for SystemZ registers.
-// This defines a mapping from register name to register number.
-#include "SystemZGenRegisterNames.inc"
-
-// Defines symbolic names for the SystemZ instructions.
-#include "SystemZGenInstrNames.inc"
-
#endif
diff --git a/contrib/llvm/lib/Target/SystemZ/SystemZISelLowering.cpp b/contrib/llvm/lib/Target/SystemZ/SystemZISelLowering.cpp
index af85df5..871c297 100644
--- a/contrib/llvm/lib/Target/SystemZ/SystemZISelLowering.cpp
+++ b/contrib/llvm/lib/Target/SystemZ/SystemZISelLowering.cpp
@@ -142,6 +142,8 @@ SystemZTargetLowering::SystemZTargetLowering(SystemZTargetMachine &tm) :
setOperationAction(ISD::FCOS, MVT::f64, Expand);
setOperationAction(ISD::FREM, MVT::f32, Expand);
setOperationAction(ISD::FREM, MVT::f64, Expand);
+ setOperationAction(ISD::FMA, MVT::f32, Expand);
+ setOperationAction(ISD::FMA, MVT::f64, Expand);
// We have only 64-bit bitconverts
setOperationAction(ISD::BITCAST, MVT::f32, Expand);
diff --git a/contrib/llvm/lib/Target/SystemZ/SystemZInstrBuilder.h b/contrib/llvm/lib/Target/SystemZ/SystemZInstrBuilder.h
index 2f2ef08..ab45ec5 100644
--- a/contrib/llvm/lib/Target/SystemZ/SystemZInstrBuilder.h
+++ b/contrib/llvm/lib/Target/SystemZ/SystemZInstrBuilder.h
@@ -108,11 +108,11 @@ addFrameReference(const MachineInstrBuilder &MIB, int FI, int Offset = 0) {
MachineInstr *MI = MIB;
MachineFunction &MF = *MI->getParent()->getParent();
MachineFrameInfo &MFI = *MF.getFrameInfo();
- const TargetInstrDesc &TID = MI->getDesc();
+ const MCInstrDesc &MCID = MI->getDesc();
unsigned Flags = 0;
- if (TID.mayLoad())
+ if (MCID.mayLoad())
Flags |= MachineMemOperand::MOLoad;
- if (TID.mayStore())
+ if (MCID.mayStore())
Flags |= MachineMemOperand::MOStore;
MachineMemOperand *MMO =
MF.getMachineMemOperand(MachinePointerInfo(
diff --git a/contrib/llvm/lib/Target/SystemZ/SystemZInstrInfo.cpp b/contrib/llvm/lib/Target/SystemZ/SystemZInstrInfo.cpp
index be52803..99e2730 100644
--- a/contrib/llvm/lib/Target/SystemZ/SystemZInstrInfo.cpp
+++ b/contrib/llvm/lib/Target/SystemZ/SystemZInstrInfo.cpp
@@ -16,17 +16,21 @@
#include "SystemZInstrInfo.h"
#include "SystemZMachineFunctionInfo.h"
#include "SystemZTargetMachine.h"
-#include "SystemZGenInstrInfo.inc"
#include "llvm/Function.h"
#include "llvm/CodeGen/MachineFrameInfo.h"
#include "llvm/CodeGen/MachineInstrBuilder.h"
#include "llvm/CodeGen/MachineRegisterInfo.h"
#include "llvm/CodeGen/PseudoSourceValue.h"
+#include "llvm/Target/TargetRegistry.h"
#include "llvm/Support/ErrorHandling.h"
+
+#define GET_INSTRINFO_CTOR
+#include "SystemZGenInstrInfo.inc"
+
using namespace llvm;
SystemZInstrInfo::SystemZInstrInfo(SystemZTargetMachine &tm)
- : TargetInstrInfoImpl(SystemZInsts, array_lengthof(SystemZInsts)),
+ : SystemZGenInstrInfo(SystemZ::ADJCALLSTACKUP, SystemZ::ADJCALLSTACKDOWN),
RI(tm, *this), TM(tm) {
}
@@ -199,13 +203,13 @@ ReverseBranchCondition(SmallVectorImpl<MachineOperand> &Cond) const {
}
bool SystemZInstrInfo::isUnpredicatedTerminator(const MachineInstr *MI) const {
- const TargetInstrDesc &TID = MI->getDesc();
- if (!TID.isTerminator()) return false;
+ const MCInstrDesc &MCID = MI->getDesc();
+ if (!MCID.isTerminator()) return false;
// Conditional branch is a special case.
- if (TID.isBranch() && !TID.isBarrier())
+ if (MCID.isBranch() && !MCID.isBarrier())
return true;
- if (!TID.isPredicable())
+ if (!MCID.isPredicable())
return true;
return !isPredicated(MI);
}
@@ -343,7 +347,7 @@ SystemZInstrInfo::InsertBranch(MachineBasicBlock &MBB, MachineBasicBlock *TBB,
return Count;
}
-const TargetInstrDesc&
+const MCInstrDesc&
SystemZInstrInfo::getBrCond(SystemZCC::CondCodes CC) const {
switch (CC) {
default:
@@ -408,7 +412,7 @@ SystemZInstrInfo::getOppositeCondition(SystemZCC::CondCodes CC) const {
}
}
-const TargetInstrDesc&
+const MCInstrDesc&
SystemZInstrInfo::getLongDispOpc(unsigned Opc) const {
switch (Opc) {
default:
diff --git a/contrib/llvm/lib/Target/SystemZ/SystemZInstrInfo.h b/contrib/llvm/lib/Target/SystemZ/SystemZInstrInfo.h
index 6cb7200..6a31e94 100644
--- a/contrib/llvm/lib/Target/SystemZ/SystemZInstrInfo.h
+++ b/contrib/llvm/lib/Target/SystemZ/SystemZInstrInfo.h
@@ -19,6 +19,9 @@
#include "llvm/ADT/IndexedMap.h"
#include "llvm/Target/TargetInstrInfo.h"
+#define GET_INSTRINFO_HEADER
+#include "SystemZGenInstrInfo.inc"
+
namespace llvm {
class SystemZTargetMachine;
@@ -47,7 +50,7 @@ namespace SystemZII {
};
}
-class SystemZInstrInfo : public TargetInstrInfoImpl {
+class SystemZInstrInfo : public SystemZGenInstrInfo {
const SystemZRegisterInfo RI;
SystemZTargetMachine &TM;
public:
@@ -94,10 +97,10 @@ public:
SystemZCC::CondCodes getOppositeCondition(SystemZCC::CondCodes CC) const;
SystemZCC::CondCodes getCondFromBranchOpc(unsigned Opc) const;
- const TargetInstrDesc& getBrCond(SystemZCC::CondCodes CC) const;
- const TargetInstrDesc& getLongDispOpc(unsigned Opc) const;
+ const MCInstrDesc& getBrCond(SystemZCC::CondCodes CC) const;
+ const MCInstrDesc& getLongDispOpc(unsigned Opc) const;
- const TargetInstrDesc& getMemoryInstr(unsigned Opc, int64_t Offset = 0) const {
+ const MCInstrDesc& getMemoryInstr(unsigned Opc, int64_t Offset = 0) const {
if (Offset < 0 || Offset >= 4096)
return getLongDispOpc(Opc);
else
diff --git a/contrib/llvm/lib/Target/SystemZ/SystemZRegisterInfo.cpp b/contrib/llvm/lib/Target/SystemZ/SystemZRegisterInfo.cpp
index ed62cff..59692e8 100644
--- a/contrib/llvm/lib/Target/SystemZ/SystemZRegisterInfo.cpp
+++ b/contrib/llvm/lib/Target/SystemZ/SystemZRegisterInfo.cpp
@@ -25,12 +25,15 @@
#include "llvm/Target/TargetMachine.h"
#include "llvm/Target/TargetOptions.h"
#include "llvm/ADT/BitVector.h"
+
+#define GET_REGINFO_TARGET_DESC
+#include "SystemZGenRegisterInfo.inc"
+
using namespace llvm;
SystemZRegisterInfo::SystemZRegisterInfo(SystemZTargetMachine &tm,
const SystemZInstrInfo &tii)
- : SystemZGenRegisterInfo(SystemZ::ADJCALLSTACKUP, SystemZ::ADJCALLSTACKDOWN),
- TM(tm), TII(tii) {
+ : SystemZGenRegisterInfo(), TM(tm), TII(tii) {
}
const unsigned*
@@ -51,10 +54,20 @@ BitVector SystemZRegisterInfo::getReservedRegs(const MachineFunction &MF) const
BitVector Reserved(getNumRegs());
const TargetFrameLowering *TFI = MF.getTarget().getFrameLowering();
- if (TFI->hasFP(MF))
+ if (TFI->hasFP(MF)) {
+ // R11D is the frame pointer. Reserve all aliases.
Reserved.set(SystemZ::R11D);
+ Reserved.set(SystemZ::R11W);
+ Reserved.set(SystemZ::R10P);
+ Reserved.set(SystemZ::R10Q);
+ }
+
Reserved.set(SystemZ::R14D);
Reserved.set(SystemZ::R15D);
+ Reserved.set(SystemZ::R14W);
+ Reserved.set(SystemZ::R15W);
+ Reserved.set(SystemZ::R14P);
+ Reserved.set(SystemZ::R14Q);
return Reserved;
}
@@ -143,6 +156,3 @@ int SystemZRegisterInfo::getLLVMRegNum(unsigned DwarfRegNo, bool isEH) const {
assert(0 && "What is the dwarf register number");
return -1;
}
-
-
-#include "SystemZGenRegisterInfo.inc"
diff --git a/contrib/llvm/lib/Target/SystemZ/SystemZRegisterInfo.h b/contrib/llvm/lib/Target/SystemZ/SystemZRegisterInfo.h
index cd8f20f..2e262e1 100644
--- a/contrib/llvm/lib/Target/SystemZ/SystemZRegisterInfo.h
+++ b/contrib/llvm/lib/Target/SystemZ/SystemZRegisterInfo.h
@@ -15,7 +15,9 @@
#define SystemZREGISTERINFO_H
#include "llvm/Target/TargetRegisterInfo.h"
-#include "SystemZGenRegisterInfo.h.inc"
+
+#define GET_REGINFO_HEADER
+#include "SystemZGenRegisterInfo.inc"
namespace llvm {
diff --git a/contrib/llvm/lib/Target/SystemZ/SystemZRegisterInfo.td b/contrib/llvm/lib/Target/SystemZ/SystemZRegisterInfo.td
index 9313ffd..a24cbcf 100644
--- a/contrib/llvm/lib/Target/SystemZ/SystemZRegisterInfo.td
+++ b/contrib/llvm/lib/Target/SystemZ/SystemZRegisterInfo.td
@@ -161,318 +161,45 @@ def F15L : FPRL<15, "f15", [F15S]>;
// Status register
def PSW : SystemZReg<"psw">;
-/// Register classes
-def GR32 : RegisterClass<"SystemZ", [i32], 32,
- // Volatile registers
- [R0W, R1W, R2W, R3W, R4W, R5W, R6W, R7W, R8W, R9W, R10W, R12W, R13W,
- // Frame pointer, sometimes allocable
- R11W,
- // Volatile, but not allocable
- R14W, R15W]>
-{
- let MethodProtos = [{
- iterator allocation_order_begin(const MachineFunction &MF) const;
- iterator allocation_order_end(const MachineFunction &MF) const;
- }];
- let MethodBodies = [{
- static const unsigned SystemZ_REG32[] = {
- SystemZ::R1W, SystemZ::R2W, SystemZ::R3W, SystemZ::R4W,
- SystemZ::R5W, SystemZ::R0W, SystemZ::R12W, SystemZ::R11W,
- SystemZ::R10W, SystemZ::R9W, SystemZ::R8W, SystemZ::R7W,
- SystemZ::R6W, SystemZ::R14W, SystemZ::R13W
- };
- static const unsigned SystemZ_REG32_nofp[] = {
- SystemZ::R1W, SystemZ::R2W, SystemZ::R3W, SystemZ::R4W,
- SystemZ::R5W, SystemZ::R0W, SystemZ::R12W, /* No R11W */
- SystemZ::R10W, SystemZ::R9W, SystemZ::R8W, SystemZ::R7W,
- SystemZ::R6W, SystemZ::R14W, SystemZ::R13W
- };
- GR32Class::iterator
- GR32Class::allocation_order_begin(const MachineFunction &MF) const {
- const TargetMachine &TM = MF.getTarget();
- const TargetFrameLowering *TFI = TM.getFrameLowering();
- if (TFI->hasFP(MF))
- return SystemZ_REG32_nofp;
- else
- return SystemZ_REG32;
- }
- GR32Class::iterator
- GR32Class::allocation_order_end(const MachineFunction &MF) const {
- const TargetMachine &TM = MF.getTarget();
- const TargetFrameLowering *TFI = TM.getFrameLowering();
- if (TFI->hasFP(MF))
- return SystemZ_REG32_nofp + (sizeof(SystemZ_REG32_nofp) / sizeof(unsigned));
- else
- return SystemZ_REG32 + (sizeof(SystemZ_REG32) / sizeof(unsigned));
- }
- }];
-}
+/// Register classes.
+/// Allocate the callee-saved R6-R12 backwards. That way they can be saved
+/// together with R14 and R15 in one prolog instruction.
+def GR32 : RegisterClass<"SystemZ", [i32], 32, (add (sequence "R%uW", 0, 5),
+ (sequence "R%uW", 15, 6))>;
/// Registers used to generate address. Everything except R0.
-def ADDR32 : RegisterClass<"SystemZ", [i32], 32,
- // Volatile registers
- [R1W, R2W, R3W, R4W, R5W, R6W, R7W, R8W, R9W, R10W, R12W, R13W,
- // Frame pointer, sometimes allocable
- R11W,
- // Volatile, but not allocable
- R14W, R15W]>
-{
- let MethodProtos = [{
- iterator allocation_order_begin(const MachineFunction &MF) const;
- iterator allocation_order_end(const MachineFunction &MF) const;
- }];
- let MethodBodies = [{
- static const unsigned SystemZ_ADDR32[] = {
- SystemZ::R1W, SystemZ::R2W, SystemZ::R3W, SystemZ::R4W,
- SystemZ::R5W, /* No R0W */ SystemZ::R12W, SystemZ::R11W,
- SystemZ::R10W, SystemZ::R9W, SystemZ::R8W, SystemZ::R7W,
- SystemZ::R6W, SystemZ::R14W, SystemZ::R13W
- };
- static const unsigned SystemZ_ADDR32_nofp[] = {
- SystemZ::R1W, SystemZ::R2W, SystemZ::R3W, SystemZ::R4W,
- SystemZ::R5W, /* No R0W */ SystemZ::R12W, /* No R11W */
- SystemZ::R10W, SystemZ::R9W, SystemZ::R8W, SystemZ::R7W,
- SystemZ::R6W, SystemZ::R14W, SystemZ::R13W
- };
- ADDR32Class::iterator
- ADDR32Class::allocation_order_begin(const MachineFunction &MF) const {
- const TargetMachine &TM = MF.getTarget();
- const TargetFrameLowering *TFI = TM.getFrameLowering();
- if (TFI->hasFP(MF))
- return SystemZ_ADDR32_nofp;
- else
- return SystemZ_ADDR32;
- }
- ADDR32Class::iterator
- ADDR32Class::allocation_order_end(const MachineFunction &MF) const {
- const TargetMachine &TM = MF.getTarget();
- const TargetFrameLowering *TFI = TM.getFrameLowering();
- if (TFI->hasFP(MF))
- return SystemZ_ADDR32_nofp + (sizeof(SystemZ_ADDR32_nofp) / sizeof(unsigned));
- else
- return SystemZ_ADDR32 + (sizeof(SystemZ_ADDR32) / sizeof(unsigned));
- }
- }];
-}
+def ADDR32 : RegisterClass<"SystemZ", [i32], 32, (sub GR32, R0W)>;
-def GR64 : RegisterClass<"SystemZ", [i64], 64,
- // Volatile registers
- [R0D, R1D, R2D, R3D, R4D, R5D, R6D, R7D, R8D, R9D, R10D, R12D, R13D,
- // Frame pointer, sometimes allocable
- R11D,
- // Volatile, but not allocable
- R14D, R15D]>
-{
+def GR64 : RegisterClass<"SystemZ", [i64], 64, (add (sequence "R%uD", 0, 5),
+ (sequence "R%uD", 15, 6))> {
let SubRegClasses = [(GR32 subreg_32bit)];
- let MethodProtos = [{
- iterator allocation_order_begin(const MachineFunction &MF) const;
- iterator allocation_order_end(const MachineFunction &MF) const;
- }];
- let MethodBodies = [{
- static const unsigned SystemZ_REG64[] = {
- SystemZ::R1D, SystemZ::R2D, SystemZ::R3D, SystemZ::R4D,
- SystemZ::R5D, SystemZ::R0D, SystemZ::R12D, SystemZ::R11D,
- SystemZ::R10D, SystemZ::R9D, SystemZ::R8D, SystemZ::R7D,
- SystemZ::R6D, SystemZ::R14D, SystemZ::R13D
- };
- static const unsigned SystemZ_REG64_nofp[] = {
- SystemZ::R1D, SystemZ::R2D, SystemZ::R3D, SystemZ::R4D,
- SystemZ::R5D, SystemZ::R0D, SystemZ::R12D, /* No R11D */
- SystemZ::R10D, SystemZ::R9D, SystemZ::R8D, SystemZ::R7D,
- SystemZ::R6D, SystemZ::R14D, SystemZ::R13D
- };
- GR64Class::iterator
- GR64Class::allocation_order_begin(const MachineFunction &MF) const {
- const TargetMachine &TM = MF.getTarget();
- const TargetFrameLowering *TFI = TM.getFrameLowering();
- if (TFI->hasFP(MF))
- return SystemZ_REG64_nofp;
- else
- return SystemZ_REG64;
- }
- GR64Class::iterator
- GR64Class::allocation_order_end(const MachineFunction &MF) const {
- const TargetMachine &TM = MF.getTarget();
- const TargetFrameLowering *TFI = TM.getFrameLowering();
- if (TFI->hasFP(MF))
- return SystemZ_REG64_nofp + (sizeof(SystemZ_REG64_nofp) / sizeof(unsigned));
- else
- return SystemZ_REG64 + (sizeof(SystemZ_REG64) / sizeof(unsigned));
- }
- }];
}
-def ADDR64 : RegisterClass<"SystemZ", [i64], 64,
- // Volatile registers
- [R1D, R2D, R3D, R4D, R5D, R6D, R7D, R8D, R9D, R10D, R12D, R13D,
- // Frame pointer, sometimes allocable
- R11D,
- // Volatile, but not allocable
- R14D, R15D]>
-{
+def ADDR64 : RegisterClass<"SystemZ", [i64], 64, (sub GR64, R0D)> {
let SubRegClasses = [(ADDR32 subreg_32bit)];
- let MethodProtos = [{
- iterator allocation_order_begin(const MachineFunction &MF) const;
- iterator allocation_order_end(const MachineFunction &MF) const;
- }];
- let MethodBodies = [{
- static const unsigned SystemZ_ADDR64[] = {
- SystemZ::R1D, SystemZ::R2D, SystemZ::R3D, SystemZ::R4D,
- SystemZ::R5D, /* No R0D */ SystemZ::R12D, SystemZ::R11D,
- SystemZ::R10D, SystemZ::R9D, SystemZ::R8D, SystemZ::R7D,
- SystemZ::R6D, SystemZ::R14D, SystemZ::R13D
- };
- static const unsigned SystemZ_ADDR64_nofp[] = {
- SystemZ::R1D, SystemZ::R2D, SystemZ::R3D, SystemZ::R4D,
- SystemZ::R5D, /* No R0D */ SystemZ::R12D, /* No R11D */
- SystemZ::R10D, SystemZ::R9D, SystemZ::R8D, SystemZ::R7D,
- SystemZ::R6D, SystemZ::R14D, SystemZ::R13D
- };
- ADDR64Class::iterator
- ADDR64Class::allocation_order_begin(const MachineFunction &MF) const {
- const TargetMachine &TM = MF.getTarget();
- const TargetFrameLowering *TFI = TM.getFrameLowering();
- if (TFI->hasFP(MF))
- return SystemZ_ADDR64_nofp;
- else
- return SystemZ_ADDR64;
- }
- ADDR64Class::iterator
- ADDR64Class::allocation_order_end(const MachineFunction &MF) const {
- const TargetMachine &TM = MF.getTarget();
- const TargetFrameLowering *TFI = TM.getFrameLowering();
- if (TFI->hasFP(MF))
- return SystemZ_ADDR64_nofp + (sizeof(SystemZ_ADDR64_nofp) / sizeof(unsigned));
- else
- return SystemZ_ADDR64 + (sizeof(SystemZ_ADDR64) / sizeof(unsigned));
- }
- }];
}
// Even-odd register pairs
-def GR64P : RegisterClass<"SystemZ", [v2i32], 64,
- [R0P, R2P, R4P, R6P, R8P, R10P, R12P, R14P]>
-{
+def GR64P : RegisterClass<"SystemZ", [v2i32], 64, (add R0P, R2P, R4P,
+ R12P, R10P, R8P, R6P,
+ R14P)> {
let SubRegClasses = [(GR32 subreg_32bit, subreg_odd32)];
- let MethodProtos = [{
- iterator allocation_order_begin(const MachineFunction &MF) const;
- iterator allocation_order_end(const MachineFunction &MF) const;
- }];
- let MethodBodies = [{
- static const unsigned SystemZ_REG64P[] = {
- SystemZ::R0P, SystemZ::R2P, SystemZ::R4P, SystemZ::R10P,
- SystemZ::R8P, SystemZ::R6P };
- static const unsigned SystemZ_REG64P_nofp[] = {
- SystemZ::R0P, SystemZ::R2P, SystemZ::R4P, /* NO R10P */
- SystemZ::R8P, SystemZ::R6P };
- GR64PClass::iterator
- GR64PClass::allocation_order_begin(const MachineFunction &MF) const {
- const TargetMachine &TM = MF.getTarget();
- const TargetFrameLowering *TFI = TM.getFrameLowering();
- if (TFI->hasFP(MF))
- return SystemZ_REG64P_nofp;
- else
- return SystemZ_REG64P;
- }
- GR64PClass::iterator
- GR64PClass::allocation_order_end(const MachineFunction &MF) const {
- const TargetMachine &TM = MF.getTarget();
- const TargetFrameLowering *TFI = TM.getFrameLowering();
- if (TFI->hasFP(MF))
- return SystemZ_REG64P_nofp + (sizeof(SystemZ_REG64P_nofp) / sizeof(unsigned));
- else
- return SystemZ_REG64P + (sizeof(SystemZ_REG64P) / sizeof(unsigned));
- }
- }];
}
-def GR128 : RegisterClass<"SystemZ", [v2i64], 128,
- [R0Q, R2Q, R4Q, R6Q, R8Q, R10Q, R12Q, R14Q]>
-{
+def GR128 : RegisterClass<"SystemZ", [v2i64], 128, (add R0Q, R2Q, R4Q,
+ R12Q, R10Q, R8Q, R6Q,
+ R14Q)> {
let SubRegClasses = [(GR32 subreg_32bit, subreg_odd32),
- (GR64 subreg_even, subreg_odd)];
- let MethodProtos = [{
- iterator allocation_order_begin(const MachineFunction &MF) const;
- iterator allocation_order_end(const MachineFunction &MF) const;
- }];
- let MethodBodies = [{
- static const unsigned SystemZ_REG128[] = {
- SystemZ::R0Q, SystemZ::R2Q, SystemZ::R4Q, SystemZ::R10Q,
- SystemZ::R8Q, SystemZ::R6Q };
- static const unsigned SystemZ_REG128_nofp[] = {
- SystemZ::R0Q, SystemZ::R2Q, SystemZ::R4Q, /* NO R10Q */
- SystemZ::R8Q, SystemZ::R6Q };
- GR128Class::iterator
- GR128Class::allocation_order_begin(const MachineFunction &MF) const {
- const TargetMachine &TM = MF.getTarget();
- const TargetFrameLowering *TFI = TM.getFrameLowering();
- if (TFI->hasFP(MF))
- return SystemZ_REG128_nofp;
- else
- return SystemZ_REG128;
- }
- GR128Class::iterator
- GR128Class::allocation_order_end(const MachineFunction &MF) const {
- const TargetMachine &TM = MF.getTarget();
- const TargetFrameLowering *TFI = TM.getFrameLowering();
- if (TFI->hasFP(MF))
- return SystemZ_REG128_nofp + (sizeof(SystemZ_REG128_nofp) / sizeof(unsigned));
- else
- return SystemZ_REG128 + (sizeof(SystemZ_REG128) / sizeof(unsigned));
- }
- }];
+ (GR64 subreg_even, subreg_odd)];
}
-def FP32 : RegisterClass<"SystemZ", [f32], 32,
- [F0S, F1S, F2S, F3S, F4S, F5S, F6S, F7S,
- F8S, F9S, F10S, F11S, F12S, F13S, F14S, F15S]> {
- let MethodProtos = [{
- iterator allocation_order_begin(const MachineFunction &MF) const;
- iterator allocation_order_end(const MachineFunction &MF) const;
- }];
- let MethodBodies = [{
- static const unsigned SystemZ_REGFP32[] = {
- SystemZ::F0S, SystemZ::F2S, SystemZ::F4S, SystemZ::F6S,
- SystemZ::F1S, SystemZ::F3S, SystemZ::F5S, SystemZ::F7S,
- SystemZ::F8S, SystemZ::F9S, SystemZ::F10S, SystemZ::F11S,
- SystemZ::F12S, SystemZ::F13S, SystemZ::F14S, SystemZ::F15S };
- FP32Class::iterator
- FP32Class::allocation_order_begin(const MachineFunction &MF) const {
- return SystemZ_REGFP32;
- }
- FP32Class::iterator
- FP32Class::allocation_order_end(const MachineFunction &MF) const {
- return SystemZ_REGFP32 + (sizeof(SystemZ_REGFP32) / sizeof(unsigned));
- }
- }];
-}
+def FP32 : RegisterClass<"SystemZ", [f32], 32, (sequence "F%uS", 0, 15)>;
-def FP64 : RegisterClass<"SystemZ", [f64], 64,
- [F0L, F1L, F2L, F3L, F4L, F5L, F6L, F7L,
- F8L, F9L, F10L, F11L, F12L, F13L, F14L, F15L]> {
+def FP64 : RegisterClass<"SystemZ", [f64], 64, (sequence "F%uL", 0, 15)> {
let SubRegClasses = [(FP32 subreg_32bit)];
- let MethodProtos = [{
- iterator allocation_order_begin(const MachineFunction &MF) const;
- iterator allocation_order_end(const MachineFunction &MF) const;
- }];
- let MethodBodies = [{
- static const unsigned SystemZ_REGFP64[] = {
- SystemZ::F0L, SystemZ::F2L, SystemZ::F4L, SystemZ::F6L,
- SystemZ::F1L, SystemZ::F3L, SystemZ::F5L, SystemZ::F7L,
- SystemZ::F8L, SystemZ::F9L, SystemZ::F10L, SystemZ::F11L,
- SystemZ::F12L, SystemZ::F13L, SystemZ::F14L, SystemZ::F15L };
- FP64Class::iterator
- FP64Class::allocation_order_begin(const MachineFunction &MF) const {
- return SystemZ_REGFP64;
- }
- FP64Class::iterator
- FP64Class::allocation_order_end(const MachineFunction &MF) const {
- return SystemZ_REGFP64 + (sizeof(SystemZ_REGFP64) / sizeof(unsigned));
- }
- }];
}
// Status flags registers.
-def CCR : RegisterClass<"SystemZ", [i64], 64, [PSW]> {
+def CCR : RegisterClass<"SystemZ", [i64], 64, (add PSW)> {
let CopyCost = -1; // Don't allow copying of status registers.
}
diff --git a/contrib/llvm/lib/Target/SystemZ/SystemZSubtarget.cpp b/contrib/llvm/lib/Target/SystemZ/SystemZSubtarget.cpp
index a8b5e1f..b3ed066 100644
--- a/contrib/llvm/lib/Target/SystemZ/SystemZSubtarget.cpp
+++ b/contrib/llvm/lib/Target/SystemZ/SystemZSubtarget.cpp
@@ -7,25 +7,32 @@
//
//===----------------------------------------------------------------------===//
//
-// This file implements the SystemZ specific subclass of TargetSubtarget.
+// This file implements the SystemZ specific subclass of TargetSubtargetInfo.
//
//===----------------------------------------------------------------------===//
#include "SystemZSubtarget.h"
#include "SystemZ.h"
-#include "SystemZGenSubtarget.inc"
#include "llvm/GlobalValue.h"
#include "llvm/Target/TargetMachine.h"
+#include "llvm/Target/TargetRegistry.h"
+
+#define GET_SUBTARGETINFO_TARGET_DESC
+#define GET_SUBTARGETINFO_CTOR
+#include "SystemZGenSubtargetInfo.inc"
using namespace llvm;
SystemZSubtarget::SystemZSubtarget(const std::string &TT,
+ const std::string &CPU,
const std::string &FS):
- HasZ10Insts(false) {
- std::string CPU = "z9";
+ SystemZGenSubtargetInfo(TT, CPU, FS), HasZ10Insts(false) {
+ std::string CPUName = CPU;
+ if (CPUName.empty())
+ CPUName = "z9";
// Parse features string.
- ParseSubtargetFeatures(FS, CPU);
+ ParseSubtargetFeatures(CPUName, FS);
}
/// True if accessing the GV requires an extra load.
diff --git a/contrib/llvm/lib/Target/SystemZ/SystemZSubtarget.h b/contrib/llvm/lib/Target/SystemZ/SystemZSubtarget.h
index 405d6e9..55cfd80 100644
--- a/contrib/llvm/lib/Target/SystemZ/SystemZSubtarget.h
+++ b/contrib/llvm/lib/Target/SystemZ/SystemZSubtarget.h
@@ -7,33 +7,36 @@
//
//===----------------------------------------------------------------------===//
//
-// This file declares the SystemZ specific subclass of TargetSubtarget.
+// This file declares the SystemZ specific subclass of TargetSubtargetInfo.
//
//===----------------------------------------------------------------------===//
#ifndef LLVM_TARGET_SystemZ_SUBTARGET_H
#define LLVM_TARGET_SystemZ_SUBTARGET_H
-#include "llvm/Target/TargetSubtarget.h"
-
+#include "llvm/Target/TargetSubtargetInfo.h"
#include <string>
+#define GET_SUBTARGETINFO_HEADER
+#include "SystemZGenSubtargetInfo.inc"
+
namespace llvm {
class GlobalValue;
+class StringRef;
class TargetMachine;
-class SystemZSubtarget : public TargetSubtarget {
+class SystemZSubtarget : public SystemZGenSubtargetInfo {
bool HasZ10Insts;
public:
/// This constructor initializes the data members to match that
/// of the specified triple.
///
- SystemZSubtarget(const std::string &TT, const std::string &FS);
+ SystemZSubtarget(const std::string &TT, const std::string &CPU,
+ const std::string &FS);
/// ParseSubtargetFeatures - Parses features string setting specified
/// subtarget options. Definition of function is auto generated by tblgen.
- std::string ParseSubtargetFeatures(const std::string &FS,
- const std::string &CPU);
+ void ParseSubtargetFeatures(StringRef CPU, StringRef FS);
bool isZ10() const { return HasZ10Insts; }
diff --git a/contrib/llvm/lib/Target/SystemZ/SystemZTargetMachine.cpp b/contrib/llvm/lib/Target/SystemZ/SystemZTargetMachine.cpp
index 1603899..48298cc 100644
--- a/contrib/llvm/lib/Target/SystemZ/SystemZTargetMachine.cpp
+++ b/contrib/llvm/lib/Target/SystemZ/SystemZTargetMachine.cpp
@@ -7,7 +7,6 @@
//
//===----------------------------------------------------------------------===//
-#include "SystemZMCAsmInfo.h"
#include "SystemZTargetMachine.h"
#include "SystemZ.h"
#include "llvm/PassManager.h"
@@ -17,16 +16,16 @@ using namespace llvm;
extern "C" void LLVMInitializeSystemZTarget() {
// Register the target.
RegisterTargetMachine<SystemZTargetMachine> X(TheSystemZTarget);
- RegisterAsmInfo<SystemZMCAsmInfo> Y(TheSystemZTarget);
}
/// SystemZTargetMachine ctor - Create an ILP64 architecture model
///
SystemZTargetMachine::SystemZTargetMachine(const Target &T,
const std::string &TT,
+ const std::string &CPU,
const std::string &FS)
- : LLVMTargetMachine(T, TT),
- Subtarget(TT, FS),
+ : LLVMTargetMachine(T, TT, CPU, FS),
+ Subtarget(TT, CPU, FS),
DataLayout("E-p:64:64:64-i8:8:16-i16:16:16-i32:32:32-i64:64:64-f32:32:32"
"-f64:64:64-f128:128:128-a0:16:16-n32:64"),
InstrInfo(*this), TLInfo(*this), TSInfo(*this),
diff --git a/contrib/llvm/lib/Target/SystemZ/SystemZTargetMachine.h b/contrib/llvm/lib/Target/SystemZ/SystemZTargetMachine.h
index 524f83d..e40b556 100644
--- a/contrib/llvm/lib/Target/SystemZ/SystemZTargetMachine.h
+++ b/contrib/llvm/lib/Target/SystemZ/SystemZTargetMachine.h
@@ -38,7 +38,7 @@ class SystemZTargetMachine : public LLVMTargetMachine {
SystemZFrameLowering FrameLowering;
public:
SystemZTargetMachine(const Target &T, const std::string &TT,
- const std::string &FS);
+ const std::string &CPU, const std::string &FS);
virtual const TargetFrameLowering *getFrameLowering() const {
return &FrameLowering;
diff --git a/contrib/llvm/lib/Target/Target.cpp b/contrib/llvm/lib/Target/Target.cpp
index 0919fe4..a42ce54 100644
--- a/contrib/llvm/lib/Target/Target.cpp
+++ b/contrib/llvm/lib/Target/Target.cpp
@@ -97,10 +97,6 @@ unsigned long long LLVMOffsetOfElement(LLVMTargetDataRef TD, LLVMTypeRef StructT
return unwrap(TD)->getStructLayout(STy)->getElementOffset(Element);
}
-void LLVMInvalidateStructLayout(LLVMTargetDataRef TD, LLVMTypeRef StructTy) {
- unwrap(TD)->InvalidateStructLayoutInfo(unwrap<StructType>(StructTy));
-}
-
void LLVMDisposeTargetData(LLVMTargetDataRef TD) {
delete unwrap(TD);
}
diff --git a/contrib/llvm/lib/Target/TargetAsmInfo.cpp b/contrib/llvm/lib/Target/TargetAsmInfo.cpp
index 6fa5420..a97b0e8 100644
--- a/contrib/llvm/lib/Target/TargetAsmInfo.cpp
+++ b/contrib/llvm/lib/Target/TargetAsmInfo.cpp
@@ -17,11 +17,7 @@ using namespace llvm;
TargetAsmInfo::TargetAsmInfo(const TargetMachine &TM) {
TLOF = &TM.getTargetLowering()->getObjFileLowering();
- const TargetData &TD = *TM.getTargetData();
- IsLittleEndian = TD.isLittleEndian();
- PointerSize = TD.getPointerSize();
- const TargetFrameLowering &TFI = *TM.getFrameLowering();
- StackDir = TFI.getStackGrowthDirection();
+ TFI = TM.getFrameLowering();
TRI = TM.getRegisterInfo();
- TFI.getInitialFrameState(InitialFrameState);
+ TFI->getInitialFrameState(InitialFrameState);
}
diff --git a/contrib/llvm/lib/Target/TargetData.cpp b/contrib/llvm/lib/Target/TargetData.cpp
index 1990bc7..17d022a 100644
--- a/contrib/llvm/lib/Target/TargetData.cpp
+++ b/contrib/llvm/lib/Target/TargetData.cpp
@@ -42,6 +42,7 @@ char TargetData::ID = 0;
//===----------------------------------------------------------------------===//
StructLayout::StructLayout(const StructType *ST, const TargetData &TD) {
+ assert(!ST->isOpaque() && "Cannot get layout of opaque structs");
StructAlignment = 0;
StructSize = 0;
NumElements = ST->getNumElements();
@@ -313,63 +314,21 @@ unsigned TargetData::getAlignmentInfo(AlignTypeEnum AlignType,
namespace {
-class StructLayoutMap : public AbstractTypeUser {
+class StructLayoutMap {
typedef DenseMap<const StructType*, StructLayout*> LayoutInfoTy;
LayoutInfoTy LayoutInfo;
- void RemoveEntry(LayoutInfoTy::iterator I, bool WasAbstract) {
- I->second->~StructLayout();
- free(I->second);
- if (WasAbstract)
- I->first->removeAbstractTypeUser(this);
- LayoutInfo.erase(I);
- }
-
-
- /// refineAbstractType - The callback method invoked when an abstract type is
- /// resolved to another type. An object must override this method to update
- /// its internal state to reference NewType instead of OldType.
- ///
- virtual void refineAbstractType(const DerivedType *OldTy,
- const Type *) {
- LayoutInfoTy::iterator I = LayoutInfo.find(cast<const StructType>(OldTy));
- assert(I != LayoutInfo.end() && "Using type but not in map?");
- RemoveEntry(I, true);
- }
-
- /// typeBecameConcrete - The other case which AbstractTypeUsers must be aware
- /// of is when a type makes the transition from being abstract (where it has
- /// clients on its AbstractTypeUsers list) to concrete (where it does not).
- /// This method notifies ATU's when this occurs for a type.
- ///
- virtual void typeBecameConcrete(const DerivedType *AbsTy) {
- LayoutInfoTy::iterator I = LayoutInfo.find(cast<const StructType>(AbsTy));
- assert(I != LayoutInfo.end() && "Using type but not in map?");
- RemoveEntry(I, true);
- }
-
public:
virtual ~StructLayoutMap() {
// Remove any layouts.
- for (LayoutInfoTy::iterator
- I = LayoutInfo.begin(), E = LayoutInfo.end(); I != E; ++I) {
- const Type *Key = I->first;
+ for (LayoutInfoTy::iterator I = LayoutInfo.begin(), E = LayoutInfo.end();
+ I != E; ++I) {
StructLayout *Value = I->second;
-
- if (Key->isAbstract())
- Key->removeAbstractTypeUser(this);
-
Value->~StructLayout();
free(Value);
}
}
- void InvalidateEntry(const StructType *Ty) {
- LayoutInfoTy::iterator I = LayoutInfo.find(Ty);
- if (I == LayoutInfo.end()) return;
- RemoveEntry(I, Ty->isAbstract());
- }
-
StructLayout *&operator[](const StructType *STy) {
return LayoutInfo[STy];
}
@@ -404,22 +363,9 @@ const StructLayout *TargetData::getStructLayout(const StructType *Ty) const {
new (L) StructLayout(Ty, *this);
- if (Ty->isAbstract())
- Ty->addAbstractTypeUser(STM);
-
return L;
}
-/// InvalidateStructLayoutInfo - TargetData speculatively caches StructLayout
-/// objects. If a TargetData object is alive when types are being refined and
-/// removed, this method must be called whenever a StructType is removed to
-/// avoid a dangling pointer in this cache.
-void TargetData::InvalidateStructLayoutInfo(const StructType *Ty) const {
- if (!LayoutMap) return; // No cache.
-
- static_cast<StructLayoutMap*>(LayoutMap)->InvalidateEntry(Ty);
-}
-
std::string TargetData::getStringRepresentation() const {
std::string Result;
raw_string_ostream OS(Result);
@@ -570,7 +516,7 @@ unsigned TargetData::getPreferredTypeAlignmentShift(const Type *Ty) const {
/// getIntPtrType - Return an unsigned integer type that is the same size or
/// greater to the host pointer size.
-const IntegerType *TargetData::getIntPtrType(LLVMContext &C) const {
+IntegerType *TargetData::getIntPtrType(LLVMContext &C) const {
return IntegerType::get(C, getPointerSizeInBits());
}
diff --git a/contrib/llvm/lib/Target/TargetInstrInfo.cpp b/contrib/llvm/lib/Target/TargetInstrInfo.cpp
index d4b7697..d52ecb3 100644
--- a/contrib/llvm/lib/Target/TargetInstrInfo.cpp
+++ b/contrib/llvm/lib/Target/TargetInstrInfo.cpp
@@ -12,44 +12,39 @@
//===----------------------------------------------------------------------===//
#include "llvm/Target/TargetInstrInfo.h"
-#include "llvm/Target/TargetInstrItineraries.h"
#include "llvm/Target/TargetRegisterInfo.h"
#include "llvm/CodeGen/SelectionDAGNodes.h"
#include "llvm/MC/MCAsmInfo.h"
+#include "llvm/MC/MCInstrItineraries.h"
#include "llvm/Support/ErrorHandling.h"
#include <cctype>
using namespace llvm;
//===----------------------------------------------------------------------===//
-// TargetOperandInfo
+// TargetInstrInfo
//===----------------------------------------------------------------------===//
-/// getRegClass - Get the register class for the operand, handling resolution
-/// of "symbolic" pointer register classes etc. If this is not a register
-/// operand, this returns null.
-const TargetRegisterClass *
-TargetOperandInfo::getRegClass(const TargetRegisterInfo *TRI) const {
- if (isLookupPtrRegClass())
+TargetInstrInfo::~TargetInstrInfo() {
+}
+
+const TargetRegisterClass*
+TargetInstrInfo::getRegClass(const MCInstrDesc &MCID, unsigned OpNum,
+ const TargetRegisterInfo *TRI) const {
+ if (OpNum >= MCID.getNumOperands())
+ return 0;
+
+ short RegClass = MCID.OpInfo[OpNum].RegClass;
+ if (MCID.OpInfo[OpNum].isLookupPtrRegClass())
return TRI->getPointerRegClass(RegClass);
+
// Instructions like INSERT_SUBREG do not have fixed register classes.
if (RegClass < 0)
return 0;
+
// Otherwise just look it up normally.
return TRI->getRegClass(RegClass);
}
-//===----------------------------------------------------------------------===//
-// TargetInstrInfo
-//===----------------------------------------------------------------------===//
-
-TargetInstrInfo::TargetInstrInfo(const TargetInstrDesc* Desc,
- unsigned numOpcodes)
- : Descriptors(Desc), NumOpcodes(numOpcodes) {
-}
-
-TargetInstrInfo::~TargetInstrInfo() {
-}
-
unsigned
TargetInstrInfo::getNumMicroOps(const InstrItineraryData *ItinData,
const MachineInstr *MI) const {
@@ -135,13 +130,13 @@ void TargetInstrInfo::insertNoop(MachineBasicBlock &MBB,
bool TargetInstrInfo::isUnpredicatedTerminator(const MachineInstr *MI) const {
- const TargetInstrDesc &TID = MI->getDesc();
- if (!TID.isTerminator()) return false;
+ const MCInstrDesc &MCID = MI->getDesc();
+ if (!MCID.isTerminator()) return false;
// Conditional branch is a special case.
- if (TID.isBranch() && !TID.isBarrier())
+ if (MCID.isBranch() && !MCID.isBarrier())
return true;
- if (!TID.isPredicable())
+ if (!MCID.isPredicable())
return true;
return !isPredicated(MI);
}
diff --git a/contrib/llvm/lib/Target/TargetLoweringObjectFile.cpp b/contrib/llvm/lib/Target/TargetLoweringObjectFile.cpp
index 3343384..703431b 100644
--- a/contrib/llvm/lib/Target/TargetLoweringObjectFile.cpp
+++ b/contrib/llvm/lib/Target/TargetLoweringObjectFile.cpp
@@ -35,38 +35,39 @@ using namespace llvm;
// Generic Code
//===----------------------------------------------------------------------===//
-TargetLoweringObjectFile::TargetLoweringObjectFile() : Ctx(0) {
- TextSection = 0;
- DataSection = 0;
- BSSSection = 0;
- ReadOnlySection = 0;
- StaticCtorSection = 0;
- StaticDtorSection = 0;
- LSDASection = 0;
-
- CommDirectiveSupportsAlignment = true;
- DwarfAbbrevSection = 0;
- DwarfInfoSection = 0;
- DwarfLineSection = 0;
- DwarfFrameSection = 0;
- DwarfPubNamesSection = 0;
- DwarfPubTypesSection = 0;
- DwarfDebugInlineSection = 0;
- DwarfStrSection = 0;
- DwarfLocSection = 0;
- DwarfARangesSection = 0;
- DwarfRangesSection = 0;
- DwarfMacroInfoSection = 0;
-
- IsFunctionEHFrameSymbolPrivate = true;
- SupportsWeakOmittedEHFrame = true;
+TargetLoweringObjectFile::TargetLoweringObjectFile() :
+ Ctx(0),
+ TextSection(0),
+ DataSection(0),
+ BSSSection(0),
+ ReadOnlySection(0),
+ StaticCtorSection(0),
+ StaticDtorSection(0),
+ LSDASection(0),
+ CompactUnwindSection(0),
+ DwarfAbbrevSection(0),
+ DwarfInfoSection(0),
+ DwarfLineSection(0),
+ DwarfFrameSection(0),
+ DwarfPubNamesSection(0),
+ DwarfPubTypesSection(0),
+ DwarfDebugInlineSection(0),
+ DwarfStrSection(0),
+ DwarfLocSection(0),
+ DwarfARangesSection(0),
+ DwarfRangesSection(0),
+ DwarfMacroInfoSection(0),
+ TLSExtraDataSection(0),
+ CommDirectiveSupportsAlignment(true),
+ SupportsWeakOmittedEHFrame(true),
+ IsFunctionEHFrameSymbolPrivate(true) {
}
TargetLoweringObjectFile::~TargetLoweringObjectFile() {
}
static bool isSuitableForBSS(const GlobalVariable *GV) {
- Constant *C = GV->getInitializer();
+ const Constant *C = GV->getInitializer();
// Must have zero initializer.
if (!C->isNullValue())
@@ -168,7 +169,7 @@ SectionKind TargetLoweringObjectFile::getKindForGlobal(const GlobalValue *GV,
return SectionKind::getBSS();
}
- Constant *C = GVar->getInitializer();
+ const Constant *C = GVar->getInitializer();
// If the global is marked constant, we can put it into a mergable section,
// a mergable string section, or general .data if it contains relocations.
diff --git a/contrib/llvm/lib/Target/TargetMachine.cpp b/contrib/llvm/lib/Target/TargetMachine.cpp
index 863b811..74a1f4e 100644
--- a/contrib/llvm/lib/Target/TargetMachine.cpp
+++ b/contrib/llvm/lib/Target/TargetMachine.cpp
@@ -43,7 +43,7 @@ namespace llvm {
Reloc::Model RelocationModel;
CodeModel::Model CMModel;
bool GuaranteedTailCallOpt;
- unsigned StackAlignment;
+ unsigned StackAlignmentOverride;
bool RealignStack;
bool DisableJumpTables;
bool StrongPHIElim;
@@ -183,7 +183,7 @@ EnableGuaranteedTailCallOpt("tailcallopt",
static cl::opt<unsigned, true>
OverrideStackAlignment("stack-alignment",
cl::desc("Override default stack alignment"),
- cl::location(StackAlignment),
+ cl::location(StackAlignmentOverride),
cl::init(0));
static cl::opt<bool, true>
EnableRealignStack("realign-stack",
@@ -216,8 +216,9 @@ FunctionSections("ffunction-sections",
// TargetMachine Class
//
-TargetMachine::TargetMachine(const Target &T)
- : TheTarget(T), AsmInfo(0),
+TargetMachine::TargetMachine(const Target &T,
+ StringRef TT, StringRef CPU, StringRef FS)
+ : TheTarget(T), TargetTriple(TT), TargetCPU(CPU), TargetFS(FS), AsmInfo(0),
MCRelaxAll(false),
MCNoExecStack(false),
MCSaveTempLabels(false),
diff --git a/contrib/llvm/lib/Target/TargetRegisterInfo.cpp b/contrib/llvm/lib/Target/TargetRegisterInfo.cpp
index 1c3f2dd..90a8f8d 100644
--- a/contrib/llvm/lib/Target/TargetRegisterInfo.cpp
+++ b/contrib/llvm/lib/Target/TargetRegisterInfo.cpp
@@ -20,21 +20,11 @@
using namespace llvm;
-TargetRegisterInfo::TargetRegisterInfo(const TargetRegisterDesc *D, unsigned NR,
+TargetRegisterInfo::TargetRegisterInfo(const TargetRegisterInfoDesc *ID,
regclass_iterator RCB, regclass_iterator RCE,
- const char *const *subregindexnames,
- int CFSO, int CFDO,
- const unsigned* subregs, const unsigned subregsize,
- const unsigned* aliases, const unsigned aliasessize)
- : SubregHash(subregs), SubregHashSize(subregsize),
- AliasesHash(aliases), AliasesHashSize(aliasessize),
- Desc(D), SubRegIndexNames(subregindexnames), NumRegs(NR),
+ const char *const *subregindexnames)
+ : InfoDesc(ID), SubRegIndexNames(subregindexnames),
RegClassBegin(RCB), RegClassEnd(RCE) {
- assert(isPhysicalRegister(NumRegs) &&
- "Target has too many physical registers!");
-
- CallFrameSetupOpcode = CFSO;
- CallFrameDestroyOpcode = CFDO;
}
TargetRegisterInfo::~TargetRegisterInfo() {}
@@ -83,14 +73,14 @@ TargetRegisterInfo::getMinimalPhysRegClass(unsigned reg, EVT VT) const {
/// registers for the specific register class.
static void getAllocatableSetForRC(const MachineFunction &MF,
const TargetRegisterClass *RC, BitVector &R){
- for (TargetRegisterClass::iterator I = RC->allocation_order_begin(MF),
- E = RC->allocation_order_end(MF); I != E; ++I)
- R.set(*I);
+ ArrayRef<unsigned> Order = RC->getRawAllocationOrder(MF);
+ for (unsigned i = 0; i != Order.size(); ++i)
+ R.set(Order[i]);
}
BitVector TargetRegisterInfo::getAllocatableSet(const MachineFunction &MF,
const TargetRegisterClass *RC) const {
- BitVector Allocatable(NumRegs);
+ BitVector Allocatable(getNumRegs());
if (RC) {
getAllocatableSetForRC(MF, RC, Allocatable);
} else {
diff --git a/contrib/llvm/lib/Target/TargetSubtarget.cpp b/contrib/llvm/lib/Target/TargetSubtargetInfo.cpp
index edb76f9..59ffdea 100644
--- a/contrib/llvm/lib/Target/TargetSubtarget.cpp
+++ b/contrib/llvm/lib/Target/TargetSubtargetInfo.cpp
@@ -1,4 +1,4 @@
-//===-- TargetSubtarget.cpp - General Target Information -------------------==//
+//===-- TargetSubtargetInfo.cpp - General Target Information ---------------==//
//
// The LLVM Compiler Infrastructure
//
@@ -11,18 +11,18 @@
//
//===----------------------------------------------------------------------===//
-#include "llvm/Target/TargetSubtarget.h"
+#include "llvm/Target/TargetSubtargetInfo.h"
#include "llvm/ADT/SmallVector.h"
using namespace llvm;
//---------------------------------------------------------------------------
-// TargetSubtarget Class
+// TargetSubtargetInfo Class
//
-TargetSubtarget::TargetSubtarget() {}
+TargetSubtargetInfo::TargetSubtargetInfo() {}
-TargetSubtarget::~TargetSubtarget() {}
+TargetSubtargetInfo::~TargetSubtargetInfo() {}
-bool TargetSubtarget::enablePostRAScheduler(
+bool TargetSubtargetInfo::enablePostRAScheduler(
CodeGenOpt::Level OptLevel,
AntiDepBreakMode& Mode,
RegClassVector& CriticalPathRCs) const {
diff --git a/contrib/llvm/lib/Target/X86/AsmParser/X86AsmParser.cpp b/contrib/llvm/lib/Target/X86/AsmParser/X86AsmParser.cpp
index c352bfc..d45dd35 100644
--- a/contrib/llvm/lib/Target/X86/AsmParser/X86AsmParser.cpp
+++ b/contrib/llvm/lib/Target/X86/AsmParser/X86AsmParser.cpp
@@ -15,9 +15,11 @@
#include "llvm/MC/MCStreamer.h"
#include "llvm/MC/MCExpr.h"
#include "llvm/MC/MCInst.h"
+#include "llvm/MC/MCSubtargetInfo.h"
#include "llvm/MC/MCParser/MCAsmLexer.h"
#include "llvm/MC/MCParser/MCAsmParser.h"
#include "llvm/MC/MCParser/MCParsedAsmOperand.h"
+#include "llvm/ADT/OwningPtr.h"
#include "llvm/ADT/SmallString.h"
#include "llvm/ADT/SmallVector.h"
#include "llvm/ADT/StringExtras.h"
@@ -25,17 +27,15 @@
#include "llvm/ADT/Twine.h"
#include "llvm/Support/SourceMgr.h"
#include "llvm/Support/raw_ostream.h"
+
using namespace llvm;
namespace {
struct X86Operand;
class X86ATTAsmParser : public TargetAsmParser {
+ MCSubtargetInfo &STI;
MCAsmParser &Parser;
- TargetMachine &TM;
-
-protected:
- unsigned Is64Bit : 1;
private:
MCAsmParser &getParser() const { return Parser; }
@@ -61,6 +61,11 @@ private:
/// or %es:(%edi) in 32bit mode.
bool isDstOp(X86Operand &Op);
+ bool is64BitMode() const {
+ // FIXME: Can tablegen auto-generate this?
+ return (STI.getFeatureBits() & X86::Mode64Bit) != 0;
+ }
+
/// @name Auto-generated Matcher Functions
/// {
@@ -70,12 +75,11 @@ private:
/// }
public:
- X86ATTAsmParser(const Target &T, MCAsmParser &parser, TargetMachine &TM)
- : TargetAsmParser(T), Parser(parser), TM(TM) {
+ X86ATTAsmParser(MCSubtargetInfo &sti, MCAsmParser &parser)
+ : TargetAsmParser(), STI(sti), Parser(parser) {
// Initialize the set of available features.
- setAvailableFeatures(ComputeAvailableFeatures(
- &TM.getSubtarget<X86Subtarget>()));
+ setAvailableFeatures(ComputeAvailableFeatures(STI.getFeatureBits()));
}
virtual bool ParseRegister(unsigned &RegNo, SMLoc &StartLoc, SMLoc &EndLoc);
@@ -84,23 +88,6 @@ public:
virtual bool ParseDirective(AsmToken DirectiveID);
};
-
-class X86_32ATTAsmParser : public X86ATTAsmParser {
-public:
- X86_32ATTAsmParser(const Target &T, MCAsmParser &Parser, TargetMachine &TM)
- : X86ATTAsmParser(T, Parser, TM) {
- Is64Bit = false;
- }
-};
-
-class X86_64ATTAsmParser : public X86ATTAsmParser {
-public:
- X86_64ATTAsmParser(const Target &T, MCAsmParser &Parser, TargetMachine &TM)
- : X86ATTAsmParser(T, Parser, TM) {
- Is64Bit = true;
- }
-};
-
} // end anonymous namespace
/// @name Auto-generated Match Functions
@@ -155,7 +142,7 @@ struct X86Operand : public MCParsedAsmOperand {
/// getEndLoc - Get the location of the last token of this operand.
SMLoc getEndLoc() const { return EndLoc; }
- virtual void dump(raw_ostream &OS) const {}
+ virtual void print(raw_ostream &OS) const {}
StringRef getToken() const {
assert(Kind == Token && "Invalid access!");
@@ -365,7 +352,7 @@ struct X86Operand : public MCParsedAsmOperand {
} // end anonymous namespace.
bool X86ATTAsmParser::isSrcOp(X86Operand &Op) {
- unsigned basereg = Is64Bit ? X86::RSI : X86::ESI;
+ unsigned basereg = is64BitMode() ? X86::RSI : X86::ESI;
return (Op.isMem() &&
(Op.Mem.SegReg == 0 || Op.Mem.SegReg == X86::DS) &&
@@ -375,7 +362,7 @@ bool X86ATTAsmParser::isSrcOp(X86Operand &Op) {
}
bool X86ATTAsmParser::isDstOp(X86Operand &Op) {
- unsigned basereg = Is64Bit ? X86::RDI : X86::EDI;
+ unsigned basereg = is64BitMode() ? X86::RDI : X86::EDI;
return Op.isMem() && Op.Mem.SegReg == X86::ES &&
isa<MCConstantExpr>(Op.Mem.Disp) &&
@@ -406,7 +393,7 @@ bool X86ATTAsmParser::ParseRegister(unsigned &RegNo,
// FIXME: This should be done using Requires<In32BitMode> and
// Requires<In64BitMode> so "eiz" usage in 64-bit instructions
// can be also checked.
- if (RegNo == X86::RIZ && !Is64Bit)
+ if (RegNo == X86::RIZ && !is64BitMode())
return Error(Tok.getLoc(), "riz register in 64-bit mode only");
// Parse "%st" as "%st(0)" and "%st(1)", which is multiple tokens.
@@ -710,23 +697,6 @@ ParseInstruction(StringRef Name, SMLoc NameLoc,
}
}
- // FIXME: Hack to recognize vpclmul<src1_quadword, src2_quadword>dq
- if (PatchedName.startswith("vpclmul")) {
- unsigned CLMULQuadWordSelect = StringSwitch<unsigned>(
- PatchedName.slice(7, PatchedName.size() - 2))
- .Case("lqlq", 0x00) // src1[63:0], src2[63:0]
- .Case("hqlq", 0x01) // src1[127:64], src2[63:0]
- .Case("lqhq", 0x10) // src1[63:0], src2[127:64]
- .Case("hqhq", 0x11) // src1[127:64], src2[127:64]
- .Default(~0U);
- if (CLMULQuadWordSelect != ~0U) {
- ExtraImmOp = MCConstantExpr::Create(CLMULQuadWordSelect,
- getParser().getContext());
- assert(PatchedName.endswith("dq") && "Unexpected mnemonic!");
- PatchedName = "vpclmulqdq";
- }
- }
-
Operands.push_back(X86Operand::CreateToken(PatchedName, NameLoc));
if (ExtraImmOp)
@@ -843,7 +813,7 @@ ParseInstruction(StringRef Name, SMLoc NameLoc,
// Transform "movs[bwl] %ds:(%esi), %es:(%edi)" into "movs[bwl]"
if (Name.startswith("movs") && Operands.size() == 3 &&
(Name == "movsb" || Name == "movsw" || Name == "movsl" ||
- (Is64Bit && Name == "movsq"))) {
+ (is64BitMode() && Name == "movsq"))) {
X86Operand &Op = *(X86Operand*)Operands.begin()[1];
X86Operand &Op2 = *(X86Operand*)Operands.begin()[2];
if (isSrcOp(Op) && isDstOp(Op2)) {
@@ -856,7 +826,7 @@ ParseInstruction(StringRef Name, SMLoc NameLoc,
// Transform "lods[bwl] %ds:(%esi),{%al,%ax,%eax,%rax}" into "lods[bwl]"
if (Name.startswith("lods") && Operands.size() == 3 &&
(Name == "lods" || Name == "lodsb" || Name == "lodsw" ||
- Name == "lodsl" || (Is64Bit && Name == "lodsq"))) {
+ Name == "lodsl" || (is64BitMode() && Name == "lodsq"))) {
X86Operand *Op1 = static_cast<X86Operand*>(Operands[1]);
X86Operand *Op2 = static_cast<X86Operand*>(Operands[2]);
if (isSrcOp(*Op1) && Op2->isReg()) {
@@ -886,7 +856,7 @@ ParseInstruction(StringRef Name, SMLoc NameLoc,
// Transform "stos[bwl] {%al,%ax,%eax,%rax},%es:(%edi)" into "stos[bwl]"
if (Name.startswith("stos") && Operands.size() == 3 &&
(Name == "stos" || Name == "stosb" || Name == "stosw" ||
- Name == "stosl" || (Is64Bit && Name == "stosq"))) {
+ Name == "stosl" || (is64BitMode() && Name == "stosq"))) {
X86Operand *Op1 = static_cast<X86Operand*>(Operands[1]);
X86Operand *Op2 = static_cast<X86Operand*>(Operands[2]);
if (isDstOp(*Op2) && Op1->isReg()) {
@@ -1161,8 +1131,8 @@ extern "C" void LLVMInitializeX86AsmLexer();
// Force static initialization.
extern "C" void LLVMInitializeX86AsmParser() {
- RegisterAsmParser<X86_32ATTAsmParser> X(TheX86_32Target);
- RegisterAsmParser<X86_64ATTAsmParser> Y(TheX86_64Target);
+ RegisterAsmParser<X86ATTAsmParser> X(TheX86_32Target);
+ RegisterAsmParser<X86ATTAsmParser> Y(TheX86_64Target);
LLVMInitializeX86AsmLexer();
}
diff --git a/contrib/llvm/lib/Target/X86/Disassembler/X86Disassembler.cpp b/contrib/llvm/lib/Target/X86/Disassembler/X86Disassembler.cpp
index d8a105e..4a0d2ec 100644
--- a/contrib/llvm/lib/Target/X86/Disassembler/X86Disassembler.cpp
+++ b/contrib/llvm/lib/Target/X86/Disassembler/X86Disassembler.cpp
@@ -26,7 +26,8 @@
#include "llvm/Support/MemoryObject.h"
#include "llvm/Support/raw_ostream.h"
-#include "X86GenRegisterNames.inc"
+#define GET_REGINFO_ENUM
+#include "X86GenRegisterInfo.inc"
#include "X86GenEDInfo.inc"
using namespace llvm;
diff --git a/contrib/llvm/lib/Target/X86/InstPrinter/X86ATTInstPrinter.cpp b/contrib/llvm/lib/Target/X86/InstPrinter/X86ATTInstPrinter.cpp
index 68247d2..c37d879 100644
--- a/contrib/llvm/lib/Target/X86/InstPrinter/X86ATTInstPrinter.cpp
+++ b/contrib/llvm/lib/Target/X86/InstPrinter/X86ATTInstPrinter.cpp
@@ -15,30 +15,23 @@
#define DEBUG_TYPE "asm-printer"
#include "X86ATTInstPrinter.h"
#include "X86InstComments.h"
-#include "X86Subtarget.h"
+#include "MCTargetDesc/X86MCTargetDesc.h"
#include "llvm/MC/MCInst.h"
#include "llvm/MC/MCAsmInfo.h"
#include "llvm/MC/MCExpr.h"
#include "llvm/Support/ErrorHandling.h"
#include "llvm/Support/Format.h"
#include "llvm/Support/FormattedStream.h"
-#include "X86GenInstrNames.inc"
#include <map>
using namespace llvm;
// Include the auto-generated portion of the assembly writer.
#define GET_INSTRUCTION_NAME
#define PRINT_ALIAS_INSTR
-#include "X86GenRegisterNames.inc"
#include "X86GenAsmWriter.inc"
-#undef PRINT_ALIAS_INSTR
-#undef GET_INSTRUCTION_NAME
-X86ATTInstPrinter::X86ATTInstPrinter(TargetMachine &TM, const MCAsmInfo &MAI)
+X86ATTInstPrinter::X86ATTInstPrinter(const MCAsmInfo &MAI)
: MCInstPrinter(MAI) {
- // Initialize the set of available features.
- setAvailableFeatures(ComputeAvailableFeatures(
- &TM.getSubtarget<X86Subtarget>()));
}
void X86ATTInstPrinter::printRegName(raw_ostream &OS,
diff --git a/contrib/llvm/lib/Target/X86/InstPrinter/X86ATTInstPrinter.h b/contrib/llvm/lib/Target/X86/InstPrinter/X86ATTInstPrinter.h
index 5f939b6..5426e5c 100644
--- a/contrib/llvm/lib/Target/X86/InstPrinter/X86ATTInstPrinter.h
+++ b/contrib/llvm/lib/Target/X86/InstPrinter/X86ATTInstPrinter.h
@@ -19,19 +19,15 @@
namespace llvm {
class MCOperand;
-class X86Subtarget;
-class TargetMachine;
class X86ATTInstPrinter : public MCInstPrinter {
public:
- X86ATTInstPrinter(TargetMachine &TM, const MCAsmInfo &MAI);
+ X86ATTInstPrinter(const MCAsmInfo &MAI);
virtual void printRegName(raw_ostream &OS, unsigned RegNo) const;
virtual void printInst(const MCInst *MI, raw_ostream &OS);
virtual StringRef getOpcodeName(unsigned Opcode) const;
- // Methods used to print the alias of an instruction.
- unsigned ComputeAvailableFeatures(const X86Subtarget *Subtarget) const;
// Autogenerated by tblgen, returns true if we successfully printed an
// alias.
bool printAliasInstr(const MCInst *MI, raw_ostream &OS);
diff --git a/contrib/llvm/lib/Target/X86/InstPrinter/X86InstComments.cpp b/contrib/llvm/lib/Target/X86/InstPrinter/X86InstComments.cpp
index c642acc..4e28dfe 100644
--- a/contrib/llvm/lib/Target/X86/InstPrinter/X86InstComments.cpp
+++ b/contrib/llvm/lib/Target/X86/InstPrinter/X86InstComments.cpp
@@ -13,7 +13,7 @@
//===----------------------------------------------------------------------===//
#include "X86InstComments.h"
-#include "X86GenInstrNames.inc"
+#include "MCTargetDesc/X86MCTargetDesc.h"
#include "llvm/MC/MCInst.h"
#include "llvm/Support/raw_ostream.h"
#include "../Utils/X86ShuffleDecode.h"
diff --git a/contrib/llvm/lib/Target/X86/InstPrinter/X86IntelInstPrinter.cpp b/contrib/llvm/lib/Target/X86/InstPrinter/X86IntelInstPrinter.cpp
index 5f581ba..506e26c 100644
--- a/contrib/llvm/lib/Target/X86/InstPrinter/X86IntelInstPrinter.cpp
+++ b/contrib/llvm/lib/Target/X86/InstPrinter/X86IntelInstPrinter.cpp
@@ -15,13 +15,12 @@
#define DEBUG_TYPE "asm-printer"
#include "X86IntelInstPrinter.h"
#include "X86InstComments.h"
-#include "X86Subtarget.h"
+#include "MCTargetDesc/X86MCTargetDesc.h"
#include "llvm/MC/MCInst.h"
#include "llvm/MC/MCAsmInfo.h"
#include "llvm/MC/MCExpr.h"
#include "llvm/Support/ErrorHandling.h"
#include "llvm/Support/FormattedStream.h"
-#include "X86GenInstrNames.inc"
#include <cctype>
using namespace llvm;
diff --git a/contrib/llvm/lib/Target/X86/InstPrinter/X86IntelInstPrinter.h b/contrib/llvm/lib/Target/X86/InstPrinter/X86IntelInstPrinter.h
index c8030c3..e84a194 100644
--- a/contrib/llvm/lib/Target/X86/InstPrinter/X86IntelInstPrinter.h
+++ b/contrib/llvm/lib/Target/X86/InstPrinter/X86IntelInstPrinter.h
@@ -20,11 +20,10 @@
namespace llvm {
class MCOperand;
-class TargetMachine;
class X86IntelInstPrinter : public MCInstPrinter {
public:
- X86IntelInstPrinter(TargetMachine &TM, const MCAsmInfo &MAI)
+ X86IntelInstPrinter(const MCAsmInfo &MAI)
: MCInstPrinter(MAI) {}
virtual void printRegName(raw_ostream &OS, unsigned RegNo) const;
diff --git a/contrib/llvm/lib/Target/X86/MCTargetDesc/CMakeLists.txt b/contrib/llvm/lib/Target/X86/MCTargetDesc/CMakeLists.txt
new file mode 100644
index 0000000..ca88f8f
--- /dev/null
+++ b/contrib/llvm/lib/Target/X86/MCTargetDesc/CMakeLists.txt
@@ -0,0 +1,7 @@
+add_llvm_library(LLVMX86Desc
+ X86MCTargetDesc.cpp
+ X86MCAsmInfo.cpp
+ )
+
+# Hack: we need to include 'main' target directory to grab private headers
+include_directories(${CMAKE_CURRENT_SOURCE_DIR}/.. ${CMAKE_CURRENT_BINARY_DIR}/..)
diff --git a/contrib/llvm/lib/Target/X86/MCTargetDesc/Makefile b/contrib/llvm/lib/Target/X86/MCTargetDesc/Makefile
new file mode 100644
index 0000000..b19774e
--- /dev/null
+++ b/contrib/llvm/lib/Target/X86/MCTargetDesc/Makefile
@@ -0,0 +1,16 @@
+##===- lib/Target/X86/TargetDesc/Makefile ------------------*- Makefile -*-===##
+#
+# The LLVM Compiler Infrastructure
+#
+# This file is distributed under the University of Illinois Open Source
+# License. See LICENSE.TXT for details.
+#
+##===----------------------------------------------------------------------===##
+
+LEVEL = ../../../..
+LIBRARYNAME = LLVMX86Desc
+
+# Hack: we need to include 'main' target directory to grab private headers
+CPP.Flags += -I$(PROJ_OBJ_DIR)/.. -I$(PROJ_SRC_DIR)/..
+
+include $(LEVEL)/Makefile.common
diff --git a/contrib/llvm/lib/Target/X86/X86MCAsmInfo.cpp b/contrib/llvm/lib/Target/X86/MCTargetDesc/X86MCAsmInfo.cpp
index 2e1ec63..2703100 100644
--- a/contrib/llvm/lib/Target/X86/X86MCAsmInfo.cpp
+++ b/contrib/llvm/lib/Target/X86/MCTargetDesc/X86MCAsmInfo.cpp
@@ -12,7 +12,6 @@
//===----------------------------------------------------------------------===//
#include "X86MCAsmInfo.h"
-#include "X86TargetMachine.h"
#include "llvm/ADT/Triple.h"
#include "llvm/MC/MCContext.h"
#include "llvm/MC/MCExpr.h"
@@ -45,14 +44,17 @@ static const char *const x86_asm_table[] = {
"{flags}", "",
"{dirflag}", "",
"{fpsr}", "",
+ "{fpcr}", "",
"{cc}", "cc",
0,0};
-X86MCAsmInfoDarwin::X86MCAsmInfoDarwin(const Triple &Triple) {
+X86MCAsmInfoDarwin::X86MCAsmInfoDarwin(const Triple &T) {
+ bool is64Bit = T.getArch() == Triple::x86_64;
+ if (is64Bit)
+ PointerSize = 8;
+
AsmTransCBE = x86_asm_table;
AssemblerDialect = AsmWriterFlavor;
-
- bool is64Bit = Triple.getArch() == Triple::x86_64;
TextAlignFillValue = 0x90;
@@ -74,22 +76,14 @@ X86MCAsmInfoDarwin::X86MCAsmInfoDarwin(const Triple &Triple) {
ExceptionsType = ExceptionHandling::DwarfCFI;
}
-const MCExpr *
-X86_64MCAsmInfoDarwin::getExprForPersonalitySymbol(const MCSymbol *Sym,
- unsigned Encoding,
- MCStreamer &Streamer) const {
- MCContext &Context = Streamer.getContext();
- const MCExpr *Res =
- MCSymbolRefExpr::Create(Sym, MCSymbolRefExpr::VK_GOTPCREL, Context);
- const MCExpr *Four = MCConstantExpr::Create(4, Context);
- return MCBinaryExpr::CreateAdd(Res, Four, Context);
-}
-
X86_64MCAsmInfoDarwin::X86_64MCAsmInfoDarwin(const Triple &Triple)
: X86MCAsmInfoDarwin(Triple) {
}
X86ELFMCAsmInfo::X86ELFMCAsmInfo(const Triple &T) {
+ if (T.getArch() == Triple::x86_64)
+ PointerSize = 8;
+
AsmTransCBE = x86_asm_table;
AssemblerDialect = AsmWriterFlavor;
@@ -114,6 +108,17 @@ X86ELFMCAsmInfo::X86ELFMCAsmInfo(const Triple &T) {
Data64bitsDirective = 0;
}
+const MCExpr *
+X86_64MCAsmInfoDarwin::getExprForPersonalitySymbol(const MCSymbol *Sym,
+ unsigned Encoding,
+ MCStreamer &Streamer) const {
+ MCContext &Context = Streamer.getContext();
+ const MCExpr *Res =
+ MCSymbolRefExpr::Create(Sym, MCSymbolRefExpr::VK_GOTPCREL, Context);
+ const MCExpr *Four = MCConstantExpr::Create(4, Context);
+ return MCBinaryExpr::CreateAdd(Res, Four, Context);
+}
+
const MCSection *X86ELFMCAsmInfo::
getNonexecutableStackSection(MCContext &Ctx) const {
return Ctx.getELFSection(".note.GNU-stack", ELF::SHT_PROGBITS,
diff --git a/contrib/llvm/lib/Target/X86/X86MCAsmInfo.h b/contrib/llvm/lib/Target/X86/MCTargetDesc/X86MCAsmInfo.h
index 2cd4c8e..2cd4c8e 100644
--- a/contrib/llvm/lib/Target/X86/X86MCAsmInfo.h
+++ b/contrib/llvm/lib/Target/X86/MCTargetDesc/X86MCAsmInfo.h
diff --git a/contrib/llvm/lib/Target/X86/MCTargetDesc/X86MCTargetDesc.cpp b/contrib/llvm/lib/Target/X86/MCTargetDesc/X86MCTargetDesc.cpp
new file mode 100644
index 0000000..b77f37b
--- /dev/null
+++ b/contrib/llvm/lib/Target/X86/MCTargetDesc/X86MCTargetDesc.cpp
@@ -0,0 +1,185 @@
+//===-- X86MCTargetDesc.cpp - X86 Target Descriptions -----------*- C++ -*-===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+//
+// This file provides X86 specific target descriptions.
+//
+//===----------------------------------------------------------------------===//
+
+#include "X86MCTargetDesc.h"
+#include "X86MCAsmInfo.h"
+#include "llvm/MC/MCInstrInfo.h"
+#include "llvm/MC/MCRegisterInfo.h"
+#include "llvm/MC/MCSubtargetInfo.h"
+#include "llvm/Target/TargetRegistry.h"
+#include "llvm/ADT/Triple.h"
+#include "llvm/Support/Host.h"
+
+#define GET_REGINFO_MC_DESC
+#include "X86GenRegisterInfo.inc"
+
+#define GET_INSTRINFO_MC_DESC
+#include "X86GenInstrInfo.inc"
+
+#define GET_SUBTARGETINFO_MC_DESC
+#include "X86GenSubtargetInfo.inc"
+
+using namespace llvm;
+
+
+std::string X86_MC::ParseX86Triple(StringRef TT) {
+ Triple TheTriple(TT);
+ if (TheTriple.getArch() == Triple::x86_64)
+ return "+64bit-mode";
+ return "-64bit-mode";
+}
+
+/// GetCpuIDAndInfo - Execute the specified cpuid and return the 4 values in the
+/// specified arguments. If we can't run cpuid on the host, return true.
+bool X86_MC::GetCpuIDAndInfo(unsigned value, unsigned *rEAX,
+ unsigned *rEBX, unsigned *rECX, unsigned *rEDX) {
+#if defined(__x86_64__) || defined(_M_AMD64) || defined (_M_X64)
+ #if defined(__GNUC__)
+ // gcc doesn't know cpuid would clobber ebx/rbx. Preseve it manually.
+ asm ("movq\t%%rbx, %%rsi\n\t"
+ "cpuid\n\t"
+ "xchgq\t%%rbx, %%rsi\n\t"
+ : "=a" (*rEAX),
+ "=S" (*rEBX),
+ "=c" (*rECX),
+ "=d" (*rEDX)
+ : "a" (value));
+ return false;
+ #elif defined(_MSC_VER)
+ int registers[4];
+ __cpuid(registers, value);
+ *rEAX = registers[0];
+ *rEBX = registers[1];
+ *rECX = registers[2];
+ *rEDX = registers[3];
+ return false;
+ #endif
+#elif defined(i386) || defined(__i386__) || defined(__x86__) || defined(_M_IX86)
+ #if defined(__GNUC__)
+ asm ("movl\t%%ebx, %%esi\n\t"
+ "cpuid\n\t"
+ "xchgl\t%%ebx, %%esi\n\t"
+ : "=a" (*rEAX),
+ "=S" (*rEBX),
+ "=c" (*rECX),
+ "=d" (*rEDX)
+ : "a" (value));
+ return false;
+ #elif defined(_MSC_VER)
+ __asm {
+ mov eax,value
+ cpuid
+ mov esi,rEAX
+ mov dword ptr [esi],eax
+ mov esi,rEBX
+ mov dword ptr [esi],ebx
+ mov esi,rECX
+ mov dword ptr [esi],ecx
+ mov esi,rEDX
+ mov dword ptr [esi],edx
+ }
+ return false;
+ #endif
+#endif
+ return true;
+}
+
+void X86_MC::DetectFamilyModel(unsigned EAX, unsigned &Family,
+ unsigned &Model) {
+ Family = (EAX >> 8) & 0xf; // Bits 8 - 11
+ Model = (EAX >> 4) & 0xf; // Bits 4 - 7
+ if (Family == 6 || Family == 0xf) {
+ if (Family == 0xf)
+ // Examine extended family ID if family ID is F.
+ Family += (EAX >> 20) & 0xff; // Bits 20 - 27
+ // Examine extended model ID if family ID is 6 or F.
+ Model += ((EAX >> 16) & 0xf) << 4; // Bits 16 - 19
+ }
+}
+
+MCSubtargetInfo *X86_MC::createX86MCSubtargetInfo(StringRef TT, StringRef CPU,
+ StringRef FS) {
+ std::string ArchFS = X86_MC::ParseX86Triple(TT);
+ if (!FS.empty()) {
+ if (!ArchFS.empty())
+ ArchFS = ArchFS + "," + FS.str();
+ else
+ ArchFS = FS;
+ }
+
+ std::string CPUName = CPU;
+ if (CPUName.empty()) {
+#if defined (__x86_64__) || defined(__i386__)
+ CPUName = sys::getHostCPUName();
+#else
+ CPUName = "generic";
+#endif
+ }
+
+ MCSubtargetInfo *X = new MCSubtargetInfo();
+ InitX86MCSubtargetInfo(X, TT, CPUName, ArchFS);
+ return X;
+}
+
+// Force static initialization.
+extern "C" void LLVMInitializeX86MCSubtargetInfo() {
+ TargetRegistry::RegisterMCSubtargetInfo(TheX86_32Target,
+ X86_MC::createX86MCSubtargetInfo);
+ TargetRegistry::RegisterMCSubtargetInfo(TheX86_64Target,
+ X86_MC::createX86MCSubtargetInfo);
+}
+
+static MCInstrInfo *createX86MCInstrInfo() {
+ MCInstrInfo *X = new MCInstrInfo();
+ InitX86MCInstrInfo(X);
+ return X;
+}
+
+extern "C" void LLVMInitializeX86MCInstrInfo() {
+ TargetRegistry::RegisterMCInstrInfo(TheX86_32Target, createX86MCInstrInfo);
+ TargetRegistry::RegisterMCInstrInfo(TheX86_64Target, createX86MCInstrInfo);
+}
+
+static MCRegisterInfo *createX86MCRegisterInfo() {
+ MCRegisterInfo *X = new MCRegisterInfo();
+ InitX86MCRegisterInfo(X);
+ return X;
+}
+
+extern "C" void LLVMInitializeX86MCRegInfo() {
+ TargetRegistry::RegisterMCRegInfo(TheX86_32Target, createX86MCRegisterInfo);
+ TargetRegistry::RegisterMCRegInfo(TheX86_64Target, createX86MCRegisterInfo);
+}
+
+
+static MCAsmInfo *createX86MCAsmInfo(const Target &T, StringRef TT) {
+ Triple TheTriple(TT);
+
+ if (TheTriple.isOSDarwin() || TheTriple.getEnvironment() == Triple::MachO) {
+ if (TheTriple.getArch() == Triple::x86_64)
+ return new X86_64MCAsmInfoDarwin(TheTriple);
+ else
+ return new X86MCAsmInfoDarwin(TheTriple);
+ }
+
+ if (TheTriple.isOSWindows())
+ return new X86MCAsmInfoCOFF(TheTriple);
+
+ return new X86ELFMCAsmInfo(TheTriple);
+}
+
+extern "C" void LLVMInitializeX86MCAsmInfo() {
+ // Register the target asm info.
+ RegisterMCAsmInfoFn A(TheX86_32Target, createX86MCAsmInfo);
+ RegisterMCAsmInfoFn B(TheX86_64Target, createX86MCAsmInfo);
+}
diff --git a/contrib/llvm/lib/Target/X86/MCTargetDesc/X86MCTargetDesc.h b/contrib/llvm/lib/Target/X86/MCTargetDesc/X86MCTargetDesc.h
new file mode 100644
index 0000000..89ea22b
--- /dev/null
+++ b/contrib/llvm/lib/Target/X86/MCTargetDesc/X86MCTargetDesc.h
@@ -0,0 +1,60 @@
+//===-- X86MCTargetDesc.h - X86 Target Descriptions -------------*- C++ -*-===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+//
+// This file provides X86 specific target descriptions.
+//
+//===----------------------------------------------------------------------===//
+
+#ifndef X86MCTARGETDESC_H
+#define X86MCTARGETDESC_H
+
+#include <string>
+
+namespace llvm {
+class MCSubtargetInfo;
+class Target;
+class StringRef;
+
+extern Target TheX86_32Target, TheX86_64Target;
+
+namespace X86_MC {
+ std::string ParseX86Triple(StringRef TT);
+
+ /// GetCpuIDAndInfo - Execute the specified cpuid and return the 4 values in
+ /// the specified arguments. If we can't run cpuid on the host, return true.
+ bool GetCpuIDAndInfo(unsigned value, unsigned *rEAX,
+ unsigned *rEBX, unsigned *rECX, unsigned *rEDX);
+
+ void DetectFamilyModel(unsigned EAX, unsigned &Family, unsigned &Model);
+
+ /// createARMMCSubtargetInfo - Create a X86 MCSubtargetInfo instance.
+ /// This is exposed so Asm parser, etc. do not need to go through
+ /// TargetRegistry.
+ MCSubtargetInfo *createX86MCSubtargetInfo(StringRef TT, StringRef CPU,
+ StringRef FS);
+}
+
+} // End llvm namespace
+
+
+// Defines symbolic names for X86 registers. This defines a mapping from
+// register name to register number.
+//
+#define GET_REGINFO_ENUM
+#include "X86GenRegisterInfo.inc"
+
+// Defines symbolic names for the X86 instructions.
+//
+#define GET_INSTRINFO_ENUM
+#include "X86GenInstrInfo.inc"
+
+#define GET_SUBTARGETINFO_ENUM
+#include "X86GenSubtargetInfo.inc"
+
+#endif
diff --git a/contrib/llvm/lib/Target/X86/X86.h b/contrib/llvm/lib/Target/X86/X86.h
index 0ca4366..ec52dfb 100644
--- a/contrib/llvm/lib/Target/X86/X86.h
+++ b/contrib/llvm/lib/Target/X86/X86.h
@@ -15,6 +15,7 @@
#ifndef TARGET_X86_H
#define TARGET_X86_H
+#include "MCTargetDesc/X86MCTargetDesc.h"
#include "llvm/Support/DataTypes.h"
#include "llvm/Target/TargetMachine.h"
@@ -22,10 +23,12 @@ namespace llvm {
class FunctionPass;
class JITCodeEmitter;
+class MachineCodeEmitter;
class MCCodeEmitter;
class MCContext;
+class MCInstrInfo;
class MCObjectWriter;
-class MachineCodeEmitter;
+class MCSubtargetInfo;
class Target;
class TargetAsmBackend;
class X86TargetMachine;
@@ -57,10 +60,9 @@ FunctionPass *createSSEDomainFixPass();
FunctionPass *createX86JITCodeEmitterPass(X86TargetMachine &TM,
JITCodeEmitter &JCE);
-MCCodeEmitter *createX86_32MCCodeEmitter(const Target &, TargetMachine &TM,
- MCContext &Ctx);
-MCCodeEmitter *createX86_64MCCodeEmitter(const Target &, TargetMachine &TM,
- MCContext &Ctx);
+MCCodeEmitter *createX86MCCodeEmitter(const MCInstrInfo &MCII,
+ const MCSubtargetInfo &STI,
+ MCContext &Ctx);
TargetAsmBackend *createX86_32AsmBackend(const Target &, const std::string &);
TargetAsmBackend *createX86_64AsmBackend(const Target &, const std::string &);
@@ -84,17 +86,6 @@ MCObjectWriter *createX86MachObjectWriter(raw_ostream &OS,
uint32_t CPUType,
uint32_t CPUSubtype);
-extern Target TheX86_32Target, TheX86_64Target;
-
} // End llvm namespace
-// Defines symbolic names for X86 registers. This defines a mapping from
-// register name to register number.
-//
-#include "X86GenRegisterNames.inc"
-
-// Defines symbolic names for the X86 instructions.
-//
-#include "X86GenInstrNames.inc"
-
#endif
diff --git a/contrib/llvm/lib/Target/X86/X86.td b/contrib/llvm/lib/Target/X86/X86.td
index 7bb9676..4ccb43f 100644
--- a/contrib/llvm/lib/Target/X86/X86.td
+++ b/contrib/llvm/lib/Target/X86/X86.td
@@ -17,6 +17,13 @@
include "llvm/Target/Target.td"
//===----------------------------------------------------------------------===//
+// X86 Subtarget state.
+//
+
+def Mode64Bit : SubtargetFeature<"64bit-mode", "In64BitMode", "true",
+ "64-bit mode (x86_64)">;
+
+//===----------------------------------------------------------------------===//
// X86 Subtarget features.
//===----------------------------------------------------------------------===//
diff --git a/contrib/llvm/lib/Target/X86/X86AsmBackend.cpp b/contrib/llvm/lib/Target/X86/X86AsmBackend.cpp
index 4d7d96d..9b556a5 100644
--- a/contrib/llvm/lib/Target/X86/X86AsmBackend.cpp
+++ b/contrib/llvm/lib/Target/X86/X86AsmBackend.cpp
@@ -194,6 +194,9 @@ static unsigned getRelaxedOpcodeArith(unsigned Op) {
// PUSH
case X86::PUSHi8: return X86::PUSHi32;
+ case X86::PUSHi16: return X86::PUSHi32;
+ case X86::PUSH64i8: return X86::PUSH64i32;
+ case X86::PUSH64i16: return X86::PUSH64i32;
}
}
diff --git a/contrib/llvm/lib/Target/X86/X86AsmPrinter.cpp b/contrib/llvm/lib/Target/X86/X86AsmPrinter.cpp
index c2d53c4..99b4479 100644
--- a/contrib/llvm/lib/Target/X86/X86AsmPrinter.cpp
+++ b/contrib/llvm/lib/Target/X86/X86AsmPrinter.cpp
@@ -709,13 +709,12 @@ void X86AsmPrinter::PrintDebugValueComment(const MachineInstr *MI,
//===----------------------------------------------------------------------===//
static MCInstPrinter *createX86MCInstPrinter(const Target &T,
- TargetMachine &TM,
unsigned SyntaxVariant,
const MCAsmInfo &MAI) {
if (SyntaxVariant == 0)
- return new X86ATTInstPrinter(TM, MAI);
+ return new X86ATTInstPrinter(MAI);
if (SyntaxVariant == 1)
- return new X86IntelInstPrinter(TM, MAI);
+ return new X86IntelInstPrinter(MAI);
return 0;
}
diff --git a/contrib/llvm/lib/Target/X86/X86CallingConv.td b/contrib/llvm/lib/Target/X86/X86CallingConv.td
index 5635175..77b9905 100644
--- a/contrib/llvm/lib/Target/X86/X86CallingConv.td
+++ b/contrib/llvm/lib/Target/X86/X86CallingConv.td
@@ -44,11 +44,11 @@ def RetCC_X86Common : CallingConv<[
// can only be used by ABI non-compliant code. This vector type is only
// supported while using the AVX target feature.
CCIfType<[v32i8, v16i16, v8i32, v4i64, v8f32, v4f64],
- CCIfSubtarget<"hasAVX()", CCAssignToReg<[YMM0,YMM1,YMM2,YMM3]>>>,
+ CCAssignToReg<[YMM0,YMM1,YMM2,YMM3]>>,
// MMX vector types are always returned in MM0. If the target doesn't have
// MM0, it doesn't support these vector types.
- CCIfType<[x86mmx, v1i64], CCAssignToReg<[MM0]>>,
+ CCIfType<[x86mmx], CCAssignToReg<[MM0]>>,
// Long double types are always returned in ST0 (even with SSE).
CCIfType<[f80], CCAssignToReg<[ST0, ST1]>>
@@ -91,10 +91,7 @@ def RetCC_X86_64_C : CallingConv<[
CCIfType<[f32], CCAssignToReg<[XMM0, XMM1]>>,
CCIfType<[f64], CCAssignToReg<[XMM0, XMM1]>>,
- // MMX vector types are always returned in XMM0 except for v1i64 which is
- // returned in RAX. This disagrees with ABI documentation but is bug
- // compatible with gcc.
- CCIfType<[v1i64], CCAssignToReg<[RAX]>>,
+ // MMX vector types are always returned in XMM0.
CCIfType<[x86mmx], CCAssignToReg<[XMM0, XMM1]>>,
CCDelegateTo<RetCC_X86Common>
]>;
@@ -102,11 +99,7 @@ def RetCC_X86_64_C : CallingConv<[
// X86-Win64 C return-value convention.
def RetCC_X86_Win64_C : CallingConv<[
// The X86-Win64 calling convention always returns __m64 values in RAX.
- CCIfType<[x86mmx, v1i64], CCBitConvertToType<i64>>,
-
- // And FP in XMM0 only.
- CCIfType<[f32], CCAssignToReg<[XMM0]>>,
- CCIfType<[f64], CCAssignToReg<[XMM0]>>,
+ CCIfType<[x86mmx], CCBitConvertToType<i64>>,
// Otherwise, everything is the same as 'normal' X86-64 C CC.
CCDelegateTo<RetCC_X86_64_C>
@@ -150,17 +143,11 @@ def CC_X86_64_C : CallingConv<[
// The 'nest' parameter, if any, is passed in R10.
CCIfNest<CCAssignToReg<[R10]>>,
- // The first 6 v1i64 vector arguments are passed in GPRs on Darwin.
- CCIfType<[v1i64],
- CCIfSubtarget<"isTargetDarwin()",
- CCBitConvertToType<i64>>>,
-
// The first 6 integer arguments are passed in integer registers.
CCIfType<[i32], CCAssignToReg<[EDI, ESI, EDX, ECX, R8D, R9D]>>,
CCIfType<[i64], CCAssignToReg<[RDI, RSI, RDX, RCX, R8 , R9 ]>>,
- // The first 8 MMX (except for v1i64) vector arguments are passed in XMM
- // registers on Darwin.
+ // The first 8 MMX vector arguments are passed in XMM registers on Darwin.
CCIfType<[x86mmx],
CCIfSubtarget<"isTargetDarwin()",
CCIfSubtarget<"hasXMMInt()",
@@ -189,10 +176,7 @@ def CC_X86_64_C : CallingConv<[
// 256-bit vectors get 32-byte stack slots that are 32-byte aligned.
CCIfType<[v32i8, v16i16, v8i32, v4i64, v8f32, v4f64],
- CCAssignToStack<32, 32>>,
-
- // __m64 vectors get 8-byte stack slots that are 8-byte aligned.
- CCIfType<[x86mmx,v1i64], CCAssignToStack<8, 8>>
+ CCAssignToStack<32, 32>>
]>;
// Calling convention used on Win64
@@ -210,7 +194,7 @@ def CC_X86_Win64_C : CallingConv<[
CCIfType<[v16i8, v8i16, v4i32, v2i64, v4f32, v2f64], CCPassIndirect<i64>>,
// The first 4 MMX vector arguments are passed in GPRs.
- CCIfType<[x86mmx, v1i64], CCBitConvertToType<i64>>,
+ CCIfType<[x86mmx], CCBitConvertToType<i64>>,
// The first 4 integer arguments are passed in integer registers.
CCIfType<[i32], CCAssignToRegWithShadow<[ECX , EDX , R8D , R9D ],
@@ -236,10 +220,7 @@ def CC_X86_Win64_C : CallingConv<[
// Long doubles get stack slots whose size and alignment depends on the
// subtarget.
- CCIfType<[f80], CCAssignToStack<0, 0>>,
-
- // __m64 vectors get 8-byte stack slots that are 8-byte aligned.
- CCIfType<[x86mmx,v1i64], CCAssignToStack<8, 8>>
+ CCIfType<[f80], CCAssignToStack<0, 0>>
]>;
def CC_X86_64_GHC : CallingConv<[
@@ -273,8 +254,8 @@ def CC_X86_32_Common : CallingConv<[
CCIfSubtarget<"hasXMMInt()",
CCAssignToReg<[XMM0,XMM1,XMM2]>>>>>,
- // The first 3 __m64 (except for v1i64) vector arguments are passed in mmx
- // registers if the call is not a vararg call.
+ // The first 3 __m64 vector arguments are passed in mmx registers if the
+ // call is not a vararg call.
CCIfNotVarArg<CCIfType<[x86mmx],
CCAssignToReg<[MM0, MM1, MM2]>>>,
@@ -306,7 +287,7 @@ def CC_X86_32_Common : CallingConv<[
// __m64 vectors get 8-byte stack slots that are 4-byte aligned. They are
// passed in the parameter area.
- CCIfType<[x86mmx,v1i64], CCAssignToStack<8, 4>>]>;
+ CCIfType<[x86mmx], CCAssignToStack<8, 4>>]>;
def CC_X86_32_C : CallingConv<[
// Promote i8/i16 arguments to i32.
diff --git a/contrib/llvm/lib/Target/X86/X86CodeEmitter.cpp b/contrib/llvm/lib/Target/X86/X86CodeEmitter.cpp
index 421e221..4b11db7 100644
--- a/contrib/llvm/lib/Target/X86/X86CodeEmitter.cpp
+++ b/contrib/llvm/lib/Target/X86/X86CodeEmitter.cpp
@@ -68,7 +68,7 @@ namespace {
return "X86 Machine Code Emitter";
}
- void emitInstruction(MachineInstr &MI, const TargetInstrDesc *Desc);
+ void emitInstruction(MachineInstr &MI, const MCInstrDesc *Desc);
void getAnalysisUsage(AnalysisUsage &AU) const {
AU.setPreservesAll();
@@ -132,7 +132,7 @@ bool Emitter<CodeEmitter>::runOnMachineFunction(MachineFunction &MF) {
MCE.StartMachineBasicBlock(MBB);
for (MachineBasicBlock::iterator I = MBB->begin(), E = MBB->end();
I != E; ++I) {
- const TargetInstrDesc &Desc = I->getDesc();
+ const MCInstrDesc &Desc = I->getDesc();
emitInstruction(*I, &Desc);
// MOVPC32r is basically a call plus a pop instruction.
if (Desc.getOpcode() == X86::MOVPC32r)
@@ -150,7 +150,7 @@ bool Emitter<CodeEmitter>::runOnMachineFunction(MachineFunction &MF) {
/// size, and 3) use of X86-64 extended registers.
static unsigned determineREX(const MachineInstr &MI) {
unsigned REX = 0;
- const TargetInstrDesc &Desc = MI.getDesc();
+ const MCInstrDesc &Desc = MI.getDesc();
// Pseudo instructions do not need REX prefix byte.
if ((Desc.TSFlags & X86II::FormMask) == X86II::Pseudo)
@@ -161,7 +161,7 @@ static unsigned determineREX(const MachineInstr &MI) {
unsigned NumOps = Desc.getNumOperands();
if (NumOps) {
bool isTwoAddr = NumOps > 1 &&
- Desc.getOperandConstraint(1, TOI::TIED_TO) != -1;
+ Desc.getOperandConstraint(1, MCOI::TIED_TO) != -1;
// If it accesses SPL, BPL, SIL, or DIL, then it requires a 0x40 REX prefix.
unsigned i = isTwoAddr ? 1 : 0;
@@ -598,7 +598,7 @@ void Emitter<CodeEmitter>::emitMemModRMByte(const MachineInstr &MI,
template<class CodeEmitter>
void Emitter<CodeEmitter>::emitInstruction(MachineInstr &MI,
- const TargetInstrDesc *Desc) {
+ const MCInstrDesc *Desc) {
DEBUG(dbgs() << MI);
// If this is a pseudo instruction, lower it.
@@ -708,9 +708,9 @@ void Emitter<CodeEmitter>::emitInstruction(MachineInstr &MI,
// If this is a two-address instruction, skip one of the register operands.
unsigned NumOps = Desc->getNumOperands();
unsigned CurOp = 0;
- if (NumOps > 1 && Desc->getOperandConstraint(1, TOI::TIED_TO) != -1)
+ if (NumOps > 1 && Desc->getOperandConstraint(1, MCOI::TIED_TO) != -1)
++CurOp;
- else if (NumOps > 2 && Desc->getOperandConstraint(NumOps-1, TOI::TIED_TO)== 0)
+ else if (NumOps > 2 && Desc->getOperandConstraint(NumOps-1,MCOI::TIED_TO)== 0)
// Skip the last source operand that is tied_to the dest reg. e.g. LXADD32
--NumOps;
diff --git a/contrib/llvm/lib/Target/X86/X86FastISel.cpp b/contrib/llvm/lib/Target/X86/X86FastISel.cpp
index f1b9972..21e163a 100644
--- a/contrib/llvm/lib/Target/X86/X86FastISel.cpp
+++ b/contrib/llvm/lib/Target/X86/X86FastISel.cpp
@@ -15,6 +15,7 @@
#include "X86.h"
#include "X86InstrBuilder.h"
+#include "X86ISelLowering.h"
#include "X86RegisterInfo.h"
#include "X86Subtarget.h"
#include "X86TargetMachine.h"
@@ -1392,7 +1393,7 @@ bool X86FastISel::X86VisitIntrinsicCall(const IntrinsicInst &I) {
assert(DI->getAddress() && "Null address should be checked earlier!");
if (!X86SelectAddress(DI->getAddress(), AM))
return false;
- const TargetInstrDesc &II = TII.get(TargetOpcode::DBG_VALUE);
+ const MCInstrDesc &II = TII.get(TargetOpcode::DBG_VALUE);
// FIXME may need to add RegState::Debug to any registers produced,
// although ESP/EBP should be the only ones at the moment.
addFullAddress(BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, DL, II), AM).
@@ -1493,7 +1494,8 @@ bool X86FastISel::DoSelectCall(const Instruction *I, const char *MemIntName) {
return false;
// Fast-isel doesn't know about callee-pop yet.
- if (Subtarget->IsCalleePop(isVarArg, CC))
+ if (X86::isCalleePop(CC, Subtarget->is64Bit(), isVarArg,
+ GuaranteedTailCallOpt))
return false;
// Check whether the function can return without sret-demotion.
@@ -1628,7 +1630,7 @@ bool X86FastISel::DoSelectCall(const Instruction *I, const char *MemIntName) {
unsigned NumBytes = CCInfo.getNextStackOffset();
// Issue CALLSEQ_START
- unsigned AdjStackDown = TM.getRegisterInfo()->getCallFrameSetupOpcode();
+ unsigned AdjStackDown = TII.getCallFrameSetupOpcode();
BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, DL, TII.get(AdjStackDown))
.addImm(NumBytes);
@@ -1801,7 +1803,7 @@ bool X86FastISel::DoSelectCall(const Instruction *I, const char *MemIntName) {
MIB.addReg(RegArgs[i]);
// Issue CALLSEQ_END
- unsigned AdjStackUp = TM.getRegisterInfo()->getCallFrameDestroyOpcode();
+ unsigned AdjStackUp = TII.getCallFrameDestroyOpcode();
unsigned NumBytesCallee = 0;
if (!Subtarget->is64Bit() && CS.paramHasAttr(1, Attribute::StructRet))
NumBytesCallee = 4;
@@ -1846,16 +1848,19 @@ bool X86FastISel::DoSelectCall(const Instruction *I, const char *MemIntName) {
// stack, but where we prefer to use the value in xmm registers, copy it
// out as F80 and use a truncate to move it from fp stack reg to xmm reg.
if ((RVLocs[i].getLocReg() == X86::ST0 ||
- RVLocs[i].getLocReg() == X86::ST1) &&
- isScalarFPTypeInSSEReg(RVLocs[0].getValVT())) {
- CopyVT = MVT::f80;
- CopyReg = createResultReg(X86::RFP80RegisterClass);
+ RVLocs[i].getLocReg() == X86::ST1)) {
+ if (isScalarFPTypeInSSEReg(RVLocs[i].getValVT())) {
+ CopyVT = MVT::f80;
+ CopyReg = createResultReg(X86::RFP80RegisterClass);
+ }
+ BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, DL, TII.get(X86::FpPOP_RETVAL),
+ CopyReg);
+ } else {
+ BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, DL, TII.get(TargetOpcode::COPY),
+ CopyReg).addReg(RVLocs[i].getLocReg());
+ UsedRegs.push_back(RVLocs[i].getLocReg());
}
- BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, DL, TII.get(TargetOpcode::COPY),
- CopyReg).addReg(RVLocs[i].getLocReg());
- UsedRegs.push_back(RVLocs[i].getLocReg());
-
if (CopyVT != RVLocs[i].getValVT()) {
// Round the F80 the right size, which also moves to the appropriate xmm
// register. This is accomplished by storing the F80 value in memory and
diff --git a/contrib/llvm/lib/Target/X86/X86FloatingPoint.cpp b/contrib/llvm/lib/Target/X86/X86FloatingPoint.cpp
index 325d061..6eed6abd 100644
--- a/contrib/llvm/lib/Target/X86/X86FloatingPoint.cpp
+++ b/contrib/llvm/lib/Target/X86/X86FloatingPoint.cpp
@@ -37,6 +37,7 @@
#include "llvm/CodeGen/MachineInstrBuilder.h"
#include "llvm/CodeGen/MachineRegisterInfo.h"
#include "llvm/CodeGen/Passes.h"
+#include "llvm/InlineAsm.h"
#include "llvm/Support/Debug.h"
#include "llvm/Support/ErrorHandling.h"
#include "llvm/Support/raw_ostream.h"
@@ -126,10 +127,45 @@ namespace {
void bundleCFG(MachineFunction &MF);
MachineBasicBlock *MBB; // Current basic block
+
+ // The hardware keeps track of how many FP registers are live, so we have
+ // to model that exactly. Usually, each live register corresponds to an
+ // FP<n> register, but when dealing with calls, returns, and inline
+ // assembly, it is sometimes neccesary to have live scratch registers.
unsigned Stack[8]; // FP<n> Registers in each stack slot...
- unsigned RegMap[8]; // Track which stack slot contains each register
unsigned StackTop; // The current top of the FP stack.
+ enum {
+ NumFPRegs = 16 // Including scratch pseudo-registers.
+ };
+
+ // For each live FP<n> register, point to its Stack[] entry.
+ // The first entries correspond to FP0-FP6, the rest are scratch registers
+ // used when we need slightly different live registers than what the
+ // register allocator thinks.
+ unsigned RegMap[NumFPRegs];
+
+ // Pending fixed registers - Inline assembly needs FP registers to appear
+ // in fixed stack slot positions. This is handled by copying FP registers
+ // to ST registers before the instruction, and copying back after the
+ // instruction.
+ //
+ // This is modeled with pending ST registers. NumPendingSTs is the number
+ // of ST registers (ST0-STn) we are tracking. PendingST[n] points to an FP
+ // register that holds the ST value. The ST registers are not moved into
+ // place until immediately before the instruction that needs them.
+ //
+ // It can happen that we need an ST register to be live when no FP register
+ // holds the value:
+ //
+ // %ST0 = COPY %FP4<kill>
+ //
+ // When that happens, we allocate a scratch FP register to hold the ST
+ // value. That means every register in PendingST must be live.
+
+ unsigned NumPendingSTs;
+ unsigned char PendingST[8];
+
// Set up our stack model to match the incoming registers to MBB.
void setupBlockStack();
@@ -142,13 +178,15 @@ namespace {
dbgs() << " FP" << Stack[i];
assert(RegMap[Stack[i]] == i && "Stack[] doesn't match RegMap[]!");
}
+ for (unsigned i = 0; i != NumPendingSTs; ++i)
+ dbgs() << ", ST" << i << " in FP" << unsigned(PendingST[i]);
dbgs() << "\n";
}
/// getSlot - Return the stack slot number a particular register number is
/// in.
unsigned getSlot(unsigned RegNo) const {
- assert(RegNo < 8 && "Regno out of range!");
+ assert(RegNo < NumFPRegs && "Regno out of range!");
return RegMap[RegNo];
}
@@ -160,12 +198,17 @@ namespace {
/// getScratchReg - Return an FP register that is not currently in use.
unsigned getScratchReg() {
- for (int i = 7; i >= 0; --i)
+ for (int i = NumFPRegs - 1; i >= 8; --i)
if (!isLive(i))
return i;
llvm_unreachable("Ran out of scratch FP registers");
}
+ /// isScratchReg - Returns trus if RegNo is a scratch FP register.
+ bool isScratchReg(unsigned RegNo) {
+ return RegNo > 8 && RegNo < NumFPRegs;
+ }
+
/// getStackEntry - Return the X86::FP<n> register in register ST(i).
unsigned getStackEntry(unsigned STi) const {
if (STi >= StackTop)
@@ -181,7 +224,7 @@ namespace {
// pushReg - Push the specified FP<n> register onto the stack.
void pushReg(unsigned Reg) {
- assert(Reg < 8 && "Register number out of range!");
+ assert(Reg < NumFPRegs && "Register number out of range!");
if (StackTop >= 8)
report_fatal_error("Stack overflow!");
Stack[StackTop] = Reg;
@@ -236,7 +279,7 @@ namespace {
/// Adjust the live registers to be the set in Mask.
void adjustLiveRegs(unsigned Mask, MachineBasicBlock::iterator I);
- /// Shuffle the top FixCount stack entries susch that FP reg FixStack[0] is
+ /// Shuffle the top FixCount stack entries such that FP reg FixStack[0] is
/// st(0), FP reg FixStack[1] is st(1) etc.
void shuffleStackTop(const unsigned char *FixStack, unsigned FixCount,
MachineBasicBlock::iterator I);
@@ -251,7 +294,14 @@ namespace {
void handleCondMovFP(MachineBasicBlock::iterator &I);
void handleSpecialFP(MachineBasicBlock::iterator &I);
- bool translateCopy(MachineInstr*);
+ // Check if a COPY instruction is using FP registers.
+ bool isFPCopy(MachineInstr *MI) {
+ unsigned DstReg = MI->getOperand(0).getReg();
+ unsigned SrcReg = MI->getOperand(1).getReg();
+
+ return X86::RFP80RegClass.contains(DstReg) ||
+ X86::RFP80RegClass.contains(SrcReg);
+ }
};
char FPS::ID = 0;
}
@@ -341,6 +391,7 @@ void FPS::bundleCFG(MachineFunction &MF) {
bool FPS::processBasicBlock(MachineFunction &MF, MachineBasicBlock &BB) {
bool Changed = false;
MBB = &BB;
+ NumPendingSTs = 0;
setupBlockStack();
@@ -352,7 +403,7 @@ bool FPS::processBasicBlock(MachineFunction &MF, MachineBasicBlock &BB) {
if (MI->isInlineAsm())
FPInstClass = X86II::SpecialFP;
- if (MI->isCopy() && translateCopy(MI))
+ if (MI->isCopy() && isFPCopy(MI))
FPInstClass = X86II::SpecialFP;
if (FPInstClass == X86II::NotFP)
@@ -833,7 +884,7 @@ void FPS::adjustLiveRegs(unsigned Mask, MachineBasicBlock::iterator I) {
// Kill registers by popping.
if (Kills && I != MBB->begin()) {
MachineBasicBlock::iterator I2 = llvm::prior(I);
- for (;;) {
+ while (StackTop) {
unsigned KReg = getStackEntry(0);
if (!(Kills & (1 << KReg)))
break;
@@ -881,7 +932,8 @@ void FPS::shuffleStackTop(const unsigned char *FixStack,
continue;
// (Reg st0) (OldReg st0) = (Reg OldReg st0)
moveToTop(Reg, I);
- moveToTop(OldReg, I);
+ if (FixCount > 0)
+ moveToTop(OldReg, I);
}
DEBUG(dumpStack());
}
@@ -1239,141 +1291,307 @@ void FPS::handleSpecialFP(MachineBasicBlock::iterator &I) {
MachineInstr *MI = I;
switch (MI->getOpcode()) {
default: llvm_unreachable("Unknown SpecialFP instruction!");
- case X86::FpGET_ST0_32:// Appears immediately after a call returning FP type!
- case X86::FpGET_ST0_64:// Appears immediately after a call returning FP type!
- case X86::FpGET_ST0_80:// Appears immediately after a call returning FP type!
- assert(StackTop == 0 && "Stack should be empty after a call!");
- pushReg(getFPReg(MI->getOperand(0)));
- break;
- case X86::FpGET_ST1_32:// Appears immediately after a call returning FP type!
- case X86::FpGET_ST1_64:// Appears immediately after a call returning FP type!
- case X86::FpGET_ST1_80:{// Appears immediately after a call returning FP type!
- // FpGET_ST1 should occur right after a FpGET_ST0 for a call or inline asm.
- // The pattern we expect is:
- // CALL
- // FP1 = FpGET_ST0
- // FP4 = FpGET_ST1
- //
- // At this point, we've pushed FP1 on the top of stack, so it should be
- // present if it isn't dead. If it was dead, we already emitted a pop to
- // remove it from the stack and StackTop = 0.
-
- // Push FP4 as top of stack next.
- pushReg(getFPReg(MI->getOperand(0)));
+ case TargetOpcode::COPY: {
+ // We handle three kinds of copies: FP <- FP, FP <- ST, and ST <- FP.
+ const MachineOperand &MO1 = MI->getOperand(1);
+ const MachineOperand &MO0 = MI->getOperand(0);
+ unsigned DstST = MO0.getReg() - X86::ST0;
+ unsigned SrcST = MO1.getReg() - X86::ST0;
+ bool KillsSrc = MI->killsRegister(MO1.getReg());
+
+ // ST = COPY FP. Set up a pending ST register.
+ if (DstST < 8) {
+ unsigned SrcFP = getFPReg(MO1);
+ assert(isLive(SrcFP) && "Cannot copy dead register");
+ assert(!MO0.isDead() && "Cannot copy to dead ST register");
+
+ // Unallocated STs are marked as the nonexistent FP255.
+ while (NumPendingSTs <= DstST)
+ PendingST[NumPendingSTs++] = NumFPRegs;
+
+ // STi could still be live from a previous inline asm.
+ if (isScratchReg(PendingST[DstST])) {
+ DEBUG(dbgs() << "Clobbering old ST in FP" << unsigned(PendingST[DstST])
+ << '\n');
+ freeStackSlotBefore(MI, PendingST[DstST]);
+ }
- // If StackTop was 0 before we pushed our operand, then ST(0) must have been
- // dead. In this case, the ST(1) value is the only thing that is live, so
- // it should be on the TOS (after the pop that was emitted) and is. Just
- // continue in this case.
- if (StackTop == 1)
+ // When the source is killed, allocate a scratch FP register.
+ if (KillsSrc) {
+ unsigned Slot = getSlot(SrcFP);
+ unsigned SR = getScratchReg();
+ PendingST[DstST] = SR;
+ Stack[Slot] = SR;
+ RegMap[SR] = Slot;
+ } else
+ PendingST[DstST] = SrcFP;
break;
-
- // Because pushReg just pushed ST(1) as TOS, we now have to swap the two top
- // elements so that our accounting is correct.
- unsigned RegOnTop = getStackEntry(0);
- unsigned RegNo = getStackEntry(1);
-
- // Swap the slots the regs are in.
- std::swap(RegMap[RegNo], RegMap[RegOnTop]);
-
- // Swap stack slot contents.
- if (RegMap[RegOnTop] >= StackTop)
- report_fatal_error("Access past stack top!");
- std::swap(Stack[RegMap[RegOnTop]], Stack[StackTop-1]);
- break;
- }
- case X86::FpSET_ST0_32:
- case X86::FpSET_ST0_64:
- case X86::FpSET_ST0_80: {
- // FpSET_ST0_80 is generated by copyRegToReg for setting up inline asm
- // arguments that use an st constraint. We expect a sequence of
- // instructions: Fp_SET_ST0 Fp_SET_ST1? INLINEASM
- unsigned Op0 = getFPReg(MI->getOperand(0));
-
- if (!MI->killsRegister(X86::FP0 + Op0)) {
- // Duplicate Op0 into a temporary on the stack top.
- duplicateToTop(Op0, getScratchReg(), I);
- } else {
- // Op0 is killed, so just swap it into position.
- moveToTop(Op0, I);
}
- --StackTop; // "Forget" we have something on the top of stack!
- break;
- }
- case X86::FpSET_ST1_32:
- case X86::FpSET_ST1_64:
- case X86::FpSET_ST1_80: {
- // Set up st(1) for inline asm. We are assuming that st(0) has already been
- // set up by FpSET_ST0, and our StackTop is off by one because of it.
- unsigned Op0 = getFPReg(MI->getOperand(0));
- // Restore the actual StackTop from before Fp_SET_ST0.
- // Note we can't handle Fp_SET_ST1 without a preceding Fp_SET_ST0, and we
- // are not enforcing the constraint.
- ++StackTop;
- unsigned RegOnTop = getStackEntry(0); // This reg must remain in st(0).
- if (!MI->killsRegister(X86::FP0 + Op0)) {
- duplicateToTop(Op0, getScratchReg(), I);
- moveToTop(RegOnTop, I);
- } else if (getSTReg(Op0) != X86::ST1) {
- // We have the wrong value at st(1). Shuffle! Untested!
- moveToTop(getStackEntry(1), I);
- moveToTop(Op0, I);
- moveToTop(RegOnTop, I);
+
+ // FP = COPY ST. Extract fixed stack value.
+ // Any instruction defining ST registers must have assigned them to a
+ // scratch register.
+ if (SrcST < 8) {
+ unsigned DstFP = getFPReg(MO0);
+ assert(!isLive(DstFP) && "Cannot copy ST to live FP register");
+ assert(NumPendingSTs > SrcST && "Cannot copy from dead ST register");
+ unsigned SrcFP = PendingST[SrcST];
+ assert(isScratchReg(SrcFP) && "Expected ST in a scratch register");
+ assert(isLive(SrcFP) && "Scratch holding ST is dead");
+
+ // DstFP steals the stack slot from SrcFP.
+ unsigned Slot = getSlot(SrcFP);
+ Stack[Slot] = DstFP;
+ RegMap[DstFP] = Slot;
+
+ // Always treat the ST as killed.
+ PendingST[SrcST] = NumFPRegs;
+ while (NumPendingSTs && PendingST[NumPendingSTs - 1] == NumFPRegs)
+ --NumPendingSTs;
+ break;
}
- assert(StackTop >= 2 && "Too few live registers");
- StackTop -= 2; // "Forget" both st(0) and st(1).
- break;
- }
- case X86::MOV_Fp3232:
- case X86::MOV_Fp3264:
- case X86::MOV_Fp6432:
- case X86::MOV_Fp6464:
- case X86::MOV_Fp3280:
- case X86::MOV_Fp6480:
- case X86::MOV_Fp8032:
- case X86::MOV_Fp8064:
- case X86::MOV_Fp8080: {
- const MachineOperand &MO1 = MI->getOperand(1);
- unsigned SrcReg = getFPReg(MO1);
- const MachineOperand &MO0 = MI->getOperand(0);
- unsigned DestReg = getFPReg(MO0);
- if (MI->killsRegister(X86::FP0+SrcReg)) {
+ // FP <- FP copy.
+ unsigned DstFP = getFPReg(MO0);
+ unsigned SrcFP = getFPReg(MO1);
+ assert(isLive(SrcFP) && "Cannot copy dead register");
+ if (KillsSrc) {
// If the input operand is killed, we can just change the owner of the
// incoming stack slot into the result.
- unsigned Slot = getSlot(SrcReg);
- assert(Slot < 7 && DestReg < 7 && "FpMOV operands invalid!");
- Stack[Slot] = DestReg;
- RegMap[DestReg] = Slot;
-
+ unsigned Slot = getSlot(SrcFP);
+ Stack[Slot] = DstFP;
+ RegMap[DstFP] = Slot;
} else {
- // For FMOV we just duplicate the specified value to a new stack slot.
+ // For COPY we just duplicate the specified value to a new stack slot.
// This could be made better, but would require substantial changes.
- duplicateToTop(SrcReg, DestReg, I);
+ duplicateToTop(SrcFP, DstFP, I);
}
+ break;
+ }
+
+ case X86::FpPOP_RETVAL: {
+ // The FpPOP_RETVAL instruction is used after calls that return a value on
+ // the floating point stack. We cannot model this with ST defs since CALL
+ // instructions have fixed clobber lists. This instruction is interpreted
+ // to mean that there is one more live register on the stack than we
+ // thought.
+ //
+ // This means that StackTop does not match the hardware stack between a
+ // call and the FpPOP_RETVAL instructions. We do tolerate FP instructions
+ // between CALL and FpPOP_RETVAL as long as they don't overflow the
+ // hardware stack.
+ unsigned DstFP = getFPReg(MI->getOperand(0));
+
+ // Move existing stack elements up to reflect reality.
+ assert(StackTop < 8 && "Stack overflowed before FpPOP_RETVAL");
+ if (StackTop) {
+ std::copy_backward(Stack, Stack + StackTop, Stack + StackTop + 1);
+ for (unsigned i = 0; i != NumFPRegs; ++i)
+ ++RegMap[i];
}
+ ++StackTop;
+
+ // DstFP is the new bottom of the stack.
+ Stack[0] = DstFP;
+ RegMap[DstFP] = 0;
+
+ // DstFP will be killed by processBasicBlock if this was a dead def.
break;
+ }
+
case TargetOpcode::INLINEASM: {
// The inline asm MachineInstr currently only *uses* FP registers for the
// 'f' constraint. These should be turned into the current ST(x) register
- // in the machine instr. Also, any kills should be explicitly popped after
- // the inline asm.
- unsigned Kills = 0;
+ // in the machine instr.
+ //
+ // There are special rules for x87 inline assembly. The compiler must know
+ // exactly how many registers are popped and pushed implicitly by the asm.
+ // Otherwise it is not possible to restore the stack state after the inline
+ // asm.
+ //
+ // There are 3 kinds of input operands:
+ //
+ // 1. Popped inputs. These must appear at the stack top in ST0-STn. A
+ // popped input operand must be in a fixed stack slot, and it is either
+ // tied to an output operand, or in the clobber list. The MI has ST use
+ // and def operands for these inputs.
+ //
+ // 2. Fixed inputs. These inputs appear in fixed stack slots, but are
+ // preserved by the inline asm. The fixed stack slots must be STn-STm
+ // following the popped inputs. A fixed input operand cannot be tied to
+ // an output or appear in the clobber list. The MI has ST use operands
+ // and no defs for these inputs.
+ //
+ // 3. Preserved inputs. These inputs use the "f" constraint which is
+ // represented as an FP register. The inline asm won't change these
+ // stack slots.
+ //
+ // Outputs must be in ST registers, FP outputs are not allowed. Clobbered
+ // registers do not count as output operands. The inline asm changes the
+ // stack as if it popped all the popped inputs and then pushed all the
+ // output operands.
+
+ // Scan the assembly for ST registers used, defined and clobbered. We can
+ // only tell clobbers from defs by looking at the asm descriptor.
+ unsigned STUses = 0, STDefs = 0, STClobbers = 0, STDeadDefs = 0;
+ unsigned NumOps = 0;
+ for (unsigned i = InlineAsm::MIOp_FirstOperand, e = MI->getNumOperands();
+ i != e && MI->getOperand(i).isImm(); i += 1 + NumOps) {
+ unsigned Flags = MI->getOperand(i).getImm();
+ NumOps = InlineAsm::getNumOperandRegisters(Flags);
+ if (NumOps != 1)
+ continue;
+ const MachineOperand &MO = MI->getOperand(i + 1);
+ if (!MO.isReg())
+ continue;
+ unsigned STReg = MO.getReg() - X86::ST0;
+ if (STReg >= 8)
+ continue;
+
+ switch (InlineAsm::getKind(Flags)) {
+ case InlineAsm::Kind_RegUse:
+ STUses |= (1u << STReg);
+ break;
+ case InlineAsm::Kind_RegDef:
+ case InlineAsm::Kind_RegDefEarlyClobber:
+ STDefs |= (1u << STReg);
+ if (MO.isDead())
+ STDeadDefs |= (1u << STReg);
+ break;
+ case InlineAsm::Kind_Clobber:
+ STClobbers |= (1u << STReg);
+ break;
+ default:
+ break;
+ }
+ }
+
+ if (STUses && !isMask_32(STUses))
+ MI->emitError("fixed input regs must be last on the x87 stack");
+ unsigned NumSTUses = CountTrailingOnes_32(STUses);
+
+ // Defs must be contiguous from the stack top. ST0-STn.
+ if (STDefs && !isMask_32(STDefs)) {
+ MI->emitError("output regs must be last on the x87 stack");
+ STDefs = NextPowerOf2(STDefs) - 1;
+ }
+ unsigned NumSTDefs = CountTrailingOnes_32(STDefs);
+
+ // So must the clobbered stack slots. ST0-STm, m >= n.
+ if (STClobbers && !isMask_32(STDefs | STClobbers))
+ MI->emitError("clobbers must be last on the x87 stack");
+
+ // Popped inputs are the ones that are also clobbered or defined.
+ unsigned STPopped = STUses & (STDefs | STClobbers);
+ if (STPopped && !isMask_32(STPopped))
+ MI->emitError("implicitly popped regs must be last on the x87 stack");
+ unsigned NumSTPopped = CountTrailingOnes_32(STPopped);
+
+ DEBUG(dbgs() << "Asm uses " << NumSTUses << " fixed regs, pops "
+ << NumSTPopped << ", and defines " << NumSTDefs << " regs.\n");
+
+ // Scan the instruction for FP uses corresponding to "f" constraints.
+ // Collect FP registers to kill afer the instruction.
+ // Always kill all the scratch regs.
+ unsigned FPKills = ((1u << NumFPRegs) - 1) & ~0xff;
+ unsigned FPUsed = 0;
for (unsigned i = 0, e = MI->getNumOperands(); i != e; ++i) {
MachineOperand &Op = MI->getOperand(i);
if (!Op.isReg() || Op.getReg() < X86::FP0 || Op.getReg() > X86::FP6)
continue;
- assert(Op.isUse() && "Only handle inline asm uses right now");
-
+ if (!Op.isUse())
+ MI->emitError("illegal \"f\" output constraint");
unsigned FPReg = getFPReg(Op);
- Op.setReg(getSTReg(FPReg));
-
+ FPUsed |= 1U << FPReg;
+
// If we kill this operand, make sure to pop it from the stack after the
// asm. We just remember it for now, and pop them all off at the end in
// a batch.
if (Op.isKill())
- Kills |= 1U << FPReg;
+ FPKills |= 1U << FPReg;
+ }
+
+ // The popped inputs will be killed by the instruction, so duplicate them
+ // if the FP register needs to be live after the instruction, or if it is
+ // used in the instruction itself. We effectively treat the popped inputs
+ // as early clobbers.
+ for (unsigned i = 0; i < NumSTPopped; ++i) {
+ if ((FPKills & ~FPUsed) & (1u << PendingST[i]))
+ continue;
+ unsigned SR = getScratchReg();
+ duplicateToTop(PendingST[i], SR, I);
+ DEBUG(dbgs() << "Duplicating ST" << i << " in FP"
+ << unsigned(PendingST[i]) << " to avoid clobbering it.\n");
+ PendingST[i] = SR;
+ }
+
+ // Make sure we have a unique live register for every fixed use. Some of
+ // them could be undef uses, and we need to emit LD_F0 instructions.
+ for (unsigned i = 0; i < NumSTUses; ++i) {
+ if (i < NumPendingSTs && PendingST[i] < NumFPRegs) {
+ // Check for shared assignments.
+ for (unsigned j = 0; j < i; ++j) {
+ if (PendingST[j] != PendingST[i])
+ continue;
+ // STi and STj are inn the same register, create a copy.
+ unsigned SR = getScratchReg();
+ duplicateToTop(PendingST[i], SR, I);
+ DEBUG(dbgs() << "Duplicating ST" << i << " in FP"
+ << unsigned(PendingST[i])
+ << " to avoid collision with ST" << j << '\n');
+ PendingST[i] = SR;
+ }
+ continue;
+ }
+ unsigned SR = getScratchReg();
+ DEBUG(dbgs() << "Emitting LD_F0 for ST" << i << " in FP" << SR << '\n');
+ BuildMI(*MBB, I, MI->getDebugLoc(), TII->get(X86::LD_F0));
+ pushReg(SR);
+ PendingST[i] = SR;
+ if (NumPendingSTs == i)
+ ++NumPendingSTs;
+ }
+ assert(NumPendingSTs >= NumSTUses && "Fixed registers should be assigned");
+
+ // Now we can rearrange the live registers to match what was requested.
+ shuffleStackTop(PendingST, NumPendingSTs, I);
+ DEBUG({dbgs() << "Before asm: "; dumpStack();});
+
+ // With the stack layout fixed, rewrite the FP registers.
+ for (unsigned i = 0, e = MI->getNumOperands(); i != e; ++i) {
+ MachineOperand &Op = MI->getOperand(i);
+ if (!Op.isReg() || Op.getReg() < X86::FP0 || Op.getReg() > X86::FP6)
+ continue;
+ unsigned FPReg = getFPReg(Op);
+ Op.setReg(getSTReg(FPReg));
+ }
+
+ // Simulate the inline asm popping its inputs and pushing its outputs.
+ StackTop -= NumSTPopped;
+
+ // Hold the fixed output registers in scratch FP registers. They will be
+ // transferred to real FP registers by copies.
+ NumPendingSTs = 0;
+ for (unsigned i = 0; i < NumSTDefs; ++i) {
+ unsigned SR = getScratchReg();
+ pushReg(SR);
+ FPKills &= ~(1u << SR);
+ }
+ for (unsigned i = 0; i < NumSTDefs; ++i)
+ PendingST[NumPendingSTs++] = getStackEntry(i);
+ DEBUG({dbgs() << "After asm: "; dumpStack();});
+
+ // If any of the ST defs were dead, pop them immediately. Our caller only
+ // handles dead FP defs.
+ MachineBasicBlock::iterator InsertPt = MI;
+ for (unsigned i = 0; STDefs & (1u << i); ++i) {
+ if (!(STDeadDefs & (1u << i)))
+ continue;
+ freeStackSlotAfter(InsertPt, PendingST[i]);
+ PendingST[i] = NumFPRegs;
}
+ while (NumPendingSTs && PendingST[NumPendingSTs - 1] == NumFPRegs)
+ --NumPendingSTs;
// If this asm kills any FP registers (is the last use of them) we must
// explicitly emit pop instructions for them. Do this now after the asm has
@@ -1382,16 +1600,16 @@ void FPS::handleSpecialFP(MachineBasicBlock::iterator &I) {
//
// Note: this might be a non-optimal pop sequence. We might be able to do
// better by trying to pop in stack order or something.
- MachineBasicBlock::iterator InsertPt = MI;
- while (Kills) {
- unsigned FPReg = CountTrailingZeros_32(Kills);
- freeStackSlotAfter(InsertPt, FPReg);
- Kills &= ~(1U << FPReg);
+ while (FPKills) {
+ unsigned FPReg = CountTrailingZeros_32(FPKills);
+ if (isLive(FPReg))
+ freeStackSlotAfter(InsertPt, FPReg);
+ FPKills &= ~(1U << FPReg);
}
// Don't delete the inline asm!
return;
}
-
+
case X86::RET:
case X86::RETI:
// If RET has an FP register use operand, pass the first one in ST(0) and
@@ -1489,33 +1707,3 @@ void FPS::handleSpecialFP(MachineBasicBlock::iterator &I) {
} else
--I;
}
-
-// Translate a COPY instruction to a pseudo-op that handleSpecialFP understands.
-bool FPS::translateCopy(MachineInstr *MI) {
- unsigned DstReg = MI->getOperand(0).getReg();
- unsigned SrcReg = MI->getOperand(1).getReg();
-
- if (DstReg == X86::ST0) {
- MI->setDesc(TII->get(X86::FpSET_ST0_80));
- MI->RemoveOperand(0);
- return true;
- }
- if (DstReg == X86::ST1) {
- MI->setDesc(TII->get(X86::FpSET_ST1_80));
- MI->RemoveOperand(0);
- return true;
- }
- if (SrcReg == X86::ST0) {
- MI->setDesc(TII->get(X86::FpGET_ST0_80));
- return true;
- }
- if (SrcReg == X86::ST1) {
- MI->setDesc(TII->get(X86::FpGET_ST1_80));
- return true;
- }
- if (X86::RFP80RegClass.contains(DstReg, SrcReg)) {
- MI->setDesc(TII->get(X86::MOV_Fp8080));
- return true;
- }
- return false;
-}
diff --git a/contrib/llvm/lib/Target/X86/X86FrameLowering.cpp b/contrib/llvm/lib/Target/X86/X86FrameLowering.cpp
index 2e95300..ed45a9a 100644
--- a/contrib/llvm/lib/Target/X86/X86FrameLowering.cpp
+++ b/contrib/llvm/lib/Target/X86/X86FrameLowering.cpp
@@ -1,4 +1,4 @@
-//=======- X86FrameLowering.cpp - X86 Frame Information ------------*- C++ -*-====//
+//=======- X86FrameLowering.cpp - X86 Frame Information --------*- C++ -*-====//
//
// The LLVM Compiler Infrastructure
//
@@ -23,6 +23,7 @@
#include "llvm/CodeGen/MachineModuleInfo.h"
#include "llvm/CodeGen/MachineRegisterInfo.h"
#include "llvm/MC/MCAsmInfo.h"
+#include "llvm/MC/MCSymbol.h"
#include "llvm/Target/TargetData.h"
#include "llvm/Target/TargetOptions.h"
#include "llvm/Support/CommandLine.h"
@@ -160,8 +161,10 @@ void emitSPUpdate(MachineBasicBlock &MBB, MachineBasicBlock::iterator &MBBI,
Opc = isSub
? (Is64Bit ? X86::PUSH64r : X86::PUSH32r)
: (Is64Bit ? X86::POP64r : X86::POP32r);
- BuildMI(MBB, MBBI, DL, TII.get(Opc))
+ MachineInstr *MI = BuildMI(MBB, MBBI, DL, TII.get(Opc))
.addReg(Reg, getDefRegState(!isSub) | getUndefRegState(isSub));
+ if (isSub)
+ MI->setFlag(MachineInstr::FrameSetup);
Offset -= ThisVal;
continue;
}
@@ -171,6 +174,8 @@ void emitSPUpdate(MachineBasicBlock &MBB, MachineBasicBlock::iterator &MBBI,
BuildMI(MBB, MBBI, DL, TII.get(Opc), StackPtr)
.addReg(StackPtr)
.addImm(ThisVal);
+ if (isSub)
+ MI->setFlag(MachineInstr::FrameSetup);
MI->getOperand(3).setIsDead(); // The EFLAGS implicit def is dead.
Offset -= ThisVal;
}
@@ -409,7 +414,8 @@ void X86FrameLowering::emitPrologue(MachineFunction &MF) const {
TII.get(getSUBriOpcode(Is64Bit, -TailCallReturnAddrDelta)),
StackPtr)
.addReg(StackPtr)
- .addImm(-TailCallReturnAddrDelta);
+ .addImm(-TailCallReturnAddrDelta)
+ .setMIFlag(MachineInstr::FrameSetup);
MI->getOperand(3).setIsDead(); // The EFLAGS implicit def is dead.
}
@@ -447,7 +453,8 @@ void X86FrameLowering::emitPrologue(MachineFunction &MF) const {
// Save EBP/RBP into the appropriate stack slot.
BuildMI(MBB, MBBI, DL, TII.get(Is64Bit ? X86::PUSH64r : X86::PUSH32r))
- .addReg(FramePtr, RegState::Kill);
+ .addReg(FramePtr, RegState::Kill)
+ .setMIFlag(MachineInstr::FrameSetup);
if (needsFrameMoves) {
// Mark the place where EBP/RBP was saved.
@@ -474,7 +481,8 @@ void X86FrameLowering::emitPrologue(MachineFunction &MF) const {
// Update EBP with the new base value...
BuildMI(MBB, MBBI, DL,
TII.get(Is64Bit ? X86::MOV64rr : X86::MOV32rr), FramePtr)
- .addReg(StackPtr);
+ .addReg(StackPtr)
+ .setMIFlag(MachineInstr::FrameSetup);
if (needsFrameMoves) {
// Mark effective beginning of when frame pointer becomes valid.
@@ -642,7 +650,7 @@ void X86FrameLowering::emitPrologue(MachineFunction &MF) const {
}
void X86FrameLowering::emitEpilogue(MachineFunction &MF,
- MachineBasicBlock &MBB) const {
+ MachineBasicBlock &MBB) const {
const MachineFrameInfo *MFI = MF.getFrameInfo();
X86MachineFunctionInfo *X86FI = MF.getInfo<X86MachineFunctionInfo>();
const X86RegisterInfo *RegInfo = TM.getRegisterInfo();
@@ -919,7 +927,8 @@ bool X86FrameLowering::spillCalleeSavedRegisters(MachineBasicBlock &MBB,
// X86RegisterInfo::emitPrologue will handle spilling of frame register.
continue;
CalleeFrameSize += SlotSize;
- BuildMI(MBB, MI, DL, TII.get(Opc)).addReg(Reg, RegState::Kill);
+ BuildMI(MBB, MI, DL, TII.get(Opc)).addReg(Reg, RegState::Kill)
+ .setMIFlag(MachineInstr::FrameSetup);
}
X86FI->setCalleeSavedFrameSize(CalleeFrameSize);
@@ -1021,3 +1030,181 @@ X86FrameLowering::processFunctionBeforeCalleeSavedScan(MachineFunction &MF,
FrameIdx = 0;
}
}
+
+/// permuteEncode - Create the permutation encoding used with frameless
+/// stacks. It is passed the number of registers to be saved and an array of the
+/// registers saved.
+static uint32_t permuteEncode(unsigned SavedCount, unsigned Registers[6]) {
+ // The saved registers are numbered from 1 to 6. In order to encode the order
+ // in which they were saved, we re-number them according to their place in the
+ // register order. The re-numbering is relative to the last re-numbered
+ // register. E.g., if we have registers {6, 2, 4, 5} saved in that order:
+ //
+ // Orig Re-Num
+ // ---- ------
+ // 6 6
+ // 2 2
+ // 4 3
+ // 5 3
+ //
+ bool Used[7] = { false, false, false, false, false, false, false };
+ uint32_t RenumRegs[6];
+ for (unsigned I = 0; I < SavedCount; ++I) {
+ uint32_t Renum = 0;
+ for (unsigned U = 1; U < 7; ++U) {
+ if (U == Registers[I])
+ break;
+ if (!Used[U])
+ ++Renum;
+ }
+
+ Used[Registers[I]] = true;
+ RenumRegs[I] = Renum;
+ }
+
+ // Take the renumbered values and encode them into a 10-bit number.
+ uint32_t permutationEncoding = 0;
+ switch (SavedCount) {
+ case 6:
+ permutationEncoding |= 120 * RenumRegs[0] + 24 * RenumRegs[1]
+ + 6 * RenumRegs[2] + 2 * RenumRegs[3]
+ + RenumRegs[4];
+ break;
+ case 5:
+ permutationEncoding |= 120 * RenumRegs[0] + 24 * RenumRegs[1]
+ + 6 * RenumRegs[2] + 2 * RenumRegs[3]
+ + RenumRegs[4];
+ break;
+ case 4:
+ permutationEncoding |= 60 * RenumRegs[0] + 12 * RenumRegs[1]
+ + 3 * RenumRegs[2] + RenumRegs[3];
+ break;
+ case 3:
+ permutationEncoding |= 20 * RenumRegs[0] + 4 * RenumRegs[1]
+ + RenumRegs[2];
+ break;
+ case 2:
+ permutationEncoding |= 5 * RenumRegs[0] + RenumRegs[1];
+ break;
+ case 1:
+ permutationEncoding |= RenumRegs[0];
+ break;
+ }
+
+ return permutationEncoding;
+}
+
+uint32_t X86FrameLowering::
+getCompactUnwindEncoding(ArrayRef<MCCFIInstruction> Instrs,
+ int DataAlignmentFactor, bool IsEH) const {
+ uint32_t Encoding = 0;
+ int CFAOffset = 0;
+ const TargetRegisterInfo *TRI = TM.getRegisterInfo();
+ unsigned SavedRegs[6] = { 0, 0, 0, 0, 0, 0 };
+ unsigned SavedRegIdx = 0;
+ int FramePointerReg = -1;
+
+ for (ArrayRef<MCCFIInstruction>::const_iterator
+ I = Instrs.begin(), E = Instrs.end(); I != E; ++I) {
+ const MCCFIInstruction &Inst = *I;
+ MCSymbol *Label = Inst.getLabel();
+
+ // Ignore invalid labels.
+ if (Label && !Label->isDefined()) continue;
+
+ unsigned Operation = Inst.getOperation();
+ if (Operation != MCCFIInstruction::Move &&
+ Operation != MCCFIInstruction::RelMove)
+ // FIXME: We can't handle this frame just yet.
+ return 0;
+
+ const MachineLocation &Dst = Inst.getDestination();
+ const MachineLocation &Src = Inst.getSource();
+ const bool IsRelative = (Operation == MCCFIInstruction::RelMove);
+
+ if (Dst.isReg() && Dst.getReg() == MachineLocation::VirtualFP) {
+ if (Src.getReg() != MachineLocation::VirtualFP) {
+ // DW_CFA_def_cfa
+ assert(FramePointerReg == -1 &&"Defining more than one frame pointer?");
+ if (TRI->getLLVMRegNum(Src.getReg(), IsEH) != X86::EBP &&
+ TRI->getLLVMRegNum(Src.getReg(), IsEH) != X86::RBP)
+ // The frame pointer isn't EBP/RBP. Cannot make unwind information
+ // compact.
+ return 0;
+ FramePointerReg = TRI->getCompactUnwindRegNum(Src.getReg(), IsEH);
+ } // else DW_CFA_def_cfa_offset
+
+ if (IsRelative)
+ CFAOffset += Src.getOffset();
+ else
+ CFAOffset -= Src.getOffset();
+
+ continue;
+ }
+
+ if (Src.isReg() && Src.getReg() == MachineLocation::VirtualFP) {
+ // DW_CFA_def_cfa_register
+ assert(FramePointerReg == -1 && "Defining more than one frame pointer?");
+
+ if (TRI->getLLVMRegNum(Dst.getReg(), IsEH) != X86::EBP &&
+ TRI->getLLVMRegNum(Dst.getReg(), IsEH) != X86::RBP)
+ // The frame pointer isn't EBP/RBP. Cannot make unwind information
+ // compact.
+ return 0;
+
+ FramePointerReg = TRI->getCompactUnwindRegNum(Dst.getReg(), IsEH);
+ if (SavedRegIdx != 1 || SavedRegs[0] != unsigned(FramePointerReg))
+ return 0;
+
+ SavedRegs[0] = 0;
+ SavedRegIdx = 0;
+ continue;
+ }
+
+ unsigned Reg = Src.getReg();
+ int Offset = Dst.getOffset();
+ if (IsRelative)
+ Offset -= CFAOffset;
+ Offset /= DataAlignmentFactor;
+
+ if (Offset < 0) {
+ // FIXME: Handle?
+ // DW_CFA_offset_extended_sf
+ return 0;
+ } else if (Reg < 64) {
+ // DW_CFA_offset + Reg
+ if (SavedRegIdx >= 6) return 0;
+ int CURegNum = TRI->getCompactUnwindRegNum(Reg, IsEH);
+ if (CURegNum == -1) return 0;
+ SavedRegs[SavedRegIdx++] = CURegNum;
+ } else {
+ // FIXME: Handle?
+ // DW_CFA_offset_extended
+ return 0;
+ }
+ }
+
+ // Bail if there are too many registers to encode.
+ if (SavedRegIdx > 6) return 0;
+
+ // Check if the offset is too big.
+ CFAOffset /= 4;
+ if ((CFAOffset & 0xFF) != CFAOffset)
+ return 0;
+ Encoding |= (CFAOffset & 0xFF) << 16; // Size encoding.
+
+ if (FramePointerReg != -1) {
+ Encoding |= 0x01000000; // EBP/RBP Unwind Frame
+ for (unsigned I = 0; I != SavedRegIdx; ++I) {
+ unsigned Reg = SavedRegs[I];
+ if (Reg == unsigned(FramePointerReg)) continue;
+ Encoding |= (Reg & 0x7) << (I * 3); // Register encoding
+ }
+ } else {
+ Encoding |= 0x02000000; // Frameless unwind with small stack
+ Encoding |= (SavedRegIdx & 0x7) << 10;
+ Encoding |= permuteEncode(SavedRegIdx, SavedRegs);
+ }
+
+ return Encoding;
+}
diff --git a/contrib/llvm/lib/Target/X86/X86FrameLowering.h b/contrib/llvm/lib/Target/X86/X86FrameLowering.h
index d71108c..14c31ed 100644
--- a/contrib/llvm/lib/Target/X86/X86FrameLowering.h
+++ b/contrib/llvm/lib/Target/X86/X86FrameLowering.h
@@ -15,6 +15,7 @@
#define X86_FRAMELOWERING_H
#include "X86Subtarget.h"
+#include "llvm/MC/MCDwarf.h"
#include "llvm/Target/TargetFrameLowering.h"
namespace llvm {
@@ -58,6 +59,9 @@ public:
void getInitialFrameState(std::vector<MachineMove> &Moves) const;
int getFrameIndexOffset(const MachineFunction &MF, int FI) const;
+
+ uint32_t getCompactUnwindEncoding(ArrayRef<MCCFIInstruction> Instrs,
+ int DataAlignmentFactor, bool IsEH) const;
};
} // End llvm namespace
diff --git a/contrib/llvm/lib/Target/X86/X86ISelDAGToDAG.cpp b/contrib/llvm/lib/Target/X86/X86ISelDAGToDAG.cpp
index 1fcc274..2b0f283 100644
--- a/contrib/llvm/lib/Target/X86/X86ISelDAGToDAG.cpp
+++ b/contrib/llvm/lib/Target/X86/X86ISelDAGToDAG.cpp
@@ -23,6 +23,7 @@
#include "llvm/Intrinsics.h"
#include "llvm/Support/CFG.h"
#include "llvm/Type.h"
+#include "llvm/CodeGen/FunctionLoweringInfo.h"
#include "llvm/CodeGen/MachineConstantPool.h"
#include "llvm/CodeGen/MachineFunction.h"
#include "llvm/CodeGen/MachineFrameInfo.h"
@@ -191,6 +192,7 @@ namespace {
SDNode *SelectAtomicLoadAdd(SDNode *Node, EVT NVT);
SDNode *SelectAtomicLoadArith(SDNode *Node, EVT NVT);
+ bool FoldOffsetIntoAddress(uint64_t Offset, X86ISelAddressMode &AM);
bool MatchLoadInAddress(LoadSDNode *N, X86ISelAddressMode &AM);
bool MatchWrapper(SDValue N, X86ISelAddressMode &AM);
bool MatchAddress(SDValue N, X86ISelAddressMode &AM);
@@ -546,6 +548,34 @@ void X86DAGToDAGISel::EmitFunctionEntryCode() {
EmitSpecialCodeForMain(MF->begin(), MF->getFrameInfo());
}
+static bool isDispSafeForFrameIndex(int64_t Val) {
+ // On 64-bit platforms, we can run into an issue where a frame index
+ // includes a displacement that, when added to the explicit displacement,
+ // will overflow the displacement field. Assuming that the frame index
+ // displacement fits into a 31-bit integer (which is only slightly more
+ // aggressive than the current fundamental assumption that it fits into
+ // a 32-bit integer), a 31-bit disp should always be safe.
+ return isInt<31>(Val);
+}
+
+bool X86DAGToDAGISel::FoldOffsetIntoAddress(uint64_t Offset,
+ X86ISelAddressMode &AM) {
+ int64_t Val = AM.Disp + Offset;
+ CodeModel::Model M = TM.getCodeModel();
+ if (Subtarget->is64Bit()) {
+ if (!X86::isOffsetSuitableForCodeModel(Val, M,
+ AM.hasSymbolicDisplacement()))
+ return true;
+ // In addition to the checks required for a register base, check that
+ // we do not try to use an unsafe Disp with a frame index.
+ if (AM.BaseType == X86ISelAddressMode::FrameIndexBase &&
+ !isDispSafeForFrameIndex(Val))
+ return true;
+ }
+ AM.Disp = Val;
+ return false;
+
+}
bool X86DAGToDAGISel::MatchLoadInAddress(LoadSDNode *N, X86ISelAddressMode &AM){
SDValue Address = N->getOperand(1);
@@ -595,18 +625,22 @@ bool X86DAGToDAGISel::MatchWrapper(SDValue N, X86ISelAddressMode &AM) {
// must allow RIP.
!AM.hasBaseOrIndexReg() && N.getOpcode() == X86ISD::WrapperRIP) {
if (GlobalAddressSDNode *G = dyn_cast<GlobalAddressSDNode>(N0)) {
- int64_t Offset = AM.Disp + G->getOffset();
- if (!X86::isOffsetSuitableForCodeModel(Offset, M)) return true;
+ X86ISelAddressMode Backup = AM;
AM.GV = G->getGlobal();
- AM.Disp = Offset;
AM.SymbolFlags = G->getTargetFlags();
+ if (FoldOffsetIntoAddress(G->getOffset(), AM)) {
+ AM = Backup;
+ return true;
+ }
} else if (ConstantPoolSDNode *CP = dyn_cast<ConstantPoolSDNode>(N0)) {
- int64_t Offset = AM.Disp + CP->getOffset();
- if (!X86::isOffsetSuitableForCodeModel(Offset, M)) return true;
+ X86ISelAddressMode Backup = AM;
AM.CP = CP->getConstVal();
AM.Align = CP->getAlignment();
- AM.Disp = Offset;
AM.SymbolFlags = CP->getTargetFlags();
+ if (FoldOffsetIntoAddress(CP->getOffset(), AM)) {
+ AM = Backup;
+ return true;
+ }
} else if (ExternalSymbolSDNode *S = dyn_cast<ExternalSymbolSDNode>(N0)) {
AM.ES = S->getSymbol();
AM.SymbolFlags = S->getTargetFlags();
@@ -688,7 +722,6 @@ bool X86DAGToDAGISel::MatchAddress(SDValue N, X86ISelAddressMode &AM) {
bool X86DAGToDAGISel::MatchAddressRecursively(SDValue N, X86ISelAddressMode &AM,
unsigned Depth) {
- bool is64Bit = Subtarget->is64Bit();
DebugLoc dl = N.getDebugLoc();
DEBUG({
dbgs() << "MatchAddress: ";
@@ -698,8 +731,6 @@ bool X86DAGToDAGISel::MatchAddressRecursively(SDValue N, X86ISelAddressMode &AM,
if (Depth > 5)
return MatchAddressBase(N, AM);
- CodeModel::Model M = TM.getCodeModel();
-
// If this is already a %rip relative address, we can only merge immediates
// into it. Instead of handling this in every case, we handle it here.
// RIP relative addressing: %rip + 32-bit displacement!
@@ -709,14 +740,9 @@ bool X86DAGToDAGISel::MatchAddressRecursively(SDValue N, X86ISelAddressMode &AM,
// consistency.
if (!AM.ES && AM.JT != -1) return true;
- if (ConstantSDNode *Cst = dyn_cast<ConstantSDNode>(N)) {
- int64_t Val = AM.Disp + Cst->getSExtValue();
- if (X86::isOffsetSuitableForCodeModel(Val, M,
- AM.hasSymbolicDisplacement())) {
- AM.Disp = Val;
+ if (ConstantSDNode *Cst = dyn_cast<ConstantSDNode>(N))
+ if (!FoldOffsetIntoAddress(Cst->getSExtValue(), AM))
return false;
- }
- }
return true;
}
@@ -724,12 +750,8 @@ bool X86DAGToDAGISel::MatchAddressRecursively(SDValue N, X86ISelAddressMode &AM,
default: break;
case ISD::Constant: {
uint64_t Val = cast<ConstantSDNode>(N)->getSExtValue();
- if (!is64Bit ||
- X86::isOffsetSuitableForCodeModel(AM.Disp + Val, M,
- AM.hasSymbolicDisplacement())) {
- AM.Disp += Val;
+ if (!FoldOffsetIntoAddress(Val, AM))
return false;
- }
break;
}
@@ -745,8 +767,9 @@ bool X86DAGToDAGISel::MatchAddressRecursively(SDValue N, X86ISelAddressMode &AM,
break;
case ISD::FrameIndex:
- if (AM.BaseType == X86ISelAddressMode::RegBase
- && AM.Base_Reg.getNode() == 0) {
+ if (AM.BaseType == X86ISelAddressMode::RegBase &&
+ AM.Base_Reg.getNode() == 0 &&
+ (!Subtarget->is64Bit() || isDispSafeForFrameIndex(AM.Disp))) {
AM.BaseType = X86ISelAddressMode::FrameIndexBase;
AM.Base_FrameIndex = cast<FrameIndexSDNode>(N)->getIndex();
return false;
@@ -775,16 +798,12 @@ bool X86DAGToDAGISel::MatchAddressRecursively(SDValue N, X86ISelAddressMode &AM,
AM.IndexReg = ShVal.getNode()->getOperand(0);
ConstantSDNode *AddVal =
cast<ConstantSDNode>(ShVal.getNode()->getOperand(1));
- uint64_t Disp = AM.Disp + (AddVal->getSExtValue() << Val);
- if (!is64Bit ||
- X86::isOffsetSuitableForCodeModel(Disp, M,
- AM.hasSymbolicDisplacement()))
- AM.Disp = Disp;
- else
- AM.IndexReg = ShVal;
- } else {
- AM.IndexReg = ShVal;
+ uint64_t Disp = AddVal->getSExtValue() << Val;
+ if (!FoldOffsetIntoAddress(Disp, AM))
+ return false;
}
+
+ AM.IndexReg = ShVal;
return false;
}
break;
@@ -818,13 +837,8 @@ bool X86DAGToDAGISel::MatchAddressRecursively(SDValue N, X86ISelAddressMode &AM,
Reg = MulVal.getNode()->getOperand(0);
ConstantSDNode *AddVal =
cast<ConstantSDNode>(MulVal.getNode()->getOperand(1));
- uint64_t Disp = AM.Disp + AddVal->getSExtValue() *
- CN->getZExtValue();
- if (!is64Bit ||
- X86::isOffsetSuitableForCodeModel(Disp, M,
- AM.hasSymbolicDisplacement()))
- AM.Disp = Disp;
- else
+ uint64_t Disp = AddVal->getSExtValue() * CN->getZExtValue();
+ if (FoldOffsetIntoAddress(Disp, AM))
Reg = N.getNode()->getOperand(0);
} else {
Reg = N.getNode()->getOperand(0);
@@ -949,19 +963,11 @@ bool X86DAGToDAGISel::MatchAddressRecursively(SDValue N, X86ISelAddressMode &AM,
if (CurDAG->isBaseWithConstantOffset(N)) {
X86ISelAddressMode Backup = AM;
ConstantSDNode *CN = cast<ConstantSDNode>(N.getOperand(1));
- uint64_t Offset = CN->getSExtValue();
// Start with the LHS as an addr mode.
if (!MatchAddressRecursively(N.getOperand(0), AM, Depth+1) &&
- // Address could not have picked a GV address for the displacement.
- AM.GV == NULL &&
- // On x86-64, the resultant disp must fit in 32-bits.
- (!is64Bit ||
- X86::isOffsetSuitableForCodeModel(AM.Disp + Offset, M,
- AM.hasSymbolicDisplacement()))) {
- AM.Disp += Offset;
+ !FoldOffsetIntoAddress(CN->getSExtValue(), AM))
return false;
- }
AM = Backup;
}
break;
@@ -1351,7 +1357,7 @@ SDNode *X86DAGToDAGISel::SelectAtomicLoadAdd(SDNode *Node, EVT NVT) {
bool isInc = false, isDec = false, isSub = false, isCN = false;
ConstantSDNode *CN = dyn_cast<ConstantSDNode>(Val);
- if (CN) {
+ if (CN && CN->getSExtValue() == (int32_t)CN->getSExtValue()) {
isCN = true;
int64_t CNVal = CN->getSExtValue();
if (CNVal == 1)
@@ -1371,6 +1377,7 @@ SDNode *X86DAGToDAGISel::SelectAtomicLoadAdd(SDNode *Node, EVT NVT) {
Val = Val.getOperand(1);
}
+ DebugLoc dl = Node->getDebugLoc();
unsigned Opc = 0;
switch (NVT.getSimpleVT().SimpleTy) {
default: return 0;
@@ -1462,7 +1469,6 @@ SDNode *X86DAGToDAGISel::SelectAtomicLoadAdd(SDNode *Node, EVT NVT) {
break;
}
- DebugLoc dl = Node->getDebugLoc();
SDValue Undef = SDValue(CurDAG->getMachineNode(TargetOpcode::IMPLICIT_DEF,
dl, NVT), 0);
MachineSDNode::mmo_iterator MemOp = MF->allocateMemRefsArray(1);
@@ -1579,7 +1585,7 @@ SDNode *X86DAGToDAGISel::SelectAtomicLoadArith(SDNode *Node, EVT NVT) {
bool isCN = false;
ConstantSDNode *CN = dyn_cast<ConstantSDNode>(Val);
- if (CN) {
+ if (CN && (int32_t)CN->getSExtValue() == CN->getSExtValue()) {
isCN = true;
Val = CurDAG->getTargetConstant(CN->getSExtValue(), NVT);
}
@@ -1612,16 +1618,18 @@ SDNode *X86DAGToDAGISel::SelectAtomicLoadArith(SDNode *Node, EVT NVT) {
Opc = AtomicOpcTbl[Op][I32];
break;
case MVT::i64:
+ Opc = AtomicOpcTbl[Op][I64];
if (isCN) {
if (immSext8(Val.getNode()))
Opc = AtomicOpcTbl[Op][SextConstantI64];
else if (i64immSExt32(Val.getNode()))
Opc = AtomicOpcTbl[Op][ConstantI64];
- } else
- Opc = AtomicOpcTbl[Op][I64];
+ }
break;
}
+ assert(Opc != 0 && "Invalid arith lock transform!");
+
DebugLoc dl = Node->getDebugLoc();
SDValue Undef = SDValue(CurDAG->getMachineNode(TargetOpcode::IMPLICIT_DEF,
dl, NVT), 0);
diff --git a/contrib/llvm/lib/Target/X86/X86ISelLowering.cpp b/contrib/llvm/lib/Target/X86/X86ISelLowering.cpp
index 294a6a7..5096d9a 100644
--- a/contrib/llvm/lib/Target/X86/X86ISelLowering.cpp
+++ b/contrib/llvm/lib/Target/X86/X86ISelLowering.cpp
@@ -235,10 +235,16 @@ X86TargetLowering::X86TargetLowering(X86TargetMachine &TM)
// Setup Windows compiler runtime calls.
setLibcallName(RTLIB::SDIV_I64, "_alldiv");
setLibcallName(RTLIB::UDIV_I64, "_aulldiv");
+ setLibcallName(RTLIB::SREM_I64, "_allrem");
+ setLibcallName(RTLIB::UREM_I64, "_aullrem");
+ setLibcallName(RTLIB::MUL_I64, "_allmul");
setLibcallName(RTLIB::FPTOUINT_F64_I64, "_ftol2");
setLibcallName(RTLIB::FPTOUINT_F32_I64, "_ftol2");
setLibcallCallingConv(RTLIB::SDIV_I64, CallingConv::X86_StdCall);
setLibcallCallingConv(RTLIB::UDIV_I64, CallingConv::X86_StdCall);
+ setLibcallCallingConv(RTLIB::SREM_I64, CallingConv::X86_StdCall);
+ setLibcallCallingConv(RTLIB::UREM_I64, CallingConv::X86_StdCall);
+ setLibcallCallingConv(RTLIB::MUL_I64, CallingConv::X86_StdCall);
setLibcallCallingConv(RTLIB::FPTOUINT_F64_I64, CallingConv::C);
setLibcallCallingConv(RTLIB::FPTOUINT_F32_I64, CallingConv::C);
}
@@ -646,6 +652,10 @@ X86TargetLowering::X86TargetLowering(X86TargetMachine &TM)
addLegalFPImmediate(APFloat(-1.0f)); // FLD1/FCHS
}
+ // We don't support FMA.
+ setOperationAction(ISD::FMA, MVT::f64, Expand);
+ setOperationAction(ISD::FMA, MVT::f32, Expand);
+
// Long double always uses X87.
if (!UseSoftFloat) {
addRegisterClass(MVT::f80, X86::RFP80RegisterClass);
@@ -670,6 +680,8 @@ X86TargetLowering::X86TargetLowering(X86TargetMachine &TM)
setOperationAction(ISD::FSIN , MVT::f80 , Expand);
setOperationAction(ISD::FCOS , MVT::f80 , Expand);
}
+
+ setOperationAction(ISD::FMA, MVT::f80, Expand);
}
// Always use a library call for pow.
@@ -976,7 +988,6 @@ X86TargetLowering::X86TargetLowering(X86TargetMachine &TM)
addRegisterClass(MVT::v32i8, X86::VR256RegisterClass);
setOperationAction(ISD::LOAD, MVT::v8f32, Legal);
- setOperationAction(ISD::LOAD, MVT::v8i32, Legal);
setOperationAction(ISD::LOAD, MVT::v4f64, Legal);
setOperationAction(ISD::LOAD, MVT::v4i64, Legal);
@@ -994,63 +1005,58 @@ X86TargetLowering::X86TargetLowering(X86TargetMachine &TM)
setOperationAction(ISD::FSQRT, MVT::v4f64, Legal);
setOperationAction(ISD::FNEG, MVT::v4f64, Custom);
- // Custom lower build_vector, vector_shuffle, scalar_to_vector,
- // insert_vector_elt extract_subvector and extract_vector_elt for
- // 256-bit types.
- for (unsigned i = (unsigned)MVT::FIRST_VECTOR_VALUETYPE;
- i <= (unsigned)MVT::LAST_VECTOR_VALUETYPE;
- ++i) {
- MVT::SimpleValueType VT = (MVT::SimpleValueType)i;
- // Do not attempt to custom lower non-256-bit vectors
- if (!isPowerOf2_32(MVT(VT).getVectorNumElements())
- || (MVT(VT).getSizeInBits() < 256))
- continue;
- setOperationAction(ISD::BUILD_VECTOR, VT, Custom);
- setOperationAction(ISD::VECTOR_SHUFFLE, VT, Custom);
- setOperationAction(ISD::INSERT_VECTOR_ELT, VT, Custom);
- setOperationAction(ISD::EXTRACT_VECTOR_ELT, VT, Custom);
- setOperationAction(ISD::SCALAR_TO_VECTOR, VT, Custom);
- }
- // Custom-lower insert_subvector and extract_subvector based on
- // the result type.
+ // Custom lower several nodes for 256-bit types.
for (unsigned i = (unsigned)MVT::FIRST_VECTOR_VALUETYPE;
- i <= (unsigned)MVT::LAST_VECTOR_VALUETYPE;
- ++i) {
- MVT::SimpleValueType VT = (MVT::SimpleValueType)i;
- // Do not attempt to custom lower non-256-bit vectors
- if (!isPowerOf2_32(MVT(VT).getVectorNumElements()))
+ i <= (unsigned)MVT::LAST_VECTOR_VALUETYPE; ++i) {
+ MVT::SimpleValueType SVT = (MVT::SimpleValueType)i;
+ EVT VT = SVT;
+
+ // Extract subvector is special because the value type
+ // (result) is 128-bit but the source is 256-bit wide.
+ if (VT.is128BitVector())
+ setOperationAction(ISD::EXTRACT_SUBVECTOR, SVT, Custom);
+
+ // Do not attempt to custom lower other non-256-bit vectors
+ if (!VT.is256BitVector())
continue;
- if (MVT(VT).getSizeInBits() == 128) {
- setOperationAction(ISD::EXTRACT_SUBVECTOR, VT, Custom);
- }
- else if (MVT(VT).getSizeInBits() == 256) {
- setOperationAction(ISD::INSERT_SUBVECTOR, VT, Custom);
- }
+ setOperationAction(ISD::BUILD_VECTOR, SVT, Custom);
+ setOperationAction(ISD::VECTOR_SHUFFLE, SVT, Custom);
+ setOperationAction(ISD::INSERT_VECTOR_ELT, SVT, Custom);
+ setOperationAction(ISD::EXTRACT_VECTOR_ELT, SVT, Custom);
+ setOperationAction(ISD::SCALAR_TO_VECTOR, SVT, Custom);
+ setOperationAction(ISD::INSERT_SUBVECTOR, SVT, Custom);
}
// Promote v32i8, v16i16, v8i32 select, and, or, xor to v4i64.
- // Don't promote loads because we need them for VPERM vector index versions.
+ for (unsigned i = (unsigned)MVT::v32i8; i != (unsigned)MVT::v4i64; ++i) {
+ MVT::SimpleValueType SVT = (MVT::SimpleValueType)i;
+ EVT VT = SVT;
- for (unsigned VT = (unsigned)MVT::FIRST_VECTOR_VALUETYPE;
- VT != (unsigned)MVT::LAST_VECTOR_VALUETYPE;
- VT++) {
- if (!isPowerOf2_32(MVT((MVT::SimpleValueType)VT).getVectorNumElements())
- || (MVT((MVT::SimpleValueType)VT).getSizeInBits() < 256))
+ // Do not attempt to promote non-256-bit vectors
+ if (!VT.is256BitVector())
continue;
- setOperationAction(ISD::AND, (MVT::SimpleValueType)VT, Promote);
- AddPromotedToType (ISD::AND, (MVT::SimpleValueType)VT, MVT::v4i64);
- setOperationAction(ISD::OR, (MVT::SimpleValueType)VT, Promote);
- AddPromotedToType (ISD::OR, (MVT::SimpleValueType)VT, MVT::v4i64);
- setOperationAction(ISD::XOR, (MVT::SimpleValueType)VT, Promote);
- AddPromotedToType (ISD::XOR, (MVT::SimpleValueType)VT, MVT::v4i64);
- //setOperationAction(ISD::LOAD, (MVT::SimpleValueType)VT, Promote);
- //AddPromotedToType (ISD::LOAD, (MVT::SimpleValueType)VT, MVT::v4i64);
- setOperationAction(ISD::SELECT, (MVT::SimpleValueType)VT, Promote);
- AddPromotedToType (ISD::SELECT, (MVT::SimpleValueType)VT, MVT::v4i64);
+
+ setOperationAction(ISD::AND, SVT, Promote);
+ AddPromotedToType (ISD::AND, SVT, MVT::v4i64);
+ setOperationAction(ISD::OR, SVT, Promote);
+ AddPromotedToType (ISD::OR, SVT, MVT::v4i64);
+ setOperationAction(ISD::XOR, SVT, Promote);
+ AddPromotedToType (ISD::XOR, SVT, MVT::v4i64);
+ setOperationAction(ISD::LOAD, SVT, Promote);
+ AddPromotedToType (ISD::LOAD, SVT, MVT::v4i64);
+ setOperationAction(ISD::SELECT, SVT, Promote);
+ AddPromotedToType (ISD::SELECT, SVT, MVT::v4i64);
}
}
+ // SIGN_EXTEND_INREGs are evaluated by the extend type. Handle the expansion
+ // of this type with custom code.
+ for (unsigned VT = (unsigned)MVT::FIRST_VECTOR_VALUETYPE;
+ VT != (unsigned)MVT::LAST_VECTOR_VALUETYPE; VT++) {
+ setOperationAction(ISD::SIGN_EXTEND_INREG, (MVT::SimpleValueType)VT, Custom);
+ }
+
// We want to custom lower some of our intrinsics.
setOperationAction(ISD::INTRINSIC_WO_CHAIN, MVT::Other, Custom);
@@ -1511,20 +1517,15 @@ X86TargetLowering::LowerCallResult(SDValue Chain, SDValue InFlag,
// If this is a call to a function that returns an fp value on the floating
// point stack, we must guarantee the the value is popped from the stack, so
// a CopyFromReg is not good enough - the copy instruction may be eliminated
- // if the return value is not used. We use the FpGET_ST0 instructions
+ // if the return value is not used. We use the FpPOP_RETVAL instruction
// instead.
if (VA.getLocReg() == X86::ST0 || VA.getLocReg() == X86::ST1) {
// If we prefer to use the value in xmm registers, copy it out as f80 and
// use a truncate to move it from fp stack reg to xmm reg.
if (isScalarFPTypeInSSEReg(VA.getValVT())) CopyVT = MVT::f80;
- bool isST0 = VA.getLocReg() == X86::ST0;
- unsigned Opc = 0;
- if (CopyVT == MVT::f32) Opc = isST0 ? X86::FpGET_ST0_32:X86::FpGET_ST1_32;
- if (CopyVT == MVT::f64) Opc = isST0 ? X86::FpGET_ST0_64:X86::FpGET_ST1_64;
- if (CopyVT == MVT::f80) Opc = isST0 ? X86::FpGET_ST0_80:X86::FpGET_ST1_80;
SDValue Ops[] = { Chain, InFlag };
- Chain = SDValue(DAG.getMachineNode(Opc, dl, CopyVT, MVT::Other, MVT::Glue,
- Ops, 2), 1);
+ Chain = SDValue(DAG.getMachineNode(X86::FpPOP_RETVAL, dl, CopyVT,
+ MVT::Other, MVT::Glue, Ops, 2), 1);
Val = Chain.getValue(0);
// Round the f80 to the right size, which also moves it to the appropriate
@@ -1898,7 +1899,7 @@ X86TargetLowering::LowerFormalArguments(SDValue Chain,
}
// Some CCs need callee pop.
- if (Subtarget->IsCalleePop(isVarArg, CallConv)) {
+ if (X86::isCalleePop(CallConv, Is64Bit, isVarArg, GuaranteedTailCallOpt)) {
FuncInfo->setBytesToPopOnReturn(StackSize); // Callee pops everything.
} else {
FuncInfo->setBytesToPopOnReturn(0); // Callee pops nothing.
@@ -2271,6 +2272,8 @@ X86TargetLowering::LowerCall(SDValue Chain, SDValue Callee,
const GlobalValue *GV = G->getGlobal();
if (!GV->hasDLLImportLinkage()) {
unsigned char OpFlags = 0;
+ bool ExtraLoad = false;
+ unsigned WrapperKind = ISD::DELETED_NODE;
// On ELF targets, in both X86-64 and X86-32 mode, direct calls to
// external symbols most go through the PLT in PIC mode. If the symbol
@@ -2288,10 +2291,28 @@ X86TargetLowering::LowerCall(SDValue Chain, SDValue Callee,
// unless we're building with the leopard linker or later, which
// automatically synthesizes these stubs.
OpFlags = X86II::MO_DARWIN_STUB;
+ } else if (Subtarget->isPICStyleRIPRel() &&
+ isa<Function>(GV) &&
+ cast<Function>(GV)->hasFnAttr(Attribute::NonLazyBind)) {
+ // If the function is marked as non-lazy, generate an indirect call
+ // which loads from the GOT directly. This avoids runtime overhead
+ // at the cost of eager binding (and one extra byte of encoding).
+ OpFlags = X86II::MO_GOTPCREL;
+ WrapperKind = X86ISD::WrapperRIP;
+ ExtraLoad = true;
}
Callee = DAG.getTargetGlobalAddress(GV, dl, getPointerTy(),
G->getOffset(), OpFlags);
+
+ // Add a wrapper if needed.
+ if (WrapperKind != ISD::DELETED_NODE)
+ Callee = DAG.getNode(X86ISD::WrapperRIP, dl, getPointerTy(), Callee);
+ // Add extra indirection if needed.
+ if (ExtraLoad)
+ Callee = DAG.getLoad(getPointerTy(), dl, DAG.getEntryNode(), Callee,
+ MachinePointerInfo::getGOT(),
+ false, false, 0);
}
} else if (ExternalSymbolSDNode *S = dyn_cast<ExternalSymbolSDNode>(Callee)) {
unsigned char OpFlags = 0;
@@ -2363,7 +2384,7 @@ X86TargetLowering::LowerCall(SDValue Chain, SDValue Callee,
// Create the CALLSEQ_END node.
unsigned NumBytesForCalleeToPush;
- if (Subtarget->IsCalleePop(isVarArg, CallConv))
+ if (X86::isCalleePop(CallConv, Is64Bit, isVarArg, GuaranteedTailCallOpt))
NumBytesForCalleeToPush = NumBytes; // Callee pops everything
else if (!Is64Bit && !IsTailCallConvention(CallConv) && IsStructRet)
// If this is a call to a struct-return function, the callee
@@ -2485,6 +2506,10 @@ bool MatchingStackOffset(SDValue Arg, unsigned Offset, ISD::ArgFlagsTy Flags,
if (!FINode)
return false;
FI = FINode->getIndex();
+ } else if (Arg.getOpcode() == ISD::FrameIndex && Flags.isByVal()) {
+ FrameIndexSDNode *FINode = cast<FrameIndexSDNode>(Arg);
+ FI = FINode->getIndex();
+ Bytes = Flags.getByValSize();
} else
return false;
@@ -2536,6 +2561,11 @@ X86TargetLowering::IsEligibleForTailCallOptimization(SDValue Callee,
if (isCalleeStructRet || isCallerStructRet)
return false;
+ // An stdcall caller is expected to clean up its arguments; the callee
+ // isn't going to do that.
+ if (!CCMatch && CallerCC==CallingConv::X86_StdCall)
+ return false;
+
// Do not sibcall optimize vararg calls unless all arguments are passed via
// registers.
if (isVarArg && !Outs.empty()) {
@@ -2672,11 +2702,6 @@ X86TargetLowering::IsEligibleForTailCallOptimization(SDValue Callee,
}
}
- // An stdcall caller is expected to clean up its arguments; the callee
- // isn't going to do that.
- if (!CCMatch && CallerCC==CallingConv::X86_StdCall)
- return false;
-
return true;
}
@@ -2856,6 +2881,29 @@ bool X86::isOffsetSuitableForCodeModel(int64_t Offset, CodeModel::Model M,
return false;
}
+/// isCalleePop - Determines whether the callee is required to pop its
+/// own arguments. Callee pop is necessary to support tail calls.
+bool X86::isCalleePop(CallingConv::ID CallingConv,
+ bool is64Bit, bool IsVarArg, bool TailCallOpt) {
+ if (IsVarArg)
+ return false;
+
+ switch (CallingConv) {
+ default:
+ return false;
+ case CallingConv::X86_StdCall:
+ return !is64Bit;
+ case CallingConv::X86_FastCall:
+ return !is64Bit;
+ case CallingConv::X86_ThisCall:
+ return !is64Bit;
+ case CallingConv::Fast:
+ return TailCallOpt;
+ case CallingConv::GHC:
+ return TailCallOpt;
+ }
+}
+
/// TranslateX86CC - do a one to one translation of a ISD::CondCode to the X86
/// specific condition code, returning the condition code and the LHS/RHS of the
/// comparison to make.
@@ -3790,19 +3838,24 @@ static SDValue getZeroVector(EVT VT, bool HasSSE2, SelectionDAG &DAG,
}
/// getOnesVector - Returns a vector of specified type with all bits set.
-///
+/// Always build ones vectors as <4 x i32> or <8 x i32> bitcasted to
+/// their original type, ensuring they get CSE'd.
static SDValue getOnesVector(EVT VT, SelectionDAG &DAG, DebugLoc dl) {
assert(VT.isVector() && "Expected a vector type");
+ assert((VT.is128BitVector() || VT.is256BitVector())
+ && "Expected a 128-bit or 256-bit vector type");
- // Always build ones vectors as <4 x i32> or <2 x i32> bitcasted to their dest
- // type. This ensures they get CSE'd.
SDValue Cst = DAG.getTargetConstant(~0U, MVT::i32);
+
SDValue Vec;
- Vec = DAG.getNode(ISD::BUILD_VECTOR, dl, MVT::v4i32, Cst, Cst, Cst, Cst);
+ if (VT.is256BitVector()) {
+ SDValue Ops[] = { Cst, Cst, Cst, Cst, Cst, Cst, Cst, Cst };
+ Vec = DAG.getNode(ISD::BUILD_VECTOR, dl, MVT::v8i32, Ops, 8);
+ } else
+ Vec = DAG.getNode(ISD::BUILD_VECTOR, dl, MVT::v4i32, Cst, Cst, Cst, Cst);
return DAG.getNode(ISD::BITCAST, dl, VT, Vec);
}
-
/// NormalizeMask - V2 is a splat, modify the mask (if needed) so all elements
/// that point to V2 points to its first element.
static SDValue NormalizeMask(ShuffleVectorSDNode *SVOp, SelectionDAG &DAG) {
@@ -4417,17 +4470,17 @@ X86TargetLowering::LowerBUILD_VECTOR(SDValue Op, SelectionDAG &DAG) const {
return ConcatVectors(Lower, Upper, DAG);
}
- // All zero's are handled with pxor in SSE2 and above, xorps in SSE1.
- // All one's are handled with pcmpeqd. In AVX, zero's are handled with
- // vpxor in 128-bit and xor{pd,ps} in 256-bit, but no 256 version of pcmpeqd
- // is present, so AllOnes is ignored.
+ // All zero's:
+ // - pxor (SSE2), xorps (SSE1), vpxor (128 AVX), xorp[s|d] (256 AVX)
+ // All one's:
+ // - pcmpeqd (SSE2 and 128 AVX), fallback to constant pools (256 AVX)
if (ISD::isBuildVectorAllZeros(Op.getNode()) ||
- (Op.getValueType().getSizeInBits() != 256 &&
- ISD::isBuildVectorAllOnes(Op.getNode()))) {
- // Canonicalize this to <4 x i32> (SSE) to
+ ISD::isBuildVectorAllOnes(Op.getNode())) {
+ // Canonicalize this to <4 x i32> or <8 x 32> (SSE) to
// 1) ensure the zero vectors are CSE'd, and 2) ensure that i64 scalars are
// eliminated on x86-32 hosts.
- if (Op.getValueType() == MVT::v4i32)
+ if (Op.getValueType() == MVT::v4i32 ||
+ Op.getValueType() == MVT::v8i32)
return Op;
if (ISD::isBuildVectorAllOnes(Op.getNode()))
@@ -8874,8 +8927,8 @@ SDValue X86TargetLowering::LowerShift(SDValue Op, SelectionDAG &DAG) const {
}
// Lower SHL with variable shift amount.
- // Cannot lower SHL without SSE4.1 or later.
- if (!Subtarget->hasSSE41()) return SDValue();
+ // Cannot lower SHL without SSE2 or later.
+ if (!Subtarget->hasSSE2()) return SDValue();
if (VT == MVT::v4i32 && Op->getOpcode() == ISD::SHL) {
Op = DAG.getNode(ISD::INTRINSIC_WO_CHAIN, dl, VT,
@@ -9022,13 +9075,66 @@ SDValue X86TargetLowering::LowerXALUO(SDValue Op, SelectionDAG &DAG) const {
return Sum;
}
+SDValue X86TargetLowering::LowerSIGN_EXTEND_INREG(SDValue Op, SelectionDAG &DAG) const{
+ DebugLoc dl = Op.getDebugLoc();
+ SDNode* Node = Op.getNode();
+ EVT ExtraVT = cast<VTSDNode>(Node->getOperand(1))->getVT();
+ EVT VT = Node->getValueType(0);
+
+ if (Subtarget->hasSSE2() && VT.isVector()) {
+ unsigned BitsDiff = VT.getScalarType().getSizeInBits() -
+ ExtraVT.getScalarType().getSizeInBits();
+ SDValue ShAmt = DAG.getConstant(BitsDiff, MVT::i32);
+
+ unsigned SHLIntrinsicsID = 0;
+ unsigned SRAIntrinsicsID = 0;
+ switch (VT.getSimpleVT().SimpleTy) {
+ default:
+ return SDValue();
+ case MVT::v2i64: {
+ SHLIntrinsicsID = Intrinsic::x86_sse2_pslli_q;
+ SRAIntrinsicsID = 0;
+ break;
+ }
+ case MVT::v4i32: {
+ SHLIntrinsicsID = Intrinsic::x86_sse2_pslli_d;
+ SRAIntrinsicsID = Intrinsic::x86_sse2_psrai_d;
+ break;
+ }
+ case MVT::v8i16: {
+ SHLIntrinsicsID = Intrinsic::x86_sse2_pslli_w;
+ SRAIntrinsicsID = Intrinsic::x86_sse2_psrai_w;
+ break;
+ }
+ }
+
+ SDValue Tmp1 = DAG.getNode(ISD::INTRINSIC_WO_CHAIN, dl, VT,
+ DAG.getConstant(SHLIntrinsicsID, MVT::i32),
+ Node->getOperand(0), ShAmt);
+
+ // In case of 1 bit sext, no need to shr
+ if (ExtraVT.getScalarType().getSizeInBits() == 1) return Tmp1;
+
+ if (SRAIntrinsicsID) {
+ Tmp1 = DAG.getNode(ISD::INTRINSIC_WO_CHAIN, dl, VT,
+ DAG.getConstant(SRAIntrinsicsID, MVT::i32),
+ Tmp1, ShAmt);
+ }
+ return Tmp1;
+ }
+
+ return SDValue();
+}
+
+
SDValue X86TargetLowering::LowerMEMBARRIER(SDValue Op, SelectionDAG &DAG) const{
DebugLoc dl = Op.getDebugLoc();
- if (!Subtarget->hasSSE2()) {
+ // Go ahead and emit the fence on x86-64 even if we asked for no-sse2.
+ // There isn't any reason to disable it if the target processor supports it.
+ if (!Subtarget->hasSSE2() && !Subtarget->is64Bit()) {
SDValue Chain = Op.getOperand(0);
- SDValue Zero = DAG.getConstant(0,
- Subtarget->is64Bit() ? MVT::i64 : MVT::i32);
+ SDValue Zero = DAG.getConstant(0, MVT::i32);
SDValue Ops[] = {
DAG.getRegister(X86::ESP, MVT::i32), // Base
DAG.getTargetConstant(1, MVT::i8), // Scale
@@ -9183,6 +9289,7 @@ static SDValue LowerADDC_ADDE_SUBC_SUBE(SDValue Op, SelectionDAG &DAG) {
SDValue X86TargetLowering::LowerOperation(SDValue Op, SelectionDAG &DAG) const {
switch (Op.getOpcode()) {
default: llvm_unreachable("Should not custom lower this!");
+ case ISD::SIGN_EXTEND_INREG: return LowerSIGN_EXTEND_INREG(Op,DAG);
case ISD::MEMBARRIER: return LowerMEMBARRIER(Op,DAG);
case ISD::ATOMIC_CMP_SWAP: return LowerCMP_SWAP(Op,DAG);
case ISD::ATOMIC_LOAD_SUB: return LowerLOAD_SUB(Op,DAG);
@@ -9281,6 +9388,7 @@ void X86TargetLowering::ReplaceNodeResults(SDNode *N,
default:
assert(false && "Do not know how to custom type legalize this operation!");
return;
+ case ISD::SIGN_EXTEND_INREG:
case ISD::ADDC:
case ISD::ADDE:
case ISD::SUBC:
@@ -9415,7 +9523,7 @@ const char *X86TargetLowering::getTargetNodeName(unsigned Opcode) const {
case X86ISD::PINSRB: return "X86ISD::PINSRB";
case X86ISD::PINSRW: return "X86ISD::PINSRW";
case X86ISD::PSHUFB: return "X86ISD::PSHUFB";
- case X86ISD::PANDN: return "X86ISD::PANDN";
+ case X86ISD::ANDNP: return "X86ISD::ANDNP";
case X86ISD::PSIGNB: return "X86ISD::PSIGNB";
case X86ISD::PSIGNW: return "X86ISD::PSIGNW";
case X86ISD::PSIGND: return "X86ISD::PSIGND";
@@ -11766,10 +11874,12 @@ static SDValue PerformAndCombine(SDNode *N, SelectionDAG &DAG,
if (R.getNode())
return R;
- // Want to form PANDN nodes, in the hopes of then easily combining them with
- // OR and AND nodes to form PBLEND/PSIGN.
+ // Want to form ANDNP nodes:
+ // 1) In the hopes of then easily combining them with OR and AND nodes
+ // to form PBLEND/PSIGN.
+ // 2) To match ANDN packed intrinsics
EVT VT = N->getValueType(0);
- if (VT != MVT::v2i64)
+ if (VT != MVT::v2i64 && VT != MVT::v4i64)
return SDValue();
SDValue N0 = N->getOperand(0);
@@ -11779,12 +11889,12 @@ static SDValue PerformAndCombine(SDNode *N, SelectionDAG &DAG,
// Check LHS for vnot
if (N0.getOpcode() == ISD::XOR &&
ISD::isBuildVectorAllOnes(N0.getOperand(1).getNode()))
- return DAG.getNode(X86ISD::PANDN, DL, VT, N0.getOperand(0), N1);
+ return DAG.getNode(X86ISD::ANDNP, DL, VT, N0.getOperand(0), N1);
// Check RHS for vnot
if (N1.getOpcode() == ISD::XOR &&
ISD::isBuildVectorAllOnes(N1.getOperand(1).getNode()))
- return DAG.getNode(X86ISD::PANDN, DL, VT, N1.getOperand(0), N0);
+ return DAG.getNode(X86ISD::ANDNP, DL, VT, N1.getOperand(0), N0);
return SDValue();
}
@@ -11810,10 +11920,10 @@ static SDValue PerformOrCombine(SDNode *N, SelectionDAG &DAG,
if (Subtarget->hasSSSE3()) {
if (VT == MVT::v2i64) {
// Canonicalize pandn to RHS
- if (N0.getOpcode() == X86ISD::PANDN)
+ if (N0.getOpcode() == X86ISD::ANDNP)
std::swap(N0, N1);
// or (and (m, x), (pandn m, y))
- if (N0.getOpcode() == ISD::AND && N1.getOpcode() == X86ISD::PANDN) {
+ if (N0.getOpcode() == ISD::AND && N1.getOpcode() == X86ISD::ANDNP) {
SDValue Mask = N1.getOperand(0);
SDValue X = N1.getOperand(1);
SDValue Y;
@@ -11822,7 +11932,7 @@ static SDValue PerformOrCombine(SDNode *N, SelectionDAG &DAG,
if (N0.getOperand(1) == Mask)
Y = N0.getOperand(0);
- // Check to see if the mask appeared in both the AND and PANDN and
+ // Check to see if the mask appeared in both the AND and ANDNP and
if (!Y.getNode())
return SDValue();
@@ -12166,8 +12276,8 @@ static SDValue PerformSETCCCombine(SDNode *N, SelectionDAG &DAG) {
return SDValue();
}
-static SDValue PerformSINT_TO_FPCombine(SDNode *N, SelectionDAG &DAG, const X86TargetLowering *XTLI) {
- DebugLoc dl = N->getDebugLoc();
+static SDValue PerformSINT_TO_FPCombine(SDNode *N, SelectionDAG &DAG,
+ const X86TargetLowering *XTLI) {
SDValue Op0 = N->getOperand(0);
// Transform (SINT_TO_FP (i64 ...)) into an x87 operation if we have
// a 32-bit target where SSE doesn't support i64->FP operations.
@@ -12178,7 +12288,8 @@ static SDValue PerformSINT_TO_FPCombine(SDNode *N, SelectionDAG &DAG, const X86T
ISD::isNON_EXTLoad(Op0.getNode()) && Op0.hasOneUse() &&
!XTLI->getSubtarget()->is64Bit() &&
!DAG.getTargetLoweringInfo().isTypeLegal(VT)) {
- SDValue FILDChain = XTLI->BuildFILD(SDValue(N, 0), Ld->getValueType(0), Ld->getChain(), Op0, DAG);
+ SDValue FILDChain = XTLI->BuildFILD(SDValue(N, 0), Ld->getValueType(0),
+ Ld->getChain(), Op0, DAG);
DAG.ReplaceAllUsesOfValueWith(Op0.getValue(1), FILDChain.getValue(1));
return FILDChain;
}
@@ -12549,6 +12660,7 @@ X86TargetLowering::getConstraintType(const std::string &Constraint) const {
case 'y':
case 'x':
case 'Y':
+ case 'l':
return C_RegisterClass;
case 'a':
case 'b':
@@ -12832,60 +12944,6 @@ void X86TargetLowering::LowerAsmOperandForConstraint(SDValue Op,
return TargetLowering::LowerAsmOperandForConstraint(Op, Constraint, Ops, DAG);
}
-std::vector<unsigned> X86TargetLowering::
-getRegClassForInlineAsmConstraint(const std::string &Constraint,
- EVT VT) const {
- if (Constraint.size() == 1) {
- // FIXME: not handling fp-stack yet!
- switch (Constraint[0]) { // GCC X86 Constraint Letters
- default: break; // Unknown constraint letter
- case 'q': // GENERAL_REGS in 64-bit mode, Q_REGS in 32-bit mode.
- if (Subtarget->is64Bit()) {
- if (VT == MVT::i32)
- return make_vector<unsigned>(X86::EAX, X86::EDX, X86::ECX, X86::EBX,
- X86::ESI, X86::EDI, X86::R8D, X86::R9D,
- X86::R10D,X86::R11D,X86::R12D,
- X86::R13D,X86::R14D,X86::R15D,
- X86::EBP, X86::ESP, 0);
- else if (VT == MVT::i16)
- return make_vector<unsigned>(X86::AX, X86::DX, X86::CX, X86::BX,
- X86::SI, X86::DI, X86::R8W,X86::R9W,
- X86::R10W,X86::R11W,X86::R12W,
- X86::R13W,X86::R14W,X86::R15W,
- X86::BP, X86::SP, 0);
- else if (VT == MVT::i8)
- return make_vector<unsigned>(X86::AL, X86::DL, X86::CL, X86::BL,
- X86::SIL, X86::DIL, X86::R8B,X86::R9B,
- X86::R10B,X86::R11B,X86::R12B,
- X86::R13B,X86::R14B,X86::R15B,
- X86::BPL, X86::SPL, 0);
-
- else if (VT == MVT::i64)
- return make_vector<unsigned>(X86::RAX, X86::RDX, X86::RCX, X86::RBX,
- X86::RSI, X86::RDI, X86::R8, X86::R9,
- X86::R10, X86::R11, X86::R12,
- X86::R13, X86::R14, X86::R15,
- X86::RBP, X86::RSP, 0);
-
- break;
- }
- // 32-bit fallthrough
- case 'Q': // Q_REGS
- if (VT == MVT::i32)
- return make_vector<unsigned>(X86::EAX, X86::EDX, X86::ECX, X86::EBX, 0);
- else if (VT == MVT::i16)
- return make_vector<unsigned>(X86::AX, X86::DX, X86::CX, X86::BX, 0);
- else if (VT == MVT::i8)
- return make_vector<unsigned>(X86::AL, X86::DL, X86::CL, X86::BL, 0);
- else if (VT == MVT::i64)
- return make_vector<unsigned>(X86::RAX, X86::RDX, X86::RCX, X86::RBX, 0);
- break;
- }
- }
-
- return std::vector<unsigned>();
-}
-
std::pair<unsigned, const TargetRegisterClass*>
X86TargetLowering::getRegForInlineAsmConstraint(const std::string &Constraint,
EVT VT) const {
@@ -12895,9 +12953,35 @@ X86TargetLowering::getRegForInlineAsmConstraint(const std::string &Constraint,
// GCC Constraint Letters
switch (Constraint[0]) {
default: break;
+ // TODO: Slight differences here in allocation order and leaving
+ // RIP in the class. Do they matter any more here than they do
+ // in the normal allocation?
+ case 'q': // GENERAL_REGS in 64-bit mode, Q_REGS in 32-bit mode.
+ if (Subtarget->is64Bit()) {
+ if (VT == MVT::i32 || VT == MVT::f32)
+ return std::make_pair(0U, X86::GR32RegisterClass);
+ else if (VT == MVT::i16)
+ return std::make_pair(0U, X86::GR16RegisterClass);
+ else if (VT == MVT::i8 || VT == MVT::i1)
+ return std::make_pair(0U, X86::GR8RegisterClass);
+ else if (VT == MVT::i64 || VT == MVT::f64)
+ return std::make_pair(0U, X86::GR64RegisterClass);
+ break;
+ }
+ // 32-bit fallthrough
+ case 'Q': // Q_REGS
+ if (VT == MVT::i32 || VT == MVT::f32)
+ return std::make_pair(0U, X86::GR32_ABCDRegisterClass);
+ else if (VT == MVT::i16)
+ return std::make_pair(0U, X86::GR16_ABCDRegisterClass);
+ else if (VT == MVT::i8 || VT == MVT::i1)
+ return std::make_pair(0U, X86::GR8_ABCD_LRegisterClass);
+ else if (VT == MVT::i64)
+ return std::make_pair(0U, X86::GR64_ABCDRegisterClass);
+ break;
case 'r': // GENERAL_REGS
case 'l': // INDEX_REGS
- if (VT == MVT::i8)
+ if (VT == MVT::i8 || VT == MVT::i1)
return std::make_pair(0U, X86::GR8RegisterClass);
if (VT == MVT::i16)
return std::make_pair(0U, X86::GR16RegisterClass);
@@ -12905,7 +12989,7 @@ X86TargetLowering::getRegForInlineAsmConstraint(const std::string &Constraint,
return std::make_pair(0U, X86::GR32RegisterClass);
return std::make_pair(0U, X86::GR64RegisterClass);
case 'R': // LEGACY_REGS
- if (VT == MVT::i8)
+ if (VT == MVT::i8 || VT == MVT::i1)
return std::make_pair(0U, X86::GR8_NOREXRegisterClass);
if (VT == MVT::i16)
return std::make_pair(0U, X86::GR16_NOREXRegisterClass);
diff --git a/contrib/llvm/lib/Target/X86/X86ISelLowering.h b/contrib/llvm/lib/Target/X86/X86ISelLowering.h
index d61a125..b603678 100644
--- a/contrib/llvm/lib/Target/X86/X86ISelLowering.h
+++ b/contrib/llvm/lib/Target/X86/X86ISelLowering.h
@@ -169,8 +169,8 @@ namespace llvm {
/// PSHUFB - Shuffle 16 8-bit values within a vector.
PSHUFB,
- /// PANDN - and with not'd value.
- PANDN,
+ /// ANDNP - Bitwise Logical AND NOT of Packed FP values.
+ ANDNP,
/// PSIGNB/W/D - Copy integer sign.
PSIGNB, PSIGNW, PSIGND,
@@ -466,6 +466,12 @@ namespace llvm {
/// fit into displacement field of the instruction.
bool isOffsetSuitableForCodeModel(int64_t Offset, CodeModel::Model M,
bool hasSymbolicDisplacement = true);
+
+
+ /// isCalleePop - Determines whether the callee is required to pop its
+ /// own arguments. Callee pop is necessary to support tail calls.
+ bool isCalleePop(CallingConv::ID CallingConv,
+ bool is64Bit, bool IsVarArg, bool TailCallOpt);
}
//===--------------------------------------------------------------------===//
@@ -590,10 +596,6 @@ namespace llvm {
virtual ConstraintWeight getSingleConstraintMatchWeight(
AsmOperandInfo &info, const char *constraint) const;
- std::vector<unsigned>
- getRegClassForInlineAsmConstraint(const std::string &Constraint,
- EVT VT) const;
-
virtual const char *LowerXConstraint(EVT ConstraintVT) const;
/// LowerAsmOperandForConstraint - Lower the specified operand into the Ops
@@ -823,6 +825,7 @@ namespace llvm {
SDValue LowerLOAD_SUB(SDValue Op, SelectionDAG &DAG) const;
SDValue LowerREADCYCLECOUNTER(SDValue Op, SelectionDAG &DAG) const;
SDValue LowerMEMBARRIER(SDValue Op, SelectionDAG &DAG) const;
+ SDValue LowerSIGN_EXTEND_INREG(SDValue Op, SelectionDAG &DAG) const;
// Utility functions to help LowerVECTOR_SHUFFLE
SDValue LowerVECTOR_SHUFFLEv8i16(SDValue Op, SelectionDAG &DAG) const;
diff --git a/contrib/llvm/lib/Target/X86/X86InstrBuilder.h b/contrib/llvm/lib/Target/X86/X86InstrBuilder.h
index 1ea8071..0245e5c 100644
--- a/contrib/llvm/lib/Target/X86/X86InstrBuilder.h
+++ b/contrib/llvm/lib/Target/X86/X86InstrBuilder.h
@@ -150,11 +150,11 @@ addFrameReference(const MachineInstrBuilder &MIB, int FI, int Offset = 0) {
MachineInstr *MI = MIB;
MachineFunction &MF = *MI->getParent()->getParent();
MachineFrameInfo &MFI = *MF.getFrameInfo();
- const TargetInstrDesc &TID = MI->getDesc();
+ const MCInstrDesc &MCID = MI->getDesc();
unsigned Flags = 0;
- if (TID.mayLoad())
+ if (MCID.mayLoad())
Flags |= MachineMemOperand::MOLoad;
- if (TID.mayStore())
+ if (MCID.mayStore())
Flags |= MachineMemOperand::MOStore;
MachineMemOperand *MMO =
MF.getMachineMemOperand(MachinePointerInfo::getFixedStack(FI, Offset),
diff --git a/contrib/llvm/lib/Target/X86/X86InstrCompiler.td b/contrib/llvm/lib/Target/X86/X86InstrCompiler.td
index 33534cd..adcc747 100644
--- a/contrib/llvm/lib/Target/X86/X86InstrCompiler.td
+++ b/contrib/llvm/lib/Target/X86/X86InstrCompiler.td
@@ -1368,6 +1368,11 @@ def : Pat<(store (i8 (trunc_su (srl_su GR16:$src, (i8 8)))), addr:$dst),
// (shl x, 1) ==> (add x, x)
+// Note that if x is undef (immediate or otherwise), we could theoretically
+// end up with the two uses of x getting different values, producing a result
+// where the least significant bit is not 0. However, the probability of this
+// happening is considered low enough that this is officially not a
+// "real problem".
def : Pat<(shl GR8 :$src1, (i8 1)), (ADD8rr GR8 :$src1, GR8 :$src1)>;
def : Pat<(shl GR16:$src1, (i8 1)), (ADD16rr GR16:$src1, GR16:$src1)>;
def : Pat<(shl GR32:$src1, (i8 1)), (ADD32rr GR32:$src1, GR32:$src1)>;
diff --git a/contrib/llvm/lib/Target/X86/X86InstrFPStack.td b/contrib/llvm/lib/Target/X86/X86InstrFPStack.td
index b506f5e..7cb870f 100644
--- a/contrib/llvm/lib/Target/X86/X86InstrFPStack.td
+++ b/contrib/llvm/lib/Target/X86/X86InstrFPStack.td
@@ -112,31 +112,8 @@ let usesCustomInserter = 1 in { // Expanded after instruction selection.
// a pattern) and the FPI instruction should have emission info (e.g. opcode
// encoding and asm printing info).
-// Pseudo Instructions for FP stack return values.
-def FpGET_ST0_32 : FpI_<(outs RFP32:$dst), (ins), SpecialFP, []>; // FPR = ST(0)
-def FpGET_ST0_64 : FpI_<(outs RFP64:$dst), (ins), SpecialFP, []>; // FPR = ST(0)
-def FpGET_ST0_80 : FpI_<(outs RFP80:$dst), (ins), SpecialFP, []>; // FPR = ST(0)
-
-// FpGET_ST1* should only be issued *after* an FpGET_ST0* has been issued when
-// there are two values live out on the stack from a call or inlineasm. This
-// magic is handled by the stackifier. It is not valid to emit FpGET_ST1* and
-// then FpGET_ST0*. In addition, it is invalid for any FP-using operations to
-// occur between them.
-def FpGET_ST1_32 : FpI_<(outs RFP32:$dst), (ins), SpecialFP, []>; // FPR = ST(1)
-def FpGET_ST1_64 : FpI_<(outs RFP64:$dst), (ins), SpecialFP, []>; // FPR = ST(1)
-def FpGET_ST1_80 : FpI_<(outs RFP80:$dst), (ins), SpecialFP, []>; // FPR = ST(1)
-
-let Defs = [ST0] in {
-def FpSET_ST0_32 : FpI_<(outs), (ins RFP32:$src), SpecialFP, []>; // ST(0) = FPR
-def FpSET_ST0_64 : FpI_<(outs), (ins RFP64:$src), SpecialFP, []>; // ST(0) = FPR
-def FpSET_ST0_80 : FpI_<(outs), (ins RFP80:$src), SpecialFP, []>; // ST(0) = FPR
-}
-
-let Defs = [ST1] in {
-def FpSET_ST1_32 : FpI_<(outs), (ins RFP32:$src), SpecialFP, []>; // ST(1) = FPR
-def FpSET_ST1_64 : FpI_<(outs), (ins RFP64:$src), SpecialFP, []>; // ST(1) = FPR
-def FpSET_ST1_80 : FpI_<(outs), (ins RFP80:$src), SpecialFP, []>; // ST(1) = FPR
-}
+// Pseudo Instruction for FP stack return values.
+def FpPOP_RETVAL : FpI_<(outs RFP80:$dst), (ins), SpecialFP, []>;
// FpIf32, FpIf64 - Floating Point Pseudo Instruction template.
// f32 instructions can use SSE1 and are predicated on FPStackf32 == !SSE1.
@@ -147,19 +124,6 @@ class FpIf32<dag outs, dag ins, FPFormat fp, list<dag> pattern> :
class FpIf64<dag outs, dag ins, FPFormat fp, list<dag> pattern> :
FpI_<outs, ins, fp, pattern>, Requires<[FPStackf64]>;
-// Register copies. Just copies, the shortening ones do not truncate.
-let neverHasSideEffects = 1 in {
- def MOV_Fp3232 : FpIf32<(outs RFP32:$dst), (ins RFP32:$src), SpecialFP, []>;
- def MOV_Fp3264 : FpIf32<(outs RFP64:$dst), (ins RFP32:$src), SpecialFP, []>;
- def MOV_Fp6432 : FpIf32<(outs RFP32:$dst), (ins RFP64:$src), SpecialFP, []>;
- def MOV_Fp6464 : FpIf64<(outs RFP64:$dst), (ins RFP64:$src), SpecialFP, []>;
- def MOV_Fp8032 : FpIf32<(outs RFP32:$dst), (ins RFP80:$src), SpecialFP, []>;
- def MOV_Fp3280 : FpIf32<(outs RFP80:$dst), (ins RFP32:$src), SpecialFP, []>;
- def MOV_Fp8064 : FpIf64<(outs RFP64:$dst), (ins RFP80:$src), SpecialFP, []>;
- def MOV_Fp6480 : FpIf64<(outs RFP80:$dst), (ins RFP64:$src), SpecialFP, []>;
- def MOV_Fp8080 : FpI_ <(outs RFP80:$dst), (ins RFP80:$src), SpecialFP, []>;
-}
-
// Factoring for arithmetic.
multiclass FPBinary_rr<SDNode OpNode> {
// Register op register -> register
diff --git a/contrib/llvm/lib/Target/X86/X86InstrFormats.td b/contrib/llvm/lib/Target/X86/X86InstrFormats.td
index 7daa264..6d89bcc 100644
--- a/contrib/llvm/lib/Target/X86/X86InstrFormats.td
+++ b/contrib/llvm/lib/Target/X86/X86InstrFormats.td
@@ -460,6 +460,11 @@ class AESAI<bits<8> o, Format F, dag outs, dag ins, string asm,
class CLMULIi8<bits<8> o, Format F, dag outs, dag ins, string asm,
list<dag>pattern>
: Ii8<o, F, outs, ins, asm, pattern, SSEPackedInt>, TA,
+ OpSize, Requires<[HasCLMUL]>;
+
+class AVXCLMULIi8<bits<8> o, Format F, dag outs, dag ins, string asm,
+ list<dag>pattern>
+ : Ii8<o, F, outs, ins, asm, pattern, SSEPackedInt>, TA,
OpSize, VEX_4V, Requires<[HasAVX, HasCLMUL]>;
// FMA3 Instruction Templates
diff --git a/contrib/llvm/lib/Target/X86/X86InstrFragmentsSIMD.td b/contrib/llvm/lib/Target/X86/X86InstrFragmentsSIMD.td
index 7c9a9f7..b00109c 100644
--- a/contrib/llvm/lib/Target/X86/X86InstrFragmentsSIMD.td
+++ b/contrib/llvm/lib/Target/X86/X86InstrFragmentsSIMD.td
@@ -46,8 +46,8 @@ def X86cmpsd : SDNode<"X86ISD::FSETCCsd", SDTX86Cmpsd>;
def X86pshufb : SDNode<"X86ISD::PSHUFB",
SDTypeProfile<1, 2, [SDTCisVT<0, v16i8>, SDTCisSameAs<0,1>,
SDTCisSameAs<0,2>]>>;
-def X86pandn : SDNode<"X86ISD::PANDN",
- SDTypeProfile<1, 2, [SDTCisVT<0, v2i64>, SDTCisSameAs<0,1>,
+def X86andnp : SDNode<"X86ISD::ANDNP",
+ SDTypeProfile<1, 2, [SDTCisVec<0>, SDTCisSameAs<0,1>,
SDTCisSameAs<0,2>]>>;
def X86psignb : SDNode<"X86ISD::PSIGNB",
SDTypeProfile<1, 2, [SDTCisVT<0, v16i8>, SDTCisSameAs<0,1>,
@@ -168,11 +168,13 @@ def ssmem : Operand<v4f32> {
let PrintMethod = "printf32mem";
let MIOperandInfo = (ops ptr_rc, i8imm, ptr_rc_nosp, i32imm, i8imm);
let ParserMatchClass = X86MemAsmOperand;
+ let OperandType = "OPERAND_MEMORY";
}
def sdmem : Operand<v2f64> {
let PrintMethod = "printf64mem";
let MIOperandInfo = (ops ptr_rc, i8imm, ptr_rc_nosp, i32imm, i8imm);
let ParserMatchClass = X86MemAsmOperand;
+ let OperandType = "OPERAND_MEMORY";
}
//===----------------------------------------------------------------------===//
@@ -301,6 +303,7 @@ def bc_v2i64 : PatFrag<(ops node:$in), (v2i64 (bitconvert node:$in))>;
// 256-bit bitconvert pattern fragments
def bc_v8i32 : PatFrag<(ops node:$in), (v8i32 (bitconvert node:$in))>;
+def bc_v4i64 : PatFrag<(ops node:$in), (v4i64 (bitconvert node:$in))>;
def vzmovl_v2i64 : PatFrag<(ops node:$src),
(bitconvert (v2i64 (X86vzmovl
diff --git a/contrib/llvm/lib/Target/X86/X86InstrInfo.cpp b/contrib/llvm/lib/Target/X86/X86InstrInfo.cpp
index e2016eb..55b5835 100644
--- a/contrib/llvm/lib/Target/X86/X86InstrInfo.cpp
+++ b/contrib/llvm/lib/Target/X86/X86InstrInfo.cpp
@@ -13,7 +13,6 @@
#include "X86InstrInfo.h"
#include "X86.h"
-#include "X86GenInstrInfo.inc"
#include "X86InstrBuilder.h"
#include "X86MachineFunctionInfo.h"
#include "X86Subtarget.h"
@@ -36,6 +35,9 @@
#include "llvm/MC/MCAsmInfo.h"
#include <limits>
+#define GET_INSTRINFO_CTOR
+#include "X86GenInstrInfo.inc"
+
using namespace llvm;
static cl::opt<bool>
@@ -52,7 +54,12 @@ ReMatPICStubLoad("remat-pic-stub-load",
cl::init(false), cl::Hidden);
X86InstrInfo::X86InstrInfo(X86TargetMachine &tm)
- : TargetInstrInfoImpl(X86Insts, array_lengthof(X86Insts)),
+ : X86GenInstrInfo((tm.getSubtarget<X86Subtarget>().is64Bit()
+ ? X86::ADJCALLSTACKDOWN64
+ : X86::ADJCALLSTACKDOWN32),
+ (tm.getSubtarget<X86Subtarget>().is64Bit()
+ ? X86::ADJCALLSTACKUP64
+ : X86::ADJCALLSTACKUP32)),
TM(tm), RI(tm, *this) {
enum {
TB_NOT_REVERSABLE = 1U << 31,
@@ -293,12 +300,17 @@ X86InstrInfo::X86InstrInfo(X86TargetMachine &tm)
{ X86::MOVAPDrr, X86::MOVAPDmr, 0, 16 },
{ X86::MOVAPSrr, X86::MOVAPSmr, 0, 16 },
{ X86::MOVDQArr, X86::MOVDQAmr, 0, 16 },
+ { X86::VMOVAPDYrr, X86::VMOVAPDYmr, 0, 32 },
+ { X86::VMOVAPSYrr, X86::VMOVAPSYmr, 0, 32 },
+ { X86::VMOVDQAYrr, X86::VMOVDQAYmr, 0, 32 },
{ X86::MOVPDI2DIrr, X86::MOVPDI2DImr, 0, 0 },
{ X86::MOVPQIto64rr,X86::MOVPQI2QImr, 0, 0 },
{ X86::MOVSDto64rr, X86::MOVSDto64mr, 0, 0 },
{ X86::MOVSS2DIrr, X86::MOVSS2DImr, 0, 0 },
{ X86::MOVUPDrr, X86::MOVUPDmr, 0, 0 },
{ X86::MOVUPSrr, X86::MOVUPSmr, 0, 0 },
+ { X86::VMOVUPDYrr, X86::VMOVUPDYmr, 0, 0 },
+ { X86::VMOVUPSYrr, X86::VMOVUPSYmr, 0, 0 },
{ X86::MUL16r, X86::MUL16m, 1, 0 },
{ X86::MUL32r, X86::MUL32m, 1, 0 },
{ X86::MUL64r, X86::MUL64m, 1, 0 },
@@ -403,10 +415,13 @@ X86InstrInfo::X86InstrInfo(X86TargetMachine &tm)
{ X86::MOV8rr, X86::MOV8rm, 0 },
{ X86::MOVAPDrr, X86::MOVAPDrm, 16 },
{ X86::MOVAPSrr, X86::MOVAPSrm, 16 },
+ { X86::VMOVAPDYrr, X86::VMOVAPDYrm, 32 },
+ { X86::VMOVAPSYrr, X86::VMOVAPSYrm, 32 },
{ X86::MOVDDUPrr, X86::MOVDDUPrm, 0 },
{ X86::MOVDI2PDIrr, X86::MOVDI2PDIrm, 0 },
{ X86::MOVDI2SSrr, X86::MOVDI2SSrm, 0 },
{ X86::MOVDQArr, X86::MOVDQArm, 16 },
+ { X86::VMOVDQAYrr, X86::VMOVDQAYrm, 16 },
{ X86::MOVSHDUPrr, X86::MOVSHDUPrm, 16 },
{ X86::MOVSLDUPrr, X86::MOVSLDUPrm, 16 },
{ X86::MOVSX16rr8, X86::MOVSX16rm8, 0 },
@@ -417,6 +432,8 @@ X86InstrInfo::X86InstrInfo(X86TargetMachine &tm)
{ X86::MOVSX64rr8, X86::MOVSX64rm8, 0 },
{ X86::MOVUPDrr, X86::MOVUPDrm, 16 },
{ X86::MOVUPSrr, X86::MOVUPSrm, 0 },
+ { X86::VMOVUPDYrr, X86::VMOVUPDYrm, 0 },
+ { X86::VMOVUPSYrr, X86::VMOVUPSYrm, 0 },
{ X86::MOVZDI2PDIrr, X86::MOVZDI2PDIrm, 0 },
{ X86::MOVZQI2PQIrr, X86::MOVZQI2PQIrm, 0 },
{ X86::MOVZPQILo2PQIrr, X86::MOVZPQILo2PQIrm, 16 },
@@ -779,6 +796,9 @@ static bool isFrameLoadOpcode(int Opcode) {
case X86::MOVAPSrm:
case X86::MOVAPDrm:
case X86::MOVDQArm:
+ case X86::VMOVAPSYrm:
+ case X86::VMOVAPDYrm:
+ case X86::VMOVDQAYrm:
case X86::MMX_MOVD64rm:
case X86::MMX_MOVQ64rm:
return true;
@@ -800,6 +820,9 @@ static bool isFrameStoreOpcode(int Opcode) {
case X86::MOVAPSmr:
case X86::MOVAPDmr:
case X86::MOVDQAmr:
+ case X86::VMOVAPSYmr:
+ case X86::VMOVAPDYmr:
+ case X86::VMOVDQAYmr:
case X86::MMX_MOVD64mr:
case X86::MMX_MOVQ64mr:
case X86::MMX_MOVNTQmr:
@@ -918,6 +941,10 @@ X86InstrInfo::isReallyTriviallyReMaterializable(const MachineInstr *MI,
case X86::MOVUPSrm:
case X86::MOVAPDrm:
case X86::MOVDQArm:
+ case X86::VMOVAPSYrm:
+ case X86::VMOVUPSYrm:
+ case X86::VMOVAPDYrm:
+ case X86::VMOVDQAYrm:
case X86::MMX_MOVD64rm:
case X86::MMX_MOVQ64rm:
case X86::FsMOVAPSrm:
@@ -1689,13 +1716,13 @@ X86::CondCode X86::GetOppositeBranchCondition(X86::CondCode CC) {
}
bool X86InstrInfo::isUnpredicatedTerminator(const MachineInstr *MI) const {
- const TargetInstrDesc &TID = MI->getDesc();
- if (!TID.isTerminator()) return false;
+ const MCInstrDesc &MCID = MI->getDesc();
+ if (!MCID.isTerminator()) return false;
// Conditional branch is a special case.
- if (TID.isBranch() && !TID.isBarrier())
+ if (MCID.isBranch() && !MCID.isBarrier())
return true;
- if (!TID.isPredicable())
+ if (!MCID.isPredicable())
return true;
return !isPredicated(MI);
}
@@ -1789,7 +1816,6 @@ bool X86InstrInfo::AnalyzeBranch(MachineBasicBlock &MBB,
.addMBB(UnCondBrIter->getOperand(0).getMBB());
BuildMI(MBB, UnCondBrIter, MBB.findDebugLoc(I), get(X86::JMP_4))
.addMBB(TargetBB);
- MBB.addSuccessor(TargetBB);
OldInst->eraseFromParent();
UnCondBrIter->eraseFromParent();
@@ -1968,6 +1994,8 @@ void X86InstrInfo::copyPhysReg(MachineBasicBlock &MBB,
Opc = X86::MOV8rr;
} else if (X86::VR128RegClass.contains(DestReg, SrcReg))
Opc = X86::MOVAPSrr;
+ else if (X86::VR256RegClass.contains(DestReg, SrcReg))
+ Opc = X86::VMOVAPSYrr;
else if (X86::VR64RegClass.contains(DestReg, SrcReg))
Opc = X86::MMX_MOVQ64rr;
else
@@ -2057,6 +2085,13 @@ static unsigned getLoadStoreRegOpcode(unsigned Reg,
return load ? X86::MOVAPSrm : X86::MOVAPSmr;
else
return load ? X86::MOVUPSrm : X86::MOVUPSmr;
+ case 32:
+ assert(X86::VR256RegClass.hasSubClassEq(RC) && "Unknown 32-byte regclass");
+ // If stack is realigned we can use aligned stores.
+ if (isStackAligned)
+ return load ? X86::VMOVAPSYrm : X86::VMOVAPSYmr;
+ else
+ return load ? X86::VMOVUPSYrm : X86::VMOVUPSYmr;
}
}
@@ -2083,7 +2118,8 @@ void X86InstrInfo::storeRegToStackSlot(MachineBasicBlock &MBB,
const MachineFunction &MF = *MBB.getParent();
assert(MF.getFrameInfo()->getObjectSize(FrameIdx) >= RC->getSize() &&
"Stack slot too small for store");
- bool isAligned = (RI.getStackAlignment() >= 16) || RI.canRealignStack(MF);
+ bool isAligned = (TM.getFrameLowering()->getStackAlignment() >= 16) ||
+ RI.canRealignStack(MF);
unsigned Opc = getStoreRegOpcode(SrcReg, RC, isAligned, TM);
DebugLoc DL = MBB.findDebugLoc(MI);
addFrameReference(BuildMI(MBB, MI, DL, get(Opc)), FrameIdx)
@@ -2115,7 +2151,8 @@ void X86InstrInfo::loadRegFromStackSlot(MachineBasicBlock &MBB,
const TargetRegisterClass *RC,
const TargetRegisterInfo *TRI) const {
const MachineFunction &MF = *MBB.getParent();
- bool isAligned = (RI.getStackAlignment() >= 16) || RI.canRealignStack(MF);
+ bool isAligned = (TM.getFrameLowering()->getStackAlignment() >= 16) ||
+ RI.canRealignStack(MF);
unsigned Opc = getLoadRegOpcode(DestReg, RC, isAligned, TM);
DebugLoc DL = MBB.findDebugLoc(MI);
addFrameReference(BuildMI(MBB, MI, DL, get(Opc), DestReg), FrameIdx);
@@ -2224,7 +2261,7 @@ X86InstrInfo::foldMemoryOperandImpl(MachineFunction &MF,
bool isTwoAddrFold = false;
unsigned NumOps = MI->getDesc().getNumOperands();
bool isTwoAddr = NumOps > 1 &&
- MI->getDesc().getOperandConstraint(1, TOI::TIED_TO) != -1;
+ MI->getDesc().getOperandConstraint(1, MCOI::TIED_TO) != -1;
// FIXME: AsmPrinter doesn't know how to handle
// X86II::MO_GOT_ABSOLUTE_ADDRESS after folding.
@@ -2273,7 +2310,7 @@ X86InstrInfo::foldMemoryOperandImpl(MachineFunction &MF,
return NULL;
bool NarrowToMOV32rm = false;
if (Size) {
- unsigned RCSize = MI->getDesc().OpInfo[i].getRegClass(&RI)->getSize();
+ unsigned RCSize = getRegClass(MI->getDesc(), i, &RI)->getSize();
if (Size < RCSize) {
// Check if it's safe to fold the load. If the size of the object is
// narrower than the load width, then it's not.
@@ -2542,7 +2579,7 @@ bool X86InstrInfo::canFoldMemoryOperand(const MachineInstr *MI,
unsigned Opc = MI->getOpcode();
unsigned NumOps = MI->getDesc().getNumOperands();
bool isTwoAddr = NumOps > 1 &&
- MI->getDesc().getOperandConstraint(1, TOI::TIED_TO) != -1;
+ MI->getDesc().getOperandConstraint(1, MCOI::TIED_TO) != -1;
// Folding a memory location into the two-address part of a two-address
// instruction is different than folding it other places. It requires
@@ -2588,9 +2625,8 @@ bool X86InstrInfo::unfoldMemoryOperand(MachineFunction &MF, MachineInstr *MI,
return false;
UnfoldStore &= FoldedStore;
- const TargetInstrDesc &TID = get(Opc);
- const TargetOperandInfo &TOI = TID.OpInfo[Index];
- const TargetRegisterClass *RC = TOI.getRegClass(&RI);
+ const MCInstrDesc &MCID = get(Opc);
+ const TargetRegisterClass *RC = getRegClass(MCID, Index, &RI);
if (!MI->hasOneMemOperand() &&
RC == &X86::VR128RegClass &&
!TM.getSubtarget<X86Subtarget>().isUnalignedMemAccessFast())
@@ -2632,7 +2668,7 @@ bool X86InstrInfo::unfoldMemoryOperand(MachineFunction &MF, MachineInstr *MI,
}
// Emit the data processing instruction.
- MachineInstr *DataMI = MF.CreateMachineInstr(TID, MI->getDebugLoc(), true);
+ MachineInstr *DataMI = MF.CreateMachineInstr(MCID, MI->getDebugLoc(), true);
MachineInstrBuilder MIB(DataMI);
if (FoldedStore)
@@ -2685,7 +2721,7 @@ bool X86InstrInfo::unfoldMemoryOperand(MachineFunction &MF, MachineInstr *MI,
// Emit the store instruction.
if (UnfoldStore) {
- const TargetRegisterClass *DstRC = TID.OpInfo[0].getRegClass(&RI);
+ const TargetRegisterClass *DstRC = getRegClass(MCID, 0, &RI);
std::pair<MachineInstr::mmo_iterator,
MachineInstr::mmo_iterator> MMOs =
MF.extractStoreMemRefs(MI->memoperands_begin(),
@@ -2710,9 +2746,9 @@ X86InstrInfo::unfoldMemoryOperand(SelectionDAG &DAG, SDNode *N,
unsigned Index = I->second.second & 0xf;
bool FoldedLoad = I->second.second & (1 << 4);
bool FoldedStore = I->second.second & (1 << 5);
- const TargetInstrDesc &TID = get(Opc);
- const TargetRegisterClass *RC = TID.OpInfo[Index].getRegClass(&RI);
- unsigned NumDefs = TID.NumDefs;
+ const MCInstrDesc &MCID = get(Opc);
+ const TargetRegisterClass *RC = getRegClass(MCID, Index, &RI);
+ unsigned NumDefs = MCID.NumDefs;
std::vector<SDValue> AddrOps;
std::vector<SDValue> BeforeOps;
std::vector<SDValue> AfterOps;
@@ -2756,13 +2792,13 @@ X86InstrInfo::unfoldMemoryOperand(SelectionDAG &DAG, SDNode *N,
// Emit the data processing instruction.
std::vector<EVT> VTs;
const TargetRegisterClass *DstRC = 0;
- if (TID.getNumDefs() > 0) {
- DstRC = TID.OpInfo[0].getRegClass(&RI);
+ if (MCID.getNumDefs() > 0) {
+ DstRC = getRegClass(MCID, 0, &RI);
VTs.push_back(*DstRC->vt_begin());
}
for (unsigned i = 0, e = N->getNumValues(); i != e; ++i) {
EVT VT = N->getValueType(i);
- if (VT != MVT::Other && i >= (unsigned)TID.getNumDefs())
+ if (VT != MVT::Other && i >= (unsigned)MCID.getNumDefs())
VTs.push_back(VT);
}
if (Load)
@@ -2845,6 +2881,11 @@ X86InstrInfo::areLoadsFromSameBasePtr(SDNode *Load1, SDNode *Load2,
case X86::MOVAPDrm:
case X86::MOVDQArm:
case X86::MOVDQUrm:
+ case X86::VMOVAPSYrm:
+ case X86::VMOVUPSYrm:
+ case X86::VMOVAPDYrm:
+ case X86::VMOVDQAYrm:
+ case X86::VMOVDQUYrm:
break;
}
switch (Opc2) {
@@ -2867,6 +2908,11 @@ X86InstrInfo::areLoadsFromSameBasePtr(SDNode *Load1, SDNode *Load2,
case X86::MOVAPDrm:
case X86::MOVDQArm:
case X86::MOVDQUrm:
+ case X86::VMOVAPSYrm:
+ case X86::VMOVUPSYrm:
+ case X86::VMOVAPDYrm:
+ case X86::VMOVDQAYrm:
+ case X86::VMOVDQUYrm:
break;
}
@@ -3045,6 +3091,13 @@ static const unsigned ReplaceableInstrs[][3] = {
{ X86::AVX_SET0PS, X86::AVX_SET0PD, X86::AVX_SET0PI },
{ X86::VXORPSrm, X86::VXORPDrm, X86::VPXORrm },
{ X86::VXORPSrr, X86::VXORPDrr, X86::VPXORrr },
+ // AVX 256-bit support
+ { X86::VMOVAPSYmr, X86::VMOVAPDYmr, X86::VMOVDQAYmr },
+ { X86::VMOVAPSYrm, X86::VMOVAPDYrm, X86::VMOVDQAYrm },
+ { X86::VMOVAPSYrr, X86::VMOVAPDYrr, X86::VMOVDQAYrr },
+ { X86::VMOVUPSYmr, X86::VMOVUPDYmr, X86::VMOVDQUYmr },
+ { X86::VMOVUPSYrm, X86::VMOVUPDYrm, X86::VMOVDQUYrm },
+ { X86::VMOVNTPSYmr, X86::VMOVNTPDYmr, X86::VMOVNTDQYmr },
};
// FIXME: Some shuffle and unpack instructions have equivalents in different
diff --git a/contrib/llvm/lib/Target/X86/X86InstrInfo.h b/contrib/llvm/lib/Target/X86/X86InstrInfo.h
index d895023..5f2eba3 100644
--- a/contrib/llvm/lib/Target/X86/X86InstrInfo.h
+++ b/contrib/llvm/lib/Target/X86/X86InstrInfo.h
@@ -19,6 +19,9 @@
#include "X86RegisterInfo.h"
#include "llvm/ADT/DenseMap.h"
+#define GET_INSTRINFO_HEADER
+#include "X86GenInstrInfo.inc"
+
namespace llvm {
class X86RegisterInfo;
class X86TargetMachine;
@@ -611,7 +614,7 @@ inline static bool isMem(const MachineInstr *MI, unsigned Op) {
isLeaMem(MI, Op);
}
-class X86InstrInfo : public TargetInstrInfoImpl {
+class X86InstrInfo : public X86GenInstrInfo {
X86TargetMachine &TM;
const X86RegisterInfo RI;
diff --git a/contrib/llvm/lib/Target/X86/X86InstrInfo.td b/contrib/llvm/lib/Target/X86/X86InstrInfo.td
index 8cab808..7eb07b0 100644
--- a/contrib/llvm/lib/Target/X86/X86InstrInfo.td
+++ b/contrib/llvm/lib/Target/X86/X86InstrInfo.td
@@ -251,6 +251,7 @@ class X86MemOperand<string printMethod> : Operand<iPTR> {
let ParserMatchClass = X86MemAsmOperand;
}
+let OperandType = "OPERAND_MEMORY" in {
def opaque32mem : X86MemOperand<"printopaquemem">;
def opaque48mem : X86MemOperand<"printopaquemem">;
def opaque80mem : X86MemOperand<"printopaquemem">;
@@ -267,6 +268,7 @@ def f64mem : X86MemOperand<"printf64mem">;
def f80mem : X86MemOperand<"printf80mem">;
def f128mem : X86MemOperand<"printf128mem">;
def f256mem : X86MemOperand<"printf256mem">;
+}
// A version of i8mem for use on x86-64 that uses GR64_NOREX instead of
// plain GR64, so that it doesn't potentially require a REX prefix.
@@ -274,6 +276,7 @@ def i8mem_NOREX : Operand<i64> {
let PrintMethod = "printi8mem";
let MIOperandInfo = (ops GR64_NOREX, i8imm, GR64_NOREX_NOSP, i32imm, i8imm);
let ParserMatchClass = X86MemAsmOperand;
+ let OperandType = "OPERAND_MEMORY";
}
// GPRs available for tailcall.
@@ -287,6 +290,7 @@ def i32mem_TC : Operand<i32> {
let PrintMethod = "printi32mem";
let MIOperandInfo = (ops GR32_TC, i8imm, GR32_TC, i32imm, i8imm);
let ParserMatchClass = X86MemAsmOperand;
+ let OperandType = "OPERAND_MEMORY";
}
// Special i64mem for addresses of load folding tail calls. These are not
@@ -297,9 +301,11 @@ def i64mem_TC : Operand<i64> {
let MIOperandInfo = (ops ptr_rc_tailcall, i8imm,
ptr_rc_tailcall, i32imm, i8imm);
let ParserMatchClass = X86MemAsmOperand;
+ let OperandType = "OPERAND_MEMORY";
}
-let ParserMatchClass = X86AbsMemAsmOperand,
+let OperandType = "OPERAND_PCREL",
+ ParserMatchClass = X86AbsMemAsmOperand,
PrintMethod = "print_pcrel_imm" in {
def i32imm_pcrel : Operand<i32>;
def i16imm_pcrel : Operand<i16>;
@@ -317,6 +323,7 @@ def brtarget8 : Operand<OtherVT>;
def SSECC : Operand<i8> {
let PrintMethod = "printSSECC";
+ let OperandType = "OPERAND_IMMEDIATE";
}
class ImmSExtAsmOperandClass : AsmOperandClass {
@@ -363,15 +370,18 @@ def ImmSExti64i8AsmOperand : ImmSExtAsmOperandClass {
// 16-bits but only 8 bits are significant.
def i16i8imm : Operand<i16> {
let ParserMatchClass = ImmSExti16i8AsmOperand;
+ let OperandType = "OPERAND_IMMEDIATE";
}
// 32-bits but only 8 bits are significant.
def i32i8imm : Operand<i32> {
let ParserMatchClass = ImmSExti32i8AsmOperand;
+ let OperandType = "OPERAND_IMMEDIATE";
}
// 64-bits but only 32 bits are significant.
def i64i32imm : Operand<i64> {
let ParserMatchClass = ImmSExti64i32AsmOperand;
+ let OperandType = "OPERAND_IMMEDIATE";
}
// 64-bits but only 32 bits are significant, and those bits are treated as being
@@ -438,8 +448,10 @@ def HasFMA3 : Predicate<"Subtarget->hasFMA3()">;
def HasFMA4 : Predicate<"Subtarget->hasFMA4()">;
def FPStackf32 : Predicate<"!Subtarget->hasXMM()">;
def FPStackf64 : Predicate<"!Subtarget->hasXMMInt()">;
-def In32BitMode : Predicate<"!Subtarget->is64Bit()">, AssemblerPredicate;
-def In64BitMode : Predicate<"Subtarget->is64Bit()">, AssemblerPredicate;
+def In32BitMode : Predicate<"!Subtarget->is64Bit()">,
+ AssemblerPredicate<"!Mode64Bit">;
+def In64BitMode : Predicate<"Subtarget->is64Bit()">,
+ AssemblerPredicate<"Mode64Bit">;
def IsWin64 : Predicate<"Subtarget->isTargetWin64()">;
def NotWin64 : Predicate<"!Subtarget->isTargetWin64()">;
def SmallCode : Predicate<"TM.getCodeModel() == CodeModel::Small">;
@@ -669,7 +681,7 @@ def PUSH64rmm: I<0xFF, MRM6m, (outs), (ins i64mem:$src), "push{q}\t$src", []>;
}
let Defs = [RSP], Uses = [RSP], neverHasSideEffects = 1, mayStore = 1 in {
-def PUSH64i8 : Ii8<0x6a, RawFrm, (outs), (ins i8imm:$imm),
+def PUSH64i8 : Ii8<0x6a, RawFrm, (outs), (ins i64i8imm:$imm),
"push{q}\t$imm", []>;
def PUSH64i16 : Ii16<0x68, RawFrm, (outs), (ins i16imm:$imm),
"push{q}\t$imm", []>;
diff --git a/contrib/llvm/lib/Target/X86/X86InstrSSE.td b/contrib/llvm/lib/Target/X86/X86InstrSSE.td
index b64c03a..fe11d77 100644
--- a/contrib/llvm/lib/Target/X86/X86InstrSSE.td
+++ b/contrib/llvm/lib/Target/X86/X86InstrSSE.td
@@ -512,6 +512,26 @@ defm VCVTSI2SDL : sse12_vcvt_avx<0x2A, GR32, FR64, i32mem, "cvtsi2sd{l}">, XD,
defm VCVTSI2SD64 : sse12_vcvt_avx<0x2A, GR64, FR64, i64mem, "cvtsi2sd{q}">, XD,
VEX_4V, VEX_W;
+let Predicates = [HasAVX] in {
+ def : Pat<(f32 (sint_to_fp (loadi32 addr:$src))),
+ (VCVTSI2SSrm (f32 (IMPLICIT_DEF)), addr:$src)>;
+ def : Pat<(f32 (sint_to_fp (loadi64 addr:$src))),
+ (VCVTSI2SS64rm (f32 (IMPLICIT_DEF)), addr:$src)>;
+ def : Pat<(f64 (sint_to_fp (loadi32 addr:$src))),
+ (VCVTSI2SDrm (f64 (IMPLICIT_DEF)), addr:$src)>;
+ def : Pat<(f64 (sint_to_fp (loadi64 addr:$src))),
+ (VCVTSI2SD64rm (f64 (IMPLICIT_DEF)), addr:$src)>;
+
+ def : Pat<(f32 (sint_to_fp GR32:$src)),
+ (VCVTSI2SSrr (f32 (IMPLICIT_DEF)), GR32:$src)>;
+ def : Pat<(f32 (sint_to_fp GR64:$src)),
+ (VCVTSI2SS64rr (f32 (IMPLICIT_DEF)), GR64:$src)>;
+ def : Pat<(f64 (sint_to_fp GR32:$src)),
+ (VCVTSI2SDrr (f64 (IMPLICIT_DEF)), GR32:$src)>;
+ def : Pat<(f64 (sint_to_fp GR64:$src)),
+ (VCVTSI2SD64rr (f64 (IMPLICIT_DEF)), GR64:$src)>;
+}
+
defm CVTTSS2SI : sse12_cvt_s<0x2C, FR32, GR32, fp_to_sint, f32mem, loadf32,
"cvttss2si\t{$src, $dst|$dst, $src}">, XS;
defm CVTTSS2SI64 : sse12_cvt_s<0x2C, FR32, GR64, fp_to_sint, f32mem, loadf32,
@@ -1473,83 +1493,68 @@ let neverHasSideEffects = 1, Pattern = []<dag>, isCommutable = 0 in
/// sse12_fp_packed_logical - SSE 1 & 2 packed FP logical ops
///
multiclass sse12_fp_packed_logical<bits<8> opc, string OpcodeStr,
- SDNode OpNode, int HasPat = 0,
- list<list<dag>> Pattern = []> {
+ SDNode OpNode> {
let Pattern = []<dag> in {
defm V#NAME#PS : sse12_fp_packed_logical_rm<opc, VR128, SSEPackedSingle,
!strconcat(OpcodeStr, "ps"), f128mem,
- !if(HasPat, Pattern[0], // rr
- [(set VR128:$dst, (v2i64 (OpNode VR128:$src1,
- VR128:$src2)))]),
- !if(HasPat, Pattern[2], // rm
- [(set VR128:$dst, (OpNode (bc_v2i64 (v4f32 VR128:$src1)),
- (memopv2i64 addr:$src2)))]), 0>,
- VEX_4V;
+ [(set VR128:$dst, (v2i64 (OpNode VR128:$src1, VR128:$src2)))],
+ [(set VR128:$dst, (OpNode (bc_v2i64 (v4f32 VR128:$src1)),
+ (memopv2i64 addr:$src2)))], 0>, VEX_4V;
defm V#NAME#PD : sse12_fp_packed_logical_rm<opc, VR128, SSEPackedDouble,
!strconcat(OpcodeStr, "pd"), f128mem,
- !if(HasPat, Pattern[1], // rr
- [(set VR128:$dst, (OpNode (bc_v2i64 (v2f64 VR128:$src1)),
- (bc_v2i64 (v2f64
- VR128:$src2))))]),
- !if(HasPat, Pattern[3], // rm
- [(set VR128:$dst, (OpNode (bc_v2i64 (v2f64 VR128:$src1)),
- (memopv2i64 addr:$src2)))]), 0>,
- OpSize, VEX_4V;
+ [(set VR128:$dst, (OpNode (bc_v2i64 (v2f64 VR128:$src1)),
+ (bc_v2i64 (v2f64 VR128:$src2))))],
+ [(set VR128:$dst, (OpNode (bc_v2i64 (v2f64 VR128:$src1)),
+ (memopv2i64 addr:$src2)))], 0>,
+ OpSize, VEX_4V;
}
let Constraints = "$src1 = $dst" in {
defm PS : sse12_fp_packed_logical_rm<opc, VR128, SSEPackedSingle,
!strconcat(OpcodeStr, "ps"), f128mem,
- !if(HasPat, Pattern[0], // rr
- [(set VR128:$dst, (v2i64 (OpNode VR128:$src1,
- VR128:$src2)))]),
- !if(HasPat, Pattern[2], // rm
- [(set VR128:$dst, (OpNode (bc_v2i64 (v4f32 VR128:$src1)),
- (memopv2i64 addr:$src2)))])>, TB;
+ [(set VR128:$dst, (v2i64 (OpNode VR128:$src1, VR128:$src2)))],
+ [(set VR128:$dst, (OpNode (bc_v2i64 (v4f32 VR128:$src1)),
+ (memopv2i64 addr:$src2)))]>, TB;
defm PD : sse12_fp_packed_logical_rm<opc, VR128, SSEPackedDouble,
!strconcat(OpcodeStr, "pd"), f128mem,
- !if(HasPat, Pattern[1], // rr
- [(set VR128:$dst, (OpNode (bc_v2i64 (v2f64 VR128:$src1)),
- (bc_v2i64 (v2f64
- VR128:$src2))))]),
- !if(HasPat, Pattern[3], // rm
- [(set VR128:$dst, (OpNode (bc_v2i64 (v2f64 VR128:$src1)),
- (memopv2i64 addr:$src2)))])>,
- TB, OpSize;
+ [(set VR128:$dst, (OpNode (bc_v2i64 (v2f64 VR128:$src1)),
+ (bc_v2i64 (v2f64 VR128:$src2))))],
+ [(set VR128:$dst, (OpNode (bc_v2i64 (v2f64 VR128:$src1)),
+ (memopv2i64 addr:$src2)))]>, TB, OpSize;
}
}
/// sse12_fp_packed_logical_y - AVX 256-bit SSE 1 & 2 logical ops forms
///
-multiclass sse12_fp_packed_logical_y<bits<8> opc, string OpcodeStr> {
+multiclass sse12_fp_packed_logical_y<bits<8> opc, string OpcodeStr,
+ SDNode OpNode> {
defm PSY : sse12_fp_packed_logical_rm<opc, VR256, SSEPackedSingle,
- !strconcat(OpcodeStr, "ps"), f256mem, [], [], 0>, VEX_4V;
+ !strconcat(OpcodeStr, "ps"), f256mem,
+ [(set VR256:$dst, (v4i64 (OpNode VR256:$src1, VR256:$src2)))],
+ [(set VR256:$dst, (OpNode (bc_v4i64 (v8f32 VR256:$src1)),
+ (memopv4i64 addr:$src2)))], 0>, VEX_4V;
defm PDY : sse12_fp_packed_logical_rm<opc, VR256, SSEPackedDouble,
- !strconcat(OpcodeStr, "pd"), f256mem, [], [], 0>, OpSize, VEX_4V;
+ !strconcat(OpcodeStr, "pd"), f256mem,
+ [(set VR256:$dst, (OpNode (bc_v4i64 (v4f64 VR256:$src1)),
+ (bc_v4i64 (v4f64 VR256:$src2))))],
+ [(set VR256:$dst, (OpNode (bc_v4i64 (v4f64 VR256:$src1)),
+ (memopv4i64 addr:$src2)))], 0>,
+ OpSize, VEX_4V;
}
// AVX 256-bit packed logical ops forms
-defm VAND : sse12_fp_packed_logical_y<0x54, "and">;
-defm VOR : sse12_fp_packed_logical_y<0x56, "or">;
-defm VXOR : sse12_fp_packed_logical_y<0x57, "xor">;
-let isCommutable = 0 in
- defm VANDN : sse12_fp_packed_logical_y<0x55, "andn">;
+defm VAND : sse12_fp_packed_logical_y<0x54, "and", and>;
+defm VOR : sse12_fp_packed_logical_y<0x56, "or", or>;
+defm VXOR : sse12_fp_packed_logical_y<0x57, "xor", xor>;
+defm VANDN : sse12_fp_packed_logical_y<0x55, "andn", X86andnp>;
defm AND : sse12_fp_packed_logical<0x54, "and", and>;
defm OR : sse12_fp_packed_logical<0x56, "or", or>;
defm XOR : sse12_fp_packed_logical<0x57, "xor", xor>;
let isCommutable = 0 in
- defm ANDN : sse12_fp_packed_logical<0x55, "andn", undef /* dummy */, 1, [
- // single r+r
- [(set VR128:$dst, (X86pandn VR128:$src1, VR128:$src2))],
- // double r+r
- [],
- // single r+m
- [(set VR128:$dst, (X86pandn VR128:$src1, (memopv2i64 addr:$src2)))],
- // double r+m
- []]>;
+ defm ANDN : sse12_fp_packed_logical<0x55, "andn", X86andnp>;
//===----------------------------------------------------------------------===//
// SSE 1 & 2 - Arithmetic Instructions
@@ -1991,11 +1996,11 @@ def : Pat<(alignednontemporalstore (v2i64 VR128:$src), addr:$dst),
// There is no AVX form for instructions below this point
def MOVNTImr : I<0xC3, MRMDestMem, (outs), (ins i32mem:$dst, GR32:$src),
- "movnti\t{$src, $dst|$dst, $src}",
+ "movnti{l}\t{$src, $dst|$dst, $src}",
[(nontemporalstore (i32 GR32:$src), addr:$dst)]>,
TB, Requires<[HasSSE2]>;
def MOVNTI_64mr : RI<0xC3, MRMDestMem, (outs), (ins i64mem:$dst, GR64:$src),
- "movnti\t{$src, $dst|$dst, $src}",
+ "movnti{q}\t{$src, $dst|$dst, $src}",
[(nontemporalstore (i64 GR64:$src), addr:$dst)]>,
TB, Requires<[HasSSE2]>;
}
@@ -2006,13 +2011,13 @@ def MOVNTI_64mr : RI<0xC3, MRMDestMem, (outs), (ins i64mem:$dst, GR64:$src),
// Prefetch intrinsic.
def PREFETCHT0 : PSI<0x18, MRM1m, (outs), (ins i8mem:$src),
- "prefetcht0\t$src", [(prefetch addr:$src, imm, (i32 3))]>;
+ "prefetcht0\t$src", [(prefetch addr:$src, imm, (i32 3), (i32 1))]>;
def PREFETCHT1 : PSI<0x18, MRM2m, (outs), (ins i8mem:$src),
- "prefetcht1\t$src", [(prefetch addr:$src, imm, (i32 2))]>;
+ "prefetcht1\t$src", [(prefetch addr:$src, imm, (i32 2), (i32 1))]>;
def PREFETCHT2 : PSI<0x18, MRM3m, (outs), (ins i8mem:$src),
- "prefetcht2\t$src", [(prefetch addr:$src, imm, (i32 1))]>;
+ "prefetcht2\t$src", [(prefetch addr:$src, imm, (i32 1), (i32 1))]>;
def PREFETCHNTA : PSI<0x18, MRM0m, (outs), (ins i8mem:$src),
- "prefetchnta\t$src", [(prefetch addr:$src, imm, (i32 0))]>;
+ "prefetchnta\t$src", [(prefetch addr:$src, imm, (i32 0), (i32 1))]>;
// Load, store, and memory fence
def SFENCE : I<0xAE, MRM_F8, (outs), (ins), "sfence", [(int_x86_sse_sfence)]>,
@@ -2037,7 +2042,10 @@ def V_SET0PI : PDI<0xEF, MRMInitReg, (outs VR128:$dst), (ins), "",
}
// The same as done above but for AVX. The 128-bit versions are the
-// same, but re-encoded. The 256-bit does not support PI version.
+// same, but re-encoded. The 256-bit does not support PI version, and
+// doesn't need it because on sandy bridge the register is set to zero
+// at the rename stage without using any execution unit, so SET0PSY
+// and SET0PDY can be used for vector int instructions without penalty
// FIXME: Change encoding to pseudo! This is blocked right now by the x86
// JIT implementatioan, it does not expand the instructions below like
// X86MCInstLower does.
@@ -2052,8 +2060,8 @@ def AVX_SET0PSY : PSI<0x57, MRMInitReg, (outs VR256:$dst), (ins), "",
def AVX_SET0PDY : PDI<0x57, MRMInitReg, (outs VR256:$dst), (ins), "",
[(set VR256:$dst, (v4f64 immAllZerosV))]>, VEX_4V;
let ExeDomain = SSEPackedInt in
-def AVX_SET0PI : PDI<0xEF, MRMInitReg, (outs VR128:$dst), (ins), "",
- [(set VR128:$dst, (v4i32 immAllZerosV))]>;
+def AVX_SET0PI : PDI<0xEF, MRMInitReg, (outs VR128:$dst), (ins), "",
+ [(set VR128:$dst, (v4i32 immAllZerosV))]>;
}
def : Pat<(v2i64 immAllZerosV), (V_SET0PI)>;
@@ -2063,6 +2071,15 @@ def : Pat<(v16i8 immAllZerosV), (V_SET0PI)>;
def : Pat<(f32 (vector_extract (v4f32 VR128:$src), (iPTR 0))),
(f32 (EXTRACT_SUBREG (v4f32 VR128:$src), sub_ss))>;
+// FIXME: According to the intel manual, DEST[127:64] <- SRC1[127:64], while
+// in the non-AVX version bits 127:64 aren't touched. Find a better way to
+// represent this instead of always zeroing SRC1. One possible solution is
+// to represent the instruction w/ something similar as the "$src1 = $dst"
+// constraint but without the tied operands.
+def : Pat<(extloadf32 addr:$src),
+ (VCVTSS2SDrm (f32 (EXTRACT_SUBREG (AVX_SET0PS), sub_ss)), addr:$src)>,
+ Requires<[HasAVX, OptForSpeed]>;
+
//===----------------------------------------------------------------------===//
// SSE 1 & 2 - Load/Store XCSR register
//===----------------------------------------------------------------------===//
@@ -2959,6 +2976,22 @@ def : Pat<(v4i32 (X86vzmovl (bc_v4i32 (loadv2i64 addr:$src)))),
(MOVZDI2PDIrm addr:$src)>;
}
+// These are the correct encodings of the instructions so that we know how to
+// read correct assembly, even though we continue to emit the wrong ones for
+// compatibility with Darwin's buggy assembler.
+def : InstAlias<"movq\t{$src, $dst|$dst, $src}",
+ (MOV64toPQIrr VR128:$dst, GR64:$src), 0>;
+def : InstAlias<"movq\t{$src, $dst|$dst, $src}",
+ (MOV64toSDrr FR64:$dst, GR64:$src), 0>;
+def : InstAlias<"movq\t{$src, $dst|$dst, $src}",
+ (MOVPQIto64rr GR64:$dst, VR128:$src), 0>;
+def : InstAlias<"movq\t{$src, $dst|$dst, $src}",
+ (MOVSDto64rr GR64:$dst, FR64:$src), 0>;
+def : InstAlias<"movq\t{$src, $dst|$dst, $src}",
+ (VMOVZQI2PQIrr VR128:$dst, GR64:$src), 0>;
+def : InstAlias<"movq\t{$src, $dst|$dst, $src}",
+ (MOVZQI2PQIrr VR128:$dst, GR64:$src), 0>;
+
//===---------------------------------------------------------------------===//
// SSE2 - Move Quadword
//===---------------------------------------------------------------------===//
@@ -3589,6 +3622,16 @@ let Predicates = [HasSSE2] in
def : Pat<(fextend (loadf32 addr:$src)),
(CVTSS2SDrm addr:$src)>;
+// FIXME: According to the intel manual, DEST[127:64] <- SRC1[127:64], while
+// in the non-AVX version bits 127:64 aren't touched. Find a better way to
+// represent this instead of always zeroing SRC1. One possible solution is
+// to represent the instruction w/ something similar as the "$src1 = $dst"
+// constraint but without the tied operands.
+let Predicates = [HasAVX] in
+ def : Pat<(fextend (loadf32 addr:$src)),
+ (VCVTSS2SDrm (f32 (EXTRACT_SUBREG (AVX_SET0PS), sub_ss)),
+ addr:$src)>;
+
// bit_convert
let Predicates = [HasXMMInt] in {
def : Pat<(v2i64 (bitconvert (v4i32 VR128:$src))), (v2i64 VR128:$src)>;
@@ -3625,6 +3668,19 @@ let Predicates = [HasXMMInt] in {
let Predicates = [HasAVX] in {
def : Pat<(v4f64 (bitconvert (v8f32 VR256:$src))), (v4f64 VR256:$src)>;
+ def : Pat<(v4f64 (bitconvert (v4i64 VR256:$src))), (v4f64 VR256:$src)>;
+ def : Pat<(v4f64 (bitconvert (v32i8 VR256:$src))), (v4f64 VR256:$src)>;
+ def : Pat<(v8f32 (bitconvert (v4i64 VR256:$src))), (v8f32 VR256:$src)>;
+ def : Pat<(v8f32 (bitconvert (v4f64 VR256:$src))), (v8f32 VR256:$src)>;
+ def : Pat<(v8f32 (bitconvert (v32i8 VR256:$src))), (v8f32 VR256:$src)>;
+ def : Pat<(v4i64 (bitconvert (v8f32 VR256:$src))), (v4i64 VR256:$src)>;
+ def : Pat<(v4i64 (bitconvert (v4f64 VR256:$src))), (v4i64 VR256:$src)>;
+ def : Pat<(v4i64 (bitconvert (v32i8 VR256:$src))), (v4i64 VR256:$src)>;
+ def : Pat<(v32i8 (bitconvert (v4f64 VR256:$src))), (v32i8 VR256:$src)>;
+ def : Pat<(v32i8 (bitconvert (v4i64 VR256:$src))), (v32i8 VR256:$src)>;
+ def : Pat<(v32i8 (bitconvert (v8f32 VR256:$src))), (v32i8 VR256:$src)>;
+ def : Pat<(v32i8 (bitconvert (v8i32 VR256:$src))), (v32i8 VR256:$src)>;
+ def : Pat<(v8i32 (bitconvert (v32i8 VR256:$src))), (v8i32 VR256:$src)>;
}
// Move scalar to XMM zero-extended
@@ -3807,6 +3863,8 @@ def : Pat<(v4i32 (fp_to_sint (v4f32 VR128:$src))),
(CVTTPS2DQrr VR128:$src)>, Requires<[HasSSE2]>;
// Use movaps / movups for SSE integer load / store (one byte shorter).
+// The instructions selected below are then converted to MOVDQA/MOVDQU
+// during the SSE domain pass.
let Predicates = [HasSSE1] in {
def : Pat<(alignedloadv4i32 addr:$src),
(MOVAPSrm addr:$src)>;
@@ -3835,8 +3893,9 @@ let Predicates = [HasSSE1] in {
(MOVUPSmr addr:$dst, VR128:$src)>;
}
-// Use vmovaps/vmovups for AVX 128-bit integer load/store (one byte shorter).
+// Use vmovaps/vmovups for AVX integer load/store.
let Predicates = [HasAVX] in {
+ // 128-bit load/store
def : Pat<(alignedloadv4i32 addr:$src),
(VMOVAPSrm addr:$src)>;
def : Pat<(loadv4i32 addr:$src),
@@ -3862,6 +3921,24 @@ let Predicates = [HasAVX] in {
(VMOVUPSmr addr:$dst, VR128:$src)>;
def : Pat<(store (v16i8 VR128:$src), addr:$dst),
(VMOVUPSmr addr:$dst, VR128:$src)>;
+
+ // 256-bit load/store
+ def : Pat<(alignedloadv4i64 addr:$src),
+ (VMOVAPSYrm addr:$src)>;
+ def : Pat<(loadv4i64 addr:$src),
+ (VMOVUPSYrm addr:$src)>;
+ def : Pat<(alignedloadv8i32 addr:$src),
+ (VMOVAPSYrm addr:$src)>;
+ def : Pat<(loadv8i32 addr:$src),
+ (VMOVUPSYrm addr:$src)>;
+ def : Pat<(alignedstore (v4i64 VR256:$src), addr:$dst),
+ (VMOVAPSYmr addr:$dst, VR256:$src)>;
+ def : Pat<(alignedstore (v8i32 VR256:$src), addr:$dst),
+ (VMOVAPSYmr addr:$dst, VR256:$src)>;
+ def : Pat<(store (v4i64 VR256:$src), addr:$dst),
+ (VMOVUPSYmr addr:$dst, VR256:$src)>;
+ def : Pat<(store (v8i32 VR256:$src), addr:$dst),
+ (VMOVUPSYmr addr:$dst, VR256:$src)>;
}
//===----------------------------------------------------------------------===//
@@ -5160,33 +5237,52 @@ def AESKEYGENASSIST128rm : AESAI<0xDF, MRMSrcMem, (outs VR128:$dst),
// CLMUL Instructions
//===----------------------------------------------------------------------===//
-// Only the AVX version of CLMUL instructions are described here.
-
// Carry-less Multiplication instructions
-def VPCLMULQDQrr : CLMULIi8<0x44, MRMSrcReg, (outs VR128:$dst),
+let Constraints = "$src1 = $dst" in {
+def PCLMULQDQrr : CLMULIi8<0x44, MRMSrcReg, (outs VR128:$dst),
+ (ins VR128:$src1, VR128:$src2, i8imm:$src3),
+ "pclmulqdq\t{$src3, $src2, $dst|$dst, $src2, $src3}",
+ []>;
+
+def PCLMULQDQrm : CLMULIi8<0x44, MRMSrcMem, (outs VR128:$dst),
+ (ins VR128:$src1, i128mem:$src2, i8imm:$src3),
+ "pclmulqdq\t{$src3, $src2, $dst|$dst, $src2, $src3}",
+ []>;
+}
+
+// AVX carry-less Multiplication instructions
+def VPCLMULQDQrr : AVXCLMULIi8<0x44, MRMSrcReg, (outs VR128:$dst),
(ins VR128:$src1, VR128:$src2, i8imm:$src3),
"vpclmulqdq\t{$src3, $src2, $src1, $dst|$dst, $src1, $src2, $src3}",
[]>;
-def VPCLMULQDQrm : CLMULIi8<0x44, MRMSrcMem, (outs VR128:$dst),
+def VPCLMULQDQrm : AVXCLMULIi8<0x44, MRMSrcMem, (outs VR128:$dst),
(ins VR128:$src1, i128mem:$src2, i8imm:$src3),
"vpclmulqdq\t{$src3, $src2, $src1, $dst|$dst, $src1, $src2, $src3}",
[]>;
-// Assembler Only
-multiclass avx_vpclmul<string asm> {
- def rr : I<0, Pseudo, (outs VR128:$dst), (ins VR128:$src1, VR128:$src2),
- !strconcat(asm, "\t{$src2, $src1, $dst|$dst, $src1, $src2}"),
- []>;
-
- def rm : I<0, Pseudo, (outs VR128:$dst), (ins VR128:$src1, i128mem:$src2),
- !strconcat(asm, "\t{$src2, $src1, $dst|$dst, $src1, $src2}"),
- []>;
-}
-defm VPCLMULHQHQDQ : avx_vpclmul<"vpclmulhqhqdq">;
-defm VPCLMULHQLQDQ : avx_vpclmul<"vpclmulhqlqdq">;
-defm VPCLMULLQHQDQ : avx_vpclmul<"vpclmullqhqdq">;
-defm VPCLMULLQLQDQ : avx_vpclmul<"vpclmullqlqdq">;
+
+multiclass pclmul_alias<string asm, int immop> {
+ def : InstAlias<!strconcat("pclmul", asm,
+ "dq {$src, $dst|$dst, $src}"),
+ (PCLMULQDQrr VR128:$dst, VR128:$src, immop)>;
+
+ def : InstAlias<!strconcat("pclmul", asm,
+ "dq {$src, $dst|$dst, $src}"),
+ (PCLMULQDQrm VR128:$dst, i128mem:$src, immop)>;
+
+ def : InstAlias<!strconcat("vpclmul", asm,
+ "dq {$src2, $src1, $dst|$dst, $src1, $src2}"),
+ (VPCLMULQDQrr VR128:$dst, VR128:$src1, VR128:$src2, immop)>;
+
+ def : InstAlias<!strconcat("vpclmul", asm,
+ "dq {$src2, $src1, $dst|$dst, $src1, $src2}"),
+ (VPCLMULQDQrm VR128:$dst, VR128:$src1, i128mem:$src2, immop)>;
+}
+defm : pclmul_alias<"hqhq", 0x11>;
+defm : pclmul_alias<"hqlq", 0x01>;
+defm : pclmul_alias<"lqhq", 0x10>;
+defm : pclmul_alias<"lqlq", 0x00>;
//===----------------------------------------------------------------------===//
// AVX Instructions
diff --git a/contrib/llvm/lib/Target/X86/X86InstrSystem.td b/contrib/llvm/lib/Target/X86/X86InstrSystem.td
index f73cff3..31de878 100644
--- a/contrib/llvm/lib/Target/X86/X86InstrSystem.td
+++ b/contrib/llvm/lib/Target/X86/X86InstrSystem.td
@@ -411,6 +411,8 @@ let Uses = [RDX, RAX, RCX] in
let Defs = [RAX, RDI], Uses = [RDX, RDI] in
def XSTORE : I<0xc0, RawFrm, (outs), (ins), "xstore", []>, A7;
+def : InstAlias<"xstorerng", (XSTORE)>;
+
let Defs = [RSI, RDI], Uses = [RBX, RDX, RSI, RDI] in {
def XCRYPTECB : I<0xc8, RawFrm, (outs), (ins), "xcryptecb", []>, A7;
def XCRYPTCBC : I<0xd0, RawFrm, (outs), (ins), "xcryptcbc", []>, A7;
diff --git a/contrib/llvm/lib/Target/X86/X86MCCodeEmitter.cpp b/contrib/llvm/lib/Target/X86/X86MCCodeEmitter.cpp
index 55aceba..ce8ef49 100644
--- a/contrib/llvm/lib/Target/X86/X86MCCodeEmitter.cpp
+++ b/contrib/llvm/lib/Target/X86/X86MCCodeEmitter.cpp
@@ -18,26 +18,32 @@
#include "llvm/MC/MCCodeEmitter.h"
#include "llvm/MC/MCExpr.h"
#include "llvm/MC/MCInst.h"
+#include "llvm/MC/MCSubtargetInfo.h"
#include "llvm/MC/MCSymbol.h"
#include "llvm/Support/raw_ostream.h"
+
using namespace llvm;
namespace {
class X86MCCodeEmitter : public MCCodeEmitter {
X86MCCodeEmitter(const X86MCCodeEmitter &); // DO NOT IMPLEMENT
void operator=(const X86MCCodeEmitter &); // DO NOT IMPLEMENT
- const TargetMachine &TM;
- const TargetInstrInfo &TII;
+ const MCInstrInfo &MCII;
+ const MCSubtargetInfo &STI;
MCContext &Ctx;
- bool Is64BitMode;
public:
- X86MCCodeEmitter(TargetMachine &tm, MCContext &ctx, bool is64Bit)
- : TM(tm), TII(*TM.getInstrInfo()), Ctx(ctx) {
- Is64BitMode = is64Bit;
+ X86MCCodeEmitter(const MCInstrInfo &mcii, const MCSubtargetInfo &sti,
+ MCContext &ctx)
+ : MCII(mcii), STI(sti), Ctx(ctx) {
}
~X86MCCodeEmitter() {}
+ bool is64BitMode() const {
+ // FIXME: Can tablegen auto-generate this?
+ return (STI.getFeatureBits() & X86::Mode64Bit) != 0;
+ }
+
static unsigned GetX86RegNum(const MCOperand &MO) {
return X86RegisterInfo::getX86RegNum(MO.getReg());
}
@@ -111,7 +117,7 @@ public:
SmallVectorImpl<MCFixup> &Fixups) const;
void EmitVEXOpcodePrefix(uint64_t TSFlags, unsigned &CurByte, int MemOperand,
- const MCInst &MI, const TargetInstrDesc &Desc,
+ const MCInst &MI, const MCInstrDesc &Desc,
raw_ostream &OS) const;
void EmitSegmentOverridePrefix(uint64_t TSFlags, unsigned &CurByte,
@@ -119,23 +125,17 @@ public:
raw_ostream &OS) const;
void EmitOpcodePrefix(uint64_t TSFlags, unsigned &CurByte, int MemOperand,
- const MCInst &MI, const TargetInstrDesc &Desc,
+ const MCInst &MI, const MCInstrDesc &Desc,
raw_ostream &OS) const;
};
} // end anonymous namespace
-MCCodeEmitter *llvm::createX86_32MCCodeEmitter(const Target &,
- TargetMachine &TM,
- MCContext &Ctx) {
- return new X86MCCodeEmitter(TM, Ctx, false);
-}
-
-MCCodeEmitter *llvm::createX86_64MCCodeEmitter(const Target &,
- TargetMachine &TM,
- MCContext &Ctx) {
- return new X86MCCodeEmitter(TM, Ctx, true);
+MCCodeEmitter *llvm::createX86MCCodeEmitter(const MCInstrInfo &MCII,
+ const MCSubtargetInfo &STI,
+ MCContext &Ctx) {
+ return new X86MCCodeEmitter(MCII, STI, Ctx);
}
/// isDisp8 - Return true if this signed displacement fits in a 8-bit
@@ -245,7 +245,7 @@ void X86MCCodeEmitter::EmitMemModRMByte(const MCInst &MI, unsigned Op,
// Handle %rip relative addressing.
if (BaseReg == X86::RIP) { // [disp32+RIP] in X86-64 mode
- assert(Is64BitMode && "Rip-relative addressing requires 64-bit mode");
+ assert(is64BitMode() && "Rip-relative addressing requires 64-bit mode");
assert(IndexReg.getReg() == 0 && "Invalid rip-relative address");
EmitByte(ModRMByte(0, RegOpcodeField, 5), CurByte, OS);
@@ -284,7 +284,7 @@ void X86MCCodeEmitter::EmitMemModRMByte(const MCInst &MI, unsigned Op,
BaseRegNo != N86::ESP &&
// If there is no base register and we're in 64-bit mode, we need a SIB
// byte to emit an addr that is just 'disp32' (the non-RIP relative form).
- (!Is64BitMode || BaseReg != 0)) {
+ (!is64BitMode() || BaseReg != 0)) {
if (BaseReg == 0) { // [disp32] in X86-32 mode
EmitByte(ModRMByte(0, RegOpcodeField, 5), CurByte, OS);
@@ -379,7 +379,7 @@ void X86MCCodeEmitter::EmitMemModRMByte(const MCInst &MI, unsigned Op,
/// called VEX.
void X86MCCodeEmitter::EmitVEXOpcodePrefix(uint64_t TSFlags, unsigned &CurByte,
int MemOperand, const MCInst &MI,
- const TargetInstrDesc &Desc,
+ const MCInstrDesc &Desc,
raw_ostream &OS) const {
bool HasVEX_4V = false;
if ((TSFlags >> X86II::VEXShift) & X86II::VEX_4V)
@@ -586,7 +586,7 @@ void X86MCCodeEmitter::EmitVEXOpcodePrefix(uint64_t TSFlags, unsigned &CurByte,
/// REX prefix which specifies 1) 64-bit instructions, 2) non-default operand
/// size, and 3) use of X86-64 extended registers.
static unsigned DetermineREXPrefix(const MCInst &MI, uint64_t TSFlags,
- const TargetInstrDesc &Desc) {
+ const MCInstrDesc &Desc) {
unsigned REX = 0;
if (TSFlags & X86II::REX_W)
REX |= 1 << 3; // set REX.W
@@ -596,7 +596,7 @@ static unsigned DetermineREXPrefix(const MCInst &MI, uint64_t TSFlags,
unsigned NumOps = MI.getNumOperands();
// FIXME: MCInst should explicitize the two-addrness.
bool isTwoAddr = NumOps > 1 &&
- Desc.getOperandConstraint(1, TOI::TIED_TO) != -1;
+ Desc.getOperandConstraint(1, MCOI::TIED_TO) != -1;
// If it accesses SPL, BPL, SIL, or DIL, then it requires a 0x40 REX prefix.
unsigned i = isTwoAddr ? 1 : 0;
@@ -713,7 +713,7 @@ void X86MCCodeEmitter::EmitSegmentOverridePrefix(uint64_t TSFlags,
/// Not present, it is -1.
void X86MCCodeEmitter::EmitOpcodePrefix(uint64_t TSFlags, unsigned &CurByte,
int MemOperand, const MCInst &MI,
- const TargetInstrDesc &Desc,
+ const MCInstrDesc &Desc,
raw_ostream &OS) const {
// Emit the lock opcode prefix as needed.
@@ -729,7 +729,7 @@ void X86MCCodeEmitter::EmitOpcodePrefix(uint64_t TSFlags, unsigned &CurByte,
// Emit the address size opcode prefix as needed.
if ((TSFlags & X86II::AdSize) ||
- (MemOperand != -1 && Is64BitMode && Is32BitMemOperand(MI, MemOperand)))
+ (MemOperand != -1 && is64BitMode() && Is32BitMemOperand(MI, MemOperand)))
EmitByte(0x67, CurByte, OS);
// Emit the operand size opcode prefix as needed.
@@ -772,7 +772,7 @@ void X86MCCodeEmitter::EmitOpcodePrefix(uint64_t TSFlags, unsigned &CurByte,
// Handle REX prefix.
// FIXME: Can this come before F2 etc to simplify emission?
- if (Is64BitMode) {
+ if (is64BitMode()) {
if (unsigned REX = DetermineREXPrefix(MI, TSFlags, Desc))
EmitByte(0x40 | REX, CurByte, OS);
}
@@ -803,7 +803,7 @@ void X86MCCodeEmitter::
EncodeInstruction(const MCInst &MI, raw_ostream &OS,
SmallVectorImpl<MCFixup> &Fixups) const {
unsigned Opcode = MI.getOpcode();
- const TargetInstrDesc &Desc = TII.get(Opcode);
+ const MCInstrDesc &Desc = MCII.get(Opcode);
uint64_t TSFlags = Desc.TSFlags;
// Pseudo instructions don't get encoded.
@@ -814,9 +814,9 @@ EncodeInstruction(const MCInst &MI, raw_ostream &OS,
// FIXME: This should be handled during MCInst lowering.
unsigned NumOps = Desc.getNumOperands();
unsigned CurOp = 0;
- if (NumOps > 1 && Desc.getOperandConstraint(1, TOI::TIED_TO) != -1)
+ if (NumOps > 1 && Desc.getOperandConstraint(1, MCOI::TIED_TO) != -1)
++CurOp;
- else if (NumOps > 2 && Desc.getOperandConstraint(NumOps-1, TOI::TIED_TO)== 0)
+ else if (NumOps > 2 && Desc.getOperandConstraint(NumOps-1, MCOI::TIED_TO)== 0)
// Skip the last source operand that is tied_to the dest reg. e.g. LXADD32
--NumOps;
diff --git a/contrib/llvm/lib/Target/X86/X86MCInstLower.cpp b/contrib/llvm/lib/Target/X86/X86MCInstLower.cpp
index 793156f..e385335 100644
--- a/contrib/llvm/lib/Target/X86/X86MCInstLower.cpp
+++ b/contrib/llvm/lib/Target/X86/X86MCInstLower.cpp
@@ -16,8 +16,8 @@
#include "X86MCInstLower.h"
#include "X86AsmPrinter.h"
#include "X86COFFMachineModuleInfo.h"
-#include "X86MCAsmInfo.h"
#include "llvm/CodeGen/MachineModuleInfoImpls.h"
+#include "llvm/MC/MCAsmInfo.h"
#include "llvm/MC/MCContext.h"
#include "llvm/MC/MCExpr.h"
#include "llvm/MC/MCInst.h"
diff --git a/contrib/llvm/lib/Target/X86/X86MachObjectWriter.cpp b/contrib/llvm/lib/Target/X86/X86MachObjectWriter.cpp
index 8f3dd32..3711038 100644
--- a/contrib/llvm/lib/Target/X86/X86MachObjectWriter.cpp
+++ b/contrib/llvm/lib/Target/X86/X86MachObjectWriter.cpp
@@ -8,19 +8,541 @@
//===----------------------------------------------------------------------===//
#include "X86.h"
+#include "X86FixupKinds.h"
+#include "llvm/ADT/Twine.h"
+#include "llvm/MC/MCAssembler.h"
+#include "llvm/MC/MCAsmLayout.h"
#include "llvm/MC/MCMachObjectWriter.h"
+#include "llvm/MC/MCSectionMachO.h"
+#include "llvm/MC/MCValue.h"
+#include "llvm/Support/ErrorHandling.h"
+#include "llvm/Object/MachOFormat.h"
+
using namespace llvm;
+using namespace llvm::object;
namespace {
class X86MachObjectWriter : public MCMachObjectTargetWriter {
+ void RecordScatteredRelocation(MachObjectWriter *Writer,
+ const MCAssembler &Asm,
+ const MCAsmLayout &Layout,
+ const MCFragment *Fragment,
+ const MCFixup &Fixup,
+ MCValue Target,
+ unsigned Log2Size,
+ uint64_t &FixedValue);
+ void RecordTLVPRelocation(MachObjectWriter *Writer,
+ const MCAssembler &Asm,
+ const MCAsmLayout &Layout,
+ const MCFragment *Fragment,
+ const MCFixup &Fixup,
+ MCValue Target,
+ uint64_t &FixedValue);
+
+ void RecordX86Relocation(MachObjectWriter *Writer,
+ const MCAssembler &Asm,
+ const MCAsmLayout &Layout,
+ const MCFragment *Fragment,
+ const MCFixup &Fixup,
+ MCValue Target,
+ uint64_t &FixedValue);
+ void RecordX86_64Relocation(MachObjectWriter *Writer,
+ const MCAssembler &Asm,
+ const MCAsmLayout &Layout,
+ const MCFragment *Fragment,
+ const MCFixup &Fixup,
+ MCValue Target,
+ uint64_t &FixedValue);
public:
X86MachObjectWriter(bool Is64Bit, uint32_t CPUType,
uint32_t CPUSubtype)
: MCMachObjectTargetWriter(Is64Bit, CPUType, CPUSubtype,
/*UseAggressiveSymbolFolding=*/Is64Bit) {}
+
+ void RecordRelocation(MachObjectWriter *Writer,
+ const MCAssembler &Asm, const MCAsmLayout &Layout,
+ const MCFragment *Fragment, const MCFixup &Fixup,
+ MCValue Target, uint64_t &FixedValue) {
+ if (Writer->is64Bit())
+ RecordX86_64Relocation(Writer, Asm, Layout, Fragment, Fixup, Target,
+ FixedValue);
+ else
+ RecordX86Relocation(Writer, Asm, Layout, Fragment, Fixup, Target,
+ FixedValue);
+ }
};
}
+static bool isFixupKindRIPRel(unsigned Kind) {
+ return Kind == X86::reloc_riprel_4byte ||
+ Kind == X86::reloc_riprel_4byte_movq_load;
+}
+
+static unsigned getFixupKindLog2Size(unsigned Kind) {
+ switch (Kind) {
+ default:
+ llvm_unreachable("invalid fixup kind!");
+ case FK_PCRel_1:
+ case FK_Data_1: return 0;
+ case FK_PCRel_2:
+ case FK_Data_2: return 1;
+ case FK_PCRel_4:
+ // FIXME: Remove these!!!
+ case X86::reloc_riprel_4byte:
+ case X86::reloc_riprel_4byte_movq_load:
+ case X86::reloc_signed_4byte:
+ case FK_Data_4: return 2;
+ case FK_Data_8: return 3;
+ }
+}
+
+void X86MachObjectWriter::RecordX86_64Relocation(MachObjectWriter *Writer,
+ const MCAssembler &Asm,
+ const MCAsmLayout &Layout,
+ const MCFragment *Fragment,
+ const MCFixup &Fixup,
+ MCValue Target,
+ uint64_t &FixedValue) {
+ unsigned IsPCRel = Writer->isFixupKindPCRel(Asm, Fixup.getKind());
+ unsigned IsRIPRel = isFixupKindRIPRel(Fixup.getKind());
+ unsigned Log2Size = getFixupKindLog2Size(Fixup.getKind());
+
+ // See <reloc.h>.
+ uint32_t FixupOffset =
+ Layout.getFragmentOffset(Fragment) + Fixup.getOffset();
+ uint32_t FixupAddress =
+ Writer->getFragmentAddress(Fragment, Layout) + Fixup.getOffset();
+ int64_t Value = 0;
+ unsigned Index = 0;
+ unsigned IsExtern = 0;
+ unsigned Type = 0;
+
+ Value = Target.getConstant();
+
+ if (IsPCRel) {
+ // Compensate for the relocation offset, Darwin x86_64 relocations only have
+ // the addend and appear to have attempted to define it to be the actual
+ // expression addend without the PCrel bias. However, instructions with data
+ // following the relocation are not accommodated for (see comment below
+ // regarding SIGNED{1,2,4}), so it isn't exactly that either.
+ Value += 1LL << Log2Size;
+ }
+
+ if (Target.isAbsolute()) { // constant
+ // SymbolNum of 0 indicates the absolute section.
+ Type = macho::RIT_X86_64_Unsigned;
+ Index = 0;
+
+ // FIXME: I believe this is broken, I don't think the linker can understand
+ // it. I think it would require a local relocation, but I'm not sure if that
+ // would work either. The official way to get an absolute PCrel relocation
+ // is to use an absolute symbol (which we don't support yet).
+ if (IsPCRel) {
+ IsExtern = 1;
+ Type = macho::RIT_X86_64_Branch;
+ }
+ } else if (Target.getSymB()) { // A - B + constant
+ const MCSymbol *A = &Target.getSymA()->getSymbol();
+ MCSymbolData &A_SD = Asm.getSymbolData(*A);
+ const MCSymbolData *A_Base = Asm.getAtom(&A_SD);
+
+ const MCSymbol *B = &Target.getSymB()->getSymbol();
+ MCSymbolData &B_SD = Asm.getSymbolData(*B);
+ const MCSymbolData *B_Base = Asm.getAtom(&B_SD);
+
+ // Neither symbol can be modified.
+ if (Target.getSymA()->getKind() != MCSymbolRefExpr::VK_None ||
+ Target.getSymB()->getKind() != MCSymbolRefExpr::VK_None)
+ report_fatal_error("unsupported relocation of modified symbol");
+
+ // We don't support PCrel relocations of differences. Darwin 'as' doesn't
+ // implement most of these correctly.
+ if (IsPCRel)
+ report_fatal_error("unsupported pc-relative relocation of difference");
+
+ // The support for the situation where one or both of the symbols would
+ // require a local relocation is handled just like if the symbols were
+ // external. This is certainly used in the case of debug sections where the
+ // section has only temporary symbols and thus the symbols don't have base
+ // symbols. This is encoded using the section ordinal and non-extern
+ // relocation entries.
+
+ // Darwin 'as' doesn't emit correct relocations for this (it ends up with a
+ // single SIGNED relocation); reject it for now. Except the case where both
+ // symbols don't have a base, equal but both NULL.
+ if (A_Base == B_Base && A_Base)
+ report_fatal_error("unsupported relocation with identical base");
+
+ Value += Writer->getSymbolAddress(&A_SD, Layout) -
+ (A_Base == NULL ? 0 : Writer->getSymbolAddress(A_Base, Layout));
+ Value -= Writer->getSymbolAddress(&B_SD, Layout) -
+ (B_Base == NULL ? 0 : Writer->getSymbolAddress(B_Base, Layout));
+
+ if (A_Base) {
+ Index = A_Base->getIndex();
+ IsExtern = 1;
+ }
+ else {
+ Index = A_SD.getFragment()->getParent()->getOrdinal() + 1;
+ IsExtern = 0;
+ }
+ Type = macho::RIT_X86_64_Unsigned;
+
+ macho::RelocationEntry MRE;
+ MRE.Word0 = FixupOffset;
+ MRE.Word1 = ((Index << 0) |
+ (IsPCRel << 24) |
+ (Log2Size << 25) |
+ (IsExtern << 27) |
+ (Type << 28));
+ Writer->addRelocation(Fragment->getParent(), MRE);
+
+ if (B_Base) {
+ Index = B_Base->getIndex();
+ IsExtern = 1;
+ }
+ else {
+ Index = B_SD.getFragment()->getParent()->getOrdinal() + 1;
+ IsExtern = 0;
+ }
+ Type = macho::RIT_X86_64_Subtractor;
+ } else {
+ const MCSymbol *Symbol = &Target.getSymA()->getSymbol();
+ MCSymbolData &SD = Asm.getSymbolData(*Symbol);
+ const MCSymbolData *Base = Asm.getAtom(&SD);
+
+ // Relocations inside debug sections always use local relocations when
+ // possible. This seems to be done because the debugger doesn't fully
+ // understand x86_64 relocation entries, and expects to find values that
+ // have already been fixed up.
+ if (Symbol->isInSection()) {
+ const MCSectionMachO &Section = static_cast<const MCSectionMachO&>(
+ Fragment->getParent()->getSection());
+ if (Section.hasAttribute(MCSectionMachO::S_ATTR_DEBUG))
+ Base = 0;
+ }
+
+ // x86_64 almost always uses external relocations, except when there is no
+ // symbol to use as a base address (a local symbol with no preceding
+ // non-local symbol).
+ if (Base) {
+ Index = Base->getIndex();
+ IsExtern = 1;
+
+ // Add the local offset, if needed.
+ if (Base != &SD)
+ Value += Layout.getSymbolOffset(&SD) - Layout.getSymbolOffset(Base);
+ } else if (Symbol->isInSection() && !Symbol->isVariable()) {
+ // The index is the section ordinal (1-based).
+ Index = SD.getFragment()->getParent()->getOrdinal() + 1;
+ IsExtern = 0;
+ Value += Writer->getSymbolAddress(&SD, Layout);
+
+ if (IsPCRel)
+ Value -= FixupAddress + (1 << Log2Size);
+ } else if (Symbol->isVariable()) {
+ const MCExpr *Value = Symbol->getVariableValue();
+ int64_t Res;
+ bool isAbs = Value->EvaluateAsAbsolute(Res, Layout,
+ Writer->getSectionAddressMap());
+ if (isAbs) {
+ FixedValue = Res;
+ return;
+ } else {
+ report_fatal_error("unsupported relocation of variable '" +
+ Symbol->getName() + "'");
+ }
+ } else {
+ report_fatal_error("unsupported relocation of undefined symbol '" +
+ Symbol->getName() + "'");
+ }
+
+ MCSymbolRefExpr::VariantKind Modifier = Target.getSymA()->getKind();
+ if (IsPCRel) {
+ if (IsRIPRel) {
+ if (Modifier == MCSymbolRefExpr::VK_GOTPCREL) {
+ // x86_64 distinguishes movq foo@GOTPCREL so that the linker can
+ // rewrite the movq to an leaq at link time if the symbol ends up in
+ // the same linkage unit.
+ if (unsigned(Fixup.getKind()) == X86::reloc_riprel_4byte_movq_load)
+ Type = macho::RIT_X86_64_GOTLoad;
+ else
+ Type = macho::RIT_X86_64_GOT;
+ } else if (Modifier == MCSymbolRefExpr::VK_TLVP) {
+ Type = macho::RIT_X86_64_TLV;
+ } else if (Modifier != MCSymbolRefExpr::VK_None) {
+ report_fatal_error("unsupported symbol modifier in relocation");
+ } else {
+ Type = macho::RIT_X86_64_Signed;
+
+ // The Darwin x86_64 relocation format has a problem where it cannot
+ // encode an address (L<foo> + <constant>) which is outside the atom
+ // containing L<foo>. Generally, this shouldn't occur but it does
+ // happen when we have a RIPrel instruction with data following the
+ // relocation entry (e.g., movb $012, L0(%rip)). Even with the PCrel
+ // adjustment Darwin x86_64 uses, the offset is still negative and the
+ // linker has no way to recognize this.
+ //
+ // To work around this, Darwin uses several special relocation types
+ // to indicate the offsets. However, the specification or
+ // implementation of these seems to also be incomplete; they should
+ // adjust the addend as well based on the actual encoded instruction
+ // (the additional bias), but instead appear to just look at the final
+ // offset.
+ switch (-(Target.getConstant() + (1LL << Log2Size))) {
+ case 1: Type = macho::RIT_X86_64_Signed1; break;
+ case 2: Type = macho::RIT_X86_64_Signed2; break;
+ case 4: Type = macho::RIT_X86_64_Signed4; break;
+ }
+ }
+ } else {
+ if (Modifier != MCSymbolRefExpr::VK_None)
+ report_fatal_error("unsupported symbol modifier in branch "
+ "relocation");
+
+ Type = macho::RIT_X86_64_Branch;
+ }
+ } else {
+ if (Modifier == MCSymbolRefExpr::VK_GOT) {
+ Type = macho::RIT_X86_64_GOT;
+ } else if (Modifier == MCSymbolRefExpr::VK_GOTPCREL) {
+ // GOTPCREL is allowed as a modifier on non-PCrel instructions, in which
+ // case all we do is set the PCrel bit in the relocation entry; this is
+ // used with exception handling, for example. The source is required to
+ // include any necessary offset directly.
+ Type = macho::RIT_X86_64_GOT;
+ IsPCRel = 1;
+ } else if (Modifier == MCSymbolRefExpr::VK_TLVP) {
+ report_fatal_error("TLVP symbol modifier should have been rip-rel");
+ } else if (Modifier != MCSymbolRefExpr::VK_None)
+ report_fatal_error("unsupported symbol modifier in relocation");
+ else
+ Type = macho::RIT_X86_64_Unsigned;
+ }
+ }
+
+ // x86_64 always writes custom values into the fixups.
+ FixedValue = Value;
+
+ // struct relocation_info (8 bytes)
+ macho::RelocationEntry MRE;
+ MRE.Word0 = FixupOffset;
+ MRE.Word1 = ((Index << 0) |
+ (IsPCRel << 24) |
+ (Log2Size << 25) |
+ (IsExtern << 27) |
+ (Type << 28));
+ Writer->addRelocation(Fragment->getParent(), MRE);
+}
+
+void X86MachObjectWriter::RecordScatteredRelocation(MachObjectWriter *Writer,
+ const MCAssembler &Asm,
+ const MCAsmLayout &Layout,
+ const MCFragment *Fragment,
+ const MCFixup &Fixup,
+ MCValue Target,
+ unsigned Log2Size,
+ uint64_t &FixedValue) {
+ uint32_t FixupOffset = Layout.getFragmentOffset(Fragment)+Fixup.getOffset();
+ unsigned IsPCRel = Writer->isFixupKindPCRel(Asm, Fixup.getKind());
+ unsigned Type = macho::RIT_Vanilla;
+
+ // See <reloc.h>.
+ const MCSymbol *A = &Target.getSymA()->getSymbol();
+ MCSymbolData *A_SD = &Asm.getSymbolData(*A);
+
+ if (!A_SD->getFragment())
+ report_fatal_error("symbol '" + A->getName() +
+ "' can not be undefined in a subtraction expression");
+
+ uint32_t Value = Writer->getSymbolAddress(A_SD, Layout);
+ uint64_t SecAddr = Writer->getSectionAddress(A_SD->getFragment()->getParent());
+ FixedValue += SecAddr;
+ uint32_t Value2 = 0;
+
+ if (const MCSymbolRefExpr *B = Target.getSymB()) {
+ MCSymbolData *B_SD = &Asm.getSymbolData(B->getSymbol());
+
+ if (!B_SD->getFragment())
+ report_fatal_error("symbol '" + B->getSymbol().getName() +
+ "' can not be undefined in a subtraction expression");
+
+ // Select the appropriate difference relocation type.
+ //
+ // Note that there is no longer any semantic difference between these two
+ // relocation types from the linkers point of view, this is done solely for
+ // pedantic compatibility with 'as'.
+ Type = A_SD->isExternal() ? (unsigned)macho::RIT_Difference :
+ (unsigned)macho::RIT_Generic_LocalDifference;
+ Value2 = Writer->getSymbolAddress(B_SD, Layout);
+ FixedValue -= Writer->getSectionAddress(B_SD->getFragment()->getParent());
+ }
+
+ // Relocations are written out in reverse order, so the PAIR comes first.
+ if (Type == macho::RIT_Difference ||
+ Type == macho::RIT_Generic_LocalDifference) {
+ macho::RelocationEntry MRE;
+ MRE.Word0 = ((0 << 0) |
+ (macho::RIT_Pair << 24) |
+ (Log2Size << 28) |
+ (IsPCRel << 30) |
+ macho::RF_Scattered);
+ MRE.Word1 = Value2;
+ Writer->addRelocation(Fragment->getParent(), MRE);
+ }
+
+ macho::RelocationEntry MRE;
+ MRE.Word0 = ((FixupOffset << 0) |
+ (Type << 24) |
+ (Log2Size << 28) |
+ (IsPCRel << 30) |
+ macho::RF_Scattered);
+ MRE.Word1 = Value;
+ Writer->addRelocation(Fragment->getParent(), MRE);
+}
+
+void X86MachObjectWriter::RecordTLVPRelocation(MachObjectWriter *Writer,
+ const MCAssembler &Asm,
+ const MCAsmLayout &Layout,
+ const MCFragment *Fragment,
+ const MCFixup &Fixup,
+ MCValue Target,
+ uint64_t &FixedValue) {
+ assert(Target.getSymA()->getKind() == MCSymbolRefExpr::VK_TLVP &&
+ !is64Bit() &&
+ "Should only be called with a 32-bit TLVP relocation!");
+
+ unsigned Log2Size = getFixupKindLog2Size(Fixup.getKind());
+ uint32_t Value = Layout.getFragmentOffset(Fragment)+Fixup.getOffset();
+ unsigned IsPCRel = 0;
+
+ // Get the symbol data.
+ MCSymbolData *SD_A = &Asm.getSymbolData(Target.getSymA()->getSymbol());
+ unsigned Index = SD_A->getIndex();
+
+ // We're only going to have a second symbol in pic mode and it'll be a
+ // subtraction from the picbase. For 32-bit pic the addend is the difference
+ // between the picbase and the next address. For 32-bit static the addend is
+ // zero.
+ if (Target.getSymB()) {
+ // If this is a subtraction then we're pcrel.
+ uint32_t FixupAddress =
+ Writer->getFragmentAddress(Fragment, Layout) + Fixup.getOffset();
+ MCSymbolData *SD_B = &Asm.getSymbolData(Target.getSymB()->getSymbol());
+ IsPCRel = 1;
+ FixedValue = (FixupAddress - Writer->getSymbolAddress(SD_B, Layout) +
+ Target.getConstant());
+ FixedValue += 1ULL << Log2Size;
+ } else {
+ FixedValue = 0;
+ }
+
+ // struct relocation_info (8 bytes)
+ macho::RelocationEntry MRE;
+ MRE.Word0 = Value;
+ MRE.Word1 = ((Index << 0) |
+ (IsPCRel << 24) |
+ (Log2Size << 25) |
+ (1 << 27) | // Extern
+ (macho::RIT_Generic_TLV << 28)); // Type
+ Writer->addRelocation(Fragment->getParent(), MRE);
+}
+
+void X86MachObjectWriter::RecordX86Relocation(MachObjectWriter *Writer,
+ const MCAssembler &Asm,
+ const MCAsmLayout &Layout,
+ const MCFragment *Fragment,
+ const MCFixup &Fixup,
+ MCValue Target,
+ uint64_t &FixedValue) {
+ unsigned IsPCRel = Writer->isFixupKindPCRel(Asm, Fixup.getKind());
+ unsigned Log2Size = getFixupKindLog2Size(Fixup.getKind());
+
+ // If this is a 32-bit TLVP reloc it's handled a bit differently.
+ if (Target.getSymA() &&
+ Target.getSymA()->getKind() == MCSymbolRefExpr::VK_TLVP) {
+ RecordTLVPRelocation(Writer, Asm, Layout, Fragment, Fixup, Target,
+ FixedValue);
+ return;
+ }
+
+ // If this is a difference or a defined symbol plus an offset, then we need a
+ // scattered relocation entry. Differences always require scattered
+ // relocations.
+ if (Target.getSymB())
+ return RecordScatteredRelocation(Writer, Asm, Layout, Fragment, Fixup,
+ Target, Log2Size, FixedValue);
+
+ // Get the symbol data, if any.
+ MCSymbolData *SD = 0;
+ if (Target.getSymA())
+ SD = &Asm.getSymbolData(Target.getSymA()->getSymbol());
+
+ // If this is an internal relocation with an offset, it also needs a scattered
+ // relocation entry.
+ uint32_t Offset = Target.getConstant();
+ if (IsPCRel)
+ Offset += 1 << Log2Size;
+ if (Offset && SD && !Writer->doesSymbolRequireExternRelocation(SD))
+ return RecordScatteredRelocation(Writer, Asm, Layout, Fragment, Fixup,
+ Target, Log2Size, FixedValue);
+
+ // See <reloc.h>.
+ uint32_t FixupOffset = Layout.getFragmentOffset(Fragment)+Fixup.getOffset();
+ unsigned Index = 0;
+ unsigned IsExtern = 0;
+ unsigned Type = 0;
+
+ if (Target.isAbsolute()) { // constant
+ // SymbolNum of 0 indicates the absolute section.
+ //
+ // FIXME: Currently, these are never generated (see code below). I cannot
+ // find a case where they are actually emitted.
+ Type = macho::RIT_Vanilla;
+ } else {
+ // Resolve constant variables.
+ if (SD->getSymbol().isVariable()) {
+ int64_t Res;
+ if (SD->getSymbol().getVariableValue()->EvaluateAsAbsolute(
+ Res, Layout, Writer->getSectionAddressMap())) {
+ FixedValue = Res;
+ return;
+ }
+ }
+
+ // Check whether we need an external or internal relocation.
+ if (Writer->doesSymbolRequireExternRelocation(SD)) {
+ IsExtern = 1;
+ Index = SD->getIndex();
+ // For external relocations, make sure to offset the fixup value to
+ // compensate for the addend of the symbol address, if it was
+ // undefined. This occurs with weak definitions, for example.
+ if (!SD->Symbol->isUndefined())
+ FixedValue -= Layout.getSymbolOffset(SD);
+ } else {
+ // The index is the section ordinal (1-based).
+ const MCSectionData &SymSD = Asm.getSectionData(
+ SD->getSymbol().getSection());
+ Index = SymSD.getOrdinal() + 1;
+ FixedValue += Writer->getSectionAddress(&SymSD);
+ }
+ if (IsPCRel)
+ FixedValue -= Writer->getSectionAddress(Fragment->getParent());
+
+ Type = macho::RIT_Vanilla;
+ }
+
+ // struct relocation_info (8 bytes)
+ macho::RelocationEntry MRE;
+ MRE.Word0 = FixupOffset;
+ MRE.Word1 = ((Index << 0) |
+ (IsPCRel << 24) |
+ (Log2Size << 25) |
+ (IsExtern << 27) |
+ (Type << 28));
+ Writer->addRelocation(Fragment->getParent(), MRE);
+}
+
MCObjectWriter *llvm::createX86MachObjectWriter(raw_ostream &OS,
bool Is64Bit,
uint32_t CPUType,
diff --git a/contrib/llvm/lib/Target/X86/X86RegisterInfo.cpp b/contrib/llvm/lib/Target/X86/X86RegisterInfo.cpp
index 1ad6203..f2faf59 100644
--- a/contrib/llvm/lib/Target/X86/X86RegisterInfo.cpp
+++ b/contrib/llvm/lib/Target/X86/X86RegisterInfo.cpp
@@ -39,6 +39,10 @@
#include "llvm/ADT/STLExtras.h"
#include "llvm/Support/ErrorHandling.h"
#include "llvm/Support/CommandLine.h"
+
+#define GET_REGINFO_TARGET_DESC
+#include "X86GenRegisterInfo.inc"
+
using namespace llvm;
cl::opt<bool>
@@ -49,18 +53,11 @@ ForceStackAlign("force-align-stack",
X86RegisterInfo::X86RegisterInfo(X86TargetMachine &tm,
const TargetInstrInfo &tii)
- : X86GenRegisterInfo(tm.getSubtarget<X86Subtarget>().is64Bit() ?
- X86::ADJCALLSTACKDOWN64 :
- X86::ADJCALLSTACKDOWN32,
- tm.getSubtarget<X86Subtarget>().is64Bit() ?
- X86::ADJCALLSTACKUP64 :
- X86::ADJCALLSTACKUP32),
- TM(tm), TII(tii) {
+ : X86GenRegisterInfo(), TM(tm), TII(tii) {
// Cache some information.
const X86Subtarget *Subtarget = &TM.getSubtarget<X86Subtarget>();
Is64Bit = Subtarget->is64Bit();
IsWin64 = Subtarget->isTargetWin64();
- StackAlign = TM.getFrameLowering()->getStackAlignment();
if (Is64Bit) {
SlotSize = 8;
@@ -107,6 +104,21 @@ int X86RegisterInfo::getLLVMRegNum(unsigned DwarfRegNo, bool isEH) const {
return X86GenRegisterInfo::getLLVMRegNumFull(DwarfRegNo, Flavour);
}
+/// getCompactUnwindRegNum - This function maps the register to the number for
+/// compact unwind encoding. Return -1 if the register isn't valid.
+int X86RegisterInfo::getCompactUnwindRegNum(unsigned RegNum, bool isEH) const {
+ switch (getLLVMRegNum(RegNum, isEH)) {
+ case X86::EBX: case X86::RBX: return 1;
+ case X86::ECX: case X86::R12: return 2;
+ case X86::EDX: case X86::R13: return 3;
+ case X86::EDI: case X86::R14: return 4;
+ case X86::ESI: case X86::R15: return 5;
+ case X86::EBP: case X86::RBP: return 6;
+ }
+
+ return -1;
+}
+
int
X86RegisterInfo::getSEHRegNum(unsigned i) const {
int reg = getX86RegNum(i);
@@ -495,18 +507,6 @@ BitVector X86RegisterInfo::getReservedRegs(const MachineFunction &MF) const {
Reserved.set(X86::BPL);
}
- // Mark the x87 stack registers as reserved, since they don't behave normally
- // with respect to liveness. We don't fully model the effects of x87 stack
- // pushes and pops after stackification.
- Reserved.set(X86::ST0);
- Reserved.set(X86::ST1);
- Reserved.set(X86::ST2);
- Reserved.set(X86::ST3);
- Reserved.set(X86::ST4);
- Reserved.set(X86::ST5);
- Reserved.set(X86::ST6);
- Reserved.set(X86::ST7);
-
// Mark the segment registers as reserved.
Reserved.set(X86::CS);
Reserved.set(X86::SS);
@@ -517,13 +517,20 @@ BitVector X86RegisterInfo::getReservedRegs(const MachineFunction &MF) const {
// Reserve the registers that only exist in 64-bit mode.
if (!Is64Bit) {
+ // These 8-bit registers are part of the x86-64 extension even though their
+ // super-registers are old 32-bits.
+ Reserved.set(X86::SIL);
+ Reserved.set(X86::DIL);
+ Reserved.set(X86::BPL);
+ Reserved.set(X86::SPL);
+
for (unsigned n = 0; n != 8; ++n) {
+ // R8, R9, ...
const unsigned GPR64[] = {
X86::R8, X86::R9, X86::R10, X86::R11,
X86::R12, X86::R13, X86::R14, X86::R15
};
- for (const unsigned *AI = getOverlaps(GPR64[n]); unsigned Reg = *AI;
- ++AI)
+ for (const unsigned *AI = getOverlaps(GPR64[n]); unsigned Reg = *AI; ++AI)
Reserved.set(Reg);
// XMM8, XMM9, ...
@@ -550,6 +557,7 @@ bool X86RegisterInfo::canRealignStack(const MachineFunction &MF) const {
bool X86RegisterInfo::needsStackRealignment(const MachineFunction &MF) const {
const MachineFrameInfo *MFI = MF.getFrameInfo();
const Function *F = MF.getFunction();
+ unsigned StackAlign = TM.getFrameLowering()->getStackAlignment();
bool requiresRealignment = ((MFI->getMaxAlignment() > StackAlign) ||
F->hasFnAttr(Attribute::StackAlignment));
@@ -608,7 +616,7 @@ eliminateCallFramePseudoInstr(MachineFunction &MF, MachineBasicBlock &MBB,
const TargetFrameLowering *TFI = MF.getTarget().getFrameLowering();
bool reseveCallFrame = TFI->hasReservedCallFrame(MF);
int Opcode = I->getOpcode();
- bool isDestroy = Opcode == getCallFrameDestroyOpcode();
+ bool isDestroy = Opcode == TII.getCallFrameDestroyOpcode();
DebugLoc DL = I->getDebugLoc();
uint64_t Amount = !reseveCallFrame ? I->getOperand(0).getImm() : 0;
uint64_t CalleeAmt = isDestroy ? I->getOperand(1).getImm() : 0;
@@ -625,16 +633,17 @@ eliminateCallFramePseudoInstr(MachineFunction &MF, MachineBasicBlock &MBB,
// We need to keep the stack aligned properly. To do this, we round the
// amount of space needed for the outgoing arguments up to the next
// alignment boundary.
+ unsigned StackAlign = TM.getFrameLowering()->getStackAlignment();
Amount = (Amount + StackAlign - 1) / StackAlign * StackAlign;
MachineInstr *New = 0;
- if (Opcode == getCallFrameSetupOpcode()) {
+ if (Opcode == TII.getCallFrameSetupOpcode()) {
New = BuildMI(MF, DL, TII.get(getSUBriOpcode(Is64Bit, Amount)),
StackPtr)
.addReg(StackPtr)
.addImm(Amount);
} else {
- assert(Opcode == getCallFrameDestroyOpcode());
+ assert(Opcode == TII.getCallFrameDestroyOpcode());
// Factor out the amount the callee already popped.
Amount -= CalleeAmt;
@@ -657,7 +666,7 @@ eliminateCallFramePseudoInstr(MachineFunction &MF, MachineBasicBlock &MBB,
return;
}
- if (Opcode == getCallFrameDestroyOpcode() && CalleeAmt) {
+ if (Opcode == TII.getCallFrameDestroyOpcode() && CalleeAmt) {
// If we are performing frame pointer elimination and if the callee pops
// something off the stack pointer, add it back. We do this until we have
// more advanced stack pointer tracking ability.
@@ -667,6 +676,13 @@ eliminateCallFramePseudoInstr(MachineFunction &MF, MachineBasicBlock &MBB,
// The EFLAGS implicit def is dead.
New->getOperand(3).setIsDead();
+
+ // We are not tracking the stack pointer adjustment by the callee, so make
+ // sure we restore the stack pointer immediately after the call, there may
+ // be spill code inserted between the CALL and ADJCALLSTACKUP instructions.
+ MachineBasicBlock::iterator B = MBB.begin();
+ while (I != B && !llvm::prior(I)->getDesc().isCall())
+ --I;
MBB.insert(I, New);
}
}
@@ -713,7 +729,10 @@ X86RegisterInfo::eliminateFrameIndex(MachineBasicBlock::iterator II,
if (MI.getOperand(i+3).isImm()) {
// Offset is a 32-bit integer.
- int Offset = FIOffset + (int)(MI.getOperand(i + 3).getImm());
+ int Imm = (int)(MI.getOperand(i + 3).getImm());
+ int Offset = FIOffset + Imm;
+ assert((!Is64Bit || isInt<32>((long long)FIOffset + Imm)) &&
+ "Requesting 64-bit offset in 32-bit immediate!");
MI.getOperand(i + 3).ChangeToImmediate(Offset);
} else {
// Offset is symbolic. This is extremely rare.
@@ -910,8 +929,6 @@ unsigned getX86SubSuperRegister(unsigned Reg, EVT VT, bool High) {
}
}
-#include "X86GenRegisterInfo.inc"
-
namespace {
struct MSAH : public MachineFunctionPass {
static char ID;
@@ -920,10 +937,10 @@ namespace {
virtual bool runOnMachineFunction(MachineFunction &MF) {
const X86TargetMachine *TM =
static_cast<const X86TargetMachine *>(&MF.getTarget());
- const X86RegisterInfo *X86RI = TM->getRegisterInfo();
+ const TargetFrameLowering *TFI = TM->getFrameLowering();
MachineRegisterInfo &RI = MF.getRegInfo();
X86MachineFunctionInfo *FuncInfo = MF.getInfo<X86MachineFunctionInfo>();
- unsigned StackAlignment = X86RI->getStackAlignment();
+ unsigned StackAlignment = TFI->getStackAlignment();
// Be over-conservative: scan over all vreg defs and find whether vector
// registers are used. If yes, there is a possibility that vector register
diff --git a/contrib/llvm/lib/Target/X86/X86RegisterInfo.h b/contrib/llvm/lib/Target/X86/X86RegisterInfo.h
index dd3d3dc..a12eb12 100644
--- a/contrib/llvm/lib/Target/X86/X86RegisterInfo.h
+++ b/contrib/llvm/lib/Target/X86/X86RegisterInfo.h
@@ -15,7 +15,9 @@
#define X86REGISTERINFO_H
#include "llvm/Target/TargetRegisterInfo.h"
-#include "X86GenRegisterInfo.h.inc"
+
+#define GET_REGINFO_HEADER
+#include "X86GenRegisterInfo.inc"
namespace llvm {
class Type;
@@ -56,10 +58,6 @@ private:
///
unsigned SlotSize;
- /// StackAlign - Default stack alignment.
- ///
- unsigned StackAlign;
-
/// StackPtr - X86 physical register used as stack ptr.
///
unsigned StackPtr;
@@ -75,8 +73,6 @@ public:
/// register identifier.
static unsigned getX86RegNum(unsigned RegNo);
- unsigned getStackAlignment() const { return StackAlign; }
-
/// getDwarfRegNum - allows modification of X86GenRegisterInfo::getDwarfRegNum
/// (created by TableGen) for target dependencies.
int getDwarfRegNum(unsigned RegNum, bool isEH) const;
@@ -85,6 +81,10 @@ public:
// FIXME: This should be tablegen'd like getDwarfRegNum is
int getSEHRegNum(unsigned i) const;
+ /// getCompactUnwindRegNum - This function maps the register to the number for
+ /// compact unwind encoding. Return -1 if the register isn't valid.
+ int getCompactUnwindRegNum(unsigned RegNum, bool isEH) const;
+
/// Code Generation virtual methods...
///
diff --git a/contrib/llvm/lib/Target/X86/X86RegisterInfo.td b/contrib/llvm/lib/Target/X86/X86RegisterInfo.td
index f1d149c..203722a 100644
--- a/contrib/llvm/lib/Target/X86/X86RegisterInfo.td
+++ b/contrib/llvm/lib/Target/X86/X86RegisterInfo.td
@@ -206,15 +206,22 @@ let Namespace = "X86" in {
def YMM15: RegisterWithSubRegs<"ymm15", [XMM15]>, DwarfRegAlias<XMM15>;
}
- // Floating point stack registers
- def ST0 : Register<"st(0)">, DwarfRegNum<[33, 12, 11]>;
- def ST1 : Register<"st(1)">, DwarfRegNum<[34, 13, 12]>;
- def ST2 : Register<"st(2)">, DwarfRegNum<[35, 14, 13]>;
- def ST3 : Register<"st(3)">, DwarfRegNum<[36, 15, 14]>;
- def ST4 : Register<"st(4)">, DwarfRegNum<[37, 16, 15]>;
- def ST5 : Register<"st(5)">, DwarfRegNum<[38, 17, 16]>;
- def ST6 : Register<"st(6)">, DwarfRegNum<[39, 18, 17]>;
- def ST7 : Register<"st(7)">, DwarfRegNum<[40, 19, 18]>;
+ class STRegister<string Name, list<Register> A> : Register<Name> {
+ let Aliases = A;
+ }
+
+ // Floating point stack registers. These don't map one-to-one to the FP
+ // pseudo registers, but we still mark them as aliasing FP registers. That
+ // way both kinds can be live without exceeding the stack depth. ST registers
+ // are only live around inline assembly.
+ def ST0 : STRegister<"st(0)", []>, DwarfRegNum<[33, 12, 11]>;
+ def ST1 : STRegister<"st(1)", [FP6]>, DwarfRegNum<[34, 13, 12]>;
+ def ST2 : STRegister<"st(2)", [FP5]>, DwarfRegNum<[35, 14, 13]>;
+ def ST3 : STRegister<"st(3)", [FP4]>, DwarfRegNum<[36, 15, 14]>;
+ def ST4 : STRegister<"st(4)", [FP3]>, DwarfRegNum<[37, 16, 15]>;
+ def ST5 : STRegister<"st(5)", [FP2]>, DwarfRegNum<[38, 17, 16]>;
+ def ST6 : STRegister<"st(6)", [FP1]>, DwarfRegNum<[39, 18, 17]>;
+ def ST7 : STRegister<"st(7)", [FP0]>, DwarfRegNum<[40, 19, 18]>;
// Status flags register
def EFLAGS : Register<"flags">;
@@ -279,58 +286,23 @@ let Namespace = "X86" in {
// require a REX prefix. For example, "addb %ah, %dil" and "movzbl %ah, %r8d"
// cannot be encoded.
def GR8 : RegisterClass<"X86", [i8], 8,
- [AL, CL, DL, AH, CH, DH, BL, BH, SIL, DIL, BPL, SPL,
- R8B, R9B, R10B, R11B, R14B, R15B, R12B, R13B]> {
- let MethodProtos = [{
- iterator allocation_order_begin(const MachineFunction &MF) const;
- iterator allocation_order_end(const MachineFunction &MF) const;
- }];
- let MethodBodies = [{
- static const unsigned X86_GR8_AO_64[] = {
- X86::AL, X86::CL, X86::DL, X86::SIL, X86::DIL,
- X86::R8B, X86::R9B, X86::R10B, X86::R11B,
- X86::BL, X86::R14B, X86::R15B, X86::R12B, X86::R13B, X86::BPL
- };
-
- GR8Class::iterator
- GR8Class::allocation_order_begin(const MachineFunction &MF) const {
- const TargetMachine &TM = MF.getTarget();
- const X86Subtarget &Subtarget = TM.getSubtarget<X86Subtarget>();
- if (Subtarget.is64Bit())
- return X86_GR8_AO_64;
- else
- return begin();
- }
-
- GR8Class::iterator
- GR8Class::allocation_order_end(const MachineFunction &MF) const {
- const TargetMachine &TM = MF.getTarget();
- const TargetFrameLowering *TFI = TM.getFrameLowering();
- const X86Subtarget &Subtarget = TM.getSubtarget<X86Subtarget>();
- const X86MachineFunctionInfo *MFI = MF.getInfo<X86MachineFunctionInfo>();
- // Does the function dedicate RBP / EBP to being a frame ptr?
- if (!Subtarget.is64Bit())
- // In 32-mode, none of the 8-bit registers aliases EBP or ESP.
- return begin() + 8;
- else if (TFI->hasFP(MF) || MFI->getReserveFP())
- // If so, don't allocate SPL or BPL.
- return array_endof(X86_GR8_AO_64) - 1;
- else
- // If not, just don't allocate SPL.
- return array_endof(X86_GR8_AO_64);
- }
+ (add AL, CL, DL, AH, CH, DH, BL, BH, SIL, DIL, BPL, SPL,
+ R8B, R9B, R10B, R11B, R14B, R15B, R12B, R13B)> {
+ let AltOrders = [(sub GR8, AH, BH, CH, DH)];
+ let AltOrderSelect = [{
+ return MF.getTarget().getSubtarget<X86Subtarget>().is64Bit();
}];
}
def GR16 : RegisterClass<"X86", [i16], 16,
- [AX, CX, DX, SI, DI, BX, BP, SP,
- R8W, R9W, R10W, R11W, R14W, R15W, R12W, R13W]> {
+ (add AX, CX, DX, SI, DI, BX, BP, SP,
+ R8W, R9W, R10W, R11W, R14W, R15W, R12W, R13W)> {
let SubRegClasses = [(GR8 sub_8bit, sub_8bit_hi)];
}
def GR32 : RegisterClass<"X86", [i32], 32,
- [EAX, ECX, EDX, ESI, EDI, EBX, EBP, ESP,
- R8D, R9D, R10D, R11D, R14D, R15D, R12D, R13D]> {
+ (add EAX, ECX, EDX, ESI, EDI, EBX, EBP, ESP,
+ R8D, R9D, R10D, R11D, R14D, R15D, R12D, R13D)> {
let SubRegClasses = [(GR8 sub_8bit, sub_8bit_hi), (GR16 sub_16bit)];
}
@@ -338,8 +310,8 @@ def GR32 : RegisterClass<"X86", [i32], 32,
// RIP isn't really a register and it can't be used anywhere except in an
// address, but it doesn't cause trouble.
def GR64 : RegisterClass<"X86", [i64], 64,
- [RAX, RCX, RDX, RSI, RDI, R8, R9, R10, R11,
- RBX, R14, R15, R12, R13, RBP, RSP, RIP]> {
+ (add RAX, RCX, RDX, RSI, RDI, R8, R9, R10, R11,
+ RBX, R14, R15, R12, R13, RBP, RSP, RIP)> {
let SubRegClasses = [(GR8 sub_8bit, sub_8bit_hi),
(GR16 sub_16bit),
(GR32 sub_32bit)];
@@ -348,16 +320,13 @@ def GR64 : RegisterClass<"X86", [i64], 64,
// Segment registers for use by MOV instructions (and others) that have a
// segment register as one operand. Always contain a 16-bit segment
// descriptor.
-def SEGMENT_REG : RegisterClass<"X86", [i16], 16, [CS, DS, SS, ES, FS, GS]>;
+def SEGMENT_REG : RegisterClass<"X86", [i16], 16, (add CS, DS, SS, ES, FS, GS)>;
// Debug registers.
-def DEBUG_REG : RegisterClass<"X86", [i32], 32,
- [DR0, DR1, DR2, DR3, DR4, DR5, DR6, DR7]>;
+def DEBUG_REG : RegisterClass<"X86", [i32], 32, (sequence "DR%u", 0, 7)>;
// Control registers.
-def CONTROL_REG : RegisterClass<"X86", [i64], 64,
- [CR0, CR1, CR2, CR3, CR4, CR5, CR6, CR7, CR8,
- CR9, CR10, CR11, CR12, CR13, CR14, CR15]>;
+def CONTROL_REG : RegisterClass<"X86", [i64], 64, (sequence "CR%u", 0, 15)>;
// GR8_ABCD_L, GR8_ABCD_H, GR16_ABCD, GR32_ABCD, GR64_ABCD - Subclasses of
// GR8, GR16, GR32, and GR64 which contain just the "a" "b", "c", and "d"
@@ -365,99 +334,69 @@ def CONTROL_REG : RegisterClass<"X86", [i64], 64,
// that support 8-bit subreg operations. On x86-64, GR16_ABCD, GR32_ABCD,
// and GR64_ABCD are classes for registers that support 8-bit h-register
// operations.
-def GR8_ABCD_L : RegisterClass<"X86", [i8], 8, [AL, CL, DL, BL]>;
-def GR8_ABCD_H : RegisterClass<"X86", [i8], 8, [AH, CH, DH, BH]>;
-def GR16_ABCD : RegisterClass<"X86", [i16], 16, [AX, CX, DX, BX]> {
+def GR8_ABCD_L : RegisterClass<"X86", [i8], 8, (add AL, CL, DL, BL)>;
+def GR8_ABCD_H : RegisterClass<"X86", [i8], 8, (add AH, CH, DH, BH)>;
+def GR16_ABCD : RegisterClass<"X86", [i16], 16, (add AX, CX, DX, BX)> {
let SubRegClasses = [(GR8_ABCD_L sub_8bit), (GR8_ABCD_H sub_8bit_hi)];
}
-def GR32_ABCD : RegisterClass<"X86", [i32], 32, [EAX, ECX, EDX, EBX]> {
+def GR32_ABCD : RegisterClass<"X86", [i32], 32, (add EAX, ECX, EDX, EBX)> {
let SubRegClasses = [(GR8_ABCD_L sub_8bit),
(GR8_ABCD_H sub_8bit_hi),
(GR16_ABCD sub_16bit)];
}
-def GR64_ABCD : RegisterClass<"X86", [i64], 64, [RAX, RCX, RDX, RBX]> {
+def GR64_ABCD : RegisterClass<"X86", [i64], 64, (add RAX, RCX, RDX, RBX)> {
let SubRegClasses = [(GR8_ABCD_L sub_8bit),
(GR8_ABCD_H sub_8bit_hi),
(GR16_ABCD sub_16bit),
(GR32_ABCD sub_32bit)];
}
-def GR32_TC : RegisterClass<"X86", [i32], 32, [EAX, ECX, EDX]> {
+def GR32_TC : RegisterClass<"X86", [i32], 32, (add EAX, ECX, EDX)> {
let SubRegClasses = [(GR8 sub_8bit, sub_8bit_hi), (GR16 sub_16bit)];
}
-def GR64_TC : RegisterClass<"X86", [i64], 64, [RAX, RCX, RDX, RSI, RDI,
- R8, R9, R11, RIP]> {
+def GR64_TC : RegisterClass<"X86", [i64], 64, (add RAX, RCX, RDX, RSI, RDI,
+ R8, R9, R11, RIP)> {
let SubRegClasses = [(GR8 sub_8bit, sub_8bit_hi),
(GR16 sub_16bit),
(GR32_TC sub_32bit)];
}
-def GR64_TCW64 : RegisterClass<"X86", [i64], 64, [RAX, RCX, RDX,
- R8, R9, R11]>;
+def GR64_TCW64 : RegisterClass<"X86", [i64], 64, (add RAX, RCX, RDX,
+ R8, R9, R11)>;
// GR8_NOREX - GR8 registers which do not require a REX prefix.
def GR8_NOREX : RegisterClass<"X86", [i8], 8,
- [AL, CL, DL, AH, CH, DH, BL, BH]> {
- let MethodProtos = [{
- iterator allocation_order_begin(const MachineFunction &MF) const;
- iterator allocation_order_end(const MachineFunction &MF) const;
- }];
- let MethodBodies = [{
- // In 64-bit mode, it's not safe to blindly allocate H registers.
- static const unsigned X86_GR8_NOREX_AO_64[] = {
- X86::AL, X86::CL, X86::DL, X86::BL
- };
-
- GR8_NOREXClass::iterator
- GR8_NOREXClass::allocation_order_begin(const MachineFunction &MF) const {
- const TargetMachine &TM = MF.getTarget();
- const X86Subtarget &Subtarget = TM.getSubtarget<X86Subtarget>();
- if (Subtarget.is64Bit())
- return X86_GR8_NOREX_AO_64;
- else
- return begin();
- }
-
- GR8_NOREXClass::iterator
- GR8_NOREXClass::allocation_order_end(const MachineFunction &MF) const {
- const TargetMachine &TM = MF.getTarget();
- const X86Subtarget &Subtarget = TM.getSubtarget<X86Subtarget>();
- if (Subtarget.is64Bit())
- return array_endof(X86_GR8_NOREX_AO_64);
- else
- return end();
- }
+ (add AL, CL, DL, AH, CH, DH, BL, BH)> {
+ let AltOrders = [(sub GR8_NOREX, AH, BH, CH, DH)];
+ let AltOrderSelect = [{
+ return MF.getTarget().getSubtarget<X86Subtarget>().is64Bit();
}];
}
// GR16_NOREX - GR16 registers which do not require a REX prefix.
def GR16_NOREX : RegisterClass<"X86", [i16], 16,
- [AX, CX, DX, SI, DI, BX, BP, SP]> {
+ (add AX, CX, DX, SI, DI, BX, BP, SP)> {
let SubRegClasses = [(GR8_NOREX sub_8bit, sub_8bit_hi)];
}
// GR32_NOREX - GR32 registers which do not require a REX prefix.
def GR32_NOREX : RegisterClass<"X86", [i32], 32,
- [EAX, ECX, EDX, ESI, EDI, EBX, EBP, ESP]> {
+ (add EAX, ECX, EDX, ESI, EDI, EBX, EBP, ESP)> {
let SubRegClasses = [(GR8_NOREX sub_8bit, sub_8bit_hi),
(GR16_NOREX sub_16bit)];
}
// GR64_NOREX - GR64 registers which do not require a REX prefix.
def GR64_NOREX : RegisterClass<"X86", [i64], 64,
- [RAX, RCX, RDX, RSI, RDI, RBX, RBP, RSP, RIP]> {
+ (add RAX, RCX, RDX, RSI, RDI, RBX, RBP, RSP, RIP)> {
let SubRegClasses = [(GR8_NOREX sub_8bit, sub_8bit_hi),
(GR16_NOREX sub_16bit),
(GR32_NOREX sub_32bit)];
}
// GR32_NOSP - GR32 registers except ESP.
-def GR32_NOSP : RegisterClass<"X86", [i32], 32,
- [EAX, ECX, EDX, ESI, EDI, EBX, EBP,
- R8D, R9D, R10D, R11D, R14D, R15D, R12D, R13D]> {
+def GR32_NOSP : RegisterClass<"X86", [i32], 32, (sub GR32, ESP)> {
let SubRegClasses = [(GR8 sub_8bit, sub_8bit_hi), (GR16 sub_16bit)];
}
// GR64_NOSP - GR64 registers except RSP (and RIP).
-def GR64_NOSP : RegisterClass<"X86", [i64], 64,
- [RAX, RCX, RDX, RSI, RDI, R8, R9, R10, R11,
- RBX, R14, R15, R12, R13, RBP]> {
+def GR64_NOSP : RegisterClass<"X86", [i64], 64, (sub GR64, RSP, RIP)> {
let SubRegClasses = [(GR8 sub_8bit, sub_8bit_hi),
(GR16 sub_16bit),
(GR32_NOSP sub_32bit)];
@@ -466,36 +405,30 @@ def GR64_NOSP : RegisterClass<"X86", [i64], 64,
// GR32_NOREX_NOSP - GR32 registers which do not require a REX prefix except
// ESP.
def GR32_NOREX_NOSP : RegisterClass<"X86", [i32], 32,
- [EAX, ECX, EDX, ESI, EDI, EBX, EBP]> {
+ (and GR32_NOREX, GR32_NOSP)> {
let SubRegClasses = [(GR8_NOREX sub_8bit, sub_8bit_hi),
(GR16_NOREX sub_16bit)];
}
// GR64_NOREX_NOSP - GR64_NOREX registers except RSP.
def GR64_NOREX_NOSP : RegisterClass<"X86", [i64], 64,
- [RAX, RCX, RDX, RSI, RDI, RBX, RBP]> {
+ (and GR64_NOREX, GR64_NOSP)> {
let SubRegClasses = [(GR8_NOREX sub_8bit, sub_8bit_hi),
(GR16_NOREX sub_16bit),
(GR32_NOREX_NOSP sub_32bit)];
}
// A class to support the 'A' assembler constraint: EAX then EDX.
-def GR32_AD : RegisterClass<"X86", [i32], 32, [EAX, EDX]> {
+def GR32_AD : RegisterClass<"X86", [i32], 32, (add EAX, EDX)> {
let SubRegClasses = [(GR8_ABCD_L sub_8bit),
(GR8_ABCD_H sub_8bit_hi),
(GR16_ABCD sub_16bit)];
}
// Scalar SSE2 floating point registers.
-def FR32 : RegisterClass<"X86", [f32], 32,
- [XMM0, XMM1, XMM2, XMM3, XMM4, XMM5, XMM6, XMM7,
- XMM8, XMM9, XMM10, XMM11,
- XMM12, XMM13, XMM14, XMM15]>;
+def FR32 : RegisterClass<"X86", [f32], 32, (sequence "XMM%u", 0, 15)>;
-def FR64 : RegisterClass<"X86", [f64], 64,
- [XMM0, XMM1, XMM2, XMM3, XMM4, XMM5, XMM6, XMM7,
- XMM8, XMM9, XMM10, XMM11,
- XMM12, XMM13, XMM14, XMM15]>;
+def FR64 : RegisterClass<"X86", [f64], 64, (add FR32)>;
// FIXME: This sets up the floating point register files as though they are f64
@@ -504,37 +437,31 @@ def FR64 : RegisterClass<"X86", [f64], 64,
// faster on common hardware. In reality, this should be controlled by a
// command line option or something.
-def RFP32 : RegisterClass<"X86",[f32], 32, [FP0, FP1, FP2, FP3, FP4, FP5, FP6]>;
-def RFP64 : RegisterClass<"X86",[f64], 32, [FP0, FP1, FP2, FP3, FP4, FP5, FP6]>;
-def RFP80 : RegisterClass<"X86",[f80], 32, [FP0, FP1, FP2, FP3, FP4, FP5, FP6]>;
+def RFP32 : RegisterClass<"X86",[f32], 32, (sequence "FP%u", 0, 6)>;
+def RFP64 : RegisterClass<"X86",[f64], 32, (add RFP32)>;
+def RFP80 : RegisterClass<"X86",[f80], 32, (add RFP32)>;
// Floating point stack registers (these are not allocatable by the
// register allocator - the floating point stackifier is responsible
// for transforming FPn allocations to STn registers)
-def RST : RegisterClass<"X86", [f80, f64, f32], 32,
- [ST0, ST1, ST2, ST3, ST4, ST5, ST6, ST7]> {
+def RST : RegisterClass<"X86", [f80, f64, f32], 32, (sequence "ST%u", 0, 7)> {
let isAllocatable = 0;
}
// Generic vector registers: VR64 and VR128.
-def VR64: RegisterClass<"X86", [x86mmx], 64,
- [MM0, MM1, MM2, MM3, MM4, MM5, MM6, MM7]>;
-def VR128 : RegisterClass<"X86", [v16i8, v8i16, v4i32, v2i64, v4f32, v2f64],128,
- [XMM0, XMM1, XMM2, XMM3, XMM4, XMM5, XMM6, XMM7,
- XMM8, XMM9, XMM10, XMM11,
- XMM12, XMM13, XMM14, XMM15]> {
+def VR64: RegisterClass<"X86", [x86mmx], 64, (sequence "MM%u", 0, 7)>;
+def VR128 : RegisterClass<"X86", [v16i8, v8i16, v4i32, v2i64, v4f32, v2f64],
+ 128, (add FR32)> {
let SubRegClasses = [(FR32 sub_ss), (FR64 sub_sd)];
}
def VR256 : RegisterClass<"X86", [v32i8, v8i32, v4i64, v8f32, v4f64], 256,
- [YMM0, YMM1, YMM2, YMM3, YMM4, YMM5, YMM6, YMM7,
- YMM8, YMM9, YMM10, YMM11,
- YMM12, YMM13, YMM14, YMM15]> {
+ (sequence "YMM%u", 0, 15)> {
let SubRegClasses = [(FR32 sub_ss), (FR64 sub_sd), (VR128 sub_xmm)];
}
// Status flags registers.
-def CCR : RegisterClass<"X86", [i32], 32, [EFLAGS]> {
+def CCR : RegisterClass<"X86", [i32], 32, (add EFLAGS)> {
let CopyCost = -1; // Don't allow copying of status registers.
let isAllocatable = 0;
}
diff --git a/contrib/llvm/lib/Target/X86/X86Subtarget.cpp b/contrib/llvm/lib/Target/X86/X86Subtarget.cpp
index 481e821..5e6c659 100644
--- a/contrib/llvm/lib/Target/X86/X86Subtarget.cpp
+++ b/contrib/llvm/lib/Target/X86/X86Subtarget.cpp
@@ -7,21 +7,24 @@
//
//===----------------------------------------------------------------------===//
//
-// This file implements the X86 specific subclass of TargetSubtarget.
+// This file implements the X86 specific subclass of TargetSubtargetInfo.
//
//===----------------------------------------------------------------------===//
#define DEBUG_TYPE "subtarget"
#include "X86Subtarget.h"
#include "X86InstrInfo.h"
-#include "X86GenSubtarget.inc"
#include "llvm/GlobalValue.h"
#include "llvm/Support/Debug.h"
#include "llvm/Support/raw_ostream.h"
#include "llvm/Support/Host.h"
#include "llvm/Target/TargetMachine.h"
-#include "llvm/Target/TargetOptions.h"
#include "llvm/ADT/SmallVector.h"
+
+#define GET_SUBTARGETINFO_TARGET_DESC
+#define GET_SUBTARGETINFO_CTOR
+#include "X86GenSubtargetInfo.inc"
+
using namespace llvm;
#if defined(_MSC_VER)
@@ -154,7 +157,7 @@ const char *X86Subtarget::getBZeroEntry() const {
/// IsLegalToCallImmediateAddr - Return true if the subtarget allows calls
/// to immediate address.
bool X86Subtarget::IsLegalToCallImmediateAddr(const TargetMachine &TM) const {
- if (Is64Bit)
+ if (In64BitMode)
return false;
return isTargetELF() || TM.getRelocationModel() == Reloc::Static;
}
@@ -170,73 +173,6 @@ unsigned X86Subtarget::getSpecialAddressLatency() const {
return 200;
}
-/// GetCpuIDAndInfo - Execute the specified cpuid and return the 4 values in the
-/// specified arguments. If we can't run cpuid on the host, return true.
-static bool GetCpuIDAndInfo(unsigned value, unsigned *rEAX,
- unsigned *rEBX, unsigned *rECX, unsigned *rEDX) {
-#if defined(__x86_64__) || defined(_M_AMD64) || defined (_M_X64)
- #if defined(__GNUC__)
- // gcc doesn't know cpuid would clobber ebx/rbx. Preseve it manually.
- asm ("movq\t%%rbx, %%rsi\n\t"
- "cpuid\n\t"
- "xchgq\t%%rbx, %%rsi\n\t"
- : "=a" (*rEAX),
- "=S" (*rEBX),
- "=c" (*rECX),
- "=d" (*rEDX)
- : "a" (value));
- return false;
- #elif defined(_MSC_VER)
- int registers[4];
- __cpuid(registers, value);
- *rEAX = registers[0];
- *rEBX = registers[1];
- *rECX = registers[2];
- *rEDX = registers[3];
- return false;
- #endif
-#elif defined(i386) || defined(__i386__) || defined(__x86__) || defined(_M_IX86)
- #if defined(__GNUC__)
- asm ("movl\t%%ebx, %%esi\n\t"
- "cpuid\n\t"
- "xchgl\t%%ebx, %%esi\n\t"
- : "=a" (*rEAX),
- "=S" (*rEBX),
- "=c" (*rECX),
- "=d" (*rEDX)
- : "a" (value));
- return false;
- #elif defined(_MSC_VER)
- __asm {
- mov eax,value
- cpuid
- mov esi,rEAX
- mov dword ptr [esi],eax
- mov esi,rEBX
- mov dword ptr [esi],ebx
- mov esi,rECX
- mov dword ptr [esi],ecx
- mov esi,rEDX
- mov dword ptr [esi],edx
- }
- return false;
- #endif
-#endif
- return true;
-}
-
-static void DetectFamilyModel(unsigned EAX, unsigned &Family, unsigned &Model) {
- Family = (EAX >> 8) & 0xf; // Bits 8 - 11
- Model = (EAX >> 4) & 0xf; // Bits 4 - 7
- if (Family == 6 || Family == 0xf) {
- if (Family == 0xf)
- // Examine extended family ID if family ID is F.
- Family += (EAX >> 20) & 0xff; // Bits 20 - 27
- // Examine extended model ID if family ID is 6 or F.
- Model += ((EAX >> 16) & 0xf) << 4; // Bits 16 - 19
- }
-}
-
void X86Subtarget::AutoDetectSubtargetFeatures() {
unsigned EAX = 0, EBX = 0, ECX = 0, EDX = 0;
union {
@@ -244,50 +180,66 @@ void X86Subtarget::AutoDetectSubtargetFeatures() {
char c[12];
} text;
- if (GetCpuIDAndInfo(0, &EAX, text.u+0, text.u+2, text.u+1))
+ if (X86_MC::GetCpuIDAndInfo(0, &EAX, text.u+0, text.u+2, text.u+1))
return;
- GetCpuIDAndInfo(0x1, &EAX, &EBX, &ECX, &EDX);
+ X86_MC::GetCpuIDAndInfo(0x1, &EAX, &EBX, &ECX, &EDX);
- if ((EDX >> 15) & 1) HasCMov = true;
- if ((EDX >> 23) & 1) X86SSELevel = MMX;
- if ((EDX >> 25) & 1) X86SSELevel = SSE1;
- if ((EDX >> 26) & 1) X86SSELevel = SSE2;
- if (ECX & 0x1) X86SSELevel = SSE3;
- if ((ECX >> 9) & 1) X86SSELevel = SSSE3;
- if ((ECX >> 19) & 1) X86SSELevel = SSE41;
- if ((ECX >> 20) & 1) X86SSELevel = SSE42;
+ if ((EDX >> 15) & 1) HasCMov = true; ToggleFeature(X86::FeatureCMOV);
+ if ((EDX >> 23) & 1) X86SSELevel = MMX; ToggleFeature(X86::FeatureMMX);
+ if ((EDX >> 25) & 1) X86SSELevel = SSE1; ToggleFeature(X86::FeatureSSE1);
+ if ((EDX >> 26) & 1) X86SSELevel = SSE2; ToggleFeature(X86::FeatureSSE2);
+ if (ECX & 0x1) X86SSELevel = SSE3; ToggleFeature(X86::FeatureSSE3);
+ if ((ECX >> 9) & 1) X86SSELevel = SSSE3; ToggleFeature(X86::FeatureSSSE3);
+ if ((ECX >> 19) & 1) X86SSELevel = SSE41; ToggleFeature(X86::FeatureSSE41);
+ if ((ECX >> 20) & 1) X86SSELevel = SSE42; ToggleFeature(X86::FeatureSSE42);
// FIXME: AVX codegen support is not ready.
- //if ((ECX >> 28) & 1) { HasAVX = true; X86SSELevel = NoMMXSSE; }
+ //if ((ECX >> 28) & 1) { HasAVX = true; } ToggleFeature(X86::FeatureAVX);
bool IsIntel = memcmp(text.c, "GenuineIntel", 12) == 0;
bool IsAMD = !IsIntel && memcmp(text.c, "AuthenticAMD", 12) == 0;
- HasCLMUL = IsIntel && ((ECX >> 1) & 0x1);
- HasFMA3 = IsIntel && ((ECX >> 12) & 0x1);
- HasPOPCNT = IsIntel && ((ECX >> 23) & 0x1);
- HasAES = IsIntel && ((ECX >> 25) & 0x1);
+ HasCLMUL = IsIntel && ((ECX >> 1) & 0x1); ToggleFeature(X86::FeatureCLMUL);
+ HasFMA3 = IsIntel && ((ECX >> 12) & 0x1); ToggleFeature(X86::FeatureFMA3);
+ HasPOPCNT = IsIntel && ((ECX >> 23) & 0x1); ToggleFeature(X86::FeaturePOPCNT);
+ HasAES = IsIntel && ((ECX >> 25) & 0x1); ToggleFeature(X86::FeatureAES);
if (IsIntel || IsAMD) {
// Determine if bit test memory instructions are slow.
unsigned Family = 0;
unsigned Model = 0;
- DetectFamilyModel(EAX, Family, Model);
- IsBTMemSlow = IsAMD || (Family == 6 && Model >= 13);
+ X86_MC::DetectFamilyModel(EAX, Family, Model);
+ if (IsAMD || (Family == 6 && Model >= 13)) {
+ IsBTMemSlow = true;
+ ToggleFeature(X86::FeatureSlowBTMem);
+ }
// If it's Nehalem, unaligned memory access is fast.
- if (Family == 15 && Model == 26)
+ if (Family == 15 && Model == 26) {
IsUAMemFast = true;
+ ToggleFeature(X86::FeatureFastUAMem);
+ }
- GetCpuIDAndInfo(0x80000001, &EAX, &EBX, &ECX, &EDX);
- HasX86_64 = (EDX >> 29) & 0x1;
- HasSSE4A = IsAMD && ((ECX >> 6) & 0x1);
- HasFMA4 = IsAMD && ((ECX >> 16) & 0x1);
+ X86_MC::GetCpuIDAndInfo(0x80000001, &EAX, &EBX, &ECX, &EDX);
+ if ((EDX >> 29) & 0x1) {
+ HasX86_64 = true;
+ ToggleFeature(X86::Feature64Bit);
+ }
+ if (IsAMD && ((ECX >> 6) & 0x1)) {
+ HasSSE4A = true;
+ ToggleFeature(X86::FeatureSSE4A);
+ }
+ if (IsAMD && ((ECX >> 16) & 0x1)) {
+ HasFMA4 = true;
+ ToggleFeature(X86::FeatureFMA4);
+ }
}
}
-X86Subtarget::X86Subtarget(const std::string &TT, const std::string &FS,
- bool is64Bit)
- : PICStyle(PICStyles::None)
+X86Subtarget::X86Subtarget(const std::string &TT, const std::string &CPU,
+ const std::string &FS,
+ unsigned StackAlignOverride, bool is64Bit)
+ : X86GenSubtargetInfo(TT, CPU, FS)
+ , PICStyle(PICStyles::None)
, X86SSELevel(NoMMXSSE)
, X863DNowLevel(NoThreeDNow)
, HasCMov(false)
@@ -306,73 +258,66 @@ X86Subtarget::X86Subtarget(const std::string &TT, const std::string &FS,
// FIXME: this is a known good value for Yonah. How about others?
, MaxInlineSizeThreshold(128)
, TargetTriple(TT)
- , Is64Bit(is64Bit) {
-
- // default to hard float ABI
- if (FloatABIType == FloatABI::Default)
- FloatABIType = FloatABI::Hard;
-
+ , In64BitMode(is64Bit) {
// Determine default and user specified characteristics
- if (!FS.empty()) {
+ if (!FS.empty() || !CPU.empty()) {
+ std::string CPUName = CPU;
+ if (CPUName.empty()) {
+#if defined (__x86_64__) || defined(__i386__)
+ CPUName = sys::getHostCPUName();
+#else
+ CPUName = "generic";
+#endif
+ }
+
+ // Make sure 64-bit features are available in 64-bit mode. (But make sure
+ // SSE2 can be turned off explicitly.)
+ std::string FullFS = FS;
+ if (In64BitMode) {
+ if (!FullFS.empty())
+ FullFS = "+64bit,+sse2," + FullFS;
+ else
+ FullFS = "+64bit,+sse2";
+ }
+
// If feature string is not empty, parse features string.
- std::string CPU = sys::getHostCPUName();
- ParseSubtargetFeatures(FS, CPU);
- // All X86-64 CPUs also have SSE2, however user might request no SSE via
- // -mattr, so don't force SSELevel here.
- if (HasAVX)
- X86SSELevel = NoMMXSSE;
+ ParseSubtargetFeatures(CPUName, FullFS);
} else {
// Otherwise, use CPUID to auto-detect feature set.
AutoDetectSubtargetFeatures();
- // Make sure SSE2 is enabled; it is available on all X86-64 CPUs.
- if (Is64Bit && !HasAVX && X86SSELevel < SSE2)
- X86SSELevel = SSE2;
- }
- // If requesting codegen for X86-64, make sure that 64-bit features
- // are enabled.
- if (Is64Bit) {
- HasX86_64 = true;
+ // Make sure 64-bit features are available in 64-bit mode.
+ if (In64BitMode) {
+ HasX86_64 = true; ToggleFeature(X86::Feature64Bit);
+ HasCMov = true; ToggleFeature(X86::FeatureCMOV);
- // All 64-bit cpus have cmov support.
- HasCMov = true;
+ if (!HasAVX && X86SSELevel < SSE2) {
+ X86SSELevel = SSE2;
+ ToggleFeature(X86::FeatureSSE1);
+ ToggleFeature(X86::FeatureSSE2);
+ }
+ }
}
+
+ // It's important to keep the MCSubtargetInfo feature bits in sync with
+ // target data structure which is shared with MC code emitter, etc.
+ if (In64BitMode)
+ ToggleFeature(X86::Mode64Bit);
+
+ if (HasAVX)
+ X86SSELevel = NoMMXSSE;
DEBUG(dbgs() << "Subtarget features: SSELevel " << X86SSELevel
<< ", 3DNowLevel " << X863DNowLevel
<< ", 64bit " << HasX86_64 << "\n");
- assert((!Is64Bit || HasX86_64) &&
+ assert((!In64BitMode || HasX86_64) &&
"64-bit code requested on a subtarget that doesn't support it!");
// Stack alignment is 16 bytes on Darwin, FreeBSD, Linux and Solaris (both
// 32 and 64 bit) and for all 64-bit targets.
- if (isTargetDarwin() || isTargetFreeBSD() || isTargetLinux() ||
- isTargetSolaris() || Is64Bit)
+ if (StackAlignOverride)
+ stackAlignment = StackAlignOverride;
+ else if (isTargetDarwin() || isTargetFreeBSD() || isTargetLinux() ||
+ isTargetSolaris() || In64BitMode)
stackAlignment = 16;
-
- if (StackAlignment)
- stackAlignment = StackAlignment;
-}
-
-/// IsCalleePop - Determines whether the callee is required to pop its
-/// own arguments. Callee pop is necessary to support tail calls.
-bool X86Subtarget::IsCalleePop(bool IsVarArg,
- CallingConv::ID CallingConv) const {
- if (IsVarArg)
- return false;
-
- switch (CallingConv) {
- default:
- return false;
- case CallingConv::X86_StdCall:
- return !is64Bit();
- case CallingConv::X86_FastCall:
- return !is64Bit();
- case CallingConv::X86_ThisCall:
- return !is64Bit();
- case CallingConv::Fast:
- return GuaranteedTailCallOpt;
- case CallingConv::GHC:
- return GuaranteedTailCallOpt;
- }
}
diff --git a/contrib/llvm/lib/Target/X86/X86Subtarget.h b/contrib/llvm/lib/Target/X86/X86Subtarget.h
index 286a798..6d22027 100644
--- a/contrib/llvm/lib/Target/X86/X86Subtarget.h
+++ b/contrib/llvm/lib/Target/X86/X86Subtarget.h
@@ -7,7 +7,7 @@
//
//===----------------------------------------------------------------------===//
//
-// This file declares the X86 specific subclass of TargetSubtarget.
+// This file declares the X86 specific subclass of TargetSubtargetInfo.
//
//===----------------------------------------------------------------------===//
@@ -15,12 +15,16 @@
#define X86SUBTARGET_H
#include "llvm/ADT/Triple.h"
-#include "llvm/Target/TargetSubtarget.h"
+#include "llvm/Target/TargetSubtargetInfo.h"
#include "llvm/CallingConv.h"
#include <string>
+#define GET_SUBTARGETINFO_HEADER
+#include "X86GenSubtargetInfo.inc"
+
namespace llvm {
class GlobalValue;
+class StringRef;
class TargetMachine;
/// PICStyles - The X86 backend supports a number of different styles of PIC.
@@ -35,7 +39,7 @@ enum Style {
};
}
-class X86Subtarget : public TargetSubtarget {
+class X86Subtarget : public X86GenSubtargetInfo {
protected:
enum X86SSEEnum {
NoMMXSSE, MMX, SSE1, SSE2, SSE3, SSSE3, SSE41, SSE42
@@ -108,16 +112,17 @@ protected:
Triple TargetTriple;
private:
- /// Is64Bit - True if the processor supports 64-bit instructions and
- /// pointer size is 64 bit.
- bool Is64Bit;
+ /// In64BitMode - True if compiling for 64-bit, false for 32-bit.
+ bool In64BitMode;
public:
/// This constructor initializes the data members to match that
/// of the specified triple.
///
- X86Subtarget(const std::string &TT, const std::string &FS, bool is64Bit);
+ X86Subtarget(const std::string &TT, const std::string &CPU,
+ const std::string &FS,
+ unsigned StackAlignOverride, bool is64Bit);
/// getStackAlignment - Returns the minimum alignment known to hold of the
/// stack frame on entry to the function and which must be maintained by every
@@ -130,14 +135,13 @@ public:
/// ParseSubtargetFeatures - Parses features string setting specified
/// subtarget options. Definition of function is auto generated by tblgen.
- std::string ParseSubtargetFeatures(const std::string &FS,
- const std::string &CPU);
+ void ParseSubtargetFeatures(StringRef CPU, StringRef FS);
/// AutoDetectSubtargetFeatures - Auto-detect CPU features using CPUID
/// instruction.
void AutoDetectSubtargetFeatures();
- bool is64Bit() const { return Is64Bit; }
+ bool is64Bit() const { return In64BitMode; }
PICStyles::Style getPICStyle() const { return PICStyle; }
void setPICStyle(PICStyles::Style Style) { PICStyle = Style; }
@@ -195,7 +199,7 @@ public:
}
bool isTargetWin64() const {
- return Is64Bit && (isTargetMingw() || isTargetWindows());
+ return In64BitMode && (isTargetMingw() || isTargetWindows());
}
bool isTargetEnvMacho() const {
@@ -203,7 +207,7 @@ public:
}
bool isTargetWin32() const {
- return !Is64Bit && (isTargetMingw() || isTargetWindows());
+ return !In64BitMode && (isTargetMingw() || isTargetWindows());
}
bool isPICStyleSet() const { return PICStyle != PICStyles::None; }
@@ -248,9 +252,6 @@ public:
/// indicating the number of scheduling cycles of backscheduling that
/// should be attempted.
unsigned getSpecialAddressLatency() const;
-
- /// IsCalleePop - Test whether a function should pop its own arguments.
- bool IsCalleePop(bool isVarArg, CallingConv::ID CallConv) const;
};
} // End llvm namespace
diff --git a/contrib/llvm/lib/Target/X86/X86TargetMachine.cpp b/contrib/llvm/lib/Target/X86/X86TargetMachine.cpp
index 7483329..9cab0e0 100644
--- a/contrib/llvm/lib/Target/X86/X86TargetMachine.cpp
+++ b/contrib/llvm/lib/Target/X86/X86TargetMachine.cpp
@@ -11,7 +11,6 @@
//
//===----------------------------------------------------------------------===//
-#include "X86MCAsmInfo.h"
#include "X86TargetMachine.h"
#include "X86.h"
#include "llvm/PassManager.h"
@@ -24,22 +23,6 @@
#include "llvm/Target/TargetRegistry.h"
using namespace llvm;
-static MCAsmInfo *createMCAsmInfo(const Target &T, StringRef TT) {
- Triple TheTriple(TT);
-
- if (TheTriple.isOSDarwin() || TheTriple.getEnvironment() == Triple::MachO) {
- if (TheTriple.getArch() == Triple::x86_64)
- return new X86_64MCAsmInfoDarwin(TheTriple);
- else
- return new X86MCAsmInfoDarwin(TheTriple);
- }
-
- if (TheTriple.isOSWindows())
- return new X86MCAsmInfoCOFF(TheTriple);
-
- return new X86ELFMCAsmInfo(TheTriple);
-}
-
static MCStreamer *createMCStreamer(const Target &T, const std::string &TT,
MCContext &Ctx, TargetAsmBackend &TAB,
raw_ostream &_OS,
@@ -62,15 +45,11 @@ extern "C" void LLVMInitializeX86Target() {
RegisterTargetMachine<X86_32TargetMachine> X(TheX86_32Target);
RegisterTargetMachine<X86_64TargetMachine> Y(TheX86_64Target);
- // Register the target asm info.
- RegisterAsmInfoFn A(TheX86_32Target, createMCAsmInfo);
- RegisterAsmInfoFn B(TheX86_64Target, createMCAsmInfo);
-
// Register the code emitter.
TargetRegistry::RegisterCodeEmitter(TheX86_32Target,
- createX86_32MCCodeEmitter);
+ createX86MCCodeEmitter);
TargetRegistry::RegisterCodeEmitter(TheX86_64Target,
- createX86_64MCCodeEmitter);
+ createX86MCCodeEmitter);
// Register the asm backend.
TargetRegistry::RegisterAsmBackend(TheX86_32Target,
@@ -87,8 +66,9 @@ extern "C" void LLVMInitializeX86Target() {
X86_32TargetMachine::X86_32TargetMachine(const Target &T, const std::string &TT,
+ const std::string &CPU,
const std::string &FS)
- : X86TargetMachine(T, TT, FS, false),
+ : X86TargetMachine(T, TT, CPU, FS, false),
DataLayout(getSubtargetImpl()->isTargetDarwin() ?
"e-p:32:32-f64:32:64-i64:32:64-f80:128:128-f128:128:128-n8:16:32" :
(getSubtargetImpl()->isTargetCygMing() ||
@@ -103,8 +83,9 @@ X86_32TargetMachine::X86_32TargetMachine(const Target &T, const std::string &TT,
X86_64TargetMachine::X86_64TargetMachine(const Target &T, const std::string &TT,
+ const std::string &CPU,
const std::string &FS)
- : X86TargetMachine(T, TT, FS, true),
+ : X86TargetMachine(T, TT, CPU, FS, true),
DataLayout("e-p:64:64-s:64-f64:64:64-i64:64:64-f80:128:128-f128:128:128-n8:16:32:64"),
InstrInfo(*this),
TSInfo(*this),
@@ -115,9 +96,10 @@ X86_64TargetMachine::X86_64TargetMachine(const Target &T, const std::string &TT,
/// X86TargetMachine ctor - Create an X86 target.
///
X86TargetMachine::X86TargetMachine(const Target &T, const std::string &TT,
+ const std::string &CPU,
const std::string &FS, bool is64Bit)
- : LLVMTargetMachine(T, TT),
- Subtarget(TT, FS, is64Bit),
+ : LLVMTargetMachine(T, TT, CPU, FS),
+ Subtarget(TT, CPU, FS, StackAlignmentOverride, is64Bit),
FrameLowering(*this, Subtarget),
ELFWriterInfo(is64Bit, true) {
DefRelocModel = getRelocationModel();
@@ -182,6 +164,10 @@ X86TargetMachine::X86TargetMachine(const Target &T, const std::string &TT,
// Finally, if we have "none" as our PIC style, force to static mode.
if (Subtarget.getPICStyle() == PICStyles::None)
setRelocationModel(Reloc::Static);
+
+ // default to hard float ABI
+ if (FloatABIType == FloatABI::Default)
+ FloatABIType = FloatABI::Hard;
}
//===----------------------------------------------------------------------===//
diff --git a/contrib/llvm/lib/Target/X86/X86TargetMachine.h b/contrib/llvm/lib/Target/X86/X86TargetMachine.h
index 5973922..885334a 100644
--- a/contrib/llvm/lib/Target/X86/X86TargetMachine.h
+++ b/contrib/llvm/lib/Target/X86/X86TargetMachine.h
@@ -43,7 +43,8 @@ private:
public:
X86TargetMachine(const Target &T, const std::string &TT,
- const std::string &FS, bool is64Bit);
+ const std::string &CPU, const std::string &FS,
+ bool is64Bit);
virtual const X86InstrInfo *getInstrInfo() const {
llvm_unreachable("getInstrInfo not implemented");
@@ -87,7 +88,7 @@ class X86_32TargetMachine : public X86TargetMachine {
X86JITInfo JITInfo;
public:
X86_32TargetMachine(const Target &T, const std::string &M,
- const std::string &FS);
+ const std::string &CPU, const std::string &FS);
virtual const TargetData *getTargetData() const { return &DataLayout; }
virtual const X86TargetLowering *getTargetLowering() const {
return &TLInfo;
@@ -113,7 +114,7 @@ class X86_64TargetMachine : public X86TargetMachine {
X86JITInfo JITInfo;
public:
X86_64TargetMachine(const Target &T, const std::string &TT,
- const std::string &FS);
+ const std::string &CPU, const std::string &FS);
virtual const TargetData *getTargetData() const { return &DataLayout; }
virtual const X86TargetLowering *getTargetLowering() const {
return &TLInfo;
diff --git a/contrib/llvm/lib/Target/XCore/MCTargetDesc/CMakeLists.txt b/contrib/llvm/lib/Target/XCore/MCTargetDesc/CMakeLists.txt
new file mode 100644
index 0000000..c3b3dc9
--- /dev/null
+++ b/contrib/llvm/lib/Target/XCore/MCTargetDesc/CMakeLists.txt
@@ -0,0 +1,7 @@
+add_llvm_library(LLVMXCoreDesc
+ XCoreMCTargetDesc.cpp
+ XCoreMCAsmInfo.cpp
+ )
+
+# Hack: we need to include 'main' target directory to grab private headers
+include_directories(${CMAKE_CURRENT_SOURCE_DIR}/.. ${CMAKE_CURRENT_BINARY_DIR}/..)
diff --git a/contrib/llvm/lib/Target/XCore/MCTargetDesc/Makefile b/contrib/llvm/lib/Target/XCore/MCTargetDesc/Makefile
new file mode 100644
index 0000000..de61543
--- /dev/null
+++ b/contrib/llvm/lib/Target/XCore/MCTargetDesc/Makefile
@@ -0,0 +1,16 @@
+##===- lib/Target/XCore/TargetDesc/Makefile ----------------*- Makefile -*-===##
+#
+# The LLVM Compiler Infrastructure
+#
+# This file is distributed under the University of Illinois Open Source
+# License. See LICENSE.TXT for details.
+#
+##===----------------------------------------------------------------------===##
+
+LEVEL = ../../../..
+LIBRARYNAME = LLVMXCoreDesc
+
+# Hack: we need to include 'main' target directory to grab private headers
+CPP.Flags += -I$(PROJ_OBJ_DIR)/.. -I$(PROJ_SRC_DIR)/..
+
+include $(LEVEL)/Makefile.common
diff --git a/contrib/llvm/lib/Target/XCore/XCoreMCAsmInfo.cpp b/contrib/llvm/lib/Target/XCore/MCTargetDesc/XCoreMCAsmInfo.cpp
index 42ab1b3..42ab1b3 100644
--- a/contrib/llvm/lib/Target/XCore/XCoreMCAsmInfo.cpp
+++ b/contrib/llvm/lib/Target/XCore/MCTargetDesc/XCoreMCAsmInfo.cpp
diff --git a/contrib/llvm/lib/Target/XCore/XCoreMCAsmInfo.h b/contrib/llvm/lib/Target/XCore/MCTargetDesc/XCoreMCAsmInfo.h
index 8403922..8403922 100644
--- a/contrib/llvm/lib/Target/XCore/XCoreMCAsmInfo.h
+++ b/contrib/llvm/lib/Target/XCore/MCTargetDesc/XCoreMCAsmInfo.h
diff --git a/contrib/llvm/lib/Target/XCore/MCTargetDesc/XCoreMCTargetDesc.cpp b/contrib/llvm/lib/Target/XCore/MCTargetDesc/XCoreMCTargetDesc.cpp
new file mode 100644
index 0000000..939d97c
--- /dev/null
+++ b/contrib/llvm/lib/Target/XCore/MCTargetDesc/XCoreMCTargetDesc.cpp
@@ -0,0 +1,56 @@
+//===-- XCoreMCTargetDesc.cpp - XCore Target Descriptions -------*- C++ -*-===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+//
+// This file provides XCore specific target descriptions.
+//
+//===----------------------------------------------------------------------===//
+
+#include "XCoreMCTargetDesc.h"
+#include "XCoreMCAsmInfo.h"
+#include "llvm/MC/MCInstrInfo.h"
+#include "llvm/MC/MCRegisterInfo.h"
+#include "llvm/MC/MCSubtargetInfo.h"
+#include "llvm/Target/TargetRegistry.h"
+
+#define GET_INSTRINFO_MC_DESC
+#include "XCoreGenInstrInfo.inc"
+
+#define GET_SUBTARGETINFO_MC_DESC
+#include "XCoreGenSubtargetInfo.inc"
+
+#define GET_REGINFO_MC_DESC
+#include "XCoreGenRegisterInfo.inc"
+
+using namespace llvm;
+
+static MCInstrInfo *createXCoreMCInstrInfo() {
+ MCInstrInfo *X = new MCInstrInfo();
+ InitXCoreMCInstrInfo(X);
+ return X;
+}
+
+extern "C" void LLVMInitializeXCoreMCInstrInfo() {
+ TargetRegistry::RegisterMCInstrInfo(TheXCoreTarget, createXCoreMCInstrInfo);
+}
+
+static MCSubtargetInfo *createXCoreMCSubtargetInfo(StringRef TT, StringRef CPU,
+ StringRef FS) {
+ MCSubtargetInfo *X = new MCSubtargetInfo();
+ InitXCoreMCSubtargetInfo(X, TT, CPU, FS);
+ return X;
+}
+
+extern "C" void LLVMInitializeXCoreMCSubtargetInfo() {
+ TargetRegistry::RegisterMCSubtargetInfo(TheXCoreTarget,
+ createXCoreMCSubtargetInfo);
+}
+
+extern "C" void LLVMInitializeXCoreMCAsmInfo() {
+ RegisterMCAsmInfo<XCoreMCAsmInfo> X(TheXCoreTarget);
+}
diff --git a/contrib/llvm/lib/Target/XCore/MCTargetDesc/XCoreMCTargetDesc.h b/contrib/llvm/lib/Target/XCore/MCTargetDesc/XCoreMCTargetDesc.h
new file mode 100644
index 0000000..3cfc3764
--- /dev/null
+++ b/contrib/llvm/lib/Target/XCore/MCTargetDesc/XCoreMCTargetDesc.h
@@ -0,0 +1,40 @@
+//===-- XCoreMCTargetDesc.h - XCore Target Descriptions ---------*- C++ -*-===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+//
+// This file provides XCore specific target descriptions.
+//
+//===----------------------------------------------------------------------===//
+
+#ifndef XCOREMCTARGETDESC_H
+#define XCOREMCTARGETDESC_H
+
+namespace llvm {
+class MCSubtargetInfo;
+class Target;
+class StringRef;
+
+extern Target TheXCoreTarget;
+
+} // End llvm namespace
+
+// Defines symbolic names for XCore registers. This defines a mapping from
+// register name to register number.
+//
+#define GET_REGINFO_ENUM
+#include "XCoreGenRegisterInfo.inc"
+
+// Defines symbolic names for the XCore instructions.
+//
+#define GET_INSTRINFO_ENUM
+#include "XCoreGenInstrInfo.inc"
+
+#define GET_SUBTARGETINFO_ENUM
+#include "XCoreGenSubtargetInfo.inc"
+
+#endif
diff --git a/contrib/llvm/lib/Target/XCore/XCore.h b/contrib/llvm/lib/Target/XCore/XCore.h
index 8937fbe..b8fb0ca 100644
--- a/contrib/llvm/lib/Target/XCore/XCore.h
+++ b/contrib/llvm/lib/Target/XCore/XCore.h
@@ -15,6 +15,7 @@
#ifndef TARGET_XCORE_H
#define TARGET_XCORE_H
+#include "MCTargetDesc/XCoreMCTargetDesc.h"
#include "llvm/Target/TargetMachine.h"
namespace llvm {
@@ -25,17 +26,6 @@ namespace llvm {
FunctionPass *createXCoreISelDag(XCoreTargetMachine &TM);
- extern Target TheXCoreTarget;
-
} // end namespace llvm;
-// Defines symbolic names for XCore registers. This defines a mapping from
-// register name to register number.
-//
-#include "XCoreGenRegisterNames.inc"
-
-// Defines symbolic names for the XCore instructions.
-//
-#include "XCoreGenInstrNames.inc"
-
#endif
diff --git a/contrib/llvm/lib/Target/XCore/XCoreAsmPrinter.cpp b/contrib/llvm/lib/Target/XCore/XCoreAsmPrinter.cpp
index 8f06dd3..1a43714 100644
--- a/contrib/llvm/lib/Target/XCore/XCoreAsmPrinter.cpp
+++ b/contrib/llvm/lib/Target/XCore/XCoreAsmPrinter.cpp
@@ -16,7 +16,6 @@
#include "XCore.h"
#include "XCoreInstrInfo.h"
#include "XCoreSubtarget.h"
-#include "XCoreMCAsmInfo.h"
#include "XCoreTargetMachine.h"
#include "llvm/Constants.h"
#include "llvm/DerivedTypes.h"
@@ -27,6 +26,7 @@
#include "llvm/CodeGen/MachineConstantPool.h"
#include "llvm/CodeGen/MachineInstr.h"
#include "llvm/CodeGen/MachineJumpTableInfo.h"
+#include "llvm/MC/MCAsmInfo.h"
#include "llvm/MC/MCStreamer.h"
#include "llvm/MC/MCSymbol.h"
#include "llvm/Target/Mangler.h"
@@ -114,7 +114,7 @@ void XCoreAsmPrinter::EmitGlobalVariable(const GlobalVariable *GV) {
MCSymbol *GVSym = Mang->getSymbol(GV);
- Constant *C = GV->getInitializer();
+ const Constant *C = GV->getInitializer();
unsigned Align = (unsigned)TD->getPreferredTypeAlignmentShift(C->getType());
// Mark the start of the global
diff --git a/contrib/llvm/lib/Target/XCore/XCoreISelLowering.cpp b/contrib/llvm/lib/Target/XCore/XCoreISelLowering.cpp
index 8cabbbf..6d040e0 100644
--- a/contrib/llvm/lib/Target/XCore/XCoreISelLowering.cpp
+++ b/contrib/llvm/lib/Target/XCore/XCoreISelLowering.cpp
@@ -1591,21 +1591,18 @@ XCoreTargetLowering::isLegalAddressingMode(const AddrMode &AM,
// XCore Inline Assembly Support
//===----------------------------------------------------------------------===//
-std::vector<unsigned> XCoreTargetLowering::
-getRegClassForInlineAsmConstraint(const std::string &Constraint,
- EVT VT) const
-{
- if (Constraint.size() != 1)
- return std::vector<unsigned>();
-
- switch (Constraint[0]) {
+std::pair<unsigned, const TargetRegisterClass*>
+XCoreTargetLowering::
+getRegForInlineAsmConstraint(const std::string &Constraint,
+ EVT VT) const {
+ if (Constraint.size() == 1) {
+ switch (Constraint[0]) {
default : break;
case 'r':
- return make_vector<unsigned>(XCore::R0, XCore::R1, XCore::R2,
- XCore::R3, XCore::R4, XCore::R5,
- XCore::R6, XCore::R7, XCore::R8,
- XCore::R9, XCore::R10, XCore::R11, 0);
- break;
+ return std::make_pair(0U, XCore::GRRegsRegisterClass);
+ }
}
- return std::vector<unsigned>();
+ // Use the default implementation in TargetLowering to convert the register
+ // constraint into a member of a register class.
+ return TargetLowering::getRegForInlineAsmConstraint(Constraint, VT);
}
diff --git a/contrib/llvm/lib/Target/XCore/XCoreISelLowering.h b/contrib/llvm/lib/Target/XCore/XCoreISelLowering.h
index a8d67d4..9c803be 100644
--- a/contrib/llvm/lib/Target/XCore/XCoreISelLowering.h
+++ b/contrib/llvm/lib/Target/XCore/XCoreISelLowering.h
@@ -148,9 +148,9 @@ namespace llvm {
SDValue LowerTRAMPOLINE(SDValue Op, SelectionDAG &DAG) const;
// Inline asm support
- std::vector<unsigned>
- getRegClassForInlineAsmConstraint(const std::string &Constraint,
- EVT VT) const;
+ std::pair<unsigned, const TargetRegisterClass*>
+ getRegForInlineAsmConstraint(const std::string &Constraint,
+ EVT VT) const;
// Expand specifics
SDValue TryExpandADDWithMul(SDNode *Op, SelectionDAG &DAG) const;
diff --git a/contrib/llvm/lib/Target/XCore/XCoreInstrInfo.cpp b/contrib/llvm/lib/Target/XCore/XCoreInstrInfo.cpp
index 9cb6a7d..f90481f 100644
--- a/contrib/llvm/lib/Target/XCore/XCoreInstrInfo.cpp
+++ b/contrib/llvm/lib/Target/XCore/XCoreInstrInfo.cpp
@@ -18,11 +18,14 @@
#include "llvm/CodeGen/MachineInstrBuilder.h"
#include "llvm/CodeGen/MachineFrameInfo.h"
#include "llvm/CodeGen/MachineLocation.h"
-#include "XCoreGenInstrInfo.inc"
+#include "llvm/Target/TargetRegistry.h"
#include "llvm/ADT/STLExtras.h"
#include "llvm/Support/Debug.h"
#include "llvm/Support/ErrorHandling.h"
+#define GET_INSTRINFO_CTOR
+#include "XCoreGenInstrInfo.inc"
+
namespace llvm {
namespace XCore {
@@ -38,7 +41,7 @@ namespace XCore {
using namespace llvm;
XCoreInstrInfo::XCoreInstrInfo()
- : TargetInstrInfoImpl(XCoreInsts, array_lengthof(XCoreInsts)),
+ : XCoreGenInstrInfo(XCore::ADJCALLSTACKDOWN, XCore::ADJCALLSTACKUP),
RI(*this) {
}
diff --git a/contrib/llvm/lib/Target/XCore/XCoreInstrInfo.h b/contrib/llvm/lib/Target/XCore/XCoreInstrInfo.h
index 977fe8d..840b1e1 100644
--- a/contrib/llvm/lib/Target/XCore/XCoreInstrInfo.h
+++ b/contrib/llvm/lib/Target/XCore/XCoreInstrInfo.h
@@ -17,9 +17,12 @@
#include "llvm/Target/TargetInstrInfo.h"
#include "XCoreRegisterInfo.h"
+#define GET_INSTRINFO_HEADER
+#include "XCoreGenInstrInfo.inc"
+
namespace llvm {
-class XCoreInstrInfo : public TargetInstrInfoImpl {
+class XCoreInstrInfo : public XCoreGenInstrInfo {
const XCoreRegisterInfo RI;
public:
XCoreInstrInfo();
diff --git a/contrib/llvm/lib/Target/XCore/XCoreRegisterInfo.cpp b/contrib/llvm/lib/Target/XCore/XCoreRegisterInfo.cpp
index 46c9e57..357a4a0 100644
--- a/contrib/llvm/lib/Target/XCore/XCoreRegisterInfo.cpp
+++ b/contrib/llvm/lib/Target/XCore/XCoreRegisterInfo.cpp
@@ -33,11 +33,13 @@
#include "llvm/Support/ErrorHandling.h"
#include "llvm/Support/raw_ostream.h"
+#define GET_REGINFO_TARGET_DESC
+#include "XCoreGenRegisterInfo.inc"
+
using namespace llvm;
XCoreRegisterInfo::XCoreRegisterInfo(const TargetInstrInfo &tii)
- : XCoreGenRegisterInfo(XCore::ADJCALLSTACKDOWN, XCore::ADJCALLSTACKUP),
- TII(tii) {
+ : XCoreGenRegisterInfo(), TII(tii) {
}
// helper functions
@@ -193,7 +195,16 @@ XCoreRegisterInfo::eliminateFrameIndex(MachineBasicBlock::iterator II,
#endif
Offset += StackSize;
-
+
+ unsigned FrameReg = getFrameRegister(MF);
+
+ // Special handling of DBG_VALUE instructions.
+ if (MI.isDebugValue()) {
+ MI.getOperand(i).ChangeToRegister(FrameReg, false /*isDef*/);
+ MI.getOperand(i+1).ChangeToImmediate(Offset);
+ return;
+ }
+
// fold constant into offset.
Offset += MI.getOperand(i + 1).getImm();
MI.getOperand(i + 1).ChangeToImmediate(0);
@@ -205,7 +216,7 @@ XCoreRegisterInfo::eliminateFrameIndex(MachineBasicBlock::iterator II,
Offset/=4;
bool FP = TFI->hasFP(MF);
-
+
unsigned Reg = MI.getOperand(0).getReg();
bool isKill = MI.getOpcode() == XCore::STWFI && MI.getOperand(0).isKill();
@@ -216,7 +227,6 @@ XCoreRegisterInfo::eliminateFrameIndex(MachineBasicBlock::iterator II,
if (FP) {
bool isUs = isImmUs(Offset);
- unsigned FramePtr = XCore::R10;
if (!isUs) {
if (!RS)
@@ -228,18 +238,18 @@ XCoreRegisterInfo::eliminateFrameIndex(MachineBasicBlock::iterator II,
switch (MI.getOpcode()) {
case XCore::LDWFI:
BuildMI(MBB, II, dl, TII.get(XCore::LDW_3r), Reg)
- .addReg(FramePtr)
+ .addReg(FrameReg)
.addReg(ScratchReg, RegState::Kill);
break;
case XCore::STWFI:
BuildMI(MBB, II, dl, TII.get(XCore::STW_3r))
.addReg(Reg, getKillRegState(isKill))
- .addReg(FramePtr)
+ .addReg(FrameReg)
.addReg(ScratchReg, RegState::Kill);
break;
case XCore::LDAWFI:
BuildMI(MBB, II, dl, TII.get(XCore::LDAWF_l3r), Reg)
- .addReg(FramePtr)
+ .addReg(FrameReg)
.addReg(ScratchReg, RegState::Kill);
break;
default:
@@ -249,18 +259,18 @@ XCoreRegisterInfo::eliminateFrameIndex(MachineBasicBlock::iterator II,
switch (MI.getOpcode()) {
case XCore::LDWFI:
BuildMI(MBB, II, dl, TII.get(XCore::LDW_2rus), Reg)
- .addReg(FramePtr)
+ .addReg(FrameReg)
.addImm(Offset);
break;
case XCore::STWFI:
BuildMI(MBB, II, dl, TII.get(XCore::STW_2rus))
.addReg(Reg, getKillRegState(isKill))
- .addReg(FramePtr)
+ .addReg(FrameReg)
.addImm(Offset);
break;
case XCore::LDAWFI:
BuildMI(MBB, II, dl, TII.get(XCore::LDAWF_l2rus), Reg)
- .addReg(FramePtr)
+ .addReg(FrameReg)
.addImm(Offset);
break;
default:
@@ -328,6 +338,3 @@ unsigned XCoreRegisterInfo::getFrameRegister(const MachineFunction &MF) const {
unsigned XCoreRegisterInfo::getRARegister() const {
return XCore::LR;
}
-
-#include "XCoreGenRegisterInfo.inc"
-
diff --git a/contrib/llvm/lib/Target/XCore/XCoreRegisterInfo.h b/contrib/llvm/lib/Target/XCore/XCoreRegisterInfo.h
index 7a9bc9f..801d9eb 100644
--- a/contrib/llvm/lib/Target/XCore/XCoreRegisterInfo.h
+++ b/contrib/llvm/lib/Target/XCore/XCoreRegisterInfo.h
@@ -15,7 +15,9 @@
#define XCOREREGISTERINFO_H
#include "llvm/Target/TargetRegisterInfo.h"
-#include "XCoreGenRegisterInfo.h.inc"
+
+#define GET_REGINFO_HEADER
+#include "XCoreGenRegisterInfo.inc"
namespace llvm {
diff --git a/contrib/llvm/lib/Target/XCore/XCoreRegisterInfo.td b/contrib/llvm/lib/Target/XCore/XCoreRegisterInfo.td
index 0951097..c354230 100644
--- a/contrib/llvm/lib/Target/XCore/XCoreRegisterInfo.td
+++ b/contrib/llvm/lib/Target/XCore/XCoreRegisterInfo.td
@@ -44,13 +44,13 @@ def LR : Ri<15, "lr">, DwarfRegNum<[15]>;
//
def GRRegs : RegisterClass<"XCore", [i32], 32,
// Return values and arguments
- [R0, R1, R2, R3,
+ (add R0, R1, R2, R3,
// Not preserved across procedure calls
R11,
// Callee save
- R4, R5, R6, R7, R8, R9, R10]>;
+ R4, R5, R6, R7, R8, R9, R10)>;
// Reserved
-def RRegs : RegisterClass<"XCore", [i32], 32, [CP, DP, SP, LR]> {
+def RRegs : RegisterClass<"XCore", [i32], 32, (add CP, DP, SP, LR)> {
let isAllocatable = 0;
}
diff --git a/contrib/llvm/lib/Target/XCore/XCoreSubtarget.cpp b/contrib/llvm/lib/Target/XCore/XCoreSubtarget.cpp
index 78a6fa5..ad069bf 100644
--- a/contrib/llvm/lib/Target/XCore/XCoreSubtarget.cpp
+++ b/contrib/llvm/lib/Target/XCore/XCoreSubtarget.cpp
@@ -7,14 +7,22 @@
//
//===----------------------------------------------------------------------===//
//
-// This file implements the XCore specific subclass of TargetSubtarget.
+// This file implements the XCore specific subclass of TargetSubtargetInfo.
//
//===----------------------------------------------------------------------===//
#include "XCoreSubtarget.h"
#include "XCore.h"
+#include "llvm/Target/TargetRegistry.h"
+
+#define GET_SUBTARGETINFO_TARGET_DESC
+#define GET_SUBTARGETINFO_CTOR
+#include "XCoreGenSubtargetInfo.inc"
+
using namespace llvm;
-XCoreSubtarget::XCoreSubtarget(const std::string &TT, const std::string &FS)
+XCoreSubtarget::XCoreSubtarget(const std::string &TT,
+ const std::string &CPU, const std::string &FS)
+ : XCoreGenSubtargetInfo(TT, CPU, FS)
{
}
diff --git a/contrib/llvm/lib/Target/XCore/XCoreSubtarget.h b/contrib/llvm/lib/Target/XCore/XCoreSubtarget.h
index f8be3ec..7b29fa2 100644
--- a/contrib/llvm/lib/Target/XCore/XCoreSubtarget.h
+++ b/contrib/llvm/lib/Target/XCore/XCoreSubtarget.h
@@ -7,32 +7,35 @@
//
//===----------------------------------------------------------------------===//
//
-// This file declares the XCore specific subclass of TargetSubtarget.
+// This file declares the XCore specific subclass of TargetSubtargetInfo.
//
//===----------------------------------------------------------------------===//
#ifndef XCORESUBTARGET_H
#define XCORESUBTARGET_H
-#include "llvm/Target/TargetSubtarget.h"
+#include "llvm/Target/TargetSubtargetInfo.h"
#include "llvm/Target/TargetMachine.h"
-
#include <string>
+#define GET_SUBTARGETINFO_HEADER
+#include "XCoreGenSubtargetInfo.inc"
+
namespace llvm {
+class StringRef;
-class XCoreSubtarget : public TargetSubtarget {
+class XCoreSubtarget : public XCoreGenSubtargetInfo {
public:
/// This constructor initializes the data members to match that
/// of the specified triple.
///
- XCoreSubtarget(const std::string &TT, const std::string &FS);
+ XCoreSubtarget(const std::string &TT, const std::string &CPU,
+ const std::string &FS);
/// ParseSubtargetFeatures - Parses features string setting specified
/// subtarget options. Definition of function is auto generated by tblgen.
- std::string ParseSubtargetFeatures(const std::string &FS,
- const std::string &CPU);
+ void ParseSubtargetFeatures(StringRef CPU, StringRef FS);
};
} // End llvm namespace
diff --git a/contrib/llvm/lib/Target/XCore/XCoreTargetMachine.cpp b/contrib/llvm/lib/Target/XCore/XCoreTargetMachine.cpp
index 30da2c8..342966a 100644
--- a/contrib/llvm/lib/Target/XCore/XCoreTargetMachine.cpp
+++ b/contrib/llvm/lib/Target/XCore/XCoreTargetMachine.cpp
@@ -10,7 +10,6 @@
//
//===----------------------------------------------------------------------===//
-#include "XCoreMCAsmInfo.h"
#include "XCoreTargetMachine.h"
#include "XCore.h"
#include "llvm/Module.h"
@@ -21,9 +20,10 @@ using namespace llvm;
/// XCoreTargetMachine ctor - Create an ILP32 architecture model
///
XCoreTargetMachine::XCoreTargetMachine(const Target &T, const std::string &TT,
+ const std::string &CPU,
const std::string &FS)
- : LLVMTargetMachine(T, TT),
- Subtarget(TT, FS),
+ : LLVMTargetMachine(T, TT, CPU, FS),
+ Subtarget(TT, CPU, FS),
DataLayout("e-p:32:32:32-a0:0:32-f32:32:32-f64:32:32-i1:8:32-i8:8:32-"
"i16:16:32-i32:32:32-i64:32:32-n32"),
InstrInfo(),
@@ -41,5 +41,4 @@ bool XCoreTargetMachine::addInstSelector(PassManagerBase &PM,
// Force static initialization.
extern "C" void LLVMInitializeXCoreTarget() {
RegisterTargetMachine<XCoreTargetMachine> X(TheXCoreTarget);
- RegisterAsmInfo<XCoreMCAsmInfo> Y(TheXCoreTarget);
}
diff --git a/contrib/llvm/lib/Target/XCore/XCoreTargetMachine.h b/contrib/llvm/lib/Target/XCore/XCoreTargetMachine.h
index 24daadc..6235ac3 100644
--- a/contrib/llvm/lib/Target/XCore/XCoreTargetMachine.h
+++ b/contrib/llvm/lib/Target/XCore/XCoreTargetMachine.h
@@ -33,7 +33,7 @@ class XCoreTargetMachine : public LLVMTargetMachine {
XCoreSelectionDAGInfo TSInfo;
public:
XCoreTargetMachine(const Target &T, const std::string &TT,
- const std::string &FS);
+ const std::string &CPU, const std::string &FS);
virtual const XCoreInstrInfo *getInstrInfo() const { return &InstrInfo; }
virtual const XCoreFrameLowering *getFrameLowering() const {
diff --git a/contrib/llvm/lib/Transforms/IPO/ArgumentPromotion.cpp b/contrib/llvm/lib/Transforms/IPO/ArgumentPromotion.cpp
index 54a7f67..fa007cf 100644
--- a/contrib/llvm/lib/Transforms/IPO/ArgumentPromotion.cpp
+++ b/contrib/llvm/lib/Transforms/IPO/ArgumentPromotion.cpp
@@ -493,7 +493,7 @@ CallGraphNode *ArgPromotion::DoPromotion(Function *F,
// Start by computing a new prototype for the function, which is the same as
// the old function, but has modified arguments.
const FunctionType *FTy = F->getFunctionType();
- std::vector<const Type*> Params;
+ std::vector<Type*> Params;
typedef std::set<IndicesVector> ScalarizeTable;
@@ -733,12 +733,12 @@ CallGraphNode *ArgPromotion::DoPromotion(Function *F,
Instruction *New;
if (InvokeInst *II = dyn_cast<InvokeInst>(Call)) {
New = InvokeInst::Create(NF, II->getNormalDest(), II->getUnwindDest(),
- Args.begin(), Args.end(), "", Call);
+ Args, "", Call);
cast<InvokeInst>(New)->setCallingConv(CS.getCallingConv());
cast<InvokeInst>(New)->setAttributes(AttrListPtr::get(AttributesVec.begin(),
AttributesVec.end()));
} else {
- New = CallInst::Create(NF, Args.begin(), Args.end(), "", Call);
+ New = CallInst::Create(NF, Args, "", Call);
cast<CallInst>(New)->setCallingConv(CS.getCallingConv());
cast<CallInst>(New)->setAttributes(AttrListPtr::get(AttributesVec.begin(),
AttributesVec.end()));
diff --git a/contrib/llvm/lib/Transforms/IPO/DeadArgumentElimination.cpp b/contrib/llvm/lib/Transforms/IPO/DeadArgumentElimination.cpp
index d4eaf0c..1517765 100644
--- a/contrib/llvm/lib/Transforms/IPO/DeadArgumentElimination.cpp
+++ b/contrib/llvm/lib/Transforms/IPO/DeadArgumentElimination.cpp
@@ -208,7 +208,7 @@ bool DAE::DeleteDeadVarargs(Function &Fn) {
// the old function, but doesn't have isVarArg set.
const FunctionType *FTy = Fn.getFunctionType();
- std::vector<const Type*> Params(FTy->param_begin(), FTy->param_end());
+ std::vector<Type*> Params(FTy->param_begin(), FTy->param_end());
FunctionType *NFTy = FunctionType::get(FTy->getReturnType(),
Params, false);
unsigned NumArgs = Params.size();
@@ -244,11 +244,11 @@ bool DAE::DeleteDeadVarargs(Function &Fn) {
Instruction *New;
if (InvokeInst *II = dyn_cast<InvokeInst>(Call)) {
New = InvokeInst::Create(NF, II->getNormalDest(), II->getUnwindDest(),
- Args.begin(), Args.end(), "", Call);
+ Args, "", Call);
cast<InvokeInst>(New)->setCallingConv(CS.getCallingConv());
cast<InvokeInst>(New)->setAttributes(PAL);
} else {
- New = CallInst::Create(NF, Args.begin(), Args.end(), "", Call);
+ New = CallInst::Create(NF, Args, "", Call);
cast<CallInst>(New)->setCallingConv(CS.getCallingConv());
cast<CallInst>(New)->setAttributes(PAL);
if (cast<CallInst>(Call)->isTailCall())
@@ -647,7 +647,7 @@ bool DAE::RemoveDeadStuffFromFunction(Function *F) {
// Start by computing a new prototype for the function, which is the same as
// the old function, but has fewer arguments and a different return type.
const FunctionType *FTy = F->getFunctionType();
- std::vector<const Type*> Params;
+ std::vector<Type*> Params;
// Set up to build a new list of parameter attributes.
SmallVector<AttributeWithIndex, 8> AttributesVec;
@@ -659,13 +659,13 @@ bool DAE::RemoveDeadStuffFromFunction(Function *F) {
// Find out the new return value.
- const Type *RetTy = FTy->getReturnType();
+ Type *RetTy = FTy->getReturnType();
const Type *NRetTy = NULL;
unsigned RetCount = NumRetVals(F);
// -1 means unused, other numbers are the new index
SmallVector<int, 5> NewRetIdxs(RetCount, -1);
- std::vector<const Type*> RetTypes;
+ std::vector<Type*> RetTypes;
if (RetTy->isVoidTy()) {
NRetTy = RetTy;
} else {
@@ -822,11 +822,11 @@ bool DAE::RemoveDeadStuffFromFunction(Function *F) {
Instruction *New;
if (InvokeInst *II = dyn_cast<InvokeInst>(Call)) {
New = InvokeInst::Create(NF, II->getNormalDest(), II->getUnwindDest(),
- Args.begin(), Args.end(), "", Call);
+ Args, "", Call);
cast<InvokeInst>(New)->setCallingConv(CS.getCallingConv());
cast<InvokeInst>(New)->setAttributes(NewCallPAL);
} else {
- New = CallInst::Create(NF, Args.begin(), Args.end(), "", Call);
+ New = CallInst::Create(NF, Args, "", Call);
cast<CallInst>(New)->setCallingConv(CS.getCallingConv());
cast<CallInst>(New)->setAttributes(NewCallPAL);
if (cast<CallInst>(Call)->isTailCall())
diff --git a/contrib/llvm/lib/Transforms/IPO/DeadTypeElimination.cpp b/contrib/llvm/lib/Transforms/IPO/DeadTypeElimination.cpp
deleted file mode 100644
index d3d4963..0000000
--- a/contrib/llvm/lib/Transforms/IPO/DeadTypeElimination.cpp
+++ /dev/null
@@ -1,112 +0,0 @@
-//===- DeadTypeElimination.cpp - Eliminate unused types for symbol table --===//
-//
-// The LLVM Compiler Infrastructure
-//
-// This file is distributed under the University of Illinois Open Source
-// License. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-//
-// This pass is used to cleanup the output of GCC. It eliminate names for types
-// that are unused in the entire translation unit, using the FindUsedTypes pass.
-//
-//===----------------------------------------------------------------------===//
-
-#define DEBUG_TYPE "deadtypeelim"
-#include "llvm/Transforms/IPO.h"
-#include "llvm/Analysis/FindUsedTypes.h"
-#include "llvm/Module.h"
-#include "llvm/TypeSymbolTable.h"
-#include "llvm/DerivedTypes.h"
-#include "llvm/ADT/Statistic.h"
-using namespace llvm;
-
-STATISTIC(NumKilled, "Number of unused typenames removed from symtab");
-
-namespace {
- struct DTE : public ModulePass {
- static char ID; // Pass identification, replacement for typeid
- DTE() : ModulePass(ID) {
- initializeDTEPass(*PassRegistry::getPassRegistry());
- }
-
- // doPassInitialization - For this pass, it removes global symbol table
- // entries for primitive types. These are never used for linking in GCC and
- // they make the output uglier to look at, so we nuke them.
- //
- // Also, initialize instance variables.
- //
- bool runOnModule(Module &M);
-
- // getAnalysisUsage - This function needs FindUsedTypes to do its job...
- //
- virtual void getAnalysisUsage(AnalysisUsage &AU) const {
- AU.addRequired<FindUsedTypes>();
- }
- };
-}
-
-char DTE::ID = 0;
-INITIALIZE_PASS_BEGIN(DTE, "deadtypeelim", "Dead Type Elimination",
- false, false)
-INITIALIZE_PASS_DEPENDENCY(FindUsedTypes)
-INITIALIZE_PASS_END(DTE, "deadtypeelim", "Dead Type Elimination", false, false)
-
-ModulePass *llvm::createDeadTypeEliminationPass() {
- return new DTE();
-}
-
-
-// ShouldNukeSymtabEntry - Return true if this module level symbol table entry
-// should be eliminated.
-//
-static inline bool ShouldNukeSymtabEntry(const Type *Ty){
- // Nuke all names for primitive types!
- if (Ty->isPrimitiveType() || Ty->isIntegerTy())
- return true;
-
- // Nuke all pointers to primitive types as well...
- if (const PointerType *PT = dyn_cast<PointerType>(Ty))
- if (PT->getElementType()->isPrimitiveType() ||
- PT->getElementType()->isIntegerTy())
- return true;
-
- return false;
-}
-
-// run - For this pass, it removes global symbol table entries for primitive
-// types. These are never used for linking in GCC and they make the output
-// uglier to look at, so we nuke them. Also eliminate types that are never used
-// in the entire program as indicated by FindUsedTypes.
-//
-bool DTE::runOnModule(Module &M) {
- bool Changed = false;
-
- TypeSymbolTable &ST = M.getTypeSymbolTable();
- const SetVector<const Type*> &T = getAnalysis<FindUsedTypes>().getTypes();
- std::set<const Type*> UsedTypes(T.begin(), T.end());
-
- // Check the symbol table for superfluous type entries...
- //
- // Grab the 'type' plane of the module symbol...
- TypeSymbolTable::iterator TI = ST.begin();
- TypeSymbolTable::iterator TE = ST.end();
- while ( TI != TE ) {
- // If this entry should be unconditionally removed, or if we detect that
- // the type is not used, remove it.
- const Type *RHS = TI->second;
- if (ShouldNukeSymtabEntry(RHS) || !UsedTypes.count(RHS)) {
- ST.remove(TI++);
- ++NumKilled;
- Changed = true;
- } else {
- ++TI;
- // We only need to leave one name for each type.
- UsedTypes.erase(RHS);
- }
- }
-
- return Changed;
-}
-
-// vim: sw=2
diff --git a/contrib/llvm/lib/Transforms/IPO/GlobalOpt.cpp b/contrib/llvm/lib/Transforms/IPO/GlobalOpt.cpp
index cdf7b76..4ac721d 100644
--- a/contrib/llvm/lib/Transforms/IPO/GlobalOpt.cpp
+++ b/contrib/llvm/lib/Transforms/IPO/GlobalOpt.cpp
@@ -1999,9 +1999,13 @@ static std::vector<Function*> ParseGlobalCtors(GlobalVariable *GV) {
static GlobalVariable *InstallGlobalCtors(GlobalVariable *GCL,
const std::vector<Function*> &Ctors) {
// If we made a change, reassemble the initializer list.
- std::vector<Constant*> CSVals;
- CSVals.push_back(ConstantInt::get(Type::getInt32Ty(GCL->getContext()),65535));
- CSVals.push_back(0);
+ Constant *CSVals[2];
+ CSVals[0] = ConstantInt::get(Type::getInt32Ty(GCL->getContext()), 65535);
+ CSVals[1] = 0;
+
+ const StructType *StructTy =
+ cast <StructType>(
+ cast<ArrayType>(GCL->getType()->getElementType())->getElementType());
// Create the new init list.
std::vector<Constant*> CAList;
@@ -2016,12 +2020,10 @@ static GlobalVariable *InstallGlobalCtors(GlobalVariable *GCL,
CSVals[0] = ConstantInt::get(Type::getInt32Ty(GCL->getContext()),
0x7fffffff);
}
- CAList.push_back(ConstantStruct::get(GCL->getContext(), CSVals, false));
+ CAList.push_back(ConstantStruct::get(StructTy, CSVals));
}
// Create the array initializer.
- const Type *StructTy =
- cast<ArrayType>(GCL->getType()->getElementType())->getElementType();
Constant *CA = ConstantArray::get(ArrayType::get(StructTy,
CAList.size()), CAList);
@@ -2218,42 +2220,40 @@ static Constant *EvaluateStoreInto(Constant *Init, Constant *Val,
Elts[Idx] = EvaluateStoreInto(Elts[Idx], Val, Addr, OpNo+1);
// Return the modified struct.
- return ConstantStruct::get(Init->getContext(), &Elts[0], Elts.size(),
- STy->isPacked());
- } else {
- ConstantInt *CI = cast<ConstantInt>(Addr->getOperand(OpNo));
- const SequentialType *InitTy = cast<SequentialType>(Init->getType());
-
- uint64_t NumElts;
- if (const ArrayType *ATy = dyn_cast<ArrayType>(InitTy))
- NumElts = ATy->getNumElements();
- else
- NumElts = cast<VectorType>(InitTy)->getNumElements();
-
+ return ConstantStruct::get(STy, Elts);
+ }
+
+ ConstantInt *CI = cast<ConstantInt>(Addr->getOperand(OpNo));
+ const SequentialType *InitTy = cast<SequentialType>(Init->getType());
- // Break up the array into elements.
- if (ConstantArray *CA = dyn_cast<ConstantArray>(Init)) {
- for (User::op_iterator i = CA->op_begin(), e = CA->op_end(); i != e; ++i)
- Elts.push_back(cast<Constant>(*i));
- } else if (ConstantVector *CV = dyn_cast<ConstantVector>(Init)) {
- for (User::op_iterator i = CV->op_begin(), e = CV->op_end(); i != e; ++i)
- Elts.push_back(cast<Constant>(*i));
- } else if (isa<ConstantAggregateZero>(Init)) {
- Elts.assign(NumElts, Constant::getNullValue(InitTy->getElementType()));
- } else {
- assert(isa<UndefValue>(Init) && "This code is out of sync with "
- " ConstantFoldLoadThroughGEPConstantExpr");
- Elts.assign(NumElts, UndefValue::get(InitTy->getElementType()));
- }
+ uint64_t NumElts;
+ if (const ArrayType *ATy = dyn_cast<ArrayType>(InitTy))
+ NumElts = ATy->getNumElements();
+ else
+ NumElts = cast<VectorType>(InitTy)->getNumElements();
+
+ // Break up the array into elements.
+ if (ConstantArray *CA = dyn_cast<ConstantArray>(Init)) {
+ for (User::op_iterator i = CA->op_begin(), e = CA->op_end(); i != e; ++i)
+ Elts.push_back(cast<Constant>(*i));
+ } else if (ConstantVector *CV = dyn_cast<ConstantVector>(Init)) {
+ for (User::op_iterator i = CV->op_begin(), e = CV->op_end(); i != e; ++i)
+ Elts.push_back(cast<Constant>(*i));
+ } else if (isa<ConstantAggregateZero>(Init)) {
+ Elts.assign(NumElts, Constant::getNullValue(InitTy->getElementType()));
+ } else {
+ assert(isa<UndefValue>(Init) && "This code is out of sync with "
+ " ConstantFoldLoadThroughGEPConstantExpr");
+ Elts.assign(NumElts, UndefValue::get(InitTy->getElementType()));
+ }
- assert(CI->getZExtValue() < NumElts);
- Elts[CI->getZExtValue()] =
- EvaluateStoreInto(Elts[CI->getZExtValue()], Val, Addr, OpNo+1);
+ assert(CI->getZExtValue() < NumElts);
+ Elts[CI->getZExtValue()] =
+ EvaluateStoreInto(Elts[CI->getZExtValue()], Val, Addr, OpNo+1);
- if (Init->getType()->isArrayTy())
- return ConstantArray::get(cast<ArrayType>(InitTy), Elts);
- return ConstantVector::get(Elts);
- }
+ if (Init->getType()->isArrayTy())
+ return ConstantArray::get(cast<ArrayType>(InitTy), Elts);
+ return ConstantVector::get(Elts);
}
/// CommitValueTo - We have decided that Addr (which satisfies the predicate
diff --git a/contrib/llvm/lib/Transforms/IPO/IPO.cpp b/contrib/llvm/lib/Transforms/IPO/IPO.cpp
index 21dcb51..31ce95f 100644
--- a/contrib/llvm/lib/Transforms/IPO/IPO.cpp
+++ b/contrib/llvm/lib/Transforms/IPO/IPO.cpp
@@ -25,7 +25,6 @@ void llvm::initializeIPO(PassRegistry &Registry) {
initializeConstantMergePass(Registry);
initializeDAEPass(Registry);
initializeDAHPass(Registry);
- initializeDTEPass(Registry);
initializeFunctionAttrsPass(Registry);
initializeGlobalDCEPass(Registry);
initializeGlobalOptPass(Registry);
@@ -63,10 +62,6 @@ void LLVMAddDeadArgEliminationPass(LLVMPassManagerRef PM) {
unwrap(PM)->add(createDeadArgEliminationPass());
}
-void LLVMAddDeadTypeEliminationPass(LLVMPassManagerRef PM) {
- unwrap(PM)->add(createDeadTypeEliminationPass());
-}
-
void LLVMAddFunctionAttrsPass(LLVMPassManagerRef PM) {
unwrap(PM)->add(createFunctionAttrsPass());
}
diff --git a/contrib/llvm/lib/Transforms/IPO/LowerSetJmp.cpp b/contrib/llvm/lib/Transforms/IPO/LowerSetJmp.cpp
index 52ecf17..659476b 100644
--- a/contrib/llvm/lib/Transforms/IPO/LowerSetJmp.cpp
+++ b/contrib/llvm/lib/Transforms/IPO/LowerSetJmp.cpp
@@ -267,7 +267,7 @@ void LowerSetJmp::TransformLongJmpCall(CallInst* Inst)
CastInst* CI =
new BitCastInst(Inst->getArgOperand(0), SBPTy, "LJBuf", Inst);
Value *Args[] = { CI, Inst->getArgOperand(1) };
- CallInst::Create(ThrowLongJmp, Args, Args + 2, "", Inst);
+ CallInst::Create(ThrowLongJmp, Args, "", Inst);
SwitchValuePair& SVP = SwitchValMap[Inst->getParent()->getParent()];
@@ -386,7 +386,7 @@ void LowerSetJmp::TransformSetJmpCall(CallInst* Inst)
GetSetJmpMap(Func), BufPtr,
ConstantInt::get(Type::getInt32Ty(Inst->getContext()), SetJmpIDMap[Func]++)
};
- CallInst::Create(AddSJToMap, Args, Args + 3, "", Inst);
+ CallInst::Create(AddSJToMap, Args, "", Inst);
// We are guaranteed that there are no values live across basic blocks
// (because we are "not in SSA form" yet), but there can still be values live
@@ -482,7 +482,7 @@ void LowerSetJmp::visitCallInst(CallInst& CI)
std::vector<Value*> Params(CS.arg_begin(), CS.arg_end());
InvokeInst* II =
InvokeInst::Create(CI.getCalledValue(), NewBB, PrelimBBMap[Func],
- Params.begin(), Params.end(), CI.getName(), Term);
+ Params, CI.getName(), Term);
II->setCallingConv(CI.getCallingConv());
II->setAttributes(CI.getAttributes());
diff --git a/contrib/llvm/lib/Transforms/IPO/MergeFunctions.cpp b/contrib/llvm/lib/Transforms/IPO/MergeFunctions.cpp
index f741443..7796d05 100644
--- a/contrib/llvm/lib/Transforms/IPO/MergeFunctions.cpp
+++ b/contrib/llvm/lib/Transforms/IPO/MergeFunctions.cpp
@@ -218,7 +218,6 @@ bool FunctionComparator::isEquivalentType(const Type *Ty1,
llvm_unreachable("Unknown type!");
// Fall through in Release mode.
case Type::IntegerTyID:
- case Type::OpaqueTyID:
case Type::VectorTyID:
// Ty1 == Ty2 would have returned true earlier.
return false;
@@ -733,7 +732,7 @@ void MergeFunctions::writeThunk(Function *F, Function *G) {
++i;
}
- CallInst *CI = Builder.CreateCall(F, Args.begin(), Args.end());
+ CallInst *CI = Builder.CreateCall(F, Args);
CI->setTailCall();
CI->setCallingConv(F->getCallingConv());
if (NewG->getReturnType()->isVoidTy()) {
diff --git a/contrib/llvm/lib/Transforms/IPO/PruneEH.cpp b/contrib/llvm/lib/Transforms/IPO/PruneEH.cpp
index 2f3baeb..b7e63dc 100644
--- a/contrib/llvm/lib/Transforms/IPO/PruneEH.cpp
+++ b/contrib/llvm/lib/Transforms/IPO/PruneEH.cpp
@@ -175,8 +175,7 @@ bool PruneEH::SimplifyFunction(Function *F) {
if (II->doesNotThrow()) {
SmallVector<Value*, 8> Args(II->op_begin(), II->op_end() - 3);
// Insert a call instruction before the invoke.
- CallInst *Call = CallInst::Create(II->getCalledValue(),
- Args.begin(), Args.end(), "", II);
+ CallInst *Call = CallInst::Create(II->getCalledValue(), Args, "", II);
Call->takeName(II);
Call->setCallingConv(II->getCallingConv());
Call->setAttributes(II->getAttributes());
diff --git a/contrib/llvm/lib/Transforms/IPO/StripSymbols.cpp b/contrib/llvm/lib/Transforms/IPO/StripSymbols.cpp
index a690765..0fbaff1 100644
--- a/contrib/llvm/lib/Transforms/IPO/StripSymbols.cpp
+++ b/contrib/llvm/lib/Transforms/IPO/StripSymbols.cpp
@@ -28,8 +28,8 @@
#include "llvm/Pass.h"
#include "llvm/Analysis/DebugInfo.h"
#include "llvm/ValueSymbolTable.h"
-#include "llvm/TypeSymbolTable.h"
#include "llvm/Transforms/Utils/Local.h"
+#include "llvm/ADT/DenseMap.h"
#include "llvm/ADT/SmallPtrSet.h"
using namespace llvm;
@@ -143,8 +143,7 @@ static void RemoveDeadConstant(Constant *C) {
assert(C->use_empty() && "Constant is not dead!");
SmallPtrSet<Constant*, 4> Operands;
for (unsigned i = 0, e = C->getNumOperands(); i != e; ++i)
- if (isa<DerivedType>(C->getOperand(i)->getType()) &&
- OnlyUsedBy(C->getOperand(i), C))
+ if (OnlyUsedBy(C->getOperand(i), C))
Operands.insert(cast<Constant>(C->getOperand(i)));
if (GlobalVariable *GV = dyn_cast<GlobalVariable>(C)) {
if (!GV->hasLocalLinkage()) return; // Don't delete non static globals.
@@ -174,13 +173,19 @@ static void StripSymtab(ValueSymbolTable &ST, bool PreserveDbgInfo) {
}
}
-// Strip the symbol table of its names.
-static void StripTypeSymtab(TypeSymbolTable &ST, bool PreserveDbgInfo) {
- for (TypeSymbolTable::iterator TI = ST.begin(), E = ST.end(); TI != E; ) {
- if (PreserveDbgInfo && StringRef(TI->first).startswith("llvm.dbg"))
- ++TI;
- else
- ST.remove(TI++);
+// Strip any named types of their names.
+static void StripTypeNames(Module &M, bool PreserveDbgInfo) {
+ std::vector<StructType*> StructTypes;
+ M.findUsedStructTypes(StructTypes);
+
+ for (unsigned i = 0, e = StructTypes.size(); i != e; ++i) {
+ StructType *STy = StructTypes[i];
+ if (STy->isAnonymous() || STy->getName().empty()) continue;
+
+ if (PreserveDbgInfo && STy->getName().startswith("llvm.dbg"))
+ continue;
+
+ STy->setName("");
}
}
@@ -221,7 +226,7 @@ static bool StripSymbolNames(Module &M, bool PreserveDbgInfo) {
}
// Remove all names from types.
- StripTypeSymtab(M.getTypeSymbolTable(), PreserveDbgInfo);
+ StripTypeNames(M, PreserveDbgInfo);
return true;
}
diff --git a/contrib/llvm/lib/Transforms/InstCombine/InstCombineAndOrXor.cpp b/contrib/llvm/lib/Transforms/InstCombine/InstCombineAndOrXor.cpp
index a08446e..64ea36f 100644
--- a/contrib/llvm/lib/Transforms/InstCombine/InstCombineAndOrXor.cpp
+++ b/contrib/llvm/lib/Transforms/InstCombine/InstCombineAndOrXor.cpp
@@ -1400,7 +1400,7 @@ static bool CollectBSwapParts(Value *V, int OverallLeftShift, uint32_t ByteMask,
/// MatchBSwap - Given an OR instruction, check to see if this is a bswap idiom.
/// If so, insert the new bswap intrinsic and return it.
Instruction *InstCombiner::MatchBSwap(BinaryOperator &I) {
- const IntegerType *ITy = dyn_cast<IntegerType>(I.getType());
+ IntegerType *ITy = dyn_cast<IntegerType>(I.getType());
if (!ITy || ITy->getBitWidth() % 16 ||
// ByteMask only allows up to 32-byte values.
ITy->getBitWidth() > 32*8)
@@ -1424,9 +1424,8 @@ Instruction *InstCombiner::MatchBSwap(BinaryOperator &I) {
for (unsigned i = 1, e = ByteValues.size(); i != e; ++i)
if (ByteValues[i] != V)
return 0;
- const Type *Tys[] = { ITy };
Module *M = I.getParent()->getParent()->getParent();
- Function *F = Intrinsic::getDeclaration(M, Intrinsic::bswap, Tys, 1);
+ Function *F = Intrinsic::getDeclaration(M, Intrinsic::bswap, ITy);
return CallInst::Create(F, V);
}
diff --git a/contrib/llvm/lib/Transforms/InstCombine/InstCombineCalls.cpp b/contrib/llvm/lib/Transforms/InstCombine/InstCombineCalls.cpp
index ef67701..537f2b3 100644
--- a/contrib/llvm/lib/Transforms/InstCombine/InstCombineCalls.cpp
+++ b/contrib/llvm/lib/Transforms/InstCombine/InstCombineCalls.cpp
@@ -217,10 +217,10 @@ Instruction *InstCombiner::visitCallInst(CallInst &CI) {
if (GVSrc->isConstant()) {
Module *M = CI.getParent()->getParent()->getParent();
Intrinsic::ID MemCpyID = Intrinsic::memcpy;
- const Type *Tys[3] = { CI.getArgOperand(0)->getType(),
- CI.getArgOperand(1)->getType(),
- CI.getArgOperand(2)->getType() };
- CI.setCalledFunction(Intrinsic::getDeclaration(M, MemCpyID, Tys, 3));
+ Type *Tys[3] = { CI.getArgOperand(0)->getType(),
+ CI.getArgOperand(1)->getType(),
+ CI.getArgOperand(2)->getType() };
+ CI.setCalledFunction(Intrinsic::getDeclaration(M, MemCpyID, Tys));
Changed = true;
}
}
@@ -355,7 +355,9 @@ Instruction *InstCombiner::visitCallInst(CallInst &CI) {
case Intrinsic::cttz: {
// If all bits below the first known one are known zero,
// this value is constant.
- const IntegerType *IT = cast<IntegerType>(II->getArgOperand(0)->getType());
+ const IntegerType *IT = dyn_cast<IntegerType>(II->getArgOperand(0)->getType());
+ // FIXME: Try to simplify vectors of integers.
+ if (!IT) break;
uint32_t BitWidth = IT->getBitWidth();
APInt KnownZero(BitWidth, 0);
APInt KnownOne(BitWidth, 0);
@@ -372,7 +374,9 @@ Instruction *InstCombiner::visitCallInst(CallInst &CI) {
case Intrinsic::ctlz: {
// If all bits above the first known one are known zero,
// this value is constant.
- const IntegerType *IT = cast<IntegerType>(II->getArgOperand(0)->getType());
+ const IntegerType *IT = dyn_cast<IntegerType>(II->getArgOperand(0)->getType());
+ // FIXME: Try to simplify vectors of integers.
+ if (!IT) break;
uint32_t BitWidth = IT->getBitWidth();
APInt KnownZero(BitWidth, 0);
APInt KnownOne(BitWidth, 0);
@@ -412,7 +416,8 @@ Instruction *InstCombiner::visitCallInst(CallInst &CI) {
UndefValue::get(LHS->getType()),
ConstantInt::getTrue(II->getContext())
};
- Constant *Struct = ConstantStruct::get(II->getContext(), V, 2, false);
+ const StructType *ST = cast<StructType>(II->getType());
+ Constant *Struct = ConstantStruct::get(ST, V);
return InsertValueInst::Create(Struct, Add, 0);
}
@@ -425,7 +430,8 @@ Instruction *InstCombiner::visitCallInst(CallInst &CI) {
UndefValue::get(LHS->getType()),
ConstantInt::getFalse(II->getContext())
};
- Constant *Struct = ConstantStruct::get(II->getContext(), V, 2, false);
+ const StructType *ST = cast<StructType>(II->getType());
+ Constant *Struct = ConstantStruct::get(ST, V);
return InsertValueInst::Create(Struct, Add, 0);
}
}
@@ -452,7 +458,8 @@ Instruction *InstCombiner::visitCallInst(CallInst &CI) {
UndefValue::get(II->getArgOperand(0)->getType()),
ConstantInt::getFalse(II->getContext())
};
- Constant *Struct = ConstantStruct::get(II->getContext(), V, 2, false);
+ Constant *Struct =
+ ConstantStruct::get(cast<StructType>(II->getType()), V);
return InsertValueInst::Create(Struct, II->getArgOperand(0), 0);
}
}
@@ -472,7 +479,8 @@ Instruction *InstCombiner::visitCallInst(CallInst &CI) {
UndefValue::get(II->getArgOperand(0)->getType()),
ConstantInt::getFalse(II->getContext())
};
- Constant *Struct = ConstantStruct::get(II->getContext(), V, 2, false);
+ Constant *Struct =
+ ConstantStruct::get(cast<StructType>(II->getType()), V);
return InsertValueInst::Create(Struct, II->getArgOperand(0), 0);
}
}
@@ -503,7 +511,7 @@ Instruction *InstCombiner::visitCallInst(CallInst &CI) {
UndefValue::get(LHS->getType()),
Builder->getFalse()
};
- Constant *Struct = ConstantStruct::get(II->getContext(), V, 2, false);
+ Constant *Struct = ConstantStruct::get(cast<StructType>(II->getType()),V);
return InsertValueInst::Create(Struct, Mul, 0);
}
} // FALL THROUGH
@@ -532,7 +540,8 @@ Instruction *InstCombiner::visitCallInst(CallInst &CI) {
UndefValue::get(II->getArgOperand(0)->getType()),
ConstantInt::getFalse(II->getContext())
};
- Constant *Struct = ConstantStruct::get(II->getContext(), V, 2, false);
+ Constant *Struct =
+ ConstantStruct::get(cast<StructType>(II->getType()), V);
return InsertValueInst::Create(Struct, II->getArgOperand(0), 0);
}
}
@@ -1109,13 +1118,13 @@ bool InstCombiner::transformConstExprCastCall(CallSite CS) {
Instruction *NC;
if (InvokeInst *II = dyn_cast<InvokeInst>(Caller)) {
NC = Builder->CreateInvoke(Callee, II->getNormalDest(),
- II->getUnwindDest(), Args.begin(), Args.end());
+ II->getUnwindDest(), Args);
NC->takeName(II);
cast<InvokeInst>(NC)->setCallingConv(II->getCallingConv());
cast<InvokeInst>(NC)->setAttributes(NewCallerPAL);
} else {
CallInst *CI = cast<CallInst>(Caller);
- NC = Builder->CreateCall(Callee, Args.begin(), Args.end());
+ NC = Builder->CreateCall(Callee, Args);
NC->takeName(CI);
if (CI->isTailCall())
cast<CallInst>(NC)->setTailCall();
@@ -1178,7 +1187,7 @@ Instruction *InstCombiner::transformCallThroughTrampoline(CallSite CS) {
const AttrListPtr &NestAttrs = NestF->getAttributes();
if (!NestAttrs.isEmpty()) {
unsigned NestIdx = 1;
- const Type *NestTy = 0;
+ Type *NestTy = 0;
Attributes NestAttr = Attribute::None;
// Look for a parameter marked with the 'nest' attribute.
@@ -1240,7 +1249,7 @@ Instruction *InstCombiner::transformCallThroughTrampoline(CallSite CS) {
// Handle this by synthesizing a new function type, equal to FTy
// with the chain parameter inserted.
- std::vector<const Type*> NewTypes;
+ std::vector<Type*> NewTypes;
NewTypes.reserve(FTy->getNumParams()+1);
// Insert the chain's type into the list of parameter types, which may
@@ -1280,11 +1289,11 @@ Instruction *InstCombiner::transformCallThroughTrampoline(CallSite CS) {
if (InvokeInst *II = dyn_cast<InvokeInst>(Caller)) {
NewCaller = InvokeInst::Create(NewCallee,
II->getNormalDest(), II->getUnwindDest(),
- NewArgs.begin(), NewArgs.end());
+ NewArgs);
cast<InvokeInst>(NewCaller)->setCallingConv(II->getCallingConv());
cast<InvokeInst>(NewCaller)->setAttributes(NewPAL);
} else {
- NewCaller = CallInst::Create(NewCallee, NewArgs.begin(), NewArgs.end());
+ NewCaller = CallInst::Create(NewCallee, NewArgs);
if (cast<CallInst>(Caller)->isTailCall())
cast<CallInst>(NewCaller)->setTailCall();
cast<CallInst>(NewCaller)->
diff --git a/contrib/llvm/lib/Transforms/InstCombine/InstCombineCasts.cpp b/contrib/llvm/lib/Transforms/InstCombine/InstCombineCasts.cpp
index 199902a..82c734e 100644
--- a/contrib/llvm/lib/Transforms/InstCombine/InstCombineCasts.cpp
+++ b/contrib/llvm/lib/Transforms/InstCombine/InstCombineCasts.cpp
@@ -30,6 +30,14 @@ static Value *DecomposeSimpleLinearExpr(Value *Val, unsigned &Scale,
}
if (BinaryOperator *I = dyn_cast<BinaryOperator>(Val)) {
+ // Cannot look past anything that might overflow.
+ OverflowingBinaryOperator *OBI = dyn_cast<OverflowingBinaryOperator>(Val);
+ if (OBI && !OBI->hasNoUnsignedWrap()) {
+ Scale = 1;
+ Offset = 0;
+ return Val;
+ }
+
if (ConstantInt *RHS = dyn_cast<ConstantInt>(I->getOperand(1))) {
if (I->getOpcode() == Instruction::Shl) {
// This is a value scaled by '1 << the shift amt'.
@@ -1208,7 +1216,8 @@ Instruction *InstCombiner::visitFPTrunc(FPTruncInst &CI) {
CallInst *Call = dyn_cast<CallInst>(CI.getOperand(0));
if (Call && Call->getCalledFunction() &&
Call->getCalledFunction()->getName() == "sqrt" &&
- Call->getNumArgOperands() == 1) {
+ Call->getNumArgOperands() == 1 &&
+ Call->hasOneUse()) {
CastInst *Arg = dyn_cast<CastInst>(Call->getArgOperand(0));
if (Arg && Arg->getOpcode() == Instruction::FPExt &&
CI.getType()->isFloatTy() &&
diff --git a/contrib/llvm/lib/Transforms/InstCombine/InstCombineCompares.cpp b/contrib/llvm/lib/Transforms/InstCombine/InstCombineCompares.cpp
index c7ed098..c78760b 100644
--- a/contrib/llvm/lib/Transforms/InstCombine/InstCombineCompares.cpp
+++ b/contrib/llvm/lib/Transforms/InstCombine/InstCombineCompares.cpp
@@ -42,13 +42,12 @@ static ConstantInt *ExtractElement(Constant *V, Constant *Idx) {
static bool HasAddOverflow(ConstantInt *Result,
ConstantInt *In1, ConstantInt *In2,
bool IsSigned) {
- if (IsSigned)
- if (In2->getValue().isNegative())
- return Result->getValue().sgt(In1->getValue());
- else
- return Result->getValue().slt(In1->getValue());
- else
+ if (!IsSigned)
return Result->getValue().ult(In1->getValue());
+
+ if (In2->isNegative())
+ return Result->getValue().sgt(In1->getValue());
+ return Result->getValue().slt(In1->getValue());
}
/// AddWithOverflow - Compute Result = In1+In2, returning true if the result
@@ -77,13 +76,13 @@ static bool AddWithOverflow(Constant *&Result, Constant *In1,
static bool HasSubOverflow(ConstantInt *Result,
ConstantInt *In1, ConstantInt *In2,
bool IsSigned) {
- if (IsSigned)
- if (In2->getValue().isNegative())
- return Result->getValue().slt(In1->getValue());
- else
- return Result->getValue().sgt(In1->getValue());
- else
+ if (!IsSigned)
return Result->getValue().ugt(In1->getValue());
+
+ if (In2->isNegative())
+ return Result->getValue().slt(In1->getValue());
+
+ return Result->getValue().sgt(In1->getValue());
}
/// SubWithOverflow - Compute Result = In1-In2, returning true if the result
@@ -128,8 +127,7 @@ static bool isSignBitCheck(ICmpInst::Predicate pred, ConstantInt *RHS,
case ICmpInst::ICMP_UGT:
// True if LHS u> RHS and RHS == high-bit-mask - 1
TrueIfSigned = true;
- return RHS->getValue() ==
- APInt::getSignedMaxValue(RHS->getType()->getPrimitiveSizeInBits());
+ return RHS->isMaxValue(true);
case ICmpInst::ICMP_UGE:
// True if LHS u>= RHS and RHS == high-bit-mask (2^7, 2^15, 2^31, etc)
TrueIfSigned = true;
@@ -278,8 +276,7 @@ FoldCmpLoadFromIndexedGlobal(GetElementPtrInst *GEP, GlobalVariable *GV,
// If this is indexing an array of structures, get the structure element.
if (!LaterIndices.empty())
- Elt = ConstantExpr::getExtractValue(Elt, LaterIndices.data(),
- LaterIndices.size());
+ Elt = ConstantExpr::getExtractValue(Elt, LaterIndices);
// If the element is masked, handle it.
if (AndCst) Elt = ConstantExpr::getAnd(Elt, AndCst);
@@ -828,7 +825,7 @@ Instruction *InstCombiner::FoldICmpDivCst(ICmpInst &ICI, BinaryOperator *DivI,
LoOverflow = AddWithOverflow(LoBound, HiBound, DivNeg, true) ? -1 : 0;
}
}
- } else if (DivRHS->getValue().isNegative()) { // Divisor is < 0.
+ } else if (DivRHS->isNegative()) { // Divisor is < 0.
if (DivI->isExact())
RangeSize = cast<ConstantInt>(ConstantExpr::getNeg(RangeSize));
if (CmpRHSV == 0) { // (X / neg) op 0
@@ -1028,7 +1025,7 @@ Instruction *InstCombiner::visitICmpInstWithInstAndIntCst(ICmpInst &ICI,
// If the sign bit of the XorCST is not set, there is no change to
// the operation, just stop using the Xor.
- if (!XorCST->getValue().isNegative()) {
+ if (!XorCST->isNegative()) {
ICI.setOperand(0, CompareVal);
Worklist.Add(LHSI);
return &ICI;
@@ -1061,7 +1058,7 @@ Instruction *InstCombiner::visitICmpInstWithInstAndIntCst(ICmpInst &ICI,
}
// (icmp u/s (xor A ~SignBit), C) -> (icmp s/u (xor C ~SignBit), A)
- if (!ICI.isEquality() && XorCST->getValue().isMaxSignedValue()) {
+ if (!ICI.isEquality() && XorCST->isMaxValue(true)) {
const APInt &NotSignBit = XorCST->getValue();
ICmpInst::Predicate Pred = ICI.isSigned()
? ICI.getUnsignedPredicate()
@@ -1087,22 +1084,33 @@ Instruction *InstCombiner::visitICmpInstWithInstAndIntCst(ICmpInst &ICI,
// have its sign bit set or if it is an equality comparison.
// Extending a relational comparison when we're checking the sign
// bit would not work.
- if (Cast->hasOneUse() &&
- (ICI.isEquality() ||
- (AndCST->getValue().isNonNegative() && RHSV.isNonNegative()))) {
- uint32_t BitWidth =
- cast<IntegerType>(Cast->getOperand(0)->getType())->getBitWidth();
- APInt NewCST = AndCST->getValue().zext(BitWidth);
- APInt NewCI = RHSV.zext(BitWidth);
- Value *NewAnd =
+ if (ICI.isEquality() ||
+ (!AndCST->isNegative() && RHSV.isNonNegative())) {
+ Value *NewAnd =
Builder->CreateAnd(Cast->getOperand(0),
- ConstantInt::get(ICI.getContext(), NewCST),
- LHSI->getName());
+ ConstantExpr::getZExt(AndCST, Cast->getSrcTy()));
+ NewAnd->takeName(LHSI);
return new ICmpInst(ICI.getPredicate(), NewAnd,
- ConstantInt::get(ICI.getContext(), NewCI));
+ ConstantExpr::getZExt(RHS, Cast->getSrcTy()));
}
}
-
+
+ // If the LHS is an AND of a zext, and we have an equality compare, we can
+ // shrink the and/compare to the smaller type, eliminating the cast.
+ if (ZExtInst *Cast = dyn_cast<ZExtInst>(LHSI->getOperand(0))) {
+ const IntegerType *Ty = cast<IntegerType>(Cast->getSrcTy());
+ // Make sure we don't compare the upper bits, SimplifyDemandedBits
+ // should fold the icmp to true/false in that case.
+ if (ICI.isEquality() && RHSV.getActiveBits() <= Ty->getBitWidth()) {
+ Value *NewAnd =
+ Builder->CreateAnd(Cast->getOperand(0),
+ ConstantExpr::getTrunc(AndCST, Ty));
+ NewAnd->takeName(LHSI);
+ return new ICmpInst(ICI.getPredicate(), NewAnd,
+ ConstantExpr::getTrunc(RHS, Ty));
+ }
+ }
+
// If this is: (X >> C1) & C2 != C3 (where any shift and any compare
// could exist), turn it into (X & (C2 << C1)) != (C3 << C1). This
// happens a LOT in code produced by the C front-end, for bitfield
@@ -1396,18 +1404,27 @@ Instruction *InstCombiner::visitICmpInstWithInstAndIntCst(ICmpInst &ICI,
case Instruction::Xor:
// For the xor case, we can xor two constants together, eliminating
// the explicit xor.
- if (Constant *BOC = dyn_cast<Constant>(BO->getOperand(1)))
- return new ICmpInst(ICI.getPredicate(), BO->getOperand(0),
+ if (Constant *BOC = dyn_cast<Constant>(BO->getOperand(1))) {
+ return new ICmpInst(ICI.getPredicate(), BO->getOperand(0),
ConstantExpr::getXor(RHS, BOC));
-
- // FALLTHROUGH
+ } else if (RHSV == 0) {
+ // Replace ((xor A, B) != 0) with (A != B)
+ return new ICmpInst(ICI.getPredicate(), BO->getOperand(0),
+ BO->getOperand(1));
+ }
+ break;
case Instruction::Sub:
- // Replace (([sub|xor] A, B) != 0) with (A != B)
- if (RHSV == 0)
+ // Replace ((sub A, B) != C) with (B != A-C) if A & C are constants.
+ if (ConstantInt *BOp0C = dyn_cast<ConstantInt>(BO->getOperand(0))) {
+ if (BO->hasOneUse())
+ return new ICmpInst(ICI.getPredicate(), BO->getOperand(1),
+ ConstantExpr::getSub(BOp0C, RHS));
+ } else if (RHSV == 0) {
+ // Replace ((sub A, B) != 0) with (A != B)
return new ICmpInst(ICI.getPredicate(), BO->getOperand(0),
BO->getOperand(1));
+ }
break;
-
case Instruction::Or:
// If bits are being or'd in that are not present in the constant we
// are comparing against, then the comparison could never succeed!
@@ -1434,7 +1451,11 @@ Instruction *InstCombiner::visitICmpInstWithInstAndIntCst(ICmpInst &ICI,
return new ICmpInst(isICMP_NE ? ICmpInst::ICMP_EQ :
ICmpInst::ICMP_NE, LHSI,
Constant::getNullValue(RHS->getType()));
-
+
+ // Don't perform the following transforms if the AND has multiple uses
+ if (!BO->hasOneUse())
+ break;
+
// Replace (and X, (1 << size(X)-1) != 0) with x s< 0
if (BOC->getValue().isSignBit()) {
Value *X = BO->getOperand(0);
@@ -1659,9 +1680,9 @@ static Instruction *ProcessUGT_ADDCST_ADD(ICmpInst &I, Value *A, Value *B,
// result and the overflow bit.
Module *M = I.getParent()->getParent()->getParent();
- const Type *NewType = IntegerType::get(OrigAdd->getContext(), NewWidth);
+ Type *NewType = IntegerType::get(OrigAdd->getContext(), NewWidth);
Value *F = Intrinsic::getDeclaration(M, Intrinsic::sadd_with_overflow,
- &NewType, 1);
+ NewType);
InstCombiner::BuilderTy *Builder = IC.Builder;
@@ -1701,8 +1722,8 @@ static Instruction *ProcessUAddIdiom(Instruction &I, Value *OrigAddV,
Builder->SetInsertPoint(OrigAdd);
Module *M = I.getParent()->getParent()->getParent();
- const Type *Ty = LHS->getType();
- Value *F = Intrinsic::getDeclaration(M, Intrinsic::uadd_with_overflow, &Ty,1);
+ Type *Ty = LHS->getType();
+ Value *F = Intrinsic::getDeclaration(M, Intrinsic::uadd_with_overflow, Ty);
CallInst *Call = Builder->CreateCall2(F, LHS, RHS, "uadd");
Value *Add = Builder->CreateExtractValue(Call, 0);
@@ -2364,7 +2385,7 @@ Instruction *InstCombiner::visitICmpInst(ICmpInst &I) {
BO1->getOperand(0));
}
- if (CI->getValue().isMaxSignedValue()) {
+ if (CI->isMaxValue(true)) {
ICmpInst::Predicate Pred = I.isSigned()
? I.getUnsignedPredicate()
: I.getSignedPredicate();
diff --git a/contrib/llvm/lib/Transforms/InstCombine/InstCombineMulDivRem.cpp b/contrib/llvm/lib/Transforms/InstCombine/InstCombineMulDivRem.cpp
index 2d29403..630a6fe 100644
--- a/contrib/llvm/lib/Transforms/InstCombine/InstCombineMulDivRem.cpp
+++ b/contrib/llvm/lib/Transforms/InstCombine/InstCombineMulDivRem.cpp
@@ -691,14 +691,14 @@ Instruction *InstCombiner::visitSRem(BinaryOperator &I) {
bool hasNegative = false;
for (unsigned i = 0; !hasNegative && i != VWidth; ++i)
if (ConstantInt *RHS = dyn_cast<ConstantInt>(RHSV->getOperand(i)))
- if (RHS->getValue().isNegative())
+ if (RHS->isNegative())
hasNegative = true;
if (hasNegative) {
std::vector<Constant *> Elts(VWidth);
for (unsigned i = 0; i != VWidth; ++i) {
if (ConstantInt *RHS = dyn_cast<ConstantInt>(RHSV->getOperand(i))) {
- if (RHS->getValue().isNegative())
+ if (RHS->isNegative())
Elts[i] = cast<ConstantInt>(ConstantExpr::getNeg(RHS));
else
Elts[i] = RHS;
diff --git a/contrib/llvm/lib/Transforms/InstCombine/InstCombineSelect.cpp b/contrib/llvm/lib/Transforms/InstCombine/InstCombineSelect.cpp
index aeb3c3e..5733c20 100644
--- a/contrib/llvm/lib/Transforms/InstCombine/InstCombineSelect.cpp
+++ b/contrib/llvm/lib/Transforms/InstCombine/InstCombineSelect.cpp
@@ -796,7 +796,7 @@ Instruction *InstCombiner::visitSelectInst(SelectInst &SI) {
// So at this point we know we have (Y -> OtherAddOp):
// select C, (add X, Y), (sub X, Z)
Value *NegVal; // Compute -Z
- if (SI.getType()->isFloatingPointTy()) {
+ if (SI.getType()->isFPOrFPVectorTy()) {
NegVal = Builder->CreateFNeg(SubOp->getOperand(1));
} else {
NegVal = Builder->CreateNeg(SubOp->getOperand(1));
@@ -810,7 +810,7 @@ Instruction *InstCombiner::visitSelectInst(SelectInst &SI) {
Builder->CreateSelect(CondVal, NewTrueOp,
NewFalseOp, SI.getName() + ".p");
- if (SI.getType()->isFloatingPointTy())
+ if (SI.getType()->isFPOrFPVectorTy())
return BinaryOperator::CreateFAdd(SubOp->getOperand(0), NewSel);
else
return BinaryOperator::CreateAdd(SubOp->getOperand(0), NewSel);
diff --git a/contrib/llvm/lib/Transforms/InstCombine/InstructionCombining.cpp b/contrib/llvm/lib/Transforms/InstCombine/InstructionCombining.cpp
index 92c10f5..ab98ef9 100644
--- a/contrib/llvm/lib/Transforms/InstCombine/InstructionCombining.cpp
+++ b/contrib/llvm/lib/Transforms/InstCombine/InstructionCombining.cpp
@@ -785,6 +785,14 @@ Instruction *InstCombiner::visitGetElementPtrInst(GetElementPtrInst &GEP) {
// getelementptr instructions into a single instruction.
//
if (GEPOperator *Src = dyn_cast<GEPOperator>(PtrOp)) {
+
+ // If this GEP has only 0 indices, it is the same pointer as
+ // Src. If Src is not a trivial GEP too, don't combine
+ // the indices.
+ if (GEP.hasAllZeroIndices() && !Src->hasAllZeroIndices() &&
+ !Src->hasOneUse())
+ return 0;
+
// Note that if our source is a gep chain itself that we wait for that
// chain to be resolved before we perform this transformation. This
// avoids us creating a TON of code in some cases.
@@ -1191,7 +1199,7 @@ Instruction *InstCombiner::visitExtractValueInst(ExtractValueInst &EV) {
if (EV.getNumIndices() > 1)
// Extract the remaining indices out of the constant indexed by the
// first index
- return ExtractValueInst::Create(V, EV.idx_begin() + 1, EV.idx_end());
+ return ExtractValueInst::Create(V, EV.getIndices().slice(1));
else
return ReplaceInstUsesWith(EV, V);
}
@@ -1214,7 +1222,7 @@ Instruction *InstCombiner::visitExtractValueInst(ExtractValueInst &EV) {
// with
// %E = extractvalue { i32, { i32 } } %A, 0
return ExtractValueInst::Create(IV->getAggregateOperand(),
- EV.idx_begin(), EV.idx_end());
+ EV.getIndices());
}
if (exti == exte && insi == inse)
// Both iterators are at the end: Index lists are identical. Replace
@@ -1232,9 +1240,9 @@ Instruction *InstCombiner::visitExtractValueInst(ExtractValueInst &EV) {
// by switching the order of the insert and extract (though the
// insertvalue should be left in, since it may have other uses).
Value *NewEV = Builder->CreateExtractValue(IV->getAggregateOperand(),
- EV.idx_begin(), EV.idx_end());
+ EV.getIndices());
return InsertValueInst::Create(NewEV, IV->getInsertedValueOperand(),
- insi, inse);
+ ArrayRef<unsigned>(insi, inse));
}
if (insi == inse)
// The insert list is a prefix of the extract list
@@ -1246,7 +1254,7 @@ Instruction *InstCombiner::visitExtractValueInst(ExtractValueInst &EV) {
// with
// %E extractvalue { i32 } { i32 42 }, 0
return ExtractValueInst::Create(IV->getInsertedValueOperand(),
- exti, exte);
+ ArrayRef<unsigned>(exti, exte));
}
if (IntrinsicInst *II = dyn_cast<IntrinsicInst>(Agg)) {
// We're extracting from an intrinsic, see if we're the only user, which
diff --git a/contrib/llvm/lib/Transforms/Instrumentation/GCOVProfiling.cpp b/contrib/llvm/lib/Transforms/Instrumentation/GCOVProfiling.cpp
index b902213..3f2c412 100644
--- a/contrib/llvm/lib/Transforms/Instrumentation/GCOVProfiling.cpp
+++ b/contrib/llvm/lib/Transforms/Instrumentation/GCOVProfiling.cpp
@@ -561,25 +561,24 @@ GlobalVariable *GCOVProfiler::buildEdgeLookupTable(
Edge += Successors;
}
+ ArrayRef<Constant*> V(&EdgeTable[0], Succs.size() * Preds.size());
GlobalVariable *EdgeTableGV =
new GlobalVariable(
*M, EdgeTableTy, true, GlobalValue::InternalLinkage,
- ConstantArray::get(EdgeTableTy,
- &EdgeTable[0], Succs.size() * Preds.size()),
+ ConstantArray::get(EdgeTableTy, V),
"__llvm_gcda_edge_table");
EdgeTableGV->setUnnamedAddr(true);
return EdgeTableGV;
}
Constant *GCOVProfiler::getStartFileFunc() {
- const Type *Args[] = { Type::getInt8PtrTy(*Ctx) };
const FunctionType *FTy = FunctionType::get(Type::getVoidTy(*Ctx),
- Args, false);
+ Type::getInt8PtrTy(*Ctx), false);
return M->getOrInsertFunction("llvm_gcda_start_file", FTy);
}
Constant *GCOVProfiler::getIncrementIndirectCounterFunc() {
- const Type *Args[] = {
+ Type *Args[] = {
Type::getInt32PtrTy(*Ctx), // uint32_t *predecessor
Type::getInt64PtrTy(*Ctx)->getPointerTo(), // uint64_t **state_table_row
};
@@ -589,7 +588,7 @@ Constant *GCOVProfiler::getIncrementIndirectCounterFunc() {
}
Constant *GCOVProfiler::getEmitFunctionFunc() {
- const Type *Args[2] = {
+ Type *Args[2] = {
Type::getInt32Ty(*Ctx), // uint32_t ident
Type::getInt8PtrTy(*Ctx), // const char *function_name
};
@@ -599,7 +598,7 @@ Constant *GCOVProfiler::getEmitFunctionFunc() {
}
Constant *GCOVProfiler::getEmitArcsFunc() {
- const Type *Args[] = {
+ Type *Args[] = {
Type::getInt32Ty(*Ctx), // uint32_t num_counters
Type::getInt64PtrTy(*Ctx), // uint64_t *counters
};
diff --git a/contrib/llvm/lib/Transforms/Instrumentation/PathProfiling.cpp b/contrib/llvm/lib/Transforms/Instrumentation/PathProfiling.cpp
index 182a43d..7541663 100644
--- a/contrib/llvm/lib/Transforms/Instrumentation/PathProfiling.cpp
+++ b/contrib/llvm/lib/Transforms/Instrumentation/PathProfiling.cpp
@@ -376,7 +376,7 @@ namespace llvm {
public:
static const StructType *get(LLVMContext& C) {
return( StructType::get(
- C, TypeBuilder<types::i<32>, xcompile>::get(C), // type
+ TypeBuilder<types::i<32>, xcompile>::get(C), // type
TypeBuilder<types::i<32>, xcompile>::get(C), // array size
TypeBuilder<types::i<8>*, xcompile>::get(C), // array/hash ptr
NULL));
@@ -1062,7 +1062,7 @@ void PathProfiler::insertCounterIncrement(Value* incValue,
CallInst::Create(
increment ? llvmIncrementHashFunction : llvmDecrementHashFunction,
- args.begin(), args.end(), "", insertPoint);
+ args, "", insertPoint);
}
}
diff --git a/contrib/llvm/lib/Transforms/Instrumentation/ProfilingUtils.cpp b/contrib/llvm/lib/Transforms/Instrumentation/ProfilingUtils.cpp
index 7435bc3..445a5b6 100644
--- a/contrib/llvm/lib/Transforms/Instrumentation/ProfilingUtils.cpp
+++ b/contrib/llvm/lib/Transforms/Instrumentation/ProfilingUtils.cpp
@@ -62,8 +62,7 @@ void llvm::InsertProfilingInitCall(Function *MainFn, const char *FnName,
}
Args[3] = ConstantInt::get(Type::getInt32Ty(Context), NumElements);
- CallInst *InitCall = CallInst::Create(InitFn, Args.begin(), Args.end(),
- "newargc", InsertPos);
+ CallInst *InitCall = CallInst::Create(InitFn, Args, "newargc", InsertPos);
// If argc or argv are not available in main, just pass null values in.
Function::arg_iterator AI;
@@ -134,7 +133,7 @@ void llvm::IncrementCounterInBlock(BasicBlock *BB, unsigned CounterNum,
void llvm::InsertProfilingShutdownCall(Function *Callee, Module *Mod) {
// llvm.global_dtors is an array of type { i32, void ()* }. Prepare those
// types.
- const Type *GlobalDtorElems[2] = {
+ Type *GlobalDtorElems[2] = {
Type::getInt32Ty(Mod->getContext()),
FunctionType::get(Type::getVoidTy(Mod->getContext()), false)->getPointerTo()
};
@@ -164,7 +163,8 @@ void llvm::InsertProfilingShutdownCall(Function *Callee, Module *Mod) {
GlobalVariable *GlobalDtors = new GlobalVariable(
*Mod, ArrayType::get(GlobalDtorElemTy, 1), false,
GlobalValue::AppendingLinkage, NULL, "llvm.global_dtors");
- dtors.push_back(ConstantStruct::get(Mod->getContext(), Elem, 2, false));
+
+ dtors.push_back(ConstantStruct::get(GlobalDtorElemTy, Elem));
GlobalDtors->setInitializer(ConstantArray::get(
cast<ArrayType>(GlobalDtors->getType()->getElementType()), dtors));
}
diff --git a/contrib/llvm/lib/Transforms/Scalar/DeadStoreElimination.cpp b/contrib/llvm/lib/Transforms/Scalar/DeadStoreElimination.cpp
index 53e4640..cb9b5be 100644
--- a/contrib/llvm/lib/Transforms/Scalar/DeadStoreElimination.cpp
+++ b/contrib/llvm/lib/Transforms/Scalar/DeadStoreElimination.cpp
@@ -437,12 +437,9 @@ bool DSE::runOnBasicBlock(BasicBlock &BB) {
MemDepResult InstDep = MD->getDependency(Inst);
- // Ignore non-local store liveness.
+ // Ignore any store where we can't find a local dependence.
// FIXME: cross-block DSE would be fun. :)
- if (InstDep.isNonLocal() ||
- // Ignore self dependence, which happens in the entry block of the
- // function.
- InstDep.getInst() == Inst)
+ if (InstDep.isNonLocal() || InstDep.isUnknown())
continue;
// If we're storing the same value back to a pointer that we just
@@ -478,7 +475,7 @@ bool DSE::runOnBasicBlock(BasicBlock &BB) {
if (Loc.Ptr == 0)
continue;
- while (!InstDep.isNonLocal()) {
+ while (!InstDep.isNonLocal() && !InstDep.isUnknown()) {
// Get the memory clobbered by the instruction we depend on. MemDep will
// skip any instructions that 'Loc' clearly doesn't interact with. If we
// end up depending on a may- or must-aliased load, then we can't optimize
@@ -542,24 +539,26 @@ bool DSE::runOnBasicBlock(BasicBlock &BB) {
/// HandleFree - Handle frees of entire structures whose dependency is a store
/// to a field of that structure.
bool DSE::HandleFree(CallInst *F) {
+ bool MadeChange = false;
+
MemDepResult Dep = MD->getDependency(F);
- do {
- if (Dep.isNonLocal()) return false;
-
+
+ while (!Dep.isNonLocal() && !Dep.isUnknown()) {
Instruction *Dependency = Dep.getInst();
if (!hasMemoryWrite(Dependency) || !isRemovable(Dependency))
- return false;
+ return MadeChange;
Value *DepPointer =
GetUnderlyingObject(getStoredPointerOperand(Dependency));
// Check for aliasing.
if (!AA->isMustAlias(F->getArgOperand(0), DepPointer))
- return false;
+ return MadeChange;
// DCE instructions only used to calculate that store
DeleteDeadInstruction(Dependency, *MD);
++NumFastStores;
+ MadeChange = true;
// Inst's old Dependency is now deleted. Compute the next dependency,
// which may also be dead, as in
@@ -567,9 +566,9 @@ bool DSE::HandleFree(CallInst *F) {
// s[1] = 0; // This has just been deleted.
// free(s);
Dep = MD->getDependency(F);
- } while (!Dep.isNonLocal());
+ };
- return true;
+ return MadeChange;
}
/// handleEndBlock - Remove dead stores to stack-allocated locations in the
diff --git a/contrib/llvm/lib/Transforms/Scalar/GVN.cpp b/contrib/llvm/lib/Transforms/Scalar/GVN.cpp
index 2515fd1..87b7317 100644
--- a/contrib/llvm/lib/Transforms/Scalar/GVN.cpp
+++ b/contrib/llvm/lib/Transforms/Scalar/GVN.cpp
@@ -91,6 +91,7 @@ namespace {
uint32_t nextValueNumber;
Expression create_expression(Instruction* I);
+ Expression create_extractvalue_expression(ExtractValueInst* EI);
uint32_t lookup_or_add_call(CallInst* C);
public:
ValueTable() : nextValueNumber(1) { }
@@ -141,7 +142,6 @@ template <> struct DenseMapInfo<Expression> {
// ValueTable Internal Functions
//===----------------------------------------------------------------------===//
-
Expression ValueTable::create_expression(Instruction *I) {
Expression e;
e.type = I->getType();
@@ -150,12 +150,8 @@ Expression ValueTable::create_expression(Instruction *I) {
OI != OE; ++OI)
e.varargs.push_back(lookup_or_add(*OI));
- if (CmpInst *C = dyn_cast<CmpInst>(I))
+ if (CmpInst *C = dyn_cast<CmpInst>(I)) {
e.opcode = (C->getOpcode() << 8) | C->getPredicate();
- else if (ExtractValueInst *E = dyn_cast<ExtractValueInst>(I)) {
- for (ExtractValueInst::idx_iterator II = E->idx_begin(), IE = E->idx_end();
- II != IE; ++II)
- e.varargs.push_back(*II);
} else if (InsertValueInst *E = dyn_cast<InsertValueInst>(I)) {
for (InsertValueInst::idx_iterator II = E->idx_begin(), IE = E->idx_end();
II != IE; ++II)
@@ -165,6 +161,58 @@ Expression ValueTable::create_expression(Instruction *I) {
return e;
}
+Expression ValueTable::create_extractvalue_expression(ExtractValueInst *EI) {
+ assert(EI != 0 && "Not an ExtractValueInst?");
+ Expression e;
+ e.type = EI->getType();
+ e.opcode = 0;
+
+ IntrinsicInst *I = dyn_cast<IntrinsicInst>(EI->getAggregateOperand());
+ if (I != 0 && EI->getNumIndices() == 1 && *EI->idx_begin() == 0 ) {
+ // EI might be an extract from one of our recognised intrinsics. If it
+ // is we'll synthesize a semantically equivalent expression instead on
+ // an extract value expression.
+ switch (I->getIntrinsicID()) {
+ case Intrinsic::sadd_with_overflow:
+ case Intrinsic::uadd_with_overflow:
+ e.opcode = Instruction::Add;
+ break;
+ case Intrinsic::ssub_with_overflow:
+ case Intrinsic::usub_with_overflow:
+ e.opcode = Instruction::Sub;
+ break;
+ case Intrinsic::smul_with_overflow:
+ case Intrinsic::umul_with_overflow:
+ e.opcode = Instruction::Mul;
+ break;
+ default:
+ break;
+ }
+
+ if (e.opcode != 0) {
+ // Intrinsic recognized. Grab its args to finish building the expression.
+ assert(I->getNumArgOperands() == 2 &&
+ "Expect two args for recognised intrinsics.");
+ e.varargs.push_back(lookup_or_add(I->getArgOperand(0)));
+ e.varargs.push_back(lookup_or_add(I->getArgOperand(1)));
+ return e;
+ }
+ }
+
+ // Not a recognised intrinsic. Fall back to producing an extract value
+ // expression.
+ e.opcode = EI->getOpcode();
+ for (Instruction::op_iterator OI = EI->op_begin(), OE = EI->op_end();
+ OI != OE; ++OI)
+ e.varargs.push_back(lookup_or_add(*OI));
+
+ for (ExtractValueInst::idx_iterator II = EI->idx_begin(), IE = EI->idx_end();
+ II != IE; ++II)
+ e.varargs.push_back(*II);
+
+ return e;
+}
+
//===----------------------------------------------------------------------===//
// ValueTable External Functions
//===----------------------------------------------------------------------===//
@@ -227,21 +275,19 @@ uint32_t ValueTable::lookup_or_add_call(CallInst* C) {
// Non-local case.
const MemoryDependenceAnalysis::NonLocalDepInfo &deps =
MD->getNonLocalCallDependency(CallSite(C));
- // FIXME: call/call dependencies for readonly calls should return def, not
- // clobber! Move the checking logic to MemDep!
+ // FIXME: Move the checking logic to MemDep!
CallInst* cdep = 0;
// Check to see if we have a single dominating call instruction that is
// identical to C.
for (unsigned i = 0, e = deps.size(); i != e; ++i) {
const NonLocalDepEntry *I = &deps[i];
- // Ignore non-local dependencies.
if (I->getResult().isNonLocal())
continue;
- // We don't handle non-depedencies. If we already have a call, reject
+ // We don't handle non-definitions. If we already have a call, reject
// instruction dependencies.
- if (I->getResult().isClobber() || cdep != 0) {
+ if (!I->getResult().isDef() || cdep != 0) {
cdep = 0;
break;
}
@@ -338,11 +384,13 @@ uint32_t ValueTable::lookup_or_add(Value *V) {
case Instruction::ExtractElement:
case Instruction::InsertElement:
case Instruction::ShuffleVector:
- case Instruction::ExtractValue:
case Instruction::InsertValue:
case Instruction::GetElementPtr:
exp = create_expression(I);
break;
+ case Instruction::ExtractValue:
+ exp = create_extractvalue_expression(cast<ExtractValueInst>(I));
+ break;
default:
valueNumbering[V] = nextValueNumber;
return nextValueNumber++;
@@ -1192,8 +1240,10 @@ static Value *ConstructSSAForLoadSet(LoadInst *LI,
// escaping uses to any values that are operands to these PHIs.
for (unsigned i = 0, e = NewPHIs.size(); i != e; ++i) {
PHINode *P = NewPHIs[i];
- for (unsigned ii = 0, ee = P->getNumIncomingValues(); ii != ee; ++ii)
- AA->addEscapingUse(P->getOperandUse(2*ii));
+ for (unsigned ii = 0, ee = P->getNumIncomingValues(); ii != ee; ++ii) {
+ unsigned jj = PHINode::getOperandNumForIncomingValue(ii);
+ AA->addEscapingUse(P->getOperandUse(jj));
+ }
}
}
@@ -1224,12 +1274,11 @@ bool GVN::processNonLocalLoad(LoadInst *LI) {
// If we had a phi translation failure, we'll have a single entry which is a
// clobber in the current block. Reject this early.
- if (Deps.size() == 1 && Deps[0].getResult().isClobber() &&
- Deps[0].getResult().getInst()->getParent() == LI->getParent()) {
+ if (Deps.size() == 1 && Deps[0].getResult().isUnknown()) {
DEBUG(
dbgs() << "GVN: non-local load ";
WriteAsOperand(dbgs(), LI);
- dbgs() << " is clobbered by " << *Deps[0].getResult().getInst() << '\n';
+ dbgs() << " has unknown dependencies\n";
);
return false;
}
@@ -1245,6 +1294,11 @@ bool GVN::processNonLocalLoad(LoadInst *LI) {
BasicBlock *DepBB = Deps[i].getBB();
MemDepResult DepInfo = Deps[i].getResult();
+ if (DepInfo.isUnknown()) {
+ UnavailableBlocks.push_back(DepBB);
+ continue;
+ }
+
if (DepInfo.isClobber()) {
// The address being loaded in this non-local block may not be the same as
// the pointer operand of the load if PHI translation occurs. Make sure
@@ -1305,6 +1359,8 @@ bool GVN::processNonLocalLoad(LoadInst *LI) {
continue;
}
+ assert(DepInfo.isDef() && "Expecting def here");
+
Instruction *DepInst = DepInfo.getInst();
// Loading the allocation -> undef.
@@ -1691,10 +1747,22 @@ bool GVN::processLoad(LoadInst *L) {
return false;
}
+ if (Dep.isUnknown()) {
+ DEBUG(
+ // fast print dep, using operator<< on instruction is too slow.
+ dbgs() << "GVN: load ";
+ WriteAsOperand(dbgs(), L);
+ dbgs() << " has unknown dependence\n";
+ );
+ return false;
+ }
+
// If it is defined in another block, try harder.
if (Dep.isNonLocal())
return processNonLocalLoad(L);
+ assert(Dep.isDef() && "Expecting def here");
+
Instruction *DepInst = Dep.getInst();
if (StoreInst *DepSI = dyn_cast<StoreInst>(DepInst)) {
Value *StoredVal = DepSI->getValueOperand();
@@ -2133,8 +2201,11 @@ bool GVN::performPRE(Function &F) {
// Because we have added a PHI-use of the pointer value, it has now
// "escaped" from alias analysis' perspective. We need to inform
// AA of this.
- for (unsigned ii = 0, ee = Phi->getNumIncomingValues(); ii != ee; ++ii)
- VN.getAliasAnalysis()->addEscapingUse(Phi->getOperandUse(2*ii));
+ for (unsigned ii = 0, ee = Phi->getNumIncomingValues(); ii != ee;
+ ++ii) {
+ unsigned jj = PHINode::getOperandNumForIncomingValue(ii);
+ VN.getAliasAnalysis()->addEscapingUse(Phi->getOperandUse(jj));
+ }
if (MD)
MD->invalidateCachedPointerInfo(Phi);
diff --git a/contrib/llvm/lib/Transforms/Scalar/IndVarSimplify.cpp b/contrib/llvm/lib/Transforms/Scalar/IndVarSimplify.cpp
index 04ee7c8..dee3d38 100644
--- a/contrib/llvm/lib/Transforms/Scalar/IndVarSimplify.cpp
+++ b/contrib/llvm/lib/Transforms/Scalar/IndVarSimplify.cpp
@@ -52,30 +52,32 @@
#include "llvm/Analysis/LoopInfo.h"
#include "llvm/Analysis/LoopPass.h"
#include "llvm/Support/CFG.h"
+#include "llvm/Support/CommandLine.h"
#include "llvm/Support/Debug.h"
#include "llvm/Support/raw_ostream.h"
#include "llvm/Transforms/Utils/Local.h"
#include "llvm/Transforms/Utils/BasicBlockUtils.h"
#include "llvm/Target/TargetData.h"
+#include "llvm/ADT/DenseMap.h"
#include "llvm/ADT/SmallVector.h"
#include "llvm/ADT/Statistic.h"
#include "llvm/ADT/STLExtras.h"
using namespace llvm;
-STATISTIC(NumRemoved , "Number of aux indvars removed");
-STATISTIC(NumWidened , "Number of indvars widened");
-STATISTIC(NumInserted, "Number of canonical indvars added");
-STATISTIC(NumReplaced, "Number of exit values replaced");
-STATISTIC(NumLFTR , "Number of loop exit tests replaced");
-STATISTIC(NumElimExt , "Number of IV sign/zero extends eliminated");
-STATISTIC(NumElimRem , "Number of IV remainder operations eliminated");
-STATISTIC(NumElimCmp , "Number of IV comparisons eliminated");
-
-// DisableIVRewrite mode currently affects IVUsers, so is defined in libAnalysis
-// and referenced here.
-namespace llvm {
- extern bool DisableIVRewrite;
-}
+STATISTIC(NumRemoved , "Number of aux indvars removed");
+STATISTIC(NumWidened , "Number of indvars widened");
+STATISTIC(NumInserted , "Number of canonical indvars added");
+STATISTIC(NumReplaced , "Number of exit values replaced");
+STATISTIC(NumLFTR , "Number of loop exit tests replaced");
+STATISTIC(NumElimIdentity, "Number of IV identities eliminated");
+STATISTIC(NumElimExt , "Number of IV sign/zero extends eliminated");
+STATISTIC(NumElimRem , "Number of IV remainder operations eliminated");
+STATISTIC(NumElimCmp , "Number of IV comparisons eliminated");
+STATISTIC(NumElimIV , "Number of congruent IVs eliminated");
+
+static cl::opt<bool> DisableIVRewrite(
+ "disable-iv-rewrite", cl::Hidden,
+ cl::desc("Disable canonical induction variable rewriting"));
namespace {
class IndVarSimplify : public LoopPass {
@@ -84,12 +86,14 @@ namespace {
ScalarEvolution *SE;
DominatorTree *DT;
TargetData *TD;
+
SmallVector<WeakVH, 16> DeadInsts;
bool Changed;
public:
static char ID; // Pass identification, replacement for typeid
- IndVarSimplify() : LoopPass(ID), IU(0), LI(0), SE(0), DT(0), TD(0) {
+ IndVarSimplify() : LoopPass(ID), IU(0), LI(0), SE(0), DT(0), TD(0),
+ Changed(false) {
initializeIndVarSimplifyPass(*PassRegistry::getPassRegistry());
}
@@ -101,36 +105,46 @@ namespace {
AU.addRequired<ScalarEvolution>();
AU.addRequiredID(LoopSimplifyID);
AU.addRequiredID(LCSSAID);
- AU.addRequired<IVUsers>();
+ if (!DisableIVRewrite)
+ AU.addRequired<IVUsers>();
AU.addPreserved<ScalarEvolution>();
AU.addPreservedID(LoopSimplifyID);
AU.addPreservedID(LCSSAID);
- AU.addPreserved<IVUsers>();
+ if (!DisableIVRewrite)
+ AU.addPreserved<IVUsers>();
AU.setPreservesCFG();
}
private:
+ virtual void releaseMemory() {
+ DeadInsts.clear();
+ }
+
bool isValidRewrite(Value *FromVal, Value *ToVal);
+ void HandleFloatingPointIV(Loop *L, PHINode *PH);
+ void RewriteNonIntegerIVs(Loop *L);
+
+ void RewriteLoopExitValues(Loop *L, SCEVExpander &Rewriter);
+
void SimplifyIVUsers(SCEVExpander &Rewriter);
+ void SimplifyIVUsersNoRewrite(Loop *L, SCEVExpander &Rewriter);
+
+ bool EliminateIVUser(Instruction *UseInst, Instruction *IVOperand);
void EliminateIVComparison(ICmpInst *ICmp, Value *IVOperand);
void EliminateIVRemainder(BinaryOperator *Rem,
Value *IVOperand,
- bool IsSigned,
- PHINode *IVPhi);
- void RewriteNonIntegerIVs(Loop *L);
+ bool IsSigned);
+
+ void SimplifyCongruentIVs(Loop *L);
+
+ void RewriteIVExpressions(Loop *L, SCEVExpander &Rewriter);
ICmpInst *LinearFunctionTestReplace(Loop *L, const SCEV *BackedgeTakenCount,
PHINode *IndVar,
SCEVExpander &Rewriter);
- void RewriteLoopExitValues(Loop *L, SCEVExpander &Rewriter);
-
- void RewriteIVExpressions(Loop *L, SCEVExpander &Rewriter);
-
void SinkUnusedInvariants(Loop *L);
-
- void HandleFloatingPointIV(Loop *L, PHINode *PH);
};
}
@@ -197,156 +211,262 @@ bool IndVarSimplify::isValidRewrite(Value *FromVal, Value *ToVal) {
return true;
}
-/// canExpandBackedgeTakenCount - Return true if this loop's backedge taken
-/// count expression can be safely and cheaply expanded into an instruction
-/// sequence that can be used by LinearFunctionTestReplace.
-static bool canExpandBackedgeTakenCount(Loop *L, ScalarEvolution *SE) {
- const SCEV *BackedgeTakenCount = SE->getBackedgeTakenCount(L);
- if (isa<SCEVCouldNotCompute>(BackedgeTakenCount) ||
- BackedgeTakenCount->isZero())
- return false;
+//===----------------------------------------------------------------------===//
+// RewriteNonIntegerIVs and helpers. Prefer integer IVs.
+//===----------------------------------------------------------------------===//
- if (!L->getExitingBlock())
+/// ConvertToSInt - Convert APF to an integer, if possible.
+static bool ConvertToSInt(const APFloat &APF, int64_t &IntVal) {
+ bool isExact = false;
+ if (&APF.getSemantics() == &APFloat::PPCDoubleDouble)
return false;
-
- // Can't rewrite non-branch yet.
- BranchInst *BI = dyn_cast<BranchInst>(L->getExitingBlock()->getTerminator());
- if (!BI)
+ // See if we can convert this to an int64_t
+ uint64_t UIntVal;
+ if (APF.convertToInteger(&UIntVal, 64, true, APFloat::rmTowardZero,
+ &isExact) != APFloat::opOK || !isExact)
return false;
-
- // Special case: If the backedge-taken count is a UDiv, it's very likely a
- // UDiv that ScalarEvolution produced in order to compute a precise
- // expression, rather than a UDiv from the user's code. If we can't find a
- // UDiv in the code with some simple searching, assume the former and forego
- // rewriting the loop.
- if (isa<SCEVUDivExpr>(BackedgeTakenCount)) {
- ICmpInst *OrigCond = dyn_cast<ICmpInst>(BI->getCondition());
- if (!OrigCond) return false;
- const SCEV *R = SE->getSCEV(OrigCond->getOperand(1));
- R = SE->getMinusSCEV(R, SE->getConstant(R->getType(), 1));
- if (R != BackedgeTakenCount) {
- const SCEV *L = SE->getSCEV(OrigCond->getOperand(0));
- L = SE->getMinusSCEV(L, SE->getConstant(L->getType(), 1));
- if (L != BackedgeTakenCount)
- return false;
- }
- }
+ IntVal = UIntVal;
return true;
}
-/// getBackedgeIVType - Get the widest type used by the loop test after peeking
-/// through Truncs.
+/// HandleFloatingPointIV - If the loop has floating induction variable
+/// then insert corresponding integer induction variable if possible.
+/// For example,
+/// for(double i = 0; i < 10000; ++i)
+/// bar(i)
+/// is converted into
+/// for(int i = 0; i < 10000; ++i)
+/// bar((double)i);
///
-/// TODO: Unnecessary once LinearFunctionTestReplace is removed.
-static const Type *getBackedgeIVType(Loop *L) {
- if (!L->getExitingBlock())
- return 0;
+void IndVarSimplify::HandleFloatingPointIV(Loop *L, PHINode *PN) {
+ unsigned IncomingEdge = L->contains(PN->getIncomingBlock(0));
+ unsigned BackEdge = IncomingEdge^1;
- // Can't rewrite non-branch yet.
- BranchInst *BI = dyn_cast<BranchInst>(L->getExitingBlock()->getTerminator());
- if (!BI)
- return 0;
+ // Check incoming value.
+ ConstantFP *InitValueVal =
+ dyn_cast<ConstantFP>(PN->getIncomingValue(IncomingEdge));
- ICmpInst *Cond = dyn_cast<ICmpInst>(BI->getCondition());
- if (!Cond)
- return 0;
+ int64_t InitValue;
+ if (!InitValueVal || !ConvertToSInt(InitValueVal->getValueAPF(), InitValue))
+ return;
- const Type *Ty = 0;
- for(User::op_iterator OI = Cond->op_begin(), OE = Cond->op_end();
- OI != OE; ++OI) {
- assert((!Ty || Ty == (*OI)->getType()) && "bad icmp operand types");
- TruncInst *Trunc = dyn_cast<TruncInst>(*OI);
- if (!Trunc)
- continue;
+ // Check IV increment. Reject this PN if increment operation is not
+ // an add or increment value can not be represented by an integer.
+ BinaryOperator *Incr =
+ dyn_cast<BinaryOperator>(PN->getIncomingValue(BackEdge));
+ if (Incr == 0 || Incr->getOpcode() != Instruction::FAdd) return;
- return Trunc->getSrcTy();
+ // If this is not an add of the PHI with a constantfp, or if the constant fp
+ // is not an integer, bail out.
+ ConstantFP *IncValueVal = dyn_cast<ConstantFP>(Incr->getOperand(1));
+ int64_t IncValue;
+ if (IncValueVal == 0 || Incr->getOperand(0) != PN ||
+ !ConvertToSInt(IncValueVal->getValueAPF(), IncValue))
+ return;
+
+ // Check Incr uses. One user is PN and the other user is an exit condition
+ // used by the conditional terminator.
+ Value::use_iterator IncrUse = Incr->use_begin();
+ Instruction *U1 = cast<Instruction>(*IncrUse++);
+ if (IncrUse == Incr->use_end()) return;
+ Instruction *U2 = cast<Instruction>(*IncrUse++);
+ if (IncrUse != Incr->use_end()) return;
+
+ // Find exit condition, which is an fcmp. If it doesn't exist, or if it isn't
+ // only used by a branch, we can't transform it.
+ FCmpInst *Compare = dyn_cast<FCmpInst>(U1);
+ if (!Compare)
+ Compare = dyn_cast<FCmpInst>(U2);
+ if (Compare == 0 || !Compare->hasOneUse() ||
+ !isa<BranchInst>(Compare->use_back()))
+ return;
+
+ BranchInst *TheBr = cast<BranchInst>(Compare->use_back());
+
+ // We need to verify that the branch actually controls the iteration count
+ // of the loop. If not, the new IV can overflow and no one will notice.
+ // The branch block must be in the loop and one of the successors must be out
+ // of the loop.
+ assert(TheBr->isConditional() && "Can't use fcmp if not conditional");
+ if (!L->contains(TheBr->getParent()) ||
+ (L->contains(TheBr->getSuccessor(0)) &&
+ L->contains(TheBr->getSuccessor(1))))
+ return;
+
+
+ // If it isn't a comparison with an integer-as-fp (the exit value), we can't
+ // transform it.
+ ConstantFP *ExitValueVal = dyn_cast<ConstantFP>(Compare->getOperand(1));
+ int64_t ExitValue;
+ if (ExitValueVal == 0 ||
+ !ConvertToSInt(ExitValueVal->getValueAPF(), ExitValue))
+ return;
+
+ // Find new predicate for integer comparison.
+ CmpInst::Predicate NewPred = CmpInst::BAD_ICMP_PREDICATE;
+ switch (Compare->getPredicate()) {
+ default: return; // Unknown comparison.
+ case CmpInst::FCMP_OEQ:
+ case CmpInst::FCMP_UEQ: NewPred = CmpInst::ICMP_EQ; break;
+ case CmpInst::FCMP_ONE:
+ case CmpInst::FCMP_UNE: NewPred = CmpInst::ICMP_NE; break;
+ case CmpInst::FCMP_OGT:
+ case CmpInst::FCMP_UGT: NewPred = CmpInst::ICMP_SGT; break;
+ case CmpInst::FCMP_OGE:
+ case CmpInst::FCMP_UGE: NewPred = CmpInst::ICMP_SGE; break;
+ case CmpInst::FCMP_OLT:
+ case CmpInst::FCMP_ULT: NewPred = CmpInst::ICMP_SLT; break;
+ case CmpInst::FCMP_OLE:
+ case CmpInst::FCMP_ULE: NewPred = CmpInst::ICMP_SLE; break;
}
- return Ty;
-}
-/// LinearFunctionTestReplace - This method rewrites the exit condition of the
-/// loop to be a canonical != comparison against the incremented loop induction
-/// variable. This pass is able to rewrite the exit tests of any loop where the
-/// SCEV analysis can determine a loop-invariant trip count of the loop, which
-/// is actually a much broader range than just linear tests.
-ICmpInst *IndVarSimplify::
-LinearFunctionTestReplace(Loop *L,
- const SCEV *BackedgeTakenCount,
- PHINode *IndVar,
- SCEVExpander &Rewriter) {
- assert(canExpandBackedgeTakenCount(L, SE) && "precondition");
- BranchInst *BI = cast<BranchInst>(L->getExitingBlock()->getTerminator());
+ // We convert the floating point induction variable to a signed i32 value if
+ // we can. This is only safe if the comparison will not overflow in a way
+ // that won't be trapped by the integer equivalent operations. Check for this
+ // now.
+ // TODO: We could use i64 if it is native and the range requires it.
- // If the exiting block is not the same as the backedge block, we must compare
- // against the preincremented value, otherwise we prefer to compare against
- // the post-incremented value.
- Value *CmpIndVar;
- const SCEV *RHS = BackedgeTakenCount;
- if (L->getExitingBlock() == L->getLoopLatch()) {
- // Add one to the "backedge-taken" count to get the trip count.
- // If this addition may overflow, we have to be more pessimistic and
- // cast the induction variable before doing the add.
- const SCEV *Zero = SE->getConstant(BackedgeTakenCount->getType(), 0);
- const SCEV *N =
- SE->getAddExpr(BackedgeTakenCount,
- SE->getConstant(BackedgeTakenCount->getType(), 1));
- if ((isa<SCEVConstant>(N) && !N->isZero()) ||
- SE->isLoopEntryGuardedByCond(L, ICmpInst::ICMP_NE, N, Zero)) {
- // No overflow. Cast the sum.
- RHS = SE->getTruncateOrZeroExtend(N, IndVar->getType());
- } else {
- // Potential overflow. Cast before doing the add.
- RHS = SE->getTruncateOrZeroExtend(BackedgeTakenCount,
- IndVar->getType());
- RHS = SE->getAddExpr(RHS,
- SE->getConstant(IndVar->getType(), 1));
+ // The start/stride/exit values must all fit in signed i32.
+ if (!isInt<32>(InitValue) || !isInt<32>(IncValue) || !isInt<32>(ExitValue))
+ return;
+
+ // If not actually striding (add x, 0.0), avoid touching the code.
+ if (IncValue == 0)
+ return;
+
+ // Positive and negative strides have different safety conditions.
+ if (IncValue > 0) {
+ // If we have a positive stride, we require the init to be less than the
+ // exit value and an equality or less than comparison.
+ if (InitValue >= ExitValue ||
+ NewPred == CmpInst::ICMP_SGT || NewPred == CmpInst::ICMP_SGE)
+ return;
+
+ uint32_t Range = uint32_t(ExitValue-InitValue);
+ if (NewPred == CmpInst::ICMP_SLE) {
+ // Normalize SLE -> SLT, check for infinite loop.
+ if (++Range == 0) return; // Range overflows.
}
- // The BackedgeTaken expression contains the number of times that the
- // backedge branches to the loop header. This is one less than the
- // number of times the loop executes, so use the incremented indvar.
- CmpIndVar = IndVar->getIncomingValueForBlock(L->getExitingBlock());
+ unsigned Leftover = Range % uint32_t(IncValue);
+
+ // If this is an equality comparison, we require that the strided value
+ // exactly land on the exit value, otherwise the IV condition will wrap
+ // around and do things the fp IV wouldn't.
+ if ((NewPred == CmpInst::ICMP_EQ || NewPred == CmpInst::ICMP_NE) &&
+ Leftover != 0)
+ return;
+
+ // If the stride would wrap around the i32 before exiting, we can't
+ // transform the IV.
+ if (Leftover != 0 && int32_t(ExitValue+IncValue) < ExitValue)
+ return;
+
} else {
- // We have to use the preincremented value...
- RHS = SE->getTruncateOrZeroExtend(BackedgeTakenCount,
- IndVar->getType());
- CmpIndVar = IndVar;
+ // If we have a negative stride, we require the init to be greater than the
+ // exit value and an equality or greater than comparison.
+ if (InitValue >= ExitValue ||
+ NewPred == CmpInst::ICMP_SLT || NewPred == CmpInst::ICMP_SLE)
+ return;
+
+ uint32_t Range = uint32_t(InitValue-ExitValue);
+ if (NewPred == CmpInst::ICMP_SGE) {
+ // Normalize SGE -> SGT, check for infinite loop.
+ if (++Range == 0) return; // Range overflows.
+ }
+
+ unsigned Leftover = Range % uint32_t(-IncValue);
+
+ // If this is an equality comparison, we require that the strided value
+ // exactly land on the exit value, otherwise the IV condition will wrap
+ // around and do things the fp IV wouldn't.
+ if ((NewPred == CmpInst::ICMP_EQ || NewPred == CmpInst::ICMP_NE) &&
+ Leftover != 0)
+ return;
+
+ // If the stride would wrap around the i32 before exiting, we can't
+ // transform the IV.
+ if (Leftover != 0 && int32_t(ExitValue+IncValue) > ExitValue)
+ return;
}
- // Expand the code for the iteration count.
- assert(SE->isLoopInvariant(RHS, L) &&
- "Computed iteration count is not loop invariant!");
- Value *ExitCnt = Rewriter.expandCodeFor(RHS, IndVar->getType(), BI);
+ const IntegerType *Int32Ty = Type::getInt32Ty(PN->getContext());
- // Insert a new icmp_ne or icmp_eq instruction before the branch.
- ICmpInst::Predicate Opcode;
- if (L->contains(BI->getSuccessor(0)))
- Opcode = ICmpInst::ICMP_NE;
- else
- Opcode = ICmpInst::ICMP_EQ;
+ // Insert new integer induction variable.
+ PHINode *NewPHI = PHINode::Create(Int32Ty, 2, PN->getName()+".int", PN);
+ NewPHI->addIncoming(ConstantInt::get(Int32Ty, InitValue),
+ PN->getIncomingBlock(IncomingEdge));
- DEBUG(dbgs() << "INDVARS: Rewriting loop exit condition to:\n"
- << " LHS:" << *CmpIndVar << '\n'
- << " op:\t"
- << (Opcode == ICmpInst::ICMP_NE ? "!=" : "==") << "\n"
- << " RHS:\t" << *RHS << "\n");
+ Value *NewAdd =
+ BinaryOperator::CreateAdd(NewPHI, ConstantInt::get(Int32Ty, IncValue),
+ Incr->getName()+".int", Incr);
+ NewPHI->addIncoming(NewAdd, PN->getIncomingBlock(BackEdge));
- ICmpInst *Cond = new ICmpInst(BI, Opcode, CmpIndVar, ExitCnt, "exitcond");
+ ICmpInst *NewCompare = new ICmpInst(TheBr, NewPred, NewAdd,
+ ConstantInt::get(Int32Ty, ExitValue),
+ Compare->getName());
- Value *OrigCond = BI->getCondition();
- // It's tempting to use replaceAllUsesWith here to fully replace the old
- // comparison, but that's not immediately safe, since users of the old
- // comparison may not be dominated by the new comparison. Instead, just
- // update the branch to use the new comparison; in the common case this
- // will make old comparison dead.
- BI->setCondition(Cond);
- DeadInsts.push_back(OrigCond);
+ // In the following deletions, PN may become dead and may be deleted.
+ // Use a WeakVH to observe whether this happens.
+ WeakVH WeakPH = PN;
- ++NumLFTR;
- Changed = true;
- return Cond;
+ // Delete the old floating point exit comparison. The branch starts using the
+ // new comparison.
+ NewCompare->takeName(Compare);
+ Compare->replaceAllUsesWith(NewCompare);
+ RecursivelyDeleteTriviallyDeadInstructions(Compare);
+
+ // Delete the old floating point increment.
+ Incr->replaceAllUsesWith(UndefValue::get(Incr->getType()));
+ RecursivelyDeleteTriviallyDeadInstructions(Incr);
+
+ // If the FP induction variable still has uses, this is because something else
+ // in the loop uses its value. In order to canonicalize the induction
+ // variable, we chose to eliminate the IV and rewrite it in terms of an
+ // int->fp cast.
+ //
+ // We give preference to sitofp over uitofp because it is faster on most
+ // platforms.
+ if (WeakPH) {
+ Value *Conv = new SIToFPInst(NewPHI, PN->getType(), "indvar.conv",
+ PN->getParent()->getFirstNonPHI());
+ PN->replaceAllUsesWith(Conv);
+ RecursivelyDeleteTriviallyDeadInstructions(PN);
+ }
+
+ // Add a new IVUsers entry for the newly-created integer PHI.
+ if (IU)
+ IU->AddUsersIfInteresting(NewPHI);
}
+void IndVarSimplify::RewriteNonIntegerIVs(Loop *L) {
+ // First step. Check to see if there are any floating-point recurrences.
+ // If there are, change them into integer recurrences, permitting analysis by
+ // the SCEV routines.
+ //
+ BasicBlock *Header = L->getHeader();
+
+ SmallVector<WeakVH, 8> PHIs;
+ for (BasicBlock::iterator I = Header->begin();
+ PHINode *PN = dyn_cast<PHINode>(I); ++I)
+ PHIs.push_back(PN);
+
+ for (unsigned i = 0, e = PHIs.size(); i != e; ++i)
+ if (PHINode *PN = dyn_cast_or_null<PHINode>(&*PHIs[i]))
+ HandleFloatingPointIV(L, PN);
+
+ // If the loop previously had floating-point IV, ScalarEvolution
+ // may not have been able to compute a trip count. Now that we've done some
+ // re-writing, the trip count may be computable.
+ if (Changed)
+ SE->forgetLoop(L);
+}
+
+//===----------------------------------------------------------------------===//
+// RewriteLoopExitValues - Optimize IV users outside the loop.
+// As a side effect, reduces the amount of IV processing within the loop.
+//===----------------------------------------------------------------------===//
+
/// RewriteLoopExitValues - Check to see if this loop has a computable
/// loop-invariant execution count. If so, this means that we can compute the
/// final value of any expressions that are recurrent in the loop, and
@@ -460,29 +580,168 @@ void IndVarSimplify::RewriteLoopExitValues(Loop *L, SCEVExpander &Rewriter) {
Rewriter.clearInsertPoint();
}
-void IndVarSimplify::RewriteNonIntegerIVs(Loop *L) {
- // First step. Check to see if there are any floating-point recurrences.
- // If there are, change them into integer recurrences, permitting analysis by
- // the SCEV routines.
+//===----------------------------------------------------------------------===//
+// Rewrite IV users based on a canonical IV.
+// To be replaced by -disable-iv-rewrite.
+//===----------------------------------------------------------------------===//
+
+/// SimplifyIVUsers - Iteratively perform simplification on IVUsers within this
+/// loop. IVUsers is treated as a worklist. Each successive simplification may
+/// push more users which may themselves be candidates for simplification.
+///
+/// This is the old approach to IV simplification to be replaced by
+/// SimplifyIVUsersNoRewrite.
+///
+void IndVarSimplify::SimplifyIVUsers(SCEVExpander &Rewriter) {
+ // Each round of simplification involves a round of eliminating operations
+ // followed by a round of widening IVs. A single IVUsers worklist is used
+ // across all rounds. The inner loop advances the user. If widening exposes
+ // more uses, then another pass through the outer loop is triggered.
+ for (IVUsers::iterator I = IU->begin(); I != IU->end(); ++I) {
+ Instruction *UseInst = I->getUser();
+ Value *IVOperand = I->getOperandValToReplace();
+
+ if (ICmpInst *ICmp = dyn_cast<ICmpInst>(UseInst)) {
+ EliminateIVComparison(ICmp, IVOperand);
+ continue;
+ }
+ if (BinaryOperator *Rem = dyn_cast<BinaryOperator>(UseInst)) {
+ bool IsSigned = Rem->getOpcode() == Instruction::SRem;
+ if (IsSigned || Rem->getOpcode() == Instruction::URem) {
+ EliminateIVRemainder(Rem, IVOperand, IsSigned);
+ continue;
+ }
+ }
+ }
+}
+
+// FIXME: It is an extremely bad idea to indvar substitute anything more
+// complex than affine induction variables. Doing so will put expensive
+// polynomial evaluations inside of the loop, and the str reduction pass
+// currently can only reduce affine polynomials. For now just disable
+// indvar subst on anything more complex than an affine addrec, unless
+// it can be expanded to a trivial value.
+static bool isSafe(const SCEV *S, const Loop *L, ScalarEvolution *SE) {
+ // Loop-invariant values are safe.
+ if (SE->isLoopInvariant(S, L)) return true;
+
+ // Affine addrecs are safe. Non-affine are not, because LSR doesn't know how
+ // to transform them into efficient code.
+ if (const SCEVAddRecExpr *AR = dyn_cast<SCEVAddRecExpr>(S))
+ return AR->isAffine();
+
+ // An add is safe it all its operands are safe.
+ if (const SCEVCommutativeExpr *Commutative = dyn_cast<SCEVCommutativeExpr>(S)) {
+ for (SCEVCommutativeExpr::op_iterator I = Commutative->op_begin(),
+ E = Commutative->op_end(); I != E; ++I)
+ if (!isSafe(*I, L, SE)) return false;
+ return true;
+ }
+
+ // A cast is safe if its operand is.
+ if (const SCEVCastExpr *C = dyn_cast<SCEVCastExpr>(S))
+ return isSafe(C->getOperand(), L, SE);
+
+ // A udiv is safe if its operands are.
+ if (const SCEVUDivExpr *UD = dyn_cast<SCEVUDivExpr>(S))
+ return isSafe(UD->getLHS(), L, SE) &&
+ isSafe(UD->getRHS(), L, SE);
+
+ // SCEVUnknown is always safe.
+ if (isa<SCEVUnknown>(S))
+ return true;
+
+ // Nothing else is safe.
+ return false;
+}
+
+void IndVarSimplify::RewriteIVExpressions(Loop *L, SCEVExpander &Rewriter) {
+ // Rewrite all induction variable expressions in terms of the canonical
+ // induction variable.
//
- BasicBlock *Header = L->getHeader();
+ // If there were induction variables of other sizes or offsets, manually
+ // add the offsets to the primary induction variable and cast, avoiding
+ // the need for the code evaluation methods to insert induction variables
+ // of different sizes.
+ for (IVUsers::iterator UI = IU->begin(), E = IU->end(); UI != E; ++UI) {
+ Value *Op = UI->getOperandValToReplace();
+ const Type *UseTy = Op->getType();
+ Instruction *User = UI->getUser();
- SmallVector<WeakVH, 8> PHIs;
- for (BasicBlock::iterator I = Header->begin();
- PHINode *PN = dyn_cast<PHINode>(I); ++I)
- PHIs.push_back(PN);
+ // Compute the final addrec to expand into code.
+ const SCEV *AR = IU->getReplacementExpr(*UI);
- for (unsigned i = 0, e = PHIs.size(); i != e; ++i)
- if (PHINode *PN = dyn_cast_or_null<PHINode>(&*PHIs[i]))
- HandleFloatingPointIV(L, PN);
+ // Evaluate the expression out of the loop, if possible.
+ if (!L->contains(UI->getUser())) {
+ const SCEV *ExitVal = SE->getSCEVAtScope(AR, L->getParentLoop());
+ if (SE->isLoopInvariant(ExitVal, L))
+ AR = ExitVal;
+ }
- // If the loop previously had floating-point IV, ScalarEvolution
- // may not have been able to compute a trip count. Now that we've done some
- // re-writing, the trip count may be computable.
- if (Changed)
- SE->forgetLoop(L);
+ // FIXME: It is an extremely bad idea to indvar substitute anything more
+ // complex than affine induction variables. Doing so will put expensive
+ // polynomial evaluations inside of the loop, and the str reduction pass
+ // currently can only reduce affine polynomials. For now just disable
+ // indvar subst on anything more complex than an affine addrec, unless
+ // it can be expanded to a trivial value.
+ if (!isSafe(AR, L, SE))
+ continue;
+
+ // Determine the insertion point for this user. By default, insert
+ // immediately before the user. The SCEVExpander class will automatically
+ // hoist loop invariants out of the loop. For PHI nodes, there may be
+ // multiple uses, so compute the nearest common dominator for the
+ // incoming blocks.
+ Instruction *InsertPt = User;
+ if (PHINode *PHI = dyn_cast<PHINode>(InsertPt))
+ for (unsigned i = 0, e = PHI->getNumIncomingValues(); i != e; ++i)
+ if (PHI->getIncomingValue(i) == Op) {
+ if (InsertPt == User)
+ InsertPt = PHI->getIncomingBlock(i)->getTerminator();
+ else
+ InsertPt =
+ DT->findNearestCommonDominator(InsertPt->getParent(),
+ PHI->getIncomingBlock(i))
+ ->getTerminator();
+ }
+
+ // Now expand it into actual Instructions and patch it into place.
+ Value *NewVal = Rewriter.expandCodeFor(AR, UseTy, InsertPt);
+
+ DEBUG(dbgs() << "INDVARS: Rewrote IV '" << *AR << "' " << *Op << '\n'
+ << " into = " << *NewVal << "\n");
+
+ if (!isValidRewrite(Op, NewVal)) {
+ DeadInsts.push_back(NewVal);
+ continue;
+ }
+ // Inform ScalarEvolution that this value is changing. The change doesn't
+ // affect its value, but it does potentially affect which use lists the
+ // value will be on after the replacement, which affects ScalarEvolution's
+ // ability to walk use lists and drop dangling pointers when a value is
+ // deleted.
+ SE->forgetValue(User);
+
+ // Patch the new value into place.
+ if (Op->hasName())
+ NewVal->takeName(Op);
+ if (Instruction *NewValI = dyn_cast<Instruction>(NewVal))
+ NewValI->setDebugLoc(User->getDebugLoc());
+ User->replaceUsesOfWith(Op, NewVal);
+ UI->setOperandValToReplace(NewVal);
+
+ ++NumRemoved;
+ Changed = true;
+
+ // The old value may be dead now.
+ DeadInsts.push_back(Op);
+ }
}
+//===----------------------------------------------------------------------===//
+// IV Widening - Extend the width of an IV to cover its widest uses.
+//===----------------------------------------------------------------------===//
+
namespace {
// Collect information about induction variables that are used by sign/zero
// extend operations. This information is recorded by CollectExtend and
@@ -493,33 +752,30 @@ namespace {
WideIVInfo() : WidestNativeType(0), IsSigned(false) {}
};
- typedef std::map<PHINode *, WideIVInfo> WideIVMap;
}
/// CollectExtend - Update information about the induction variable that is
/// extended by this sign or zero extend operation. This is used to determine
/// the final width of the IV before actually widening it.
-static void CollectExtend(CastInst *Cast, PHINode *Phi, bool IsSigned,
- WideIVMap &IVMap, ScalarEvolution *SE,
- const TargetData *TD) {
+static void CollectExtend(CastInst *Cast, bool IsSigned, WideIVInfo &WI,
+ ScalarEvolution *SE, const TargetData *TD) {
const Type *Ty = Cast->getType();
uint64_t Width = SE->getTypeSizeInBits(Ty);
if (TD && !TD->isLegalInteger(Width))
return;
- WideIVInfo &IVInfo = IVMap[Phi];
- if (!IVInfo.WidestNativeType) {
- IVInfo.WidestNativeType = SE->getEffectiveSCEVType(Ty);
- IVInfo.IsSigned = IsSigned;
+ if (!WI.WidestNativeType) {
+ WI.WidestNativeType = SE->getEffectiveSCEVType(Ty);
+ WI.IsSigned = IsSigned;
return;
}
// We extend the IV to satisfy the sign of its first user, arbitrarily.
- if (IVInfo.IsSigned != IsSigned)
+ if (WI.IsSigned != IsSigned)
return;
- if (Width > SE->getTypeSizeInBits(IVInfo.WidestNativeType))
- IVInfo.WidestNativeType = SE->getEffectiveSCEVType(Ty);
+ if (Width > SE->getTypeSizeInBits(WI.WidestNativeType))
+ WI.WidestNativeType = SE->getEffectiveSCEVType(Ty);
}
namespace {
@@ -529,43 +785,45 @@ namespace {
/// inserting truncs whenever we stop propagating the type.
///
class WidenIV {
+ // Parameters
PHINode *OrigPhi;
const Type *WideType;
bool IsSigned;
- IVUsers *IU;
- LoopInfo *LI;
- Loop *L;
+ // Context
+ LoopInfo *LI;
+ Loop *L;
ScalarEvolution *SE;
- DominatorTree *DT;
- SmallVectorImpl<WeakVH> &DeadInsts;
+ DominatorTree *DT;
+ // Result
PHINode *WidePhi;
Instruction *WideInc;
const SCEV *WideIncExpr;
+ SmallVectorImpl<WeakVH> &DeadInsts;
- SmallPtrSet<Instruction*,16> Processed;
+ SmallPtrSet<Instruction*,16> Widened;
+ SmallVector<std::pair<Use *, Instruction *>, 8> NarrowIVUsers;
public:
- WidenIV(PHINode *PN, const WideIVInfo &IVInfo, IVUsers *IUsers,
- LoopInfo *LInfo, ScalarEvolution *SEv, DominatorTree *DTree,
+ WidenIV(PHINode *PN, const WideIVInfo &WI, LoopInfo *LInfo,
+ ScalarEvolution *SEv, DominatorTree *DTree,
SmallVectorImpl<WeakVH> &DI) :
OrigPhi(PN),
- WideType(IVInfo.WidestNativeType),
- IsSigned(IVInfo.IsSigned),
- IU(IUsers),
+ WideType(WI.WidestNativeType),
+ IsSigned(WI.IsSigned),
LI(LInfo),
L(LI->getLoopFor(OrigPhi->getParent())),
SE(SEv),
DT(DTree),
- DeadInsts(DI),
WidePhi(0),
WideInc(0),
- WideIncExpr(0) {
+ WideIncExpr(0),
+ DeadInsts(DI) {
assert(L->getHeader() == OrigPhi->getParent() && "Phi must be an IV");
}
- bool CreateWideIV(SCEVExpander &Rewriter);
+ PHINode *CreateWideIV(SCEVExpander &Rewriter);
protected:
Instruction *CloneIVUser(Instruction *NarrowUse,
@@ -574,58 +832,13 @@ protected:
const SCEVAddRecExpr *GetWideRecurrence(Instruction *NarrowUse);
- Instruction *WidenIVUse(Instruction *NarrowUse,
- Instruction *NarrowDef,
+ Instruction *WidenIVUse(Use &NarrowDefUse, Instruction *NarrowDef,
Instruction *WideDef);
+
+ void pushNarrowIVUsers(Instruction *NarrowDef, Instruction *WideDef);
};
} // anonymous namespace
-/// SimplifyIVUsers - Iteratively perform simplification on IVUsers within this
-/// loop. IVUsers is treated as a worklist. Each successive simplification may
-/// push more users which may themselves be candidates for simplification.
-///
-void IndVarSimplify::SimplifyIVUsers(SCEVExpander &Rewriter) {
- WideIVMap IVMap;
-
- // Each round of simplification involves a round of eliminating operations
- // followed by a round of widening IVs. A single IVUsers worklist is used
- // across all rounds. The inner loop advances the user. If widening exposes
- // more uses, then another pass through the outer loop is triggered.
- for (IVUsers::iterator I = IU->begin(), E = IU->end(); I != E;) {
- for(; I != E; ++I) {
- Instruction *UseInst = I->getUser();
- Value *IVOperand = I->getOperandValToReplace();
-
- if (DisableIVRewrite) {
- if (CastInst *Cast = dyn_cast<CastInst>(UseInst)) {
- bool IsSigned = Cast->getOpcode() == Instruction::SExt;
- if (IsSigned || Cast->getOpcode() == Instruction::ZExt) {
- CollectExtend(Cast, I->getPhi(), IsSigned, IVMap, SE, TD);
- continue;
- }
- }
- }
- if (ICmpInst *ICmp = dyn_cast<ICmpInst>(UseInst)) {
- EliminateIVComparison(ICmp, IVOperand);
- continue;
- }
- if (BinaryOperator *Rem = dyn_cast<BinaryOperator>(UseInst)) {
- bool IsSigned = Rem->getOpcode() == Instruction::SRem;
- if (IsSigned || Rem->getOpcode() == Instruction::URem) {
- EliminateIVRemainder(Rem, IVOperand, IsSigned, I->getPhi());
- continue;
- }
- }
- }
- for (WideIVMap::const_iterator I = IVMap.begin(), E = IVMap.end();
- I != E; ++I) {
- WidenIV Widener(I->first, I->second, IU, LI, SE, DT, DeadInsts);
- if (Widener.CreateWideIV(Rewriter))
- Changed = true;
- }
- }
-}
-
static Value *getExtend( Value *NarrowOper, const Type *WideType,
bool IsSigned, IRBuilder<> &Builder) {
return IsSigned ? Builder.CreateSExt(NarrowOper, WideType) :
@@ -671,34 +884,16 @@ Instruction *WidenIV::CloneIVUser(Instruction *NarrowUse,
LHS, RHS,
NarrowBO->getName());
Builder.Insert(WideBO);
- if (NarrowBO->hasNoUnsignedWrap()) WideBO->setHasNoUnsignedWrap();
- if (NarrowBO->hasNoSignedWrap()) WideBO->setHasNoSignedWrap();
-
+ if (const OverflowingBinaryOperator *OBO =
+ dyn_cast<OverflowingBinaryOperator>(NarrowBO)) {
+ if (OBO->hasNoUnsignedWrap()) WideBO->setHasNoUnsignedWrap();
+ if (OBO->hasNoSignedWrap()) WideBO->setHasNoSignedWrap();
+ }
return WideBO;
}
llvm_unreachable(0);
}
-// GetWideRecurrence - Is this instruction potentially interesting from IVUsers'
-// perspective after widening it's type? In other words, can the extend be
-// safely hoisted out of the loop with SCEV reducing the value to a recurrence
-// on the same loop. If so, return the sign or zero extended
-// recurrence. Otherwise return NULL.
-const SCEVAddRecExpr *WidenIV::GetWideRecurrence(Instruction *NarrowUse) {
- if (!SE->isSCEVable(NarrowUse->getType()))
- return 0;
-
- const SCEV *NarrowExpr = SE->getSCEV(NarrowUse);
- const SCEV *WideExpr = IsSigned ?
- SE->getSignExtendExpr(NarrowExpr, WideType) :
- SE->getZeroExtendExpr(NarrowExpr, WideType);
- const SCEVAddRecExpr *AddRec = dyn_cast<SCEVAddRecExpr>(WideExpr);
- if (!AddRec || AddRec->getLoop() != L)
- return 0;
-
- return AddRec;
-}
-
/// HoistStep - Attempt to hoist an IV increment above a potential use.
///
/// To successfully hoist, two criteria must be met:
@@ -733,18 +928,41 @@ static bool HoistStep(Instruction *IncV, Instruction *InsertPos,
return true;
}
+// GetWideRecurrence - Is this instruction potentially interesting from IVUsers'
+// perspective after widening it's type? In other words, can the extend be
+// safely hoisted out of the loop with SCEV reducing the value to a recurrence
+// on the same loop. If so, return the sign or zero extended
+// recurrence. Otherwise return NULL.
+const SCEVAddRecExpr *WidenIV::GetWideRecurrence(Instruction *NarrowUse) {
+ if (!SE->isSCEVable(NarrowUse->getType()))
+ return 0;
+
+ const SCEV *NarrowExpr = SE->getSCEV(NarrowUse);
+ if (SE->getTypeSizeInBits(NarrowExpr->getType())
+ >= SE->getTypeSizeInBits(WideType)) {
+ // NarrowUse implicitly widens its operand. e.g. a gep with a narrow
+ // index. So don't follow this use.
+ return 0;
+ }
+
+ const SCEV *WideExpr = IsSigned ?
+ SE->getSignExtendExpr(NarrowExpr, WideType) :
+ SE->getZeroExtendExpr(NarrowExpr, WideType);
+ const SCEVAddRecExpr *AddRec = dyn_cast<SCEVAddRecExpr>(WideExpr);
+ if (!AddRec || AddRec->getLoop() != L)
+ return 0;
+
+ return AddRec;
+}
+
/// WidenIVUse - Determine whether an individual user of the narrow IV can be
/// widened. If so, return the wide clone of the user.
-Instruction *WidenIV::WidenIVUse(Instruction *NarrowUse,
- Instruction *NarrowDef,
+Instruction *WidenIV::WidenIVUse(Use &NarrowDefUse, Instruction *NarrowDef,
Instruction *WideDef) {
- // To be consistent with IVUsers, stop traversing the def-use chain at
- // inner-loop phis or post-loop phis.
- if (isa<PHINode>(NarrowUse) && LI->getLoopFor(NarrowUse->getParent()) != L)
- return 0;
+ Instruction *NarrowUse = cast<Instruction>(NarrowDefUse.getUser());
- // Handle data flow merges and bizarre phi cycles.
- if (!Processed.insert(NarrowUse))
+ // Stop traversing the def-use chain at inner-loop phis or post-loop phis.
+ if (isa<PHINode>(NarrowUse) && LI->getLoopFor(NarrowUse->getParent()) != L)
return 0;
// Our raison d'etre! Eliminate sign and zero extension.
@@ -755,7 +973,7 @@ Instruction *WidenIV::WidenIVUse(Instruction *NarrowUse,
unsigned IVWidth = SE->getTypeSizeInBits(WideType);
if (CastWidth < IVWidth) {
// The cast isn't as wide as the IV, so insert a Trunc.
- IRBuilder<> Builder(NarrowUse);
+ IRBuilder<> Builder(NarrowDefUse);
NewDef = Builder.CreateTrunc(WideDef, NarrowUse->getType());
}
else {
@@ -775,23 +993,32 @@ Instruction *WidenIV::WidenIVUse(Instruction *NarrowUse,
NarrowUse->replaceAllUsesWith(NewDef);
DeadInsts.push_back(NarrowUse);
}
- // Now that the extend is gone, expose it's uses to IVUsers for potential
- // further simplification within SimplifyIVUsers.
- IU->AddUsersIfInteresting(WideDef, WidePhi);
+ // Now that the extend is gone, we want to expose it's uses for potential
+ // further simplification. We don't need to directly inform SimplifyIVUsers
+ // of the new users, because their parent IV will be processed later as a
+ // new loop phi. If we preserved IVUsers analysis, we would also want to
+ // push the uses of WideDef here.
// No further widening is needed. The deceased [sz]ext had done it for us.
return 0;
}
+
+ // Does this user itself evaluate to a recurrence after widening?
const SCEVAddRecExpr *WideAddRec = GetWideRecurrence(NarrowUse);
if (!WideAddRec) {
// This user does not evaluate to a recurence after widening, so don't
// follow it. Instead insert a Trunc to kill off the original use,
// eventually isolating the original narrow IV so it can be removed.
- IRBuilder<> Builder(NarrowUse);
+ IRBuilder<> Builder(NarrowDefUse);
Value *Trunc = Builder.CreateTrunc(WideDef, NarrowDef->getType());
NarrowUse->replaceUsesOfWith(NarrowDef, Trunc);
return 0;
}
+ // We assume that block terminators are not SCEVable. We wouldn't want to
+ // insert a Trunc after a terminator if there happens to be a critical edge.
+ assert(NarrowUse != NarrowUse->getParent()->getTerminator() &&
+ "SCEV is not expected to evaluate a block terminator");
+
// Reuse the IV increment that SCEVExpander created as long as it dominates
// NarrowUse.
Instruction *WideUse = 0;
@@ -803,11 +1030,11 @@ Instruction *WidenIV::WidenIVUse(Instruction *NarrowUse,
if (!WideUse)
return 0;
}
- // GetWideRecurrence ensured that the narrow expression could be extended
- // outside the loop without overflow. This suggests that the wide use
+ // Evaluation of WideAddRec ensured that the narrow expression could be
+ // extended outside the loop without overflow. This suggests that the wide use
// evaluates to the same expression as the extended narrow use, but doesn't
// absolutely guarantee it. Hence the following failsafe check. In rare cases
- // where it fails, we simple throw away the newly created wide use.
+ // where it fails, we simply throw away the newly created wide use.
if (WideAddRec != SE->getSCEV(WideUse)) {
DEBUG(dbgs() << "Wide use expression mismatch: " << *WideUse
<< ": " << *SE->getSCEV(WideUse) << " != " << *WideAddRec << "\n");
@@ -819,21 +1046,36 @@ Instruction *WidenIV::WidenIVUse(Instruction *NarrowUse,
return WideUse;
}
+/// pushNarrowIVUsers - Add eligible users of NarrowDef to NarrowIVUsers.
+///
+void WidenIV::pushNarrowIVUsers(Instruction *NarrowDef, Instruction *WideDef) {
+ for (Value::use_iterator UI = NarrowDef->use_begin(),
+ UE = NarrowDef->use_end(); UI != UE; ++UI) {
+ Use &U = UI.getUse();
+
+ // Handle data flow merges and bizarre phi cycles.
+ if (!Widened.insert(cast<Instruction>(U.getUser())))
+ continue;
+
+ NarrowIVUsers.push_back(std::make_pair(&UI.getUse(), WideDef));
+ }
+}
+
/// CreateWideIV - Process a single induction variable. First use the
/// SCEVExpander to create a wide induction variable that evaluates to the same
/// recurrence as the original narrow IV. Then use a worklist to forward
-/// traverse the narrow IV's def-use chain. After WidenIVUse as processed all
+/// traverse the narrow IV's def-use chain. After WidenIVUse has processed all
/// interesting IV users, the narrow IV will be isolated for removal by
/// DeleteDeadPHIs.
///
/// It would be simpler to delete uses as they are processed, but we must avoid
/// invalidating SCEV expressions.
///
-bool WidenIV::CreateWideIV(SCEVExpander &Rewriter) {
+PHINode *WidenIV::CreateWideIV(SCEVExpander &Rewriter) {
// Is this phi an induction variable?
const SCEVAddRecExpr *AddRec = dyn_cast<SCEVAddRecExpr>(SE->getSCEV(OrigPhi));
if (!AddRec)
- return false;
+ return NULL;
// Widen the induction variable expression.
const SCEV *WideIVExpr = IsSigned ?
@@ -846,9 +1088,9 @@ bool WidenIV::CreateWideIV(SCEVExpander &Rewriter) {
// Can the IV be extended outside the loop without overflow?
AddRec = dyn_cast<SCEVAddRecExpr>(WideIVExpr);
if (!AddRec || AddRec->getLoop() != L)
- return false;
+ return NULL;
- // An AddRec must have loop-invariant operands. Since this AddRec it
+ // An AddRec must have loop-invariant operands. Since this AddRec is
// materialized by a loop header phi, the expression cannot have any post-loop
// operands, so they must dominate the loop header.
assert(SE->properlyDominates(AddRec->getStart(), L->getHeader()) &&
@@ -876,39 +1118,37 @@ bool WidenIV::CreateWideIV(SCEVExpander &Rewriter) {
++NumWidened;
// Traverse the def-use chain using a worklist starting at the original IV.
- assert(Processed.empty() && "expect initial state" );
+ assert(Widened.empty() && NarrowIVUsers.empty() && "expect initial state" );
+
+ Widened.insert(OrigPhi);
+ pushNarrowIVUsers(OrigPhi, WidePhi);
- // Each worklist entry has a Narrow def-use link and Wide def.
- SmallVector<std::pair<Use *, Instruction *>, 8> NarrowIVUsers;
- for (Value::use_iterator UI = OrigPhi->use_begin(),
- UE = OrigPhi->use_end(); UI != UE; ++UI) {
- NarrowIVUsers.push_back(std::make_pair(&UI.getUse(), WidePhi));
- }
while (!NarrowIVUsers.empty()) {
- Use *NarrowDefUse;
+ Use *UsePtr;
Instruction *WideDef;
- tie(NarrowDefUse, WideDef) = NarrowIVUsers.pop_back_val();
+ tie(UsePtr, WideDef) = NarrowIVUsers.pop_back_val();
+ Use &NarrowDefUse = *UsePtr;
// Process a def-use edge. This may replace the use, so don't hold a
// use_iterator across it.
- Instruction *NarrowDef = cast<Instruction>(NarrowDefUse->get());
- Instruction *NarrowUse = cast<Instruction>(NarrowDefUse->getUser());
- Instruction *WideUse = WidenIVUse(NarrowUse, NarrowDef, WideDef);
+ Instruction *NarrowDef = cast<Instruction>(NarrowDefUse.get());
+ Instruction *WideUse = WidenIVUse(NarrowDefUse, NarrowDef, WideDef);
// Follow all def-use edges from the previous narrow use.
- if (WideUse) {
- for (Value::use_iterator UI = NarrowUse->use_begin(),
- UE = NarrowUse->use_end(); UI != UE; ++UI) {
- NarrowIVUsers.push_back(std::make_pair(&UI.getUse(), WideUse));
- }
- }
+ if (WideUse)
+ pushNarrowIVUsers(cast<Instruction>(NarrowDefUse.getUser()), WideUse);
+
// WidenIVUse may have removed the def-use edge.
if (NarrowDef->use_empty())
DeadInsts.push_back(NarrowDef);
}
- return true;
+ return WidePhi;
}
+//===----------------------------------------------------------------------===//
+// Simplification of IV users based on SCEV evaluation.
+//===----------------------------------------------------------------------===//
+
void IndVarSimplify::EliminateIVComparison(ICmpInst *ICmp, Value *IVOperand) {
unsigned IVOperIdx = 0;
ICmpInst::Predicate Pred = ICmp->getPredicate();
@@ -945,8 +1185,7 @@ void IndVarSimplify::EliminateIVComparison(ICmpInst *ICmp, Value *IVOperand) {
void IndVarSimplify::EliminateIVRemainder(BinaryOperator *Rem,
Value *IVOperand,
- bool IsSigned,
- PHINode *IVPhi) {
+ bool IsSigned) {
// We're only interested in the case where we know something about
// the numerator.
if (IVOperand != Rem->getOperand(0))
@@ -989,15 +1228,465 @@ void IndVarSimplify::EliminateIVRemainder(BinaryOperator *Rem,
}
// Inform IVUsers about the new users.
- if (Instruction *I = dyn_cast<Instruction>(Rem->getOperand(0)))
- IU->AddUsersIfInteresting(I, IVPhi);
-
+ if (IU) {
+ if (Instruction *I = dyn_cast<Instruction>(Rem->getOperand(0)))
+ IU->AddUsersIfInteresting(I);
+ }
DEBUG(dbgs() << "INDVARS: Simplified rem: " << *Rem << '\n');
++NumElimRem;
Changed = true;
DeadInsts.push_back(Rem);
}
+/// EliminateIVUser - Eliminate an operation that consumes a simple IV and has
+/// no observable side-effect given the range of IV values.
+bool IndVarSimplify::EliminateIVUser(Instruction *UseInst,
+ Instruction *IVOperand) {
+ if (ICmpInst *ICmp = dyn_cast<ICmpInst>(UseInst)) {
+ EliminateIVComparison(ICmp, IVOperand);
+ return true;
+ }
+ if (BinaryOperator *Rem = dyn_cast<BinaryOperator>(UseInst)) {
+ bool IsSigned = Rem->getOpcode() == Instruction::SRem;
+ if (IsSigned || Rem->getOpcode() == Instruction::URem) {
+ EliminateIVRemainder(Rem, IVOperand, IsSigned);
+ return true;
+ }
+ }
+
+ // Eliminate any operation that SCEV can prove is an identity function.
+ if (!SE->isSCEVable(UseInst->getType()) ||
+ (UseInst->getType() != IVOperand->getType()) ||
+ (SE->getSCEV(UseInst) != SE->getSCEV(IVOperand)))
+ return false;
+
+ DEBUG(dbgs() << "INDVARS: Eliminated identity: " << *UseInst << '\n');
+
+ UseInst->replaceAllUsesWith(IVOperand);
+ ++NumElimIdentity;
+ Changed = true;
+ DeadInsts.push_back(UseInst);
+ return true;
+}
+
+/// pushIVUsers - Add all uses of Def to the current IV's worklist.
+///
+static void pushIVUsers(
+ Instruction *Def,
+ SmallPtrSet<Instruction*,16> &Simplified,
+ SmallVectorImpl< std::pair<Instruction*,Instruction*> > &SimpleIVUsers) {
+
+ for (Value::use_iterator UI = Def->use_begin(), E = Def->use_end();
+ UI != E; ++UI) {
+ Instruction *User = cast<Instruction>(*UI);
+
+ // Avoid infinite or exponential worklist processing.
+ // Also ensure unique worklist users.
+ // If Def is a LoopPhi, it may not be in the Simplified set, so check for
+ // self edges first.
+ if (User != Def && Simplified.insert(User))
+ SimpleIVUsers.push_back(std::make_pair(User, Def));
+ }
+}
+
+/// isSimpleIVUser - Return true if this instruction generates a simple SCEV
+/// expression in terms of that IV.
+///
+/// This is similar to IVUsers' isInsteresting() but processes each instruction
+/// non-recursively when the operand is already known to be a simpleIVUser.
+///
+static bool isSimpleIVUser(Instruction *I, const Loop *L, ScalarEvolution *SE) {
+ if (!SE->isSCEVable(I->getType()))
+ return false;
+
+ // Get the symbolic expression for this instruction.
+ const SCEV *S = SE->getSCEV(I);
+
+ // We assume that terminators are not SCEVable.
+ assert((!S || I != I->getParent()->getTerminator()) &&
+ "can't fold terminators");
+
+ // Only consider affine recurrences.
+ const SCEVAddRecExpr *AR = dyn_cast<SCEVAddRecExpr>(S);
+ if (AR && AR->getLoop() == L)
+ return true;
+
+ return false;
+}
+
+/// SimplifyIVUsersNoRewrite - Iteratively perform simplification on a worklist
+/// of IV users. Each successive simplification may push more users which may
+/// themselves be candidates for simplification.
+///
+/// The "NoRewrite" algorithm does not require IVUsers analysis. Instead, it
+/// simplifies instructions in-place during analysis. Rather than rewriting
+/// induction variables bottom-up from their users, it transforms a chain of
+/// IVUsers top-down, updating the IR only when it encouters a clear
+/// optimization opportunitiy. A SCEVExpander "Rewriter" instance is still
+/// needed, but only used to generate a new IV (phi) of wider type for sign/zero
+/// extend elimination.
+///
+/// Once DisableIVRewrite is default, LSR will be the only client of IVUsers.
+///
+void IndVarSimplify::SimplifyIVUsersNoRewrite(Loop *L, SCEVExpander &Rewriter) {
+ std::map<PHINode *, WideIVInfo> WideIVMap;
+
+ SmallVector<PHINode*, 8> LoopPhis;
+ for (BasicBlock::iterator I = L->getHeader()->begin(); isa<PHINode>(I); ++I) {
+ LoopPhis.push_back(cast<PHINode>(I));
+ }
+ // Each round of simplification iterates through the SimplifyIVUsers worklist
+ // for all current phis, then determines whether any IVs can be
+ // widened. Widening adds new phis to LoopPhis, inducing another round of
+ // simplification on the wide IVs.
+ while (!LoopPhis.empty()) {
+ // Evaluate as many IV expressions as possible before widening any IVs. This
+ // forces SCEV to set no-wrap flags before evaluating sign/zero
+ // extension. The first time SCEV attempts to normalize sign/zero extension,
+ // the result becomes final. So for the most predictable results, we delay
+ // evaluation of sign/zero extend evaluation until needed, and avoid running
+ // other SCEV based analysis prior to SimplifyIVUsersNoRewrite.
+ do {
+ PHINode *CurrIV = LoopPhis.pop_back_val();
+
+ // Information about sign/zero extensions of CurrIV.
+ WideIVInfo WI;
+
+ // Instructions processed by SimplifyIVUsers for CurrIV.
+ SmallPtrSet<Instruction*,16> Simplified;
+
+ // Use-def pairs if IV users waiting to be processed for CurrIV.
+ SmallVector<std::pair<Instruction*, Instruction*>, 8> SimpleIVUsers;
+
+ // Push users of the current LoopPhi. In rare cases, pushIVUsers may be
+ // called multiple times for the same LoopPhi. This is the proper thing to
+ // do for loop header phis that use each other.
+ pushIVUsers(CurrIV, Simplified, SimpleIVUsers);
+
+ while (!SimpleIVUsers.empty()) {
+ Instruction *UseInst, *Operand;
+ tie(UseInst, Operand) = SimpleIVUsers.pop_back_val();
+ // Bypass back edges to avoid extra work.
+ if (UseInst == CurrIV) continue;
+
+ if (EliminateIVUser(UseInst, Operand)) {
+ pushIVUsers(Operand, Simplified, SimpleIVUsers);
+ continue;
+ }
+ if (CastInst *Cast = dyn_cast<CastInst>(UseInst)) {
+ bool IsSigned = Cast->getOpcode() == Instruction::SExt;
+ if (IsSigned || Cast->getOpcode() == Instruction::ZExt) {
+ CollectExtend(Cast, IsSigned, WI, SE, TD);
+ }
+ continue;
+ }
+ if (isSimpleIVUser(UseInst, L, SE)) {
+ pushIVUsers(UseInst, Simplified, SimpleIVUsers);
+ }
+ }
+ if (WI.WidestNativeType) {
+ WideIVMap[CurrIV] = WI;
+ }
+ } while(!LoopPhis.empty());
+
+ for (std::map<PHINode *, WideIVInfo>::const_iterator I = WideIVMap.begin(),
+ E = WideIVMap.end(); I != E; ++I) {
+ WidenIV Widener(I->first, I->second, LI, SE, DT, DeadInsts);
+ if (PHINode *WidePhi = Widener.CreateWideIV(Rewriter)) {
+ Changed = true;
+ LoopPhis.push_back(WidePhi);
+ }
+ }
+ WideIVMap.clear();
+ }
+}
+
+/// SimplifyCongruentIVs - Check for congruent phis in this loop header and
+/// populate ExprToIVMap for use later.
+///
+void IndVarSimplify::SimplifyCongruentIVs(Loop *L) {
+ DenseMap<const SCEV *, PHINode *> ExprToIVMap;
+ for (BasicBlock::iterator I = L->getHeader()->begin(); isa<PHINode>(I); ++I) {
+ PHINode *Phi = cast<PHINode>(I);
+ if (!SE->isSCEVable(Phi->getType()))
+ continue;
+
+ const SCEV *S = SE->getSCEV(Phi);
+ DenseMap<const SCEV *, PHINode *>::const_iterator Pos;
+ bool Inserted;
+ tie(Pos, Inserted) = ExprToIVMap.insert(std::make_pair(S, Phi));
+ if (Inserted)
+ continue;
+ PHINode *OrigPhi = Pos->second;
+ // Replacing the congruent phi is sufficient because acyclic redundancy
+ // elimination, CSE/GVN, should handle the rest. However, once SCEV proves
+ // that a phi is congruent, it's almost certain to be the head of an IV
+ // user cycle that is isomorphic with the original phi. So it's worth
+ // eagerly cleaning up the common case of a single IV increment.
+ if (BasicBlock *LatchBlock = L->getLoopLatch()) {
+ Instruction *OrigInc =
+ cast<Instruction>(OrigPhi->getIncomingValueForBlock(LatchBlock));
+ Instruction *IsomorphicInc =
+ cast<Instruction>(Phi->getIncomingValueForBlock(LatchBlock));
+ if (OrigInc != IsomorphicInc &&
+ SE->getSCEV(OrigInc) == SE->getSCEV(IsomorphicInc) &&
+ HoistStep(OrigInc, IsomorphicInc, DT)) {
+ DEBUG(dbgs() << "INDVARS: Eliminated congruent iv.inc: "
+ << *IsomorphicInc << '\n');
+ IsomorphicInc->replaceAllUsesWith(OrigInc);
+ DeadInsts.push_back(IsomorphicInc);
+ }
+ }
+ DEBUG(dbgs() << "INDVARS: Eliminated congruent iv: " << *Phi << '\n');
+ ++NumElimIV;
+ Phi->replaceAllUsesWith(OrigPhi);
+ DeadInsts.push_back(Phi);
+ }
+}
+
+//===----------------------------------------------------------------------===//
+// LinearFunctionTestReplace and its kin. Rewrite the loop exit condition.
+//===----------------------------------------------------------------------===//
+
+/// canExpandBackedgeTakenCount - Return true if this loop's backedge taken
+/// count expression can be safely and cheaply expanded into an instruction
+/// sequence that can be used by LinearFunctionTestReplace.
+static bool canExpandBackedgeTakenCount(Loop *L, ScalarEvolution *SE) {
+ const SCEV *BackedgeTakenCount = SE->getBackedgeTakenCount(L);
+ if (isa<SCEVCouldNotCompute>(BackedgeTakenCount) ||
+ BackedgeTakenCount->isZero())
+ return false;
+
+ if (!L->getExitingBlock())
+ return false;
+
+ // Can't rewrite non-branch yet.
+ BranchInst *BI = dyn_cast<BranchInst>(L->getExitingBlock()->getTerminator());
+ if (!BI)
+ return false;
+
+ // Special case: If the backedge-taken count is a UDiv, it's very likely a
+ // UDiv that ScalarEvolution produced in order to compute a precise
+ // expression, rather than a UDiv from the user's code. If we can't find a
+ // UDiv in the code with some simple searching, assume the former and forego
+ // rewriting the loop.
+ if (isa<SCEVUDivExpr>(BackedgeTakenCount)) {
+ ICmpInst *OrigCond = dyn_cast<ICmpInst>(BI->getCondition());
+ if (!OrigCond) return false;
+ const SCEV *R = SE->getSCEV(OrigCond->getOperand(1));
+ R = SE->getMinusSCEV(R, SE->getConstant(R->getType(), 1));
+ if (R != BackedgeTakenCount) {
+ const SCEV *L = SE->getSCEV(OrigCond->getOperand(0));
+ L = SE->getMinusSCEV(L, SE->getConstant(L->getType(), 1));
+ if (L != BackedgeTakenCount)
+ return false;
+ }
+ }
+ return true;
+}
+
+/// getBackedgeIVType - Get the widest type used by the loop test after peeking
+/// through Truncs.
+///
+/// TODO: Unnecessary if LFTR does not force a canonical IV.
+static const Type *getBackedgeIVType(Loop *L) {
+ if (!L->getExitingBlock())
+ return 0;
+
+ // Can't rewrite non-branch yet.
+ BranchInst *BI = dyn_cast<BranchInst>(L->getExitingBlock()->getTerminator());
+ if (!BI)
+ return 0;
+
+ ICmpInst *Cond = dyn_cast<ICmpInst>(BI->getCondition());
+ if (!Cond)
+ return 0;
+
+ const Type *Ty = 0;
+ for(User::op_iterator OI = Cond->op_begin(), OE = Cond->op_end();
+ OI != OE; ++OI) {
+ assert((!Ty || Ty == (*OI)->getType()) && "bad icmp operand types");
+ TruncInst *Trunc = dyn_cast<TruncInst>(*OI);
+ if (!Trunc)
+ continue;
+
+ return Trunc->getSrcTy();
+ }
+ return Ty;
+}
+
+/// LinearFunctionTestReplace - This method rewrites the exit condition of the
+/// loop to be a canonical != comparison against the incremented loop induction
+/// variable. This pass is able to rewrite the exit tests of any loop where the
+/// SCEV analysis can determine a loop-invariant trip count of the loop, which
+/// is actually a much broader range than just linear tests.
+ICmpInst *IndVarSimplify::
+LinearFunctionTestReplace(Loop *L,
+ const SCEV *BackedgeTakenCount,
+ PHINode *IndVar,
+ SCEVExpander &Rewriter) {
+ assert(canExpandBackedgeTakenCount(L, SE) && "precondition");
+ BranchInst *BI = cast<BranchInst>(L->getExitingBlock()->getTerminator());
+
+ // If the exiting block is not the same as the backedge block, we must compare
+ // against the preincremented value, otherwise we prefer to compare against
+ // the post-incremented value.
+ Value *CmpIndVar;
+ const SCEV *RHS = BackedgeTakenCount;
+ if (L->getExitingBlock() == L->getLoopLatch()) {
+ // Add one to the "backedge-taken" count to get the trip count.
+ // If this addition may overflow, we have to be more pessimistic and
+ // cast the induction variable before doing the add.
+ const SCEV *Zero = SE->getConstant(BackedgeTakenCount->getType(), 0);
+ const SCEV *N =
+ SE->getAddExpr(BackedgeTakenCount,
+ SE->getConstant(BackedgeTakenCount->getType(), 1));
+ if ((isa<SCEVConstant>(N) && !N->isZero()) ||
+ SE->isLoopEntryGuardedByCond(L, ICmpInst::ICMP_NE, N, Zero)) {
+ // No overflow. Cast the sum.
+ RHS = SE->getTruncateOrZeroExtend(N, IndVar->getType());
+ } else {
+ // Potential overflow. Cast before doing the add.
+ RHS = SE->getTruncateOrZeroExtend(BackedgeTakenCount,
+ IndVar->getType());
+ RHS = SE->getAddExpr(RHS,
+ SE->getConstant(IndVar->getType(), 1));
+ }
+
+ // The BackedgeTaken expression contains the number of times that the
+ // backedge branches to the loop header. This is one less than the
+ // number of times the loop executes, so use the incremented indvar.
+ CmpIndVar = IndVar->getIncomingValueForBlock(L->getExitingBlock());
+ } else {
+ // We have to use the preincremented value...
+ RHS = SE->getTruncateOrZeroExtend(BackedgeTakenCount,
+ IndVar->getType());
+ CmpIndVar = IndVar;
+ }
+
+ // Expand the code for the iteration count.
+ assert(SE->isLoopInvariant(RHS, L) &&
+ "Computed iteration count is not loop invariant!");
+ Value *ExitCnt = Rewriter.expandCodeFor(RHS, IndVar->getType(), BI);
+
+ // Insert a new icmp_ne or icmp_eq instruction before the branch.
+ ICmpInst::Predicate Opcode;
+ if (L->contains(BI->getSuccessor(0)))
+ Opcode = ICmpInst::ICMP_NE;
+ else
+ Opcode = ICmpInst::ICMP_EQ;
+
+ DEBUG(dbgs() << "INDVARS: Rewriting loop exit condition to:\n"
+ << " LHS:" << *CmpIndVar << '\n'
+ << " op:\t"
+ << (Opcode == ICmpInst::ICMP_NE ? "!=" : "==") << "\n"
+ << " RHS:\t" << *RHS << "\n");
+
+ ICmpInst *Cond = new ICmpInst(BI, Opcode, CmpIndVar, ExitCnt, "exitcond");
+ Cond->setDebugLoc(BI->getDebugLoc());
+ Value *OrigCond = BI->getCondition();
+ // It's tempting to use replaceAllUsesWith here to fully replace the old
+ // comparison, but that's not immediately safe, since users of the old
+ // comparison may not be dominated by the new comparison. Instead, just
+ // update the branch to use the new comparison; in the common case this
+ // will make old comparison dead.
+ BI->setCondition(Cond);
+ DeadInsts.push_back(OrigCond);
+
+ ++NumLFTR;
+ Changed = true;
+ return Cond;
+}
+
+//===----------------------------------------------------------------------===//
+// SinkUnusedInvariants. A late subpass to cleanup loop preheaders.
+//===----------------------------------------------------------------------===//
+
+/// If there's a single exit block, sink any loop-invariant values that
+/// were defined in the preheader but not used inside the loop into the
+/// exit block to reduce register pressure in the loop.
+void IndVarSimplify::SinkUnusedInvariants(Loop *L) {
+ BasicBlock *ExitBlock = L->getExitBlock();
+ if (!ExitBlock) return;
+
+ BasicBlock *Preheader = L->getLoopPreheader();
+ if (!Preheader) return;
+
+ Instruction *InsertPt = ExitBlock->getFirstNonPHI();
+ BasicBlock::iterator I = Preheader->getTerminator();
+ while (I != Preheader->begin()) {
+ --I;
+ // New instructions were inserted at the end of the preheader.
+ if (isa<PHINode>(I))
+ break;
+
+ // Don't move instructions which might have side effects, since the side
+ // effects need to complete before instructions inside the loop. Also don't
+ // move instructions which might read memory, since the loop may modify
+ // memory. Note that it's okay if the instruction might have undefined
+ // behavior: LoopSimplify guarantees that the preheader dominates the exit
+ // block.
+ if (I->mayHaveSideEffects() || I->mayReadFromMemory())
+ continue;
+
+ // Skip debug info intrinsics.
+ if (isa<DbgInfoIntrinsic>(I))
+ continue;
+
+ // Don't sink static AllocaInsts out of the entry block, which would
+ // turn them into dynamic allocas!
+ if (AllocaInst *AI = dyn_cast<AllocaInst>(I))
+ if (AI->isStaticAlloca())
+ continue;
+
+ // Determine if there is a use in or before the loop (direct or
+ // otherwise).
+ bool UsedInLoop = false;
+ for (Value::use_iterator UI = I->use_begin(), UE = I->use_end();
+ UI != UE; ++UI) {
+ User *U = *UI;
+ BasicBlock *UseBB = cast<Instruction>(U)->getParent();
+ if (PHINode *P = dyn_cast<PHINode>(U)) {
+ unsigned i =
+ PHINode::getIncomingValueNumForOperand(UI.getOperandNo());
+ UseBB = P->getIncomingBlock(i);
+ }
+ if (UseBB == Preheader || L->contains(UseBB)) {
+ UsedInLoop = true;
+ break;
+ }
+ }
+
+ // If there is, the def must remain in the preheader.
+ if (UsedInLoop)
+ continue;
+
+ // Otherwise, sink it to the exit block.
+ Instruction *ToMove = I;
+ bool Done = false;
+
+ if (I != Preheader->begin()) {
+ // Skip debug info intrinsics.
+ do {
+ --I;
+ } while (isa<DbgInfoIntrinsic>(I) && I != Preheader->begin());
+
+ if (isa<DbgInfoIntrinsic>(I) && I == Preheader->begin())
+ Done = true;
+ } else {
+ Done = true;
+ }
+
+ ToMove->moveBefore(InsertPt);
+ if (Done) break;
+ InsertPt = ToMove;
+ }
+}
+
+//===----------------------------------------------------------------------===//
+// IndVarSimplify driver. Manage several subpasses of IV simplification.
+//===----------------------------------------------------------------------===//
+
bool IndVarSimplify::runOnLoop(Loop *L, LPPassManager &LPM) {
// If LoopSimplify form is not available, stay out of trouble. Some notes:
// - LSR currently only supports LoopSimplify-form loops. Indvars'
@@ -1010,7 +1699,8 @@ bool IndVarSimplify::runOnLoop(Loop *L, LPPassManager &LPM) {
if (!L->isLoopSimplifyForm())
return false;
- IU = &getAnalysis<IVUsers>();
+ if (!DisableIVRewrite)
+ IU = &getAnalysis<IVUsers>();
LI = &getAnalysis<LoopInfo>();
SE = &getAnalysis<ScalarEvolution>();
DT = &getAnalysis<DominatorTree>();
@@ -1026,9 +1716,18 @@ bool IndVarSimplify::runOnLoop(Loop *L, LPPassManager &LPM) {
const SCEV *BackedgeTakenCount = SE->getBackedgeTakenCount(L);
// Create a rewriter object which we'll use to transform the code with.
- SCEVExpander Rewriter(*SE);
- if (DisableIVRewrite)
+ SCEVExpander Rewriter(*SE, "indvars");
+
+ // Eliminate redundant IV users.
+ //
+ // Simplification works best when run before other consumers of SCEV. We
+ // attempt to avoid evaluating SCEVs for sign/zero extend operations until
+ // other expressions involving loop IVs have been evaluated. This helps SCEV
+ // set no-wrap flags before normalizing sign/zero extension.
+ if (DisableIVRewrite) {
Rewriter.disableCanonicalMode();
+ SimplifyIVUsersNoRewrite(L, Rewriter);
+ }
// Check to see if this loop has a computable loop-invariant execution count.
// If so, this means that we can compute the final value of any expressions
@@ -1040,7 +1739,12 @@ bool IndVarSimplify::runOnLoop(Loop *L, LPPassManager &LPM) {
RewriteLoopExitValues(L, Rewriter);
// Eliminate redundant IV users.
- SimplifyIVUsers(Rewriter);
+ if (!DisableIVRewrite)
+ SimplifyIVUsers(Rewriter);
+
+ // Eliminate redundant IV cycles.
+ if (DisableIVRewrite)
+ SimplifyCongruentIVs(L);
// Compute the type of the largest recurrence expression, and decide whether
// a canonical induction variable should be inserted.
@@ -1119,8 +1823,18 @@ bool IndVarSimplify::runOnLoop(Loop *L, LPPassManager &LPM) {
"canonical IV disrupted BackedgeTaken expansion");
assert(NeedCannIV &&
"LinearFunctionTestReplace requires a canonical induction variable");
- NewICmp = LinearFunctionTestReplace(L, BackedgeTakenCount, IndVar,
- Rewriter);
+ // Check preconditions for proper SCEVExpander operation. SCEV does not
+ // express SCEVExpander's dependencies, such as LoopSimplify. Instead any
+ // pass that uses the SCEVExpander must do it. This does not work well for
+ // loop passes because SCEVExpander makes assumptions about all loops, while
+ // LoopPassManager only forces the current loop to be simplified.
+ //
+ // FIXME: SCEV expansion has no way to bail out, so the caller must
+ // explicitly check any assumptions made by SCEV. Brittle.
+ const SCEVAddRecExpr *AR = dyn_cast<SCEVAddRecExpr>(BackedgeTakenCount);
+ if (!AR || AR->getLoop()->getLoopPreheader())
+ NewICmp =
+ LinearFunctionTestReplace(L, BackedgeTakenCount, IndVar, Rewriter);
}
// Rewrite IV-derived expressions.
if (!DisableIVRewrite)
@@ -1146,9 +1860,8 @@ bool IndVarSimplify::runOnLoop(Loop *L, LPPassManager &LPM) {
// For completeness, inform IVUsers of the IV use in the newly-created
// loop exit test instruction.
- if (NewICmp)
- IU->AddUsersIfInteresting(cast<Instruction>(NewICmp->getOperand(0)),
- IndVar);
+ if (NewICmp && IU)
+ IU->AddUsersIfInteresting(cast<Instruction>(NewICmp->getOperand(0)));
// Clean up dead instructions.
Changed |= DeleteDeadPHIs(L->getHeader());
@@ -1156,428 +1869,3 @@ bool IndVarSimplify::runOnLoop(Loop *L, LPPassManager &LPM) {
assert(L->isLCSSAForm(*DT) && "Indvars did not leave the loop in lcssa form!");
return Changed;
}
-
-// FIXME: It is an extremely bad idea to indvar substitute anything more
-// complex than affine induction variables. Doing so will put expensive
-// polynomial evaluations inside of the loop, and the str reduction pass
-// currently can only reduce affine polynomials. For now just disable
-// indvar subst on anything more complex than an affine addrec, unless
-// it can be expanded to a trivial value.
-static bool isSafe(const SCEV *S, const Loop *L, ScalarEvolution *SE) {
- // Loop-invariant values are safe.
- if (SE->isLoopInvariant(S, L)) return true;
-
- // Affine addrecs are safe. Non-affine are not, because LSR doesn't know how
- // to transform them into efficient code.
- if (const SCEVAddRecExpr *AR = dyn_cast<SCEVAddRecExpr>(S))
- return AR->isAffine();
-
- // An add is safe it all its operands are safe.
- if (const SCEVCommutativeExpr *Commutative = dyn_cast<SCEVCommutativeExpr>(S)) {
- for (SCEVCommutativeExpr::op_iterator I = Commutative->op_begin(),
- E = Commutative->op_end(); I != E; ++I)
- if (!isSafe(*I, L, SE)) return false;
- return true;
- }
-
- // A cast is safe if its operand is.
- if (const SCEVCastExpr *C = dyn_cast<SCEVCastExpr>(S))
- return isSafe(C->getOperand(), L, SE);
-
- // A udiv is safe if its operands are.
- if (const SCEVUDivExpr *UD = dyn_cast<SCEVUDivExpr>(S))
- return isSafe(UD->getLHS(), L, SE) &&
- isSafe(UD->getRHS(), L, SE);
-
- // SCEVUnknown is always safe.
- if (isa<SCEVUnknown>(S))
- return true;
-
- // Nothing else is safe.
- return false;
-}
-
-void IndVarSimplify::RewriteIVExpressions(Loop *L, SCEVExpander &Rewriter) {
- // Rewrite all induction variable expressions in terms of the canonical
- // induction variable.
- //
- // If there were induction variables of other sizes or offsets, manually
- // add the offsets to the primary induction variable and cast, avoiding
- // the need for the code evaluation methods to insert induction variables
- // of different sizes.
- for (IVUsers::iterator UI = IU->begin(), E = IU->end(); UI != E; ++UI) {
- Value *Op = UI->getOperandValToReplace();
- const Type *UseTy = Op->getType();
- Instruction *User = UI->getUser();
-
- // Compute the final addrec to expand into code.
- const SCEV *AR = IU->getReplacementExpr(*UI);
-
- // Evaluate the expression out of the loop, if possible.
- if (!L->contains(UI->getUser())) {
- const SCEV *ExitVal = SE->getSCEVAtScope(AR, L->getParentLoop());
- if (SE->isLoopInvariant(ExitVal, L))
- AR = ExitVal;
- }
-
- // FIXME: It is an extremely bad idea to indvar substitute anything more
- // complex than affine induction variables. Doing so will put expensive
- // polynomial evaluations inside of the loop, and the str reduction pass
- // currently can only reduce affine polynomials. For now just disable
- // indvar subst on anything more complex than an affine addrec, unless
- // it can be expanded to a trivial value.
- if (!isSafe(AR, L, SE))
- continue;
-
- // Determine the insertion point for this user. By default, insert
- // immediately before the user. The SCEVExpander class will automatically
- // hoist loop invariants out of the loop. For PHI nodes, there may be
- // multiple uses, so compute the nearest common dominator for the
- // incoming blocks.
- Instruction *InsertPt = User;
- if (PHINode *PHI = dyn_cast<PHINode>(InsertPt))
- for (unsigned i = 0, e = PHI->getNumIncomingValues(); i != e; ++i)
- if (PHI->getIncomingValue(i) == Op) {
- if (InsertPt == User)
- InsertPt = PHI->getIncomingBlock(i)->getTerminator();
- else
- InsertPt =
- DT->findNearestCommonDominator(InsertPt->getParent(),
- PHI->getIncomingBlock(i))
- ->getTerminator();
- }
-
- // Now expand it into actual Instructions and patch it into place.
- Value *NewVal = Rewriter.expandCodeFor(AR, UseTy, InsertPt);
-
- DEBUG(dbgs() << "INDVARS: Rewrote IV '" << *AR << "' " << *Op << '\n'
- << " into = " << *NewVal << "\n");
-
- if (!isValidRewrite(Op, NewVal)) {
- DeadInsts.push_back(NewVal);
- continue;
- }
- // Inform ScalarEvolution that this value is changing. The change doesn't
- // affect its value, but it does potentially affect which use lists the
- // value will be on after the replacement, which affects ScalarEvolution's
- // ability to walk use lists and drop dangling pointers when a value is
- // deleted.
- SE->forgetValue(User);
-
- // Patch the new value into place.
- if (Op->hasName())
- NewVal->takeName(Op);
- User->replaceUsesOfWith(Op, NewVal);
- UI->setOperandValToReplace(NewVal);
-
- ++NumRemoved;
- Changed = true;
-
- // The old value may be dead now.
- DeadInsts.push_back(Op);
- }
-}
-
-/// If there's a single exit block, sink any loop-invariant values that
-/// were defined in the preheader but not used inside the loop into the
-/// exit block to reduce register pressure in the loop.
-void IndVarSimplify::SinkUnusedInvariants(Loop *L) {
- BasicBlock *ExitBlock = L->getExitBlock();
- if (!ExitBlock) return;
-
- BasicBlock *Preheader = L->getLoopPreheader();
- if (!Preheader) return;
-
- Instruction *InsertPt = ExitBlock->getFirstNonPHI();
- BasicBlock::iterator I = Preheader->getTerminator();
- while (I != Preheader->begin()) {
- --I;
- // New instructions were inserted at the end of the preheader.
- if (isa<PHINode>(I))
- break;
-
- // Don't move instructions which might have side effects, since the side
- // effects need to complete before instructions inside the loop. Also don't
- // move instructions which might read memory, since the loop may modify
- // memory. Note that it's okay if the instruction might have undefined
- // behavior: LoopSimplify guarantees that the preheader dominates the exit
- // block.
- if (I->mayHaveSideEffects() || I->mayReadFromMemory())
- continue;
-
- // Skip debug info intrinsics.
- if (isa<DbgInfoIntrinsic>(I))
- continue;
-
- // Don't sink static AllocaInsts out of the entry block, which would
- // turn them into dynamic allocas!
- if (AllocaInst *AI = dyn_cast<AllocaInst>(I))
- if (AI->isStaticAlloca())
- continue;
-
- // Determine if there is a use in or before the loop (direct or
- // otherwise).
- bool UsedInLoop = false;
- for (Value::use_iterator UI = I->use_begin(), UE = I->use_end();
- UI != UE; ++UI) {
- User *U = *UI;
- BasicBlock *UseBB = cast<Instruction>(U)->getParent();
- if (PHINode *P = dyn_cast<PHINode>(U)) {
- unsigned i =
- PHINode::getIncomingValueNumForOperand(UI.getOperandNo());
- UseBB = P->getIncomingBlock(i);
- }
- if (UseBB == Preheader || L->contains(UseBB)) {
- UsedInLoop = true;
- break;
- }
- }
-
- // If there is, the def must remain in the preheader.
- if (UsedInLoop)
- continue;
-
- // Otherwise, sink it to the exit block.
- Instruction *ToMove = I;
- bool Done = false;
-
- if (I != Preheader->begin()) {
- // Skip debug info intrinsics.
- do {
- --I;
- } while (isa<DbgInfoIntrinsic>(I) && I != Preheader->begin());
-
- if (isa<DbgInfoIntrinsic>(I) && I == Preheader->begin())
- Done = true;
- } else {
- Done = true;
- }
-
- ToMove->moveBefore(InsertPt);
- if (Done) break;
- InsertPt = ToMove;
- }
-}
-
-/// ConvertToSInt - Convert APF to an integer, if possible.
-static bool ConvertToSInt(const APFloat &APF, int64_t &IntVal) {
- bool isExact = false;
- if (&APF.getSemantics() == &APFloat::PPCDoubleDouble)
- return false;
- // See if we can convert this to an int64_t
- uint64_t UIntVal;
- if (APF.convertToInteger(&UIntVal, 64, true, APFloat::rmTowardZero,
- &isExact) != APFloat::opOK || !isExact)
- return false;
- IntVal = UIntVal;
- return true;
-}
-
-/// HandleFloatingPointIV - If the loop has floating induction variable
-/// then insert corresponding integer induction variable if possible.
-/// For example,
-/// for(double i = 0; i < 10000; ++i)
-/// bar(i)
-/// is converted into
-/// for(int i = 0; i < 10000; ++i)
-/// bar((double)i);
-///
-void IndVarSimplify::HandleFloatingPointIV(Loop *L, PHINode *PN) {
- unsigned IncomingEdge = L->contains(PN->getIncomingBlock(0));
- unsigned BackEdge = IncomingEdge^1;
-
- // Check incoming value.
- ConstantFP *InitValueVal =
- dyn_cast<ConstantFP>(PN->getIncomingValue(IncomingEdge));
-
- int64_t InitValue;
- if (!InitValueVal || !ConvertToSInt(InitValueVal->getValueAPF(), InitValue))
- return;
-
- // Check IV increment. Reject this PN if increment operation is not
- // an add or increment value can not be represented by an integer.
- BinaryOperator *Incr =
- dyn_cast<BinaryOperator>(PN->getIncomingValue(BackEdge));
- if (Incr == 0 || Incr->getOpcode() != Instruction::FAdd) return;
-
- // If this is not an add of the PHI with a constantfp, or if the constant fp
- // is not an integer, bail out.
- ConstantFP *IncValueVal = dyn_cast<ConstantFP>(Incr->getOperand(1));
- int64_t IncValue;
- if (IncValueVal == 0 || Incr->getOperand(0) != PN ||
- !ConvertToSInt(IncValueVal->getValueAPF(), IncValue))
- return;
-
- // Check Incr uses. One user is PN and the other user is an exit condition
- // used by the conditional terminator.
- Value::use_iterator IncrUse = Incr->use_begin();
- Instruction *U1 = cast<Instruction>(*IncrUse++);
- if (IncrUse == Incr->use_end()) return;
- Instruction *U2 = cast<Instruction>(*IncrUse++);
- if (IncrUse != Incr->use_end()) return;
-
- // Find exit condition, which is an fcmp. If it doesn't exist, or if it isn't
- // only used by a branch, we can't transform it.
- FCmpInst *Compare = dyn_cast<FCmpInst>(U1);
- if (!Compare)
- Compare = dyn_cast<FCmpInst>(U2);
- if (Compare == 0 || !Compare->hasOneUse() ||
- !isa<BranchInst>(Compare->use_back()))
- return;
-
- BranchInst *TheBr = cast<BranchInst>(Compare->use_back());
-
- // We need to verify that the branch actually controls the iteration count
- // of the loop. If not, the new IV can overflow and no one will notice.
- // The branch block must be in the loop and one of the successors must be out
- // of the loop.
- assert(TheBr->isConditional() && "Can't use fcmp if not conditional");
- if (!L->contains(TheBr->getParent()) ||
- (L->contains(TheBr->getSuccessor(0)) &&
- L->contains(TheBr->getSuccessor(1))))
- return;
-
-
- // If it isn't a comparison with an integer-as-fp (the exit value), we can't
- // transform it.
- ConstantFP *ExitValueVal = dyn_cast<ConstantFP>(Compare->getOperand(1));
- int64_t ExitValue;
- if (ExitValueVal == 0 ||
- !ConvertToSInt(ExitValueVal->getValueAPF(), ExitValue))
- return;
-
- // Find new predicate for integer comparison.
- CmpInst::Predicate NewPred = CmpInst::BAD_ICMP_PREDICATE;
- switch (Compare->getPredicate()) {
- default: return; // Unknown comparison.
- case CmpInst::FCMP_OEQ:
- case CmpInst::FCMP_UEQ: NewPred = CmpInst::ICMP_EQ; break;
- case CmpInst::FCMP_ONE:
- case CmpInst::FCMP_UNE: NewPred = CmpInst::ICMP_NE; break;
- case CmpInst::FCMP_OGT:
- case CmpInst::FCMP_UGT: NewPred = CmpInst::ICMP_SGT; break;
- case CmpInst::FCMP_OGE:
- case CmpInst::FCMP_UGE: NewPred = CmpInst::ICMP_SGE; break;
- case CmpInst::FCMP_OLT:
- case CmpInst::FCMP_ULT: NewPred = CmpInst::ICMP_SLT; break;
- case CmpInst::FCMP_OLE:
- case CmpInst::FCMP_ULE: NewPred = CmpInst::ICMP_SLE; break;
- }
-
- // We convert the floating point induction variable to a signed i32 value if
- // we can. This is only safe if the comparison will not overflow in a way
- // that won't be trapped by the integer equivalent operations. Check for this
- // now.
- // TODO: We could use i64 if it is native and the range requires it.
-
- // The start/stride/exit values must all fit in signed i32.
- if (!isInt<32>(InitValue) || !isInt<32>(IncValue) || !isInt<32>(ExitValue))
- return;
-
- // If not actually striding (add x, 0.0), avoid touching the code.
- if (IncValue == 0)
- return;
-
- // Positive and negative strides have different safety conditions.
- if (IncValue > 0) {
- // If we have a positive stride, we require the init to be less than the
- // exit value and an equality or less than comparison.
- if (InitValue >= ExitValue ||
- NewPred == CmpInst::ICMP_SGT || NewPred == CmpInst::ICMP_SGE)
- return;
-
- uint32_t Range = uint32_t(ExitValue-InitValue);
- if (NewPred == CmpInst::ICMP_SLE) {
- // Normalize SLE -> SLT, check for infinite loop.
- if (++Range == 0) return; // Range overflows.
- }
-
- unsigned Leftover = Range % uint32_t(IncValue);
-
- // If this is an equality comparison, we require that the strided value
- // exactly land on the exit value, otherwise the IV condition will wrap
- // around and do things the fp IV wouldn't.
- if ((NewPred == CmpInst::ICMP_EQ || NewPred == CmpInst::ICMP_NE) &&
- Leftover != 0)
- return;
-
- // If the stride would wrap around the i32 before exiting, we can't
- // transform the IV.
- if (Leftover != 0 && int32_t(ExitValue+IncValue) < ExitValue)
- return;
-
- } else {
- // If we have a negative stride, we require the init to be greater than the
- // exit value and an equality or greater than comparison.
- if (InitValue >= ExitValue ||
- NewPred == CmpInst::ICMP_SLT || NewPred == CmpInst::ICMP_SLE)
- return;
-
- uint32_t Range = uint32_t(InitValue-ExitValue);
- if (NewPred == CmpInst::ICMP_SGE) {
- // Normalize SGE -> SGT, check for infinite loop.
- if (++Range == 0) return; // Range overflows.
- }
-
- unsigned Leftover = Range % uint32_t(-IncValue);
-
- // If this is an equality comparison, we require that the strided value
- // exactly land on the exit value, otherwise the IV condition will wrap
- // around and do things the fp IV wouldn't.
- if ((NewPred == CmpInst::ICMP_EQ || NewPred == CmpInst::ICMP_NE) &&
- Leftover != 0)
- return;
-
- // If the stride would wrap around the i32 before exiting, we can't
- // transform the IV.
- if (Leftover != 0 && int32_t(ExitValue+IncValue) > ExitValue)
- return;
- }
-
- const IntegerType *Int32Ty = Type::getInt32Ty(PN->getContext());
-
- // Insert new integer induction variable.
- PHINode *NewPHI = PHINode::Create(Int32Ty, 2, PN->getName()+".int", PN);
- NewPHI->addIncoming(ConstantInt::get(Int32Ty, InitValue),
- PN->getIncomingBlock(IncomingEdge));
-
- Value *NewAdd =
- BinaryOperator::CreateAdd(NewPHI, ConstantInt::get(Int32Ty, IncValue),
- Incr->getName()+".int", Incr);
- NewPHI->addIncoming(NewAdd, PN->getIncomingBlock(BackEdge));
-
- ICmpInst *NewCompare = new ICmpInst(TheBr, NewPred, NewAdd,
- ConstantInt::get(Int32Ty, ExitValue),
- Compare->getName());
-
- // In the following deletions, PN may become dead and may be deleted.
- // Use a WeakVH to observe whether this happens.
- WeakVH WeakPH = PN;
-
- // Delete the old floating point exit comparison. The branch starts using the
- // new comparison.
- NewCompare->takeName(Compare);
- Compare->replaceAllUsesWith(NewCompare);
- RecursivelyDeleteTriviallyDeadInstructions(Compare);
-
- // Delete the old floating point increment.
- Incr->replaceAllUsesWith(UndefValue::get(Incr->getType()));
- RecursivelyDeleteTriviallyDeadInstructions(Incr);
-
- // If the FP induction variable still has uses, this is because something else
- // in the loop uses its value. In order to canonicalize the induction
- // variable, we chose to eliminate the IV and rewrite it in terms of an
- // int->fp cast.
- //
- // We give preference to sitofp over uitofp because it is faster on most
- // platforms.
- if (WeakPH) {
- Value *Conv = new SIToFPInst(NewPHI, PN->getType(), "indvar.conv",
- PN->getParent()->getFirstNonPHI());
- PN->replaceAllUsesWith(Conv);
- RecursivelyDeleteTriviallyDeadInstructions(PN);
- }
-
- // Add a new IVUsers entry for the newly-created integer PHI.
- IU->AddUsersIfInteresting(NewPHI, NewPHI);
-}
diff --git a/contrib/llvm/lib/Transforms/Scalar/JumpThreading.cpp b/contrib/llvm/lib/Transforms/Scalar/JumpThreading.cpp
index cf18ff0..b500d5b 100644
--- a/contrib/llvm/lib/Transforms/Scalar/JumpThreading.cpp
+++ b/contrib/llvm/lib/Transforms/Scalar/JumpThreading.cpp
@@ -600,8 +600,10 @@ static unsigned GetBestDestForJumpOnUndef(BasicBlock *BB) {
for (unsigned i = 1, e = BBTerm->getNumSuccessors(); i != e; ++i) {
TestBB = BBTerm->getSuccessor(i);
unsigned NumPreds = std::distance(pred_begin(TestBB), pred_end(TestBB));
- if (NumPreds < MinNumPreds)
+ if (NumPreds < MinNumPreds) {
MinSucc = i;
+ MinNumPreds = NumPreds;
+ }
}
return MinSucc;
diff --git a/contrib/llvm/lib/Transforms/Scalar/LICM.cpp b/contrib/llvm/lib/Transforms/Scalar/LICM.cpp
index 13bd022..66add6c 100644
--- a/contrib/llvm/lib/Transforms/Scalar/LICM.cpp
+++ b/contrib/llvm/lib/Transforms/Scalar/LICM.cpp
@@ -178,7 +178,7 @@ INITIALIZE_PASS_END(LICM, "licm", "Loop Invariant Code Motion", false, false)
Pass *llvm::createLICMPass() { return new LICM(); }
/// Hoist expressions out of the specified loop. Note, alias info for inner
-/// loop is not preserved so it is not a good idea to run LICM multiple
+/// loop is not preserved so it is not a good idea to run LICM multiple
/// times on one loop.
///
bool LICM::runOnLoop(Loop *L, LPPassManager &LPM) {
@@ -199,13 +199,13 @@ bool LICM::runOnLoop(Loop *L, LPPassManager &LPM) {
// What if InnerLoop was modified by other passes ?
CurAST->add(*InnerAST);
-
+
// Once we've incorporated the inner loop's AST into ours, we don't need the
// subloop's anymore.
delete InnerAST;
LoopToAliasSetMap.erase(InnerL);
}
-
+
CurLoop = L;
// Get the preheader block to move instructions into...
@@ -245,7 +245,7 @@ bool LICM::runOnLoop(Loop *L, LPPassManager &LPM) {
I != E; ++I)
PromoteAliasSet(*I);
}
-
+
// Clear out loops state information for the next iteration
CurLoop = 0;
Preheader = 0;
@@ -283,7 +283,7 @@ void LICM::SinkRegion(DomTreeNode *N) {
for (BasicBlock::iterator II = BB->end(); II != BB->begin(); ) {
Instruction &I = *--II;
-
+
// If the instruction is dead, we would try to sink it because it isn't used
// in the loop, instead, just delete it.
if (isInstructionTriviallyDead(&I)) {
@@ -336,7 +336,7 @@ void LICM::HoistRegion(DomTreeNode *N) {
I.eraseFromParent();
continue;
}
-
+
// Try hoisting the instruction out to the preheader. We can only do this
// if all of the operands of the instruction are loop invariant and if it
// is safe to hoist the instruction.
@@ -364,7 +364,7 @@ bool LICM::canSinkOrHoistInst(Instruction &I) {
// in the same alias set as something that ends up being modified.
if (AA->pointsToConstantMemory(LI->getOperand(0)))
return true;
-
+
// Don't hoist loads which have may-aliased stores in loop.
uint64_t Size = 0;
if (LI->getType()->isSized())
@@ -470,7 +470,7 @@ void LICM::sink(Instruction &I) {
}
return;
}
-
+
if (ExitBlocks.empty()) {
// The instruction is actually dead if there ARE NO exit blocks.
CurAST->deleteValue(&I);
@@ -482,30 +482,30 @@ void LICM::sink(Instruction &I) {
I.eraseFromParent();
return;
}
-
+
// Otherwise, if we have multiple exits, use the SSAUpdater to do all of the
// hard work of inserting PHI nodes as necessary.
SmallVector<PHINode*, 8> NewPHIs;
SSAUpdater SSA(&NewPHIs);
-
+
if (!I.use_empty())
SSA.Initialize(I.getType(), I.getName());
-
+
// Insert a copy of the instruction in each exit block of the loop that is
// dominated by the instruction. Each exit block is known to only be in the
// ExitBlocks list once.
BasicBlock *InstOrigBB = I.getParent();
unsigned NumInserted = 0;
-
+
for (unsigned i = 0, e = ExitBlocks.size(); i != e; ++i) {
BasicBlock *ExitBlock = ExitBlocks[i];
-
+
if (!DT->dominates(InstOrigBB, ExitBlock))
continue;
-
+
// Insert the code after the last PHI node.
BasicBlock::iterator InsertPt = ExitBlock->getFirstNonPHI();
-
+
// If this is the first exit block processed, just move the original
// instruction, otherwise clone the original instruction and insert
// the copy.
@@ -519,12 +519,12 @@ void LICM::sink(Instruction &I) {
New->setName(I.getName()+".le");
ExitBlock->getInstList().insert(InsertPt, New);
}
-
+
// Now that we have inserted the instruction, inform SSAUpdater.
if (!I.use_empty())
SSA.AddAvailableValue(ExitBlock, New);
}
-
+
// If the instruction doesn't dominate any exit blocks, it must be dead.
if (NumInserted == 0) {
CurAST->deleteValue(&I);
@@ -533,7 +533,7 @@ void LICM::sink(Instruction &I) {
I.eraseFromParent();
return;
}
-
+
// Next, rewrite uses of the instruction, inserting PHI nodes as needed.
for (Value::use_iterator UI = I.use_begin(), UE = I.use_end(); UI != UE; ) {
// Grab the use before incrementing the iterator.
@@ -542,12 +542,12 @@ void LICM::sink(Instruction &I) {
++UI;
SSA.RewriteUseAfterInsertions(U);
}
-
+
// Update CurAST for NewPHIs if I had pointer type.
if (I.getType()->isPointerTy())
for (unsigned i = 0, e = NewPHIs.size(); i != e; ++i)
CurAST->copyValue(&I, NewPHIs[i]);
-
+
// Finally, remove the instruction from CurAST. It is no longer in the loop.
CurAST->deleteValue(&I);
}
@@ -606,15 +606,17 @@ namespace {
SmallVectorImpl<BasicBlock*> &LoopExitBlocks;
AliasSetTracker &AST;
DebugLoc DL;
+ int Alignment;
public:
LoopPromoter(Value *SP,
const SmallVectorImpl<Instruction*> &Insts, SSAUpdater &S,
SmallPtrSet<Value*, 4> &PMA,
SmallVectorImpl<BasicBlock*> &LEB, AliasSetTracker &ast,
- DebugLoc dl)
- : LoadAndStorePromoter(Insts, S, 0, 0), SomePtr(SP),
- PointerMustAliases(PMA), LoopExitBlocks(LEB), AST(ast), DL(dl) {}
-
+ DebugLoc dl, int alignment)
+ : LoadAndStorePromoter(Insts, S), SomePtr(SP),
+ PointerMustAliases(PMA), LoopExitBlocks(LEB), AST(ast), DL(dl),
+ Alignment(alignment) {}
+
virtual bool isInstInList(Instruction *I,
const SmallVectorImpl<Instruction*> &) const {
Value *Ptr;
@@ -624,7 +626,7 @@ namespace {
Ptr = cast<StoreInst>(I)->getPointerOperand();
return PointerMustAliases.count(Ptr);
}
-
+
virtual void doExtraRewritesBeforeFinalDeletion() const {
// Insert stores after in the loop exit blocks. Each exit block gets a
// store of the live-out values that feed them. Since we've already told
@@ -635,6 +637,7 @@ namespace {
Value *LiveInValue = SSA.GetValueInMiddleOfBlock(ExitBlock);
Instruction *InsertPos = ExitBlock->getFirstNonPHI();
StoreInst *NewSI = new StoreInst(LiveInValue, SomePtr, InsertPos);
+ NewSI->setAlignment(Alignment);
NewSI->setDebugLoc(DL);
}
}
@@ -661,7 +664,7 @@ void LICM::PromoteAliasSet(AliasSet &AS) {
if (AS.isForwardingAliasSet() || !AS.isMod() || !AS.isMustAlias() ||
AS.isVolatile() || !CurLoop->isLoopInvariant(AS.begin()->getValue()))
return;
-
+
assert(!AS.empty() &&
"Must alias set should have at least one pointer element in it!");
Value *SomePtr = AS.begin()->getValue();
@@ -676,60 +679,78 @@ void LICM::PromoteAliasSet(AliasSet &AS) {
// tmp = *P; for () { if (c) tmp +=1; } *P = tmp;
//
// is not safe, because *P may only be valid to access if 'c' is true.
- //
+ //
// It is safe to promote P if all uses are direct load/stores and if at
// least one is guaranteed to be executed.
bool GuaranteedToExecute = false;
-
+
SmallVector<Instruction*, 64> LoopUses;
SmallPtrSet<Value*, 4> PointerMustAliases;
+ // We start with an alignment of one and try to find instructions that allow
+ // us to prove better alignment.
+ unsigned Alignment = 1;
+
// Check that all of the pointers in the alias set have the same type. We
// cannot (yet) promote a memory location that is loaded and stored in
// different sizes.
for (AliasSet::iterator ASI = AS.begin(), E = AS.end(); ASI != E; ++ASI) {
Value *ASIV = ASI->getValue();
PointerMustAliases.insert(ASIV);
-
+
// Check that all of the pointers in the alias set have the same type. We
// cannot (yet) promote a memory location that is loaded and stored in
// different sizes.
if (SomePtr->getType() != ASIV->getType())
return;
-
+
for (Value::use_iterator UI = ASIV->use_begin(), UE = ASIV->use_end();
UI != UE; ++UI) {
// Ignore instructions that are outside the loop.
Instruction *Use = dyn_cast<Instruction>(*UI);
if (!Use || !CurLoop->contains(Use))
continue;
-
+
// If there is an non-load/store instruction in the loop, we can't promote
// it.
- if (isa<LoadInst>(Use))
+ unsigned InstAlignment;
+ if (LoadInst *load = dyn_cast<LoadInst>(Use)) {
assert(!cast<LoadInst>(Use)->isVolatile() && "AST broken");
- else if (isa<StoreInst>(Use)) {
+ InstAlignment = load->getAlignment();
+ } else if (StoreInst *store = dyn_cast<StoreInst>(Use)) {
// Stores *of* the pointer are not interesting, only stores *to* the
// pointer.
if (Use->getOperand(1) != ASIV)
continue;
+ InstAlignment = store->getAlignment();
assert(!cast<StoreInst>(Use)->isVolatile() && "AST broken");
} else
return; // Not a load or store.
-
+
+ // If the alignment of this instruction allows us to specify a more
+ // restrictive (and performant) alignment and if we are sure this
+ // instruction will be executed, update the alignment.
+ // Larger is better, with the exception of 0 being the best alignment.
+ if ((InstAlignment > Alignment || InstAlignment == 0)
+ && (Alignment != 0))
+ if (isSafeToExecuteUnconditionally(*Use)) {
+ GuaranteedToExecute = true;
+ Alignment = InstAlignment;
+ }
+
if (!GuaranteedToExecute)
GuaranteedToExecute = isSafeToExecuteUnconditionally(*Use);
-
+
LoopUses.push_back(Use);
}
}
-
+
// If there isn't a guaranteed-to-execute instruction, we can't promote.
if (!GuaranteedToExecute)
return;
-
+
// Otherwise, this is safe to promote, lets do it!
- DEBUG(dbgs() << "LICM: Promoting value stored to in loop: " <<*SomePtr<<'\n');
+ DEBUG(dbgs() << "LICM: Promoting value stored to in loop: " <<*SomePtr<<'\n');
Changed = true;
++NumPromoted;
@@ -741,18 +762,19 @@ void LICM::PromoteAliasSet(AliasSet &AS) {
SmallVector<BasicBlock*, 8> ExitBlocks;
CurLoop->getUniqueExitBlocks(ExitBlocks);
-
+
// We use the SSAUpdater interface to insert phi nodes as required.
SmallVector<PHINode*, 16> NewPHIs;
SSAUpdater SSA(&NewPHIs);
LoopPromoter Promoter(SomePtr, LoopUses, SSA, PointerMustAliases, ExitBlocks,
- *CurAST, DL);
-
+ *CurAST, DL, Alignment);
+
// Set up the preheader to have a definition of the value. It is the live-out
// value from the preheader that uses in the loop will use.
LoadInst *PreheaderLoad =
new LoadInst(SomePtr, SomePtr->getName()+".promoted",
Preheader->getTerminator());
+ PreheaderLoad->setAlignment(Alignment);
PreheaderLoad->setDebugLoc(DL);
SSA.AddAvailableValue(Preheader, PreheaderLoad);
diff --git a/contrib/llvm/lib/Transforms/Scalar/LoopDeletion.cpp b/contrib/llvm/lib/Transforms/Scalar/LoopDeletion.cpp
index 753a558..f7f3298 100644
--- a/contrib/llvm/lib/Transforms/Scalar/LoopDeletion.cpp
+++ b/contrib/llvm/lib/Transforms/Scalar/LoopDeletion.cpp
@@ -190,7 +190,9 @@ bool LoopDeletion::runOnLoop(Loop* L, LPPassManager& LPM) {
BasicBlock* exitingBlock = exitingBlocks[0];
BasicBlock::iterator BI = exitBlock->begin();
while (PHINode* P = dyn_cast<PHINode>(BI)) {
- P->replaceUsesOfWith(exitingBlock, preheader);
+ int j = P->getBasicBlockIndex(exitingBlock);
+ assert(j >= 0 && "Can't find exiting block in exit block's phi node!");
+ P->setIncomingBlock(j, preheader);
for (unsigned i = 1; i < exitingBlocks.size(); ++i)
P->removeIncomingValue(exitingBlocks[i]);
++BI;
diff --git a/contrib/llvm/lib/Transforms/Scalar/LoopIdiomRecognize.cpp b/contrib/llvm/lib/Transforms/Scalar/LoopIdiomRecognize.cpp
index dbf6eec..a0e41d9 100644
--- a/contrib/llvm/lib/Transforms/Scalar/LoopIdiomRecognize.cpp
+++ b/contrib/llvm/lib/Transforms/Scalar/LoopIdiomRecognize.cpp
@@ -167,12 +167,17 @@ static void deleteDeadInstruction(Instruction *I, ScalarEvolution &SE) {
static void deleteIfDeadInstruction(Value *V, ScalarEvolution &SE) {
if (Instruction *I = dyn_cast<Instruction>(V))
if (isInstructionTriviallyDead(I))
- deleteDeadInstruction(I, SE);
+ deleteDeadInstruction(I, SE);
}
bool LoopIdiomRecognize::runOnLoop(Loop *L, LPPassManager &LPM) {
CurLoop = L;
+ // Disable loop idiom recognition if the function's name is a common idiom.
+ StringRef Name = L->getHeader()->getParent()->getName();
+ if (Name == "memset" || Name == "memcpy")
+ return false;
+
// The trip count of the loop must be analyzable.
SE = &getAnalysis<ScalarEvolution>();
if (!SE->hasLoopInvariantBackedgeTakenCount(L))
@@ -467,8 +472,8 @@ processLoopStridedStore(Value *DestPtr, unsigned StoreSize,
// header. This allows us to insert code for it in the preheader.
BasicBlock *Preheader = CurLoop->getLoopPreheader();
IRBuilder<> Builder(Preheader->getTerminator());
- SCEVExpander Expander(*SE);
-
+ SCEVExpander Expander(*SE, "loop-idiom");
+
// Okay, we have a strided store "p[i]" of a splattable value. We can turn
// this into a memset in the loop preheader now if we want. However, this
// would be unsafe to do if there is anything else in the loop that may read
@@ -488,7 +493,7 @@ processLoopStridedStore(Value *DestPtr, unsigned StoreSize,
deleteIfDeadInstruction(BasePtr, *SE);
return false;
}
-
+
// Okay, everything looks good, insert the memset.
// The # stored bytes is (BECount+1)*Size. Expand the trip count out to
@@ -556,8 +561,8 @@ processLoopStoreOfLoopLoad(StoreInst *SI, unsigned StoreSize,
// header. This allows us to insert code for it in the preheader.
BasicBlock *Preheader = CurLoop->getLoopPreheader();
IRBuilder<> Builder(Preheader->getTerminator());
- SCEVExpander Expander(*SE);
-
+ SCEVExpander Expander(*SE, "loop-idiom");
+
// Okay, we have a strided store "p[i]" of a loaded value. We can turn
// this into a memcpy in the loop preheader now if we want. However, this
// would be unsafe to do if there is anything else in the loop that may read
@@ -568,7 +573,7 @@ processLoopStoreOfLoopLoad(StoreInst *SI, unsigned StoreSize,
Expander.expandCodeFor(StoreEv->getStart(),
Builder.getInt8PtrTy(SI->getPointerAddressSpace()),
Preheader->getTerminator());
-
+
if (mayLoopAccessLocation(StoreBasePtr, AliasAnalysis::ModRef,
CurLoop, BECount, StoreSize,
getAnalysis<AliasAnalysis>(), SI)) {
@@ -593,9 +598,9 @@ processLoopStoreOfLoopLoad(StoreInst *SI, unsigned StoreSize,
deleteIfDeadInstruction(StoreBasePtr, *SE);
return false;
}
-
+
// Okay, everything is safe, we can transform this!
-
+
// The # stored bytes is (BECount+1)*Size. Expand the trip count out to
// pointer size if it isn't already.
@@ -619,7 +624,7 @@ processLoopStoreOfLoopLoad(StoreInst *SI, unsigned StoreSize,
DEBUG(dbgs() << " Formed memcpy: " << *NewCall << "\n"
<< " from load ptr=" << *LoadEv << " at: " << *LI << "\n"
<< " from store ptr=" << *StoreEv << " at: " << *SI << "\n");
-
+
// Okay, the memset has been formed. Zap the original store and anything that
// feeds into it.
diff --git a/contrib/llvm/lib/Transforms/Scalar/LoopRotation.cpp b/contrib/llvm/lib/Transforms/Scalar/LoopRotation.cpp
index 47dced3..9fd0958 100644
--- a/contrib/llvm/lib/Transforms/Scalar/LoopRotation.cpp
+++ b/contrib/llvm/lib/Transforms/Scalar/LoopRotation.cpp
@@ -220,7 +220,7 @@ bool LoopRotate::rotateLoop(Loop *L) {
// For PHI nodes, the value available in OldPreHeader is just the
// incoming value from OldPreHeader.
for (; PHINode *PN = dyn_cast<PHINode>(I); ++I)
- ValueMap[PN] = PN->getIncomingValue(PN->getBasicBlockIndex(OrigPreheader));
+ ValueMap[PN] = PN->getIncomingValueForBlock(OrigPreheader);
// For the rest of the instructions, either hoist to the OrigPreheader if
// possible or create a clone in the OldPreHeader if not.
diff --git a/contrib/llvm/lib/Transforms/Scalar/LoopStrengthReduce.cpp b/contrib/llvm/lib/Transforms/Scalar/LoopStrengthReduce.cpp
index 73ebd61..509d026 100644
--- a/contrib/llvm/lib/Transforms/Scalar/LoopStrengthReduce.cpp
+++ b/contrib/llvm/lib/Transforms/Scalar/LoopStrengthReduce.cpp
@@ -1804,8 +1804,7 @@ LSRInstance::OptimizeLoopTermCond() {
ExitingBlock->getInstList().insert(TermBr, Cond);
// Clone the IVUse, as the old use still exists!
- CondUse = &IU.AddUser(Cond, CondUse->getOperandValToReplace(),
- CondUse->getPhi());
+ CondUse = &IU.AddUser(Cond, CondUse->getOperandValToReplace());
TermBr->replaceUsesOfWith(OldCond, Cond);
}
}
@@ -2768,7 +2767,7 @@ void LSRInstance::GenerateCrossUseConstantOffsets() {
// value to the immediate would produce a value closer to zero than the
// immediate itself, then the formula isn't worthwhile.
if (const SCEVConstant *C = dyn_cast<SCEVConstant>(NewF.ScaledReg))
- if (C->getValue()->getValue().isNegative() !=
+ if (C->getValue()->isNegative() !=
(NewF.AM.BaseOffs < 0) &&
(C->getValue()->getValue().abs() * APInt(BitWidth, F.AM.Scale))
.ule(abs64(NewF.AM.BaseOffs)))
@@ -3699,7 +3698,7 @@ LSRInstance::ImplementSolution(const SmallVectorImpl<const Formula *> &Solution,
// we can remove them after we are done working.
SmallVector<WeakVH, 16> DeadInsts;
- SCEVExpander Rewriter(SE);
+ SCEVExpander Rewriter(SE, "lsr");
Rewriter.disableCanonicalMode();
Rewriter.setIVIncInsertPos(L, IVIncInsertPos);
diff --git a/contrib/llvm/lib/Transforms/Scalar/LoopUnswitch.cpp b/contrib/llvm/lib/Transforms/Scalar/LoopUnswitch.cpp
index e05f29c..840c4b6 100644
--- a/contrib/llvm/lib/Transforms/Scalar/LoopUnswitch.cpp
+++ b/contrib/llvm/lib/Transforms/Scalar/LoopUnswitch.cpp
@@ -1021,6 +1021,10 @@ void LoopUnswitch::SimplifyCode(std::vector<Instruction*> &Worklist, Loop *L) {
while (PHINode *PN = dyn_cast<PHINode>(Succ->begin()))
ReplaceUsesOfWith(PN, PN->getIncomingValue(0), Worklist, L, LPM);
+ // If Succ has any successors with PHI nodes, update them to have
+ // entries coming from Pred instead of Succ.
+ Succ->replaceAllUsesWith(Pred);
+
// Move all of the successor contents from Succ to Pred.
Pred->getInstList().splice(BI, Succ->getInstList(), Succ->begin(),
Succ->end());
@@ -1028,10 +1032,6 @@ void LoopUnswitch::SimplifyCode(std::vector<Instruction*> &Worklist, Loop *L) {
BI->eraseFromParent();
RemoveFromWorklist(BI, Worklist);
- // If Succ has any successors with PHI nodes, update them to have
- // entries coming from Pred instead of Succ.
- Succ->replaceAllUsesWith(Pred);
-
// Remove Succ from the loop tree.
LI->removeBlock(Succ);
LPM->deleteSimpleAnalysisValue(Succ, L);
diff --git a/contrib/llvm/lib/Transforms/Scalar/MemCpyOptimizer.cpp b/contrib/llvm/lib/Transforms/Scalar/MemCpyOptimizer.cpp
index be5aa2e..7ed3db6 100644
--- a/contrib/llvm/lib/Transforms/Scalar/MemCpyOptimizer.cpp
+++ b/contrib/llvm/lib/Transforms/Scalar/MemCpyOptimizer.cpp
@@ -487,7 +487,8 @@ bool MemCpyOpt::processStore(StoreInst *SI, BasicBlock::iterator &BBI) {
// happen to be using a load-store pair to implement it, rather than
// a memcpy.
if (LoadInst *LI = dyn_cast<LoadInst>(SI->getOperand(0))) {
- if (!LI->isVolatile() && LI->hasOneUse()) {
+ if (!LI->isVolatile() && LI->hasOneUse() &&
+ LI->getParent() == SI->getParent()) {
MemDepResult ldep = MD->getDependency(LI);
CallInst *C = 0;
if (ldep.isClobber() && !isa<MemCpyInst>(ldep.getInst()))
@@ -496,17 +497,14 @@ bool MemCpyOpt::processStore(StoreInst *SI, BasicBlock::iterator &BBI) {
if (C) {
// Check that nothing touches the dest of the "copy" between
// the call and the store.
- MemDepResult sdep = MD->getDependency(SI);
- if (!sdep.isNonLocal()) {
- bool FoundCall = false;
- for (BasicBlock::iterator I = SI, E = sdep.getInst(); I != E; --I) {
- if (&*I == C) {
- FoundCall = true;
- break;
- }
- }
- if (!FoundCall)
+ AliasAnalysis &AA = getAnalysis<AliasAnalysis>();
+ AliasAnalysis::Location StoreLoc = AA.getLocation(SI);
+ for (BasicBlock::iterator I = --BasicBlock::iterator(SI),
+ E = C; I != E; --I) {
+ if (AA.getModRefInfo(&*I, StoreLoc) != AliasAnalysis::NoModRef) {
C = 0;
+ break;
+ }
}
}
@@ -842,11 +840,11 @@ bool MemCpyOpt::processMemMove(MemMoveInst *M) {
// If not, then we know we can transform this.
Module *Mod = M->getParent()->getParent()->getParent();
- const Type *ArgTys[3] = { M->getRawDest()->getType(),
- M->getRawSource()->getType(),
- M->getLength()->getType() };
+ Type *ArgTys[3] = { M->getRawDest()->getType(),
+ M->getRawSource()->getType(),
+ M->getLength()->getType() };
M->setCalledFunction(Intrinsic::getDeclaration(Mod, Intrinsic::memcpy,
- ArgTys, 3));
+ ArgTys));
// MemDep may have over conservative information about this instruction, just
// conservatively flush it from the cache.
diff --git a/contrib/llvm/lib/Transforms/Scalar/ObjCARC.cpp b/contrib/llvm/lib/Transforms/Scalar/ObjCARC.cpp
new file mode 100644
index 0000000..ee132d3
--- /dev/null
+++ b/contrib/llvm/lib/Transforms/Scalar/ObjCARC.cpp
@@ -0,0 +1,3595 @@
+//===- ObjCARC.cpp - ObjC ARC Optimization --------------------------------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+//
+// This file defines ObjC ARC optimizations. ARC stands for
+// Automatic Reference Counting and is a system for managing reference counts
+// for objects in Objective C.
+//
+// The optimizations performed include elimination of redundant, partially
+// redundant, and inconsequential reference count operations, elimination of
+// redundant weak pointer operations, pattern-matching and replacement of
+// low-level operations into higher-level operations, and numerous minor
+// simplifications.
+//
+// This file also defines a simple ARC-aware AliasAnalysis.
+//
+// WARNING: This file knows about certain library functions. It recognizes them
+// by name, and hardwires knowedge of their semantics.
+//
+// WARNING: This file knows about how certain Objective-C library functions are
+// used. Naive LLVM IR transformations which would otherwise be
+// behavior-preserving may break these assumptions.
+//
+//===----------------------------------------------------------------------===//
+
+#define DEBUG_TYPE "objc-arc"
+#include "llvm/Function.h"
+#include "llvm/Intrinsics.h"
+#include "llvm/GlobalVariable.h"
+#include "llvm/DerivedTypes.h"
+#include "llvm/Module.h"
+#include "llvm/Analysis/ValueTracking.h"
+#include "llvm/Transforms/Utils/Local.h"
+#include "llvm/Support/CallSite.h"
+#include "llvm/Support/CommandLine.h"
+#include "llvm/ADT/StringSwitch.h"
+#include "llvm/ADT/DenseMap.h"
+#include "llvm/ADT/STLExtras.h"
+using namespace llvm;
+
+// A handy option to enable/disable all optimizations in this file.
+static cl::opt<bool> EnableARCOpts("enable-objc-arc-opts", cl::init(true));
+
+//===----------------------------------------------------------------------===//
+// Misc. Utilities
+//===----------------------------------------------------------------------===//
+
+namespace {
+ /// MapVector - An associative container with fast insertion-order
+ /// (deterministic) iteration over its elements. Plus the special
+ /// blot operation.
+ template<class KeyT, class ValueT>
+ class MapVector {
+ /// Map - Map keys to indices in Vector.
+ typedef DenseMap<KeyT, size_t> MapTy;
+ MapTy Map;
+
+ /// Vector - Keys and values.
+ typedef std::vector<std::pair<KeyT, ValueT> > VectorTy;
+ VectorTy Vector;
+
+ public:
+ typedef typename VectorTy::iterator iterator;
+ typedef typename VectorTy::const_iterator const_iterator;
+ iterator begin() { return Vector.begin(); }
+ iterator end() { return Vector.end(); }
+ const_iterator begin() const { return Vector.begin(); }
+ const_iterator end() const { return Vector.end(); }
+
+#ifdef XDEBUG
+ ~MapVector() {
+ assert(Vector.size() >= Map.size()); // May differ due to blotting.
+ for (typename MapTy::const_iterator I = Map.begin(), E = Map.end();
+ I != E; ++I) {
+ assert(I->second < Vector.size());
+ assert(Vector[I->second].first == I->first);
+ }
+ for (typename VectorTy::const_iterator I = Vector.begin(),
+ E = Vector.end(); I != E; ++I)
+ assert(!I->first ||
+ (Map.count(I->first) &&
+ Map[I->first] == size_t(I - Vector.begin())));
+ }
+#endif
+
+ ValueT &operator[](KeyT Arg) {
+ std::pair<typename MapTy::iterator, bool> Pair =
+ Map.insert(std::make_pair(Arg, size_t(0)));
+ if (Pair.second) {
+ Pair.first->second = Vector.size();
+ Vector.push_back(std::make_pair(Arg, ValueT()));
+ return Vector.back().second;
+ }
+ return Vector[Pair.first->second].second;
+ }
+
+ std::pair<iterator, bool>
+ insert(const std::pair<KeyT, ValueT> &InsertPair) {
+ std::pair<typename MapTy::iterator, bool> Pair =
+ Map.insert(std::make_pair(InsertPair.first, size_t(0)));
+ if (Pair.second) {
+ Pair.first->second = Vector.size();
+ Vector.push_back(InsertPair);
+ return std::make_pair(llvm::prior(Vector.end()), true);
+ }
+ return std::make_pair(Vector.begin() + Pair.first->second, false);
+ }
+
+ const_iterator find(KeyT Key) const {
+ typename MapTy::const_iterator It = Map.find(Key);
+ if (It == Map.end()) return Vector.end();
+ return Vector.begin() + It->second;
+ }
+
+ /// blot - This is similar to erase, but instead of removing the element
+ /// from the vector, it just zeros out the key in the vector. This leaves
+ /// iterators intact, but clients must be prepared for zeroed-out keys when
+ /// iterating.
+ void blot(KeyT Key) {
+ typename MapTy::iterator It = Map.find(Key);
+ if (It == Map.end()) return;
+ Vector[It->second].first = KeyT();
+ Map.erase(It);
+ }
+
+ void clear() {
+ Map.clear();
+ Vector.clear();
+ }
+ };
+}
+
+//===----------------------------------------------------------------------===//
+// ARC Utilities.
+//===----------------------------------------------------------------------===//
+
+namespace {
+ /// InstructionClass - A simple classification for instructions.
+ enum InstructionClass {
+ IC_Retain, ///< objc_retain
+ IC_RetainRV, ///< objc_retainAutoreleasedReturnValue
+ IC_RetainBlock, ///< objc_retainBlock
+ IC_Release, ///< objc_release
+ IC_Autorelease, ///< objc_autorelease
+ IC_AutoreleaseRV, ///< objc_autoreleaseReturnValue
+ IC_AutoreleasepoolPush, ///< objc_autoreleasePoolPush
+ IC_AutoreleasepoolPop, ///< objc_autoreleasePoolPop
+ IC_NoopCast, ///< objc_retainedObject, etc.
+ IC_FusedRetainAutorelease, ///< objc_retainAutorelease
+ IC_FusedRetainAutoreleaseRV, ///< objc_retainAutoreleaseReturnValue
+ IC_LoadWeakRetained, ///< objc_loadWeakRetained (primitive)
+ IC_StoreWeak, ///< objc_storeWeak (primitive)
+ IC_InitWeak, ///< objc_initWeak (derived)
+ IC_LoadWeak, ///< objc_loadWeak (derived)
+ IC_MoveWeak, ///< objc_moveWeak (derived)
+ IC_CopyWeak, ///< objc_copyWeak (derived)
+ IC_DestroyWeak, ///< objc_destroyWeak (derived)
+ IC_CallOrUser, ///< could call objc_release and/or "use" pointers
+ IC_Call, ///< could call objc_release
+ IC_User, ///< could "use" a pointer
+ IC_None ///< anything else
+ };
+}
+
+/// IsPotentialUse - Test whether the given value is possible a
+/// reference-counted pointer.
+static bool IsPotentialUse(const Value *Op) {
+ // Pointers to static or stack storage are not reference-counted pointers.
+ if (isa<Constant>(Op) || isa<AllocaInst>(Op))
+ return false;
+ // Special arguments are not reference-counted.
+ if (const Argument *Arg = dyn_cast<Argument>(Op))
+ if (Arg->hasByValAttr() ||
+ Arg->hasNestAttr() ||
+ Arg->hasStructRetAttr())
+ return false;
+ // Only consider values with pointer types, and not function pointers.
+ const PointerType *Ty = dyn_cast<PointerType>(Op->getType());
+ if (!Ty || isa<FunctionType>(Ty->getElementType()))
+ return false;
+ // Conservatively assume anything else is a potential use.
+ return true;
+}
+
+/// GetCallSiteClass - Helper for GetInstructionClass. Determines what kind
+/// of construct CS is.
+static InstructionClass GetCallSiteClass(ImmutableCallSite CS) {
+ for (ImmutableCallSite::arg_iterator I = CS.arg_begin(), E = CS.arg_end();
+ I != E; ++I)
+ if (IsPotentialUse(*I))
+ return CS.onlyReadsMemory() ? IC_User : IC_CallOrUser;
+
+ return CS.onlyReadsMemory() ? IC_None : IC_Call;
+}
+
+/// GetFunctionClass - Determine if F is one of the special known Functions.
+/// If it isn't, return IC_CallOrUser.
+static InstructionClass GetFunctionClass(const Function *F) {
+ Function::const_arg_iterator AI = F->arg_begin(), AE = F->arg_end();
+
+ // No arguments.
+ if (AI == AE)
+ return StringSwitch<InstructionClass>(F->getName())
+ .Case("objc_autoreleasePoolPush", IC_AutoreleasepoolPush)
+ .Default(IC_CallOrUser);
+
+ // One argument.
+ const Argument *A0 = AI++;
+ if (AI == AE)
+ // Argument is a pointer.
+ if (const PointerType *PTy = dyn_cast<PointerType>(A0->getType())) {
+ const Type *ETy = PTy->getElementType();
+ // Argument is i8*.
+ if (ETy->isIntegerTy(8))
+ return StringSwitch<InstructionClass>(F->getName())
+ .Case("objc_retain", IC_Retain)
+ .Case("objc_retainAutoreleasedReturnValue", IC_RetainRV)
+ .Case("objc_retainBlock", IC_RetainBlock)
+ .Case("objc_release", IC_Release)
+ .Case("objc_autorelease", IC_Autorelease)
+ .Case("objc_autoreleaseReturnValue", IC_AutoreleaseRV)
+ .Case("objc_autoreleasePoolPop", IC_AutoreleasepoolPop)
+ .Case("objc_retainedObject", IC_NoopCast)
+ .Case("objc_unretainedObject", IC_NoopCast)
+ .Case("objc_unretainedPointer", IC_NoopCast)
+ .Case("objc_retain_autorelease", IC_FusedRetainAutorelease)
+ .Case("objc_retainAutorelease", IC_FusedRetainAutorelease)
+ .Case("objc_retainAutoreleaseReturnValue",IC_FusedRetainAutoreleaseRV)
+ .Default(IC_CallOrUser);
+
+ // Argument is i8**
+ if (const PointerType *Pte = dyn_cast<PointerType>(ETy))
+ if (Pte->getElementType()->isIntegerTy(8))
+ return StringSwitch<InstructionClass>(F->getName())
+ .Case("objc_loadWeakRetained", IC_LoadWeakRetained)
+ .Case("objc_loadWeak", IC_LoadWeak)
+ .Case("objc_destroyWeak", IC_DestroyWeak)
+ .Default(IC_CallOrUser);
+ }
+
+ // Two arguments, first is i8**.
+ const Argument *A1 = AI++;
+ if (AI == AE)
+ if (const PointerType *PTy = dyn_cast<PointerType>(A0->getType()))
+ if (const PointerType *Pte = dyn_cast<PointerType>(PTy->getElementType()))
+ if (Pte->getElementType()->isIntegerTy(8))
+ if (const PointerType *PTy1 = dyn_cast<PointerType>(A1->getType())) {
+ const Type *ETy1 = PTy1->getElementType();
+ // Second argument is i8*
+ if (ETy1->isIntegerTy(8))
+ return StringSwitch<InstructionClass>(F->getName())
+ .Case("objc_storeWeak", IC_StoreWeak)
+ .Case("objc_initWeak", IC_InitWeak)
+ .Default(IC_CallOrUser);
+ // Second argument is i8**.
+ if (const PointerType *Pte1 = dyn_cast<PointerType>(ETy1))
+ if (Pte1->getElementType()->isIntegerTy(8))
+ return StringSwitch<InstructionClass>(F->getName())
+ .Case("objc_moveWeak", IC_MoveWeak)
+ .Case("objc_copyWeak", IC_CopyWeak)
+ .Default(IC_CallOrUser);
+ }
+
+ // Anything else.
+ return IC_CallOrUser;
+}
+
+/// GetInstructionClass - Determine what kind of construct V is.
+static InstructionClass GetInstructionClass(const Value *V) {
+ if (const Instruction *I = dyn_cast<Instruction>(V)) {
+ // Any instruction other than bitcast and gep with a pointer operand have a
+ // use of an objc pointer. Bitcasts, GEPs, Selects, PHIs transfer a pointer
+ // to a subsequent use, rather than using it themselves, in this sense.
+ // As a short cut, several other opcodes are known to have no pointer
+ // operands of interest. And ret is never followed by a release, so it's
+ // not interesting to examine.
+ switch (I->getOpcode()) {
+ case Instruction::Call: {
+ const CallInst *CI = cast<CallInst>(I);
+ // Check for calls to special functions.
+ if (const Function *F = CI->getCalledFunction()) {
+ InstructionClass Class = GetFunctionClass(F);
+ if (Class != IC_CallOrUser)
+ return Class;
+
+ // None of the intrinsic functions do objc_release. For intrinsics, the
+ // only question is whether or not they may be users.
+ switch (F->getIntrinsicID()) {
+ case 0: break;
+ case Intrinsic::bswap: case Intrinsic::ctpop:
+ case Intrinsic::ctlz: case Intrinsic::cttz:
+ case Intrinsic::returnaddress: case Intrinsic::frameaddress:
+ case Intrinsic::stacksave: case Intrinsic::stackrestore:
+ case Intrinsic::vastart: case Intrinsic::vacopy: case Intrinsic::vaend:
+ // Don't let dbg info affect our results.
+ case Intrinsic::dbg_declare: case Intrinsic::dbg_value:
+ // Short cut: Some intrinsics obviously don't use ObjC pointers.
+ return IC_None;
+ default:
+ for (Function::const_arg_iterator AI = F->arg_begin(),
+ AE = F->arg_end(); AI != AE; ++AI)
+ if (IsPotentialUse(AI))
+ return IC_User;
+ return IC_None;
+ }
+ }
+ return GetCallSiteClass(CI);
+ }
+ case Instruction::Invoke:
+ return GetCallSiteClass(cast<InvokeInst>(I));
+ case Instruction::BitCast:
+ case Instruction::GetElementPtr:
+ case Instruction::Select: case Instruction::PHI:
+ case Instruction::Ret: case Instruction::Br:
+ case Instruction::Switch: case Instruction::IndirectBr:
+ case Instruction::Alloca: case Instruction::VAArg:
+ case Instruction::Add: case Instruction::FAdd:
+ case Instruction::Sub: case Instruction::FSub:
+ case Instruction::Mul: case Instruction::FMul:
+ case Instruction::SDiv: case Instruction::UDiv: case Instruction::FDiv:
+ case Instruction::SRem: case Instruction::URem: case Instruction::FRem:
+ case Instruction::Shl: case Instruction::LShr: case Instruction::AShr:
+ case Instruction::And: case Instruction::Or: case Instruction::Xor:
+ case Instruction::SExt: case Instruction::ZExt: case Instruction::Trunc:
+ case Instruction::IntToPtr: case Instruction::FCmp:
+ case Instruction::FPTrunc: case Instruction::FPExt:
+ case Instruction::FPToUI: case Instruction::FPToSI:
+ case Instruction::UIToFP: case Instruction::SIToFP:
+ case Instruction::InsertElement: case Instruction::ExtractElement:
+ case Instruction::ShuffleVector:
+ case Instruction::ExtractValue:
+ break;
+ case Instruction::ICmp:
+ // Comparing a pointer with null, or any other constant, isn't an
+ // interesting use, because we don't care what the pointer points to, or
+ // about the values of any other dynamic reference-counted pointers.
+ if (IsPotentialUse(I->getOperand(1)))
+ return IC_User;
+ break;
+ default:
+ // For anything else, check all the operands.
+ for (User::const_op_iterator OI = I->op_begin(), OE = I->op_end();
+ OI != OE; ++OI)
+ if (IsPotentialUse(*OI))
+ return IC_User;
+ }
+ }
+
+ // Otherwise, it's totally inert for ARC purposes.
+ return IC_None;
+}
+
+/// GetBasicInstructionClass - Determine what kind of construct V is. This is
+/// similar to GetInstructionClass except that it only detects objc runtine
+/// calls. This allows it to be faster.
+static InstructionClass GetBasicInstructionClass(const Value *V) {
+ if (const CallInst *CI = dyn_cast<CallInst>(V)) {
+ if (const Function *F = CI->getCalledFunction())
+ return GetFunctionClass(F);
+ // Otherwise, be conservative.
+ return IC_CallOrUser;
+ }
+
+ // Otherwise, be conservative.
+ return IC_User;
+}
+
+/// IsRetain - Test if the the given class is objc_retain or
+/// equivalent.
+static bool IsRetain(InstructionClass Class) {
+ return Class == IC_Retain ||
+ Class == IC_RetainRV;
+}
+
+/// IsAutorelease - Test if the the given class is objc_autorelease or
+/// equivalent.
+static bool IsAutorelease(InstructionClass Class) {
+ return Class == IC_Autorelease ||
+ Class == IC_AutoreleaseRV;
+}
+
+/// IsForwarding - Test if the given class represents instructions which return
+/// their argument verbatim.
+static bool IsForwarding(InstructionClass Class) {
+ // objc_retainBlock technically doesn't always return its argument
+ // verbatim, but it doesn't matter for our purposes here.
+ return Class == IC_Retain ||
+ Class == IC_RetainRV ||
+ Class == IC_Autorelease ||
+ Class == IC_AutoreleaseRV ||
+ Class == IC_RetainBlock ||
+ Class == IC_NoopCast;
+}
+
+/// IsNoopOnNull - Test if the given class represents instructions which do
+/// nothing if passed a null pointer.
+static bool IsNoopOnNull(InstructionClass Class) {
+ return Class == IC_Retain ||
+ Class == IC_RetainRV ||
+ Class == IC_Release ||
+ Class == IC_Autorelease ||
+ Class == IC_AutoreleaseRV ||
+ Class == IC_RetainBlock;
+}
+
+/// IsAlwaysTail - Test if the given class represents instructions which are
+/// always safe to mark with the "tail" keyword.
+static bool IsAlwaysTail(InstructionClass Class) {
+ // IC_RetainBlock may be given a stack argument.
+ return Class == IC_Retain ||
+ Class == IC_RetainRV ||
+ Class == IC_Autorelease ||
+ Class == IC_AutoreleaseRV;
+}
+
+/// IsNoThrow - Test if the given class represents instructions which are always
+/// safe to mark with the nounwind attribute..
+static bool IsNoThrow(InstructionClass Class) {
+ return Class == IC_Retain ||
+ Class == IC_RetainRV ||
+ Class == IC_RetainBlock ||
+ Class == IC_Release ||
+ Class == IC_Autorelease ||
+ Class == IC_AutoreleaseRV ||
+ Class == IC_AutoreleasepoolPush ||
+ Class == IC_AutoreleasepoolPop;
+}
+
+/// EraseInstruction - Erase the given instruction. ObjC calls return their
+/// argument verbatim, so if it's such a call and the return value has users,
+/// replace them with the argument value.
+static void EraseInstruction(Instruction *CI) {
+ Value *OldArg = cast<CallInst>(CI)->getArgOperand(0);
+
+ bool Unused = CI->use_empty();
+
+ if (!Unused) {
+ // Replace the return value with the argument.
+ assert(IsForwarding(GetBasicInstructionClass(CI)) &&
+ "Can't delete non-forwarding instruction with users!");
+ CI->replaceAllUsesWith(OldArg);
+ }
+
+ CI->eraseFromParent();
+
+ if (Unused)
+ RecursivelyDeleteTriviallyDeadInstructions(OldArg);
+}
+
+/// GetUnderlyingObjCPtr - This is a wrapper around getUnderlyingObject which
+/// also knows how to look through objc_retain and objc_autorelease calls, which
+/// we know to return their argument verbatim.
+static const Value *GetUnderlyingObjCPtr(const Value *V) {
+ for (;;) {
+ V = GetUnderlyingObject(V);
+ if (!IsForwarding(GetBasicInstructionClass(V)))
+ break;
+ V = cast<CallInst>(V)->getArgOperand(0);
+ }
+
+ return V;
+}
+
+/// StripPointerCastsAndObjCCalls - This is a wrapper around
+/// Value::stripPointerCasts which also knows how to look through objc_retain
+/// and objc_autorelease calls, which we know to return their argument verbatim.
+static const Value *StripPointerCastsAndObjCCalls(const Value *V) {
+ for (;;) {
+ V = V->stripPointerCasts();
+ if (!IsForwarding(GetBasicInstructionClass(V)))
+ break;
+ V = cast<CallInst>(V)->getArgOperand(0);
+ }
+ return V;
+}
+
+/// StripPointerCastsAndObjCCalls - This is a wrapper around
+/// Value::stripPointerCasts which also knows how to look through objc_retain
+/// and objc_autorelease calls, which we know to return their argument verbatim.
+static Value *StripPointerCastsAndObjCCalls(Value *V) {
+ for (;;) {
+ V = V->stripPointerCasts();
+ if (!IsForwarding(GetBasicInstructionClass(V)))
+ break;
+ V = cast<CallInst>(V)->getArgOperand(0);
+ }
+ return V;
+}
+
+/// GetObjCArg - Assuming the given instruction is one of the special calls such
+/// as objc_retain or objc_release, return the argument value, stripped of no-op
+/// casts and forwarding calls.
+static Value *GetObjCArg(Value *Inst) {
+ return StripPointerCastsAndObjCCalls(cast<CallInst>(Inst)->getArgOperand(0));
+}
+
+/// IsObjCIdentifiedObject - This is similar to AliasAnalysis'
+/// isObjCIdentifiedObject, except that it uses special knowledge of
+/// ObjC conventions...
+static bool IsObjCIdentifiedObject(const Value *V) {
+ // Assume that call results and arguments have their own "provenance".
+ // Constants (including GlobalVariables) and Allocas are never
+ // reference-counted.
+ if (isa<CallInst>(V) || isa<InvokeInst>(V) ||
+ isa<Argument>(V) || isa<Constant>(V) ||
+ isa<AllocaInst>(V))
+ return true;
+
+ if (const LoadInst *LI = dyn_cast<LoadInst>(V)) {
+ const Value *Pointer =
+ StripPointerCastsAndObjCCalls(LI->getPointerOperand());
+ if (const GlobalVariable *GV = dyn_cast<GlobalVariable>(Pointer)) {
+ StringRef Name = GV->getName();
+ // These special variables are known to hold values which are not
+ // reference-counted pointers.
+ if (Name.startswith("\01L_OBJC_SELECTOR_REFERENCES_") ||
+ Name.startswith("\01L_OBJC_CLASSLIST_REFERENCES_") ||
+ Name.startswith("\01L_OBJC_CLASSLIST_SUP_REFS_$_") ||
+ Name.startswith("\01L_OBJC_METH_VAR_NAME_") ||
+ Name.startswith("\01l_objc_msgSend_fixup_"))
+ return true;
+ }
+ }
+
+ return false;
+}
+
+/// FindSingleUseIdentifiedObject - This is similar to
+/// StripPointerCastsAndObjCCalls but it stops as soon as it finds a value
+/// with multiple uses.
+static const Value *FindSingleUseIdentifiedObject(const Value *Arg) {
+ if (Arg->hasOneUse()) {
+ if (const BitCastInst *BC = dyn_cast<BitCastInst>(Arg))
+ return FindSingleUseIdentifiedObject(BC->getOperand(0));
+ if (const GetElementPtrInst *GEP = dyn_cast<GetElementPtrInst>(Arg))
+ if (GEP->hasAllZeroIndices())
+ return FindSingleUseIdentifiedObject(GEP->getPointerOperand());
+ if (IsForwarding(GetBasicInstructionClass(Arg)))
+ return FindSingleUseIdentifiedObject(
+ cast<CallInst>(Arg)->getArgOperand(0));
+ if (!IsObjCIdentifiedObject(Arg))
+ return 0;
+ return Arg;
+ }
+
+ // If we found an identifiable object but it has multiple uses, but they
+ // are trivial uses, we can still consider this to be a single-use
+ // value.
+ if (IsObjCIdentifiedObject(Arg)) {
+ for (Value::const_use_iterator UI = Arg->use_begin(), UE = Arg->use_end();
+ UI != UE; ++UI) {
+ const User *U = *UI;
+ if (!U->use_empty() || StripPointerCastsAndObjCCalls(U) != Arg)
+ return 0;
+ }
+
+ return Arg;
+ }
+
+ return 0;
+}
+
+/// ModuleHasARC - Test if the given module looks interesting to run ARC
+/// optimization on.
+static bool ModuleHasARC(const Module &M) {
+ return
+ M.getNamedValue("objc_retain") ||
+ M.getNamedValue("objc_release") ||
+ M.getNamedValue("objc_autorelease") ||
+ M.getNamedValue("objc_retainAutoreleasedReturnValue") ||
+ M.getNamedValue("objc_retainBlock") ||
+ M.getNamedValue("objc_autoreleaseReturnValue") ||
+ M.getNamedValue("objc_autoreleasePoolPush") ||
+ M.getNamedValue("objc_loadWeakRetained") ||
+ M.getNamedValue("objc_loadWeak") ||
+ M.getNamedValue("objc_destroyWeak") ||
+ M.getNamedValue("objc_storeWeak") ||
+ M.getNamedValue("objc_initWeak") ||
+ M.getNamedValue("objc_moveWeak") ||
+ M.getNamedValue("objc_copyWeak") ||
+ M.getNamedValue("objc_retainedObject") ||
+ M.getNamedValue("objc_unretainedObject") ||
+ M.getNamedValue("objc_unretainedPointer");
+}
+
+//===----------------------------------------------------------------------===//
+// ARC AliasAnalysis.
+//===----------------------------------------------------------------------===//
+
+#include "llvm/Pass.h"
+#include "llvm/Analysis/AliasAnalysis.h"
+#include "llvm/Analysis/Passes.h"
+
+namespace {
+ /// ObjCARCAliasAnalysis - This is a simple alias analysis
+ /// implementation that uses knowledge of ARC constructs to answer queries.
+ ///
+ /// TODO: This class could be generalized to know about other ObjC-specific
+ /// tricks. Such as knowing that ivars in the non-fragile ABI are non-aliasing
+ /// even though their offsets are dynamic.
+ class ObjCARCAliasAnalysis : public ImmutablePass,
+ public AliasAnalysis {
+ public:
+ static char ID; // Class identification, replacement for typeinfo
+ ObjCARCAliasAnalysis() : ImmutablePass(ID) {
+ initializeObjCARCAliasAnalysisPass(*PassRegistry::getPassRegistry());
+ }
+
+ private:
+ virtual void initializePass() {
+ InitializeAliasAnalysis(this);
+ }
+
+ /// getAdjustedAnalysisPointer - This method is used when a pass implements
+ /// an analysis interface through multiple inheritance. If needed, it
+ /// should override this to adjust the this pointer as needed for the
+ /// specified pass info.
+ virtual void *getAdjustedAnalysisPointer(const void *PI) {
+ if (PI == &AliasAnalysis::ID)
+ return (AliasAnalysis*)this;
+ return this;
+ }
+
+ virtual void getAnalysisUsage(AnalysisUsage &AU) const;
+ virtual AliasResult alias(const Location &LocA, const Location &LocB);
+ virtual bool pointsToConstantMemory(const Location &Loc, bool OrLocal);
+ virtual ModRefBehavior getModRefBehavior(ImmutableCallSite CS);
+ virtual ModRefBehavior getModRefBehavior(const Function *F);
+ virtual ModRefResult getModRefInfo(ImmutableCallSite CS,
+ const Location &Loc);
+ virtual ModRefResult getModRefInfo(ImmutableCallSite CS1,
+ ImmutableCallSite CS2);
+ };
+} // End of anonymous namespace
+
+// Register this pass...
+char ObjCARCAliasAnalysis::ID = 0;
+INITIALIZE_AG_PASS(ObjCARCAliasAnalysis, AliasAnalysis, "objc-arc-aa",
+ "ObjC-ARC-Based Alias Analysis", false, true, false)
+
+ImmutablePass *llvm::createObjCARCAliasAnalysisPass() {
+ return new ObjCARCAliasAnalysis();
+}
+
+void
+ObjCARCAliasAnalysis::getAnalysisUsage(AnalysisUsage &AU) const {
+ AU.setPreservesAll();
+ AliasAnalysis::getAnalysisUsage(AU);
+}
+
+AliasAnalysis::AliasResult
+ObjCARCAliasAnalysis::alias(const Location &LocA, const Location &LocB) {
+ if (!EnableARCOpts)
+ return AliasAnalysis::alias(LocA, LocB);
+
+ // First, strip off no-ops, including ObjC-specific no-ops, and try making a
+ // precise alias query.
+ const Value *SA = StripPointerCastsAndObjCCalls(LocA.Ptr);
+ const Value *SB = StripPointerCastsAndObjCCalls(LocB.Ptr);
+ AliasResult Result =
+ AliasAnalysis::alias(Location(SA, LocA.Size, LocA.TBAATag),
+ Location(SB, LocB.Size, LocB.TBAATag));
+ if (Result != MayAlias)
+ return Result;
+
+ // If that failed, climb to the underlying object, including climbing through
+ // ObjC-specific no-ops, and try making an imprecise alias query.
+ const Value *UA = GetUnderlyingObjCPtr(SA);
+ const Value *UB = GetUnderlyingObjCPtr(SB);
+ if (UA != SA || UB != SB) {
+ Result = AliasAnalysis::alias(Location(UA), Location(UB));
+ // We can't use MustAlias or PartialAlias results here because
+ // GetUnderlyingObjCPtr may return an offsetted pointer value.
+ if (Result == NoAlias)
+ return NoAlias;
+ }
+
+ // If that failed, fail. We don't need to chain here, since that's covered
+ // by the earlier precise query.
+ return MayAlias;
+}
+
+bool
+ObjCARCAliasAnalysis::pointsToConstantMemory(const Location &Loc,
+ bool OrLocal) {
+ if (!EnableARCOpts)
+ return AliasAnalysis::pointsToConstantMemory(Loc, OrLocal);
+
+ // First, strip off no-ops, including ObjC-specific no-ops, and try making
+ // a precise alias query.
+ const Value *S = StripPointerCastsAndObjCCalls(Loc.Ptr);
+ if (AliasAnalysis::pointsToConstantMemory(Location(S, Loc.Size, Loc.TBAATag),
+ OrLocal))
+ return true;
+
+ // If that failed, climb to the underlying object, including climbing through
+ // ObjC-specific no-ops, and try making an imprecise alias query.
+ const Value *U = GetUnderlyingObjCPtr(S);
+ if (U != S)
+ return AliasAnalysis::pointsToConstantMemory(Location(U), OrLocal);
+
+ // If that failed, fail. We don't need to chain here, since that's covered
+ // by the earlier precise query.
+ return false;
+}
+
+AliasAnalysis::ModRefBehavior
+ObjCARCAliasAnalysis::getModRefBehavior(ImmutableCallSite CS) {
+ // We have nothing to do. Just chain to the next AliasAnalysis.
+ return AliasAnalysis::getModRefBehavior(CS);
+}
+
+AliasAnalysis::ModRefBehavior
+ObjCARCAliasAnalysis::getModRefBehavior(const Function *F) {
+ if (!EnableARCOpts)
+ return AliasAnalysis::getModRefBehavior(F);
+
+ switch (GetFunctionClass(F)) {
+ case IC_NoopCast:
+ return DoesNotAccessMemory;
+ default:
+ break;
+ }
+
+ return AliasAnalysis::getModRefBehavior(F);
+}
+
+AliasAnalysis::ModRefResult
+ObjCARCAliasAnalysis::getModRefInfo(ImmutableCallSite CS, const Location &Loc) {
+ if (!EnableARCOpts)
+ return AliasAnalysis::getModRefInfo(CS, Loc);
+
+ switch (GetBasicInstructionClass(CS.getInstruction())) {
+ case IC_Retain:
+ case IC_RetainRV:
+ case IC_RetainBlock:
+ case IC_Autorelease:
+ case IC_AutoreleaseRV:
+ case IC_NoopCast:
+ case IC_AutoreleasepoolPush:
+ case IC_FusedRetainAutorelease:
+ case IC_FusedRetainAutoreleaseRV:
+ // These functions don't access any memory visible to the compiler.
+ return NoModRef;
+ default:
+ break;
+ }
+
+ return AliasAnalysis::getModRefInfo(CS, Loc);
+}
+
+AliasAnalysis::ModRefResult
+ObjCARCAliasAnalysis::getModRefInfo(ImmutableCallSite CS1,
+ ImmutableCallSite CS2) {
+ // TODO: Theoretically we could check for dependencies between objc_* calls
+ // and OnlyAccessesArgumentPointees calls or other well-behaved calls.
+ return AliasAnalysis::getModRefInfo(CS1, CS2);
+}
+
+//===----------------------------------------------------------------------===//
+// ARC expansion.
+//===----------------------------------------------------------------------===//
+
+#include "llvm/Support/InstIterator.h"
+#include "llvm/Transforms/Scalar.h"
+
+namespace {
+ /// ObjCARCExpand - Early ARC transformations.
+ class ObjCARCExpand : public FunctionPass {
+ virtual void getAnalysisUsage(AnalysisUsage &AU) const;
+ virtual bool doInitialization(Module &M);
+ virtual bool runOnFunction(Function &F);
+
+ /// Run - A flag indicating whether this optimization pass should run.
+ bool Run;
+
+ public:
+ static char ID;
+ ObjCARCExpand() : FunctionPass(ID) {
+ initializeObjCARCExpandPass(*PassRegistry::getPassRegistry());
+ }
+ };
+}
+
+char ObjCARCExpand::ID = 0;
+INITIALIZE_PASS(ObjCARCExpand,
+ "objc-arc-expand", "ObjC ARC expansion", false, false)
+
+Pass *llvm::createObjCARCExpandPass() {
+ return new ObjCARCExpand();
+}
+
+void ObjCARCExpand::getAnalysisUsage(AnalysisUsage &AU) const {
+ AU.setPreservesCFG();
+}
+
+bool ObjCARCExpand::doInitialization(Module &M) {
+ Run = ModuleHasARC(M);
+ return false;
+}
+
+bool ObjCARCExpand::runOnFunction(Function &F) {
+ if (!EnableARCOpts)
+ return false;
+
+ // If nothing in the Module uses ARC, don't do anything.
+ if (!Run)
+ return false;
+
+ bool Changed = false;
+
+ for (inst_iterator I = inst_begin(&F), E = inst_end(&F); I != E; ++I) {
+ Instruction *Inst = &*I;
+
+ switch (GetBasicInstructionClass(Inst)) {
+ case IC_Retain:
+ case IC_RetainRV:
+ case IC_Autorelease:
+ case IC_AutoreleaseRV:
+ case IC_FusedRetainAutorelease:
+ case IC_FusedRetainAutoreleaseRV:
+ // These calls return their argument verbatim, as a low-level
+ // optimization. However, this makes high-level optimizations
+ // harder. Undo any uses of this optimization that the front-end
+ // emitted here. We'll redo them in a later pass.
+ Changed = true;
+ Inst->replaceAllUsesWith(cast<CallInst>(Inst)->getArgOperand(0));
+ break;
+ default:
+ break;
+ }
+ }
+
+ return Changed;
+}
+
+//===----------------------------------------------------------------------===//
+// ARC optimization.
+//===----------------------------------------------------------------------===//
+
+// TODO: On code like this:
+//
+// objc_retain(%x)
+// stuff_that_cannot_release()
+// objc_autorelease(%x)
+// stuff_that_cannot_release()
+// objc_retain(%x)
+// stuff_that_cannot_release()
+// objc_autorelease(%x)
+//
+// The second retain and autorelease can be deleted.
+
+// TODO: It should be possible to delete
+// objc_autoreleasePoolPush and objc_autoreleasePoolPop
+// pairs if nothing is actually autoreleased between them. Also, autorelease
+// calls followed by objc_autoreleasePoolPop calls (perhaps in ObjC++ code
+// after inlining) can be turned into plain release calls.
+
+// TODO: Critical-edge splitting. If the optimial insertion point is
+// a critical edge, the current algorithm has to fail, because it doesn't
+// know how to split edges. It should be possible to make the optimizer
+// think in terms of edges, rather than blocks, and then split critical
+// edges on demand.
+
+// TODO: OptimizeSequences could generalized to be Interprocedural.
+
+// TODO: Recognize that a bunch of other objc runtime calls have
+// non-escaping arguments and non-releasing arguments, and may be
+// non-autoreleasing.
+
+// TODO: Sink autorelease calls as far as possible. Unfortunately we
+// usually can't sink them past other calls, which would be the main
+// case where it would be useful.
+
+/// TODO: The pointer returned from objc_loadWeakRetained is retained.
+
+#include "llvm/GlobalAlias.h"
+#include "llvm/Constants.h"
+#include "llvm/LLVMContext.h"
+#include "llvm/Support/ErrorHandling.h"
+#include "llvm/Support/CFG.h"
+#include "llvm/ADT/PostOrderIterator.h"
+#include "llvm/ADT/Statistic.h"
+
+STATISTIC(NumNoops, "Number of no-op objc calls eliminated");
+STATISTIC(NumPartialNoops, "Number of partially no-op objc calls eliminated");
+STATISTIC(NumAutoreleases,"Number of autoreleases converted to releases");
+STATISTIC(NumRets, "Number of return value forwarding "
+ "retain+autoreleaes eliminated");
+STATISTIC(NumRRs, "Number of retain+release paths eliminated");
+STATISTIC(NumPeeps, "Number of calls peephole-optimized");
+
+namespace {
+ /// ProvenanceAnalysis - This is similar to BasicAliasAnalysis, and it
+ /// uses many of the same techniques, except it uses special ObjC-specific
+ /// reasoning about pointer relationships.
+ class ProvenanceAnalysis {
+ AliasAnalysis *AA;
+
+ typedef std::pair<const Value *, const Value *> ValuePairTy;
+ typedef DenseMap<ValuePairTy, bool> CachedResultsTy;
+ CachedResultsTy CachedResults;
+
+ bool relatedCheck(const Value *A, const Value *B);
+ bool relatedSelect(const SelectInst *A, const Value *B);
+ bool relatedPHI(const PHINode *A, const Value *B);
+
+ // Do not implement.
+ void operator=(const ProvenanceAnalysis &);
+ ProvenanceAnalysis(const ProvenanceAnalysis &);
+
+ public:
+ ProvenanceAnalysis() {}
+
+ void setAA(AliasAnalysis *aa) { AA = aa; }
+
+ AliasAnalysis *getAA() const { return AA; }
+
+ bool related(const Value *A, const Value *B);
+
+ void clear() {
+ CachedResults.clear();
+ }
+ };
+}
+
+bool ProvenanceAnalysis::relatedSelect(const SelectInst *A, const Value *B) {
+ // If the values are Selects with the same condition, we can do a more precise
+ // check: just check for relations between the values on corresponding arms.
+ if (const SelectInst *SB = dyn_cast<SelectInst>(B))
+ if (A->getCondition() == SB->getCondition()) {
+ if (related(A->getTrueValue(), SB->getTrueValue()))
+ return true;
+ if (related(A->getFalseValue(), SB->getFalseValue()))
+ return true;
+ return false;
+ }
+
+ // Check both arms of the Select node individually.
+ if (related(A->getTrueValue(), B))
+ return true;
+ if (related(A->getFalseValue(), B))
+ return true;
+
+ // The arms both checked out.
+ return false;
+}
+
+bool ProvenanceAnalysis::relatedPHI(const PHINode *A, const Value *B) {
+ // If the values are PHIs in the same block, we can do a more precise as well
+ // as efficient check: just check for relations between the values on
+ // corresponding edges.
+ if (const PHINode *PNB = dyn_cast<PHINode>(B))
+ if (PNB->getParent() == A->getParent()) {
+ for (unsigned i = 0, e = A->getNumIncomingValues(); i != e; ++i)
+ if (related(A->getIncomingValue(i),
+ PNB->getIncomingValueForBlock(A->getIncomingBlock(i))))
+ return true;
+ return false;
+ }
+
+ // Check each unique source of the PHI node against B.
+ SmallPtrSet<const Value *, 4> UniqueSrc;
+ for (unsigned i = 0, e = A->getNumIncomingValues(); i != e; ++i) {
+ const Value *PV1 = A->getIncomingValue(i);
+ if (UniqueSrc.insert(PV1) && related(PV1, B))
+ return true;
+ }
+
+ // All of the arms checked out.
+ return false;
+}
+
+/// isStoredObjCPointer - Test if the value of P, or any value covered by its
+/// provenance, is ever stored within the function (not counting callees).
+static bool isStoredObjCPointer(const Value *P) {
+ SmallPtrSet<const Value *, 8> Visited;
+ SmallVector<const Value *, 8> Worklist;
+ Worklist.push_back(P);
+ Visited.insert(P);
+ do {
+ P = Worklist.pop_back_val();
+ for (Value::const_use_iterator UI = P->use_begin(), UE = P->use_end();
+ UI != UE; ++UI) {
+ const User *Ur = *UI;
+ if (isa<StoreInst>(Ur)) {
+ if (UI.getOperandNo() == 0)
+ // The pointer is stored.
+ return true;
+ // The pointed is stored through.
+ continue;
+ }
+ if (isa<CallInst>(Ur))
+ // The pointer is passed as an argument, ignore this.
+ continue;
+ if (isa<PtrToIntInst>(P))
+ // Assume the worst.
+ return true;
+ if (Visited.insert(Ur))
+ Worklist.push_back(Ur);
+ }
+ } while (!Worklist.empty());
+
+ // Everything checked out.
+ return false;
+}
+
+bool ProvenanceAnalysis::relatedCheck(const Value *A, const Value *B) {
+ // Skip past provenance pass-throughs.
+ A = GetUnderlyingObjCPtr(A);
+ B = GetUnderlyingObjCPtr(B);
+
+ // Quick check.
+ if (A == B)
+ return true;
+
+ // Ask regular AliasAnalysis, for a first approximation.
+ switch (AA->alias(A, B)) {
+ case AliasAnalysis::NoAlias:
+ return false;
+ case AliasAnalysis::MustAlias:
+ case AliasAnalysis::PartialAlias:
+ return true;
+ case AliasAnalysis::MayAlias:
+ break;
+ }
+
+ bool AIsIdentified = IsObjCIdentifiedObject(A);
+ bool BIsIdentified = IsObjCIdentifiedObject(B);
+
+ // An ObjC-Identified object can't alias a load if it is never locally stored.
+ if (AIsIdentified) {
+ if (BIsIdentified) {
+ // If both pointers have provenance, they can be directly compared.
+ if (A != B)
+ return false;
+ } else {
+ if (isa<LoadInst>(B))
+ return isStoredObjCPointer(A);
+ }
+ } else {
+ if (BIsIdentified && isa<LoadInst>(A))
+ return isStoredObjCPointer(B);
+ }
+
+ // Special handling for PHI and Select.
+ if (const PHINode *PN = dyn_cast<PHINode>(A))
+ return relatedPHI(PN, B);
+ if (const PHINode *PN = dyn_cast<PHINode>(B))
+ return relatedPHI(PN, A);
+ if (const SelectInst *S = dyn_cast<SelectInst>(A))
+ return relatedSelect(S, B);
+ if (const SelectInst *S = dyn_cast<SelectInst>(B))
+ return relatedSelect(S, A);
+
+ // Conservative.
+ return true;
+}
+
+bool ProvenanceAnalysis::related(const Value *A, const Value *B) {
+ // Begin by inserting a conservative value into the map. If the insertion
+ // fails, we have the answer already. If it succeeds, leave it there until we
+ // compute the real answer to guard against recursive queries.
+ if (A > B) std::swap(A, B);
+ std::pair<CachedResultsTy::iterator, bool> Pair =
+ CachedResults.insert(std::make_pair(ValuePairTy(A, B), true));
+ if (!Pair.second)
+ return Pair.first->second;
+
+ bool Result = relatedCheck(A, B);
+ CachedResults[ValuePairTy(A, B)] = Result;
+ return Result;
+}
+
+namespace {
+ // Sequence - A sequence of states that a pointer may go through in which an
+ // objc_retain and objc_release are actually needed.
+ enum Sequence {
+ S_None,
+ S_Retain, ///< objc_retain(x)
+ S_CanRelease, ///< foo(x) -- x could possibly see a ref count decrement
+ S_Use, ///< any use of x
+ S_Stop, ///< like S_Release, but code motion is stopped
+ S_Release, ///< objc_release(x)
+ S_MovableRelease ///< objc_release(x), !clang.imprecise_release
+ };
+}
+
+static Sequence MergeSeqs(Sequence A, Sequence B, bool TopDown) {
+ // The easy cases.
+ if (A == B)
+ return A;
+ if (A == S_None || B == S_None)
+ return S_None;
+
+ // Note that we can't merge S_CanRelease and S_Use.
+ if (A > B) std::swap(A, B);
+ if (TopDown) {
+ // Choose the side which is further along in the sequence.
+ if (A == S_Retain && (B == S_CanRelease || B == S_Use))
+ return B;
+ } else {
+ // Choose the side which is further along in the sequence.
+ if ((A == S_Use || A == S_CanRelease) &&
+ (B == S_Release || B == S_Stop || B == S_MovableRelease))
+ return A;
+ // If both sides are releases, choose the more conservative one.
+ if (A == S_Stop && (B == S_Release || B == S_MovableRelease))
+ return A;
+ if (A == S_Release && B == S_MovableRelease)
+ return A;
+ }
+
+ return S_None;
+}
+
+namespace {
+ /// RRInfo - Unidirectional information about either a
+ /// retain-decrement-use-release sequence or release-use-decrement-retain
+ /// reverese sequence.
+ struct RRInfo {
+ /// KnownIncremented - After an objc_retain, the reference count of the
+ /// referenced object is known to be positive. Similarly, before an
+ /// objc_release, the reference count of the referenced object is known to
+ /// be positive. If there are retain-release pairs in code regions where the
+ /// retain count is known to be positive, they can be eliminated, regardless
+ /// of any side effects between them.
+ bool KnownIncremented;
+
+ /// IsRetainBlock - True if the Calls are objc_retainBlock calls (as
+ /// opposed to objc_retain calls).
+ bool IsRetainBlock;
+
+ /// IsTailCallRelease - True of the objc_release calls are all marked
+ /// with the "tail" keyword.
+ bool IsTailCallRelease;
+
+ /// ReleaseMetadata - If the Calls are objc_release calls and they all have
+ /// a clang.imprecise_release tag, this is the metadata tag.
+ MDNode *ReleaseMetadata;
+
+ /// Calls - For a top-down sequence, the set of objc_retains or
+ /// objc_retainBlocks. For bottom-up, the set of objc_releases.
+ SmallPtrSet<Instruction *, 2> Calls;
+
+ /// ReverseInsertPts - The set of optimal insert positions for
+ /// moving calls in the opposite sequence.
+ SmallPtrSet<Instruction *, 2> ReverseInsertPts;
+
+ RRInfo() :
+ KnownIncremented(false), IsRetainBlock(false), IsTailCallRelease(false),
+ ReleaseMetadata(0) {}
+
+ void clear();
+ };
+}
+
+void RRInfo::clear() {
+ KnownIncremented = false;
+ IsRetainBlock = false;
+ IsTailCallRelease = false;
+ ReleaseMetadata = 0;
+ Calls.clear();
+ ReverseInsertPts.clear();
+}
+
+namespace {
+ /// PtrState - This class summarizes several per-pointer runtime properties
+ /// which are propogated through the flow graph.
+ class PtrState {
+ /// RefCount - The known minimum number of reference count increments.
+ unsigned RefCount;
+
+ /// Seq - The current position in the sequence.
+ Sequence Seq;
+
+ public:
+ /// RRI - Unidirectional information about the current sequence.
+ /// TODO: Encapsulate this better.
+ RRInfo RRI;
+
+ PtrState() : RefCount(0), Seq(S_None) {}
+
+ void IncrementRefCount() {
+ if (RefCount != UINT_MAX) ++RefCount;
+ }
+
+ void DecrementRefCount() {
+ if (RefCount != 0) --RefCount;
+ }
+
+ void ClearRefCount() {
+ RefCount = 0;
+ }
+
+ bool IsKnownIncremented() const {
+ return RefCount > 0;
+ }
+
+ void SetSeq(Sequence NewSeq) {
+ Seq = NewSeq;
+ }
+
+ void SetSeqToRelease(MDNode *M) {
+ if (Seq == S_None || Seq == S_Use) {
+ Seq = M ? S_MovableRelease : S_Release;
+ RRI.ReleaseMetadata = M;
+ } else if (Seq != S_MovableRelease || RRI.ReleaseMetadata != M) {
+ Seq = S_Release;
+ RRI.ReleaseMetadata = 0;
+ }
+ }
+
+ Sequence GetSeq() const {
+ return Seq;
+ }
+
+ void ClearSequenceProgress() {
+ Seq = S_None;
+ RRI.clear();
+ }
+
+ void Merge(const PtrState &Other, bool TopDown);
+ };
+}
+
+void
+PtrState::Merge(const PtrState &Other, bool TopDown) {
+ Seq = MergeSeqs(Seq, Other.Seq, TopDown);
+ RefCount = std::min(RefCount, Other.RefCount);
+
+ // We can't merge a plain objc_retain with an objc_retainBlock.
+ if (RRI.IsRetainBlock != Other.RRI.IsRetainBlock)
+ Seq = S_None;
+
+ if (Seq == S_None) {
+ RRI.clear();
+ } else {
+ // Conservatively merge the ReleaseMetadata information.
+ if (RRI.ReleaseMetadata != Other.RRI.ReleaseMetadata)
+ RRI.ReleaseMetadata = 0;
+
+ RRI.KnownIncremented = RRI.KnownIncremented && Other.RRI.KnownIncremented;
+ RRI.IsTailCallRelease = RRI.IsTailCallRelease && Other.RRI.IsTailCallRelease;
+ RRI.Calls.insert(Other.RRI.Calls.begin(), Other.RRI.Calls.end());
+ RRI.ReverseInsertPts.insert(Other.RRI.ReverseInsertPts.begin(),
+ Other.RRI.ReverseInsertPts.end());
+ }
+}
+
+namespace {
+ /// BBState - Per-BasicBlock state.
+ class BBState {
+ /// TopDownPathCount - The number of unique control paths from the entry
+ /// which can reach this block.
+ unsigned TopDownPathCount;
+
+ /// BottomUpPathCount - The number of unique control paths to exits
+ /// from this block.
+ unsigned BottomUpPathCount;
+
+ /// MapTy - A type for PerPtrTopDown and PerPtrBottomUp.
+ typedef MapVector<const Value *, PtrState> MapTy;
+
+ /// PerPtrTopDown - The top-down traversal uses this to record information
+ /// known about a pointer at the bottom of each block.
+ MapTy PerPtrTopDown;
+
+ /// PerPtrBottomUp - The bottom-up traversal uses this to record information
+ /// known about a pointer at the top of each block.
+ MapTy PerPtrBottomUp;
+
+ public:
+ BBState() : TopDownPathCount(0), BottomUpPathCount(0) {}
+
+ typedef MapTy::iterator ptr_iterator;
+ typedef MapTy::const_iterator ptr_const_iterator;
+
+ ptr_iterator top_down_ptr_begin() { return PerPtrTopDown.begin(); }
+ ptr_iterator top_down_ptr_end() { return PerPtrTopDown.end(); }
+ ptr_const_iterator top_down_ptr_begin() const {
+ return PerPtrTopDown.begin();
+ }
+ ptr_const_iterator top_down_ptr_end() const {
+ return PerPtrTopDown.end();
+ }
+
+ ptr_iterator bottom_up_ptr_begin() { return PerPtrBottomUp.begin(); }
+ ptr_iterator bottom_up_ptr_end() { return PerPtrBottomUp.end(); }
+ ptr_const_iterator bottom_up_ptr_begin() const {
+ return PerPtrBottomUp.begin();
+ }
+ ptr_const_iterator bottom_up_ptr_end() const {
+ return PerPtrBottomUp.end();
+ }
+
+ /// SetAsEntry - Mark this block as being an entry block, which has one
+ /// path from the entry by definition.
+ void SetAsEntry() { TopDownPathCount = 1; }
+
+ /// SetAsExit - Mark this block as being an exit block, which has one
+ /// path to an exit by definition.
+ void SetAsExit() { BottomUpPathCount = 1; }
+
+ PtrState &getPtrTopDownState(const Value *Arg) {
+ return PerPtrTopDown[Arg];
+ }
+
+ PtrState &getPtrBottomUpState(const Value *Arg) {
+ return PerPtrBottomUp[Arg];
+ }
+
+ void clearBottomUpPointers() {
+ PerPtrTopDown.clear();
+ }
+
+ void clearTopDownPointers() {
+ PerPtrTopDown.clear();
+ }
+
+ void InitFromPred(const BBState &Other);
+ void InitFromSucc(const BBState &Other);
+ void MergePred(const BBState &Other);
+ void MergeSucc(const BBState &Other);
+
+ /// GetAllPathCount - Return the number of possible unique paths from an
+ /// entry to an exit which pass through this block. This is only valid
+ /// after both the top-down and bottom-up traversals are complete.
+ unsigned GetAllPathCount() const {
+ return TopDownPathCount * BottomUpPathCount;
+ }
+ };
+}
+
+void BBState::InitFromPred(const BBState &Other) {
+ PerPtrTopDown = Other.PerPtrTopDown;
+ TopDownPathCount = Other.TopDownPathCount;
+}
+
+void BBState::InitFromSucc(const BBState &Other) {
+ PerPtrBottomUp = Other.PerPtrBottomUp;
+ BottomUpPathCount = Other.BottomUpPathCount;
+}
+
+/// MergePred - The top-down traversal uses this to merge information about
+/// predecessors to form the initial state for a new block.
+void BBState::MergePred(const BBState &Other) {
+ // Other.TopDownPathCount can be 0, in which case it is either dead or a
+ // loop backedge. Loop backedges are special.
+ TopDownPathCount += Other.TopDownPathCount;
+
+ // For each entry in the other set, if our set has an entry with the same key,
+ // merge the entries. Otherwise, copy the entry and merge it with an empty
+ // entry.
+ for (ptr_const_iterator MI = Other.top_down_ptr_begin(),
+ ME = Other.top_down_ptr_end(); MI != ME; ++MI) {
+ std::pair<ptr_iterator, bool> Pair = PerPtrTopDown.insert(*MI);
+ Pair.first->second.Merge(Pair.second ? PtrState() : MI->second,
+ /*TopDown=*/true);
+ }
+
+ // For each entry in our set, if the other set doens't have an entry with the
+ // same key, force it to merge with an empty entry.
+ for (ptr_iterator MI = top_down_ptr_begin(),
+ ME = top_down_ptr_end(); MI != ME; ++MI)
+ if (Other.PerPtrTopDown.find(MI->first) == Other.PerPtrTopDown.end())
+ MI->second.Merge(PtrState(), /*TopDown=*/true);
+}
+
+/// MergeSucc - The bottom-up traversal uses this to merge information about
+/// successors to form the initial state for a new block.
+void BBState::MergeSucc(const BBState &Other) {
+ // Other.BottomUpPathCount can be 0, in which case it is either dead or a
+ // loop backedge. Loop backedges are special.
+ BottomUpPathCount += Other.BottomUpPathCount;
+
+ // For each entry in the other set, if our set has an entry with the
+ // same key, merge the entries. Otherwise, copy the entry and merge
+ // it with an empty entry.
+ for (ptr_const_iterator MI = Other.bottom_up_ptr_begin(),
+ ME = Other.bottom_up_ptr_end(); MI != ME; ++MI) {
+ std::pair<ptr_iterator, bool> Pair = PerPtrBottomUp.insert(*MI);
+ Pair.first->second.Merge(Pair.second ? PtrState() : MI->second,
+ /*TopDown=*/false);
+ }
+
+ // For each entry in our set, if the other set doens't have an entry
+ // with the same key, force it to merge with an empty entry.
+ for (ptr_iterator MI = bottom_up_ptr_begin(),
+ ME = bottom_up_ptr_end(); MI != ME; ++MI)
+ if (Other.PerPtrBottomUp.find(MI->first) == Other.PerPtrBottomUp.end())
+ MI->second.Merge(PtrState(), /*TopDown=*/false);
+}
+
+namespace {
+ /// ObjCARCOpt - The main ARC optimization pass.
+ class ObjCARCOpt : public FunctionPass {
+ bool Changed;
+ ProvenanceAnalysis PA;
+
+ /// Run - A flag indicating whether this optimization pass should run.
+ bool Run;
+
+ /// RetainFunc, RelaseFunc - Declarations for objc_retain,
+ /// objc_retainBlock, and objc_release.
+ Function *RetainFunc, *RetainBlockFunc, *RetainRVFunc, *ReleaseFunc;
+
+ /// RetainRVCallee, etc. - Declarations for ObjC runtime
+ /// functions, for use in creating calls to them. These are initialized
+ /// lazily to avoid cluttering up the Module with unused declarations.
+ Constant *RetainRVCallee, *AutoreleaseRVCallee, *ReleaseCallee,
+ *RetainCallee, *AutoreleaseCallee;
+
+ /// UsedInThisFunciton - Flags which determine whether each of the
+ /// interesting runtine functions is in fact used in the current function.
+ unsigned UsedInThisFunction;
+
+ /// ImpreciseReleaseMDKind - The Metadata Kind for clang.imprecise_release
+ /// metadata.
+ unsigned ImpreciseReleaseMDKind;
+
+ Constant *getRetainRVCallee(Module *M);
+ Constant *getAutoreleaseRVCallee(Module *M);
+ Constant *getReleaseCallee(Module *M);
+ Constant *getRetainCallee(Module *M);
+ Constant *getAutoreleaseCallee(Module *M);
+
+ void OptimizeRetainCall(Function &F, Instruction *Retain);
+ bool OptimizeRetainRVCall(Function &F, Instruction *RetainRV);
+ void OptimizeAutoreleaseRVCall(Function &F, Instruction *AutoreleaseRV);
+ void OptimizeIndividualCalls(Function &F);
+
+ void CheckForCFGHazards(const BasicBlock *BB,
+ DenseMap<const BasicBlock *, BBState> &BBStates,
+ BBState &MyStates) const;
+ bool VisitBottomUp(BasicBlock *BB,
+ DenseMap<const BasicBlock *, BBState> &BBStates,
+ MapVector<Value *, RRInfo> &Retains);
+ bool VisitTopDown(BasicBlock *BB,
+ DenseMap<const BasicBlock *, BBState> &BBStates,
+ DenseMap<Value *, RRInfo> &Releases);
+ bool Visit(Function &F,
+ DenseMap<const BasicBlock *, BBState> &BBStates,
+ MapVector<Value *, RRInfo> &Retains,
+ DenseMap<Value *, RRInfo> &Releases);
+
+ void MoveCalls(Value *Arg, RRInfo &RetainsToMove, RRInfo &ReleasesToMove,
+ MapVector<Value *, RRInfo> &Retains,
+ DenseMap<Value *, RRInfo> &Releases,
+ SmallVectorImpl<Instruction *> &DeadInsts);
+
+ bool PerformCodePlacement(DenseMap<const BasicBlock *, BBState> &BBStates,
+ MapVector<Value *, RRInfo> &Retains,
+ DenseMap<Value *, RRInfo> &Releases);
+
+ void OptimizeWeakCalls(Function &F);
+
+ bool OptimizeSequences(Function &F);
+
+ void OptimizeReturns(Function &F);
+
+ virtual void getAnalysisUsage(AnalysisUsage &AU) const;
+ virtual bool doInitialization(Module &M);
+ virtual bool runOnFunction(Function &F);
+ virtual void releaseMemory();
+
+ public:
+ static char ID;
+ ObjCARCOpt() : FunctionPass(ID) {
+ initializeObjCARCOptPass(*PassRegistry::getPassRegistry());
+ }
+ };
+}
+
+char ObjCARCOpt::ID = 0;
+INITIALIZE_PASS_BEGIN(ObjCARCOpt,
+ "objc-arc", "ObjC ARC optimization", false, false)
+INITIALIZE_PASS_DEPENDENCY(ObjCARCAliasAnalysis)
+INITIALIZE_PASS_END(ObjCARCOpt,
+ "objc-arc", "ObjC ARC optimization", false, false)
+
+Pass *llvm::createObjCARCOptPass() {
+ return new ObjCARCOpt();
+}
+
+void ObjCARCOpt::getAnalysisUsage(AnalysisUsage &AU) const {
+ AU.addRequired<ObjCARCAliasAnalysis>();
+ AU.addRequired<AliasAnalysis>();
+ // ARC optimization doesn't currently split critical edges.
+ AU.setPreservesCFG();
+}
+
+Constant *ObjCARCOpt::getRetainRVCallee(Module *M) {
+ if (!RetainRVCallee) {
+ LLVMContext &C = M->getContext();
+ Type *I8X = PointerType::getUnqual(Type::getInt8Ty(C));
+ std::vector<Type *> Params;
+ Params.push_back(I8X);
+ const FunctionType *FTy =
+ FunctionType::get(I8X, Params, /*isVarArg=*/false);
+ AttrListPtr Attributes;
+ Attributes.addAttr(~0u, Attribute::NoUnwind);
+ RetainRVCallee =
+ M->getOrInsertFunction("objc_retainAutoreleasedReturnValue", FTy,
+ Attributes);
+ }
+ return RetainRVCallee;
+}
+
+Constant *ObjCARCOpt::getAutoreleaseRVCallee(Module *M) {
+ if (!AutoreleaseRVCallee) {
+ LLVMContext &C = M->getContext();
+ Type *I8X = PointerType::getUnqual(Type::getInt8Ty(C));
+ std::vector<Type *> Params;
+ Params.push_back(I8X);
+ const FunctionType *FTy =
+ FunctionType::get(I8X, Params, /*isVarArg=*/false);
+ AttrListPtr Attributes;
+ Attributes.addAttr(~0u, Attribute::NoUnwind);
+ AutoreleaseRVCallee =
+ M->getOrInsertFunction("objc_autoreleaseReturnValue", FTy,
+ Attributes);
+ }
+ return AutoreleaseRVCallee;
+}
+
+Constant *ObjCARCOpt::getReleaseCallee(Module *M) {
+ if (!ReleaseCallee) {
+ LLVMContext &C = M->getContext();
+ std::vector<Type *> Params;
+ Params.push_back(PointerType::getUnqual(Type::getInt8Ty(C)));
+ AttrListPtr Attributes;
+ Attributes.addAttr(~0u, Attribute::NoUnwind);
+ ReleaseCallee =
+ M->getOrInsertFunction(
+ "objc_release",
+ FunctionType::get(Type::getVoidTy(C), Params, /*isVarArg=*/false),
+ Attributes);
+ }
+ return ReleaseCallee;
+}
+
+Constant *ObjCARCOpt::getRetainCallee(Module *M) {
+ if (!RetainCallee) {
+ LLVMContext &C = M->getContext();
+ std::vector<Type *> Params;
+ Params.push_back(PointerType::getUnqual(Type::getInt8Ty(C)));
+ AttrListPtr Attributes;
+ Attributes.addAttr(~0u, Attribute::NoUnwind);
+ RetainCallee =
+ M->getOrInsertFunction(
+ "objc_retain",
+ FunctionType::get(Params[0], Params, /*isVarArg=*/false),
+ Attributes);
+ }
+ return RetainCallee;
+}
+
+Constant *ObjCARCOpt::getAutoreleaseCallee(Module *M) {
+ if (!AutoreleaseCallee) {
+ LLVMContext &C = M->getContext();
+ std::vector<Type *> Params;
+ Params.push_back(PointerType::getUnqual(Type::getInt8Ty(C)));
+ AttrListPtr Attributes;
+ Attributes.addAttr(~0u, Attribute::NoUnwind);
+ AutoreleaseCallee =
+ M->getOrInsertFunction(
+ "objc_autorelease",
+ FunctionType::get(Params[0], Params, /*isVarArg=*/false),
+ Attributes);
+ }
+ return AutoreleaseCallee;
+}
+
+/// CanAlterRefCount - Test whether the given instruction can result in a
+/// reference count modification (positive or negative) for the pointer's
+/// object.
+static bool
+CanAlterRefCount(const Instruction *Inst, const Value *Ptr,
+ ProvenanceAnalysis &PA, InstructionClass Class) {
+ switch (Class) {
+ case IC_Autorelease:
+ case IC_AutoreleaseRV:
+ case IC_User:
+ // These operations never directly modify a reference count.
+ return false;
+ default: break;
+ }
+
+ ImmutableCallSite CS = static_cast<const Value *>(Inst);
+ assert(CS && "Only calls can alter reference counts!");
+
+ // See if AliasAnalysis can help us with the call.
+ AliasAnalysis::ModRefBehavior MRB = PA.getAA()->getModRefBehavior(CS);
+ if (AliasAnalysis::onlyReadsMemory(MRB))
+ return false;
+ if (AliasAnalysis::onlyAccessesArgPointees(MRB)) {
+ for (ImmutableCallSite::arg_iterator I = CS.arg_begin(), E = CS.arg_end();
+ I != E; ++I) {
+ const Value *Op = *I;
+ if (IsPotentialUse(Op) && PA.related(Ptr, Op))
+ return true;
+ }
+ return false;
+ }
+
+ // Assume the worst.
+ return true;
+}
+
+/// CanUse - Test whether the given instruction can "use" the given pointer's
+/// object in a way that requires the reference count to be positive.
+static bool
+CanUse(const Instruction *Inst, const Value *Ptr, ProvenanceAnalysis &PA,
+ InstructionClass Class) {
+ // IC_Call operations (as opposed to IC_CallOrUser) never "use" objc pointers.
+ if (Class == IC_Call)
+ return false;
+
+ // Consider various instructions which may have pointer arguments which are
+ // not "uses".
+ if (const ICmpInst *ICI = dyn_cast<ICmpInst>(Inst)) {
+ // Comparing a pointer with null, or any other constant, isn't really a use,
+ // because we don't care what the pointer points to, or about the values
+ // of any other dynamic reference-counted pointers.
+ if (!IsPotentialUse(ICI->getOperand(1)))
+ return false;
+ } else if (ImmutableCallSite CS = static_cast<const Value *>(Inst)) {
+ // For calls, just check the arguments (and not the callee operand).
+ for (ImmutableCallSite::arg_iterator OI = CS.arg_begin(),
+ OE = CS.arg_end(); OI != OE; ++OI) {
+ const Value *Op = *OI;
+ if (IsPotentialUse(Op) && PA.related(Ptr, Op))
+ return true;
+ }
+ return false;
+ } else if (const StoreInst *SI = dyn_cast<StoreInst>(Inst)) {
+ // Special-case stores, because we don't care about the stored value, just
+ // the store address.
+ const Value *Op = GetUnderlyingObjCPtr(SI->getPointerOperand());
+ // If we can't tell what the underlying object was, assume there is a
+ // dependence.
+ return IsPotentialUse(Op) && PA.related(Op, Ptr);
+ }
+
+ // Check each operand for a match.
+ for (User::const_op_iterator OI = Inst->op_begin(), OE = Inst->op_end();
+ OI != OE; ++OI) {
+ const Value *Op = *OI;
+ if (IsPotentialUse(Op) && PA.related(Ptr, Op))
+ return true;
+ }
+ return false;
+}
+
+/// CanInterruptRV - Test whether the given instruction can autorelease
+/// any pointer or cause an autoreleasepool pop.
+static bool
+CanInterruptRV(InstructionClass Class) {
+ switch (Class) {
+ case IC_AutoreleasepoolPop:
+ case IC_CallOrUser:
+ case IC_Call:
+ case IC_Autorelease:
+ case IC_AutoreleaseRV:
+ case IC_FusedRetainAutorelease:
+ case IC_FusedRetainAutoreleaseRV:
+ return true;
+ default:
+ return false;
+ }
+}
+
+namespace {
+ /// DependenceKind - There are several kinds of dependence-like concepts in
+ /// use here.
+ enum DependenceKind {
+ NeedsPositiveRetainCount,
+ CanChangeRetainCount,
+ RetainAutoreleaseDep, ///< Blocks objc_retainAutorelease.
+ RetainAutoreleaseRVDep, ///< Blocks objc_retainAutoreleaseReturnValue.
+ RetainRVDep ///< Blocks objc_retainAutoreleasedReturnValue.
+ };
+}
+
+/// Depends - Test if there can be dependencies on Inst through Arg. This
+/// function only tests dependencies relevant for removing pairs of calls.
+static bool
+Depends(DependenceKind Flavor, Instruction *Inst, const Value *Arg,
+ ProvenanceAnalysis &PA) {
+ // If we've reached the definition of Arg, stop.
+ if (Inst == Arg)
+ return true;
+
+ switch (Flavor) {
+ case NeedsPositiveRetainCount: {
+ InstructionClass Class = GetInstructionClass(Inst);
+ switch (Class) {
+ case IC_AutoreleasepoolPop:
+ case IC_AutoreleasepoolPush:
+ case IC_None:
+ return false;
+ default:
+ return CanUse(Inst, Arg, PA, Class);
+ }
+ }
+
+ case CanChangeRetainCount: {
+ InstructionClass Class = GetInstructionClass(Inst);
+ switch (Class) {
+ case IC_AutoreleasepoolPop:
+ // Conservatively assume this can decrement any count.
+ return true;
+ case IC_AutoreleasepoolPush:
+ case IC_None:
+ return false;
+ default:
+ return CanAlterRefCount(Inst, Arg, PA, Class);
+ }
+ }
+
+ case RetainAutoreleaseDep:
+ switch (GetBasicInstructionClass(Inst)) {
+ case IC_AutoreleasepoolPop:
+ // Don't merge an objc_autorelease with an objc_retain inside a different
+ // autoreleasepool scope.
+ return true;
+ case IC_Retain:
+ case IC_RetainRV:
+ // Check for a retain of the same pointer for merging.
+ return GetObjCArg(Inst) == Arg;
+ default:
+ // Nothing else matters for objc_retainAutorelease formation.
+ return false;
+ }
+ break;
+
+ case RetainAutoreleaseRVDep: {
+ InstructionClass Class = GetBasicInstructionClass(Inst);
+ switch (Class) {
+ case IC_Retain:
+ case IC_RetainRV:
+ // Check for a retain of the same pointer for merging.
+ return GetObjCArg(Inst) == Arg;
+ default:
+ // Anything that can autorelease interrupts
+ // retainAutoreleaseReturnValue formation.
+ return CanInterruptRV(Class);
+ }
+ break;
+ }
+
+ case RetainRVDep:
+ return CanInterruptRV(GetBasicInstructionClass(Inst));
+ }
+
+ llvm_unreachable("Invalid dependence flavor");
+ return true;
+}
+
+/// FindDependencies - Walk up the CFG from StartPos (which is in StartBB) and
+/// find local and non-local dependencies on Arg.
+/// TODO: Cache results?
+static void
+FindDependencies(DependenceKind Flavor,
+ const Value *Arg,
+ BasicBlock *StartBB, Instruction *StartInst,
+ SmallPtrSet<Instruction *, 4> &DependingInstructions,
+ SmallPtrSet<const BasicBlock *, 4> &Visited,
+ ProvenanceAnalysis &PA) {
+ BasicBlock::iterator StartPos = StartInst;
+
+ SmallVector<std::pair<BasicBlock *, BasicBlock::iterator>, 4> Worklist;
+ Worklist.push_back(std::make_pair(StartBB, StartPos));
+ do {
+ std::pair<BasicBlock *, BasicBlock::iterator> Pair =
+ Worklist.pop_back_val();
+ BasicBlock *LocalStartBB = Pair.first;
+ BasicBlock::iterator LocalStartPos = Pair.second;
+ BasicBlock::iterator StartBBBegin = LocalStartBB->begin();
+ for (;;) {
+ if (LocalStartPos == StartBBBegin) {
+ pred_iterator PI(LocalStartBB), PE(LocalStartBB, false);
+ if (PI == PE)
+ // If we've reached the function entry, produce a null dependence.
+ DependingInstructions.insert(0);
+ else
+ // Add the predecessors to the worklist.
+ do {
+ BasicBlock *PredBB = *PI;
+ if (Visited.insert(PredBB))
+ Worklist.push_back(std::make_pair(PredBB, PredBB->end()));
+ } while (++PI != PE);
+ break;
+ }
+
+ Instruction *Inst = --LocalStartPos;
+ if (Depends(Flavor, Inst, Arg, PA)) {
+ DependingInstructions.insert(Inst);
+ break;
+ }
+ }
+ } while (!Worklist.empty());
+
+ // Determine whether the original StartBB post-dominates all of the blocks we
+ // visited. If not, insert a sentinal indicating that most optimizations are
+ // not safe.
+ for (SmallPtrSet<const BasicBlock *, 4>::const_iterator I = Visited.begin(),
+ E = Visited.end(); I != E; ++I) {
+ const BasicBlock *BB = *I;
+ if (BB == StartBB)
+ continue;
+ const TerminatorInst *TI = cast<TerminatorInst>(&BB->back());
+ for (succ_const_iterator SI(TI), SE(TI, false); SI != SE; ++SI) {
+ const BasicBlock *Succ = *SI;
+ if (Succ != StartBB && !Visited.count(Succ)) {
+ DependingInstructions.insert(reinterpret_cast<Instruction *>(-1));
+ return;
+ }
+ }
+ }
+}
+
+static bool isNullOrUndef(const Value *V) {
+ return isa<ConstantPointerNull>(V) || isa<UndefValue>(V);
+}
+
+static bool isNoopInstruction(const Instruction *I) {
+ return isa<BitCastInst>(I) ||
+ (isa<GetElementPtrInst>(I) &&
+ cast<GetElementPtrInst>(I)->hasAllZeroIndices());
+}
+
+/// OptimizeRetainCall - Turn objc_retain into
+/// objc_retainAutoreleasedReturnValue if the operand is a return value.
+void
+ObjCARCOpt::OptimizeRetainCall(Function &F, Instruction *Retain) {
+ CallSite CS(GetObjCArg(Retain));
+ Instruction *Call = CS.getInstruction();
+ if (!Call) return;
+ if (Call->getParent() != Retain->getParent()) return;
+
+ // Check that the call is next to the retain.
+ BasicBlock::iterator I = Call;
+ ++I;
+ while (isNoopInstruction(I)) ++I;
+ if (&*I != Retain)
+ return;
+
+ // Turn it to an objc_retainAutoreleasedReturnValue..
+ Changed = true;
+ ++NumPeeps;
+ cast<CallInst>(Retain)->setCalledFunction(getRetainRVCallee(F.getParent()));
+}
+
+/// OptimizeRetainRVCall - Turn objc_retainAutoreleasedReturnValue into
+/// objc_retain if the operand is not a return value. Or, if it can be
+/// paired with an objc_autoreleaseReturnValue, delete the pair and
+/// return true.
+bool
+ObjCARCOpt::OptimizeRetainRVCall(Function &F, Instruction *RetainRV) {
+ // Check for the argument being from an immediately preceding call.
+ Value *Arg = GetObjCArg(RetainRV);
+ CallSite CS(Arg);
+ if (Instruction *Call = CS.getInstruction())
+ if (Call->getParent() == RetainRV->getParent()) {
+ BasicBlock::iterator I = Call;
+ ++I;
+ while (isNoopInstruction(I)) ++I;
+ if (&*I == RetainRV)
+ return false;
+ }
+
+ // Check for being preceded by an objc_autoreleaseReturnValue on the same
+ // pointer. In this case, we can delete the pair.
+ BasicBlock::iterator I = RetainRV, Begin = RetainRV->getParent()->begin();
+ if (I != Begin) {
+ do --I; while (I != Begin && isNoopInstruction(I));
+ if (GetBasicInstructionClass(I) == IC_AutoreleaseRV &&
+ GetObjCArg(I) == Arg) {
+ Changed = true;
+ ++NumPeeps;
+ EraseInstruction(I);
+ EraseInstruction(RetainRV);
+ return true;
+ }
+ }
+
+ // Turn it to a plain objc_retain.
+ Changed = true;
+ ++NumPeeps;
+ cast<CallInst>(RetainRV)->setCalledFunction(getRetainCallee(F.getParent()));
+ return false;
+}
+
+/// OptimizeAutoreleaseRVCall - Turn objc_autoreleaseReturnValue into
+/// objc_autorelease if the result is not used as a return value.
+void
+ObjCARCOpt::OptimizeAutoreleaseRVCall(Function &F, Instruction *AutoreleaseRV) {
+ // Check for a return of the pointer value.
+ const Value *Ptr = GetObjCArg(AutoreleaseRV);
+ for (Value::const_use_iterator UI = Ptr->use_begin(), UE = Ptr->use_end();
+ UI != UE; ++UI) {
+ const User *I = *UI;
+ if (isa<ReturnInst>(I) || GetBasicInstructionClass(I) == IC_RetainRV)
+ return;
+ }
+
+ Changed = true;
+ ++NumPeeps;
+ cast<CallInst>(AutoreleaseRV)->
+ setCalledFunction(getAutoreleaseCallee(F.getParent()));
+}
+
+/// OptimizeIndividualCalls - Visit each call, one at a time, and make
+/// simplifications without doing any additional analysis.
+void ObjCARCOpt::OptimizeIndividualCalls(Function &F) {
+ // Reset all the flags in preparation for recomputing them.
+ UsedInThisFunction = 0;
+
+ // Visit all objc_* calls in F.
+ for (inst_iterator I = inst_begin(&F), E = inst_end(&F); I != E; ) {
+ Instruction *Inst = &*I++;
+ InstructionClass Class = GetBasicInstructionClass(Inst);
+
+ switch (Class) {
+ default: break;
+
+ // Delete no-op casts. These function calls have special semantics, but
+ // the semantics are entirely implemented via lowering in the front-end,
+ // so by the time they reach the optimizer, they are just no-op calls
+ // which return their argument.
+ //
+ // There are gray areas here, as the ability to cast reference-counted
+ // pointers to raw void* and back allows code to break ARC assumptions,
+ // however these are currently considered to be unimportant.
+ case IC_NoopCast:
+ Changed = true;
+ ++NumNoops;
+ EraseInstruction(Inst);
+ continue;
+
+ // If the pointer-to-weak-pointer is null, it's undefined behavior.
+ case IC_StoreWeak:
+ case IC_LoadWeak:
+ case IC_LoadWeakRetained:
+ case IC_InitWeak:
+ case IC_DestroyWeak: {
+ CallInst *CI = cast<CallInst>(Inst);
+ if (isNullOrUndef(CI->getArgOperand(0))) {
+ const Type *Ty = CI->getArgOperand(0)->getType();
+ new StoreInst(UndefValue::get(cast<PointerType>(Ty)->getElementType()),
+ Constant::getNullValue(Ty),
+ CI);
+ CI->replaceAllUsesWith(UndefValue::get(CI->getType()));
+ CI->eraseFromParent();
+ continue;
+ }
+ break;
+ }
+ case IC_CopyWeak:
+ case IC_MoveWeak: {
+ CallInst *CI = cast<CallInst>(Inst);
+ if (isNullOrUndef(CI->getArgOperand(0)) ||
+ isNullOrUndef(CI->getArgOperand(1))) {
+ const Type *Ty = CI->getArgOperand(0)->getType();
+ new StoreInst(UndefValue::get(cast<PointerType>(Ty)->getElementType()),
+ Constant::getNullValue(Ty),
+ CI);
+ CI->replaceAllUsesWith(UndefValue::get(CI->getType()));
+ CI->eraseFromParent();
+ continue;
+ }
+ break;
+ }
+ case IC_Retain:
+ OptimizeRetainCall(F, Inst);
+ break;
+ case IC_RetainRV:
+ if (OptimizeRetainRVCall(F, Inst))
+ continue;
+ break;
+ case IC_AutoreleaseRV:
+ OptimizeAutoreleaseRVCall(F, Inst);
+ break;
+ }
+
+ // objc_autorelease(x) -> objc_release(x) if x is otherwise unused.
+ if (IsAutorelease(Class) && Inst->use_empty()) {
+ CallInst *Call = cast<CallInst>(Inst);
+ const Value *Arg = Call->getArgOperand(0);
+ Arg = FindSingleUseIdentifiedObject(Arg);
+ if (Arg) {
+ Changed = true;
+ ++NumAutoreleases;
+
+ // Create the declaration lazily.
+ LLVMContext &C = Inst->getContext();
+ CallInst *NewCall =
+ CallInst::Create(getReleaseCallee(F.getParent()),
+ Call->getArgOperand(0), "", Call);
+ NewCall->setMetadata(ImpreciseReleaseMDKind,
+ MDNode::get(C, ArrayRef<Value *>()));
+ EraseInstruction(Call);
+ Inst = NewCall;
+ Class = IC_Release;
+ }
+ }
+
+ // For functions which can never be passed stack arguments, add
+ // a tail keyword.
+ if (IsAlwaysTail(Class)) {
+ Changed = true;
+ cast<CallInst>(Inst)->setTailCall();
+ }
+
+ // Set nounwind as needed.
+ if (IsNoThrow(Class)) {
+ Changed = true;
+ cast<CallInst>(Inst)->setDoesNotThrow();
+ }
+
+ if (!IsNoopOnNull(Class)) {
+ UsedInThisFunction |= 1 << Class;
+ continue;
+ }
+
+ const Value *Arg = GetObjCArg(Inst);
+
+ // ARC calls with null are no-ops. Delete them.
+ if (isNullOrUndef(Arg)) {
+ Changed = true;
+ ++NumNoops;
+ EraseInstruction(Inst);
+ continue;
+ }
+
+ // Keep track of which of retain, release, autorelease, and retain_block
+ // are actually present in this function.
+ UsedInThisFunction |= 1 << Class;
+
+ // If Arg is a PHI, and one or more incoming values to the
+ // PHI are null, and the call is control-equivalent to the PHI, and there
+ // are no relevant side effects between the PHI and the call, the call
+ // could be pushed up to just those paths with non-null incoming values.
+ // For now, don't bother splitting critical edges for this.
+ SmallVector<std::pair<Instruction *, const Value *>, 4> Worklist;
+ Worklist.push_back(std::make_pair(Inst, Arg));
+ do {
+ std::pair<Instruction *, const Value *> Pair = Worklist.pop_back_val();
+ Inst = Pair.first;
+ Arg = Pair.second;
+
+ const PHINode *PN = dyn_cast<PHINode>(Arg);
+ if (!PN) continue;
+
+ // Determine if the PHI has any null operands, or any incoming
+ // critical edges.
+ bool HasNull = false;
+ bool HasCriticalEdges = false;
+ for (unsigned i = 0, e = PN->getNumIncomingValues(); i != e; ++i) {
+ Value *Incoming =
+ StripPointerCastsAndObjCCalls(PN->getIncomingValue(i));
+ if (isNullOrUndef(Incoming))
+ HasNull = true;
+ else if (cast<TerminatorInst>(PN->getIncomingBlock(i)->back())
+ .getNumSuccessors() != 1) {
+ HasCriticalEdges = true;
+ break;
+ }
+ }
+ // If we have null operands and no critical edges, optimize.
+ if (!HasCriticalEdges && HasNull) {
+ SmallPtrSet<Instruction *, 4> DependingInstructions;
+ SmallPtrSet<const BasicBlock *, 4> Visited;
+
+ // Check that there is nothing that cares about the reference
+ // count between the call and the phi.
+ FindDependencies(NeedsPositiveRetainCount, Arg,
+ Inst->getParent(), Inst,
+ DependingInstructions, Visited, PA);
+ if (DependingInstructions.size() == 1 &&
+ *DependingInstructions.begin() == PN) {
+ Changed = true;
+ ++NumPartialNoops;
+ // Clone the call into each predecessor that has a non-null value.
+ CallInst *CInst = cast<CallInst>(Inst);
+ const Type *ParamTy = CInst->getArgOperand(0)->getType();
+ for (unsigned i = 0, e = PN->getNumIncomingValues(); i != e; ++i) {
+ Value *Incoming =
+ StripPointerCastsAndObjCCalls(PN->getIncomingValue(i));
+ if (!isNullOrUndef(Incoming)) {
+ CallInst *Clone = cast<CallInst>(CInst->clone());
+ Value *Op = PN->getIncomingValue(i);
+ Instruction *InsertPos = &PN->getIncomingBlock(i)->back();
+ if (Op->getType() != ParamTy)
+ Op = new BitCastInst(Op, ParamTy, "", InsertPos);
+ Clone->setArgOperand(0, Op);
+ Clone->insertBefore(InsertPos);
+ Worklist.push_back(std::make_pair(Clone, Incoming));
+ }
+ }
+ // Erase the original call.
+ EraseInstruction(CInst);
+ continue;
+ }
+ }
+ } while (!Worklist.empty());
+ }
+}
+
+/// CheckForCFGHazards - Check for critical edges, loop boundaries, irreducible
+/// control flow, or other CFG structures where moving code across the edge
+/// would result in it being executed more.
+void
+ObjCARCOpt::CheckForCFGHazards(const BasicBlock *BB,
+ DenseMap<const BasicBlock *, BBState> &BBStates,
+ BBState &MyStates) const {
+ // If any top-down local-use or possible-dec has a succ which is earlier in
+ // the sequence, forget it.
+ for (BBState::ptr_const_iterator I = MyStates.top_down_ptr_begin(),
+ E = MyStates.top_down_ptr_end(); I != E; ++I)
+ switch (I->second.GetSeq()) {
+ default: break;
+ case S_Use: {
+ const Value *Arg = I->first;
+ const TerminatorInst *TI = cast<TerminatorInst>(&BB->back());
+ bool SomeSuccHasSame = false;
+ bool AllSuccsHaveSame = true;
+ for (succ_const_iterator SI(TI), SE(TI, false); SI != SE; ++SI)
+ switch (BBStates[*SI].getPtrBottomUpState(Arg).GetSeq()) {
+ case S_None:
+ case S_CanRelease:
+ MyStates.getPtrTopDownState(Arg).ClearSequenceProgress();
+ SomeSuccHasSame = false;
+ break;
+ case S_Use:
+ SomeSuccHasSame = true;
+ break;
+ case S_Stop:
+ case S_Release:
+ case S_MovableRelease:
+ AllSuccsHaveSame = false;
+ break;
+ case S_Retain:
+ llvm_unreachable("bottom-up pointer in retain state!");
+ }
+ // If the state at the other end of any of the successor edges
+ // matches the current state, require all edges to match. This
+ // guards against loops in the middle of a sequence.
+ if (SomeSuccHasSame && !AllSuccsHaveSame)
+ MyStates.getPtrTopDownState(Arg).ClearSequenceProgress();
+ }
+ case S_CanRelease: {
+ const Value *Arg = I->first;
+ const TerminatorInst *TI = cast<TerminatorInst>(&BB->back());
+ bool SomeSuccHasSame = false;
+ bool AllSuccsHaveSame = true;
+ for (succ_const_iterator SI(TI), SE(TI, false); SI != SE; ++SI)
+ switch (BBStates[*SI].getPtrBottomUpState(Arg).GetSeq()) {
+ case S_None:
+ MyStates.getPtrTopDownState(Arg).ClearSequenceProgress();
+ SomeSuccHasSame = false;
+ break;
+ case S_CanRelease:
+ SomeSuccHasSame = true;
+ break;
+ case S_Stop:
+ case S_Release:
+ case S_MovableRelease:
+ case S_Use:
+ AllSuccsHaveSame = false;
+ break;
+ case S_Retain:
+ llvm_unreachable("bottom-up pointer in retain state!");
+ }
+ // If the state at the other end of any of the successor edges
+ // matches the current state, require all edges to match. This
+ // guards against loops in the middle of a sequence.
+ if (SomeSuccHasSame && !AllSuccsHaveSame)
+ MyStates.getPtrTopDownState(Arg).ClearSequenceProgress();
+ }
+ }
+}
+
+bool
+ObjCARCOpt::VisitBottomUp(BasicBlock *BB,
+ DenseMap<const BasicBlock *, BBState> &BBStates,
+ MapVector<Value *, RRInfo> &Retains) {
+ bool NestingDetected = false;
+ BBState &MyStates = BBStates[BB];
+
+ // Merge the states from each successor to compute the initial state
+ // for the current block.
+ const TerminatorInst *TI = cast<TerminatorInst>(&BB->back());
+ succ_const_iterator SI(TI), SE(TI, false);
+ if (SI == SE)
+ MyStates.SetAsExit();
+ else
+ do {
+ const BasicBlock *Succ = *SI++;
+ if (Succ == BB)
+ continue;
+ DenseMap<const BasicBlock *, BBState>::iterator I = BBStates.find(Succ);
+ if (I == BBStates.end())
+ continue;
+ MyStates.InitFromSucc(I->second);
+ while (SI != SE) {
+ Succ = *SI++;
+ if (Succ != BB) {
+ I = BBStates.find(Succ);
+ if (I != BBStates.end())
+ MyStates.MergeSucc(I->second);
+ }
+ }
+ break;
+ } while (SI != SE);
+
+ // Visit all the instructions, bottom-up.
+ for (BasicBlock::iterator I = BB->end(), E = BB->begin(); I != E; --I) {
+ Instruction *Inst = llvm::prior(I);
+ InstructionClass Class = GetInstructionClass(Inst);
+ const Value *Arg = 0;
+
+ switch (Class) {
+ case IC_Release: {
+ Arg = GetObjCArg(Inst);
+
+ PtrState &S = MyStates.getPtrBottomUpState(Arg);
+
+ // If we see two releases in a row on the same pointer. If so, make
+ // a note, and we'll cicle back to revisit it after we've
+ // hopefully eliminated the second release, which may allow us to
+ // eliminate the first release too.
+ // Theoretically we could implement removal of nested retain+release
+ // pairs by making PtrState hold a stack of states, but this is
+ // simple and avoids adding overhead for the non-nested case.
+ if (S.GetSeq() == S_Release || S.GetSeq() == S_MovableRelease)
+ NestingDetected = true;
+
+ S.SetSeqToRelease(Inst->getMetadata(ImpreciseReleaseMDKind));
+ S.RRI.clear();
+ S.RRI.KnownIncremented = S.IsKnownIncremented();
+ S.RRI.IsTailCallRelease = cast<CallInst>(Inst)->isTailCall();
+ S.RRI.Calls.insert(Inst);
+
+ S.IncrementRefCount();
+ break;
+ }
+ case IC_RetainBlock:
+ case IC_Retain:
+ case IC_RetainRV: {
+ Arg = GetObjCArg(Inst);
+
+ PtrState &S = MyStates.getPtrBottomUpState(Arg);
+ S.DecrementRefCount();
+
+ switch (S.GetSeq()) {
+ case S_Stop:
+ case S_Release:
+ case S_MovableRelease:
+ case S_Use:
+ S.RRI.ReverseInsertPts.clear();
+ // FALL THROUGH
+ case S_CanRelease:
+ // Don't do retain+release tracking for IC_RetainRV, because it's
+ // better to let it remain as the first instruction after a call.
+ if (Class != IC_RetainRV) {
+ S.RRI.IsRetainBlock = Class == IC_RetainBlock;
+ Retains[Inst] = S.RRI;
+ }
+ S.ClearSequenceProgress();
+ break;
+ case S_None:
+ break;
+ case S_Retain:
+ llvm_unreachable("bottom-up pointer in retain state!");
+ }
+ break;
+ }
+ case IC_AutoreleasepoolPop:
+ // Conservatively, clear MyStates for all known pointers.
+ MyStates.clearBottomUpPointers();
+ continue;
+ case IC_AutoreleasepoolPush:
+ case IC_None:
+ // These are irrelevant.
+ continue;
+ default:
+ break;
+ }
+
+ // Consider any other possible effects of this instruction on each
+ // pointer being tracked.
+ for (BBState::ptr_iterator MI = MyStates.bottom_up_ptr_begin(),
+ ME = MyStates.bottom_up_ptr_end(); MI != ME; ++MI) {
+ const Value *Ptr = MI->first;
+ if (Ptr == Arg)
+ continue; // Handled above.
+ PtrState &S = MI->second;
+ Sequence Seq = S.GetSeq();
+
+ // Check for possible retains and releases.
+ if (CanAlterRefCount(Inst, Ptr, PA, Class)) {
+ // Check for a retain (we're going bottom-up here).
+ S.DecrementRefCount();
+
+ // Check for a release.
+ if (!IsRetain(Class) && Class != IC_RetainBlock)
+ switch (Seq) {
+ case S_Use:
+ S.SetSeq(S_CanRelease);
+ continue;
+ case S_CanRelease:
+ case S_Release:
+ case S_MovableRelease:
+ case S_Stop:
+ case S_None:
+ break;
+ case S_Retain:
+ llvm_unreachable("bottom-up pointer in retain state!");
+ }
+ }
+
+ // Check for possible direct uses.
+ switch (Seq) {
+ case S_Release:
+ case S_MovableRelease:
+ if (CanUse(Inst, Ptr, PA, Class)) {
+ S.RRI.ReverseInsertPts.clear();
+ S.RRI.ReverseInsertPts.insert(Inst);
+ S.SetSeq(S_Use);
+ } else if (Seq == S_Release &&
+ (Class == IC_User || Class == IC_CallOrUser)) {
+ // Non-movable releases depend on any possible objc pointer use.
+ S.SetSeq(S_Stop);
+ S.RRI.ReverseInsertPts.clear();
+ S.RRI.ReverseInsertPts.insert(Inst);
+ }
+ break;
+ case S_Stop:
+ if (CanUse(Inst, Ptr, PA, Class))
+ S.SetSeq(S_Use);
+ break;
+ case S_CanRelease:
+ case S_Use:
+ case S_None:
+ break;
+ case S_Retain:
+ llvm_unreachable("bottom-up pointer in retain state!");
+ }
+ }
+ }
+
+ return NestingDetected;
+}
+
+bool
+ObjCARCOpt::VisitTopDown(BasicBlock *BB,
+ DenseMap<const BasicBlock *, BBState> &BBStates,
+ DenseMap<Value *, RRInfo> &Releases) {
+ bool NestingDetected = false;
+ BBState &MyStates = BBStates[BB];
+
+ // Merge the states from each predecessor to compute the initial state
+ // for the current block.
+ const_pred_iterator PI(BB), PE(BB, false);
+ if (PI == PE)
+ MyStates.SetAsEntry();
+ else
+ do {
+ const BasicBlock *Pred = *PI++;
+ if (Pred == BB)
+ continue;
+ DenseMap<const BasicBlock *, BBState>::iterator I = BBStates.find(Pred);
+ if (I == BBStates.end())
+ continue;
+ MyStates.InitFromPred(I->second);
+ while (PI != PE) {
+ Pred = *PI++;
+ if (Pred != BB) {
+ I = BBStates.find(Pred);
+ if (I != BBStates.end())
+ MyStates.MergePred(I->second);
+ }
+ }
+ break;
+ } while (PI != PE);
+
+ // Visit all the instructions, top-down.
+ for (BasicBlock::iterator I = BB->begin(), E = BB->end(); I != E; ++I) {
+ Instruction *Inst = I;
+ InstructionClass Class = GetInstructionClass(Inst);
+ const Value *Arg = 0;
+
+ switch (Class) {
+ case IC_RetainBlock:
+ case IC_Retain:
+ case IC_RetainRV: {
+ Arg = GetObjCArg(Inst);
+
+ PtrState &S = MyStates.getPtrTopDownState(Arg);
+
+ // Don't do retain+release tracking for IC_RetainRV, because it's
+ // better to let it remain as the first instruction after a call.
+ if (Class != IC_RetainRV) {
+ // If we see two retains in a row on the same pointer. If so, make
+ // a note, and we'll cicle back to revisit it after we've
+ // hopefully eliminated the second retain, which may allow us to
+ // eliminate the first retain too.
+ // Theoretically we could implement removal of nested retain+release
+ // pairs by making PtrState hold a stack of states, but this is
+ // simple and avoids adding overhead for the non-nested case.
+ if (S.GetSeq() == S_Retain)
+ NestingDetected = true;
+
+ S.SetSeq(S_Retain);
+ S.RRI.clear();
+ S.RRI.IsRetainBlock = Class == IC_RetainBlock;
+ S.RRI.KnownIncremented = S.IsKnownIncremented();
+ S.RRI.Calls.insert(Inst);
+ }
+
+ S.IncrementRefCount();
+ break;
+ }
+ case IC_Release: {
+ Arg = GetObjCArg(Inst);
+
+ PtrState &S = MyStates.getPtrTopDownState(Arg);
+ S.DecrementRefCount();
+
+ switch (S.GetSeq()) {
+ case S_Retain:
+ case S_CanRelease:
+ S.RRI.ReverseInsertPts.clear();
+ // FALL THROUGH
+ case S_Use:
+ S.RRI.ReleaseMetadata = Inst->getMetadata(ImpreciseReleaseMDKind);
+ S.RRI.IsTailCallRelease = cast<CallInst>(Inst)->isTailCall();
+ Releases[Inst] = S.RRI;
+ S.ClearSequenceProgress();
+ break;
+ case S_None:
+ break;
+ case S_Stop:
+ case S_Release:
+ case S_MovableRelease:
+ llvm_unreachable("top-down pointer in release state!");
+ }
+ break;
+ }
+ case IC_AutoreleasepoolPop:
+ // Conservatively, clear MyStates for all known pointers.
+ MyStates.clearTopDownPointers();
+ continue;
+ case IC_AutoreleasepoolPush:
+ case IC_None:
+ // These are irrelevant.
+ continue;
+ default:
+ break;
+ }
+
+ // Consider any other possible effects of this instruction on each
+ // pointer being tracked.
+ for (BBState::ptr_iterator MI = MyStates.top_down_ptr_begin(),
+ ME = MyStates.top_down_ptr_end(); MI != ME; ++MI) {
+ const Value *Ptr = MI->first;
+ if (Ptr == Arg)
+ continue; // Handled above.
+ PtrState &S = MI->second;
+ Sequence Seq = S.GetSeq();
+
+ // Check for possible releases.
+ if (!IsRetain(Class) && Class != IC_RetainBlock &&
+ CanAlterRefCount(Inst, Ptr, PA, Class)) {
+ // Check for a release.
+ S.DecrementRefCount();
+
+ // Check for a release.
+ switch (Seq) {
+ case S_Retain:
+ S.SetSeq(S_CanRelease);
+ S.RRI.ReverseInsertPts.clear();
+ S.RRI.ReverseInsertPts.insert(Inst);
+
+ // One call can't cause a transition from S_Retain to S_CanRelease
+ // and S_CanRelease to S_Use. If we've made the first transition,
+ // we're done.
+ continue;
+ case S_Use:
+ case S_CanRelease:
+ case S_None:
+ break;
+ case S_Stop:
+ case S_Release:
+ case S_MovableRelease:
+ llvm_unreachable("top-down pointer in release state!");
+ }
+ }
+
+ // Check for possible direct uses.
+ switch (Seq) {
+ case S_CanRelease:
+ if (CanUse(Inst, Ptr, PA, Class))
+ S.SetSeq(S_Use);
+ break;
+ case S_Use:
+ case S_Retain:
+ case S_None:
+ break;
+ case S_Stop:
+ case S_Release:
+ case S_MovableRelease:
+ llvm_unreachable("top-down pointer in release state!");
+ }
+ }
+ }
+
+ CheckForCFGHazards(BB, BBStates, MyStates);
+ return NestingDetected;
+}
+
+// Visit - Visit the function both top-down and bottom-up.
+bool
+ObjCARCOpt::Visit(Function &F,
+ DenseMap<const BasicBlock *, BBState> &BBStates,
+ MapVector<Value *, RRInfo> &Retains,
+ DenseMap<Value *, RRInfo> &Releases) {
+ // Use postorder for bottom-up, and reverse-postorder for top-down, because we
+ // magically know that loops will be well behaved, i.e. they won't repeatedly
+ // call retain on a single pointer without doing a release.
+ bool BottomUpNestingDetected = false;
+ SmallVector<BasicBlock *, 8> PostOrder;
+ for (po_iterator<Function *> I = po_begin(&F), E = po_end(&F); I != E; ++I) {
+ BasicBlock *BB = *I;
+ PostOrder.push_back(BB);
+
+ BottomUpNestingDetected |= VisitBottomUp(BB, BBStates, Retains);
+ }
+
+ // Iterate through the post-order in reverse order, achieving a
+ // reverse-postorder traversal. We don't use the ReversePostOrderTraversal
+ // class here because it works by computing its own full postorder iteration,
+ // recording the sequence, and playing it back in reverse. Since we're already
+ // doing a full iteration above, we can just record the sequence manually and
+ // avoid the cost of having ReversePostOrderTraversal compute it.
+ bool TopDownNestingDetected = false;
+ for (SmallVectorImpl<BasicBlock *>::const_reverse_iterator
+ RI = PostOrder.rbegin(), RE = PostOrder.rend(); RI != RE; ++RI)
+ TopDownNestingDetected |= VisitTopDown(*RI, BBStates, Releases);
+
+ return TopDownNestingDetected && BottomUpNestingDetected;
+}
+
+/// MoveCalls - Move the calls in RetainsToMove and ReleasesToMove.
+void ObjCARCOpt::MoveCalls(Value *Arg,
+ RRInfo &RetainsToMove,
+ RRInfo &ReleasesToMove,
+ MapVector<Value *, RRInfo> &Retains,
+ DenseMap<Value *, RRInfo> &Releases,
+ SmallVectorImpl<Instruction *> &DeadInsts) {
+ const Type *ArgTy = Arg->getType();
+ const Type *ParamTy =
+ (RetainRVFunc ? RetainRVFunc :
+ RetainFunc ? RetainFunc :
+ RetainBlockFunc)->arg_begin()->getType();
+
+ // Insert the new retain and release calls.
+ for (SmallPtrSet<Instruction *, 2>::const_iterator
+ PI = ReleasesToMove.ReverseInsertPts.begin(),
+ PE = ReleasesToMove.ReverseInsertPts.end(); PI != PE; ++PI) {
+ Instruction *InsertPt = *PI;
+ Value *MyArg = ArgTy == ParamTy ? Arg :
+ new BitCastInst(Arg, ParamTy, "", InsertPt);
+ CallInst *Call =
+ CallInst::Create(RetainsToMove.IsRetainBlock ?
+ RetainBlockFunc : RetainFunc,
+ MyArg, "", InsertPt);
+ Call->setDoesNotThrow();
+ if (!RetainsToMove.IsRetainBlock)
+ Call->setTailCall();
+ }
+ for (SmallPtrSet<Instruction *, 2>::const_iterator
+ PI = RetainsToMove.ReverseInsertPts.begin(),
+ PE = RetainsToMove.ReverseInsertPts.end(); PI != PE; ++PI) {
+ Instruction *LastUse = *PI;
+ Instruction *InsertPts[] = { 0, 0, 0 };
+ if (InvokeInst *II = dyn_cast<InvokeInst>(LastUse)) {
+ // We can't insert code immediately after an invoke instruction, so
+ // insert code at the beginning of both successor blocks instead.
+ // The invoke's return value isn't available in the unwind block,
+ // but our releases will never depend on it, because they must be
+ // paired with retains from before the invoke.
+ InsertPts[0] = II->getNormalDest()->getFirstNonPHI();
+ InsertPts[1] = II->getUnwindDest()->getFirstNonPHI();
+ } else {
+ // Insert code immediately after the last use.
+ InsertPts[0] = llvm::next(BasicBlock::iterator(LastUse));
+ }
+
+ for (Instruction **I = InsertPts; *I; ++I) {
+ Instruction *InsertPt = *I;
+ Value *MyArg = ArgTy == ParamTy ? Arg :
+ new BitCastInst(Arg, ParamTy, "", InsertPt);
+ CallInst *Call = CallInst::Create(ReleaseFunc, MyArg, "", InsertPt);
+ // Attach a clang.imprecise_release metadata tag, if appropriate.
+ if (MDNode *M = ReleasesToMove.ReleaseMetadata)
+ Call->setMetadata(ImpreciseReleaseMDKind, M);
+ Call->setDoesNotThrow();
+ if (ReleasesToMove.IsTailCallRelease)
+ Call->setTailCall();
+ }
+ }
+
+ // Delete the original retain and release calls.
+ for (SmallPtrSet<Instruction *, 2>::const_iterator
+ AI = RetainsToMove.Calls.begin(),
+ AE = RetainsToMove.Calls.end(); AI != AE; ++AI) {
+ Instruction *OrigRetain = *AI;
+ Retains.blot(OrigRetain);
+ DeadInsts.push_back(OrigRetain);
+ }
+ for (SmallPtrSet<Instruction *, 2>::const_iterator
+ AI = ReleasesToMove.Calls.begin(),
+ AE = ReleasesToMove.Calls.end(); AI != AE; ++AI) {
+ Instruction *OrigRelease = *AI;
+ Releases.erase(OrigRelease);
+ DeadInsts.push_back(OrigRelease);
+ }
+}
+
+bool
+ObjCARCOpt::PerformCodePlacement(DenseMap<const BasicBlock *, BBState>
+ &BBStates,
+ MapVector<Value *, RRInfo> &Retains,
+ DenseMap<Value *, RRInfo> &Releases) {
+ bool AnyPairsCompletelyEliminated = false;
+ RRInfo RetainsToMove;
+ RRInfo ReleasesToMove;
+ SmallVector<Instruction *, 4> NewRetains;
+ SmallVector<Instruction *, 4> NewReleases;
+ SmallVector<Instruction *, 8> DeadInsts;
+
+ for (MapVector<Value *, RRInfo>::const_iterator I = Retains.begin(),
+ E = Retains.end(); I != E; ) {
+ Value *V = (I++)->first;
+ if (!V) continue; // blotted
+
+ Instruction *Retain = cast<Instruction>(V);
+ Value *Arg = GetObjCArg(Retain);
+
+ // If the object being released is in static or stack storage, we know it's
+ // not being managed by ObjC reference counting, so we can delete pairs
+ // regardless of what possible decrements or uses lie between them.
+ bool KnownSafe = isa<Constant>(Arg) || isa<AllocaInst>(Arg);
+
+ // If a pair happens in a region where it is known that the reference count
+ // is already incremented, we can similarly ignore possible decrements.
+ bool KnownIncrementedTD = true, KnownIncrementedBU = true;
+
+ // Connect the dots between the top-down-collected RetainsToMove and
+ // bottom-up-collected ReleasesToMove to form sets of related calls.
+ // This is an iterative process so that we connect multiple releases
+ // to multiple retains if needed.
+ unsigned OldDelta = 0;
+ unsigned NewDelta = 0;
+ unsigned OldCount = 0;
+ unsigned NewCount = 0;
+ bool FirstRelease = true;
+ bool FirstRetain = true;
+ NewRetains.push_back(Retain);
+ for (;;) {
+ for (SmallVectorImpl<Instruction *>::const_iterator
+ NI = NewRetains.begin(), NE = NewRetains.end(); NI != NE; ++NI) {
+ Instruction *NewRetain = *NI;
+ MapVector<Value *, RRInfo>::const_iterator It = Retains.find(NewRetain);
+ assert(It != Retains.end());
+ const RRInfo &NewRetainRRI = It->second;
+ KnownIncrementedTD &= NewRetainRRI.KnownIncremented;
+ for (SmallPtrSet<Instruction *, 2>::const_iterator
+ LI = NewRetainRRI.Calls.begin(),
+ LE = NewRetainRRI.Calls.end(); LI != LE; ++LI) {
+ Instruction *NewRetainRelease = *LI;
+ DenseMap<Value *, RRInfo>::const_iterator Jt =
+ Releases.find(NewRetainRelease);
+ if (Jt == Releases.end())
+ goto next_retain;
+ const RRInfo &NewRetainReleaseRRI = Jt->second;
+ assert(NewRetainReleaseRRI.Calls.count(NewRetain));
+ if (ReleasesToMove.Calls.insert(NewRetainRelease)) {
+ OldDelta -=
+ BBStates[NewRetainRelease->getParent()].GetAllPathCount();
+
+ // Merge the ReleaseMetadata and IsTailCallRelease values.
+ if (FirstRelease) {
+ ReleasesToMove.ReleaseMetadata =
+ NewRetainReleaseRRI.ReleaseMetadata;
+ ReleasesToMove.IsTailCallRelease =
+ NewRetainReleaseRRI.IsTailCallRelease;
+ FirstRelease = false;
+ } else {
+ if (ReleasesToMove.ReleaseMetadata !=
+ NewRetainReleaseRRI.ReleaseMetadata)
+ ReleasesToMove.ReleaseMetadata = 0;
+ if (ReleasesToMove.IsTailCallRelease !=
+ NewRetainReleaseRRI.IsTailCallRelease)
+ ReleasesToMove.IsTailCallRelease = false;
+ }
+
+ // Collect the optimal insertion points.
+ if (!KnownSafe)
+ for (SmallPtrSet<Instruction *, 2>::const_iterator
+ RI = NewRetainReleaseRRI.ReverseInsertPts.begin(),
+ RE = NewRetainReleaseRRI.ReverseInsertPts.end();
+ RI != RE; ++RI) {
+ Instruction *RIP = *RI;
+ if (ReleasesToMove.ReverseInsertPts.insert(RIP))
+ NewDelta -= BBStates[RIP->getParent()].GetAllPathCount();
+ }
+ NewReleases.push_back(NewRetainRelease);
+ }
+ }
+ }
+ NewRetains.clear();
+ if (NewReleases.empty()) break;
+
+ // Back the other way.
+ for (SmallVectorImpl<Instruction *>::const_iterator
+ NI = NewReleases.begin(), NE = NewReleases.end(); NI != NE; ++NI) {
+ Instruction *NewRelease = *NI;
+ DenseMap<Value *, RRInfo>::const_iterator It =
+ Releases.find(NewRelease);
+ assert(It != Releases.end());
+ const RRInfo &NewReleaseRRI = It->second;
+ KnownIncrementedBU &= NewReleaseRRI.KnownIncremented;
+ for (SmallPtrSet<Instruction *, 2>::const_iterator
+ LI = NewReleaseRRI.Calls.begin(),
+ LE = NewReleaseRRI.Calls.end(); LI != LE; ++LI) {
+ Instruction *NewReleaseRetain = *LI;
+ MapVector<Value *, RRInfo>::const_iterator Jt =
+ Retains.find(NewReleaseRetain);
+ if (Jt == Retains.end())
+ goto next_retain;
+ const RRInfo &NewReleaseRetainRRI = Jt->second;
+ assert(NewReleaseRetainRRI.Calls.count(NewRelease));
+ if (RetainsToMove.Calls.insert(NewReleaseRetain)) {
+ unsigned PathCount =
+ BBStates[NewReleaseRetain->getParent()].GetAllPathCount();
+ OldDelta += PathCount;
+ OldCount += PathCount;
+
+ // Merge the IsRetainBlock values.
+ if (FirstRetain) {
+ RetainsToMove.IsRetainBlock = NewReleaseRetainRRI.IsRetainBlock;
+ FirstRetain = false;
+ } else if (ReleasesToMove.IsRetainBlock !=
+ NewReleaseRetainRRI.IsRetainBlock)
+ // It's not possible to merge the sequences if one uses
+ // objc_retain and the other uses objc_retainBlock.
+ goto next_retain;
+
+ // Collect the optimal insertion points.
+ if (!KnownSafe)
+ for (SmallPtrSet<Instruction *, 2>::const_iterator
+ RI = NewReleaseRetainRRI.ReverseInsertPts.begin(),
+ RE = NewReleaseRetainRRI.ReverseInsertPts.end();
+ RI != RE; ++RI) {
+ Instruction *RIP = *RI;
+ if (RetainsToMove.ReverseInsertPts.insert(RIP)) {
+ PathCount = BBStates[RIP->getParent()].GetAllPathCount();
+ NewDelta += PathCount;
+ NewCount += PathCount;
+ }
+ }
+ NewRetains.push_back(NewReleaseRetain);
+ }
+ }
+ }
+ NewReleases.clear();
+ if (NewRetains.empty()) break;
+ }
+
+ // If the pointer is known incremented, we can safely delete the pair
+ // regardless of what's between them.
+ if (KnownIncrementedTD || KnownIncrementedBU) {
+ RetainsToMove.ReverseInsertPts.clear();
+ ReleasesToMove.ReverseInsertPts.clear();
+ NewCount = 0;
+ }
+
+ // Determine whether the original call points are balanced in the retain and
+ // release calls through the program. If not, conservatively don't touch
+ // them.
+ // TODO: It's theoretically possible to do code motion in this case, as
+ // long as the existing imbalances are maintained.
+ if (OldDelta != 0)
+ goto next_retain;
+
+ // Determine whether the new insertion points we computed preserve the
+ // balance of retain and release calls through the program.
+ // TODO: If the fully aggressive solution isn't valid, try to find a
+ // less aggressive solution which is.
+ if (NewDelta != 0)
+ goto next_retain;
+
+ // Ok, everything checks out and we're all set. Let's move some code!
+ Changed = true;
+ AnyPairsCompletelyEliminated = NewCount == 0;
+ NumRRs += OldCount - NewCount;
+ MoveCalls(Arg, RetainsToMove, ReleasesToMove, Retains, Releases, DeadInsts);
+
+ next_retain:
+ NewReleases.clear();
+ NewRetains.clear();
+ RetainsToMove.clear();
+ ReleasesToMove.clear();
+ }
+
+ // Now that we're done moving everything, we can delete the newly dead
+ // instructions, as we no longer need them as insert points.
+ while (!DeadInsts.empty())
+ EraseInstruction(DeadInsts.pop_back_val());
+
+ return AnyPairsCompletelyEliminated;
+}
+
+/// OptimizeWeakCalls - Weak pointer optimizations.
+void ObjCARCOpt::OptimizeWeakCalls(Function &F) {
+ // First, do memdep-style RLE and S2L optimizations. We can't use memdep
+ // itself because it uses AliasAnalysis and we need to do provenance
+ // queries instead.
+ for (inst_iterator I = inst_begin(&F), E = inst_end(&F); I != E; ) {
+ Instruction *Inst = &*I++;
+ InstructionClass Class = GetBasicInstructionClass(Inst);
+ if (Class != IC_LoadWeak && Class != IC_LoadWeakRetained)
+ continue;
+
+ // Delete objc_loadWeak calls with no users.
+ if (Class == IC_LoadWeak && Inst->use_empty()) {
+ Inst->eraseFromParent();
+ continue;
+ }
+
+ // TODO: For now, just look for an earlier available version of this value
+ // within the same block. Theoretically, we could do memdep-style non-local
+ // analysis too, but that would want caching. A better approach would be to
+ // use the technique that EarlyCSE uses.
+ inst_iterator Current = llvm::prior(I);
+ BasicBlock *CurrentBB = Current.getBasicBlockIterator();
+ for (BasicBlock::iterator B = CurrentBB->begin(),
+ J = Current.getInstructionIterator();
+ J != B; --J) {
+ Instruction *EarlierInst = &*llvm::prior(J);
+ InstructionClass EarlierClass = GetInstructionClass(EarlierInst);
+ switch (EarlierClass) {
+ case IC_LoadWeak:
+ case IC_LoadWeakRetained: {
+ // If this is loading from the same pointer, replace this load's value
+ // with that one.
+ CallInst *Call = cast<CallInst>(Inst);
+ CallInst *EarlierCall = cast<CallInst>(EarlierInst);
+ Value *Arg = Call->getArgOperand(0);
+ Value *EarlierArg = EarlierCall->getArgOperand(0);
+ switch (PA.getAA()->alias(Arg, EarlierArg)) {
+ case AliasAnalysis::MustAlias:
+ Changed = true;
+ // If the load has a builtin retain, insert a plain retain for it.
+ if (Class == IC_LoadWeakRetained) {
+ CallInst *CI =
+ CallInst::Create(getRetainCallee(F.getParent()), EarlierCall,
+ "", Call);
+ CI->setTailCall();
+ }
+ // Zap the fully redundant load.
+ Call->replaceAllUsesWith(EarlierCall);
+ Call->eraseFromParent();
+ goto clobbered;
+ case AliasAnalysis::MayAlias:
+ case AliasAnalysis::PartialAlias:
+ goto clobbered;
+ case AliasAnalysis::NoAlias:
+ break;
+ }
+ break;
+ }
+ case IC_StoreWeak:
+ case IC_InitWeak: {
+ // If this is storing to the same pointer and has the same size etc.
+ // replace this load's value with the stored value.
+ CallInst *Call = cast<CallInst>(Inst);
+ CallInst *EarlierCall = cast<CallInst>(EarlierInst);
+ Value *Arg = Call->getArgOperand(0);
+ Value *EarlierArg = EarlierCall->getArgOperand(0);
+ switch (PA.getAA()->alias(Arg, EarlierArg)) {
+ case AliasAnalysis::MustAlias:
+ Changed = true;
+ // If the load has a builtin retain, insert a plain retain for it.
+ if (Class == IC_LoadWeakRetained) {
+ CallInst *CI =
+ CallInst::Create(getRetainCallee(F.getParent()), EarlierCall,
+ "", Call);
+ CI->setTailCall();
+ }
+ // Zap the fully redundant load.
+ Call->replaceAllUsesWith(EarlierCall->getArgOperand(1));
+ Call->eraseFromParent();
+ goto clobbered;
+ case AliasAnalysis::MayAlias:
+ case AliasAnalysis::PartialAlias:
+ goto clobbered;
+ case AliasAnalysis::NoAlias:
+ break;
+ }
+ break;
+ }
+ case IC_MoveWeak:
+ case IC_CopyWeak:
+ // TOOD: Grab the copied value.
+ goto clobbered;
+ case IC_AutoreleasepoolPush:
+ case IC_None:
+ case IC_User:
+ // Weak pointers are only modified through the weak entry points
+ // (and arbitrary calls, which could call the weak entry points).
+ break;
+ default:
+ // Anything else could modify the weak pointer.
+ goto clobbered;
+ }
+ }
+ clobbered:;
+ }
+
+ // Then, for each destroyWeak with an alloca operand, check to see if
+ // the alloca and all its users can be zapped.
+ for (inst_iterator I = inst_begin(&F), E = inst_end(&F); I != E; ) {
+ Instruction *Inst = &*I++;
+ InstructionClass Class = GetBasicInstructionClass(Inst);
+ if (Class != IC_DestroyWeak)
+ continue;
+
+ CallInst *Call = cast<CallInst>(Inst);
+ Value *Arg = Call->getArgOperand(0);
+ if (AllocaInst *Alloca = dyn_cast<AllocaInst>(Arg)) {
+ for (Value::use_iterator UI = Alloca->use_begin(),
+ UE = Alloca->use_end(); UI != UE; ++UI) {
+ Instruction *UserInst = cast<Instruction>(*UI);
+ switch (GetBasicInstructionClass(UserInst)) {
+ case IC_InitWeak:
+ case IC_StoreWeak:
+ case IC_DestroyWeak:
+ continue;
+ default:
+ goto done;
+ }
+ }
+ Changed = true;
+ for (Value::use_iterator UI = Alloca->use_begin(),
+ UE = Alloca->use_end(); UI != UE; ) {
+ CallInst *UserInst = cast<CallInst>(*UI++);
+ if (!UserInst->use_empty())
+ UserInst->replaceAllUsesWith(UserInst->getOperand(1));
+ UserInst->eraseFromParent();
+ }
+ Alloca->eraseFromParent();
+ done:;
+ }
+ }
+}
+
+/// OptimizeSequences - Identify program paths which execute sequences of
+/// retains and releases which can be eliminated.
+bool ObjCARCOpt::OptimizeSequences(Function &F) {
+ /// Releases, Retains - These are used to store the results of the main flow
+ /// analysis. These use Value* as the key instead of Instruction* so that the
+ /// map stays valid when we get around to rewriting code and calls get
+ /// replaced by arguments.
+ DenseMap<Value *, RRInfo> Releases;
+ MapVector<Value *, RRInfo> Retains;
+
+ /// BBStates, This is used during the traversal of the function to track the
+ /// states for each identified object at each block.
+ DenseMap<const BasicBlock *, BBState> BBStates;
+
+ // Analyze the CFG of the function, and all instructions.
+ bool NestingDetected = Visit(F, BBStates, Retains, Releases);
+
+ // Transform.
+ return PerformCodePlacement(BBStates, Retains, Releases) && NestingDetected;
+}
+
+/// OptimizeReturns - Look for this pattern:
+///
+/// %call = call i8* @something(...)
+/// %2 = call i8* @objc_retain(i8* %call)
+/// %3 = call i8* @objc_autorelease(i8* %2)
+/// ret i8* %3
+///
+/// And delete the retain and autorelease.
+///
+/// Otherwise if it's just this:
+///
+/// %3 = call i8* @objc_autorelease(i8* %2)
+/// ret i8* %3
+///
+/// convert the autorelease to autoreleaseRV.
+void ObjCARCOpt::OptimizeReturns(Function &F) {
+ if (!F.getReturnType()->isPointerTy())
+ return;
+
+ SmallPtrSet<Instruction *, 4> DependingInstructions;
+ SmallPtrSet<const BasicBlock *, 4> Visited;
+ for (Function::iterator FI = F.begin(), FE = F.end(); FI != FE; ++FI) {
+ BasicBlock *BB = FI;
+ ReturnInst *Ret = dyn_cast<ReturnInst>(&BB->back());
+ if (!Ret) continue;
+
+ const Value *Arg = StripPointerCastsAndObjCCalls(Ret->getOperand(0));
+ FindDependencies(NeedsPositiveRetainCount, Arg,
+ BB, Ret, DependingInstructions, Visited, PA);
+ if (DependingInstructions.size() != 1)
+ goto next_block;
+
+ {
+ CallInst *Autorelease =
+ dyn_cast_or_null<CallInst>(*DependingInstructions.begin());
+ if (!Autorelease)
+ goto next_block;
+ InstructionClass AutoreleaseClass =
+ GetBasicInstructionClass(Autorelease);
+ if (!IsAutorelease(AutoreleaseClass))
+ goto next_block;
+ if (GetObjCArg(Autorelease) != Arg)
+ goto next_block;
+
+ DependingInstructions.clear();
+ Visited.clear();
+
+ // Check that there is nothing that can affect the reference
+ // count between the autorelease and the retain.
+ FindDependencies(CanChangeRetainCount, Arg,
+ BB, Autorelease, DependingInstructions, Visited, PA);
+ if (DependingInstructions.size() != 1)
+ goto next_block;
+
+ {
+ CallInst *Retain =
+ dyn_cast_or_null<CallInst>(*DependingInstructions.begin());
+
+ // Check that we found a retain with the same argument.
+ if (!Retain ||
+ !IsRetain(GetBasicInstructionClass(Retain)) ||
+ GetObjCArg(Retain) != Arg)
+ goto next_block;
+
+ DependingInstructions.clear();
+ Visited.clear();
+
+ // Convert the autorelease to an autoreleaseRV, since it's
+ // returning the value.
+ if (AutoreleaseClass == IC_Autorelease) {
+ Autorelease->setCalledFunction(getAutoreleaseRVCallee(F.getParent()));
+ AutoreleaseClass = IC_AutoreleaseRV;
+ }
+
+ // Check that there is nothing that can affect the reference
+ // count between the retain and the call.
+ FindDependencies(CanChangeRetainCount, Arg, BB, Retain,
+ DependingInstructions, Visited, PA);
+ if (DependingInstructions.size() != 1)
+ goto next_block;
+
+ {
+ CallInst *Call =
+ dyn_cast_or_null<CallInst>(*DependingInstructions.begin());
+
+ // Check that the pointer is the return value of the call.
+ if (!Call || Arg != Call)
+ goto next_block;
+
+ // Check that the call is a regular call.
+ InstructionClass Class = GetBasicInstructionClass(Call);
+ if (Class != IC_CallOrUser && Class != IC_Call)
+ goto next_block;
+
+ // If so, we can zap the retain and autorelease.
+ Changed = true;
+ ++NumRets;
+ EraseInstruction(Retain);
+ EraseInstruction(Autorelease);
+ }
+ }
+ }
+
+ next_block:
+ DependingInstructions.clear();
+ Visited.clear();
+ }
+}
+
+bool ObjCARCOpt::doInitialization(Module &M) {
+ if (!EnableARCOpts)
+ return false;
+
+ Run = ModuleHasARC(M);
+ if (!Run)
+ return false;
+
+ // Identify the imprecise release metadata kind.
+ ImpreciseReleaseMDKind =
+ M.getContext().getMDKindID("clang.imprecise_release");
+
+ // Identify the declarations for objc_retain and friends.
+ RetainFunc = M.getFunction("objc_retain");
+ RetainBlockFunc = M.getFunction("objc_retainBlock");
+ RetainRVFunc = M.getFunction("objc_retainAutoreleasedReturnValue");
+ ReleaseFunc = M.getFunction("objc_release");
+
+ // Intuitively, objc_retain and others are nocapture, however in practice
+ // they are not, because they return their argument value. And objc_release
+ // calls finalizers.
+
+ // These are initialized lazily.
+ RetainRVCallee = 0;
+ AutoreleaseRVCallee = 0;
+ ReleaseCallee = 0;
+ RetainCallee = 0;
+ AutoreleaseCallee = 0;
+
+ return false;
+}
+
+bool ObjCARCOpt::runOnFunction(Function &F) {
+ if (!EnableARCOpts)
+ return false;
+
+ // If nothing in the Module uses ARC, don't do anything.
+ if (!Run)
+ return false;
+
+ Changed = false;
+
+ PA.setAA(&getAnalysis<AliasAnalysis>());
+
+ // This pass performs several distinct transformations. As a compile-time aid
+ // when compiling code that isn't ObjC, skip these if the relevant ObjC
+ // library functions aren't declared.
+
+ // Preliminary optimizations. This also computs UsedInThisFunction.
+ OptimizeIndividualCalls(F);
+
+ // Optimizations for weak pointers.
+ if (UsedInThisFunction & ((1 << IC_LoadWeak) |
+ (1 << IC_LoadWeakRetained) |
+ (1 << IC_StoreWeak) |
+ (1 << IC_InitWeak) |
+ (1 << IC_CopyWeak) |
+ (1 << IC_MoveWeak) |
+ (1 << IC_DestroyWeak)))
+ OptimizeWeakCalls(F);
+
+ // Optimizations for retain+release pairs.
+ if (UsedInThisFunction & ((1 << IC_Retain) |
+ (1 << IC_RetainRV) |
+ (1 << IC_RetainBlock)))
+ if (UsedInThisFunction & (1 << IC_Release))
+ // Run OptimizeSequences until it either stops making changes or
+ // no retain+release pair nesting is detected.
+ while (OptimizeSequences(F)) {}
+
+ // Optimizations if objc_autorelease is used.
+ if (UsedInThisFunction &
+ ((1 << IC_Autorelease) | (1 << IC_AutoreleaseRV)))
+ OptimizeReturns(F);
+
+ return Changed;
+}
+
+void ObjCARCOpt::releaseMemory() {
+ PA.clear();
+}
+
+//===----------------------------------------------------------------------===//
+// ARC contraction.
+//===----------------------------------------------------------------------===//
+
+// TODO: ObjCARCContract could insert PHI nodes when uses aren't
+// dominated by single calls.
+
+#include "llvm/Operator.h"
+#include "llvm/InlineAsm.h"
+#include "llvm/Analysis/Dominators.h"
+
+STATISTIC(NumStoreStrongs, "Number objc_storeStrong calls formed");
+
+namespace {
+ /// ObjCARCContract - Late ARC optimizations. These change the IR in a way
+ /// that makes it difficult to be analyzed by ObjCARCOpt, so it's run late.
+ class ObjCARCContract : public FunctionPass {
+ bool Changed;
+ AliasAnalysis *AA;
+ DominatorTree *DT;
+ ProvenanceAnalysis PA;
+
+ /// Run - A flag indicating whether this optimization pass should run.
+ bool Run;
+
+ /// StoreStrongCallee, etc. - Declarations for ObjC runtime
+ /// functions, for use in creating calls to them. These are initialized
+ /// lazily to avoid cluttering up the Module with unused declarations.
+ Constant *StoreStrongCallee,
+ *RetainAutoreleaseCallee, *RetainAutoreleaseRVCallee;
+
+ /// RetainRVMarker - The inline asm string to insert between calls and
+ /// RetainRV calls to make the optimization work on targets which need it.
+ const MDString *RetainRVMarker;
+
+ Constant *getStoreStrongCallee(Module *M);
+ Constant *getRetainAutoreleaseCallee(Module *M);
+ Constant *getRetainAutoreleaseRVCallee(Module *M);
+
+ bool ContractAutorelease(Function &F, Instruction *Autorelease,
+ InstructionClass Class,
+ SmallPtrSet<Instruction *, 4>
+ &DependingInstructions,
+ SmallPtrSet<const BasicBlock *, 4>
+ &Visited);
+
+ void ContractRelease(Instruction *Release,
+ inst_iterator &Iter);
+
+ virtual void getAnalysisUsage(AnalysisUsage &AU) const;
+ virtual bool doInitialization(Module &M);
+ virtual bool runOnFunction(Function &F);
+
+ public:
+ static char ID;
+ ObjCARCContract() : FunctionPass(ID) {
+ initializeObjCARCContractPass(*PassRegistry::getPassRegistry());
+ }
+ };
+}
+
+char ObjCARCContract::ID = 0;
+INITIALIZE_PASS_BEGIN(ObjCARCContract,
+ "objc-arc-contract", "ObjC ARC contraction", false, false)
+INITIALIZE_AG_DEPENDENCY(AliasAnalysis)
+INITIALIZE_PASS_DEPENDENCY(DominatorTree)
+INITIALIZE_PASS_END(ObjCARCContract,
+ "objc-arc-contract", "ObjC ARC contraction", false, false)
+
+Pass *llvm::createObjCARCContractPass() {
+ return new ObjCARCContract();
+}
+
+void ObjCARCContract::getAnalysisUsage(AnalysisUsage &AU) const {
+ AU.addRequired<AliasAnalysis>();
+ AU.addRequired<DominatorTree>();
+ AU.setPreservesCFG();
+}
+
+Constant *ObjCARCContract::getStoreStrongCallee(Module *M) {
+ if (!StoreStrongCallee) {
+ LLVMContext &C = M->getContext();
+ Type *I8X = PointerType::getUnqual(Type::getInt8Ty(C));
+ Type *I8XX = PointerType::getUnqual(I8X);
+ std::vector<Type *> Params;
+ Params.push_back(I8XX);
+ Params.push_back(I8X);
+
+ AttrListPtr Attributes;
+ Attributes.addAttr(~0u, Attribute::NoUnwind);
+ Attributes.addAttr(1, Attribute::NoCapture);
+
+ StoreStrongCallee =
+ M->getOrInsertFunction(
+ "objc_storeStrong",
+ FunctionType::get(Type::getVoidTy(C), Params, /*isVarArg=*/false),
+ Attributes);
+ }
+ return StoreStrongCallee;
+}
+
+Constant *ObjCARCContract::getRetainAutoreleaseCallee(Module *M) {
+ if (!RetainAutoreleaseCallee) {
+ LLVMContext &C = M->getContext();
+ Type *I8X = PointerType::getUnqual(Type::getInt8Ty(C));
+ std::vector<Type *> Params;
+ Params.push_back(I8X);
+ const FunctionType *FTy =
+ FunctionType::get(I8X, Params, /*isVarArg=*/false);
+ AttrListPtr Attributes;
+ Attributes.addAttr(~0u, Attribute::NoUnwind);
+ RetainAutoreleaseCallee =
+ M->getOrInsertFunction("objc_retainAutorelease", FTy, Attributes);
+ }
+ return RetainAutoreleaseCallee;
+}
+
+Constant *ObjCARCContract::getRetainAutoreleaseRVCallee(Module *M) {
+ if (!RetainAutoreleaseRVCallee) {
+ LLVMContext &C = M->getContext();
+ Type *I8X = PointerType::getUnqual(Type::getInt8Ty(C));
+ std::vector<Type *> Params;
+ Params.push_back(I8X);
+ const FunctionType *FTy =
+ FunctionType::get(I8X, Params, /*isVarArg=*/false);
+ AttrListPtr Attributes;
+ Attributes.addAttr(~0u, Attribute::NoUnwind);
+ RetainAutoreleaseRVCallee =
+ M->getOrInsertFunction("objc_retainAutoreleaseReturnValue", FTy,
+ Attributes);
+ }
+ return RetainAutoreleaseRVCallee;
+}
+
+/// ContractAutorelease - Merge an autorelease with a retain into a fused
+/// call.
+bool
+ObjCARCContract::ContractAutorelease(Function &F, Instruction *Autorelease,
+ InstructionClass Class,
+ SmallPtrSet<Instruction *, 4>
+ &DependingInstructions,
+ SmallPtrSet<const BasicBlock *, 4>
+ &Visited) {
+ const Value *Arg = GetObjCArg(Autorelease);
+
+ // Check that there are no instructions between the retain and the autorelease
+ // (such as an autorelease_pop) which may change the count.
+ CallInst *Retain = 0;
+ if (Class == IC_AutoreleaseRV)
+ FindDependencies(RetainAutoreleaseRVDep, Arg,
+ Autorelease->getParent(), Autorelease,
+ DependingInstructions, Visited, PA);
+ else
+ FindDependencies(RetainAutoreleaseDep, Arg,
+ Autorelease->getParent(), Autorelease,
+ DependingInstructions, Visited, PA);
+
+ Visited.clear();
+ if (DependingInstructions.size() != 1) {
+ DependingInstructions.clear();
+ return false;
+ }
+
+ Retain = dyn_cast_or_null<CallInst>(*DependingInstructions.begin());
+ DependingInstructions.clear();
+
+ if (!Retain ||
+ GetBasicInstructionClass(Retain) != IC_Retain ||
+ GetObjCArg(Retain) != Arg)
+ return false;
+
+ Changed = true;
+ ++NumPeeps;
+
+ if (Class == IC_AutoreleaseRV)
+ Retain->setCalledFunction(getRetainAutoreleaseRVCallee(F.getParent()));
+ else
+ Retain->setCalledFunction(getRetainAutoreleaseCallee(F.getParent()));
+
+ EraseInstruction(Autorelease);
+ return true;
+}
+
+/// ContractRelease - Attempt to merge an objc_release with a store, load, and
+/// objc_retain to form an objc_storeStrong. This can be a little tricky because
+/// the instructions don't always appear in order, and there may be unrelated
+/// intervening instructions.
+void ObjCARCContract::ContractRelease(Instruction *Release,
+ inst_iterator &Iter) {
+ LoadInst *Load = dyn_cast<LoadInst>(GetObjCArg(Release));
+ if (!Load || Load->isVolatile()) return;
+
+ // For now, require everything to be in one basic block.
+ BasicBlock *BB = Release->getParent();
+ if (Load->getParent() != BB) return;
+
+ // Walk down to find the store.
+ BasicBlock::iterator I = Load, End = BB->end();
+ ++I;
+ AliasAnalysis::Location Loc = AA->getLocation(Load);
+ while (I != End &&
+ (&*I == Release ||
+ IsRetain(GetBasicInstructionClass(I)) ||
+ !(AA->getModRefInfo(I, Loc) & AliasAnalysis::Mod)))
+ ++I;
+ StoreInst *Store = dyn_cast<StoreInst>(I);
+ if (!Store || Store->isVolatile()) return;
+ if (Store->getPointerOperand() != Loc.Ptr) return;
+
+ Value *New = StripPointerCastsAndObjCCalls(Store->getValueOperand());
+
+ // Walk up to find the retain.
+ I = Store;
+ BasicBlock::iterator Begin = BB->begin();
+ while (I != Begin && GetBasicInstructionClass(I) != IC_Retain)
+ --I;
+ Instruction *Retain = I;
+ if (GetBasicInstructionClass(Retain) != IC_Retain) return;
+ if (GetObjCArg(Retain) != New) return;
+
+ Changed = true;
+ ++NumStoreStrongs;
+
+ LLVMContext &C = Release->getContext();
+ const Type *I8X = PointerType::getUnqual(Type::getInt8Ty(C));
+ const Type *I8XX = PointerType::getUnqual(I8X);
+
+ Value *Args[] = { Load->getPointerOperand(), New };
+ if (Args[0]->getType() != I8XX)
+ Args[0] = new BitCastInst(Args[0], I8XX, "", Store);
+ if (Args[1]->getType() != I8X)
+ Args[1] = new BitCastInst(Args[1], I8X, "", Store);
+ CallInst *StoreStrong =
+ CallInst::Create(getStoreStrongCallee(BB->getParent()->getParent()),
+ Args, "", Store);
+ StoreStrong->setDoesNotThrow();
+ StoreStrong->setDebugLoc(Store->getDebugLoc());
+
+ if (&*Iter == Store) ++Iter;
+ Store->eraseFromParent();
+ Release->eraseFromParent();
+ EraseInstruction(Retain);
+ if (Load->use_empty())
+ Load->eraseFromParent();
+}
+
+bool ObjCARCContract::doInitialization(Module &M) {
+ Run = ModuleHasARC(M);
+ if (!Run)
+ return false;
+
+ // These are initialized lazily.
+ StoreStrongCallee = 0;
+ RetainAutoreleaseCallee = 0;
+ RetainAutoreleaseRVCallee = 0;
+
+ // Initialize RetainRVMarker.
+ RetainRVMarker = 0;
+ if (NamedMDNode *NMD =
+ M.getNamedMetadata("clang.arc.retainAutoreleasedReturnValueMarker"))
+ if (NMD->getNumOperands() == 1) {
+ const MDNode *N = NMD->getOperand(0);
+ if (N->getNumOperands() == 1)
+ if (const MDString *S = dyn_cast<MDString>(N->getOperand(0)))
+ RetainRVMarker = S;
+ }
+
+ return false;
+}
+
+bool ObjCARCContract::runOnFunction(Function &F) {
+ if (!EnableARCOpts)
+ return false;
+
+ // If nothing in the Module uses ARC, don't do anything.
+ if (!Run)
+ return false;
+
+ Changed = false;
+ AA = &getAnalysis<AliasAnalysis>();
+ DT = &getAnalysis<DominatorTree>();
+
+ PA.setAA(&getAnalysis<AliasAnalysis>());
+
+ // For ObjC library calls which return their argument, replace uses of the
+ // argument with uses of the call return value, if it dominates the use. This
+ // reduces register pressure.
+ SmallPtrSet<Instruction *, 4> DependingInstructions;
+ SmallPtrSet<const BasicBlock *, 4> Visited;
+ for (inst_iterator I = inst_begin(&F), E = inst_end(&F); I != E; ) {
+ Instruction *Inst = &*I++;
+
+ // Only these library routines return their argument. In particular,
+ // objc_retainBlock does not necessarily return its argument.
+ InstructionClass Class = GetBasicInstructionClass(Inst);
+ switch (Class) {
+ case IC_Retain:
+ case IC_FusedRetainAutorelease:
+ case IC_FusedRetainAutoreleaseRV:
+ break;
+ case IC_Autorelease:
+ case IC_AutoreleaseRV:
+ if (ContractAutorelease(F, Inst, Class, DependingInstructions, Visited))
+ continue;
+ break;
+ case IC_RetainRV: {
+ // If we're compiling for a target which needs a special inline-asm
+ // marker to do the retainAutoreleasedReturnValue optimization,
+ // insert it now.
+ if (!RetainRVMarker)
+ break;
+ BasicBlock::iterator BBI = Inst;
+ --BBI;
+ while (isNoopInstruction(BBI)) --BBI;
+ if (&*BBI == GetObjCArg(Inst)) {
+ InlineAsm *IA =
+ InlineAsm::get(FunctionType::get(Type::getVoidTy(Inst->getContext()),
+ /*isVarArg=*/false),
+ RetainRVMarker->getString(),
+ /*Constraints=*/"", /*hasSideEffects=*/true);
+ CallInst::Create(IA, "", Inst);
+ }
+ break;
+ }
+ case IC_InitWeak: {
+ // objc_initWeak(p, null) => *p = null
+ CallInst *CI = cast<CallInst>(Inst);
+ if (isNullOrUndef(CI->getArgOperand(1))) {
+ Value *Null =
+ ConstantPointerNull::get(cast<PointerType>(CI->getType()));
+ Changed = true;
+ new StoreInst(Null, CI->getArgOperand(0), CI);
+ CI->replaceAllUsesWith(Null);
+ CI->eraseFromParent();
+ }
+ continue;
+ }
+ case IC_Release:
+ ContractRelease(Inst, I);
+ continue;
+ default:
+ continue;
+ }
+
+ // Don't use GetObjCArg because we don't want to look through bitcasts
+ // and such; to do the replacement, the argument must have type i8*.
+ const Value *Arg = cast<CallInst>(Inst)->getArgOperand(0);
+ for (;;) {
+ // If we're compiling bugpointed code, don't get in trouble.
+ if (!isa<Instruction>(Arg) && !isa<Argument>(Arg))
+ break;
+ // Look through the uses of the pointer.
+ for (Value::const_use_iterator UI = Arg->use_begin(), UE = Arg->use_end();
+ UI != UE; ) {
+ Use &U = UI.getUse();
+ unsigned OperandNo = UI.getOperandNo();
+ ++UI; // Increment UI now, because we may unlink its element.
+ if (Instruction *UserInst = dyn_cast<Instruction>(U.getUser()))
+ if (Inst != UserInst && DT->dominates(Inst, UserInst)) {
+ Changed = true;
+ Instruction *Replacement = Inst;
+ const Type *UseTy = U.get()->getType();
+ if (PHINode *PHI = dyn_cast<PHINode>(UserInst)) {
+ // For PHI nodes, insert the bitcast in the predecessor block.
+ unsigned ValNo =
+ PHINode::getIncomingValueNumForOperand(OperandNo);
+ BasicBlock *BB =
+ PHI->getIncomingBlock(ValNo);
+ if (Replacement->getType() != UseTy)
+ Replacement = new BitCastInst(Replacement, UseTy, "",
+ &BB->back());
+ for (unsigned i = 0, e = PHI->getNumIncomingValues();
+ i != e; ++i)
+ if (PHI->getIncomingBlock(i) == BB) {
+ // Keep the UI iterator valid.
+ if (&PHI->getOperandUse(
+ PHINode::getOperandNumForIncomingValue(i)) ==
+ &UI.getUse())
+ ++UI;
+ PHI->setIncomingValue(i, Replacement);
+ }
+ } else {
+ if (Replacement->getType() != UseTy)
+ Replacement = new BitCastInst(Replacement, UseTy, "", UserInst);
+ U.set(Replacement);
+ }
+ }
+ }
+
+ // If Arg is a no-op casted pointer, strip one level of casts and
+ // iterate.
+ if (const BitCastInst *BI = dyn_cast<BitCastInst>(Arg))
+ Arg = BI->getOperand(0);
+ else if (isa<GEPOperator>(Arg) &&
+ cast<GEPOperator>(Arg)->hasAllZeroIndices())
+ Arg = cast<GEPOperator>(Arg)->getPointerOperand();
+ else if (isa<GlobalAlias>(Arg) &&
+ !cast<GlobalAlias>(Arg)->mayBeOverridden())
+ Arg = cast<GlobalAlias>(Arg)->getAliasee();
+ else
+ break;
+ }
+ }
+
+ return Changed;
+}
diff --git a/contrib/llvm/lib/Transforms/Scalar/Reassociate.cpp b/contrib/llvm/lib/Transforms/Scalar/Reassociate.cpp
index c1dfe15..e6341ae 100644
--- a/contrib/llvm/lib/Transforms/Scalar/Reassociate.cpp
+++ b/contrib/llvm/lib/Transforms/Scalar/Reassociate.cpp
@@ -812,7 +812,7 @@ Value *Reassociate::OptimizeAdd(Instruction *I,
// because we can percolate the negate out. Watch for minint, which
// cannot be positivified.
if (ConstantInt *CI = dyn_cast<ConstantInt>(Factor))
- if (CI->getValue().isNegative() && !CI->getValue().isMinSignedValue()) {
+ if (CI->isNegative() && !CI->isMinValue(true)) {
Factor = ConstantInt::get(CI->getContext(), -CI->getValue());
assert(!Duplicates.count(Factor) &&
"Shouldn't have two constant factors, missed a canonicalize");
diff --git a/contrib/llvm/lib/Transforms/Scalar/Scalar.cpp b/contrib/llvm/lib/Transforms/Scalar/Scalar.cpp
index 32a0506..302c287 100644
--- a/contrib/llvm/lib/Transforms/Scalar/Scalar.cpp
+++ b/contrib/llvm/lib/Transforms/Scalar/Scalar.cpp
@@ -48,7 +48,12 @@ void llvm::initializeScalarOpts(PassRegistry &Registry) {
initializeLoopUnswitchPass(Registry);
initializeLoopIdiomRecognizePass(Registry);
initializeLowerAtomicPass(Registry);
+ initializeLowerExpectIntrinsicPass(Registry);
initializeMemCpyOptPass(Registry);
+ initializeObjCARCAliasAnalysisPass(Registry);
+ initializeObjCARCExpandPass(Registry);
+ initializeObjCARCContractPass(Registry);
+ initializeObjCARCOptPass(Registry);
initializeReassociatePass(Registry);
initializeRegToMemPass(Registry);
initializeSCCPPass(Registry);
diff --git a/contrib/llvm/lib/Transforms/Scalar/ScalarReplAggregates.cpp b/contrib/llvm/lib/Transforms/Scalar/ScalarReplAggregates.cpp
index 8938b28..7d6349c 100644
--- a/contrib/llvm/lib/Transforms/Scalar/ScalarReplAggregates.cpp
+++ b/contrib/llvm/lib/Transforms/Scalar/ScalarReplAggregates.cpp
@@ -30,6 +30,7 @@
#include "llvm/LLVMContext.h"
#include "llvm/Module.h"
#include "llvm/Pass.h"
+#include "llvm/Analysis/DebugInfo.h"
#include "llvm/Analysis/DIBuilder.h"
#include "llvm/Analysis/Dominators.h"
#include "llvm/Analysis/Loads.h"
@@ -152,7 +153,8 @@ namespace {
void RewriteLoadUserOfWholeAlloca(LoadInst *LI, AllocaInst *AI,
SmallVector<AllocaInst*, 32> &NewElts);
- static MemTransferInst *isOnlyCopiedFromConstantGlobal(AllocaInst *AI);
+ static MemTransferInst *isOnlyCopiedFromConstantGlobal(
+ AllocaInst *AI, SmallVector<Instruction*, 4> &ToDelete);
};
// SROA_DT - SROA that uses DominatorTree.
@@ -228,16 +230,30 @@ class ConvertToScalarInfo {
/// which means that mem2reg can't promote it.
bool IsNotTrivial;
+ /// ScalarKind - Tracks the kind of alloca being considered for promotion,
+ /// computed based on the uses of the alloca rather than the LLVM type system.
+ enum {
+ Unknown,
+
+ // Accesses via GEPs that are consistent with element access of a vector
+ // type. This will not be converted into a vector unless there is a later
+ // access using an actual vector type.
+ ImplicitVector,
+
+ // Accesses via vector operations and GEPs that are consistent with the
+ // layout of a vector type.
+ Vector,
+
+ // An integer bag-of-bits with bitwise operations for insertion and
+ // extraction. Any combination of types can be converted into this kind
+ // of scalar.
+ Integer
+ } ScalarKind;
+
/// VectorTy - This tracks the type that we should promote the vector to if
/// it is possible to turn it into a vector. This starts out null, and if it
/// isn't possible to turn into a vector type, it gets set to VoidTy.
- const Type *VectorTy;
-
- /// HadAVector - True if there is at least one vector access to the alloca.
- /// We don't want to turn random arrays into vectors and use vector element
- /// insert/extract, but if there are element accesses to something that is
- /// also declared as a vector, we do want to promote to a vector.
- bool HadAVector;
+ const VectorType *VectorTy;
/// HadNonMemTransferAccess - True if there is at least one access to the
/// alloca that is not a MemTransferInst. We don't want to turn structs into
@@ -246,14 +262,14 @@ class ConvertToScalarInfo {
public:
explicit ConvertToScalarInfo(unsigned Size, const TargetData &td)
- : AllocaSize(Size), TD(td), IsNotTrivial(false), VectorTy(0),
- HadAVector(false), HadNonMemTransferAccess(false) { }
+ : AllocaSize(Size), TD(td), IsNotTrivial(false), ScalarKind(Unknown),
+ VectorTy(0), HadNonMemTransferAccess(false) { }
AllocaInst *TryConvert(AllocaInst *AI);
private:
bool CanConvertToScalar(Value *V, uint64_t Offset);
- void MergeInType(const Type *In, uint64_t Offset, bool IsLoadOrStore);
+ void MergeInTypeForLoadOrStore(const Type *In, uint64_t Offset);
bool MergeInVectorType(const VectorType *VInTy, uint64_t Offset);
void ConvertUsesToScalar(Value *Ptr, AllocaInst *NewAI, uint64_t Offset);
@@ -274,6 +290,16 @@ AllocaInst *ConvertToScalarInfo::TryConvert(AllocaInst *AI) {
if (!CanConvertToScalar(AI, 0) || !IsNotTrivial)
return 0;
+ // If an alloca has only memset / memcpy uses, it may still have an Unknown
+ // ScalarKind. Treat it as an Integer below.
+ if (ScalarKind == Unknown)
+ ScalarKind = Integer;
+
+ // FIXME: It should be possible to promote the vector type up to the alloca's
+ // size.
+ if (ScalarKind == Vector && VectorTy->getBitWidth() != AllocaSize * 8)
+ ScalarKind = Integer;
+
// If we were able to find a vector type that can handle this with
// insert/extract elements, and if there was at least one use that had
// a vector type, promote this to a vector. We don't want to promote
@@ -281,14 +307,15 @@ AllocaInst *ConvertToScalarInfo::TryConvert(AllocaInst *AI) {
// we just get a lot of insert/extracts. If at least one vector is
// involved, then we probably really do have a union of vector/array.
const Type *NewTy;
- if (VectorTy && VectorTy->isVectorTy() && HadAVector) {
+ if (ScalarKind == Vector) {
+ assert(VectorTy && "Missing type for vector scalar.");
DEBUG(dbgs() << "CONVERT TO VECTOR: " << *AI << "\n TYPE = "
<< *VectorTy << '\n');
NewTy = VectorTy; // Use the vector type.
} else {
unsigned BitWidth = AllocaSize * 8;
- if (!HadAVector && !HadNonMemTransferAccess &&
- !TD.fitsInLegalInteger(BitWidth))
+ if ((ScalarKind == ImplicitVector || ScalarKind == Integer) &&
+ !HadNonMemTransferAccess && !TD.fitsInLegalInteger(BitWidth))
return 0;
DEBUG(dbgs() << "CONVERT TO SCALAR INTEGER: " << *AI << "\n");
@@ -300,8 +327,9 @@ AllocaInst *ConvertToScalarInfo::TryConvert(AllocaInst *AI) {
return NewAI;
}
-/// MergeInType - Add the 'In' type to the accumulated vector type (VectorTy)
-/// so far at the offset specified by Offset (which is specified in bytes).
+/// MergeInTypeForLoadOrStore - Add the 'In' type to the accumulated vector type
+/// (VectorTy) so far at the offset specified by Offset (which is specified in
+/// bytes).
///
/// There are three cases we handle here:
/// 1) A union of vector types of the same size and potentially its elements.
@@ -316,11 +344,11 @@ AllocaInst *ConvertToScalarInfo::TryConvert(AllocaInst *AI) {
/// large) integer type with extract and insert operations where the loads
/// and stores would mutate the memory. We mark this by setting VectorTy
/// to VoidTy.
-void ConvertToScalarInfo::MergeInType(const Type *In, uint64_t Offset,
- bool IsLoadOrStore) {
+void ConvertToScalarInfo::MergeInTypeForLoadOrStore(const Type *In,
+ uint64_t Offset) {
// If we already decided to turn this into a blob of integer memory, there is
// nothing to be done.
- if (VectorTy && VectorTy->isVoidTy())
+ if (ScalarKind == Integer)
return;
// If this could be contributing to a vector, analyze it.
@@ -336,7 +364,7 @@ void ConvertToScalarInfo::MergeInType(const Type *In, uint64_t Offset,
// Full width accesses can be ignored, because they can always be turned
// into bitcasts.
unsigned EltSize = In->getPrimitiveSizeInBits()/8;
- if (IsLoadOrStore && EltSize == AllocaSize)
+ if (EltSize == AllocaSize)
return;
// If we're accessing something that could be an element of a vector, see
@@ -345,11 +373,12 @@ void ConvertToScalarInfo::MergeInType(const Type *In, uint64_t Offset,
if (Offset % EltSize == 0 && AllocaSize % EltSize == 0 &&
(!VectorTy || Offset * 8 < VectorTy->getPrimitiveSizeInBits())) {
if (!VectorTy) {
+ ScalarKind = ImplicitVector;
VectorTy = VectorType::get(In, AllocaSize/EltSize);
return;
}
- unsigned CurrentEltSize = cast<VectorType>(VectorTy)->getElementType()
+ unsigned CurrentEltSize = VectorTy->getElementType()
->getPrimitiveSizeInBits()/8;
if (EltSize == CurrentEltSize)
return;
@@ -361,16 +390,13 @@ void ConvertToScalarInfo::MergeInType(const Type *In, uint64_t Offset,
// Otherwise, we have a case that we can't handle with an optimized vector
// form. We can still turn this into a large integer.
- VectorTy = Type::getVoidTy(In->getContext());
+ ScalarKind = Integer;
}
-/// MergeInVectorType - Handles the vector case of MergeInType, returning true
-/// if the type was successfully merged and false otherwise.
+/// MergeInVectorType - Handles the vector case of MergeInTypeForLoadOrStore,
+/// returning true if the type was successfully merged and false otherwise.
bool ConvertToScalarInfo::MergeInVectorType(const VectorType *VInTy,
uint64_t Offset) {
- // Remember if we saw a vector type.
- HadAVector = true;
-
// TODO: Support nonzero offsets?
if (Offset != 0)
return false;
@@ -382,19 +408,22 @@ bool ConvertToScalarInfo::MergeInVectorType(const VectorType *VInTy,
// If this the first vector we see, remember the type so that we know the
// element size.
if (!VectorTy) {
+ ScalarKind = Vector;
VectorTy = VInTy;
return true;
}
- unsigned BitWidth = cast<VectorType>(VectorTy)->getBitWidth();
+ unsigned BitWidth = VectorTy->getBitWidth();
unsigned InBitWidth = VInTy->getBitWidth();
// Vectors of the same size can be converted using a simple bitcast.
- if (InBitWidth == BitWidth && AllocaSize == (InBitWidth / 8))
+ if (InBitWidth == BitWidth && AllocaSize == (InBitWidth / 8)) {
+ ScalarKind = Vector;
return true;
+ }
- const Type *ElementTy = cast<VectorType>(VectorTy)->getElementType();
- const Type *InElementTy = cast<VectorType>(VInTy)->getElementType();
+ const Type *ElementTy = VectorTy->getElementType();
+ const Type *InElementTy = VInTy->getElementType();
// Do not allow mixed integer and floating-point accesses from vectors of
// different sizes.
@@ -429,6 +458,7 @@ bool ConvertToScalarInfo::MergeInVectorType(const VectorType *VInTy,
}
// Pick the largest of the two vector types.
+ ScalarKind = Vector;
if (InBitWidth > BitWidth)
VectorTy = VInTy;
@@ -456,7 +486,7 @@ bool ConvertToScalarInfo::CanConvertToScalar(Value *V, uint64_t Offset) {
if (LI->getType()->isX86_MMXTy())
return false;
HadNonMemTransferAccess = true;
- MergeInType(LI->getType(), Offset, true);
+ MergeInTypeForLoadOrStore(LI->getType(), Offset);
continue;
}
@@ -467,7 +497,7 @@ bool ConvertToScalarInfo::CanConvertToScalar(Value *V, uint64_t Offset) {
if (SI->getOperand(0)->getType()->isX86_MMXTy())
return false;
HadNonMemTransferAccess = true;
- MergeInType(SI->getOperand(0)->getType(), Offset, true);
+ MergeInTypeForLoadOrStore(SI->getOperand(0)->getType(), Offset);
continue;
}
@@ -498,10 +528,22 @@ bool ConvertToScalarInfo::CanConvertToScalar(Value *V, uint64_t Offset) {
// If this is a constant sized memset of a constant value (e.g. 0) we can
// handle it.
if (MemSetInst *MSI = dyn_cast<MemSetInst>(User)) {
- // Store of constant value and constant size.
- if (!isa<ConstantInt>(MSI->getValue()) ||
- !isa<ConstantInt>(MSI->getLength()))
+ // Store of constant value.
+ if (!isa<ConstantInt>(MSI->getValue()))
+ return false;
+
+ // Store of constant size.
+ ConstantInt *Len = dyn_cast<ConstantInt>(MSI->getLength());
+ if (!Len)
return false;
+
+ // If the size differs from the alloca, we can only convert the alloca to
+ // an integer bag-of-bits.
+ // FIXME: This should handle all of the cases that are currently accepted
+ // as vector element insertions.
+ if (Len->getZExtValue() != AllocaSize || Offset != 0)
+ ScalarKind = Integer;
+
IsNotTrivial = true; // Can't be mem2reg'd.
HadNonMemTransferAccess = true;
continue;
@@ -1053,16 +1095,37 @@ bool SROA::runOnFunction(Function &F) {
namespace {
class AllocaPromoter : public LoadAndStorePromoter {
AllocaInst *AI;
+ DIBuilder *DIB;
+ SmallVector<DbgDeclareInst *, 4> DDIs;
+ SmallVector<DbgValueInst *, 4> DVIs;
public:
AllocaPromoter(const SmallVectorImpl<Instruction*> &Insts, SSAUpdater &S,
- DbgDeclareInst *DD, DIBuilder *&DB)
- : LoadAndStorePromoter(Insts, S, DD, DB), AI(0) {}
+ DIBuilder *DB)
+ : LoadAndStorePromoter(Insts, S), AI(0), DIB(DB) {}
void run(AllocaInst *AI, const SmallVectorImpl<Instruction*> &Insts) {
// Remember which alloca we're promoting (for isInstInList).
this->AI = AI;
+ if (MDNode *DebugNode = MDNode::getIfExists(AI->getContext(), AI))
+ for (Value::use_iterator UI = DebugNode->use_begin(),
+ E = DebugNode->use_end(); UI != E; ++UI)
+ if (DbgDeclareInst *DDI = dyn_cast<DbgDeclareInst>(*UI))
+ DDIs.push_back(DDI);
+ else if (DbgValueInst *DVI = dyn_cast<DbgValueInst>(*UI))
+ DVIs.push_back(DVI);
+
LoadAndStorePromoter::run(Insts);
AI->eraseFromParent();
+ for (SmallVector<DbgDeclareInst *, 4>::iterator I = DDIs.begin(),
+ E = DDIs.end(); I != E; ++I) {
+ DbgDeclareInst *DDI = *I;
+ DDI->eraseFromParent();
+ }
+ for (SmallVector<DbgValueInst *, 4>::iterator I = DVIs.begin(),
+ E = DVIs.end(); I != E; ++I) {
+ DbgValueInst *DVI = *I;
+ DVI->eraseFromParent();
+ }
}
virtual bool isInstInList(Instruction *I,
@@ -1071,6 +1134,45 @@ public:
return LI->getOperand(0) == AI;
return cast<StoreInst>(I)->getPointerOperand() == AI;
}
+
+ virtual void updateDebugInfo(Instruction *Inst) const {
+ for (SmallVector<DbgDeclareInst *, 4>::const_iterator I = DDIs.begin(),
+ E = DDIs.end(); I != E; ++I) {
+ DbgDeclareInst *DDI = *I;
+ if (StoreInst *SI = dyn_cast<StoreInst>(Inst))
+ ConvertDebugDeclareToDebugValue(DDI, SI, *DIB);
+ else if (LoadInst *LI = dyn_cast<LoadInst>(Inst))
+ ConvertDebugDeclareToDebugValue(DDI, LI, *DIB);
+ }
+ for (SmallVector<DbgValueInst *, 4>::const_iterator I = DVIs.begin(),
+ E = DVIs.end(); I != E; ++I) {
+ DbgValueInst *DVI = *I;
+ if (StoreInst *SI = dyn_cast<StoreInst>(Inst)) {
+ Instruction *DbgVal = NULL;
+ // If an argument is zero extended then use argument directly. The ZExt
+ // may be zapped by an optimization pass in future.
+ Argument *ExtendedArg = NULL;
+ if (ZExtInst *ZExt = dyn_cast<ZExtInst>(SI->getOperand(0)))
+ ExtendedArg = dyn_cast<Argument>(ZExt->getOperand(0));
+ if (SExtInst *SExt = dyn_cast<SExtInst>(SI->getOperand(0)))
+ ExtendedArg = dyn_cast<Argument>(SExt->getOperand(0));
+ if (ExtendedArg)
+ DbgVal = DIB->insertDbgValueIntrinsic(ExtendedArg, 0,
+ DIVariable(DVI->getVariable()),
+ SI);
+ else
+ DbgVal = DIB->insertDbgValueIntrinsic(SI->getOperand(0), 0,
+ DIVariable(DVI->getVariable()),
+ SI);
+ DbgVal->setDebugLoc(DVI->getDebugLoc());
+ } else if (LoadInst *LI = dyn_cast<LoadInst>(Inst)) {
+ Instruction *DbgVal =
+ DIB->insertDbgValueIntrinsic(LI->getOperand(0), 0,
+ DIVariable(DVI->getVariable()), LI);
+ DbgVal->setDebugLoc(DVI->getDebugLoc());
+ }
+ }
+ }
};
} // end anon namespace
@@ -1262,7 +1364,7 @@ static bool tryToMakeAllocaBePromotable(AllocaInst *AI, const TargetData *TD) {
LoadInst *TrueLoad =
Builder.CreateLoad(SI->getTrueValue(), LI->getName()+".t");
LoadInst *FalseLoad =
- Builder.CreateLoad(SI->getFalseValue(), LI->getName()+".t");
+ Builder.CreateLoad(SI->getFalseValue(), LI->getName()+".f");
// Transfer alignment and TBAA info if present.
TrueLoad->setAlignment(LI->getAlignment());
@@ -1340,10 +1442,9 @@ bool SROA::performPromotion(Function &F) {
DT = &getAnalysis<DominatorTree>();
BasicBlock &BB = F.getEntryBlock(); // Get the entry node for the function
-
+ DIBuilder DIB(*F.getParent());
bool Changed = false;
SmallVector<Instruction*, 64> Insts;
- DIBuilder *DIB = 0;
while (1) {
Allocas.clear();
@@ -1367,11 +1468,7 @@ bool SROA::performPromotion(Function &F) {
for (Value::use_iterator UI = AI->use_begin(), E = AI->use_end();
UI != E; ++UI)
Insts.push_back(cast<Instruction>(*UI));
-
- DbgDeclareInst *DDI = FindAllocaDbgDeclare(AI);
- if (DDI && !DIB)
- DIB = new DIBuilder(*AI->getParent()->getParent()->getParent());
- AllocaPromoter(Insts, SSA, DDI, DIB).run(AI, Insts);
+ AllocaPromoter(Insts, SSA, &DIB).run(AI, Insts);
Insts.clear();
}
}
@@ -1379,10 +1476,6 @@ bool SROA::performPromotion(Function &F) {
Changed = true;
}
- // FIXME: Is there a better way to handle the lazy initialization of DIB
- // so that there doesn't need to be an explicit delete?
- delete DIB;
-
return Changed;
}
@@ -1403,8 +1496,8 @@ static bool ShouldAttemptScalarRepl(AllocaInst *AI) {
// performScalarRepl - This algorithm is a simple worklist driven algorithm,
-// which runs on all of the malloc/alloca instructions in the function, removing
-// them if they are only used by getelementptr instructions.
+// which runs on all of the alloca instructions in the function, removing them
+// if they are only used by getelementptr instructions.
//
bool SROA::performScalarRepl(Function &F) {
std::vector<AllocaInst*> WorkList;
@@ -1438,12 +1531,15 @@ bool SROA::performScalarRepl(Function &F) {
// the constant global instead. This is commonly produced by the CFE by
// constructs like "void foo() { int A[] = {1,2,3,4,5,6,7,8,9...}; }" if 'A'
// is only subsequently read.
- if (MemTransferInst *TheCopy = isOnlyCopiedFromConstantGlobal(AI)) {
+ SmallVector<Instruction *, 4> ToDelete;
+ if (MemTransferInst *Copy = isOnlyCopiedFromConstantGlobal(AI, ToDelete)) {
DEBUG(dbgs() << "Found alloca equal to global: " << *AI << '\n');
- DEBUG(dbgs() << " memcpy = " << *TheCopy << '\n');
- Constant *TheSrc = cast<Constant>(TheCopy->getSource());
+ DEBUG(dbgs() << " memcpy = " << *Copy << '\n');
+ for (unsigned i = 0, e = ToDelete.size(); i != e; ++i)
+ ToDelete[i]->eraseFromParent();
+ Constant *TheSrc = cast<Constant>(Copy->getSource());
AI->replaceAllUsesWith(ConstantExpr::getBitCast(TheSrc, AI->getType()));
- TheCopy->eraseFromParent(); // Don't mutate the global.
+ Copy->eraseFromParent(); // Don't mutate the global.
AI->eraseFromParent();
++NumGlobals;
Changed = true;
@@ -2467,8 +2563,14 @@ static bool PointsToConstantGlobal(Value *V) {
/// the uses. If we see a memcpy/memmove that targets an unoffseted pointer to
/// the alloca, and if the source pointer is a pointer to a constant global, we
/// can optimize this.
-static bool isOnlyCopiedFromConstantGlobal(Value *V, MemTransferInst *&TheCopy,
- bool isOffset) {
+static bool
+isOnlyCopiedFromConstantGlobal(Value *V, MemTransferInst *&TheCopy,
+ bool isOffset,
+ SmallVector<Instruction *, 4> &LifetimeMarkers) {
+ // We track lifetime intrinsics as we encounter them. If we decide to go
+ // ahead and replace the value with the global, this lets the caller quickly
+ // eliminate the markers.
+
for (Value::use_iterator UI = V->use_begin(), E = V->use_end(); UI!=E; ++UI) {
User *U = cast<Instruction>(*UI);
@@ -2480,7 +2582,8 @@ static bool isOnlyCopiedFromConstantGlobal(Value *V, MemTransferInst *&TheCopy,
if (BitCastInst *BCI = dyn_cast<BitCastInst>(U)) {
// If uses of the bitcast are ok, we are ok.
- if (!isOnlyCopiedFromConstantGlobal(BCI, TheCopy, isOffset))
+ if (!isOnlyCopiedFromConstantGlobal(BCI, TheCopy, isOffset,
+ LifetimeMarkers))
return false;
continue;
}
@@ -2488,7 +2591,8 @@ static bool isOnlyCopiedFromConstantGlobal(Value *V, MemTransferInst *&TheCopy,
// If the GEP has all zero indices, it doesn't offset the pointer. If it
// doesn't, it does.
if (!isOnlyCopiedFromConstantGlobal(GEP, TheCopy,
- isOffset || !GEP->hasAllZeroIndices()))
+ isOffset || !GEP->hasAllZeroIndices(),
+ LifetimeMarkers))
return false;
continue;
}
@@ -2514,6 +2618,16 @@ static bool isOnlyCopiedFromConstantGlobal(Value *V, MemTransferInst *&TheCopy,
continue;
}
+ // Lifetime intrinsics can be handled by the caller.
+ if (IntrinsicInst *II = dyn_cast<IntrinsicInst>(U)) {
+ if (II->getIntrinsicID() == Intrinsic::lifetime_start ||
+ II->getIntrinsicID() == Intrinsic::lifetime_end) {
+ assert(II->use_empty() && "Lifetime markers have no result to use!");
+ LifetimeMarkers.push_back(II);
+ continue;
+ }
+ }
+
// If this is isn't our memcpy/memmove, reject it as something we can't
// handle.
MemTransferInst *MI = dyn_cast<MemTransferInst>(U);
@@ -2550,9 +2664,11 @@ static bool isOnlyCopiedFromConstantGlobal(Value *V, MemTransferInst *&TheCopy,
/// isOnlyCopiedFromConstantGlobal - Return true if the specified alloca is only
/// modified by a copy from a constant global. If we can prove this, we can
/// replace any uses of the alloca with uses of the global directly.
-MemTransferInst *SROA::isOnlyCopiedFromConstantGlobal(AllocaInst *AI) {
+MemTransferInst *
+SROA::isOnlyCopiedFromConstantGlobal(AllocaInst *AI,
+ SmallVector<Instruction*, 4> &ToDelete) {
MemTransferInst *TheCopy = 0;
- if (::isOnlyCopiedFromConstantGlobal(AI, TheCopy, false))
+ if (::isOnlyCopiedFromConstantGlobal(AI, TheCopy, false, ToDelete))
return TheCopy;
return 0;
}
diff --git a/contrib/llvm/lib/Transforms/Scalar/SimplifyCFGPass.cpp b/contrib/llvm/lib/Transforms/Scalar/SimplifyCFGPass.cpp
index 7e9cc80..a66b3e3 100644
--- a/contrib/llvm/lib/Transforms/Scalar/SimplifyCFGPass.cpp
+++ b/contrib/llvm/lib/Transforms/Scalar/SimplifyCFGPass.cpp
@@ -91,8 +91,7 @@ static void ChangeToUnreachable(Instruction *I, bool UseLLVMTrap) {
static void ChangeToCall(InvokeInst *II) {
BasicBlock *BB = II->getParent();
SmallVector<Value*, 8> Args(II->op_begin(), II->op_end() - 3);
- CallInst *NewCall = CallInst::Create(II->getCalledValue(), Args.begin(),
- Args.end(), "", II);
+ CallInst *NewCall = CallInst::Create(II->getCalledValue(), Args, "", II);
NewCall->takeName(II);
NewCall->setCallingConv(II->getCallingConv());
NewCall->setAttributes(II->getAttributes());
diff --git a/contrib/llvm/lib/Transforms/Scalar/SimplifyLibCalls.cpp b/contrib/llvm/lib/Transforms/Scalar/SimplifyLibCalls.cpp
index 6247b03..7c415e5 100644
--- a/contrib/llvm/lib/Transforms/Scalar/SimplifyLibCalls.cpp
+++ b/contrib/llvm/lib/Transforms/Scalar/SimplifyLibCalls.cpp
@@ -992,9 +992,9 @@ struct FFSOpt : public LibCallOptimization {
}
// ffs(x) -> x != 0 ? (i32)llvm.cttz(x)+1 : 0
- const Type *ArgType = Op->getType();
+ Type *ArgType = Op->getType();
Value *F = Intrinsic::getDeclaration(Callee->getParent(),
- Intrinsic::cttz, &ArgType, 1);
+ Intrinsic::cttz, ArgType);
Value *V = B.CreateCall(F, Op, "cttz");
V = B.CreateAdd(V, ConstantInt::get(V->getType(), 1), "tmp");
V = B.CreateIntCast(V, B.getInt32Ty(), false, "tmp");
diff --git a/contrib/llvm/lib/Transforms/Utils/BasicBlockUtils.cpp b/contrib/llvm/lib/Transforms/Utils/BasicBlockUtils.cpp
index 92464e8..b4f74f9 100644
--- a/contrib/llvm/lib/Transforms/Utils/BasicBlockUtils.cpp
+++ b/contrib/llvm/lib/Transforms/Utils/BasicBlockUtils.cpp
@@ -153,13 +153,13 @@ bool llvm::MergeBlockIntoPredecessor(BasicBlock *BB, Pass *P) {
// Delete the unconditional branch from the predecessor...
PredBB->getInstList().pop_back();
- // Move all definitions in the successor to the predecessor...
- PredBB->getInstList().splice(PredBB->end(), BB->getInstList());
-
// Make all PHI nodes that referred to BB now refer to Pred as their
// source...
BB->replaceAllUsesWith(PredBB);
+ // Move all definitions in the successor to the predecessor...
+ PredBB->getInstList().splice(PredBB->end(), BB->getInstList());
+
// Inherit predecessors name if it exists.
if (!PredBB->hasName())
PredBB->takeName(BB);
diff --git a/contrib/llvm/lib/Transforms/Utils/BreakCriticalEdges.cpp b/contrib/llvm/lib/Transforms/Utils/BreakCriticalEdges.cpp
index d6206a3..92ce500 100644
--- a/contrib/llvm/lib/Transforms/Utils/BreakCriticalEdges.cpp
+++ b/contrib/llvm/lib/Transforms/Utils/BreakCriticalEdges.cpp
@@ -193,44 +193,22 @@ BasicBlock *llvm::SplitCriticalEdge(TerminatorInst *TI, unsigned SuccNum,
// If there are any PHI nodes in DestBB, we need to update them so that they
// merge incoming values from NewBB instead of from TIBB.
- if (PHINode *APHI = dyn_cast<PHINode>(DestBB->begin())) {
- // This conceptually does:
- // foreach (PHINode *PN in DestBB)
- // PN->setIncomingBlock(PN->getIncomingBlock(TIBB), NewBB);
- // but is optimized for two cases.
-
- if (APHI->getNumIncomingValues() <= 8) { // Small # preds case.
- unsigned BBIdx = 0;
- for (BasicBlock::iterator I = DestBB->begin(); isa<PHINode>(I); ++I) {
- // We no longer enter through TIBB, now we come in through NewBB.
- // Revector exactly one entry in the PHI node that used to come from
- // TIBB to come from NewBB.
- PHINode *PN = cast<PHINode>(I);
-
- // Reuse the previous value of BBIdx if it lines up. In cases where we
- // have multiple phi nodes with *lots* of predecessors, this is a speed
- // win because we don't have to scan the PHI looking for TIBB. This
- // happens because the BB list of PHI nodes are usually in the same
- // order.
- if (PN->getIncomingBlock(BBIdx) != TIBB)
- BBIdx = PN->getBasicBlockIndex(TIBB);
- PN->setIncomingBlock(BBIdx, NewBB);
- }
- } else {
- // However, the foreach loop is slow for blocks with lots of predecessors
- // because PHINode::getIncomingBlock is O(n) in # preds. Instead, walk
- // the user list of TIBB to find the PHI nodes.
- SmallPtrSet<PHINode*, 16> UpdatedPHIs;
-
- for (Value::use_iterator UI = TIBB->use_begin(), E = TIBB->use_end();
- UI != E; ) {
- Value::use_iterator Use = UI++;
- if (PHINode *PN = dyn_cast<PHINode>(*Use)) {
- // Remove one entry from each PHI.
- if (PN->getParent() == DestBB && UpdatedPHIs.insert(PN))
- PN->setOperand(Use.getOperandNo(), NewBB);
- }
- }
+ {
+ unsigned BBIdx = 0;
+ for (BasicBlock::iterator I = DestBB->begin(); isa<PHINode>(I); ++I) {
+ // We no longer enter through TIBB, now we come in through NewBB.
+ // Revector exactly one entry in the PHI node that used to come from
+ // TIBB to come from NewBB.
+ PHINode *PN = cast<PHINode>(I);
+
+ // Reuse the previous value of BBIdx if it lines up. In cases where we
+ // have multiple phi nodes with *lots* of predecessors, this is a speed
+ // win because we don't have to scan the PHI looking for TIBB. This
+ // happens because the BB list of PHI nodes are usually in the same
+ // order.
+ if (PN->getIncomingBlock(BBIdx) != TIBB)
+ BBIdx = PN->getBasicBlockIndex(TIBB);
+ PN->setIncomingBlock(BBIdx, NewBB);
}
}
diff --git a/contrib/llvm/lib/Transforms/Utils/CloneFunction.cpp b/contrib/llvm/lib/Transforms/Utils/CloneFunction.cpp
index d967ceb..6ea831f 100644
--- a/contrib/llvm/lib/Transforms/Utils/CloneFunction.cpp
+++ b/contrib/llvm/lib/Transforms/Utils/CloneFunction.cpp
@@ -140,7 +140,7 @@ void llvm::CloneFunctionInto(Function *NewFunc, const Function *OldFunc,
Function *llvm::CloneFunction(const Function *F, ValueToValueMapTy &VMap,
bool ModuleLevelChanges,
ClonedCodeInfo *CodeInfo) {
- std::vector<const Type*> ArgTypes;
+ std::vector<Type*> ArgTypes;
// The user might be deleting arguments to the function by specifying them in
// the VMap. If so, we need to not add the arguments to the arg ty vector
@@ -342,18 +342,6 @@ ConstantFoldMappedInstruction(const Instruction *I) {
Ops.size(), TD);
}
-static DebugLoc
-UpdateInlinedAtInfo(const DebugLoc &InsnDL, const DebugLoc &TheCallDL,
- LLVMContext &Ctx) {
- DebugLoc NewLoc = TheCallDL;
- if (MDNode *IA = InsnDL.getInlinedAt(Ctx))
- NewLoc = UpdateInlinedAtInfo(DebugLoc::getFromDILocation(IA), TheCallDL,
- Ctx);
-
- return DebugLoc::get(InsnDL.getLine(), InsnDL.getCol(),
- InsnDL.getScope(Ctx), NewLoc.getAsMDNode(Ctx));
-}
-
/// CloneAndPruneFunctionInto - This works exactly like CloneFunctionInto,
/// except that it does some simple constant prop and DCE on the fly. The
/// effect of this is to copy significantly less code in cases where (for
@@ -418,50 +406,14 @@ void llvm::CloneAndPruneFunctionInto(Function *NewFunc, const Function *OldFunc,
if (PHINode *PN = dyn_cast<PHINode>(I)) {
// Skip over all PHI nodes, remembering them for later.
BasicBlock::const_iterator OldI = BI->begin();
- for (; (PN = dyn_cast<PHINode>(I)); ++I, ++OldI) {
- if (I->hasMetadata()) {
- if (!TheCallDL.isUnknown()) {
- DebugLoc IDL = I->getDebugLoc();
- if (!IDL.isUnknown()) {
- DebugLoc NewDL = UpdateInlinedAtInfo(IDL, TheCallDL,
- I->getContext());
- I->setDebugLoc(NewDL);
- }
- } else {
- // The cloned instruction has dbg info but the call instruction
- // does not have dbg info. Remove dbg info from cloned instruction.
- I->setDebugLoc(DebugLoc());
- }
- }
+ for (; (PN = dyn_cast<PHINode>(I)); ++I, ++OldI)
PHIToResolve.push_back(cast<PHINode>(OldI));
- }
}
- // FIXME:
- // FIXME:
- // FIXME: Unclone all this metadata stuff.
- // FIXME:
- // FIXME:
-
// Otherwise, remap the rest of the instructions normally.
- for (; I != NewBB->end(); ++I) {
- if (I->hasMetadata()) {
- if (!TheCallDL.isUnknown()) {
- DebugLoc IDL = I->getDebugLoc();
- if (!IDL.isUnknown()) {
- DebugLoc NewDL = UpdateInlinedAtInfo(IDL, TheCallDL,
- I->getContext());
- I->setDebugLoc(NewDL);
- }
- } else {
- // The cloned instruction has dbg info but the call instruction
- // does not have dbg info. Remove dbg info from cloned instruction.
- I->setDebugLoc(DebugLoc());
- }
- }
+ for (; I != NewBB->end(); ++I)
RemapInstruction(I, VMap,
ModuleLevelChanges ? RF_None : RF_NoModuleLevelChanges);
- }
}
// Defer PHI resolution until rest of function is resolved, PHI resolution
@@ -572,12 +524,12 @@ void llvm::CloneAndPruneFunctionInto(Function *NewFunc, const Function *OldFunc,
// removed, so we just need to splice the blocks.
BI->eraseFromParent();
- // Move all the instructions in the succ to the pred.
- I->getInstList().splice(I->end(), Dest->getInstList());
-
// Make all PHI nodes that referred to Dest now refer to I as their source.
Dest->replaceAllUsesWith(I);
+ // Move all the instructions in the succ to the pred.
+ I->getInstList().splice(I->end(), Dest->getInstList());
+
// Remove the dest block.
Dest->eraseFromParent();
diff --git a/contrib/llvm/lib/Transforms/Utils/CloneLoop.cpp b/contrib/llvm/lib/Transforms/Utils/CloneLoop.cpp
deleted file mode 100644
index 87dd141..0000000
--- a/contrib/llvm/lib/Transforms/Utils/CloneLoop.cpp
+++ /dev/null
@@ -1,128 +0,0 @@
-//===- CloneLoop.cpp - Clone loop nest ------------------------------------===//
-//
-// The LLVM Compiler Infrastructure
-//
-// This file is distributed under the University of Illinois Open Source
-// License. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-//
-// This file implements the CloneLoop interface which makes a copy of a loop.
-//
-//===----------------------------------------------------------------------===//
-
-#include "llvm/Transforms/Utils/Cloning.h"
-#include "llvm/BasicBlock.h"
-#include "llvm/Analysis/LoopPass.h"
-#include "llvm/Analysis/Dominators.h"
-
-
-using namespace llvm;
-
-/// CloneDominatorInfo - Clone a basic block's dominator tree. It is expected
-/// that the basic block is already cloned.
-static void CloneDominatorInfo(BasicBlock *BB,
- ValueToValueMapTy &VMap,
- DominatorTree *DT) {
-
- assert (DT && "DominatorTree is not available");
- ValueToValueMapTy::iterator BI = VMap.find(BB);
- assert (BI != VMap.end() && "BasicBlock clone is missing");
- BasicBlock *NewBB = cast<BasicBlock>(BI->second);
-
- // NewBB already got dominator info.
- if (DT->getNode(NewBB))
- return;
-
- assert (DT->getNode(BB) && "BasicBlock does not have dominator info");
- // Entry block is not expected here. Infinite loops are not to cloned.
- assert (DT->getNode(BB)->getIDom() && "BasicBlock does not have immediate dominator");
- BasicBlock *BBDom = DT->getNode(BB)->getIDom()->getBlock();
-
- // NewBB's dominator is either BB's dominator or BB's dominator's clone.
- BasicBlock *NewBBDom = BBDom;
- ValueToValueMapTy::iterator BBDomI = VMap.find(BBDom);
- if (BBDomI != VMap.end()) {
- NewBBDom = cast<BasicBlock>(BBDomI->second);
- if (!DT->getNode(NewBBDom))
- CloneDominatorInfo(BBDom, VMap, DT);
- }
- DT->addNewBlock(NewBB, NewBBDom);
-}
-
-/// CloneLoop - Clone Loop. Clone dominator info. Populate VMap
-/// using old blocks to new blocks mapping.
-Loop *llvm::CloneLoop(Loop *OrigL, LPPassManager *LPM, LoopInfo *LI,
- ValueToValueMapTy &VMap, Pass *P) {
-
- DominatorTree *DT = NULL;
- if (P)
- DT = P->getAnalysisIfAvailable<DominatorTree>();
-
- SmallVector<BasicBlock *, 16> NewBlocks;
-
- // Populate loop nest.
- SmallVector<Loop *, 8> LoopNest;
- LoopNest.push_back(OrigL);
-
-
- Loop *NewParentLoop = NULL;
- do {
- Loop *L = LoopNest.pop_back_val();
- Loop *NewLoop = new Loop();
-
- if (!NewParentLoop)
- NewParentLoop = NewLoop;
-
- LPM->insertLoop(NewLoop, L->getParentLoop());
-
- // Clone Basic Blocks.
- for (Loop::block_iterator I = L->block_begin(), E = L->block_end();
- I != E; ++I) {
- BasicBlock *BB = *I;
- BasicBlock *NewBB = CloneBasicBlock(BB, VMap, ".clone");
- VMap[BB] = NewBB;
- if (P)
- LPM->cloneBasicBlockSimpleAnalysis(BB, NewBB, L);
- NewLoop->addBasicBlockToLoop(NewBB, LI->getBase());
- NewBlocks.push_back(NewBB);
- }
-
- // Clone dominator info.
- if (DT)
- for (Loop::block_iterator I = L->block_begin(), E = L->block_end();
- I != E; ++I) {
- BasicBlock *BB = *I;
- CloneDominatorInfo(BB, VMap, DT);
- }
-
- // Process sub loops
- for (Loop::iterator I = L->begin(), E = L->end(); I != E; ++I)
- LoopNest.push_back(*I);
- } while (!LoopNest.empty());
-
- // Remap instructions to reference operands from VMap.
- for(SmallVector<BasicBlock *, 16>::iterator NBItr = NewBlocks.begin(),
- NBE = NewBlocks.end(); NBItr != NBE; ++NBItr) {
- BasicBlock *NB = *NBItr;
- for(BasicBlock::iterator BI = NB->begin(), BE = NB->end();
- BI != BE; ++BI) {
- Instruction *Insn = BI;
- for (unsigned index = 0, num_ops = Insn->getNumOperands();
- index != num_ops; ++index) {
- Value *Op = Insn->getOperand(index);
- ValueToValueMapTy::iterator OpItr = VMap.find(Op);
- if (OpItr != VMap.end())
- Insn->setOperand(index, OpItr->second);
- }
- }
- }
-
- BasicBlock *Latch = OrigL->getLoopLatch();
- Function *F = Latch->getParent();
- F->getBasicBlockList().insert(OrigL->getHeader(),
- NewBlocks.begin(), NewBlocks.end());
-
-
- return NewParentLoop;
-}
diff --git a/contrib/llvm/lib/Transforms/Utils/CloneModule.cpp b/contrib/llvm/lib/Transforms/Utils/CloneModule.cpp
index 1046c38..a08fa35 100644
--- a/contrib/llvm/lib/Transforms/Utils/CloneModule.cpp
+++ b/contrib/llvm/lib/Transforms/Utils/CloneModule.cpp
@@ -15,7 +15,6 @@
#include "llvm/Transforms/Utils/Cloning.h"
#include "llvm/Module.h"
#include "llvm/DerivedTypes.h"
-#include "llvm/TypeSymbolTable.h"
#include "llvm/Constant.h"
#include "llvm/Transforms/Utils/ValueMapper.h"
using namespace llvm;
@@ -32,20 +31,13 @@ Module *llvm::CloneModule(const Module *M) {
return CloneModule(M, VMap);
}
-Module *llvm::CloneModule(const Module *M,
- ValueToValueMapTy &VMap) {
- // First off, we need to create the new module...
+Module *llvm::CloneModule(const Module *M, ValueToValueMapTy &VMap) {
+ // First off, we need to create the new module.
Module *New = new Module(M->getModuleIdentifier(), M->getContext());
New->setDataLayout(M->getDataLayout());
New->setTargetTriple(M->getTargetTriple());
New->setModuleInlineAsm(M->getModuleInlineAsm());
-
- // Copy all of the type symbol table entries over.
- const TypeSymbolTable &TST = M->getTypeSymbolTable();
- for (TypeSymbolTable::const_iterator TI = TST.begin(), TE = TST.end();
- TI != TE; ++TI)
- New->addTypeName(TI->first, TI->second);
-
+
// Copy all of the dependent libraries over.
for (Module::lib_iterator I = M->lib_begin(), E = M->lib_end(); I != E; ++I)
New->addLibrary(*I);
@@ -88,8 +80,7 @@ Module *llvm::CloneModule(const Module *M,
I != E; ++I) {
GlobalVariable *GV = cast<GlobalVariable>(VMap[I]);
if (I->hasInitializer())
- GV->setInitializer(cast<Constant>(MapValue(I->getInitializer(),
- VMap, RF_None)));
+ GV->setInitializer(MapValue(I->getInitializer(), VMap));
GV->setLinkage(I->getLinkage());
GV->setThreadLocal(I->isThreadLocal());
GV->setConstant(I->isConstant());
@@ -119,8 +110,8 @@ Module *llvm::CloneModule(const Module *M,
I != E; ++I) {
GlobalAlias *GA = cast<GlobalAlias>(VMap[I]);
GA->setLinkage(I->getLinkage());
- if (const Constant* C = I->getAliasee())
- GA->setAliasee(cast<Constant>(MapValue(C, VMap, RF_None)));
+ if (const Constant *C = I->getAliasee())
+ GA->setAliasee(MapValue(C, VMap));
}
// And named metadata....
@@ -129,8 +120,7 @@ Module *llvm::CloneModule(const Module *M,
const NamedMDNode &NMD = *I;
NamedMDNode *NewNMD = New->getOrInsertNamedMetadata(NMD.getName());
for (unsigned i = 0, e = NMD.getNumOperands(); i != e; ++i)
- NewNMD->addOperand(cast<MDNode>(MapValue(NMD.getOperand(i), VMap,
- RF_None)));
+ NewNMD->addOperand(MapValue(NMD.getOperand(i), VMap));
}
return New;
diff --git a/contrib/llvm/lib/Transforms/Utils/CodeExtractor.cpp b/contrib/llvm/lib/Transforms/Utils/CodeExtractor.cpp
index 8c133ea..0813523 100644
--- a/contrib/llvm/lib/Transforms/Utils/CodeExtractor.cpp
+++ b/contrib/llvm/lib/Transforms/Utils/CodeExtractor.cpp
@@ -258,7 +258,7 @@ Function *CodeExtractor::constructFunction(const Values &inputs,
default: RetTy = Type::getInt16Ty(header->getContext()); break;
}
- std::vector<const Type*> paramTy;
+ std::vector<Type*> paramTy;
// Add the types of the input values to the function's argument list
for (Values::const_iterator i = inputs.begin(),
@@ -279,7 +279,7 @@ Function *CodeExtractor::constructFunction(const Values &inputs,
}
DEBUG(dbgs() << "Function type: " << *RetTy << " f(");
- for (std::vector<const Type*>::iterator i = paramTy.begin(),
+ for (std::vector<Type*>::iterator i = paramTy.begin(),
e = paramTy.end(); i != e; ++i)
DEBUG(dbgs() << **i << ", ");
DEBUG(dbgs() << ")\n");
@@ -403,7 +403,7 @@ emitCallAndSwitchStatement(Function *newFunction, BasicBlock *codeReplacer,
AllocaInst *Struct = 0;
if (AggregateArgs && (inputs.size() + outputs.size() > 0)) {
- std::vector<const Type*> ArgTypes;
+ std::vector<Type*> ArgTypes;
for (Values::iterator v = StructValues.begin(),
ve = StructValues.end(); v != ve; ++v)
ArgTypes.push_back((*v)->getType());
@@ -429,7 +429,7 @@ emitCallAndSwitchStatement(Function *newFunction, BasicBlock *codeReplacer,
}
// Emit the call to the function
- CallInst *call = CallInst::Create(newFunction, params.begin(), params.end(),
+ CallInst *call = CallInst::Create(newFunction, params,
NumExitBlocks > 1 ? "targetBlock" : "");
codeReplacer->getInstList().push_back(call);
diff --git a/contrib/llvm/lib/Transforms/Utils/InlineFunction.cpp b/contrib/llvm/lib/Transforms/Utils/InlineFunction.cpp
index 8416170..d5b382e 100644
--- a/contrib/llvm/lib/Transforms/Utils/InlineFunction.cpp
+++ b/contrib/llvm/lib/Transforms/Utils/InlineFunction.cpp
@@ -449,11 +449,8 @@ static bool HandleCallsInBlockInlinedThroughInvoke(BasicBlock *BB,
for (unsigned i = 2, e = Outer->getNumArgOperands(); i != e; ++i)
NewSelector.push_back(Outer->getArgOperand(i));
- CallInst *NewInner = CallInst::Create(Inner->getCalledValue(),
- NewSelector.begin(),
- NewSelector.end(),
- "",
- Inner);
+ CallInst *NewInner =
+ IRBuilder<>(Inner).CreateCall(Inner->getCalledValue(), NewSelector);
// No need to copy attributes, calling convention, etc.
NewInner->takeName(Inner);
Inner->replaceAllUsesWith(NewInner);
@@ -489,8 +486,7 @@ static bool HandleCallsInBlockInlinedThroughInvoke(BasicBlock *BB,
InvokeInst *II =
InvokeInst::Create(CI->getCalledValue(), Split,
Invoke.getOuterUnwindDest(),
- InvokeArgs.begin(), InvokeArgs.end(),
- CI->getName(), BB);
+ InvokeArgs, CI->getName(), BB);
II->setCallingConv(CI->getCallingConv());
II->setAttributes(CI->getAttributes());
@@ -664,7 +660,7 @@ static Value *HandleByValArgument(Value *Arg, Instruction *TheCall,
LLVMContext &Context = Arg->getContext();
- const Type *VoidPtrTy = Type::getInt8PtrTy(Context);
+ Type *VoidPtrTy = Type::getInt8PtrTy(Context);
// Create the alloca. If we have TargetData, use nice alignment.
unsigned Align = 1;
@@ -681,10 +677,10 @@ static Value *HandleByValArgument(Value *Arg, Instruction *TheCall,
Value *NewAlloca = new AllocaInst(AggTy, 0, Align, Arg->getName(),
&*Caller->begin()->begin());
// Emit a memcpy.
- const Type *Tys[3] = {VoidPtrTy, VoidPtrTy, Type::getInt64Ty(Context)};
+ Type *Tys[3] = {VoidPtrTy, VoidPtrTy, Type::getInt64Ty(Context)};
Function *MemCpyFn = Intrinsic::getDeclaration(Caller->getParent(),
Intrinsic::memcpy,
- Tys, 3);
+ Tys);
Value *DestCast = new BitCastInst(NewAlloca, VoidPtrTy, "tmp", TheCall);
Value *SrcCast = new BitCastInst(Arg, VoidPtrTy, "tmp", TheCall);
@@ -703,7 +699,7 @@ static Value *HandleByValArgument(Value *Arg, Instruction *TheCall,
ConstantInt::get(Type::getInt32Ty(Context), 1),
ConstantInt::getFalse(Context) // isVolatile
};
- CallInst::Create(MemCpyFn, CallArgs, CallArgs+5, "", TheCall);
+ IRBuilder<>(TheCall).CreateCall(MemCpyFn, CallArgs);
// Uses of the argument in the function should use our new alloca
// instead.
@@ -734,17 +730,52 @@ static bool hasLifetimeMarkers(AllocaInst *AI) {
if (AI->getType() == Int8PtrTy)
return isUsedByLifetimeMarker(AI);
- // Do a scan to find all the bitcasts to i8*.
+ // Do a scan to find all the casts to i8*.
for (Value::use_iterator I = AI->use_begin(), E = AI->use_end(); I != E;
++I) {
if (I->getType() != Int8PtrTy) continue;
- if (!isa<BitCastInst>(*I)) continue;
+ if (I->stripPointerCasts() != AI) continue;
if (isUsedByLifetimeMarker(*I))
return true;
}
return false;
}
+/// updateInlinedAtInfo - Helper function used by fixupLineNumbers to recursively
+/// update InlinedAtEntry of a DebugLoc.
+static DebugLoc updateInlinedAtInfo(const DebugLoc &DL,
+ const DebugLoc &InlinedAtDL,
+ LLVMContext &Ctx) {
+ if (MDNode *IA = DL.getInlinedAt(Ctx)) {
+ DebugLoc NewInlinedAtDL
+ = updateInlinedAtInfo(DebugLoc::getFromDILocation(IA), InlinedAtDL, Ctx);
+ return DebugLoc::get(DL.getLine(), DL.getCol(), DL.getScope(Ctx),
+ NewInlinedAtDL.getAsMDNode(Ctx));
+ }
+
+ return DebugLoc::get(DL.getLine(), DL.getCol(), DL.getScope(Ctx),
+ InlinedAtDL.getAsMDNode(Ctx));
+}
+
+
+/// fixupLineNumbers - Update inlined instructions' line numbers to
+/// to encode location where these instructions are inlined.
+static void fixupLineNumbers(Function *Fn, Function::iterator FI,
+ Instruction *TheCall) {
+ DebugLoc TheCallDL = TheCall->getDebugLoc();
+ if (TheCallDL.isUnknown())
+ return;
+
+ for (; FI != Fn->end(); ++FI) {
+ for (BasicBlock::iterator BI = FI->begin(), BE = FI->end();
+ BI != BE; ++BI) {
+ DebugLoc DL = BI->getDebugLoc();
+ if (!DL.isUnknown())
+ BI->setDebugLoc(updateInlinedAtInfo(DL, TheCallDL, BI->getContext()));
+ }
+ }
+}
+
// InlineFunction - This function inlines the called function into the basic
// block of the caller. This returns false if it is not possible to inline this
// call. The program is still in a well defined state if this occurs though.
@@ -847,6 +878,9 @@ bool llvm::InlineFunction(CallSite CS, InlineFunctionInfo &IFI) {
// Update the callgraph if requested.
if (IFI.CG)
UpdateCallGraphAfterInlining(CS, FirstNewBlock, VMap, IFI);
+
+ // Update inlined instructions' line number information.
+ fixupLineNumbers(Caller, FirstNewBlock, TheCall);
}
// If there are any alloca instructions in the block that used to be the entry
@@ -920,13 +954,13 @@ bool llvm::InlineFunction(CallSite CS, InlineFunctionInfo &IFI) {
Function *StackRestore=Intrinsic::getDeclaration(M,Intrinsic::stackrestore);
// Insert the llvm.stacksave.
- CallInst *SavedPtr = CallInst::Create(StackSave, "savedstack",
- FirstNewBlock->begin());
+ CallInst *SavedPtr = IRBuilder<>(FirstNewBlock, FirstNewBlock->begin())
+ .CreateCall(StackSave, "savedstack");
// Insert a call to llvm.stackrestore before any return instructions in the
// inlined function.
for (unsigned i = 0, e = Returns.size(); i != e; ++i) {
- CallInst::Create(StackRestore, SavedPtr, "", Returns[i]);
+ IRBuilder<>(Returns[i]).CreateCall(StackRestore, SavedPtr);
}
// Count the number of StackRestore calls we insert.
@@ -938,7 +972,7 @@ bool llvm::InlineFunction(CallSite CS, InlineFunctionInfo &IFI) {
for (Function::iterator BB = FirstNewBlock, E = Caller->end();
BB != E; ++BB)
if (UnwindInst *UI = dyn_cast<UnwindInst>(BB->getTerminator())) {
- CallInst::Create(StackRestore, SavedPtr, "", UI);
+ IRBuilder<>(UI).CreateCall(StackRestore, SavedPtr);
++NumStackRestores;
}
}
@@ -1098,15 +1132,15 @@ bool llvm::InlineFunction(CallSite CS, InlineFunctionInfo &IFI) {
TheCall->replaceAllUsesWith(Returns[0]->getReturnValue());
}
+ // Update PHI nodes that use the ReturnBB to use the AfterCallBB.
+ BasicBlock *ReturnBB = Returns[0]->getParent();
+ ReturnBB->replaceAllUsesWith(AfterCallBB);
+
// Splice the code from the return block into the block that it will return
// to, which contains the code that was after the call.
- BasicBlock *ReturnBB = Returns[0]->getParent();
AfterCallBB->getInstList().splice(AfterCallBB->begin(),
ReturnBB->getInstList());
- // Update PHI nodes that use the ReturnBB to use the AfterCallBB.
- ReturnBB->replaceAllUsesWith(AfterCallBB);
-
// Delete the return instruction now and empty ReturnBB now.
Returns[0]->eraseFromParent();
ReturnBB->eraseFromParent();
@@ -1126,8 +1160,8 @@ bool llvm::InlineFunction(CallSite CS, InlineFunctionInfo &IFI) {
// Splice the code entry block into calling block, right before the
// unconditional branch.
- OrigBB->getInstList().splice(Br, CalleeEntry->getInstList());
CalleeEntry->replaceAllUsesWith(OrigBB); // Update PHI nodes
+ OrigBB->getInstList().splice(Br, CalleeEntry->getInstList());
// Remove the unconditional branch.
OrigBB->getInstList().erase(Br);
diff --git a/contrib/llvm/lib/Transforms/Utils/Local.cpp b/contrib/llvm/lib/Transforms/Utils/Local.cpp
index 3bdbaa5..0f6d9ae 100644
--- a/contrib/llvm/lib/Transforms/Utils/Local.cpp
+++ b/contrib/llvm/lib/Transforms/Utils/Local.cpp
@@ -427,10 +427,6 @@ void llvm::MergeBasicBlockIntoOnlyPred(BasicBlock *DestBB, Pass *P) {
BasicBlock *PredBB = DestBB->getSinglePredecessor();
assert(PredBB && "Block doesn't have a single predecessor!");
- // Splice all the instructions from PredBB to DestBB.
- PredBB->getTerminator()->eraseFromParent();
- DestBB->getInstList().splice(DestBB->begin(), PredBB->getInstList());
-
// Zap anything that took the address of DestBB. Not doing this will give the
// address an invalid value.
if (DestBB->hasAddressTaken()) {
@@ -445,6 +441,10 @@ void llvm::MergeBasicBlockIntoOnlyPred(BasicBlock *DestBB, Pass *P) {
// Anything that branched to PredBB now branches to DestBB.
PredBB->replaceAllUsesWith(DestBB);
+ // Splice all the instructions from PredBB to DestBB.
+ PredBB->getTerminator()->eraseFromParent();
+ DestBB->getInstList().splice(DestBB->begin(), PredBB->getInstList());
+
if (P) {
DominatorTree *DT = P->getAnalysisIfAvailable<DominatorTree>();
if (DT) {
@@ -536,9 +536,9 @@ static bool CanPropagatePredecessorsForPHIs(BasicBlock *BB, BasicBlock *Succ) {
/// TryToSimplifyUncondBranchFromEmptyBlock - BB is known to contain an
/// unconditional branch, and contains no instructions other than PHI nodes,
-/// potential debug intrinsics and the branch. If possible, eliminate BB by
-/// rewriting all the predecessors to branch to the successor block and return
-/// true. If we can't transform, return false.
+/// potential side-effect free intrinsics and the branch. If possible,
+/// eliminate BB by rewriting all the predecessors to branch to the successor
+/// block and return true. If we can't transform, return false.
bool llvm::TryToSimplifyUncondBranchFromEmptyBlock(BasicBlock *BB) {
assert(BB != &BB->getParent()->getEntryBlock() &&
"TryToSimplifyUncondBranchFromEmptyBlock called on entry block!");
@@ -613,13 +613,15 @@ bool llvm::TryToSimplifyUncondBranchFromEmptyBlock(BasicBlock *BB) {
}
}
- while (PHINode *PN = dyn_cast<PHINode>(&BB->front())) {
- if (Succ->getSinglePredecessor()) {
- // BB is the only predecessor of Succ, so Succ will end up with exactly
- // the same predecessors BB had.
- Succ->getInstList().splice(Succ->begin(),
- BB->getInstList(), BB->begin());
- } else {
+ if (Succ->getSinglePredecessor()) {
+ // BB is the only predecessor of Succ, so Succ will end up with exactly
+ // the same predecessors BB had.
+
+ // Copy over any phi, debug or lifetime instruction.
+ BB->getTerminator()->eraseFromParent();
+ Succ->getInstList().splice(Succ->getFirstNonPHI(), BB->getInstList());
+ } else {
+ while (PHINode *PN = dyn_cast<PHINode>(&BB->front())) {
// We explicitly check for such uses in CanPropagatePredecessorsForPHIs.
assert(PN->use_empty() && "There shouldn't be any uses here!");
PN->eraseFromParent();
@@ -642,7 +644,7 @@ bool llvm::EliminateDuplicatePHINodes(BasicBlock *BB) {
bool Changed = false;
// This implementation doesn't currently consider undef operands
- // specially. Theroetically, two phis which are identical except for
+ // specially. Theoretically, two phis which are identical except for
// one having an undef where the other doesn't could be collapsed.
// Map from PHI hash values to PHI nodes. If multiple PHIs have
@@ -660,12 +662,17 @@ bool llvm::EliminateDuplicatePHINodes(BasicBlock *BB) {
// them, which helps expose duplicates, but we have to check all the
// operands to be safe in case instcombine hasn't run.
uintptr_t Hash = 0;
+ // This hash algorithm is quite weak as hash functions go, but it seems
+ // to do a good enough job for this particular purpose, and is very quick.
for (User::op_iterator I = PN->op_begin(), E = PN->op_end(); I != E; ++I) {
- // This hash algorithm is quite weak as hash functions go, but it seems
- // to do a good enough job for this particular purpose, and is very quick.
Hash ^= reinterpret_cast<uintptr_t>(static_cast<Value *>(*I));
Hash = (Hash << 7) | (Hash >> (sizeof(uintptr_t) * CHAR_BIT - 7));
}
+ for (PHINode::block_iterator I = PN->block_begin(), E = PN->block_end();
+ I != E; ++I) {
+ Hash ^= reinterpret_cast<uintptr_t>(static_cast<BasicBlock *>(*I));
+ Hash = (Hash << 7) | (Hash >> (sizeof(uintptr_t) * CHAR_BIT - 7));
+ }
// Avoid colliding with the DenseMap sentinels ~0 and ~0-1.
Hash >>= 1;
// If we've never seen this hash value before, it's a unique PHI.
@@ -706,39 +713,15 @@ bool llvm::EliminateDuplicatePHINodes(BasicBlock *BB) {
///
static unsigned enforceKnownAlignment(Value *V, unsigned Align,
unsigned PrefAlign) {
+ V = V->stripPointerCasts();
- User *U = dyn_cast<User>(V);
- if (!U) return Align;
-
- switch (Operator::getOpcode(U)) {
- default: break;
- case Instruction::BitCast:
- return enforceKnownAlignment(U->getOperand(0), Align, PrefAlign);
- case Instruction::GetElementPtr: {
- // If all indexes are zero, it is just the alignment of the base pointer.
- bool AllZeroOperands = true;
- for (User::op_iterator i = U->op_begin() + 1, e = U->op_end(); i != e; ++i)
- if (!isa<Constant>(*i) ||
- !cast<Constant>(*i)->isNullValue()) {
- AllZeroOperands = false;
- break;
- }
-
- if (AllZeroOperands) {
- // Treat this like a bitcast.
- return enforceKnownAlignment(U->getOperand(0), Align, PrefAlign);
- }
- return Align;
- }
- case Instruction::Alloca: {
- AllocaInst *AI = cast<AllocaInst>(V);
+ if (AllocaInst *AI = dyn_cast<AllocaInst>(V)) {
// If there is a requested alignment and if this is an alloca, round up.
if (AI->getAlignment() >= PrefAlign)
return AI->getAlignment();
AI->setAlignment(PrefAlign);
return PrefAlign;
}
- }
if (GlobalValue *GV = dyn_cast<GlobalValue>(V)) {
// If there is a large requested alignment and we can, bump up the alignment
diff --git a/contrib/llvm/lib/Transforms/Utils/LoopSimplify.cpp b/contrib/llvm/lib/Transforms/Utils/LoopSimplify.cpp
index f02ffd2..e79fb5a 100644
--- a/contrib/llvm/lib/Transforms/Utils/LoopSimplify.cpp
+++ b/contrib/llvm/lib/Transforms/Utils/LoopSimplify.cpp
@@ -375,6 +375,7 @@ BasicBlock *LoopSimplify::InsertPreheaderForLoop(Loop *L) {
SplitBlockPredecessors(Header, &OutsideBlocks[0], OutsideBlocks.size(),
".preheader", this);
+ NewBB->getTerminator()->setDebugLoc(Header->getFirstNonPHI()->getDebugLoc());
DEBUG(dbgs() << "LoopSimplify: Creating pre-header " << NewBB->getName()
<< "\n");
diff --git a/contrib/llvm/lib/Transforms/Utils/LoopUnroll.cpp b/contrib/llvm/lib/Transforms/Utils/LoopUnroll.cpp
index 7da7271..6772511 100644
--- a/contrib/llvm/lib/Transforms/Utils/LoopUnroll.cpp
+++ b/contrib/llvm/lib/Transforms/Utils/LoopUnroll.cpp
@@ -47,6 +47,14 @@ static inline void RemapInstruction(Instruction *I,
if (It != VMap.end())
I->setOperand(op, It->second);
}
+
+ if (PHINode *PN = dyn_cast<PHINode>(I)) {
+ for (unsigned i = 0, e = PN->getNumIncomingValues(); i != e; ++i) {
+ ValueToValueMapTy::iterator It = VMap.find(PN->getIncomingBlock(i));
+ if (It != VMap.end())
+ PN->setIncomingBlock(i, cast<BasicBlock>(It->second));
+ }
+ }
}
/// FoldBlockIntoPredecessor - Folds a basic block into its predecessor if it
@@ -75,13 +83,13 @@ static BasicBlock *FoldBlockIntoPredecessor(BasicBlock *BB, LoopInfo* LI) {
// Delete the unconditional branch from the predecessor...
OnlyPred->getInstList().pop_back();
- // Move all definitions in the successor to the predecessor...
- OnlyPred->getInstList().splice(OnlyPred->end(), BB->getInstList());
-
// Make all PHI nodes that referred to BB now refer to Pred as their
// source...
BB->replaceAllUsesWith(OnlyPred);
+ // Move all definitions in the successor to the predecessor...
+ OnlyPred->getInstList().splice(OnlyPred->end(), BB->getInstList());
+
std::string OldName = BB->getName();
// Erase basic block from the function...
@@ -247,16 +255,14 @@ bool llvm::UnrollLoop(Loop *L, unsigned Count,
// the successor of the latch block. The successor of the exit block will
// be updated specially after unrolling all the way.
if (*BB != LatchBlock)
- for (Value::use_iterator UI = (*BB)->use_begin(), UE = (*BB)->use_end();
- UI != UE;) {
- Instruction *UseInst = cast<Instruction>(*UI);
- ++UI;
- if (isa<PHINode>(UseInst) && !L->contains(UseInst)) {
- PHINode *phi = cast<PHINode>(UseInst);
- Value *Incoming = phi->getIncomingValueForBlock(*BB);
- phi->addIncoming(Incoming, New);
- }
- }
+ for (succ_iterator SI = succ_begin(*BB), SE = succ_end(*BB); SI != SE;
+ ++SI)
+ if (!L->contains(*SI))
+ for (BasicBlock::iterator BBI = (*SI)->begin();
+ PHINode *phi = dyn_cast<PHINode>(BBI); ++BBI) {
+ Value *Incoming = phi->getIncomingValueForBlock(*BB);
+ phi->addIncoming(Incoming, New);
+ }
// Keep track of new headers and latches as we create them, so that
// we can insert the proper branches later.
@@ -288,24 +294,20 @@ bool llvm::UnrollLoop(Loop *L, unsigned Count,
// successor blocks, update them to use the appropriate values computed as the
// last iteration of the loop.
if (Count != 1) {
- SmallPtrSet<PHINode*, 8> Users;
- for (Value::use_iterator UI = LatchBlock->use_begin(),
- UE = LatchBlock->use_end(); UI != UE; ++UI)
- if (PHINode *phi = dyn_cast<PHINode>(*UI))
- Users.insert(phi);
-
BasicBlock *LastIterationBB = cast<BasicBlock>(LastValueMap[LatchBlock]);
- for (SmallPtrSet<PHINode*,8>::iterator SI = Users.begin(), SE = Users.end();
+ for (succ_iterator SI = succ_begin(LatchBlock), SE = succ_end(LatchBlock);
SI != SE; ++SI) {
- PHINode *PN = *SI;
- Value *InVal = PN->removeIncomingValue(LatchBlock, false);
- // If this value was defined in the loop, take the value defined by the
- // last iteration of the loop.
- if (Instruction *InValI = dyn_cast<Instruction>(InVal)) {
- if (L->contains(InValI))
- InVal = LastValueMap[InVal];
+ for (BasicBlock::iterator BBI = (*SI)->begin();
+ PHINode *PN = dyn_cast<PHINode>(BBI); ++BBI) {
+ Value *InVal = PN->removeIncomingValue(LatchBlock, false);
+ // If this value was defined in the loop, take the value defined by the
+ // last iteration of the loop.
+ if (Instruction *InValI = dyn_cast<Instruction>(InVal)) {
+ if (L->contains(InValI))
+ InVal = LastValueMap[InVal];
+ }
+ PN->addIncoming(InVal, LastIterationBB);
}
- PN->addIncoming(InVal, LastIterationBB);
}
}
@@ -352,11 +354,16 @@ bool llvm::UnrollLoop(Loop *L, unsigned Count,
// Replace the conditional branch with an unconditional one.
BranchInst::Create(Dest, Term);
Term->eraseFromParent();
- // Merge adjacent basic blocks, if possible.
- if (BasicBlock *Fold = FoldBlockIntoPredecessor(Dest, LI)) {
+ }
+ }
+
+ // Merge adjacent basic blocks, if possible.
+ for (unsigned i = 0, e = Latches.size(); i != e; ++i) {
+ BranchInst *Term = cast<BranchInst>(Latches[i]->getTerminator());
+ if (Term->isUnconditional()) {
+ BasicBlock *Dest = Term->getSuccessor(0);
+ if (BasicBlock *Fold = FoldBlockIntoPredecessor(Dest, LI))
std::replace(Latches.begin(), Latches.end(), Dest, Fold);
- std::replace(Headers.begin(), Headers.end(), Dest, Fold);
- }
}
}
diff --git a/contrib/llvm/lib/Transforms/Utils/LowerExpectIntrinsic.cpp b/contrib/llvm/lib/Transforms/Utils/LowerExpectIntrinsic.cpp
new file mode 100644
index 0000000..c1213fa
--- /dev/null
+++ b/contrib/llvm/lib/Transforms/Utils/LowerExpectIntrinsic.cpp
@@ -0,0 +1,166 @@
+#define DEBUG_TYPE "lower-expect-intrinsic"
+#include "llvm/Constants.h"
+#include "llvm/Function.h"
+#include "llvm/BasicBlock.h"
+#include "llvm/LLVMContext.h"
+#include "llvm/Instructions.h"
+#include "llvm/Intrinsics.h"
+#include "llvm/Metadata.h"
+#include "llvm/Pass.h"
+#include "llvm/Transforms/Scalar.h"
+#include "llvm/Support/CommandLine.h"
+#include "llvm/Support/Debug.h"
+#include "llvm/ADT/Statistic.h"
+#include <vector>
+
+using namespace llvm;
+
+STATISTIC(IfHandled, "Number of 'expect' intrinsic intructions handled");
+
+static cl::opt<uint32_t>
+LikelyBranchWeight("likely-branch-weight", cl::Hidden, cl::init(64),
+ cl::desc("Weight of the branch likely to be taken (default = 64)"));
+static cl::opt<uint32_t>
+UnlikelyBranchWeight("unlikely-branch-weight", cl::Hidden, cl::init(4),
+ cl::desc("Weight of the branch unlikely to be taken (default = 4)"));
+
+namespace {
+
+ class LowerExpectIntrinsic : public FunctionPass {
+
+ bool HandleSwitchExpect(SwitchInst *SI);
+
+ bool HandleIfExpect(BranchInst *BI);
+
+ public:
+ static char ID;
+ LowerExpectIntrinsic() : FunctionPass(ID) {
+ initializeLowerExpectIntrinsicPass(*PassRegistry::getPassRegistry());
+ }
+
+ bool runOnFunction(Function &F);
+ };
+}
+
+
+bool LowerExpectIntrinsic::HandleSwitchExpect(SwitchInst *SI) {
+ CallInst *CI = dyn_cast<CallInst>(SI->getCondition());
+ if (!CI)
+ return false;
+
+ Function *Fn = CI->getCalledFunction();
+ if (!Fn || Fn->getIntrinsicID() != Intrinsic::expect)
+ return false;
+
+ Value *ArgValue = CI->getArgOperand(0);
+ ConstantInt *ExpectedValue = dyn_cast<ConstantInt>(CI->getArgOperand(1));
+ if (!ExpectedValue)
+ return false;
+
+ LLVMContext &Context = CI->getContext();
+ const Type *Int32Ty = Type::getInt32Ty(Context);
+
+ unsigned caseNo = SI->findCaseValue(ExpectedValue);
+ std::vector<Value *> Vec;
+ unsigned n = SI->getNumCases();
+ Vec.resize(n + 1); // +1 for MDString
+
+ Vec[0] = MDString::get(Context, "branch_weights");
+ for (unsigned i = 0; i < n; ++i) {
+ Vec[i + 1] = ConstantInt::get(Int32Ty, i == caseNo ? LikelyBranchWeight : UnlikelyBranchWeight);
+ }
+
+ MDNode *WeightsNode = llvm::MDNode::get(Context, Vec);
+ SI->setMetadata(LLVMContext::MD_prof, WeightsNode);
+
+ SI->setCondition(ArgValue);
+ return true;
+}
+
+
+bool LowerExpectIntrinsic::HandleIfExpect(BranchInst *BI) {
+ if (BI->isUnconditional())
+ return false;
+
+ // Handle non-optimized IR code like:
+ // %expval = call i64 @llvm.expect.i64.i64(i64 %conv1, i64 1)
+ // %tobool = icmp ne i64 %expval, 0
+ // br i1 %tobool, label %if.then, label %if.end
+
+ ICmpInst *CmpI = dyn_cast<ICmpInst>(BI->getCondition());
+ if (!CmpI || CmpI->getPredicate() != CmpInst::ICMP_NE)
+ return false;
+
+ CallInst *CI = dyn_cast<CallInst>(CmpI->getOperand(0));
+ if (!CI)
+ return false;
+
+ Function *Fn = CI->getCalledFunction();
+ if (!Fn || Fn->getIntrinsicID() != Intrinsic::expect)
+ return false;
+
+ Value *ArgValue = CI->getArgOperand(0);
+ ConstantInt *ExpectedValue = dyn_cast<ConstantInt>(CI->getArgOperand(1));
+ if (!ExpectedValue)
+ return false;
+
+ LLVMContext &Context = CI->getContext();
+ const Type *Int32Ty = Type::getInt32Ty(Context);
+ bool Likely = ExpectedValue->isOne();
+
+ // If expect value is equal to 1 it means that we are more likely to take
+ // branch 0, in other case more likely is branch 1.
+ Value *Ops[] = {
+ MDString::get(Context, "branch_weights"),
+ ConstantInt::get(Int32Ty, Likely ? LikelyBranchWeight : UnlikelyBranchWeight),
+ ConstantInt::get(Int32Ty, Likely ? UnlikelyBranchWeight : LikelyBranchWeight)
+ };
+
+ MDNode *WeightsNode = MDNode::get(Context, Ops);
+ BI->setMetadata(LLVMContext::MD_prof, WeightsNode);
+
+ CmpI->setOperand(0, ArgValue);
+ return true;
+}
+
+
+bool LowerExpectIntrinsic::runOnFunction(Function &F) {
+ for (Function::iterator I = F.begin(), E = F.end(); I != E;) {
+ BasicBlock *BB = I++;
+
+ // Create "block_weights" metadata.
+ if (BranchInst *BI = dyn_cast<BranchInst>(BB->getTerminator())) {
+ if (HandleIfExpect(BI))
+ IfHandled++;
+ } else if (SwitchInst *SI = dyn_cast<SwitchInst>(BB->getTerminator())) {
+ if (HandleSwitchExpect(SI))
+ IfHandled++;
+ }
+
+ // remove llvm.expect intrinsics.
+ for (BasicBlock::iterator BI = BB->begin(), BE = BB->end();
+ BI != BE; ) {
+ CallInst *CI = dyn_cast<CallInst>(BI++);
+ if (!CI)
+ continue;
+
+ Function *Fn = CI->getCalledFunction();
+ if (Fn && Fn->getIntrinsicID() == Intrinsic::expect) {
+ Value *Exp = CI->getArgOperand(0);
+ CI->replaceAllUsesWith(Exp);
+ CI->eraseFromParent();
+ }
+ }
+ }
+
+ return false;
+}
+
+
+char LowerExpectIntrinsic::ID = 0;
+INITIALIZE_PASS(LowerExpectIntrinsic, "lower-expect", "Lower 'expect' "
+ "Intrinsics", false, false)
+
+FunctionPass *llvm::createLowerExpectIntrinsicPass() {
+ return new LowerExpectIntrinsic();
+}
diff --git a/contrib/llvm/lib/Transforms/Utils/LowerInvoke.cpp b/contrib/llvm/lib/Transforms/Utils/LowerInvoke.cpp
index 025ae0d..f77d19d 100644
--- a/contrib/llvm/lib/Transforms/Utils/LowerInvoke.cpp
+++ b/contrib/llvm/lib/Transforms/Utils/LowerInvoke.cpp
@@ -66,7 +66,7 @@ namespace {
Constant *AbortFn;
// Used for expensive EH support.
- const Type *JBLinkTy;
+ StructType *JBLinkTy;
GlobalVariable *JBListHead;
Constant *SetJmpFn, *LongJmpFn, *StackSaveFn, *StackRestoreFn;
bool useExpensiveEHSupport;
@@ -120,24 +120,16 @@ FunctionPass *llvm::createLowerInvokePass(const TargetLowering *TLI,
// doInitialization - Make sure that there is a prototype for abort in the
// current module.
bool LowerInvoke::doInitialization(Module &M) {
- const Type *VoidPtrTy =
- Type::getInt8PtrTy(M.getContext());
+ const Type *VoidPtrTy = Type::getInt8PtrTy(M.getContext());
if (useExpensiveEHSupport) {
// Insert a type for the linked list of jump buffers.
unsigned JBSize = TLI ? TLI->getJumpBufSize() : 0;
JBSize = JBSize ? JBSize : 200;
- const Type *JmpBufTy = ArrayType::get(VoidPtrTy, JBSize);
-
- { // The type is recursive, so use a type holder.
- std::vector<const Type*> Elements;
- Elements.push_back(JmpBufTy);
- OpaqueType *OT = OpaqueType::get(M.getContext());
- Elements.push_back(PointerType::getUnqual(OT));
- PATypeHolder JBLType(StructType::get(M.getContext(), Elements));
- OT->refineAbstractTypeTo(JBLType.get()); // Complete the cycle.
- JBLinkTy = JBLType.get();
- M.addTypeName("llvm.sjljeh.jmpbufty", JBLinkTy);
- }
+ Type *JmpBufTy = ArrayType::get(VoidPtrTy, JBSize);
+
+ JBLinkTy = StructType::createNamed(M.getContext(), "llvm.sjljeh.jmpbufty");
+ Type *Elts[] = { JmpBufTy, PointerType::getUnqual(JBLinkTy) };
+ JBLinkTy->setBody(Elts);
const Type *PtrJBList = PointerType::getUnqual(JBLinkTy);
@@ -184,8 +176,7 @@ bool LowerInvoke::insertCheapEHSupport(Function &F) {
SmallVector<Value*,16> CallArgs(II->op_begin(), II->op_end() - 3);
// Insert a normal call instruction...
CallInst *NewCall = CallInst::Create(II->getCalledValue(),
- CallArgs.begin(), CallArgs.end(),
- "",II);
+ CallArgs, "", II);
NewCall->takeName(II);
NewCall->setCallingConv(II->getCallingConv());
NewCall->setAttributes(II->getAttributes());
@@ -265,8 +256,7 @@ void LowerInvoke::rewriteExpensiveInvoke(InvokeInst *II, unsigned InvokeNo,
// Insert a normal call instruction.
SmallVector<Value*,16> CallArgs(II->op_begin(), II->op_end() - 3);
CallInst *NewCall = CallInst::Create(II->getCalledValue(),
- CallArgs.begin(), CallArgs.end(), "",
- II);
+ CallArgs, "", II);
NewCall->takeName(II);
NewCall->setCallingConv(II->getCallingConv());
NewCall->setAttributes(II->getAttributes());
@@ -573,7 +563,7 @@ bool LowerInvoke::insertExpensiveEHSupport(Function &F) {
Type::getInt8PtrTy(F.getContext()),
"tmp", UnwindBlock);
Idx[1] = ConstantInt::get(Type::getInt32Ty(F.getContext()), 1);
- CallInst::Create(LongJmpFn, &Idx[0], &Idx[2], "", UnwindBlock);
+ CallInst::Create(LongJmpFn, Idx, "", UnwindBlock);
new UnreachableInst(F.getContext(), UnwindBlock);
// Set up the term block ("throw without a catch").
diff --git a/contrib/llvm/lib/Transforms/Utils/PromoteMemoryToRegister.cpp b/contrib/llvm/lib/Transforms/Utils/PromoteMemoryToRegister.cpp
index a1736b9..e5a00f4 100644
--- a/contrib/llvm/lib/Transforms/Utils/PromoteMemoryToRegister.cpp
+++ b/contrib/llvm/lib/Transforms/Utils/PromoteMemoryToRegister.cpp
@@ -38,6 +38,7 @@
#include "llvm/Analysis/DIBuilder.h"
#include "llvm/Analysis/Dominators.h"
#include "llvm/Analysis/InstructionSimplify.h"
+#include "llvm/Analysis/ValueTracking.h"
#include "llvm/Transforms/Utils/Local.h"
#include "llvm/ADT/DenseMap.h"
#include "llvm/ADT/SmallPtrSet.h"
@@ -92,6 +93,22 @@ bool llvm::isAllocaPromotable(const AllocaInst *AI) {
return false; // Don't allow a store OF the AI, only INTO the AI.
if (SI->isVolatile())
return false;
+ } else if (const IntrinsicInst *II = dyn_cast<IntrinsicInst>(U)) {
+ if (II->getIntrinsicID() != Intrinsic::lifetime_start &&
+ II->getIntrinsicID() != Intrinsic::lifetime_end)
+ return false;
+ } else if (const BitCastInst *BCI = dyn_cast<BitCastInst>(U)) {
+ if (BCI->getType() != Type::getInt8PtrTy(U->getContext()))
+ return false;
+ if (!onlyUsedByLifetimeMarkers(BCI))
+ return false;
+ } else if (const GetElementPtrInst *GEPI = dyn_cast<GetElementPtrInst>(U)) {
+ if (GEPI->getType() != Type::getInt8PtrTy(U->getContext()))
+ return false;
+ if (!GEPI->hasAllZeroIndices())
+ return false;
+ if (!onlyUsedByLifetimeMarkers(GEPI))
+ return false;
} else {
return false;
}
@@ -335,6 +352,31 @@ namespace {
};
} // end of anonymous namespace
+static void removeLifetimeIntrinsicUsers(AllocaInst *AI) {
+ // Knowing that this alloca is promotable, we know that it's safe to kill all
+ // instructions except for load and store.
+
+ for (Value::use_iterator UI = AI->use_begin(), UE = AI->use_end();
+ UI != UE;) {
+ Instruction *I = cast<Instruction>(*UI);
+ ++UI;
+ if (isa<LoadInst>(I) || isa<StoreInst>(I))
+ continue;
+
+ if (!I->getType()->isVoidTy()) {
+ // The only users of this bitcast/GEP instruction are lifetime intrinsics.
+ // Follow the use/def chain to erase them now instead of leaving it for
+ // dead code elimination later.
+ for (Value::use_iterator UI = I->use_begin(), UE = I->use_end();
+ UI != UE;) {
+ Instruction *Inst = cast<Instruction>(*UI);
+ ++UI;
+ Inst->eraseFromParent();
+ }
+ }
+ I->eraseFromParent();
+ }
+}
void PromoteMem2Reg::run() {
Function &F = *DT.getRoot()->getParent();
@@ -353,6 +395,8 @@ void PromoteMem2Reg::run() {
assert(AI->getParent()->getParent() == &F &&
"All allocas should be in the same function, which is same as DF!");
+ removeLifetimeIntrinsicUsers(AI);
+
if (AI->use_empty()) {
// If there are no uses of the alloca, just delete it now.
if (AST) AST->deleteValue(AI);
diff --git a/contrib/llvm/lib/Transforms/Utils/SSAUpdater.cpp b/contrib/llvm/lib/Transforms/Utils/SSAUpdater.cpp
index b336194..b47a7cc 100644
--- a/contrib/llvm/lib/Transforms/Utils/SSAUpdater.cpp
+++ b/contrib/llvm/lib/Transforms/Utils/SSAUpdater.cpp
@@ -16,7 +16,6 @@
#include "llvm/Instructions.h"
#include "llvm/IntrinsicInst.h"
#include "llvm/ADT/DenseMap.h"
-#include "llvm/Analysis/DIBuilder.h"
#include "llvm/Analysis/InstructionSimplify.h"
#include "llvm/Support/AlignOf.h"
#include "llvm/Support/Allocator.h"
@@ -358,8 +357,7 @@ Value *SSAUpdater::GetValueAtEndOfBlockInternal(BasicBlock *BB) {
LoadAndStorePromoter::
LoadAndStorePromoter(const SmallVectorImpl<Instruction*> &Insts,
- SSAUpdater &S, DbgDeclareInst *DD, DIBuilder *DB,
- StringRef BaseName) : SSA(S), DDI(DD), DIB(DB) {
+ SSAUpdater &S, StringRef BaseName) : SSA(S) {
if (Insts.empty()) return;
Value *SomeVal;
@@ -407,8 +405,7 @@ run(const SmallVectorImpl<Instruction*> &Insts) const {
if (BlockUses.size() == 1) {
// If it is a store, it is a trivial def of the value in the block.
if (StoreInst *SI = dyn_cast<StoreInst>(User)) {
- if (DDI)
- ConvertDebugDeclareToDebugValue(DDI, SI, *DIB);
+ updateDebugInfo(SI);
SSA.AddAvailableValue(BB, SI->getOperand(0));
} else
// Otherwise it is a load, queue it to rewrite as a live-in load.
@@ -462,9 +459,7 @@ run(const SmallVectorImpl<Instruction*> &Insts) const {
if (StoreInst *SI = dyn_cast<StoreInst>(II)) {
// If this is a store to an unrelated pointer, ignore it.
if (!isInstInList(SI, Insts)) continue;
-
- if (DDI)
- ConvertDebugDeclareToDebugValue(DDI, SI, *DIB);
+ updateDebugInfo(SI);
// Remember that this is the active value in the block.
StoredValue = SI->getOperand(0);
@@ -522,7 +517,4 @@ run(const SmallVectorImpl<Instruction*> &Insts) const {
instructionDeleted(User);
User->eraseFromParent();
}
-
- if (DDI)
- DDI->eraseFromParent();
}
diff --git a/contrib/llvm/lib/Transforms/Utils/SimplifyCFG.cpp b/contrib/llvm/lib/Transforms/Utils/SimplifyCFG.cpp
index 6df846c..9d9c324 100644
--- a/contrib/llvm/lib/Transforms/Utils/SimplifyCFG.cpp
+++ b/contrib/llvm/lib/Transforms/Utils/SimplifyCFG.cpp
@@ -2211,8 +2211,7 @@ bool SimplifyCFGOpt::SimplifyUnwind(UnwindInst *UI, IRBuilder<> &Builder) {
SmallVector<Value*,8> Args(II->op_begin(), II->op_end()-3);
Builder.SetInsertPoint(BI);
CallInst *CI = Builder.CreateCall(II->getCalledValue(),
- Args.begin(), Args.end(),
- II->getName());
+ Args, II->getName());
CI->setCallingConv(II->getCallingConv());
CI->setAttributes(II->getAttributes());
// If the invoke produced a value, the Call now does instead.
@@ -2355,8 +2354,7 @@ bool SimplifyCFGOpt::SimplifyUnreachable(UnreachableInst *UI) {
SmallVector<Value*, 8> Args(II->op_begin(), II->op_end()-3);
Builder.SetInsertPoint(BI);
CallInst *CI = Builder.CreateCall(II->getCalledValue(),
- Args.begin(), Args.end(),
- II->getName());
+ Args, II->getName());
CI->setCallingConv(II->getCallingConv());
CI->setAttributes(II->getAttributes());
// If the invoke produced a value, the call does now instead.
@@ -2450,6 +2448,77 @@ static bool EliminateDeadSwitchCases(SwitchInst *SI) {
return !DeadCases.empty();
}
+/// FindPHIForConditionForwarding - If BB would be eligible for simplification
+/// by TryToSimplifyUncondBranchFromEmptyBlock (i.e. it is empty and terminated
+/// by an unconditional branch), look at the phi node for BB in the successor
+/// block and see if the incoming value is equal to CaseValue. If so, return
+/// the phi node, and set PhiIndex to BB's index in the phi node.
+static PHINode *FindPHIForConditionForwarding(ConstantInt *CaseValue,
+ BasicBlock *BB,
+ int *PhiIndex) {
+ if (BB->getFirstNonPHIOrDbg() != BB->getTerminator())
+ return NULL; // BB must be empty to be a candidate for simplification.
+ if (!BB->getSinglePredecessor())
+ return NULL; // BB must be dominated by the switch.
+
+ BranchInst *Branch = dyn_cast<BranchInst>(BB->getTerminator());
+ if (!Branch || !Branch->isUnconditional())
+ return NULL; // Terminator must be unconditional branch.
+
+ BasicBlock *Succ = Branch->getSuccessor(0);
+
+ BasicBlock::iterator I = Succ->begin();
+ while (PHINode *PHI = dyn_cast<PHINode>(I++)) {
+ int Idx = PHI->getBasicBlockIndex(BB);
+ assert(Idx >= 0 && "PHI has no entry for predecessor?");
+
+ Value *InValue = PHI->getIncomingValue(Idx);
+ if (InValue != CaseValue) continue;
+
+ *PhiIndex = Idx;
+ return PHI;
+ }
+
+ return NULL;
+}
+
+/// ForwardSwitchConditionToPHI - Try to forward the condition of a switch
+/// instruction to a phi node dominated by the switch, if that would mean that
+/// some of the destination blocks of the switch can be folded away.
+/// Returns true if a change is made.
+static bool ForwardSwitchConditionToPHI(SwitchInst *SI) {
+ typedef DenseMap<PHINode*, SmallVector<int,4> > ForwardingNodesMap;
+ ForwardingNodesMap ForwardingNodes;
+
+ for (unsigned I = 1; I < SI->getNumCases(); ++I) { // 0 is the default case.
+ ConstantInt *CaseValue = SI->getCaseValue(I);
+ BasicBlock *CaseDest = SI->getSuccessor(I);
+
+ int PhiIndex;
+ PHINode *PHI = FindPHIForConditionForwarding(CaseValue, CaseDest,
+ &PhiIndex);
+ if (!PHI) continue;
+
+ ForwardingNodes[PHI].push_back(PhiIndex);
+ }
+
+ bool Changed = false;
+
+ for (ForwardingNodesMap::iterator I = ForwardingNodes.begin(),
+ E = ForwardingNodes.end(); I != E; ++I) {
+ PHINode *Phi = I->first;
+ SmallVector<int,4> &Indexes = I->second;
+
+ if (Indexes.size() < 2) continue;
+
+ for (size_t I = 0, E = Indexes.size(); I != E; ++I)
+ Phi->setIncomingValue(Indexes[I], SI->getCondition());
+ Changed = true;
+ }
+
+ return Changed;
+}
+
bool SimplifyCFGOpt::SimplifySwitch(SwitchInst *SI, IRBuilder<> &Builder) {
// If this switch is too complex to want to look at, ignore it.
if (!isValueEqualityComparison(SI))
@@ -2486,6 +2555,9 @@ bool SimplifyCFGOpt::SimplifySwitch(SwitchInst *SI, IRBuilder<> &Builder) {
if (EliminateDeadSwitchCases(SI))
return SimplifyCFG(BB) | true;
+ if (ForwardSwitchConditionToPHI(SI))
+ return SimplifyCFG(BB) | true;
+
return false;
}
@@ -2530,7 +2602,7 @@ bool SimplifyCFGOpt::SimplifyUncondBranch(BranchInst *BI, IRBuilder<> &Builder){
BasicBlock *BB = BI->getParent();
// If the Terminator is the only non-phi instruction, simplify the block.
- BasicBlock::iterator I = BB->getFirstNonPHIOrDbg();
+ BasicBlock::iterator I = BB->getFirstNonPHIOrDbgOrLifetime();
if (I->isTerminator() && BB != &BB->getParent()->getEntryBlock() &&
TryToSimplifyUncondBranchFromEmptyBlock(BB))
return true;
diff --git a/contrib/llvm/lib/Transforms/Utils/ValueMapper.cpp b/contrib/llvm/lib/Transforms/Utils/ValueMapper.cpp
index a73bf04..973b105 100644
--- a/contrib/llvm/lib/Transforms/Utils/ValueMapper.cpp
+++ b/contrib/llvm/lib/Transforms/Utils/ValueMapper.cpp
@@ -13,15 +13,18 @@
//===----------------------------------------------------------------------===//
#include "llvm/Transforms/Utils/ValueMapper.h"
-#include "llvm/Type.h"
#include "llvm/Constants.h"
#include "llvm/Function.h"
+#include "llvm/InlineAsm.h"
+#include "llvm/Instructions.h"
#include "llvm/Metadata.h"
-#include "llvm/ADT/SmallVector.h"
using namespace llvm;
-Value *llvm::MapValue(const Value *V, ValueToValueMapTy &VM,
- RemapFlags Flags) {
+// Out of line method to get vtable etc for class.
+void ValueMapTypeRemapper::Anchor() {}
+
+Value *llvm::MapValue(const Value *V, ValueToValueMapTy &VM, RemapFlags Flags,
+ ValueMapTypeRemapper *TypeMapper) {
ValueToValueMapTy::iterator I = VM.find(V);
// If the value already exists in the map, use it.
@@ -29,8 +32,23 @@ Value *llvm::MapValue(const Value *V, ValueToValueMapTy &VM,
// Global values do not need to be seeded into the VM if they
// are using the identity mapping.
- if (isa<GlobalValue>(V) || isa<InlineAsm>(V) || isa<MDString>(V))
+ if (isa<GlobalValue>(V) || isa<MDString>(V))
return VM[V] = const_cast<Value*>(V);
+
+ if (const InlineAsm *IA = dyn_cast<InlineAsm>(V)) {
+ // Inline asm may need *type* remapping.
+ FunctionType *NewTy = IA->getFunctionType();
+ if (TypeMapper) {
+ NewTy = cast<FunctionType>(TypeMapper->remapType(NewTy));
+
+ if (NewTy != IA->getFunctionType())
+ V = InlineAsm::get(NewTy, IA->getAsmString(), IA->getConstraintString(),
+ IA->hasSideEffects(), IA->isAlignStack());
+ }
+
+ return VM[V] = const_cast<Value*>(V);
+ }
+
if (const MDNode *MD = dyn_cast<MDNode>(V)) {
// If this is a module-level metadata and we know that nothing at the module
@@ -45,14 +63,14 @@ Value *llvm::MapValue(const Value *V, ValueToValueMapTy &VM,
// Check all operands to see if any need to be remapped.
for (unsigned i = 0, e = MD->getNumOperands(); i != e; ++i) {
Value *OP = MD->getOperand(i);
- if (OP == 0 || MapValue(OP, VM, Flags) == OP) continue;
+ if (OP == 0 || MapValue(OP, VM, Flags, TypeMapper) == OP) continue;
// Ok, at least one operand needs remapping.
SmallVector<Value*, 4> Elts;
Elts.reserve(MD->getNumOperands());
for (i = 0; i != e; ++i) {
Value *Op = MD->getOperand(i);
- Elts.push_back(Op ? MapValue(Op, VM, Flags) : 0);
+ Elts.push_back(Op ? MapValue(Op, VM, Flags, TypeMapper) : 0);
}
MDNode *NewMD = MDNode::get(V->getContext(), Elts);
Dummy->replaceAllUsesWith(NewMD);
@@ -75,51 +93,75 @@ Value *llvm::MapValue(const Value *V, ValueToValueMapTy &VM,
return 0;
if (BlockAddress *BA = dyn_cast<BlockAddress>(C)) {
- Function *F = cast<Function>(MapValue(BA->getFunction(), VM, Flags));
+ Function *F =
+ cast<Function>(MapValue(BA->getFunction(), VM, Flags, TypeMapper));
BasicBlock *BB = cast_or_null<BasicBlock>(MapValue(BA->getBasicBlock(), VM,
- Flags));
+ Flags, TypeMapper));
return VM[V] = BlockAddress::get(F, BB ? BB : BA->getBasicBlock());
}
- for (unsigned i = 0, e = C->getNumOperands(); i != e; ++i) {
- Value *Op = C->getOperand(i);
- Value *Mapped = MapValue(Op, VM, Flags);
- if (Mapped == C) continue;
-
- // Okay, the operands don't all match. We've already processed some or all
- // of the operands, set them up now.
- std::vector<Constant*> Ops;
- Ops.reserve(C->getNumOperands());
- for (unsigned j = 0; j != i; ++j)
- Ops.push_back(cast<Constant>(C->getOperand(i)));
+ // Otherwise, we have some other constant to remap. Start by checking to see
+ // if all operands have an identity remapping.
+ unsigned OpNo = 0, NumOperands = C->getNumOperands();
+ Value *Mapped = 0;
+ for (; OpNo != NumOperands; ++OpNo) {
+ Value *Op = C->getOperand(OpNo);
+ Mapped = MapValue(Op, VM, Flags, TypeMapper);
+ if (Mapped != C) break;
+ }
+
+ // See if the type mapper wants to remap the type as well.
+ Type *NewTy = C->getType();
+ if (TypeMapper)
+ NewTy = TypeMapper->remapType(NewTy);
+
+ // If the result type and all operands match up, then just insert an identity
+ // mapping.
+ if (OpNo == NumOperands && NewTy == C->getType())
+ return VM[V] = C;
+
+ // Okay, we need to create a new constant. We've already processed some or
+ // all of the operands, set them all up now.
+ SmallVector<Constant*, 8> Ops;
+ Ops.reserve(NumOperands);
+ for (unsigned j = 0; j != OpNo; ++j)
+ Ops.push_back(cast<Constant>(C->getOperand(j)));
+
+ // If one of the operands mismatch, push it and the other mapped operands.
+ if (OpNo != NumOperands) {
Ops.push_back(cast<Constant>(Mapped));
-
+
// Map the rest of the operands that aren't processed yet.
- for (++i; i != e; ++i)
- Ops.push_back(cast<Constant>(MapValue(C->getOperand(i), VM, Flags)));
-
- if (ConstantExpr *CE = dyn_cast<ConstantExpr>(C))
- return VM[V] = CE->getWithOperands(Ops);
- if (ConstantArray *CA = dyn_cast<ConstantArray>(C))
- return VM[V] = ConstantArray::get(CA->getType(), Ops);
- if (ConstantStruct *CS = dyn_cast<ConstantStruct>(C))
- return VM[V] = ConstantStruct::get(CS->getType(), Ops);
- assert(isa<ConstantVector>(C) && "Unknown mapped constant type");
- return VM[V] = ConstantVector::get(Ops);
+ for (++OpNo; OpNo != NumOperands; ++OpNo)
+ Ops.push_back(MapValue(cast<Constant>(C->getOperand(OpNo)), VM,
+ Flags, TypeMapper));
}
-
- // If we reach here, all of the operands of the constant match.
- return VM[V] = C;
+
+ if (ConstantExpr *CE = dyn_cast<ConstantExpr>(C))
+ return VM[V] = CE->getWithOperands(Ops, NewTy);
+ if (isa<ConstantArray>(C))
+ return VM[V] = ConstantArray::get(cast<ArrayType>(NewTy), Ops);
+ if (isa<ConstantStruct>(C))
+ return VM[V] = ConstantStruct::get(cast<StructType>(NewTy), Ops);
+ if (isa<ConstantVector>(C))
+ return VM[V] = ConstantVector::get(Ops);
+ // If this is a no-operand constant, it must be because the type was remapped.
+ if (isa<UndefValue>(C))
+ return VM[V] = UndefValue::get(NewTy);
+ if (isa<ConstantAggregateZero>(C))
+ return VM[V] = ConstantAggregateZero::get(NewTy);
+ assert(isa<ConstantPointerNull>(C));
+ return VM[V] = ConstantPointerNull::get(cast<PointerType>(NewTy));
}
/// RemapInstruction - Convert the instruction operands from referencing the
/// current values into those specified by VMap.
///
void llvm::RemapInstruction(Instruction *I, ValueToValueMapTy &VMap,
- RemapFlags Flags) {
+ RemapFlags Flags, ValueMapTypeRemapper *TypeMapper){
// Remap operands.
for (User::op_iterator op = I->op_begin(), E = I->op_end(); op != E; ++op) {
- Value *V = MapValue(*op, VMap, Flags);
+ Value *V = MapValue(*op, VMap, Flags, TypeMapper);
// If we aren't ignoring missing entries, assert that something happened.
if (V != 0)
*op = V;
@@ -128,14 +170,32 @@ void llvm::RemapInstruction(Instruction *I, ValueToValueMapTy &VMap,
"Referenced value not in value map!");
}
- // Remap attached metadata.
+ // Remap phi nodes' incoming blocks.
+ if (PHINode *PN = dyn_cast<PHINode>(I)) {
+ for (unsigned i = 0, e = PN->getNumIncomingValues(); i != e; ++i) {
+ Value *V = MapValue(PN->getIncomingBlock(i), VMap, Flags);
+ // If we aren't ignoring missing entries, assert that something happened.
+ if (V != 0)
+ PN->setIncomingBlock(i, cast<BasicBlock>(V));
+ else
+ assert((Flags & RF_IgnoreMissingEntries) &&
+ "Referenced block not in value map!");
+ }
+ }
+
+ // Remap attached metadata. Don't bother remapping DebugLoc, it can never
+ // have mappings to do.
SmallVector<std::pair<unsigned, MDNode *>, 4> MDs;
- I->getAllMetadata(MDs);
+ I->getAllMetadataOtherThanDebugLoc(MDs);
for (SmallVectorImpl<std::pair<unsigned, MDNode *> >::iterator
MI = MDs.begin(), ME = MDs.end(); MI != ME; ++MI) {
- Value *Old = MI->second;
- Value *New = MapValue(Old, VMap, Flags);
+ MDNode *Old = MI->second;
+ MDNode *New = MapValue(Old, VMap, Flags, TypeMapper);
if (New != Old)
- I->setMetadata(MI->first, cast<MDNode>(New));
+ I->setMetadata(MI->first, New);
}
+
+ // If the instruction's type is being remapped, do so now.
+ if (TypeMapper)
+ I->mutateType(TypeMapper->remapType(I->getType()));
}
diff --git a/contrib/llvm/lib/VMCore/AsmWriter.cpp b/contrib/llvm/lib/VMCore/AsmWriter.cpp
index 844284d..94794c3 100644
--- a/contrib/llvm/lib/VMCore/AsmWriter.cpp
+++ b/contrib/llvm/lib/VMCore/AsmWriter.cpp
@@ -26,13 +26,11 @@
#include "llvm/Operator.h"
#include "llvm/Module.h"
#include "llvm/ValueSymbolTable.h"
-#include "llvm/TypeSymbolTable.h"
-#include "llvm/ADT/DenseSet.h"
+#include "llvm/ADT/DenseMap.h"
#include "llvm/ADT/SmallString.h"
#include "llvm/ADT/StringExtras.h"
#include "llvm/ADT/STLExtras.h"
#include "llvm/Support/CFG.h"
-#include "llvm/Support/CommandLine.h"
#include "llvm/Support/Debug.h"
#include "llvm/Support/Dwarf.h"
#include "llvm/Support/ErrorHandling.h"
@@ -42,11 +40,6 @@
#include <cctype>
using namespace llvm;
-static cl::opt<bool>
-EnableDebugInfoComment("enable-debug-info-comment", cl::Hidden,
- cl::desc("Enable debug info comments"));
-
-
// Make virtual table appear in this compilation unit.
AssemblyAnnotationWriter::~AssemblyAnnotationWriter() {}
@@ -140,60 +133,60 @@ static void PrintLLVMName(raw_ostream &OS, const Value *V) {
// TypePrinting Class: Type printing machinery
//===----------------------------------------------------------------------===//
-static DenseMap<const Type *, std::string> &getTypeNamesMap(void *M) {
- return *static_cast<DenseMap<const Type *, std::string>*>(M);
-}
-
-void TypePrinting::clear() {
- getTypeNamesMap(TypeNames).clear();
-}
+/// TypePrinting - Type printing machinery.
+namespace {
+class TypePrinting {
+ TypePrinting(const TypePrinting &); // DO NOT IMPLEMENT
+ void operator=(const TypePrinting&); // DO NOT IMPLEMENT
+public:
-bool TypePrinting::hasTypeName(const Type *Ty) const {
- return getTypeNamesMap(TypeNames).count(Ty);
-}
+ /// NamedTypes - The named types that are used by the current module.
+ std::vector<StructType*> NamedTypes;
+
+ /// NumberedTypes - The numbered types, along with their value.
+ DenseMap<StructType*, unsigned> NumberedTypes;
+
-void TypePrinting::addTypeName(const Type *Ty, const std::string &N) {
- getTypeNamesMap(TypeNames).insert(std::make_pair(Ty, N));
-}
+ TypePrinting() {}
+ ~TypePrinting() {}
+
+ void incorporateTypes(const Module &M);
+
+ void print(Type *Ty, raw_ostream &OS);
+
+ void printStructBody(StructType *Ty, raw_ostream &OS);
+};
+} // end anonymous namespace.
-TypePrinting::TypePrinting() {
- TypeNames = new DenseMap<const Type *, std::string>();
+void TypePrinting::incorporateTypes(const Module &M) {
+ M.findUsedStructTypes(NamedTypes);
+
+ // The list of struct types we got back includes all the struct types, split
+ // the unnamed ones out to a numbering and remove the anonymous structs.
+ unsigned NextNumber = 0;
+
+ std::vector<StructType*>::iterator NextToUse = NamedTypes.begin(), I, E;
+ for (I = NamedTypes.begin(), E = NamedTypes.end(); I != E; ++I) {
+ StructType *STy = *I;
+
+ // Ignore anonymous types.
+ if (STy->isAnonymous())
+ continue;
+
+ if (STy->getName().empty())
+ NumberedTypes[STy] = NextNumber++;
+ else
+ *NextToUse++ = STy;
+ }
+
+ NamedTypes.erase(NextToUse, NamedTypes.end());
}
-TypePrinting::~TypePrinting() {
- delete &getTypeNamesMap(TypeNames);
-}
/// CalcTypeName - Write the specified type to the specified raw_ostream, making
/// use of type names or up references to shorten the type name where possible.
-void TypePrinting::CalcTypeName(const Type *Ty,
- SmallVectorImpl<const Type *> &TypeStack,
- raw_ostream &OS, bool IgnoreTopLevelName) {
- // Check to see if the type is named.
- if (!IgnoreTopLevelName) {
- DenseMap<const Type *, std::string> &TM = getTypeNamesMap(TypeNames);
- DenseMap<const Type *, std::string>::iterator I = TM.find(Ty);
- if (I != TM.end()) {
- OS << I->second;
- return;
- }
- }
-
- // Check to see if the Type is already on the stack...
- unsigned Slot = 0, CurSize = TypeStack.size();
- while (Slot < CurSize && TypeStack[Slot] != Ty) ++Slot; // Scan for type
-
- // This is another base case for the recursion. In this case, we know
- // that we have looped back to a type that we have previously visited.
- // Generate the appropriate upreference to handle this.
- if (Slot < CurSize) {
- OS << '\\' << unsigned(CurSize-Slot); // Here's the upreference
- return;
- }
-
- TypeStack.push_back(Ty); // Recursive case: Add us to the stack..
-
+void TypePrinting::print(Type *Ty, raw_ostream &OS) {
switch (Ty->getTypeID()) {
case Type::VoidTyID: OS << "void"; break;
case Type::FloatTyID: OS << "float"; break;
@@ -206,259 +199,96 @@ void TypePrinting::CalcTypeName(const Type *Ty,
case Type::X86_MMXTyID: OS << "x86_mmx"; break;
case Type::IntegerTyID:
OS << 'i' << cast<IntegerType>(Ty)->getBitWidth();
- break;
+ return;
case Type::FunctionTyID: {
- const FunctionType *FTy = cast<FunctionType>(Ty);
- CalcTypeName(FTy->getReturnType(), TypeStack, OS);
+ FunctionType *FTy = cast<FunctionType>(Ty);
+ print(FTy->getReturnType(), OS);
OS << " (";
for (FunctionType::param_iterator I = FTy->param_begin(),
E = FTy->param_end(); I != E; ++I) {
if (I != FTy->param_begin())
OS << ", ";
- CalcTypeName(*I, TypeStack, OS);
+ print(*I, OS);
}
if (FTy->isVarArg()) {
if (FTy->getNumParams()) OS << ", ";
OS << "...";
}
OS << ')';
- break;
+ return;
}
case Type::StructTyID: {
- const StructType *STy = cast<StructType>(Ty);
- if (STy->isPacked())
- OS << '<';
- OS << '{';
- for (StructType::element_iterator I = STy->element_begin(),
- E = STy->element_end(); I != E; ++I) {
- OS << ' ';
- CalcTypeName(*I, TypeStack, OS);
- if (llvm::next(I) == STy->element_end())
- OS << ' ';
- else
- OS << ',';
- }
- OS << '}';
- if (STy->isPacked())
- OS << '>';
- break;
+ StructType *STy = cast<StructType>(Ty);
+
+ if (STy->isAnonymous())
+ return printStructBody(STy, OS);
+
+ if (!STy->getName().empty())
+ return PrintLLVMName(OS, STy->getName(), LocalPrefix);
+
+ DenseMap<StructType*, unsigned>::iterator I = NumberedTypes.find(STy);
+ if (I != NumberedTypes.end())
+ OS << '%' << I->second;
+ else // Not enumerated, print the hex address.
+ OS << "%\"type 0x" << STy << '\"';
+ return;
}
case Type::PointerTyID: {
- const PointerType *PTy = cast<PointerType>(Ty);
- CalcTypeName(PTy->getElementType(), TypeStack, OS);
+ PointerType *PTy = cast<PointerType>(Ty);
+ print(PTy->getElementType(), OS);
if (unsigned AddressSpace = PTy->getAddressSpace())
OS << " addrspace(" << AddressSpace << ')';
OS << '*';
- break;
+ return;
}
case Type::ArrayTyID: {
- const ArrayType *ATy = cast<ArrayType>(Ty);
+ ArrayType *ATy = cast<ArrayType>(Ty);
OS << '[' << ATy->getNumElements() << " x ";
- CalcTypeName(ATy->getElementType(), TypeStack, OS);
+ print(ATy->getElementType(), OS);
OS << ']';
- break;
+ return;
}
case Type::VectorTyID: {
- const VectorType *PTy = cast<VectorType>(Ty);
+ VectorType *PTy = cast<VectorType>(Ty);
OS << "<" << PTy->getNumElements() << " x ";
- CalcTypeName(PTy->getElementType(), TypeStack, OS);
+ print(PTy->getElementType(), OS);
OS << '>';
- break;
+ return;
}
- case Type::OpaqueTyID:
- OS << "opaque";
- break;
default:
OS << "<unrecognized-type>";
- break;
+ return;
}
-
- TypeStack.pop_back(); // Remove self from stack.
}
-/// printTypeInt - The internal guts of printing out a type that has a
-/// potentially named portion.
-///
-void TypePrinting::print(const Type *Ty, raw_ostream &OS,
- bool IgnoreTopLevelName) {
- // Check to see if the type is named.
- DenseMap<const Type*, std::string> &TM = getTypeNamesMap(TypeNames);
- if (!IgnoreTopLevelName) {
- DenseMap<const Type*, std::string>::iterator I = TM.find(Ty);
- if (I != TM.end()) {
- OS << I->second;
- return;
- }
+void TypePrinting::printStructBody(StructType *STy, raw_ostream &OS) {
+ if (STy->isOpaque()) {
+ OS << "opaque";
+ return;
}
-
- // Otherwise we have a type that has not been named but is a derived type.
- // Carefully recurse the type hierarchy to print out any contained symbolic
- // names.
- SmallVector<const Type *, 16> TypeStack;
- std::string TypeName;
-
- raw_string_ostream TypeOS(TypeName);
- CalcTypeName(Ty, TypeStack, TypeOS, IgnoreTopLevelName);
- OS << TypeOS.str();
-
- // Cache type name for later use.
- if (!IgnoreTopLevelName)
- TM.insert(std::make_pair(Ty, TypeOS.str()));
-}
-
-namespace {
- class TypeFinder {
- // To avoid walking constant expressions multiple times and other IR
- // objects, we keep several helper maps.
- DenseSet<const Value*> VisitedConstants;
- DenseSet<const Type*> VisitedTypes;
-
- TypePrinting &TP;
- std::vector<const Type*> &NumberedTypes;
- public:
- TypeFinder(TypePrinting &tp, std::vector<const Type*> &numberedTypes)
- : TP(tp), NumberedTypes(numberedTypes) {}
-
- void Run(const Module &M) {
- // Get types from the type symbol table. This gets opaque types referened
- // only through derived named types.
- const TypeSymbolTable &ST = M.getTypeSymbolTable();
- for (TypeSymbolTable::const_iterator TI = ST.begin(), E = ST.end();
- TI != E; ++TI)
- IncorporateType(TI->second);
-
- // Get types from global variables.
- for (Module::const_global_iterator I = M.global_begin(),
- E = M.global_end(); I != E; ++I) {
- IncorporateType(I->getType());
- if (I->hasInitializer())
- IncorporateValue(I->getInitializer());
- }
-
- // Get types from aliases.
- for (Module::const_alias_iterator I = M.alias_begin(),
- E = M.alias_end(); I != E; ++I) {
- IncorporateType(I->getType());
- IncorporateValue(I->getAliasee());
- }
-
- // Get types from functions.
- for (Module::const_iterator FI = M.begin(), E = M.end(); FI != E; ++FI) {
- IncorporateType(FI->getType());
-
- for (Function::const_iterator BB = FI->begin(), E = FI->end();
- BB != E;++BB)
- for (BasicBlock::const_iterator II = BB->begin(),
- E = BB->end(); II != E; ++II) {
- const Instruction &I = *II;
- // Incorporate the type of the instruction and all its operands.
- IncorporateType(I.getType());
- for (User::const_op_iterator OI = I.op_begin(), OE = I.op_end();
- OI != OE; ++OI)
- IncorporateValue(*OI);
- }
- }
- }
-
- private:
- void IncorporateType(const Type *Ty) {
- // Check to see if we're already visited this type.
- if (!VisitedTypes.insert(Ty).second)
- return;
-
- // If this is a structure or opaque type, add a name for the type.
- if (((Ty->isStructTy() && cast<StructType>(Ty)->getNumElements())
- || Ty->isOpaqueTy()) && !TP.hasTypeName(Ty)) {
- TP.addTypeName(Ty, "%"+utostr(unsigned(NumberedTypes.size())));
- NumberedTypes.push_back(Ty);
- }
-
- // Recursively walk all contained types.
- for (Type::subtype_iterator I = Ty->subtype_begin(),
- E = Ty->subtype_end(); I != E; ++I)
- IncorporateType(*I);
- }
-
- /// IncorporateValue - This method is used to walk operand lists finding
- /// types hiding in constant expressions and other operands that won't be
- /// walked in other ways. GlobalValues, basic blocks, instructions, and
- /// inst operands are all explicitly enumerated.
- void IncorporateValue(const Value *V) {
- if (V == 0 || !isa<Constant>(V) || isa<GlobalValue>(V)) return;
-
- // Already visited?
- if (!VisitedConstants.insert(V).second)
- return;
-
- // Check this type.
- IncorporateType(V->getType());
-
- // Look in operands for types.
- const Constant *C = cast<Constant>(V);
- for (Constant::const_op_iterator I = C->op_begin(),
- E = C->op_end(); I != E;++I)
- IncorporateValue(*I);
- }
- };
-} // end anonymous namespace
-
-
-/// AddModuleTypesToPrinter - Add all of the symbolic type names for types in
-/// the specified module to the TypePrinter and all numbered types to it and the
-/// NumberedTypes table.
-static void AddModuleTypesToPrinter(TypePrinting &TP,
- std::vector<const Type*> &NumberedTypes,
- const Module *M) {
- if (M == 0) return;
-
- // If the module has a symbol table, take all global types and stuff their
- // names into the TypeNames map.
- const TypeSymbolTable &ST = M->getTypeSymbolTable();
- for (TypeSymbolTable::const_iterator TI = ST.begin(), E = ST.end();
- TI != E; ++TI) {
- const Type *Ty = cast<Type>(TI->second);
-
- // As a heuristic, don't insert pointer to primitive types, because
- // they are used too often to have a single useful name.
- if (const PointerType *PTy = dyn_cast<PointerType>(Ty)) {
- const Type *PETy = PTy->getElementType();
- if ((PETy->isPrimitiveType() || PETy->isIntegerTy()) &&
- !PETy->isOpaqueTy())
- continue;
+
+ if (STy->isPacked())
+ OS << '<';
+
+ if (STy->getNumElements() == 0) {
+ OS << "{}";
+ } else {
+ StructType::element_iterator I = STy->element_begin();
+ OS << "{ ";
+ print(*I++, OS);
+ for (StructType::element_iterator E = STy->element_end(); I != E; ++I) {
+ OS << ", ";
+ print(*I, OS);
}
-
- // Likewise don't insert primitives either.
- if (Ty->isIntegerTy() || Ty->isPrimitiveType())
- continue;
-
- // Get the name as a string and insert it into TypeNames.
- std::string NameStr;
- raw_string_ostream NameROS(NameStr);
- formatted_raw_ostream NameOS(NameROS);
- PrintLLVMName(NameOS, TI->first, LocalPrefix);
- NameOS.flush();
- TP.addTypeName(Ty, NameStr);
+
+ OS << " }";
}
-
- // Walk the entire module to find references to unnamed structure and opaque
- // types. This is required for correctness by opaque types (because multiple
- // uses of an unnamed opaque type needs to be referred to by the same ID) and
- // it shrinks complex recursive structure types substantially in some cases.
- TypeFinder(TP, NumberedTypes).Run(*M);
+ if (STy->isPacked())
+ OS << '>';
}
-/// WriteTypeSymbolic - This attempts to write the specified type as a symbolic
-/// type, iff there is an entry in the modules symbol table for the specified
-/// type or one of it's component types.
-///
-void llvm::WriteTypeSymbolic(raw_ostream &OS, const Type *Ty, const Module *M) {
- TypePrinting Printer;
- std::vector<const Type*> NumberedTypes;
- AddModuleTypesToPrinter(Printer, NumberedTypes, M);
- Printer.print(Ty, OS);
-}
//===----------------------------------------------------------------------===//
// SlotTracker Class: Enumerate slot numbers for unnamed values
@@ -481,11 +311,11 @@ private:
const Function* TheFunction;
bool FunctionProcessed;
- /// mMap - The TypePlanes map for the module level data.
+ /// mMap - The slot map for the module level data.
ValueMap mMap;
unsigned mNext;
- /// fMap - The TypePlanes map for the function level data.
+ /// fMap - The slot map for the function level data.
ValueMap fMap;
unsigned fNext;
@@ -706,7 +536,7 @@ int SlotTracker::getGlobalSlot(const GlobalValue *V) {
// Check for uninitialized state and do lazy initialization.
initialize();
- // Find the type plane in the module map
+ // Find the value in the module map
ValueMap::iterator MI = mMap.find(V);
return MI == mMap.end() ? -1 : (int)MI->second;
}
@@ -716,7 +546,7 @@ int SlotTracker::getMetadataSlot(const MDNode *N) {
// Check for uninitialized state and do lazy initialization.
initialize();
- // Find the type plane in the module map
+ // Find the MDNode in the module map
mdn_iterator MI = mdnMap.find(N);
return MI == mdnMap.end() ? -1 : (int)MI->second;
}
@@ -978,7 +808,7 @@ static void WriteConstantInternal(raw_ostream &Out, const Constant *CV,
// As a special case, print the array as a string if it is an array of
// i8 with ConstantInt values.
//
- const Type *ETy = CA->getType()->getElementType();
+ Type *ETy = CA->getType()->getElementType();
if (CA->isString()) {
Out << "c\"";
PrintEscapedString(CA->getAsString(), Out);
@@ -1035,7 +865,7 @@ static void WriteConstantInternal(raw_ostream &Out, const Constant *CV,
}
if (const ConstantVector *CP = dyn_cast<ConstantVector>(CV)) {
- const Type *ETy = CP->getType()->getElementType();
+ Type *ETy = CP->getType()->getElementType();
assert(CP->getNumOperands() > 0 &&
"Number of operands for a PackedConst must be > 0");
Out << '<';
@@ -1233,8 +1063,8 @@ void llvm::WriteAsOperand(raw_ostream &Out, const Value *V,
if (Context == 0) Context = getModuleFromVal(V);
TypePrinting TypePrinter;
- std::vector<const Type*> NumberedTypes;
- AddModuleTypesToPrinter(TypePrinter, NumberedTypes, Context);
+ if (Context)
+ TypePrinter.incorporateTypes(*Context);
if (PrintType) {
TypePrinter.print(V->getType(), Out);
Out << ' ';
@@ -1251,14 +1081,14 @@ class AssemblyWriter {
const Module *TheModule;
TypePrinting TypePrinter;
AssemblyAnnotationWriter *AnnotationWriter;
- std::vector<const Type*> NumberedTypes;
public:
inline AssemblyWriter(formatted_raw_ostream &o, SlotTracker &Mac,
const Module *M,
AssemblyAnnotationWriter *AAW)
: Out(o), Machine(Mac), TheModule(M), AnnotationWriter(AAW) {
- AddModuleTypesToPrinter(TypePrinter, NumberedTypes, M);
+ if (M)
+ TypePrinter.incorporateTypes(*M);
}
void printMDNodeBody(const MDNode *MD);
@@ -1271,7 +1101,7 @@ public:
void writeAllMDNodes();
- void printTypeSymbolTable(const TypeSymbolTable &ST);
+ void printTypeIdentities();
void printGlobal(const GlobalVariable *GV);
void printAlias(const GlobalAlias *GV);
void printFunction(const Function *F);
@@ -1366,9 +1196,7 @@ void AssemblyWriter::printModule(const Module *M) {
Out << " ]";
}
- // Loop over the symbol table, emitting all id'd types.
- if (!M->getTypeSymbolTable().empty() || !NumberedTypes.empty()) Out << '\n';
- printTypeSymbolTable(M->getTypeSymbolTable());
+ printTypeIdentities();
// Output all globals.
if (!M->global_empty()) Out << '\n';
@@ -1401,7 +1229,25 @@ void AssemblyWriter::printModule(const Module *M) {
}
void AssemblyWriter::printNamedMDNode(const NamedMDNode *NMD) {
- Out << "!" << NMD->getName() << " = !{";
+ Out << '!';
+ StringRef Name = NMD->getName();
+ if (Name.empty()) {
+ Out << "<empty name> ";
+ } else {
+ if (isalpha(Name[0]) || Name[0] == '-' || Name[0] == '$' ||
+ Name[0] == '.' || Name[0] == '_')
+ Out << Name[0];
+ else
+ Out << '\\' << hexdigit(Name[0] >> 4) << hexdigit(Name[0] & 0x0F);
+ for (unsigned i = 1, e = Name.size(); i != e; ++i) {
+ unsigned char C = Name[i];
+ if (isalnum(C) || C == '-' || C == '$' || C == '.' || C == '_')
+ Out << C;
+ else
+ Out << '\\' << hexdigit(C >> 4) << hexdigit(C & 0x0F);
+ }
+ }
+ Out << " = !{";
for (unsigned i = 0, e = NMD->getNumOperands(); i != e; ++i) {
if (i) Out << ", ";
int Slot = Machine.getMetadataSlot(NMD->getOperand(i));
@@ -1508,7 +1354,10 @@ void AssemblyWriter::printAlias(const GlobalAlias *GA) {
const Constant *Aliasee = GA->getAliasee();
- if (const GlobalVariable *GV = dyn_cast<GlobalVariable>(Aliasee)) {
+ if (Aliasee == 0) {
+ TypePrinter.print(GA->getType(), Out);
+ Out << " <<NULL ALIASEE>>";
+ } else if (const GlobalVariable *GV = dyn_cast<GlobalVariable>(Aliasee)) {
TypePrinter.print(GV->getType(), Out);
Out << ' ';
PrintLLVMName(Out, GV);
@@ -1534,26 +1383,40 @@ void AssemblyWriter::printAlias(const GlobalAlias *GA) {
Out << '\n';
}
-void AssemblyWriter::printTypeSymbolTable(const TypeSymbolTable &ST) {
+void AssemblyWriter::printTypeIdentities() {
+ if (TypePrinter.NumberedTypes.empty() &&
+ TypePrinter.NamedTypes.empty())
+ return;
+
+ Out << '\n';
+
+ // We know all the numbers that each type is used and we know that it is a
+ // dense assignment. Convert the map to an index table.
+ std::vector<StructType*> NumberedTypes(TypePrinter.NumberedTypes.size());
+ for (DenseMap<StructType*, unsigned>::iterator I =
+ TypePrinter.NumberedTypes.begin(), E = TypePrinter.NumberedTypes.end();
+ I != E; ++I) {
+ assert(I->second < NumberedTypes.size() && "Didn't get a dense numbering?");
+ NumberedTypes[I->second] = I->first;
+ }
+
// Emit all numbered types.
for (unsigned i = 0, e = NumberedTypes.size(); i != e; ++i) {
Out << '%' << i << " = type ";
-
+
// Make sure we print out at least one level of the type structure, so
// that we do not get %2 = type %2
- TypePrinter.printAtLeastOneLevel(NumberedTypes[i], Out);
+ TypePrinter.printStructBody(NumberedTypes[i], Out);
Out << '\n';
}
-
- // Print the named types.
- for (TypeSymbolTable::const_iterator TI = ST.begin(), TE = ST.end();
- TI != TE; ++TI) {
- PrintLLVMName(Out, TI->first, LocalPrefix);
+
+ for (unsigned i = 0, e = TypePrinter.NamedTypes.size(); i != e; ++i) {
+ PrintLLVMName(Out, TypePrinter.NamedTypes[i]->getName(), LocalPrefix);
Out << " = type ";
// Make sure we print out at least one level of the type structure, so
// that we do not get %FILE = type %FILE
- TypePrinter.printAtLeastOneLevel(TI->second, Out);
+ TypePrinter.printStructBody(TypePrinter.NamedTypes[i], Out);
Out << '\n';
}
}
@@ -1735,18 +1598,6 @@ void AssemblyWriter::printBasicBlock(const BasicBlock *BB) {
if (AnnotationWriter) AnnotationWriter->emitBasicBlockEndAnnot(BB, Out);
}
-/// printDebugLoc - Print DebugLoc.
-static void printDebugLoc(const DebugLoc &DL, formatted_raw_ostream &OS) {
- OS << DL.getLine() << ":" << DL.getCol();
- if (MDNode *N = DL.getInlinedAt(getGlobalContext())) {
- DebugLoc IDL = DebugLoc::getFromDILocation(N);
- if (!IDL.isUnknown()) {
- OS << "@";
- printDebugLoc(IDL,OS);
- }
- }
-}
-
/// printInfoComment - Print a little comment after the instruction indicating
/// which slot it occupies.
///
@@ -1754,43 +1605,6 @@ void AssemblyWriter::printInfoComment(const Value &V) {
if (AnnotationWriter) {
AnnotationWriter->printInfoComment(V, Out);
return;
- } else if (EnableDebugInfoComment) {
- bool Padded = false;
- if (const Instruction *I = dyn_cast<Instruction>(&V)) {
- const DebugLoc &DL = I->getDebugLoc();
- if (!DL.isUnknown()) {
- if (!Padded) {
- Out.PadToColumn(50);
- Padded = true;
- Out << ";";
- }
- Out << " [debug line = ";
- printDebugLoc(DL,Out);
- Out << "]";
- }
- if (const DbgDeclareInst *DDI = dyn_cast<DbgDeclareInst>(I)) {
- const MDNode *Var = DDI->getVariable();
- if (!Padded) {
- Out.PadToColumn(50);
- Padded = true;
- Out << ";";
- }
- if (Var && Var->getNumOperands() >= 2)
- if (MDString *MDS = dyn_cast_or_null<MDString>(Var->getOperand(2)))
- Out << " [debug variable = " << MDS->getString() << "]";
- }
- else if (const DbgValueInst *DVI = dyn_cast<DbgValueInst>(I)) {
- const MDNode *Var = DVI->getVariable();
- if (!Padded) {
- Out.PadToColumn(50);
- Padded = true;
- Out << ";";
- }
- if (Var && Var->getNumOperands() >= 2)
- if (MDString *MDS = dyn_cast_or_null<MDString>(Var->getOperand(2)))
- Out << " [debug variable = " << MDS->getString() << "]";
- }
- }
}
}
@@ -1873,16 +1687,16 @@ void AssemblyWriter::printInstruction(const Instruction &I) {
writeOperand(I.getOperand(i), true);
}
Out << ']';
- } else if (isa<PHINode>(I)) {
+ } else if (const PHINode *PN = dyn_cast<PHINode>(&I)) {
Out << ' ';
TypePrinter.print(I.getType(), Out);
Out << ' ';
- for (unsigned op = 0, Eop = I.getNumOperands(); op < Eop; op += 2) {
+ for (unsigned op = 0, Eop = PN->getNumIncomingValues(); op < Eop; ++op) {
if (op) Out << ", ";
Out << "[ ";
- writeOperand(I.getOperand(op ), false); Out << ", ";
- writeOperand(I.getOperand(op+1), false); Out << " ]";
+ writeOperand(PN->getIncomingValue(op), false); Out << ", ";
+ writeOperand(PN->getIncomingBlock(op), false); Out << " ]";
}
} else if (const ExtractValueInst *EVI = dyn_cast<ExtractValueInst>(&I)) {
Out << ' ';
@@ -1916,9 +1730,9 @@ void AssemblyWriter::printInstruction(const Instruction &I) {
}
Operand = CI->getCalledValue();
- const PointerType *PTy = cast<PointerType>(Operand->getType());
- const FunctionType *FTy = cast<FunctionType>(PTy->getElementType());
- const Type *RetTy = FTy->getReturnType();
+ PointerType *PTy = cast<PointerType>(Operand->getType());
+ FunctionType *FTy = cast<FunctionType>(PTy->getElementType());
+ Type *RetTy = FTy->getReturnType();
const AttrListPtr &PAL = CI->getAttributes();
if (PAL.getRetAttributes() != Attribute::None)
@@ -1949,9 +1763,9 @@ void AssemblyWriter::printInstruction(const Instruction &I) {
Out << ' ' << Attribute::getAsString(PAL.getFnAttributes());
} else if (const InvokeInst *II = dyn_cast<InvokeInst>(&I)) {
Operand = II->getCalledValue();
- const PointerType *PTy = cast<PointerType>(Operand->getType());
- const FunctionType *FTy = cast<FunctionType>(PTy->getElementType());
- const Type *RetTy = FTy->getReturnType();
+ PointerType *PTy = cast<PointerType>(Operand->getType());
+ FunctionType *FTy = cast<FunctionType>(PTy->getElementType());
+ Type *RetTy = FTy->getReturnType();
const AttrListPtr &PAL = II->getAttributes();
// Print the calling convention being used.
@@ -2034,7 +1848,7 @@ void AssemblyWriter::printInstruction(const Instruction &I) {
// omit the type from all but the first operand. If the instruction has
// different type operands (for example br), then they are all printed.
bool PrintAllTypes = false;
- const Type *TheType = Operand->getType();
+ Type *TheType = Operand->getType();
// Select, Store and ShuffleVector always print all types.
if (isa<SelectInst>(I) || isa<StoreInst>(I) || isa<ShuffleVectorInst>(I)
@@ -2154,7 +1968,15 @@ void Type::print(raw_ostream &OS) const {
OS << "<null Type>";
return;
}
- TypePrinting().print(this, OS);
+ TypePrinting TP;
+ TP.print(const_cast<Type*>(this), OS);
+
+ // If the type is a named struct type, print the body as well.
+ if (StructType *STy = dyn_cast<StructType>(const_cast<Type*>(this)))
+ if (!STy->isAnonymous()) {
+ OS << " = type ";
+ TP.printStructBody(STy, OS);
+ }
}
void Value::print(raw_ostream &ROS, AssemblyAnnotationWriter *AAW) const {
@@ -2210,14 +2032,7 @@ void Value::printCustom(raw_ostream &OS) const {
void Value::dump() const { print(dbgs()); dbgs() << '\n'; }
// Type::dump - allow easy printing of Types from the debugger.
-// This one uses type names from the given context module
-void Type::dump(const Module *Context) const {
- WriteTypeSymbolic(dbgs(), this, Context);
- dbgs() << '\n';
-}
-
-// Type::dump - allow easy printing of Types from the debugger.
-void Type::dump() const { dump(0); }
+void Type::dump() const { print(dbgs()); }
// Module::dump() - Allow printing of Modules from the debugger.
void Module::dump() const { print(dbgs(), 0); }
diff --git a/contrib/llvm/lib/VMCore/Attributes.cpp b/contrib/llvm/lib/VMCore/Attributes.cpp
index ee257db..bf6efa1 100644
--- a/contrib/llvm/lib/VMCore/Attributes.cpp
+++ b/contrib/llvm/lib/VMCore/Attributes.cpp
@@ -74,6 +74,8 @@ std::string Attribute::getAsString(Attributes Attrs) {
Result += "naked ";
if (Attrs & Attribute::Hotpatch)
Result += "hotpatch ";
+ if (Attrs & Attribute::NonLazyBind)
+ Result += "nonlazybind ";
if (Attrs & Attribute::StackAlignment) {
Result += "alignstack(";
Result += utostr(Attribute::getStackAlignmentFromAttrs(Attrs));
diff --git a/contrib/llvm/lib/VMCore/AutoUpgrade.cpp b/contrib/llvm/lib/VMCore/AutoUpgrade.cpp
index f8f15ca..9e93ff3 100644
--- a/contrib/llvm/lib/VMCore/AutoUpgrade.cpp
+++ b/contrib/llvm/lib/VMCore/AutoUpgrade.cpp
@@ -28,558 +28,77 @@ using namespace llvm;
static bool UpgradeIntrinsicFunction1(Function *F, Function *&NewFn) {
assert(F && "Illegal to upgrade a non-existent Function.");
- // Get the Function's name.
- const std::string& Name = F->getName();
-
- // Convenience
- const FunctionType *FTy = F->getFunctionType();
-
// Quickly eliminate it, if it's not a candidate.
- if (Name.length() <= 8 || Name[0] != 'l' || Name[1] != 'l' ||
- Name[2] != 'v' || Name[3] != 'm' || Name[4] != '.')
+ StringRef Name = F->getName();
+ if (Name.size() <= 8 || !Name.startswith("llvm."))
return false;
+ Name = Name.substr(5); // Strip off "llvm."
+ const FunctionType *FTy = F->getFunctionType();
Module *M = F->getParent();
- switch (Name[5]) {
+
+ switch (Name[0]) {
default: break;
- case 'a':
- // This upgrades the llvm.atomic.lcs, llvm.atomic.las, llvm.atomic.lss,
- // and atomics with default address spaces to their new names to their new
- // function name (e.g. llvm.atomic.add.i32 => llvm.atomic.add.i32.p0i32)
- if (Name.compare(5,7,"atomic.",7) == 0) {
- if (Name.compare(12,3,"lcs",3) == 0) {
- std::string::size_type delim = Name.find('.',12);
- F->setName("llvm.atomic.cmp.swap" + Name.substr(delim) +
- ".p0" + Name.substr(delim+1));
- NewFn = F;
- return true;
- }
- else if (Name.compare(12,3,"las",3) == 0) {
- std::string::size_type delim = Name.find('.',12);
- F->setName("llvm.atomic.load.add"+Name.substr(delim)
- + ".p0" + Name.substr(delim+1));
- NewFn = F;
- return true;
- }
- else if (Name.compare(12,3,"lss",3) == 0) {
- std::string::size_type delim = Name.find('.',12);
- F->setName("llvm.atomic.load.sub"+Name.substr(delim)
- + ".p0" + Name.substr(delim+1));
- NewFn = F;
- return true;
- }
- else if (Name.rfind(".p") == std::string::npos) {
- // We don't have an address space qualifier so this has be upgraded
- // to the new name. Copy the type name at the end of the intrinsic
- // and add to it
- std::string::size_type delim = Name.find_last_of('.');
- assert(delim != std::string::npos && "can not find type");
- F->setName(Name + ".p0" + Name.substr(delim+1));
- NewFn = F;
- return true;
- }
- } else if (Name.compare(5, 9, "arm.neon.", 9) == 0) {
- if (((Name.compare(14, 5, "vmovl", 5) == 0 ||
- Name.compare(14, 5, "vaddl", 5) == 0 ||
- Name.compare(14, 5, "vsubl", 5) == 0 ||
- Name.compare(14, 5, "vaddw", 5) == 0 ||
- Name.compare(14, 5, "vsubw", 5) == 0 ||
- Name.compare(14, 5, "vmlal", 5) == 0 ||
- Name.compare(14, 5, "vmlsl", 5) == 0 ||
- Name.compare(14, 5, "vabdl", 5) == 0 ||
- Name.compare(14, 5, "vabal", 5) == 0) &&
- (Name.compare(19, 2, "s.", 2) == 0 ||
- Name.compare(19, 2, "u.", 2) == 0)) ||
-
- (Name.compare(14, 4, "vaba", 4) == 0 &&
- (Name.compare(18, 2, "s.", 2) == 0 ||
- Name.compare(18, 2, "u.", 2) == 0)) ||
-
- (Name.compare(14, 6, "vmovn.", 6) == 0)) {
-
- // Calls to these are transformed into IR without intrinsics.
- NewFn = 0;
- return true;
- }
- // Old versions of NEON ld/st intrinsics are missing alignment arguments.
- bool isVLd = (Name.compare(14, 3, "vld", 3) == 0);
- bool isVSt = (Name.compare(14, 3, "vst", 3) == 0);
- if (isVLd || isVSt) {
- unsigned NumVecs = Name.at(17) - '0';
- if (NumVecs == 0 || NumVecs > 4)
- return false;
- bool isLaneOp = (Name.compare(18, 5, "lane.", 5) == 0);
- if (!isLaneOp && Name.at(18) != '.')
- return false;
- unsigned ExpectedArgs = 2; // for the address and alignment
- if (isVSt || isLaneOp)
- ExpectedArgs += NumVecs;
- if (isLaneOp)
- ExpectedArgs += 1; // for the lane number
- unsigned NumP = FTy->getNumParams();
- if (NumP != ExpectedArgs - 1)
- return false;
-
- // Change the name of the old (bad) intrinsic, because
- // its type is incorrect, but we cannot overload that name.
- F->setName("");
-
- // One argument is missing: add the alignment argument.
- std::vector<const Type*> NewParams;
- for (unsigned p = 0; p < NumP; ++p)
- NewParams.push_back(FTy->getParamType(p));
- NewParams.push_back(Type::getInt32Ty(F->getContext()));
- FunctionType *NewFTy = FunctionType::get(FTy->getReturnType(),
- NewParams, false);
- NewFn = cast<Function>(M->getOrInsertFunction(Name, NewFTy));
- return true;
- }
- }
- break;
- case 'b':
- // This upgrades the name of the llvm.bswap intrinsic function to only use
- // a single type name for overloading. We only care about the old format
- // 'llvm.bswap.i*.i*', so check for 'bswap.' and then for there being
- // a '.' after 'bswap.'
- if (Name.compare(5,6,"bswap.",6) == 0) {
- std::string::size_type delim = Name.find('.',11);
-
- if (delim != std::string::npos) {
- // Construct the new name as 'llvm.bswap' + '.i*'
- F->setName(Name.substr(0,10)+Name.substr(delim));
- NewFn = F;
- return true;
- }
- }
- break;
+ case 'p':
+ // This upgrades the llvm.prefetch intrinsic to accept one more parameter,
+ // which is a instruction / data cache identifier. The old version only
+ // implicitly accepted the data version.
+ if (Name == "prefetch") {
+ // Don't do anything if it has the correct number of arguments already
+ if (FTy->getNumParams() == 4)
+ break;
- case 'c':
- // We only want to fix the 'llvm.ct*' intrinsics which do not have the
- // correct return type, so we check for the name, and then check if the
- // return type does not match the parameter type.
- if ( (Name.compare(5,5,"ctpop",5) == 0 ||
- Name.compare(5,4,"ctlz",4) == 0 ||
- Name.compare(5,4,"cttz",4) == 0) &&
- FTy->getReturnType() != FTy->getParamType(0)) {
- // We first need to change the name of the old (bad) intrinsic, because
- // its type is incorrect, but we cannot overload that name. We
- // arbitrarily unique it here allowing us to construct a correctly named
+ assert(FTy->getNumParams() == 3 && "old prefetch takes 3 args!");
+ // We first need to change the name of the old (bad) intrinsic, because
+ // its type is incorrect, but we cannot overload that name. We
+ // arbitrarily unique it here allowing us to construct a correctly named
// and typed function below.
+ std::string NameTmp = F->getName();
F->setName("");
-
- // Now construct the new intrinsic with the correct name and type. We
- // leave the old function around in order to query its type, whatever it
- // may be, and correctly convert up to the new type.
- NewFn = cast<Function>(M->getOrInsertFunction(Name,
+ NewFn = cast<Function>(M->getOrInsertFunction(NameTmp,
+ FTy->getReturnType(),
FTy->getParamType(0),
- FTy->getParamType(0),
- (Type *)0));
+ FTy->getParamType(1),
+ FTy->getParamType(2),
+ FTy->getParamType(2),
+ (Type*)0));
return true;
}
- break;
- case 'e':
- // The old llvm.eh.selector.i32 is equivalent to the new llvm.eh.selector.
- if (Name.compare("llvm.eh.selector.i32") == 0) {
- F->setName("llvm.eh.selector");
- NewFn = F;
- return true;
- }
- // The old llvm.eh.typeid.for.i32 is equivalent to llvm.eh.typeid.for.
- if (Name.compare("llvm.eh.typeid.for.i32") == 0) {
- F->setName("llvm.eh.typeid.for");
- NewFn = F;
- return true;
- }
- // Convert the old llvm.eh.selector.i64 to a call to llvm.eh.selector.
- if (Name.compare("llvm.eh.selector.i64") == 0) {
- NewFn = Intrinsic::getDeclaration(M, Intrinsic::eh_selector);
- return true;
- }
- // Convert the old llvm.eh.typeid.for.i64 to a call to llvm.eh.typeid.for.
- if (Name.compare("llvm.eh.typeid.for.i64") == 0) {
- NewFn = Intrinsic::getDeclaration(M, Intrinsic::eh_typeid_for);
- return true;
- }
break;
-
- case 'm': {
- // This upgrades the llvm.memcpy, llvm.memmove, and llvm.memset to the
- // new format that allows overloading the pointer for different address
- // space (e.g., llvm.memcpy.i16 => llvm.memcpy.p0i8.p0i8.i16)
- const char* NewFnName = NULL;
- if (Name.compare(5,8,"memcpy.i",8) == 0) {
- if (Name[13] == '8')
- NewFnName = "llvm.memcpy.p0i8.p0i8.i8";
- else if (Name.compare(13,2,"16") == 0)
- NewFnName = "llvm.memcpy.p0i8.p0i8.i16";
- else if (Name.compare(13,2,"32") == 0)
- NewFnName = "llvm.memcpy.p0i8.p0i8.i32";
- else if (Name.compare(13,2,"64") == 0)
- NewFnName = "llvm.memcpy.p0i8.p0i8.i64";
- } else if (Name.compare(5,9,"memmove.i",9) == 0) {
- if (Name[14] == '8')
- NewFnName = "llvm.memmove.p0i8.p0i8.i8";
- else if (Name.compare(14,2,"16") == 0)
- NewFnName = "llvm.memmove.p0i8.p0i8.i16";
- else if (Name.compare(14,2,"32") == 0)
- NewFnName = "llvm.memmove.p0i8.p0i8.i32";
- else if (Name.compare(14,2,"64") == 0)
- NewFnName = "llvm.memmove.p0i8.p0i8.i64";
- }
- else if (Name.compare(5,8,"memset.i",8) == 0) {
- if (Name[13] == '8')
- NewFnName = "llvm.memset.p0i8.i8";
- else if (Name.compare(13,2,"16") == 0)
- NewFnName = "llvm.memset.p0i8.i16";
- else if (Name.compare(13,2,"32") == 0)
- NewFnName = "llvm.memset.p0i8.i32";
- else if (Name.compare(13,2,"64") == 0)
- NewFnName = "llvm.memset.p0i8.i64";
- }
+ case 'x': {
+ const char *NewFnName = NULL;
+ // This fixes the poorly named crc32 intrinsics.
+ if (Name == "x86.sse42.crc32.8")
+ NewFnName = "llvm.x86.sse42.crc32.32.8";
+ else if (Name == "x86.sse42.crc32.16")
+ NewFnName = "llvm.x86.sse42.crc32.32.16";
+ else if (Name == "x86.sse42.crc32.32")
+ NewFnName = "llvm.x86.sse42.crc32.32.32";
+ else if (Name == "x86.sse42.crc64.8")
+ NewFnName = "llvm.x86.sse42.crc32.64.8";
+ else if (Name == "x86.sse42.crc64.64")
+ NewFnName = "llvm.x86.sse42.crc32.64.64";
+
if (NewFnName) {
- NewFn = cast<Function>(M->getOrInsertFunction(NewFnName,
- FTy->getReturnType(),
- FTy->getParamType(0),
- FTy->getParamType(1),
- FTy->getParamType(2),
- FTy->getParamType(3),
- Type::getInt1Ty(F->getContext()),
- (Type *)0));
+ F->setName(NewFnName);
+ NewFn = F;
return true;
}
- break;
- }
- case 'p':
- // This upgrades the llvm.part.select overloaded intrinsic names to only
- // use one type specifier in the name. We only care about the old format
- // 'llvm.part.select.i*.i*', and solve as above with bswap.
- if (Name.compare(5,12,"part.select.",12) == 0) {
- std::string::size_type delim = Name.find('.',17);
-
- if (delim != std::string::npos) {
- // Construct a new name as 'llvm.part.select' + '.i*'
- F->setName(Name.substr(0,16)+Name.substr(delim));
- NewFn = F;
- return true;
- }
- break;
- }
- // This upgrades the llvm.part.set intrinsics similarly as above, however
- // we care about 'llvm.part.set.i*.i*.i*', but only the first two types
- // must match. There is an additional type specifier after these two
- // matching types that we must retain when upgrading. Thus, we require
- // finding 2 periods, not just one, after the intrinsic name.
- if (Name.compare(5,9,"part.set.",9) == 0) {
- std::string::size_type delim = Name.find('.',14);
-
- if (delim != std::string::npos &&
- Name.find('.',delim+1) != std::string::npos) {
- // Construct a new name as 'llvm.part.select' + '.i*.i*'
- F->setName(Name.substr(0,13)+Name.substr(delim));
- NewFn = F;
- return true;
- }
- break;
- }
-
- break;
- case 'x':
- // This fixes the poorly named crc32 intrinsics
- if (Name.compare(5, 13, "x86.sse42.crc", 13) == 0) {
- const char* NewFnName = NULL;
- if (Name.compare(18, 2, "32", 2) == 0) {
- if (Name.compare(20, 2, ".8") == 0 && Name.length() == 22) {
- NewFnName = "llvm.x86.sse42.crc32.32.8";
- } else if (Name.compare(20, 3, ".16") == 0 && Name.length() == 23) {
- NewFnName = "llvm.x86.sse42.crc32.32.16";
- } else if (Name.compare(20, 3, ".32") == 0 && Name.length() == 23) {
- NewFnName = "llvm.x86.sse42.crc32.32.32";
- }
- }
- else if (Name.compare(18, 2, "64", 2) == 0) {
- if (Name.compare(20, 2, ".8") == 0 && Name.length() == 22) {
- NewFnName = "llvm.x86.sse42.crc32.64.8";
- } else if (Name.compare(20, 3, ".64") == 0 && Name.length() == 23) {
- NewFnName = "llvm.x86.sse42.crc32.64.64";
- }
- }
- if (NewFnName) {
- F->setName(NewFnName);
- NewFn = F;
- return true;
- }
- }
-
- // This fixes all MMX shift intrinsic instructions to take a
- // x86_mmx instead of a v1i64, v2i32, v4i16, or v8i8.
- if (Name.compare(5, 8, "x86.mmx.", 8) == 0) {
- const Type *X86_MMXTy = VectorType::getX86_MMXTy(FTy->getContext());
-
- if (Name.compare(13, 4, "padd", 4) == 0 ||
- Name.compare(13, 4, "psub", 4) == 0 ||
- Name.compare(13, 4, "pmul", 4) == 0 ||
- Name.compare(13, 5, "pmadd", 5) == 0 ||
- Name.compare(13, 4, "pand", 4) == 0 ||
- Name.compare(13, 3, "por", 3) == 0 ||
- Name.compare(13, 4, "pxor", 4) == 0 ||
- Name.compare(13, 4, "pavg", 4) == 0 ||
- Name.compare(13, 4, "pmax", 4) == 0 ||
- Name.compare(13, 4, "pmin", 4) == 0 ||
- Name.compare(13, 4, "psad", 4) == 0 ||
- Name.compare(13, 4, "psll", 4) == 0 ||
- Name.compare(13, 4, "psrl", 4) == 0 ||
- Name.compare(13, 4, "psra", 4) == 0 ||
- Name.compare(13, 4, "pack", 4) == 0 ||
- Name.compare(13, 6, "punpck", 6) == 0 ||
- Name.compare(13, 4, "pcmp", 4) == 0) {
- assert(FTy->getNumParams() == 2 && "MMX intrinsic takes 2 args!");
- const Type *SecondParamTy = X86_MMXTy;
-
- if (Name.compare(13, 5, "pslli", 5) == 0 ||
- Name.compare(13, 5, "psrli", 5) == 0 ||
- Name.compare(13, 5, "psrai", 5) == 0)
- SecondParamTy = FTy->getParamType(1);
-
- // Don't do anything if it has the correct types.
- if (FTy->getReturnType() == X86_MMXTy &&
- FTy->getParamType(0) == X86_MMXTy &&
- FTy->getParamType(1) == SecondParamTy)
- break;
-
- // We first need to change the name of the old (bad) intrinsic, because
- // its type is incorrect, but we cannot overload that name. We
- // arbitrarily unique it here allowing us to construct a correctly named
- // and typed function below.
- F->setName("");
-
- // Now construct the new intrinsic with the correct name and type. We
- // leave the old function around in order to query its type, whatever it
- // may be, and correctly convert up to the new type.
- NewFn = cast<Function>(M->getOrInsertFunction(Name,
- X86_MMXTy, X86_MMXTy,
- SecondParamTy, (Type*)0));
- return true;
- }
-
- if (Name.compare(13, 8, "maskmovq", 8) == 0) {
- // Don't do anything if it has the correct types.
- if (FTy->getParamType(0) == X86_MMXTy &&
- FTy->getParamType(1) == X86_MMXTy)
- break;
-
- F->setName("");
- NewFn = cast<Function>(M->getOrInsertFunction(Name,
- FTy->getReturnType(),
- X86_MMXTy,
- X86_MMXTy,
- FTy->getParamType(2),
- (Type*)0));
- return true;
- }
-
- if (Name.compare(13, 8, "pmovmskb", 8) == 0) {
- if (FTy->getParamType(0) == X86_MMXTy)
- break;
-
- F->setName("");
- NewFn = cast<Function>(M->getOrInsertFunction(Name,
- FTy->getReturnType(),
- X86_MMXTy,
- (Type*)0));
- return true;
- }
-
- if (Name.compare(13, 5, "movnt", 5) == 0) {
- if (FTy->getParamType(1) == X86_MMXTy)
- break;
-
- F->setName("");
- NewFn = cast<Function>(M->getOrInsertFunction(Name,
- FTy->getReturnType(),
- FTy->getParamType(0),
- X86_MMXTy,
- (Type*)0));
- return true;
- }
-
- if (Name.compare(13, 7, "palignr", 7) == 0) {
- if (FTy->getReturnType() == X86_MMXTy &&
- FTy->getParamType(0) == X86_MMXTy &&
- FTy->getParamType(1) == X86_MMXTy)
- break;
-
- F->setName("");
- NewFn = cast<Function>(M->getOrInsertFunction(Name,
- X86_MMXTy,
- X86_MMXTy,
- X86_MMXTy,
- FTy->getParamType(2),
- (Type*)0));
- return true;
- }
-
- if (Name.compare(13, 5, "pextr", 5) == 0) {
- if (FTy->getParamType(0) == X86_MMXTy)
- break;
-
- F->setName("");
- NewFn = cast<Function>(M->getOrInsertFunction(Name,
- FTy->getReturnType(),
- X86_MMXTy,
- FTy->getParamType(1),
- (Type*)0));
- return true;
- }
-
- if (Name.compare(13, 5, "pinsr", 5) == 0) {
- if (FTy->getReturnType() == X86_MMXTy &&
- FTy->getParamType(0) == X86_MMXTy)
- break;
-
- F->setName("");
- NewFn = cast<Function>(M->getOrInsertFunction(Name,
- X86_MMXTy,
- X86_MMXTy,
- FTy->getParamType(1),
- FTy->getParamType(2),
- (Type*)0));
- return true;
- }
-
- if (Name.compare(13, 12, "cvtsi32.si64", 12) == 0) {
- if (FTy->getReturnType() == X86_MMXTy)
- break;
-
- F->setName("");
- NewFn = cast<Function>(M->getOrInsertFunction(Name,
- X86_MMXTy,
- FTy->getParamType(0),
- (Type*)0));
- return true;
- }
-
- if (Name.compare(13, 12, "cvtsi64.si32", 12) == 0) {
- if (FTy->getParamType(0) == X86_MMXTy)
- break;
-
- F->setName("");
- NewFn = cast<Function>(M->getOrInsertFunction(Name,
- FTy->getReturnType(),
- X86_MMXTy,
- (Type*)0));
- return true;
- }
-
- if (Name.compare(13, 8, "vec.init", 8) == 0) {
- if (FTy->getReturnType() == X86_MMXTy)
- break;
-
- F->setName("");
-
- if (Name.compare(21, 2, ".b", 2) == 0)
- NewFn = cast<Function>(M->getOrInsertFunction(Name,
- X86_MMXTy,
- FTy->getParamType(0),
- FTy->getParamType(1),
- FTy->getParamType(2),
- FTy->getParamType(3),
- FTy->getParamType(4),
- FTy->getParamType(5),
- FTy->getParamType(6),
- FTy->getParamType(7),
- (Type*)0));
- else if (Name.compare(21, 2, ".w", 2) == 0)
- NewFn = cast<Function>(M->getOrInsertFunction(Name,
- X86_MMXTy,
- FTy->getParamType(0),
- FTy->getParamType(1),
- FTy->getParamType(2),
- FTy->getParamType(3),
- (Type*)0));
- else if (Name.compare(21, 2, ".d", 2) == 0)
- NewFn = cast<Function>(M->getOrInsertFunction(Name,
- X86_MMXTy,
- FTy->getParamType(0),
- FTy->getParamType(1),
- (Type*)0));
- return true;
- }
-
-
- if (Name.compare(13, 9, "vec.ext.d", 9) == 0) {
- if (FTy->getReturnType() == X86_MMXTy &&
- FTy->getParamType(0) == X86_MMXTy)
- break;
-
- F->setName("");
- NewFn = cast<Function>(M->getOrInsertFunction(Name,
- X86_MMXTy,
- X86_MMXTy,
- FTy->getParamType(1),
- (Type*)0));
- return true;
- }
-
- if (Name.compare(13, 9, "emms", 4) == 0 ||
- Name.compare(13, 9, "femms", 5) == 0) {
- NewFn = 0;
- break;
- }
-
- // We really shouldn't get here ever.
- assert(0 && "Invalid MMX intrinsic!");
- break;
- } else if (Name.compare(5,17,"x86.sse2.loadh.pd",17) == 0 ||
- Name.compare(5,17,"x86.sse2.loadl.pd",17) == 0 ||
- Name.compare(5,16,"x86.sse2.movl.dq",16) == 0 ||
- Name.compare(5,15,"x86.sse2.movs.d",15) == 0 ||
- Name.compare(5,16,"x86.sse2.shuf.pd",16) == 0 ||
- Name.compare(5,18,"x86.sse2.unpckh.pd",18) == 0 ||
- Name.compare(5,18,"x86.sse2.unpckl.pd",18) == 0 ||
- Name.compare(5,20,"x86.sse2.punpckh.qdq",20) == 0 ||
- Name.compare(5,20,"x86.sse2.punpckl.qdq",20) == 0) {
- // Calls to these intrinsics are transformed into ShuffleVector's.
- NewFn = 0;
- return true;
- } else if (Name.compare(5, 16, "x86.sse41.pmulld", 16) == 0) {
- // Calls to these intrinsics are transformed into vector multiplies.
- NewFn = 0;
+ // Calls to these instructions are transformed into unaligned loads.
+ if (Name == "x86.sse.loadu.ps" || Name == "x86.sse2.loadu.dq" ||
+ Name == "x86.sse2.loadu.pd")
return true;
- } else if (Name.compare(5, 18, "x86.ssse3.palign.r", 18) == 0 ||
- Name.compare(5, 22, "x86.ssse3.palign.r.128", 22) == 0) {
- // Calls to these intrinsics are transformed into vector shuffles, shifts,
- // or 0.
- NewFn = 0;
- return true;
- } else if (Name.compare(5, 16, "x86.sse.loadu.ps", 16) == 0 ||
- Name.compare(5, 17, "x86.sse2.loadu.dq", 17) == 0 ||
- Name.compare(5, 17, "x86.sse2.loadu.pd", 17) == 0) {
- // Calls to these instructions are transformed into unaligned loads.
- NewFn = 0;
- return true;
- } else if (Name.compare(5, 16, "x86.sse.movnt.ps", 16) == 0 ||
- Name.compare(5, 17, "x86.sse2.movnt.dq", 17) == 0 ||
- Name.compare(5, 17, "x86.sse2.movnt.pd", 17) == 0 ||
- Name.compare(5, 17, "x86.sse2.movnt.i", 16) == 0) {
- // Calls to these instructions are transformed into nontemporal stores.
- NewFn = 0;
- return true;
- } else if (Name.compare(5, 17, "x86.ssse3.pshuf.w", 17) == 0) {
- // This is an SSE/MMX instruction.
- const Type *X86_MMXTy = VectorType::getX86_MMXTy(FTy->getContext());
- NewFn =
- cast<Function>(M->getOrInsertFunction("llvm.x86.sse.pshuf.w",
- X86_MMXTy,
- X86_MMXTy,
- Type::getInt8Ty(F->getContext()),
- (Type*)0));
+
+ // Calls to these instructions are transformed into nontemporal stores.
+ if (Name == "x86.sse.movnt.ps" || Name == "x86.sse2.movnt.dq" ||
+ Name == "x86.sse2.movnt.pd" || Name == "x86.sse2.movnt.i")
return true;
- }
break;
}
+ }
// This may not belong here. This function is effectively being overloaded
// to both detect an intrinsic which needs upgrading, and to provide the
@@ -601,105 +120,10 @@ bool llvm::UpgradeIntrinsicFunction(Function *F, Function *&NewFn) {
}
bool llvm::UpgradeGlobalVariable(GlobalVariable *GV) {
- StringRef Name(GV->getName());
-
- // We are only upgrading one symbol here.
- if (Name == ".llvm.eh.catch.all.value") {
- GV->setName("llvm.eh.catch.all.value");
- return true;
- }
-
+ // Nothing to do yet.
return false;
}
-/// ExtendNEONArgs - For NEON "long" and "wide" operations, where the results
-/// have vector elements twice as big as one or both source operands, do the
-/// sign- or zero-extension that used to be handled by intrinsics. The
-/// extended values are returned via V0 and V1.
-static void ExtendNEONArgs(CallInst *CI, Value *Arg0, Value *Arg1,
- Value *&V0, Value *&V1) {
- Function *F = CI->getCalledFunction();
- const std::string& Name = F->getName();
- bool isLong = (Name.at(18) == 'l');
- bool isSigned = (Name.at(19) == 's');
-
- if (isSigned) {
- if (isLong)
- V0 = new SExtInst(Arg0, CI->getType(), "", CI);
- else
- V0 = Arg0;
- V1 = new SExtInst(Arg1, CI->getType(), "", CI);
- } else {
- if (isLong)
- V0 = new ZExtInst(Arg0, CI->getType(), "", CI);
- else
- V0 = Arg0;
- V1 = new ZExtInst(Arg1, CI->getType(), "", CI);
- }
-}
-
-/// CallVABD - As part of expanding a call to one of the old NEON vabdl, vaba,
-/// or vabal intrinsics, construct a call to a vabd intrinsic. Examine the
-/// name of the old intrinsic to determine whether to use a signed or unsigned
-/// vabd intrinsic. Get the type from the old call instruction, adjusted for
-/// half-size vector elements if the old intrinsic was vabdl or vabal.
-static Instruction *CallVABD(CallInst *CI, Value *Arg0, Value *Arg1) {
- Function *F = CI->getCalledFunction();
- const std::string& Name = F->getName();
- bool isLong = (Name.at(18) == 'l');
- bool isSigned = (Name.at(isLong ? 19 : 18) == 's');
-
- Intrinsic::ID intID;
- if (isSigned)
- intID = Intrinsic::arm_neon_vabds;
- else
- intID = Intrinsic::arm_neon_vabdu;
-
- const Type *Ty = CI->getType();
- if (isLong)
- Ty = VectorType::getTruncatedElementVectorType(cast<const VectorType>(Ty));
-
- Function *VABD = Intrinsic::getDeclaration(F->getParent(), intID, &Ty, 1);
- Value *Operands[2];
- Operands[0] = Arg0;
- Operands[1] = Arg1;
- return CallInst::Create(VABD, Operands, Operands+2,
- "upgraded."+CI->getName(), CI);
-}
-
-/// ConstructNewCallInst - Construct a new CallInst with the signature of NewFn.
-static void ConstructNewCallInst(Function *NewFn, CallInst *OldCI,
- Value **Operands, unsigned NumOps,
- bool AssignName = true) {
- // Construct a new CallInst.
- CallInst *NewCI =
- CallInst::Create(NewFn, Operands, Operands + NumOps,
- AssignName ? "upgraded." + OldCI->getName() : "", OldCI);
-
- NewCI->setTailCall(OldCI->isTailCall());
- NewCI->setCallingConv(OldCI->getCallingConv());
-
- // Handle any uses of the old CallInst. If the type has changed, add a cast.
- if (!OldCI->use_empty()) {
- if (OldCI->getType() != NewCI->getType()) {
- Function *OldFn = OldCI->getCalledFunction();
- CastInst *RetCast =
- CastInst::Create(CastInst::getCastOpcode(NewCI, true,
- OldFn->getReturnType(), true),
- NewCI, OldFn->getReturnType(), NewCI->getName(),OldCI);
-
- // Replace all uses of the old call with the new cast which has the
- // correct type.
- OldCI->replaceAllUsesWith(RetCast);
- } else {
- OldCI->replaceAllUsesWith(NewCI);
- }
- }
-
- // Clean up the old call now that it has been completely upgraded.
- OldCI->eraseFromParent();
-}
-
// UpgradeIntrinsicCall - Upgrade a call to an old intrinsic to be a call the
// upgraded intrinsic. All argument and return casting must be provided in
// order to seamlessly integrate with existing context.
@@ -711,284 +135,9 @@ void llvm::UpgradeIntrinsicCall(CallInst *CI, Function *NewFn) {
assert(F && "CallInst has no function associated with it.");
if (!NewFn) {
- // Get the Function's name.
- const std::string& Name = F->getName();
-
- // Upgrade ARM NEON intrinsics.
- if (Name.compare(5, 9, "arm.neon.", 9) == 0) {
- Instruction *NewI;
- Value *V0, *V1;
- if (Name.compare(14, 7, "vmovls.", 7) == 0) {
- NewI = new SExtInst(CI->getArgOperand(0), CI->getType(),
- "upgraded." + CI->getName(), CI);
- } else if (Name.compare(14, 7, "vmovlu.", 7) == 0) {
- NewI = new ZExtInst(CI->getArgOperand(0), CI->getType(),
- "upgraded." + CI->getName(), CI);
- } else if (Name.compare(14, 4, "vadd", 4) == 0) {
- ExtendNEONArgs(CI, CI->getArgOperand(0), CI->getArgOperand(1), V0, V1);
- NewI = BinaryOperator::CreateAdd(V0, V1, "upgraded."+CI->getName(), CI);
- } else if (Name.compare(14, 4, "vsub", 4) == 0) {
- ExtendNEONArgs(CI, CI->getArgOperand(0), CI->getArgOperand(1), V0, V1);
- NewI = BinaryOperator::CreateSub(V0, V1,"upgraded."+CI->getName(),CI);
- } else if (Name.compare(14, 4, "vmul", 4) == 0) {
- ExtendNEONArgs(CI, CI->getArgOperand(0), CI->getArgOperand(1), V0, V1);
- NewI = BinaryOperator::CreateMul(V0, V1,"upgraded."+CI->getName(),CI);
- } else if (Name.compare(14, 4, "vmla", 4) == 0) {
- ExtendNEONArgs(CI, CI->getArgOperand(1), CI->getArgOperand(2), V0, V1);
- Instruction *MulI = BinaryOperator::CreateMul(V0, V1, "", CI);
- NewI = BinaryOperator::CreateAdd(CI->getArgOperand(0), MulI,
- "upgraded."+CI->getName(), CI);
- } else if (Name.compare(14, 4, "vmls", 4) == 0) {
- ExtendNEONArgs(CI, CI->getArgOperand(1), CI->getArgOperand(2), V0, V1);
- Instruction *MulI = BinaryOperator::CreateMul(V0, V1, "", CI);
- NewI = BinaryOperator::CreateSub(CI->getArgOperand(0), MulI,
- "upgraded."+CI->getName(), CI);
- } else if (Name.compare(14, 4, "vabd", 4) == 0) {
- NewI = CallVABD(CI, CI->getArgOperand(0), CI->getArgOperand(1));
- NewI = new ZExtInst(NewI, CI->getType(), "upgraded."+CI->getName(), CI);
- } else if (Name.compare(14, 4, "vaba", 4) == 0) {
- NewI = CallVABD(CI, CI->getArgOperand(1), CI->getArgOperand(2));
- if (Name.at(18) == 'l')
- NewI = new ZExtInst(NewI, CI->getType(), "", CI);
- NewI = BinaryOperator::CreateAdd(CI->getArgOperand(0), NewI,
- "upgraded."+CI->getName(), CI);
- } else if (Name.compare(14, 6, "vmovn.", 6) == 0) {
- NewI = new TruncInst(CI->getArgOperand(0), CI->getType(),
- "upgraded." + CI->getName(), CI);
- } else {
- llvm_unreachable("Unknown arm.neon function for CallInst upgrade.");
- }
- // Replace any uses of the old CallInst.
- if (!CI->use_empty())
- CI->replaceAllUsesWith(NewI);
- CI->eraseFromParent();
- return;
- }
-
- bool isLoadH = false, isLoadL = false, isMovL = false;
- bool isMovSD = false, isShufPD = false;
- bool isUnpckhPD = false, isUnpcklPD = false;
- bool isPunpckhQPD = false, isPunpcklQPD = false;
- if (F->getName() == "llvm.x86.sse2.loadh.pd")
- isLoadH = true;
- else if (F->getName() == "llvm.x86.sse2.loadl.pd")
- isLoadL = true;
- else if (F->getName() == "llvm.x86.sse2.movl.dq")
- isMovL = true;
- else if (F->getName() == "llvm.x86.sse2.movs.d")
- isMovSD = true;
- else if (F->getName() == "llvm.x86.sse2.shuf.pd")
- isShufPD = true;
- else if (F->getName() == "llvm.x86.sse2.unpckh.pd")
- isUnpckhPD = true;
- else if (F->getName() == "llvm.x86.sse2.unpckl.pd")
- isUnpcklPD = true;
- else if (F->getName() == "llvm.x86.sse2.punpckh.qdq")
- isPunpckhQPD = true;
- else if (F->getName() == "llvm.x86.sse2.punpckl.qdq")
- isPunpcklQPD = true;
-
- if (isLoadH || isLoadL || isMovL || isMovSD || isShufPD ||
- isUnpckhPD || isUnpcklPD || isPunpckhQPD || isPunpcklQPD) {
- std::vector<Constant*> Idxs;
- Value *Op0 = CI->getArgOperand(0);
- ShuffleVectorInst *SI = NULL;
- if (isLoadH || isLoadL) {
- Value *Op1 = UndefValue::get(Op0->getType());
- Value *Addr = new BitCastInst(CI->getArgOperand(1),
- Type::getDoublePtrTy(C),
- "upgraded.", CI);
- Value *Load = new LoadInst(Addr, "upgraded.", false, 8, CI);
- Value *Idx = ConstantInt::get(Type::getInt32Ty(C), 0);
- Op1 = InsertElementInst::Create(Op1, Load, Idx, "upgraded.", CI);
-
- if (isLoadH) {
- Idxs.push_back(ConstantInt::get(Type::getInt32Ty(C), 0));
- Idxs.push_back(ConstantInt::get(Type::getInt32Ty(C), 2));
- } else {
- Idxs.push_back(ConstantInt::get(Type::getInt32Ty(C), 2));
- Idxs.push_back(ConstantInt::get(Type::getInt32Ty(C), 1));
- }
- Value *Mask = ConstantVector::get(Idxs);
- SI = new ShuffleVectorInst(Op0, Op1, Mask, "upgraded.", CI);
- } else if (isMovL) {
- Constant *Zero = ConstantInt::get(Type::getInt32Ty(C), 0);
- Idxs.push_back(Zero);
- Idxs.push_back(Zero);
- Idxs.push_back(Zero);
- Idxs.push_back(Zero);
- Value *ZeroV = ConstantVector::get(Idxs);
-
- Idxs.clear();
- Idxs.push_back(ConstantInt::get(Type::getInt32Ty(C), 4));
- Idxs.push_back(ConstantInt::get(Type::getInt32Ty(C), 5));
- Idxs.push_back(ConstantInt::get(Type::getInt32Ty(C), 2));
- Idxs.push_back(ConstantInt::get(Type::getInt32Ty(C), 3));
- Value *Mask = ConstantVector::get(Idxs);
- SI = new ShuffleVectorInst(ZeroV, Op0, Mask, "upgraded.", CI);
- } else if (isMovSD ||
- isUnpckhPD || isUnpcklPD || isPunpckhQPD || isPunpcklQPD) {
- Value *Op1 = CI->getArgOperand(1);
- if (isMovSD) {
- Idxs.push_back(ConstantInt::get(Type::getInt32Ty(C), 2));
- Idxs.push_back(ConstantInt::get(Type::getInt32Ty(C), 1));
- } else if (isUnpckhPD || isPunpckhQPD) {
- Idxs.push_back(ConstantInt::get(Type::getInt32Ty(C), 1));
- Idxs.push_back(ConstantInt::get(Type::getInt32Ty(C), 3));
- } else {
- Idxs.push_back(ConstantInt::get(Type::getInt32Ty(C), 0));
- Idxs.push_back(ConstantInt::get(Type::getInt32Ty(C), 2));
- }
- Value *Mask = ConstantVector::get(Idxs);
- SI = new ShuffleVectorInst(Op0, Op1, Mask, "upgraded.", CI);
- } else if (isShufPD) {
- Value *Op1 = CI->getArgOperand(1);
- unsigned MaskVal =
- cast<ConstantInt>(CI->getArgOperand(2))->getZExtValue();
- Idxs.push_back(ConstantInt::get(Type::getInt32Ty(C), MaskVal & 1));
- Idxs.push_back(ConstantInt::get(Type::getInt32Ty(C),
- ((MaskVal >> 1) & 1)+2));
- Value *Mask = ConstantVector::get(Idxs);
- SI = new ShuffleVectorInst(Op0, Op1, Mask, "upgraded.", CI);
- }
-
- assert(SI && "Unexpected!");
-
- // Handle any uses of the old CallInst.
- if (!CI->use_empty())
- // Replace all uses of the old call with the new cast which has the
- // correct type.
- CI->replaceAllUsesWith(SI);
-
- // Clean up the old call now that it has been completely upgraded.
- CI->eraseFromParent();
- } else if (F->getName() == "llvm.x86.sse41.pmulld") {
- // Upgrade this set of intrinsics into vector multiplies.
- Instruction *Mul = BinaryOperator::CreateMul(CI->getArgOperand(0),
- CI->getArgOperand(1),
- CI->getName(),
- CI);
- // Fix up all the uses with our new multiply.
- if (!CI->use_empty())
- CI->replaceAllUsesWith(Mul);
-
- // Remove upgraded multiply.
- CI->eraseFromParent();
- } else if (F->getName() == "llvm.x86.ssse3.palign.r") {
- Value *Op1 = CI->getArgOperand(0);
- Value *Op2 = CI->getArgOperand(1);
- Value *Op3 = CI->getArgOperand(2);
- unsigned shiftVal = cast<ConstantInt>(Op3)->getZExtValue();
- Value *Rep;
- IRBuilder<> Builder(C);
- Builder.SetInsertPoint(CI->getParent(), CI);
-
- // If palignr is shifting the pair of input vectors less than 9 bytes,
- // emit a shuffle instruction.
- if (shiftVal <= 8) {
- const Type *IntTy = Type::getInt32Ty(C);
- const Type *EltTy = Type::getInt8Ty(C);
- const Type *VecTy = VectorType::get(EltTy, 8);
-
- Op2 = Builder.CreateBitCast(Op2, VecTy);
- Op1 = Builder.CreateBitCast(Op1, VecTy);
-
- llvm::SmallVector<llvm::Constant*, 8> Indices;
- for (unsigned i = 0; i != 8; ++i)
- Indices.push_back(ConstantInt::get(IntTy, shiftVal + i));
-
- Value *SV = ConstantVector::get(Indices);
- Rep = Builder.CreateShuffleVector(Op2, Op1, SV, "palignr");
- Rep = Builder.CreateBitCast(Rep, F->getReturnType());
- }
-
- // If palignr is shifting the pair of input vectors more than 8 but less
- // than 16 bytes, emit a logical right shift of the destination.
- else if (shiftVal < 16) {
- // MMX has these as 1 x i64 vectors for some odd optimization reasons.
- const Type *EltTy = Type::getInt64Ty(C);
- const Type *VecTy = VectorType::get(EltTy, 1);
-
- Op1 = Builder.CreateBitCast(Op1, VecTy, "cast");
- Op2 = ConstantInt::get(VecTy, (shiftVal-8) * 8);
-
- // create i32 constant
- Function *I =
- Intrinsic::getDeclaration(F->getParent(), Intrinsic::x86_mmx_psrl_q);
- Rep = Builder.CreateCall2(I, Op1, Op2, "palignr");
- }
-
- // If palignr is shifting the pair of vectors more than 32 bytes, emit zero.
- else {
- Rep = Constant::getNullValue(F->getReturnType());
- }
-
- // Replace any uses with our new instruction.
- if (!CI->use_empty())
- CI->replaceAllUsesWith(Rep);
-
- // Remove upgraded instruction.
- CI->eraseFromParent();
-
- } else if (F->getName() == "llvm.x86.ssse3.palign.r.128") {
- Value *Op1 = CI->getArgOperand(0);
- Value *Op2 = CI->getArgOperand(1);
- Value *Op3 = CI->getArgOperand(2);
- unsigned shiftVal = cast<ConstantInt>(Op3)->getZExtValue();
- Value *Rep;
- IRBuilder<> Builder(C);
- Builder.SetInsertPoint(CI->getParent(), CI);
-
- // If palignr is shifting the pair of input vectors less than 17 bytes,
- // emit a shuffle instruction.
- if (shiftVal <= 16) {
- const Type *IntTy = Type::getInt32Ty(C);
- const Type *EltTy = Type::getInt8Ty(C);
- const Type *VecTy = VectorType::get(EltTy, 16);
-
- Op2 = Builder.CreateBitCast(Op2, VecTy);
- Op1 = Builder.CreateBitCast(Op1, VecTy);
-
- llvm::SmallVector<llvm::Constant*, 16> Indices;
- for (unsigned i = 0; i != 16; ++i)
- Indices.push_back(ConstantInt::get(IntTy, shiftVal + i));
-
- Value *SV = ConstantVector::get(Indices);
- Rep = Builder.CreateShuffleVector(Op2, Op1, SV, "palignr");
- Rep = Builder.CreateBitCast(Rep, F->getReturnType());
- }
-
- // If palignr is shifting the pair of input vectors more than 16 but less
- // than 32 bytes, emit a logical right shift of the destination.
- else if (shiftVal < 32) {
- const Type *EltTy = Type::getInt64Ty(C);
- const Type *VecTy = VectorType::get(EltTy, 2);
- const Type *IntTy = Type::getInt32Ty(C);
-
- Op1 = Builder.CreateBitCast(Op1, VecTy, "cast");
- Op2 = ConstantInt::get(IntTy, (shiftVal-16) * 8);
-
- // create i32 constant
- Function *I =
- Intrinsic::getDeclaration(F->getParent(), Intrinsic::x86_sse2_psrl_dq);
- Rep = Builder.CreateCall2(I, Op1, Op2, "palignr");
- }
-
- // If palignr is shifting the pair of vectors more than 32 bytes, emit zero.
- else {
- Rep = Constant::getNullValue(F->getReturnType());
- }
-
- // Replace any uses with our new instruction.
- if (!CI->use_empty())
- CI->replaceAllUsesWith(Rep);
-
- // Remove upgraded instruction.
- CI->eraseFromParent();
-
- } else if (F->getName() == "llvm.x86.sse.loadu.ps" ||
- F->getName() == "llvm.x86.sse2.loadu.dq" ||
- F->getName() == "llvm.x86.sse2.loadu.pd") {
+ if (F->getName() == "llvm.x86.sse.loadu.ps" ||
+ F->getName() == "llvm.x86.sse2.loadu.dq" ||
+ F->getName() == "llvm.x86.sse2.loadu.pd") {
// Convert to a native, unaligned load.
const Type *VecTy = CI->getType();
const Type *IntTy = IntegerType::get(C, 128);
@@ -1040,306 +189,25 @@ void llvm::UpgradeIntrinsicCall(CallInst *CI, Function *NewFn) {
}
switch (NewFn->getIntrinsicID()) {
- default: llvm_unreachable("Unknown function for CallInst upgrade.");
- case Intrinsic::arm_neon_vld1:
- case Intrinsic::arm_neon_vld2:
- case Intrinsic::arm_neon_vld3:
- case Intrinsic::arm_neon_vld4:
- case Intrinsic::arm_neon_vst1:
- case Intrinsic::arm_neon_vst2:
- case Intrinsic::arm_neon_vst3:
- case Intrinsic::arm_neon_vst4:
- case Intrinsic::arm_neon_vld2lane:
- case Intrinsic::arm_neon_vld3lane:
- case Intrinsic::arm_neon_vld4lane:
- case Intrinsic::arm_neon_vst2lane:
- case Intrinsic::arm_neon_vst3lane:
- case Intrinsic::arm_neon_vst4lane: {
- // Add a default alignment argument of 1.
- SmallVector<Value*, 8> Operands(CS.arg_begin(), CS.arg_end());
- Operands.push_back(ConstantInt::get(Type::getInt32Ty(C), 1));
- CallInst *NewCI = CallInst::Create(NewFn, Operands.begin(), Operands.end(),
- CI->getName(), CI);
- NewCI->setTailCall(CI->isTailCall());
- NewCI->setCallingConv(CI->getCallingConv());
-
- // Handle any uses of the old CallInst.
- if (!CI->use_empty())
- // Replace all uses of the old call with the new cast which has the
- // correct type.
- CI->replaceAllUsesWith(NewCI);
-
- // Clean up the old call now that it has been completely upgraded.
- CI->eraseFromParent();
- break;
- }
-
- case Intrinsic::x86_mmx_padd_b:
- case Intrinsic::x86_mmx_padd_w:
- case Intrinsic::x86_mmx_padd_d:
- case Intrinsic::x86_mmx_padd_q:
- case Intrinsic::x86_mmx_padds_b:
- case Intrinsic::x86_mmx_padds_w:
- case Intrinsic::x86_mmx_paddus_b:
- case Intrinsic::x86_mmx_paddus_w:
- case Intrinsic::x86_mmx_psub_b:
- case Intrinsic::x86_mmx_psub_w:
- case Intrinsic::x86_mmx_psub_d:
- case Intrinsic::x86_mmx_psub_q:
- case Intrinsic::x86_mmx_psubs_b:
- case Intrinsic::x86_mmx_psubs_w:
- case Intrinsic::x86_mmx_psubus_b:
- case Intrinsic::x86_mmx_psubus_w:
- case Intrinsic::x86_mmx_pmulh_w:
- case Intrinsic::x86_mmx_pmull_w:
- case Intrinsic::x86_mmx_pmulhu_w:
- case Intrinsic::x86_mmx_pmulu_dq:
- case Intrinsic::x86_mmx_pmadd_wd:
- case Intrinsic::x86_mmx_pand:
- case Intrinsic::x86_mmx_pandn:
- case Intrinsic::x86_mmx_por:
- case Intrinsic::x86_mmx_pxor:
- case Intrinsic::x86_mmx_pavg_b:
- case Intrinsic::x86_mmx_pavg_w:
- case Intrinsic::x86_mmx_pmaxu_b:
- case Intrinsic::x86_mmx_pmaxs_w:
- case Intrinsic::x86_mmx_pminu_b:
- case Intrinsic::x86_mmx_pmins_w:
- case Intrinsic::x86_mmx_psad_bw:
- case Intrinsic::x86_mmx_psll_w:
- case Intrinsic::x86_mmx_psll_d:
- case Intrinsic::x86_mmx_psll_q:
- case Intrinsic::x86_mmx_pslli_w:
- case Intrinsic::x86_mmx_pslli_d:
- case Intrinsic::x86_mmx_pslli_q:
- case Intrinsic::x86_mmx_psrl_w:
- case Intrinsic::x86_mmx_psrl_d:
- case Intrinsic::x86_mmx_psrl_q:
- case Intrinsic::x86_mmx_psrli_w:
- case Intrinsic::x86_mmx_psrli_d:
- case Intrinsic::x86_mmx_psrli_q:
- case Intrinsic::x86_mmx_psra_w:
- case Intrinsic::x86_mmx_psra_d:
- case Intrinsic::x86_mmx_psrai_w:
- case Intrinsic::x86_mmx_psrai_d:
- case Intrinsic::x86_mmx_packsswb:
- case Intrinsic::x86_mmx_packssdw:
- case Intrinsic::x86_mmx_packuswb:
- case Intrinsic::x86_mmx_punpckhbw:
- case Intrinsic::x86_mmx_punpckhwd:
- case Intrinsic::x86_mmx_punpckhdq:
- case Intrinsic::x86_mmx_punpcklbw:
- case Intrinsic::x86_mmx_punpcklwd:
- case Intrinsic::x86_mmx_punpckldq:
- case Intrinsic::x86_mmx_pcmpeq_b:
- case Intrinsic::x86_mmx_pcmpeq_w:
- case Intrinsic::x86_mmx_pcmpeq_d:
- case Intrinsic::x86_mmx_pcmpgt_b:
- case Intrinsic::x86_mmx_pcmpgt_w:
- case Intrinsic::x86_mmx_pcmpgt_d: {
- Value *Operands[2];
-
- // Cast the operand to the X86 MMX type.
- Operands[0] = new BitCastInst(CI->getArgOperand(0),
- NewFn->getFunctionType()->getParamType(0),
- "upgraded.", CI);
-
- switch (NewFn->getIntrinsicID()) {
- default:
- // Cast to the X86 MMX type.
- Operands[1] = new BitCastInst(CI->getArgOperand(1),
- NewFn->getFunctionType()->getParamType(1),
- "upgraded.", CI);
- break;
- case Intrinsic::x86_mmx_pslli_w:
- case Intrinsic::x86_mmx_pslli_d:
- case Intrinsic::x86_mmx_pslli_q:
- case Intrinsic::x86_mmx_psrli_w:
- case Intrinsic::x86_mmx_psrli_d:
- case Intrinsic::x86_mmx_psrli_q:
- case Intrinsic::x86_mmx_psrai_w:
- case Intrinsic::x86_mmx_psrai_d:
- // These take an i32 as their second parameter.
- Operands[1] = CI->getArgOperand(1);
- break;
- }
-
- ConstructNewCallInst(NewFn, CI, Operands, 2);
- break;
- }
- case Intrinsic::x86_mmx_maskmovq: {
- Value *Operands[3];
-
- // Cast the operands to the X86 MMX type.
- Operands[0] = new BitCastInst(CI->getArgOperand(0),
- NewFn->getFunctionType()->getParamType(0),
- "upgraded.", CI);
- Operands[1] = new BitCastInst(CI->getArgOperand(1),
- NewFn->getFunctionType()->getParamType(1),
- "upgraded.", CI);
- Operands[2] = CI->getArgOperand(2);
-
- ConstructNewCallInst(NewFn, CI, Operands, 3, false);
- break;
- }
- case Intrinsic::x86_mmx_pmovmskb: {
- Value *Operands[1];
-
- // Cast the operand to the X86 MMX type.
- Operands[0] = new BitCastInst(CI->getArgOperand(0),
- NewFn->getFunctionType()->getParamType(0),
- "upgraded.", CI);
-
- ConstructNewCallInst(NewFn, CI, Operands, 1);
- break;
- }
- case Intrinsic::x86_mmx_movnt_dq: {
- Value *Operands[2];
-
- Operands[0] = CI->getArgOperand(0);
-
- // Cast the operand to the X86 MMX type.
- Operands[1] = new BitCastInst(CI->getArgOperand(1),
- NewFn->getFunctionType()->getParamType(1),
- "upgraded.", CI);
-
- ConstructNewCallInst(NewFn, CI, Operands, 2, false);
- break;
- }
- case Intrinsic::x86_mmx_palignr_b: {
- Value *Operands[3];
-
- // Cast the operands to the X86 MMX type.
- Operands[0] = new BitCastInst(CI->getArgOperand(0),
- NewFn->getFunctionType()->getParamType(0),
- "upgraded.", CI);
- Operands[1] = new BitCastInst(CI->getArgOperand(1),
- NewFn->getFunctionType()->getParamType(1),
- "upgraded.", CI);
- Operands[2] = CI->getArgOperand(2);
-
- ConstructNewCallInst(NewFn, CI, Operands, 3);
- break;
- }
- case Intrinsic::x86_mmx_pextr_w: {
- Value *Operands[2];
-
- // Cast the operands to the X86 MMX type.
- Operands[0] = new BitCastInst(CI->getArgOperand(0),
- NewFn->getFunctionType()->getParamType(0),
- "upgraded.", CI);
- Operands[1] = CI->getArgOperand(1);
-
- ConstructNewCallInst(NewFn, CI, Operands, 2);
- break;
- }
- case Intrinsic::x86_mmx_pinsr_w: {
- Value *Operands[3];
-
- // Cast the operands to the X86 MMX type.
- Operands[0] = new BitCastInst(CI->getArgOperand(0),
- NewFn->getFunctionType()->getParamType(0),
- "upgraded.", CI);
- Operands[1] = CI->getArgOperand(1);
- Operands[2] = CI->getArgOperand(2);
-
- ConstructNewCallInst(NewFn, CI, Operands, 3);
- break;
- }
- case Intrinsic::x86_sse_pshuf_w: {
+ case Intrinsic::prefetch: {
IRBuilder<> Builder(C);
Builder.SetInsertPoint(CI->getParent(), CI);
+ const llvm::Type *I32Ty = llvm::Type::getInt32Ty(CI->getContext());
- // Cast the operand to the X86 MMX type.
- Value *Operands[2];
- Operands[0] =
- Builder.CreateBitCast(CI->getArgOperand(0),
- NewFn->getFunctionType()->getParamType(0),
- "upgraded.");
- Operands[1] =
- Builder.CreateTrunc(CI->getArgOperand(1),
- Type::getInt8Ty(C),
- "upgraded.");
-
- ConstructNewCallInst(NewFn, CI, Operands, 2);
- break;
- }
-
- case Intrinsic::ctlz:
- case Intrinsic::ctpop:
- case Intrinsic::cttz: {
- // Build a small vector of the original arguments.
- SmallVector<Value*, 8> Operands(CS.arg_begin(), CS.arg_end());
-
- // Construct a new CallInst
- CallInst *NewCI = CallInst::Create(NewFn, Operands.begin(), Operands.end(),
- "upgraded."+CI->getName(), CI);
- NewCI->setTailCall(CI->isTailCall());
- NewCI->setCallingConv(CI->getCallingConv());
-
- // Handle any uses of the old CallInst.
- if (!CI->use_empty()) {
- // Check for sign extend parameter attributes on the return values.
- bool SrcSExt = NewFn->getAttributes().paramHasAttr(0, Attribute::SExt);
- bool DestSExt = F->getAttributes().paramHasAttr(0, Attribute::SExt);
-
- // Construct an appropriate cast from the new return type to the old.
- CastInst *RetCast = CastInst::Create(
- CastInst::getCastOpcode(NewCI, SrcSExt,
- F->getReturnType(),
- DestSExt),
- NewCI, F->getReturnType(),
- NewCI->getName(), CI);
- NewCI->moveBefore(RetCast);
-
- // Replace all uses of the old call with the new cast which has the
- // correct type.
- CI->replaceAllUsesWith(RetCast);
- }
-
- // Clean up the old call now that it has been completely upgraded.
- CI->eraseFromParent();
- }
- break;
- case Intrinsic::eh_selector:
- case Intrinsic::eh_typeid_for: {
- // Only the return type changed.
- SmallVector<Value*, 8> Operands(CS.arg_begin(), CS.arg_end());
- CallInst *NewCI = CallInst::Create(NewFn, Operands.begin(), Operands.end(),
- "upgraded." + CI->getName(), CI);
- NewCI->setTailCall(CI->isTailCall());
- NewCI->setCallingConv(CI->getCallingConv());
-
- // Handle any uses of the old CallInst.
- if (!CI->use_empty()) {
- // Construct an appropriate cast from the new return type to the old.
- CastInst *RetCast =
- CastInst::Create(CastInst::getCastOpcode(NewCI, true,
- F->getReturnType(), true),
- NewCI, F->getReturnType(), NewCI->getName(), CI);
- CI->replaceAllUsesWith(RetCast);
- }
- CI->eraseFromParent();
- }
- break;
- case Intrinsic::memcpy:
- case Intrinsic::memmove:
- case Intrinsic::memset: {
- // Add isVolatile
- const llvm::Type *I1Ty = llvm::Type::getInt1Ty(CI->getContext());
- Value *Operands[5] = { CI->getArgOperand(0), CI->getArgOperand(1),
- CI->getArgOperand(2), CI->getArgOperand(3),
- llvm::ConstantInt::get(I1Ty, 0) };
- CallInst *NewCI = CallInst::Create(NewFn, Operands, Operands+5,
+ // Add the extra "data cache" argument
+ Value *Operands[4] = { CI->getArgOperand(0), CI->getArgOperand(1),
+ CI->getArgOperand(2),
+ llvm::ConstantInt::get(I32Ty, 1) };
+ CallInst *NewCI = CallInst::Create(NewFn, Operands,
CI->getName(), CI);
NewCI->setTailCall(CI->isTailCall());
NewCI->setCallingConv(CI->getCallingConv());
// Handle any uses of the old CallInst.
if (!CI->use_empty())
- // Replace all uses of the old call with the new cast which has the
+ // Replace all uses of the old call with the new cast which has the
// correct type.
CI->replaceAllUsesWith(NewCI);
-
+
// Clean up the old call now that it has been completely upgraded.
CI->eraseFromParent();
break;
@@ -1354,13 +222,13 @@ void llvm::UpgradeCallsToIntrinsic(Function* F) {
assert(F && "Illegal attempt to upgrade a non-existent intrinsic.");
// Upgrade the function and check if it is a totaly new function.
- Function* NewFn;
+ Function *NewFn;
if (UpgradeIntrinsicFunction(F, NewFn)) {
if (NewFn != F) {
// Replace all uses to the old function with the new one if necessary.
for (Value::use_iterator UI = F->use_begin(), UE = F->use_end();
UI != UE; ) {
- if (CallInst* CI = dyn_cast<CallInst>(*UI++))
+ if (CallInst *CI = dyn_cast<CallInst>(*UI++))
UpgradeIntrinsicCall(CI, NewFn);
}
// Remove old function, no longer used, from the module.
@@ -1373,37 +241,27 @@ void llvm::UpgradeCallsToIntrinsic(Function* F) {
/// If an llvm.dbg.declare intrinsic is invalid, then this function simply
/// strips that use.
void llvm::CheckDebugInfoIntrinsics(Module *M) {
-
-
if (Function *FuncStart = M->getFunction("llvm.dbg.func.start")) {
- while (!FuncStart->use_empty()) {
- CallInst *CI = cast<CallInst>(FuncStart->use_back());
- CI->eraseFromParent();
- }
+ while (!FuncStart->use_empty())
+ cast<CallInst>(FuncStart->use_back())->eraseFromParent();
FuncStart->eraseFromParent();
}
if (Function *StopPoint = M->getFunction("llvm.dbg.stoppoint")) {
- while (!StopPoint->use_empty()) {
- CallInst *CI = cast<CallInst>(StopPoint->use_back());
- CI->eraseFromParent();
- }
+ while (!StopPoint->use_empty())
+ cast<CallInst>(StopPoint->use_back())->eraseFromParent();
StopPoint->eraseFromParent();
}
if (Function *RegionStart = M->getFunction("llvm.dbg.region.start")) {
- while (!RegionStart->use_empty()) {
- CallInst *CI = cast<CallInst>(RegionStart->use_back());
- CI->eraseFromParent();
- }
+ while (!RegionStart->use_empty())
+ cast<CallInst>(RegionStart->use_back())->eraseFromParent();
RegionStart->eraseFromParent();
}
if (Function *RegionEnd = M->getFunction("llvm.dbg.region.end")) {
- while (!RegionEnd->use_empty()) {
- CallInst *CI = cast<CallInst>(RegionEnd->use_back());
- CI->eraseFromParent();
- }
+ while (!RegionEnd->use_empty())
+ cast<CallInst>(RegionEnd->use_back())->eraseFromParent();
RegionEnd->eraseFromParent();
}
diff --git a/contrib/llvm/lib/VMCore/BasicBlock.cpp b/contrib/llvm/lib/VMCore/BasicBlock.cpp
index 955a028..70265c8 100644
--- a/contrib/llvm/lib/VMCore/BasicBlock.cpp
+++ b/contrib/llvm/lib/VMCore/BasicBlock.cpp
@@ -147,6 +147,26 @@ Instruction* BasicBlock::getFirstNonPHIOrDbg() {
return &*i;
}
+Instruction* BasicBlock::getFirstNonPHIOrDbgOrLifetime() {
+ // All valid basic blocks should have a terminator,
+ // which is not a PHINode. If we have an invalid basic
+ // block we'll get an assertion failure when dereferencing
+ // a past-the-end iterator.
+ BasicBlock::iterator i = begin();
+ for (;; ++i) {
+ if (isa<PHINode>(i) || isa<DbgInfoIntrinsic>(i))
+ continue;
+
+ const IntrinsicInst *II = dyn_cast<IntrinsicInst>(i);
+ if (!II)
+ break;
+ if (II->getIntrinsicID() != Intrinsic::lifetime_start &&
+ II->getIntrinsicID() != Intrinsic::lifetime_end)
+ break;
+ }
+ return &*i;
+}
+
void BasicBlock::dropAllReferences() {
for(iterator I = begin(), E = end(); I != E; ++I)
I->dropAllReferences();
@@ -227,8 +247,8 @@ void BasicBlock::removePredecessor(BasicBlock *Pred,
// If the PHI _HAD_ two uses, replace PHI node with its now *single* value
if (max_idx == 2) {
- if (PN->getOperand(0) != PN)
- PN->replaceAllUsesWith(PN->getOperand(0));
+ if (PN->getIncomingValue(0) != PN)
+ PN->replaceAllUsesWith(PN->getIncomingValue(0));
else
// We are left with an infinite loop with no entries: kill the PHI.
PN->replaceAllUsesWith(UndefValue::get(PN->getType()));
@@ -308,3 +328,19 @@ BasicBlock *BasicBlock::splitBasicBlock(iterator I, const Twine &BBName) {
return New;
}
+void BasicBlock::replaceSuccessorsPhiUsesWith(BasicBlock *New) {
+ TerminatorInst *TI = getTerminator();
+ if (!TI)
+ // Cope with being called on a BasicBlock that doesn't have a terminator
+ // yet. Clang's CodeGenFunction::EmitReturnBlock() likes to do this.
+ return;
+ for (unsigned i = 0, e = TI->getNumSuccessors(); i != e; ++i) {
+ BasicBlock *Succ = TI->getSuccessor(i);
+ for (iterator II = Succ->begin(); PHINode *PN = dyn_cast<PHINode>(II);
+ ++II) {
+ int i;
+ while ((i = PN->getBasicBlockIndex(this)) >= 0)
+ PN->setIncomingBlock(i, New);
+ }
+ }
+}
diff --git a/contrib/llvm/lib/VMCore/ConstantFold.cpp b/contrib/llvm/lib/VMCore/ConstantFold.cpp
index 9985ada..323e2a2 100644
--- a/contrib/llvm/lib/VMCore/ConstantFold.cpp
+++ b/contrib/llvm/lib/VMCore/ConstantFold.cpp
@@ -559,7 +559,7 @@ Constant *llvm::ConstantFoldCastInstruction(unsigned opc, Constant *V,
for (unsigned i = 0, e = CV->getType()->getNumElements(); i != e; ++i)
res.push_back(ConstantExpr::getCast(opc,
CV->getOperand(i), DstEltTy));
- return ConstantVector::get(DestVecTy, res);
+ return ConstantVector::get(res);
}
// We actually have to do a cast now. Perform the cast according to the
@@ -730,9 +730,12 @@ Constant *llvm::ConstantFoldSelectInstruction(Constant *Cond,
}
+ if (isa<UndefValue>(Cond)) {
+ if (isa<UndefValue>(V1)) return V1;
+ return V2;
+ }
if (isa<UndefValue>(V1)) return V2;
if (isa<UndefValue>(V2)) return V1;
- if (isa<UndefValue>(Cond)) return V1;
if (V1 == V2) return V1;
if (ConstantExpr *TrueVal = dyn_cast<ConstantExpr>(V1)) {
@@ -877,42 +880,38 @@ Constant *llvm::ConstantFoldShuffleVectorInstruction(Constant *V1,
}
Constant *llvm::ConstantFoldExtractValueInstruction(Constant *Agg,
- const unsigned *Idxs,
- unsigned NumIdx) {
+ ArrayRef<unsigned> Idxs) {
// Base case: no indices, so return the entire value.
- if (NumIdx == 0)
+ if (Idxs.empty())
return Agg;
if (isa<UndefValue>(Agg)) // ev(undef, x) -> undef
return UndefValue::get(ExtractValueInst::getIndexedType(Agg->getType(),
- Idxs,
- Idxs + NumIdx));
+ Idxs));
if (isa<ConstantAggregateZero>(Agg)) // ev(0, x) -> 0
return
Constant::getNullValue(ExtractValueInst::getIndexedType(Agg->getType(),
- Idxs,
- Idxs + NumIdx));
+ Idxs));
// Otherwise recurse.
if (ConstantStruct *CS = dyn_cast<ConstantStruct>(Agg))
- return ConstantFoldExtractValueInstruction(CS->getOperand(*Idxs),
- Idxs+1, NumIdx-1);
+ return ConstantFoldExtractValueInstruction(CS->getOperand(Idxs[0]),
+ Idxs.slice(1));
if (ConstantArray *CA = dyn_cast<ConstantArray>(Agg))
- return ConstantFoldExtractValueInstruction(CA->getOperand(*Idxs),
- Idxs+1, NumIdx-1);
+ return ConstantFoldExtractValueInstruction(CA->getOperand(Idxs[0]),
+ Idxs.slice(1));
ConstantVector *CV = cast<ConstantVector>(Agg);
- return ConstantFoldExtractValueInstruction(CV->getOperand(*Idxs),
- Idxs+1, NumIdx-1);
+ return ConstantFoldExtractValueInstruction(CV->getOperand(Idxs[0]),
+ Idxs.slice(1));
}
Constant *llvm::ConstantFoldInsertValueInstruction(Constant *Agg,
Constant *Val,
- const unsigned *Idxs,
- unsigned NumIdx) {
+ ArrayRef<unsigned> Idxs) {
// Base case: no indices, so replace the entire value.
- if (NumIdx == 0)
+ if (Idxs.empty())
return Val;
if (isa<UndefValue>(Agg)) {
@@ -934,15 +933,15 @@ Constant *llvm::ConstantFoldInsertValueInstruction(Constant *Agg,
for (unsigned i = 0; i < numOps; ++i) {
const Type *MemberTy = AggTy->getTypeAtIndex(i);
Constant *Op =
- (*Idxs == i) ?
+ (Idxs[0] == i) ?
ConstantFoldInsertValueInstruction(UndefValue::get(MemberTy),
- Val, Idxs+1, NumIdx-1) :
+ Val, Idxs.slice(1)) :
UndefValue::get(MemberTy);
Ops[i] = Op;
}
if (const StructType* ST = dyn_cast<StructType>(AggTy))
- return ConstantStruct::get(ST->getContext(), Ops, ST->isPacked());
+ return ConstantStruct::get(ST, Ops);
return ConstantArray::get(cast<ArrayType>(AggTy), Ops);
}
@@ -965,15 +964,15 @@ Constant *llvm::ConstantFoldInsertValueInstruction(Constant *Agg,
for (unsigned i = 0; i < numOps; ++i) {
const Type *MemberTy = AggTy->getTypeAtIndex(i);
Constant *Op =
- (*Idxs == i) ?
+ (Idxs[0] == i) ?
ConstantFoldInsertValueInstruction(Constant::getNullValue(MemberTy),
- Val, Idxs+1, NumIdx-1) :
+ Val, Idxs.slice(1)) :
Constant::getNullValue(MemberTy);
Ops[i] = Op;
}
if (const StructType *ST = dyn_cast<StructType>(AggTy))
- return ConstantStruct::get(ST->getContext(), Ops, ST->isPacked());
+ return ConstantStruct::get(ST, Ops);
return ConstantArray::get(cast<ArrayType>(AggTy), Ops);
}
@@ -982,13 +981,13 @@ Constant *llvm::ConstantFoldInsertValueInstruction(Constant *Agg,
std::vector<Constant*> Ops(Agg->getNumOperands());
for (unsigned i = 0; i < Agg->getNumOperands(); ++i) {
Constant *Op = cast<Constant>(Agg->getOperand(i));
- if (*Idxs == i)
- Op = ConstantFoldInsertValueInstruction(Op, Val, Idxs+1, NumIdx-1);
+ if (Idxs[0] == i)
+ Op = ConstantFoldInsertValueInstruction(Op, Val, Idxs.slice(1));
Ops[i] = Op;
}
if (const StructType* ST = dyn_cast<StructType>(Agg->getType()))
- return ConstantStruct::get(ST->getContext(), Ops, ST->isPacked());
+ return ConstantStruct::get(ST, Ops);
return ConstantArray::get(cast<ArrayType>(Agg->getType()), Ops);
}
@@ -1014,20 +1013,38 @@ Constant *llvm::ConstantFoldBinaryInstruction(unsigned Opcode,
case Instruction::Add:
case Instruction::Sub:
return UndefValue::get(C1->getType());
- case Instruction::Mul:
case Instruction::And:
+ if (isa<UndefValue>(C1) && isa<UndefValue>(C2)) // undef & undef -> undef
+ return C1;
+ return Constant::getNullValue(C1->getType()); // undef & X -> 0
+ case Instruction::Mul: {
+ ConstantInt *CI;
+ // X * undef -> undef if X is odd or undef
+ if (((CI = dyn_cast<ConstantInt>(C1)) && CI->getValue()[0]) ||
+ ((CI = dyn_cast<ConstantInt>(C2)) && CI->getValue()[0]) ||
+ (isa<UndefValue>(C1) && isa<UndefValue>(C2)))
+ return UndefValue::get(C1->getType());
+
+ // X * undef -> 0 otherwise
return Constant::getNullValue(C1->getType());
+ }
case Instruction::UDiv:
case Instruction::SDiv:
+ // undef / 1 -> undef
+ if (Opcode == Instruction::UDiv || Opcode == Instruction::SDiv)
+ if (ConstantInt *CI2 = dyn_cast<ConstantInt>(C2))
+ if (CI2->isOne())
+ return C1;
+ // FALL THROUGH
case Instruction::URem:
case Instruction::SRem:
if (!isa<UndefValue>(C2)) // undef / X -> 0
return Constant::getNullValue(C1->getType());
return C2; // X / undef -> undef
case Instruction::Or: // X | undef -> -1
- if (const VectorType *PTy = dyn_cast<VectorType>(C1->getType()))
- return Constant::getAllOnesValue(PTy);
- return Constant::getAllOnesValue(C1->getType());
+ if (isa<UndefValue>(C1) && isa<UndefValue>(C2)) // undef | undef -> undef
+ return C1;
+ return Constant::getAllOnesValue(C1->getType()); // undef | X -> ~0
case Instruction::LShr:
if (isa<UndefValue>(C2) && isa<UndefValue>(C1))
return C1; // undef lshr undef -> undef
@@ -1041,6 +1058,8 @@ Constant *llvm::ConstantFoldBinaryInstruction(unsigned Opcode,
else
return C1; // X ashr undef --> X
case Instruction::Shl:
+ if (isa<UndefValue>(C2) && isa<UndefValue>(C1))
+ return C1; // undef shl undef -> undef
// undef << X -> 0 or X << undef -> 0
return Constant::getNullValue(C1->getType());
}
@@ -1443,8 +1462,8 @@ Constant *llvm::ConstantFoldBinaryInstruction(unsigned Opcode,
/// isZeroSizedType - This type is zero sized if its an array or structure of
/// zero sized types. The only leaf zero sized type is an empty structure.
static bool isMaybeZeroSizedType(const Type *Ty) {
- if (Ty->isOpaqueTy()) return true; // Can't say.
if (const StructType *STy = dyn_cast<StructType>(Ty)) {
+ if (STy->isOpaque()) return true; // Can't say.
// If all of elements have zero size, this does too.
for (unsigned i = 0, e = STy->getNumElements(); i != e; ++i)
@@ -1831,7 +1850,9 @@ Constant *llvm::ConstantFoldCompareInstruction(unsigned short pred,
if (isa<UndefValue>(C1) || isa<UndefValue>(C2)) {
// For EQ and NE, we can always pick a value for the undef to make the
// predicate pass or fail, so we can return undef.
- if (ICmpInst::isEquality(ICmpInst::Predicate(pred)))
+ // Also, if both operands are undef, we can return undef.
+ if (ICmpInst::isEquality(ICmpInst::Predicate(pred)) ||
+ (isa<UndefValue>(C1) && isa<UndefValue>(C2)))
return UndefValue::get(ResultTy);
// Otherwise, pick the same value as the non-undef operand, and fold
// it to true or false.
@@ -2147,9 +2168,9 @@ static Constant *ConstantFoldGetElementPtrImpl(Constant *C,
bool inBounds,
IndexTy const *Idxs,
unsigned NumIdx) {
+ if (NumIdx == 0) return C;
Constant *Idx0 = cast<Constant>(Idxs[0]);
- if (NumIdx == 0 ||
- (NumIdx == 1 && Idx0->isNullValue()))
+ if ((NumIdx == 1 && Idx0->isNullValue()))
return C;
if (isa<UndefValue>(C)) {
diff --git a/contrib/llvm/lib/VMCore/ConstantFold.h b/contrib/llvm/lib/VMCore/ConstantFold.h
index 0ecd7b4..653a1c3 100644
--- a/contrib/llvm/lib/VMCore/ConstantFold.h
+++ b/contrib/llvm/lib/VMCore/ConstantFold.h
@@ -19,6 +19,8 @@
#ifndef CONSTANTFOLDING_H
#define CONSTANTFOLDING_H
+#include "llvm/ADT/ArrayRef.h"
+
namespace llvm {
class Value;
class Constant;
@@ -38,11 +40,9 @@ namespace llvm {
Constant *ConstantFoldShuffleVectorInstruction(Constant *V1, Constant *V2,
Constant *Mask);
Constant *ConstantFoldExtractValueInstruction(Constant *Agg,
- const unsigned *Idxs,
- unsigned NumIdx);
+ ArrayRef<unsigned> Idxs);
Constant *ConstantFoldInsertValueInstruction(Constant *Agg, Constant *Val,
- const unsigned *Idxs,
- unsigned NumIdx);
+ ArrayRef<unsigned> Idxs);
Constant *ConstantFoldBinaryInstruction(unsigned Opcode, Constant *V1,
Constant *V2);
Constant *ConstantFoldCompareInstruction(unsigned short predicate,
diff --git a/contrib/llvm/lib/VMCore/Constants.cpp b/contrib/llvm/lib/VMCore/Constants.cpp
index 15d7793..316c884 100644
--- a/contrib/llvm/lib/VMCore/Constants.cpp
+++ b/contrib/llvm/lib/VMCore/Constants.cpp
@@ -31,6 +31,7 @@
#include "llvm/Support/GetElementPtrTypeIterator.h"
#include "llvm/ADT/DenseMap.h"
#include "llvm/ADT/SmallVector.h"
+#include "llvm/ADT/STLExtras.h"
#include <algorithm>
#include <cstdarg>
using namespace llvm;
@@ -39,6 +40,28 @@ using namespace llvm;
// Constant Class
//===----------------------------------------------------------------------===//
+bool Constant::isNegativeZeroValue() const {
+ // Floating point values have an explicit -0.0 value.
+ if (const ConstantFP *CFP = dyn_cast<ConstantFP>(this))
+ return CFP->isZero() && CFP->isNegative();
+
+ // Otherwise, just use +0.0.
+ return isNullValue();
+}
+
+bool Constant::isNullValue() const {
+ // 0 is null.
+ if (const ConstantInt *CI = dyn_cast<ConstantInt>(this))
+ return CI->isZero();
+
+ // +0.0 is null.
+ if (const ConstantFP *CFP = dyn_cast<ConstantFP>(this))
+ return CFP->isZero() && !CFP->isNegative();
+
+ // constant zero is zero for aggregates and cpnull is null for pointers.
+ return isa<ConstantAggregateZero>(this) || isa<ConstantPointerNull>(this);
+}
+
// Constructor to create a '0' constant of arbitrary type...
Constant *Constant::getNullValue(const Type *Ty) {
switch (Ty->getTypeID()) {
@@ -541,11 +564,7 @@ ConstantFP::ConstantFP(const Type *Ty, const APFloat& V)
"FP type Mismatch");
}
-bool ConstantFP::isNullValue() const {
- return Val.isZero() && !Val.isNegative();
-}
-
-bool ConstantFP::isExactlyValue(const APFloat& V) const {
+bool ConstantFP::isExactlyValue(const APFloat &V) const {
return Val.bitwiseIsEqual(V);
}
@@ -571,8 +590,7 @@ ConstantArray::ConstantArray(const ArrayType *T,
}
}
-Constant *ConstantArray::get(const ArrayType *Ty,
- const std::vector<Constant*> &V) {
+Constant *ConstantArray::get(const ArrayType *Ty, ArrayRef<Constant*> V) {
for (unsigned i = 0, e = V.size(); i != e; ++i) {
assert(V[i]->getType() == Ty->getElementType() &&
"Wrong type in array element initializer");
@@ -592,13 +610,6 @@ Constant *ConstantArray::get(const ArrayType *Ty,
return ConstantAggregateZero::get(Ty);
}
-
-Constant *ConstantArray::get(const ArrayType* T, Constant *const* Vals,
- unsigned NumVals) {
- // FIXME: make this the primary ctor method.
- return get(T, std::vector<Constant*>(Vals, Vals+NumVals));
-}
-
/// ConstantArray::get(const string&) - Return an array that is initialized to
/// contain the specified string. If length is zero then a null terminator is
/// added to the specified string so that it may be used in a natural way.
@@ -621,63 +632,64 @@ Constant *ConstantArray::get(LLVMContext &Context, StringRef Str,
return get(ATy, ElementVals);
}
+/// getTypeForElements - Return an anonymous struct type to use for a constant
+/// with the specified set of elements. The list must not be empty.
+StructType *ConstantStruct::getTypeForElements(LLVMContext &Context,
+ ArrayRef<Constant*> V,
+ bool Packed) {
+ SmallVector<Type*, 16> EltTypes;
+ for (unsigned i = 0, e = V.size(); i != e; ++i)
+ EltTypes.push_back(V[i]->getType());
+
+ return StructType::get(Context, EltTypes, Packed);
+}
+
+
+StructType *ConstantStruct::getTypeForElements(ArrayRef<Constant*> V,
+ bool Packed) {
+ assert(!V.empty() &&
+ "ConstantStruct::getTypeForElements cannot be called on empty list");
+ return getTypeForElements(V[0]->getContext(), V, Packed);
+}
+
+
ConstantStruct::ConstantStruct(const StructType *T,
const std::vector<Constant*> &V)
: Constant(T, ConstantStructVal,
OperandTraits<ConstantStruct>::op_end(this) - V.size(),
V.size()) {
- assert(V.size() == T->getNumElements() &&
+ assert((T->isOpaque() || V.size() == T->getNumElements()) &&
"Invalid initializer vector for constant structure");
Use *OL = OperandList;
for (std::vector<Constant*>::const_iterator I = V.begin(), E = V.end();
I != E; ++I, ++OL) {
Constant *C = *I;
- assert(C->getType() == T->getElementType(I-V.begin()) &&
+ assert((T->isOpaque() || C->getType() == T->getElementType(I-V.begin())) &&
"Initializer for struct element doesn't match struct element type!");
*OL = C;
}
}
// ConstantStruct accessors.
-Constant *ConstantStruct::get(const StructType* T,
- const std::vector<Constant*>& V) {
- LLVMContextImpl* pImpl = T->getContext().pImpl;
-
- // Create a ConstantAggregateZero value if all elements are zeros...
+Constant *ConstantStruct::get(const StructType *ST, ArrayRef<Constant*> V) {
+ // Create a ConstantAggregateZero value if all elements are zeros.
for (unsigned i = 0, e = V.size(); i != e; ++i)
if (!V[i]->isNullValue())
- return pImpl->StructConstants.getOrCreate(T, V);
-
- return ConstantAggregateZero::get(T);
-}
-
-Constant *ConstantStruct::get(LLVMContext &Context,
- const std::vector<Constant*>& V, bool packed) {
- std::vector<const Type*> StructEls;
- StructEls.reserve(V.size());
- for (unsigned i = 0, e = V.size(); i != e; ++i)
- StructEls.push_back(V[i]->getType());
- return get(StructType::get(Context, StructEls, packed), V);
-}
+ return ST->getContext().pImpl->StructConstants.getOrCreate(ST, V);
-Constant *ConstantStruct::get(LLVMContext &Context,
- Constant *const *Vals, unsigned NumVals,
- bool Packed) {
- // FIXME: make this the primary ctor method.
- return get(Context, std::vector<Constant*>(Vals, Vals+NumVals), Packed);
+ assert((ST->isOpaque() || ST->getNumElements() == V.size()) &&
+ "Incorrect # elements specified to ConstantStruct::get");
+ return ConstantAggregateZero::get(ST);
}
-Constant* ConstantStruct::get(LLVMContext &Context, bool Packed,
- Constant * Val, ...) {
+Constant* ConstantStruct::get(const StructType *T, ...) {
va_list ap;
- std::vector<Constant*> Values;
- va_start(ap, Val);
- while (Val) {
+ SmallVector<Constant*, 8> Values;
+ va_start(ap, T);
+ while (Constant *Val = va_arg(ap, llvm::Constant*))
Values.push_back(Val);
- Val = va_arg(ap, llvm::Constant*);
- }
va_end(ap);
- return get(Context, Values, Packed);
+ return get(T, Values);
}
ConstantVector::ConstantVector(const VectorType *T,
@@ -696,9 +708,9 @@ ConstantVector::ConstantVector(const VectorType *T,
}
// ConstantVector accessors.
-Constant *ConstantVector::get(const VectorType *T,
- const std::vector<Constant*> &V) {
+Constant *ConstantVector::get(ArrayRef<Constant*> V) {
assert(!V.empty() && "Vectors can't be empty");
+ const VectorType *T = VectorType::get(V.front()->getType(), V.size());
LLVMContextImpl *pImpl = T->getContext().pImpl;
// If this is an all-undef or all-zero vector, return a
@@ -723,12 +735,6 @@ Constant *ConstantVector::get(const VectorType *T,
return pImpl->VectorConstants.getOrCreate(T, V);
}
-Constant *ConstantVector::get(ArrayRef<Constant*> V) {
- // FIXME: make this the primary ctor method.
- assert(!V.empty() && "Vectors cannot be empty");
- return get(VectorType::get(V.front()->getType(), V.size()), V.vec());
-}
-
// Utility function for determining if a ConstantExpr is a CastOp or not. This
// can't be inline because we don't want to #include Instruction.h into
// Constant.h
@@ -779,8 +785,7 @@ ArrayRef<unsigned> ConstantExpr::getIndices() const {
}
unsigned ConstantExpr::getPredicate() const {
- assert(getOpcode() == Instruction::FCmp ||
- getOpcode() == Instruction::ICmp);
+ assert(isCompare());
return ((const CompareConstantExpr*)this)->predicate;
}
@@ -851,17 +856,15 @@ ConstantExpr::getWithOperandReplaced(unsigned OpNo, Constant *Op) const {
}
/// getWithOperands - This returns the current constant expression with the
-/// operands replaced with the specified values. The specified operands must
-/// match count and type with the existing ones.
+/// operands replaced with the specified values. The specified array must
+/// have the same number of operands as our current one.
Constant *ConstantExpr::
-getWithOperands(ArrayRef<Constant*> Ops) const {
+getWithOperands(ArrayRef<Constant*> Ops, const Type *Ty) const {
assert(Ops.size() == getNumOperands() && "Operand count mismatch!");
- bool AnyChange = false;
- for (unsigned i = 0; i != Ops.size(); ++i) {
- assert(Ops[i]->getType() == getOperand(i)->getType() &&
- "Operand type mismatch!");
+ bool AnyChange = Ty != getType();
+ for (unsigned i = 0; i != Ops.size(); ++i)
AnyChange |= Ops[i] != getOperand(i);
- }
+
if (!AnyChange) // No operands changed, return self.
return const_cast<ConstantExpr*>(this);
@@ -878,7 +881,7 @@ getWithOperands(ArrayRef<Constant*> Ops) const {
case Instruction::PtrToInt:
case Instruction::IntToPtr:
case Instruction::BitCast:
- return ConstantExpr::getCast(getOpcode(), Ops[0], getType());
+ return ConstantExpr::getCast(getOpcode(), Ops[0], Ty);
case Instruction::Select:
return ConstantExpr::getSelect(Ops[0], Ops[1], Ops[2]);
case Instruction::InsertElement:
@@ -976,14 +979,14 @@ ConstantAggregateZero* ConstantAggregateZero::get(const Type* Ty) {
/// destroyConstant - Remove the constant from the constant table...
///
void ConstantAggregateZero::destroyConstant() {
- getRawType()->getContext().pImpl->AggZeroConstants.remove(this);
+ getType()->getContext().pImpl->AggZeroConstants.remove(this);
destroyConstantImpl();
}
/// destroyConstant - Remove the constant from the constant table...
///
void ConstantArray::destroyConstant() {
- getRawType()->getContext().pImpl->ArrayConstants.remove(this);
+ getType()->getContext().pImpl->ArrayConstants.remove(this);
destroyConstantImpl();
}
@@ -1023,44 +1026,54 @@ bool ConstantArray::isCString() const {
}
-/// getAsString - If the sub-element type of this array is i8
-/// then this method converts the array to an std::string and returns it.
-/// Otherwise, it asserts out.
+/// convertToString - Helper function for getAsString() and getAsCString().
+static std::string convertToString(const User *U, unsigned len) {
+ std::string Result;
+ Result.reserve(len);
+ for (unsigned i = 0; i != len; ++i)
+ Result.push_back((char)cast<ConstantInt>(U->getOperand(i))->getZExtValue());
+ return Result;
+}
+
+/// getAsString - If this array is isString(), then this method converts the
+/// array to an std::string and returns it. Otherwise, it asserts out.
///
std::string ConstantArray::getAsString() const {
assert(isString() && "Not a string!");
- std::string Result;
- Result.reserve(getNumOperands());
- for (unsigned i = 0, e = getNumOperands(); i != e; ++i)
- Result.push_back((char)cast<ConstantInt>(getOperand(i))->getZExtValue());
- return Result;
+ return convertToString(this, getNumOperands());
}
-//---- ConstantStruct::get() implementation...
-//
+/// getAsCString - If this array is isCString(), then this method converts the
+/// array (without the trailing null byte) to an std::string and returns it.
+/// Otherwise, it asserts out.
+///
+std::string ConstantArray::getAsCString() const {
+ assert(isCString() && "Not a string!");
+ return convertToString(this, getNumOperands() - 1);
+}
-namespace llvm {
-}
+//---- ConstantStruct::get() implementation...
+//
// destroyConstant - Remove the constant from the constant table...
//
void ConstantStruct::destroyConstant() {
- getRawType()->getContext().pImpl->StructConstants.remove(this);
+ getType()->getContext().pImpl->StructConstants.remove(this);
destroyConstantImpl();
}
// destroyConstant - Remove the constant from the constant table...
//
void ConstantVector::destroyConstant() {
- getRawType()->getContext().pImpl->VectorConstants.remove(this);
+ getType()->getContext().pImpl->VectorConstants.remove(this);
destroyConstantImpl();
}
/// This function will return true iff every element in this vector constant
/// is set to all ones.
-/// @returns true iff this constant's emements are all set to all ones.
+/// @returns true iff this constant's elements are all set to all ones.
/// @brief Determine if the value is all ones.
bool ConstantVector::isAllOnesValue() const {
// Check out first element.
@@ -1068,9 +1081,10 @@ bool ConstantVector::isAllOnesValue() const {
const ConstantInt *CI = dyn_cast<ConstantInt>(Elt);
if (!CI || !CI->isAllOnesValue()) return false;
// Then make sure all remaining elements point to the same value.
- for (unsigned I = 1, E = getNumOperands(); I < E; ++I) {
- if (getOperand(I) != Elt) return false;
- }
+ for (unsigned I = 1, E = getNumOperands(); I < E; ++I)
+ if (getOperand(I) != Elt)
+ return false;
+
return true;
}
@@ -1081,7 +1095,8 @@ Constant *ConstantVector::getSplatValue() const {
Constant *Elt = getOperand(0);
// Then make sure all remaining elements point to the same value.
for (unsigned I = 1, E = getNumOperands(); I < E; ++I)
- if (getOperand(I) != Elt) return 0;
+ if (getOperand(I) != Elt)
+ return 0;
return Elt;
}
@@ -1095,7 +1110,7 @@ ConstantPointerNull *ConstantPointerNull::get(const PointerType *Ty) {
// destroyConstant - Remove the constant from the constant table...
//
void ConstantPointerNull::destroyConstant() {
- getRawType()->getContext().pImpl->NullPtrConstants.remove(this);
+ getType()->getContext().pImpl->NullPtrConstants.remove(this);
destroyConstantImpl();
}
@@ -1110,7 +1125,7 @@ UndefValue *UndefValue::get(const Type *Ty) {
// destroyConstant - Remove the constant from the constant table.
//
void UndefValue::destroyConstant() {
- getRawType()->getContext().pImpl->UndefValueConstants.remove(this);
+ getType()->getContext().pImpl->UndefValueConstants.remove(this);
destroyConstantImpl();
}
@@ -1144,7 +1159,7 @@ BlockAddress::BlockAddress(Function *F, BasicBlock *BB)
// destroyConstant - Remove the constant from the constant table.
//
void BlockAddress::destroyConstant() {
- getFunction()->getRawType()->getContext().pImpl
+ getFunction()->getType()->getContext().pImpl
->BlockAddresses.erase(std::make_pair(getFunction(), getBasicBlock()));
getBasicBlock()->AdjustBlockAddressRefCount(-1);
destroyConstantImpl();
@@ -1183,7 +1198,7 @@ void BlockAddress::replaceUsesOfWithOnConstant(Value *From, Value *To, Use *U) {
assert(NewBA != this && "I didn't contain From!");
// Everyone using this now uses the replacement.
- uncheckedReplaceAllUsesWith(NewBA);
+ replaceAllUsesWith(NewBA);
destroyConstant();
}
@@ -1420,49 +1435,15 @@ Constant *ConstantExpr::getBitCast(Constant *C, const Type *DstTy) {
return getFoldedCast(Instruction::BitCast, C, DstTy);
}
-Constant *ConstantExpr::getTy(const Type *ReqTy, unsigned Opcode,
- Constant *C1, Constant *C2,
- unsigned Flags) {
- // Check the operands for consistency first
+Constant *ConstantExpr::get(unsigned Opcode, Constant *C1, Constant *C2,
+ unsigned Flags) {
+ // Check the operands for consistency first.
assert(Opcode >= Instruction::BinaryOpsBegin &&
Opcode < Instruction::BinaryOpsEnd &&
"Invalid opcode in binary constant expression");
assert(C1->getType() == C2->getType() &&
"Operand types in binary constant expression should match");
-
- if (ReqTy == C1->getType() || ReqTy == Type::getInt1Ty(ReqTy->getContext()))
- if (Constant *FC = ConstantFoldBinaryInstruction(Opcode, C1, C2))
- return FC; // Fold a few common cases...
-
- std::vector<Constant*> argVec(1, C1); argVec.push_back(C2);
- ExprMapKeyType Key(Opcode, argVec, 0, Flags);
- LLVMContextImpl *pImpl = ReqTy->getContext().pImpl;
- return pImpl->ExprConstants.getOrCreate(ReqTy, Key);
-}
-
-Constant *ConstantExpr::getCompareTy(unsigned short predicate,
- Constant *C1, Constant *C2) {
- switch (predicate) {
- default: llvm_unreachable("Invalid CmpInst predicate");
- case CmpInst::FCMP_FALSE: case CmpInst::FCMP_OEQ: case CmpInst::FCMP_OGT:
- case CmpInst::FCMP_OGE: case CmpInst::FCMP_OLT: case CmpInst::FCMP_OLE:
- case CmpInst::FCMP_ONE: case CmpInst::FCMP_ORD: case CmpInst::FCMP_UNO:
- case CmpInst::FCMP_UEQ: case CmpInst::FCMP_UGT: case CmpInst::FCMP_UGE:
- case CmpInst::FCMP_ULT: case CmpInst::FCMP_ULE: case CmpInst::FCMP_UNE:
- case CmpInst::FCMP_TRUE:
- return getFCmp(predicate, C1, C2);
-
- case CmpInst::ICMP_EQ: case CmpInst::ICMP_NE: case CmpInst::ICMP_UGT:
- case CmpInst::ICMP_UGE: case CmpInst::ICMP_ULT: case CmpInst::ICMP_ULE:
- case CmpInst::ICMP_SGT: case CmpInst::ICMP_SGE: case CmpInst::ICMP_SLT:
- case CmpInst::ICMP_SLE:
- return getICmp(predicate, C1, C2);
- }
-}
-
-Constant *ConstantExpr::get(unsigned Opcode, Constant *C1, Constant *C2,
- unsigned Flags) {
#ifndef NDEBUG
switch (Opcode) {
case Instruction::Add:
@@ -1521,7 +1502,15 @@ Constant *ConstantExpr::get(unsigned Opcode, Constant *C1, Constant *C2,
}
#endif
- return getTy(C1->getType(), Opcode, C1, C2, Flags);
+ if (Constant *FC = ConstantFoldBinaryInstruction(Opcode, C1, C2))
+ return FC; // Fold a few common cases.
+
+ std::vector<Constant*> argVec(1, C1);
+ argVec.push_back(C2);
+ ExprMapKeyType Key(Opcode, argVec, 0, Flags);
+
+ LLVMContextImpl *pImpl = C1->getContext().pImpl;
+ return pImpl->ExprConstants.getOrCreate(C1->getType(), Key);
}
Constant *ConstantExpr::getSizeOf(const Type* Ty) {
@@ -1537,8 +1526,8 @@ Constant *ConstantExpr::getSizeOf(const Type* Ty) {
Constant *ConstantExpr::getAlignOf(const Type* Ty) {
// alignof is implemented as: (i64) gep ({i1,Ty}*)null, 0, 1
// Note that a non-inbounds gep is used, as null isn't within any object.
- const Type *AligningTy = StructType::get(Ty->getContext(),
- Type::getInt1Ty(Ty->getContext()), Ty, NULL);
+ const Type *AligningTy =
+ StructType::get(Type::getInt1Ty(Ty->getContext()), Ty, NULL);
Constant *NullPtr = Constant::getNullValue(AligningTy->getPointerTo());
Constant *Zero = ConstantInt::get(Type::getInt64Ty(Ty->getContext()), 0);
Constant *One = ConstantInt::get(Type::getInt32Ty(Ty->getContext()), 1);
@@ -1566,41 +1555,55 @@ Constant *ConstantExpr::getOffsetOf(const Type* Ty, Constant *FieldNo) {
Type::getInt64Ty(Ty->getContext()));
}
-Constant *ConstantExpr::getCompare(unsigned short pred,
- Constant *C1, Constant *C2) {
+Constant *ConstantExpr::getCompare(unsigned short Predicate,
+ Constant *C1, Constant *C2) {
assert(C1->getType() == C2->getType() && "Op types should be identical!");
- return getCompareTy(pred, C1, C2);
+
+ switch (Predicate) {
+ default: llvm_unreachable("Invalid CmpInst predicate");
+ case CmpInst::FCMP_FALSE: case CmpInst::FCMP_OEQ: case CmpInst::FCMP_OGT:
+ case CmpInst::FCMP_OGE: case CmpInst::FCMP_OLT: case CmpInst::FCMP_OLE:
+ case CmpInst::FCMP_ONE: case CmpInst::FCMP_ORD: case CmpInst::FCMP_UNO:
+ case CmpInst::FCMP_UEQ: case CmpInst::FCMP_UGT: case CmpInst::FCMP_UGE:
+ case CmpInst::FCMP_ULT: case CmpInst::FCMP_ULE: case CmpInst::FCMP_UNE:
+ case CmpInst::FCMP_TRUE:
+ return getFCmp(Predicate, C1, C2);
+
+ case CmpInst::ICMP_EQ: case CmpInst::ICMP_NE: case CmpInst::ICMP_UGT:
+ case CmpInst::ICMP_UGE: case CmpInst::ICMP_ULT: case CmpInst::ICMP_ULE:
+ case CmpInst::ICMP_SGT: case CmpInst::ICMP_SGE: case CmpInst::ICMP_SLT:
+ case CmpInst::ICMP_SLE:
+ return getICmp(Predicate, C1, C2);
+ }
}
-Constant *ConstantExpr::getSelectTy(const Type *ReqTy, Constant *C,
- Constant *V1, Constant *V2) {
+Constant *ConstantExpr::getSelect(Constant *C, Constant *V1, Constant *V2) {
assert(!SelectInst::areInvalidOperands(C, V1, V2)&&"Invalid select operands");
- if (ReqTy == V1->getType())
- if (Constant *SC = ConstantFoldSelectInstruction(C, V1, V2))
- return SC; // Fold common cases
+ if (Constant *SC = ConstantFoldSelectInstruction(C, V1, V2))
+ return SC; // Fold common cases
std::vector<Constant*> argVec(3, C);
argVec[1] = V1;
argVec[2] = V2;
ExprMapKeyType Key(Instruction::Select, argVec);
- LLVMContextImpl *pImpl = ReqTy->getContext().pImpl;
- return pImpl->ExprConstants.getOrCreate(ReqTy, Key);
+ LLVMContextImpl *pImpl = C->getContext().pImpl;
+ return pImpl->ExprConstants.getOrCreate(V1->getType(), Key);
}
-template<typename IndexTy>
-Constant *ConstantExpr::getGetElementPtrTy(const Type *ReqTy, Constant *C,
- IndexTy const *Idxs,
- unsigned NumIdx, bool InBounds) {
- assert(GetElementPtrInst::getIndexedType(C->getType(), Idxs,
- Idxs+NumIdx) ==
- cast<PointerType>(ReqTy)->getElementType() &&
- "GEP indices invalid!");
-
+Constant *ConstantExpr::getGetElementPtr(Constant *C, Value* const *Idxs,
+ unsigned NumIdx, bool InBounds) {
if (Constant *FC = ConstantFoldGetElementPtr(C, InBounds, Idxs, NumIdx))
return FC; // Fold a few common cases.
+ // Get the result type of the getelementptr!
+ const Type *Ty =
+ GetElementPtrInst::getIndexedType(C->getType(), Idxs, Idxs+NumIdx);
+ assert(Ty && "GEP indices invalid!");
+ unsigned AS = cast<PointerType>(C->getType())->getAddressSpace();
+ Type *ReqTy = Ty->getPointerTo(AS);
+
assert(C->getType()->isPointerTy() &&
"Non-pointer type for constant GetElementPtr expression");
// Look up the constant in the table first to ensure uniqueness
@@ -1611,32 +1614,11 @@ Constant *ConstantExpr::getGetElementPtrTy(const Type *ReqTy, Constant *C,
ArgVec.push_back(cast<Constant>(Idxs[i]));
const ExprMapKeyType Key(Instruction::GetElementPtr, ArgVec, 0,
InBounds ? GEPOperator::IsInBounds : 0);
-
- LLVMContextImpl *pImpl = ReqTy->getContext().pImpl;
+
+ LLVMContextImpl *pImpl = C->getContext().pImpl;
return pImpl->ExprConstants.getOrCreate(ReqTy, Key);
}
-template<typename IndexTy>
-Constant *ConstantExpr::getGetElementPtrImpl(Constant *C, IndexTy const *Idxs,
- unsigned NumIdx, bool InBounds) {
- // Get the result type of the getelementptr!
- const Type *Ty =
- GetElementPtrInst::getIndexedType(C->getType(), Idxs, Idxs+NumIdx);
- assert(Ty && "GEP indices invalid!");
- unsigned As = cast<PointerType>(C->getType())->getAddressSpace();
- return getGetElementPtrTy(PointerType::get(Ty, As), C, Idxs, NumIdx,InBounds);
-}
-
-Constant *ConstantExpr::getGetElementPtr(Constant *C, Value* const *Idxs,
- unsigned NumIdx, bool InBounds) {
- return getGetElementPtrImpl(C, Idxs, NumIdx, InBounds);
-}
-
-Constant *ConstantExpr::getGetElementPtr(Constant *C, Constant *const *Idxs,
- unsigned NumIdx, bool InBounds) {
- return getGetElementPtrImpl(C, Idxs, NumIdx, InBounds);
-}
-
Constant *
ConstantExpr::getICmp(unsigned short pred, Constant *LHS, Constant *RHS) {
assert(LHS->getType() == RHS->getType());
@@ -1684,39 +1666,22 @@ ConstantExpr::getFCmp(unsigned short pred, Constant *LHS, Constant *RHS) {
return pImpl->ExprConstants.getOrCreate(ResultTy, Key);
}
-Constant *ConstantExpr::getExtractElementTy(const Type *ReqTy, Constant *Val,
- Constant *Idx) {
- if (Constant *FC = ConstantFoldExtractElementInstruction(Val, Idx))
- return FC; // Fold a few common cases.
- // Look up the constant in the table first to ensure uniqueness
- std::vector<Constant*> ArgVec(1, Val);
- ArgVec.push_back(Idx);
- const ExprMapKeyType Key(Instruction::ExtractElement,ArgVec);
-
- LLVMContextImpl *pImpl = ReqTy->getContext().pImpl;
- return pImpl->ExprConstants.getOrCreate(ReqTy, Key);
-}
-
Constant *ConstantExpr::getExtractElement(Constant *Val, Constant *Idx) {
assert(Val->getType()->isVectorTy() &&
"Tried to create extractelement operation on non-vector type!");
assert(Idx->getType()->isIntegerTy(32) &&
"Extractelement index must be i32 type!");
- return getExtractElementTy(cast<VectorType>(Val->getType())->getElementType(),
- Val, Idx);
-}
-
-Constant *ConstantExpr::getInsertElementTy(const Type *ReqTy, Constant *Val,
- Constant *Elt, Constant *Idx) {
- if (Constant *FC = ConstantFoldInsertElementInstruction(Val, Elt, Idx))
+
+ if (Constant *FC = ConstantFoldExtractElementInstruction(Val, Idx))
return FC; // Fold a few common cases.
+
// Look up the constant in the table first to ensure uniqueness
std::vector<Constant*> ArgVec(1, Val);
- ArgVec.push_back(Elt);
ArgVec.push_back(Idx);
- const ExprMapKeyType Key(Instruction::InsertElement,ArgVec);
+ const ExprMapKeyType Key(Instruction::ExtractElement,ArgVec);
- LLVMContextImpl *pImpl = ReqTy->getContext().pImpl;
+ LLVMContextImpl *pImpl = Val->getContext().pImpl;
+ Type *ReqTy = cast<VectorType>(Val->getType())->getElementType();
return pImpl->ExprConstants.getOrCreate(ReqTy, Key);
}
@@ -1728,21 +1693,17 @@ Constant *ConstantExpr::getInsertElement(Constant *Val, Constant *Elt,
&& "Insertelement types must match!");
assert(Idx->getType()->isIntegerTy(32) &&
"Insertelement index must be i32 type!");
- return getInsertElementTy(Val->getType(), Val, Elt, Idx);
-}
-Constant *ConstantExpr::getShuffleVectorTy(const Type *ReqTy, Constant *V1,
- Constant *V2, Constant *Mask) {
- if (Constant *FC = ConstantFoldShuffleVectorInstruction(V1, V2, Mask))
- return FC; // Fold a few common cases...
+ if (Constant *FC = ConstantFoldInsertElementInstruction(Val, Elt, Idx))
+ return FC; // Fold a few common cases.
// Look up the constant in the table first to ensure uniqueness
- std::vector<Constant*> ArgVec(1, V1);
- ArgVec.push_back(V2);
- ArgVec.push_back(Mask);
- const ExprMapKeyType Key(Instruction::ShuffleVector,ArgVec);
+ std::vector<Constant*> ArgVec(1, Val);
+ ArgVec.push_back(Elt);
+ ArgVec.push_back(Idx);
+ const ExprMapKeyType Key(Instruction::InsertElement,ArgVec);
- LLVMContextImpl *pImpl = ReqTy->getContext().pImpl;
- return pImpl->ExprConstants.getOrCreate(ReqTy, Key);
+ LLVMContextImpl *pImpl = Val->getContext().pImpl;
+ return pImpl->ExprConstants.getOrCreate(Val->getType(), Key);
}
Constant *ConstantExpr::getShuffleVector(Constant *V1, Constant *V2,
@@ -1750,62 +1711,49 @@ Constant *ConstantExpr::getShuffleVector(Constant *V1, Constant *V2,
assert(ShuffleVectorInst::isValidOperands(V1, V2, Mask) &&
"Invalid shuffle vector constant expr operands!");
+ if (Constant *FC = ConstantFoldShuffleVectorInstruction(V1, V2, Mask))
+ return FC; // Fold a few common cases.
+
unsigned NElts = cast<VectorType>(Mask->getType())->getNumElements();
const Type *EltTy = cast<VectorType>(V1->getType())->getElementType();
const Type *ShufTy = VectorType::get(EltTy, NElts);
- return getShuffleVectorTy(ShufTy, V1, V2, Mask);
-}
-Constant *ConstantExpr::getInsertValueTy(const Type *ReqTy, Constant *Agg,
- Constant *Val,
- const unsigned *Idxs, unsigned NumIdx) {
- assert(ExtractValueInst::getIndexedType(Agg->getType(), Idxs,
- Idxs+NumIdx) == Val->getType() &&
- "insertvalue indices invalid!");
- assert(Agg->getType() == ReqTy &&
- "insertvalue type invalid!");
- assert(Agg->getType()->isFirstClassType() &&
- "Non-first-class type for constant InsertValue expression");
- Constant *FC = ConstantFoldInsertValueInstruction(Agg, Val, Idxs, NumIdx);
- assert(FC && "InsertValue constant expr couldn't be folded!");
- return FC;
+ // Look up the constant in the table first to ensure uniqueness
+ std::vector<Constant*> ArgVec(1, V1);
+ ArgVec.push_back(V2);
+ ArgVec.push_back(Mask);
+ const ExprMapKeyType Key(Instruction::ShuffleVector,ArgVec);
+
+ LLVMContextImpl *pImpl = ShufTy->getContext().pImpl;
+ return pImpl->ExprConstants.getOrCreate(ShufTy, Key);
}
Constant *ConstantExpr::getInsertValue(Constant *Agg, Constant *Val,
- const unsigned *IdxList, unsigned NumIdx) {
- assert(Agg->getType()->isFirstClassType() &&
- "Tried to create insertelement operation on non-first-class type!");
-
- const Type *ReqTy = Agg->getType();
-#ifndef NDEBUG
- const Type *ValTy =
- ExtractValueInst::getIndexedType(Agg->getType(), IdxList, IdxList+NumIdx);
-#endif
- assert(ValTy == Val->getType() && "insertvalue indices invalid!");
- return getInsertValueTy(ReqTy, Agg, Val, IdxList, NumIdx);
-}
-
-Constant *ConstantExpr::getExtractValueTy(const Type *ReqTy, Constant *Agg,
- const unsigned *Idxs, unsigned NumIdx) {
- assert(ExtractValueInst::getIndexedType(Agg->getType(), Idxs,
- Idxs+NumIdx) == ReqTy &&
- "extractvalue indices invalid!");
+ ArrayRef<unsigned> Idxs) {
+ assert(ExtractValueInst::getIndexedType(Agg->getType(),
+ Idxs) == Val->getType() &&
+ "insertvalue indices invalid!");
assert(Agg->getType()->isFirstClassType() &&
- "Non-first-class type for constant extractvalue expression");
- Constant *FC = ConstantFoldExtractValueInstruction(Agg, Idxs, NumIdx);
- assert(FC && "ExtractValue constant expr couldn't be folded!");
+ "Non-first-class type for constant insertvalue expression");
+ Constant *FC = ConstantFoldInsertValueInstruction(Agg, Val, Idxs);
+ assert(FC && "insertvalue constant expr couldn't be folded!");
return FC;
}
Constant *ConstantExpr::getExtractValue(Constant *Agg,
- const unsigned *IdxList, unsigned NumIdx) {
+ ArrayRef<unsigned> Idxs) {
assert(Agg->getType()->isFirstClassType() &&
"Tried to create extractelement operation on non-first-class type!");
- const Type *ReqTy =
- ExtractValueInst::getIndexedType(Agg->getType(), IdxList, IdxList+NumIdx);
+ const Type *ReqTy = ExtractValueInst::getIndexedType(Agg->getType(), Idxs);
+ (void)ReqTy;
assert(ReqTy && "extractvalue indices invalid!");
- return getExtractValueTy(ReqTy, Agg, IdxList, NumIdx);
+
+ assert(Agg->getType()->isFirstClassType() &&
+ "Non-first-class type for constant extractvalue expression");
+ Constant *FC = ConstantFoldExtractValueInstruction(Agg, Idxs);
+ assert(FC && "ExtractValue constant expr couldn't be folded!");
+ return FC;
}
Constant *ConstantExpr::getNeg(Constant *C, bool HasNUW, bool HasNSW) {
@@ -1918,7 +1866,7 @@ Constant *ConstantExpr::getAShr(Constant *C1, Constant *C2, bool isExact) {
// destroyConstant - Remove the constant from the constant table...
//
void ConstantExpr::destroyConstant() {
- getRawType()->getContext().pImpl->ExprConstants.remove(this);
+ getType()->getContext().pImpl->ExprConstants.remove(this);
destroyConstantImpl();
}
@@ -1959,10 +1907,10 @@ void ConstantArray::replaceUsesOfWithOnConstant(Value *From, Value *To,
assert(isa<Constant>(To) && "Cannot make Constant refer to non-constant!");
Constant *ToC = cast<Constant>(To);
- LLVMContextImpl *pImpl = getRawType()->getContext().pImpl;
+ LLVMContextImpl *pImpl = getType()->getContext().pImpl;
std::pair<LLVMContextImpl::ArrayConstantsTy::MapKey, ConstantArray*> Lookup;
- Lookup.first.first = cast<ArrayType>(getRawType());
+ Lookup.first.first = cast<ArrayType>(getType());
Lookup.second = this;
std::vector<Constant*> &Values = Lookup.first.second;
@@ -1996,7 +1944,7 @@ void ConstantArray::replaceUsesOfWithOnConstant(Value *From, Value *To,
Constant *Replacement = 0;
if (isAllZeros) {
- Replacement = ConstantAggregateZero::get(getRawType());
+ Replacement = ConstantAggregateZero::get(getType());
} else {
// Check to see if we have this array type already.
bool Exists;
@@ -2032,7 +1980,7 @@ void ConstantArray::replaceUsesOfWithOnConstant(Value *From, Value *To,
assert(Replacement != this && "I didn't contain From!");
// Everyone using this now uses the replacement.
- uncheckedReplaceAllUsesWith(Replacement);
+ replaceAllUsesWith(Replacement);
// Delete the old constant!
destroyConstant();
@@ -2047,7 +1995,7 @@ void ConstantStruct::replaceUsesOfWithOnConstant(Value *From, Value *To,
assert(getOperand(OperandToUpdate) == From && "ReplaceAllUsesWith broken!");
std::pair<LLVMContextImpl::StructConstantsTy::MapKey, ConstantStruct*> Lookup;
- Lookup.first.first = cast<StructType>(getRawType());
+ Lookup.first.first = cast<StructType>(getType());
Lookup.second = this;
std::vector<Constant*> &Values = Lookup.first.second;
Values.reserve(getNumOperands()); // Build replacement struct.
@@ -2069,11 +2017,11 @@ void ConstantStruct::replaceUsesOfWithOnConstant(Value *From, Value *To,
}
Values[OperandToUpdate] = ToC;
- LLVMContextImpl *pImpl = getRawType()->getContext().pImpl;
+ LLVMContextImpl *pImpl = getContext().pImpl;
Constant *Replacement = 0;
if (isAllZeros) {
- Replacement = ConstantAggregateZero::get(getRawType());
+ Replacement = ConstantAggregateZero::get(getType());
} else {
// Check to see if we have this struct type already.
bool Exists;
@@ -2098,7 +2046,7 @@ void ConstantStruct::replaceUsesOfWithOnConstant(Value *From, Value *To,
assert(Replacement != this && "I didn't contain From!");
// Everyone using this now uses the replacement.
- uncheckedReplaceAllUsesWith(Replacement);
+ replaceAllUsesWith(Replacement);
// Delete the old constant!
destroyConstant();
@@ -2116,11 +2064,11 @@ void ConstantVector::replaceUsesOfWithOnConstant(Value *From, Value *To,
Values.push_back(Val);
}
- Constant *Replacement = get(cast<VectorType>(getRawType()), Values);
+ Constant *Replacement = get(Values);
assert(Replacement != this && "I didn't contain From!");
// Everyone using this now uses the replacement.
- uncheckedReplaceAllUsesWith(Replacement);
+ replaceAllUsesWith(Replacement);
// Delete the old constant!
destroyConstant();
@@ -2151,8 +2099,7 @@ void ConstantExpr::replaceUsesOfWithOnConstant(Value *From, Value *ToV,
if (Agg == From) Agg = To;
ArrayRef<unsigned> Indices = getIndices();
- Replacement = ConstantExpr::getExtractValue(Agg,
- &Indices[0], Indices.size());
+ Replacement = ConstantExpr::getExtractValue(Agg, Indices);
} else if (getOpcode() == Instruction::InsertValue) {
Constant *Agg = getOperand(0);
Constant *Val = getOperand(1);
@@ -2160,11 +2107,10 @@ void ConstantExpr::replaceUsesOfWithOnConstant(Value *From, Value *ToV,
if (Val == From) Val = To;
ArrayRef<unsigned> Indices = getIndices();
- Replacement = ConstantExpr::getInsertValue(Agg, Val,
- &Indices[0], Indices.size());
+ Replacement = ConstantExpr::getInsertValue(Agg, Val, Indices);
} else if (isCast()) {
assert(getOperand(0) == From && "Cast only has one use!");
- Replacement = ConstantExpr::getCast(getOpcode(), To, getRawType());
+ Replacement = ConstantExpr::getCast(getOpcode(), To, getType());
} else if (getOpcode() == Instruction::Select) {
Constant *C1 = getOperand(0);
Constant *C2 = getOperand(1);
@@ -2220,7 +2166,7 @@ void ConstantExpr::replaceUsesOfWithOnConstant(Value *From, Value *ToV,
assert(Replacement != this && "I didn't contain From!");
// Everyone using this now uses the replacement.
- uncheckedReplaceAllUsesWith(Replacement);
+ replaceAllUsesWith(Replacement);
// Delete the old constant!
destroyConstant();
diff --git a/contrib/llvm/lib/VMCore/ConstantsContext.h b/contrib/llvm/lib/VMCore/ConstantsContext.h
index 1395754..bd134d9 100644
--- a/contrib/llvm/lib/VMCore/ConstantsContext.h
+++ b/contrib/llvm/lib/VMCore/ConstantsContext.h
@@ -568,15 +568,13 @@ struct ConstantKeyData<InlineAsm> {
}
};
-template<class ValType, class TypeClass, class ConstantClass,
+template<class ValType, class ValRefType, class TypeClass, class ConstantClass,
bool HasLargeKey = false /*true for arrays and structs*/ >
-class ConstantUniqueMap : public AbstractTypeUser {
+class ConstantUniqueMap {
public:
typedef std::pair<const TypeClass*, ValType> MapKey;
typedef std::map<MapKey, ConstantClass *> MapTy;
typedef std::map<ConstantClass *, typename MapTy::iterator> InverseMapTy;
- typedef std::map<const DerivedType*, typename MapTy::iterator>
- AbstractTypeMapTy;
private:
/// Map - This is the main map from the element descriptor to the Constants.
/// This is the primary way we avoid creating two of the same shape
@@ -589,10 +587,6 @@ private:
/// through the map with very large keys.
InverseMapTy InverseMap;
- /// AbstractTypeMap - Map for abstract type constants.
- ///
- AbstractTypeMapTy AbstractTypeMap;
-
public:
typename MapTy::iterator map_begin() { return Map.begin(); }
typename MapTy::iterator map_end() { return Map.end(); }
@@ -629,7 +623,7 @@ private:
}
typename MapTy::iterator I =
- Map.find(MapKey(static_cast<const TypeClass*>(CP->getRawType()),
+ Map.find(MapKey(static_cast<const TypeClass*>(CP->getType()),
ConstantKeyData<ConstantClass>::getValType(CP)));
if (I == Map.end() || I->second != CP) {
// FIXME: This should not use a linear scan. If this gets to be a
@@ -639,24 +633,8 @@ private:
}
return I;
}
-
- void AddAbstractTypeUser(const Type *Ty, typename MapTy::iterator I) {
- // If the type of the constant is abstract, make sure that an entry
- // exists for it in the AbstractTypeMap.
- if (Ty->isAbstract()) {
- const DerivedType *DTy = static_cast<const DerivedType *>(Ty);
- typename AbstractTypeMapTy::iterator TI = AbstractTypeMap.find(DTy);
-
- if (TI == AbstractTypeMap.end()) {
- // Add ourselves to the ATU list of the type.
- cast<DerivedType>(DTy)->addAbstractTypeUser(this);
-
- AbstractTypeMap.insert(TI, std::make_pair(DTy, I));
- }
- }
- }
- ConstantClass* Create(const TypeClass *Ty, const ValType &V,
+ ConstantClass *Create(const TypeClass *Ty, ValRefType V,
typename MapTy::iterator I) {
ConstantClass* Result =
ConstantCreator<ConstantClass,TypeClass,ValType>::create(Ty, V);
@@ -667,15 +645,13 @@ private:
if (HasLargeKey) // Remember the reverse mapping if needed.
InverseMap.insert(std::make_pair(Result, I));
- AddAbstractTypeUser(Ty, I);
-
return Result;
}
public:
/// getOrCreate - Return the specified constant from the map, creating it if
/// necessary.
- ConstantClass *getOrCreate(const TypeClass *Ty, const ValType &V) {
+ ConstantClass *getOrCreate(const TypeClass *Ty, ValRefType V) {
MapKey Lookup(Ty, V);
ConstantClass* Result = 0;
@@ -692,43 +668,6 @@ public:
return Result;
}
- void UpdateAbstractTypeMap(const DerivedType *Ty,
- typename MapTy::iterator I) {
- assert(AbstractTypeMap.count(Ty) &&
- "Abstract type not in AbstractTypeMap?");
- typename MapTy::iterator &ATMEntryIt = AbstractTypeMap[Ty];
- if (ATMEntryIt == I) {
- // Yes, we are removing the representative entry for this type.
- // See if there are any other entries of the same type.
- typename MapTy::iterator TmpIt = ATMEntryIt;
-
- // First check the entry before this one...
- if (TmpIt != Map.begin()) {
- --TmpIt;
- if (TmpIt->first.first != Ty) // Not the same type, move back...
- ++TmpIt;
- }
-
- // If we didn't find the same type, try to move forward...
- if (TmpIt == ATMEntryIt) {
- ++TmpIt;
- if (TmpIt == Map.end() || TmpIt->first.first != Ty)
- --TmpIt; // No entry afterwards with the same type
- }
-
- // If there is another entry in the map of the same abstract type,
- // update the AbstractTypeMap entry now.
- if (TmpIt != ATMEntryIt) {
- ATMEntryIt = TmpIt;
- } else {
- // Otherwise, we are removing the last instance of this type
- // from the table. Remove from the ATM, and from user list.
- cast<DerivedType>(Ty)->removeAbstractTypeUser(this);
- AbstractTypeMap.erase(Ty);
- }
- }
- }
-
void remove(ConstantClass *CP) {
typename MapTy::iterator I = FindExistingElement(CP);
assert(I != Map.end() && "Constant not found in constant table!");
@@ -736,12 +675,6 @@ public:
if (HasLargeKey) // Remember the reverse mapping if needed.
InverseMap.erase(CP);
-
- // Now that we found the entry, make sure this isn't the entry that
- // the AbstractTypeMap points to.
- const TypeClass *Ty = I->first.first;
- if (Ty->isAbstract())
- UpdateAbstractTypeMap(static_cast<const DerivedType *>(Ty), I);
Map.erase(I);
}
@@ -755,22 +688,7 @@ public:
assert(OldI != Map.end() && "Constant not found in constant table!");
assert(OldI->second == C && "Didn't find correct element?");
- // If this constant is the representative element for its abstract type,
- // update the AbstractTypeMap so that the representative element is I.
- //
- // This must use getRawType() because if the type is under refinement, we
- // will get the refineAbstractType callback below, and we don't want to
- // kick union find in on the constant.
- if (C->getRawType()->isAbstract()) {
- typename AbstractTypeMapTy::iterator ATI =
- AbstractTypeMap.find(cast<DerivedType>(C->getRawType()));
- assert(ATI != AbstractTypeMap.end() &&
- "Abstract type not in AbstractTypeMap?");
- if (ATI->second == OldI)
- ATI->second = I;
- }
-
- // Remove the old entry from the map.
+ // Remove the old entry from the map.
Map.erase(OldI);
// Update the inverse map so that we know that this constant is now
@@ -780,58 +698,6 @@ public:
InverseMap[C] = I;
}
}
-
- void refineAbstractType(const DerivedType *OldTy, const Type *NewTy) {
- typename AbstractTypeMapTy::iterator I = AbstractTypeMap.find(OldTy);
-
- assert(I != AbstractTypeMap.end() &&
- "Abstract type not in AbstractTypeMap?");
-
- // Convert a constant at a time until the last one is gone. The last one
- // leaving will remove() itself, causing the AbstractTypeMapEntry to be
- // eliminated eventually.
- do {
- ConstantClass *C = I->second->second;
- MapKey Key(cast<TypeClass>(NewTy),
- ConstantKeyData<ConstantClass>::getValType(C));
-
- std::pair<typename MapTy::iterator, bool> IP =
- Map.insert(std::make_pair(Key, C));
- if (IP.second) {
- // The map didn't previously have an appropriate constant in the
- // new type.
-
- // Remove the old entry.
- typename MapTy::iterator OldI =
- Map.find(MapKey(cast<TypeClass>(OldTy), IP.first->first.second));
- assert(OldI != Map.end() && "Constant not in map!");
- UpdateAbstractTypeMap(OldTy, OldI);
- Map.erase(OldI);
-
- // Set the constant's type. This is done in place!
- setType(C, NewTy);
-
- // Update the inverse map so that we know that this constant is now
- // located at descriptor I.
- if (HasLargeKey)
- InverseMap[C] = IP.first;
-
- AddAbstractTypeUser(NewTy, IP.first);
- } else {
- // The map already had an appropriate constant in the new type, so
- // there's no longer a need for the old constant.
- C->uncheckedReplaceAllUsesWith(IP.first->second);
- C->destroyConstant(); // This constant is now dead, destroy it.
- }
- I = AbstractTypeMap.find(OldTy);
- } while (I != AbstractTypeMap.end());
- }
-
- // If the type became concrete without being refined to any other existing
- // type, we just remove ourselves from the ATU list.
- void typeBecameConcrete(const DerivedType *AbsTy) {
- AbsTy->removeAbstractTypeUser(this);
- }
void dump() const {
DEBUG(dbgs() << "Constant.cpp: ConstantUniqueMap\n");
diff --git a/contrib/llvm/lib/VMCore/Core.cpp b/contrib/llvm/lib/VMCore/Core.cpp
index 92f9440..2a816e1 100644
--- a/contrib/llvm/lib/VMCore/Core.cpp
+++ b/contrib/llvm/lib/VMCore/Core.cpp
@@ -19,7 +19,6 @@
#include "llvm/GlobalVariable.h"
#include "llvm/GlobalAlias.h"
#include "llvm/LLVMContext.h"
-#include "llvm/TypeSymbolTable.h"
#include "llvm/InlineAsm.h"
#include "llvm/IntrinsicInst.h"
#include "llvm/PassManager.h"
@@ -111,27 +110,6 @@ void LLVMSetTarget(LLVMModuleRef M, const char *Triple) {
unwrap(M)->setTargetTriple(Triple);
}
-/*--.. Type names ..........................................................--*/
-LLVMBool LLVMAddTypeName(LLVMModuleRef M, const char *Name, LLVMTypeRef Ty) {
- return unwrap(M)->addTypeName(Name, unwrap(Ty));
-}
-
-void LLVMDeleteTypeName(LLVMModuleRef M, const char *Name) {
- TypeSymbolTable &TST = unwrap(M)->getTypeSymbolTable();
-
- TypeSymbolTable::iterator I = TST.find(Name);
- if (I != TST.end())
- TST.remove(I);
-}
-
-LLVMTypeRef LLVMGetTypeByName(LLVMModuleRef M, const char *Name) {
- return wrap(unwrap(M)->getTypeByName(Name));
-}
-
-const char *LLVMGetTypeName(LLVMModuleRef M, LLVMTypeRef Ty) {
- return unwrap(M)->getTypeName(unwrap(Ty)).c_str();
-}
-
void LLVMDumpModule(LLVMModuleRef M) {
unwrap(M)->dump();
}
@@ -182,8 +160,6 @@ LLVMTypeKind LLVMGetTypeKind(LLVMTypeRef Ty) {
return LLVMArrayTypeKind;
case Type::PointerTyID:
return LLVMPointerTypeKind;
- case Type::OpaqueTyID:
- return LLVMOpaqueTypeKind;
case Type::VectorTyID:
return LLVMVectorTypeKind;
case Type::X86_MMXTyID:
@@ -284,10 +260,7 @@ LLVMTypeRef LLVMX86MMXType(void) {
LLVMTypeRef LLVMFunctionType(LLVMTypeRef ReturnType,
LLVMTypeRef *ParamTypes, unsigned ParamCount,
LLVMBool IsVarArg) {
- std::vector<const Type*> Tys;
- for (LLVMTypeRef *I = ParamTypes, *E = ParamTypes + ParamCount; I != E; ++I)
- Tys.push_back(unwrap(*I));
-
+ ArrayRef<Type*> Tys(unwrap(ParamTypes), ParamCount);
return wrap(FunctionType::get(unwrap(ReturnType), Tys, IsVarArg != 0));
}
@@ -314,11 +287,7 @@ void LLVMGetParamTypes(LLVMTypeRef FunctionTy, LLVMTypeRef *Dest) {
LLVMTypeRef LLVMStructTypeInContext(LLVMContextRef C, LLVMTypeRef *ElementTypes,
unsigned ElementCount, LLVMBool Packed) {
- std::vector<const Type*> Tys;
- for (LLVMTypeRef *I = ElementTypes,
- *E = ElementTypes + ElementCount; I != E; ++I)
- Tys.push_back(unwrap(*I));
-
+ ArrayRef<Type*> Tys(unwrap(ElementTypes), ElementCount);
return wrap(StructType::get(*unwrap(C), Tys, Packed != 0));
}
@@ -328,6 +297,16 @@ LLVMTypeRef LLVMStructType(LLVMTypeRef *ElementTypes,
ElementCount, Packed);
}
+LLVMTypeRef LLVMStructCreateNamed(LLVMContextRef C, const char *Name)
+{
+ return wrap(StructType::createNamed(*unwrap(C), Name));
+}
+
+void LLVMStructSetBody(LLVMTypeRef StructTy, LLVMTypeRef *ElementTypes,
+ unsigned ElementCount, LLVMBool Packed) {
+ ArrayRef<Type*> Tys(unwrap(ElementTypes), ElementCount);
+ unwrap<StructType>(StructTy)->setBody(Tys, Packed != 0);
+}
unsigned LLVMCountStructElementTypes(LLVMTypeRef StructTy) {
return unwrap<StructType>(StructTy)->getNumElements();
@@ -344,6 +323,14 @@ LLVMBool LLVMIsPackedStruct(LLVMTypeRef StructTy) {
return unwrap<StructType>(StructTy)->isPacked();
}
+LLVMBool LLVMIsOpaqueStruct(LLVMTypeRef StructTy) {
+ return unwrap<StructType>(StructTy)->isOpaque();
+}
+
+LLVMTypeRef LLVMGetTypeByName(LLVMModuleRef M, const char *Name) {
+ return wrap(unwrap(M)->getTypeByName(Name));
+}
+
/*--.. Operations on array, pointer, and vector types (sequence types) .....--*/
LLVMTypeRef LLVMArrayType(LLVMTypeRef ElementType, unsigned ElementCount) {
@@ -382,9 +369,6 @@ LLVMTypeRef LLVMVoidTypeInContext(LLVMContextRef C) {
LLVMTypeRef LLVMLabelTypeInContext(LLVMContextRef C) {
return wrap(Type::getLabelTy(*unwrap(C)));
}
-LLVMTypeRef LLVMOpaqueTypeInContext(LLVMContextRef C) {
- return wrap(OpaqueType::get(*unwrap(C)));
-}
LLVMTypeRef LLVMVoidType(void) {
return LLVMVoidTypeInContext(LLVMGetGlobalContext());
@@ -392,28 +376,6 @@ LLVMTypeRef LLVMVoidType(void) {
LLVMTypeRef LLVMLabelType(void) {
return LLVMLabelTypeInContext(LLVMGetGlobalContext());
}
-LLVMTypeRef LLVMOpaqueType(void) {
- return LLVMOpaqueTypeInContext(LLVMGetGlobalContext());
-}
-
-/*--.. Operations on type handles ..........................................--*/
-
-LLVMTypeHandleRef LLVMCreateTypeHandle(LLVMTypeRef PotentiallyAbstractTy) {
- return wrap(new PATypeHolder(unwrap(PotentiallyAbstractTy)));
-}
-
-void LLVMDisposeTypeHandle(LLVMTypeHandleRef TypeHandle) {
- delete unwrap(TypeHandle);
-}
-
-LLVMTypeRef LLVMResolveTypeHandle(LLVMTypeHandleRef TypeHandle) {
- return wrap(unwrap(TypeHandle)->get());
-}
-
-void LLVMRefineType(LLVMTypeRef AbstractTy, LLVMTypeRef ConcreteTy) {
- unwrap<DerivedType>(AbstractTy)->refineAbstractTypeTo(unwrap(ConcreteTy));
-}
-
/*===-- Operations on values ----------------------------------------------===*/
@@ -612,9 +574,10 @@ LLVMValueRef LLVMConstStringInContext(LLVMContextRef C, const char *Str,
LLVMValueRef LLVMConstStructInContext(LLVMContextRef C,
LLVMValueRef *ConstantVals,
unsigned Count, LLVMBool Packed) {
- return wrap(ConstantStruct::get(*unwrap(C),
- unwrap<Constant>(ConstantVals, Count),
- Count, Packed != 0));
+ Constant **Elements = unwrap<Constant>(ConstantVals, Count);
+ return wrap(ConstantStruct::getAnon(*unwrap(C),
+ ArrayRef<Constant*>(Elements, Count),
+ Packed != 0));
}
LLVMValueRef LLVMConstString(const char *Str, unsigned Length,
@@ -624,15 +587,24 @@ LLVMValueRef LLVMConstString(const char *Str, unsigned Length,
}
LLVMValueRef LLVMConstArray(LLVMTypeRef ElementTy,
LLVMValueRef *ConstantVals, unsigned Length) {
- return wrap(ConstantArray::get(ArrayType::get(unwrap(ElementTy), Length),
- unwrap<Constant>(ConstantVals, Length),
- Length));
+ ArrayRef<Constant*> V(unwrap<Constant>(ConstantVals, Length), Length);
+ return wrap(ConstantArray::get(ArrayType::get(unwrap(ElementTy), Length), V));
}
LLVMValueRef LLVMConstStruct(LLVMValueRef *ConstantVals, unsigned Count,
LLVMBool Packed) {
return LLVMConstStructInContext(LLVMGetGlobalContext(), ConstantVals, Count,
Packed);
}
+
+LLVMValueRef LLVMConstNamedStruct(LLVMTypeRef StructTy,
+ LLVMValueRef *ConstantVals,
+ unsigned Count) {
+ Constant **Elements = unwrap<Constant>(ConstantVals, Count);
+ const StructType *Ty = cast<StructType>(unwrap(StructTy));
+
+ return wrap(ConstantStruct::get(Ty, ArrayRef<Constant*>(Elements, Count)));
+}
+
LLVMValueRef LLVMConstVector(LLVMValueRef *ScalarConstantVals, unsigned Size) {
return wrap(ConstantVector::get(ArrayRef<Constant*>(
unwrap<Constant>(ScalarConstantVals, Size), Size)));
@@ -962,7 +934,8 @@ LLVMValueRef LLVMConstShuffleVector(LLVMValueRef VectorAConstant,
LLVMValueRef LLVMConstExtractValue(LLVMValueRef AggConstant, unsigned *IdxList,
unsigned NumIdx) {
return wrap(ConstantExpr::getExtractValue(unwrap<Constant>(AggConstant),
- IdxList, NumIdx));
+ ArrayRef<unsigned>(IdxList,
+ NumIdx)));
}
LLVMValueRef LLVMConstInsertValue(LLVMValueRef AggConstant,
@@ -970,7 +943,8 @@ LLVMValueRef LLVMConstInsertValue(LLVMValueRef AggConstant,
unsigned *IdxList, unsigned NumIdx) {
return wrap(ConstantExpr::getInsertValue(unwrap<Constant>(AggConstant),
unwrap<Constant>(ElementValueConstant),
- IdxList, NumIdx));
+ ArrayRef<unsigned>(IdxList,
+ NumIdx)));
}
LLVMValueRef LLVMConstInlineAsm(LLVMTypeRef Ty, const char *AsmString,
@@ -1706,7 +1680,7 @@ LLVMValueRef LLVMBuildInvoke(LLVMBuilderRef B, LLVMValueRef Fn,
LLVMBasicBlockRef Then, LLVMBasicBlockRef Catch,
const char *Name) {
return wrap(unwrap(B)->CreateInvoke(unwrap(Fn), unwrap(Then), unwrap(Catch),
- unwrap(Args), unwrap(Args) + NumArgs,
+ ArrayRef<Value *>(unwrap(Args), NumArgs),
Name));
}
@@ -2089,8 +2063,9 @@ LLVMValueRef LLVMBuildPhi(LLVMBuilderRef B, LLVMTypeRef Ty, const char *Name) {
LLVMValueRef LLVMBuildCall(LLVMBuilderRef B, LLVMValueRef Fn,
LLVMValueRef *Args, unsigned NumArgs,
const char *Name) {
- return wrap(unwrap(B)->CreateCall(unwrap(Fn), unwrap(Args),
- unwrap(Args) + NumArgs, Name));
+ return wrap(unwrap(B)->CreateCall(unwrap(Fn),
+ ArrayRef<Value *>(unwrap(Args), NumArgs),
+ Name));
}
LLVMValueRef LLVMBuildSelect(LLVMBuilderRef B, LLVMValueRef If,
diff --git a/contrib/llvm/lib/VMCore/DebugLoc.cpp b/contrib/llvm/lib/VMCore/DebugLoc.cpp
index 520333c..4ff6b2c 100644
--- a/contrib/llvm/lib/VMCore/DebugLoc.cpp
+++ b/contrib/llvm/lib/VMCore/DebugLoc.cpp
@@ -128,6 +128,38 @@ DebugLoc DebugLoc::getFromDILocation(MDNode *N) {
return get(LineNo, ColNo, Scope, dyn_cast_or_null<MDNode>(N->getOperand(3)));
}
+/// getFromDILexicalBlock - Translate the DILexicalBlock into a DebugLoc.
+DebugLoc DebugLoc::getFromDILexicalBlock(MDNode *N) {
+ if (N == 0 || N->getNumOperands() < 3) return DebugLoc();
+
+ MDNode *Scope = dyn_cast_or_null<MDNode>(N->getOperand(1));
+ if (Scope == 0) return DebugLoc();
+
+ unsigned LineNo = 0, ColNo = 0;
+ if (ConstantInt *Line = dyn_cast_or_null<ConstantInt>(N->getOperand(2)))
+ LineNo = Line->getZExtValue();
+ if (ConstantInt *Col = dyn_cast_or_null<ConstantInt>(N->getOperand(3)))
+ ColNo = Col->getZExtValue();
+
+ return get(LineNo, ColNo, Scope, NULL);
+}
+
+void DebugLoc::dump(const LLVMContext &Ctx) const {
+#ifndef NDEBUG
+ if (!isUnknown()) {
+ dbgs() << getLine();
+ if (getCol() != 0)
+ dbgs() << ',' << getCol();
+ DebugLoc InlinedAtDL = DebugLoc::getFromDILocation(getInlinedAt(Ctx));
+ if (!InlinedAtDL.isUnknown()) {
+ dbgs() << " @ ";
+ InlinedAtDL.dump(Ctx);
+ } else
+ dbgs() << "\n";
+ }
+#endif
+}
+
//===----------------------------------------------------------------------===//
// DenseMap specialization
//===----------------------------------------------------------------------===//
diff --git a/contrib/llvm/lib/VMCore/Function.cpp b/contrib/llvm/lib/VMCore/Function.cpp
index 0ae0bdb..6536bcd 100644
--- a/contrib/llvm/lib/VMCore/Function.cpp
+++ b/contrib/llvm/lib/VMCore/Function.cpp
@@ -134,7 +134,7 @@ LLVMContext &Function::getContext() const {
return getType()->getContext();
}
-const FunctionType *Function::getFunctionType() const {
+FunctionType *Function::getFunctionType() const {
return cast<FunctionType>(getType()->getElementType());
}
@@ -142,7 +142,7 @@ bool Function::isVarArg() const {
return getFunctionType()->isVarArg();
}
-const Type *Function::getReturnType() const {
+Type *Function::getReturnType() const {
return getFunctionType()->getReturnType();
}
@@ -163,7 +163,7 @@ Function::Function(const FunctionType *Ty, LinkageTypes Linkage,
: GlobalValue(PointerType::getUnqual(Ty),
Value::FunctionVal, 0, 0, Linkage, name) {
assert(FunctionType::isValidReturnType(getReturnType()) &&
- !getReturnType()->isOpaqueTy() && "invalid return type");
+ "invalid return type");
SymTab = new ValueSymbolTable();
// If the function has arguments, mark them as lazily built.
@@ -333,7 +333,7 @@ unsigned Function::getIntrinsicID() const {
return 0;
}
-std::string Intrinsic::getName(ID id, const Type **Tys, unsigned numTys) {
+std::string Intrinsic::getName(ID id, ArrayRef<Type*> Tys) {
assert(id < num_intrinsics && "Invalid intrinsic ID!");
static const char * const Table[] = {
"not_intrinsic",
@@ -341,10 +341,10 @@ std::string Intrinsic::getName(ID id, const Type **Tys, unsigned numTys) {
#include "llvm/Intrinsics.gen"
#undef GET_INTRINSIC_NAME_TABLE
};
- if (numTys == 0)
+ if (Tys.empty())
return Table[id];
std::string Result(Table[id]);
- for (unsigned i = 0; i < numTys; ++i) {
+ for (unsigned i = 0; i < Tys.size(); ++i) {
if (const PointerType* PTyp = dyn_cast<PointerType>(Tys[i])) {
Result += ".p" + llvm::utostr(PTyp->getAddressSpace()) +
EVT::getEVT(PTyp->getElementType()).getEVTString();
@@ -356,10 +356,9 @@ std::string Intrinsic::getName(ID id, const Type **Tys, unsigned numTys) {
}
const FunctionType *Intrinsic::getType(LLVMContext &Context,
- ID id, const Type **Tys,
- unsigned numTys) {
+ ID id, ArrayRef<Type*> Tys) {
const Type *ResultTy = NULL;
- std::vector<const Type*> ArgTys;
+ std::vector<Type*> ArgTys;
bool IsVarArg = false;
#define GET_INTRINSIC_GENERATOR
@@ -384,14 +383,12 @@ bool Intrinsic::isOverloaded(ID id) {
#include "llvm/Intrinsics.gen"
#undef GET_INTRINSIC_ATTRIBUTES
-Function *Intrinsic::getDeclaration(Module *M, ID id, const Type **Tys,
- unsigned numTys) {
+Function *Intrinsic::getDeclaration(Module *M, ID id, ArrayRef<Type*> Tys) {
// There can never be multiple globals with the same name of different types,
// because intrinsics must be a specific type.
return
- cast<Function>(M->getOrInsertFunction(getName(id, Tys, numTys),
- getType(M->getContext(),
- id, Tys, numTys)));
+ cast<Function>(M->getOrInsertFunction(getName(id, Tys),
+ getType(M->getContext(), id, Tys)));
}
// This defines the "Intrinsic::getIntrinsicForGCCBuiltin()" method.
@@ -417,7 +414,7 @@ bool Function::hasAddressTaken(const User* *PutOffender) const {
/// setjmp or other function that gcc recognizes as "returning twice".
///
/// FIXME: Remove after <rdar://problem/8031714> is fixed.
-/// FIXME: Is the obove FIXME valid?
+/// FIXME: Is the above FIXME valid?
bool Function::callsFunctionThatReturnsTwice() const {
const Module *M = this->getParent();
static const char *ReturnsTwiceFns[] = {
diff --git a/contrib/llvm/lib/VMCore/Globals.cpp b/contrib/llvm/lib/VMCore/Globals.cpp
index 60000ad..db008e0 100644
--- a/contrib/llvm/lib/VMCore/Globals.cpp
+++ b/contrib/llvm/lib/VMCore/Globals.cpp
@@ -51,6 +51,7 @@ void GlobalValue::copyAttributesFrom(const GlobalValue *Src) {
setAlignment(Src->getAlignment());
setSection(Src->getSection());
setVisibility(Src->getVisibility());
+ setUnnamedAddr(Src->hasUnnamedAddr());
}
void GlobalValue::setAlignment(unsigned Align) {
@@ -60,6 +61,20 @@ void GlobalValue::setAlignment(unsigned Align) {
Alignment = Log2_32(Align) + 1;
assert(getAlignment() == Align && "Alignment representation error!");
}
+
+bool GlobalValue::isDeclaration() const {
+ // Globals are definitions if they have an initializer.
+ if (const GlobalVariable *GV = dyn_cast<GlobalVariable>(this))
+ return GV->getNumOperands() == 0;
+
+ // Functions are definitions if they have a body.
+ if (const Function *F = dyn_cast<Function>(this))
+ return F->empty();
+
+ // Aliases are always definitions.
+ assert(isa<GlobalAlias>(this));
+ return false;
+}
//===----------------------------------------------------------------------===//
// GlobalVariable Implementation
@@ -201,39 +216,26 @@ void GlobalAlias::eraseFromParent() {
getParent()->getAliasList().erase(this);
}
-bool GlobalAlias::isDeclaration() const {
- const GlobalValue* AV = getAliasedGlobal();
- if (AV)
- return AV->isDeclaration();
- else
- return false;
-}
-
-void GlobalAlias::setAliasee(Constant *Aliasee)
-{
- if (Aliasee)
- assert(Aliasee->getType() == getType() &&
- "Alias and aliasee types should match!");
+void GlobalAlias::setAliasee(Constant *Aliasee) {
+ assert((!Aliasee || Aliasee->getType() == getType()) &&
+ "Alias and aliasee types should match!");
setOperand(0, Aliasee);
}
const GlobalValue *GlobalAlias::getAliasedGlobal() const {
const Constant *C = getAliasee();
- if (C) {
- if (const GlobalValue *GV = dyn_cast<GlobalValue>(C))
- return GV;
- else {
- const ConstantExpr *CE = 0;
- if ((CE = dyn_cast<ConstantExpr>(C)) &&
- (CE->getOpcode() == Instruction::BitCast ||
- CE->getOpcode() == Instruction::GetElementPtr))
- return dyn_cast<GlobalValue>(CE->getOperand(0));
- else
- llvm_unreachable("Unsupported aliasee");
- }
- }
- return 0;
+ if (C == 0) return 0;
+
+ if (const GlobalValue *GV = dyn_cast<GlobalValue>(C))
+ return GV;
+
+ const ConstantExpr *CE = cast<ConstantExpr>(C);
+ assert((CE->getOpcode() == Instruction::BitCast ||
+ CE->getOpcode() == Instruction::GetElementPtr) &&
+ "Unsupported aliasee");
+
+ return dyn_cast<GlobalValue>(CE->getOperand(0));
}
const GlobalValue *GlobalAlias::resolveAliasedGlobal(bool stopOnWeak) const {
@@ -254,7 +256,7 @@ const GlobalValue *GlobalAlias::resolveAliasedGlobal(bool stopOnWeak) const {
GV = GA->getAliasedGlobal();
if (!Visited.insert(GV))
- return NULL;
+ return 0;
}
return GV;
diff --git a/contrib/llvm/lib/VMCore/IRBuilder.cpp b/contrib/llvm/lib/VMCore/IRBuilder.cpp
index f2d469a..ffe961f 100644
--- a/contrib/llvm/lib/VMCore/IRBuilder.cpp
+++ b/contrib/llvm/lib/VMCore/IRBuilder.cpp
@@ -34,7 +34,7 @@ Value *IRBuilderBase::CreateGlobalString(StringRef Str, const Twine &Name) {
return GV;
}
-const Type *IRBuilderBase::getCurrentFunctionReturnType() const {
+Type *IRBuilderBase::getCurrentFunctionReturnType() const {
assert(BB && BB->getParent() && "No current function!");
return BB->getParent()->getReturnType();
}
@@ -52,9 +52,9 @@ Value *IRBuilderBase::getCastedInt8PtrValue(Value *Ptr) {
return BCI;
}
-static CallInst *createCallHelper(Value *Callee, Value *const* Ops,
- unsigned NumOps, IRBuilderBase *Builder) {
- CallInst *CI = CallInst::Create(Callee, Ops, Ops + NumOps, "");
+static CallInst *createCallHelper(Value *Callee, ArrayRef<Value *> Ops,
+ IRBuilderBase *Builder) {
+ CallInst *CI = CallInst::Create(Callee, Ops, "");
Builder->GetInsertBlock()->getInstList().insert(Builder->GetInsertPoint(),CI);
Builder->SetInstDebugLocation(CI);
return CI;
@@ -65,11 +65,11 @@ CreateMemSet(Value *Ptr, Value *Val, Value *Size, unsigned Align,
bool isVolatile, MDNode *TBAATag) {
Ptr = getCastedInt8PtrValue(Ptr);
Value *Ops[] = { Ptr, Val, Size, getInt32(Align), getInt1(isVolatile) };
- const Type *Tys[] = { Ptr->getType(), Size->getType() };
+ Type *Tys[] = { Ptr->getType(), Size->getType() };
Module *M = BB->getParent()->getParent();
- Value *TheFn = Intrinsic::getDeclaration(M, Intrinsic::memset, Tys, 2);
+ Value *TheFn = Intrinsic::getDeclaration(M, Intrinsic::memset, Tys);
- CallInst *CI = createCallHelper(TheFn, Ops, 5, this);
+ CallInst *CI = createCallHelper(TheFn, Ops, this);
// Set the TBAA info if present.
if (TBAATag)
@@ -85,11 +85,11 @@ CreateMemCpy(Value *Dst, Value *Src, Value *Size, unsigned Align,
Src = getCastedInt8PtrValue(Src);
Value *Ops[] = { Dst, Src, Size, getInt32(Align), getInt1(isVolatile) };
- const Type *Tys[] = { Dst->getType(), Src->getType(), Size->getType() };
+ Type *Tys[] = { Dst->getType(), Src->getType(), Size->getType() };
Module *M = BB->getParent()->getParent();
- Value *TheFn = Intrinsic::getDeclaration(M, Intrinsic::memcpy, Tys, 3);
+ Value *TheFn = Intrinsic::getDeclaration(M, Intrinsic::memcpy, Tys);
- CallInst *CI = createCallHelper(TheFn, Ops, 5, this);
+ CallInst *CI = createCallHelper(TheFn, Ops, this);
// Set the TBAA info if present.
if (TBAATag)
@@ -105,11 +105,11 @@ CreateMemMove(Value *Dst, Value *Src, Value *Size, unsigned Align,
Src = getCastedInt8PtrValue(Src);
Value *Ops[] = { Dst, Src, Size, getInt32(Align), getInt1(isVolatile) };
- const Type *Tys[] = { Dst->getType(), Src->getType(), Size->getType() };
+ Type *Tys[] = { Dst->getType(), Src->getType(), Size->getType() };
Module *M = BB->getParent()->getParent();
- Value *TheFn = Intrinsic::getDeclaration(M, Intrinsic::memmove, Tys, 3);
+ Value *TheFn = Intrinsic::getDeclaration(M, Intrinsic::memmove, Tys);
- CallInst *CI = createCallHelper(TheFn, Ops, 5, this);
+ CallInst *CI = createCallHelper(TheFn, Ops, this);
// Set the TBAA info if present.
if (TBAATag)
@@ -130,7 +130,7 @@ CallInst *IRBuilderBase::CreateLifetimeStart(Value *Ptr, ConstantInt *Size) {
Value *Ops[] = { Size, Ptr };
Module *M = BB->getParent()->getParent();
Value *TheFn = Intrinsic::getDeclaration(M, Intrinsic::lifetime_start);
- return createCallHelper(TheFn, Ops, 2, this);
+ return createCallHelper(TheFn, Ops, this);
}
CallInst *IRBuilderBase::CreateLifetimeEnd(Value *Ptr, ConstantInt *Size) {
@@ -145,5 +145,5 @@ CallInst *IRBuilderBase::CreateLifetimeEnd(Value *Ptr, ConstantInt *Size) {
Value *Ops[] = { Size, Ptr };
Module *M = BB->getParent()->getParent();
Value *TheFn = Intrinsic::getDeclaration(M, Intrinsic::lifetime_end);
- return createCallHelper(TheFn, Ops, 2, this);
+ return createCallHelper(TheFn, Ops, this);
}
diff --git a/contrib/llvm/lib/VMCore/InlineAsm.cpp b/contrib/llvm/lib/VMCore/InlineAsm.cpp
index bd3667d..4a03b39 100644
--- a/contrib/llvm/lib/VMCore/InlineAsm.cpp
+++ b/contrib/llvm/lib/VMCore/InlineAsm.cpp
@@ -47,11 +47,11 @@ InlineAsm::InlineAsm(const PointerType *Ty, const std::string &asmString,
}
void InlineAsm::destroyConstant() {
- getRawType()->getContext().pImpl->InlineAsms.remove(this);
+ getType()->getContext().pImpl->InlineAsms.remove(this);
delete this;
}
-const FunctionType *InlineAsm::getFunctionType() const {
+FunctionType *InlineAsm::getFunctionType() const {
return cast<FunctionType>(getType()->getElementType());
}
diff --git a/contrib/llvm/lib/VMCore/Instruction.cpp b/contrib/llvm/lib/VMCore/Instruction.cpp
index 2c8b8b2..02c0757 100644
--- a/contrib/llvm/lib/VMCore/Instruction.cpp
+++ b/contrib/llvm/lib/VMCore/Instruction.cpp
@@ -204,22 +204,10 @@ bool Instruction::isIdenticalToWhenDefined(const Instruction *I) const {
if (const InvokeInst *CI = dyn_cast<InvokeInst>(this))
return CI->getCallingConv() == cast<InvokeInst>(I)->getCallingConv() &&
CI->getAttributes() == cast<InvokeInst>(I)->getAttributes();
- if (const InsertValueInst *IVI = dyn_cast<InsertValueInst>(this)) {
- if (IVI->getNumIndices() != cast<InsertValueInst>(I)->getNumIndices())
- return false;
- for (unsigned i = 0, e = IVI->getNumIndices(); i != e; ++i)
- if (IVI->idx_begin()[i] != cast<InsertValueInst>(I)->idx_begin()[i])
- return false;
- return true;
- }
- if (const ExtractValueInst *EVI = dyn_cast<ExtractValueInst>(this)) {
- if (EVI->getNumIndices() != cast<ExtractValueInst>(I)->getNumIndices())
- return false;
- for (unsigned i = 0, e = EVI->getNumIndices(); i != e; ++i)
- if (EVI->idx_begin()[i] != cast<ExtractValueInst>(I)->idx_begin()[i])
- return false;
- return true;
- }
+ if (const InsertValueInst *IVI = dyn_cast<InsertValueInst>(this))
+ return IVI->getIndices() == cast<InsertValueInst>(I)->getIndices();
+ if (const ExtractValueInst *EVI = dyn_cast<ExtractValueInst>(this))
+ return EVI->getIndices() == cast<ExtractValueInst>(I)->getIndices();
return true;
}
@@ -256,22 +244,10 @@ bool Instruction::isSameOperationAs(const Instruction *I) const {
return CI->getCallingConv() == cast<InvokeInst>(I)->getCallingConv() &&
CI->getAttributes() ==
cast<InvokeInst>(I)->getAttributes();
- if (const InsertValueInst *IVI = dyn_cast<InsertValueInst>(this)) {
- if (IVI->getNumIndices() != cast<InsertValueInst>(I)->getNumIndices())
- return false;
- for (unsigned i = 0, e = IVI->getNumIndices(); i != e; ++i)
- if (IVI->idx_begin()[i] != cast<InsertValueInst>(I)->idx_begin()[i])
- return false;
- return true;
- }
- if (const ExtractValueInst *EVI = dyn_cast<ExtractValueInst>(this)) {
- if (EVI->getNumIndices() != cast<ExtractValueInst>(I)->getNumIndices())
- return false;
- for (unsigned i = 0, e = EVI->getNumIndices(); i != e; ++i)
- if (EVI->idx_begin()[i] != cast<ExtractValueInst>(I)->idx_begin()[i])
- return false;
- return true;
- }
+ if (const InsertValueInst *IVI = dyn_cast<InsertValueInst>(this))
+ return IVI->getIndices() == cast<InsertValueInst>(I)->getIndices();
+ if (const ExtractValueInst *EVI = dyn_cast<ExtractValueInst>(this))
+ return EVI->getIndices() == cast<ExtractValueInst>(I)->getIndices();
return true;
}
@@ -429,8 +405,10 @@ Instruction *Instruction::clone() const {
// Otherwise, enumerate and copy over metadata from the old instruction to the
// new one.
SmallVector<std::pair<unsigned, MDNode*>, 4> TheMDs;
- getAllMetadata(TheMDs);
+ getAllMetadataOtherThanDebugLoc(TheMDs);
for (unsigned i = 0, e = TheMDs.size(); i != e; ++i)
New->setMetadata(TheMDs[i].first, TheMDs[i].second);
+
+ New->setDebugLoc(getDebugLoc());
return New;
}
diff --git a/contrib/llvm/lib/VMCore/Instructions.cpp b/contrib/llvm/lib/VMCore/Instructions.cpp
index 8f4eabe..9baad09 100644
--- a/contrib/llvm/lib/VMCore/Instructions.cpp
+++ b/contrib/llvm/lib/VMCore/Instructions.cpp
@@ -87,11 +87,8 @@ PHINode::PHINode(const PHINode &PN)
: Instruction(PN.getType(), Instruction::PHI,
allocHungoffUses(PN.getNumOperands()), PN.getNumOperands()),
ReservedSpace(PN.getNumOperands()) {
- Use *OL = OperandList;
- for (unsigned i = 0, e = PN.getNumOperands(); i != e; i+=2) {
- OL[i] = PN.getOperand(i);
- OL[i+1] = PN.getOperand(i+1);
- }
+ std::copy(PN.op_begin(), PN.op_end(), op_begin());
+ std::copy(PN.block_begin(), PN.block_end(), block_begin());
SubclassOptionalData = PN.SubclassOptionalData;
}
@@ -99,31 +96,37 @@ PHINode::~PHINode() {
dropHungoffUses();
}
+Use *PHINode::allocHungoffUses(unsigned N) const {
+ // Allocate the array of Uses of the incoming values, followed by a pointer
+ // (with bottom bit set) to the User, followed by the array of pointers to
+ // the incoming basic blocks.
+ size_t size = N * sizeof(Use) + sizeof(Use::UserRef)
+ + N * sizeof(BasicBlock*);
+ Use *Begin = static_cast<Use*>(::operator new(size));
+ Use *End = Begin + N;
+ (void) new(End) Use::UserRef(const_cast<PHINode*>(this), 1);
+ return Use::initTags(Begin, End);
+}
+
// removeIncomingValue - Remove an incoming value. This is useful if a
// predecessor basic block is deleted.
Value *PHINode::removeIncomingValue(unsigned Idx, bool DeletePHIIfEmpty) {
- unsigned NumOps = getNumOperands();
- Use *OL = OperandList;
- assert(Idx*2 < NumOps && "BB not in PHI node!");
- Value *Removed = OL[Idx*2];
+ Value *Removed = getIncomingValue(Idx);
// Move everything after this operand down.
//
// FIXME: we could just swap with the end of the list, then erase. However,
- // client might not expect this to happen. The code as it is thrashes the
+ // clients might not expect this to happen. The code as it is thrashes the
// use/def lists, which is kinda lame.
- for (unsigned i = (Idx+1)*2; i != NumOps; i += 2) {
- OL[i-2] = OL[i];
- OL[i-2+1] = OL[i+1];
- }
+ std::copy(op_begin() + Idx + 1, op_end(), op_begin() + Idx);
+ std::copy(block_begin() + Idx + 1, block_end(), block_begin() + Idx);
// Nuke the last value.
- OL[NumOps-2].set(0);
- OL[NumOps-2+1].set(0);
- NumOperands = NumOps-2;
+ Op<-1>().set(0);
+ --NumOperands;
// If the PHI node is dead, because it has zero entries, nuke it now.
- if (NumOps == 2 && DeletePHIIfEmpty) {
+ if (getNumOperands() == 0 && DeletePHIIfEmpty) {
// If anyone is using this PHI, make them use a dummy value instead...
replaceAllUsesWith(UndefValue::get(getType()));
eraseFromParent();
@@ -137,15 +140,18 @@ Value *PHINode::removeIncomingValue(unsigned Idx, bool DeletePHIIfEmpty) {
///
void PHINode::growOperands() {
unsigned e = getNumOperands();
- // Multiply by 1.5 and round down so the result is still even.
- unsigned NumOps = e + e / 4 * 2;
- if (NumOps < 4) NumOps = 4; // 4 op PHI nodes are VERY common.
+ unsigned NumOps = e + e / 2;
+ if (NumOps < 2) NumOps = 2; // 2 op PHI nodes are VERY common.
+
+ Use *OldOps = op_begin();
+ BasicBlock **OldBlocks = block_begin();
ReservedSpace = NumOps;
- Use *OldOps = OperandList;
- Use *NewOps = allocHungoffUses(NumOps);
- std::copy(OldOps, OldOps + e, NewOps);
- OperandList = NewOps;
+ OperandList = allocHungoffUses(ReservedSpace);
+
+ std::copy(OldOps, OldOps + e, op_begin());
+ std::copy(OldBlocks, OldBlocks + e, block_begin());
+
Use::zap(OldOps, OldOps + e, true);
}
@@ -168,95 +174,42 @@ Value *PHINode::hasConstantValue() const {
CallInst::~CallInst() {
}
-void CallInst::init(Value *Func, Value* const *Params, unsigned NumParams) {
- assert(NumOperands == NumParams+1 && "NumOperands not set up?");
+void CallInst::init(Value *Func, ArrayRef<Value *> Args, const Twine &NameStr) {
+ assert(NumOperands == Args.size() + 1 && "NumOperands not set up?");
Op<-1>() = Func;
+#ifndef NDEBUG
const FunctionType *FTy =
cast<FunctionType>(cast<PointerType>(Func->getType())->getElementType());
- (void)FTy; // silence warning.
- assert((NumParams == FTy->getNumParams() ||
- (FTy->isVarArg() && NumParams > FTy->getNumParams())) &&
+ assert((Args.size() == FTy->getNumParams() ||
+ (FTy->isVarArg() && Args.size() > FTy->getNumParams())) &&
"Calling a function with bad signature!");
- for (unsigned i = 0; i != NumParams; ++i) {
+
+ for (unsigned i = 0; i != Args.size(); ++i)
assert((i >= FTy->getNumParams() ||
- FTy->getParamType(i) == Params[i]->getType()) &&
+ FTy->getParamType(i) == Args[i]->getType()) &&
"Calling a function with a bad signature!");
- OperandList[i] = Params[i];
- }
-}
-
-void CallInst::init(Value *Func, Value *Actual1, Value *Actual2) {
- assert(NumOperands == 3 && "NumOperands not set up?");
- Op<-1>() = Func;
- Op<0>() = Actual1;
- Op<1>() = Actual2;
-
- const FunctionType *FTy =
- cast<FunctionType>(cast<PointerType>(Func->getType())->getElementType());
- (void)FTy; // silence warning.
-
- assert((FTy->getNumParams() == 2 ||
- (FTy->isVarArg() && FTy->getNumParams() < 2)) &&
- "Calling a function with bad signature");
- assert((0 >= FTy->getNumParams() ||
- FTy->getParamType(0) == Actual1->getType()) &&
- "Calling a function with a bad signature!");
- assert((1 >= FTy->getNumParams() ||
- FTy->getParamType(1) == Actual2->getType()) &&
- "Calling a function with a bad signature!");
-}
-
-void CallInst::init(Value *Func, Value *Actual) {
- assert(NumOperands == 2 && "NumOperands not set up?");
- Op<-1>() = Func;
- Op<0>() = Actual;
-
- const FunctionType *FTy =
- cast<FunctionType>(cast<PointerType>(Func->getType())->getElementType());
- (void)FTy; // silence warning.
+#endif
- assert((FTy->getNumParams() == 1 ||
- (FTy->isVarArg() && FTy->getNumParams() == 0)) &&
- "Calling a function with bad signature");
- assert((0 == FTy->getNumParams() ||
- FTy->getParamType(0) == Actual->getType()) &&
- "Calling a function with a bad signature!");
+ std::copy(Args.begin(), Args.end(), op_begin());
+ setName(NameStr);
}
-void CallInst::init(Value *Func) {
+void CallInst::init(Value *Func, const Twine &NameStr) {
assert(NumOperands == 1 && "NumOperands not set up?");
Op<-1>() = Func;
+#ifndef NDEBUG
const FunctionType *FTy =
cast<FunctionType>(cast<PointerType>(Func->getType())->getElementType());
- (void)FTy; // silence warning.
assert(FTy->getNumParams() == 0 && "Calling a function with bad signature");
-}
+#endif
-CallInst::CallInst(Value *Func, Value* Actual, const Twine &Name,
- Instruction *InsertBefore)
- : Instruction(cast<FunctionType>(cast<PointerType>(Func->getType())
- ->getElementType())->getReturnType(),
- Instruction::Call,
- OperandTraits<CallInst>::op_end(this) - 2,
- 2, InsertBefore) {
- init(Func, Actual);
- setName(Name);
+ setName(NameStr);
}
-CallInst::CallInst(Value *Func, Value* Actual, const Twine &Name,
- BasicBlock *InsertAtEnd)
- : Instruction(cast<FunctionType>(cast<PointerType>(Func->getType())
- ->getElementType())->getReturnType(),
- Instruction::Call,
- OperandTraits<CallInst>::op_end(this) - 2,
- 2, InsertAtEnd) {
- init(Func, Actual);
- setName(Name);
-}
CallInst::CallInst(Value *Func, const Twine &Name,
Instruction *InsertBefore)
: Instruction(cast<FunctionType>(cast<PointerType>(Func->getType())
@@ -264,8 +217,7 @@ CallInst::CallInst(Value *Func, const Twine &Name,
Instruction::Call,
OperandTraits<CallInst>::op_end(this) - 1,
1, InsertBefore) {
- init(Func);
- setName(Name);
+ init(Func, Name);
}
CallInst::CallInst(Value *Func, const Twine &Name,
@@ -275,8 +227,7 @@ CallInst::CallInst(Value *Func, const Twine &Name,
Instruction::Call,
OperandTraits<CallInst>::op_end(this) - 1,
1, InsertAtEnd) {
- init(Func);
- setName(Name);
+ init(Func, Name);
}
CallInst::CallInst(const CallInst &CI)
@@ -287,10 +238,7 @@ CallInst::CallInst(const CallInst &CI)
setTailCall(CI.isTailCall());
setCallingConv(CI.getCallingConv());
- Use *OL = OperandList;
- Use *InOL = CI.OperandList;
- for (unsigned i = 0, e = CI.getNumOperands(); i != e; ++i)
- OL[i] = InOL[i];
+ std::copy(CI.op_begin(), CI.op_end(), op_begin());
SubclassOptionalData = CI.SubclassOptionalData;
}
@@ -366,7 +314,7 @@ static Instruction *createMalloc(Instruction *InsertBefore,
// Create the call to Malloc.
BasicBlock* BB = InsertBefore ? InsertBefore->getParent() : InsertAtEnd;
Module* M = BB->getParent()->getParent();
- const Type *BPTy = Type::getInt8PtrTy(BB->getContext());
+ Type *BPTy = Type::getInt8PtrTy(BB->getContext());
Value *MallocFunc = MallocF;
if (!MallocFunc)
// prototype malloc as "void *malloc(size_t)"
@@ -481,27 +429,28 @@ Instruction* CallInst::CreateFree(Value* Source, BasicBlock *InsertAtEnd) {
//===----------------------------------------------------------------------===//
void InvokeInst::init(Value *Fn, BasicBlock *IfNormal, BasicBlock *IfException,
- Value* const *Args, unsigned NumArgs) {
- assert(NumOperands == 3+NumArgs && "NumOperands not set up?");
+ ArrayRef<Value *> Args, const Twine &NameStr) {
+ assert(NumOperands == 3 + Args.size() && "NumOperands not set up?");
Op<-3>() = Fn;
Op<-2>() = IfNormal;
Op<-1>() = IfException;
+
+#ifndef NDEBUG
const FunctionType *FTy =
cast<FunctionType>(cast<PointerType>(Fn->getType())->getElementType());
- (void)FTy; // silence warning.
- assert(((NumArgs == FTy->getNumParams()) ||
- (FTy->isVarArg() && NumArgs > FTy->getNumParams())) &&
+ assert(((Args.size() == FTy->getNumParams()) ||
+ (FTy->isVarArg() && Args.size() > FTy->getNumParams())) &&
"Invoking a function with bad signature");
- Use *OL = OperandList;
- for (unsigned i = 0, e = NumArgs; i != e; i++) {
+ for (unsigned i = 0, e = Args.size(); i != e; i++)
assert((i >= FTy->getNumParams() ||
FTy->getParamType(i) == Args[i]->getType()) &&
"Invoking a function with a bad signature!");
-
- OL[i] = Args[i];
- }
+#endif
+
+ std::copy(Args.begin(), Args.end(), op_begin());
+ setName(NameStr);
}
InvokeInst::InvokeInst(const InvokeInst &II)
@@ -511,9 +460,7 @@ InvokeInst::InvokeInst(const InvokeInst &II)
II.getNumOperands()) {
setAttributes(II.getAttributes());
setCallingConv(II.getCallingConv());
- Use *OL = OperandList, *InOL = II.OperandList;
- for (unsigned i = 0, e = II.getNumOperands(); i != e; ++i)
- OL[i] = InOL[i];
+ std::copy(II.op_begin(), II.op_end(), op_begin());
SubclassOptionalData = II.SubclassOptionalData;
}
@@ -817,7 +764,7 @@ bool AllocaInst::isArrayAllocation() const {
return true;
}
-const Type *AllocaInst::getAllocatedType() const {
+Type *AllocaInst::getAllocatedType() const {
return getType()->getElementType();
}
@@ -1092,7 +1039,7 @@ GetElementPtrInst::GetElementPtrInst(const GetElementPtrInst &GEPI)
GetElementPtrInst::GetElementPtrInst(Value *Ptr, Value *Idx,
const Twine &Name, Instruction *InBe)
: Instruction(PointerType::get(
- checkType(getIndexedType(Ptr->getType(),Idx)), retrieveAddrSpace(Ptr)),
+ checkGEPType(getIndexedType(Ptr->getType(),Idx)), retrieveAddrSpace(Ptr)),
GetElementPtr,
OperandTraits<GetElementPtrInst>::op_end(this) - 2,
2, InBe) {
@@ -1102,7 +1049,7 @@ GetElementPtrInst::GetElementPtrInst(Value *Ptr, Value *Idx,
GetElementPtrInst::GetElementPtrInst(Value *Ptr, Value *Idx,
const Twine &Name, BasicBlock *IAE)
: Instruction(PointerType::get(
- checkType(getIndexedType(Ptr->getType(),Idx)),
+ checkGEPType(getIndexedType(Ptr->getType(),Idx)),
retrieveAddrSpace(Ptr)),
GetElementPtr,
OperandTraits<GetElementPtrInst>::op_end(this) - 2,
@@ -1120,60 +1067,50 @@ GetElementPtrInst::GetElementPtrInst(Value *Ptr, Value *Idx,
/// pointer type.
///
template <typename IndexTy>
-static const Type* getIndexedTypeInternal(const Type *Ptr, IndexTy const *Idxs,
- unsigned NumIdx) {
+static Type *getIndexedTypeInternal(const Type *Ptr, IndexTy const *Idxs,
+ unsigned NumIdx) {
const PointerType *PTy = dyn_cast<PointerType>(Ptr);
if (!PTy) return 0; // Type isn't a pointer type!
- const Type *Agg = PTy->getElementType();
+ Type *Agg = PTy->getElementType();
// Handle the special case of the empty set index set, which is always valid.
if (NumIdx == 0)
return Agg;
// If there is at least one index, the top level type must be sized, otherwise
- // it cannot be 'stepped over'. We explicitly allow abstract types (those
- // that contain opaque types) under the assumption that it will be resolved to
- // a sane type later.
- if (!Agg->isSized() && !Agg->isAbstract())
+ // it cannot be 'stepped over'.
+ if (!Agg->isSized())
return 0;
unsigned CurIdx = 1;
for (; CurIdx != NumIdx; ++CurIdx) {
- const CompositeType *CT = dyn_cast<CompositeType>(Agg);
+ CompositeType *CT = dyn_cast<CompositeType>(Agg);
if (!CT || CT->isPointerTy()) return 0;
IndexTy Index = Idxs[CurIdx];
if (!CT->indexValid(Index)) return 0;
Agg = CT->getTypeAtIndex(Index);
-
- // If the new type forwards to another type, then it is in the middle
- // of being refined to another type (and hence, may have dropped all
- // references to what it was using before). So, use the new forwarded
- // type.
- if (const Type *Ty = Agg->getForwardedType())
- Agg = Ty;
}
return CurIdx == NumIdx ? Agg : 0;
}
-const Type* GetElementPtrInst::getIndexedType(const Type *Ptr,
- Value* const *Idxs,
- unsigned NumIdx) {
+Type *GetElementPtrInst::getIndexedType(const Type *Ptr, Value* const *Idxs,
+ unsigned NumIdx) {
return getIndexedTypeInternal(Ptr, Idxs, NumIdx);
}
-const Type* GetElementPtrInst::getIndexedType(const Type *Ptr,
- Constant* const *Idxs,
- unsigned NumIdx) {
+Type *GetElementPtrInst::getIndexedType(const Type *Ptr,
+ Constant* const *Idxs,
+ unsigned NumIdx) {
return getIndexedTypeInternal(Ptr, Idxs, NumIdx);
}
-const Type* GetElementPtrInst::getIndexedType(const Type *Ptr,
- uint64_t const *Idxs,
- unsigned NumIdx) {
+Type *GetElementPtrInst::getIndexedType(const Type *Ptr,
+ uint64_t const *Idxs,
+ unsigned NumIdx) {
return getIndexedTypeInternal(Ptr, Idxs, NumIdx);
}
-const Type* GetElementPtrInst::getIndexedType(const Type *Ptr, Value *Idx) {
+Type *GetElementPtrInst::getIndexedType(const Type *Ptr, Value *Idx) {
const PointerType *PTy = dyn_cast<PointerType>(Ptr);
if (!PTy) return 0; // Type isn't a pointer type!
@@ -1390,27 +1327,22 @@ int ShuffleVectorInst::getMaskValue(unsigned i) const {
// InsertValueInst Class
//===----------------------------------------------------------------------===//
-void InsertValueInst::init(Value *Agg, Value *Val, const unsigned *Idx,
- unsigned NumIdx, const Twine &Name) {
+void InsertValueInst::init(Value *Agg, Value *Val, ArrayRef<unsigned> Idxs,
+ const Twine &Name) {
assert(NumOperands == 2 && "NumOperands not initialized?");
- assert(ExtractValueInst::getIndexedType(Agg->getType(), Idx, Idx + NumIdx) ==
- Val->getType() && "Inserted value must match indexed type!");
- Op<0>() = Agg;
- Op<1>() = Val;
- Indices.append(Idx, Idx + NumIdx);
- setName(Name);
-}
+ // There's no fundamental reason why we require at least one index
+ // (other than weirdness with &*IdxBegin being invalid; see
+ // getelementptr's init routine for example). But there's no
+ // present need to support it.
+ assert(Idxs.size() > 0 && "InsertValueInst must have at least one index");
-void InsertValueInst::init(Value *Agg, Value *Val, unsigned Idx,
- const Twine &Name) {
- assert(NumOperands == 2 && "NumOperands not initialized?");
- assert(ExtractValueInst::getIndexedType(Agg->getType(), Idx) == Val->getType()
- && "Inserted value must match indexed type!");
+ assert(ExtractValueInst::getIndexedType(Agg->getType(), Idxs) ==
+ Val->getType() && "Inserted value must match indexed type!");
Op<0>() = Agg;
Op<1>() = Val;
- Indices.push_back(Idx);
+ Indices.append(Idxs.begin(), Idxs.end());
setName(Name);
}
@@ -1423,44 +1355,18 @@ InsertValueInst::InsertValueInst(const InsertValueInst &IVI)
SubclassOptionalData = IVI.SubclassOptionalData;
}
-InsertValueInst::InsertValueInst(Value *Agg,
- Value *Val,
- unsigned Idx,
- const Twine &Name,
- Instruction *InsertBefore)
- : Instruction(Agg->getType(), InsertValue,
- OperandTraits<InsertValueInst>::op_begin(this),
- 2, InsertBefore) {
- init(Agg, Val, Idx, Name);
-}
-
-InsertValueInst::InsertValueInst(Value *Agg,
- Value *Val,
- unsigned Idx,
- const Twine &Name,
- BasicBlock *InsertAtEnd)
- : Instruction(Agg->getType(), InsertValue,
- OperandTraits<InsertValueInst>::op_begin(this),
- 2, InsertAtEnd) {
- init(Agg, Val, Idx, Name);
-}
-
//===----------------------------------------------------------------------===//
// ExtractValueInst Class
//===----------------------------------------------------------------------===//
-void ExtractValueInst::init(const unsigned *Idx, unsigned NumIdx,
- const Twine &Name) {
+void ExtractValueInst::init(ArrayRef<unsigned> Idxs, const Twine &Name) {
assert(NumOperands == 1 && "NumOperands not initialized?");
- Indices.append(Idx, Idx + NumIdx);
- setName(Name);
-}
-
-void ExtractValueInst::init(unsigned Idx, const Twine &Name) {
- assert(NumOperands == 1 && "NumOperands not initialized?");
+ // There's no fundamental reason why we require at least one index.
+ // But there's no present need to support it.
+ assert(Idxs.size() > 0 && "ExtractValueInst must have at least one index");
- Indices.push_back(Idx);
+ Indices.append(Idxs.begin(), Idxs.end());
setName(Name);
}
@@ -1476,10 +1382,9 @@ ExtractValueInst::ExtractValueInst(const ExtractValueInst &EVI)
// A null type is returned if the indices are invalid for the specified
// pointer type.
//
-const Type* ExtractValueInst::getIndexedType(const Type *Agg,
- const unsigned *Idxs,
- unsigned NumIdx) {
- for (unsigned CurIdx = 0; CurIdx != NumIdx; ++CurIdx) {
+Type *ExtractValueInst::getIndexedType(const Type *Agg,
+ ArrayRef<unsigned> Idxs) {
+ for (unsigned CurIdx = 0; CurIdx != Idxs.size(); ++CurIdx) {
unsigned Index = Idxs[CurIdx];
// We can't use CompositeType::indexValid(Index) here.
// indexValid() always returns true for arrays because getelementptr allows
@@ -1499,20 +1404,8 @@ const Type* ExtractValueInst::getIndexedType(const Type *Agg,
}
Agg = cast<CompositeType>(Agg)->getTypeAtIndex(Index);
-
- // If the new type forwards to another type, then it is in the middle
- // of being refined to another type (and hence, may have dropped all
- // references to what it was using before). So, use the new forwarded
- // type.
- if (const Type *Ty = Agg->getForwardedType())
- Agg = Ty;
}
- return Agg;
-}
-
-const Type* ExtractValueInst::getIndexedType(const Type *Agg,
- unsigned Idx) {
- return getIndexedType(Agg, &Idx, 1);
+ return const_cast<Type*>(Agg);
}
//===----------------------------------------------------------------------===//
diff --git a/contrib/llvm/lib/VMCore/LLVMContext.cpp b/contrib/llvm/lib/VMCore/LLVMContext.cpp
index 1bd497d..ebd1e0a 100644
--- a/contrib/llvm/lib/VMCore/LLVMContext.cpp
+++ b/contrib/llvm/lib/VMCore/LLVMContext.cpp
@@ -39,6 +39,10 @@ LLVMContext::LLVMContext() : pImpl(new LLVMContextImpl(*this)) {
// Create the 'tbaa' metadata kind.
unsigned TBAAID = getMDKindID("tbaa");
assert(TBAAID == MD_tbaa && "tbaa kind id drifted"); (void)TBAAID;
+
+ // Create the 'prof' metadata kind.
+ unsigned ProfID = getMDKindID("prof");
+ assert(ProfID == MD_prof && "prof kind id drifted"); (void)ProfID;
}
LLVMContext::~LLVMContext() { delete pImpl; }
diff --git a/contrib/llvm/lib/VMCore/LLVMContextImpl.cpp b/contrib/llvm/lib/VMCore/LLVMContextImpl.cpp
index ccb8dc5..504b372 100644
--- a/contrib/llvm/lib/VMCore/LLVMContextImpl.cpp
+++ b/contrib/llvm/lib/VMCore/LLVMContextImpl.cpp
@@ -13,6 +13,7 @@
#include "LLVMContextImpl.h"
#include "llvm/Module.h"
+#include "llvm/ADT/STLExtras.h"
#include <algorithm>
using namespace llvm;
@@ -31,14 +32,10 @@ LLVMContextImpl::LLVMContextImpl(LLVMContext &C)
Int8Ty(C, 8),
Int16Ty(C, 16),
Int32Ty(C, 32),
- Int64Ty(C, 64),
- AlwaysOpaqueTy(new OpaqueType(C)) {
+ Int64Ty(C, 64) {
InlineAsmDiagHandler = 0;
InlineAsmDiagContext = 0;
-
- // Make sure the AlwaysOpaqueTy stays alive as long as the Context.
- AlwaysOpaqueTy->addRef();
- OpaqueTypes.insert(AlwaysOpaqueTy);
+ NamedStructTypesUniqueID = 0;
}
namespace {
@@ -58,9 +55,7 @@ LLVMContextImpl::~LLVMContextImpl() {
// will try to remove itself from OwnedModules set. This would cause
// iterator invalidation if we iterated on the set directly.
std::vector<Module*> Modules(OwnedModules.begin(), OwnedModules.end());
- for (std::vector<Module*>::iterator I = Modules.begin(), E = Modules.end();
- I != E; ++I)
- delete *I;
+ DeleteContainerPointers(Modules);
std::for_each(ExprConstants.map_begin(), ExprConstants.map_end(),
DropReferences());
@@ -78,38 +73,22 @@ LLVMContextImpl::~LLVMContextImpl() {
NullPtrConstants.freeConstants();
UndefValueConstants.freeConstants();
InlineAsms.freeConstants();
- for (IntMapTy::iterator I = IntConstants.begin(), E = IntConstants.end();
- I != E; ++I) {
- delete I->second;
- }
- for (FPMapTy::iterator I = FPConstants.begin(), E = FPConstants.end();
- I != E; ++I) {
- delete I->second;
- }
- AlwaysOpaqueTy->dropRef();
- for (OpaqueTypesTy::iterator I = OpaqueTypes.begin(), E = OpaqueTypes.end();
- I != E; ++I) {
- (*I)->AbstractTypeUsers.clear();
- delete *I;
- }
+ DeleteContainerSeconds(IntConstants);
+ DeleteContainerSeconds(FPConstants);
+
// Destroy MDNodes. ~MDNode can move and remove nodes between the MDNodeSet
// and the NonUniquedMDNodes sets, so copy the values out first.
SmallVector<MDNode*, 8> MDNodes;
MDNodes.reserve(MDNodeSet.size() + NonUniquedMDNodes.size());
for (FoldingSetIterator<MDNode> I = MDNodeSet.begin(), E = MDNodeSet.end();
- I != E; ++I) {
+ I != E; ++I)
MDNodes.push_back(&*I);
- }
MDNodes.append(NonUniquedMDNodes.begin(), NonUniquedMDNodes.end());
for (SmallVectorImpl<MDNode *>::iterator I = MDNodes.begin(),
- E = MDNodes.end(); I != E; ++I) {
+ E = MDNodes.end(); I != E; ++I)
(*I)->destroy();
- }
assert(MDNodeSet.empty() && NonUniquedMDNodes.empty() &&
"Destroying all MDNodes didn't empty the Context's sets.");
// Destroy MDStrings.
- for (StringMap<MDString*>::iterator I = MDStringCache.begin(),
- E = MDStringCache.end(); I != E; ++I) {
- delete I->second;
- }
+ DeleteContainerSeconds(MDStringCache);
}
diff --git a/contrib/llvm/lib/VMCore/LLVMContextImpl.h b/contrib/llvm/lib/VMCore/LLVMContextImpl.h
index 6ea4b48..06a6f2a 100644
--- a/contrib/llvm/lib/VMCore/LLVMContextImpl.h
+++ b/contrib/llvm/lib/VMCore/LLVMContextImpl.h
@@ -15,17 +15,16 @@
#ifndef LLVM_LLVMCONTEXT_IMPL_H
#define LLVM_LLVMCONTEXT_IMPL_H
+#include "llvm/LLVMContext.h"
#include "ConstantsContext.h"
#include "LeaksContext.h"
-#include "TypesContext.h"
-#include "llvm/LLVMContext.h"
#include "llvm/Constants.h"
#include "llvm/DerivedTypes.h"
#include "llvm/Metadata.h"
-#include "llvm/Assembly/Writer.h"
#include "llvm/Support/ValueHandle.h"
#include "llvm/ADT/APFloat.h"
#include "llvm/ADT/APInt.h"
+#include "llvm/ADT/ArrayRef.h"
#include "llvm/ADT/DenseMap.h"
#include "llvm/ADT/FoldingSet.h"
#include "llvm/ADT/SmallPtrSet.h"
@@ -139,27 +138,30 @@ public:
// on Context destruction.
SmallPtrSet<MDNode*, 1> NonUniquedMDNodes;
- ConstantUniqueMap<char, Type, ConstantAggregateZero> AggZeroConstants;
+ ConstantUniqueMap<char, char, Type, ConstantAggregateZero> AggZeroConstants;
- typedef ConstantUniqueMap<std::vector<Constant*>, ArrayType,
- ConstantArray, true /*largekey*/> ArrayConstantsTy;
+ typedef ConstantUniqueMap<std::vector<Constant*>, ArrayRef<Constant*>,
+ ArrayType, ConstantArray, true /*largekey*/> ArrayConstantsTy;
ArrayConstantsTy ArrayConstants;
- typedef ConstantUniqueMap<std::vector<Constant*>, StructType,
- ConstantStruct, true /*largekey*/> StructConstantsTy;
+ typedef ConstantUniqueMap<std::vector<Constant*>, ArrayRef<Constant*>,
+ StructType, ConstantStruct, true /*largekey*/> StructConstantsTy;
StructConstantsTy StructConstants;
- typedef ConstantUniqueMap<std::vector<Constant*>, VectorType,
- ConstantVector> VectorConstantsTy;
+ typedef ConstantUniqueMap<std::vector<Constant*>, ArrayRef<Constant*>,
+ VectorType, ConstantVector> VectorConstantsTy;
VectorConstantsTy VectorConstants;
- ConstantUniqueMap<char, PointerType, ConstantPointerNull> NullPtrConstants;
- ConstantUniqueMap<char, Type, UndefValue> UndefValueConstants;
+ ConstantUniqueMap<char, char, PointerType, ConstantPointerNull>
+ NullPtrConstants;
+ ConstantUniqueMap<char, char, Type, UndefValue> UndefValueConstants;
DenseMap<std::pair<Function*, BasicBlock*> , BlockAddress*> BlockAddresses;
- ConstantUniqueMap<ExprMapKeyType, Type, ConstantExpr> ExprConstants;
+ ConstantUniqueMap<ExprMapKeyType, const ExprMapKeyType&, Type, ConstantExpr>
+ ExprConstants;
- ConstantUniqueMap<InlineAsmKeyType, PointerType, InlineAsm> InlineAsms;
+ ConstantUniqueMap<InlineAsmKeyType, const InlineAsmKeyType&, PointerType,
+ InlineAsm> InlineAsms;
ConstantInt *TheTrueVal;
ConstantInt *TheFalseVal;
@@ -167,41 +169,27 @@ public:
LeakDetectorImpl<Value> LLVMObjects;
// Basic type instances.
- const Type VoidTy;
- const Type LabelTy;
- const Type FloatTy;
- const Type DoubleTy;
- const Type MetadataTy;
- const Type X86_FP80Ty;
- const Type FP128Ty;
- const Type PPC_FP128Ty;
- const Type X86_MMXTy;
- const IntegerType Int1Ty;
- const IntegerType Int8Ty;
- const IntegerType Int16Ty;
- const IntegerType Int32Ty;
- const IntegerType Int64Ty;
-
- // Concrete/Abstract TypeDescriptions - We lazily calculate type descriptions
- // for types as they are needed. Because resolution of types must invalidate
- // all of the abstract type descriptions, we keep them in a separate map to
- // make this easy.
- TypePrinting ConcreteTypeDescriptions;
- TypePrinting AbstractTypeDescriptions;
-
- TypeMap<ArrayValType, ArrayType> ArrayTypes;
- TypeMap<VectorValType, VectorType> VectorTypes;
- TypeMap<PointerValType, PointerType> PointerTypes;
- TypeMap<FunctionValType, FunctionType> FunctionTypes;
- TypeMap<StructValType, StructType> StructTypes;
- TypeMap<IntegerValType, IntegerType> IntegerTypes;
-
- // Opaque types are not structurally uniqued, so don't use TypeMap.
- typedef SmallPtrSet<const OpaqueType*, 8> OpaqueTypesTy;
- OpaqueTypesTy OpaqueTypes;
-
- /// Used as an abstract type that will never be resolved.
- OpaqueType *const AlwaysOpaqueTy;
+ Type VoidTy, LabelTy, FloatTy, DoubleTy, MetadataTy;
+ Type X86_FP80Ty, FP128Ty, PPC_FP128Ty, X86_MMXTy;
+ IntegerType Int1Ty, Int8Ty, Int16Ty, Int32Ty, Int64Ty;
+
+
+ /// TypeAllocator - All dynamically allocated types are allocated from this.
+ /// They live forever until the context is torn down.
+ BumpPtrAllocator TypeAllocator;
+
+ DenseMap<unsigned, IntegerType*> IntegerTypes;
+
+ // TODO: Optimize FunctionTypes/AnonStructTypes!
+ std::map<std::vector<Type*>, FunctionType*> FunctionTypes;
+ std::map<std::vector<Type*>, StructType*> AnonStructTypes;
+ StringMap<StructType*> NamedStructTypes;
+ unsigned NamedStructTypesUniqueID;
+
+ DenseMap<std::pair<Type *, uint64_t>, ArrayType*> ArrayTypes;
+ DenseMap<std::pair<Type *, unsigned>, VectorType*> VectorTypes;
+ DenseMap<Type*, PointerType*> PointerTypes; // Pointers in AddrSpace = 0
+ DenseMap<std::pair<Type*, unsigned>, PointerType*> ASPointerTypes;
/// ValueHandles - This map keeps track of all of the value handles that are
diff --git a/contrib/llvm/lib/VMCore/Metadata.cpp b/contrib/llvm/lib/VMCore/Metadata.cpp
index eb719e5..ace4dc2 100644
--- a/contrib/llvm/lib/VMCore/Metadata.cpp
+++ b/contrib/llvm/lib/VMCore/Metadata.cpp
@@ -19,6 +19,7 @@
#include "llvm/ADT/DenseMap.h"
#include "llvm/ADT/StringMap.h"
#include "llvm/ADT/SmallString.h"
+#include "llvm/ADT/STLExtras.h"
#include "SymbolTableListTraitsImpl.h"
#include "llvm/Support/LeakDetector.h"
#include "llvm/Support/ValueHandle.h"
diff --git a/contrib/llvm/lib/VMCore/Module.cpp b/contrib/llvm/lib/VMCore/Module.cpp
index 341e527..be2fcb8 100644
--- a/contrib/llvm/lib/VMCore/Module.cpp
+++ b/contrib/llvm/lib/VMCore/Module.cpp
@@ -17,12 +17,12 @@
#include "llvm/DerivedTypes.h"
#include "llvm/GVMaterializer.h"
#include "llvm/LLVMContext.h"
+#include "llvm/ADT/DenseSet.h"
#include "llvm/ADT/SmallString.h"
#include "llvm/ADT/STLExtras.h"
#include "llvm/ADT/StringExtras.h"
#include "llvm/Support/LeakDetector.h"
#include "SymbolTableListTraitsImpl.h"
-#include "llvm/TypeSymbolTable.h"
#include <algorithm>
#include <cstdarg>
#include <cstdlib>
@@ -60,7 +60,6 @@ template class llvm::SymbolTableListTraits<GlobalAlias, Module>;
Module::Module(StringRef MID, LLVMContext& C)
: Context(C), Materializer(NULL), ModuleID(MID) {
ValSymTab = new ValueSymbolTable();
- TypeSymTab = new TypeSymbolTable();
NamedMDSymTab = new StringMap<NamedMDNode *>();
Context.addModule(this);
}
@@ -74,11 +73,10 @@ Module::~Module() {
LibraryList.clear();
NamedMDList.clear();
delete ValSymTab;
- delete TypeSymTab;
delete static_cast<StringMap<NamedMDNode *> *>(NamedMDSymTab);
}
-/// Target endian information...
+/// Target endian information.
Module::Endianness Module::getEndianness() const {
StringRef temp = DataLayout;
Module::Endianness ret = AnyEndianness;
@@ -218,8 +216,8 @@ Constant *Module::getOrInsertFunction(StringRef Name,
va_start(Args, RetTy);
// Build the list of argument types...
- std::vector<const Type*> ArgTys;
- while (const Type *ArgTy = va_arg(Args, const Type*))
+ std::vector<Type*> ArgTys;
+ while (Type *ArgTy = va_arg(Args, Type*))
ArgTys.push_back(ArgTy);
va_end(Args);
@@ -236,8 +234,8 @@ Constant *Module::getOrInsertFunction(StringRef Name,
va_start(Args, RetTy);
// Build the list of argument types...
- std::vector<const Type*> ArgTys;
- while (const Type *ArgTy = va_arg(Args, const Type*))
+ std::vector<Type*> ArgTys;
+ while (Type *ArgTy = va_arg(Args, Type*))
ArgTys.push_back(ArgTy);
va_end(Args);
@@ -340,51 +338,6 @@ void Module::eraseNamedMetadata(NamedMDNode *NMD) {
NamedMDList.erase(NMD);
}
-//===----------------------------------------------------------------------===//
-// Methods for easy access to the types in the module.
-//
-
-
-// addTypeName - Insert an entry in the symbol table mapping Str to Type. If
-// there is already an entry for this name, true is returned and the symbol
-// table is not modified.
-//
-bool Module::addTypeName(StringRef Name, const Type *Ty) {
- TypeSymbolTable &ST = getTypeSymbolTable();
-
- if (ST.lookup(Name)) return true; // Already in symtab...
-
- // Not in symbol table? Set the name with the Symtab as an argument so the
- // type knows what to update...
- ST.insert(Name, Ty);
-
- return false;
-}
-
-/// getTypeByName - Return the type with the specified name in this module, or
-/// null if there is none by that name.
-const Type *Module::getTypeByName(StringRef Name) const {
- const TypeSymbolTable &ST = getTypeSymbolTable();
- return cast_or_null<Type>(ST.lookup(Name));
-}
-
-// getTypeName - If there is at least one entry in the symbol table for the
-// specified type, return it.
-//
-std::string Module::getTypeName(const Type *Ty) const {
- const TypeSymbolTable &ST = getTypeSymbolTable();
-
- TypeSymbolTable::const_iterator TI = ST.begin();
- TypeSymbolTable::const_iterator TE = ST.end();
- if ( TI == TE ) return ""; // No names for types
-
- while (TI != TE && TI->second != Ty)
- ++TI;
-
- if (TI != TE) // Must have found an entry!
- return TI->first;
- return ""; // Must not have found anything...
-}
//===----------------------------------------------------------------------===//
// Methods to control the materialization of GlobalValues in the Module.
@@ -471,3 +424,130 @@ void Module::removeLibrary(StringRef Lib) {
return;
}
}
+
+//===----------------------------------------------------------------------===//
+// Type finding functionality.
+//===----------------------------------------------------------------------===//
+
+namespace {
+ /// TypeFinder - Walk over a module, identifying all of the types that are
+ /// used by the module.
+ class TypeFinder {
+ // To avoid walking constant expressions multiple times and other IR
+ // objects, we keep several helper maps.
+ DenseSet<const Value*> VisitedConstants;
+ DenseSet<const Type*> VisitedTypes;
+
+ std::vector<StructType*> &StructTypes;
+ public:
+ TypeFinder(std::vector<StructType*> &structTypes)
+ : StructTypes(structTypes) {}
+
+ void run(const Module &M) {
+ // Get types from global variables.
+ for (Module::const_global_iterator I = M.global_begin(),
+ E = M.global_end(); I != E; ++I) {
+ incorporateType(I->getType());
+ if (I->hasInitializer())
+ incorporateValue(I->getInitializer());
+ }
+
+ // Get types from aliases.
+ for (Module::const_alias_iterator I = M.alias_begin(),
+ E = M.alias_end(); I != E; ++I) {
+ incorporateType(I->getType());
+ if (const Value *Aliasee = I->getAliasee())
+ incorporateValue(Aliasee);
+ }
+
+ SmallVector<std::pair<unsigned, MDNode*>, 4> MDForInst;
+
+ // Get types from functions.
+ for (Module::const_iterator FI = M.begin(), E = M.end(); FI != E; ++FI) {
+ incorporateType(FI->getType());
+
+ for (Function::const_iterator BB = FI->begin(), E = FI->end();
+ BB != E;++BB)
+ for (BasicBlock::const_iterator II = BB->begin(),
+ E = BB->end(); II != E; ++II) {
+ const Instruction &I = *II;
+ // Incorporate the type of the instruction and all its operands.
+ incorporateType(I.getType());
+ for (User::const_op_iterator OI = I.op_begin(), OE = I.op_end();
+ OI != OE; ++OI)
+ incorporateValue(*OI);
+
+ // Incorporate types hiding in metadata.
+ I.getAllMetadataOtherThanDebugLoc(MDForInst);
+ for (unsigned i = 0, e = MDForInst.size(); i != e; ++i)
+ incorporateMDNode(MDForInst[i].second);
+ MDForInst.clear();
+ }
+ }
+
+ for (Module::const_named_metadata_iterator I = M.named_metadata_begin(),
+ E = M.named_metadata_end(); I != E; ++I) {
+ const NamedMDNode *NMD = I;
+ for (unsigned i = 0, e = NMD->getNumOperands(); i != e; ++i)
+ incorporateMDNode(NMD->getOperand(i));
+ }
+ }
+
+ private:
+ void incorporateType(Type *Ty) {
+ // Check to see if we're already visited this type.
+ if (!VisitedTypes.insert(Ty).second)
+ return;
+
+ // If this is a structure or opaque type, add a name for the type.
+ if (StructType *STy = dyn_cast<StructType>(Ty))
+ StructTypes.push_back(STy);
+
+ // Recursively walk all contained types.
+ for (Type::subtype_iterator I = Ty->subtype_begin(),
+ E = Ty->subtype_end(); I != E; ++I)
+ incorporateType(*I);
+ }
+
+ /// incorporateValue - This method is used to walk operand lists finding
+ /// types hiding in constant expressions and other operands that won't be
+ /// walked in other ways. GlobalValues, basic blocks, instructions, and
+ /// inst operands are all explicitly enumerated.
+ void incorporateValue(const Value *V) {
+ if (const MDNode *M = dyn_cast<MDNode>(V))
+ return incorporateMDNode(M);
+ if (!isa<Constant>(V) || isa<GlobalValue>(V)) return;
+
+ // Already visited?
+ if (!VisitedConstants.insert(V).second)
+ return;
+
+ // Check this type.
+ incorporateType(V->getType());
+
+ // Look in operands for types.
+ const User *U = cast<User>(V);
+ for (Constant::const_op_iterator I = U->op_begin(),
+ E = U->op_end(); I != E;++I)
+ incorporateValue(*I);
+ }
+
+ void incorporateMDNode(const MDNode *V) {
+
+ // Already visited?
+ if (!VisitedConstants.insert(V).second)
+ return;
+
+ // Look in operands for types.
+ for (unsigned i = 0, e = V->getNumOperands(); i != e; ++i)
+ if (Value *Op = V->getOperand(i))
+ incorporateValue(Op);
+ }
+ };
+} // end anonymous namespace
+
+void Module::findUsedStructTypes(std::vector<StructType*> &StructTypes) const {
+ TypeFinder(StructTypes).run(*this);
+}
+
+
diff --git a/contrib/llvm/lib/VMCore/Type.cpp b/contrib/llvm/lib/VMCore/Type.cpp
index e4496db..f874d1b 100644
--- a/contrib/llvm/lib/VMCore/Type.cpp
+++ b/contrib/llvm/lib/VMCore/Type.cpp
@@ -12,95 +12,17 @@
//===----------------------------------------------------------------------===//
#include "LLVMContextImpl.h"
-#include "llvm/DerivedTypes.h"
-#include "llvm/Constants.h"
-#include "llvm/Assembly/Writer.h"
-#include "llvm/LLVMContext.h"
-#include "llvm/Metadata.h"
-#include "llvm/ADT/ArrayRef.h"
-#include "llvm/ADT/DepthFirstIterator.h"
-#include "llvm/ADT/StringExtras.h"
-#include "llvm/ADT/SCCIterator.h"
-#include "llvm/ADT/STLExtras.h"
-#include "llvm/Support/Compiler.h"
-#include "llvm/Support/Debug.h"
-#include "llvm/Support/ErrorHandling.h"
-#include "llvm/Support/ManagedStatic.h"
-#include "llvm/Support/MathExtras.h"
-#include "llvm/Support/raw_ostream.h"
-#include "llvm/Support/Threading.h"
+#include "llvm/Module.h"
#include <algorithm>
#include <cstdarg>
+#include "llvm/ADT/SmallString.h"
using namespace llvm;
-// DEBUG_MERGE_TYPES - Enable this #define to see how and when derived types are
-// created and later destroyed, all in an effort to make sure that there is only
-// a single canonical version of a type.
-//
-// #define DEBUG_MERGE_TYPES 1
-
-AbstractTypeUser::~AbstractTypeUser() {}
-
-void AbstractTypeUser::setType(Value *V, const Type *NewTy) {
- V->VTy = NewTy;
-}
-
//===----------------------------------------------------------------------===//
// Type Class Implementation
//===----------------------------------------------------------------------===//
-/// Because of the way Type subclasses are allocated, this function is necessary
-/// to use the correct kind of "delete" operator to deallocate the Type object.
-/// Some type objects (FunctionTy, StructTy) allocate additional space
-/// after the space for their derived type to hold the contained types array of
-/// PATypeHandles. Using this allocation scheme means all the PATypeHandles are
-/// allocated with the type object, decreasing allocations and eliminating the
-/// need for a std::vector to be used in the Type class itself.
-/// @brief Type destruction function
-void Type::destroy() const {
- // Nothing calls getForwardedType from here on.
- if (ForwardType && ForwardType->isAbstract()) {
- ForwardType->dropRef();
- ForwardType = NULL;
- }
-
- // Structures and Functions allocate their contained types past the end of
- // the type object itself. These need to be destroyed differently than the
- // other types.
- if (this->isFunctionTy() || this->isStructTy()) {
- // First, make sure we destruct any PATypeHandles allocated by these
- // subclasses. They must be manually destructed.
- for (unsigned i = 0; i < NumContainedTys; ++i)
- ContainedTys[i].PATypeHandle::~PATypeHandle();
-
- // Now call the destructor for the subclass directly because we're going
- // to delete this as an array of char.
- if (this->isFunctionTy())
- static_cast<const FunctionType*>(this)->FunctionType::~FunctionType();
- else {
- assert(isStructTy());
- static_cast<const StructType*>(this)->StructType::~StructType();
- }
-
- // Finally, remove the memory as an array deallocation of the chars it was
- // constructed from.
- operator delete(const_cast<Type *>(this));
-
- return;
- } else if (const OpaqueType *opaque_this = dyn_cast<OpaqueType>(this)) {
- LLVMContextImpl *pImpl = this->getContext().pImpl;
- pImpl->OpaqueTypes.erase(opaque_this);
- }
-
- // For all the other type subclasses, there is either no contained types or
- // just one (all Sequentials). For Sequentials, the PATypeHandle is not
- // allocated past the type object, its included directly in the SequentialType
- // class. This means we can safely just do "normal" delete of this object and
- // all the destructors that need to run will be run.
- delete this;
-}
-
-const Type *Type::getPrimitiveType(LLVMContext &C, TypeID IDNumber) {
+Type *Type::getPrimitiveType(LLVMContext &C, TypeID IDNumber) {
switch (IDNumber) {
case VoidTyID : return getVoidTy(C);
case FloatTyID : return getFloatTy(C);
@@ -116,15 +38,6 @@ const Type *Type::getPrimitiveType(LLVMContext &C, TypeID IDNumber) {
}
}
-const Type *Type::getVAArgsPromotedType(LLVMContext &C) const {
- if (ID == IntegerTyID && getSubclassData() < 32)
- return Type::getInt32Ty(C);
- else if (ID == FloatTyID)
- return Type::getDoubleTy(C);
- else
- return this;
-}
-
/// getScalarType - If this is a vector type, return the element type,
/// otherwise return this.
const Type *Type::getScalarType() const {
@@ -262,13 +175,17 @@ bool Type::isSizedDerivedType() const {
if (const ArrayType *ATy = dyn_cast<ArrayType>(this))
return ATy->getElementType()->isSized();
- if (const VectorType *PTy = dyn_cast<VectorType>(this))
- return PTy->getElementType()->isSized();
+ if (const VectorType *VTy = dyn_cast<VectorType>(this))
+ return VTy->getElementType()->isSized();
if (!this->isStructTy())
return false;
- // Okay, our struct is sized if all of the elements are...
+ // Opaque structs have no size.
+ if (cast<StructType>(this)->isOpaque())
+ return false;
+
+ // Okay, our struct is sized if all of the elements are.
for (subtype_iterator I = subtype_begin(), E = subtype_end(); I != E; ++I)
if (!(*I)->isSized())
return false;
@@ -276,696 +193,335 @@ bool Type::isSizedDerivedType() const {
return true;
}
-/// getForwardedTypeInternal - This method is used to implement the union-find
-/// algorithm for when a type is being forwarded to another type.
-const Type *Type::getForwardedTypeInternal() const {
- assert(ForwardType && "This type is not being forwarded to another type!");
-
- // Check to see if the forwarded type has been forwarded on. If so, collapse
- // the forwarding links.
- const Type *RealForwardedType = ForwardType->getForwardedType();
- if (!RealForwardedType)
- return ForwardType; // No it's not forwarded again
-
- // Yes, it is forwarded again. First thing, add the reference to the new
- // forward type.
- if (RealForwardedType->isAbstract())
- RealForwardedType->addRef();
-
- // Now drop the old reference. This could cause ForwardType to get deleted.
- // ForwardType must be abstract because only abstract types can have their own
- // ForwardTypes.
- ForwardType->dropRef();
-
- // Return the updated type.
- ForwardType = RealForwardedType;
- return ForwardType;
-}
-
-void Type::refineAbstractType(const DerivedType *OldTy, const Type *NewTy) {
- llvm_unreachable("Attempting to refine a derived type!");
-}
-void Type::typeBecameConcrete(const DerivedType *AbsTy) {
- llvm_unreachable("DerivedType is already a concrete type!");
-}
-
-
-std::string Type::getDescription() const {
- LLVMContextImpl *pImpl = getContext().pImpl;
- TypePrinting &Map =
- isAbstract() ?
- pImpl->AbstractTypeDescriptions :
- pImpl->ConcreteTypeDescriptions;
-
- std::string DescStr;
- raw_string_ostream DescOS(DescStr);
- Map.print(this, DescOS);
- return DescOS.str();
-}
-
-
-bool StructType::indexValid(const Value *V) const {
- // Structure indexes require 32-bit integer constants.
- if (V->getType()->isIntegerTy(32))
- if (const ConstantInt *CU = dyn_cast<ConstantInt>(V))
- return indexValid(CU->getZExtValue());
- return false;
-}
-
-bool StructType::indexValid(unsigned V) const {
- return V < NumContainedTys;
-}
-
-// getTypeAtIndex - Given an index value into the type, return the type of the
-// element. For a structure type, this must be a constant value...
-//
-const Type *StructType::getTypeAtIndex(const Value *V) const {
- unsigned Idx = (unsigned)cast<ConstantInt>(V)->getZExtValue();
- return getTypeAtIndex(Idx);
-}
-
-const Type *StructType::getTypeAtIndex(unsigned Idx) const {
- assert(indexValid(Idx) && "Invalid structure index!");
- return ContainedTys[Idx];
-}
-
-
//===----------------------------------------------------------------------===//
// Primitive 'Type' data
//===----------------------------------------------------------------------===//
-const Type *Type::getVoidTy(LLVMContext &C) {
- return &C.pImpl->VoidTy;
-}
-
-const Type *Type::getLabelTy(LLVMContext &C) {
- return &C.pImpl->LabelTy;
-}
-
-const Type *Type::getFloatTy(LLVMContext &C) {
- return &C.pImpl->FloatTy;
-}
-
-const Type *Type::getDoubleTy(LLVMContext &C) {
- return &C.pImpl->DoubleTy;
-}
-
-const Type *Type::getMetadataTy(LLVMContext &C) {
- return &C.pImpl->MetadataTy;
-}
-
-const Type *Type::getX86_FP80Ty(LLVMContext &C) {
- return &C.pImpl->X86_FP80Ty;
-}
-
-const Type *Type::getFP128Ty(LLVMContext &C) {
- return &C.pImpl->FP128Ty;
-}
-
-const Type *Type::getPPC_FP128Ty(LLVMContext &C) {
- return &C.pImpl->PPC_FP128Ty;
-}
-
-const Type *Type::getX86_MMXTy(LLVMContext &C) {
- return &C.pImpl->X86_MMXTy;
-}
-
-const IntegerType *Type::getIntNTy(LLVMContext &C, unsigned N) {
+Type *Type::getVoidTy(LLVMContext &C) { return &C.pImpl->VoidTy; }
+Type *Type::getLabelTy(LLVMContext &C) { return &C.pImpl->LabelTy; }
+Type *Type::getFloatTy(LLVMContext &C) { return &C.pImpl->FloatTy; }
+Type *Type::getDoubleTy(LLVMContext &C) { return &C.pImpl->DoubleTy; }
+Type *Type::getMetadataTy(LLVMContext &C) { return &C.pImpl->MetadataTy; }
+Type *Type::getX86_FP80Ty(LLVMContext &C) { return &C.pImpl->X86_FP80Ty; }
+Type *Type::getFP128Ty(LLVMContext &C) { return &C.pImpl->FP128Ty; }
+Type *Type::getPPC_FP128Ty(LLVMContext &C) { return &C.pImpl->PPC_FP128Ty; }
+Type *Type::getX86_MMXTy(LLVMContext &C) { return &C.pImpl->X86_MMXTy; }
+
+IntegerType *Type::getInt1Ty(LLVMContext &C) { return &C.pImpl->Int1Ty; }
+IntegerType *Type::getInt8Ty(LLVMContext &C) { return &C.pImpl->Int8Ty; }
+IntegerType *Type::getInt16Ty(LLVMContext &C) { return &C.pImpl->Int16Ty; }
+IntegerType *Type::getInt32Ty(LLVMContext &C) { return &C.pImpl->Int32Ty; }
+IntegerType *Type::getInt64Ty(LLVMContext &C) { return &C.pImpl->Int64Ty; }
+
+IntegerType *Type::getIntNTy(LLVMContext &C, unsigned N) {
return IntegerType::get(C, N);
}
-const IntegerType *Type::getInt1Ty(LLVMContext &C) {
- return &C.pImpl->Int1Ty;
-}
-
-const IntegerType *Type::getInt8Ty(LLVMContext &C) {
- return &C.pImpl->Int8Ty;
-}
-
-const IntegerType *Type::getInt16Ty(LLVMContext &C) {
- return &C.pImpl->Int16Ty;
-}
-
-const IntegerType *Type::getInt32Ty(LLVMContext &C) {
- return &C.pImpl->Int32Ty;
-}
-
-const IntegerType *Type::getInt64Ty(LLVMContext &C) {
- return &C.pImpl->Int64Ty;
-}
-
-const PointerType *Type::getFloatPtrTy(LLVMContext &C, unsigned AS) {
+PointerType *Type::getFloatPtrTy(LLVMContext &C, unsigned AS) {
return getFloatTy(C)->getPointerTo(AS);
}
-const PointerType *Type::getDoublePtrTy(LLVMContext &C, unsigned AS) {
+PointerType *Type::getDoublePtrTy(LLVMContext &C, unsigned AS) {
return getDoubleTy(C)->getPointerTo(AS);
}
-const PointerType *Type::getX86_FP80PtrTy(LLVMContext &C, unsigned AS) {
+PointerType *Type::getX86_FP80PtrTy(LLVMContext &C, unsigned AS) {
return getX86_FP80Ty(C)->getPointerTo(AS);
}
-const PointerType *Type::getFP128PtrTy(LLVMContext &C, unsigned AS) {
+PointerType *Type::getFP128PtrTy(LLVMContext &C, unsigned AS) {
return getFP128Ty(C)->getPointerTo(AS);
}
-const PointerType *Type::getPPC_FP128PtrTy(LLVMContext &C, unsigned AS) {
+PointerType *Type::getPPC_FP128PtrTy(LLVMContext &C, unsigned AS) {
return getPPC_FP128Ty(C)->getPointerTo(AS);
}
-const PointerType *Type::getX86_MMXPtrTy(LLVMContext &C, unsigned AS) {
+PointerType *Type::getX86_MMXPtrTy(LLVMContext &C, unsigned AS) {
return getX86_MMXTy(C)->getPointerTo(AS);
}
-const PointerType *Type::getIntNPtrTy(LLVMContext &C, unsigned N, unsigned AS) {
+PointerType *Type::getIntNPtrTy(LLVMContext &C, unsigned N, unsigned AS) {
return getIntNTy(C, N)->getPointerTo(AS);
}
-const PointerType *Type::getInt1PtrTy(LLVMContext &C, unsigned AS) {
+PointerType *Type::getInt1PtrTy(LLVMContext &C, unsigned AS) {
return getInt1Ty(C)->getPointerTo(AS);
}
-const PointerType *Type::getInt8PtrTy(LLVMContext &C, unsigned AS) {
+PointerType *Type::getInt8PtrTy(LLVMContext &C, unsigned AS) {
return getInt8Ty(C)->getPointerTo(AS);
}
-const PointerType *Type::getInt16PtrTy(LLVMContext &C, unsigned AS) {
+PointerType *Type::getInt16PtrTy(LLVMContext &C, unsigned AS) {
return getInt16Ty(C)->getPointerTo(AS);
}
-const PointerType *Type::getInt32PtrTy(LLVMContext &C, unsigned AS) {
+PointerType *Type::getInt32PtrTy(LLVMContext &C, unsigned AS) {
return getInt32Ty(C)->getPointerTo(AS);
}
-const PointerType *Type::getInt64PtrTy(LLVMContext &C, unsigned AS) {
+PointerType *Type::getInt64PtrTy(LLVMContext &C, unsigned AS) {
return getInt64Ty(C)->getPointerTo(AS);
}
+
//===----------------------------------------------------------------------===//
-// Derived Type Constructors
+// IntegerType Implementation
//===----------------------------------------------------------------------===//
-/// isValidReturnType - Return true if the specified type is valid as a return
-/// type.
-bool FunctionType::isValidReturnType(const Type *RetTy) {
- return !RetTy->isFunctionTy() && !RetTy->isLabelTy() &&
- !RetTy->isMetadataTy();
+IntegerType *IntegerType::get(LLVMContext &C, unsigned NumBits) {
+ assert(NumBits >= MIN_INT_BITS && "bitwidth too small");
+ assert(NumBits <= MAX_INT_BITS && "bitwidth too large");
+
+ // Check for the built-in integer types
+ switch (NumBits) {
+ case 1: return cast<IntegerType>(Type::getInt1Ty(C));
+ case 8: return cast<IntegerType>(Type::getInt8Ty(C));
+ case 16: return cast<IntegerType>(Type::getInt16Ty(C));
+ case 32: return cast<IntegerType>(Type::getInt32Ty(C));
+ case 64: return cast<IntegerType>(Type::getInt64Ty(C));
+ default:
+ break;
+ }
+
+ IntegerType *&Entry = C.pImpl->IntegerTypes[NumBits];
+
+ if (Entry == 0)
+ Entry = new (C.pImpl->TypeAllocator) IntegerType(C, NumBits);
+
+ return Entry;
}
-/// isValidArgumentType - Return true if the specified type is valid as an
-/// argument type.
-bool FunctionType::isValidArgumentType(const Type *ArgTy) {
- return ArgTy->isFirstClassType() || ArgTy->isOpaqueTy();
+bool IntegerType::isPowerOf2ByteWidth() const {
+ unsigned BitWidth = getBitWidth();
+ return (BitWidth > 7) && isPowerOf2_32(BitWidth);
}
-FunctionType::FunctionType(const Type *Result,
- ArrayRef<const Type*> Params,
+APInt IntegerType::getMask() const {
+ return APInt::getAllOnesValue(getBitWidth());
+}
+
+//===----------------------------------------------------------------------===//
+// FunctionType Implementation
+//===----------------------------------------------------------------------===//
+
+FunctionType::FunctionType(const Type *Result, ArrayRef<Type*> Params,
bool IsVarArgs)
- : DerivedType(Result->getContext(), FunctionTyID), isVarArgs(IsVarArgs) {
- ContainedTys = reinterpret_cast<PATypeHandle*>(this+1);
- NumContainedTys = Params.size() + 1; // + 1 for result type
+ : Type(Result->getContext(), FunctionTyID) {
+ Type **SubTys = reinterpret_cast<Type**>(this+1);
assert(isValidReturnType(Result) && "invalid return type for function");
+ setSubclassData(IsVarArgs);
+ SubTys[0] = const_cast<Type*>(Result);
- bool isAbstract = Result->isAbstract();
- new (&ContainedTys[0]) PATypeHandle(Result, this);
-
- for (unsigned i = 0; i != Params.size(); ++i) {
+ for (unsigned i = 0, e = Params.size(); i != e; ++i) {
assert(isValidArgumentType(Params[i]) &&
"Not a valid type for function argument!");
- new (&ContainedTys[i+1]) PATypeHandle(Params[i], this);
- isAbstract |= Params[i]->isAbstract();
+ SubTys[i+1] = Params[i];
}
- // Calculate whether or not this type is abstract
- setAbstract(isAbstract);
+ ContainedTys = SubTys;
+ NumContainedTys = Params.size() + 1; // + 1 for result type
}
-StructType::StructType(LLVMContext &C,
- ArrayRef<const Type*> Types, bool isPacked)
- : CompositeType(C, StructTyID) {
- ContainedTys = reinterpret_cast<PATypeHandle*>(this + 1);
- NumContainedTys = Types.size();
- setSubclassData(isPacked);
- bool isAbstract = false;
- for (unsigned i = 0; i < Types.size(); ++i) {
- assert(Types[i] && "<null> type for structure field!");
- assert(isValidElementType(Types[i]) &&
- "Invalid type for structure element!");
- new (&ContainedTys[i]) PATypeHandle(Types[i], this);
- isAbstract |= Types[i]->isAbstract();
+// FunctionType::get - The factory function for the FunctionType class.
+FunctionType *FunctionType::get(const Type *ReturnType,
+ ArrayRef<Type*> Params, bool isVarArg) {
+ // TODO: This is brutally slow.
+ std::vector<Type*> Key;
+ Key.reserve(Params.size()+2);
+ Key.push_back(const_cast<Type*>(ReturnType));
+ for (unsigned i = 0, e = Params.size(); i != e; ++i)
+ Key.push_back(const_cast<Type*>(Params[i]));
+ if (isVarArg)
+ Key.push_back(0);
+
+ LLVMContextImpl *pImpl = ReturnType->getContext().pImpl;
+ FunctionType *&FT = pImpl->FunctionTypes[Key];
+
+ if (FT == 0) {
+ FT = (FunctionType*) pImpl->TypeAllocator.
+ Allocate(sizeof(FunctionType) + sizeof(Type*)*(Params.size()+1),
+ AlignOf<FunctionType>::Alignment);
+ new (FT) FunctionType(ReturnType, Params, isVarArg);
}
- // Calculate whether or not this type is abstract
- setAbstract(isAbstract);
-}
-
-ArrayType::ArrayType(const Type *ElType, uint64_t NumEl)
- : SequentialType(ArrayTyID, ElType) {
- NumElements = NumEl;
-
- // Calculate whether or not this type is abstract
- setAbstract(ElType->isAbstract());
-}
-
-VectorType::VectorType(const Type *ElType, unsigned NumEl)
- : SequentialType(VectorTyID, ElType) {
- NumElements = NumEl;
- setAbstract(ElType->isAbstract());
- assert(NumEl > 0 && "NumEl of a VectorType must be greater than 0");
- assert(isValidElementType(ElType) &&
- "Elements of a VectorType must be a primitive type");
-
-}
-
-
-PointerType::PointerType(const Type *E, unsigned AddrSpace)
- : SequentialType(PointerTyID, E) {
- AddressSpace = AddrSpace;
- // Calculate whether or not this type is abstract
- setAbstract(E->isAbstract());
-}
-
-OpaqueType::OpaqueType(LLVMContext &C) : DerivedType(C, OpaqueTyID) {
- setAbstract(true);
-#ifdef DEBUG_MERGE_TYPES
- DEBUG(dbgs() << "Derived new type: " << *this << "\n");
-#endif
+ return FT;
}
-void PATypeHolder::destroy() {
- Ty = 0;
-}
-// dropAllTypeUses - When this (abstract) type is resolved to be equal to
-// another (more concrete) type, we must eliminate all references to other
-// types, to avoid some circular reference problems.
-void DerivedType::dropAllTypeUses() {
- if (NumContainedTys != 0) {
- // The type must stay abstract. To do this, we insert a pointer to a type
- // that will never get resolved, thus will always be abstract.
- ContainedTys[0] = getContext().pImpl->AlwaysOpaqueTy;
-
- // Change the rest of the types to be Int32Ty's. It doesn't matter what we
- // pick so long as it doesn't point back to this type. We choose something
- // concrete to avoid overhead for adding to AbstractTypeUser lists and
- // stuff.
- const Type *ConcreteTy = Type::getInt32Ty(getContext());
- for (unsigned i = 1, e = NumContainedTys; i != e; ++i)
- ContainedTys[i] = ConcreteTy;
- }
+FunctionType *FunctionType::get(const Type *Result, bool isVarArg) {
+ return get(Result, ArrayRef<Type *>(), isVarArg);
}
-namespace {
-
-/// TypePromotionGraph and graph traits - this is designed to allow us to do
-/// efficient SCC processing of type graphs. This is the exact same as
-/// GraphTraits<Type*>, except that we pretend that concrete types have no
-/// children to avoid processing them.
-struct TypePromotionGraph {
- Type *Ty;
- TypePromotionGraph(Type *T) : Ty(T) {}
-};
-
-}
-
-namespace llvm {
- template <> struct GraphTraits<TypePromotionGraph> {
- typedef Type NodeType;
- typedef Type::subtype_iterator ChildIteratorType;
-
- static inline NodeType *getEntryNode(TypePromotionGraph G) { return G.Ty; }
- static inline ChildIteratorType child_begin(NodeType *N) {
- if (N->isAbstract())
- return N->subtype_begin();
- // No need to process children of concrete types.
- return N->subtype_end();
- }
- static inline ChildIteratorType child_end(NodeType *N) {
- return N->subtype_end();
- }
- };
+/// isValidReturnType - Return true if the specified type is valid as a return
+/// type.
+bool FunctionType::isValidReturnType(const Type *RetTy) {
+ return !RetTy->isFunctionTy() && !RetTy->isLabelTy() &&
+ !RetTy->isMetadataTy();
}
-
-// PromoteAbstractToConcrete - This is a recursive function that walks a type
-// graph calculating whether or not a type is abstract.
-//
-void Type::PromoteAbstractToConcrete() {
- if (!isAbstract()) return;
-
- scc_iterator<TypePromotionGraph> SI = scc_begin(TypePromotionGraph(this));
- scc_iterator<TypePromotionGraph> SE = scc_end (TypePromotionGraph(this));
-
- for (; SI != SE; ++SI) {
- std::vector<Type*> &SCC = *SI;
-
- // Concrete types are leaves in the tree. Since an SCC will either be all
- // abstract or all concrete, we only need to check one type.
- if (!SCC[0]->isAbstract()) continue;
-
- if (SCC[0]->isOpaqueTy())
- return; // Not going to be concrete, sorry.
-
- // If all of the children of all of the types in this SCC are concrete,
- // then this SCC is now concrete as well. If not, neither this SCC, nor
- // any parent SCCs will be concrete, so we might as well just exit.
- for (unsigned i = 0, e = SCC.size(); i != e; ++i)
- for (Type::subtype_iterator CI = SCC[i]->subtype_begin(),
- E = SCC[i]->subtype_end(); CI != E; ++CI)
- if ((*CI)->isAbstract())
- // If the child type is in our SCC, it doesn't make the entire SCC
- // abstract unless there is a non-SCC abstract type.
- if (std::find(SCC.begin(), SCC.end(), *CI) == SCC.end())
- return; // Not going to be concrete, sorry.
-
- // Okay, we just discovered this whole SCC is now concrete, mark it as
- // such!
- for (unsigned i = 0, e = SCC.size(); i != e; ++i) {
- assert(SCC[i]->isAbstract() && "Why are we processing concrete types?");
-
- SCC[i]->setAbstract(false);
- }
-
- for (unsigned i = 0, e = SCC.size(); i != e; ++i) {
- assert(!SCC[i]->isAbstract() && "Concrete type became abstract?");
- // The type just became concrete, notify all users!
- cast<DerivedType>(SCC[i])->notifyUsesThatTypeBecameConcrete();
- }
- }
+/// isValidArgumentType - Return true if the specified type is valid as an
+/// argument type.
+bool FunctionType::isValidArgumentType(const Type *ArgTy) {
+ return ArgTy->isFirstClassType();
}
-
//===----------------------------------------------------------------------===//
-// Type Structural Equality Testing
+// StructType Implementation
//===----------------------------------------------------------------------===//
-// TypesEqual - Two types are considered structurally equal if they have the
-// same "shape": Every level and element of the types have identical primitive
-// ID's, and the graphs have the same edges/nodes in them. Nodes do not have to
-// be pointer equals to be equivalent though. This uses an optimistic algorithm
-// that assumes that two graphs are the same until proven otherwise.
-//
-static bool TypesEqual(const Type *Ty, const Type *Ty2,
- std::map<const Type *, const Type *> &EqTypes) {
- if (Ty == Ty2) return true;
- if (Ty->getTypeID() != Ty2->getTypeID()) return false;
- if (Ty->isOpaqueTy())
- return false; // Two unequal opaque types are never equal
-
- std::map<const Type*, const Type*>::iterator It = EqTypes.find(Ty);
- if (It != EqTypes.end())
- return It->second == Ty2; // Looping back on a type, check for equality
-
- // Otherwise, add the mapping to the table to make sure we don't get
- // recursion on the types...
- EqTypes.insert(It, std::make_pair(Ty, Ty2));
-
- // Two really annoying special cases that breaks an otherwise nice simple
- // algorithm is the fact that arraytypes have sizes that differentiates types,
- // and that function types can be varargs or not. Consider this now.
- //
- if (const IntegerType *ITy = dyn_cast<IntegerType>(Ty)) {
- const IntegerType *ITy2 = cast<IntegerType>(Ty2);
- return ITy->getBitWidth() == ITy2->getBitWidth();
- }
-
- if (const PointerType *PTy = dyn_cast<PointerType>(Ty)) {
- const PointerType *PTy2 = cast<PointerType>(Ty2);
- return PTy->getAddressSpace() == PTy2->getAddressSpace() &&
- TypesEqual(PTy->getElementType(), PTy2->getElementType(), EqTypes);
+// Primitive Constructors.
+
+StructType *StructType::get(LLVMContext &Context, ArrayRef<Type*> ETypes,
+ bool isPacked) {
+ // FIXME: std::vector is horribly inefficient for this probe.
+ std::vector<Type*> Key;
+ for (unsigned i = 0, e = ETypes.size(); i != e; ++i) {
+ assert(isValidElementType(ETypes[i]) &&
+ "Invalid type for structure element!");
+ Key.push_back(ETypes[i]);
}
+ if (isPacked)
+ Key.push_back(0);
- if (const StructType *STy = dyn_cast<StructType>(Ty)) {
- const StructType *STy2 = cast<StructType>(Ty2);
- if (STy->getNumElements() != STy2->getNumElements()) return false;
- if (STy->isPacked() != STy2->isPacked()) return false;
- for (unsigned i = 0, e = STy2->getNumElements(); i != e; ++i)
- if (!TypesEqual(STy->getElementType(i), STy2->getElementType(i), EqTypes))
- return false;
- return true;
- }
+ StructType *&ST = Context.pImpl->AnonStructTypes[Key];
+ if (ST) return ST;
- if (const ArrayType *ATy = dyn_cast<ArrayType>(Ty)) {
- const ArrayType *ATy2 = cast<ArrayType>(Ty2);
- return ATy->getNumElements() == ATy2->getNumElements() &&
- TypesEqual(ATy->getElementType(), ATy2->getElementType(), EqTypes);
- }
+ // Value not found. Create a new type!
+ ST = new (Context.pImpl->TypeAllocator) StructType(Context);
+ ST->setSubclassData(SCDB_IsAnonymous); // Anonymous struct.
+ ST->setBody(ETypes, isPacked);
+ return ST;
+}
+
+void StructType::setBody(ArrayRef<Type*> Elements, bool isPacked) {
+ assert(isOpaque() && "Struct body already set!");
- if (const VectorType *PTy = dyn_cast<VectorType>(Ty)) {
- const VectorType *PTy2 = cast<VectorType>(Ty2);
- return PTy->getNumElements() == PTy2->getNumElements() &&
- TypesEqual(PTy->getElementType(), PTy2->getElementType(), EqTypes);
- }
+ setSubclassData(getSubclassData() | SCDB_HasBody);
+ if (isPacked)
+ setSubclassData(getSubclassData() | SCDB_Packed);
- if (const FunctionType *FTy = dyn_cast<FunctionType>(Ty)) {
- const FunctionType *FTy2 = cast<FunctionType>(Ty2);
- if (FTy->isVarArg() != FTy2->isVarArg() ||
- FTy->getNumParams() != FTy2->getNumParams() ||
- !TypesEqual(FTy->getReturnType(), FTy2->getReturnType(), EqTypes))
- return false;
- for (unsigned i = 0, e = FTy2->getNumParams(); i != e; ++i) {
- if (!TypesEqual(FTy->getParamType(i), FTy2->getParamType(i), EqTypes))
- return false;
- }
- return true;
- }
+ Type **Elts = getContext().pImpl->
+ TypeAllocator.Allocate<Type*>(Elements.size());
+ memcpy(Elts, Elements.data(), sizeof(Elements[0])*Elements.size());
- llvm_unreachable("Unknown derived type!");
- return false;
-}
-
-namespace llvm { // in namespace llvm so findable by ADL
-static bool TypesEqual(const Type *Ty, const Type *Ty2) {
- std::map<const Type *, const Type *> EqTypes;
- return ::TypesEqual(Ty, Ty2, EqTypes);
-}
-}
-
-// AbstractTypeHasCycleThrough - Return true there is a path from CurTy to
-// TargetTy in the type graph. We know that Ty is an abstract type, so if we
-// ever reach a non-abstract type, we know that we don't need to search the
-// subgraph.
-static bool AbstractTypeHasCycleThrough(const Type *TargetTy, const Type *CurTy,
- SmallPtrSet<const Type*, 128> &VisitedTypes) {
- if (TargetTy == CurTy) return true;
- if (!CurTy->isAbstract()) return false;
-
- if (!VisitedTypes.insert(CurTy))
- return false; // Already been here.
-
- for (Type::subtype_iterator I = CurTy->subtype_begin(),
- E = CurTy->subtype_end(); I != E; ++I)
- if (AbstractTypeHasCycleThrough(TargetTy, *I, VisitedTypes))
- return true;
- return false;
+ ContainedTys = Elts;
+ NumContainedTys = Elements.size();
}
-static bool ConcreteTypeHasCycleThrough(const Type *TargetTy, const Type *CurTy,
- SmallPtrSet<const Type*, 128> &VisitedTypes) {
- if (TargetTy == CurTy) return true;
-
- if (!VisitedTypes.insert(CurTy))
- return false; // Already been here.
-
- for (Type::subtype_iterator I = CurTy->subtype_begin(),
- E = CurTy->subtype_end(); I != E; ++I)
- if (ConcreteTypeHasCycleThrough(TargetTy, *I, VisitedTypes))
- return true;
- return false;
+StructType *StructType::createNamed(LLVMContext &Context, StringRef Name) {
+ StructType *ST = new (Context.pImpl->TypeAllocator) StructType(Context);
+ if (!Name.empty())
+ ST->setName(Name);
+ return ST;
}
-/// TypeHasCycleThroughItself - Return true if the specified type has
-/// a cycle back to itself.
+void StructType::setName(StringRef Name) {
+ if (Name == getName()) return;
-namespace llvm { // in namespace llvm so it's findable by ADL
-static bool TypeHasCycleThroughItself(const Type *Ty) {
- SmallPtrSet<const Type*, 128> VisitedTypes;
-
- if (Ty->isAbstract()) { // Optimized case for abstract types.
- for (Type::subtype_iterator I = Ty->subtype_begin(), E = Ty->subtype_end();
- I != E; ++I)
- if (AbstractTypeHasCycleThrough(Ty, *I, VisitedTypes))
- return true;
- } else {
- for (Type::subtype_iterator I = Ty->subtype_begin(), E = Ty->subtype_end();
- I != E; ++I)
- if (ConcreteTypeHasCycleThrough(Ty, *I, VisitedTypes))
- return true;
+ // If this struct already had a name, remove its symbol table entry.
+ if (SymbolTableEntry) {
+ getContext().pImpl->NamedStructTypes.erase(getName());
+ SymbolTableEntry = 0;
}
- return false;
-}
-}
-
-//===----------------------------------------------------------------------===//
-// Function Type Factory and Value Class...
-//
-const IntegerType *IntegerType::get(LLVMContext &C, unsigned NumBits) {
- assert(NumBits >= MIN_INT_BITS && "bitwidth too small");
- assert(NumBits <= MAX_INT_BITS && "bitwidth too large");
-
- // Check for the built-in integer types
- switch (NumBits) {
- case 1: return cast<IntegerType>(Type::getInt1Ty(C));
- case 8: return cast<IntegerType>(Type::getInt8Ty(C));
- case 16: return cast<IntegerType>(Type::getInt16Ty(C));
- case 32: return cast<IntegerType>(Type::getInt32Ty(C));
- case 64: return cast<IntegerType>(Type::getInt64Ty(C));
- default:
- break;
- }
-
- LLVMContextImpl *pImpl = C.pImpl;
- IntegerValType IVT(NumBits);
- IntegerType *ITy = 0;
+ // If this is just removing the name, we're done.
+ if (Name.empty())
+ return;
- // First, see if the type is already in the table, for which
- // a reader lock suffices.
- ITy = pImpl->IntegerTypes.get(IVT);
-
- if (!ITy) {
- // Value not found. Derive a new type!
- ITy = new IntegerType(C, NumBits);
- pImpl->IntegerTypes.add(IVT, ITy);
+ // Look up the entry for the name.
+ StringMapEntry<StructType*> *Entry =
+ &getContext().pImpl->NamedStructTypes.GetOrCreateValue(Name);
+
+ // While we have a name collision, try a random rename.
+ if (Entry->getValue()) {
+ SmallString<64> TempStr(Name);
+ TempStr.push_back('.');
+ raw_svector_ostream TmpStream(TempStr);
+
+ do {
+ TempStr.resize(Name.size()+1);
+ TmpStream.resync();
+ TmpStream << getContext().pImpl->NamedStructTypesUniqueID++;
+
+ Entry = &getContext().pImpl->
+ NamedStructTypes.GetOrCreateValue(TmpStream.str());
+ } while (Entry->getValue());
}
-#ifdef DEBUG_MERGE_TYPES
- DEBUG(dbgs() << "Derived new type: " << *ITy << "\n");
-#endif
- return ITy;
-}
-bool IntegerType::isPowerOf2ByteWidth() const {
- unsigned BitWidth = getBitWidth();
- return (BitWidth > 7) && isPowerOf2_32(BitWidth);
+ // Okay, we found an entry that isn't used. It's us!
+ Entry->setValue(this);
+
+ SymbolTableEntry = Entry;
}
-APInt IntegerType::getMask() const {
- return APInt::getAllOnesValue(getBitWidth());
-}
+//===----------------------------------------------------------------------===//
+// StructType Helper functions.
-FunctionValType FunctionValType::get(const FunctionType *FT) {
- // Build up a FunctionValType
- std::vector<const Type *> ParamTypes;
- ParamTypes.reserve(FT->getNumParams());
- for (unsigned i = 0, e = FT->getNumParams(); i != e; ++i)
- ParamTypes.push_back(FT->getParamType(i));
- return FunctionValType(FT->getReturnType(), ParamTypes, FT->isVarArg());
+StructType *StructType::get(LLVMContext &Context, bool isPacked) {
+ return get(Context, llvm::ArrayRef<Type*>(), isPacked);
}
-
-// FunctionType::get - The factory function for the FunctionType class...
-FunctionType *FunctionType::get(const Type *ReturnType,
- ArrayRef<const Type*> Params,
- bool isVarArg) {
- FunctionValType VT(ReturnType, Params, isVarArg);
- FunctionType *FT = 0;
-
- LLVMContextImpl *pImpl = ReturnType->getContext().pImpl;
-
- FT = pImpl->FunctionTypes.get(VT);
-
- if (!FT) {
- FT = (FunctionType*) operator new(sizeof(FunctionType) +
- sizeof(PATypeHandle)*(Params.size()+1));
- new (FT) FunctionType(ReturnType, Params, isVarArg);
- pImpl->FunctionTypes.add(VT, FT);
+StructType *StructType::get(Type *type, ...) {
+ assert(type != 0 && "Cannot create a struct type with no elements with this");
+ LLVMContext &Ctx = type->getContext();
+ va_list ap;
+ SmallVector<llvm::Type*, 8> StructFields;
+ va_start(ap, type);
+ while (type) {
+ StructFields.push_back(type);
+ type = va_arg(ap, llvm::Type*);
}
-
-#ifdef DEBUG_MERGE_TYPES
- DEBUG(dbgs() << "Derived new type: " << FT << "\n");
-#endif
- return FT;
+ return llvm::StructType::get(Ctx, StructFields);
}
-ArrayType *ArrayType::get(const Type *ElementType, uint64_t NumElements) {
- assert(ElementType && "Can't get array of <null> types!");
- assert(isValidElementType(ElementType) && "Invalid type for array element!");
-
- ArrayValType AVT(ElementType, NumElements);
- ArrayType *AT = 0;
-
- LLVMContextImpl *pImpl = ElementType->getContext().pImpl;
-
- AT = pImpl->ArrayTypes.get(AVT);
-
- if (!AT) {
- // Value not found. Derive a new type!
- pImpl->ArrayTypes.add(AVT, AT = new ArrayType(ElementType, NumElements));
- }
-#ifdef DEBUG_MERGE_TYPES
- DEBUG(dbgs() << "Derived new type: " << *AT << "\n");
-#endif
- return AT;
+StructType *StructType::createNamed(LLVMContext &Context, StringRef Name,
+ ArrayRef<Type*> Elements, bool isPacked) {
+ StructType *ST = createNamed(Context, Name);
+ ST->setBody(Elements, isPacked);
+ return ST;
}
-bool ArrayType::isValidElementType(const Type *ElemTy) {
- return !ElemTy->isVoidTy() && !ElemTy->isLabelTy() &&
- !ElemTy->isMetadataTy() && !ElemTy->isFunctionTy();
+StructType *StructType::createNamed(StringRef Name, ArrayRef<Type*> Elements,
+ bool isPacked) {
+ assert(!Elements.empty() &&
+ "This method may not be invoked with an empty list");
+ return createNamed(Elements[0]->getContext(), Name, Elements, isPacked);
}
-VectorType *VectorType::get(const Type *ElementType, unsigned NumElements) {
- assert(ElementType && "Can't get vector of <null> types!");
-
- VectorValType PVT(ElementType, NumElements);
- VectorType *PT = 0;
-
- LLVMContextImpl *pImpl = ElementType->getContext().pImpl;
-
- PT = pImpl->VectorTypes.get(PVT);
-
- if (!PT) {
- pImpl->VectorTypes.add(PVT, PT = new VectorType(ElementType, NumElements));
+StructType *StructType::createNamed(StringRef Name, Type *type, ...) {
+ assert(type != 0 && "Cannot create a struct type with no elements with this");
+ LLVMContext &Ctx = type->getContext();
+ va_list ap;
+ SmallVector<llvm::Type*, 8> StructFields;
+ va_start(ap, type);
+ while (type) {
+ StructFields.push_back(type);
+ type = va_arg(ap, llvm::Type*);
}
-#ifdef DEBUG_MERGE_TYPES
- DEBUG(dbgs() << "Derived new type: " << *PT << "\n");
-#endif
- return PT;
-}
-
-bool VectorType::isValidElementType(const Type *ElemTy) {
- return ElemTy->isIntegerTy() || ElemTy->isFloatingPointTy() ||
- ElemTy->isOpaqueTy();
+ return llvm::StructType::createNamed(Ctx, Name, StructFields);
}
-//===----------------------------------------------------------------------===//
-// Struct Type Factory...
-//
-
-StructType *StructType::get(LLVMContext &Context,
- ArrayRef<const Type*> ETypes,
- bool isPacked) {
- StructValType STV(ETypes, isPacked);
- StructType *ST = 0;
-
- LLVMContextImpl *pImpl = Context.pImpl;
+StringRef StructType::getName() const {
+ assert(!isAnonymous() && "Anonymous structs never have names");
+ if (SymbolTableEntry == 0) return StringRef();
- ST = pImpl->StructTypes.get(STV);
-
- if (!ST) {
- // Value not found. Derive a new type!
- ST = (StructType*) operator new(sizeof(StructType) +
- sizeof(PATypeHandle) * ETypes.size());
- new (ST) StructType(Context, ETypes, isPacked);
- pImpl->StructTypes.add(STV, ST);
- }
-#ifdef DEBUG_MERGE_TYPES
- DEBUG(dbgs() << "Derived new type: " << *ST << "\n");
-#endif
- return ST;
+ return ((StringMapEntry<StructType*> *)SymbolTableEntry)->getKey();
}
-StructType *StructType::get(LLVMContext &Context, const Type *type, ...) {
+void StructType::setBody(Type *type, ...) {
+ assert(type != 0 && "Cannot create a struct type with no elements with this");
va_list ap;
- std::vector<const llvm::Type*> StructFields;
+ SmallVector<llvm::Type*, 8> StructFields;
va_start(ap, type);
while (type) {
StructFields.push_back(type);
type = va_arg(ap, llvm::Type*);
}
- return llvm::StructType::get(Context, StructFields);
+ setBody(StructFields);
}
bool StructType::isValidElementType(const Type *ElemTy) {
@@ -973,278 +529,159 @@ bool StructType::isValidElementType(const Type *ElemTy) {
!ElemTy->isMetadataTy() && !ElemTy->isFunctionTy();
}
-
-//===----------------------------------------------------------------------===//
-// Pointer Type Factory...
-//
-
-PointerType *PointerType::get(const Type *ValueType, unsigned AddressSpace) {
- assert(ValueType && "Can't get a pointer to <null> type!");
- assert(ValueType->getTypeID() != VoidTyID &&
- "Pointer to void is not valid, use i8* instead!");
- assert(isValidElementType(ValueType) && "Invalid type for pointer element!");
- PointerValType PVT(ValueType, AddressSpace);
-
- PointerType *PT = 0;
-
- LLVMContextImpl *pImpl = ValueType->getContext().pImpl;
+/// isLayoutIdentical - Return true if this is layout identical to the
+/// specified struct.
+bool StructType::isLayoutIdentical(const StructType *Other) const {
+ if (this == Other) return true;
- PT = pImpl->PointerTypes.get(PVT);
+ if (isPacked() != Other->isPacked() ||
+ getNumElements() != Other->getNumElements())
+ return false;
- if (!PT) {
- // Value not found. Derive a new type!
- pImpl->PointerTypes.add(PVT, PT = new PointerType(ValueType, AddressSpace));
- }
-#ifdef DEBUG_MERGE_TYPES
- DEBUG(dbgs() << "Derived new type: " << *PT << "\n");
-#endif
- return PT;
+ return std::equal(element_begin(), element_end(), Other->element_begin());
}
-const PointerType *Type::getPointerTo(unsigned addrs) const {
- return PointerType::get(this, addrs);
-}
-bool PointerType::isValidElementType(const Type *ElemTy) {
- return !ElemTy->isVoidTy() && !ElemTy->isLabelTy() &&
- !ElemTy->isMetadataTy();
+/// getTypeByName - Return the type with the specified name, or null if there
+/// is none by that name.
+StructType *Module::getTypeByName(StringRef Name) const {
+ StringMap<StructType*>::iterator I =
+ getContext().pImpl->NamedStructTypes.find(Name);
+ if (I != getContext().pImpl->NamedStructTypes.end())
+ return I->second;
+ return 0;
}
//===----------------------------------------------------------------------===//
-// Opaque Type Factory...
-//
+// CompositeType Implementation
+//===----------------------------------------------------------------------===//
-OpaqueType *OpaqueType::get(LLVMContext &C) {
- OpaqueType *OT = new OpaqueType(C); // All opaque types are distinct.
- LLVMContextImpl *pImpl = C.pImpl;
- pImpl->OpaqueTypes.insert(OT);
- return OT;
+Type *CompositeType::getTypeAtIndex(const Value *V) const {
+ if (const StructType *STy = dyn_cast<StructType>(this)) {
+ unsigned Idx = (unsigned)cast<ConstantInt>(V)->getZExtValue();
+ assert(indexValid(Idx) && "Invalid structure index!");
+ return STy->getElementType(Idx);
+ }
+
+ return cast<SequentialType>(this)->getElementType();
+}
+Type *CompositeType::getTypeAtIndex(unsigned Idx) const {
+ if (const StructType *STy = dyn_cast<StructType>(this)) {
+ assert(indexValid(Idx) && "Invalid structure index!");
+ return STy->getElementType(Idx);
+ }
+
+ return cast<SequentialType>(this)->getElementType();
+}
+bool CompositeType::indexValid(const Value *V) const {
+ if (const StructType *STy = dyn_cast<StructType>(this)) {
+ // Structure indexes require 32-bit integer constants.
+ if (V->getType()->isIntegerTy(32))
+ if (const ConstantInt *CU = dyn_cast<ConstantInt>(V))
+ return CU->getZExtValue() < STy->getNumElements();
+ return false;
+ }
+
+ // Sequential types can be indexed by any integer.
+ return V->getType()->isIntegerTy();
}
+bool CompositeType::indexValid(unsigned Idx) const {
+ if (const StructType *STy = dyn_cast<StructType>(this))
+ return Idx < STy->getNumElements();
+ // Sequential types can be indexed by any integer.
+ return true;
+}
//===----------------------------------------------------------------------===//
-// Derived Type Refinement Functions
+// ArrayType Implementation
//===----------------------------------------------------------------------===//
-// addAbstractTypeUser - Notify an abstract type that there is a new user of
-// it. This function is called primarily by the PATypeHandle class.
-void Type::addAbstractTypeUser(AbstractTypeUser *U) const {
- assert(isAbstract() && "addAbstractTypeUser: Current type not abstract!");
- AbstractTypeUsers.push_back(U);
+ArrayType::ArrayType(Type *ElType, uint64_t NumEl)
+ : SequentialType(ArrayTyID, ElType) {
+ NumElements = NumEl;
}
-// removeAbstractTypeUser - Notify an abstract type that a user of the class
-// no longer has a handle to the type. This function is called primarily by
-// the PATypeHandle class. When there are no users of the abstract type, it
-// is annihilated, because there is no way to get a reference to it ever again.
-//
-void Type::removeAbstractTypeUser(AbstractTypeUser *U) const {
-
- // Search from back to front because we will notify users from back to
- // front. Also, it is likely that there will be a stack like behavior to
- // users that register and unregister users.
- //
- unsigned i;
- for (i = AbstractTypeUsers.size(); AbstractTypeUsers[i-1] != U; --i)
- assert(i != 0 && "AbstractTypeUser not in user list!");
-
- --i; // Convert to be in range 0 <= i < size()
- assert(i < AbstractTypeUsers.size() && "Index out of range!"); // Wraparound?
-
- AbstractTypeUsers.erase(AbstractTypeUsers.begin()+i);
-
-#ifdef DEBUG_MERGE_TYPES
- DEBUG(dbgs() << " remAbstractTypeUser[" << (void*)this << ", "
- << *this << "][" << i << "] User = " << U << "\n");
-#endif
-
- if (AbstractTypeUsers.empty() && getRefCount() == 0 && isAbstract()) {
-#ifdef DEBUG_MERGE_TYPES
- DEBUG(dbgs() << "DELETEing unused abstract type: <" << *this
- << ">[" << (void*)this << "]" << "\n");
-#endif
+ArrayType *ArrayType::get(const Type *elementType, uint64_t NumElements) {
+ Type *ElementType = const_cast<Type*>(elementType);
+ assert(isValidElementType(ElementType) && "Invalid type for array element!");
+
+ LLVMContextImpl *pImpl = ElementType->getContext().pImpl;
+ ArrayType *&Entry =
+ pImpl->ArrayTypes[std::make_pair(ElementType, NumElements)];
- this->destroy();
- }
-}
-
-// refineAbstractTypeTo - This function is used when it is discovered
-// that the 'this' abstract type is actually equivalent to the NewType
-// specified. This causes all users of 'this' to switch to reference the more
-// concrete type NewType and for 'this' to be deleted. Only used for internal
-// callers.
-//
-void DerivedType::refineAbstractTypeTo(const Type *NewType) {
- assert(isAbstract() && "refineAbstractTypeTo: Current type is not abstract!");
- assert(this != NewType && "Can't refine to myself!");
- assert(ForwardType == 0 && "This type has already been refined!");
-
- LLVMContextImpl *pImpl = getContext().pImpl;
-
- // The descriptions may be out of date. Conservatively clear them all!
- pImpl->AbstractTypeDescriptions.clear();
-
-#ifdef DEBUG_MERGE_TYPES
- DEBUG(dbgs() << "REFINING abstract type [" << (void*)this << " "
- << *this << "] to [" << (void*)NewType << " "
- << *NewType << "]!\n");
-#endif
-
- // Make sure to put the type to be refined to into a holder so that if IT gets
- // refined, that we will not continue using a dead reference...
- //
- PATypeHolder NewTy(NewType);
- // Any PATypeHolders referring to this type will now automatically forward to
- // the type we are resolved to.
- ForwardType = NewType;
- if (ForwardType->isAbstract())
- ForwardType->addRef();
-
- // Add a self use of the current type so that we don't delete ourself until
- // after the function exits.
- //
- PATypeHolder CurrentTy(this);
-
- // To make the situation simpler, we ask the subclass to remove this type from
- // the type map, and to replace any type uses with uses of non-abstract types.
- // This dramatically limits the amount of recursive type trouble we can find
- // ourselves in.
- dropAllTypeUses();
-
- // Iterate over all of the uses of this type, invoking callback. Each user
- // should remove itself from our use list automatically. We have to check to
- // make sure that NewTy doesn't _become_ 'this'. If it does, resolving types
- // will not cause users to drop off of the use list. If we resolve to ourself
- // we succeed!
- //
- while (!AbstractTypeUsers.empty() && NewTy != this) {
- AbstractTypeUser *User = AbstractTypeUsers.back();
-
- unsigned OldSize = AbstractTypeUsers.size(); (void)OldSize;
-#ifdef DEBUG_MERGE_TYPES
- DEBUG(dbgs() << " REFINING user " << OldSize-1 << "[" << (void*)User
- << "] of abstract type [" << (void*)this << " "
- << *this << "] to [" << (void*)NewTy.get() << " "
- << *NewTy << "]!\n");
-#endif
- User->refineAbstractType(this, NewTy);
-
- assert(AbstractTypeUsers.size() != OldSize &&
- "AbsTyUser did not remove self from user list!");
- }
-
- // If we were successful removing all users from the type, 'this' will be
- // deleted when the last PATypeHolder is destroyed or updated from this type.
- // This may occur on exit of this function, as the CurrentTy object is
- // destroyed.
-}
-
-// notifyUsesThatTypeBecameConcrete - Notify AbstractTypeUsers of this type that
-// the current type has transitioned from being abstract to being concrete.
-//
-void DerivedType::notifyUsesThatTypeBecameConcrete() {
-#ifdef DEBUG_MERGE_TYPES
- DEBUG(dbgs() << "typeIsREFINED type: " << (void*)this << " " << *this <<"\n");
-#endif
-
- unsigned OldSize = AbstractTypeUsers.size(); (void)OldSize;
- while (!AbstractTypeUsers.empty()) {
- AbstractTypeUser *ATU = AbstractTypeUsers.back();
- ATU->typeBecameConcrete(this);
-
- assert(AbstractTypeUsers.size() < OldSize-- &&
- "AbstractTypeUser did not remove itself from the use list!");
- }
-}
-
-// refineAbstractType - Called when a contained type is found to be more
-// concrete - this could potentially change us from an abstract type to a
-// concrete type.
-//
-void FunctionType::refineAbstractType(const DerivedType *OldType,
- const Type *NewType) {
- LLVMContextImpl *pImpl = OldType->getContext().pImpl;
- pImpl->FunctionTypes.RefineAbstractType(this, OldType, NewType);
+ if (Entry == 0)
+ Entry = new (pImpl->TypeAllocator) ArrayType(ElementType, NumElements);
+ return Entry;
}
-void FunctionType::typeBecameConcrete(const DerivedType *AbsTy) {
- LLVMContextImpl *pImpl = AbsTy->getContext().pImpl;
- pImpl->FunctionTypes.TypeBecameConcrete(this, AbsTy);
+bool ArrayType::isValidElementType(const Type *ElemTy) {
+ return !ElemTy->isVoidTy() && !ElemTy->isLabelTy() &&
+ !ElemTy->isMetadataTy() && !ElemTy->isFunctionTy();
}
+//===----------------------------------------------------------------------===//
+// VectorType Implementation
+//===----------------------------------------------------------------------===//
-// refineAbstractType - Called when a contained type is found to be more
-// concrete - this could potentially change us from an abstract type to a
-// concrete type.
-//
-void ArrayType::refineAbstractType(const DerivedType *OldType,
- const Type *NewType) {
- LLVMContextImpl *pImpl = OldType->getContext().pImpl;
- pImpl->ArrayTypes.RefineAbstractType(this, OldType, NewType);
+VectorType::VectorType(Type *ElType, unsigned NumEl)
+ : SequentialType(VectorTyID, ElType) {
+ NumElements = NumEl;
}
-void ArrayType::typeBecameConcrete(const DerivedType *AbsTy) {
- LLVMContextImpl *pImpl = AbsTy->getContext().pImpl;
- pImpl->ArrayTypes.TypeBecameConcrete(this, AbsTy);
+VectorType *VectorType::get(const Type *elementType, unsigned NumElements) {
+ Type *ElementType = const_cast<Type*>(elementType);
+ assert(NumElements > 0 && "#Elements of a VectorType must be greater than 0");
+ assert(isValidElementType(ElementType) &&
+ "Elements of a VectorType must be a primitive type");
+
+ LLVMContextImpl *pImpl = ElementType->getContext().pImpl;
+ VectorType *&Entry = ElementType->getContext().pImpl
+ ->VectorTypes[std::make_pair(ElementType, NumElements)];
+
+ if (Entry == 0)
+ Entry = new (pImpl->TypeAllocator) VectorType(ElementType, NumElements);
+ return Entry;
}
-// refineAbstractType - Called when a contained type is found to be more
-// concrete - this could potentially change us from an abstract type to a
-// concrete type.
-//
-void VectorType::refineAbstractType(const DerivedType *OldType,
- const Type *NewType) {
- LLVMContextImpl *pImpl = OldType->getContext().pImpl;
- pImpl->VectorTypes.RefineAbstractType(this, OldType, NewType);
+bool VectorType::isValidElementType(const Type *ElemTy) {
+ return ElemTy->isIntegerTy() || ElemTy->isFloatingPointTy();
}
-void VectorType::typeBecameConcrete(const DerivedType *AbsTy) {
- LLVMContextImpl *pImpl = AbsTy->getContext().pImpl;
- pImpl->VectorTypes.TypeBecameConcrete(this, AbsTy);
-}
+//===----------------------------------------------------------------------===//
+// PointerType Implementation
+//===----------------------------------------------------------------------===//
-// refineAbstractType - Called when a contained type is found to be more
-// concrete - this could potentially change us from an abstract type to a
-// concrete type.
-//
-void StructType::refineAbstractType(const DerivedType *OldType,
- const Type *NewType) {
- LLVMContextImpl *pImpl = OldType->getContext().pImpl;
- pImpl->StructTypes.RefineAbstractType(this, OldType, NewType);
-}
+PointerType *PointerType::get(const Type *eltTy, unsigned AddressSpace) {
+ Type *EltTy = const_cast<Type*>(eltTy);
+ assert(EltTy && "Can't get a pointer to <null> type!");
+ assert(isValidElementType(EltTy) && "Invalid type for pointer element!");
+
+ LLVMContextImpl *CImpl = EltTy->getContext().pImpl;
+
+ // Since AddressSpace #0 is the common case, we special case it.
+ PointerType *&Entry = AddressSpace == 0 ? CImpl->PointerTypes[EltTy]
+ : CImpl->ASPointerTypes[std::make_pair(EltTy, AddressSpace)];
-void StructType::typeBecameConcrete(const DerivedType *AbsTy) {
- LLVMContextImpl *pImpl = AbsTy->getContext().pImpl;
- pImpl->StructTypes.TypeBecameConcrete(this, AbsTy);
+ if (Entry == 0)
+ Entry = new (CImpl->TypeAllocator) PointerType(EltTy, AddressSpace);
+ return Entry;
}
-// refineAbstractType - Called when a contained type is found to be more
-// concrete - this could potentially change us from an abstract type to a
-// concrete type.
-//
-void PointerType::refineAbstractType(const DerivedType *OldType,
- const Type *NewType) {
- LLVMContextImpl *pImpl = OldType->getContext().pImpl;
- pImpl->PointerTypes.RefineAbstractType(this, OldType, NewType);
-}
-void PointerType::typeBecameConcrete(const DerivedType *AbsTy) {
- LLVMContextImpl *pImpl = AbsTy->getContext().pImpl;
- pImpl->PointerTypes.TypeBecameConcrete(this, AbsTy);
+PointerType::PointerType(Type *E, unsigned AddrSpace)
+ : SequentialType(PointerTyID, E) {
+ setSubclassData(AddrSpace);
}
-bool SequentialType::indexValid(const Value *V) const {
- if (V->getType()->isIntegerTy())
- return true;
- return false;
+PointerType *Type::getPointerTo(unsigned addrs) const {
+ return PointerType::get(this, addrs);
}
-namespace llvm {
-raw_ostream &operator<<(raw_ostream &OS, const Type &T) {
- T.print(OS);
- return OS;
-}
+bool PointerType::isValidElementType(const Type *ElemTy) {
+ return !ElemTy->isVoidTy() && !ElemTy->isLabelTy() &&
+ !ElemTy->isMetadataTy();
}
diff --git a/contrib/llvm/lib/VMCore/TypeSymbolTable.cpp b/contrib/llvm/lib/VMCore/TypeSymbolTable.cpp
deleted file mode 100644
index d68a44b..0000000
--- a/contrib/llvm/lib/VMCore/TypeSymbolTable.cpp
+++ /dev/null
@@ -1,169 +0,0 @@
-//===-- TypeSymbolTable.cpp - Implement the TypeSymbolTable class ---------===//
-//
-// The LLVM Compiler Infrastructure
-//
-// This file is distributed under the University of Illinois Open Source
-// License. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-//
-// This file implements the TypeSymbolTable class for the VMCore library.
-//
-//===----------------------------------------------------------------------===//
-
-#include "llvm/TypeSymbolTable.h"
-#include "llvm/DerivedTypes.h"
-#include "llvm/ADT/StringExtras.h"
-#include "llvm/ADT/StringRef.h"
-#include "llvm/Support/Debug.h"
-#include "llvm/Support/ManagedStatic.h"
-#include "llvm/Support/raw_ostream.h"
-#include <algorithm>
-using namespace llvm;
-
-#define DEBUG_SYMBOL_TABLE 0
-#define DEBUG_ABSTYPE 0
-
-TypeSymbolTable::~TypeSymbolTable() {
- // Drop all abstract type references in the type plane...
- for (iterator TI = tmap.begin(), TE = tmap.end(); TI != TE; ++TI) {
- if (TI->second->isAbstract()) // If abstract, drop the reference...
- cast<DerivedType>(TI->second)->removeAbstractTypeUser(this);
- }
-}
-
-std::string TypeSymbolTable::getUniqueName(StringRef BaseName) const {
- std::string TryName = BaseName;
-
- const_iterator End = tmap.end();
-
- // See if the name exists
- while (tmap.find(TryName) != End) // Loop until we find a free
- TryName = BaseName.str() + utostr(++LastUnique); // name in the symbol table
- return TryName;
-}
-
-// lookup a type by name - returns null on failure
-Type* TypeSymbolTable::lookup(StringRef Name) const {
- const_iterator TI = tmap.find(Name);
- Type* result = 0;
- if (TI != tmap.end())
- result = const_cast<Type*>(TI->second);
- return result;
-}
-
-// remove - Remove a type from the symbol table...
-Type* TypeSymbolTable::remove(iterator Entry) {
- assert(Entry != tmap.end() && "Invalid entry to remove!");
- const Type* Result = Entry->second;
-
-#if DEBUG_SYMBOL_TABLE
- dump();
- dbgs() << " Removing Value: " << Result->getDescription() << "\n";
-#endif
-
- tmap.erase(Entry);
-
- // If we are removing an abstract type, remove the symbol table from it's use
- // list...
- if (Result->isAbstract()) {
-#if DEBUG_ABSTYPE
- dbgs() << "Removing abstract type from symtab"
- << Result->getDescription()
- << "\n";
-#endif
- cast<DerivedType>(Result)->removeAbstractTypeUser(this);
- }
-
- return const_cast<Type*>(Result);
-}
-
-
-// insert - Insert a type into the symbol table with the specified name...
-void TypeSymbolTable::insert(StringRef Name, const Type* T) {
- assert(T && "Can't insert null type into symbol table!");
-
- if (tmap.insert(std::make_pair(Name, T)).second) {
- // Type inserted fine with no conflict.
-
-#if DEBUG_SYMBOL_TABLE
- dump();
- dbgs() << " Inserted type: " << Name << ": " << T->getDescription() << "\n";
-#endif
- } else {
- // If there is a name conflict...
-
- // Check to see if there is a naming conflict. If so, rename this type!
- std::string UniqueName = Name;
- if (lookup(Name))
- UniqueName = getUniqueName(Name);
-
-#if DEBUG_SYMBOL_TABLE
- dump();
- dbgs() << " Inserting type: " << UniqueName << ": "
- << T->getDescription() << "\n";
-#endif
-
- // Insert the tmap entry
- tmap.insert(make_pair(UniqueName, T));
- }
-
- // If we are adding an abstract type, add the symbol table to it's use list.
- if (T->isAbstract()) {
- cast<DerivedType>(T)->addAbstractTypeUser(this);
-#if DEBUG_ABSTYPE
- dbgs() << "Added abstract type to ST: " << T->getDescription() << "\n";
-#endif
- }
-}
-
-// This function is called when one of the types in the type plane are refined
-void TypeSymbolTable::refineAbstractType(const DerivedType *OldType,
- const Type *NewType) {
- // Loop over all of the types in the symbol table, replacing any references
- // to OldType with references to NewType. Note that there may be multiple
- // occurrences, and although we only need to remove one at a time, it's
- // faster to remove them all in one pass.
- //
- for (iterator I = begin(), E = end(); I != E; ++I) {
- // FIXME when Types aren't const.
- if (I->second == const_cast<DerivedType *>(OldType)) {
-#if DEBUG_ABSTYPE
- dbgs() << "Removing type " << OldType->getDescription() << "\n";
-#endif
- OldType->removeAbstractTypeUser(this);
-
- // TODO FIXME when types aren't const
- I->second = const_cast<Type *>(NewType);
- if (NewType->isAbstract()) {
-#if DEBUG_ABSTYPE
- dbgs() << "Added type " << NewType->getDescription() << "\n";
-#endif
- cast<DerivedType>(NewType)->addAbstractTypeUser(this);
- }
- }
- }
-}
-
-
-// Handle situation where type becomes Concreate from Abstract
-void TypeSymbolTable::typeBecameConcrete(const DerivedType *AbsTy) {
- // Loop over all of the types in the symbol table, dropping any abstract
- // type user entries for AbsTy which occur because there are names for the
- // type.
- for (iterator TI = begin(), TE = end(); TI != TE; ++TI)
- if (TI->second == const_cast<Type*>(static_cast<const Type*>(AbsTy)))
- AbsTy->removeAbstractTypeUser(this);
-}
-
-static void DumpTypes(const std::pair<const std::string, const Type*>& T ) {
- dbgs() << " '" << T.first << "' = ";
- T.second->dump();
- dbgs() << "\n";
-}
-
-void TypeSymbolTable::dump() const {
- dbgs() << "TypeSymbolPlane: ";
- for_each(tmap.begin(), tmap.end(), DumpTypes);
-}
-
diff --git a/contrib/llvm/lib/VMCore/TypesContext.h b/contrib/llvm/lib/VMCore/TypesContext.h
deleted file mode 100644
index ad09478..0000000
--- a/contrib/llvm/lib/VMCore/TypesContext.h
+++ /dev/null
@@ -1,426 +0,0 @@
-//===-- TypesContext.h - Types-related Context Internals ------------------===//
-//
-// The LLVM Compiler Infrastructure
-//
-// This file is distributed under the University of Illinois Open Source
-// License. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-//
-// This file defines various helper methods and classes used by
-// LLVMContextImpl for creating and managing types.
-//
-//===----------------------------------------------------------------------===//
-
-#ifndef LLVM_TYPESCONTEXT_H
-#define LLVM_TYPESCONTEXT_H
-
-#include "llvm/ADT/ArrayRef.h"
-#include "llvm/ADT/STLExtras.h"
-#include <map>
-
-
-//===----------------------------------------------------------------------===//
-// Derived Type Factory Functions
-//===----------------------------------------------------------------------===//
-namespace llvm {
-
-/// getSubElementHash - Generate a hash value for all of the SubType's of this
-/// type. The hash value is guaranteed to be zero if any of the subtypes are
-/// an opaque type. Otherwise we try to mix them in as well as possible, but do
-/// not look at the subtype's subtype's.
-static unsigned getSubElementHash(const Type *Ty) {
- unsigned HashVal = 0;
- for (Type::subtype_iterator I = Ty->subtype_begin(), E = Ty->subtype_end();
- I != E; ++I) {
- HashVal *= 32;
- const Type *SubTy = I->get();
- HashVal += SubTy->getTypeID();
- switch (SubTy->getTypeID()) {
- default: break;
- case Type::OpaqueTyID: return 0; // Opaque -> hash = 0 no matter what.
- case Type::IntegerTyID:
- HashVal ^= (cast<IntegerType>(SubTy)->getBitWidth() << 3);
- break;
- case Type::FunctionTyID:
- HashVal ^= cast<FunctionType>(SubTy)->getNumParams()*2 +
- cast<FunctionType>(SubTy)->isVarArg();
- break;
- case Type::ArrayTyID:
- HashVal ^= cast<ArrayType>(SubTy)->getNumElements();
- break;
- case Type::VectorTyID:
- HashVal ^= cast<VectorType>(SubTy)->getNumElements();
- break;
- case Type::StructTyID:
- HashVal ^= cast<StructType>(SubTy)->getNumElements();
- break;
- case Type::PointerTyID:
- HashVal ^= cast<PointerType>(SubTy)->getAddressSpace();
- break;
- }
- }
- return HashVal ? HashVal : 1; // Do not return zero unless opaque subty.
-}
-
-//===----------------------------------------------------------------------===//
-// Integer Type Factory...
-//
-class IntegerValType {
- uint32_t bits;
-public:
- IntegerValType(uint32_t numbits) : bits(numbits) {}
-
- static IntegerValType get(const IntegerType *Ty) {
- return IntegerValType(Ty->getBitWidth());
- }
-
- static unsigned hashTypeStructure(const IntegerType *Ty) {
- return (unsigned)Ty->getBitWidth();
- }
-
- inline bool operator<(const IntegerValType &IVT) const {
- return bits < IVT.bits;
- }
-};
-
-// PointerValType - Define a class to hold the key that goes into the TypeMap
-//
-class PointerValType {
- const Type *ValTy;
- unsigned AddressSpace;
-public:
- PointerValType(const Type *val, unsigned as) : ValTy(val), AddressSpace(as) {}
-
- static PointerValType get(const PointerType *PT) {
- return PointerValType(PT->getElementType(), PT->getAddressSpace());
- }
-
- static unsigned hashTypeStructure(const PointerType *PT) {
- return getSubElementHash(PT);
- }
-
- bool operator<(const PointerValType &MTV) const {
- if (AddressSpace < MTV.AddressSpace) return true;
- return AddressSpace == MTV.AddressSpace && ValTy < MTV.ValTy;
- }
-};
-
-//===----------------------------------------------------------------------===//
-// Array Type Factory...
-//
-class ArrayValType {
- const Type *ValTy;
- uint64_t Size;
-public:
- ArrayValType(const Type *val, uint64_t sz) : ValTy(val), Size(sz) {}
-
- static ArrayValType get(const ArrayType *AT) {
- return ArrayValType(AT->getElementType(), AT->getNumElements());
- }
-
- static unsigned hashTypeStructure(const ArrayType *AT) {
- return (unsigned)AT->getNumElements();
- }
-
- inline bool operator<(const ArrayValType &MTV) const {
- if (Size < MTV.Size) return true;
- return Size == MTV.Size && ValTy < MTV.ValTy;
- }
-};
-
-//===----------------------------------------------------------------------===//
-// Vector Type Factory...
-//
-class VectorValType {
- const Type *ValTy;
- unsigned Size;
-public:
- VectorValType(const Type *val, int sz) : ValTy(val), Size(sz) {}
-
- static VectorValType get(const VectorType *PT) {
- return VectorValType(PT->getElementType(), PT->getNumElements());
- }
-
- static unsigned hashTypeStructure(const VectorType *PT) {
- return PT->getNumElements();
- }
-
- inline bool operator<(const VectorValType &MTV) const {
- if (Size < MTV.Size) return true;
- return Size == MTV.Size && ValTy < MTV.ValTy;
- }
-};
-
-// StructValType - Define a class to hold the key that goes into the TypeMap
-//
-class StructValType {
- std::vector<const Type*> ElTypes;
- bool packed;
-public:
- StructValType(ArrayRef<const Type*> args, bool isPacked)
- : ElTypes(args.vec()), packed(isPacked) {}
-
- static StructValType get(const StructType *ST) {
- std::vector<const Type *> ElTypes;
- ElTypes.reserve(ST->getNumElements());
- for (unsigned i = 0, e = ST->getNumElements(); i != e; ++i)
- ElTypes.push_back(ST->getElementType(i));
-
- return StructValType(ElTypes, ST->isPacked());
- }
-
- static unsigned hashTypeStructure(const StructType *ST) {
- return ST->getNumElements();
- }
-
- inline bool operator<(const StructValType &STV) const {
- if (ElTypes < STV.ElTypes) return true;
- else if (ElTypes > STV.ElTypes) return false;
- else return (int)packed < (int)STV.packed;
- }
-};
-
-// FunctionValType - Define a class to hold the key that goes into the TypeMap
-//
-class FunctionValType {
- const Type *RetTy;
- std::vector<const Type*> ArgTypes;
- bool isVarArg;
-public:
- FunctionValType(const Type *ret, ArrayRef<const Type*> args, bool isVA)
- : RetTy(ret), ArgTypes(args.vec()), isVarArg(isVA) {}
-
- static FunctionValType get(const FunctionType *FT);
-
- static unsigned hashTypeStructure(const FunctionType *FT) {
- unsigned Result = FT->getNumParams()*2 + FT->isVarArg();
- return Result;
- }
-
- inline bool operator<(const FunctionValType &MTV) const {
- if (RetTy < MTV.RetTy) return true;
- if (RetTy > MTV.RetTy) return false;
- if (isVarArg < MTV.isVarArg) return true;
- if (isVarArg > MTV.isVarArg) return false;
- if (ArgTypes < MTV.ArgTypes) return true;
- if (ArgTypes > MTV.ArgTypes) return false;
- return false;
- }
-};
-
-class TypeMapBase {
-protected:
- /// TypesByHash - Keep track of types by their structure hash value. Note
- /// that we only keep track of types that have cycles through themselves in
- /// this map.
- ///
- std::multimap<unsigned, PATypeHolder> TypesByHash;
-
- ~TypeMapBase() {
- // PATypeHolder won't destroy non-abstract types.
- // We can't destroy them by simply iterating, because
- // they may contain references to each-other.
- for (std::multimap<unsigned, PATypeHolder>::iterator I
- = TypesByHash.begin(), E = TypesByHash.end(); I != E; ++I) {
- Type *Ty = const_cast<Type*>(I->second.Ty);
- I->second.destroy();
- // We can't invoke destroy or delete, because the type may
- // contain references to already freed types.
- // So we have to destruct the object the ugly way.
- if (Ty) {
- Ty->AbstractTypeUsers.clear();
- static_cast<const Type*>(Ty)->Type::~Type();
- operator delete(Ty);
- }
- }
- }
-
-public:
- void RemoveFromTypesByHash(unsigned Hash, const Type *Ty) {
- std::multimap<unsigned, PATypeHolder>::iterator I =
- TypesByHash.lower_bound(Hash);
- for (; I != TypesByHash.end() && I->first == Hash; ++I) {
- if (I->second == Ty) {
- TypesByHash.erase(I);
- return;
- }
- }
-
- // This must be do to an opaque type that was resolved. Switch down to hash
- // code of zero.
- assert(Hash && "Didn't find type entry!");
- RemoveFromTypesByHash(0, Ty);
- }
-
- /// TypeBecameConcrete - When Ty gets a notification that TheType just became
- /// concrete, drop uses and make Ty non-abstract if we should.
- void TypeBecameConcrete(DerivedType *Ty, const DerivedType *TheType) {
- // If the element just became concrete, remove 'ty' from the abstract
- // type user list for the type. Do this for as many times as Ty uses
- // OldType.
- for (Type::subtype_iterator I = Ty->subtype_begin(), E = Ty->subtype_end();
- I != E; ++I)
- if (I->get() == TheType)
- TheType->removeAbstractTypeUser(Ty);
-
- // If the type is currently thought to be abstract, rescan all of our
- // subtypes to see if the type has just become concrete! Note that this
- // may send out notifications to AbstractTypeUsers that types become
- // concrete.
- if (Ty->isAbstract())
- Ty->PromoteAbstractToConcrete();
- }
-};
-
-// TypeMap - Make sure that only one instance of a particular type may be
-// created on any given run of the compiler... note that this involves updating
-// our map if an abstract type gets refined somehow.
-//
-template<class ValType, class TypeClass>
-class TypeMap : public TypeMapBase {
- std::map<ValType, PATypeHolder> Map;
-public:
- typedef typename std::map<ValType, PATypeHolder>::iterator iterator;
-
- inline TypeClass *get(const ValType &V) {
- iterator I = Map.find(V);
- return I != Map.end() ? cast<TypeClass>((Type*)I->second.get()) : 0;
- }
-
- inline void add(const ValType &V, TypeClass *Ty) {
- Map.insert(std::make_pair(V, Ty));
-
- // If this type has a cycle, remember it.
- TypesByHash.insert(std::make_pair(ValType::hashTypeStructure(Ty), Ty));
- print("add");
- }
-
- /// RefineAbstractType - This method is called after we have merged a type
- /// with another one. We must now either merge the type away with
- /// some other type or reinstall it in the map with it's new configuration.
- void RefineAbstractType(TypeClass *Ty, const DerivedType *OldType,
- const Type *NewType) {
-#ifdef DEBUG_MERGE_TYPES
- DEBUG(dbgs() << "RefineAbstractType(" << (void*)OldType << "[" << *OldType
- << "], " << (void*)NewType << " [" << *NewType << "])\n");
-#endif
-
- // Otherwise, we are changing one subelement type into another. Clearly the
- // OldType must have been abstract, making us abstract.
- assert(Ty->isAbstract() && "Refining a non-abstract type!");
- assert(OldType != NewType);
-
- // Make a temporary type holder for the type so that it doesn't disappear on
- // us when we erase the entry from the map.
- PATypeHolder TyHolder = Ty;
-
- // The old record is now out-of-date, because one of the children has been
- // updated. Remove the obsolete entry from the map.
- unsigned NumErased = Map.erase(ValType::get(Ty));
- assert(NumErased && "Element not found!"); (void)NumErased;
-
- // Remember the structural hash for the type before we start hacking on it,
- // in case we need it later.
- unsigned OldTypeHash = ValType::hashTypeStructure(Ty);
-
- // Find the type element we are refining... and change it now!
- for (unsigned i = 0, e = Ty->getNumContainedTypes(); i != e; ++i)
- if (Ty->ContainedTys[i] == OldType)
- Ty->ContainedTys[i] = NewType;
- unsigned NewTypeHash = ValType::hashTypeStructure(Ty);
-
- // If there are no cycles going through this node, we can do a simple,
- // efficient lookup in the map, instead of an inefficient nasty linear
- // lookup.
- if (!TypeHasCycleThroughItself(Ty)) {
- typename std::map<ValType, PATypeHolder>::iterator I;
- bool Inserted;
-
- tie(I, Inserted) = Map.insert(std::make_pair(ValType::get(Ty), Ty));
- if (!Inserted) {
- // Refined to a different type altogether?
- RemoveFromTypesByHash(OldTypeHash, Ty);
-
- // We already have this type in the table. Get rid of the newly refined
- // type.
- TypeClass *NewTy = cast<TypeClass>((Type*)I->second.get());
- Ty->refineAbstractTypeTo(NewTy);
- return;
- }
- } else {
- // Now we check to see if there is an existing entry in the table which is
- // structurally identical to the newly refined type. If so, this type
- // gets refined to the pre-existing type.
- //
- std::multimap<unsigned, PATypeHolder>::iterator I, E, Entry;
- tie(I, E) = TypesByHash.equal_range(NewTypeHash);
- Entry = E;
- for (; I != E; ++I) {
- if (I->second == Ty) {
- // Remember the position of the old type if we see it in our scan.
- Entry = I;
- continue;
- }
-
- if (!TypesEqual(Ty, I->second))
- continue;
-
- TypeClass *NewTy = cast<TypeClass>((Type*)I->second.get());
-
- // Remove the old entry form TypesByHash. If the hash values differ
- // now, remove it from the old place. Otherwise, continue scanning
- // within this hashcode to reduce work.
- if (NewTypeHash != OldTypeHash) {
- RemoveFromTypesByHash(OldTypeHash, Ty);
- } else {
- if (Entry == E) {
- // Find the location of Ty in the TypesByHash structure if we
- // haven't seen it already.
- while (I->second != Ty) {
- ++I;
- assert(I != E && "Structure doesn't contain type??");
- }
- Entry = I;
- }
- TypesByHash.erase(Entry);
- }
- Ty->refineAbstractTypeTo(NewTy);
- return;
- }
-
- // If there is no existing type of the same structure, we reinsert an
- // updated record into the map.
- Map.insert(std::make_pair(ValType::get(Ty), Ty));
- }
-
- // If the hash codes differ, update TypesByHash
- if (NewTypeHash != OldTypeHash) {
- RemoveFromTypesByHash(OldTypeHash, Ty);
- TypesByHash.insert(std::make_pair(NewTypeHash, Ty));
- }
-
- // If the type is currently thought to be abstract, rescan all of our
- // subtypes to see if the type has just become concrete! Note that this
- // may send out notifications to AbstractTypeUsers that types become
- // concrete.
- if (Ty->isAbstract())
- Ty->PromoteAbstractToConcrete();
- }
-
- void print(const char *Arg) const {
-#ifdef DEBUG_MERGE_TYPES
- DEBUG(dbgs() << "TypeMap<>::" << Arg << " table contents:\n");
- unsigned i = 0;
- for (typename std::map<ValType, PATypeHolder>::const_iterator I
- = Map.begin(), E = Map.end(); I != E; ++I)
- DEBUG(dbgs() << " " << (++i) << ". " << (void*)I->second.get() << " "
- << *I->second.get() << "\n");
-#endif
- }
-
- void dump() const { print("dump output"); }
-};
-}
-
-#endif
diff --git a/contrib/llvm/lib/VMCore/Use.cpp b/contrib/llvm/lib/VMCore/Use.cpp
index 2258b8d..359a151 100644
--- a/contrib/llvm/lib/VMCore/Use.cpp
+++ b/contrib/llvm/lib/VMCore/Use.cpp
@@ -135,11 +135,9 @@ void Use::zap(Use *Start, const Use *Stop, bool del) {
User *Use::getUser() const {
const Use *End = getImpliedUser();
- const PointerIntPair<User*, 1, unsigned>&
- ref(static_cast<const AugmentedUse*>(End - 1)->ref);
- User *She = ref.getPointer();
- return ref.getInt()
- ? She
+ const UserRef *ref = reinterpret_cast<const UserRef*>(End);
+ return ref->getInt()
+ ? ref->getPointer()
: (User*)End;
}
diff --git a/contrib/llvm/lib/VMCore/User.cpp b/contrib/llvm/lib/VMCore/User.cpp
index 2f4587d..f01fa34 100644
--- a/contrib/llvm/lib/VMCore/User.cpp
+++ b/contrib/llvm/lib/VMCore/User.cpp
@@ -40,14 +40,12 @@ void User::replaceUsesOfWith(Value *From, Value *To) {
//===----------------------------------------------------------------------===//
Use *User::allocHungoffUses(unsigned N) const {
- Use *Begin = static_cast<Use*>(::operator new(sizeof(Use) * N
- + sizeof(AugmentedUse)
- - sizeof(Use)));
+ // Allocate the array of Uses, followed by a pointer (with bottom bit set) to
+ // the User.
+ size_t size = N * sizeof(Use) + sizeof(Use::UserRef);
+ Use *Begin = static_cast<Use*>(::operator new(size));
Use *End = Begin + N;
- PointerIntPair<User*, 1, unsigned>&
- ref(static_cast<AugmentedUse&>(End[-1]).ref);
- ref.setPointer(const_cast<User*>(this));
- ref.setInt(1);
+ (void) new(End) Use::UserRef(const_cast<User*>(this), 1);
return Use::initTags(Begin, End);
}
diff --git a/contrib/llvm/lib/VMCore/Value.cpp b/contrib/llvm/lib/VMCore/Value.cpp
index 29f6a80..f1815e3 100644
--- a/contrib/llvm/lib/VMCore/Value.cpp
+++ b/contrib/llvm/lib/VMCore/Value.cpp
@@ -35,22 +35,21 @@ using namespace llvm;
// Value Class
//===----------------------------------------------------------------------===//
-static inline const Type *checkType(const Type *Ty) {
+static inline Type *checkType(const Type *Ty) {
assert(Ty && "Value defined with a null type: Error!");
- return Ty;
+ return const_cast<Type*>(Ty);
}
Value::Value(const Type *ty, unsigned scid)
: SubclassID(scid), HasValueHandle(0),
- SubclassOptionalData(0), SubclassData(0), VTy(checkType(ty)),
+ SubclassOptionalData(0), SubclassData(0), VTy((Type*)checkType(ty)),
UseList(0), Name(0) {
+ // FIXME: Why isn't this in the subclass gunk??
if (isa<CallInst>(this) || isa<InvokeInst>(this))
- assert((VTy->isFirstClassType() || VTy->isVoidTy() ||
- ty->isOpaqueTy() || VTy->isStructTy()) &&
- "invalid CallInst type!");
+ assert((VTy->isFirstClassType() || VTy->isVoidTy() || VTy->isStructTy()) &&
+ "invalid CallInst type!");
else if (!isa<Constant>(this) && !isa<BasicBlock>(this))
- assert((VTy->isFirstClassType() || VTy->isVoidTy() ||
- ty->isOpaqueTy()) &&
+ assert((VTy->isFirstClassType() || VTy->isVoidTy()) &&
"Cannot create non-first-class values except for constants!");
}
@@ -281,17 +280,16 @@ void Value::takeName(Value *V) {
}
-// uncheckedReplaceAllUsesWith - This is exactly the same as replaceAllUsesWith,
-// except that it doesn't have all of the asserts. The asserts fail because we
-// are half-way done resolving types, which causes some types to exist as two
-// different Type*'s at the same time. This is a sledgehammer to work around
-// this problem.
-//
-void Value::uncheckedReplaceAllUsesWith(Value *New) {
+void Value::replaceAllUsesWith(Value *New) {
+ assert(New && "Value::replaceAllUsesWith(<null>) is invalid!");
+ assert(New != this && "this->replaceAllUsesWith(this) is NOT valid!");
+ assert(New->getType() == getType() &&
+ "replaceAllUses of value with new value of different type!");
+
// Notify all ValueHandles (if present) that this value is going away.
if (HasValueHandle)
ValueHandleBase::ValueIsRAUWd(this, New);
-
+
while (!use_empty()) {
Use &U = *UseList;
// Must handle Constants specially, we cannot call replaceUsesOfWith on a
@@ -302,18 +300,12 @@ void Value::uncheckedReplaceAllUsesWith(Value *New) {
continue;
}
}
-
+
U.set(New);
}
-}
-
-void Value::replaceAllUsesWith(Value *New) {
- assert(New && "Value::replaceAllUsesWith(<null>) is invalid!");
- assert(New != this && "this->replaceAllUsesWith(this) is NOT valid!");
- assert(New->getType() == getType() &&
- "replaceAllUses of value with new value of different type!");
-
- uncheckedReplaceAllUsesWith(New);
+
+ if (BasicBlock *BB = dyn_cast<BasicBlock>(this))
+ BB->replaceSuccessorsPhiUsesWith(cast<BasicBlock>(New));
}
Value *Value::stripPointerCasts() {
diff --git a/contrib/llvm/lib/VMCore/ValueSymbolTable.cpp b/contrib/llvm/lib/VMCore/ValueSymbolTable.cpp
index 254bf06..f1c9703 100644
--- a/contrib/llvm/lib/VMCore/ValueSymbolTable.cpp
+++ b/contrib/llvm/lib/VMCore/ValueSymbolTable.cpp
@@ -25,7 +25,7 @@ ValueSymbolTable::~ValueSymbolTable() {
#ifndef NDEBUG // Only do this in -g mode...
for (iterator VI = vmap.begin(), VE = vmap.end(); VI != VE; ++VI)
dbgs() << "Value still in symbol table! Type = '"
- << VI->getValue()->getType()->getDescription() << "' Name = '"
+ << *VI->getValue()->getType() << "' Name = '"
<< VI->getKeyData() << "'\n";
assert(vmap.empty() && "Values remain in symbol table!");
#endif
diff --git a/contrib/llvm/lib/VMCore/ValueTypes.cpp b/contrib/llvm/lib/VMCore/ValueTypes.cpp
index c054ae4..21a1f03 100644
--- a/contrib/llvm/lib/VMCore/ValueTypes.cpp
+++ b/contrib/llvm/lib/VMCore/ValueTypes.cpp
@@ -133,6 +133,7 @@ std::string EVT::getEVTString() const {
case MVT::v2f64: return "v2f64";
case MVT::v4f64: return "v4f64";
case MVT::Metadata:return "Metadata";
+ case MVT::untyped: return "untyped";
}
}
diff --git a/contrib/llvm/lib/VMCore/Verifier.cpp b/contrib/llvm/lib/VMCore/Verifier.cpp
index 139e035..b146b89 100644
--- a/contrib/llvm/lib/VMCore/Verifier.cpp
+++ b/contrib/llvm/lib/VMCore/Verifier.cpp
@@ -49,7 +49,6 @@
#include "llvm/Module.h"
#include "llvm/Pass.h"
#include "llvm/PassManager.h"
-#include "llvm/TypeSymbolTable.h"
#include "llvm/Analysis/Dominators.h"
#include "llvm/Assembly/Writer.h"
#include "llvm/CodeGen/ValueTypes.h"
@@ -109,54 +108,6 @@ INITIALIZE_PASS(PreVerifier, "preverify", "Preliminary module verification",
static char &PreVerifyID = PreVerifier::ID;
namespace {
- class TypeSet : public AbstractTypeUser {
- public:
- TypeSet() {}
-
- /// Insert a type into the set of types.
- bool insert(const Type *Ty) {
- if (!Types.insert(Ty))
- return false;
- if (Ty->isAbstract())
- Ty->addAbstractTypeUser(this);
- return true;
- }
-
- // Remove ourselves as abstract type listeners for any types that remain
- // abstract when the TypeSet is destroyed.
- ~TypeSet() {
- for (SmallSetVector<const Type *, 16>::iterator I = Types.begin(),
- E = Types.end(); I != E; ++I) {
- const Type *Ty = *I;
- if (Ty->isAbstract())
- Ty->removeAbstractTypeUser(this);
- }
- }
-
- // Abstract type user interface.
-
- /// Remove types from the set when refined. Do not insert the type it was
- /// refined to because that type hasn't been verified yet.
- void refineAbstractType(const DerivedType *OldTy, const Type *NewTy) {
- Types.remove(OldTy);
- OldTy->removeAbstractTypeUser(this);
- }
-
- /// Stop listening for changes to a type which is no longer abstract.
- void typeBecameConcrete(const DerivedType *AbsTy) {
- AbsTy->removeAbstractTypeUser(this);
- }
-
- void dump() const {}
-
- private:
- SmallSetVector<const Type *, 16> Types;
-
- // Disallow copying.
- TypeSet(const TypeSet &);
- TypeSet &operator=(const TypeSet &);
- };
-
struct Verifier : public FunctionPass, public InstVisitor<Verifier> {
static char ID; // Pass ID, replacement for typeid
bool Broken; // Is this module found to be broken?
@@ -176,9 +127,6 @@ namespace {
/// an instruction in the same block.
SmallPtrSet<Instruction*, 16> InstsInThisBlock;
- /// Types - keep track of the types that have been checked already.
- TypeSet Types;
-
/// MDNodes - keep track of the metadata nodes that have been checked
/// already.
SmallPtrSet<MDNode *, 32> MDNodes;
@@ -199,7 +147,6 @@ namespace {
bool doInitialization(Module &M) {
Mod = &M;
Context = &M.getContext();
- verifyTypeSymbolTable(M.getTypeSymbolTable());
// If this is a real pass, in a pass manager, we must abort before
// returning back to the pass manager, or else the pass manager may try to
@@ -285,7 +232,6 @@ namespace {
// Verification methods...
- void verifyTypeSymbolTable(TypeSymbolTable &ST);
void visitGlobalValue(GlobalValue &GV);
void visitGlobalVariable(GlobalVariable &GV);
void visitGlobalAlias(GlobalAlias &GA);
@@ -345,7 +291,6 @@ namespace {
bool isReturnValue, const Value *V);
void VerifyFunctionAttrs(const FunctionType *FT, const AttrListPtr &Attrs,
const Value *V);
- void VerifyType(const Type *Ty);
void WriteValue(const Value *V) {
if (!V) return;
@@ -359,8 +304,7 @@ namespace {
void WriteType(const Type *T) {
if (!T) return;
- MessagesStr << ' ';
- WriteTypeSymbolic(MessagesStr, T, Mod);
+ MessagesStr << ' ' << *T;
}
@@ -568,11 +512,6 @@ void Verifier::visitMDNode(MDNode &MD, Function *F) {
}
}
-void Verifier::verifyTypeSymbolTable(TypeSymbolTable &ST) {
- for (TypeSymbolTable::iterator I = ST.begin(), E = ST.end(); I != E; ++I)
- VerifyType(I->second);
-}
-
// VerifyParameterAttrs - Check the given attributes for an argument or return
// value of the specified type. The value V is printed in error messages.
void Verifier::VerifyParameterAttrs(Attributes Attrs, const Type *Ty,
@@ -1139,9 +1078,6 @@ void Verifier::visitPHINode(PHINode &PN) {
for (unsigned i = 0, e = PN.getNumIncomingValues(); i != e; ++i) {
Assert1(PN.getType() == PN.getIncomingValue(i)->getType(),
"PHI node operands are not the same type as the result!", &PN);
- Assert1(isa<BasicBlock>(PN.getOperand(
- PHINode::getOperandNumForIncomingBlock(i))),
- "PHI node incoming block is not a BasicBlock!", &PN);
}
// All other PHI node constraints are checked in the visitBasicBlock method.
@@ -1195,11 +1131,11 @@ void Verifier::VerifyCallSite(CallSite CS) {
}
// Verify that there's no metadata unless it's a direct call to an intrinsic.
- if (!CS.getCalledFunction() ||
+ if (CS.getCalledFunction() == 0 ||
!CS.getCalledFunction()->getName().startswith("llvm.")) {
for (FunctionType::param_iterator PI = FTy->param_begin(),
PE = FTy->param_end(); PI != PE; ++PI)
- Assert1(!PI->get()->isMetadataTy(),
+ Assert1(!(*PI)->isMetadataTy(),
"Function has metadata parameter but isn't an intrinsic", I);
}
@@ -1382,7 +1318,7 @@ void Verifier::visitAllocaInst(AllocaInst &AI) {
void Verifier::visitExtractValueInst(ExtractValueInst &EVI) {
Assert1(ExtractValueInst::getIndexedType(EVI.getAggregateOperand()->getType(),
- EVI.idx_begin(), EVI.idx_end()) ==
+ EVI.getIndices()) ==
EVI.getType(),
"Invalid ExtractValueInst operands!", &EVI);
@@ -1391,7 +1327,7 @@ void Verifier::visitExtractValueInst(ExtractValueInst &EVI) {
void Verifier::visitInsertValueInst(InsertValueInst &IVI) {
Assert1(ExtractValueInst::getIndexedType(IVI.getAggregateOperand()->getType(),
- IVI.idx_begin(), IVI.idx_end()) ==
+ IVI.getIndices()) ==
IVI.getOperand(1)->getType(),
"Invalid InsertValueInst operands!", &IVI);
@@ -1482,8 +1418,10 @@ void Verifier::visitInstruction(Instruction &I) {
// PHI nodes differ from other nodes because they actually "use" the
// value in the predecessor basic blocks they correspond to.
BasicBlock *UseBlock = BB;
- if (isa<PHINode>(I))
- UseBlock = dyn_cast<BasicBlock>(I.getOperand(i+1));
+ if (PHINode *PN = dyn_cast<PHINode>(&I)) {
+ unsigned j = PHINode::getIncomingValueNumForOperand(i);
+ UseBlock = PN->getIncomingBlock(j);
+ }
Assert2(UseBlock, "Invoke operand is PHI node with bad incoming-BB",
Op, &I);
@@ -1515,10 +1453,11 @@ void Verifier::visitInstruction(Instruction &I) {
return;
}
}
- } else if (isa<PHINode>(I)) {
+ } else if (PHINode *PN = dyn_cast<PHINode>(&I)) {
// PHI nodes are more difficult than other nodes because they actually
// "use" the value in the predecessor basic blocks they correspond to.
- BasicBlock *PredBB = dyn_cast<BasicBlock>(I.getOperand(i+1));
+ unsigned j = PHINode::getIncomingValueNumForOperand(i);
+ BasicBlock *PredBB = PN->getIncomingBlock(j);
Assert2(PredBB && (DT->dominates(OpBlock, PredBB) ||
!DT->isReachableFromEntry(PredBB)),
"Instruction does not dominate all uses!", Op, &I);
@@ -1542,69 +1481,6 @@ void Verifier::visitInstruction(Instruction &I) {
}
}
InstsInThisBlock.insert(&I);
-
- VerifyType(I.getType());
-}
-
-/// VerifyType - Verify that a type is well formed.
-///
-void Verifier::VerifyType(const Type *Ty) {
- if (!Types.insert(Ty)) return;
-
- Assert1(Context == &Ty->getContext(),
- "Type context does not match Module context!", Ty);
-
- switch (Ty->getTypeID()) {
- case Type::FunctionTyID: {
- const FunctionType *FTy = cast<FunctionType>(Ty);
-
- const Type *RetTy = FTy->getReturnType();
- Assert2(FunctionType::isValidReturnType(RetTy),
- "Function type with invalid return type", RetTy, FTy);
- VerifyType(RetTy);
-
- for (unsigned i = 0, e = FTy->getNumParams(); i != e; ++i) {
- const Type *ElTy = FTy->getParamType(i);
- Assert2(FunctionType::isValidArgumentType(ElTy),
- "Function type with invalid parameter type", ElTy, FTy);
- VerifyType(ElTy);
- }
- break;
- }
- case Type::StructTyID: {
- const StructType *STy = cast<StructType>(Ty);
- for (unsigned i = 0, e = STy->getNumElements(); i != e; ++i) {
- const Type *ElTy = STy->getElementType(i);
- Assert2(StructType::isValidElementType(ElTy),
- "Structure type with invalid element type", ElTy, STy);
- VerifyType(ElTy);
- }
- break;
- }
- case Type::ArrayTyID: {
- const ArrayType *ATy = cast<ArrayType>(Ty);
- Assert1(ArrayType::isValidElementType(ATy->getElementType()),
- "Array type with invalid element type", ATy);
- VerifyType(ATy->getElementType());
- break;
- }
- case Type::PointerTyID: {
- const PointerType *PTy = cast<PointerType>(Ty);
- Assert1(PointerType::isValidElementType(PTy->getElementType()),
- "Pointer type with invalid element type", PTy);
- VerifyType(PTy->getElementType());
- break;
- }
- case Type::VectorTyID: {
- const VectorType *VTy = cast<VectorType>(Ty);
- Assert1(VectorType::isValidElementType(VTy->getElementType()),
- "Vector type with invalid element type", VTy);
- VerifyType(VTy->getElementType());
- break;
- }
- default:
- break;
- }
}
// Flags used by TableGen to mark intrinsic parameters with the
diff --git a/contrib/llvm/tools/clang/include/clang-c/Index.h b/contrib/llvm/tools/clang/include/clang-c/Index.h
index cb0b3c1..4852ded 100644
--- a/contrib/llvm/tools/clang/include/clang-c/Index.h
+++ b/contrib/llvm/tools/clang/include/clang-c/Index.h
@@ -833,14 +833,24 @@ enum CXTranslationUnit_Flags {
/**
* \brief Used to indicate that the "detailed" preprocessing record,
- * if requested, should also contain nested macro instantiations.
+ * if requested, should also contain nested macro expansions.
*
- * Nested macro instantiations (i.e., macro instantiations that occur
- * inside another macro instantiation) can, in some code bases, require
+ * Nested macro expansions (i.e., macro expansions that occur
+ * inside another macro expansion) can, in some code bases, require
* a large amount of storage to due preprocessor metaprogramming. Moreover,
* its fairly rare that this information is useful for libclang clients.
*/
- CXTranslationUnit_NestedMacroInstantiations = 0x40
+ CXTranslationUnit_NestedMacroExpansions = 0x40,
+
+ /**
+ * \brief Legacy name to indicate that the "detailed" preprocessing record,
+ * if requested, should contain nested macro expansions.
+ *
+ * \see CXTranslationUnit_NestedMacroExpansions for the current name for this
+ * value, and its semantics. This is just an alias.
+ */
+ CXTranslationUnit_NestedMacroInstantiations =
+ CXTranslationUnit_NestedMacroExpansions
};
/**
@@ -933,6 +943,41 @@ enum CXSaveTranslationUnit_Flags {
CINDEX_LINKAGE unsigned clang_defaultSaveOptions(CXTranslationUnit TU);
/**
+ * \brief Describes the kind of error that occurred (if any) in a call to
+ * \c clang_saveTranslationUnit().
+ */
+enum CXSaveError {
+ /**
+ * \brief Indicates that no error occurred while saving a translation unit.
+ */
+ CXSaveError_None = 0,
+
+ /**
+ * \brief Indicates that an unknown error occurred while attempting to save
+ * the file.
+ *
+ * This error typically indicates that file I/O failed when attempting to
+ * write the file.
+ */
+ CXSaveError_Unknown = 1,
+
+ /**
+ * \brief Indicates that errors during translation prevented this attempt
+ * to save the translation unit.
+ *
+ * Errors that prevent the translation unit from being saved can be
+ * extracted using \c clang_getNumDiagnostics() and \c clang_getDiagnostic().
+ */
+ CXSaveError_TranslationErrors = 2,
+
+ /**
+ * \brief Indicates that the translation unit to be saved was somehow
+ * invalid (e.g., NULL).
+ */
+ CXSaveError_InvalidTU = 3
+};
+
+/**
* \brief Saves a translation unit into a serialized representation of
* that translation unit on disk.
*
@@ -951,8 +996,9 @@ CINDEX_LINKAGE unsigned clang_defaultSaveOptions(CXTranslationUnit TU);
* is saved. This should be a bitwise OR of the
* CXSaveTranslationUnit_XXX flags.
*
- * \returns Zero if the translation unit was saved successfully, a
- * non-zero value otherwise.
+ * \returns A value that will match one of the enumerators of the CXSaveError
+ * enumeration. Zero (CXSaveError_None) indicates that the translation unit was
+ * saved successfully, while a non-zero value indicates that a problem occurred.
*/
CINDEX_LINKAGE int clang_saveTranslationUnit(CXTranslationUnit TU,
const char *FileName,
@@ -1385,7 +1431,8 @@ enum CXCursorKind {
/* Preprocessing */
CXCursor_PreprocessingDirective = 500,
CXCursor_MacroDefinition = 501,
- CXCursor_MacroInstantiation = 502,
+ CXCursor_MacroExpansion = 502,
+ CXCursor_MacroInstantiation = CXCursor_MacroExpansion,
CXCursor_InclusionDirective = 503,
CXCursor_FirstPreprocessing = CXCursor_PreprocessingDirective,
CXCursor_LastPreprocessing = CXCursor_InclusionDirective
@@ -1474,6 +1521,11 @@ CINDEX_LINKAGE unsigned clang_isExpression(enum CXCursorKind);
CINDEX_LINKAGE unsigned clang_isStatement(enum CXCursorKind);
/**
+ * \brief Determine whether the given cursor kind represents an attribute.
+ */
+CINDEX_LINKAGE unsigned clang_isAttribute(enum CXCursorKind);
+
+/**
* \brief Determine whether the given cursor kind represents an invalid
* cursor.
*/
@@ -2830,6 +2882,137 @@ enum CXCodeComplete_Flags {
};
/**
+ * \brief Bits that represent the context under which completion is occurring.
+ *
+ * The enumerators in this enumeration may be bitwise-OR'd together if multiple
+ * contexts are occurring simultaneously.
+ */
+enum CXCompletionContext {
+ /**
+ * \brief The context for completions is unexposed, as only Clang results
+ * should be included. (This is equivalent to having no context bits set.)
+ */
+ CXCompletionContext_Unexposed = 0,
+
+ /**
+ * \brief Completions for any possible type should be included in the results.
+ */
+ CXCompletionContext_AnyType = 1 << 0,
+
+ /**
+ * \brief Completions for any possible value (variables, function calls, etc.)
+ * should be included in the results.
+ */
+ CXCompletionContext_AnyValue = 1 << 1,
+ /**
+ * \brief Completions for values that resolve to an Objective-C object should
+ * be included in the results.
+ */
+ CXCompletionContext_ObjCObjectValue = 1 << 2,
+ /**
+ * \brief Completions for values that resolve to an Objective-C selector
+ * should be included in the results.
+ */
+ CXCompletionContext_ObjCSelectorValue = 1 << 3,
+ /**
+ * \brief Completions for values that resolve to a C++ class type should be
+ * included in the results.
+ */
+ CXCompletionContext_CXXClassTypeValue = 1 << 4,
+
+ /**
+ * \brief Completions for fields of the member being accessed using the dot
+ * operator should be included in the results.
+ */
+ CXCompletionContext_DotMemberAccess = 1 << 5,
+ /**
+ * \brief Completions for fields of the member being accessed using the arrow
+ * operator should be included in the results.
+ */
+ CXCompletionContext_ArrowMemberAccess = 1 << 6,
+ /**
+ * \brief Completions for properties of the Objective-C object being accessed
+ * using the dot operator should be included in the results.
+ */
+ CXCompletionContext_ObjCPropertyAccess = 1 << 7,
+
+ /**
+ * \brief Completions for enum tags should be included in the results.
+ */
+ CXCompletionContext_EnumTag = 1 << 8,
+ /**
+ * \brief Completions for union tags should be included in the results.
+ */
+ CXCompletionContext_UnionTag = 1 << 9,
+ /**
+ * \brief Completions for struct tags should be included in the results.
+ */
+ CXCompletionContext_StructTag = 1 << 10,
+
+ /**
+ * \brief Completions for C++ class names should be included in the results.
+ */
+ CXCompletionContext_ClassTag = 1 << 11,
+ /**
+ * \brief Completions for C++ namespaces and namespace aliases should be
+ * included in the results.
+ */
+ CXCompletionContext_Namespace = 1 << 12,
+ /**
+ * \brief Completions for C++ nested name specifiers should be included in
+ * the results.
+ */
+ CXCompletionContext_NestedNameSpecifier = 1 << 13,
+
+ /**
+ * \brief Completions for Objective-C interfaces (classes) should be included
+ * in the results.
+ */
+ CXCompletionContext_ObjCInterface = 1 << 14,
+ /**
+ * \brief Completions for Objective-C protocols should be included in
+ * the results.
+ */
+ CXCompletionContext_ObjCProtocol = 1 << 15,
+ /**
+ * \brief Completions for Objective-C categories should be included in
+ * the results.
+ */
+ CXCompletionContext_ObjCCategory = 1 << 16,
+ /**
+ * \brief Completions for Objective-C instance messages should be included
+ * in the results.
+ */
+ CXCompletionContext_ObjCInstanceMessage = 1 << 17,
+ /**
+ * \brief Completions for Objective-C class messages should be included in
+ * the results.
+ */
+ CXCompletionContext_ObjCClassMessage = 1 << 18,
+ /**
+ * \brief Completions for Objective-C selector names should be included in
+ * the results.
+ */
+ CXCompletionContext_ObjCSelectorName = 1 << 19,
+
+ /**
+ * \brief Completions for preprocessor macro names should be included in
+ * the results.
+ */
+ CXCompletionContext_MacroName = 1 << 20,
+
+ /**
+ * \brief Natural language completions should be included in the results.
+ */
+ CXCompletionContext_NaturalLanguage = 1 << 21,
+
+ /**
+ * \brief The current context is unknown, so set all contexts.
+ */
+ CXCompletionContext_Unknown = ((1 << 22) - 1)
+};
+
+/**
* \brief Returns a default set of code-completion options that can be
* passed to\c clang_codeCompleteAt().
*/
@@ -2950,6 +3133,19 @@ CXDiagnostic clang_codeCompleteGetDiagnostic(CXCodeCompleteResults *Results,
unsigned Index);
/**
+ * \brief Determines what compeltions are appropriate for the context
+ * the given code completion.
+ *
+ * \param Results the code completion results to query
+ *
+ * \returns the kinds of completions that are appropriate for use
+ * along with the given code completion results.
+ */
+CINDEX_LINKAGE
+unsigned long long clang_codeCompleteGetContexts(
+ CXCodeCompleteResults *Results);
+
+/**
* @}
*/
@@ -3005,6 +3201,51 @@ CINDEX_LINKAGE void clang_getInclusions(CXTranslationUnit tu,
* @}
*/
+/** \defgroup CINDEX_REMAPPING Remapping functions
+ *
+ * @{
+ */
+
+/**
+ * \brief A remapping of original source files and their translated files.
+ */
+typedef void *CXRemapping;
+
+/**
+ * \brief Retrieve a remapping.
+ *
+ * \param path the path that contains metadata about remappings.
+ *
+ * \returns the requested remapping. This remapping must be freed
+ * via a call to \c clang_remap_dispose(). Can return NULL if an error occurred.
+ */
+CINDEX_LINKAGE CXRemapping clang_getRemappings(const char *path);
+
+/**
+ * \brief Determine the number of remappings.
+ */
+CINDEX_LINKAGE unsigned clang_remap_getNumFiles(CXRemapping);
+
+/**
+ * \brief Get the original and the associated filename from the remapping.
+ *
+ * \param original If non-NULL, will be set to the original filename.
+ *
+ * \param transformed If non-NULL, will be set to the filename that the original
+ * is associated with.
+ */
+CINDEX_LINKAGE void clang_remap_getFilenames(CXRemapping, unsigned index,
+ CXString *original, CXString *transformed);
+
+/**
+ * \brief Dispose the remapping.
+ */
+CINDEX_LINKAGE void clang_remap_dispose(CXRemapping);
+
+/**
+ * @}
+ */
+
/**
* @}
*/
diff --git a/contrib/llvm/tools/clang/include/clang/ARCMigrate/ARCMT.h b/contrib/llvm/tools/clang/include/clang/ARCMigrate/ARCMT.h
new file mode 100644
index 0000000..ad5cf4a
--- /dev/null
+++ b/contrib/llvm/tools/clang/include/clang/ARCMigrate/ARCMT.h
@@ -0,0 +1,94 @@
+//===-- ARCMT.h - ARC Migration Rewriter ------------------------*- C++ -*-===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+#ifndef LLVM_CLANG_ARCMIGRATE_ARCMT_H
+#define LLVM_CLANG_ARCMIGRATE_ARCMT_H
+
+#include "clang/ARCMigrate/FileRemapper.h"
+#include "clang/Frontend/CompilerInvocation.h"
+
+namespace clang {
+ class ASTContext;
+ class DiagnosticClient;
+
+namespace arcmt {
+ class MigrationPass;
+
+/// \brief Creates an AST with the provided CompilerInvocation but with these
+/// changes:
+/// -if a PCH/PTH is set, the original header is used instead
+/// -Automatic Reference Counting mode is enabled
+///
+/// It then checks the AST and produces errors/warning for ARC migration issues
+/// that the user needs to handle manually.
+///
+/// \returns false if no error is produced, true otherwise.
+bool checkForManualIssues(CompilerInvocation &CI,
+ llvm::StringRef Filename, InputKind Kind,
+ DiagnosticClient *DiagClient);
+
+/// \brief Works similar to checkForManualIssues but instead of checking, it
+/// applies automatic modifications to source files to conform to ARC.
+///
+/// \returns false if no error is produced, true otherwise.
+bool applyTransformations(CompilerInvocation &origCI,
+ llvm::StringRef Filename, InputKind Kind,
+ DiagnosticClient *DiagClient);
+
+/// \brief Applies automatic modifications and produces temporary files
+/// and metadata into the \arg outputDir path.
+///
+/// \returns false if no error is produced, true otherwise.
+bool migrateWithTemporaryFiles(CompilerInvocation &origCI,
+ llvm::StringRef Filename, InputKind Kind,
+ DiagnosticClient *DiagClient,
+ llvm::StringRef outputDir);
+
+/// \brief Get the set of file remappings from the \arg outputDir path that
+/// migrateWithTemporaryFiles produced.
+///
+/// \returns false if no error is produced, true otherwise.
+bool getFileRemappings(std::vector<std::pair<std::string,std::string> > &remap,
+ llvm::StringRef outputDir,
+ DiagnosticClient *DiagClient);
+
+typedef void (*TransformFn)(MigrationPass &pass);
+
+std::vector<TransformFn> getAllTransformations();
+
+class MigrationProcess {
+ CompilerInvocation OrigCI;
+ DiagnosticClient *DiagClient;
+ FileRemapper Remapper;
+
+public:
+ MigrationProcess(const CompilerInvocation &CI, DiagnosticClient *diagClient,
+ llvm::StringRef outputDir = llvm::StringRef());
+
+ class RewriteListener {
+ public:
+ virtual ~RewriteListener();
+
+ virtual void start(ASTContext &Ctx) { }
+ virtual void finish() { }
+
+ virtual void insert(SourceLocation loc, llvm::StringRef text) { }
+ virtual void remove(CharSourceRange range) { }
+ };
+
+ bool applyTransform(TransformFn trans, RewriteListener *listener = 0);
+
+ FileRemapper &getRemapper() { return Remapper; }
+};
+
+} // end namespace arcmt
+
+} // end namespace clang
+
+#endif
diff --git a/contrib/llvm/tools/clang/include/clang/ARCMigrate/ARCMTActions.h b/contrib/llvm/tools/clang/include/clang/ARCMigrate/ARCMTActions.h
new file mode 100644
index 0000000..4c714f5
--- /dev/null
+++ b/contrib/llvm/tools/clang/include/clang/ARCMigrate/ARCMTActions.h
@@ -0,0 +1,47 @@
+//===--- ARCMTActions.h - ARC Migrate Tool Frontend Actions -----*- C++ -*-===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+#ifndef LLVM_CLANG_ARCMIGRATE_ARCMT_ACTION_H
+#define LLVM_CLANG_ARCMIGRATE_ARCMT_ACTION_H
+
+#include "clang/Frontend/FrontendAction.h"
+#include "llvm/ADT/OwningPtr.h"
+
+namespace clang {
+namespace arcmt {
+
+class CheckAction : public WrapperFrontendAction {
+protected:
+ virtual bool BeginInvocation(CompilerInstance &CI);
+
+public:
+ CheckAction(FrontendAction *WrappedAction);
+};
+
+class ModifyAction : public WrapperFrontendAction {
+protected:
+ virtual bool BeginInvocation(CompilerInstance &CI);
+
+public:
+ ModifyAction(FrontendAction *WrappedAction);
+};
+
+class MigrateAction : public WrapperFrontendAction {
+ std::string MigrateDir;
+protected:
+ virtual bool BeginInvocation(CompilerInstance &CI);
+
+public:
+ MigrateAction(FrontendAction *WrappedAction, llvm::StringRef migrateDir);
+};
+
+}
+}
+
+#endif
diff --git a/contrib/llvm/tools/clang/include/clang/ARCMigrate/FileRemapper.h b/contrib/llvm/tools/clang/include/clang/ARCMigrate/FileRemapper.h
new file mode 100644
index 0000000..809f6a5
--- /dev/null
+++ b/contrib/llvm/tools/clang/include/clang/ARCMigrate/FileRemapper.h
@@ -0,0 +1,76 @@
+//===-- FileRemapper.h - File Remapping Helper ------------------*- C++ -*-===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+#ifndef LLVM_CLANG_ARCMIGRATE_FILEREMAPPER_H
+#define LLVM_CLANG_ARCMIGRATE_FILEREMAPPER_H
+
+#include "llvm/ADT/OwningPtr.h"
+#include "llvm/ADT/PointerUnion.h"
+#include "llvm/ADT/DenseMap.h"
+#include "llvm/ADT/StringRef.h"
+
+namespace llvm {
+ class MemoryBuffer;
+}
+
+namespace clang {
+ class FileManager;
+ class FileEntry;
+ class Diagnostic;
+ class CompilerInvocation;
+
+namespace arcmt {
+
+class FileRemapper {
+ // FIXME: Reuse the same FileManager for multiple ASTContexts.
+ llvm::OwningPtr<FileManager> FileMgr;
+
+ typedef llvm::PointerUnion<const FileEntry *, llvm::MemoryBuffer *> Target;
+ typedef llvm::DenseMap<const FileEntry *, Target> MappingsTy;
+ MappingsTy FromToMappings;
+
+ llvm::DenseMap<const FileEntry *, const FileEntry *> ToFromMappings;
+
+public:
+ FileRemapper();
+ ~FileRemapper();
+
+ bool initFromDisk(llvm::StringRef outputDir, Diagnostic &Diag,
+ bool ignoreIfFilesChanged);
+ bool flushToDisk(llvm::StringRef outputDir, Diagnostic &Diag);
+
+ bool overwriteOriginal(Diagnostic &Diag,
+ llvm::StringRef outputDir = llvm::StringRef());
+
+ void remap(llvm::StringRef filePath, llvm::MemoryBuffer *memBuf);
+ void remap(llvm::StringRef filePath, llvm::StringRef newPath);
+
+ void applyMappings(CompilerInvocation &CI) const;
+
+ void transferMappingsAndClear(CompilerInvocation &CI);
+
+ void clear(llvm::StringRef outputDir = llvm::StringRef());
+
+private:
+ void remap(const FileEntry *file, llvm::MemoryBuffer *memBuf);
+ void remap(const FileEntry *file, const FileEntry *newfile);
+
+ const FileEntry *getOriginalFile(llvm::StringRef filePath);
+ void resetTarget(Target &targ);
+
+ bool report(const std::string &err, Diagnostic &Diag);
+
+ std::string getRemapInfoFile(llvm::StringRef outputDir);
+};
+
+} // end namespace arcmt
+
+} // end namespace clang
+
+#endif
diff --git a/contrib/llvm/tools/clang/include/clang/AST/ASTContext.h b/contrib/llvm/tools/clang/include/clang/AST/ASTContext.h
index 517c25d..1526f36 100644
--- a/contrib/llvm/tools/clang/include/clang/AST/ASTContext.h
+++ b/contrib/llvm/tools/clang/include/clang/AST/ASTContext.h
@@ -124,7 +124,10 @@ class ASTContext : public llvm::RefCountedBase<ASTContext> {
mutable llvm::FoldingSet<QualifiedTemplateName> QualifiedTemplateNames;
mutable llvm::FoldingSet<DependentTemplateName> DependentTemplateNames;
- mutable llvm::FoldingSet<SubstTemplateTemplateParmPackStorage>
+ mutable llvm::FoldingSet<SubstTemplateTemplateParmStorage>
+ SubstTemplateTemplateParms;
+ mutable llvm::ContextualFoldingSet<SubstTemplateTemplateParmPackStorage,
+ ASTContext&>
SubstTemplateTemplateParmPacks;
/// \brief The set of nested name specifiers.
@@ -993,6 +996,18 @@ public:
return getExtQualType(T, Qs);
}
+ /// getLifetimeQualifiedType - Returns a type with the given
+ /// lifetime qualifier.
+ QualType getLifetimeQualifiedType(QualType type,
+ Qualifiers::ObjCLifetime lifetime) {
+ assert(type.getObjCLifetime() == Qualifiers::OCL_None);
+ assert(lifetime != Qualifiers::OCL_None);
+
+ Qualifiers qs;
+ qs.addObjCLifetime(lifetime);
+ return getQualifiedType(type, qs);
+ }
+
DeclarationNameInfo getNameForTemplate(TemplateName Name,
SourceLocation NameLoc) const;
@@ -1007,6 +1022,8 @@ public:
const IdentifierInfo *Name) const;
TemplateName getDependentTemplateName(NestedNameSpecifier *NNS,
OverloadedOperatorKind Operator) const;
+ TemplateName getSubstTemplateTemplateParm(TemplateTemplateParmDecl *param,
+ TemplateName replacement) const;
TemplateName getSubstTemplateTemplateParmPack(TemplateTemplateParmDecl *Param,
const TemplateArgument &ArgPack) const;
@@ -1044,7 +1061,9 @@ public:
/// isObjCNSObjectType - Return true if this is an NSObject object with
/// its NSObject attribute set.
- bool isObjCNSObjectType(QualType Ty) const;
+ static bool isObjCNSObjectType(QualType Ty) {
+ return Ty->isObjCNSObjectType();
+ }
//===--------------------------------------------------------------------===//
// Type Sizing and Analysis
@@ -1315,6 +1334,18 @@ public:
/// getConstantArrayElementCount - Returns number of constant array elements.
uint64_t getConstantArrayElementCount(const ConstantArrayType *CA) const;
+ /// \brief Perform adjustment on the parameter type of a function.
+ ///
+ /// This routine adjusts the given parameter type @p T to the actual
+ /// parameter type used by semantic analysis (C99 6.7.5.3p[7,8],
+ /// C++ [dcl.fct]p3). The adjusted parameter type is returned.
+ QualType getAdjustedParameterType(QualType T);
+
+ /// \brief Retrieve the parameter type as adjusted for use in the signature
+ /// of a function, decaying array and function types and removing top-level
+ /// cv-qualifiers.
+ QualType getSignatureParameterType(QualType T);
+
/// getArrayDecayedType - Return the properly qualified result of decaying the
/// specified array type to a pointer. This operation is non-trivial when
/// handling typedefs etc. The canonical type of "T" must be an array type,
@@ -1328,6 +1359,10 @@ public:
/// integer type.
QualType getPromotedIntegerType(QualType PromotableType) const;
+ /// \brief Recurses in pointer/array types until it finds an objc retainable
+ /// type and returns its ownership.
+ Qualifiers::ObjCLifetime getInnerObjCOwnership(QualType T) const;
+
/// \brief Whether this is a promotable bitfield reference according
/// to C99 6.3.1.1p2, bullet 2 (and GCC extensions).
///
@@ -1382,6 +1417,7 @@ public:
bool typesAreCompatible(QualType T1, QualType T2,
bool CompareUnqualified = false); // C99 6.2.7p1
+ bool propertyTypesAreCompatible(QualType, QualType);
bool typesAreBlockPointerCompatible(QualType, QualType);
bool isObjCIdType(QualType T) const {
diff --git a/contrib/llvm/tools/clang/include/clang/AST/ASTDiagnostic.h b/contrib/llvm/tools/clang/include/clang/AST/ASTDiagnostic.h
index 1cb803a..70a548d 100644
--- a/contrib/llvm/tools/clang/include/clang/AST/ASTDiagnostic.h
+++ b/contrib/llvm/tools/clang/include/clang/AST/ASTDiagnostic.h
@@ -33,16 +33,18 @@ namespace clang {
/// diagnostics. It is meant to be used as the argument to
/// \c Diagnostic::SetArgToStringFn(), where the cookie is an \c ASTContext
/// pointer.
- void FormatASTNodeDiagnosticArgument(Diagnostic::ArgumentKind Kind,
- intptr_t Val,
- const char *Modifier,
- unsigned ModLen,
- const char *Argument,
- unsigned ArgLen,
- const Diagnostic::ArgumentValue *PrevArgs,
- unsigned NumPrevArgs,
- llvm::SmallVectorImpl<char> &Output,
- void *Cookie);
+ void FormatASTNodeDiagnosticArgument(
+ Diagnostic::ArgumentKind Kind,
+ intptr_t Val,
+ const char *Modifier,
+ unsigned ModLen,
+ const char *Argument,
+ unsigned ArgLen,
+ const Diagnostic::ArgumentValue *PrevArgs,
+ unsigned NumPrevArgs,
+ llvm::SmallVectorImpl<char> &Output,
+ void *Cookie,
+ llvm::SmallVectorImpl<intptr_t> &QualTypeVals);
} // end namespace clang
#endif
diff --git a/contrib/llvm/tools/clang/include/clang/AST/CanonicalType.h b/contrib/llvm/tools/clang/include/clang/AST/CanonicalType.h
index 2518814..38e6b41 100644
--- a/contrib/llvm/tools/clang/include/clang/AST/CanonicalType.h
+++ b/contrib/llvm/tools/clang/include/clang/AST/CanonicalType.h
@@ -250,7 +250,6 @@ public:
LLVM_CLANG_CANPROXY_SIMPLE_ACCESSOR(bool, isObjectType)
LLVM_CLANG_CANPROXY_SIMPLE_ACCESSOR(bool, isIncompleteType)
LLVM_CLANG_CANPROXY_SIMPLE_ACCESSOR(bool, isIncompleteOrObjectType)
- LLVM_CLANG_CANPROXY_SIMPLE_ACCESSOR(bool, isPODType)
LLVM_CLANG_CANPROXY_SIMPLE_ACCESSOR(bool, isVariablyModifiedType)
LLVM_CLANG_CANPROXY_SIMPLE_ACCESSOR(bool, isIntegerType)
LLVM_CLANG_CANPROXY_SIMPLE_ACCESSOR(bool, isEnumeralType)
@@ -295,6 +294,7 @@ public:
LLVM_CLANG_CANPROXY_SIMPLE_ACCESSOR(bool, isUnsignedIntegerOrEnumerationType)
LLVM_CLANG_CANPROXY_SIMPLE_ACCESSOR(bool, isConstantSizeType)
LLVM_CLANG_CANPROXY_SIMPLE_ACCESSOR(bool, isSpecifierType)
+ LLVM_CLANG_CANPROXY_SIMPLE_ACCESSOR(CXXRecordDecl*, getAsCXXRecordDecl)
/// \brief Retrieve the proxy-adaptor type.
///
diff --git a/contrib/llvm/tools/clang/include/clang/AST/Decl.h b/contrib/llvm/tools/clang/include/clang/AST/Decl.h
index d993d34..5691e99 100644
--- a/contrib/llvm/tools/clang/include/clang/AST/Decl.h
+++ b/contrib/llvm/tools/clang/include/clang/AST/Decl.h
@@ -702,8 +702,12 @@ private:
/// \brief Whether this variable is the for-range-declaration in a C++0x
/// for-range statement.
unsigned CXXForRangeDecl : 1;
+
+ /// \brief Whether this variable is an ARC pseudo-__strong
+ /// variable; see isARCPseudoStrong() for details.
+ unsigned ARCPseudoStrong : 1;
};
- enum { NumVarDeclBits = 13 }; // two reserved bits for now
+ enum { NumVarDeclBits = 13 }; // one reserved bit
friend class ASTDeclReader;
friend class StmtIteratorBase;
@@ -975,6 +979,20 @@ public:
void setInit(Expr *I);
+ /// \brief Determine whether this variable is a reference that
+ /// extends the lifetime of its temporary initializer.
+ ///
+ /// A reference extends the lifetime of its temporary initializer if
+ /// it's initializer is an rvalue that would normally go out of scope
+ /// at the end of the initializer (a full expression). In such cases,
+ /// the reference itself takes ownership of the temporary, which will
+ /// be destroyed when the reference goes out of scope. For example:
+ ///
+ /// \code
+ /// const int &r = 1.0; // creates a temporary of type 'int'
+ /// \endcode
+ bool extendsLifetimeOfTemporary() const;
+
EvaluatedStmt *EnsureEvaluatedStmt() const {
EvaluatedStmt *Eval = Init.dyn_cast<EvaluatedStmt *>();
if (!Eval) {
@@ -1102,6 +1120,13 @@ public:
/// a C++0x for-range statement.
bool isCXXForRangeDecl() const { return VarDeclBits.CXXForRangeDecl; }
void setCXXForRangeDecl(bool FRD) { VarDeclBits.CXXForRangeDecl = FRD; }
+
+ /// \brief Determine whether this variable is an ARC pseudo-__strong
+ /// variable. A pseudo-__strong variable has a __strong-qualified
+ /// type but does not actually retain the object written into it.
+ /// Generally such variables are also 'const' for safety.
+ bool isARCPseudoStrong() const { return VarDeclBits.ARCPseudoStrong; }
+ void setARCPseudoStrong(bool ps) { VarDeclBits.ARCPseudoStrong = ps; }
/// \brief If this variable is an instantiated static data member of a
/// class template specialization, returns the templated static data member
@@ -2014,6 +2039,11 @@ public:
InitializerOrBitWidth.setPointer(BW);
InitializerOrBitWidth.setInt(1);
}
+ /// removeBitWidth - Remove the bitfield width from this member.
+ void removeBitWidth() {
+ assert(isBitField() && "no bit width to remove");
+ InitializerOrBitWidth.setPointer(0);
+ }
/// hasInClassInitializer - Determine whether this member has a C++0x in-class
/// initializer.
@@ -2956,6 +2986,8 @@ public:
bool capturesCXXThis() const { return CapturesCXXThis; }
+ bool capturesVariable(const VarDecl *var) const;
+
void setCaptures(ASTContext &Context,
const Capture *begin,
const Capture *end,
diff --git a/contrib/llvm/tools/clang/include/clang/AST/DeclBase.h b/contrib/llvm/tools/clang/include/clang/AST/DeclBase.h
index b5047b9..8b2ef2a 100644
--- a/contrib/llvm/tools/clang/include/clang/AST/DeclBase.h
+++ b/contrib/llvm/tools/clang/include/clang/AST/DeclBase.h
@@ -381,7 +381,24 @@ public:
attr_iterator attr_end() const {
return hasAttrs() ? getAttrs().end() : 0;
}
-
+
+ template <typename T>
+ void dropAttr() {
+ if (!HasAttrs) return;
+
+ AttrVec &Attrs = getAttrs();
+ for (unsigned i = 0, e = Attrs.size(); i != e; /* in loop */) {
+ if (isa<T>(Attrs[i])) {
+ Attrs.erase(Attrs.begin() + i);
+ --e;
+ }
+ else
+ ++i;
+ }
+ if (Attrs.empty())
+ HasAttrs = false;
+ }
+
template <typename T>
specific_attr_iterator<T> specific_attr_begin() const {
return specific_attr_iterator<T>(attr_begin());
diff --git a/contrib/llvm/tools/clang/include/clang/AST/DeclCXX.h b/contrib/llvm/tools/clang/include/clang/AST/DeclCXX.h
index 42a12eb..dd490f4 100644
--- a/contrib/llvm/tools/clang/include/clang/AST/DeclCXX.h
+++ b/contrib/llvm/tools/clang/include/clang/AST/DeclCXX.h
@@ -19,7 +19,6 @@
#include "clang/AST/Decl.h"
#include "clang/AST/TypeLoc.h"
#include "clang/AST/UnresolvedSet.h"
-#include "llvm/ADT/SmallVector.h"
#include "llvm/ADT/SmallPtrSet.h"
namespace clang {
diff --git a/contrib/llvm/tools/clang/include/clang/AST/DeclObjC.h b/contrib/llvm/tools/clang/include/clang/AST/DeclObjC.h
index 74ceb43..d318fc2 100644
--- a/contrib/llvm/tools/clang/include/clang/AST/DeclObjC.h
+++ b/contrib/llvm/tools/clang/include/clang/AST/DeclObjC.h
@@ -641,6 +641,18 @@ public:
return false;
}
+ /// isArcWeakrefUnavailable - Checks for a class or one of its super classes
+ /// to be incompatible with __weak references. Returns true if it is.
+ bool isArcWeakrefUnavailable() const {
+ const ObjCInterfaceDecl *Class = this;
+ while (Class) {
+ if (Class->hasAttr<ArcWeakrefUnavailableAttr>())
+ return true;
+ Class = Class->getSuperClass();
+ }
+ return false;
+ }
+
ObjCIvarDecl *lookupInstanceVariable(IdentifierInfo *IVarName,
ObjCInterfaceDecl *&ClassDeclared);
ObjCIvarDecl *lookupInstanceVariable(IdentifierInfo *IVarName) {
@@ -1240,6 +1252,9 @@ class ObjCImplementationDecl : public ObjCImplDecl {
/// IvarInitializers - The arguments used to initialize the ivars
CXXCtorInitializer **IvarInitializers;
unsigned NumIvarInitializers;
+
+ /// true if class has a .cxx_[construct,destruct] method.
+ bool HasCXXStructors : 1;
/// true of class extension has at least one bitfield ivar.
bool HasSynthBitfield : 1;
@@ -1249,7 +1264,7 @@ class ObjCImplementationDecl : public ObjCImplDecl {
ObjCInterfaceDecl *superDecl)
: ObjCImplDecl(ObjCImplementation, DC, L, classInterface),
SuperClass(superDecl), IvarInitializers(0), NumIvarInitializers(0),
- HasSynthBitfield(false) {}
+ HasCXXStructors(false), HasSynthBitfield(false) {}
public:
static ObjCImplementationDecl *Create(ASTContext &C, DeclContext *DC,
SourceLocation L,
@@ -1287,6 +1302,9 @@ public:
void setIvarInitializers(ASTContext &C,
CXXCtorInitializer ** initializers,
unsigned numInitializers);
+
+ bool hasCXXStructors() const { return HasCXXStructors; }
+ void setHasCXXStructors(bool val) { HasCXXStructors = val; }
bool hasSynthBitfield() const { return HasSynthBitfield; }
void setHasSynthBitfield (bool val) { HasSynthBitfield = val; }
@@ -1393,7 +1411,16 @@ public:
OBJC_PR_copy = 0x20,
OBJC_PR_nonatomic = 0x40,
OBJC_PR_setter = 0x80,
- OBJC_PR_atomic = 0x100
+ OBJC_PR_atomic = 0x100,
+ OBJC_PR_weak = 0x200,
+ OBJC_PR_strong = 0x400,
+ OBJC_PR_unsafe_unretained = 0x800
+ // Adding a property should change NumPropertyAttrsBits
+ };
+
+ enum {
+ /// \brief Number of bits fitting all the property attributes.
+ NumPropertyAttrsBits = 12
};
enum SetterKind { Assign, Retain, Copy };
@@ -1401,8 +1428,8 @@ public:
private:
SourceLocation AtLoc; // location of @property
TypeSourceInfo *DeclType;
- unsigned PropertyAttributes : 9;
- unsigned PropertyAttributesAsWritten : 9;
+ unsigned PropertyAttributes : NumPropertyAttrsBits;
+ unsigned PropertyAttributesAsWritten : NumPropertyAttrsBits;
// @required/@optional
unsigned PropertyImplementation : 2;
@@ -1445,6 +1472,12 @@ public:
PropertyAttributeKind getPropertyAttributesAsWritten() const {
return PropertyAttributeKind(PropertyAttributesAsWritten);
}
+
+ bool hasWrittenStorageAttribute() const {
+ return PropertyAttributesAsWritten & (OBJC_PR_assign | OBJC_PR_copy |
+ OBJC_PR_unsafe_unretained | OBJC_PR_retain | OBJC_PR_strong |
+ OBJC_PR_weak);
+ }
void setPropertyAttributesAsWritten(PropertyAttributeKind PRVal) {
PropertyAttributesAsWritten = PRVal;
@@ -1466,7 +1499,7 @@ public:
/// the property setter. This is only valid if the property has been
/// defined to have a setter.
SetterKind getSetterKind() const {
- if (PropertyAttributes & OBJC_PR_retain)
+ if (PropertyAttributes & (OBJC_PR_retain|OBJC_PR_strong))
return Retain;
if (PropertyAttributes & OBJC_PR_copy)
return Copy;
diff --git a/contrib/llvm/tools/clang/include/clang/AST/DeclTemplate.h b/contrib/llvm/tools/clang/include/clang/AST/DeclTemplate.h
index dc50d61..d2b1d39 100644
--- a/contrib/llvm/tools/clang/include/clang/AST/DeclTemplate.h
+++ b/contrib/llvm/tools/clang/include/clang/AST/DeclTemplate.h
@@ -314,6 +314,10 @@ public:
return (TemplateSpecializationKind)(Template.getInt() + 1);
}
+ bool isExplicitSpecialization() const {
+ return getTemplateSpecializationKind() == TSK_ExplicitSpecialization;
+ }
+
/// \brief Set the template specialization kind.
void setTemplateSpecializationKind(TemplateSpecializationKind TSK) {
assert(TSK != TSK_Undeclared &&
@@ -1398,6 +1402,10 @@ public:
return static_cast<TemplateSpecializationKind>(SpecializationKind);
}
+ bool isExplicitSpecialization() const {
+ return getSpecializationKind() == TSK_ExplicitSpecialization;
+ }
+
void setSpecializationKind(TemplateSpecializationKind TSK) {
SpecializationKind = TSK;
}
diff --git a/contrib/llvm/tools/clang/include/clang/AST/DeclarationName.h b/contrib/llvm/tools/clang/include/clang/AST/DeclarationName.h
index e54719b..bb09831 100644
--- a/contrib/llvm/tools/clang/include/clang/AST/DeclarationName.h
+++ b/contrib/llvm/tools/clang/include/clang/AST/DeclarationName.h
@@ -492,6 +492,9 @@ public:
LocInfo.CXXLiteralOperatorName.OpNameLoc = Loc.getRawEncoding();
}
+ /// \brief Determine whether this name involves a template parameter.
+ bool isInstantiationDependent() const;
+
/// \brief Determine whether this name contains an unexpanded
/// parameter pack.
bool containsUnexpandedParameterPack() const;
diff --git a/contrib/llvm/tools/clang/include/clang/AST/Expr.h b/contrib/llvm/tools/clang/include/clang/AST/Expr.h
index ce86458e..c7f8707 100644
--- a/contrib/llvm/tools/clang/include/clang/AST/Expr.h
+++ b/contrib/llvm/tools/clang/include/clang/AST/Expr.h
@@ -57,9 +57,12 @@ class Expr : public Stmt {
protected:
Expr(StmtClass SC, QualType T, ExprValueKind VK, ExprObjectKind OK,
- bool TD, bool VD, bool ContainsUnexpandedParameterPack) : Stmt(SC) {
+ bool TD, bool VD, bool ID, bool ContainsUnexpandedParameterPack)
+ : Stmt(SC)
+ {
ExprBits.TypeDependent = TD;
ExprBits.ValueDependent = VD;
+ ExprBits.InstantiationDependent = ID;
ExprBits.ValueKind = VK;
ExprBits.ObjectKind = OK;
ExprBits.ContainsUnexpandedParameterPack = ContainsUnexpandedParameterPack;
@@ -95,7 +98,11 @@ public:
bool isValueDependent() const { return ExprBits.ValueDependent; }
/// \brief Set whether this expression is value-dependent or not.
- void setValueDependent(bool VD) { ExprBits.ValueDependent = VD; }
+ void setValueDependent(bool VD) {
+ ExprBits.ValueDependent = VD;
+ if (VD)
+ ExprBits.InstantiationDependent = true;
+ }
/// isTypeDependent - Determines whether this expression is
/// type-dependent (C++ [temp.dep.expr]), which means that its type
@@ -111,7 +118,37 @@ public:
bool isTypeDependent() const { return ExprBits.TypeDependent; }
/// \brief Set whether this expression is type-dependent or not.
- void setTypeDependent(bool TD) { ExprBits.TypeDependent = TD; }
+ void setTypeDependent(bool TD) {
+ ExprBits.TypeDependent = TD;
+ if (TD)
+ ExprBits.InstantiationDependent = true;
+ }
+
+ /// \brief Whether this expression is instantiation-dependent, meaning that
+ /// it depends in some way on a template parameter, even if neither its type
+ /// nor (constant) value can change due to the template instantiation.
+ ///
+ /// In the following example, the expression \c sizeof(sizeof(T() + T())) is
+ /// instantiation-dependent (since it involves a template parameter \c T), but
+ /// is neither type- nor value-dependent, since the type of the inner
+ /// \c sizeof is known (\c std::size_t) and therefore the size of the outer
+ /// \c sizeof is known.
+ ///
+ /// \code
+ /// template<typename T>
+ /// void f(T x, T y) {
+ /// sizeof(sizeof(T() + T());
+ /// }
+ /// \endcode
+ ///
+ bool isInstantiationDependent() const {
+ return ExprBits.InstantiationDependent;
+ }
+
+ /// \brief Set whether this expression is instantiation-dependent or not.
+ void setInstantiationDependent(bool ID) {
+ ExprBits.InstantiationDependent = ID;
+ }
/// \brief Whether this expression contains an unexpanded parameter
/// pack (for C++0x variadic templates).
@@ -501,6 +538,14 @@ public:
/// the rules of C++ [expr.unary.noexcept].
CanThrowResult CanThrow(ASTContext &C) const;
+ /// IgnoreImpCasts - Skip past any implicit casts which might
+ /// surround this expression. Only skips ImplicitCastExprs.
+ Expr *IgnoreImpCasts();
+
+ /// IgnoreImplicit - Skip past any implicit AST nodes which might
+ /// surround this expression.
+ Expr *IgnoreImplicit() { return cast<Expr>(Stmt::IgnoreImplicit()); }
+
/// IgnoreParens - Ignore parentheses. If this Expr is a ParenExpr, return
/// its subexpression. If that subexpression is also a ParenExpr,
/// then this method recursively returns its subexpression, and so forth.
@@ -555,7 +600,10 @@ public:
/// \brief Whether this expression is an implicit reference to 'this' in C++.
bool isImplicitCXXThis() const;
-
+
+ const Expr *IgnoreImpCasts() const {
+ return const_cast<Expr*>(this)->IgnoreImpCasts();
+ }
const Expr *IgnoreParens() const {
return const_cast<Expr*>(this)->IgnoreParens();
}
@@ -595,7 +643,9 @@ public:
OpaqueValueExpr(SourceLocation Loc, QualType T, ExprValueKind VK,
ExprObjectKind OK = OK_Ordinary)
: Expr(OpaqueValueExprClass, T, VK, OK,
- T->isDependentType(), T->isDependentType(), false),
+ T->isDependentType(), T->isDependentType(),
+ T->isInstantiationDependentType(),
+ false),
SourceExpr(0), Loc(Loc) {
}
@@ -664,7 +714,8 @@ struct ExplicitTemplateArgumentList {
void initializeFrom(const TemplateArgumentListInfo &List);
void initializeFrom(const TemplateArgumentListInfo &List,
- bool &Dependent, bool &ContainsUnexpandedParameterPack);
+ bool &Dependent, bool &InstantiationDependent,
+ bool &ContainsUnexpandedParameterPack);
void copyInto(TemplateArgumentListInfo &List) const;
static std::size_t sizeFor(unsigned NumTemplateArgs);
static std::size_t sizeFor(const TemplateArgumentListInfo &List);
@@ -746,9 +797,10 @@ class DeclRefExpr : public Expr {
void computeDependence();
public:
- DeclRefExpr(ValueDecl *D, QualType T, ExprValueKind VK, SourceLocation L)
- : Expr(DeclRefExprClass, T, VK, OK_Ordinary, false, false, false),
- D(D), Loc(L) {
+ DeclRefExpr(ValueDecl *D, QualType T, ExprValueKind VK, SourceLocation L,
+ const DeclarationNameLoc &LocInfo = DeclarationNameLoc())
+ : Expr(DeclRefExprClass, T, VK, OK_Ordinary, false, false, false, false),
+ D(D), Loc(L), DNLoc(LocInfo) {
DeclRefExprBits.HasQualifier = 0;
DeclRefExprBits.HasExplicitTemplateArgs = 0;
DeclRefExprBits.HasFoundDecl = 0;
@@ -936,6 +988,7 @@ public:
PredefinedExpr(SourceLocation l, QualType type, IdentType IT)
: Expr(PredefinedExprClass, type, VK_LValue, OK_Ordinary,
type->isDependentType(), type->isDependentType(),
+ type->isInstantiationDependentType(),
/*ContainsUnexpandedParameterPack=*/false),
Loc(l), Type(IT) {}
@@ -1023,7 +1076,7 @@ public:
IntegerLiteral(ASTContext &C, const llvm::APInt &V,
QualType type, SourceLocation l)
: Expr(IntegerLiteralClass, type, VK_RValue, OK_Ordinary, false, false,
- false),
+ false, false),
Loc(l) {
assert(type->isIntegerType() && "Illegal type in IntegerLiteral");
assert(V.getBitWidth() == C.getIntWidth(type) &&
@@ -1066,7 +1119,7 @@ public:
// type should be IntTy
CharacterLiteral(unsigned value, bool iswide, QualType type, SourceLocation l)
: Expr(CharacterLiteralClass, type, VK_RValue, OK_Ordinary, false, false,
- false),
+ false, false),
Value(value), Loc(l), IsWide(iswide) {
}
@@ -1101,7 +1154,7 @@ class FloatingLiteral : public Expr {
FloatingLiteral(ASTContext &C, const llvm::APFloat &V, bool isexact,
QualType Type, SourceLocation L)
: Expr(FloatingLiteralClass, Type, VK_RValue, OK_Ordinary, false, false,
- false),
+ false, false),
IsExact(isexact), Loc(L) {
setValue(C, V);
}
@@ -1152,7 +1205,7 @@ class ImaginaryLiteral : public Expr {
public:
ImaginaryLiteral(Expr *val, QualType Ty)
: Expr(ImaginaryLiteralClass, Ty, VK_RValue, OK_Ordinary, false, false,
- false),
+ false, false),
Val(val) {}
/// \brief Build an empty imaginary literal.
@@ -1200,21 +1253,20 @@ class StringLiteral : public Expr {
SourceLocation TokLocs[1];
StringLiteral(QualType Ty) :
- Expr(StringLiteralClass, Ty, VK_LValue, OK_Ordinary, false, false, false) {}
+ Expr(StringLiteralClass, Ty, VK_LValue, OK_Ordinary, false, false, false,
+ false) {}
public:
/// This is the "fully general" constructor that allows representation of
/// strings formed from multiple concatenated tokens.
- static StringLiteral *Create(ASTContext &C, const char *StrData,
- unsigned ByteLength, bool Wide, bool Pascal,
- QualType Ty,
+ static StringLiteral *Create(ASTContext &C, llvm::StringRef Str, bool Wide,
+ bool Pascal, QualType Ty,
const SourceLocation *Loc, unsigned NumStrs);
/// Simple constructor for string literals made from one token.
- static StringLiteral *Create(ASTContext &C, const char *StrData,
- unsigned ByteLength, bool Wide,
+ static StringLiteral *Create(ASTContext &C, llvm::StringRef Str, bool Wide,
bool Pascal, QualType Ty, SourceLocation Loc) {
- return Create(C, StrData, ByteLength, Wide, Pascal, Ty, &Loc, 1);
+ return Create(C, Str, Wide, Pascal, Ty, &Loc, 1);
}
/// \brief Construct an empty string literal.
@@ -1289,6 +1341,7 @@ public:
: Expr(ParenExprClass, val->getType(),
val->getValueKind(), val->getObjectKind(),
val->isTypeDependent(), val->isValueDependent(),
+ val->isInstantiationDependent(),
val->containsUnexpandedParameterPack()),
L(l), R(r), Val(val) {}
@@ -1345,6 +1398,8 @@ public:
: Expr(UnaryOperatorClass, type, VK, OK,
input->isTypeDependent() || type->isDependentType(),
input->isValueDependent(),
+ (input->isInstantiationDependent() ||
+ type->isInstantiationDependentType()),
input->containsUnexpandedParameterPack()),
Opc(opc), Loc(l), Val(input) {}
@@ -1640,6 +1695,7 @@ public:
false, // Never type-dependent (C++ [temp.dep.expr]p3).
// Value-dependent if the argument is type-dependent.
TInfo->getType()->isDependentType(),
+ TInfo->getType()->isInstantiationDependentType(),
TInfo->getType()->containsUnexpandedParameterPack()),
Kind(ExprKind), isType(true), OpLoc(op), RParenLoc(rp) {
Argument.Ty = TInfo;
@@ -1652,6 +1708,7 @@ public:
false, // Never type-dependent (C++ [temp.dep.expr]p3).
// Value-dependent if the argument is type-dependent.
E->isTypeDependent(),
+ E->isInstantiationDependent(),
E->containsUnexpandedParameterPack()),
Kind(ExprKind), isType(false), OpLoc(op), RParenLoc(rp) {
Argument.Ex = E;
@@ -1729,6 +1786,8 @@ public:
: Expr(ArraySubscriptExprClass, t, VK, OK,
lhs->isTypeDependent() || rhs->isTypeDependent(),
lhs->isValueDependent() || rhs->isValueDependent(),
+ (lhs->isInstantiationDependent() ||
+ rhs->isInstantiationDependent()),
(lhs->containsUnexpandedParameterPack() ||
rhs->containsUnexpandedParameterPack())),
RBracketLoc(rbracketloc) {
@@ -1986,7 +2045,9 @@ public:
const DeclarationNameInfo &NameInfo, QualType ty,
ExprValueKind VK, ExprObjectKind OK)
: Expr(MemberExprClass, ty, VK, OK,
- base->isTypeDependent(), base->isValueDependent(),
+ base->isTypeDependent(),
+ base->isValueDependent(),
+ base->isInstantiationDependent(),
base->containsUnexpandedParameterPack()),
Base(base), MemberDecl(memberdecl), MemberLoc(NameInfo.getLoc()),
MemberDNLoc(NameInfo.getInfo()), IsArrow(isarrow),
@@ -2003,6 +2064,7 @@ public:
ExprValueKind VK, ExprObjectKind OK)
: Expr(MemberExprClass, ty, VK, OK,
base->isTypeDependent(), base->isValueDependent(),
+ base->isInstantiationDependent(),
base->containsUnexpandedParameterPack()),
Base(base), MemberDecl(memberdecl), MemberLoc(l), MemberDNLoc(),
IsArrow(isarrow),
@@ -2188,6 +2250,8 @@ public:
: Expr(CompoundLiteralExprClass, T, VK, OK_Ordinary,
tinfo->getType()->isDependentType(),
init->isValueDependent(),
+ (init->isInstantiationDependent() ||
+ tinfo->getType()->isInstantiationDependentType()),
init->containsUnexpandedParameterPack()),
LParenLoc(lparenloc), TInfo(tinfo), Init(init), FileScope(fileScope) {}
@@ -2276,6 +2340,9 @@ private:
case CK_IntegralComplexToReal:
case CK_IntegralComplexCast:
case CK_IntegralComplexToFloatingComplex:
+ case CK_ObjCProduceObject:
+ case CK_ObjCConsumeObject:
+ case CK_ObjCReclaimReturnedObject:
assert(!getType()->isBooleanType() && "unheralded conversion to bool");
// fallthrough to check for null base path
@@ -2318,6 +2385,8 @@ protected:
// Cast expressions are value-dependent if the type is
// dependent or if the subexpression is value-dependent.
ty->isDependentType() || (op && op->isValueDependent()),
+ (ty->isInstantiationDependentType() ||
+ (op && op->isInstantiationDependent())),
(ty->containsUnexpandedParameterPack() ||
op->containsUnexpandedParameterPack())),
Op(op) {
@@ -2426,6 +2495,13 @@ public:
static bool classof(const ImplicitCastExpr *) { return true; }
};
+inline Expr *Expr::IgnoreImpCasts() {
+ Expr *e = this;
+ while (ImplicitCastExpr *ice = dyn_cast<ImplicitCastExpr>(e))
+ e = ice->getSubExpr();
+ return e;
+}
+
/// ExplicitCastExpr - An explicit cast written in the source
/// code.
///
@@ -2551,6 +2627,8 @@ public:
: Expr(BinaryOperatorClass, ResTy, VK, OK,
lhs->isTypeDependent() || rhs->isTypeDependent(),
lhs->isValueDependent() || rhs->isValueDependent(),
+ (lhs->isInstantiationDependent() ||
+ rhs->isInstantiationDependent()),
(lhs->containsUnexpandedParameterPack() ||
rhs->containsUnexpandedParameterPack())),
Opc(opc), OpLoc(opLoc) {
@@ -2653,6 +2731,8 @@ protected:
: Expr(CompoundAssignOperatorClass, ResTy, VK, OK,
lhs->isTypeDependent() || rhs->isTypeDependent(),
lhs->isValueDependent() || rhs->isValueDependent(),
+ (lhs->isInstantiationDependent() ||
+ rhs->isInstantiationDependent()),
(lhs->containsUnexpandedParameterPack() ||
rhs->containsUnexpandedParameterPack())),
Opc(opc), OpLoc(opLoc) {
@@ -2713,11 +2793,11 @@ class AbstractConditionalOperator : public Expr {
protected:
AbstractConditionalOperator(StmtClass SC, QualType T,
ExprValueKind VK, ExprObjectKind OK,
- bool TD, bool VD,
+ bool TD, bool VD, bool ID,
bool ContainsUnexpandedParameterPack,
SourceLocation qloc,
SourceLocation cloc)
- : Expr(SC, T, VK, OK, TD, VD, ContainsUnexpandedParameterPack),
+ : Expr(SC, T, VK, OK, TD, VD, ID, ContainsUnexpandedParameterPack),
QuestionLoc(qloc), ColonLoc(cloc) {}
AbstractConditionalOperator(StmtClass SC, EmptyShell Empty)
@@ -2765,6 +2845,9 @@ public:
(lhs->isTypeDependent() || rhs->isTypeDependent()),
(cond->isValueDependent() || lhs->isValueDependent() ||
rhs->isValueDependent()),
+ (cond->isInstantiationDependent() ||
+ lhs->isInstantiationDependent() ||
+ rhs->isInstantiationDependent()),
(cond->containsUnexpandedParameterPack() ||
lhs->containsUnexpandedParameterPack() ||
rhs->containsUnexpandedParameterPack()),
@@ -2833,6 +2916,8 @@ public:
: AbstractConditionalOperator(BinaryConditionalOperatorClass, t, VK, OK,
(common->isTypeDependent() || rhs->isTypeDependent()),
(common->isValueDependent() || rhs->isValueDependent()),
+ (common->isInstantiationDependent() ||
+ rhs->isInstantiationDependent()),
(common->containsUnexpandedParameterPack() ||
rhs->containsUnexpandedParameterPack()),
qloc, cloc),
@@ -2914,7 +2999,8 @@ class AddrLabelExpr : public Expr {
public:
AddrLabelExpr(SourceLocation AALoc, SourceLocation LLoc, LabelDecl *L,
QualType t)
- : Expr(AddrLabelExprClass, t, VK_RValue, OK_Ordinary, false, false, false),
+ : Expr(AddrLabelExprClass, t, VK_RValue, OK_Ordinary, false, false, false,
+ false),
AmpAmpLoc(AALoc), LabelLoc(LLoc), Label(L) {}
/// \brief Build an empty address of a label expression.
@@ -2953,10 +3039,12 @@ class StmtExpr : public Expr {
SourceLocation LParenLoc, RParenLoc;
public:
// FIXME: Does type-dependence need to be computed differently?
+ // FIXME: Do we need to compute instantiation instantiation-dependence for
+ // statements? (ugh!)
StmtExpr(CompoundStmt *substmt, QualType T,
SourceLocation lp, SourceLocation rp) :
Expr(StmtExprClass, T, VK_RValue, OK_Ordinary,
- T->isDependentType(), false, false),
+ T->isDependentType(), false, false, false),
SubStmt(substmt), LParenLoc(lp), RParenLoc(rp) { }
/// \brief Build an empty statement expression.
@@ -3073,6 +3161,9 @@ public:
QualType t, ExprValueKind VK, ExprObjectKind OK,
SourceLocation RP, bool TypeDependent, bool ValueDependent)
: Expr(ChooseExprClass, t, VK, OK, TypeDependent, ValueDependent,
+ (cond->isInstantiationDependent() ||
+ lhs->isInstantiationDependent() ||
+ rhs->isInstantiationDependent()),
(cond->containsUnexpandedParameterPack() ||
lhs->containsUnexpandedParameterPack() ||
rhs->containsUnexpandedParameterPack())),
@@ -3134,7 +3225,8 @@ class GNUNullExpr : public Expr {
public:
GNUNullExpr(QualType Ty, SourceLocation Loc)
- : Expr(GNUNullExprClass, Ty, VK_RValue, OK_Ordinary, false, false, false),
+ : Expr(GNUNullExprClass, Ty, VK_RValue, OK_Ordinary, false, false, false,
+ false),
TokenLoc(Loc) { }
/// \brief Build an empty GNU __null expression.
@@ -3166,6 +3258,8 @@ public:
SourceLocation RPLoc, QualType t)
: Expr(VAArgExprClass, t, VK_RValue, OK_Ordinary,
t->isDependentType(), false,
+ (TInfo->getType()->isInstantiationDependentType() ||
+ e->isInstantiationDependent()),
(TInfo->getType()->containsUnexpandedParameterPack() ||
e->containsUnexpandedParameterPack())),
Val(e), TInfo(TInfo),
@@ -3537,9 +3631,9 @@ public:
bool isArrayDesignator() const { return Kind == ArrayDesignator; }
bool isArrayRangeDesignator() const { return Kind == ArrayRangeDesignator; }
- IdentifierInfo * getFieldName();
+ IdentifierInfo *getFieldName() const;
- FieldDecl *getField() {
+ FieldDecl *getField() const {
assert(Kind == FieldDesignator && "Only valid on a field designator");
if (Field.NameOrField & 0x01)
return 0;
@@ -3612,12 +3706,18 @@ public:
unsigned size() const { return NumDesignators; }
// Iterator access to the designators.
- typedef Designator* designators_iterator;
+ typedef Designator *designators_iterator;
designators_iterator designators_begin() { return Designators; }
designators_iterator designators_end() {
return Designators + NumDesignators;
}
+ typedef const Designator *const_designators_iterator;
+ const_designators_iterator designators_begin() const { return Designators; }
+ const_designators_iterator designators_end() const {
+ return Designators + NumDesignators;
+ }
+
typedef std::reverse_iterator<designators_iterator>
reverse_designators_iterator;
reverse_designators_iterator designators_rbegin() {
@@ -3627,6 +3727,15 @@ public:
return reverse_designators_iterator(designators_begin());
}
+ typedef std::reverse_iterator<const_designators_iterator>
+ const_reverse_designators_iterator;
+ const_reverse_designators_iterator designators_rbegin() const {
+ return const_reverse_designators_iterator(designators_end());
+ }
+ const_reverse_designators_iterator designators_rend() const {
+ return const_reverse_designators_iterator(designators_begin());
+ }
+
Designator *getDesignator(unsigned Idx) { return &designators_begin()[Idx]; }
void setDesignators(ASTContext &C, const Designator *Desigs,
@@ -3708,7 +3817,7 @@ class ImplicitValueInitExpr : public Expr {
public:
explicit ImplicitValueInitExpr(QualType ty)
: Expr(ImplicitValueInitExprClass, ty, VK_RValue, OK_Ordinary,
- false, false, false) { }
+ false, false, ty->isInstantiationDependentType(), false) { }
/// \brief Construct an empty implicit value initialization.
explicit ImplicitValueInitExpr(EmptyShell Empty)
@@ -3735,7 +3844,7 @@ class ParenListExpr : public Expr {
public:
ParenListExpr(ASTContext& C, SourceLocation lparenloc, Expr **exprs,
- unsigned numexprs, SourceLocation rparenloc);
+ unsigned numexprs, SourceLocation rparenloc, QualType T);
/// \brief Build an empty paren list.
explicit ParenListExpr(EmptyShell Empty) : Expr(ParenListExprClass, Empty) { }
@@ -3909,6 +4018,7 @@ public:
: Expr(ExtVectorElementExprClass, ty, VK,
(VK == VK_RValue ? OK_Ordinary : OK_VectorComponent),
base->isTypeDependent(), base->isValueDependent(),
+ base->isInstantiationDependent(),
base->containsUnexpandedParameterPack()),
Base(base), Accessor(&accessor), AccessorLoc(loc) {}
@@ -3963,7 +4073,10 @@ protected:
public:
BlockExpr(BlockDecl *BD, QualType ty)
: Expr(BlockExprClass, ty, VK_RValue, OK_Ordinary,
- ty->isDependentType(), false, false),
+ ty->isDependentType(), false,
+ // FIXME: Check for instantiate-dependence in the statement?
+ ty->isInstantiationDependentType(),
+ false),
TheBlock(BD) {}
/// \brief Build an empty block expression.
@@ -4037,26 +4150,36 @@ public:
/// AsTypeExpr - Clang builtin function __builtin_astype [OpenCL 6.2.4.2]
/// This AST node provides support for reinterpreting a type to another
/// type of the same size.
-class AsTypeExpr : public Expr {
+class AsTypeExpr : public Expr { // Should this be an ExplicitCastExpr?
private:
- Expr* SrcExpr;
- QualType DstType;
+ Stmt *SrcExpr;
SourceLocation BuiltinLoc, RParenLoc;
+
+ friend class ASTReader;
+ friend class ASTStmtReader;
+ explicit AsTypeExpr(EmptyShell Empty) : Expr(AsTypeExprClass, Empty) {}
public:
AsTypeExpr(Expr* SrcExpr, QualType DstType,
ExprValueKind VK, ExprObjectKind OK,
SourceLocation BuiltinLoc, SourceLocation RParenLoc)
- : Expr(AsTypeExprClass, DstType, VK, OK, false, false, false),
- SrcExpr(SrcExpr), DstType(DstType),
- BuiltinLoc(BuiltinLoc), RParenLoc(RParenLoc) {}
-
- /// \brief Build an empty __builtin_astype
- explicit AsTypeExpr(EmptyShell Empty) : Expr(AsTypeExprClass, Empty) {}
+ : Expr(AsTypeExprClass, DstType, VK, OK,
+ DstType->isDependentType(),
+ DstType->isDependentType() || SrcExpr->isValueDependent(),
+ (DstType->isInstantiationDependentType() ||
+ SrcExpr->isInstantiationDependent()),
+ (DstType->containsUnexpandedParameterPack() ||
+ SrcExpr->containsUnexpandedParameterPack())),
+ SrcExpr(SrcExpr), BuiltinLoc(BuiltinLoc), RParenLoc(RParenLoc) {}
/// getSrcExpr - Return the Expr to be converted.
- Expr *getSrcExpr() const { return SrcExpr; }
- QualType getDstType() const { return DstType; }
+ Expr *getSrcExpr() const { return cast<Expr>(SrcExpr); }
+
+ /// getBuiltinLoc - Return the location of the __builtin_astype token.
+ SourceLocation getBuiltinLoc() const { return BuiltinLoc; }
+
+ /// getRParenLoc - Return the location of final right parenthesis.
+ SourceLocation getRParenLoc() const { return RParenLoc; }
SourceRange getSourceRange() const {
return SourceRange(BuiltinLoc, RParenLoc);
@@ -4068,7 +4191,7 @@ public:
static bool classof(const AsTypeExpr *) { return true; }
// Iterators
- child_range children() { return child_range(); }
+ child_range children() { return child_range(&SrcExpr, &SrcExpr+1); }
};
} // end namespace clang
diff --git a/contrib/llvm/tools/clang/include/clang/AST/ExprCXX.h b/contrib/llvm/tools/clang/include/clang/AST/ExprCXX.h
index a970579..1911704 100644
--- a/contrib/llvm/tools/clang/include/clang/AST/ExprCXX.h
+++ b/contrib/llvm/tools/clang/include/clang/AST/ExprCXX.h
@@ -330,7 +330,7 @@ class CXXBoolLiteralExpr : public Expr {
public:
CXXBoolLiteralExpr(bool val, QualType Ty, SourceLocation l) :
Expr(CXXBoolLiteralExprClass, Ty, VK_RValue, OK_Ordinary, false, false,
- false),
+ false, false),
Value(val), Loc(l) {}
explicit CXXBoolLiteralExpr(EmptyShell Empty)
@@ -359,7 +359,7 @@ class CXXNullPtrLiteralExpr : public Expr {
public:
CXXNullPtrLiteralExpr(QualType Ty, SourceLocation l) :
Expr(CXXNullPtrLiteralExprClass, Ty, VK_RValue, OK_Ordinary, false, false,
- false),
+ false, false),
Loc(l) {}
explicit CXXNullPtrLiteralExpr(EmptyShell Empty)
@@ -395,6 +395,7 @@ public:
false,
// typeid is value-dependent if the type or expression are dependent
Operand->getType()->isDependentType(),
+ Operand->getType()->isInstantiationDependentType(),
Operand->getType()->containsUnexpandedParameterPack()),
Operand(Operand), Range(R) { }
@@ -404,6 +405,7 @@ public:
false,
// typeid is value-dependent if the type or expression are dependent
Operand->isTypeDependent() || Operand->isValueDependent(),
+ Operand->isInstantiationDependent(),
Operand->containsUnexpandedParameterPack()),
Operand(Operand), Range(R) { }
@@ -471,12 +473,14 @@ public:
CXXUuidofExpr(QualType Ty, TypeSourceInfo *Operand, SourceRange R)
: Expr(CXXUuidofExprClass, Ty, VK_LValue, OK_Ordinary,
false, Operand->getType()->isDependentType(),
+ Operand->getType()->isInstantiationDependentType(),
Operand->getType()->containsUnexpandedParameterPack()),
Operand(Operand), Range(R) { }
CXXUuidofExpr(QualType Ty, Expr *Operand, SourceRange R)
: Expr(CXXUuidofExprClass, Ty, VK_LValue, OK_Ordinary,
false, Operand->isTypeDependent(),
+ Operand->isInstantiationDependent(),
Operand->containsUnexpandedParameterPack()),
Operand(Operand), Range(R) { }
@@ -552,6 +556,7 @@ public:
// 'this' is type-dependent if the class type of the enclosing
// member function is dependent (C++ [temp.dep.expr]p2)
Type->isDependentType(), Type->isDependentType(),
+ Type->isInstantiationDependentType(),
/*ContainsUnexpandedParameterPack=*/false),
Loc(L), Implicit(isImplicit) { }
@@ -581,23 +586,35 @@ public:
class CXXThrowExpr : public Expr {
Stmt *Op;
SourceLocation ThrowLoc;
+ /// \brief Whether the thrown variable (if any) is in scope.
+ unsigned IsThrownVariableInScope : 1;
+
+ friend class ASTStmtReader;
+
public:
// Ty is the void type which is used as the result type of the
// exepression. The l is the location of the throw keyword. expr
// can by null, if the optional expression to throw isn't present.
- CXXThrowExpr(Expr *expr, QualType Ty, SourceLocation l) :
+ CXXThrowExpr(Expr *expr, QualType Ty, SourceLocation l,
+ bool IsThrownVariableInScope) :
Expr(CXXThrowExprClass, Ty, VK_RValue, OK_Ordinary, false, false,
+ expr && expr->isInstantiationDependent(),
expr && expr->containsUnexpandedParameterPack()),
- Op(expr), ThrowLoc(l) {}
+ Op(expr), ThrowLoc(l), IsThrownVariableInScope(IsThrownVariableInScope) {}
CXXThrowExpr(EmptyShell Empty) : Expr(CXXThrowExprClass, Empty) {}
const Expr *getSubExpr() const { return cast_or_null<Expr>(Op); }
Expr *getSubExpr() { return cast_or_null<Expr>(Op); }
- void setSubExpr(Expr *E) { Op = E; }
SourceLocation getThrowLoc() const { return ThrowLoc; }
- void setThrowLoc(SourceLocation L) { ThrowLoc = L; }
+ /// \brief Determines whether the variable thrown by this expression (if any!)
+ /// is within the innermost try block.
+ ///
+ /// This information is required to determine whether the NRVO can apply to
+ /// this variable.
+ bool isThrownVariableInScope() const { return IsThrownVariableInScope; }
+
SourceRange getSourceRange() const {
if (getSubExpr() == 0)
return SourceRange(ThrowLoc, ThrowLoc);
@@ -636,14 +653,14 @@ class CXXDefaultArgExpr : public Expr {
? param->getType().getNonReferenceType()
: param->getDefaultArg()->getType(),
param->getDefaultArg()->getValueKind(),
- param->getDefaultArg()->getObjectKind(), false, false, false),
+ param->getDefaultArg()->getObjectKind(), false, false, false, false),
Param(param, false), Loc(Loc) { }
CXXDefaultArgExpr(StmtClass SC, SourceLocation Loc, ParmVarDecl *param,
Expr *SubExpr)
: Expr(SC, SubExpr->getType(),
SubExpr->getValueKind(), SubExpr->getObjectKind(),
- false, false, false),
+ false, false, false, false),
Param(param, true), Loc(Loc) {
*reinterpret_cast<Expr **>(this + 1) = SubExpr;
}
@@ -742,6 +759,7 @@ class CXXBindTemporaryExpr : public Expr {
: Expr(CXXBindTemporaryExprClass, SubExpr->getType(),
VK_RValue, OK_Ordinary, SubExpr->isTypeDependent(),
SubExpr->isValueDependent(),
+ SubExpr->isInstantiationDependent(),
SubExpr->containsUnexpandedParameterPack()),
Temp(temp), SubExpr(SubExpr) { }
@@ -995,7 +1013,7 @@ public:
TypeSourceInfo *TypeInfo,
SourceLocation rParenLoc ) :
Expr(CXXScalarValueInitExprClass, Type, VK_RValue, OK_Ordinary,
- false, false, false),
+ false, false, Type->isInstantiationDependentType(), false),
RParenLoc(rParenLoc), TypeInfo(TypeInfo) {}
explicit CXXScalarValueInitExpr(EmptyShell Shell)
@@ -1241,6 +1259,7 @@ public:
bool arrayFormAsWritten, bool usualArrayDeleteWantsSize,
FunctionDecl *operatorDelete, Expr *arg, SourceLocation loc)
: Expr(CXXDeleteExprClass, ty, VK_RValue, OK_Ordinary, false, false,
+ arg->isInstantiationDependent(),
arg->containsUnexpandedParameterPack()),
GlobalDelete(globalDelete),
ArrayForm(arrayForm), ArrayFormAsWritten(arrayFormAsWritten),
@@ -1500,6 +1519,7 @@ public:
SourceLocation rparen, QualType ty)
: Expr(UnaryTypeTraitExprClass, ty, VK_RValue, OK_Ordinary,
false, queried->getType()->isDependentType(),
+ queried->getType()->isInstantiationDependentType(),
queried->getType()->containsUnexpandedParameterPack()),
UTT(utt), Value(value), Loc(loc), RParen(rparen), QueriedType(queried) { }
@@ -1558,6 +1578,8 @@ public:
: Expr(BinaryTypeTraitExprClass, ty, VK_RValue, OK_Ordinary, false,
lhsType->getType()->isDependentType() ||
rhsType->getType()->isDependentType(),
+ (lhsType->getType()->isInstantiationDependentType() ||
+ rhsType->getType()->isInstantiationDependentType()),
(lhsType->getType()->containsUnexpandedParameterPack() ||
rhsType->getType()->containsUnexpandedParameterPack())),
BTT(btt), Value(value), Loc(loc), RParen(rparen),
@@ -1625,6 +1647,8 @@ public:
Expr *dimension, SourceLocation rparen, QualType ty)
: Expr(ArrayTypeTraitExprClass, ty, VK_RValue, OK_Ordinary,
false, queried->getType()->isDependentType(),
+ (queried->getType()->isInstantiationDependentType() ||
+ (dimension && dimension->isInstantiationDependent())),
queried->getType()->containsUnexpandedParameterPack()),
ATT(att), Value(value), Dimension(dimension),
Loc(loc), RParen(rparen), QueriedType(queried) { }
@@ -1684,6 +1708,7 @@ public:
false, // Not type-dependent
// Value-dependent if the argument is type-dependent.
queried->isTypeDependent(),
+ queried->isInstantiationDependent(),
queried->containsUnexpandedParameterPack()),
ET(et), Value(value), Loc(loc), RParen(rparen), QueriedExpression(queried) { }
@@ -1736,8 +1761,9 @@ protected:
const DeclarationNameInfo &NameInfo,
const TemplateArgumentListInfo *TemplateArgs,
UnresolvedSetIterator Begin, UnresolvedSetIterator End,
- bool KnownDependent = false,
- bool KnownContainsUnexpandedParameterPack = false);
+ bool KnownDependent,
+ bool KnownInstantiationDependent,
+ bool KnownContainsUnexpandedParameterPack);
OverloadExpr(StmtClass K, EmptyShell Empty)
: Expr(K, Empty), Results(0), NumResults(0),
@@ -1880,7 +1906,7 @@ class UnresolvedLookupExpr : public OverloadExpr {
UnresolvedSetIterator Begin, UnresolvedSetIterator End,
bool StdIsAssociatedNamespace)
: OverloadExpr(UnresolvedLookupExprClass, C, QualifierLoc, NameInfo,
- TemplateArgs, Begin, End),
+ TemplateArgs, Begin, End, false, false, false),
RequiresADL(RequiresADL),
StdIsAssociatedNamespace(StdIsAssociatedNamespace),
Overloaded(Overloaded), NamingClass(NamingClass)
@@ -2727,6 +2753,7 @@ public:
: Expr(CXXNoexceptExprClass, Ty, VK_RValue, OK_Ordinary,
/*TypeDependent*/false,
/*ValueDependent*/Val == CT_Dependent,
+ Val == CT_Dependent || Operand->isInstantiationDependent(),
Operand->containsUnexpandedParameterPack()),
Value(Val == CT_Cannot), Operand(Operand), Range(Keyword, RParen)
{ }
@@ -2787,7 +2814,8 @@ public:
llvm::Optional<unsigned> NumExpansions)
: Expr(PackExpansionExprClass, T, Pattern->getValueKind(),
Pattern->getObjectKind(), /*TypeDependent=*/true,
- /*ValueDependent=*/true, /*ContainsUnexpandedParameterPack=*/false),
+ /*ValueDependent=*/true, /*InstantiationDependent=*/true,
+ /*ContainsUnexpandedParameterPack=*/false),
EllipsisLoc(EllipsisLoc),
NumExpansions(NumExpansions? *NumExpansions + 1 : 0),
Pattern(Pattern) { }
@@ -2874,6 +2902,7 @@ public:
SourceLocation PackLoc, SourceLocation RParenLoc)
: Expr(SizeOfPackExprClass, SizeType, VK_RValue, OK_Ordinary,
/*TypeDependent=*/false, /*ValueDependent=*/true,
+ /*InstantiationDependent=*/true,
/*ContainsUnexpandedParameterPack=*/false),
OperatorLoc(OperatorLoc), PackLoc(PackLoc), RParenLoc(RParenLoc),
Length(0), Pack(Pack) { }
@@ -2885,6 +2914,7 @@ public:
unsigned Length)
: Expr(SizeOfPackExprClass, SizeType, VK_RValue, OK_Ordinary,
/*TypeDependent=*/false, /*ValueDependent=*/false,
+ /*InstantiationDependent=*/false,
/*ContainsUnexpandedParameterPack=*/false),
OperatorLoc(OperatorLoc), PackLoc(PackLoc), RParenLoc(RParenLoc),
Length(Length), Pack(Pack) { }
@@ -2927,6 +2957,53 @@ public:
child_range children() { return child_range(); }
};
+/// \brief Represents a reference to a non-type template parameter
+/// that has been substituted with a template argument.
+class SubstNonTypeTemplateParmExpr : public Expr {
+ /// \brief The replaced parameter.
+ NonTypeTemplateParmDecl *Param;
+
+ /// \brief The replacement expression.
+ Stmt *Replacement;
+
+ /// \brief The location of the non-type template parameter reference.
+ SourceLocation NameLoc;
+
+ friend class ASTReader;
+ friend class ASTStmtReader;
+ explicit SubstNonTypeTemplateParmExpr(EmptyShell Empty)
+ : Expr(SubstNonTypeTemplateParmExprClass, Empty) { }
+
+public:
+ SubstNonTypeTemplateParmExpr(QualType type,
+ ExprValueKind valueKind,
+ SourceLocation loc,
+ NonTypeTemplateParmDecl *param,
+ Expr *replacement)
+ : Expr(SubstNonTypeTemplateParmExprClass, type, valueKind, OK_Ordinary,
+ replacement->isTypeDependent(), replacement->isValueDependent(),
+ replacement->isInstantiationDependent(),
+ replacement->containsUnexpandedParameterPack()),
+ Param(param), Replacement(replacement), NameLoc(loc) {}
+
+ SourceLocation getNameLoc() const { return NameLoc; }
+ SourceRange getSourceRange() const { return NameLoc; }
+
+ Expr *getReplacement() const { return cast<Expr>(Replacement); }
+
+ NonTypeTemplateParmDecl *getParameter() const { return Param; }
+
+ static bool classof(const Stmt *s) {
+ return s->getStmtClass() == SubstNonTypeTemplateParmExprClass;
+ }
+ static bool classof(const SubstNonTypeTemplateParmExpr *) {
+ return true;
+ }
+
+ // Iterators
+ child_range children() { return child_range(&Replacement, &Replacement+1); }
+};
+
/// \brief Represents a reference to a non-type template parameter pack that
/// has been substituted with a non-template argument pack.
///
@@ -2953,8 +3030,10 @@ class SubstNonTypeTemplateParmPackExpr : public Expr {
/// \brief The location of the non-type template parameter pack reference.
SourceLocation NameLoc;
+ friend class ASTReader;
friend class ASTStmtReader;
- friend class ASTStmtWriter;
+ explicit SubstNonTypeTemplateParmPackExpr(EmptyShell Empty)
+ : Expr(SubstNonTypeTemplateParmPackExprClass, Empty) { }
public:
SubstNonTypeTemplateParmPackExpr(QualType T,
@@ -2962,9 +3041,6 @@ public:
SourceLocation NameLoc,
const TemplateArgument &ArgPack);
- SubstNonTypeTemplateParmPackExpr(EmptyShell Empty)
- : Expr(SubstNonTypeTemplateParmPackExprClass, Empty) { }
-
/// \brief Retrieve the non-type template parameter pack being substituted.
NonTypeTemplateParmDecl *getParameterPack() const { return Param; }
@@ -2987,6 +3063,66 @@ public:
// Iterators
child_range children() { return child_range(); }
};
+
+/// \brief Represents a prvalue temporary that written into memory so that
+/// a reference can bind to it.
+///
+/// Prvalue expressions are materialized when they need to have an address
+/// in memory for a reference to bind to. This happens when binding a
+/// reference to the result of a conversion, e.g.,
+///
+/// \code
+/// const int &r = 1.0;
+/// \endcode
+///
+/// Here, 1.0 is implicitly converted to an \c int. That resulting \c int is
+/// then materialized via a \c MaterializeTemporaryExpr, and the reference
+/// binds to the temporary. \c MaterializeTemporaryExprs are always glvalues
+/// (either an lvalue or an xvalue, depending on the kind of reference binding
+/// to it), maintaining the invariant that references always bind to glvalues.
+class MaterializeTemporaryExpr : public Expr {
+ /// \brief The temporary-generating expression whose value will be
+ /// materialized.
+ Stmt *Temporary;
+
+ friend class ASTStmtReader;
+ friend class ASTStmtWriter;
+
+public:
+ MaterializeTemporaryExpr(QualType T, Expr *Temporary,
+ bool BoundToLvalueReference)
+ : Expr(MaterializeTemporaryExprClass, T,
+ BoundToLvalueReference? VK_LValue : VK_XValue, OK_Ordinary,
+ Temporary->isTypeDependent(), Temporary->isValueDependent(),
+ Temporary->isInstantiationDependent(),
+ Temporary->containsUnexpandedParameterPack()),
+ Temporary(Temporary) { }
+
+ MaterializeTemporaryExpr(EmptyShell Empty)
+ : Expr(MaterializeTemporaryExprClass, Empty) { }
+
+ /// \brief Retrieve the temporary-generating subexpression whose value will
+ /// be materialized into a glvalue.
+ Expr *GetTemporaryExpr() const { return reinterpret_cast<Expr *>(Temporary); }
+
+ /// \brief Determine whether this materialized temporary is bound to an
+ /// lvalue reference; otherwise, it's bound to an rvalue reference.
+ bool isBoundToLvalueReference() const {
+ return getValueKind() == VK_LValue;
+ }
+
+ SourceRange getSourceRange() const { return Temporary->getSourceRange(); }
+
+ static bool classof(const Stmt *T) {
+ return T->getStmtClass() == MaterializeTemporaryExprClass;
+ }
+ static bool classof(const MaterializeTemporaryExpr *) {
+ return true;
+ }
+
+ // Iterators
+ child_range children() { return child_range(&Temporary, &Temporary + 1); }
+};
} // end namespace clang
diff --git a/contrib/llvm/tools/clang/include/clang/AST/ExprObjC.h b/contrib/llvm/tools/clang/include/clang/AST/ExprObjC.h
index 8163923..49d4cfe 100644
--- a/contrib/llvm/tools/clang/include/clang/AST/ExprObjC.h
+++ b/contrib/llvm/tools/clang/include/clang/AST/ExprObjC.h
@@ -30,7 +30,7 @@ class ObjCStringLiteral : public Expr {
public:
ObjCStringLiteral(StringLiteral *SL, QualType T, SourceLocation L)
: Expr(ObjCStringLiteralClass, T, VK_RValue, OK_Ordinary, false, false,
- false),
+ false, false),
String(SL), AtLoc(L) {}
explicit ObjCStringLiteral(EmptyShell Empty)
: Expr(ObjCStringLiteralClass, Empty) {}
@@ -67,6 +67,7 @@ public:
: Expr(ObjCEncodeExprClass, T, VK_LValue, OK_Ordinary,
EncodedType->getType()->isDependentType(),
EncodedType->getType()->isDependentType(),
+ EncodedType->getType()->isInstantiationDependentType(),
EncodedType->getType()->containsUnexpandedParameterPack()),
EncodedType(EncodedType), AtLoc(at), RParenLoc(rp) {}
@@ -106,7 +107,7 @@ public:
ObjCSelectorExpr(QualType T, Selector selInfo,
SourceLocation at, SourceLocation rp)
: Expr(ObjCSelectorExprClass, T, VK_RValue, OK_Ordinary, false, false,
- false),
+ false, false),
SelName(selInfo), AtLoc(at), RParenLoc(rp){}
explicit ObjCSelectorExpr(EmptyShell Empty)
: Expr(ObjCSelectorExprClass, Empty) {}
@@ -146,7 +147,7 @@ public:
ObjCProtocolExpr(QualType T, ObjCProtocolDecl *protocol,
SourceLocation at, SourceLocation rp)
: Expr(ObjCProtocolExprClass, T, VK_RValue, OK_Ordinary, false, false,
- false),
+ false, false),
TheProtocol(protocol), AtLoc(at), RParenLoc(rp) {}
explicit ObjCProtocolExpr(EmptyShell Empty)
: Expr(ObjCProtocolExprClass, Empty) {}
@@ -186,6 +187,7 @@ public:
bool arrow = false, bool freeIvar = false) :
Expr(ObjCIvarRefExprClass, t, VK_LValue, OK_Ordinary,
/*TypeDependent=*/false, base->isValueDependent(),
+ base->isInstantiationDependent(),
base->containsUnexpandedParameterPack()),
D(d), Loc(l), Base(base), IsArrow(arrow), IsFreeIvar(freeIvar) {}
@@ -248,6 +250,7 @@ public:
SourceLocation l, Expr *base)
: Expr(ObjCPropertyRefExprClass, t, VK, OK,
/*TypeDependent=*/false, base->isValueDependent(),
+ base->isInstantiationDependent(),
base->containsUnexpandedParameterPack()),
PropertyOrGetter(PD, false), Setter(0),
IdLoc(l), ReceiverLoc(), Receiver(base) {
@@ -257,7 +260,7 @@ public:
ExprValueKind VK, ExprObjectKind OK,
SourceLocation l, SourceLocation sl, QualType st)
: Expr(ObjCPropertyRefExprClass, t, VK, OK,
- /*TypeDependent=*/false, false,
+ /*TypeDependent=*/false, false, st->isInstantiationDependentType(),
st->containsUnexpandedParameterPack()),
PropertyOrGetter(PD, false), Setter(0),
IdLoc(l), ReceiverLoc(sl), Receiver(st.getTypePtr()) {
@@ -267,7 +270,7 @@ public:
QualType T, ExprValueKind VK, ExprObjectKind OK,
SourceLocation IdLoc, Expr *Base)
: Expr(ObjCPropertyRefExprClass, T, VK, OK, false,
- Base->isValueDependent(),
+ Base->isValueDependent(), Base->isInstantiationDependent(),
Base->containsUnexpandedParameterPack()),
PropertyOrGetter(Getter, true), Setter(Setter),
IdLoc(IdLoc), ReceiverLoc(), Receiver(Base) {
@@ -277,7 +280,7 @@ public:
QualType T, ExprValueKind VK, ExprObjectKind OK,
SourceLocation IdLoc,
SourceLocation SuperLoc, QualType SuperTy)
- : Expr(ObjCPropertyRefExprClass, T, VK, OK, false, false, false),
+ : Expr(ObjCPropertyRefExprClass, T, VK, OK, false, false, false, false),
PropertyOrGetter(Getter, true), Setter(Setter),
IdLoc(IdLoc), ReceiverLoc(SuperLoc), Receiver(SuperTy.getTypePtr()) {
}
@@ -286,7 +289,7 @@ public:
QualType T, ExprValueKind VK, ExprObjectKind OK,
SourceLocation IdLoc,
SourceLocation ReceiverLoc, ObjCInterfaceDecl *Receiver)
- : Expr(ObjCPropertyRefExprClass, T, VK, OK, false, false, false),
+ : Expr(ObjCPropertyRefExprClass, T, VK, OK, false, false, false, false),
PropertyOrGetter(Getter, true), Setter(Setter),
IdLoc(IdLoc), ReceiverLoc(ReceiverLoc), Receiver(Receiver) {
}
@@ -456,7 +459,11 @@ class ObjCMessageExpr : public Expr {
///
/// When non-zero, we have a method declaration; otherwise, we just
/// have a selector.
- unsigned HasMethod : 8;
+ unsigned HasMethod : 1;
+
+ /// \brief Whether this message send is a "delegate init call",
+ /// i.e. a call of an init method on self from within an init method.
+ unsigned IsDelegateInitCall : 1;
/// \brief When the message expression is a send to 'super', this is
/// the location of the 'super' keyword.
@@ -476,7 +483,7 @@ class ObjCMessageExpr : public Expr {
ObjCMessageExpr(EmptyShell Empty, unsigned NumArgs)
: Expr(ObjCMessageExprClass, Empty), NumArgs(NumArgs), Kind(0),
- HasMethod(0), SelectorOrMethod(0) { }
+ HasMethod(0), IsDelegateInitCall(0), SelectorOrMethod(0) { }
ObjCMessageExpr(QualType T, ExprValueKind VK,
SourceLocation LBracLoc,
@@ -807,6 +814,12 @@ public:
getArgs()[Arg] = ArgExpr;
}
+ /// isDelegateInitCall - Answers whether this message send has been
+ /// tagged as a "delegate init call", i.e. a call to a method in the
+ /// -init family on self from within an -init method implementation.
+ bool isDelegateInitCall() const { return IsDelegateInitCall; }
+ void setDelegateInitCall(bool isDelegate) { IsDelegateInitCall = isDelegate; }
+
SourceLocation getLeftLoc() const { return LBracLoc; }
SourceLocation getRightLoc() const { return RBracLoc; }
SourceLocation getSelectorLoc() const { return SelectorLoc; }
@@ -860,6 +873,7 @@ public:
ObjCIsaExpr(Expr *base, bool isarrow, SourceLocation l, QualType ty)
: Expr(ObjCIsaExprClass, ty, VK_LValue, OK_Ordinary,
/*TypeDependent=*/false, base->isValueDependent(),
+ base->isInstantiationDependent(),
/*ContainsUnexpandedParameterPack=*/false),
Base(base), IsaMemberLoc(l), IsArrow(isarrow) {}
@@ -892,6 +906,123 @@ public:
child_range children() { return child_range(&Base, &Base+1); }
};
+
+/// ObjCIndirectCopyRestoreExpr - Represents the passing of a function
+/// argument by indirect copy-restore in ARC. This is used to support
+/// passing indirect arguments with the wrong lifetime, e.g. when
+/// passing the address of a __strong local variable to an 'out'
+/// parameter. This expression kind is only valid in an "argument"
+/// position to some sort of call expression.
+///
+/// The parameter must have type 'pointer to T', and the argument must
+/// have type 'pointer to U', where T and U agree except possibly in
+/// qualification. If the argument value is null, then a null pointer
+/// is passed; otherwise it points to an object A, and:
+/// 1. A temporary object B of type T is initialized, either by
+/// zero-initialization (used when initializing an 'out' parameter)
+/// or copy-initialization (used when initializing an 'inout'
+/// parameter).
+/// 2. The address of the temporary is passed to the function.
+/// 3. If the call completes normally, A is move-assigned from B.
+/// 4. Finally, A is destroyed immediately.
+///
+/// Currently 'T' must be a retainable object lifetime and must be
+/// __autoreleasing; this qualifier is ignored when initializing
+/// the value.
+class ObjCIndirectCopyRestoreExpr : public Expr {
+ Stmt *Operand;
+
+ // unsigned ObjCIndirectCopyRestoreBits.ShouldCopy : 1;
+
+ friend class ASTReader;
+ friend class ASTStmtReader;
+
+ void setShouldCopy(bool shouldCopy) {
+ ObjCIndirectCopyRestoreExprBits.ShouldCopy = shouldCopy;
+ }
+
+ explicit ObjCIndirectCopyRestoreExpr(EmptyShell Empty)
+ : Expr(ObjCIndirectCopyRestoreExprClass, Empty) { }
+
+public:
+ ObjCIndirectCopyRestoreExpr(Expr *operand, QualType type, bool shouldCopy)
+ : Expr(ObjCIndirectCopyRestoreExprClass, type, VK_LValue, OK_Ordinary,
+ operand->isTypeDependent(), operand->isValueDependent(),
+ operand->isInstantiationDependent(),
+ operand->containsUnexpandedParameterPack()),
+ Operand(operand) {
+ setShouldCopy(shouldCopy);
+ }
+
+ Expr *getSubExpr() { return cast<Expr>(Operand); }
+ const Expr *getSubExpr() const { return cast<Expr>(Operand); }
+
+ /// shouldCopy - True if we should do the 'copy' part of the
+ /// copy-restore. If false, the temporary will be zero-initialized.
+ bool shouldCopy() const { return ObjCIndirectCopyRestoreExprBits.ShouldCopy; }
+
+ child_range children() { return child_range(&Operand, &Operand+1); }
+
+ // Source locations are determined by the subexpression.
+ SourceRange getSourceRange() const { return Operand->getSourceRange(); }
+ SourceLocation getExprLoc() const { return getSubExpr()->getExprLoc(); }
+
+ static bool classof(const Stmt *s) {
+ return s->getStmtClass() == ObjCIndirectCopyRestoreExprClass;
+ }
+ static bool classof(const ObjCIndirectCopyRestoreExpr *) { return true; }
+};
+
+/// \brief An Objective-C "bridged" cast expression, which casts between
+/// Objective-C pointers and C pointers, transferring ownership in the process.
+///
+/// \code
+/// NSString *str = (__bridge_transfer NSString *)CFCreateString();
+/// \endcode
+class ObjCBridgedCastExpr : public ExplicitCastExpr {
+ SourceLocation LParenLoc;
+ SourceLocation BridgeKeywordLoc;
+ unsigned Kind : 2;
+
+ friend class ASTStmtReader;
+ friend class ASTStmtWriter;
+
+public:
+ ObjCBridgedCastExpr(SourceLocation LParenLoc, ObjCBridgeCastKind Kind,
+ SourceLocation BridgeKeywordLoc, TypeSourceInfo *TSInfo,
+ Expr *Operand)
+ : ExplicitCastExpr(ObjCBridgedCastExprClass, TSInfo->getType(), VK_RValue,
+ CK_BitCast, Operand, 0, TSInfo),
+ LParenLoc(LParenLoc), BridgeKeywordLoc(BridgeKeywordLoc), Kind(Kind) { }
+
+ /// \brief Construct an empty Objective-C bridged cast.
+ explicit ObjCBridgedCastExpr(EmptyShell Shell)
+ : ExplicitCastExpr(ObjCBridgedCastExprClass, Shell, 0) { }
+
+ SourceLocation getLParenLoc() const { return LParenLoc; }
+
+ /// \brief Determine which kind of bridge is being performed via this cast.
+ ObjCBridgeCastKind getBridgeKind() const {
+ return static_cast<ObjCBridgeCastKind>(Kind);
+ }
+
+ /// \brief Retrieve the kind of bridge being performed as a string.
+ llvm::StringRef getBridgeKindName() const;
+
+ /// \brief The location of the bridge keyword.
+ SourceLocation getBridgeKeywordLoc() const { return BridgeKeywordLoc; }
+
+ SourceRange getSourceRange() const {
+ return SourceRange(LParenLoc, getSubExpr()->getLocEnd());
+ }
+
+ static bool classof(const Stmt *T) {
+ return T->getStmtClass() == ObjCBridgedCastExprClass;
+ }
+ static bool classof(const ObjCBridgedCastExpr *) { return true; }
+
+};
+
} // end namespace clang
#endif
diff --git a/contrib/llvm/tools/clang/include/clang/AST/ExternalASTSource.h b/contrib/llvm/tools/clang/include/clang/AST/ExternalASTSource.h
index 846813a..ef1f161 100644
--- a/contrib/llvm/tools/clang/include/clang/AST/ExternalASTSource.h
+++ b/contrib/llvm/tools/clang/include/clang/AST/ExternalASTSource.h
@@ -32,6 +32,20 @@ class Selector;
class Stmt;
class TagDecl;
+/// \brief Enumeration describing the result of loading information from
+/// an external source.
+enum ExternalLoadResult {
+ /// \brief Loading the external information has succeeded.
+ ELR_Success,
+
+ /// \brief Loading the external information has failed.
+ ELR_Failure,
+
+ /// \brief The external information has already been loaded, and therefore
+ /// no additional processing is required.
+ ELR_AlreadyLoaded
+};
+
/// \brief Abstract interface for external sources of AST nodes.
///
/// External AST sources provide AST nodes constructed from some
@@ -132,10 +146,10 @@ public:
/// declaration kind is one we are looking for. If NULL, all declarations
/// are returned.
///
- /// \return true if an error occurred
+ /// \return an indication of whether the load succeeded or failed.
///
/// The default implementation of this method is a no-op.
- virtual bool FindExternalLexicalDecls(const DeclContext *DC,
+ virtual ExternalLoadResult FindExternalLexicalDecls(const DeclContext *DC,
bool (*isKindWeWant)(Decl::Kind),
llvm::SmallVectorImpl<Decl*> &Result);
@@ -143,14 +157,14 @@ public:
/// DeclContext.
///
/// \return true if an error occurred
- bool FindExternalLexicalDecls(const DeclContext *DC,
+ ExternalLoadResult FindExternalLexicalDecls(const DeclContext *DC,
llvm::SmallVectorImpl<Decl*> &Result) {
return FindExternalLexicalDecls(DC, 0, Result);
}
template <typename DeclTy>
- bool FindExternalLexicalDeclsBy(const DeclContext *DC,
- llvm::SmallVectorImpl<Decl*> &Result) {
+ ExternalLoadResult FindExternalLexicalDeclsBy(const DeclContext *DC,
+ llvm::SmallVectorImpl<Decl*> &Result) {
return FindExternalLexicalDecls(DC, DeclTy::classofKind, Result);
}
diff --git a/contrib/llvm/tools/clang/lib/CodeGen/GlobalDecl.h b/contrib/llvm/tools/clang/include/clang/AST/GlobalDecl.h
index c2f36d2..c43e44c 100644
--- a/contrib/llvm/tools/clang/lib/CodeGen/GlobalDecl.h
+++ b/contrib/llvm/tools/clang/include/clang/AST/GlobalDecl.h
@@ -12,8 +12,8 @@
//
//===----------------------------------------------------------------------===//
-#ifndef CLANG_CODEGEN_GLOBALDECL_H
-#define CLANG_CODEGEN_GLOBALDECL_H
+#ifndef LLVM_CLANG_AST_GLOBALDECL_H
+#define LLVM_CLANG_AST_GLOBALDECL_H
#include "clang/AST/DeclCXX.h"
#include "clang/AST/DeclObjC.h"
@@ -21,8 +21,6 @@
namespace clang {
-namespace CodeGen {
-
/// GlobalDecl - represents a global declaration. This can either be a
/// CXXConstructorDecl and the constructor type (Base, Complete).
/// a CXXDestructorDecl and the destructor type (Base, Complete) or
@@ -89,28 +87,27 @@ public:
}
};
-} // end namespace CodeGen
} // end namespace clang
namespace llvm {
template<class> struct DenseMapInfo;
- template<> struct DenseMapInfo<clang::CodeGen::GlobalDecl> {
- static inline clang::CodeGen::GlobalDecl getEmptyKey() {
- return clang::CodeGen::GlobalDecl();
+ template<> struct DenseMapInfo<clang::GlobalDecl> {
+ static inline clang::GlobalDecl getEmptyKey() {
+ return clang::GlobalDecl();
}
- static inline clang::CodeGen::GlobalDecl getTombstoneKey() {
- return clang::CodeGen::GlobalDecl::
+ static inline clang::GlobalDecl getTombstoneKey() {
+ return clang::GlobalDecl::
getFromOpaquePtr(reinterpret_cast<void*>(-1));
}
- static unsigned getHashValue(clang::CodeGen::GlobalDecl GD) {
+ static unsigned getHashValue(clang::GlobalDecl GD) {
return DenseMapInfo<void*>::getHashValue(GD.getAsOpaquePtr());
}
- static bool isEqual(clang::CodeGen::GlobalDecl LHS,
- clang::CodeGen::GlobalDecl RHS) {
+ static bool isEqual(clang::GlobalDecl LHS,
+ clang::GlobalDecl RHS) {
return LHS == RHS;
}
@@ -119,7 +116,7 @@ namespace llvm {
// GlobalDecl isn't *technically* a POD type. However, its copy constructor,
// copy assignment operator, and destructor are all trivial.
template <>
- struct isPodLike<clang::CodeGen::GlobalDecl> {
+ struct isPodLike<clang::GlobalDecl> {
static const bool value = true;
};
} // end namespace llvm
diff --git a/contrib/llvm/tools/clang/include/clang/AST/NestedNameSpecifier.h b/contrib/llvm/tools/clang/include/clang/AST/NestedNameSpecifier.h
index c21c76b..018041f 100644
--- a/contrib/llvm/tools/clang/include/clang/AST/NestedNameSpecifier.h
+++ b/contrib/llvm/tools/clang/include/clang/AST/NestedNameSpecifier.h
@@ -186,6 +186,10 @@ public:
/// type or not.
bool isDependent() const;
+ /// \brief Whether this nested name specifier involves a template
+ /// parameter.
+ bool isInstantiationDependent() const;
+
/// \brief Whether this nested-name-specifier contains an unexpanded
/// parameter pack (for C++0x variadic templates).
bool containsUnexpandedParameterPack() const;
@@ -435,6 +439,14 @@ public:
/// copied.
NestedNameSpecifierLoc getWithLocInContext(ASTContext &Context) const;
+ /// \brief Retrieve a nested-name-specifier with location
+ /// information based on the information in this builder. This loc
+ /// will contain references to the builder's internal data and may
+ /// be invalidated by any change to the builder.
+ NestedNameSpecifierLoc getTemporary() const {
+ return NestedNameSpecifierLoc(Representation, Buffer);
+ }
+
/// \brief Clear out this builder, and prepare it to build another
/// nested-name-specifier with source-location information.
void Clear() {
diff --git a/contrib/llvm/tools/clang/include/clang/AST/OperationKinds.h b/contrib/llvm/tools/clang/include/clang/AST/OperationKinds.h
index 35c72c4..92ff604 100644
--- a/contrib/llvm/tools/clang/include/clang/AST/OperationKinds.h
+++ b/contrib/llvm/tools/clang/include/clang/AST/OperationKinds.h
@@ -245,7 +245,22 @@ enum CastKind {
/// \brief Converts from an integral complex to a floating complex.
/// _Complex unsigned -> _Complex float
- CK_IntegralComplexToFloatingComplex
+ CK_IntegralComplexToFloatingComplex,
+
+ /// \brief Produces a retainable object pointer so that it may be
+ /// consumed, e.g. by being passed to a consuming parameter. Calls
+ /// objc_retain.
+ CK_ObjCProduceObject,
+
+ /// \brief Consumes a retainable object pointer that has just been
+ /// produced, e.g. as the return value of a retaining call. Enters
+ /// a cleanup to call objc_release at some indefinite time.
+ CK_ObjCConsumeObject,
+
+ /// \brief Reclaim a retainable object pointer object that may have
+ /// been produced and autoreleased as part of a function return
+ /// sequence.
+ CK_ObjCReclaimReturnedObject
};
#define CK_Invalid ((CastKind) -1)
@@ -284,6 +299,19 @@ enum UnaryOperatorKind {
UO_Extension // __extension__ marker.
};
+/// \brief The kind of bridging performed by the Objective-C bridge cast.
+enum ObjCBridgeCastKind {
+ /// \brief Bridging via __bridge, which does nothing but reinterpret
+ /// the bits.
+ OBC_Bridge,
+ /// \brief Bridging via __bridge_transfer, which transfers ownership of an
+ /// Objective-C pointer into ARC.
+ OBC_BridgeTransfer,
+ /// \brief Bridging via __bridge_retain, which makes an ARC object available
+ /// as a +1 C pointer.
+ OBC_BridgeRetained
+};
+
}
#endif
diff --git a/contrib/llvm/tools/clang/include/clang/AST/ParentMap.h b/contrib/llvm/tools/clang/include/clang/AST/ParentMap.h
index 9ea5a09..22c1e72 100644
--- a/contrib/llvm/tools/clang/include/clang/AST/ParentMap.h
+++ b/contrib/llvm/tools/clang/include/clang/AST/ParentMap.h
@@ -32,6 +32,7 @@ public:
Stmt *getParent(Stmt*) const;
Stmt *getParentIgnoreParens(Stmt *) const;
Stmt *getParentIgnoreParenCasts(Stmt *) const;
+ Stmt *getOuterParenParent(Stmt *) const;
const Stmt *getParent(const Stmt* S) const {
return getParent(const_cast<Stmt*>(S));
diff --git a/contrib/llvm/tools/clang/include/clang/AST/PrettyPrinter.h b/contrib/llvm/tools/clang/include/clang/AST/PrettyPrinter.h
index cf5fadb..fc8ac36 100644
--- a/contrib/llvm/tools/clang/include/clang/AST/PrettyPrinter.h
+++ b/contrib/llvm/tools/clang/include/clang/AST/PrettyPrinter.h
@@ -41,7 +41,7 @@ struct PrintingPolicy {
SuppressTagKeyword(false), SuppressTag(false), SuppressScope(false),
SuppressInitializers(false),
Dump(false), ConstantArraySizeAsWritten(false),
- AnonymousTagLocations(true) { }
+ AnonymousTagLocations(true), SuppressStrongLifetime(false) { }
/// \brief The number of spaces to use to indent each line.
unsigned Indentation : 8;
@@ -129,6 +129,10 @@ struct PrintingPolicy {
/// that entity (e.g., "enum <anonymous at t.h:10:5>"). Otherwise, just
/// prints "<anonymous>" for the name.
bool AnonymousTagLocations : 1;
+
+ /// \brief When true, suppress printing of the __strong lifetime qualifier in
+ /// ARC.
+ unsigned SuppressStrongLifetime : 1;
};
} // end namespace clang
diff --git a/contrib/llvm/tools/clang/include/clang/AST/RecursiveASTVisitor.h b/contrib/llvm/tools/clang/include/clang/AST/RecursiveASTVisitor.h
index a8f182a..85c5c08 100644
--- a/contrib/llvm/tools/clang/include/clang/AST/RecursiveASTVisitor.h
+++ b/contrib/llvm/tools/clang/include/clang/AST/RecursiveASTVisitor.h
@@ -1721,6 +1721,7 @@ DEF_TRAVERSE_STMT(ObjCAtSynchronizedStmt, { })
DEF_TRAVERSE_STMT(ObjCAtThrowStmt, { })
DEF_TRAVERSE_STMT(ObjCAtTryStmt, { })
DEF_TRAVERSE_STMT(ObjCForCollectionStmt, { })
+DEF_TRAVERSE_STMT(ObjCAutoreleasePoolStmt, { })
DEF_TRAVERSE_STMT(CXXForRangeStmt, { })
DEF_TRAVERSE_STMT(ReturnStmt, { })
DEF_TRAVERSE_STMT(SwitchStmt, { })
@@ -1933,6 +1934,10 @@ DEF_TRAVERSE_STMT(ObjCMessageExpr, { })
DEF_TRAVERSE_STMT(ObjCPropertyRefExpr, { })
DEF_TRAVERSE_STMT(ObjCProtocolExpr, { })
DEF_TRAVERSE_STMT(ObjCSelectorExpr, { })
+DEF_TRAVERSE_STMT(ObjCIndirectCopyRestoreExpr, { })
+DEF_TRAVERSE_STMT(ObjCBridgedCastExpr, {
+ TRY_TO(TraverseTypeLoc(S->getTypeInfoAsWritten()->getTypeLoc()));
+})
DEF_TRAVERSE_STMT(ParenExpr, { })
DEF_TRAVERSE_STMT(ParenListExpr, { })
DEF_TRAVERSE_STMT(PredefinedExpr, { })
@@ -1973,6 +1978,8 @@ DEF_TRAVERSE_STMT(CXXNoexceptExpr, { })
DEF_TRAVERSE_STMT(PackExpansionExpr, { })
DEF_TRAVERSE_STMT(SizeOfPackExpr, { })
DEF_TRAVERSE_STMT(SubstNonTypeTemplateParmPackExpr, { })
+DEF_TRAVERSE_STMT(SubstNonTypeTemplateParmExpr, { })
+DEF_TRAVERSE_STMT(MaterializeTemporaryExpr, { })
// These literals (all of them) do not need any action.
DEF_TRAVERSE_STMT(IntegerLiteral, { })
diff --git a/contrib/llvm/tools/clang/include/clang/AST/Stmt.h b/contrib/llvm/tools/clang/include/clang/AST/Stmt.h
index 695fb04..bf5f383 100644
--- a/contrib/llvm/tools/clang/include/clang/AST/Stmt.h
+++ b/contrib/llvm/tools/clang/include/clang/AST/Stmt.h
@@ -154,9 +154,10 @@ protected:
unsigned ObjectKind : 2;
unsigned TypeDependent : 1;
unsigned ValueDependent : 1;
+ unsigned InstantiationDependent : 1;
unsigned ContainsUnexpandedParameterPack : 1;
};
- enum { NumExprBits = 15 };
+ enum { NumExprBits = 16 };
class DeclRefExprBitfields {
friend class DeclRefExpr;
@@ -183,6 +184,13 @@ protected:
unsigned NumPreArgs : 1;
};
+ class ObjCIndirectCopyRestoreExprBitfields {
+ friend class ObjCIndirectCopyRestoreExpr;
+ unsigned : NumExprBits;
+
+ unsigned ShouldCopy : 1;
+ };
+
union {
// FIXME: this is wasteful on 64-bit platforms.
void *Aligner;
@@ -193,6 +201,7 @@ protected:
DeclRefExprBitfields DeclRefExprBits;
CastExprBitfields CastExprBits;
CallExprBitfields CallExprBits;
+ ObjCIndirectCopyRestoreExprBitfields ObjCIndirectCopyRestoreExprBits;
};
friend class ASTStmtReader;
@@ -284,6 +293,10 @@ public:
/// works on systems with GraphViz (Mac OS X) or dot+gv installed.
void viewAST() const;
+ /// Skip past any implicit AST nodes which might surround this
+ /// statement, such as ExprWithCleanups or ImplicitCastExpr nodes.
+ Stmt *IgnoreImplicit();
+
// Implement isa<T> support.
static bool classof(const Stmt *) { return true; }
@@ -327,7 +340,7 @@ public:
/// declaration pointers) or the exact representation of the statement as
/// written in the source.
void Profile(llvm::FoldingSetNodeID &ID, const ASTContext &Context,
- bool Canonical);
+ bool Canonical) const;
};
/// DeclStmt - Adaptor class for mixing declarations with statements and
@@ -1458,6 +1471,10 @@ class SEHExceptStmt : public Stmt {
Expr *FilterExpr,
Stmt *Block);
+ friend class ASTReader;
+ friend class ASTStmtReader;
+ explicit SEHExceptStmt(EmptyShell E) : Stmt(SEHExceptStmtClass, E) { }
+
public:
static SEHExceptStmt* Create(ASTContext &C,
SourceLocation ExceptLoc,
@@ -1492,6 +1509,10 @@ class SEHFinallyStmt : public Stmt {
SEHFinallyStmt(SourceLocation Loc,
Stmt *Block);
+ friend class ASTReader;
+ friend class ASTStmtReader;
+ explicit SEHFinallyStmt(EmptyShell E) : Stmt(SEHFinallyStmtClass, E) { }
+
public:
static SEHFinallyStmt* Create(ASTContext &C,
SourceLocation FinallyLoc,
@@ -1530,6 +1551,10 @@ class SEHTryStmt : public Stmt {
Stmt *TryBlock,
Stmt *Handler);
+ friend class ASTReader;
+ friend class ASTStmtReader;
+ explicit SEHTryStmt(EmptyShell E) : Stmt(SEHTryStmtClass, E) { }
+
public:
static SEHTryStmt* Create(ASTContext &C,
bool isCXXTry,
diff --git a/contrib/llvm/tools/clang/include/clang/AST/StmtObjC.h b/contrib/llvm/tools/clang/include/clang/AST/StmtObjC.h
index 1800a71..d996fc5 100644
--- a/contrib/llvm/tools/clang/include/clang/AST/StmtObjC.h
+++ b/contrib/llvm/tools/clang/include/clang/AST/StmtObjC.h
@@ -342,6 +342,39 @@ public:
child_range children() { return child_range(&Throw, &Throw+1); }
};
+/// ObjCAutoreleasePoolStmt - This represent objective-c's
+/// @autoreleasepool Statement
+class ObjCAutoreleasePoolStmt : public Stmt {
+ Stmt *SubStmt;
+ SourceLocation AtLoc;
+public:
+ ObjCAutoreleasePoolStmt(SourceLocation atLoc,
+ Stmt *subStmt)
+ : Stmt(ObjCAutoreleasePoolStmtClass),
+ SubStmt(subStmt), AtLoc(atLoc) {}
+
+ explicit ObjCAutoreleasePoolStmt(EmptyShell Empty) :
+ Stmt(ObjCAutoreleasePoolStmtClass, Empty) { }
+
+ const Stmt *getSubStmt() const { return SubStmt; }
+ Stmt *getSubStmt() { return SubStmt; }
+ void setSubStmt(Stmt *S) { SubStmt = S; }
+
+ SourceRange getSourceRange() const {
+ return SourceRange(AtLoc, SubStmt->getLocEnd());
+ }
+
+ SourceLocation getAtLoc() const { return AtLoc; }
+ void setAtLoc(SourceLocation Loc) { AtLoc = Loc; }
+
+ static bool classof(const Stmt *T) {
+ return T->getStmtClass() == ObjCAutoreleasePoolStmtClass;
+ }
+ static bool classof(const ObjCAutoreleasePoolStmt *) { return true; }
+
+ child_range children() { return child_range(&SubStmt, &SubStmt + 1); }
+};
+
} // end namespace clang
#endif
diff --git a/contrib/llvm/tools/clang/include/clang/AST/TemplateBase.h b/contrib/llvm/tools/clang/include/clang/AST/TemplateBase.h
index 821b4fc..1c693e0 100644
--- a/contrib/llvm/tools/clang/include/clang/AST/TemplateBase.h
+++ b/contrib/llvm/tools/clang/include/clang/AST/TemplateBase.h
@@ -235,9 +235,14 @@ public:
bool isNull() const { return Kind == Null; }
/// \brief Whether this template argument is dependent on a template
- /// parameter.
+ /// parameter such that its result can change from one instantiation to
+ /// another.
bool isDependent() const;
+ /// \brief Whether this template argument is dependent on a template
+ /// parameter.
+ bool isInstantiationDependent() const;
+
/// \brief Whether this template argument contains an unexpanded
/// parameter pack.
bool containsUnexpandedParameterPack() const;
diff --git a/contrib/llvm/tools/clang/include/clang/AST/TemplateName.h b/contrib/llvm/tools/clang/include/clang/AST/TemplateName.h
index 1721973..a180f58 100644
--- a/contrib/llvm/tools/clang/include/clang/AST/TemplateName.h
+++ b/contrib/llvm/tools/clang/include/clang/AST/TemplateName.h
@@ -33,6 +33,7 @@ class OverloadedTemplateStorage;
struct PrintingPolicy;
class QualifiedTemplateName;
class NamedDecl;
+class SubstTemplateTemplateParmStorage;
class SubstTemplateTemplateParmPackStorage;
class TemplateArgument;
class TemplateDecl;
@@ -42,38 +43,49 @@ class TemplateTemplateParmDecl;
/// template names or an already-substituted template template parameter pack.
class UncommonTemplateNameStorage {
protected:
+ enum Kind {
+ Overloaded,
+ SubstTemplateTemplateParm,
+ SubstTemplateTemplateParmPack
+ };
+
union {
struct {
- /// \brief If true, this is an OverloadedTemplateStorage instance;
- /// otherwise, it's a SubstTemplateTemplateParmPackStorage instance.
- unsigned IsOverloadedStorage : 1;
+ /// \brief A Kind.
+ unsigned Kind : 2;
/// \brief The number of stored templates or template arguments,
/// depending on which subclass we have.
- unsigned Size : 31;
+ unsigned Size : 30;
} Bits;
void *PointerAlignment;
};
- UncommonTemplateNameStorage(unsigned Size, bool OverloadedStorage) {
- Bits.IsOverloadedStorage = OverloadedStorage;
- Bits.Size = Size;
+ UncommonTemplateNameStorage(Kind kind, unsigned size) {
+ Bits.Kind = kind;
+ Bits.Size = size;
}
public:
unsigned size() const { return Bits.Size; }
OverloadedTemplateStorage *getAsOverloadedStorage() {
- return Bits.IsOverloadedStorage
+ return Bits.Kind == Overloaded
? reinterpret_cast<OverloadedTemplateStorage *>(this)
: 0;
}
+ SubstTemplateTemplateParmStorage *getAsSubstTemplateTemplateParm() {
+ return Bits.Kind == SubstTemplateTemplateParm
+ ? reinterpret_cast<SubstTemplateTemplateParmStorage *>(this)
+ : 0;
+ }
+
SubstTemplateTemplateParmPackStorage *getAsSubstTemplateTemplateParmPack() {
- return Bits.IsOverloadedStorage
- ? 0
- : reinterpret_cast<SubstTemplateTemplateParmPackStorage *>(this) ;
+ return Bits.Kind == SubstTemplateTemplateParmPack
+ ? reinterpret_cast<SubstTemplateTemplateParmPackStorage *>(this)
+ : 0;
}
};
@@ -82,8 +94,8 @@ public:
class OverloadedTemplateStorage : public UncommonTemplateNameStorage {
friend class ASTContext;
- OverloadedTemplateStorage(unsigned Size)
- : UncommonTemplateNameStorage(Size, true) { }
+ OverloadedTemplateStorage(unsigned size)
+ : UncommonTemplateNameStorage(Overloaded, size) { }
NamedDecl **getStorage() {
return reinterpret_cast<NamedDecl **>(this + 1);
@@ -98,8 +110,7 @@ public:
iterator begin() const { return getStorage(); }
iterator end() const { return getStorage() + size(); }
};
-
-
+
/// \brief A structure for storing an already-substituted template template
/// parameter pack.
///
@@ -109,16 +120,14 @@ public:
class SubstTemplateTemplateParmPackStorage
: public UncommonTemplateNameStorage, public llvm::FoldingSetNode
{
- ASTContext &Context;
TemplateTemplateParmDecl *Parameter;
const TemplateArgument *Arguments;
public:
- SubstTemplateTemplateParmPackStorage(ASTContext &Context,
- TemplateTemplateParmDecl *Parameter,
+ SubstTemplateTemplateParmPackStorage(TemplateTemplateParmDecl *Parameter,
unsigned Size,
const TemplateArgument *Arguments)
- : UncommonTemplateNameStorage(Size, false), Context(Context),
+ : UncommonTemplateNameStorage(SubstTemplateTemplateParmPack, Size),
Parameter(Parameter), Arguments(Arguments) { }
/// \brief Retrieve the template template parameter pack being substituted.
@@ -130,9 +139,10 @@ public:
/// parameter was substituted.
TemplateArgument getArgumentPack() const;
- void Profile(llvm::FoldingSetNodeID &ID);
+ void Profile(llvm::FoldingSetNodeID &ID, ASTContext &Context);
- static void Profile(llvm::FoldingSetNodeID &ID, ASTContext &Context,
+ static void Profile(llvm::FoldingSetNodeID &ID,
+ ASTContext &Context,
TemplateTemplateParmDecl *Parameter,
const TemplateArgument &ArgPack);
};
@@ -189,6 +199,9 @@ public:
/// \brief A dependent template name that has not been resolved to a
/// template (or set of templates).
DependentTemplate,
+ /// \brief A template template parameter that has been substituted
+ /// for some other template name.
+ SubstTemplateTemplateParm,
/// \brief A template template parameter pack that has been substituted for
/// a template template argument pack, but has not yet been expanded into
/// individual arguments.
@@ -199,6 +212,7 @@ public:
explicit TemplateName(TemplateDecl *Template) : Storage(Template) { }
explicit TemplateName(OverloadedTemplateStorage *Storage)
: Storage(Storage) { }
+ explicit TemplateName(SubstTemplateTemplateParmStorage *Storage);
explicit TemplateName(SubstTemplateTemplateParmPackStorage *Storage)
: Storage(Storage) { }
explicit TemplateName(QualifiedTemplateName *Qual) : Storage(Qual) { }
@@ -234,6 +248,19 @@ public:
return 0;
}
+ /// \brief Retrieve the substituted template template parameter, if
+ /// known.
+ ///
+ /// \returns The storage for the substituted template template parameter,
+ /// if known. Otherwise, returns NULL.
+ SubstTemplateTemplateParmStorage *getAsSubstTemplateTemplateParm() const {
+ if (UncommonTemplateNameStorage *uncommon =
+ Storage.dyn_cast<UncommonTemplateNameStorage *>())
+ return uncommon->getAsSubstTemplateTemplateParm();
+
+ return 0;
+ }
+
/// \brief Retrieve the substituted template template parameter pack, if
/// known.
///
@@ -260,9 +287,15 @@ public:
return Storage.dyn_cast<DependentTemplateName *>();
}
+ TemplateName getUnderlying() const;
+
/// \brief Determines whether this is a dependent template name.
bool isDependent() const;
+ /// \brief Determines whether this is a template name that somehow
+ /// depends on a template parameter.
+ bool isInstantiationDependent() const;
+
/// \brief Determines whether this template name contains an
/// unexpanded parameter pack (for C++0x variadic templates).
bool containsUnexpandedParameterPack() const;
@@ -300,6 +333,41 @@ public:
const DiagnosticBuilder &operator<<(const DiagnosticBuilder &DB,
TemplateName N);
+/// \brief A structure for storing the information associated with a
+/// substituted template template parameter.
+class SubstTemplateTemplateParmStorage
+ : public UncommonTemplateNameStorage, public llvm::FoldingSetNode {
+ friend class ASTContext;
+
+ TemplateTemplateParmDecl *Parameter;
+ TemplateName Replacement;
+
+ SubstTemplateTemplateParmStorage(TemplateTemplateParmDecl *parameter,
+ TemplateName replacement)
+ : UncommonTemplateNameStorage(SubstTemplateTemplateParm, 0),
+ Parameter(parameter), Replacement(replacement) {}
+
+public:
+ TemplateTemplateParmDecl *getParameter() const { return Parameter; }
+ TemplateName getReplacement() const { return Replacement; }
+
+ void Profile(llvm::FoldingSetNodeID &ID);
+
+ static void Profile(llvm::FoldingSetNodeID &ID,
+ TemplateTemplateParmDecl *parameter,
+ TemplateName replacement);
+};
+
+inline TemplateName::TemplateName(SubstTemplateTemplateParmStorage *Storage)
+ : Storage(Storage) { }
+
+inline TemplateName TemplateName::getUnderlying() const {
+ if (SubstTemplateTemplateParmStorage *subst
+ = getAsSubstTemplateTemplateParm())
+ return subst->getReplacement().getUnderlying();
+ return *this;
+}
+
/// \brief Represents a template name that was expressed as a
/// qualified name.
///
diff --git a/contrib/llvm/tools/clang/include/clang/AST/Type.h b/contrib/llvm/tools/clang/include/clang/AST/Type.h
index 7763383..ef0dbda 100644
--- a/contrib/llvm/tools/clang/include/clang/AST/Type.h
+++ b/contrib/llvm/tools/clang/include/clang/AST/Type.h
@@ -126,6 +126,28 @@ public:
Strong
};
+ enum ObjCLifetime {
+ /// There is no lifetime qualification on this type.
+ OCL_None,
+
+ /// This object can be modified without requiring retains or
+ /// releases.
+ OCL_ExplicitNone,
+
+ /// Assigning into this object requires the old value to be
+ /// released and the new value to be retained. The timing of the
+ /// release of the old value is inexact: it may be moved to
+ /// immediately after the last known point where the value is
+ /// live.
+ OCL_Strong,
+
+ /// Reading or writing from this object requires a barrier call.
+ OCL_Weak,
+
+ /// Assigning into this object requires a lifetime extension.
+ OCL_Autoreleasing
+ };
+
enum {
/// The maximum supported address space number.
/// 24 bits should be enough for anyone.
@@ -218,7 +240,37 @@ public:
qs.removeObjCGCAttr();
return qs;
}
+ Qualifiers withoutObjCGLifetime() const {
+ Qualifiers qs = *this;
+ qs.removeObjCLifetime();
+ return qs;
+ }
+
+ bool hasObjCLifetime() const { return Mask & LifetimeMask; }
+ ObjCLifetime getObjCLifetime() const {
+ return ObjCLifetime((Mask & LifetimeMask) >> LifetimeShift);
+ }
+ void setObjCLifetime(ObjCLifetime type) {
+ Mask = (Mask & ~LifetimeMask) | (type << LifetimeShift);
+ }
+ void removeObjCLifetime() { setObjCLifetime(OCL_None); }
+ void addObjCLifetime(ObjCLifetime type) {
+ assert(type);
+ setObjCLifetime(type);
+ }
+
+ /// True if the lifetime is neither None or ExplicitNone.
+ bool hasNonTrivialObjCLifetime() const {
+ ObjCLifetime lifetime = getObjCLifetime();
+ return (lifetime > OCL_ExplicitNone);
+ }
+ /// True if the lifetime is either strong or weak.
+ bool hasStrongOrWeakObjCLifetime() const {
+ ObjCLifetime lifetime = getObjCLifetime();
+ return (lifetime == OCL_Strong || lifetime == OCL_Weak);
+ }
+
bool hasAddressSpace() const { return Mask & AddressSpaceMask; }
unsigned getAddressSpace() const { return Mask >> AddressSpaceShift; }
void setAddressSpace(unsigned space) {
@@ -277,6 +329,8 @@ public:
addAddressSpace(Q.getAddressSpace());
if (Q.hasObjCGCAttr())
addObjCGCAttr(Q.getObjCGCAttr());
+ if (Q.hasObjCLifetime())
+ addObjCLifetime(Q.getObjCLifetime());
}
}
@@ -287,6 +341,8 @@ public:
!hasAddressSpace() || !qs.hasAddressSpace());
assert(getObjCGCAttr() == qs.getObjCGCAttr() ||
!hasObjCGCAttr() || !qs.hasObjCGCAttr());
+ assert(getObjCLifetime() == qs.getObjCLifetime() ||
+ !hasObjCLifetime() || !qs.hasObjCLifetime());
Mask |= qs.Mask;
}
@@ -301,10 +357,30 @@ public:
// changed.
(getObjCGCAttr() == other.getObjCGCAttr() ||
!hasObjCGCAttr() || !other.hasObjCGCAttr()) &&
+ // ObjC lifetime qualifiers must match exactly.
+ getObjCLifetime() == other.getObjCLifetime() &&
// CVR qualifiers may subset.
(((Mask & CVRMask) | (other.Mask & CVRMask)) == (Mask & CVRMask));
}
+ /// \brief Determines if these qualifiers compatibly include another set of
+ /// qualifiers from the narrow perspective of Objective-C ARC lifetime.
+ ///
+ /// One set of Objective-C lifetime qualifiers compatibly includes the other
+ /// if the lifetime qualifiers match, or if both are non-__weak and the
+ /// including set also contains the 'const' qualifier.
+ bool compatiblyIncludesObjCLifetime(Qualifiers other) const {
+ if (getObjCLifetime() == other.getObjCLifetime())
+ return true;
+
+ if (getObjCLifetime() == OCL_Weak || other.getObjCLifetime() == OCL_Weak)
+ return false;
+
+ return hasConst();
+ }
+
+ bool isSupersetOf(Qualifiers Other) const;
+
/// \brief Determine whether this set of qualifiers is a strict superset of
/// another set of qualifiers, not considering qualifier compatibility.
bool isStrictSupersetOf(Qualifiers Other) const;
@@ -351,14 +427,16 @@ public:
private:
- // bits: |0 1 2|3 .. 4|5 .. 31|
- // |C R V|GCAttr|AddrSpace|
+ // bits: |0 1 2|3 .. 4|5 .. 7|8 ... 31|
+ // |C R V|GCAttr|Lifetime|AddressSpace|
uint32_t Mask;
static const uint32_t GCAttrMask = 0x18;
static const uint32_t GCAttrShift = 3;
- static const uint32_t AddressSpaceMask = ~(CVRMask | GCAttrMask);
- static const uint32_t AddressSpaceShift = 5;
+ static const uint32_t LifetimeMask = 0xE0;
+ static const uint32_t LifetimeShift = 5;
+ static const uint32_t AddressSpaceMask = ~(CVRMask|GCAttrMask|LifetimeMask);
+ static const uint32_t AddressSpaceShift = 8;
};
/// CallingConv - Specifies the calling convention that a function uses.
@@ -527,6 +605,23 @@ public:
return QualType::isConstant(*this, Ctx);
}
+ /// \brief Determine whether this is a Plain Old Data (POD) type (C++ 3.9p10).
+ bool isPODType(ASTContext &Context) const;
+
+ /// isCXX11PODType() - Return true if this is a POD type according to the
+ /// more relaxed rules of the C++11 standard, regardless of the current
+ /// compilation's language.
+ /// (C++0x [basic.types]p9)
+ bool isCXX11PODType(ASTContext &Context) const;
+
+ /// isTrivialType - Return true if this is a trivial type
+ /// (C++0x [basic.types]p9)
+ bool isTrivialType(ASTContext &Context) const;
+
+ /// isTriviallyCopyableType - Return true if this is a trivially
+ /// copyable type (C++0x [basic.types]p9)
+ bool isTriviallyCopyableType(ASTContext &Context) const;
+
// Don't promise in the API that anything besides 'const' can be
// easily added.
@@ -546,6 +641,10 @@ public:
return withFastQualifiers(Qualifiers::Volatile);
}
+ QualType withCVRQualifiers(unsigned CVR) const {
+ return withFastQualifiers(CVR);
+ }
+
void addFastQualifiers(unsigned TQs) {
assert(!(TQs & ~Qualifiers::FastMask)
&& "non-fast qualifier bits set in mask!");
@@ -658,6 +757,13 @@ public:
return getSplitDesugaredType(*this);
}
+ /// \brief Return the specified type with one level of "sugar" removed from
+ /// the type.
+ ///
+ /// This routine takes off the first typedef, typeof, etc. If the outer level
+ /// of the type is already concrete, it returns it unmodified.
+ QualType getSingleStepDesugaredType(const ASTContext &Context) const;
+
/// IgnoreParens - Returns the specified type after dropping any
/// outer-level parentheses.
QualType IgnoreParens() const {
@@ -709,7 +815,7 @@ public:
/// getAddressSpace - Return the address space of this type.
inline unsigned getAddressSpace() const;
- /// GCAttrTypesAttr - Returns gc attribute of this type.
+ /// getObjCGCAttr - Returns gc attribute of this type.
inline Qualifiers::GC getObjCGCAttr() const;
/// isObjCGCWeak true when Type is objc's weak.
@@ -722,9 +828,24 @@ public:
return getObjCGCAttr() == Qualifiers::Strong;
}
+ /// getObjCLifetime - Returns lifetime attribute of this type.
+ Qualifiers::ObjCLifetime getObjCLifetime() const {
+ return getQualifiers().getObjCLifetime();
+ }
+
+ bool hasNonTrivialObjCLifetime() const {
+ return getQualifiers().hasNonTrivialObjCLifetime();
+ }
+
+ bool hasStrongOrWeakObjCLifetime() const {
+ return getQualifiers().hasStrongOrWeakObjCLifetime();
+ }
+
enum DestructionKind {
DK_none,
- DK_cxx_destructor
+ DK_cxx_destructor,
+ DK_objc_strong_lifetime,
+ DK_objc_weak_lifetime
};
/// isDestructedType - nonzero if objects of this type require
@@ -735,6 +856,21 @@ public:
return isDestructedTypeImpl(*this);
}
+ /// \brief Determine whether expressions of the given type are forbidden
+ /// from being lvalues in C.
+ ///
+ /// The expression types that are forbidden to be lvalues are:
+ /// - 'void', but not qualified void
+ /// - function types
+ ///
+ /// The exact rule here is C99 6.3.2.1:
+ /// An lvalue is an expression with an object type or an incomplete
+ /// type other than void.
+ bool isCForbiddenLValueType() const;
+
+ /// \brief Determine whether this type has trivial copy-assignment semantics.
+ bool hasTrivialCopyAssignment(ASTContext &Context) const;
+
private:
// These methods are implemented in a separate translation unit;
// "static"-ize them to avoid creating temporary QualTypes in the
@@ -849,6 +985,11 @@ public:
bool hasObjCGCAttr() const { return Quals.hasObjCGCAttr(); }
Qualifiers::GC getObjCGCAttr() const { return Quals.getObjCGCAttr(); }
+ bool hasObjCLifetime() const { return Quals.hasObjCLifetime(); }
+ Qualifiers::ObjCLifetime getObjCLifetime() const {
+ return Quals.getObjCLifetime();
+ }
+
bool hasAddressSpace() const { return Quals.hasAddressSpace(); }
unsigned getAddressSpace() const { return Quals.getAddressSpace(); }
@@ -931,6 +1072,10 @@ private:
/// subclasses can pack their bitfields into the same word.
unsigned Dependent : 1;
+ /// \brief Whether this type somehow involves a template parameter, even
+ /// if the resolution of the type does not depend on a template parameter.
+ unsigned InstantiationDependent : 1;
+
/// \brief Whether this type is a variably-modified type (C99 6.7.5).
unsigned VariablyModified : 1;
@@ -968,7 +1113,7 @@ private:
return CachedLocalOrUnnamed;
}
};
- enum { NumTypeBits = 17 };
+ enum { NumTypeBits = 18 };
protected:
// These classes allow subclasses to somewhat cleanly pack bitfields
@@ -1111,12 +1256,14 @@ private:
protected:
// silence VC++ warning C4355: 'this' : used in base member initializer list
Type *this_() { return this; }
- Type(TypeClass tc, QualType canon, bool Dependent, bool VariablyModified,
+ Type(TypeClass tc, QualType canon, bool Dependent,
+ bool InstantiationDependent, bool VariablyModified,
bool ContainsUnexpandedParameterPack)
: ExtQualsTypeCommonBase(this,
canon.isNull() ? QualType(this_(), 0) : canon) {
TypeBits.TC = tc;
TypeBits.Dependent = Dependent;
+ TypeBits.InstantiationDependent = Dependent || InstantiationDependent;
TypeBits.VariablyModified = VariablyModified;
TypeBits.ContainsUnexpandedParameterPack = ContainsUnexpandedParameterPack;
TypeBits.CacheValidAndVisibility = 0;
@@ -1126,8 +1273,15 @@ protected:
}
friend class ASTContext;
- void setDependent(bool D = true) { TypeBits.Dependent = D; }
- void setVariablyModified(bool VM = true) { TypeBits.VariablyModified = VM; }
+ void setDependent(bool D = true) {
+ TypeBits.Dependent = D;
+ if (D)
+ TypeBits.InstantiationDependent = true;
+ }
+ void setInstantiationDependent(bool D = true) {
+ TypeBits.InstantiationDependent = D; }
+ void setVariablyModified(bool VM = true) { TypeBits.VariablyModified = VM;
+ }
void setContainsUnexpandedParameterPack(bool PP = true) {
TypeBits.ContainsUnexpandedParameterPack = PP;
}
@@ -1186,31 +1340,14 @@ public:
return !isReferenceType() && !isFunctionType() && !isVoidType();
}
- /// isPODType - Return true if this is a plain-old-data type (C++ 3.9p10).
- bool isPODType() const;
-
/// isLiteralType - Return true if this is a literal type
/// (C++0x [basic.types]p10)
bool isLiteralType() const;
- /// isTrivialType - Return true if this is a trivial type
- /// (C++0x [basic.types]p9)
- bool isTrivialType() const;
-
- /// isTriviallyCopyableType - Return true if this is a trivially copyable type
- /// (C++0x [basic.types]p9
- bool isTriviallyCopyableType() const;
-
/// \brief Test if this type is a standard-layout type.
/// (C++0x [basic.type]p9)
bool isStandardLayoutType() const;
- /// isCXX11PODType() - Return true if this is a POD type according to the
- /// more relaxed rules of the C++11 standard, regardless of the current
- /// compilation's language.
- /// (C++0x [basic.types]p9)
- bool isCXX11PODType() const;
-
/// Helper methods to distinguish type categories. All type predicates
/// operate on the canonical type, ignoring typedefs and qualifiers.
@@ -1290,7 +1427,11 @@ public:
bool isComplexIntegerType() const; // GCC _Complex integer type.
bool isVectorType() const; // GCC vector type.
bool isExtVectorType() const; // Extended vector type.
- bool isObjCObjectPointerType() const; // Pointer to *any* ObjC object.
+ bool isObjCObjectPointerType() const; // pointer to ObjC object
+ bool isObjCRetainableType() const; // ObjC object or block pointer
+ bool isObjCLifetimeType() const; // (array of)* retainable type
+ bool isObjCIndirectLifetimeType() const; // (pointer to)* lifetime type
+ bool isObjCNSObjectType() const; // __attribute__((NSObject))
// FIXME: change this to 'raw' interface type, so we can used 'interface' type
// for the common case.
bool isObjCObjectType() const; // NSString or typeof(*(id)0)
@@ -1302,9 +1443,19 @@ public:
bool isObjCClassType() const; // Class
bool isObjCSelType() const; // Class
bool isObjCBuiltinType() const; // 'id' or 'Class'
+ bool isObjCARCBridgableType() const;
+ bool isCARCBridgableType() const;
bool isTemplateTypeParmType() const; // C++ template type parameter
bool isNullPtrType() const; // C++0x nullptr_t
+ /// Determines if this type, which must satisfy
+ /// isObjCLifetimeType(), is implicitly __unsafe_unretained rather
+ /// than implicitly __strong.
+ bool isObjCARCImplicitlyUnretainedType() const;
+
+ /// Return the implicit lifetime for this type, which must not be dependent.
+ Qualifiers::ObjCLifetime getObjCARCImplicitLifetime() const;
+
enum ScalarTypeKind {
STK_Pointer,
STK_MemberPointer,
@@ -1322,6 +1473,14 @@ public:
/// (C++ [temp.dep.type]).
bool isDependentType() const { return TypeBits.Dependent; }
+ /// \brief Determine whether this type is an instantiation-dependent type,
+ /// meaning that the type involves a template parameter (even if the
+ /// definition does not actually depend on the type substituted for that
+ /// template parameter).
+ bool isInstantiationDependentType() const {
+ return TypeBits.InstantiationDependent;
+ }
+
/// \brief Whether this type is a variably-modified type (C99 6.7.5).
bool isVariablyModifiedType() const { return TypeBits.VariablyModified; }
@@ -1336,6 +1495,8 @@ public:
/// \brief Determine wither this type is a C++ elaborated-type-specifier.
bool isElaboratedTypeSpecifier() const;
+
+ bool canDecayToPointerType() const;
/// hasPointerRepresentation - Whether this type is represented
/// natively as a pointer; this includes pointers, references, block
@@ -1480,6 +1641,7 @@ public:
}
CanQualType getCanonicalTypeUnqualified() const; // in CanonicalType.h
void dump() const;
+
static bool classof(const Type *) { return true; }
friend class ASTReader;
@@ -1586,6 +1748,7 @@ public:
public:
BuiltinType(Kind K)
: Type(Builtin, QualType(), /*Dependent=*/(K == Dependent),
+ /*InstantiationDependent=*/(K == Dependent),
/*VariablyModified=*/false,
/*Unexpanded paramter pack=*/false) {
BuiltinTypeBits.Kind = K;
@@ -1631,6 +1794,7 @@ class ComplexType : public Type, public llvm::FoldingSetNode {
QualType ElementType;
ComplexType(QualType Element, QualType CanonicalPtr) :
Type(Complex, CanonicalPtr, Element->isDependentType(),
+ Element->isInstantiationDependentType(),
Element->isVariablyModifiedType(),
Element->containsUnexpandedParameterPack()),
ElementType(Element) {
@@ -1661,6 +1825,7 @@ class ParenType : public Type, public llvm::FoldingSetNode {
ParenType(QualType InnerType, QualType CanonType) :
Type(Paren, CanonType, InnerType->isDependentType(),
+ InnerType->isInstantiationDependentType(),
InnerType->isVariablyModifiedType(),
InnerType->containsUnexpandedParameterPack()),
Inner(InnerType) {
@@ -1692,6 +1857,7 @@ class PointerType : public Type, public llvm::FoldingSetNode {
PointerType(QualType Pointee, QualType CanonicalPtr) :
Type(Pointer, CanonicalPtr, Pointee->isDependentType(),
+ Pointee->isInstantiationDependentType(),
Pointee->isVariablyModifiedType(),
Pointee->containsUnexpandedParameterPack()),
PointeeType(Pointee) {
@@ -1724,6 +1890,7 @@ class BlockPointerType : public Type, public llvm::FoldingSetNode {
QualType PointeeType; // Block is some kind of pointer type
BlockPointerType(QualType Pointee, QualType CanonicalCls) :
Type(BlockPointer, CanonicalCls, Pointee->isDependentType(),
+ Pointee->isInstantiationDependentType(),
Pointee->isVariablyModifiedType(),
Pointee->containsUnexpandedParameterPack()),
PointeeType(Pointee) {
@@ -1760,6 +1927,7 @@ protected:
ReferenceType(TypeClass tc, QualType Referencee, QualType CanonicalRef,
bool SpelledAsLValue) :
Type(tc, CanonicalRef, Referencee->isDependentType(),
+ Referencee->isInstantiationDependentType(),
Referencee->isVariablyModifiedType(),
Referencee->containsUnexpandedParameterPack()),
PointeeType(Referencee)
@@ -1844,6 +2012,8 @@ class MemberPointerType : public Type, public llvm::FoldingSetNode {
MemberPointerType(QualType Pointee, const Type *Cls, QualType CanonicalPtr) :
Type(MemberPointer, CanonicalPtr,
Cls->isDependentType() || Pointee->isDependentType(),
+ (Cls->isInstantiationDependentType() ||
+ Pointee->isInstantiationDependentType()),
Pointee->isVariablyModifiedType(),
(Cls->containsUnexpandedParameterPack() ||
Pointee->containsUnexpandedParameterPack())),
@@ -1911,6 +2081,7 @@ protected:
ArraySizeModifier sm, unsigned tq,
bool ContainsUnexpandedParameterPack)
: Type(tc, can, et->isDependentType() || tc == DependentSizedArray,
+ et->isInstantiationDependentType() || tc == DependentSizedArray,
(tc == VariableArray || et->isVariablyModifiedType()),
ContainsUnexpandedParameterPack),
ElementType(et) {
@@ -2344,28 +2515,32 @@ class FunctionType : public Type {
// you'll need to adjust both the Bits field below and
// Type::FunctionTypeBitfields.
- // | CC |noreturn|hasregparm|regparm
- // |0 .. 2| 3 | 4 |5 .. 7
+ // | CC |noreturn|produces|regparm|
+ // |0 .. 2| 3 | 4 | 5 .. 7|
+ //
+ // regparm is either 0 (no regparm attribute) or the regparm value+1.
enum { CallConvMask = 0x7 };
enum { NoReturnMask = 0x8 };
- enum { HasRegParmMask = 0x10 };
- enum { RegParmMask = ~(CallConvMask | NoReturnMask),
- RegParmOffset = 5 };
+ enum { ProducesResultMask = 0x10 };
+ enum { RegParmMask = ~(CallConvMask | NoReturnMask | ProducesResultMask),
+ RegParmOffset = 5 }; // Assumed to be the last field
- unsigned char Bits;
+ uint16_t Bits;
- ExtInfo(unsigned Bits) : Bits(static_cast<unsigned char>(Bits)) {}
+ ExtInfo(unsigned Bits) : Bits(static_cast<uint16_t>(Bits)) {}
friend class FunctionType;
public:
// Constructor with no defaults. Use this when you know that you
// have all the elements (when reading an AST file for example).
- ExtInfo(bool noReturn, bool hasRegParm, unsigned regParm, CallingConv cc) {
+ ExtInfo(bool noReturn, bool hasRegParm, unsigned regParm, CallingConv cc,
+ bool producesResult) {
+ assert((!hasRegParm || regParm < 7) && "Invalid regparm value");
Bits = ((unsigned) cc) |
(noReturn ? NoReturnMask : 0) |
- (hasRegParm ? HasRegParmMask : 0) |
- (regParm << RegParmOffset);
+ (producesResult ? ProducesResultMask : 0) |
+ (hasRegParm ? ((regParm + 1) << RegParmOffset) : 0);
}
// Constructor with all defaults. Use when for example creating a
@@ -2373,8 +2548,14 @@ class FunctionType : public Type {
ExtInfo() : Bits(0) {}
bool getNoReturn() const { return Bits & NoReturnMask; }
- bool getHasRegParm() const { return Bits & HasRegParmMask; }
- unsigned getRegParm() const { return Bits >> RegParmOffset; }
+ bool getProducesResult() const { return Bits & ProducesResultMask; }
+ bool getHasRegParm() const { return (Bits >> RegParmOffset) != 0; }
+ unsigned getRegParm() const {
+ unsigned RegParm = Bits >> RegParmOffset;
+ if (RegParm > 0)
+ --RegParm;
+ return RegParm;
+ }
CallingConv getCC() const { return CallingConv(Bits & CallConvMask); }
bool operator==(ExtInfo Other) const {
@@ -2394,8 +2575,17 @@ class FunctionType : public Type {
return ExtInfo(Bits & ~NoReturnMask);
}
+ ExtInfo withProducesResult(bool producesResult) const {
+ if (producesResult)
+ return ExtInfo(Bits | ProducesResultMask);
+ else
+ return ExtInfo(Bits & ~ProducesResultMask);
+ }
+
ExtInfo withRegParm(unsigned RegParm) const {
- return ExtInfo(HasRegParmMask | (Bits & ~RegParmMask) | (RegParm << RegParmOffset));
+ assert(RegParm < 7 && "Invalid regparm value");
+ return ExtInfo((Bits & ~RegParmMask) |
+ ((RegParm + 1) << RegParmOffset));
}
ExtInfo withCallingConv(CallingConv cc) const {
@@ -2411,9 +2601,10 @@ protected:
FunctionType(TypeClass tc, QualType res, bool variadic,
unsigned typeQuals, RefQualifierKind RefQualifier,
QualType Canonical, bool Dependent,
+ bool InstantiationDependent,
bool VariablyModified, bool ContainsUnexpandedParameterPack,
ExtInfo Info)
- : Type(tc, Canonical, Dependent, VariablyModified,
+ : Type(tc, Canonical, Dependent, InstantiationDependent, VariablyModified,
ContainsUnexpandedParameterPack),
ResultType(res) {
FunctionTypeBits.ExtInfo = Info.Bits;
@@ -2458,7 +2649,8 @@ public:
class FunctionNoProtoType : public FunctionType, public llvm::FoldingSetNode {
FunctionNoProtoType(QualType Result, QualType Canonical, ExtInfo Info)
: FunctionType(FunctionNoProto, Result, false, 0, RQ_None, Canonical,
- /*Dependent=*/false, Result->isVariablyModifiedType(),
+ /*Dependent=*/false, /*InstantiationDependent=*/false,
+ Result->isVariablyModifiedType(),
/*ContainsUnexpandedParameterPack=*/false, Info) {}
friend class ASTContext; // ASTContext creates these.
@@ -2495,7 +2687,8 @@ public:
struct ExtProtoInfo {
ExtProtoInfo() :
Variadic(false), ExceptionSpecType(EST_None), TypeQuals(0),
- RefQualifier(RQ_None), NumExceptions(0), Exceptions(0), NoexceptExpr(0) {}
+ RefQualifier(RQ_None), NumExceptions(0), Exceptions(0), NoexceptExpr(0),
+ ConsumedArguments(0) {}
FunctionType::ExtInfo ExtInfo;
bool Variadic;
@@ -2505,6 +2698,7 @@ public:
unsigned NumExceptions;
const QualType *Exceptions;
Expr *NoexceptExpr;
+ const bool *ConsumedArguments;
};
private:
@@ -2523,7 +2717,7 @@ private:
QualType canonical, const ExtProtoInfo &epi);
/// NumArgs - The number of arguments this function has, not counting '...'.
- unsigned NumArgs : 20;
+ unsigned NumArgs : 19;
/// NumExceptions - The number of types in the exception spec, if any.
unsigned NumExceptions : 9;
@@ -2531,6 +2725,9 @@ private:
/// ExceptionSpecType - The type of exception specification this function has.
unsigned ExceptionSpecType : 3;
+ /// HasAnyConsumedArgs - Whether this function has any consumed arguments.
+ unsigned HasAnyConsumedArgs : 1;
+
/// ArgInfo - There is an variable size array after the class in memory that
/// holds the argument types.
@@ -2540,8 +2737,25 @@ private:
/// NoexceptExpr - Instead of Exceptions, there may be a single Expr* pointing
/// to the expression in the noexcept() specifier.
+ /// ConsumedArgs - A variable size array, following Exceptions
+ /// and of length NumArgs, holding flags indicating which arguments
+ /// are consumed. This only appears if HasAnyConsumedArgs is true.
+
friend class ASTContext; // ASTContext creates these.
+ const bool *getConsumedArgsBuffer() const {
+ assert(hasAnyConsumedArgs());
+
+ // Find the end of the exceptions.
+ Expr * const *eh_end = reinterpret_cast<Expr * const *>(arg_type_end());
+ if (getExceptionSpecType() != EST_ComputedNoexcept)
+ eh_end += NumExceptions;
+ else
+ eh_end += 1; // NoexceptExpr
+
+ return reinterpret_cast<const bool*>(eh_end);
+ }
+
public:
unsigned getNumArgs() const { return NumArgs; }
QualType getArgType(unsigned i) const {
@@ -2562,6 +2776,8 @@ public:
} else if (EPI.ExceptionSpecType == EST_ComputedNoexcept) {
EPI.NoexceptExpr = getNoexceptExpr();
}
+ if (hasAnyConsumedArgs())
+ EPI.ConsumedArguments = getConsumedArgsBuffer();
return EPI;
}
@@ -2647,6 +2863,16 @@ public:
return exception_begin() + NumExceptions;
}
+ bool hasAnyConsumedArgs() const {
+ return HasAnyConsumedArgs;
+ }
+ bool isArgConsumed(unsigned I) const {
+ assert(I < getNumArgs() && "argument index out of range!");
+ if (hasAnyConsumedArgs())
+ return getConsumedArgsBuffer()[I];
+ return false;
+ }
+
bool isSugared() const { return false; }
QualType desugar() const { return QualType(this, 0); }
@@ -2670,7 +2896,7 @@ class UnresolvedUsingType : public Type {
UnresolvedUsingTypenameDecl *Decl;
UnresolvedUsingType(const UnresolvedUsingTypenameDecl *D)
- : Type(UnresolvedUsing, QualType(), true, false,
+ : Type(UnresolvedUsing, QualType(), true, true, false,
/*ContainsUnexpandedParameterPack=*/false),
Decl(const_cast<UnresolvedUsingTypenameDecl*>(D)) {}
friend class ASTContext; // ASTContext creates these.
@@ -2700,7 +2926,9 @@ class TypedefType : public Type {
TypedefNameDecl *Decl;
protected:
TypedefType(TypeClass tc, const TypedefNameDecl *D, QualType can)
- : Type(tc, can, can->isDependentType(), can->isVariablyModifiedType(),
+ : Type(tc, can, can->isDependentType(),
+ can->isInstantiationDependentType(),
+ can->isVariablyModifiedType(),
/*ContainsUnexpandedParameterPack=*/false),
Decl(const_cast<TypedefNameDecl*>(D)) {
assert(!isa<TypedefType>(can) && "Invalid canonical type");
@@ -2731,7 +2959,7 @@ public:
QualType desugar() const;
/// \brief Returns whether this type directly provides sugar.
- bool isSugared() const { return true; }
+ bool isSugared() const;
static bool classof(const Type *T) { return T->getTypeClass() == TypeOfExpr; }
static bool classof(const TypeOfExprType *) { return true; }
@@ -2751,9 +2979,6 @@ public:
DependentTypeOfExprType(const ASTContext &Context, Expr *E)
: TypeOfExprType(E), Context(Context) { }
- bool isSugared() const { return false; }
- QualType desugar() const { return QualType(this, 0); }
-
void Profile(llvm::FoldingSetNodeID &ID) {
Profile(ID, Context, getUnderlyingExpr());
}
@@ -2766,7 +2991,9 @@ public:
class TypeOfType : public Type {
QualType TOType;
TypeOfType(QualType T, QualType can)
- : Type(TypeOf, can, T->isDependentType(), T->isVariablyModifiedType(),
+ : Type(TypeOf, can, T->isDependentType(),
+ T->isInstantiationDependentType(),
+ T->isVariablyModifiedType(),
T->containsUnexpandedParameterPack()),
TOType(T) {
assert(!isa<TypedefType>(can) && "Invalid canonical type");
@@ -2802,10 +3029,10 @@ public:
QualType getUnderlyingType() const { return UnderlyingType; }
/// \brief Remove a single level of sugar.
- QualType desugar() const { return getUnderlyingType(); }
+ QualType desugar() const;
/// \brief Returns whether this type directly provides sugar.
- bool isSugared() const { return !isDependentType(); }
+ bool isSugared() const;
static bool classof(const Type *T) { return T->getTypeClass() == Decltype; }
static bool classof(const DecltypeType *) { return true; }
@@ -2823,9 +3050,6 @@ class DependentDecltypeType : public DecltypeType, public llvm::FoldingSetNode {
public:
DependentDecltypeType(const ASTContext &Context, Expr *E);
- bool isSugared() const { return false; }
- QualType desugar() const { return QualType(this, 0); }
-
void Profile(llvm::FoldingSetNodeID &ID) {
Profile(ID, Context, getUnderlyingExpr());
}
@@ -2971,6 +3195,7 @@ public:
// Enumerated operand (string or keyword).
attr_objc_gc,
+ attr_objc_ownership,
attr_pcs,
FirstEnumOperandKind = attr_objc_gc,
@@ -2994,6 +3219,7 @@ private:
AttributedType(QualType canon, Kind attrKind,
QualType modified, QualType equivalent)
: Type(Attributed, canon, canon->isDependentType(),
+ canon->isInstantiationDependentType(),
canon->isVariablyModifiedType(),
canon->containsUnexpandedParameterPack()),
ModifiedType(modified), EquivalentType(equivalent) {
@@ -3046,13 +3272,16 @@ class TemplateTypeParmType : public Type, public llvm::FoldingSetNode {
/// Build a non-canonical type.
TemplateTypeParmType(TemplateTypeParmDecl *TTPDecl, QualType Canon)
: Type(TemplateTypeParm, Canon, /*Dependent=*/true,
+ /*InstantiationDependent=*/true,
/*VariablyModified=*/false,
Canon->containsUnexpandedParameterPack()),
TTPDecl(TTPDecl) { }
/// Build the canonical type.
TemplateTypeParmType(unsigned D, unsigned I, bool PP)
- : Type(TemplateTypeParm, QualType(this, 0), /*Dependent=*/true,
+ : Type(TemplateTypeParm, QualType(this, 0),
+ /*Dependent=*/true,
+ /*InstantiationDependent=*/true,
/*VariablyModified=*/false, PP) {
CanTTPTInfo.Depth = D;
CanTTPTInfo.Index = I;
@@ -3112,6 +3341,7 @@ class SubstTemplateTypeParmType : public Type, public llvm::FoldingSetNode {
SubstTemplateTypeParmType(const TemplateTypeParmType *Param, QualType Canon)
: Type(SubstTemplateTypeParm, Canon, Canon->isDependentType(),
+ Canon->isInstantiationDependentType(),
Canon->isVariablyModifiedType(),
Canon->containsUnexpandedParameterPack()),
Replaced(Param) { }
@@ -3211,6 +3441,7 @@ class AutoType : public Type, public llvm::FoldingSetNode {
AutoType(QualType DeducedType)
: Type(Auto, DeducedType.isNull() ? QualType(this, 0) : DeducedType,
/*Dependent=*/DeducedType.isNull(),
+ /*InstantiationDependent=*/DeducedType.isNull(),
/*VariablyModified=*/false, /*ContainsParameterPack=*/false) {
assert((DeducedType.isNull() || !DeducedType->isDependentType()) &&
"deduced a dependent type for auto");
@@ -3244,28 +3475,35 @@ public:
static bool classof(const AutoType *T) { return true; }
};
-/// \brief Represents the type of a template specialization as written
-/// in the source code.
+/// \brief Represents a type template specialization; the template
+/// must be a class template, a type alias template, or a template
+/// template parameter. A template which cannot be resolved to one of
+/// these, e.g. because it is written with a dependent scope
+/// specifier, is instead represented as a
+/// @c DependentTemplateSpecializationType.
///
-/// Template specialization types represent the syntactic form of a
-/// template-id that refers to a type, e.g., @c vector<int>. Some
-/// template specialization types are syntactic sugar, whose canonical
-/// type will point to some other type node that represents the
-/// instantiation or class template specialization. For example, a
-/// class template specialization type of @c vector<int> will refer to
-/// a tag type for the instantiation
-/// @c std::vector<int, std::allocator<int>>.
+/// A non-dependent template specialization type is always "sugar",
+/// typically for a @c RecordType. For example, a class template
+/// specialization type of @c vector<int> will refer to a tag type for
+/// the instantiation @c std::vector<int, std::allocator<int>>
///
-/// Other template specialization types, for which the template name
-/// is dependent, may be canonical types. These types are always
-/// dependent.
+/// Template specializations are dependent if either the template or
+/// any of the template arguments are dependent, in which case the
+/// type may also be canonical.
///
-/// An instance of this type is followed by an array of TemplateArgument*s,
-/// then, if the template specialization type is for a type alias template,
-/// a QualType representing the non-canonical aliased type.
+/// Instances of this type are allocated with a trailing array of
+/// TemplateArguments, followed by a QualType representing the
+/// non-canonical aliased type when the template is a type alias
+/// template.
class TemplateSpecializationType
: public Type, public llvm::FoldingSetNode {
- /// \brief The name of the template being specialized.
+ /// \brief The name of the template being specialized. This is
+ /// either a TemplateName::Template (in which case it is a
+ /// ClassTemplateDecl*, a TemplateTemplateParmDecl*, or a
+ /// TypeAliasTemplateDecl*), a
+ /// TemplateName::SubstTemplateTemplateParmPack, or a
+ /// TemplateName::SubstTemplateTemplateParm (in which case the
+ /// replacement must, recursively, be one of these).
TemplateName Template;
/// \brief - The number of template arguments named in this class
@@ -3283,12 +3521,15 @@ public:
/// \brief Determine whether any of the given template arguments are
/// dependent.
static bool anyDependentTemplateArguments(const TemplateArgument *Args,
- unsigned NumArgs);
+ unsigned NumArgs,
+ bool &InstantiationDependent);
static bool anyDependentTemplateArguments(const TemplateArgumentLoc *Args,
- unsigned NumArgs);
+ unsigned NumArgs,
+ bool &InstantiationDependent);
- static bool anyDependentTemplateArguments(const TemplateArgumentListInfo &);
+ static bool anyDependentTemplateArguments(const TemplateArgumentListInfo &,
+ bool &InstantiationDependent);
/// \brief Print a template argument list, including the '<' and '>'
/// enclosing the template arguments.
@@ -3399,6 +3640,7 @@ class InjectedClassNameType : public Type {
// interdependencies.
InjectedClassNameType(CXXRecordDecl *D, QualType TST)
: Type(InjectedClassName, QualType(), /*Dependent=*/true,
+ /*InstantiationDependent=*/true,
/*VariablyModified=*/false,
/*ContainsUnexpandedParameterPack=*/false),
Decl(D), InjectedType(TST) {
@@ -3461,9 +3703,10 @@ enum ElaboratedTypeKeyword {
class TypeWithKeyword : public Type {
protected:
TypeWithKeyword(ElaboratedTypeKeyword Keyword, TypeClass tc,
- QualType Canonical, bool Dependent, bool VariablyModified,
+ QualType Canonical, bool Dependent,
+ bool InstantiationDependent, bool VariablyModified,
bool ContainsUnexpandedParameterPack)
- : Type(tc, Canonical, Dependent, VariablyModified,
+ : Type(tc, Canonical, Dependent, InstantiationDependent, VariablyModified,
ContainsUnexpandedParameterPack) {
TypeWithKeywordBits.Keyword = Keyword;
}
@@ -3523,6 +3766,7 @@ class ElaboratedType : public TypeWithKeyword, public llvm::FoldingSetNode {
QualType NamedType, QualType CanonType)
: TypeWithKeyword(Keyword, Elaborated, CanonType,
NamedType->isDependentType(),
+ NamedType->isInstantiationDependentType(),
NamedType->isVariablyModifiedType(),
NamedType->containsUnexpandedParameterPack()),
NNS(NNS), NamedType(NamedType) {
@@ -3585,6 +3829,7 @@ class DependentNameType : public TypeWithKeyword, public llvm::FoldingSetNode {
DependentNameType(ElaboratedTypeKeyword Keyword, NestedNameSpecifier *NNS,
const IdentifierInfo *Name, QualType CanonType)
: TypeWithKeyword(Keyword, DependentName, CanonType, /*Dependent=*/true,
+ /*InstantiationDependent=*/true,
/*VariablyModified=*/false,
NNS->containsUnexpandedParameterPack()),
NNS(NNS), Name(Name) {
@@ -3738,6 +3983,7 @@ class PackExpansionType : public Type, public llvm::FoldingSetNode {
PackExpansionType(QualType Pattern, QualType Canon,
llvm::Optional<unsigned> NumExpansions)
: Type(PackExpansion, Canon, /*Dependent=*/true,
+ /*InstantiationDependent=*/true,
/*VariableModified=*/Pattern->isVariablyModifiedType(),
/*ContainsUnexpandedParameterPack=*/false),
Pattern(Pattern),
@@ -3829,7 +4075,7 @@ protected:
enum Nonce_ObjCInterface { Nonce_ObjCInterface };
ObjCObjectType(enum Nonce_ObjCInterface)
- : Type(ObjCInterface, QualType(), false, false, false),
+ : Type(ObjCInterface, QualType(), false, false, false, false),
BaseType(QualType(this_(), 0)) {
ObjCObjectTypeBits.NumProtocols = 0;
}
@@ -3986,7 +4232,7 @@ class ObjCObjectPointerType : public Type, public llvm::FoldingSetNode {
QualType PointeeType;
ObjCObjectPointerType(QualType Canonical, QualType Pointee)
- : Type(ObjCObjectPointer, Canonical, false, false, false),
+ : Type(ObjCObjectPointer, Canonical, false, false, false, false),
PointeeType(Pointee) {}
friend class ASTContext; // ASTContext creates these.
@@ -4303,6 +4549,11 @@ inline QualType QualType::getNonReferenceType() const {
return *this;
}
+inline bool QualType::isCForbiddenLValueType() const {
+ return ((getTypePtr()->isVoidType() && !hasQualifiers()) ||
+ getTypePtr()->isFunctionType());
+}
+
/// \brief Tests whether the type is categorized as a fundamental type.
///
/// \returns True for types specified in C++0x [basic.fundamental].
@@ -4480,6 +4731,11 @@ inline bool Type::isOverloadableType() const {
return isDependentType() || isRecordType() || isEnumeralType();
}
+/// \brief Determines whether this type can decay to a pointer type.
+inline bool Type::canDecayToPointerType() const {
+ return isFunctionType() || isArrayType();
+}
+
inline bool Type::hasPointerRepresentation() const {
return (isPointerType() || isReferenceType() || isBlockPointerType() ||
isObjCObjectPointerType() || isNullPtrType());
diff --git a/contrib/llvm/tools/clang/include/clang/Analysis/Analyses/UninitializedValues.h b/contrib/llvm/tools/clang/include/clang/Analysis/Analyses/UninitializedValues.h
index b966f3a..badb493 100644
--- a/contrib/llvm/tools/clang/include/clang/Analysis/Analyses/UninitializedValues.h
+++ b/contrib/llvm/tools/clang/include/clang/Analysis/Analyses/UninitializedValues.h
@@ -32,10 +32,16 @@ public:
const VarDecl *vd,
bool isAlwaysUninit) {}
};
-
+
+struct UninitVariablesAnalysisStats {
+ unsigned NumVariablesAnalyzed;
+ unsigned NumBlockVisits;
+};
+
void runUninitializedVariablesAnalysis(const DeclContext &dc, const CFG &cfg,
AnalysisContext &ac,
- UninitVariablesHandler &handler);
+ UninitVariablesHandler &handler,
+ UninitVariablesAnalysisStats &stats);
}
#endif
diff --git a/contrib/llvm/tools/clang/include/clang/Analysis/AnalysisContext.h b/contrib/llvm/tools/clang/include/clang/Analysis/AnalysisContext.h
index 66c12a5..6a1876e 100644
--- a/contrib/llvm/tools/clang/include/clang/Analysis/AnalysisContext.h
+++ b/contrib/llvm/tools/clang/include/clang/Analysis/AnalysisContext.h
@@ -107,6 +107,11 @@ public:
void dumpCFG();
+ /// \brief Returns true if we have built a CFG for this analysis context.
+ /// Note that this doesn't correspond to whether or not a valid CFG exists, it
+ /// corresponds to whether we *attempted* to build one.
+ bool isCFGBuilt() const { return builtCFG; }
+
ParentMap &getParentMap();
PseudoConstantAnalysis *getPseudoConstantAnalysis();
LiveVariables *getLiveVariables();
diff --git a/contrib/llvm/tools/clang/include/clang/Analysis/DomainSpecific/CocoaConventions.h b/contrib/llvm/tools/clang/include/clang/Analysis/DomainSpecific/CocoaConventions.h
index 18e81fe..5a4e06f 100644
--- a/contrib/llvm/tools/clang/include/clang/Analysis/DomainSpecific/CocoaConventions.h
+++ b/contrib/llvm/tools/clang/include/clang/Analysis/DomainSpecific/CocoaConventions.h
@@ -7,34 +7,45 @@
//
//===----------------------------------------------------------------------===//
//
-// This file defines
+// This file implements cocoa naming convention analysis.
//
//===----------------------------------------------------------------------===//
#ifndef LLVM_CLANG_ANALYSIS_DS_COCOA
#define LLVM_CLANG_ANALYSIS_DS_COCOA
+#include "llvm/ADT/StringRef.h"
#include "clang/AST/Type.h"
namespace clang {
+
+class ObjCMethodDecl;
+
namespace ento {
namespace cocoa {
enum NamingConvention { NoConvention, CreateRule, InitRule };
- NamingConvention deriveNamingConvention(Selector S);
+ NamingConvention deriveNamingConvention(Selector S, const ObjCMethodDecl *MD);
- static inline bool followsFundamentalRule(Selector S) {
- return deriveNamingConvention(S) == CreateRule;
+ static inline bool followsFundamentalRule(Selector S,
+ const ObjCMethodDecl *MD) {
+ return deriveNamingConvention(S, MD) == CreateRule;
}
bool isRefType(QualType RetTy, llvm::StringRef Prefix,
llvm::StringRef Name = llvm::StringRef());
-
+
+ bool isCocoaObjectRef(QualType T);
+
+}
+
+namespace coreFoundation {
bool isCFObjectRef(QualType T);
- bool isCocoaObjectRef(QualType T);
+ bool followsCreateRule(llvm::StringRef functionName);
+}
-}}}
+}} // end: "clang:ento"
#endif
diff --git a/contrib/llvm/tools/clang/include/clang/Basic/Attr.td b/contrib/llvm/tools/clang/include/clang/Basic/Attr.td
index e4c6722..e64dc6a 100644
--- a/contrib/llvm/tools/clang/include/clang/Basic/Attr.td
+++ b/contrib/llvm/tools/clang/include/clang/Basic/Attr.td
@@ -400,6 +400,11 @@ def ObjCNSObject : InheritableAttr {
let Spellings = ["NSObject"];
}
+def ObjCPreciseLifetime : Attr {
+ let Spellings = ["objc_precise_lifetime"];
+ let Subjects = [Var];
+}
+
def Overloadable : Attr {
let Spellings = ["overloadable"];
}
@@ -479,6 +484,10 @@ def Unavailable : InheritableAttr {
let Args = [StringArgument<"Message">];
}
+def ArcWeakrefUnavailable : InheritableAttr {
+ let Spellings = ["objc_arc_weak_reference_unavailable"];
+}
+
def Unused : InheritableAttr {
let Spellings = ["unused"];
}
diff --git a/contrib/llvm/tools/clang/include/clang/Basic/Builtins.def b/contrib/llvm/tools/clang/include/clang/Basic/Builtins.def
index 9a4c768..a3cc615 100644
--- a/contrib/llvm/tools/clang/include/clang/Basic/Builtins.def
+++ b/contrib/llvm/tools/clang/include/clang/Basic/Builtins.def
@@ -604,6 +604,8 @@ BUILTIN(__builtin_rindex, "c*cC*i", "Fn")
// Microsoft builtins.
BUILTIN(__assume, "vb", "n")
BUILTIN(__noop, "v.", "n")
+BUILTIN(__debugbreak, "v", "n")
+
// C99 library functions
// C99 stdlib.h
@@ -727,6 +729,10 @@ LIBBUILTIN(cos, "dd", "fe", "math.h", ALL_LANGUAGES)
LIBBUILTIN(cosl, "LdLd", "fe", "math.h", ALL_LANGUAGES)
LIBBUILTIN(cosf, "ff", "fe", "math.h", ALL_LANGUAGES)
+LIBBUILTIN(fma, "dddd", "fc", "math.h", ALL_LANGUAGES)
+LIBBUILTIN(fmal, "LdLdLdLd", "fc", "math.h", ALL_LANGUAGES)
+LIBBUILTIN(fmaf, "ffff", "fc", "math.h", ALL_LANGUAGES)
+
// Blocks runtime Builtin math library functions
LIBBUILTIN(_Block_object_assign, "vv*vC*iC", "f", "Blocks.h", ALL_LANGUAGES)
LIBBUILTIN(_Block_object_dispose, "vvC*iC", "f", "Blocks.h", ALL_LANGUAGES)
diff --git a/contrib/llvm/tools/clang/include/clang/Basic/Builtins.h b/contrib/llvm/tools/clang/include/clang/Basic/Builtins.h
index 0d17e03..7469e14 100644
--- a/contrib/llvm/tools/clang/include/clang/Basic/Builtins.h
+++ b/contrib/llvm/tools/clang/include/clang/Basic/Builtins.h
@@ -50,7 +50,6 @@ enum ID {
struct Info {
const char *Name, *Type, *Attributes, *HeaderName;
LanguageID builtin_lang;
- bool Suppressed;
bool operator==(const Info &RHS) const {
return !strcmp(Name, RHS.Name) &&
diff --git a/contrib/llvm/tools/clang/include/clang/Basic/BuiltinsX86.def b/contrib/llvm/tools/clang/include/clang/Basic/BuiltinsX86.def
index 6ef667d..6bd9014 100644
--- a/contrib/llvm/tools/clang/include/clang/Basic/BuiltinsX86.def
+++ b/contrib/llvm/tools/clang/include/clang/Basic/BuiltinsX86.def
@@ -26,6 +26,7 @@
// 3DNow!
//
+BUILTIN(__builtin_ia32_femms, "v", "")
BUILTIN(__builtin_ia32_pavgusb, "V8cV8cV8c", "nc")
BUILTIN(__builtin_ia32_pf2id, "V2iV2f", "nc")
BUILTIN(__builtin_ia32_pfacc, "V2fV2fV2f", "nc")
@@ -47,7 +48,7 @@ BUILTIN(__builtin_ia32_pfsub, "V2fV2fV2f", "nc")
BUILTIN(__builtin_ia32_pfsubr, "V2fV2fV2f", "nc")
BUILTIN(__builtin_ia32_pi2fd, "V2fV2i", "nc")
BUILTIN(__builtin_ia32_pmulhrw, "V4sV4sV4s", "nc")
-// 3DNow! Extensions.
+// 3DNow! Extensions (3dnowa).
BUILTIN(__builtin_ia32_pf2iw, "V2iV2f", "nc")
BUILTIN(__builtin_ia32_pfnacc, "V2fV2fV2f", "nc")
BUILTIN(__builtin_ia32_pfpnacc, "V2fV2fV2f", "nc")
@@ -57,15 +58,13 @@ BUILTIN(__builtin_ia32_pswapdsi, "V2iV2i", "nc")
// MMX
//
-// FIXME: All MMX instructions will be generated via builtins. Any MMX vector
+// All MMX instructions will be generated via builtins. Any MMX vector
// types (<1 x i64>, <2 x i32>, etc.) that aren't used by these builtins will be
// expanded by the back-end.
BUILTIN(__builtin_ia32_emms, "v", "")
-BUILTIN(__builtin_ia32_femms, "v", "")
BUILTIN(__builtin_ia32_paddb, "V8cV8cV8c", "")
BUILTIN(__builtin_ia32_paddw, "V4sV4sV4s", "")
BUILTIN(__builtin_ia32_paddd, "V2iV2iV2i", "")
-BUILTIN(__builtin_ia32_paddq, "V1LLiV1LLiV1LLi", "")
BUILTIN(__builtin_ia32_paddsb, "V8cV8cV8c", "")
BUILTIN(__builtin_ia32_paddsw, "V4sV4sV4s", "")
BUILTIN(__builtin_ia32_paddusb, "V8cV8cV8c", "")
@@ -73,27 +72,17 @@ BUILTIN(__builtin_ia32_paddusw, "V4sV4sV4s", "")
BUILTIN(__builtin_ia32_psubb, "V8cV8cV8c", "")
BUILTIN(__builtin_ia32_psubw, "V4sV4sV4s", "")
BUILTIN(__builtin_ia32_psubd, "V2iV2iV2i", "")
-BUILTIN(__builtin_ia32_psubq, "V1LLiV1LLiV1LLi", "")
BUILTIN(__builtin_ia32_psubsb, "V8cV8cV8c", "")
BUILTIN(__builtin_ia32_psubsw, "V4sV4sV4s", "")
BUILTIN(__builtin_ia32_psubusb, "V8cV8cV8c", "")
BUILTIN(__builtin_ia32_psubusw, "V4sV4sV4s", "")
BUILTIN(__builtin_ia32_pmulhw, "V4sV4sV4s", "")
BUILTIN(__builtin_ia32_pmullw, "V4sV4sV4s", "")
-BUILTIN(__builtin_ia32_pmulhuw, "V4sV4sV4s", "")
-BUILTIN(__builtin_ia32_pmuludq, "V1LLiV2iV2i", "")
BUILTIN(__builtin_ia32_pmaddwd, "V2iV4sV4s", "")
BUILTIN(__builtin_ia32_pand, "V1LLiV1LLiV1LLi", "")
BUILTIN(__builtin_ia32_pandn, "V1LLiV1LLiV1LLi", "")
BUILTIN(__builtin_ia32_por, "V1LLiV1LLiV1LLi", "")
BUILTIN(__builtin_ia32_pxor, "V1LLiV1LLiV1LLi", "")
-BUILTIN(__builtin_ia32_pavgb, "V8cV8cV8c", "")
-BUILTIN(__builtin_ia32_pavgw, "V4sV4sV4s", "")
-BUILTIN(__builtin_ia32_pmaxub, "V8cV8cV8c", "")
-BUILTIN(__builtin_ia32_pmaxsw, "V4sV4sV4s", "")
-BUILTIN(__builtin_ia32_pminub, "V8cV8cV8c", "")
-BUILTIN(__builtin_ia32_pminsw, "V4sV4sV4s", "")
-BUILTIN(__builtin_ia32_psadbw, "V4sV8cV8c", "")
BUILTIN(__builtin_ia32_psllw, "V4sV4sV1LLi", "")
BUILTIN(__builtin_ia32_pslld, "V2iV2iV1LLi", "")
BUILTIN(__builtin_ia32_psllq, "V1LLiV1LLiV1LLi", "")
@@ -113,7 +102,6 @@ BUILTIN(__builtin_ia32_psradi, "V2iV2ii", "")
BUILTIN(__builtin_ia32_packsswb, "V8cV4sV4s", "")
BUILTIN(__builtin_ia32_packssdw, "V4sV2iV2i", "")
BUILTIN(__builtin_ia32_packuswb, "V8cV4sV4s", "")
-BUILTIN(__builtin_ia32_pshufw, "V4sV4sIc", "")
BUILTIN(__builtin_ia32_punpckhbw, "V8cV8cV8c", "")
BUILTIN(__builtin_ia32_punpckhwd, "V4sV4sV4s", "")
BUILTIN(__builtin_ia32_punpckhdq, "V2iV2iV2i", "")
@@ -127,14 +115,53 @@ BUILTIN(__builtin_ia32_pcmpgtb, "V8cV8cV8c", "")
BUILTIN(__builtin_ia32_pcmpgtw, "V4sV4sV4s", "")
BUILTIN(__builtin_ia32_pcmpgtd, "V2iV2iV2i", "")
BUILTIN(__builtin_ia32_maskmovq, "vV8cV8cc*", "")
-BUILTIN(__builtin_ia32_pmovmskb, "iV8c", "")
BUILTIN(__builtin_ia32_movntq, "vV1LLi*V1LLi", "")
-BUILTIN(__builtin_ia32_palignr, "V8cV8cV8cIc", "")
BUILTIN(__builtin_ia32_vec_init_v2si, "V2iii", "")
BUILTIN(__builtin_ia32_vec_init_v4hi, "V4sssss", "")
BUILTIN(__builtin_ia32_vec_init_v8qi, "V8ccccccccc", "")
BUILTIN(__builtin_ia32_vec_ext_v2si, "iV2ii", "")
+// MMX2 (MMX+SSE) intrinsics
+BUILTIN(__builtin_ia32_cvtpi2ps, "V4fV4fV2i", "")
+BUILTIN(__builtin_ia32_cvtps2pi, "V2iV4f", "")
+BUILTIN(__builtin_ia32_cvttps2pi, "V2iV4f", "")
+BUILTIN(__builtin_ia32_pavgb, "V8cV8cV8c", "")
+BUILTIN(__builtin_ia32_pavgw, "V4sV4sV4s", "")
+BUILTIN(__builtin_ia32_pmaxsw, "V4sV4sV4s", "")
+BUILTIN(__builtin_ia32_pmaxub, "V8cV8cV8c", "")
+BUILTIN(__builtin_ia32_pminsw, "V4sV4sV4s", "")
+BUILTIN(__builtin_ia32_pminub, "V8cV8cV8c", "")
+BUILTIN(__builtin_ia32_pmovmskb, "iV8c", "")
+BUILTIN(__builtin_ia32_pmulhuw, "V4sV4sV4s", "")
+BUILTIN(__builtin_ia32_psadbw, "V4sV8cV8c", "")
+BUILTIN(__builtin_ia32_pshufw, "V4sV4sIc", "")
+
+// MMX+SSE2
+BUILTIN(__builtin_ia32_cvtpd2pi, "V2iV2d", "")
+BUILTIN(__builtin_ia32_cvtpi2pd, "V2dV2i", "")
+BUILTIN(__builtin_ia32_cvttpd2pi, "V2iV2d", "")
+BUILTIN(__builtin_ia32_paddq, "V1LLiV1LLiV1LLi", "")
+BUILTIN(__builtin_ia32_pmuludq, "V1LLiV2iV2i", "")
+BUILTIN(__builtin_ia32_psubq, "V1LLiV1LLiV1LLi", "")
+
+// MMX+SSSE3
+BUILTIN(__builtin_ia32_pabsb, "V8cV8c", "")
+BUILTIN(__builtin_ia32_pabsd, "V2iV2i", "")
+BUILTIN(__builtin_ia32_pabsw, "V4sV4s", "")
+BUILTIN(__builtin_ia32_palignr, "V8cV8cV8cIc", "")
+BUILTIN(__builtin_ia32_phaddd, "V2iV2iV2i", "")
+BUILTIN(__builtin_ia32_phaddsw, "V4sV4sV4s", "")
+BUILTIN(__builtin_ia32_phaddw, "V4sV4sV4s", "")
+BUILTIN(__builtin_ia32_phsubd, "V2iV2iV2i", "")
+BUILTIN(__builtin_ia32_phsubsw, "V4sV4sV4s", "")
+BUILTIN(__builtin_ia32_phsubw, "V4sV4sV4s", "")
+BUILTIN(__builtin_ia32_pmaddubsw, "V8cV8cV8c", "")
+BUILTIN(__builtin_ia32_pmulhrsw, "V4sV4sV4s", "")
+BUILTIN(__builtin_ia32_pshufb, "V8cV8cV8c", "")
+BUILTIN(__builtin_ia32_psignw, "V4sV4sV4s", "")
+BUILTIN(__builtin_ia32_psignb, "V8cV8cV8c", "")
+BUILTIN(__builtin_ia32_psignd, "V2iV2iV2i", "")
+
// SSE intrinsics.
BUILTIN(__builtin_ia32_comieq, "iV4fV4f", "")
BUILTIN(__builtin_ia32_comilt, "iV4fV4f", "")
@@ -204,42 +231,24 @@ BUILTIN(__builtin_ia32_haddpd, "V2dV2dV2d", "")
BUILTIN(__builtin_ia32_hsubps, "V4fV4fV4f", "")
BUILTIN(__builtin_ia32_hsubpd, "V2dV2dV2d", "")
BUILTIN(__builtin_ia32_phaddw128, "V8sV8sV8s", "")
-BUILTIN(__builtin_ia32_phaddw, "V4sV4sV4s", "")
BUILTIN(__builtin_ia32_phaddd128, "V4iV4iV4i", "")
-BUILTIN(__builtin_ia32_phaddd, "V2iV2iV2i", "")
BUILTIN(__builtin_ia32_phaddsw128, "V8sV8sV8s", "")
-BUILTIN(__builtin_ia32_phaddsw, "V4sV4sV4s", "")
BUILTIN(__builtin_ia32_phsubw128, "V8sV8sV8s", "")
-BUILTIN(__builtin_ia32_phsubw, "V4sV4sV4s", "")
BUILTIN(__builtin_ia32_phsubd128, "V4iV4iV4i", "")
-BUILTIN(__builtin_ia32_phsubd, "V2iV2iV2i", "")
BUILTIN(__builtin_ia32_phsubsw128, "V8sV8sV8s", "")
-BUILTIN(__builtin_ia32_phsubsw, "V4sV4sV4s", "")
BUILTIN(__builtin_ia32_pmaddubsw128, "V16cV16cV16c", "")
-BUILTIN(__builtin_ia32_pmaddubsw, "V8cV8cV8c", "")
BUILTIN(__builtin_ia32_pmulhrsw128, "V8sV8sV8s", "")
-BUILTIN(__builtin_ia32_pmulhrsw, "V4sV4sV4s", "")
BUILTIN(__builtin_ia32_pshufb128, "V16cV16cV16c", "")
-BUILTIN(__builtin_ia32_pshufb, "V8cV8cV8c", "")
BUILTIN(__builtin_ia32_psignb128, "V16cV16cV16c", "")
-BUILTIN(__builtin_ia32_psignb, "V8cV8cV8c", "")
BUILTIN(__builtin_ia32_psignw128, "V8sV8sV8s", "")
-BUILTIN(__builtin_ia32_psignw, "V4sV4sV4s", "")
BUILTIN(__builtin_ia32_psignd128, "V4iV4iV4i", "")
-BUILTIN(__builtin_ia32_psignd, "V2iV2iV2i", "")
BUILTIN(__builtin_ia32_pabsb128, "V16cV16c", "")
-BUILTIN(__builtin_ia32_pabsb, "V8cV8c", "")
BUILTIN(__builtin_ia32_pabsw128, "V8sV8s", "")
-BUILTIN(__builtin_ia32_pabsw, "V4sV4s", "")
BUILTIN(__builtin_ia32_pabsd128, "V4iV4i", "")
-BUILTIN(__builtin_ia32_pabsd, "V2iV2i", "")
BUILTIN(__builtin_ia32_ldmxcsr, "vUi", "")
BUILTIN(__builtin_ia32_stmxcsr, "Ui", "")
-BUILTIN(__builtin_ia32_cvtpi2ps, "V4fV4fV2i", "")
-BUILTIN(__builtin_ia32_cvtps2pi, "V2iV4f", "")
BUILTIN(__builtin_ia32_cvtss2si, "iV4f", "")
BUILTIN(__builtin_ia32_cvtss2si64, "LLiV4f", "")
-BUILTIN(__builtin_ia32_cvttps2pi, "V2iV4f", "")
BUILTIN(__builtin_ia32_storeups, "vf*V4f", "")
BUILTIN(__builtin_ia32_storehps, "vV2i*V4f", "")
BUILTIN(__builtin_ia32_storelps, "vV2i*V4f", "")
@@ -265,11 +274,8 @@ BUILTIN(__builtin_ia32_sqrtsd, "V2dV2d", "")
BUILTIN(__builtin_ia32_cvtdq2pd, "V2dV4i", "")
BUILTIN(__builtin_ia32_cvtdq2ps, "V4fV4i", "")
BUILTIN(__builtin_ia32_cvtpd2dq, "V2LLiV2d", "")
-BUILTIN(__builtin_ia32_cvtpd2pi, "V2iV2d", "")
BUILTIN(__builtin_ia32_cvtpd2ps, "V4fV2d", "")
BUILTIN(__builtin_ia32_cvttpd2dq, "V4iV2d", "")
-BUILTIN(__builtin_ia32_cvttpd2pi, "V2iV2d", "")
-BUILTIN(__builtin_ia32_cvtpi2pd, "V2dV2i", "")
BUILTIN(__builtin_ia32_cvtsd2si, "iV2d", "")
BUILTIN(__builtin_ia32_cvtsd2si64, "LLiV2d", "")
BUILTIN(__builtin_ia32_cvtps2dq, "V4iV4f", "")
diff --git a/contrib/llvm/tools/clang/include/clang/Basic/DelayedCleanupPool.h b/contrib/llvm/tools/clang/include/clang/Basic/DelayedCleanupPool.h
new file mode 100644
index 0000000..843205f
--- /dev/null
+++ b/contrib/llvm/tools/clang/include/clang/Basic/DelayedCleanupPool.h
@@ -0,0 +1,109 @@
+//=== DelayedCleanupPool.h - Delayed Clean-up Pool Implementation *- C++ -*===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+//
+// This file defines a facility to delay calling cleanup methods until specific
+// points.
+//
+//===----------------------------------------------------------------------===//
+
+#ifndef LLVM_CLANG_BASIC_DELAYEDCLEANUPPOOL_H
+#define LLVM_CLANG_BASIC_DELAYEDCLEANUPPOOL_H
+
+#include "llvm/ADT/DenseMap.h"
+#include "llvm/ADT/SmallVector.h"
+
+namespace clang {
+
+/// \brief Gathers pairs of pointer-to-object/pointer-to-cleanup-function
+/// allowing the cleanup functions to get called (with the pointer as parameter)
+/// at specific points.
+///
+/// The use case is to simplify clean-up of certain resources that, while their
+/// lifetime is well-known and restricted, cleaning them up manually is easy to
+/// miss and cause a leak.
+///
+/// The same pointer can be added multiple times; its clean-up function will
+/// only be called once.
+class DelayedCleanupPool {
+public:
+ typedef void (*CleanupFn)(void *ptr);
+
+ /// \brief Adds a pointer and its associated cleanup function to be called
+ /// at a later point.
+ ///
+ /// \returns false if the pointer is already added, true otherwise.
+ bool delayCleanup(void *ptr, CleanupFn fn) {
+ assert(ptr && "Expected valid pointer to object");
+ assert(fn && "Expected valid pointer to function");
+
+ CleanupFn &mapFn = Ptrs[ptr];
+ assert((!mapFn || mapFn == fn) &&
+ "Adding a pointer with different cleanup function!");
+
+ if (!mapFn) {
+ mapFn = fn;
+ Cleanups.push_back(std::make_pair(ptr, fn));
+ return true;
+ }
+
+ return false;
+ }
+
+ template <typename T>
+ bool delayDelete(T *ptr) {
+ return delayCleanup(ptr, cleanupWithDelete<T>);
+ }
+
+ template <typename T, void (T::*Fn)()>
+ bool delayMemberFunc(T *ptr) {
+ return delayCleanup(ptr, cleanupWithMemberFunc<T, Fn>);
+ }
+
+ void doCleanup() {
+ for (llvm::SmallVector<std::pair<void *, CleanupFn>, 8>::reverse_iterator
+ I = Cleanups.rbegin(), E = Cleanups.rend(); I != E; ++I)
+ I->second(I->first);
+ Cleanups.clear();
+ Ptrs.clear();
+ }
+
+ ~DelayedCleanupPool() {
+ doCleanup();
+ }
+
+private:
+ llvm::DenseMap<void *, CleanupFn> Ptrs;
+ llvm::SmallVector<std::pair<void *, CleanupFn>, 8> Cleanups;
+
+ template <typename T>
+ static void cleanupWithDelete(void *ptr) {
+ delete static_cast<T *>(ptr);
+ }
+
+ template <typename T, void (T::*Fn)()>
+ static void cleanupWithMemberFunc(void *ptr) {
+ (static_cast<T *>(ptr)->*Fn)();
+ }
+};
+
+/// \brief RAII object for triggering a cleanup of a DelayedCleanupPool.
+class DelayedCleanupPoint {
+ DelayedCleanupPool &Pool;
+
+public:
+ DelayedCleanupPoint(DelayedCleanupPool &pool) : Pool(pool) { }
+
+ ~DelayedCleanupPoint() {
+ Pool.doCleanup();
+ }
+};
+
+} // end namespace clang
+
+#endif
diff --git a/contrib/llvm/tools/clang/include/clang/Basic/Diagnostic.h b/contrib/llvm/tools/clang/include/clang/Basic/Diagnostic.h
index fa76324..6f72976 100644
--- a/contrib/llvm/tools/clang/include/clang/Basic/Diagnostic.h
+++ b/contrib/llvm/tools/clang/include/clang/Basic/Diagnostic.h
@@ -251,6 +251,14 @@ private:
bool ErrorOccurred;
bool FatalErrorOccurred;
+ /// \brief Indicates that an unrecoverable error has occurred.
+ bool UnrecoverableErrorOccurred;
+
+ /// \brief Toggles for DiagnosticErrorTrap to check whether an error occurred
+ /// during a parsing section, e.g. during parsing a function.
+ bool TrapErrorOccurred;
+ bool TrapUnrecoverableErrorOccurred;
+
/// LastDiagLevel - This is the level of the last diagnostic emitted. This is
/// used to emit continuation diagnostics with the same level as the
/// diagnostic that they follow.
@@ -269,13 +277,15 @@ private:
/// can use this information to avoid redundancy across arguments.
///
/// This is a hack to avoid a layering violation between libbasic and libsema.
- typedef void (*ArgToStringFnTy)(ArgumentKind Kind, intptr_t Val,
- const char *Modifier, unsigned ModifierLen,
- const char *Argument, unsigned ArgumentLen,
- const ArgumentValue *PrevArgs,
- unsigned NumPrevArgs,
- llvm::SmallVectorImpl<char> &Output,
- void *Cookie);
+ typedef void (*ArgToStringFnTy)(
+ ArgumentKind Kind, intptr_t Val,
+ const char *Modifier, unsigned ModifierLen,
+ const char *Argument, unsigned ArgumentLen,
+ const ArgumentValue *PrevArgs,
+ unsigned NumPrevArgs,
+ llvm::SmallVectorImpl<char> &Output,
+ void *Cookie,
+ llvm::SmallVectorImpl<intptr_t> &QualTypeVals);
void *ArgToStringCookie;
ArgToStringFnTy ArgToStringFn;
@@ -432,7 +442,12 @@ public:
bool hasErrorOccurred() const { return ErrorOccurred; }
bool hasFatalErrorOccurred() const { return FatalErrorOccurred; }
-
+
+ /// \brief Determine whether any kind of unrecoverable error has occurred.
+ bool hasUnrecoverableErrorOccurred() const {
+ return FatalErrorOccurred || UnrecoverableErrorOccurred;
+ }
+
unsigned getNumWarnings() const { return NumWarnings; }
void setNumWarnings(unsigned NumWarnings) {
@@ -452,9 +467,11 @@ public:
const char *Modifier, unsigned ModLen,
const char *Argument, unsigned ArgLen,
const ArgumentValue *PrevArgs, unsigned NumPrevArgs,
- llvm::SmallVectorImpl<char> &Output) const {
+ llvm::SmallVectorImpl<char> &Output,
+ llvm::SmallVectorImpl<intptr_t> &QualTypeVals) const {
ArgToStringFn(Kind, Val, Modifier, ModLen, Argument, ArgLen,
- PrevArgs, NumPrevArgs, Output, ArgToStringCookie);
+ PrevArgs, NumPrevArgs, Output, ArgToStringCookie,
+ QualTypeVals);
}
void SetArgToStringFn(ArgToStringFnTy Fn, void *Cookie) {
@@ -621,20 +638,28 @@ private:
/// queried.
class DiagnosticErrorTrap {
Diagnostic &Diag;
- unsigned PrevErrors;
public:
explicit DiagnosticErrorTrap(Diagnostic &Diag)
- : Diag(Diag), PrevErrors(Diag.NumErrors) {}
+ : Diag(Diag) { reset(); }
/// \brief Determine whether any errors have occurred since this
/// object instance was created.
bool hasErrorOccurred() const {
- return Diag.NumErrors > PrevErrors;
+ return Diag.TrapErrorOccurred;
+ }
+
+ /// \brief Determine whether any unrecoverable errors have occurred since this
+ /// object instance was created.
+ bool hasUnrecoverableErrorOccurred() const {
+ return Diag.TrapUnrecoverableErrorOccurred;
}
// Set to initial state of "no errors occurred".
- void reset() { PrevErrors = Diag.NumErrors; }
+ void reset() {
+ Diag.TrapErrorOccurred = false;
+ Diag.TrapUnrecoverableErrorOccurred = false;
+ }
};
//===----------------------------------------------------------------------===//
diff --git a/contrib/llvm/tools/clang/include/clang/Basic/DiagnosticCategories.h b/contrib/llvm/tools/clang/include/clang/Basic/DiagnosticCategories.h
new file mode 100644
index 0000000..4dd067b
--- /dev/null
+++ b/contrib/llvm/tools/clang/include/clang/Basic/DiagnosticCategories.h
@@ -0,0 +1,26 @@
+//===- DiagnosticCategories.h - Diagnostic Categories Enumerators-*- C++ -*===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+#ifndef LLVM_CLANG_BASIC_DIAGNOSTICCATEGORIES_H
+#define LLVM_CLANG_BASIC_DIAGNOSTICCATEGORIES_H
+
+namespace clang {
+ namespace diag {
+ enum {
+#define GET_CATEGORY_TABLE
+#define CATEGORY(X, ENUM) ENUM,
+#include "clang/Basic/DiagnosticGroups.inc"
+#undef CATEGORY
+#undef GET_CATEGORY_TABLE
+ DiagCat_NUM_CATEGORIES
+ };
+ } // end namespace diag
+} // end namespace clang
+
+#endif
diff --git a/contrib/llvm/tools/clang/include/clang/Basic/DiagnosticCommonKinds.td b/contrib/llvm/tools/clang/include/clang/Basic/DiagnosticCommonKinds.td
index 50110fb..4b5de36 100644
--- a/contrib/llvm/tools/clang/include/clang/Basic/DiagnosticCommonKinds.td
+++ b/contrib/llvm/tools/clang/include/clang/Basic/DiagnosticCommonKinds.td
@@ -32,6 +32,7 @@ def note_type_being_defined : Note<
def note_matching : Note<"to match this '%0'">;
def note_using : Note<"using">;
+def note_possibility : Note<"one possibility">;
def note_also_found : Note<"also found">;
// Parse && Lex
diff --git a/contrib/llvm/tools/clang/include/clang/Basic/DiagnosticDriverKinds.td b/contrib/llvm/tools/clang/include/clang/Basic/DiagnosticDriverKinds.td
index 908a69b..e33b67e 100644
--- a/contrib/llvm/tools/clang/include/clang/Basic/DiagnosticDriverKinds.td
+++ b/contrib/llvm/tools/clang/include/clang/Basic/DiagnosticDriverKinds.td
@@ -82,6 +82,12 @@ def err_drv_conflicting_deployment_targets : Error<
"conflicting deployment targets, both '%0' and '%1' are present in environment">;
def err_drv_invalid_arch_for_deployment_target : Error<
"invalid architecture '%0' for deployment target '%1'">;
+def err_drv_objc_gc_arr : Error<
+ "cannot specify both '-fobjc-arc' and '%0'">;
+def err_arc_nonfragile_abi : Error<
+ "-fobjc-arc is not supported with fragile abi">;
+def err_drv_mg_requires_m_or_mm : Error<
+ "option '-MG' requires '-M' or '-MM'">;
def warn_c_kext : Warning<
"ignoring -fapple-kext which is valid for c++ and objective-c++ only">;
diff --git a/contrib/llvm/tools/clang/include/clang/Basic/DiagnosticFrontendKinds.td b/contrib/llvm/tools/clang/include/clang/Basic/DiagnosticFrontendKinds.td
index 4aa8513..120ba67 100644
--- a/contrib/llvm/tools/clang/include/clang/Basic/DiagnosticFrontendKinds.td
+++ b/contrib/llvm/tools/clang/include/clang/Basic/DiagnosticFrontendKinds.td
@@ -137,6 +137,9 @@ def warn_pch_nonfragile_abi2 : Error<
"PCH file was compiled with the %select{32-bit|enhanced non-fragile}0 "
"Objective-C ABI but the %select{32-bit|enhanced non-fragile}1 "
"Objective-C ABI is selected">;
+def warn_pch_auto_ref_count : Error<
+ "PCH file was compiled %select{without|with} automated reference counting,"
+ "which is currently %select{disabled|enabled}">;
def warn_pch_apple_kext : Error<
"PCH file was compiled %select{with|without}0 support for Apple's kernel "
"extensions ABI but it is currently %select{disabled|enabled}1">;
diff --git a/contrib/llvm/tools/clang/include/clang/Basic/DiagnosticGroups.td b/contrib/llvm/tools/clang/include/clang/Basic/DiagnosticGroups.td
index 9abd6d3..8a10914 100644
--- a/contrib/llvm/tools/clang/include/clang/Basic/DiagnosticGroups.td
+++ b/contrib/llvm/tools/clang/include/clang/Basic/DiagnosticGroups.td
@@ -62,6 +62,7 @@ def ExitTimeDestructors : DiagGroup<"exit-time-destructors">;
def FourByteMultiChar : DiagGroup<"four-char-constants">;
def GlobalConstructors : DiagGroup<"global-constructors">;
def : DiagGroup<"idiomatic-parentheses">;
+def BitwiseOpParentheses: DiagGroup<"bitwise-op-parentheses">;
def LogicalOpParentheses: DiagGroup<"logical-op-parentheses">;
def IgnoredQualifiers : DiagGroup<"ignored-qualifiers">;
def : DiagGroup<"import">;
@@ -115,6 +116,7 @@ def SignCompare : DiagGroup<"sign-compare">;
def : DiagGroup<"stack-protector">;
def : DiagGroup<"switch-default">;
def : DiagGroup<"synth">;
+def SizeofArrayArgument : DiagGroup<"sizeof-array-argument">;
def TautologicalCompare : DiagGroup<"tautological-compare">;
def HeaderHygiene : DiagGroup<"header-hygiene">;
@@ -168,6 +170,15 @@ def ImplicitAtomic : DiagGroup<"implicit-atomic-properties">;
def CustomAtomic : DiagGroup<"custom-atomic-properties">;
def AtomicProperties : DiagGroup<"atomic-properties",
[ImplicitAtomic, CustomAtomic]>;
+def AutomaticReferenceCountingABI : DiagGroup<"arc-abi">;
+def ARCUnsafeRetainedAssign : DiagGroup<"arc-unsafe-retained-assign">;
+def ARCRetainCycles : DiagGroup<"arc-retain-cycles">;
+def ARCNonPodMemAccess : DiagGroup<"arc-non-pod-memaccess">;
+def AutomaticReferenceCounting : DiagGroup<"arc",
+ [AutomaticReferenceCountingABI,
+ ARCUnsafeRetainedAssign,
+ ARCRetainCycles,
+ ARCNonPodMemAccess]>;
def Selector : DiagGroup<"selector">;
def NonfragileAbi2 : DiagGroup<"nonfragile-abi2">;
def Protocol : DiagGroup<"protocol">;
@@ -192,7 +203,8 @@ def DuplicateArgDecl : DiagGroup<"duplicate-method-arg">;
// in -Wparentheses because most users who use -Wparentheses explicitly
// do not want these warnings.
def Parentheses : DiagGroup<"parentheses",
- [LogicalOpParentheses]>;
+ [LogicalOpParentheses,
+ BitwiseOpParentheses]>;
// -Wconversion has its own warnings, but we split a few out for
// legacy reasons:
@@ -217,12 +229,12 @@ def Unused : DiagGroup<"unused",
// Format settings.
def FormatSecurity : DiagGroup<"format-security">;
+def FormatY2K : DiagGroup<"format-y2k">;
def Format : DiagGroup<"format",
[FormatExtraArgs, FormatZeroLength, NonNull,
- FormatSecurity]>,
+ FormatSecurity, FormatY2K]>,
DiagCategory<"Format String Issue">;
def FormatNonLiteral : DiagGroup<"format-nonliteral", [FormatSecurity]>;
-def FormatY2K : DiagGroup<"format-y2k", [Format]>;
def Format2 : DiagGroup<"format=2",
[FormatNonLiteral, FormatSecurity, FormatY2K]>;
@@ -248,6 +260,7 @@ def Most : DiagGroup<"most", [
ReturnType,
SelfAssignment,
Switch,
+ SizeofArrayArgument,
Trigraphs,
Uninitialized,
UnknownPragmas,
@@ -283,3 +296,6 @@ def GNU : DiagGroup<"gnu", [GNUDesignator, VLA]>;
// A warning group for warnings about Microsoft extensions.
def Microsoft : DiagGroup<"microsoft">;
+
+def ObjCNonUnifiedException : DiagGroup<"objc-nonunified-exceptions">;
+
diff --git a/contrib/llvm/tools/clang/include/clang/Basic/DiagnosticIDs.h b/contrib/llvm/tools/clang/include/clang/Basic/DiagnosticIDs.h
index fa816de..ae4ed5b 100644
--- a/contrib/llvm/tools/clang/include/clang/Basic/DiagnosticIDs.h
+++ b/contrib/llvm/tools/clang/include/clang/Basic/DiagnosticIDs.h
@@ -227,6 +227,10 @@ private:
/// suppressed.
bool ProcessDiag(Diagnostic &Diag) const;
+ /// \brief Whether the diagnostic may leave the AST in a state where some
+ /// invariants can break.
+ bool isUnrecoverable(unsigned DiagID) const;
+
friend class Diagnostic;
};
diff --git a/contrib/llvm/tools/clang/include/clang/Basic/DiagnosticLexKinds.td b/contrib/llvm/tools/clang/include/clang/Basic/DiagnosticLexKinds.td
index 3514cca..38d6a80 100644
--- a/contrib/llvm/tools/clang/include/clang/Basic/DiagnosticLexKinds.td
+++ b/contrib/llvm/tools/clang/include/clang/Basic/DiagnosticLexKinds.td
@@ -178,7 +178,7 @@ def ext_empty_fnmacro_arg : Extension<
def err_pp_invalid_directive : Error<"invalid preprocessing directive">;
def err_pp_hash_error : Error<"#error%0">;
-def err_pp_file_not_found : Error<"'%0' file not found">, DefaultFatal;
+def warn_pp_file_not_found : Warning<"'%0' file not found">, DefaultFatal;
def err_pp_error_opening_file : Error<
"error opening file '%0': %1">, DefaultFatal;
def err_pp_empty_filename : Error<"empty filename">;
diff --git a/contrib/llvm/tools/clang/include/clang/Basic/DiagnosticParseKinds.td b/contrib/llvm/tools/clang/include/clang/Basic/DiagnosticParseKinds.td
index fb1c909..3764a40 100644
--- a/contrib/llvm/tools/clang/include/clang/Basic/DiagnosticParseKinds.td
+++ b/contrib/llvm/tools/clang/include/clang/Basic/DiagnosticParseKinds.td
@@ -263,6 +263,11 @@ def warn_objc_protocol_qualifier_missing_id : Warning<
def err_objc_unknown_at : Error<"expected an Objective-C directive after '@'">;
def err_illegal_super_cast : Error<
"cannot cast 'super' (it isn't an expression)">;
+
+let CategoryName = "Automatic Reference Counting Issue" in {
+def err_arc_bridge_retain : Error<
+ "unknown cast annotation __bridge_retain; did you mean __bridge_retained?">;
+}
def err_objc_illegal_visibility_spec : Error<
"illegal visibility specification">;
diff --git a/contrib/llvm/tools/clang/include/clang/Basic/DiagnosticSemaKinds.td b/contrib/llvm/tools/clang/include/clang/Basic/DiagnosticSemaKinds.td
index 5cfa61b..97414f2 100644
--- a/contrib/llvm/tools/clang/include/clang/Basic/DiagnosticSemaKinds.td
+++ b/contrib/llvm/tools/clang/include/clang/Basic/DiagnosticSemaKinds.td
@@ -48,6 +48,8 @@ def err_vla_decl_has_static_storage : Error<
"variable length array declaration can not have 'static' storage duration">;
def err_vla_decl_has_extern_linkage : Error<
"variable length array declaration can not have 'extern' linkage">;
+def ext_vla_folded_to_constant : Extension<
+ "variable length array folded to constant array as an extension">;
// C99 variably modified types
def err_variably_modified_template_arg : Error<
@@ -267,6 +269,15 @@ def warn_dyn_class_memaccess : Warning<
InGroup<DiagGroup<"dynamic-class-memaccess">>;
def note_bad_memaccess_silence : Note<
"explicitly cast the pointer to silence this warning">;
+def warn_sizeof_pointer_expr_memaccess : Warning<
+ "argument to 'sizeof' in %0 call is the same expression as the "
+ "%select{destination|source}1; did you mean to "
+ "%select{dereference it|remove the addressof|provide an explicit length}2?">,
+ InGroup<DiagGroup<"sizeof-pointer-memaccess">>;
+def warn_sizeof_pointer_type_memaccess : Warning<
+ "argument to 'sizeof' in %0 call is the same pointer type %1 as the "
+ "%select{destination|source}2; expected %3 or an explicit length">,
+ InGroup<DiagGroup<"sizeof-pointer-memaccess">>;
/// main()
// static/inline main() are not errors in C, just in C++.
@@ -319,6 +330,8 @@ def err_duplicate_class_def : Error<
"duplicate interface definition for class %0">;
def err_undef_superclass : Error<
"cannot find interface declaration for %0, superclass of %1">;
+def err_forward_superclass : Error<
+ "attempting to use the forward class %0 as superclass of %1">;
def err_no_nsconstant_string_class : Error<
"cannot find interface declaration for %0">;
def err_recursive_superclass : Error<
@@ -344,6 +357,8 @@ def err_class_extension_after_impl : Error<
"cannot declare class extension for %0 after class implementation">;
def note_implementation_declared : Note<
"class implementation is declared here">;
+def note_class_declared : Note<
+ "class is declared here">;
def warn_dup_category_def : Warning<
"duplicate definition of category %1 on interface %0">;
def err_conflicting_super_class : Error<"conflicting super class name %0">;
@@ -425,6 +440,15 @@ def warn_objc_property_copy_missing_on_block : Warning<
def warn_atomic_property_rule : Warning<
"writable atomic property %0 cannot pair a synthesized setter/getter "
"with a user defined setter/getter">;
+def warn_ownin_getter_rule : Warning<
+ "property's synthesized getter follows Cocoa naming"
+ " convention for returning 'owned' objects">;
+def warn_property_getter_owning_mismatch : Warning<
+ "property declared as returning non-retained objects"
+ "; getter returning retained objects">;
+def err_ownin_getter_rule : Error<
+ "property's synthesized getter follows Cocoa naming"
+ " convention for returning 'owned' objects">;
def warn_default_atomic_custom_getter_setter : Warning<
"atomic by default property %0 has a user defined %select{getter|setter}1 "
"(property should be marked 'atomic' if this is intended)">,
@@ -460,6 +484,12 @@ def error_bad_property_context : Error<
def error_missing_property_ivar_decl : Error<
"synthesized property %0 must either be named the same as a compatible"
" ivar or must explicitly name an ivar">;
+def error_synthesize_weak_non_arc_or_gc : Error<
+ "@synthesize of 'weak' property is only allowed in ARC or GC mode">;
+def err_arc_perform_selector_retains : Error<
+ "performSelector names a selector which retains the object">;
+def warn_arc_perform_selector_leaks : Warning<
+ "performSelector may cause a leak because its selector is unknown">;
def error_synthesized_ivar_yet_not_supported : Error<
"instance variable synthesis not yet supported"
@@ -472,7 +502,7 @@ def error_ivar_in_superclass_use : Error<
def error_weak_property : Error<
"existing ivar %1 for __weak property %0 must be __weak">;
def error_strong_property : Error<
- "property %0 must be declared __weak to match existing ivar %1 with __weak attribute">;
+ "existing ivar %1 for strong property %0 may not be __weak">;
def error_dynamic_property_ivar_decl : Error<
"dynamic property can not have ivar specification">;
def error_duplicate_ivar_use : Error<
@@ -729,8 +759,6 @@ def err_not_integral_type_bitfield : Error<
"bit-field %0 has non-integral type %1">;
def err_not_integral_type_anon_bitfield : Error<
"anonymous bit-field has non-integral type %0">;
-def err_member_initialization : Error<
- "fields can only be initialized in constructors">;
def err_member_function_initialization : Error<
"initializer on function does not look like a pure-specifier">;
def err_non_virtual_pure : Error<
@@ -1135,6 +1163,8 @@ def err_format_attribute_implicit_this_format_string : Error<
"format attribute cannot specify the implicit this argument as the format "
"string">;
def warn_unknown_method_family : Warning<"unrecognized method family">;
+def err_init_method_bad_return_type : Error<
+ "init methods must return an object pointer type, not %0">;
def err_attribute_invalid_size : Error<
"vector size not an integral multiple of component size">;
def err_attribute_zero_size : Error<"zero vector size">;
@@ -1160,6 +1190,10 @@ def err_as_qualified_auto_decl : Error<
"automatic variable qualified with an address space">;
def err_arg_with_address_space : Error<
"parameter may not be qualified with an address space">;
+def err_attr_objc_ownership_bad_type : Error<
+ "the type %0 cannot be retained">;
+def err_attr_objc_ownership_redundant : Error<
+ "the type %0 already has retainment attributes set on it">;
def err_attribute_not_string : Error<
"argument to %0 attribute was not a string literal">;
def err_attribute_section_invalid_for_target : Error<
@@ -1215,6 +1249,8 @@ def warn_function_attribute_wrong_type : Warning<
"'%0' only applies to function types; type here is %1">;
def warn_pointer_attribute_wrong_type : Warning<
"'%0' only applies to pointer types; type here is %1">;
+def warn_objc_object_attribute_wrong_type : Warning<
+ "'%0' only applies to objective-c object or block pointer types; type here is %1">;
def warn_gnu_inline_attribute_requires_inline : Warning<
"'gnu_inline' attribute requires function to be marked 'inline',"
" attribute ignored">;
@@ -1232,6 +1268,13 @@ def err_cconv_varargs : Error<
def err_regparm_mismatch : Error<"function declared with with regparm(%0) "
"attribute was previously declared "
"%plural{0:without the regparm|:with the regparm(%1)}1 attribute">;
+def err_objc_precise_lifetime_bad_type : Error<
+ "objc_precise_lifetime only applies to retainable types; type here is %0">;
+def warn_objc_precise_lifetime_meaningless : Error<
+ "objc_precise_lifetime is not meaningful for "
+ "%select{__unsafe_unretained|__autoreleasing}0 objects">;
+def warn_label_attribute_not_unused : Warning<
+ "The only valid attribute for labels is 'unused'">;
def err_invalid_pcs : Error<"Invalid PCS type">;
// Availability attribute
@@ -1505,7 +1548,13 @@ def note_ovl_candidate_arity : Note<"candidate "
def note_ovl_candidate_deleted : Note<
"candidate %select{function|function|constructor|"
- "function |function |constructor ||||constructor (inherited)}0%1 "
+ "function |function |constructor |"
+ "constructor (the implicit default constructor)|"
+ "constructor (the implicit copy constructor)|"
+ "constructor (the implicit move constructor)|"
+ "function (the implicit copy assignment operator)|"
+ "function (the implicit move assignment operator)|"
+ "constructor (inherited)}0%1 "
"has been explicitly %select{made unavailable|deleted}2">;
// Giving the index of the bad argument really clutters this message, and
@@ -1565,7 +1614,18 @@ def note_ovl_candidate_bad_gc : Note<"candidate "
"function (the implicit move assignment operator)|"
"constructor (inherited)}0%1 not viable: "
"%select{%ordinal6|'this'}5 argument (%2) has %select{no|__weak|__strong}3 "
- "lifetime, but parameter has %select{no|__weak|__strong}4 lifetime">;
+ "ownership, but parameter has %select{no|__weak|__strong}4 ownership">;
+def note_ovl_candidate_bad_ownership : Note<"candidate "
+ "%select{function|function|constructor|"
+ "function |function |constructor |"
+ "constructor (the implicit default constructor)|"
+ "constructor (the implicit copy constructor)|"
+ "function (the implicit copy assignment operator)|"
+ "constructor (inherited)}0%1 not viable: "
+ "%select{%ordinal6|'this'}5 argument (%2) has "
+ "%select{no|__unsafe_unretained|__strong|__weak|__autoreleasing}3 ownership,"
+ " but parameter has %select{no|__unsafe_unretained|__strong|__weak|"
+ "__autoreleasing}4 ownership">;
def note_ovl_candidate_bad_cvr_this : Note<"candidate "
"%select{|function|||function||||"
"function (the implicit copy assignment operator)|}0 not viable: "
@@ -1871,8 +1931,11 @@ def err_not_class_template_specialization : Error<
"parameter}0">;
def err_function_specialization_in_class : Error<
"cannot specialize a function %0 within class scope">;
-def err_explicit_specialization_storage_class : Error<
+def ext_explicit_specialization_storage_class : ExtWarn<
"explicit specialization cannot have a storage class">;
+def err_explicit_specialization_inconsistent_storage_class : Error<
+ "explicit specialization has extraneous, inconsistent storage class "
+ "'%select{none|extern|static|__private_extern__|auto|register}0'">;
// C++ class template specializations and out-of-line definitions
def err_template_spec_needs_header : Error<
@@ -2180,7 +2243,7 @@ def err_undeclared_var_use : Error<"use of undeclared identifier %0">;
def note_dependent_var_use : Note<"must qualify identifier to find this "
"declaration in dependent base class">;
def err_not_found_by_two_phase_lookup : Error<"call to function %0 that is neither "
- "visible in the template definition nor found by argument dependent lookup">;
+ "visible in the template definition nor found by argument-dependent lookup">;
def note_not_found_by_two_phase_lookup : Note<"%0 should be declared prior to the "
"call site%select{| or in %2| or in an associated namespace of one of its arguments}1">;
def err_undeclared_use : Error<"use of undeclared %0">;
@@ -2199,8 +2262,8 @@ def err_unavailable_message : Error<"%0 is unavailable: %1">;
def warn_unavailable_fwdclass_message : Warning<
"%0 maybe unavailable because receiver type is unknown">;
def note_unavailable_here : Note<
- "function has been explicitly marked "
- "%select{unavailable|deleted|deprecated}0 here">;
+ "%select{declaration|function}0 has been explicitly marked "
+ "%select{unavailable|deleted|deprecated}1 here">;
def warn_not_enough_argument : Warning<
"not enough variable arguments in %0 declaration to fit a sentinel">;
def warn_missing_sentinel : Warning <
@@ -2237,6 +2300,8 @@ def err_inline_declaration_block_scope : Error<
"inline declaration of %0 not allowed in block scope">;
def err_static_non_static : Error<
"static declaration of %0 follows non-static declaration">;
+def warn_weak_import : Warning <
+ "an already-declared variable is made a weak_import declaration %0">;
def warn_static_non_static : ExtWarn<
"static declaration of %0 follows non-static declaration">;
def err_non_static_static : Error<
@@ -2418,6 +2483,8 @@ def err_indirect_goto_in_protected_scope : Error<
def note_indirect_goto_target : Note<"possible target of indirect goto">;
def note_protected_by_variable_init : Note<
"jump bypasses variable initialization">;
+def note_protected_by_variable_nontriv_destructor : Note<
+ "jump bypasses variable with a non-trivial destructor">;
def note_protected_by_cleanup : Note<
"jump bypasses initialization of variable with __attribute__((cleanup))">;
def note_protected_by_vla_typedef : Note<
@@ -2434,12 +2501,22 @@ def note_protected_by_objc_finally : Note<
"jump bypasses initialization of @finally block">;
def note_protected_by_objc_synchronized : Note<
"jump bypasses initialization of @synchronized block">;
+def note_protected_by_objc_autoreleasepool : Note<
+ "jump bypasses auto release push of @autoreleasepool block">;
def note_protected_by_cxx_try : Note<
"jump bypasses initialization of try block">;
def note_protected_by_cxx_catch : Note<
"jump bypasses initialization of catch block">;
def note_protected_by___block : Note<
"jump bypasses setup of __block variable">;
+def note_protected_by_objc_ownership : Note<
+ "jump bypasses initialization of retaining variable">;
+def note_enters_block_captures_cxx_obj : Note<
+ "jump enters lifetime of block which captures a destructible c++ object">;
+def note_enters_block_captures_strong : Note<
+ "jump enters lifetime of block which strongly captures a variable">;
+def note_enters_block_captures_weak : Note<
+ "jump enters lifetime of block which weakly captures a variable">;
def note_exits_cleanup : Note<
"jump exits scope of variable with __attribute__((cleanup))">;
@@ -2459,6 +2536,16 @@ def note_exits_cxx_try : Note<
"jump exits try block">;
def note_exits_cxx_catch : Note<
"jump exits catch block">;
+def note_exits_objc_autoreleasepool : Note<
+ "jump exits autoreleasepool block">;
+def note_exits_objc_ownership : Note<
+ "jump exits scope of retaining variable">;
+def note_exits_block_captures_cxx_obj : Note<
+ "jump exits lifetime of block which captures a destructible c++ object">;
+def note_exits_block_captures_strong : Note<
+ "jump exits lifetime of block which strongly captures a variable">;
+def note_exits_block_captures_weak : Note<
+ "jump exits lifetime of block which weakly captures a variable">;
def err_func_returning_array_function : Error<
"function cannot return %select{array|function}0 type %1">;
@@ -2490,6 +2577,152 @@ def ext_flexible_array_empty_aggregate_gnu : Extension<
def ext_flexible_array_union_gnu : Extension<
"flexible array member %0 in a union is a GNU extension">, InGroup<GNU>;
+let CategoryName = "Automatic Reference Counting Issue" in {
+
+// ARC-mode diagnostics.
+def err_arc_weak_no_runtime : Error<
+ "the current deployment target does not support automated __weak references">;
+def err_arc_unsupported_weak_class : Error<
+ "class is incompatible with __weak references">;
+def err_arc_weak_unavailable_assign : Error<
+ "assignment of a weak-unavailable object to a __weak object">;
+def err_arc_convesion_of_weak_unavailable : Error<
+ "%select{implicit conversion|cast}0 of weak-unavailable object of type %1 to"
+ " a __weak object of type %2">;
+def err_arc_illegal_explicit_message : Error<
+ "ARC forbids explicit message send of %0">;
+def err_arc_unused_init_message : Error<
+ "the result of a delegate init call must be immediately returned "
+ "or assigned to 'self'">;
+def err_arc_mismatched_cast : Error<
+ "%select{implicit conversion|cast}0 of "
+ "%select{%2|a non-Objective-C pointer type %2|a block pointer|"
+ "an Objective-C pointer|an indirect pointer to an Objective-C pointer}1"
+ " to %3 is disallowed with ARC">;
+def err_arc_objc_object_in_struct : Error<
+ "ARC forbids Objective-C objects in structs or unions">;
+def err_arc_objc_property_default_assign_on_object : Error<
+ "ARC forbids synthesizing a property of an Objective-C object "
+ "with unspecified storage attribute">;
+def err_arc_illegal_selector : Error<
+ "ARC forbids use of %0 in a @selector">;
+def err_arc_illegal_method_def : Error<
+ "ARC forbids implementation of %0">;
+def err_arc_lost_method_convention : Error<
+ "method was declared as %select{an 'alloc'|a 'copy'|an 'init'|a 'new'}0 "
+ "method, but its implementation doesn't match because %select{"
+ "its result type is not an object pointer|"
+ "its result type is unrelated to its receiver type}1">;
+def note_arc_lost_method_convention : Note<"declaration in interface">;
+def err_arc_gained_method_convention : Error<
+ "method implementation does not match its declaration">;
+def note_arc_gained_method_convention : Note<
+ "declaration in interface is not in the '%select{alloc|copy|init|new}0' "
+ "family because %select{its result type is not an object pointer|"
+ "its result type is unrelated to its receiver type}1">;
+def err_typecheck_arr_assign_self : Error<
+ "cannot assign to 'self' outside of a method in the init family">;
+def err_typecheck_arr_assign_enumeration : Error<
+ "fast enumeration variables can't be modified in ARC by default; "
+ "declare the variable __strong to allow this">;
+def warn_arc_non_pod_class_with_object_member : Warning<
+ "%0 cannot be shared between ARC and non-ARC "
+ "code; add a copy constructor, a copy assignment operator, and a destructor "
+ "to make it ABI-compatible">, InGroup<AutomaticReferenceCountingABI>,
+ DefaultIgnore;
+def warn_arc_retained_assign : Warning<
+ "assigning retained object to %select{weak|unsafe_unretained}0 variable"
+ "; object will be released after assignment">,
+ InGroup<ARCUnsafeRetainedAssign>;
+def warn_arc_retained_property_assign : Warning<
+ "assigning retained object to unsafe property"
+ "; object will be released after assignment">,
+ InGroup<ARCUnsafeRetainedAssign>;
+def warn_arc_trivial_member_function_with_object_member : Warning<
+ "%0 cannot be shared between ARC and non-ARC "
+ "code; add a non-trivial %select{copy constructor|copy assignment operator|"
+ "destructor}1 to make it ABI-compatible">,
+ InGroup<AutomaticReferenceCountingABI>, DefaultIgnore;
+def err_arc_new_array_without_ownership : Error<
+ "'new' cannot allocate an array of %0 with no explicit ownership">;
+def warn_err_new_delete_object_array : Warning<
+ "%select{allocating|destroying}0 an array of %1; this array must not "
+ "%select{be deleted in|have been allocated from}0 non-ARC code">,
+ InGroup<AutomaticReferenceCountingABI>, DefaultIgnore;
+def err_arc_autoreleasing_var : Error<
+ "%select{__block variables|global variables|fields|ivars}0 cannot have "
+ "__autoreleasing ownership">;
+def err_arc_thread_ownership : Error<
+ "thread-local variable has non-trivial ownership: type is %0">;
+def err_arc_indirect_no_ownership : Error<
+ "%select{pointer|reference}1 to non-const type %0 with no explicit ownership">,
+ InGroup<AutomaticReferenceCounting>;
+def err_arc_array_param_no_ownership : Error<
+ "must explicitly describe intended ownership of an object array parameter">;
+def err_arc_pseudo_dtor_inconstant_quals : Error<
+ "pseudo-destructor destroys object of type %0 with inconsistently-qualified "
+ "type %1">;
+def err_arc_init_method_unrelated_result_type : Error<
+ "init methods must return a type related to the receiver type">;
+def err_arc_nonlocal_writeback : Error<
+ "passing address of %select{non-local|non-scalar}0 object to "
+ "__autoreleasing parameter for write-back">;
+def err_arc_method_not_found : Error<
+ "no known %select{instance|class}1 method for selector %0">;
+def err_arc_receiver_forward_class : Error<
+ "receiver %0 for class message is a forward declaration">;
+def err_arc_may_not_respond : Error<
+ "receiver type %0 for instance message does not declare a method with "
+ "selector %1">;
+def err_arc_receiver_forward_instance : Error<
+ "receiver type %0 for instance message is a forward declaration">;
+def err_arc_multiple_method_decl : Error<
+ "multiple methods named %0 found with mismatched result, "
+ "parameter type or attributes">;
+def warn_arc_retain_cycle : Warning<
+ "capturing %0 strongly in this block is likely to lead to a retain cycle">,
+ InGroup<ARCRetainCycles>;
+def note_arc_retain_cycle_owner : Note<
+ "block will be retained by %select{the captured object|an object strongly "
+ "retained by the captured object}0">;
+def note_nontrivial_objc_ownership : Note<
+ "because type %0 has %select{no|no|__strong|__weak|__autoreleasing}1 "
+ "ownership">;
+def warn_arc_object_memaccess : Warning<
+ "%select{destination for|source of}0 this %1 call is a pointer to "
+ "ownership-qualified type %2">, InGroup<ARCNonPodMemAccess>;
+
+def err_arc_strong_property_ownership : Error<
+ "existing ivar %1 for strong property %0 may not be "
+ "%select{|__unsafe_unretained||__weak}2">;
+def err_arc_assign_property_ownership : Error<
+ "existing ivar %1 for unsafe_unretained property %0 must be __unsafe_unretained">;
+def err_arc_inconsistent_property_ownership : Error<
+ "%select{strong|weak|unsafe_unretained}1 property %0 may not also be "
+ "declared %select{|__unsafe_unretained|__strong|__weak|__autoreleasing}2">;
+def err_arc_atomic_ownership : Error<
+ "cannot perform atomic operation on a pointer to type %0: type has "
+ "non-trivial ownership">;
+
+def err_arc_bridge_cast_incompatible : Error<
+ "incompatible types casting %0 to %1 with a %select{__bridge|"
+ "__bridge_transfer|__bridge_retained}2 cast">;
+def err_arc_bridge_cast_wrong_kind : Error<
+ "cast of %select{Objective-C|block|C}0 pointer type %1 to "
+ "%select{Objective-C|block|C}2 pointer type %3 cannot use %select{__bridge|"
+ "__bridge_transfer|__bridge_retained}4">;
+def err_arc_cast_requires_bridge : Error<
+ "cast of %select{Objective-C|block|C}0 pointer type %1 to "
+ "%select{Objective-C|block|C}2 pointer type %3 requires a bridged cast">;
+def note_arc_bridge : Note<
+ "use __bridge to convert directly (no change in ownership)">;
+def note_arc_bridge_transfer : Note<
+ "use __bridge_transfer to transfer ownership of a +1 %0 into ARC">;
+def note_arc_bridge_retained : Note<
+ "use __bridge_retained to make an ARC object available as a +1 %0">;
+
+} // ARC category name
+
def err_flexible_array_init_needs_braces : Error<
"flexible array requires brace-enclosed initializer">;
def err_illegal_decl_array_of_functions : Error<
@@ -2563,11 +2796,11 @@ def warn_remainder_by_zero : Warning<"remainder by zero is undefined">;
def warn_shift_negative : Warning<"shift count is negative">;
def warn_shift_gt_typewidth : Warning<"shift count >= width of type">;
def warn_shift_result_gt_typewidth : Warning<
- "shift result (%0) requires %1 bits to represent, but %2 only has %3 bits">,
- InGroup<DiagGroup<"shift-overflow">>;
-def warn_shift_result_overrides_sign_bit : Warning<
- "shift result (%0) overrides the sign bit of the shift expression's type "
- "(%1) and becomes negative">,
+ "signed shift result (%0) requires %1 bits to represent, but %2 only has "
+ "%3 bits">, InGroup<DiagGroup<"shift-overflow">>;
+def warn_shift_result_sets_sign_bit : Warning<
+ "signed shift result (%0) sets the sign bit of the shift expression's "
+ "type (%1) and becomes negative">,
InGroup<DiagGroup<"shift-sign-overflow">>, DefaultIgnore;
def warn_precedence_bitwise_rel : Warning<
@@ -2579,17 +2812,22 @@ def note_precedence_bitwise_silence : Note<
"place parentheses around the %0 expression to silence this warning">;
def warn_precedence_conditional : Warning<
- "?: has lower precedence than %0; %0 will be evaluated first">,
+ "operator '?:' has lower precedence than '%0'; '%0' will be evaluated first">,
InGroup<Parentheses>;
def note_precedence_conditional_first : Note<
- "place parentheses around the ?: expression to evaluate it first">;
+ "place parentheses around the '?:' expression to evaluate it first">;
def note_precedence_conditional_silence : Note<
- "place parentheses around the %0 expression to silence this warning">;
+ "place parentheses around the '%0' expression to silence this warning">;
def warn_logical_instead_of_bitwise : Warning<
"use of logical %0 with constant operand; switch to bitwise %1 or "
"remove constant">, InGroup<DiagGroup<"constant-logical-operand">>;
+def warn_bitwise_and_in_bitwise_or : Warning<
+ "'&' within '|'">, InGroup<BitwiseOpParentheses>;
+def note_bitwise_and_in_bitwise_or_silence : Note<
+ "place parentheses around the '&' expression to silence this warning">;
+
def warn_logical_and_in_logical_or : Warning<
"'&&' within '||'">, InGroup<LogicalOpParentheses>;
def note_logical_and_in_logical_or_silence : Note<
@@ -2599,6 +2837,10 @@ def warn_self_assignment : Warning<
"explicitly assigning a variable of type %0 to itself">,
InGroup<SelfAssignment>, DefaultIgnore;
+def warn_sizeof_array_param : Warning<
+ "sizeof on array function parameter will return size of %0 instead of %1">,
+ InGroup<SizeofArrayArgument>;
+
def err_sizeof_nonfragile_interface : Error<
"invalid application of '%select{alignof|sizeof}1' to interface %0 in "
"non-fragile ABI">;
@@ -2623,10 +2865,15 @@ def err_subscript_function_type : Error<
"subscript of pointer to function type %0">;
def err_subscript_incomplete_type : Error<
"subscript of pointer to incomplete type %0">;
+def ext_gnu_subscript_void_type : Extension<
+ "subscript of a pointer to void is a GNU extension">, InGroup<PointerArith>;
def err_typecheck_member_reference_struct_union : Error<
"member reference base type %0 is not a structure or union">;
def err_typecheck_member_reference_ivar : Error<
"%0 does not have a member named %1">;
+def error_arc_weak_ivar_access : Error<
+ "dereferencing a __weak pointer is not allowed due to possible "
+ "null value caused by race condition, assign it to strong variable first">;
def err_typecheck_member_reference_arrow : Error<
"member reference type %0 is not a pointer">;
def err_typecheck_member_reference_suggestion : Error<
@@ -2658,7 +2905,7 @@ def err_member_def_undefined_record : Error<
def err_member_def_does_not_match : Error<
"out-of-line definition of %0 does not match any declaration in %1">;
def err_member_def_does_not_match_ret_type : Error<
- "out-of-line definition of %q0 differ from the declaration in the return type">;
+ "out-of-line definition of %q0 differs from the declaration in the return type">;
def err_nonstatic_member_out_of_line : Error<
"non-static data member defined out-of-line">;
def err_nonstatic_flexible_variable : Error<
@@ -2682,11 +2929,12 @@ def err_ivar_reference_type : Error<
def err_typecheck_illegal_increment_decrement : Error<
"cannot %select{decrement|increment}1 value of type %0">;
def err_typecheck_arithmetic_incomplete_type : Error<
- "arithmetic on pointer to incomplete type %0">;
+ "arithmetic on a pointer to an incomplete type %0">;
def err_typecheck_pointer_arith_function_type : Error<
- "arithmetic on pointer to function type %0">;
+ "arithmetic on%select{ a|}0 pointer%select{|s}0 to%select{ the|}2 "
+ "function type%select{|s}2 %1%select{| and %3}2">;
def err_typecheck_pointer_arith_void_type : Error<
- "arithmetic on pointer to void type">;
+ "arithmetic on%select{ a|}0 pointer%select{|s}0 to void">;
def err_typecheck_decl_incomplete_type : Error<
"variable has incomplete type %0">;
def ext_typecheck_decl_incomplete_type : ExtWarn<
@@ -2803,6 +3051,9 @@ def warn_runsigned_always_true_comparison : Warning<
def warn_comparison_of_mixed_enum_types : Warning<
"comparison of two values with different enumeration types (%0 and %1)">,
InGroup<DiagGroup<"enum-compare">>;
+def warn_null_in_arithmetic_operation : Warning<
+ "use of NULL in arithmetic operation">,
+ InGroup<DiagGroup<"null-arithmetic">>;
def err_invalid_this_use : Error<
"invalid use of 'this' outside of a nonstatic member function">;
@@ -2871,9 +3122,11 @@ def note_forward_class : Note<
def err_duplicate_property : Error<
"property has a previous declaration">;
def ext_gnu_void_ptr : Extension<
- "use of GNU void* extension">, InGroup<PointerArith>;
+ "arithmetic on%select{ a|}0 pointer%select{|s}0 to void is a GNU extension">,
+ InGroup<PointerArith>;
def ext_gnu_ptr_func_arith : Extension<
- "arithmetic on pointer to function type %0 is a GNU extension">,
+ "arithmetic on%select{ a|}0 pointer%select{|s}0 to%select{ the|}2 function "
+ "type%select{|s}2 %1%select{| and %3}2 is a GNU extension">,
InGroup<PointerArith>;
def error_readonly_property_assignment : Error<
"assigning to property with 'readonly' attribute not allowed">;
@@ -2942,9 +3195,9 @@ def err_qualified_objc_catch_parm : Error<
"@catch parameter declarator cannot be qualified">;
def err_objc_pointer_cxx_catch_gnu : Error<
"can't catch Objective C exceptions in C++ in the GNU runtime">;
-def err_objc_pointer_cxx_catch_fragile : Error<
- "can't catch Objective C exceptions in C++ in the non-unified "
- "exception model">;
+def warn_objc_pointer_cxx_catch_fragile : Warning<
+ "can not catch an exception thrown with @throw in C++ in the non-unified "
+ "exception model">, InGroup<ObjCNonUnifiedException>;
def err_objc_object_catch : Error<
"can't catch an Objective C object by value">;
def err_incomplete_type_objc_at_encode : Error<
@@ -3328,6 +3581,15 @@ def err_typecheck_incompatible_address_space : Error<
"|sending %0 to parameter of type %1"
"|casting %0 to type %1}2"
" changes address space of pointer">;
+def err_typecheck_incompatible_ownership : Error<
+ "%select{assigning %1 to %0"
+ "|passing %0 to parameter of type %1"
+ "|returning %0 from a function with result type %1"
+ "|converting %0 to type %1"
+ "|initializing %0 with an expression of type %1"
+ "|sending %0 to parameter of type %1"
+ "|casting %0 to type %1}2"
+ " changes retain/release properties of pointer">;
def err_typecheck_convert_ambiguous : Error<
"ambiguity in initializing value of type %0 with initializer of type %1">;
def err_typecheck_comparison_of_distinct_blocks : Error<
@@ -3544,6 +3806,9 @@ def ext_in_class_initializer_float_type : ExtWarn<
def err_in_class_initializer_non_constant : Error<
"in-class initializer is not a constant expression">;
+def ext_in_class_initializer_non_constant : Extension<
+ "in-class initializer is not a constant expression, accepted as an extension">;
+
// C++ anonymous unions and GNU anonymous structs/unions
def ext_anonymous_union : Extension<
"anonymous unions are a GNU extension in C">, InGroup<GNU>;
@@ -3929,12 +4194,23 @@ def err_switch_incomplete_class_type : Error<
"switch condition has incomplete class type %0">;
def warn_empty_if_body : Warning<
"if statement has empty body">, InGroup<EmptyBody>;
+
def err_va_start_used_in_non_variadic_function : Error<
"'va_start' used in function with fixed args">;
def warn_second_parameter_of_va_start_not_last_named_argument : Warning<
"second parameter of 'va_start' not last named argument">;
def err_first_argument_to_va_arg_not_of_type_va_list : Error<
"first argument to 'va_arg' is of type %0 and not 'va_list'">;
+def err_second_parameter_to_va_arg_incomplete: Error<
+ "second argument to 'va_arg' is of incomplete type %0">;
+def err_second_parameter_to_va_arg_abstract: Error<
+ "second argument to 'va_arg' is of abstract type %0">;
+def warn_second_parameter_to_va_arg_not_pod : Warning<
+ "second argument to 'va_arg' is of non-POD type %0">,
+ InGroup<DiagGroup<"non-pod-varargs">>, DefaultError;
+def warn_second_parameter_to_va_arg_never_compatible : Warning<
+ "second argument to 'va_arg' is of promotable type %0; this va_arg has "
+ "undefined behavior because arguments will be promoted to %1">;
def warn_return_missing_expr : Warning<
"non-void %select{function|method}1 %0 should return a value">, DefaultError,
@@ -3943,8 +4219,9 @@ def ext_return_missing_expr : ExtWarn<
"non-void %select{function|method}1 %0 should return a value">, DefaultError,
InGroup<ReturnType>;
def ext_return_has_expr : ExtWarn<
- "void %select{function|method}1 %0 should not return a value">, DefaultError,
- InGroup<ReturnType>;
+ "%select{void function|void method|constructor|destructor}1 %0 "
+ "should not return a value">,
+ DefaultError, InGroup<ReturnType>;
def ext_return_has_void_expr : Extension<
"void %select{function|method}1 %0 should not return void expression">;
def warn_noreturn_function_has_return_expr : Warning<
@@ -4074,6 +4351,11 @@ def err_typecheck_member_reference_ivar_suggest : Error<
"%0 does not have a member named %1; did you mean %2?">;
def err_property_not_found_suggest : Error<
"property %0 not found on object of type %1; did you mean %2?">;
+def err_ivar_access_using_property_syntax_suggest : Error<
+ "property %0 not found on object of type %1; did you mean to access ivar %2?">;
+def err_property_found_suggest : Error<
+ "property %0 found on object of type %1; did you mean to access "
+ "it with the \".\" operator?">;
def err_undef_interface_suggest : Error<
"cannot find interface declaration for %0; did you mean %1?">;
def warn_undef_interface_suggest : Warning<
diff --git a/contrib/llvm/tools/clang/include/clang/Basic/FileManager.h b/contrib/llvm/tools/clang/include/clang/Basic/FileManager.h
index 2ca344d..1324533 100644
--- a/contrib/llvm/tools/clang/include/clang/Basic/FileManager.h
+++ b/contrib/llvm/tools/clang/include/clang/Basic/FileManager.h
@@ -21,10 +21,13 @@
#include "llvm/ADT/StringRef.h"
#include "llvm/ADT/OwningPtr.h"
#include "llvm/Support/Allocator.h"
-#include "llvm/Config/config.h" // for mode_t
// FIXME: Enhance libsystem to support inode and other fields in stat.
#include <sys/types.h>
+#ifdef _MSC_VER
+typedef unsigned short mode_t;
+#endif
+
struct stat;
namespace llvm {
diff --git a/contrib/llvm/tools/clang/include/clang/Basic/IdentifierTable.h b/contrib/llvm/tools/clang/include/clang/Basic/IdentifierTable.h
index b4eca6d..bebcffd 100644
--- a/contrib/llvm/tools/clang/include/clang/Basic/IdentifierTable.h
+++ b/contrib/llvm/tools/clang/include/clang/Basic/IdentifierTable.h
@@ -411,23 +411,15 @@ public:
return II;
}
- IdentifierInfo &get(const char *NameStart, const char *NameEnd) {
- return get(llvm::StringRef(NameStart, NameEnd-NameStart));
- }
-
- IdentifierInfo &get(const char *Name, size_t NameLen) {
- return get(llvm::StringRef(Name, NameLen));
- }
-
/// \brief Gets an IdentifierInfo for the given name without consulting
/// external sources.
///
/// This is a version of get() meant for external sources that want to
/// introduce or modify an identifier. If they called get(), they would
/// likely end up in a recursion.
- IdentifierInfo &getOwn(const char *NameStart, const char *NameEnd) {
+ IdentifierInfo &getOwn(llvm::StringRef Name) {
llvm::StringMapEntry<IdentifierInfo*> &Entry =
- HashTable.GetOrCreateValue(NameStart, NameEnd);
+ HashTable.GetOrCreateValue(Name);
IdentifierInfo *II = Entry.getValue();
if (!II) {
@@ -444,9 +436,6 @@ public:
return *II;
}
- IdentifierInfo &getOwn(llvm::StringRef Name) {
- return getOwn(Name.begin(), Name.end());
- }
typedef HashTableTy::const_iterator iterator;
typedef HashTableTy::const_iterator const_iterator;
@@ -499,7 +488,10 @@ enum ObjCMethodFamily {
OMF_release,
OMF_retain,
OMF_retainCount,
- OMF_self
+ OMF_self,
+
+ // performSelector families
+ OMF_performSelector
};
/// Enough bits to store any enumerator in ObjCMethodFamily or
diff --git a/contrib/llvm/tools/clang/include/clang/Basic/LangOptions.h b/contrib/llvm/tools/clang/include/clang/Basic/LangOptions.h
index 74a3fbe..de2ac6a 100644
--- a/contrib/llvm/tools/clang/include/clang/Basic/LangOptions.h
+++ b/contrib/llvm/tools/clang/include/clang/Basic/LangOptions.h
@@ -120,6 +120,8 @@ public:
unsigned InlineVisibilityHidden : 1; // Whether inline C++ methods have
// hidden visibility by default.
unsigned ParseUnknownAnytype: 1; /// Let the user write __unknown_anytype.
+ unsigned DebuggerSupport : 1; /// Do things that only make sense when
+ /// supporting a debugger
unsigned SpellChecking : 1; // Whether to perform spell-checking for error
// recovery.
@@ -131,6 +133,10 @@ public:
unsigned DefaultFPContract : 1; // Default setting for FP_CONTRACT
// FIXME: This is just a temporary option, for testing purposes.
unsigned NoBitFieldTypeAlign : 1;
+ unsigned ObjCAutoRefCount : 1; // Objective C automated reference counting
+ unsigned ObjCRuntimeHasWeak : 1; // The ARC runtime supports __weak
+ unsigned ObjCInferRelatedReturnType : 1; // Infer Objective-C related return
+ // types
unsigned FakeAddressSpaceMap : 1; // Use a fake address space map, for
// testing languages such as OpenCL.
@@ -173,10 +179,13 @@ public:
Trigraphs = BCPLComment = Bool = DollarIdents = AsmPreprocessor = 0;
GNUMode = GNUKeywords = ImplicitInt = Digraphs = 0;
HexFloats = 0;
+ ObjCAutoRefCount = 0;
+ ObjCRuntimeHasWeak = 0;
+ ObjCInferRelatedReturnType = 0;
GC = ObjC1 = ObjC2 = ObjCNonFragileABI = ObjCNonFragileABI2 = 0;
AppleKext = 0;
ObjCDefaultSynthProperties = 0;
- ObjCInferRelatedResultType = 0;
+ ObjCInferRelatedResultType = 1;
NoConstantCFStrings = 0; InlineVisibilityHidden = 0;
C99 = C1X = Microsoft = Borland = CPlusPlus = CPlusPlus0x = 0;
CXXOperatorNames = PascalStrings = WritableStrings = ConstStrings = 0;
@@ -235,7 +244,7 @@ public:
FakeAddressSpaceMap = 0;
MRTD = 0;
DelayedTemplateParsing = 0;
- ParseUnknownAnytype = 0;
+ ParseUnknownAnytype = DebuggerSupport = 0;
}
GCMode getGCMode() const { return (GCMode) GC; }
diff --git a/contrib/llvm/tools/clang/include/clang/Basic/SourceManager.h b/contrib/llvm/tools/clang/include/clang/Basic/SourceManager.h
index df5074c..6301f31 100644
--- a/contrib/llvm/tools/clang/include/clang/Basic/SourceManager.h
+++ b/contrib/llvm/tools/clang/include/clang/Basic/SourceManager.h
@@ -36,6 +36,7 @@ class SourceManager;
class FileManager;
class FileEntry;
class LineTableInfo;
+class LangOptions;
/// SrcMgr - Public enums and private classes that are part of the
/// SourceManager implementation.
@@ -89,7 +90,7 @@ namespace SrcMgr {
/// getBuffer - Returns the memory buffer for the associated content.
///
- /// \param Diag Object through which diagnostics will be emitted it the
+ /// \param Diag Object through which diagnostics will be emitted if the
/// buffer cannot be retrieved.
///
/// \param Loc If specified, is the location that invalid file diagnostics
@@ -238,8 +239,11 @@ namespace SrcMgr {
/// InstantiationLocStart/InstantiationLocEnd - In a macro expansion, these
/// indicate the start and end of the instantiation. In object-like macros,
/// these will be the same. In a function-like macro instantiation, the
- /// start will be the identifier and the end will be the ')'.
+ /// start will be the identifier and the end will be the ')'. Finally, in
+ /// macro-argument instantitions, the end will be 'SourceLocation()', an
+ /// invalid location.
unsigned InstantiationLocStart, InstantiationLocEnd;
+
public:
SourceLocation getSpellingLoc() const {
return SourceLocation::getFromRawEncoding(SpellingLoc);
@@ -248,7 +252,9 @@ namespace SrcMgr {
return SourceLocation::getFromRawEncoding(InstantiationLocStart);
}
SourceLocation getInstantiationLocEnd() const {
- return SourceLocation::getFromRawEncoding(InstantiationLocEnd);
+ SourceLocation EndLoc =
+ SourceLocation::getFromRawEncoding(InstantiationLocEnd);
+ return EndLoc.isInvalid() ? getInstantiationLocStart() : EndLoc;
}
std::pair<SourceLocation,SourceLocation> getInstantiationLocRange() const {
@@ -256,19 +262,52 @@ namespace SrcMgr {
getInstantiationLocEnd());
}
- /// get - Return a InstantiationInfo for an expansion. IL specifies
- /// the instantiation location (where the macro is expanded), and SL
- /// specifies the spelling location (where the characters from the token
- /// come from). IL and PL can both refer to normal File SLocs or
+ bool isMacroArgInstantiation() const {
+ // Note that this needs to return false for default constructed objects.
+ return getInstantiationLocStart().isValid() &&
+ SourceLocation::getFromRawEncoding(InstantiationLocEnd).isInvalid();
+ }
+
+ /// create - Return a InstantiationInfo for an expansion. ILStart and
+ /// ILEnd specify the instantiation range (where the macro is expanded),
+ /// and SL specifies the spelling location (where the characters from the
+ /// token come from). All three can refer to normal File SLocs or
/// instantiation locations.
- static InstantiationInfo get(SourceLocation ILStart, SourceLocation ILEnd,
- SourceLocation SL) {
+ static InstantiationInfo create(SourceLocation SL,
+ SourceLocation ILStart,
+ SourceLocation ILEnd) {
InstantiationInfo X;
X.SpellingLoc = SL.getRawEncoding();
X.InstantiationLocStart = ILStart.getRawEncoding();
X.InstantiationLocEnd = ILEnd.getRawEncoding();
return X;
}
+
+ /// createForMacroArg - Return a special InstantiationInfo for the
+ /// expansion of a macro argument into a function-like macro's body. IL
+ /// specifies the instantiation location (where the macro is expanded).
+ /// This doesn't need to be a range because a macro is always instantiated
+ /// at a macro parameter reference, and macro parameters are always exactly
+ /// one token. SL specifies the spelling location (where the characters
+ /// from the token come from). IL and SL can both refer to normal File
+ /// SLocs or instantiation locations.
+ ///
+ /// Given the code:
+ /// \code
+ /// #define F(x) f(x)
+ /// F(42);
+ /// \endcode
+ ///
+ /// When expanding '\c F(42)', the '\c x' would call this with an SL
+ /// pointing at '\c 42' anad an IL pointing at its location in the
+ /// definition of '\c F'.
+ static InstantiationInfo createForMacroArg(SourceLocation SL,
+ SourceLocation IL) {
+ // We store an intentionally invalid source location for the end of the
+ // instantiation range to mark that this is a macro argument instantation
+ // rather than a normal one.
+ return create(SL, IL, SourceLocation());
+ }
};
/// SLocEntry - This is a discriminated union of FileInfo and
@@ -500,8 +539,8 @@ public:
//===--------------------------------------------------------------------===//
/// createFileID - Create a new FileID that represents the specified file
- /// being #included from the specified IncludePosition. This returns 0 on
- /// error and translates NULL into standard input.
+ /// being #included from the specified IncludePosition. This translates NULL
+ /// into standard input.
/// PreallocateID should be non-zero to specify which pre-allocated,
/// lazily computed source location is being filled in by this operation.
FileID createFileID(const FileEntry *SourceFile, SourceLocation IncludePos,
@@ -532,9 +571,17 @@ public:
return MainFileID;
}
+ /// createMacroArgInstantiationLoc - Return a new SourceLocation that encodes
+ /// the fact that a token from SpellingLoc should actually be referenced from
+ /// InstantiationLoc, and that it represents the instantiation of a macro
+ /// argument into the function-like macro body.
+ SourceLocation createMacroArgInstantiationLoc(SourceLocation Loc,
+ SourceLocation InstantiationLoc,
+ unsigned TokLength);
+
/// createInstantiationLoc - Return a new SourceLocation that encodes the fact
- /// that a token at Loc should actually be referenced from InstantiationLoc.
- /// TokLength is the length of the token being instantiated.
+ /// that a token from SpellingLoc should actually be referenced from
+ /// InstantiationLoc.
SourceLocation createInstantiationLoc(SourceLocation Loc,
SourceLocation InstantiationLocStart,
SourceLocation InstantiationLocEnd,
@@ -721,7 +768,7 @@ public:
if (Loc.isFileID())
return std::make_pair(FID, Offset);
- return getDecomposedInstantiationLocSlowCase(E, Offset);
+ return getDecomposedInstantiationLocSlowCase(E);
}
/// getDecomposedSpellingLoc - Decompose the specified location into a raw
@@ -745,6 +792,12 @@ public:
return getDecomposedLoc(SpellingLoc).second;
}
+ /// isMacroArgInstantiation - This method tests whether the given source
+ /// location represents a macro argument's instantiation into the
+ /// function-like macro definition. Such source locations only appear inside
+ /// of the instantiation locations representing where a particular
+ /// function-like macro was expanded.
+ bool isMacroArgInstantiation(SourceLocation Loc) const;
//===--------------------------------------------------------------------===//
// Queries about the code at a SourceLocation.
@@ -831,13 +884,38 @@ public:
return getFileCharacteristic(Loc) == SrcMgr::C_ExternCSystem;
}
- /// \brief Returns true if the given MacroID location points at the first
- /// token of the macro instantiation.
- bool isAtStartOfMacroInstantiation(SourceLocation Loc) const;
+ /// \brief Given a specific chunk of a FileID (FileID with offset+length),
+ /// returns true if \arg Loc is inside that chunk and sets relative offset
+ /// (offset of \arg Loc from beginning of chunk) to \arg relativeOffset.
+ bool isInFileID(SourceLocation Loc,
+ FileID FID, unsigned offset, unsigned length,
+ unsigned *relativeOffset = 0) const {
+ assert(!FID.isInvalid());
+ if (Loc.isInvalid())
+ return false;
+
+ unsigned start = getSLocEntry(FID).getOffset() + offset;
+ unsigned end = start + length;
+
+#ifndef NDEBUG
+ // Make sure offset/length describe a chunk inside the given FileID.
+ unsigned NextOffset;
+ if (FID.ID+1 == SLocEntryTable.size())
+ NextOffset = getNextOffset();
+ else
+ NextOffset = getSLocEntry(FID.ID+1).getOffset();
+ assert(start < NextOffset);
+ assert(end < NextOffset);
+#endif
- /// \brief Returns true if the given MacroID location points at the last
- /// token of the macro instantiation.
- bool isAtEndOfMacroInstantiation(SourceLocation Loc) const;
+ if (Loc.getOffset() >= start && Loc.getOffset() < end) {
+ if (relativeOffset)
+ *relativeOffset = Loc.getOffset() - start;
+ return true;
+ }
+
+ return false;
+ }
//===--------------------------------------------------------------------===//
// Line Table Manipulation Routines
@@ -845,7 +923,7 @@ public:
/// getLineTableFilenameID - Return the uniqued ID for the specified filename.
///
- unsigned getLineTableFilenameID(const char *Ptr, unsigned Len);
+ unsigned getLineTableFilenameID(llvm::StringRef Str);
/// AddLineNote - Add a line note to the line table for the FileID and offset
/// specified by Loc. If FilenameID is -1, it is considered to be
@@ -899,6 +977,19 @@ public:
/// \returns true if LHS source location comes before RHS, false otherwise.
bool isBeforeInTranslationUnit(SourceLocation LHS, SourceLocation RHS) const;
+ /// \brief Determines the order of 2 source locations in the "source location
+ /// address space".
+ static bool isBeforeInSourceLocationOffset(SourceLocation LHS,
+ SourceLocation RHS) {
+ return isBeforeInSourceLocationOffset(LHS, RHS.getOffset());
+ }
+
+ /// \brief Determines the order of a source location and a source location
+ /// offset in the "source location address space".
+ static bool isBeforeInSourceLocationOffset(SourceLocation LHS, unsigned RHS) {
+ return LHS.getOffset() < RHS;
+ }
+
// Iterators over FileInfos.
typedef llvm::DenseMap<const FileEntry*, SrcMgr::ContentCache*>
::const_iterator fileinfo_iterator;
@@ -952,6 +1043,14 @@ public:
private:
const llvm::MemoryBuffer *getFakeBufferForRecovery() const;
+ /// createInstantiationLoc - Implements the common elements of storing an
+ /// instantiation info struct into the SLocEntry table and producing a source
+ /// location that refers to it.
+ SourceLocation createInstantiationLocImpl(const SrcMgr::InstantiationInfo &II,
+ unsigned TokLength,
+ unsigned PreallocatedID = 0,
+ unsigned Offset = 0);
+
/// isOffsetInFileID - Return true if the specified FileID contains the
/// specified SourceLocation offset. This is a very hot method.
inline bool isOffsetInFileID(FileID FID, unsigned SLocOffset) const {
@@ -989,8 +1088,7 @@ private:
SourceLocation getSpellingLocSlowCase(SourceLocation Loc) const;
std::pair<FileID, unsigned>
- getDecomposedInstantiationLocSlowCase(const SrcMgr::SLocEntry *E,
- unsigned Offset) const;
+ getDecomposedInstantiationLocSlowCase(const SrcMgr::SLocEntry *E) const;
std::pair<FileID, unsigned>
getDecomposedSpellingLocSlowCase(const SrcMgr::SLocEntry *E,
unsigned Offset) const;
diff --git a/contrib/llvm/tools/clang/include/clang/Basic/SourceManagerInternals.h b/contrib/llvm/tools/clang/include/clang/Basic/SourceManagerInternals.h
index 258989c..3f5d1a3 100644
--- a/contrib/llvm/tools/clang/include/clang/Basic/SourceManagerInternals.h
+++ b/contrib/llvm/tools/clang/include/clang/Basic/SourceManagerInternals.h
@@ -97,7 +97,7 @@ public:
~LineTableInfo() {}
- unsigned getLineTableFilenameID(const char *Ptr, unsigned Len);
+ unsigned getLineTableFilenameID(llvm::StringRef Str);
const char *getFilename(unsigned ID) const {
assert(ID < FilenamesByID.size() && "Invalid FilenameID");
return FilenamesByID[ID]->getKeyData();
diff --git a/contrib/llvm/tools/clang/include/clang/Basic/Specifiers.h b/contrib/llvm/tools/clang/include/clang/Basic/Specifiers.h
index d21bda7..cfce0cc 100644
--- a/contrib/llvm/tools/clang/include/clang/Basic/Specifiers.h
+++ b/contrib/llvm/tools/clang/include/clang/Basic/Specifiers.h
@@ -83,7 +83,7 @@ namespace clang {
/// ExprValueKind - The categorization of expression values,
/// currently following the C++0x scheme.
enum ExprValueKind {
- /// An r-value expression (a gr-value in the C++0x taxonomy)
+ /// An r-value expression (a pr-value in the C++0x taxonomy)
/// produces a temporary value.
VK_RValue,
diff --git a/contrib/llvm/tools/clang/include/clang/Basic/StmtNodes.td b/contrib/llvm/tools/clang/include/clang/Basic/StmtNodes.td
index 03f4cc3..73996e4 100644
--- a/contrib/llvm/tools/clang/include/clang/Basic/StmtNodes.td
+++ b/contrib/llvm/tools/clang/include/clang/Basic/StmtNodes.td
@@ -37,6 +37,7 @@ def ObjCAtFinallyStmt : Stmt;
def ObjCAtThrowStmt : Stmt;
def ObjCAtSynchronizedStmt : Stmt;
def ObjCForCollectionStmt : Stmt;
+def ObjCAutoreleasePoolStmt : Stmt;
// C++ statments
def CXXCatchStmt : Stmt;
@@ -119,7 +120,9 @@ def UnresolvedMemberExpr : DStmt<OverloadExpr>;
def CXXNoexceptExpr : DStmt<Expr>;
def PackExpansionExpr : DStmt<Expr>;
def SizeOfPackExpr : DStmt<Expr>;
+def SubstNonTypeTemplateParmExpr : DStmt<Expr>;
def SubstNonTypeTemplateParmPackExpr : DStmt<Expr>;
+def MaterializeTemporaryExpr : DStmt<Expr>;
// Obj-C Expressions.
def ObjCStringLiteral : DStmt<Expr>;
@@ -130,6 +133,10 @@ def ObjCProtocolExpr : DStmt<Expr>;
def ObjCIvarRefExpr : DStmt<Expr>;
def ObjCPropertyRefExpr : DStmt<Expr>;
def ObjCIsaExpr : DStmt<Expr>;
+def ObjCIndirectCopyRestoreExpr : DStmt<Expr>;
+
+// Obj-C ARC Expressions.
+def ObjCBridgedCastExpr : DStmt<ExplicitCastExpr>;
// CUDA Expressions.
def CUDAKernelCallExpr : DStmt<CallExpr>;
diff --git a/contrib/llvm/tools/clang/include/clang/Basic/TargetInfo.h b/contrib/llvm/tools/clang/include/clang/Basic/TargetInfo.h
index 76006d4..4559cf2 100644
--- a/contrib/llvm/tools/clang/include/clang/Basic/TargetInfo.h
+++ b/contrib/llvm/tools/clang/include/clang/Basic/TargetInfo.h
@@ -240,6 +240,14 @@ public:
return getTypeWidth(IntMaxType);
}
+ /// getRegisterWidth - Return the "preferred" register width on this target.
+ uint64_t getRegisterWidth() const {
+ // Currently we assume the register width on the target matches the pointer
+ // width, we can introduce a new variable for this if/when some target wants
+ // it.
+ return LongWidth;
+ }
+
/// getUserLabelPrefix - This returns the default value of the
/// __USER_LABEL_PREFIX__ macro, which is the prefix given to user symbols by
/// default. On most platforms this is "_", but it is "" on some, and "." on
@@ -295,6 +303,11 @@ public:
/// __builtin_va_list, which is target-specific.
virtual const char *getVAListDeclaration() const = 0;
+ /// isValidClobber - Returns whether the passed in string is
+ /// a valid clobber in an inline asm statement. This is used by
+ /// Sema.
+ bool isValidClobber(llvm::StringRef Name) const;
+
/// isValidGCCRegisterName - Returns whether the passed in string
/// is a valid register name according to GCC. This is used by Sema for
/// inline asm statements.
@@ -396,6 +409,11 @@ public:
const char * const Register;
};
+ struct AddlRegName {
+ const char * const Names[5];
+ const unsigned RegNum;
+ };
+
virtual bool useGlobalsForAutomaticVariables() const { return false; }
/// getCFStringSection - Return the section to use for CFString
@@ -511,6 +529,7 @@ public:
// getRegParmMax - Returns maximal number of args passed in registers.
unsigned getRegParmMax() const {
+ assert(RegParmMax < 7 && "RegParmMax value is larger than AST can handle");
return RegParmMax;
}
@@ -566,6 +585,11 @@ protected:
unsigned &NumNames) const = 0;
virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
unsigned &NumAliases) const = 0;
+ virtual void getGCCAddlRegNames(const AddlRegName *&Addl,
+ unsigned &NumAddl) const {
+ Addl = 0;
+ NumAddl = 0;
+ }
virtual bool validateAsmConstraint(const char *&Name,
TargetInfo::ConstraintInfo &info) const= 0;
};
diff --git a/contrib/llvm/tools/clang/include/clang/Basic/TokenKinds.def b/contrib/llvm/tools/clang/include/clang/Basic/TokenKinds.def
index dfba7ee..86172b8 100644
--- a/contrib/llvm/tools/clang/include/clang/Basic/TokenKinds.def
+++ b/contrib/llvm/tools/clang/include/clang/Basic/TokenKinds.def
@@ -422,6 +422,12 @@ KEYWORD(__pascal , KEYALL)
KEYWORD(__vector , KEYALTIVEC)
KEYWORD(__pixel , KEYALTIVEC)
+// Objective-C ARC keywords.
+KEYWORD(__bridge , KEYARC)
+KEYWORD(__bridge_transfer , KEYARC)
+KEYWORD(__bridge_retained , KEYARC)
+KEYWORD(__bridge_retain , KEYARC)
+
// Alternate spelling for various tokens. There are GCC extensions in all
// languages, but should not be disabled in strict conformance mode.
ALIAS("__alignof__" , __alignof , KEYALL)
@@ -507,6 +513,7 @@ OBJC1_AT_KEYWORD(try)
OBJC1_AT_KEYWORD(catch)
OBJC1_AT_KEYWORD(finally)
OBJC1_AT_KEYWORD(synchronized)
+OBJC1_AT_KEYWORD(autoreleasepool)
OBJC2_AT_KEYWORD(property)
OBJC2_AT_KEYWORD(package)
diff --git a/contrib/llvm/tools/clang/include/clang/Basic/arm_neon.td b/contrib/llvm/tools/clang/include/clang/Basic/arm_neon.td
index b3da122..71a0aa2 100644
--- a/contrib/llvm/tools/clang/include/clang/Basic/arm_neon.td
+++ b/contrib/llvm/tools/clang/include/clang/Basic/arm_neon.td
@@ -182,7 +182,7 @@ def VMAX : SInst<"vmax", "ddd", "csiUcUsUifQcQsQiQUcQUsQUiQf">;
def VMIN : SInst<"vmin", "ddd", "csiUcUsUifQcQsQiQUcQUsQUiQf">;
////////////////////////////////////////////////////////////////////////////////
-// E.3.7 Pairdise Addition
+// E.3.7 Pairwise Addition
def VPADD : IInst<"vpadd", "ddd", "csiUcUsUif">;
def VPADDL : SInst<"vpaddl", "nd", "csiUcUsUiQcQsQiQUcQUsQUi">;
def VPADAL : SInst<"vpadal", "nnd", "csiUcUsUiQcQsQiQUcQUsQUi">;
@@ -352,7 +352,7 @@ def VEXT : WInst<"vext", "dddi",
"cUcPcsUsPsiUilUlfQcQUcQPcQsQUsQPsQiQUiQlQUlQf">;
////////////////////////////////////////////////////////////////////////////////
-// E.3.27 Reverse vector elements (sdap endianness)
+// E.3.27 Reverse vector elements
def VREV64 : Inst<"vrev64", "dd", "csiUcUsUiPcPsfQcQsQiQUcQUsQUiQPcQPsQf",
OP_REV64>;
def VREV32 : Inst<"vrev32", "dd", "csUcUsPcPsQcQsQUcQUsQPcQPs", OP_REV32>;
diff --git a/contrib/llvm/tools/clang/include/clang/CodeGen/BackendUtil.h b/contrib/llvm/tools/clang/include/clang/CodeGen/BackendUtil.h
index abcef81..9636d6e 100644
--- a/contrib/llvm/tools/clang/include/clang/CodeGen/BackendUtil.h
+++ b/contrib/llvm/tools/clang/include/clang/CodeGen/BackendUtil.h
@@ -19,6 +19,7 @@ namespace clang {
class Diagnostic;
class CodeGenOptions;
class TargetOptions;
+ class LangOptions;
enum BackendAction {
Backend_EmitAssembly, ///< Emit native assembly files
@@ -30,7 +31,8 @@ namespace clang {
};
void EmitBackendOutput(Diagnostic &Diags, const CodeGenOptions &CGOpts,
- const TargetOptions &TOpts, llvm::Module *M,
+ const TargetOptions &TOpts, const LangOptions &LOpts,
+ llvm::Module *M,
BackendAction Action, llvm::raw_ostream *OS);
}
diff --git a/contrib/llvm/tools/clang/include/clang/Driver/CC1Options.td b/contrib/llvm/tools/clang/include/clang/Driver/CC1Options.td
index 2c35ea1..c72fb7d 100644
--- a/contrib/llvm/tools/clang/include/clang/Driver/CC1Options.td
+++ b/contrib/llvm/tools/clang/include/clang/Driver/CC1Options.td
@@ -143,6 +143,8 @@ def femit_coverage_data: Flag<"-femit-coverage-data">,
def coverage_file : Separate<"-coverage-file">,
HelpText<"Emit coverage data to this filename. The extension will be replaced.">;
def coverage_file_EQ : Joined<"-coverage-file=">, Alias<coverage_file>;
+def fuse_register_sized_bitfield_access: Flag<"-fuse-register-sized-bitfield-access">,
+ HelpText<"Use register sized accesses to bit-fields, when possible.">;
def relaxed_aliasing : Flag<"-relaxed-aliasing">,
HelpText<"Turn off Type Based Alias Analysis">;
def masm_verbose : Flag<"-masm-verbose">,
@@ -157,6 +159,8 @@ def mfloat_abi : Separate<"-mfloat-abi">,
HelpText<"The float ABI to use">;
def mlimit_float_precision : Separate<"-mlimit-float-precision">,
HelpText<"Limit float precision to the given value">;
+def mno_exec_stack : Flag<"-mnoexecstack">,
+ HelpText<"Mark the file as not needing an executable stack">;
def mno_zero_initialized_in_bss : Flag<"-mno-zero-initialized-in-bss">,
HelpText<"Do not put zero initialized data in the BSS">;
def momit_leaf_frame_pointer : Flag<"-momit-leaf-frame-pointer">,
@@ -204,6 +208,7 @@ def MQ : Separate<"-MQ">, HelpText<"Specify target to quote for dependency">;
def MT : Separate<"-MT">, HelpText<"Specify target for dependency">;
def MP : Flag<"-MP">,
HelpText<"Create phony target for each dependency (other than main file)">;
+def MG : Flag<"-MG">, HelpText<"Add missing headers to dependency list">;
//===----------------------------------------------------------------------===//
// Diagnostic Options
@@ -259,7 +264,7 @@ def ftabstop : Separate<"-ftabstop">, MetaVarName<"<N>">,
def ferror_limit : Separate<"-ferror-limit">, MetaVarName<"<N>">,
HelpText<"Set the maximum number of errors to emit before stopping (0 = no limit).">;
def fmacro_backtrace_limit : Separate<"-fmacro-backtrace-limit">, MetaVarName<"<N>">,
- HelpText<"Set the maximum number of entries to print in a macro instantiation backtrace (0 = no limit).">;
+ HelpText<"Set the maximum number of entries to print in a macro expansion backtrace (0 = no limit).">;
def ftemplate_backtrace_limit : Separate<"-ftemplate-backtrace-limit">, MetaVarName<"<N>">,
HelpText<"Set the maximum number of entries to print in a template instantiation backtrace (0 = no limit).">;
def fmessage_length : Separate<"-fmessage-length">, MetaVarName<"<N>">,
@@ -352,8 +357,6 @@ def ast_dump_xml : Flag<"-ast-dump-xml">,
HelpText<"Build ASTs and then debug dump them in a verbose XML format">;
def ast_view : Flag<"-ast-view">,
HelpText<"Build ASTs and view them with GraphViz">;
-def boostcon : Flag<"-boostcon">,
- HelpText<"BoostCon workshop mode">;
def print_decl_contexts : Flag<"-print-decl-contexts">,
HelpText<"Print DeclContexts and their Decls">;
def emit_pth : Flag<"-emit-pth">,
@@ -383,6 +386,15 @@ def create_module : Flag<"-create-module">,
HelpText<"Create a module definition file">;
}
+def arcmt_check : Flag<"-arcmt-check">,
+ HelpText<"Check for ARC migration issues that need manual handling">;
+def arcmt_modify : Flag<"-arcmt-modify">,
+ HelpText<"Apply modifications to files to conform to ARC">;
+def arcmt_migrate : Flag<"-arcmt-migrate">,
+ HelpText<"Apply modifications and produces temporary files that conform to ARC">;
+def arcmt_migrate_directory : Separate<"-arcmt-migrate-directory">,
+ HelpText<"Directory for temporary files produced during ARC migration">;
+
def import_module : Separate<"-import-module">,
HelpText<"Import a module definition file">;
@@ -454,6 +466,8 @@ def fhidden_weak_vtables : Flag<"-fhidden-weak-vtables">,
HelpText<"Generate weak vtables and RTTI with hidden visibility">;
def std_EQ : Joined<"-std=">,
HelpText<"Language standard to compile for">;
+def stdlib_EQ : Joined<"-stdlib=">,
+ HelpText<"C++ standard library to use">;
def fmath_errno : Flag<"-fmath-errno">,
HelpText<"Require math functions to indicate errors by setting errno">;
def fms_extensions : Flag<"-fms-extensions">,
@@ -481,6 +495,18 @@ def fconstant_string_class : Separate<"-fconstant-string-class">,
HelpText<"Specify the class to use for constant Objective-C string objects.">;
def fno_constant_cfstrings : Flag<"-fno-constant-cfstrings">,
HelpText<"Enable creation of CodeFoundation-type constant strings">;
+def fobjc_arc : Flag<"-fobjc-arc">,
+ HelpText<"Synthesize retain and release calls for Objective-C pointers">;
+def fobjc_arc_cxxlib_EQ : Joined<"-fobjc-arc-cxxlib=">,
+ HelpText<"Objective-C++ Automatic Reference Counting standard library kind">;
+def fobjc_arc_exceptions : Flag<"-fobjc-arc-exceptions">,
+ HelpText<"Use EH-safe code when synthesizing retains and releases in -fobjc-arc">;
+def fobjc_runtime_has_arc : Flag<"-fobjc-runtime-has-arc">,
+ HelpText<"The target Objective-C runtime provides ARC entrypoints">;
+def fobjc_runtime_has_weak : Flag<"-fobjc-runtime-has-weak">,
+ HelpText<"The target Objective-C runtime supports ARC weak operations">;
+def fobjc_runtime_has_terminate : Flag<"-fobjc-runtime-has-terminate">,
+ HelpText<"The target Objective-C runtime provides an objc_terminate entrypoint">;
def fobjc_gc : Flag<"-fobjc-gc">,
HelpText<"Enable Objective-C garbage collection">;
def fobjc_gc_only : Flag<"-fobjc-gc-only">,
@@ -495,8 +521,10 @@ def print_ivar_layout : Flag<"-print-ivar-layout">,
HelpText<"Enable Objective-C Ivar layout bitmap print trace">;
def fobjc_nonfragile_abi : Flag<"-fobjc-nonfragile-abi">,
HelpText<"enable objective-c's nonfragile abi">;
-def fobjc_infer_related_result_type : Flag<"-fobjc-infer-related-result-type">,
- HelpText<"infer Objective-C related result type based on method family">;
+def fno_objc_infer_related_result_type : Flag<
+ "-fno-objc-infer-related-result-type">,
+ HelpText<
+ "do not infer Objective-C related result type based on method family">;
def ftrapv : Flag<"-ftrapv">,
HelpText<"Trap on integer overflow">;
def ftrapv_handler : Separate<"-ftrapv-handler">,
@@ -556,6 +584,8 @@ def fdelayed_template_parsing : Flag<"-fdelayed-template-parsing">,
"translation unit ">;
def funknown_anytype : Flag<"-funknown-anytype">,
HelpText<"Enable parser support for the __unknown_anytype type; for testing purposes only">;
+def fdebugger_support : Flag<"-fdebugger-support">,
+ HelpText<"Enable special debugger support behavior">;
def fdeprecated_macro : Flag<"-fdeprecated-macro">,
HelpText<"Defines the __DEPRECATED macro">;
def fno_deprecated_macro : Flag<"-fno-deprecated-macro">,
diff --git a/contrib/llvm/tools/clang/include/clang/Driver/Compilation.h b/contrib/llvm/tools/clang/include/clang/Driver/Compilation.h
index 22d6b4e..2db712d 100644
--- a/contrib/llvm/tools/clang/include/clang/Driver/Compilation.h
+++ b/contrib/llvm/tools/clang/include/clang/Driver/Compilation.h
@@ -14,7 +14,6 @@
#include "clang/Driver/Util.h"
#include "llvm/ADT/DenseMap.h"
-#include "llvm/ADT/SmallVector.h"
namespace llvm {
class raw_ostream;
diff --git a/contrib/llvm/tools/clang/include/clang/Driver/Driver.h b/contrib/llvm/tools/clang/include/clang/Driver/Driver.h
index 5a7d830..b695166 100644
--- a/contrib/llvm/tools/clang/include/clang/Driver/Driver.h
+++ b/contrib/llvm/tools/clang/include/clang/Driver/Driver.h
@@ -357,6 +357,8 @@ public:
bool ShouldUseClangCompiler(const Compilation &C, const JobAction &JA,
const llvm::Triple &ArchName) const;
+ bool IsUsingLTO(const ArgList &Args) const;
+
/// @}
/// GetReleaseVersion - Parse (([0-9]+)(.([0-9]+)(.([0-9]+)?))?)? and
diff --git a/contrib/llvm/tools/clang/include/clang/Driver/ObjCRuntime.h b/contrib/llvm/tools/clang/include/clang/Driver/ObjCRuntime.h
new file mode 100644
index 0000000..5516460
--- /dev/null
+++ b/contrib/llvm/tools/clang/include/clang/Driver/ObjCRuntime.h
@@ -0,0 +1,46 @@
+//===--- ObjCRuntime.h - Objective C runtime features -----------*- C++ -*-===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+#ifndef CLANG_DRIVER_OBJCRUNTIME_H_
+#define CLANG_DRIVER_OBJCRUNTIME_H_
+
+namespace clang {
+namespace driver {
+
+class ObjCRuntime {
+public:
+ enum Kind { GNU, NeXT };
+private:
+ unsigned RuntimeKind : 1;
+public:
+ void setKind(Kind k) { RuntimeKind = k; }
+ Kind getKind() const { return static_cast<Kind>(RuntimeKind); }
+
+ /// True if the runtime provides native ARC entrypoints. ARC may
+ /// still be usable without this if the tool-chain provides a
+ /// statically-linked runtime support library.
+ unsigned HasARC : 1;
+
+ /// True if the runtime supports ARC zeroing __weak.
+ unsigned HasWeak : 1;
+
+ /// True if the runtime provides the following entrypoint:
+ /// void objc_terminate(void);
+ /// If available, this will be called instead of abort() when an
+ /// exception is thrown out of an EH cleanup.
+ unsigned HasTerminate : 1;
+
+ ObjCRuntime() : RuntimeKind(NeXT), HasARC(false), HasWeak(false),
+ HasTerminate(false) {}
+};
+
+}
+}
+
+#endif
diff --git a/contrib/llvm/tools/clang/include/clang/Driver/Option.h b/contrib/llvm/tools/clang/include/clang/Driver/Option.h
index 9625465..9dfa461 100644
--- a/contrib/llvm/tools/clang/include/clang/Driver/Option.h
+++ b/contrib/llvm/tools/clang/include/clang/Driver/Option.h
@@ -11,6 +11,7 @@
#define CLANG_DRIVER_OPTION_H_
#include "clang/Driver/OptSpecifier.h"
+#include "llvm/ADT/StringRef.h"
#include "llvm/Support/Casting.h"
using llvm::isa;
using llvm::cast;
@@ -64,7 +65,7 @@ namespace driver {
OptSpecifier ID;
/// The option name.
- const char *Name;
+ llvm::StringRef Name;
/// Group this option is a member of, if any.
const OptionGroup *Group;
@@ -103,7 +104,7 @@ namespace driver {
unsigned getID() const { return ID.getID(); }
OptionClass getKind() const { return Kind; }
- const char *getName() const { return Name; }
+ llvm::StringRef getName() const { return Name; }
const OptionGroup *getGroup() const { return Group; }
const Option *getAlias() const { return Alias; }
@@ -143,7 +144,7 @@ namespace driver {
/// getRenderName - Return the name to use when rendering this
/// option.
- const char *getRenderName() const {
+ llvm::StringRef getRenderName() const {
return getUnaliasedOption()->getName();
}
diff --git a/contrib/llvm/tools/clang/include/clang/Driver/Options.td b/contrib/llvm/tools/clang/include/clang/Driver/Options.td
index 456aa56..14fd971 100644
--- a/contrib/llvm/tools/clang/include/clang/Driver/Options.td
+++ b/contrib/llvm/tools/clang/include/clang/Driver/Options.td
@@ -112,6 +112,17 @@ def ccc_print_phases : Flag<"-ccc-print-phases">, CCCDebugOpt,
def ccc_print_bindings : Flag<"-ccc-print-bindings">, CCCDebugOpt,
HelpText<"Show bindings of tools to actions">;
+def ccc_arcmt_check : Flag<"-ccc-arcmt-check">, CCCDriverOpt,
+ HelpText<"Check for ARC migration issues that need manual handling">;
+def ccc_arcmt_modify : Flag<"-ccc-arcmt-modify">, CCCDriverOpt,
+ HelpText<"Apply modifications to files to conform to ARC">;
+def ccc_arrmt_check : Flag<"-ccc-arrmt-check">, Alias<ccc_arcmt_check>;
+def ccc_arrmt_modify : Flag<"-ccc-arrmt-modify">, Alias<ccc_arcmt_modify>;
+def ccc_arcmt_migrate : Separate<"-ccc-arcmt-migrate">, CCCDriverOpt,
+ HelpText<"Apply modifications and produces temporary files that conform to ARC">;
+def ccc_arcmt_migrate_EQ : Joined<"-ccc-arcmt-migrate=">, CCCDriverOpt,
+ Alias<ccc_arcmt_migrate>;
+
// Make sure all other -ccc- options are rejected.
def ccc_ : Joined<"-ccc-">, Group<ccc_Group>, Flags<[Unsupported]>;
@@ -383,6 +394,10 @@ def fno_verbose_asm : Flag<"-fno-verbose-asm">, Group<f_Group>;
def fno_working_directory : Flag<"-fno-working-directory">, Group<f_Group>;
def fno_wrapv : Flag<"-fno-wrapv">, Group<f_Group>;
def fno_zero_initialized_in_bss : Flag<"-fno-zero-initialized-in-bss">, Group<f_Group>;
+def fobjc_arc : Flag<"-fobjc-arc">, Group<f_Group>;
+def fno_objc_arc : Flag<"-fno-objc-arc">, Group<f_Group>;
+def fobjc_arc_exceptions : Flag<"-fobjc-arc-exceptions">, Group<f_Group>;
+def fno_objc_arc_exceptions : Flag<"-fno-objc-arc-exceptions">, Group<f_Group>;
def fobjc_atdefs : Flag<"-fobjc-atdefs">, Group<clang_ignored_f_Group>;
def fobjc_call_cxx_cdtors : Flag<"-fobjc-call-cxx-cdtors">, Group<clang_ignored_f_Group>;
def fobjc_default_synthesize_properties :
@@ -410,6 +425,7 @@ def fomit_frame_pointer : Flag<"-fomit-frame-pointer">, Group<f_Group>;
def fopenmp : Flag<"-fopenmp">, Group<f_Group>;
def force__cpusubtype__ALL : Flag<"-force_cpusubtype_ALL">;
def force__flat__namespace : Flag<"-force_flat_namespace">;
+def force__load : Separate<"-force_load">;
def foutput_class_dir_EQ : Joined<"-foutput-class-dir=">, Group<f_Group>;
def fpascal_strings : Flag<"-fpascal-strings">, Group<f_Group>;
def fpch_preprocess : Flag<"-fpch-preprocess">, Group<f_Group>;
@@ -804,8 +820,8 @@ def _specs : Separate<"--specs">, Alias<specs_EQ>;
def _static : Flag<"--static">, Alias<static>;
def _std_EQ : Joined<"--std=">, Alias<std_EQ>;
def _std : Separate<"--std">, Alias<std_EQ>;
-def _stdlib_EQ : Joined<"--stdlib=">, Alias<std_EQ>;
-def _stdlib : Separate<"--stdlib">, Alias<std_EQ>;
+def _stdlib_EQ : Joined<"--stdlib=">, Alias<stdlib_EQ>;
+def _stdlib : Separate<"--stdlib">, Alias<stdlib_EQ>;
def _sysroot_EQ : Joined<"--sysroot=">;
def _sysroot : Separate<"--sysroot">, Alias<_sysroot_EQ>;
def _target_help : Flag<"--target-help">;
diff --git a/contrib/llvm/tools/clang/include/clang/Driver/ToolChain.h b/contrib/llvm/tools/clang/include/clang/Driver/ToolChain.h
index 626d54c..4836d3f 100644
--- a/contrib/llvm/tools/clang/include/clang/Driver/ToolChain.h
+++ b/contrib/llvm/tools/clang/include/clang/Driver/ToolChain.h
@@ -26,6 +26,7 @@ namespace driver {
class HostInfo;
class InputArgList;
class JobAction;
+ class ObjCRuntime;
class Tool;
/// ToolChain - Access to tools for a single platform.
@@ -177,6 +178,12 @@ public:
/// Clang.
virtual std::string ComputeEffectiveClangTriple(const ArgList &Args) const;
+ /// configureObjCRuntime - Configure the known properties of the
+ /// Objective-C runtime for this platform.
+ ///
+ /// FIXME: this doesn't really belong here.
+ virtual void configureObjCRuntime(ObjCRuntime &runtime) const;
+
// GetCXXStdlibType - Determine the C++ standard library type to use with the
// given compilation arguments.
virtual CXXStdlibType GetCXXStdlibType(const ArgList &Args) const;
@@ -184,7 +191,8 @@ public:
/// AddClangCXXStdlibIncludeArgs - Add the clang -cc1 level arguments to set
/// the include paths to use for the given C++ standard library type.
virtual void AddClangCXXStdlibIncludeArgs(const ArgList &Args,
- ArgStringList &CmdArgs) const;
+ ArgStringList &CmdArgs,
+ bool ObjCXXAutoRefCount) const;
/// AddCXXStdlibLibArgs - Add the system specific linker arguments to use
/// for the given C++ standard library type.
diff --git a/contrib/llvm/tools/clang/include/clang/Frontend/ASTUnit.h b/contrib/llvm/tools/clang/include/clang/Frontend/ASTUnit.h
index 339297e..58a60a1 100644
--- a/contrib/llvm/tools/clang/include/clang/Frontend/ASTUnit.h
+++ b/contrib/llvm/tools/clang/include/clang/Frontend/ASTUnit.h
@@ -249,9 +249,9 @@ private:
/// \brief Whether we should be caching code-completion results.
bool ShouldCacheCodeCompletionResults;
- /// \brief Whether we want to include nested macro instantiations in the
+ /// \brief Whether we want to include nested macro expansions in the
/// detailed preprocessing record.
- bool NestedMacroInstantiations;
+ bool NestedMacroExpansions;
static void ConfigureDiags(llvm::IntrusiveRefCntPtr<Diagnostic> &Diags,
const char **ArgBegin, const char **ArgEnd,
@@ -363,7 +363,7 @@ private:
unsigned MaxLines, bool &CreatedBuffer);
llvm::MemoryBuffer *getMainBufferWithPrecompiledPreamble(
- CompilerInvocation PreambleInvocation,
+ const CompilerInvocation &PreambleInvocationIn,
bool AllowRebuild = true,
unsigned MaxLines = 0);
void RealizeTopLevelDeclsFromPreamble();
@@ -612,7 +612,7 @@ public:
bool PrecompilePreamble = false,
bool CompleteTranslationUnit = true,
bool CacheCodeCompletionResults = false,
- bool NestedMacroInstantiations = true);
+ bool NestedMacroExpansions = true);
/// LoadFromCommandLine - Create an ASTUnit from a vector of command line
/// arguments, which must specify exactly one source file.
@@ -642,7 +642,7 @@ public:
bool CacheCodeCompletionResults = false,
bool CXXPrecompilePreamble = false,
bool CXXChainedPCH = false,
- bool NestedMacroInstantiations = true);
+ bool NestedMacroExpansions = true);
/// \brief Reparse the source files using the same command-line options that
/// were originally used to produce this translation unit.
@@ -680,8 +680,8 @@ public:
/// \brief Save this translation unit to a file with the given name.
///
- /// \returns True if an error occurred, false otherwise.
- bool Save(llvm::StringRef File);
+ /// \returns An indication of whether the save was successful or not.
+ CXSaveError Save(llvm::StringRef File);
/// \brief Serialize this translation unit with the given output stream.
///
diff --git a/contrib/llvm/tools/clang/include/clang/Frontend/CodeGenOptions.h b/contrib/llvm/tools/clang/include/clang/Frontend/CodeGenOptions.h
index 1c686c7..5d040b4 100644
--- a/contrib/llvm/tools/clang/include/clang/Frontend/CodeGenOptions.h
+++ b/contrib/llvm/tools/clang/include/clang/Frontend/CodeGenOptions.h
@@ -36,6 +36,7 @@ public:
};
unsigned AsmVerbose : 1; /// -dA, -fverbose-asm.
+ unsigned ObjCAutoRefCountExceptions : 1; /// Whether ARC should be EH-safe.
unsigned CXAAtExit : 1; /// Use __cxa_atexit for calling destructors.
unsigned CXXCtorDtorAliases: 1; /// Emit complete ctors/dtors as linker
/// aliases to base ctors when possible.
@@ -69,11 +70,14 @@ public:
unsigned MergeAllConstants : 1; /// Merge identical constants.
unsigned NoCommon : 1; /// Set when -fno-common or C++ is enabled.
unsigned NoDwarf2CFIAsm : 1; /// Set when -fno-dwarf2-cfi-asm is enabled.
+ unsigned NoExecStack : 1; /// Set when -Wa,--noexecstack is enabled.
unsigned NoImplicitFloat : 1; /// Set when -mno-implicit-float is enabled.
unsigned NoInfsFPMath : 1; /// Assume FP arguments, results not +-Inf.
unsigned NoNaNsFPMath : 1; /// Assume FP arguments, results not NaN.
unsigned NoZeroInitializedInBSS : 1; /// -fno-zero-initialized-in-bss
unsigned ObjCDispatchMethod : 2; /// Method of Objective-C dispatch to use.
+ unsigned ObjCRuntimeHasARC : 1; /// The target runtime supports ARC natively
+ unsigned ObjCRuntimeHasTerminate : 1; /// The ObjC runtime has objc_terminate
unsigned OmitLeafFramePointer : 1; /// Set when -momit-leaf-frame-pointer is
/// enabled.
unsigned OptimizationLevel : 3; /// The -O[0-4] option specified.
@@ -89,6 +93,11 @@ public:
unsigned UnrollLoops : 1; /// Control whether loops are unrolled.
unsigned UnsafeFPMath : 1; /// Allow unsafe floating point optzns.
unsigned UnwindTables : 1; /// Emit unwind tables.
+
+ /// Attempt to use register sized accesses to bit-fields in structures, when
+ /// possible.
+ unsigned UseRegisterSizedBitfieldAccess : 1;
+
unsigned VerifyModule : 1; /// Control whether the module should be run
/// through the LLVM Verifier.
@@ -159,7 +168,10 @@ public:
NoNaNsFPMath = 0;
NoZeroInitializedInBSS = 0;
NumRegisterParameters = 0;
+ ObjCAutoRefCountExceptions = 0;
ObjCDispatchMethod = Legacy;
+ ObjCRuntimeHasARC = 0;
+ ObjCRuntimeHasTerminate = 0;
OmitLeafFramePointer = 0;
OptimizationLevel = 0;
OptimizeSize = 0;
@@ -173,6 +185,7 @@ public:
UnrollLoops = 0;
UnsafeFPMath = 0;
UnwindTables = 0;
+ UseRegisterSizedBitfieldAccess = 0;
VerifyModule = 1;
Inlining = NoInlining;
diff --git a/contrib/llvm/tools/clang/include/clang/Frontend/DependencyOutputOptions.h b/contrib/llvm/tools/clang/include/clang/Frontend/DependencyOutputOptions.h
index 35aa6c6..1e22c22 100644
--- a/contrib/llvm/tools/clang/include/clang/Frontend/DependencyOutputOptions.h
+++ b/contrib/llvm/tools/clang/include/clang/Frontend/DependencyOutputOptions.h
@@ -24,6 +24,7 @@ public:
unsigned UsePhonyTargets : 1; ///< Include phony targets for each
/// dependency, which can avoid some 'make'
/// problems.
+ unsigned AddMissingHeaderDeps : 1; ///< Add missing headers to dependency list
/// The file to write dependency output to.
std::string OutputFile;
@@ -43,6 +44,7 @@ public:
IncludeSystemHeaders = 0;
ShowHeaderIncludes = 0;
UsePhonyTargets = 0;
+ AddMissingHeaderDeps = 0;
}
};
diff --git a/contrib/llvm/tools/clang/include/clang/Frontend/DiagnosticOptions.h b/contrib/llvm/tools/clang/include/clang/Frontend/DiagnosticOptions.h
index 56093c3..5ae8eb3 100644
--- a/contrib/llvm/tools/clang/include/clang/Frontend/DiagnosticOptions.h
+++ b/contrib/llvm/tools/clang/include/clang/Frontend/DiagnosticOptions.h
@@ -49,8 +49,7 @@ public:
/// input source file.
unsigned ErrorLimit; /// Limit # errors emitted.
- unsigned MacroBacktraceLimit; /// Limit depth of macro instantiation
- /// backtrace.
+ unsigned MacroBacktraceLimit; /// Limit depth of macro expansion backtrace.
unsigned TemplateBacktraceLimit; /// Limit depth of instantiation backtrace.
/// The distance between tab stops.
diff --git a/contrib/llvm/tools/clang/include/clang/Frontend/FrontendAction.h b/contrib/llvm/tools/clang/include/clang/Frontend/FrontendAction.h
index ee0863a..f335475 100644
--- a/contrib/llvm/tools/clang/include/clang/Frontend/FrontendAction.h
+++ b/contrib/llvm/tools/clang/include/clang/Frontend/FrontendAction.h
@@ -51,6 +51,7 @@ class FrontendAction {
llvm::OwningPtr<ASTUnit> CurrentASTUnit;
CompilerInstance *Instance;
friend class ASTMergeAction;
+ friend class WrapperFrontendAction;
private:
ASTConsumer* CreateWrappedASTConsumer(CompilerInstance &CI,
@@ -77,6 +78,14 @@ protected:
virtual ASTConsumer *CreateASTConsumer(CompilerInstance &CI,
llvm::StringRef InFile) = 0;
+ /// \brief Callback before starting processing a single input, giving the
+ /// opportunity to modify the CompilerInvocation or do some other action
+ /// before BeginSourceFileAction is called.
+ ///
+ /// \return True on success; on failure \see BeginSourceFileAction() and
+ /// ExecutionAction() and EndSourceFileAction() will not be called.
+ virtual bool BeginInvocation(CompilerInstance &CI) { return true; }
+
/// BeginSourceFileAction - Callback at the start of processing a single
/// input.
///
@@ -253,6 +262,36 @@ public:
virtual bool usesPreprocessorOnly() const { return true; }
};
+/// WrapperFrontendAction - A frontend action which simply wraps some other
+/// runtime specified frontend action. Deriving from this class allows an
+/// action to inject custom logic around some existing action's behavior. It
+/// implements every virtual method in the FrontendAction interface by
+/// forwarding to the wrapped action.
+class WrapperFrontendAction : public FrontendAction {
+ llvm::OwningPtr<FrontendAction> WrappedAction;
+
+protected:
+ virtual ASTConsumer *CreateASTConsumer(CompilerInstance &CI,
+ llvm::StringRef InFile);
+ virtual bool BeginInvocation(CompilerInstance &CI);
+ virtual bool BeginSourceFileAction(CompilerInstance &CI,
+ llvm::StringRef Filename);
+ virtual void ExecuteAction();
+ virtual void EndSourceFileAction();
+
+public:
+ /// Construct a WrapperFrontendAction from an existing action, taking
+ /// ownership of it.
+ WrapperFrontendAction(FrontendAction *WrappedAction);
+
+ virtual bool usesPreprocessorOnly() const;
+ virtual bool usesCompleteTranslationUnit();
+ virtual bool hasPCHSupport() const;
+ virtual bool hasASTFileSupport() const;
+ virtual bool hasIRSupport() const;
+ virtual bool hasCodeCompletionSupport() const;
+};
+
} // end namespace clang
#endif
diff --git a/contrib/llvm/tools/clang/include/clang/Frontend/FrontendActions.h b/contrib/llvm/tools/clang/include/clang/Frontend/FrontendActions.h
index 4e67449..b409ad1 100644
--- a/contrib/llvm/tools/clang/include/clang/Frontend/FrontendActions.h
+++ b/contrib/llvm/tools/clang/include/clang/Frontend/FrontendActions.h
@@ -97,12 +97,6 @@ public:
virtual bool hasCodeCompletionSupport() const { return true; }
};
-class BoostConAction : public SyntaxOnlyAction {
-protected:
- virtual ASTConsumer *CreateASTConsumer(CompilerInstance &CI,
- llvm::StringRef InFile);
-};
-
/**
* \brief Frontend action adaptor that merges ASTs together.
*
diff --git a/contrib/llvm/tools/clang/include/clang/Frontend/FrontendOptions.h b/contrib/llvm/tools/clang/include/clang/Frontend/FrontendOptions.h
index 02f6f86..225a955 100644
--- a/contrib/llvm/tools/clang/include/clang/Frontend/FrontendOptions.h
+++ b/contrib/llvm/tools/clang/include/clang/Frontend/FrontendOptions.h
@@ -24,7 +24,6 @@ namespace frontend {
ASTDumpXML, ///< Parse ASTs and dump them in XML.
ASTPrint, ///< Parse ASTs and print them.
ASTView, ///< Parse ASTs and view them in Graphviz.
- BoostCon, ///< BoostCon mode.
CreateModule, ///< Create module definition
DumpRawTokens, ///< Dump out raw tokens.
DumpTokens, ///< Dump out preprocessed tokens.
@@ -77,6 +76,15 @@ public:
unsigned FixWhatYouCan : 1; ///< Apply fixes even if there are
/// unfixable errors.
+ enum {
+ ARCMT_None,
+ ARCMT_Check,
+ ARCMT_Modify,
+ ARCMT_Migrate
+ } ARCMTAction;
+
+ std::string ARCMTMigrateDir;
+
/// The input files and their types.
std::vector<std::pair<InputKind, std::string> > Inputs;
@@ -131,6 +139,7 @@ public:
ShowStats = 0;
ShowTimers = 0;
ShowVersion = 0;
+ ARCMTAction = ARCMT_None;
}
/// getInputKindForExtension - Return the appropriate input kind for a file
diff --git a/contrib/llvm/tools/clang/include/clang/Frontend/HeaderSearchOptions.h b/contrib/llvm/tools/clang/include/clang/Frontend/HeaderSearchOptions.h
index b0669eb..0347f98 100644
--- a/contrib/llvm/tools/clang/include/clang/Frontend/HeaderSearchOptions.h
+++ b/contrib/llvm/tools/clang/include/clang/Frontend/HeaderSearchOptions.h
@@ -17,10 +17,12 @@ namespace clang {
namespace frontend {
/// IncludeDirGroup - Identifiers the group a include entry belongs to, which
- /// represents its relative positive in the search list.
+ /// represents its relative positive in the search list. A #include of a ""
+ /// path starts at the -iquote group, then searches the Angled group, then
+ /// searches the system group, etc.
enum IncludeDirGroup {
- Quoted = 0, ///< `#include ""` paths. Thing `gcc -iquote`.
- Angled, ///< Paths for both `#include ""` and `#include <>`. (`-I`)
+ Quoted = 0, ///< '#include ""' paths, added by'gcc -iquote'.
+ Angled, ///< Paths for '#include <>' added by '-I'.
System, ///< Like Angled, but marks system directories.
CXXSystem, ///< Like System, but only used for C++.
After ///< Like System, but searched after the system directories.
@@ -37,15 +39,15 @@ public:
unsigned IsUserSupplied : 1;
unsigned IsFramework : 1;
- /// IsSysRootRelative - This is true if an absolute path should be treated
- /// relative to the sysroot, or false if it should always be the absolute
+ /// IgnoreSysRoot - This is false if an absolute path should be treated
+ /// relative to the sysroot, or true if it should always be the absolute
/// path.
- unsigned IsSysRootRelative : 1;
+ unsigned IgnoreSysRoot : 1;
Entry(llvm::StringRef path, frontend::IncludeDirGroup group,
- bool isUserSupplied, bool isFramework, bool isSysRootRelative)
+ bool isUserSupplied, bool isFramework, bool ignoreSysRoot)
: Path(path), Group(group), IsUserSupplied(isUserSupplied),
- IsFramework(isFramework), IsSysRootRelative(isSysRootRelative) {}
+ IsFramework(isFramework), IgnoreSysRoot(ignoreSysRoot) {}
};
/// If non-empty, the directory to use as a "virtual system root" for include
@@ -80,20 +82,23 @@ public:
/// Include the system standard C++ library include search directories.
unsigned UseStandardCXXIncludes : 1;
+ /// Use libc++ instead of the default libstdc++.
+ unsigned UseLibcxx : 1;
+
/// Whether header search information should be output as for -v.
unsigned Verbose : 1;
public:
HeaderSearchOptions(llvm::StringRef _Sysroot = "/")
: Sysroot(_Sysroot), UseBuiltinIncludes(true),
- UseStandardIncludes(true), UseStandardCXXIncludes(true),
+ UseStandardIncludes(true), UseStandardCXXIncludes(true), UseLibcxx(false),
Verbose(false) {}
/// AddPath - Add the \arg Path path to the specified \arg Group list.
void AddPath(llvm::StringRef Path, frontend::IncludeDirGroup Group,
- bool IsUserSupplied, bool IsFramework, bool IsSysRootRelative) {
+ bool IsUserSupplied, bool IsFramework, bool IgnoreSysRoot) {
UserEntries.push_back(Entry(Path, Group, IsUserSupplied, IsFramework,
- IsSysRootRelative));
+ IgnoreSysRoot));
}
};
diff --git a/contrib/llvm/tools/clang/include/clang/Frontend/PreprocessorOptions.h b/contrib/llvm/tools/clang/include/clang/Frontend/PreprocessorOptions.h
index e471c5c..2e16c97 100644
--- a/contrib/llvm/tools/clang/include/clang/Frontend/PreprocessorOptions.h
+++ b/contrib/llvm/tools/clang/include/clang/Frontend/PreprocessorOptions.h
@@ -1,4 +1,4 @@
-//===--- PreprocessorOptionms.h ---------------------------------*- C++ -*-===//
+//===--- PreprocessorOptions.h ----------------------------------*- C++ -*-===//
//
// The LLVM Compiler Infrastructure
//
@@ -26,6 +26,15 @@ namespace clang {
class Preprocessor;
class LangOptions;
+/// \brief Enumerate the kinds of standard library that
+enum ObjCXXARCStandardLibraryKind {
+ ARCXX_nolib,
+ /// \brief libc++
+ ARCXX_libcxx,
+ /// \brief libstdc++
+ ARCXX_libstdcxx
+};
+
/// PreprocessorOptions - This class is used for passing the various options
/// used in preprocessor initialization to InitializePreprocessor().
class PreprocessorOptions {
@@ -39,11 +48,11 @@ public:
unsigned DetailedRecord : 1; /// Whether we should maintain a detailed
/// record of all macro definitions and
- /// instantiations.
+ /// expansions.
/// \brief Whether the detailed preprocessing record includes nested macro
- /// instantiations.
- unsigned DetailedRecordIncludesNestedMacroInstantiations : 1;
+ /// expansions.
+ unsigned DetailedRecordIncludesNestedMacroExpansions : 1;
/// The implicit PCH included at the start of the translation unit, or empty.
std::string ImplicitPCHInclude;
@@ -104,6 +113,11 @@ public:
/// compiler invocation and its buffers will be reused.
bool RetainRemappedFileBuffers;
+ /// \brief The Objective-C++ ARC standard library that we should support,
+ /// by providing appropriate definitions to retrofit the standard library
+ /// with support for lifetime-qualified pointers.
+ ObjCXXARCStandardLibraryKind ObjCXXARCStandardLibrary;
+
typedef std::vector<std::pair<std::string, std::string> >::iterator
remapped_file_iterator;
typedef std::vector<std::pair<std::string, std::string> >::const_iterator
@@ -140,12 +154,13 @@ public:
public:
PreprocessorOptions() : UsePredefines(true), DetailedRecord(false),
- DetailedRecordIncludesNestedMacroInstantiations(true),
+ DetailedRecordIncludesNestedMacroExpansions(true),
DisablePCHValidation(false), DisableStatCache(false),
DumpDeserializedPCHDecls(false),
PrecompiledPreambleBytes(0, true),
RemappedFilesKeepOriginalName(true),
- RetainRemappedFileBuffers(false) { }
+ RetainRemappedFileBuffers(false),
+ ObjCXXARCStandardLibrary(ARCXX_nolib) { }
void addMacroDef(llvm::StringRef Name) {
Macros.push_back(std::make_pair(Name, false));
diff --git a/contrib/llvm/tools/clang/include/clang/Frontend/TextDiagnosticPrinter.h b/contrib/llvm/tools/clang/include/clang/Frontend/TextDiagnosticPrinter.h
index d7d2692..79a9916 100644
--- a/contrib/llvm/tools/clang/include/clang/Frontend/TextDiagnosticPrinter.h
+++ b/contrib/llvm/tools/clang/include/clang/Frontend/TextDiagnosticPrinter.h
@@ -62,18 +62,17 @@ public:
std::string &CaretLine,
const std::string &SourceLine);
- void EmitCaretDiagnostic(Diagnostic::Level Level, SourceLocation Loc,
- CharSourceRange *Ranges, unsigned NumRanges,
- const SourceManager &SM,
- const FixItHint *Hints,
- unsigned NumHints,
- unsigned Columns,
- unsigned OnMacroInst,
- unsigned MacroSkipStart,
- unsigned MacroSkipEnd);
-
virtual void HandleDiagnostic(Diagnostic::Level Level,
const DiagnosticInfo &Info);
+
+private:
+ void EmitCaretDiagnostic(SourceLocation Loc, CharSourceRange *Ranges,
+ unsigned NumRanges, const SourceManager &SM,
+ const FixItHint *Hints,
+ unsigned NumHints, unsigned Columns,
+ unsigned OnMacroInst, unsigned MacroSkipStart,
+ unsigned MacroSkipEnd);
+
};
} // end namespace clang
diff --git a/contrib/llvm/tools/clang/include/clang/Frontend/Utils.h b/contrib/llvm/tools/clang/include/clang/Frontend/Utils.h
index 3c34c2d..93d2c7d 100644
--- a/contrib/llvm/tools/clang/include/clang/Frontend/Utils.h
+++ b/contrib/llvm/tools/clang/include/clang/Frontend/Utils.h
@@ -19,6 +19,7 @@
#include "llvm/ADT/ArrayRef.h"
#include "llvm/ADT/IntrusiveRefCntPtr.h"
#include "llvm/Support/raw_ostream.h"
+#include "clang/Basic/Diagnostic.h"
namespace llvm {
class Triple;
diff --git a/contrib/llvm/tools/clang/include/clang/Lex/Lexer.h b/contrib/llvm/tools/clang/include/clang/Lex/Lexer.h
index 7c3d863..f429762 100644
--- a/contrib/llvm/tools/clang/include/clang/Lex/Lexer.h
+++ b/contrib/llvm/tools/clang/include/clang/Lex/Lexer.h
@@ -95,8 +95,8 @@ public:
/// _Pragma expansion. This has a variety of magic semantics that this method
/// sets up. It returns a new'd Lexer that must be delete'd when done.
static Lexer *Create_PragmaLexer(SourceLocation SpellingLoc,
- SourceLocation InstantiationLocStart,
- SourceLocation InstantiationLocEnd,
+ SourceLocation ExpansionLocStart,
+ SourceLocation ExpansionLocEnd,
unsigned TokLen, Preprocessor &PP);
@@ -241,8 +241,8 @@ public:
/// is not necessary to copy any data, then the returned string may
/// not point into the provided buffer.
///
- /// This method lexes at the instantiation depth of the given
- /// location and does not jump to the instantiation or spelling
+ /// This method lexes at the expansion depth of the given
+ /// location and does not jump to the expansion or spelling
/// location.
static llvm::StringRef getSpelling(SourceLocation loc,
llvm::SmallVectorImpl<char> &buffer,
@@ -293,7 +293,19 @@ public:
static SourceLocation getLocForEndOfToken(SourceLocation Loc, unsigned Offset,
const SourceManager &SM,
const LangOptions &Features);
-
+
+ /// \brief Returns true if the given MacroID location points at the first
+ /// token of the macro expansion.
+ static bool isAtStartOfMacroExpansion(SourceLocation loc,
+ const SourceManager &SM,
+ const LangOptions &LangOpts);
+
+ /// \brief Returns true if the given MacroID location points at the last
+ /// token of the macro expansion.
+ static bool isAtEndOfMacroExpansion(SourceLocation loc,
+ const SourceManager &SM,
+ const LangOptions &LangOpts);
+
/// \brief Compute the preamble of the given file.
///
/// The preamble of a file contains the initial comments, include directives,
diff --git a/contrib/llvm/tools/clang/include/clang/Lex/LiteralSupport.h b/contrib/llvm/tools/clang/include/clang/Lex/LiteralSupport.h
index ec3d9c5..0dbcd6d 100644
--- a/contrib/llvm/tools/clang/include/clang/Lex/LiteralSupport.h
+++ b/contrib/llvm/tools/clang/include/clang/Lex/LiteralSupport.h
@@ -167,7 +167,9 @@ public:
bool AnyWide;
bool Pascal;
- const char *GetString() { return ResultBuf.data(); }
+ llvm::StringRef GetString() const {
+ return llvm::StringRef(ResultBuf.data(), GetStringLength());
+ }
unsigned GetStringLength() const { return ResultPtr-ResultBuf.data(); }
unsigned GetNumStringChars() const {
diff --git a/contrib/llvm/tools/clang/include/clang/Lex/MacroInfo.h b/contrib/llvm/tools/clang/include/clang/Lex/MacroInfo.h
index 7c4cfb0..9e9d7cf 100644
--- a/contrib/llvm/tools/clang/include/clang/Lex/MacroInfo.h
+++ b/contrib/llvm/tools/clang/include/clang/Lex/MacroInfo.h
@@ -43,6 +43,10 @@ class MacroInfo {
/// to.
llvm::SmallVector<Token, 8> ReplacementTokens;
+ /// \brief Length in characters of the macro definition.
+ mutable unsigned DefinitionLength;
+ mutable bool IsDefinitionLengthCached : 1;
+
/// IsFunctionLike - True if this macro is a function-like macro, false if it
/// is an object-like macro.
bool IsFunctionLike : 1;
@@ -116,6 +120,13 @@ public:
/// getDefinitionEndLoc - Return the location of the last token in the macro.
///
SourceLocation getDefinitionEndLoc() const { return EndLocation; }
+
+ /// \brief Get length in characters of the macro definition.
+ unsigned getDefinitionLength(SourceManager &SM) const {
+ if (IsDefinitionLengthCached)
+ return DefinitionLength;
+ return getDefinitionLengthSlow(SM);
+ }
/// isIdenticalTo - Return true if the specified macro definition is equal to
/// this macro in spelling, arguments, and whitespace. This is used to emit
@@ -232,6 +243,8 @@ public:
/// AddTokenToBody - Add the specified token to the replacement text for the
/// macro.
void AddTokenToBody(const Token &Tok) {
+ assert(!IsDefinitionLengthCached &&
+ "Changing replacement tokens after definition length got calculated");
ReplacementTokens.push_back(Tok);
}
@@ -248,6 +261,9 @@ public:
assert(!IsDisabled && "Cannot disable an already-disabled macro!");
IsDisabled = true;
}
+
+private:
+ unsigned getDefinitionLengthSlow(SourceManager &SM) const;
};
} // end namespace clang
diff --git a/contrib/llvm/tools/clang/include/clang/Lex/PPCallbacks.h b/contrib/llvm/tools/clang/include/clang/Lex/PPCallbacks.h
index fd07a29..a794815 100644
--- a/contrib/llvm/tools/clang/include/clang/Lex/PPCallbacks.h
+++ b/contrib/llvm/tools/clang/include/clang/Lex/PPCallbacks.h
@@ -16,6 +16,7 @@
#include "clang/Lex/DirectoryLookup.h"
#include "clang/Basic/SourceLocation.h"
+#include "clang/Basic/DiagnosticIDs.h"
#include "llvm/ADT/StringRef.h"
#include <string>
@@ -124,6 +125,24 @@ public:
virtual void PragmaMessage(SourceLocation Loc, llvm::StringRef Str) {
}
+ /// PragmaDiagnosticPush - This callback is invoked when a
+ /// #pragma gcc dianostic push directive is read.
+ virtual void PragmaDiagnosticPush(SourceLocation Loc,
+ llvm::StringRef Namespace) {
+ }
+
+ /// PragmaDiagnosticPop - This callback is invoked when a
+ /// #pragma gcc dianostic pop directive is read.
+ virtual void PragmaDiagnosticPop(SourceLocation Loc,
+ llvm::StringRef Namespace) {
+ }
+
+ /// PragmaDiagnostic - This callback is invoked when a
+ /// #pragma gcc dianostic directive is read.
+ virtual void PragmaDiagnostic(SourceLocation Loc, llvm::StringRef Namespace,
+ diag::Mapping mapping, llvm::StringRef Str) {
+ }
+
/// MacroExpands - This is called by
/// Preprocessor::HandleMacroExpandedIdentifier when a macro invocation is
/// found.
@@ -232,6 +251,24 @@ public:
Second->PragmaMessage(Loc, Str);
}
+ virtual void PragmaDiagnosticPush(SourceLocation Loc,
+ llvm::StringRef Namespace) {
+ First->PragmaDiagnosticPush(Loc, Namespace);
+ Second->PragmaDiagnosticPush(Loc, Namespace);
+ }
+
+ virtual void PragmaDiagnosticPop(SourceLocation Loc,
+ llvm::StringRef Namespace) {
+ First->PragmaDiagnosticPop(Loc, Namespace);
+ Second->PragmaDiagnosticPop(Loc, Namespace);
+ }
+
+ virtual void PragmaDiagnostic(SourceLocation Loc, llvm::StringRef Namespace,
+ diag::Mapping mapping, llvm::StringRef Str) {
+ First->PragmaDiagnostic(Loc, Namespace, mapping, Str);
+ Second->PragmaDiagnostic(Loc, Namespace, mapping, Str);
+ }
+
virtual void MacroExpands(const Token &MacroNameTok, const MacroInfo* MI) {
First->MacroExpands(MacroNameTok, MI);
Second->MacroExpands(MacroNameTok, MI);
diff --git a/contrib/llvm/tools/clang/include/clang/Lex/PreprocessingRecord.h b/contrib/llvm/tools/clang/include/clang/Lex/PreprocessingRecord.h
index e498e9d..b38303a 100644
--- a/contrib/llvm/tools/clang/include/clang/Lex/PreprocessingRecord.h
+++ b/contrib/llvm/tools/clang/include/clang/Lex/PreprocessingRecord.h
@@ -38,13 +38,13 @@ namespace clang {
class FileEntry;
/// \brief Base class that describes a preprocessed entity, which may be a
- /// preprocessor directive or macro instantiation.
+ /// preprocessor directive or macro expansion.
class PreprocessedEntity {
public:
/// \brief The kind of preprocessed entity an object describes.
enum EntityKind {
- /// \brief A macro instantiation.
- MacroInstantiationKind,
+ /// \brief A macro expansion.
+ MacroExpansionKind,
/// \brief A preprocessing directive whose kind is not specified.
///
@@ -110,31 +110,31 @@ namespace clang {
void operator delete(void* data) throw();
};
- /// \brief Records the location of a macro instantiation.
- class MacroInstantiation : public PreprocessedEntity {
- /// \brief The name of the macro being instantiation.
+ /// \brief Records the location of a macro expansion.
+ class MacroExpansion : public PreprocessedEntity {
+ /// \brief The name of the macro being expanded.
IdentifierInfo *Name;
/// \brief The definition of this macro.
MacroDefinition *Definition;
public:
- MacroInstantiation(IdentifierInfo *Name, SourceRange Range,
- MacroDefinition *Definition)
- : PreprocessedEntity(MacroInstantiationKind, Range), Name(Name),
+ MacroExpansion(IdentifierInfo *Name, SourceRange Range,
+ MacroDefinition *Definition)
+ : PreprocessedEntity(MacroExpansionKind, Range), Name(Name),
Definition(Definition) { }
- /// \brief The name of the macro being instantiated.
+ /// \brief The name of the macro being expanded.
IdentifierInfo *getName() const { return Name; }
- /// \brief The definition of the macro being instantiated.
+ /// \brief The definition of the macro being expanded.
MacroDefinition *getDefinition() const { return Definition; }
// Implement isa/cast/dyncast/etc.
static bool classof(const PreprocessedEntity *PE) {
- return PE->getKind() == MacroInstantiationKind;
+ return PE->getKind() == MacroExpansionKind;
}
- static bool classof(const MacroInstantiation *) { return true; }
+ static bool classof(const MacroExpansion *) { return true; }
};
@@ -256,11 +256,11 @@ namespace clang {
/// \brief A record of the steps taken while preprocessing a source file,
/// including the various preprocessing directives processed, macros
- /// instantiated, etc.
+ /// expanded, etc.
class PreprocessingRecord : public PPCallbacks {
- /// \brief Whether we should include nested macro instantiations in
+ /// \brief Whether we should include nested macro expansions in
/// the preprocessing record.
- bool IncludeNestedMacroInstantiations;
+ bool IncludeNestedMacroExpansions;
/// \brief Allocator used to store preprocessing objects.
llvm::BumpPtrAllocator BumpAlloc;
@@ -286,7 +286,7 @@ namespace clang {
public:
/// \brief Construct
- explicit PreprocessingRecord(bool IncludeNestedMacroInstantiations);
+ explicit PreprocessingRecord(bool IncludeNestedMacroExpansions);
/// \brief Allocate memory in the preprocessing record.
void *Allocate(unsigned Size, unsigned Align = 8) {
diff --git a/contrib/llvm/tools/clang/include/clang/Lex/Preprocessor.h b/contrib/llvm/tools/clang/include/clang/Lex/Preprocessor.h
index 76e3f59..f6f3205 100644
--- a/contrib/llvm/tools/clang/include/clang/Lex/Preprocessor.h
+++ b/contrib/llvm/tools/clang/include/clang/Lex/Preprocessor.h
@@ -29,6 +29,7 @@
#include "llvm/ADT/SmallPtrSet.h"
#include "llvm/ADT/OwningPtr.h"
#include "llvm/ADT/SmallVector.h"
+#include "llvm/ADT/ArrayRef.h"
#include "llvm/Support/Allocator.h"
#include <vector>
@@ -120,7 +121,7 @@ class Preprocessor : public llvm::RefCountedBase<Preprocessor> {
/// Selectors - This table contains all the selectors in the program. Unlike
/// IdentifierTable above, this table *isn't* populated by the preprocessor.
- /// It is declared/instantiated here because it's role/lifetime is
+ /// It is declared/expanded here because it's role/lifetime is
/// conceptually similar the IdentifierTable. In addition, the current control
/// flow (in clang::ParseAST()), make it convenient to put here.
/// FIXME: Make sure the lifetime of Identifiers/Selectors *isn't* tied to
@@ -219,9 +220,9 @@ class Preprocessor : public llvm::RefCountedBase<Preprocessor> {
/// previous macro value.
llvm::DenseMap<IdentifierInfo*, std::vector<MacroInfo*> > PragmaPushMacroInfo;
- /// \brief Instantiation source location for the last macro that expanded
+ /// \brief Expansion source location for the last macro that expanded
/// to no tokens.
- SourceLocation LastEmptyMacroInstantiationLoc;
+ SourceLocation LastEmptyMacroExpansionLoc;
// Various statistics we track for performance analysis.
unsigned NumDirectives, NumIncluded, NumDefined, NumUndefined, NumPragma;
@@ -240,7 +241,15 @@ class Preprocessor : public llvm::RefCountedBase<Preprocessor> {
unsigned NumCachedTokenLexers;
TokenLexer *TokenLexerCache[TokenLexerCacheSize];
- /// \brief A record of the macro definitions and instantiations that
+ /// \brief Keeps macro expanded tokens for TokenLexers.
+ //
+ /// Works like a stack; a TokenLexer adds the macro expanded tokens that is
+ /// going to lex in the cache and when it finishes the tokens are removed
+ /// from the end of the cache.
+ llvm::SmallVector<Token, 16> MacroExpandedTokens;
+ std::vector<std::pair<TokenLexer *, size_t> > MacroExpandingLexersStack;
+
+ /// \brief A record of the macro definitions and expansions that
/// occurred during preprocessing.
///
/// This is an optional side structure that can be enabled with
@@ -371,10 +380,10 @@ public:
macro_iterator macro_begin(bool IncludeExternalMacros = true) const;
macro_iterator macro_end(bool IncludeExternalMacros = true) const;
- /// \brief Instantiation source location for the last macro that expanded
+ /// \brief Expansion source location for the last macro that expanded
/// to no tokens.
- SourceLocation getLastEmptyMacroInstantiationLoc() const {
- return LastEmptyMacroInstantiationLoc;
+ SourceLocation getLastEmptyMacroExpansionLoc() const {
+ return LastEmptyMacroExpansionLoc;
}
const std::string &getPredefines() const { return Predefines; }
@@ -442,7 +451,7 @@ public:
/// \brief Create a new preprocessing record, which will keep track of
/// all macro expansions, macro definitions, etc.
- void createPreprocessingRecord(bool IncludeNestedMacroInstantiations);
+ void createPreprocessingRecord(bool IncludeNestedMacroExpansions);
/// EnterMainSourceFile - Enter the specified FileID as the main source file,
/// which implicitly adds the builtin defines etc.
@@ -658,7 +667,7 @@ public:
/// getSpelling() - Return the 'spelling' of the token at the given
/// location; does not go up to the spelling location or down to the
- /// instantiation location.
+ /// expansion location.
///
/// \param buffer A buffer which will be used only if the token requires
/// "cleaning", e.g. if it contains trigraphs or escaped newlines
@@ -721,7 +730,7 @@ public:
/// CreateString - Plop the specified string into a scratch buffer and set the
/// specified token's location and length to it. If specified, the source
- /// location provides a location of the instantiation point of the token.
+ /// location provides a location of the expansion point of the token.
void CreateString(const char *Buf, unsigned Len,
Token &Tok, SourceLocation SourceLoc = SourceLocation());
@@ -744,6 +753,18 @@ public:
return Lexer::getLocForEndOfToken(Loc, Offset, SourceMgr, Features);
}
+ /// \brief Returns true if the given MacroID location points at the first
+ /// token of the macro expansion.
+ bool isAtStartOfMacroExpansion(SourceLocation loc) const {
+ return Lexer::isAtStartOfMacroExpansion(loc, SourceMgr, Features);
+ }
+
+ /// \brief Returns true if the given MacroID location points at the last
+ /// token of the macro expansion.
+ bool isAtEndOfMacroExpansion(SourceLocation loc) const {
+ return Lexer::isAtEndOfMacroExpansion(loc, SourceMgr, Features);
+ }
+
/// DumpToken - Print the token to stderr, used for debugging.
///
void DumpToken(const Token &Tok, bool DumpFlags = false) const;
@@ -770,6 +791,8 @@ public:
void PrintStats();
+ size_t getTotalMemory() const;
+
/// HandleMicrosoftCommentPaste - When the macro expander pastes together a
/// comment (/##/) in microsoft mode, this method handles updating the current
/// state, returning the token on the next source line.
@@ -977,6 +1000,16 @@ private:
/// the macro should not be expanded return true, otherwise return false.
bool HandleMacroExpandedIdentifier(Token &Tok, MacroInfo *MI);
+ /// \brief Cache macro expanded tokens for TokenLexers.
+ //
+ /// Works like a stack; a TokenLexer adds the macro expanded tokens that is
+ /// going to lex in the cache and when it finishes the tokens are removed
+ /// from the end of the cache.
+ Token *cacheMacroExpandedTokens(TokenLexer *tokLexer,
+ llvm::ArrayRef<Token> tokens);
+ void removeCachedMacroExpandedTokensOfLastLexer();
+ friend void TokenLexer::ExpandFunctionArguments();
+
/// isNextPPTokenLParen - Determine whether the next preprocessor token to be
/// lexed is a '('. If so, consume the token and return true, if not, this
/// method should have no observable side-effect on the lexed tokens.
@@ -986,7 +1019,7 @@ private:
/// invoked to read all of the formal arguments specified for the macro
/// invocation. This returns null on error.
MacroArgs *ReadFunctionLikeMacroArgs(Token &MacroName, MacroInfo *MI,
- SourceLocation &InstantiationEnd);
+ SourceLocation &ExpansionEnd);
/// ExpandBuiltinMacro - If an identifier token is read that is to be expanded
/// as a builtin macro, handle it and return the next token as 'Tok'.
diff --git a/contrib/llvm/tools/clang/include/clang/Lex/Token.h b/contrib/llvm/tools/clang/include/clang/Lex/Token.h
index edcfcc10d..9cf11d9 100644
--- a/contrib/llvm/tools/clang/include/clang/Lex/Token.h
+++ b/contrib/llvm/tools/clang/include/clang/Lex/Token.h
@@ -63,9 +63,7 @@ class Token {
/// Kind - The actual flavor of token this is.
///
- unsigned char Kind; // DON'T make Kind a 'tok::TokenKind';
- // MSVC will treat it as a signed char and
- // TokenKinds > 127 won't be handled correctly.
+ unsigned short Kind;
/// Flags - Bits we track about this token, members of the TokenFlags enum.
unsigned char Flags;
diff --git a/contrib/llvm/tools/clang/include/clang/Lex/TokenLexer.h b/contrib/llvm/tools/clang/include/clang/Lex/TokenLexer.h
index 6ae00cd..45ff8a0 100644
--- a/contrib/llvm/tools/clang/include/clang/Lex/TokenLexer.h
+++ b/contrib/llvm/tools/clang/include/clang/Lex/TokenLexer.h
@@ -43,10 +43,13 @@ class TokenLexer {
/// Tokens - This is the pointer to an array of tokens that the macro is
/// defined to, with arguments expanded for function-like macros. If this is
/// a token stream, these are the tokens we are returning. This points into
- /// the macro definition we are lexing from, a scratch buffer allocated from
- /// the preprocessor's bump pointer allocator, or some other buffer that we
- /// may or may not own (depending on OwnsTokens).
+ /// the macro definition we are lexing from, a cache buffer that is owned by
+ /// the preprocessor, or some other buffer that we may or may not own
+ /// (depending on OwnsTokens).
+ /// Note that if it points into Preprocessor's cache buffer, the Preprocessor
+ /// may update the pointer as needed.
const Token *Tokens;
+ friend class Preprocessor;
/// NumTokens - This is the length of the Tokens array.
///
@@ -56,9 +59,20 @@ class TokenLexer {
///
unsigned CurToken;
- /// InstantiateLocStart/End - The source location range where this macro was
- /// instantiated.
- SourceLocation InstantiateLocStart, InstantiateLocEnd;
+ /// ExpandLocStart/End - The source location range where this macro was
+ /// expanded.
+ SourceLocation ExpandLocStart, ExpandLocEnd;
+
+ /// \brief Source location pointing at the source location entry chunk that
+ /// was reserved for the current macro expansion.
+ SourceLocation MacroExpansionStart;
+
+ /// \brief The offset of the macro expansion in the
+ /// "source location address space".
+ unsigned MacroStartSLocOffset;
+
+ /// \brief FileID/offset of the start of the macro definition.
+ std::pair<FileID, unsigned> MacroDefStartInfo;
/// Lexical information about the expansion point of the macro: the identifier
/// that the macro expanded from had these properties.
@@ -148,9 +162,14 @@ private:
/// HandleMicrosoftCommentPaste - In microsoft compatibility mode, /##/ pastes
/// together to form a comment that comments out everything in the current
/// macro, other active macros, and anything left on the current physical
- /// source line of the instantiated buffer. Handle this by returning the
+ /// source line of the expanded buffer. Handle this by returning the
/// first token on the next line.
void HandleMicrosoftCommentPaste(Token &Tok);
+
+ /// \brief If \arg loc is a FileID and points inside the current macro
+ /// definition, returns the appropriate source location pointing at the
+ /// macro expansion source location entry.
+ SourceLocation getMacroExpansionLocation(SourceLocation loc) const;
};
} // end namespace clang
diff --git a/contrib/llvm/tools/clang/include/clang/Parse/Parser.h b/contrib/llvm/tools/clang/include/clang/Parse/Parser.h
index e4cdc27..8f49dda 100644
--- a/contrib/llvm/tools/clang/include/clang/Parse/Parser.h
+++ b/contrib/llvm/tools/clang/include/clang/Parse/Parser.h
@@ -15,6 +15,7 @@
#define LLVM_CLANG_PARSE_PARSER_H
#include "clang/Basic/Specifiers.h"
+#include "clang/Basic/DelayedCleanupPool.h"
#include "clang/Lex/Preprocessor.h"
#include "clang/Lex/CodeCompletionHandler.h"
#include "clang/Sema/Sema.h"
@@ -170,6 +171,10 @@ class Parser : public CodeCompletionHandler {
/// Factory object for creating AttributeList objects.
AttributeFactory AttrFactory;
+ /// \brief Gathers and cleans up objects when parsing of a top-level
+ /// declaration is finished.
+ DelayedCleanupPool TopLevelDeclCleanupPool;
+
public:
Parser(Preprocessor &PP, Sema &Actions);
~Parser();
@@ -419,25 +424,7 @@ private:
Tok.setAnnotationValue(ER.get());
}
- /// TryAnnotateTypeOrScopeToken - If the current token position is on a
- /// typename (possibly qualified in C++) or a C++ scope specifier not followed
- /// by a typename, TryAnnotateTypeOrScopeToken will replace one or more tokens
- /// with a single annotation token representing the typename or C++ scope
- /// respectively.
- /// This simplifies handling of C++ scope specifiers and allows efficient
- /// backtracking without the need to re-parse and resolve nested-names and
- /// typenames.
- /// It will mainly be called when we expect to treat identifiers as typenames
- /// (if they are typenames). For example, in C we do not expect identifiers
- /// inside expressions to be treated as typenames so it will not be called
- /// for expressions in C.
- ///
- /// This returns true if the token was annotated.
bool TryAnnotateTypeOrScopeToken(bool EnteringContext = false);
-
- /// TryAnnotateCXXScopeToken - Like TryAnnotateTypeOrScopeToken but
- /// only annotates C++ scope specifiers. This returns true if there
- /// was an unrecoverable error.
bool TryAnnotateCXXScopeToken(bool EnteringContext = false);
/// TryAltiVecToken - Check for context-sensitive AltiVec identifier tokens,
@@ -467,7 +454,12 @@ private:
bool TryAltiVecTokenOutOfLine(DeclSpec &DS, SourceLocation Loc,
const char *&PrevSpec, unsigned &DiagID,
bool &isInvalid);
-
+
+ /// \brief Get the TemplateIdAnnotation from the token and put it in the
+ /// cleanup pool so that it gets destroyed when parsing the current top level
+ /// declaration is finished.
+ TemplateIdAnnotation *takeTemplateIdAnnotation(const Token &tok);
+
/// TentativeParsingAction - An object that is used as a kind of "tentative
/// parsing transaction". It gets instantiated to mark the token position and
/// after the token consumption is done, Commit() or Revert() is called to
@@ -507,12 +499,6 @@ private:
};
- /// MatchRHSPunctuation - For punctuation with a LHS and RHS (e.g. '['/']'),
- /// this helper function matches and consumes the specified RHS token if
- /// present. If not present, it emits the specified diagnostic indicating
- /// that the parser failed to match the RHS of the token at LHSLoc. LHSName
- /// should be the name of the unmatched LHS token. This returns the location
- /// of the consumed token.
SourceLocation MatchRHSPunctuation(tok::TokenKind RHSTok,
SourceLocation LHSLoc);
@@ -1125,10 +1111,10 @@ private:
ExprResult ParseCastExpression(bool isUnaryExpression,
bool isAddressOfOperand,
bool &NotCastExpr,
- ParsedType TypeOfCast);
+ bool isTypeCast);
ExprResult ParseCastExpression(bool isUnaryExpression,
bool isAddressOfOperand = false,
- ParsedType TypeOfCast = ParsedType());
+ bool isTypeCast = false);
/// Returns true if the next token would start a postfix-expression
/// suffix.
@@ -1169,7 +1155,7 @@ private:
};
ExprResult ParseParenExpression(ParenParseOption &ExprType,
bool stopIfCastExpr,
- ParsedType TypeOfCast,
+ bool isTypeCast,
ParsedType &CastTy,
SourceLocation &RParenLoc);
@@ -1328,6 +1314,9 @@ private:
StmtResult ParseDefaultStatement(ParsedAttributes &Attr);
StmtResult ParseCompoundStatement(ParsedAttributes &Attr,
bool isStmtExpr = false);
+ StmtResult ParseCompoundStatement(ParsedAttributes &Attr,
+ bool isStmtExpr,
+ unsigned ScopeFlags);
StmtResult ParseCompoundStatementBody(bool isStmtExpr = false);
bool ParseParenExprOrCondition(ExprResult &ExprResult,
Decl *&DeclResult,
@@ -1375,6 +1364,7 @@ bool ParseAsmOperandsOpt(llvm::SmallVectorImpl<IdentifierInfo *> &Names,
StmtResult ParseObjCTryStmt(SourceLocation atLoc);
StmtResult ParseObjCThrowStmt(SourceLocation atLoc);
StmtResult ParseObjCSynchronizedStmt(SourceLocation atLoc);
+ StmtResult ParseObjCAutoreleasePoolStmt(SourceLocation atLoc);
//===--------------------------------------------------------------------===//
@@ -1439,7 +1429,7 @@ bool ParseAsmOperandsOpt(llvm::SmallVectorImpl<IdentifierInfo *> &Names,
const ParsedTemplateInfo &TemplateInfo = ParsedTemplateInfo(),
bool SuppressDeclarations = false);
- void ParseSpecifierQualifierList(DeclSpec &DS);
+ void ParseSpecifierQualifierList(DeclSpec &DS, AccessSpecifier AS = AS_none);
void ParseObjCTypeQualifierList(ObjCDeclSpec &DS,
ObjCTypeNameContext Context);
@@ -1616,7 +1606,10 @@ bool ParseAsmOperandsOpt(llvm::SmallVectorImpl<IdentifierInfo *> &Names,
TypeResult ParseTypeName(SourceRange *Range = 0,
Declarator::TheContext Context
- = Declarator::TypeNameContext);
+ = Declarator::TypeNameContext,
+ ObjCDeclSpec *objcQuals = 0,
+ AccessSpecifier AS = AS_none,
+ Decl **OwnedType = 0);
void ParseBlockId();
void ProhibitAttributes(ParsedAttributesWithRange &attrs) {
@@ -1742,10 +1735,15 @@ bool ParseAsmOperandsOpt(llvm::SmallVectorImpl<IdentifierInfo *> &Names,
void ParseFunctionDeclarator(SourceLocation LParenLoc, Declarator &D,
ParsedAttributes &attrs,
bool RequiresArg = false);
- void ParseFunctionDeclaratorIdentifierList(SourceLocation LParenLoc,
- IdentifierInfo *FirstIdent,
- SourceLocation FirstIdentLoc,
- Declarator &D);
+ bool isFunctionDeclaratorIdentifierList();
+ void ParseFunctionDeclaratorIdentifierList(
+ Declarator &D,
+ llvm::SmallVector<DeclaratorChunk::ParamInfo, 16> &ParamInfo);
+ void ParseParameterDeclarationClause(
+ Declarator &D,
+ ParsedAttributes &attrs,
+ llvm::SmallVector<DeclaratorChunk::ParamInfo, 16> &ParamInfo,
+ SourceLocation &EllipsisLoc);
void ParseBracketDeclarator(Declarator &D);
//===--------------------------------------------------------------------===//
@@ -1766,7 +1764,8 @@ bool ParseAsmOperandsOpt(llvm::SmallVectorImpl<IdentifierInfo *> &Names,
Decl *ParseUsingDirectiveOrDeclaration(unsigned Context,
const ParsedTemplateInfo &TemplateInfo,
SourceLocation &DeclEnd,
- ParsedAttributesWithRange &attrs);
+ ParsedAttributesWithRange &attrs,
+ Decl **OwnedType = 0);
Decl *ParseUsingDirective(unsigned Context,
SourceLocation UsingLoc,
SourceLocation &DeclEnd,
@@ -1775,7 +1774,8 @@ bool ParseAsmOperandsOpt(llvm::SmallVectorImpl<IdentifierInfo *> &Names,
const ParsedTemplateInfo &TemplateInfo,
SourceLocation UsingLoc,
SourceLocation &DeclEnd,
- AccessSpecifier AS = AS_none);
+ AccessSpecifier AS = AS_none,
+ Decl **OwnedType = 0);
Decl *ParseStaticAssertDeclaration(SourceLocation &DeclEnd);
Decl *ParseNamespaceAlias(SourceLocation NamespaceLoc,
SourceLocation AliasLoc, IdentifierInfo *Alias,
diff --git a/contrib/llvm/tools/clang/include/clang/Rewrite/FixItRewriter.h b/contrib/llvm/tools/clang/include/clang/Rewrite/FixItRewriter.h
index 26a0d72..bab9962 100644
--- a/contrib/llvm/tools/clang/include/clang/Rewrite/FixItRewriter.h
+++ b/contrib/llvm/tools/clang/include/clang/Rewrite/FixItRewriter.h
@@ -18,7 +18,6 @@
#include "clang/Basic/Diagnostic.h"
#include "clang/Basic/SourceLocation.h"
#include "clang/Rewrite/Rewriter.h"
-#include "llvm/ADT/SmallVector.h"
namespace llvm { class raw_ostream; }
diff --git a/contrib/llvm/tools/clang/include/clang/Rewrite/Rewriter.h b/contrib/llvm/tools/clang/include/clang/Rewrite/Rewriter.h
index 7861e99..676744a 100644
--- a/contrib/llvm/tools/clang/include/clang/Rewrite/Rewriter.h
+++ b/contrib/llvm/tools/clang/include/clang/Rewrite/Rewriter.h
@@ -183,8 +183,11 @@ public:
/// InsertText - Insert the specified string at the specified location in the
/// original buffer. This method returns true (and does nothing) if the input
/// location was not rewritable, false otherwise.
+ ///
+ /// \param indentNewLines if true new lines in the string are indented
+ /// using the indentation of the source line in position \arg Loc.
bool InsertText(SourceLocation Loc, llvm::StringRef Str,
- bool InsertAfter = true);
+ bool InsertAfter = true, bool indentNewLines = false);
/// InsertTextAfter - Insert the specified string at the specified location in
/// the original buffer. This method returns true (and does nothing) if
diff --git a/contrib/llvm/tools/clang/include/clang/Sema/AnalysisBasedWarnings.h b/contrib/llvm/tools/clang/include/clang/Sema/AnalysisBasedWarnings.h
index 8b389b1..8e781cd 100644
--- a/contrib/llvm/tools/clang/include/clang/Sema/AnalysisBasedWarnings.h
+++ b/contrib/llvm/tools/clang/include/clang/Sema/AnalysisBasedWarnings.h
@@ -14,7 +14,6 @@
#ifndef LLVM_CLANG_SEMA_ANALYSIS_WARNINGS_H
#define LLVM_CLANG_SEMA_ANALYSIS_WARNINGS_H
-#include "llvm/ADT/SmallVector.h"
#include "llvm/ADT/DenseMap.h"
namespace clang {
@@ -50,6 +49,41 @@ private:
enum VisitFlag { NotVisited = 0, Visited = 1, Pending = 2 };
llvm::DenseMap<const FunctionDecl*, VisitFlag> VisitedFD;
+ /// \name Statistics
+ /// @{
+
+ /// \brief Number of function CFGs built and analyzed.
+ unsigned NumFunctionsAnalyzed;
+
+ /// \brief Number of functions for which the CFG could not be successfully
+ /// built.
+ unsigned NumFunctionsWithBadCFGs;
+
+ /// \brief Total number of blocks across all CFGs.
+ unsigned NumCFGBlocks;
+
+ /// \brief Largest number of CFG blocks for a single function analyzed.
+ unsigned MaxCFGBlocksPerFunction;
+
+ /// \brief Total number of CFGs with variables analyzed for uninitialized
+ /// uses.
+ unsigned NumUninitAnalysisFunctions;
+
+ /// \brief Total number of variables analyzed for uninitialized uses.
+ unsigned NumUninitAnalysisVariables;
+
+ /// \brief Max number of variables analyzed for uninitialized uses in a single
+ /// function.
+ unsigned MaxUninitAnalysisVariablesPerFunction;
+
+ /// \brief Total number of block visits during uninitialized use analysis.
+ unsigned NumUninitAnalysisBlockVisits;
+
+ /// \brief Max number of block visits during uninitialized use analysis of
+ /// a single function.
+ unsigned MaxUninitAnalysisBlockVisitsPerFunction;
+
+ /// @}
public:
AnalysisBasedWarnings(Sema &s);
@@ -58,6 +92,8 @@ public:
const Decl *D, const BlockExpr *blkExpr);
Policy getDefaultPolicy() { return DefaultPolicy; }
+
+ void PrintStats() const;
};
}} // end namespace clang::sema
diff --git a/contrib/llvm/tools/clang/include/clang/Sema/AttributeList.h b/contrib/llvm/tools/clang/include/clang/Sema/AttributeList.h
index 72cd475..5d2d6c2 100644
--- a/contrib/llvm/tools/clang/include/clang/Sema/AttributeList.h
+++ b/contrib/llvm/tools/clang/include/clang/Sema/AttributeList.h
@@ -77,6 +77,8 @@ private:
/// availability attribute.
unsigned IsAvailability : 1;
+ unsigned AttrKind : 8;
+
/// \brief The location of the 'unavailable' keyword in an
/// availability attribute.
SourceLocation UnavailableLoc;
@@ -123,6 +125,7 @@ private:
DeclspecAttribute(declspec), CXX0XAttribute(cxx0x), Invalid(false),
IsAvailability(false), NextInPosition(0), NextInPool(0) {
if (numArgs) memcpy(getArgsBuffer(), args, numArgs * sizeof(Expr*));
+ AttrKind = getKind(getName());
}
AttributeList(IdentifierInfo *attrName, SourceLocation attrLoc,
@@ -141,6 +144,7 @@ private:
new (&getAvailabilitySlot(IntroducedSlot)) AvailabilityChange(introduced);
new (&getAvailabilitySlot(DeprecatedSlot)) AvailabilityChange(deprecated);
new (&getAvailabilitySlot(ObsoletedSlot)) AvailabilityChange(obsoleted);
+ AttrKind = getKind(getName());
}
friend class AttributePool;
@@ -148,20 +152,22 @@ private:
public:
enum Kind { // Please keep this list alphabetized.
- AT_IBAction, // Clang-specific.
- AT_IBOutlet, // Clang-specific.
- AT_IBOutletCollection, // Clang-specific.
AT_address_space,
AT_alias,
AT_aligned,
AT_always_inline,
AT_analyzer_noreturn,
AT_annotate,
+ AT_arc_weakref_unavailable,
AT_availability, // Clang-specific
AT_base_check,
AT_blocks,
AT_carries_dependency,
AT_cdecl,
+ AT_cf_consumed, // Clang-specific.
+ AT_cf_returns_autoreleased, // Clang-specific.
+ AT_cf_returns_not_retained, // Clang-specific.
+ AT_cf_returns_retained, // Clang-specific.
AT_cleanup,
AT_common,
AT_const,
@@ -179,32 +185,36 @@ public:
AT_global,
AT_gnu_inline,
AT_host,
+ AT_IBAction, // Clang-specific.
+ AT_IBOutlet, // Clang-specific.
+ AT_IBOutletCollection, // Clang-specific.
+ AT_init_priority,
AT_launch_bounds,
AT_malloc,
AT_may_alias,
AT_mode,
+ AT_MsStruct,
+ AT_naked,
AT_neon_polyvector_type, // Clang-specific.
AT_neon_vector_type, // Clang-specific.
- AT_naked,
- AT_nodebug,
- AT_noinline,
AT_no_instrument_function,
AT_nocommon,
+ AT_nodebug,
+ AT_noinline,
AT_nonnull,
AT_noreturn,
AT_nothrow,
- AT_nsobject,
- AT_objc_exception,
- AT_objc_method_family,
- AT_cf_returns_not_retained, // Clang-specific.
- AT_cf_returns_retained, // Clang-specific.
- AT_ns_returns_not_retained, // Clang-specific.
- AT_ns_returns_retained, // Clang-specific.
- AT_ns_returns_autoreleased, // Clang-specific.
- AT_cf_consumed, // Clang-specific.
AT_ns_consumed, // Clang-specific.
AT_ns_consumes_self, // Clang-specific.
+ AT_ns_returns_autoreleased, // Clang-specific.
+ AT_ns_returns_not_retained, // Clang-specific.
+ AT_ns_returns_retained, // Clang-specific.
+ AT_nsobject,
+ AT_objc_exception,
AT_objc_gc,
+ AT_objc_method_family,
+ AT_objc_ownership, // Clang-specific.
+ AT_objc_precise_lifetime, // Clang-specific.
AT_opencl_image_access, // OpenCL-specific.
AT_opencl_kernel_function, // OpenCL-specific.
AT_overloadable, // Clang-specific.
@@ -216,6 +226,7 @@ public:
AT_pcs, // ARM specific
AT_pure,
AT_regparm,
+ AT_reqd_wg_size,
AT_section,
AT_sentinel,
AT_shared,
@@ -231,11 +242,8 @@ public:
AT_visibility,
AT_warn_unused_result,
AT_weak,
- AT_weakref,
AT_weak_import,
- AT_reqd_wg_size,
- AT_init_priority,
- AT_MsStruct,
+ AT_weakref,
IgnoredAttribute,
UnknownAttribute
};
@@ -256,7 +264,7 @@ public:
bool isInvalid() const { return Invalid; }
void setInvalid(bool b = true) const { Invalid = b; }
- Kind getKind() const { return getKind(getName()); }
+ Kind getKind() const { return Kind(AttrKind); }
static Kind getKind(const IdentifierInfo *Name);
AttributeList *getNext() const { return NextInPosition; }
diff --git a/contrib/llvm/tools/clang/include/clang/Sema/CodeCompleteConsumer.h b/contrib/llvm/tools/clang/include/clang/Sema/CodeCompleteConsumer.h
index d322180..74b0105 100644
--- a/contrib/llvm/tools/clang/include/clang/Sema/CodeCompleteConsumer.h
+++ b/contrib/llvm/tools/clang/include/clang/Sema/CodeCompleteConsumer.h
@@ -185,12 +185,26 @@ public:
/// is expected.
CCC_ObjCMessageReceiver,
/// \brief Code completion occurred on the right-hand side of a member
- /// access expression.
+ /// access expression using the dot operator.
///
/// The results of this completion are the members of the type being
/// accessed. The type itself is available via
/// \c CodeCompletionContext::getType().
- CCC_MemberAccess,
+ CCC_DotMemberAccess,
+ /// \brief Code completion occurred on the right-hand side of a member
+ /// access expression using the arrow operator.
+ ///
+ /// The results of this completion are the members of the type being
+ /// accessed. The type itself is available via
+ /// \c CodeCompletionContext::getType().
+ CCC_ArrowMemberAccess,
+ /// \brief Code completion occurred on the right-hand side of an Objective-C
+ /// property access expression.
+ ///
+ /// The results of this completion are the members of the type being
+ /// accessed. The type itself is available via
+ /// \c CodeCompletionContext::getType().
+ CCC_ObjCPropertyAccess,
/// \brief Code completion occurred after the "enum" keyword, to indicate
/// an enumeration name.
CCC_EnumTag,
@@ -235,6 +249,15 @@ public:
/// \brief Code completion in a parenthesized expression, which means that
/// we may also have types here in C and Objective-C (as well as in C++).
CCC_ParenthesizedExpression,
+ /// \brief Code completion where an Objective-C instance message is expcted.
+ CCC_ObjCInstanceMessage,
+ /// \brief Code completion where an Objective-C class message is expected.
+ CCC_ObjCClassMessage,
+ /// \brief Code completion where a superclass of an Objective-C class is
+ /// expected.
+ CCC_ObjCSuperclass,
+ /// \brief Code completion where an Objective-C category name is expected.
+ CCC_ObjCCategoryName,
/// \brief An unknown context, in which we are recovering from a parsing
/// error and don't know which completions we should give.
CCC_Recovery
@@ -256,7 +279,8 @@ public:
/// \brief Construct a new code-completion context of the given kind.
CodeCompletionContext(enum Kind Kind, QualType T) : Kind(Kind) {
- if (Kind == CCC_MemberAccess)
+ if (Kind == CCC_DotMemberAccess || Kind == CCC_ArrowMemberAccess ||
+ Kind == CCC_ObjCPropertyAccess)
BaseType = T;
else
PreferredType = T;
diff --git a/contrib/llvm/tools/clang/include/clang/Sema/DeclSpec.h b/contrib/llvm/tools/clang/include/clang/Sema/DeclSpec.h
index 7ce4e00..a666499 100644
--- a/contrib/llvm/tools/clang/include/clang/Sema/DeclSpec.h
+++ b/contrib/llvm/tools/clang/include/clang/Sema/DeclSpec.h
@@ -40,6 +40,7 @@ namespace clang {
class NamespaceDecl;
class NestedNameSpecifier;
class NestedNameSpecifierLoc;
+ class ObjCDeclSpec;
class Preprocessor;
class Declarator;
struct TemplateIdAnnotation;
@@ -153,6 +154,12 @@ public:
/// copied.
NestedNameSpecifierLoc getWithLocInContext(ASTContext &Context) const;
+ /// \brief Retrieve the location of the name in the last qualifier
+ /// in this nested name specifier. For example:
+ /// ::foo::bar<0>::
+ /// ^~~
+ SourceLocation getLastQualifierNameLoc() const;
+
/// No scope specifier.
bool isEmpty() const { return !Range.isValid(); }
/// A scope specifier is present, but may be valid or invalid.
@@ -344,6 +351,8 @@ private:
void SaveWrittenBuiltinSpecs();
void SaveStorageSpecifierAsWritten();
+ ObjCDeclSpec *ObjCQualifiers;
+
static bool isTypeRep(TST T) {
return (T == TST_typename || T == TST_typeofType ||
T == TST_underlyingType);
@@ -383,7 +392,8 @@ public:
ProtocolQualifiers(0),
NumProtocolQualifiers(0),
ProtocolLocs(0),
- writtenBS() {
+ writtenBS(),
+ ObjCQualifiers(0) {
}
~DeclSpec() {
delete [] ProtocolQualifiers;
@@ -653,6 +663,9 @@ public:
return writtenBS;
}
+ ObjCDeclSpec *getObjCQualifiers() const { return ObjCQualifiers; }
+ void setObjCQualifiers(ObjCDeclSpec *quals) { ObjCQualifiers = quals; }
+
/// isMissingDeclaratorOk - This checks if this DeclSpec can stand alone,
/// without a Declarator. Only tag declspecs can stand alone.
bool isMissingDeclaratorOk();
@@ -689,7 +702,10 @@ public:
DQ_PR_copy = 0x20,
DQ_PR_nonatomic = 0x40,
DQ_PR_setter = 0x80,
- DQ_PR_atomic = 0x100
+ DQ_PR_atomic = 0x100,
+ DQ_PR_weak = 0x200,
+ DQ_PR_strong = 0x400,
+ DQ_PR_unsafe_unretained = 0x800
};
@@ -723,7 +739,7 @@ private:
ObjCDeclQualifier objcDeclQualifier : 6;
// NOTE: VC++ treats enums as signed, avoid using ObjCPropertyAttributeKind
- unsigned PropertyAttributes : 9;
+ unsigned PropertyAttributes : 12;
IdentifierInfo *GetterName; // getter name of NULL if no getter
IdentifierInfo *SetterName; // setter name of NULL if no setter
};
@@ -751,7 +767,9 @@ public:
/// \brief A destructor name.
IK_DestructorName,
/// \brief A template-id, e.g., f<int>.
- IK_TemplateId
+ IK_TemplateId,
+ /// \brief An implicit 'self' parameter
+ IK_ImplicitSelfParam
} Kind;
/// \brief Anonymous union that holds extra data associated with the
@@ -804,7 +822,7 @@ public:
SourceLocation EndLocation;
UnqualifiedId() : Kind(IK_Identifier), Identifier(0) { }
-
+
/// \brief Do not use this copy constructor. It is temporary, and only
/// exists because we are holding FieldDeclarators in a SmallVector when we
/// don't actually need them.
@@ -831,6 +849,7 @@ public:
/// \brief Determine what kind of name we have.
IdKind getKind() const { return Kind; }
+ void setKind(IdKind kind) { Kind = kind; }
/// \brief Specify that this unqualified-id was parsed as an identifier.
///
@@ -1078,6 +1097,10 @@ struct DeclaratorChunk {
/// If this is an invalid location, there is no ref-qualifier.
unsigned RefQualifierLoc;
+ /// \brief The location of the 'mutable' qualifer in a lambda-declarator, if
+ /// any.
+ unsigned MutableLoc;
+
/// \brief When ExceptionSpecType isn't EST_None or EST_Delayed, the
/// location of the keyword introducing the spec.
unsigned ExceptionSpecLoc;
@@ -1139,10 +1162,19 @@ struct DeclaratorChunk {
return SourceLocation::getFromRawEncoding(RefQualifierLoc);
}
+ /// \brief Retrieve the location of the 'mutable' qualifier, if any.
+ SourceLocation getMutableLoc() const {
+ return SourceLocation::getFromRawEncoding(MutableLoc);
+ }
+
/// \brief Determine whether this function declaration contains a
/// ref-qualifier.
bool hasRefQualifier() const { return getRefQualifierLoc().isValid(); }
+ /// \brief Determine whether this lambda-declarator contains a 'mutable'
+ /// qualifier.
+ bool hasMutableQualifier() const { return getMutableLoc().isValid(); }
+
/// \brief Get the type of exception specification this function has.
ExceptionSpecificationType getExceptionSpecType() const {
return static_cast<ExceptionSpecificationType>(ExceptionSpecType);
@@ -1266,6 +1298,7 @@ struct DeclaratorChunk {
unsigned TypeQuals,
bool RefQualifierIsLvalueRef,
SourceLocation RefQualifierLoc,
+ SourceLocation MutableLoc,
ExceptionSpecificationType ESpecType,
SourceLocation ESpecLoc,
ParsedType *Exceptions,
@@ -1339,7 +1372,9 @@ public:
ForContext, // Declaration within first part of a for loop.
ConditionContext, // Condition declaration in a C++ if/switch/while/for.
TemplateParamContext,// Within a template parameter list.
+ CXXNewContext, // C++ new-expression.
CXXCatchContext, // C++ catch exception-declaration
+ ObjCCatchContext, // Objective-C catch exception-declaration
BlockLiteralContext, // Block literal declarator.
TemplateTypeArgContext, // Template type argument.
AliasDeclContext, // C++0x alias-declaration.
@@ -1489,7 +1524,9 @@ public:
case PrototypeContext:
case ObjCPrototypeContext:
case TemplateParamContext:
+ case CXXNewContext:
case CXXCatchContext:
+ case ObjCCatchContext:
case BlockLiteralContext:
case TemplateTypeArgContext:
return true;
@@ -1511,9 +1548,11 @@ public:
case PrototypeContext:
case TemplateParamContext:
case CXXCatchContext:
+ case ObjCCatchContext:
return true;
case TypeNameContext:
+ case CXXNewContext:
case AliasDeclContext:
case AliasTemplateContext:
case ObjCPrototypeContext:
@@ -1542,7 +1581,9 @@ public:
case ObjCPrototypeContext:
case TemplateParamContext:
case CXXCatchContext:
+ case ObjCCatchContext:
case TypeNameContext:
+ case CXXNewContext:
case AliasDeclContext:
case AliasTemplateContext:
case BlockLiteralContext:
@@ -1687,6 +1728,14 @@ public:
return const_cast<Declarator*>(this)->getFunctionTypeInfo();
}
+ /// \brief Determine whether the declaration that will be produced from
+ /// this declaration will be a function.
+ ///
+ /// A declaration can declare a function even if the declarator itself
+ /// isn't a function declarator, if the type specifier refers to a function
+ /// type. This routine checks for both cases.
+ bool isDeclarationOfFunction() const;
+
/// takeAttributes - Takes attributes from the given parsed-attributes
/// set and add them to this declarator.
///
diff --git a/contrib/llvm/tools/clang/include/clang/Sema/DelayedDiagnostic.h b/contrib/llvm/tools/clang/include/clang/Sema/DelayedDiagnostic.h
index 8395138..8ab9382 100644
--- a/contrib/llvm/tools/clang/include/clang/Sema/DelayedDiagnostic.h
+++ b/contrib/llvm/tools/clang/include/clang/Sema/DelayedDiagnostic.h
@@ -112,7 +112,7 @@ private:
/// the complete parsing of the current declaration.
class DelayedDiagnostic {
public:
- enum DDKind { Deprecation, Access };
+ enum DDKind { Deprecation, Access, ForbiddenType };
unsigned char Kind; // actually a DDKind
bool Triggered;
@@ -135,6 +135,20 @@ public:
return DD;
}
+ static DelayedDiagnostic makeForbiddenType(SourceLocation loc,
+ unsigned diagnostic,
+ QualType type,
+ unsigned argument) {
+ DelayedDiagnostic DD;
+ DD.Kind = ForbiddenType;
+ DD.Triggered = false;
+ DD.Loc = loc;
+ DD.ForbiddenTypeData.Diagnostic = diagnostic;
+ DD.ForbiddenTypeData.OperandType = type.getAsOpaquePtr();
+ DD.ForbiddenTypeData.Argument = argument;
+ return DD;
+ }
+
AccessedEntity &getAccessData() {
assert(Kind == Access && "Not an access diagnostic.");
return *reinterpret_cast<AccessedEntity*>(AccessData);
@@ -155,6 +169,25 @@ public:
DeprecationData.MessageLen);
}
+ /// The diagnostic ID to emit. Used like so:
+ /// Diag(diag.Loc, diag.getForbiddenTypeDiagnostic())
+ /// << diag.getForbiddenTypeOperand()
+ /// << diag.getForbiddenTypeArgument();
+ unsigned getForbiddenTypeDiagnostic() const {
+ assert(Kind == ForbiddenType && "not a forbidden-type diagnostic");
+ return ForbiddenTypeData.Diagnostic;
+ }
+
+ unsigned getForbiddenTypeArgument() const {
+ assert(Kind == ForbiddenType && "not a forbidden-type diagnostic");
+ return ForbiddenTypeData.Argument;
+ }
+
+ QualType getForbiddenTypeOperand() const {
+ assert(Kind == ForbiddenType && "not a forbidden-type diagnostic");
+ return QualType::getFromOpaquePtr(ForbiddenTypeData.OperandType);
+ }
+
private:
union {
/// Deprecation.
@@ -164,6 +197,12 @@ private:
size_t MessageLen;
} DeprecationData;
+ struct {
+ unsigned Diagnostic;
+ unsigned Argument;
+ void *OperandType;
+ } ForbiddenTypeData;
+
/// Access control.
char AccessData[sizeof(AccessedEntity)];
};
diff --git a/contrib/llvm/tools/clang/include/clang/Sema/ExternalSemaSource.h b/contrib/llvm/tools/clang/include/clang/Sema/ExternalSemaSource.h
index e2b083e..072e1b5 100644
--- a/contrib/llvm/tools/clang/include/clang/Sema/ExternalSemaSource.h
+++ b/contrib/llvm/tools/clang/include/clang/Sema/ExternalSemaSource.h
@@ -49,6 +49,11 @@ public:
/// instance and factory methods, respectively, with this selector.
virtual std::pair<ObjCMethodList,ObjCMethodList> ReadMethodPool(Selector Sel);
+ /// \brief Load the set of namespaces that are known to the external source,
+ /// which will be used during typo correction.
+ virtual void ReadKnownNamespaces(
+ llvm::SmallVectorImpl<NamespaceDecl *> &Namespaces);
+
/// \brief Do last resort, unqualified lookup on a LookupResult that
/// Sema cannot find.
///
diff --git a/contrib/llvm/tools/clang/include/clang/Sema/Initialization.h b/contrib/llvm/tools/clang/include/clang/Sema/Initialization.h
index 5dc4438..df6138c 100644
--- a/contrib/llvm/tools/clang/include/clang/Sema/Initialization.h
+++ b/contrib/llvm/tools/clang/include/clang/Sema/Initialization.h
@@ -86,9 +86,13 @@ private:
QualType Type;
union {
- /// \brief When Kind == EK_Variable, EK_Parameter, or EK_Member,
- /// the VarDecl, ParmVarDecl, or FieldDecl, respectively.
+ /// \brief When Kind == EK_Variable or EK_Member, the VarDecl or
+ /// FieldDecl, respectively.
DeclaratorDecl *VariableOrMember;
+
+ /// \brief When Kind == EK_Parameter, the ParmVarDecl, with the
+ /// low bit indicating whether the parameter is "consumed".
+ uintptr_t Parameter;
/// \brief When Kind == EK_Temporary, the type source information for
/// the temporary.
@@ -123,11 +127,6 @@ private:
: Kind(EK_Variable), Parent(0), Type(Var->getType()),
VariableOrMember(Var) { }
- /// \brief Create the initialization entity for a parameter.
- InitializedEntity(ParmVarDecl *Parm)
- : Kind(EK_Parameter), Parent(0), Type(Parm->getType().getUnqualifiedType()),
- VariableOrMember(Parm) { }
-
/// \brief Create the initialization entity for the result of a
/// function, throwing an object, performing an explicit cast, or
/// initializing a parameter for which there is no declaration.
@@ -157,20 +156,29 @@ public:
/// \brief Create the initialization entity for a parameter.
static InitializedEntity InitializeParameter(ASTContext &Context,
ParmVarDecl *Parm) {
- InitializedEntity Res(Parm);
- Res.Type = Context.getVariableArrayDecayedType(Res.Type);
- return Res;
+ bool Consumed = (Context.getLangOptions().ObjCAutoRefCount &&
+ Parm->hasAttr<NSConsumedAttr>());
+
+ InitializedEntity Entity;
+ Entity.Kind = EK_Parameter;
+ Entity.Type = Context.getVariableArrayDecayedType(
+ Parm->getType().getUnqualifiedType());
+ Entity.Parent = 0;
+ Entity.Parameter
+ = (static_cast<uintptr_t>(Consumed) | reinterpret_cast<uintptr_t>(Parm));
+ return Entity;
}
/// \brief Create the initialization entity for a parameter that is
/// only known by its type.
static InitializedEntity InitializeParameter(ASTContext &Context,
- QualType Type) {
+ QualType Type,
+ bool Consumed) {
InitializedEntity Entity;
Entity.Kind = EK_Parameter;
Entity.Type = Context.getVariableArrayDecayedType(Type);
Entity.Parent = 0;
- Entity.VariableOrMember = 0;
+ Entity.Parameter = (Consumed);
return Entity;
}
@@ -268,6 +276,13 @@ public:
/// \brief Determine whether this initialization allows the named return
/// value optimization, which also applies to thrown objects.
bool allowsNRVO() const;
+
+ /// \brief Determine whether this initialization consumes the
+ /// parameter.
+ bool isParameterConsumed() const {
+ assert(getKind() == EK_Parameter && "Not a parameter");
+ return (Parameter & 1);
+ }
/// \brief Retrieve the base specifier.
CXXBaseSpecifier *getBaseSpecifier() const {
@@ -287,7 +302,7 @@ public:
assert(getKind() == EK_Result && "No 'return' location!");
return SourceLocation::getFromRawEncoding(LocAndNRVO.Location);
}
-
+
/// \brief Determine the location of the 'throw' keyword when initializing
/// an exception object.
SourceLocation getThrowLoc() const {
@@ -325,8 +340,10 @@ private:
SIK_Value = IK_Value, ///< Value initialization
SIK_ImplicitValue, ///< Implicit value initialization
SIK_DirectCast, ///< Direct initialization due to a cast
- /// \brief Direct initialization due to a C-style or functional cast.
- SIK_DirectCStyleOrFunctionalCast
+ /// \brief Direct initialization due to a C-style cast.
+ SIK_DirectCStyleCast,
+ /// \brief Direct initialization due to a functional-style cast.
+ SIK_DirectFunctionalCast
};
/// \brief The kind of initialization being performed.
@@ -352,15 +369,29 @@ public:
return InitializationKind(SIK_Direct, InitLoc, LParenLoc, RParenLoc);
}
- /// \brief Create a direct initialization due to a cast.
- static InitializationKind CreateCast(SourceRange TypeRange,
- bool IsCStyleCast) {
- return InitializationKind(IsCStyleCast? SIK_DirectCStyleOrFunctionalCast
- : SIK_DirectCast,
+ /// \brief Create a direct initialization due to a cast that isn't a C-style
+ /// or functional cast.
+ static InitializationKind CreateCast(SourceRange TypeRange) {
+ return InitializationKind(SIK_DirectCast,
TypeRange.getBegin(), TypeRange.getBegin(),
TypeRange.getEnd());
}
+ /// \brief Create a direct initialization for a C-style cast.
+ static InitializationKind CreateCStyleCast(SourceLocation StartLoc,
+ SourceRange TypeRange) {
+ return InitializationKind(SIK_DirectCStyleCast,
+ StartLoc, TypeRange.getBegin(),
+ TypeRange.getEnd());
+ }
+
+ /// \brief Create a direct initialization for a functional cast.
+ static InitializationKind CreateFunctionalCast(SourceRange TypeRange) {
+ return InitializationKind(SIK_DirectFunctionalCast,
+ TypeRange.getBegin(), TypeRange.getBegin(),
+ TypeRange.getEnd());
+ }
+
/// \brief Create a copy initialization.
static InitializationKind CreateCopy(SourceLocation InitLoc,
SourceLocation EqualLoc) {
@@ -393,12 +424,24 @@ public:
/// \brief Determine whether this initialization is an explicit cast.
bool isExplicitCast() const {
- return Kind == SIK_DirectCast || Kind == SIK_DirectCStyleOrFunctionalCast;
+ return Kind == SIK_DirectCast ||
+ Kind == SIK_DirectCStyleCast ||
+ Kind == SIK_DirectFunctionalCast;
}
/// \brief Determine whether this initialization is a C-style cast.
bool isCStyleOrFunctionalCast() const {
- return Kind == SIK_DirectCStyleOrFunctionalCast;
+ return Kind == SIK_DirectCStyleCast || Kind == SIK_DirectFunctionalCast;
+ }
+
+ /// brief Determine whether this is a C-style cast.
+ bool isCStyleCast() const {
+ return Kind == SIK_DirectCStyleCast;
+ }
+
+ /// brief Determine whether this is a functional-style cast.
+ bool isFunctionalCast() const {
+ return Kind == SIK_DirectFunctionalCast;
}
/// \brief Determine whether this initialization is an implicit
@@ -448,10 +491,7 @@ public:
DependentSequence,
/// \brief A normal sequence.
- NormalSequence,
-
- /// \brief A reference binding.
- ReferenceBinding // FIXME: Still looks redundant, but complicated.
+ NormalSequence
};
/// \brief Describes the kind of a particular step in an initialization
@@ -500,7 +540,13 @@ public:
SK_ObjCObjectConversion,
/// \brief Array initialization (from an array rvalue).
/// This is a GNU C extension.
- SK_ArrayInit
+ SK_ArrayInit,
+ /// \brief Pass an object by indirect copy-and-restore.
+ SK_PassByIndirectCopyRestore,
+ /// \brief Pass an object by indirect restore.
+ SK_PassByIndirectRestore,
+ /// \brief Produce an Objective-C object pointer.
+ SK_ProduceObjCObject
};
/// \brief A single step in the initialization sequence.
@@ -774,6 +820,13 @@ public:
/// \brief Add an array initialization step.
void AddArrayInitStep(QualType T);
+ /// \brief Add a step to pass an object by indirect copy-restore.
+ void AddPassByIndirectCopyRestoreStep(QualType T, bool shouldCopy);
+
+ /// \brief Add a step to "produce" an Objective-C object (by
+ /// retaining it).
+ void AddProduceObjCObjectStep(QualType T);
+
/// \brief Note that this initialization sequence failed.
void SetFailed(FailureKind Failure) {
SequenceKind = FailedSequence;
diff --git a/contrib/llvm/tools/clang/include/clang/Sema/LocInfoType.h b/contrib/llvm/tools/clang/include/clang/Sema/LocInfoType.h
new file mode 100644
index 0000000..e1d3ae9
--- /dev/null
+++ b/contrib/llvm/tools/clang/include/clang/Sema/LocInfoType.h
@@ -0,0 +1,63 @@
+//===--- LocInfoType.h - Parsed Type with Location Information---*- C++ -*-===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+//
+// This file defines the LocInfoType class, which holds a type and its
+// source-location information.
+//
+//===----------------------------------------------------------------------===//
+#ifndef LLVM_CLANG_SEMA_LOCINFOTYPE_H
+#define LLVM_CLANG_SEMA_LOCINFOTYPE_H
+
+#include "clang/AST/Type.h"
+
+namespace clang {
+
+class TypeSourceInfo;
+
+/// \brief Holds a QualType and a TypeSourceInfo* that came out of a declarator
+/// parsing.
+///
+/// LocInfoType is a "transient" type, only needed for passing to/from Parser
+/// and Sema, when we want to preserve type source info for a parsed type.
+/// It will not participate in the type system semantics in any way.
+class LocInfoType : public Type {
+ enum {
+ // The last number that can fit in Type's TC.
+ // Avoids conflict with an existing Type class.
+ LocInfo = Type::TypeLast + 1
+ };
+
+ TypeSourceInfo *DeclInfo;
+
+ LocInfoType(QualType ty, TypeSourceInfo *TInfo)
+ : Type((TypeClass)LocInfo, ty, ty->isDependentType(),
+ ty->isInstantiationDependentType(),
+ ty->isVariablyModifiedType(),
+ ty->containsUnexpandedParameterPack()),
+ DeclInfo(TInfo) {
+ assert(getTypeClass() == (TypeClass)LocInfo && "LocInfo didn't fit in TC?");
+ }
+ friend class Sema;
+
+ public:
+ QualType getType() const { return getCanonicalTypeInternal(); }
+ TypeSourceInfo *getTypeSourceInfo() const { return DeclInfo; }
+
+ void getAsStringInternal(std::string &Str,
+ const PrintingPolicy &Policy) const;
+
+ static bool classof(const Type *T) {
+ return T->getTypeClass() == (TypeClass)LocInfo;
+ }
+ static bool classof(const LocInfoType *) { return true; }
+};
+
+} // end namespace clang
+
+#endif // LLVM_CLANG_SEMA_LOCINFOTYPE_H
diff --git a/contrib/llvm/tools/clang/include/clang/Sema/Overload.h b/contrib/llvm/tools/clang/include/clang/Sema/Overload.h
index 55931f2..32d4cbd 100644
--- a/contrib/llvm/tools/clang/include/clang/Sema/Overload.h
+++ b/contrib/llvm/tools/clang/include/clang/Sema/Overload.h
@@ -77,6 +77,7 @@ namespace clang {
ICK_Complex_Real, ///< Complex-real conversions (C99 6.3.1.7)
ICK_Block_Pointer_Conversion, ///< Block Pointer conversions
ICK_TransparentUnionConversion, /// Transparent Union Conversions
+ ICK_Writeback_Conversion, ///< Objective-C ARC writeback conversion
ICK_Num_Conversion_Kinds ///< The number of conversion kinds
};
@@ -100,10 +101,11 @@ namespace clang {
/// 13.3.3.1.1) and are listed such that better conversion ranks
/// have smaller values.
enum ImplicitConversionRank {
- ICR_Exact_Match = 0, ///< Exact Match
- ICR_Promotion, ///< Promotion
- ICR_Conversion, ///< Conversion
- ICR_Complex_Real_Conversion ///< Complex <-> Real conversion
+ ICR_Exact_Match = 0, ///< Exact Match
+ ICR_Promotion, ///< Promotion
+ ICR_Conversion, ///< Conversion
+ ICR_Complex_Real_Conversion, ///< Complex <-> Real conversion
+ ICR_Writeback_Conversion ///< ObjC ARC writeback conversion
};
ImplicitConversionRank GetConversionRank(ImplicitConversionKind Kind);
@@ -137,6 +139,10 @@ namespace clang {
/// (C++ 4.2p2).
unsigned DeprecatedStringLiteralToCharPtr : 1;
+ /// \brief Whether the qualification conversion involves a change in the
+ /// Objective-C lifetime (for automatic reference counting).
+ unsigned QualificationIncludesObjCLifetime : 1;
+
/// IncompatibleObjC - Whether this is an Objective-C conversion
/// that we should warn about (if we actually use it).
unsigned IncompatibleObjC : 1;
@@ -163,6 +169,10 @@ namespace clang {
/// non-static member function without a ref-qualifier.
unsigned BindsImplicitObjectArgumentWithoutRefQualifier : 1;
+ /// \brief Whether this binds a reference to an object with a different
+ /// Objective-C lifetime qualifier.
+ unsigned ObjCLifetimeConversionBinding : 1;
+
/// FromType - The type that this conversion is converting
/// from. This is an opaque pointer that can be translated into a
/// QualType.
diff --git a/contrib/llvm/tools/clang/include/clang/Sema/Scope.h b/contrib/llvm/tools/clang/include/clang/Sema/Scope.h
index 7514633..95d2978 100644
--- a/contrib/llvm/tools/clang/include/clang/Sema/Scope.h
+++ b/contrib/llvm/tools/clang/include/clang/Sema/Scope.h
@@ -84,7 +84,10 @@ public:
/// ThisScope - This is the scope of a struct/union/class definition,
/// outside of any member function definition, where 'this' is nonetheless
/// usable.
- ThisScope = 0x1000
+ ThisScope = 0x1000,
+
+ /// TryScope - This is the scope of a C++ try statement.
+ TryScope = 0x2000
};
private:
/// The parent scope for this scope. This is null for the translation-unit
@@ -303,6 +306,9 @@ public:
}
return false;
}
+
+ /// \brief Determine whether this scope is a C++ 'try' block.
+ bool isTryScope() const { return getFlags() & Scope::TryScope; }
typedef UsingDirectivesTy::iterator udir_iterator;
typedef UsingDirectivesTy::const_iterator const_udir_iterator;
diff --git a/contrib/llvm/tools/clang/include/clang/Sema/Sema.h b/contrib/llvm/tools/clang/include/clang/Sema/Sema.h
index 6dd0d3c..263c1bd 100644
--- a/contrib/llvm/tools/clang/include/clang/Sema/Sema.h
+++ b/contrib/llvm/tools/clang/include/clang/Sema/Sema.h
@@ -20,6 +20,8 @@
#include "clang/Sema/IdentifierResolver.h"
#include "clang/Sema/ObjCMethodList.h"
#include "clang/Sema/DeclSpec.h"
+#include "clang/Sema/LocInfoType.h"
+#include "clang/Sema/TypoCorrection.h"
#include "clang/AST/Expr.h"
#include "clang/AST/DeclarationName.h"
#include "clang/AST/ExternalASTSource.h"
@@ -45,6 +47,8 @@ namespace clang {
class ASTConsumer;
class ASTContext;
class ASTMutationListener;
+ class ASTReader;
+ class ASTWriter;
class ArrayType;
class AttributeList;
class BlockDecl;
@@ -108,6 +112,7 @@ namespace clang {
class ObjCInterfaceDecl;
class ObjCIvarDecl;
template <class T> class ObjCList;
+ class ObjCMessageExpr;
class ObjCMethodDecl;
class ObjCPropertyDecl;
class ObjCProtocolDecl;
@@ -156,43 +161,6 @@ namespace sema {
class TemplateDeductionInfo;
}
-/// \brief Holds a QualType and a TypeSourceInfo* that came out of a declarator
-/// parsing.
-///
-/// LocInfoType is a "transient" type, only needed for passing to/from Parser
-/// and Sema, when we want to preserve type source info for a parsed type.
-/// It will not participate in the type system semantics in any way.
-class LocInfoType : public Type {
- enum {
- // The last number that can fit in Type's TC.
- // Avoids conflict with an existing Type class.
- LocInfo = Type::TypeLast + 1
- };
-
- TypeSourceInfo *DeclInfo;
-
- LocInfoType(QualType ty, TypeSourceInfo *TInfo)
- : Type((TypeClass)LocInfo, ty, ty->isDependentType(),
- ty->isVariablyModifiedType(),
- ty->containsUnexpandedParameterPack()),
- DeclInfo(TInfo) {
- assert(getTypeClass() == (TypeClass)LocInfo && "LocInfo didn't fit in TC?");
- }
- friend class Sema;
-
-public:
- QualType getType() const { return getCanonicalTypeInternal(); }
- TypeSourceInfo *getTypeSourceInfo() const { return DeclInfo; }
-
- void getAsStringInternal(std::string &Str,
- const PrintingPolicy &Policy) const;
-
- static bool classof(const Type *T) {
- return T->getTypeClass() == (TypeClass)LocInfo;
- }
- static bool classof(const LocInfoType *) { return true; }
-};
-
// FIXME: No way to easily map from TemplateTypeParmTypes to
// TemplateTypeParmDecls, so we have this horrible PointerUnion.
typedef std::pair<llvm::PointerUnion<const TemplateTypeParmType*, NamedDecl*>,
@@ -225,6 +193,9 @@ public:
Diagnostic &Diags;
SourceManager &SourceMgr;
+ /// \brief Flag indicating whether or not to collect detailed statistics.
+ bool CollectStats;
+
/// \brief Source of additional semantic information.
ExternalSemaSource *ExternalSource;
@@ -247,6 +218,10 @@ public:
/// VisContext - Manages the stack for #pragma GCC visibility.
void *VisContext; // Really a "PragmaVisStack*"
+ /// ExprNeedsCleanups - True if the current evaluation context
+ /// requires cleanups to be run at its conclusion.
+ bool ExprNeedsCleanups;
+
/// \brief Stack containing information about each of the nested
/// function, block, and method scopes that are currently active.
///
@@ -555,6 +530,9 @@ public:
/// \brief The expression evaluation context.
ExpressionEvaluationContext Context;
+ /// \brief Whether the enclosing context needed a cleanup.
+ bool ParentNeedsCleanups;
+
/// \brief The number of temporaries that were active when we
/// entered this expression evaluation context.
unsigned NumTemporaries;
@@ -573,8 +551,10 @@ public:
PotentiallyEmittedDiagnostics *PotentiallyDiagnosed;
ExpressionEvaluationContextRecord(ExpressionEvaluationContext Context,
- unsigned NumTemporaries)
- : Context(Context), NumTemporaries(NumTemporaries),
+ unsigned NumTemporaries,
+ bool ParentNeedsCleanups)
+ : Context(Context), ParentNeedsCleanups(ParentNeedsCleanups),
+ NumTemporaries(NumTemporaries),
PotentiallyReferenced(0), PotentiallyDiagnosed(0) { }
void addReferencedDecl(SourceLocation Loc, Decl *Decl) {
@@ -712,7 +692,9 @@ public:
ASTContext &getASTContext() const { return Context; }
ASTConsumer &getASTConsumer() const { return Consumer; }
ASTMutationListener *getASTMutationListener() const;
-
+
+ void PrintStats() const;
+
/// \brief Helper class that creates diagnostics with optional
/// template instantiation stacks.
///
@@ -766,7 +748,7 @@ public:
return FunctionScopes.back();
}
- bool hasAnyErrorsInThisFunction() const;
+ bool hasAnyUnrecoverableErrorsInThisFunction() const;
/// \brief Retrieve the current block, if any.
sema::BlockScopeInfo *getCurBlock();
@@ -778,7 +760,6 @@ public:
// Type Analysis / Processing: SemaType.cpp.
//
- QualType adjustParameterType(QualType T);
QualType BuildQualifiedType(QualType T, SourceLocation Loc, Qualifiers Qs);
QualType BuildQualifiedType(QualType T, SourceLocation Loc, unsigned CVR) {
return BuildQualifiedType(T, Loc, Qualifiers::fromCVRMask(CVR));
@@ -805,9 +786,8 @@ public:
SourceLocation Loc, DeclarationName Entity);
QualType BuildParenType(QualType T);
- TypeSourceInfo *GetTypeForDeclarator(Declarator &D, Scope *S,
- TagDecl **OwnedDecl = 0,
- bool AllowAutoInTypeName = false);
+ TypeSourceInfo *GetTypeForDeclarator(Declarator &D, Scope *S);
+ TypeSourceInfo *GetTypeForDeclaratorCast(Declarator &D, QualType FromTy);
TypeSourceInfo *GetTypeSourceInfoForDeclarator(Declarator &D, QualType T,
TypeSourceInfo *ReturnTypeInfo);
/// \brief Package the given type and TSI into a ParsedType.
@@ -838,7 +818,7 @@ public:
const FunctionProtoType *Source, SourceLocation SourceLoc);
TypeResult ActOnTypeName(Scope *S, Declarator &D);
-
+
bool RequireCompleteType(SourceLocation Loc, QualType T,
const PartialDiagnostic &PD,
std::pair<SourceLocation, PartialDiagnostic> Note);
@@ -864,7 +844,7 @@ public:
// Symbol table / Decl tracking callbacks: SemaDecl.cpp.
//
- DeclGroupPtrTy ConvertDeclToDeclGroup(Decl *Ptr);
+ DeclGroupPtrTy ConvertDeclToDeclGroup(Decl *Ptr, Decl *OwnedType = 0);
void DiagnoseUseOfUnimplementedSelectors();
@@ -983,8 +963,7 @@ public:
SourceLocation NameLoc,
const Token &NextToken);
- Decl *ActOnDeclarator(Scope *S, Declarator &D,
- bool IsFunctionDefintion = false);
+ Decl *ActOnDeclarator(Scope *S, Declarator &D);
Decl *HandleDeclarator(Scope *S, Declarator &D,
MultiTemplateParamsArg TemplateParameterLists,
@@ -1305,13 +1284,20 @@ public:
bool IsForUsingDecl);
bool IsOverload(FunctionDecl *New, FunctionDecl *Old, bool IsForUsingDecl);
- bool TryImplicitConversion(InitializationSequence &Sequence,
- const InitializedEntity &Entity,
- Expr *From,
- bool SuppressUserConversions,
- bool AllowExplicit,
- bool InOverloadResolution,
- bool CStyle);
+ /// \brief Checks availability of the function depending on the current
+ /// function context.Inside an unavailable function,unavailability is ignored.
+ ///
+ /// \returns true if \arg FD is unavailable and current context is inside
+ /// an available function, false otherwise.
+ bool isFunctionConsideredUnavailable(FunctionDecl *FD);
+
+ ImplicitConversionSequence
+ TryImplicitConversion(Expr *From, QualType ToType,
+ bool SuppressUserConversions,
+ bool AllowExplicit,
+ bool InOverloadResolution,
+ bool CStyle,
+ bool AllowObjCWritebackConversion);
bool IsIntegralPromotion(Expr *From, QualType FromType, QualType ToType);
bool IsFloatingPointPromotion(QualType FromType, QualType ToType);
@@ -1321,6 +1307,8 @@ public:
QualType& ConvertedType, bool &IncompatibleObjC);
bool isObjCPointerConversion(QualType FromType, QualType ToType,
QualType& ConvertedType, bool &IncompatibleObjC);
+ bool isObjCWritebackConversion(QualType FromType, QualType ToType,
+ QualType &ConvertedType);
bool IsBlockPointerConversion(QualType FromType, QualType ToType,
QualType& ConvertedType);
bool FunctionArgTypesAreEqual(const FunctionProtoType *OldType,
@@ -1338,14 +1326,17 @@ public:
CXXCastPath &BasePath,
bool IgnoreBaseAccess);
bool IsQualificationConversion(QualType FromType, QualType ToType,
- bool CStyle);
+ bool CStyle, bool &ObjCLifetimeConversion);
+ bool IsNoReturnConversion(QualType FromType, QualType ToType,
+ QualType &ResultTy);
bool DiagnoseMultipleUserDefinedConversion(Expr *From, QualType ToType);
ExprResult PerformMoveOrCopyInitialization(const InitializedEntity &Entity,
const VarDecl *NRVOCandidate,
QualType ResultType,
- Expr *Value);
+ Expr *Value,
+ bool AllowNRVO = true);
bool CanPerformCopyInitialization(const InitializedEntity &Entity,
ExprResult Init);
@@ -1614,6 +1605,8 @@ public:
LookupRedeclarationWithLinkage,
/// Look up the name of an Objective-C protocol.
LookupObjCProtocolName,
+ /// Look up implicit 'self' parameter of an objective-c method.
+ LookupObjCImplicitSelfParam,
/// \brief Look up any declaration with any name.
LookupAnyName
};
@@ -1640,6 +1633,16 @@ private:
bool ConstThis,
bool VolatileThis);
+ // \brief The set of known/encountered (unique, canonicalized) NamespaceDecls.
+ //
+ // The boolean value will be true to indicate that the namespace was loaded
+ // from an AST/PCH file, or false otherwise.
+ llvm::DenseMap<NamespaceDecl*, bool> KnownNamespaces;
+
+ /// \brief Whether we have already loaded known namespaces from an extenal
+ /// source.
+ bool LoadedExternalKnownNamespaces;
+
public:
/// \brief Look up a name, looking for a single declaration. Return
/// null if the results were absent, ambiguous, or overloaded.
@@ -1669,9 +1672,12 @@ public:
DeclContextLookupResult LookupConstructors(CXXRecordDecl *Class);
CXXConstructorDecl *LookupDefaultConstructor(CXXRecordDecl *Class);
- CXXConstructorDecl *LookupCopyConstructor(CXXRecordDecl *Class,
- unsigned Quals,
- bool *ConstParam = 0);
+ CXXConstructorDecl *LookupCopyingConstructor(CXXRecordDecl *Class,
+ unsigned Quals,
+ bool *ConstParam = 0);
+ CXXMethodDecl *LookupCopyingAssignment(CXXRecordDecl *Class, unsigned Quals,
+ bool RValueThis, unsigned ThisQuals,
+ bool *ConstParam = 0);
CXXDestructorDecl *LookupDestructor(CXXRecordDecl *Class);
void ArgumentDependentLookup(DeclarationName Name, bool Operator,
@@ -1713,11 +1719,13 @@ public:
CTC_ObjCMessageReceiver
};
- DeclarationName CorrectTypo(LookupResult &R, Scope *S, CXXScopeSpec *SS,
- DeclContext *MemberContext = 0,
- bool EnteringContext = false,
- CorrectTypoContext CTC = CTC_Unknown,
- const ObjCObjectPointerType *OPT = 0);
+ TypoCorrection CorrectTypo(const DeclarationNameInfo &Typo,
+ Sema::LookupNameKind LookupKind,
+ Scope *S, CXXScopeSpec *SS,
+ DeclContext *MemberContext = NULL,
+ bool EnteringContext = false,
+ CorrectTypoContext CTC = CTC_Unknown,
+ const ObjCObjectPointerType *OPT = NULL);
void FindAssociatedClassesAndNamespaces(Expr **Args, unsigned NumArgs,
AssociatedNamespaceSet &AssociatedNamespaces,
@@ -1853,14 +1861,20 @@ public:
void AtomicPropertySetterGetterRules(ObjCImplDecl* IMPDecl,
ObjCContainerDecl* IDecl);
+ void DiagnoseOwningPropertyGetterSynthesis(const ObjCImplementationDecl *D);
+
void DiagnoseDuplicateIvars(ObjCInterfaceDecl *ID, ObjCInterfaceDecl *SID);
+ enum MethodMatchStrategy {
+ MMS_loose,
+ MMS_strict
+ };
+
/// MatchTwoMethodDeclarations - Checks if two methods' type match and returns
/// true, or false, accordingly.
bool MatchTwoMethodDeclarations(const ObjCMethodDecl *Method,
const ObjCMethodDecl *PrevMethod,
- bool matchBasedOnSizeAndAlignment = false,
- bool matchBasedOnStrictEqulity = false);
+ MethodMatchStrategy strategy = MMS_strict);
/// MatchAllMethodDeclarations - Check methods declaraed in interface or
/// or protocol against those declared in their implementations.
@@ -2073,10 +2087,13 @@ public:
Expr *SynchExpr,
Stmt *SynchBody);
+ StmtResult ActOnObjCAutoreleasePoolStmt(SourceLocation AtLoc, Stmt *Body);
+
VarDecl *BuildExceptionDeclaration(Scope *S, TypeSourceInfo *TInfo,
SourceLocation StartLoc,
SourceLocation IdLoc,
IdentifierInfo *Id);
+
Decl *ActOnExceptionDeclarator(Scope *S, Declarator &D);
StmtResult ActOnCXXCatchBlock(SourceLocation CatchLoc,
@@ -2130,6 +2147,9 @@ public:
void HandleDelayedDeprecationCheck(sema::DelayedDiagnostic &DD, Decl *Ctx);
+ bool makeUnavailableInSystemHeader(SourceLocation loc,
+ llvm::StringRef message);
+
//===--------------------------------------------------------------------===//
// Expression Parsing Callbacks: SemaExpr.cpp.
@@ -2146,6 +2166,8 @@ public:
void PopExpressionEvaluationContext();
+ void DiscardCleanupsInEvaluationContext();
+
void MarkDeclarationReferenced(SourceLocation Loc, Decl *D);
void MarkDeclarationsReferencedInType(SourceLocation Loc, QualType T);
void MarkDeclarationsReferencedInExpr(Expr *E);
@@ -2177,6 +2199,11 @@ public:
ExprResult ActOnIdExpression(Scope *S, CXXScopeSpec &SS, UnqualifiedId &Name,
bool HasTrailingLParen, bool IsAddressOfOperand);
+ void DecomposeUnqualifiedId(const UnqualifiedId &Id,
+ TemplateArgumentListInfo &Buffer,
+ DeclarationNameInfo &NameInfo,
+ const TemplateArgumentListInfo *&TemplateArgs);
+
bool DiagnoseEmptyLookup(Scope *S, CXXScopeSpec &SS, LookupResult &R,
CorrectTypoContext CTC = CTC_Unknown);
@@ -2232,8 +2259,7 @@ public:
ExprResult ActOnParenExpr(SourceLocation L, SourceLocation R, Expr *Val);
ExprResult ActOnParenOrParenListExpr(SourceLocation L,
SourceLocation R,
- MultiExprArg Val,
- ParsedType TypeOfCast = ParsedType());
+ MultiExprArg Val);
/// ActOnStringLiteral - The specified tokens were lexed as pasted string
/// fragments (e.g. "foo" "bar" L"baz").
@@ -2356,21 +2382,19 @@ public:
MultiExprArg ExecConfig, SourceLocation GGGLoc);
ExprResult ActOnCastExpr(Scope *S, SourceLocation LParenLoc,
- ParsedType Ty, SourceLocation RParenLoc,
- Expr *Op);
+ Declarator &D, ParsedType &Ty,
+ SourceLocation RParenLoc, Expr *Op);
ExprResult BuildCStyleCastExpr(SourceLocation LParenLoc,
TypeSourceInfo *Ty,
SourceLocation RParenLoc,
Expr *Op);
- bool TypeIsVectorType(ParsedType Ty) {
- return GetTypeFromParser(Ty)->isVectorType();
- }
+ /// \brief Build an altivec or OpenCL literal.
+ ExprResult BuildVectorLiteral(SourceLocation LParenLoc,
+ SourceLocation RParenLoc, Expr *E,
+ TypeSourceInfo *TInfo);
ExprResult MaybeConvertParenListExprToParenExpr(Scope *S, Expr *ME);
- ExprResult ActOnCastOfParenListExpr(Scope *S, SourceLocation LParenLoc,
- SourceLocation RParenLoc, Expr *E,
- TypeSourceInfo *TInfo);
ExprResult ActOnCompoundLiteral(SourceLocation LParenLoc,
ParsedType Ty,
@@ -2805,7 +2829,7 @@ public:
ExprResult ActOnCXXNamedCast(SourceLocation OpLoc,
tok::TokenKind Kind,
SourceLocation LAngleBracketLoc,
- ParsedType Ty,
+ Declarator &D,
SourceLocation RAngleBracketLoc,
SourceLocation LParenLoc,
Expr *E,
@@ -2863,8 +2887,11 @@ public:
ExprResult ActOnCXXNullPtrLiteral(SourceLocation Loc);
//// ActOnCXXThrow - Parse throw expressions.
- ExprResult ActOnCXXThrow(SourceLocation OpLoc, Expr *expr);
- ExprResult CheckCXXThrowOperand(SourceLocation ThrowLoc, Expr *E);
+ ExprResult ActOnCXXThrow(Scope *S, SourceLocation OpLoc, Expr *expr);
+ ExprResult BuildCXXThrow(SourceLocation OpLoc, Expr *Ex,
+ bool IsThrownVarInScope);
+ ExprResult CheckCXXThrowOperand(SourceLocation ThrowLoc, Expr *E,
+ bool IsThrownVarInScope);
/// ActOnCXXTypeConstructExpr - Parse construction of a specified type.
/// Can be interpreted either as function-style casting ("int(x)")
@@ -4290,12 +4317,27 @@ public:
QualType *FunctionType,
sema::TemplateDeductionInfo &Info);
+ /// brief A function argument from which we performed template argument
+ // deduction for a call.
+ struct OriginalCallArg {
+ OriginalCallArg(QualType OriginalParamType,
+ unsigned ArgIdx,
+ QualType OriginalArgType)
+ : OriginalParamType(OriginalParamType), ArgIdx(ArgIdx),
+ OriginalArgType(OriginalArgType) { }
+
+ QualType OriginalParamType;
+ unsigned ArgIdx;
+ QualType OriginalArgType;
+ };
+
TemplateDeductionResult
FinishTemplateArgumentDeduction(FunctionTemplateDecl *FunctionTemplate,
llvm::SmallVectorImpl<DeducedTemplateArgument> &Deduced,
unsigned NumExplicitlySpecified,
FunctionDecl *&Specialization,
- sema::TemplateDeductionInfo &Info);
+ sema::TemplateDeductionInfo &Info,
+ llvm::SmallVectorImpl<OriginalCallArg> const *OriginalCallArgs = 0);
TemplateDeductionResult
DeduceTemplateArguments(FunctionTemplateDecl *FunctionTemplate,
@@ -4701,7 +4743,7 @@ public:
/// \brief The number of typos corrected by CorrectTypo.
unsigned TyposCorrected;
- typedef llvm::DenseMap<IdentifierInfo *, std::pair<llvm::StringRef, bool> >
+ typedef llvm::DenseMap<IdentifierInfo *, TypoCorrection>
UnqualifiedTyposCorrectedMap;
/// \brief A cache containing the results of typo correction for unqualified
@@ -4806,7 +4848,7 @@ public:
bool Complain = true);
void InstantiateAttrs(const MultiLevelTemplateArgumentList &TemplateArgs,
- Decl *Pattern, Decl *Inst);
+ const Decl *Pattern, Decl *Inst);
bool
InstantiateClassTemplateSpecialization(SourceLocation PointOfInstantiation,
@@ -4982,6 +5024,15 @@ public:
IdentifierInfo *PropertyIvar,
SourceLocation PropertyIvarLoc);
+ enum ObjCSpecialMethodKind {
+ OSMK_None,
+ OSMK_Alloc,
+ OSMK_New,
+ OSMK_Copy,
+ OSMK_RetainingInit,
+ OSMK_NonRetainingInit
+ };
+
struct ObjCArgInfo {
IdentifierInfo *Name;
SourceLocation NameLoc;
@@ -5020,9 +5071,12 @@ public:
const ObjCObjectPointerType *OPT,
bool IsInstance);
+ bool inferObjCARCLifetime(ValueDecl *decl);
+
ExprResult
HandleExprPropertyRefExpr(const ObjCObjectPointerType *OPT,
Expr *BaseExpr,
+ SourceLocation OpLoc,
DeclarationName MemberName,
SourceLocation MemberLoc,
SourceLocation SuperLoc, QualType SuperType,
@@ -5098,6 +5152,22 @@ public:
SourceLocation RBracLoc,
MultiExprArg Args);
+ ExprResult BuildObjCBridgedCast(SourceLocation LParenLoc,
+ ObjCBridgeCastKind Kind,
+ SourceLocation BridgeKeywordLoc,
+ TypeSourceInfo *TSInfo,
+ Expr *SubExpr);
+
+ ExprResult ActOnObjCBridgedCast(Scope *S,
+ SourceLocation LParenLoc,
+ ObjCBridgeCastKind Kind,
+ SourceLocation BridgeKeywordLoc,
+ ParsedType Type,
+ SourceLocation RParenLoc,
+ Expr *SubExpr);
+
+ bool checkInitMethod(ObjCMethodDecl *method, QualType receiverTypeIfCall);
+
/// \brief Check whether the given new method is a valid override of the
/// given overridden method, and set any properties that should be inherited.
///
@@ -5105,7 +5175,7 @@ public:
bool CheckObjCMethodOverride(ObjCMethodDecl *NewMethod,
const ObjCMethodDecl *Overridden,
bool IsImplementation);
-
+
/// \brief Check whether the given method overrides any methods in its class,
/// calling \c CheckObjCMethodOverride for each overridden method.
bool CheckObjCMethodOverrides(ObjCMethodDecl *NewMethod, DeclContext *DC);
@@ -5208,12 +5278,26 @@ public:
/// from the inner expression.
ExprValueKind CastCategory(Expr *E);
+ /// \brief The kind of conversion being performed.
+ enum CheckedConversionKind {
+ /// \brief An implicit conversion.
+ CCK_ImplicitConversion,
+ /// \brief A C-style cast.
+ CCK_CStyleCast,
+ /// \brief A functional-style cast.
+ CCK_FunctionalCast,
+ /// \brief A cast other than a C-style cast.
+ CCK_OtherCast
+ };
+
/// ImpCastExprToType - If Expr is not of type 'Type', insert an implicit
/// cast. If there is already an implicit cast, merge into the existing one.
/// If isLvalue, the result of the cast is an lvalue.
ExprResult ImpCastExprToType(Expr *E, QualType Type, CastKind CK,
ExprValueKind VK = VK_RValue,
- const CXXCastPath *BasePath = 0);
+ const CXXCastPath *BasePath = 0,
+ CheckedConversionKind CCK
+ = CCK_ImplicitConversion);
/// ScalarTypeToBooleanCastKind - Returns the cast kind corresponding
/// to the conversion from scalar type ScalarTy to the Boolean type.
@@ -5343,6 +5427,10 @@ public:
/// "id <XXX>" = "Foo *", where "Foo *" doesn't implement the XXX protocol.
IncompatibleObjCQualifiedId,
+ /// IncompatibleObjCWeakRef - Assigning a weak-unavailable object to an
+ /// object with __weak qualifier.
+ IncompatibleObjCWeakRef,
+
/// Incompatible - We reject this conversion outright, it is invalid to
/// represent it in the AST.
Incompatible
@@ -5393,11 +5481,12 @@ public:
ExprResult PerformImplicitConversion(Expr *From, QualType ToType,
const ImplicitConversionSequence& ICS,
AssignmentAction Action,
- bool CStyle = false);
+ CheckedConversionKind CCK
+ = CCK_ImplicitConversion);
ExprResult PerformImplicitConversion(Expr *From, QualType ToType,
const StandardConversionSequence& SCS,
AssignmentAction Action,
- bool CStyle);
+ CheckedConversionKind CCK);
/// the following "Check" methods will return a valid/converted QualType
/// or a null QualType (indicating an error diagnostic was issued).
@@ -5459,7 +5548,8 @@ public:
SourceLocation QuestionLoc);
/// type checking for vector binary operators.
- QualType CheckVectorOperands(SourceLocation l, ExprResult &lex, ExprResult &rex);
+ QualType CheckVectorOperands(ExprResult &lex, ExprResult &rex,
+ SourceLocation Loc, bool isCompAssign);
QualType CheckVectorCompareOperands(ExprResult &lex, ExprResult &rx,
SourceLocation l, bool isRel);
@@ -5494,12 +5584,14 @@ public:
ReferenceCompareResult CompareReferenceRelationship(SourceLocation Loc,
QualType T1, QualType T2,
bool &DerivedToBase,
- bool &ObjCConversion);
+ bool &ObjCConversion,
+ bool &ObjCLifetimeConversion);
/// CheckCastTypes - Check type constraints for casting between types under
/// C semantics, or forward to CXXCheckCStyleCast in C++.
- ExprResult CheckCastTypes(SourceRange TyRange, QualType CastTy, Expr *CastExpr,
- CastKind &Kind, ExprValueKind &VK, CXXCastPath &BasePath,
+ ExprResult CheckCastTypes(SourceLocation CastStartLoc, SourceRange TyRange,
+ QualType CastTy, Expr *CastExpr, CastKind &Kind,
+ ExprValueKind &VK, CXXCastPath &BasePath,
bool FunctionalStyle = false);
ExprResult checkUnknownAnyCast(SourceRange TyRange, QualType castType,
@@ -5526,6 +5618,31 @@ public:
ExprResult CXXCheckCStyleCast(SourceRange R, QualType CastTy, ExprValueKind &VK,
Expr *CastExpr, CastKind &Kind,
CXXCastPath &BasePath, bool FunctionalStyle);
+
+ /// \brief Checks for valid expressions which can be cast to an ObjC
+ /// pointer without needing a bridge cast.
+ bool ValidObjCARCNoBridgeCastExpr(Expr *&Exp, QualType castType);
+
+ /// \brief Checks for invalid conversions and casts between
+ /// retainable pointers and other pointer kinds.
+ void CheckObjCARCConversion(SourceRange castRange, QualType castType,
+ Expr *&op, CheckedConversionKind CCK);
+
+ bool CheckObjCARCUnavailableWeakConversion(QualType castType,
+ QualType ExprType);
+
+ /// checkRetainCycles - Check whether an Objective-C message send
+ /// might create an obvious retain cycle.
+ void checkRetainCycles(ObjCMessageExpr *msg);
+ void checkRetainCycles(Expr *receiver, Expr *argument);
+
+ /// checkUnsafeAssigns - Check whether +1 expr is being assigned
+ /// to weak/__unsafe_unretained type.
+ bool checkUnsafeAssigns(SourceLocation Loc, QualType LHS, Expr *RHS);
+
+ /// checkUnsafeExprAssigns - Check whether +1 expr is being assigned
+ /// to weak/__unsafe_unretained expression.
+ void checkUnsafeExprAssigns(SourceLocation Loc, Expr *LHS, Expr *RHS);
/// CheckMessageArgumentTypes - Check types in an Obj-C message send.
/// \param Method - May be null.
@@ -5544,7 +5661,7 @@ public:
QualType getMessageSendResultType(QualType ReceiverType,
ObjCMethodDecl *Method,
bool isClassMessage, bool isSuperMessage);
-
+
/// \brief If the given expression involves a message send to a method
/// with a related result type, emit a note describing what happened.
void EmitRelatedResultTypeNote(const Expr *E);
@@ -5749,8 +5866,6 @@ public:
llvm::SmallVectorImpl<CodeCompletionResult> &Results);
//@}
- void PrintStats() const {}
-
//===--------------------------------------------------------------------===//
// Extra semantic analysis beyond the C type system
@@ -5802,8 +5917,17 @@ private:
unsigned format_idx, unsigned firstDataArg,
bool isPrintf);
- void CheckMemsetcpymoveArguments(const CallExpr *Call,
- const IdentifierInfo *FnName);
+ /// \brief Enumeration used to describe which of the memory setting or copying
+ /// functions is being checked by \c CheckMemsetcpymoveArguments().
+ enum CheckedMemoryFunction {
+ CMF_Memset,
+ CMF_Memcpy,
+ CMF_Memmove
+ };
+
+ void CheckMemsetcpymoveArguments(const CallExpr *Call,
+ CheckedMemoryFunction CMF,
+ IdentifierInfo *FnName);
void CheckReturnStackAddr(Expr *RetValExp, QualType lhsType,
SourceLocation ReturnLoc);
@@ -5820,10 +5944,20 @@ private:
protected:
friend class Parser;
- friend class InitializationSequence;
+ friend class InitializationSequence;
+ friend class ASTReader;
+ friend class ASTWriter;
+public:
/// \brief Retrieve the parser's current scope.
- Scope *getCurScope() const { return CurScope; }
+ ///
+ /// This routine must only be used when it is certain that semantic analysis
+ /// and the parser are in precisely the same context, which is not the case
+ /// when, e.g., we are performing any kind of template instantiation.
+ /// Therefore, the only safe places to use this scope are in the parser
+ /// itself and in routines directly invoked from the parser and *never* from
+ /// template substitution or instantiation.
+ Scope *getCurScope() const { return CurScope; }
};
/// \brief RAII object that enters a new expression evaluation context.
diff --git a/contrib/llvm/tools/clang/include/clang/Sema/TypoCorrection.h b/contrib/llvm/tools/clang/include/clang/Sema/TypoCorrection.h
new file mode 100644
index 0000000..9965953
--- /dev/null
+++ b/contrib/llvm/tools/clang/include/clang/Sema/TypoCorrection.h
@@ -0,0 +1,105 @@
+//===--- TypoCorrection.h - Class for typo correction results ---*- C++ -*-===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+//
+// This file defines the TypoCorrection class, which stores the results of
+// Sema's typo correction (Sema::CorrectTypo).
+//
+//===----------------------------------------------------------------------===//
+
+#ifndef LLVM_CLANG_SEMA_TYPOCORRECTION_H
+#define LLVM_CLANG_SEMA_TYPOCORRECTION_H
+
+#include "clang/AST/DeclCXX.h"
+
+namespace clang {
+
+/// @brief Simple class containing the result of Sema::CorrectTypo
+class TypoCorrection {
+public:
+ TypoCorrection(const DeclarationName &Name, NamedDecl *NameDecl,
+ NestedNameSpecifier *NNS=NULL, unsigned distance=0)
+ : CorrectionName(Name),
+ CorrectionNameSpec(NNS),
+ CorrectionDecl(NameDecl),
+ EditDistance(distance) {}
+
+ TypoCorrection(NamedDecl *Name, NestedNameSpecifier *NNS=NULL,
+ unsigned distance=0)
+ : CorrectionName(Name->getDeclName()),
+ CorrectionNameSpec(NNS),
+ CorrectionDecl(Name),
+ EditDistance(distance) {}
+
+ TypoCorrection(DeclarationName Name, NestedNameSpecifier *NNS=NULL,
+ unsigned distance=0)
+ : CorrectionName(Name),
+ CorrectionNameSpec(NNS),
+ CorrectionDecl(NULL),
+ EditDistance(distance) {}
+
+ TypoCorrection()
+ : CorrectionName(), CorrectionNameSpec(NULL), CorrectionDecl(NULL),
+ EditDistance(0) {}
+
+ /// \brief Gets the DeclarationName of the typo correction
+ DeclarationName getCorrection() const { return CorrectionName; }
+ IdentifierInfo* getCorrectionAsIdentifierInfo() const {
+ return CorrectionName.getAsIdentifierInfo();
+ }
+
+ /// \brief Gets the NestedNameSpecifier needed to use the typo correction
+ NestedNameSpecifier* getCorrectionSpecifier() const {
+ return CorrectionNameSpec;
+ }
+ void setCorrectionSpecifier(NestedNameSpecifier* NNS) {
+ CorrectionNameSpec = NNS;
+ }
+
+ /// \brief Gets the "edit distance" of the typo correction from the typo
+ unsigned getEditDistance() const { return EditDistance; }
+
+ /// \brief Gets the pointer to the declaration of the typo correction
+ NamedDecl* getCorrectionDecl() const {
+ return isKeyword() ? NULL : CorrectionDecl;
+ }
+ template <class DeclClass>
+ DeclClass *getCorrectionDeclAs() const {
+ return dyn_cast_or_null<DeclClass>(getCorrectionDecl());
+ }
+
+ void setCorrectionDecl(NamedDecl *CDecl) {
+ CorrectionDecl = CDecl;
+ if (!CorrectionName)
+ CorrectionName = CDecl->getDeclName();
+ }
+
+ std::string getAsString(const LangOptions &LO) const;
+ std::string getQuoted(const LangOptions &LO) const {
+ return "'" + getAsString(LO) + "'";
+ }
+
+ operator bool() const { return bool(CorrectionName); }
+
+ static inline NamedDecl *KeywordDecl() { return (NamedDecl*)-1; }
+ bool isKeyword() const { return CorrectionDecl == KeywordDecl(); }
+
+ // Returns true if the correction either is a keyword or has a known decl.
+ bool isResolved() const { return CorrectionDecl != NULL; }
+
+private:
+ // Results.
+ DeclarationName CorrectionName;
+ NestedNameSpecifier *CorrectionNameSpec;
+ NamedDecl *CorrectionDecl;
+ unsigned EditDistance;
+};
+
+}
+
+#endif
diff --git a/contrib/llvm/tools/clang/include/clang/Serialization/ASTBitCodes.h b/contrib/llvm/tools/clang/include/clang/Serialization/ASTBitCodes.h
index c881b23..11b8bed 100644
--- a/contrib/llvm/tools/clang/include/clang/Serialization/ASTBitCodes.h
+++ b/contrib/llvm/tools/clang/include/clang/Serialization/ASTBitCodes.h
@@ -371,7 +371,11 @@ namespace clang {
/// \brief Record code for the table of offsets into the block
/// of file source-location information.
- FILE_SOURCE_LOCATION_OFFSETS = 45
+ FILE_SOURCE_LOCATION_OFFSETS = 45,
+
+ /// \brief Record code for the set of known namespaces, which are used
+ /// for typo correction.
+ KNOWN_NAMESPACES = 46
};
@@ -388,8 +392,8 @@ namespace clang {
/// SM_SLOC_BUFFER_ENTRY record.
SM_SLOC_BUFFER_BLOB = 3,
/// \brief Describes a source location entry (SLocEntry) for a
- /// macro instantiation.
- SM_SLOC_INSTANTIATION_ENTRY = 4,
+ /// macro expansion.
+ SM_SLOC_EXPANSION_ENTRY = 4,
/// \brief Describes the SourceManager's line table, with
/// information about #line directives.
SM_LINE_TABLE = 5
@@ -416,9 +420,8 @@ namespace clang {
/// \brief Record types used within a preprocessor detail block.
enum PreprocessorDetailRecordTypes {
- /// \brief Describes a macro instantiation within the preprocessing
- /// record.
- PPD_MACRO_INSTANTIATION = 0,
+ /// \brief Describes a macro expansion within the preprocessing record.
+ PPD_MACRO_EXPANSION = 0,
/// \brief Describes a macro definition within the preprocessing record.
PPD_MACRO_DEFINITION = 1,
@@ -922,6 +925,8 @@ namespace clang {
EXPR_OBJC_MESSAGE_EXPR,
/// \brief An ObjCIsa Expr record.
EXPR_OBJC_ISA,
+ /// \breif An ObjCIndirectCopyRestoreExpr record.
+ EXPR_OBJC_INDIRECT_COPY_RESTORE,
/// \brief An ObjCForCollectionStmt record.
STMT_OBJC_FOR_COLLECTION,
@@ -935,6 +940,8 @@ namespace clang {
STMT_OBJC_AT_SYNCHRONIZED,
/// \brief An ObjCAtThrowStmt record.
STMT_OBJC_AT_THROW,
+ /// \brief An ObjCAutoreleasePoolStmt record.
+ STMT_OBJC_AUTORELEASE_POOL,
// C++
@@ -968,8 +975,6 @@ namespace clang {
EXPR_CXX_NULL_PTR_LITERAL, // CXXNullPtrLiteralExpr
EXPR_CXX_TYPEID_EXPR, // CXXTypeidExpr (of expr).
EXPR_CXX_TYPEID_TYPE, // CXXTypeidExpr (of type).
- EXPR_CXX_UUIDOF_EXPR, // CXXUuidofExpr (of expr).
- EXPR_CXX_UUIDOF_TYPE, // CXXUuidofExpr (of type).
EXPR_CXX_THIS, // CXXThisExpr
EXPR_CXX_THROW, // CXXThrowExpr
EXPR_CXX_DEFAULT_ARG, // CXXDefaultArgExpr
@@ -999,14 +1004,25 @@ namespace clang {
EXPR_PACK_EXPANSION, // PackExpansionExpr
EXPR_SIZEOF_PACK, // SizeOfPackExpr
+ EXPR_SUBST_NON_TYPE_TEMPLATE_PARM, // SubstNonTypeTemplateParmExpr
EXPR_SUBST_NON_TYPE_TEMPLATE_PARM_PACK,// SubstNonTypeTemplateParmPackExpr
-
+ EXPR_MATERIALIZE_TEMPORARY, // MaterializeTemporaryExpr
+
// CUDA
+ EXPR_CUDA_KERNEL_CALL, // CUDAKernelCallExpr
- EXPR_CUDA_KERNEL_CALL, // CUDAKernelCallExpr
-
// OpenCL
- EXPR_ASTYPE // An AsTypeExpr record.
+ EXPR_ASTYPE, // AsTypeExpr
+
+ // Microsoft
+ EXPR_CXX_UUIDOF_EXPR, // CXXUuidofExpr (of expr).
+ EXPR_CXX_UUIDOF_TYPE, // CXXUuidofExpr (of type).
+ STMT_SEH_EXCEPT, // SEHExceptStmt
+ STMT_SEH_FINALLY, // SEHFinallyStmt
+ STMT_SEH_TRY, // SEHTryStmt
+
+ // ARC
+ EXPR_OBJC_BRIDGED_CAST // ObjCBridgedCastExpr
};
/// \brief The kinds of designators that can occur in a
diff --git a/contrib/llvm/tools/clang/include/clang/Serialization/ASTReader.h b/contrib/llvm/tools/clang/include/clang/Serialization/ASTReader.h
index 8923e2a..9e210c3 100644
--- a/contrib/llvm/tools/clang/include/clang/Serialization/ASTReader.h
+++ b/contrib/llvm/tools/clang/include/clang/Serialization/ASTReader.h
@@ -625,6 +625,9 @@ private:
/// \brief The OpenCL extension settings.
llvm::SmallVector<uint64_t, 1> OpenCLExtensions;
+ /// \brief A list of the namespaces we've seen.
+ llvm::SmallVector<uint64_t, 4> KnownNamespaces;
+
//@}
/// \brief Diagnostic IDs and their mappings that the user changed.
@@ -1067,7 +1070,7 @@ public:
///
/// \returns true if there was an error while reading the
/// declarations for this declaration context.
- virtual bool FindExternalLexicalDecls(const DeclContext *DC,
+ virtual ExternalLoadResult FindExternalLexicalDecls(const DeclContext *DC,
bool (*isKindWeWant)(Decl::Kind),
llvm::SmallVectorImpl<Decl*> &Decls);
@@ -1125,6 +1128,11 @@ public:
virtual std::pair<ObjCMethodList, ObjCMethodList>
ReadMethodPool(Selector Sel);
+ /// \brief Load the set of namespaces that are known to the external source,
+ /// which will be used during typo correction.
+ virtual void ReadKnownNamespaces(
+ llvm::SmallVectorImpl<NamespaceDecl *> &Namespaces);
+
/// \brief Load a selector from disk, registering its ID if it exists.
void LoadSelector(Selector Sel);
diff --git a/contrib/llvm/tools/clang/include/clang/Serialization/ASTWriter.h b/contrib/llvm/tools/clang/include/clang/Serialization/ASTWriter.h
index 78a63ab..18e1501 100644
--- a/contrib/llvm/tools/clang/include/clang/Serialization/ASTWriter.h
+++ b/contrib/llvm/tools/clang/include/clang/Serialization/ASTWriter.h
@@ -383,7 +383,7 @@ public:
/// are relative to the given system root.
///
/// \param PPRec Record of the preprocessing actions that occurred while
- /// preprocessing this file, e.g., macro instantiations
+ /// preprocessing this file, e.g., macro expansions
void WriteAST(Sema &SemaRef, MemorizeStatCalls *StatCalls,
const std::string &OutputFile,
const char* isysroot);
diff --git a/contrib/llvm/tools/clang/include/clang/Serialization/ChainedIncludesSource.h b/contrib/llvm/tools/clang/include/clang/Serialization/ChainedIncludesSource.h
index 0c3e86f..f547902 100644
--- a/contrib/llvm/tools/clang/include/clang/Serialization/ChainedIncludesSource.h
+++ b/contrib/llvm/tools/clang/include/clang/Serialization/ChainedIncludesSource.h
@@ -47,7 +47,7 @@ protected:
virtual DeclContextLookupResult
FindExternalVisibleDeclsByName(const DeclContext *DC, DeclarationName Name);
virtual void MaterializeVisibleDecls(const DeclContext *DC);
- virtual bool FindExternalLexicalDecls(const DeclContext *DC,
+ virtual ExternalLoadResult FindExternalLexicalDecls(const DeclContext *DC,
bool (*isKindWeWant)(Decl::Kind),
llvm::SmallVectorImpl<Decl*> &Result);
virtual void CompleteType(TagDecl *Tag);
diff --git a/contrib/llvm/tools/clang/include/clang/StaticAnalyzer/Core/PathSensitive/GRStateTrait.h b/contrib/llvm/tools/clang/include/clang/StaticAnalyzer/Core/PathSensitive/GRStateTrait.h
index 07cdbf5..de7b868 100644
--- a/contrib/llvm/tools/clang/include/clang/StaticAnalyzer/Core/PathSensitive/GRStateTrait.h
+++ b/contrib/llvm/tools/clang/include/clang/StaticAnalyzer/Core/PathSensitive/GRStateTrait.h
@@ -124,6 +124,10 @@ namespace ento {
return F.add(K, L);
}
+ static bool Contains(data_type L, key_type K) {
+ return L.contains(K);
+ }
+
static inline data_type MakeData(void* const* p) {
return p ? data_type((const llvm::ImmutableListImpl<T>*) *p)
: data_type(0);
diff --git a/contrib/llvm/tools/clang/lib/ARCMigrate/ARCMT.cpp b/contrib/llvm/tools/clang/lib/ARCMigrate/ARCMT.cpp
new file mode 100644
index 0000000..f1d947d
--- /dev/null
+++ b/contrib/llvm/tools/clang/lib/ARCMigrate/ARCMT.cpp
@@ -0,0 +1,541 @@
+//===--- ARCMT.cpp - Migration to ARC mode --------------------------------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+#include "Internals.h"
+#include "clang/Frontend/ASTUnit.h"
+#include "clang/Frontend/CompilerInstance.h"
+#include "clang/Frontend/Utils.h"
+#include "clang/AST/ASTConsumer.h"
+#include "clang/Rewrite/Rewriter.h"
+#include "clang/Sema/SemaDiagnostic.h"
+#include "clang/Basic/DiagnosticCategories.h"
+#include "clang/Lex/Preprocessor.h"
+#include "llvm/Support/MemoryBuffer.h"
+#include "llvm/ADT/Triple.h"
+
+using namespace clang;
+using namespace arcmt;
+using llvm::StringRef;
+
+bool CapturedDiagList::clearDiagnostic(llvm::ArrayRef<unsigned> IDs,
+ SourceRange range) {
+ if (range.isInvalid())
+ return false;
+
+ bool cleared = false;
+ ListTy::iterator I = List.begin();
+ while (I != List.end()) {
+ FullSourceLoc diagLoc = I->getLocation();
+ if ((IDs.empty() || // empty means clear all diagnostics in the range.
+ std::find(IDs.begin(), IDs.end(), I->getID()) != IDs.end()) &&
+ !diagLoc.isBeforeInTranslationUnitThan(range.getBegin()) &&
+ (diagLoc == range.getEnd() ||
+ diagLoc.isBeforeInTranslationUnitThan(range.getEnd()))) {
+ cleared = true;
+ ListTy::iterator eraseS = I++;
+ while (I != List.end() && I->getLevel() == Diagnostic::Note)
+ ++I;
+ // Clear the diagnostic and any notes following it.
+ List.erase(eraseS, I);
+ continue;
+ }
+
+ ++I;
+ }
+
+ return cleared;
+}
+
+bool CapturedDiagList::hasDiagnostic(llvm::ArrayRef<unsigned> IDs,
+ SourceRange range) const {
+ if (range.isInvalid())
+ return false;
+
+ ListTy::const_iterator I = List.begin();
+ while (I != List.end()) {
+ FullSourceLoc diagLoc = I->getLocation();
+ if ((IDs.empty() || // empty means any diagnostic in the range.
+ std::find(IDs.begin(), IDs.end(), I->getID()) != IDs.end()) &&
+ !diagLoc.isBeforeInTranslationUnitThan(range.getBegin()) &&
+ (diagLoc == range.getEnd() ||
+ diagLoc.isBeforeInTranslationUnitThan(range.getEnd()))) {
+ return true;
+ }
+
+ ++I;
+ }
+
+ return false;
+}
+
+void CapturedDiagList::reportDiagnostics(Diagnostic &Diags) const {
+ for (ListTy::const_iterator I = List.begin(), E = List.end(); I != E; ++I)
+ Diags.Report(*I);
+}
+
+bool CapturedDiagList::hasErrors() const {
+ for (ListTy::const_iterator I = List.begin(), E = List.end(); I != E; ++I)
+ if (I->getLevel() >= Diagnostic::Error)
+ return true;
+
+ return false;
+}
+
+namespace {
+
+class CaptureDiagnosticClient : public DiagnosticClient {
+ Diagnostic &Diags;
+ CapturedDiagList &CapturedDiags;
+public:
+ CaptureDiagnosticClient(Diagnostic &diags,
+ CapturedDiagList &capturedDiags)
+ : Diags(diags), CapturedDiags(capturedDiags) { }
+
+ virtual void HandleDiagnostic(Diagnostic::Level level,
+ const DiagnosticInfo &Info) {
+ if (arcmt::isARCDiagnostic(Info.getID(), Diags) ||
+ level >= Diagnostic::Error || level == Diagnostic::Note) {
+ CapturedDiags.push_back(StoredDiagnostic(level, Info));
+ return;
+ }
+
+ // Non-ARC warnings are ignored.
+ Diags.setLastDiagnosticIgnored();
+ }
+};
+
+} // end anonymous namespace
+
+static inline llvm::StringRef SimulatorVersionDefineName() {
+ return "__IPHONE_OS_VERSION_MIN_REQUIRED=";
+}
+
+/// \brief Parse the simulator version define:
+/// __IPHONE_OS_VERSION_MIN_REQUIRED=([0-9])([0-9][0-9])([0-9][0-9])
+// and return the grouped values as integers, e.g:
+// __IPHONE_OS_VERSION_MIN_REQUIRED=40201
+// will return Major=4, Minor=2, Micro=1.
+static bool GetVersionFromSimulatorDefine(llvm::StringRef define,
+ unsigned &Major, unsigned &Minor,
+ unsigned &Micro) {
+ assert(define.startswith(SimulatorVersionDefineName()));
+ llvm::StringRef name, version;
+ llvm::tie(name, version) = define.split('=');
+ if (version.empty())
+ return false;
+ std::string verstr = version.str();
+ char *end;
+ unsigned num = (unsigned) strtol(verstr.c_str(), &end, 10);
+ if (*end != '\0')
+ return false;
+ Major = num / 10000;
+ num = num % 10000;
+ Minor = num / 100;
+ Micro = num % 100;
+ return true;
+}
+
+static bool HasARCRuntime(CompilerInvocation &origCI) {
+ // This duplicates some functionality from Darwin::AddDeploymentTarget
+ // but this function is well defined, so keep it decoupled from the driver
+ // and avoid unrelated complications.
+
+ for (unsigned i = 0, e = origCI.getPreprocessorOpts().Macros.size();
+ i != e; ++i) {
+ StringRef define = origCI.getPreprocessorOpts().Macros[i].first;
+ bool isUndef = origCI.getPreprocessorOpts().Macros[i].second;
+ if (isUndef)
+ continue;
+ if (!define.startswith(SimulatorVersionDefineName()))
+ continue;
+ unsigned Major, Minor, Micro;
+ if (GetVersionFromSimulatorDefine(define, Major, Minor, Micro) &&
+ Major < 10 && Minor < 100 && Micro < 100)
+ return Major >= 5;
+ }
+
+ llvm::Triple triple(origCI.getTargetOpts().Triple);
+
+ if (triple.getOS() == llvm::Triple::IOS)
+ return triple.getOSMajorVersion() >= 5;
+
+ if (triple.getOS() == llvm::Triple::Darwin)
+ return triple.getOSMajorVersion() >= 11;
+
+ if (triple.getOS() == llvm::Triple::MacOSX) {
+ unsigned Major, Minor, Micro;
+ triple.getOSVersion(Major, Minor, Micro);
+ return Major > 10 || (Major == 10 && Minor >= 7);
+ }
+
+ return false;
+}
+
+CompilerInvocation *createInvocationForMigration(CompilerInvocation &origCI) {
+ llvm::OwningPtr<CompilerInvocation> CInvok;
+ CInvok.reset(new CompilerInvocation(origCI));
+ CInvok->getPreprocessorOpts().ImplicitPCHInclude = std::string();
+ CInvok->getPreprocessorOpts().ImplicitPTHInclude = std::string();
+ std::string define = getARCMTMacroName();
+ define += '=';
+ CInvok->getPreprocessorOpts().addMacroDef(define);
+ CInvok->getLangOpts().ObjCAutoRefCount = true;
+ CInvok->getDiagnosticOpts().ErrorLimit = 0;
+ CInvok->getDiagnosticOpts().Warnings.push_back(
+ "error=arc-unsafe-retained-assign");
+ CInvok->getLangOpts().ObjCRuntimeHasWeak = HasARCRuntime(origCI);
+
+ return CInvok.take();
+}
+
+//===----------------------------------------------------------------------===//
+// checkForManualIssues.
+//===----------------------------------------------------------------------===//
+
+bool arcmt::checkForManualIssues(CompilerInvocation &origCI,
+ llvm::StringRef Filename, InputKind Kind,
+ DiagnosticClient *DiagClient) {
+ if (!origCI.getLangOpts().ObjC1)
+ return false;
+
+ std::vector<TransformFn> transforms = arcmt::getAllTransformations();
+ assert(!transforms.empty());
+
+ llvm::OwningPtr<CompilerInvocation> CInvok;
+ CInvok.reset(createInvocationForMigration(origCI));
+ CInvok->getFrontendOpts().Inputs.clear();
+ CInvok->getFrontendOpts().Inputs.push_back(std::make_pair(Kind, Filename));
+
+ CapturedDiagList capturedDiags;
+
+ assert(DiagClient);
+ llvm::IntrusiveRefCntPtr<DiagnosticIDs> DiagID(new DiagnosticIDs());
+ llvm::IntrusiveRefCntPtr<Diagnostic> Diags(
+ new Diagnostic(DiagID, DiagClient, /*ShouldOwnClient=*/false));
+
+ // Filter of all diagnostics.
+ CaptureDiagnosticClient errRec(*Diags, capturedDiags);
+ Diags->setClient(&errRec, /*ShouldOwnClient=*/false);
+
+ llvm::OwningPtr<ASTUnit> Unit(
+ ASTUnit::LoadFromCompilerInvocationAction(CInvok.take(), Diags));
+ if (!Unit)
+ return true;
+
+ // Don't filter diagnostics anymore.
+ Diags->setClient(DiagClient, /*ShouldOwnClient=*/false);
+
+ ASTContext &Ctx = Unit->getASTContext();
+
+ if (Diags->hasFatalErrorOccurred()) {
+ Diags->Reset();
+ DiagClient->BeginSourceFile(Ctx.getLangOptions(), &Unit->getPreprocessor());
+ capturedDiags.reportDiagnostics(*Diags);
+ DiagClient->EndSourceFile();
+ return true;
+ }
+
+ // After parsing of source files ended, we want to reuse the
+ // diagnostics objects to emit further diagnostics.
+ // We call BeginSourceFile because DiagnosticClient requires that
+ // diagnostics with source range information are emitted only in between
+ // BeginSourceFile() and EndSourceFile().
+ DiagClient->BeginSourceFile(Ctx.getLangOptions(), &Unit->getPreprocessor());
+
+ // No macros will be added since we are just checking and we won't modify
+ // source code.
+ std::vector<SourceLocation> ARCMTMacroLocs;
+
+ TransformActions testAct(*Diags, capturedDiags, Ctx, Unit->getPreprocessor());
+ MigrationPass pass(Ctx, Unit->getSema(), testAct, ARCMTMacroLocs);
+
+ for (unsigned i=0, e = transforms.size(); i != e; ++i)
+ transforms[i](pass);
+
+ capturedDiags.reportDiagnostics(*Diags);
+
+ DiagClient->EndSourceFile();
+
+ // If we are migrating code that gets the '-fobjc-arc' flag, make sure
+ // to remove it so that we don't get errors from normal compilation.
+ origCI.getLangOpts().ObjCAutoRefCount = false;
+
+ return capturedDiags.hasErrors();
+}
+
+//===----------------------------------------------------------------------===//
+// applyTransformations.
+//===----------------------------------------------------------------------===//
+
+static bool applyTransforms(CompilerInvocation &origCI,
+ llvm::StringRef Filename, InputKind Kind,
+ DiagnosticClient *DiagClient,
+ llvm::StringRef outputDir) {
+ if (!origCI.getLangOpts().ObjC1)
+ return false;
+
+ // Make sure checking is successful first.
+ CompilerInvocation CInvokForCheck(origCI);
+ if (arcmt::checkForManualIssues(CInvokForCheck, Filename, Kind, DiagClient))
+ return true;
+
+ CompilerInvocation CInvok(origCI);
+ CInvok.getFrontendOpts().Inputs.clear();
+ CInvok.getFrontendOpts().Inputs.push_back(std::make_pair(Kind, Filename));
+
+ MigrationProcess migration(CInvok, DiagClient, outputDir);
+
+ std::vector<TransformFn> transforms = arcmt::getAllTransformations();
+ assert(!transforms.empty());
+
+ for (unsigned i=0, e = transforms.size(); i != e; ++i) {
+ bool err = migration.applyTransform(transforms[i]);
+ if (err) return true;
+ }
+
+ llvm::IntrusiveRefCntPtr<DiagnosticIDs> DiagID(new DiagnosticIDs());
+ llvm::IntrusiveRefCntPtr<Diagnostic> Diags(
+ new Diagnostic(DiagID, DiagClient, /*ShouldOwnClient=*/false));
+
+ if (outputDir.empty()) {
+ origCI.getLangOpts().ObjCAutoRefCount = true;
+ return migration.getRemapper().overwriteOriginal(*Diags);
+ } else {
+ // If we are migrating code that gets the '-fobjc-arc' flag, make sure
+ // to remove it so that we don't get errors from normal compilation.
+ origCI.getLangOpts().ObjCAutoRefCount = false;
+ return migration.getRemapper().flushToDisk(outputDir, *Diags);
+ }
+}
+
+bool arcmt::applyTransformations(CompilerInvocation &origCI,
+ llvm::StringRef Filename, InputKind Kind,
+ DiagnosticClient *DiagClient) {
+ return applyTransforms(origCI, Filename, Kind, DiagClient, llvm::StringRef());
+}
+
+bool arcmt::migrateWithTemporaryFiles(CompilerInvocation &origCI,
+ llvm::StringRef Filename, InputKind Kind,
+ DiagnosticClient *DiagClient,
+ llvm::StringRef outputDir) {
+ assert(!outputDir.empty() && "Expected output directory path");
+ return applyTransforms(origCI, Filename, Kind, DiagClient, outputDir);
+}
+
+bool arcmt::getFileRemappings(std::vector<std::pair<std::string,std::string> > &
+ remap,
+ llvm::StringRef outputDir,
+ DiagnosticClient *DiagClient) {
+ assert(!outputDir.empty());
+
+ llvm::IntrusiveRefCntPtr<DiagnosticIDs> DiagID(new DiagnosticIDs());
+ llvm::IntrusiveRefCntPtr<Diagnostic> Diags(
+ new Diagnostic(DiagID, DiagClient, /*ShouldOwnClient=*/false));
+
+ FileRemapper remapper;
+ bool err = remapper.initFromDisk(outputDir, *Diags,
+ /*ignoreIfFilesChanged=*/true);
+ if (err)
+ return true;
+
+ CompilerInvocation CI;
+ remapper.applyMappings(CI);
+ remap = CI.getPreprocessorOpts().RemappedFiles;
+
+ return false;
+}
+
+//===----------------------------------------------------------------------===//
+// CollectTransformActions.
+//===----------------------------------------------------------------------===//
+
+namespace {
+
+class ARCMTMacroTrackerPPCallbacks : public PPCallbacks {
+ std::vector<SourceLocation> &ARCMTMacroLocs;
+
+public:
+ ARCMTMacroTrackerPPCallbacks(std::vector<SourceLocation> &ARCMTMacroLocs)
+ : ARCMTMacroLocs(ARCMTMacroLocs) { }
+
+ virtual void MacroExpands(const Token &MacroNameTok, const MacroInfo *MI) {
+ if (MacroNameTok.getIdentifierInfo()->getName() == getARCMTMacroName())
+ ARCMTMacroLocs.push_back(MacroNameTok.getLocation());
+ }
+};
+
+class ARCMTMacroTrackerAction : public ASTFrontendAction {
+ std::vector<SourceLocation> &ARCMTMacroLocs;
+
+public:
+ ARCMTMacroTrackerAction(std::vector<SourceLocation> &ARCMTMacroLocs)
+ : ARCMTMacroLocs(ARCMTMacroLocs) { }
+
+ virtual ASTConsumer *CreateASTConsumer(CompilerInstance &CI,
+ llvm::StringRef InFile) {
+ CI.getPreprocessor().addPPCallbacks(
+ new ARCMTMacroTrackerPPCallbacks(ARCMTMacroLocs));
+ return new ASTConsumer();
+ }
+};
+
+class RewritesApplicator : public TransformActions::RewriteReceiver {
+ Rewriter &rewriter;
+ ASTContext &Ctx;
+ MigrationProcess::RewriteListener *Listener;
+
+public:
+ RewritesApplicator(Rewriter &rewriter, ASTContext &ctx,
+ MigrationProcess::RewriteListener *listener)
+ : rewriter(rewriter), Ctx(ctx), Listener(listener) {
+ if (Listener)
+ Listener->start(ctx);
+ }
+ ~RewritesApplicator() {
+ if (Listener)
+ Listener->finish();
+ }
+
+ virtual void insert(SourceLocation loc, llvm::StringRef text) {
+ bool err = rewriter.InsertText(loc, text, /*InsertAfter=*/true,
+ /*indentNewLines=*/true);
+ if (!err && Listener)
+ Listener->insert(loc, text);
+ }
+
+ virtual void remove(CharSourceRange range) {
+ Rewriter::RewriteOptions removeOpts;
+ removeOpts.IncludeInsertsAtBeginOfRange = false;
+ removeOpts.IncludeInsertsAtEndOfRange = false;
+ removeOpts.RemoveLineIfEmpty = true;
+
+ bool err = rewriter.RemoveText(range, removeOpts);
+ if (!err && Listener)
+ Listener->remove(range);
+ }
+
+ virtual void increaseIndentation(CharSourceRange range,
+ SourceLocation parentIndent) {
+ rewriter.IncreaseIndentation(range, parentIndent);
+ }
+};
+
+} // end anonymous namespace.
+
+/// \brief Anchor for VTable.
+MigrationProcess::RewriteListener::~RewriteListener() { }
+
+MigrationProcess::MigrationProcess(const CompilerInvocation &CI,
+ DiagnosticClient *diagClient,
+ llvm::StringRef outputDir)
+ : OrigCI(CI), DiagClient(diagClient) {
+ if (!outputDir.empty()) {
+ llvm::IntrusiveRefCntPtr<DiagnosticIDs> DiagID(new DiagnosticIDs());
+ llvm::IntrusiveRefCntPtr<Diagnostic> Diags(
+ new Diagnostic(DiagID, DiagClient, /*ShouldOwnClient=*/false));
+ Remapper.initFromDisk(outputDir, *Diags, /*ignoreIfFilesChanges=*/true);
+ }
+}
+
+bool MigrationProcess::applyTransform(TransformFn trans,
+ RewriteListener *listener) {
+ llvm::OwningPtr<CompilerInvocation> CInvok;
+ CInvok.reset(createInvocationForMigration(OrigCI));
+ CInvok->getDiagnosticOpts().IgnoreWarnings = true;
+
+ Remapper.applyMappings(*CInvok);
+
+ CapturedDiagList capturedDiags;
+ std::vector<SourceLocation> ARCMTMacroLocs;
+
+ assert(DiagClient);
+ llvm::IntrusiveRefCntPtr<DiagnosticIDs> DiagID(new DiagnosticIDs());
+ llvm::IntrusiveRefCntPtr<Diagnostic> Diags(
+ new Diagnostic(DiagID, DiagClient, /*ShouldOwnClient=*/false));
+
+ // Filter of all diagnostics.
+ CaptureDiagnosticClient errRec(*Diags, capturedDiags);
+ Diags->setClient(&errRec, /*ShouldOwnClient=*/false);
+
+ llvm::OwningPtr<ARCMTMacroTrackerAction> ASTAction;
+ ASTAction.reset(new ARCMTMacroTrackerAction(ARCMTMacroLocs));
+
+ llvm::OwningPtr<ASTUnit> Unit(
+ ASTUnit::LoadFromCompilerInvocationAction(CInvok.take(), Diags,
+ ASTAction.get()));
+ if (!Unit)
+ return true;
+ Unit->setOwnsRemappedFileBuffers(false); // FileRemapper manages that.
+
+ // Don't filter diagnostics anymore.
+ Diags->setClient(DiagClient, /*ShouldOwnClient=*/false);
+
+ ASTContext &Ctx = Unit->getASTContext();
+
+ if (Diags->hasFatalErrorOccurred()) {
+ Diags->Reset();
+ DiagClient->BeginSourceFile(Ctx.getLangOptions(), &Unit->getPreprocessor());
+ capturedDiags.reportDiagnostics(*Diags);
+ DiagClient->EndSourceFile();
+ return true;
+ }
+
+ // After parsing of source files ended, we want to reuse the
+ // diagnostics objects to emit further diagnostics.
+ // We call BeginSourceFile because DiagnosticClient requires that
+ // diagnostics with source range information are emitted only in between
+ // BeginSourceFile() and EndSourceFile().
+ DiagClient->BeginSourceFile(Ctx.getLangOptions(), &Unit->getPreprocessor());
+
+ Rewriter rewriter(Ctx.getSourceManager(), Ctx.getLangOptions());
+ TransformActions TA(*Diags, capturedDiags, Ctx, Unit->getPreprocessor());
+ MigrationPass pass(Ctx, Unit->getSema(), TA, ARCMTMacroLocs);
+
+ trans(pass);
+
+ {
+ RewritesApplicator applicator(rewriter, Ctx, listener);
+ TA.applyRewrites(applicator);
+ }
+
+ DiagClient->EndSourceFile();
+
+ if (DiagClient->getNumErrors())
+ return true;
+
+ for (Rewriter::buffer_iterator
+ I = rewriter.buffer_begin(), E = rewriter.buffer_end(); I != E; ++I) {
+ FileID FID = I->first;
+ RewriteBuffer &buf = I->second;
+ const FileEntry *file = Ctx.getSourceManager().getFileEntryForID(FID);
+ assert(file);
+ std::string newFname = file->getName();
+ newFname += "-trans";
+ llvm::SmallString<512> newText;
+ llvm::raw_svector_ostream vecOS(newText);
+ buf.write(vecOS);
+ vecOS.flush();
+ llvm::MemoryBuffer *memBuf = llvm::MemoryBuffer::getMemBufferCopy(
+ llvm::StringRef(newText.data(), newText.size()), newFname);
+ llvm::SmallString<64> filePath(file->getName());
+ Unit->getFileManager().FixupRelativePath(filePath);
+ Remapper.remap(filePath.str(), memBuf);
+ }
+
+ return false;
+}
+
+//===----------------------------------------------------------------------===//
+// isARCDiagnostic.
+//===----------------------------------------------------------------------===//
+
+bool arcmt::isARCDiagnostic(unsigned diagID, Diagnostic &Diag) {
+ return Diag.getDiagnosticIDs()->getCategoryNumberForDiag(diagID) ==
+ diag::DiagCat_Automatic_Reference_Counting_Issue;
+}
diff --git a/contrib/llvm/tools/clang/lib/ARCMigrate/ARCMTActions.cpp b/contrib/llvm/tools/clang/lib/ARCMigrate/ARCMTActions.cpp
new file mode 100644
index 0000000..345c745
--- /dev/null
+++ b/contrib/llvm/tools/clang/lib/ARCMigrate/ARCMTActions.cpp
@@ -0,0 +1,53 @@
+//===--- ARCMTActions.cpp - ARC Migrate Tool Frontend Actions ---*- C++ -*-===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+#include "clang/ARCMigrate/ARCMTActions.h"
+#include "clang/ARCMigrate/ARCMT.h"
+#include "clang/Frontend/CompilerInstance.h"
+
+using namespace clang;
+using namespace arcmt;
+
+bool CheckAction::BeginInvocation(CompilerInstance &CI) {
+ if (arcmt::checkForManualIssues(CI.getInvocation(), getCurrentFile(),
+ getCurrentFileKind(),
+ CI.getDiagnostics().getClient()))
+ return false; // errors, stop the action.
+
+ // We only want to see warnings reported from arcmt::checkForManualIssues.
+ CI.getDiagnostics().setIgnoreAllWarnings(true);
+ return true;
+}
+
+CheckAction::CheckAction(FrontendAction *WrappedAction)
+ : WrapperFrontendAction(WrappedAction) {}
+
+bool ModifyAction::BeginInvocation(CompilerInstance &CI) {
+ return !arcmt::applyTransformations(CI.getInvocation(),
+ getCurrentFile(), getCurrentFileKind(),
+ CI.getDiagnostics().getClient());
+}
+
+ModifyAction::ModifyAction(FrontendAction *WrappedAction)
+ : WrapperFrontendAction(WrappedAction) {}
+
+bool MigrateAction::BeginInvocation(CompilerInstance &CI) {
+ return !arcmt::migrateWithTemporaryFiles(CI.getInvocation(),
+ getCurrentFile(),
+ getCurrentFileKind(),
+ CI.getDiagnostics().getClient(),
+ MigrateDir);
+}
+
+MigrateAction::MigrateAction(FrontendAction *WrappedAction,
+ llvm::StringRef migrateDir)
+ : WrapperFrontendAction(WrappedAction), MigrateDir(migrateDir) {
+ if (MigrateDir.empty())
+ MigrateDir = "."; // user current directory if none is given.
+}
diff --git a/contrib/llvm/tools/clang/lib/ARCMigrate/CMakeLists.txt b/contrib/llvm/tools/clang/lib/ARCMigrate/CMakeLists.txt
new file mode 100644
index 0000000..5f2711e
--- /dev/null
+++ b/contrib/llvm/tools/clang/lib/ARCMigrate/CMakeLists.txt
@@ -0,0 +1,24 @@
+set(LLVM_USED_LIBS clangBasic clangAST clangParse clangFrontend clangRewrite)
+
+add_clang_library(clangARCMigrate
+ ARCMT.cpp
+ ARCMTActions.cpp
+ FileRemapper.cpp
+ TransARCAssign.cpp
+ TransAutoreleasePool.cpp
+ TransBlockObjCVariable.cpp
+ TransEmptyStatementsAndDealloc.cpp
+ TransformActions.cpp
+ Transforms.cpp
+ TransProperties.cpp
+ TransRetainReleaseDealloc.cpp
+ TransUnbridgedCasts.cpp
+ TransUnusedInitDelegate.cpp
+ TransZeroOutPropsInDealloc.cpp
+ )
+
+add_dependencies(clangARCMigrate
+ ClangAttrClasses
+ ClangAttrList
+ ClangDeclNodes
+ ClangStmtNodes)
diff --git a/contrib/llvm/tools/clang/lib/ARCMigrate/FileRemapper.cpp b/contrib/llvm/tools/clang/lib/ARCMigrate/FileRemapper.cpp
new file mode 100644
index 0000000..db26c29
--- /dev/null
+++ b/contrib/llvm/tools/clang/lib/ARCMigrate/FileRemapper.cpp
@@ -0,0 +1,291 @@
+//===--- FileRemapper.cpp - File Remapping Helper -------------------------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+#include "clang/ARCMigrate/FileRemapper.h"
+#include "clang/Frontend/CompilerInvocation.h"
+#include "clang/Basic/FileManager.h"
+#include "llvm/Support/MemoryBuffer.h"
+#include "llvm/Support/Path.h"
+#include "llvm/Support/FileSystem.h"
+#include "llvm/Support/raw_ostream.h"
+#include <fstream>
+
+using namespace clang;
+using namespace arcmt;
+
+FileRemapper::FileRemapper() {
+ FileMgr.reset(new FileManager(FileSystemOptions()));
+}
+
+FileRemapper::~FileRemapper() {
+ clear();
+}
+
+void FileRemapper::clear(llvm::StringRef outputDir) {
+ for (MappingsTy::iterator
+ I = FromToMappings.begin(), E = FromToMappings.end(); I != E; ++I)
+ resetTarget(I->second);
+ FromToMappings.clear();
+ assert(ToFromMappings.empty());
+ if (!outputDir.empty()) {
+ std::string infoFile = getRemapInfoFile(outputDir);
+ bool existed;
+ llvm::sys::fs::remove(infoFile, existed);
+ }
+}
+
+std::string FileRemapper::getRemapInfoFile(llvm::StringRef outputDir) {
+ assert(!outputDir.empty());
+ llvm::sys::Path dir(outputDir);
+ llvm::sys::Path infoFile = dir;
+ infoFile.appendComponent("remap");
+ return infoFile.str();
+}
+
+bool FileRemapper::initFromDisk(llvm::StringRef outputDir, Diagnostic &Diag,
+ bool ignoreIfFilesChanged) {
+ assert(FromToMappings.empty() &&
+ "initFromDisk should be called before any remap calls");
+ std::string infoFile = getRemapInfoFile(outputDir);
+ bool fileExists = false;
+ llvm::sys::fs::exists(infoFile, fileExists);
+ if (!fileExists)
+ return false;
+
+ std::vector<std::pair<const FileEntry *, const FileEntry *> > pairs;
+
+ std::ifstream fin(infoFile.c_str());
+ if (!fin.good())
+ return report(std::string("Error opening file: ") + infoFile, Diag);
+
+ while (true) {
+ std::string fromFilename, toFilename;
+ uint64_t timeModified;
+
+ fin >> fromFilename >> timeModified >> toFilename;
+ if (fin.eof())
+ break;
+ if (!fin.good())
+ return report(std::string("Error in format of file: ") + infoFile, Diag);
+
+ const FileEntry *origFE = FileMgr->getFile(fromFilename);
+ if (!origFE) {
+ if (ignoreIfFilesChanged)
+ continue;
+ return report(std::string("File does not exist: ") + fromFilename, Diag);
+ }
+ const FileEntry *newFE = FileMgr->getFile(toFilename);
+ if (!newFE) {
+ if (ignoreIfFilesChanged)
+ continue;
+ return report(std::string("File does not exist: ") + toFilename, Diag);
+ }
+
+ if ((uint64_t)origFE->getModificationTime() != timeModified) {
+ if (ignoreIfFilesChanged)
+ continue;
+ return report(std::string("File was modified: ") + fromFilename, Diag);
+ }
+
+ pairs.push_back(std::make_pair(origFE, newFE));
+ }
+
+ for (unsigned i = 0, e = pairs.size(); i != e; ++i)
+ remap(pairs[i].first, pairs[i].second);
+
+ return false;
+}
+
+bool FileRemapper::flushToDisk(llvm::StringRef outputDir, Diagnostic &Diag) {
+ using namespace llvm::sys;
+
+ bool existed;
+ if (fs::create_directory(outputDir, existed) != llvm::errc::success)
+ return report(std::string("Could not create directory: ") + outputDir.str(),
+ Diag);
+
+ std::string errMsg;
+ std::string infoFile = getRemapInfoFile(outputDir);
+ llvm::raw_fd_ostream infoOut(infoFile.c_str(), errMsg,
+ llvm::raw_fd_ostream::F_Binary);
+ if (!errMsg.empty())
+ return report(errMsg, Diag);
+
+ for (MappingsTy::iterator
+ I = FromToMappings.begin(), E = FromToMappings.end(); I != E; ++I) {
+
+ const FileEntry *origFE = I->first;
+ llvm::SmallString<200> origPath = llvm::StringRef(origFE->getName());
+ fs::make_absolute(origPath);
+ infoOut << origPath << '\n';
+ infoOut << (uint64_t)origFE->getModificationTime() << '\n';
+
+ if (const FileEntry *FE = I->second.dyn_cast<const FileEntry *>()) {
+ llvm::SmallString<200> newPath = llvm::StringRef(FE->getName());
+ fs::make_absolute(newPath);
+ infoOut << newPath << '\n';
+ } else {
+
+ llvm::SmallString<64> tempPath;
+ tempPath = path::filename(origFE->getName());
+ tempPath += "-%%%%%%%%";
+ tempPath += path::extension(origFE->getName());
+ int fd;
+ if (fs::unique_file(tempPath.str(), fd, tempPath) != llvm::errc::success)
+ return report(std::string("Could not create file: ") + tempPath.c_str(),
+ Diag);
+
+ llvm::raw_fd_ostream newOut(fd, /*shouldClose=*/true);
+ llvm::MemoryBuffer *mem = I->second.get<llvm::MemoryBuffer *>();
+ newOut.write(mem->getBufferStart(), mem->getBufferSize());
+ newOut.close();
+
+ const FileEntry *newE = FileMgr->getFile(tempPath);
+ remap(origFE, newE);
+ infoOut << newE->getName() << '\n';
+ }
+ }
+
+ infoOut.close();
+ return false;
+}
+
+bool FileRemapper::overwriteOriginal(Diagnostic &Diag,
+ llvm::StringRef outputDir) {
+ using namespace llvm::sys;
+
+ for (MappingsTy::iterator
+ I = FromToMappings.begin(), E = FromToMappings.end(); I != E; ++I) {
+ const FileEntry *origFE = I->first;
+ if (const FileEntry *newFE = I->second.dyn_cast<const FileEntry *>()) {
+ if (fs::copy_file(newFE->getName(), origFE->getName(),
+ fs::copy_option::overwrite_if_exists) != llvm::errc::success) {
+ std::string err = "Could not copy file '";
+ llvm::raw_string_ostream os(err);
+ os << "Could not copy file '" << newFE->getName() << "' to file '"
+ << origFE->getName() << "'";
+ os.flush();
+ return report(err, Diag);
+ }
+ } else {
+
+ bool fileExists = false;
+ fs::exists(origFE->getName(), fileExists);
+ if (!fileExists)
+ return report(std::string("File does not exist: ") + origFE->getName(),
+ Diag);
+
+ std::string errMsg;
+ llvm::raw_fd_ostream Out(origFE->getName(), errMsg,
+ llvm::raw_fd_ostream::F_Binary);
+ if (!errMsg.empty())
+ return report(errMsg, Diag);
+
+ llvm::MemoryBuffer *mem = I->second.get<llvm::MemoryBuffer *>();
+ Out.write(mem->getBufferStart(), mem->getBufferSize());
+ Out.close();
+ }
+ }
+
+ clear(outputDir);
+ return false;
+}
+
+void FileRemapper::applyMappings(CompilerInvocation &CI) const {
+ PreprocessorOptions &PPOpts = CI.getPreprocessorOpts();
+ for (MappingsTy::const_iterator
+ I = FromToMappings.begin(), E = FromToMappings.end(); I != E; ++I) {
+ if (const FileEntry *FE = I->second.dyn_cast<const FileEntry *>()) {
+ PPOpts.addRemappedFile(I->first->getName(), FE->getName());
+ } else {
+ llvm::MemoryBuffer *mem = I->second.get<llvm::MemoryBuffer *>();
+ PPOpts.addRemappedFile(I->first->getName(), mem);
+ }
+ }
+
+ PPOpts.RetainRemappedFileBuffers = true;
+}
+
+void FileRemapper::transferMappingsAndClear(CompilerInvocation &CI) {
+ PreprocessorOptions &PPOpts = CI.getPreprocessorOpts();
+ for (MappingsTy::iterator
+ I = FromToMappings.begin(), E = FromToMappings.end(); I != E; ++I) {
+ if (const FileEntry *FE = I->second.dyn_cast<const FileEntry *>()) {
+ PPOpts.addRemappedFile(I->first->getName(), FE->getName());
+ } else {
+ llvm::MemoryBuffer *mem = I->second.get<llvm::MemoryBuffer *>();
+ PPOpts.addRemappedFile(I->first->getName(), mem);
+ }
+ I->second = Target();
+ }
+
+ PPOpts.RetainRemappedFileBuffers = false;
+ clear();
+}
+
+void FileRemapper::remap(llvm::StringRef filePath, llvm::MemoryBuffer *memBuf) {
+ remap(getOriginalFile(filePath), memBuf);
+}
+
+void FileRemapper::remap(llvm::StringRef filePath, llvm::StringRef newPath) {
+ const FileEntry *file = getOriginalFile(filePath);
+ const FileEntry *newfile = FileMgr->getFile(newPath);
+ remap(file, newfile);
+}
+
+void FileRemapper::remap(const FileEntry *file, llvm::MemoryBuffer *memBuf) {
+ assert(file);
+ Target &targ = FromToMappings[file];
+ resetTarget(targ);
+ targ = memBuf;
+}
+
+void FileRemapper::remap(const FileEntry *file, const FileEntry *newfile) {
+ assert(file && newfile);
+ Target &targ = FromToMappings[file];
+ resetTarget(targ);
+ targ = newfile;
+ ToFromMappings[newfile] = file;
+}
+
+const FileEntry *FileRemapper::getOriginalFile(llvm::StringRef filePath) {
+ const FileEntry *file = FileMgr->getFile(filePath);
+ // If we are updating a file that overriden an original file,
+ // actually update the original file.
+ llvm::DenseMap<const FileEntry *, const FileEntry *>::iterator
+ I = ToFromMappings.find(file);
+ if (I != ToFromMappings.end()) {
+ file = I->second;
+ assert(FromToMappings.find(file) != FromToMappings.end() &&
+ "Original file not in mappings!");
+ }
+ return file;
+}
+
+void FileRemapper::resetTarget(Target &targ) {
+ if (!targ)
+ return;
+
+ if (llvm::MemoryBuffer *oldmem = targ.dyn_cast<llvm::MemoryBuffer *>()) {
+ delete oldmem;
+ } else {
+ const FileEntry *toFE = targ.get<const FileEntry *>();
+ llvm::DenseMap<const FileEntry *, const FileEntry *>::iterator
+ I = ToFromMappings.find(toFE);
+ if (I != ToFromMappings.end())
+ ToFromMappings.erase(I);
+ }
+}
+
+bool FileRemapper::report(const std::string &err, Diagnostic &Diag) {
+ unsigned ID = Diag.getDiagnosticIDs()->getCustomDiagID(DiagnosticIDs::Error,
+ err);
+ Diag.Report(ID);
+ return true;
+}
diff --git a/contrib/llvm/tools/clang/lib/ARCMigrate/Internals.h b/contrib/llvm/tools/clang/lib/ARCMigrate/Internals.h
new file mode 100644
index 0000000..4f9b138
--- /dev/null
+++ b/contrib/llvm/tools/clang/lib/ARCMigrate/Internals.h
@@ -0,0 +1,148 @@
+//===-- Internals.h - Implementation Details---------------------*- C++ -*-===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+#ifndef LLVM_CLANG_LIB_ARCMIGRATE_INTERNALS_H
+#define LLVM_CLANG_LIB_ARCMIGRATE_INTERNALS_H
+
+#include "clang/ARCMigrate/ARCMT.h"
+#include "llvm/ADT/ArrayRef.h"
+
+namespace clang {
+ class Sema;
+ class Stmt;
+
+namespace arcmt {
+
+class CapturedDiagList {
+ typedef std::list<StoredDiagnostic> ListTy;
+ ListTy List;
+
+public:
+ void push_back(const StoredDiagnostic &diag) { List.push_back(diag); }
+
+ bool clearDiagnostic(llvm::ArrayRef<unsigned> IDs, SourceRange range);
+ bool hasDiagnostic(llvm::ArrayRef<unsigned> IDs, SourceRange range) const;
+
+ void reportDiagnostics(Diagnostic &diags) const;
+
+ bool hasErrors() const;
+};
+
+class TransformActions {
+ Diagnostic &Diags;
+ CapturedDiagList &CapturedDiags;
+ void *Impl; // TransformActionsImpl.
+
+public:
+ TransformActions(Diagnostic &diag, CapturedDiagList &capturedDiags,
+ ASTContext &ctx, Preprocessor &PP);
+ ~TransformActions();
+
+ void startTransaction();
+ bool commitTransaction();
+ void abortTransaction();
+
+ void insert(SourceLocation loc, llvm::StringRef text);
+ void insertAfterToken(SourceLocation loc, llvm::StringRef text);
+ void remove(SourceRange range);
+ void removeStmt(Stmt *S);
+ void replace(SourceRange range, llvm::StringRef text);
+ void replace(SourceRange range, SourceRange replacementRange);
+ void replaceStmt(Stmt *S, llvm::StringRef text);
+ void replaceText(SourceLocation loc, llvm::StringRef text,
+ llvm::StringRef replacementText);
+ void increaseIndentation(SourceRange range,
+ SourceLocation parentIndent);
+
+ bool clearDiagnostic(llvm::ArrayRef<unsigned> IDs, SourceRange range);
+ bool clearAllDiagnostics(SourceRange range) {
+ return clearDiagnostic(llvm::ArrayRef<unsigned>(), range);
+ }
+ bool clearDiagnostic(unsigned ID1, unsigned ID2, SourceRange range) {
+ unsigned IDs[] = { ID1, ID2 };
+ return clearDiagnostic(IDs, range);
+ }
+ bool clearDiagnostic(unsigned ID1, unsigned ID2, unsigned ID3,
+ SourceRange range) {
+ unsigned IDs[] = { ID1, ID2, ID3 };
+ return clearDiagnostic(IDs, range);
+ }
+
+ bool hasDiagnostic(unsigned ID, SourceRange range) {
+ return CapturedDiags.hasDiagnostic(ID, range);
+ }
+
+ bool hasDiagnostic(unsigned ID1, unsigned ID2, SourceRange range) {
+ unsigned IDs[] = { ID1, ID2 };
+ return CapturedDiags.hasDiagnostic(IDs, range);
+ }
+
+ void reportError(llvm::StringRef error, SourceLocation loc,
+ SourceRange range = SourceRange());
+ void reportNote(llvm::StringRef note, SourceLocation loc,
+ SourceRange range = SourceRange());
+
+ class RewriteReceiver {
+ public:
+ virtual ~RewriteReceiver();
+
+ virtual void insert(SourceLocation loc, llvm::StringRef text) = 0;
+ virtual void remove(CharSourceRange range) = 0;
+ virtual void increaseIndentation(CharSourceRange range,
+ SourceLocation parentIndent) = 0;
+ };
+
+ void applyRewrites(RewriteReceiver &receiver);
+};
+
+class Transaction {
+ TransformActions &TA;
+ bool Aborted;
+
+public:
+ Transaction(TransformActions &TA) : TA(TA), Aborted(false) {
+ TA.startTransaction();
+ }
+
+ ~Transaction() {
+ if (!isAborted())
+ TA.commitTransaction();
+ }
+
+ void abort() {
+ TA.abortTransaction();
+ Aborted = true;
+ }
+
+ bool isAborted() const { return Aborted; }
+};
+
+class MigrationPass {
+public:
+ ASTContext &Ctx;
+ Sema &SemaRef;
+ TransformActions &TA;
+ std::vector<SourceLocation> &ARCMTMacroLocs;
+
+ MigrationPass(ASTContext &Ctx, Sema &sema, TransformActions &TA,
+ std::vector<SourceLocation> &ARCMTMacroLocs)
+ : Ctx(Ctx), SemaRef(sema), TA(TA), ARCMTMacroLocs(ARCMTMacroLocs) { }
+};
+
+bool isARCDiagnostic(unsigned diagID, Diagnostic &Diag);
+
+static inline llvm::StringRef getARCMTMacroName() {
+ return "__IMPL_ARCMT_REMOVED_EXPR__";
+}
+
+} // end namespace arcmt
+
+} // end namespace clang
+
+#endif
diff --git a/contrib/llvm/tools/clang/lib/Tooling/Makefile b/contrib/llvm/tools/clang/lib/ARCMigrate/Makefile
index 501a00c..5232c5e 100644
--- a/contrib/llvm/tools/clang/lib/Tooling/Makefile
+++ b/contrib/llvm/tools/clang/lib/ARCMigrate/Makefile
@@ -1,15 +1,18 @@
-##===- clang/lib/Tooling/Makefile ---------------------------*- Makefile -*-===##
-#
+##===- clang/lib/ARCMigrate/Makefile --------------------------*- Makefile -*-===##
+#
# The LLVM Compiler Infrastructure
#
# This file is distributed under the University of Illinois Open Source
# License. See LICENSE.TXT for details.
#
##===----------------------------------------------------------------------===##
+#
+# This implements code transformation to ARC mode.
+#
+##===----------------------------------------------------------------------===##
CLANG_LEVEL := ../..
-LIBRARYNAME := clangTooling
+LIBRARYNAME := clangARCMigrate
include $(CLANG_LEVEL)/Makefile
-
diff --git a/contrib/llvm/tools/clang/lib/ARCMigrate/TransARCAssign.cpp b/contrib/llvm/tools/clang/lib/ARCMigrate/TransARCAssign.cpp
new file mode 100644
index 0000000..8c00df5
--- /dev/null
+++ b/contrib/llvm/tools/clang/lib/ARCMigrate/TransARCAssign.cpp
@@ -0,0 +1,75 @@
+//===--- TransARCAssign.cpp - Tranformations to ARC mode ------------------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+//
+// makeAssignARCSafe:
+//
+// Add '__strong' where appropriate.
+//
+// for (id x in collection) {
+// x = 0;
+// }
+// ---->
+// for (__strong id x in collection) {
+// x = 0;
+// }
+//
+//===----------------------------------------------------------------------===//
+
+#include "Transforms.h"
+#include "Internals.h"
+#include "clang/Sema/SemaDiagnostic.h"
+
+using namespace clang;
+using namespace arcmt;
+using namespace trans;
+using llvm::StringRef;
+
+namespace {
+
+class ARCAssignChecker : public RecursiveASTVisitor<ARCAssignChecker> {
+ MigrationPass &Pass;
+ llvm::DenseSet<VarDecl *> ModifiedVars;
+
+public:
+ ARCAssignChecker(MigrationPass &pass) : Pass(pass) { }
+
+ bool VisitBinaryOperator(BinaryOperator *Exp) {
+ Expr *E = Exp->getLHS();
+ SourceLocation OrigLoc = E->getExprLoc();
+ SourceLocation Loc = OrigLoc;
+ DeclRefExpr *declRef = dyn_cast<DeclRefExpr>(E->IgnoreParenCasts());
+ if (declRef && isa<VarDecl>(declRef->getDecl())) {
+ ASTContext &Ctx = Pass.Ctx;
+ Expr::isModifiableLvalueResult IsLV = E->isModifiableLvalue(Ctx, &Loc);
+ if (IsLV != Expr::MLV_ConstQualified)
+ return true;
+ VarDecl *var = cast<VarDecl>(declRef->getDecl());
+ if (var->isARCPseudoStrong()) {
+ Transaction Trans(Pass.TA);
+ if (Pass.TA.clearDiagnostic(diag::err_typecheck_arr_assign_enumeration,
+ Exp->getOperatorLoc())) {
+ if (!ModifiedVars.count(var)) {
+ TypeLoc TLoc = var->getTypeSourceInfo()->getTypeLoc();
+ Pass.TA.insert(TLoc.getBeginLoc(), "__strong ");
+ ModifiedVars.insert(var);
+ }
+ }
+ }
+ }
+
+ return true;
+ }
+};
+
+} // anonymous namespace
+
+void trans::makeAssignARCSafe(MigrationPass &pass) {
+ ARCAssignChecker assignCheck(pass);
+ assignCheck.TraverseDecl(pass.Ctx.getTranslationUnitDecl());
+}
diff --git a/contrib/llvm/tools/clang/lib/ARCMigrate/TransAutoreleasePool.cpp b/contrib/llvm/tools/clang/lib/ARCMigrate/TransAutoreleasePool.cpp
new file mode 100644
index 0000000..5b84854
--- /dev/null
+++ b/contrib/llvm/tools/clang/lib/ARCMigrate/TransAutoreleasePool.cpp
@@ -0,0 +1,436 @@
+//===--- TransAutoreleasePool.cpp - Tranformations to ARC mode ------------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+//
+// rewriteAutoreleasePool:
+//
+// Calls to NSAutoreleasePools will be rewritten as an @autorelease scope.
+//
+// NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
+// ...
+// [pool release];
+// ---->
+// @autorelease {
+// ...
+// }
+//
+// An NSAutoreleasePool will not be touched if:
+// - There is not a corresponding -release/-drain in the same scope
+// - Not all references of the NSAutoreleasePool variable can be removed
+// - There is a variable that is declared inside the intended @autorelease scope
+// which is also used outside it.
+//
+//===----------------------------------------------------------------------===//
+
+#include "Transforms.h"
+#include "Internals.h"
+#include "clang/Sema/SemaDiagnostic.h"
+#include "clang/Basic/SourceManager.h"
+#include <map>
+
+using namespace clang;
+using namespace arcmt;
+using namespace trans;
+using llvm::StringRef;
+
+namespace {
+
+class ReleaseCollector : public RecursiveASTVisitor<ReleaseCollector> {
+ Decl *Dcl;
+ llvm::SmallVectorImpl<ObjCMessageExpr *> &Releases;
+
+public:
+ ReleaseCollector(Decl *D, llvm::SmallVectorImpl<ObjCMessageExpr *> &releases)
+ : Dcl(D), Releases(releases) { }
+
+ bool VisitObjCMessageExpr(ObjCMessageExpr *E) {
+ if (!E->isInstanceMessage())
+ return true;
+ if (E->getMethodFamily() != OMF_release)
+ return true;
+ Expr *instance = E->getInstanceReceiver()->IgnoreParenCasts();
+ if (DeclRefExpr *DE = dyn_cast<DeclRefExpr>(instance)) {
+ if (DE->getDecl() == Dcl)
+ Releases.push_back(E);
+ }
+ return true;
+ }
+};
+
+}
+
+namespace {
+
+class AutoreleasePoolRewriter
+ : public RecursiveASTVisitor<AutoreleasePoolRewriter> {
+public:
+ AutoreleasePoolRewriter(MigrationPass &pass)
+ : Body(0), Pass(pass) {
+ PoolII = &pass.Ctx.Idents.get("NSAutoreleasePool");
+ DrainSel = pass.Ctx.Selectors.getNullarySelector(
+ &pass.Ctx.Idents.get("drain"));
+ }
+
+ void transformBody(Stmt *body) {
+ Body = body;
+ TraverseStmt(body);
+ }
+
+ ~AutoreleasePoolRewriter() {
+ llvm::SmallVector<VarDecl *, 8> VarsToHandle;
+
+ for (std::map<VarDecl *, PoolVarInfo>::iterator
+ I = PoolVars.begin(), E = PoolVars.end(); I != E; ++I) {
+ VarDecl *var = I->first;
+ PoolVarInfo &info = I->second;
+
+ // Check that we can handle/rewrite all references of the pool.
+
+ clearRefsIn(info.Dcl, info.Refs);
+ for (llvm::SmallVectorImpl<PoolScope>::iterator
+ scpI = info.Scopes.begin(),
+ scpE = info.Scopes.end(); scpI != scpE; ++scpI) {
+ PoolScope &scope = *scpI;
+ clearRefsIn(*scope.Begin, info.Refs);
+ clearRefsIn(*scope.End, info.Refs);
+ clearRefsIn(scope.Releases.begin(), scope.Releases.end(), info.Refs);
+ }
+
+ // Even if one reference is not handled we will not do anything about that
+ // pool variable.
+ if (info.Refs.empty())
+ VarsToHandle.push_back(var);
+ }
+
+ for (unsigned i = 0, e = VarsToHandle.size(); i != e; ++i) {
+ PoolVarInfo &info = PoolVars[VarsToHandle[i]];
+
+ Transaction Trans(Pass.TA);
+
+ clearUnavailableDiags(info.Dcl);
+ Pass.TA.removeStmt(info.Dcl);
+
+ // Add "@autoreleasepool { }"
+ for (llvm::SmallVectorImpl<PoolScope>::iterator
+ scpI = info.Scopes.begin(),
+ scpE = info.Scopes.end(); scpI != scpE; ++scpI) {
+ PoolScope &scope = *scpI;
+ clearUnavailableDiags(*scope.Begin);
+ clearUnavailableDiags(*scope.End);
+ if (scope.IsFollowedBySimpleReturnStmt) {
+ // Include the return in the scope.
+ Pass.TA.replaceStmt(*scope.Begin, "@autoreleasepool {");
+ Pass.TA.removeStmt(*scope.End);
+ Stmt::child_iterator retI = scope.End;
+ ++retI;
+ SourceLocation afterSemi = findLocationAfterSemi((*retI)->getLocEnd(),
+ Pass.Ctx);
+ assert(afterSemi.isValid() &&
+ "Didn't we check before setting IsFollowedBySimpleReturnStmt "
+ "to true?");
+ Pass.TA.insertAfterToken(afterSemi, "\n}");
+ Pass.TA.increaseIndentation(
+ SourceRange(scope.getIndentedRange().getBegin(),
+ (*retI)->getLocEnd()),
+ scope.CompoundParent->getLocStart());
+ } else {
+ Pass.TA.replaceStmt(*scope.Begin, "@autoreleasepool {");
+ Pass.TA.replaceStmt(*scope.End, "}");
+ Pass.TA.increaseIndentation(scope.getIndentedRange(),
+ scope.CompoundParent->getLocStart());
+ }
+ }
+
+ // Remove rest of pool var references.
+ for (llvm::SmallVectorImpl<PoolScope>::iterator
+ scpI = info.Scopes.begin(),
+ scpE = info.Scopes.end(); scpI != scpE; ++scpI) {
+ PoolScope &scope = *scpI;
+ for (llvm::SmallVectorImpl<ObjCMessageExpr *>::iterator
+ relI = scope.Releases.begin(),
+ relE = scope.Releases.end(); relI != relE; ++relI) {
+ clearUnavailableDiags(*relI);
+ Pass.TA.removeStmt(*relI);
+ }
+ }
+ }
+ }
+
+ bool VisitCompoundStmt(CompoundStmt *S) {
+ llvm::SmallVector<PoolScope, 4> Scopes;
+
+ for (Stmt::child_iterator
+ I = S->body_begin(), E = S->body_end(); I != E; ++I) {
+ Stmt *child = getEssential(*I);
+ if (DeclStmt *DclS = dyn_cast<DeclStmt>(child)) {
+ if (DclS->isSingleDecl()) {
+ if (VarDecl *VD = dyn_cast<VarDecl>(DclS->getSingleDecl())) {
+ if (isNSAutoreleasePool(VD->getType())) {
+ PoolVarInfo &info = PoolVars[VD];
+ info.Dcl = DclS;
+ collectRefs(VD, S, info.Refs);
+ // Does this statement follow the pattern:
+ // NSAutoreleasePool * pool = [NSAutoreleasePool new];
+ if (isPoolCreation(VD->getInit())) {
+ Scopes.push_back(PoolScope());
+ Scopes.back().PoolVar = VD;
+ Scopes.back().CompoundParent = S;
+ Scopes.back().Begin = I;
+ }
+ }
+ }
+ }
+ } else if (BinaryOperator *bop = dyn_cast<BinaryOperator>(child)) {
+ if (DeclRefExpr *dref = dyn_cast<DeclRefExpr>(bop->getLHS())) {
+ if (VarDecl *VD = dyn_cast<VarDecl>(dref->getDecl())) {
+ // Does this statement follow the pattern:
+ // pool = [NSAutoreleasePool new];
+ if (isNSAutoreleasePool(VD->getType()) &&
+ isPoolCreation(bop->getRHS())) {
+ Scopes.push_back(PoolScope());
+ Scopes.back().PoolVar = VD;
+ Scopes.back().CompoundParent = S;
+ Scopes.back().Begin = I;
+ }
+ }
+ }
+ }
+
+ if (Scopes.empty())
+ continue;
+
+ if (isPoolDrain(Scopes.back().PoolVar, child)) {
+ PoolScope &scope = Scopes.back();
+ scope.End = I;
+ handlePoolScope(scope, S);
+ Scopes.pop_back();
+ }
+ }
+ return true;
+ }
+
+private:
+ void clearUnavailableDiags(Stmt *S) {
+ if (S)
+ Pass.TA.clearDiagnostic(diag::err_unavailable,
+ diag::err_unavailable_message,
+ S->getSourceRange());
+ }
+
+ struct PoolScope {
+ VarDecl *PoolVar;
+ CompoundStmt *CompoundParent;
+ Stmt::child_iterator Begin;
+ Stmt::child_iterator End;
+ bool IsFollowedBySimpleReturnStmt;
+ llvm::SmallVector<ObjCMessageExpr *, 4> Releases;
+
+ PoolScope() : PoolVar(0), CompoundParent(0), Begin(), End(),
+ IsFollowedBySimpleReturnStmt(false) { }
+
+ SourceRange getIndentedRange() const {
+ Stmt::child_iterator rangeS = Begin;
+ ++rangeS;
+ if (rangeS == End)
+ return SourceRange();
+ Stmt::child_iterator rangeE = Begin;
+ for (Stmt::child_iterator I = rangeS; I != End; ++I)
+ ++rangeE;
+ return SourceRange((*rangeS)->getLocStart(), (*rangeE)->getLocEnd());
+ }
+ };
+
+ class NameReferenceChecker : public RecursiveASTVisitor<NameReferenceChecker>{
+ ASTContext &Ctx;
+ SourceRange ScopeRange;
+ SourceLocation &referenceLoc, &declarationLoc;
+
+ public:
+ NameReferenceChecker(ASTContext &ctx, PoolScope &scope,
+ SourceLocation &referenceLoc,
+ SourceLocation &declarationLoc)
+ : Ctx(ctx), referenceLoc(referenceLoc),
+ declarationLoc(declarationLoc) {
+ ScopeRange = SourceRange((*scope.Begin)->getLocStart(),
+ (*scope.End)->getLocStart());
+ }
+
+ bool VisitDeclRefExpr(DeclRefExpr *E) {
+ return checkRef(E->getLocation(), E->getDecl()->getLocation());
+ }
+
+ bool VisitBlockDeclRefExpr(BlockDeclRefExpr *E) {
+ return checkRef(E->getLocation(), E->getDecl()->getLocation());
+ }
+
+ bool VisitTypedefTypeLoc(TypedefTypeLoc TL) {
+ return checkRef(TL.getBeginLoc(), TL.getTypedefNameDecl()->getLocation());
+ }
+
+ bool VisitTagTypeLoc(TagTypeLoc TL) {
+ return checkRef(TL.getBeginLoc(), TL.getDecl()->getLocation());
+ }
+
+ private:
+ bool checkRef(SourceLocation refLoc, SourceLocation declLoc) {
+ if (isInScope(declLoc)) {
+ referenceLoc = refLoc;
+ declarationLoc = declLoc;
+ return false;
+ }
+ return true;
+ }
+
+ bool isInScope(SourceLocation loc) {
+ SourceManager &SM = Ctx.getSourceManager();
+ if (SM.isBeforeInTranslationUnit(loc, ScopeRange.getBegin()))
+ return false;
+ return SM.isBeforeInTranslationUnit(loc, ScopeRange.getEnd());
+ }
+ };
+
+ void handlePoolScope(PoolScope &scope, CompoundStmt *compoundS) {
+ // Check that all names declared inside the scope are not used
+ // outside the scope.
+ {
+ bool nameUsedOutsideScope = false;
+ SourceLocation referenceLoc, declarationLoc;
+ Stmt::child_iterator SI = scope.End, SE = compoundS->body_end();
+ ++SI;
+ // Check if the autoreleasepool scope is followed by a simple return
+ // statement, in which case we will include the return in the scope.
+ if (SI != SE)
+ if (ReturnStmt *retS = dyn_cast<ReturnStmt>(*SI))
+ if ((retS->getRetValue() == 0 ||
+ isa<DeclRefExpr>(retS->getRetValue()->IgnoreParenCasts())) &&
+ findLocationAfterSemi(retS->getLocEnd(), Pass.Ctx).isValid()) {
+ scope.IsFollowedBySimpleReturnStmt = true;
+ ++SI; // the return will be included in scope, don't check it.
+ }
+
+ for (; SI != SE; ++SI) {
+ nameUsedOutsideScope = !NameReferenceChecker(Pass.Ctx, scope,
+ referenceLoc,
+ declarationLoc).TraverseStmt(*SI);
+ if (nameUsedOutsideScope)
+ break;
+ }
+
+ // If not all references were cleared it means some variables/typenames/etc
+ // declared inside the pool scope are used outside of it.
+ // We won't try to rewrite the pool.
+ if (nameUsedOutsideScope) {
+ Pass.TA.reportError("a name is referenced outside the "
+ "NSAutoreleasePool scope that it was declared in", referenceLoc);
+ Pass.TA.reportNote("name declared here", declarationLoc);
+ Pass.TA.reportNote("intended @autoreleasepool scope begins here",
+ (*scope.Begin)->getLocStart());
+ Pass.TA.reportNote("intended @autoreleasepool scope ends here",
+ (*scope.End)->getLocStart());
+ return;
+ }
+ }
+
+ // Collect all releases of the pool; they will be removed.
+ {
+ ReleaseCollector releaseColl(scope.PoolVar, scope.Releases);
+ Stmt::child_iterator I = scope.Begin;
+ ++I;
+ for (; I != scope.End; ++I)
+ releaseColl.TraverseStmt(*I);
+ }
+
+ PoolVars[scope.PoolVar].Scopes.push_back(scope);
+ }
+
+ bool isPoolCreation(Expr *E) {
+ if (!E) return false;
+ E = getEssential(E);
+ ObjCMessageExpr *ME = dyn_cast<ObjCMessageExpr>(E);
+ if (!ME) return false;
+ if (ME->getMethodFamily() == OMF_new &&
+ ME->getReceiverKind() == ObjCMessageExpr::Class &&
+ isNSAutoreleasePool(ME->getReceiverInterface()))
+ return true;
+ if (ME->getReceiverKind() == ObjCMessageExpr::Instance &&
+ ME->getMethodFamily() == OMF_init) {
+ Expr *rec = getEssential(ME->getInstanceReceiver());
+ if (ObjCMessageExpr *recME = dyn_cast_or_null<ObjCMessageExpr>(rec)) {
+ if (recME->getMethodFamily() == OMF_alloc &&
+ recME->getReceiverKind() == ObjCMessageExpr::Class &&
+ isNSAutoreleasePool(recME->getReceiverInterface()))
+ return true;
+ }
+ }
+
+ return false;
+ }
+
+ bool isPoolDrain(VarDecl *poolVar, Stmt *S) {
+ if (!S) return false;
+ S = getEssential(S);
+ ObjCMessageExpr *ME = dyn_cast<ObjCMessageExpr>(S);
+ if (!ME) return false;
+ if (ME->getReceiverKind() == ObjCMessageExpr::Instance) {
+ Expr *rec = getEssential(ME->getInstanceReceiver());
+ if (DeclRefExpr *dref = dyn_cast<DeclRefExpr>(rec))
+ if (dref->getDecl() == poolVar)
+ return ME->getMethodFamily() == OMF_release ||
+ ME->getSelector() == DrainSel;
+ }
+
+ return false;
+ }
+
+ bool isNSAutoreleasePool(ObjCInterfaceDecl *IDecl) {
+ return IDecl && IDecl->getIdentifier() == PoolII;
+ }
+
+ bool isNSAutoreleasePool(QualType Ty) {
+ QualType pointee = Ty->getPointeeType();
+ if (pointee.isNull())
+ return false;
+ if (const ObjCInterfaceType *interT = pointee->getAs<ObjCInterfaceType>())
+ return isNSAutoreleasePool(interT->getDecl());
+ return false;
+ }
+
+ static Expr *getEssential(Expr *E) {
+ return cast<Expr>(getEssential((Stmt*)E));
+ }
+ static Stmt *getEssential(Stmt *S) {
+ if (ExprWithCleanups *EWC = dyn_cast<ExprWithCleanups>(S))
+ S = EWC->getSubExpr();
+ if (Expr *E = dyn_cast<Expr>(S))
+ S = E->IgnoreParenCasts();
+ return S;
+ }
+
+ Stmt *Body;
+ MigrationPass &Pass;
+
+ IdentifierInfo *PoolII;
+ Selector DrainSel;
+
+ struct PoolVarInfo {
+ DeclStmt *Dcl;
+ ExprSet Refs;
+ llvm::SmallVector<PoolScope, 2> Scopes;
+
+ PoolVarInfo() : Dcl(0) { }
+ };
+
+ std::map<VarDecl *, PoolVarInfo> PoolVars;
+};
+
+} // anonymous namespace
+
+void trans::rewriteAutoreleasePool(MigrationPass &pass) {
+ BodyTransform<AutoreleasePoolRewriter> trans(pass);
+ trans.TraverseDecl(pass.Ctx.getTranslationUnitDecl());
+}
diff --git a/contrib/llvm/tools/clang/lib/ARCMigrate/TransBlockObjCVariable.cpp b/contrib/llvm/tools/clang/lib/ARCMigrate/TransBlockObjCVariable.cpp
new file mode 100644
index 0000000..0e342b7
--- /dev/null
+++ b/contrib/llvm/tools/clang/lib/ARCMigrate/TransBlockObjCVariable.cpp
@@ -0,0 +1,143 @@
+//===--- TransBlockObjCVariable.cpp - Tranformations to ARC mode ----------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+//
+// rewriteBlockObjCVariable:
+//
+// Adding __block to an obj-c variable could be either because the the variable
+// is used for output storage or the user wanted to break a retain cycle.
+// This transformation checks whether a reference of the variable for the block
+// is actually needed (it is assigned to or its address is taken) or not.
+// If the reference is not needed it will assume __block was added to break a
+// cycle so it will remove '__block' and add __weak/__unsafe_unretained.
+// e.g
+//
+// __block Foo *x;
+// bar(^ { [x cake]; });
+// ---->
+// __weak Foo *x;
+// bar(^ { [x cake]; });
+//
+//===----------------------------------------------------------------------===//
+
+#include "Transforms.h"
+#include "Internals.h"
+#include "clang/Basic/SourceManager.h"
+
+using namespace clang;
+using namespace arcmt;
+using namespace trans;
+using llvm::StringRef;
+
+namespace {
+
+class RootBlockObjCVarRewriter :
+ public RecursiveASTVisitor<RootBlockObjCVarRewriter> {
+ MigrationPass &Pass;
+ llvm::DenseSet<VarDecl *> CheckedVars;
+
+ class BlockVarChecker : public RecursiveASTVisitor<BlockVarChecker> {
+ VarDecl *Var;
+
+ typedef RecursiveASTVisitor<BlockVarChecker> base;
+ public:
+ BlockVarChecker(VarDecl *var) : Var(var) { }
+
+ bool TraverseImplicitCastExpr(ImplicitCastExpr *castE) {
+ if (BlockDeclRefExpr *
+ ref = dyn_cast<BlockDeclRefExpr>(castE->getSubExpr())) {
+ if (ref->getDecl() == Var) {
+ if (castE->getCastKind() == CK_LValueToRValue)
+ return true; // Using the value of the variable.
+ if (castE->getCastKind() == CK_NoOp && castE->isLValue() &&
+ Var->getASTContext().getLangOptions().CPlusPlus)
+ return true; // Binding to const C++ reference.
+ }
+ }
+
+ return base::TraverseImplicitCastExpr(castE);
+ }
+
+ bool VisitBlockDeclRefExpr(BlockDeclRefExpr *E) {
+ if (E->getDecl() == Var)
+ return false; // The reference of the variable, and not just its value,
+ // is needed.
+ return true;
+ }
+ };
+
+public:
+ RootBlockObjCVarRewriter(MigrationPass &pass) : Pass(pass) { }
+
+ bool VisitBlockDecl(BlockDecl *block) {
+ llvm::SmallVector<VarDecl *, 4> BlockVars;
+
+ for (BlockDecl::capture_iterator
+ I = block->capture_begin(), E = block->capture_end(); I != E; ++I) {
+ VarDecl *var = I->getVariable();
+ if (I->isByRef() &&
+ !isAlreadyChecked(var) &&
+ var->getType()->isObjCObjectPointerType() &&
+ isImplicitStrong(var->getType())) {
+ BlockVars.push_back(var);
+ }
+ }
+
+ for (unsigned i = 0, e = BlockVars.size(); i != e; ++i) {
+ VarDecl *var = BlockVars[i];
+ CheckedVars.insert(var);
+
+ BlockVarChecker checker(var);
+ bool onlyValueOfVarIsNeeded = checker.TraverseStmt(block->getBody());
+ if (onlyValueOfVarIsNeeded) {
+ BlocksAttr *attr = var->getAttr<BlocksAttr>();
+ if(!attr)
+ continue;
+ bool useWeak = canApplyWeak(Pass.Ctx, var->getType());
+ SourceManager &SM = Pass.Ctx.getSourceManager();
+ Transaction Trans(Pass.TA);
+ Pass.TA.replaceText(SM.getInstantiationLoc(attr->getLocation()),
+ "__block",
+ useWeak ? "__weak" : "__unsafe_unretained");
+ }
+
+ }
+
+ return true;
+ }
+
+private:
+ bool isAlreadyChecked(VarDecl *VD) {
+ return CheckedVars.count(VD);
+ }
+
+ bool isImplicitStrong(QualType ty) {
+ if (isa<AttributedType>(ty.getTypePtr()))
+ return false;
+ return ty.getLocalQualifiers().getObjCLifetime() == Qualifiers::OCL_Strong;
+ }
+};
+
+class BlockObjCVarRewriter : public RecursiveASTVisitor<BlockObjCVarRewriter> {
+ MigrationPass &Pass;
+
+public:
+ BlockObjCVarRewriter(MigrationPass &pass) : Pass(pass) { }
+
+ bool TraverseBlockDecl(BlockDecl *block) {
+ RootBlockObjCVarRewriter(Pass).TraverseDecl(block);
+ return true;
+ }
+};
+
+} // anonymous namespace
+
+void trans::rewriteBlockObjCVariable(MigrationPass &pass) {
+ BlockObjCVarRewriter trans(pass);
+ trans.TraverseDecl(pass.Ctx.getTranslationUnitDecl());
+}
diff --git a/contrib/llvm/tools/clang/lib/ARCMigrate/TransEmptyStatementsAndDealloc.cpp b/contrib/llvm/tools/clang/lib/ARCMigrate/TransEmptyStatementsAndDealloc.cpp
new file mode 100644
index 0000000..d0bc332
--- /dev/null
+++ b/contrib/llvm/tools/clang/lib/ARCMigrate/TransEmptyStatementsAndDealloc.cpp
@@ -0,0 +1,211 @@
+//===--- TransEmptyStatements.cpp - Tranformations to ARC mode ------------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+//
+// removeEmptyStatementsAndDealloc:
+//
+// Removes empty statements that are leftovers from previous transformations.
+// e.g for
+//
+// [x retain];
+//
+// removeRetainReleaseDealloc will leave an empty ";" that removeEmptyStatements
+// will remove.
+//
+//===----------------------------------------------------------------------===//
+
+#include "Transforms.h"
+#include "Internals.h"
+#include "clang/AST/StmtVisitor.h"
+
+using namespace clang;
+using namespace arcmt;
+using namespace trans;
+using llvm::StringRef;
+
+namespace {
+
+/// \brief Returns true if the statement became empty due to previous
+/// transformations.
+class EmptyChecker : public StmtVisitor<EmptyChecker, bool> {
+ ASTContext &Ctx;
+ llvm::DenseSet<unsigned> &MacroLocs;
+
+public:
+ EmptyChecker(ASTContext &ctx, llvm::DenseSet<unsigned> &macroLocs)
+ : Ctx(ctx), MacroLocs(macroLocs) { }
+
+ bool VisitNullStmt(NullStmt *S) {
+ return isMacroLoc(S->getLeadingEmptyMacroLoc());
+ }
+ bool VisitCompoundStmt(CompoundStmt *S) {
+ if (S->body_empty())
+ return false; // was already empty, not because of transformations.
+ for (CompoundStmt::body_iterator
+ I = S->body_begin(), E = S->body_end(); I != E; ++I)
+ if (!Visit(*I))
+ return false;
+ return true;
+ }
+ bool VisitIfStmt(IfStmt *S) {
+ if (S->getConditionVariable())
+ return false;
+ Expr *condE = S->getCond();
+ if (!condE)
+ return false;
+ if (hasSideEffects(condE, Ctx))
+ return false;
+ if (!S->getThen() || !Visit(S->getThen()))
+ return false;
+ if (S->getElse() && !Visit(S->getElse()))
+ return false;
+ return true;
+ }
+ bool VisitWhileStmt(WhileStmt *S) {
+ if (S->getConditionVariable())
+ return false;
+ Expr *condE = S->getCond();
+ if (!condE)
+ return false;
+ if (hasSideEffects(condE, Ctx))
+ return false;
+ if (!S->getBody())
+ return false;
+ return Visit(S->getBody());
+ }
+ bool VisitDoStmt(DoStmt *S) {
+ Expr *condE = S->getCond();
+ if (!condE)
+ return false;
+ if (hasSideEffects(condE, Ctx))
+ return false;
+ if (!S->getBody())
+ return false;
+ return Visit(S->getBody());
+ }
+ bool VisitObjCForCollectionStmt(ObjCForCollectionStmt *S) {
+ Expr *Exp = S->getCollection();
+ if (!Exp)
+ return false;
+ if (hasSideEffects(Exp, Ctx))
+ return false;
+ if (!S->getBody())
+ return false;
+ return Visit(S->getBody());
+ }
+ bool VisitObjCAutoreleasePoolStmt(ObjCAutoreleasePoolStmt *S) {
+ if (!S->getSubStmt())
+ return false;
+ return Visit(S->getSubStmt());
+ }
+
+private:
+ bool isMacroLoc(SourceLocation loc) {
+ if (loc.isInvalid()) return false;
+ return MacroLocs.count(loc.getRawEncoding());
+ }
+};
+
+class EmptyStatementsRemover :
+ public RecursiveASTVisitor<EmptyStatementsRemover> {
+ MigrationPass &Pass;
+ llvm::DenseSet<unsigned> &MacroLocs;
+
+public:
+ EmptyStatementsRemover(MigrationPass &pass,
+ llvm::DenseSet<unsigned> &macroLocs)
+ : Pass(pass), MacroLocs(macroLocs) { }
+
+ bool TraverseStmtExpr(StmtExpr *E) {
+ CompoundStmt *S = E->getSubStmt();
+ for (CompoundStmt::body_iterator
+ I = S->body_begin(), E = S->body_end(); I != E; ++I) {
+ if (I != E - 1)
+ check(*I);
+ TraverseStmt(*I);
+ }
+ return true;
+ }
+
+ bool VisitCompoundStmt(CompoundStmt *S) {
+ for (CompoundStmt::body_iterator
+ I = S->body_begin(), E = S->body_end(); I != E; ++I)
+ check(*I);
+ return true;
+ }
+
+ bool isMacroLoc(SourceLocation loc) {
+ if (loc.isInvalid()) return false;
+ return MacroLocs.count(loc.getRawEncoding());
+ }
+
+ ASTContext &getContext() { return Pass.Ctx; }
+
+private:
+ void check(Stmt *S) {
+ if (!S) return;
+ if (EmptyChecker(Pass.Ctx, MacroLocs).Visit(S)) {
+ Transaction Trans(Pass.TA);
+ Pass.TA.removeStmt(S);
+ }
+ }
+};
+
+} // anonymous namespace
+
+static bool isBodyEmpty(CompoundStmt *body,
+ ASTContext &Ctx, llvm::DenseSet<unsigned> &MacroLocs) {
+ for (CompoundStmt::body_iterator
+ I = body->body_begin(), E = body->body_end(); I != E; ++I)
+ if (!EmptyChecker(Ctx, MacroLocs).Visit(*I))
+ return false;
+
+ return true;
+}
+
+static void removeDeallocMethod(MigrationPass &pass,
+ llvm::DenseSet<unsigned> &MacroLocs) {
+ ASTContext &Ctx = pass.Ctx;
+ TransformActions &TA = pass.TA;
+ DeclContext *DC = Ctx.getTranslationUnitDecl();
+
+ typedef DeclContext::specific_decl_iterator<ObjCImplementationDecl>
+ impl_iterator;
+ for (impl_iterator I = impl_iterator(DC->decls_begin()),
+ E = impl_iterator(DC->decls_end()); I != E; ++I) {
+ for (ObjCImplementationDecl::instmeth_iterator
+ MI = (*I)->instmeth_begin(),
+ ME = (*I)->instmeth_end(); MI != ME; ++MI) {
+ ObjCMethodDecl *MD = *MI;
+ if (MD->getMethodFamily() == OMF_dealloc) {
+ if (MD->hasBody() &&
+ isBodyEmpty(MD->getCompoundBody(), Ctx, MacroLocs)) {
+ Transaction Trans(TA);
+ TA.remove(MD->getSourceRange());
+ }
+ break;
+ }
+ }
+ }
+}
+
+void trans::removeEmptyStatementsAndDealloc(MigrationPass &pass) {
+ llvm::DenseSet<unsigned> MacroLocs;
+ for (unsigned i = 0, e = pass.ARCMTMacroLocs.size(); i != e; ++i)
+ MacroLocs.insert(pass.ARCMTMacroLocs[i].getRawEncoding());
+
+ EmptyStatementsRemover(pass, MacroLocs)
+ .TraverseDecl(pass.Ctx.getTranslationUnitDecl());
+
+ removeDeallocMethod(pass, MacroLocs);
+
+ for (unsigned i = 0, e = pass.ARCMTMacroLocs.size(); i != e; ++i) {
+ Transaction Trans(pass.TA);
+ pass.TA.remove(pass.ARCMTMacroLocs[i]);
+ }
+}
diff --git a/contrib/llvm/tools/clang/lib/ARCMigrate/TransProperties.cpp b/contrib/llvm/tools/clang/lib/ARCMigrate/TransProperties.cpp
new file mode 100644
index 0000000..872c95e
--- /dev/null
+++ b/contrib/llvm/tools/clang/lib/ARCMigrate/TransProperties.cpp
@@ -0,0 +1,364 @@
+//===--- TransProperties.cpp - Tranformations to ARC mode -----------------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+//
+// rewriteProperties:
+//
+// - Adds strong/weak/unsafe_unretained ownership specifier to properties that
+// are missing one.
+// - Migrates properties from (retain) to (strong) and (assign) to
+// (unsafe_unretained/weak).
+// - If a property is synthesized, adds the ownership specifier in the ivar
+// backing the property.
+//
+// @interface Foo : NSObject {
+// NSObject *x;
+// }
+// @property (assign) id x;
+// @end
+// ---->
+// @interface Foo : NSObject {
+// NSObject *__weak x;
+// }
+// @property (weak) id x;
+// @end
+//
+//===----------------------------------------------------------------------===//
+
+#include "Transforms.h"
+#include "Internals.h"
+#include "clang/Sema/SemaDiagnostic.h"
+#include "clang/Basic/SourceManager.h"
+#include "clang/Lex/Lexer.h"
+#include <map>
+
+using namespace clang;
+using namespace arcmt;
+using namespace trans;
+using llvm::StringRef;
+
+namespace {
+
+class PropertiesRewriter {
+ MigrationPass &Pass;
+
+ struct PropData {
+ ObjCPropertyDecl *PropD;
+ ObjCIvarDecl *IvarD;
+ ObjCPropertyImplDecl *ImplD;
+
+ PropData(ObjCPropertyDecl *propD) : PropD(propD), IvarD(0), ImplD(0) { }
+ };
+
+ typedef llvm::SmallVector<PropData, 2> PropsTy;
+ typedef std::map<unsigned, PropsTy> AtPropDeclsTy;
+ AtPropDeclsTy AtProps;
+
+public:
+ PropertiesRewriter(MigrationPass &pass) : Pass(pass) { }
+
+ void doTransform(ObjCImplementationDecl *D) {
+ ObjCInterfaceDecl *iface = D->getClassInterface();
+ if (!iface)
+ return;
+
+ for (ObjCInterfaceDecl::prop_iterator
+ propI = iface->prop_begin(),
+ propE = iface->prop_end(); propI != propE; ++propI) {
+ if (propI->getAtLoc().isInvalid())
+ continue;
+ PropsTy &props = AtProps[propI->getAtLoc().getRawEncoding()];
+ props.push_back(*propI);
+ }
+
+ typedef DeclContext::specific_decl_iterator<ObjCPropertyImplDecl>
+ prop_impl_iterator;
+ for (prop_impl_iterator
+ I = prop_impl_iterator(D->decls_begin()),
+ E = prop_impl_iterator(D->decls_end()); I != E; ++I) {
+ ObjCPropertyImplDecl *implD = *I;
+ if (implD->getPropertyImplementation() != ObjCPropertyImplDecl::Synthesize)
+ continue;
+ ObjCPropertyDecl *propD = implD->getPropertyDecl();
+ if (!propD || propD->isInvalidDecl())
+ continue;
+ ObjCIvarDecl *ivarD = implD->getPropertyIvarDecl();
+ if (!ivarD || ivarD->isInvalidDecl())
+ continue;
+ unsigned rawAtLoc = propD->getAtLoc().getRawEncoding();
+ AtPropDeclsTy::iterator findAtLoc = AtProps.find(rawAtLoc);
+ if (findAtLoc == AtProps.end())
+ continue;
+
+ PropsTy &props = findAtLoc->second;
+ for (PropsTy::iterator I = props.begin(), E = props.end(); I != E; ++I) {
+ if (I->PropD == propD) {
+ I->IvarD = ivarD;
+ I->ImplD = implD;
+ break;
+ }
+ }
+ }
+
+ for (AtPropDeclsTy::iterator
+ I = AtProps.begin(), E = AtProps.end(); I != E; ++I) {
+ SourceLocation atLoc = SourceLocation::getFromRawEncoding(I->first);
+ PropsTy &props = I->second;
+ QualType ty = getPropertyType(props);
+ if (!ty->isObjCRetainableType())
+ continue;
+ if (hasIvarWithExplicitOwnership(props))
+ continue;
+
+ Transaction Trans(Pass.TA);
+ rewriteProperty(props, atLoc);
+ }
+ }
+
+private:
+ void rewriteProperty(PropsTy &props, SourceLocation atLoc) const {
+ ObjCPropertyDecl::PropertyAttributeKind propAttrs = getPropertyAttrs(props);
+
+ if (propAttrs & (ObjCPropertyDecl::OBJC_PR_copy |
+ ObjCPropertyDecl::OBJC_PR_unsafe_unretained |
+ ObjCPropertyDecl::OBJC_PR_strong |
+ ObjCPropertyDecl::OBJC_PR_weak))
+ return;
+
+ if (propAttrs & ObjCPropertyDecl::OBJC_PR_retain) {
+ rewriteAttribute("retain", "strong", atLoc);
+ return;
+ }
+
+ if (propAttrs & ObjCPropertyDecl::OBJC_PR_assign)
+ return rewriteAssign(props, atLoc);
+
+ return maybeAddWeakOrUnsafeUnretainedAttr(props, atLoc);
+ }
+
+ void rewriteAssign(PropsTy &props, SourceLocation atLoc) const {
+ bool canUseWeak = canApplyWeak(Pass.Ctx, getPropertyType(props));
+
+ bool rewroteAttr = rewriteAttribute("assign",
+ canUseWeak ? "weak" : "unsafe_unretained",
+ atLoc);
+ if (!rewroteAttr)
+ canUseWeak = false;
+
+ for (PropsTy::iterator I = props.begin(), E = props.end(); I != E; ++I) {
+ if (isUserDeclared(I->IvarD))
+ Pass.TA.insert(I->IvarD->getLocation(),
+ canUseWeak ? "__weak " : "__unsafe_unretained ");
+ if (I->ImplD)
+ Pass.TA.clearDiagnostic(diag::err_arc_assign_property_ownership,
+ I->ImplD->getLocation());
+ }
+ }
+
+ void maybeAddWeakOrUnsafeUnretainedAttr(PropsTy &props,
+ SourceLocation atLoc) const {
+ ObjCPropertyDecl::PropertyAttributeKind propAttrs = getPropertyAttrs(props);
+ if ((propAttrs & ObjCPropertyDecl::OBJC_PR_readonly) &&
+ hasNoBackingIvars(props))
+ return;
+
+ bool canUseWeak = canApplyWeak(Pass.Ctx, getPropertyType(props));
+ bool addedAttr = addAttribute(canUseWeak ? "weak" : "unsafe_unretained",
+ atLoc);
+ if (!addedAttr)
+ canUseWeak = false;
+
+ for (PropsTy::iterator I = props.begin(), E = props.end(); I != E; ++I) {
+ if (isUserDeclared(I->IvarD))
+ Pass.TA.insert(I->IvarD->getLocation(),
+ canUseWeak ? "__weak " : "__unsafe_unretained ");
+ if (I->ImplD) {
+ Pass.TA.clearDiagnostic(diag::err_arc_assign_property_ownership,
+ I->ImplD->getLocation());
+ Pass.TA.clearDiagnostic(
+ diag::err_arc_objc_property_default_assign_on_object,
+ I->ImplD->getLocation());
+ }
+ }
+ }
+
+ bool rewriteAttribute(llvm::StringRef fromAttr, llvm::StringRef toAttr,
+ SourceLocation atLoc) const {
+ if (atLoc.isMacroID())
+ return false;
+
+ SourceManager &SM = Pass.Ctx.getSourceManager();
+
+ // Break down the source location.
+ std::pair<FileID, unsigned> locInfo = SM.getDecomposedLoc(atLoc);
+
+ // Try to load the file buffer.
+ bool invalidTemp = false;
+ llvm::StringRef file = SM.getBufferData(locInfo.first, &invalidTemp);
+ if (invalidTemp)
+ return false;
+
+ const char *tokenBegin = file.data() + locInfo.second;
+
+ // Lex from the start of the given location.
+ Lexer lexer(SM.getLocForStartOfFile(locInfo.first),
+ Pass.Ctx.getLangOptions(),
+ file.begin(), tokenBegin, file.end());
+ Token tok;
+ lexer.LexFromRawLexer(tok);
+ if (tok.isNot(tok::at)) return false;
+ lexer.LexFromRawLexer(tok);
+ if (tok.isNot(tok::raw_identifier)) return false;
+ if (llvm::StringRef(tok.getRawIdentifierData(), tok.getLength())
+ != "property")
+ return false;
+ lexer.LexFromRawLexer(tok);
+ if (tok.isNot(tok::l_paren)) return false;
+
+ lexer.LexFromRawLexer(tok);
+ if (tok.is(tok::r_paren))
+ return false;
+
+ while (1) {
+ if (tok.isNot(tok::raw_identifier)) return false;
+ llvm::StringRef ident(tok.getRawIdentifierData(), tok.getLength());
+ if (ident == fromAttr) {
+ Pass.TA.replaceText(tok.getLocation(), fromAttr, toAttr);
+ return true;
+ }
+
+ do {
+ lexer.LexFromRawLexer(tok);
+ } while (tok.isNot(tok::comma) && tok.isNot(tok::r_paren));
+ if (tok.is(tok::r_paren))
+ break;
+ lexer.LexFromRawLexer(tok);
+ }
+
+ return false;
+ }
+
+ bool addAttribute(llvm::StringRef attr, SourceLocation atLoc) const {
+ if (atLoc.isMacroID())
+ return false;
+
+ SourceManager &SM = Pass.Ctx.getSourceManager();
+
+ // Break down the source location.
+ std::pair<FileID, unsigned> locInfo = SM.getDecomposedLoc(atLoc);
+
+ // Try to load the file buffer.
+ bool invalidTemp = false;
+ llvm::StringRef file = SM.getBufferData(locInfo.first, &invalidTemp);
+ if (invalidTemp)
+ return false;
+
+ const char *tokenBegin = file.data() + locInfo.second;
+
+ // Lex from the start of the given location.
+ Lexer lexer(SM.getLocForStartOfFile(locInfo.first),
+ Pass.Ctx.getLangOptions(),
+ file.begin(), tokenBegin, file.end());
+ Token tok;
+ lexer.LexFromRawLexer(tok);
+ if (tok.isNot(tok::at)) return false;
+ lexer.LexFromRawLexer(tok);
+ if (tok.isNot(tok::raw_identifier)) return false;
+ if (llvm::StringRef(tok.getRawIdentifierData(), tok.getLength())
+ != "property")
+ return false;
+ lexer.LexFromRawLexer(tok);
+
+ if (tok.isNot(tok::l_paren)) {
+ Pass.TA.insert(tok.getLocation(), std::string("(") + attr.str() + ") ");
+ return true;
+ }
+
+ lexer.LexFromRawLexer(tok);
+ if (tok.is(tok::r_paren)) {
+ Pass.TA.insert(tok.getLocation(), attr);
+ return true;
+ }
+
+ if (tok.isNot(tok::raw_identifier)) return false;
+
+ Pass.TA.insert(tok.getLocation(), std::string(attr) + ", ");
+ return true;
+ }
+
+ bool hasIvarWithExplicitOwnership(PropsTy &props) const {
+ for (PropsTy::iterator I = props.begin(), E = props.end(); I != E; ++I) {
+ if (isUserDeclared(I->IvarD)) {
+ if (isa<AttributedType>(I->IvarD->getType()))
+ return true;
+ if (I->IvarD->getType().getLocalQualifiers().getObjCLifetime()
+ != Qualifiers::OCL_Strong)
+ return true;
+ }
+ }
+
+ return false;
+ }
+
+ bool hasNoBackingIvars(PropsTy &props) const {
+ for (PropsTy::iterator I = props.begin(), E = props.end(); I != E; ++I)
+ if (I->IvarD)
+ return false;
+
+ return true;
+ }
+
+ bool isUserDeclared(ObjCIvarDecl *ivarD) const {
+ return ivarD && !ivarD->getSynthesize();
+ }
+
+ QualType getPropertyType(PropsTy &props) const {
+ assert(!props.empty());
+ QualType ty = props[0].PropD->getType();
+
+#ifndef NDEBUG
+ for (PropsTy::iterator I = props.begin(), E = props.end(); I != E; ++I)
+ assert(ty == I->PropD->getType());
+#endif
+
+ return ty;
+ }
+
+ ObjCPropertyDecl::PropertyAttributeKind
+ getPropertyAttrs(PropsTy &props) const {
+ assert(!props.empty());
+ ObjCPropertyDecl::PropertyAttributeKind
+ attrs = props[0].PropD->getPropertyAttributesAsWritten();
+
+#ifndef NDEBUG
+ for (PropsTy::iterator I = props.begin(), E = props.end(); I != E; ++I)
+ assert(attrs == I->PropD->getPropertyAttributesAsWritten());
+#endif
+
+ return attrs;
+ }
+};
+
+class ImplementationChecker :
+ public RecursiveASTVisitor<ImplementationChecker> {
+ MigrationPass &Pass;
+
+public:
+ ImplementationChecker(MigrationPass &pass) : Pass(pass) { }
+
+ bool TraverseObjCImplementationDecl(ObjCImplementationDecl *D) {
+ PropertiesRewriter(Pass).doTransform(D);
+ return true;
+ }
+};
+
+} // anonymous namespace
+
+void trans::rewriteProperties(MigrationPass &pass) {
+ ImplementationChecker(pass).TraverseDecl(pass.Ctx.getTranslationUnitDecl());
+}
diff --git a/contrib/llvm/tools/clang/lib/ARCMigrate/TransRetainReleaseDealloc.cpp b/contrib/llvm/tools/clang/lib/ARCMigrate/TransRetainReleaseDealloc.cpp
new file mode 100644
index 0000000..ed6ed0a
--- /dev/null
+++ b/contrib/llvm/tools/clang/lib/ARCMigrate/TransRetainReleaseDealloc.cpp
@@ -0,0 +1,219 @@
+//===--- TransRetainReleaseDealloc.cpp - Tranformations to ARC mode -------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+//
+// removeRetainReleaseDealloc:
+//
+// Removes retain/release/autorelease/dealloc messages.
+//
+// return [[foo retain] autorelease];
+// ---->
+// return foo;
+//
+//===----------------------------------------------------------------------===//
+
+#include "Transforms.h"
+#include "Internals.h"
+#include "clang/Sema/SemaDiagnostic.h"
+#include "clang/AST/ParentMap.h"
+
+using namespace clang;
+using namespace arcmt;
+using namespace trans;
+using llvm::StringRef;
+
+namespace {
+
+class RetainReleaseDeallocRemover :
+ public RecursiveASTVisitor<RetainReleaseDeallocRemover> {
+ Stmt *Body;
+ MigrationPass &Pass;
+
+ ExprSet Removables;
+ llvm::OwningPtr<ParentMap> StmtMap;
+
+ Selector DelegateSel;
+
+public:
+ RetainReleaseDeallocRemover(MigrationPass &pass)
+ : Body(0), Pass(pass) {
+ DelegateSel =
+ Pass.Ctx.Selectors.getNullarySelector(&Pass.Ctx.Idents.get("delegate"));
+ }
+
+ void transformBody(Stmt *body) {
+ Body = body;
+ collectRemovables(body, Removables);
+ StmtMap.reset(new ParentMap(body));
+ TraverseStmt(body);
+ }
+
+ bool VisitObjCMessageExpr(ObjCMessageExpr *E) {
+ switch (E->getMethodFamily()) {
+ default:
+ return true;
+ case OMF_autorelease:
+ if (isRemovable(E)) {
+ // An unused autorelease is badness. If we remove it the receiver
+ // will likely die immediately while previously it was kept alive
+ // by the autorelease pool. This is bad practice in general, leave it
+ // and emit an error to force the user to restructure his code.
+ Pass.TA.reportError("it is not safe to remove an unused 'autorelease' "
+ "message; its receiver may be destroyed immediately",
+ E->getLocStart(), E->getSourceRange());
+ return true;
+ }
+ // Pass through.
+ case OMF_retain:
+ case OMF_release:
+ if (E->getReceiverKind() == ObjCMessageExpr::Instance)
+ if (Expr *rec = E->getInstanceReceiver()) {
+ rec = rec->IgnoreParenImpCasts();
+ if (rec->getType().getObjCLifetime() == Qualifiers::OCL_ExplicitNone &&
+ (E->getMethodFamily() != OMF_retain || isRemovable(E))) {
+ std::string err = "it is not safe to remove '";
+ err += E->getSelector().getAsString() + "' message on "
+ "an __unsafe_unretained type";
+ Pass.TA.reportError(err, rec->getLocStart());
+ return true;
+ }
+
+ if (isGlobalVar(rec) &&
+ (E->getMethodFamily() != OMF_retain || isRemovable(E))) {
+ std::string err = "it is not safe to remove '";
+ err += E->getSelector().getAsString() + "' message on "
+ "a global variable";
+ Pass.TA.reportError(err, rec->getLocStart());
+ return true;
+ }
+
+ if (E->getMethodFamily() == OMF_release && isDelegateMessage(rec)) {
+ Pass.TA.reportError("it is not safe to remove 'retain' "
+ "message on the result of a 'delegate' message; "
+ "the object that was passed to 'setDelegate:' may not be "
+ "properly retained", rec->getLocStart());
+ return true;
+ }
+ }
+ case OMF_dealloc:
+ break;
+ }
+
+ switch (E->getReceiverKind()) {
+ default:
+ return true;
+ case ObjCMessageExpr::SuperInstance: {
+ Transaction Trans(Pass.TA);
+ clearDiagnostics(E->getSuperLoc());
+ if (tryRemoving(E))
+ return true;
+ Pass.TA.replace(E->getSourceRange(), "self");
+ return true;
+ }
+ case ObjCMessageExpr::Instance:
+ break;
+ }
+
+ Expr *rec = E->getInstanceReceiver();
+ if (!rec) return true;
+
+ Transaction Trans(Pass.TA);
+ clearDiagnostics(rec->getExprLoc());
+
+ if (E->getMethodFamily() == OMF_release &&
+ isRemovable(E) && isInAtFinally(E)) {
+ // Change the -release to "receiver = nil" in a finally to avoid a leak
+ // when an exception is thrown.
+ Pass.TA.replace(E->getSourceRange(), rec->getSourceRange());
+ if (Pass.Ctx.Idents.get("nil").hasMacroDefinition())
+ Pass.TA.insertAfterToken(rec->getLocEnd(), " = nil");
+ else
+ Pass.TA.insertAfterToken(rec->getLocEnd(), " = 0");
+ return true;
+ }
+
+ if (!hasSideEffects(E, Pass.Ctx)) {
+ if (tryRemoving(E))
+ return true;
+ }
+ Pass.TA.replace(E->getSourceRange(), rec->getSourceRange());
+
+ return true;
+ }
+
+private:
+ void clearDiagnostics(SourceLocation loc) const {
+ Pass.TA.clearDiagnostic(diag::err_arc_illegal_explicit_message,
+ diag::err_unavailable,
+ diag::err_unavailable_message,
+ loc);
+ }
+
+ bool isDelegateMessage(Expr *E) const {
+ if (!E) return false;
+
+ E = E->IgnoreParenCasts();
+ if (ObjCMessageExpr *ME = dyn_cast<ObjCMessageExpr>(E))
+ return (ME->isInstanceMessage() && ME->getSelector() == DelegateSel);
+
+ if (ObjCPropertyRefExpr *propE = dyn_cast<ObjCPropertyRefExpr>(E))
+ return propE->getGetterSelector() == DelegateSel;
+
+ return false;
+ }
+
+ bool isInAtFinally(Expr *E) const {
+ assert(E);
+ Stmt *S = E;
+ while (S) {
+ if (isa<ObjCAtFinallyStmt>(S))
+ return true;
+ S = StmtMap->getParent(S);
+ }
+
+ return false;
+ }
+
+ bool isRemovable(Expr *E) const {
+ return Removables.count(E);
+ }
+
+ bool tryRemoving(Expr *E) const {
+ if (isRemovable(E)) {
+ Pass.TA.removeStmt(E);
+ return true;
+ }
+
+ Stmt *parent = StmtMap->getParent(E);
+
+ if (ImplicitCastExpr *castE = dyn_cast_or_null<ImplicitCastExpr>(parent))
+ return tryRemoving(castE);
+
+ if (ParenExpr *parenE = dyn_cast_or_null<ParenExpr>(parent))
+ return tryRemoving(parenE);
+
+ if (BinaryOperator *
+ bopE = dyn_cast_or_null<BinaryOperator>(parent)) {
+ if (bopE->getOpcode() == BO_Comma && bopE->getLHS() == E &&
+ isRemovable(bopE)) {
+ Pass.TA.replace(bopE->getSourceRange(), bopE->getRHS()->getSourceRange());
+ return true;
+ }
+ }
+
+ return false;
+ }
+
+};
+
+} // anonymous namespace
+
+void trans::removeRetainReleaseDealloc(MigrationPass &pass) {
+ BodyTransform<RetainReleaseDeallocRemover> trans(pass);
+ trans.TraverseDecl(pass.Ctx.getTranslationUnitDecl());
+}
diff --git a/contrib/llvm/tools/clang/lib/ARCMigrate/TransUnbridgedCasts.cpp b/contrib/llvm/tools/clang/lib/ARCMigrate/TransUnbridgedCasts.cpp
new file mode 100644
index 0000000..1cacd6d
--- /dev/null
+++ b/contrib/llvm/tools/clang/lib/ARCMigrate/TransUnbridgedCasts.cpp
@@ -0,0 +1,203 @@
+//===--- TransUnbridgedCasts.cpp - Tranformations to ARC mode -------------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+//
+// rewriteUnbridgedCasts:
+//
+// A cast of non-objc pointer to an objc one is checked. If the non-objc pointer
+// is from a file-level variable, __bridge cast is used to convert it.
+// For the result of a function call that we know is +1/+0,
+// __bridge/__bridge_transfer is used.
+//
+// NSString *str = (NSString *)kUTTypePlainText;
+// str = b ? kUTTypeRTF : kUTTypePlainText;
+// NSString *_uuidString = (NSString *)CFUUIDCreateString(kCFAllocatorDefault,
+// _uuid);
+// ---->
+// NSString *str = (__bridge NSString *)kUTTypePlainText;
+// str = (__bridge NSString *)(b ? kUTTypeRTF : kUTTypePlainText);
+// NSString *_uuidString = (__bridge_transfer NSString *)
+// CFUUIDCreateString(kCFAllocatorDefault, _uuid);
+//
+// For a C pointer to ObjC, for casting 'self', __bridge is used.
+//
+// CFStringRef str = (CFStringRef)self;
+// ---->
+// CFStringRef str = (__bridge CFStringRef)self;
+//
+//===----------------------------------------------------------------------===//
+
+#include "Transforms.h"
+#include "Internals.h"
+#include "clang/Analysis/DomainSpecific/CocoaConventions.h"
+#include "clang/Sema/SemaDiagnostic.h"
+#include "clang/Basic/SourceManager.h"
+
+using namespace clang;
+using namespace arcmt;
+using namespace trans;
+using llvm::StringRef;
+
+namespace {
+
+class UnbridgedCastRewriter : public RecursiveASTVisitor<UnbridgedCastRewriter>{
+ MigrationPass &Pass;
+ IdentifierInfo *SelfII;
+public:
+ UnbridgedCastRewriter(MigrationPass &pass) : Pass(pass) {
+ SelfII = &Pass.Ctx.Idents.get("self");
+ }
+
+ bool VisitCastExpr(CastExpr *E) {
+ if (E->getCastKind() != CK_AnyPointerToObjCPointerCast
+ && E->getCastKind() != CK_BitCast)
+ return true;
+
+ QualType castType = E->getType();
+ Expr *castExpr = E->getSubExpr();
+ QualType castExprType = castExpr->getType();
+
+ if (castType->isObjCObjectPointerType() &&
+ castExprType->isObjCObjectPointerType())
+ return true;
+ if (!castType->isObjCObjectPointerType() &&
+ !castExprType->isObjCObjectPointerType())
+ return true;
+
+ bool exprRetainable = castExprType->isObjCIndirectLifetimeType();
+ bool castRetainable = castType->isObjCIndirectLifetimeType();
+ if (exprRetainable == castRetainable) return true;
+
+ if (castExpr->isNullPointerConstant(Pass.Ctx,
+ Expr::NPC_ValueDependentIsNull))
+ return true;
+
+ SourceLocation loc = castExpr->getExprLoc();
+ if (loc.isValid() && Pass.Ctx.getSourceManager().isInSystemHeader(loc))
+ return true;
+
+ if (castType->isObjCObjectPointerType())
+ transformNonObjCToObjCCast(E);
+ else
+ transformObjCToNonObjCCast(E);
+
+ return true;
+ }
+
+private:
+ void transformNonObjCToObjCCast(CastExpr *E) {
+ if (!E) return;
+
+ // Global vars are assumed that are cast as unretained.
+ if (isGlobalVar(E))
+ if (E->getSubExpr()->getType()->isPointerType()) {
+ castToObjCObject(E, /*retained=*/false);
+ return;
+ }
+
+ // If the cast is directly over the result of a Core Foundation function
+ // try to figure out whether it should be cast as retained or unretained.
+ Expr *inner = E->IgnoreParenCasts();
+ if (CallExpr *callE = dyn_cast<CallExpr>(inner)) {
+ if (FunctionDecl *FD = callE->getDirectCallee()) {
+ if (FD->getAttr<CFReturnsRetainedAttr>()) {
+ castToObjCObject(E, /*retained=*/true);
+ return;
+ }
+ if (FD->getAttr<CFReturnsNotRetainedAttr>()) {
+ castToObjCObject(E, /*retained=*/false);
+ return;
+ }
+ if (FD->isGlobal() &&
+ FD->getIdentifier() &&
+ ento::cocoa::isRefType(E->getSubExpr()->getType(), "CF",
+ FD->getIdentifier()->getName())) {
+ StringRef fname = FD->getIdentifier()->getName();
+ if (fname.endswith("Retain") ||
+ fname.find("Create") != StringRef::npos ||
+ fname.find("Copy") != StringRef::npos) {
+ castToObjCObject(E, /*retained=*/true);
+ return;
+ }
+
+ if (fname.find("Get") != StringRef::npos) {
+ castToObjCObject(E, /*retained=*/false);
+ return;
+ }
+ }
+ }
+ }
+ }
+
+ void castToObjCObject(CastExpr *E, bool retained) {
+ rewriteToBridgedCast(E, retained ? OBC_BridgeTransfer : OBC_Bridge);
+ }
+
+ void rewriteToBridgedCast(CastExpr *E, ObjCBridgeCastKind Kind) {
+ TransformActions &TA = Pass.TA;
+
+ // We will remove the compiler diagnostic.
+ if (!TA.hasDiagnostic(diag::err_arc_mismatched_cast,
+ diag::err_arc_cast_requires_bridge,
+ E->getLocStart()))
+ return;
+
+ StringRef bridge;
+ switch(Kind) {
+ case OBC_Bridge:
+ bridge = "__bridge "; break;
+ case OBC_BridgeTransfer:
+ bridge = "__bridge_transfer "; break;
+ case OBC_BridgeRetained:
+ bridge = "__bridge_retained "; break;
+ }
+
+ Transaction Trans(TA);
+ TA.clearDiagnostic(diag::err_arc_mismatched_cast,
+ diag::err_arc_cast_requires_bridge,
+ E->getLocStart());
+ if (CStyleCastExpr *CCE = dyn_cast<CStyleCastExpr>(E)) {
+ TA.insertAfterToken(CCE->getLParenLoc(), bridge);
+ } else {
+ SourceLocation insertLoc = E->getSubExpr()->getLocStart();
+ llvm::SmallString<128> newCast;
+ newCast += '(';
+ newCast += bridge;
+ newCast += E->getType().getAsString(Pass.Ctx.PrintingPolicy);
+ newCast += ')';
+
+ if (isa<ParenExpr>(E->getSubExpr())) {
+ TA.insert(insertLoc, newCast.str());
+ } else {
+ newCast += '(';
+ TA.insert(insertLoc, newCast.str());
+ TA.insertAfterToken(E->getLocEnd(), ")");
+ }
+ }
+ }
+
+ void transformObjCToNonObjCCast(CastExpr *E) {
+ if (isSelf(E->getSubExpr()))
+ return rewriteToBridgedCast(E, OBC_Bridge);
+ }
+
+ bool isSelf(Expr *E) {
+ E = E->IgnoreParenLValueCasts();
+ if (DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(E))
+ if (DRE->getDecl()->getIdentifier() == SelfII)
+ return true;
+ return false;
+ }
+};
+
+} // end anonymous namespace
+
+void trans::rewriteUnbridgedCasts(MigrationPass &pass) {
+ UnbridgedCastRewriter trans(pass);
+ trans.TraverseDecl(pass.Ctx.getTranslationUnitDecl());
+}
diff --git a/contrib/llvm/tools/clang/lib/ARCMigrate/TransUnusedInitDelegate.cpp b/contrib/llvm/tools/clang/lib/ARCMigrate/TransUnusedInitDelegate.cpp
new file mode 100644
index 0000000..1019ab4
--- /dev/null
+++ b/contrib/llvm/tools/clang/lib/ARCMigrate/TransUnusedInitDelegate.cpp
@@ -0,0 +1,74 @@
+//===--- TransUnusedInitDelegate.cpp - Tranformations to ARC mode ---------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+// Transformations:
+//===----------------------------------------------------------------------===//
+//
+// rewriteUnusedInitDelegate:
+//
+// Rewrites an unused result of calling a delegate initialization, to assigning
+// the result to self.
+// e.g
+// [self init];
+// ---->
+// self = [self init];
+//
+//===----------------------------------------------------------------------===//
+
+#include "Transforms.h"
+#include "Internals.h"
+#include "clang/Sema/SemaDiagnostic.h"
+
+using namespace clang;
+using namespace arcmt;
+using namespace trans;
+using llvm::StringRef;
+
+namespace {
+
+class UnusedInitRewriter : public RecursiveASTVisitor<UnusedInitRewriter> {
+ Stmt *Body;
+ MigrationPass &Pass;
+
+ ExprSet Removables;
+
+public:
+ UnusedInitRewriter(MigrationPass &pass)
+ : Body(0), Pass(pass) { }
+
+ void transformBody(Stmt *body) {
+ Body = body;
+ collectRemovables(body, Removables);
+ TraverseStmt(body);
+ }
+
+ bool VisitObjCMessageExpr(ObjCMessageExpr *ME) {
+ if (ME->isDelegateInitCall() &&
+ isRemovable(ME) &&
+ Pass.TA.hasDiagnostic(diag::err_arc_unused_init_message,
+ ME->getExprLoc())) {
+ Transaction Trans(Pass.TA);
+ Pass.TA.clearDiagnostic(diag::err_arc_unused_init_message,
+ ME->getExprLoc());
+ Pass.TA.insert(ME->getExprLoc(), "self = ");
+ }
+ return true;
+ }
+
+private:
+ bool isRemovable(Expr *E) const {
+ return Removables.count(E);
+ }
+};
+
+} // anonymous namespace
+
+void trans::rewriteUnusedInitDelegate(MigrationPass &pass) {
+ BodyTransform<UnusedInitRewriter> trans(pass);
+ trans.TraverseDecl(pass.Ctx.getTranslationUnitDecl());
+}
diff --git a/contrib/llvm/tools/clang/lib/ARCMigrate/TransZeroOutPropsInDealloc.cpp b/contrib/llvm/tools/clang/lib/ARCMigrate/TransZeroOutPropsInDealloc.cpp
new file mode 100644
index 0000000..07ccf70
--- /dev/null
+++ b/contrib/llvm/tools/clang/lib/ARCMigrate/TransZeroOutPropsInDealloc.cpp
@@ -0,0 +1,198 @@
+//===--- TransZeroOutPropsInDealloc.cpp - Tranformations to ARC mode ------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+//
+// removeZeroOutPropsInDealloc:
+//
+// Removes zero'ing out "strong" @synthesized properties in a -dealloc method.
+//
+//===----------------------------------------------------------------------===//
+
+#include "Transforms.h"
+#include "Internals.h"
+
+using namespace clang;
+using namespace arcmt;
+using namespace trans;
+using llvm::StringRef;
+
+namespace {
+
+class ZeroOutInDeallocRemover :
+ public RecursiveASTVisitor<ZeroOutInDeallocRemover> {
+ typedef RecursiveASTVisitor<ZeroOutInDeallocRemover> base;
+
+ MigrationPass &Pass;
+
+ llvm::DenseMap<ObjCPropertyDecl*, ObjCPropertyImplDecl*> SynthesizedProperties;
+ ImplicitParamDecl *SelfD;
+ ExprSet Removables;
+
+public:
+ ZeroOutInDeallocRemover(MigrationPass &pass) : Pass(pass), SelfD(0) { }
+
+ bool VisitObjCMessageExpr(ObjCMessageExpr *ME) {
+ ASTContext &Ctx = Pass.Ctx;
+ TransformActions &TA = Pass.TA;
+
+ if (ME->getReceiverKind() != ObjCMessageExpr::Instance)
+ return true;
+ Expr *receiver = ME->getInstanceReceiver();
+ if (!receiver)
+ return true;
+
+ DeclRefExpr *refE = dyn_cast<DeclRefExpr>(receiver->IgnoreParenCasts());
+ if (!refE || refE->getDecl() != SelfD)
+ return true;
+
+ bool BackedBySynthesizeSetter = false;
+ for (llvm::DenseMap<ObjCPropertyDecl*, ObjCPropertyImplDecl*>::iterator
+ P = SynthesizedProperties.begin(),
+ E = SynthesizedProperties.end(); P != E; ++P) {
+ ObjCPropertyDecl *PropDecl = P->first;
+ if (PropDecl->getSetterName() == ME->getSelector()) {
+ BackedBySynthesizeSetter = true;
+ break;
+ }
+ }
+ if (!BackedBySynthesizeSetter)
+ return true;
+
+ // Remove the setter message if RHS is null
+ Transaction Trans(TA);
+ Expr *RHS = ME->getArg(0);
+ bool RHSIsNull =
+ RHS->isNullPointerConstant(Ctx,
+ Expr::NPC_ValueDependentIsNull);
+ if (RHSIsNull && isRemovable(ME))
+ TA.removeStmt(ME);
+
+ return true;
+ }
+
+ bool VisitBinaryOperator(BinaryOperator *BOE) {
+ if (isZeroingPropIvar(BOE) && isRemovable(BOE)) {
+ Transaction Trans(Pass.TA);
+ Pass.TA.removeStmt(BOE);
+ }
+
+ return true;
+ }
+
+ bool TraverseObjCMethodDecl(ObjCMethodDecl *D) {
+ if (D->getMethodFamily() != OMF_dealloc)
+ return true;
+ if (!D->hasBody())
+ return true;
+
+ ObjCImplDecl *IMD = dyn_cast<ObjCImplDecl>(D->getDeclContext());
+ if (!IMD)
+ return true;
+
+ SelfD = D->getSelfDecl();
+ collectRemovables(D->getBody(), Removables);
+
+ // For a 'dealloc' method use, find all property implementations in
+ // this class implementation.
+ for (ObjCImplDecl::propimpl_iterator
+ I = IMD->propimpl_begin(), EI = IMD->propimpl_end(); I != EI; ++I) {
+ ObjCPropertyImplDecl *PID = *I;
+ if (PID->getPropertyImplementation() ==
+ ObjCPropertyImplDecl::Synthesize) {
+ ObjCPropertyDecl *PD = PID->getPropertyDecl();
+ ObjCMethodDecl *setterM = PD->getSetterMethodDecl();
+ if (!(setterM && setterM->isDefined())) {
+ ObjCPropertyDecl::PropertyAttributeKind AttrKind =
+ PD->getPropertyAttributes();
+ if (AttrKind &
+ (ObjCPropertyDecl::OBJC_PR_retain |
+ ObjCPropertyDecl::OBJC_PR_copy |
+ ObjCPropertyDecl::OBJC_PR_strong))
+ SynthesizedProperties[PD] = PID;
+ }
+ }
+ }
+
+ // Now, remove all zeroing of ivars etc.
+ base::TraverseObjCMethodDecl(D);
+
+ // clear out for next method.
+ SynthesizedProperties.clear();
+ SelfD = 0;
+ Removables.clear();
+ return true;
+ }
+
+ bool TraverseFunctionDecl(FunctionDecl *D) { return true; }
+ bool TraverseBlockDecl(BlockDecl *block) { return true; }
+ bool TraverseBlockExpr(BlockExpr *block) { return true; }
+
+private:
+ bool isRemovable(Expr *E) const {
+ return Removables.count(E);
+ }
+
+ bool isZeroingPropIvar(Expr *E) {
+ BinaryOperator *BOE = dyn_cast_or_null<BinaryOperator>(E);
+ if (!BOE) return false;
+
+ if (BOE->getOpcode() == BO_Comma)
+ return isZeroingPropIvar(BOE->getLHS()) &&
+ isZeroingPropIvar(BOE->getRHS());
+
+ if (BOE->getOpcode() != BO_Assign)
+ return false;
+
+ ASTContext &Ctx = Pass.Ctx;
+
+ Expr *LHS = BOE->getLHS();
+ if (ObjCIvarRefExpr *IV = dyn_cast<ObjCIvarRefExpr>(LHS)) {
+ ObjCIvarDecl *IVDecl = IV->getDecl();
+ if (!IVDecl->getType()->isObjCObjectPointerType())
+ return false;
+ bool IvarBacksPropertySynthesis = false;
+ for (llvm::DenseMap<ObjCPropertyDecl*, ObjCPropertyImplDecl*>::iterator
+ P = SynthesizedProperties.begin(),
+ E = SynthesizedProperties.end(); P != E; ++P) {
+ ObjCPropertyImplDecl *PropImpDecl = P->second;
+ if (PropImpDecl && PropImpDecl->getPropertyIvarDecl() == IVDecl) {
+ IvarBacksPropertySynthesis = true;
+ break;
+ }
+ }
+ if (!IvarBacksPropertySynthesis)
+ return false;
+ }
+ else if (ObjCPropertyRefExpr *PropRefExp = dyn_cast<ObjCPropertyRefExpr>(LHS)) {
+ // TODO: Using implicit property decl.
+ if (PropRefExp->isImplicitProperty())
+ return false;
+ if (ObjCPropertyDecl *PDecl = PropRefExp->getExplicitProperty()) {
+ if (!SynthesizedProperties.count(PDecl))
+ return false;
+ }
+ }
+ else
+ return false;
+
+ Expr *RHS = BOE->getRHS();
+ bool RHSIsNull = RHS->isNullPointerConstant(Ctx,
+ Expr::NPC_ValueDependentIsNull);
+ if (RHSIsNull)
+ return true;
+
+ return isZeroingPropIvar(RHS);
+ }
+};
+
+} // anonymous namespace
+
+void trans::removeZeroOutPropsInDealloc(MigrationPass &pass) {
+ ZeroOutInDeallocRemover trans(pass);
+ trans.TraverseDecl(pass.Ctx.getTranslationUnitDecl());
+}
diff --git a/contrib/llvm/tools/clang/lib/ARCMigrate/TransformActions.cpp b/contrib/llvm/tools/clang/lib/ARCMigrate/TransformActions.cpp
new file mode 100644
index 0000000..c99940b
--- /dev/null
+++ b/contrib/llvm/tools/clang/lib/ARCMigrate/TransformActions.cpp
@@ -0,0 +1,699 @@
+//===--- ARCMT.cpp - Migration to ARC mode --------------------------------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+#include "Internals.h"
+#include "clang/AST/Expr.h"
+#include "clang/Lex/Preprocessor.h"
+#include "clang/Basic/SourceManager.h"
+#include "llvm/ADT/DenseSet.h"
+#include <map>
+
+using namespace clang;
+using namespace arcmt;
+using llvm::StringRef;
+
+namespace {
+
+/// \brief Collects transformations and merges them before applying them with
+/// with applyRewrites(). E.g. if the same source range
+/// is requested to be removed twice, only one rewriter remove will be invoked.
+/// Rewrites happen in "transactions"; if one rewrite in the transaction cannot
+/// be done (e.g. it resides in a macro) all rewrites in the transaction are
+/// aborted.
+/// FIXME: "Transactional" rewrites support should be baked in the Rewriter.
+class TransformActionsImpl {
+ CapturedDiagList &CapturedDiags;
+ ASTContext &Ctx;
+ Preprocessor &PP;
+
+ bool IsInTransaction;
+
+ enum ActionKind {
+ Act_Insert, Act_InsertAfterToken,
+ Act_Remove, Act_RemoveStmt,
+ Act_Replace, Act_ReplaceText,
+ Act_IncreaseIndentation,
+ Act_ClearDiagnostic
+ };
+
+ struct ActionData {
+ ActionKind Kind;
+ SourceLocation Loc;
+ SourceRange R1, R2;
+ llvm::StringRef Text1, Text2;
+ Stmt *S;
+ llvm::SmallVector<unsigned, 2> DiagIDs;
+ };
+
+ std::vector<ActionData> CachedActions;
+
+ enum RangeComparison {
+ Range_Before,
+ Range_After,
+ Range_Contains,
+ Range_Contained,
+ Range_ExtendsBegin,
+ Range_ExtendsEnd
+ };
+
+ /// \brief A range to remove. It is a character range.
+ struct CharRange {
+ FullSourceLoc Begin, End;
+
+ CharRange(CharSourceRange range, SourceManager &srcMgr, Preprocessor &PP) {
+ SourceLocation beginLoc = range.getBegin(), endLoc = range.getEnd();
+ assert(beginLoc.isValid() && endLoc.isValid());
+ if (range.isTokenRange()) {
+ Begin = FullSourceLoc(srcMgr.getInstantiationLoc(beginLoc), srcMgr);
+ End = FullSourceLoc(getLocForEndOfToken(endLoc, srcMgr, PP), srcMgr);
+ } else {
+ Begin = FullSourceLoc(srcMgr.getInstantiationLoc(beginLoc), srcMgr);
+ End = FullSourceLoc(srcMgr.getInstantiationLoc(endLoc), srcMgr);
+ }
+ assert(Begin.isValid() && End.isValid());
+ }
+
+ RangeComparison compareWith(const CharRange &RHS) const {
+ if (End.isBeforeInTranslationUnitThan(RHS.Begin))
+ return Range_Before;
+ if (RHS.End.isBeforeInTranslationUnitThan(Begin))
+ return Range_After;
+ if (!Begin.isBeforeInTranslationUnitThan(RHS.Begin) &&
+ !RHS.End.isBeforeInTranslationUnitThan(End))
+ return Range_Contained;
+ if (Begin.isBeforeInTranslationUnitThan(RHS.Begin) &&
+ RHS.End.isBeforeInTranslationUnitThan(End))
+ return Range_Contains;
+ if (Begin.isBeforeInTranslationUnitThan(RHS.Begin))
+ return Range_ExtendsBegin;
+ else
+ return Range_ExtendsEnd;
+ }
+
+ static RangeComparison compare(SourceRange LHS, SourceRange RHS,
+ SourceManager &SrcMgr, Preprocessor &PP) {
+ return CharRange(CharSourceRange::getTokenRange(LHS), SrcMgr, PP)
+ .compareWith(CharRange(CharSourceRange::getTokenRange(RHS),
+ SrcMgr, PP));
+ }
+ };
+
+ typedef llvm::SmallVector<StringRef, 2> TextsVec;
+ typedef std::map<FullSourceLoc, TextsVec, FullSourceLoc::BeforeThanCompare>
+ InsertsMap;
+ InsertsMap Inserts;
+ /// \brief A list of ranges to remove. They are always sorted and they never
+ /// intersect with each other.
+ std::list<CharRange> Removals;
+
+ llvm::DenseSet<Stmt *> StmtRemovals;
+
+ std::vector<std::pair<CharRange, SourceLocation> > IndentationRanges;
+
+ /// \brief Keeps text passed to transformation methods.
+ llvm::StringMap<bool> UniqueText;
+
+public:
+ TransformActionsImpl(CapturedDiagList &capturedDiags,
+ ASTContext &ctx, Preprocessor &PP)
+ : CapturedDiags(capturedDiags), Ctx(ctx), PP(PP), IsInTransaction(false) { }
+
+ void startTransaction();
+ bool commitTransaction();
+ void abortTransaction();
+
+ bool isInTransaction() const { return IsInTransaction; }
+
+ void insert(SourceLocation loc, llvm::StringRef text);
+ void insertAfterToken(SourceLocation loc, llvm::StringRef text);
+ void remove(SourceRange range);
+ void removeStmt(Stmt *S);
+ void replace(SourceRange range, llvm::StringRef text);
+ void replace(SourceRange range, SourceRange replacementRange);
+ void replaceStmt(Stmt *S, llvm::StringRef text);
+ void replaceText(SourceLocation loc, llvm::StringRef text,
+ llvm::StringRef replacementText);
+ void increaseIndentation(SourceRange range,
+ SourceLocation parentIndent);
+
+ bool clearDiagnostic(llvm::ArrayRef<unsigned> IDs, SourceRange range);
+
+ void applyRewrites(TransformActions::RewriteReceiver &receiver);
+
+private:
+ bool canInsert(SourceLocation loc);
+ bool canInsertAfterToken(SourceLocation loc);
+ bool canRemoveRange(SourceRange range);
+ bool canReplaceRange(SourceRange range, SourceRange replacementRange);
+ bool canReplaceText(SourceLocation loc, llvm::StringRef text);
+
+ void commitInsert(SourceLocation loc, StringRef text);
+ void commitInsertAfterToken(SourceLocation loc, StringRef text);
+ void commitRemove(SourceRange range);
+ void commitRemoveStmt(Stmt *S);
+ void commitReplace(SourceRange range, SourceRange replacementRange);
+ void commitReplaceText(SourceLocation loc, llvm::StringRef text,
+ llvm::StringRef replacementText);
+ void commitIncreaseIndentation(SourceRange range,SourceLocation parentIndent);
+ void commitClearDiagnostic(llvm::ArrayRef<unsigned> IDs, SourceRange range);
+
+ void addRemoval(CharSourceRange range);
+ void addInsertion(SourceLocation loc, StringRef text);
+
+ /// \brief Stores text passed to the transformation methods to keep the string
+ /// "alive". Since the vast majority of text will be the same, we also unique
+ /// the strings using a StringMap.
+ StringRef getUniqueText(StringRef text);
+
+ /// \brief Computes the source location just past the end of the token at
+ /// the given source location. If the location points at a macro, the whole
+ /// macro expansion is skipped.
+ static SourceLocation getLocForEndOfToken(SourceLocation loc,
+ SourceManager &SM,Preprocessor &PP);
+};
+
+} // anonymous namespace
+
+void TransformActionsImpl::startTransaction() {
+ assert(!IsInTransaction &&
+ "Cannot start a transaction in the middle of another one");
+ IsInTransaction = true;
+}
+
+bool TransformActionsImpl::commitTransaction() {
+ assert(IsInTransaction && "No transaction started");
+
+ if (CachedActions.empty()) {
+ IsInTransaction = false;
+ return false;
+ }
+
+ // Verify that all actions are possible otherwise abort the whole transaction.
+ bool AllActionsPossible = true;
+ for (unsigned i = 0, e = CachedActions.size(); i != e; ++i) {
+ ActionData &act = CachedActions[i];
+ switch (act.Kind) {
+ case Act_Insert:
+ if (!canInsert(act.Loc))
+ AllActionsPossible = false;
+ break;
+ case Act_InsertAfterToken:
+ if (!canInsertAfterToken(act.Loc))
+ AllActionsPossible = false;
+ break;
+ case Act_Remove:
+ if (!canRemoveRange(act.R1))
+ AllActionsPossible = false;
+ break;
+ case Act_RemoveStmt:
+ assert(act.S);
+ if (!canRemoveRange(act.S->getSourceRange()))
+ AllActionsPossible = false;
+ break;
+ case Act_Replace:
+ if (!canReplaceRange(act.R1, act.R2))
+ AllActionsPossible = false;
+ break;
+ case Act_ReplaceText:
+ if (!canReplaceText(act.Loc, act.Text1))
+ AllActionsPossible = false;
+ break;
+ case Act_IncreaseIndentation:
+ // This is not important, we don't care if it will fail.
+ break;
+ case Act_ClearDiagnostic:
+ // We are just checking source rewrites.
+ break;
+ }
+ if (!AllActionsPossible)
+ break;
+ }
+
+ if (!AllActionsPossible) {
+ abortTransaction();
+ return true;
+ }
+
+ for (unsigned i = 0, e = CachedActions.size(); i != e; ++i) {
+ ActionData &act = CachedActions[i];
+ switch (act.Kind) {
+ case Act_Insert:
+ commitInsert(act.Loc, act.Text1);
+ break;
+ case Act_InsertAfterToken:
+ commitInsertAfterToken(act.Loc, act.Text1);
+ break;
+ case Act_Remove:
+ commitRemove(act.R1);
+ break;
+ case Act_RemoveStmt:
+ commitRemoveStmt(act.S);
+ break;
+ case Act_Replace:
+ commitReplace(act.R1, act.R2);
+ break;
+ case Act_ReplaceText:
+ commitReplaceText(act.Loc, act.Text1, act.Text2);
+ break;
+ case Act_IncreaseIndentation:
+ commitIncreaseIndentation(act.R1, act.Loc);
+ break;
+ case Act_ClearDiagnostic:
+ commitClearDiagnostic(act.DiagIDs, act.R1);
+ break;
+ }
+ }
+
+ CachedActions.clear();
+ IsInTransaction = false;
+ return false;
+}
+
+void TransformActionsImpl::abortTransaction() {
+ assert(IsInTransaction && "No transaction started");
+ CachedActions.clear();
+ IsInTransaction = false;
+}
+
+void TransformActionsImpl::insert(SourceLocation loc, StringRef text) {
+ assert(IsInTransaction && "Actions only allowed during a transaction");
+ text = getUniqueText(text);
+ ActionData data;
+ data.Kind = Act_Insert;
+ data.Loc = loc;
+ data.Text1 = text;
+ CachedActions.push_back(data);
+}
+
+void TransformActionsImpl::insertAfterToken(SourceLocation loc, StringRef text) {
+ assert(IsInTransaction && "Actions only allowed during a transaction");
+ text = getUniqueText(text);
+ ActionData data;
+ data.Kind = Act_InsertAfterToken;
+ data.Loc = loc;
+ data.Text1 = text;
+ CachedActions.push_back(data);
+}
+
+void TransformActionsImpl::remove(SourceRange range) {
+ assert(IsInTransaction && "Actions only allowed during a transaction");
+ ActionData data;
+ data.Kind = Act_Remove;
+ data.R1 = range;
+ CachedActions.push_back(data);
+}
+
+void TransformActionsImpl::removeStmt(Stmt *S) {
+ assert(IsInTransaction && "Actions only allowed during a transaction");
+ ActionData data;
+ data.Kind = Act_RemoveStmt;
+ data.S = S->IgnoreImplicit(); // important for uniquing
+ CachedActions.push_back(data);
+}
+
+void TransformActionsImpl::replace(SourceRange range, StringRef text) {
+ assert(IsInTransaction && "Actions only allowed during a transaction");
+ text = getUniqueText(text);
+ remove(range);
+ insert(range.getBegin(), text);
+}
+
+void TransformActionsImpl::replace(SourceRange range,
+ SourceRange replacementRange) {
+ assert(IsInTransaction && "Actions only allowed during a transaction");
+ ActionData data;
+ data.Kind = Act_Replace;
+ data.R1 = range;
+ data.R2 = replacementRange;
+ CachedActions.push_back(data);
+}
+
+void TransformActionsImpl::replaceText(SourceLocation loc, StringRef text,
+ StringRef replacementText) {
+ text = getUniqueText(text);
+ replacementText = getUniqueText(replacementText);
+ ActionData data;
+ data.Kind = Act_ReplaceText;
+ data.Loc = loc;
+ data.Text1 = text;
+ data.Text2 = replacementText;
+ CachedActions.push_back(data);
+}
+
+void TransformActionsImpl::replaceStmt(Stmt *S, StringRef text) {
+ assert(IsInTransaction && "Actions only allowed during a transaction");
+ text = getUniqueText(text);
+ insert(S->getLocStart(), text);
+ removeStmt(S);
+}
+
+void TransformActionsImpl::increaseIndentation(SourceRange range,
+ SourceLocation parentIndent) {
+ if (range.isInvalid()) return;
+ assert(IsInTransaction && "Actions only allowed during a transaction");
+ ActionData data;
+ data.Kind = Act_IncreaseIndentation;
+ data.R1 = range;
+ data.Loc = parentIndent;
+ CachedActions.push_back(data);
+}
+
+bool TransformActionsImpl::clearDiagnostic(llvm::ArrayRef<unsigned> IDs,
+ SourceRange range) {
+ assert(IsInTransaction && "Actions only allowed during a transaction");
+ if (!CapturedDiags.hasDiagnostic(IDs, range))
+ return false;
+
+ ActionData data;
+ data.Kind = Act_ClearDiagnostic;
+ data.R1 = range;
+ data.DiagIDs.append(IDs.begin(), IDs.end());
+ CachedActions.push_back(data);
+ return true;
+}
+
+bool TransformActionsImpl::canInsert(SourceLocation loc) {
+ if (loc.isInvalid())
+ return false;
+
+ SourceManager &SM = Ctx.getSourceManager();
+ if (SM.isInSystemHeader(SM.getInstantiationLoc(loc)))
+ return false;
+
+ if (loc.isFileID())
+ return true;
+ return PP.isAtStartOfMacroExpansion(loc);
+}
+
+bool TransformActionsImpl::canInsertAfterToken(SourceLocation loc) {
+ if (loc.isInvalid())
+ return false;
+
+ SourceManager &SM = Ctx.getSourceManager();
+ if (SM.isInSystemHeader(SM.getInstantiationLoc(loc)))
+ return false;
+
+ if (loc.isFileID())
+ return true;
+ return PP.isAtEndOfMacroExpansion(loc);
+}
+
+bool TransformActionsImpl::canRemoveRange(SourceRange range) {
+ return canInsert(range.getBegin()) && canInsertAfterToken(range.getEnd());
+}
+
+bool TransformActionsImpl::canReplaceRange(SourceRange range,
+ SourceRange replacementRange) {
+ return canRemoveRange(range) && canRemoveRange(replacementRange);
+}
+
+bool TransformActionsImpl::canReplaceText(SourceLocation loc, StringRef text) {
+ if (!canInsert(loc))
+ return false;
+
+ SourceManager &SM = Ctx.getSourceManager();
+ loc = SM.getInstantiationLoc(loc);
+
+ // Break down the source location.
+ std::pair<FileID, unsigned> locInfo = SM.getDecomposedLoc(loc);
+
+ // Try to load the file buffer.
+ bool invalidTemp = false;
+ llvm::StringRef file = SM.getBufferData(locInfo.first, &invalidTemp);
+ if (invalidTemp)
+ return false;
+
+ return file.substr(locInfo.second).startswith(text);
+}
+
+void TransformActionsImpl::commitInsert(SourceLocation loc, StringRef text) {
+ addInsertion(loc, text);
+}
+
+void TransformActionsImpl::commitInsertAfterToken(SourceLocation loc,
+ StringRef text) {
+ addInsertion(getLocForEndOfToken(loc, Ctx.getSourceManager(), PP), text);
+}
+
+void TransformActionsImpl::commitRemove(SourceRange range) {
+ addRemoval(CharSourceRange::getTokenRange(range));
+}
+
+void TransformActionsImpl::commitRemoveStmt(Stmt *S) {
+ assert(S);
+ if (StmtRemovals.count(S))
+ return; // already removed.
+
+ if (Expr *E = dyn_cast<Expr>(S)) {
+ commitRemove(E->getSourceRange());
+ commitInsert(E->getSourceRange().getBegin(), getARCMTMacroName());
+ } else
+ commitRemove(S->getSourceRange());
+
+ StmtRemovals.insert(S);
+}
+
+void TransformActionsImpl::commitReplace(SourceRange range,
+ SourceRange replacementRange) {
+ RangeComparison comp = CharRange::compare(replacementRange, range,
+ Ctx.getSourceManager(), PP);
+ assert(comp == Range_Contained);
+ if (comp != Range_Contained)
+ return; // Although we asserted, be extra safe for release build.
+ if (range.getBegin() != replacementRange.getBegin())
+ addRemoval(CharSourceRange::getCharRange(range.getBegin(),
+ replacementRange.getBegin()));
+ if (replacementRange.getEnd() != range.getEnd())
+ addRemoval(CharSourceRange::getTokenRange(
+ getLocForEndOfToken(replacementRange.getEnd(),
+ Ctx.getSourceManager(), PP),
+ range.getEnd()));
+}
+void TransformActionsImpl::commitReplaceText(SourceLocation loc,
+ StringRef text,
+ StringRef replacementText) {
+ SourceManager &SM = Ctx.getSourceManager();
+ loc = SM.getInstantiationLoc(loc);
+ // canReplaceText already checked if loc points at text.
+ SourceLocation afterText = loc.getFileLocWithOffset(text.size());
+
+ addRemoval(CharSourceRange::getCharRange(loc, afterText));
+ commitInsert(loc, replacementText);
+}
+
+void TransformActionsImpl::commitIncreaseIndentation(SourceRange range,
+ SourceLocation parentIndent) {
+ SourceManager &SM = Ctx.getSourceManager();
+ IndentationRanges.push_back(
+ std::make_pair(CharRange(CharSourceRange::getTokenRange(range),
+ SM, PP),
+ SM.getInstantiationLoc(parentIndent)));
+}
+
+void TransformActionsImpl::commitClearDiagnostic(llvm::ArrayRef<unsigned> IDs,
+ SourceRange range) {
+ CapturedDiags.clearDiagnostic(IDs, range);
+}
+
+void TransformActionsImpl::addInsertion(SourceLocation loc, StringRef text) {
+ SourceManager &SM = Ctx.getSourceManager();
+ loc = SM.getInstantiationLoc(loc);
+ for (std::list<CharRange>::reverse_iterator
+ I = Removals.rbegin(), E = Removals.rend(); I != E; ++I) {
+ if (!SM.isBeforeInTranslationUnit(loc, I->End))
+ break;
+ if (I->Begin.isBeforeInTranslationUnitThan(loc))
+ return;
+ }
+
+ Inserts[FullSourceLoc(loc, SM)].push_back(text);
+}
+
+void TransformActionsImpl::addRemoval(CharSourceRange range) {
+ CharRange newRange(range, Ctx.getSourceManager(), PP);
+ if (newRange.Begin == newRange.End)
+ return;
+
+ Inserts.erase(Inserts.upper_bound(newRange.Begin),
+ Inserts.lower_bound(newRange.End));
+
+ std::list<CharRange>::iterator I = Removals.end();
+ while (I != Removals.begin()) {
+ std::list<CharRange>::iterator RI = I;
+ --RI;
+ RangeComparison comp = newRange.compareWith(*RI);
+ switch (comp) {
+ case Range_Before:
+ --I;
+ break;
+ case Range_After:
+ Removals.insert(I, newRange);
+ return;
+ case Range_Contained:
+ return;
+ case Range_Contains:
+ RI->End = newRange.End;
+ case Range_ExtendsBegin:
+ newRange.End = RI->End;
+ Removals.erase(RI);
+ break;
+ case Range_ExtendsEnd:
+ RI->End = newRange.End;
+ return;
+ }
+ }
+
+ Removals.insert(Removals.begin(), newRange);
+}
+
+void TransformActionsImpl::applyRewrites(
+ TransformActions::RewriteReceiver &receiver) {
+ for (InsertsMap::iterator I = Inserts.begin(), E = Inserts.end(); I!=E; ++I) {
+ SourceLocation loc = I->first;
+ for (TextsVec::iterator
+ TI = I->second.begin(), TE = I->second.end(); TI != TE; ++TI) {
+ receiver.insert(loc, *TI);
+ }
+ }
+
+ for (std::vector<std::pair<CharRange, SourceLocation> >::iterator
+ I = IndentationRanges.begin(), E = IndentationRanges.end(); I!=E; ++I) {
+ CharSourceRange range = CharSourceRange::getCharRange(I->first.Begin,
+ I->first.End);
+ receiver.increaseIndentation(range, I->second);
+ }
+
+ for (std::list<CharRange>::iterator
+ I = Removals.begin(), E = Removals.end(); I != E; ++I) {
+ CharSourceRange range = CharSourceRange::getCharRange(I->Begin, I->End);
+ receiver.remove(range);
+ }
+}
+
+/// \brief Stores text passed to the transformation methods to keep the string
+/// "alive". Since the vast majority of text will be the same, we also unique
+/// the strings using a StringMap.
+StringRef TransformActionsImpl::getUniqueText(StringRef text) {
+ llvm::StringMapEntry<bool> &entry = UniqueText.GetOrCreateValue(text);
+ return entry.getKey();
+}
+
+/// \brief Computes the source location just past the end of the token at
+/// the given source location. If the location points at a macro, the whole
+/// macro expansion is skipped.
+SourceLocation TransformActionsImpl::getLocForEndOfToken(SourceLocation loc,
+ SourceManager &SM,
+ Preprocessor &PP) {
+ if (loc.isMacroID())
+ loc = SM.getInstantiationRange(loc).second;
+ return PP.getLocForEndOfToken(loc);
+}
+
+TransformActions::RewriteReceiver::~RewriteReceiver() { }
+
+TransformActions::TransformActions(Diagnostic &diag,
+ CapturedDiagList &capturedDiags,
+ ASTContext &ctx, Preprocessor &PP)
+ : Diags(diag), CapturedDiags(capturedDiags) {
+ Impl = new TransformActionsImpl(capturedDiags, ctx, PP);
+}
+
+TransformActions::~TransformActions() {
+ delete static_cast<TransformActionsImpl*>(Impl);
+}
+
+void TransformActions::startTransaction() {
+ static_cast<TransformActionsImpl*>(Impl)->startTransaction();
+}
+
+bool TransformActions::commitTransaction() {
+ return static_cast<TransformActionsImpl*>(Impl)->commitTransaction();
+}
+
+void TransformActions::abortTransaction() {
+ static_cast<TransformActionsImpl*>(Impl)->abortTransaction();
+}
+
+
+void TransformActions::insert(SourceLocation loc, llvm::StringRef text) {
+ static_cast<TransformActionsImpl*>(Impl)->insert(loc, text);
+}
+
+void TransformActions::insertAfterToken(SourceLocation loc,
+ llvm::StringRef text) {
+ static_cast<TransformActionsImpl*>(Impl)->insertAfterToken(loc, text);
+}
+
+void TransformActions::remove(SourceRange range) {
+ static_cast<TransformActionsImpl*>(Impl)->remove(range);
+}
+
+void TransformActions::removeStmt(Stmt *S) {
+ static_cast<TransformActionsImpl*>(Impl)->removeStmt(S);
+}
+
+void TransformActions::replace(SourceRange range, llvm::StringRef text) {
+ static_cast<TransformActionsImpl*>(Impl)->replace(range, text);
+}
+
+void TransformActions::replace(SourceRange range,
+ SourceRange replacementRange) {
+ static_cast<TransformActionsImpl*>(Impl)->replace(range, replacementRange);
+}
+
+void TransformActions::replaceStmt(Stmt *S, llvm::StringRef text) {
+ static_cast<TransformActionsImpl*>(Impl)->replaceStmt(S, text);
+}
+
+void TransformActions::replaceText(SourceLocation loc, llvm::StringRef text,
+ llvm::StringRef replacementText) {
+ static_cast<TransformActionsImpl*>(Impl)->replaceText(loc, text,
+ replacementText);
+}
+
+void TransformActions::increaseIndentation(SourceRange range,
+ SourceLocation parentIndent) {
+ static_cast<TransformActionsImpl*>(Impl)->increaseIndentation(range,
+ parentIndent);
+}
+
+bool TransformActions::clearDiagnostic(llvm::ArrayRef<unsigned> IDs,
+ SourceRange range) {
+ return static_cast<TransformActionsImpl*>(Impl)->clearDiagnostic(IDs, range);
+}
+
+void TransformActions::applyRewrites(RewriteReceiver &receiver) {
+ static_cast<TransformActionsImpl*>(Impl)->applyRewrites(receiver);
+}
+
+void TransformActions::reportError(llvm::StringRef error, SourceLocation loc,
+ SourceRange range) {
+ assert(!static_cast<TransformActionsImpl*>(Impl)->isInTransaction() &&
+ "Errors should be emitted out of a transaction");
+ // FIXME: Use a custom category name to distinguish rewriter errors.
+ std::string rewriteErr = "[rewriter] ";
+ rewriteErr += error;
+ unsigned diagID
+ = Diags.getDiagnosticIDs()->getCustomDiagID(DiagnosticIDs::Error,
+ rewriteErr);
+ Diags.Report(loc, diagID) << range;
+}
+
+void TransformActions::reportNote(llvm::StringRef note, SourceLocation loc,
+ SourceRange range) {
+ assert(!static_cast<TransformActionsImpl*>(Impl)->isInTransaction() &&
+ "Errors should be emitted out of a transaction");
+ // FIXME: Use a custom category name to distinguish rewriter errors.
+ std::string rewriteNote = "[rewriter] ";
+ rewriteNote += note;
+ unsigned diagID
+ = Diags.getDiagnosticIDs()->getCustomDiagID(DiagnosticIDs::Note,
+ rewriteNote);
+ Diags.Report(loc, diagID) << range;
+}
diff --git a/contrib/llvm/tools/clang/lib/ARCMigrate/Transforms.cpp b/contrib/llvm/tools/clang/lib/ARCMigrate/Transforms.cpp
new file mode 100644
index 0000000..7bd95e5
--- /dev/null
+++ b/contrib/llvm/tools/clang/lib/ARCMigrate/Transforms.cpp
@@ -0,0 +1,296 @@
+//===--- Tranforms.cpp - Tranformations to ARC mode -----------------------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+#include "Transforms.h"
+#include "Internals.h"
+#include "clang/Sema/SemaDiagnostic.h"
+#include "clang/AST/RecursiveASTVisitor.h"
+#include "clang/AST/StmtVisitor.h"
+#include "clang/AST/ParentMap.h"
+#include "clang/Analysis/DomainSpecific/CocoaConventions.h"
+#include "clang/Lex/Lexer.h"
+#include "clang/Basic/SourceManager.h"
+#include "llvm/ADT/StringSwitch.h"
+#include "llvm/ADT/DenseSet.h"
+#include <map>
+
+using namespace clang;
+using namespace arcmt;
+using namespace trans;
+using llvm::StringRef;
+
+//===----------------------------------------------------------------------===//
+// Helpers.
+//===----------------------------------------------------------------------===//
+
+/// \brief True if the class is one that does not support weak.
+static bool isClassInWeakBlacklist(ObjCInterfaceDecl *cls) {
+ if (!cls)
+ return false;
+
+ bool inList = llvm::StringSwitch<bool>(cls->getName())
+ .Case("NSColorSpace", true)
+ .Case("NSFont", true)
+ .Case("NSFontPanel", true)
+ .Case("NSImage", true)
+ .Case("NSLazyBrowserCell", true)
+ .Case("NSWindow", true)
+ .Case("NSWindowController", true)
+ .Case("NSMenuView", true)
+ .Case("NSPersistentUIWindowInfo", true)
+ .Case("NSTableCellView", true)
+ .Case("NSATSTypeSetter", true)
+ .Case("NSATSGlyphStorage", true)
+ .Case("NSLineFragmentRenderingContext", true)
+ .Case("NSAttributeDictionary", true)
+ .Case("NSParagraphStyle", true)
+ .Case("NSTextTab", true)
+ .Case("NSSimpleHorizontalTypesetter", true)
+ .Case("_NSCachedAttributedString", true)
+ .Case("NSStringDrawingTextStorage", true)
+ .Case("NSTextView", true)
+ .Case("NSSubTextStorage", true)
+ .Default(false);
+
+ if (inList)
+ return true;
+
+ return isClassInWeakBlacklist(cls->getSuperClass());
+}
+
+bool trans::canApplyWeak(ASTContext &Ctx, QualType type) {
+ if (!Ctx.getLangOptions().ObjCRuntimeHasWeak)
+ return false;
+
+ QualType T = type;
+ while (const PointerType *ptr = T->getAs<PointerType>())
+ T = ptr->getPointeeType();
+ if (const ObjCObjectPointerType *ObjT = T->getAs<ObjCObjectPointerType>()) {
+ ObjCInterfaceDecl *Class = ObjT->getInterfaceDecl();
+ if (!Class || Class->getName() == "NSObject")
+ return false; // id/NSObject is not safe for weak.
+ if (Class->isForwardDecl())
+ return false; // forward classes are not verifiable, therefore not safe.
+ if (Class->isArcWeakrefUnavailable())
+ return false;
+ if (isClassInWeakBlacklist(Class))
+ return false;
+ }
+
+ return true;
+}
+
+/// \brief 'Loc' is the end of a statement range. This returns the location
+/// immediately after the semicolon following the statement.
+/// If no semicolon is found or the location is inside a macro, the returned
+/// source location will be invalid.
+SourceLocation trans::findLocationAfterSemi(SourceLocation loc,
+ ASTContext &Ctx) {
+ SourceManager &SM = Ctx.getSourceManager();
+ if (loc.isMacroID()) {
+ if (!Lexer::isAtEndOfMacroExpansion(loc, SM, Ctx.getLangOptions()))
+ return SourceLocation();
+ loc = SM.getInstantiationRange(loc).second;
+ }
+ loc = Lexer::getLocForEndOfToken(loc, /*Offset=*/0, SM, Ctx.getLangOptions());
+
+ // Break down the source location.
+ std::pair<FileID, unsigned> locInfo = SM.getDecomposedLoc(loc);
+
+ // Try to load the file buffer.
+ bool invalidTemp = false;
+ llvm::StringRef file = SM.getBufferData(locInfo.first, &invalidTemp);
+ if (invalidTemp)
+ return SourceLocation();
+
+ const char *tokenBegin = file.data() + locInfo.second;
+
+ // Lex from the start of the given location.
+ Lexer lexer(SM.getLocForStartOfFile(locInfo.first),
+ Ctx.getLangOptions(),
+ file.begin(), tokenBegin, file.end());
+ Token tok;
+ lexer.LexFromRawLexer(tok);
+ if (tok.isNot(tok::semi))
+ return SourceLocation();
+
+ return tok.getLocation().getFileLocWithOffset(1);
+}
+
+bool trans::hasSideEffects(Expr *E, ASTContext &Ctx) {
+ if (!E || !E->HasSideEffects(Ctx))
+ return false;
+
+ E = E->IgnoreParenCasts();
+ ObjCMessageExpr *ME = dyn_cast<ObjCMessageExpr>(E);
+ if (!ME)
+ return true;
+ switch (ME->getMethodFamily()) {
+ case OMF_autorelease:
+ case OMF_dealloc:
+ case OMF_release:
+ case OMF_retain:
+ switch (ME->getReceiverKind()) {
+ case ObjCMessageExpr::SuperInstance:
+ return false;
+ case ObjCMessageExpr::Instance:
+ return hasSideEffects(ME->getInstanceReceiver(), Ctx);
+ default:
+ break;
+ }
+ break;
+ default:
+ break;
+ }
+
+ return true;
+}
+
+bool trans::isGlobalVar(Expr *E) {
+ E = E->IgnoreParenCasts();
+ if (DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(E))
+ return DRE->getDecl()->getDeclContext()->isFileContext();
+ if (ConditionalOperator *condOp = dyn_cast<ConditionalOperator>(E))
+ return isGlobalVar(condOp->getTrueExpr()) &&
+ isGlobalVar(condOp->getFalseExpr());
+
+ return false;
+}
+
+namespace {
+
+class ReferenceClear : public RecursiveASTVisitor<ReferenceClear> {
+ ExprSet &Refs;
+public:
+ ReferenceClear(ExprSet &refs) : Refs(refs) { }
+ bool VisitDeclRefExpr(DeclRefExpr *E) { Refs.erase(E); return true; }
+ bool VisitBlockDeclRefExpr(BlockDeclRefExpr *E) { Refs.erase(E); return true; }
+};
+
+class ReferenceCollector : public RecursiveASTVisitor<ReferenceCollector> {
+ ValueDecl *Dcl;
+ ExprSet &Refs;
+
+public:
+ ReferenceCollector(ValueDecl *D, ExprSet &refs)
+ : Dcl(D), Refs(refs) { }
+
+ bool VisitDeclRefExpr(DeclRefExpr *E) {
+ if (E->getDecl() == Dcl)
+ Refs.insert(E);
+ return true;
+ }
+
+ bool VisitBlockDeclRefExpr(BlockDeclRefExpr *E) {
+ if (E->getDecl() == Dcl)
+ Refs.insert(E);
+ return true;
+ }
+};
+
+class RemovablesCollector : public RecursiveASTVisitor<RemovablesCollector> {
+ ExprSet &Removables;
+
+public:
+ RemovablesCollector(ExprSet &removables)
+ : Removables(removables) { }
+
+ bool shouldWalkTypesOfTypeLocs() const { return false; }
+
+ bool TraverseStmtExpr(StmtExpr *E) {
+ CompoundStmt *S = E->getSubStmt();
+ for (CompoundStmt::body_iterator
+ I = S->body_begin(), E = S->body_end(); I != E; ++I) {
+ if (I != E - 1)
+ mark(*I);
+ TraverseStmt(*I);
+ }
+ return true;
+ }
+
+ bool VisitCompoundStmt(CompoundStmt *S) {
+ for (CompoundStmt::body_iterator
+ I = S->body_begin(), E = S->body_end(); I != E; ++I)
+ mark(*I);
+ return true;
+ }
+
+ bool VisitIfStmt(IfStmt *S) {
+ mark(S->getThen());
+ mark(S->getElse());
+ return true;
+ }
+
+ bool VisitWhileStmt(WhileStmt *S) {
+ mark(S->getBody());
+ return true;
+ }
+
+ bool VisitDoStmt(DoStmt *S) {
+ mark(S->getBody());
+ return true;
+ }
+
+ bool VisitForStmt(ForStmt *S) {
+ mark(S->getInit());
+ mark(S->getInc());
+ mark(S->getBody());
+ return true;
+ }
+
+private:
+ void mark(Stmt *S) {
+ if (!S) return;
+
+ while (LabelStmt *Label = dyn_cast<LabelStmt>(S))
+ S = Label->getSubStmt();
+ S = S->IgnoreImplicit();
+ if (Expr *E = dyn_cast<Expr>(S))
+ Removables.insert(E);
+ }
+};
+
+} // end anonymous namespace
+
+void trans::clearRefsIn(Stmt *S, ExprSet &refs) {
+ ReferenceClear(refs).TraverseStmt(S);
+}
+
+void trans::collectRefs(ValueDecl *D, Stmt *S, ExprSet &refs) {
+ ReferenceCollector(D, refs).TraverseStmt(S);
+}
+
+void trans::collectRemovables(Stmt *S, ExprSet &exprs) {
+ RemovablesCollector(exprs).TraverseStmt(S);
+}
+
+//===----------------------------------------------------------------------===//
+// getAllTransformations.
+//===----------------------------------------------------------------------===//
+
+static void independentTransforms(MigrationPass &pass) {
+ rewriteAutoreleasePool(pass);
+ rewriteProperties(pass);
+ removeRetainReleaseDealloc(pass);
+ rewriteUnusedInitDelegate(pass);
+ removeZeroOutPropsInDealloc(pass);
+ makeAssignARCSafe(pass);
+ rewriteUnbridgedCasts(pass);
+ rewriteBlockObjCVariable(pass);
+}
+
+std::vector<TransformFn> arcmt::getAllTransformations() {
+ std::vector<TransformFn> transforms;
+
+ transforms.push_back(independentTransforms);
+ // This depends on previous transformations removing various expressions.
+ transforms.push_back(removeEmptyStatementsAndDealloc);
+
+ return transforms;
+}
diff --git a/contrib/llvm/tools/clang/lib/ARCMigrate/Transforms.h b/contrib/llvm/tools/clang/lib/ARCMigrate/Transforms.h
new file mode 100644
index 0000000..b47d6d8
--- /dev/null
+++ b/contrib/llvm/tools/clang/lib/ARCMigrate/Transforms.h
@@ -0,0 +1,92 @@
+//===-- Transforms.h - Tranformations to ARC mode ---------------*- C++ -*-===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+#ifndef LLVM_CLANG_LIB_ARCMIGRATE_TRANSFORMS_H
+#define LLVM_CLANG_LIB_ARCMIGRATE_TRANSFORMS_H
+
+#include "clang/AST/RecursiveASTVisitor.h"
+#include "llvm/ADT/DenseSet.h"
+
+namespace clang {
+ class Decl;
+ class Stmt;
+ class BlockDecl;
+ class ObjCMethodDecl;
+ class FunctionDecl;
+
+namespace arcmt {
+ class MigrationPass;
+
+namespace trans {
+
+//===----------------------------------------------------------------------===//
+// Transformations.
+//===----------------------------------------------------------------------===//
+
+void rewriteAutoreleasePool(MigrationPass &pass);
+void rewriteUnbridgedCasts(MigrationPass &pass);
+void makeAssignARCSafe(MigrationPass &pass);
+void removeRetainReleaseDealloc(MigrationPass &pass);
+void removeZeroOutPropsInDealloc(MigrationPass &pass);
+void rewriteProperties(MigrationPass &pass);
+void rewriteBlockObjCVariable(MigrationPass &pass);
+void rewriteUnusedInitDelegate(MigrationPass &pass);
+
+void removeEmptyStatementsAndDealloc(MigrationPass &pass);
+
+//===----------------------------------------------------------------------===//
+// Helpers.
+//===----------------------------------------------------------------------===//
+
+/// \brief Determine whether we can add weak to the given type.
+bool canApplyWeak(ASTContext &Ctx, QualType type);
+
+/// \brief 'Loc' is the end of a statement range. This returns the location
+/// immediately after the semicolon following the statement.
+/// If no semicolon is found or the location is inside a macro, the returned
+/// source location will be invalid.
+SourceLocation findLocationAfterSemi(SourceLocation loc, ASTContext &Ctx);
+
+bool hasSideEffects(Expr *E, ASTContext &Ctx);
+bool isGlobalVar(Expr *E);
+
+
+template <typename BODY_TRANS>
+class BodyTransform : public RecursiveASTVisitor<BodyTransform<BODY_TRANS> > {
+ MigrationPass &Pass;
+
+public:
+ BodyTransform(MigrationPass &pass) : Pass(pass) { }
+
+ bool TraverseStmt(Stmt *rootS) {
+ BODY_TRANS(Pass).transformBody(rootS);
+ return true;
+ }
+};
+
+typedef llvm::DenseSet<Expr *> ExprSet;
+
+void clearRefsIn(Stmt *S, ExprSet &refs);
+template <typename iterator>
+void clearRefsIn(iterator begin, iterator end, ExprSet &refs) {
+ for (; begin != end; ++begin)
+ clearRefsIn(*begin, refs);
+}
+
+void collectRefs(ValueDecl *D, Stmt *S, ExprSet &refs);
+
+void collectRemovables(Stmt *S, ExprSet &exprs);
+
+} // end namespace trans
+
+} // end namespace arcmt
+
+} // end namespace clang
+
+#endif
diff --git a/contrib/llvm/tools/clang/lib/AST/ASTContext.cpp b/contrib/llvm/tools/clang/lib/AST/ASTContext.cpp
index 9094aba..6eada6e 100644
--- a/contrib/llvm/tools/clang/lib/AST/ASTContext.cpp
+++ b/contrib/llvm/tools/clang/lib/AST/ASTContext.cpp
@@ -219,11 +219,12 @@ ASTContext::ASTContext(const LangOptions& LOpts, SourceManager &SM,
FunctionProtoTypes(this_()),
TemplateSpecializationTypes(this_()),
DependentTemplateSpecializationTypes(this_()),
+ SubstTemplateTemplateParmPacks(this_()),
GlobalNestedNameSpecifier(0), IsInt128Installed(false),
CFConstantStringTypeDecl(0), NSConstantStringTypeDecl(0),
- ObjCFastEnumerationStateTypeDecl(0), FILEDecl(0), jmp_bufDecl(0),
- sigjmp_bufDecl(0), BlockDescriptorType(0), BlockDescriptorExtendedType(0),
- cudaConfigureCallDecl(0),
+ ObjCFastEnumerationStateTypeDecl(0), FILEDecl(0),
+ jmp_bufDecl(0), sigjmp_bufDecl(0), BlockDescriptorType(0),
+ BlockDescriptorExtendedType(0), cudaConfigureCallDecl(0),
NullTypeSourceInfo(QualType()),
SourceMgr(SM), LangOpts(LOpts), ABI(createCXXABI(t)),
AddrSpaceMap(getAddressSpaceMap(t, LOpts)), Target(t),
@@ -288,8 +289,8 @@ ASTContext::setExternalSource(llvm::OwningPtr<ExternalASTSource> &Source) {
}
void ASTContext::PrintStats() const {
- fprintf(stderr, "*** AST Context Stats:\n");
- fprintf(stderr, " %d types total.\n", (int)Types.size());
+ llvm::errs() << "\n*** AST Context Stats:\n";
+ llvm::errs() << " " << Types.size() << " types total.\n";
unsigned counts[] = {
#define TYPE(Name, Parent) 0,
@@ -307,40 +308,42 @@ void ASTContext::PrintStats() const {
unsigned TotalBytes = 0;
#define TYPE(Name, Parent) \
if (counts[Idx]) \
- fprintf(stderr, " %d %s types\n", (int)counts[Idx], #Name); \
+ llvm::errs() << " " << counts[Idx] << " " << #Name \
+ << " types\n"; \
TotalBytes += counts[Idx] * sizeof(Name##Type); \
++Idx;
#define ABSTRACT_TYPE(Name, Parent)
#include "clang/AST/TypeNodes.def"
- fprintf(stderr, "Total bytes = %d\n", int(TotalBytes));
-
+ llvm::errs() << "Total bytes = " << TotalBytes << "\n";
+
// Implicit special member functions.
- fprintf(stderr, " %u/%u implicit default constructors created\n",
- NumImplicitDefaultConstructorsDeclared,
- NumImplicitDefaultConstructors);
- fprintf(stderr, " %u/%u implicit copy constructors created\n",
- NumImplicitCopyConstructorsDeclared,
- NumImplicitCopyConstructors);
+ llvm::errs() << NumImplicitDefaultConstructorsDeclared << "/"
+ << NumImplicitDefaultConstructors
+ << " implicit default constructors created\n";
+ llvm::errs() << NumImplicitCopyConstructorsDeclared << "/"
+ << NumImplicitCopyConstructors
+ << " implicit copy constructors created\n";
if (getLangOptions().CPlusPlus)
- fprintf(stderr, " %u/%u implicit move constructors created\n",
- NumImplicitMoveConstructorsDeclared,
- NumImplicitMoveConstructors);
- fprintf(stderr, " %u/%u implicit copy assignment operators created\n",
- NumImplicitCopyAssignmentOperatorsDeclared,
- NumImplicitCopyAssignmentOperators);
+ llvm::errs() << NumImplicitMoveConstructorsDeclared << "/"
+ << NumImplicitMoveConstructors
+ << " implicit move constructors created\n";
+ llvm::errs() << NumImplicitCopyAssignmentOperatorsDeclared << "/"
+ << NumImplicitCopyAssignmentOperators
+ << " implicit copy assignment operators created\n";
if (getLangOptions().CPlusPlus)
- fprintf(stderr, " %u/%u implicit move assignment operators created\n",
- NumImplicitMoveAssignmentOperatorsDeclared,
- NumImplicitMoveAssignmentOperators);
- fprintf(stderr, " %u/%u implicit destructors created\n",
- NumImplicitDestructorsDeclared, NumImplicitDestructors);
-
+ llvm::errs() << NumImplicitMoveAssignmentOperatorsDeclared << "/"
+ << NumImplicitMoveAssignmentOperators
+ << " implicit move assignment operators created\n";
+ llvm::errs() << NumImplicitDestructorsDeclared << "/"
+ << NumImplicitDestructors
+ << " implicit destructors created\n";
+
if (ExternalSource.get()) {
- fprintf(stderr, "\n");
+ llvm::errs() << "\n";
ExternalSource->PrintStats();
}
-
+
BumpAlloc.PrintStats();
}
@@ -753,7 +756,7 @@ ASTContext::getTypeInfo(const Type *T) const {
#define NON_CANONICAL_TYPE(Class, Base)
#define DEPENDENT_TYPE(Class, Base) case Type::Class:
#include "clang/AST/TypeNodes.def"
- assert(false && "Should not see dependent types");
+ llvm_unreachable("Should not see dependent types");
break;
case Type::FunctionNoProto:
@@ -1089,8 +1092,12 @@ void ASTContext::DeepCollectObjCIvars(const ObjCInterfaceDecl *OI,
E = OI->ivar_end(); I != E; ++I)
Ivars.push_back(*I);
}
- else
- ShallowCollectObjCIvars(OI, Ivars);
+ else {
+ ObjCInterfaceDecl *IDecl = const_cast<ObjCInterfaceDecl *>(OI);
+ for (ObjCIvarDecl *Iv = IDecl->all_declared_ivar_begin(); Iv;
+ Iv= Iv->getNextIvar())
+ Ivars.push_back(Iv);
+ }
}
/// CollectInheritedProtocols - Collect all protocols in current class and
@@ -1881,7 +1888,7 @@ QualType ASTContext::getVectorType(QualType vecType, unsigned NumElts,
/// the specified element type and size. VectorType must be a built-in type.
QualType
ASTContext::getExtVectorType(QualType vecType, unsigned NumElts) const {
- assert(vecType->isBuiltinType());
+ assert(vecType->isBuiltinType() || vecType->isDependentType());
// Check if we've already instantiated a vector of this type.
llvm::FoldingSetNodeID ID;
@@ -2040,10 +2047,13 @@ ASTContext::getFunctionType(QualType ResultTy,
assert(NewIP == 0 && "Shouldn't be in the map!"); (void)NewIP;
}
- // FunctionProtoType objects are allocated with extra bytes after them
- // for two variable size arrays (for parameter and exception types) at the
- // end of them. Instead of the exception types, there could be a noexcept
- // expression and a context pointer.
+ // FunctionProtoType objects are allocated with extra bytes after
+ // them for three variable size arrays at the end:
+ // - parameter types
+ // - exception types
+ // - consumed-arguments flags
+ // Instead of the exception types, there could be a noexcept
+ // expression.
size_t Size = sizeof(FunctionProtoType) +
NumArgs * sizeof(QualType);
if (EPI.ExceptionSpecType == EST_Dynamic)
@@ -2051,6 +2061,9 @@ ASTContext::getFunctionType(QualType ResultTy,
else if (EPI.ExceptionSpecType == EST_ComputedNoexcept) {
Size += sizeof(Expr*);
}
+ if (EPI.ConsumedArguments)
+ Size += NumArgs * sizeof(bool);
+
FunctionProtoType *FTP = (FunctionProtoType*) Allocate(Size, TypeAlignment);
FunctionProtoType::ExtProtoInfo newEPI = EPI;
newEPI.ExtInfo = EPI.ExtInfo.withCallingConv(CallConv);
@@ -2791,7 +2804,12 @@ static QualType getDecltypeForExpr(const Expr *e, const ASTContext &Context) {
/// on canonical type's (which are always unique).
QualType ASTContext::getDecltypeType(Expr *e) const {
DecltypeType *dt;
- if (e->isTypeDependent()) {
+
+ // C++0x [temp.type]p2:
+ // If an expression e involves a template parameter, decltype(e) denotes a
+ // unique dependent type. Two such decltype-specifiers refer to the same
+ // type only if their expressions are equivalent (14.5.6.1).
+ if (e->isInstantiationDependent()) {
llvm::FoldingSetNodeID ID;
DependentDecltypeType::Profile(ID, *this, e);
@@ -2925,7 +2943,6 @@ CanQualType ASTContext::getCanonicalParamType(QualType T) const {
return CanQualType::CreateUnsafe(Result);
}
-
QualType ASTContext::getUnqualifiedArrayType(QualType type,
Qualifiers &quals) {
SplitQualType splitType = type.getSplitUnqualifiedType();
@@ -3027,11 +3044,21 @@ bool ASTContext::UnwrapSimilarPointerTypes(QualType &T1, QualType &T2) {
DeclarationNameInfo
ASTContext::getNameForTemplate(TemplateName Name,
SourceLocation NameLoc) const {
- if (TemplateDecl *TD = Name.getAsTemplateDecl())
+ switch (Name.getKind()) {
+ case TemplateName::QualifiedTemplate:
+ case TemplateName::Template:
// DNInfo work in progress: CHECKME: what about DNLoc?
- return DeclarationNameInfo(TD->getDeclName(), NameLoc);
+ return DeclarationNameInfo(Name.getAsTemplateDecl()->getDeclName(),
+ NameLoc);
- if (DependentTemplateName *DTN = Name.getAsDependentTemplateName()) {
+ case TemplateName::OverloadedTemplate: {
+ OverloadedTemplateStorage *Storage = Name.getAsOverloadedTemplate();
+ // DNInfo work in progress: CHECKME: what about DNLoc?
+ return DeclarationNameInfo((*Storage->begin())->getDeclName(), NameLoc);
+ }
+
+ case TemplateName::DependentTemplate: {
+ DependentTemplateName *DTN = Name.getAsDependentTemplateName();
DeclarationName DName;
if (DTN->isIdentifier()) {
DName = DeclarationNames.getIdentifier(DTN->getIdentifier());
@@ -3046,36 +3073,64 @@ ASTContext::getNameForTemplate(TemplateName Name,
}
}
- OverloadedTemplateStorage *Storage = Name.getAsOverloadedTemplate();
- assert(Storage);
- // DNInfo work in progress: CHECKME: what about DNLoc?
- return DeclarationNameInfo((*Storage->begin())->getDeclName(), NameLoc);
+ case TemplateName::SubstTemplateTemplateParm: {
+ SubstTemplateTemplateParmStorage *subst
+ = Name.getAsSubstTemplateTemplateParm();
+ return DeclarationNameInfo(subst->getParameter()->getDeclName(),
+ NameLoc);
+ }
+
+ case TemplateName::SubstTemplateTemplateParmPack: {
+ SubstTemplateTemplateParmPackStorage *subst
+ = Name.getAsSubstTemplateTemplateParmPack();
+ return DeclarationNameInfo(subst->getParameterPack()->getDeclName(),
+ NameLoc);
+ }
+ }
+
+ llvm_unreachable("bad template name kind!");
}
TemplateName ASTContext::getCanonicalTemplateName(TemplateName Name) const {
- if (TemplateDecl *Template = Name.getAsTemplateDecl()) {
+ switch (Name.getKind()) {
+ case TemplateName::QualifiedTemplate:
+ case TemplateName::Template: {
+ TemplateDecl *Template = Name.getAsTemplateDecl();
if (TemplateTemplateParmDecl *TTP
- = dyn_cast<TemplateTemplateParmDecl>(Template))
+ = dyn_cast<TemplateTemplateParmDecl>(Template))
Template = getCanonicalTemplateTemplateParmDecl(TTP);
// The canonical template name is the canonical template declaration.
return TemplateName(cast<TemplateDecl>(Template->getCanonicalDecl()));
}
- if (SubstTemplateTemplateParmPackStorage *SubstPack
- = Name.getAsSubstTemplateTemplateParmPack()) {
- TemplateTemplateParmDecl *CanonParam
- = getCanonicalTemplateTemplateParmDecl(SubstPack->getParameterPack());
- TemplateArgument CanonArgPack
- = getCanonicalTemplateArgument(SubstPack->getArgumentPack());
- return getSubstTemplateTemplateParmPack(CanonParam, CanonArgPack);
+ case TemplateName::OverloadedTemplate:
+ llvm_unreachable("cannot canonicalize overloaded template");
+
+ case TemplateName::DependentTemplate: {
+ DependentTemplateName *DTN = Name.getAsDependentTemplateName();
+ assert(DTN && "Non-dependent template names must refer to template decls.");
+ return DTN->CanonicalTemplateName;
+ }
+
+ case TemplateName::SubstTemplateTemplateParm: {
+ SubstTemplateTemplateParmStorage *subst
+ = Name.getAsSubstTemplateTemplateParm();
+ return getCanonicalTemplateName(subst->getReplacement());
}
-
- assert(!Name.getAsOverloadedTemplate());
- DependentTemplateName *DTN = Name.getAsDependentTemplateName();
- assert(DTN && "Non-dependent template names must refer to template decls.");
- return DTN->CanonicalTemplateName;
+ case TemplateName::SubstTemplateTemplateParmPack: {
+ SubstTemplateTemplateParmPackStorage *subst
+ = Name.getAsSubstTemplateTemplateParmPack();
+ TemplateTemplateParmDecl *canonParameter
+ = getCanonicalTemplateTemplateParmDecl(subst->getParameterPack());
+ TemplateArgument canonArgPack
+ = getCanonicalTemplateArgument(subst->getArgumentPack());
+ return getSubstTemplateTemplateParmPack(canonParameter, canonArgPack);
+ }
+ }
+
+ llvm_unreachable("bad template name!");
}
bool ASTContext::hasSameTemplateName(TemplateName X, TemplateName Y) {
@@ -3260,6 +3315,31 @@ const ArrayType *ASTContext::getAsArrayType(QualType T) const {
VAT->getBracketsRange()));
}
+QualType ASTContext::getAdjustedParameterType(QualType T) {
+ // C99 6.7.5.3p7:
+ // A declaration of a parameter as "array of type" shall be
+ // adjusted to "qualified pointer to type", where the type
+ // qualifiers (if any) are those specified within the [ and ] of
+ // the array type derivation.
+ if (T->isArrayType())
+ return getArrayDecayedType(T);
+
+ // C99 6.7.5.3p8:
+ // A declaration of a parameter as "function returning type"
+ // shall be adjusted to "pointer to function returning type", as
+ // in 6.3.2.1.
+ if (T->isFunctionType())
+ return getPointerType(T);
+
+ return T;
+}
+
+QualType ASTContext::getSignatureParameterType(QualType T) {
+ T = getVariableArrayDecayedType(T);
+ T = getAdjustedParameterType(T);
+ return T.getUnqualifiedType();
+}
+
/// getArrayDecayedType - Return the properly qualified result of decaying the
/// specified array type to a pointer. This operation is non-trivial when
/// handling typedefs etc. The canonical type of "T" must be an array type,
@@ -3459,6 +3539,25 @@ QualType ASTContext::getPromotedIntegerType(QualType Promotable) const {
return (PromotableSize != IntSize) ? IntTy : UnsignedIntTy;
}
+/// \brief Recurses in pointer/array types until it finds an objc retainable
+/// type and returns its ownership.
+Qualifiers::ObjCLifetime ASTContext::getInnerObjCOwnership(QualType T) const {
+ while (!T.isNull()) {
+ if (T.getObjCLifetime() != Qualifiers::OCL_None)
+ return T.getObjCLifetime();
+ if (T->isArrayType())
+ T = getBaseElementType(T);
+ else if (const PointerType *PT = T->getAs<PointerType>())
+ T = PT->getPointeeType();
+ else if (const ReferenceType *RT = T->getAs<ReferenceType>())
+ T = RT->getPointeeType();
+ else
+ break;
+ }
+
+ return Qualifiers::OCL_None;
+}
+
/// getIntegerTypeOrder - Returns the highest ranked integer type:
/// C99 6.3.1.8p1. If LHS > RHS, return 1. If LHS == RHS, return 0. If
/// LHS < RHS, return -1.
@@ -3725,11 +3824,7 @@ void ASTContext::setBlockDescriptorExtendedType(QualType T) {
}
bool ASTContext::BlockRequiresCopying(QualType Ty) const {
- if (Ty->isBlockPointerType())
- return true;
- if (isObjCNSObjectType(Ty))
- return true;
- if (Ty->isObjCObjectPointerType())
+ if (Ty->isObjCRetainableType())
return true;
if (getLangOptions().CPlusPlus) {
if (const RecordType *RT = Ty->getAs<RecordType>()) {
@@ -4180,17 +4275,7 @@ static void EncodeBitField(const ASTContext *Ctx, std::string& S,
if (!Ctx->getLangOptions().NeXTRuntime) {
const RecordDecl *RD = FD->getParent();
const ASTRecordLayout &RL = Ctx->getASTRecordLayout(RD);
- // FIXME: This same linear search is also used in ExprConstant - it might
- // be better if the FieldDecl stored its offset. We'd be increasing the
- // size of the object slightly, but saving some time every time it is used.
- unsigned i = 0;
- for (RecordDecl::field_iterator Field = RD->field_begin(),
- FieldEnd = RD->field_end();
- Field != FieldEnd; (void)++Field, ++i) {
- if (*Field == FD)
- break;
- }
- S += llvm::utostr(RL.getFieldOffset(i));
+ S += llvm::utostr(RL.getFieldOffset(FD->getFieldIndex()));
if (T->isEnumeralType())
S += 'i';
else
@@ -4510,6 +4595,8 @@ void ASTContext::getObjCEncodingForStructureImpl(RecordDecl *RDecl,
BE = CXXRec->bases_end(); BI != BE; ++BI) {
if (!BI->isVirtual()) {
CXXRecordDecl *base = BI->getType()->getAsCXXRecordDecl();
+ if (base->isEmpty())
+ continue;
uint64_t offs = layout.getBaseClassOffsetInBits(base);
FieldOrBaseOffsets.insert(FieldOrBaseOffsets.upper_bound(offs),
std::make_pair(offs, base));
@@ -4531,6 +4618,8 @@ void ASTContext::getObjCEncodingForStructureImpl(RecordDecl *RDecl,
BI = CXXRec->vbases_begin(),
BE = CXXRec->vbases_end(); BI != BE; ++BI) {
CXXRecordDecl *base = BI->getType()->getAsCXXRecordDecl();
+ if (base->isEmpty())
+ continue;
uint64_t offs = layout.getVBaseClassOffsetInBits(base);
FieldOrBaseOffsets.insert(FieldOrBaseOffsets.upper_bound(offs),
std::make_pair(offs, base));
@@ -4594,8 +4683,8 @@ void ASTContext::getObjCEncodingForStructureImpl(RecordDecl *RDecl,
// expands virtual bases each time one is encountered in the hierarchy,
// making the encoding type bigger than it really is.
getObjCEncodingForStructureImpl(base, S, FD, /*includeVBases*/false);
- if (!base->isEmpty())
- CurOffs += toBits(getASTRecordLayout(base).getNonVirtualSize());
+ assert(!base->isEmpty());
+ CurOffs += toBits(getASTRecordLayout(base).getNonVirtualSize());
} else {
FieldDecl *field = cast<FieldDecl>(dcl);
if (FD) {
@@ -4782,6 +4871,24 @@ ASTContext::getDependentTemplateName(NestedNameSpecifier *NNS,
}
TemplateName
+ASTContext::getSubstTemplateTemplateParm(TemplateTemplateParmDecl *param,
+ TemplateName replacement) const {
+ llvm::FoldingSetNodeID ID;
+ SubstTemplateTemplateParmStorage::Profile(ID, param, replacement);
+
+ void *insertPos = 0;
+ SubstTemplateTemplateParmStorage *subst
+ = SubstTemplateTemplateParms.FindNodeOrInsertPos(ID, insertPos);
+
+ if (!subst) {
+ subst = new (*this) SubstTemplateTemplateParmStorage(param, replacement);
+ SubstTemplateTemplateParms.InsertNode(subst, insertPos);
+ }
+
+ return TemplateName(subst);
+}
+
+TemplateName
ASTContext::getSubstTemplateTemplateParmPack(TemplateTemplateParmDecl *Param,
const TemplateArgument &ArgPack) const {
ASTContext &Self = const_cast<ASTContext &>(*this);
@@ -4793,7 +4900,7 @@ ASTContext::getSubstTemplateTemplateParmPack(TemplateTemplateParmDecl *Param,
= SubstTemplateTemplateParmPacks.FindNodeOrInsertPos(ID, InsertPos);
if (!Subst) {
- Subst = new (*this) SubstTemplateTemplateParmPackStorage(Self, Param,
+ Subst = new (*this) SubstTemplateTemplateParmPackStorage(Param,
ArgPack.pack_size(),
ArgPack.pack_begin());
SubstTemplateTemplateParmPacks.InsertNode(Subst, InsertPos);
@@ -4826,20 +4933,6 @@ CanQualType ASTContext::getFromTargetType(unsigned Type) const {
// Type Predicates.
//===----------------------------------------------------------------------===//
-/// isObjCNSObjectType - Return true if this is an NSObject object using
-/// NSObject attribute on a c-style pointer type.
-/// FIXME - Make it work directly on types.
-/// FIXME: Move to Type.
-///
-bool ASTContext::isObjCNSObjectType(QualType Ty) const {
- if (const TypedefType *TDT = dyn_cast<TypedefType>(Ty)) {
- if (TypedefNameDecl *TD = TDT->getDecl())
- if (TD->getAttr<ObjCNSObjectAttr>())
- return true;
- }
- return false;
-}
-
/// getObjCGCAttr - Returns one of GCNone, Weak or Strong objc's
/// garbage collection attribute.
///
@@ -5348,6 +5441,10 @@ bool ASTContext::typesAreCompatible(QualType LHS, QualType RHS,
return !mergeTypes(LHS, RHS, false, CompareUnqualified).isNull();
}
+bool ASTContext::propertyTypesAreCompatible(QualType LHS, QualType RHS) {
+ return typesAreCompatible(LHS, RHS);
+}
+
bool ASTContext::typesAreBlockPointerCompatible(QualType LHS, QualType RHS) {
return !mergeTypes(LHS, RHS, true).isNull();
}
@@ -5452,6 +5549,9 @@ QualType ASTContext::mergeFunctionTypes(QualType lhs, QualType rhs,
if (lbaseInfo.getRegParm() != rbaseInfo.getRegParm())
return QualType();
+ if (lbaseInfo.getProducesResult() != rbaseInfo.getProducesResult())
+ return QualType();
+
// It's noreturn if either type is.
// FIXME: some uses, e.g. conditional exprs, really want this to be 'both'.
bool NoReturn = lbaseInfo.getNoReturn() || rbaseInfo.getNoReturn();
@@ -5460,10 +5560,7 @@ QualType ASTContext::mergeFunctionTypes(QualType lhs, QualType rhs,
if (NoReturn != rbaseInfo.getNoReturn())
allRTypes = false;
- FunctionType::ExtInfo einfo(NoReturn,
- lbaseInfo.getHasRegParm(),
- lbaseInfo.getRegParm(),
- lbaseInfo.getCC());
+ FunctionType::ExtInfo einfo = lbaseInfo.withNoReturn(NoReturn);
if (lproto && rproto) { // two C99 style function prototypes
assert(!lproto->hasExceptionSpec() && !rproto->hasExceptionSpec() &&
@@ -5584,7 +5681,8 @@ QualType ASTContext::mergeTypes(QualType LHS, QualType RHS,
// If any of these qualifiers are different, we have a type
// mismatch.
if (LQuals.getCVRQualifiers() != RQuals.getCVRQualifiers() ||
- LQuals.getAddressSpace() != RQuals.getAddressSpace())
+ LQuals.getAddressSpace() != RQuals.getAddressSpace() ||
+ LQuals.getObjCLifetime() != RQuals.getObjCLifetime())
return QualType();
// Exactly one GC qualifier difference is allowed: __strong is
@@ -6401,4 +6499,3 @@ size_t ASTContext::getSideTableAllocatedMemory() const {
bytes += InstantiatedFromUnnamedFieldDecl.getMemorySize();
return bytes;
}
-
diff --git a/contrib/llvm/tools/clang/lib/AST/ASTDiagnostic.cpp b/contrib/llvm/tools/clang/lib/AST/ASTDiagnostic.cpp
index 16d2f85..7c91b5c 100644
--- a/contrib/llvm/tools/clang/lib/AST/ASTDiagnostic.cpp
+++ b/contrib/llvm/tools/clang/lib/AST/ASTDiagnostic.cpp
@@ -129,7 +129,7 @@ break; \
/// \brief Convert the given type to a string suitable for printing as part of
/// a diagnostic.
///
-/// There are three main criteria when determining whether we should have an
+/// There are four main criteria when determining whether we should have an
/// a.k.a. clause when pretty-printing a type:
///
/// 1) Some types provide very minimal sugar that doesn't impede the
@@ -142,15 +142,44 @@ break; \
/// want to desugar these, even if we do produce an a.k.a. clause.
/// 3) Some types may have already been desugared previously in this diagnostic.
/// if this is the case, doing another "aka" would just be clutter.
+/// 4) Two different types within the same diagnostic have the same output
+/// string. In this case, force an a.k.a with the desugared type when
+/// doing so will provide additional information.
///
/// \param Context the context in which the type was allocated
/// \param Ty the type to print
+/// \param QualTypeVals pointer values to QualTypes which are used in the
+/// diagnostic message
static std::string
ConvertTypeToDiagnosticString(ASTContext &Context, QualType Ty,
const Diagnostic::ArgumentValue *PrevArgs,
- unsigned NumPrevArgs) {
+ unsigned NumPrevArgs,
+ llvm::SmallVectorImpl<intptr_t> &QualTypeVals) {
// FIXME: Playing with std::string is really slow.
+ bool ForceAKA = false;
+ QualType CanTy = Ty.getCanonicalType();
std::string S = Ty.getAsString(Context.PrintingPolicy);
+ std::string CanS = CanTy.getAsString(Context.PrintingPolicy);
+
+ for (llvm::SmallVectorImpl<intptr_t>::iterator I = QualTypeVals.begin(),
+ E = QualTypeVals.end(); I != E; ++I) {
+ QualType CompareTy =
+ QualType::getFromOpaquePtr(reinterpret_cast<void*>(*I));
+ if (CompareTy == Ty)
+ continue; // Same types
+ QualType CompareCanTy = CompareTy.getCanonicalType();
+ if (CompareCanTy == CanTy)
+ continue; // Same canonical types
+ std::string CompareS = CompareTy.getAsString(Context.PrintingPolicy);
+ if (CompareS != S)
+ continue; // Original strings are different
+ std::string CompareCanS = CompareCanTy.getAsString(Context.PrintingPolicy);
+ if (CompareCanS == CanS)
+ continue; // No new info from canonical type
+
+ ForceAKA = true;
+ break;
+ }
// Check to see if we already desugared this type in this
// diagnostic. If so, don't do it again.
@@ -172,11 +201,15 @@ ConvertTypeToDiagnosticString(ASTContext &Context, QualType Ty,
if (!Repeated) {
bool ShouldAKA = false;
QualType DesugaredTy = Desugar(Context, Ty, ShouldAKA);
- if (ShouldAKA) {
- S = "'" + S + "' (aka '";
- S += DesugaredTy.getAsString(Context.PrintingPolicy);
- S += "')";
- return S;
+ if (ShouldAKA || ForceAKA) {
+ if (DesugaredTy == Ty) {
+ DesugaredTy = Ty.getCanonicalType();
+ }
+ std::string akaStr = DesugaredTy.getAsString(Context.PrintingPolicy);
+ if (akaStr != S) {
+ S = "'" + S + "' (aka '" + akaStr + "')";
+ return S;
+ }
}
}
@@ -184,16 +217,18 @@ ConvertTypeToDiagnosticString(ASTContext &Context, QualType Ty,
return S;
}
-void clang::FormatASTNodeDiagnosticArgument(Diagnostic::ArgumentKind Kind,
- intptr_t Val,
- const char *Modifier,
- unsigned ModLen,
- const char *Argument,
- unsigned ArgLen,
- const Diagnostic::ArgumentValue *PrevArgs,
- unsigned NumPrevArgs,
- llvm::SmallVectorImpl<char> &Output,
- void *Cookie) {
+void clang::FormatASTNodeDiagnosticArgument(
+ Diagnostic::ArgumentKind Kind,
+ intptr_t Val,
+ const char *Modifier,
+ unsigned ModLen,
+ const char *Argument,
+ unsigned ArgLen,
+ const Diagnostic::ArgumentValue *PrevArgs,
+ unsigned NumPrevArgs,
+ llvm::SmallVectorImpl<char> &Output,
+ void *Cookie,
+ llvm::SmallVectorImpl<intptr_t> &QualTypeVals) {
ASTContext &Context = *static_cast<ASTContext*>(Cookie);
std::string S;
@@ -206,7 +241,8 @@ void clang::FormatASTNodeDiagnosticArgument(Diagnostic::ArgumentKind Kind,
"Invalid modifier for QualType argument");
QualType Ty(QualType::getFromOpaquePtr(reinterpret_cast<void*>(Val)));
- S = ConvertTypeToDiagnosticString(Context, Ty, PrevArgs, NumPrevArgs);
+ S = ConvertTypeToDiagnosticString(Context, Ty, PrevArgs, NumPrevArgs,
+ QualTypeVals);
NeedQuotes = false;
break;
}
@@ -257,7 +293,7 @@ void clang::FormatASTNodeDiagnosticArgument(Diagnostic::ArgumentKind Kind,
} else if (TypeDecl *Type = dyn_cast<TypeDecl>(DC)) {
S = ConvertTypeToDiagnosticString(Context,
Context.getTypeDeclType(Type),
- PrevArgs, NumPrevArgs);
+ PrevArgs, NumPrevArgs, QualTypeVals);
} else {
// FIXME: Get these strings from some localized place
NamedDecl *ND = cast<NamedDecl>(DC);
diff --git a/contrib/llvm/tools/clang/lib/AST/ASTImporter.cpp b/contrib/llvm/tools/clang/lib/AST/ASTImporter.cpp
index 100e604..f5e392f 100644
--- a/contrib/llvm/tools/clang/lib/AST/ASTImporter.cpp
+++ b/contrib/llvm/tools/clang/lib/AST/ASTImporter.cpp
@@ -4201,6 +4201,20 @@ TemplateName ASTImporter::Import(TemplateName From) {
return ToContext.getDependentTemplateName(Qualifier, DTN->getOperator());
}
+
+ case TemplateName::SubstTemplateTemplateParm: {
+ SubstTemplateTemplateParmStorage *subst
+ = From.getAsSubstTemplateTemplateParm();
+ TemplateTemplateParmDecl *param
+ = cast_or_null<TemplateTemplateParmDecl>(Import(subst->getParameter()));
+ if (!param)
+ return TemplateName();
+
+ TemplateName replacement = Import(subst->getReplacement());
+ if (replacement.isNull()) return TemplateName();
+
+ return ToContext.getSubstTemplateTemplateParm(param, replacement);
+ }
case TemplateName::SubstTemplateTemplateParmPack: {
SubstTemplateTemplateParmPackStorage *SubstPack
@@ -4232,8 +4246,8 @@ SourceLocation ASTImporter::Import(SourceLocation FromLoc) {
SourceManager &FromSM = FromContext.getSourceManager();
// For now, map everything down to its spelling location, so that we
- // don't have to import macro instantiations.
- // FIXME: Import macro instantiations!
+ // don't have to import macro expansions.
+ // FIXME: Import macro expansions!
FromLoc = FromSM.getSpellingLoc(FromLoc);
std::pair<FileID, unsigned> Decomposed = FromSM.getDecomposedLoc(FromLoc);
SourceManager &ToSM = ToContext.getSourceManager();
@@ -4254,7 +4268,7 @@ FileID ASTImporter::Import(FileID FromID) {
SourceManager &FromSM = FromContext.getSourceManager();
SourceManager &ToSM = ToContext.getSourceManager();
const SrcMgr::SLocEntry &FromSLoc = FromSM.getSLocEntry(FromID);
- assert(FromSLoc.isFile() && "Cannot handle macro instantiations yet");
+ assert(FromSLoc.isFile() && "Cannot handle macro expansions yet");
// Include location of this file.
SourceLocation ToIncludeLoc = Import(FromSLoc.getFile().getIncludeLoc());
diff --git a/contrib/llvm/tools/clang/lib/AST/Decl.cpp b/contrib/llvm/tools/clang/lib/AST/Decl.cpp
index 12357c0..4c323da 100644
--- a/contrib/llvm/tools/clang/lib/AST/Decl.cpp
+++ b/contrib/llvm/tools/clang/lib/AST/Decl.cpp
@@ -197,6 +197,16 @@ getLVForTemplateArgumentList(const TemplateArgumentList &TArgs,
return getLVForTemplateArgumentList(TArgs.data(), TArgs.size(), F);
}
+static bool shouldConsiderTemplateLV(const FunctionDecl *fn,
+ const FunctionTemplateSpecializationInfo *spec) {
+ return !(spec->isExplicitSpecialization() &&
+ fn->hasAttr<VisibilityAttr>());
+}
+
+static bool shouldConsiderTemplateLV(const ClassTemplateSpecializationDecl *d) {
+ return !(d->isExplicitSpecialization() && d->hasAttr<VisibilityAttr>());
+}
+
static LinkageInfo getLVForNamespaceScopeDecl(const NamedDecl *D, LVFlags F) {
assert(D->getDeclContext()->getRedeclContext()->isFileContext() &&
"Not a name having namespace scope");
@@ -231,6 +241,14 @@ static LinkageInfo getLVForNamespaceScopeDecl(const NamedDecl *D, LVFlags F) {
if (!FoundExtern)
return LinkageInfo::internal();
}
+ if (Var->getStorageClass() == SC_None) {
+ const VarDecl *PrevVar = Var->getPreviousDeclaration();
+ for (; PrevVar; PrevVar = PrevVar->getPreviousDeclaration())
+ if (PrevVar->getStorageClass() == SC_PrivateExtern)
+ break;
+ if (PrevVar)
+ return PrevVar->getLinkageAndVisibility();
+ }
} else if (isa<FunctionDecl>(D) || isa<FunctionTemplateDecl>(D)) {
// C++ [temp]p4:
// A non-member function template can have internal linkage; any
@@ -389,12 +407,16 @@ static LinkageInfo getLVForNamespaceScopeDecl(const NamedDecl *D, LVFlags F) {
Function->getType()->getLinkage() == UniqueExternalLinkage)
return LinkageInfo::uniqueExternal();
- if (FunctionTemplateSpecializationInfo *SpecInfo
+ // Consider LV from the template and the template arguments unless
+ // this is an explicit specialization with a visibility attribute.
+ if (FunctionTemplateSpecializationInfo *specInfo
= Function->getTemplateSpecializationInfo()) {
- LV.merge(getLVForDecl(SpecInfo->getTemplate(),
- F.onlyTemplateVisibility()));
- const TemplateArgumentList &TemplateArgs = *SpecInfo->TemplateArguments;
- LV.merge(getLVForTemplateArgumentList(TemplateArgs, F));
+ if (shouldConsiderTemplateLV(Function, specInfo)) {
+ LV.merge(getLVForDecl(specInfo->getTemplate(),
+ F.onlyTemplateVisibility()));
+ const TemplateArgumentList &templateArgs = *specInfo->TemplateArguments;
+ LV.merge(getLVForTemplateArgumentList(templateArgs, F));
+ }
}
// - a named class (Clause 9), or an unnamed class defined in a
@@ -410,15 +432,17 @@ static LinkageInfo getLVForNamespaceScopeDecl(const NamedDecl *D, LVFlags F) {
// If this is a class template specialization, consider the
// linkage of the template and template arguments.
- if (const ClassTemplateSpecializationDecl *Spec
+ if (const ClassTemplateSpecializationDecl *spec
= dyn_cast<ClassTemplateSpecializationDecl>(Tag)) {
- // From the template.
- LV.merge(getLVForDecl(Spec->getSpecializedTemplate(),
- F.onlyTemplateVisibility()));
-
- // The arguments at which the template was instantiated.
- const TemplateArgumentList &TemplateArgs = Spec->getTemplateArgs();
- LV.merge(getLVForTemplateArgumentList(TemplateArgs, F));
+ if (shouldConsiderTemplateLV(spec)) {
+ // From the template.
+ LV.merge(getLVForDecl(spec->getSpecializedTemplate(),
+ F.onlyTemplateVisibility()));
+
+ // The arguments at which the template was instantiated.
+ const TemplateArgumentList &TemplateArgs = spec->getTemplateArgs();
+ LV.merge(getLVForTemplateArgumentList(TemplateArgs, F));
+ }
}
// Consider -fvisibility unless the type has C linkage.
@@ -519,14 +543,16 @@ static LinkageInfo getLVForClassMember(const NamedDecl *D, LVFlags F) {
// If this is a method template specialization, use the linkage for
// the template parameters and arguments.
- if (FunctionTemplateSpecializationInfo *Spec
+ if (FunctionTemplateSpecializationInfo *spec
= MD->getTemplateSpecializationInfo()) {
- LV.merge(getLVForTemplateArgumentList(*Spec->TemplateArguments, F));
- if (F.ConsiderTemplateParameterTypes)
- LV.merge(getLVForTemplateParameterList(
- Spec->getTemplate()->getTemplateParameters()));
+ if (shouldConsiderTemplateLV(MD, spec)) {
+ LV.merge(getLVForTemplateArgumentList(*spec->TemplateArguments, F));
+ if (F.ConsiderTemplateParameterTypes)
+ LV.merge(getLVForTemplateParameterList(
+ spec->getTemplate()->getTemplateParameters()));
+ }
- TSK = Spec->getTemplateSpecializationKind();
+ TSK = spec->getTemplateSpecializationKind();
} else if (MemberSpecializationInfo *MSI =
MD->getMemberSpecializationInfo()) {
TSK = MSI->getTemplateSpecializationKind();
@@ -553,14 +579,16 @@ static LinkageInfo getLVForClassMember(const NamedDecl *D, LVFlags F) {
// *do* apply -fvisibility to method declarations.
} else if (const CXXRecordDecl *RD = dyn_cast<CXXRecordDecl>(D)) {
- if (const ClassTemplateSpecializationDecl *Spec
+ if (const ClassTemplateSpecializationDecl *spec
= dyn_cast<ClassTemplateSpecializationDecl>(RD)) {
- // Merge template argument/parameter information for member
- // class template specializations.
- LV.merge(getLVForTemplateArgumentList(Spec->getTemplateArgs(), F));
+ if (shouldConsiderTemplateLV(spec)) {
+ // Merge template argument/parameter information for member
+ // class template specializations.
+ LV.merge(getLVForTemplateArgumentList(spec->getTemplateArgs(), F));
if (F.ConsiderTemplateParameterTypes)
LV.merge(getLVForTemplateParameterList(
- Spec->getSpecializedTemplate()->getTemplateParameters()));
+ spec->getSpecializedTemplate()->getTemplateParameters()));
+ }
}
// Static data members.
@@ -1304,6 +1332,19 @@ void VarDecl::setInit(Expr *I) {
Init = I;
}
+bool VarDecl::extendsLifetimeOfTemporary() const {
+ assert(getType()->isReferenceType() &&"Non-references never extend lifetime");
+
+ const Expr *E = getInit();
+ if (!E)
+ return false;
+
+ if (const ExprWithCleanups *Cleanups = dyn_cast<ExprWithCleanups>(E))
+ E = Cleanups->getSubExpr();
+
+ return isa<MaterializeTemporaryExpr>(E);
+}
+
VarDecl *VarDecl::getInstantiatedFromStaticDataMember() const {
if (MemberSpecializationInfo *MSI = getMemberSpecializationInfo())
return cast<VarDecl>(MSI->getInstantiatedFrom());
@@ -2320,8 +2361,15 @@ void RecordDecl::LoadFieldsFromExternalStorage() const {
ExternalASTSource::Deserializing TheFields(Source);
llvm::SmallVector<Decl*, 64> Decls;
- if (Source->FindExternalLexicalDeclsBy<FieldDecl>(this, Decls))
+ LoadedFieldsFromExternalStorage = true;
+ switch (Source->FindExternalLexicalDeclsBy<FieldDecl>(this, Decls)) {
+ case ELR_Success:
+ break;
+
+ case ELR_AlreadyLoaded:
+ case ELR_Failure:
return;
+ }
#ifndef NDEBUG
// Check that all decls we got were FieldDecls.
@@ -2329,8 +2377,6 @@ void RecordDecl::LoadFieldsFromExternalStorage() const {
assert(isa<FieldDecl>(Decls[i]));
#endif
- LoadedFieldsFromExternalStorage = true;
-
if (Decls.empty())
return;
@@ -2376,6 +2422,16 @@ void BlockDecl::setCaptures(ASTContext &Context,
Captures = static_cast<Capture*>(buffer);
}
+bool BlockDecl::capturesVariable(const VarDecl *variable) const {
+ for (capture_const_iterator
+ i = capture_begin(), e = capture_end(); i != e; ++i)
+ // Only auto vars can be captured, so no redeclaration worries.
+ if (i->getVariable() == variable)
+ return true;
+
+ return false;
+}
+
SourceRange BlockDecl::getSourceRange() const {
return SourceRange(getLocation(), Body? Body->getLocEnd() : getLocation());
}
diff --git a/contrib/llvm/tools/clang/lib/AST/DeclBase.cpp b/contrib/llvm/tools/clang/lib/AST/DeclBase.cpp
index 1766d39..b2806f0 100644
--- a/contrib/llvm/tools/clang/lib/AST/DeclBase.cpp
+++ b/contrib/llvm/tools/clang/lib/AST/DeclBase.cpp
@@ -29,7 +29,6 @@
#include "llvm/ADT/DenseMap.h"
#include "llvm/Support/raw_ostream.h"
#include <algorithm>
-#include <cstdio>
using namespace clang;
//===----------------------------------------------------------------------===//
@@ -76,26 +75,27 @@ bool Decl::CollectingStats(bool Enable) {
}
void Decl::PrintStats() {
- fprintf(stderr, "*** Decl Stats:\n");
+ llvm::errs() << "\n*** Decl Stats:\n";
int totalDecls = 0;
#define DECL(DERIVED, BASE) totalDecls += n##DERIVED##s;
#define ABSTRACT_DECL(DECL)
#include "clang/AST/DeclNodes.inc"
- fprintf(stderr, " %d decls total.\n", totalDecls);
+ llvm::errs() << " " << totalDecls << " decls total.\n";
int totalBytes = 0;
#define DECL(DERIVED, BASE) \
if (n##DERIVED##s > 0) { \
totalBytes += (int)(n##DERIVED##s * sizeof(DERIVED##Decl)); \
- fprintf(stderr, " %d " #DERIVED " decls, %d each (%d bytes)\n", \
- n##DERIVED##s, (int)sizeof(DERIVED##Decl), \
- (int)(n##DERIVED##s * sizeof(DERIVED##Decl))); \
+ llvm::errs() << " " << n##DERIVED##s << " " #DERIVED " decls, " \
+ << sizeof(DERIVED##Decl) << " each (" \
+ << n##DERIVED##s * sizeof(DERIVED##Decl) \
+ << " bytes)\n"; \
}
#define ABSTRACT_DECL(DECL)
#include "clang/AST/DeclNodes.inc"
- fprintf(stderr, "Total bytes = %d\n", totalBytes);
+ llvm::errs() << "Total bytes = " << totalBytes << "\n";
}
void Decl::add(Kind k) {
@@ -641,12 +641,8 @@ DeclContext *Decl::getNonClosureContext() {
// This is basically "while (DC->isClosure()) DC = DC->getParent();"
// except that it's significantly more efficient to cast to a known
// decl type and call getDeclContext() than to call getParent().
- do {
- if (isa<BlockDecl>(DC)) {
- DC = cast<BlockDecl>(DC)->getDeclContext();
- continue;
- }
- } while (false);
+ while (isa<BlockDecl>(DC))
+ DC = cast<BlockDecl>(DC)->getDeclContext();
assert(!DC->isClosure());
return DC;
@@ -843,12 +839,17 @@ DeclContext::LoadLexicalDeclsFromExternalStorage() const {
// Notify that we have a DeclContext that is initializing.
ExternalASTSource::Deserializing ADeclContext(Source);
+ // Load the external declarations, if any.
llvm::SmallVector<Decl*, 64> Decls;
- if (Source->FindExternalLexicalDecls(this, Decls))
- return;
-
- // There is no longer any lexical storage in this context
ExternalLexicalStorage = false;
+ switch (Source->FindExternalLexicalDecls(this, Decls)) {
+ case ELR_Success:
+ break;
+
+ case ELR_Failure:
+ case ELR_AlreadyLoaded:
+ return;
+ }
if (Decls.empty())
return;
diff --git a/contrib/llvm/tools/clang/lib/AST/DeclCXX.cpp b/contrib/llvm/tools/clang/lib/AST/DeclCXX.cpp
index 08ac2a5..4b59bf3 100644
--- a/contrib/llvm/tools/clang/lib/AST/DeclCXX.cpp
+++ b/contrib/llvm/tools/clang/lib/AST/DeclCXX.cpp
@@ -228,6 +228,11 @@ CXXRecordDecl::setBases(CXXBaseSpecifier const * const *Bases,
if (!BaseClassDecl->hasTrivialDestructor())
data().HasTrivialDestructor = false;
+ // A class has an Objective-C object member if... or any of its bases
+ // has an Objective-C object member.
+ if (BaseClassDecl->hasObjectMember())
+ setHasObjectMember(true);
+
// Keep track of the presence of mutable fields.
if (BaseClassDecl->hasMutableFields())
data().HasMutableFields = true;
@@ -239,22 +244,8 @@ CXXRecordDecl::setBases(CXXBaseSpecifier const * const *Bases,
// Create base specifier for any direct or indirect virtual bases.
data().VBases = new (C) CXXBaseSpecifier[VBases.size()];
data().NumVBases = VBases.size();
- for (int I = 0, E = VBases.size(); I != E; ++I) {
- TypeSourceInfo *VBaseTypeInfo = VBases[I]->getTypeSourceInfo();
-
- // Skip dependent types; we can't do any checking on them now.
- if (VBaseTypeInfo->getType()->isDependentType())
- continue;
-
- CXXRecordDecl *VBaseClassDecl = cast<CXXRecordDecl>(
- VBaseTypeInfo->getType()->getAs<RecordType>()->getDecl());
-
- data().getVBases()[I] =
- CXXBaseSpecifier(VBaseClassDecl->getSourceRange(), true,
- VBaseClassDecl->getTagKind() == TTK_Class,
- VBases[I]->getAccessSpecifier(), VBaseTypeInfo,
- SourceLocation());
- }
+ for (int I = 0, E = VBases.size(); I != E; ++I)
+ data().getVBases()[I] = *VBases[I];
}
/// Callback function for CXXRecordDecl::forallBases that acknowledges
@@ -698,10 +689,23 @@ NotASpecialMember:;
// A POD struct is a class that is both a trivial class and a
// standard-layout class, and has no non-static data members of type
// non-POD struct, non-POD union (or array of such types).
+ //
+ // Automatic Reference Counting: the presence of a member of Objective-C pointer type
+ // that does not explicitly have no lifetime makes the class a non-POD.
+ // However, we delay setting PlainOldData to false in this case so that
+ // Sema has a chance to diagnostic causes where the same class will be
+ // non-POD with Automatic Reference Counting but a POD without Instant Objects.
+ // In this case, the class will become a non-POD class when we complete
+ // the definition.
ASTContext &Context = getASTContext();
QualType T = Context.getBaseElementType(Field->getType());
- if (!T->isPODType())
+ if (T->isObjCRetainableType() || T.isObjCGCStrong()) {
+ if (!Context.getLangOptions().ObjCAutoRefCount ||
+ T.getObjCLifetime() != Qualifiers::OCL_ExplicitNone)
+ setHasObjectMember(true);
+ } else if (!T.isPODType(Context))
data().PlainOldData = false;
+
if (T->isReferenceType()) {
data().HasTrivialDefaultConstructor = false;
@@ -768,6 +772,8 @@ NotASpecialMember:;
if (!FieldRec->hasTrivialDestructor())
data().HasTrivialDestructor = false;
+ if (FieldRec->hasObjectMember())
+ setHasObjectMember(true);
// C++0x [class]p7:
// A standard-layout class is a class that:
@@ -1078,6 +1084,20 @@ void CXXRecordDecl::completeDefinition() {
void CXXRecordDecl::completeDefinition(CXXFinalOverriderMap *FinalOverriders) {
RecordDecl::completeDefinition();
+ if (hasObjectMember() && getASTContext().getLangOptions().ObjCAutoRefCount) {
+ // Objective-C Automatic Reference Counting:
+ // If a class has a non-static data member of Objective-C pointer
+ // type (or array thereof), it is a non-POD type and its
+ // default constructor (if any), copy constructor, copy assignment
+ // operator, and destructor are non-trivial.
+ struct DefinitionData &Data = data();
+ Data.PlainOldData = false;
+ Data.HasTrivialDefaultConstructor = false;
+ Data.HasTrivialCopyConstructor = false;
+ Data.HasTrivialCopyAssignment = false;
+ Data.HasTrivialDestructor = false;
+ }
+
// If the class may be abstract (but hasn't been marked as such), check for
// any pure final overriders.
if (mayBeAbstract()) {
diff --git a/contrib/llvm/tools/clang/lib/AST/DeclObjC.cpp b/contrib/llvm/tools/clang/lib/AST/DeclObjC.cpp
index e2c4f38..557b681 100644
--- a/contrib/llvm/tools/clang/lib/AST/DeclObjC.cpp
+++ b/contrib/llvm/tools/clang/lib/AST/DeclObjC.cpp
@@ -452,6 +452,34 @@ ObjCMethodFamily ObjCMethodDecl::getMethodFamily() const {
if (!isInstanceMethod())
family = OMF_None;
break;
+
+ case OMF_performSelector:
+ if (!isInstanceMethod() ||
+ !getResultType()->isObjCIdType())
+ family = OMF_None;
+ else {
+ unsigned noParams = param_size();
+ if (noParams < 1 || noParams > 3)
+ family = OMF_None;
+ else {
+ ObjCMethodDecl::arg_type_iterator it = arg_type_begin();
+ QualType ArgT = (*it);
+ if (!ArgT->isObjCSelType()) {
+ family = OMF_None;
+ break;
+ }
+ while (--noParams) {
+ it++;
+ ArgT = (*it);
+ if (!ArgT->isObjCIdType()) {
+ family = OMF_None;
+ break;
+ }
+ }
+ }
+ }
+ break;
+
}
// Cache the result.
@@ -474,8 +502,34 @@ void ObjCMethodDecl::createImplicitParams(ASTContext &Context,
} else // we have a factory method.
selfTy = Context.getObjCClassType();
- setSelfDecl(ImplicitParamDecl::Create(Context, this, SourceLocation(),
- &Context.Idents.get("self"), selfTy));
+ bool selfIsPseudoStrong = false;
+ bool selfIsConsumed = false;
+ if (isInstanceMethod() && Context.getLangOptions().ObjCAutoRefCount) {
+ selfIsConsumed = hasAttr<NSConsumesSelfAttr>();
+
+ // 'self' is always __strong. It's actually pseudo-strong except
+ // in init methods, though.
+ Qualifiers qs;
+ qs.setObjCLifetime(Qualifiers::OCL_Strong);
+ selfTy = Context.getQualifiedType(selfTy, qs);
+
+ // In addition, 'self' is const unless this is an init method.
+ if (getMethodFamily() != OMF_init) {
+ selfTy = selfTy.withConst();
+ selfIsPseudoStrong = true;
+ }
+ }
+
+ ImplicitParamDecl *self
+ = ImplicitParamDecl::Create(Context, this, SourceLocation(),
+ &Context.Idents.get("self"), selfTy);
+ setSelfDecl(self);
+
+ if (selfIsConsumed)
+ self->addAttr(new (Context) NSConsumedAttr(SourceLocation(), Context));
+
+ if (selfIsPseudoStrong)
+ self->setARCPseudoStrong(true);
setCmdDecl(ImplicitParamDecl::Create(Context, this, SourceLocation(),
&Context.Idents.get("_cmd"),
diff --git a/contrib/llvm/tools/clang/lib/AST/DeclPrinter.cpp b/contrib/llvm/tools/clang/lib/AST/DeclPrinter.cpp
index 421770e..19554a3 100644
--- a/contrib/llvm/tools/clang/lib/AST/DeclPrinter.cpp
+++ b/contrib/llvm/tools/clang/lib/AST/DeclPrinter.cpp
@@ -933,6 +933,11 @@ void DeclPrinter::VisitObjCPropertyDecl(ObjCPropertyDecl *PDecl) {
first = false;
}
+ if (PDecl->getPropertyAttributes() & ObjCPropertyDecl::OBJC_PR_strong) {
+ Out << (first ? ' ' : ',') << "strong";
+ first = false;
+ }
+
if (PDecl->getPropertyAttributes() & ObjCPropertyDecl::OBJC_PR_copy) {
Out << (first ? ' ' : ',') << "copy";
first = false;
diff --git a/contrib/llvm/tools/clang/lib/AST/DeclarationName.cpp b/contrib/llvm/tools/clang/lib/AST/DeclarationName.cpp
index cef54e9..72c0e9d 100644
--- a/contrib/llvm/tools/clang/lib/AST/DeclarationName.cpp
+++ b/contrib/llvm/tools/clang/lib/AST/DeclarationName.cpp
@@ -533,6 +533,28 @@ bool DeclarationNameInfo::containsUnexpandedParameterPack() const {
llvm_unreachable("All name kinds handled.");
}
+bool DeclarationNameInfo::isInstantiationDependent() const {
+ switch (Name.getNameKind()) {
+ case DeclarationName::Identifier:
+ case DeclarationName::ObjCZeroArgSelector:
+ case DeclarationName::ObjCOneArgSelector:
+ case DeclarationName::ObjCMultiArgSelector:
+ case DeclarationName::CXXOperatorName:
+ case DeclarationName::CXXLiteralOperatorName:
+ case DeclarationName::CXXUsingDirective:
+ return false;
+
+ case DeclarationName::CXXConstructorName:
+ case DeclarationName::CXXDestructorName:
+ case DeclarationName::CXXConversionFunctionName:
+ if (TypeSourceInfo *TInfo = LocInfo.NamedType.TInfo)
+ return TInfo->getType()->isInstantiationDependentType();
+
+ return Name.getCXXNameType()->isInstantiationDependentType();
+ }
+ llvm_unreachable("All name kinds handled.");
+}
+
std::string DeclarationNameInfo::getAsString() const {
std::string Result;
llvm::raw_string_ostream OS(Result);
diff --git a/contrib/llvm/tools/clang/lib/AST/Expr.cpp b/contrib/llvm/tools/clang/lib/AST/Expr.cpp
index 9872139..4611ae3 100644
--- a/contrib/llvm/tools/clang/lib/AST/Expr.cpp
+++ b/contrib/llvm/tools/clang/lib/AST/Expr.cpp
@@ -142,9 +142,10 @@ void ExplicitTemplateArgumentList::initializeFrom(
}
void ExplicitTemplateArgumentList::initializeFrom(
- const TemplateArgumentListInfo &Info,
- bool &Dependent,
- bool &ContainsUnexpandedParameterPack) {
+ const TemplateArgumentListInfo &Info,
+ bool &Dependent,
+ bool &InstantiationDependent,
+ bool &ContainsUnexpandedParameterPack) {
LAngleLoc = Info.getLAngleLoc();
RAngleLoc = Info.getRAngleLoc();
NumTemplateArgs = Info.size();
@@ -152,6 +153,8 @@ void ExplicitTemplateArgumentList::initializeFrom(
TemplateArgumentLoc *ArgBuffer = getTemplateArgs();
for (unsigned i = 0; i != NumTemplateArgs; ++i) {
Dependent = Dependent || Info[i].getArgument().isDependent();
+ InstantiationDependent = InstantiationDependent ||
+ Info[i].getArgument().isInstantiationDependent();
ContainsUnexpandedParameterPack
= ContainsUnexpandedParameterPack ||
Info[i].getArgument().containsUnexpandedParameterPack();
@@ -178,14 +181,16 @@ std::size_t ExplicitTemplateArgumentList::sizeFor(
return sizeFor(Info.size());
}
-/// \brief Compute the type- and value-dependence of a declaration reference
+/// \brief Compute the type-, value-, and instantiation-dependence of a
+/// declaration reference
/// based on the declaration being referenced.
static void computeDeclRefDependence(NamedDecl *D, QualType T,
bool &TypeDependent,
- bool &ValueDependent) {
+ bool &ValueDependent,
+ bool &InstantiationDependent) {
TypeDependent = false;
ValueDependent = false;
-
+ InstantiationDependent = false;
// (TD) C++ [temp.dep.expr]p3:
// An id-expression is type-dependent if it contains:
@@ -200,20 +205,31 @@ static void computeDeclRefDependence(NamedDecl *D, QualType T,
if (T->isDependentType()) {
TypeDependent = true;
ValueDependent = true;
+ InstantiationDependent = true;
return;
+ } else if (T->isInstantiationDependentType()) {
+ InstantiationDependent = true;
}
// (TD) - a conversion-function-id that specifies a dependent type
if (D->getDeclName().getNameKind()
- == DeclarationName::CXXConversionFunctionName &&
- D->getDeclName().getCXXNameType()->isDependentType()) {
- TypeDependent = true;
- ValueDependent = true;
- return;
+ == DeclarationName::CXXConversionFunctionName) {
+ QualType T = D->getDeclName().getCXXNameType();
+ if (T->isDependentType()) {
+ TypeDependent = true;
+ ValueDependent = true;
+ InstantiationDependent = true;
+ return;
+ }
+
+ if (T->isInstantiationDependentType())
+ InstantiationDependent = true;
}
+
// (VD) - the name of a non-type template parameter,
if (isa<NonTypeTemplateParmDecl>(D)) {
ValueDependent = true;
+ InstantiationDependent = true;
return;
}
@@ -223,16 +239,20 @@ static void computeDeclRefDependence(NamedDecl *D, QualType T,
if (Var->getType()->isIntegralOrEnumerationType() &&
Var->getType().getCVRQualifiers() == Qualifiers::Const) {
if (const Expr *Init = Var->getAnyInitializer())
- if (Init->isValueDependent())
+ if (Init->isValueDependent()) {
ValueDependent = true;
+ InstantiationDependent = true;
+ }
}
// (VD) - FIXME: Missing from the standard:
// - a member function or a static data member of the current
// instantiation
else if (Var->isStaticDataMember() &&
- Var->getDeclContext()->isDependentContext())
+ Var->getDeclContext()->isDependentContext()) {
ValueDependent = true;
+ InstantiationDependent = true;
+ }
return;
}
@@ -242,6 +262,7 @@ static void computeDeclRefDependence(NamedDecl *D, QualType T,
// instantiation
if (isa<CXXMethodDecl>(D) && D->getDeclContext()->isDependentContext()) {
ValueDependent = true;
+ InstantiationDependent = true;
return;
}
}
@@ -249,7 +270,9 @@ static void computeDeclRefDependence(NamedDecl *D, QualType T,
void DeclRefExpr::computeDependence() {
bool TypeDependent = false;
bool ValueDependent = false;
- computeDeclRefDependence(getDecl(), getType(), TypeDependent, ValueDependent);
+ bool InstantiationDependent = false;
+ computeDeclRefDependence(getDecl(), getType(), TypeDependent, ValueDependent,
+ InstantiationDependent);
// (TD) C++ [temp.dep.expr]p3:
// An id-expression is type-dependent if it contains:
@@ -262,13 +285,16 @@ void DeclRefExpr::computeDependence() {
hasExplicitTemplateArgs() &&
TemplateSpecializationType::anyDependentTemplateArguments(
getTemplateArgs(),
- getNumTemplateArgs())) {
+ getNumTemplateArgs(),
+ InstantiationDependent)) {
TypeDependent = true;
ValueDependent = true;
+ InstantiationDependent = true;
}
ExprBits.TypeDependent = TypeDependent;
ExprBits.ValueDependent = ValueDependent;
+ ExprBits.InstantiationDependent = InstantiationDependent;
// Is the declaration a parameter pack?
if (getDecl()->isParameterPack())
@@ -280,7 +306,7 @@ DeclRefExpr::DeclRefExpr(NestedNameSpecifierLoc QualifierLoc,
NamedDecl *FoundD,
const TemplateArgumentListInfo *TemplateArgs,
QualType T, ExprValueKind VK)
- : Expr(DeclRefExprClass, T, VK, OK_Ordinary, false, false, false),
+ : Expr(DeclRefExprClass, T, VK, OK_Ordinary, false, false, false, false),
D(D), Loc(NameInfo.getLoc()), DNLoc(NameInfo.getInfo()) {
DeclRefExprBits.HasQualifier = QualifierLoc ? 1 : 0;
if (QualifierLoc)
@@ -289,9 +315,17 @@ DeclRefExpr::DeclRefExpr(NestedNameSpecifierLoc QualifierLoc,
if (FoundD)
getInternalFoundDecl() = FoundD;
DeclRefExprBits.HasExplicitTemplateArgs = TemplateArgs ? 1 : 0;
- if (TemplateArgs)
- getExplicitTemplateArgs().initializeFrom(*TemplateArgs);
-
+ if (TemplateArgs) {
+ bool Dependent = false;
+ bool InstantiationDependent = false;
+ bool ContainsUnexpandedParameterPack = false;
+ getExplicitTemplateArgs().initializeFrom(*TemplateArgs, Dependent,
+ InstantiationDependent,
+ ContainsUnexpandedParameterPack);
+ if (InstantiationDependent)
+ setInstantiationDependent(true);
+ }
+
computeDependence();
}
@@ -498,8 +532,8 @@ double FloatingLiteral::getValueAsApproximateDouble() const {
return V.convertToDouble();
}
-StringLiteral *StringLiteral::Create(ASTContext &C, const char *StrData,
- unsigned ByteLength, bool Wide,
+StringLiteral *StringLiteral::Create(ASTContext &C, llvm::StringRef Str,
+ bool Wide,
bool Pascal, QualType Ty,
const SourceLocation *Loc,
unsigned NumStrs) {
@@ -511,10 +545,10 @@ StringLiteral *StringLiteral::Create(ASTContext &C, const char *StrData,
StringLiteral *SL = new (Mem) StringLiteral(Ty);
// OPTIMIZE: could allocate this appended to the StringLiteral.
- char *AStrData = new (C, 1) char[ByteLength];
- memcpy(AStrData, StrData, ByteLength);
+ char *AStrData = new (C, 1) char[Str.size()];
+ memcpy(AStrData, Str.data(), Str.size());
SL->StrData = AStrData;
- SL->ByteLength = ByteLength;
+ SL->ByteLength = Str.size();
SL->IsWide = Wide;
SL->IsPascal = Pascal;
SL->TokLocs[0] = Loc[0];
@@ -593,7 +627,7 @@ getLocationOfByte(unsigned ByteNo, const SourceManager &SM,
// If the byte is in this token, return the location of the byte.
if (ByteNo < TokNumBytes ||
- (ByteNo == TokNumBytes && TokNo == getNumConcatenated())) {
+ (ByteNo == TokNumBytes && TokNo == getNumConcatenated() - 1)) {
unsigned Offset = SLP.getOffsetOfStringByte(TheTok, ByteNo);
// Now that we know the offset of the token in the spelling, use the
@@ -670,6 +704,7 @@ CallExpr::CallExpr(ASTContext& C, StmtClass SC, Expr *fn, unsigned NumPreArgs,
: Expr(SC, t, VK, OK_Ordinary,
fn->isTypeDependent(),
fn->isValueDependent(),
+ fn->isInstantiationDependent(),
fn->containsUnexpandedParameterPack()),
NumArgs(numargs) {
@@ -680,6 +715,8 @@ CallExpr::CallExpr(ASTContext& C, StmtClass SC, Expr *fn, unsigned NumPreArgs,
ExprBits.TypeDependent = true;
if (args[i]->isValueDependent())
ExprBits.ValueDependent = true;
+ if (args[i]->isInstantiationDependent())
+ ExprBits.InstantiationDependent = true;
if (args[i]->containsUnexpandedParameterPack())
ExprBits.ContainsUnexpandedParameterPack = true;
@@ -695,6 +732,7 @@ CallExpr::CallExpr(ASTContext& C, Expr *fn, Expr **args, unsigned numargs,
: Expr(CallExprClass, t, VK, OK_Ordinary,
fn->isTypeDependent(),
fn->isValueDependent(),
+ fn->isInstantiationDependent(),
fn->containsUnexpandedParameterPack()),
NumArgs(numargs) {
@@ -705,6 +743,8 @@ CallExpr::CallExpr(ASTContext& C, Expr *fn, Expr **args, unsigned numargs,
ExprBits.TypeDependent = true;
if (args[i]->isValueDependent())
ExprBits.ValueDependent = true;
+ if (args[i]->isInstantiationDependent())
+ ExprBits.InstantiationDependent = true;
if (args[i]->containsUnexpandedParameterPack())
ExprBits.ContainsUnexpandedParameterPack = true;
@@ -862,6 +902,7 @@ OffsetOfExpr::OffsetOfExpr(ASTContext &C, QualType type,
: Expr(OffsetOfExprClass, type, VK_RValue, OK_Ordinary,
/*TypeDependent=*/false,
/*ValueDependent=*/tsi->getType()->isDependentType(),
+ tsi->getType()->isInstantiationDependentType(),
tsi->getType()->containsUnexpandedParameterPack()),
OperatorLoc(OperatorLoc), RParenLoc(RParenLoc), TSInfo(tsi),
NumComps(numComps), NumExprs(numExprs)
@@ -917,7 +958,12 @@ MemberExpr *MemberExpr::Create(ASTContext &C, Expr *base, bool isarrow,
if (QualifierLoc && QualifierLoc.getNestedNameSpecifier()->isDependent()) {
E->setValueDependent(true);
E->setTypeDependent(true);
- }
+ E->setInstantiationDependent(true);
+ }
+ else if (QualifierLoc &&
+ QualifierLoc.getNestedNameSpecifier()->isInstantiationDependent())
+ E->setInstantiationDependent(true);
+
E->HasQualifierOrFoundDecl = true;
MemberNameQualifier *NQ = E->getMemberQualifier();
@@ -926,8 +972,15 @@ MemberExpr *MemberExpr::Create(ASTContext &C, Expr *base, bool isarrow,
}
if (targs) {
+ bool Dependent = false;
+ bool InstantiationDependent = false;
+ bool ContainsUnexpandedParameterPack = false;
E->HasExplicitTemplateArgumentList = true;
- E->getExplicitTemplateArgs().initializeFrom(*targs);
+ E->getExplicitTemplateArgs().initializeFrom(*targs, Dependent,
+ InstantiationDependent,
+ ContainsUnexpandedParameterPack);
+ if (InstantiationDependent)
+ E->setInstantiationDependent(true);
}
return E;
@@ -1045,6 +1098,12 @@ const char *CastExpr::getCastKindName() const {
return "IntegralComplexCast";
case CK_IntegralComplexToFloatingComplex:
return "IntegralComplexToFloatingComplex";
+ case CK_ObjCConsumeObject:
+ return "ObjCConsumeObject";
+ case CK_ObjCProduceObject:
+ return "ObjCProduceObject";
+ case CK_ObjCReclaimReturnedObject:
+ return "ObjCReclaimReturnedObject";
}
llvm_unreachable("Unhandled cast kind!");
@@ -1056,7 +1115,12 @@ Expr *CastExpr::getSubExprAsWritten() {
CastExpr *E = this;
do {
SubExpr = E->getSubExpr();
-
+
+ // Skip through reference binding to temporary.
+ if (MaterializeTemporaryExpr *Materialize
+ = dyn_cast<MaterializeTemporaryExpr>(SubExpr))
+ SubExpr = Materialize->GetTemporaryExpr();
+
// Skip any temporary bindings; they're implicit.
if (CXXBindTemporaryExpr *Binder = dyn_cast<CXXBindTemporaryExpr>(SubExpr))
SubExpr = Binder->getSubExpr();
@@ -1242,7 +1306,7 @@ InitListExpr::InitListExpr(ASTContext &C, SourceLocation lbraceloc,
Expr **initExprs, unsigned numInits,
SourceLocation rbraceloc)
: Expr(InitListExprClass, QualType(), VK_RValue, OK_Ordinary, false, false,
- false),
+ false, false),
InitExprs(C, numInits),
LBraceLoc(lbraceloc), RBraceLoc(rbraceloc), SyntacticForm(0),
HadArrayRangeDesignator(false)
@@ -1252,6 +1316,8 @@ InitListExpr::InitListExpr(ASTContext &C, SourceLocation lbraceloc,
ExprBits.TypeDependent = true;
if (initExprs[I]->isValueDependent())
ExprBits.ValueDependent = true;
+ if (initExprs[I]->isInstantiationDependent())
+ ExprBits.InstantiationDependent = true;
if (initExprs[I]->containsUnexpandedParameterPack())
ExprBits.ContainsUnexpandedParameterPack = true;
}
@@ -1490,6 +1556,17 @@ bool Expr::isUnusedResultAWarning(SourceLocation &Loc, SourceRange &R1,
case ObjCMessageExprClass: {
const ObjCMessageExpr *ME = cast<ObjCMessageExpr>(this);
+ if (Ctx.getLangOptions().ObjCAutoRefCount &&
+ ME->isInstanceMessage() &&
+ !ME->getType()->isVoidType() &&
+ ME->getSelector().getIdentifierInfoForSlot(0) &&
+ ME->getSelector().getIdentifierInfoForSlot(0)
+ ->getName().startswith("init")) {
+ Loc = getExprLoc();
+ R1 = ME->getSourceRange();
+ return true;
+ }
+
const ObjCMethodDecl *MD = ME->getMethodDecl();
if (MD && MD->getAttr<WarnUnusedResultAttr>()) {
Loc = getExprLoc();
@@ -1584,6 +1661,9 @@ bool Expr::isOBJCGCCandidate(ASTContext &Ctx) const {
return cast<UnaryOperator>(E)->getSubExpr()->isOBJCGCCandidate(Ctx);
case ImplicitCastExprClass:
return cast<ImplicitCastExpr>(E)->getSubExpr()->isOBJCGCCandidate(Ctx);
+ case MaterializeTemporaryExprClass:
+ return cast<MaterializeTemporaryExpr>(E)->GetTemporaryExpr()
+ ->isOBJCGCCandidate(Ctx);
case CStyleCastExprClass:
return cast<CStyleCastExpr>(E)->getSubExpr()->isOBJCGCCandidate(Ctx);
case DeclRefExprClass: {
@@ -1858,7 +1938,8 @@ Expr::CanThrowResult Expr::CanThrow(ASTContext &C) const {
case CXXStaticCastExprClass:
case CXXFunctionalCastExprClass:
case BinaryOperatorClass:
- case CompoundAssignOperatorClass: {
+ case CompoundAssignOperatorClass:
+ case MaterializeTemporaryExprClass: {
CanThrowResult CT = isTypeDependent() ? CT_Dependent : CT_Cannot;
return MergeCanThrow(CT, CanSubExprsThrow(C, this));
}
@@ -1938,6 +2019,12 @@ Expr *Expr::IgnoreParenCasts() {
continue;
}
}
+ if (MaterializeTemporaryExpr *Materialize
+ = dyn_cast<MaterializeTemporaryExpr>(E)) {
+ E = Materialize->GetTemporaryExpr();
+ continue;
+ }
+
return E;
}
}
@@ -1967,6 +2054,10 @@ Expr *Expr::IgnoreParenLValueCasts() {
E = P->getResultExpr();
continue;
}
+ } else if (MaterializeTemporaryExpr *Materialize
+ = dyn_cast<MaterializeTemporaryExpr>(E)) {
+ E = Materialize->GetTemporaryExpr();
+ continue;
}
break;
}
@@ -1996,13 +2087,18 @@ Expr *Expr::IgnoreParenImpCasts() {
continue;
}
}
+ if (MaterializeTemporaryExpr *Materialize
+ = dyn_cast<MaterializeTemporaryExpr>(E)) {
+ E = Materialize->GetTemporaryExpr();
+ continue;
+ }
return E;
}
}
Expr *Expr::IgnoreConversionOperator() {
if (CXXMemberCallExpr *MCE = dyn_cast<CXXMemberCallExpr>(this)) {
- if (isa<CXXConversionDecl>(MCE->getMethodDecl()))
+ if (MCE->getMethodDecl() && isa<CXXConversionDecl>(MCE->getMethodDecl()))
return MCE->getImplicitObjectArgument();
}
return this;
@@ -2059,6 +2155,9 @@ Expr *Expr::IgnoreParenNoopCasts(ASTContext &Ctx) {
bool Expr::isDefaultArgument() const {
const Expr *E = this;
+ if (const MaterializeTemporaryExpr *M = dyn_cast<MaterializeTemporaryExpr>(E))
+ E = M->GetTemporaryExpr();
+
while (const ImplicitCastExpr *ICE = dyn_cast<ImplicitCastExpr>(E))
E = ICE->getSubExprAsWritten();
@@ -2068,6 +2167,9 @@ bool Expr::isDefaultArgument() const {
/// \brief Skip over any no-op casts and any temporary-binding
/// expressions.
static const Expr *skipTemporaryBindingsNoOpCastsAndParens(const Expr *E) {
+ if (const MaterializeTemporaryExpr *M = dyn_cast<MaterializeTemporaryExpr>(E))
+ E = M->GetTemporaryExpr();
+
while (const ImplicitCastExpr *ICE = dyn_cast<ImplicitCastExpr>(E)) {
if (ICE->getCastKind() == CK_NoOp)
E = ICE->getSubExpr();
@@ -2155,6 +2257,12 @@ bool Expr::isImplicitCXXThis() const {
}
}
+ if (const MaterializeTemporaryExpr *M
+ = dyn_cast<MaterializeTemporaryExpr>(E)) {
+ E = M->GetTemporaryExpr();
+ continue;
+ }
+
break;
}
@@ -2287,6 +2395,10 @@ bool Expr::isConstantInitializer(ASTContext &Ctx, bool IsForRef) const {
->isConstantInitializer(Ctx, false);
break;
+
+ case MaterializeTemporaryExprClass:
+ return llvm::cast<MaterializeTemporaryExpr>(this)->GetTemporaryExpr()
+ ->isConstantInitializer(Ctx, false);
}
return isEvaluatable(Ctx);
}
@@ -2345,6 +2457,9 @@ Expr::isNullPointerConstant(ASTContext &Ctx,
} else if (isa<GNUNullExpr>(this)) {
// The GNU __null extension is always a null pointer constant.
return NPCK_GNUNull;
+ } else if (const MaterializeTemporaryExpr *M
+ = dyn_cast<MaterializeTemporaryExpr>(this)) {
+ return M->GetTemporaryExpr()->isNullPointerConstant(Ctx, NPC);
}
// C++0x nullptr_t is always a null pointer constant.
@@ -2414,10 +2529,14 @@ FieldDecl *Expr::getBitField() {
if (Field->isBitField())
return Field;
- if (BinaryOperator *BinOp = dyn_cast<BinaryOperator>(E))
+ if (BinaryOperator *BinOp = dyn_cast<BinaryOperator>(E)) {
if (BinOp->isAssignmentOp() && BinOp->getLHS())
return BinOp->getLHS()->getBitField();
+ if (BinOp->getOpcode() == BO_Comma && BinOp->getRHS())
+ return BinOp->getRHS()->getBitField();
+ }
+
return 0;
}
@@ -2517,9 +2636,10 @@ ObjCMessageExpr::ObjCMessageExpr(QualType T,
SourceLocation RBracLoc)
: Expr(ObjCMessageExprClass, T, VK, OK_Ordinary,
/*TypeDependent=*/false, /*ValueDependent=*/false,
+ /*InstantiationDependent=*/false,
/*ContainsUnexpandedParameterPack=*/false),
NumArgs(NumArgs), Kind(IsInstanceSuper? SuperInstance : SuperClass),
- HasMethod(Method != 0), SuperLoc(SuperLoc),
+ HasMethod(Method != 0), IsDelegateInitCall(false), SuperLoc(SuperLoc),
SelectorOrMethod(reinterpret_cast<uintptr_t>(Method? Method
: Sel.getAsOpaquePtr())),
SelectorLoc(SelLoc), LBracLoc(LBracLoc), RBracLoc(RBracLoc)
@@ -2539,8 +2659,10 @@ ObjCMessageExpr::ObjCMessageExpr(QualType T,
Expr **Args, unsigned NumArgs,
SourceLocation RBracLoc)
: Expr(ObjCMessageExprClass, T, VK, OK_Ordinary, T->isDependentType(),
- T->isDependentType(), T->containsUnexpandedParameterPack()),
- NumArgs(NumArgs), Kind(Class), HasMethod(Method != 0),
+ T->isDependentType(), T->isInstantiationDependentType(),
+ T->containsUnexpandedParameterPack()),
+ NumArgs(NumArgs), Kind(Class),
+ HasMethod(Method != 0), IsDelegateInitCall(false),
SelectorOrMethod(reinterpret_cast<uintptr_t>(Method? Method
: Sel.getAsOpaquePtr())),
SelectorLoc(SelLoc), LBracLoc(LBracLoc), RBracLoc(RBracLoc)
@@ -2552,6 +2674,8 @@ ObjCMessageExpr::ObjCMessageExpr(QualType T,
ExprBits.TypeDependent = true;
if (Args[I]->isValueDependent())
ExprBits.ValueDependent = true;
+ if (Args[I]->isInstantiationDependent())
+ ExprBits.InstantiationDependent = true;
if (Args[I]->containsUnexpandedParameterPack())
ExprBits.ContainsUnexpandedParameterPack = true;
@@ -2570,8 +2694,10 @@ ObjCMessageExpr::ObjCMessageExpr(QualType T,
SourceLocation RBracLoc)
: Expr(ObjCMessageExprClass, T, VK, OK_Ordinary, Receiver->isTypeDependent(),
Receiver->isTypeDependent(),
+ Receiver->isInstantiationDependent(),
Receiver->containsUnexpandedParameterPack()),
- NumArgs(NumArgs), Kind(Instance), HasMethod(Method != 0),
+ NumArgs(NumArgs), Kind(Instance),
+ HasMethod(Method != 0), IsDelegateInitCall(false),
SelectorOrMethod(reinterpret_cast<uintptr_t>(Method? Method
: Sel.getAsOpaquePtr())),
SelectorLoc(SelLoc), LBracLoc(LBracLoc), RBracLoc(RBracLoc)
@@ -2583,6 +2709,8 @@ ObjCMessageExpr::ObjCMessageExpr(QualType T,
ExprBits.TypeDependent = true;
if (Args[I]->isValueDependent())
ExprBits.ValueDependent = true;
+ if (Args[I]->isInstantiationDependent())
+ ExprBits.InstantiationDependent = true;
if (Args[I]->containsUnexpandedParameterPack())
ExprBits.ContainsUnexpandedParameterPack = true;
@@ -2702,6 +2830,19 @@ ObjCInterfaceDecl *ObjCMessageExpr::getReceiverInterface() const {
return 0;
}
+llvm::StringRef ObjCBridgedCastExpr::getBridgeKindName() const {
+ switch (getBridgeKind()) {
+ case OBC_Bridge:
+ return "__bridge";
+ case OBC_BridgeTransfer:
+ return "__bridge_transfer";
+ case OBC_BridgeRetained:
+ return "__bridge_retained";
+ }
+
+ return "__bridge";
+}
+
bool ChooseExpr::isConditionTrue(const ASTContext &C) const {
return getCond()->EvaluateAsInt(C) != 0;
}
@@ -2711,6 +2852,7 @@ ShuffleVectorExpr::ShuffleVectorExpr(ASTContext &C, Expr **args, unsigned nexpr,
SourceLocation RP)
: Expr(ShuffleVectorExprClass, Type, VK_RValue, OK_Ordinary,
Type->isDependentType(), Type->isDependentType(),
+ Type->isInstantiationDependentType(),
Type->containsUnexpandedParameterPack()),
BuiltinLoc(BLoc), RParenLoc(RP), NumExprs(nexpr)
{
@@ -2720,6 +2862,8 @@ ShuffleVectorExpr::ShuffleVectorExpr(ASTContext &C, Expr **args, unsigned nexpr,
ExprBits.TypeDependent = true;
if (args[i]->isValueDependent())
ExprBits.ValueDependent = true;
+ if (args[i]->isInstantiationDependent())
+ ExprBits.InstantiationDependent = true;
if (args[i]->containsUnexpandedParameterPack())
ExprBits.ContainsUnexpandedParameterPack = true;
@@ -2749,6 +2893,7 @@ GenericSelectionExpr::GenericSelectionExpr(ASTContext &Context,
AssocExprs[ResultIndex]->getObjectKind(),
AssocExprs[ResultIndex]->isTypeDependent(),
AssocExprs[ResultIndex]->isValueDependent(),
+ AssocExprs[ResultIndex]->isInstantiationDependent(),
ContainsUnexpandedParameterPack),
AssocTypes(new (Context) TypeSourceInfo*[NumAssocs]),
SubExprs(new (Context) Stmt*[END_EXPR+NumAssocs]), NumAssocs(NumAssocs),
@@ -2769,8 +2914,9 @@ GenericSelectionExpr::GenericSelectionExpr(ASTContext &Context,
Context.DependentTy,
VK_RValue,
OK_Ordinary,
- /*isTypeDependent=*/ true,
- /*isValueDependent=*/ true,
+ /*isTypeDependent=*/true,
+ /*isValueDependent=*/true,
+ /*isInstantiationDependent=*/true,
ContainsUnexpandedParameterPack),
AssocTypes(new (Context) TypeSourceInfo*[NumAssocs]),
SubExprs(new (Context) Stmt*[END_EXPR+NumAssocs]), NumAssocs(NumAssocs),
@@ -2785,7 +2931,7 @@ GenericSelectionExpr::GenericSelectionExpr(ASTContext &Context,
// DesignatedInitExpr
//===----------------------------------------------------------------------===//
-IdentifierInfo *DesignatedInitExpr::Designator::getFieldName() {
+IdentifierInfo *DesignatedInitExpr::Designator::getFieldName() const {
assert(Kind == FieldDesignator && "Only valid on a field designator");
if (Field.NameOrField & 0x01)
return reinterpret_cast<IdentifierInfo *>(Field.NameOrField&~0x01);
@@ -2804,6 +2950,7 @@ DesignatedInitExpr::DesignatedInitExpr(ASTContext &C, QualType Ty,
: Expr(DesignatedInitExprClass, Ty,
Init->getValueKind(), Init->getObjectKind(),
Init->isTypeDependent(), Init->isValueDependent(),
+ Init->isInstantiationDependent(),
Init->containsUnexpandedParameterPack()),
EqualOrColonLoc(EqualOrColonLoc), GNUSyntax(GNUSyntax),
NumDesignators(NumDesignators), NumSubExprs(NumIndexExprs + 1) {
@@ -2824,7 +2971,8 @@ DesignatedInitExpr::DesignatedInitExpr(ASTContext &C, QualType Ty,
Expr *Index = IndexExprs[IndexIdx];
if (Index->isTypeDependent() || Index->isValueDependent())
ExprBits.ValueDependent = true;
-
+ if (Index->isInstantiationDependent())
+ ExprBits.InstantiationDependent = true;
// Propagate unexpanded parameter packs.
if (Index->containsUnexpandedParameterPack())
ExprBits.ContainsUnexpandedParameterPack = true;
@@ -2836,9 +2984,14 @@ DesignatedInitExpr::DesignatedInitExpr(ASTContext &C, QualType Ty,
Expr *Start = IndexExprs[IndexIdx];
Expr *End = IndexExprs[IndexIdx + 1];
if (Start->isTypeDependent() || Start->isValueDependent() ||
- End->isTypeDependent() || End->isValueDependent())
+ End->isTypeDependent() || End->isValueDependent()) {
ExprBits.ValueDependent = true;
-
+ ExprBits.InstantiationDependent = true;
+ } else if (Start->isInstantiationDependent() ||
+ End->isInstantiationDependent()) {
+ ExprBits.InstantiationDependent = true;
+ }
+
// Propagate unexpanded parameter packs.
if (Start->containsUnexpandedParameterPack() ||
End->containsUnexpandedParameterPack())
@@ -2960,17 +3113,19 @@ void DesignatedInitExpr::ExpandDesignator(ASTContext &C, unsigned Idx,
ParenListExpr::ParenListExpr(ASTContext& C, SourceLocation lparenloc,
Expr **exprs, unsigned nexprs,
- SourceLocation rparenloc)
- : Expr(ParenListExprClass, QualType(), VK_RValue, OK_Ordinary,
- false, false, false),
+ SourceLocation rparenloc, QualType T)
+ : Expr(ParenListExprClass, T, VK_RValue, OK_Ordinary,
+ false, false, false, false),
NumExprs(nexprs), LParenLoc(lparenloc), RParenLoc(rparenloc) {
-
+ assert(!T.isNull() && "ParenListExpr must have a valid type");
Exprs = new (C) Stmt*[nexprs];
for (unsigned i = 0; i != nexprs; ++i) {
if (exprs[i]->isTypeDependent())
ExprBits.TypeDependent = true;
if (exprs[i]->isValueDependent())
ExprBits.ValueDependent = true;
+ if (exprs[i]->isInstantiationDependent())
+ ExprBits.InstantiationDependent = true;
if (exprs[i]->containsUnexpandedParameterPack())
ExprBits.ContainsUnexpandedParameterPack = true;
@@ -2981,6 +3136,8 @@ ParenListExpr::ParenListExpr(ASTContext& C, SourceLocation lparenloc,
const OpaqueValueExpr *OpaqueValueExpr::findInCopyConstruct(const Expr *e) {
if (const ExprWithCleanups *ewc = dyn_cast<ExprWithCleanups>(e))
e = ewc->getSubExpr();
+ if (const MaterializeTemporaryExpr *m = dyn_cast<MaterializeTemporaryExpr>(e))
+ e = m->GetTemporaryExpr();
e = cast<CXXConstructExpr>(e)->getArg(0);
while (const ImplicitCastExpr *ice = dyn_cast<ImplicitCastExpr>(e))
e = ice->getSubExpr();
@@ -3033,13 +3190,16 @@ Stmt::child_range ObjCMessageExpr::children() {
BlockDeclRefExpr::BlockDeclRefExpr(VarDecl *d, QualType t, ExprValueKind VK,
SourceLocation l, bool ByRef,
bool constAdded)
- : Expr(BlockDeclRefExprClass, t, VK, OK_Ordinary, false, false,
+ : Expr(BlockDeclRefExprClass, t, VK, OK_Ordinary, false, false, false,
d->isParameterPack()),
D(d), Loc(l), IsByRef(ByRef), ConstQualAdded(constAdded)
{
bool TypeDependent = false;
bool ValueDependent = false;
- computeDeclRefDependence(D, getType(), TypeDependent, ValueDependent);
+ bool InstantiationDependent = false;
+ computeDeclRefDependence(D, getType(), TypeDependent, ValueDependent,
+ InstantiationDependent);
ExprBits.TypeDependent = TypeDependent;
ExprBits.ValueDependent = ValueDependent;
+ ExprBits.InstantiationDependent = InstantiationDependent;
}
diff --git a/contrib/llvm/tools/clang/lib/AST/ExprCXX.cpp b/contrib/llvm/tools/clang/lib/AST/ExprCXX.cpp
index 1a1a0a3..f92afff 100644
--- a/contrib/llvm/tools/clang/lib/AST/ExprCXX.cpp
+++ b/contrib/llvm/tools/clang/lib/AST/ExprCXX.cpp
@@ -57,6 +57,7 @@ CXXNewExpr::CXXNewExpr(ASTContext &C, bool globalNew, FunctionDecl *operatorNew,
SourceLocation constructorRParen)
: Expr(CXXNewExprClass, ty, VK_RValue, OK_Ordinary,
ty->isDependentType(), ty->isDependentType(),
+ ty->isInstantiationDependentType(),
ty->containsUnexpandedParameterPack()),
GlobalNew(globalNew), Initializer(initializer),
UsualArrayDeleteWantsSize(usualArrayDeleteWantsSize),
@@ -68,6 +69,9 @@ CXXNewExpr::CXXNewExpr(ASTContext &C, bool globalNew, FunctionDecl *operatorNew,
AllocateArgsArray(C, arraySize != 0, numPlaceArgs, numConsArgs);
unsigned i = 0;
if (Array) {
+ if (arraySize->isInstantiationDependent())
+ ExprBits.InstantiationDependent = true;
+
if (arraySize->containsUnexpandedParameterPack())
ExprBits.ContainsUnexpandedParameterPack = true;
@@ -75,6 +79,8 @@ CXXNewExpr::CXXNewExpr(ASTContext &C, bool globalNew, FunctionDecl *operatorNew,
}
for (unsigned j = 0; j < NumPlacementArgs; ++j) {
+ if (placementArgs[j]->isInstantiationDependent())
+ ExprBits.InstantiationDependent = true;
if (placementArgs[j]->containsUnexpandedParameterPack())
ExprBits.ContainsUnexpandedParameterPack = true;
@@ -82,6 +88,8 @@ CXXNewExpr::CXXNewExpr(ASTContext &C, bool globalNew, FunctionDecl *operatorNew,
}
for (unsigned j = 0; j < NumConstructorArgs; ++j) {
+ if (constructorArgs[j]->isInstantiationDependent())
+ ExprBits.InstantiationDependent = true;
if (constructorArgs[j]->containsUnexpandedParameterPack())
ExprBits.ContainsUnexpandedParameterPack = true;
@@ -144,6 +152,14 @@ CXXPseudoDestructorExpr::CXXPseudoDestructorExpr(ASTContext &Context,
(DestroyedType.getTypeSourceInfo() &&
DestroyedType.getTypeSourceInfo()->getType()->isDependentType())),
/*isValueDependent=*/Base->isValueDependent(),
+ (Base->isInstantiationDependent() ||
+ (QualifierLoc &&
+ QualifierLoc.getNestedNameSpecifier()->isInstantiationDependent()) ||
+ (ScopeType &&
+ ScopeType->getType()->isInstantiationDependentType()) ||
+ (DestroyedType.getTypeSourceInfo() &&
+ DestroyedType.getTypeSourceInfo()->getType()
+ ->isInstantiationDependentType())),
// ContainsUnexpandedParameterPack
(Base->containsUnexpandedParameterPack() ||
(QualifierLoc &&
@@ -212,9 +228,14 @@ OverloadExpr::OverloadExpr(StmtClass K, ASTContext &C,
UnresolvedSetIterator Begin,
UnresolvedSetIterator End,
bool KnownDependent,
+ bool KnownInstantiationDependent,
bool KnownContainsUnexpandedParameterPack)
: Expr(K, C.OverloadTy, VK_LValue, OK_Ordinary, KnownDependent,
KnownDependent,
+ (KnownInstantiationDependent ||
+ NameInfo.isInstantiationDependent() ||
+ (QualifierLoc &&
+ QualifierLoc.getNestedNameSpecifier()->isInstantiationDependent())),
(KnownContainsUnexpandedParameterPack ||
NameInfo.containsUnexpandedParameterPack() ||
(QualifierLoc &&
@@ -246,14 +267,18 @@ OverloadExpr::OverloadExpr(StmtClass K, ASTContext &C,
// expansions.
if (TemplateArgs) {
bool Dependent = false;
+ bool InstantiationDependent = false;
bool ContainsUnexpandedParameterPack = false;
getExplicitTemplateArgs().initializeFrom(*TemplateArgs, Dependent,
+ InstantiationDependent,
ContainsUnexpandedParameterPack);
if (Dependent) {
- ExprBits.TypeDependent = true;
- ExprBits.ValueDependent = true;
- }
+ ExprBits.TypeDependent = true;
+ ExprBits.ValueDependent = true;
+ }
+ if (InstantiationDependent)
+ ExprBits.InstantiationDependent = true;
if (ContainsUnexpandedParameterPack)
ExprBits.ContainsUnexpandedParameterPack = true;
}
@@ -291,6 +316,9 @@ DependentScopeDeclRefExpr::DependentScopeDeclRefExpr(QualType T,
const TemplateArgumentListInfo *Args)
: Expr(DependentScopeDeclRefExprClass, T, VK_LValue, OK_Ordinary,
true, true,
+ (NameInfo.isInstantiationDependent() ||
+ (QualifierLoc &&
+ QualifierLoc.getNestedNameSpecifier()->isInstantiationDependent())),
(NameInfo.containsUnexpandedParameterPack() ||
(QualifierLoc &&
QualifierLoc.getNestedNameSpecifier()
@@ -300,11 +328,14 @@ DependentScopeDeclRefExpr::DependentScopeDeclRefExpr(QualType T,
{
if (Args) {
bool Dependent = true;
+ bool InstantiationDependent = true;
bool ContainsUnexpandedParameterPack
= ExprBits.ContainsUnexpandedParameterPack;
reinterpret_cast<ExplicitTemplateArgumentList*>(this+1)
- ->initializeFrom(*Args, Dependent, ContainsUnexpandedParameterPack);
+ ->initializeFrom(*Args, Dependent, InstantiationDependent,
+ ContainsUnexpandedParameterPack);
+
ExprBits.ContainsUnexpandedParameterPack = ContainsUnexpandedParameterPack;
}
}
@@ -632,6 +663,7 @@ CXXConstructExpr::CXXConstructExpr(ASTContext &C, StmtClass SC, QualType T,
SourceRange ParenRange)
: Expr(SC, T, VK_RValue, OK_Ordinary,
T->isDependentType(), T->isDependentType(),
+ T->isInstantiationDependentType(),
T->containsUnexpandedParameterPack()),
Constructor(D), Loc(Loc), ParenRange(ParenRange), Elidable(elidable),
ZeroInitialization(ZeroInitialization), ConstructKind(ConstructKind),
@@ -645,6 +677,8 @@ CXXConstructExpr::CXXConstructExpr(ASTContext &C, StmtClass SC, QualType T,
if (args[i]->isValueDependent())
ExprBits.ValueDependent = true;
+ if (args[i]->isInstantiationDependent())
+ ExprBits.InstantiationDependent = true;
if (args[i]->containsUnexpandedParameterPack())
ExprBits.ContainsUnexpandedParameterPack = true;
@@ -660,6 +694,7 @@ ExprWithCleanups::ExprWithCleanups(ASTContext &C,
: Expr(ExprWithCleanupsClass, subexpr->getType(),
subexpr->getValueKind(), subexpr->getObjectKind(),
subexpr->isTypeDependent(), subexpr->isValueDependent(),
+ subexpr->isInstantiationDependent(),
subexpr->containsUnexpandedParameterPack()),
SubExpr(subexpr), Temps(0), NumTemps(0) {
if (numtemps) {
@@ -690,8 +725,11 @@ CXXUnresolvedConstructExpr::CXXUnresolvedConstructExpr(TypeSourceInfo *Type,
SourceLocation RParenLoc)
: Expr(CXXUnresolvedConstructExprClass,
Type->getType().getNonReferenceType(),
- VK_LValue, OK_Ordinary,
- Type->getType()->isDependentType(), true,
+ (Type->getType()->isLValueReferenceType() ? VK_LValue
+ :Type->getType()->isRValueReferenceType()? VK_XValue
+ :VK_RValue),
+ OK_Ordinary,
+ Type->getType()->isDependentType(), true, true,
Type->getType()->containsUnexpandedParameterPack()),
Type(Type),
LParenLoc(LParenLoc),
@@ -740,7 +778,7 @@ CXXDependentScopeMemberExpr::CXXDependentScopeMemberExpr(ASTContext &C,
DeclarationNameInfo MemberNameInfo,
const TemplateArgumentListInfo *TemplateArgs)
: Expr(CXXDependentScopeMemberExprClass, C.DependentTy,
- VK_LValue, OK_Ordinary, true, true,
+ VK_LValue, OK_Ordinary, true, true, true,
((Base && Base->containsUnexpandedParameterPack()) ||
(QualifierLoc &&
QualifierLoc.getNestedNameSpecifier()
@@ -753,8 +791,10 @@ CXXDependentScopeMemberExpr::CXXDependentScopeMemberExpr(ASTContext &C,
MemberNameInfo(MemberNameInfo) {
if (TemplateArgs) {
bool Dependent = true;
+ bool InstantiationDependent = true;
bool ContainsUnexpandedParameterPack = false;
getExplicitTemplateArgs().initializeFrom(*TemplateArgs, Dependent,
+ InstantiationDependent,
ContainsUnexpandedParameterPack);
if (ContainsUnexpandedParameterPack)
ExprBits.ContainsUnexpandedParameterPack = true;
@@ -769,7 +809,7 @@ CXXDependentScopeMemberExpr::CXXDependentScopeMemberExpr(ASTContext &C,
NamedDecl *FirstQualifierFoundInScope,
DeclarationNameInfo MemberNameInfo)
: Expr(CXXDependentScopeMemberExprClass, C.DependentTy,
- VK_LValue, OK_Ordinary, true, true,
+ VK_LValue, OK_Ordinary, true, true, true,
((Base && Base->containsUnexpandedParameterPack()) ||
(QualifierLoc &&
QualifierLoc.getNestedNameSpecifier()->
@@ -874,6 +914,8 @@ UnresolvedMemberExpr::UnresolvedMemberExpr(ASTContext &C,
// Dependent
((Base && Base->isTypeDependent()) ||
BaseType->isDependentType()),
+ ((Base && Base->isInstantiationDependent()) ||
+ BaseType->isInstantiationDependentType()),
// Contains unexpanded parameter pack
((Base && Base->containsUnexpandedParameterPack()) ||
BaseType->containsUnexpandedParameterPack())),
@@ -962,7 +1004,7 @@ SubstNonTypeTemplateParmPackExpr(QualType T,
SourceLocation NameLoc,
const TemplateArgument &ArgPack)
: Expr(SubstNonTypeTemplateParmPackExprClass, T, VK_RValue, OK_Ordinary,
- true, false, true),
+ true, true, true, true),
Param(Param), Arguments(ArgPack.pack_begin()),
NumArguments(ArgPack.pack_size()), NameLoc(NameLoc) { }
diff --git a/contrib/llvm/tools/clang/lib/AST/ExprClassification.cpp b/contrib/llvm/tools/clang/lib/AST/ExprClassification.cpp
index d177cb5..e7888a6 100644
--- a/contrib/llvm/tools/clang/lib/AST/ExprClassification.cpp
+++ b/contrib/llvm/tools/clang/lib/AST/ExprClassification.cpp
@@ -117,7 +117,6 @@ static Cl::Kinds ClassifyInternal(ASTContext &Ctx, const Expr *E) {
case Expr::UnresolvedLookupExprClass:
case Expr::UnresolvedMemberExprClass:
case Expr::CXXDependentScopeMemberExprClass:
- case Expr::CXXUnresolvedConstructExprClass:
case Expr::DependentScopeDeclRefExprClass:
// ObjC instance variables are lvalues
// FIXME: ObjC++0x might have different rules
@@ -162,9 +161,13 @@ static Cl::Kinds ClassifyInternal(ASTContext &Ctx, const Expr *E) {
case Expr::SizeOfPackExprClass:
case Expr::SubstNonTypeTemplateParmPackExprClass:
case Expr::AsTypeExprClass:
+ case Expr::ObjCIndirectCopyRestoreExprClass:
return Cl::CL_PRValue;
// Next come the complicated cases.
+ case Expr::SubstNonTypeTemplateParmExprClass:
+ return ClassifyInternal(Ctx,
+ cast<SubstNonTypeTemplateParmExpr>(E)->getReplacement());
// C++ [expr.sub]p1: The result is an lvalue of type "T".
// However, subscripting vector types is more like member access.
@@ -289,10 +292,15 @@ static Cl::Kinds ClassifyInternal(ASTContext &Ctx, const Expr *E) {
case Expr::CXXDynamicCastExprClass:
case Expr::CXXReinterpretCastExprClass:
case Expr::CXXConstCastExprClass:
+ case Expr::ObjCBridgedCastExprClass:
// Only in C++ can casts be interesting at all.
if (!Lang.CPlusPlus) return Cl::CL_PRValue;
return ClassifyUnnamed(Ctx, cast<ExplicitCastExpr>(E)->getTypeAsWritten());
+ case Expr::CXXUnresolvedConstructExprClass:
+ return ClassifyUnnamed(Ctx,
+ cast<CXXUnresolvedConstructExpr>(E)->getTypeAsWritten());
+
case Expr::BinaryConditionalOperatorClass: {
if (!Lang.CPlusPlus) return Cl::CL_PRValue;
const BinaryConditionalOperator *co = cast<BinaryConditionalOperator>(E);
@@ -339,6 +347,11 @@ static Cl::Kinds ClassifyInternal(ASTContext &Ctx, const Expr *E) {
case Expr::PackExpansionExprClass:
return ClassifyInternal(Ctx, cast<PackExpansionExpr>(E)->getPattern());
+
+ case Expr::MaterializeTemporaryExprClass:
+ return cast<MaterializeTemporaryExpr>(E)->isBoundToLvalueReference()
+ ? Cl::CL_LValue
+ : Cl::CL_XValue;
}
llvm_unreachable("unhandled expression kind in classification");
diff --git a/contrib/llvm/tools/clang/lib/AST/ExprConstant.cpp b/contrib/llvm/tools/clang/lib/AST/ExprConstant.cpp
index 06c5645..786155a 100644
--- a/contrib/llvm/tools/clang/lib/AST/ExprConstant.cpp
+++ b/contrib/llvm/tools/clang/lib/AST/ExprConstant.cpp
@@ -224,11 +224,10 @@ static APSInt HandleFloatToIntCast(QualType DestType, QualType SrcType,
bool DestSigned = DestType->isSignedIntegerOrEnumerationType();
// FIXME: Warning for overflow.
- uint64_t Space[4];
+ APSInt Result(DestWidth, !DestSigned);
bool ignored;
- (void)Value.convertToInteger(Space, DestWidth, DestSigned,
- llvm::APFloat::rmTowardZero, &ignored);
- return APSInt(llvm::APInt(DestWidth, 4, Space), !DestSigned);
+ (void)Value.convertToInteger(Result, llvm::APFloat::rmTowardZero, &ignored);
+ return Result;
}
static APFloat HandleFloatToFloatCast(QualType DestType, QualType SrcType,
@@ -282,6 +281,17 @@ public:
return true;
return false;
}
+ bool VisitObjCIvarRefExpr(const ObjCIvarRefExpr *E) {
+ if (Info.Ctx.getCanonicalType(E->getType()).isVolatileQualified())
+ return true;
+ return false;
+ }
+ bool VisitBlockDeclRefExpr (const BlockDeclRefExpr *E) {
+ if (Info.Ctx.getCanonicalType(E->getType()).isVolatileQualified())
+ return true;
+ return false;
+ }
+
// We don't want to evaluate BlockExprs multiple times, as they generate
// a ton of code.
bool VisitBlockExpr(const BlockExpr *E) { return true; }
@@ -395,6 +405,8 @@ public:
{ return StmtVisitorTy::Visit(E->getChosenSubExpr(Info.Ctx)); }
RetTy VisitGenericSelectionExpr(const GenericSelectionExpr *E)
{ return StmtVisitorTy::Visit(E->getResultExpr()); }
+ RetTy VisitSubstNonTypeTemplateParmExpr(const SubstNonTypeTemplateParmExpr *E)
+ { return StmtVisitorTy::Visit(E->getReplacement()); }
RetTy VisitBinaryConditionalOperator(const BinaryConditionalOperator *E) {
OpaqueValueEvaluation opaque(Info, E->getOpaqueValue(), E->getCommon());
@@ -525,15 +537,7 @@ bool LValueExprEvaluator::VisitMemberExpr(const MemberExpr *E) {
if (FD->getType()->isReferenceType())
return false;
- // FIXME: This is linear time.
- unsigned i = 0;
- for (RecordDecl::field_iterator Field = RD->field_begin(),
- FieldEnd = RD->field_end();
- Field != FieldEnd; (void)++Field, ++i) {
- if (*Field == FD)
- break;
- }
-
+ unsigned i = FD->getFieldIndex();
Result.Offset += Info.Ctx.toCharUnitsFromBits(RL.getFieldOffset(i));
return true;
}
@@ -945,7 +949,7 @@ public:
: ExprEvaluatorBaseTy(info), Result(result) {}
bool Success(const llvm::APSInt &SI, const Expr *E) {
- assert(E->getType()->isIntegralOrEnumerationType() &&
+ assert(E->getType()->isIntegralOrEnumerationType() &&
"Invalid evaluation result.");
assert(SI.isSigned() == E->getType()->isSignedIntegerOrEnumerationType() &&
"Invalid evaluation result.");
@@ -1095,8 +1099,25 @@ static bool EvaluateInteger(const Expr* E, APSInt &Result, EvalInfo &Info) {
bool IntExprEvaluator::CheckReferencedDecl(const Expr* E, const Decl* D) {
// Enums are integer constant exprs.
- if (const EnumConstantDecl *ECD = dyn_cast<EnumConstantDecl>(D))
- return Success(ECD->getInitVal(), E);
+ if (const EnumConstantDecl *ECD = dyn_cast<EnumConstantDecl>(D)) {
+ // Check for signedness/width mismatches between E type and ECD value.
+ bool SameSign = (ECD->getInitVal().isSigned()
+ == E->getType()->isSignedIntegerOrEnumerationType());
+ bool SameWidth = (ECD->getInitVal().getBitWidth()
+ == Info.Ctx.getIntWidth(E->getType()));
+ if (SameSign && SameWidth)
+ return Success(ECD->getInitVal(), E);
+ else {
+ // Get rid of mismatch (otherwise Success assertions will fail)
+ // by computing a new value matching the type of E.
+ llvm::APSInt Val = ECD->getInitVal();
+ if (!SameSign)
+ Val.setIsSigned(!ECD->getInitVal().isSigned());
+ if (!SameWidth)
+ Val = Val.extOrTrunc(Info.Ctx.getIntWidth(E->getType()));
+ return Success(Val, E);
+ }
+ }
// In C++, const, non-volatile integers initialized with ICEs are ICEs.
// In C, they can also be folded, although they are not ICEs.
@@ -1797,6 +1818,9 @@ bool IntExprEvaluator::VisitCastExpr(const CastExpr *E) {
case CK_GetObjCProperty:
case CK_LValueBitCast:
case CK_UserDefinedConversion:
+ case CK_ObjCProduceObject:
+ case CK_ObjCConsumeObject:
+ case CK_ObjCReclaimReturnedObject:
return false;
case CK_LValueToRValue:
@@ -2301,6 +2325,9 @@ bool ComplexExprEvaluator::VisitCastExpr(const CastExpr *E) {
case CK_FloatingComplexToBoolean:
case CK_IntegralComplexToReal:
case CK_IntegralComplexToBoolean:
+ case CK_ObjCProduceObject:
+ case CK_ObjCConsumeObject:
+ case CK_ObjCReclaimReturnedObject:
llvm_unreachable("invalid cast kind for complex value");
case CK_LValueToRValue:
@@ -2771,6 +2798,8 @@ static ICEDiag CheckICE(const Expr* E, ASTContext &Ctx) {
case Expr::PackExpansionExprClass:
case Expr::SubstNonTypeTemplateParmPackExprClass:
case Expr::AsTypeExprClass:
+ case Expr::ObjCIndirectCopyRestoreExprClass:
+ case Expr::MaterializeTemporaryExprClass:
return ICEDiag(2, E->getLocStart());
case Expr::SizeOfPackExprClass:
@@ -2778,6 +2807,10 @@ static ICEDiag CheckICE(const Expr* E, ASTContext &Ctx) {
// GCC considers the GNU __null value to be an integral constant expression.
return NoDiag();
+ case Expr::SubstNonTypeTemplateParmExprClass:
+ return
+ CheckICE(cast<SubstNonTypeTemplateParmExpr>(E)->getReplacement(), Ctx);
+
case Expr::ParenExprClass:
return CheckICE(cast<ParenExpr>(E)->getSubExpr(), Ctx);
case Expr::GenericSelectionExprClass:
@@ -2995,7 +3028,8 @@ static ICEDiag CheckICE(const Expr* E, ASTContext &Ctx) {
case Expr::CXXFunctionalCastExprClass:
case Expr::CXXStaticCastExprClass:
case Expr::CXXReinterpretCastExprClass:
- case Expr::CXXConstCastExprClass: {
+ case Expr::CXXConstCastExprClass:
+ case Expr::ObjCBridgedCastExprClass: {
const Expr *SubExpr = cast<CastExpr>(E)->getSubExpr();
if (SubExpr->getType()->isIntegralOrEnumerationType())
return CheckICE(SubExpr, Ctx);
diff --git a/contrib/llvm/tools/clang/lib/AST/ExternalASTSource.cpp b/contrib/llvm/tools/clang/lib/AST/ExternalASTSource.cpp
index f428318..b96d65a 100644
--- a/contrib/llvm/tools/clang/lib/AST/ExternalASTSource.cpp
+++ b/contrib/llvm/tools/clang/lib/AST/ExternalASTSource.cpp
@@ -51,11 +51,11 @@ ExternalASTSource::FindExternalVisibleDeclsByName(const DeclContext *DC,
void ExternalASTSource::MaterializeVisibleDecls(const DeclContext *DC) { }
-bool
+ExternalLoadResult
ExternalASTSource::FindExternalLexicalDecls(const DeclContext *DC,
bool (*isKindWeWant)(Decl::Kind),
llvm::SmallVectorImpl<Decl*> &Result) {
- return true;
+ return ELR_AlreadyLoaded;
}
void ExternalASTSource::getMemoryBufferSizes(MemoryBufferSizes &sizes) const { }
diff --git a/contrib/llvm/tools/clang/lib/AST/ItaniumMangle.cpp b/contrib/llvm/tools/clang/lib/AST/ItaniumMangle.cpp
index e81ec7e..ec9863b 100644
--- a/contrib/llvm/tools/clang/lib/AST/ItaniumMangle.cpp
+++ b/contrib/llvm/tools/clang/lib/AST/ItaniumMangle.cpp
@@ -21,6 +21,7 @@
#include "clang/AST/DeclObjC.h"
#include "clang/AST/DeclTemplate.h"
#include "clang/AST/ExprCXX.h"
+#include "clang/AST/ExprObjC.h"
#include "clang/AST/TypeLoc.h"
#include "clang/Basic/ABI.h"
#include "clang/Basic/SourceManager.h"
@@ -236,6 +237,9 @@ private:
bool mangleSubstitution(TemplateName Template);
bool mangleSubstitution(uintptr_t Ptr);
+ void mangleExistingSubstitution(QualType type);
+ void mangleExistingSubstitution(TemplateName name);
+
bool mangleStandardSubstitution(const NamedDecl *ND);
void addSubstitution(const NamedDecl *ND) {
@@ -255,9 +259,6 @@ private:
DeclarationName name,
unsigned KnownArity = UnknownArity);
- static bool isUnresolvedType(const Type *type);
- void mangleUnresolvedType(const Type *type);
-
void mangleName(const TemplateDecl *TD,
const TemplateArgument *TemplateArgs,
unsigned NumTemplateArgs);
@@ -318,7 +319,7 @@ private:
unsigned NumTemplateArgs);
void mangleTemplateArgs(const TemplateParameterList &PL,
const TemplateArgumentList &AL);
- void mangleTemplateArg(const NamedDecl *P, const TemplateArgument &A);
+ void mangleTemplateArg(const NamedDecl *P, TemplateArgument A);
void mangleUnresolvedTemplateArgs(const TemplateArgument *args,
unsigned numArgs);
@@ -451,13 +452,8 @@ void CXXNameMangler::mangleFunctionEncoding(const FunctionDecl *FD) {
FD = PrimaryTemplate->getTemplatedDecl();
}
- // Do the canonicalization out here because parameter types can
- // undergo additional canonicalization (e.g. array decay).
- const FunctionType *FT
- = cast<FunctionType>(Context.getASTContext()
- .getCanonicalType(FD->getType()));
-
- mangleBareFunctionType(FT, MangleReturnType);
+ mangleBareFunctionType(FD->getType()->getAs<FunctionType>(),
+ MangleReturnType);
}
static const DeclContext *IgnoreLinkageSpecDecls(const DeclContext *DC) {
@@ -597,19 +593,13 @@ void CXXNameMangler::mangleUnscopedTemplateName(TemplateName Template) {
if (mangleSubstitution(Template))
return;
- // FIXME: How to cope with operators here?
DependentTemplateName *Dependent = Template.getAsDependentTemplateName();
assert(Dependent && "Not a dependent template name?");
- if (!Dependent->isIdentifier()) {
- // FIXME: We can't possibly know the arity of the operator here!
- Diagnostic &Diags = Context.getDiags();
- unsigned DiagID = Diags.getCustomDiagID(Diagnostic::Error,
- "cannot mangle dependent operator name");
- Diags.Report(DiagID);
- return;
- }
+ if (const IdentifierInfo *Id = Dependent->getIdentifier())
+ mangleSourceName(Id);
+ else
+ mangleOperatorName(Dependent->getOperator(), UnknownArity);
- mangleSourceName(Dependent->getIdentifier());
addSubstitution(Template);
}
@@ -702,31 +692,6 @@ void CXXNameMangler::manglePrefix(QualType type) {
}
}
-/// Returns true if the given type, appearing within an
-/// unresolved-name, should be mangled as an unresolved-type.
-bool CXXNameMangler::isUnresolvedType(const Type *type) {
- // <unresolved-type> ::= <template-param>
- // ::= <decltype>
- // ::= <template-template-param> <template-args>
- // (this last is not official yet)
-
- if (isa<TemplateTypeParmType>(type)) return true;
- if (isa<DecltypeType>(type)) return true;
- // typeof?
- if (const TemplateSpecializationType *tst =
- dyn_cast<TemplateSpecializationType>(type)) {
- TemplateDecl *temp = tst->getTemplateName().getAsTemplateDecl();
- if (temp && isa<TemplateTemplateParmDecl>(temp))
- return true;
- }
- return false;
-}
-
-void CXXNameMangler::mangleUnresolvedType(const Type *type) {
- // This seems to be do everything we want.
- mangleType(QualType(type, 0));
-}
-
/// Mangle everything prior to the base-unresolved-name in an unresolved-name.
///
/// \param firstQualifierLookup - the entity found by unqualified lookup
@@ -794,45 +759,141 @@ void CXXNameMangler::mangleUnresolvedPrefix(NestedNameSpecifier *qualifier,
} else {
// Otherwise, all the cases want this.
Out << "sr";
+ }
+
+ // Only certain other types are valid as prefixes; enumerate them.
+ switch (type->getTypeClass()) {
+ case Type::Builtin:
+ case Type::Complex:
+ case Type::Pointer:
+ case Type::BlockPointer:
+ case Type::LValueReference:
+ case Type::RValueReference:
+ case Type::MemberPointer:
+ case Type::ConstantArray:
+ case Type::IncompleteArray:
+ case Type::VariableArray:
+ case Type::DependentSizedArray:
+ case Type::DependentSizedExtVector:
+ case Type::Vector:
+ case Type::ExtVector:
+ case Type::FunctionProto:
+ case Type::FunctionNoProto:
+ case Type::Enum:
+ case Type::Paren:
+ case Type::Elaborated:
+ case Type::Attributed:
+ case Type::Auto:
+ case Type::PackExpansion:
+ case Type::ObjCObject:
+ case Type::ObjCInterface:
+ case Type::ObjCObjectPointer:
+ llvm_unreachable("type is illegal as a nested name specifier");
+
+ case Type::SubstTemplateTypeParmPack:
+ // FIXME: not clear how to mangle this!
+ // template <class T...> class A {
+ // template <class U...> void foo(decltype(T::foo(U())) x...);
+ // };
+ Out << "_SUBSTPACK_";
+ break;
+
+ // <unresolved-type> ::= <template-param>
+ // ::= <decltype>
+ // ::= <template-template-param> <template-args>
+ // (this last is not official yet)
+ case Type::TypeOfExpr:
+ case Type::TypeOf:
+ case Type::Decltype:
+ case Type::TemplateTypeParm:
+ case Type::UnaryTransform:
+ case Type::SubstTemplateTypeParm:
+ unresolvedType:
+ assert(!qualifier->getPrefix());
+
+ // We only get here recursively if we're followed by identifiers.
+ if (recursive) Out << 'N';
+
+ // This seems to do everything we want. It's not really
+ // sanctioned for a substituted template parameter, though.
+ mangleType(QualType(type, 0));
+
+ // We never want to print 'E' directly after an unresolved-type,
+ // so we return directly.
+ return;
+
+ case Type::Typedef:
+ mangleSourceName(cast<TypedefType>(type)->getDecl()->getIdentifier());
+ break;
+
+ case Type::UnresolvedUsing:
+ mangleSourceName(cast<UnresolvedUsingType>(type)->getDecl()
+ ->getIdentifier());
+ break;
- if (isUnresolvedType(type)) {
- // We only get here recursively if we're followed by identifiers.
- if (recursive) Out << 'N';
- mangleUnresolvedType(type);
+ case Type::Record:
+ mangleSourceName(cast<RecordType>(type)->getDecl()->getIdentifier());
+ break;
- // We never want to print 'E' directly after an unresolved-type,
- // so we return directly.
- return;
+ case Type::TemplateSpecialization: {
+ const TemplateSpecializationType *tst
+ = cast<TemplateSpecializationType>(type);
+ TemplateName name = tst->getTemplateName();
+ switch (name.getKind()) {
+ case TemplateName::Template:
+ case TemplateName::QualifiedTemplate: {
+ TemplateDecl *temp = name.getAsTemplateDecl();
+
+ // If the base is a template template parameter, this is an
+ // unresolved type.
+ assert(temp && "no template for template specialization type");
+ if (isa<TemplateTemplateParmDecl>(temp)) goto unresolvedType;
+
+ mangleSourceName(temp->getIdentifier());
+ break;
}
- }
- assert(!isUnresolvedType(type));
+ case TemplateName::OverloadedTemplate:
+ case TemplateName::DependentTemplate:
+ llvm_unreachable("invalid base for a template specialization type");
+
+ case TemplateName::SubstTemplateTemplateParm: {
+ SubstTemplateTemplateParmStorage *subst
+ = name.getAsSubstTemplateTemplateParm();
+ mangleExistingSubstitution(subst->getReplacement());
+ break;
+ }
+
+ case TemplateName::SubstTemplateTemplateParmPack: {
+ // FIXME: not clear how to mangle this!
+ // template <template <class U> class T...> class A {
+ // template <class U...> void foo(decltype(T<U>::foo) x...);
+ // };
+ Out << "_SUBSTPACK_";
+ break;
+ }
+ }
- // Only certain other types are valid as prefixes; enumerate them.
- // FIXME: can we get ElaboratedTypes here?
- // FIXME: SubstTemplateTypeParmType?
- if (const TagType *t = dyn_cast<TagType>(type)) {
- mangleSourceName(t->getDecl()->getIdentifier());
- } else if (const TypedefType *t = dyn_cast<TypedefType>(type)) {
- mangleSourceName(t->getDecl()->getIdentifier());
- } else if (const UnresolvedUsingType *t
- = dyn_cast<UnresolvedUsingType>(type)) {
- mangleSourceName(t->getDecl()->getIdentifier());
- } else if (const DependentNameType *t
- = dyn_cast<DependentNameType>(type)) {
- mangleSourceName(t->getIdentifier());
- } else if (const TemplateSpecializationType *tst
- = dyn_cast<TemplateSpecializationType>(type)) {
- TemplateDecl *temp = tst->getTemplateName().getAsTemplateDecl();
- assert(temp && "no template for template specialization type");
- mangleSourceName(temp->getIdentifier());
mangleUnresolvedTemplateArgs(tst->getArgs(), tst->getNumArgs());
- } else if (const DependentTemplateSpecializationType *tst
- = dyn_cast<DependentTemplateSpecializationType>(type)) {
+ break;
+ }
+
+ case Type::InjectedClassName:
+ mangleSourceName(cast<InjectedClassNameType>(type)->getDecl()
+ ->getIdentifier());
+ break;
+
+ case Type::DependentName:
+ mangleSourceName(cast<DependentNameType>(type)->getIdentifier());
+ break;
+
+ case Type::DependentTemplateSpecialization: {
+ const DependentTemplateSpecializationType *tst
+ = cast<DependentTemplateSpecializationType>(type);
mangleSourceName(tst->getIdentifier());
mangleUnresolvedTemplateArgs(tst->getArgs(), tst->getNumArgs());
- } else {
- llvm_unreachable("unexpected type in nested name specifier!");
+ break;
+ }
}
break;
}
@@ -1036,7 +1097,7 @@ void CXXNameMangler::mangleUnqualifiedName(const NamedDecl *ND,
case DeclarationName::CXXConversionFunctionName:
// <operator-name> ::= cv <type> # (cast)
Out << "cv";
- mangleType(Context.getASTContext().getCanonicalType(Name.getCXXNameType()));
+ mangleType(Name.getCXXNameType());
break;
case DeclarationName::CXXOperatorName: {
@@ -1323,10 +1384,23 @@ void CXXNameMangler::mangleType(TemplateName TN) {
break;
}
+ case TemplateName::SubstTemplateTemplateParm: {
+ // Substituted template parameters are mangled as the substituted
+ // template. This will check for the substitution twice, which is
+ // fine, but we have to return early so that we don't try to *add*
+ // the substitution twice.
+ SubstTemplateTemplateParmStorage *subst
+ = TN.getAsSubstTemplateTemplateParm();
+ mangleType(subst->getReplacement());
+ return;
+ }
+
case TemplateName::SubstTemplateTemplateParmPack: {
- SubstTemplateTemplateParmPackStorage *SubstPack
- = TN.getAsSubstTemplateTemplateParmPack();
- mangleTemplateParameter(SubstPack->getParameterPack()->getIndex());
+ // FIXME: not clear how to mangle this!
+ // template <template <class> class T...> class A {
+ // template <template <class> class U...> void foo(B<T,U> x...);
+ // };
+ Out << "_SUBSTPACK_";
break;
}
}
@@ -1464,7 +1538,40 @@ void CXXNameMangler::mangleQualifiers(Qualifiers Quals) {
Out << 'U' << ASString.size() << ASString;
}
- // FIXME: For now, just drop all extension qualifiers on the floor.
+ llvm::StringRef LifetimeName;
+ switch (Quals.getObjCLifetime()) {
+ // Objective-C ARC Extension:
+ //
+ // <type> ::= U "__strong"
+ // <type> ::= U "__weak"
+ // <type> ::= U "__autoreleasing"
+ case Qualifiers::OCL_None:
+ break;
+
+ case Qualifiers::OCL_Weak:
+ LifetimeName = "__weak";
+ break;
+
+ case Qualifiers::OCL_Strong:
+ LifetimeName = "__strong";
+ break;
+
+ case Qualifiers::OCL_Autoreleasing:
+ LifetimeName = "__autoreleasing";
+ break;
+
+ case Qualifiers::OCL_ExplicitNone:
+ // The __unsafe_unretained qualifier is *not* mangled, so that
+ // __unsafe_unretained types in ARC produce the same manglings as the
+ // equivalent (but, naturally, unqualified) types in non-ARC, providing
+ // better ABI compatibility.
+ //
+ // It's safe to do this because unqualified 'id' won't show up
+ // in any type signatures that need to be mangled.
+ break;
+ }
+ if (!LifetimeName.empty())
+ Out << 'U' << LifetimeName.size() << LifetimeName;
}
void CXXNameMangler::mangleRefQualifier(RefQualifierKind RefQualifier) {
@@ -1489,26 +1596,59 @@ void CXXNameMangler::mangleObjCMethodName(const ObjCMethodDecl *MD) {
Context.mangleObjCMethodName(MD, Out);
}
-void CXXNameMangler::mangleType(QualType nonCanon) {
- // Only operate on the canonical type!
- QualType canon = nonCanon.getCanonicalType();
-
- SplitQualType split = canon.split();
+void CXXNameMangler::mangleType(QualType T) {
+ // If our type is instantiation-dependent but not dependent, we mangle
+ // it as it was written in the source, removing any top-level sugar.
+ // Otherwise, use the canonical type.
+ //
+ // FIXME: This is an approximation of the instantiation-dependent name
+ // mangling rules, since we should really be using the type as written and
+ // augmented via semantic analysis (i.e., with implicit conversions and
+ // default template arguments) for any instantiation-dependent type.
+ // Unfortunately, that requires several changes to our AST:
+ // - Instantiation-dependent TemplateSpecializationTypes will need to be
+ // uniqued, so that we can handle substitutions properly
+ // - Default template arguments will need to be represented in the
+ // TemplateSpecializationType, since they need to be mangled even though
+ // they aren't written.
+ // - Conversions on non-type template arguments need to be expressed, since
+ // they can affect the mangling of sizeof/alignof.
+ if (!T->isInstantiationDependentType() || T->isDependentType())
+ T = T.getCanonicalType();
+ else {
+ // Desugar any types that are purely sugar.
+ do {
+ // Don't desugar through template specialization types that aren't
+ // type aliases. We need to mangle the template arguments as written.
+ if (const TemplateSpecializationType *TST
+ = dyn_cast<TemplateSpecializationType>(T))
+ if (!TST->isTypeAlias())
+ break;
+
+ QualType Desugared
+ = T.getSingleStepDesugaredType(Context.getASTContext());
+ if (Desugared == T)
+ break;
+
+ T = Desugared;
+ } while (true);
+ }
+ SplitQualType split = T.split();
Qualifiers quals = split.second;
const Type *ty = split.first;
- bool isSubstitutable = quals || !isa<BuiltinType>(ty);
- if (isSubstitutable && mangleSubstitution(canon))
+ bool isSubstitutable = quals || !isa<BuiltinType>(T);
+ if (isSubstitutable && mangleSubstitution(T))
return;
// If we're mangling a qualified array type, push the qualifiers to
// the element type.
- if (quals && isa<ArrayType>(ty)) {
- ty = Context.getASTContext().getAsArrayType(canon);
+ if (quals && isa<ArrayType>(T)) {
+ ty = Context.getASTContext().getAsArrayType(T);
quals = Qualifiers();
- // Note that we don't update canon: we want to add the
- // substitution at the canonical type.
+ // Note that we don't update T: we want to add the
+ // substitution at the original type.
}
if (quals) {
@@ -1533,7 +1673,7 @@ void CXXNameMangler::mangleType(QualType nonCanon) {
// Add the substitution.
if (isSubstitutable)
- addSubstitution(canon);
+ addSubstitution(T);
}
void CXXNameMangler::mangleNameOrStandardSubstitution(const NamedDecl *ND) {
@@ -1647,7 +1787,7 @@ void CXXNameMangler::mangleBareFunctionType(const FunctionType *T,
for (FunctionProtoType::arg_type_iterator Arg = Proto->arg_type_begin(),
ArgEnd = Proto->arg_type_end();
Arg != ArgEnd; ++Arg)
- mangleType(*Arg);
+ mangleType(Context.getASTContext().getSignatureParameterType(*Arg));
FunctionTypeDepth.pop(saved);
@@ -1737,7 +1877,11 @@ void CXXNameMangler::mangleType(const TemplateTypeParmType *T) {
// <type> ::= <template-param>
void CXXNameMangler::mangleType(const SubstTemplateTypeParmPackType *T) {
- mangleTemplateParameter(T->getReplacedParameter()->getIndex());
+ // FIXME: not clear how to mangle this!
+ // template <class T...> class A {
+ // template <class U...> void foo(T(*)(U) x...);
+ // };
+ Out << "_SUBSTPACK_";
}
// <type> ::= P <type> # pointer-to
@@ -2052,6 +2196,9 @@ void CXXNameMangler::mangleExpression(const Expr *E, unsigned Arity) {
// <expr-primary> ::= L <type> <value number> E # integer literal
// ::= L <type <value float> E # floating literal
// ::= L <mangled-name> E # external name
+ QualType ImplicitlyConvertedToType;
+
+recurse:
switch (E->getStmtClass()) {
case Expr::NoStmtClass:
#define ABSTRACT_STMT(Type)
@@ -2089,6 +2236,7 @@ void CXXNameMangler::mangleExpression(const Expr *E, unsigned Arity) {
case Expr::ObjCProtocolExprClass:
case Expr::ObjCSelectorExprClass:
case Expr::ObjCStringLiteralClass:
+ case Expr::ObjCIndirectCopyRestoreExprClass:
case Expr::OffsetOfExprClass:
case Expr::PredefinedExprClass:
case Expr::ShuffleVectorExprClass:
@@ -2131,6 +2279,11 @@ void CXXNameMangler::mangleExpression(const Expr *E, unsigned Arity) {
mangleExpression(cast<CXXDefaultArgExpr>(E)->getExpr(), Arity);
break;
+ case Expr::SubstNonTypeTemplateParmExprClass:
+ mangleExpression(cast<SubstNonTypeTemplateParmExpr>(E)->getReplacement(),
+ Arity);
+ break;
+
case Expr::CXXMemberCallExprClass: // fallthrough
case Expr::CallExprClass: {
const CallExpr *CE = cast<CallExpr>(E);
@@ -2209,6 +2362,10 @@ void CXXNameMangler::mangleExpression(const Expr *E, unsigned Arity) {
case Expr::UnresolvedLookupExprClass: {
const UnresolvedLookupExpr *ULE = cast<UnresolvedLookupExpr>(E);
mangleUnresolvedName(ULE->getQualifier(), 0, ULE->getName(), Arity);
+
+ // All the <unresolved-name> productions end in a
+ // base-unresolved-name, where <template-args> are just tacked
+ // onto the end.
if (ULE->hasExplicitTemplateArgs())
mangleTemplateArgs(ULE->getExplicitTemplateArgs());
break;
@@ -2241,6 +2398,23 @@ void CXXNameMangler::mangleExpression(const Expr *E, unsigned Arity) {
case Expr::UnaryExprOrTypeTraitExprClass: {
const UnaryExprOrTypeTraitExpr *SAE = cast<UnaryExprOrTypeTraitExpr>(E);
+
+ if (!SAE->isInstantiationDependent()) {
+ // Itanium C++ ABI:
+ // If the operand of a sizeof or alignof operator is not
+ // instantiation-dependent it is encoded as an integer literal
+ // reflecting the result of the operator.
+ //
+ // If the result of the operator is implicitly converted to a known
+ // integer type, that type is used for the literal; otherwise, the type
+ // of std::size_t or std::ptrdiff_t is used.
+ QualType T = (ImplicitlyConvertedToType.isNull() ||
+ !ImplicitlyConvertedToType->isIntegerType())? SAE->getType()
+ : ImplicitlyConvertedToType;
+ mangleIntegerLiteral(T, SAE->EvaluateAsInt(Context.getASTContext()));
+ break;
+ }
+
switch(SAE->getKind()) {
case UETT_SizeOf:
Out << 's';
@@ -2344,10 +2518,19 @@ void CXXNameMangler::mangleExpression(const Expr *E, unsigned Arity) {
}
case Expr::ImplicitCastExprClass: {
- mangleExpression(cast<ImplicitCastExpr>(E)->getSubExpr(), Arity);
- break;
+ ImplicitlyConvertedToType = E->getType();
+ E = cast<ImplicitCastExpr>(E)->getSubExpr();
+ goto recurse;
}
-
+
+ case Expr::ObjCBridgedCastExprClass: {
+ // Mangle ownership casts as a vendor extended operator __bridge,
+ // __bridge_transfer, or __bridge_retain.
+ llvm::StringRef Kind = cast<ObjCBridgedCastExpr>(E)->getBridgeKindName();
+ Out << "v1U" << Kind.size() << Kind;
+ }
+ // Fall through to mangle the cast itself.
+
case Expr::CStyleCastExprClass:
case Expr::CXXStaticCastExprClass:
case Expr::CXXDynamicCastExprClass:
@@ -2408,35 +2591,22 @@ void CXXNameMangler::mangleExpression(const Expr *E, unsigned Arity) {
}
case Expr::SubstNonTypeTemplateParmPackExprClass:
- mangleTemplateParameter(
- cast<SubstNonTypeTemplateParmPackExpr>(E)->getParameterPack()->getIndex());
+ // FIXME: not clear how to mangle this!
+ // template <unsigned N...> class A {
+ // template <class U...> void foo(U (&x)[N]...);
+ // };
+ Out << "_SUBSTPACK_";
break;
case Expr::DependentScopeDeclRefExprClass: {
const DependentScopeDeclRefExpr *DRE = cast<DependentScopeDeclRefExpr>(E);
- NestedNameSpecifier *NNS = DRE->getQualifier();
- const Type *QTy = NNS->getAsType();
-
- // When we're dealing with a nested-name-specifier that has just a
- // dependent identifier in it, mangle that as a typename. FIXME:
- // It isn't clear that we ever actually want to have such a
- // nested-name-specifier; why not just represent it as a typename type?
- if (!QTy && NNS->getAsIdentifier() && NNS->getPrefix()) {
- QTy = getASTContext().getDependentNameType(ETK_Typename,
- NNS->getPrefix(),
- NNS->getAsIdentifier())
- .getTypePtr();
- }
- assert(QTy && "Qualifier was not type!");
+ mangleUnresolvedName(DRE->getQualifier(), 0, DRE->getDeclName(), Arity);
- // ::= sr <type> <unqualified-name> # dependent name
- // ::= sr <type> <unqualified-name> <template-args> # dependent template-id
- Out << "sr";
- mangleType(QualType(QTy, 0));
- mangleUnqualifiedName(0, DRE->getDeclName(), Arity);
+ // All the <unresolved-name> productions end in a
+ // base-unresolved-name, where <template-args> are just tacked
+ // onto the end.
if (DRE->hasExplicitTemplateArgs())
mangleTemplateArgs(DRE->getExplicitTemplateArgs());
-
break;
}
@@ -2537,15 +2707,13 @@ void CXXNameMangler::mangleExpression(const Expr *E, unsigned Arity) {
else if (const TemplateTemplateParmDecl *TempTP
= dyn_cast<TemplateTemplateParmDecl>(Pack))
mangleTemplateParameter(TempTP->getIndex());
- else {
- // Note: proposed by Mike Herrick on 11/30/10
- // <expression> ::= sZ <function-param> # size of function parameter pack
- Diagnostic &Diags = Context.getDiags();
- unsigned DiagID = Diags.getCustomDiagID(Diagnostic::Error,
- "cannot mangle sizeof...(function parameter pack)");
- Diags.Report(DiagID);
- return;
- }
+ else
+ mangleFunctionParam(cast<ParmVarDecl>(Pack));
+ break;
+ }
+
+ case Expr::MaterializeTemporaryExprClass: {
+ mangleExpression(cast<MaterializeTemporaryExpr>(E)->GetTemporaryExpr());
break;
}
}
@@ -2696,12 +2864,15 @@ void CXXNameMangler::mangleTemplateArgs(const TemplateParameterList &PL,
}
void CXXNameMangler::mangleTemplateArg(const NamedDecl *P,
- const TemplateArgument &A) {
+ TemplateArgument A) {
// <template-arg> ::= <type> # type or template
// ::= X <expression> E # expression
// ::= <expr-primary> # simple expressions
// ::= J <template-arg>* E # argument pack
- // ::= sp <expression> # pack expansion of (C++0x)
+ // ::= sp <expression> # pack expansion of (C++0x)
+ if (!A.isInstantiationDependent() || A.isDependent())
+ A = Context.getASTContext().getCanonicalTemplateArgument(A);
+
switch (A.getKind()) {
case TemplateArgument::Null:
llvm_unreachable("Cannot mangle NULL template argument");
@@ -2780,6 +2951,18 @@ void CXXNameMangler::mangleTemplateParameter(unsigned Index) {
Out << 'T' << (Index - 1) << '_';
}
+void CXXNameMangler::mangleExistingSubstitution(QualType type) {
+ bool result = mangleSubstitution(type);
+ assert(result && "no existing substitution for type");
+ (void) result;
+}
+
+void CXXNameMangler::mangleExistingSubstitution(TemplateName tname) {
+ bool result = mangleSubstitution(tname);
+ assert(result && "no existing substitution for template name");
+ (void) result;
+}
+
// <substitution> ::= S <seq-id> _
// ::= S_
bool CXXNameMangler::mangleSubstitution(const NamedDecl *ND) {
diff --git a/contrib/llvm/tools/clang/lib/AST/NestedNameSpecifier.cpp b/contrib/llvm/tools/clang/lib/AST/NestedNameSpecifier.cpp
index 2878dff..f6d4f25 100644
--- a/contrib/llvm/tools/clang/lib/AST/NestedNameSpecifier.cpp
+++ b/contrib/llvm/tools/clang/lib/AST/NestedNameSpecifier.cpp
@@ -174,6 +174,28 @@ bool NestedNameSpecifier::isDependent() const {
return false;
}
+/// \brief Whether this nested name specifier refers to a dependent
+/// type or not.
+bool NestedNameSpecifier::isInstantiationDependent() const {
+ switch (getKind()) {
+ case Identifier:
+ // Identifier specifiers always represent dependent types
+ return true;
+
+ case Namespace:
+ case NamespaceAlias:
+ case Global:
+ return false;
+
+ case TypeSpec:
+ case TypeSpecWithTemplate:
+ return getAsType()->isInstantiationDependentType();
+ }
+
+ // Necessary to suppress a GCC warning.
+ return false;
+}
+
bool NestedNameSpecifier::containsUnexpandedParameterPack() const {
switch (getKind()) {
case Identifier:
diff --git a/contrib/llvm/tools/clang/lib/AST/ParentMap.cpp b/contrib/llvm/tools/clang/lib/AST/ParentMap.cpp
index eca351a..b7b2005 100644
--- a/contrib/llvm/tools/clang/lib/AST/ParentMap.cpp
+++ b/contrib/llvm/tools/clang/lib/AST/ParentMap.cpp
@@ -66,6 +66,15 @@ Stmt *ParentMap::getParentIgnoreParenCasts(Stmt *S) const {
return S;
}
+Stmt *ParentMap::getOuterParenParent(Stmt *S) const {
+ Stmt *Paren = 0;
+ while (isa<ParenExpr>(S)) {
+ Paren = S;
+ S = getParent(S);
+ };
+ return Paren;
+}
+
bool ParentMap::isConsumedExpr(Expr* E) const {
Stmt *P = getParent(E);
Stmt *DirectChild = E;
diff --git a/contrib/llvm/tools/clang/lib/AST/RecordLayoutBuilder.cpp b/contrib/llvm/tools/clang/lib/AST/RecordLayoutBuilder.cpp
index de0b1d0..5636a6f 100644
--- a/contrib/llvm/tools/clang/lib/AST/RecordLayoutBuilder.cpp
+++ b/contrib/llvm/tools/clang/lib/AST/RecordLayoutBuilder.cpp
@@ -1242,12 +1242,11 @@ void RecordLayoutBuilder::Layout(const ObjCInterfaceDecl *D) {
}
InitializeLayout(D);
-
+ ObjCInterfaceDecl *OI = const_cast<ObjCInterfaceDecl*>(D);
// Layout each ivar sequentially.
- llvm::SmallVector<ObjCIvarDecl*, 16> Ivars;
- Context.ShallowCollectObjCIvars(D, Ivars);
- for (unsigned i = 0, e = Ivars.size(); i != e; ++i)
- LayoutField(Ivars[i]);
+ for (ObjCIvarDecl *IVD = OI->all_declared_ivar_begin();
+ IVD; IVD = IVD->getNextIvar())
+ LayoutField(IVD);
// Finally, round the size of the total struct up to the alignment of the
// struct itself.
diff --git a/contrib/llvm/tools/clang/lib/AST/Stmt.cpp b/contrib/llvm/tools/clang/lib/AST/Stmt.cpp
index 380ad94..fd6f21d 100644
--- a/contrib/llvm/tools/clang/lib/AST/Stmt.cpp
+++ b/contrib/llvm/tools/clang/lib/AST/Stmt.cpp
@@ -20,7 +20,7 @@
#include "clang/AST/ASTContext.h"
#include "clang/AST/ASTDiagnostic.h"
#include "clang/Basic/TargetInfo.h"
-#include <cstdio>
+#include "llvm/Support/raw_ostream.h"
using namespace clang;
static struct StmtClassNameTable {
@@ -54,23 +54,24 @@ void Stmt::PrintStats() {
getStmtInfoTableEntry(Stmt::NullStmtClass);
unsigned sum = 0;
- fprintf(stderr, "*** Stmt/Expr Stats:\n");
+ llvm::errs() << "\n*** Stmt/Expr Stats:\n";
for (int i = 0; i != Stmt::lastStmtConstant+1; i++) {
if (StmtClassInfo[i].Name == 0) continue;
sum += StmtClassInfo[i].Counter;
}
- fprintf(stderr, " %d stmts/exprs total.\n", sum);
+ llvm::errs() << " " << sum << " stmts/exprs total.\n";
sum = 0;
for (int i = 0; i != Stmt::lastStmtConstant+1; i++) {
if (StmtClassInfo[i].Name == 0) continue;
if (StmtClassInfo[i].Counter == 0) continue;
- fprintf(stderr, " %d %s, %d each (%d bytes)\n",
- StmtClassInfo[i].Counter, StmtClassInfo[i].Name,
- StmtClassInfo[i].Size,
- StmtClassInfo[i].Counter*StmtClassInfo[i].Size);
+ llvm::errs() << " " << StmtClassInfo[i].Counter << " "
+ << StmtClassInfo[i].Name << ", " << StmtClassInfo[i].Size
+ << " each (" << StmtClassInfo[i].Counter*StmtClassInfo[i].Size
+ << " bytes)\n";
sum += StmtClassInfo[i].Counter*StmtClassInfo[i].Size;
}
- fprintf(stderr, "Total bytes = %d\n", sum);
+
+ llvm::errs() << "Total bytes = " << sum << "\n";
}
void Stmt::addStmtClass(StmtClass s) {
@@ -84,6 +85,18 @@ bool Stmt::CollectingStats(bool Enable) {
return StatSwitch;
}
+Stmt *Stmt::IgnoreImplicit() {
+ Stmt *s = this;
+
+ if (ExprWithCleanups *ewc = dyn_cast<ExprWithCleanups>(s))
+ s = ewc->getSubExpr();
+
+ while (ImplicitCastExpr *ice = dyn_cast<ImplicitCastExpr>(s))
+ s = ice->getSubExpr();
+
+ return s;
+}
+
namespace {
struct good {};
struct bad {};
@@ -365,6 +378,10 @@ unsigned AsmStmt::AnalyzeAsmString(llvm::SmallVectorImpl<AsmStringPiece>&Pieces,
// Handle %x4 and %x[foo] by capturing x as the modifier character.
char Modifier = '\0';
if (isalpha(EscapedChar)) {
+ if (CurPtr == StrEnd) { // Premature end.
+ DiagOffs = CurPtr-StrStart-1;
+ return diag::err_asm_invalid_escape;
+ }
Modifier = EscapedChar;
EscapedChar = *CurPtr++;
}
diff --git a/contrib/llvm/tools/clang/lib/AST/StmtPrinter.cpp b/contrib/llvm/tools/clang/lib/AST/StmtPrinter.cpp
index 87588e4..f705a84 100644
--- a/contrib/llvm/tools/clang/lib/AST/StmtPrinter.cpp
+++ b/contrib/llvm/tools/clang/lib/AST/StmtPrinter.cpp
@@ -449,6 +449,12 @@ void StmtPrinter::VisitObjCAtSynchronizedStmt(ObjCAtSynchronizedStmt *Node) {
OS << "\n";
}
+void StmtPrinter::VisitObjCAutoreleasePoolStmt(ObjCAutoreleasePoolStmt *Node) {
+ Indent() << "@autoreleasepool";
+ PrintRawCompoundStmt(dyn_cast<CompoundStmt>(Node->getSubStmt()));
+ OS << "\n";
+}
+
void StmtPrinter::PrintRawCXXCatchStmt(CXXCatchStmt *Node) {
OS << "catch (";
if (Decl *ExDecl = Node->getExceptionDecl())
@@ -1407,6 +1413,15 @@ void StmtPrinter::VisitSubstNonTypeTemplateParmPackExpr(
OS << Node->getParameterPack()->getNameAsString();
}
+void StmtPrinter::VisitSubstNonTypeTemplateParmExpr(
+ SubstNonTypeTemplateParmExpr *Node) {
+ Visit(Node->getReplacement());
+}
+
+void StmtPrinter::VisitMaterializeTemporaryExpr(MaterializeTemporaryExpr *Node){
+ PrintExpr(Node->GetTemporaryExpr());
+}
+
// Obj-C
void StmtPrinter::VisitObjCStringLiteral(ObjCStringLiteral *Node) {
@@ -1464,6 +1479,17 @@ void StmtPrinter::VisitObjCMessageExpr(ObjCMessageExpr *Mess) {
OS << "]";
}
+void
+StmtPrinter::VisitObjCIndirectCopyRestoreExpr(ObjCIndirectCopyRestoreExpr *E) {
+ PrintExpr(E->getSubExpr());
+}
+
+void
+StmtPrinter::VisitObjCBridgedCastExpr(ObjCBridgedCastExpr *E) {
+ OS << "(" << E->getBridgeKindName() << E->getType().getAsString(Policy)
+ << ")";
+ PrintExpr(E->getSubExpr());
+}
void StmtPrinter::VisitBlockExpr(BlockExpr *Node) {
BlockDecl *BD = Node->getBlockDecl();
diff --git a/contrib/llvm/tools/clang/lib/AST/StmtProfile.cpp b/contrib/llvm/tools/clang/lib/AST/StmtProfile.cpp
index b117cd9..120c9e5 100644
--- a/contrib/llvm/tools/clang/lib/AST/StmtProfile.cpp
+++ b/contrib/llvm/tools/clang/lib/AST/StmtProfile.cpp
@@ -23,7 +23,7 @@
using namespace clang;
namespace {
- class StmtProfiler : public StmtVisitor<StmtProfiler> {
+ class StmtProfiler : public ConstStmtVisitor<StmtProfiler> {
llvm::FoldingSetNodeID &ID;
const ASTContext &Context;
bool Canonical;
@@ -33,14 +33,14 @@ namespace {
bool Canonical)
: ID(ID), Context(Context), Canonical(Canonical) { }
- void VisitStmt(Stmt *S);
+ void VisitStmt(const Stmt *S);
-#define STMT(Node, Base) void Visit##Node(Node *S);
+#define STMT(Node, Base) void Visit##Node(const Node *S);
#include "clang/AST/StmtNodes.inc"
/// \brief Visit a declaration that is referenced within an expression
/// or statement.
- void VisitDecl(Decl *D);
+ void VisitDecl(const Decl *D);
/// \brief Visit a type that is referenced within an expression or
/// statement.
@@ -59,96 +59,97 @@ namespace {
/// \brief Visit template arguments that occur within an expression or
/// statement.
- void VisitTemplateArguments(const TemplateArgumentLoc *Args, unsigned NumArgs);
+ void VisitTemplateArguments(const TemplateArgumentLoc *Args,
+ unsigned NumArgs);
/// \brief Visit a single template argument.
void VisitTemplateArgument(const TemplateArgument &Arg);
};
}
-void StmtProfiler::VisitStmt(Stmt *S) {
+void StmtProfiler::VisitStmt(const Stmt *S) {
ID.AddInteger(S->getStmtClass());
- for (Stmt::child_range C = S->children(); C; ++C)
+ for (Stmt::const_child_range C = S->children(); C; ++C)
Visit(*C);
}
-void StmtProfiler::VisitDeclStmt(DeclStmt *S) {
+void StmtProfiler::VisitDeclStmt(const DeclStmt *S) {
VisitStmt(S);
- for (DeclStmt::decl_iterator D = S->decl_begin(), DEnd = S->decl_end();
+ for (DeclStmt::const_decl_iterator D = S->decl_begin(), DEnd = S->decl_end();
D != DEnd; ++D)
VisitDecl(*D);
}
-void StmtProfiler::VisitNullStmt(NullStmt *S) {
+void StmtProfiler::VisitNullStmt(const NullStmt *S) {
VisitStmt(S);
}
-void StmtProfiler::VisitCompoundStmt(CompoundStmt *S) {
+void StmtProfiler::VisitCompoundStmt(const CompoundStmt *S) {
VisitStmt(S);
}
-void StmtProfiler::VisitSwitchCase(SwitchCase *S) {
+void StmtProfiler::VisitSwitchCase(const SwitchCase *S) {
VisitStmt(S);
}
-void StmtProfiler::VisitCaseStmt(CaseStmt *S) {
+void StmtProfiler::VisitCaseStmt(const CaseStmt *S) {
VisitStmt(S);
}
-void StmtProfiler::VisitDefaultStmt(DefaultStmt *S) {
+void StmtProfiler::VisitDefaultStmt(const DefaultStmt *S) {
VisitStmt(S);
}
-void StmtProfiler::VisitLabelStmt(LabelStmt *S) {
+void StmtProfiler::VisitLabelStmt(const LabelStmt *S) {
VisitStmt(S);
VisitDecl(S->getDecl());
}
-void StmtProfiler::VisitIfStmt(IfStmt *S) {
+void StmtProfiler::VisitIfStmt(const IfStmt *S) {
VisitStmt(S);
VisitDecl(S->getConditionVariable());
}
-void StmtProfiler::VisitSwitchStmt(SwitchStmt *S) {
+void StmtProfiler::VisitSwitchStmt(const SwitchStmt *S) {
VisitStmt(S);
VisitDecl(S->getConditionVariable());
}
-void StmtProfiler::VisitWhileStmt(WhileStmt *S) {
+void StmtProfiler::VisitWhileStmt(const WhileStmt *S) {
VisitStmt(S);
VisitDecl(S->getConditionVariable());
}
-void StmtProfiler::VisitDoStmt(DoStmt *S) {
+void StmtProfiler::VisitDoStmt(const DoStmt *S) {
VisitStmt(S);
}
-void StmtProfiler::VisitForStmt(ForStmt *S) {
+void StmtProfiler::VisitForStmt(const ForStmt *S) {
VisitStmt(S);
}
-void StmtProfiler::VisitGotoStmt(GotoStmt *S) {
+void StmtProfiler::VisitGotoStmt(const GotoStmt *S) {
VisitStmt(S);
VisitDecl(S->getLabel());
}
-void StmtProfiler::VisitIndirectGotoStmt(IndirectGotoStmt *S) {
+void StmtProfiler::VisitIndirectGotoStmt(const IndirectGotoStmt *S) {
VisitStmt(S);
}
-void StmtProfiler::VisitContinueStmt(ContinueStmt *S) {
+void StmtProfiler::VisitContinueStmt(const ContinueStmt *S) {
VisitStmt(S);
}
-void StmtProfiler::VisitBreakStmt(BreakStmt *S) {
+void StmtProfiler::VisitBreakStmt(const BreakStmt *S) {
VisitStmt(S);
}
-void StmtProfiler::VisitReturnStmt(ReturnStmt *S) {
+void StmtProfiler::VisitReturnStmt(const ReturnStmt *S) {
VisitStmt(S);
}
-void StmtProfiler::VisitAsmStmt(AsmStmt *S) {
+void StmtProfiler::VisitAsmStmt(const AsmStmt *S) {
VisitStmt(S);
ID.AddBoolean(S->isVolatile());
ID.AddBoolean(S->isSimple());
@@ -168,63 +169,69 @@ void StmtProfiler::VisitAsmStmt(AsmStmt *S) {
VisitStringLiteral(S->getClobber(I));
}
-void StmtProfiler::VisitCXXCatchStmt(CXXCatchStmt *S) {
+void StmtProfiler::VisitCXXCatchStmt(const CXXCatchStmt *S) {
VisitStmt(S);
VisitType(S->getCaughtType());
}
-void StmtProfiler::VisitCXXTryStmt(CXXTryStmt *S) {
+void StmtProfiler::VisitCXXTryStmt(const CXXTryStmt *S) {
VisitStmt(S);
}
-void StmtProfiler::VisitCXXForRangeStmt(CXXForRangeStmt *S) {
+void StmtProfiler::VisitCXXForRangeStmt(const CXXForRangeStmt *S) {
VisitStmt(S);
}
-void StmtProfiler::VisitSEHTryStmt(SEHTryStmt *S) {
+void StmtProfiler::VisitSEHTryStmt(const SEHTryStmt *S) {
VisitStmt(S);
}
-void StmtProfiler::VisitSEHFinallyStmt(SEHFinallyStmt *S) {
+void StmtProfiler::VisitSEHFinallyStmt(const SEHFinallyStmt *S) {
VisitStmt(S);
}
-void StmtProfiler::VisitSEHExceptStmt(SEHExceptStmt *S) {
+void StmtProfiler::VisitSEHExceptStmt(const SEHExceptStmt *S) {
VisitStmt(S);
}
-void StmtProfiler::VisitObjCForCollectionStmt(ObjCForCollectionStmt *S) {
+void StmtProfiler::VisitObjCForCollectionStmt(const ObjCForCollectionStmt *S) {
VisitStmt(S);
}
-void StmtProfiler::VisitObjCAtCatchStmt(ObjCAtCatchStmt *S) {
+void StmtProfiler::VisitObjCAtCatchStmt(const ObjCAtCatchStmt *S) {
VisitStmt(S);
ID.AddBoolean(S->hasEllipsis());
if (S->getCatchParamDecl())
VisitType(S->getCatchParamDecl()->getType());
}
-void StmtProfiler::VisitObjCAtFinallyStmt(ObjCAtFinallyStmt *S) {
+void StmtProfiler::VisitObjCAtFinallyStmt(const ObjCAtFinallyStmt *S) {
VisitStmt(S);
}
-void StmtProfiler::VisitObjCAtTryStmt(ObjCAtTryStmt *S) {
+void StmtProfiler::VisitObjCAtTryStmt(const ObjCAtTryStmt *S) {
VisitStmt(S);
}
-void StmtProfiler::VisitObjCAtSynchronizedStmt(ObjCAtSynchronizedStmt *S) {
+void
+StmtProfiler::VisitObjCAtSynchronizedStmt(const ObjCAtSynchronizedStmt *S) {
VisitStmt(S);
}
-void StmtProfiler::VisitObjCAtThrowStmt(ObjCAtThrowStmt *S) {
+void StmtProfiler::VisitObjCAtThrowStmt(const ObjCAtThrowStmt *S) {
VisitStmt(S);
}
-void StmtProfiler::VisitExpr(Expr *S) {
+void
+StmtProfiler::VisitObjCAutoreleasePoolStmt(const ObjCAutoreleasePoolStmt *S) {
VisitStmt(S);
}
-void StmtProfiler::VisitDeclRefExpr(DeclRefExpr *S) {
+void StmtProfiler::VisitExpr(const Expr *S) {
+ VisitStmt(S);
+}
+
+void StmtProfiler::VisitDeclRefExpr(const DeclRefExpr *S) {
VisitExpr(S);
if (!Canonical)
VisitNestedNameSpecifier(S->getQualifier());
@@ -233,52 +240,52 @@ void StmtProfiler::VisitDeclRefExpr(DeclRefExpr *S) {
VisitTemplateArguments(S->getTemplateArgs(), S->getNumTemplateArgs());
}
-void StmtProfiler::VisitPredefinedExpr(PredefinedExpr *S) {
+void StmtProfiler::VisitPredefinedExpr(const PredefinedExpr *S) {
VisitExpr(S);
ID.AddInteger(S->getIdentType());
}
-void StmtProfiler::VisitIntegerLiteral(IntegerLiteral *S) {
+void StmtProfiler::VisitIntegerLiteral(const IntegerLiteral *S) {
VisitExpr(S);
S->getValue().Profile(ID);
}
-void StmtProfiler::VisitCharacterLiteral(CharacterLiteral *S) {
+void StmtProfiler::VisitCharacterLiteral(const CharacterLiteral *S) {
VisitExpr(S);
ID.AddBoolean(S->isWide());
ID.AddInteger(S->getValue());
}
-void StmtProfiler::VisitFloatingLiteral(FloatingLiteral *S) {
+void StmtProfiler::VisitFloatingLiteral(const FloatingLiteral *S) {
VisitExpr(S);
S->getValue().Profile(ID);
ID.AddBoolean(S->isExact());
}
-void StmtProfiler::VisitImaginaryLiteral(ImaginaryLiteral *S) {
+void StmtProfiler::VisitImaginaryLiteral(const ImaginaryLiteral *S) {
VisitExpr(S);
}
-void StmtProfiler::VisitStringLiteral(StringLiteral *S) {
+void StmtProfiler::VisitStringLiteral(const StringLiteral *S) {
VisitExpr(S);
ID.AddString(S->getString());
ID.AddBoolean(S->isWide());
}
-void StmtProfiler::VisitParenExpr(ParenExpr *S) {
+void StmtProfiler::VisitParenExpr(const ParenExpr *S) {
VisitExpr(S);
}
-void StmtProfiler::VisitParenListExpr(ParenListExpr *S) {
+void StmtProfiler::VisitParenListExpr(const ParenListExpr *S) {
VisitExpr(S);
}
-void StmtProfiler::VisitUnaryOperator(UnaryOperator *S) {
+void StmtProfiler::VisitUnaryOperator(const UnaryOperator *S) {
VisitExpr(S);
ID.AddInteger(S->getOpcode());
}
-void StmtProfiler::VisitOffsetOfExpr(OffsetOfExpr *S) {
+void StmtProfiler::VisitOffsetOfExpr(const OffsetOfExpr *S) {
VisitType(S->getTypeSourceInfo()->getType());
unsigned n = S->getNumComponents();
for (unsigned i = 0; i < n; ++i) {
@@ -306,22 +313,23 @@ void StmtProfiler::VisitOffsetOfExpr(OffsetOfExpr *S) {
VisitExpr(S);
}
-void StmtProfiler::VisitUnaryExprOrTypeTraitExpr(UnaryExprOrTypeTraitExpr *S) {
+void
+StmtProfiler::VisitUnaryExprOrTypeTraitExpr(const UnaryExprOrTypeTraitExpr *S) {
VisitExpr(S);
ID.AddInteger(S->getKind());
if (S->isArgumentType())
VisitType(S->getArgumentType());
}
-void StmtProfiler::VisitArraySubscriptExpr(ArraySubscriptExpr *S) {
+void StmtProfiler::VisitArraySubscriptExpr(const ArraySubscriptExpr *S) {
VisitExpr(S);
}
-void StmtProfiler::VisitCallExpr(CallExpr *S) {
+void StmtProfiler::VisitCallExpr(const CallExpr *S) {
VisitExpr(S);
}
-void StmtProfiler::VisitMemberExpr(MemberExpr *S) {
+void StmtProfiler::VisitMemberExpr(const MemberExpr *S) {
VisitExpr(S);
VisitDecl(S->getMemberDecl());
if (!Canonical)
@@ -329,72 +337,74 @@ void StmtProfiler::VisitMemberExpr(MemberExpr *S) {
ID.AddBoolean(S->isArrow());
}
-void StmtProfiler::VisitCompoundLiteralExpr(CompoundLiteralExpr *S) {
+void StmtProfiler::VisitCompoundLiteralExpr(const CompoundLiteralExpr *S) {
VisitExpr(S);
ID.AddBoolean(S->isFileScope());
}
-void StmtProfiler::VisitCastExpr(CastExpr *S) {
+void StmtProfiler::VisitCastExpr(const CastExpr *S) {
VisitExpr(S);
}
-void StmtProfiler::VisitImplicitCastExpr(ImplicitCastExpr *S) {
+void StmtProfiler::VisitImplicitCastExpr(const ImplicitCastExpr *S) {
VisitCastExpr(S);
ID.AddInteger(S->getValueKind());
}
-void StmtProfiler::VisitExplicitCastExpr(ExplicitCastExpr *S) {
+void StmtProfiler::VisitExplicitCastExpr(const ExplicitCastExpr *S) {
VisitCastExpr(S);
VisitType(S->getTypeAsWritten());
}
-void StmtProfiler::VisitCStyleCastExpr(CStyleCastExpr *S) {
+void StmtProfiler::VisitCStyleCastExpr(const CStyleCastExpr *S) {
VisitExplicitCastExpr(S);
}
-void StmtProfiler::VisitBinaryOperator(BinaryOperator *S) {
+void StmtProfiler::VisitBinaryOperator(const BinaryOperator *S) {
VisitExpr(S);
ID.AddInteger(S->getOpcode());
}
-void StmtProfiler::VisitCompoundAssignOperator(CompoundAssignOperator *S) {
+void
+StmtProfiler::VisitCompoundAssignOperator(const CompoundAssignOperator *S) {
VisitBinaryOperator(S);
}
-void StmtProfiler::VisitConditionalOperator(ConditionalOperator *S) {
+void StmtProfiler::VisitConditionalOperator(const ConditionalOperator *S) {
VisitExpr(S);
}
-void StmtProfiler::VisitBinaryConditionalOperator(BinaryConditionalOperator *S){
+void StmtProfiler::VisitBinaryConditionalOperator(
+ const BinaryConditionalOperator *S) {
VisitExpr(S);
}
-void StmtProfiler::VisitAddrLabelExpr(AddrLabelExpr *S) {
+void StmtProfiler::VisitAddrLabelExpr(const AddrLabelExpr *S) {
VisitExpr(S);
VisitDecl(S->getLabel());
}
-void StmtProfiler::VisitStmtExpr(StmtExpr *S) {
+void StmtProfiler::VisitStmtExpr(const StmtExpr *S) {
VisitExpr(S);
}
-void StmtProfiler::VisitShuffleVectorExpr(ShuffleVectorExpr *S) {
+void StmtProfiler::VisitShuffleVectorExpr(const ShuffleVectorExpr *S) {
VisitExpr(S);
}
-void StmtProfiler::VisitChooseExpr(ChooseExpr *S) {
+void StmtProfiler::VisitChooseExpr(const ChooseExpr *S) {
VisitExpr(S);
}
-void StmtProfiler::VisitGNUNullExpr(GNUNullExpr *S) {
+void StmtProfiler::VisitGNUNullExpr(const GNUNullExpr *S) {
VisitExpr(S);
}
-void StmtProfiler::VisitVAArgExpr(VAArgExpr *S) {
+void StmtProfiler::VisitVAArgExpr(const VAArgExpr *S) {
VisitExpr(S);
}
-void StmtProfiler::VisitInitListExpr(InitListExpr *S) {
+void StmtProfiler::VisitInitListExpr(const InitListExpr *S) {
if (S->getSyntacticForm()) {
VisitInitListExpr(S->getSyntacticForm());
return;
@@ -403,11 +413,11 @@ void StmtProfiler::VisitInitListExpr(InitListExpr *S) {
VisitExpr(S);
}
-void StmtProfiler::VisitDesignatedInitExpr(DesignatedInitExpr *S) {
+void StmtProfiler::VisitDesignatedInitExpr(const DesignatedInitExpr *S) {
VisitExpr(S);
ID.AddBoolean(S->usesGNUSyntax());
- for (DesignatedInitExpr::designators_iterator D = S->designators_begin(),
- DEnd = S->designators_end();
+ for (DesignatedInitExpr::const_designators_iterator D =
+ S->designators_begin(), DEnd = S->designators_end();
D != DEnd; ++D) {
if (D->isFieldDesignator()) {
ID.AddInteger(0);
@@ -425,28 +435,28 @@ void StmtProfiler::VisitDesignatedInitExpr(DesignatedInitExpr *S) {
}
}
-void StmtProfiler::VisitImplicitValueInitExpr(ImplicitValueInitExpr *S) {
+void StmtProfiler::VisitImplicitValueInitExpr(const ImplicitValueInitExpr *S) {
VisitExpr(S);
}
-void StmtProfiler::VisitExtVectorElementExpr(ExtVectorElementExpr *S) {
+void StmtProfiler::VisitExtVectorElementExpr(const ExtVectorElementExpr *S) {
VisitExpr(S);
VisitName(&S->getAccessor());
}
-void StmtProfiler::VisitBlockExpr(BlockExpr *S) {
+void StmtProfiler::VisitBlockExpr(const BlockExpr *S) {
VisitExpr(S);
VisitDecl(S->getBlockDecl());
}
-void StmtProfiler::VisitBlockDeclRefExpr(BlockDeclRefExpr *S) {
+void StmtProfiler::VisitBlockDeclRefExpr(const BlockDeclRefExpr *S) {
VisitExpr(S);
VisitDecl(S->getDecl());
ID.AddBoolean(S->isByRef());
ID.AddBoolean(S->isConstQualAdded());
}
-void StmtProfiler::VisitGenericSelectionExpr(GenericSelectionExpr *S) {
+void StmtProfiler::VisitGenericSelectionExpr(const GenericSelectionExpr *S) {
VisitExpr(S);
for (unsigned i = 0; i != S->getNumAssocs(); ++i) {
QualType T = S->getAssocType(i);
@@ -458,7 +468,7 @@ void StmtProfiler::VisitGenericSelectionExpr(GenericSelectionExpr *S) {
}
}
-static Stmt::StmtClass DecodeOperatorCall(CXXOperatorCallExpr *S,
+static Stmt::StmtClass DecodeOperatorCall(const CXXOperatorCallExpr *S,
UnaryOperatorKind &UnaryOp,
BinaryOperatorKind &BinaryOp) {
switch (S->getOperator()) {
@@ -645,7 +655,7 @@ static Stmt::StmtClass DecodeOperatorCall(CXXOperatorCallExpr *S,
}
-void StmtProfiler::VisitCXXOperatorCallExpr(CXXOperatorCallExpr *S) {
+void StmtProfiler::VisitCXXOperatorCallExpr(const CXXOperatorCallExpr *S) {
if (S->isTypeDependent()) {
// Type-dependent operator calls are profiled like their underlying
// syntactic operator.
@@ -671,97 +681,100 @@ void StmtProfiler::VisitCXXOperatorCallExpr(CXXOperatorCallExpr *S) {
ID.AddInteger(S->getOperator());
}
-void StmtProfiler::VisitCXXMemberCallExpr(CXXMemberCallExpr *S) {
+void StmtProfiler::VisitCXXMemberCallExpr(const CXXMemberCallExpr *S) {
VisitCallExpr(S);
}
-void StmtProfiler::VisitCUDAKernelCallExpr(CUDAKernelCallExpr *S) {
+void StmtProfiler::VisitCUDAKernelCallExpr(const CUDAKernelCallExpr *S) {
VisitCallExpr(S);
}
-void StmtProfiler::VisitAsTypeExpr(AsTypeExpr *S) {
+void StmtProfiler::VisitAsTypeExpr(const AsTypeExpr *S) {
VisitExpr(S);
}
-void StmtProfiler::VisitCXXNamedCastExpr(CXXNamedCastExpr *S) {
+void StmtProfiler::VisitCXXNamedCastExpr(const CXXNamedCastExpr *S) {
VisitExplicitCastExpr(S);
}
-void StmtProfiler::VisitCXXStaticCastExpr(CXXStaticCastExpr *S) {
+void StmtProfiler::VisitCXXStaticCastExpr(const CXXStaticCastExpr *S) {
VisitCXXNamedCastExpr(S);
}
-void StmtProfiler::VisitCXXDynamicCastExpr(CXXDynamicCastExpr *S) {
+void StmtProfiler::VisitCXXDynamicCastExpr(const CXXDynamicCastExpr *S) {
VisitCXXNamedCastExpr(S);
}
-void StmtProfiler::VisitCXXReinterpretCastExpr(CXXReinterpretCastExpr *S) {
+void
+StmtProfiler::VisitCXXReinterpretCastExpr(const CXXReinterpretCastExpr *S) {
VisitCXXNamedCastExpr(S);
}
-void StmtProfiler::VisitCXXConstCastExpr(CXXConstCastExpr *S) {
+void StmtProfiler::VisitCXXConstCastExpr(const CXXConstCastExpr *S) {
VisitCXXNamedCastExpr(S);
}
-void StmtProfiler::VisitCXXBoolLiteralExpr(CXXBoolLiteralExpr *S) {
+void StmtProfiler::VisitCXXBoolLiteralExpr(const CXXBoolLiteralExpr *S) {
VisitExpr(S);
ID.AddBoolean(S->getValue());
}
-void StmtProfiler::VisitCXXNullPtrLiteralExpr(CXXNullPtrLiteralExpr *S) {
+void StmtProfiler::VisitCXXNullPtrLiteralExpr(const CXXNullPtrLiteralExpr *S) {
VisitExpr(S);
}
-void StmtProfiler::VisitCXXTypeidExpr(CXXTypeidExpr *S) {
+void StmtProfiler::VisitCXXTypeidExpr(const CXXTypeidExpr *S) {
VisitExpr(S);
if (S->isTypeOperand())
VisitType(S->getTypeOperand());
}
-void StmtProfiler::VisitCXXUuidofExpr(CXXUuidofExpr *S) {
+void StmtProfiler::VisitCXXUuidofExpr(const CXXUuidofExpr *S) {
VisitExpr(S);
if (S->isTypeOperand())
VisitType(S->getTypeOperand());
}
-void StmtProfiler::VisitCXXThisExpr(CXXThisExpr *S) {
+void StmtProfiler::VisitCXXThisExpr(const CXXThisExpr *S) {
VisitExpr(S);
}
-void StmtProfiler::VisitCXXThrowExpr(CXXThrowExpr *S) {
+void StmtProfiler::VisitCXXThrowExpr(const CXXThrowExpr *S) {
VisitExpr(S);
}
-void StmtProfiler::VisitCXXDefaultArgExpr(CXXDefaultArgExpr *S) {
+void StmtProfiler::VisitCXXDefaultArgExpr(const CXXDefaultArgExpr *S) {
VisitExpr(S);
VisitDecl(S->getParam());
}
-void StmtProfiler::VisitCXXBindTemporaryExpr(CXXBindTemporaryExpr *S) {
+void StmtProfiler::VisitCXXBindTemporaryExpr(const CXXBindTemporaryExpr *S) {
VisitExpr(S);
VisitDecl(
const_cast<CXXDestructorDecl *>(S->getTemporary()->getDestructor()));
}
-void StmtProfiler::VisitCXXConstructExpr(CXXConstructExpr *S) {
+void StmtProfiler::VisitCXXConstructExpr(const CXXConstructExpr *S) {
VisitExpr(S);
VisitDecl(S->getConstructor());
ID.AddBoolean(S->isElidable());
}
-void StmtProfiler::VisitCXXFunctionalCastExpr(CXXFunctionalCastExpr *S) {
+void StmtProfiler::VisitCXXFunctionalCastExpr(const CXXFunctionalCastExpr *S) {
VisitExplicitCastExpr(S);
}
-void StmtProfiler::VisitCXXTemporaryObjectExpr(CXXTemporaryObjectExpr *S) {
+void
+StmtProfiler::VisitCXXTemporaryObjectExpr(const CXXTemporaryObjectExpr *S) {
VisitCXXConstructExpr(S);
}
-void StmtProfiler::VisitCXXScalarValueInitExpr(CXXScalarValueInitExpr *S) {
+void
+StmtProfiler::VisitCXXScalarValueInitExpr(const CXXScalarValueInitExpr *S) {
VisitExpr(S);
}
-void StmtProfiler::VisitCXXDeleteExpr(CXXDeleteExpr *S) {
+void StmtProfiler::VisitCXXDeleteExpr(const CXXDeleteExpr *S) {
VisitExpr(S);
ID.AddBoolean(S->isGlobalDelete());
ID.AddBoolean(S->isArrayForm());
@@ -769,7 +782,7 @@ void StmtProfiler::VisitCXXDeleteExpr(CXXDeleteExpr *S) {
}
-void StmtProfiler::VisitCXXNewExpr(CXXNewExpr *S) {
+void StmtProfiler::VisitCXXNewExpr(const CXXNewExpr *S) {
VisitExpr(S);
VisitType(S->getAllocatedType());
VisitDecl(S->getOperatorNew());
@@ -783,14 +796,15 @@ void StmtProfiler::VisitCXXNewExpr(CXXNewExpr *S) {
ID.AddInteger(S->getNumConstructorArgs());
}
-void StmtProfiler::VisitCXXPseudoDestructorExpr(CXXPseudoDestructorExpr *S) {
+void
+StmtProfiler::VisitCXXPseudoDestructorExpr(const CXXPseudoDestructorExpr *S) {
VisitExpr(S);
ID.AddBoolean(S->isArrow());
VisitNestedNameSpecifier(S->getQualifier());
VisitType(S->getDestroyedType());
}
-void StmtProfiler::VisitOverloadExpr(OverloadExpr *S) {
+void StmtProfiler::VisitOverloadExpr(const OverloadExpr *S) {
VisitExpr(S);
VisitNestedNameSpecifier(S->getQualifier());
VisitName(S->getName());
@@ -801,37 +815,37 @@ void StmtProfiler::VisitOverloadExpr(OverloadExpr *S) {
}
void
-StmtProfiler::VisitUnresolvedLookupExpr(UnresolvedLookupExpr *S) {
+StmtProfiler::VisitUnresolvedLookupExpr(const UnresolvedLookupExpr *S) {
VisitOverloadExpr(S);
}
-void StmtProfiler::VisitUnaryTypeTraitExpr(UnaryTypeTraitExpr *S) {
+void StmtProfiler::VisitUnaryTypeTraitExpr(const UnaryTypeTraitExpr *S) {
VisitExpr(S);
ID.AddInteger(S->getTrait());
VisitType(S->getQueriedType());
}
-void StmtProfiler::VisitBinaryTypeTraitExpr(BinaryTypeTraitExpr *S) {
+void StmtProfiler::VisitBinaryTypeTraitExpr(const BinaryTypeTraitExpr *S) {
VisitExpr(S);
ID.AddInteger(S->getTrait());
VisitType(S->getLhsType());
VisitType(S->getRhsType());
}
-void StmtProfiler::VisitArrayTypeTraitExpr(ArrayTypeTraitExpr *S) {
+void StmtProfiler::VisitArrayTypeTraitExpr(const ArrayTypeTraitExpr *S) {
VisitExpr(S);
ID.AddInteger(S->getTrait());
VisitType(S->getQueriedType());
}
-void StmtProfiler::VisitExpressionTraitExpr(ExpressionTraitExpr *S) {
+void StmtProfiler::VisitExpressionTraitExpr(const ExpressionTraitExpr *S) {
VisitExpr(S);
ID.AddInteger(S->getTrait());
VisitExpr(S->getQueriedExpression());
}
-void
-StmtProfiler::VisitDependentScopeDeclRefExpr(DependentScopeDeclRefExpr *S) {
+void StmtProfiler::VisitDependentScopeDeclRefExpr(
+ const DependentScopeDeclRefExpr *S) {
VisitExpr(S);
VisitName(S->getDeclName());
VisitNestedNameSpecifier(S->getQualifier());
@@ -840,18 +854,18 @@ StmtProfiler::VisitDependentScopeDeclRefExpr(DependentScopeDeclRefExpr *S) {
VisitTemplateArguments(S->getTemplateArgs(), S->getNumTemplateArgs());
}
-void StmtProfiler::VisitExprWithCleanups(ExprWithCleanups *S) {
+void StmtProfiler::VisitExprWithCleanups(const ExprWithCleanups *S) {
VisitExpr(S);
}
-void
-StmtProfiler::VisitCXXUnresolvedConstructExpr(CXXUnresolvedConstructExpr *S) {
+void StmtProfiler::VisitCXXUnresolvedConstructExpr(
+ const CXXUnresolvedConstructExpr *S) {
VisitExpr(S);
VisitType(S->getTypeAsWritten());
}
-void
-StmtProfiler::VisitCXXDependentScopeMemberExpr(CXXDependentScopeMemberExpr *S) {
+void StmtProfiler::VisitCXXDependentScopeMemberExpr(
+ const CXXDependentScopeMemberExpr *S) {
ID.AddBoolean(S->isImplicitAccess());
if (!S->isImplicitAccess()) {
VisitExpr(S);
@@ -864,7 +878,7 @@ StmtProfiler::VisitCXXDependentScopeMemberExpr(CXXDependentScopeMemberExpr *S) {
VisitTemplateArguments(S->getTemplateArgs(), S->getNumTemplateArgs());
}
-void StmtProfiler::VisitUnresolvedMemberExpr(UnresolvedMemberExpr *S) {
+void StmtProfiler::VisitUnresolvedMemberExpr(const UnresolvedMemberExpr *S) {
ID.AddBoolean(S->isImplicitAccess());
if (!S->isImplicitAccess()) {
VisitExpr(S);
@@ -877,57 +891,68 @@ void StmtProfiler::VisitUnresolvedMemberExpr(UnresolvedMemberExpr *S) {
VisitTemplateArguments(S->getTemplateArgs(), S->getNumTemplateArgs());
}
-void StmtProfiler::VisitCXXNoexceptExpr(CXXNoexceptExpr *S) {
+void StmtProfiler::VisitCXXNoexceptExpr(const CXXNoexceptExpr *S) {
VisitExpr(S);
}
-void StmtProfiler::VisitPackExpansionExpr(PackExpansionExpr *S) {
+void StmtProfiler::VisitPackExpansionExpr(const PackExpansionExpr *S) {
VisitExpr(S);
}
-void StmtProfiler::VisitSizeOfPackExpr(SizeOfPackExpr *S) {
+void StmtProfiler::VisitSizeOfPackExpr(const SizeOfPackExpr *S) {
VisitExpr(S);
VisitDecl(S->getPack());
}
void StmtProfiler::VisitSubstNonTypeTemplateParmPackExpr(
- SubstNonTypeTemplateParmPackExpr *S) {
+ const SubstNonTypeTemplateParmPackExpr *S) {
VisitExpr(S);
VisitDecl(S->getParameterPack());
VisitTemplateArgument(S->getArgumentPack());
}
-void StmtProfiler::VisitOpaqueValueExpr(OpaqueValueExpr *E) {
+void StmtProfiler::VisitSubstNonTypeTemplateParmExpr(
+ const SubstNonTypeTemplateParmExpr *E) {
+ // Profile exactly as the replacement expression.
+ Visit(E->getReplacement());
+}
+
+void StmtProfiler::VisitMaterializeTemporaryExpr(
+ const MaterializeTemporaryExpr *S) {
+ VisitExpr(S);
+}
+
+void StmtProfiler::VisitOpaqueValueExpr(const OpaqueValueExpr *E) {
VisitExpr(E);
}
-void StmtProfiler::VisitObjCStringLiteral(ObjCStringLiteral *S) {
+void StmtProfiler::VisitObjCStringLiteral(const ObjCStringLiteral *S) {
VisitExpr(S);
}
-void StmtProfiler::VisitObjCEncodeExpr(ObjCEncodeExpr *S) {
+void StmtProfiler::VisitObjCEncodeExpr(const ObjCEncodeExpr *S) {
VisitExpr(S);
VisitType(S->getEncodedType());
}
-void StmtProfiler::VisitObjCSelectorExpr(ObjCSelectorExpr *S) {
+void StmtProfiler::VisitObjCSelectorExpr(const ObjCSelectorExpr *S) {
VisitExpr(S);
VisitName(S->getSelector());
}
-void StmtProfiler::VisitObjCProtocolExpr(ObjCProtocolExpr *S) {
+void StmtProfiler::VisitObjCProtocolExpr(const ObjCProtocolExpr *S) {
VisitExpr(S);
VisitDecl(S->getProtocol());
}
-void StmtProfiler::VisitObjCIvarRefExpr(ObjCIvarRefExpr *S) {
+void StmtProfiler::VisitObjCIvarRefExpr(const ObjCIvarRefExpr *S) {
VisitExpr(S);
VisitDecl(S->getDecl());
ID.AddBoolean(S->isArrow());
ID.AddBoolean(S->isFreeIvar());
}
-void StmtProfiler::VisitObjCPropertyRefExpr(ObjCPropertyRefExpr *S) {
+void StmtProfiler::VisitObjCPropertyRefExpr(const ObjCPropertyRefExpr *S) {
VisitExpr(S);
if (S->isImplicitProperty()) {
VisitDecl(S->getImplicitPropertyGetter());
@@ -941,22 +966,34 @@ void StmtProfiler::VisitObjCPropertyRefExpr(ObjCPropertyRefExpr *S) {
}
}
-void StmtProfiler::VisitObjCMessageExpr(ObjCMessageExpr *S) {
+void StmtProfiler::VisitObjCMessageExpr(const ObjCMessageExpr *S) {
VisitExpr(S);
VisitName(S->getSelector());
VisitDecl(S->getMethodDecl());
}
-void StmtProfiler::VisitObjCIsaExpr(ObjCIsaExpr *S) {
+void StmtProfiler::VisitObjCIsaExpr(const ObjCIsaExpr *S) {
VisitExpr(S);
ID.AddBoolean(S->isArrow());
}
-void StmtProfiler::VisitDecl(Decl *D) {
+void StmtProfiler::VisitObjCIndirectCopyRestoreExpr(
+ const ObjCIndirectCopyRestoreExpr *S) {
+ VisitExpr(S);
+ ID.AddBoolean(S->shouldCopy());
+}
+
+void StmtProfiler::VisitObjCBridgedCastExpr(const ObjCBridgedCastExpr *S) {
+ VisitExplicitCastExpr(S);
+ ID.AddBoolean(S->getBridgeKind());
+}
+
+void StmtProfiler::VisitDecl(const Decl *D) {
ID.AddInteger(D? D->getKind() : 0);
if (Canonical && D) {
- if (NonTypeTemplateParmDecl *NTTP = dyn_cast<NonTypeTemplateParmDecl>(D)) {
+ if (const NonTypeTemplateParmDecl *NTTP =
+ dyn_cast<NonTypeTemplateParmDecl>(D)) {
ID.AddInteger(NTTP->getDepth());
ID.AddInteger(NTTP->getIndex());
ID.AddBoolean(NTTP->isParameterPack());
@@ -964,7 +1001,7 @@ void StmtProfiler::VisitDecl(Decl *D) {
return;
}
- if (ParmVarDecl *Parm = dyn_cast<ParmVarDecl>(D)) {
+ if (const ParmVarDecl *Parm = dyn_cast<ParmVarDecl>(D)) {
// The Itanium C++ ABI uses the type, scope depth, and scope
// index of a parameter when mangling expressions that involve
// function parameters, so we will use the parameter's type for
@@ -978,7 +1015,8 @@ void StmtProfiler::VisitDecl(Decl *D) {
return;
}
- if (TemplateTemplateParmDecl *TTP = dyn_cast<TemplateTemplateParmDecl>(D)) {
+ if (const TemplateTemplateParmDecl *TTP =
+ dyn_cast<TemplateTemplateParmDecl>(D)) {
ID.AddInteger(TTP->getDepth());
ID.AddInteger(TTP->getIndex());
ID.AddBoolean(TTP->isParameterPack());
@@ -1058,7 +1096,7 @@ void StmtProfiler::VisitTemplateArgument(const TemplateArgument &Arg) {
}
void Stmt::Profile(llvm::FoldingSetNodeID &ID, const ASTContext &Context,
- bool Canonical) {
+ bool Canonical) const {
StmtProfiler Profiler(ID, Context, Canonical);
Profiler.Visit(this);
}
diff --git a/contrib/llvm/tools/clang/lib/AST/TemplateBase.cpp b/contrib/llvm/tools/clang/lib/AST/TemplateBase.cpp
index 6114a5a..56c6e7b 100644
--- a/contrib/llvm/tools/clang/lib/AST/TemplateBase.cpp
+++ b/contrib/llvm/tools/clang/lib/AST/TemplateBase.cpp
@@ -104,6 +104,45 @@ bool TemplateArgument::isDependent() const {
return false;
}
+bool TemplateArgument::isInstantiationDependent() const {
+ switch (getKind()) {
+ case Null:
+ assert(false && "Should not have a NULL template argument");
+ return false;
+
+ case Type:
+ return getAsType()->isInstantiationDependentType();
+
+ case Template:
+ return getAsTemplate().isInstantiationDependent();
+
+ case TemplateExpansion:
+ return true;
+
+ case Declaration:
+ if (DeclContext *DC = dyn_cast<DeclContext>(getAsDecl()))
+ return DC->isDependentContext();
+ return getAsDecl()->getDeclContext()->isDependentContext();
+
+ case Integral:
+ // Never dependent
+ return false;
+
+ case Expression:
+ return getAsExpr()->isInstantiationDependent();
+
+ case Pack:
+ for (pack_iterator P = pack_begin(), PEnd = pack_end(); P != PEnd; ++P) {
+ if (P->isInstantiationDependent())
+ return true;
+ }
+
+ return false;
+ }
+
+ return false;
+}
+
bool TemplateArgument::isPackExpansion() const {
switch (getKind()) {
case Null:
@@ -277,8 +316,10 @@ void TemplateArgument::print(const PrintingPolicy &Policy,
break;
case Type: {
+ PrintingPolicy SubPolicy(Policy);
+ SubPolicy.SuppressStrongLifetime = true;
std::string TypeStr;
- getAsType().getAsStringInternal(TypeStr, Policy);
+ getAsType().getAsStringInternal(TypeStr, SubPolicy);
Out << TypeStr;
break;
}
diff --git a/contrib/llvm/tools/clang/lib/AST/TemplateName.cpp b/contrib/llvm/tools/clang/lib/AST/TemplateName.cpp
index ebd07f4..1f7b19a 100644
--- a/contrib/llvm/tools/clang/lib/AST/TemplateName.cpp
+++ b/contrib/llvm/tools/clang/lib/AST/TemplateName.cpp
@@ -27,7 +27,19 @@ SubstTemplateTemplateParmPackStorage::getArgumentPack() const {
return TemplateArgument(Arguments, size());
}
-void SubstTemplateTemplateParmPackStorage::Profile(llvm::FoldingSetNodeID &ID) {
+void SubstTemplateTemplateParmStorage::Profile(llvm::FoldingSetNodeID &ID) {
+ Profile(ID, Parameter, Replacement);
+}
+
+void SubstTemplateTemplateParmStorage::Profile(llvm::FoldingSetNodeID &ID,
+ TemplateTemplateParmDecl *parameter,
+ TemplateName replacement) {
+ ID.AddPointer(parameter);
+ ID.AddPointer(replacement.getAsVoidPointer());
+}
+
+void SubstTemplateTemplateParmPackStorage::Profile(llvm::FoldingSetNodeID &ID,
+ ASTContext &Context) {
Profile(ID, Context, Parameter, TemplateArgument(Arguments, size()));
}
@@ -46,9 +58,14 @@ TemplateName::NameKind TemplateName::getKind() const {
return DependentTemplate;
if (Storage.is<QualifiedTemplateName *>())
return QualifiedTemplate;
-
- return getAsOverloadedTemplate()? OverloadedTemplate
- : SubstTemplateTemplateParmPack;
+
+ UncommonTemplateNameStorage *uncommon
+ = Storage.get<UncommonTemplateNameStorage*>();
+ if (uncommon->getAsOverloadedStorage())
+ return OverloadedTemplate;
+ if (uncommon->getAsSubstTemplateTemplateParm())
+ return SubstTemplateTemplateParm;
+ return SubstTemplateTemplateParmPack;
}
TemplateDecl *TemplateName::getAsTemplateDecl() const {
@@ -58,6 +75,9 @@ TemplateDecl *TemplateName::getAsTemplateDecl() const {
if (QualifiedTemplateName *QTN = getAsQualifiedTemplateName())
return QTN->getTemplateDecl();
+ if (SubstTemplateTemplateParmStorage *sub = getAsSubstTemplateTemplateParm())
+ return sub->getReplacement().getAsTemplateDecl();
+
return 0;
}
@@ -79,6 +99,15 @@ bool TemplateName::isDependent() const {
return true;
}
+bool TemplateName::isInstantiationDependent() const {
+ if (QualifiedTemplateName *QTN = getAsQualifiedTemplateName()) {
+ if (QTN->getQualifier()->isInstantiationDependent())
+ return true;
+ }
+
+ return isDependent();
+}
+
bool TemplateName::containsUnexpandedParameterPack() const {
if (TemplateDecl *Template = getAsTemplateDecl()) {
if (TemplateTemplateParmDecl *TTP
@@ -115,6 +144,9 @@ TemplateName::print(llvm::raw_ostream &OS, const PrintingPolicy &Policy,
OS << DTN->getIdentifier()->getName();
else
OS << "operator " << getOperatorSpelling(DTN->getOperator());
+ } else if (SubstTemplateTemplateParmStorage *subst
+ = getAsSubstTemplateTemplateParm()) {
+ subst->getReplacement().print(OS, Policy, SuppressNNS);
} else if (SubstTemplateTemplateParmPackStorage *SubstPack
= getAsSubstTemplateTemplateParmPack())
OS << SubstPack->getParameterPack()->getNameAsString();
diff --git a/contrib/llvm/tools/clang/lib/AST/Type.cpp b/contrib/llvm/tools/clang/lib/AST/Type.cpp
index d2875528..08971eb 100644
--- a/contrib/llvm/tools/clang/lib/AST/Type.cpp
+++ b/contrib/llvm/tools/clang/lib/AST/Type.cpp
@@ -36,7 +36,10 @@ bool Qualifiers::isStrictSupersetOf(Qualifiers Other) const {
(hasObjCGCAttr() && !Other.hasObjCGCAttr())) &&
// Address space superset.
((getAddressSpace() == Other.getAddressSpace()) ||
- (hasAddressSpace()&& !Other.hasAddressSpace()));
+ (hasAddressSpace()&& !Other.hasAddressSpace())) &&
+ // Lifetime qualifier superset.
+ ((getObjCLifetime() == Other.getObjCLifetime()) ||
+ (hasObjCLifetime() && !Other.hasObjCLifetime()));
}
bool QualType::isConstant(QualType T, ASTContext &Ctx) {
@@ -107,6 +110,7 @@ DependentSizedExtVectorType::DependentSizedExtVectorType(const
Expr *SizeExpr,
SourceLocation loc)
: Type(DependentSizedExtVector, can, /*Dependent=*/true,
+ /*InstantiationDependent=*/true,
ElementType->isVariablyModifiedType(),
(ElementType->containsUnexpandedParameterPack() ||
(SizeExpr && SizeExpr->containsUnexpandedParameterPack()))),
@@ -126,6 +130,7 @@ DependentSizedExtVectorType::Profile(llvm::FoldingSetNodeID &ID,
VectorType::VectorType(QualType vecType, unsigned nElements, QualType canonType,
VectorKind vecKind)
: Type(Vector, canonType, vecType->isDependentType(),
+ vecType->isInstantiationDependentType(),
vecType->isVariablyModifiedType(),
vecType->containsUnexpandedParameterPack()),
ElementType(vecType)
@@ -137,6 +142,7 @@ VectorType::VectorType(QualType vecType, unsigned nElements, QualType canonType,
VectorType::VectorType(TypeClass tc, QualType vecType, unsigned nElements,
QualType canonType, VectorKind vecKind)
: Type(tc, canonType, vecType->isDependentType(),
+ vecType->isInstantiationDependentType(),
vecType->isVariablyModifiedType(),
vecType->containsUnexpandedParameterPack()),
ElementType(vecType)
@@ -174,6 +180,26 @@ QualType QualType::getDesugaredType(QualType T, const ASTContext &Context) {
return Context.getQualifiedType(split.first, split.second);
}
+QualType QualType::getSingleStepDesugaredType(const ASTContext &Context) const {
+ QualifierCollector Qs;
+
+ const Type *CurTy = Qs.strip(*this);
+ switch (CurTy->getTypeClass()) {
+#define ABSTRACT_TYPE(Class, Parent)
+#define TYPE(Class, Parent) \
+ case Type::Class: { \
+ const Class##Type *Ty = cast<Class##Type>(CurTy); \
+ if (!Ty->isSugared()) \
+ return *this; \
+ return Context.getQualifiedType(Ty->desugar(), Qs); \
+ break; \
+ }
+#include "clang/AST/TypeNodes.def"
+ }
+
+ return *this;
+}
+
SplitQualType QualType::getSplitDesugaredType(QualType T) {
QualifierCollector Qs;
@@ -285,7 +311,6 @@ bool Type::isDerivedType() const {
return false;
}
}
-
bool Type::isClassType() const {
if (const RecordType *RT = getAs<RecordType>())
return RT->getDecl()->isClass();
@@ -385,7 +410,7 @@ const RecordType *Type::getAsUnionType() const {
ObjCObjectType::ObjCObjectType(QualType Canonical, QualType Base,
ObjCProtocolDecl * const *Protocols,
unsigned NumProtocols)
- : Type(ObjCObject, Canonical, false, false, false),
+ : Type(ObjCObject, Canonical, false, false, false, false),
BaseType(Base)
{
ObjCObjectTypeBits.NumProtocols = NumProtocols;
@@ -866,39 +891,57 @@ bool Type::isIncompleteType() const {
}
}
-/// isPODType - Return true if this is a plain-old-data type (C++ 3.9p10)
-bool Type::isPODType() const {
+bool QualType::isPODType(ASTContext &Context) const {
// The compiler shouldn't query this for incomplete types, but the user might.
// We return false for that case. Except for incomplete arrays of PODs, which
// are PODs according to the standard.
- if (isIncompleteArrayType() &&
- cast<ArrayType>(CanonicalType)->getElementType()->isPODType())
- return true;
- if (isIncompleteType())
+ if (isNull())
+ return 0;
+
+ if ((*this)->isIncompleteArrayType())
+ return Context.getBaseElementType(*this).isPODType(Context);
+
+ if ((*this)->isIncompleteType())
return false;
+ if (Context.getLangOptions().ObjCAutoRefCount) {
+ switch (getObjCLifetime()) {
+ case Qualifiers::OCL_ExplicitNone:
+ return true;
+
+ case Qualifiers::OCL_Strong:
+ case Qualifiers::OCL_Weak:
+ case Qualifiers::OCL_Autoreleasing:
+ return false;
+
+ case Qualifiers::OCL_None:
+ break;
+ }
+ }
+
+ QualType CanonicalType = getTypePtr()->CanonicalType;
switch (CanonicalType->getTypeClass()) {
// Everything not explicitly mentioned is not POD.
default: return false;
- case VariableArray:
- case ConstantArray:
+ case Type::VariableArray:
+ case Type::ConstantArray:
// IncompleteArray is handled above.
- return cast<ArrayType>(CanonicalType)->getElementType()->isPODType();
-
- case Builtin:
- case Complex:
- case Pointer:
- case MemberPointer:
- case Vector:
- case ExtVector:
- case ObjCObjectPointer:
- case BlockPointer:
+ return Context.getBaseElementType(*this).isPODType(Context);
+
+ case Type::ObjCObjectPointer:
+ case Type::BlockPointer:
+ case Type::Builtin:
+ case Type::Complex:
+ case Type::Pointer:
+ case Type::MemberPointer:
+ case Type::Vector:
+ case Type::ExtVector:
return true;
- case Enum:
+ case Type::Enum:
return true;
- case Record:
+ case Type::Record:
if (CXXRecordDecl *ClassDecl
= dyn_cast<CXXRecordDecl>(cast<RecordType>(CanonicalType)->getDecl()))
return ClassDecl->isPOD();
@@ -908,6 +951,121 @@ bool Type::isPODType() const {
}
}
+bool QualType::isTrivialType(ASTContext &Context) const {
+ // The compiler shouldn't query this for incomplete types, but the user might.
+ // We return false for that case. Except for incomplete arrays of PODs, which
+ // are PODs according to the standard.
+ if (isNull())
+ return 0;
+
+ if ((*this)->isArrayType())
+ return Context.getBaseElementType(*this).isTrivialType(Context);
+
+ // Return false for incomplete types after skipping any incomplete array
+ // types which are expressly allowed by the standard and thus our API.
+ if ((*this)->isIncompleteType())
+ return false;
+
+ if (Context.getLangOptions().ObjCAutoRefCount) {
+ switch (getObjCLifetime()) {
+ case Qualifiers::OCL_ExplicitNone:
+ return true;
+
+ case Qualifiers::OCL_Strong:
+ case Qualifiers::OCL_Weak:
+ case Qualifiers::OCL_Autoreleasing:
+ return false;
+
+ case Qualifiers::OCL_None:
+ if ((*this)->isObjCLifetimeType())
+ return false;
+ break;
+ }
+ }
+
+ QualType CanonicalType = getTypePtr()->CanonicalType;
+ if (CanonicalType->isDependentType())
+ return false;
+
+ // C++0x [basic.types]p9:
+ // Scalar types, trivial class types, arrays of such types, and
+ // cv-qualified versions of these types are collectively called trivial
+ // types.
+
+ // As an extension, Clang treats vector types as Scalar types.
+ if (CanonicalType->isScalarType() || CanonicalType->isVectorType())
+ return true;
+ if (const RecordType *RT = CanonicalType->getAs<RecordType>()) {
+ if (const CXXRecordDecl *ClassDecl =
+ dyn_cast<CXXRecordDecl>(RT->getDecl())) {
+ // C++0x [class]p5:
+ // A trivial class is a class that has a trivial default constructor
+ if (!ClassDecl->hasTrivialDefaultConstructor()) return false;
+ // and is trivially copyable.
+ if (!ClassDecl->isTriviallyCopyable()) return false;
+ }
+
+ return true;
+ }
+
+ // No other types can match.
+ return false;
+}
+
+bool QualType::isTriviallyCopyableType(ASTContext &Context) const {
+ if ((*this)->isArrayType())
+ return Context.getBaseElementType(*this).isTrivialType(Context);
+
+ if (Context.getLangOptions().ObjCAutoRefCount) {
+ switch (getObjCLifetime()) {
+ case Qualifiers::OCL_ExplicitNone:
+ return true;
+
+ case Qualifiers::OCL_Strong:
+ case Qualifiers::OCL_Weak:
+ case Qualifiers::OCL_Autoreleasing:
+ return false;
+
+ case Qualifiers::OCL_None:
+ if ((*this)->isObjCLifetimeType())
+ return false;
+ break;
+ }
+ }
+
+ // C++0x [basic.types]p9
+ // Scalar types, trivially copyable class types, arrays of such types, and
+ // cv-qualified versions of these types are collectively called trivial
+ // types.
+
+ QualType CanonicalType = getCanonicalType();
+ if (CanonicalType->isDependentType())
+ return false;
+
+ // Return false for incomplete types after skipping any incomplete array types
+ // which are expressly allowed by the standard and thus our API.
+ if (CanonicalType->isIncompleteType())
+ return false;
+
+ // As an extension, Clang treats vector types as Scalar types.
+ if (CanonicalType->isScalarType() || CanonicalType->isVectorType())
+ return true;
+
+ if (const RecordType *RT = CanonicalType->getAs<RecordType>()) {
+ if (const CXXRecordDecl *ClassDecl =
+ dyn_cast<CXXRecordDecl>(RT->getDecl())) {
+ if (!ClassDecl->isTriviallyCopyable()) return false;
+ }
+
+ return true;
+ }
+
+ // No other types can match.
+ return false;
+}
+
+
+
bool Type::isLiteralType() const {
if (isDependentType())
return false;
@@ -928,6 +1086,10 @@ bool Type::isLiteralType() const {
if (BaseTy->isIncompleteType())
return false;
+ // Objective-C lifetime types are not literal types.
+ if (BaseTy->isObjCRetainableType())
+ return false;
+
// C++0x [basic.types]p10:
// A type is a literal type if it is:
// -- a scalar type; or
@@ -961,68 +1123,6 @@ bool Type::isLiteralType() const {
return false;
}
-bool Type::isTrivialType() const {
- if (isDependentType())
- return false;
-
- // C++0x [basic.types]p9:
- // Scalar types, trivial class types, arrays of such types, and
- // cv-qualified versions of these types are collectively called trivial
- // types.
- const Type *BaseTy = getBaseElementTypeUnsafe();
- assert(BaseTy && "NULL element type");
-
- // Return false for incomplete types after skipping any incomplete array
- // types which are expressly allowed by the standard and thus our API.
- if (BaseTy->isIncompleteType())
- return false;
-
- // As an extension, Clang treats vector types as Scalar types.
- if (BaseTy->isScalarType() || BaseTy->isVectorType()) return true;
- if (const RecordType *RT = BaseTy->getAs<RecordType>()) {
- if (const CXXRecordDecl *ClassDecl =
- dyn_cast<CXXRecordDecl>(RT->getDecl())) {
- if (!ClassDecl->isTrivial()) return false;
- }
-
- return true;
- }
-
- // No other types can match.
- return false;
-}
-
-bool Type::isTriviallyCopyableType() const {
- if (isDependentType())
- return false;
-
- // C++0x [basic.types]p9
- // Scalar types, trivially copyable class types, arrays of such types, and
- // cv-qualified versions of these types are collectively called trivial
- // types.
- const Type *BaseTy = getBaseElementTypeUnsafe();
- assert(BaseTy && "NULL element type");
-
- // Return false for incomplete types after skipping any incomplete array types
- // which are expressly allowed by the standard and thus our API.
- if (BaseTy->isIncompleteType())
- return false;
-
- // As an extension, Clang treats vector types as Scalar types.
- if (BaseTy->isScalarType() || BaseTy->isVectorType()) return true;
- if (const RecordType *RT = BaseTy->getAs<RecordType>()) {
- if (const CXXRecordDecl *ClassDecl =
- dyn_cast<CXXRecordDecl>(RT->getDecl())) {
- if (!ClassDecl->isTriviallyCopyable()) return false;
- }
-
- return true;
- }
-
- // No other types can match.
- return false;
-}
-
bool Type::isStandardLayoutType() const {
if (isDependentType())
return false;
@@ -1060,14 +1160,32 @@ bool Type::isStandardLayoutType() const {
// This is effectively the intersection of isTrivialType and
// isStandardLayoutType. We implement it dircetly to avoid redundant
// conversions from a type to a CXXRecordDecl.
-bool Type::isCXX11PODType() const {
- if (isDependentType())
+bool QualType::isCXX11PODType(ASTContext &Context) const {
+ const Type *ty = getTypePtr();
+ if (ty->isDependentType())
return false;
+ if (Context.getLangOptions().ObjCAutoRefCount) {
+ switch (getObjCLifetime()) {
+ case Qualifiers::OCL_ExplicitNone:
+ return true;
+
+ case Qualifiers::OCL_Strong:
+ case Qualifiers::OCL_Weak:
+ case Qualifiers::OCL_Autoreleasing:
+ return false;
+
+ case Qualifiers::OCL_None:
+ if (ty->isObjCLifetimeType())
+ return false;
+ break;
+ }
+ }
+
// C++11 [basic.types]p9:
// Scalar types, POD classes, arrays of such types, and cv-qualified
// versions of these types are collectively called trivial types.
- const Type *BaseTy = getBaseElementTypeUnsafe();
+ const Type *BaseTy = ty->getBaseElementTypeUnsafe();
assert(BaseTy && "NULL element type");
// Return false for incomplete types after skipping any incomplete array
@@ -1253,7 +1371,7 @@ DependentTemplateSpecializationType::DependentTemplateSpecializationType(
NestedNameSpecifier *NNS, const IdentifierInfo *Name,
unsigned NumArgs, const TemplateArgument *Args,
QualType Canon)
- : TypeWithKeyword(Keyword, DependentTemplateSpecialization, Canon, true,
+ : TypeWithKeyword(Keyword, DependentTemplateSpecialization, Canon, true, true,
/*VariablyModified=*/false,
NNS && NNS->containsUnexpandedParameterPack()),
NNS(NNS), Name(Name), NumArgs(NumArgs) {
@@ -1388,18 +1506,22 @@ FunctionProtoType::FunctionProtoType(QualType result, const QualType *args,
: FunctionType(FunctionProto, result, epi.Variadic, epi.TypeQuals,
epi.RefQualifier, canonical,
result->isDependentType(),
+ result->isInstantiationDependentType(),
result->isVariablyModifiedType(),
result->containsUnexpandedParameterPack(),
epi.ExtInfo),
NumArgs(numArgs), NumExceptions(epi.NumExceptions),
- ExceptionSpecType(epi.ExceptionSpecType)
+ ExceptionSpecType(epi.ExceptionSpecType),
+ HasAnyConsumedArgs(epi.ConsumedArguments != 0)
{
// Fill in the trailing argument array.
QualType *argSlot = reinterpret_cast<QualType*>(this+1);
for (unsigned i = 0; i != numArgs; ++i) {
if (args[i]->isDependentType())
setDependent();
-
+ else if (args[i]->isInstantiationDependentType())
+ setInstantiationDependent();
+
if (args[i]->containsUnexpandedParameterPack())
setContainsUnexpandedParameterPack();
@@ -1412,7 +1534,9 @@ FunctionProtoType::FunctionProtoType(QualType result, const QualType *args,
for (unsigned i = 0, e = epi.NumExceptions; i != e; ++i) {
if (epi.Exceptions[i]->isDependentType())
setDependent();
-
+ else if (epi.Exceptions[i]->isInstantiationDependentType())
+ setInstantiationDependent();
+
if (epi.Exceptions[i]->containsUnexpandedParameterPack())
setContainsUnexpandedParameterPack();
@@ -1422,6 +1546,20 @@ FunctionProtoType::FunctionProtoType(QualType result, const QualType *args,
// Store the noexcept expression and context.
Expr **noexSlot = reinterpret_cast<Expr**>(argSlot + numArgs);
*noexSlot = epi.NoexceptExpr;
+
+ if (epi.NoexceptExpr) {
+ if (epi.NoexceptExpr->isValueDependent()
+ || epi.NoexceptExpr->isTypeDependent())
+ setDependent();
+ else if (epi.NoexceptExpr->isInstantiationDependent())
+ setInstantiationDependent();
+ }
+ }
+
+ if (epi.ConsumedArguments) {
+ bool *consumedArgs = const_cast<bool*>(getConsumedArgsBuffer());
+ for (unsigned i = 0; i != numArgs; ++i)
+ consumedArgs[i] = epi.ConsumedArguments[i];
}
}
@@ -1461,18 +1599,48 @@ void FunctionProtoType::Profile(llvm::FoldingSetNodeID &ID, QualType Result,
const QualType *ArgTys, unsigned NumArgs,
const ExtProtoInfo &epi,
const ASTContext &Context) {
+
+ // We have to be careful not to get ambiguous profile encodings.
+ // Note that valid type pointers are never ambiguous with anything else.
+ //
+ // The encoding grammar begins:
+ // type type* bool int bool
+ // If that final bool is true, then there is a section for the EH spec:
+ // bool type*
+ // This is followed by an optional "consumed argument" section of the
+ // same length as the first type sequence:
+ // bool*
+ // Finally, we have the ext info:
+ // int
+ //
+ // There is no ambiguity between the consumed arguments and an empty EH
+ // spec because of the leading 'bool' which unambiguously indicates
+ // whether the following bool is the EH spec or part of the arguments.
+
ID.AddPointer(Result.getAsOpaquePtr());
for (unsigned i = 0; i != NumArgs; ++i)
ID.AddPointer(ArgTys[i].getAsOpaquePtr());
- ID.AddBoolean(epi.Variadic);
- ID.AddInteger(epi.TypeQuals);
- ID.AddInteger(epi.RefQualifier);
- ID.AddInteger(epi.ExceptionSpecType);
+ // This method is relatively performance sensitive, so as a performance
+ // shortcut, use one AddInteger call instead of four for the next four
+ // fields.
+ assert(!(unsigned(epi.Variadic) & ~1) &&
+ !(unsigned(epi.TypeQuals) & ~255) &&
+ !(unsigned(epi.RefQualifier) & ~3) &&
+ !(unsigned(epi.ExceptionSpecType) & ~7) &&
+ "Values larger than expected.");
+ ID.AddInteger(unsigned(epi.Variadic) +
+ (epi.TypeQuals << 1) +
+ (epi.RefQualifier << 9) +
+ (epi.ExceptionSpecType << 11));
if (epi.ExceptionSpecType == EST_Dynamic) {
for (unsigned i = 0; i != epi.NumExceptions; ++i)
ID.AddPointer(epi.Exceptions[i].getAsOpaquePtr());
} else if (epi.ExceptionSpecType == EST_ComputedNoexcept && epi.NoexceptExpr){
- epi.NoexceptExpr->Profile(ID, Context, true);
+ epi.NoexceptExpr->Profile(ID, Context, false);
+ }
+ if (epi.ConsumedArguments) {
+ for (unsigned i = 0; i != NumArgs; ++i)
+ ID.AddBoolean(epi.ConsumedArguments[i]);
}
epi.ExtInfo.Profile(ID);
}
@@ -1489,13 +1657,21 @@ QualType TypedefType::desugar() const {
TypeOfExprType::TypeOfExprType(Expr *E, QualType can)
: Type(TypeOfExpr, can, E->isTypeDependent(),
+ E->isInstantiationDependent(),
E->getType()->isVariablyModifiedType(),
E->containsUnexpandedParameterPack()),
TOExpr(E) {
}
+bool TypeOfExprType::isSugared() const {
+ return !TOExpr->isTypeDependent();
+}
+
QualType TypeOfExprType::desugar() const {
- return getUnderlyingExpr()->getType();
+ if (isSugared())
+ return getUnderlyingExpr()->getType();
+
+ return QualType(this, 0);
}
void DependentTypeOfExprType::Profile(llvm::FoldingSetNodeID &ID,
@@ -1505,12 +1681,22 @@ void DependentTypeOfExprType::Profile(llvm::FoldingSetNodeID &ID,
DecltypeType::DecltypeType(Expr *E, QualType underlyingType, QualType can)
: Type(Decltype, can, E->isTypeDependent(),
+ E->isInstantiationDependent(),
E->getType()->isVariablyModifiedType(),
E->containsUnexpandedParameterPack()),
E(E),
UnderlyingType(underlyingType) {
}
+bool DecltypeType::isSugared() const { return !E->isInstantiationDependent(); }
+
+QualType DecltypeType::desugar() const {
+ if (isSugared())
+ return getUnderlyingType();
+
+ return QualType(this, 0);
+}
+
DependentDecltypeType::DependentDecltypeType(const ASTContext &Context, Expr *E)
: DecltypeType(E, Context.DependentTy), Context(Context) { }
@@ -1520,7 +1706,9 @@ void DependentDecltypeType::Profile(llvm::FoldingSetNodeID &ID,
}
TagType::TagType(TypeClass TC, const TagDecl *D, QualType can)
- : Type(TC, can, D->isDependentType(), /*VariablyModified=*/false,
+ : Type(TC, can, D->isDependentType(),
+ /*InstantiationDependent=*/D->isDependentType(),
+ /*VariablyModified=*/false,
/*ContainsUnexpandedParameterPack=*/false),
decl(const_cast<TagDecl*>(D)) {}
@@ -1540,6 +1728,7 @@ UnaryTransformType::UnaryTransformType(QualType BaseType,
UTTKind UKind,
QualType CanonicalType)
: Type(UnaryTransform, CanonicalType, UnderlyingType->isDependentType(),
+ UnderlyingType->isInstantiationDependentType(),
UnderlyingType->isVariablyModifiedType(),
BaseType->containsUnexpandedParameterPack())
, BaseType(BaseType), UnderlyingType(UnderlyingType), UKind(UKind)
@@ -1573,7 +1762,8 @@ SubstTemplateTypeParmPackType::
SubstTemplateTypeParmPackType(const TemplateTypeParmType *Param,
QualType Canon,
const TemplateArgument &ArgPack)
- : Type(SubstTemplateTypeParmPack, Canon, true, false, true), Replaced(Param),
+ : Type(SubstTemplateTypeParmPack, Canon, true, true, false, true),
+ Replaced(Param),
Arguments(ArgPack.pack_begin()), NumArguments(ArgPack.pack_size())
{
}
@@ -1598,23 +1788,39 @@ void SubstTemplateTypeParmPackType::Profile(llvm::FoldingSetNodeID &ID,
}
bool TemplateSpecializationType::
-anyDependentTemplateArguments(const TemplateArgumentListInfo &Args) {
- return anyDependentTemplateArguments(Args.getArgumentArray(), Args.size());
+anyDependentTemplateArguments(const TemplateArgumentListInfo &Args,
+ bool &InstantiationDependent) {
+ return anyDependentTemplateArguments(Args.getArgumentArray(), Args.size(),
+ InstantiationDependent);
}
bool TemplateSpecializationType::
-anyDependentTemplateArguments(const TemplateArgumentLoc *Args, unsigned N) {
- for (unsigned i = 0; i != N; ++i)
- if (Args[i].getArgument().isDependent())
+anyDependentTemplateArguments(const TemplateArgumentLoc *Args, unsigned N,
+ bool &InstantiationDependent) {
+ for (unsigned i = 0; i != N; ++i) {
+ if (Args[i].getArgument().isDependent()) {
+ InstantiationDependent = true;
return true;
+ }
+
+ if (Args[i].getArgument().isInstantiationDependent())
+ InstantiationDependent = true;
+ }
return false;
}
bool TemplateSpecializationType::
-anyDependentTemplateArguments(const TemplateArgument *Args, unsigned N) {
- for (unsigned i = 0; i != N; ++i)
- if (Args[i].isDependent())
+anyDependentTemplateArguments(const TemplateArgument *Args, unsigned N,
+ bool &InstantiationDependent) {
+ for (unsigned i = 0; i != N; ++i) {
+ if (Args[i].isDependent()) {
+ InstantiationDependent = true;
return true;
+ }
+
+ if (Args[i].isInstantiationDependent())
+ InstantiationDependent = true;
+ }
return false;
}
@@ -1625,12 +1831,22 @@ TemplateSpecializationType(TemplateName T,
: Type(TemplateSpecialization,
Canon.isNull()? QualType(this, 0) : Canon,
Canon.isNull()? T.isDependent() : Canon->isDependentType(),
+ Canon.isNull()? T.isDependent()
+ : Canon->isInstantiationDependentType(),
false, T.containsUnexpandedParameterPack()),
Template(T), NumArgs(NumArgs) {
assert(!T.getAsDependentTemplateName() &&
"Use DependentTemplateSpecializationType for dependent template-name");
+ assert((T.getKind() == TemplateName::Template ||
+ T.getKind() == TemplateName::SubstTemplateTemplateParm ||
+ T.getKind() == TemplateName::SubstTemplateTemplateParmPack) &&
+ "Unexpected template name for TemplateSpecializationType");
+ bool InstantiationDependent;
+ (void)InstantiationDependent;
assert((!Canon.isNull() ||
- T.isDependent() || anyDependentTemplateArguments(Args, NumArgs)) &&
+ T.isDependent() ||
+ anyDependentTemplateArguments(Args, NumArgs,
+ InstantiationDependent)) &&
"No canonical type for non-dependent class template specialization");
TemplateArgument *TemplateArgs
@@ -1644,6 +1860,9 @@ TemplateSpecializationType(TemplateName T,
// U<T> is always non-dependent, irrespective of the type T.
if (Canon.isNull() && Args[Arg].isDependent())
setDependent();
+ else if (Args[Arg].isInstantiationDependent())
+ setInstantiationDependent();
+
if (Args[Arg].getKind() == TemplateArgument::Type &&
Args[Arg].getAsType()->isVariablyModifiedType())
setVariablyModified();
@@ -1795,8 +2014,8 @@ static CachedProperties computeCachedProperties(const Type *T) {
#define DEPENDENT_TYPE(Class,Base) case Type::Class:
#define NON_CANONICAL_UNLESS_DEPENDENT_TYPE(Class,Base) case Type::Class:
#include "clang/AST/TypeNodes.def"
- // Treat dependent types as external.
- assert(T->isDependentType());
+ // Treat instantiation-dependent types as external.
+ assert(T->isInstantiationDependentType());
return CachedProperties(ExternalLinkage, DefaultVisibility, false);
case Type::Builtin:
@@ -1900,6 +2119,79 @@ void Type::ClearLinkageCache() {
CanonicalType->TypeBits.CacheValidAndVisibility = 0;
}
+Qualifiers::ObjCLifetime Type::getObjCARCImplicitLifetime() const {
+ if (isObjCARCImplicitlyUnretainedType())
+ return Qualifiers::OCL_ExplicitNone;
+ return Qualifiers::OCL_Strong;
+}
+
+bool Type::isObjCARCImplicitlyUnretainedType() const {
+ assert(isObjCLifetimeType() &&
+ "cannot query implicit lifetime for non-inferrable type");
+
+ const Type *canon = getCanonicalTypeInternal().getTypePtr();
+
+ // Walk down to the base type. We don't care about qualifiers for this.
+ while (const ArrayType *array = dyn_cast<ArrayType>(canon))
+ canon = array->getElementType().getTypePtr();
+
+ if (const ObjCObjectPointerType *opt
+ = dyn_cast<ObjCObjectPointerType>(canon)) {
+ // Class and Class<Protocol> don't require retension.
+ if (opt->getObjectType()->isObjCClass())
+ return true;
+ }
+
+ return false;
+}
+
+bool Type::isObjCNSObjectType() const {
+ if (const TypedefType *typedefType = dyn_cast<TypedefType>(this))
+ return typedefType->getDecl()->hasAttr<ObjCNSObjectAttr>();
+ return false;
+}
+bool Type::isObjCRetainableType() const {
+ return isObjCObjectPointerType() ||
+ isBlockPointerType() ||
+ isObjCNSObjectType();
+}
+bool Type::isObjCIndirectLifetimeType() const {
+ if (isObjCLifetimeType())
+ return true;
+ if (const PointerType *OPT = getAs<PointerType>())
+ return OPT->getPointeeType()->isObjCIndirectLifetimeType();
+ if (const ReferenceType *Ref = getAs<ReferenceType>())
+ return Ref->getPointeeType()->isObjCIndirectLifetimeType();
+ if (const MemberPointerType *MemPtr = getAs<MemberPointerType>())
+ return MemPtr->getPointeeType()->isObjCIndirectLifetimeType();
+ return false;
+}
+
+/// Returns true if objects of this type have lifetime semantics under
+/// ARC.
+bool Type::isObjCLifetimeType() const {
+ const Type *type = this;
+ while (const ArrayType *array = type->getAsArrayTypeUnsafe())
+ type = array->getElementType().getTypePtr();
+ return type->isObjCRetainableType();
+}
+
+/// \brief Determine whether the given type T is a "bridgable" Objective-C type,
+/// which is either an Objective-C object pointer type or an
+bool Type::isObjCARCBridgableType() const {
+ return isObjCObjectPointerType() || isBlockPointerType();
+}
+
+/// \brief Determine whether the given type T is a "bridgeable" C type.
+bool Type::isCARCBridgableType() const {
+ const PointerType *Pointer = getAs<PointerType>();
+ if (!Pointer)
+ return false;
+
+ QualType Pointee = Pointer->getPointeeType();
+ return Pointee->isVoidType() || Pointee->isRecordType();
+}
+
bool Type::hasSizedVLAType() const {
if (!isVariablyModifiedType()) return false;
@@ -1919,6 +2211,18 @@ bool Type::hasSizedVLAType() const {
}
QualType::DestructionKind QualType::isDestructedTypeImpl(QualType type) {
+ switch (type.getObjCLifetime()) {
+ case Qualifiers::OCL_None:
+ case Qualifiers::OCL_ExplicitNone:
+ case Qualifiers::OCL_Autoreleasing:
+ break;
+
+ case Qualifiers::OCL_Strong:
+ return DK_objc_strong_lifetime;
+ case Qualifiers::OCL_Weak:
+ return DK_objc_weak_lifetime;
+ }
+
/// Currently, the only destruction kind we recognize is C++ objects
/// with non-trivial destructors.
const CXXRecordDecl *record =
@@ -1928,3 +2232,24 @@ QualType::DestructionKind QualType::isDestructedTypeImpl(QualType type) {
return DK_none;
}
+
+bool QualType::hasTrivialCopyAssignment(ASTContext &Context) const {
+ switch (getObjCLifetime()) {
+ case Qualifiers::OCL_None:
+ break;
+
+ case Qualifiers::OCL_ExplicitNone:
+ return true;
+
+ case Qualifiers::OCL_Autoreleasing:
+ case Qualifiers::OCL_Strong:
+ case Qualifiers::OCL_Weak:
+ return !Context.getLangOptions().ObjCAutoRefCount;
+ }
+
+ if (const CXXRecordDecl *Record
+ = getTypePtr()->getBaseElementTypeUnsafe()->getAsCXXRecordDecl())
+ return Record->hasTrivialCopyAssignment();
+
+ return true;
+}
diff --git a/contrib/llvm/tools/clang/lib/AST/TypePrinter.cpp b/contrib/llvm/tools/clang/lib/AST/TypePrinter.cpp
index 4519606..b89d2aa 100644
--- a/contrib/llvm/tools/clang/lib/AST/TypePrinter.cpp
+++ b/contrib/llvm/tools/clang/lib/AST/TypePrinter.cpp
@@ -24,6 +24,23 @@
using namespace clang;
namespace {
+ /// \brief RAII object that enables printing of the ARC __strong lifetime
+ /// qualifier.
+ class IncludeStrongLifetimeRAII {
+ PrintingPolicy &Policy;
+ bool Old;
+
+ public:
+ explicit IncludeStrongLifetimeRAII(PrintingPolicy &Policy)
+ : Policy(Policy), Old(Policy.SuppressStrongLifetime) {
+ Policy.SuppressStrongLifetime = false;
+ }
+
+ ~IncludeStrongLifetimeRAII() {
+ Policy.SuppressStrongLifetime = Old;
+ }
+ };
+
class TypePrinter {
PrintingPolicy Policy;
@@ -78,7 +95,7 @@ void TypePrinter::print(const Type *T, Qualifiers Quals, std::string &buffer) {
// "int * const", printing "const int *" is different. Only do this when the
// type expands to a simple string.
bool CanPrefixQualifiers = false;
-
+ bool NeedARCStrongQualifier = false;
Type::TypeClass TC = T->getTypeClass();
if (const AutoType *AT = dyn_cast<AutoType>(T))
TC = AT->desugar()->getTypeClass();
@@ -114,15 +131,18 @@ void TypePrinter::print(const Type *T, Qualifiers Quals, std::string &buffer) {
T->isObjCQualifiedIdType() || T->isObjCQualifiedClassType();
break;
+ case Type::ConstantArray:
+ case Type::IncompleteArray:
+ case Type::VariableArray:
+ case Type::DependentSizedArray:
+ NeedARCStrongQualifier = true;
+ // Fall through
+
case Type::Pointer:
case Type::BlockPointer:
case Type::LValueReference:
case Type::RValueReference:
case Type::MemberPointer:
- case Type::ConstantArray:
- case Type::IncompleteArray:
- case Type::VariableArray:
- case Type::DependentSizedArray:
case Type::DependentSizedExtVector:
case Type::Vector:
case Type::ExtVector:
@@ -139,13 +159,20 @@ void TypePrinter::print(const Type *T, Qualifiers Quals, std::string &buffer) {
if (!CanPrefixQualifiers && !Quals.empty()) {
std::string qualsBuffer;
- Quals.getAsStringInternal(qualsBuffer, Policy);
+ if (NeedARCStrongQualifier) {
+ IncludeStrongLifetimeRAII Strong(Policy);
+ Quals.getAsStringInternal(qualsBuffer, Policy);
+ } else {
+ Quals.getAsStringInternal(qualsBuffer, Policy);
+ }
- if (!buffer.empty()) {
- qualsBuffer += ' ';
- qualsBuffer += buffer;
+ if (!qualsBuffer.empty()) {
+ if (!buffer.empty()) {
+ qualsBuffer += ' ';
+ qualsBuffer += buffer;
+ }
+ std::swap(buffer, qualsBuffer);
}
- std::swap(buffer, qualsBuffer);
}
switch (T->getTypeClass()) {
@@ -159,13 +186,20 @@ void TypePrinter::print(const Type *T, Qualifiers Quals, std::string &buffer) {
// If we're adding the qualifiers as a prefix, do it now.
if (CanPrefixQualifiers && !Quals.empty()) {
std::string qualsBuffer;
- Quals.getAsStringInternal(qualsBuffer, Policy);
-
- if (!buffer.empty()) {
- qualsBuffer += ' ';
- qualsBuffer += buffer;
+ if (NeedARCStrongQualifier) {
+ IncludeStrongLifetimeRAII Strong(Policy);
+ Quals.getAsStringInternal(qualsBuffer, Policy);
+ } else {
+ Quals.getAsStringInternal(qualsBuffer, Policy);
+ }
+
+ if (!qualsBuffer.empty()) {
+ if (!buffer.empty()) {
+ qualsBuffer += ' ';
+ qualsBuffer += buffer;
+ }
+ std::swap(buffer, qualsBuffer);
}
- std::swap(buffer, qualsBuffer);
}
}
@@ -192,6 +226,7 @@ void TypePrinter::printPointer(const PointerType *T, std::string &S) {
if (isa<ArrayType>(T->getPointeeType()))
S = '(' + S + ')';
+ IncludeStrongLifetimeRAII Strong(Policy);
print(T->getPointeeType(), S);
}
@@ -209,6 +244,7 @@ void TypePrinter::printLValueReference(const LValueReferenceType *T,
if (isa<ArrayType>(T->getPointeeTypeAsWritten()))
S = '(' + S + ')';
+ IncludeStrongLifetimeRAII Strong(Policy);
print(T->getPointeeTypeAsWritten(), S);
}
@@ -221,6 +257,7 @@ void TypePrinter::printRValueReference(const RValueReferenceType *T,
if (isa<ArrayType>(T->getPointeeTypeAsWritten()))
S = '(' + S + ')';
+ IncludeStrongLifetimeRAII Strong(Policy);
print(T->getPointeeTypeAsWritten(), S);
}
@@ -236,6 +273,7 @@ void TypePrinter::printMemberPointer(const MemberPointerType *T,
if (isa<ArrayType>(T->getPointeeType()))
S = '(' + S + ')';
+ IncludeStrongLifetimeRAII Strong(Policy);
print(T->getPointeeType(), S);
}
@@ -245,12 +283,14 @@ void TypePrinter::printConstantArray(const ConstantArrayType *T,
S += llvm::utostr(T->getSize().getZExtValue());
S += ']';
+ IncludeStrongLifetimeRAII Strong(Policy);
print(T->getElementType(), S);
}
void TypePrinter::printIncompleteArray(const IncompleteArrayType *T,
std::string &S) {
S += "[]";
+ IncludeStrongLifetimeRAII Strong(Policy);
print(T->getElementType(), S);
}
@@ -276,6 +316,7 @@ void TypePrinter::printVariableArray(const VariableArrayType *T,
}
S += ']';
+ IncludeStrongLifetimeRAII Strong(Policy);
print(T->getElementType(), S);
}
@@ -291,6 +332,7 @@ void TypePrinter::printDependentSizedArray(const DependentSizedArrayType *T,
}
S += ']';
+ IncludeStrongLifetimeRAII Strong(Policy);
print(T->getElementType(), S);
}
@@ -518,6 +560,7 @@ void TypePrinter::printUnaryTransform(const UnaryTransformType *T,
if (!S.empty())
S = ' ' + S;
std::string Str;
+ IncludeStrongLifetimeRAII Strong(Policy);
print(T->getBaseType(), Str);
switch (T->getUTTKind()) {
@@ -552,6 +595,7 @@ void TypePrinter::AppendScope(DeclContext *DC, std::string &Buffer) {
Buffer += "<anonymous>";
} else if (ClassTemplateSpecializationDecl *Spec
= dyn_cast<ClassTemplateSpecializationDecl>(DC)) {
+ IncludeStrongLifetimeRAII Strong(Policy);
const TemplateArgumentList &TemplateArgs = Spec->getTemplateArgs();
std::string TemplateArgsStr
= TemplateSpecializationType::PrintTemplateArgumentList(
@@ -642,6 +686,7 @@ void TypePrinter::printTag(TagDecl *D, std::string &InnerString) {
Args = TemplateArgs.data();
NumArgs = TemplateArgs.size();
}
+ IncludeStrongLifetimeRAII Strong(Policy);
Buffer += TemplateSpecializationType::PrintTemplateArgumentList(Args,
NumArgs,
Policy);
@@ -677,18 +722,21 @@ void TypePrinter::printTemplateTypeParm(const TemplateTypeParmType *T,
void TypePrinter::printSubstTemplateTypeParm(const SubstTemplateTypeParmType *T,
std::string &S) {
+ IncludeStrongLifetimeRAII Strong(Policy);
print(T->getReplacementType(), S);
}
void TypePrinter::printSubstTemplateTypeParmPack(
const SubstTemplateTypeParmPackType *T,
std::string &S) {
+ IncludeStrongLifetimeRAII Strong(Policy);
printTemplateTypeParm(T->getReplacedParameter(), S);
}
void TypePrinter::printTemplateSpecialization(
const TemplateSpecializationType *T,
std::string &S) {
+ IncludeStrongLifetimeRAII Strong(Policy);
std::string SpecString;
{
@@ -765,6 +813,7 @@ void TypePrinter::printDependentName(const DependentNameType *T, std::string &S)
void TypePrinter::printDependentTemplateSpecialization(
const DependentTemplateSpecializationType *T, std::string &S) {
+ IncludeStrongLifetimeRAII Strong(Policy);
std::string MyString;
{
llvm::raw_string_ostream OS(MyString);
@@ -796,8 +845,9 @@ void TypePrinter::printPackExpansion(const PackExpansionType *T,
void TypePrinter::printAttributed(const AttributedType *T,
std::string &S) {
- // Prefer the macro forms of the GC qualifiers.
- if (T->getAttrKind() == AttributedType::attr_objc_gc)
+ // Prefer the macro forms of the GC and ownership qualifiers.
+ if (T->getAttrKind() == AttributedType::attr_objc_gc ||
+ T->getAttrKind() == AttributedType::attr_objc_ownership)
return print(T->getEquivalentType(), S);
print(T->getModifiedType(), S);
@@ -866,6 +916,18 @@ void TypePrinter::printAttributed(const AttributedType *T,
break;
}
+ case AttributedType::attr_objc_ownership:
+ S += "objc_ownership(";
+ switch (T->getEquivalentType().getObjCLifetime()) {
+ case Qualifiers::OCL_None: llvm_unreachable("no ownership!"); break;
+ case Qualifiers::OCL_ExplicitNone: S += "none"; break;
+ case Qualifiers::OCL_Strong: S += "strong"; break;
+ case Qualifiers::OCL_Weak: S += "weak"; break;
+ case Qualifiers::OCL_Autoreleasing: S += "autoreleasing"; break;
+ }
+ S += ")";
+ break;
+
case AttributedType::attr_noreturn: S += "noreturn"; break;
case AttributedType::attr_cdecl: S += "cdecl"; break;
case AttributedType::attr_fastcall: S += "fastcall"; break;
@@ -1080,7 +1142,7 @@ std::string Qualifiers::getAsString() const {
// prefix a space if the string is non-empty. Will not append a final
// space.
void Qualifiers::getAsStringInternal(std::string &S,
- const PrintingPolicy&) const {
+ const PrintingPolicy& Policy) const {
AppendTypeQualList(S, getCVRQualifiers());
if (unsigned addrspace = getAddressSpace()) {
if (!S.empty()) S += ' ';
@@ -1095,6 +1157,23 @@ void Qualifiers::getAsStringInternal(std::string &S,
else
S += "__strong";
}
+ if (Qualifiers::ObjCLifetime lifetime = getObjCLifetime()) {
+ if (!S.empty() &&
+ !(lifetime == Qualifiers::OCL_Strong && Policy.SuppressStrongLifetime))
+ S += ' ';
+
+ switch (lifetime) {
+ case Qualifiers::OCL_None: llvm_unreachable("none but true");
+ case Qualifiers::OCL_ExplicitNone: S += "__unsafe_unretained"; break;
+ case Qualifiers::OCL_Strong:
+ if (!Policy.SuppressStrongLifetime)
+ S += "__strong";
+ break;
+
+ case Qualifiers::OCL_Weak: S += "__weak"; break;
+ case Qualifiers::OCL_Autoreleasing: S += "__autoreleasing"; break;
+ }
+ }
}
std::string QualType::getAsString(const Type *ty, Qualifiers qs) {
diff --git a/contrib/llvm/tools/clang/lib/Analysis/CFG.cpp b/contrib/llvm/tools/clang/lib/Analysis/CFG.cpp
index 3e54020..f231c14 100644
--- a/contrib/llvm/tools/clang/lib/Analysis/CFG.cpp
+++ b/contrib/llvm/tools/clang/lib/Analysis/CFG.cpp
@@ -776,7 +776,7 @@ LocalScope* CFGBuilder::addLocalScopeForVarDecl(VarDecl* VD,
QT = RT->getPointeeType();
if (!QT.isConstQualified())
return Scope;
- if (!VD->getInit() || !VD->getInit()->Classify(*Context).isRValue())
+ if (!VD->extendsLifetimeOfTemporary())
return Scope;
}
@@ -2763,6 +2763,10 @@ tryAgain:
case Stmt::ParenExprClass:
E = cast<ParenExpr>(E)->getSubExpr();
goto tryAgain;
+
+ case Stmt::MaterializeTemporaryExprClass:
+ E = cast<MaterializeTemporaryExpr>(E)->GetTemporaryExpr();
+ goto tryAgain;
}
}
diff --git a/contrib/llvm/tools/clang/lib/Analysis/CocoaConventions.cpp b/contrib/llvm/tools/clang/lib/Analysis/CocoaConventions.cpp
index 946c38c..90f7092 100644
--- a/contrib/llvm/tools/clang/lib/Analysis/CocoaConventions.cpp
+++ b/contrib/llvm/tools/clang/lib/Analysis/CocoaConventions.cpp
@@ -7,7 +7,7 @@
//
//===----------------------------------------------------------------------===//
//
-// This file defines
+// This file implements cocoa naming convention analysis.
//
//===----------------------------------------------------------------------===//
@@ -36,8 +36,10 @@ using llvm::StringRef;
// not release it."
//
-cocoa::NamingConvention cocoa::deriveNamingConvention(Selector S) {
- switch (S.getMethodFamily()) {
+cocoa::NamingConvention cocoa::deriveNamingConvention(Selector S,
+ const ObjCMethodDecl *MD) {
+ switch (MD && MD->hasAttr<ObjCMethodFamilyAttr>()? MD->getMethodFamily()
+ : S.getMethodFamily()) {
case OMF_None:
case OMF_autorelease:
case OMF_dealloc:
@@ -45,6 +47,7 @@ cocoa::NamingConvention cocoa::deriveNamingConvention(Selector S) {
case OMF_retain:
case OMF_retainCount:
case OMF_self:
+ case OMF_performSelector:
return NoConvention;
case OMF_init:
@@ -83,12 +86,12 @@ bool cocoa::isRefType(QualType RetTy, llvm::StringRef Prefix,
return Name.startswith(Prefix);
}
-bool cocoa::isCFObjectRef(QualType T) {
- return isRefType(T, "CF") || // Core Foundation.
- isRefType(T, "CG") || // Core Graphics.
- isRefType(T, "DADisk") || // Disk Arbitration API.
- isRefType(T, "DADissenter") ||
- isRefType(T, "DASessionRef");
+bool coreFoundation::isCFObjectRef(QualType T) {
+ return cocoa::isRefType(T, "CF") || // Core Foundation.
+ cocoa::isRefType(T, "CG") || // Core Graphics.
+ cocoa::isRefType(T, "DADisk") || // Disk Arbitration API.
+ cocoa::isRefType(T, "DADissenter") ||
+ cocoa::isRefType(T, "DASessionRef");
}
@@ -123,3 +126,47 @@ bool cocoa::isCocoaObjectRef(QualType Ty) {
return false;
}
+
+bool coreFoundation::followsCreateRule(llvm::StringRef functionName) {
+ llvm::StringRef::iterator it = functionName.begin();
+ llvm::StringRef::iterator start = it;
+ llvm::StringRef::iterator endI = functionName.end();
+
+ while (true) {
+ // Scan for the start of 'create' or 'copy'.
+ for ( ; it != endI ; ++it) {
+ // Search for the first character. It can either be 'C' or 'c'.
+ char ch = *it;
+ if (ch == 'C' || ch == 'c') {
+ ++it;
+ break;
+ }
+ }
+
+ // Did we hit the end of the string? If so, we didn't find a match.
+ if (it == endI)
+ return false;
+
+ // Scan for *lowercase* 'reate' or 'opy', followed by no lowercase
+ // character.
+ llvm::StringRef suffix = functionName.substr(it - start);
+ if (suffix.startswith("reate")) {
+ it += 5;
+ }
+ else if (suffix.startswith("opy")) {
+ it += 3;
+ }
+ else {
+ // Keep scanning.
+ continue;
+ }
+
+ if (it == endI || !islower(*it))
+ return true;
+
+ // If we matched a lowercase character, it isn't the end of the
+ // word. Keep scanning.
+ }
+
+ return false;
+}
diff --git a/contrib/llvm/tools/clang/lib/Analysis/FormatString.cpp b/contrib/llvm/tools/clang/lib/Analysis/FormatString.cpp
index a6d6108..7c1e453 100644
--- a/contrib/llvm/tools/clang/lib/Analysis/FormatString.cpp
+++ b/contrib/llvm/tools/clang/lib/Analysis/FormatString.cpp
@@ -219,6 +219,7 @@ bool ArgTypeResult::matchesType(ASTContext &C, QualType argTy) const {
argTy = C.getCanonicalType(argTy).getUnqualifiedType();
if (T == argTy)
return true;
+ // Check for "compatible types".
if (const BuiltinType *BT = argTy->getAs<BuiltinType>())
switch (BT->getKind()) {
default:
@@ -227,7 +228,7 @@ bool ArgTypeResult::matchesType(ASTContext &C, QualType argTy) const {
case BuiltinType::SChar:
return T == C.UnsignedCharTy;
case BuiltinType::Char_U:
- case BuiltinType::UChar:
+ case BuiltinType::UChar:
return T == C.SignedCharTy;
case BuiltinType::Short:
return T == C.UnsignedShortTy;
diff --git a/contrib/llvm/tools/clang/lib/Analysis/ReachableCode.cpp b/contrib/llvm/tools/clang/lib/Analysis/ReachableCode.cpp
index 9ac456f..c5b17fc 100644
--- a/contrib/llvm/tools/clang/lib/Analysis/ReachableCode.cpp
+++ b/contrib/llvm/tools/clang/lib/Analysis/ReachableCode.cpp
@@ -16,6 +16,7 @@
#include "llvm/ADT/SmallVector.h"
#include "clang/AST/Expr.h"
#include "clang/AST/ExprCXX.h"
+#include "clang/AST/ExprObjC.h"
#include "clang/AST/StmtCXX.h"
#include "clang/Analysis/Analyses/ReachableCode.h"
#include "clang/Analysis/CFG.h"
@@ -108,6 +109,11 @@ static SourceLocation GetUnreachableLoc(const CFGBlock &b, SourceRange &R1,
case Stmt::CXXTryStmtClass: {
return cast<CXXTryStmt>(S)->getHandler(0)->getCatchLoc();
}
+ case Expr::ObjCBridgedCastExprClass: {
+ const ObjCBridgedCastExpr *CSC = cast<ObjCBridgedCastExpr>(S);
+ R1 = CSC->getSubExpr()->getSourceRange();
+ return CSC->getLParenLoc();
+ }
default: ;
}
R1 = S->getSourceRange();
diff --git a/contrib/llvm/tools/clang/lib/Analysis/UninitializedValues.cpp b/contrib/llvm/tools/clang/lib/Analysis/UninitializedValues.cpp
index e80e282..1d6959d 100644
--- a/contrib/llvm/tools/clang/lib/Analysis/UninitializedValues.cpp
+++ b/contrib/llvm/tools/clang/lib/Analysis/UninitializedValues.cpp
@@ -288,28 +288,28 @@ class DataflowWorklist {
public:
DataflowWorklist(const CFG &cfg) : enqueuedBlocks(cfg.getNumBlockIDs()) {}
- void enqueue(const CFGBlock *block);
void enqueueSuccessors(const CFGBlock *block);
const CFGBlock *dequeue();
-
};
}
-void DataflowWorklist::enqueue(const CFGBlock *block) {
- if (!block)
- return;
- unsigned idx = block->getBlockID();
- if (enqueuedBlocks[idx])
- return;
- worklist.push_back(block);
- enqueuedBlocks[idx] = true;
-}
-
void DataflowWorklist::enqueueSuccessors(const clang::CFGBlock *block) {
+ unsigned OldWorklistSize = worklist.size();
for (CFGBlock::const_succ_iterator I = block->succ_begin(),
E = block->succ_end(); I != E; ++I) {
- enqueue(*I);
+ const CFGBlock *Successor = *I;
+ if (!Successor || enqueuedBlocks[Successor->getBlockID()])
+ continue;
+ worklist.push_back(Successor);
+ enqueuedBlocks[Successor->getBlockID()] = true;
}
+ if (OldWorklistSize == 0 || OldWorklistSize == worklist.size())
+ return;
+
+ // Rotate the newly added blocks to the start of the worklist so that it forms
+ // a proper queue when we pop off the end of the worklist.
+ std::rotate(worklist.begin(), worklist.begin() + OldWorklistSize,
+ worklist.end());
}
const CFGBlock *DataflowWorklist::dequeue() {
@@ -654,15 +654,19 @@ static bool runOnBlock(const CFGBlock *block, const CFG &cfg,
return vals.updateValueVectorWithScratch(block);
}
-void clang::runUninitializedVariablesAnalysis(const DeclContext &dc,
- const CFG &cfg,
- AnalysisContext &ac,
- UninitVariablesHandler &handler) {
+void clang::runUninitializedVariablesAnalysis(
+ const DeclContext &dc,
+ const CFG &cfg,
+ AnalysisContext &ac,
+ UninitVariablesHandler &handler,
+ UninitVariablesAnalysisStats &stats) {
CFGBlockValues vals(cfg);
vals.computeSetOfDeclarations(dc);
if (vals.hasNoDeclarations())
return;
+ stats.NumVariablesAnalyzed = vals.getNumEntries();
+
// Mark all variables uninitialized at the entry.
const CFGBlock &entry = cfg.getEntry();
for (CFGBlock::const_succ_iterator i = entry.succ_begin(),
@@ -684,7 +688,8 @@ void clang::runUninitializedVariablesAnalysis(const DeclContext &dc,
while (const CFGBlock *block = worklist.dequeue()) {
// Did the block change?
- bool changed = runOnBlock(block, cfg, ac, vals, wasAnalyzed);
+ bool changed = runOnBlock(block, cfg, ac, vals, wasAnalyzed);
+ ++stats.NumBlockVisits;
if (changed || !previouslyVisited[block->getBlockID()])
worklist.enqueueSuccessors(block);
previouslyVisited[block->getBlockID()] = true;
@@ -692,11 +697,12 @@ void clang::runUninitializedVariablesAnalysis(const DeclContext &dc,
// Run through the blocks one more time, and report uninitialized variabes.
for (CFG::const_iterator BI = cfg.begin(), BE = cfg.end(); BI != BE; ++BI) {
- if (wasAnalyzed[(*BI)->getBlockID()])
+ if (wasAnalyzed[(*BI)->getBlockID()]) {
runOnBlock(*BI, cfg, ac, vals, wasAnalyzed, &handler,
/* flagBlockUses */ true);
+ ++stats.NumBlockVisits;
+ }
}
}
UninitVariablesHandler::~UninitVariablesHandler() {}
-
diff --git a/contrib/llvm/tools/clang/lib/Basic/Builtins.cpp b/contrib/llvm/tools/clang/lib/Basic/Builtins.cpp
index 845ae81..7df24a0 100644
--- a/contrib/llvm/tools/clang/lib/Basic/Builtins.cpp
+++ b/contrib/llvm/tools/clang/lib/Basic/Builtins.cpp
@@ -18,10 +18,10 @@
using namespace clang;
static const Builtin::Info BuiltinInfo[] = {
- { "not a builtin function", 0, 0, 0, ALL_LANGUAGES, false },
-#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES, false },
+ { "not a builtin function", 0, 0, 0, ALL_LANGUAGES },
+#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER, BUILTIN_LANG) { #ID, TYPE, ATTRS, HEADER,\
- BUILTIN_LANG, false },
+ BUILTIN_LANG },
#include "clang/Basic/Builtins.def"
};
@@ -46,8 +46,7 @@ void Builtin::Context::InitializeBuiltins(IdentifierTable &Table,
const LangOptions& LangOpts) {
// Step #1: mark all target-independent builtins with their ID's.
for (unsigned i = Builtin::NotBuiltin+1; i != Builtin::FirstTSBuiltin; ++i)
- if (!BuiltinInfo[i].Suppressed &&
- (!LangOpts.NoBuiltin || !strchr(BuiltinInfo[i].Attributes, 'f'))) {
+ if (!LangOpts.NoBuiltin || !strchr(BuiltinInfo[i].Attributes, 'f')) {
if (LangOpts.ObjC1 ||
BuiltinInfo[i].builtin_lang != clang::OBJC_LANG)
Table.get(BuiltinInfo[i].Name).setBuiltinID(i);
@@ -55,10 +54,7 @@ void Builtin::Context::InitializeBuiltins(IdentifierTable &Table,
// Step #2: Register target-specific builtins.
for (unsigned i = 0, e = NumTSRecords; i != e; ++i)
- if (!TSRecords[i].Suppressed &&
- (!LangOpts.NoBuiltin ||
- (TSRecords[i].Attributes &&
- !strchr(TSRecords[i].Attributes, 'f'))))
+ if (!LangOpts.NoBuiltin || !strchr(TSRecords[i].Attributes, 'f'))
Table.get(TSRecords[i].Name).setBuiltinID(i+Builtin::FirstTSBuiltin);
}
@@ -67,16 +63,12 @@ Builtin::Context::GetBuiltinNames(llvm::SmallVectorImpl<const char *> &Names,
bool NoBuiltins) {
// Final all target-independent names
for (unsigned i = Builtin::NotBuiltin+1; i != Builtin::FirstTSBuiltin; ++i)
- if (!BuiltinInfo[i].Suppressed &&
- (!NoBuiltins || !strchr(BuiltinInfo[i].Attributes, 'f')))
+ if (!NoBuiltins || !strchr(BuiltinInfo[i].Attributes, 'f'))
Names.push_back(BuiltinInfo[i].Name);
// Find target-specific names.
for (unsigned i = 0, e = NumTSRecords; i != e; ++i)
- if (!TSRecords[i].Suppressed &&
- (!NoBuiltins ||
- (TSRecords[i].Attributes &&
- !strchr(TSRecords[i].Attributes, 'f'))))
+ if (!NoBuiltins || !strchr(TSRecords[i].Attributes, 'f'))
Names.push_back(TSRecords[i].Name);
}
diff --git a/contrib/llvm/tools/clang/lib/Basic/Diagnostic.cpp b/contrib/llvm/tools/clang/lib/Basic/Diagnostic.cpp
index 11887ab..ae363a0 100644
--- a/contrib/llvm/tools/clang/lib/Basic/Diagnostic.cpp
+++ b/contrib/llvm/tools/clang/lib/Basic/Diagnostic.cpp
@@ -26,7 +26,8 @@ static void DummyArgToStringFn(Diagnostic::ArgumentKind AK, intptr_t QT,
const Diagnostic::ArgumentValue *PrevArgs,
unsigned NumPrevArgs,
llvm::SmallVectorImpl<char> &Output,
- void *Cookie) {
+ void *Cookie,
+ llvm::SmallVectorImpl<intptr_t> &QualTypeVals) {
const char *Str = "<can't format argument>";
Output.append(Str, Str+strlen(Str));
}
@@ -86,10 +87,12 @@ bool Diagnostic::popMappings(SourceLocation Loc) {
void Diagnostic::Reset() {
ErrorOccurred = false;
FatalErrorOccurred = false;
+ UnrecoverableErrorOccurred = false;
NumWarnings = 0;
NumErrors = 0;
NumErrorsSuppressed = 0;
+
CurDiagID = ~0U;
// Set LastDiagLevel to an "unset" state. If we set it to 'Ignored', notes
// using a Diagnostic associated to a translation unit that follow
@@ -542,7 +545,14 @@ FormatDiagnostic(const char *DiagStr, const char *DiagEnd,
/// ConvertArgToString, allowing the implementation to avoid redundancies in
/// obvious cases.
llvm::SmallVector<Diagnostic::ArgumentValue, 8> FormattedArgs;
-
+
+ /// QualTypeVals - Pass a vector of arrays so that QualType names can be
+ /// compared to see if more information is needed to be printed.
+ llvm::SmallVector<intptr_t, 2> QualTypeVals;
+ for (unsigned i = 0, e = getNumArgs(); i < e; ++i)
+ if (getArgKind(i) == Diagnostic::ak_qualtype)
+ QualTypeVals.push_back(getRawArg(i));
+
while (DiagStr != DiagEnd) {
if (DiagStr[0] != '%') {
// Append non-%0 substrings to Str if we have one.
@@ -673,7 +683,7 @@ FormatDiagnostic(const char *DiagStr, const char *DiagEnd,
Modifier, ModifierLen,
Argument, ArgumentLen,
FormattedArgs.data(), FormattedArgs.size(),
- OutStr);
+ OutStr, QualTypeVals);
break;
}
diff --git a/contrib/llvm/tools/clang/lib/Basic/DiagnosticIDs.cpp b/contrib/llvm/tools/clang/lib/Basic/DiagnosticIDs.cpp
index 6d7e320..147ba7e 100644
--- a/contrib/llvm/tools/clang/lib/Basic/DiagnosticIDs.cpp
+++ b/contrib/llvm/tools/clang/lib/Basic/DiagnosticIDs.cpp
@@ -14,6 +14,7 @@
#include "clang/AST/ASTDiagnostic.h"
#include "clang/Analysis/AnalysisDiagnostic.h"
#include "clang/Basic/DiagnosticIDs.h"
+#include "clang/Basic/DiagnosticCategories.h"
#include "clang/Basic/SourceManager.h"
#include "clang/Driver/DriverDiagnostic.h"
#include "clang/Frontend/FrontendDiagnostic.h"
@@ -135,7 +136,7 @@ static const unsigned StaticDiagInfoSize =
sizeof(StaticDiagInfo)/sizeof(StaticDiagInfo[0])-1;
/// To be sorted before first use (since it's splitted among multiple files)
-static StaticDiagNameIndexRec StaticDiagNameIndex[] = {
+static const StaticDiagNameIndexRec StaticDiagNameIndex[] = {
#define DIAG_NAME_INDEX(ENUM) { #ENUM, diag::ENUM, STR_SIZE(#ENUM, uint8_t) },
#include "clang/Basic/DiagnosticIndexName.inc"
#undef DIAG_NAME_INDEX
@@ -199,19 +200,21 @@ unsigned DiagnosticIDs::getCategoryNumberForDiag(unsigned DiagID) {
return 0;
}
-// The diagnostic category names.
-struct StaticDiagCategoryRec {
- const char *NameStr;
- uint8_t NameLen;
+namespace {
+ // The diagnostic category names.
+ struct StaticDiagCategoryRec {
+ const char *NameStr;
+ uint8_t NameLen;
- llvm::StringRef getName() const {
- return llvm::StringRef(NameStr, NameLen);
- }
-};
+ llvm::StringRef getName() const {
+ return llvm::StringRef(NameStr, NameLen);
+ }
+ };
+}
-static StaticDiagCategoryRec CategoryNameTable[] = {
+static const StaticDiagCategoryRec CategoryNameTable[] = {
#define GET_CATEGORY_TABLE
-#define CATEGORY(X) { X, STR_SIZE(X, uint8_t) },
+#define CATEGORY(X, ENUM) { X, STR_SIZE(X, uint8_t) },
#include "clang/Basic/DiagnosticGroups.inc"
#undef GET_CATEGORY_TABLE
{ 0, 0 }
@@ -261,7 +264,7 @@ llvm::StringRef DiagnosticIDs::getName(unsigned DiagID) {
/// getIdFromName - Given a diagnostic name, return its ID, or 0
unsigned DiagnosticIDs::getIdFromName(llvm::StringRef Name) {
- StaticDiagNameIndexRec *StaticDiagNameIndexEnd =
+ const StaticDiagNameIndexRec *StaticDiagNameIndexEnd =
StaticDiagNameIndex + StaticDiagNameIndexSize;
if (Name.empty()) { return diag::DIAG_UPPER_LIMIT; }
@@ -543,17 +546,21 @@ DiagnosticIDs::getDiagnosticLevel(unsigned DiagID, unsigned DiagClass,
return Result;
}
-struct WarningOption {
- // Be safe with the size of 'NameLen' because we don't statically check if the
- // size will fit in the field; the struct size won't decrease with a shorter
- // type anyway.
- size_t NameLen;
- const char *NameStr;
- const short *Members;
- const short *SubGroups;
-
- llvm::StringRef getName() const { return llvm::StringRef(NameStr, NameLen); }
-};
+namespace {
+ struct WarningOption {
+ // Be safe with the size of 'NameLen' because we don't statically check if
+ // the size will fit in the field; the struct size won't decrease with a
+ // shorter type anyway.
+ size_t NameLen;
+ const char *NameStr;
+ const short *Members;
+ const short *SubGroups;
+
+ llvm::StringRef getName() const {
+ return llvm::StringRef(NameStr, NameLen);
+ }
+ };
+}
#define GET_DIAG_ARRAYS
#include "clang/Basic/DiagnosticGroups.inc"
@@ -678,6 +685,12 @@ bool DiagnosticIDs::ProcessDiag(Diagnostic &Diag) const {
return false;
if (DiagLevel >= DiagnosticIDs::Error) {
+ Diag.TrapErrorOccurred = true;
+ if (isUnrecoverable(DiagID)) {
+ Diag.TrapUnrecoverableErrorOccurred = true;
+ Diag.UnrecoverableErrorOccurred = true;
+ }
+
if (Diag.Client->IncludeInDiagnosticCounts()) {
Diag.ErrorOccurred = true;
++Diag.NumErrors;
@@ -714,3 +727,25 @@ bool DiagnosticIDs::ProcessDiag(Diagnostic &Diag) const {
return true;
}
+
+bool DiagnosticIDs::isUnrecoverable(unsigned DiagID) const {
+ if (DiagID >= diag::DIAG_UPPER_LIMIT) {
+ // Custom diagnostics.
+ return CustomDiagInfo->getLevel(DiagID) >= DiagnosticIDs::Error;
+ }
+
+ // Only errors may be unrecoverable.
+ if (getBuiltinDiagClass(DiagID) < CLASS_ERROR)
+ return false;
+
+ if (DiagID == diag::err_unavailable ||
+ DiagID == diag::err_unavailable_message)
+ return false;
+
+ // Currently we consider all ARC errors as recoverable.
+ if (getCategoryNumberForDiag(DiagID) ==
+ diag::DiagCat_Automatic_Reference_Counting_Issue)
+ return false;
+
+ return true;
+}
diff --git a/contrib/llvm/tools/clang/lib/Basic/IdentifierTable.cpp b/contrib/llvm/tools/clang/lib/Basic/IdentifierTable.cpp
index 4711faa..188e2d4 100644
--- a/contrib/llvm/tools/clang/lib/Basic/IdentifierTable.cpp
+++ b/contrib/llvm/tools/clang/lib/Basic/IdentifierTable.cpp
@@ -17,6 +17,7 @@
#include "llvm/ADT/FoldingSet.h"
#include "llvm/ADT/DenseMap.h"
#include "llvm/ADT/StringRef.h"
+#include "llvm/ADT/StringSwitch.h"
#include "llvm/Support/raw_ostream.h"
#include <cstdio>
@@ -92,7 +93,8 @@ namespace {
KEYBORLAND = 0x100,
KEYOPENCL = 0x200,
KEYC1X = 0x400,
- KEYALL = 0x7ff
+ KEYARC = 0x800,
+ KEYALL = 0x0fff
};
}
@@ -120,7 +122,8 @@ static void AddKeyword(llvm::StringRef Keyword,
else if (LangOpts.OpenCL && (Flags & KEYOPENCL)) AddResult = 2;
else if (!LangOpts.CPlusPlus && (Flags & KEYNOCXX)) AddResult = 2;
else if (LangOpts.C1X && (Flags & KEYC1X)) AddResult = 2;
-
+ else if (LangOpts.ObjCAutoRefCount && (Flags & KEYARC)) AddResult = 2;
+
// Don't add this keyword if disabled in this language.
if (AddResult == 0) return;
@@ -394,6 +397,8 @@ ObjCMethodFamily Selector::getMethodFamilyImpl(Selector sel) {
if (name == "retainCount") return OMF_retainCount;
if (name == "self") return OMF_self;
}
+
+ if (name == "performSelector") return OMF_performSelector;
// The other method families may begin with a prefix of underscores.
while (!name.empty() && name.front() == '_')
diff --git a/contrib/llvm/tools/clang/lib/Basic/SourceManager.cpp b/contrib/llvm/tools/clang/lib/Basic/SourceManager.cpp
index 2de8ab7..45922c1 100644
--- a/contrib/llvm/tools/clang/lib/Basic/SourceManager.cpp
+++ b/contrib/llvm/tools/clang/lib/Basic/SourceManager.cpp
@@ -169,11 +169,11 @@ const llvm::MemoryBuffer *ContentCache::getBuffer(Diagnostic &Diag,
return Buffer.getPointer();
}
-unsigned LineTableInfo::getLineTableFilenameID(const char *Ptr, unsigned Len) {
+unsigned LineTableInfo::getLineTableFilenameID(llvm::StringRef Name) {
// Look up the filename in the string table, returning the pre-existing value
// if it exists.
llvm::StringMapEntry<unsigned> &Entry =
- FilenameIDs.GetOrCreateValue(Ptr, Ptr+Len, ~0U);
+ FilenameIDs.GetOrCreateValue(Name, ~0U);
if (Entry.getValue() != ~0U)
return Entry.getValue();
@@ -277,10 +277,10 @@ void LineTableInfo::AddEntry(unsigned FID,
/// getLineTableFilenameID - Return the uniqued ID for the specified filename.
///
-unsigned SourceManager::getLineTableFilenameID(const char *Ptr, unsigned Len) {
+unsigned SourceManager::getLineTableFilenameID(llvm::StringRef Name) {
if (LineTable == 0)
LineTable = new LineTableInfo();
- return LineTable->getLineTableFilenameID(Ptr, Len);
+ return LineTable->getLineTableFilenameID(Name);
}
@@ -531,16 +531,31 @@ FileID SourceManager::createFileID(const ContentCache *File,
return LastFileIDLookup = FID;
}
-/// createInstantiationLoc - Return a new SourceLocation that encodes the fact
-/// that a token from SpellingLoc should actually be referenced from
-/// InstantiationLoc.
+SourceLocation
+SourceManager::createMacroArgInstantiationLoc(SourceLocation SpellingLoc,
+ SourceLocation ILoc,
+ unsigned TokLength) {
+ InstantiationInfo II =
+ InstantiationInfo::createForMacroArg(SpellingLoc, ILoc);
+ return createInstantiationLocImpl(II, TokLength);
+}
+
SourceLocation SourceManager::createInstantiationLoc(SourceLocation SpellingLoc,
SourceLocation ILocStart,
SourceLocation ILocEnd,
unsigned TokLength,
unsigned PreallocatedID,
unsigned Offset) {
- InstantiationInfo II = InstantiationInfo::get(ILocStart,ILocEnd, SpellingLoc);
+ InstantiationInfo II =
+ InstantiationInfo::create(SpellingLoc, ILocStart, ILocEnd);
+ return createInstantiationLocImpl(II, TokLength, PreallocatedID, Offset);
+}
+
+SourceLocation
+SourceManager::createInstantiationLocImpl(const InstantiationInfo &II,
+ unsigned TokLength,
+ unsigned PreallocatedID,
+ unsigned Offset) {
if (PreallocatedID) {
// If we're filling in a preallocated ID, just load in the
// instantiation entry and return.
@@ -749,18 +764,19 @@ SourceLocation SourceManager::getSpellingLocSlowCase(SourceLocation Loc) const {
std::pair<FileID, unsigned>
-SourceManager::getDecomposedInstantiationLocSlowCase(const SrcMgr::SLocEntry *E,
- unsigned Offset) const {
+SourceManager::getDecomposedInstantiationLocSlowCase(
+ const SrcMgr::SLocEntry *E) const {
// If this is an instantiation record, walk through all the instantiation
// points.
FileID FID;
SourceLocation Loc;
+ unsigned Offset;
do {
Loc = E->getInstantiation().getInstantiationLocStart();
FID = getFileID(Loc);
E = &getSLocEntry(FID);
- Offset += Loc.getOffset()-E->getOffset();
+ Offset = Loc.getOffset()-E->getOffset();
} while (!Loc.isFileID());
return std::make_pair(FID, Offset);
@@ -823,6 +839,14 @@ SourceManager::getInstantiationRange(SourceLocation Loc) const {
return Res;
}
+bool SourceManager::isMacroArgInstantiation(SourceLocation Loc) const {
+ if (!Loc.isMacroID()) return false;
+
+ FileID FID = getFileID(Loc);
+ const SrcMgr::SLocEntry *E = &getSLocEntry(FID);
+ const SrcMgr::InstantiationInfo &II = E->getInstantiation();
+ return II.isMacroArgInstantiation();
+}
//===----------------------------------------------------------------------===//
@@ -917,7 +941,7 @@ static void ComputeLineNumbers(Diagnostic &Diag, ContentCache *FI,
// Find the file offsets of all of the *physical* source lines. This does
// not look at trigraphs, escaped newlines, or anything else tricky.
- std::vector<unsigned> LineOffsets;
+ llvm::SmallVector<unsigned, 256> LineOffsets;
// Line #1 starts at char 0.
LineOffsets.push_back(0);
@@ -1213,73 +1237,6 @@ PresumedLoc SourceManager::getPresumedLoc(SourceLocation Loc) const {
return PresumedLoc(Filename, LineNo, ColNo, IncludeLoc);
}
-/// \brief Returns true if the given MacroID location points at the first
-/// token of the macro instantiation.
-bool SourceManager::isAtStartOfMacroInstantiation(SourceLocation loc) const {
- assert(loc.isValid() && loc.isMacroID() && "Expected a valid macro loc");
-
- unsigned FID = getFileID(loc).ID;
- assert(FID > 1);
- std::pair<SourceLocation, SourceLocation>
- instRange = getImmediateInstantiationRange(loc);
-
- bool invalid = false;
- const SrcMgr::SLocEntry &Entry = getSLocEntry(FID-1, &invalid);
- if (invalid)
- return false;
-
- // If the FileID immediately before it is a file then this is the first token
- // in the macro.
- if (Entry.isFile())
- return true;
-
- // If the FileID immediately before it (which is a macro token) is the
- // immediate instantiated macro, check this macro token's location.
- if (getFileID(instRange.second).ID == FID-1)
- return isAtStartOfMacroInstantiation(instRange.first);
-
- // If the FileID immediately before it (which is a macro token) came from a
- // different instantiation, then this is the first token in the macro.
- if (getInstantiationLoc(Entry.getInstantiation().getInstantiationLocStart())
- != getInstantiationLoc(loc))
- return true;
-
- // It is inside the macro or the last token in the macro.
- return false;
-}
-
-/// \brief Returns true if the given MacroID location points at the last
-/// token of the macro instantiation.
-bool SourceManager::isAtEndOfMacroInstantiation(SourceLocation loc) const {
- assert(loc.isValid() && loc.isMacroID() && "Expected a valid macro loc");
-
- unsigned FID = getFileID(loc).ID;
- assert(FID > 1);
- std::pair<SourceLocation, SourceLocation>
- instRange = getInstantiationRange(loc);
-
- // If there's no FileID after it, it is the last token in the macro.
- if (FID+1 == sloc_entry_size())
- return true;
-
- bool invalid = false;
- const SrcMgr::SLocEntry &Entry = getSLocEntry(FID+1, &invalid);
- if (invalid)
- return false;
-
- // If the FileID immediately after it is a file or a macro token which
- // came from a different instantiation, then this is the last token in the
- // macro.
- if (Entry.isFile())
- return true;
- if (getInstantiationLoc(Entry.getInstantiation().getInstantiationLocStart())
- != instRange.first)
- return true;
-
- // It is inside the macro or the first token in the macro.
- return false;
-}
-
//===----------------------------------------------------------------------===//
// Other miscellaneous methods.
//===----------------------------------------------------------------------===//
@@ -1474,8 +1431,6 @@ bool SourceManager::isBeforeInTranslationUnit(SourceLocation LHS,
// reflect the order that the tokens, pointed to by these locations, were
// instantiated (during parsing each token that is instantiated by a macro,
// expands the SLocEntries).
- if (LHS.isMacroID() && RHS.isMacroID())
- return LHS.getOffset() < RHS.getOffset();
std::pair<FileID, unsigned> LOffs = getDecomposedLoc(LHS);
std::pair<FileID, unsigned> ROffs = getDecomposedLoc(RHS);
@@ -1562,7 +1517,9 @@ void SourceManager::PrintStats() const {
llvm::errs() << "\n*** Source Manager Stats:\n";
llvm::errs() << FileInfos.size() << " files mapped, " << MemBufferInfos.size()
<< " mem buffers mapped.\n";
- llvm::errs() << SLocEntryTable.size() << " SLocEntry's allocated, "
+ llvm::errs() << SLocEntryTable.size() << " SLocEntry's allocated ("
+ << SLocEntryTable.capacity()*sizeof(SrcMgr::SLocEntry)
+ << " bytes of capacity), "
<< NextOffset << "B of Sloc address space used.\n";
unsigned NumLineNumsComputed = 0;
diff --git a/contrib/llvm/tools/clang/lib/Basic/TargetInfo.cpp b/contrib/llvm/tools/clang/lib/Basic/TargetInfo.cpp
index dcf0cb4..30a9bdb 100644
--- a/contrib/llvm/tools/clang/lib/Basic/TargetInfo.cpp
+++ b/contrib/llvm/tools/clang/lib/Basic/TargetInfo.cpp
@@ -181,6 +181,14 @@ static llvm::StringRef removeGCCRegisterPrefix(llvm::StringRef Name) {
return Name;
}
+/// isValidClobber - Returns whether the passed in string is
+/// a valid clobber in an inline asm statement. This is used by
+/// Sema.
+bool TargetInfo::isValidClobber(llvm::StringRef Name) const {
+ return (isValidGCCRegisterName(Name) ||
+ Name == "memory" || Name == "cc");
+}
+
/// isValidGCCRegisterName - Returns whether the passed in string
/// is a valid register name according to GCC. This is used by Sema for
/// inline asm statements.
@@ -194,9 +202,6 @@ bool TargetInfo::isValidGCCRegisterName(llvm::StringRef Name) const {
// Get rid of any register prefix.
Name = removeGCCRegisterPrefix(Name);
- if (Name == "memory" || Name == "cc")
- return true;
-
getGCCRegNames(Names, NumNames);
// If we have a number it maps to an entry in the register name array.
@@ -212,6 +217,20 @@ bool TargetInfo::isValidGCCRegisterName(llvm::StringRef Name) const {
return true;
}
+ // Check any additional names that we have.
+ const AddlRegName *AddlNames;
+ unsigned NumAddlNames;
+ getGCCAddlRegNames(AddlNames, NumAddlNames);
+ for (unsigned i = 0; i < NumAddlNames; i++)
+ for (unsigned j = 0; j < llvm::array_lengthof(AddlNames[i].Names); j++) {
+ if (!AddlNames[i].Names[j])
+ break;
+ // Make sure the register that the additional name is for is within
+ // the bounds of the register names from above.
+ if (AddlNames[i].Names[j] == Name && AddlNames[i].RegNum < NumNames)
+ return true;
+ }
+
// Now check aliases.
const GCCRegAlias *Aliases;
unsigned NumAliases;
@@ -251,6 +270,20 @@ TargetInfo::getNormalizedGCCRegisterName(llvm::StringRef Name) const {
}
}
+ // Check any additional names that we have.
+ const AddlRegName *AddlNames;
+ unsigned NumAddlNames;
+ getGCCAddlRegNames(AddlNames, NumAddlNames);
+ for (unsigned i = 0; i < NumAddlNames; i++)
+ for (unsigned j = 0; j < llvm::array_lengthof(AddlNames[i].Names); j++) {
+ if (!AddlNames[i].Names[j])
+ break;
+ // Make sure the register that the additional name is for is within
+ // the bounds of the register names from above.
+ if (AddlNames[i].Names[j] == Name && AddlNames[i].RegNum < NumNames)
+ return Name;
+ }
+
// Now check aliases.
const GCCRegAlias *Aliases;
unsigned NumAliases;
diff --git a/contrib/llvm/tools/clang/lib/Basic/Targets.cpp b/contrib/llvm/tools/clang/lib/Basic/Targets.cpp
index dd167dc..3518ea6 100644
--- a/contrib/llvm/tools/clang/lib/Basic/Targets.cpp
+++ b/contrib/llvm/tools/clang/lib/Basic/Targets.cpp
@@ -84,14 +84,28 @@ static void getDarwinDefines(MacroBuilder &Builder, const LangOptions &Opts,
Builder.defineMacro("__MACH__");
Builder.defineMacro("OBJC_NEW_PROPERTIES");
- // __weak is always defined, for use in blocks and with objc pointers.
- Builder.defineMacro("__weak", "__attribute__((objc_gc(weak)))");
+ if (!Opts.ObjCAutoRefCount) {
+ // __weak is always defined, for use in blocks and with objc pointers.
+ Builder.defineMacro("__weak", "__attribute__((objc_gc(weak)))");
- // Darwin defines __strong even in C mode (just to nothing).
- if (!Opts.ObjC1 || Opts.getGCMode() == LangOptions::NonGC)
- Builder.defineMacro("__strong", "");
- else
- Builder.defineMacro("__strong", "__attribute__((objc_gc(strong)))");
+ // Darwin defines __strong even in C mode (just to nothing).
+ if (Opts.getGCMode() != LangOptions::NonGC)
+ Builder.defineMacro("__strong", "__attribute__((objc_gc(strong)))");
+ else
+ Builder.defineMacro("__strong", "");
+
+ // __unsafe_unretained is defined to nothing in non-ARC mode. We even
+ // allow this in C, since one might have block pointers in structs that
+ // are used in pure C code and in Objective-C ARC.
+ Builder.defineMacro("__unsafe_unretained", "");
+
+ // The Objective-C bridged cast keywords are defined to nothing in non-ARC
+ // mode; then they become normal, C-style casts.
+ Builder.defineMacro("__bridge", "");
+ Builder.defineMacro("__bridge_transfer", "");
+ Builder.defineMacro("__bridge_retained", "");
+ Builder.defineMacro("__bridge_retain", "");
+ }
if (Opts.Static)
Builder.defineMacro("__STATIC__");
@@ -168,14 +182,15 @@ class DarwinTargetInfo : public OSTargetInfo<Target> {
protected:
virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
MacroBuilder &Builder) const {
- getDarwinDefines(Builder, Opts, Triple, this->PlatformName,
+ getDarwinDefines(Builder, Opts, Triple, this->PlatformName,
this->PlatformMinVersion);
}
public:
DarwinTargetInfo(const std::string& triple) :
OSTargetInfo<Target>(triple) {
- this->TLSSupported = llvm::Triple(triple).getDarwinMajorNumber() > 10;
+ llvm::Triple T = llvm::Triple(triple);
+ this->TLSSupported = T.isMacOSX() && !T.isMacOSXVersionLT(10,7);
this->MCountName = "\01mcount";
}
@@ -512,7 +527,6 @@ class PPCTargetInfo : public TargetInfo {
static const Builtin::Info BuiltinInfo[];
static const char * const GCCRegNames[];
static const TargetInfo::GCCRegAlias GCCRegAliases[];
-
public:
PPCTargetInfo(const std::string& triple) : TargetInfo(triple) {}
@@ -633,9 +647,9 @@ public:
};
const Builtin::Info PPCTargetInfo::BuiltinInfo[] = {
-#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES, false },
+#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
- ALL_LANGUAGES, false },
+ ALL_LANGUAGES },
#include "clang/Basic/BuiltinsPPC.def"
};
@@ -660,7 +674,8 @@ void PPCTargetInfo::getTargetDefines(const LangOptions &Opts,
}
// Target properties.
- Builder.defineMacro("_BIG_ENDIAN");
+ if (getTriple().getOS() != llvm::Triple::NetBSD)
+ Builder.defineMacro("_BIG_ENDIAN");
Builder.defineMacro("__BIG_ENDIAN__");
// Subtarget options.
@@ -788,8 +803,14 @@ public:
DescriptionString = "E-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
"i64:64:64-f32:32:32-f64:64:64-v128:128:128-n32";
- if (getTriple().getOS() == llvm::Triple::FreeBSD)
- SizeType = UnsignedInt;
+ switch (getTriple().getOS()) {
+ case llvm::Triple::FreeBSD:
+ case llvm::Triple::NetBSD:
+ SizeType = UnsignedInt;
+ break;
+ default:
+ break;
+ }
}
virtual const char *getVAListDeclaration() const {
@@ -890,9 +911,9 @@ namespace {
};
const Builtin::Info PTXTargetInfo::BuiltinInfo[] = {
-#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES, false },
+#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
- ALL_LANGUAGES, false },
+ ALL_LANGUAGES },
#include "clang/Basic/BuiltinsPTX.def"
};
@@ -1058,49 +1079,49 @@ void MBlazeTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
namespace {
// Namespace for x86 abstract base class
const Builtin::Info BuiltinInfo[] = {
-#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES, false },
+#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
- ALL_LANGUAGES, false },
+ ALL_LANGUAGES },
#include "clang/Basic/BuiltinsX86.def"
};
static const char* const GCCRegNames[] = {
"ax", "dx", "cx", "bx", "si", "di", "bp", "sp",
"st", "st(1)", "st(2)", "st(3)", "st(4)", "st(5)", "st(6)", "st(7)",
- "argp", "flags", "fspr", "dirflag", "frame",
+ "argp", "flags", "fpcr", "fpsr", "dirflag", "frame",
"xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6", "xmm7",
"mm0", "mm1", "mm2", "mm3", "mm4", "mm5", "mm6", "mm7",
"r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
- "xmm8", "xmm9", "xmm10", "xmm11", "xmm12", "xmm13", "xmm14", "xmm15"
+ "xmm8", "xmm9", "xmm10", "xmm11", "xmm12", "xmm13", "xmm14", "xmm15",
};
-const TargetInfo::GCCRegAlias GCCRegAliases[] = {
- { { "al", "ah", "eax", "rax" }, "ax" },
- { { "bl", "bh", "ebx", "rbx" }, "bx" },
- { { "cl", "ch", "ecx", "rcx" }, "cx" },
- { { "dl", "dh", "edx", "rdx" }, "dx" },
- { { "esi", "rsi" }, "si" },
- { { "edi", "rdi" }, "di" },
- { { "esp", "rsp" }, "sp" },
- { { "ebp", "rbp" }, "bp" },
+const TargetInfo::AddlRegName AddlRegNames[] = {
+ { { "al", "ah", "eax", "rax" }, 0 },
+ { { "bl", "bh", "ebx", "rbx" }, 3 },
+ { { "cl", "ch", "ecx", "rcx" }, 2 },
+ { { "dl", "dh", "edx", "rdx" }, 1 },
+ { { "esi", "rsi" }, 4 },
+ { { "edi", "rdi" }, 5 },
+ { { "esp", "rsp" }, 7 },
+ { { "ebp", "rbp" }, 6 },
};
// X86 target abstract base class; x86-32 and x86-64 are very close, so
// most of the implementation can be shared.
class X86TargetInfo : public TargetInfo {
enum X86SSEEnum {
- NoMMXSSE, MMX, SSE1, SSE2, SSE3, SSSE3, SSE41, SSE42
+ NoSSE, SSE1, SSE2, SSE3, SSSE3, SSE41, SSE42
} SSELevel;
- enum AMD3DNowEnum {
- NoAMD3DNow, AMD3DNow, AMD3DNowAthlon
- } AMD3DNowLevel;
+ enum MMX3DNowEnum {
+ NoMMX3DNow, MMX, AMD3DNow, AMD3DNowAthlon
+ } MMX3DNowLevel;
bool HasAES;
bool HasAVX;
public:
X86TargetInfo(const std::string& triple)
- : TargetInfo(triple), SSELevel(NoMMXSSE), AMD3DNowLevel(NoAMD3DNow),
+ : TargetInfo(triple), SSELevel(NoSSE), MMX3DNowLevel(NoMMX3DNow),
HasAES(false), HasAVX(false) {
LongDoubleFormat = &llvm::APFloat::x87DoubleExtended;
}
@@ -1116,8 +1137,13 @@ public:
}
virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
unsigned &NumAliases) const {
- Aliases = GCCRegAliases;
- NumAliases = llvm::array_lengthof(GCCRegAliases);
+ Aliases = 0;
+ NumAliases = 0;
+ }
+ virtual void getGCCAddlRegNames(const AddlRegName *&Names,
+ unsigned &NumNames) const {
+ Names = AddlRegNames;
+ NumNames = llvm::array_lengthof(AddlRegNames);
}
virtual bool validateAsmConstraint(const char *&Name,
TargetInfo::ConstraintInfo &info) const;
@@ -1133,6 +1159,9 @@ public:
virtual void getDefaultFeatures(const std::string &CPU,
llvm::StringMap<bool> &Features) const;
virtual void HandleTargetFeatures(std::vector<std::string> &Features);
+ virtual const char* getABI() const {
+ return MMX3DNowLevel == NoMMX3DNow ? "no-mmx" : "";
+ }
};
void X86TargetInfo::getDefaultFeatures(const std::string &CPU,
@@ -1164,31 +1193,38 @@ void X86TargetInfo::getDefaultFeatures(const std::string &CPU,
;
else if (CPU == "pentium-mmx" || CPU == "pentium2")
setFeatureEnabled(Features, "mmx", true);
- else if (CPU == "pentium3")
+ else if (CPU == "pentium3") {
+ setFeatureEnabled(Features, "mmx", true);
setFeatureEnabled(Features, "sse", true);
- else if (CPU == "pentium-m" || CPU == "pentium4" || CPU == "x86-64")
+ } else if (CPU == "pentium-m" || CPU == "pentium4" || CPU == "x86-64") {
+ setFeatureEnabled(Features, "mmx", true);
setFeatureEnabled(Features, "sse2", true);
- else if (CPU == "yonah" || CPU == "prescott" || CPU == "nocona")
+ } else if (CPU == "yonah" || CPU == "prescott" || CPU == "nocona") {
+ setFeatureEnabled(Features, "mmx", true);
setFeatureEnabled(Features, "sse3", true);
- else if (CPU == "core2")
+ } else if (CPU == "core2") {
+ setFeatureEnabled(Features, "mmx", true);
setFeatureEnabled(Features, "ssse3", true);
- else if (CPU == "penryn") {
+ } else if (CPU == "penryn") {
+ setFeatureEnabled(Features, "mmx", true);
setFeatureEnabled(Features, "sse4", true);
Features["sse42"] = false;
- } else if (CPU == "atom")
+ } else if (CPU == "atom") {
+ setFeatureEnabled(Features, "mmx", true);
setFeatureEnabled(Features, "sse3", true);
- else if (CPU == "corei7") {
+ } else if (CPU == "corei7") {
+ setFeatureEnabled(Features, "mmx", true);
setFeatureEnabled(Features, "sse4", true);
setFeatureEnabled(Features, "aes", true);
} else if (CPU == "corei7-avx") {
+ setFeatureEnabled(Features, "mmx", true);
setFeatureEnabled(Features, "sse4", true);
setFeatureEnabled(Features, "aes", true);
-// setFeatureEnabled(Features, "avx", true);
+ //setFeatureEnabled(Features, "avx", true);
} else if (CPU == "k6" || CPU == "winchip-c6")
setFeatureEnabled(Features, "mmx", true);
else if (CPU == "k6-2" || CPU == "k6-3" || CPU == "athlon" ||
CPU == "athlon-tbird" || CPU == "winchip2" || CPU == "c3") {
- setFeatureEnabled(Features, "mmx", true);
setFeatureEnabled(Features, "3dnow", true);
} else if (CPU == "athlon-4" || CPU == "athlon-xp" || CPU == "athlon-mp") {
setFeatureEnabled(Features, "sse", true);
@@ -1200,8 +1236,10 @@ void X86TargetInfo::getDefaultFeatures(const std::string &CPU,
} else if (CPU == "k8-sse3") {
setFeatureEnabled(Features, "sse3", true);
setFeatureEnabled(Features, "3dnowa", true);
- } else if (CPU == "c3-2")
+ } else if (CPU == "c3-2") {
+ setFeatureEnabled(Features, "mmx", true);
setFeatureEnabled(Features, "sse", true);
+ }
}
bool X86TargetInfo::setFeatureEnabled(llvm::StringMap<bool> &Features,
@@ -1217,34 +1255,31 @@ bool X86TargetInfo::setFeatureEnabled(llvm::StringMap<bool> &Features,
if (Name == "mmx")
Features["mmx"] = true;
else if (Name == "sse")
- Features["mmx"] = Features["sse"] = true;
+ Features["sse"] = true;
else if (Name == "sse2")
- Features["mmx"] = Features["sse"] = Features["sse2"] = true;
+ Features["sse"] = Features["sse2"] = true;
else if (Name == "sse3")
- Features["mmx"] = Features["sse"] = Features["sse2"] =
- Features["sse3"] = true;
+ Features["sse"] = Features["sse2"] = Features["sse3"] = true;
else if (Name == "ssse3")
- Features["mmx"] = Features["sse"] = Features["sse2"] = Features["sse3"] =
+ Features["sse"] = Features["sse2"] = Features["sse3"] =
Features["ssse3"] = true;
else if (Name == "sse4" || Name == "sse4.2")
- Features["mmx"] = Features["sse"] = Features["sse2"] = Features["sse3"] =
+ Features["sse"] = Features["sse2"] = Features["sse3"] =
Features["ssse3"] = Features["sse41"] = Features["sse42"] = true;
else if (Name == "sse4.1")
- Features["mmx"] = Features["sse"] = Features["sse2"] = Features["sse3"] =
+ Features["sse"] = Features["sse2"] = Features["sse3"] =
Features["ssse3"] = Features["sse41"] = true;
else if (Name == "3dnow")
- Features["3dnowa"] = true;
+ Features["mmx"] = Features["3dnow"] = true;
else if (Name == "3dnowa")
- Features["3dnow"] = Features["3dnowa"] = true;
+ Features["mmx"] = Features["3dnow"] = Features["3dnowa"] = true;
else if (Name == "aes")
Features["aes"] = true;
else if (Name == "avx")
Features["avx"] = true;
} else {
if (Name == "mmx")
- Features["mmx"] = Features["3dnow"] = Features["3dnowa"] =
- Features["sse"] = Features["sse2"] = Features["sse3"] =
- Features["ssse3"] = Features["sse41"] = Features["sse42"] = false;
+ Features["mmx"] = Features["3dnow"] = Features["3dnowa"] = false;
else if (Name == "sse")
Features["sse"] = Features["sse2"] = Features["sse3"] =
Features["ssse3"] = Features["sse41"] = Features["sse42"] = false;
@@ -1302,18 +1337,25 @@ void X86TargetInfo::HandleTargetFeatures(std::vector<std::string> &Features) {
.Case("sse3", SSE3)
.Case("sse2", SSE2)
.Case("sse", SSE1)
- .Case("mmx", MMX)
- .Default(NoMMXSSE);
+ .Default(NoSSE);
SSELevel = std::max(SSELevel, Level);
- AMD3DNowEnum ThreeDNowLevel =
- llvm::StringSwitch<AMD3DNowEnum>(Features[i].substr(1))
+ MMX3DNowEnum ThreeDNowLevel =
+ llvm::StringSwitch<MMX3DNowEnum>(Features[i].substr(1))
.Case("3dnowa", AMD3DNowAthlon)
.Case("3dnow", AMD3DNow)
- .Default(NoAMD3DNow);
+ .Case("mmx", MMX)
+ .Default(NoMMX3DNow);
- AMD3DNowLevel = std::max(AMD3DNowLevel, ThreeDNowLevel);
+ MMX3DNowLevel = std::max(MMX3DNowLevel, ThreeDNowLevel);
}
+
+ // Don't tell the backend if we're turning off mmx; it will end up disabling
+ // SSE, which we don't want.
+ std::vector<std::string>::iterator it;
+ it = std::find(Features.begin(), Features.end(), "-mmx");
+ if (it != Features.end())
+ Features.erase(it);
}
/// X86TargetInfo::getTargetDefines - Return a set of the X86-specific #defines
@@ -1368,9 +1410,7 @@ void X86TargetInfo::getTargetDefines(const LangOptions &Opts,
case SSE1:
Builder.defineMacro("__SSE__");
Builder.defineMacro("__SSE_MATH__"); // -mfp-math=sse always implied.
- case MMX:
- Builder.defineMacro("__MMX__");
- case NoMMXSSE:
+ case NoSSE:
break;
}
@@ -1392,12 +1432,14 @@ void X86TargetInfo::getTargetDefines(const LangOptions &Opts,
}
// Each case falls through to the previous one here.
- switch (AMD3DNowLevel) {
+ switch (MMX3DNowLevel) {
case AMD3DNowAthlon:
Builder.defineMacro("__3dNOW_A__");
case AMD3DNow:
Builder.defineMacro("__3dNOW__");
- case NoAMD3DNow:
+ case MMX:
+ Builder.defineMacro("__MMX__");
+ case NoMMX3DNow:
break;
}
}
@@ -1647,6 +1689,65 @@ public:
};
} // end anonymous namespace
+// RTEMS Target
+template<typename Target>
+class RTEMSTargetInfo : public OSTargetInfo<Target> {
+protected:
+ virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
+ MacroBuilder &Builder) const {
+ // RTEMS defines; list based off of gcc output
+
+ // FIXME: Move version number handling to llvm::Triple.
+ llvm::StringRef Release = Triple.getOSName().substr(strlen("rtems"), 1);
+
+ Builder.defineMacro("__rtems__");
+ Builder.defineMacro("__ELF__");
+ }
+public:
+ RTEMSTargetInfo(const std::string &triple)
+ : OSTargetInfo<Target>(triple) {
+ this->UserLabelPrefix = "";
+
+ llvm::Triple Triple(triple);
+ switch (Triple.getArch()) {
+ default:
+ case llvm::Triple::x86:
+ // this->MCountName = ".mcount";
+ break;
+ case llvm::Triple::mips:
+ case llvm::Triple::mipsel:
+ case llvm::Triple::ppc:
+ case llvm::Triple::ppc64:
+ // this->MCountName = "_mcount";
+ break;
+ case llvm::Triple::arm:
+ // this->MCountName = "__mcount";
+ break;
+ }
+
+ }
+};
+
+namespace {
+// x86-32 RTEMS target
+class RTEMSX86_32TargetInfo : public X86_32TargetInfo {
+public:
+ RTEMSX86_32TargetInfo(const std::string& triple)
+ : X86_32TargetInfo(triple) {
+ SizeType = UnsignedLong;
+ IntPtrType = SignedLong;
+ PtrDiffType = SignedLong;
+ this->UserLabelPrefix = "";
+ }
+ virtual void getTargetDefines(const LangOptions &Opts,
+ MacroBuilder &Builder) const {
+ X86_32TargetInfo::getTargetDefines(Opts, Builder);
+ Builder.defineMacro("__INTEL__");
+ Builder.defineMacro("__rtems__");
+ }
+};
+} // end anonymous namespace
+
namespace {
// x86-64 generic target
class X86_64TargetInfo : public X86TargetInfo {
@@ -1861,7 +1962,7 @@ public:
// Thumb1 add sp, #imm requires the immediate value be multiple of 4,
// so set preferred for small types to 32.
DescriptionString = ("e-p:32:32:32-i1:8:32-i8:8:32-i16:16:32-i32:32:32-"
- "i64:32:32-f32:32:32-f64:32:32-"
+ "i64:32:64-f32:32:32-f64:32:64-"
"v64:32:64-v128:32:128-a0:0:32-n32");
} else {
DescriptionString = ("e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
@@ -1882,11 +1983,6 @@ public:
void getDefaultFeatures(const std::string &CPU,
llvm::StringMap<bool> &Features) const {
- // FIXME: This should not be here.
- Features["vfp2"] = false;
- Features["vfp3"] = false;
- Features["neon"] = false;
-
if (CPU == "arm1136jf-s" || CPU == "arm1176jzf-s" || CPU == "mpcore")
Features["vfp2"] = true;
else if (CPU == "cortex-a8" || CPU == "cortex-a9")
@@ -1896,12 +1992,8 @@ public:
virtual bool setFeatureEnabled(llvm::StringMap<bool> &Features,
const std::string &Name,
bool Enabled) const {
- if (Name == "soft-float" || Name == "soft-float-abi") {
- Features[Name] = Enabled;
- } else if (Name == "vfp2" || Name == "vfp3" || Name == "neon") {
- // These effectively are a single option, reset them when any is enabled.
- if (Enabled)
- Features["vfp2"] = Features["vfp3"] = Features["neon"] = false;
+ if (Name == "soft-float" || Name == "soft-float-abi" ||
+ Name == "vfp2" || Name == "vfp3" || Name == "neon") {
Features[Name] = Enabled;
} else
return false;
@@ -2042,6 +2134,12 @@ public:
case 'q': // ...ARMV4 ldrsb
case 'v': // ...VFP load/store (reg+constant offset)
case 'y': // ...iWMMXt load/store
+ case 't': // address valid for load/store opaque types wider
+ // than 128-bits
+ case 'n': // valid address for Neon doubleword vector load/store
+ case 'm': // valid address for Neon element and structure load/store
+ case 's': // valid address for non-offset loads/stores of quad-word
+ // values in four ARM registers
Info.setAllowsMemory();
Name++;
return true;
@@ -2049,14 +2147,16 @@ public:
}
return false;
}
- std::string
- virtual convertConstraint(const char *&Constraint) const {
+ virtual std::string convertConstraint(const char *&Constraint) const {
std::string R;
switch (*Constraint) {
case 'U': // Two-character constraint; add "^" hint for later parsing.
R = std::string("^") + std::string(Constraint, 2);
Constraint++;
break;
+ case 'p': // 'p' should be translated to 'r' by default.
+ R = std::string("r");
+ break;
default:
return std::string(1, *Constraint);
}
@@ -2124,9 +2224,9 @@ void ARMTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
}
const Builtin::Info ARMTargetInfo::BuiltinInfo[] = {
-#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES, false },
+#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
- ALL_LANGUAGES, false },
+ ALL_LANGUAGES },
#include "clang/Basic/BuiltinsARM.def"
};
} // end anonymous namespace.
@@ -2727,45 +2827,81 @@ static TargetInfo *AllocateTarget(const std::string &T) {
return new LinuxTargetInfo<ARMTargetInfo>(T);
case llvm::Triple::FreeBSD:
return new FreeBSDTargetInfo<ARMTargetInfo>(T);
+ case llvm::Triple::NetBSD:
+ return new NetBSDTargetInfo<ARMTargetInfo>(T);
+ case llvm::Triple::RTEMS:
+ return new RTEMSTargetInfo<ARMTargetInfo>(T);
default:
return new ARMTargetInfo(T);
}
case llvm::Triple::bfin:
+ if ( os == llvm::Triple::RTEMS )
+ return new RTEMSTargetInfo<BlackfinTargetInfo>(T);
return new BlackfinTargetInfo(T);
case llvm::Triple::msp430:
return new MSP430TargetInfo(T);
case llvm::Triple::mips:
- if (os == llvm::Triple::Psp)
+ switch (os) {
+ case llvm::Triple::Psp:
return new PSPTargetInfo<MipsTargetInfo>(T);
- if (os == llvm::Triple::Linux)
+ case llvm::Triple::Linux:
return new LinuxTargetInfo<MipsTargetInfo>(T);
- return new MipsTargetInfo(T);
+ case llvm::Triple::RTEMS:
+ return new RTEMSTargetInfo<MipsTargetInfo>(T);
+ case llvm::Triple::FreeBSD:
+ return new FreeBSDTargetInfo<MipsTargetInfo>(T);
+ case llvm::Triple::NetBSD:
+ return new NetBSDTargetInfo<MipsTargetInfo>(T);
+ default:
+ return new MipsTargetInfo(T);
+ }
case llvm::Triple::mipsel:
- if (os == llvm::Triple::Psp)
+ switch (os) {
+ case llvm::Triple::Psp:
return new PSPTargetInfo<MipselTargetInfo>(T);
- if (os == llvm::Triple::Linux)
+ case llvm::Triple::Linux:
return new LinuxTargetInfo<MipselTargetInfo>(T);
- return new MipselTargetInfo(T);
+ case llvm::Triple::RTEMS:
+ return new RTEMSTargetInfo<MipselTargetInfo>(T);
+ case llvm::Triple::FreeBSD:
+ return new FreeBSDTargetInfo<MipselTargetInfo>(T);
+ case llvm::Triple::NetBSD:
+ return new NetBSDTargetInfo<MipselTargetInfo>(T);
+ default:
+ return new MipsTargetInfo(T);
+ }
case llvm::Triple::ppc:
if (Triple.isOSDarwin())
return new DarwinPPC32TargetInfo(T);
- else if (os == llvm::Triple::FreeBSD)
+ switch (os) {
+ case llvm::Triple::FreeBSD:
return new FreeBSDTargetInfo<PPC32TargetInfo>(T);
- return new PPC32TargetInfo(T);
+ case llvm::Triple::NetBSD:
+ return new NetBSDTargetInfo<PPC32TargetInfo>(T);
+ case llvm::Triple::RTEMS:
+ return new RTEMSTargetInfo<PPC32TargetInfo>(T);
+ default:
+ return new PPC32TargetInfo(T);
+ }
case llvm::Triple::ppc64:
if (Triple.isOSDarwin())
return new DarwinPPC64TargetInfo(T);
- else if (os == llvm::Triple::Lv2)
+ switch (os) {
+ case llvm::Triple::Lv2:
return new PS3PPUTargetInfo<PPC64TargetInfo>(T);
- else if (os == llvm::Triple::FreeBSD)
+ case llvm::Triple::FreeBSD:
return new FreeBSDTargetInfo<PPC64TargetInfo>(T);
- return new PPC64TargetInfo(T);
+ case llvm::Triple::NetBSD:
+ return new NetBSDTargetInfo<PPC64TargetInfo>(T);
+ default:
+ return new PPC64TargetInfo(T);
+ }
case llvm::Triple::ptx32:
return new PTX32TargetInfo(T);
@@ -2776,11 +2912,18 @@ static TargetInfo *AllocateTarget(const std::string &T) {
return new MBlazeTargetInfo(T);
case llvm::Triple::sparc:
- if (os == llvm::Triple::AuroraUX)
+ switch (os) {
+ case llvm::Triple::AuroraUX:
return new AuroraUXSparcV8TargetInfo(T);
- if (os == llvm::Triple::Solaris)
+ case llvm::Triple::Solaris:
return new SolarisSparcV8TargetInfo(T);
- return new SparcV8TargetInfo(T);
+ case llvm::Triple::NetBSD:
+ return new NetBSDTargetInfo<SparcV8TargetInfo>(T);
+ case llvm::Triple::RTEMS:
+ return new RTEMSTargetInfo<SparcV8TargetInfo>(T);
+ default:
+ return new SparcV8TargetInfo(T);
+ }
// FIXME: Need a real SPU target.
case llvm::Triple::cellspu:
@@ -2821,6 +2964,8 @@ static TargetInfo *AllocateTarget(const std::string &T) {
return new VisualStudioWindowsX86_32TargetInfo(T);
case llvm::Triple::Haiku:
return new HaikuX86_32TargetInfo(T);
+ case llvm::Triple::RTEMS:
+ return new RTEMSX86_32TargetInfo(T);
default:
return new X86_32TargetInfo(T);
}
@@ -2910,7 +3055,8 @@ TargetInfo *TargetInfo::CreateTargetInfo(Diagnostic &Diags,
Opts.Features.clear();
for (llvm::StringMap<bool>::const_iterator it = Features.begin(),
ie = Features.end(); it != ie; ++it)
- Opts.Features.push_back(std::string(it->second ? "+" : "-") + it->first());
+ Opts.Features.push_back(std::string(it->second ? "+" : "-") +
+ it->first().str());
Target->HandleTargetFeatures(Opts.Features);
return Target.take();
diff --git a/contrib/llvm/tools/clang/lib/CodeGen/ABIInfo.h b/contrib/llvm/tools/clang/lib/CodeGen/ABIInfo.h
index ce10398..1381238 100644
--- a/contrib/llvm/tools/clang/lib/CodeGen/ABIInfo.h
+++ b/contrib/llvm/tools/clang/lib/CodeGen/ABIInfo.h
@@ -68,22 +68,22 @@ namespace clang {
private:
Kind TheKind;
- llvm::PATypeHolder TypeData;
+ llvm::Type *TypeData;
unsigned UIntData;
bool BoolData0;
bool BoolData1;
- ABIArgInfo(Kind K, const llvm::Type *TD=0,
+ ABIArgInfo(Kind K, llvm::Type *TD=0,
unsigned UI=0, bool B0 = false, bool B1 = false)
: TheKind(K), TypeData(TD), UIntData(UI), BoolData0(B0), BoolData1(B1) {}
public:
ABIArgInfo() : TheKind(Direct), TypeData(0), UIntData(0) {}
- static ABIArgInfo getDirect(const llvm::Type *T = 0, unsigned Offset = 0) {
+ static ABIArgInfo getDirect(llvm::Type *T = 0, unsigned Offset = 0) {
return ABIArgInfo(Direct, T, Offset);
}
- static ABIArgInfo getExtend(const llvm::Type *T = 0) {
+ static ABIArgInfo getExtend(llvm::Type *T = 0) {
return ABIArgInfo(Extend, T, 0);
}
static ABIArgInfo getIgnore() {
@@ -113,12 +113,12 @@ namespace clang {
assert((isDirect() || isExtend()) && "Not a direct or extend kind");
return UIntData;
}
- const llvm::Type *getCoerceToType() const {
+ llvm::Type *getCoerceToType() const {
assert(canHaveCoerceToType() && "Invalid kind!");
return TypeData;
}
- void setCoerceToType(const llvm::Type *T) {
+ void setCoerceToType(llvm::Type *T) {
assert(canHaveCoerceToType() && "Invalid kind!");
TypeData = T;
}
diff --git a/contrib/llvm/tools/clang/lib/CodeGen/BackendUtil.cpp b/contrib/llvm/tools/clang/lib/CodeGen/BackendUtil.cpp
index 01d15ff..85f42db 100644
--- a/contrib/llvm/tools/clang/lib/CodeGen/BackendUtil.cpp
+++ b/contrib/llvm/tools/clang/lib/CodeGen/BackendUtil.cpp
@@ -10,6 +10,7 @@
#include "clang/CodeGen/BackendUtil.h"
#include "clang/Basic/Diagnostic.h"
#include "clang/Basic/TargetOptions.h"
+#include "clang/Basic/LangOptions.h"
#include "clang/Frontend/CodeGenOptions.h"
#include "clang/Frontend/FrontendDiagnostic.h"
#include "llvm/Module.h"
@@ -18,13 +19,13 @@
#include "llvm/Bitcode/ReaderWriter.h"
#include "llvm/CodeGen/RegAllocRegistry.h"
#include "llvm/CodeGen/SchedulerRegistry.h"
+#include "llvm/MC/SubtargetFeature.h"
#include "llvm/Support/CommandLine.h"
#include "llvm/Support/FormattedStream.h"
#include "llvm/Support/PrettyStackTrace.h"
#include "llvm/Support/PassManagerBuilder.h"
#include "llvm/Support/Timer.h"
#include "llvm/Support/raw_ostream.h"
-#include "llvm/Target/SubtargetFeature.h"
#include "llvm/Target/TargetData.h"
#include "llvm/Target/TargetMachine.h"
#include "llvm/Target/TargetOptions.h"
@@ -39,6 +40,7 @@ class EmitAssemblyHelper {
Diagnostic &Diags;
const CodeGenOptions &CodeGenOpts;
const TargetOptions &TargetOpts;
+ const LangOptions &LangOpts;
Module *TheModule;
Timer CodeGenerationTime;
@@ -82,8 +84,9 @@ private:
public:
EmitAssemblyHelper(Diagnostic &_Diags,
const CodeGenOptions &CGOpts, const TargetOptions &TOpts,
+ const LangOptions &LOpts,
Module *M)
- : Diags(_Diags), CodeGenOpts(CGOpts), TargetOpts(TOpts),
+ : Diags(_Diags), CodeGenOpts(CGOpts), TargetOpts(TOpts), LangOpts(LOpts),
TheModule(M), CodeGenerationTime("Code Generation Time"),
CodeGenPasses(0), PerModulePasses(0), PerFunctionPasses(0) {}
@@ -98,6 +101,16 @@ public:
}
+static void addObjCARCExpandPass(const PassManagerBuilder &Builder, PassManagerBase &PM) {
+ if (Builder.OptLevel > 0)
+ PM.add(createObjCARCExpandPass());
+}
+
+static void addObjCARCOptPass(const PassManagerBuilder &Builder, PassManagerBase &PM) {
+ if (Builder.OptLevel > 0)
+ PM.add(createObjCARCOptPass());
+}
+
void EmitAssemblyHelper::CreatePasses() {
unsigned OptLevel = CodeGenOpts.OptimizationLevel;
CodeGenOptions::InliningMethod Inlining = CodeGenOpts.Inlining;
@@ -116,6 +129,14 @@ void EmitAssemblyHelper::CreatePasses() {
PMBuilder.DisableSimplifyLibCalls = !CodeGenOpts.SimplifyLibCalls;
PMBuilder.DisableUnitAtATime = !CodeGenOpts.UnitAtATime;
PMBuilder.DisableUnrollLoops = !CodeGenOpts.UnrollLoops;
+
+ // In ObjC ARC mode, add the main ARC optimization passes.
+ if (LangOpts.ObjCAutoRefCount) {
+ PMBuilder.addExtension(PassManagerBuilder::EP_EarlyAsPossible,
+ addObjCARCExpandPass);
+ PMBuilder.addExtension(PassManagerBuilder::EP_ScalarOptimizerLate,
+ addObjCARCOptPass);
+ }
// Figure out TargetLibraryInfo.
Triple TargetTriple(TheModule->getTargetTriple());
@@ -258,16 +279,16 @@ bool EmitAssemblyHelper::AddEmitPasses(BackendAction Action,
const_cast<char **>(&BackendArgs[0]));
std::string FeaturesStr;
- if (TargetOpts.CPU.size() || TargetOpts.Features.size()) {
+ if (TargetOpts.Features.size()) {
SubtargetFeatures Features;
- Features.setCPU(TargetOpts.CPU);
for (std::vector<std::string>::const_iterator
it = TargetOpts.Features.begin(),
ie = TargetOpts.Features.end(); it != ie; ++it)
Features.AddFeature(*it);
FeaturesStr = Features.getString();
}
- TargetMachine *TM = TheTarget->createTargetMachine(Triple, FeaturesStr);
+ TargetMachine *TM = TheTarget->createTargetMachine(Triple, TargetOpts.CPU,
+ FeaturesStr);
if (CodeGenOpts.RelaxAll)
TM->setMCRelaxAll(true);
@@ -275,6 +296,8 @@ bool EmitAssemblyHelper::AddEmitPasses(BackendAction Action,
TM->setMCSaveTempLabels(true);
if (CodeGenOpts.NoDwarf2CFIAsm)
TM->setMCUseCFI(false);
+ if (CodeGenOpts.NoExecStack)
+ TM->setMCNoExecStack(true);
// Create the code generator passes.
PassManager *PM = getCodeGenPasses();
@@ -295,6 +318,13 @@ bool EmitAssemblyHelper::AddEmitPasses(BackendAction Action,
CGFT = TargetMachine::CGFT_Null;
else
assert(Action == Backend_EmitAssembly && "Invalid action!");
+
+ // Add ObjC ARC final-cleanup optimizations. This is done as part of the
+ // "codegen" passes so that it isn't run multiple times when there is
+ // inlining happening.
+ if (LangOpts.ObjCAutoRefCount)
+ PM->add(createObjCARCContractPass());
+
if (TM->addPassesToEmitFile(*PM, OS, CGFT, OptLevel,
/*DisableVerify=*/!CodeGenOpts.VerifyModule)) {
Diags.Report(diag::err_fe_unable_to_interface_with_target);
@@ -357,9 +387,11 @@ void EmitAssemblyHelper::EmitAssembly(BackendAction Action, raw_ostream *OS) {
}
void clang::EmitBackendOutput(Diagnostic &Diags, const CodeGenOptions &CGOpts,
- const TargetOptions &TOpts, Module *M,
+ const TargetOptions &TOpts,
+ const LangOptions &LOpts,
+ Module *M,
BackendAction Action, raw_ostream *OS) {
- EmitAssemblyHelper AsmHelper(Diags, CGOpts, TOpts, M);
+ EmitAssemblyHelper AsmHelper(Diags, CGOpts, TOpts, LOpts, M);
AsmHelper.EmitAssembly(Action, OS);
}
diff --git a/contrib/llvm/tools/clang/lib/CodeGen/CGBlocks.cpp b/contrib/llvm/tools/clang/lib/CodeGen/CGBlocks.cpp
index e5da703..9815d1d 100644
--- a/contrib/llvm/tools/clang/lib/CodeGen/CGBlocks.cpp
+++ b/contrib/llvm/tools/clang/lib/CodeGen/CGBlocks.cpp
@@ -95,9 +95,7 @@ static llvm::Constant *buildBlockDescriptor(CodeGenModule &CGM,
else
elements.push_back(llvm::Constant::getNullValue(i8p));
- llvm::Constant *init =
- llvm::ConstantStruct::get(CGM.getLLVMContext(), elements.data(),
- elements.size(), false);
+ llvm::Constant *init = llvm::ConstantStruct::getAnon(elements);
llvm::GlobalVariable *global =
new llvm::GlobalVariable(CGM.getModule(), init->getType(), true,
@@ -166,11 +164,11 @@ namespace {
CharUnits Alignment;
CharUnits Size;
const BlockDecl::Capture *Capture; // null for 'this'
- const llvm::Type *Type;
+ llvm::Type *Type;
BlockLayoutChunk(CharUnits align, CharUnits size,
const BlockDecl::Capture *capture,
- const llvm::Type *type)
+ llvm::Type *type)
: Alignment(align), Size(size), Capture(capture), Type(type) {}
/// Tell the block info that this chunk has the given field index.
@@ -245,7 +243,7 @@ static CharUnits getLowBit(CharUnits v) {
}
static void initializeForBlockHeader(CodeGenModule &CGM, CGBlockInfo &info,
- llvm::SmallVectorImpl<const llvm::Type*> &elementTypes) {
+ llvm::SmallVectorImpl<llvm::Type*> &elementTypes) {
ASTContext &C = CGM.getContext();
// The header is basically a 'struct { void *; int; int; void *; void *; }'.
@@ -265,8 +263,8 @@ static void initializeForBlockHeader(CodeGenModule &CGM, CGBlockInfo &info,
info.BlockSize = headerSize;
assert(elementTypes.empty());
- const llvm::Type *i8p = CGM.getTypes().ConvertType(C.VoidPtrTy);
- const llvm::Type *intTy = CGM.getTypes().ConvertType(C.IntTy);
+ llvm::Type *i8p = CGM.getTypes().ConvertType(C.VoidPtrTy);
+ llvm::Type *intTy = CGM.getTypes().ConvertType(C.IntTy);
elementTypes.push_back(i8p);
elementTypes.push_back(intTy);
elementTypes.push_back(intTy);
@@ -282,7 +280,7 @@ static void computeBlockInfo(CodeGenModule &CGM, CGBlockInfo &info) {
ASTContext &C = CGM.getContext();
const BlockDecl *block = info.getBlockDecl();
- llvm::SmallVector<const llvm::Type*, 8> elementTypes;
+ llvm::SmallVector<llvm::Type*, 8> elementTypes;
initializeForBlockHeader(CGM, info, elementTypes);
if (!block->hasCaptures()) {
@@ -310,7 +308,7 @@ static void computeBlockInfo(CodeGenModule &CGM, CGBlockInfo &info) {
else
thisType = cast<CXXMethodDecl>(DC)->getThisType(C);
- const llvm::Type *llvmType = CGM.getTypes().ConvertType(thisType);
+ llvm::Type *llvmType = CGM.getTypes().ConvertType(thisType);
std::pair<CharUnits,CharUnits> tinfo
= CGM.getContext().getTypeInfoInChars(thisType);
maxFieldAlign = std::max(maxFieldAlign, tinfo.second);
@@ -330,7 +328,7 @@ static void computeBlockInfo(CodeGenModule &CGM, CGBlockInfo &info) {
// Just use void* instead of a pointer to the byref type.
QualType byRefPtrTy = C.VoidPtrTy;
- const llvm::Type *llvmType = CGM.getTypes().ConvertType(byRefPtrTy);
+ llvm::Type *llvmType = CGM.getTypes().ConvertType(byRefPtrTy);
std::pair<CharUnits,CharUnits> tinfo
= CGM.getContext().getTypeInfoInChars(byRefPtrTy);
maxFieldAlign = std::max(maxFieldAlign, tinfo.second);
@@ -347,13 +345,23 @@ static void computeBlockInfo(CodeGenModule &CGM, CGBlockInfo &info) {
continue;
}
- // Block pointers require copy/dispose.
- if (variable->getType()->isBlockPointerType()) {
- info.NeedsCopyDispose = true;
+ // If we have a lifetime qualifier, honor it for capture purposes.
+ // That includes *not* copying it if it's __unsafe_unretained.
+ if (Qualifiers::ObjCLifetime lifetime
+ = variable->getType().getObjCLifetime()) {
+ switch (lifetime) {
+ case Qualifiers::OCL_None: llvm_unreachable("impossible");
+ case Qualifiers::OCL_ExplicitNone:
+ case Qualifiers::OCL_Autoreleasing:
+ break;
+
+ case Qualifiers::OCL_Strong:
+ case Qualifiers::OCL_Weak:
+ info.NeedsCopyDispose = true;
+ }
- // So do Objective-C pointers.
- } else if (variable->getType()->isObjCObjectPointerType() ||
- C.isObjCNSObjectType(variable->getType())) {
+ // Block pointers require copy/dispose. So do Objective-C pointers.
+ } else if (variable->getType()->isObjCRetainableType()) {
info.NeedsCopyDispose = true;
// So do types that require non-trivial copy construction.
@@ -376,7 +384,7 @@ static void computeBlockInfo(CodeGenModule &CGM, CGBlockInfo &info) {
CharUnits align = C.getDeclAlign(variable);
maxFieldAlign = std::max(maxFieldAlign, align);
- const llvm::Type *llvmType =
+ llvm::Type *llvmType =
CGM.getTypes().ConvertTypeForMem(variable->getType());
layout.push_back(BlockLayoutChunk(align, size, &*ci, llvmType));
@@ -591,6 +599,11 @@ llvm::Value *CodeGenFunction::EmitBlockLiteral(const BlockExpr *blockExpr) {
// Otherwise, fake up a POD copy into the block field.
} else {
+ // Fake up a new variable so that EmitScalarInit doesn't think
+ // we're referring to the variable in its own initializer.
+ ImplicitParamDecl blockFieldPseudoVar(/*DC*/ 0, SourceLocation(),
+ /*name*/ 0, type);
+
// We use one of these or the other depending on whether the
// reference is nested.
DeclRefExpr notNested(const_cast<VarDecl*>(variable), type, VK_LValue,
@@ -603,15 +616,37 @@ llvm::Value *CodeGenFunction::EmitBlockLiteral(const BlockExpr *blockExpr) {
ImplicitCastExpr l2r(ImplicitCastExpr::OnStack, type, CK_LValueToRValue,
declRef, VK_RValue);
- EmitExprAsInit(&l2r, variable, blockField,
- getContext().getDeclAlign(variable),
+ EmitExprAsInit(&l2r, &blockFieldPseudoVar,
+ LValue::MakeAddr(blockField, type,
+ getContext().getDeclAlign(variable)
+ .getQuantity(),
+ getContext()),
/*captured by init*/ false);
}
// Push a destructor if necessary. The semantics for when this
// actually gets run are really obscure.
- if (!ci->isByRef() && CGM.getLangOptions().CPlusPlus)
- PushDestructorCleanup(type, blockField);
+ if (!ci->isByRef()) {
+ switch (QualType::DestructionKind dtorKind = type.isDestructedType()) {
+ case QualType::DK_none:
+ break;
+
+ // Block captures count as local values and have imprecise semantics.
+ // They also can't be arrays, so need to worry about that.
+ case QualType::DK_objc_strong_lifetime: {
+ // This local is a GCC and MSVC compiler workaround.
+ Destroyer *destroyer = &destroyARCStrongImprecise;
+ pushDestroy(getCleanupKind(dtorKind), blockField, type,
+ *destroyer, /*useEHCleanupForArray*/ false);
+ break;
+ }
+
+ case QualType::DK_objc_weak_lifetime:
+ case QualType::DK_cxx_destructor:
+ pushDestroy(dtorKind, blockField, type);
+ break;
+ }
+ }
}
// Cast to the converted block-pointer type, which happens (somewhat
@@ -624,11 +659,11 @@ llvm::Value *CodeGenFunction::EmitBlockLiteral(const BlockExpr *blockExpr) {
}
-const llvm::Type *CodeGenModule::getBlockDescriptorType() {
+llvm::Type *CodeGenModule::getBlockDescriptorType() {
if (BlockDescriptorType)
return BlockDescriptorType;
- const llvm::Type *UnsignedLongTy =
+ llvm::Type *UnsignedLongTy =
getTypes().ConvertType(getContext().UnsignedLongTy);
// struct __block_descriptor {
@@ -645,24 +680,20 @@ const llvm::Type *CodeGenModule::getBlockDescriptorType() {
// const char *signature; // the block signature
// const char *layout; // reserved
// };
- BlockDescriptorType = llvm::StructType::get(UnsignedLongTy->getContext(),
- UnsignedLongTy,
- UnsignedLongTy,
- NULL);
-
- getModule().addTypeName("struct.__block_descriptor",
- BlockDescriptorType);
+ BlockDescriptorType =
+ llvm::StructType::createNamed("struct.__block_descriptor",
+ UnsignedLongTy, UnsignedLongTy, NULL);
// Now form a pointer to that.
BlockDescriptorType = llvm::PointerType::getUnqual(BlockDescriptorType);
return BlockDescriptorType;
}
-const llvm::Type *CodeGenModule::getGenericBlockLiteralType() {
+llvm::Type *CodeGenModule::getGenericBlockLiteralType() {
if (GenericBlockLiteralType)
return GenericBlockLiteralType;
- const llvm::Type *BlockDescPtrTy = getBlockDescriptorType();
+ llvm::Type *BlockDescPtrTy = getBlockDescriptorType();
// struct __block_literal_generic {
// void *__isa;
@@ -671,16 +702,14 @@ const llvm::Type *CodeGenModule::getGenericBlockLiteralType() {
// void (*__invoke)(void *);
// struct __block_descriptor *__descriptor;
// };
- GenericBlockLiteralType = llvm::StructType::get(getLLVMContext(),
- VoidPtrTy,
- IntTy,
- IntTy,
- VoidPtrTy,
- BlockDescPtrTy,
- NULL);
-
- getModule().addTypeName("struct.__block_literal_generic",
- GenericBlockLiteralType);
+ GenericBlockLiteralType =
+ llvm::StructType::createNamed("struct.__block_literal_generic",
+ VoidPtrTy,
+ IntTy,
+ IntTy,
+ VoidPtrTy,
+ BlockDescPtrTy,
+ NULL);
return GenericBlockLiteralType;
}
@@ -822,9 +851,7 @@ static llvm::Constant *buildGlobalBlock(CodeGenModule &CGM,
// Descriptor
fields[4] = buildBlockDescriptor(CGM, blockInfo);
- llvm::Constant *init =
- llvm::ConstantStruct::get(CGM.getLLVMContext(), fields, BlockHeaderSize,
- /*packed*/ false);
+ llvm::Constant *init = llvm::ConstantStruct::getAnon(fields);
llvm::GlobalVariable *literal =
new llvm::GlobalVariable(CGM.getModule(),
@@ -1023,8 +1050,6 @@ CodeGenFunction::GenerateBlockFunction(GlobalDecl GD,
-
-
llvm::Constant *
CodeGenFunction::GenerateCopyHelperFunction(const CGBlockInfo &blockInfo) {
ASTContext &C = getContext();
@@ -1084,21 +1109,40 @@ CodeGenFunction::GenerateCopyHelperFunction(const CGBlockInfo &blockInfo) {
if (capture.isConstant()) continue;
const Expr *copyExpr = ci->getCopyExpr();
- unsigned flags = 0;
+ BlockFieldFlags flags;
+
+ bool isARCWeakCapture = false;
if (copyExpr) {
assert(!ci->isByRef());
// don't bother computing flags
+
} else if (ci->isByRef()) {
flags = BLOCK_FIELD_IS_BYREF;
- if (type.isObjCGCWeak()) flags |= BLOCK_FIELD_IS_WEAK;
- } else if (type->isBlockPointerType()) {
- flags = BLOCK_FIELD_IS_BLOCK;
- } else if (type->isObjCObjectPointerType() || C.isObjCNSObjectType(type)) {
+ if (type.isObjCGCWeak())
+ flags |= BLOCK_FIELD_IS_WEAK;
+
+ } else if (type->isObjCRetainableType()) {
flags = BLOCK_FIELD_IS_OBJECT;
- }
+ if (type->isBlockPointerType())
+ flags = BLOCK_FIELD_IS_BLOCK;
+
+ // Special rules for ARC captures:
+ if (getLangOptions().ObjCAutoRefCount) {
+ Qualifiers qs = type.getQualifiers();
- if (!copyExpr && !flags) continue;
+ // Don't generate special copy logic for a captured object
+ // unless it's __strong or __weak.
+ if (!qs.hasStrongOrWeakObjCLifetime())
+ continue;
+
+ // Support __weak direct captures.
+ if (qs.getObjCLifetime() == Qualifiers::OCL_Weak)
+ isARCWeakCapture = true;
+ }
+ } else {
+ continue;
+ }
unsigned index = capture.getIndex();
llvm::Value *srcField = Builder.CreateStructGEP(src, index);
@@ -1107,12 +1151,14 @@ CodeGenFunction::GenerateCopyHelperFunction(const CGBlockInfo &blockInfo) {
// If there's an explicit copy expression, we do that.
if (copyExpr) {
EmitSynthesizedCXXCopyCtor(dstField, srcField, copyExpr);
+ } else if (isARCWeakCapture) {
+ EmitARCCopyWeak(dstField, srcField);
} else {
llvm::Value *srcValue = Builder.CreateLoad(srcField, "blockcopy.src");
srcValue = Builder.CreateBitCast(srcValue, VoidPtrTy);
llvm::Value *dstAddr = Builder.CreateBitCast(dstField, VoidPtrTy);
Builder.CreateCall3(CGM.getBlockObjectAssign(), dstAddr, srcValue,
- llvm::ConstantInt::get(Int32Ty, flags));
+ llvm::ConstantInt::get(Int32Ty, flags.getBitMask()));
}
}
@@ -1176,20 +1222,37 @@ CodeGenFunction::GenerateDestroyHelperFunction(const CGBlockInfo &blockInfo) {
BlockFieldFlags flags;
const CXXDestructorDecl *dtor = 0;
+ bool isARCWeakCapture = false;
+
if (ci->isByRef()) {
flags = BLOCK_FIELD_IS_BYREF;
- if (type.isObjCGCWeak()) flags |= BLOCK_FIELD_IS_WEAK;
- } else if (type->isBlockPointerType()) {
- flags = BLOCK_FIELD_IS_BLOCK;
- } else if (type->isObjCObjectPointerType() || C.isObjCNSObjectType(type)) {
+ if (type.isObjCGCWeak())
+ flags |= BLOCK_FIELD_IS_WEAK;
+ } else if (const CXXRecordDecl *record = type->getAsCXXRecordDecl()) {
+ if (record->hasTrivialDestructor())
+ continue;
+ dtor = record->getDestructor();
+ } else if (type->isObjCRetainableType()) {
flags = BLOCK_FIELD_IS_OBJECT;
- } else if (C.getLangOptions().CPlusPlus) {
- if (const CXXRecordDecl *record = type->getAsCXXRecordDecl())
- if (!record->hasTrivialDestructor())
- dtor = record->getDestructor();
- }
+ if (type->isBlockPointerType())
+ flags = BLOCK_FIELD_IS_BLOCK;
- if (!dtor && flags.empty()) continue;
+ // Special rules for ARC captures.
+ if (getLangOptions().ObjCAutoRefCount) {
+ Qualifiers qs = type.getQualifiers();
+
+ // Don't generate special dispose logic for a captured object
+ // unless it's __strong or __weak.
+ if (!qs.hasStrongOrWeakObjCLifetime())
+ continue;
+
+ // Support __weak direct captures.
+ if (qs.getObjCLifetime() == Qualifiers::OCL_Weak)
+ isARCWeakCapture = true;
+ }
+ } else {
+ continue;
+ }
unsigned index = capture.getIndex();
llvm::Value *srcField = Builder.CreateStructGEP(src, index);
@@ -1198,6 +1261,10 @@ CodeGenFunction::GenerateDestroyHelperFunction(const CGBlockInfo &blockInfo) {
if (dtor) {
PushDestructorCleanup(dtor, srcField);
+ // If this is a __weak capture, emit the release directly.
+ } else if (isARCWeakCapture) {
+ EmitARCDestroyWeak(srcField);
+
// Otherwise we call _Block_object_dispose. It wouldn't be too
// hard to just emit this as a cleanup if we wanted to make sure
// that things were done in reverse.
@@ -1251,6 +1318,55 @@ public:
}
};
+/// Emits the copy/dispose helpers for an ARC __block __weak variable.
+class ARCWeakByrefHelpers : public CodeGenModule::ByrefHelpers {
+public:
+ ARCWeakByrefHelpers(CharUnits alignment) : ByrefHelpers(alignment) {}
+
+ void emitCopy(CodeGenFunction &CGF, llvm::Value *destField,
+ llvm::Value *srcField) {
+ CGF.EmitARCMoveWeak(destField, srcField);
+ }
+
+ void emitDispose(CodeGenFunction &CGF, llvm::Value *field) {
+ CGF.EmitARCDestroyWeak(field);
+ }
+
+ void profileImpl(llvm::FoldingSetNodeID &id) const {
+ // 0 is distinguishable from all pointers and byref flags
+ id.AddInteger(0);
+ }
+};
+
+/// Emits the copy/dispose helpers for an ARC __block __strong variable
+/// that's not of block-pointer type.
+class ARCStrongByrefHelpers : public CodeGenModule::ByrefHelpers {
+public:
+ ARCStrongByrefHelpers(CharUnits alignment) : ByrefHelpers(alignment) {}
+
+ void emitCopy(CodeGenFunction &CGF, llvm::Value *destField,
+ llvm::Value *srcField) {
+ // Do a "move" by copying the value and then zeroing out the old
+ // variable.
+
+ llvm::Value *value = CGF.Builder.CreateLoad(srcField);
+ llvm::Value *null =
+ llvm::ConstantPointerNull::get(cast<llvm::PointerType>(value->getType()));
+ CGF.Builder.CreateStore(value, destField);
+ CGF.Builder.CreateStore(null, srcField);
+ }
+
+ void emitDispose(CodeGenFunction &CGF, llvm::Value *field) {
+ llvm::Value *value = CGF.Builder.CreateLoad(field);
+ CGF.EmitARCRelease(value, /*precise*/ false);
+ }
+
+ void profileImpl(llvm::FoldingSetNodeID &id) const {
+ // 1 is distinguishable from all pointers and byref flags
+ id.AddInteger(1);
+ }
+};
+
/// Emits the copy/dispose helpers for a __block variable with a
/// nontrivial copy constructor or destructor.
class CXXByrefHelpers : public CodeGenModule::ByrefHelpers {
@@ -1318,6 +1434,7 @@ generateByrefCopyHelper(CodeGenFunction &CGF,
SC_Static,
SC_None,
false, true);
+
CGF.StartFunction(FD, R, Fn, FI, args, SourceLocation());
if (byrefInfo.needsCopy()) {
@@ -1449,6 +1566,52 @@ CodeGenFunction::buildByrefHelpers(const llvm::StructType &byrefType,
return ::buildByrefHelpers(CGM, byrefType, byrefInfo);
}
+ // Otherwise, if we don't have a retainable type, there's nothing to do.
+ // that the runtime does extra copies.
+ if (!type->isObjCRetainableType()) return 0;
+
+ Qualifiers qs = type.getQualifiers();
+
+ // If we have lifetime, that dominates.
+ if (Qualifiers::ObjCLifetime lifetime = qs.getObjCLifetime()) {
+ assert(getLangOptions().ObjCAutoRefCount);
+
+ switch (lifetime) {
+ case Qualifiers::OCL_None: llvm_unreachable("impossible");
+
+ // These are just bits as far as the runtime is concerned.
+ case Qualifiers::OCL_ExplicitNone:
+ case Qualifiers::OCL_Autoreleasing:
+ return 0;
+
+ // Tell the runtime that this is ARC __weak, called by the
+ // byref routines.
+ case Qualifiers::OCL_Weak: {
+ ARCWeakByrefHelpers byrefInfo(emission.Alignment);
+ return ::buildByrefHelpers(CGM, byrefType, byrefInfo);
+ }
+
+ // ARC __strong __block variables need to be retained.
+ case Qualifiers::OCL_Strong:
+ // Block-pointers need to be _Block_copy'ed, so we let the
+ // runtime be in charge. But we can't use the code below
+ // because we don't want to set BYREF_CALLER, which will
+ // just make the runtime ignore us.
+ if (type->isBlockPointerType()) {
+ BlockFieldFlags flags = BLOCK_FIELD_IS_BLOCK;
+ ObjectByrefHelpers byrefInfo(emission.Alignment, flags);
+ return ::buildByrefHelpers(CGM, byrefType, byrefInfo);
+
+ // Otherwise, we transfer ownership of the retain from the stack
+ // to the heap.
+ } else {
+ ARCStrongByrefHelpers byrefInfo(emission.Alignment);
+ return ::buildByrefHelpers(CGM, byrefType, byrefInfo);
+ }
+ }
+ llvm_unreachable("fell out of lifetime switch!");
+ }
+
BlockFieldFlags flags;
if (type->isBlockPointerType()) {
flags |= BLOCK_FIELD_IS_BLOCK;
@@ -1502,15 +1665,17 @@ const llvm::Type *CodeGenFunction::BuildByRefType(const VarDecl *D) {
QualType Ty = D->getType();
- llvm::SmallVector<const llvm::Type *, 8> types;
+ llvm::SmallVector<llvm::Type *, 8> types;
- llvm::PATypeHolder ByRefTypeHolder = llvm::OpaqueType::get(getLLVMContext());
+ llvm::StructType *ByRefType =
+ llvm::StructType::createNamed(getLLVMContext(),
+ "struct.__block_byref_" + D->getNameAsString());
// void *__isa;
types.push_back(Int8PtrTy);
// void *__forwarding;
- types.push_back(llvm::PointerType::getUnqual(ByRefTypeHolder));
+ types.push_back(llvm::PointerType::getUnqual(ByRefType));
// int32_t __flags;
types.push_back(Int32Ty);
@@ -1545,7 +1710,7 @@ const llvm::Type *CodeGenFunction::BuildByRefType(const VarDecl *D) {
unsigned NumPaddingBytes = AlignedOffsetInBytes - CurrentOffsetInBytes;
if (NumPaddingBytes > 0) {
- const llvm::Type *Ty = llvm::Type::getInt8Ty(getLLVMContext());
+ llvm::Type *Ty = llvm::Type::getInt8Ty(getLLVMContext());
// FIXME: We need a sema error for alignment larger than the minimum of
// the maximal stack alignment and the alignment of malloc on the system.
if (NumPaddingBytes > 1)
@@ -1561,13 +1726,9 @@ const llvm::Type *CodeGenFunction::BuildByRefType(const VarDecl *D) {
// T x;
types.push_back(ConvertTypeForMem(Ty));
- const llvm::Type *T = llvm::StructType::get(getLLVMContext(), types, Packed);
-
- cast<llvm::OpaqueType>(ByRefTypeHolder.get())->refineAbstractTypeTo(T);
- CGM.getModule().addTypeName("struct.__block_byref_" + D->getNameAsString(),
- ByRefTypeHolder.get());
+ ByRefType->setBody(types, Packed);
- Info.first = ByRefTypeHolder.get();
+ Info.first = ByRefType;
Info.second = types.size() - 1;
@@ -1638,7 +1799,8 @@ namespace {
llvm::Value *Addr;
CallBlockRelease(llvm::Value *Addr) : Addr(Addr) {}
- void Emit(CodeGenFunction &CGF, bool IsForEH) {
+ void Emit(CodeGenFunction &CGF, Flags flags) {
+ // Should we be passing FIELD_IS_WEAK here?
CGF.BuildBlockRelease(Addr, BLOCK_FIELD_IS_BYREF);
}
};
diff --git a/contrib/llvm/tools/clang/lib/CodeGen/CGBlocks.h b/contrib/llvm/tools/clang/lib/CodeGen/CGBlocks.h
index 9bd18e5..4d8dead 100644
--- a/contrib/llvm/tools/clang/lib/CodeGen/CGBlocks.h
+++ b/contrib/llvm/tools/clang/lib/CodeGen/CGBlocks.h
@@ -17,7 +17,6 @@
#include "CodeGenTypes.h"
#include "clang/AST/Type.h"
#include "llvm/Module.h"
-#include "llvm/ADT/SmallVector.h"
#include "clang/Basic/TargetInfo.h"
#include "clang/AST/CharUnits.h"
#include "clang/AST/Expr.h"
@@ -89,7 +88,7 @@ enum BlockFieldFlag_t {
variable */
BLOCK_FIELD_IS_WEAK = 0x10, /* declared __weak, only used in byref copy
helpers */
-
+ BLOCK_FIELD_IS_ARC = 0x40, /* field has ARC-specific semantics */
BLOCK_BYREF_CALLER = 128, /* called from __block (byref) copy/dispose
support routines */
BLOCK_BYREF_CURRENT_MAX = 256
diff --git a/contrib/llvm/tools/clang/lib/CodeGen/CGBuiltin.cpp b/contrib/llvm/tools/clang/lib/CodeGen/CGBuiltin.cpp
index 14bebaf..1566bd9 100644
--- a/contrib/llvm/tools/clang/lib/CodeGen/CGBuiltin.cpp
+++ b/contrib/llvm/tools/clang/lib/CodeGen/CGBuiltin.cpp
@@ -22,6 +22,7 @@
#include "clang/Basic/TargetBuiltins.h"
#include "llvm/Intrinsics.h"
#include "llvm/Target/TargetData.h"
+
using namespace clang;
using namespace CodeGen;
using namespace llvm;
@@ -37,8 +38,7 @@ static void EmitMemoryBarrier(CodeGenFunction &CGF,
StoreLoad ? True : False,
StoreStore ? True : False,
Device ? True : False };
- CGF.Builder.CreateCall(CGF.CGM.getIntrinsic(Intrinsic::memory_barrier),
- C, C + 5);
+ CGF.Builder.CreateCall(CGF.CGM.getIntrinsic(Intrinsic::memory_barrier), C);
}
/// Emit the conversions required to turn the given value into an
@@ -68,14 +68,14 @@ static Value *EmitFromInt(CodeGenFunction &CGF, llvm::Value *V,
// The atomic builtins are also full memory barriers. This is a utility for
// wrapping a call to the builtins with memory barriers.
static Value *EmitCallWithBarrier(CodeGenFunction &CGF, Value *Fn,
- Value **ArgBegin, Value **ArgEnd) {
+ ArrayRef<Value *> Args) {
// FIXME: We need a target hook for whether this applies to device memory or
// not.
bool Device = true;
// Create barriers both before and after the call.
EmitMemoryBarrier(CGF, true, true, true, true, Device);
- Value *Result = CGF.Builder.CreateCall(Fn, ArgBegin, ArgEnd);
+ Value *Result = CGF.Builder.CreateCall(Fn, Args);
EmitMemoryBarrier(CGF, true, true, true, true, Device);
return Result;
}
@@ -94,13 +94,13 @@ static RValue EmitBinaryAtomic(CodeGenFunction &CGF,
unsigned AddrSpace =
cast<llvm::PointerType>(DestPtr->getType())->getAddressSpace();
- const llvm::IntegerType *IntType =
+ llvm::IntegerType *IntType =
llvm::IntegerType::get(CGF.getLLVMContext(),
CGF.getContext().getTypeSize(T));
- const llvm::Type *IntPtrType = IntType->getPointerTo(AddrSpace);
+ llvm::Type *IntPtrType = IntType->getPointerTo(AddrSpace);
- const llvm::Type *IntrinsicTypes[2] = { IntType, IntPtrType };
- llvm::Value *AtomF = CGF.CGM.getIntrinsic(Id, IntrinsicTypes, 2);
+ llvm::Type *IntrinsicTypes[2] = { IntType, IntPtrType };
+ llvm::Value *AtomF = CGF.CGM.getIntrinsic(Id, IntrinsicTypes);
llvm::Value *Args[2];
Args[0] = CGF.Builder.CreateBitCast(DestPtr, IntPtrType);
@@ -108,7 +108,7 @@ static RValue EmitBinaryAtomic(CodeGenFunction &CGF,
const llvm::Type *ValueType = Args[1]->getType();
Args[1] = EmitToInt(CGF, Args[1], T, IntType);
- llvm::Value *Result = EmitCallWithBarrier(CGF, AtomF, Args, Args + 2);
+ llvm::Value *Result = EmitCallWithBarrier(CGF, AtomF, Args);
Result = EmitFromInt(CGF, Result, T, ValueType);
return RValue::get(Result);
}
@@ -129,13 +129,13 @@ static RValue EmitBinaryAtomicPost(CodeGenFunction &CGF,
unsigned AddrSpace =
cast<llvm::PointerType>(DestPtr->getType())->getAddressSpace();
- const llvm::IntegerType *IntType =
+ llvm::IntegerType *IntType =
llvm::IntegerType::get(CGF.getLLVMContext(),
CGF.getContext().getTypeSize(T));
- const llvm::Type *IntPtrType = IntType->getPointerTo(AddrSpace);
+ llvm::Type *IntPtrType = IntType->getPointerTo(AddrSpace);
- const llvm::Type *IntrinsicTypes[2] = { IntType, IntPtrType };
- llvm::Value *AtomF = CGF.CGM.getIntrinsic(Id, IntrinsicTypes, 2);
+ llvm::Type *IntrinsicTypes[2] = { IntType, IntPtrType };
+ llvm::Value *AtomF = CGF.CGM.getIntrinsic(Id, IntrinsicTypes);
llvm::Value *Args[2];
Args[1] = CGF.EmitScalarExpr(E->getArg(1));
@@ -143,7 +143,7 @@ static RValue EmitBinaryAtomicPost(CodeGenFunction &CGF,
Args[1] = EmitToInt(CGF, Args[1], T, IntType);
Args[0] = CGF.Builder.CreateBitCast(DestPtr, IntPtrType);
- llvm::Value *Result = EmitCallWithBarrier(CGF, AtomF, Args, Args + 2);
+ llvm::Value *Result = EmitCallWithBarrier(CGF, AtomF, Args);
Result = CGF.Builder.CreateBinOp(Op, Result, Args[1]);
Result = EmitFromInt(CGF, Result, T, ValueType);
return RValue::get(Result);
@@ -164,7 +164,8 @@ static Value *EmitFAbs(CodeGenFunction &CGF, Value *V, QualType ValTy) {
}
// The prototype is something that takes and returns whatever V's type is.
- llvm::FunctionType *FT = llvm::FunctionType::get(V->getType(), V->getType(),
+ llvm::Type *ArgTys[] = { V->getType() };
+ llvm::FunctionType *FT = llvm::FunctionType::get(V->getType(), ArgTys,
false);
llvm::Value *Fn = CGF.CGM.CreateRuntimeFunction(FT, FnName);
@@ -232,8 +233,8 @@ RValue CodeGenFunction::EmitBuiltinExpr(const FunctionDecl *FD,
case Builtin::BI__builtin_ctzll: {
Value *ArgValue = EmitScalarExpr(E->getArg(0));
- const llvm::Type *ArgType = ArgValue->getType();
- Value *F = CGM.getIntrinsic(Intrinsic::cttz, &ArgType, 1);
+ llvm::Type *ArgType = ArgValue->getType();
+ Value *F = CGM.getIntrinsic(Intrinsic::cttz, ArgType);
const llvm::Type *ResultType = ConvertType(E->getType());
Value *Result = Builder.CreateCall(F, ArgValue, "tmp");
@@ -247,8 +248,8 @@ RValue CodeGenFunction::EmitBuiltinExpr(const FunctionDecl *FD,
case Builtin::BI__builtin_clzll: {
Value *ArgValue = EmitScalarExpr(E->getArg(0));
- const llvm::Type *ArgType = ArgValue->getType();
- Value *F = CGM.getIntrinsic(Intrinsic::ctlz, &ArgType, 1);
+ llvm::Type *ArgType = ArgValue->getType();
+ Value *F = CGM.getIntrinsic(Intrinsic::ctlz, ArgType);
const llvm::Type *ResultType = ConvertType(E->getType());
Value *Result = Builder.CreateCall(F, ArgValue, "tmp");
@@ -263,8 +264,8 @@ RValue CodeGenFunction::EmitBuiltinExpr(const FunctionDecl *FD,
// ffs(x) -> x ? cttz(x) + 1 : 0
Value *ArgValue = EmitScalarExpr(E->getArg(0));
- const llvm::Type *ArgType = ArgValue->getType();
- Value *F = CGM.getIntrinsic(Intrinsic::cttz, &ArgType, 1);
+ llvm::Type *ArgType = ArgValue->getType();
+ Value *F = CGM.getIntrinsic(Intrinsic::cttz, ArgType);
const llvm::Type *ResultType = ConvertType(E->getType());
Value *Tmp = Builder.CreateAdd(Builder.CreateCall(F, ArgValue, "tmp"),
@@ -283,8 +284,8 @@ RValue CodeGenFunction::EmitBuiltinExpr(const FunctionDecl *FD,
// parity(x) -> ctpop(x) & 1
Value *ArgValue = EmitScalarExpr(E->getArg(0));
- const llvm::Type *ArgType = ArgValue->getType();
- Value *F = CGM.getIntrinsic(Intrinsic::ctpop, &ArgType, 1);
+ llvm::Type *ArgType = ArgValue->getType();
+ Value *F = CGM.getIntrinsic(Intrinsic::ctpop, ArgType);
const llvm::Type *ResultType = ConvertType(E->getType());
Value *Tmp = Builder.CreateCall(F, ArgValue, "tmp");
@@ -300,8 +301,8 @@ RValue CodeGenFunction::EmitBuiltinExpr(const FunctionDecl *FD,
case Builtin::BI__builtin_popcountll: {
Value *ArgValue = EmitScalarExpr(E->getArg(0));
- const llvm::Type *ArgType = ArgValue->getType();
- Value *F = CGM.getIntrinsic(Intrinsic::ctpop, &ArgType, 1);
+ llvm::Type *ArgType = ArgValue->getType();
+ Value *F = CGM.getIntrinsic(Intrinsic::ctpop, ArgType);
const llvm::Type *ResultType = ConvertType(E->getType());
Value *Result = Builder.CreateCall(F, ArgValue, "tmp");
@@ -311,25 +312,27 @@ RValue CodeGenFunction::EmitBuiltinExpr(const FunctionDecl *FD,
return RValue::get(Result);
}
case Builtin::BI__builtin_expect: {
- // FIXME: pass expect through to LLVM
Value *ArgValue = EmitScalarExpr(E->getArg(0));
- if (E->getArg(1)->HasSideEffects(getContext()))
- (void)EmitScalarExpr(E->getArg(1));
- return RValue::get(ArgValue);
+ llvm::Type *ArgType = ArgValue->getType();
+
+ Value *FnExpect = CGM.getIntrinsic(Intrinsic::expect, ArgType);
+ Value *ExpectedValue = EmitScalarExpr(E->getArg(1));
+
+ Value *Result = Builder.CreateCall2(FnExpect, ArgValue, ExpectedValue,
+ "expval");
+ return RValue::get(Result);
}
case Builtin::BI__builtin_bswap32:
case Builtin::BI__builtin_bswap64: {
Value *ArgValue = EmitScalarExpr(E->getArg(0));
- const llvm::Type *ArgType = ArgValue->getType();
- Value *F = CGM.getIntrinsic(Intrinsic::bswap, &ArgType, 1);
+ llvm::Type *ArgType = ArgValue->getType();
+ Value *F = CGM.getIntrinsic(Intrinsic::bswap, ArgType);
return RValue::get(Builder.CreateCall(F, ArgValue, "tmp"));
}
case Builtin::BI__builtin_object_size: {
// We pass this builtin onto the optimizer so that it can
// figure out the object size in more complex cases.
- const llvm::Type *ResType[] = {
- ConvertType(E->getType())
- };
+ llvm::Type *ResType = ConvertType(E->getType());
// LLVM only supports 0 and 2, make sure that we pass along that
// as a boolean.
@@ -339,7 +342,7 @@ RValue CodeGenFunction::EmitBuiltinExpr(const FunctionDecl *FD,
uint64_t val = CI->getZExtValue();
CI = ConstantInt::get(Builder.getInt1Ty(), (val & 0x2) >> 1);
- Value *F = CGM.getIntrinsic(Intrinsic::objectsize, ResType, 1);
+ Value *F = CGM.getIntrinsic(Intrinsic::objectsize, ResType);
return RValue::get(Builder.CreateCall2(F,
EmitScalarExpr(E->getArg(0)),
CI));
@@ -351,11 +354,12 @@ RValue CodeGenFunction::EmitBuiltinExpr(const FunctionDecl *FD,
llvm::ConstantInt::get(Int32Ty, 0);
Locality = (E->getNumArgs() > 2) ? EmitScalarExpr(E->getArg(2)) :
llvm::ConstantInt::get(Int32Ty, 3);
- Value *F = CGM.getIntrinsic(Intrinsic::prefetch, 0, 0);
- return RValue::get(Builder.CreateCall3(F, Address, RW, Locality));
+ Value *Data = llvm::ConstantInt::get(Int32Ty, 1);
+ Value *F = CGM.getIntrinsic(Intrinsic::prefetch);
+ return RValue::get(Builder.CreateCall4(F, Address, RW, Locality, Data));
}
case Builtin::BI__builtin_trap: {
- Value *F = CGM.getIntrinsic(Intrinsic::trap, 0, 0);
+ Value *F = CGM.getIntrinsic(Intrinsic::trap);
return RValue::get(Builder.CreateCall(F));
}
case Builtin::BI__builtin_unreachable: {
@@ -375,8 +379,8 @@ RValue CodeGenFunction::EmitBuiltinExpr(const FunctionDecl *FD,
case Builtin::BI__builtin_powil: {
Value *Base = EmitScalarExpr(E->getArg(0));
Value *Exponent = EmitScalarExpr(E->getArg(1));
- const llvm::Type *ArgType = Base->getType();
- Value *F = CGM.getIntrinsic(Intrinsic::powi, &ArgType, 1);
+ llvm::Type *ArgType = Base->getType();
+ Value *F = CGM.getIntrinsic(Intrinsic::powi, ArgType);
return RValue::get(Builder.CreateCall2(F, Base, Exponent, "tmp"));
}
@@ -630,20 +634,20 @@ RValue CodeGenFunction::EmitBuiltinExpr(const FunctionDecl *FD,
// this instead of hard-coding 0, which is correct for most targets.
int32_t Offset = 0;
- Value *F = CGM.getIntrinsic(Intrinsic::eh_dwarf_cfa, 0, 0);
+ Value *F = CGM.getIntrinsic(Intrinsic::eh_dwarf_cfa);
return RValue::get(Builder.CreateCall(F,
llvm::ConstantInt::get(Int32Ty, Offset)));
}
case Builtin::BI__builtin_return_address: {
Value *Depth = EmitScalarExpr(E->getArg(0));
Depth = Builder.CreateIntCast(Depth, Int32Ty, false, "tmp");
- Value *F = CGM.getIntrinsic(Intrinsic::returnaddress, 0, 0);
+ Value *F = CGM.getIntrinsic(Intrinsic::returnaddress);
return RValue::get(Builder.CreateCall(F, Depth));
}
case Builtin::BI__builtin_frame_address: {
Value *Depth = EmitScalarExpr(E->getArg(0));
Depth = Builder.CreateIntCast(Depth, Int32Ty, false, "tmp");
- Value *F = CGM.getIntrinsic(Intrinsic::frameaddress, 0, 0);
+ Value *F = CGM.getIntrinsic(Intrinsic::frameaddress);
return RValue::get(Builder.CreateCall(F, Depth));
}
case Builtin::BI__builtin_extract_return_addr: {
@@ -681,8 +685,7 @@ RValue CodeGenFunction::EmitBuiltinExpr(const FunctionDecl *FD,
"LLVM's __builtin_eh_return only supports 32- and 64-bit variants");
Value *F = CGM.getIntrinsic(IntTy->getBitWidth() == 32
? Intrinsic::eh_return_i32
- : Intrinsic::eh_return_i64,
- 0, 0);
+ : Intrinsic::eh_return_i64);
Builder.CreateCall2(F, Int, Ptr);
Builder.CreateUnreachable();
@@ -692,7 +695,7 @@ RValue CodeGenFunction::EmitBuiltinExpr(const FunctionDecl *FD,
return RValue::get(0);
}
case Builtin::BI__builtin_unwind_init: {
- Value *F = CGM.getIntrinsic(Intrinsic::eh_unwind_init, 0, 0);
+ Value *F = CGM.getIntrinsic(Intrinsic::eh_unwind_init);
return RValue::get(Builder.CreateCall(F));
}
case Builtin::BI__builtin_extend_pointer: {
@@ -860,13 +863,13 @@ RValue CodeGenFunction::EmitBuiltinExpr(const FunctionDecl *FD,
unsigned AddrSpace =
cast<llvm::PointerType>(DestPtr->getType())->getAddressSpace();
- const llvm::IntegerType *IntType =
+ llvm::IntegerType *IntType =
llvm::IntegerType::get(getLLVMContext(),
getContext().getTypeSize(T));
- const llvm::Type *IntPtrType = IntType->getPointerTo(AddrSpace);
- const llvm::Type *IntrinsicTypes[2] = { IntType, IntPtrType };
+ llvm::Type *IntPtrType = IntType->getPointerTo(AddrSpace);
+ llvm::Type *IntrinsicTypes[2] = { IntType, IntPtrType };
Value *AtomF = CGM.getIntrinsic(Intrinsic::atomic_cmp_swap,
- IntrinsicTypes, 2);
+ IntrinsicTypes);
Value *Args[3];
Args[0] = Builder.CreateBitCast(DestPtr, IntPtrType);
@@ -875,7 +878,7 @@ RValue CodeGenFunction::EmitBuiltinExpr(const FunctionDecl *FD,
Args[1] = EmitToInt(*this, Args[1], T, IntType);
Args[2] = EmitToInt(*this, EmitScalarExpr(E->getArg(2)), T, IntType);
- Value *Result = EmitCallWithBarrier(*this, AtomF, Args, Args + 3);
+ Value *Result = EmitCallWithBarrier(*this, AtomF, Args);
Result = EmitFromInt(*this, Result, T, ValueType);
return RValue::get(Result);
}
@@ -890,13 +893,13 @@ RValue CodeGenFunction::EmitBuiltinExpr(const FunctionDecl *FD,
unsigned AddrSpace =
cast<llvm::PointerType>(DestPtr->getType())->getAddressSpace();
- const llvm::IntegerType *IntType =
+ llvm::IntegerType *IntType =
llvm::IntegerType::get(getLLVMContext(),
getContext().getTypeSize(T));
- const llvm::Type *IntPtrType = IntType->getPointerTo(AddrSpace);
- const llvm::Type *IntrinsicTypes[2] = { IntType, IntPtrType };
+ llvm::Type *IntPtrType = IntType->getPointerTo(AddrSpace);
+ llvm::Type *IntrinsicTypes[2] = { IntType, IntPtrType };
Value *AtomF = CGM.getIntrinsic(Intrinsic::atomic_cmp_swap,
- IntrinsicTypes, 2);
+ IntrinsicTypes);
Value *Args[3];
Args[0] = Builder.CreateBitCast(DestPtr, IntPtrType);
@@ -904,7 +907,7 @@ RValue CodeGenFunction::EmitBuiltinExpr(const FunctionDecl *FD,
Args[2] = EmitToInt(*this, EmitScalarExpr(E->getArg(2)), T, IntType);
Value *OldVal = Args[1];
- Value *PrevVal = EmitCallWithBarrier(*this, AtomF, Args, Args + 3);
+ Value *PrevVal = EmitCallWithBarrier(*this, AtomF, Args);
Value *Result = Builder.CreateICmpEQ(PrevVal, OldVal);
// zext bool to int.
Result = Builder.CreateZExt(Result, ConvertType(E->getType()));
@@ -953,7 +956,7 @@ RValue CodeGenFunction::EmitBuiltinExpr(const FunctionDecl *FD,
EmitScalarExpr(E->getArg(3)),
EmitScalarExpr(E->getArg(4))
};
- Builder.CreateCall(CGM.getIntrinsic(Intrinsic::memory_barrier), C, C + 5);
+ Builder.CreateCall(CGM.getIntrinsic(Intrinsic::memory_barrier), C);
return RValue::get(0);
}
@@ -977,11 +980,27 @@ RValue CodeGenFunction::EmitBuiltinExpr(const FunctionDecl *FD,
break;
Value *Base = EmitScalarExpr(E->getArg(0));
Value *Exponent = EmitScalarExpr(E->getArg(1));
- const llvm::Type *ArgType = Base->getType();
- Value *F = CGM.getIntrinsic(Intrinsic::pow, &ArgType, 1);
+ llvm::Type *ArgType = Base->getType();
+ Value *F = CGM.getIntrinsic(Intrinsic::pow, ArgType);
return RValue::get(Builder.CreateCall2(F, Base, Exponent, "tmp"));
}
+ case Builtin::BIfma:
+ case Builtin::BIfmaf:
+ case Builtin::BIfmal:
+ case Builtin::BI__builtin_fma:
+ case Builtin::BI__builtin_fmaf:
+ case Builtin::BI__builtin_fmal: {
+ // Rewrite fma to intrinsic.
+ Value *FirstArg = EmitScalarExpr(E->getArg(0));
+ llvm::Type *ArgType = FirstArg->getType();
+ Value *F = CGM.getIntrinsic(Intrinsic::fma, ArgType);
+ return RValue::get(Builder.CreateCall3(F, FirstArg,
+ EmitScalarExpr(E->getArg(1)),
+ EmitScalarExpr(E->getArg(2)),
+ "tmp"));
+ }
+
case Builtin::BI__builtin_signbit:
case Builtin::BI__builtin_signbitf:
case Builtin::BI__builtin_signbitl: {
@@ -1055,7 +1074,7 @@ RValue CodeGenFunction::EmitBuiltinExpr(const FunctionDecl *FD,
Args.push_back(ArgValue);
}
- Value *V = Builder.CreateCall(F, Args.data(), Args.data() + Args.size());
+ Value *V = Builder.CreateCall(F, Args);
QualType BuiltinRetType = E->getType();
const llvm::Type *RetTy = llvm::Type::getVoidTy(getLLVMContext());
@@ -1099,8 +1118,7 @@ Value *CodeGenFunction::EmitTargetBuiltinExpr(unsigned BuiltinID,
}
}
-static const llvm::VectorType *GetNeonType(LLVMContext &C, unsigned type,
- bool q) {
+static llvm::VectorType *GetNeonType(LLVMContext &C, unsigned type, bool q) {
switch (type) {
default: break;
case 0:
@@ -1133,7 +1151,7 @@ Value *CodeGenFunction::EmitNeonCall(Function *F, SmallVectorImpl<Value*> &Ops,
else
Ops[j] = Builder.CreateBitCast(Ops[j], ai->getType(), name);
- return Builder.CreateCall(F, Ops.begin(), Ops.end(), name);
+ return Builder.CreateCall(F, Ops, name);
}
Value *CodeGenFunction::EmitNeonShiftVector(Value *V, const llvm::Type *Ty,
@@ -1181,8 +1199,7 @@ Value *CodeGenFunction::EmitARMBuiltinExpr(unsigned BuiltinID,
const llvm::Type *Ty = CGM.getTypes().ConvertType(FD->getType());
const llvm::FunctionType *FTy = cast<llvm::FunctionType>(Ty);
llvm::StringRef Name = FD->getName();
- return Builder.CreateCall(CGM.CreateRuntimeFunction(FTy, Name),
- Ops.begin(), Ops.end());
+ return Builder.CreateCall(CGM.CreateRuntimeFunction(FTy, Name), Ops);
}
if (BuiltinID == ARM::BI__builtin_arm_ldrexd) {
@@ -1203,8 +1220,7 @@ Value *CodeGenFunction::EmitARMBuiltinExpr(unsigned BuiltinID,
if (BuiltinID == ARM::BI__builtin_arm_strexd) {
Function *F = CGM.getIntrinsic(Intrinsic::arm_strexd);
- llvm::Type *STy = llvm::StructType::get(getLLVMContext(), Int32Ty, Int32Ty,
- NULL);
+ llvm::Type *STy = llvm::StructType::get(Int32Ty, Int32Ty, NULL);
Value *One = llvm::ConstantInt::get(Int32Ty, 1);
Value *Tmp = Builder.CreateAlloca(Int64Ty, One, "tmp");
@@ -1232,7 +1248,7 @@ Value *CodeGenFunction::EmitARMBuiltinExpr(unsigned BuiltinID,
if (BuiltinID == ARM::BI__builtin_arm_vcvtr_f ||
BuiltinID == ARM::BI__builtin_arm_vcvtr_d) {
// Determine the overloaded type of this builtin.
- const llvm::Type *Ty;
+ llvm::Type *Ty;
if (BuiltinID == ARM::BI__builtin_arm_vcvtr_f)
Ty = llvm::Type::getFloatTy(getLLVMContext());
else
@@ -1243,8 +1259,8 @@ Value *CodeGenFunction::EmitARMBuiltinExpr(unsigned BuiltinID,
unsigned Int = usgn ? Intrinsic::arm_vcvtru : Intrinsic::arm_vcvtr;
// Call the appropriate intrinsic.
- Function *F = CGM.getIntrinsic(Int, &Ty, 1);
- return Builder.CreateCall(F, Ops.begin(), Ops.end(), "vcvtr");
+ Function *F = CGM.getIntrinsic(Int, Ty);
+ return Builder.CreateCall(F, Ops, "vcvtr");
}
// Determine the type of this overloaded NEON intrinsic.
@@ -1255,8 +1271,8 @@ Value *CodeGenFunction::EmitARMBuiltinExpr(unsigned BuiltinID,
(void)poly; // Only used in assert()s.
bool rightShift = false;
- const llvm::VectorType *VTy = GetNeonType(getLLVMContext(), type & 0x7, quad);
- const llvm::Type *Ty = VTy;
+ llvm::VectorType *VTy = GetNeonType(getLLVMContext(), type & 0x7, quad);
+ llvm::Type *Ty = VTy;
if (!Ty)
return 0;
@@ -1266,13 +1282,13 @@ Value *CodeGenFunction::EmitARMBuiltinExpr(unsigned BuiltinID,
case ARM::BI__builtin_neon_vabd_v:
case ARM::BI__builtin_neon_vabdq_v:
Int = usgn ? Intrinsic::arm_neon_vabdu : Intrinsic::arm_neon_vabds;
- return EmitNeonCall(CGM.getIntrinsic(Int, &Ty, 1), Ops, "vabd");
+ return EmitNeonCall(CGM.getIntrinsic(Int, Ty), Ops, "vabd");
case ARM::BI__builtin_neon_vabs_v:
case ARM::BI__builtin_neon_vabsq_v:
- return EmitNeonCall(CGM.getIntrinsic(Intrinsic::arm_neon_vabs, &Ty, 1),
+ return EmitNeonCall(CGM.getIntrinsic(Intrinsic::arm_neon_vabs, Ty),
Ops, "vabs");
case ARM::BI__builtin_neon_vaddhn_v:
- return EmitNeonCall(CGM.getIntrinsic(Intrinsic::arm_neon_vaddhn, &Ty, 1),
+ return EmitNeonCall(CGM.getIntrinsic(Intrinsic::arm_neon_vaddhn, Ty),
Ops, "vaddhn");
case ARM::BI__builtin_neon_vcale_v:
std::swap(Ops[0], Ops[1]);
@@ -1300,17 +1316,17 @@ Value *CodeGenFunction::EmitARMBuiltinExpr(unsigned BuiltinID,
}
case ARM::BI__builtin_neon_vcls_v:
case ARM::BI__builtin_neon_vclsq_v: {
- Function *F = CGM.getIntrinsic(Intrinsic::arm_neon_vcls, &Ty, 1);
+ Function *F = CGM.getIntrinsic(Intrinsic::arm_neon_vcls, Ty);
return EmitNeonCall(F, Ops, "vcls");
}
case ARM::BI__builtin_neon_vclz_v:
case ARM::BI__builtin_neon_vclzq_v: {
- Function *F = CGM.getIntrinsic(Intrinsic::arm_neon_vclz, &Ty, 1);
+ Function *F = CGM.getIntrinsic(Intrinsic::arm_neon_vclz, Ty);
return EmitNeonCall(F, Ops, "vclz");
}
case ARM::BI__builtin_neon_vcnt_v:
case ARM::BI__builtin_neon_vcntq_v: {
- Function *F = CGM.getIntrinsic(Intrinsic::arm_neon_vcnt, &Ty, 1);
+ Function *F = CGM.getIntrinsic(Intrinsic::arm_neon_vcnt, Ty);
return EmitNeonCall(F, Ops, "vcnt");
}
case ARM::BI__builtin_neon_vcvt_f16_v: {
@@ -1340,18 +1356,18 @@ Value *CodeGenFunction::EmitARMBuiltinExpr(unsigned BuiltinID,
}
case ARM::BI__builtin_neon_vcvt_n_f32_v:
case ARM::BI__builtin_neon_vcvtq_n_f32_v: {
- const llvm::Type *Tys[2] = { GetNeonType(getLLVMContext(), 4, quad), Ty };
+ llvm::Type *Tys[2] = { GetNeonType(getLLVMContext(), 4, quad), Ty };
Int = usgn ? Intrinsic::arm_neon_vcvtfxu2fp : Intrinsic::arm_neon_vcvtfxs2fp;
- Function *F = CGM.getIntrinsic(Int, Tys, 2);
+ Function *F = CGM.getIntrinsic(Int, Tys);
return EmitNeonCall(F, Ops, "vcvt_n");
}
case ARM::BI__builtin_neon_vcvt_n_s32_v:
case ARM::BI__builtin_neon_vcvt_n_u32_v:
case ARM::BI__builtin_neon_vcvtq_n_s32_v:
case ARM::BI__builtin_neon_vcvtq_n_u32_v: {
- const llvm::Type *Tys[2] = { Ty, GetNeonType(getLLVMContext(), 4, quad) };
+ llvm::Type *Tys[2] = { Ty, GetNeonType(getLLVMContext(), 4, quad) };
Int = usgn ? Intrinsic::arm_neon_vcvtfp2fxu : Intrinsic::arm_neon_vcvtfp2fxs;
- Function *F = CGM.getIntrinsic(Int, Tys, 2);
+ Function *F = CGM.getIntrinsic(Int, Tys);
return EmitNeonCall(F, Ops, "vcvt_n");
}
case ARM::BI__builtin_neon_vext_v:
@@ -1381,15 +1397,15 @@ Value *CodeGenFunction::EmitARMBuiltinExpr(unsigned BuiltinID,
case ARM::BI__builtin_neon_vhadd_v:
case ARM::BI__builtin_neon_vhaddq_v:
Int = usgn ? Intrinsic::arm_neon_vhaddu : Intrinsic::arm_neon_vhadds;
- return EmitNeonCall(CGM.getIntrinsic(Int, &Ty, 1), Ops, "vhadd");
+ return EmitNeonCall(CGM.getIntrinsic(Int, Ty), Ops, "vhadd");
case ARM::BI__builtin_neon_vhsub_v:
case ARM::BI__builtin_neon_vhsubq_v:
Int = usgn ? Intrinsic::arm_neon_vhsubu : Intrinsic::arm_neon_vhsubs;
- return EmitNeonCall(CGM.getIntrinsic(Int, &Ty, 1), Ops, "vhsub");
+ return EmitNeonCall(CGM.getIntrinsic(Int, Ty), Ops, "vhsub");
case ARM::BI__builtin_neon_vld1_v:
case ARM::BI__builtin_neon_vld1q_v:
Ops.push_back(GetPointeeAlignment(*this, E->getArg(0)));
- return EmitNeonCall(CGM.getIntrinsic(Intrinsic::arm_neon_vld1, &Ty, 1),
+ return EmitNeonCall(CGM.getIntrinsic(Intrinsic::arm_neon_vld1, Ty),
Ops, "vld1");
case ARM::BI__builtin_neon_vld1_lane_v:
case ARM::BI__builtin_neon_vld1q_lane_v:
@@ -1410,7 +1426,7 @@ Value *CodeGenFunction::EmitARMBuiltinExpr(unsigned BuiltinID,
}
case ARM::BI__builtin_neon_vld2_v:
case ARM::BI__builtin_neon_vld2q_v: {
- Function *F = CGM.getIntrinsic(Intrinsic::arm_neon_vld2, &Ty, 1);
+ Function *F = CGM.getIntrinsic(Intrinsic::arm_neon_vld2, Ty);
Value *Align = GetPointeeAlignment(*this, E->getArg(1));
Ops[1] = Builder.CreateCall2(F, Ops[1], Align, "vld2");
Ty = llvm::PointerType::getUnqual(Ops[1]->getType());
@@ -1419,7 +1435,7 @@ Value *CodeGenFunction::EmitARMBuiltinExpr(unsigned BuiltinID,
}
case ARM::BI__builtin_neon_vld3_v:
case ARM::BI__builtin_neon_vld3q_v: {
- Function *F = CGM.getIntrinsic(Intrinsic::arm_neon_vld3, &Ty, 1);
+ Function *F = CGM.getIntrinsic(Intrinsic::arm_neon_vld3, Ty);
Value *Align = GetPointeeAlignment(*this, E->getArg(1));
Ops[1] = Builder.CreateCall2(F, Ops[1], Align, "vld3");
Ty = llvm::PointerType::getUnqual(Ops[1]->getType());
@@ -1428,7 +1444,7 @@ Value *CodeGenFunction::EmitARMBuiltinExpr(unsigned BuiltinID,
}
case ARM::BI__builtin_neon_vld4_v:
case ARM::BI__builtin_neon_vld4q_v: {
- Function *F = CGM.getIntrinsic(Intrinsic::arm_neon_vld4, &Ty, 1);
+ Function *F = CGM.getIntrinsic(Intrinsic::arm_neon_vld4, Ty);
Value *Align = GetPointeeAlignment(*this, E->getArg(1));
Ops[1] = Builder.CreateCall2(F, Ops[1], Align, "vld4");
Ty = llvm::PointerType::getUnqual(Ops[1]->getType());
@@ -1437,36 +1453,42 @@ Value *CodeGenFunction::EmitARMBuiltinExpr(unsigned BuiltinID,
}
case ARM::BI__builtin_neon_vld2_lane_v:
case ARM::BI__builtin_neon_vld2q_lane_v: {
- Function *F = CGM.getIntrinsic(Intrinsic::arm_neon_vld2lane, &Ty, 1);
+ Function *F = CGM.getIntrinsic(Intrinsic::arm_neon_vld2lane, Ty);
Ops[2] = Builder.CreateBitCast(Ops[2], Ty);
Ops[3] = Builder.CreateBitCast(Ops[3], Ty);
Ops.push_back(GetPointeeAlignment(*this, E->getArg(1)));
- Ops[1] = Builder.CreateCall(F, Ops.begin() + 1, Ops.end(), "vld2_lane");
+ Ops[1] = Builder.CreateCall(F,
+ ArrayRef<Value *>(Ops.begin() + 1, Ops.end()),
+ "vld2_lane");
Ty = llvm::PointerType::getUnqual(Ops[1]->getType());
Ops[0] = Builder.CreateBitCast(Ops[0], Ty);
return Builder.CreateStore(Ops[1], Ops[0]);
}
case ARM::BI__builtin_neon_vld3_lane_v:
case ARM::BI__builtin_neon_vld3q_lane_v: {
- Function *F = CGM.getIntrinsic(Intrinsic::arm_neon_vld3lane, &Ty, 1);
+ Function *F = CGM.getIntrinsic(Intrinsic::arm_neon_vld3lane, Ty);
Ops[2] = Builder.CreateBitCast(Ops[2], Ty);
Ops[3] = Builder.CreateBitCast(Ops[3], Ty);
Ops[4] = Builder.CreateBitCast(Ops[4], Ty);
Ops.push_back(GetPointeeAlignment(*this, E->getArg(1)));
- Ops[1] = Builder.CreateCall(F, Ops.begin() + 1, Ops.end(), "vld3_lane");
+ Ops[1] = Builder.CreateCall(F,
+ ArrayRef<Value *>(Ops.begin() + 1, Ops.end()),
+ "vld3_lane");
Ty = llvm::PointerType::getUnqual(Ops[1]->getType());
Ops[0] = Builder.CreateBitCast(Ops[0], Ty);
return Builder.CreateStore(Ops[1], Ops[0]);
}
case ARM::BI__builtin_neon_vld4_lane_v:
case ARM::BI__builtin_neon_vld4q_lane_v: {
- Function *F = CGM.getIntrinsic(Intrinsic::arm_neon_vld4lane, &Ty, 1);
+ Function *F = CGM.getIntrinsic(Intrinsic::arm_neon_vld4lane, Ty);
Ops[2] = Builder.CreateBitCast(Ops[2], Ty);
Ops[3] = Builder.CreateBitCast(Ops[3], Ty);
Ops[4] = Builder.CreateBitCast(Ops[4], Ty);
Ops[5] = Builder.CreateBitCast(Ops[5], Ty);
Ops.push_back(GetPointeeAlignment(*this, E->getArg(1)));
- Ops[1] = Builder.CreateCall(F, Ops.begin() + 1, Ops.end(), "vld3_lane");
+ Ops[1] = Builder.CreateCall(F,
+ ArrayRef<Value *>(Ops.begin() + 1, Ops.end()),
+ "vld3_lane");
Ty = llvm::PointerType::getUnqual(Ops[1]->getType());
Ops[0] = Builder.CreateBitCast(Ops[0], Ty);
return Builder.CreateStore(Ops[1], Ops[0]);
@@ -1488,7 +1510,7 @@ Value *CodeGenFunction::EmitARMBuiltinExpr(unsigned BuiltinID,
break;
default: assert(0 && "unknown vld_dup intrinsic?");
}
- Function *F = CGM.getIntrinsic(Int, &Ty, 1);
+ Function *F = CGM.getIntrinsic(Int, Ty);
Value *Align = GetPointeeAlignment(*this, E->getArg(1));
Ops[1] = Builder.CreateCall2(F, Ops[1], Align, "vld_dup");
Ty = llvm::PointerType::getUnqual(Ops[1]->getType());
@@ -1507,7 +1529,7 @@ Value *CodeGenFunction::EmitARMBuiltinExpr(unsigned BuiltinID,
break;
default: assert(0 && "unknown vld_dup intrinsic?");
}
- Function *F = CGM.getIntrinsic(Int, &Ty, 1);
+ Function *F = CGM.getIntrinsic(Int, Ty);
const llvm::StructType *STy = cast<llvm::StructType>(F->getReturnType());
SmallVector<Value*, 6> Args;
@@ -1518,7 +1540,7 @@ Value *CodeGenFunction::EmitARMBuiltinExpr(unsigned BuiltinID,
Args.push_back(CI);
Args.push_back(GetPointeeAlignment(*this, E->getArg(1)));
- Ops[1] = Builder.CreateCall(F, Args.begin(), Args.end(), "vld_dup");
+ Ops[1] = Builder.CreateCall(F, Args, "vld_dup");
// splat lane 0 to all elts in each vector of the result.
for (unsigned i = 0, e = STy->getNumElements(); i != e; ++i) {
Value *Val = Builder.CreateExtractValue(Ops[1], i);
@@ -1534,11 +1556,11 @@ Value *CodeGenFunction::EmitARMBuiltinExpr(unsigned BuiltinID,
case ARM::BI__builtin_neon_vmax_v:
case ARM::BI__builtin_neon_vmaxq_v:
Int = usgn ? Intrinsic::arm_neon_vmaxu : Intrinsic::arm_neon_vmaxs;
- return EmitNeonCall(CGM.getIntrinsic(Int, &Ty, 1), Ops, "vmax");
+ return EmitNeonCall(CGM.getIntrinsic(Int, Ty), Ops, "vmax");
case ARM::BI__builtin_neon_vmin_v:
case ARM::BI__builtin_neon_vminq_v:
Int = usgn ? Intrinsic::arm_neon_vminu : Intrinsic::arm_neon_vmins;
- return EmitNeonCall(CGM.getIntrinsic(Int, &Ty, 1), Ops, "vmin");
+ return EmitNeonCall(CGM.getIntrinsic(Int, Ty), Ops, "vmin");
case ARM::BI__builtin_neon_vmovl_v: {
const llvm::Type *DTy =llvm::VectorType::getTruncatedElementVectorType(VTy);
Ops[0] = Builder.CreateBitCast(Ops[0], DTy);
@@ -1554,12 +1576,12 @@ Value *CodeGenFunction::EmitARMBuiltinExpr(unsigned BuiltinID,
case ARM::BI__builtin_neon_vmul_v:
case ARM::BI__builtin_neon_vmulq_v:
assert(poly && "vmul builtin only supported for polynomial types");
- return EmitNeonCall(CGM.getIntrinsic(Intrinsic::arm_neon_vmulp, &Ty, 1),
+ return EmitNeonCall(CGM.getIntrinsic(Intrinsic::arm_neon_vmulp, Ty),
Ops, "vmul");
case ARM::BI__builtin_neon_vmull_v:
Int = usgn ? Intrinsic::arm_neon_vmullu : Intrinsic::arm_neon_vmulls;
Int = poly ? (unsigned)Intrinsic::arm_neon_vmullp : Int;
- return EmitNeonCall(CGM.getIntrinsic(Int, &Ty, 1), Ops, "vmull");
+ return EmitNeonCall(CGM.getIntrinsic(Int, Ty), Ops, "vmull");
case ARM::BI__builtin_neon_vpadal_v:
case ARM::BI__builtin_neon_vpadalq_v: {
Int = usgn ? Intrinsic::arm_neon_vpadalu : Intrinsic::arm_neon_vpadals;
@@ -1567,13 +1589,13 @@ Value *CodeGenFunction::EmitARMBuiltinExpr(unsigned BuiltinID,
unsigned EltBits = VTy->getElementType()->getPrimitiveSizeInBits();
const llvm::Type *EltTy =
llvm::IntegerType::get(getLLVMContext(), EltBits / 2);
- const llvm::Type *NarrowTy =
+ llvm::Type *NarrowTy =
llvm::VectorType::get(EltTy, VTy->getNumElements() * 2);
- const llvm::Type *Tys[2] = { Ty, NarrowTy };
- return EmitNeonCall(CGM.getIntrinsic(Int, Tys, 2), Ops, "vpadal");
+ llvm::Type *Tys[2] = { Ty, NarrowTy };
+ return EmitNeonCall(CGM.getIntrinsic(Int, Tys), Ops, "vpadal");
}
case ARM::BI__builtin_neon_vpadd_v:
- return EmitNeonCall(CGM.getIntrinsic(Intrinsic::arm_neon_vpadd, &Ty, 1),
+ return EmitNeonCall(CGM.getIntrinsic(Intrinsic::arm_neon_vpadd, Ty),
Ops, "vpadd");
case ARM::BI__builtin_neon_vpaddl_v:
case ARM::BI__builtin_neon_vpaddlq_v: {
@@ -1581,120 +1603,120 @@ Value *CodeGenFunction::EmitARMBuiltinExpr(unsigned BuiltinID,
// The source operand type has twice as many elements of half the size.
unsigned EltBits = VTy->getElementType()->getPrimitiveSizeInBits();
const llvm::Type *EltTy = llvm::IntegerType::get(getLLVMContext(), EltBits / 2);
- const llvm::Type *NarrowTy =
+ llvm::Type *NarrowTy =
llvm::VectorType::get(EltTy, VTy->getNumElements() * 2);
- const llvm::Type *Tys[2] = { Ty, NarrowTy };
- return EmitNeonCall(CGM.getIntrinsic(Int, Tys, 2), Ops, "vpaddl");
+ llvm::Type *Tys[2] = { Ty, NarrowTy };
+ return EmitNeonCall(CGM.getIntrinsic(Int, Tys), Ops, "vpaddl");
}
case ARM::BI__builtin_neon_vpmax_v:
Int = usgn ? Intrinsic::arm_neon_vpmaxu : Intrinsic::arm_neon_vpmaxs;
- return EmitNeonCall(CGM.getIntrinsic(Int, &Ty, 1), Ops, "vpmax");
+ return EmitNeonCall(CGM.getIntrinsic(Int, Ty), Ops, "vpmax");
case ARM::BI__builtin_neon_vpmin_v:
Int = usgn ? Intrinsic::arm_neon_vpminu : Intrinsic::arm_neon_vpmins;
- return EmitNeonCall(CGM.getIntrinsic(Int, &Ty, 1), Ops, "vpmin");
+ return EmitNeonCall(CGM.getIntrinsic(Int, Ty), Ops, "vpmin");
case ARM::BI__builtin_neon_vqabs_v:
case ARM::BI__builtin_neon_vqabsq_v:
- return EmitNeonCall(CGM.getIntrinsic(Intrinsic::arm_neon_vqabs, &Ty, 1),
+ return EmitNeonCall(CGM.getIntrinsic(Intrinsic::arm_neon_vqabs, Ty),
Ops, "vqabs");
case ARM::BI__builtin_neon_vqadd_v:
case ARM::BI__builtin_neon_vqaddq_v:
Int = usgn ? Intrinsic::arm_neon_vqaddu : Intrinsic::arm_neon_vqadds;
- return EmitNeonCall(CGM.getIntrinsic(Int, &Ty, 1), Ops, "vqadd");
+ return EmitNeonCall(CGM.getIntrinsic(Int, Ty), Ops, "vqadd");
case ARM::BI__builtin_neon_vqdmlal_v:
- return EmitNeonCall(CGM.getIntrinsic(Intrinsic::arm_neon_vqdmlal, &Ty, 1),
+ return EmitNeonCall(CGM.getIntrinsic(Intrinsic::arm_neon_vqdmlal, Ty),
Ops, "vqdmlal");
case ARM::BI__builtin_neon_vqdmlsl_v:
- return EmitNeonCall(CGM.getIntrinsic(Intrinsic::arm_neon_vqdmlsl, &Ty, 1),
+ return EmitNeonCall(CGM.getIntrinsic(Intrinsic::arm_neon_vqdmlsl, Ty),
Ops, "vqdmlsl");
case ARM::BI__builtin_neon_vqdmulh_v:
case ARM::BI__builtin_neon_vqdmulhq_v:
- return EmitNeonCall(CGM.getIntrinsic(Intrinsic::arm_neon_vqdmulh, &Ty, 1),
+ return EmitNeonCall(CGM.getIntrinsic(Intrinsic::arm_neon_vqdmulh, Ty),
Ops, "vqdmulh");
case ARM::BI__builtin_neon_vqdmull_v:
- return EmitNeonCall(CGM.getIntrinsic(Intrinsic::arm_neon_vqdmull, &Ty, 1),
+ return EmitNeonCall(CGM.getIntrinsic(Intrinsic::arm_neon_vqdmull, Ty),
Ops, "vqdmull");
case ARM::BI__builtin_neon_vqmovn_v:
Int = usgn ? Intrinsic::arm_neon_vqmovnu : Intrinsic::arm_neon_vqmovns;
- return EmitNeonCall(CGM.getIntrinsic(Int, &Ty, 1), Ops, "vqmovn");
+ return EmitNeonCall(CGM.getIntrinsic(Int, Ty), Ops, "vqmovn");
case ARM::BI__builtin_neon_vqmovun_v:
- return EmitNeonCall(CGM.getIntrinsic(Intrinsic::arm_neon_vqmovnsu, &Ty, 1),
+ return EmitNeonCall(CGM.getIntrinsic(Intrinsic::arm_neon_vqmovnsu, Ty),
Ops, "vqdmull");
case ARM::BI__builtin_neon_vqneg_v:
case ARM::BI__builtin_neon_vqnegq_v:
- return EmitNeonCall(CGM.getIntrinsic(Intrinsic::arm_neon_vqneg, &Ty, 1),
+ return EmitNeonCall(CGM.getIntrinsic(Intrinsic::arm_neon_vqneg, Ty),
Ops, "vqneg");
case ARM::BI__builtin_neon_vqrdmulh_v:
case ARM::BI__builtin_neon_vqrdmulhq_v:
- return EmitNeonCall(CGM.getIntrinsic(Intrinsic::arm_neon_vqrdmulh, &Ty, 1),
+ return EmitNeonCall(CGM.getIntrinsic(Intrinsic::arm_neon_vqrdmulh, Ty),
Ops, "vqrdmulh");
case ARM::BI__builtin_neon_vqrshl_v:
case ARM::BI__builtin_neon_vqrshlq_v:
Int = usgn ? Intrinsic::arm_neon_vqrshiftu : Intrinsic::arm_neon_vqrshifts;
- return EmitNeonCall(CGM.getIntrinsic(Int, &Ty, 1), Ops, "vqrshl");
+ return EmitNeonCall(CGM.getIntrinsic(Int, Ty), Ops, "vqrshl");
case ARM::BI__builtin_neon_vqrshrn_n_v:
Int = usgn ? Intrinsic::arm_neon_vqrshiftnu : Intrinsic::arm_neon_vqrshiftns;
- return EmitNeonCall(CGM.getIntrinsic(Int, &Ty, 1), Ops, "vqrshrn_n",
+ return EmitNeonCall(CGM.getIntrinsic(Int, Ty), Ops, "vqrshrn_n",
1, true);
case ARM::BI__builtin_neon_vqrshrun_n_v:
- return EmitNeonCall(CGM.getIntrinsic(Intrinsic::arm_neon_vqrshiftnsu, &Ty, 1),
+ return EmitNeonCall(CGM.getIntrinsic(Intrinsic::arm_neon_vqrshiftnsu, Ty),
Ops, "vqrshrun_n", 1, true);
case ARM::BI__builtin_neon_vqshl_v:
case ARM::BI__builtin_neon_vqshlq_v:
Int = usgn ? Intrinsic::arm_neon_vqshiftu : Intrinsic::arm_neon_vqshifts;
- return EmitNeonCall(CGM.getIntrinsic(Int, &Ty, 1), Ops, "vqshl");
+ return EmitNeonCall(CGM.getIntrinsic(Int, Ty), Ops, "vqshl");
case ARM::BI__builtin_neon_vqshl_n_v:
case ARM::BI__builtin_neon_vqshlq_n_v:
Int = usgn ? Intrinsic::arm_neon_vqshiftu : Intrinsic::arm_neon_vqshifts;
- return EmitNeonCall(CGM.getIntrinsic(Int, &Ty, 1), Ops, "vqshl_n",
+ return EmitNeonCall(CGM.getIntrinsic(Int, Ty), Ops, "vqshl_n",
1, false);
case ARM::BI__builtin_neon_vqshlu_n_v:
case ARM::BI__builtin_neon_vqshluq_n_v:
- return EmitNeonCall(CGM.getIntrinsic(Intrinsic::arm_neon_vqshiftsu, &Ty, 1),
+ return EmitNeonCall(CGM.getIntrinsic(Intrinsic::arm_neon_vqshiftsu, Ty),
Ops, "vqshlu", 1, false);
case ARM::BI__builtin_neon_vqshrn_n_v:
Int = usgn ? Intrinsic::arm_neon_vqshiftnu : Intrinsic::arm_neon_vqshiftns;
- return EmitNeonCall(CGM.getIntrinsic(Int, &Ty, 1), Ops, "vqshrn_n",
+ return EmitNeonCall(CGM.getIntrinsic(Int, Ty), Ops, "vqshrn_n",
1, true);
case ARM::BI__builtin_neon_vqshrun_n_v:
- return EmitNeonCall(CGM.getIntrinsic(Intrinsic::arm_neon_vqshiftnsu, &Ty, 1),
+ return EmitNeonCall(CGM.getIntrinsic(Intrinsic::arm_neon_vqshiftnsu, Ty),
Ops, "vqshrun_n", 1, true);
case ARM::BI__builtin_neon_vqsub_v:
case ARM::BI__builtin_neon_vqsubq_v:
Int = usgn ? Intrinsic::arm_neon_vqsubu : Intrinsic::arm_neon_vqsubs;
- return EmitNeonCall(CGM.getIntrinsic(Int, &Ty, 1), Ops, "vqsub");
+ return EmitNeonCall(CGM.getIntrinsic(Int, Ty), Ops, "vqsub");
case ARM::BI__builtin_neon_vraddhn_v:
- return EmitNeonCall(CGM.getIntrinsic(Intrinsic::arm_neon_vraddhn, &Ty, 1),
+ return EmitNeonCall(CGM.getIntrinsic(Intrinsic::arm_neon_vraddhn, Ty),
Ops, "vraddhn");
case ARM::BI__builtin_neon_vrecpe_v:
case ARM::BI__builtin_neon_vrecpeq_v:
- return EmitNeonCall(CGM.getIntrinsic(Intrinsic::arm_neon_vrecpe, &Ty, 1),
+ return EmitNeonCall(CGM.getIntrinsic(Intrinsic::arm_neon_vrecpe, Ty),
Ops, "vrecpe");
case ARM::BI__builtin_neon_vrecps_v:
case ARM::BI__builtin_neon_vrecpsq_v:
- return EmitNeonCall(CGM.getIntrinsic(Intrinsic::arm_neon_vrecps, &Ty, 1),
+ return EmitNeonCall(CGM.getIntrinsic(Intrinsic::arm_neon_vrecps, Ty),
Ops, "vrecps");
case ARM::BI__builtin_neon_vrhadd_v:
case ARM::BI__builtin_neon_vrhaddq_v:
Int = usgn ? Intrinsic::arm_neon_vrhaddu : Intrinsic::arm_neon_vrhadds;
- return EmitNeonCall(CGM.getIntrinsic(Int, &Ty, 1), Ops, "vrhadd");
+ return EmitNeonCall(CGM.getIntrinsic(Int, Ty), Ops, "vrhadd");
case ARM::BI__builtin_neon_vrshl_v:
case ARM::BI__builtin_neon_vrshlq_v:
Int = usgn ? Intrinsic::arm_neon_vrshiftu : Intrinsic::arm_neon_vrshifts;
- return EmitNeonCall(CGM.getIntrinsic(Int, &Ty, 1), Ops, "vrshl");
+ return EmitNeonCall(CGM.getIntrinsic(Int, Ty), Ops, "vrshl");
case ARM::BI__builtin_neon_vrshrn_n_v:
- return EmitNeonCall(CGM.getIntrinsic(Intrinsic::arm_neon_vrshiftn, &Ty, 1),
+ return EmitNeonCall(CGM.getIntrinsic(Intrinsic::arm_neon_vrshiftn, Ty),
Ops, "vrshrn_n", 1, true);
case ARM::BI__builtin_neon_vrshr_n_v:
case ARM::BI__builtin_neon_vrshrq_n_v:
Int = usgn ? Intrinsic::arm_neon_vrshiftu : Intrinsic::arm_neon_vrshifts;
- return EmitNeonCall(CGM.getIntrinsic(Int, &Ty, 1), Ops, "vrshr_n", 1, true);
+ return EmitNeonCall(CGM.getIntrinsic(Int, Ty), Ops, "vrshr_n", 1, true);
case ARM::BI__builtin_neon_vrsqrte_v:
case ARM::BI__builtin_neon_vrsqrteq_v:
- return EmitNeonCall(CGM.getIntrinsic(Intrinsic::arm_neon_vrsqrte, &Ty, 1),
+ return EmitNeonCall(CGM.getIntrinsic(Intrinsic::arm_neon_vrsqrte, Ty),
Ops, "vrsqrte");
case ARM::BI__builtin_neon_vrsqrts_v:
case ARM::BI__builtin_neon_vrsqrtsq_v:
- return EmitNeonCall(CGM.getIntrinsic(Intrinsic::arm_neon_vrsqrts, &Ty, 1),
+ return EmitNeonCall(CGM.getIntrinsic(Intrinsic::arm_neon_vrsqrts, Ty),
Ops, "vrsqrts");
case ARM::BI__builtin_neon_vrsra_n_v:
case ARM::BI__builtin_neon_vrsraq_n_v:
@@ -1702,10 +1724,10 @@ Value *CodeGenFunction::EmitARMBuiltinExpr(unsigned BuiltinID,
Ops[1] = Builder.CreateBitCast(Ops[1], Ty);
Ops[2] = EmitNeonShiftVector(Ops[2], Ty, true);
Int = usgn ? Intrinsic::arm_neon_vrshiftu : Intrinsic::arm_neon_vrshifts;
- Ops[1] = Builder.CreateCall2(CGM.getIntrinsic(Int, &Ty, 1), Ops[1], Ops[2]);
+ Ops[1] = Builder.CreateCall2(CGM.getIntrinsic(Int, Ty), Ops[1], Ops[2]);
return Builder.CreateAdd(Ops[0], Ops[1], "vrsra_n");
case ARM::BI__builtin_neon_vrsubhn_v:
- return EmitNeonCall(CGM.getIntrinsic(Intrinsic::arm_neon_vrsubhn, &Ty, 1),
+ return EmitNeonCall(CGM.getIntrinsic(Intrinsic::arm_neon_vrsubhn, Ty),
Ops, "vrsubhn");
case ARM::BI__builtin_neon_vset_lane_i8:
case ARM::BI__builtin_neon_vset_lane_i16:
@@ -1722,16 +1744,16 @@ Value *CodeGenFunction::EmitARMBuiltinExpr(unsigned BuiltinID,
case ARM::BI__builtin_neon_vshl_v:
case ARM::BI__builtin_neon_vshlq_v:
Int = usgn ? Intrinsic::arm_neon_vshiftu : Intrinsic::arm_neon_vshifts;
- return EmitNeonCall(CGM.getIntrinsic(Int, &Ty, 1), Ops, "vshl");
+ return EmitNeonCall(CGM.getIntrinsic(Int, Ty), Ops, "vshl");
case ARM::BI__builtin_neon_vshll_n_v:
Int = usgn ? Intrinsic::arm_neon_vshiftlu : Intrinsic::arm_neon_vshiftls;
- return EmitNeonCall(CGM.getIntrinsic(Int, &Ty, 1), Ops, "vshll", 1);
+ return EmitNeonCall(CGM.getIntrinsic(Int, Ty), Ops, "vshll", 1);
case ARM::BI__builtin_neon_vshl_n_v:
case ARM::BI__builtin_neon_vshlq_n_v:
Ops[1] = EmitNeonShiftVector(Ops[1], Ty, false);
return Builder.CreateShl(Builder.CreateBitCast(Ops[0],Ty), Ops[1], "vshl_n");
case ARM::BI__builtin_neon_vshrn_n_v:
- return EmitNeonCall(CGM.getIntrinsic(Intrinsic::arm_neon_vshiftn, &Ty, 1),
+ return EmitNeonCall(CGM.getIntrinsic(Intrinsic::arm_neon_vshiftn, Ty),
Ops, "vshrn_n", 1, true);
case ARM::BI__builtin_neon_vshr_n_v:
case ARM::BI__builtin_neon_vshrq_n_v:
@@ -1747,7 +1769,7 @@ Value *CodeGenFunction::EmitARMBuiltinExpr(unsigned BuiltinID,
case ARM::BI__builtin_neon_vsli_n_v:
case ARM::BI__builtin_neon_vsliq_n_v:
Ops[2] = EmitNeonShiftVector(Ops[2], Ty, rightShift);
- return EmitNeonCall(CGM.getIntrinsic(Intrinsic::arm_neon_vshiftins, &Ty, 1),
+ return EmitNeonCall(CGM.getIntrinsic(Intrinsic::arm_neon_vshiftins, Ty),
Ops, "vsli_n");
case ARM::BI__builtin_neon_vsra_n_v:
case ARM::BI__builtin_neon_vsraq_n_v:
@@ -1762,7 +1784,7 @@ Value *CodeGenFunction::EmitARMBuiltinExpr(unsigned BuiltinID,
case ARM::BI__builtin_neon_vst1_v:
case ARM::BI__builtin_neon_vst1q_v:
Ops.push_back(GetPointeeAlignment(*this, E->getArg(0)));
- return EmitNeonCall(CGM.getIntrinsic(Intrinsic::arm_neon_vst1, &Ty, 1),
+ return EmitNeonCall(CGM.getIntrinsic(Intrinsic::arm_neon_vst1, Ty),
Ops, "");
case ARM::BI__builtin_neon_vst1_lane_v:
case ARM::BI__builtin_neon_vst1q_lane_v:
@@ -1773,35 +1795,35 @@ Value *CodeGenFunction::EmitARMBuiltinExpr(unsigned BuiltinID,
case ARM::BI__builtin_neon_vst2_v:
case ARM::BI__builtin_neon_vst2q_v:
Ops.push_back(GetPointeeAlignment(*this, E->getArg(0)));
- return EmitNeonCall(CGM.getIntrinsic(Intrinsic::arm_neon_vst2, &Ty, 1),
+ return EmitNeonCall(CGM.getIntrinsic(Intrinsic::arm_neon_vst2, Ty),
Ops, "");
case ARM::BI__builtin_neon_vst2_lane_v:
case ARM::BI__builtin_neon_vst2q_lane_v:
Ops.push_back(GetPointeeAlignment(*this, E->getArg(0)));
- return EmitNeonCall(CGM.getIntrinsic(Intrinsic::arm_neon_vst2lane, &Ty, 1),
+ return EmitNeonCall(CGM.getIntrinsic(Intrinsic::arm_neon_vst2lane, Ty),
Ops, "");
case ARM::BI__builtin_neon_vst3_v:
case ARM::BI__builtin_neon_vst3q_v:
Ops.push_back(GetPointeeAlignment(*this, E->getArg(0)));
- return EmitNeonCall(CGM.getIntrinsic(Intrinsic::arm_neon_vst3, &Ty, 1),
+ return EmitNeonCall(CGM.getIntrinsic(Intrinsic::arm_neon_vst3, Ty),
Ops, "");
case ARM::BI__builtin_neon_vst3_lane_v:
case ARM::BI__builtin_neon_vst3q_lane_v:
Ops.push_back(GetPointeeAlignment(*this, E->getArg(0)));
- return EmitNeonCall(CGM.getIntrinsic(Intrinsic::arm_neon_vst3lane, &Ty, 1),
+ return EmitNeonCall(CGM.getIntrinsic(Intrinsic::arm_neon_vst3lane, Ty),
Ops, "");
case ARM::BI__builtin_neon_vst4_v:
case ARM::BI__builtin_neon_vst4q_v:
Ops.push_back(GetPointeeAlignment(*this, E->getArg(0)));
- return EmitNeonCall(CGM.getIntrinsic(Intrinsic::arm_neon_vst4, &Ty, 1),
+ return EmitNeonCall(CGM.getIntrinsic(Intrinsic::arm_neon_vst4, Ty),
Ops, "");
case ARM::BI__builtin_neon_vst4_lane_v:
case ARM::BI__builtin_neon_vst4q_lane_v:
Ops.push_back(GetPointeeAlignment(*this, E->getArg(0)));
- return EmitNeonCall(CGM.getIntrinsic(Intrinsic::arm_neon_vst4lane, &Ty, 1),
+ return EmitNeonCall(CGM.getIntrinsic(Intrinsic::arm_neon_vst4lane, Ty),
Ops, "");
case ARM::BI__builtin_neon_vsubhn_v:
- return EmitNeonCall(CGM.getIntrinsic(Intrinsic::arm_neon_vsubhn, &Ty, 1),
+ return EmitNeonCall(CGM.getIntrinsic(Intrinsic::arm_neon_vsubhn, Ty),
Ops, "vsubhn");
case ARM::BI__builtin_neon_vtbl1_v:
return EmitNeonCall(CGM.getIntrinsic(Intrinsic::arm_neon_vtbl1),
@@ -2005,7 +2027,7 @@ Value *CodeGenFunction::EmitX86BuiltinExpr(unsigned BuiltinID,
break;
}
llvm::Function *F = CGM.getIntrinsic(ID);
- return Builder.CreateCall(F, &Ops[0], &Ops[0] + Ops.size(), name);
+ return Builder.CreateCall(F, Ops, name);
}
case X86::BI__builtin_ia32_vec_init_v8qi:
case X86::BI__builtin_ia32_vec_init_v4hi:
@@ -2065,15 +2087,15 @@ Value *CodeGenFunction::EmitX86BuiltinExpr(unsigned BuiltinID,
break;
}
llvm::Function *F = CGM.getIntrinsic(ID);
- return Builder.CreateCall(F, &Ops[0], &Ops[0] + Ops.size(), name);
+ return Builder.CreateCall(F, Ops, name);
}
case X86::BI__builtin_ia32_cmpps: {
llvm::Function *F = CGM.getIntrinsic(Intrinsic::x86_sse_cmp_ps);
- return Builder.CreateCall(F, &Ops[0], &Ops[0] + Ops.size(), "cmpps");
+ return Builder.CreateCall(F, Ops, "cmpps");
}
case X86::BI__builtin_ia32_cmpss: {
llvm::Function *F = CGM.getIntrinsic(Intrinsic::x86_sse_cmp_ss);
- return Builder.CreateCall(F, &Ops[0], &Ops[0] + Ops.size(), "cmpss");
+ return Builder.CreateCall(F, Ops, "cmpss");
}
case X86::BI__builtin_ia32_ldmxcsr: {
const llvm::Type *PtrTy = Int8PtrTy;
@@ -2093,11 +2115,11 @@ Value *CodeGenFunction::EmitX86BuiltinExpr(unsigned BuiltinID,
}
case X86::BI__builtin_ia32_cmppd: {
llvm::Function *F = CGM.getIntrinsic(Intrinsic::x86_sse2_cmp_pd);
- return Builder.CreateCall(F, &Ops[0], &Ops[0] + Ops.size(), "cmppd");
+ return Builder.CreateCall(F, Ops, "cmppd");
}
case X86::BI__builtin_ia32_cmpsd: {
llvm::Function *F = CGM.getIntrinsic(Intrinsic::x86_sse2_cmp_sd);
- return Builder.CreateCall(F, &Ops[0], &Ops[0] + Ops.size(), "cmpsd");
+ return Builder.CreateCall(F, Ops, "cmpsd");
}
case X86::BI__builtin_ia32_storehps:
case X86::BI__builtin_ia32_storelps: {
@@ -2141,7 +2163,7 @@ Value *CodeGenFunction::EmitX86BuiltinExpr(unsigned BuiltinID,
// create i32 constant
llvm::Function *F = CGM.getIntrinsic(Intrinsic::x86_mmx_psrl_q);
- return Builder.CreateCall(F, &Ops[0], &Ops[0] + 2, "palignr");
+ return Builder.CreateCall(F, ArrayRef<Value *>(&Ops[0], 2), "palignr");
}
// If palignr is shifting the pair of vectors more than 32 bytes, emit zero.
@@ -2171,7 +2193,7 @@ Value *CodeGenFunction::EmitX86BuiltinExpr(unsigned BuiltinID,
// create i32 constant
llvm::Function *F = CGM.getIntrinsic(Intrinsic::x86_sse2_psrl_dq);
- return Builder.CreateCall(F, &Ops[0], &Ops[0] + 2, "palignr");
+ return Builder.CreateCall(F, ArrayRef<Value *>(&Ops[0], 2), "palignr");
}
// If palignr is shifting the pair of vectors more than 32 bytes, emit zero.
@@ -2323,7 +2345,7 @@ Value *CodeGenFunction::EmitX86BuiltinExpr(unsigned BuiltinID,
break;
}
llvm::Function *F = CGM.getIntrinsic(ID);
- return Builder.CreateCall(F, &Ops[0], &Ops[0] + Ops.size(), name);
+ return Builder.CreateCall(F, Ops, name);
}
}
}
@@ -2379,7 +2401,7 @@ Value *CodeGenFunction::EmitPPCBuiltinExpr(unsigned BuiltinID,
break;
}
llvm::Function *F = CGM.getIntrinsic(ID);
- return Builder.CreateCall(F, &Ops[0], &Ops[0] + Ops.size(), "");
+ return Builder.CreateCall(F, Ops, "");
}
// vec_st
@@ -2412,7 +2434,7 @@ Value *CodeGenFunction::EmitPPCBuiltinExpr(unsigned BuiltinID,
break;
}
llvm::Function *F = CGM.getIntrinsic(ID);
- return Builder.CreateCall(F, &Ops[0], &Ops[0] + Ops.size(), "");
+ return Builder.CreateCall(F, Ops, "");
}
}
return 0;
diff --git a/contrib/llvm/tools/clang/lib/CodeGen/CGCXXABI.cpp b/contrib/llvm/tools/clang/lib/CodeGen/CGCXXABI.cpp
index 92f1c63..dcc28b4 100644
--- a/contrib/llvm/tools/clang/lib/CodeGen/CGCXXABI.cpp
+++ b/contrib/llvm/tools/clang/lib/CodeGen/CGCXXABI.cpp
@@ -34,7 +34,7 @@ static llvm::Constant *GetBogusMemberPointer(CodeGenModule &CGM,
return llvm::Constant::getNullValue(CGM.getTypes().ConvertType(T));
}
-const llvm::Type *
+llvm::Type *
CGCXXABI::ConvertMemberPointerType(const MemberPointerType *MPT) {
return CGM.getTypes().ConvertType(CGM.getContext().getPointerDiffType());
}
diff --git a/contrib/llvm/tools/clang/lib/CodeGen/CGCXXABI.h b/contrib/llvm/tools/clang/lib/CodeGen/CGCXXABI.h
index de4df3d..29f299a 100644
--- a/contrib/llvm/tools/clang/lib/CodeGen/CGCXXABI.h
+++ b/contrib/llvm/tools/clang/lib/CodeGen/CGCXXABI.h
@@ -82,7 +82,7 @@ public:
/// Find the LLVM type used to represent the given member pointer
/// type.
- virtual const llvm::Type *
+ virtual llvm::Type *
ConvertMemberPointerType(const MemberPointerType *MPT);
/// Load a member function from an object and a member function
diff --git a/contrib/llvm/tools/clang/lib/CodeGen/CGCall.cpp b/contrib/llvm/tools/clang/lib/CodeGen/CGCall.cpp
index 712ae89..f8783ad 100644
--- a/contrib/llvm/tools/clang/lib/CodeGen/CGCall.cpp
+++ b/contrib/llvm/tools/clang/lib/CodeGen/CGCall.cpp
@@ -1,4 +1,4 @@
-//===----- CGCall.h - Encapsulate calling convention details ----*- C++ -*-===//
+//===--- CGCall.cpp - Encapsulate calling convention details ----*- C++ -*-===//
//
// The LLVM Compiler Infrastructure
//
@@ -25,6 +25,8 @@
#include "llvm/Attributes.h"
#include "llvm/Support/CallSite.h"
#include "llvm/Target/TargetData.h"
+#include "llvm/InlineAsm.h"
+#include "llvm/Transforms/Utils/Local.h"
using namespace clang;
using namespace CodeGen;
@@ -65,31 +67,28 @@ static CanQualType GetReturnType(QualType RetTy) {
}
const CGFunctionInfo &
-CodeGenTypes::getFunctionInfo(CanQual<FunctionNoProtoType> FTNP,
- bool IsRecursive) {
+CodeGenTypes::getFunctionInfo(CanQual<FunctionNoProtoType> FTNP) {
return getFunctionInfo(FTNP->getResultType().getUnqualifiedType(),
llvm::SmallVector<CanQualType, 16>(),
- FTNP->getExtInfo(), IsRecursive);
+ FTNP->getExtInfo());
}
/// \param Args - contains any initial parameters besides those
/// in the formal type
static const CGFunctionInfo &getFunctionInfo(CodeGenTypes &CGT,
llvm::SmallVectorImpl<CanQualType> &ArgTys,
- CanQual<FunctionProtoType> FTP,
- bool IsRecursive = false) {
+ CanQual<FunctionProtoType> FTP) {
// FIXME: Kill copy.
for (unsigned i = 0, e = FTP->getNumArgs(); i != e; ++i)
ArgTys.push_back(FTP->getArgType(i));
CanQualType ResTy = FTP->getResultType().getUnqualifiedType();
- return CGT.getFunctionInfo(ResTy, ArgTys, FTP->getExtInfo(), IsRecursive);
+ return CGT.getFunctionInfo(ResTy, ArgTys, FTP->getExtInfo());
}
const CGFunctionInfo &
-CodeGenTypes::getFunctionInfo(CanQual<FunctionProtoType> FTP,
- bool IsRecursive) {
+CodeGenTypes::getFunctionInfo(CanQual<FunctionProtoType> FTP) {
llvm::SmallVector<CanQualType, 16> ArgTys;
- return ::getFunctionInfo(*this, ArgTys, FTP, IsRecursive);
+ return ::getFunctionInfo(*this, ArgTys, FTP);
}
static CallingConv getCallingConventionForDecl(const Decl *D) {
@@ -189,13 +188,15 @@ const CGFunctionInfo &CodeGenTypes::getFunctionInfo(const ObjCMethodDecl *MD) {
e = MD->param_end(); i != e; ++i) {
ArgTys.push_back(Context.getCanonicalParamType((*i)->getType()));
}
- return getFunctionInfo(GetReturnType(MD->getResultType()),
- ArgTys,
- FunctionType::ExtInfo(
- /*NoReturn*/ false,
- /*HasRegParm*/ false,
- /*RegParm*/ 0,
- getCallingConventionForDecl(MD)));
+
+ FunctionType::ExtInfo einfo;
+ einfo = einfo.withCallingConv(getCallingConventionForDecl(MD));
+
+ if (getContext().getLangOptions().ObjCAutoRefCount &&
+ MD->hasAttr<NSReturnsRetainedAttr>())
+ einfo = einfo.withProducesResult(true);
+
+ return getFunctionInfo(GetReturnType(MD->getResultType()), ArgTys, einfo);
}
const CGFunctionInfo &CodeGenTypes::getFunctionInfo(GlobalDecl GD) {
@@ -240,8 +241,7 @@ const CGFunctionInfo &CodeGenTypes::getNullaryFunctionInfo() {
const CGFunctionInfo &CodeGenTypes::getFunctionInfo(CanQualType ResTy,
const llvm::SmallVectorImpl<CanQualType> &ArgTys,
- const FunctionType::ExtInfo &Info,
- bool IsRecursive) {
+ const FunctionType::ExtInfo &Info) {
#ifndef NDEBUG
for (llvm::SmallVectorImpl<CanQualType>::const_iterator
I = ArgTys.begin(), E = ArgTys.end(); I != E; ++I)
@@ -252,8 +252,7 @@ const CGFunctionInfo &CodeGenTypes::getFunctionInfo(CanQualType ResTy,
// Lookup or create unique function info.
llvm::FoldingSetNodeID ID;
- CGFunctionInfo::Profile(ID, Info, ResTy,
- ArgTys.begin(), ArgTys.end());
+ CGFunctionInfo::Profile(ID, Info, ResTy, ArgTys.begin(), ArgTys.end());
void *InsertPos = 0;
CGFunctionInfo *FI = FunctionInfos.FindNodeOrInsertPos(ID, InsertPos);
@@ -261,10 +260,14 @@ const CGFunctionInfo &CodeGenTypes::getFunctionInfo(CanQualType ResTy,
return *FI;
// Construct the function info.
- FI = new CGFunctionInfo(CC, Info.getNoReturn(), Info.getHasRegParm(), Info.getRegParm(), ResTy,
+ FI = new CGFunctionInfo(CC, Info.getNoReturn(), Info.getProducesResult(),
+ Info.getHasRegParm(), Info.getRegParm(), ResTy,
ArgTys.data(), ArgTys.size());
FunctionInfos.InsertNode(FI, InsertPos);
+ bool Inserted = FunctionsBeingProcessed.insert(FI); (void)Inserted;
+ assert(Inserted && "Recursively being processed?");
+
// Compute ABI information.
getABIInfo().computeInfo(*FI);
@@ -273,30 +276,29 @@ const CGFunctionInfo &CodeGenTypes::getFunctionInfo(CanQualType ResTy,
// default now.
ABIArgInfo &RetInfo = FI->getReturnInfo();
if (RetInfo.canHaveCoerceToType() && RetInfo.getCoerceToType() == 0)
- RetInfo.setCoerceToType(ConvertTypeRecursive(FI->getReturnType()));
+ RetInfo.setCoerceToType(ConvertType(FI->getReturnType()));
for (CGFunctionInfo::arg_iterator I = FI->arg_begin(), E = FI->arg_end();
I != E; ++I)
if (I->info.canHaveCoerceToType() && I->info.getCoerceToType() == 0)
- I->info.setCoerceToType(ConvertTypeRecursive(I->type));
-
- // If this is a top-level call and ConvertTypeRecursive hit unresolved pointer
- // types, resolve them now. These pointers may point to this function, which
- // we *just* filled in the FunctionInfo for.
- if (!IsRecursive && !PointersToResolve.empty())
- HandleLateResolvedPointers();
+ I->info.setCoerceToType(ConvertType(I->type));
+ bool Erased = FunctionsBeingProcessed.erase(FI); (void)Erased;
+ assert(Erased && "Not in set?");
+
return *FI;
}
CGFunctionInfo::CGFunctionInfo(unsigned _CallingConvention,
- bool _NoReturn, bool _HasRegParm, unsigned _RegParm,
+ bool _NoReturn, bool returnsRetained,
+ bool _HasRegParm, unsigned _RegParm,
CanQualType ResTy,
const CanQualType *ArgTys,
unsigned NumArgTys)
: CallingConvention(_CallingConvention),
EffectiveCallingConvention(_CallingConvention),
- NoReturn(_NoReturn), HasRegParm(_HasRegParm), RegParm(_RegParm)
+ NoReturn(_NoReturn), ReturnsRetained(returnsRetained),
+ HasRegParm(_HasRegParm), RegParm(_RegParm)
{
NumArgs = NumArgTys;
@@ -310,8 +312,7 @@ CGFunctionInfo::CGFunctionInfo(unsigned _CallingConvention,
/***/
void CodeGenTypes::GetExpandedTypes(QualType type,
- llvm::SmallVectorImpl<const llvm::Type*> &expandedTypes,
- bool isRecursive) {
+ llvm::SmallVectorImpl<llvm::Type*> &expandedTypes) {
const RecordType *RT = type->getAsStructureType();
assert(RT && "Can only expand structure types.");
const RecordDecl *RD = RT->getDecl();
@@ -326,9 +327,9 @@ void CodeGenTypes::GetExpandedTypes(QualType type,
QualType fieldType = FD->getType();
if (fieldType->isRecordType())
- GetExpandedTypes(fieldType, expandedTypes, isRecursive);
+ GetExpandedTypes(fieldType, expandedTypes);
else
- expandedTypes.push_back(ConvertType(fieldType, isRecursive));
+ expandedTypes.push_back(ConvertType(fieldType));
}
}
@@ -352,7 +353,7 @@ CodeGenFunction::ExpandTypeFromArgs(QualType Ty, LValue LV,
if (CodeGenFunction::hasAggregateLLVMType(FT)) {
AI = ExpandTypeFromArgs(FT, LV, AI);
} else {
- EmitStoreThroughLValue(RValue::get(AI), LV, FT);
+ EmitStoreThroughLValue(RValue::get(AI), LV);
++AI;
}
}
@@ -360,33 +361,6 @@ CodeGenFunction::ExpandTypeFromArgs(QualType Ty, LValue LV,
return AI;
}
-void
-CodeGenFunction::ExpandTypeToArgs(QualType Ty, RValue RV,
- llvm::SmallVector<llvm::Value*, 16> &Args) {
- const RecordType *RT = Ty->getAsStructureType();
- assert(RT && "Can only expand structure types.");
-
- RecordDecl *RD = RT->getDecl();
- assert(RV.isAggregate() && "Unexpected rvalue during struct expansion");
- llvm::Value *Addr = RV.getAggregateAddr();
- for (RecordDecl::field_iterator i = RD->field_begin(), e = RD->field_end();
- i != e; ++i) {
- FieldDecl *FD = *i;
- QualType FT = FD->getType();
-
- // FIXME: What are the right qualifiers here?
- LValue LV = EmitLValueForField(Addr, FD, 0);
- if (CodeGenFunction::hasAggregateLLVMType(FT)) {
- ExpandTypeToArgs(FT, RValue::getAggregate(LV.getAddress()), Args);
- } else {
- RValue RV = EmitLoadOfLValue(LV, FT);
- assert(RV.isScalar() &&
- "Unexpected non-scalar rvalue during struct expansion.");
- Args.push_back(RV.getScalarVal());
- }
- }
-}
-
/// EnterStructPointerForCoercedAccess - Given a struct pointer that we are
/// accessing some number of bytes out of it, try to gep into the struct to get
/// at its inner goodness. Dive as deep as possible without entering an element
@@ -622,7 +596,7 @@ bool CodeGenModule::ReturnTypeUsesFPRet(QualType ResultType) {
return false;
}
-const llvm::FunctionType *CodeGenTypes::GetFunctionType(GlobalDecl GD) {
+llvm::FunctionType *CodeGenTypes::GetFunctionType(GlobalDecl GD) {
const CGFunctionInfo &FI = getFunctionInfo(GD);
// For definition purposes, don't consider a K&R function variadic.
@@ -631,13 +605,16 @@ const llvm::FunctionType *CodeGenTypes::GetFunctionType(GlobalDecl GD) {
cast<FunctionDecl>(GD.getDecl())->getType()->getAs<FunctionProtoType>())
Variadic = FPT->isVariadic();
- return GetFunctionType(FI, Variadic, false);
+ return GetFunctionType(FI, Variadic);
}
-const llvm::FunctionType *
-CodeGenTypes::GetFunctionType(const CGFunctionInfo &FI, bool isVariadic,
- bool isRecursive) {
- llvm::SmallVector<const llvm::Type*, 8> argTypes;
+llvm::FunctionType *
+CodeGenTypes::GetFunctionType(const CGFunctionInfo &FI, bool isVariadic) {
+
+ bool Inserted = FunctionsBeingProcessed.insert(&FI); (void)Inserted;
+ assert(Inserted && "Recursively being processed?");
+
+ llvm::SmallVector<llvm::Type*, 8> argTypes;
const llvm::Type *resultType = 0;
const ABIArgInfo &retAI = FI.getReturnInfo();
@@ -655,7 +632,7 @@ CodeGenTypes::GetFunctionType(const CGFunctionInfo &FI, bool isVariadic,
resultType = llvm::Type::getVoidTy(getLLVMContext());
QualType ret = FI.getReturnType();
- const llvm::Type *ty = ConvertType(ret, isRecursive);
+ const llvm::Type *ty = ConvertType(ret);
unsigned addressSpace = Context.getTargetAddressSpace(ret);
argTypes.push_back(llvm::PointerType::get(ty, addressSpace));
break;
@@ -676,7 +653,7 @@ CodeGenTypes::GetFunctionType(const CGFunctionInfo &FI, bool isVariadic,
case ABIArgInfo::Indirect: {
// indirect arguments are always on the stack, which is addr space #0.
- const llvm::Type *LTy = ConvertTypeForMem(it->type, isRecursive);
+ const llvm::Type *LTy = ConvertTypeForMem(it->type);
argTypes.push_back(LTy->getPointerTo());
break;
}
@@ -686,7 +663,7 @@ CodeGenTypes::GetFunctionType(const CGFunctionInfo &FI, bool isVariadic,
// If the coerce-to type is a first class aggregate, flatten it. Either
// way is semantically identical, but fast-isel and the optimizer
// generally likes scalar values better than FCAs.
- const llvm::Type *argType = argAI.getCoerceToType();
+ llvm::Type *argType = argAI.getCoerceToType();
if (const llvm::StructType *st = dyn_cast<llvm::StructType>(argType)) {
for (unsigned i = 0, e = st->getNumElements(); i != e; ++i)
argTypes.push_back(st->getElementType(i));
@@ -697,11 +674,14 @@ CodeGenTypes::GetFunctionType(const CGFunctionInfo &FI, bool isVariadic,
}
case ABIArgInfo::Expand:
- GetExpandedTypes(it->type, argTypes, isRecursive);
+ GetExpandedTypes(it->type, argTypes);
break;
}
}
+ bool Erased = FunctionsBeingProcessed.erase(&FI); (void)Erased;
+ assert(Erased && "Not in set?");
+
return llvm::FunctionType::get(resultType, argTypes, isVariadic);
}
@@ -709,16 +689,15 @@ const llvm::Type *CodeGenTypes::GetFunctionTypeForVTable(GlobalDecl GD) {
const CXXMethodDecl *MD = cast<CXXMethodDecl>(GD.getDecl());
const FunctionProtoType *FPT = MD->getType()->getAs<FunctionProtoType>();
- if (!VerifyFuncTypeComplete(FPT)) {
- const CGFunctionInfo *Info;
- if (isa<CXXDestructorDecl>(MD))
- Info = &getFunctionInfo(cast<CXXDestructorDecl>(MD), GD.getDtorType());
- else
- Info = &getFunctionInfo(MD);
- return GetFunctionType(*Info, FPT->isVariadic(), false);
- }
-
- return llvm::OpaqueType::get(getLLVMContext());
+ if (!isFuncTypeConvertible(FPT))
+ return llvm::StructType::get(getLLVMContext());
+
+ const CGFunctionInfo *Info;
+ if (isa<CXXDestructorDecl>(MD))
+ Info = &getFunctionInfo(cast<CXXDestructorDecl>(MD), GD.getDtorType());
+ else
+ Info = &getFunctionInfo(MD);
+ return GetFunctionType(*Info, FPT->isVariadic());
}
void CodeGenModule::ConstructAttributeList(const CGFunctionInfo &FI,
@@ -845,11 +824,11 @@ void CodeGenModule::ConstructAttributeList(const CGFunctionInfo &FI,
continue;
case ABIArgInfo::Expand: {
- llvm::SmallVector<const llvm::Type*, 8> types;
+ llvm::SmallVector<llvm::Type*, 8> types;
// FIXME: This is rather inefficient. Do we ever actually need to do
// anything here? The result should be just reconstructed on the other
// side, so extension should be a non-issue.
- getTypes().GetExpandedTypes(ParamType, types, false);
+ getTypes().GetExpandedTypes(ParamType, types);
Index += types.size();
continue;
}
@@ -1067,6 +1046,95 @@ void CodeGenFunction::EmitFunctionProlog(const CGFunctionInfo &FI,
assert(AI == Fn->arg_end() && "Argument mismatch!");
}
+/// Try to emit a fused autorelease of a return result.
+static llvm::Value *tryEmitFusedAutoreleaseOfResult(CodeGenFunction &CGF,
+ llvm::Value *result) {
+ // We must be immediately followed the cast.
+ llvm::BasicBlock *BB = CGF.Builder.GetInsertBlock();
+ if (BB->empty()) return 0;
+ if (&BB->back() != result) return 0;
+
+ const llvm::Type *resultType = result->getType();
+
+ // result is in a BasicBlock and is therefore an Instruction.
+ llvm::Instruction *generator = cast<llvm::Instruction>(result);
+
+ llvm::SmallVector<llvm::Instruction*,4> insnsToKill;
+
+ // Look for:
+ // %generator = bitcast %type1* %generator2 to %type2*
+ while (llvm::BitCastInst *bitcast = dyn_cast<llvm::BitCastInst>(generator)) {
+ // We would have emitted this as a constant if the operand weren't
+ // an Instruction.
+ generator = cast<llvm::Instruction>(bitcast->getOperand(0));
+
+ // Require the generator to be immediately followed by the cast.
+ if (generator->getNextNode() != bitcast)
+ return 0;
+
+ insnsToKill.push_back(bitcast);
+ }
+
+ // Look for:
+ // %generator = call i8* @objc_retain(i8* %originalResult)
+ // or
+ // %generator = call i8* @objc_retainAutoreleasedReturnValue(i8* %originalResult)
+ llvm::CallInst *call = dyn_cast<llvm::CallInst>(generator);
+ if (!call) return 0;
+
+ bool doRetainAutorelease;
+
+ if (call->getCalledValue() == CGF.CGM.getARCEntrypoints().objc_retain) {
+ doRetainAutorelease = true;
+ } else if (call->getCalledValue() == CGF.CGM.getARCEntrypoints()
+ .objc_retainAutoreleasedReturnValue) {
+ doRetainAutorelease = false;
+
+ // Look for an inline asm immediately preceding the call and kill it, too.
+ llvm::Instruction *prev = call->getPrevNode();
+ if (llvm::CallInst *asmCall = dyn_cast_or_null<llvm::CallInst>(prev))
+ if (asmCall->getCalledValue()
+ == CGF.CGM.getARCEntrypoints().retainAutoreleasedReturnValueMarker)
+ insnsToKill.push_back(prev);
+ } else {
+ return 0;
+ }
+
+ result = call->getArgOperand(0);
+ insnsToKill.push_back(call);
+
+ // Keep killing bitcasts, for sanity. Note that we no longer care
+ // about precise ordering as long as there's exactly one use.
+ while (llvm::BitCastInst *bitcast = dyn_cast<llvm::BitCastInst>(result)) {
+ if (!bitcast->hasOneUse()) break;
+ insnsToKill.push_back(bitcast);
+ result = bitcast->getOperand(0);
+ }
+
+ // Delete all the unnecessary instructions, from latest to earliest.
+ for (llvm::SmallVectorImpl<llvm::Instruction*>::iterator
+ i = insnsToKill.begin(), e = insnsToKill.end(); i != e; ++i)
+ (*i)->eraseFromParent();
+
+ // Do the fused retain/autorelease if we were asked to.
+ if (doRetainAutorelease)
+ result = CGF.EmitARCRetainAutoreleaseReturnValue(result);
+
+ // Cast back to the result type.
+ return CGF.Builder.CreateBitCast(result, resultType);
+}
+
+/// Emit an ARC autorelease of the result of a function.
+static llvm::Value *emitAutoreleaseOfResult(CodeGenFunction &CGF,
+ llvm::Value *result) {
+ // At -O0, try to emit a fused retain/autorelease.
+ if (CGF.shouldUseFusedARCCalls())
+ if (llvm::Value *fused = tryEmitFusedAutoreleaseOfResult(CGF, result))
+ return fused;
+
+ return CGF.EmitARCAutoreleaseReturnValue(result);
+}
+
void CodeGenFunction::EmitFunctionEpilog(const CGFunctionInfo &FI) {
// Functions with no result always return void.
if (ReturnValue == 0) {
@@ -1134,6 +1202,16 @@ void CodeGenFunction::EmitFunctionEpilog(const CGFunctionInfo &FI) {
RV = CreateCoercedLoad(V, RetAI.getCoerceToType(), *this);
}
+
+ // In ARC, end functions that return a retainable type with a call
+ // to objc_autoreleaseReturnValue.
+ if (AutoreleaseResult) {
+ assert(getLangOptions().ObjCAutoRefCount &&
+ !FI.isReturnsRetained() &&
+ RetTy->isObjCRetainableType());
+ RV = emitAutoreleaseOfResult(*this, RV);
+ }
+
break;
case ABIArgInfo::Ignore:
@@ -1183,13 +1261,157 @@ void CodeGenFunction::EmitDelegateCallArg(CallArgList &args,
return args.add(RValue::get(value), type);
}
+static bool isProvablyNull(llvm::Value *addr) {
+ return isa<llvm::ConstantPointerNull>(addr);
+}
+
+static bool isProvablyNonNull(llvm::Value *addr) {
+ return isa<llvm::AllocaInst>(addr);
+}
+
+/// Emit the actual writing-back of a writeback.
+static void emitWriteback(CodeGenFunction &CGF,
+ const CallArgList::Writeback &writeback) {
+ llvm::Value *srcAddr = writeback.Address;
+ assert(!isProvablyNull(srcAddr) &&
+ "shouldn't have writeback for provably null argument");
+
+ llvm::BasicBlock *contBB = 0;
+
+ // If the argument wasn't provably non-null, we need to null check
+ // before doing the store.
+ bool provablyNonNull = isProvablyNonNull(srcAddr);
+ if (!provablyNonNull) {
+ llvm::BasicBlock *writebackBB = CGF.createBasicBlock("icr.writeback");
+ contBB = CGF.createBasicBlock("icr.done");
+
+ llvm::Value *isNull = CGF.Builder.CreateIsNull(srcAddr, "icr.isnull");
+ CGF.Builder.CreateCondBr(isNull, contBB, writebackBB);
+ CGF.EmitBlock(writebackBB);
+ }
+
+ // Load the value to writeback.
+ llvm::Value *value = CGF.Builder.CreateLoad(writeback.Temporary);
+
+ // Cast it back, in case we're writing an id to a Foo* or something.
+ value = CGF.Builder.CreateBitCast(value,
+ cast<llvm::PointerType>(srcAddr->getType())->getElementType(),
+ "icr.writeback-cast");
+
+ // Perform the writeback.
+ QualType srcAddrType = writeback.AddressType;
+ CGF.EmitStoreThroughLValue(RValue::get(value),
+ CGF.MakeAddrLValue(srcAddr, srcAddrType));
+
+ // Jump to the continuation block.
+ if (!provablyNonNull)
+ CGF.EmitBlock(contBB);
+}
+
+static void emitWritebacks(CodeGenFunction &CGF,
+ const CallArgList &args) {
+ for (CallArgList::writeback_iterator
+ i = args.writeback_begin(), e = args.writeback_end(); i != e; ++i)
+ emitWriteback(CGF, *i);
+}
+
+/// Emit an argument that's being passed call-by-writeback. That is,
+/// we are passing the address of
+static void emitWritebackArg(CodeGenFunction &CGF, CallArgList &args,
+ const ObjCIndirectCopyRestoreExpr *CRE) {
+ llvm::Value *srcAddr = CGF.EmitScalarExpr(CRE->getSubExpr());
+
+ // The dest and src types don't necessarily match in LLVM terms
+ // because of the crazy ObjC compatibility rules.
+
+ const llvm::PointerType *destType =
+ cast<llvm::PointerType>(CGF.ConvertType(CRE->getType()));
+
+ // If the address is a constant null, just pass the appropriate null.
+ if (isProvablyNull(srcAddr)) {
+ args.add(RValue::get(llvm::ConstantPointerNull::get(destType)),
+ CRE->getType());
+ return;
+ }
+
+ QualType srcAddrType =
+ CRE->getSubExpr()->getType()->castAs<PointerType>()->getPointeeType();
+
+ // Create the temporary.
+ llvm::Value *temp = CGF.CreateTempAlloca(destType->getElementType(),
+ "icr.temp");
+
+ // Zero-initialize it if we're not doing a copy-initialization.
+ bool shouldCopy = CRE->shouldCopy();
+ if (!shouldCopy) {
+ llvm::Value *null =
+ llvm::ConstantPointerNull::get(
+ cast<llvm::PointerType>(destType->getElementType()));
+ CGF.Builder.CreateStore(null, temp);
+ }
+
+ llvm::BasicBlock *contBB = 0;
+
+ // If the address is *not* known to be non-null, we need to switch.
+ llvm::Value *finalArgument;
+
+ bool provablyNonNull = isProvablyNonNull(srcAddr);
+ if (provablyNonNull) {
+ finalArgument = temp;
+ } else {
+ llvm::Value *isNull = CGF.Builder.CreateIsNull(srcAddr, "icr.isnull");
+
+ finalArgument = CGF.Builder.CreateSelect(isNull,
+ llvm::ConstantPointerNull::get(destType),
+ temp, "icr.argument");
+
+ // If we need to copy, then the load has to be conditional, which
+ // means we need control flow.
+ if (shouldCopy) {
+ contBB = CGF.createBasicBlock("icr.cont");
+ llvm::BasicBlock *copyBB = CGF.createBasicBlock("icr.copy");
+ CGF.Builder.CreateCondBr(isNull, contBB, copyBB);
+ CGF.EmitBlock(copyBB);
+ }
+ }
+
+ // Perform a copy if necessary.
+ if (shouldCopy) {
+ LValue srcLV = CGF.MakeAddrLValue(srcAddr, srcAddrType);
+ RValue srcRV = CGF.EmitLoadOfLValue(srcLV);
+ assert(srcRV.isScalar());
+
+ llvm::Value *src = srcRV.getScalarVal();
+ src = CGF.Builder.CreateBitCast(src, destType->getElementType(),
+ "icr.cast");
+
+ // Use an ordinary store, not a store-to-lvalue.
+ CGF.Builder.CreateStore(src, temp);
+ }
+
+ // Finish the control flow if we needed it.
+ if (shouldCopy && !provablyNonNull)
+ CGF.EmitBlock(contBB);
+
+ args.addWriteback(srcAddr, srcAddrType, temp);
+ args.add(RValue::get(finalArgument), CRE->getType());
+}
+
void CodeGenFunction::EmitCallArg(CallArgList &args, const Expr *E,
QualType type) {
+ if (const ObjCIndirectCopyRestoreExpr *CRE
+ = dyn_cast<ObjCIndirectCopyRestoreExpr>(E)) {
+ assert(getContext().getLangOptions().ObjCAutoRefCount);
+ assert(getContext().hasSameType(E->getType(), type));
+ return emitWritebackArg(*this, args, CRE);
+ }
+
if (type->isReferenceType())
return args.add(EmitReferenceBindingToExpr(E, /*InitializedDecl=*/0),
type);
- if (hasAggregateLLVMType(type) && isa<ImplicitCastExpr>(E) &&
+ if (hasAggregateLLVMType(type) && !E->getType()->isAnyComplexType() &&
+ isa<ImplicitCastExpr>(E) &&
cast<CastExpr>(E)->getCastKind() == CK_LValueToRValue) {
LValue L = EmitLValue(cast<CastExpr>(E)->getSubExpr());
assert(L.isSimple());
@@ -1205,20 +1427,71 @@ void CodeGenFunction::EmitCallArg(CallArgList &args, const Expr *E,
/// on the current state of the EH stack.
llvm::CallSite
CodeGenFunction::EmitCallOrInvoke(llvm::Value *Callee,
- llvm::Value * const *ArgBegin,
- llvm::Value * const *ArgEnd,
+ llvm::ArrayRef<llvm::Value *> Args,
const llvm::Twine &Name) {
llvm::BasicBlock *InvokeDest = getInvokeDest();
if (!InvokeDest)
- return Builder.CreateCall(Callee, ArgBegin, ArgEnd, Name);
+ return Builder.CreateCall(Callee, Args, Name);
llvm::BasicBlock *ContBB = createBasicBlock("invoke.cont");
llvm::InvokeInst *Invoke = Builder.CreateInvoke(Callee, ContBB, InvokeDest,
- ArgBegin, ArgEnd, Name);
+ Args, Name);
EmitBlock(ContBB);
return Invoke;
}
+llvm::CallSite
+CodeGenFunction::EmitCallOrInvoke(llvm::Value *Callee,
+ const llvm::Twine &Name) {
+ return EmitCallOrInvoke(Callee, llvm::ArrayRef<llvm::Value *>(), Name);
+}
+
+static void checkArgMatches(llvm::Value *Elt, unsigned &ArgNo,
+ llvm::FunctionType *FTy) {
+ if (ArgNo < FTy->getNumParams())
+ assert(Elt->getType() == FTy->getParamType(ArgNo));
+ else
+ assert(FTy->isVarArg());
+ ++ArgNo;
+}
+
+void CodeGenFunction::ExpandTypeToArgs(QualType Ty, RValue RV,
+ llvm::SmallVector<llvm::Value*,16> &Args,
+ llvm::FunctionType *IRFuncTy) {
+ const RecordType *RT = Ty->getAsStructureType();
+ assert(RT && "Can only expand structure types.");
+
+ RecordDecl *RD = RT->getDecl();
+ assert(RV.isAggregate() && "Unexpected rvalue during struct expansion");
+ llvm::Value *Addr = RV.getAggregateAddr();
+ for (RecordDecl::field_iterator i = RD->field_begin(), e = RD->field_end();
+ i != e; ++i) {
+ FieldDecl *FD = *i;
+ QualType FT = FD->getType();
+
+ // FIXME: What are the right qualifiers here?
+ LValue LV = EmitLValueForField(Addr, FD, 0);
+ if (CodeGenFunction::hasAggregateLLVMType(FT)) {
+ ExpandTypeToArgs(FT, RValue::getAggregate(LV.getAddress()),
+ Args, IRFuncTy);
+ continue;
+ }
+
+ RValue RV = EmitLoadOfLValue(LV);
+ assert(RV.isScalar() &&
+ "Unexpected non-scalar rvalue during struct expansion.");
+
+ // Insert a bitcast as needed.
+ llvm::Value *V = RV.getScalarVal();
+ if (Args.size() < IRFuncTy->getNumParams() &&
+ V->getType() != IRFuncTy->getParamType(Args.size()))
+ V = Builder.CreateBitCast(V, IRFuncTy->getParamType(Args.size()));
+
+ Args.push_back(V);
+ }
+}
+
+
RValue CodeGenFunction::EmitCall(const CGFunctionInfo &CallInfo,
llvm::Value *Callee,
ReturnValueSlot ReturnValue,
@@ -1233,6 +1506,11 @@ RValue CodeGenFunction::EmitCall(const CGFunctionInfo &CallInfo,
QualType RetTy = CallInfo.getReturnType();
const ABIArgInfo &RetAI = CallInfo.getReturnInfo();
+ // IRArgNo - Keep track of the argument number in the callee we're looking at.
+ unsigned IRArgNo = 0;
+ llvm::FunctionType *IRFuncTy =
+ cast<llvm::FunctionType>(
+ cast<llvm::PointerType>(Callee->getType())->getElementType());
// If the call returns a temporary with struct return, create a temporary
// alloca to hold the result, unless one is given to us.
@@ -1241,6 +1519,7 @@ RValue CodeGenFunction::EmitCall(const CGFunctionInfo &CallInfo,
if (!Value)
Value = CreateMemTemp(RetTy);
Args.push_back(Value);
+ checkArgMatches(Value, IRArgNo, IRFuncTy);
}
assert(CallInfo.arg_size() == CallArgs.size() &&
@@ -1251,24 +1530,54 @@ RValue CodeGenFunction::EmitCall(const CGFunctionInfo &CallInfo,
const ABIArgInfo &ArgInfo = info_it->info;
RValue RV = I->RV;
- unsigned Alignment =
+ unsigned TypeAlign =
getContext().getTypeAlignInChars(I->Ty).getQuantity();
switch (ArgInfo.getKind()) {
case ABIArgInfo::Indirect: {
if (RV.isScalar() || RV.isComplex()) {
// Make a temporary alloca to pass the argument.
- Args.push_back(CreateMemTemp(I->Ty));
+ llvm::AllocaInst *AI = CreateMemTemp(I->Ty);
+ if (ArgInfo.getIndirectAlign() > AI->getAlignment())
+ AI->setAlignment(ArgInfo.getIndirectAlign());
+ Args.push_back(AI);
+
if (RV.isScalar())
EmitStoreOfScalar(RV.getScalarVal(), Args.back(), false,
- Alignment, I->Ty);
+ TypeAlign, I->Ty);
else
StoreComplexToAddr(RV.getComplexVal(), Args.back(), false);
- } else if (I->NeedsCopy && !ArgInfo.getIndirectByVal()) {
- Args.push_back(CreateMemTemp(I->Ty));
- EmitAggregateCopy(Args.back(), RV.getAggregateAddr(), I->Ty,
- RV.isVolatileQualified());
+
+ // Validate argument match.
+ checkArgMatches(AI, IRArgNo, IRFuncTy);
} else {
- Args.push_back(RV.getAggregateAddr());
+ // We want to avoid creating an unnecessary temporary+copy here;
+ // however, we need one in two cases:
+ // 1. If the argument is not byval, and we are required to copy the
+ // source. (This case doesn't occur on any common architecture.)
+ // 2. If the argument is byval, RV is not sufficiently aligned, and
+ // we cannot force it to be sufficiently aligned.
+ llvm::Value *Addr = RV.getAggregateAddr();
+ unsigned Align = ArgInfo.getIndirectAlign();
+ const llvm::TargetData *TD = &CGM.getTargetData();
+ if ((!ArgInfo.getIndirectByVal() && I->NeedsCopy) ||
+ (ArgInfo.getIndirectByVal() && TypeAlign < Align &&
+ llvm::getOrEnforceKnownAlignment(Addr, Align, TD) < Align)) {
+ // Create an aligned temporary, and copy to it.
+ llvm::AllocaInst *AI = CreateMemTemp(I->Ty);
+ if (Align > AI->getAlignment())
+ AI->setAlignment(Align);
+ Args.push_back(AI);
+ EmitAggregateCopy(AI, Addr, I->Ty, RV.isVolatileQualified());
+
+ // Validate argument match.
+ checkArgMatches(AI, IRArgNo, IRFuncTy);
+ } else {
+ // Skip the extra memcpy call.
+ Args.push_back(Addr);
+
+ // Validate argument match.
+ checkArgMatches(Addr, IRArgNo, IRFuncTy);
+ }
}
break;
}
@@ -1281,10 +1590,20 @@ RValue CodeGenFunction::EmitCall(const CGFunctionInfo &CallInfo,
if (!isa<llvm::StructType>(ArgInfo.getCoerceToType()) &&
ArgInfo.getCoerceToType() == ConvertType(info_it->type) &&
ArgInfo.getDirectOffset() == 0) {
+ llvm::Value *V;
if (RV.isScalar())
- Args.push_back(RV.getScalarVal());
+ V = RV.getScalarVal();
else
- Args.push_back(Builder.CreateLoad(RV.getAggregateAddr()));
+ V = Builder.CreateLoad(RV.getAggregateAddr());
+
+ // If the argument doesn't match, perform a bitcast to coerce it. This
+ // can happen due to trivial type mismatches.
+ if (IRArgNo < IRFuncTy->getNumParams() &&
+ V->getType() != IRFuncTy->getParamType(IRArgNo))
+ V = Builder.CreateBitCast(V, IRFuncTy->getParamType(IRArgNo));
+ Args.push_back(V);
+
+ checkArgMatches(V, IRArgNo, IRFuncTy);
break;
}
@@ -1292,7 +1611,7 @@ RValue CodeGenFunction::EmitCall(const CGFunctionInfo &CallInfo,
llvm::Value *SrcPtr;
if (RV.isScalar()) {
SrcPtr = CreateMemTemp(I->Ty, "coerce");
- EmitStoreOfScalar(RV.getScalarVal(), SrcPtr, false, Alignment, I->Ty);
+ EmitStoreOfScalar(RV.getScalarVal(), SrcPtr, false, TypeAlign, I->Ty);
} else if (RV.isComplex()) {
SrcPtr = CreateMemTemp(I->Ty, "coerce");
StoreComplexToAddr(RV.getComplexVal(), SrcPtr, false);
@@ -1321,18 +1640,25 @@ RValue CodeGenFunction::EmitCall(const CGFunctionInfo &CallInfo,
// We don't know what we're loading from.
LI->setAlignment(1);
Args.push_back(LI);
+
+ // Validate argument match.
+ checkArgMatches(LI, IRArgNo, IRFuncTy);
}
} else {
// In the simple case, just pass the coerced loaded value.
Args.push_back(CreateCoercedLoad(SrcPtr, ArgInfo.getCoerceToType(),
*this));
+
+ // Validate argument match.
+ checkArgMatches(Args.back(), IRArgNo, IRFuncTy);
}
break;
}
case ABIArgInfo::Expand:
- ExpandTypeToArgs(I->Ty, RV, Args);
+ ExpandTypeToArgs(I->Ty, RV, Args, IRFuncTy);
+ IRArgNo = Args.size();
break;
}
}
@@ -1367,7 +1693,6 @@ RValue CodeGenFunction::EmitCall(const CGFunctionInfo &CallInfo,
}
}
-
unsigned CallingConv;
CodeGen::AttributeListType AttributeList;
CGM.ConstructAttributeList(CallInfo, TargetDecl, AttributeList, CallingConv);
@@ -1380,11 +1705,10 @@ RValue CodeGenFunction::EmitCall(const CGFunctionInfo &CallInfo,
llvm::CallSite CS;
if (!InvokeDest) {
- CS = Builder.CreateCall(Callee, Args.data(), Args.data()+Args.size());
+ CS = Builder.CreateCall(Callee, Args);
} else {
llvm::BasicBlock *Cont = createBasicBlock("invoke.cont");
- CS = Builder.CreateInvoke(Callee, Cont, InvokeDest,
- Args.data(), Args.data()+Args.size());
+ CS = Builder.CreateInvoke(Callee, Cont, InvokeDest, Args);
EmitBlock(Cont);
}
if (callOrInvoke)
@@ -1413,6 +1737,11 @@ RValue CodeGenFunction::EmitCall(const CGFunctionInfo &CallInfo,
if (Builder.isNamePreserving() && !CI->getType()->isVoidTy())
CI->setName("call");
+ // Emit any writebacks immediately. Arguably this should happen
+ // after any return-value munging.
+ if (CallArgs.hasWritebacks())
+ emitWritebacks(*this, CallArgs);
+
switch (RetAI.getKind()) {
case ABIArgInfo::Indirect: {
unsigned Alignment = getContext().getTypeAlignInChars(RetTy).getQuantity();
@@ -1430,8 +1759,8 @@ RValue CodeGenFunction::EmitCall(const CGFunctionInfo &CallInfo,
case ABIArgInfo::Extend:
case ABIArgInfo::Direct: {
- if (RetAI.getCoerceToType() == ConvertType(RetTy) &&
- RetAI.getDirectOffset() == 0) {
+ llvm::Type *RetIRTy = ConvertType(RetTy);
+ if (RetAI.getCoerceToType() == RetIRTy && RetAI.getDirectOffset() == 0) {
if (RetTy->isAnyComplexType()) {
llvm::Value *Real = Builder.CreateExtractValue(CI, 0);
llvm::Value *Imag = Builder.CreateExtractValue(CI, 1);
@@ -1448,7 +1777,13 @@ RValue CodeGenFunction::EmitCall(const CGFunctionInfo &CallInfo,
BuildAggStore(*this, CI, DestPtr, DestIsVolatile, false);
return RValue::getAggregate(DestPtr);
}
- return RValue::get(CI);
+
+ // If the argument doesn't match, perform a bitcast to coerce it. This
+ // can happen due to trivial type mismatches.
+ llvm::Value *V = CI;
+ if (V->getType() != RetIRTy)
+ V = Builder.CreateBitCast(V, RetIRTy);
+ return RValue::get(V);
}
llvm::Value *DestPtr = ReturnValue.getValue();
diff --git a/contrib/llvm/tools/clang/lib/CodeGen/CGCall.h b/contrib/llvm/tools/clang/lib/CodeGen/CGCall.h
index 160a62e..343b944 100644
--- a/contrib/llvm/tools/clang/lib/CodeGen/CGCall.h
+++ b/contrib/llvm/tools/clang/lib/CodeGen/CGCall.h
@@ -58,9 +58,44 @@ namespace CodeGen {
class CallArgList :
public llvm::SmallVector<CallArg, 16> {
public:
+ struct Writeback {
+ /// The original argument.
+ llvm::Value *Address;
+
+ /// The pointee type of the original argument.
+ QualType AddressType;
+
+ /// The temporary alloca.
+ llvm::Value *Temporary;
+ };
+
void add(RValue rvalue, QualType type, bool needscopy = false) {
push_back(CallArg(rvalue, type, needscopy));
}
+
+ void addFrom(const CallArgList &other) {
+ insert(end(), other.begin(), other.end());
+ Writebacks.insert(Writebacks.end(),
+ other.Writebacks.begin(), other.Writebacks.end());
+ }
+
+ void addWriteback(llvm::Value *address, QualType addressType,
+ llvm::Value *temporary) {
+ Writeback writeback;
+ writeback.Address = address;
+ writeback.AddressType = addressType;
+ writeback.Temporary = temporary;
+ Writebacks.push_back(writeback);
+ }
+
+ bool hasWritebacks() const { return !Writebacks.empty(); }
+
+ typedef llvm::SmallVectorImpl<Writeback>::const_iterator writeback_iterator;
+ writeback_iterator writeback_begin() const { return Writebacks.begin(); }
+ writeback_iterator writeback_end() const { return Writebacks.end(); }
+
+ private:
+ llvm::SmallVector<Writeback, 1> Writebacks;
};
/// FunctionArgList - Type for representing both the decl and type
@@ -88,6 +123,9 @@ namespace CodeGen {
/// Whether this function is noreturn.
bool NoReturn;
+ /// Whether this function is returns-retained.
+ bool ReturnsRetained;
+
unsigned NumArgs;
ArgInfo *Args;
@@ -100,7 +138,8 @@ namespace CodeGen {
typedef ArgInfo *arg_iterator;
CGFunctionInfo(unsigned CallingConvention, bool NoReturn,
- bool HasRegParm, unsigned RegParm, CanQualType ResTy,
+ bool ReturnsRetained, bool HasRegParm, unsigned RegParm,
+ CanQualType ResTy,
const CanQualType *ArgTys, unsigned NumArgTys);
~CGFunctionInfo() { delete[] Args; }
@@ -113,6 +152,10 @@ namespace CodeGen {
bool isNoReturn() const { return NoReturn; }
+ /// In ARR, whether this function retains its return value. This
+ /// is not always reliable for call sites.
+ bool isReturnsRetained() const { return ReturnsRetained; }
+
/// getCallingConvention - Return the user specified calling
/// convention.
unsigned getCallingConvention() const { return CallingConvention; }
@@ -137,6 +180,7 @@ namespace CodeGen {
void Profile(llvm::FoldingSetNodeID &ID) {
ID.AddInteger(getCallingConvention());
ID.AddBoolean(NoReturn);
+ ID.AddBoolean(ReturnsRetained);
ID.AddBoolean(HasRegParm);
ID.AddInteger(RegParm);
getReturnType().Profile(ID);
@@ -151,6 +195,7 @@ namespace CodeGen {
Iterator end) {
ID.AddInteger(Info.getCC());
ID.AddBoolean(Info.getNoReturn());
+ ID.AddBoolean(Info.getProducesResult());
ID.AddBoolean(Info.getHasRegParm());
ID.AddInteger(Info.getRegParm());
ResTy.Profile(ID);
diff --git a/contrib/llvm/tools/clang/lib/CodeGen/CGClass.cpp b/contrib/llvm/tools/clang/lib/CodeGen/CGClass.cpp
index 5725d80..7dbaaf8 100644
--- a/contrib/llvm/tools/clang/lib/CodeGen/CGClass.cpp
+++ b/contrib/llvm/tools/clang/lib/CodeGen/CGClass.cpp
@@ -329,7 +329,7 @@ namespace {
CallBaseDtor(const CXXRecordDecl *Base, bool BaseIsVirtual)
: BaseClass(Base), BaseIsVirtual(BaseIsVirtual) {}
- void Emit(CodeGenFunction &CGF, bool IsForEH) {
+ void Emit(CodeGenFunction &CGF, Flags flags) {
const CXXRecordDecl *DerivedClass =
cast<CXXMethodDecl>(CGF.CurCodeDecl)->getParent();
@@ -398,7 +398,8 @@ static void EmitBaseInitializer(CodeGenFunction &CGF,
BaseClassDecl,
isBaseVirtual);
- AggValueSlot AggSlot = AggValueSlot::forAddr(V, false, /*Lifetime*/ true);
+ AggValueSlot AggSlot = AggValueSlot::forAddr(V, Qualifiers(),
+ /*Lifetime*/ true);
CGF.EmitAggExpr(BaseInit->getInit(), AggSlot);
@@ -428,10 +429,18 @@ static void EmitAggMemberInitializer(CodeGenFunction &CGF,
CGF.Builder.CreateStore(Next, ArrayIndexVar);
}
- AggValueSlot Slot = AggValueSlot::forAddr(Dest, LHS.isVolatileQualified(),
- /*Lifetime*/ true);
-
- CGF.EmitAggExpr(MemberInit->getInit(), Slot);
+ if (!CGF.hasAggregateLLVMType(T)) {
+ LValue lvalue = CGF.MakeAddrLValue(Dest, T);
+ CGF.EmitScalarInit(MemberInit->getInit(), /*decl*/ 0, lvalue, false);
+ } else if (T->isAnyComplexType()) {
+ CGF.EmitComplexExprIntoAddr(MemberInit->getInit(), Dest,
+ LHS.isVolatileQualified());
+ } else {
+ AggValueSlot Slot = AggValueSlot::forAddr(Dest, LHS.getQuals(),
+ /*Lifetime*/ true);
+
+ CGF.EmitAggExpr(MemberInit->getInit(), Slot);
+ }
return;
}
@@ -502,7 +511,7 @@ namespace {
CallMemberDtor(FieldDecl *Field, CXXDestructorDecl *Dtor)
: Field(Field), Dtor(Dtor) {}
- void Emit(CodeGenFunction &CGF, bool IsForEH) {
+ void Emit(CodeGenFunction &CGF, Flags flags) {
// FIXME: Is this OK for C++0x delegating constructors?
llvm::Value *ThisPtr = CGF.LoadCXXThis();
LValue LHS = CGF.EmitLValueForField(ThisPtr, Field, 0);
@@ -540,15 +549,15 @@ static void EmitMemberInitializer(CodeGenFunction &CGF,
// FIXME: If there's no initializer and the CXXCtorInitializer
// was implicitly generated, we shouldn't be zeroing memory.
- RValue RHS;
- if (FieldType->isReferenceType()) {
- RHS = CGF.EmitReferenceBindingToExpr(MemberInit->getInit(), Field);
- CGF.EmitStoreThroughLValue(RHS, LHS, FieldType);
- } else if (FieldType->isArrayType() && !MemberInit->getInit()) {
+ if (FieldType->isArrayType() && !MemberInit->getInit()) {
CGF.EmitNullInitialization(LHS.getAddress(), Field->getType());
} else if (!CGF.hasAggregateLLVMType(Field->getType())) {
- RHS = RValue::get(CGF.EmitScalarExpr(MemberInit->getInit()));
- CGF.EmitStoreThroughLValue(RHS, LHS, FieldType);
+ if (LHS.isSimple()) {
+ CGF.EmitExprAsInit(MemberInit->getInit(), Field, LHS, false);
+ } else {
+ RValue RHS = RValue::get(CGF.EmitScalarExpr(MemberInit->getInit()));
+ CGF.EmitStoreThroughLValue(RHS, LHS);
+ }
} else if (MemberInit->getInit()->getType()->isAnyComplexType()) {
CGF.EmitComplexExprIntoAddr(MemberInit->getInit(), LHS.getAddress(),
LHS.isVolatileQualified());
@@ -576,11 +585,11 @@ static void EmitMemberInitializer(CodeGenFunction &CGF,
llvm::Value *Zero = llvm::Constant::getNullValue(SizeTy);
CGF.Builder.CreateStore(Zero, ArrayIndexVar);
- // If we are copying an array of scalars or classes with trivial copy
+ // If we are copying an array of PODs or classes with trivial copy
// constructors, perform a single aggregate copy.
- const RecordType *Record = BaseElementTy->getAs<RecordType>();
- if (!Record ||
- cast<CXXRecordDecl>(Record->getDecl())->hasTrivialCopyConstructor()) {
+ const CXXRecordDecl *Record = BaseElementTy->getAsCXXRecordDecl();
+ if (BaseElementTy.isPODType(CGF.getContext()) ||
+ (Record && Record->hasTrivialCopyConstructor())) {
// Find the source pointer. We knows it's the last argument because
// we know we're in a copy constructor.
unsigned SrcArgIndex = Args.size() - 1;
@@ -912,7 +921,7 @@ namespace {
struct CallDtorDelete : EHScopeStack::Cleanup {
CallDtorDelete() {}
- void Emit(CodeGenFunction &CGF, bool IsForEH) {
+ void Emit(CodeGenFunction &CGF, Flags flags) {
const CXXDestructorDecl *Dtor = cast<CXXDestructorDecl>(CGF.CurCodeDecl);
const CXXRecordDecl *ClassDecl = Dtor->getParent();
CGF.EmitDeleteCall(Dtor->getOperatorDelete(), CGF.LoadCXXThis(),
@@ -920,48 +929,25 @@ namespace {
}
};
- struct CallArrayFieldDtor : EHScopeStack::Cleanup {
- const FieldDecl *Field;
- CallArrayFieldDtor(const FieldDecl *Field) : Field(Field) {}
-
- void Emit(CodeGenFunction &CGF, bool IsForEH) {
- QualType FieldType = Field->getType();
- const ConstantArrayType *Array =
- CGF.getContext().getAsConstantArrayType(FieldType);
+ class DestroyField : public EHScopeStack::Cleanup {
+ const FieldDecl *field;
+ CodeGenFunction::Destroyer &destroyer;
+ bool useEHCleanupForArray;
+
+ public:
+ DestroyField(const FieldDecl *field, CodeGenFunction::Destroyer *destroyer,
+ bool useEHCleanupForArray)
+ : field(field), destroyer(*destroyer),
+ useEHCleanupForArray(useEHCleanupForArray) {}
+
+ void Emit(CodeGenFunction &CGF, Flags flags) {
+ // Find the address of the field.
+ llvm::Value *thisValue = CGF.LoadCXXThis();
+ LValue LV = CGF.EmitLValueForField(thisValue, field, /*CVRQualifiers=*/0);
+ assert(LV.isSimple());
- QualType BaseType =
- CGF.getContext().getBaseElementType(Array->getElementType());
- const CXXRecordDecl *FieldClassDecl = BaseType->getAsCXXRecordDecl();
-
- llvm::Value *ThisPtr = CGF.LoadCXXThis();
- LValue LHS = CGF.EmitLValueForField(ThisPtr, Field,
- // FIXME: Qualifiers?
- /*CVRQualifiers=*/0);
-
- const llvm::Type *BasePtr = CGF.ConvertType(BaseType)->getPointerTo();
- llvm::Value *BaseAddrPtr =
- CGF.Builder.CreateBitCast(LHS.getAddress(), BasePtr);
- CGF.EmitCXXAggrDestructorCall(FieldClassDecl->getDestructor(),
- Array, BaseAddrPtr);
- }
- };
-
- struct CallFieldDtor : EHScopeStack::Cleanup {
- const FieldDecl *Field;
- CallFieldDtor(const FieldDecl *Field) : Field(Field) {}
-
- void Emit(CodeGenFunction &CGF, bool IsForEH) {
- const CXXRecordDecl *FieldClassDecl =
- Field->getType()->getAsCXXRecordDecl();
-
- llvm::Value *ThisPtr = CGF.LoadCXXThis();
- LValue LHS = CGF.EmitLValueForField(ThisPtr, Field,
- // FIXME: Qualifiers?
- /*CVRQualifiers=*/0);
-
- CGF.EmitCXXDestructorCall(FieldClassDecl->getDestructor(),
- Dtor_Complete, /*ForVirtualBase=*/false,
- LHS.getAddress());
+ CGF.emitDestroy(LV.getAddress(), field->getType(), destroyer,
+ flags.isForNormalCleanup() && useEHCleanupForArray);
}
};
}
@@ -1035,96 +1021,103 @@ void CodeGenFunction::EnterDtorCleanups(const CXXDestructorDecl *DD,
llvm::SmallVector<const FieldDecl *, 16> FieldDecls;
for (CXXRecordDecl::field_iterator I = ClassDecl->field_begin(),
E = ClassDecl->field_end(); I != E; ++I) {
- const FieldDecl *Field = *I;
-
- QualType FieldType = getContext().getCanonicalType(Field->getType());
- const ConstantArrayType *Array =
- getContext().getAsConstantArrayType(FieldType);
- if (Array)
- FieldType = getContext().getBaseElementType(Array->getElementType());
-
- const RecordType *RT = FieldType->getAs<RecordType>();
- if (!RT)
- continue;
-
- CXXRecordDecl *FieldClassDecl = cast<CXXRecordDecl>(RT->getDecl());
- if (FieldClassDecl->hasTrivialDestructor())
- continue;
-
- if (Array)
- EHStack.pushCleanup<CallArrayFieldDtor>(NormalAndEHCleanup, Field);
- else
- EHStack.pushCleanup<CallFieldDtor>(NormalAndEHCleanup, Field);
+ const FieldDecl *field = *I;
+ QualType type = field->getType();
+ QualType::DestructionKind dtorKind = type.isDestructedType();
+ if (!dtorKind) continue;
+
+ CleanupKind cleanupKind = getCleanupKind(dtorKind);
+ EHStack.pushCleanup<DestroyField>(cleanupKind, field,
+ getDestroyer(dtorKind),
+ cleanupKind & EHCleanup);
}
}
-/// EmitCXXAggrConstructorCall - This routine essentially creates a (nested)
-/// for-loop to call the default constructor on individual members of the
-/// array.
-/// 'D' is the default constructor for elements of the array, 'ArrayTy' is the
-/// array type and 'ArrayPtr' points to the beginning fo the array.
-/// It is assumed that all relevant checks have been made by the caller.
+/// EmitCXXAggrConstructorCall - Emit a loop to call a particular
+/// constructor for each of several members of an array.
///
-/// \param ZeroInitialization True if each element should be zero-initialized
-/// before it is constructed.
+/// \param ctor the constructor to call for each element
+/// \param argBegin,argEnd the arguments to evaluate and pass to the
+/// constructor
+/// \param arrayType the type of the array to initialize
+/// \param arrayBegin an arrayType*
+/// \param zeroInitialize true if each element should be
+/// zero-initialized before it is constructed
void
-CodeGenFunction::EmitCXXAggrConstructorCall(const CXXConstructorDecl *D,
- const ConstantArrayType *ArrayTy,
- llvm::Value *ArrayPtr,
- CallExpr::const_arg_iterator ArgBeg,
- CallExpr::const_arg_iterator ArgEnd,
- bool ZeroInitialization) {
-
- const llvm::Type *SizeTy = ConvertType(getContext().getSizeType());
- llvm::Value * NumElements =
- llvm::ConstantInt::get(SizeTy,
- getContext().getConstantArrayElementCount(ArrayTy));
-
- EmitCXXAggrConstructorCall(D, NumElements, ArrayPtr, ArgBeg, ArgEnd,
- ZeroInitialization);
+CodeGenFunction::EmitCXXAggrConstructorCall(const CXXConstructorDecl *ctor,
+ const ConstantArrayType *arrayType,
+ llvm::Value *arrayBegin,
+ CallExpr::const_arg_iterator argBegin,
+ CallExpr::const_arg_iterator argEnd,
+ bool zeroInitialize) {
+ QualType elementType;
+ llvm::Value *numElements =
+ emitArrayLength(arrayType, elementType, arrayBegin);
+
+ EmitCXXAggrConstructorCall(ctor, numElements, arrayBegin,
+ argBegin, argEnd, zeroInitialize);
}
+/// EmitCXXAggrConstructorCall - Emit a loop to call a particular
+/// constructor for each of several members of an array.
+///
+/// \param ctor the constructor to call for each element
+/// \param numElements the number of elements in the array;
+/// may be zero
+/// \param argBegin,argEnd the arguments to evaluate and pass to the
+/// constructor
+/// \param arrayBegin a T*, where T is the type constructed by ctor
+/// \param zeroInitialize true if each element should be
+/// zero-initialized before it is constructed
void
-CodeGenFunction::EmitCXXAggrConstructorCall(const CXXConstructorDecl *D,
- llvm::Value *NumElements,
- llvm::Value *ArrayPtr,
- CallExpr::const_arg_iterator ArgBeg,
- CallExpr::const_arg_iterator ArgEnd,
- bool ZeroInitialization) {
- const llvm::Type *SizeTy = ConvertType(getContext().getSizeType());
-
- // Create a temporary for the loop index and initialize it with 0.
- llvm::Value *IndexPtr = CreateTempAlloca(SizeTy, "loop.index");
- llvm::Value *Zero = llvm::Constant::getNullValue(SizeTy);
- Builder.CreateStore(Zero, IndexPtr);
-
- // Start the loop with a block that tests the condition.
- llvm::BasicBlock *CondBlock = createBasicBlock("for.cond");
- llvm::BasicBlock *AfterFor = createBasicBlock("for.end");
-
- EmitBlock(CondBlock);
-
- llvm::BasicBlock *ForBody = createBasicBlock("for.body");
-
- // Generate: if (loop-index < number-of-elements fall to the loop body,
- // otherwise, go to the block after the for-loop.
- llvm::Value *Counter = Builder.CreateLoad(IndexPtr);
- llvm::Value *IsLess = Builder.CreateICmpULT(Counter, NumElements, "isless");
- // If the condition is true, execute the body.
- Builder.CreateCondBr(IsLess, ForBody, AfterFor);
-
- EmitBlock(ForBody);
+CodeGenFunction::EmitCXXAggrConstructorCall(const CXXConstructorDecl *ctor,
+ llvm::Value *numElements,
+ llvm::Value *arrayBegin,
+ CallExpr::const_arg_iterator argBegin,
+ CallExpr::const_arg_iterator argEnd,
+ bool zeroInitialize) {
+
+ // It's legal for numElements to be zero. This can happen both
+ // dynamically, because x can be zero in 'new A[x]', and statically,
+ // because of GCC extensions that permit zero-length arrays. There
+ // are probably legitimate places where we could assume that this
+ // doesn't happen, but it's not clear that it's worth it.
+ llvm::BranchInst *zeroCheckBranch = 0;
+
+ // Optimize for a constant count.
+ llvm::ConstantInt *constantCount
+ = dyn_cast<llvm::ConstantInt>(numElements);
+ if (constantCount) {
+ // Just skip out if the constant count is zero.
+ if (constantCount->isZero()) return;
+
+ // Otherwise, emit the check.
+ } else {
+ llvm::BasicBlock *loopBB = createBasicBlock("new.ctorloop");
+ llvm::Value *iszero = Builder.CreateIsNull(numElements, "isempty");
+ zeroCheckBranch = Builder.CreateCondBr(iszero, loopBB, loopBB);
+ EmitBlock(loopBB);
+ }
+
+ // Find the end of the array.
+ llvm::Value *arrayEnd = Builder.CreateInBoundsGEP(arrayBegin, numElements,
+ "arrayctor.end");
+
+ // Enter the loop, setting up a phi for the current location to initialize.
+ llvm::BasicBlock *entryBB = Builder.GetInsertBlock();
+ llvm::BasicBlock *loopBB = createBasicBlock("arrayctor.loop");
+ EmitBlock(loopBB);
+ llvm::PHINode *cur = Builder.CreatePHI(arrayBegin->getType(), 2,
+ "arrayctor.cur");
+ cur->addIncoming(arrayBegin, entryBB);
- llvm::BasicBlock *ContinueBlock = createBasicBlock("for.inc");
// Inside the loop body, emit the constructor call on the array element.
- Counter = Builder.CreateLoad(IndexPtr);
- llvm::Value *Address = Builder.CreateInBoundsGEP(ArrayPtr, Counter,
- "arrayidx");
+
+ QualType type = getContext().getTypeDeclType(ctor->getParent());
// Zero initialize the storage, if requested.
- if (ZeroInitialization)
- EmitNullInitialization(Address,
- getContext().getTypeDeclType(D->getParent()));
+ if (zeroInitialize)
+ EmitNullInitialization(cur, type);
// C++ [class.temporary]p4:
// There are two contexts in which temporaries are destroyed at a different
@@ -1134,99 +1127,47 @@ CodeGenFunction::EmitCXXAggrConstructorCall(const CXXConstructorDecl *D,
// every temporary created in a default argument expression is sequenced
// before the construction of the next array element, if any.
- // Keep track of the current number of live temporaries.
{
RunCleanupsScope Scope(*this);
- EmitCXXConstructorCall(D, Ctor_Complete, /*ForVirtualBase=*/false, Address,
- ArgBeg, ArgEnd);
+ // Evaluate the constructor and its arguments in a regular
+ // partial-destroy cleanup.
+ if (getLangOptions().Exceptions &&
+ !ctor->getParent()->hasTrivialDestructor()) {
+ Destroyer *destroyer = destroyCXXObject;
+ pushRegularPartialArrayCleanup(arrayBegin, cur, type, *destroyer);
+ }
+
+ EmitCXXConstructorCall(ctor, Ctor_Complete, /*ForVirtualBase=*/ false,
+ cur, argBegin, argEnd);
}
- EmitBlock(ContinueBlock);
+ // Go to the next element.
+ llvm::Value *next =
+ Builder.CreateInBoundsGEP(cur, llvm::ConstantInt::get(SizeTy, 1),
+ "arrayctor.next");
+ cur->addIncoming(next, Builder.GetInsertBlock());
- // Emit the increment of the loop counter.
- llvm::Value *NextVal = llvm::ConstantInt::get(SizeTy, 1);
- Counter = Builder.CreateLoad(IndexPtr);
- NextVal = Builder.CreateAdd(Counter, NextVal, "inc");
- Builder.CreateStore(NextVal, IndexPtr);
+ // Check whether that's the end of the loop.
+ llvm::Value *done = Builder.CreateICmpEQ(next, arrayEnd, "arrayctor.done");
+ llvm::BasicBlock *contBB = createBasicBlock("arrayctor.cont");
+ Builder.CreateCondBr(done, contBB, loopBB);
- // Finally, branch back up to the condition for the next iteration.
- EmitBranch(CondBlock);
+ // Patch the earlier check to skip over the loop.
+ if (zeroCheckBranch) zeroCheckBranch->setSuccessor(0, contBB);
- // Emit the fall-through block.
- EmitBlock(AfterFor, true);
-}
-
-/// EmitCXXAggrDestructorCall - calls the default destructor on array
-/// elements in reverse order of construction.
-void
-CodeGenFunction::EmitCXXAggrDestructorCall(const CXXDestructorDecl *D,
- const ArrayType *Array,
- llvm::Value *This) {
- const ConstantArrayType *CA = dyn_cast<ConstantArrayType>(Array);
- assert(CA && "Do we support VLA for destruction ?");
- uint64_t ElementCount = getContext().getConstantArrayElementCount(CA);
-
- const llvm::Type *SizeLTy = ConvertType(getContext().getSizeType());
- llvm::Value* ElementCountPtr = llvm::ConstantInt::get(SizeLTy, ElementCount);
- EmitCXXAggrDestructorCall(D, ElementCountPtr, This);
+ EmitBlock(contBB);
}
-/// EmitCXXAggrDestructorCall - calls the default destructor on array
-/// elements in reverse order of construction.
-void
-CodeGenFunction::EmitCXXAggrDestructorCall(const CXXDestructorDecl *D,
- llvm::Value *UpperCount,
- llvm::Value *This) {
- const llvm::Type *SizeLTy = ConvertType(getContext().getSizeType());
- llvm::Value *One = llvm::ConstantInt::get(SizeLTy, 1);
-
- // Create a temporary for the loop index and initialize it with count of
- // array elements.
- llvm::Value *IndexPtr = CreateTempAlloca(SizeLTy, "loop.index");
-
- // Store the number of elements in the index pointer.
- Builder.CreateStore(UpperCount, IndexPtr);
-
- // Start the loop with a block that tests the condition.
- llvm::BasicBlock *CondBlock = createBasicBlock("for.cond");
- llvm::BasicBlock *AfterFor = createBasicBlock("for.end");
-
- EmitBlock(CondBlock);
-
- llvm::BasicBlock *ForBody = createBasicBlock("for.body");
-
- // Generate: if (loop-index != 0 fall to the loop body,
- // otherwise, go to the block after the for-loop.
- llvm::Value* zeroConstant =
- llvm::Constant::getNullValue(SizeLTy);
- llvm::Value *Counter = Builder.CreateLoad(IndexPtr);
- llvm::Value *IsNE = Builder.CreateICmpNE(Counter, zeroConstant,
- "isne");
- // If the condition is true, execute the body.
- Builder.CreateCondBr(IsNE, ForBody, AfterFor);
-
- EmitBlock(ForBody);
-
- llvm::BasicBlock *ContinueBlock = createBasicBlock("for.inc");
- // Inside the loop body, emit the constructor call on the array element.
- Counter = Builder.CreateLoad(IndexPtr);
- Counter = Builder.CreateSub(Counter, One);
- llvm::Value *Address = Builder.CreateInBoundsGEP(This, Counter, "arrayidx");
- EmitCXXDestructorCall(D, Dtor_Complete, /*ForVirtualBase=*/false, Address);
-
- EmitBlock(ContinueBlock);
-
- // Emit the decrement of the loop counter.
- Counter = Builder.CreateLoad(IndexPtr);
- Counter = Builder.CreateSub(Counter, One, "dec");
- Builder.CreateStore(Counter, IndexPtr);
-
- // Finally, branch back up to the condition for the next iteration.
- EmitBranch(CondBlock);
-
- // Emit the fall-through block.
- EmitBlock(AfterFor, true);
+void CodeGenFunction::destroyCXXObject(CodeGenFunction &CGF,
+ llvm::Value *addr,
+ QualType type) {
+ const RecordType *rtype = type->castAs<RecordType>();
+ const CXXRecordDecl *record = cast<CXXRecordDecl>(rtype->getDecl());
+ const CXXDestructorDecl *dtor = record->getDestructor();
+ assert(!dtor->isTrivial());
+ CGF.EmitCXXDestructorCall(dtor, Dtor_Complete, /*for vbase*/ false,
+ addr);
}
void
@@ -1370,7 +1311,7 @@ namespace {
CXXDtorType Type)
: Dtor(D), Addr(Addr), Type(Type) {}
- void Emit(CodeGenFunction &CGF, bool IsForEH) {
+ void Emit(CodeGenFunction &CGF, Flags flags) {
CGF.EmitCXXDestructorCall(Dtor, Type, /*ForVirtualBase=*/false,
Addr);
}
@@ -1384,7 +1325,8 @@ CodeGenFunction::EmitDelegatingCXXConstructorCall(const CXXConstructorDecl *Ctor
llvm::Value *ThisPtr = LoadCXXThis();
- AggValueSlot AggSlot = AggValueSlot::forAddr(ThisPtr, false, /*Lifetime*/ true);
+ AggValueSlot AggSlot =
+ AggValueSlot::forAddr(ThisPtr, Qualifiers(), /*Lifetime*/ true);
EmitAggExpr(Ctor->init_begin()[0]->getInit(), AggSlot);
@@ -1424,7 +1366,7 @@ namespace {
CallLocalDtor(const CXXDestructorDecl *D, llvm::Value *Addr)
: Dtor(D), Addr(Addr) {}
- void Emit(CodeGenFunction &CGF, bool IsForEH) {
+ void Emit(CodeGenFunction &CGF, Flags flags) {
CGF.EmitCXXDestructorCall(Dtor, Dtor_Complete,
/*ForVirtualBase=*/false, Addr);
}
diff --git a/contrib/llvm/tools/clang/lib/CodeGen/CGCleanup.cpp b/contrib/llvm/tools/clang/lib/CodeGen/CGCleanup.cpp
index 41ecd81..9c5dd1f 100644
--- a/contrib/llvm/tools/clang/lib/CodeGen/CGCleanup.cpp
+++ b/contrib/llvm/tools/clang/lib/CodeGen/CGCleanup.cpp
@@ -49,8 +49,7 @@ DominatingValue<RValue>::saved_type::save(CodeGenFunction &CGF, RValue rv) {
if (rv.isComplex()) {
CodeGenFunction::ComplexPairTy V = rv.getComplexVal();
const llvm::Type *ComplexTy =
- llvm::StructType::get(CGF.getLLVMContext(),
- V.first->getType(), V.second->getType(),
+ llvm::StructType::get(V.first->getType(), V.second->getType(),
(void*) 0);
llvm::Value *addr = CGF.CreateTempAlloca(ComplexTy, "saved-complex");
CGF.StoreComplexToAddr(V, addr, /*volatile*/ false);
@@ -257,9 +256,7 @@ void CodeGenFunction::initFullExprCleanup() {
if (cleanup.isEHCleanup()) cleanup.setTestFlagInEHCleanup();
}
-EHScopeStack::Cleanup::~Cleanup() {
- llvm_unreachable("Cleanup is indestructable");
-}
+void EHScopeStack::Cleanup::anchor() {}
/// All the branch fixups on the EH stack have propagated out past the
/// outermost normal cleanup; resolve them all by adding cases to the
@@ -421,13 +418,13 @@ static llvm::BasicBlock *SimplifyCleanupEntry(CodeGenFunction &CGF,
// Kill the branch.
Br->eraseFromParent();
- // Merge the blocks.
- Pred->getInstList().splice(Pred->end(), Entry->getInstList());
-
// Replace all uses of the entry with the predecessor, in case there
// are phis in the cleanup.
Entry->replaceAllUsesWith(Pred);
+ // Merge the blocks.
+ Pred->getInstList().splice(Pred->end(), Entry->getInstList());
+
// Kill the entry block.
Entry->eraseFromParent();
@@ -439,10 +436,10 @@ static llvm::BasicBlock *SimplifyCleanupEntry(CodeGenFunction &CGF,
static void EmitCleanup(CodeGenFunction &CGF,
EHScopeStack::Cleanup *Fn,
- bool ForEH,
+ EHScopeStack::Cleanup::Flags flags,
llvm::Value *ActiveFlag) {
// EH cleanups always occur within a terminate scope.
- if (ForEH) CGF.EHStack.pushTerminate();
+ if (flags.isForEHCleanup()) CGF.EHStack.pushTerminate();
// If there's an active flag, load it and skip the cleanup if it's
// false.
@@ -457,7 +454,7 @@ static void EmitCleanup(CodeGenFunction &CGF,
}
// Ask the cleanup to emit itself.
- Fn->Emit(CGF, ForEH);
+ Fn->Emit(CGF, flags);
assert(CGF.HaveInsertPoint() && "cleanup ended with no insertion point?");
// Emit the continuation block if there was an active flag.
@@ -465,7 +462,7 @@ static void EmitCleanup(CodeGenFunction &CGF,
CGF.EmitBlock(ContBB);
// Leave the terminate scope.
- if (ForEH) CGF.EHStack.popTerminate();
+ if (flags.isForEHCleanup()) CGF.EHStack.popTerminate();
}
static void ForwardPrebranchedFallthrough(llvm::BasicBlock *Exit,
@@ -540,6 +537,12 @@ void CodeGenFunction::PopCleanupBlock(bool FallthroughIsBranchThrough) {
RequiresNormalCleanup = true;
}
+ EHScopeStack::Cleanup::Flags cleanupFlags;
+ if (Scope.isNormalCleanup())
+ cleanupFlags.setIsNormalCleanupKind();
+ if (Scope.isEHCleanup())
+ cleanupFlags.setIsEHCleanupKind();
+
// Even if we don't need the normal cleanup, we might still have
// prebranched fallthrough to worry about.
if (Scope.isNormalCleanup() && !RequiresNormalCleanup &&
@@ -663,7 +666,7 @@ void CodeGenFunction::PopCleanupBlock(bool FallthroughIsBranchThrough) {
EHStack.popCleanup();
- EmitCleanup(*this, Fn, /*ForEH*/ false, NormalActiveFlag);
+ EmitCleanup(*this, Fn, cleanupFlags, NormalActiveFlag);
// Otherwise, the best approach is to thread everything through
// the cleanup block and then try to clean up after ourselves.
@@ -774,7 +777,7 @@ void CodeGenFunction::PopCleanupBlock(bool FallthroughIsBranchThrough) {
EHStack.popCleanup();
assert(EHStack.hasNormalCleanups() == HasEnclosingCleanups);
- EmitCleanup(*this, Fn, /*ForEH*/ false, NormalActiveFlag);
+ EmitCleanup(*this, Fn, cleanupFlags, NormalActiveFlag);
// Append the prepared cleanup prologue from above.
llvm::BasicBlock *NormalExit = Builder.GetInsertBlock();
@@ -857,7 +860,9 @@ void CodeGenFunction::PopCleanupBlock(bool FallthroughIsBranchThrough) {
CGBuilderTy::InsertPoint SavedIP = Builder.saveAndClearIP();
EmitBlock(EHEntry);
- EmitCleanup(*this, Fn, /*ForEH*/ true, EHActiveFlag);
+
+ cleanupFlags.setIsForEHCleanup();
+ EmitCleanup(*this, Fn, cleanupFlags, EHActiveFlag);
// Append the prepared cleanup prologue from above.
llvm::BasicBlock *EHExit = Builder.GetInsertBlock();
diff --git a/contrib/llvm/tools/clang/lib/CodeGen/CGDebugInfo.cpp b/contrib/llvm/tools/clang/lib/CodeGen/CGDebugInfo.cpp
index 98d30db..4c12445 100644
--- a/contrib/llvm/tools/clang/lib/CodeGen/CGDebugInfo.cpp
+++ b/contrib/llvm/tools/clang/lib/CodeGen/CGDebugInfo.cpp
@@ -314,8 +314,9 @@ llvm::DIType CGDebugInfo::CreateType(const BuiltinType *BT) {
llvm::SmallVector<llvm::Value *, 16> EltTys;
llvm::DIType FieldTy =
- DBuilder.createMemberType("isa", getOrCreateMainFile(),
- 0,Size, 0, 0, 0, ISATy);
+ DBuilder.createMemberType(getOrCreateMainFile(), "isa",
+ getOrCreateMainFile(), 0, Size,
+ 0, 0, 0, ISATy);
EltTys.push_back(FieldTy);
llvm::DIArray Elements = DBuilder.getOrCreateArray(EltTys);
@@ -389,6 +390,7 @@ llvm::DIType CGDebugInfo::CreateQualifiedType(QualType Ty, llvm::DIFile Unit) {
// Ignore these qualifiers for now.
Qc.removeObjCGCAttr();
Qc.removeAddressSpace();
+ Qc.removeObjCLifetime();
// We will create one Derived type for one qualifier and recurse to handle any
// additional ones.
@@ -528,7 +530,7 @@ llvm::DIType CGDebugInfo::CreateType(const BlockPointerType *Ty,
FieldTy = DescTy;
FieldSize = CGM.getContext().getTypeSize(Ty);
FieldAlign = CGM.getContext().getTypeAlign(Ty);
- FieldTy = DBuilder.createMemberType("__descriptor", Unit,
+ FieldTy = DBuilder.createMemberType(Unit, "__descriptor", Unit,
LineNo, FieldSize, FieldAlign,
FieldOffset, 0, FieldTy);
EltTys.push_back(FieldTy);
@@ -591,7 +593,8 @@ llvm::DIType CGDebugInfo::createFieldType(llvm::StringRef name,
SourceLocation loc,
AccessSpecifier AS,
uint64_t offsetInBits,
- llvm::DIFile tunit) {
+ llvm::DIFile tunit,
+ llvm::DIDescriptor scope) {
llvm::DIType debugType = getOrCreateType(type, tunit);
// Get the location for the field.
@@ -613,15 +616,16 @@ llvm::DIType CGDebugInfo::createFieldType(llvm::StringRef name,
else if (AS == clang::AS_protected)
flags |= llvm::DIDescriptor::FlagProtected;
- return DBuilder.createMemberType(name, file, line, sizeInBits, alignInBits,
- offsetInBits, flags, debugType);
+ return DBuilder.createMemberType(scope, name, file, line, sizeInBits,
+ alignInBits, offsetInBits, flags, debugType);
}
/// CollectRecordFields - A helper function to collect debug info for
/// record fields. This is used while creating debug info entry for a Record.
void CGDebugInfo::
CollectRecordFields(const RecordDecl *record, llvm::DIFile tunit,
- llvm::SmallVectorImpl<llvm::Value *> &elements) {
+ llvm::SmallVectorImpl<llvm::Value *> &elements,
+ llvm::DIType RecordTy) {
unsigned fieldNo = 0;
const FieldDecl *LastFD = 0;
bool IsMsStruct = record->hasAttr<MsStructAttr>();
@@ -652,7 +656,7 @@ CollectRecordFields(const RecordDecl *record, llvm::DIFile tunit,
llvm::DIType fieldType
= createFieldType(name, type, field->getBitWidth(),
field->getLocation(), field->getAccess(),
- layout.getFieldOffset(fieldNo), tunit);
+ layout.getFieldOffset(fieldNo), tunit, RecordTy);
elements.push_back(fieldType);
}
@@ -960,7 +964,7 @@ CollectVTableInfo(const CXXRecordDecl *RD, llvm::DIFile Unit,
unsigned Size = CGM.getContext().getTypeSize(CGM.getContext().VoidPtrTy);
llvm::DIType VPTR
- = DBuilder.createMemberType(getVTableName(RD), Unit,
+ = DBuilder.createMemberType(Unit, getVTableName(RD), Unit,
0, Size, 0, 0, 0,
getOrCreateVTablePtrType(Unit));
EltTys.push_back(VPTR);
@@ -1048,7 +1052,7 @@ llvm::DIType CGDebugInfo::CreateType(const RecordType *Ty) {
}
}
- CollectRecordFields(RD, Unit, EltTys);
+ CollectRecordFields(RD, Unit, EltTys, FwdDecl);
llvm::DIArray TParamsArray;
if (CXXDecl) {
CollectCXXMemberFunctions(CXXDecl, Unit, EltTys, FwdDecl);
@@ -1379,13 +1383,13 @@ llvm::DIType CGDebugInfo::CreateType(const MemberPointerType *Ty,
// FIXME: This should probably be a function type instead.
ElementTypes[0] =
- DBuilder.createMemberType("ptr", U, 0,
+ DBuilder.createMemberType(U, "ptr", U, 0,
Info.first, Info.second, FieldOffset, 0,
PointerDiffDITy);
FieldOffset += Info.first;
ElementTypes[1] =
- DBuilder.createMemberType("ptr", U, 0,
+ DBuilder.createMemberType(U, "ptr", U, 0,
Info.first, Info.second, FieldOffset, 0,
PointerDiffDITy);
@@ -1520,10 +1524,7 @@ llvm::DIType CGDebugInfo::CreateTypeNode(QualType Ty,
#include "clang/AST/TypeNodes.def"
assert(false && "Dependent types cannot show up in debug information");
- // FIXME: Handle these.
case Type::ExtVector:
- return llvm::DIType();
-
case Type::Vector:
return CreateType(cast<VectorType>(Ty), Unit);
case Type::ObjCObjectPointer:
@@ -1586,7 +1587,7 @@ llvm::DIType CGDebugInfo::CreateMemberType(llvm::DIFile Unit, QualType FType,
llvm::DIType FieldTy = CGDebugInfo::getOrCreateType(FType, Unit);
uint64_t FieldSize = CGM.getContext().getTypeSize(FType);
unsigned FieldAlign = CGM.getContext().getTypeAlign(FType);
- llvm::DIType Ty = DBuilder.createMemberType(Name, Unit, 0,
+ llvm::DIType Ty = DBuilder.createMemberType(Unit, Name, Unit, 0,
FieldSize, FieldAlign,
*Offset, 0, FieldTy);
*Offset += FieldSize;
@@ -1897,7 +1898,7 @@ llvm::DIType CGDebugInfo::EmitTypeForVarWithBlocksAttr(const ValueDecl *VD,
FieldAlign = CGM.getContext().toBits(Align);
*XOffset = FieldOffset;
- FieldTy = DBuilder.createMemberType(VD->getName(), Unit,
+ FieldTy = DBuilder.createMemberType(Unit, VD->getName(), Unit,
0, FieldSize, FieldAlign,
FieldOffset, 0, FieldTy);
EltTys.push_back(FieldTy);
@@ -2133,23 +2134,23 @@ void CGDebugInfo::EmitDeclareOfBlockLiteralArgVariable(const CGBlockInfo &block,
llvm::SmallVector<llvm::Value*, 16> fields;
fields.push_back(createFieldType("__isa", C.VoidPtrTy, 0, loc, AS_public,
blockLayout->getElementOffsetInBits(0),
- tunit));
+ tunit, tunit));
fields.push_back(createFieldType("__flags", C.IntTy, 0, loc, AS_public,
blockLayout->getElementOffsetInBits(1),
- tunit));
+ tunit, tunit));
fields.push_back(createFieldType("__reserved", C.IntTy, 0, loc, AS_public,
blockLayout->getElementOffsetInBits(2),
- tunit));
+ tunit, tunit));
fields.push_back(createFieldType("__FuncPtr", C.VoidPtrTy, 0, loc, AS_public,
blockLayout->getElementOffsetInBits(3),
- tunit));
+ tunit, tunit));
fields.push_back(createFieldType("__descriptor",
C.getPointerType(block.NeedsCopyDispose ?
C.getBlockDescriptorExtendedType() :
C.getBlockDescriptorType()),
0, loc, AS_public,
blockLayout->getElementOffsetInBits(4),
- tunit));
+ tunit, tunit));
// We want to sort the captures by offset, not because DWARF
// requires this, but because we're paranoid about debuggers.
@@ -2198,7 +2199,7 @@ void CGDebugInfo::EmitDeclareOfBlockLiteralArgVariable(const CGBlockInfo &block,
QualType type = method->getThisType(C);
fields.push_back(createFieldType("this", type, 0, loc, AS_public,
- offsetInBits, tunit));
+ offsetInBits, tunit, tunit));
continue;
}
@@ -2213,12 +2214,12 @@ void CGDebugInfo::EmitDeclareOfBlockLiteralArgVariable(const CGBlockInfo &block,
uint64_t xoffset;
fieldType = EmitTypeForVarWithBlocksAttr(variable, &xoffset);
fieldType = DBuilder.createPointerType(fieldType, ptrInfo.first);
- fieldType = DBuilder.createMemberType(name, tunit, line,
+ fieldType = DBuilder.createMemberType(tunit, name, tunit, line,
ptrInfo.first, ptrInfo.second,
offsetInBits, 0, fieldType);
} else {
fieldType = createFieldType(name, variable->getType(), 0,
- loc, AS_public, offsetInBits, tunit);
+ loc, AS_public, offsetInBits, tunit, tunit);
}
fields.push_back(fieldType);
}
diff --git a/contrib/llvm/tools/clang/lib/CodeGen/CGDebugInfo.h b/contrib/llvm/tools/clang/lib/CodeGen/CGDebugInfo.h
index 6ec6b65..f87d007 100644
--- a/contrib/llvm/tools/clang/lib/CodeGen/CGDebugInfo.h
+++ b/contrib/llvm/tools/clang/lib/CodeGen/CGDebugInfo.h
@@ -33,11 +33,11 @@ namespace clang {
class VarDecl;
class ObjCInterfaceDecl;
class ClassTemplateSpecializationDecl;
+ class GlobalDecl;
namespace CodeGen {
class CodeGenModule;
class CodeGenFunction;
- class GlobalDecl;
class CGBlockInfo;
/// CGDebugInfo - This class gathers all debug information during compilation
@@ -139,9 +139,11 @@ class CGDebugInfo {
llvm::DIType createFieldType(llvm::StringRef name, QualType type,
Expr *bitWidth, SourceLocation loc,
AccessSpecifier AS, uint64_t offsetInBits,
- llvm::DIFile tunit);
+ llvm::DIFile tunit,
+ llvm::DIDescriptor scope);
void CollectRecordFields(const RecordDecl *Decl, llvm::DIFile F,
- llvm::SmallVectorImpl<llvm::Value *> &E);
+ llvm::SmallVectorImpl<llvm::Value *> &E,
+ llvm::DIType RecordTy);
void CollectVTableInfo(const CXXRecordDecl *Decl,
llvm::DIFile F,
diff --git a/contrib/llvm/tools/clang/lib/CodeGen/CGDecl.cpp b/contrib/llvm/tools/clang/lib/CodeGen/CGDecl.cpp
index 8a1a853..62c3a97 100644
--- a/contrib/llvm/tools/clang/lib/CodeGen/CGDecl.cpp
+++ b/contrib/llvm/tools/clang/lib/CodeGen/CGDecl.cpp
@@ -98,7 +98,7 @@ void CodeGenFunction::EmitDecl(const Decl &D) {
QualType Ty = TD.getUnderlyingType();
if (Ty->isVariablyModifiedType())
- EmitVLASize(Ty);
+ EmitVariablyModifiedType(Ty);
}
}
}
@@ -258,7 +258,7 @@ void CodeGenFunction::EmitStaticVarDecl(const VarDecl &D,
// even though that doesn't really make any sense.
// Make sure to evaluate VLA bounds now so that we have them for later.
if (D.getType()->isVariablyModifiedType())
- EmitVLASize(D.getType());
+ EmitVariablyModifiedType(D.getType());
// Local static block variables must be treated as globals as they may be
// referenced in their RHS initializer block-literal expresion.
@@ -304,38 +304,40 @@ void CodeGenFunction::EmitStaticVarDecl(const VarDecl &D,
}
namespace {
- struct CallArrayDtor : EHScopeStack::Cleanup {
- CallArrayDtor(const CXXDestructorDecl *Dtor,
- const ConstantArrayType *Type,
- llvm::Value *Loc)
- : Dtor(Dtor), Type(Type), Loc(Loc) {}
-
- const CXXDestructorDecl *Dtor;
- const ConstantArrayType *Type;
- llvm::Value *Loc;
-
- void Emit(CodeGenFunction &CGF, bool IsForEH) {
- QualType BaseElementTy = CGF.getContext().getBaseElementType(Type);
- const llvm::Type *BasePtr = CGF.ConvertType(BaseElementTy);
- BasePtr = llvm::PointerType::getUnqual(BasePtr);
- llvm::Value *BaseAddrPtr = CGF.Builder.CreateBitCast(Loc, BasePtr);
- CGF.EmitCXXAggrDestructorCall(Dtor, Type, BaseAddrPtr);
+ struct DestroyObject : EHScopeStack::Cleanup {
+ DestroyObject(llvm::Value *addr, QualType type,
+ CodeGenFunction::Destroyer *destroyer,
+ bool useEHCleanupForArray)
+ : addr(addr), type(type), destroyer(*destroyer),
+ useEHCleanupForArray(useEHCleanupForArray) {}
+
+ llvm::Value *addr;
+ QualType type;
+ CodeGenFunction::Destroyer &destroyer;
+ bool useEHCleanupForArray;
+
+ void Emit(CodeGenFunction &CGF, Flags flags) {
+ // Don't use an EH cleanup recursively from an EH cleanup.
+ bool useEHCleanupForArray =
+ flags.isForNormalCleanup() && this->useEHCleanupForArray;
+
+ CGF.emitDestroy(addr, type, destroyer, useEHCleanupForArray);
}
};
- struct CallVarDtor : EHScopeStack::Cleanup {
- CallVarDtor(const CXXDestructorDecl *Dtor,
- llvm::Value *NRVOFlag,
- llvm::Value *Loc)
- : Dtor(Dtor), NRVOFlag(NRVOFlag), Loc(Loc) {}
+ struct DestroyNRVOVariable : EHScopeStack::Cleanup {
+ DestroyNRVOVariable(llvm::Value *addr,
+ const CXXDestructorDecl *Dtor,
+ llvm::Value *NRVOFlag)
+ : Dtor(Dtor), NRVOFlag(NRVOFlag), Loc(addr) {}
const CXXDestructorDecl *Dtor;
llvm::Value *NRVOFlag;
llvm::Value *Loc;
- void Emit(CodeGenFunction &CGF, bool IsForEH) {
+ void Emit(CodeGenFunction &CGF, Flags flags) {
// Along the exceptions path we always execute the dtor.
- bool NRVO = !IsForEH && NRVOFlag;
+ bool NRVO = flags.isForNormalCleanup() && NRVOFlag;
llvm::BasicBlock *SkipDtorBB = 0;
if (NRVO) {
@@ -353,19 +355,31 @@ namespace {
if (NRVO) CGF.EmitBlock(SkipDtorBB);
}
};
-}
-namespace {
struct CallStackRestore : EHScopeStack::Cleanup {
llvm::Value *Stack;
CallStackRestore(llvm::Value *Stack) : Stack(Stack) {}
- void Emit(CodeGenFunction &CGF, bool IsForEH) {
+ void Emit(CodeGenFunction &CGF, Flags flags) {
llvm::Value *V = CGF.Builder.CreateLoad(Stack, "tmp");
llvm::Value *F = CGF.CGM.getIntrinsic(llvm::Intrinsic::stackrestore);
CGF.Builder.CreateCall(F, V);
}
};
+ struct ExtendGCLifetime : EHScopeStack::Cleanup {
+ const VarDecl &Var;
+ ExtendGCLifetime(const VarDecl *var) : Var(*var) {}
+
+ void Emit(CodeGenFunction &CGF, Flags flags) {
+ // Compute the address of the local variable, in case it's a
+ // byref or something.
+ DeclRefExpr DRE(const_cast<VarDecl*>(&Var), Var.getType(), VK_LValue,
+ SourceLocation());
+ llvm::Value *value = CGF.EmitLoadOfScalar(CGF.EmitDeclRefLValue(&DRE));
+ CGF.EmitExtendGCLifetime(value);
+ }
+ };
+
struct CallCleanupFunction : EHScopeStack::Cleanup {
llvm::Constant *CleanupFn;
const CGFunctionInfo &FnInfo;
@@ -375,7 +389,7 @@ namespace {
const VarDecl *Var)
: CleanupFn(CleanupFn), FnInfo(*Info), Var(*Var) {}
- void Emit(CodeGenFunction &CGF, bool IsForEH) {
+ void Emit(CodeGenFunction &CGF, Flags flags) {
DeclRefExpr DRE(const_cast<VarDecl*>(&Var), Var.getType(), VK_LValue,
SourceLocation());
// Compute the address of the local variable, in case it's a byref
@@ -400,6 +414,207 @@ namespace {
};
}
+/// EmitAutoVarWithLifetime - Does the setup required for an automatic
+/// variable with lifetime.
+static void EmitAutoVarWithLifetime(CodeGenFunction &CGF, const VarDecl &var,
+ llvm::Value *addr,
+ Qualifiers::ObjCLifetime lifetime) {
+ switch (lifetime) {
+ case Qualifiers::OCL_None:
+ llvm_unreachable("present but none");
+
+ case Qualifiers::OCL_ExplicitNone:
+ // nothing to do
+ break;
+
+ case Qualifiers::OCL_Strong: {
+ CodeGenFunction::Destroyer &destroyer =
+ (var.hasAttr<ObjCPreciseLifetimeAttr>()
+ ? CodeGenFunction::destroyARCStrongPrecise
+ : CodeGenFunction::destroyARCStrongImprecise);
+
+ CleanupKind cleanupKind = CGF.getARCCleanupKind();
+ CGF.pushDestroy(cleanupKind, addr, var.getType(), destroyer,
+ cleanupKind & EHCleanup);
+ break;
+ }
+ case Qualifiers::OCL_Autoreleasing:
+ // nothing to do
+ break;
+
+ case Qualifiers::OCL_Weak:
+ // __weak objects always get EH cleanups; otherwise, exceptions
+ // could cause really nasty crashes instead of mere leaks.
+ CGF.pushDestroy(NormalAndEHCleanup, addr, var.getType(),
+ CodeGenFunction::destroyARCWeak,
+ /*useEHCleanup*/ true);
+ break;
+ }
+}
+
+static bool isAccessedBy(const VarDecl &var, const Stmt *s) {
+ if (const Expr *e = dyn_cast<Expr>(s)) {
+ // Skip the most common kinds of expressions that make
+ // hierarchy-walking expensive.
+ s = e = e->IgnoreParenCasts();
+
+ if (const DeclRefExpr *ref = dyn_cast<DeclRefExpr>(e))
+ return (ref->getDecl() == &var);
+ }
+
+ for (Stmt::const_child_range children = s->children(); children; ++children)
+ // children might be null; as in missing decl or conditional of an if-stmt.
+ if ((*children) && isAccessedBy(var, *children))
+ return true;
+
+ return false;
+}
+
+static bool isAccessedBy(const ValueDecl *decl, const Expr *e) {
+ if (!decl) return false;
+ if (!isa<VarDecl>(decl)) return false;
+ const VarDecl *var = cast<VarDecl>(decl);
+ return isAccessedBy(*var, e);
+}
+
+static void drillIntoBlockVariable(CodeGenFunction &CGF,
+ LValue &lvalue,
+ const VarDecl *var) {
+ lvalue.setAddress(CGF.BuildBlockByrefAddress(lvalue.getAddress(), var));
+}
+
+void CodeGenFunction::EmitScalarInit(const Expr *init,
+ const ValueDecl *D,
+ LValue lvalue,
+ bool capturedByInit) {
+ Qualifiers::ObjCLifetime lifetime = lvalue.getObjCLifetime();
+ if (!lifetime) {
+ llvm::Value *value = EmitScalarExpr(init);
+ if (capturedByInit)
+ drillIntoBlockVariable(*this, lvalue, cast<VarDecl>(D));
+ EmitStoreThroughLValue(RValue::get(value), lvalue);
+ return;
+ }
+
+ // If we're emitting a value with lifetime, we have to do the
+ // initialization *before* we leave the cleanup scopes.
+ CodeGenFunction::RunCleanupsScope Scope(*this);
+ if (const ExprWithCleanups *ewc = dyn_cast<ExprWithCleanups>(init))
+ init = ewc->getSubExpr();
+
+ // We have to maintain the illusion that the variable is
+ // zero-initialized. If the variable might be accessed in its
+ // initializer, zero-initialize before running the initializer, then
+ // actually perform the initialization with an assign.
+ bool accessedByInit = false;
+ if (lifetime != Qualifiers::OCL_ExplicitNone)
+ accessedByInit = isAccessedBy(D, init);
+ if (accessedByInit) {
+ LValue tempLV = lvalue;
+ // Drill down to the __block object if necessary.
+ if (capturedByInit) {
+ // We can use a simple GEP for this because it can't have been
+ // moved yet.
+ tempLV.setAddress(Builder.CreateStructGEP(tempLV.getAddress(),
+ getByRefValueLLVMField(cast<VarDecl>(D))));
+ }
+
+ const llvm::PointerType *ty
+ = cast<llvm::PointerType>(tempLV.getAddress()->getType());
+ ty = cast<llvm::PointerType>(ty->getElementType());
+
+ llvm::Value *zero = llvm::ConstantPointerNull::get(ty);
+
+ // If __weak, we want to use a barrier under certain conditions.
+ if (lifetime == Qualifiers::OCL_Weak)
+ EmitARCInitWeak(tempLV.getAddress(), zero);
+
+ // Otherwise just do a simple store.
+ else
+ EmitStoreOfScalar(zero, tempLV);
+ }
+
+ // Emit the initializer.
+ llvm::Value *value = 0;
+
+ switch (lifetime) {
+ case Qualifiers::OCL_None:
+ llvm_unreachable("present but none");
+
+ case Qualifiers::OCL_ExplicitNone:
+ // nothing to do
+ value = EmitScalarExpr(init);
+ break;
+
+ case Qualifiers::OCL_Strong: {
+ value = EmitARCRetainScalarExpr(init);
+ break;
+ }
+
+ case Qualifiers::OCL_Weak: {
+ // No way to optimize a producing initializer into this. It's not
+ // worth optimizing for, because the value will immediately
+ // disappear in the common case.
+ value = EmitScalarExpr(init);
+
+ if (capturedByInit) drillIntoBlockVariable(*this, lvalue, cast<VarDecl>(D));
+ if (accessedByInit)
+ EmitARCStoreWeak(lvalue.getAddress(), value, /*ignored*/ true);
+ else
+ EmitARCInitWeak(lvalue.getAddress(), value);
+ return;
+ }
+
+ case Qualifiers::OCL_Autoreleasing:
+ value = EmitARCRetainAutoreleaseScalarExpr(init);
+ break;
+ }
+
+ if (capturedByInit) drillIntoBlockVariable(*this, lvalue, cast<VarDecl>(D));
+
+ // If the variable might have been accessed by its initializer, we
+ // might have to initialize with a barrier. We have to do this for
+ // both __weak and __strong, but __weak got filtered out above.
+ if (accessedByInit && lifetime == Qualifiers::OCL_Strong) {
+ llvm::Value *oldValue = EmitLoadOfScalar(lvalue);
+ EmitStoreOfScalar(value, lvalue);
+ EmitARCRelease(oldValue, /*precise*/ false);
+ return;
+ }
+
+ EmitStoreOfScalar(value, lvalue);
+}
+
+/// EmitScalarInit - Initialize the given lvalue with the given object.
+void CodeGenFunction::EmitScalarInit(llvm::Value *init, LValue lvalue) {
+ Qualifiers::ObjCLifetime lifetime = lvalue.getObjCLifetime();
+ if (!lifetime)
+ return EmitStoreThroughLValue(RValue::get(init), lvalue);
+
+ switch (lifetime) {
+ case Qualifiers::OCL_None:
+ llvm_unreachable("present but none");
+
+ case Qualifiers::OCL_ExplicitNone:
+ // nothing to do
+ break;
+
+ case Qualifiers::OCL_Strong:
+ init = EmitARCRetain(lvalue.getType(), init);
+ break;
+
+ case Qualifiers::OCL_Weak:
+ // Initialize and then skip the primitive store.
+ EmitARCInitWeak(lvalue.getAddress(), init);
+ return;
+
+ case Qualifiers::OCL_Autoreleasing:
+ init = EmitARCRetainAutorelease(lvalue.getType(), init);
+ break;
+ }
+
+ EmitStoreOfScalar(init, lvalue);
+}
/// canEmitInitWithFewStoresAfterMemset - Decide whether we can emit the
/// non-zero parts of the specified initializer with equal or fewer than
@@ -508,6 +723,10 @@ CodeGenFunction::EmitAutoVarAlloca(const VarDecl &D) {
CharUnits alignment = getContext().getDeclAlign(&D);
emission.Alignment = alignment;
+ // If the type is variably-modified, emit all the VLA sizes for it.
+ if (Ty->isVariablyModifiedType())
+ EmitVariablyModifiedType(Ty);
+
llvm::Value *DeclPtr;
if (Ty->isConstantSizeType()) {
if (!Target.useGlobalsForAutomaticVariables()) {
@@ -521,7 +740,9 @@ CodeGenFunction::EmitAutoVarAlloca(const VarDecl &D) {
// arrays as long as the initialization is trivial (e.g. if they
// have a non-trivial destructor, but not a non-trivial constructor).
if (D.getInit() &&
- (Ty->isArrayType() || Ty->isRecordType()) && Ty->isPODType() &&
+ (Ty->isArrayType() || Ty->isRecordType()) &&
+ (Ty.isPODType(getContext()) ||
+ getContext().getBaseElementType(Ty)->isObjCObjectPointerType()) &&
D.getInit()->isConstantInitializer(getContext(), false)) {
// If the variable's a const type, and it's neither an NRVO
@@ -585,10 +806,6 @@ CodeGenFunction::EmitAutoVarAlloca(const VarDecl &D) {
DeclPtr = CreateStaticVarDecl(D, Class,
llvm::GlobalValue::InternalLinkage);
}
-
- // FIXME: Can this happen?
- if (Ty->isVariablyModifiedType())
- EmitVLASize(Ty);
} else {
EnsureInsertPoint();
@@ -608,19 +825,17 @@ CodeGenFunction::EmitAutoVarAlloca(const VarDecl &D) {
EHStack.pushCleanup<CallStackRestore>(NormalCleanup, Stack);
}
- // Get the element type.
- const llvm::Type *LElemTy = ConvertTypeForMem(Ty);
- const llvm::Type *LElemPtrTy =
- LElemTy->getPointerTo(CGM.getContext().getTargetAddressSpace(Ty));
+ llvm::Value *elementCount;
+ QualType elementType;
+ llvm::tie(elementCount, elementType) = getVLASize(Ty);
- llvm::Value *VLASize = EmitVLASize(Ty);
+ const llvm::Type *llvmTy = ConvertTypeForMem(elementType);
// Allocate memory for the array.
- llvm::AllocaInst *VLA =
- Builder.CreateAlloca(llvm::Type::getInt8Ty(getLLVMContext()), VLASize, "vla");
- VLA->setAlignment(alignment.getQuantity());
+ llvm::AllocaInst *vla = Builder.CreateAlloca(llvmTy, elementCount, "vla");
+ vla->setAlignment(alignment.getQuantity());
- DeclPtr = Builder.CreateBitCast(VLA, LElemPtrTy, "tmp");
+ DeclPtr = vla;
}
llvm::Value *&DMEntry = LocalDeclMap[&D];
@@ -667,6 +882,21 @@ static bool isCapturedBy(const VarDecl &var, const Expr *e) {
return false;
}
+/// \brief Determine whether the given initializer is trivial in the sense
+/// that it requires no code to be generated.
+static bool isTrivialInitializer(const Expr *Init) {
+ if (!Init)
+ return true;
+
+ if (const CXXConstructExpr *Construct = dyn_cast<CXXConstructExpr>(Init))
+ if (CXXConstructorDecl *Constructor = Construct->getConstructor())
+ if (Constructor->isTrivial() &&
+ Constructor->isDefaultConstructor() &&
+ !Construct->requiresZeroInitialization())
+ return true;
+
+ return false;
+}
void CodeGenFunction::EmitAutoVarInit(const AutoVarEmission &emission) {
assert(emission.Variable && "emission was not valid!");
@@ -690,7 +920,9 @@ void CodeGenFunction::EmitAutoVarInit(const AutoVarEmission &emission) {
if (emission.IsByRef)
emitByrefStructureInit(emission);
- if (!Init) return;
+ if (isTrivialInitializer(Init))
+ return;
+
CharUnits alignment = emission.Alignment;
@@ -702,8 +934,11 @@ void CodeGenFunction::EmitAutoVarInit(const AutoVarEmission &emission) {
llvm::Value *Loc =
capturedByInit ? emission.Address : emission.getObjectAddress(*this);
- if (!emission.IsConstantAggregate)
- return EmitExprAsInit(Init, &D, Loc, alignment, capturedByInit);
+ if (!emission.IsConstantAggregate) {
+ LValue lv = MakeAddrLValue(Loc, type, alignment.getQuantity());
+ lv.setNonGC(true);
+ return EmitExprAsInit(Init, &D, lv, capturedByInit);
+ }
// If this is a simple aggregate initialization, we can optimize it
// in various ways.
@@ -765,32 +1000,87 @@ void CodeGenFunction::EmitAutoVarInit(const AutoVarEmission &emission) {
/// \param capturedByInit true if the variable is a __block variable
/// whose address is potentially changed by the initializer
void CodeGenFunction::EmitExprAsInit(const Expr *init,
- const VarDecl *var,
- llvm::Value *loc,
- CharUnits alignment,
+ const ValueDecl *D,
+ LValue lvalue,
bool capturedByInit) {
- QualType type = var->getType();
- bool isVolatile = type.isVolatileQualified();
+ QualType type = D->getType();
if (type->isReferenceType()) {
- RValue RV = EmitReferenceBindingToExpr(init, var);
- if (capturedByInit) loc = BuildBlockByrefAddress(loc, var);
- EmitStoreOfScalar(RV.getScalarVal(), loc, false,
- alignment.getQuantity(), type);
+ RValue rvalue = EmitReferenceBindingToExpr(init, D);
+ if (capturedByInit)
+ drillIntoBlockVariable(*this, lvalue, cast<VarDecl>(D));
+ EmitStoreThroughLValue(rvalue, lvalue);
} else if (!hasAggregateLLVMType(type)) {
- llvm::Value *V = EmitScalarExpr(init);
- if (capturedByInit) loc = BuildBlockByrefAddress(loc, var);
- EmitStoreOfScalar(V, loc, isVolatile, alignment.getQuantity(), type);
+ EmitScalarInit(init, D, lvalue, capturedByInit);
} else if (type->isAnyComplexType()) {
ComplexPairTy complex = EmitComplexExpr(init);
- if (capturedByInit) loc = BuildBlockByrefAddress(loc, var);
- StoreComplexToAddr(complex, loc, isVolatile);
+ if (capturedByInit)
+ drillIntoBlockVariable(*this, lvalue, cast<VarDecl>(D));
+ StoreComplexToAddr(complex, lvalue.getAddress(), lvalue.isVolatile());
} else {
// TODO: how can we delay here if D is captured by its initializer?
- EmitAggExpr(init, AggValueSlot::forAddr(loc, isVolatile, true, false));
+ EmitAggExpr(init, AggValueSlot::forLValue(lvalue, true, false));
}
}
+/// Enter a destroy cleanup for the given local variable.
+void CodeGenFunction::emitAutoVarTypeCleanup(
+ const CodeGenFunction::AutoVarEmission &emission,
+ QualType::DestructionKind dtorKind) {
+ assert(dtorKind != QualType::DK_none);
+
+ // Note that for __block variables, we want to destroy the
+ // original stack object, not the possibly forwarded object.
+ llvm::Value *addr = emission.getObjectAddress(*this);
+
+ const VarDecl *var = emission.Variable;
+ QualType type = var->getType();
+
+ CleanupKind cleanupKind = NormalAndEHCleanup;
+ CodeGenFunction::Destroyer *destroyer = 0;
+
+ switch (dtorKind) {
+ case QualType::DK_none:
+ llvm_unreachable("no cleanup for trivially-destructible variable");
+
+ case QualType::DK_cxx_destructor:
+ // If there's an NRVO flag on the emission, we need a different
+ // cleanup.
+ if (emission.NRVOFlag) {
+ assert(!type->isArrayType());
+ CXXDestructorDecl *dtor = type->getAsCXXRecordDecl()->getDestructor();
+ EHStack.pushCleanup<DestroyNRVOVariable>(cleanupKind, addr, dtor,
+ emission.NRVOFlag);
+ return;
+ }
+ break;
+
+ case QualType::DK_objc_strong_lifetime:
+ // Suppress cleanups for pseudo-strong variables.
+ if (var->isARCPseudoStrong()) return;
+
+ // Otherwise, consider whether to use an EH cleanup or not.
+ cleanupKind = getARCCleanupKind();
+
+ // Use the imprecise destroyer by default.
+ if (!var->hasAttr<ObjCPreciseLifetimeAttr>())
+ destroyer = CodeGenFunction::destroyARCStrongImprecise;
+ break;
+
+ case QualType::DK_objc_weak_lifetime:
+ break;
+ }
+
+ // If we haven't chosen a more specific destroyer, use the default.
+ if (!destroyer) destroyer = &getDestroyer(dtorKind);
+
+ // Use an EH cleanup in array destructors iff the destructor itself
+ // is being pushed as an EH cleanup.
+ bool useEHCleanup = (cleanupKind & EHCleanup);
+ EHStack.pushCleanup<DestroyObject>(cleanupKind, addr, type, destroyer,
+ useEHCleanup);
+}
+
void CodeGenFunction::EmitAutoVarCleanups(const AutoVarEmission &emission) {
assert(emission.Variable && "emission was not valid!");
@@ -799,35 +1089,14 @@ void CodeGenFunction::EmitAutoVarCleanups(const AutoVarEmission &emission) {
const VarDecl &D = *emission.Variable;
- // Handle C++ destruction of variables.
- if (getLangOptions().CPlusPlus) {
- QualType type = D.getType();
- QualType baseType = getContext().getBaseElementType(type);
- if (const RecordType *RT = baseType->getAs<RecordType>()) {
- CXXRecordDecl *ClassDecl = cast<CXXRecordDecl>(RT->getDecl());
- if (!ClassDecl->hasTrivialDestructor()) {
- // Note: We suppress the destructor call when the corresponding NRVO
- // flag has been set.
-
- // Note that for __block variables, we want to destroy the
- // original stack object, not the possible forwarded object.
- llvm::Value *Loc = emission.getObjectAddress(*this);
-
- const CXXDestructorDecl *D = ClassDecl->getDestructor();
- assert(D && "EmitLocalBlockVarDecl - destructor is nul");
-
- if (type != baseType) {
- const ConstantArrayType *Array =
- getContext().getAsConstantArrayType(type);
- assert(Array && "types changed without array?");
- EHStack.pushCleanup<CallArrayDtor>(NormalAndEHCleanup,
- D, Array, Loc);
- } else {
- EHStack.pushCleanup<CallVarDtor>(NormalAndEHCleanup,
- D, emission.NRVOFlag, Loc);
- }
- }
- }
+ // Check the type for a cleanup.
+ if (QualType::DestructionKind dtorKind = D.getType().isDestructedType())
+ emitAutoVarTypeCleanup(emission, dtorKind);
+
+ // In GC mode, honor objc_precise_lifetime.
+ if (getLangOptions().getGCMode() != LangOptions::NonGC &&
+ D.hasAttr<ObjCPreciseLifetimeAttr>()) {
+ EHStack.pushCleanup<ExtendGCLifetime>(NormalCleanup, &D);
}
// Handle the cleanup attribute.
@@ -847,6 +1116,271 @@ void CodeGenFunction::EmitAutoVarCleanups(const AutoVarEmission &emission) {
enterByrefCleanup(emission);
}
+CodeGenFunction::Destroyer &
+CodeGenFunction::getDestroyer(QualType::DestructionKind kind) {
+ // This is surprisingly compiler-dependent. GCC 4.2 can't bind
+ // references to functions directly in returns, and using '*&foo'
+ // confuses MSVC. Luckily, the following code pattern works in both.
+ Destroyer *destroyer = 0;
+ switch (kind) {
+ case QualType::DK_none: llvm_unreachable("no destroyer for trivial dtor");
+ case QualType::DK_cxx_destructor:
+ destroyer = &destroyCXXObject;
+ break;
+ case QualType::DK_objc_strong_lifetime:
+ destroyer = &destroyARCStrongPrecise;
+ break;
+ case QualType::DK_objc_weak_lifetime:
+ destroyer = &destroyARCWeak;
+ break;
+ }
+ return *destroyer;
+}
+
+/// pushDestroy - Push the standard destructor for the given type.
+void CodeGenFunction::pushDestroy(QualType::DestructionKind dtorKind,
+ llvm::Value *addr, QualType type) {
+ assert(dtorKind && "cannot push destructor for trivial type");
+
+ CleanupKind cleanupKind = getCleanupKind(dtorKind);
+ pushDestroy(cleanupKind, addr, type, getDestroyer(dtorKind),
+ cleanupKind & EHCleanup);
+}
+
+void CodeGenFunction::pushDestroy(CleanupKind cleanupKind, llvm::Value *addr,
+ QualType type, Destroyer &destroyer,
+ bool useEHCleanupForArray) {
+ pushFullExprCleanup<DestroyObject>(cleanupKind, addr, type,
+ destroyer, useEHCleanupForArray);
+}
+
+/// emitDestroy - Immediately perform the destruction of the given
+/// object.
+///
+/// \param addr - the address of the object; a type*
+/// \param type - the type of the object; if an array type, all
+/// objects are destroyed in reverse order
+/// \param destroyer - the function to call to destroy individual
+/// elements
+/// \param useEHCleanupForArray - whether an EH cleanup should be
+/// used when destroying array elements, in case one of the
+/// destructions throws an exception
+void CodeGenFunction::emitDestroy(llvm::Value *addr, QualType type,
+ Destroyer &destroyer,
+ bool useEHCleanupForArray) {
+ const ArrayType *arrayType = getContext().getAsArrayType(type);
+ if (!arrayType)
+ return destroyer(*this, addr, type);
+
+ llvm::Value *begin = addr;
+ llvm::Value *length = emitArrayLength(arrayType, type, begin);
+
+ // Normally we have to check whether the array is zero-length.
+ bool checkZeroLength = true;
+
+ // But if the array length is constant, we can suppress that.
+ if (llvm::ConstantInt *constLength = dyn_cast<llvm::ConstantInt>(length)) {
+ // ...and if it's constant zero, we can just skip the entire thing.
+ if (constLength->isZero()) return;
+ checkZeroLength = false;
+ }
+
+ llvm::Value *end = Builder.CreateInBoundsGEP(begin, length);
+ emitArrayDestroy(begin, end, type, destroyer,
+ checkZeroLength, useEHCleanupForArray);
+}
+
+/// emitArrayDestroy - Destroys all the elements of the given array,
+/// beginning from last to first. The array cannot be zero-length.
+///
+/// \param begin - a type* denoting the first element of the array
+/// \param end - a type* denoting one past the end of the array
+/// \param type - the element type of the array
+/// \param destroyer - the function to call to destroy elements
+/// \param useEHCleanup - whether to push an EH cleanup to destroy
+/// the remaining elements in case the destruction of a single
+/// element throws
+void CodeGenFunction::emitArrayDestroy(llvm::Value *begin,
+ llvm::Value *end,
+ QualType type,
+ Destroyer &destroyer,
+ bool checkZeroLength,
+ bool useEHCleanup) {
+ assert(!type->isArrayType());
+
+ // The basic structure here is a do-while loop, because we don't
+ // need to check for the zero-element case.
+ llvm::BasicBlock *bodyBB = createBasicBlock("arraydestroy.body");
+ llvm::BasicBlock *doneBB = createBasicBlock("arraydestroy.done");
+
+ if (checkZeroLength) {
+ llvm::Value *isEmpty = Builder.CreateICmpEQ(begin, end,
+ "arraydestroy.isempty");
+ Builder.CreateCondBr(isEmpty, doneBB, bodyBB);
+ }
+
+ // Enter the loop body, making that address the current address.
+ llvm::BasicBlock *entryBB = Builder.GetInsertBlock();
+ EmitBlock(bodyBB);
+ llvm::PHINode *elementPast =
+ Builder.CreatePHI(begin->getType(), 2, "arraydestroy.elementPast");
+ elementPast->addIncoming(end, entryBB);
+
+ // Shift the address back by one element.
+ llvm::Value *negativeOne = llvm::ConstantInt::get(SizeTy, -1, true);
+ llvm::Value *element = Builder.CreateInBoundsGEP(elementPast, negativeOne,
+ "arraydestroy.element");
+
+ if (useEHCleanup)
+ pushRegularPartialArrayCleanup(begin, element, type, destroyer);
+
+ // Perform the actual destruction there.
+ destroyer(*this, element, type);
+
+ if (useEHCleanup)
+ PopCleanupBlock();
+
+ // Check whether we've reached the end.
+ llvm::Value *done = Builder.CreateICmpEQ(element, begin, "arraydestroy.done");
+ Builder.CreateCondBr(done, doneBB, bodyBB);
+ elementPast->addIncoming(element, Builder.GetInsertBlock());
+
+ // Done.
+ EmitBlock(doneBB);
+}
+
+/// Perform partial array destruction as if in an EH cleanup. Unlike
+/// emitArrayDestroy, the element type here may still be an array type.
+static void emitPartialArrayDestroy(CodeGenFunction &CGF,
+ llvm::Value *begin, llvm::Value *end,
+ QualType type,
+ CodeGenFunction::Destroyer &destroyer) {
+ // If the element type is itself an array, drill down.
+ unsigned arrayDepth = 0;
+ while (const ArrayType *arrayType = CGF.getContext().getAsArrayType(type)) {
+ // VLAs don't require a GEP index to walk into.
+ if (!isa<VariableArrayType>(arrayType))
+ arrayDepth++;
+ type = arrayType->getElementType();
+ }
+
+ if (arrayDepth) {
+ llvm::Value *zero = llvm::ConstantInt::get(CGF.SizeTy, arrayDepth+1);
+
+ llvm::SmallVector<llvm::Value*,4> gepIndices(arrayDepth, zero);
+ begin = CGF.Builder.CreateInBoundsGEP(begin, gepIndices.begin(),
+ gepIndices.end(), "pad.arraybegin");
+ end = CGF.Builder.CreateInBoundsGEP(end, gepIndices.begin(),
+ gepIndices.end(), "pad.arrayend");
+ }
+
+ // Destroy the array. We don't ever need an EH cleanup because we
+ // assume that we're in an EH cleanup ourselves, so a throwing
+ // destructor causes an immediate terminate.
+ CGF.emitArrayDestroy(begin, end, type, destroyer,
+ /*checkZeroLength*/ true, /*useEHCleanup*/ false);
+}
+
+namespace {
+ /// RegularPartialArrayDestroy - a cleanup which performs a partial
+ /// array destroy where the end pointer is regularly determined and
+ /// does not need to be loaded from a local.
+ class RegularPartialArrayDestroy : public EHScopeStack::Cleanup {
+ llvm::Value *ArrayBegin;
+ llvm::Value *ArrayEnd;
+ QualType ElementType;
+ CodeGenFunction::Destroyer &Destroyer;
+ public:
+ RegularPartialArrayDestroy(llvm::Value *arrayBegin, llvm::Value *arrayEnd,
+ QualType elementType,
+ CodeGenFunction::Destroyer *destroyer)
+ : ArrayBegin(arrayBegin), ArrayEnd(arrayEnd),
+ ElementType(elementType), Destroyer(*destroyer) {}
+
+ void Emit(CodeGenFunction &CGF, Flags flags) {
+ emitPartialArrayDestroy(CGF, ArrayBegin, ArrayEnd,
+ ElementType, Destroyer);
+ }
+ };
+
+ /// IrregularPartialArrayDestroy - a cleanup which performs a
+ /// partial array destroy where the end pointer is irregularly
+ /// determined and must be loaded from a local.
+ class IrregularPartialArrayDestroy : public EHScopeStack::Cleanup {
+ llvm::Value *ArrayBegin;
+ llvm::Value *ArrayEndPointer;
+ QualType ElementType;
+ CodeGenFunction::Destroyer &Destroyer;
+ public:
+ IrregularPartialArrayDestroy(llvm::Value *arrayBegin,
+ llvm::Value *arrayEndPointer,
+ QualType elementType,
+ CodeGenFunction::Destroyer *destroyer)
+ : ArrayBegin(arrayBegin), ArrayEndPointer(arrayEndPointer),
+ ElementType(elementType), Destroyer(*destroyer) {}
+
+ void Emit(CodeGenFunction &CGF, Flags flags) {
+ llvm::Value *arrayEnd = CGF.Builder.CreateLoad(ArrayEndPointer);
+ emitPartialArrayDestroy(CGF, ArrayBegin, arrayEnd,
+ ElementType, Destroyer);
+ }
+ };
+}
+
+/// pushIrregularPartialArrayCleanup - Push an EH cleanup to destroy
+/// already-constructed elements of the given array. The cleanup
+/// may be popped with DeactivateCleanupBlock or PopCleanupBlock.
+///
+/// \param elementType - the immediate element type of the array;
+/// possibly still an array type
+/// \param array - a value of type elementType*
+/// \param destructionKind - the kind of destruction required
+/// \param initializedElementCount - a value of type size_t* holding
+/// the number of successfully-constructed elements
+void CodeGenFunction::pushIrregularPartialArrayCleanup(llvm::Value *arrayBegin,
+ llvm::Value *arrayEndPointer,
+ QualType elementType,
+ Destroyer &destroyer) {
+ pushFullExprCleanup<IrregularPartialArrayDestroy>(EHCleanup,
+ arrayBegin, arrayEndPointer,
+ elementType, &destroyer);
+}
+
+/// pushRegularPartialArrayCleanup - Push an EH cleanup to destroy
+/// already-constructed elements of the given array. The cleanup
+/// may be popped with DeactivateCleanupBlock or PopCleanupBlock.
+///
+/// \param elementType - the immediate element type of the array;
+/// possibly still an array type
+/// \param array - a value of type elementType*
+/// \param destructionKind - the kind of destruction required
+/// \param initializedElementCount - a value of type size_t* holding
+/// the number of successfully-constructed elements
+void CodeGenFunction::pushRegularPartialArrayCleanup(llvm::Value *arrayBegin,
+ llvm::Value *arrayEnd,
+ QualType elementType,
+ Destroyer &destroyer) {
+ pushFullExprCleanup<RegularPartialArrayDestroy>(EHCleanup,
+ arrayBegin, arrayEnd,
+ elementType, &destroyer);
+}
+
+namespace {
+ /// A cleanup to perform a release of an object at the end of a
+ /// function. This is used to balance out the incoming +1 of a
+ /// ns_consumed argument when we can't reasonably do that just by
+ /// not doing the initial retain for a __block argument.
+ struct ConsumeARCParameter : EHScopeStack::Cleanup {
+ ConsumeARCParameter(llvm::Value *param) : Param(param) {}
+
+ llvm::Value *Param;
+
+ void Emit(CodeGenFunction &CGF, Flags flags) {
+ CGF.EmitARCRelease(Param, /*precise*/ false);
+ }
+ };
+}
+
/// Emit an alloca (or GlobalValue depending on target)
/// for the specified parameter and set up LocalDeclMap.
void CodeGenFunction::EmitParmDecl(const VarDecl &D, llvm::Value *Arg,
@@ -883,10 +1417,56 @@ void CodeGenFunction::EmitParmDecl(const VarDecl &D, llvm::Value *Arg,
// Otherwise, create a temporary to hold the value.
DeclPtr = CreateMemTemp(Ty, D.getName() + ".addr");
+ bool doStore = true;
+
+ Qualifiers qs = Ty.getQualifiers();
+
+ if (Qualifiers::ObjCLifetime lt = qs.getObjCLifetime()) {
+ // We honor __attribute__((ns_consumed)) for types with lifetime.
+ // For __strong, it's handled by just skipping the initial retain;
+ // otherwise we have to balance out the initial +1 with an extra
+ // cleanup to do the release at the end of the function.
+ bool isConsumed = D.hasAttr<NSConsumedAttr>();
+
+ // 'self' is always formally __strong, but if this is not an
+ // init method then we don't want to retain it.
+ if (D.isARCPseudoStrong()) {
+ const ObjCMethodDecl *method = cast<ObjCMethodDecl>(CurCodeDecl);
+ assert(&D == method->getSelfDecl());
+ assert(lt == Qualifiers::OCL_Strong);
+ assert(qs.hasConst());
+ assert(method->getMethodFamily() != OMF_init);
+ (void) method;
+ lt = Qualifiers::OCL_ExplicitNone;
+ }
+
+ if (lt == Qualifiers::OCL_Strong) {
+ if (!isConsumed)
+ // Don't use objc_retainBlock for block pointers, because we
+ // don't want to Block_copy something just because we got it
+ // as a parameter.
+ Arg = EmitARCRetainNonBlock(Arg);
+ } else {
+ // Push the cleanup for a consumed parameter.
+ if (isConsumed)
+ EHStack.pushCleanup<ConsumeARCParameter>(getARCCleanupKind(), Arg);
+
+ if (lt == Qualifiers::OCL_Weak) {
+ EmitARCInitWeak(DeclPtr, Arg);
+ doStore = false; // The weak init is a store, no need to do two
+ }
+ }
+
+ // Enter the cleanup scope.
+ EmitAutoVarWithLifetime(*this, D, DeclPtr, lt);
+ }
+
// Store the initial value into the alloca.
- EmitStoreOfScalar(Arg, DeclPtr, Ty.isVolatileQualified(),
- getContext().getDeclAlign(&D).getQuantity(), Ty,
- CGM.getTBAAInfo(Ty));
+ if (doStore) {
+ LValue lv = MakeAddrLValue(DeclPtr, Ty,
+ getContext().getDeclAlign(&D).getQuantity());
+ EmitStoreOfScalar(Arg, lv);
+ }
}
llvm::Value *&DMEntry = LocalDeclMap[&D];
@@ -894,8 +1474,6 @@ void CodeGenFunction::EmitParmDecl(const VarDecl &D, llvm::Value *Arg,
DMEntry = DeclPtr;
// Emit debug info for param declaration.
- if (CGDebugInfo *DI = getDebugInfo()) {
- DI->setLocation(D.getLocation());
+ if (CGDebugInfo *DI = getDebugInfo())
DI->EmitDeclareOfArgVariable(&D, DeclPtr, ArgNo, Builder);
- }
}
diff --git a/contrib/llvm/tools/clang/lib/CodeGen/CGDeclCXX.cpp b/contrib/llvm/tools/clang/lib/CodeGen/CGDeclCXX.cpp
index 178badd..0ae6a3d 100644
--- a/contrib/llvm/tools/clang/lib/CodeGen/CGDeclCXX.cpp
+++ b/contrib/llvm/tools/clang/lib/CodeGen/CGDeclCXX.cpp
@@ -27,68 +27,76 @@ static void EmitDeclInit(CodeGenFunction &CGF, const VarDecl &D,
"Should not call EmitDeclInit on a reference!");
ASTContext &Context = CGF.getContext();
-
- const Expr *Init = D.getInit();
- QualType T = D.getType();
- bool isVolatile = Context.getCanonicalType(T).isVolatileQualified();
- unsigned Alignment = Context.getDeclAlign(&D).getQuantity();
- if (!CGF.hasAggregateLLVMType(T)) {
- llvm::Value *V = CGF.EmitScalarExpr(Init);
+ unsigned alignment = Context.getDeclAlign(&D).getQuantity();
+ QualType type = D.getType();
+ LValue lv = CGF.MakeAddrLValue(DeclPtr, type, alignment);
+
+ const Expr *Init = D.getInit();
+ if (!CGF.hasAggregateLLVMType(type)) {
CodeGenModule &CGM = CGF.CGM;
- Qualifiers::GC GCAttr = CGM.getContext().getObjCGCAttrKind(T);
- if (GCAttr == Qualifiers::Strong)
- CGM.getObjCRuntime().EmitObjCGlobalAssign(CGF, V, DeclPtr,
- D.isThreadSpecified());
- else if (GCAttr == Qualifiers::Weak)
- CGM.getObjCRuntime().EmitObjCWeakAssign(CGF, V, DeclPtr);
+ if (lv.isObjCStrong())
+ CGM.getObjCRuntime().EmitObjCGlobalAssign(CGF, CGF.EmitScalarExpr(Init),
+ DeclPtr, D.isThreadSpecified());
+ else if (lv.isObjCWeak())
+ CGM.getObjCRuntime().EmitObjCWeakAssign(CGF, CGF.EmitScalarExpr(Init),
+ DeclPtr);
else
- CGF.EmitStoreOfScalar(V, DeclPtr, isVolatile, Alignment, T);
- } else if (T->isAnyComplexType()) {
- CGF.EmitComplexExprIntoAddr(Init, DeclPtr, isVolatile);
+ CGF.EmitScalarInit(Init, &D, lv, false);
+ } else if (type->isAnyComplexType()) {
+ CGF.EmitComplexExprIntoAddr(Init, DeclPtr, lv.isVolatile());
} else {
- CGF.EmitAggExpr(Init, AggValueSlot::forAddr(DeclPtr, isVolatile, true));
+ CGF.EmitAggExpr(Init, AggValueSlot::forLValue(lv, true));
}
}
/// Emit code to cause the destruction of the given variable with
/// static storage duration.
static void EmitDeclDestroy(CodeGenFunction &CGF, const VarDecl &D,
- llvm::Constant *DeclPtr) {
+ llvm::Constant *addr) {
CodeGenModule &CGM = CGF.CGM;
- ASTContext &Context = CGF.getContext();
-
- QualType T = D.getType();
-
- // Drill down past array types.
- const ConstantArrayType *Array = Context.getAsConstantArrayType(T);
- if (Array)
- T = Context.getBaseElementType(Array);
+
+ // FIXME: __attribute__((cleanup)) ?
- /// If that's not a record, we're done.
- /// FIXME: __attribute__((cleanup)) ?
- const RecordType *RT = T->getAs<RecordType>();
- if (!RT)
+ QualType type = D.getType();
+ QualType::DestructionKind dtorKind = type.isDestructedType();
+
+ switch (dtorKind) {
+ case QualType::DK_none:
return;
-
- CXXRecordDecl *RD = cast<CXXRecordDecl>(RT->getDecl());
- if (RD->hasTrivialDestructor())
+
+ case QualType::DK_cxx_destructor:
+ break;
+
+ case QualType::DK_objc_strong_lifetime:
+ case QualType::DK_objc_weak_lifetime:
+ // We don't care about releasing objects during process teardown.
return;
-
- CXXDestructorDecl *Dtor = RD->getDestructor();
-
- llvm::Constant *DtorFn;
- if (Array) {
- DtorFn =
- CodeGenFunction(CGM).GenerateCXXAggrDestructorHelper(Dtor, Array,
- DeclPtr);
- const llvm::Type *Int8PtrTy =
- llvm::Type::getInt8PtrTy(CGM.getLLVMContext());
- DeclPtr = llvm::Constant::getNullValue(Int8PtrTy);
- } else
- DtorFn = CGM.GetAddrOfCXXDestructor(Dtor, Dtor_Complete);
-
- CGF.EmitCXXGlobalDtorRegistration(DtorFn, DeclPtr);
+ }
+
+ llvm::Constant *function;
+ llvm::Constant *argument;
+
+ // Special-case non-array C++ destructors, where there's a function
+ // with the right signature that we can just call.
+ const CXXRecordDecl *record = 0;
+ if (dtorKind == QualType::DK_cxx_destructor &&
+ (record = type->getAsCXXRecordDecl())) {
+ assert(!record->hasTrivialDestructor());
+ CXXDestructorDecl *dtor = record->getDestructor();
+
+ function = CGM.GetAddrOfCXXDestructor(dtor, Dtor_Complete);
+ argument = addr;
+
+ // Otherwise, the standard logic requires a helper function.
+ } else {
+ function = CodeGenFunction(CGM).generateDestroyHelper(addr, type,
+ CGF.getDestroyer(dtorKind),
+ CGF.needsEHCleanup(dtorKind));
+ argument = llvm::Constant::getNullValue(CGF.Int8PtrTy);
+ }
+
+ CGF.EmitCXXGlobalDtorRegistration(function, argument);
}
void CodeGenFunction::EmitCXXGlobalVarDeclInit(const VarDecl &D,
@@ -118,12 +126,13 @@ CodeGenFunction::EmitCXXGlobalDtorRegistration(llvm::Constant *DtorFn,
}
// Get the destructor function type
- const llvm::Type *DtorFnTy =
+ llvm::Type *ArgTys[] = { Int8PtrTy };
+ llvm::Type *DtorFnTy =
llvm::FunctionType::get(llvm::Type::getVoidTy(getLLVMContext()),
- Int8PtrTy, false);
+ ArgTys, false);
DtorFnTy = llvm::PointerType::getUnqual(DtorFnTy);
- const llvm::Type *Params[] = { DtorFnTy, Int8PtrTy, Int8PtrTy };
+ llvm::Type *Params[] = { DtorFnTy, Int8PtrTy, Int8PtrTy };
// Get the __cxa_atexit function type
// extern "C" int __cxa_atexit ( void (*f)(void *), void *p, void *d );
@@ -140,7 +149,7 @@ CodeGenFunction::EmitCXXGlobalDtorRegistration(llvm::Constant *DtorFn,
llvm::Value *Args[3] = { llvm::ConstantExpr::getBitCast(DtorFn, DtorFnTy),
llvm::ConstantExpr::getBitCast(DeclPtr, Int8PtrTy),
llvm::ConstantExpr::getBitCast(Handle, Int8PtrTy) };
- Builder.CreateCall(AtExitFn, &Args[0], llvm::array_endof(Args));
+ Builder.CreateCall(AtExitFn, Args);
}
void CodeGenFunction::EmitCXXGuardedInit(const VarDecl &D,
@@ -270,12 +279,11 @@ void CodeGenFunction::GenerateCXXGlobalVarDeclInitFunc(llvm::Function *Fn,
getTypes().getNullaryFunctionInfo(),
FunctionArgList(), SourceLocation());
- // Use guarded initialization if the global variable is weak due to
- // being a class template's static data member. These will always
- // have weak_odr linkage.
- if (Addr->getLinkage() == llvm::GlobalValue::WeakODRLinkage &&
- D->isStaticDataMember() &&
- D->getInstantiatedFromStaticDataMember()) {
+ // Use guarded initialization if the global variable is weak. This
+ // occurs for, e.g., instantiated static data members and
+ // definitions explicitly marked weak.
+ if (Addr->getLinkage() == llvm::GlobalValue::WeakODRLinkage ||
+ Addr->getLinkage() == llvm::GlobalValue::WeakAnyLinkage) {
EmitCXXGuardedInit(*D, Addr);
} else {
EmitCXXGlobalVarDeclInit(*D, Addr);
@@ -291,10 +299,21 @@ void CodeGenFunction::GenerateCXXGlobalInitFunc(llvm::Function *Fn,
getTypes().getNullaryFunctionInfo(),
FunctionArgList(), SourceLocation());
+ RunCleanupsScope Scope(*this);
+
+ // When building in Objective-C++ ARC mode, create an autorelease pool
+ // around the global initializers.
+ if (getLangOptions().ObjCAutoRefCount && getLangOptions().CPlusPlus) {
+ llvm::Value *token = EmitObjCAutoreleasePoolPush();
+ EmitObjCAutoreleasePoolCleanup(token);
+ }
+
for (unsigned i = 0; i != NumDecls; ++i)
if (Decls[i])
- Builder.CreateCall(Decls[i]);
+ Builder.CreateCall(Decls[i]);
+ Scope.ForceCleanup();
+
FinishFunction();
}
@@ -318,13 +337,13 @@ void CodeGenFunction::GenerateCXXGlobalDtorFunc(llvm::Function *Fn,
FinishFunction();
}
-/// GenerateCXXAggrDestructorHelper - Generates a helper function which when
-/// invoked, calls the default destructor on array elements in reverse order of
-/// construction.
+/// generateDestroyHelper - Generates a helper function which, when
+/// invoked, destroys the given object.
llvm::Function *
-CodeGenFunction::GenerateCXXAggrDestructorHelper(const CXXDestructorDecl *D,
- const ArrayType *Array,
- llvm::Value *This) {
+CodeGenFunction::generateDestroyHelper(llvm::Constant *addr,
+ QualType type,
+ Destroyer &destroyer,
+ bool useEHCleanupForArray) {
FunctionArgList args;
ImplicitParamDecl dst(0, SourceLocation(), 0, getContext().VoidPtrTy);
args.push_back(&dst);
@@ -333,19 +352,16 @@ CodeGenFunction::GenerateCXXAggrDestructorHelper(const CXXDestructorDecl *D,
CGM.getTypes().getFunctionInfo(getContext().VoidTy, args,
FunctionType::ExtInfo());
const llvm::FunctionType *FTy = CGM.getTypes().GetFunctionType(FI, false);
- llvm::Function *Fn =
+ llvm::Function *fn =
CreateGlobalInitOrDestructFunction(CGM, FTy, "__cxx_global_array_dtor");
- StartFunction(GlobalDecl(), getContext().VoidTy, Fn, FI, args,
+ StartFunction(GlobalDecl(), getContext().VoidTy, fn, FI, args,
SourceLocation());
- QualType BaseElementTy = getContext().getBaseElementType(Array);
- const llvm::Type *BasePtr = ConvertType(BaseElementTy)->getPointerTo();
- llvm::Value *BaseAddrPtr = Builder.CreateBitCast(This, BasePtr);
-
- EmitCXXAggrDestructorCall(D, Array, BaseAddrPtr);
+ emitDestroy(addr, type, destroyer, useEHCleanupForArray);
FinishFunction();
- return Fn;
+ return fn;
}
+
diff --git a/contrib/llvm/tools/clang/lib/CodeGen/CGException.cpp b/contrib/llvm/tools/clang/lib/CodeGen/CGException.cpp
index e8ad6da..418bea6 100644
--- a/contrib/llvm/tools/clang/lib/CodeGen/CGException.cpp
+++ b/contrib/llvm/tools/clang/lib/CodeGen/CGException.cpp
@@ -29,10 +29,9 @@ using namespace CodeGen;
static llvm::Constant *getAllocateExceptionFn(CodeGenFunction &CGF) {
// void *__cxa_allocate_exception(size_t thrown_size);
- const llvm::Type *SizeTy = CGF.ConvertType(CGF.getContext().getSizeType());
+ llvm::Type *ArgTys[] = { CGF.SizeTy };
const llvm::FunctionType *FTy =
- llvm::FunctionType::get(llvm::Type::getInt8PtrTy(CGF.getLLVMContext()),
- SizeTy, /*IsVarArgs=*/false);
+ llvm::FunctionType::get(CGF.Int8PtrTy, ArgTys, /*IsVarArgs=*/false);
return CGF.CGM.CreateRuntimeFunction(FTy, "__cxa_allocate_exception");
}
@@ -40,10 +39,9 @@ static llvm::Constant *getAllocateExceptionFn(CodeGenFunction &CGF) {
static llvm::Constant *getFreeExceptionFn(CodeGenFunction &CGF) {
// void __cxa_free_exception(void *thrown_exception);
- const llvm::Type *Int8PtrTy = llvm::Type::getInt8PtrTy(CGF.getLLVMContext());
+ llvm::Type *ArgTys[] = { CGF.Int8PtrTy };
const llvm::FunctionType *FTy =
- llvm::FunctionType::get(llvm::Type::getVoidTy(CGF.getLLVMContext()),
- Int8PtrTy, /*IsVarArgs=*/false);
+ llvm::FunctionType::get(CGF.VoidTy, ArgTys, /*IsVarArgs=*/false);
return CGF.CGM.CreateRuntimeFunction(FTy, "__cxa_free_exception");
}
@@ -52,11 +50,9 @@ static llvm::Constant *getThrowFn(CodeGenFunction &CGF) {
// void __cxa_throw(void *thrown_exception, std::type_info *tinfo,
// void (*dest) (void *));
- const llvm::Type *Int8PtrTy = llvm::Type::getInt8PtrTy(CGF.getLLVMContext());
- const llvm::Type *Args[3] = { Int8PtrTy, Int8PtrTy, Int8PtrTy };
+ llvm::Type *Args[3] = { CGF.Int8PtrTy, CGF.Int8PtrTy, CGF.Int8PtrTy };
const llvm::FunctionType *FTy =
- llvm::FunctionType::get(llvm::Type::getVoidTy(CGF.getLLVMContext()),
- Args, /*IsVarArgs=*/false);
+ llvm::FunctionType::get(CGF.VoidTy, Args, /*IsVarArgs=*/false);
return CGF.CGM.CreateRuntimeFunction(FTy, "__cxa_throw");
}
@@ -65,8 +61,7 @@ static llvm::Constant *getReThrowFn(CodeGenFunction &CGF) {
// void __cxa_rethrow();
const llvm::FunctionType *FTy =
- llvm::FunctionType::get(llvm::Type::getVoidTy(CGF.getLLVMContext()),
- /*IsVarArgs=*/false);
+ llvm::FunctionType::get(CGF.VoidTy, /*IsVarArgs=*/false);
return CGF.CGM.CreateRuntimeFunction(FTy, "__cxa_rethrow");
}
@@ -74,9 +69,9 @@ static llvm::Constant *getReThrowFn(CodeGenFunction &CGF) {
static llvm::Constant *getGetExceptionPtrFn(CodeGenFunction &CGF) {
// void *__cxa_get_exception_ptr(void*);
- const llvm::Type *Int8PtrTy = llvm::Type::getInt8PtrTy(CGF.getLLVMContext());
+ llvm::Type *ArgTys[] = { CGF.Int8PtrTy };
const llvm::FunctionType *FTy =
- llvm::FunctionType::get(Int8PtrTy, Int8PtrTy, /*IsVarArgs=*/false);
+ llvm::FunctionType::get(CGF.Int8PtrTy, ArgTys, /*IsVarArgs=*/false);
return CGF.CGM.CreateRuntimeFunction(FTy, "__cxa_get_exception_ptr");
}
@@ -84,9 +79,9 @@ static llvm::Constant *getGetExceptionPtrFn(CodeGenFunction &CGF) {
static llvm::Constant *getBeginCatchFn(CodeGenFunction &CGF) {
// void *__cxa_begin_catch(void*);
- const llvm::Type *Int8PtrTy = llvm::Type::getInt8PtrTy(CGF.getLLVMContext());
+ llvm::Type *ArgTys[] = { CGF.Int8PtrTy };
const llvm::FunctionType *FTy =
- llvm::FunctionType::get(Int8PtrTy, Int8PtrTy, /*IsVarArgs=*/false);
+ llvm::FunctionType::get(CGF.Int8PtrTy, ArgTys, /*IsVarArgs=*/false);
return CGF.CGM.CreateRuntimeFunction(FTy, "__cxa_begin_catch");
}
@@ -95,8 +90,7 @@ static llvm::Constant *getEndCatchFn(CodeGenFunction &CGF) {
// void __cxa_end_catch();
const llvm::FunctionType *FTy =
- llvm::FunctionType::get(llvm::Type::getVoidTy(CGF.getLLVMContext()),
- /*IsVarArgs=*/false);
+ llvm::FunctionType::get(CGF.VoidTy, /*IsVarArgs=*/false);
return CGF.CGM.CreateRuntimeFunction(FTy, "__cxa_end_catch");
}
@@ -104,17 +98,17 @@ static llvm::Constant *getEndCatchFn(CodeGenFunction &CGF) {
static llvm::Constant *getUnexpectedFn(CodeGenFunction &CGF) {
// void __cxa_call_unexepcted(void *thrown_exception);
- const llvm::Type *Int8PtrTy = llvm::Type::getInt8PtrTy(CGF.getLLVMContext());
+ llvm::Type *ArgTys[] = { CGF.Int8PtrTy };
const llvm::FunctionType *FTy =
- llvm::FunctionType::get(llvm::Type::getVoidTy(CGF.getLLVMContext()),
- Int8PtrTy, /*IsVarArgs=*/false);
+ llvm::FunctionType::get(CGF.VoidTy, ArgTys, /*IsVarArgs=*/false);
return CGF.CGM.CreateRuntimeFunction(FTy, "__cxa_call_unexpected");
}
llvm::Constant *CodeGenFunction::getUnwindResumeFn() {
+ llvm::Type *ArgTys[] = { Int8PtrTy };
const llvm::FunctionType *FTy =
- llvm::FunctionType::get(VoidTy, Int8PtrTy, /*IsVarArgs=*/false);
+ llvm::FunctionType::get(VoidTy, ArgTys, /*IsVarArgs=*/false);
if (CGM.getLangOptions().SjLjExceptions)
return CGM.CreateRuntimeFunction(FTy, "_Unwind_SjLj_Resume");
@@ -122,8 +116,9 @@ llvm::Constant *CodeGenFunction::getUnwindResumeFn() {
}
llvm::Constant *CodeGenFunction::getUnwindResumeOrRethrowFn() {
+ llvm::Type *ArgTys[] = { Int8PtrTy };
const llvm::FunctionType *FTy =
- llvm::FunctionType::get(VoidTy, Int8PtrTy, /*IsVarArgs=*/false);
+ llvm::FunctionType::get(VoidTy, ArgTys, /*IsVarArgs=*/false);
if (CGM.getLangOptions().SjLjExceptions)
return CGM.CreateRuntimeFunction(FTy, "_Unwind_SjLj_Resume_or_Rethrow");
@@ -134,20 +129,26 @@ static llvm::Constant *getTerminateFn(CodeGenFunction &CGF) {
// void __terminate();
const llvm::FunctionType *FTy =
- llvm::FunctionType::get(llvm::Type::getVoidTy(CGF.getLLVMContext()),
- /*IsVarArgs=*/false);
+ llvm::FunctionType::get(CGF.VoidTy, /*IsVarArgs=*/false);
- return CGF.CGM.CreateRuntimeFunction(FTy,
- CGF.CGM.getLangOptions().CPlusPlus ? "_ZSt9terminatev" : "abort");
+ llvm::StringRef name;
+
+ // In C++, use std::terminate().
+ if (CGF.getLangOptions().CPlusPlus)
+ name = "_ZSt9terminatev"; // FIXME: mangling!
+ else if (CGF.getLangOptions().ObjC1 &&
+ CGF.CGM.getCodeGenOpts().ObjCRuntimeHasTerminate)
+ name = "objc_terminate";
+ else
+ name = "abort";
+ return CGF.CGM.CreateRuntimeFunction(FTy, name);
}
static llvm::Constant *getCatchallRethrowFn(CodeGenFunction &CGF,
llvm::StringRef Name) {
- const llvm::Type *Int8PtrTy =
- llvm::Type::getInt8PtrTy(CGF.getLLVMContext());
- const llvm::Type *VoidTy = llvm::Type::getVoidTy(CGF.getLLVMContext());
- const llvm::FunctionType *FTy = llvm::FunctionType::get(VoidTy, Int8PtrTy,
- /*IsVarArgs=*/false);
+ llvm::Type *ArgTys[] = { CGF.Int8PtrTy };
+ const llvm::FunctionType *FTy =
+ llvm::FunctionType::get(CGF.VoidTy, ArgTys, /*IsVarArgs=*/false);
return CGF.CGM.CreateRuntimeFunction(FTy, Name);
}
@@ -322,9 +323,10 @@ static llvm::Constant *getCleanupValue(CodeGenFunction &CGF) {
namespace {
/// A cleanup to free the exception object if its initialization
/// throws.
- struct FreeException {
- static void Emit(CodeGenFunction &CGF, bool forEH,
- llvm::Value *exn) {
+ struct FreeException : EHScopeStack::Cleanup {
+ llvm::Value *exn;
+ FreeException(llvm::Value *exn) : exn(exn) {}
+ void Emit(CodeGenFunction &CGF, Flags flags) {
CGF.Builder.CreateCall(getFreeExceptionFn(CGF), exn)
->setDoesNotThrow();
}
@@ -354,7 +356,8 @@ static void EmitAnyExprToExn(CodeGenFunction &CGF, const Expr *e,
// evaluated but before the exception is caught. But the best way
// to handle that is to teach EmitAggExpr to do the final copy
// differently if it can't be elided.
- CGF.EmitAnyExprToMem(e, typedAddr, /*Volatile*/ false, /*IsInit*/ true);
+ CGF.EmitAnyExprToMem(e, typedAddr, e->getType().getQualifiers(),
+ /*IsInit*/ true);
// Deactivate the cleanup block.
CGF.DeactivateCleanupBlock(cleanup);
@@ -407,7 +410,6 @@ void CodeGenFunction::EmitCXXThrowExpr(const CXXThrowExpr *E) {
EmitAnyExprToExn(*this, E->getSubExpr(), ExceptionPtr);
// Now throw the exception.
- const llvm::Type *Int8PtrTy = llvm::Type::getInt8PtrTy(getLLVMContext());
llvm::Constant *TypeInfo = CGM.GetAddrOfRTTIDescriptor(ThrowType,
/*ForEH=*/true);
@@ -786,7 +788,7 @@ llvm::BasicBlock *CodeGenFunction::EmitLandingPad() {
// Tell the backend how to generate the landing pad.
llvm::CallInst *Selection =
Builder.CreateCall(CGM.getIntrinsic(llvm::Intrinsic::eh_selector),
- EHSelector.begin(), EHSelector.end(), "eh.selector");
+ EHSelector, "eh.selector");
Selection->setDoesNotThrow();
// Save the selector value in mandatory-cleanup mode.
@@ -920,13 +922,13 @@ namespace {
CallEndCatch(bool MightThrow) : MightThrow(MightThrow) {}
bool MightThrow;
- void Emit(CodeGenFunction &CGF, bool IsForEH) {
+ void Emit(CodeGenFunction &CGF, Flags flags) {
if (!MightThrow) {
CGF.Builder.CreateCall(getEndCatchFn(CGF))->setDoesNotThrow();
return;
}
- CGF.EmitCallOrInvoke(getEndCatchFn(CGF), 0, 0);
+ CGF.EmitCallOrInvoke(getEndCatchFn(CGF));
}
};
}
@@ -1084,7 +1086,8 @@ static void InitCatchParam(CodeGenFunction &CGF,
CGF.EHStack.pushTerminate();
// Perform the copy construction.
- CGF.EmitAggExpr(copyExpr, AggValueSlot::forAddr(ParamAddr, false, false));
+ CGF.EmitAggExpr(copyExpr, AggValueSlot::forAddr(ParamAddr, Qualifiers(),
+ false));
// Leave the terminate scope.
CGF.EHStack.popTerminate();
@@ -1137,8 +1140,8 @@ static void BeginCatch(CodeGenFunction &CGF, const CXXCatchStmt *S) {
namespace {
struct CallRethrow : EHScopeStack::Cleanup {
- void Emit(CodeGenFunction &CGF, bool IsForEH) {
- CGF.EmitCallOrInvoke(getReThrowFn(CGF), 0, 0);
+ void Emit(CodeGenFunction &CGF, Flags flags) {
+ CGF.EmitCallOrInvoke(getReThrowFn(CGF));
}
};
}
@@ -1209,7 +1212,7 @@ namespace {
CallEndCatchForFinally(llvm::Value *ForEHVar, llvm::Value *EndCatchFn)
: ForEHVar(ForEHVar), EndCatchFn(EndCatchFn) {}
- void Emit(CodeGenFunction &CGF, bool IsForEH) {
+ void Emit(CodeGenFunction &CGF, Flags flags) {
llvm::BasicBlock *EndCatchBB = CGF.createBasicBlock("finally.endcatch");
llvm::BasicBlock *CleanupContBB =
CGF.createBasicBlock("finally.cleanup.cont");
@@ -1218,7 +1221,7 @@ namespace {
CGF.Builder.CreateLoad(ForEHVar, "finally.endcatch");
CGF.Builder.CreateCondBr(ShouldEndCatch, EndCatchBB, CleanupContBB);
CGF.EmitBlock(EndCatchBB);
- CGF.EmitCallOrInvoke(EndCatchFn, 0, 0); // catch-all, so might throw
+ CGF.EmitCallOrInvoke(EndCatchFn); // catch-all, so might throw
CGF.EmitBlock(CleanupContBB);
}
};
@@ -1236,7 +1239,7 @@ namespace {
: Body(Body), ForEHVar(ForEHVar), EndCatchFn(EndCatchFn),
RethrowFn(RethrowFn), SavedExnVar(SavedExnVar) {}
- void Emit(CodeGenFunction &CGF, bool IsForEH) {
+ void Emit(CodeGenFunction &CGF, Flags flags) {
// Enter a cleanup to call the end-catch function if one was provided.
if (EndCatchFn)
CGF.EHStack.pushCleanup<CallEndCatchForFinally>(NormalAndEHCleanup,
@@ -1263,10 +1266,9 @@ namespace {
CGF.EmitBlock(RethrowBB);
if (SavedExnVar) {
- llvm::Value *Args[] = { CGF.Builder.CreateLoad(SavedExnVar) };
- CGF.EmitCallOrInvoke(RethrowFn, Args, Args+1);
+ CGF.EmitCallOrInvoke(RethrowFn, CGF.Builder.CreateLoad(SavedExnVar));
} else {
- CGF.EmitCallOrInvoke(RethrowFn, 0, 0);
+ CGF.EmitCallOrInvoke(RethrowFn);
}
CGF.Builder.CreateUnreachable();
@@ -1296,14 +1298,16 @@ namespace {
/// Enters a finally block for an implementation using zero-cost
/// exceptions. This is mostly general, but hard-codes some
/// language/ABI-specific behavior in the catch-all sections.
-CodeGenFunction::FinallyInfo
-CodeGenFunction::EnterFinallyBlock(const Stmt *Body,
- llvm::Constant *BeginCatchFn,
- llvm::Constant *EndCatchFn,
- llvm::Constant *RethrowFn) {
- assert((BeginCatchFn != 0) == (EndCatchFn != 0) &&
+void CodeGenFunction::FinallyInfo::enter(CodeGenFunction &CGF,
+ const Stmt *body,
+ llvm::Constant *beginCatchFn,
+ llvm::Constant *endCatchFn,
+ llvm::Constant *rethrowFn) {
+ assert((beginCatchFn != 0) == (endCatchFn != 0) &&
"begin/end catch functions not paired");
- assert(RethrowFn && "rethrow function is required");
+ assert(rethrowFn && "rethrow function is required");
+
+ BeginCatchFn = beginCatchFn;
// The rethrow function has one of the following two types:
// void (*)()
@@ -1311,13 +1315,12 @@ CodeGenFunction::EnterFinallyBlock(const Stmt *Body,
// In the latter case we need to pass it the exception object.
// But we can't use the exception slot because the @finally might
// have a landing pad (which would overwrite the exception slot).
- const llvm::FunctionType *RethrowFnTy =
+ const llvm::FunctionType *rethrowFnTy =
cast<llvm::FunctionType>(
- cast<llvm::PointerType>(RethrowFn->getType())
- ->getElementType());
- llvm::Value *SavedExnVar = 0;
- if (RethrowFnTy->getNumParams())
- SavedExnVar = CreateTempAlloca(Builder.getInt8PtrTy(), "finally.exn");
+ cast<llvm::PointerType>(rethrowFn->getType())->getElementType());
+ SavedExnVar = 0;
+ if (rethrowFnTy->getNumParams())
+ SavedExnVar = CGF.CreateTempAlloca(CGF.Int8PtrTy, "finally.exn");
// A finally block is a statement which must be executed on any edge
// out of a given scope. Unlike a cleanup, the finally block may
@@ -1331,67 +1334,64 @@ CodeGenFunction::EnterFinallyBlock(const Stmt *Body,
// The finally block itself is generated in the context of a cleanup
// which conditionally leaves the catch-all.
- FinallyInfo Info;
-
// Jump destination for performing the finally block on an exception
// edge. We'll never actually reach this block, so unreachable is
// fine.
- JumpDest RethrowDest = getJumpDestInCurrentScope(getUnreachableBlock());
+ RethrowDest = CGF.getJumpDestInCurrentScope(CGF.getUnreachableBlock());
// Whether the finally block is being executed for EH purposes.
- llvm::AllocaInst *ForEHVar = CreateTempAlloca(Builder.getInt1Ty(),
- "finally.for-eh");
- InitTempAlloca(ForEHVar, llvm::ConstantInt::getFalse(getLLVMContext()));
+ ForEHVar = CGF.CreateTempAlloca(CGF.Builder.getInt1Ty(), "finally.for-eh");
+ CGF.Builder.CreateStore(CGF.Builder.getFalse(), ForEHVar);
// Enter a normal cleanup which will perform the @finally block.
- EHStack.pushCleanup<PerformFinally>(NormalCleanup, Body,
- ForEHVar, EndCatchFn,
- RethrowFn, SavedExnVar);
+ CGF.EHStack.pushCleanup<PerformFinally>(NormalCleanup, body,
+ ForEHVar, endCatchFn,
+ rethrowFn, SavedExnVar);
// Enter a catch-all scope.
- llvm::BasicBlock *CatchAllBB = createBasicBlock("finally.catchall");
- CGBuilderTy::InsertPoint SavedIP = Builder.saveIP();
- Builder.SetInsertPoint(CatchAllBB);
-
- // If there's a begin-catch function, call it.
- if (BeginCatchFn) {
- Builder.CreateCall(BeginCatchFn, Builder.CreateLoad(getExceptionSlot()))
- ->setDoesNotThrow();
- }
-
- // If we need to remember the exception pointer to rethrow later, do so.
- if (SavedExnVar) {
- llvm::Value *SavedExn = Builder.CreateLoad(getExceptionSlot());
- Builder.CreateStore(SavedExn, SavedExnVar);
- }
+ llvm::BasicBlock *catchBB = CGF.createBasicBlock("finally.catchall");
+ EHCatchScope *catchScope = CGF.EHStack.pushCatch(1);
+ catchScope->setCatchAllHandler(0, catchBB);
+}
- // Tell the finally block that we're in EH.
- Builder.CreateStore(llvm::ConstantInt::getTrue(getLLVMContext()), ForEHVar);
+void CodeGenFunction::FinallyInfo::exit(CodeGenFunction &CGF) {
+ // Leave the finally catch-all.
+ EHCatchScope &catchScope = cast<EHCatchScope>(*CGF.EHStack.begin());
+ llvm::BasicBlock *catchBB = catchScope.getHandler(0).Block;
+ CGF.EHStack.popCatch();
- // Thread a jump through the finally cleanup.
- EmitBranchThroughCleanup(RethrowDest);
+ // If there are any references to the catch-all block, emit it.
+ if (catchBB->use_empty()) {
+ delete catchBB;
+ } else {
+ CGBuilderTy::InsertPoint savedIP = CGF.Builder.saveAndClearIP();
+ CGF.EmitBlock(catchBB);
- Builder.restoreIP(SavedIP);
+ llvm::Value *exn = 0;
- EHCatchScope *CatchScope = EHStack.pushCatch(1);
- CatchScope->setCatchAllHandler(0, CatchAllBB);
+ // If there's a begin-catch function, call it.
+ if (BeginCatchFn) {
+ exn = CGF.Builder.CreateLoad(CGF.getExceptionSlot());
+ CGF.Builder.CreateCall(BeginCatchFn, exn)->setDoesNotThrow();
+ }
- return Info;
-}
+ // If we need to remember the exception pointer to rethrow later, do so.
+ if (SavedExnVar) {
+ if (!exn) exn = CGF.Builder.CreateLoad(CGF.getExceptionSlot());
+ CGF.Builder.CreateStore(exn, SavedExnVar);
+ }
-void CodeGenFunction::ExitFinallyBlock(FinallyInfo &Info) {
- // Leave the finally catch-all.
- EHCatchScope &Catch = cast<EHCatchScope>(*EHStack.begin());
- llvm::BasicBlock *CatchAllBB = Catch.getHandler(0).Block;
- EHStack.popCatch();
+ // Tell the cleanups in the finally block that we're do this for EH.
+ CGF.Builder.CreateStore(CGF.Builder.getTrue(), ForEHVar);
- // And leave the normal cleanup.
- PopCleanupBlock();
+ // Thread a jump through the finally cleanup.
+ CGF.EmitBranchThroughCleanup(RethrowDest);
- CGBuilderTy::InsertPoint SavedIP = Builder.saveAndClearIP();
- EmitBlock(CatchAllBB, true);
+ CGF.Builder.restoreIP(savedIP);
+ }
- Builder.restoreIP(SavedIP);
+ // Finally, leave the @finally cleanup.
+ CGF.PopCleanupBlock();
}
llvm::BasicBlock *CodeGenFunction::getTerminateLandingPad() {
@@ -1416,7 +1416,7 @@ llvm::BasicBlock *CodeGenFunction::getTerminateLandingPad() {
llvm::Value *Args[3] = { Exn, getOpaquePersonalityFn(CGM, Personality),
getCatchAllValue(*this) };
Builder.CreateCall(CGM.getIntrinsic(llvm::Intrinsic::eh_selector),
- Args, Args+3, "eh.selector")
+ Args, "eh.selector")
->setDoesNotThrow();
llvm::CallInst *TerminateCall = Builder.CreateCall(getTerminateFn(*this));
diff --git a/contrib/llvm/tools/clang/lib/CodeGen/CGExpr.cpp b/contrib/llvm/tools/clang/lib/CodeGen/CGExpr.cpp
index 2f6b55b..a7e8003 100644
--- a/contrib/llvm/tools/clang/lib/CodeGen/CGExpr.cpp
+++ b/contrib/llvm/tools/clang/lib/CodeGen/CGExpr.cpp
@@ -20,8 +20,8 @@
#include "CGObjCRuntime.h"
#include "clang/AST/ASTContext.h"
#include "clang/AST/DeclObjC.h"
-#include "llvm/Intrinsics.h"
#include "clang/Frontend/CodeGenOptions.h"
+#include "llvm/Intrinsics.h"
#include "llvm/Target/TargetData.h"
using namespace clang;
using namespace CodeGen;
@@ -131,16 +131,16 @@ RValue CodeGenFunction::EmitAnyExprToTemp(const Expr *E) {
/// location.
void CodeGenFunction::EmitAnyExprToMem(const Expr *E,
llvm::Value *Location,
- bool IsLocationVolatile,
+ Qualifiers Quals,
bool IsInit) {
- if (E->getType()->isComplexType())
- EmitComplexExprIntoAddr(E, Location, IsLocationVolatile);
+ if (E->getType()->isAnyComplexType())
+ EmitComplexExprIntoAddr(E, Location, Quals.hasVolatile());
else if (hasAggregateLLVMType(E->getType()))
- EmitAggExpr(E, AggValueSlot::forAddr(Location, IsLocationVolatile, IsInit));
+ EmitAggExpr(E, AggValueSlot::forAddr(Location, Quals, IsInit));
else {
RValue RV = RValue::get(EmitScalarExpr(E, /*Ignore*/ false));
LValue LV = MakeAddrLValue(Location, E->getType());
- EmitStoreThroughLValue(RV, LV, E->getType());
+ EmitStoreThroughLValue(RV, LV);
}
}
@@ -203,7 +203,24 @@ static llvm::Value *
EmitExprForReferenceBinding(CodeGenFunction &CGF, const Expr *E,
llvm::Value *&ReferenceTemporary,
const CXXDestructorDecl *&ReferenceTemporaryDtor,
+ QualType &ObjCARCReferenceLifetimeType,
const NamedDecl *InitializedDecl) {
+ // Look through expressions for materialized temporaries (for now).
+ if (const MaterializeTemporaryExpr *M
+ = dyn_cast<MaterializeTemporaryExpr>(E)) {
+ // Objective-C++ ARC:
+ // If we are binding a reference to a temporary that has ownership, we
+ // need to perform retain/release operations on the temporary.
+ if (CGF.getContext().getLangOptions().ObjCAutoRefCount &&
+ E->getType()->isObjCLifetimeType() &&
+ (E->getType().getObjCLifetime() == Qualifiers::OCL_Strong ||
+ E->getType().getObjCLifetime() == Qualifiers::OCL_Weak ||
+ E->getType().getObjCLifetime() == Qualifiers::OCL_Autoreleasing))
+ ObjCARCReferenceLifetimeType = E->getType();
+
+ E = M->GetTemporaryExpr();
+ }
+
if (const CXXDefaultArgExpr *DAE = dyn_cast<CXXDefaultArgExpr>(E))
E = DAE->getExpr();
@@ -213,6 +230,7 @@ EmitExprForReferenceBinding(CodeGenFunction &CGF, const Expr *E,
return EmitExprForReferenceBinding(CGF, TE->getSubExpr(),
ReferenceTemporary,
ReferenceTemporaryDtor,
+ ObjCARCReferenceLifetimeType,
InitializedDecl);
}
@@ -229,12 +247,69 @@ EmitExprForReferenceBinding(CodeGenFunction &CGF, const Expr *E,
RV = CGF.EmitLoadOfPropertyRefLValue(LV);
return RV.getScalarVal();
}
+
if (LV.isSimple())
return LV.getAddress();
// We have to load the lvalue.
- RV = CGF.EmitLoadOfLValue(LV, E->getType());
+ RV = CGF.EmitLoadOfLValue(LV);
} else {
+ if (!ObjCARCReferenceLifetimeType.isNull()) {
+ ReferenceTemporary = CreateReferenceTemporary(CGF,
+ ObjCARCReferenceLifetimeType,
+ InitializedDecl);
+
+
+ LValue RefTempDst = CGF.MakeAddrLValue(ReferenceTemporary,
+ ObjCARCReferenceLifetimeType);
+
+ CGF.EmitScalarInit(E, dyn_cast_or_null<ValueDecl>(InitializedDecl),
+ RefTempDst, false);
+
+ bool ExtendsLifeOfTemporary = false;
+ if (const VarDecl *Var = dyn_cast_or_null<VarDecl>(InitializedDecl)) {
+ if (Var->extendsLifetimeOfTemporary())
+ ExtendsLifeOfTemporary = true;
+ } else if (InitializedDecl && isa<FieldDecl>(InitializedDecl)) {
+ ExtendsLifeOfTemporary = true;
+ }
+
+ if (!ExtendsLifeOfTemporary) {
+ // Since the lifetime of this temporary isn't going to be extended,
+ // we need to clean it up ourselves at the end of the full expression.
+ switch (ObjCARCReferenceLifetimeType.getObjCLifetime()) {
+ case Qualifiers::OCL_None:
+ case Qualifiers::OCL_ExplicitNone:
+ case Qualifiers::OCL_Autoreleasing:
+ break;
+
+ case Qualifiers::OCL_Strong: {
+ assert(!ObjCARCReferenceLifetimeType->isArrayType());
+ CleanupKind cleanupKind = CGF.getARCCleanupKind();
+ CGF.pushDestroy(cleanupKind,
+ ReferenceTemporary,
+ ObjCARCReferenceLifetimeType,
+ CodeGenFunction::destroyARCStrongImprecise,
+ cleanupKind & EHCleanup);
+ break;
+ }
+
+ case Qualifiers::OCL_Weak:
+ assert(!ObjCARCReferenceLifetimeType->isArrayType());
+ CGF.pushDestroy(NormalAndEHCleanup,
+ ReferenceTemporary,
+ ObjCARCReferenceLifetimeType,
+ CodeGenFunction::destroyARCWeak,
+ /*useEHCleanupForArray*/ true);
+ break;
+ }
+
+ ObjCARCReferenceLifetimeType = QualType();
+ }
+
+ return ReferenceTemporary;
+ }
+
llvm::SmallVector<SubobjectAdjustment, 2> Adjustments;
while (true) {
E = E->IgnoreParens();
@@ -279,12 +354,10 @@ EmitExprForReferenceBinding(CodeGenFunction &CGF, const Expr *E,
!E->getType()->isAnyComplexType()) {
ReferenceTemporary = CreateReferenceTemporary(CGF, E->getType(),
InitializedDecl);
- AggSlot = AggValueSlot::forAddr(ReferenceTemporary, false,
+ AggSlot = AggValueSlot::forAddr(ReferenceTemporary, Qualifiers(),
InitializedDecl != 0);
}
-
- RV = CGF.EmitAnyExpr(E, AggSlot);
-
+
if (InitializedDecl) {
// Get the destructor for the reference temporary.
if (const RecordType *RT = E->getType()->getAs<RecordType>()) {
@@ -294,6 +367,8 @@ EmitExprForReferenceBinding(CodeGenFunction &CGF, const Expr *E,
}
}
+ RV = CGF.EmitAnyExpr(E, AggSlot);
+
// Check if need to perform derived-to-base casts and/or field accesses, to
// get from the temporary object we created (and, potentially, for which we
// extended the lifetime) to the subobject we're binding the reference to.
@@ -326,7 +401,7 @@ EmitExprForReferenceBinding(CodeGenFunction &CGF, const Expr *E,
Object = CreateReferenceTemporary(CGF, T, InitializedDecl);
LValue TempLV = CGF.MakeAddrLValue(Object,
Adjustment.Field->getType());
- CGF.EmitStoreThroughLValue(CGF.EmitLoadOfLValue(LV, T), TempLV, T);
+ CGF.EmitStoreThroughLValue(CGF.EmitLoadOfLValue(LV), TempLV);
break;
}
@@ -361,26 +436,65 @@ CodeGenFunction::EmitReferenceBindingToExpr(const Expr *E,
const NamedDecl *InitializedDecl) {
llvm::Value *ReferenceTemporary = 0;
const CXXDestructorDecl *ReferenceTemporaryDtor = 0;
+ QualType ObjCARCReferenceLifetimeType;
llvm::Value *Value = EmitExprForReferenceBinding(*this, E, ReferenceTemporary,
ReferenceTemporaryDtor,
+ ObjCARCReferenceLifetimeType,
InitializedDecl);
- if (!ReferenceTemporaryDtor)
+ if (!ReferenceTemporaryDtor && ObjCARCReferenceLifetimeType.isNull())
return RValue::get(Value);
// Make sure to call the destructor for the reference temporary.
- if (const VarDecl *VD = dyn_cast_or_null<VarDecl>(InitializedDecl)) {
- if (VD->hasGlobalStorage()) {
+ const VarDecl *VD = dyn_cast_or_null<VarDecl>(InitializedDecl);
+ if (VD && VD->hasGlobalStorage()) {
+ if (ReferenceTemporaryDtor) {
llvm::Constant *DtorFn =
CGM.GetAddrOfCXXDestructor(ReferenceTemporaryDtor, Dtor_Complete);
EmitCXXGlobalDtorRegistration(DtorFn,
cast<llvm::Constant>(ReferenceTemporary));
-
- return RValue::get(Value);
+ } else {
+ assert(!ObjCARCReferenceLifetimeType.isNull());
+ // Note: We intentionally do not register a global "destructor" to
+ // release the object.
}
+
+ return RValue::get(Value);
}
- PushDestructorCleanup(ReferenceTemporaryDtor, ReferenceTemporary);
-
+ if (ReferenceTemporaryDtor)
+ PushDestructorCleanup(ReferenceTemporaryDtor, ReferenceTemporary);
+ else {
+ switch (ObjCARCReferenceLifetimeType.getObjCLifetime()) {
+ case Qualifiers::OCL_None:
+ assert(0 && "Not a reference temporary that needs to be deallocated");
+ case Qualifiers::OCL_ExplicitNone:
+ case Qualifiers::OCL_Autoreleasing:
+ // Nothing to do.
+ break;
+
+ case Qualifiers::OCL_Strong: {
+ bool precise = VD && VD->hasAttr<ObjCPreciseLifetimeAttr>();
+ CleanupKind cleanupKind = getARCCleanupKind();
+ // This local is a GCC and MSVC compiler workaround.
+ Destroyer *destroyer = precise ? &destroyARCStrongPrecise :
+ &destroyARCStrongImprecise;
+ pushDestroy(cleanupKind, ReferenceTemporary, ObjCARCReferenceLifetimeType,
+ *destroyer, cleanupKind & EHCleanup);
+ break;
+ }
+
+ case Qualifiers::OCL_Weak: {
+ // This local is a GCC and MSVC compiler workaround.
+ Destroyer *destroyer = &destroyARCWeak;
+ // __weak objects always get EH cleanups; otherwise, exceptions
+ // could cause really nasty crashes instead of mere leaks.
+ pushDestroy(NormalAndEHCleanup, ReferenceTemporary,
+ ObjCARCReferenceLifetimeType, *destroyer, true);
+ break;
+ }
+ }
+ }
+
return RValue::get(Value);
}
@@ -402,8 +516,7 @@ void CodeGenFunction::EmitCheck(llvm::Value *Address, unsigned Size) {
// This needs to be to the standard address space.
Address = Builder.CreateBitCast(Address, Int8PtrTy);
- const llvm::Type *IntPtrT = IntPtrTy;
- llvm::Value *F = CGM.getIntrinsic(llvm::Intrinsic::objectsize, &IntPtrT, 1);
+ llvm::Value *F = CGM.getIntrinsic(llvm::Intrinsic::objectsize, IntPtrTy);
// In time, people may want to control this and use a 1 here.
llvm::Value *Arg = Builder.getFalse();
@@ -592,6 +705,8 @@ LValue CodeGenFunction::EmitLValue(const Expr *E) {
return EmitLValue(cast<ChooseExpr>(E)->getChosenSubExpr(getContext()));
case Expr::OpaqueValueExprClass:
return EmitOpaqueValueLValue(cast<OpaqueValueExpr>(E));
+ case Expr::SubstNonTypeTemplateParmExprClass:
+ return EmitLValue(cast<SubstNonTypeTemplateParmExpr>(E)->getReplacement());
case Expr::ImplicitCastExprClass:
case Expr::CStyleCastExprClass:
case Expr::CXXFunctionalCastExprClass:
@@ -599,10 +714,20 @@ LValue CodeGenFunction::EmitLValue(const Expr *E) {
case Expr::CXXDynamicCastExprClass:
case Expr::CXXReinterpretCastExprClass:
case Expr::CXXConstCastExprClass:
+ case Expr::ObjCBridgedCastExprClass:
return EmitCastLValue(cast<CastExpr>(E));
+
+ case Expr::MaterializeTemporaryExprClass:
+ return EmitMaterializeTemporaryExpr(cast<MaterializeTemporaryExpr>(E));
}
}
+llvm::Value *CodeGenFunction::EmitLoadOfScalar(LValue lvalue) {
+ return EmitLoadOfScalar(lvalue.getAddress(), lvalue.isVolatile(),
+ lvalue.getAlignment(), lvalue.getType(),
+ lvalue.getTBAAInfo());
+}
+
llvm::Value *CodeGenFunction::EmitLoadOfScalar(llvm::Value *Addr, bool Volatile,
unsigned Alignment, QualType Ty,
llvm::MDNode *TBAAInfo) {
@@ -651,6 +776,7 @@ void CodeGenFunction::EmitStoreOfScalar(llvm::Value *Value, llvm::Value *Addr,
QualType Ty,
llvm::MDNode *TBAAInfo) {
Value = EmitToMemory(Value, Ty);
+
llvm::StoreInst *Store = Builder.CreateStore(Value, Addr, Volatile);
if (Alignment)
Store->setAlignment(Alignment);
@@ -658,29 +784,30 @@ void CodeGenFunction::EmitStoreOfScalar(llvm::Value *Value, llvm::Value *Addr,
CGM.DecorateInstruction(Store, TBAAInfo);
}
+void CodeGenFunction::EmitStoreOfScalar(llvm::Value *value, LValue lvalue) {
+ EmitStoreOfScalar(value, lvalue.getAddress(), lvalue.isVolatile(),
+ lvalue.getAlignment(), lvalue.getType(),
+ lvalue.getTBAAInfo());
+}
+
/// EmitLoadOfLValue - Given an expression that represents a value lvalue, this
/// method emits the address of the lvalue, then loads the result as an rvalue,
/// returning the rvalue.
-RValue CodeGenFunction::EmitLoadOfLValue(LValue LV, QualType ExprType) {
+RValue CodeGenFunction::EmitLoadOfLValue(LValue LV) {
if (LV.isObjCWeak()) {
// load of a __weak object.
llvm::Value *AddrWeakObj = LV.getAddress();
return RValue::get(CGM.getObjCRuntime().EmitObjCWeakRead(*this,
AddrWeakObj));
}
+ if (LV.getQuals().getObjCLifetime() == Qualifiers::OCL_Weak)
+ return RValue::get(EmitARCLoadWeak(LV.getAddress()));
if (LV.isSimple()) {
- llvm::Value *Ptr = LV.getAddress();
-
- // Functions are l-values that don't require loading.
- if (ExprType->isFunctionType())
- return RValue::get(Ptr);
+ assert(!LV.getType()->isFunctionType());
// Everything needs a load.
- return RValue::get(EmitLoadOfScalar(Ptr, LV.isVolatileQualified(),
- LV.getAlignment(), ExprType,
- LV.getTBAAInfo()));
-
+ return RValue::get(EmitLoadOfScalar(LV));
}
if (LV.isVectorElt()) {
@@ -693,21 +820,20 @@ RValue CodeGenFunction::EmitLoadOfLValue(LValue LV, QualType ExprType) {
// If this is a reference to a subset of the elements of a vector, either
// shuffle the input or extract/insert them as appropriate.
if (LV.isExtVectorElt())
- return EmitLoadOfExtVectorElementLValue(LV, ExprType);
+ return EmitLoadOfExtVectorElementLValue(LV);
if (LV.isBitField())
- return EmitLoadOfBitfieldLValue(LV, ExprType);
+ return EmitLoadOfBitfieldLValue(LV);
assert(LV.isPropertyRef() && "Unknown LValue type!");
return EmitLoadOfPropertyRefLValue(LV);
}
-RValue CodeGenFunction::EmitLoadOfBitfieldLValue(LValue LV,
- QualType ExprType) {
+RValue CodeGenFunction::EmitLoadOfBitfieldLValue(LValue LV) {
const CGBitFieldInfo &Info = LV.getBitFieldInfo();
// Get the output type.
- const llvm::Type *ResLTy = ConvertType(ExprType);
+ const llvm::Type *ResLTy = ConvertType(LV.getType());
unsigned ResSizeInBits = CGM.getTargetData().getTypeSizeInBits(ResLTy);
// Compute the result as an OR of all of the individual component accesses.
@@ -733,7 +859,7 @@ RValue CodeGenFunction::EmitLoadOfBitfieldLValue(LValue LV,
// Cast to the access type.
const llvm::Type *PTy = llvm::Type::getIntNPtrTy(getLLVMContext(),
AI.AccessWidth,
- CGM.getContext().getTargetAddressSpace(ExprType));
+ CGM.getContext().getTargetAddressSpace(LV.getType()));
Ptr = Builder.CreateBitCast(Ptr, PTy);
// Perform the load.
@@ -777,8 +903,7 @@ RValue CodeGenFunction::EmitLoadOfBitfieldLValue(LValue LV,
// If this is a reference to a subset of the elements of a vector, create an
// appropriate shufflevector.
-RValue CodeGenFunction::EmitLoadOfExtVectorElementLValue(LValue LV,
- QualType ExprType) {
+RValue CodeGenFunction::EmitLoadOfExtVectorElementLValue(LValue LV) {
llvm::Value *Vec = Builder.CreateLoad(LV.getExtVectorAddr(),
LV.isVolatileQualified(), "tmp");
@@ -786,7 +911,7 @@ RValue CodeGenFunction::EmitLoadOfExtVectorElementLValue(LValue LV,
// If the result of the expression is a non-vector type, we must be extracting
// a single element. Just codegen as an extractelement.
- const VectorType *ExprVT = ExprType->getAs<VectorType>();
+ const VectorType *ExprVT = LV.getType()->getAs<VectorType>();
if (!ExprVT) {
unsigned InIdx = getAccessedFieldNo(0, Elts);
llvm::Value *Elt = llvm::ConstantInt::get(Int32Ty, InIdx);
@@ -813,8 +938,7 @@ RValue CodeGenFunction::EmitLoadOfExtVectorElementLValue(LValue LV,
/// EmitStoreThroughLValue - Store the specified rvalue into the specified
/// lvalue, where both are guaranteed to the have the same type, and that type
/// is 'Ty'.
-void CodeGenFunction::EmitStoreThroughLValue(RValue Src, LValue Dst,
- QualType Ty) {
+void CodeGenFunction::EmitStoreThroughLValue(RValue Src, LValue Dst) {
if (!Dst.isSimple()) {
if (Dst.isVectorElt()) {
// Read/modify/write the vector, inserting the new element.
@@ -829,15 +953,41 @@ void CodeGenFunction::EmitStoreThroughLValue(RValue Src, LValue Dst,
// If this is an update of extended vector elements, insert them as
// appropriate.
if (Dst.isExtVectorElt())
- return EmitStoreThroughExtVectorComponentLValue(Src, Dst, Ty);
+ return EmitStoreThroughExtVectorComponentLValue(Src, Dst);
if (Dst.isBitField())
- return EmitStoreThroughBitfieldLValue(Src, Dst, Ty);
+ return EmitStoreThroughBitfieldLValue(Src, Dst);
assert(Dst.isPropertyRef() && "Unknown LValue type");
return EmitStoreThroughPropertyRefLValue(Src, Dst);
}
+ // There's special magic for assigning into an ARC-qualified l-value.
+ if (Qualifiers::ObjCLifetime Lifetime = Dst.getQuals().getObjCLifetime()) {
+ switch (Lifetime) {
+ case Qualifiers::OCL_None:
+ llvm_unreachable("present but none");
+
+ case Qualifiers::OCL_ExplicitNone:
+ // nothing special
+ break;
+
+ case Qualifiers::OCL_Strong:
+ EmitARCStoreStrong(Dst, Src.getScalarVal(), /*ignore*/ true);
+ return;
+
+ case Qualifiers::OCL_Weak:
+ EmitARCStoreWeak(Dst.getAddress(), Src.getScalarVal(), /*ignore*/ true);
+ return;
+
+ case Qualifiers::OCL_Autoreleasing:
+ Src = RValue::get(EmitObjCExtendObjectLifetime(Dst.getType(),
+ Src.getScalarVal()));
+ // fall into the normal path
+ break;
+ }
+ }
+
if (Dst.isObjCWeak() && !Dst.isNonGC()) {
// load of a __weak object.
llvm::Value *LvalueDst = Dst.getAddress();
@@ -871,24 +1021,21 @@ void CodeGenFunction::EmitStoreThroughLValue(RValue Src, LValue Dst,
}
assert(Src.isScalar() && "Can't emit an agg store with this method");
- EmitStoreOfScalar(Src.getScalarVal(), Dst.getAddress(),
- Dst.isVolatileQualified(), Dst.getAlignment(), Ty,
- Dst.getTBAAInfo());
+ EmitStoreOfScalar(Src.getScalarVal(), Dst);
}
void CodeGenFunction::EmitStoreThroughBitfieldLValue(RValue Src, LValue Dst,
- QualType Ty,
llvm::Value **Result) {
const CGBitFieldInfo &Info = Dst.getBitFieldInfo();
// Get the output type.
- const llvm::Type *ResLTy = ConvertTypeForMem(Ty);
+ const llvm::Type *ResLTy = ConvertTypeForMem(Dst.getType());
unsigned ResSizeInBits = CGM.getTargetData().getTypeSizeInBits(ResLTy);
// Get the source value, truncated to the width of the bit-field.
llvm::Value *SrcVal = Src.getScalarVal();
- if (Ty->isBooleanType())
+ if (Dst.getType()->isBooleanType())
SrcVal = Builder.CreateIntCast(SrcVal, ResLTy, /*IsSigned=*/false);
SrcVal = Builder.CreateAnd(SrcVal, llvm::APInt::getLowBitsSet(ResSizeInBits,
@@ -983,8 +1130,7 @@ void CodeGenFunction::EmitStoreThroughBitfieldLValue(RValue Src, LValue Dst,
}
void CodeGenFunction::EmitStoreThroughExtVectorComponentLValue(RValue Src,
- LValue Dst,
- QualType Ty) {
+ LValue Dst) {
// This access turns into a read/modify/write of the vector. Load the input
// value now.
llvm::Value *Vec = Builder.CreateLoad(Dst.getExtVectorAddr(),
@@ -993,7 +1139,7 @@ void CodeGenFunction::EmitStoreThroughExtVectorComponentLValue(RValue Src,
llvm::Value *SrcVal = Src.getScalarVal();
- if (const VectorType *VTy = Ty->getAs<VectorType>()) {
+ if (const VectorType *VTy = Dst.getType()->getAs<VectorType>()) {
unsigned NumSrcElts = VTy->getNumElements();
unsigned NumDstElts =
cast<llvm::VectorType>(Vec->getType())->getNumElements();
@@ -1113,7 +1259,12 @@ static void setObjCGCLValueClass(const ASTContext &Ctx, const Expr *E,
setObjCGCLValueClass(Ctx, Exp->getSubExpr(), LV);
return;
}
-
+
+ if (const ObjCBridgedCastExpr *Exp = dyn_cast<ObjCBridgedCastExpr>(E)) {
+ setObjCGCLValueClass(Ctx, Exp->getSubExpr(), LV);
+ return;
+ }
+
if (const ArraySubscriptExpr *Exp = dyn_cast<ArraySubscriptExpr>(E)) {
setObjCGCLValueClass(Ctx, Exp->getBase(), LV);
if (LV.isObjCIvar() && !LV.isObjCArray())
@@ -1136,6 +1287,14 @@ static void setObjCGCLValueClass(const ASTContext &Ctx, const Expr *E,
}
}
+static llvm::Value *
+EmitBitCastOfLValueToProperType(CodeGenFunction &CGF,
+ llvm::Value *V, llvm::Type *IRType,
+ llvm::StringRef Name = llvm::StringRef()) {
+ unsigned AS = cast<llvm::PointerType>(V->getType())->getAddressSpace();
+ return CGF.Builder.CreateBitCast(V, IRType->getPointerTo(AS), Name);
+}
+
static LValue EmitGlobalVarDeclLValue(CodeGenFunction &CGF,
const Expr *E, const VarDecl *VD) {
assert((VD->hasExternalStorage() || VD->isFileVarDecl()) &&
@@ -1144,6 +1303,10 @@ static LValue EmitGlobalVarDeclLValue(CodeGenFunction &CGF,
llvm::Value *V = CGF.CGM.GetAddrOfGlobalVar(VD);
if (VD->getType()->isReferenceType())
V = CGF.Builder.CreateLoad(V, "tmp");
+
+ V = EmitBitCastOfLValueToProperType(CGF, V,
+ CGF.getTypes().ConvertTypeForMem(E->getType()));
+
unsigned Alignment = CGF.getContext().getDeclAlign(VD).getQuantity();
LValue LV = CGF.MakeAddrLValue(V, E->getType(), Alignment);
setObjCGCLValueClass(CGF.getContext(), E, LV);
@@ -1151,7 +1314,7 @@ static LValue EmitGlobalVarDeclLValue(CodeGenFunction &CGF,
}
static LValue EmitFunctionDeclLValue(CodeGenFunction &CGF,
- const Expr *E, const FunctionDecl *FD) {
+ const Expr *E, const FunctionDecl *FD) {
llvm::Value *V = CGF.CGM.GetAddrOfFunction(FD);
if (!FD->hasPrototype()) {
if (const FunctionProtoType *Proto =
@@ -1200,6 +1363,9 @@ LValue CodeGenFunction::EmitDeclRefLValue(const DeclRefExpr *E) {
if (VD->getType()->isReferenceType())
V = Builder.CreateLoad(V, "tmp");
+ V = EmitBitCastOfLValueToProperType(*this, V,
+ getTypes().ConvertTypeForMem(E->getType()));
+
LValue LV = MakeAddrLValue(V, E->getType(), Alignment);
if (NonGCable) {
LV.getQuals().removeObjCGCAttr();
@@ -1359,7 +1525,7 @@ llvm::BasicBlock *CodeGenFunction::getTrapBB() {
TrapBB = createBasicBlock("trap");
EmitBlock(TrapBB);
- llvm::Value *F = CGM.getIntrinsic(llvm::Intrinsic::trap, 0, 0);
+ llvm::Value *F = CGM.getIntrinsic(llvm::Intrinsic::trap);
llvm::CallInst *TrapCall = Builder.CreateCall(F);
TrapCall->setDoesNotReturn();
TrapCall->setDoesNotThrow();
@@ -1400,7 +1566,7 @@ LValue CodeGenFunction::EmitArraySubscriptExpr(const ArraySubscriptExpr *E) {
assert(LHS.isSimple() && "Can only subscript lvalue vectors here!");
Idx = Builder.CreateIntCast(Idx, Int32Ty, IdxSigned, "vidx");
return LValue::MakeVectorElt(LHS.getAddress(), Idx,
- E->getBase()->getType().getCVRQualifiers());
+ E->getBase()->getType());
}
// Extend or truncate the index type to 32 or 64-bits.
@@ -1430,21 +1596,27 @@ LValue CodeGenFunction::EmitArraySubscriptExpr(const ArraySubscriptExpr *E) {
// size is a VLA or Objective-C interface.
llvm::Value *Address = 0;
unsigned ArrayAlignment = 0;
- if (const VariableArrayType *VAT =
+ if (const VariableArrayType *vla =
getContext().getAsVariableArrayType(E->getType())) {
- llvm::Value *VLASize = GetVLASize(VAT);
-
- Idx = Builder.CreateMul(Idx, VLASize);
-
- // The base must be a pointer, which is not an aggregate. Emit it.
- llvm::Value *Base = EmitScalarExpr(E->getBase());
-
- Address = EmitCastToVoidPtr(Base);
- if (getContext().getLangOptions().isSignedOverflowDefined())
+ // The base must be a pointer, which is not an aggregate. Emit
+ // it. It needs to be emitted first in case it's what captures
+ // the VLA bounds.
+ Address = EmitScalarExpr(E->getBase());
+
+ // The element count here is the total number of non-VLA elements.
+ llvm::Value *numElements = getVLASize(vla).first;
+
+ // Effectively, the multiply by the VLA size is part of the GEP.
+ // GEP indexes are signed, and scaling an index isn't permitted to
+ // signed-overflow, so we use the same semantics for our explicit
+ // multiply. We suppress this if overflow is not undefined behavior.
+ if (getLangOptions().isSignedOverflowDefined()) {
+ Idx = Builder.CreateMul(Idx, numElements);
Address = Builder.CreateGEP(Address, Idx, "arrayidx");
- else
+ } else {
+ Idx = Builder.CreateNSWMul(Idx, numElements);
Address = Builder.CreateInBoundsGEP(Address, Idx, "arrayidx");
- Address = Builder.CreateBitCast(Address, Base->getType());
+ }
} else if (const ObjCObjectType *OIT = E->getType()->getAs<ObjCObjectType>()){
// Indexing over an interface, as in "NSString *P; P[4];"
llvm::Value *InterfaceSize =
@@ -1539,7 +1711,7 @@ EmitExtVectorElementExpr(const ExtVectorElementExpr *E) {
Base = EmitLValue(E->getBase());
} else {
// Otherwise, the base is a normal rvalue (as in (V+V).x), emit it as such.
- assert(E->getBase()->getType()->getAs<VectorType>() &&
+ assert(E->getBase()->getType()->isVectorType() &&
"Result must be a vector");
llvm::Value *Vec = EmitScalarExpr(E->getBase());
@@ -1548,6 +1720,9 @@ EmitExtVectorElementExpr(const ExtVectorElementExpr *E) {
Builder.CreateStore(Vec, VecMem);
Base = MakeAddrLValue(VecMem, E->getBase()->getType());
}
+
+ QualType type =
+ E->getType().withCVRQualifiers(Base.getQuals().getCVRQualifiers());
// Encode the element access list into a vector of unsigned indices.
llvm::SmallVector<unsigned, 4> Indices;
@@ -1555,8 +1730,7 @@ EmitExtVectorElementExpr(const ExtVectorElementExpr *E) {
if (Base.isSimple()) {
llvm::Constant *CV = GenerateConstantVector(getLLVMContext(), Indices);
- return LValue::MakeExtVectorElt(Base.getAddress(), CV,
- Base.getVRQualifiers());
+ return LValue::MakeExtVectorElt(Base.getAddress(), CV, type);
}
assert(Base.isExtVectorElt() && "Can only subscript lvalue vec elts here!");
@@ -1570,8 +1744,7 @@ EmitExtVectorElementExpr(const ExtVectorElementExpr *E) {
CElts.push_back(cast<llvm::Constant>(BaseElts->getOperand(Indices[i])));
}
llvm::Constant *CV = llvm::ConstantVector::get(CElts);
- return LValue::MakeExtVectorElt(Base.getExtVectorAddr(), CV,
- Base.getVRQualifiers());
+ return LValue::MakeExtVectorElt(Base.getExtVectorAddr(), CV, type);
}
LValue CodeGenFunction::EmitMemberExpr(const MemberExpr *E) {
@@ -1622,7 +1795,7 @@ LValue CodeGenFunction::EmitLValueForBitfield(llvm::Value *BaseValue,
CGM.getTypes().getCGRecordLayout(Field->getParent());
const CGBitFieldInfo &Info = RL.getBitFieldInfo(Field);
return LValue::MakeBitfield(BaseValue, Info,
- Field->getType().getCVRQualifiers()|CVRQualifiers);
+ Field->getType().withCVRQualifiers(CVRQualifiers));
}
/// EmitLValueForAnonRecordField - Given that the field is a member of
@@ -1656,20 +1829,14 @@ LValue CodeGenFunction::EmitLValueForField(llvm::Value *baseAddr,
bool mayAlias = rec->hasAttr<MayAliasAttr>();
- llvm::Value *addr;
+ llvm::Value *addr = baseAddr;
if (rec->isUnion()) {
- // For unions, we just cast to the appropriate type.
+ // For unions, there is no pointer adjustment.
assert(!type->isReferenceType() && "union has reference member");
-
- const llvm::Type *llvmType = CGM.getTypes().ConvertTypeForMem(type);
- unsigned AS =
- cast<llvm::PointerType>(baseAddr->getType())->getAddressSpace();
- addr = Builder.CreateBitCast(baseAddr, llvmType->getPointerTo(AS),
- field->getName());
} else {
// For structs, we GEP to the field that the record layout suggests.
unsigned idx = CGM.getTypes().getCGRecordLayout(rec).getLLVMFieldNo(field);
- addr = Builder.CreateStructGEP(baseAddr, idx, field->getName());
+ addr = Builder.CreateStructGEP(addr, idx, field->getName());
// If this is a reference field, load the reference right now.
if (const ReferenceType *refType = type->getAs<ReferenceType>()) {
@@ -1691,6 +1858,14 @@ LValue CodeGenFunction::EmitLValueForField(llvm::Value *baseAddr,
cvr = 0; // qualifiers don't recursively apply to referencee
}
}
+
+ // Make sure that the address is pointing to the right type. This is critical
+ // for both unions and structs. A union needs a bitcast, a struct element
+ // will need a bitcast if the LLVM type laid out doesn't match the desired
+ // type.
+ addr = EmitBitCastOfLValueToProperType(*this, addr,
+ CGM.getTypes().ConvertTypeForMem(type),
+ field->getName());
unsigned alignment = getContext().getDeclAlign(field).getQuantity();
LValue LV = MakeAddrLValue(addr, type, alignment);
@@ -1722,9 +1897,17 @@ CodeGenFunction::EmitLValueForFieldInitialization(llvm::Value *BaseValue,
CGM.getTypes().getCGRecordLayout(Field->getParent());
unsigned idx = RL.getLLVMFieldNo(Field);
llvm::Value *V = Builder.CreateStructGEP(BaseValue, idx, "tmp");
-
assert(!FieldType.getObjCGCAttr() && "fields cannot have GC attrs");
+
+ // Make sure that the address is pointing to the right type. This is critical
+ // for both unions and structs. A union needs a bitcast, a struct element
+ // will need a bitcast if the LLVM type laid out doesn't match the desired
+ // type.
+ const llvm::Type *llvmType = ConvertTypeForMem(FieldType);
+ unsigned AS = cast<llvm::PointerType>(V->getType())->getAddressSpace();
+ V = Builder.CreateBitCast(V, llvmType->getPointerTo(AS));
+
unsigned Alignment = getContext().getDeclAlign(Field).getQuantity();
return MakeAddrLValue(V, FieldType, Alignment);
}
@@ -1734,7 +1917,8 @@ LValue CodeGenFunction::EmitCompoundLiteralLValue(const CompoundLiteralExpr *E){
const Expr *InitExpr = E->getInitializer();
LValue Result = MakeAddrLValue(DeclPtr, E->getType());
- EmitAnyExprToMem(InitExpr, DeclPtr, /*Volatile*/ false, /*Init*/ true);
+ EmitAnyExprToMem(InitExpr, DeclPtr, E->getType().getQualifiers(),
+ /*Init*/ true);
return Result;
}
@@ -1863,13 +2047,16 @@ LValue CodeGenFunction::EmitCastLValue(const CastExpr *E) {
case CK_DerivedToBaseMemberPointer:
case CK_BaseToDerivedMemberPointer:
case CK_MemberPointerToBoolean:
- case CK_AnyPointerToBlockPointerCast: {
+ case CK_AnyPointerToBlockPointerCast:
+ case CK_ObjCProduceObject:
+ case CK_ObjCConsumeObject:
+ case CK_ObjCReclaimReturnedObject: {
// These casts only produce lvalues when we're binding a reference to a
// temporary realized from a (converted) pure rvalue. Emit the expression
// as a value, copy it into a temporary, and return an lvalue referring to
// that temporary.
llvm::Value *V = CreateMemTemp(E->getType(), "ref.temp");
- EmitAnyExprToMem(E, V, false, false);
+ EmitAnyExprToMem(E, V, E->getType().getQualifiers(), false);
return MakeAddrLValue(V, E->getType());
}
@@ -1954,11 +2141,18 @@ LValue CodeGenFunction::EmitOpaqueValueLValue(const OpaqueValueExpr *e) {
return getOpaqueLValueMapping(e);
}
+LValue CodeGenFunction::EmitMaterializeTemporaryExpr(
+ const MaterializeTemporaryExpr *E) {
+ RValue RV = EmitReferenceBindingToExpr(E->GetTemporaryExpr(),
+ /*InitializedDecl=*/0);
+ return MakeAddrLValue(RV.getScalarVal(), E->getType());
+}
+
+
//===--------------------------------------------------------------------===//
// Expression Emission
//===--------------------------------------------------------------------===//
-
RValue CodeGenFunction::EmitCallExpr(const CallExpr *E,
ReturnValueSlot ReturnValue) {
if (CGDebugInfo *DI = getDebugInfo()) {
@@ -1988,13 +2182,57 @@ RValue CodeGenFunction::EmitCallExpr(const CallExpr *E,
if (const CXXMethodDecl *MD = dyn_cast_or_null<CXXMethodDecl>(TargetDecl))
return EmitCXXOperatorMemberCallExpr(CE, MD, ReturnValue);
- if (isa<CXXPseudoDestructorExpr>(E->getCallee()->IgnoreParens())) {
- // C++ [expr.pseudo]p1:
- // The result shall only be used as the operand for the function call
- // operator (), and the result of such a call has type void. The only
- // effect is the evaluation of the postfix-expression before the dot or
- // arrow.
- EmitScalarExpr(E->getCallee());
+ if (const CXXPseudoDestructorExpr *PseudoDtor
+ = dyn_cast<CXXPseudoDestructorExpr>(E->getCallee()->IgnoreParens())) {
+ QualType DestroyedType = PseudoDtor->getDestroyedType();
+ if (getContext().getLangOptions().ObjCAutoRefCount &&
+ DestroyedType->isObjCLifetimeType() &&
+ (DestroyedType.getObjCLifetime() == Qualifiers::OCL_Strong ||
+ DestroyedType.getObjCLifetime() == Qualifiers::OCL_Weak)) {
+ // Automatic Reference Counting:
+ // If the pseudo-expression names a retainable object with weak or
+ // strong lifetime, the object shall be released.
+ Expr *BaseExpr = PseudoDtor->getBase();
+ llvm::Value *BaseValue = NULL;
+ Qualifiers BaseQuals;
+
+ // If this is s.x, emit s as an lvalue. If it is s->x, emit s as a scalar.
+ if (PseudoDtor->isArrow()) {
+ BaseValue = EmitScalarExpr(BaseExpr);
+ const PointerType *PTy = BaseExpr->getType()->getAs<PointerType>();
+ BaseQuals = PTy->getPointeeType().getQualifiers();
+ } else {
+ LValue BaseLV = EmitLValue(BaseExpr);
+ BaseValue = BaseLV.getAddress();
+ QualType BaseTy = BaseExpr->getType();
+ BaseQuals = BaseTy.getQualifiers();
+ }
+
+ switch (PseudoDtor->getDestroyedType().getObjCLifetime()) {
+ case Qualifiers::OCL_None:
+ case Qualifiers::OCL_ExplicitNone:
+ case Qualifiers::OCL_Autoreleasing:
+ break;
+
+ case Qualifiers::OCL_Strong:
+ EmitARCRelease(Builder.CreateLoad(BaseValue,
+ PseudoDtor->getDestroyedType().isVolatileQualified()),
+ /*precise*/ true);
+ break;
+
+ case Qualifiers::OCL_Weak:
+ EmitARCDestroyWeak(BaseValue);
+ break;
+ }
+ } else {
+ // C++ [expr.pseudo]p1:
+ // The result shall only be used as the operand for the function call
+ // operator (), and the result of such a call has type void. The only
+ // effect is the evaluation of the postfix-expression before the dot or
+ // arrow.
+ EmitScalarExpr(E->getCallee());
+ }
+
return RValue::get(0);
}
@@ -2016,12 +2254,28 @@ LValue CodeGenFunction::EmitBinaryOperatorLValue(const BinaryOperator *E) {
return EmitPointerToDataMemberBinaryExpr(E);
assert(E->getOpcode() == BO_Assign && "unexpected binary l-value");
+
+ // Note that in all of these cases, __block variables need the RHS
+ // evaluated first just in case the variable gets moved by the RHS.
if (!hasAggregateLLVMType(E->getType())) {
- // __block variables need the RHS evaluated first.
+ switch (E->getLHS()->getType().getObjCLifetime()) {
+ case Qualifiers::OCL_Strong:
+ return EmitARCStoreStrong(E, /*ignored*/ false).first;
+
+ case Qualifiers::OCL_Autoreleasing:
+ return EmitARCStoreAutoreleasing(E).first;
+
+ // No reason to do any of these differently.
+ case Qualifiers::OCL_None:
+ case Qualifiers::OCL_ExplicitNone:
+ case Qualifiers::OCL_Weak:
+ break;
+ }
+
RValue RV = EmitAnyExpr(E->getRHS());
LValue LV = EmitLValue(E->getLHS());
- EmitStoreThroughLValue(RV, LV, E->getType());
+ EmitStoreThroughLValue(RV, LV);
return LV;
}
diff --git a/contrib/llvm/tools/clang/lib/CodeGen/CGExprAgg.cpp b/contrib/llvm/tools/clang/lib/CodeGen/CGExprAgg.cpp
index d8da642..915ffd6 100644
--- a/contrib/llvm/tools/clang/lib/CodeGen/CGExprAgg.cpp
+++ b/contrib/llvm/tools/clang/lib/CodeGen/CGExprAgg.cpp
@@ -85,15 +85,16 @@ public:
Visit(GE->getResultExpr());
}
void VisitUnaryExtension(UnaryOperator *E) { Visit(E->getSubExpr()); }
+ void VisitSubstNonTypeTemplateParmExpr(SubstNonTypeTemplateParmExpr *E) {
+ return Visit(E->getReplacement());
+ }
// l-values.
void VisitDeclRefExpr(DeclRefExpr *DRE) { EmitAggLoadOfLValue(DRE); }
void VisitMemberExpr(MemberExpr *ME) { EmitAggLoadOfLValue(ME); }
void VisitUnaryDeref(UnaryOperator *E) { EmitAggLoadOfLValue(E); }
void VisitStringLiteral(StringLiteral *E) { EmitAggLoadOfLValue(E); }
- void VisitCompoundLiteralExpr(CompoundLiteralExpr *E) {
- EmitAggLoadOfLValue(E);
- }
+ void VisitCompoundLiteralExpr(CompoundLiteralExpr *E);
void VisitArraySubscriptExpr(ArraySubscriptExpr *E) {
EmitAggLoadOfLValue(E);
}
@@ -131,13 +132,13 @@ public:
void VisitExprWithCleanups(ExprWithCleanups *E);
void VisitCXXScalarValueInitExpr(CXXScalarValueInitExpr *E);
void VisitCXXTypeidExpr(CXXTypeidExpr *E) { EmitAggLoadOfLValue(E); }
-
+ void VisitMaterializeTemporaryExpr(MaterializeTemporaryExpr *E);
void VisitOpaqueValueExpr(OpaqueValueExpr *E);
void VisitVAArgExpr(VAArgExpr *E);
- void EmitInitializationToLValue(Expr *E, LValue Address, QualType T);
- void EmitNullInitializationToLValue(LValue Address, QualType T);
+ void EmitInitializationToLValue(Expr *E, LValue Address);
+ void EmitNullInitializationToLValue(LValue Address);
// case Expr::ChooseExprClass:
void VisitCXXThrowExpr(const CXXThrowExpr *E) { CGF.EmitCXXThrowExpr(E); }
};
@@ -243,10 +244,31 @@ void AggExprEmitter::EmitFinalDestCopy(const Expr *E, LValue Src, bool Ignore) {
// Visitor Methods
//===----------------------------------------------------------------------===//
+void AggExprEmitter::VisitMaterializeTemporaryExpr(MaterializeTemporaryExpr *E){
+ Visit(E->GetTemporaryExpr());
+}
+
void AggExprEmitter::VisitOpaqueValueExpr(OpaqueValueExpr *e) {
EmitFinalDestCopy(e, CGF.getOpaqueLValueMapping(e));
}
+void
+AggExprEmitter::VisitCompoundLiteralExpr(CompoundLiteralExpr *E) {
+ if (E->getType().isPODType(CGF.getContext())) {
+ // For a POD type, just emit a load of the lvalue + a copy, because our
+ // compound literal might alias the destination.
+ // FIXME: This is a band-aid; the real problem appears to be in our handling
+ // of assignments, where we store directly into the LHS without checking
+ // whether anything in the RHS aliases.
+ EmitAggLoadOfLValue(E);
+ return;
+ }
+
+ AggValueSlot Slot = EnsureSlot(E->getType());
+ CGF.EmitAggExpr(E->getInitializer(), Slot);
+}
+
+
void AggExprEmitter::VisitCastExpr(CastExpr *E) {
switch (E->getCastKind()) {
case CK_Dynamic: {
@@ -271,8 +293,8 @@ void AggExprEmitter::VisitCastExpr(CastExpr *E) {
QualType PtrTy = CGF.getContext().getPointerType(Ty);
llvm::Value *CastPtr = Builder.CreateBitCast(Dest.getAddr(),
CGF.ConvertType(PtrTy));
- EmitInitializationToLValue(E->getSubExpr(), CGF.MakeAddrLValue(CastPtr, Ty),
- Ty);
+ EmitInitializationToLValue(E->getSubExpr(),
+ CGF.MakeAddrLValue(CastPtr, Ty));
break;
}
@@ -339,6 +361,9 @@ void AggExprEmitter::VisitCastExpr(CastExpr *E) {
case CK_IntegralComplexToBoolean:
case CK_IntegralComplexCast:
case CK_IntegralComplexToFloatingComplex:
+ case CK_ObjCProduceObject:
+ case CK_ObjCConsumeObject:
+ case CK_ObjCReclaimReturnedObject:
llvm_unreachable("cast kind invalid for aggregate types");
}
}
@@ -519,13 +544,13 @@ void AggExprEmitter::VisitExprWithCleanups(ExprWithCleanups *E) {
void AggExprEmitter::VisitCXXScalarValueInitExpr(CXXScalarValueInitExpr *E) {
QualType T = E->getType();
AggValueSlot Slot = EnsureSlot(T);
- EmitNullInitializationToLValue(CGF.MakeAddrLValue(Slot.getAddr(), T), T);
+ EmitNullInitializationToLValue(CGF.MakeAddrLValue(Slot.getAddr(), T));
}
void AggExprEmitter::VisitImplicitValueInitExpr(ImplicitValueInitExpr *E) {
QualType T = E->getType();
AggValueSlot Slot = EnsureSlot(T);
- EmitNullInitializationToLValue(CGF.MakeAddrLValue(Slot.getAddr(), T), T);
+ EmitNullInitializationToLValue(CGF.MakeAddrLValue(Slot.getAddr(), T));
}
/// isSimpleZero - If emitting this value will obviously just cause a store of
@@ -557,41 +582,46 @@ static bool isSimpleZero(const Expr *E, CodeGenFunction &CGF) {
void
-AggExprEmitter::EmitInitializationToLValue(Expr* E, LValue LV, QualType T) {
+AggExprEmitter::EmitInitializationToLValue(Expr* E, LValue LV) {
+ QualType type = LV.getType();
// FIXME: Ignore result?
// FIXME: Are initializers affected by volatile?
if (Dest.isZeroed() && isSimpleZero(E, CGF)) {
// Storing "i32 0" to a zero'd memory location is a noop.
} else if (isa<ImplicitValueInitExpr>(E)) {
- EmitNullInitializationToLValue(LV, T);
- } else if (T->isReferenceType()) {
+ EmitNullInitializationToLValue(LV);
+ } else if (type->isReferenceType()) {
RValue RV = CGF.EmitReferenceBindingToExpr(E, /*InitializedDecl=*/0);
- CGF.EmitStoreThroughLValue(RV, LV, T);
- } else if (T->isAnyComplexType()) {
+ CGF.EmitStoreThroughLValue(RV, LV);
+ } else if (type->isAnyComplexType()) {
CGF.EmitComplexExprIntoAddr(E, LV.getAddress(), false);
- } else if (CGF.hasAggregateLLVMType(T)) {
- CGF.EmitAggExpr(E, AggValueSlot::forAddr(LV.getAddress(), false, true,
- false, Dest.isZeroed()));
+ } else if (CGF.hasAggregateLLVMType(type)) {
+ CGF.EmitAggExpr(E, AggValueSlot::forLValue(LV, true, false,
+ Dest.isZeroed()));
+ } else if (LV.isSimple()) {
+ CGF.EmitScalarInit(E, /*D=*/0, LV, /*Captured=*/false);
} else {
- CGF.EmitStoreThroughLValue(RValue::get(CGF.EmitScalarExpr(E)), LV, T);
+ CGF.EmitStoreThroughLValue(RValue::get(CGF.EmitScalarExpr(E)), LV);
}
}
-void AggExprEmitter::EmitNullInitializationToLValue(LValue LV, QualType T) {
+void AggExprEmitter::EmitNullInitializationToLValue(LValue lv) {
+ QualType type = lv.getType();
+
// If the destination slot is already zeroed out before the aggregate is
// copied into it, we don't have to emit any zeros here.
- if (Dest.isZeroed() && CGF.getTypes().isZeroInitializable(T))
+ if (Dest.isZeroed() && CGF.getTypes().isZeroInitializable(type))
return;
- if (!CGF.hasAggregateLLVMType(T)) {
+ if (!CGF.hasAggregateLLVMType(type)) {
// For non-aggregates, we can store zero
- llvm::Value *Null = llvm::Constant::getNullValue(CGF.ConvertType(T));
- CGF.EmitStoreThroughLValue(RValue::get(Null), LV, T);
+ llvm::Value *null = llvm::Constant::getNullValue(CGF.ConvertType(type));
+ CGF.EmitStoreThroughLValue(RValue::get(null), lv);
} else {
// There's a potential optimization opportunity in combining
// memsets; that would be easy for arrays, but relatively
// difficult for structures with the current code.
- CGF.EmitNullInitialization(LV.getAddress(), T);
+ CGF.EmitNullInitialization(lv.getAddress(), lv.getType());
}
}
@@ -634,45 +664,135 @@ void AggExprEmitter::VisitInitListExpr(InitListExpr *E) {
}
uint64_t NumArrayElements = AType->getNumElements();
- QualType ElementType = CGF.getContext().getCanonicalType(E->getType());
- ElementType = CGF.getContext().getAsArrayType(ElementType)->getElementType();
-
- bool hasNonTrivialCXXConstructor = false;
- if (CGF.getContext().getLangOptions().CPlusPlus)
- if (const RecordType *RT = CGF.getContext()
- .getBaseElementType(ElementType)->getAs<RecordType>()) {
- const CXXRecordDecl *RD = cast<CXXRecordDecl>(RT->getDecl());
- hasNonTrivialCXXConstructor = !RD->hasTrivialDefaultConstructor();
+ assert(NumInitElements <= NumArrayElements);
+
+ QualType elementType = E->getType().getCanonicalType();
+ elementType = CGF.getContext().getQualifiedType(
+ cast<ArrayType>(elementType)->getElementType(),
+ elementType.getQualifiers() + Dest.getQualifiers());
+
+ // DestPtr is an array*. Construct an elementType* by drilling
+ // down a level.
+ llvm::Value *zero = llvm::ConstantInt::get(CGF.SizeTy, 0);
+ llvm::Value *indices[] = { zero, zero };
+ llvm::Value *begin =
+ Builder.CreateInBoundsGEP(DestPtr, indices, indices+2, "arrayinit.begin");
+
+ // Exception safety requires us to destroy all the
+ // already-constructed members if an initializer throws.
+ // For that, we'll need an EH cleanup.
+ QualType::DestructionKind dtorKind = elementType.isDestructedType();
+ llvm::AllocaInst *endOfInit = 0;
+ EHScopeStack::stable_iterator cleanup;
+ if (CGF.needsEHCleanup(dtorKind)) {
+ // In principle we could tell the cleanup where we are more
+ // directly, but the control flow can get so varied here that it
+ // would actually be quite complex. Therefore we go through an
+ // alloca.
+ endOfInit = CGF.CreateTempAlloca(begin->getType(),
+ "arrayinit.endOfInit");
+ Builder.CreateStore(begin, endOfInit);
+ CGF.pushIrregularPartialArrayCleanup(begin, endOfInit, elementType,
+ CGF.getDestroyer(dtorKind));
+ cleanup = CGF.EHStack.stable_begin();
+
+ // Otherwise, remember that we didn't need a cleanup.
+ } else {
+ dtorKind = QualType::DK_none;
+ }
+
+ llvm::Value *one = llvm::ConstantInt::get(CGF.SizeTy, 1);
+
+ // The 'current element to initialize'. The invariants on this
+ // variable are complicated. Essentially, after each iteration of
+ // the loop, it points to the last initialized element, except
+ // that it points to the beginning of the array before any
+ // elements have been initialized.
+ llvm::Value *element = begin;
+
+ // Emit the explicit initializers.
+ for (uint64_t i = 0; i != NumInitElements; ++i) {
+ // Advance to the next element.
+ if (i > 0) {
+ element = Builder.CreateInBoundsGEP(element, one, "arrayinit.element");
+
+ // Tell the cleanup that it needs to destroy up to this
+ // element. TODO: some of these stores can be trivially
+ // observed to be unnecessary.
+ if (endOfInit) Builder.CreateStore(element, endOfInit);
}
- // FIXME: were we intentionally ignoring address spaces and GC attributes?
+ LValue elementLV = CGF.MakeAddrLValue(element, elementType);
+ EmitInitializationToLValue(E->getInit(i), elementLV);
+ }
- for (uint64_t i = 0; i != NumArrayElements; ++i) {
- // If we're done emitting initializers and the destination is known-zeroed
- // then we're done.
- if (i == NumInitElements &&
- Dest.isZeroed() &&
- CGF.getTypes().isZeroInitializable(ElementType) &&
- !hasNonTrivialCXXConstructor)
- break;
+ // Check whether there's a non-trivial array-fill expression.
+ // Note that this will be a CXXConstructExpr even if the element
+ // type is an array (or array of array, etc.) of class type.
+ Expr *filler = E->getArrayFiller();
+ bool hasTrivialFiller = true;
+ if (CXXConstructExpr *cons = dyn_cast_or_null<CXXConstructExpr>(filler)) {
+ assert(cons->getConstructor()->isDefaultConstructor());
+ hasTrivialFiller = cons->getConstructor()->isTrivial();
+ }
- llvm::Value *NextVal = Builder.CreateStructGEP(DestPtr, i, ".array");
- LValue LV = CGF.MakeAddrLValue(NextVal, ElementType);
-
- if (i < NumInitElements)
- EmitInitializationToLValue(E->getInit(i), LV, ElementType);
- else if (Expr *filler = E->getArrayFiller())
- EmitInitializationToLValue(filler, LV, ElementType);
+ // Any remaining elements need to be zero-initialized, possibly
+ // using the filler expression. We can skip this if the we're
+ // emitting to zeroed memory.
+ if (NumInitElements != NumArrayElements &&
+ !(Dest.isZeroed() && hasTrivialFiller &&
+ CGF.getTypes().isZeroInitializable(elementType))) {
+
+ // Use an actual loop. This is basically
+ // do { *array++ = filler; } while (array != end);
+
+ // Advance to the start of the rest of the array.
+ if (NumInitElements) {
+ element = Builder.CreateInBoundsGEP(element, one, "arrayinit.start");
+ if (endOfInit) Builder.CreateStore(element, endOfInit);
+ }
+
+ // Compute the end of the array.
+ llvm::Value *end = Builder.CreateInBoundsGEP(begin,
+ llvm::ConstantInt::get(CGF.SizeTy, NumArrayElements),
+ "arrayinit.end");
+
+ llvm::BasicBlock *entryBB = Builder.GetInsertBlock();
+ llvm::BasicBlock *bodyBB = CGF.createBasicBlock("arrayinit.body");
+
+ // Jump into the body.
+ CGF.EmitBlock(bodyBB);
+ llvm::PHINode *currentElement =
+ Builder.CreatePHI(element->getType(), 2, "arrayinit.cur");
+ currentElement->addIncoming(element, entryBB);
+
+ // Emit the actual filler expression.
+ LValue elementLV = CGF.MakeAddrLValue(currentElement, elementType);
+ if (filler)
+ EmitInitializationToLValue(filler, elementLV);
else
- EmitNullInitializationToLValue(LV, ElementType);
-
- // If the GEP didn't get used because of a dead zero init or something
- // else, clean it up for -O0 builds and general tidiness.
- if (llvm::GetElementPtrInst *GEP =
- dyn_cast<llvm::GetElementPtrInst>(NextVal))
- if (GEP->use_empty())
- GEP->eraseFromParent();
+ EmitNullInitializationToLValue(elementLV);
+
+ // Move on to the next element.
+ llvm::Value *nextElement =
+ Builder.CreateInBoundsGEP(currentElement, one, "arrayinit.next");
+
+ // Tell the EH cleanup that we finished with the last element.
+ if (endOfInit) Builder.CreateStore(nextElement, endOfInit);
+
+ // Leave the loop if we're done.
+ llvm::Value *done = Builder.CreateICmpEQ(nextElement, end,
+ "arrayinit.done");
+ llvm::BasicBlock *endBB = CGF.createBasicBlock("arrayinit.end");
+ Builder.CreateCondBr(done, endBB, bodyBB);
+ currentElement->addIncoming(nextElement, Builder.GetInsertBlock());
+
+ CGF.EmitBlock(endBB);
}
+
+ // Leave the partial-array cleanup if we entered one.
+ if (dtorKind) CGF.DeactivateCleanupBlock(cleanup);
+
return;
}
@@ -683,9 +803,9 @@ void AggExprEmitter::VisitInitListExpr(InitListExpr *E) {
// the disadvantage is that the generated code is more difficult for
// the optimizer, especially with bitfields.
unsigned NumInitElements = E->getNumInits();
- RecordDecl *SD = E->getType()->getAs<RecordType>()->getDecl();
+ RecordDecl *record = E->getType()->castAs<RecordType>()->getDecl();
- if (E->getType()->isUnionType()) {
+ if (record->isUnion()) {
// Only initialize one field of a union. The field itself is
// specified by the initializer list.
if (!E->getInitializedFieldInUnion()) {
@@ -694,8 +814,8 @@ void AggExprEmitter::VisitInitListExpr(InitListExpr *E) {
#ifndef NDEBUG
// Make sure that it's really an empty and not a failure of
// semantic analysis.
- for (RecordDecl::field_iterator Field = SD->field_begin(),
- FieldEnd = SD->field_end();
+ for (RecordDecl::field_iterator Field = record->field_begin(),
+ FieldEnd = record->field_end();
Field != FieldEnd; ++Field)
assert(Field->isUnnamedBitfield() && "Only unnamed bitfields allowed");
#endif
@@ -708,55 +828,81 @@ void AggExprEmitter::VisitInitListExpr(InitListExpr *E) {
LValue FieldLoc = CGF.EmitLValueForFieldInitialization(DestPtr, Field, 0);
if (NumInitElements) {
// Store the initializer into the field
- EmitInitializationToLValue(E->getInit(0), FieldLoc, Field->getType());
+ EmitInitializationToLValue(E->getInit(0), FieldLoc);
} else {
// Default-initialize to null.
- EmitNullInitializationToLValue(FieldLoc, Field->getType());
+ EmitNullInitializationToLValue(FieldLoc);
}
return;
}
+ // We'll need to enter cleanup scopes in case any of the member
+ // initializers throw an exception.
+ llvm::SmallVector<EHScopeStack::stable_iterator, 16> cleanups;
+
// Here we iterate over the fields; this makes it simpler to both
// default-initialize fields and skip over unnamed fields.
- unsigned CurInitVal = 0;
- for (RecordDecl::field_iterator Field = SD->field_begin(),
- FieldEnd = SD->field_end();
- Field != FieldEnd; ++Field) {
- // We're done once we hit the flexible array member
- if (Field->getType()->isIncompleteArrayType())
+ unsigned curInitIndex = 0;
+ for (RecordDecl::field_iterator field = record->field_begin(),
+ fieldEnd = record->field_end();
+ field != fieldEnd; ++field) {
+ // We're done once we hit the flexible array member.
+ if (field->getType()->isIncompleteArrayType())
break;
- if (Field->isUnnamedBitfield())
+ // Always skip anonymous bitfields.
+ if (field->isUnnamedBitfield())
continue;
- // Don't emit GEP before a noop store of zero.
- if (CurInitVal == NumInitElements && Dest.isZeroed() &&
+ // We're done if we reach the end of the explicit initializers, we
+ // have a zeroed object, and the rest of the fields are
+ // zero-initializable.
+ if (curInitIndex == NumInitElements && Dest.isZeroed() &&
CGF.getTypes().isZeroInitializable(E->getType()))
break;
// FIXME: volatility
- LValue FieldLoc = CGF.EmitLValueForFieldInitialization(DestPtr, *Field, 0);
+ LValue LV = CGF.EmitLValueForFieldInitialization(DestPtr, *field, 0);
// We never generate write-barries for initialized fields.
- FieldLoc.setNonGC(true);
+ LV.setNonGC(true);
- if (CurInitVal < NumInitElements) {
+ if (curInitIndex < NumInitElements) {
// Store the initializer into the field.
- EmitInitializationToLValue(E->getInit(CurInitVal++), FieldLoc,
- Field->getType());
+ EmitInitializationToLValue(E->getInit(curInitIndex++), LV);
} else {
// We're out of initalizers; default-initialize to null
- EmitNullInitializationToLValue(FieldLoc, Field->getType());
+ EmitNullInitializationToLValue(LV);
+ }
+
+ // Push a destructor if necessary.
+ // FIXME: if we have an array of structures, all explicitly
+ // initialized, we can end up pushing a linear number of cleanups.
+ bool pushedCleanup = false;
+ if (QualType::DestructionKind dtorKind
+ = field->getType().isDestructedType()) {
+ assert(LV.isSimple());
+ if (CGF.needsEHCleanup(dtorKind)) {
+ CGF.pushDestroy(EHCleanup, LV.getAddress(), field->getType(),
+ CGF.getDestroyer(dtorKind), false);
+ cleanups.push_back(CGF.EHStack.stable_begin());
+ pushedCleanup = true;
+ }
}
// If the GEP didn't get used because of a dead zero init or something
// else, clean it up for -O0 builds and general tidiness.
- if (FieldLoc.isSimple())
+ if (!pushedCleanup && LV.isSimple())
if (llvm::GetElementPtrInst *GEP =
- dyn_cast<llvm::GetElementPtrInst>(FieldLoc.getAddress()))
+ dyn_cast<llvm::GetElementPtrInst>(LV.getAddress()))
if (GEP->use_empty())
GEP->eraseFromParent();
}
+
+ // Deactivate all the partial cleanups in reverse order, which
+ // generally means popping them.
+ for (unsigned i = cleanups.size(); i != 0; --i)
+ CGF.DeactivateCleanupBlock(cleanups[i-1]);
}
//===----------------------------------------------------------------------===//
@@ -873,8 +1019,6 @@ static void CheckAggExprForMemSetUse(AggValueSlot &Slot, const Expr *E,
///
/// \param IsInitializer - true if this evaluation is initializing an
/// object whose lifetime is already being managed.
-//
-// FIXME: Take Qualifiers object.
void CodeGenFunction::EmitAggExpr(const Expr *E, AggValueSlot Slot,
bool IgnoreResult) {
assert(E && hasAggregateLLVMType(E->getType()) &&
@@ -892,7 +1036,7 @@ LValue CodeGenFunction::EmitAggExprToLValue(const Expr *E) {
assert(hasAggregateLLVMType(E->getType()) && "Invalid argument!");
llvm::Value *Temp = CreateMemTemp(E->getType());
LValue LV = MakeAddrLValue(Temp, E->getType());
- EmitAggExpr(E, AggValueSlot::forAddr(Temp, LV.isVolatileQualified(), false));
+ EmitAggExpr(E, AggValueSlot::forLValue(LV, false));
return LV;
}
@@ -954,7 +1098,10 @@ void CodeGenFunction::EmitAggregateCopy(llvm::Value *DestPtr,
llvm::Type::getInt8PtrTy(getLLVMContext(), SPT->getAddressSpace());
SrcPtr = Builder.CreateBitCast(SrcPtr, SBP, "tmp");
- if (const RecordType *RecordTy = Ty->getAs<RecordType>()) {
+ // Don't do any of the memmove_collectable tests if GC isn't set.
+ if (CGM.getLangOptions().getGCMode() == LangOptions::NonGC) {
+ // fall through
+ } else if (const RecordType *RecordTy = Ty->getAs<RecordType>()) {
RecordDecl *Record = RecordTy->getDecl();
if (Record->hasObjectMember()) {
CharUnits size = TypeInfo.first;
@@ -964,7 +1111,7 @@ void CodeGenFunction::EmitAggregateCopy(llvm::Value *DestPtr,
SizeVal);
return;
}
- } else if (getContext().getAsArrayType(Ty)) {
+ } else if (Ty->isArrayType()) {
QualType BaseType = getContext().getBaseElementType(Ty);
if (const RecordType *RecordTy = BaseType->getAs<RecordType>()) {
if (RecordTy->getDecl()->hasObjectMember()) {
diff --git a/contrib/llvm/tools/clang/lib/CodeGen/CGExprCXX.cpp b/contrib/llvm/tools/clang/lib/CodeGen/CGExprCXX.cpp
index 81fee67..4396f56 100644
--- a/contrib/llvm/tools/clang/lib/CodeGen/CGExprCXX.cpp
+++ b/contrib/llvm/tools/clang/lib/CodeGen/CGExprCXX.cpp
@@ -379,19 +379,11 @@ CodeGenFunction::EmitCXXConstructExpr(const CXXConstructExpr *E,
}
}
- const ConstantArrayType *Array
- = getContext().getAsConstantArrayType(E->getType());
- if (Array) {
- QualType BaseElementTy = getContext().getBaseElementType(Array);
- const llvm::Type *BasePtr = ConvertType(BaseElementTy);
- BasePtr = llvm::PointerType::getUnqual(BasePtr);
- llvm::Value *BaseAddrPtr =
- Builder.CreateBitCast(Dest.getAddr(), BasePtr);
-
- EmitCXXAggrConstructorCall(CD, Array, BaseAddrPtr,
+ if (const ConstantArrayType *arrayType
+ = getContext().getAsConstantArrayType(E->getType())) {
+ EmitCXXAggrConstructorCall(CD, arrayType, Dest.getAddr(),
E->arg_begin(), E->arg_end());
- }
- else {
+ } else {
CXXCtorType Type = Ctor_Complete;
bool ForVirtualBase = false;
@@ -619,10 +611,8 @@ static llvm::Value *EmitCXXNewAllocSize(CodeGenFunction &CGF,
// can be ignored because the result shouldn't be used if
// allocation fails.
if (typeSizeMultiplier != 1) {
- const llvm::Type *intrinsicTypes[] = { CGF.SizeTy };
llvm::Value *umul_with_overflow
- = CGF.CGM.getIntrinsic(llvm::Intrinsic::umul_with_overflow,
- intrinsicTypes, 1);
+ = CGF.CGM.getIntrinsic(llvm::Intrinsic::umul_with_overflow, CGF.SizeTy);
llvm::Value *tsmV =
llvm::ConstantInt::get(CGF.SizeTy, typeSizeMultiplier);
@@ -661,10 +651,8 @@ static llvm::Value *EmitCXXNewAllocSize(CodeGenFunction &CGF,
if (cookieSize != 0) {
sizeWithoutCookie = size;
- const llvm::Type *intrinsicTypes[] = { CGF.SizeTy };
llvm::Value *uadd_with_overflow
- = CGF.CGM.getIntrinsic(llvm::Intrinsic::uadd_with_overflow,
- intrinsicTypes, 1);
+ = CGF.CGM.getIntrinsic(llvm::Intrinsic::uadd_with_overflow, CGF.SizeTy);
llvm::Value *cookieSizeV = llvm::ConstantInt::get(CGF.SizeTy, cookieSize);
llvm::Value *result =
@@ -707,16 +695,15 @@ static void StoreAnyExprIntoOneUnit(CodeGenFunction &CGF, const CXXNewExpr *E,
unsigned Alignment =
CGF.getContext().getTypeAlignInChars(AllocType).getQuantity();
- if (!CGF.hasAggregateLLVMType(AllocType))
- CGF.EmitStoreOfScalar(CGF.EmitScalarExpr(Init), NewPtr,
- AllocType.isVolatileQualified(), Alignment,
- AllocType);
+ if (!CGF.hasAggregateLLVMType(AllocType))
+ CGF.EmitScalarInit(Init, 0, CGF.MakeAddrLValue(NewPtr, AllocType, Alignment),
+ false);
else if (AllocType->isAnyComplexType())
CGF.EmitComplexExprIntoAddr(Init, NewPtr,
AllocType.isVolatileQualified());
else {
AggValueSlot Slot
- = AggValueSlot::forAddr(NewPtr, AllocType.isVolatileQualified(), true);
+ = AggValueSlot::forAddr(NewPtr, AllocType.getQualifiers(), true);
CGF.EmitAggExpr(Init, Slot);
}
}
@@ -806,7 +793,7 @@ static void EmitNewInitializer(CodeGenFunction &CGF, const CXXNewExpr *E,
RequiresZeroInitialization = true;
}
-
+
CGF.EmitCXXAggrConstructorCall(Ctor, NumElements, NewPtr,
E->constructor_arg_begin(),
E->constructor_arg_end(),
@@ -875,7 +862,7 @@ namespace {
getPlacementArgs()[I] = Arg;
}
- void Emit(CodeGenFunction &CGF, bool IsForEH) {
+ void Emit(CodeGenFunction &CGF, Flags flags) {
const FunctionProtoType *FPT
= OperatorDelete->getType()->getAs<FunctionProtoType>();
assert(FPT->getNumArgs() == NumPlacementArgs + 1 ||
@@ -932,7 +919,7 @@ namespace {
getPlacementArgs()[I] = Arg;
}
- void Emit(CodeGenFunction &CGF, bool IsForEH) {
+ void Emit(CodeGenFunction &CGF, Flags flags) {
const FunctionProtoType *FPT
= OperatorDelete->getType()->getAs<FunctionProtoType>();
assert(FPT->getNumArgs() == NumPlacementArgs + 1 ||
@@ -1075,7 +1062,7 @@ llvm::Value *CodeGenFunction::EmitCXXNewExpr(const CXXNewExpr *E) {
// CXXNewExpr::shouldNullCheckAllocation()) and we have an
// interesting initializer.
bool nullCheck = allocatorType->isNothrow(getContext()) &&
- !(allocType->isPODType() && !E->hasInitializer());
+ !(allocType.isPODType(getContext()) && !E->hasInitializer());
llvm::BasicBlock *nullCheckBB = 0;
llvm::BasicBlock *contBB = 0;
@@ -1202,7 +1189,7 @@ namespace {
QualType ElementType)
: Ptr(Ptr), OperatorDelete(OperatorDelete), ElementType(ElementType) {}
- void Emit(CodeGenFunction &CGF, bool IsForEH) {
+ void Emit(CodeGenFunction &CGF, Flags flags) {
CGF.EmitDeleteCall(OperatorDelete, Ptr, ElementType);
}
};
@@ -1212,7 +1199,8 @@ namespace {
static void EmitObjectDelete(CodeGenFunction &CGF,
const FunctionDecl *OperatorDelete,
llvm::Value *Ptr,
- QualType ElementType) {
+ QualType ElementType,
+ bool UseGlobalDelete) {
// Find the destructor for the type, if applicable. If the
// destructor is virtual, we'll just emit the vcall and return.
const CXXDestructorDecl *Dtor = 0;
@@ -1222,17 +1210,30 @@ static void EmitObjectDelete(CodeGenFunction &CGF,
Dtor = RD->getDestructor();
if (Dtor->isVirtual()) {
+ if (UseGlobalDelete) {
+ // If we're supposed to call the global delete, make sure we do so
+ // even if the destructor throws.
+ CGF.EHStack.pushCleanup<CallObjectDelete>(NormalAndEHCleanup,
+ Ptr, OperatorDelete,
+ ElementType);
+ }
+
const llvm::Type *Ty =
CGF.getTypes().GetFunctionType(CGF.getTypes().getFunctionInfo(Dtor,
Dtor_Complete),
/*isVariadic=*/false);
llvm::Value *Callee
- = CGF.BuildVirtualCall(Dtor, Dtor_Deleting, Ptr, Ty);
+ = CGF.BuildVirtualCall(Dtor,
+ UseGlobalDelete? Dtor_Complete : Dtor_Deleting,
+ Ptr, Ty);
CGF.EmitCXXMemberCall(Dtor, Callee, ReturnValueSlot(), Ptr, /*VTT=*/0,
0, 0);
- // The dtor took care of deleting the object.
+ if (UseGlobalDelete) {
+ CGF.PopCleanupBlock();
+ }
+
return;
}
}
@@ -1247,7 +1248,29 @@ static void EmitObjectDelete(CodeGenFunction &CGF,
if (Dtor)
CGF.EmitCXXDestructorCall(Dtor, Dtor_Complete,
/*ForVirtualBase=*/false, Ptr);
+ else if (CGF.getLangOptions().ObjCAutoRefCount &&
+ ElementType->isObjCLifetimeType()) {
+ switch (ElementType.getObjCLifetime()) {
+ case Qualifiers::OCL_None:
+ case Qualifiers::OCL_ExplicitNone:
+ case Qualifiers::OCL_Autoreleasing:
+ break;
+ case Qualifiers::OCL_Strong: {
+ // Load the pointer value.
+ llvm::Value *PtrValue = CGF.Builder.CreateLoad(Ptr,
+ ElementType.isVolatileQualified());
+
+ CGF.EmitARCRelease(PtrValue, /*precise*/ true);
+ break;
+ }
+
+ case Qualifiers::OCL_Weak:
+ CGF.EmitARCDestroyWeak(Ptr);
+ break;
+ }
+ }
+
CGF.PopCleanupBlock();
}
@@ -1268,7 +1291,7 @@ namespace {
: Ptr(Ptr), OperatorDelete(OperatorDelete), NumElements(NumElements),
ElementType(ElementType), CookieSize(CookieSize) {}
- void Emit(CodeGenFunction &CGF, bool IsForEH) {
+ void Emit(CodeGenFunction &CGF, Flags flags) {
const FunctionProtoType *DeleteFTy =
OperatorDelete->getType()->getAs<FunctionProtoType>();
assert(DeleteFTy->getNumArgs() == 1 || DeleteFTy->getNumArgs() == 2);
@@ -1316,31 +1339,40 @@ namespace {
/// Emit the code for deleting an array of objects.
static void EmitArrayDelete(CodeGenFunction &CGF,
const CXXDeleteExpr *E,
- llvm::Value *Ptr,
- QualType ElementType) {
- llvm::Value *NumElements = 0;
- llvm::Value *AllocatedPtr = 0;
- CharUnits CookieSize;
- CGF.CGM.getCXXABI().ReadArrayCookie(CGF, Ptr, E, ElementType,
- NumElements, AllocatedPtr, CookieSize);
+ llvm::Value *deletedPtr,
+ QualType elementType) {
+ llvm::Value *numElements = 0;
+ llvm::Value *allocatedPtr = 0;
+ CharUnits cookieSize;
+ CGF.CGM.getCXXABI().ReadArrayCookie(CGF, deletedPtr, E, elementType,
+ numElements, allocatedPtr, cookieSize);
- assert(AllocatedPtr && "ReadArrayCookie didn't set AllocatedPtr");
+ assert(allocatedPtr && "ReadArrayCookie didn't set allocated pointer");
// Make sure that we call delete even if one of the dtors throws.
- const FunctionDecl *OperatorDelete = E->getOperatorDelete();
+ const FunctionDecl *operatorDelete = E->getOperatorDelete();
CGF.EHStack.pushCleanup<CallArrayDelete>(NormalAndEHCleanup,
- AllocatedPtr, OperatorDelete,
- NumElements, ElementType,
- CookieSize);
-
- if (const CXXRecordDecl *RD = ElementType->getAsCXXRecordDecl()) {
- if (!RD->hasTrivialDestructor()) {
- assert(NumElements && "ReadArrayCookie didn't find element count"
- " for a class with destructor");
- CGF.EmitCXXAggrDestructorCall(RD->getDestructor(), NumElements, Ptr);
- }
+ allocatedPtr, operatorDelete,
+ numElements, elementType,
+ cookieSize);
+
+ // Destroy the elements.
+ if (QualType::DestructionKind dtorKind = elementType.isDestructedType()) {
+ assert(numElements && "no element count for a type with a destructor!");
+
+ llvm::Value *arrayEnd =
+ CGF.Builder.CreateInBoundsGEP(deletedPtr, numElements, "delete.end");
+
+ // Note that it is legal to allocate a zero-length array, and we
+ // can never fold the check away because the length should always
+ // come from a cookie.
+ CGF.emitArrayDestroy(deletedPtr, arrayEnd, elementType,
+ CGF.getDestroyer(dtorKind),
+ /*checkZeroLength*/ true,
+ CGF.needsEHCleanup(dtorKind));
}
+ // Pop the cleanup block.
CGF.PopCleanupBlock();
}
@@ -1397,7 +1429,8 @@ void CodeGenFunction::EmitCXXDeleteExpr(const CXXDeleteExpr *E) {
if (E->isArrayForm()) {
EmitArrayDelete(*this, E, Ptr, DeleteTy);
} else {
- EmitObjectDelete(*this, E->getOperatorDelete(), Ptr, DeleteTy);
+ EmitObjectDelete(*this, E->getOperatorDelete(), Ptr, DeleteTy,
+ E->isGlobalDelete());
}
EmitBlock(DeleteEnd);
@@ -1415,7 +1448,7 @@ static llvm::Constant *getBadTypeidFn(CodeGenFunction &CGF) {
static void EmitBadTypeidCall(CodeGenFunction &CGF) {
llvm::Value *Fn = getBadTypeidFn(CGF);
- CGF.EmitCallOrInvoke(Fn, 0, 0).setDoesNotReturn();
+ CGF.EmitCallOrInvoke(Fn).setDoesNotReturn();
CGF.Builder.CreateUnreachable();
}
@@ -1489,11 +1522,11 @@ static llvm::Constant *getDynamicCastFn(CodeGenFunction &CGF) {
// const abi::__class_type_info *dst,
// std::ptrdiff_t src2dst_offset);
- const llvm::Type *Int8PtrTy = llvm::Type::getInt8PtrTy(CGF.getLLVMContext());
- const llvm::Type *PtrDiffTy =
+ llvm::Type *Int8PtrTy = llvm::Type::getInt8PtrTy(CGF.getLLVMContext());
+ llvm::Type *PtrDiffTy =
CGF.ConvertType(CGF.getContext().getPointerDiffType());
- const llvm::Type *Args[4] = { Int8PtrTy, Int8PtrTy, Int8PtrTy, PtrDiffTy };
+ llvm::Type *Args[4] = { Int8PtrTy, Int8PtrTy, Int8PtrTy, PtrDiffTy };
const llvm::FunctionType *FTy =
llvm::FunctionType::get(Int8PtrTy, Args, false);
@@ -1513,7 +1546,7 @@ static llvm::Constant *getBadCastFn(CodeGenFunction &CGF) {
static void EmitBadCastCall(CodeGenFunction &CGF) {
llvm::Value *Fn = getBadCastFn(CGF);
- CGF.EmitCallOrInvoke(Fn, 0, 0).setDoesNotReturn();
+ CGF.EmitCallOrInvoke(Fn).setDoesNotReturn();
CGF.Builder.CreateUnreachable();
}
diff --git a/contrib/llvm/tools/clang/lib/CodeGen/CGExprComplex.cpp b/contrib/llvm/tools/clang/lib/CodeGen/CGExprComplex.cpp
index bd19586..35cff1d 100644
--- a/contrib/llvm/tools/clang/lib/CodeGen/CGExprComplex.cpp
+++ b/contrib/llvm/tools/clang/lib/CodeGen/CGExprComplex.cpp
@@ -112,6 +112,10 @@ public:
return Visit(GE->getResultExpr());
}
ComplexPairTy VisitImaginaryLiteral(const ImaginaryLiteral *IL);
+ ComplexPairTy
+ VisitSubstNonTypeTemplateParmExpr(SubstNonTypeTemplateParmExpr *PE) {
+ return Visit(PE->getReplacement());
+ }
// l-values.
ComplexPairTy VisitDeclRefExpr(const Expr *E) { return EmitLoadOfLValue(E); }
@@ -352,6 +356,8 @@ ComplexPairTy ComplexExprEmitter::EmitComplexToComplexCast(ComplexPairTy Val,
ComplexPairTy ComplexExprEmitter::EmitCast(CastExpr::CastKind CK, Expr *Op,
QualType DestTy) {
switch (CK) {
+ case CK_Dependent: llvm_unreachable("dependent cast kind in IR gen!");
+
case CK_GetObjCProperty: {
LValue LV = CGF.EmitLValue(Op);
assert(LV.isPropertyRef() && "Unknown LValue type!");
@@ -360,39 +366,74 @@ ComplexPairTy ComplexExprEmitter::EmitCast(CastExpr::CastKind CK, Expr *Op,
case CK_NoOp:
case CK_LValueToRValue:
+ case CK_UserDefinedConversion:
return Visit(Op);
- // TODO: do all of these
- default:
- break;
- }
-
- // Two cases here: cast from (complex to complex) and (scalar to complex).
- if (Op->getType()->isAnyComplexType())
- return EmitComplexToComplexCast(Visit(Op), Op->getType(), DestTy);
-
- // FIXME: We should be looking at all of the cast kinds here, not
- // cherry-picking the ones we have test cases for.
- if (CK == CK_LValueBitCast) {
+ case CK_LValueBitCast: {
llvm::Value *V = CGF.EmitLValue(Op).getAddress();
V = Builder.CreateBitCast(V,
- CGF.ConvertType(CGF.getContext().getPointerType(DestTy)));
+ CGF.ConvertType(CGF.getContext().getPointerType(DestTy)));
// FIXME: Are the qualifiers correct here?
return EmitLoadOfComplex(V, DestTy.isVolatileQualified());
}
-
- // C99 6.3.1.7: When a value of real type is converted to a complex type, the
- // real part of the complex result value is determined by the rules of
- // conversion to the corresponding real type and the imaginary part of the
- // complex result value is a positive zero or an unsigned zero.
- llvm::Value *Elt = CGF.EmitScalarExpr(Op);
-
- // Convert the input element to the element type of the complex.
- DestTy = DestTy->getAs<ComplexType>()->getElementType();
- Elt = CGF.EmitScalarConversion(Elt, Op->getType(), DestTy);
-
- // Return (realval, 0).
- return ComplexPairTy(Elt, llvm::Constant::getNullValue(Elt->getType()));
+
+ case CK_BitCast:
+ case CK_BaseToDerived:
+ case CK_DerivedToBase:
+ case CK_UncheckedDerivedToBase:
+ case CK_Dynamic:
+ case CK_ToUnion:
+ case CK_ArrayToPointerDecay:
+ case CK_FunctionToPointerDecay:
+ case CK_NullToPointer:
+ case CK_NullToMemberPointer:
+ case CK_BaseToDerivedMemberPointer:
+ case CK_DerivedToBaseMemberPointer:
+ case CK_MemberPointerToBoolean:
+ case CK_ConstructorConversion:
+ case CK_IntegralToPointer:
+ case CK_PointerToIntegral:
+ case CK_PointerToBoolean:
+ case CK_ToVoid:
+ case CK_VectorSplat:
+ case CK_IntegralCast:
+ case CK_IntegralToBoolean:
+ case CK_IntegralToFloating:
+ case CK_FloatingToIntegral:
+ case CK_FloatingToBoolean:
+ case CK_FloatingCast:
+ case CK_AnyPointerToObjCPointerCast:
+ case CK_AnyPointerToBlockPointerCast:
+ case CK_ObjCObjectLValueCast:
+ case CK_FloatingComplexToReal:
+ case CK_FloatingComplexToBoolean:
+ case CK_IntegralComplexToReal:
+ case CK_IntegralComplexToBoolean:
+ case CK_ObjCProduceObject:
+ case CK_ObjCConsumeObject:
+ case CK_ObjCReclaimReturnedObject:
+ llvm_unreachable("invalid cast kind for complex value");
+
+ case CK_FloatingRealToComplex:
+ case CK_IntegralRealToComplex: {
+ llvm::Value *Elt = CGF.EmitScalarExpr(Op);
+
+ // Convert the input element to the element type of the complex.
+ DestTy = DestTy->getAs<ComplexType>()->getElementType();
+ Elt = CGF.EmitScalarConversion(Elt, Op->getType(), DestTy);
+
+ // Return (realval, 0).
+ return ComplexPairTy(Elt, llvm::Constant::getNullValue(Elt->getType()));
+ }
+
+ case CK_FloatingComplexCast:
+ case CK_FloatingComplexToIntegralComplex:
+ case CK_IntegralComplexCast:
+ case CK_IntegralComplexToFloatingComplex:
+ return EmitComplexToComplexCast(Visit(Op), Op->getType(), DestTy);
+ }
+
+ llvm_unreachable("unknown cast resulting in complex value");
}
ComplexPairTy ComplexExprEmitter::VisitUnaryMinus(const UnaryOperator *E) {
diff --git a/contrib/llvm/tools/clang/lib/CodeGen/CGExprConstant.cpp b/contrib/llvm/tools/clang/lib/CodeGen/CGExprConstant.cpp
index da37bd5..45e44dd 100644
--- a/contrib/llvm/tools/clang/lib/CodeGen/CGExprConstant.cpp
+++ b/contrib/llvm/tools/clang/lib/CodeGen/CGExprConstant.cpp
@@ -433,9 +433,19 @@ llvm::Constant *ConstStructBuilder::
if (!Builder.Build(ILE))
return 0;
+ // Pick the type to use. If the type is layout identical to the ConvertType
+ // type then use it, otherwise use whatever the builder produced for us.
+ const llvm::StructType *STy =
+ llvm::ConstantStruct::getTypeForElements(CGM.getLLVMContext(),
+ Builder.Elements,Builder.Packed);
+ const llvm::Type *ILETy = CGM.getTypes().ConvertType(ILE->getType());
+ if (const llvm::StructType *ILESTy = dyn_cast<llvm::StructType>(ILETy)) {
+ if (ILESTy->isLayoutIdentical(STy))
+ STy = ILESTy;
+ }
+
llvm::Constant *Result =
- llvm::ConstantStruct::get(CGM.getLLVMContext(),
- Builder.Elements, Builder.Packed);
+ llvm::ConstantStruct::get(STy, Builder.Elements);
assert(Builder.NextFieldOffsetInChars.RoundUpToAlignment(
Builder.getAlignment(Result)) ==
@@ -471,6 +481,11 @@ public:
return Visit(PE->getSubExpr());
}
+ llvm::Constant *
+ VisitSubstNonTypeTemplateParmExpr(SubstNonTypeTemplateParmExpr *PE) {
+ return Visit(PE->getReplacement());
+ }
+
llvm::Constant *VisitGenericSelectionExpr(GenericSelectionExpr *GE) {
return Visit(GE->getResultExpr());
}
@@ -523,7 +538,7 @@ public:
// Build a struct with the union sub-element as the first member,
// and padded to the appropriate size
std::vector<llvm::Constant*> Elts;
- std::vector<const llvm::Type*> Types;
+ std::vector<llvm::Type*> Types;
Elts.push_back(C);
Types.push_back(C->getType());
unsigned CurSize = CGM.getTargetData().getTypeAllocSize(C->getType());
@@ -531,7 +546,7 @@ public:
assert(CurSize <= TotalSize && "Union size mismatch!");
if (unsigned NumPadBytes = TotalSize - CurSize) {
- const llvm::Type *Ty = llvm::Type::getInt8Ty(VMContext);
+ llvm::Type *Ty = llvm::Type::getInt8Ty(VMContext);
if (NumPadBytes > 1)
Ty = llvm::ArrayType::get(Ty, NumPadBytes);
@@ -570,6 +585,9 @@ public:
case CK_GetObjCProperty:
case CK_ToVoid:
case CK_Dynamic:
+ case CK_ObjCProduceObject:
+ case CK_ObjCConsumeObject:
+ case CK_ObjCReclaimReturnedObject:
return 0;
// These might need to be supported for constexpr.
@@ -650,6 +668,10 @@ public:
return Visit(DAE->getExpr());
}
+ llvm::Constant *VisitMaterializeTemporaryExpr(MaterializeTemporaryExpr *E) {
+ return Visit(E->GetTemporaryExpr());
+ }
+
llvm::Constant *EmitArrayInitialization(InitListExpr *ILE) {
unsigned NumInitElements = ILE->getNumInits();
if (NumInitElements == 1 && ILE->getType() == ILE->getInit(0)->getType() &&
@@ -694,7 +716,7 @@ public:
if (RewriteType) {
// FIXME: Try to avoid packing the array
- std::vector<const llvm::Type*> Types;
+ std::vector<llvm::Type*> Types;
for (unsigned i = 0; i < Elts.size(); ++i)
Types.push_back(Elts[i]->getType());
const llvm::StructType *SType = llvm::StructType::get(AType->getContext(),
@@ -986,7 +1008,10 @@ llvm::Constant *CodeGenModule::EmitConstantExpr(const Expr *E,
Result.Val.getComplexIntImag());
// FIXME: the target may want to specify that this is packed.
- return llvm::ConstantStruct::get(VMContext, Complex, 2, false);
+ llvm::StructType *STy = llvm::StructType::get(Complex[0]->getType(),
+ Complex[1]->getType(),
+ NULL);
+ return llvm::ConstantStruct::get(STy, Complex);
}
case APValue::Float:
return llvm::ConstantFP::get(VMContext, Result.Val.getFloat());
@@ -999,7 +1024,10 @@ llvm::Constant *CodeGenModule::EmitConstantExpr(const Expr *E,
Result.Val.getComplexFloatImag());
// FIXME: the target may want to specify that this is packed.
- return llvm::ConstantStruct::get(VMContext, Complex, 2, false);
+ llvm::StructType *STy = llvm::StructType::get(Complex[0]->getType(),
+ Complex[1]->getType(),
+ NULL);
+ return llvm::ConstantStruct::get(STy, Complex);
}
case APValue::Vector: {
llvm::SmallVector<llvm::Constant *, 4> Inits;
diff --git a/contrib/llvm/tools/clang/lib/CodeGen/CGExprScalar.cpp b/contrib/llvm/tools/clang/lib/CodeGen/CGExprScalar.cpp
index dff7bf4..a73e667 100644
--- a/contrib/llvm/tools/clang/lib/CodeGen/CGExprScalar.cpp
+++ b/contrib/llvm/tools/clang/lib/CodeGen/CGExprScalar.cpp
@@ -82,15 +82,15 @@ public:
LValue EmitLValue(const Expr *E) { return CGF.EmitLValue(E); }
LValue EmitCheckedLValue(const Expr *E) { return CGF.EmitCheckedLValue(E); }
- Value *EmitLoadOfLValue(LValue LV, QualType T) {
- return CGF.EmitLoadOfLValue(LV, T).getScalarVal();
+ Value *EmitLoadOfLValue(LValue LV) {
+ return CGF.EmitLoadOfLValue(LV).getScalarVal();
}
/// EmitLoadOfLValue - Given an expression with complex type that represents a
/// value l-value, this method emits the address of the l-value, then loads
/// and returns the result.
Value *EmitLoadOfLValue(const Expr *E) {
- return EmitLoadOfLValue(EmitCheckedLValue(E), E->getType());
+ return EmitLoadOfLValue(EmitCheckedLValue(E));
}
/// EmitConversionToBool - Convert the specified expression value to a
@@ -161,6 +161,9 @@ public:
Value *VisitParenExpr(ParenExpr *PE) {
return Visit(PE->getSubExpr());
}
+ Value *VisitSubstNonTypeTemplateParmExpr(SubstNonTypeTemplateParmExpr *E) {
+ return Visit(E->getReplacement());
+ }
Value *VisitGenericSelectionExpr(GenericSelectionExpr *GE) {
return Visit(GE->getResultExpr());
}
@@ -197,7 +200,7 @@ public:
Value *VisitOpaqueValueExpr(OpaqueValueExpr *E) {
if (E->isGLValue())
- return EmitLoadOfLValue(CGF.getOpaqueLValueMapping(E), E->getType());
+ return EmitLoadOfLValue(CGF.getOpaqueLValueMapping(E));
// Otherwise, assume the mapping is the scalar directly.
return CGF.getOpaqueRValueMapping(E).getScalarVal();
@@ -252,7 +255,7 @@ public:
Value *VisitObjCIsaExpr(ObjCIsaExpr *E) {
LValue LV = CGF.EmitObjCIsaExpr(E);
- Value *V = CGF.EmitLoadOfLValue(LV, E->getType()).getScalarVal();
+ Value *V = CGF.EmitLoadOfLValue(LV).getScalarVal();
return V;
}
@@ -269,14 +272,12 @@ public:
Value *VisitImplicitValueInitExpr(const ImplicitValueInitExpr *E) {
return CGF.CGM.EmitNullConstant(E->getType());
}
- Value *VisitCastExpr(CastExpr *E) {
- // Make sure to evaluate VLA bounds now so that we have them for later.
+ Value *VisitExplicitCastExpr(ExplicitCastExpr *E) {
if (E->getType()->isVariablyModifiedType())
- CGF.EmitVLASize(E->getType());
-
- return EmitCastExpr(E);
+ CGF.EmitVariablyModifiedType(E->getType());
+ return VisitCastExpr(E);
}
- Value *EmitCastExpr(CastExpr *E);
+ Value *VisitCastExpr(CastExpr *E);
Value *VisitCallExpr(const CallExpr *E) {
if (E->getCallReturnType()->isReferenceType())
@@ -1001,7 +1002,7 @@ static bool ShouldNullCheckClassCastValue(const CastExpr *CE) {
// VisitCastExpr - Emit code for an explicit or implicit cast. Implicit casts
// have to handle a more broad range of conversions than explicit casts, as they
// handle things like function to ptr-to-function decay etc.
-Value *ScalarExprEmitter::EmitCastExpr(CastExpr *CE) {
+Value *ScalarExprEmitter::VisitCastExpr(CastExpr *CE) {
Expr *E = CE->getSubExpr();
QualType DestTy = CE->getType();
CastKind Kind = CE->getCastKind();
@@ -1020,7 +1021,7 @@ Value *ScalarExprEmitter::EmitCastExpr(CastExpr *CE) {
Value *V = EmitLValue(E).getAddress();
V = Builder.CreateBitCast(V,
ConvertType(CGF.getContext().getPointerType(DestTy)));
- return EmitLoadOfLValue(CGF.MakeAddrLValue(V, DestTy), DestTy);
+ return EmitLoadOfLValue(CGF.MakeAddrLValue(V, DestTy));
}
case CK_AnyPointerToObjCPointerCast:
@@ -1106,7 +1107,17 @@ Value *ScalarExprEmitter::EmitCastExpr(CastExpr *CE) {
// function pointers on Itanium and ARM).
return CGF.CGM.getCXXABI().EmitMemberPointerConversion(CGF, CE, Src);
}
-
+
+ case CK_ObjCProduceObject:
+ return CGF.EmitARCRetainScalarExpr(E);
+ case CK_ObjCConsumeObject:
+ return CGF.EmitObjCConsumeObject(E->getType(), Visit(E));
+ case CK_ObjCReclaimReturnedObject: {
+ llvm::Value *value = Visit(E);
+ value = CGF.EmitARCRetainAutoreleasedReturnValue(value);
+ return CGF.EmitObjCConsumeObject(E->getType(), value);
+ }
+
case CK_FloatingRealToComplex:
case CK_FloatingComplexCast:
case CK_IntegralRealToComplex:
@@ -1122,7 +1133,7 @@ Value *ScalarExprEmitter::EmitCastExpr(CastExpr *CE) {
assert(CGF.getContext().hasSameUnqualifiedType(E->getType(), DestTy));
assert(E->isGLValue() && E->getObjectKind() == OK_ObjCProperty &&
"CK_GetObjCProperty for non-lvalue or non-ObjCProperty");
- RValue RV = CGF.EmitLoadOfLValue(CGF.EmitLValue(E), E->getType());
+ RValue RV = CGF.EmitLoadOfLValue(CGF.EmitLValue(E));
return RV.getScalarVal();
}
@@ -1143,15 +1154,10 @@ Value *ScalarExprEmitter::EmitCastExpr(CastExpr *CE) {
return Builder.CreateIntToPtr(IntResult, ConvertType(DestTy));
}
- case CK_PointerToIntegral: {
- Value *Src = Visit(const_cast<Expr*>(E));
-
- // Handle conversion to bool correctly.
- if (DestTy->isBooleanType())
- return EmitScalarConversion(Src, E->getType(), DestTy);
+ case CK_PointerToIntegral:
+ assert(!DestTy->isBooleanType() && "bool should use PointerToBool");
+ return Builder.CreatePtrToInt(Visit(E), ConvertType(DestTy));
- return Builder.CreatePtrToInt(Src, ConvertType(DestTy));
- }
case CK_ToVoid: {
CGF.EmitIgnoredExpr(E);
return 0;
@@ -1221,7 +1227,7 @@ Value *ScalarExprEmitter::VisitStmtExpr(const StmtExpr *E) {
Value *ScalarExprEmitter::VisitBlockDeclRefExpr(const BlockDeclRefExpr *E) {
LValue LV = CGF.EmitBlockDeclRefLValue(E);
- return CGF.EmitLoadOfLValue(LV, E->getType()).getScalarVal();
+ return CGF.EmitLoadOfLValue(LV).getScalarVal();
}
//===----------------------------------------------------------------------===//
@@ -1258,7 +1264,7 @@ ScalarExprEmitter::EmitScalarPrePostIncDec(const UnaryOperator *E, LValue LV,
bool isInc, bool isPre) {
QualType type = E->getSubExpr()->getType();
- llvm::Value *value = EmitLoadOfLValue(LV, type);
+ llvm::Value *value = EmitLoadOfLValue(LV);
llvm::Value *input = value;
int amount = (isInc ? 1 : -1);
@@ -1282,7 +1288,7 @@ ScalarExprEmitter::EmitScalarPrePostIncDec(const UnaryOperator *E, LValue LV,
// overflow because of promotion rules; we're just eliding a few steps here.
if (type->isSignedIntegerOrEnumerationType() &&
value->getType()->getPrimitiveSizeInBits() >=
- CGF.CGM.IntTy->getBitWidth())
+ CGF.IntTy->getBitWidth())
value = EmitAddConsiderOverflowBehavior(E, value, amt, isInc);
else
value = Builder.CreateAdd(value, amt, isInc ? "inc" : "dec");
@@ -1292,16 +1298,14 @@ ScalarExprEmitter::EmitScalarPrePostIncDec(const UnaryOperator *E, LValue LV,
QualType type = ptr->getPointeeType();
// VLA types don't have constant size.
- if (type->isVariableArrayType()) {
- llvm::Value *vlaSize =
- CGF.GetVLASize(CGF.getContext().getAsVariableArrayType(type));
- value = CGF.EmitCastToVoidPtr(value);
- if (!isInc) vlaSize = Builder.CreateNSWNeg(vlaSize, "vla.negsize");
+ if (const VariableArrayType *vla
+ = CGF.getContext().getAsVariableArrayType(type)) {
+ llvm::Value *numElts = CGF.getVLASize(vla).first;
+ if (!isInc) numElts = Builder.CreateNSWNeg(numElts, "vla.negsize");
if (CGF.getContext().getLangOptions().isSignedOverflowDefined())
- value = Builder.CreateGEP(value, vlaSize, "vla.inc");
+ value = Builder.CreateGEP(value, numElts, "vla.inc");
else
- value = Builder.CreateInBoundsGEP(value, vlaSize, "vla.inc");
- value = Builder.CreateBitCast(value, input->getType());
+ value = Builder.CreateInBoundsGEP(value, numElts, "vla.inc");
// Arithmetic on function pointers (!) is just +-1.
} else if (type->isFunctionType()) {
@@ -1374,9 +1378,9 @@ ScalarExprEmitter::EmitScalarPrePostIncDec(const UnaryOperator *E, LValue LV,
// Store the updated result through the lvalue.
if (LV.isBitField())
- CGF.EmitStoreThroughBitfieldLValue(RValue::get(value), LV, type, &value);
+ CGF.EmitStoreThroughBitfieldLValue(RValue::get(value), LV, &value);
else
- CGF.EmitStoreThroughLValue(RValue::get(value), LV, type);
+ CGF.EmitStoreThroughLValue(RValue::get(value), LV);
// If this is a postinc, return the value read from memory, otherwise use the
// updated value.
@@ -1521,14 +1525,25 @@ ScalarExprEmitter::VisitUnaryExprOrTypeTraitExpr(
CGF.getContext().getAsVariableArrayType(TypeToSize)) {
if (E->isArgumentType()) {
// sizeof(type) - make sure to emit the VLA size.
- CGF.EmitVLASize(TypeToSize);
+ CGF.EmitVariablyModifiedType(TypeToSize);
} else {
// C99 6.5.3.4p2: If the argument is an expression of type
// VLA, it is evaluated.
CGF.EmitIgnoredExpr(E->getArgumentExpr());
}
- return CGF.GetVLASize(VAT);
+ QualType eltType;
+ llvm::Value *numElts;
+ llvm::tie(numElts, eltType) = CGF.getVLASize(VAT);
+
+ llvm::Value *size = numElts;
+
+ // Scale the number of non-VLA elements by the non-VLA element size.
+ CharUnits eltSize = CGF.getContext().getTypeSizeInChars(eltType);
+ if (!eltSize.isOne())
+ size = CGF.Builder.CreateNUWMul(CGF.CGM.getSize(eltSize), numElts);
+
+ return size;
}
}
@@ -1546,8 +1561,7 @@ Value *ScalarExprEmitter::VisitUnaryReal(const UnaryOperator *E) {
// Note that we have to ask E because Op might be an l-value that
// this won't work for, e.g. an Obj-C property.
if (E->isGLValue())
- return CGF.EmitLoadOfLValue(CGF.EmitLValue(E), E->getType())
- .getScalarVal();
+ return CGF.EmitLoadOfLValue(CGF.EmitLValue(E)).getScalarVal();
// Otherwise, calculate and project.
return CGF.EmitComplexExpr(Op, false, true).first;
@@ -1563,8 +1577,7 @@ Value *ScalarExprEmitter::VisitUnaryImag(const UnaryOperator *E) {
// Note that we have to ask E because Op might be an l-value that
// this won't work for, e.g. an Obj-C property.
if (Op->isGLValue())
- return CGF.EmitLoadOfLValue(CGF.EmitLValue(E), E->getType())
- .getScalarVal();
+ return CGF.EmitLoadOfLValue(CGF.EmitLValue(E)).getScalarVal();
// Otherwise, calculate and project.
return CGF.EmitComplexExpr(Op, true, false).second;
@@ -1616,7 +1629,7 @@ LValue ScalarExprEmitter::EmitCompoundAssignLValue(
OpInfo.E = E;
// Load/convert the LHS.
LValue LHSLV = EmitCheckedLValue(E->getLHS());
- OpInfo.LHS = EmitLoadOfLValue(LHSLV, LHSTy);
+ OpInfo.LHS = EmitLoadOfLValue(LHSLV);
OpInfo.LHS = EmitScalarConversion(OpInfo.LHS, LHSTy,
E->getComputationLHSType());
@@ -1631,10 +1644,9 @@ LValue ScalarExprEmitter::EmitCompoundAssignLValue(
// 'An assignment expression has the value of the left operand after the
// assignment...'.
if (LHSLV.isBitField())
- CGF.EmitStoreThroughBitfieldLValue(RValue::get(Result), LHSLV, LHSTy,
- &Result);
+ CGF.EmitStoreThroughBitfieldLValue(RValue::get(Result), LHSLV, &Result);
else
- CGF.EmitStoreThroughLValue(RValue::get(Result), LHSLV, LHSTy);
+ CGF.EmitStoreThroughLValue(RValue::get(Result), LHSLV);
return LHSLV;
}
@@ -1662,15 +1674,17 @@ Value *ScalarExprEmitter::EmitCompoundAssign(const CompoundAssignOperator *E,
return RHS;
// Otherwise, reload the value.
- return EmitLoadOfLValue(LHS, E->getType());
+ return EmitLoadOfLValue(LHS);
}
void ScalarExprEmitter::EmitUndefinedBehaviorIntegerDivAndRemCheck(
const BinOpInfo &Ops,
llvm::Value *Zero, bool isDiv) {
- llvm::BasicBlock *overflowBB = CGF.createBasicBlock("overflow", CGF.CurFn);
+ llvm::Function::iterator insertPt = Builder.GetInsertBlock();
llvm::BasicBlock *contBB =
- CGF.createBasicBlock(isDiv ? "div.cont" : "rem.cont", CGF.CurFn);
+ CGF.createBasicBlock(isDiv ? "div.cont" : "rem.cont", CGF.CurFn,
+ llvm::next(insertPt));
+ llvm::BasicBlock *overflowBB = CGF.createBasicBlock("overflow", CGF.CurFn);
const llvm::IntegerType *Ty = cast<llvm::IntegerType>(Zero->getType());
@@ -1700,9 +1714,11 @@ Value *ScalarExprEmitter::EmitDiv(const BinOpInfo &Ops) {
if (Ops.Ty->isIntegerType())
EmitUndefinedBehaviorIntegerDivAndRemCheck(Ops, Zero, true);
else if (Ops.Ty->isRealFloatingType()) {
+ llvm::Function::iterator insertPt = Builder.GetInsertBlock();
+ llvm::BasicBlock *DivCont = CGF.createBasicBlock("div.cont", CGF.CurFn,
+ llvm::next(insertPt));
llvm::BasicBlock *overflowBB = CGF.createBasicBlock("overflow",
CGF.CurFn);
- llvm::BasicBlock *DivCont = CGF.createBasicBlock("div.cont", CGF.CurFn);
CGF.Builder.CreateCondBr(Builder.CreateFCmpOEQ(Ops.RHS, Zero),
overflowBB, DivCont);
EmitOverflowBB(overflowBB);
@@ -1759,9 +1775,9 @@ Value *ScalarExprEmitter::EmitOverflowCheckedBinOp(const BinOpInfo &Ops) {
OpID <<= 1;
OpID |= 1;
- const llvm::Type *opTy = CGF.CGM.getTypes().ConvertType(Ops.Ty);
+ llvm::Type *opTy = CGF.CGM.getTypes().ConvertType(Ops.Ty);
- llvm::Function *intrinsic = CGF.CGM.getIntrinsic(IID, &opTy, 1);
+ llvm::Function *intrinsic = CGF.CGM.getIntrinsic(IID, opTy);
Value *resultAndOverflow = Builder.CreateCall2(intrinsic, Ops.LHS, Ops.RHS);
Value *result = Builder.CreateExtractValue(resultAndOverflow, 0);
@@ -1769,8 +1785,10 @@ Value *ScalarExprEmitter::EmitOverflowCheckedBinOp(const BinOpInfo &Ops) {
// Branch in case of overflow.
llvm::BasicBlock *initialBB = Builder.GetInsertBlock();
+ llvm::Function::iterator insertPt = initialBB;
+ llvm::BasicBlock *continueBB = CGF.createBasicBlock("nooverflow", CGF.CurFn,
+ llvm::next(insertPt));
llvm::BasicBlock *overflowBB = CGF.createBasicBlock("overflow", CGF.CurFn);
- llvm::BasicBlock *continueBB = CGF.createBasicBlock("nooverflow", CGF.CurFn);
Builder.CreateCondBr(overflow, overflowBB, continueBB);
@@ -1788,8 +1806,8 @@ Value *ScalarExprEmitter::EmitOverflowCheckedBinOp(const BinOpInfo &Ops) {
Builder.SetInsertPoint(overflowBB);
// Get the overflow handler.
- const llvm::Type *Int8Ty = llvm::Type::getInt8Ty(VMContext);
- const llvm::Type *argTypes[] = { CGF.Int64Ty, CGF.Int64Ty, Int8Ty, Int8Ty };
+ llvm::Type *Int8Ty = llvm::Type::getInt8Ty(VMContext);
+ llvm::Type *argTypes[] = { CGF.Int64Ty, CGF.Int64Ty, Int8Ty, Int8Ty };
llvm::FunctionType *handlerTy =
llvm::FunctionType::get(CGF.Int64Ty, argTypes, true);
llvm::Value *handler = CGF.CGM.CreateRuntimeFunction(handlerTy, *handlerName);
@@ -1817,196 +1835,187 @@ Value *ScalarExprEmitter::EmitOverflowCheckedBinOp(const BinOpInfo &Ops) {
return phi;
}
-Value *ScalarExprEmitter::EmitAdd(const BinOpInfo &Ops) {
- if (!Ops.Ty->isAnyPointerType()) {
- if (Ops.Ty->isSignedIntegerOrEnumerationType()) {
- switch (CGF.getContext().getLangOptions().getSignedOverflowBehavior()) {
- case LangOptions::SOB_Undefined:
- return Builder.CreateNSWAdd(Ops.LHS, Ops.RHS, "add");
- case LangOptions::SOB_Defined:
- return Builder.CreateAdd(Ops.LHS, Ops.RHS, "add");
- case LangOptions::SOB_Trapping:
- return EmitOverflowCheckedBinOp(Ops);
- }
- }
-
- if (Ops.LHS->getType()->isFPOrFPVectorTy())
- return Builder.CreateFAdd(Ops.LHS, Ops.RHS, "add");
-
- return Builder.CreateAdd(Ops.LHS, Ops.RHS, "add");
- }
-
- // Must have binary (not unary) expr here. Unary pointer decrement doesn't
- // use this path.
- const BinaryOperator *BinOp = cast<BinaryOperator>(Ops.E);
-
- if (Ops.Ty->isPointerType() &&
- Ops.Ty->getAs<PointerType>()->isVariableArrayType()) {
- // The amount of the addition needs to account for the VLA size
- CGF.ErrorUnsupported(BinOp, "VLA pointer addition");
- }
+/// Emit pointer + index arithmetic.
+static Value *emitPointerArithmetic(CodeGenFunction &CGF,
+ const BinOpInfo &op,
+ bool isSubtraction) {
+ // Must have binary (not unary) expr here. Unary pointer
+ // increment/decrement doesn't use this path.
+ const BinaryOperator *expr = cast<BinaryOperator>(op.E);
- Value *Ptr, *Idx;
- Expr *IdxExp;
- const PointerType *PT = BinOp->getLHS()->getType()->getAs<PointerType>();
- const ObjCObjectPointerType *OPT =
- BinOp->getLHS()->getType()->getAs<ObjCObjectPointerType>();
- if (PT || OPT) {
- Ptr = Ops.LHS;
- Idx = Ops.RHS;
- IdxExp = BinOp->getRHS();
- } else { // int + pointer
- PT = BinOp->getRHS()->getType()->getAs<PointerType>();
- OPT = BinOp->getRHS()->getType()->getAs<ObjCObjectPointerType>();
- assert((PT || OPT) && "Invalid add expr");
- Ptr = Ops.RHS;
- Idx = Ops.LHS;
- IdxExp = BinOp->getLHS();
- }
-
- unsigned Width = cast<llvm::IntegerType>(Idx->getType())->getBitWidth();
- if (Width < CGF.PointerWidthInBits) {
- // Zero or sign extend the pointer value based on whether the index is
- // signed or not.
- const llvm::Type *IdxType = CGF.IntPtrTy;
- if (IdxExp->getType()->isSignedIntegerOrEnumerationType())
- Idx = Builder.CreateSExt(Idx, IdxType, "idx.ext");
- else
- Idx = Builder.CreateZExt(Idx, IdxType, "idx.ext");
- }
- const QualType ElementType = PT ? PT->getPointeeType() : OPT->getPointeeType();
- // Handle interface types, which are not represented with a concrete type.
- if (const ObjCObjectType *OIT = ElementType->getAs<ObjCObjectType>()) {
- llvm::Value *InterfaceSize =
- llvm::ConstantInt::get(Idx->getType(),
- CGF.getContext().getTypeSizeInChars(OIT).getQuantity());
- Idx = Builder.CreateMul(Idx, InterfaceSize);
- const llvm::Type *i8Ty = llvm::Type::getInt8PtrTy(VMContext);
- Value *Casted = Builder.CreateBitCast(Ptr, i8Ty);
- Value *Res = Builder.CreateGEP(Casted, Idx, "add.ptr");
- return Builder.CreateBitCast(Res, Ptr->getType());
+ Value *pointer = op.LHS;
+ Expr *pointerOperand = expr->getLHS();
+ Value *index = op.RHS;
+ Expr *indexOperand = expr->getRHS();
+
+ // In a subtraction, the LHS is always the pointer.
+ if (!isSubtraction && !pointer->getType()->isPointerTy()) {
+ std::swap(pointer, index);
+ std::swap(pointerOperand, indexOperand);
+ }
+
+ unsigned width = cast<llvm::IntegerType>(index->getType())->getBitWidth();
+ if (width != CGF.PointerWidthInBits) {
+ // Zero-extend or sign-extend the pointer value according to
+ // whether the index is signed or not.
+ bool isSigned = indexOperand->getType()->isSignedIntegerOrEnumerationType();
+ index = CGF.Builder.CreateIntCast(index, CGF.PtrDiffTy, isSigned,
+ "idx.ext");
+ }
+
+ // If this is subtraction, negate the index.
+ if (isSubtraction)
+ index = CGF.Builder.CreateNeg(index, "idx.neg");
+
+ const PointerType *pointerType
+ = pointerOperand->getType()->getAs<PointerType>();
+ if (!pointerType) {
+ QualType objectType = pointerOperand->getType()
+ ->castAs<ObjCObjectPointerType>()
+ ->getPointeeType();
+ llvm::Value *objectSize
+ = CGF.CGM.getSize(CGF.getContext().getTypeSizeInChars(objectType));
+
+ index = CGF.Builder.CreateMul(index, objectSize);
+
+ Value *result = CGF.Builder.CreateBitCast(pointer, CGF.VoidPtrTy);
+ result = CGF.Builder.CreateGEP(result, index, "add.ptr");
+ return CGF.Builder.CreateBitCast(result, pointer->getType());
+ }
+
+ QualType elementType = pointerType->getPointeeType();
+ if (const VariableArrayType *vla
+ = CGF.getContext().getAsVariableArrayType(elementType)) {
+ // The element count here is the total number of non-VLA elements.
+ llvm::Value *numElements = CGF.getVLASize(vla).first;
+
+ // Effectively, the multiply by the VLA size is part of the GEP.
+ // GEP indexes are signed, and scaling an index isn't permitted to
+ // signed-overflow, so we use the same semantics for our explicit
+ // multiply. We suppress this if overflow is not undefined behavior.
+ if (CGF.getLangOptions().isSignedOverflowDefined()) {
+ index = CGF.Builder.CreateMul(index, numElements, "vla.index");
+ pointer = CGF.Builder.CreateGEP(pointer, index, "add.ptr");
+ } else {
+ index = CGF.Builder.CreateNSWMul(index, numElements, "vla.index");
+ pointer = CGF.Builder.CreateInBoundsGEP(pointer, index, "add.ptr");
+ }
+ return pointer;
}
// Explicitly handle GNU void* and function pointer arithmetic extensions. The
// GNU void* casts amount to no-ops since our void* type is i8*, but this is
// future proof.
- if (ElementType->isVoidType() || ElementType->isFunctionType()) {
- const llvm::Type *i8Ty = llvm::Type::getInt8PtrTy(VMContext);
- Value *Casted = Builder.CreateBitCast(Ptr, i8Ty);
- Value *Res = Builder.CreateGEP(Casted, Idx, "add.ptr");
- return Builder.CreateBitCast(Res, Ptr->getType());
+ if (elementType->isVoidType() || elementType->isFunctionType()) {
+ Value *result = CGF.Builder.CreateBitCast(pointer, CGF.VoidPtrTy);
+ result = CGF.Builder.CreateGEP(result, index, "add.ptr");
+ return CGF.Builder.CreateBitCast(result, pointer->getType());
}
- if (CGF.getContext().getLangOptions().isSignedOverflowDefined())
- return Builder.CreateGEP(Ptr, Idx, "add.ptr");
- return Builder.CreateInBoundsGEP(Ptr, Idx, "add.ptr");
+ if (CGF.getLangOptions().isSignedOverflowDefined())
+ return CGF.Builder.CreateGEP(pointer, index, "add.ptr");
+
+ return CGF.Builder.CreateInBoundsGEP(pointer, index, "add.ptr");
}
-Value *ScalarExprEmitter::EmitSub(const BinOpInfo &Ops) {
- if (!isa<llvm::PointerType>(Ops.LHS->getType())) {
- if (Ops.Ty->isSignedIntegerOrEnumerationType()) {
+Value *ScalarExprEmitter::EmitAdd(const BinOpInfo &op) {
+ if (op.LHS->getType()->isPointerTy() ||
+ op.RHS->getType()->isPointerTy())
+ return emitPointerArithmetic(CGF, op, /*subtraction*/ false);
+
+ if (op.Ty->isSignedIntegerOrEnumerationType()) {
+ switch (CGF.getContext().getLangOptions().getSignedOverflowBehavior()) {
+ case LangOptions::SOB_Undefined:
+ return Builder.CreateNSWAdd(op.LHS, op.RHS, "add");
+ case LangOptions::SOB_Defined:
+ return Builder.CreateAdd(op.LHS, op.RHS, "add");
+ case LangOptions::SOB_Trapping:
+ return EmitOverflowCheckedBinOp(op);
+ }
+ }
+
+ if (op.LHS->getType()->isFPOrFPVectorTy())
+ return Builder.CreateFAdd(op.LHS, op.RHS, "add");
+
+ return Builder.CreateAdd(op.LHS, op.RHS, "add");
+}
+
+Value *ScalarExprEmitter::EmitSub(const BinOpInfo &op) {
+ // The LHS is always a pointer if either side is.
+ if (!op.LHS->getType()->isPointerTy()) {
+ if (op.Ty->isSignedIntegerOrEnumerationType()) {
switch (CGF.getContext().getLangOptions().getSignedOverflowBehavior()) {
case LangOptions::SOB_Undefined:
- return Builder.CreateNSWSub(Ops.LHS, Ops.RHS, "sub");
+ return Builder.CreateNSWSub(op.LHS, op.RHS, "sub");
case LangOptions::SOB_Defined:
- return Builder.CreateSub(Ops.LHS, Ops.RHS, "sub");
+ return Builder.CreateSub(op.LHS, op.RHS, "sub");
case LangOptions::SOB_Trapping:
- return EmitOverflowCheckedBinOp(Ops);
+ return EmitOverflowCheckedBinOp(op);
}
}
- if (Ops.LHS->getType()->isFPOrFPVectorTy())
- return Builder.CreateFSub(Ops.LHS, Ops.RHS, "sub");
+ if (op.LHS->getType()->isFPOrFPVectorTy())
+ return Builder.CreateFSub(op.LHS, op.RHS, "sub");
- return Builder.CreateSub(Ops.LHS, Ops.RHS, "sub");
+ return Builder.CreateSub(op.LHS, op.RHS, "sub");
}
- // Must have binary (not unary) expr here. Unary pointer increment doesn't
- // use this path.
- const BinaryOperator *BinOp = cast<BinaryOperator>(Ops.E);
-
- if (BinOp->getLHS()->getType()->isPointerType() &&
- BinOp->getLHS()->getType()->getAs<PointerType>()->isVariableArrayType()) {
- // The amount of the addition needs to account for the VLA size for
- // ptr-int
- // The amount of the division needs to account for the VLA size for
- // ptr-ptr.
- CGF.ErrorUnsupported(BinOp, "VLA pointer subtraction");
- }
-
- const QualType LHSType = BinOp->getLHS()->getType();
- const QualType LHSElementType = LHSType->getPointeeType();
- if (!isa<llvm::PointerType>(Ops.RHS->getType())) {
- // pointer - int
- Value *Idx = Ops.RHS;
- unsigned Width = cast<llvm::IntegerType>(Idx->getType())->getBitWidth();
- if (Width < CGF.PointerWidthInBits) {
- // Zero or sign extend the pointer value based on whether the index is
- // signed or not.
- const llvm::Type *IdxType = CGF.IntPtrTy;
- if (BinOp->getRHS()->getType()->isSignedIntegerOrEnumerationType())
- Idx = Builder.CreateSExt(Idx, IdxType, "idx.ext");
- else
- Idx = Builder.CreateZExt(Idx, IdxType, "idx.ext");
- }
- Idx = Builder.CreateNeg(Idx, "sub.ptr.neg");
-
- // Handle interface types, which are not represented with a concrete type.
- if (const ObjCObjectType *OIT = LHSElementType->getAs<ObjCObjectType>()) {
- llvm::Value *InterfaceSize =
- llvm::ConstantInt::get(Idx->getType(),
- CGF.getContext().
- getTypeSizeInChars(OIT).getQuantity());
- Idx = Builder.CreateMul(Idx, InterfaceSize);
- const llvm::Type *i8Ty = llvm::Type::getInt8PtrTy(VMContext);
- Value *LHSCasted = Builder.CreateBitCast(Ops.LHS, i8Ty);
- Value *Res = Builder.CreateGEP(LHSCasted, Idx, "add.ptr");
- return Builder.CreateBitCast(Res, Ops.LHS->getType());
- }
+ // If the RHS is not a pointer, then we have normal pointer
+ // arithmetic.
+ if (!op.RHS->getType()->isPointerTy())
+ return emitPointerArithmetic(CGF, op, /*subtraction*/ true);
- // Explicitly handle GNU void* and function pointer arithmetic
- // extensions. The GNU void* casts amount to no-ops since our void* type is
- // i8*, but this is future proof.
- if (LHSElementType->isVoidType() || LHSElementType->isFunctionType()) {
- const llvm::Type *i8Ty = llvm::Type::getInt8PtrTy(VMContext);
- Value *LHSCasted = Builder.CreateBitCast(Ops.LHS, i8Ty);
- Value *Res = Builder.CreateGEP(LHSCasted, Idx, "sub.ptr");
- return Builder.CreateBitCast(Res, Ops.LHS->getType());
- }
+ // Otherwise, this is a pointer subtraction.
- if (CGF.getContext().getLangOptions().isSignedOverflowDefined())
- return Builder.CreateGEP(Ops.LHS, Idx, "sub.ptr");
- return Builder.CreateInBoundsGEP(Ops.LHS, Idx, "sub.ptr");
- }
-
- // pointer - pointer
- Value *LHS = Ops.LHS;
- Value *RHS = Ops.RHS;
+ // Do the raw subtraction part.
+ llvm::Value *LHS
+ = Builder.CreatePtrToInt(op.LHS, CGF.PtrDiffTy, "sub.ptr.lhs.cast");
+ llvm::Value *RHS
+ = Builder.CreatePtrToInt(op.RHS, CGF.PtrDiffTy, "sub.ptr.rhs.cast");
+ Value *diffInChars = Builder.CreateSub(LHS, RHS, "sub.ptr.sub");
- CharUnits ElementSize;
+ // Okay, figure out the element size.
+ const BinaryOperator *expr = cast<BinaryOperator>(op.E);
+ QualType elementType = expr->getLHS()->getType()->getPointeeType();
- // Handle GCC extension for pointer arithmetic on void* and function pointer
- // types.
- if (LHSElementType->isVoidType() || LHSElementType->isFunctionType())
- ElementSize = CharUnits::One();
- else
- ElementSize = CGF.getContext().getTypeSizeInChars(LHSElementType);
+ llvm::Value *divisor = 0;
- const llvm::Type *ResultType = ConvertType(Ops.Ty);
- LHS = Builder.CreatePtrToInt(LHS, ResultType, "sub.ptr.lhs.cast");
- RHS = Builder.CreatePtrToInt(RHS, ResultType, "sub.ptr.rhs.cast");
- Value *BytesBetween = Builder.CreateSub(LHS, RHS, "sub.ptr.sub");
+ // For a variable-length array, this is going to be non-constant.
+ if (const VariableArrayType *vla
+ = CGF.getContext().getAsVariableArrayType(elementType)) {
+ llvm::Value *numElements;
+ llvm::tie(numElements, elementType) = CGF.getVLASize(vla);
- // Optimize out the shift for element size of 1.
- if (ElementSize.isOne())
- return BytesBetween;
+ divisor = numElements;
+ // Scale the number of non-VLA elements by the non-VLA element size.
+ CharUnits eltSize = CGF.getContext().getTypeSizeInChars(elementType);
+ if (!eltSize.isOne())
+ divisor = CGF.Builder.CreateNUWMul(CGF.CGM.getSize(eltSize), divisor);
+
+ // For everything elese, we can just compute it, safe in the
+ // assumption that Sema won't let anything through that we can't
+ // safely compute the size of.
+ } else {
+ CharUnits elementSize;
+ // Handle GCC extension for pointer arithmetic on void* and
+ // function pointer types.
+ if (elementType->isVoidType() || elementType->isFunctionType())
+ elementSize = CharUnits::One();
+ else
+ elementSize = CGF.getContext().getTypeSizeInChars(elementType);
+
+ // Don't even emit the divide for element size of 1.
+ if (elementSize.isOne())
+ return diffInChars;
+
+ divisor = CGF.CGM.getSize(elementSize);
+ }
+
// Otherwise, do a full sdiv. This uses the "exact" form of sdiv, since
// pointer difference in C is only defined in the case where both operands
// are pointing to elements of an array.
- Value *BytesPerElt =
- llvm::ConstantInt::get(ResultType, ElementSize.getQuantity());
- return Builder.CreateExactSDiv(BytesBetween, BytesPerElt, "sub.ptr.div");
+ return Builder.CreateExactSDiv(diffInChars, divisor, "sub.ptr.div");
}
Value *ScalarExprEmitter::EmitShl(const BinOpInfo &Ops) {
@@ -2228,20 +2237,41 @@ Value *ScalarExprEmitter::EmitCompare(const BinaryOperator *E,unsigned UICmpOpc,
Value *ScalarExprEmitter::VisitBinAssign(const BinaryOperator *E) {
bool Ignore = TestAndClearIgnoreResultAssign();
- // __block variables need to have the rhs evaluated first, plus this should
- // improve codegen just a little.
- Value *RHS = Visit(E->getRHS());
- LValue LHS = EmitCheckedLValue(E->getLHS());
-
- // Store the value into the LHS. Bit-fields are handled specially
- // because the result is altered by the store, i.e., [C99 6.5.16p1]
- // 'An assignment expression has the value of the left operand after
- // the assignment...'.
- if (LHS.isBitField())
- CGF.EmitStoreThroughBitfieldLValue(RValue::get(RHS), LHS, E->getType(),
- &RHS);
- else
- CGF.EmitStoreThroughLValue(RValue::get(RHS), LHS, E->getType());
+ Value *RHS;
+ LValue LHS;
+
+ switch (E->getLHS()->getType().getObjCLifetime()) {
+ case Qualifiers::OCL_Strong:
+ llvm::tie(LHS, RHS) = CGF.EmitARCStoreStrong(E, Ignore);
+ break;
+
+ case Qualifiers::OCL_Autoreleasing:
+ llvm::tie(LHS,RHS) = CGF.EmitARCStoreAutoreleasing(E);
+ break;
+
+ case Qualifiers::OCL_Weak:
+ RHS = Visit(E->getRHS());
+ LHS = EmitCheckedLValue(E->getLHS());
+ RHS = CGF.EmitARCStoreWeak(LHS.getAddress(), RHS, Ignore);
+ break;
+
+ // No reason to do any of these differently.
+ case Qualifiers::OCL_None:
+ case Qualifiers::OCL_ExplicitNone:
+ // __block variables need to have the rhs evaluated first, plus
+ // this should improve codegen just a little.
+ RHS = Visit(E->getRHS());
+ LHS = EmitCheckedLValue(E->getLHS());
+
+ // Store the value into the LHS. Bit-fields are handled specially
+ // because the result is altered by the store, i.e., [C99 6.5.16p1]
+ // 'An assignment expression has the value of the left operand after
+ // the assignment...'.
+ if (LHS.isBitField())
+ CGF.EmitStoreThroughBitfieldLValue(RValue::get(RHS), LHS, &RHS);
+ else
+ CGF.EmitStoreThroughLValue(RValue::get(RHS), LHS);
+ }
// If the result is clearly ignored, return now.
if (Ignore)
@@ -2260,7 +2290,7 @@ Value *ScalarExprEmitter::VisitBinAssign(const BinaryOperator *E) {
return RHS;
// Otherwise, reload the value.
- return EmitLoadOfLValue(LHS, E->getType());
+ return EmitLoadOfLValue(LHS);
}
Value *ScalarExprEmitter::VisitBinLAnd(const BinaryOperator *E) {
@@ -2548,7 +2578,7 @@ Value *ScalarExprEmitter::VisitBlockExpr(const BlockExpr *block) {
Value *ScalarExprEmitter::VisitAsTypeExpr(AsTypeExpr *E) {
Value *Src = CGF.EmitScalarExpr(E->getSrcExpr());
- const llvm::Type * DstTy = ConvertType(E->getDstType());
+ const llvm::Type *DstTy = ConvertType(E->getType());
// Going from vec4->vec3 or vec3->vec4 is a special case and requires
// a shuffle vector instead of a bitcast.
@@ -2656,7 +2686,7 @@ LValue CodeGenFunction::EmitObjCIsaExpr(const ObjCIsaExpr *E) {
llvm::Value *Src = EmitScalarExpr(BaseExpr);
Builder.CreateStore(Src, V);
V = ScalarExprEmitter(*this).EmitLoadOfLValue(
- MakeAddrLValue(V, E->getType()), E->getType());
+ MakeAddrLValue(V, E->getType()));
} else {
if (E->isArrow())
V = ScalarExprEmitter(*this).EmitLoadOfLValue(BaseExpr);
diff --git a/contrib/llvm/tools/clang/lib/CodeGen/CGObjC.cpp b/contrib/llvm/tools/clang/lib/CodeGen/CGObjC.cpp
index fa42cd1..426cca0 100644
--- a/contrib/llvm/tools/clang/lib/CodeGen/CGObjC.cpp
+++ b/contrib/llvm/tools/clang/lib/CodeGen/CGObjC.cpp
@@ -15,15 +15,29 @@
#include "CGObjCRuntime.h"
#include "CodeGenFunction.h"
#include "CodeGenModule.h"
+#include "TargetInfo.h"
#include "clang/AST/ASTContext.h"
#include "clang/AST/DeclObjC.h"
#include "clang/AST/StmtObjC.h"
#include "clang/Basic/Diagnostic.h"
#include "llvm/ADT/STLExtras.h"
#include "llvm/Target/TargetData.h"
+#include "llvm/InlineAsm.h"
using namespace clang;
using namespace CodeGen;
+typedef llvm::PointerIntPair<llvm::Value*,1,bool> TryEmitResult;
+static TryEmitResult
+tryEmitARCRetainScalarExpr(CodeGenFunction &CGF, const Expr *e);
+
+/// Given the address of a variable of pointer type, find the correct
+/// null to store into it.
+static llvm::Constant *getNullForVariable(llvm::Value *addr) {
+ const llvm::Type *type =
+ cast<llvm::PointerType>(addr->getType())->getElementType();
+ return llvm::ConstantPointerNull::get(cast<llvm::PointerType>(type));
+}
+
/// Emits an instance of NSConstantString representing the object.
llvm::Value *CodeGenFunction::EmitObjCStringLiteral(const ObjCStringLiteral *E)
{
@@ -55,6 +69,7 @@ static RValue AdjustRelatedResultType(CodeGenFunction &CGF,
RValue Result) {
if (!Method)
return Result;
+
if (!Method->hasRelatedResultType() ||
CGF.getContext().hasSameType(E->getType(), Method->getResultType()) ||
!Result.isScalar())
@@ -71,6 +86,18 @@ RValue CodeGenFunction::EmitObjCMessageExpr(const ObjCMessageExpr *E,
// implementation vary between runtimes. We can get the receiver and
// arguments in generic code.
+ bool isDelegateInit = E->isDelegateInitCall();
+
+ // We don't retain the receiver in delegate init calls, and this is
+ // safe because the receiver value is always loaded from 'self',
+ // which we zero out. We don't want to Block_copy block receivers,
+ // though.
+ bool retainSelf =
+ (!isDelegateInit &&
+ CGM.getLangOptions().ObjCAutoRefCount &&
+ E->getMethodDecl() &&
+ E->getMethodDecl()->hasAttr<NSConsumesSelfAttr>());
+
CGObjCRuntime &Runtime = CGM.getObjCRuntime();
bool isSuperMessage = false;
bool isClassMessage = false;
@@ -80,8 +107,15 @@ RValue CodeGenFunction::EmitObjCMessageExpr(const ObjCMessageExpr *E,
llvm::Value *Receiver = 0;
switch (E->getReceiverKind()) {
case ObjCMessageExpr::Instance:
- Receiver = EmitScalarExpr(E->getInstanceReceiver());
ReceiverType = E->getInstanceReceiver()->getType();
+ if (retainSelf) {
+ TryEmitResult ter = tryEmitARCRetainScalarExpr(*this,
+ E->getInstanceReceiver());
+ Receiver = ter.getPointer();
+ if (!ter.getInt())
+ Receiver = EmitARCRetainNonBlock(Receiver);
+ } else
+ Receiver = EmitScalarExpr(E->getInstanceReceiver());
break;
case ObjCMessageExpr::Class: {
@@ -92,6 +126,9 @@ RValue CodeGenFunction::EmitObjCMessageExpr(const ObjCMessageExpr *E,
assert(OID && "Invalid Objective-C class message send");
Receiver = Runtime.GetClass(Builder, OID);
isClassMessage = true;
+
+ if (retainSelf)
+ Receiver = EmitARCRetainNonBlock(Receiver);
break;
}
@@ -99,6 +136,9 @@ RValue CodeGenFunction::EmitObjCMessageExpr(const ObjCMessageExpr *E,
ReceiverType = E->getSuperType();
Receiver = LoadObjCSelf();
isSuperMessage = true;
+
+ if (retainSelf)
+ Receiver = EmitARCRetainNonBlock(Receiver);
break;
case ObjCMessageExpr::SuperClass:
@@ -106,14 +146,36 @@ RValue CodeGenFunction::EmitObjCMessageExpr(const ObjCMessageExpr *E,
Receiver = LoadObjCSelf();
isSuperMessage = true;
isClassMessage = true;
+
+ if (retainSelf)
+ Receiver = EmitARCRetainNonBlock(Receiver);
break;
}
+ QualType ResultType =
+ E->getMethodDecl() ? E->getMethodDecl()->getResultType() : E->getType();
+
CallArgList Args;
EmitCallArgs(Args, E->getMethodDecl(), E->arg_begin(), E->arg_end());
- QualType ResultType =
- E->getMethodDecl() ? E->getMethodDecl()->getResultType() : E->getType();
+ // For delegate init calls in ARC, do an unsafe store of null into
+ // self. This represents the call taking direct ownership of that
+ // value. We have to do this after emitting the other call
+ // arguments because they might also reference self, but we don't
+ // have to worry about any of them modifying self because that would
+ // be an undefined read and write of an object in unordered
+ // expressions.
+ if (isDelegateInit) {
+ assert(getLangOptions().ObjCAutoRefCount &&
+ "delegate init calls should only be marked in ARC");
+
+ // Do an unsafe store of null into self.
+ llvm::Value *selfAddr =
+ LocalDeclMap[cast<ObjCMethodDecl>(CurCodeDecl)->getSelfDecl()];
+ assert(selfAddr && "no self entry for a delegate init call?");
+
+ Builder.CreateStore(getNullForVariable(selfAddr), selfAddr);
+ }
RValue result;
if (isSuperMessage) {
@@ -134,10 +196,54 @@ RValue CodeGenFunction::EmitObjCMessageExpr(const ObjCMessageExpr *E,
Receiver, Args, OID,
E->getMethodDecl());
}
-
+
+ // For delegate init calls in ARC, implicitly store the result of
+ // the call back into self. This takes ownership of the value.
+ if (isDelegateInit) {
+ llvm::Value *selfAddr =
+ LocalDeclMap[cast<ObjCMethodDecl>(CurCodeDecl)->getSelfDecl()];
+ llvm::Value *newSelf = result.getScalarVal();
+
+ // The delegate return type isn't necessarily a matching type; in
+ // fact, it's quite likely to be 'id'.
+ const llvm::Type *selfTy =
+ cast<llvm::PointerType>(selfAddr->getType())->getElementType();
+ newSelf = Builder.CreateBitCast(newSelf, selfTy);
+
+ Builder.CreateStore(newSelf, selfAddr);
+ }
+
return AdjustRelatedResultType(*this, E, E->getMethodDecl(), result);
}
+namespace {
+struct FinishARCDealloc : EHScopeStack::Cleanup {
+ void Emit(CodeGenFunction &CGF, Flags flags) {
+ const ObjCMethodDecl *method = cast<ObjCMethodDecl>(CGF.CurCodeDecl);
+
+ const ObjCImplDecl *impl = cast<ObjCImplDecl>(method->getDeclContext());
+ const ObjCInterfaceDecl *iface = impl->getClassInterface();
+ if (!iface->getSuperClass()) return;
+
+ bool isCategory = isa<ObjCCategoryImplDecl>(impl);
+
+ // Call [super dealloc] if we have a superclass.
+ llvm::Value *self = CGF.LoadObjCSelf();
+
+ CallArgList args;
+ CGF.CGM.getObjCRuntime().GenerateMessageSendSuper(CGF, ReturnValueSlot(),
+ CGF.getContext().VoidTy,
+ method->getSelector(),
+ iface,
+ isCategory,
+ self,
+ /*is class msg*/ false,
+ args,
+ method);
+ }
+};
+}
+
/// StartObjCMethod - Begin emission of an ObjCMethod. This generates
/// the LLVM function and sets the other context used by
/// CodeGenFunction.
@@ -164,8 +270,21 @@ void CodeGenFunction::StartObjCMethod(const ObjCMethodDecl *OMD,
CurGD = OMD;
StartFunction(OMD, OMD->getResultType(), Fn, FI, args, StartLoc);
+
+ // In ARC, certain methods get an extra cleanup.
+ if (CGM.getLangOptions().ObjCAutoRefCount &&
+ OMD->isInstanceMethod() &&
+ OMD->getSelector().isUnarySelector()) {
+ const IdentifierInfo *ident =
+ OMD->getSelector().getIdentifierInfoForSlot(0);
+ if (ident->isStr("dealloc"))
+ EHStack.pushCleanup<FinishARCDealloc>(getARCCleanupKind());
+ }
}
+static llvm::Value *emitARCRetainLoadOfScalar(CodeGenFunction &CGF,
+ LValue lvalue, QualType type);
+
void CodeGenFunction::GenerateObjCGetterBody(ObjCIvarDecl *Ivar,
bool IsAtomic, bool IsStrong) {
LValue LV = EmitLValueForIvar(TypeOfSelfObject(), LoadObjCSelf(),
@@ -269,6 +388,9 @@ void CodeGenFunction::GenerateObjCGetter(ObjCImplementationDecl *IMP,
RV = RValue::get(Builder.CreateBitCast(RV.getScalarVal(),
Types.ConvertType(PD->getType())));
EmitReturnOfRValue(RV, PD->getType());
+
+ // objc_getProperty does an autorelease, so we should suppress ours.
+ AutoreleaseResult = false;
} else {
const llvm::Triple &Triple = getContext().Target.getTriple();
QualType IVART = Ivar->getType();
@@ -346,18 +468,24 @@ void CodeGenFunction::GenerateObjCGetter(ObjCImplementationDecl *IMP,
}
else {
LValue LV = EmitLValueForIvar(TypeOfSelfObject(), LoadObjCSelf(),
- Ivar, 0);
- if (PD->getType()->isReferenceType()) {
- RValue RV = RValue::get(LV.getAddress());
- EmitReturnOfRValue(RV, PD->getType());
- }
- else {
- CodeGenTypes &Types = CGM.getTypes();
- RValue RV = EmitLoadOfLValue(LV, IVART);
- RV = RValue::get(Builder.CreateBitCast(RV.getScalarVal(),
- Types.ConvertType(PD->getType())));
- EmitReturnOfRValue(RV, PD->getType());
+ Ivar, 0);
+ QualType propType = PD->getType();
+
+ llvm::Value *value;
+ if (propType->isReferenceType()) {
+ value = LV.getAddress();
+ } else {
+ // In ARC, we want to emit this retained.
+ if (getLangOptions().ObjCAutoRefCount &&
+ PD->getType()->isObjCRetainableType())
+ value = emitARCRetainLoadOfScalar(*this, LV, IVART);
+ else
+ value = EmitLoadOfLValue(LV).getScalarVal();
+
+ value = Builder.CreateBitCast(value, ConvertType(propType));
}
+
+ EmitReturnOfRValue(RValue::get(value), propType);
}
}
@@ -551,50 +679,35 @@ void CodeGenFunction::GenerateObjCSetter(ObjCImplementationDecl *IMP,
FinishFunction();
}
-// FIXME: these are stolen from CGClass.cpp, which is lame.
namespace {
- struct CallArrayIvarDtor : EHScopeStack::Cleanup {
+ struct DestroyIvar : EHScopeStack::Cleanup {
+ private:
+ llvm::Value *addr;
const ObjCIvarDecl *ivar;
- llvm::Value *self;
- CallArrayIvarDtor(const ObjCIvarDecl *ivar, llvm::Value *self)
- : ivar(ivar), self(self) {}
-
- void Emit(CodeGenFunction &CGF, bool IsForEH) {
- LValue lvalue =
- CGF.EmitLValueForIvar(CGF.TypeOfSelfObject(), self, ivar, 0);
-
- QualType type = ivar->getType();
- const ConstantArrayType *arrayType
- = CGF.getContext().getAsConstantArrayType(type);
- QualType baseType = CGF.getContext().getBaseElementType(arrayType);
- const CXXRecordDecl *classDecl = baseType->getAsCXXRecordDecl();
-
- llvm::Value *base
- = CGF.Builder.CreateBitCast(lvalue.getAddress(),
- CGF.ConvertType(baseType)->getPointerTo());
- CGF.EmitCXXAggrDestructorCall(classDecl->getDestructor(),
- arrayType, base);
+ CodeGenFunction::Destroyer &destroyer;
+ bool useEHCleanupForArray;
+ public:
+ DestroyIvar(llvm::Value *addr, const ObjCIvarDecl *ivar,
+ CodeGenFunction::Destroyer *destroyer,
+ bool useEHCleanupForArray)
+ : addr(addr), ivar(ivar), destroyer(*destroyer),
+ useEHCleanupForArray(useEHCleanupForArray) {}
+
+ void Emit(CodeGenFunction &CGF, Flags flags) {
+ LValue lvalue
+ = CGF.EmitLValueForIvar(CGF.TypeOfSelfObject(), addr, ivar, /*CVR*/ 0);
+ CGF.emitDestroy(lvalue.getAddress(), ivar->getType(), destroyer,
+ flags.isForNormalCleanup() && useEHCleanupForArray);
}
};
+}
- struct CallIvarDtor : EHScopeStack::Cleanup {
- const ObjCIvarDecl *ivar;
- llvm::Value *self;
- CallIvarDtor(const ObjCIvarDecl *ivar, llvm::Value *self)
- : ivar(ivar), self(self) {}
-
- void Emit(CodeGenFunction &CGF, bool IsForEH) {
- LValue lvalue =
- CGF.EmitLValueForIvar(CGF.TypeOfSelfObject(), self, ivar, 0);
-
- QualType type = ivar->getType();
- const CXXRecordDecl *classDecl = type->getAsCXXRecordDecl();
-
- CGF.EmitCXXDestructorCall(classDecl->getDestructor(),
- Dtor_Complete, /*ForVirtualBase=*/false,
- lvalue.getAddress());
- }
- };
+/// Like CodeGenFunction::destroyARCStrong, but do it with a call.
+static void destroyARCStrongWithStore(CodeGenFunction &CGF,
+ llvm::Value *addr,
+ QualType type) {
+ llvm::Value *null = getNullForVariable(addr);
+ CGF.EmitARCStoreStrongCall(addr, null, /*ignored*/ true);
}
static void emitCXXDestructMethod(CodeGenFunction &CGF,
@@ -609,29 +722,26 @@ static void emitCXXDestructMethod(CodeGenFunction &CGF,
ivar; ivar = ivar->getNextIvar()) {
QualType type = ivar->getType();
- // Drill down to the base element type.
- QualType baseType = type;
- const ConstantArrayType *arrayType =
- CGF.getContext().getAsConstantArrayType(baseType);
- if (arrayType) baseType = CGF.getContext().getBaseElementType(arrayType);
-
// Check whether the ivar is a destructible type.
- QualType::DestructionKind destructKind = baseType.isDestructedType();
- assert(destructKind == type.isDestructedType());
-
- switch (destructKind) {
- case QualType::DK_none:
- continue;
-
- case QualType::DK_cxx_destructor:
- if (arrayType)
- CGF.EHStack.pushCleanup<CallArrayIvarDtor>(NormalAndEHCleanup,
- ivar, self);
- else
- CGF.EHStack.pushCleanup<CallIvarDtor>(NormalAndEHCleanup,
- ivar, self);
- break;
+ QualType::DestructionKind dtorKind = type.isDestructedType();
+ if (!dtorKind) continue;
+
+ CodeGenFunction::Destroyer *destroyer = 0;
+
+ // Use a call to objc_storeStrong to destroy strong ivars, for the
+ // general benefit of the tools.
+ if (dtorKind == QualType::DK_objc_strong_lifetime) {
+ destroyer = &destroyARCStrongWithStore;
+
+ // Otherwise use the default for the destruction kind.
+ } else {
+ destroyer = &CGF.getDestroyer(dtorKind);
}
+
+ CleanupKind cleanupKind = CGF.getCleanupKind(dtorKind);
+
+ CGF.EHStack.pushCleanup<DestroyIvar>(cleanupKind, self, ivar, destroyer,
+ cleanupKind & EHCleanup);
}
assert(scope.requiresCleanups() && "nothing to do in .cxx_destruct?");
@@ -645,6 +755,9 @@ void CodeGenFunction::GenerateObjCCtorDtorMethod(ObjCImplementationDecl *IMP,
// Emit .cxx_construct.
if (ctor) {
+ // Suppress the final autorelease in ARC.
+ AutoreleaseResult = false;
+
llvm::SmallVector<CXXCtorInitializer *, 8> IvarInitializers;
for (ObjCImplementationDecl::init_const_iterator B = IMP->init_begin(),
E = IMP->init_end(); B != E; ++B) {
@@ -747,6 +860,16 @@ RValue CodeGenFunction::EmitLoadOfPropertyRefLValue(LValue LV,
llvm::Value *Receiver = LV.getPropertyRefBaseAddr();
+ if (CGM.getLangOptions().ObjCAutoRefCount) {
+ QualType receiverType;
+ if (E->isSuperReceiver())
+ receiverType = E->getSuperReceiverType();
+ else if (E->isClassReceiver())
+ receiverType = getContext().getObjCClassType();
+ else
+ receiverType = E->getBase()->getType();
+ }
+
// Accesses to 'super' follow a different code path.
if (E->isSuperReceiver())
return AdjustRelatedResultType(*this, E, method,
@@ -757,9 +880,9 @@ RValue CodeGenFunction::EmitLoadOfPropertyRefLValue(LValue LV,
const ObjCInterfaceDecl *ReceiverClass
= (E->isClassReceiver() ? E->getClassReceiver() : 0);
return AdjustRelatedResultType(*this, E, method,
- CGM.getObjCRuntime().
- GenerateMessageSend(*this, Return, ResultType, S,
- Receiver, CallArgList(), ReceiverClass));
+ CGM.getObjCRuntime().
+ GenerateMessageSend(*this, Return, ResultType, S,
+ Receiver, CallArgList(), ReceiverClass));
}
void CodeGenFunction::EmitStoreThroughPropertyRefLValue(RValue Src,
@@ -808,17 +931,17 @@ void CodeGenFunction::EmitObjCForCollectionStmt(const ObjCForCollectionStmt &S){
return;
}
- // The local variable comes into scope immediately.
- AutoVarEmission variable = AutoVarEmission::invalid();
- if (const DeclStmt *SD = dyn_cast<DeclStmt>(S.getElement()))
- variable = EmitAutoVarAlloca(*cast<VarDecl>(SD->getSingleDecl()));
-
CGDebugInfo *DI = getDebugInfo();
if (DI) {
DI->setLocation(S.getSourceRange().getBegin());
DI->EmitRegionStart(Builder);
}
+ // The local variable comes into scope immediately.
+ AutoVarEmission variable = AutoVarEmission::invalid();
+ if (const DeclStmt *SD = dyn_cast<DeclStmt>(S.getElement()))
+ variable = EmitAutoVarAlloca(*cast<VarDecl>(SD->getSingleDecl()));
+
JumpDest LoopEnd = getJumpDestInCurrentScope("forcoll.end");
JumpDest AfterBody = getJumpDestInCurrentScope("forcoll.next");
@@ -958,6 +1081,9 @@ void CodeGenFunction::EmitObjCForCollectionStmt(const ObjCForCollectionStmt &S){
elementLValue = EmitLValue(&tempDRE);
elementType = D->getType();
elementIsVariable = true;
+
+ if (D->isARCPseudoStrong())
+ elementLValue.getQuals().setObjCLifetime(Qualifiers::OCL_ExplicitNone);
} else {
elementLValue = LValue(); // suppress warning
elementType = cast<Expr>(S.getElement())->getType();
@@ -984,10 +1110,12 @@ void CodeGenFunction::EmitObjCForCollectionStmt(const ObjCForCollectionStmt &S){
// Make sure we have an l-value. Yes, this gets evaluated every
// time through the loop.
- if (!elementIsVariable)
+ if (!elementIsVariable) {
elementLValue = EmitLValue(cast<Expr>(S.getElement()));
-
- EmitStoreThroughLValue(RValue::get(CurrentItem), elementLValue, elementType);
+ EmitStoreThroughLValue(RValue::get(CurrentItem), elementLValue);
+ } else {
+ EmitScalarInit(CurrentItem, elementLValue);
+ }
// If we do have an element variable, this assignment is the end of
// its initialization.
@@ -1048,7 +1176,7 @@ void CodeGenFunction::EmitObjCForCollectionStmt(const ObjCForCollectionStmt &S){
llvm::Value *null = llvm::Constant::getNullValue(convertedElementType);
elementLValue = EmitLValue(cast<Expr>(S.getElement()));
- EmitStoreThroughLValue(RValue::get(null), elementLValue, elementType);
+ EmitStoreThroughLValue(RValue::get(null), elementLValue);
}
if (DI) {
@@ -1072,4 +1200,957 @@ void CodeGenFunction::EmitObjCAtSynchronizedStmt(
CGM.getObjCRuntime().EmitSynchronizedStmt(*this, S);
}
+/// Produce the code for a CK_ObjCProduceObject. Just does a
+/// primitive retain.
+llvm::Value *CodeGenFunction::EmitObjCProduceObject(QualType type,
+ llvm::Value *value) {
+ return EmitARCRetain(type, value);
+}
+
+namespace {
+ struct CallObjCRelease : EHScopeStack::Cleanup {
+ CallObjCRelease(QualType type, llvm::Value *ptr, llvm::Value *condition)
+ : type(type), ptr(ptr), condition(condition) {}
+ QualType type;
+ llvm::Value *ptr;
+ llvm::Value *condition;
+
+ void Emit(CodeGenFunction &CGF, Flags flags) {
+ llvm::Value *object;
+
+ // If we're in a conditional branch, we had to stash away in an
+ // alloca the pointer to be released.
+ llvm::BasicBlock *cont = 0;
+ if (condition) {
+ llvm::BasicBlock *release = CGF.createBasicBlock("release.yes");
+ cont = CGF.createBasicBlock("release.cont");
+
+ llvm::Value *cond = CGF.Builder.CreateLoad(condition);
+ CGF.Builder.CreateCondBr(cond, release, cont);
+ CGF.EmitBlock(release);
+ object = CGF.Builder.CreateLoad(ptr);
+ } else {
+ object = ptr;
+ }
+
+ CGF.EmitARCRelease(object, /*precise*/ true);
+
+ if (cont) CGF.EmitBlock(cont);
+ }
+ };
+}
+
+/// Produce the code for a CK_ObjCConsumeObject. Does a primitive
+/// release at the end of the full-expression.
+llvm::Value *CodeGenFunction::EmitObjCConsumeObject(QualType type,
+ llvm::Value *object) {
+ // If we're in a conditional branch, we need to make the cleanup
+ // conditional. FIXME: this really needs to be supported by the
+ // environment.
+ llvm::AllocaInst *cond;
+ llvm::Value *ptr;
+ if (isInConditionalBranch()) {
+ cond = CreateTempAlloca(Builder.getInt1Ty(), "release.cond");
+ ptr = CreateTempAlloca(object->getType(), "release.value");
+
+ // The alloca is false until we get here.
+ // FIXME: er. doesn't this need to be set at the start of the condition?
+ InitTempAlloca(cond, Builder.getFalse());
+
+ // Then it turns true.
+ Builder.CreateStore(Builder.getTrue(), cond);
+ Builder.CreateStore(object, ptr);
+ } else {
+ cond = 0;
+ ptr = object;
+ }
+
+ EHStack.pushCleanup<CallObjCRelease>(getARCCleanupKind(), type, ptr, cond);
+ return object;
+}
+
+llvm::Value *CodeGenFunction::EmitObjCExtendObjectLifetime(QualType type,
+ llvm::Value *value) {
+ return EmitARCRetainAutorelease(type, value);
+}
+
+
+static llvm::Constant *createARCRuntimeFunction(CodeGenModule &CGM,
+ const llvm::FunctionType *type,
+ llvm::StringRef fnName) {
+ llvm::Constant *fn = CGM.CreateRuntimeFunction(type, fnName);
+
+ // In -fobjc-no-arc-runtime, emit weak references to the runtime
+ // support library.
+ if (!CGM.getCodeGenOpts().ObjCRuntimeHasARC)
+ if (llvm::Function *f = dyn_cast<llvm::Function>(fn))
+ f->setLinkage(llvm::Function::ExternalWeakLinkage);
+
+ return fn;
+}
+
+/// Perform an operation having the signature
+/// i8* (i8*)
+/// where a null input causes a no-op and returns null.
+static llvm::Value *emitARCValueOperation(CodeGenFunction &CGF,
+ llvm::Value *value,
+ llvm::Constant *&fn,
+ llvm::StringRef fnName) {
+ if (isa<llvm::ConstantPointerNull>(value)) return value;
+
+ if (!fn) {
+ std::vector<llvm::Type*> args(1, CGF.Int8PtrTy);
+ const llvm::FunctionType *fnType =
+ llvm::FunctionType::get(CGF.Int8PtrTy, args, false);
+ fn = createARCRuntimeFunction(CGF.CGM, fnType, fnName);
+ }
+
+ // Cast the argument to 'id'.
+ const llvm::Type *origType = value->getType();
+ value = CGF.Builder.CreateBitCast(value, CGF.Int8PtrTy);
+
+ // Call the function.
+ llvm::CallInst *call = CGF.Builder.CreateCall(fn, value);
+ call->setDoesNotThrow();
+
+ // Cast the result back to the original type.
+ return CGF.Builder.CreateBitCast(call, origType);
+}
+
+/// Perform an operation having the following signature:
+/// i8* (i8**)
+static llvm::Value *emitARCLoadOperation(CodeGenFunction &CGF,
+ llvm::Value *addr,
+ llvm::Constant *&fn,
+ llvm::StringRef fnName) {
+ if (!fn) {
+ std::vector<llvm::Type*> args(1, CGF.Int8PtrPtrTy);
+ const llvm::FunctionType *fnType =
+ llvm::FunctionType::get(CGF.Int8PtrTy, args, false);
+ fn = createARCRuntimeFunction(CGF.CGM, fnType, fnName);
+ }
+
+ // Cast the argument to 'id*'.
+ const llvm::Type *origType = addr->getType();
+ addr = CGF.Builder.CreateBitCast(addr, CGF.Int8PtrPtrTy);
+
+ // Call the function.
+ llvm::CallInst *call = CGF.Builder.CreateCall(fn, addr);
+ call->setDoesNotThrow();
+
+ // Cast the result back to a dereference of the original type.
+ llvm::Value *result = call;
+ if (origType != CGF.Int8PtrPtrTy)
+ result = CGF.Builder.CreateBitCast(result,
+ cast<llvm::PointerType>(origType)->getElementType());
+
+ return result;
+}
+
+/// Perform an operation having the following signature:
+/// i8* (i8**, i8*)
+static llvm::Value *emitARCStoreOperation(CodeGenFunction &CGF,
+ llvm::Value *addr,
+ llvm::Value *value,
+ llvm::Constant *&fn,
+ llvm::StringRef fnName,
+ bool ignored) {
+ assert(cast<llvm::PointerType>(addr->getType())->getElementType()
+ == value->getType());
+
+ if (!fn) {
+ std::vector<llvm::Type*> argTypes(2);
+ argTypes[0] = CGF.Int8PtrPtrTy;
+ argTypes[1] = CGF.Int8PtrTy;
+
+ const llvm::FunctionType *fnType
+ = llvm::FunctionType::get(CGF.Int8PtrTy, argTypes, false);
+ fn = createARCRuntimeFunction(CGF.CGM, fnType, fnName);
+ }
+
+ const llvm::Type *origType = value->getType();
+
+ addr = CGF.Builder.CreateBitCast(addr, CGF.Int8PtrPtrTy);
+ value = CGF.Builder.CreateBitCast(value, CGF.Int8PtrTy);
+
+ llvm::CallInst *result = CGF.Builder.CreateCall2(fn, addr, value);
+ result->setDoesNotThrow();
+
+ if (ignored) return 0;
+
+ return CGF.Builder.CreateBitCast(result, origType);
+}
+
+/// Perform an operation having the following signature:
+/// void (i8**, i8**)
+static void emitARCCopyOperation(CodeGenFunction &CGF,
+ llvm::Value *dst,
+ llvm::Value *src,
+ llvm::Constant *&fn,
+ llvm::StringRef fnName) {
+ assert(dst->getType() == src->getType());
+
+ if (!fn) {
+ std::vector<llvm::Type*> argTypes(2, CGF.Int8PtrPtrTy);
+ const llvm::FunctionType *fnType
+ = llvm::FunctionType::get(CGF.Builder.getVoidTy(), argTypes, false);
+ fn = createARCRuntimeFunction(CGF.CGM, fnType, fnName);
+ }
+
+ dst = CGF.Builder.CreateBitCast(dst, CGF.Int8PtrPtrTy);
+ src = CGF.Builder.CreateBitCast(src, CGF.Int8PtrPtrTy);
+
+ llvm::CallInst *result = CGF.Builder.CreateCall2(fn, dst, src);
+ result->setDoesNotThrow();
+}
+
+/// Produce the code to do a retain. Based on the type, calls one of:
+/// call i8* @objc_retain(i8* %value)
+/// call i8* @objc_retainBlock(i8* %value)
+llvm::Value *CodeGenFunction::EmitARCRetain(QualType type, llvm::Value *value) {
+ if (type->isBlockPointerType())
+ return EmitARCRetainBlock(value);
+ else
+ return EmitARCRetainNonBlock(value);
+}
+
+/// Retain the given object, with normal retain semantics.
+/// call i8* @objc_retain(i8* %value)
+llvm::Value *CodeGenFunction::EmitARCRetainNonBlock(llvm::Value *value) {
+ return emitARCValueOperation(*this, value,
+ CGM.getARCEntrypoints().objc_retain,
+ "objc_retain");
+}
+
+/// Retain the given block, with _Block_copy semantics.
+/// call i8* @objc_retainBlock(i8* %value)
+llvm::Value *CodeGenFunction::EmitARCRetainBlock(llvm::Value *value) {
+ return emitARCValueOperation(*this, value,
+ CGM.getARCEntrypoints().objc_retainBlock,
+ "objc_retainBlock");
+}
+
+/// Retain the given object which is the result of a function call.
+/// call i8* @objc_retainAutoreleasedReturnValue(i8* %value)
+///
+/// Yes, this function name is one character away from a different
+/// call with completely different semantics.
+llvm::Value *
+CodeGenFunction::EmitARCRetainAutoreleasedReturnValue(llvm::Value *value) {
+ // Fetch the void(void) inline asm which marks that we're going to
+ // retain the autoreleased return value.
+ llvm::InlineAsm *&marker
+ = CGM.getARCEntrypoints().retainAutoreleasedReturnValueMarker;
+ if (!marker) {
+ llvm::StringRef assembly
+ = CGM.getTargetCodeGenInfo()
+ .getARCRetainAutoreleasedReturnValueMarker();
+
+ // If we have an empty assembly string, there's nothing to do.
+ if (assembly.empty()) {
+
+ // Otherwise, at -O0, build an inline asm that we're going to call
+ // in a moment.
+ } else if (CGM.getCodeGenOpts().OptimizationLevel == 0) {
+ llvm::FunctionType *type =
+ llvm::FunctionType::get(llvm::Type::getVoidTy(getLLVMContext()),
+ /*variadic*/ false);
+
+ marker = llvm::InlineAsm::get(type, assembly, "", /*sideeffects*/ true);
+
+ // If we're at -O1 and above, we don't want to litter the code
+ // with this marker yet, so leave a breadcrumb for the ARC
+ // optimizer to pick up.
+ } else {
+ llvm::NamedMDNode *metadata =
+ CGM.getModule().getOrInsertNamedMetadata(
+ "clang.arc.retainAutoreleasedReturnValueMarker");
+ assert(metadata->getNumOperands() <= 1);
+ if (metadata->getNumOperands() == 0) {
+ llvm::Value *string = llvm::MDString::get(getLLVMContext(), assembly);
+ llvm::Value *args[] = { string };
+ metadata->addOperand(llvm::MDNode::get(getLLVMContext(), args));
+ }
+ }
+ }
+
+ // Call the marker asm if we made one, which we do only at -O0.
+ if (marker) Builder.CreateCall(marker);
+
+ return emitARCValueOperation(*this, value,
+ CGM.getARCEntrypoints().objc_retainAutoreleasedReturnValue,
+ "objc_retainAutoreleasedReturnValue");
+}
+
+/// Release the given object.
+/// call void @objc_release(i8* %value)
+void CodeGenFunction::EmitARCRelease(llvm::Value *value, bool precise) {
+ if (isa<llvm::ConstantPointerNull>(value)) return;
+
+ llvm::Constant *&fn = CGM.getARCEntrypoints().objc_release;
+ if (!fn) {
+ std::vector<llvm::Type*> args(1, Int8PtrTy);
+ const llvm::FunctionType *fnType =
+ llvm::FunctionType::get(Builder.getVoidTy(), args, false);
+ fn = createARCRuntimeFunction(CGM, fnType, "objc_release");
+ }
+
+ // Cast the argument to 'id'.
+ value = Builder.CreateBitCast(value, Int8PtrTy);
+
+ // Call objc_release.
+ llvm::CallInst *call = Builder.CreateCall(fn, value);
+ call->setDoesNotThrow();
+
+ if (!precise) {
+ llvm::SmallVector<llvm::Value*,1> args;
+ call->setMetadata("clang.imprecise_release",
+ llvm::MDNode::get(Builder.getContext(), args));
+ }
+}
+
+/// Store into a strong object. Always calls this:
+/// call void @objc_storeStrong(i8** %addr, i8* %value)
+llvm::Value *CodeGenFunction::EmitARCStoreStrongCall(llvm::Value *addr,
+ llvm::Value *value,
+ bool ignored) {
+ assert(cast<llvm::PointerType>(addr->getType())->getElementType()
+ == value->getType());
+
+ llvm::Constant *&fn = CGM.getARCEntrypoints().objc_storeStrong;
+ if (!fn) {
+ llvm::Type *argTypes[] = { Int8PtrPtrTy, Int8PtrTy };
+ const llvm::FunctionType *fnType
+ = llvm::FunctionType::get(Builder.getVoidTy(), argTypes, false);
+ fn = createARCRuntimeFunction(CGM, fnType, "objc_storeStrong");
+ }
+
+ addr = Builder.CreateBitCast(addr, Int8PtrPtrTy);
+ llvm::Value *castValue = Builder.CreateBitCast(value, Int8PtrTy);
+
+ Builder.CreateCall2(fn, addr, castValue)->setDoesNotThrow();
+
+ if (ignored) return 0;
+ return value;
+}
+
+/// Store into a strong object. Sometimes calls this:
+/// call void @objc_storeStrong(i8** %addr, i8* %value)
+/// Other times, breaks it down into components.
+llvm::Value *CodeGenFunction::EmitARCStoreStrong(LValue dst,
+ llvm::Value *newValue,
+ bool ignored) {
+ QualType type = dst.getType();
+ bool isBlock = type->isBlockPointerType();
+
+ // Use a store barrier at -O0 unless this is a block type or the
+ // lvalue is inadequately aligned.
+ if (shouldUseFusedARCCalls() &&
+ !isBlock &&
+ !(dst.getAlignment() && dst.getAlignment() < PointerAlignInBytes)) {
+ return EmitARCStoreStrongCall(dst.getAddress(), newValue, ignored);
+ }
+
+ // Otherwise, split it out.
+
+ // Retain the new value.
+ newValue = EmitARCRetain(type, newValue);
+
+ // Read the old value.
+ llvm::Value *oldValue = EmitLoadOfScalar(dst);
+
+ // Store. We do this before the release so that any deallocs won't
+ // see the old value.
+ EmitStoreOfScalar(newValue, dst);
+
+ // Finally, release the old value.
+ EmitARCRelease(oldValue, /*precise*/ false);
+
+ return newValue;
+}
+
+/// Autorelease the given object.
+/// call i8* @objc_autorelease(i8* %value)
+llvm::Value *CodeGenFunction::EmitARCAutorelease(llvm::Value *value) {
+ return emitARCValueOperation(*this, value,
+ CGM.getARCEntrypoints().objc_autorelease,
+ "objc_autorelease");
+}
+
+/// Autorelease the given object.
+/// call i8* @objc_autoreleaseReturnValue(i8* %value)
+llvm::Value *
+CodeGenFunction::EmitARCAutoreleaseReturnValue(llvm::Value *value) {
+ return emitARCValueOperation(*this, value,
+ CGM.getARCEntrypoints().objc_autoreleaseReturnValue,
+ "objc_autoreleaseReturnValue");
+}
+
+/// Do a fused retain/autorelease of the given object.
+/// call i8* @objc_retainAutoreleaseReturnValue(i8* %value)
+llvm::Value *
+CodeGenFunction::EmitARCRetainAutoreleaseReturnValue(llvm::Value *value) {
+ return emitARCValueOperation(*this, value,
+ CGM.getARCEntrypoints().objc_retainAutoreleaseReturnValue,
+ "objc_retainAutoreleaseReturnValue");
+}
+
+/// Do a fused retain/autorelease of the given object.
+/// call i8* @objc_retainAutorelease(i8* %value)
+/// or
+/// %retain = call i8* @objc_retainBlock(i8* %value)
+/// call i8* @objc_autorelease(i8* %retain)
+llvm::Value *CodeGenFunction::EmitARCRetainAutorelease(QualType type,
+ llvm::Value *value) {
+ if (!type->isBlockPointerType())
+ return EmitARCRetainAutoreleaseNonBlock(value);
+
+ if (isa<llvm::ConstantPointerNull>(value)) return value;
+
+ const llvm::Type *origType = value->getType();
+ value = Builder.CreateBitCast(value, Int8PtrTy);
+ value = EmitARCRetainBlock(value);
+ value = EmitARCAutorelease(value);
+ return Builder.CreateBitCast(value, origType);
+}
+
+/// Do a fused retain/autorelease of the given object.
+/// call i8* @objc_retainAutorelease(i8* %value)
+llvm::Value *
+CodeGenFunction::EmitARCRetainAutoreleaseNonBlock(llvm::Value *value) {
+ return emitARCValueOperation(*this, value,
+ CGM.getARCEntrypoints().objc_retainAutorelease,
+ "objc_retainAutorelease");
+}
+
+/// i8* @objc_loadWeak(i8** %addr)
+/// Essentially objc_autorelease(objc_loadWeakRetained(addr)).
+llvm::Value *CodeGenFunction::EmitARCLoadWeak(llvm::Value *addr) {
+ return emitARCLoadOperation(*this, addr,
+ CGM.getARCEntrypoints().objc_loadWeak,
+ "objc_loadWeak");
+}
+
+/// i8* @objc_loadWeakRetained(i8** %addr)
+llvm::Value *CodeGenFunction::EmitARCLoadWeakRetained(llvm::Value *addr) {
+ return emitARCLoadOperation(*this, addr,
+ CGM.getARCEntrypoints().objc_loadWeakRetained,
+ "objc_loadWeakRetained");
+}
+
+/// i8* @objc_storeWeak(i8** %addr, i8* %value)
+/// Returns %value.
+llvm::Value *CodeGenFunction::EmitARCStoreWeak(llvm::Value *addr,
+ llvm::Value *value,
+ bool ignored) {
+ return emitARCStoreOperation(*this, addr, value,
+ CGM.getARCEntrypoints().objc_storeWeak,
+ "objc_storeWeak", ignored);
+}
+
+/// i8* @objc_initWeak(i8** %addr, i8* %value)
+/// Returns %value. %addr is known to not have a current weak entry.
+/// Essentially equivalent to:
+/// *addr = nil; objc_storeWeak(addr, value);
+void CodeGenFunction::EmitARCInitWeak(llvm::Value *addr, llvm::Value *value) {
+ // If we're initializing to null, just write null to memory; no need
+ // to get the runtime involved. But don't do this if optimization
+ // is enabled, because accounting for this would make the optimizer
+ // much more complicated.
+ if (isa<llvm::ConstantPointerNull>(value) &&
+ CGM.getCodeGenOpts().OptimizationLevel == 0) {
+ Builder.CreateStore(value, addr);
+ return;
+ }
+
+ emitARCStoreOperation(*this, addr, value,
+ CGM.getARCEntrypoints().objc_initWeak,
+ "objc_initWeak", /*ignored*/ true);
+}
+
+/// void @objc_destroyWeak(i8** %addr)
+/// Essentially objc_storeWeak(addr, nil).
+void CodeGenFunction::EmitARCDestroyWeak(llvm::Value *addr) {
+ llvm::Constant *&fn = CGM.getARCEntrypoints().objc_destroyWeak;
+ if (!fn) {
+ std::vector<llvm::Type*> args(1, Int8PtrPtrTy);
+ const llvm::FunctionType *fnType =
+ llvm::FunctionType::get(Builder.getVoidTy(), args, false);
+ fn = createARCRuntimeFunction(CGM, fnType, "objc_destroyWeak");
+ }
+
+ // Cast the argument to 'id*'.
+ addr = Builder.CreateBitCast(addr, Int8PtrPtrTy);
+
+ llvm::CallInst *call = Builder.CreateCall(fn, addr);
+ call->setDoesNotThrow();
+}
+
+/// void @objc_moveWeak(i8** %dest, i8** %src)
+/// Disregards the current value in %dest. Leaves %src pointing to nothing.
+/// Essentially (objc_copyWeak(dest, src), objc_destroyWeak(src)).
+void CodeGenFunction::EmitARCMoveWeak(llvm::Value *dst, llvm::Value *src) {
+ emitARCCopyOperation(*this, dst, src,
+ CGM.getARCEntrypoints().objc_moveWeak,
+ "objc_moveWeak");
+}
+
+/// void @objc_copyWeak(i8** %dest, i8** %src)
+/// Disregards the current value in %dest. Essentially
+/// objc_release(objc_initWeak(dest, objc_readWeakRetained(src)))
+void CodeGenFunction::EmitARCCopyWeak(llvm::Value *dst, llvm::Value *src) {
+ emitARCCopyOperation(*this, dst, src,
+ CGM.getARCEntrypoints().objc_copyWeak,
+ "objc_copyWeak");
+}
+
+/// Produce the code to do a objc_autoreleasepool_push.
+/// call i8* @objc_autoreleasePoolPush(void)
+llvm::Value *CodeGenFunction::EmitObjCAutoreleasePoolPush() {
+ llvm::Constant *&fn = CGM.getRREntrypoints().objc_autoreleasePoolPush;
+ if (!fn) {
+ const llvm::FunctionType *fnType =
+ llvm::FunctionType::get(Int8PtrTy, false);
+ fn = createARCRuntimeFunction(CGM, fnType, "objc_autoreleasePoolPush");
+ }
+
+ llvm::CallInst *call = Builder.CreateCall(fn);
+ call->setDoesNotThrow();
+
+ return call;
+}
+
+/// Produce the code to do a primitive release.
+/// call void @objc_autoreleasePoolPop(i8* %ptr)
+void CodeGenFunction::EmitObjCAutoreleasePoolPop(llvm::Value *value) {
+ assert(value->getType() == Int8PtrTy);
+
+ llvm::Constant *&fn = CGM.getRREntrypoints().objc_autoreleasePoolPop;
+ if (!fn) {
+ std::vector<llvm::Type*> args(1, Int8PtrTy);
+ const llvm::FunctionType *fnType =
+ llvm::FunctionType::get(Builder.getVoidTy(), args, false);
+
+ // We don't want to use a weak import here; instead we should not
+ // fall into this path.
+ fn = createARCRuntimeFunction(CGM, fnType, "objc_autoreleasePoolPop");
+ }
+
+ llvm::CallInst *call = Builder.CreateCall(fn, value);
+ call->setDoesNotThrow();
+}
+
+/// Produce the code to do an MRR version objc_autoreleasepool_push.
+/// Which is: [[NSAutoreleasePool alloc] init];
+/// Where alloc is declared as: + (id) alloc; in NSAutoreleasePool class.
+/// init is declared as: - (id) init; in its NSObject super class.
+///
+llvm::Value *CodeGenFunction::EmitObjCMRRAutoreleasePoolPush() {
+ CGObjCRuntime &Runtime = CGM.getObjCRuntime();
+ llvm::Value *Receiver = Runtime.EmitNSAutoreleasePoolClassRef(Builder);
+ // [NSAutoreleasePool alloc]
+ IdentifierInfo *II = &CGM.getContext().Idents.get("alloc");
+ Selector AllocSel = getContext().Selectors.getSelector(0, &II);
+ CallArgList Args;
+ RValue AllocRV =
+ Runtime.GenerateMessageSend(*this, ReturnValueSlot(),
+ getContext().getObjCIdType(),
+ AllocSel, Receiver, Args);
+
+ // [Receiver init]
+ Receiver = AllocRV.getScalarVal();
+ II = &CGM.getContext().Idents.get("init");
+ Selector InitSel = getContext().Selectors.getSelector(0, &II);
+ RValue InitRV =
+ Runtime.GenerateMessageSend(*this, ReturnValueSlot(),
+ getContext().getObjCIdType(),
+ InitSel, Receiver, Args);
+ return InitRV.getScalarVal();
+}
+
+/// Produce the code to do a primitive release.
+/// [tmp drain];
+void CodeGenFunction::EmitObjCMRRAutoreleasePoolPop(llvm::Value *Arg) {
+ IdentifierInfo *II = &CGM.getContext().Idents.get("drain");
+ Selector DrainSel = getContext().Selectors.getSelector(0, &II);
+ CallArgList Args;
+ CGM.getObjCRuntime().GenerateMessageSend(*this, ReturnValueSlot(),
+ getContext().VoidTy, DrainSel, Arg, Args);
+}
+
+void CodeGenFunction::destroyARCStrongPrecise(CodeGenFunction &CGF,
+ llvm::Value *addr,
+ QualType type) {
+ llvm::Value *ptr = CGF.Builder.CreateLoad(addr, "strongdestroy");
+ CGF.EmitARCRelease(ptr, /*precise*/ true);
+}
+
+void CodeGenFunction::destroyARCStrongImprecise(CodeGenFunction &CGF,
+ llvm::Value *addr,
+ QualType type) {
+ llvm::Value *ptr = CGF.Builder.CreateLoad(addr, "strongdestroy");
+ CGF.EmitARCRelease(ptr, /*precise*/ false);
+}
+
+void CodeGenFunction::destroyARCWeak(CodeGenFunction &CGF,
+ llvm::Value *addr,
+ QualType type) {
+ CGF.EmitARCDestroyWeak(addr);
+}
+
+namespace {
+ struct CallObjCAutoreleasePoolObject : EHScopeStack::Cleanup {
+ llvm::Value *Token;
+
+ CallObjCAutoreleasePoolObject(llvm::Value *token) : Token(token) {}
+
+ void Emit(CodeGenFunction &CGF, Flags flags) {
+ CGF.EmitObjCAutoreleasePoolPop(Token);
+ }
+ };
+ struct CallObjCMRRAutoreleasePoolObject : EHScopeStack::Cleanup {
+ llvm::Value *Token;
+
+ CallObjCMRRAutoreleasePoolObject(llvm::Value *token) : Token(token) {}
+
+ void Emit(CodeGenFunction &CGF, Flags flags) {
+ CGF.EmitObjCMRRAutoreleasePoolPop(Token);
+ }
+ };
+}
+
+void CodeGenFunction::EmitObjCAutoreleasePoolCleanup(llvm::Value *Ptr) {
+ if (CGM.getLangOptions().ObjCAutoRefCount)
+ EHStack.pushCleanup<CallObjCAutoreleasePoolObject>(NormalCleanup, Ptr);
+ else
+ EHStack.pushCleanup<CallObjCMRRAutoreleasePoolObject>(NormalCleanup, Ptr);
+}
+
+static TryEmitResult tryEmitARCRetainLoadOfScalar(CodeGenFunction &CGF,
+ LValue lvalue,
+ QualType type) {
+ switch (type.getObjCLifetime()) {
+ case Qualifiers::OCL_None:
+ case Qualifiers::OCL_ExplicitNone:
+ case Qualifiers::OCL_Strong:
+ case Qualifiers::OCL_Autoreleasing:
+ return TryEmitResult(CGF.EmitLoadOfLValue(lvalue).getScalarVal(),
+ false);
+
+ case Qualifiers::OCL_Weak:
+ return TryEmitResult(CGF.EmitARCLoadWeakRetained(lvalue.getAddress()),
+ true);
+ }
+
+ llvm_unreachable("impossible lifetime!");
+ return TryEmitResult();
+}
+
+static TryEmitResult tryEmitARCRetainLoadOfScalar(CodeGenFunction &CGF,
+ const Expr *e) {
+ e = e->IgnoreParens();
+ QualType type = e->getType();
+
+ // As a very special optimization, in ARC++, if the l-value is the
+ // result of a non-volatile assignment, do a simple retain of the
+ // result of the call to objc_storeWeak instead of reloading.
+ if (CGF.getLangOptions().CPlusPlus &&
+ !type.isVolatileQualified() &&
+ type.getObjCLifetime() == Qualifiers::OCL_Weak &&
+ isa<BinaryOperator>(e) &&
+ cast<BinaryOperator>(e)->getOpcode() == BO_Assign)
+ return TryEmitResult(CGF.EmitScalarExpr(e), false);
+
+ return tryEmitARCRetainLoadOfScalar(CGF, CGF.EmitLValue(e), type);
+}
+
+static llvm::Value *emitARCRetainAfterCall(CodeGenFunction &CGF,
+ llvm::Value *value);
+
+/// Given that the given expression is some sort of call (which does
+/// not return retained), emit a retain following it.
+static llvm::Value *emitARCRetainCall(CodeGenFunction &CGF, const Expr *e) {
+ llvm::Value *value = CGF.EmitScalarExpr(e);
+ return emitARCRetainAfterCall(CGF, value);
+}
+
+static llvm::Value *emitARCRetainAfterCall(CodeGenFunction &CGF,
+ llvm::Value *value) {
+ if (llvm::CallInst *call = dyn_cast<llvm::CallInst>(value)) {
+ CGBuilderTy::InsertPoint ip = CGF.Builder.saveIP();
+
+ // Place the retain immediately following the call.
+ CGF.Builder.SetInsertPoint(call->getParent(),
+ ++llvm::BasicBlock::iterator(call));
+ value = CGF.EmitARCRetainAutoreleasedReturnValue(value);
+
+ CGF.Builder.restoreIP(ip);
+ return value;
+ } else if (llvm::InvokeInst *invoke = dyn_cast<llvm::InvokeInst>(value)) {
+ CGBuilderTy::InsertPoint ip = CGF.Builder.saveIP();
+
+ // Place the retain at the beginning of the normal destination block.
+ llvm::BasicBlock *BB = invoke->getNormalDest();
+ CGF.Builder.SetInsertPoint(BB, BB->begin());
+ value = CGF.EmitARCRetainAutoreleasedReturnValue(value);
+
+ CGF.Builder.restoreIP(ip);
+ return value;
+
+ // Bitcasts can arise because of related-result returns. Rewrite
+ // the operand.
+ } else if (llvm::BitCastInst *bitcast = dyn_cast<llvm::BitCastInst>(value)) {
+ llvm::Value *operand = bitcast->getOperand(0);
+ operand = emitARCRetainAfterCall(CGF, operand);
+ bitcast->setOperand(0, operand);
+ return bitcast;
+
+ // Generic fall-back case.
+ } else {
+ // Retain using the non-block variant: we never need to do a copy
+ // of a block that's been returned to us.
+ return CGF.EmitARCRetainNonBlock(value);
+ }
+}
+
+static TryEmitResult
+tryEmitARCRetainScalarExpr(CodeGenFunction &CGF, const Expr *e) {
+ // The desired result type, if it differs from the type of the
+ // ultimate opaque expression.
+ const llvm::Type *resultType = 0;
+
+ // If we're loading retained from a __strong xvalue, we can avoid
+ // an extra retain/release pair by zeroing out the source of this
+ // "move" operation.
+ if (e->isXValue() && !e->getType().isConstQualified() &&
+ e->getType().getObjCLifetime() == Qualifiers::OCL_Strong) {
+ // Emit the lvalue
+ LValue lv = CGF.EmitLValue(e);
+
+ // Load the object pointer and cast it to the appropriate type.
+ QualType exprType = e->getType();
+ llvm::Value *result = CGF.EmitLoadOfLValue(lv).getScalarVal();
+
+ if (resultType)
+ result = CGF.Builder.CreateBitCast(result, resultType);
+
+ // Set the source pointer to NULL.
+ llvm::Value *null
+ = llvm::ConstantPointerNull::get(
+ cast<llvm::PointerType>(CGF.ConvertType(exprType)));
+ CGF.EmitStoreOfScalar(null, lv);
+
+ return TryEmitResult(result, true);
+ }
+
+ while (true) {
+ e = e->IgnoreParens();
+
+ // There's a break at the end of this if-chain; anything
+ // that wants to keep looping has to explicitly continue.
+ if (const CastExpr *ce = dyn_cast<CastExpr>(e)) {
+ switch (ce->getCastKind()) {
+ // No-op casts don't change the type, so we just ignore them.
+ case CK_NoOp:
+ e = ce->getSubExpr();
+ continue;
+
+ case CK_LValueToRValue: {
+ TryEmitResult loadResult
+ = tryEmitARCRetainLoadOfScalar(CGF, ce->getSubExpr());
+ if (resultType) {
+ llvm::Value *value = loadResult.getPointer();
+ value = CGF.Builder.CreateBitCast(value, resultType);
+ loadResult.setPointer(value);
+ }
+ return loadResult;
+ }
+
+ // These casts can change the type, so remember that and
+ // soldier on. We only need to remember the outermost such
+ // cast, though.
+ case CK_AnyPointerToObjCPointerCast:
+ case CK_AnyPointerToBlockPointerCast:
+ case CK_BitCast:
+ if (!resultType)
+ resultType = CGF.ConvertType(ce->getType());
+ e = ce->getSubExpr();
+ assert(e->getType()->hasPointerRepresentation());
+ continue;
+
+ // For consumptions, just emit the subexpression and thus elide
+ // the retain/release pair.
+ case CK_ObjCConsumeObject: {
+ llvm::Value *result = CGF.EmitScalarExpr(ce->getSubExpr());
+ if (resultType) result = CGF.Builder.CreateBitCast(result, resultType);
+ return TryEmitResult(result, true);
+ }
+
+ // For reclaims, emit the subexpression as a retained call and
+ // skip the consumption.
+ case CK_ObjCReclaimReturnedObject: {
+ llvm::Value *result = emitARCRetainCall(CGF, ce->getSubExpr());
+ if (resultType) result = CGF.Builder.CreateBitCast(result, resultType);
+ return TryEmitResult(result, true);
+ }
+
+ case CK_GetObjCProperty: {
+ llvm::Value *result = emitARCRetainCall(CGF, ce);
+ if (resultType) result = CGF.Builder.CreateBitCast(result, resultType);
+ return TryEmitResult(result, true);
+ }
+
+ default:
+ break;
+ }
+
+ // Skip __extension__.
+ } else if (const UnaryOperator *op = dyn_cast<UnaryOperator>(e)) {
+ if (op->getOpcode() == UO_Extension) {
+ e = op->getSubExpr();
+ continue;
+ }
+
+ // For calls and message sends, use the retained-call logic.
+ // Delegate inits are a special case in that they're the only
+ // returns-retained expression that *isn't* surrounded by
+ // a consume.
+ } else if (isa<CallExpr>(e) ||
+ (isa<ObjCMessageExpr>(e) &&
+ !cast<ObjCMessageExpr>(e)->isDelegateInitCall())) {
+ llvm::Value *result = emitARCRetainCall(CGF, e);
+ if (resultType) result = CGF.Builder.CreateBitCast(result, resultType);
+ return TryEmitResult(result, true);
+ }
+
+ // Conservatively halt the search at any other expression kind.
+ break;
+ }
+
+ // We didn't find an obvious production, so emit what we've got and
+ // tell the caller that we didn't manage to retain.
+ llvm::Value *result = CGF.EmitScalarExpr(e);
+ if (resultType) result = CGF.Builder.CreateBitCast(result, resultType);
+ return TryEmitResult(result, false);
+}
+
+static llvm::Value *emitARCRetainLoadOfScalar(CodeGenFunction &CGF,
+ LValue lvalue,
+ QualType type) {
+ TryEmitResult result = tryEmitARCRetainLoadOfScalar(CGF, lvalue, type);
+ llvm::Value *value = result.getPointer();
+ if (!result.getInt())
+ value = CGF.EmitARCRetain(type, value);
+ return value;
+}
+
+/// EmitARCRetainScalarExpr - Semantically equivalent to
+/// EmitARCRetainObject(e->getType(), EmitScalarExpr(e)), but making a
+/// best-effort attempt to peephole expressions that naturally produce
+/// retained objects.
+llvm::Value *CodeGenFunction::EmitARCRetainScalarExpr(const Expr *e) {
+ TryEmitResult result = tryEmitARCRetainScalarExpr(*this, e);
+ llvm::Value *value = result.getPointer();
+ if (!result.getInt())
+ value = EmitARCRetain(e->getType(), value);
+ return value;
+}
+
+llvm::Value *
+CodeGenFunction::EmitARCRetainAutoreleaseScalarExpr(const Expr *e) {
+ TryEmitResult result = tryEmitARCRetainScalarExpr(*this, e);
+ llvm::Value *value = result.getPointer();
+ if (result.getInt())
+ value = EmitARCAutorelease(value);
+ else
+ value = EmitARCRetainAutorelease(e->getType(), value);
+ return value;
+}
+
+std::pair<LValue,llvm::Value*>
+CodeGenFunction::EmitARCStoreStrong(const BinaryOperator *e,
+ bool ignored) {
+ // Evaluate the RHS first.
+ TryEmitResult result = tryEmitARCRetainScalarExpr(*this, e->getRHS());
+ llvm::Value *value = result.getPointer();
+
+ LValue lvalue = EmitLValue(e->getLHS());
+
+ // If the RHS was emitted retained, expand this.
+ if (result.getInt()) {
+ llvm::Value *oldValue =
+ EmitLoadOfScalar(lvalue.getAddress(), lvalue.isVolatileQualified(),
+ lvalue.getAlignment(), e->getType(),
+ lvalue.getTBAAInfo());
+ EmitStoreOfScalar(value, lvalue.getAddress(),
+ lvalue.isVolatileQualified(), lvalue.getAlignment(),
+ e->getType(), lvalue.getTBAAInfo());
+ EmitARCRelease(oldValue, /*precise*/ false);
+ } else {
+ value = EmitARCStoreStrong(lvalue, value, ignored);
+ }
+
+ return std::pair<LValue,llvm::Value*>(lvalue, value);
+}
+
+std::pair<LValue,llvm::Value*>
+CodeGenFunction::EmitARCStoreAutoreleasing(const BinaryOperator *e) {
+ llvm::Value *value = EmitARCRetainAutoreleaseScalarExpr(e->getRHS());
+ LValue lvalue = EmitLValue(e->getLHS());
+
+ EmitStoreOfScalar(value, lvalue.getAddress(),
+ lvalue.isVolatileQualified(), lvalue.getAlignment(),
+ e->getType(), lvalue.getTBAAInfo());
+
+ return std::pair<LValue,llvm::Value*>(lvalue, value);
+}
+
+void CodeGenFunction::EmitObjCAutoreleasePoolStmt(
+ const ObjCAutoreleasePoolStmt &ARPS) {
+ const Stmt *subStmt = ARPS.getSubStmt();
+ const CompoundStmt &S = cast<CompoundStmt>(*subStmt);
+
+ CGDebugInfo *DI = getDebugInfo();
+ if (DI) {
+ DI->setLocation(S.getLBracLoc());
+ DI->EmitRegionStart(Builder);
+ }
+
+ // Keep track of the current cleanup stack depth.
+ RunCleanupsScope Scope(*this);
+ if (CGM.getCodeGenOpts().ObjCRuntimeHasARC) {
+ llvm::Value *token = EmitObjCAutoreleasePoolPush();
+ EHStack.pushCleanup<CallObjCAutoreleasePoolObject>(NormalCleanup, token);
+ } else {
+ llvm::Value *token = EmitObjCMRRAutoreleasePoolPush();
+ EHStack.pushCleanup<CallObjCMRRAutoreleasePoolObject>(NormalCleanup, token);
+ }
+
+ for (CompoundStmt::const_body_iterator I = S.body_begin(),
+ E = S.body_end(); I != E; ++I)
+ EmitStmt(*I);
+
+ if (DI) {
+ DI->setLocation(S.getRBracLoc());
+ DI->EmitRegionEnd(Builder);
+ }
+}
+
+/// EmitExtendGCLifetime - Given a pointer to an Objective-C object,
+/// make sure it survives garbage collection until this point.
+void CodeGenFunction::EmitExtendGCLifetime(llvm::Value *object) {
+ // We just use an inline assembly.
+ llvm::Type *paramTypes[] = { VoidPtrTy };
+ llvm::FunctionType *extenderType
+ = llvm::FunctionType::get(VoidTy, paramTypes, /*variadic*/ false);
+ llvm::Value *extender
+ = llvm::InlineAsm::get(extenderType,
+ /* assembly */ "",
+ /* constraints */ "r",
+ /* side effects */ true);
+
+ object = Builder.CreateBitCast(object, VoidPtrTy);
+ Builder.CreateCall(extender, object)->setDoesNotThrow();
+}
+
CGObjCRuntime::~CGObjCRuntime() {}
diff --git a/contrib/llvm/tools/clang/lib/CodeGen/CGObjCGNU.cpp b/contrib/llvm/tools/clang/lib/CodeGen/CGObjCGNU.cpp
index f0993c5..61027fe 100644
--- a/contrib/llvm/tools/clang/lib/CodeGen/CGObjCGNU.cpp
+++ b/contrib/llvm/tools/clang/lib/CodeGen/CGObjCGNU.cpp
@@ -50,7 +50,7 @@ namespace {
/// avoids constructing the type more than once if it's used more than once.
class LazyRuntimeFunction {
CodeGenModule *CGM;
- std::vector<const llvm::Type*> ArgTys;
+ std::vector<llvm::Type*> ArgTys;
const char *FunctionName;
llvm::Constant *Function;
public:
@@ -63,14 +63,14 @@ class LazyRuntimeFunction {
/// of the arguments.
END_WITH_NULL
void init(CodeGenModule *Mod, const char *name,
- const llvm::Type *RetTy, ...) {
+ llvm::Type *RetTy, ...) {
CGM =Mod;
FunctionName = name;
Function = 0;
ArgTys.clear();
va_list Args;
va_start(Args, RetTy);
- while (const llvm::Type *ArgTy = va_arg(Args, const llvm::Type*))
+ while (llvm::Type *ArgTy = va_arg(Args, llvm::Type*))
ArgTys.push_back(ArgTy);
va_end(Args);
// Push the return type on at the end so we can pop it off easily
@@ -118,24 +118,24 @@ protected:
/// LLVM type for selectors. Opaque pointer (i8*) unless a header declaring
/// SEL is included in a header somewhere, in which case it will be whatever
/// type is declared in that header, most likely {i8*, i8*}.
- const llvm::PointerType *SelectorTy;
+ llvm::PointerType *SelectorTy;
/// LLVM i8 type. Cached here to avoid repeatedly getting it in all of the
/// places where it's used
const llvm::IntegerType *Int8Ty;
/// Pointer to i8 - LLVM type of char*, for all of the places where the
/// runtime needs to deal with C strings.
- const llvm::PointerType *PtrToInt8Ty;
+ llvm::PointerType *PtrToInt8Ty;
/// Instance Method Pointer type. This is a pointer to a function that takes,
/// at a minimum, an object and a selector, and is the generic type for
/// Objective-C methods. Due to differences between variadic / non-variadic
/// calling conventions, it must always be cast to the correct type before
/// actually being used.
- const llvm::PointerType *IMPTy;
+ llvm::PointerType *IMPTy;
/// Type of an untyped Objective-C object. Clang treats id as a built-in type
/// when compiling Objective-C code, so this may be an opaque pointer (i8*),
/// but if the runtime header declaring it is included then it may be a
/// pointer to a structure.
- const llvm::PointerType *IdTy;
+ llvm::PointerType *IdTy;
/// Pointer to a pointer to an Objective-C object. Used in the new ABI
/// message lookup function and some GC-related functions.
const llvm::PointerType *PtrToIdTy;
@@ -143,15 +143,15 @@ protected:
/// call Objective-C methods.
CanQualType ASTIdTy;
/// LLVM type for C int type.
- const llvm::IntegerType *IntTy;
+ llvm::IntegerType *IntTy;
/// LLVM type for an opaque pointer. This is identical to PtrToInt8Ty, but is
/// used in the code to document the difference between i8* meaning a pointer
/// to a C string and i8* meaning a pointer to some opaque type.
- const llvm::PointerType *PtrTy;
+ llvm::PointerType *PtrTy;
/// LLVM type for C long type. The runtime uses this in a lot of places where
/// it should be using intptr_t, but we can't fix this without breaking
/// compatibility with GCC...
- const llvm::IntegerType *LongTy;
+ llvm::IntegerType *LongTy;
/// LLVM type for C size_t. Used in various runtime data structures.
const llvm::IntegerType *SizeTy;
/// LLVM type for C ptrdiff_t. Mainly used in property accessor functions.
@@ -392,6 +392,9 @@ private:
/// Emits a reference to a class. This allows the linker to object if there
/// is no class of the matching name.
void EmitClassRef(const std::string &className);
+ /// Emits a pointer to the named class
+ llvm::Value *GetClassNamed(CGBuilderTy &Builder, const std::string &Name,
+ bool isWeak);
protected:
/// Looks up the method for sending a message to the specified object. This
/// mechanism differs between the GCC and GNU runtimes, so this method must be
@@ -484,6 +487,7 @@ public:
virtual llvm::Value *EmitIvarOffset(CodeGenFunction &CGF,
const ObjCInterfaceDecl *Interface,
const ObjCIvarDecl *Ivar);
+ virtual llvm::Value *EmitNSAutoreleasePoolClassRef(CGBuilderTy &Builder);
virtual llvm::Constant *BuildGCBlockLayout(CodeGenModule &CGM,
const CGBlockInfo &blockInfo) {
return NULLPtr;
@@ -527,7 +531,7 @@ protected:
CGBuilderTy &Builder = CGF.Builder;
llvm::Value *lookupArgs[] = {EnforceType(Builder, ObjCSuper,
PtrToObjCSuperTy), cmd};
- return Builder.CreateCall(MsgLookupSuperFn, lookupArgs, lookupArgs+2);
+ return Builder.CreateCall(MsgLookupSuperFn, lookupArgs);
}
public:
CGObjCGCC(CodeGenModule &Mod) : CGObjCGNU(Mod, 8, 2) {
@@ -596,15 +600,14 @@ class CGObjCGNUstep : public CGObjCGNU {
CGBuilderTy &Builder = CGF.Builder;
llvm::Value *lookupArgs[] = {ObjCSuper, cmd};
- llvm::CallInst *slot = Builder.CreateCall(SlotLookupSuperFn, lookupArgs,
- lookupArgs+2);
+ llvm::CallInst *slot = Builder.CreateCall(SlotLookupSuperFn, lookupArgs);
slot->setOnlyReadsMemory();
return Builder.CreateLoad(Builder.CreateStructGEP(slot, 4));
}
public:
CGObjCGNUstep(CodeGenModule &Mod) : CGObjCGNU(Mod, 9, 3) {
- llvm::StructType *SlotStructTy = llvm::StructType::get(VMContext, PtrTy,
+ llvm::StructType *SlotStructTy = llvm::StructType::get(PtrTy,
PtrTy, PtrTy, IntTy, IMPTy, NULL);
SlotTy = llvm::PointerType::getUnqual(SlotStructTy);
// Slot_t objc_msg_lookup_sender(id *receiver, SEL selector, id sender);
@@ -615,7 +618,7 @@ class CGObjCGNUstep : public CGObjCGNU {
PtrToObjCSuperTy, SelectorTy, NULL);
// If we're in ObjC++ mode, then we want to make
if (CGM.getLangOptions().CPlusPlus) {
- const llvm::Type *VoidTy = llvm::Type::getVoidTy(VMContext);
+ llvm::Type *VoidTy = llvm::Type::getVoidTy(VMContext);
// void *__cxa_begin_catch(void *e)
EnterCatchFn.init(&CGM, "__cxa_begin_catch", PtrTy, PtrTy, NULL);
// void __cxa_end_catch(void)
@@ -705,10 +708,10 @@ CGObjCGNU::CGObjCGNU(CodeGenModule &cgm, unsigned runtimeABIVersion,
}
PtrToIdTy = llvm::PointerType::getUnqual(IdTy);
- ObjCSuperTy = llvm::StructType::get(VMContext, IdTy, IdTy, NULL);
+ ObjCSuperTy = llvm::StructType::get(IdTy, IdTy, NULL);
PtrToObjCSuperTy = llvm::PointerType::getUnqual(ObjCSuperTy);
- const llvm::Type *VoidTy = llvm::Type::getVoidTy(VMContext);
+ llvm::Type *VoidTy = llvm::Type::getVoidTy(VMContext);
// void objc_exception_throw(id);
ExceptionThrowFn.init(&CGM, "objc_exception_throw", VoidTy, IdTy, NULL);
@@ -736,16 +739,19 @@ CGObjCGNU::CGObjCGNU(CodeGenModule &cgm, unsigned runtimeABIVersion,
PtrDiffTy, BoolTy, BoolTy, NULL);
// IMP type
- const llvm::Type *IMPArgs[] = { IdTy, SelectorTy };
+ llvm::Type *IMPArgs[] = { IdTy, SelectorTy };
IMPTy = llvm::PointerType::getUnqual(llvm::FunctionType::get(IdTy, IMPArgs,
true));
+ const LangOptions &Opts = CGM.getLangOptions();
+ if ((Opts.getGCMode() != LangOptions::NonGC) || Opts.ObjCAutoRefCount)
+ RuntimeVersion = 10;
+
// Don't bother initialising the GC stuff unless we're compiling in GC mode
- if (CGM.getLangOptions().getGCMode() != LangOptions::NonGC) {
+ if (Opts.getGCMode() != LangOptions::NonGC) {
// This is a bit of an hack. We should sort this out by having a proper
// CGObjCGNUstep subclass for GC, but we may want to really support the old
// ABI and GC added in ObjectiveC2.framework, so we fudge it a bit for now
- RuntimeVersion = 10;
// Get selectors needed in GC mode
RetainSel = GetNullarySelector("retain", CGM.getContext());
ReleaseSel = GetNullarySelector("release", CGM.getContext());
@@ -772,24 +778,38 @@ CGObjCGNU::CGObjCGNU(CodeGenModule &cgm, unsigned runtimeABIVersion,
}
}
-// This has to perform the lookup every time, since posing and related
-// techniques can modify the name -> class mapping.
-llvm::Value *CGObjCGNU::GetClass(CGBuilderTy &Builder,
- const ObjCInterfaceDecl *OID) {
- llvm::Value *ClassName = CGM.GetAddrOfConstantCString(OID->getNameAsString());
+llvm::Value *CGObjCGNU::GetClassNamed(CGBuilderTy &Builder,
+ const std::string &Name,
+ bool isWeak) {
+ llvm::Value *ClassName = CGM.GetAddrOfConstantCString(Name);
// With the incompatible ABI, this will need to be replaced with a direct
// reference to the class symbol. For the compatible nonfragile ABI we are
// still performing this lookup at run time but emitting the symbol for the
// class externally so that we can make the switch later.
- EmitClassRef(OID->getNameAsString());
+ //
+ // Libobjc2 contains an LLVM pass that replaces calls to objc_lookup_class
+ // with memoized versions or with static references if it's safe to do so.
+ if (!isWeak)
+ EmitClassRef(Name);
ClassName = Builder.CreateStructGEP(ClassName, 0);
+ llvm::Type *ArgTys[] = { PtrToInt8Ty };
llvm::Constant *ClassLookupFn =
- CGM.CreateRuntimeFunction(llvm::FunctionType::get(IdTy, PtrToInt8Ty, true),
+ CGM.CreateRuntimeFunction(llvm::FunctionType::get(IdTy, ArgTys, true),
"objc_lookup_class");
return Builder.CreateCall(ClassLookupFn, ClassName);
}
+// This has to perform the lookup every time, since posing and related
+// techniques can modify the name -> class mapping.
+llvm::Value *CGObjCGNU::GetClass(CGBuilderTy &Builder,
+ const ObjCInterfaceDecl *OID) {
+ return GetClassNamed(Builder, OID->getNameAsString(), OID->isWeakImported());
+}
+llvm::Value *CGObjCGNU::EmitNSAutoreleasePoolClassRef(CGBuilderTy &Builder) {
+ return GetClassNamed(Builder, "NSAutoreleasePool", false);
+}
+
llvm::Value *CGObjCGNU::GetSelector(CGBuilderTy &Builder, Selector Sel,
const std::string &TypeEncoding, bool lval) {
@@ -908,7 +928,7 @@ llvm::Constant *CGObjCGNU::GetEHType(QualType T) {
fields.push_back(Vtable);
fields.push_back(typeName);
llvm::Constant *TI =
- MakeGlobal(llvm::StructType::get(VMContext, PtrToInt8Ty, PtrToInt8Ty,
+ MakeGlobal(llvm::StructType::get(PtrToInt8Ty, PtrToInt8Ty,
NULL), fields, "__objc_eh_typeinfo_" + className,
llvm::GlobalValue::LinkOnceODRLinkage);
return llvm::ConstantExpr::getBitCast(TI, PtrToInt8Ty);
@@ -929,7 +949,7 @@ llvm::Constant *CGObjCGNU::GenerateConstantString(const StringLiteral *SL) {
Ivars.push_back(MakeConstantString(Str));
Ivars.push_back(llvm::ConstantInt::get(IntTy, Str.size()));
llvm::Constant *ObjCStr = MakeGlobal(
- llvm::StructType::get(VMContext, PtrToInt8Ty, PtrToInt8Ty, IntTy, NULL),
+ llvm::StructType::get(PtrToInt8Ty, PtrToInt8Ty, IntTy, NULL),
Ivars, ".objc_str");
ObjCStr = llvm::ConstantExpr::getBitCast(ObjCStr, PtrToInt8Ty);
ObjCStrings[Str] = ObjCStr;
@@ -969,7 +989,7 @@ CGObjCGNU::GenerateMessageSendSuper(CodeGenFunction &CGF,
ActualArgs.add(RValue::get(EnforceType(Builder, Receiver, IdTy)), ASTIdTy);
ActualArgs.add(RValue::get(cmd), CGF.getContext().getObjCSelType());
- ActualArgs.insert(ActualArgs.end(), CallArgs.begin(), CallArgs.end());
+ ActualArgs.addFrom(CallArgs);
CodeGenTypes &Types = CGM.getTypes();
const CGFunctionInfo &FnInfo = Types.getFunctionInfo(ResultType, ActualArgs,
@@ -979,11 +999,13 @@ CGObjCGNU::GenerateMessageSendSuper(CodeGenFunction &CGF,
if (isCategoryImpl) {
llvm::Constant *classLookupFunction = 0;
if (IsClassMessage) {
+ llvm::Type *ArgTys[] = { PtrTy };
classLookupFunction = CGM.CreateRuntimeFunction(llvm::FunctionType::get(
- IdTy, PtrTy, true), "objc_get_meta_class");
+ IdTy, ArgTys, true), "objc_get_meta_class");
} else {
+ llvm::Type *ArgTys[] = { PtrTy };
classLookupFunction = CGM.CreateRuntimeFunction(llvm::FunctionType::get(
- IdTy, PtrTy, true), "objc_get_class");
+ IdTy, ArgTys, true), "objc_get_class");
}
ReceiverClass = Builder.CreateCall(classLookupFunction,
MakeConstantString(Class->getNameAsString()));
@@ -1012,13 +1034,13 @@ CGObjCGNU::GenerateMessageSendSuper(CodeGenFunction &CGF,
// Cast the pointer to a simplified version of the class structure
ReceiverClass = Builder.CreateBitCast(ReceiverClass,
llvm::PointerType::getUnqual(
- llvm::StructType::get(VMContext, IdTy, IdTy, NULL)));
+ llvm::StructType::get(IdTy, IdTy, NULL)));
// Get the superclass pointer
ReceiverClass = Builder.CreateStructGEP(ReceiverClass, 1);
// Load the superclass pointer
ReceiverClass = Builder.CreateLoad(ReceiverClass);
// Construct the structure used to look up the IMP
- llvm::StructType *ObjCSuperTy = llvm::StructType::get(VMContext,
+ llvm::StructType *ObjCSuperTy = llvm::StructType::get(
Receiver->getType(), IdTy, NULL);
llvm::Value *ObjCSuper = Builder.CreateAlloca(ObjCSuperTy);
@@ -1121,7 +1143,7 @@ CGObjCGNU::GenerateMessageSend(CodeGenFunction &CGF,
CallArgList ActualArgs;
ActualArgs.add(RValue::get(Receiver), ASTIdTy);
ActualArgs.add(RValue::get(cmd), CGF.getContext().getObjCSelType());
- ActualArgs.insert(ActualArgs.end(), CallArgs.begin(), CallArgs.end());
+ ActualArgs.addFrom(CallArgs);
CodeGenTypes &Types = CGM.getTypes();
const CGFunctionInfo &FnInfo = Types.getFunctionInfo(ResultType, ActualArgs,
@@ -1187,7 +1209,7 @@ llvm::Constant *CGObjCGNU::GenerateMethodList(const llvm::StringRef &ClassName,
if (MethodSels.empty())
return NULLPtr;
// Get the method structure type.
- llvm::StructType *ObjCMethodTy = llvm::StructType::get(VMContext,
+ llvm::StructType *ObjCMethodTy = llvm::StructType::get(
PtrToInt8Ty, // Really a selector, but the runtime creates it us.
PtrToInt8Ty, // Method types
IMPTy, //Method pointer
@@ -1217,18 +1239,14 @@ llvm::Constant *CGObjCGNU::GenerateMethodList(const llvm::StringRef &ClassName,
Methods);
// Structure containing list pointer, array and array count
- llvm::SmallVector<const llvm::Type*, 16> ObjCMethodListFields;
- llvm::PATypeHolder OpaqueNextTy = llvm::OpaqueType::get(VMContext);
- llvm::Type *NextPtrTy = llvm::PointerType::getUnqual(OpaqueNextTy);
- llvm::StructType *ObjCMethodListTy = llvm::StructType::get(VMContext,
+ llvm::StructType *ObjCMethodListTy =
+ llvm::StructType::createNamed(VMContext, "");
+ llvm::Type *NextPtrTy = llvm::PointerType::getUnqual(ObjCMethodListTy);
+ ObjCMethodListTy->setBody(
NextPtrTy,
IntTy,
ObjCMethodArrayTy,
NULL);
- // Refine next pointer type to concrete type
- llvm::cast<llvm::OpaqueType>(
- OpaqueNextTy.get())->refineAbstractTypeTo(ObjCMethodListTy);
- ObjCMethodListTy = llvm::cast<llvm::StructType>(OpaqueNextTy.get());
Methods.clear();
Methods.push_back(llvm::ConstantPointerNull::get(
@@ -1249,7 +1267,7 @@ llvm::Constant *CGObjCGNU::GenerateIvarList(
if (IvarNames.size() == 0)
return NULLPtr;
// Get the method structure type.
- llvm::StructType *ObjCIvarTy = llvm::StructType::get(VMContext,
+ llvm::StructType *ObjCIvarTy = llvm::StructType::get(
PtrToInt8Ty,
PtrToInt8Ty,
IntTy,
@@ -1273,7 +1291,7 @@ llvm::Constant *CGObjCGNU::GenerateIvarList(
Elements.push_back(llvm::ConstantInt::get(IntTy, (int)IvarNames.size()));
Elements.push_back(llvm::ConstantArray::get(ObjCIvarArrayTy, Ivars));
// Structure containing array and array count
- llvm::StructType *ObjCIvarListTy = llvm::StructType::get(VMContext, IntTy,
+ llvm::StructType *ObjCIvarListTy = llvm::StructType::get(IntTy,
ObjCIvarArrayTy,
NULL);
@@ -1302,7 +1320,7 @@ llvm::Constant *CGObjCGNU::GenerateClassStructure(
// Fields marked New ABI are part of the GNUstep runtime. We emit them
// anyway; the classes will still work with the GNU runtime, they will just
// be ignored.
- llvm::StructType *ClassTy = llvm::StructType::get(VMContext,
+ llvm::StructType *ClassTy = llvm::StructType::get(
PtrToInt8Ty, // class_pointer
PtrToInt8Ty, // super_class
PtrToInt8Ty, // name
@@ -1359,7 +1377,7 @@ llvm::Constant *CGObjCGNU::GenerateProtocolMethodList(
const llvm::SmallVectorImpl<llvm::Constant *> &MethodNames,
const llvm::SmallVectorImpl<llvm::Constant *> &MethodTypes) {
// Get the method structure type.
- llvm::StructType *ObjCMethodDescTy = llvm::StructType::get(VMContext,
+ llvm::StructType *ObjCMethodDescTy = llvm::StructType::get(
PtrToInt8Ty, // Really a selector, but the runtime does the casting for us.
PtrToInt8Ty,
NULL);
@@ -1375,7 +1393,7 @@ llvm::Constant *CGObjCGNU::GenerateProtocolMethodList(
MethodNames.size());
llvm::Constant *Array = llvm::ConstantArray::get(ObjCMethodArrayTy,
Methods);
- llvm::StructType *ObjCMethodDescListTy = llvm::StructType::get(VMContext,
+ llvm::StructType *ObjCMethodDescListTy = llvm::StructType::get(
IntTy, ObjCMethodArrayTy, NULL);
Methods.clear();
Methods.push_back(llvm::ConstantInt::get(IntTy, MethodNames.size()));
@@ -1388,7 +1406,7 @@ llvm::Constant *CGObjCGNU::GenerateProtocolList(
const llvm::SmallVectorImpl<std::string> &Protocols) {
llvm::ArrayType *ProtocolArrayTy = llvm::ArrayType::get(PtrToInt8Ty,
Protocols.size());
- llvm::StructType *ProtocolListTy = llvm::StructType::get(VMContext,
+ llvm::StructType *ProtocolListTy = llvm::StructType::get(
PtrTy, //Should be a recurisve pointer, but it's always NULL here.
SizeTy,
ProtocolArrayTy,
@@ -1435,7 +1453,7 @@ llvm::Constant *CGObjCGNU::GenerateEmptyProtocol(
GenerateProtocolMethodList(EmptyConstantVector, EmptyConstantVector);
// Protocols are objects containing lists of the methods implemented and
// protocols adopted.
- llvm::StructType *ProtocolTy = llvm::StructType::get(VMContext, IdTy,
+ llvm::StructType *ProtocolTy = llvm::StructType::get(IdTy,
PtrToInt8Ty,
ProtocolList->getType(),
MethodList->getType(),
@@ -1521,7 +1539,7 @@ void CGObjCGNU::GenerateProtocol(const ObjCProtocolDecl *PD) {
// The isSynthesized value is always set to 0 in a protocol. It exists to
// simplify the runtime library by allowing it to use the same data
// structures for protocol metadata everywhere.
- llvm::StructType *PropertyMetadataTy = llvm::StructType::get(VMContext,
+ llvm::StructType *PropertyMetadataTy = llvm::StructType::get(
PtrToInt8Ty, Int8Ty, Int8Ty, PtrToInt8Ty, PtrToInt8Ty, PtrToInt8Ty,
PtrToInt8Ty, NULL);
std::vector<llvm::Constant*> Properties;
@@ -1573,7 +1591,7 @@ void CGObjCGNU::GenerateProtocol(const ObjCProtocolDecl *PD) {
{llvm::ConstantInt::get(IntTy, Properties.size()), NULLPtr, PropertyArray};
llvm::Constant *PropertyListInit =
- llvm::ConstantStruct::get(VMContext, PropertyListInitFields, 3, false);
+ llvm::ConstantStruct::getAnon(PropertyListInitFields);
llvm::Constant *PropertyList = new llvm::GlobalVariable(TheModule,
PropertyListInit->getType(), false, llvm::GlobalValue::InternalLinkage,
PropertyListInit, ".objc_property_list");
@@ -1586,7 +1604,7 @@ void CGObjCGNU::GenerateProtocol(const ObjCProtocolDecl *PD) {
OptionalPropertyArray };
llvm::Constant *OptionalPropertyListInit =
- llvm::ConstantStruct::get(VMContext, OptionalPropertyListInitFields, 3, false);
+ llvm::ConstantStruct::getAnon(OptionalPropertyListInitFields);
llvm::Constant *OptionalPropertyList = new llvm::GlobalVariable(TheModule,
OptionalPropertyListInit->getType(), false,
llvm::GlobalValue::InternalLinkage, OptionalPropertyListInit,
@@ -1594,7 +1612,7 @@ void CGObjCGNU::GenerateProtocol(const ObjCProtocolDecl *PD) {
// Protocols are objects containing lists of the methods implemented and
// protocols adopted.
- llvm::StructType *ProtocolTy = llvm::StructType::get(VMContext, IdTy,
+ llvm::StructType *ProtocolTy = llvm::StructType::get(IdTy,
PtrToInt8Ty,
ProtocolList->getType(),
InstanceMethodList->getType(),
@@ -1641,7 +1659,7 @@ void CGObjCGNU::GenerateProtocolHolderCategory(void) {
// Protocol list
llvm::ArrayType *ProtocolArrayTy = llvm::ArrayType::get(PtrTy,
ExistingProtocols.size());
- llvm::StructType *ProtocolListTy = llvm::StructType::get(VMContext,
+ llvm::StructType *ProtocolListTy = llvm::StructType::get(
PtrTy, //Should be a recurisve pointer, but it's always NULL here.
SizeTy,
ProtocolArrayTy,
@@ -1664,7 +1682,7 @@ void CGObjCGNU::GenerateProtocolHolderCategory(void) {
Elements.push_back(llvm::ConstantExpr::getBitCast(MakeGlobal(ProtocolListTy,
ProtocolElements, ".objc_protocol_list"), PtrTy));
Categories.push_back(llvm::ConstantExpr::getBitCast(
- MakeGlobal(llvm::StructType::get(VMContext, PtrToInt8Ty, PtrToInt8Ty,
+ MakeGlobal(llvm::StructType::get(PtrToInt8Ty, PtrToInt8Ty,
PtrTy, PtrTy, PtrTy, NULL), Elements), PtrTy));
}
@@ -1718,7 +1736,7 @@ void CGObjCGNU::GenerateCategory(const ObjCCategoryImplDecl *OCD) {
Elements.push_back(llvm::ConstantExpr::getBitCast(
GenerateProtocolList(Protocols), PtrTy));
Categories.push_back(llvm::ConstantExpr::getBitCast(
- MakeGlobal(llvm::StructType::get(VMContext, PtrToInt8Ty, PtrToInt8Ty,
+ MakeGlobal(llvm::StructType::get(PtrToInt8Ty, PtrToInt8Ty,
PtrTy, PtrTy, PtrTy, NULL), Elements), PtrTy));
}
@@ -1729,7 +1747,7 @@ llvm::Constant *CGObjCGNU::GeneratePropertyList(const ObjCImplementationDecl *OI
//
// Property metadata: name, attributes, isSynthesized, setter name, setter
// types, getter name, getter types.
- llvm::StructType *PropertyMetadataTy = llvm::StructType::get(VMContext,
+ llvm::StructType *PropertyMetadataTy = llvm::StructType::get(
PtrToInt8Ty, Int8Ty, Int8Ty, PtrToInt8Ty, PtrToInt8Ty, PtrToInt8Ty,
PtrToInt8Ty, NULL);
std::vector<llvm::Constant*> Properties;
@@ -1788,7 +1806,7 @@ llvm::Constant *CGObjCGNU::GeneratePropertyList(const ObjCImplementationDecl *OI
{llvm::ConstantInt::get(IntTy, Properties.size()), NULLPtr, PropertyArray};
llvm::Constant *PropertyListInit =
- llvm::ConstantStruct::get(VMContext, PropertyListInitFields, 3, false);
+ llvm::ConstantStruct::getAnon(PropertyListInitFields);
return new llvm::GlobalVariable(TheModule, PropertyListInit->getType(), false,
llvm::GlobalValue::InternalLinkage, PropertyListInit,
".objc_property_list");
@@ -1859,13 +1877,25 @@ void CGObjCGNU::GenerateClass(const ObjCImplementationDecl *OID) {
if (CGM.getContext().getLangOptions().ObjCNonFragileABI) {
Offset = BaseOffset - superInstanceSize;
}
- IvarOffsets.push_back(
- llvm::ConstantInt::get(llvm::Type::getInt32Ty(VMContext), Offset));
- IvarOffsetValues.push_back(new llvm::GlobalVariable(TheModule, IntTy,
+ llvm::Constant *OffsetValue = llvm::ConstantInt::get(IntTy, Offset);
+ // Create the direct offset value
+ std::string OffsetName = "__objc_ivar_offset_value_" + ClassName +"." +
+ IVD->getNameAsString();
+ llvm::GlobalVariable *OffsetVar = TheModule.getGlobalVariable(OffsetName);
+ if (OffsetVar) {
+ OffsetVar->setInitializer(OffsetValue);
+ // If this is the real definition, change its linkage type so that
+ // different modules will use this one, rather than their private
+ // copy.
+ OffsetVar->setLinkage(llvm::GlobalValue::ExternalLinkage);
+ } else
+ OffsetVar = new llvm::GlobalVariable(TheModule, IntTy,
false, llvm::GlobalValue::ExternalLinkage,
- llvm::ConstantInt::get(IntTy, Offset),
+ OffsetValue,
"__objc_ivar_offset_value_" + ClassName +"." +
- IVD->getNameAsString()));
+ IVD->getNameAsString());
+ IvarOffsets.push_back(OffsetValue);
+ IvarOffsetValues.push_back(OffsetVar);
}
llvm::GlobalVariable *IvarOffsetArray =
MakeGlobalArray(PtrToIntTy, IvarOffsetValues, ".ivar.offsets");
@@ -2005,18 +2035,12 @@ llvm::Function *CGObjCGNU::ModuleInitFunction() {
const llvm::StructType *SelStructTy = dyn_cast<llvm::StructType>(
SelectorTy->getElementType());
- const llvm::Type *SelStructPtrTy = SelectorTy;
+ llvm::Type *SelStructPtrTy = SelectorTy;
if (SelStructTy == 0) {
- SelStructTy = llvm::StructType::get(VMContext, PtrToInt8Ty,
- PtrToInt8Ty, NULL);
+ SelStructTy = llvm::StructType::get(PtrToInt8Ty, PtrToInt8Ty, NULL);
SelStructPtrTy = llvm::PointerType::getUnqual(SelStructTy);
}
- // Name the ObjC types to make the IR a bit easier to read
- TheModule.addTypeName(".objc_selector", SelStructPtrTy);
- TheModule.addTypeName(".objc_id", IdTy);
- TheModule.addTypeName(".objc_imp", IMPTy);
-
std::vector<llvm::Constant*> Elements;
llvm::Constant *Statics = NULLPtr;
// Generate statics list:
@@ -2034,7 +2058,7 @@ llvm::Function *CGObjCGNU::ModuleInitFunction() {
Elements.push_back(llvm::ConstantArray::get(StaticsArrayTy,
ConstantStrings));
llvm::StructType *StaticsListTy =
- llvm::StructType::get(VMContext, PtrToInt8Ty, StaticsArrayTy, NULL);
+ llvm::StructType::get(PtrToInt8Ty, StaticsArrayTy, NULL);
llvm::Type *StaticsListPtrTy =
llvm::PointerType::getUnqual(StaticsListTy);
Statics = MakeGlobal(StaticsListTy, Elements, ".objc_statics");
@@ -2049,8 +2073,7 @@ llvm::Function *CGObjCGNU::ModuleInitFunction() {
// Array of classes, categories, and constant objects
llvm::ArrayType *ClassListTy = llvm::ArrayType::get(PtrToInt8Ty,
Classes.size() + Categories.size() + 2);
- llvm::StructType *SymTabTy = llvm::StructType::get(VMContext,
- LongTy, SelStructPtrTy,
+ llvm::StructType *SymTabTy = llvm::StructType::get(LongTy, SelStructPtrTy,
llvm::Type::getInt16Ty(VMContext),
llvm::Type::getInt16Ty(VMContext),
ClassListTy, NULL);
@@ -2132,10 +2155,9 @@ llvm::Function *CGObjCGNU::ModuleInitFunction() {
// The symbol table is contained in a module which has some version-checking
// constants
- llvm::StructType * ModuleTy = llvm::StructType::get(VMContext, LongTy, LongTy,
+ llvm::StructType * ModuleTy = llvm::StructType::get(LongTy, LongTy,
PtrToInt8Ty, llvm::PointerType::getUnqual(SymTabTy),
- (CGM.getLangOptions().getGCMode() == LangOptions::NonGC) ? NULL : IntTy,
- NULL);
+ (RuntimeVersion >= 10) ? IntTy : NULL, NULL);
Elements.clear();
// Runtime version, used for ABI compatibility checking.
Elements.push_back(llvm::ConstantInt::get(LongTy, RuntimeVersion));
@@ -2154,14 +2176,21 @@ llvm::Function *CGObjCGNU::ModuleInitFunction() {
Elements.push_back(MakeConstantString(path, ".objc_source_file_name"));
Elements.push_back(SymTab);
- switch (CGM.getLangOptions().getGCMode()) {
- case LangOptions::GCOnly:
+ if (RuntimeVersion >= 10)
+ switch (CGM.getLangOptions().getGCMode()) {
+ case LangOptions::GCOnly:
Elements.push_back(llvm::ConstantInt::get(IntTy, 2));
- case LangOptions::NonGC:
break;
- case LangOptions::HybridGC:
- Elements.push_back(llvm::ConstantInt::get(IntTy, 1));
- }
+ case LangOptions::NonGC:
+ if (CGM.getLangOptions().ObjCAutoRefCount)
+ Elements.push_back(llvm::ConstantInt::get(IntTy, 1));
+ else
+ Elements.push_back(llvm::ConstantInt::get(IntTy, 0));
+ break;
+ case LangOptions::HybridGC:
+ Elements.push_back(llvm::ConstantInt::get(IntTy, 1));
+ break;
+ }
llvm::Value *Module = MakeGlobal(ModuleTy, Elements);
@@ -2176,9 +2205,9 @@ llvm::Function *CGObjCGNU::ModuleInitFunction() {
CGBuilderTy Builder(VMContext);
Builder.SetInsertPoint(EntryBB);
+ llvm::Type *ArgTys[] = { llvm::PointerType::getUnqual(ModuleTy) };
llvm::FunctionType *FT =
- llvm::FunctionType::get(Builder.getVoidTy(),
- llvm::PointerType::getUnqual(ModuleTy), true);
+ llvm::FunctionType::get(Builder.getVoidTy(), ArgTys, true);
llvm::Value *Register = CGM.CreateRuntimeFunction(FT, "__objc_exec_class");
Builder.CreateCall(Register, Module);
Builder.CreateRetVoid();
@@ -2280,8 +2309,8 @@ void CGObjCGNU::EmitThrowStmt(CodeGenFunction &CGF,
CGF.Builder.CreateCall(ExceptionThrowFn, ExceptionAsObject);
CGF.Builder.CreateUnreachable();
} else {
- CGF.Builder.CreateInvoke(ExceptionThrowFn, UnwindBB, UnwindBB, &ExceptionAsObject,
- &ExceptionAsObject+1);
+ CGF.Builder.CreateInvoke(ExceptionThrowFn, UnwindBB, UnwindBB,
+ ExceptionAsObject);
}
// Clear the insertion point to indicate we are in unreachable code.
CGF.Builder.ClearInsertionPoint();
@@ -2422,10 +2451,19 @@ llvm::Value *CGObjCGNU::EmitIvarOffset(CodeGenFunction &CGF,
const ObjCIvarDecl *Ivar) {
if (CGM.getLangOptions().ObjCNonFragileABI) {
Interface = FindIvarInterface(CGM.getContext(), Interface, Ivar);
- return CGF.Builder.CreateZExtOrBitCast(
- CGF.Builder.CreateLoad(CGF.Builder.CreateLoad(
- ObjCIvarOffsetVariable(Interface, Ivar), false, "ivar")),
- PtrDiffTy);
+ if (RuntimeVersion < 10)
+ return CGF.Builder.CreateZExtOrBitCast(
+ CGF.Builder.CreateLoad(CGF.Builder.CreateLoad(
+ ObjCIvarOffsetVariable(Interface, Ivar), false, "ivar")),
+ PtrDiffTy);
+ std::string name = "__objc_ivar_offset_value_" +
+ Interface->getNameAsString() +"." + Ivar->getNameAsString();
+ llvm::Value *Offset = TheModule.getGlobalVariable(name);
+ if (!Offset)
+ Offset = new llvm::GlobalVariable(TheModule, IntTy,
+ false, llvm::GlobalValue::CommonLinkage,
+ 0, name);
+ return CGF.Builder.CreateLoad(Offset);
}
uint64_t Offset = ComputeIvarBaseOffset(CGF.CGM, Interface, Ivar);
return llvm::ConstantInt::get(PtrDiffTy, Offset, "ivar");
diff --git a/contrib/llvm/tools/clang/lib/CodeGen/CGObjCMac.cpp b/contrib/llvm/tools/clang/lib/CodeGen/CGObjCMac.cpp
index 8c3e9a3..010b9e1 100644
--- a/contrib/llvm/tools/clang/lib/CodeGen/CGObjCMac.cpp
+++ b/contrib/llvm/tools/clang/lib/CodeGen/CGObjCMac.cpp
@@ -63,10 +63,13 @@ private:
/// The default messenger, used for sends whose ABI is unchanged from
/// the all-integer/pointer case.
llvm::Constant *getMessageSendFn() const {
- const llvm::Type *params[] = { ObjectPtrTy, SelectorPtrTy };
+ // Add the non-lazy-bind attribute, since objc_msgSend is likely to
+ // be called a lot.
+ llvm::Type *params[] = { ObjectPtrTy, SelectorPtrTy };
return CGM.CreateRuntimeFunction(llvm::FunctionType::get(ObjectPtrTy,
params, true),
- "objc_msgSend");
+ "objc_msgSend",
+ llvm::Attribute::NonLazyBind);
}
/// void objc_msgSend_stret (id, SEL, ...)
@@ -75,7 +78,7 @@ private:
/// by indirect reference in the first argument, and therefore the
/// self and selector parameters are shifted over by one.
llvm::Constant *getMessageSendStretFn() const {
- const llvm::Type *params[] = { ObjectPtrTy, SelectorPtrTy };
+ llvm::Type *params[] = { ObjectPtrTy, SelectorPtrTy };
return CGM.CreateRuntimeFunction(llvm::FunctionType::get(CGM.VoidTy,
params, true),
"objc_msgSend_stret");
@@ -88,7 +91,7 @@ private:
/// floating-point stack; without a special entrypoint, the nil case
/// would be unbalanced.
llvm::Constant *getMessageSendFpretFn() const {
- const llvm::Type *params[] = { ObjectPtrTy, SelectorPtrTy };
+ llvm::Type *params[] = { ObjectPtrTy, SelectorPtrTy };
return CGM.CreateRuntimeFunction(llvm::FunctionType::get(
llvm::Type::getDoubleTy(VMContext),
params, true),
@@ -102,7 +105,7 @@ private:
/// semantics. The class passed is the superclass of the current
/// class.
llvm::Constant *getMessageSendSuperFn() const {
- const llvm::Type *params[] = { SuperPtrTy, SelectorPtrTy };
+ llvm::Type *params[] = { SuperPtrTy, SelectorPtrTy };
return CGM.CreateRuntimeFunction(llvm::FunctionType::get(ObjectPtrTy,
params, true),
"objc_msgSendSuper");
@@ -113,7 +116,7 @@ private:
/// A slightly different messenger used for super calls. The class
/// passed is the current class.
llvm::Constant *getMessageSendSuperFn2() const {
- const llvm::Type *params[] = { SuperPtrTy, SelectorPtrTy };
+ llvm::Type *params[] = { SuperPtrTy, SelectorPtrTy };
return CGM.CreateRuntimeFunction(llvm::FunctionType::get(ObjectPtrTy,
params, true),
"objc_msgSendSuper2");
@@ -124,7 +127,7 @@ private:
///
/// The messenger used for super calls which return an aggregate indirectly.
llvm::Constant *getMessageSendSuperStretFn() const {
- const llvm::Type *params[] = { Int8PtrTy, SuperPtrTy, SelectorPtrTy };
+ llvm::Type *params[] = { Int8PtrTy, SuperPtrTy, SelectorPtrTy };
return CGM.CreateRuntimeFunction(
llvm::FunctionType::get(CGM.VoidTy, params, true),
"objc_msgSendSuper_stret");
@@ -135,7 +138,7 @@ private:
///
/// objc_msgSendSuper_stret with the super2 semantics.
llvm::Constant *getMessageSendSuperStretFn2() const {
- const llvm::Type *params[] = { Int8PtrTy, SuperPtrTy, SelectorPtrTy };
+ llvm::Type *params[] = { Int8PtrTy, SuperPtrTy, SelectorPtrTy };
return CGM.CreateRuntimeFunction(
llvm::FunctionType::get(CGM.VoidTy, params, true),
"objc_msgSendSuper2_stret");
@@ -155,20 +158,20 @@ protected:
CodeGen::CodeGenModule &CGM;
public:
- const llvm::Type *ShortTy, *IntTy, *LongTy, *LongLongTy;
- const llvm::Type *Int8PtrTy;
+ llvm::Type *ShortTy, *IntTy, *LongTy, *LongLongTy;
+ llvm::Type *Int8PtrTy;
/// ObjectPtrTy - LLVM type for object handles (typeof(id))
- const llvm::Type *ObjectPtrTy;
+ llvm::Type *ObjectPtrTy;
/// PtrObjectPtrTy - LLVM type for id *
- const llvm::Type *PtrObjectPtrTy;
+ llvm::Type *PtrObjectPtrTy;
/// SelectorPtrTy - LLVM type for selector handles (typeof(SEL))
- const llvm::Type *SelectorPtrTy;
+ llvm::Type *SelectorPtrTy;
/// ProtocolPtrTy - LLVM type for external protocol handles
/// (typeof(Protocol))
- const llvm::Type *ExternalProtocolPtrTy;
+ llvm::Type *ExternalProtocolPtrTy;
// SuperCTy - clang type for struct objc_super.
QualType SuperCTy;
@@ -176,28 +179,28 @@ public:
QualType SuperPtrCTy;
/// SuperTy - LLVM type for struct objc_super.
- const llvm::StructType *SuperTy;
+ llvm::StructType *SuperTy;
/// SuperPtrTy - LLVM type for struct objc_super *.
- const llvm::Type *SuperPtrTy;
+ llvm::Type *SuperPtrTy;
/// PropertyTy - LLVM type for struct objc_property (struct _prop_t
/// in GCC parlance).
- const llvm::StructType *PropertyTy;
+ llvm::StructType *PropertyTy;
/// PropertyListTy - LLVM type for struct objc_property_list
/// (_prop_list_t in GCC parlance).
- const llvm::StructType *PropertyListTy;
+ llvm::StructType *PropertyListTy;
/// PropertyListPtrTy - LLVM type for struct objc_property_list*.
- const llvm::Type *PropertyListPtrTy;
+ llvm::Type *PropertyListPtrTy;
// MethodTy - LLVM type for struct objc_method.
- const llvm::StructType *MethodTy;
+ llvm::StructType *MethodTy;
/// CacheTy - LLVM type for struct objc_cache.
- const llvm::Type *CacheTy;
+ llvm::Type *CacheTy;
/// CachePtrTy - LLVM type for struct objc_cache *.
- const llvm::Type *CachePtrTy;
-
+ llvm::Type *CachePtrTy;
+
llvm::Constant *getGetPropertyFn() {
CodeGen::CodeGenTypes &Types = CGM.getTypes();
ASTContext &Ctx = CGM.getContext();
@@ -270,7 +273,7 @@ public:
/// GcReadWeakFn -- LLVM objc_read_weak (id *src) function.
llvm::Constant *getGcReadWeakFn() {
// id objc_read_weak (id *)
- const llvm::Type *args[] = { ObjectPtrTy->getPointerTo() };
+ llvm::Type *args[] = { ObjectPtrTy->getPointerTo() };
llvm::FunctionType *FTy =
llvm::FunctionType::get(ObjectPtrTy, args, false);
return CGM.CreateRuntimeFunction(FTy, "objc_read_weak");
@@ -279,7 +282,7 @@ public:
/// GcAssignWeakFn -- LLVM objc_assign_weak function.
llvm::Constant *getGcAssignWeakFn() {
// id objc_assign_weak (id, id *)
- const llvm::Type *args[] = { ObjectPtrTy, ObjectPtrTy->getPointerTo() };
+ llvm::Type *args[] = { ObjectPtrTy, ObjectPtrTy->getPointerTo() };
llvm::FunctionType *FTy =
llvm::FunctionType::get(ObjectPtrTy, args, false);
return CGM.CreateRuntimeFunction(FTy, "objc_assign_weak");
@@ -288,7 +291,7 @@ public:
/// GcAssignGlobalFn -- LLVM objc_assign_global function.
llvm::Constant *getGcAssignGlobalFn() {
// id objc_assign_global(id, id *)
- const llvm::Type *args[] = { ObjectPtrTy, ObjectPtrTy->getPointerTo() };
+ llvm::Type *args[] = { ObjectPtrTy, ObjectPtrTy->getPointerTo() };
llvm::FunctionType *FTy =
llvm::FunctionType::get(ObjectPtrTy, args, false);
return CGM.CreateRuntimeFunction(FTy, "objc_assign_global");
@@ -297,7 +300,7 @@ public:
/// GcAssignThreadLocalFn -- LLVM objc_assign_threadlocal function.
llvm::Constant *getGcAssignThreadLocalFn() {
// id objc_assign_threadlocal(id src, id * dest)
- const llvm::Type *args[] = { ObjectPtrTy, ObjectPtrTy->getPointerTo() };
+ llvm::Type *args[] = { ObjectPtrTy, ObjectPtrTy->getPointerTo() };
llvm::FunctionType *FTy =
llvm::FunctionType::get(ObjectPtrTy, args, false);
return CGM.CreateRuntimeFunction(FTy, "objc_assign_threadlocal");
@@ -306,8 +309,8 @@ public:
/// GcAssignIvarFn -- LLVM objc_assign_ivar function.
llvm::Constant *getGcAssignIvarFn() {
// id objc_assign_ivar(id, id *, ptrdiff_t)
- const llvm::Type *args[] = { ObjectPtrTy, ObjectPtrTy->getPointerTo(),
- CGM.PtrDiffTy };
+ llvm::Type *args[] = { ObjectPtrTy, ObjectPtrTy->getPointerTo(),
+ CGM.PtrDiffTy };
llvm::FunctionType *FTy =
llvm::FunctionType::get(ObjectPtrTy, args, false);
return CGM.CreateRuntimeFunction(FTy, "objc_assign_ivar");
@@ -316,7 +319,7 @@ public:
/// GcMemmoveCollectableFn -- LLVM objc_memmove_collectable function.
llvm::Constant *GcMemmoveCollectableFn() {
// void *objc_memmove_collectable(void *dst, const void *src, size_t size)
- const llvm::Type *args[] = { Int8PtrTy, Int8PtrTy, LongTy };
+ llvm::Type *args[] = { Int8PtrTy, Int8PtrTy, LongTy };
llvm::FunctionType *FTy = llvm::FunctionType::get(Int8PtrTy, args, false);
return CGM.CreateRuntimeFunction(FTy, "objc_memmove_collectable");
}
@@ -324,7 +327,7 @@ public:
/// GcAssignStrongCastFn -- LLVM objc_assign_strongCast function.
llvm::Constant *getGcAssignStrongCastFn() {
// id objc_assign_strongCast(id, id *)
- const llvm::Type *args[] = { ObjectPtrTy, ObjectPtrTy->getPointerTo() };
+ llvm::Type *args[] = { ObjectPtrTy, ObjectPtrTy->getPointerTo() };
llvm::FunctionType *FTy =
llvm::FunctionType::get(ObjectPtrTy, args, false);
return CGM.CreateRuntimeFunction(FTy, "objc_assign_strongCast");
@@ -333,7 +336,7 @@ public:
/// ExceptionThrowFn - LLVM objc_exception_throw function.
llvm::Constant *getExceptionThrowFn() {
// void objc_exception_throw(id)
- const llvm::Type *args[] = { ObjectPtrTy };
+ llvm::Type *args[] = { ObjectPtrTy };
llvm::FunctionType *FTy =
llvm::FunctionType::get(CGM.VoidTy, args, false);
return CGM.CreateRuntimeFunction(FTy, "objc_exception_throw");
@@ -349,7 +352,7 @@ public:
/// SyncEnterFn - LLVM object_sync_enter function.
llvm::Constant *getSyncEnterFn() {
// void objc_sync_enter (id)
- const llvm::Type *args[] = { ObjectPtrTy };
+ llvm::Type *args[] = { ObjectPtrTy };
llvm::FunctionType *FTy =
llvm::FunctionType::get(CGM.VoidTy, args, false);
return CGM.CreateRuntimeFunction(FTy, "objc_sync_enter");
@@ -358,7 +361,7 @@ public:
/// SyncExitFn - LLVM object_sync_exit function.
llvm::Constant *getSyncExitFn() {
// void objc_sync_exit (id)
- const llvm::Type *args[] = { ObjectPtrTy };
+ llvm::Type *args[] = { ObjectPtrTy };
llvm::FunctionType *FTy =
llvm::FunctionType::get(CGM.VoidTy, args, false);
return CGM.CreateRuntimeFunction(FTy, "objc_sync_exit");
@@ -397,62 +400,62 @@ public:
class ObjCTypesHelper : public ObjCCommonTypesHelper {
public:
/// SymtabTy - LLVM type for struct objc_symtab.
- const llvm::StructType *SymtabTy;
+ llvm::StructType *SymtabTy;
/// SymtabPtrTy - LLVM type for struct objc_symtab *.
- const llvm::Type *SymtabPtrTy;
+ llvm::Type *SymtabPtrTy;
/// ModuleTy - LLVM type for struct objc_module.
- const llvm::StructType *ModuleTy;
+ llvm::StructType *ModuleTy;
/// ProtocolTy - LLVM type for struct objc_protocol.
- const llvm::StructType *ProtocolTy;
+ llvm::StructType *ProtocolTy;
/// ProtocolPtrTy - LLVM type for struct objc_protocol *.
- const llvm::Type *ProtocolPtrTy;
+ llvm::Type *ProtocolPtrTy;
/// ProtocolExtensionTy - LLVM type for struct
/// objc_protocol_extension.
- const llvm::StructType *ProtocolExtensionTy;
+ llvm::StructType *ProtocolExtensionTy;
/// ProtocolExtensionTy - LLVM type for struct
/// objc_protocol_extension *.
- const llvm::Type *ProtocolExtensionPtrTy;
+ llvm::Type *ProtocolExtensionPtrTy;
/// MethodDescriptionTy - LLVM type for struct
/// objc_method_description.
- const llvm::StructType *MethodDescriptionTy;
+ llvm::StructType *MethodDescriptionTy;
/// MethodDescriptionListTy - LLVM type for struct
/// objc_method_description_list.
- const llvm::StructType *MethodDescriptionListTy;
+ llvm::StructType *MethodDescriptionListTy;
/// MethodDescriptionListPtrTy - LLVM type for struct
/// objc_method_description_list *.
- const llvm::Type *MethodDescriptionListPtrTy;
+ llvm::Type *MethodDescriptionListPtrTy;
/// ProtocolListTy - LLVM type for struct objc_property_list.
- const llvm::Type *ProtocolListTy;
+ llvm::StructType *ProtocolListTy;
/// ProtocolListPtrTy - LLVM type for struct objc_property_list*.
- const llvm::Type *ProtocolListPtrTy;
+ llvm::Type *ProtocolListPtrTy;
/// CategoryTy - LLVM type for struct objc_category.
- const llvm::StructType *CategoryTy;
+ llvm::StructType *CategoryTy;
/// ClassTy - LLVM type for struct objc_class.
- const llvm::StructType *ClassTy;
+ llvm::StructType *ClassTy;
/// ClassPtrTy - LLVM type for struct objc_class *.
- const llvm::Type *ClassPtrTy;
+ llvm::Type *ClassPtrTy;
/// ClassExtensionTy - LLVM type for struct objc_class_ext.
- const llvm::StructType *ClassExtensionTy;
+ llvm::StructType *ClassExtensionTy;
/// ClassExtensionPtrTy - LLVM type for struct objc_class_ext *.
- const llvm::Type *ClassExtensionPtrTy;
+ llvm::Type *ClassExtensionPtrTy;
// IvarTy - LLVM type for struct objc_ivar.
- const llvm::StructType *IvarTy;
+ llvm::StructType *IvarTy;
/// IvarListTy - LLVM type for struct objc_ivar_list.
- const llvm::Type *IvarListTy;
+ llvm::Type *IvarListTy;
/// IvarListPtrTy - LLVM type for struct objc_ivar_list *.
- const llvm::Type *IvarListPtrTy;
+ llvm::Type *IvarListPtrTy;
/// MethodListTy - LLVM type for struct objc_method_list.
- const llvm::Type *MethodListTy;
+ llvm::Type *MethodListTy;
/// MethodListPtrTy - LLVM type for struct objc_method_list *.
- const llvm::Type *MethodListPtrTy;
+ llvm::Type *MethodListPtrTy;
/// ExceptionDataTy - LLVM type for struct _objc_exception_data.
- const llvm::Type *ExceptionDataTy;
-
+ llvm::Type *ExceptionDataTy;
+
/// ExceptionTryEnterFn - LLVM objc_exception_try_enter function.
llvm::Constant *getExceptionTryEnterFn() {
- const llvm::Type *params[] = { ExceptionDataTy->getPointerTo() };
+ llvm::Type *params[] = { ExceptionDataTy->getPointerTo() };
return CGM.CreateRuntimeFunction(
llvm::FunctionType::get(CGM.VoidTy, params, false),
"objc_exception_try_enter");
@@ -460,7 +463,7 @@ public:
/// ExceptionTryExitFn - LLVM objc_exception_try_exit function.
llvm::Constant *getExceptionTryExitFn() {
- const llvm::Type *params[] = { ExceptionDataTy->getPointerTo() };
+ llvm::Type *params[] = { ExceptionDataTy->getPointerTo() };
return CGM.CreateRuntimeFunction(
llvm::FunctionType::get(CGM.VoidTy, params, false),
"objc_exception_try_exit");
@@ -468,7 +471,7 @@ public:
/// ExceptionExtractFn - LLVM objc_exception_extract function.
llvm::Constant *getExceptionExtractFn() {
- const llvm::Type *params[] = { ExceptionDataTy->getPointerTo() };
+ llvm::Type *params[] = { ExceptionDataTy->getPointerTo() };
return CGM.CreateRuntimeFunction(llvm::FunctionType::get(ObjectPtrTy,
params, false),
"objc_exception_extract");
@@ -476,7 +479,7 @@ public:
/// ExceptionMatchFn - LLVM objc_exception_match function.
llvm::Constant *getExceptionMatchFn() {
- const llvm::Type *params[] = { ClassPtrTy, ObjectPtrTy };
+ llvm::Type *params[] = { ClassPtrTy, ObjectPtrTy };
return CGM.CreateRuntimeFunction(
llvm::FunctionType::get(CGM.Int32Ty, params, false),
"objc_exception_match");
@@ -486,7 +489,7 @@ public:
/// SetJmpFn - LLVM _setjmp function.
llvm::Constant *getSetJmpFn() {
// This is specifically the prototype for x86.
- const llvm::Type *params[] = { CGM.Int32Ty->getPointerTo() };
+ llvm::Type *params[] = { CGM.Int32Ty->getPointerTo() };
return CGM.CreateRuntimeFunction(llvm::FunctionType::get(CGM.Int32Ty,
params, false),
"_setjmp");
@@ -503,46 +506,46 @@ class ObjCNonFragileABITypesHelper : public ObjCCommonTypesHelper {
public:
// MethodListnfABITy - LLVM for struct _method_list_t
- const llvm::StructType *MethodListnfABITy;
+ llvm::StructType *MethodListnfABITy;
// MethodListnfABIPtrTy - LLVM for struct _method_list_t*
- const llvm::Type *MethodListnfABIPtrTy;
+ llvm::Type *MethodListnfABIPtrTy;
// ProtocolnfABITy = LLVM for struct _protocol_t
- const llvm::StructType *ProtocolnfABITy;
+ llvm::StructType *ProtocolnfABITy;
// ProtocolnfABIPtrTy = LLVM for struct _protocol_t*
- const llvm::Type *ProtocolnfABIPtrTy;
+ llvm::Type *ProtocolnfABIPtrTy;
// ProtocolListnfABITy - LLVM for struct _objc_protocol_list
- const llvm::StructType *ProtocolListnfABITy;
+ llvm::StructType *ProtocolListnfABITy;
// ProtocolListnfABIPtrTy - LLVM for struct _objc_protocol_list*
- const llvm::Type *ProtocolListnfABIPtrTy;
+ llvm::Type *ProtocolListnfABIPtrTy;
// ClassnfABITy - LLVM for struct _class_t
- const llvm::StructType *ClassnfABITy;
+ llvm::StructType *ClassnfABITy;
// ClassnfABIPtrTy - LLVM for struct _class_t*
- const llvm::Type *ClassnfABIPtrTy;
+ llvm::Type *ClassnfABIPtrTy;
// IvarnfABITy - LLVM for struct _ivar_t
- const llvm::StructType *IvarnfABITy;
+ llvm::StructType *IvarnfABITy;
// IvarListnfABITy - LLVM for struct _ivar_list_t
- const llvm::StructType *IvarListnfABITy;
+ llvm::StructType *IvarListnfABITy;
// IvarListnfABIPtrTy = LLVM for struct _ivar_list_t*
- const llvm::Type *IvarListnfABIPtrTy;
+ llvm::Type *IvarListnfABIPtrTy;
// ClassRonfABITy - LLVM for struct _class_ro_t
- const llvm::StructType *ClassRonfABITy;
+ llvm::StructType *ClassRonfABITy;
// ImpnfABITy - LLVM for id (*)(id, SEL, ...)
- const llvm::Type *ImpnfABITy;
+ llvm::Type *ImpnfABITy;
// CategorynfABITy - LLVM for struct _category_t
- const llvm::StructType *CategorynfABITy;
+ llvm::StructType *CategorynfABITy;
// New types for nonfragile abi messaging.
@@ -551,31 +554,31 @@ public:
// IMP messenger;
// SEL name;
// };
- const llvm::StructType *MessageRefTy;
+ llvm::StructType *MessageRefTy;
// MessageRefCTy - clang type for struct _message_ref_t
QualType MessageRefCTy;
// MessageRefPtrTy - LLVM for struct _message_ref_t*
- const llvm::Type *MessageRefPtrTy;
+ llvm::Type *MessageRefPtrTy;
// MessageRefCPtrTy - clang type for struct _message_ref_t*
QualType MessageRefCPtrTy;
// MessengerTy - Type of the messenger (shown as IMP above)
- const llvm::FunctionType *MessengerTy;
+ llvm::FunctionType *MessengerTy;
// SuperMessageRefTy - LLVM for:
// struct _super_message_ref_t {
// SUPER_IMP messenger;
// SEL name;
// };
- const llvm::StructType *SuperMessageRefTy;
+ llvm::StructType *SuperMessageRefTy;
// SuperMessageRefPtrTy - LLVM for struct _super_message_ref_t*
- const llvm::Type *SuperMessageRefPtrTy;
+ llvm::Type *SuperMessageRefPtrTy;
llvm::Constant *getMessageSendFixupFn() {
// id objc_msgSend_fixup(id, struct message_ref_t*, ...)
- const llvm::Type *params[] = { ObjectPtrTy, MessageRefPtrTy };
+ llvm::Type *params[] = { ObjectPtrTy, MessageRefPtrTy };
return CGM.CreateRuntimeFunction(llvm::FunctionType::get(ObjectPtrTy,
params, true),
"objc_msgSend_fixup");
@@ -583,7 +586,7 @@ public:
llvm::Constant *getMessageSendFpretFixupFn() {
// id objc_msgSend_fpret_fixup(id, struct message_ref_t*, ...)
- const llvm::Type *params[] = { ObjectPtrTy, MessageRefPtrTy };
+ llvm::Type *params[] = { ObjectPtrTy, MessageRefPtrTy };
return CGM.CreateRuntimeFunction(llvm::FunctionType::get(ObjectPtrTy,
params, true),
"objc_msgSend_fpret_fixup");
@@ -591,7 +594,7 @@ public:
llvm::Constant *getMessageSendStretFixupFn() {
// id objc_msgSend_stret_fixup(id, struct message_ref_t*, ...)
- const llvm::Type *params[] = { ObjectPtrTy, MessageRefPtrTy };
+ llvm::Type *params[] = { ObjectPtrTy, MessageRefPtrTy };
return CGM.CreateRuntimeFunction(llvm::FunctionType::get(ObjectPtrTy,
params, true),
"objc_msgSend_stret_fixup");
@@ -600,7 +603,7 @@ public:
llvm::Constant *getMessageSendSuper2FixupFn() {
// id objc_msgSendSuper2_fixup (struct objc_super *,
// struct _super_message_ref_t*, ...)
- const llvm::Type *params[] = { SuperPtrTy, SuperMessageRefPtrTy };
+ llvm::Type *params[] = { SuperPtrTy, SuperMessageRefPtrTy };
return CGM.CreateRuntimeFunction(llvm::FunctionType::get(ObjectPtrTy,
params, true),
"objc_msgSendSuper2_fixup");
@@ -609,7 +612,7 @@ public:
llvm::Constant *getMessageSendSuper2StretFixupFn() {
// id objc_msgSendSuper2_stret_fixup(struct objc_super *,
// struct _super_message_ref_t*, ...)
- const llvm::Type *params[] = { SuperPtrTy, SuperMessageRefPtrTy };
+ llvm::Type *params[] = { SuperPtrTy, SuperMessageRefPtrTy };
return CGM.CreateRuntimeFunction(llvm::FunctionType::get(ObjectPtrTy,
params, true),
"objc_msgSendSuper2_stret_fixup");
@@ -622,15 +625,15 @@ public:
}
llvm::Constant *getObjCBeginCatchFn() {
- const llvm::Type *params[] = { Int8PtrTy };
+ llvm::Type *params[] = { Int8PtrTy };
return CGM.CreateRuntimeFunction(llvm::FunctionType::get(Int8PtrTy,
params, false),
"objc_begin_catch");
}
- const llvm::StructType *EHTypeTy;
- const llvm::Type *EHTypePtrTy;
-
+ llvm::StructType *EHTypeTy;
+ llvm::Type *EHTypePtrTy;
+
ObjCNonFragileABITypesHelper(CodeGen::CodeGenModule &cgm);
~ObjCNonFragileABITypesHelper(){}
};
@@ -887,6 +890,11 @@ private:
llvm::Value *EmitClassRef(CGBuilderTy &Builder,
const ObjCInterfaceDecl *ID);
+ llvm::Value *EmitClassRefFromId(CGBuilderTy &Builder,
+ IdentifierInfo *II);
+
+ llvm::Value *EmitNSAutoreleasePoolClassRef(CGBuilderTy &Builder);
+
/// EmitSuperClassRef - Emits reference to class's main metadata class.
llvm::Value *EmitSuperClassRef(const ObjCInterfaceDecl *ID);
@@ -1158,6 +1166,11 @@ private:
/// for the given class reference.
llvm::Value *EmitClassRef(CGBuilderTy &Builder,
const ObjCInterfaceDecl *ID);
+
+ llvm::Value *EmitClassRefFromId(CGBuilderTy &Builder,
+ IdentifierInfo *II);
+
+ llvm::Value *EmitNSAutoreleasePoolClassRef(CGBuilderTy &Builder);
/// EmitSuperClassRef - Return a Value*, of type ObjCTypes.ClassPtrTy,
/// for the given super class reference.
@@ -1402,6 +1415,19 @@ llvm::Value *CGObjCMac::GetSelector(CGBuilderTy &Builder, const ObjCMethodDecl
}
llvm::Constant *CGObjCMac::GetEHType(QualType T) {
+ if (T->isObjCIdType() ||
+ T->isObjCQualifiedIdType()) {
+ return CGM.GetAddrOfRTTIDescriptor(
+ CGM.getContext().ObjCIdRedefinitionType, /*ForEH=*/true);
+ }
+ if (T->isObjCClassType() ||
+ T->isObjCQualifiedClassType()) {
+ return CGM.GetAddrOfRTTIDescriptor(
+ CGM.getContext().ObjCClassRedefinitionType, /*ForEH=*/true);
+ }
+ if (T->isObjCObjectPointerType())
+ return CGM.GetAddrOfRTTIDescriptor(T, /*ForEH=*/true);
+
llvm_unreachable("asking for catch type for ObjC type in fragile runtime");
return 0;
}
@@ -1526,7 +1552,7 @@ CGObjCCommonMac::EmitMessageSend(CodeGen::CodeGenFunction &CGF,
Arg0 = CGF.Builder.CreateBitCast(Arg0, ObjCTypes.ObjectPtrTy, "tmp");
ActualArgs.add(RValue::get(Arg0), Arg0Ty);
ActualArgs.add(RValue::get(Sel), CGF.getContext().getObjCSelType());
- ActualArgs.insert(ActualArgs.end(), CallArgs.begin(), CallArgs.end());
+ ActualArgs.addFrom(CallArgs);
CodeGenTypes &Types = CGM.getTypes();
const CGFunctionInfo &FnInfo = Types.getFunctionInfo(ResultType, ActualArgs,
@@ -1562,7 +1588,7 @@ static Qualifiers::GC GetGCAttrTypeForType(ASTContext &Ctx, QualType FQT) {
if (FQT.isObjCGCStrong())
return Qualifiers::Strong;
- if (FQT.isObjCGCWeak())
+ if (FQT.isObjCGCWeak() || FQT.getObjCLifetime() == Qualifiers::OCL_Weak)
return Qualifiers::Weak;
if (FQT->isObjCObjectPointerType() || FQT->isBlockPointerType())
@@ -1579,7 +1605,8 @@ llvm::Constant *CGObjCCommonMac::BuildGCBlockLayout(CodeGenModule &CGM,
llvm::Constant *nullPtr =
llvm::Constant::getNullValue(llvm::Type::getInt8PtrTy(VMContext));
- if (CGM.getLangOptions().getGCMode() == LangOptions::NonGC)
+ if (CGM.getLangOptions().getGCMode() == LangOptions::NonGC &&
+ !CGM.getLangOptions().ObjCAutoRefCount)
return nullPtr;
bool hasUnion = false;
@@ -1866,7 +1893,7 @@ CGObjCMac::EmitProtocolList(llvm::Twine Name,
// This list is null terminated.
ProtocolRefs.push_back(llvm::Constant::getNullValue(ObjCTypes.ProtocolPtrTy));
- std::vector<llvm::Constant*> Values(3);
+ llvm::Constant *Values[3];
// This field is only used by the runtime.
Values[0] = llvm::Constant::getNullValue(ObjCTypes.ProtocolListPtrTy);
Values[1] = llvm::ConstantInt::get(ObjCTypes.LongTy,
@@ -1876,7 +1903,7 @@ CGObjCMac::EmitProtocolList(llvm::Twine Name,
ProtocolRefs.size()),
ProtocolRefs);
- llvm::Constant *Init = llvm::ConstantStruct::get(VMContext, Values, false);
+ llvm::Constant *Init = llvm::ConstantStruct::getAnon(Values);
llvm::GlobalVariable *GV =
CreateMetadataVar(Name, Init, "__OBJC,__cat_cls_meth,regular,no_dead_strip",
4, false);
@@ -1950,13 +1977,13 @@ llvm::Constant *CGObjCCommonMac::EmitPropertyList(llvm::Twine Name,
unsigned PropertySize =
CGM.getTargetData().getTypeAllocSize(ObjCTypes.PropertyTy);
- std::vector<llvm::Constant*> Values(3);
+ llvm::Constant *Values[3];
Values[0] = llvm::ConstantInt::get(ObjCTypes.IntTy, PropertySize);
Values[1] = llvm::ConstantInt::get(ObjCTypes.IntTy, Properties.size());
llvm::ArrayType *AT = llvm::ArrayType::get(ObjCTypes.PropertyTy,
Properties.size());
Values[2] = llvm::ConstantArray::get(AT, Properties);
- llvm::Constant *Init = llvm::ConstantStruct::get(VMContext, Values, false);
+ llvm::Constant *Init = llvm::ConstantStruct::getAnon(Values);
llvm::GlobalVariable *GV =
CreateMetadataVar(Name, Init,
@@ -1994,12 +2021,12 @@ llvm::Constant *CGObjCMac::EmitMethodDescList(llvm::Twine Name,
if (Methods.empty())
return llvm::Constant::getNullValue(ObjCTypes.MethodDescriptionListPtrTy);
- std::vector<llvm::Constant*> Values(2);
+ llvm::Constant *Values[2];
Values[0] = llvm::ConstantInt::get(ObjCTypes.IntTy, Methods.size());
llvm::ArrayType *AT = llvm::ArrayType::get(ObjCTypes.MethodDescriptionTy,
Methods.size());
Values[1] = llvm::ConstantArray::get(AT, Methods);
- llvm::Constant *Init = llvm::ConstantStruct::get(VMContext, Values, false);
+ llvm::Constant *Init = llvm::ConstantStruct::getAnon(Values);
llvm::GlobalVariable *GV = CreateMetadataVar(Name, Init, Section, 4, true);
return llvm::ConstantExpr::getBitCast(GV,
@@ -2044,7 +2071,7 @@ void CGObjCMac::GenerateCategory(const ObjCCategoryImplDecl *OCD) {
ClassMethods.push_back(GetMethodConstant(*i));
}
- std::vector<llvm::Constant*> Values(7);
+ llvm::Constant *Values[7];
Values[0] = GetClassName(OCD->getIdentifier());
Values[1] = GetClassName(Interface->getIdentifier());
LazySymbols.insert(Interface->getIdentifier());
@@ -2129,7 +2156,7 @@ void CGObjCMac::GenerateClass(const ObjCImplementationDecl *ID) {
Interface->all_referenced_protocol_begin(),
Interface->all_referenced_protocol_end());
unsigned Flags = eClassFlags_Factory;
- if (ID->getNumIvarInitializers())
+ if (ID->hasCXXStructors())
Flags |= eClassFlags_HasCXXStructors;
unsigned Size =
CGM.getContext().getASTObjCImplementationLayout(ID).getSize().getQuantity();
@@ -2166,7 +2193,7 @@ void CGObjCMac::GenerateClass(const ObjCImplementationDecl *ID) {
}
}
- std::vector<llvm::Constant*> Values(12);
+ llvm::Constant *Values[12];
Values[ 0] = EmitMetaClass(ID, Protocols, ClassMethods);
if (ObjCInterfaceDecl *Super = Interface->getSuperClass()) {
// Record a reference to the super class.
@@ -2225,7 +2252,7 @@ llvm::Constant *CGObjCMac::EmitMetaClass(const ObjCImplementationDecl *ID,
if (ID->getClassInterface()->getVisibility() == HiddenVisibility)
Flags |= eClassFlags_Hidden;
- std::vector<llvm::Constant*> Values(12);
+ llvm::Constant *Values[12];
// The isa for the metaclass is the root of the hierarchy.
const ObjCInterfaceDecl *Root = ID->getClassInterface();
while (const ObjCInterfaceDecl *Super = Root->getSuperClass())
@@ -2339,7 +2366,7 @@ CGObjCMac::EmitClassExtension(const ObjCImplementationDecl *ID) {
uint64_t Size =
CGM.getTargetData().getTypeAllocSize(ObjCTypes.ClassExtensionTy);
- std::vector<llvm::Constant*> Values(3);
+ llvm::Constant *Values[3];
Values[0] = llvm::ConstantInt::get(ObjCTypes.IntTy, Size);
Values[1] = BuildIvarLayout(ID, false);
Values[2] = EmitPropertyList("\01l_OBJC_$_PROP_LIST_" + ID->getName(),
@@ -2383,11 +2410,8 @@ llvm::Constant *CGObjCMac::EmitIvarList(const ObjCImplementationDecl *ID,
ObjCInterfaceDecl *OID =
const_cast<ObjCInterfaceDecl*>(ID->getClassInterface());
- llvm::SmallVector<ObjCIvarDecl*, 16> OIvars;
- CGM.getContext().ShallowCollectObjCIvars(OID, OIvars);
-
- for (unsigned i = 0, e = OIvars.size(); i != e; ++i) {
- ObjCIvarDecl *IVD = OIvars[i];
+ for (ObjCIvarDecl *IVD = OID->all_declared_ivar_begin();
+ IVD; IVD = IVD->getNextIvar()) {
// Ignore unnamed bit-fields.
if (!IVD->getDeclName())
continue;
@@ -2402,12 +2426,12 @@ llvm::Constant *CGObjCMac::EmitIvarList(const ObjCImplementationDecl *ID,
if (Ivars.empty())
return llvm::Constant::getNullValue(ObjCTypes.IvarListPtrTy);
- std::vector<llvm::Constant*> Values(2);
+ llvm::Constant *Values[2];
Values[0] = llvm::ConstantInt::get(ObjCTypes.IntTy, Ivars.size());
llvm::ArrayType *AT = llvm::ArrayType::get(ObjCTypes.IvarTy,
Ivars.size());
Values[1] = llvm::ConstantArray::get(AT, Ivars);
- llvm::Constant *Init = llvm::ConstantStruct::get(VMContext, Values, false);
+ llvm::Constant *Init = llvm::ConstantStruct::getAnon(Values);
llvm::GlobalVariable *GV;
if (ForClass)
@@ -2459,17 +2483,16 @@ llvm::Constant *CGObjCMac::EmitMethodList(llvm::Twine Name,
if (Methods.empty())
return llvm::Constant::getNullValue(ObjCTypes.MethodListPtrTy);
- std::vector<llvm::Constant*> Values(3);
+ llvm::Constant *Values[3];
Values[0] = llvm::Constant::getNullValue(ObjCTypes.Int8PtrTy);
Values[1] = llvm::ConstantInt::get(ObjCTypes.IntTy, Methods.size());
llvm::ArrayType *AT = llvm::ArrayType::get(ObjCTypes.MethodTy,
Methods.size());
Values[2] = llvm::ConstantArray::get(AT, Methods);
- llvm::Constant *Init = llvm::ConstantStruct::get(VMContext, Values, false);
+ llvm::Constant *Init = llvm::ConstantStruct::getAnon(Values);
llvm::GlobalVariable *GV = CreateMetadataVar(Name, Init, Section, 4, true);
- return llvm::ConstantExpr::getBitCast(GV,
- ObjCTypes.MethodListPtrTy);
+ return llvm::ConstantExpr::getBitCast(GV, ObjCTypes.MethodListPtrTy);
}
llvm::Function *CGObjCCommonMac::GenerateMethod(const ObjCMethodDecl *OMD,
@@ -2558,7 +2581,7 @@ namespace {
: S(*S), SyncArgSlot(SyncArgSlot), CallTryExitVar(CallTryExitVar),
ExceptionData(ExceptionData), ObjCTypes(*ObjCTypes) {}
- void Emit(CodeGenFunction &CGF, bool IsForEH) {
+ void Emit(CodeGenFunction &CGF, Flags flags) {
// Check whether we need to call objc_exception_try_exit.
// In optimized code, this branch will always be folded.
llvm::BasicBlock *FinallyCallExit =
@@ -2674,14 +2697,12 @@ FragileHazards::FragileHazards(CodeGenFunction &CGF) : CGF(CGF) {
void FragileHazards::emitWriteHazard() {
if (Locals.empty()) return;
- CGF.Builder.CreateCall(WriteHazard, Locals.begin(), Locals.end())
- ->setDoesNotThrow();
+ CGF.Builder.CreateCall(WriteHazard, Locals)->setDoesNotThrow();
}
void FragileHazards::emitReadHazard(CGBuilderTy &Builder) {
assert(!Locals.empty());
- Builder.CreateCall(ReadHazard, Locals.begin(), Locals.end())
- ->setDoesNotThrow();
+ Builder.CreateCall(ReadHazard, Locals)->setDoesNotThrow();
}
/// Emit read hazards in all the protected blocks, i.e. all the blocks
@@ -2745,7 +2766,7 @@ void FragileHazards::collectLocals() {
}
llvm::FunctionType *FragileHazards::GetAsmFnType() {
- llvm::SmallVector<const llvm::Type *, 16> tys(Locals.size());
+ llvm::SmallVector<llvm::Type *, 16> tys(Locals.size());
for (unsigned i = 0, e = Locals.size(); i != e; ++i)
tys[i] = Locals[i]->getType();
return llvm::FunctionType::get(CGF.VoidTy, tys, false);
@@ -3389,7 +3410,7 @@ void CGObjCCommonMac::EmitImageInfo() {
Section = "__DATA, __objc_imageinfo, regular, no_dead_strip";
llvm::GlobalVariable *GV =
CreateMetadataVar("\01L_OBJC_IMAGE_INFO",
- llvm::ConstantArray::get(AT, values, 2),
+ llvm::ConstantArray::get(AT, values),
Section,
0,
true);
@@ -3430,7 +3451,7 @@ llvm::Constant *CGObjCMac::EmitModuleSymbols() {
if (!NumClasses && !NumCategories)
return llvm::Constant::getNullValue(ObjCTypes.SymtabPtrTy);
- std::vector<llvm::Constant*> Values(5);
+ llvm::Constant *Values[5];
Values[0] = llvm::ConstantInt::get(ObjCTypes.LongTy, 0);
Values[1] = llvm::Constant::getNullValue(ObjCTypes.SelectorPtrTy);
Values[2] = llvm::ConstantInt::get(ObjCTypes.ShortTy, NumClasses);
@@ -3452,7 +3473,7 @@ llvm::Constant *CGObjCMac::EmitModuleSymbols() {
NumClasses + NumCategories),
Symbols);
- llvm::Constant *Init = llvm::ConstantStruct::get(VMContext, Values, false);
+ llvm::Constant *Init = llvm::ConstantStruct::getAnon(Values);
llvm::GlobalVariable *GV =
CreateMetadataVar("\01L_OBJC_SYMBOLS", Init,
@@ -3461,25 +3482,35 @@ llvm::Constant *CGObjCMac::EmitModuleSymbols() {
return llvm::ConstantExpr::getBitCast(GV, ObjCTypes.SymtabPtrTy);
}
-llvm::Value *CGObjCMac::EmitClassRef(CGBuilderTy &Builder,
- const ObjCInterfaceDecl *ID) {
- LazySymbols.insert(ID->getIdentifier());
-
- llvm::GlobalVariable *&Entry = ClassReferences[ID->getIdentifier()];
-
+llvm::Value *CGObjCMac::EmitClassRefFromId(CGBuilderTy &Builder,
+ IdentifierInfo *II) {
+ LazySymbols.insert(II);
+
+ llvm::GlobalVariable *&Entry = ClassReferences[II];
+
if (!Entry) {
llvm::Constant *Casted =
- llvm::ConstantExpr::getBitCast(GetClassName(ID->getIdentifier()),
- ObjCTypes.ClassPtrTy);
+ llvm::ConstantExpr::getBitCast(GetClassName(II),
+ ObjCTypes.ClassPtrTy);
Entry =
- CreateMetadataVar("\01L_OBJC_CLASS_REFERENCES_", Casted,
- "__OBJC,__cls_refs,literal_pointers,no_dead_strip",
- 4, true);
+ CreateMetadataVar("\01L_OBJC_CLASS_REFERENCES_", Casted,
+ "__OBJC,__cls_refs,literal_pointers,no_dead_strip",
+ 4, true);
}
-
+
return Builder.CreateLoad(Entry, "tmp");
}
+llvm::Value *CGObjCMac::EmitClassRef(CGBuilderTy &Builder,
+ const ObjCInterfaceDecl *ID) {
+ return EmitClassRefFromId(Builder, ID->getIdentifier());
+}
+
+llvm::Value *CGObjCMac::EmitNSAutoreleasePoolClassRef(CGBuilderTy &Builder) {
+ IdentifierInfo *II = &CGM.getContext().Idents.get("NSAutoreleasePool");
+ return EmitClassRefFromId(Builder, II);
+}
+
llvm::Value *CGObjCMac::EmitSelector(CGBuilderTy &Builder, Selector Sel,
bool lvalue) {
llvm::GlobalVariable *&Entry = SelectorReferences[Sel];
@@ -3567,12 +3598,18 @@ void CGObjCCommonMac::BuildAggrIvarLayout(const ObjCImplementationDecl *OI,
uint64_t MaxFieldOffset = 0;
uint64_t MaxSkippedFieldOffset = 0;
uint64_t LastBitfieldOrUnnamedOffset = 0;
+ uint64_t FirstFieldDelta = 0;
if (RecFields.empty())
return;
unsigned WordSizeInBits = CGM.getContext().Target.getPointerWidth(0);
unsigned ByteSizeInBits = CGM.getContext().Target.getCharWidth();
-
+ if (!RD && CGM.getLangOptions().ObjCAutoRefCount) {
+ FieldDecl *FirstField = RecFields[0];
+ FirstFieldDelta =
+ ComputeIvarBaseOffset(CGM, OI, cast<ObjCIvarDecl>(FirstField));
+ }
+
for (unsigned i = 0, e = RecFields.size(); i != e; ++i) {
FieldDecl *Field = RecFields[i];
uint64_t FieldOffset;
@@ -3580,9 +3617,10 @@ void CGObjCCommonMac::BuildAggrIvarLayout(const ObjCImplementationDecl *OI,
// Note that 'i' here is actually the field index inside RD of Field,
// although this dependency is hidden.
const ASTRecordLayout &RL = CGM.getContext().getASTRecordLayout(RD);
- FieldOffset = RL.getFieldOffset(i) / ByteSizeInBits;
+ FieldOffset = (RL.getFieldOffset(i) / ByteSizeInBits) - FirstFieldDelta;
} else
- FieldOffset = ComputeIvarBaseOffset(CGM, OI, cast<ObjCIvarDecl>(Field));
+ FieldOffset =
+ ComputeIvarBaseOffset(CGM, OI, cast<ObjCIvarDecl>(Field)) - FirstFieldDelta;
// Skip over unnamed or bitfields
if (!Field->getIdentifier() || Field->isBitField()) {
@@ -3861,16 +3899,25 @@ llvm::Constant *CGObjCCommonMac::BuildIvarLayout(
bool hasUnion = false;
const llvm::Type *PtrTy = llvm::Type::getInt8PtrTy(VMContext);
- if (CGM.getLangOptions().getGCMode() == LangOptions::NonGC)
+ if (CGM.getLangOptions().getGCMode() == LangOptions::NonGC &&
+ !CGM.getLangOptions().ObjCAutoRefCount)
return llvm::Constant::getNullValue(PtrTy);
- llvm::SmallVector<ObjCIvarDecl*, 32> Ivars;
- const ObjCInterfaceDecl *OI = OMD->getClassInterface();
- CGM.getContext().DeepCollectObjCIvars(OI, true, Ivars);
-
+ ObjCInterfaceDecl *OI =
+ const_cast<ObjCInterfaceDecl*>(OMD->getClassInterface());
llvm::SmallVector<FieldDecl*, 32> RecFields;
- for (unsigned k = 0, e = Ivars.size(); k != e; ++k)
- RecFields.push_back(cast<FieldDecl>(Ivars[k]));
+ if (CGM.getLangOptions().ObjCAutoRefCount) {
+ for (ObjCIvarDecl *IVD = OI->all_declared_ivar_begin();
+ IVD; IVD = IVD->getNextIvar())
+ RecFields.push_back(cast<FieldDecl>(IVD));
+ }
+ else {
+ llvm::SmallVector<ObjCIvarDecl*, 32> Ivars;
+ CGM.getContext().DeepCollectObjCIvars(OI, true, Ivars);
+
+ for (unsigned k = 0, e = Ivars.size(); k != e; ++k)
+ RecFields.push_back(cast<FieldDecl>(Ivars[k]));
+ }
if (RecFields.empty())
return llvm::Constant::getNullValue(PtrTy);
@@ -4113,21 +4160,19 @@ ObjCCommonTypesHelper::ObjCCommonTypesHelper(CodeGen::CodeGenModule &cgm)
// char *name;
// char *attributes;
// }
- PropertyTy = llvm::StructType::get(VMContext, Int8PtrTy, Int8PtrTy, NULL);
- CGM.getModule().addTypeName("struct._prop_t",
- PropertyTy);
+ PropertyTy = llvm::StructType::createNamed("struct._prop_t",
+ Int8PtrTy, Int8PtrTy, NULL);
// struct _prop_list_t {
// uint32_t entsize; // sizeof(struct _prop_t)
// uint32_t count_of_properties;
// struct _prop_t prop_list[count_of_properties];
// }
- PropertyListTy = llvm::StructType::get(VMContext, IntTy,
- IntTy,
- llvm::ArrayType::get(PropertyTy, 0),
- NULL);
- CGM.getModule().addTypeName("struct._prop_list_t",
- PropertyListTy);
+ PropertyListTy =
+ llvm::StructType::createNamed("struct._prop_list_t",
+ IntTy, IntTy,
+ llvm::ArrayType::get(PropertyTy, 0),
+ NULL);
// struct _prop_list_t *
PropertyListPtrTy = llvm::PointerType::getUnqual(PropertyListTy);
@@ -4136,16 +4181,14 @@ ObjCCommonTypesHelper::ObjCCommonTypesHelper(CodeGen::CodeGenModule &cgm)
// char *method_type;
// char *_imp;
// }
- MethodTy = llvm::StructType::get(VMContext, SelectorPtrTy,
- Int8PtrTy,
- Int8PtrTy,
- NULL);
- CGM.getModule().addTypeName("struct._objc_method", MethodTy);
+ MethodTy = llvm::StructType::createNamed("struct._objc_method",
+ SelectorPtrTy, Int8PtrTy, Int8PtrTy,
+ NULL);
// struct _objc_cache *
- CacheTy = llvm::OpaqueType::get(VMContext);
- CGM.getModule().addTypeName("struct._objc_cache", CacheTy);
+ CacheTy = llvm::StructType::createNamed(VMContext, "struct._objc_cache");
CachePtrTy = llvm::PointerType::getUnqual(CacheTy);
+
}
ObjCTypesHelper::ObjCTypesHelper(CodeGen::CodeGenModule &cgm)
@@ -4155,22 +4198,18 @@ ObjCTypesHelper::ObjCTypesHelper(CodeGen::CodeGenModule &cgm)
// char *types;
// }
MethodDescriptionTy =
- llvm::StructType::get(VMContext, SelectorPtrTy,
- Int8PtrTy,
- NULL);
- CGM.getModule().addTypeName("struct._objc_method_description",
- MethodDescriptionTy);
+ llvm::StructType::createNamed("struct._objc_method_description",
+ SelectorPtrTy, Int8PtrTy, NULL);
// struct _objc_method_description_list {
// int count;
// struct _objc_method_description[1];
// }
MethodDescriptionListTy =
- llvm::StructType::get(VMContext, IntTy,
- llvm::ArrayType::get(MethodDescriptionTy, 0),
- NULL);
- CGM.getModule().addTypeName("struct._objc_method_description_list",
- MethodDescriptionListTy);
+ llvm::StructType::createNamed("struct._objc_method_description_list",
+ IntTy,
+ llvm::ArrayType::get(MethodDescriptionTy, 0),
+ NULL);
// struct _objc_method_description_list *
MethodDescriptionListPtrTy =
@@ -4185,29 +4224,27 @@ ObjCTypesHelper::ObjCTypesHelper(CodeGen::CodeGenModule &cgm)
// struct _objc_property_list *instance_properties;
// }
ProtocolExtensionTy =
- llvm::StructType::get(VMContext, IntTy,
- MethodDescriptionListPtrTy,
- MethodDescriptionListPtrTy,
- PropertyListPtrTy,
- NULL);
- CGM.getModule().addTypeName("struct._objc_protocol_extension",
- ProtocolExtensionTy);
+ llvm::StructType::createNamed("struct._objc_protocol_extension",
+ IntTy,
+ MethodDescriptionListPtrTy,
+ MethodDescriptionListPtrTy,
+ PropertyListPtrTy,
+ NULL);
// struct _objc_protocol_extension *
ProtocolExtensionPtrTy = llvm::PointerType::getUnqual(ProtocolExtensionTy);
// Handle recursive construction of Protocol and ProtocolList types
- llvm::PATypeHolder ProtocolTyHolder = llvm::OpaqueType::get(VMContext);
- llvm::PATypeHolder ProtocolListTyHolder = llvm::OpaqueType::get(VMContext);
+ ProtocolTy =
+ llvm::StructType::createNamed(VMContext, "struct._objc_protocol");
- const llvm::Type *T =
- llvm::StructType::get(VMContext,
- llvm::PointerType::getUnqual(ProtocolListTyHolder),
+ ProtocolListTy =
+ llvm::StructType::createNamed(VMContext, "struct._objc_protocol_list");
+ ProtocolListTy->setBody(llvm::PointerType::getUnqual(ProtocolListTy),
LongTy,
- llvm::ArrayType::get(ProtocolTyHolder, 0),
+ llvm::ArrayType::get(ProtocolTy, 0),
NULL);
- cast<llvm::OpaqueType>(ProtocolListTyHolder.get())->refineAbstractTypeTo(T);
// struct _objc_protocol {
// struct _objc_protocol_extension *isa;
@@ -4216,22 +4253,15 @@ ObjCTypesHelper::ObjCTypesHelper(CodeGen::CodeGenModule &cgm)
// struct _objc_method_description_list *instance_methods;
// struct _objc_method_description_list *class_methods;
// }
- T = llvm::StructType::get(VMContext, ProtocolExtensionPtrTy,
- Int8PtrTy,
- llvm::PointerType::getUnqual(ProtocolListTyHolder),
- MethodDescriptionListPtrTy,
- MethodDescriptionListPtrTy,
- NULL);
- cast<llvm::OpaqueType>(ProtocolTyHolder.get())->refineAbstractTypeTo(T);
-
- ProtocolListTy = cast<llvm::StructType>(ProtocolListTyHolder.get());
- CGM.getModule().addTypeName("struct._objc_protocol_list",
- ProtocolListTy);
+ ProtocolTy->setBody(ProtocolExtensionPtrTy, Int8PtrTy,
+ llvm::PointerType::getUnqual(ProtocolListTy),
+ MethodDescriptionListPtrTy,
+ MethodDescriptionListPtrTy,
+ NULL);
+
// struct _objc_protocol_list *
ProtocolListPtrTy = llvm::PointerType::getUnqual(ProtocolListTy);
- ProtocolTy = cast<llvm::StructType>(ProtocolTyHolder.get());
- CGM.getModule().addTypeName("struct._objc_protocol", ProtocolTy);
ProtocolPtrTy = llvm::PointerType::getUnqual(ProtocolTy);
// Class description structures
@@ -4241,32 +4271,26 @@ ObjCTypesHelper::ObjCTypesHelper(CodeGen::CodeGenModule &cgm)
// char *ivar_type;
// int ivar_offset;
// }
- IvarTy = llvm::StructType::get(VMContext, Int8PtrTy,
- Int8PtrTy,
- IntTy,
- NULL);
- CGM.getModule().addTypeName("struct._objc_ivar", IvarTy);
+ IvarTy = llvm::StructType::createNamed("struct._objc_ivar",
+ Int8PtrTy, Int8PtrTy, IntTy, NULL);
// struct _objc_ivar_list *
- IvarListTy = llvm::OpaqueType::get(VMContext);
- CGM.getModule().addTypeName("struct._objc_ivar_list", IvarListTy);
+ IvarListTy =
+ llvm::StructType::createNamed(VMContext, "struct._objc_ivar_list");
IvarListPtrTy = llvm::PointerType::getUnqual(IvarListTy);
// struct _objc_method_list *
- MethodListTy = llvm::OpaqueType::get(VMContext);
- CGM.getModule().addTypeName("struct._objc_method_list", MethodListTy);
+ MethodListTy =
+ llvm::StructType::createNamed(VMContext, "struct._objc_method_list");
MethodListPtrTy = llvm::PointerType::getUnqual(MethodListTy);
// struct _objc_class_extension *
ClassExtensionTy =
- llvm::StructType::get(VMContext, IntTy,
- Int8PtrTy,
- PropertyListPtrTy,
- NULL);
- CGM.getModule().addTypeName("struct._objc_class_extension", ClassExtensionTy);
+ llvm::StructType::createNamed("struct._objc_class_extension",
+ IntTy, Int8PtrTy, PropertyListPtrTy, NULL);
ClassExtensionPtrTy = llvm::PointerType::getUnqual(ClassExtensionTy);
- llvm::PATypeHolder ClassTyHolder = llvm::OpaqueType::get(VMContext);
+ ClassTy = llvm::StructType::createNamed(VMContext, "struct._objc_class");
// struct _objc_class {
// Class isa;
@@ -4282,24 +4306,20 @@ ObjCTypesHelper::ObjCTypesHelper(CodeGen::CodeGenModule &cgm)
// char *ivar_layout;
// struct _objc_class_ext *ext;
// };
- T = llvm::StructType::get(VMContext,
- llvm::PointerType::getUnqual(ClassTyHolder),
- llvm::PointerType::getUnqual(ClassTyHolder),
- Int8PtrTy,
- LongTy,
- LongTy,
- LongTy,
- IvarListPtrTy,
- MethodListPtrTy,
- CachePtrTy,
- ProtocolListPtrTy,
- Int8PtrTy,
- ClassExtensionPtrTy,
- NULL);
- cast<llvm::OpaqueType>(ClassTyHolder.get())->refineAbstractTypeTo(T);
-
- ClassTy = cast<llvm::StructType>(ClassTyHolder.get());
- CGM.getModule().addTypeName("struct._objc_class", ClassTy);
+ ClassTy->setBody(llvm::PointerType::getUnqual(ClassTy),
+ llvm::PointerType::getUnqual(ClassTy),
+ Int8PtrTy,
+ LongTy,
+ LongTy,
+ LongTy,
+ IvarListPtrTy,
+ MethodListPtrTy,
+ CachePtrTy,
+ ProtocolListPtrTy,
+ Int8PtrTy,
+ ClassExtensionPtrTy,
+ NULL);
+
ClassPtrTy = llvm::PointerType::getUnqual(ClassTy);
// struct _objc_category {
@@ -4310,15 +4330,11 @@ ObjCTypesHelper::ObjCTypesHelper(CodeGen::CodeGenModule &cgm)
// uint32_t size; // sizeof(struct _objc_category)
// struct _objc_property_list *instance_properties;// category's @property
// }
- CategoryTy = llvm::StructType::get(VMContext, Int8PtrTy,
- Int8PtrTy,
- MethodListPtrTy,
- MethodListPtrTy,
- ProtocolListPtrTy,
- IntTy,
- PropertyListPtrTy,
- NULL);
- CGM.getModule().addTypeName("struct._objc_category", CategoryTy);
+ CategoryTy =
+ llvm::StructType::createNamed("struct._objc_category",
+ Int8PtrTy, Int8PtrTy, MethodListPtrTy,
+ MethodListPtrTy, ProtocolListPtrTy,
+ IntTy, PropertyListPtrTy, NULL);
// Global metadata structures
@@ -4329,13 +4345,10 @@ ObjCTypesHelper::ObjCTypesHelper(CodeGen::CodeGenModule &cgm)
// short cat_def_cnt;
// char *defs[cls_def_cnt + cat_def_cnt];
// }
- SymtabTy = llvm::StructType::get(VMContext, LongTy,
- SelectorPtrTy,
- ShortTy,
- ShortTy,
- llvm::ArrayType::get(Int8PtrTy, 0),
- NULL);
- CGM.getModule().addTypeName("struct._objc_symtab", SymtabTy);
+ SymtabTy =
+ llvm::StructType::createNamed("struct._objc_symtab",
+ LongTy, SelectorPtrTy, ShortTy, ShortTy,
+ llvm::ArrayType::get(Int8PtrTy, 0), NULL);
SymtabPtrTy = llvm::PointerType::getUnqual(SymtabTy);
// struct _objc_module {
@@ -4345,12 +4358,8 @@ ObjCTypesHelper::ObjCTypesHelper(CodeGen::CodeGenModule &cgm)
// struct _objc_symtab* symtab;
// }
ModuleTy =
- llvm::StructType::get(VMContext, LongTy,
- LongTy,
- Int8PtrTy,
- SymtabPtrTy,
- NULL);
- CGM.getModule().addTypeName("struct._objc_module", ModuleTy);
+ llvm::StructType::createNamed("struct._objc_module",
+ LongTy, LongTy, Int8PtrTy, SymtabPtrTy, NULL);
// FIXME: This is the size of the setjmp buffer and should be target
@@ -4358,16 +4367,14 @@ ObjCTypesHelper::ObjCTypesHelper(CodeGen::CodeGenModule &cgm)
uint64_t SetJmpBufferSize = 18;
// Exceptions
- const llvm::Type *StackPtrTy = llvm::ArrayType::get(
+ llvm::Type *StackPtrTy = llvm::ArrayType::get(
llvm::Type::getInt8PtrTy(VMContext), 4);
ExceptionDataTy =
- llvm::StructType::get(VMContext,
- llvm::ArrayType::get(llvm::Type::getInt32Ty(VMContext),
- SetJmpBufferSize),
- StackPtrTy, NULL);
- CGM.getModule().addTypeName("struct._objc_exception_data",
- ExceptionDataTy);
+ llvm::StructType::createNamed("struct._objc_exception_data",
+ llvm::ArrayType::get(llvm::Type::getInt32Ty(VMContext),
+ SetJmpBufferSize),
+ StackPtrTy, NULL);
}
@@ -4378,12 +4385,11 @@ ObjCNonFragileABITypesHelper::ObjCNonFragileABITypesHelper(CodeGen::CodeGenModul
// uint32_t method_count;
// struct _objc_method method_list[method_count];
// }
- MethodListnfABITy = llvm::StructType::get(VMContext, IntTy,
- IntTy,
- llvm::ArrayType::get(MethodTy, 0),
- NULL);
- CGM.getModule().addTypeName("struct.__method_list_t",
- MethodListnfABITy);
+ MethodListnfABITy =
+ llvm::StructType::createNamed("struct.__method_list_t",
+ IntTy, IntTy,
+ llvm::ArrayType::get(MethodTy, 0),
+ NULL);
// struct method_list_t *
MethodListnfABIPtrTy = llvm::PointerType::getUnqual(MethodListnfABITy);
@@ -4401,22 +4407,21 @@ ObjCNonFragileABITypesHelper::ObjCNonFragileABITypesHelper(CodeGen::CodeGenModul
// }
// Holder for struct _protocol_list_t *
- llvm::PATypeHolder ProtocolListTyHolder = llvm::OpaqueType::get(VMContext);
-
- ProtocolnfABITy = llvm::StructType::get(VMContext, ObjectPtrTy,
- Int8PtrTy,
- llvm::PointerType::getUnqual(
- ProtocolListTyHolder),
- MethodListnfABIPtrTy,
- MethodListnfABIPtrTy,
- MethodListnfABIPtrTy,
- MethodListnfABIPtrTy,
- PropertyListPtrTy,
- IntTy,
- IntTy,
- NULL);
- CGM.getModule().addTypeName("struct._protocol_t",
- ProtocolnfABITy);
+ ProtocolListnfABITy =
+ llvm::StructType::createNamed(VMContext, "struct._objc_protocol_list");
+
+ ProtocolnfABITy =
+ llvm::StructType::createNamed("struct._protocol_t",
+ ObjectPtrTy, Int8PtrTy,
+ llvm::PointerType::getUnqual(ProtocolListnfABITy),
+ MethodListnfABIPtrTy,
+ MethodListnfABIPtrTy,
+ MethodListnfABIPtrTy,
+ MethodListnfABIPtrTy,
+ PropertyListPtrTy,
+ IntTy,
+ IntTy,
+ NULL);
// struct _protocol_t*
ProtocolnfABIPtrTy = llvm::PointerType::getUnqual(ProtocolnfABITy);
@@ -4425,14 +4430,9 @@ ObjCNonFragileABITypesHelper::ObjCNonFragileABITypesHelper(CodeGen::CodeGenModul
// long protocol_count; // Note, this is 32/64 bit
// struct _protocol_t *[protocol_count];
// }
- ProtocolListnfABITy = llvm::StructType::get(VMContext, LongTy,
- llvm::ArrayType::get(
- ProtocolnfABIPtrTy, 0),
- NULL);
- CGM.getModule().addTypeName("struct._objc_protocol_list",
- ProtocolListnfABITy);
- cast<llvm::OpaqueType>(ProtocolListTyHolder.get())->refineAbstractTypeTo(
- ProtocolListnfABITy);
+ ProtocolListnfABITy->setBody(LongTy,
+ llvm::ArrayType::get(ProtocolnfABIPtrTy, 0),
+ NULL);
// struct _objc_protocol_list*
ProtocolListnfABIPtrTy = llvm::PointerType::getUnqual(ProtocolListnfABITy);
@@ -4444,26 +4444,25 @@ ObjCNonFragileABITypesHelper::ObjCNonFragileABITypesHelper(CodeGen::CodeGenModul
// uint32_t alignment;
// uint32_t size;
// }
- IvarnfABITy = llvm::StructType::get(VMContext,
- llvm::PointerType::getUnqual(LongTy),
- Int8PtrTy,
- Int8PtrTy,
- IntTy,
- IntTy,
- NULL);
- CGM.getModule().addTypeName("struct._ivar_t", IvarnfABITy);
+ IvarnfABITy =
+ llvm::StructType::createNamed("struct._ivar_t",
+ llvm::PointerType::getUnqual(LongTy),
+ Int8PtrTy,
+ Int8PtrTy,
+ IntTy,
+ IntTy,
+ NULL);
// struct _ivar_list_t {
// uint32 entsize; // sizeof(struct _ivar_t)
// uint32 count;
// struct _iver_t list[count];
// }
- IvarListnfABITy = llvm::StructType::get(VMContext, IntTy,
- IntTy,
- llvm::ArrayType::get(
- IvarnfABITy, 0),
- NULL);
- CGM.getModule().addTypeName("struct._ivar_list_t", IvarListnfABITy);
+ IvarListnfABITy =
+ llvm::StructType::createNamed("struct._ivar_list_t",
+ IntTy, IntTy,
+ llvm::ArrayType::get(IvarnfABITy, 0),
+ NULL);
IvarListnfABIPtrTy = llvm::PointerType::getUnqual(IvarListnfABITy);
@@ -4482,22 +4481,21 @@ ObjCNonFragileABITypesHelper::ObjCNonFragileABITypesHelper(CodeGen::CodeGenModul
// }
// FIXME. Add 'reserved' field in 64bit abi mode!
- ClassRonfABITy = llvm::StructType::get(VMContext, IntTy,
- IntTy,
- IntTy,
- Int8PtrTy,
- Int8PtrTy,
- MethodListnfABIPtrTy,
- ProtocolListnfABIPtrTy,
- IvarListnfABIPtrTy,
- Int8PtrTy,
- PropertyListPtrTy,
- NULL);
- CGM.getModule().addTypeName("struct._class_ro_t",
- ClassRonfABITy);
+ ClassRonfABITy = llvm::StructType::createNamed("struct._class_ro_t",
+ IntTy,
+ IntTy,
+ IntTy,
+ Int8PtrTy,
+ Int8PtrTy,
+ MethodListnfABIPtrTy,
+ ProtocolListnfABIPtrTy,
+ IvarListnfABIPtrTy,
+ Int8PtrTy,
+ PropertyListPtrTy,
+ NULL);
// ImpnfABITy - LLVM for id (*)(id, SEL, ...)
- const llvm::Type *params[] = { ObjectPtrTy, SelectorPtrTy };
+ llvm::Type *params[] = { ObjectPtrTy, SelectorPtrTy };
ImpnfABITy = llvm::FunctionType::get(ObjectPtrTy, params, false)
->getPointerTo();
@@ -4509,19 +4507,13 @@ ObjCNonFragileABITypesHelper::ObjCNonFragileABITypesHelper(CodeGen::CodeGenModul
// struct class_ro_t *ro;
// }
- llvm::PATypeHolder ClassTyHolder = llvm::OpaqueType::get(VMContext);
- ClassnfABITy =
- llvm::StructType::get(VMContext,
- llvm::PointerType::getUnqual(ClassTyHolder),
- llvm::PointerType::getUnqual(ClassTyHolder),
- CachePtrTy,
- llvm::PointerType::getUnqual(ImpnfABITy),
- llvm::PointerType::getUnqual(ClassRonfABITy),
- NULL);
- CGM.getModule().addTypeName("struct._class_t", ClassnfABITy);
-
- cast<llvm::OpaqueType>(ClassTyHolder.get())->refineAbstractTypeTo(
- ClassnfABITy);
+ ClassnfABITy = llvm::StructType::createNamed(VMContext, "struct._class_t");
+ ClassnfABITy->setBody(llvm::PointerType::getUnqual(ClassnfABITy),
+ llvm::PointerType::getUnqual(ClassnfABITy),
+ CachePtrTy,
+ llvm::PointerType::getUnqual(ImpnfABITy),
+ llvm::PointerType::getUnqual(ClassRonfABITy),
+ NULL);
// LLVM for struct _class_t *
ClassnfABIPtrTy = llvm::PointerType::getUnqual(ClassnfABITy);
@@ -4534,14 +4526,14 @@ ObjCNonFragileABITypesHelper::ObjCNonFragileABITypesHelper(CodeGen::CodeGenModul
// const struct _protocol_list_t * const protocols;
// const struct _prop_list_t * const properties;
// }
- CategorynfABITy = llvm::StructType::get(VMContext, Int8PtrTy,
- ClassnfABIPtrTy,
- MethodListnfABIPtrTy,
- MethodListnfABIPtrTy,
- ProtocolListnfABIPtrTy,
- PropertyListPtrTy,
- NULL);
- CGM.getModule().addTypeName("struct._category_t", CategorynfABITy);
+ CategorynfABITy = llvm::StructType::createNamed("struct._category_t",
+ Int8PtrTy,
+ ClassnfABIPtrTy,
+ MethodListnfABIPtrTy,
+ MethodListnfABIPtrTy,
+ ProtocolListnfABIPtrTy,
+ PropertyListPtrTy,
+ NULL);
// New types for nonfragile abi messaging.
CodeGen::CodeGenTypes &Types = CGM.getTypes();
@@ -4576,26 +4568,25 @@ ObjCNonFragileABITypesHelper::ObjCNonFragileABITypesHelper(CodeGen::CodeGenModul
// SUPER_IMP messenger;
// SEL name;
// };
- SuperMessageRefTy = llvm::StructType::get(VMContext, ImpnfABITy,
- SelectorPtrTy,
- NULL);
- CGM.getModule().addTypeName("struct._super_message_ref_t", SuperMessageRefTy);
+ SuperMessageRefTy =
+ llvm::StructType::createNamed("struct._super_message_ref_t",
+ ImpnfABITy, SelectorPtrTy, NULL);
// SuperMessageRefPtrTy - LLVM for struct _super_message_ref_t*
SuperMessageRefPtrTy = llvm::PointerType::getUnqual(SuperMessageRefTy);
-
+
// struct objc_typeinfo {
// const void** vtable; // objc_ehtype_vtable + 2
// const char* name; // c++ typeinfo string
// Class cls;
// };
- EHTypeTy = llvm::StructType::get(VMContext,
- llvm::PointerType::getUnqual(Int8PtrTy),
- Int8PtrTy,
- ClassnfABIPtrTy,
- NULL);
- CGM.getModule().addTypeName("struct._objc_typeinfo", EHTypeTy);
+ EHTypeTy =
+ llvm::StructType::createNamed("struct._objc_typeinfo",
+ llvm::PointerType::getUnqual(Int8PtrTy),
+ Int8PtrTy,
+ ClassnfABIPtrTy,
+ NULL);
EHTypePtrTy = llvm::PointerType::getUnqual(EHTypeTy);
}
@@ -4743,7 +4734,12 @@ enum MetaDataDlags {
CLS_META = 0x1,
CLS_ROOT = 0x2,
OBJC2_CLS_HIDDEN = 0x10,
- CLS_EXCEPTION = 0x20
+ CLS_EXCEPTION = 0x20,
+
+ /// (Obsolete) ARC-specific: this class has a .release_ivars method
+ CLS_HAS_IVAR_RELEASER = 0x40,
+ /// class was compiled with -fobjc-arr
+ CLS_COMPILED_BY_ARC = 0x80 // (1<<7)
};
/// BuildClassRoTInitializer - generate meta-data for:
/// struct _class_ro_t {
@@ -4767,6 +4763,10 @@ llvm::GlobalVariable * CGObjCNonFragileABIMac::BuildClassRoTInitializer(
const ObjCImplementationDecl *ID) {
std::string ClassName = ID->getNameAsString();
std::vector<llvm::Constant*> Values(10); // 11 for 64bit targets!
+
+ if (CGM.getLangOptions().ObjCAutoRefCount)
+ flags |= CLS_COMPILED_BY_ARC;
+
Values[ 0] = llvm::ConstantInt::get(ObjCTypes.IntTy, flags);
Values[ 1] = llvm::ConstantInt::get(ObjCTypes.IntTy, InstanceStart);
Values[ 2] = llvm::ConstantInt::get(ObjCTypes.IntTy, InstanceSize);
@@ -4936,7 +4936,7 @@ void CGObjCNonFragileABIMac::GenerateClass(const ObjCImplementationDecl *ID) {
ID->getClassInterface()->getVisibility() == HiddenVisibility;
if (classIsHidden)
flags |= OBJC2_CLS_HIDDEN;
- if (ID->getNumIvarInitializers())
+ if (ID->hasCXXStructors())
flags |= eClassFlags_ABI2_HasCXXStructors;
if (!ID->getClassInterface()->getSuperClass()) {
// class is root
@@ -4972,7 +4972,7 @@ void CGObjCNonFragileABIMac::GenerateClass(const ObjCImplementationDecl *ID) {
flags = CLS;
if (classIsHidden)
flags |= OBJC2_CLS_HIDDEN;
- if (ID->getNumIvarInitializers())
+ if (ID->hasCXXStructors())
flags |= eClassFlags_ABI2_HasCXXStructors;
if (hasObjCExceptionAttribute(CGM.getContext(), ID->getClassInterface()))
@@ -5174,7 +5174,7 @@ llvm::Constant *CGObjCNonFragileABIMac::EmitMethodList(llvm::Twine Name,
if (Methods.empty())
return llvm::Constant::getNullValue(ObjCTypes.MethodListnfABIPtrTy);
- std::vector<llvm::Constant*> Values(3);
+ llvm::Constant *Values[3];
// sizeof(struct _objc_method)
unsigned Size = CGM.getTargetData().getTypeAllocSize(ObjCTypes.MethodTy);
Values[0] = llvm::ConstantInt::get(ObjCTypes.IntTy, Size);
@@ -5183,19 +5183,15 @@ llvm::Constant *CGObjCNonFragileABIMac::EmitMethodList(llvm::Twine Name,
llvm::ArrayType *AT = llvm::ArrayType::get(ObjCTypes.MethodTy,
Methods.size());
Values[2] = llvm::ConstantArray::get(AT, Methods);
- llvm::Constant *Init = llvm::ConstantStruct::get(VMContext, Values, false);
+ llvm::Constant *Init = llvm::ConstantStruct::getAnon(Values);
llvm::GlobalVariable *GV =
new llvm::GlobalVariable(CGM.getModule(), Init->getType(), false,
- llvm::GlobalValue::InternalLinkage,
- Init,
- Name);
- GV->setAlignment(
- CGM.getTargetData().getABITypeAlignment(Init->getType()));
+ llvm::GlobalValue::InternalLinkage, Init, Name);
+ GV->setAlignment(CGM.getTargetData().getABITypeAlignment(Init->getType()));
GV->setSection(Section);
CGM.AddUsedGlobal(GV);
- return llvm::ConstantExpr::getBitCast(GV,
- ObjCTypes.MethodListnfABIPtrTy);
+ return llvm::ConstantExpr::getBitCast(GV, ObjCTypes.MethodListnfABIPtrTy);
}
/// ObjCIvarOffsetVariable - Returns the ivar offset variable for
@@ -5262,17 +5258,14 @@ llvm::Constant *CGObjCNonFragileABIMac::EmitIvarList(
std::vector<llvm::Constant*> Ivars, Ivar(5);
- const ObjCInterfaceDecl *OID = ID->getClassInterface();
+ ObjCInterfaceDecl *OID =
+ const_cast<ObjCInterfaceDecl*>(ID->getClassInterface());
assert(OID && "CGObjCNonFragileABIMac::EmitIvarList - null interface");
// FIXME. Consolidate this with similar code in GenerateClass.
- // Collect declared and synthesized ivars in a small vector.
- llvm::SmallVector<ObjCIvarDecl*, 16> OIvars;
- CGM.getContext().ShallowCollectObjCIvars(OID, OIvars);
-
- for (unsigned i = 0, e = OIvars.size(); i != e; ++i) {
- ObjCIvarDecl *IVD = OIvars[i];
+ for (ObjCIvarDecl *IVD = OID->all_declared_ivar_begin();
+ IVD; IVD = IVD->getNextIvar()) {
// Ignore unnamed bit-fields.
if (!IVD->getDeclName())
continue;
@@ -5298,14 +5291,15 @@ llvm::Constant *CGObjCNonFragileABIMac::EmitIvarList(
// Return null for empty list.
if (Ivars.empty())
return llvm::Constant::getNullValue(ObjCTypes.IvarListnfABIPtrTy);
- std::vector<llvm::Constant*> Values(3);
+
+ llvm::Constant *Values[3];
unsigned Size = CGM.getTargetData().getTypeAllocSize(ObjCTypes.IvarnfABITy);
Values[0] = llvm::ConstantInt::get(ObjCTypes.IntTy, Size);
Values[1] = llvm::ConstantInt::get(ObjCTypes.IntTy, Ivars.size());
llvm::ArrayType *AT = llvm::ArrayType::get(ObjCTypes.IvarnfABITy,
Ivars.size());
Values[2] = llvm::ConstantArray::get(AT, Ivars);
- llvm::Constant *Init = llvm::ConstantStruct::get(VMContext, Values, false);
+ llvm::Constant *Init = llvm::ConstantStruct::getAnon(Values);
const char *Prefix = "\01l_OBJC_$_INSTANCE_VARIABLES_";
llvm::GlobalVariable *GV =
new llvm::GlobalVariable(CGM.getModule(), Init->getType(), false,
@@ -5491,7 +5485,7 @@ CGObjCNonFragileABIMac::EmitProtocolList(llvm::Twine Name,
ProtocolRefs.push_back(llvm::Constant::getNullValue(
ObjCTypes.ProtocolnfABIPtrTy));
- std::vector<llvm::Constant*> Values(2);
+ llvm::Constant *Values[2];
Values[0] =
llvm::ConstantInt::get(ObjCTypes.LongTy, ProtocolRefs.size() - 1);
Values[1] =
@@ -5500,11 +5494,10 @@ CGObjCNonFragileABIMac::EmitProtocolList(llvm::Twine Name,
ProtocolRefs.size()),
ProtocolRefs);
- llvm::Constant *Init = llvm::ConstantStruct::get(VMContext, Values, false);
+ llvm::Constant *Init = llvm::ConstantStruct::getAnon(Values);
GV = new llvm::GlobalVariable(CGM.getModule(), Init->getType(), false,
llvm::GlobalValue::InternalLinkage,
- Init,
- Name);
+ Init, Name);
GV->setSection("__DATA, __objc_const");
GV->setAlignment(
CGM.getTargetData().getABITypeAlignment(Init->getType()));
@@ -5654,8 +5647,7 @@ CGObjCNonFragileABIMac::EmitVTableMessageSend(CodeGenFunction &CGF,
if (!messageRef) {
// Build the message ref structure.
llvm::Constant *values[] = { fn, GetMethodVarName(selector) };
- llvm::Constant *init =
- llvm::ConstantStruct::get(VMContext, values, 2, false);
+ llvm::Constant *init = llvm::ConstantStruct::getAnon(values);
messageRef = new llvm::GlobalVariable(CGM.getModule(),
init->getType(),
/*constant*/ false,
@@ -5719,28 +5711,39 @@ CGObjCNonFragileABIMac::GetClassGlobal(const std::string &Name) {
return GV;
}
-llvm::Value *CGObjCNonFragileABIMac::EmitClassRef(CGBuilderTy &Builder,
- const ObjCInterfaceDecl *ID) {
- llvm::GlobalVariable *&Entry = ClassReferences[ID->getIdentifier()];
-
+llvm::Value *CGObjCNonFragileABIMac::EmitClassRefFromId(CGBuilderTy &Builder,
+ IdentifierInfo *II) {
+ llvm::GlobalVariable *&Entry = ClassReferences[II];
+
if (!Entry) {
- std::string ClassName(getClassSymbolPrefix() + ID->getNameAsString());
+ std::string ClassName(getClassSymbolPrefix() + II->getName().str());
llvm::GlobalVariable *ClassGV = GetClassGlobal(ClassName);
Entry =
- new llvm::GlobalVariable(CGM.getModule(), ObjCTypes.ClassnfABIPtrTy,
- false, llvm::GlobalValue::InternalLinkage,
- ClassGV,
- "\01L_OBJC_CLASSLIST_REFERENCES_$_");
+ new llvm::GlobalVariable(CGM.getModule(), ObjCTypes.ClassnfABIPtrTy,
+ false, llvm::GlobalValue::InternalLinkage,
+ ClassGV,
+ "\01L_OBJC_CLASSLIST_REFERENCES_$_");
Entry->setAlignment(
- CGM.getTargetData().getABITypeAlignment(
- ObjCTypes.ClassnfABIPtrTy));
+ CGM.getTargetData().getABITypeAlignment(
+ ObjCTypes.ClassnfABIPtrTy));
Entry->setSection("__DATA, __objc_classrefs, regular, no_dead_strip");
CGM.AddUsedGlobal(Entry);
}
-
+
return Builder.CreateLoad(Entry, "tmp");
}
+llvm::Value *CGObjCNonFragileABIMac::EmitClassRef(CGBuilderTy &Builder,
+ const ObjCInterfaceDecl *ID) {
+ return EmitClassRefFromId(Builder, ID->getIdentifier());
+}
+
+llvm::Value *CGObjCNonFragileABIMac::EmitNSAutoreleasePoolClassRef(
+ CGBuilderTy &Builder) {
+ IdentifierInfo *II = &CGM.getContext().Idents.get("NSAutoreleasePool");
+ return EmitClassRefFromId(Builder, II);
+}
+
llvm::Value *
CGObjCNonFragileABIMac::EmitSuperClassRef(CGBuilderTy &Builder,
const ObjCInterfaceDecl *ID) {
@@ -6043,12 +6046,10 @@ void CGObjCNonFragileABIMac::EmitThrowStmt(CodeGen::CodeGenFunction &CGF,
llvm::Value *Exception = CGF.EmitScalarExpr(ThrowExpr);
Exception = CGF.Builder.CreateBitCast(Exception, ObjCTypes.ObjectPtrTy,
"tmp");
- llvm::Value *Args[] = { Exception };
- CGF.EmitCallOrInvoke(ObjCTypes.getExceptionThrowFn(),
- Args, Args+1)
+ CGF.EmitCallOrInvoke(ObjCTypes.getExceptionThrowFn(), Exception)
.setDoesNotReturn();
} else {
- CGF.EmitCallOrInvoke(ObjCTypes.getExceptionRethrowFn(), 0, 0)
+ CGF.EmitCallOrInvoke(ObjCTypes.getExceptionRethrowFn())
.setDoesNotReturn();
}
diff --git a/contrib/llvm/tools/clang/lib/CodeGen/CGObjCRuntime.cpp b/contrib/llvm/tools/clang/lib/CodeGen/CGObjCRuntime.cpp
index 21150f1..09c8d0b 100644
--- a/contrib/llvm/tools/clang/lib/CodeGen/CGObjCRuntime.cpp
+++ b/contrib/llvm/tools/clang/lib/CodeGen/CGObjCRuntime.cpp
@@ -52,14 +52,14 @@ static uint64_t LookupFieldBitOffset(CodeGen::CodeGenModule &CGM,
// implemented. This should be fixed to get the information from the layout
// directly.
unsigned Index = 0;
- llvm::SmallVector<ObjCIvarDecl*, 16> Ivars;
- CGM.getContext().ShallowCollectObjCIvars(Container, Ivars);
- for (unsigned k = 0, e = Ivars.size(); k != e; ++k) {
- if (Ivar == Ivars[k])
+ ObjCInterfaceDecl *IDecl = const_cast<ObjCInterfaceDecl*>(Container);
+
+ for (ObjCIvarDecl *IVD = IDecl->all_declared_ivar_begin();
+ IVD; IVD = IVD->getNextIvar()) {
+ if (Ivar == IVD)
break;
++Index;
}
- assert(Index != Ivars.size() && "Ivar is not inside container!");
assert(Index < RL->getFieldCount() && "Ivar is not inside record layout!");
return RL->getFieldOffset(Index);
@@ -134,7 +134,7 @@ LValue CGObjCRuntime::EmitValueForIvarAtOffset(CodeGen::CodeGenFunction &CGF,
ContainingTypeSize, ContainingTypeAlign));
return LValue::MakeBitfield(V, *Info,
- IvarTy.getCVRQualifiers() | CVRQualifiers);
+ IvarTy.withCVRQualifiers(CVRQualifiers));
}
namespace {
@@ -151,13 +151,13 @@ namespace {
bool MightThrow;
llvm::Value *Fn;
- void Emit(CodeGenFunction &CGF, bool IsForEH) {
+ void Emit(CodeGenFunction &CGF, Flags flags) {
if (!MightThrow) {
CGF.Builder.CreateCall(Fn)->setDoesNotThrow();
return;
}
- CGF.EmitCallOrInvoke(Fn, 0, 0);
+ CGF.EmitCallOrInvoke(Fn);
}
};
}
@@ -175,10 +175,8 @@ void CGObjCRuntime::EmitTryCatchStmt(CodeGenFunction &CGF,
CodeGenFunction::FinallyInfo FinallyInfo;
if (const ObjCAtFinallyStmt *Finally = S.getFinallyStmt())
- FinallyInfo = CGF.EnterFinallyBlock(Finally->getFinallyBody(),
- beginCatchFn,
- endCatchFn,
- exceptionRethrowFn);
+ FinallyInfo.enter(CGF, Finally->getFinallyBody(),
+ beginCatchFn, endCatchFn, exceptionRethrowFn);
llvm::SmallVector<CatchHandler, 8> Handlers;
@@ -266,9 +264,9 @@ void CGObjCRuntime::EmitTryCatchStmt(CodeGenFunction &CGF,
// Go back to the try-statement fallthrough.
CGF.Builder.restoreIP(SavedIP);
- // Pop out of the normal cleanup on the finally.
+ // Pop out of the finally.
if (S.getFinallyStmt())
- CGF.ExitFinallyBlock(FinallyInfo);
+ FinallyInfo.exit(CGF);
if (Cont.isValid())
CGF.EmitBlock(Cont.getBlock());
@@ -281,7 +279,7 @@ namespace {
CallSyncExit(llvm::Value *SyncExitFn, llvm::Value *SyncArg)
: SyncExitFn(SyncExitFn), SyncArg(SyncArg) {}
- void Emit(CodeGenFunction &CGF, bool IsForEHCleanup) {
+ void Emit(CodeGenFunction &CGF, Flags flags) {
CGF.Builder.CreateCall(SyncExitFn, SyncArg)->setDoesNotThrow();
}
};
diff --git a/contrib/llvm/tools/clang/lib/CodeGen/CGObjCRuntime.h b/contrib/llvm/tools/clang/lib/CodeGen/CGObjCRuntime.h
index 866d5d8..7accc70 100644
--- a/contrib/llvm/tools/clang/lib/CodeGen/CGObjCRuntime.h
+++ b/contrib/llvm/tools/clang/lib/CodeGen/CGObjCRuntime.h
@@ -205,7 +205,13 @@ public:
/// interface decl.
virtual llvm::Value *GetClass(CGBuilderTy &Builder,
const ObjCInterfaceDecl *OID) = 0;
-
+
+
+ virtual llvm::Value *EmitNSAutoreleasePoolClassRef(CGBuilderTy &Builder) {
+ assert(false &&"autoreleasepool unsupported in this ABI");
+ return 0;
+ }
+
/// EnumerationMutationFunction - Return the function that's called by the
/// compiler when a mutation is detected during foreach iteration.
virtual llvm::Constant *EnumerationMutationFunction() = 0;
diff --git a/contrib/llvm/tools/clang/lib/CodeGen/CGRTTI.cpp b/contrib/llvm/tools/clang/lib/CodeGen/CGRTTI.cpp
index c73b199..e564c70 100644
--- a/contrib/llvm/tools/clang/lib/CodeGen/CGRTTI.cpp
+++ b/contrib/llvm/tools/clang/lib/CodeGen/CGRTTI.cpp
@@ -658,9 +658,7 @@ llvm::Constant *RTTIBuilder::BuildTypeInfo(QualType Ty, bool Force) {
break;
}
- llvm::Constant *Init =
- llvm::ConstantStruct::get(VMContext, &Fields[0], Fields.size(),
- /*Packed=*/false);
+ llvm::Constant *Init = llvm::ConstantStruct::getAnon(Fields);
llvm::GlobalVariable *GV =
new llvm::GlobalVariable(CGM.getModule(), Init->getType(),
diff --git a/contrib/llvm/tools/clang/lib/CodeGen/CGRecordLayout.h b/contrib/llvm/tools/clang/lib/CodeGen/CGRecordLayout.h
index 6d9fc05..8a45029 100644
--- a/contrib/llvm/tools/clang/lib/CodeGen/CGRecordLayout.h
+++ b/contrib/llvm/tools/clang/lib/CodeGen/CGRecordLayout.h
@@ -176,11 +176,11 @@ class CGRecordLayout {
private:
/// The LLVM type corresponding to this record layout; used when
/// laying it out as a complete object.
- llvm::PATypeHolder CompleteObjectType;
+ llvm::StructType *CompleteObjectType;
/// The LLVM type for the non-virtual part of this record layout;
/// used when laying it out as a base subobject.
- llvm::PATypeHolder BaseSubobjectType;
+ llvm::StructType *BaseSubobjectType;
/// Map from (non-bit-field) struct field to the corresponding llvm struct
/// type field no. This info is populated by record builder.
@@ -208,8 +208,8 @@ private:
bool IsZeroInitializableAsBase : 1;
public:
- CGRecordLayout(const llvm::StructType *CompleteObjectType,
- const llvm::StructType *BaseSubobjectType,
+ CGRecordLayout(llvm::StructType *CompleteObjectType,
+ llvm::StructType *BaseSubobjectType,
bool IsZeroInitializable,
bool IsZeroInitializableAsBase)
: CompleteObjectType(CompleteObjectType),
@@ -219,14 +219,14 @@ public:
/// \brief Return the "complete object" LLVM type associated with
/// this record.
- const llvm::StructType *getLLVMType() const {
- return cast<llvm::StructType>(CompleteObjectType.get());
+ llvm::StructType *getLLVMType() const {
+ return CompleteObjectType;
}
/// \brief Return the "base subobject" LLVM type associated with
/// this record.
- const llvm::StructType *getBaseSubobjectLLVMType() const {
- return cast<llvm::StructType>(BaseSubobjectType.get());
+ llvm::StructType *getBaseSubobjectLLVMType() const {
+ return BaseSubobjectType;
}
/// \brief Check whether this struct can be C++ zero-initialized
diff --git a/contrib/llvm/tools/clang/lib/CodeGen/CGRecordLayoutBuilder.cpp b/contrib/llvm/tools/clang/lib/CodeGen/CGRecordLayoutBuilder.cpp
index 0d72f85..2b07baf 100644
--- a/contrib/llvm/tools/clang/lib/CodeGen/CGRecordLayoutBuilder.cpp
+++ b/contrib/llvm/tools/clang/lib/CodeGen/CGRecordLayoutBuilder.cpp
@@ -18,6 +18,7 @@
#include "clang/AST/DeclCXX.h"
#include "clang/AST/Expr.h"
#include "clang/AST/RecordLayout.h"
+#include "clang/Frontend/CodeGenOptions.h"
#include "CodeGenTypes.h"
#include "CGCXXABI.h"
#include "llvm/DerivedTypes.h"
@@ -34,7 +35,7 @@ class CGRecordLayoutBuilder {
public:
/// FieldTypes - Holds the LLVM types that the struct is created from.
///
- llvm::SmallVector<const llvm::Type *, 16> FieldTypes;
+ llvm::SmallVector<llvm::Type *, 16> FieldTypes;
/// BaseSubobjectType - Holds the LLVM type for the non-virtual part
/// of the struct. For example, consider:
@@ -51,7 +52,7 @@ public:
///
/// This only gets initialized if the base subobject type is
/// different from the complete-object type.
- const llvm::StructType *BaseSubobjectType;
+ llvm::StructType *BaseSubobjectType;
/// FieldInfo - Holds a field and its corresponding LLVM field number.
llvm::DenseMap<const FieldDecl *, unsigned> Fields;
@@ -108,8 +109,8 @@ private:
/// LayoutUnionField - Will layout a field in an union and return the type
/// that the field will have.
- const llvm::Type *LayoutUnionField(const FieldDecl *Field,
- const ASTRecordLayout &Layout);
+ llvm::Type *LayoutUnionField(const FieldDecl *Field,
+ const ASTRecordLayout &Layout);
/// LayoutUnion - Will layout a union RecordDecl.
void LayoutUnion(const RecordDecl *D);
@@ -150,7 +151,7 @@ private:
void LayoutBitField(const FieldDecl *D, uint64_t FieldOffset);
/// AppendField - Appends a field with the given offset and type.
- void AppendField(CharUnits fieldOffset, const llvm::Type *FieldTy);
+ void AppendField(CharUnits fieldOffset, llvm::Type *FieldTy);
/// AppendPadding - Appends enough padding bytes so that the total
/// struct size is a multiple of the field alignment.
@@ -164,7 +165,7 @@ private:
/// getByteArrayType - Returns a byte array type with the given number of
/// elements.
- const llvm::Type *getByteArrayType(CharUnits NumBytes);
+ llvm::Type *getByteArrayType(CharUnits NumBytes);
/// AppendBytes - Append a given number of bytes to the record.
void AppendBytes(CharUnits numBytes);
@@ -229,7 +230,7 @@ CGBitFieldInfo CGBitFieldInfo::MakeInfo(CodeGenTypes &Types,
uint64_t FieldSize,
uint64_t ContainingTypeSizeInBits,
unsigned ContainingTypeAlign) {
- const llvm::Type *Ty = Types.ConvertTypeForMemRecursive(FD->getType());
+ const llvm::Type *Ty = Types.ConvertTypeForMem(FD->getType());
CharUnits TypeSizeInBytes =
CharUnits::fromQuantity(Types.getTargetData().getTypeAllocSize(Ty));
uint64_t TypeSizeInBits = Types.getContext().toBits(TypeSizeInBytes);
@@ -268,6 +269,18 @@ CGBitFieldInfo CGBitFieldInfo::MakeInfo(CodeGenTypes &Types,
unsigned AccessedTargetBits = 0; // The number of target bits accessed.
unsigned AccessWidth = TypeSizeInBits; // The current access width to attempt.
+ // If requested, widen the initial bit-field access to be register sized. The
+ // theory is that this is most likely to allow multiple accesses into the same
+ // structure to be coalesced, and that the backend should be smart enough to
+ // narrow the store if no coalescing is ever done.
+ //
+ // The subsequent code will handle align these access to common boundaries and
+ // guaranteeing that we do not access past the end of the structure.
+ if (Types.getCodeGenOpts().UseRegisterSizedBitfieldAccess) {
+ if (AccessWidth < Types.getTarget().getRegisterWidth())
+ AccessWidth = Types.getTarget().getRegisterWidth();
+ }
+
// Round down from the field offset to find the first access position that is
// at an aligned offset of the initial access type.
uint64_t AccessStart = FieldOffset - (FieldOffset % AccessWidth);
@@ -427,7 +440,7 @@ bool CGRecordLayoutBuilder::LayoutField(const FieldDecl *D,
CharUnits fieldOffsetInBytes
= Types.getContext().toCharUnitsFromBits(fieldOffset);
- const llvm::Type *Ty = Types.ConvertTypeForMemRecursive(D->getType());
+ llvm::Type *Ty = Types.ConvertTypeForMem(D->getType());
CharUnits typeAlignment = getTypeAlignment(Ty);
// If the type alignment is larger then the struct alignment, we must use
@@ -475,7 +488,7 @@ bool CGRecordLayoutBuilder::LayoutField(const FieldDecl *D,
return true;
}
-const llvm::Type *
+llvm::Type *
CGRecordLayoutBuilder::LayoutUnionField(const FieldDecl *Field,
const ASTRecordLayout &Layout) {
if (Field->isBitField()) {
@@ -486,7 +499,7 @@ CGRecordLayoutBuilder::LayoutUnionField(const FieldDecl *Field,
if (FieldSize == 0)
return 0;
- const llvm::Type *FieldTy = llvm::Type::getInt8Ty(Types.getLLVMContext());
+ llvm::Type *FieldTy = llvm::Type::getInt8Ty(Types.getLLVMContext());
CharUnits NumBytesToAppend = Types.getContext().toCharUnitsFromBits(
llvm::RoundUpToAlignment(FieldSize,
Types.getContext().Target.getCharAlign()));
@@ -502,7 +515,7 @@ CGRecordLayoutBuilder::LayoutUnionField(const FieldDecl *Field,
// This is a regular union field.
Fields[Field] = 0;
- return Types.ConvertTypeForMemRecursive(Field->getType());
+ return Types.ConvertTypeForMem(Field->getType());
}
void CGRecordLayoutBuilder::LayoutUnion(const RecordDecl *D) {
@@ -510,7 +523,7 @@ void CGRecordLayoutBuilder::LayoutUnion(const RecordDecl *D) {
const ASTRecordLayout &layout = Types.getContext().getASTRecordLayout(D);
- const llvm::Type *unionType = 0;
+ llvm::Type *unionType = 0;
CharUnits unionSize = CharUnits::Zero();
CharUnits unionAlign = CharUnits::Zero();
@@ -521,7 +534,7 @@ void CGRecordLayoutBuilder::LayoutUnion(const RecordDecl *D) {
fieldEnd = D->field_end(); field != fieldEnd; ++field, ++fieldNo) {
assert(layout.getFieldOffset(fieldNo) == 0 &&
"Union field offset did not start at the beginning of record!");
- const llvm::Type *fieldType = LayoutUnionField(*field, layout);
+ llvm::Type *fieldType = LayoutUnionField(*field, layout);
if (!fieldType)
continue;
@@ -586,10 +599,8 @@ void CGRecordLayoutBuilder::LayoutBase(const CXXRecordDecl *base,
// approximation, which is to use the base subobject type if it
// has the same LLVM storage size as the nvsize.
- const llvm::StructType *subobjectType = baseLayout.getBaseSubobjectLLVMType();
+ llvm::StructType *subobjectType = baseLayout.getBaseSubobjectLLVMType();
AppendField(baseOffset, subobjectType);
-
- Types.addBaseSubobjectTypeName(base, baseLayout);
}
void CGRecordLayoutBuilder::LayoutNonVirtualBase(const CXXRecordDecl *base,
@@ -723,13 +734,14 @@ CGRecordLayoutBuilder::ComputeNonVirtualBaseType(const CXXRecordDecl *RD) {
FieldTypes.push_back(getByteArrayType(NumBytes));
}
- BaseSubobjectType = llvm::StructType::get(Types.getLLVMContext(),
- FieldTypes, Packed);
+
+ BaseSubobjectType = llvm::StructType::createNamed(Types.getLLVMContext(), "",
+ FieldTypes, Packed);
+ Types.addRecordTypeName(RD, BaseSubobjectType, ".base");
- if (needsPadding) {
- // Pull the padding back off.
+ // Pull the padding back off.
+ if (needsPadding)
FieldTypes.pop_back();
- }
return true;
}
@@ -806,7 +818,7 @@ void CGRecordLayoutBuilder::AppendTailPadding(CharUnits RecordSize) {
}
void CGRecordLayoutBuilder::AppendField(CharUnits fieldOffset,
- const llvm::Type *fieldType) {
+ llvm::Type *fieldType) {
CharUnits fieldSize =
CharUnits::fromQuantity(Types.getTargetData().getTypeAllocSize(fieldType));
@@ -852,10 +864,10 @@ bool CGRecordLayoutBuilder::ResizeLastBaseFieldIfNecessary(CharUnits offset) {
return true;
}
-const llvm::Type *CGRecordLayoutBuilder::getByteArrayType(CharUnits numBytes) {
+llvm::Type *CGRecordLayoutBuilder::getByteArrayType(CharUnits numBytes) {
assert(!numBytes.isZero() && "Empty byte arrays aren't allowed.");
- const llvm::Type *Ty = llvm::Type::getInt8Ty(Types.getLLVMContext());
+ llvm::Type *Ty = llvm::Type::getInt8Ty(Types.getLLVMContext());
if (numBytes > CharUnits::One())
Ty = llvm::ArrayType::get(Ty, numBytes.getQuantity());
@@ -911,17 +923,16 @@ void CGRecordLayoutBuilder::CheckZeroInitializable(QualType T) {
}
}
-CGRecordLayout *CodeGenTypes::ComputeRecordLayout(const RecordDecl *D) {
+CGRecordLayout *CodeGenTypes::ComputeRecordLayout(const RecordDecl *D,
+ llvm::StructType *Ty) {
CGRecordLayoutBuilder Builder(*this);
Builder.Layout(D);
- const llvm::StructType *Ty = llvm::StructType::get(getLLVMContext(),
- Builder.FieldTypes,
- Builder.Packed);
+ Ty->setBody(Builder.FieldTypes, Builder.Packed);
// If we're in C++, compute the base subobject type.
- const llvm::StructType *BaseTy = 0;
+ llvm::StructType *BaseTy = 0;
if (isa<CXXRecordDecl>(D)) {
BaseTy = Builder.BaseSubobjectType;
if (!BaseTy) BaseTy = Ty;
diff --git a/contrib/llvm/tools/clang/lib/CodeGen/CGStmt.cpp b/contrib/llvm/tools/clang/lib/CodeGen/CGStmt.cpp
index a982621..07bddb7 100644
--- a/contrib/llvm/tools/clang/lib/CodeGen/CGStmt.cpp
+++ b/contrib/llvm/tools/clang/lib/CodeGen/CGStmt.cpp
@@ -151,6 +151,9 @@ void CodeGenFunction::EmitStmt(const Stmt *S) {
case Stmt::ObjCForCollectionStmtClass:
EmitObjCForCollectionStmt(cast<ObjCForCollectionStmt>(*S));
break;
+ case Stmt::ObjCAutoreleasePoolStmtClass:
+ EmitObjCAutoreleasePoolStmt(cast<ObjCAutoreleasePoolStmt>(*S));
+ break;
case Stmt::CXXTryStmtClass:
EmitCXXTryStmt(cast<CXXTryStmt>(*S));
@@ -764,7 +767,7 @@ void CodeGenFunction::EmitReturnStmt(const ReturnStmt &S) {
} else if (RV->getType()->isAnyComplexType()) {
EmitComplexExprIntoAddr(RV, ReturnValue, false);
} else {
- EmitAggExpr(RV, AggValueSlot::forAddr(ReturnValue, false, true));
+ EmitAggExpr(RV, AggValueSlot::forAddr(ReturnValue, Qualifiers(), true));
}
EmitBranchThroughCleanup(ReturnBlock);
@@ -1275,11 +1278,16 @@ AddVariableConstraints(const std::string &Constraint, const Expr &AsmExpr,
return Constraint;
llvm::StringRef Register = Attr->getLabel();
assert(Target.isValidGCCRegisterName(Register));
- // FIXME: We should check which registers are compatible with "r" or "x".
- if (Constraint != "r" && Constraint != "x") {
+ // We're using validateOutputConstraint here because we only care if
+ // this is a register constraint.
+ TargetInfo::ConstraintInfo Info(Constraint, "");
+ if (Target.validateOutputConstraint(Info) &&
+ !Info.allowsRegister()) {
CGM.ErrorUnsupported(&Stmt, "__asm__");
return Constraint;
}
+ // Canonicalize the register here before returning it.
+ Register = Target.getNormalizedGCCRegisterName(Register);
return "{" + Register.str() + "}";
}
@@ -1291,7 +1299,7 @@ CodeGenFunction::EmitAsmInputLValue(const AsmStmt &S,
llvm::Value *Arg;
if (Info.allowsRegister() || !Info.allowsMemory()) {
if (!CodeGenFunction::hasAggregateLLVMType(InputType)) {
- Arg = EmitLoadOfLValue(InputValue, InputType).getScalarVal();
+ Arg = EmitLoadOfLValue(InputValue).getScalarVal();
} else {
const llvm::Type *Ty = ConvertType(InputType);
uint64_t Size = CGM.getTargetData().getTypeSizeInBits(Ty);
@@ -1400,15 +1408,15 @@ void CodeGenFunction::EmitAsmStmt(const AsmStmt &S) {
std::vector<LValue> ResultRegDests;
std::vector<QualType> ResultRegQualTys;
- std::vector<const llvm::Type *> ResultRegTypes;
- std::vector<const llvm::Type *> ResultTruncRegTypes;
- std::vector<const llvm::Type*> ArgTypes;
+ std::vector<llvm::Type *> ResultRegTypes;
+ std::vector<llvm::Type *> ResultTruncRegTypes;
+ std::vector<llvm::Type*> ArgTypes;
std::vector<llvm::Value*> Args;
// Keep track of inout constraints.
std::string InOutConstraints;
std::vector<llvm::Value*> InOutArgs;
- std::vector<const llvm::Type*> InOutArgTypes;
+ std::vector<llvm::Type*> InOutArgTypes;
for (unsigned i = 0, e = S.getNumOutputs(); i != e; i++) {
TargetInfo::ConstraintInfo &Info = OutputConstraintInfos[i];
@@ -1457,7 +1465,7 @@ void CodeGenFunction::EmitAsmStmt(const AsmStmt &S) {
ResultRegTypes.back() = ConvertType(InputTy);
}
}
- if (const llvm::Type* AdjTy =
+ if (llvm::Type* AdjTy =
getTargetHooks().adjustInlineAsmType(*this, OutputConstraint,
ResultRegTypes.back()))
ResultRegTypes.back() = AdjTy;
@@ -1550,6 +1558,7 @@ void CodeGenFunction::EmitAsmStmt(const AsmStmt &S) {
for (unsigned i = 0, e = S.getNumClobbers(); i != e; i++) {
llvm::StringRef Clobber = S.getClobber(i)->getString();
+ if (Clobber != "memory" && Clobber != "cc")
Clobber = Target.getNormalizedGCCRegisterName(Clobber);
if (i != 0 || NumConstraints != 0)
@@ -1582,7 +1591,7 @@ void CodeGenFunction::EmitAsmStmt(const AsmStmt &S) {
llvm::InlineAsm *IA =
llvm::InlineAsm::get(FTy, AsmString, Constraints,
S.isVolatile() || S.getNumOutputs() == 0);
- llvm::CallInst *Result = Builder.CreateCall(IA, Args.begin(), Args.end());
+ llvm::CallInst *Result = Builder.CreateCall(IA, Args);
Result->addAttribute(~0, llvm::Attribute::NoUnwind);
// Slap the source location of the inline asm into a !srcloc metadata on the
@@ -1629,7 +1638,6 @@ void CodeGenFunction::EmitAsmStmt(const AsmStmt &S) {
}
}
- EmitStoreThroughLValue(RValue::get(Tmp), ResultRegDests[i],
- ResultRegQualTys[i]);
+ EmitStoreThroughLValue(RValue::get(Tmp), ResultRegDests[i]);
}
}
diff --git a/contrib/llvm/tools/clang/lib/CodeGen/CGTemporaries.cpp b/contrib/llvm/tools/clang/lib/CodeGen/CGTemporaries.cpp
index 3b4c509..0387dae 100644
--- a/contrib/llvm/tools/clang/lib/CodeGen/CGTemporaries.cpp
+++ b/contrib/llvm/tools/clang/lib/CodeGen/CGTemporaries.cpp
@@ -16,9 +16,12 @@ using namespace clang;
using namespace CodeGen;
namespace {
- struct DestroyTemporary {
- static void Emit(CodeGenFunction &CGF, bool forEH,
- const CXXDestructorDecl *dtor, llvm::Value *addr) {
+ struct DestroyTemporary : EHScopeStack::Cleanup {
+ const CXXDestructorDecl *dtor;
+ llvm::Value *addr;
+ DestroyTemporary(const CXXDestructorDecl *dtor, llvm::Value *addr)
+ : dtor(dtor), addr(addr) {}
+ void Emit(CodeGenFunction &CGF, Flags flags) {
CGF.EmitCXXDestructorCall(dtor, Dtor_Complete, /*ForVirtualBase=*/false,
addr);
}
diff --git a/contrib/llvm/tools/clang/lib/CodeGen/CGVTT.cpp b/contrib/llvm/tools/clang/lib/CodeGen/CGVTT.cpp
index aefc41e..cec02cd 100644
--- a/contrib/llvm/tools/clang/lib/CodeGen/CGVTT.cpp
+++ b/contrib/llvm/tools/clang/lib/CodeGen/CGVTT.cpp
@@ -390,8 +390,7 @@ CodeGenVTables::EmitVTTDefinition(llvm::GlobalVariable *VTT,
llvm::ArrayType::get(Int8PtrTy, Builder.getVTTComponents().size());
llvm::Constant *Init =
- llvm::ConstantArray::get(ArrayType, Builder.getVTTComponents().data(),
- Builder.getVTTComponents().size());
+ llvm::ConstantArray::get(ArrayType, Builder.getVTTComponents());
VTT->setInitializer(Init);
diff --git a/contrib/llvm/tools/clang/lib/CodeGen/CGVTables.cpp b/contrib/llvm/tools/clang/lib/CodeGen/CGVTables.cpp
index 9ac5e67..c161b79 100644
--- a/contrib/llvm/tools/clang/lib/CodeGen/CGVTables.cpp
+++ b/contrib/llvm/tools/clang/lib/CodeGen/CGVTables.cpp
@@ -2937,7 +2937,8 @@ void CodeGenVTables::MaybeEmitThunkAvailableExternally(GlobalDecl GD,
// We can't emit thunks for member functions with incomplete types.
const CXXMethodDecl *MD = cast<CXXMethodDecl>(GD.getDecl());
- if (CGM.getTypes().VerifyFuncTypeComplete(MD->getType().getTypePtr()))
+ if (!CGM.getTypes().isFuncTypeConvertible(
+ cast<FunctionType>(MD->getType().getTypePtr())))
return;
EmitThunk(GD, Thunk, /*UseAvailableExternallyLinkage=*/true);
@@ -3165,7 +3166,7 @@ CodeGenVTables::CreateVTableInitializer(const CXXRecordDecl *RD,
}
llvm::ArrayType *ArrayType = llvm::ArrayType::get(Int8PtrTy, NumComponents);
- return llvm::ConstantArray::get(ArrayType, Inits.data(), Inits.size());
+ return llvm::ConstantArray::get(ArrayType, Inits);
}
llvm::GlobalVariable *CodeGenVTables::GetAddrOfVTable(const CXXRecordDecl *RD) {
diff --git a/contrib/llvm/tools/clang/lib/CodeGen/CGVTables.h b/contrib/llvm/tools/clang/lib/CodeGen/CGVTables.h
index e830e9a..eff6e56 100644
--- a/contrib/llvm/tools/clang/lib/CodeGen/CGVTables.h
+++ b/contrib/llvm/tools/clang/lib/CodeGen/CGVTables.h
@@ -18,7 +18,7 @@
#include "llvm/GlobalVariable.h"
#include "clang/Basic/ABI.h"
#include "clang/AST/CharUnits.h"
-#include "GlobalDecl.h"
+#include "clang/AST/GlobalDecl.h"
namespace clang {
class CXXRecordDecl;
diff --git a/contrib/llvm/tools/clang/lib/CodeGen/CGValue.h b/contrib/llvm/tools/clang/lib/CodeGen/CGValue.h
index 7f77d55..4d0b841 100644
--- a/contrib/llvm/tools/clang/lib/CodeGen/CGValue.h
+++ b/contrib/llvm/tools/clang/lib/CodeGen/CGValue.h
@@ -101,8 +101,6 @@ public:
/// bitfields, this is not a simple LLVM pointer, it may be a pointer plus a
/// bitrange.
class LValue {
- // FIXME: alignment?
-
enum {
Simple, // This is a normal l-value, use getAddress().
VectorElt, // This is a vector element l-value (V[i]), use getVector*
@@ -128,6 +126,8 @@ class LValue {
const ObjCPropertyRefExpr *PropertyRefExpr;
};
+ QualType Type;
+
// 'const' is unused here
Qualifiers Quals;
@@ -156,8 +156,9 @@ class LValue {
llvm::MDNode *TBAAInfo;
private:
- void Initialize(Qualifiers Quals, unsigned Alignment = 0,
+ void Initialize(QualType Type, Qualifiers Quals, unsigned Alignment = 0,
llvm::MDNode *TBAAInfo = 0) {
+ this->Type = Type;
this->Quals = Quals;
this->Alignment = Alignment;
assert(this->Alignment == Alignment && "Alignment exceeds allowed max!");
@@ -182,6 +183,12 @@ public:
return Quals.getCVRQualifiers() & ~Qualifiers::Const;
}
+ QualType getType() const { return Type; }
+
+ Qualifiers::ObjCLifetime getObjCLifetime() const {
+ return Quals.getObjCLifetime();
+ }
+
bool isObjCIvar() const { return Ivar; }
void setObjCIvar(bool Value) { Ivar = Value; }
@@ -203,6 +210,10 @@ public:
bool isObjCStrong() const {
return Quals.getObjCGCAttr() == Qualifiers::Strong;
}
+
+ bool isVolatile() const {
+ return Quals.hasVolatile();
+ }
Expr *getBaseIvarExp() const { return BaseIvarExp; }
void setBaseIvarExp(Expr *V) { BaseIvarExp = V; }
@@ -219,6 +230,10 @@ public:
// simple lvalue
llvm::Value *getAddress() const { assert(isSimple()); return V; }
+ void setAddress(llvm::Value *address) {
+ assert(isSimple());
+ V = address;
+ }
// vector elt lvalue
llvm::Value *getVectorAddr() const { assert(isVectorElt()); return V; }
@@ -251,36 +266,36 @@ public:
return PropertyRefExpr;
}
- static LValue MakeAddr(llvm::Value *V, QualType T, unsigned Alignment,
- ASTContext &Context,
+ static LValue MakeAddr(llvm::Value *address, QualType type,
+ unsigned alignment, ASTContext &Context,
llvm::MDNode *TBAAInfo = 0) {
- Qualifiers Quals = T.getQualifiers();
- Quals.setObjCGCAttr(Context.getObjCGCAttrKind(T));
+ Qualifiers qs = type.getQualifiers();
+ qs.setObjCGCAttr(Context.getObjCGCAttrKind(type));
LValue R;
R.LVType = Simple;
- R.V = V;
- R.Initialize(Quals, Alignment, TBAAInfo);
+ R.V = address;
+ R.Initialize(type, qs, alignment, TBAAInfo);
return R;
}
static LValue MakeVectorElt(llvm::Value *Vec, llvm::Value *Idx,
- unsigned CVR) {
+ QualType type) {
LValue R;
R.LVType = VectorElt;
R.V = Vec;
R.VectorIdx = Idx;
- R.Initialize(Qualifiers::fromCVRMask(CVR));
+ R.Initialize(type, type.getQualifiers());
return R;
}
static LValue MakeExtVectorElt(llvm::Value *Vec, llvm::Constant *Elts,
- unsigned CVR) {
+ QualType type) {
LValue R;
R.LVType = ExtVectorElt;
R.V = Vec;
R.VectorElts = Elts;
- R.Initialize(Qualifiers::fromCVRMask(CVR));
+ R.Initialize(type, type.getQualifiers());
return R;
}
@@ -290,13 +305,14 @@ public:
/// bit-field.
/// \param Info - The information describing how to perform the bit-field
/// access.
- static LValue MakeBitfield(llvm::Value *BaseValue, const CGBitFieldInfo &Info,
- unsigned CVR) {
+ static LValue MakeBitfield(llvm::Value *BaseValue,
+ const CGBitFieldInfo &Info,
+ QualType type) {
LValue R;
R.LVType = BitField;
R.V = BaseValue;
R.BitFieldInfo = &Info;
- R.Initialize(Qualifiers::fromCVRMask(CVR));
+ R.Initialize(type, type.getQualifiers());
return R;
}
@@ -309,7 +325,7 @@ public:
R.LVType = PropertyRef;
R.V = Base;
R.PropertyRefExpr = E;
- R.Initialize(Qualifiers());
+ R.Initialize(QualType(), Qualifiers());
return R;
}
};
@@ -318,9 +334,11 @@ public:
class AggValueSlot {
/// The address.
llvm::Value *Addr;
+
+ // Qualifiers
+ Qualifiers Quals;
// Associated flags.
- bool VolatileFlag : 1;
bool LifetimeFlag : 1;
bool RequiresGCollection : 1;
@@ -335,25 +353,31 @@ public:
static AggValueSlot ignored() {
AggValueSlot AV;
AV.Addr = 0;
- AV.VolatileFlag = AV.LifetimeFlag = AV.RequiresGCollection = AV.IsZeroed =0;
+ AV.Quals = Qualifiers();
+ AV.LifetimeFlag = AV.RequiresGCollection = AV.IsZeroed =0;
return AV;
}
/// forAddr - Make a slot for an aggregate value.
///
/// \param Volatile - true if the slot should be volatile-initialized
+ ///
+ /// \param Qualifiers - The qualifiers that dictate how the slot
+ /// should be initialied. Only 'volatile' and the Objective-C
+ /// lifetime qualifiers matter.
+ ///
/// \param LifetimeExternallyManaged - true if the slot's lifetime
/// is being externally managed; false if a destructor should be
/// registered for any temporaries evaluated into the slot
/// \param RequiresGCollection - true if the slot is located
/// somewhere that ObjC GC calls should be emitted for
- static AggValueSlot forAddr(llvm::Value *Addr, bool Volatile,
+ static AggValueSlot forAddr(llvm::Value *Addr, Qualifiers Quals,
bool LifetimeExternallyManaged,
bool RequiresGCollection = false,
bool IsZeroed = false) {
AggValueSlot AV;
AV.Addr = Addr;
- AV.VolatileFlag = Volatile;
+ AV.Quals = Quals;
AV.LifetimeFlag = LifetimeExternallyManaged;
AV.RequiresGCollection = RequiresGCollection;
AV.IsZeroed = IsZeroed;
@@ -361,9 +385,10 @@ public:
}
static AggValueSlot forLValue(LValue LV, bool LifetimeExternallyManaged,
- bool RequiresGCollection = false) {
- return forAddr(LV.getAddress(), LV.isVolatileQualified(),
- LifetimeExternallyManaged, RequiresGCollection);
+ bool RequiresGCollection = false,
+ bool IsZeroed = false) {
+ return forAddr(LV.getAddress(), LV.getQuals(),
+ LifetimeExternallyManaged, RequiresGCollection, IsZeroed);
}
bool isLifetimeExternallyManaged() const {
@@ -373,8 +398,14 @@ public:
LifetimeFlag = Managed;
}
+ Qualifiers getQualifiers() const { return Quals; }
+
bool isVolatile() const {
- return VolatileFlag;
+ return Quals.hasVolatile();
+ }
+
+ Qualifiers::ObjCLifetime getObjCLifetime() const {
+ return Quals.getObjCLifetime();
}
bool requiresGCollection() const {
diff --git a/contrib/llvm/tools/clang/lib/CodeGen/CodeGenAction.cpp b/contrib/llvm/tools/clang/lib/CodeGen/CodeGenAction.cpp
index 62fa1f9..263e01e 100644
--- a/contrib/llvm/tools/clang/lib/CodeGen/CodeGenAction.cpp
+++ b/contrib/llvm/tools/clang/lib/CodeGen/CodeGenAction.cpp
@@ -34,6 +34,7 @@ namespace clang {
BackendAction Action;
const CodeGenOptions &CodeGenOpts;
const TargetOptions &TargetOpts;
+ const LangOptions &LangOpts;
llvm::raw_ostream *AsmOutStream;
ASTContext *Context;
@@ -46,13 +47,16 @@ namespace clang {
public:
BackendConsumer(BackendAction action, Diagnostic &_Diags,
const CodeGenOptions &compopts,
- const TargetOptions &targetopts, bool TimePasses,
+ const TargetOptions &targetopts,
+ const LangOptions &langopts,
+ bool TimePasses,
const std::string &infile, llvm::raw_ostream *OS,
LLVMContext &C) :
Diags(_Diags),
Action(action),
CodeGenOpts(compopts),
TargetOpts(targetopts),
+ LangOpts(langopts),
AsmOutStream(OS),
LLVMIRGeneration("LLVM IR Generation Time"),
Gen(CreateLLVMCodeGen(Diags, infile, compopts, C)) {
@@ -126,7 +130,7 @@ namespace clang {
void *OldContext = Ctx.getInlineAsmDiagnosticContext();
Ctx.setInlineAsmDiagnosticHandler(InlineAsmDiagHandler, this);
- EmitBackendOutput(Diags, CodeGenOpts, TargetOpts,
+ EmitBackendOutput(Diags, CodeGenOpts, TargetOpts, LangOpts,
TheModule.get(), Action, AsmOutStream);
Ctx.setInlineAsmDiagnosticHandler(OldHandler, OldContext);
@@ -285,6 +289,7 @@ ASTConsumer *CodeGenAction::CreateASTConsumer(CompilerInstance &CI,
BEConsumer =
new BackendConsumer(BA, CI.getDiagnostics(),
CI.getCodeGenOpts(), CI.getTargetOpts(),
+ CI.getLangOpts(),
CI.getFrontendOpts().ShowTimers, InFile, OS.take(),
*VMContext);
return BEConsumer;
@@ -332,7 +337,8 @@ void CodeGenAction::ExecuteAction() {
}
EmitBackendOutput(CI.getDiagnostics(), CI.getCodeGenOpts(),
- CI.getTargetOpts(), TheModule.get(),
+ CI.getTargetOpts(), CI.getLangOpts(),
+ TheModule.get(),
BA, OS);
return;
}
diff --git a/contrib/llvm/tools/clang/lib/CodeGen/CodeGenFunction.cpp b/contrib/llvm/tools/clang/lib/CodeGen/CodeGenFunction.cpp
index 150cb69..702897a 100644
--- a/contrib/llvm/tools/clang/lib/CodeGen/CodeGenFunction.cpp
+++ b/contrib/llvm/tools/clang/lib/CodeGen/CodeGenFunction.cpp
@@ -31,7 +31,7 @@ using namespace CodeGen;
CodeGenFunction::CodeGenFunction(CodeGenModule &cgm)
: CodeGenTypeCache(cgm), CGM(cgm),
Target(CGM.getContext().Target), Builder(cgm.getModule().getContext()),
- BlockInfo(0), BlockPointer(0),
+ AutoreleaseResult(false), BlockInfo(0), BlockPointer(0),
NormalCleanupDest(0), EHCleanupDest(0), NextCleanupDestIndex(1),
ExceptionSlot(0), EHSelectorSlot(0),
DebugInfo(0), DisableDebugInfo(false), DidCallStackSave(false),
@@ -45,11 +45,11 @@ CodeGenFunction::CodeGenFunction(CodeGenModule &cgm)
}
-const llvm::Type *CodeGenFunction::ConvertTypeForMem(QualType T) {
+llvm::Type *CodeGenFunction::ConvertTypeForMem(QualType T) {
return CGM.getTypes().ConvertTypeForMem(T);
}
-const llvm::Type *CodeGenFunction::ConvertType(QualType T) {
+llvm::Type *CodeGenFunction::ConvertType(QualType T) {
return CGM.getTypes().ConvertType(T);
}
@@ -142,6 +142,13 @@ void CodeGenFunction::FinishFunction(SourceLocation EndLoc) {
assert(BreakContinueStack.empty() &&
"mismatched push/pop in break/continue stack!");
+ // Pop any cleanups that might have been associated with the
+ // parameters. Do this in whatever block we're currently in; it's
+ // important to do this before we enter the return block or return
+ // edges will be *really* confused.
+ if (EHStack.stable_begin() != PrologueCleanupDepth)
+ PopCleanupBlocks(PrologueCleanupDepth);
+
// Emit function epilog (to return).
EmitReturnBlock();
@@ -206,15 +213,15 @@ bool CodeGenFunction::ShouldInstrumentFunction() {
/// function instrumentation is enabled.
void CodeGenFunction::EmitFunctionInstrumentation(const char *Fn) {
// void __cyg_profile_func_{enter,exit} (void *this_fn, void *call_site);
- const llvm::PointerType *PointerTy = Int8PtrTy;
- const llvm::Type *ProfileFuncArgs[] = { PointerTy, PointerTy };
+ llvm::PointerType *PointerTy = Int8PtrTy;
+ llvm::Type *ProfileFuncArgs[] = { PointerTy, PointerTy };
const llvm::FunctionType *FunctionTy =
llvm::FunctionType::get(llvm::Type::getVoidTy(getLLVMContext()),
ProfileFuncArgs, false);
llvm::Constant *F = CGM.CreateRuntimeFunction(FunctionTy, Fn);
llvm::CallInst *CallSite = Builder.CreateCall(
- CGM.getIntrinsic(llvm::Intrinsic::returnaddress, 0, 0),
+ CGM.getIntrinsic(llvm::Intrinsic::returnaddress),
llvm::ConstantInt::get(Int32Ty, 0),
"callsite");
@@ -311,9 +318,19 @@ void CodeGenFunction::StartFunction(GlobalDecl GD, QualType RetTy,
ReturnValue = CurFn->arg_begin();
} else {
ReturnValue = CreateIRTemp(RetTy, "retval");
+
+ // Tell the epilog emitter to autorelease the result. We do this
+ // now so that various specialized functions can suppress it
+ // during their IR-generation.
+ if (getLangOptions().ObjCAutoRefCount &&
+ !CurFnInfo->isReturnsRetained() &&
+ RetTy->isObjCRetainableType())
+ AutoreleaseResult = true;
}
EmitStartEHSpec(CurCodeDecl);
+
+ PrologueCleanupDepth = EHStack.stable_begin();
EmitFunctionProlog(*CurFnInfo, CurFn, Args);
if (D && isa<CXXMethodDecl>(D) && cast<CXXMethodDecl>(D)->isInstance())
@@ -326,7 +343,7 @@ void CodeGenFunction::StartFunction(GlobalDecl GD, QualType RetTy,
QualType Ty = (*i)->getType();
if (Ty->isVariablyModifiedType())
- EmitVLASize(Ty);
+ EmitVariablyModifiedType(Ty);
}
}
@@ -692,13 +709,20 @@ CodeGenFunction::EmitNullInitialization(llvm::Value *DestPtr, QualType Ty) {
if (const VariableArrayType *vlaType =
dyn_cast_or_null<VariableArrayType>(
getContext().getAsArrayType(Ty))) {
- SizeVal = GetVLASize(vlaType);
+ QualType eltType;
+ llvm::Value *numElts;
+ llvm::tie(numElts, eltType) = getVLASize(vlaType);
+
+ SizeVal = numElts;
+ CharUnits eltSize = getContext().getTypeSizeInChars(eltType);
+ if (!eltSize.isOne())
+ SizeVal = Builder.CreateNUWMul(SizeVal, CGM.getSize(eltSize));
vla = vlaType;
} else {
return;
}
} else {
- SizeVal = llvm::ConstantInt::get(IntPtrTy, Size.getQuantity());
+ SizeVal = CGM.getSize(Size);
vla = 0;
}
@@ -761,60 +785,198 @@ llvm::BasicBlock *CodeGenFunction::GetIndirectGotoBlock() {
return IndirectBranch->getParent();
}
-llvm::Value *CodeGenFunction::GetVLASize(const VariableArrayType *VAT) {
- llvm::Value *&SizeEntry = VLASizeMap[VAT->getSizeExpr()];
+/// Computes the length of an array in elements, as well as the base
+/// element type and a properly-typed first element pointer.
+llvm::Value *CodeGenFunction::emitArrayLength(const ArrayType *origArrayType,
+ QualType &baseType,
+ llvm::Value *&addr) {
+ const ArrayType *arrayType = origArrayType;
+
+ // If it's a VLA, we have to load the stored size. Note that
+ // this is the size of the VLA in bytes, not its size in elements.
+ llvm::Value *numVLAElements = 0;
+ if (isa<VariableArrayType>(arrayType)) {
+ numVLAElements = getVLASize(cast<VariableArrayType>(arrayType)).first;
+
+ // Walk into all VLAs. This doesn't require changes to addr,
+ // which has type T* where T is the first non-VLA element type.
+ do {
+ QualType elementType = arrayType->getElementType();
+ arrayType = getContext().getAsArrayType(elementType);
+
+ // If we only have VLA components, 'addr' requires no adjustment.
+ if (!arrayType) {
+ baseType = elementType;
+ return numVLAElements;
+ }
+ } while (isa<VariableArrayType>(arrayType));
- assert(SizeEntry && "Did not emit size for type");
- return SizeEntry;
-}
+ // We get out here only if we find a constant array type
+ // inside the VLA.
+ }
-llvm::Value *CodeGenFunction::EmitVLASize(QualType Ty) {
- assert(Ty->isVariablyModifiedType() &&
- "Must pass variably modified type to EmitVLASizes!");
+ // We have some number of constant-length arrays, so addr should
+ // have LLVM type [M x [N x [...]]]*. Build a GEP that walks
+ // down to the first element of addr.
+ llvm::SmallVector<llvm::Value*, 8> gepIndices;
- EnsureInsertPoint();
+ // GEP down to the array type.
+ llvm::ConstantInt *zero = Builder.getInt32(0);
+ gepIndices.push_back(zero);
+
+ // It's more efficient to calculate the count from the LLVM
+ // constant-length arrays than to re-evaluate the array bounds.
+ uint64_t countFromCLAs = 1;
+
+ const llvm::ArrayType *llvmArrayType =
+ cast<llvm::ArrayType>(
+ cast<llvm::PointerType>(addr->getType())->getElementType());
+ while (true) {
+ assert(isa<ConstantArrayType>(arrayType));
+ assert(cast<ConstantArrayType>(arrayType)->getSize().getZExtValue()
+ == llvmArrayType->getNumElements());
+
+ gepIndices.push_back(zero);
+ countFromCLAs *= llvmArrayType->getNumElements();
+
+ llvmArrayType =
+ dyn_cast<llvm::ArrayType>(llvmArrayType->getElementType());
+ if (!llvmArrayType) break;
+
+ arrayType = getContext().getAsArrayType(arrayType->getElementType());
+ assert(arrayType && "LLVM and Clang types are out-of-synch");
+ }
+
+ baseType = arrayType->getElementType();
+
+ // Create the actual GEP.
+ addr = Builder.CreateInBoundsGEP(addr, gepIndices.begin(),
+ gepIndices.end(), "array.begin");
- if (const VariableArrayType *VAT = getContext().getAsVariableArrayType(Ty)) {
- // unknown size indication requires no size computation.
- if (!VAT->getSizeExpr())
- return 0;
- llvm::Value *&SizeEntry = VLASizeMap[VAT->getSizeExpr()];
+ llvm::Value *numElements
+ = llvm::ConstantInt::get(SizeTy, countFromCLAs);
- if (!SizeEntry) {
- const llvm::Type *SizeTy = ConvertType(getContext().getSizeType());
+ // If we had any VLA dimensions, factor them in.
+ if (numVLAElements)
+ numElements = Builder.CreateNUWMul(numVLAElements, numElements);
- // Get the element size;
- QualType ElemTy = VAT->getElementType();
- llvm::Value *ElemSize;
- if (ElemTy->isVariableArrayType())
- ElemSize = EmitVLASize(ElemTy);
- else
- ElemSize = llvm::ConstantInt::get(SizeTy,
- getContext().getTypeSizeInChars(ElemTy).getQuantity());
+ return numElements;
+}
+
+std::pair<llvm::Value*, QualType>
+CodeGenFunction::getVLASize(QualType type) {
+ const VariableArrayType *vla = getContext().getAsVariableArrayType(type);
+ assert(vla && "type was not a variable array type!");
+ return getVLASize(vla);
+}
+
+std::pair<llvm::Value*, QualType>
+CodeGenFunction::getVLASize(const VariableArrayType *type) {
+ // The number of elements so far; always size_t.
+ llvm::Value *numElements = 0;
- llvm::Value *NumElements = EmitScalarExpr(VAT->getSizeExpr());
- NumElements = Builder.CreateIntCast(NumElements, SizeTy, false, "tmp");
+ QualType elementType;
+ do {
+ elementType = type->getElementType();
+ llvm::Value *vlaSize = VLASizeMap[type->getSizeExpr()];
+ assert(vlaSize && "no size for VLA!");
+ assert(vlaSize->getType() == SizeTy);
- SizeEntry = Builder.CreateMul(ElemSize, NumElements);
+ if (!numElements) {
+ numElements = vlaSize;
+ } else {
+ // It's undefined behavior if this wraps around, so mark it that way.
+ numElements = Builder.CreateNUWMul(numElements, vlaSize);
}
+ } while ((type = getContext().getAsVariableArrayType(elementType)));
- return SizeEntry;
- }
+ return std::pair<llvm::Value*,QualType>(numElements, elementType);
+}
- if (const ArrayType *AT = dyn_cast<ArrayType>(Ty)) {
- EmitVLASize(AT->getElementType());
- return 0;
- }
+void CodeGenFunction::EmitVariablyModifiedType(QualType type) {
+ assert(type->isVariablyModifiedType() &&
+ "Must pass variably modified type to EmitVLASizes!");
- if (const ParenType *PT = dyn_cast<ParenType>(Ty)) {
- EmitVLASize(PT->getInnerType());
- return 0;
- }
+ EnsureInsertPoint();
+
+ // We're going to walk down into the type and look for VLA
+ // expressions.
+ type = type.getCanonicalType();
+ do {
+ assert(type->isVariablyModifiedType());
+
+ const Type *ty = type.getTypePtr();
+ switch (ty->getTypeClass()) {
+#define TYPE(Class, Base)
+#define ABSTRACT_TYPE(Class, Base)
+#define NON_CANONICAL_TYPE(Class, Base) case Type::Class:
+#define DEPENDENT_TYPE(Class, Base) case Type::Class:
+#define NON_CANONICAL_UNLESS_DEPENDENT_TYPE(Class, Base) case Type::Class:
+#include "clang/AST/TypeNodes.def"
+ llvm_unreachable("unexpected dependent or non-canonical type!");
+
+ // These types are never variably-modified.
+ case Type::Builtin:
+ case Type::Complex:
+ case Type::Vector:
+ case Type::ExtVector:
+ case Type::Record:
+ case Type::Enum:
+ case Type::ObjCObject:
+ case Type::ObjCInterface:
+ case Type::ObjCObjectPointer:
+ llvm_unreachable("type class is never variably-modified!");
+
+ case Type::Pointer:
+ type = cast<PointerType>(ty)->getPointeeType();
+ break;
+
+ case Type::BlockPointer:
+ type = cast<BlockPointerType>(ty)->getPointeeType();
+ break;
+
+ case Type::LValueReference:
+ case Type::RValueReference:
+ type = cast<ReferenceType>(ty)->getPointeeType();
+ break;
+
+ case Type::MemberPointer:
+ type = cast<MemberPointerType>(ty)->getPointeeType();
+ break;
+
+ case Type::ConstantArray:
+ case Type::IncompleteArray:
+ // Losing element qualification here is fine.
+ type = cast<ArrayType>(ty)->getElementType();
+ break;
+
+ case Type::VariableArray: {
+ // Losing element qualification here is fine.
+ const VariableArrayType *vat = cast<VariableArrayType>(ty);
+
+ // Unknown size indication requires no size computation.
+ // Otherwise, evaluate and record it.
+ if (const Expr *size = vat->getSizeExpr()) {
+ // It's possible that we might have emitted this already,
+ // e.g. with a typedef and a pointer to it.
+ llvm::Value *&entry = VLASizeMap[size];
+ if (!entry) {
+ // Always zexting here would be wrong if it weren't
+ // undefined behavior to have a negative bound.
+ entry = Builder.CreateIntCast(EmitScalarExpr(size), SizeTy,
+ /*signed*/ false);
+ }
+ }
+ type = vat->getElementType();
+ break;
+ }
- const PointerType *PT = Ty->getAs<PointerType>();
- assert(PT && "unknown VM type!");
- EmitVLASize(PT->getPointeeType());
- return 0;
+ case Type::FunctionProto:
+ case Type::FunctionNoProto:
+ type = cast<FunctionType>(ty)->getResultType();
+ break;
+ }
+ } while (type->isVariablyModifiedType());
}
llvm::Value* CodeGenFunction::EmitVAListRef(const Expr* E) {
diff --git a/contrib/llvm/tools/clang/lib/CodeGen/CodeGenFunction.h b/contrib/llvm/tools/clang/lib/CodeGen/CodeGenFunction.h
index bb8fd8e..f27ed94 100644
--- a/contrib/llvm/tools/clang/lib/CodeGen/CodeGenFunction.h
+++ b/contrib/llvm/tools/clang/lib/CodeGen/CodeGenFunction.h
@@ -18,8 +18,10 @@
#include "clang/AST/ExprCXX.h"
#include "clang/AST/ExprObjC.h"
#include "clang/AST/CharUnits.h"
+#include "clang/Frontend/CodeGenOptions.h"
#include "clang/Basic/ABI.h"
#include "clang/Basic/TargetInfo.h"
+#include "llvm/ADT/ArrayRef.h"
#include "llvm/ADT/DenseMap.h"
#include "llvm/ADT/SmallVector.h"
#include "llvm/Support/ValueHandle.h"
@@ -63,6 +65,7 @@ namespace clang {
class ObjCAtTryStmt;
class ObjCAtThrowStmt;
class ObjCAtSynchronizedStmt;
+ class ObjCAutoreleasePoolStmt;
namespace CodeGen {
class CodeGenTypes;
@@ -179,15 +182,39 @@ public:
/// Cleanup implementations should generally be declared in an
/// anonymous namespace.
class Cleanup {
+ // Anchor the construction vtable.
+ virtual void anchor();
public:
- // Anchor the construction vtable. We use the destructor because
- // gcc gives an obnoxious warning if there are virtual methods
- // with an accessible non-virtual destructor. Unfortunately,
- // declaring this destructor makes it non-trivial, but there
- // doesn't seem to be any other way around this warning.
- //
- // This destructor will never be called.
- virtual ~Cleanup();
+ /// Generation flags.
+ class Flags {
+ enum {
+ F_IsForEH = 0x1,
+ F_IsNormalCleanupKind = 0x2,
+ F_IsEHCleanupKind = 0x4
+ };
+ unsigned flags;
+
+ public:
+ Flags() : flags(0) {}
+
+ /// isForEH - true if the current emission is for an EH cleanup.
+ bool isForEHCleanup() const { return flags & F_IsForEH; }
+ bool isForNormalCleanup() const { return !isForEHCleanup(); }
+ void setIsForEHCleanup() { flags |= F_IsForEH; }
+
+ bool isNormalCleanupKind() const { return flags & F_IsNormalCleanupKind; }
+ void setIsNormalCleanupKind() { flags |= F_IsNormalCleanupKind; }
+
+ /// isEHCleanupKind - true if the cleanup was pushed as an EH
+ /// cleanup.
+ bool isEHCleanupKind() const { return flags & F_IsEHCleanupKind; }
+ void setIsEHCleanupKind() { flags |= F_IsEHCleanupKind; }
+ };
+
+ // Provide a virtual destructor to suppress a very common warning
+ // that unfortunately cannot be suppressed without this. Cleanups
+ // should not rely on this destructor ever being called.
+ virtual ~Cleanup() {}
/// Emit the cleanup. For normal cleanups, this is run in the
/// same EH context as when the cleanup was pushed, i.e. the
@@ -196,29 +223,7 @@ public:
///
// \param IsForEHCleanup true if this is for an EH cleanup, false
/// if for a normal cleanup.
- virtual void Emit(CodeGenFunction &CGF, bool IsForEHCleanup) = 0;
- };
-
- /// UnconditionalCleanupN stores its N parameters and just passes
- /// them to the real cleanup function.
- template <class T, class A0>
- class UnconditionalCleanup1 : public Cleanup {
- A0 a0;
- public:
- UnconditionalCleanup1(A0 a0) : a0(a0) {}
- void Emit(CodeGenFunction &CGF, bool IsForEHCleanup) {
- T::Emit(CGF, IsForEHCleanup, a0);
- }
- };
-
- template <class T, class A0, class A1>
- class UnconditionalCleanup2 : public Cleanup {
- A0 a0; A1 a1;
- public:
- UnconditionalCleanup2(A0 a0, A1 a1) : a0(a0), a1(a1) {}
- void Emit(CodeGenFunction &CGF, bool IsForEHCleanup) {
- T::Emit(CGF, IsForEHCleanup, a0, a1);
- }
+ virtual void Emit(CodeGenFunction &CGF, Flags flags) = 0;
};
/// ConditionalCleanupN stores the saved form of its N parameters,
@@ -228,9 +233,9 @@ public:
typedef typename DominatingValue<A0>::saved_type A0_saved;
A0_saved a0_saved;
- void Emit(CodeGenFunction &CGF, bool IsForEHCleanup) {
+ void Emit(CodeGenFunction &CGF, Flags flags) {
A0 a0 = DominatingValue<A0>::restore(CGF, a0_saved);
- T::Emit(CGF, IsForEHCleanup, a0);
+ T(a0).Emit(CGF, flags);
}
public:
@@ -245,10 +250,10 @@ public:
A0_saved a0_saved;
A1_saved a1_saved;
- void Emit(CodeGenFunction &CGF, bool IsForEHCleanup) {
+ void Emit(CodeGenFunction &CGF, Flags flags) {
A0 a0 = DominatingValue<A0>::restore(CGF, a0_saved);
A1 a1 = DominatingValue<A1>::restore(CGF, a1_saved);
- T::Emit(CGF, IsForEHCleanup, a0, a1);
+ T(a0, a1).Emit(CGF, flags);
}
public:
@@ -256,6 +261,51 @@ public:
: a0_saved(a0), a1_saved(a1) {}
};
+ template <class T, class A0, class A1, class A2>
+ class ConditionalCleanup3 : public Cleanup {
+ typedef typename DominatingValue<A0>::saved_type A0_saved;
+ typedef typename DominatingValue<A1>::saved_type A1_saved;
+ typedef typename DominatingValue<A2>::saved_type A2_saved;
+ A0_saved a0_saved;
+ A1_saved a1_saved;
+ A2_saved a2_saved;
+
+ void Emit(CodeGenFunction &CGF, Flags flags) {
+ A0 a0 = DominatingValue<A0>::restore(CGF, a0_saved);
+ A1 a1 = DominatingValue<A1>::restore(CGF, a1_saved);
+ A2 a2 = DominatingValue<A2>::restore(CGF, a2_saved);
+ T(a0, a1, a2).Emit(CGF, flags);
+ }
+
+ public:
+ ConditionalCleanup3(A0_saved a0, A1_saved a1, A2_saved a2)
+ : a0_saved(a0), a1_saved(a1), a2_saved(a2) {}
+ };
+
+ template <class T, class A0, class A1, class A2, class A3>
+ class ConditionalCleanup4 : public Cleanup {
+ typedef typename DominatingValue<A0>::saved_type A0_saved;
+ typedef typename DominatingValue<A1>::saved_type A1_saved;
+ typedef typename DominatingValue<A2>::saved_type A2_saved;
+ typedef typename DominatingValue<A3>::saved_type A3_saved;
+ A0_saved a0_saved;
+ A1_saved a1_saved;
+ A2_saved a2_saved;
+ A3_saved a3_saved;
+
+ void Emit(CodeGenFunction &CGF, Flags flags) {
+ A0 a0 = DominatingValue<A0>::restore(CGF, a0_saved);
+ A1 a1 = DominatingValue<A1>::restore(CGF, a1_saved);
+ A2 a2 = DominatingValue<A2>::restore(CGF, a2_saved);
+ A3 a3 = DominatingValue<A3>::restore(CGF, a3_saved);
+ T(a0, a1, a2, a3).Emit(CGF, flags);
+ }
+
+ public:
+ ConditionalCleanup4(A0_saved a0, A1_saved a1, A2_saved a2, A3_saved a3)
+ : a0_saved(a0), a1_saved(a1), a2_saved(a2), a3_saved(a3) {}
+ };
+
private:
// The implementation for this class is in CGException.h and
// CGException.cpp; the definition is here because it's used as a
@@ -568,6 +618,10 @@ public:
/// CurGD - The GlobalDecl for the current function being compiled.
GlobalDecl CurGD;
+ /// PrologueCleanupDepth - The cleanup depth enclosing all the
+ /// cleanups associated with the parameters.
+ EHScopeStack::stable_iterator PrologueCleanupDepth;
+
/// ReturnBlock - Unified return block.
JumpDest ReturnBlock;
@@ -584,6 +638,9 @@ public:
bool CatchUndefined;
+ /// In ARC, whether we should autorelease the return value.
+ bool AutoreleaseResult;
+
const CodeGen::CGBlockInfo *BlockInfo;
llvm::Value *BlockPointer;
@@ -626,16 +683,28 @@ public:
/// rethrows.
llvm::SmallVector<llvm::Value*, 8> ObjCEHValueStack;
- // A struct holding information about a finally block's IR
- // generation. For now, doesn't actually hold anything.
- struct FinallyInfo {
- };
+ /// A class controlling the emission of a finally block.
+ class FinallyInfo {
+ /// Where the catchall's edge through the cleanup should go.
+ JumpDest RethrowDest;
+
+ /// A function to call to enter the catch.
+ llvm::Constant *BeginCatchFn;
- FinallyInfo EnterFinallyBlock(const Stmt *Stmt,
- llvm::Constant *BeginCatchFn,
- llvm::Constant *EndCatchFn,
- llvm::Constant *RethrowFn);
- void ExitFinallyBlock(FinallyInfo &FinallyInfo);
+ /// An i1 variable indicating whether or not the @finally is
+ /// running for an exception.
+ llvm::AllocaInst *ForEHVar;
+
+ /// An i8* variable into which the exception pointer to rethrow
+ /// has been saved.
+ llvm::AllocaInst *SavedExnVar;
+
+ public:
+ void enter(CodeGenFunction &CGF, const Stmt *Finally,
+ llvm::Constant *beginCatchFn, llvm::Constant *endCatchFn,
+ llvm::Constant *rethrowFn);
+ void exit(CodeGenFunction &CGF);
+ };
/// pushFullExprCleanup - Push a cleanup to be run at the end of the
/// current full-expression. Safe against the possibility that
@@ -644,10 +713,8 @@ public:
void pushFullExprCleanup(CleanupKind kind, A0 a0) {
// If we're not in a conditional branch, or if none of the
// arguments requires saving, then use the unconditional cleanup.
- if (!isInConditionalBranch()) {
- typedef EHScopeStack::UnconditionalCleanup1<T, A0> CleanupType;
- return EHStack.pushCleanup<CleanupType>(kind, a0);
- }
+ if (!isInConditionalBranch())
+ return EHStack.pushCleanup<T>(kind, a0);
typename DominatingValue<A0>::saved_type a0_saved = saveValueInCond(a0);
@@ -663,10 +730,8 @@ public:
void pushFullExprCleanup(CleanupKind kind, A0 a0, A1 a1) {
// If we're not in a conditional branch, or if none of the
// arguments requires saving, then use the unconditional cleanup.
- if (!isInConditionalBranch()) {
- typedef EHScopeStack::UnconditionalCleanup2<T, A0, A1> CleanupType;
- return EHStack.pushCleanup<CleanupType>(kind, a0, a1);
- }
+ if (!isInConditionalBranch())
+ return EHStack.pushCleanup<T>(kind, a0, a1);
typename DominatingValue<A0>::saved_type a0_saved = saveValueInCond(a0);
typename DominatingValue<A1>::saved_type a1_saved = saveValueInCond(a1);
@@ -676,6 +741,48 @@ public:
initFullExprCleanup();
}
+ /// pushFullExprCleanup - Push a cleanup to be run at the end of the
+ /// current full-expression. Safe against the possibility that
+ /// we're currently inside a conditionally-evaluated expression.
+ template <class T, class A0, class A1, class A2>
+ void pushFullExprCleanup(CleanupKind kind, A0 a0, A1 a1, A2 a2) {
+ // If we're not in a conditional branch, or if none of the
+ // arguments requires saving, then use the unconditional cleanup.
+ if (!isInConditionalBranch()) {
+ return EHStack.pushCleanup<T>(kind, a0, a1, a2);
+ }
+
+ typename DominatingValue<A0>::saved_type a0_saved = saveValueInCond(a0);
+ typename DominatingValue<A1>::saved_type a1_saved = saveValueInCond(a1);
+ typename DominatingValue<A2>::saved_type a2_saved = saveValueInCond(a2);
+
+ typedef EHScopeStack::ConditionalCleanup3<T, A0, A1, A2> CleanupType;
+ EHStack.pushCleanup<CleanupType>(kind, a0_saved, a1_saved, a2_saved);
+ initFullExprCleanup();
+ }
+
+ /// pushFullExprCleanup - Push a cleanup to be run at the end of the
+ /// current full-expression. Safe against the possibility that
+ /// we're currently inside a conditionally-evaluated expression.
+ template <class T, class A0, class A1, class A2, class A3>
+ void pushFullExprCleanup(CleanupKind kind, A0 a0, A1 a1, A2 a2, A3 a3) {
+ // If we're not in a conditional branch, or if none of the
+ // arguments requires saving, then use the unconditional cleanup.
+ if (!isInConditionalBranch()) {
+ return EHStack.pushCleanup<T>(kind, a0, a1, a2, a3);
+ }
+
+ typename DominatingValue<A0>::saved_type a0_saved = saveValueInCond(a0);
+ typename DominatingValue<A1>::saved_type a1_saved = saveValueInCond(a1);
+ typename DominatingValue<A2>::saved_type a2_saved = saveValueInCond(a2);
+ typename DominatingValue<A3>::saved_type a3_saved = saveValueInCond(a3);
+
+ typedef EHScopeStack::ConditionalCleanup4<T, A0, A1, A2, A3> CleanupType;
+ EHStack.pushCleanup<CleanupType>(kind, a0_saved, a1_saved,
+ a2_saved, a3_saved);
+ initFullExprCleanup();
+ }
+
/// PushDestructorCleanup - Push a cleanup to call the
/// complete-object destructor of an object of the given type at the
/// given address. Does nothing if T is not a C++ class type with a
@@ -1048,6 +1155,9 @@ public:
void disableDebugInfo() { DisableDebugInfo = true; }
void enableDebugInfo() { DisableDebugInfo = false; }
+ bool shouldUseFusedARCCalls() {
+ return CGM.getCodeGenOpts().OptimizationLevel == 0;
+ }
const LangOptions &getLangOptions() const { return CGM.getLangOptions(); }
@@ -1075,6 +1185,57 @@ public:
llvm::LLVMContext &getLLVMContext() { return CGM.getLLVMContext(); }
//===--------------------------------------------------------------------===//
+ // Cleanups
+ //===--------------------------------------------------------------------===//
+
+ typedef void Destroyer(CodeGenFunction &CGF, llvm::Value *addr, QualType ty);
+
+ void pushIrregularPartialArrayCleanup(llvm::Value *arrayBegin,
+ llvm::Value *arrayEndPointer,
+ QualType elementType,
+ Destroyer &destroyer);
+ void pushRegularPartialArrayCleanup(llvm::Value *arrayBegin,
+ llvm::Value *arrayEnd,
+ QualType elementType,
+ Destroyer &destroyer);
+
+ void pushDestroy(QualType::DestructionKind dtorKind,
+ llvm::Value *addr, QualType type);
+ void pushDestroy(CleanupKind kind, llvm::Value *addr, QualType type,
+ Destroyer &destroyer, bool useEHCleanupForArray);
+ void emitDestroy(llvm::Value *addr, QualType type, Destroyer &destroyer,
+ bool useEHCleanupForArray);
+ llvm::Function *generateDestroyHelper(llvm::Constant *addr,
+ QualType type,
+ Destroyer &destroyer,
+ bool useEHCleanupForArray);
+ void emitArrayDestroy(llvm::Value *begin, llvm::Value *end,
+ QualType type, Destroyer &destroyer,
+ bool checkZeroLength, bool useEHCleanup);
+
+ Destroyer &getDestroyer(QualType::DestructionKind destructionKind);
+
+ /// Determines whether an EH cleanup is required to destroy a type
+ /// with the given destruction kind.
+ bool needsEHCleanup(QualType::DestructionKind kind) {
+ switch (kind) {
+ case QualType::DK_none:
+ return false;
+ case QualType::DK_cxx_destructor:
+ case QualType::DK_objc_weak_lifetime:
+ return getLangOptions().Exceptions;
+ case QualType::DK_objc_strong_lifetime:
+ return getLangOptions().Exceptions &&
+ CGM.getCodeGenOpts().ObjCAutoRefCountExceptions;
+ }
+ llvm_unreachable("bad destruction kind");
+ }
+
+ CleanupKind getCleanupKind(QualType::DestructionKind kind) {
+ return (needsEHCleanup(kind) ? NormalAndEHCleanup : NormalCleanup);
+ }
+
+ //===--------------------------------------------------------------------===//
// Objective-C
//===--------------------------------------------------------------------===//
@@ -1236,9 +1397,9 @@ public:
/// a terminate scope encloses a try.
llvm::BasicBlock *getTerminateHandler();
- const llvm::Type *ConvertTypeForMem(QualType T);
- const llvm::Type *ConvertType(QualType T);
- const llvm::Type *ConvertType(const TypeDecl *T) {
+ llvm::Type *ConvertTypeForMem(QualType T);
+ llvm::Type *ConvertType(QualType T);
+ llvm::Type *ConvertType(const TypeDecl *T) {
return ConvertType(getContext().getTypeDeclType(T));
}
@@ -1345,7 +1506,8 @@ public:
/// CreateAggTemp - Create a temporary memory object for the given
/// aggregate type.
AggValueSlot CreateAggTemp(QualType T, const llvm::Twine &Name = "tmp") {
- return AggValueSlot::forAddr(CreateMemTemp(T, Name), false, false);
+ return AggValueSlot::forAddr(CreateMemTemp(T, Name), T.getQualifiers(),
+ false);
}
/// Emit a cast to void* in the appropriate address space.
@@ -1379,14 +1541,12 @@ public:
/// EmitAnyExprToMem - Emits the code necessary to evaluate an
/// arbitrary expression into the given memory location.
void EmitAnyExprToMem(const Expr *E, llvm::Value *Location,
- bool IsLocationVolatile,
- bool IsInitializer);
+ Qualifiers Quals, bool IsInitializer);
/// EmitExprAsInit - Emits the code necessary to initialize a
/// location in memory with the given initializer.
- void EmitExprAsInit(const Expr *init, const VarDecl *var,
- llvm::Value *loc, CharUnits alignment,
- bool capturedByInit);
+ void EmitExprAsInit(const Expr *init, const ValueDecl *D,
+ LValue lvalue, bool capturedByInit);
/// EmitAggregateCopy - Emit an aggrate copy.
///
@@ -1451,16 +1611,24 @@ public:
// instruction in LLVM instead once it works well enough.
llvm::Value *EmitVAArg(llvm::Value *VAListAddr, QualType Ty);
- /// EmitVLASize - Generate code for any VLA size expressions that might occur
- /// in a variably modified type. If Ty is a VLA, will return the value that
- /// corresponds to the size in bytes of the VLA type. Will return 0 otherwise.
+ /// emitArrayLength - Compute the length of an array, even if it's a
+ /// VLA, and drill down to the base element type.
+ llvm::Value *emitArrayLength(const ArrayType *arrayType,
+ QualType &baseType,
+ llvm::Value *&addr);
+
+ /// EmitVLASize - Capture all the sizes for the VLA expressions in
+ /// the given variably-modified type and store them in the VLASizeMap.
///
/// This function can be called with a null (unreachable) insert point.
- llvm::Value *EmitVLASize(QualType Ty);
+ void EmitVariablyModifiedType(QualType Ty);
- // GetVLASize - Returns an LLVM value that corresponds to the size in bytes
- // of a variable length array type.
- llvm::Value *GetVLASize(const VariableArrayType *);
+ /// getVLASize - Returns an LLVM value that corresponds to the size,
+ /// in non-variably-sized elements, of a variable length array type,
+ /// plus that largest non-variably-sized element type. Assumes that
+ /// the type has already been emitted with EmitVariablyModifiedType.
+ std::pair<llvm::Value*,QualType> getVLASize(const VariableArrayType *vla);
+ std::pair<llvm::Value*,QualType> getVLASize(QualType vla);
/// LoadCXXThis - Load the value of 'this'. This function is only valid while
/// generating code for an C++ member function.
@@ -1535,17 +1703,7 @@ public:
CallExpr::const_arg_iterator ArgEnd,
bool ZeroInitialization = false);
- void EmitCXXAggrDestructorCall(const CXXDestructorDecl *D,
- const ArrayType *Array,
- llvm::Value *This);
-
- void EmitCXXAggrDestructorCall(const CXXDestructorDecl *D,
- llvm::Value *NumElements,
- llvm::Value *This);
-
- llvm::Function *GenerateCXXAggrDestructorHelper(const CXXDestructorDecl *D,
- const ArrayType *Array,
- llvm::Value *This);
+ static Destroyer destroyCXXObject;
void EmitCXXDestructorCall(const CXXDestructorDecl *D, CXXDtorType Type,
bool ForVirtualBase, llvm::Value *This);
@@ -1584,6 +1742,10 @@ public:
/// This function can be called with a null (unreachable) insert point.
void EmitVarDecl(const VarDecl &D);
+ void EmitScalarInit(const Expr *init, const ValueDecl *D,
+ LValue lvalue, bool capturedByInit);
+ void EmitScalarInit(llvm::Value *init, LValue lvalue);
+
typedef void SpecialInitFn(CodeGenFunction &Init, const VarDecl &D,
llvm::Value *Address);
@@ -1639,6 +1801,8 @@ public:
AutoVarEmission EmitAutoVarAlloca(const VarDecl &var);
void EmitAutoVarInit(const AutoVarEmission &emission);
void EmitAutoVarCleanups(const AutoVarEmission &emission);
+ void emitAutoVarTypeCleanup(const AutoVarEmission &emission,
+ QualType::DestructionKind dtorKind);
void EmitStaticVarDecl(const VarDecl &D,
llvm::GlobalValue::LinkageTypes Linkage);
@@ -1709,6 +1873,7 @@ public:
void EmitObjCAtTryStmt(const ObjCAtTryStmt &S);
void EmitObjCAtThrowStmt(const ObjCAtThrowStmt &S);
void EmitObjCAtSynchronizedStmt(const ObjCAtSynchronizedStmt &S);
+ void EmitObjCAutoreleasePoolStmt(const ObjCAutoreleasePoolStmt &S);
llvm::Constant *getUnwindResumeFn();
llvm::Constant *getUnwindResumeOrRethrowFn();
@@ -1775,6 +1940,12 @@ public:
unsigned Alignment, QualType Ty,
llvm::MDNode *TBAAInfo = 0);
+ /// EmitLoadOfScalar - Load a scalar value from an address, taking
+ /// care to appropriately convert from the memory representation to
+ /// the LLVM value representation. The l-value must be a simple
+ /// l-value.
+ llvm::Value *EmitLoadOfScalar(LValue lvalue);
+
/// EmitStoreOfScalar - Store a scalar value to an address, taking
/// care to appropriately convert from the memory representation to
/// the LLVM value representation.
@@ -1782,21 +1953,26 @@ public:
bool Volatile, unsigned Alignment, QualType Ty,
llvm::MDNode *TBAAInfo = 0);
+ /// EmitStoreOfScalar - Store a scalar value to an address, taking
+ /// care to appropriately convert from the memory representation to
+ /// the LLVM value representation. The l-value must be a simple
+ /// l-value.
+ void EmitStoreOfScalar(llvm::Value *value, LValue lvalue);
+
/// EmitLoadOfLValue - Given an expression that represents a value lvalue,
/// this method emits the address of the lvalue, then loads the result as an
/// rvalue, returning the rvalue.
- RValue EmitLoadOfLValue(LValue V, QualType LVType);
- RValue EmitLoadOfExtVectorElementLValue(LValue V, QualType LVType);
- RValue EmitLoadOfBitfieldLValue(LValue LV, QualType ExprType);
+ RValue EmitLoadOfLValue(LValue V);
+ RValue EmitLoadOfExtVectorElementLValue(LValue V);
+ RValue EmitLoadOfBitfieldLValue(LValue LV);
RValue EmitLoadOfPropertyRefLValue(LValue LV,
ReturnValueSlot Return = ReturnValueSlot());
/// EmitStoreThroughLValue - Store the specified rvalue into the specified
/// lvalue, where both are guaranteed to the have the same type, and that type
/// is 'Ty'.
- void EmitStoreThroughLValue(RValue Src, LValue Dst, QualType Ty);
- void EmitStoreThroughExtVectorComponentLValue(RValue Src, LValue Dst,
- QualType Ty);
+ void EmitStoreThroughLValue(RValue Src, LValue Dst);
+ void EmitStoreThroughExtVectorComponentLValue(RValue Src, LValue Dst);
void EmitStoreThroughPropertyRefLValue(RValue Src, LValue Dst);
/// EmitStoreThroughLValue - Store Src into Dst with same constraints as
@@ -1805,7 +1981,7 @@ public:
/// \param Result [out] - If non-null, this will be set to a Value* for the
/// bit-field contents after the store, appropriate for use as the result of
/// an assignment to the bit-field.
- void EmitStoreThroughBitfieldLValue(RValue Src, LValue Dst, QualType Ty,
+ void EmitStoreThroughBitfieldLValue(RValue Src, LValue Dst,
llvm::Value **Result=0);
/// Emit an l-value for an assignment (simple or compound) of complex type.
@@ -1832,6 +2008,7 @@ public:
LValue EmitConditionalOperatorLValue(const AbstractConditionalOperator *E);
LValue EmitCastLValue(const CastExpr *E);
LValue EmitNullInitializationLValue(const CXXScalarValueInitExpr *E);
+ LValue EmitMaterializeTemporaryExpr(const MaterializeTemporaryExpr *E);
LValue EmitOpaqueValueLValue(const OpaqueValueExpr *e);
llvm::Value *EmitIvarOffset(const ObjCInterfaceDecl *Interface,
@@ -1897,8 +2074,9 @@ public:
ReturnValueSlot ReturnValue = ReturnValueSlot());
llvm::CallSite EmitCallOrInvoke(llvm::Value *Callee,
- llvm::Value * const *ArgBegin,
- llvm::Value * const *ArgEnd,
+ llvm::ArrayRef<llvm::Value *> Args,
+ const llvm::Twine &Name = "");
+ llvm::CallSite EmitCallOrInvoke(llvm::Value *Callee,
const llvm::Twine &Name = "");
llvm::Value *BuildVirtualCall(const CXXMethodDecl *MD, llvm::Value *This,
@@ -1961,6 +2139,59 @@ public:
RValue EmitObjCMessageExpr(const ObjCMessageExpr *E,
ReturnValueSlot Return = ReturnValueSlot());
+ /// Retrieves the default cleanup kind for an ARC cleanup.
+ /// Except under -fobjc-arc-eh, ARC cleanups are normal-only.
+ CleanupKind getARCCleanupKind() {
+ return CGM.getCodeGenOpts().ObjCAutoRefCountExceptions
+ ? NormalAndEHCleanup : NormalCleanup;
+ }
+
+ // ARC primitives.
+ void EmitARCInitWeak(llvm::Value *value, llvm::Value *addr);
+ void EmitARCDestroyWeak(llvm::Value *addr);
+ llvm::Value *EmitARCLoadWeak(llvm::Value *addr);
+ llvm::Value *EmitARCLoadWeakRetained(llvm::Value *addr);
+ llvm::Value *EmitARCStoreWeak(llvm::Value *value, llvm::Value *addr,
+ bool ignored);
+ void EmitARCCopyWeak(llvm::Value *dst, llvm::Value *src);
+ void EmitARCMoveWeak(llvm::Value *dst, llvm::Value *src);
+ llvm::Value *EmitARCRetainAutorelease(QualType type, llvm::Value *value);
+ llvm::Value *EmitARCRetainAutoreleaseNonBlock(llvm::Value *value);
+ llvm::Value *EmitARCStoreStrong(LValue lvalue, llvm::Value *value,
+ bool ignored);
+ llvm::Value *EmitARCStoreStrongCall(llvm::Value *addr, llvm::Value *value,
+ bool ignored);
+ llvm::Value *EmitARCRetain(QualType type, llvm::Value *value);
+ llvm::Value *EmitARCRetainNonBlock(llvm::Value *value);
+ llvm::Value *EmitARCRetainBlock(llvm::Value *value);
+ void EmitARCRelease(llvm::Value *value, bool precise);
+ llvm::Value *EmitARCAutorelease(llvm::Value *value);
+ llvm::Value *EmitARCAutoreleaseReturnValue(llvm::Value *value);
+ llvm::Value *EmitARCRetainAutoreleaseReturnValue(llvm::Value *value);
+ llvm::Value *EmitARCRetainAutoreleasedReturnValue(llvm::Value *value);
+
+ std::pair<LValue,llvm::Value*>
+ EmitARCStoreAutoreleasing(const BinaryOperator *e);
+ std::pair<LValue,llvm::Value*>
+ EmitARCStoreStrong(const BinaryOperator *e, bool ignored);
+
+ llvm::Value *EmitObjCProduceObject(QualType T, llvm::Value *Ptr);
+ llvm::Value *EmitObjCConsumeObject(QualType T, llvm::Value *Ptr);
+ llvm::Value *EmitObjCExtendObjectLifetime(QualType T, llvm::Value *Ptr);
+
+ llvm::Value *EmitARCRetainScalarExpr(const Expr *expr);
+ llvm::Value *EmitARCRetainAutoreleaseScalarExpr(const Expr *expr);
+
+ static Destroyer destroyARCStrongImprecise;
+ static Destroyer destroyARCStrongPrecise;
+ static Destroyer destroyARCWeak;
+
+ void EmitObjCAutoreleasePoolPop(llvm::Value *Ptr);
+ llvm::Value *EmitObjCAutoreleasePoolPush();
+ llvm::Value *EmitObjCMRRAutoreleasePoolPush();
+ void EmitObjCAutoreleasePoolCleanup(llvm::Value *Ptr);
+ void EmitObjCMRRAutoreleasePoolPop(llvm::Value *Ptr);
+
/// EmitReferenceBindingToExpr - Emits a reference binding to the passed in
/// expression. Will emit a temporary variable if E is not an LValue.
RValue EmitReferenceBindingToExpr(const Expr* E,
@@ -2002,6 +2233,10 @@ public:
void EmitGCMemmoveCollectable(llvm::Value *DestPtr, llvm::Value *SrcPtr,
QualType Ty);
+ /// EmitExtendGCLifetime - Given a pointer to an Objective-C object,
+ /// make sure it survives garbage collection until this point.
+ void EmitExtendGCLifetime(llvm::Value *object);
+
/// EmitComplexExpr - Emit the computation of the specified expression of
/// complex type, returning the result.
ComplexPairTy EmitComplexExpr(const Expr *E,
@@ -2135,7 +2370,8 @@ private:
/// Ty, into individual arguments on the provided vector \arg Args. See
/// ABIArgInfo::Expand.
void ExpandTypeToArgs(QualType Ty, RValue Src,
- llvm::SmallVector<llvm::Value*, 16> &Args);
+ llvm::SmallVector<llvm::Value*, 16> &Args,
+ llvm::FunctionType *IRFuncTy);
llvm::Value* EmitAsmInput(const AsmStmt &S,
const TargetInfo::ConstraintInfo &Info,
diff --git a/contrib/llvm/tools/clang/lib/CodeGen/CodeGenModule.cpp b/contrib/llvm/tools/clang/lib/CodeGen/CodeGenModule.cpp
index 7a1a968..0668039 100644
--- a/contrib/llvm/tools/clang/lib/CodeGen/CodeGenModule.cpp
+++ b/contrib/llvm/tools/clang/lib/CodeGen/CodeGenModule.cpp
@@ -62,9 +62,9 @@ CodeGenModule::CodeGenModule(ASTContext &C, const CodeGenOptions &CGO,
: Context(C), Features(C.getLangOptions()), CodeGenOpts(CGO), TheModule(M),
TheTargetData(TD), TheTargetCodeGenInfo(0), Diags(diags),
ABI(createCXXABI(*this)),
- Types(C, M, TD, getTargetCodeGenInfo().getABIInfo(), ABI),
+ Types(C, M, TD, getTargetCodeGenInfo().getABIInfo(), ABI, CGO),
TBAA(0),
- VTables(*this), Runtime(0), DebugInfo(0),
+ VTables(*this), Runtime(0), DebugInfo(0), ARCData(0), RRData(0),
CFConstantStringClassRef(0), ConstantStringClassRef(0),
VMContext(M.getContext()),
NSConcreteGlobalBlockDecl(0), NSConcreteStackBlockDecl(0),
@@ -88,6 +88,10 @@ CodeGenModule::CodeGenModule(ASTContext &C, const CodeGenOptions &CGO,
Block.GlobalUniqueCount = 0;
+ if (C.getLangOptions().ObjCAutoRefCount)
+ ARCData = new ARCEntrypoints();
+ RRData = new RREntrypoints();
+
// Initialize the type cache.
llvm::LLVMContext &LLVMContext = M.getContext();
VoidTy = llvm::Type::getVoidTy(LLVMContext);
@@ -108,6 +112,8 @@ CodeGenModule::~CodeGenModule() {
delete &ABI;
delete TBAA;
delete DebugInfo;
+ delete ARCData;
+ delete RRData;
}
void CodeGenModule::createObjCRuntime() {
@@ -190,6 +196,10 @@ void CodeGenModule::ErrorUnsupported(const Decl *D, const char *Type,
getDiags().Report(Context.getFullLoc(D->getLocation()), DiagID) << Msg;
}
+llvm::ConstantInt *CodeGenModule::getSize(CharUnits size) {
+ return llvm::ConstantInt::get(SizeTy, size.getQuantity());
+}
+
void CodeGenModule::setGlobalVisibility(llvm::GlobalValue *GV,
const NamedDecl *D) const {
// Internal definitions always have default visibility.
@@ -347,8 +357,8 @@ void CodeGenModule::EmitCtorList(const CtorList &Fns, const char *GlobalName) {
llvm::Type *CtorPFTy = llvm::PointerType::getUnqual(CtorFTy);
// Get the type of a ctor entry, { i32, void ()* }.
- llvm::StructType* CtorStructTy =
- llvm::StructType::get(VMContext, llvm::Type::getInt32Ty(VMContext),
+ llvm::StructType *CtorStructTy =
+ llvm::StructType::get(llvm::Type::getInt32Ty(VMContext),
llvm::PointerType::getUnqual(CtorFTy), NULL);
// Construct the constructor and destructor arrays.
@@ -670,7 +680,7 @@ llvm::Constant *CodeGenModule::EmitAnnotateAttr(llvm::GlobalValue *GV,
llvm::ConstantExpr::getBitCast(unitGV, SBP),
llvm::ConstantInt::get(llvm::Type::getInt32Ty(VMContext), LineNo)
};
- return llvm::ConstantStruct::get(VMContext, Fields, 4, false);
+ return llvm::ConstantStruct::getAnon(Fields);
}
bool CodeGenModule::MayDeferGeneration(const ValueDecl *Global) {
@@ -830,7 +840,8 @@ void CodeGenModule::EmitGlobalDefinition(GlobalDecl GD) {
llvm::Constant *
CodeGenModule::GetOrCreateLLVMFunction(llvm::StringRef MangledName,
const llvm::Type *Ty,
- GlobalDecl D, bool ForVTable) {
+ GlobalDecl D, bool ForVTable,
+ llvm::Attributes ExtraAttrs) {
// Lookup the entry, lazily creating it if necessary.
llvm::GlobalValue *Entry = GetGlobalValue(MangledName);
if (Entry) {
@@ -846,8 +857,7 @@ CodeGenModule::GetOrCreateLLVMFunction(llvm::StringRef MangledName,
return Entry;
// Make sure the result is of the correct type.
- const llvm::Type *PTy = llvm::PointerType::getUnqual(Ty);
- return llvm::ConstantExpr::getBitCast(Entry, PTy);
+ return llvm::ConstantExpr::getBitCast(Entry, Ty->getPointerTo());
}
// This function doesn't have a complete type (for example, the return
@@ -869,6 +879,8 @@ CodeGenModule::GetOrCreateLLVMFunction(llvm::StringRef MangledName,
assert(F->getName() == MangledName && "name was uniqued!");
if (D.getDecl())
SetFunctionAttributes(D, F, IsIncompleteFunction);
+ if (ExtraAttrs != llvm::Attribute::None)
+ F->addFnAttr(ExtraAttrs);
// This is the first use or definition of a mangled name. If there is a
// deferred decl with this name, remember that we need to emit it at the end
@@ -915,7 +927,7 @@ CodeGenModule::GetOrCreateLLVMFunction(llvm::StringRef MangledName,
return F;
}
- const llvm::Type *PTy = llvm::PointerType::getUnqual(Ty);
+ llvm::Type *PTy = llvm::PointerType::getUnqual(Ty);
return llvm::ConstantExpr::getBitCast(F, PTy);
}
@@ -937,8 +949,10 @@ llvm::Constant *CodeGenModule::GetAddrOfFunction(GlobalDecl GD,
/// type and name.
llvm::Constant *
CodeGenModule::CreateRuntimeFunction(const llvm::FunctionType *FTy,
- llvm::StringRef Name) {
- return GetOrCreateLLVMFunction(Name, FTy, GlobalDecl(), /*ForVTable=*/false);
+ llvm::StringRef Name,
+ llvm::Attributes ExtraAttrs) {
+ return GetOrCreateLLVMFunction(Name, FTy, GlobalDecl(), /*ForVTable=*/false,
+ ExtraAttrs);
}
static bool DeclIsConstantGlobal(ASTContext &Context, const VarDecl *D,
@@ -1340,7 +1354,8 @@ CodeGenModule::GetLLVMLinkageVarDefinition(const VarDecl *D,
((!CodeGenOpts.NoCommon && !D->getAttr<NoCommonAttr>()) ||
D->getAttr<CommonAttr>()) &&
!D->hasExternalStorage() && !D->getInit() &&
- !D->getAttr<SectionAttr>() && !D->isThreadSpecified()) {
+ !D->getAttr<SectionAttr>() && !D->isThreadSpecified() &&
+ !D->getAttr<WeakImportAttr>()) {
// Thread local vars aren't considered common linkage.
return llvm::GlobalVariable::CommonLinkage;
}
@@ -1398,8 +1413,7 @@ static void ReplaceUsesOfNonProtoTypeWithRealFunction(llvm::GlobalValue *Old,
// Okay, we can transform this. Create the new call instruction and copy
// over the required information.
ArgList.append(CS.arg_begin(), CS.arg_begin() + ArgNo);
- llvm::CallInst *NewCall = llvm::CallInst::Create(NewFn, ArgList.begin(),
- ArgList.end(), "", CI);
+ llvm::CallInst *NewCall = llvm::CallInst::Create(NewFn, ArgList, "", CI);
ArgList.clear();
if (!NewCall->getType()->isVoidTy())
NewCall->takeName(CI);
@@ -1426,7 +1440,7 @@ void CodeGenModule::EmitGlobalFunctionDefinition(GlobalDecl GD) {
bool variadic = false;
if (const FunctionProtoType *fpt = D->getType()->getAs<FunctionProtoType>())
variadic = fpt->isVariadic();
- const llvm::FunctionType *Ty = getTypes().GetFunctionType(FI, variadic, false);
+ const llvm::FunctionType *Ty = getTypes().GetFunctionType(FI, variadic);
// Get or create the prototype for the function.
llvm::Constant *Entry = GetAddrOfFunction(GD, Ty);
@@ -1597,10 +1611,10 @@ llvm::Value *CodeGenModule::getBuiltinLibFunction(const FunctionDecl *FD,
return GetOrCreateLLVMFunction(Name, Ty, D, /*ForVTable=*/false);
}
-llvm::Function *CodeGenModule::getIntrinsic(unsigned IID,const llvm::Type **Tys,
- unsigned NumTys) {
- return llvm::Intrinsic::getDeclaration(&getModule(),
- (llvm::Intrinsic::ID)IID, Tys, NumTys);
+llvm::Function *CodeGenModule::getIntrinsic(unsigned IID,
+ llvm::ArrayRef<llvm::Type*> Tys) {
+ return llvm::Intrinsic::getDeclaration(&getModule(), (llvm::Intrinsic::ID)IID,
+ Tys);
}
static llvm::StringMapEntry<llvm::Constant*> &
@@ -1997,6 +2011,7 @@ void CodeGenModule::EmitObjCIvarInitializations(ObjCImplementationDecl *D) {
false, true, false, ObjCMethodDecl::Required);
D->addInstanceMethod(DTORMethod);
CodeGenFunction(*this).GenerateObjCCtorDtorMethod(D, DTORMethod, false);
+ D->setHasCXXStructors(true);
}
// If the implementation doesn't have any ivar initializers, we don't need
@@ -2015,6 +2030,7 @@ void CodeGenModule::EmitObjCIvarInitializations(ObjCImplementationDecl *D) {
ObjCMethodDecl::Required);
D->addInstanceMethod(CTORMethod);
CodeGenFunction(*this).GenerateObjCCtorDtorMethod(D, CTORMethod, true);
+ D->setHasCXXStructors(true);
}
/// EmitNamespace - Emit all declarations in a namespace.
@@ -2276,7 +2292,7 @@ llvm::Constant *CodeGenModule::getBlockObjectDispose() {
}
// Otherwise construct the function by hand.
- const llvm::Type *args[] = { Int8PtrTy, Int32Ty };
+ llvm::Type *args[] = { Int8PtrTy, Int32Ty };
const llvm::FunctionType *fty
= llvm::FunctionType::get(VoidTy, args, false);
return BlockObjectDispose =
@@ -2295,7 +2311,7 @@ llvm::Constant *CodeGenModule::getBlockObjectAssign() {
}
// Otherwise construct the function by hand.
- const llvm::Type *args[] = { Int8PtrTy, Int8PtrTy, Int32Ty };
+ llvm::Type *args[] = { Int8PtrTy, Int8PtrTy, Int32Ty };
const llvm::FunctionType *fty
= llvm::FunctionType::get(VoidTy, args, false);
return BlockObjectAssign =
diff --git a/contrib/llvm/tools/clang/lib/CodeGen/CodeGenModule.h b/contrib/llvm/tools/clang/lib/CodeGen/CodeGenModule.h
index 779a352..86fb6d4 100644
--- a/contrib/llvm/tools/clang/lib/CodeGen/CodeGenModule.h
+++ b/contrib/llvm/tools/clang/lib/CodeGen/CodeGenModule.h
@@ -19,10 +19,10 @@
#include "clang/AST/Attr.h"
#include "clang/AST/DeclCXX.h"
#include "clang/AST/DeclObjC.h"
+#include "clang/AST/GlobalDecl.h"
#include "clang/AST/Mangle.h"
#include "CGVTables.h"
#include "CodeGenTypes.h"
-#include "GlobalDecl.h"
#include "llvm/Module.h"
#include "llvm/ADT/DenseMap.h"
#include "llvm/ADT/StringMap.h"
@@ -33,6 +33,7 @@
namespace llvm {
class Module;
class Constant;
+ class ConstantInt;
class Function;
class GlobalValue;
class TargetData;
@@ -98,31 +99,31 @@ namespace CodeGen {
struct CodeGenTypeCache {
/// void
- const llvm::Type *VoidTy;
+ llvm::Type *VoidTy;
/// i8, i32, and i64
- const llvm::IntegerType *Int8Ty, *Int32Ty, *Int64Ty;
+ llvm::IntegerType *Int8Ty, *Int32Ty, *Int64Ty;
/// int
- const llvm::IntegerType *IntTy;
+ llvm::IntegerType *IntTy;
/// intptr_t, size_t, and ptrdiff_t, which we assume are the same size.
union {
- const llvm::IntegerType *IntPtrTy;
- const llvm::IntegerType *SizeTy;
- const llvm::IntegerType *PtrDiffTy;
+ llvm::IntegerType *IntPtrTy;
+ llvm::IntegerType *SizeTy;
+ llvm::IntegerType *PtrDiffTy;
};
/// void* in address space 0
union {
- const llvm::PointerType *VoidPtrTy;
- const llvm::PointerType *Int8PtrTy;
+ llvm::PointerType *VoidPtrTy;
+ llvm::PointerType *Int8PtrTy;
};
/// void** in address space 0
union {
- const llvm::PointerType *VoidPtrPtrTy;
- const llvm::PointerType *Int8PtrPtrTy;
+ llvm::PointerType *VoidPtrPtrTy;
+ llvm::PointerType *Int8PtrPtrTy;
};
/// The width of a pointer into the generic address space.
@@ -131,6 +132,71 @@ namespace CodeGen {
/// The alignment of a pointer into the generic address space.
unsigned char PointerAlignInBytes;
};
+
+struct RREntrypoints {
+ RREntrypoints() { memset(this, 0, sizeof(*this)); }
+ /// void objc_autoreleasePoolPop(void*);
+ llvm::Constant *objc_autoreleasePoolPop;
+
+ /// void *objc_autoreleasePoolPush(void);
+ llvm::Constant *objc_autoreleasePoolPush;
+};
+
+struct ARCEntrypoints {
+ ARCEntrypoints() { memset(this, 0, sizeof(*this)); }
+
+ /// id objc_autorelease(id);
+ llvm::Constant *objc_autorelease;
+
+ /// id objc_autoreleaseReturnValue(id);
+ llvm::Constant *objc_autoreleaseReturnValue;
+
+ /// void objc_copyWeak(id *dest, id *src);
+ llvm::Constant *objc_copyWeak;
+
+ /// void objc_destroyWeak(id*);
+ llvm::Constant *objc_destroyWeak;
+
+ /// id objc_initWeak(id*, id);
+ llvm::Constant *objc_initWeak;
+
+ /// id objc_loadWeak(id*);
+ llvm::Constant *objc_loadWeak;
+
+ /// id objc_loadWeakRetained(id*);
+ llvm::Constant *objc_loadWeakRetained;
+
+ /// void objc_moveWeak(id *dest, id *src);
+ llvm::Constant *objc_moveWeak;
+
+ /// id objc_retain(id);
+ llvm::Constant *objc_retain;
+
+ /// id objc_retainAutorelease(id);
+ llvm::Constant *objc_retainAutorelease;
+
+ /// id objc_retainAutoreleaseReturnValue(id);
+ llvm::Constant *objc_retainAutoreleaseReturnValue;
+
+ /// id objc_retainAutoreleasedReturnValue(id);
+ llvm::Constant *objc_retainAutoreleasedReturnValue;
+
+ /// id objc_retainBlock(id);
+ llvm::Constant *objc_retainBlock;
+
+ /// void objc_release(id);
+ llvm::Constant *objc_release;
+
+ /// id objc_storeStrong(id*, id);
+ llvm::Constant *objc_storeStrong;
+
+ /// id objc_storeWeak(id*, id);
+ llvm::Constant *objc_storeWeak;
+
+ /// A void(void) inline asm to use to mark that the return value of
+ /// a call will be immediately retain.
+ llvm::InlineAsm *retainAutoreleasedReturnValueMarker;
+};
/// CodeGenModule - This class organizes the cross-function state that is used
/// while generating LLVM code.
@@ -157,6 +223,8 @@ class CodeGenModule : public CodeGenTypeCache {
CGObjCRuntime* Runtime;
CGDebugInfo* DebugInfo;
+ ARCEntrypoints *ARCData;
+ RREntrypoints *RRData;
// WeakRefReferences - A set of references that have only been seen via
// a weakref so far. This is used to remove the weak of the reference if we ever
@@ -244,8 +312,8 @@ class CodeGenModule : public CodeGenTypeCache {
llvm::Constant *BlockObjectAssign;
llvm::Constant *BlockObjectDispose;
- const llvm::Type *BlockDescriptorType;
- const llvm::Type *GenericBlockLiteralType;
+ llvm::Type *BlockDescriptorType;
+ llvm::Type *GenericBlockLiteralType;
struct {
int GlobalUniqueCount;
@@ -275,6 +343,16 @@ public:
/// getCXXABI() - Return a reference to the configured C++ ABI.
CGCXXABI &getCXXABI() { return ABI; }
+ ARCEntrypoints &getARCEntrypoints() const {
+ assert(getLangOptions().ObjCAutoRefCount && ARCData != 0);
+ return *ARCData;
+ }
+
+ RREntrypoints &getRREntrypoints() const {
+ assert(RRData != 0);
+ return *RRData;
+ }
+
llvm::Value *getStaticLocalDeclAddress(const VarDecl *VD) {
return StaticLocalDeclMap[VD];
}
@@ -305,6 +383,9 @@ public:
static void DecorateInstruction(llvm::Instruction *Inst,
llvm::MDNode *TBAAInfo);
+ /// getSize - Emit the given number of characters as a value of type size_t.
+ llvm::ConstantInt *getSize(CharUnits numChars);
+
/// setGlobalVisibility - Set the visibility for the given LLVM
/// GlobalValue.
void setGlobalVisibility(llvm::GlobalValue *GV, const NamedDecl *D) const;
@@ -422,10 +503,10 @@ public:
/// getBlockDescriptorType - Fetches the type of a generic block
/// descriptor.
- const llvm::Type *getBlockDescriptorType();
+ llvm::Type *getBlockDescriptorType();
/// getGenericBlockLiteralType - The type of a generic block literal.
- const llvm::Type *getGenericBlockLiteralType();
+ llvm::Type *getGenericBlockLiteralType();
/// GetAddrOfGlobalBlock - Gets the address of a block which
/// requires no captures.
@@ -474,7 +555,7 @@ public:
/// created).
llvm::Constant *GetAddrOfConstantCString(const std::string &str,
const char *GlobalName=0);
-
+
/// GetAddrOfCXXConstructor - Return the address of the constructor of the
/// given type.
llvm::GlobalValue *GetAddrOfCXXConstructor(const CXXConstructorDecl *ctor,
@@ -492,8 +573,8 @@ public:
llvm::Value *getBuiltinLibFunction(const FunctionDecl *FD,
unsigned BuiltinID);
- llvm::Function *getIntrinsic(unsigned IID, const llvm::Type **Tys = 0,
- unsigned NumTys = 0);
+ llvm::Function *getIntrinsic(unsigned IID, llvm::ArrayRef<llvm::Type*> Tys =
+ llvm::ArrayRef<llvm::Type*>());
/// EmitTopLevelDecl - Emit code for a single top level declaration.
void EmitTopLevelDecl(Decl *D);
@@ -514,7 +595,9 @@ public:
/// CreateRuntimeFunction - Create a new runtime function with the specified
/// type and name.
llvm::Constant *CreateRuntimeFunction(const llvm::FunctionType *Ty,
- llvm::StringRef Name);
+ llvm::StringRef Name,
+ llvm::Attributes ExtraAttrs =
+ llvm::Attribute::None);
/// CreateRuntimeVariable - Create a new runtime global variable with the
/// specified type and name.
llvm::Constant *CreateRuntimeVariable(const llvm::Type *Ty,
@@ -642,7 +725,9 @@ private:
llvm::Constant *GetOrCreateLLVMFunction(llvm::StringRef MangledName,
const llvm::Type *Ty,
GlobalDecl D,
- bool ForVTable);
+ bool ForVTable,
+ llvm::Attributes ExtraAttrs =
+ llvm::Attribute::None);
llvm::Constant *GetOrCreateLLVMGlobal(llvm::StringRef MangledName,
const llvm::PointerType *PTy,
const VarDecl *D,
diff --git a/contrib/llvm/tools/clang/lib/CodeGen/CodeGenTypes.cpp b/contrib/llvm/tools/clang/lib/CodeGen/CodeGenTypes.cpp
index 8db6fe5..764688f 100644
--- a/contrib/llvm/tools/clang/lib/CodeGen/CodeGenTypes.cpp
+++ b/contrib/llvm/tools/clang/lib/CodeGen/CodeGenTypes.cpp
@@ -28,9 +28,10 @@ using namespace CodeGen;
CodeGenTypes::CodeGenTypes(ASTContext &Ctx, llvm::Module& M,
const llvm::TargetData &TD, const ABIInfo &Info,
- CGCXXABI &CXXABI)
+ CGCXXABI &CXXABI, const CodeGenOptions &CGO)
: Context(Ctx), Target(Ctx.Target), TheModule(M), TheTargetData(TD),
- TheABIInfo(Info), TheCXXABI(CXXABI) {
+ TheABIInfo(Info), TheCXXABI(CXXABI), CodeGenOpts(CGO) {
+ SkippedLayout = false;
}
CodeGenTypes::~CodeGenTypes() {
@@ -44,28 +45,8 @@ CodeGenTypes::~CodeGenTypes() {
delete &*I++;
}
-/// HandleLateResolvedPointers - For top-level ConvertType calls, this handles
-/// pointers that are referenced but have not been converted yet. This is used
-/// to handle cyclic structures properly.
-void CodeGenTypes::HandleLateResolvedPointers() {
- assert(!PointersToResolve.empty() && "No pointers to resolve!");
-
- // Any pointers that were converted deferred evaluation of their pointee type,
- // creating an opaque type instead. This is in order to avoid problems with
- // circular types. Loop through all these defered pointees, if any, and
- // resolve them now.
- while (!PointersToResolve.empty()) {
- std::pair<QualType, llvm::OpaqueType*> P = PointersToResolve.pop_back_val();
-
- // We can handle bare pointers here because we know that the only pointers
- // to the Opaque type are P.second and from other types. Refining the
- // opqaue type away will invalidate P.second, but we don't mind :).
- const llvm::Type *NT = ConvertTypeForMemRecursive(P.first);
- P.second->refineAbstractTypeTo(NT);
- }
-}
-
-void CodeGenTypes::addRecordTypeName(const RecordDecl *RD, const llvm::Type *Ty,
+void CodeGenTypes::addRecordTypeName(const RecordDecl *RD,
+ llvm::StructType *Ty,
llvm::StringRef suffix) {
llvm::SmallString<256> TypeName;
llvm::raw_svector_ostream OS(TypeName);
@@ -93,47 +74,15 @@ void CodeGenTypes::addRecordTypeName(const RecordDecl *RD, const llvm::Type *Ty,
if (!suffix.empty())
OS << suffix;
- TheModule.addTypeName(OS.str(), Ty);
-}
-
-/// ConvertType - Convert the specified type to its LLVM form.
-const llvm::Type *CodeGenTypes::ConvertType(QualType T, bool IsRecursive) {
- const llvm::Type *Result = ConvertTypeRecursive(T);
-
- // If this is a top-level call to ConvertType and sub-conversions caused
- // pointers to get lazily built as opaque types, resolve the pointers, which
- // might cause Result to be merged away.
- if (!IsRecursive && !PointersToResolve.empty()) {
- llvm::PATypeHolder ResultHandle = Result;
- HandleLateResolvedPointers();
- Result = ResultHandle;
- }
- return Result;
-}
-
-const llvm::Type *CodeGenTypes::ConvertTypeRecursive(QualType T) {
- T = Context.getCanonicalType(T);
-
- // See if type is already cached.
- llvm::DenseMap<const Type *, llvm::PATypeHolder>::iterator
- I = TypeCache.find(T.getTypePtr());
- // If type is found in map and this is not a definition for a opaque
- // place holder type then use it. Otherwise, convert type T.
- if (I != TypeCache.end())
- return I->second.get();
-
- const llvm::Type *ResultType = ConvertNewType(T);
- TypeCache.insert(std::make_pair(T.getTypePtr(),
- llvm::PATypeHolder(ResultType)));
- return ResultType;
+ Ty->setName(OS.str());
}
/// ConvertTypeForMem - Convert type T into a llvm::Type. This differs from
/// ConvertType in that it is used to convert to the memory representation for
/// a type. For example, the scalar representation for _Bool is i1, but the
/// memory representation is usually i8 or i32, depending on the target.
-const llvm::Type *CodeGenTypes::ConvertTypeForMem(QualType T, bool IsRecursive){
- const llvm::Type *R = ConvertType(T, IsRecursive);
+llvm::Type *CodeGenTypes::ConvertTypeForMem(QualType T){
+ llvm::Type *R = ConvertType(T);
// If this is a non-bool type, don't map it.
if (!R->isIntegerTy(1))
@@ -142,69 +91,178 @@ const llvm::Type *CodeGenTypes::ConvertTypeForMem(QualType T, bool IsRecursive){
// Otherwise, return an integer of the target-specified size.
return llvm::IntegerType::get(getLLVMContext(),
(unsigned)Context.getTypeSize(T));
+}
+
+/// isRecordLayoutComplete - Return true if the specified type is already
+/// completely laid out.
+bool CodeGenTypes::isRecordLayoutComplete(const Type *Ty) const {
+ llvm::DenseMap<const Type*, llvm::StructType *>::const_iterator I =
+ RecordDeclTypes.find(Ty);
+ return I != RecordDeclTypes.end() && !I->second->isOpaque();
}
-// Code to verify a given function type is complete, i.e. the return type
-// and all of the argument types are complete.
-const TagType *CodeGenTypes::VerifyFuncTypeComplete(const Type* T) {
- const FunctionType *FT = cast<FunctionType>(T);
- if (const TagType* TT = FT->getResultType()->getAs<TagType>())
- if (!TT->getDecl()->isDefinition())
- return TT;
- if (const FunctionProtoType *FPT = dyn_cast<FunctionProtoType>(T))
- for (unsigned i = 0; i < FPT->getNumArgs(); i++)
- if (const TagType* TT = FPT->getArgType(i)->getAs<TagType>())
- if (!TT->getDecl()->isDefinition())
- return TT;
- return 0;
+static bool
+isSafeToConvert(QualType T, CodeGenTypes &CGT,
+ llvm::SmallPtrSet<const RecordDecl*, 16> &AlreadyChecked);
+
+
+/// isSafeToConvert - Return true if it is safe to convert the specified record
+/// decl to IR and lay it out, false if doing so would cause us to get into a
+/// recursive compilation mess.
+static bool
+isSafeToConvert(const RecordDecl *RD, CodeGenTypes &CGT,
+ llvm::SmallPtrSet<const RecordDecl*, 16> &AlreadyChecked) {
+ // If we have already checked this type (maybe the same type is used by-value
+ // multiple times in multiple structure fields, don't check again.
+ if (!AlreadyChecked.insert(RD)) return true;
+
+ const Type *Key = CGT.getContext().getTagDeclType(RD).getTypePtr();
+
+ // If this type is already laid out, converting it is a noop.
+ if (CGT.isRecordLayoutComplete(Key)) return true;
+
+ // If this type is currently being laid out, we can't recursively compile it.
+ if (CGT.isRecordBeingLaidOut(Key))
+ return false;
+
+ // If this type would require laying out bases that are currently being laid
+ // out, don't do it. This includes virtual base classes which get laid out
+ // when a class is translated, even though they aren't embedded by-value into
+ // the class.
+ if (const CXXRecordDecl *CRD = dyn_cast<CXXRecordDecl>(RD)) {
+ for (CXXRecordDecl::base_class_const_iterator I = CRD->bases_begin(),
+ E = CRD->bases_end(); I != E; ++I)
+ if (!isSafeToConvert(I->getType()->getAs<RecordType>()->getDecl(),
+ CGT, AlreadyChecked))
+ return false;
+ }
+
+ // If this type would require laying out members that are currently being laid
+ // out, don't do it.
+ for (RecordDecl::field_iterator I = RD->field_begin(),
+ E = RD->field_end(); I != E; ++I)
+ if (!isSafeToConvert(I->getType(), CGT, AlreadyChecked))
+ return false;
+
+ // If there are no problems, lets do it.
+ return true;
+}
+
+/// isSafeToConvert - Return true if it is safe to convert this field type,
+/// which requires the structure elements contained by-value to all be
+/// recursively safe to convert.
+static bool
+isSafeToConvert(QualType T, CodeGenTypes &CGT,
+ llvm::SmallPtrSet<const RecordDecl*, 16> &AlreadyChecked) {
+ T = T.getCanonicalType();
+
+ // If this is a record, check it.
+ if (const RecordType *RT = dyn_cast<RecordType>(T))
+ return isSafeToConvert(RT->getDecl(), CGT, AlreadyChecked);
+
+ // If this is an array, check the elements, which are embedded inline.
+ if (const ArrayType *AT = dyn_cast<ArrayType>(T))
+ return isSafeToConvert(AT->getElementType(), CGT, AlreadyChecked);
+
+ // Otherwise, there is no concern about transforming this. We only care about
+ // things that are contained by-value in a structure that can have another
+ // structure as a member.
+ return true;
+}
+
+
+/// isSafeToConvert - Return true if it is safe to convert the specified record
+/// decl to IR and lay it out, false if doing so would cause us to get into a
+/// recursive compilation mess.
+static bool isSafeToConvert(const RecordDecl *RD, CodeGenTypes &CGT) {
+ // If no structs are being laid out, we can certainly do this one.
+ if (CGT.noRecordsBeingLaidOut()) return true;
+
+ llvm::SmallPtrSet<const RecordDecl*, 16> AlreadyChecked;
+ return isSafeToConvert(RD, CGT, AlreadyChecked);
+}
+
+
+/// isFuncTypeArgumentConvertible - Return true if the specified type in a
+/// function argument or result position can be converted to an IR type at this
+/// point. This boils down to being whether it is complete, as well as whether
+/// we've temporarily deferred expanding the type because we're in a recursive
+/// context.
+bool CodeGenTypes::isFuncTypeArgumentConvertible(QualType Ty) {
+ // If this isn't a tagged type, we can convert it!
+ const TagType *TT = Ty->getAs<TagType>();
+ if (TT == 0) return true;
+
+
+ // If it's a tagged type used by-value, but is just a forward decl, we can't
+ // convert it. Note that getDefinition()==0 is not the same as !isDefinition.
+ if (TT->getDecl()->getDefinition() == 0)
+ return false;
+
+ // If this is an enum, then it is always safe to convert.
+ const RecordType *RT = dyn_cast<RecordType>(TT);
+ if (RT == 0) return true;
+
+ // Otherwise, we have to be careful. If it is a struct that we're in the
+ // process of expanding, then we can't convert the function type. That's ok
+ // though because we must be in a pointer context under the struct, so we can
+ // just convert it to a dummy type.
+ //
+ // We decide this by checking whether ConvertRecordDeclType returns us an
+ // opaque type for a struct that we know is defined.
+ return isSafeToConvert(RT->getDecl(), *this);
+}
+
+
+/// Code to verify a given function type is complete, i.e. the return type
+/// and all of the argument types are complete. Also check to see if we are in
+/// a RS_StructPointer context, and if so whether any struct types have been
+/// pended. If so, we don't want to ask the ABI lowering code to handle a type
+/// that cannot be converted to an IR type.
+bool CodeGenTypes::isFuncTypeConvertible(const FunctionType *FT) {
+ if (!isFuncTypeArgumentConvertible(FT->getResultType()))
+ return false;
+
+ if (const FunctionProtoType *FPT = dyn_cast<FunctionProtoType>(FT))
+ for (unsigned i = 0, e = FPT->getNumArgs(); i != e; i++)
+ if (!isFuncTypeArgumentConvertible(FPT->getArgType(i)))
+ return false;
+
+ return true;
}
/// UpdateCompletedType - When we find the full definition for a TagDecl,
/// replace the 'opaque' type we previously made for it if applicable.
void CodeGenTypes::UpdateCompletedType(const TagDecl *TD) {
- const Type *Key = Context.getTagDeclType(TD).getTypePtr();
- llvm::DenseMap<const Type*, llvm::PATypeHolder>::iterator TDTI =
- TagDeclTypes.find(Key);
- if (TDTI == TagDeclTypes.end()) return;
-
- // Remember the opaque LLVM type for this tagdecl.
- llvm::PATypeHolder OpaqueHolder = TDTI->second;
- assert(isa<llvm::OpaqueType>(OpaqueHolder.get()) &&
- "Updating compilation of an already non-opaque type?");
-
- // Remove it from TagDeclTypes so that it will be regenerated.
- TagDeclTypes.erase(TDTI);
-
- // Generate the new type.
- const llvm::Type *NT = ConvertTagDeclType(TD);
-
- // Refine the old opaque type to its new definition.
- cast<llvm::OpaqueType>(OpaqueHolder.get())->refineAbstractTypeTo(NT);
-
- // Since we just completed a tag type, check to see if any function types
- // were completed along with the tag type.
- // FIXME: This is very inefficient; if we track which function types depend
- // on which tag types, though, it should be reasonably efficient.
- llvm::DenseMap<const Type*, llvm::PATypeHolder>::iterator i;
- for (i = FunctionTypes.begin(); i != FunctionTypes.end(); ++i) {
- if (const TagType* TT = VerifyFuncTypeComplete(i->first)) {
- // This function type still depends on an incomplete tag type; make sure
- // that tag type has an associated opaque type.
- ConvertTagDeclType(TT->getDecl());
- } else {
- // This function no longer depends on an incomplete tag type; create the
- // function type, and refine the opaque type to the new function type.
- llvm::PATypeHolder OpaqueHolder = i->second;
- const llvm::Type *NFT = ConvertNewType(QualType(i->first, 0));
- cast<llvm::OpaqueType>(OpaqueHolder.get())->refineAbstractTypeTo(NFT);
- FunctionTypes.erase(i);
+ // If this is an enum being completed, then we flush all non-struct types from
+ // the cache. This allows function types and other things that may be derived
+ // from the enum to be recomputed.
+ if (const EnumDecl *ED = dyn_cast<EnumDecl>(TD)) {
+ // Only flush the cache if we've actually already converted this type.
+ if (TypeCache.count(ED->getTypeForDecl())) {
+ // Okay, we formed some types based on this. We speculated that the enum
+ // would be lowered to i32, so we only need to flush the cache if this
+ // didn't happen.
+ if (!ConvertType(ED->getIntegerType())->isIntegerTy(32))
+ TypeCache.clear();
}
+ return;
}
+
+ // If we completed a RecordDecl that we previously used and converted to an
+ // anonymous type, then go ahead and complete it now.
+ const RecordDecl *RD = cast<RecordDecl>(TD);
+ if (RD->isDependentType()) return;
+
+ // Only complete it if we converted it already. If we haven't converted it
+ // yet, we'll just do it lazily.
+ if (RecordDeclTypes.count(Context.getTagDeclType(RD).getTypePtr()))
+ ConvertRecordDeclType(RD);
}
-static const llvm::Type* getTypeForFormat(llvm::LLVMContext &VMContext,
- const llvm::fltSemantics &format) {
+static llvm::Type *getTypeForFormat(llvm::LLVMContext &VMContext,
+ const llvm::fltSemantics &format) {
if (&format == &llvm::APFloat::IEEEsingle)
return llvm::Type::getFloatTy(VMContext);
if (&format == &llvm::APFloat::IEEEdouble)
@@ -219,10 +277,26 @@ static const llvm::Type* getTypeForFormat(llvm::LLVMContext &VMContext,
return 0;
}
-const llvm::Type *CodeGenTypes::ConvertNewType(QualType T) {
- const clang::Type &Ty = *Context.getCanonicalType(T).getTypePtr();
+/// ConvertType - Convert the specified type to its LLVM form.
+llvm::Type *CodeGenTypes::ConvertType(QualType T) {
+ T = Context.getCanonicalType(T);
+
+ const Type *Ty = T.getTypePtr();
- switch (Ty.getTypeClass()) {
+ // RecordTypes are cached and processed specially.
+ if (const RecordType *RT = dyn_cast<RecordType>(Ty))
+ return ConvertRecordDeclType(RT->getDecl());
+
+ // See if type is already cached.
+ llvm::DenseMap<const Type *, llvm::Type *>::iterator TCI = TypeCache.find(Ty);
+ // If type is found in map then use it. Otherwise, convert type T.
+ if (TCI != TypeCache.end())
+ return TCI->second;
+
+ // If we don't have it in the cache, convert it now.
+ llvm::Type *ResultType = 0;
+ switch (Ty->getTypeClass()) {
+ case Type::Record: // Handled above.
#define TYPE(Class, Base)
#define ABSTRACT_TYPE(Class, Base)
#define NON_CANONICAL_TYPE(Class, Base) case Type::Class:
@@ -233,18 +307,20 @@ const llvm::Type *CodeGenTypes::ConvertNewType(QualType T) {
break;
case Type::Builtin: {
- switch (cast<BuiltinType>(Ty).getKind()) {
+ switch (cast<BuiltinType>(Ty)->getKind()) {
case BuiltinType::Void:
case BuiltinType::ObjCId:
case BuiltinType::ObjCClass:
case BuiltinType::ObjCSel:
// LLVM void type can only be used as the result of a function call. Just
// map to the same as char.
- return llvm::Type::getInt8Ty(getLLVMContext());
+ ResultType = llvm::Type::getInt8Ty(getLLVMContext());
+ break;
case BuiltinType::Bool:
// Note that we always return bool as i1 for use as a scalar type.
- return llvm::Type::getInt1Ty(getLLVMContext());
+ ResultType = llvm::Type::getInt1Ty(getLLVMContext());
+ break;
case BuiltinType::Char_S:
case BuiltinType::Char_U:
@@ -262,24 +338,26 @@ const llvm::Type *CodeGenTypes::ConvertNewType(QualType T) {
case BuiltinType::WChar_U:
case BuiltinType::Char16:
case BuiltinType::Char32:
- return llvm::IntegerType::get(getLLVMContext(),
- static_cast<unsigned>(Context.getTypeSize(T)));
+ ResultType = llvm::IntegerType::get(getLLVMContext(),
+ static_cast<unsigned>(Context.getTypeSize(T)));
+ break;
case BuiltinType::Float:
case BuiltinType::Double:
case BuiltinType::LongDouble:
- return getTypeForFormat(getLLVMContext(),
- Context.getFloatTypeSemantics(T));
+ ResultType = getTypeForFormat(getLLVMContext(),
+ Context.getFloatTypeSemantics(T));
+ break;
- case BuiltinType::NullPtr: {
+ case BuiltinType::NullPtr:
// Model std::nullptr_t as i8*
- const llvm::Type *Ty = llvm::Type::getInt8Ty(getLLVMContext());
- return llvm::PointerType::getUnqual(Ty);
- }
+ ResultType = llvm::Type::getInt8PtrTy(getLLVMContext());
+ break;
case BuiltinType::UInt128:
case BuiltinType::Int128:
- return llvm::IntegerType::get(getLLVMContext(), 128);
+ ResultType = llvm::IntegerType::get(getLLVMContext(), 128);
+ break;
case BuiltinType::Overload:
case BuiltinType::Dependent:
@@ -288,107 +366,145 @@ const llvm::Type *CodeGenTypes::ConvertNewType(QualType T) {
llvm_unreachable("Unexpected placeholder builtin type!");
break;
}
- llvm_unreachable("Unknown builtin type!");
break;
}
case Type::Complex: {
- const llvm::Type *EltTy =
- ConvertTypeRecursive(cast<ComplexType>(Ty).getElementType());
- return llvm::StructType::get(TheModule.getContext(), EltTy, EltTy, NULL);
+ llvm::Type *EltTy = ConvertType(cast<ComplexType>(Ty)->getElementType());
+ ResultType = llvm::StructType::get(EltTy, EltTy, NULL);
+ break;
}
case Type::LValueReference:
case Type::RValueReference: {
- const ReferenceType &RTy = cast<ReferenceType>(Ty);
- QualType ETy = RTy.getPointeeType();
- llvm::OpaqueType *PointeeType = llvm::OpaqueType::get(getLLVMContext());
- PointersToResolve.push_back(std::make_pair(ETy, PointeeType));
+ const ReferenceType *RTy = cast<ReferenceType>(Ty);
+ QualType ETy = RTy->getPointeeType();
+ llvm::Type *PointeeType = ConvertTypeForMem(ETy);
unsigned AS = Context.getTargetAddressSpace(ETy);
- return llvm::PointerType::get(PointeeType, AS);
+ ResultType = llvm::PointerType::get(PointeeType, AS);
+ break;
}
case Type::Pointer: {
- const PointerType &PTy = cast<PointerType>(Ty);
- QualType ETy = PTy.getPointeeType();
- llvm::OpaqueType *PointeeType = llvm::OpaqueType::get(getLLVMContext());
- PointersToResolve.push_back(std::make_pair(ETy, PointeeType));
+ const PointerType *PTy = cast<PointerType>(Ty);
+ QualType ETy = PTy->getPointeeType();
+ llvm::Type *PointeeType = ConvertTypeForMem(ETy);
+ if (PointeeType->isVoidTy())
+ PointeeType = llvm::Type::getInt8Ty(getLLVMContext());
unsigned AS = Context.getTargetAddressSpace(ETy);
- return llvm::PointerType::get(PointeeType, AS);
+ ResultType = llvm::PointerType::get(PointeeType, AS);
+ break;
}
case Type::VariableArray: {
- const VariableArrayType &A = cast<VariableArrayType>(Ty);
- assert(A.getIndexTypeCVRQualifiers() == 0 &&
+ const VariableArrayType *A = cast<VariableArrayType>(Ty);
+ assert(A->getIndexTypeCVRQualifiers() == 0 &&
"FIXME: We only handle trivial array types so far!");
// VLAs resolve to the innermost element type; this matches
// the return of alloca, and there isn't any obviously better choice.
- return ConvertTypeForMemRecursive(A.getElementType());
+ ResultType = ConvertTypeForMem(A->getElementType());
+ break;
}
case Type::IncompleteArray: {
- const IncompleteArrayType &A = cast<IncompleteArrayType>(Ty);
- assert(A.getIndexTypeCVRQualifiers() == 0 &&
+ const IncompleteArrayType *A = cast<IncompleteArrayType>(Ty);
+ assert(A->getIndexTypeCVRQualifiers() == 0 &&
"FIXME: We only handle trivial array types so far!");
- // int X[] -> [0 x int]
- return llvm::ArrayType::get(ConvertTypeForMemRecursive(A.getElementType()),
- 0);
+ // int X[] -> [0 x int], unless the element type is not sized. If it is
+ // unsized (e.g. an incomplete struct) just use [0 x i8].
+ ResultType = ConvertTypeForMem(A->getElementType());
+ if (!ResultType->isSized()) {
+ SkippedLayout = true;
+ ResultType = llvm::Type::getInt8Ty(getLLVMContext());
+ }
+ ResultType = llvm::ArrayType::get(ResultType, 0);
+ break;
}
case Type::ConstantArray: {
- const ConstantArrayType &A = cast<ConstantArrayType>(Ty);
- const llvm::Type *EltTy = ConvertTypeForMemRecursive(A.getElementType());
- return llvm::ArrayType::get(EltTy, A.getSize().getZExtValue());
+ const ConstantArrayType *A = cast<ConstantArrayType>(Ty);
+ const llvm::Type *EltTy = ConvertTypeForMem(A->getElementType());
+ ResultType = llvm::ArrayType::get(EltTy, A->getSize().getZExtValue());
+ break;
}
case Type::ExtVector:
case Type::Vector: {
- const VectorType &VT = cast<VectorType>(Ty);
- return llvm::VectorType::get(ConvertTypeRecursive(VT.getElementType()),
- VT.getNumElements());
+ const VectorType *VT = cast<VectorType>(Ty);
+ ResultType = llvm::VectorType::get(ConvertType(VT->getElementType()),
+ VT->getNumElements());
+ break;
}
case Type::FunctionNoProto:
case Type::FunctionProto: {
+ const FunctionType *FT = cast<FunctionType>(Ty);
// First, check whether we can build the full function type. If the
// function type depends on an incomplete type (e.g. a struct or enum), we
- // cannot lower the function type. Instead, turn it into an Opaque pointer
- // and have UpdateCompletedType revisit the function type when/if the opaque
- // argument type is defined.
- if (const TagType *TT = VerifyFuncTypeComplete(&Ty)) {
- // This function's type depends on an incomplete tag type; make sure
- // we have an opaque type corresponding to the tag type.
- ConvertTagDeclType(TT->getDecl());
- // Create an opaque type for this function type, save it, and return it.
- llvm::Type *ResultType = llvm::OpaqueType::get(getLLVMContext());
- FunctionTypes.insert(std::make_pair(&Ty, ResultType));
- return ResultType;
+ // cannot lower the function type.
+ if (!isFuncTypeConvertible(FT)) {
+ // This function's type depends on an incomplete tag type.
+ // Return a placeholder type.
+ ResultType = llvm::StructType::get(getLLVMContext());
+
+ SkippedLayout = true;
+ break;
+ }
+
+ // While we're converting the argument types for a function, we don't want
+ // to recursively convert any pointed-to structs. Converting directly-used
+ // structs is ok though.
+ if (!RecordsBeingLaidOut.insert(Ty)) {
+ ResultType = llvm::StructType::get(getLLVMContext());
+
+ SkippedLayout = true;
+ break;
}
// The function type can be built; call the appropriate routines to
// build it.
const CGFunctionInfo *FI;
bool isVariadic;
- if (const FunctionProtoType *FPT = dyn_cast<FunctionProtoType>(&Ty)) {
+ if (const FunctionProtoType *FPT = dyn_cast<FunctionProtoType>(FT)) {
FI = &getFunctionInfo(
- CanQual<FunctionProtoType>::CreateUnsafe(QualType(FPT, 0)),
- true /*Recursive*/);
+ CanQual<FunctionProtoType>::CreateUnsafe(QualType(FPT, 0)));
isVariadic = FPT->isVariadic();
} else {
- const FunctionNoProtoType *FNPT = cast<FunctionNoProtoType>(&Ty);
+ const FunctionNoProtoType *FNPT = cast<FunctionNoProtoType>(FT);
FI = &getFunctionInfo(
- CanQual<FunctionNoProtoType>::CreateUnsafe(QualType(FNPT, 0)),
- true /*Recursive*/);
+ CanQual<FunctionNoProtoType>::CreateUnsafe(QualType(FNPT, 0)));
isVariadic = true;
}
+
+ // If there is something higher level prodding our CGFunctionInfo, then
+ // don't recurse into it again.
+ if (FunctionsBeingProcessed.count(FI)) {
+
+ ResultType = llvm::StructType::get(getLLVMContext());
+ SkippedLayout = true;
+ } else {
- return GetFunctionType(*FI, isVariadic, true);
+ // Otherwise, we're good to go, go ahead and convert it.
+ ResultType = GetFunctionType(*FI, isVariadic);
+ }
+
+ RecordsBeingLaidOut.erase(Ty);
+
+ if (SkippedLayout)
+ TypeCache.clear();
+
+ if (RecordsBeingLaidOut.empty())
+ while (!DeferredRecords.empty())
+ ConvertRecordDeclType(DeferredRecords.pop_back_val());
+ break;
}
case Type::ObjCObject:
- return ConvertTypeRecursive(cast<ObjCObjectType>(Ty).getBaseType());
+ ResultType = ConvertType(cast<ObjCObjectType>(Ty)->getBaseType());
+ break;
case Type::ObjCInterface: {
// Objective-C interfaces are always opaque (outside of the
// runtime, which can do whatever it likes); we never refine
// these.
- const llvm::Type *&T = InterfaceTypes[cast<ObjCInterfaceType>(&Ty)];
+ llvm::Type *&T = InterfaceTypes[cast<ObjCInterfaceType>(Ty)];
if (!T)
- T = llvm::OpaqueType::get(getLLVMContext());
- return T;
+ T = llvm::StructType::createNamed(getLLVMContext(), "");
+ ResultType = T;
+ break;
}
case Type::ObjCObjectPointer: {
@@ -396,103 +512,105 @@ const llvm::Type *CodeGenTypes::ConvertNewType(QualType T) {
// pointer to the underlying interface type. We don't need to worry about
// recursive conversion.
const llvm::Type *T =
- ConvertTypeRecursive(cast<ObjCObjectPointerType>(Ty).getPointeeType());
- return llvm::PointerType::getUnqual(T);
+ ConvertType(cast<ObjCObjectPointerType>(Ty)->getPointeeType());
+ ResultType = T->getPointerTo();
+ break;
}
- case Type::Record:
case Type::Enum: {
- const TagDecl *TD = cast<TagType>(Ty).getDecl();
- const llvm::Type *Res = ConvertTagDeclType(TD);
-
- if (const RecordDecl *RD = dyn_cast<RecordDecl>(TD))
- addRecordTypeName(RD, Res, llvm::StringRef());
- return Res;
+ const EnumDecl *ED = cast<EnumType>(Ty)->getDecl();
+ if (ED->isDefinition() || ED->isFixed())
+ return ConvertType(ED->getIntegerType());
+ // Return a placeholder 'i32' type. This can be changed later when the
+ // type is defined (see UpdateCompletedType), but is likely to be the
+ // "right" answer.
+ ResultType = llvm::Type::getInt32Ty(getLLVMContext());
+ break;
}
case Type::BlockPointer: {
- const QualType FTy = cast<BlockPointerType>(Ty).getPointeeType();
- llvm::OpaqueType *PointeeType = llvm::OpaqueType::get(getLLVMContext());
- PointersToResolve.push_back(std::make_pair(FTy, PointeeType));
+ const QualType FTy = cast<BlockPointerType>(Ty)->getPointeeType();
+ llvm::Type *PointeeType = ConvertTypeForMem(FTy);
unsigned AS = Context.getTargetAddressSpace(FTy);
- return llvm::PointerType::get(PointeeType, AS);
+ ResultType = llvm::PointerType::get(PointeeType, AS);
+ break;
}
case Type::MemberPointer: {
- return getCXXABI().ConvertMemberPointerType(cast<MemberPointerType>(&Ty));
+ ResultType =
+ getCXXABI().ConvertMemberPointerType(cast<MemberPointerType>(Ty));
+ break;
}
}
-
- // FIXME: implement.
- return llvm::OpaqueType::get(getLLVMContext());
+
+ assert(ResultType && "Didn't convert a type?");
+
+ TypeCache[Ty] = ResultType;
+ return ResultType;
}
-/// ConvertTagDeclType - Lay out a tagged decl type like struct or union or
-/// enum.
-const llvm::Type *CodeGenTypes::ConvertTagDeclType(const TagDecl *TD) {
+/// ConvertRecordDeclType - Lay out a tagged decl type like struct or union.
+llvm::StructType *CodeGenTypes::ConvertRecordDeclType(const RecordDecl *RD) {
// TagDecl's are not necessarily unique, instead use the (clang)
// type connected to the decl.
- const Type *Key =
- Context.getTagDeclType(TD).getTypePtr();
- llvm::DenseMap<const Type*, llvm::PATypeHolder>::iterator TDTI =
- TagDeclTypes.find(Key);
-
- // If we've already compiled this tag type, use the previous definition.
- if (TDTI != TagDeclTypes.end())
- return TDTI->second;
-
- const EnumDecl *ED = dyn_cast<EnumDecl>(TD);
-
- // If this is still a forward declaration, just define an opaque
- // type to use for this tagged decl.
- // C++0x: If this is a enumeration type with fixed underlying type,
- // consider it complete.
- if (!TD->isDefinition() && !(ED && ED->isFixed())) {
- llvm::Type *ResultType = llvm::OpaqueType::get(getLLVMContext());
- TagDeclTypes.insert(std::make_pair(Key, ResultType));
- return ResultType;
- }
-
- // Okay, this is a definition of a type. Compile the implementation now.
-
- if (ED) // Don't bother storing enums in TagDeclTypes.
- return ConvertTypeRecursive(ED->getIntegerType());
+ const Type *Key = Context.getTagDeclType(RD).getTypePtr();
- // This decl could well be recursive. In this case, insert an opaque
- // definition of this type, which the recursive uses will get. We will then
- // refine this opaque version later.
+ llvm::StructType *&Entry = RecordDeclTypes[Key];
- // Create new OpaqueType now for later use in case this is a recursive
- // type. This will later be refined to the actual type.
- llvm::PATypeHolder ResultHolder = llvm::OpaqueType::get(getLLVMContext());
- TagDeclTypes.insert(std::make_pair(Key, ResultHolder));
+ // If we don't have a StructType at all yet, create the forward declaration.
+ if (Entry == 0) {
+ Entry = llvm::StructType::createNamed(getLLVMContext(), "");
+ addRecordTypeName(RD, Entry, "");
+ }
+ llvm::StructType *Ty = Entry;
- const RecordDecl *RD = cast<const RecordDecl>(TD);
+ // If this is still a forward declaration, or the LLVM type is already
+ // complete, there's nothing more to do.
+ RD = RD->getDefinition();
+ if (RD == 0 || !Ty->isOpaque())
+ return Ty;
+
+ // If converting this type would cause us to infinitely loop, don't do it!
+ if (!isSafeToConvert(RD, *this)) {
+ DeferredRecords.push_back(RD);
+ return Ty;
+ }
+ // Okay, this is a definition of a type. Compile the implementation now.
+ bool InsertResult = RecordsBeingLaidOut.insert(Key); (void)InsertResult;
+ assert(InsertResult && "Recursively compiling a struct?");
+
// Force conversion of non-virtual base classes recursively.
- if (const CXXRecordDecl *RD = dyn_cast<CXXRecordDecl>(TD)) {
- for (CXXRecordDecl::base_class_const_iterator i = RD->bases_begin(),
- e = RD->bases_end(); i != e; ++i) {
- if (!i->isVirtual()) {
- const CXXRecordDecl *Base =
- cast<CXXRecordDecl>(i->getType()->getAs<RecordType>()->getDecl());
- ConvertTagDeclType(Base);
- }
+ if (const CXXRecordDecl *CRD = dyn_cast<CXXRecordDecl>(RD)) {
+ for (CXXRecordDecl::base_class_const_iterator i = CRD->bases_begin(),
+ e = CRD->bases_end(); i != e; ++i) {
+ if (i->isVirtual()) continue;
+
+ ConvertRecordDeclType(i->getType()->getAs<RecordType>()->getDecl());
}
}
// Layout fields.
- CGRecordLayout *Layout = ComputeRecordLayout(RD);
-
+ CGRecordLayout *Layout = ComputeRecordLayout(RD, Ty);
CGRecordLayouts[Key] = Layout;
- const llvm::Type *ResultType = Layout->getLLVMType();
- // Refine our Opaque type to ResultType. This can invalidate ResultType, so
- // make sure to read the result out of the holder.
- cast<llvm::OpaqueType>(ResultHolder.get())
- ->refineAbstractTypeTo(ResultType);
+ // We're done laying out this struct.
+ bool EraseResult = RecordsBeingLaidOut.erase(Key); (void)EraseResult;
+ assert(EraseResult && "struct not in RecordsBeingLaidOut set?");
+
+ // If this struct blocked a FunctionType conversion, then recompute whatever
+ // was derived from that.
+ // FIXME: This is hugely overconservative.
+ if (SkippedLayout)
+ TypeCache.clear();
+
+ // If we're done converting the outer-most record, then convert any deferred
+ // structs as well.
+ if (RecordsBeingLaidOut.empty())
+ while (!DeferredRecords.empty())
+ ConvertRecordDeclType(DeferredRecords.pop_back_val());
- return ResultHolder.get();
+ return Ty;
}
/// getCGRecordLayout - Return record layout info for the given record decl.
@@ -503,7 +621,7 @@ CodeGenTypes::getCGRecordLayout(const RecordDecl *RD) {
const CGRecordLayout *Layout = CGRecordLayouts.lookup(Key);
if (!Layout) {
// Compute the type information.
- ConvertTagDeclType(RD);
+ ConvertRecordDeclType(RD);
// Now try again.
Layout = CGRecordLayouts.lookup(Key);
@@ -513,15 +631,6 @@ CodeGenTypes::getCGRecordLayout(const RecordDecl *RD) {
return *Layout;
}
-void CodeGenTypes::addBaseSubobjectTypeName(const CXXRecordDecl *RD,
- const CGRecordLayout &layout) {
- llvm::StringRef suffix;
- if (layout.getBaseSubobjectLLVMType() != layout.getLLVMType())
- suffix = ".base";
-
- addRecordTypeName(RD, layout.getBaseSubobjectLLVMType(), suffix);
-}
-
bool CodeGenTypes::isZeroInitializable(QualType T) {
// No need to check for member pointers when not compiling C++.
if (!Context.getLangOptions().CPlusPlus)
diff --git a/contrib/llvm/tools/clang/lib/CodeGen/CodeGenTypes.h b/contrib/llvm/tools/clang/lib/CodeGen/CodeGenTypes.h
index ff1eb4c..7c0fb81 100644
--- a/contrib/llvm/tools/clang/lib/CodeGen/CodeGenTypes.h
+++ b/contrib/llvm/tools/clang/lib/CodeGen/CodeGenTypes.h
@@ -15,7 +15,7 @@
#define CLANG_CODEGEN_CODEGENTYPES_H
#include "CGCall.h"
-#include "GlobalDecl.h"
+#include "clang/AST/GlobalDecl.h"
#include "llvm/Module.h"
#include "llvm/ADT/DenseMap.h"
#include <vector>
@@ -23,11 +23,10 @@
namespace llvm {
class FunctionType;
class Module;
- class OpaqueType;
- class PATypeHolder;
class TargetData;
class Type;
class LLVMContext;
+ class StructType;
}
namespace clang {
@@ -37,6 +36,7 @@ namespace clang {
class CXXConstructorDecl;
class CXXDestructorDecl;
class CXXMethodDecl;
+ class CodeGenOptions;
class FieldDecl;
class FunctionProtoType;
class ObjCInterfaceDecl;
@@ -58,91 +58,83 @@ namespace CodeGen {
class CodeGenTypes {
ASTContext &Context;
const TargetInfo &Target;
- llvm::Module& TheModule;
- const llvm::TargetData& TheTargetData;
- const ABIInfo& TheABIInfo;
+ llvm::Module &TheModule;
+ const llvm::TargetData &TheTargetData;
+ const ABIInfo &TheABIInfo;
CGCXXABI &TheCXXABI;
-
- llvm::SmallVector<std::pair<QualType,
- llvm::OpaqueType *>, 8> PointersToResolve;
-
- llvm::DenseMap<const Type*, llvm::PATypeHolder> TagDeclTypes;
-
- llvm::DenseMap<const Type*, llvm::PATypeHolder> FunctionTypes;
+ const CodeGenOptions &CodeGenOpts;
/// The opaque type map for Objective-C interfaces. All direct
/// manipulation is done by the runtime interfaces, which are
/// responsible for coercing to the appropriate type; these opaque
/// types are never refined.
- llvm::DenseMap<const ObjCInterfaceType*, const llvm::Type *> InterfaceTypes;
+ llvm::DenseMap<const ObjCInterfaceType*, llvm::Type *> InterfaceTypes;
/// CGRecordLayouts - This maps llvm struct type with corresponding
/// record layout info.
llvm::DenseMap<const Type*, CGRecordLayout *> CGRecordLayouts;
+ /// RecordDeclTypes - This contains the LLVM IR type for any converted
+ /// RecordDecl.
+ llvm::DenseMap<const Type*, llvm::StructType *> RecordDeclTypes;
+
/// FunctionInfos - Hold memoized CGFunctionInfo results.
llvm::FoldingSet<CGFunctionInfo> FunctionInfos;
+ /// RecordsBeingLaidOut - This set keeps track of records that we're currently
+ /// converting to an IR type. For example, when converting:
+ /// struct A { struct B { int x; } } when processing 'x', the 'A' and 'B'
+ /// types will be in this set.
+ llvm::SmallPtrSet<const Type*, 4> RecordsBeingLaidOut;
+
+ llvm::SmallPtrSet<const CGFunctionInfo*, 4> FunctionsBeingProcessed;
+
+ /// SkippedLayout - True if we didn't layout a function due to a being inside
+ /// a recursive struct conversion, set this to true.
+ bool SkippedLayout;
+
+ llvm::SmallVector<const RecordDecl *, 8> DeferredRecords;
+
private:
- /// TypeCache - This map keeps cache of llvm::Types (through PATypeHolder)
- /// and maps llvm::Types to corresponding clang::Type. llvm::PATypeHolder is
- /// used instead of llvm::Type because it allows us to bypass potential
- /// dangling type pointers due to type refinement on llvm side.
- llvm::DenseMap<const Type *, llvm::PATypeHolder> TypeCache;
-
- /// ConvertNewType - Convert type T into a llvm::Type. Do not use this
- /// method directly because it does not do any type caching. This method
- /// is available only for ConvertType(). CovertType() is preferred
- /// interface to convert type T into a llvm::Type.
- const llvm::Type *ConvertNewType(QualType T);
-
- /// HandleLateResolvedPointers - For top-level ConvertType calls, this handles
- /// pointers that are referenced but have not been converted yet. This is
- /// used to handle cyclic structures properly.
- void HandleLateResolvedPointers();
-
- /// addRecordTypeName - Compute a name from the given record decl with an
- /// optional suffix and name the given LLVM type using it.
- void addRecordTypeName(const RecordDecl *RD, const llvm::Type *Ty,
- llvm::StringRef suffix);
+ /// TypeCache - This map keeps cache of llvm::Types
+ /// and maps llvm::Types to corresponding clang::Type.
+ llvm::DenseMap<const Type *, llvm::Type *> TypeCache;
public:
CodeGenTypes(ASTContext &Ctx, llvm::Module &M, const llvm::TargetData &TD,
- const ABIInfo &Info, CGCXXABI &CXXABI);
+ const ABIInfo &Info, CGCXXABI &CXXABI,
+ const CodeGenOptions &Opts);
~CodeGenTypes();
const llvm::TargetData &getTargetData() const { return TheTargetData; }
const TargetInfo &getTarget() const { return Target; }
ASTContext &getContext() const { return Context; }
const ABIInfo &getABIInfo() const { return TheABIInfo; }
+ const CodeGenOptions &getCodeGenOpts() const { return CodeGenOpts; }
CGCXXABI &getCXXABI() const { return TheCXXABI; }
llvm::LLVMContext &getLLVMContext() { return TheModule.getContext(); }
/// ConvertType - Convert type T into a llvm::Type.
- const llvm::Type *ConvertType(QualType T, bool IsRecursive = false);
- const llvm::Type *ConvertTypeRecursive(QualType T);
+ llvm::Type *ConvertType(QualType T);
/// ConvertTypeForMem - Convert type T into a llvm::Type. This differs from
/// ConvertType in that it is used to convert to the memory representation for
/// a type. For example, the scalar representation for _Bool is i1, but the
/// memory representation is usually i8 or i32, depending on the target.
- const llvm::Type *ConvertTypeForMem(QualType T, bool IsRecursive = false);
- const llvm::Type *ConvertTypeForMemRecursive(QualType T) {
- return ConvertTypeForMem(T, true);
- }
+ llvm::Type *ConvertTypeForMem(QualType T);
/// GetFunctionType - Get the LLVM function type for \arg Info.
- const llvm::FunctionType *GetFunctionType(const CGFunctionInfo &Info,
- bool IsVariadic,
- bool IsRecursive = false);
+ llvm::FunctionType *GetFunctionType(const CGFunctionInfo &Info,
+ bool IsVariadic);
- const llvm::FunctionType *GetFunctionType(GlobalDecl GD);
+ llvm::FunctionType *GetFunctionType(GlobalDecl GD);
- /// VerifyFuncTypeComplete - Utility to check whether a function type can
+ /// isFuncTypeConvertible - Utility to check whether a function type can
/// be converted to an LLVM type (i.e. doesn't depend on an incomplete tag
/// type).
- static const TagType *VerifyFuncTypeComplete(const Type* T);
-
+ bool isFuncTypeConvertible(const FunctionType *FT);
+ bool isFuncTypeArgumentConvertible(QualType Ty);
+
/// GetFunctionTypeForVTable - Get the LLVM function type for use in a vtable,
/// given a CXXMethodDecl. If the method to has an incomplete return type,
/// and/or incomplete argument types, this will return the opaque type.
@@ -150,11 +142,6 @@ public:
const CGRecordLayout &getCGRecordLayout(const RecordDecl*);
- /// addBaseSubobjectTypeName - Add a type name for the base subobject of the
- /// given record layout.
- void addBaseSubobjectTypeName(const CXXRecordDecl *RD,
- const CGRecordLayout &layout);
-
/// UpdateCompletedType - When we find the full definition for a TagDecl,
/// replace the 'opaque' type we previously made for it if applicable.
void UpdateCompletedType(const TagDecl *TD);
@@ -180,10 +167,8 @@ public:
Ty->getExtInfo());
}
- const CGFunctionInfo &getFunctionInfo(CanQual<FunctionProtoType> Ty,
- bool IsRecursive = false);
- const CGFunctionInfo &getFunctionInfo(CanQual<FunctionNoProtoType> Ty,
- bool IsRecursive = false);
+ const CGFunctionInfo &getFunctionInfo(CanQual<FunctionProtoType> Ty);
+ const CGFunctionInfo &getFunctionInfo(CanQual<FunctionNoProtoType> Ty);
/// getFunctionInfo - Get the function info for a member function of
/// the given type. This is used for calls through member function
@@ -206,23 +191,27 @@ public:
/// \param ArgTys - must all actually be canonical as params
const CGFunctionInfo &getFunctionInfo(CanQualType RetTy,
const llvm::SmallVectorImpl<CanQualType> &ArgTys,
- const FunctionType::ExtInfo &Info,
- bool IsRecursive = false);
+ const FunctionType::ExtInfo &Info);
/// \brief Compute a new LLVM record layout object for the given record.
- CGRecordLayout *ComputeRecordLayout(const RecordDecl *D);
+ CGRecordLayout *ComputeRecordLayout(const RecordDecl *D,
+ llvm::StructType *Ty);
+
+ /// addRecordTypeName - Compute a name from the given record decl with an
+ /// optional suffix and name the given LLVM type using it.
+ void addRecordTypeName(const RecordDecl *RD, llvm::StructType *Ty,
+ llvm::StringRef suffix);
+
public: // These are internal details of CGT that shouldn't be used externally.
- /// ConvertTagDeclType - Lay out a tagged decl type like struct or union or
- /// enum.
- const llvm::Type *ConvertTagDeclType(const TagDecl *TD);
+ /// ConvertRecordDeclType - Lay out a tagged decl type like struct or union.
+ llvm::StructType *ConvertRecordDeclType(const RecordDecl *TD);
/// GetExpandedTypes - Expand the type \arg Ty into the LLVM
/// argument types it would be passed as on the provided vector \arg
/// ArgTys. See ABIArgInfo::Expand.
void GetExpandedTypes(QualType type,
- llvm::SmallVectorImpl<const llvm::Type*> &expanded,
- bool isRecursive);
+ llvm::SmallVectorImpl<llvm::Type*> &expanded);
/// IsZeroInitializable - Return whether a type can be
/// zero-initialized (in the C++ sense) with an LLVM zeroinitializer.
@@ -231,6 +220,15 @@ public: // These are internal details of CGT that shouldn't be used externally.
/// IsZeroInitializable - Return whether a record type can be
/// zero-initialized (in the C++ sense) with an LLVM zeroinitializer.
bool isZeroInitializable(const CXXRecordDecl *RD);
+
+ bool isRecordLayoutComplete(const Type *Ty) const;
+ bool noRecordsBeingLaidOut() const {
+ return RecordsBeingLaidOut.empty();
+ }
+ bool isRecordBeingLaidOut(const Type *Ty) const {
+ return RecordsBeingLaidOut.count(Ty);
+ }
+
};
} // end namespace CodeGen
diff --git a/contrib/llvm/tools/clang/lib/CodeGen/ItaniumCXXABI.cpp b/contrib/llvm/tools/clang/lib/CodeGen/ItaniumCXXABI.cpp
index 12ef9bd..0c86080f 100644
--- a/contrib/llvm/tools/clang/lib/CodeGen/ItaniumCXXABI.cpp
+++ b/contrib/llvm/tools/clang/lib/CodeGen/ItaniumCXXABI.cpp
@@ -24,6 +24,7 @@
#include "CodeGenModule.h"
#include <clang/AST/Mangle.h>
#include <clang/AST/Type.h>
+#include <llvm/Intrinsics.h>
#include <llvm/Target/TargetData.h>
#include <llvm/Value.h>
@@ -33,15 +34,15 @@ using namespace CodeGen;
namespace {
class ItaniumCXXABI : public CodeGen::CGCXXABI {
private:
- const llvm::IntegerType *PtrDiffTy;
+ llvm::IntegerType *PtrDiffTy;
protected:
bool IsARM;
// It's a little silly for us to cache this.
- const llvm::IntegerType *getPtrDiffTy() {
+ llvm::IntegerType *getPtrDiffTy() {
if (!PtrDiffTy) {
QualType T = getContext().getPointerDiffType();
- const llvm::Type *Ty = CGM.getTypes().ConvertTypeRecursive(T);
+ llvm::Type *Ty = CGM.getTypes().ConvertType(T);
PtrDiffTy = cast<llvm::IntegerType>(Ty);
}
return PtrDiffTy;
@@ -57,7 +58,7 @@ public:
bool isZeroInitializable(const MemberPointerType *MPT);
- const llvm::Type *ConvertMemberPointerType(const MemberPointerType *MPT);
+ llvm::Type *ConvertMemberPointerType(const MemberPointerType *MPT);
llvm::Value *EmitLoadOfMemberFunctionPointer(CodeGenFunction &CGF,
llvm::Value *&This,
@@ -175,13 +176,11 @@ CodeGen::CGCXXABI *CodeGen::CreateARMCXXABI(CodeGenModule &CGM) {
return new ARMCXXABI(CGM);
}
-const llvm::Type *
+llvm::Type *
ItaniumCXXABI::ConvertMemberPointerType(const MemberPointerType *MPT) {
if (MPT->isMemberDataPointer())
return getPtrDiffTy();
- else
- return llvm::StructType::get(CGM.getLLVMContext(),
- getPtrDiffTy(), getPtrDiffTy(), NULL);
+ return llvm::StructType::get(getPtrDiffTy(), getPtrDiffTy(), NULL);
}
/// In the Itanium and ARM ABIs, method pointers have the form:
@@ -473,8 +472,7 @@ ItaniumCXXABI::EmitMemberPointerConversion(llvm::Constant *C,
else
Values[1] = llvm::ConstantExpr::getAdd(CS->getOperand(1), Offset);
- return llvm::ConstantStruct::get(CGM.getLLVMContext(), Values, 2,
- /*Packed=*/false);
+ return llvm::ConstantStruct::get(CS->getType(), Values);
}
@@ -489,8 +487,7 @@ ItaniumCXXABI::EmitNullMemberPointer(const MemberPointerType *MPT) {
llvm::Constant *Zero = llvm::ConstantInt::get(ptrdiff_t, 0);
llvm::Constant *Values[2] = { Zero, Zero };
- return llvm::ConstantStruct::get(CGM.getLLVMContext(), Values, 2,
- /*Packed=*/false);
+ return llvm::ConstantStruct::getAnon(Values);
}
llvm::Constant *
@@ -540,7 +537,7 @@ llvm::Constant *ItaniumCXXABI::EmitMemberPointer(const CXXMethodDecl *MD) {
const FunctionProtoType *FPT = MD->getType()->castAs<FunctionProtoType>();
const llvm::Type *Ty;
// Check whether the function has a computable LLVM signature.
- if (!CodeGenTypes::VerifyFuncTypeComplete(FPT)) {
+ if (Types.isFuncTypeConvertible(FPT)) {
// The function has a computable LLVM signature; use the correct type.
Ty = Types.GetFunctionType(Types.getFunctionInfo(MD),
FPT->isVariadic());
@@ -555,8 +552,7 @@ llvm::Constant *ItaniumCXXABI::EmitMemberPointer(const CXXMethodDecl *MD) {
MemPtr[1] = llvm::ConstantInt::get(ptrdiff_t, 0);
}
- return llvm::ConstantStruct::get(CGM.getLLVMContext(),
- MemPtr, 2, /*Packed=*/false);
+ return llvm::ConstantStruct::getAnon(MemPtr);
}
/// The comparison algorithm is pretty easy: the member pointers are
@@ -802,10 +798,27 @@ bool ItaniumCXXABI::NeedsArrayCookie(const CXXNewExpr *expr) {
if (expr->doesUsualArrayDeleteWantSize())
return true;
+ // Automatic Reference Counting:
+ // We need an array cookie for pointers with strong or weak lifetime.
+ QualType AllocatedType = expr->getAllocatedType();
+ if (getContext().getLangOptions().ObjCAutoRefCount &&
+ AllocatedType->isObjCLifetimeType()) {
+ switch (AllocatedType.getObjCLifetime()) {
+ case Qualifiers::OCL_None:
+ case Qualifiers::OCL_ExplicitNone:
+ case Qualifiers::OCL_Autoreleasing:
+ return false;
+
+ case Qualifiers::OCL_Strong:
+ case Qualifiers::OCL_Weak:
+ return true;
+ }
+ }
+
// Otherwise, if the class has a non-trivial destructor, it always
// needs a cookie.
const CXXRecordDecl *record =
- expr->getAllocatedType()->getBaseElementTypeUnsafe()->getAsCXXRecordDecl();
+ AllocatedType->getBaseElementTypeUnsafe()->getAsCXXRecordDecl();
return (record && !record->hasTrivialDestructor());
}
@@ -816,6 +829,22 @@ bool ItaniumCXXABI::NeedsArrayCookie(const CXXDeleteExpr *expr,
if (expr->doesUsualArrayDeleteWantSize())
return true;
+ // Automatic Reference Counting:
+ // We need an array cookie for pointers with strong or weak lifetime.
+ if (getContext().getLangOptions().ObjCAutoRefCount &&
+ elementType->isObjCLifetimeType()) {
+ switch (elementType.getObjCLifetime()) {
+ case Qualifiers::OCL_None:
+ case Qualifiers::OCL_ExplicitNone:
+ case Qualifiers::OCL_Autoreleasing:
+ return false;
+
+ case Qualifiers::OCL_Strong:
+ case Qualifiers::OCL_Weak:
+ return true;
+ }
+ }
+
// Otherwise, if the class has a non-trivial destructor, it always
// needs a cookie.
const CXXRecordDecl *record =
@@ -1005,31 +1034,34 @@ void ARMCXXABI::ReadArrayCookie(CodeGenFunction &CGF,
/*********************** Static local initialization **************************/
static llvm::Constant *getGuardAcquireFn(CodeGenModule &CGM,
- const llvm::PointerType *GuardPtrTy) {
+ llvm::PointerType *GuardPtrTy) {
// int __cxa_guard_acquire(__guard *guard_object);
+ llvm::Type *ArgTys[] = { GuardPtrTy };
const llvm::FunctionType *FTy =
llvm::FunctionType::get(CGM.getTypes().ConvertType(CGM.getContext().IntTy),
- GuardPtrTy, /*isVarArg=*/false);
+ ArgTys, /*isVarArg=*/false);
return CGM.CreateRuntimeFunction(FTy, "__cxa_guard_acquire");
}
static llvm::Constant *getGuardReleaseFn(CodeGenModule &CGM,
- const llvm::PointerType *GuardPtrTy) {
+ llvm::PointerType *GuardPtrTy) {
// void __cxa_guard_release(__guard *guard_object);
+ llvm::Type *ArgTys[] = { GuardPtrTy };
const llvm::FunctionType *FTy =
llvm::FunctionType::get(llvm::Type::getVoidTy(CGM.getLLVMContext()),
- GuardPtrTy, /*isVarArg=*/false);
+ ArgTys, /*isVarArg=*/false);
return CGM.CreateRuntimeFunction(FTy, "__cxa_guard_release");
}
static llvm::Constant *getGuardAbortFn(CodeGenModule &CGM,
- const llvm::PointerType *GuardPtrTy) {
+ llvm::PointerType *GuardPtrTy) {
// void __cxa_guard_abort(__guard *guard_object);
+ llvm::Type *ArgTys[] = { GuardPtrTy };
const llvm::FunctionType *FTy =
llvm::FunctionType::get(llvm::Type::getVoidTy(CGM.getLLVMContext()),
- GuardPtrTy, /*isVarArg=*/false);
+ ArgTys, /*isVarArg=*/false);
return CGM.CreateRuntimeFunction(FTy, "__cxa_guard_abort");
}
@@ -1039,7 +1071,7 @@ namespace {
llvm::GlobalVariable *Guard;
CallGuardAbort(llvm::GlobalVariable *Guard) : Guard(Guard) {}
- void Emit(CodeGenFunction &CGF, bool IsForEH) {
+ void Emit(CodeGenFunction &CGF, Flags flags) {
CGF.Builder.CreateCall(getGuardAbortFn(CGF.CGM, Guard->getType()), Guard)
->setDoesNotThrow();
}
@@ -1055,21 +1087,21 @@ void ItaniumCXXABI::EmitGuardedInit(CodeGenFunction &CGF,
// We only need to use thread-safe statics for local variables;
// global initialization is always single-threaded.
- bool ThreadsafeStatics = (getContext().getLangOptions().ThreadsafeStatics &&
- D.isLocalVarDecl());
+ bool threadsafe =
+ (getContext().getLangOptions().ThreadsafeStatics && D.isLocalVarDecl());
const llvm::IntegerType *GuardTy;
// If we have a global variable with internal linkage and thread-safe statics
// are disabled, we can just let the guard variable be of type i8.
- bool UseInt8GuardVariable = !ThreadsafeStatics && GV->hasInternalLinkage();
- if (UseInt8GuardVariable)
- GuardTy = Builder.getInt8Ty();
- else {
+ bool useInt8GuardVariable = !threadsafe && GV->hasInternalLinkage();
+ if (useInt8GuardVariable) {
+ GuardTy = CGF.Int8Ty;
+ } else {
// Guard variables are 64 bits in the generic ABI and 32 bits on ARM.
- GuardTy = (IsARM ? Builder.getInt32Ty() : Builder.getInt64Ty());
+ GuardTy = (IsARM ? CGF.Int32Ty : CGF.Int64Ty);
}
- const llvm::PointerType *GuardPtrTy = GuardTy->getPointerTo();
+ llvm::PointerType *GuardPtrTy = GuardTy->getPointerTo();
// Create the guard variable.
llvm::SmallString<256> GuardVName;
@@ -1099,7 +1131,7 @@ void ItaniumCXXABI::EmitGuardedInit(CodeGenFunction &CGF,
// if (__cxa_guard_acquire(&obj_guard))
// ...
// }
- if (IsARM && !UseInt8GuardVariable) {
+ if (IsARM && !useInt8GuardVariable) {
llvm::Value *V = Builder.CreateLoad(GuardVariable);
V = Builder.CreateAnd(V, Builder.getInt32(1));
IsInitialized = Builder.CreateIsNull(V, "guard.uninitialized");
@@ -1130,13 +1162,16 @@ void ItaniumCXXABI::EmitGuardedInit(CodeGenFunction &CGF,
llvm::BasicBlock *InitCheckBlock = CGF.createBasicBlock("init.check");
llvm::BasicBlock *EndBlock = CGF.createBasicBlock("init.end");
+ llvm::BasicBlock *NoCheckBlock = EndBlock;
+ if (threadsafe) NoCheckBlock = CGF.createBasicBlock("init.barrier");
+
// Check if the first byte of the guard variable is zero.
- Builder.CreateCondBr(IsInitialized, InitCheckBlock, EndBlock);
+ Builder.CreateCondBr(IsInitialized, InitCheckBlock, NoCheckBlock);
CGF.EmitBlock(InitCheckBlock);
// Variables used when coping with thread-safe statics and exceptions.
- if (ThreadsafeStatics) {
+ if (threadsafe) {
// Call __cxa_guard_acquire.
llvm::Value *V
= Builder.CreateCall(getGuardAcquireFn(CGM, GuardPtrTy), GuardVariable);
@@ -1155,7 +1190,7 @@ void ItaniumCXXABI::EmitGuardedInit(CodeGenFunction &CGF,
// Emit the initializer and add a global destructor if appropriate.
CGF.EmitCXXGlobalVarDeclInit(D, GV);
- if (ThreadsafeStatics) {
+ if (threadsafe) {
// Pop the guard-abort cleanup if we pushed one.
CGF.PopCleanupBlock();
@@ -1165,5 +1200,23 @@ void ItaniumCXXABI::EmitGuardedInit(CodeGenFunction &CGF,
Builder.CreateStore(llvm::ConstantInt::get(GuardTy, 1), GuardVariable);
}
+ // Emit an acquire memory barrier if using thread-safe statics:
+ // Itanium ABI:
+ // An implementation supporting thread-safety on multiprocessor
+ // systems must also guarantee that references to the initialized
+ // object do not occur before the load of the initialization flag.
+ if (threadsafe) {
+ Builder.CreateBr(EndBlock);
+ CGF.EmitBlock(NoCheckBlock);
+
+ llvm::Value *_false = Builder.getFalse();
+ llvm::Value *_true = Builder.getTrue();
+
+ Builder.CreateCall5(CGM.getIntrinsic(llvm::Intrinsic::memory_barrier),
+ /* load-load, load-store */ _true, _true,
+ /* store-load, store-store */ _false, _false,
+ /* device or I/O */ _false);
+ }
+
CGF.EmitBlock(EndBlock);
}
diff --git a/contrib/llvm/tools/clang/lib/CodeGen/TargetInfo.cpp b/contrib/llvm/tools/clang/lib/CodeGen/TargetInfo.cpp
index 043ead7..df2c1bd 100644
--- a/contrib/llvm/tools/clang/lib/CodeGen/TargetInfo.cpp
+++ b/contrib/llvm/tools/clang/lib/CodeGen/TargetInfo.cpp
@@ -75,7 +75,7 @@ void ABIArgInfo::dump() const {
break;
case Indirect:
OS << "Indirect Align=" << getIndirectAlign()
- << " Byal=" << getIndirectByVal()
+ << " ByVal=" << getIndirectByVal()
<< " Realign=" << getIndirectRealign();
break;
case Expand:
@@ -356,9 +356,9 @@ bool UseX86_MMXType(const llvm::Type *IRType) {
IRType->getScalarSizeInBits() != 64;
}
-static const llvm::Type* X86AdjustInlineAsmType(CodeGen::CodeGenFunction &CGF,
- llvm::StringRef Constraint,
- const llvm::Type* Ty) {
+static llvm::Type* X86AdjustInlineAsmType(CodeGen::CodeGenFunction &CGF,
+ llvm::StringRef Constraint,
+ llvm::Type* Ty) {
if ((Constraint == "y" || Constraint == "&y") && Ty->isVectorTy())
return llvm::Type::getX86_MMXTy(CGF.getLLVMContext());
return Ty;
@@ -374,6 +374,7 @@ class X86_32ABIInfo : public ABIInfo {
bool IsDarwinVectorABI;
bool IsSmallStructInRegABI;
+ bool IsMMXDisabled;
static bool isRegisterSize(unsigned Size) {
return (Size == 8 || Size == 16 || Size == 32 || Size == 64);
@@ -403,14 +404,15 @@ public:
virtual llvm::Value *EmitVAArg(llvm::Value *VAListAddr, QualType Ty,
CodeGenFunction &CGF) const;
- X86_32ABIInfo(CodeGen::CodeGenTypes &CGT, bool d, bool p)
- : ABIInfo(CGT), IsDarwinVectorABI(d), IsSmallStructInRegABI(p) {}
+ X86_32ABIInfo(CodeGen::CodeGenTypes &CGT, bool d, bool p, bool m)
+ : ABIInfo(CGT), IsDarwinVectorABI(d), IsSmallStructInRegABI(p),
+ IsMMXDisabled(m) {}
};
class X86_32TargetCodeGenInfo : public TargetCodeGenInfo {
public:
- X86_32TargetCodeGenInfo(CodeGen::CodeGenTypes &CGT, bool d, bool p)
- :TargetCodeGenInfo(new X86_32ABIInfo(CGT, d, p)) {}
+ X86_32TargetCodeGenInfo(CodeGen::CodeGenTypes &CGT, bool d, bool p, bool m)
+ :TargetCodeGenInfo(new X86_32ABIInfo(CGT, d, p, m)) {}
void SetTargetAttributes(const Decl *D, llvm::GlobalValue *GV,
CodeGen::CodeGenModule &CGM) const;
@@ -425,9 +427,9 @@ public:
bool initDwarfEHRegSizeTable(CodeGen::CodeGenFunction &CGF,
llvm::Value *Address) const;
- const llvm::Type* adjustInlineAsmType(CodeGen::CodeGenFunction &CGF,
- llvm::StringRef Constraint,
- const llvm::Type* Ty) const {
+ llvm::Type* adjustInlineAsmType(CodeGen::CodeGenFunction &CGF,
+ llvm::StringRef Constraint,
+ llvm::Type* Ty) const {
return X86AdjustInlineAsmType(CGF, Constraint, Ty);
}
@@ -562,7 +564,7 @@ ABIArgInfo X86_32ABIInfo::classifyReturnType(QualType RetTy) const {
} else if (SeltTy->isPointerType()) {
// FIXME: It would be really nice if this could come out as the proper
// pointer type.
- const llvm::Type *PtrTy = llvm::Type::getInt8PtrTy(getVMContext());
+ llvm::Type *PtrTy = llvm::Type::getInt8PtrTy(getVMContext());
return ABIArgInfo::getDirect(PtrTy);
} else if (SeltTy->isVectorType()) {
// 64- and 128-bit vectors are never returned in a
@@ -699,8 +701,11 @@ ABIArgInfo X86_32ABIInfo::classifyArgumentType(QualType Ty) const {
Size));
}
- const llvm::Type *IRType = CGT.ConvertTypeRecursive(Ty);
+ llvm::Type *IRType = CGT.ConvertType(Ty);
if (UseX86_MMXType(IRType)) {
+ if (IsMMXDisabled)
+ return ABIArgInfo::getDirect(llvm::IntegerType::get(getVMContext(),
+ 64));
ABIArgInfo AAI = ABIArgInfo::getDirect(IRType);
AAI.setCoerceToType(llvm::Type::getX86_MMXTy(getVMContext()));
return AAI;
@@ -820,6 +825,22 @@ class X86_64ABIInfo : public ABIInfo {
/// should just return Memory for the aggregate).
static Class merge(Class Accum, Class Field);
+ /// postMerge - Implement the X86_64 ABI post merging algorithm.
+ ///
+ /// Post merger cleanup, reduces a malformed Hi and Lo pair to
+ /// final MEMORY or SSE classes when necessary.
+ ///
+ /// \param AggregateSize - The size of the current aggregate in
+ /// the classification process.
+ ///
+ /// \param Lo - The classification for the parts of the type
+ /// residing in the low word of the containing object.
+ ///
+ /// \param Hi - The classification for the parts of the type
+ /// residing in the higher words of the containing object.
+ ///
+ void postMerge(unsigned AggregateSize, Class &Lo, Class &Hi) const;
+
/// classify - Determine the x86_64 register classes in which the
/// given type T should be passed.
///
@@ -843,13 +864,13 @@ class X86_64ABIInfo : public ABIInfo {
/// also be ComplexX87.
void classify(QualType T, uint64_t OffsetBase, Class &Lo, Class &Hi) const;
- const llvm::Type *Get16ByteVectorType(QualType Ty) const;
- const llvm::Type *GetSSETypeAtOffset(const llvm::Type *IRType,
- unsigned IROffset, QualType SourceTy,
- unsigned SourceOffset) const;
- const llvm::Type *GetINTEGERTypeAtOffset(const llvm::Type *IRType,
- unsigned IROffset, QualType SourceTy,
- unsigned SourceOffset) const;
+ llvm::Type *GetByteVectorType(QualType Ty) const;
+ llvm::Type *GetSSETypeAtOffset(llvm::Type *IRType,
+ unsigned IROffset, QualType SourceTy,
+ unsigned SourceOffset) const;
+ llvm::Type *GetINTEGERTypeAtOffset(llvm::Type *IRType,
+ unsigned IROffset, QualType SourceTy,
+ unsigned SourceOffset) const;
/// getIndirectResult - Give a source type \arg Ty, return a suitable result
/// such that the argument will be returned in memory.
@@ -921,9 +942,9 @@ public:
return false;
}
- const llvm::Type* adjustInlineAsmType(CodeGen::CodeGenFunction &CGF,
- llvm::StringRef Constraint,
- const llvm::Type* Ty) const {
+ llvm::Type* adjustInlineAsmType(CodeGen::CodeGenFunction &CGF,
+ llvm::StringRef Constraint,
+ llvm::Type* Ty) const {
return X86AdjustInlineAsmType(CGF, Constraint, Ty);
}
@@ -956,6 +977,39 @@ public:
}
+void X86_64ABIInfo::postMerge(unsigned AggregateSize, Class &Lo,
+ Class &Hi) const {
+ // AMD64-ABI 3.2.3p2: Rule 5. Then a post merger cleanup is done:
+ //
+ // (a) If one of the classes is Memory, the whole argument is passed in
+ // memory.
+ //
+ // (b) If X87UP is not preceded by X87, the whole argument is passed in
+ // memory.
+ //
+ // (c) If the size of the aggregate exceeds two eightbytes and the first
+ // eightbyte isn't SSE or any other eightbyte isn't SSEUP, the whole
+ // argument is passed in memory. NOTE: This is necessary to keep the
+ // ABI working for processors that don't support the __m256 type.
+ //
+ // (d) If SSEUP is not preceded by SSE or SSEUP, it is converted to SSE.
+ //
+ // Some of these are enforced by the merging logic. Others can arise
+ // only with unions; for example:
+ // union { _Complex double; unsigned; }
+ //
+ // Note that clauses (b) and (c) were added in 0.98.
+ //
+ if (Hi == Memory)
+ Lo = Memory;
+ if (Hi == X87Up && Lo != X87 && honorsRevision0_98())
+ Lo = Memory;
+ if (AggregateSize > 128 && (Lo != SSE || Hi != SSEUp))
+ Lo = Memory;
+ if (Hi == SSEUp && Lo != SSE)
+ Hi = SSE;
+}
+
X86_64ABIInfo::Class X86_64ABIInfo::merge(Class Accum, Class Field) {
// AMD64-ABI 3.2.3p2: Rule 4. Each field of an object is
// classified recursively so that always two fields are
@@ -1082,7 +1136,14 @@ void X86_64ABIInfo::classify(QualType Ty, uint64_t OffsetBase,
// split.
if (OffsetBase && OffsetBase != 64)
Hi = Lo;
- } else if (Size == 128) {
+ } else if (Size == 128 || Size == 256) {
+ // Arguments of 256-bits are split into four eightbyte chunks. The
+ // least significant one belongs to class SSE and all the others to class
+ // SSEUP. The original Lo and Hi design considers that types can't be
+ // greater than 128-bits, so a 64-bit split in Hi and Lo makes sense.
+ // This design isn't correct for 256-bits, but since there're no cases
+ // where the upper parts would need to be inspected, avoid adding
+ // complexity and just consider Hi to match the 64-256 part.
Lo = SSE;
Hi = SSEUp;
}
@@ -1121,8 +1182,8 @@ void X86_64ABIInfo::classify(QualType Ty, uint64_t OffsetBase,
uint64_t Size = getContext().getTypeSize(Ty);
// AMD64-ABI 3.2.3p2: Rule 1. If the size of an object is larger
- // than two eightbytes, ..., it has class MEMORY.
- if (Size > 128)
+ // than four eightbytes, ..., it has class MEMORY.
+ if (Size > 256)
return;
// AMD64-ABI 3.2.3p2: Rule 1. If ..., or it contains unaligned
@@ -1137,6 +1198,13 @@ void X86_64ABIInfo::classify(QualType Ty, uint64_t OffsetBase,
Current = NoClass;
uint64_t EltSize = getContext().getTypeSize(AT->getElementType());
uint64_t ArraySize = AT->getSize().getZExtValue();
+
+ // The only case a 256-bit wide vector could be used is when the array
+ // contains a single 256-bit element. Since Lo and Hi logic isn't extended
+ // to work for sizes wider than 128, early check and fallback to memory.
+ if (Size > 128 && EltSize != 256)
+ return;
+
for (uint64_t i=0, Offset=OffsetBase; i<ArraySize; ++i, Offset += EltSize) {
Class FieldLo, FieldHi;
classify(AT->getElementType(), Offset, FieldLo, FieldHi);
@@ -1146,9 +1214,7 @@ void X86_64ABIInfo::classify(QualType Ty, uint64_t OffsetBase,
break;
}
- // Do post merger cleanup (see below). Only case we worry about is Memory.
- if (Hi == Memory)
- Lo = Memory;
+ postMerge(Size, Lo, Hi);
assert((Hi != SSEUp || Lo == SSE) && "Invalid SSEUp array classification.");
return;
}
@@ -1157,8 +1223,8 @@ void X86_64ABIInfo::classify(QualType Ty, uint64_t OffsetBase,
uint64_t Size = getContext().getTypeSize(Ty);
// AMD64-ABI 3.2.3p2: Rule 1. If the size of an object is larger
- // than two eightbytes, ..., it has class MEMORY.
- if (Size > 128)
+ // than four eightbytes, ..., it has class MEMORY.
+ if (Size > 256)
return;
// AMD64-ABI 3.2.3p2: Rule 2. If a C++ object has either a non-trivial
@@ -1209,9 +1275,17 @@ void X86_64ABIInfo::classify(QualType Ty, uint64_t OffsetBase,
uint64_t Offset = OffsetBase + Layout.getFieldOffset(idx);
bool BitField = i->isBitField();
- // AMD64-ABI 3.2.3p2: Rule 1. If ..., or it contains unaligned
- // fields, it has class MEMORY.
+ // AMD64-ABI 3.2.3p2: Rule 1. If the size of an object is larger than
+ // four eightbytes, or it contains unaligned fields, it has class MEMORY.
+ //
+ // The only case a 256-bit wide vector could be used is when the struct
+ // contains a single 256-bit element. Since Lo and Hi logic isn't extended
+ // to work for sizes wider than 128, early check and fallback to memory.
//
+ if (Size > 128 && getContext().getTypeSize(i->getType()) != 256) {
+ Lo = Memory;
+ return;
+ }
// Note, skip this test for bit-fields, see below.
if (!BitField && Offset % getContext().getTypeAlign(i->getType())) {
Lo = Memory;
@@ -1257,31 +1331,7 @@ void X86_64ABIInfo::classify(QualType Ty, uint64_t OffsetBase,
break;
}
- // AMD64-ABI 3.2.3p2: Rule 5. Then a post merger cleanup is done:
- //
- // (a) If one of the classes is MEMORY, the whole argument is
- // passed in memory.
- //
- // (b) If X87UP is not preceded by X87, the whole argument is
- // passed in memory.
- //
- // (c) If the size of the aggregate exceeds two eightbytes and the first
- // eight-byte isn’t SSE or any other eightbyte isn’t SSEUP, the whole
- // argument is passed in memory.
- //
- // (d) If SSEUP is not preceded by SSE or SSEUP, it is converted to SSE.
- //
- // Some of these are enforced by the merging logic. Others can arise
- // only with unions; for example:
- // union { _Complex double; unsigned; }
- //
- // Note that clauses (b) and (c) were added in 0.98.
- if (Hi == Memory)
- Lo = Memory;
- if (Hi == X87Up && Lo != X87 && honorsRevision0_98())
- Lo = Memory;
- if (Hi == SSEUp && Lo != SSE)
- Hi = SSE;
+ postMerge(Size, Lo, Hi);
}
}
@@ -1321,24 +1371,25 @@ ABIArgInfo X86_64ABIInfo::getIndirectResult(QualType Ty) const {
return ABIArgInfo::getIndirect(Align);
}
-/// Get16ByteVectorType - The ABI specifies that a value should be passed in an
-/// full vector XMM register. Pick an LLVM IR type that will be passed as a
+/// GetByteVectorType - The ABI specifies that a value should be passed in an
+/// full vector XMM/YMM register. Pick an LLVM IR type that will be passed as a
/// vector register.
-const llvm::Type *X86_64ABIInfo::Get16ByteVectorType(QualType Ty) const {
- const llvm::Type *IRType = CGT.ConvertTypeRecursive(Ty);
+llvm::Type *X86_64ABIInfo::GetByteVectorType(QualType Ty) const {
+ llvm::Type *IRType = CGT.ConvertType(Ty);
// Wrapper structs that just contain vectors are passed just like vectors,
// strip them off if present.
- const llvm::StructType *STy = dyn_cast<llvm::StructType>(IRType);
+ llvm::StructType *STy = dyn_cast<llvm::StructType>(IRType);
while (STy && STy->getNumElements() == 1) {
IRType = STy->getElementType(0);
STy = dyn_cast<llvm::StructType>(IRType);
}
// If the preferred type is a 16-byte vector, prefer to pass it.
- if (const llvm::VectorType *VT = dyn_cast<llvm::VectorType>(IRType)){
- const llvm::Type *EltTy = VT->getElementType();
- if (VT->getBitWidth() == 128 &&
+ if (llvm::VectorType *VT = dyn_cast<llvm::VectorType>(IRType)){
+ llvm::Type *EltTy = VT->getElementType();
+ unsigned BitWidth = VT->getBitWidth();
+ if ((BitWidth == 128 || BitWidth == 256) &&
(EltTy->isFloatTy() || EltTy->isDoubleTy() ||
EltTy->isIntegerTy(8) || EltTy->isIntegerTy(16) ||
EltTy->isIntegerTy(32) || EltTy->isIntegerTy(64) ||
@@ -1466,8 +1517,8 @@ static bool ContainsFloatAtOffset(const llvm::Type *IRType, unsigned IROffset,
/// GetSSETypeAtOffset - Return a type that will be passed by the backend in the
/// low 8 bytes of an XMM register, corresponding to the SSE class.
-const llvm::Type *X86_64ABIInfo::
-GetSSETypeAtOffset(const llvm::Type *IRType, unsigned IROffset,
+llvm::Type *X86_64ABIInfo::
+GetSSETypeAtOffset(llvm::Type *IRType, unsigned IROffset,
QualType SourceTy, unsigned SourceOffset) const {
// The only three choices we have are either double, <2 x float>, or float. We
// pass as float if the last 4 bytes is just padding. This happens for
@@ -1501,8 +1552,8 @@ GetSSETypeAtOffset(const llvm::Type *IRType, unsigned IROffset,
/// SourceTy is the source level type for the entire argument. SourceOffset is
/// an offset into this that we're processing (which is always either 0 or 8).
///
-const llvm::Type *X86_64ABIInfo::
-GetINTEGERTypeAtOffset(const llvm::Type *IRType, unsigned IROffset,
+llvm::Type *X86_64ABIInfo::
+GetINTEGERTypeAtOffset(llvm::Type *IRType, unsigned IROffset,
QualType SourceTy, unsigned SourceOffset) const {
// If we're dealing with an un-offset LLVM IR type, then it means that we're
// returning an 8-byte unit starting with it. See if we can safely use it.
@@ -1540,7 +1591,7 @@ GetINTEGERTypeAtOffset(const llvm::Type *IRType, unsigned IROffset,
}
if (const llvm::ArrayType *ATy = dyn_cast<llvm::ArrayType>(IRType)) {
- const llvm::Type *EltTy = ATy->getElementType();
+ llvm::Type *EltTy = ATy->getElementType();
unsigned EltSize = getTargetData().getTypeAllocSize(EltTy);
unsigned EltOffset = IROffset/EltSize*EltSize;
return GetINTEGERTypeAtOffset(EltTy, IROffset-EltOffset, SourceTy,
@@ -1566,8 +1617,8 @@ GetINTEGERTypeAtOffset(const llvm::Type *IRType, unsigned IROffset,
/// first class aggregate to represent them. For example, if the low part of
/// a by-value argument should be passed as i32* and the high part as float,
/// return {i32*, float}.
-static const llvm::Type *
-GetX86_64ByValArgumentPair(const llvm::Type *Lo, const llvm::Type *Hi,
+static llvm::Type *
+GetX86_64ByValArgumentPair(llvm::Type *Lo, llvm::Type *Hi,
const llvm::TargetData &TD) {
// In order to correctly satisfy the ABI, we need to the high part to start
// at offset 8. If the high and low parts we inferred are both 4-byte types
@@ -1594,8 +1645,7 @@ GetX86_64ByValArgumentPair(const llvm::Type *Lo, const llvm::Type *Hi,
}
}
- const llvm::StructType *Result =
- llvm::StructType::get(Lo->getContext(), Lo, Hi, NULL);
+ llvm::StructType *Result = llvm::StructType::get(Lo, Hi, NULL);
// Verify that the second element is at an 8-byte offset.
@@ -1615,7 +1665,7 @@ classifyReturnType(QualType RetTy) const {
assert((Hi != Memory || Lo == Memory) && "Invalid memory classification.");
assert((Hi != SSEUp || Lo == SSE) && "Invalid SSEUp classification.");
- const llvm::Type *ResType = 0;
+ llvm::Type *ResType = 0;
switch (Lo) {
case NoClass:
if (Hi == NoClass)
@@ -1638,8 +1688,7 @@ classifyReturnType(QualType RetTy) const {
// AMD64-ABI 3.2.3p4: Rule 3. If the class is INTEGER, the next
// available register of the sequence %rax, %rdx is used.
case Integer:
- ResType = GetINTEGERTypeAtOffset(CGT.ConvertTypeRecursive(RetTy), 0,
- RetTy, 0);
+ ResType = GetINTEGERTypeAtOffset(CGT.ConvertType(RetTy), 0, RetTy, 0);
// If we have a sign or zero extended integer, make sure to return Extend
// so that the parameter gets the right LLVM IR attributes.
@@ -1657,7 +1706,7 @@ classifyReturnType(QualType RetTy) const {
// AMD64-ABI 3.2.3p4: Rule 4. If the class is SSE, the next
// available SSE register of the sequence %xmm0, %xmm1 is used.
case SSE:
- ResType = GetSSETypeAtOffset(CGT.ConvertTypeRecursive(RetTy), 0, RetTy, 0);
+ ResType = GetSSETypeAtOffset(CGT.ConvertType(RetTy), 0, RetTy, 0);
break;
// AMD64-ABI 3.2.3p4: Rule 6. If the class is X87, the value is
@@ -1671,14 +1720,13 @@ classifyReturnType(QualType RetTy) const {
// %st1.
case ComplexX87:
assert(Hi == ComplexX87 && "Unexpected ComplexX87 classification.");
- ResType = llvm::StructType::get(getVMContext(),
- llvm::Type::getX86_FP80Ty(getVMContext()),
+ ResType = llvm::StructType::get(llvm::Type::getX86_FP80Ty(getVMContext()),
llvm::Type::getX86_FP80Ty(getVMContext()),
NULL);
break;
}
- const llvm::Type *HighPart = 0;
+ llvm::Type *HighPart = 0;
switch (Hi) {
// Memory was handled previously and X87 should
// never occur as a hi class.
@@ -1691,24 +1739,24 @@ classifyReturnType(QualType RetTy) const {
break;
case Integer:
- HighPart = GetINTEGERTypeAtOffset(CGT.ConvertTypeRecursive(RetTy),
- 8, RetTy, 8);
+ HighPart = GetINTEGERTypeAtOffset(CGT.ConvertType(RetTy), 8, RetTy, 8);
if (Lo == NoClass) // Return HighPart at offset 8 in memory.
return ABIArgInfo::getDirect(HighPart, 8);
break;
case SSE:
- HighPart = GetSSETypeAtOffset(CGT.ConvertTypeRecursive(RetTy), 8, RetTy, 8);
+ HighPart = GetSSETypeAtOffset(CGT.ConvertType(RetTy), 8, RetTy, 8);
if (Lo == NoClass) // Return HighPart at offset 8 in memory.
return ABIArgInfo::getDirect(HighPart, 8);
break;
// AMD64-ABI 3.2.3p4: Rule 5. If the class is SSEUP, the eightbyte
- // is passed in the upper half of the last used SSE register.
+ // is passed in the next available eightbyte chunk if the last used
+ // vector register.
//
// SSEUP should always be preceded by SSE, just widen.
case SSEUp:
assert(Lo == SSE && "Unexpected SSEUp classification.");
- ResType = Get16ByteVectorType(RetTy);
+ ResType = GetByteVectorType(RetTy);
break;
// AMD64-ABI 3.2.3p4: Rule 7. If the class is X87UP, the value is
@@ -1719,8 +1767,7 @@ classifyReturnType(QualType RetTy) const {
// preceded by X87. In such situations we follow gcc and pass the
// extra bits in an SSE reg.
if (Lo != X87) {
- HighPart = GetSSETypeAtOffset(CGT.ConvertTypeRecursive(RetTy),
- 8, RetTy, 8);
+ HighPart = GetSSETypeAtOffset(CGT.ConvertType(RetTy), 8, RetTy, 8);
if (Lo == NoClass) // Return HighPart at offset 8 in memory.
return ABIArgInfo::getDirect(HighPart, 8);
}
@@ -1748,7 +1795,7 @@ ABIArgInfo X86_64ABIInfo::classifyArgumentType(QualType Ty, unsigned &neededInt,
neededInt = 0;
neededSSE = 0;
- const llvm::Type *ResType = 0;
+ llvm::Type *ResType = 0;
switch (Lo) {
case NoClass:
if (Hi == NoClass)
@@ -1767,6 +1814,8 @@ ABIArgInfo X86_64ABIInfo::classifyArgumentType(QualType Ty, unsigned &neededInt,
// COMPLEX_X87, it is passed in memory.
case X87:
case ComplexX87:
+ if (isRecordWithNonTrivialDestructorOrCopyConstructor(Ty))
+ ++neededInt;
return getIndirectResult(Ty);
case SSEUp:
@@ -1780,7 +1829,7 @@ ABIArgInfo X86_64ABIInfo::classifyArgumentType(QualType Ty, unsigned &neededInt,
++neededInt;
// Pick an 8-byte type based on the preferred type.
- ResType = GetINTEGERTypeAtOffset(CGT.ConvertTypeRecursive(Ty), 0, Ty, 0);
+ ResType = GetINTEGERTypeAtOffset(CGT.ConvertType(Ty), 0, Ty, 0);
// If we have a sign or zero extended integer, make sure to return Extend
// so that the parameter gets the right LLVM IR attributes.
@@ -1800,19 +1849,14 @@ ABIArgInfo X86_64ABIInfo::classifyArgumentType(QualType Ty, unsigned &neededInt,
// available SSE register is used, the registers are taken in the
// order from %xmm0 to %xmm7.
case SSE: {
- const llvm::Type *IRType = CGT.ConvertTypeRecursive(Ty);
- if (Hi != NoClass || !UseX86_MMXType(IRType))
- ResType = GetSSETypeAtOffset(IRType, 0, Ty, 0);
- else
- // This is an MMX type. Treat it as such.
- ResType = llvm::Type::getX86_MMXTy(getVMContext());
-
+ llvm::Type *IRType = CGT.ConvertType(Ty);
+ ResType = GetSSETypeAtOffset(IRType, 0, Ty, 0);
++neededSSE;
break;
}
}
- const llvm::Type *HighPart = 0;
+ llvm::Type *HighPart = 0;
switch (Hi) {
// Memory was handled previously, ComplexX87 and X87 should
// never occur as hi classes, and X87Up must be preceded by X87,
@@ -1828,7 +1872,7 @@ ABIArgInfo X86_64ABIInfo::classifyArgumentType(QualType Ty, unsigned &neededInt,
case Integer:
++neededInt;
// Pick an 8-byte type based on the preferred type.
- HighPart = GetINTEGERTypeAtOffset(CGT.ConvertTypeRecursive(Ty), 8, Ty, 8);
+ HighPart = GetINTEGERTypeAtOffset(CGT.ConvertType(Ty), 8, Ty, 8);
if (Lo == NoClass) // Pass HighPart at offset 8 in memory.
return ABIArgInfo::getDirect(HighPart, 8);
@@ -1838,7 +1882,7 @@ ABIArgInfo X86_64ABIInfo::classifyArgumentType(QualType Ty, unsigned &neededInt,
// memory), except in situations involving unions.
case X87Up:
case SSE:
- HighPart = GetSSETypeAtOffset(CGT.ConvertTypeRecursive(Ty), 8, Ty, 8);
+ HighPart = GetSSETypeAtOffset(CGT.ConvertType(Ty), 8, Ty, 8);
if (Lo == NoClass) // Pass HighPart at offset 8 in memory.
return ABIArgInfo::getDirect(HighPart, 8);
@@ -1851,7 +1895,7 @@ ABIArgInfo X86_64ABIInfo::classifyArgumentType(QualType Ty, unsigned &neededInt,
// register. This only happens when 128-bit vectors are passed.
case SSEUp:
assert(Lo == SSE && "Unexpected SSEUp classification");
- ResType = Get16ByteVectorType(Ty);
+ ResType = GetByteVectorType(Ty);
break;
}
@@ -2059,10 +2103,10 @@ llvm::Value *X86_64ABIInfo::EmitVAArg(llvm::Value *VAListAddr, QualType Ty,
// area, we need to collect the two eightbytes together.
llvm::Value *RegAddrLo = CGF.Builder.CreateGEP(RegAddr, fp_offset);
llvm::Value *RegAddrHi = CGF.Builder.CreateConstGEP1_32(RegAddrLo, 16);
- const llvm::Type *DoubleTy = llvm::Type::getDoubleTy(VMContext);
+ llvm::Type *DoubleTy = llvm::Type::getDoubleTy(VMContext);
const llvm::Type *DblPtrTy =
llvm::PointerType::getUnqual(DoubleTy);
- const llvm::StructType *ST = llvm::StructType::get(VMContext, DoubleTy,
+ const llvm::StructType *ST = llvm::StructType::get(DoubleTy,
DoubleTy, NULL);
llvm::Value *V, *Tmp = CGF.CreateTempAlloca(ST);
V = CGF.Builder.CreateLoad(CGF.Builder.CreateBitCast(RegAddrLo,
@@ -2277,6 +2321,10 @@ public:
return 13;
}
+ llvm::StringRef getARCRetainAutoreleasedReturnValueMarker() const {
+ return "mov\tr7, r7\t\t@ marker for objc_retainAutoreleaseReturnValue";
+ }
+
bool initDwarfEHRegSizeTable(CodeGen::CodeGenFunction &CGF,
llvm::Value *Address) const {
CodeGen::CGBuilderTy &Builder = CGF.Builder;
@@ -2290,8 +2338,6 @@ public:
return false;
}
-
-
};
}
@@ -2371,9 +2417,8 @@ ABIArgInfo ARMABIInfo::classifyArgumentType(QualType Ty) const {
SizeRegs = (getContext().getTypeSize(Ty) + 63) / 64;
}
- const llvm::Type *STy =
- llvm::StructType::get(getVMContext(),
- llvm::ArrayType::get(ElemTy, SizeRegs), NULL, NULL);
+ llvm::Type *STy =
+ llvm::StructType::get(llvm::ArrayType::get(ElemTy, SizeRegs), NULL);
return ABIArgInfo::getDirect(STy);
}
@@ -3010,10 +3055,12 @@ const TargetCodeGenInfo &CodeGenModule::getTargetCodeGenInfo() {
case llvm::Triple::msp430:
return *(TheTargetCodeGenInfo = new MSP430TargetCodeGenInfo(Types));
- case llvm::Triple::x86:
+ case llvm::Triple::x86: {
+ bool DisableMMX = strcmp(getContext().Target.getABI(), "no-mmx") == 0;
+
if (Triple.isOSDarwin())
return *(TheTargetCodeGenInfo =
- new X86_32TargetCodeGenInfo(Types, true, true));
+ new X86_32TargetCodeGenInfo(Types, true, true, DisableMMX));
switch (Triple.getOS()) {
case llvm::Triple::Cygwin:
@@ -3024,12 +3071,13 @@ const TargetCodeGenInfo &CodeGenModule::getTargetCodeGenInfo() {
case llvm::Triple::OpenBSD:
case llvm::Triple::NetBSD:
return *(TheTargetCodeGenInfo =
- new X86_32TargetCodeGenInfo(Types, false, true));
+ new X86_32TargetCodeGenInfo(Types, false, true, DisableMMX));
default:
return *(TheTargetCodeGenInfo =
- new X86_32TargetCodeGenInfo(Types, false, false));
+ new X86_32TargetCodeGenInfo(Types, false, false, DisableMMX));
}
+ }
case llvm::Triple::x86_64:
switch (Triple.getOS()) {
diff --git a/contrib/llvm/tools/clang/lib/CodeGen/TargetInfo.h b/contrib/llvm/tools/clang/lib/CodeGen/TargetInfo.h
index 4f59eb6..d5e8884 100644
--- a/contrib/llvm/tools/clang/lib/CodeGen/TargetInfo.h
+++ b/contrib/llvm/tools/clang/lib/CodeGen/TargetInfo.h
@@ -106,11 +106,25 @@ namespace clang {
return Address;
}
- virtual const llvm::Type* adjustInlineAsmType(CodeGen::CodeGenFunction &CGF,
- llvm::StringRef Constraint,
- const llvm::Type* Ty) const {
+ virtual llvm::Type* adjustInlineAsmType(CodeGen::CodeGenFunction &CGF,
+ llvm::StringRef Constraint,
+ llvm::Type* Ty) const {
return Ty;
}
+
+ /// Retrieve the address of a function to call immediately before
+ /// calling objc_retainAutoreleasedReturnValue. The
+ /// implementation of objc_autoreleaseReturnValue sniffs the
+ /// instruction stream following its return address to decide
+ /// whether it's a call to objc_retainAutoreleasedReturnValue.
+ /// This can be prohibitively expensive, depending on the
+ /// relocation model, and so on some targets it instead sniffs for
+ /// a particular instruction sequence. This functions returns
+ /// that instruction sequence in inline assembly, which will be
+ /// empty if none is required.
+ virtual llvm::StringRef getARCRetainAutoreleasedReturnValueMarker() const {
+ return "";
+ }
};
}
diff --git a/contrib/llvm/tools/clang/lib/Driver/Arg.cpp b/contrib/llvm/tools/clang/lib/Driver/Arg.cpp
index f1177cf..39b7e55 100644
--- a/contrib/llvm/tools/clang/lib/Driver/Arg.cpp
+++ b/contrib/llvm/tools/clang/lib/Driver/Arg.cpp
@@ -113,7 +113,7 @@ void Arg::render(const ArgList &Args, ArgStringList &Output) const {
break;
case Option::RenderSeparateStyle:
- Output.push_back(getOption().getName());
+ Output.push_back(getOption().getName().data());
for (unsigned i = 0, e = getNumValues(); i != e; ++i)
Output.push_back(getValue(Args, i));
break;
diff --git a/contrib/llvm/tools/clang/lib/Driver/ArgList.cpp b/contrib/llvm/tools/clang/lib/Driver/ArgList.cpp
index 596e2a7..b8af9cc 100644
--- a/contrib/llvm/tools/clang/lib/Driver/ArgList.cpp
+++ b/contrib/llvm/tools/clang/lib/Driver/ArgList.cpp
@@ -287,9 +287,9 @@ Arg *DerivedArgList::MakeSeparateArg(const Arg *BaseArg, const Option *Opt,
Arg *DerivedArgList::MakeJoinedArg(const Arg *BaseArg, const Option *Opt,
llvm::StringRef Value) const {
- unsigned Index = BaseArgs.MakeIndex(Opt->getName() + Value.str());
+ unsigned Index = BaseArgs.MakeIndex(Opt->getName().str() + Value.str());
Arg *A = new Arg(Opt, Index,
- BaseArgs.getArgString(Index) + strlen(Opt->getName()),
+ BaseArgs.getArgString(Index) + Opt->getName().size(),
BaseArg);
SynthesizedArgs.push_back(A);
return A;
diff --git a/contrib/llvm/tools/clang/lib/Driver/Driver.cpp b/contrib/llvm/tools/clang/lib/Driver/Driver.cpp
index 20bc495..0860572 100644
--- a/contrib/llvm/tools/clang/lib/Driver/Driver.cpp
+++ b/contrib/llvm/tools/clang/lib/Driver/Driver.cpp
@@ -458,11 +458,20 @@ bool Driver::HandleImmediateArgs(const Compilation &C) {
}
llvm::outs() << "\n";
llvm::outs() << "libraries: =";
+
+ std::string sysroot;
+ if (Arg *A = C.getArgs().getLastArg(options::OPT__sysroot_EQ))
+ sysroot = A->getValue(C.getArgs());
+
for (ToolChain::path_list::const_iterator it = TC.getFilePaths().begin(),
ie = TC.getFilePaths().end(); it != ie; ++it) {
if (it != TC.getFilePaths().begin())
llvm::outs() << ':';
- llvm::outs() << *it;
+ const char *path = it->c_str();
+ if (path[0] == '=')
+ llvm::outs() << sysroot << path + 1;
+ else
+ llvm::outs() << path;
}
llvm::outs() << "\n";
return false;
@@ -942,10 +951,6 @@ Action *Driver::ConstructPhaseAction(const ArgList &Args, phases::ID Phase,
case phases::Precompile:
return new PrecompileJobAction(Input, types::TY_PCH);
case phases::Compile: {
- bool HasO4 = false;
- if (const Arg *A = Args.getLastArg(options::OPT_O_Group))
- HasO4 = A->getOption().matches(options::OPT_O4);
-
if (Args.hasArg(options::OPT_fsyntax_only)) {
return new CompileJobAction(Input, types::TY_Nothing);
} else if (Args.hasArg(options::OPT_rewrite_objc)) {
@@ -954,9 +959,7 @@ Action *Driver::ConstructPhaseAction(const ArgList &Args, phases::ID Phase,
return new AnalyzeJobAction(Input, types::TY_Plist);
} else if (Args.hasArg(options::OPT_emit_ast)) {
return new CompileJobAction(Input, types::TY_AST);
- } else if (Args.hasArg(options::OPT_emit_llvm) ||
- Args.hasFlag(options::OPT_flto, options::OPT_fno_lto, false) ||
- HasO4) {
+ } else if (IsUsingLTO(Args)) {
types::ID Output =
Args.hasArg(options::OPT_S) ? types::TY_LTO_IR : types::TY_LTO_BC;
return new CompileJobAction(Input, Output);
@@ -972,6 +975,19 @@ Action *Driver::ConstructPhaseAction(const ArgList &Args, phases::ID Phase,
return 0;
}
+bool Driver::IsUsingLTO(const ArgList &Args) const {
+ // Check for -emit-llvm or -flto.
+ if (Args.hasArg(options::OPT_emit_llvm) ||
+ Args.hasFlag(options::OPT_flto, options::OPT_fno_lto, false))
+ return true;
+
+ // Check for -O4.
+ if (const Arg *A = Args.getLastArg(options::OPT_O_Group))
+ return A->getOption().matches(options::OPT_O4);
+
+ return false;
+}
+
void Driver::BuildJobs(Compilation &C) const {
llvm::PrettyStackTraceString CrashInfo("Building compilation jobs");
@@ -1245,6 +1261,15 @@ const char *Driver::GetNamedOutputPath(Compilation &C,
NamedOutput = C.getArgs().MakeArgString(Suffixed.c_str());
}
+ // If we're saving temps and the temp filename conflicts with the input
+ // filename, then avoid overwriting input file.
+ if (!AtTopLevel && C.getArgs().hasArg(options::OPT_save_temps) &&
+ NamedOutput == BaseName) {
+ std::string TmpName =
+ GetTemporaryPath(types::getTypeTempSuffix(JA.getType()));
+ return C.addTempFile(C.getArgs().MakeArgString(TmpName.c_str()));
+ }
+
// As an annoying special case, PCH generation doesn't strip the pathname.
if (JA.getType() == types::TY_PCH) {
llvm::sys::path::remove_filename(BasePath);
diff --git a/contrib/llvm/tools/clang/lib/Driver/Option.cpp b/contrib/llvm/tools/clang/lib/Driver/Option.cpp
index a992cef..90d21a3 100644
--- a/contrib/llvm/tools/clang/lib/Driver/Option.cpp
+++ b/contrib/llvm/tools/clang/lib/Driver/Option.cpp
@@ -144,7 +144,7 @@ FlagOption::FlagOption(OptSpecifier ID, const char *Name,
Arg *FlagOption::accept(const ArgList &Args, unsigned &Index) const {
// Matches iff this is an exact match.
// FIXME: Avoid strlen.
- if (strlen(getName()) != strlen(Args.getArgString(Index)))
+ if (getName().size() != strlen(Args.getArgString(Index)))
return 0;
return new Arg(getUnaliasedOption(), Index++);
@@ -157,7 +157,7 @@ JoinedOption::JoinedOption(OptSpecifier ID, const char *Name,
Arg *JoinedOption::accept(const ArgList &Args, unsigned &Index) const {
// Always matches.
- const char *Value = Args.getArgString(Index) + strlen(getName());
+ const char *Value = Args.getArgString(Index) + getName().size();
return new Arg(getUnaliasedOption(), Index++, Value);
}
@@ -170,7 +170,7 @@ CommaJoinedOption::CommaJoinedOption(OptSpecifier ID, const char *Name,
Arg *CommaJoinedOption::accept(const ArgList &Args,
unsigned &Index) const {
// Always matches.
- const char *Str = Args.getArgString(Index) + strlen(getName());
+ const char *Str = Args.getArgString(Index) + getName().size();
Arg *A = new Arg(getUnaliasedOption(), Index++);
// Parse out the comma separated values.
@@ -205,7 +205,7 @@ SeparateOption::SeparateOption(OptSpecifier ID, const char *Name,
Arg *SeparateOption::accept(const ArgList &Args, unsigned &Index) const {
// Matches iff this is an exact match.
// FIXME: Avoid strlen.
- if (strlen(getName()) != strlen(Args.getArgString(Index)))
+ if (getName().size() != strlen(Args.getArgString(Index)))
return 0;
Index += 2;
@@ -225,7 +225,7 @@ MultiArgOption::MultiArgOption(OptSpecifier ID, const char *Name,
Arg *MultiArgOption::accept(const ArgList &Args, unsigned &Index) const {
// Matches iff this is an exact match.
// FIXME: Avoid strlen.
- if (strlen(getName()) != strlen(Args.getArgString(Index)))
+ if (getName().size() != strlen(Args.getArgString(Index)))
return 0;
Index += 1 + NumArgs;
@@ -250,8 +250,8 @@ Arg *JoinedOrSeparateOption::accept(const ArgList &Args,
unsigned &Index) const {
// If this is not an exact match, it is a joined arg.
// FIXME: Avoid strlen.
- if (strlen(getName()) != strlen(Args.getArgString(Index))) {
- const char *Value = Args.getArgString(Index) + strlen(getName());
+ if (getName().size() != strlen(Args.getArgString(Index))) {
+ const char *Value = Args.getArgString(Index) + getName().size();
return new Arg(this, Index++, Value);
}
@@ -279,6 +279,6 @@ Arg *JoinedAndSeparateOption::accept(const ArgList &Args,
return 0;
return new Arg(getUnaliasedOption(), Index - 2,
- Args.getArgString(Index-2)+strlen(getName()),
+ Args.getArgString(Index-2)+getName().size(),
Args.getArgString(Index-1));
}
diff --git a/contrib/llvm/tools/clang/lib/Driver/ToolChain.cpp b/contrib/llvm/tools/clang/lib/Driver/ToolChain.cpp
index d919915..74b6591 100644
--- a/contrib/llvm/tools/clang/lib/Driver/ToolChain.cpp
+++ b/contrib/llvm/tools/clang/lib/Driver/ToolChain.cpp
@@ -15,7 +15,9 @@
#include "clang/Driver/Driver.h"
#include "clang/Driver/DriverDiagnostic.h"
#include "clang/Driver/HostInfo.h"
+#include "clang/Driver/ObjCRuntime.h"
#include "clang/Driver/Options.h"
+#include "llvm/Support/ErrorHandling.h"
using namespace clang::driver;
@@ -47,6 +49,25 @@ bool ToolChain::HasNativeLLVMSupport() const {
return false;
}
+void ToolChain::configureObjCRuntime(ObjCRuntime &runtime) const {
+ switch (runtime.getKind()) {
+ case ObjCRuntime::NeXT:
+ // Assume a minimal NeXT runtime.
+ runtime.HasARC = false;
+ runtime.HasWeak = false;
+ runtime.HasTerminate = false;
+ return;
+
+ case ObjCRuntime::GNU:
+ // Assume a maximal GNU runtime.
+ runtime.HasARC = true;
+ runtime.HasWeak = true;
+ runtime.HasTerminate = false; // to be added
+ return;
+ }
+ llvm_unreachable("invalid runtime kind!");
+}
+
/// getARMTargetCPU - Get the (LLVM) name of the ARM cpu we are targeting.
//
// FIXME: tblgen this.
@@ -201,18 +222,21 @@ ToolChain::CXXStdlibType ToolChain::GetCXXStdlibType(const ArgList &Args) const{
}
void ToolChain::AddClangCXXStdlibIncludeArgs(const ArgList &Args,
- ArgStringList &CmdArgs) const {
+ ArgStringList &CmdArgs,
+ bool ObjCXXAutoRefCount) const {
CXXStdlibType Type = GetCXXStdlibType(Args);
+ // Header search paths are handled by the mass of goop in InitHeaderSearch.
+
switch (Type) {
case ToolChain::CST_Libcxx:
- CmdArgs.push_back("-nostdinc++");
- CmdArgs.push_back("-cxx-isystem");
- CmdArgs.push_back("/usr/include/c++/v1");
+ if (ObjCXXAutoRefCount)
+ CmdArgs.push_back("-fobjc-arc-cxxlib=libc++");
break;
case ToolChain::CST_Libstdcxx:
- // Currently handled by the mass of goop in InitHeaderSearch.
+ if (ObjCXXAutoRefCount)
+ CmdArgs.push_back("-fobjc-arc-cxxlib=libstdc++");
break;
}
}
diff --git a/contrib/llvm/tools/clang/lib/Driver/ToolChains.cpp b/contrib/llvm/tools/clang/lib/Driver/ToolChains.cpp
index 2f7bd75..29abb6d 100644
--- a/contrib/llvm/tools/clang/lib/Driver/ToolChains.cpp
+++ b/contrib/llvm/tools/clang/lib/Driver/ToolChains.cpp
@@ -19,6 +19,7 @@
#include "clang/Driver/Driver.h"
#include "clang/Driver/DriverDiagnostic.h"
#include "clang/Driver/HostInfo.h"
+#include "clang/Driver/ObjCRuntime.h"
#include "clang/Driver/OptTable.h"
#include "clang/Driver/Option.h"
#include "clang/Driver/Options.h"
@@ -26,6 +27,7 @@
#include "llvm/ADT/SmallString.h"
#include "llvm/ADT/StringExtras.h"
+#include "llvm/ADT/STLExtras.h"
#include "llvm/Support/ErrorHandling.h"
#include "llvm/Support/FileSystem.h"
#include "llvm/Support/MemoryBuffer.h"
@@ -35,6 +37,8 @@
#include <cstdlib> // ::getenv
+#include "llvm/Config/config.h" // for CXX_INCLUDE_ROOT
+
#ifndef CLANG_PREFIX
#define CLANG_PREFIX
#endif
@@ -45,7 +49,8 @@ using namespace clang::driver::toolchains;
/// Darwin - Darwin tool chain for i386 and x86_64.
Darwin::Darwin(const HostInfo &Host, const llvm::Triple& Triple)
- : ToolChain(Host, Triple), TargetInitialized(false)
+ : ToolChain(Host, Triple), TargetInitialized(false),
+ ARCRuntimeForSimulator(ARCSimulator_None)
{
// Compute the initial Darwin version based on the host.
bool HadExtra;
@@ -74,6 +79,39 @@ bool Darwin::HasNativeLLVMSupport() const {
return true;
}
+bool Darwin::hasARCRuntime() const {
+ // FIXME: Remove this once there is a proper way to detect an ARC runtime
+ // for the simulator.
+ switch (ARCRuntimeForSimulator) {
+ case ARCSimulator_None:
+ break;
+ case ARCSimulator_HasARCRuntime:
+ return true;
+ case ARCSimulator_NoARCRuntime:
+ return false;
+ }
+
+ if (isTargetIPhoneOS())
+ return !isIPhoneOSVersionLT(5);
+ else
+ return !isMacosxVersionLT(10, 7);
+}
+
+/// Darwin provides an ARC runtime starting in MacOS X 10.7 and iOS 5.0.
+void Darwin::configureObjCRuntime(ObjCRuntime &runtime) const {
+ if (runtime.getKind() != ObjCRuntime::NeXT)
+ return ToolChain::configureObjCRuntime(runtime);
+
+ runtime.HasARC = runtime.HasWeak = hasARCRuntime();
+
+ // So far, objc_terminate is only available in iOS 5.
+ // FIXME: do the simulator logic properly.
+ if (!ARCRuntimeForSimulator && isTargetIPhoneOS())
+ runtime.HasTerminate = !isIPhoneOSVersionLT(5);
+ else
+ runtime.HasTerminate = false;
+}
+
// FIXME: Can we tablegen this?
static const char *GetArmArchForMArch(llvm::StringRef Value) {
if (Value == "armv6k")
@@ -324,6 +362,45 @@ void DarwinClang::AddLinkSearchPathArgs(const ArgList &Args,
CmdArgs.push_back(Args.MakeArgString("-L" + P.str()));
}
+void DarwinClang::AddLinkARCArgs(const ArgList &Args,
+ ArgStringList &CmdArgs) const {
+
+ CmdArgs.push_back("-force_load");
+ llvm::sys::Path P(getDriver().ClangExecutable);
+ P.eraseComponent(); // 'clang'
+ P.eraseComponent(); // 'bin'
+ P.appendComponent("lib");
+ P.appendComponent("arc");
+ P.appendComponent("libarclite_");
+ std::string s = P.str();
+ // Mash in the platform.
+ if (isTargetIPhoneOS())
+ s += "iphoneos";
+ // FIXME: isTargetIphoneOSSimulator() is not returning true.
+ else if (ARCRuntimeForSimulator != ARCSimulator_None)
+ s += "iphonesimulator";
+ else
+ s += "macosx";
+ s += ".a";
+
+ CmdArgs.push_back(Args.MakeArgString(s));
+}
+
+void DarwinClang::AddLinkRuntimeLib(const ArgList &Args,
+ ArgStringList &CmdArgs,
+ const char *DarwinStaticLib) const {
+ llvm::sys::Path P(getDriver().ResourceDir);
+ P.appendComponent("lib");
+ P.appendComponent("darwin");
+ P.appendComponent(DarwinStaticLib);
+
+ // For now, allow missing resource libraries to support developers who may
+ // not have compiler-rt checked out or integrated into their build.
+ bool Exists;
+ if (!llvm::sys::fs::exists(P.str(), Exists) && Exists)
+ CmdArgs.push_back(Args.MakeArgString(P.str()));
+}
+
void DarwinClang::AddLinkRuntimeLibArgs(const ArgList &Args,
ArgStringList &CmdArgs) const {
// Darwin doesn't support real static executables, don't link any runtime
@@ -345,7 +422,6 @@ void DarwinClang::AddLinkRuntimeLibArgs(const ArgList &Args,
CmdArgs.push_back("-lSystem");
// Select the dynamic runtime library and the target specific static library.
- const char *DarwinStaticLib = 0;
if (isTargetIPhoneOS()) {
// If we are compiling as iOS / simulator, don't attempt to link libgcc_s.1,
// it never went into the SDK.
@@ -353,7 +429,7 @@ void DarwinClang::AddLinkRuntimeLibArgs(const ArgList &Args,
CmdArgs.push_back("-lgcc_s.1");
// We currently always need a static runtime library for iOS.
- DarwinStaticLib = "libclang_rt.ios.a";
+ AddLinkRuntimeLib(Args, CmdArgs, "libclang_rt.ios.a");
} else {
// The dynamic runtime library was merged with libSystem for 10.6 and
// beyond; only 10.4 and 10.5 need an additional runtime library.
@@ -371,26 +447,42 @@ void DarwinClang::AddLinkRuntimeLibArgs(const ArgList &Args,
// libSystem. Therefore, we still must provide a runtime library just for
// the tiny tiny handful of projects that *might* use that symbol.
if (isMacosxVersionLT(10, 5)) {
- DarwinStaticLib = "libclang_rt.10.4.a";
+ AddLinkRuntimeLib(Args, CmdArgs, "libclang_rt.10.4.a");
} else {
if (getTriple().getArch() == llvm::Triple::x86)
- DarwinStaticLib = "libclang_rt.eprintf.a";
+ AddLinkRuntimeLib(Args, CmdArgs, "libclang_rt.eprintf.a");
+ AddLinkRuntimeLib(Args, CmdArgs, "libclang_rt.osx.a");
}
}
+}
- /// Add the target specific static library, if needed.
- if (DarwinStaticLib) {
- llvm::sys::Path P(getDriver().ResourceDir);
- P.appendComponent("lib");
- P.appendComponent("darwin");
- P.appendComponent(DarwinStaticLib);
-
- // For now, allow missing resource libraries to support developers who may
- // not have compiler-rt checked out or integrated into their build.
- bool Exists;
- if (!llvm::sys::fs::exists(P.str(), Exists) && Exists)
- CmdArgs.push_back(Args.MakeArgString(P.str()));
- }
+static inline llvm::StringRef SimulatorVersionDefineName() {
+ return "__IPHONE_OS_VERSION_MIN_REQUIRED";
+}
+
+/// \brief Parse the simulator version define:
+/// __IPHONE_OS_VERSION_MIN_REQUIRED=([0-9])([0-9][0-9])([0-9][0-9])
+// and return the grouped values as integers, e.g:
+// __IPHONE_OS_VERSION_MIN_REQUIRED=40201
+// will return Major=4, Minor=2, Micro=1.
+static bool GetVersionFromSimulatorDefine(llvm::StringRef define,
+ unsigned &Major, unsigned &Minor,
+ unsigned &Micro) {
+ assert(define.startswith(SimulatorVersionDefineName()));
+ llvm::StringRef name, version;
+ llvm::tie(name, version) = define.split('=');
+ if (version.empty())
+ return false;
+ std::string verstr = version.str();
+ char *end;
+ unsigned num = (unsigned) strtol(verstr.c_str(), &end, 10);
+ if (*end != '\0')
+ return false;
+ Major = num / 10000;
+ num = num % 10000;
+ Minor = num / 100;
+ Micro = num % 100;
+ return true;
}
void Darwin::AddDeploymentTarget(DerivedArgList &Args) const {
@@ -400,6 +492,27 @@ void Darwin::AddDeploymentTarget(DerivedArgList &Args) const {
Arg *iOSVersion = Args.getLastArg(options::OPT_miphoneos_version_min_EQ);
Arg *iOSSimVersion = Args.getLastArg(
options::OPT_mios_simulator_version_min_EQ);
+
+ // FIXME: HACK! When compiling for the simulator we don't get a
+ // '-miphoneos-version-min' to help us know whether there is an ARC runtime
+ // or not; try to parse a __IPHONE_OS_VERSION_MIN_REQUIRED
+ // define passed in command-line.
+ if (!iOSVersion) {
+ for (arg_iterator it = Args.filtered_begin(options::OPT_D),
+ ie = Args.filtered_end(); it != ie; ++it) {
+ llvm::StringRef define = (*it)->getValue(Args);
+ if (define.startswith(SimulatorVersionDefineName())) {
+ unsigned Major, Minor, Micro;
+ if (GetVersionFromSimulatorDefine(define, Major, Minor, Micro) &&
+ Major < 10 && Minor < 100 && Micro < 100) {
+ ARCRuntimeForSimulator = Major < 5 ? ARCSimulator_NoARCRuntime
+ : ARCSimulator_HasARCRuntime;
+ }
+ break;
+ }
+ }
+ }
+
if (OSXVersion && (iOSVersion || iOSSimVersion)) {
getDriver().Diag(clang::diag::err_drv_argument_not_allowed_with)
<< OSXVersion->getAsString(Args)
@@ -591,8 +704,13 @@ DerivedArgList *Darwin::TranslateArgs(const DerivedArgList &Args,
Arg *A = *it;
if (A->getOption().matches(options::OPT_Xarch__)) {
+ // Skip this argument unless the architecture matches either the toolchain
+ // triple arch, or the arch being bound.
+ //
// FIXME: Canonicalize name.
- if (getArchName() != A->getValue(Args, 0))
+ llvm::StringRef XarchArch = A->getValue(Args, 0);
+ if (!(XarchArch == getArchName() ||
+ (BoundArch && XarchArch == BoundArch)))
continue;
Arg *OriginalArg = A;
@@ -1363,7 +1481,7 @@ static std::string findGCCBaseLibDir(const std::string &GccTriple) {
ret.append(Version);
return ret;
}
- static const char* GccVersions[] = {"4.6.0", "4.6",
+ static const char* GccVersions[] = {"4.6.1", "4.6.0", "4.6",
"4.5.2", "4.5.1", "4.5",
"4.4.5", "4.4.4", "4.4.3", "4.4",
"4.3.4", "4.3.3", "4.3.2", "4.3",
@@ -1425,6 +1543,9 @@ Linux::Linux(const HostInfo &Host, const llvm::Triple &Triple)
else if (!llvm::sys::fs::exists("/usr/lib/gcc/x86_64-pc-linux-gnu",
Exists) && Exists)
GccTriple = "x86_64-pc-linux-gnu";
+ else if (!llvm::sys::fs::exists("/usr/lib/gcc/x86_64-redhat-linux6E",
+ Exists) && Exists)
+ GccTriple = "x86_64-redhat-linux6E";
else if (!llvm::sys::fs::exists("/usr/lib/gcc/x86_64-redhat-linux",
Exists) && Exists)
GccTriple = "x86_64-redhat-linux";
diff --git a/contrib/llvm/tools/clang/lib/Driver/ToolChains.h b/contrib/llvm/tools/clang/lib/Driver/ToolChains.h
index ace9b84..d68016b 100644
--- a/contrib/llvm/tools/clang/lib/Driver/ToolChains.h
+++ b/contrib/llvm/tools/clang/lib/Driver/ToolChains.h
@@ -57,6 +57,16 @@ private:
// the argument translation business.
mutable bool TargetInitialized;
+ // FIXME: Remove this once there is a proper way to detect an ARC runtime
+ // for the simulator.
+ public:
+ mutable enum {
+ ARCSimulator_None,
+ ARCSimulator_HasARCRuntime,
+ ARCSimulator_NoARCRuntime
+ } ARCRuntimeForSimulator;
+
+private:
/// Whether we are targeting iPhoneOS target.
mutable bool TargetIsIPhoneOS;
@@ -70,6 +80,8 @@ private:
/// initialized.
std::string MacosxVersionMin;
+ bool hasARCRuntime() const;
+
private:
void AddDeploymentTarget(DerivedArgList &Args) const;
@@ -157,11 +169,15 @@ public:
virtual void AddLinkSearchPathArgs(const ArgList &Args,
ArgStringList &CmdArgs) const = 0;
+ /// AddLinkARCArgs - Add the linker arguments to link the ARC runtime library.
+ virtual void AddLinkARCArgs(const ArgList &Args,
+ ArgStringList &CmdArgs) const = 0;
+
/// AddLinkRuntimeLibArgs - Add the linker arguments to link the compiler
/// runtime library.
virtual void AddLinkRuntimeLibArgs(const ArgList &Args,
ArgStringList &CmdArgs) const = 0;
-
+
/// }
/// @name ToolChain Implementation
/// {
@@ -170,6 +186,8 @@ public:
virtual bool HasNativeLLVMSupport() const;
+ virtual void configureObjCRuntime(ObjCRuntime &runtime) const;
+
virtual DerivedArgList *TranslateArgs(const DerivedArgList &Args,
const char *BoundArch) const;
@@ -250,13 +268,17 @@ public:
virtual void AddLinkRuntimeLibArgs(const ArgList &Args,
ArgStringList &CmdArgs) const;
-
+ void AddLinkRuntimeLib(const ArgList &Args, ArgStringList &CmdArgs,
+ const char *DarwinStaticLib) const;
+
virtual void AddCXXStdlibLibArgs(const ArgList &Args,
ArgStringList &CmdArgs) const;
virtual void AddCCKextLibArgs(const ArgList &Args,
ArgStringList &CmdArgs) const;
+ virtual void AddLinkARCArgs(const ArgList &Args,
+ ArgStringList &CmdArgs) const;
/// }
};
diff --git a/contrib/llvm/tools/clang/lib/Driver/Tools.cpp b/contrib/llvm/tools/clang/lib/Driver/Tools.cpp
index b7f0f83..64ad146 100644
--- a/contrib/llvm/tools/clang/lib/Driver/Tools.cpp
+++ b/contrib/llvm/tools/clang/lib/Driver/Tools.cpp
@@ -17,6 +17,7 @@
#include "clang/Driver/Compilation.h"
#include "clang/Driver/Job.h"
#include "clang/Driver/HostInfo.h"
+#include "clang/Driver/ObjCRuntime.h"
#include "clang/Driver/Option.h"
#include "clang/Driver/Options.h"
#include "clang/Driver/ToolChain.h"
@@ -30,6 +31,7 @@
#include "llvm/Support/raw_ostream.h"
#include "llvm/Support/Host.h"
#include "llvm/Support/Process.h"
+#include "llvm/Support/ErrorHandling.h"
#include "InputInfo.h"
#include "ToolChains.h"
@@ -147,20 +149,37 @@ static void AddLinkerInputs(const ToolChain &TC,
}
}
+/// \brief Determine whether Objective-C automated reference counting is
+/// enabled.
+static bool isObjCAutoRefCount(const ArgList &Args) {
+ return Args.hasFlag(options::OPT_fobjc_arc, options::OPT_fno_objc_arc, false);
+}
+
static void addProfileRT(const ToolChain &TC, const ArgList &Args,
- ArgStringList &CmdArgs) {
- if (Args.hasArg(options::OPT_fprofile_arcs) ||
- Args.hasArg(options::OPT_fprofile_generate) ||
- Args.hasArg(options::OPT_fcreate_profile) ||
- Args.hasArg(options::OPT_coverage)) {
- // GCC links libgcov.a by adding -L<inst>/gcc/lib/gcc/<triple>/<ver> -lgcov
- // to the link line. We cannot do the same thing because unlike gcov
- // there is a libprofile_rt.so. We used to use the -l:libprofile_rt.a
- // syntax, but that is not supported by old linkers.
- const char *lib = Args.MakeArgString(TC.getDriver().Dir + "/../lib/" +
- "libprofile_rt.a");
- CmdArgs.push_back(lib);
+ ArgStringList &CmdArgs,
+ llvm::Triple Triple) {
+ if (!(Args.hasArg(options::OPT_fprofile_arcs) ||
+ Args.hasArg(options::OPT_fprofile_generate) ||
+ Args.hasArg(options::OPT_fcreate_profile) ||
+ Args.hasArg(options::OPT_coverage)))
+ return;
+
+ // GCC links libgcov.a by adding -L<inst>/gcc/lib/gcc/<triple>/<ver> -lgcov to
+ // the link line. We cannot do the same thing because unlike gcov there is a
+ // libprofile_rt.so. We used to use the -l:libprofile_rt.a syntax, but that is
+ // not supported by old linkers.
+ llvm::Twine ProfileRT =
+ llvm::Twine(TC.getDriver().Dir) + "/../lib/" + "libprofile_rt.a";
+
+ if (Triple.getOS() == llvm::Triple::Darwin) {
+ // On Darwin, if the static library doesn't exist try the dylib.
+ bool Exists;
+ if (llvm::sys::fs::exists(ProfileRT.str(), Exists) || !Exists)
+ ProfileRT =
+ llvm::Twine(TC.getDriver().Dir) + "/../lib/" + "libprofile_rt.dylib";
}
+
+ CmdArgs.push_back(Args.MakeArgString(ProfileRT));
}
void Clang::AddPreprocessingOptions(const Driver &D,
@@ -223,6 +242,13 @@ void Clang::AddPreprocessingOptions(const Driver &D,
CmdArgs.push_back("-sys-header-deps");
}
+ if (Args.hasArg(options::OPT_MG)) {
+ if (!A || A->getOption().matches(options::OPT_MD) ||
+ A->getOption().matches(options::OPT_MMD))
+ D.Diag(clang::diag::err_drv_mg_requires_m_or_mm);
+ CmdArgs.push_back("-MG");
+ }
+
Args.AddLastArg(CmdArgs, options::OPT_MP);
// Convert all -MQ <target> args to -MT <quoted target>
@@ -318,8 +344,13 @@ void Clang::AddPreprocessingOptions(const Driver &D,
// Add C++ include arguments, if needed.
types::ID InputType = Inputs[0].getType();
- if (types::isCXX(InputType))
- getToolChain().AddClangCXXStdlibIncludeArgs(Args, CmdArgs);
+ if (types::isCXX(InputType)) {
+ bool ObjCXXAutoRefCount
+ = types::isObjC(InputType) && isObjCAutoRefCount(Args);
+ getToolChain().AddClangCXXStdlibIncludeArgs(Args, CmdArgs,
+ ObjCXXAutoRefCount);
+ Args.AddAllArgs(CmdArgs, options::OPT_stdlib_EQ);
+ }
// Add -Wp, and -Xassembler if using the preprocessor.
@@ -737,7 +768,6 @@ void Clang::AddSparcTargetArgs(const ArgList &Args,
//
// FIXME: This changes CPP defines, we need -target-soft-float.
CmdArgs.push_back("-msoft-float");
- CmdArgs.push_back("soft");
CmdArgs.push_back("-target-feature");
CmdArgs.push_back("+soft-float");
} else {
@@ -816,6 +846,14 @@ void Clang::AddX86TargetArgs(const ArgList &Args,
CmdArgs.push_back(CPUName);
}
+ // The required algorithm here is slightly strange: the options are applied
+ // in order (so -mno-sse -msse2 disables SSE3), but any option that gets
+ // directly overridden later is ignored (so "-mno-sse -msse2 -mno-sse2 -msse"
+ // is equivalent to "-mno-sse2 -msse"). The -cc1 handling deals with the
+ // former correctly, but not the latter; handle directly-overridden
+ // attributes here.
+ llvm::StringMap<unsigned> PrevFeature;
+ std::vector<const char*> Features;
for (arg_iterator it = Args.filtered_begin(options::OPT_m_x86_Features_Group),
ie = Args.filtered_end(); it != ie; ++it) {
llvm::StringRef Name = (*it)->getOption().getName();
@@ -829,25 +867,34 @@ void Clang::AddX86TargetArgs(const ArgList &Args,
if (IsNegative)
Name = Name.substr(3);
- CmdArgs.push_back("-target-feature");
- CmdArgs.push_back(Args.MakeArgString((IsNegative ? "-" : "+") + Name));
+ unsigned& Prev = PrevFeature[Name];
+ if (Prev)
+ Features[Prev - 1] = 0;
+ Prev = Features.size() + 1;
+ Features.push_back(Args.MakeArgString((IsNegative ? "-" : "+") + Name));
+ }
+ for (unsigned i = 0; i < Features.size(); i++) {
+ if (Features[i]) {
+ CmdArgs.push_back("-target-feature");
+ CmdArgs.push_back(Features[i]);
+ }
}
}
static bool
-shouldUseExceptionTablesForObjCExceptions(const ArgList &Args,
+shouldUseExceptionTablesForObjCExceptions(unsigned objcABIVersion,
const llvm::Triple &Triple) {
// We use the zero-cost exception tables for Objective-C if the non-fragile
// ABI is enabled or when compiling for x86_64 and ARM on Snow Leopard and
// later.
- if (Args.hasArg(options::OPT_fobjc_nonfragile_abi))
+ if (objcABIVersion >= 2)
return true;
if (Triple.getOS() != llvm::Triple::Darwin)
return false;
- return (Triple.getDarwinMajorNumber() >= 9 &&
+ return (!Triple.isMacOSXVersionLT(10,5) &&
(Triple.getArch() == llvm::Triple::x86_64 ||
Triple.getArch() == llvm::Triple::arm));
}
@@ -860,6 +907,7 @@ shouldUseExceptionTablesForObjCExceptions(const ArgList &Args,
static void addExceptionArgs(const ArgList &Args, types::ID InputType,
const llvm::Triple &Triple,
bool KernelOrKext, bool IsRewriter,
+ unsigned objcABIVersion,
ArgStringList &CmdArgs) {
if (KernelOrKext)
return;
@@ -896,7 +944,7 @@ static void addExceptionArgs(const ArgList &Args, types::ID InputType,
CmdArgs.push_back("-fobjc-exceptions");
ShouldUseExceptionTables |=
- shouldUseExceptionTablesForObjCExceptions(Args, Triple);
+ shouldUseExceptionTablesForObjCExceptions(objcABIVersion, Triple);
}
if (types::isCXX(InputType)) {
@@ -1040,6 +1088,8 @@ void Clang::ConstructJob(Compilation &C, const JobAction &JA,
} else if (Value == "--fatal-warnings") {
CmdArgs.push_back("-mllvm");
CmdArgs.push_back("-fatal-assembler-warnings");
+ } else if (Value == "--noexecstack") {
+ CmdArgs.push_back("-mnoexecstack");
} else {
D.Diag(clang::diag::err_drv_unsupported_option_argument)
<< A->getOption().getName() << Value;
@@ -1311,8 +1361,7 @@ void Clang::ConstructJob(Compilation &C, const JobAction &JA,
types::ID InputType = Inputs[0].getType();
if (!Args.hasArg(options::OPT_fallow_unsupported)) {
Arg *Unsupported;
- if ((Unsupported = Args.getLastArg(options::OPT_MG)) ||
- (Unsupported = Args.getLastArg(options::OPT_iframework)))
+ if ((Unsupported = Args.getLastArg(options::OPT_iframework)))
D.Diag(clang::diag::err_drv_clang_unsupported)
<< Unsupported->getOption().getName();
@@ -1378,6 +1427,28 @@ void Clang::ConstructJob(Compilation &C, const JobAction &JA,
Args.AddLastArg(CmdArgs, options::OPT_working_directory);
+ if (!Args.hasArg(options::OPT_fno_objc_arc)) {
+ if (const Arg *A = Args.getLastArg(options::OPT_ccc_arcmt_check,
+ options::OPT_ccc_arcmt_modify,
+ options::OPT_ccc_arcmt_migrate)) {
+ switch (A->getOption().getID()) {
+ default:
+ llvm_unreachable("missed a case");
+ case options::OPT_ccc_arcmt_check:
+ CmdArgs.push_back("-arcmt-check");
+ break;
+ case options::OPT_ccc_arcmt_modify:
+ CmdArgs.push_back("-arcmt-modify");
+ break;
+ case options::OPT_ccc_arcmt_migrate:
+ CmdArgs.push_back("-arcmt-migrate");
+ CmdArgs.push_back("-arcmt-migrate-directory");
+ CmdArgs.push_back(A->getValue(Args));
+ break;
+ }
+ }
+ }
+
// Add preprocessing options like -I, -D, etc. if we are using the
// preprocessor.
//
@@ -1543,27 +1614,6 @@ void Clang::ConstructJob(Compilation &C, const JobAction &JA,
options::OPT_fno_lax_vector_conversions))
CmdArgs.push_back("-fno-lax-vector-conversions");
- // -fobjc-infer-related-result-type is the default.
- if (Args.hasFlag(options::OPT_fobjc_infer_related_result_type,
- options::OPT_fno_objc_infer_related_result_type,
- /*Default=*/true))
- CmdArgs.push_back("-fobjc-infer-related-result-type");
-
- // Handle -fobjc-gc and -fobjc-gc-only. They are exclusive, and -fobjc-gc-only
- // takes precedence.
- const Arg *GCArg = Args.getLastArg(options::OPT_fobjc_gc_only);
- if (!GCArg)
- GCArg = Args.getLastArg(options::OPT_fobjc_gc);
- if (GCArg) {
- if (getToolChain().SupportsObjCGC()) {
- GCArg->render(Args, CmdArgs);
- } else {
- // FIXME: We should move this to a hard error.
- D.Diag(clang::diag::warn_drv_objc_gc_unsupported)
- << GCArg->getAsString(Args);
- }
- }
-
if (Args.getLastArg(options::OPT_fapple_kext))
CmdArgs.push_back("-fapple-kext");
@@ -1661,13 +1711,6 @@ void Clang::ConstructJob(Compilation &C, const JobAction &JA,
false))
CmdArgs.push_back("-fno-elide-constructors");
- // Add exception args.
- addExceptionArgs(Args, InputType, getToolChain().getTriple(),
- KernelOrKext, IsRewriter, CmdArgs);
-
- if (getToolChain().UseSjLjExceptions())
- CmdArgs.push_back("-fsjlj-exceptions");
-
// -frtti is default.
if (KernelOrKext ||
!Args.hasFlag(options::OPT_frtti, options::OPT_fno_rtti))
@@ -1735,30 +1778,41 @@ void Clang::ConstructJob(Compilation &C, const JobAction &JA,
false))
CmdArgs.push_back("-fgnu89-inline");
- // -fnext-runtime defaults to on Darwin and when rewriting Objective-C, and is
- // -the -cc1 default.
- bool NeXTRuntimeIsDefault =
- IsRewriter || getToolChain().getTriple().getOS() == llvm::Triple::Darwin;
- if (!Args.hasFlag(options::OPT_fnext_runtime, options::OPT_fgnu_runtime,
- NeXTRuntimeIsDefault))
- CmdArgs.push_back("-fgnu-runtime");
-
// -fobjc-nonfragile-abi=0 is default.
+ ObjCRuntime objCRuntime;
+ unsigned objcABIVersion = 0;
if (types::isObjC(InputType)) {
+ bool NeXTRuntimeIsDefault
+ = (IsRewriter || getToolChain().getTriple().isOSDarwin());
+ if (Args.hasFlag(options::OPT_fnext_runtime, options::OPT_fgnu_runtime,
+ NeXTRuntimeIsDefault)) {
+ objCRuntime.setKind(ObjCRuntime::NeXT);
+ } else {
+ CmdArgs.push_back("-fgnu-runtime");
+ objCRuntime.setKind(ObjCRuntime::GNU);
+ }
+ getToolChain().configureObjCRuntime(objCRuntime);
+ if (objCRuntime.HasARC)
+ CmdArgs.push_back("-fobjc-runtime-has-arc");
+ if (objCRuntime.HasWeak)
+ CmdArgs.push_back("-fobjc-runtime-has-weak");
+ if (objCRuntime.HasTerminate)
+ CmdArgs.push_back("-fobjc-runtime-has-terminate");
+
// Compute the Objective-C ABI "version" to use. Version numbers are
// slightly confusing for historical reasons:
// 1 - Traditional "fragile" ABI
// 2 - Non-fragile ABI, version 1
// 3 - Non-fragile ABI, version 2
- unsigned Version = 1;
+ objcABIVersion = 1;
// If -fobjc-abi-version= is present, use that to set the version.
if (Arg *A = Args.getLastArg(options::OPT_fobjc_abi_version_EQ)) {
if (llvm::StringRef(A->getValue(Args)) == "1")
- Version = 1;
+ objcABIVersion = 1;
else if (llvm::StringRef(A->getValue(Args)) == "2")
- Version = 2;
+ objcABIVersion = 2;
else if (llvm::StringRef(A->getValue(Args)) == "3")
- Version = 3;
+ objcABIVersion = 3;
else
D.Diag(clang::diag::err_drv_clang_unsupported) << A->getAsString(Args);
} else {
@@ -1784,13 +1838,13 @@ void Clang::ConstructJob(Compilation &C, const JobAction &JA,
<< A->getAsString(Args);
}
- Version = 1 + NonFragileABIVersion;
+ objcABIVersion = 1 + NonFragileABIVersion;
} else {
- Version = 1;
+ objcABIVersion = 1;
}
}
- if (Version == 2 || Version == 3) {
+ if (objcABIVersion == 2 || objcABIVersion == 3) {
CmdArgs.push_back("-fobjc-nonfragile-abi");
// -fobjc-dispatch-method is only relevant with the nonfragile-abi, and
@@ -1819,6 +1873,51 @@ void Clang::ConstructJob(Compilation &C, const JobAction &JA,
#endif
}
+ // Allow -fno-objc-arr to trump -fobjc-arr/-fobjc-arc.
+ // NOTE: This logic is duplicated in ToolChains.cpp.
+ bool ARC = isObjCAutoRefCount(Args);
+ if (ARC) {
+ CmdArgs.push_back("-fobjc-arc");
+
+ // Allow the user to enable full exceptions code emission.
+ // We define off for Objective-CC, on for Objective-C++.
+ if (Args.hasFlag(options::OPT_fobjc_arc_exceptions,
+ options::OPT_fno_objc_arc_exceptions,
+ /*default*/ types::isCXX(InputType)))
+ CmdArgs.push_back("-fobjc-arc-exceptions");
+ }
+
+ // -fobjc-infer-related-result-type is the default, except in the Objective-C
+ // rewriter.
+ if (IsRewriter)
+ CmdArgs.push_back("-fno-objc-infer-related-result-type");
+
+ // Handle -fobjc-gc and -fobjc-gc-only. They are exclusive, and -fobjc-gc-only
+ // takes precedence.
+ const Arg *GCArg = Args.getLastArg(options::OPT_fobjc_gc_only);
+ if (!GCArg)
+ GCArg = Args.getLastArg(options::OPT_fobjc_gc);
+ if (GCArg) {
+ if (ARC) {
+ D.Diag(clang::diag::err_drv_objc_gc_arr)
+ << GCArg->getAsString(Args);
+ } else if (getToolChain().SupportsObjCGC()) {
+ GCArg->render(Args, CmdArgs);
+ } else {
+ // FIXME: We should move this to a hard error.
+ D.Diag(clang::diag::warn_drv_objc_gc_unsupported)
+ << GCArg->getAsString(Args);
+ }
+ }
+
+ // Add exception args.
+ addExceptionArgs(Args, InputType, getToolChain().getTriple(),
+ KernelOrKext, IsRewriter, objcABIVersion, CmdArgs);
+
+ if (getToolChain().UseSjLjExceptions())
+ CmdArgs.push_back("-fsjlj-exceptions");
+
+ // C++ "sane" operator new.
if (!Args.hasFlag(options::OPT_fassume_sane_operator_new,
options::OPT_fno_assume_sane_operator_new))
CmdArgs.push_back("-fno-assume-sane-operator-new");
@@ -2859,6 +2958,17 @@ void darwin::Link::AddLinkArgs(Compilation &C,
CmdArgs.push_back("-demangle");
}
+ // If we are using LTO, then automatically create a temporary file path for
+ // the linker to use, so that it's lifetime will extend past a possible
+ // dsymutil step.
+ if (Version[0] >= 116 && D.IsUsingLTO(Args)) {
+ const char *TmpPath = C.getArgs().MakeArgString(
+ D.GetTemporaryPath(types::getTypeTempSuffix(types::TY_Object)));
+ C.addTempFile(TmpPath);
+ CmdArgs.push_back("-object_path_lto");
+ CmdArgs.push_back(TmpPath);
+ }
+
// Derived from the "link" spec.
Args.AddAllArgs(CmdArgs, options::OPT_static);
if (!Args.hasArg(options::OPT_static))
@@ -2922,6 +3032,7 @@ void darwin::Link::AddLinkArgs(Compilation &C,
Args.AddLastArg(CmdArgs, options::OPT_dynamic);
Args.AddAllArgs(CmdArgs, options::OPT_exported__symbols__list);
Args.AddLastArg(CmdArgs, options::OPT_flat__namespace);
+ Args.AddAllArgs(CmdArgs, options::OPT_force__load);
Args.AddAllArgs(CmdArgs, options::OPT_headerpad__max__install__names);
Args.AddAllArgs(CmdArgs, options::OPT_image__base);
Args.AddAllArgs(CmdArgs, options::OPT_init);
@@ -3143,6 +3254,16 @@ void darwin::Link::ConstructJob(Compilation &C, const JobAction &JA,
getDarwinToolChain().AddLinkSearchPathArgs(Args, CmdArgs);
+ // In ARC, if we don't have runtime support, link in the runtime
+ // stubs. We have to do this *before* adding any of the normal
+ // linker inputs so that its initializer gets run first.
+ if (isObjCAutoRefCount(Args)) {
+ ObjCRuntime runtime;
+ getDarwinToolChain().configureObjCRuntime(runtime);
+ if (!runtime.HasARC)
+ getDarwinToolChain().AddLinkARCArgs(Args, CmdArgs);
+ }
+
AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
if (LinkingOutput) {
@@ -3171,7 +3292,7 @@ void darwin::Link::ConstructJob(Compilation &C, const JobAction &JA,
// endfile_spec is empty.
}
- addProfileRT(getToolChain(), Args, CmdArgs);
+ addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple());
Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
Args.AddAllArgs(CmdArgs, options::OPT_F);
@@ -3330,7 +3451,7 @@ void auroraux::Link::ConstructJob(Compilation &C, const JobAction &JA,
getToolChain().GetFilePath("crtend.o")));
}
- addProfileRT(getToolChain(), Args, CmdArgs);
+ addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple());
const char *Exec =
Args.MakeArgString(getToolChain().GetProgramPath("ld"));
@@ -3638,7 +3759,7 @@ void freebsd::Link::ConstructJob(Compilation &C, const JobAction &JA,
"crtn.o")));
}
- addProfileRT(getToolChain(), Args, CmdArgs);
+ addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple());
const char *Exec =
Args.MakeArgString(getToolChain().GetProgramPath("ld"));
@@ -3793,7 +3914,7 @@ void netbsd::Link::ConstructJob(Compilation &C, const JobAction &JA,
"crtn.o")));
}
- addProfileRT(getToolChain(), Args, CmdArgs);
+ addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple());
const char *Exec = Args.MakeArgString(FindTargetProgramPath(getToolChain(),
ToolTriple.getTriple(),
@@ -4017,7 +4138,7 @@ void linuxtools::Link::ConstructJob(Compilation &C, const JobAction &JA,
}
}
- addProfileRT(getToolChain(), Args, CmdArgs);
+ addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple());
if (Args.hasArg(options::OPT_use_gold_plugin)) {
CmdArgs.push_back("-plugin");
@@ -4101,7 +4222,7 @@ void minix::Link::ConstructJob(Compilation &C, const JobAction &JA,
"/usr/gnu/lib/libend.a")));
}
- addProfileRT(getToolChain(), Args, CmdArgs);
+ addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple());
const char *Exec =
Args.MakeArgString(getToolChain().GetProgramPath("/usr/gnu/bin/gld"));
@@ -4258,7 +4379,7 @@ void dragonfly::Link::ConstructJob(Compilation &C, const JobAction &JA,
getToolChain().GetFilePath("crtn.o")));
}
- addProfileRT(getToolChain(), Args, CmdArgs);
+ addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple());
const char *Exec =
Args.MakeArgString(getToolChain().GetProgramPath("ld"));
diff --git a/contrib/llvm/tools/clang/lib/Driver/Tools.h b/contrib/llvm/tools/clang/lib/Driver/Tools.h
index 4a5a7e4..1741d05 100644
--- a/contrib/llvm/tools/clang/lib/Driver/Tools.h
+++ b/contrib/llvm/tools/clang/lib/Driver/Tools.h
@@ -360,7 +360,7 @@ namespace netbsd {
public:
Link(const ToolChain &TC, const llvm::Triple &ToolTriple)
- : Tool("netbsd::Ling", "linker", TC), ToolTriple(ToolTriple) {}
+ : Tool("netbsd::Link", "linker", TC), ToolTriple(ToolTriple) {}
virtual bool hasIntegratedCPP() const { return false; }
diff --git a/contrib/llvm/tools/clang/lib/Frontend/ASTUnit.cpp b/contrib/llvm/tools/clang/lib/Frontend/ASTUnit.cpp
index 8827116..5b0a52c 100644
--- a/contrib/llvm/tools/clang/lib/Frontend/ASTUnit.cpp
+++ b/contrib/llvm/tools/clang/lib/Frontend/ASTUnit.cpp
@@ -102,7 +102,7 @@ ASTUnit::ASTUnit(bool _MainFileIsAST)
ConcurrencyCheckValue(CheckUnlocked),
PreambleRebuildCounter(0), SavedMainFileBuffer(0), PreambleBuffer(0),
ShouldCacheCodeCompletionResults(false),
- NestedMacroInstantiations(true),
+ NestedMacroExpansions(true),
CompletionCacheTopLevelHashValue(0),
PreambleTopLevelHashValue(0),
CurrentTopLevelHashValue(0),
@@ -182,6 +182,10 @@ static unsigned getDeclShowContexts(NamedDecl *ND,
// all types are available due to functional casts.
if (LangOpts.CPlusPlus || isa<ObjCInterfaceDecl>(ND))
Contexts |= (1 << (CodeCompletionContext::CCC_ObjCMessageReceiver - 1));
+
+ // In Objective-C, you can only be a subclass of another Objective-C class
+ if (isa<ObjCInterfaceDecl>(ND))
+ Contexts |= (1 << (CodeCompletionContext::CCC_ObjCSuperclass - 1));
// Deal with tag names.
if (isa<EnumDecl>(ND)) {
@@ -208,6 +212,8 @@ static unsigned getDeclShowContexts(NamedDecl *ND,
| (1 << (CodeCompletionContext::CCC_ObjCMessageReceiver - 1));
} else if (isa<ObjCProtocolDecl>(ND)) {
Contexts = (1 << (CodeCompletionContext::CCC_ObjCProtocolName - 1));
+ } else if (isa<ObjCCategoryDecl>(ND)) {
+ Contexts = (1 << (CodeCompletionContext::CCC_ObjCCategoryName - 1));
} else if (isa<NamespaceDecl>(ND) || isa<NamespaceAliasDecl>(ND)) {
Contexts = (1 << (CodeCompletionContext::CCC_Namespace - 1));
@@ -928,8 +934,8 @@ bool ASTUnit::Parse(llvm::MemoryBuffer *OverrideMainBuffer) {
// If the main file has been overridden due to the use of a preamble,
// make that override happen and introduce the preamble.
PreprocessorOptions &PreprocessorOpts = Clang->getPreprocessorOpts();
- PreprocessorOpts.DetailedRecordIncludesNestedMacroInstantiations
- = NestedMacroInstantiations;
+ PreprocessorOpts.DetailedRecordIncludesNestedMacroExpansions
+ = NestedMacroExpansions;
std::string PriorImplicitPCHInclude;
if (OverrideMainBuffer) {
PreprocessorOpts.addRemappedFile(OriginalSourceFile, OverrideMainBuffer);
@@ -1150,16 +1156,19 @@ static llvm::MemoryBuffer *CreatePaddedMainFileBuffer(llvm::MemoryBuffer *Old,
/// buffer that should be used in place of the main file when doing so.
/// Otherwise, returns a NULL pointer.
llvm::MemoryBuffer *ASTUnit::getMainBufferWithPrecompiledPreamble(
- CompilerInvocation PreambleInvocation,
+ const CompilerInvocation &PreambleInvocationIn,
bool AllowRebuild,
unsigned MaxLines) {
- FrontendOptions &FrontendOpts = PreambleInvocation.getFrontendOpts();
+
+ llvm::IntrusiveRefCntPtr<CompilerInvocation>
+ PreambleInvocation(new CompilerInvocation(PreambleInvocationIn));
+ FrontendOptions &FrontendOpts = PreambleInvocation->getFrontendOpts();
PreprocessorOptions &PreprocessorOpts
- = PreambleInvocation.getPreprocessorOpts();
+ = PreambleInvocation->getPreprocessorOpts();
bool CreatedPreambleBuffer = false;
std::pair<llvm::MemoryBuffer *, std::pair<unsigned, bool> > NewPreamble
- = ComputePreamble(PreambleInvocation, MaxLines, CreatedPreambleBuffer);
+ = ComputePreamble(*PreambleInvocation, MaxLines, CreatedPreambleBuffer);
// If ComputePreamble() Take ownership of the
llvm::OwningPtr<llvm::MemoryBuffer> OwnedPreambleBuffer;
@@ -1260,7 +1269,7 @@ llvm::MemoryBuffer *ASTUnit::getMainBufferWithPrecompiledPreamble(
// have occurred in the preamble.
getDiagnostics().Reset();
ProcessWarningOptions(getDiagnostics(),
- PreambleInvocation.getDiagnosticOpts());
+ PreambleInvocation->getDiagnosticOpts());
getDiagnostics().setNumWarnings(NumWarningsInPreamble);
if (StoredDiagnostics.size() > NumStoredDiagnosticsInPreamble)
StoredDiagnostics.erase(
@@ -1357,7 +1366,7 @@ llvm::MemoryBuffer *ASTUnit::getMainBufferWithPrecompiledPreamble(
llvm::CrashRecoveryContextCleanupRegistrar<CompilerInstance>
CICleanup(Clang.get());
- Clang->setInvocation(&PreambleInvocation);
+ Clang->setInvocation(&*PreambleInvocation);
OriginalSourceFile = Clang->getFrontendOpts().Inputs[0].second;
// Set up diagnostics, capturing all of the diagnostics produced.
@@ -1716,7 +1725,7 @@ ASTUnit *ASTUnit::LoadFromCompilerInvocation(CompilerInvocation *CI,
bool PrecompilePreamble,
bool CompleteTranslationUnit,
bool CacheCodeCompletionResults,
- bool NestedMacroInstantiations) {
+ bool NestedMacroExpansions) {
// Create the AST unit.
llvm::OwningPtr<ASTUnit> AST;
AST.reset(new ASTUnit(false));
@@ -1727,7 +1736,7 @@ ASTUnit *ASTUnit::LoadFromCompilerInvocation(CompilerInvocation *CI,
AST->CompleteTranslationUnit = CompleteTranslationUnit;
AST->ShouldCacheCodeCompletionResults = CacheCodeCompletionResults;
AST->Invocation = CI;
- AST->NestedMacroInstantiations = NestedMacroInstantiations;
+ AST->NestedMacroExpansions = NestedMacroExpansions;
// Recover resources if we crash before exiting this method.
llvm::CrashRecoveryContextCleanupRegistrar<ASTUnit>
@@ -1753,7 +1762,7 @@ ASTUnit *ASTUnit::LoadFromCommandLine(const char **ArgBegin,
bool CacheCodeCompletionResults,
bool CXXPrecompilePreamble,
bool CXXChainedPCH,
- bool NestedMacroInstantiations) {
+ bool NestedMacroExpansions) {
if (!Diags.getPtr()) {
// No diagnostics engine was provided, so create our own diagnostics object
// with the default options.
@@ -1820,7 +1829,7 @@ ASTUnit *ASTUnit::LoadFromCommandLine(const char **ArgBegin,
AST->NumStoredDiagnosticsInPreamble = StoredDiagnostics.size();
AST->StoredDiagnostics.swap(StoredDiagnostics);
AST->Invocation = CI;
- AST->NestedMacroInstantiations = NestedMacroInstantiations;
+ AST->NestedMacroExpansions = NestedMacroExpansions;
// Recover resources if we crash before exiting this method.
llvm::CrashRecoveryContextCleanupRegistrar<ASTUnit>
@@ -1899,7 +1908,7 @@ namespace {
/// results from an ASTUnit with the code-completion results provided to it,
/// then passes the result on to
class AugmentedCodeCompleteConsumer : public CodeCompleteConsumer {
- unsigned NormalContexts;
+ unsigned long long NormalContexts;
ASTUnit &AST;
CodeCompleteConsumer &Next;
@@ -1913,22 +1922,24 @@ namespace {
// Compute the set of contexts in which we will look when we don't have
// any information about the specific context.
NormalContexts
- = (1 << (CodeCompletionContext::CCC_TopLevel - 1))
- | (1 << (CodeCompletionContext::CCC_ObjCInterface - 1))
- | (1 << (CodeCompletionContext::CCC_ObjCImplementation - 1))
- | (1 << (CodeCompletionContext::CCC_ObjCIvarList - 1))
- | (1 << (CodeCompletionContext::CCC_Statement - 1))
- | (1 << (CodeCompletionContext::CCC_Expression - 1))
- | (1 << (CodeCompletionContext::CCC_ObjCMessageReceiver - 1))
- | (1 << (CodeCompletionContext::CCC_MemberAccess - 1))
- | (1 << (CodeCompletionContext::CCC_ObjCProtocolName - 1))
- | (1 << (CodeCompletionContext::CCC_ParenthesizedExpression - 1))
- | (1 << (CodeCompletionContext::CCC_Recovery - 1));
+ = (1LL << (CodeCompletionContext::CCC_TopLevel - 1))
+ | (1LL << (CodeCompletionContext::CCC_ObjCInterface - 1))
+ | (1LL << (CodeCompletionContext::CCC_ObjCImplementation - 1))
+ | (1LL << (CodeCompletionContext::CCC_ObjCIvarList - 1))
+ | (1LL << (CodeCompletionContext::CCC_Statement - 1))
+ | (1LL << (CodeCompletionContext::CCC_Expression - 1))
+ | (1LL << (CodeCompletionContext::CCC_ObjCMessageReceiver - 1))
+ | (1LL << (CodeCompletionContext::CCC_DotMemberAccess - 1))
+ | (1LL << (CodeCompletionContext::CCC_ArrowMemberAccess - 1))
+ | (1LL << (CodeCompletionContext::CCC_ObjCPropertyAccess - 1))
+ | (1LL << (CodeCompletionContext::CCC_ObjCProtocolName - 1))
+ | (1LL << (CodeCompletionContext::CCC_ParenthesizedExpression - 1))
+ | (1LL << (CodeCompletionContext::CCC_Recovery - 1));
if (AST.getASTContext().getLangOptions().CPlusPlus)
- NormalContexts |= (1 << (CodeCompletionContext::CCC_EnumTag - 1))
- | (1 << (CodeCompletionContext::CCC_UnionTag - 1))
- | (1 << (CodeCompletionContext::CCC_ClassOrStructTag - 1));
+ NormalContexts |= (1LL << (CodeCompletionContext::CCC_EnumTag - 1))
+ | (1LL << (CodeCompletionContext::CCC_UnionTag - 1))
+ | (1LL << (CodeCompletionContext::CCC_ClassOrStructTag - 1));
}
virtual void ProcessCodeCompleteResults(Sema &S,
@@ -1966,12 +1977,15 @@ static void CalculateHiddenNames(const CodeCompletionContext &Context,
case CodeCompletionContext::CCC_Statement:
case CodeCompletionContext::CCC_Expression:
case CodeCompletionContext::CCC_ObjCMessageReceiver:
- case CodeCompletionContext::CCC_MemberAccess:
+ case CodeCompletionContext::CCC_DotMemberAccess:
+ case CodeCompletionContext::CCC_ArrowMemberAccess:
+ case CodeCompletionContext::CCC_ObjCPropertyAccess:
case CodeCompletionContext::CCC_Namespace:
case CodeCompletionContext::CCC_Type:
case CodeCompletionContext::CCC_Name:
case CodeCompletionContext::CCC_PotentiallyQualifiedName:
case CodeCompletionContext::CCC_ParenthesizedExpression:
+ case CodeCompletionContext::CCC_ObjCSuperclass:
break;
case CodeCompletionContext::CCC_EnumTag:
@@ -1990,6 +2004,9 @@ static void CalculateHiddenNames(const CodeCompletionContext &Context,
case CodeCompletionContext::CCC_TypeQualifiers:
case CodeCompletionContext::CCC_Other:
case CodeCompletionContext::CCC_OtherWithMacros:
+ case CodeCompletionContext::CCC_ObjCInstanceMessage:
+ case CodeCompletionContext::CCC_ObjCClassMessage:
+ case CodeCompletionContext::CCC_ObjCCategoryName:
// We're looking for nothing, or we're looking for names that cannot
// be hidden.
return;
@@ -2284,9 +2301,9 @@ void ASTUnit::CodeComplete(llvm::StringRef File, unsigned Line, unsigned Column,
}
}
-bool ASTUnit::Save(llvm::StringRef File) {
- if (getDiagnostics().hasErrorOccurred())
- return true;
+CXSaveError ASTUnit::Save(llvm::StringRef File) {
+ if (getDiagnostics().hasUnrecoverableErrorOccurred())
+ return CXSaveError_TranslationErrors;
// FIXME: Can we somehow regenerate the stat cache here, or do we need to
// unconditionally create a stat cache when we parse the file?
@@ -2294,11 +2311,11 @@ bool ASTUnit::Save(llvm::StringRef File) {
llvm::raw_fd_ostream Out(File.str().c_str(), ErrorInfo,
llvm::raw_fd_ostream::F_Binary);
if (!ErrorInfo.empty() || Out.has_error())
- return true;
+ return CXSaveError_Unknown;
serialize(Out);
Out.close();
- return Out.has_error();
+ return Out.has_error()? CXSaveError_Unknown : CXSaveError_None;
}
bool ASTUnit::serialize(llvm::raw_ostream &OS) {
diff --git a/contrib/llvm/tools/clang/lib/Frontend/BoostConAction.cpp b/contrib/llvm/tools/clang/lib/Frontend/BoostConAction.cpp
deleted file mode 100644
index 4a12ff2..0000000
--- a/contrib/llvm/tools/clang/lib/Frontend/BoostConAction.cpp
+++ /dev/null
@@ -1,39 +0,0 @@
-//===-- BoostConAction.cpp - BoostCon Workshop Action -----------*- C++ -*-===//
-//
-// The LLVM Compiler Infrastructure
-//
-// This file is distributed under the University of Illinois Open Source
-// License. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-#include "clang/Frontend/FrontendActions.h"
-#include "clang/AST/ASTConsumer.h"
-#include "clang/AST/RecursiveASTVisitor.h"
-#include <cstdio>
-#include <iostream>
-using namespace clang;
-
-namespace {
- class BoostConASTConsumer : public ASTConsumer,
- public RecursiveASTVisitor<BoostConASTConsumer> {
- public:
- /// HandleTranslationUnit - This method is called when the ASTs for entire
- /// translation unit have been parsed.
- virtual void HandleTranslationUnit(ASTContext &Ctx);
-
- bool VisitCXXRecordDecl(CXXRecordDecl *D) {
- std::cout << D->getNameAsString() << std::endl;
- return true;
- }
- };
-}
-
-ASTConsumer *BoostConAction::CreateASTConsumer(CompilerInstance &CI,
- llvm::StringRef InFile) {
- return new BoostConASTConsumer();
-}
-
-void BoostConASTConsumer::HandleTranslationUnit(ASTContext &Ctx) {
- fprintf(stderr, "Welcome to BoostCon!\n");
- TraverseDecl(Ctx.getTranslationUnitDecl());
-}
diff --git a/contrib/llvm/tools/clang/lib/Frontend/CacheTokens.cpp b/contrib/llvm/tools/clang/lib/Frontend/CacheTokens.cpp
index 06a1fd2..20b5189 100644
--- a/contrib/llvm/tools/clang/lib/Frontend/CacheTokens.cpp
+++ b/contrib/llvm/tools/clang/lib/Frontend/CacheTokens.cpp
@@ -247,17 +247,16 @@ void PTHWriter::EmitToken(const Token& T) {
} else {
// We cache *un-cleaned* spellings. This gives us 100% fidelity with the
// source code.
- const char* s = T.getLiteralData();
- unsigned len = T.getLength();
+ llvm::StringRef s(T.getLiteralData(), T.getLength());
// Get the string entry.
- llvm::StringMapEntry<OffsetOpt> *E = &CachedStrs.GetOrCreateValue(s, s+len);
+ llvm::StringMapEntry<OffsetOpt> *E = &CachedStrs.GetOrCreateValue(s);
// If this is a new string entry, bump the PTH offset.
if (!E->getValue().hasOffset()) {
E->getValue().setOffset(CurStrOffset);
StrEntries.push_back(E);
- CurStrOffset += len + 1;
+ CurStrOffset += s.size() + 1;
}
// Emit the relative offset into the PTH file for the spelling string.
diff --git a/contrib/llvm/tools/clang/lib/Frontend/CompilerInstance.cpp b/contrib/llvm/tools/clang/lib/Frontend/CompilerInstance.cpp
index 38fcfe3..c58e3af 100644
--- a/contrib/llvm/tools/clang/lib/Frontend/CompilerInstance.cpp
+++ b/contrib/llvm/tools/clang/lib/Frontend/CompilerInstance.cpp
@@ -38,6 +38,7 @@
#include "llvm/Support/Program.h"
#include "llvm/Support/Signals.h"
#include "llvm/Support/system_error.h"
+#include "llvm/Config/config.h"
using namespace clang;
CompilerInstance::CompilerInstance()
@@ -228,7 +229,7 @@ CompilerInstance::createPreprocessor(Diagnostic &Diags,
if (PPOpts.DetailedRecord)
PP->createPreprocessingRecord(
- PPOpts.DetailedRecordIncludesNestedMacroInstantiations);
+ PPOpts.DetailedRecordIncludesNestedMacroExpansions);
InitializePreprocessor(*PP, PPOpts, HSOpts, FEOpts);
diff --git a/contrib/llvm/tools/clang/lib/Frontend/CompilerInvocation.cpp b/contrib/llvm/tools/clang/lib/Frontend/CompilerInvocation.cpp
index a4a656f..0371dae 100644
--- a/contrib/llvm/tools/clang/lib/Frontend/CompilerInvocation.cpp
+++ b/contrib/llvm/tools/clang/lib/Frontend/CompilerInvocation.cpp
@@ -123,6 +123,10 @@ static void CodeGenOptsToArgs(const CodeGenOptions &Opts,
Res.push_back("-dwarf-debug-flags");
Res.push_back(Opts.DwarfDebugFlags);
}
+ if (Opts.ObjCRuntimeHasARC)
+ Res.push_back("-fobjc-runtime-has-arc");
+ if (Opts.ObjCRuntimeHasTerminate)
+ Res.push_back("-fobjc-runtime-has-terminate");
if (Opts.EmitGcovArcs)
Res.push_back("-femit-coverage-data");
if (Opts.EmitGcovNotes)
@@ -133,6 +137,8 @@ static void CodeGenOptsToArgs(const CodeGenOptions &Opts,
Res.push_back("-fno-common");
if (Opts.ForbidGuardVariables)
Res.push_back("-fforbid-guard-variables");
+ if (Opts.UseRegisterSizedBitfieldAccess)
+ Res.push_back("-fuse-register-sized-bitfield-access");
if (Opts.NoImplicitFloat)
Res.push_back("-no-implicit-float");
if (Opts.OmitLeafFramePointer)
@@ -169,6 +175,8 @@ static void CodeGenOptsToArgs(const CodeGenOptions &Opts,
Res.push_back("-fno-use-cxa-atexit");
if (Opts.CXXCtorDtorAliases)
Res.push_back("-mconstructor-aliases");
+ if (Opts.ObjCAutoRefCountExceptions)
+ Res.push_back("-fobjc-arc-eh");
if (!Opts.DebugPass.empty()) {
Res.push_back("-mdebug-pass");
Res.push_back(Opts.DebugPass);
@@ -199,6 +207,8 @@ static void CodeGenOptsToArgs(const CodeGenOptions &Opts,
Res.push_back("-mregparm");
Res.push_back(llvm::utostr(Opts.NumRegisterParameters));
}
+ if (Opts.NoExecStack)
+ Res.push_back("-mnoexecstack");
if (Opts.RelaxAll)
Res.push_back("-mrelax-all");
if (Opts.SaveTempLabels)
@@ -351,7 +361,6 @@ static const char *getActionName(frontend::ActionKind Kind) {
case frontend::ASTDumpXML: return "-ast-dump-xml";
case frontend::ASTPrint: return "-ast-print";
case frontend::ASTView: return "-ast-view";
- case frontend::BoostCon: return "-boostcon";
case frontend::CreateModule: return "-create-module";
case frontend::DumpRawTokens: return "-dump-raw-tokens";
case frontend::DumpTokens: return "-dump-tokens";
@@ -413,6 +422,23 @@ static void FrontendOptsToArgs(const FrontendOptions &Opts,
Res.push_back("-version");
if (Opts.FixWhatYouCan)
Res.push_back("-fix-what-you-can");
+ switch (Opts.ARCMTAction) {
+ case FrontendOptions::ARCMT_None:
+ break;
+ case FrontendOptions::ARCMT_Check:
+ Res.push_back("-arcmt-check");
+ break;
+ case FrontendOptions::ARCMT_Modify:
+ Res.push_back("-arcmt-modify");
+ break;
+ case FrontendOptions::ARCMT_Migrate:
+ Res.push_back("-arcmt-migrate");
+ break;
+ }
+ if (!Opts.ARCMTMigrateDir.empty()) {
+ Res.push_back("-arcmt-migrate-directory");
+ Res.push_back(Opts.ARCMTMigrateDir);
+ }
bool NeedLang = false;
for (unsigned i = 0, e = Opts.Inputs.size(); i != e; ++i)
@@ -537,6 +563,8 @@ static void HeaderSearchOptsToArgs(const HeaderSearchOptions &Opts,
Res.push_back("-nostdinc");
if (!Opts.UseStandardCXXIncludes)
Res.push_back("-nostdinc++");
+ if (Opts.UseLibcxx)
+ Res.push_back("-stdlib=libc++");
if (Opts.Verbose)
Res.push_back("-v");
}
@@ -672,8 +700,12 @@ static void LangOptsToArgs(const LangOptions &Opts,
Res.push_back("-fobjc-gc-only");
}
}
- if (Opts.ObjCInferRelatedResultType)
- Res.push_back("-fobjc-infer-related-result-type");
+ if (Opts.ObjCAutoRefCount)
+ Res.push_back("-fobjc-arc");
+ if (Opts.ObjCRuntimeHasWeak)
+ Res.push_back("-fobjc-runtime-has-weak");
+ if (!Opts.ObjCInferRelatedResultType)
+ Res.push_back("-fno-objc-infer-related-result-type");
if (Opts.AppleKext)
Res.push_back("-fapple-kext");
@@ -707,6 +739,8 @@ static void LangOptsToArgs(const LangOptions &Opts,
Res.push_back("-ffake-address-space-map");
if (Opts.ParseUnknownAnytype)
Res.push_back("-funknown-anytype");
+ if (Opts.DebuggerSupport)
+ Res.push_back("-fdebugger-support");
if (Opts.DelayedTemplateParsing)
Res.push_back("-fdelayed-template-parsing");
if (Opts.Deprecated)
@@ -940,6 +974,8 @@ static void ParseCodeGenArgs(CodeGenOptions &Opts, ArgList &Args, InputKind IK,
Opts.DisableLLVMOpts = Args.hasArg(OPT_disable_llvm_optzns);
Opts.DisableRedZone = Args.hasArg(OPT_disable_red_zone);
Opts.ForbidGuardVariables = Args.hasArg(OPT_fforbid_guard_variables);
+ Opts.UseRegisterSizedBitfieldAccess = Args.hasArg(
+ OPT_fuse_register_sized_bitfield_access);
Opts.RelaxedAliasing = Args.hasArg(OPT_relaxed_aliasing);
Opts.DwarfDebugFlags = Args.getLastArgValue(OPT_dwarf_debug_flags);
Opts.MergeAllConstants = !Args.hasArg(OPT_fno_merge_all_constants);
@@ -953,6 +989,9 @@ static void ParseCodeGenArgs(CodeGenOptions &Opts, ArgList &Args, InputKind IK,
(Opts.OptimizationLevel > 1 && !Opts.OptimizeSize);
Opts.AsmVerbose = Args.hasArg(OPT_masm_verbose);
+ Opts.ObjCAutoRefCountExceptions = Args.hasArg(OPT_fobjc_arc_exceptions);
+ Opts.ObjCRuntimeHasARC = Args.hasArg(OPT_fobjc_runtime_has_arc);
+ Opts.ObjCRuntimeHasTerminate = Args.hasArg(OPT_fobjc_runtime_has_terminate);
Opts.CXAAtExit = !Args.hasArg(OPT_fno_use_cxa_atexit);
Opts.CXXCtorDtorAliases = Args.hasArg(OPT_mconstructor_aliases);
Opts.CodeModel = Args.getLastArgValue(OPT_mcode_model);
@@ -967,6 +1006,7 @@ static void ParseCodeGenArgs(CodeGenOptions &Opts, ArgList &Args, InputKind IK,
Opts.NoZeroInitializedInBSS = Args.hasArg(OPT_mno_zero_initialized_in_bss);
Opts.BackendOptions = Args.getAllArgValues(OPT_backend_option);
Opts.NumRegisterParameters = Args.getLastArgIntValue(OPT_mregparm, 0, Diags);
+ Opts.NoExecStack = Args.hasArg(OPT_mno_exec_stack);
Opts.RelaxAll = Args.hasArg(OPT_mrelax_all);
Opts.OmitLeafFramePointer = Args.hasArg(OPT_momit_leaf_frame_pointer);
Opts.SaveTempLabels = Args.hasArg(OPT_msave_temp_labels);
@@ -1012,6 +1052,7 @@ static void ParseDependencyOutputArgs(DependencyOutputOptions &Opts,
Opts.UsePhonyTargets = Args.hasArg(OPT_MP);
Opts.ShowHeaderIncludes = Args.hasArg(OPT_H);
Opts.HeaderIncludeOutputFile = Args.getLastArgValue(OPT_header_include_file);
+ Opts.AddMissingHeaderDeps = Args.hasArg(OPT_MG);
}
static void ParseDiagnosticArgs(DiagnosticOptions &Opts, ArgList &Args,
@@ -1119,8 +1160,6 @@ static InputKind ParseFrontendArgs(FrontendOptions &Opts, ArgList &Args,
Opts.ProgramAction = frontend::ASTPrint; break;
case OPT_ast_view:
Opts.ProgramAction = frontend::ASTView; break;
- case OPT_boostcon:
- Opts.ProgramAction = frontend::BoostCon; break;
case OPT_dump_raw_tokens:
Opts.ProgramAction = frontend::DumpRawTokens; break;
case OPT_dump_tokens:
@@ -1222,6 +1261,26 @@ static InputKind ParseFrontendArgs(FrontendOptions &Opts, ArgList &Args,
Opts.FixWhatYouCan = Args.hasArg(OPT_fix_what_you_can);
Opts.Modules = Args.getAllArgValues(OPT_import_module);
+ Opts.ARCMTAction = FrontendOptions::ARCMT_None;
+ if (const Arg *A = Args.getLastArg(OPT_arcmt_check,
+ OPT_arcmt_modify,
+ OPT_arcmt_migrate)) {
+ switch (A->getOption().getID()) {
+ default:
+ llvm_unreachable("missed a case");
+ case OPT_arcmt_check:
+ Opts.ARCMTAction = FrontendOptions::ARCMT_Check;
+ break;
+ case OPT_arcmt_modify:
+ Opts.ARCMTAction = FrontendOptions::ARCMT_Modify;
+ break;
+ case OPT_arcmt_migrate:
+ Opts.ARCMTAction = FrontendOptions::ARCMT_Migrate;
+ break;
+ }
+ }
+ Opts.ARCMTMigrateDir = Args.getLastArgValue(OPT_arcmt_migrate_directory);
+
InputKind DashX = IK_None;
if (const Arg *A = Args.getLastArg(OPT_x)) {
DashX = llvm::StringSwitch<InputKind>(A->getValue(Args))
@@ -1293,13 +1352,15 @@ static void ParseHeaderSearchArgs(HeaderSearchOptions &Opts, ArgList &Args) {
Opts.UseBuiltinIncludes = !Args.hasArg(OPT_nobuiltininc);
Opts.UseStandardIncludes = !Args.hasArg(OPT_nostdinc);
Opts.UseStandardCXXIncludes = !Args.hasArg(OPT_nostdincxx);
+ if (const Arg *A = Args.getLastArg(OPT_stdlib_EQ))
+ Opts.UseLibcxx = (strcmp(A->getValue(Args), "libc++") == 0);
Opts.ResourceDir = Args.getLastArgValue(OPT_resource_dir);
// Add -I... and -F... options in order.
for (arg_iterator it = Args.filtered_begin(OPT_I, OPT_F),
ie = Args.filtered_end(); it != ie; ++it)
Opts.AddPath((*it)->getValue(Args), frontend::Angled, true,
- /*IsFramework=*/ (*it)->getOption().matches(OPT_F), true);
+ /*IsFramework=*/ (*it)->getOption().matches(OPT_F), false);
// Add -iprefix/-iwith-prefix/-iwithprefixbefore options.
llvm::StringRef Prefix = ""; // FIXME: This isn't the correct default prefix.
@@ -1311,24 +1372,24 @@ static void ParseHeaderSearchArgs(HeaderSearchOptions &Opts, ArgList &Args) {
Prefix = A->getValue(Args);
else if (A->getOption().matches(OPT_iwithprefix))
Opts.AddPath(Prefix.str() + A->getValue(Args),
- frontend::System, false, false, true);
+ frontend::System, false, false, false);
else
Opts.AddPath(Prefix.str() + A->getValue(Args),
- frontend::Angled, false, false, true);
+ frontend::Angled, false, false, false);
}
for (arg_iterator it = Args.filtered_begin(OPT_idirafter),
ie = Args.filtered_end(); it != ie; ++it)
- Opts.AddPath((*it)->getValue(Args), frontend::After, true, false, true);
+ Opts.AddPath((*it)->getValue(Args), frontend::After, true, false, false);
for (arg_iterator it = Args.filtered_begin(OPT_iquote),
ie = Args.filtered_end(); it != ie; ++it)
- Opts.AddPath((*it)->getValue(Args), frontend::Quoted, true, false, true);
+ Opts.AddPath((*it)->getValue(Args), frontend::Quoted, true, false, false);
for (arg_iterator it = Args.filtered_begin(OPT_cxx_isystem, OPT_isystem,
OPT_iwithsysroot), ie = Args.filtered_end(); it != ie; ++it)
Opts.AddPath((*it)->getValue(Args),
((*it)->getOption().matches(OPT_cxx_isystem) ?
frontend::CXXSystem : frontend::System),
- true, false, (*it)->getOption().matches(OPT_iwithsysroot));
+ true, false, !(*it)->getOption().matches(OPT_iwithsysroot));
// FIXME: Need options for the various environment variables!
}
@@ -1482,17 +1543,27 @@ static void ParseLangArgs(LangOptions &Opts, ArgList &Args, InputKind IK,
if (Args.hasArg(OPT_fno_operator_names))
Opts.CXXOperatorNames = 0;
+ if (Opts.ObjC1) {
+ if (Args.hasArg(OPT_fobjc_gc_only))
+ Opts.setGCMode(LangOptions::GCOnly);
+ else if (Args.hasArg(OPT_fobjc_gc))
+ Opts.setGCMode(LangOptions::HybridGC);
+ else if (Args.hasArg(OPT_fobjc_arc)) {
+ Opts.ObjCAutoRefCount = 1;
+ if (!Args.hasArg(OPT_fobjc_nonfragile_abi))
+ Diags.Report(diag::err_arc_nonfragile_abi);
+ }
+
+ if (Args.hasArg(OPT_fobjc_runtime_has_weak))
+ Opts.ObjCRuntimeHasWeak = 1;
+
+ if (Args.hasArg(OPT_fno_objc_infer_related_result_type))
+ Opts.ObjCInferRelatedResultType = 0;
+ }
+
if (Args.hasArg(OPT_fgnu89_inline))
Opts.GNUInline = 1;
- if (Args.hasArg(OPT_fobjc_gc_only))
- Opts.setGCMode(LangOptions::GCOnly);
- else if (Args.hasArg(OPT_fobjc_gc))
- Opts.setGCMode(LangOptions::HybridGC);
-
- if (Args.hasArg(OPT_fobjc_infer_related_result_type))
- Opts.ObjCInferRelatedResultType = 1;
-
if (Args.hasArg(OPT_fapple_kext)) {
if (!Opts.CPlusPlus)
Diags.Report(diag::warn_c_kext);
@@ -1601,6 +1672,7 @@ static void ParseLangArgs(LangOptions &Opts, ArgList &Args, InputKind IK,
Opts.MRTD = Args.hasArg(OPT_mrtd);
Opts.FakeAddressSpaceMap = Args.hasArg(OPT_ffake_address_space_map);
Opts.ParseUnknownAnytype = Args.hasArg(OPT_funknown_anytype);
+ Opts.DebuggerSupport = Args.hasArg(OPT_fdebugger_support);
// Record whether the __DEPRECATED define was requested.
Opts.Deprecated = Args.hasFlag(OPT_fdeprecated_macro,
@@ -1718,6 +1790,19 @@ static void ParsePreprocessorArgs(PreprocessorOptions &Opts, ArgList &Args,
Opts.addRemappedFile(Split.first, Split.second);
}
+
+ if (Arg *A = Args.getLastArg(OPT_fobjc_arc_cxxlib_EQ)) {
+ llvm::StringRef Name = A->getValue(Args);
+ unsigned Library = llvm::StringSwitch<unsigned>(Name)
+ .Case("libc++", ARCXX_libcxx)
+ .Case("libstdc++", ARCXX_libstdcxx)
+ .Case("none", ARCXX_nolib)
+ .Default(~0U);
+ if (Library == ~0U)
+ Diags.Report(diag::err_drv_invalid_value) << A->getAsString(Args) << Name;
+ else
+ Opts.ObjCXXARCStandardLibrary = (ObjCXXARCStandardLibraryKind)Library;
+ }
}
static void ParsePreprocessorOutputArgs(PreprocessorOutputOptions &Opts,
diff --git a/contrib/llvm/tools/clang/lib/Frontend/DependencyFile.cpp b/contrib/llvm/tools/clang/lib/Frontend/DependencyFile.cpp
index 5c3a231..1edd09b 100644
--- a/contrib/llvm/tools/clang/lib/Frontend/DependencyFile.cpp
+++ b/contrib/llvm/tools/clang/lib/Frontend/DependencyFile.cpp
@@ -17,9 +17,11 @@
#include "clang/Frontend/DependencyOutputOptions.h"
#include "clang/Frontend/FrontendDiagnostic.h"
#include "clang/Lex/DirectoryLookup.h"
+#include "clang/Lex/LexDiagnostic.h"
#include "clang/Lex/PPCallbacks.h"
#include "clang/Lex/Preprocessor.h"
#include "llvm/ADT/StringSet.h"
+#include "llvm/Support/Path.h"
#include "llvm/Support/raw_ostream.h"
using namespace clang;
@@ -33,9 +35,11 @@ class DependencyFileCallback : public PPCallbacks {
llvm::raw_ostream *OS;
bool IncludeSystemHeaders;
bool PhonyTarget;
+ bool AddMissingHeaderDeps;
private:
bool FileMatchesDepCriteria(const char *Filename,
SrcMgr::CharacteristicKind FileType);
+ void AddFilename(llvm::StringRef Filename);
void OutputDependencyFile();
public:
@@ -44,10 +48,19 @@ public:
const DependencyOutputOptions &Opts)
: PP(_PP), Targets(Opts.Targets), OS(_OS),
IncludeSystemHeaders(Opts.IncludeSystemHeaders),
- PhonyTarget(Opts.UsePhonyTargets) {}
+ PhonyTarget(Opts.UsePhonyTargets),
+ AddMissingHeaderDeps(Opts.AddMissingHeaderDeps) {}
virtual void FileChanged(SourceLocation Loc, FileChangeReason Reason,
SrcMgr::CharacteristicKind FileType);
+ virtual void InclusionDirective(SourceLocation HashLoc,
+ const Token &IncludeTok,
+ llvm::StringRef FileName,
+ bool IsAngled,
+ const FileEntry *File,
+ SourceLocation EndLoc,
+ llvm::StringRef SearchPath,
+ llvm::StringRef RelativePath);
virtual void EndOfMainFile() {
OutputDependencyFile();
@@ -72,6 +85,16 @@ void clang::AttachDependencyFileGen(Preprocessor &PP,
return;
}
+ // Disable the "file not found" diagnostic if the -MG option was given.
+ // FIXME: Ideally this would live in the driver, but we don't have the ability
+ // to remap individual diagnostics there without creating a DiagGroup, in
+ // which case we would need to prevent the group name from showing up in
+ // diagnostics.
+ if (Opts.AddMissingHeaderDeps) {
+ PP.getDiagnostics().setDiagnosticMapping(diag::warn_pp_file_not_found,
+ diag::MAP_IGNORE, SourceLocation());
+ }
+
PP.addPPCallbacks(new DependencyFileCallback(&PP, OS, Opts));
}
@@ -103,14 +126,34 @@ void DependencyFileCallback::FileChanged(SourceLocation Loc,
SM.getFileEntryForID(SM.getFileID(SM.getInstantiationLoc(Loc)));
if (FE == 0) return;
- const char *Filename = FE->getName();
- if (!FileMatchesDepCriteria(Filename, FileType))
+ llvm::StringRef Filename = FE->getName();
+ if (!FileMatchesDepCriteria(Filename.data(), FileType))
return;
- // Remove leading "./"
- if (Filename[0] == '.' && Filename[1] == '/')
- Filename = &Filename[2];
+ // Remove leading "./" (or ".//" or "././" etc.)
+ while (Filename.size() > 2 && Filename[0] == '.' &&
+ llvm::sys::path::is_separator(Filename[1])) {
+ Filename = Filename.substr(1);
+ while (llvm::sys::path::is_separator(Filename[0]))
+ Filename = Filename.substr(1);
+ }
+
+ AddFilename(Filename);
+}
+
+void DependencyFileCallback::InclusionDirective(SourceLocation HashLoc,
+ const Token &IncludeTok,
+ llvm::StringRef FileName,
+ bool IsAngled,
+ const FileEntry *File,
+ SourceLocation EndLoc,
+ llvm::StringRef SearchPath,
+ llvm::StringRef RelativePath) {
+ if (AddMissingHeaderDeps && !File)
+ AddFilename(FileName);
+}
+void DependencyFileCallback::AddFilename(llvm::StringRef Filename) {
if (FilesSet.insert(Filename))
Files.push_back(Filename);
}
diff --git a/contrib/llvm/tools/clang/lib/Frontend/FrontendAction.cpp b/contrib/llvm/tools/clang/lib/Frontend/FrontendAction.cpp
index 42da44c..0128d6e 100644
--- a/contrib/llvm/tools/clang/lib/Frontend/FrontendAction.cpp
+++ b/contrib/llvm/tools/clang/lib/Frontend/FrontendAction.cpp
@@ -130,6 +130,9 @@ bool FrontendAction::BeginSourceFile(CompilerInstance &CI,
setCurrentFile(Filename, InputKind);
setCompilerInstance(&CI);
+ if (!BeginInvocation(CI))
+ goto failure;
+
// AST files follow a very different path, since they share objects via the
// AST unit.
if (InputKind == IK_AST) {
@@ -381,3 +384,46 @@ PreprocessorFrontendAction::CreateASTConsumer(CompilerInstance &CI,
llvm::StringRef InFile) {
llvm_unreachable("Invalid CreateASTConsumer on preprocessor action!");
}
+
+ASTConsumer *WrapperFrontendAction::CreateASTConsumer(CompilerInstance &CI,
+ llvm::StringRef InFile) {
+ return WrappedAction->CreateASTConsumer(CI, InFile);
+}
+bool WrapperFrontendAction::BeginInvocation(CompilerInstance &CI) {
+ return WrappedAction->BeginInvocation(CI);
+}
+bool WrapperFrontendAction::BeginSourceFileAction(CompilerInstance &CI,
+ llvm::StringRef Filename) {
+ WrappedAction->setCurrentFile(getCurrentFile(), getCurrentFileKind());
+ WrappedAction->setCompilerInstance(&CI);
+ return WrappedAction->BeginSourceFileAction(CI, Filename);
+}
+void WrapperFrontendAction::ExecuteAction() {
+ WrappedAction->ExecuteAction();
+}
+void WrapperFrontendAction::EndSourceFileAction() {
+ WrappedAction->EndSourceFileAction();
+}
+
+bool WrapperFrontendAction::usesPreprocessorOnly() const {
+ return WrappedAction->usesPreprocessorOnly();
+}
+bool WrapperFrontendAction::usesCompleteTranslationUnit() {
+ return WrappedAction->usesCompleteTranslationUnit();
+}
+bool WrapperFrontendAction::hasPCHSupport() const {
+ return WrappedAction->hasPCHSupport();
+}
+bool WrapperFrontendAction::hasASTFileSupport() const {
+ return WrappedAction->hasASTFileSupport();
+}
+bool WrapperFrontendAction::hasIRSupport() const {
+ return WrappedAction->hasIRSupport();
+}
+bool WrapperFrontendAction::hasCodeCompletionSupport() const {
+ return WrappedAction->hasCodeCompletionSupport();
+}
+
+WrapperFrontendAction::WrapperFrontendAction(FrontendAction *WrappedAction)
+ : WrappedAction(WrappedAction) {}
+
diff --git a/contrib/llvm/tools/clang/lib/Frontend/InitHeaderSearch.cpp b/contrib/llvm/tools/clang/lib/Frontend/InitHeaderSearch.cpp
index 2e5ad17..ae38a19 100644
--- a/contrib/llvm/tools/clang/lib/Frontend/InitHeaderSearch.cpp
+++ b/contrib/llvm/tools/clang/lib/Frontend/InitHeaderSearch.cpp
@@ -49,7 +49,7 @@ class InitHeaderSearch {
std::vector<std::pair<IncludeDirGroup, DirectoryLookup> > IncludePath;
typedef std::vector<std::pair<IncludeDirGroup,
DirectoryLookup> >::const_iterator path_iterator;
- HeaderSearch& Headers;
+ HeaderSearch &Headers;
bool Verbose;
std::string IncludeSysroot;
bool IsNotEmptyOrRoot;
@@ -82,7 +82,8 @@ public:
/// AddMinGW64CXXPaths - Add the necessary paths to support
/// libstdc++ of x86_64-w64-mingw32 aka mingw-w64.
- void AddMinGW64CXXPaths(llvm::StringRef Base);
+ void AddMinGW64CXXPaths(llvm::StringRef Base,
+ llvm::StringRef Version);
/// AddDelimitedPaths - Add a list of paths delimited by the system PATH
/// separator. The processing follows that of the CPATH variable for gcc.
@@ -94,7 +95,8 @@ public:
// AddDefaultCPlusPlusIncludePaths - Add paths that should be searched when
// compiling c++.
- void AddDefaultCPlusPlusIncludePaths(const llvm::Triple &triple);
+ void AddDefaultCPlusPlusIncludePaths(const llvm::Triple &triple,
+ const HeaderSearchOptions &HSOpts);
/// AddDefaultSystemIncludePaths - Adds the default system include paths so
/// that e.g. stdio.h is found.
@@ -107,7 +109,7 @@ public:
void Realize(const LangOptions &Lang);
};
-}
+} // end anonymous namespace.
void InitHeaderSearch::AddPath(const llvm::Twine &Path,
IncludeDirGroup Group, bool isCXXAware,
@@ -220,12 +222,16 @@ void InitHeaderSearch::AddMinGWCPlusPlusIncludePaths(llvm::StringRef Base,
CXXSystem, true, false, false);
}
-void InitHeaderSearch::AddMinGW64CXXPaths(llvm::StringRef Base) {
- AddPath(Base,
+void InitHeaderSearch::AddMinGW64CXXPaths(llvm::StringRef Base,
+ llvm::StringRef Version) {
+ // Assumes Base is HeaderSearchOpts' ResourceDir
+ AddPath(Base + "/../../../include/c++/" + Version,
+ CXXSystem, true, false, false);
+ AddPath(Base + "/../../../include/c++/" + Version + "/x86_64-w64-mingw32",
CXXSystem, true, false, false);
- AddPath(Base + "/x86_64-w64-mingw32",
+ AddPath(Base + "/../../../include/c++/" + Version + "/i686-w64-mingw32",
CXXSystem, true, false, false);
- AddPath(Base + "/backward",
+ AddPath(Base + "/../../../include/c++/" + Version + "/backward",
CXXSystem, true, false, false);
}
@@ -249,24 +255,23 @@ static bool getSystemRegistryString(const char *keyPath, const char *valueName,
DWORD valueSize = maxLength - 1;
long lResult;
bool returnValue = false;
+
if (strncmp(keyPath, "HKEY_CLASSES_ROOT\\", 18) == 0) {
hRootKey = HKEY_CLASSES_ROOT;
subKey = keyPath + 18;
- }
- else if (strncmp(keyPath, "HKEY_USERS\\", 11) == 0) {
+ } else if (strncmp(keyPath, "HKEY_USERS\\", 11) == 0) {
hRootKey = HKEY_USERS;
subKey = keyPath + 11;
- }
- else if (strncmp(keyPath, "HKEY_LOCAL_MACHINE\\", 19) == 0) {
+ } else if (strncmp(keyPath, "HKEY_LOCAL_MACHINE\\", 19) == 0) {
hRootKey = HKEY_LOCAL_MACHINE;
subKey = keyPath + 19;
- }
- else if (strncmp(keyPath, "HKEY_CURRENT_USER\\", 18) == 0) {
+ } else if (strncmp(keyPath, "HKEY_CURRENT_USER\\", 18) == 0) {
hRootKey = HKEY_CURRENT_USER;
subKey = keyPath + 18;
}
else
- return(false);
+ return false;
+
const char *placeHolder = strstr(subKey, "$VERSION");
char bestName[256];
bestName[0] = '\0';
@@ -342,7 +347,7 @@ static bool getSystemRegistryString(const char *keyPath, const char *valueName,
RegCloseKey(hKey);
}
}
- return(returnValue);
+ return returnValue;
}
#else // _MSC_VER
// Read registry string.
@@ -355,12 +360,12 @@ static bool getSystemRegistryString(const char*, const char*, char*, size_t) {
static bool getVisualStudioDir(std::string &path) {
// First check the environment variables that vsvars32.bat sets.
const char* vcinstalldir = getenv("VCINSTALLDIR");
- if(vcinstalldir) {
+ if (vcinstalldir) {
char *p = const_cast<char *>(strstr(vcinstalldir, "\\VC"));
if (p)
*p = '\0';
path = vcinstalldir;
- return(true);
+ return true;
}
char vsIDEInstallDir[256];
@@ -378,56 +383,52 @@ static bool getVisualStudioDir(std::string &path) {
if (p)
*p = '\0';
path = vsIDEInstallDir;
- return(true);
+ return true;
}
- else if (hasVCExpressDir && vsExpressIDEInstallDir[0]) {
+
+ if (hasVCExpressDir && vsExpressIDEInstallDir[0]) {
char *p = (char*)strstr(vsExpressIDEInstallDir, "\\Common7\\IDE");
if (p)
*p = '\0';
path = vsExpressIDEInstallDir;
- return(true);
+ return true;
}
- else {
- // Try the environment.
- const char* vs100comntools = getenv("VS100COMNTOOLS");
- const char* vs90comntools = getenv("VS90COMNTOOLS");
- const char* vs80comntools = getenv("VS80COMNTOOLS");
- const char* vscomntools = NULL;
-
- // Try to find the version that we were compiled with
- if(false) {}
- #if (_MSC_VER >= 1600) // VC100
- else if(vs100comntools) {
- vscomntools = vs100comntools;
- }
- #elif (_MSC_VER == 1500) // VC80
- else if(vs90comntools) {
- vscomntools = vs90comntools;
- }
- #elif (_MSC_VER == 1400) // VC80
- else if(vs80comntools) {
- vscomntools = vs80comntools;
- }
- #endif
- // Otherwise find any version we can
- else if (vs100comntools)
- vscomntools = vs100comntools;
- else if (vs90comntools)
- vscomntools = vs90comntools;
- else if (vs80comntools)
- vscomntools = vs80comntools;
-
- if (vscomntools && *vscomntools) {
- char *p = const_cast<char *>(strstr(vscomntools, "\\Common7\\Tools"));
- if (p)
- *p = '\0';
- path = vscomntools;
- return(true);
- }
- else
- return(false);
+
+ // Try the environment.
+ const char *vs100comntools = getenv("VS100COMNTOOLS");
+ const char *vs90comntools = getenv("VS90COMNTOOLS");
+ const char *vs80comntools = getenv("VS80COMNTOOLS");
+ const char *vscomntools = NULL;
+
+ // Try to find the version that we were compiled with
+ if(false) {}
+ #if (_MSC_VER >= 1600) // VC100
+ else if(vs100comntools) {
+ vscomntools = vs100comntools;
}
- return(false);
+ #elif (_MSC_VER == 1500) // VC80
+ else if(vs90comntools) {
+ vscomntools = vs90comntools;
+ }
+ #elif (_MSC_VER == 1400) // VC80
+ else if(vs80comntools) {
+ vscomntools = vs80comntools;
+ }
+ #endif
+ // Otherwise find any version we can
+ else if (vs100comntools)
+ vscomntools = vs100comntools;
+ else if (vs90comntools)
+ vscomntools = vs90comntools;
+ else if (vs80comntools)
+ vscomntools = vs80comntools;
+
+ if (vscomntools && *vscomntools) {
+ const char *p = strstr(vscomntools, "\\Common7\\Tools");
+ path = p ? std::string(vscomntools, p) : vscomntools;
+ return true;
+ }
+ return false;
}
// Get Windows SDK installation directory.
@@ -436,7 +437,9 @@ static bool getWindowsSDKDir(std::string &path) {
// Try the Windows registry.
bool hasSDKDir = getSystemRegistryString(
"HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Microsoft SDKs\\Windows\\$VERSION",
- "InstallationFolder", windowsSDKInstallDir, sizeof(windowsSDKInstallDir) - 1);
+ "InstallationFolder",
+ windowsSDKInstallDir,
+ sizeof(windowsSDKInstallDir) - 1);
// If we have both vc80 and vc90, pick version we were compiled with.
if (hasSDKDir && windowsSDKInstallDir[0]) {
path = windowsSDKInstallDir;
@@ -552,21 +555,32 @@ void InitHeaderSearch::AddDefaultCIncludePaths(const llvm::Triple &triple,
AddPath("/boot/develop/headers/posix", System, true, false, false);
AddPath("/boot/develop/headers", System, true, false, false);
break;
+ case llvm::Triple::RTEMS:
+ break;
case llvm::Triple::Cygwin:
AddPath("/usr/include/w32api", System, true, false, false);
break;
- case llvm::Triple::MinGW32:
- // FIXME: We should be aware of i686-w64-mingw32.
- if (triple.getArch() == llvm::Triple::x86_64)
- AddPath("c:/mingw/x86_64-w64-mingw32/include",
- System, true, false, false);
- AddPath("/mingw/include", System, true, false, false);
- AddPath("c:/mingw/include", System, true, false, false);
+ case llvm::Triple::MinGW32: {
+ // mingw-w64 crt include paths
+ llvm::sys::Path P(HSOpts.ResourceDir);
+ P.appendComponent("../../../i686-w64-mingw32/include"); // <sysroot>/i686-w64-mingw32/include
+ AddPath(P.str(), System, true, false, false);
+ P = llvm::sys::Path(HSOpts.ResourceDir);
+ P.appendComponent("../../../x86_64-w64-mingw32/include"); // <sysroot>/x86_64-w64-mingw32/include
+ AddPath(P.str(), System, true, false, false);
+ // mingw.org crt include paths
+ P = llvm::sys::Path(HSOpts.ResourceDir);
+ P.appendComponent("../../../include"); // <sysroot>/include
+ AddPath(P.str(), System, true, false, false);
+ AddPath("/mingw/include", System, true, false, false);
+ AddPath("c:/mingw/include", System, true, false, false);
+ }
break;
case llvm::Triple::FreeBSD:
AddPath(CLANG_PREFIX "/usr/include/clang/" CLANG_VERSION_STRING,
System, false, false, false);
break;
+
case llvm::Triple::Linux:
// Generic Debian multiarch support:
if (triple.getArch() == llvm::Triple::x86_64) {
@@ -584,11 +598,12 @@ void InitHeaderSearch::AddDefaultCIncludePaths(const llvm::Triple &triple,
break;
}
- AddPath(CLANG_PREFIX "/usr/include", System, false, false, false);
+ if ( os != llvm::Triple::RTEMS )
+ AddPath(CLANG_PREFIX "/usr/include", System, false, false, false);
}
void InitHeaderSearch::
-AddDefaultCPlusPlusIncludePaths(const llvm::Triple &triple) {
+AddDefaultCPlusPlusIncludePaths(const llvm::Triple &triple, const HeaderSearchOptions &HSOpts) {
llvm::Triple::OSType os = triple.getOS();
llvm::StringRef CxxIncludeRoot(CXX_INCLUDE_ROOT);
if (CxxIncludeRoot != "") {
@@ -648,20 +663,19 @@ AddDefaultCPlusPlusIncludePaths(const llvm::Triple &triple) {
AddMinGWCPlusPlusIncludePaths("/usr/lib/gcc", "i686-pc-cygwin", "3.4.4");
break;
case llvm::Triple::MinGW32:
- // FIXME: We should be aware of i686-w64-mingw32.
- if (triple.getArch() == llvm::Triple::x86_64) {
- // mingw-w64-20110207
- AddMinGW64CXXPaths("c:/mingw/x86_64-w64-mingw32/include/c++/4.5.3");
- // mingw-w64-20101129
- AddMinGW64CXXPaths("c:/mingw/x86_64-w64-mingw32/include/c++/4.5.2");
- }
- // Try gcc 4.5.2 (MSYS)
- AddMinGWCPlusPlusIncludePaths("/mingw/lib/gcc", "mingw32", "4.5.2");
- // Try gcc 4.5.0
+ // mingw-w64 C++ include paths (i686-w64-mingw32 and x86_64-w64-mingw32)
+ AddMinGW64CXXPaths(HSOpts.ResourceDir, "4.5.0");
+ AddMinGW64CXXPaths(HSOpts.ResourceDir, "4.5.1");
+ AddMinGW64CXXPaths(HSOpts.ResourceDir, "4.5.2");
+ AddMinGW64CXXPaths(HSOpts.ResourceDir, "4.5.3");
+ AddMinGW64CXXPaths(HSOpts.ResourceDir, "4.6.0");
+ AddMinGW64CXXPaths(HSOpts.ResourceDir, "4.6.1");
+ AddMinGW64CXXPaths(HSOpts.ResourceDir, "4.6.2");
+ AddMinGW64CXXPaths(HSOpts.ResourceDir, "4.7.0");
+ // mingw.org C++ include paths
+ AddMinGWCPlusPlusIncludePaths("/mingw/lib/gcc", "mingw32", "4.5.2"); //MSYS
AddMinGWCPlusPlusIncludePaths("c:/MinGW/lib/gcc", "mingw32", "4.5.0");
- // Try gcc 4.4.0
AddMinGWCPlusPlusIncludePaths("c:/MinGW/lib/gcc", "mingw32", "4.4.0");
- // Try gcc 4.3.0
AddMinGWCPlusPlusIncludePaths("c:/MinGW/lib/gcc", "mingw32", "4.3.0");
break;
case llvm::Triple::DragonFly:
@@ -741,6 +755,9 @@ AddDefaultCPlusPlusIncludePaths(const llvm::Triple &triple) {
"x86_64-redhat-linux", "32", "", triple);
AddGnuCPlusPlusIncludePaths("/usr/include/c++/4.5.1",
"i686-redhat-linux", "", "", triple);
+ // RHEL5(gcc44)
+ AddGnuCPlusPlusIncludePaths("/usr/include/c++/4.4.4",
+ "x86_64-redhat-linux6E", "32", "", triple);
// Fedora 13
AddGnuCPlusPlusIncludePaths("/usr/include/c++/4.4.4",
"x86_64-redhat-linux", "32", "", triple);
@@ -822,6 +839,10 @@ AddDefaultCPlusPlusIncludePaths(const llvm::Triple &triple) {
"x86_64-unknown-linux-gnu", "", "", triple);
// Arch Linux gcc 4.6
+ AddGnuCPlusPlusIncludePaths("/usr/include/c++/4.6.1",
+ "i686-pc-linux-gnu", "", "", triple);
+ AddGnuCPlusPlusIncludePaths("/usr/include/c++/4.6.1",
+ "x86_64-unknown-linux-gnu", "", "", triple);
AddGnuCPlusPlusIncludePaths("/usr/include/c++/4.6.0",
"i686-pc-linux-gnu", "", "", triple);
AddGnuCPlusPlusIncludePaths("/usr/include/c++/4.6.0",
@@ -929,8 +950,12 @@ AddDefaultCPlusPlusIncludePaths(const llvm::Triple &triple) {
void InitHeaderSearch::AddDefaultSystemIncludePaths(const LangOptions &Lang,
const llvm::Triple &triple,
const HeaderSearchOptions &HSOpts) {
- if (Lang.CPlusPlus && HSOpts.UseStandardCXXIncludes)
- AddDefaultCPlusPlusIncludePaths(triple);
+ if (Lang.CPlusPlus && HSOpts.UseStandardCXXIncludes) {
+ if (HSOpts.UseLibcxx)
+ AddPath("/usr/include/c++/v1", CXXSystem, true, false, false);
+ else
+ AddDefaultCPlusPlusIncludePaths(triple, HSOpts);
+ }
AddDefaultCIncludePaths(triple, HSOpts);
@@ -1028,23 +1053,24 @@ void InitHeaderSearch::Realize(const LangOptions &Lang) {
std::vector<DirectoryLookup> SearchList;
SearchList.reserve(IncludePath.size());
- /* Quoted arguments go first. */
+ // Quoted arguments go first.
for (path_iterator it = IncludePath.begin(), ie = IncludePath.end();
it != ie; ++it) {
if (it->first == Quoted)
SearchList.push_back(it->second);
}
- /* Deduplicate and remember index */
+ // Deduplicate and remember index.
RemoveDuplicates(SearchList, 0, Verbose);
- unsigned quoted = SearchList.size();
+ unsigned NumQuoted = SearchList.size();
for (path_iterator it = IncludePath.begin(), ie = IncludePath.end();
it != ie; ++it) {
if (it->first == Angled)
SearchList.push_back(it->second);
}
- RemoveDuplicates(SearchList, quoted, Verbose);
- unsigned angled = SearchList.size();
+
+ RemoveDuplicates(SearchList, NumQuoted, Verbose);
+ unsigned NumAngled = SearchList.size();
for (path_iterator it = IncludePath.begin(), ie = IncludePath.end();
it != ie; ++it) {
@@ -1058,16 +1084,19 @@ void InitHeaderSearch::Realize(const LangOptions &Lang) {
SearchList.push_back(it->second);
}
- RemoveDuplicates(SearchList, angled, Verbose);
+ // Remove duplicates across both the Angled and System directories. GCC does
+ // this and failing to remove duplicates across these two groups breaks
+ // #include_next.
+ RemoveDuplicates(SearchList, NumQuoted, Verbose);
bool DontSearchCurDir = false; // TODO: set to true if -I- is set?
- Headers.SetSearchPaths(SearchList, quoted, angled, DontSearchCurDir);
+ Headers.SetSearchPaths(SearchList, NumQuoted, NumAngled, DontSearchCurDir);
// If verbose, print the list of directories that will be searched.
if (Verbose) {
llvm::errs() << "#include \"...\" search starts here:\n";
for (unsigned i = 0, e = SearchList.size(); i != e; ++i) {
- if (i == quoted)
+ if (i == NumQuoted)
llvm::errs() << "#include <...> search starts here:\n";
const char *Name = SearchList[i].getName();
const char *Suffix;
@@ -1095,7 +1124,7 @@ void clang::ApplyHeaderSearchOptions(HeaderSearch &HS,
for (unsigned i = 0, e = HSOpts.UserEntries.size(); i != e; ++i) {
const HeaderSearchOptions::Entry &E = HSOpts.UserEntries[i];
Init.AddPath(E.Path, E.Group, false, E.IsUserSupplied, E.IsFramework,
- !E.IsSysRootRelative);
+ E.IgnoreSysRoot);
}
// Add entries from CPATH and friends.
diff --git a/contrib/llvm/tools/clang/lib/Frontend/InitPreprocessor.cpp b/contrib/llvm/tools/clang/lib/Frontend/InitPreprocessor.cpp
index 147a8df0..9428cd5 100644
--- a/contrib/llvm/tools/clang/lib/Frontend/InitPreprocessor.cpp
+++ b/contrib/llvm/tools/clang/lib/Frontend/InitPreprocessor.cpp
@@ -221,6 +221,125 @@ static void DefineExactWidthIntType(TargetInfo::IntType Ty,
ConstSuffix);
}
+/// \brief Add definitions required for a smooth interaction between
+/// Objective-C++ automatic reference counting and libc++.
+static void AddObjCXXARCLibcxxDefines(const LangOptions &LangOpts,
+ MacroBuilder &Builder) {
+ Builder.defineMacro("_LIBCPP_PREDEFINED_OBJC_ARC_ADDRESSOF");
+
+ std::string Result;
+ {
+ // Provide overloads of the function std::__1::addressof() that accept
+ // references to lifetime-qualified objects. libc++'s (more general)
+ // std::__1::addressof() template fails to instantiate with such types,
+ // because it attempts to convert the object to a char& before
+ // dereferencing.
+ llvm::raw_string_ostream Out(Result);
+
+ Out << "#pragma clang diagnostic push\n"
+ << "#pragma clang diagnostic ignored \"-Wc++0x-extensions\"\n"
+ << "namespace std { inline namespace __1 {\n"
+ << "\n";
+
+ Out << "template <class _Tp>\n"
+ << "inline __attribute__ ((__visibility__(\"hidden\"), "
+ << "__always_inline__))\n"
+ << "__attribute__((objc_ownership(strong))) _Tp*\n"
+ << "addressof(__attribute__((objc_ownership(strong))) _Tp& __x) {\n"
+ << " return &__x;\n"
+ << "}\n"
+ << "\n";
+
+ if (LangOpts.ObjCRuntimeHasWeak) {
+ Out << "template <class _Tp>\n"
+ << "inline __attribute__ ((__visibility__(\"hidden\"),"
+ << "__always_inline__))\n"
+ << "__attribute__((objc_ownership(weak))) _Tp*\n"
+ << "addressof(__attribute__((objc_ownership(weak))) _Tp& __x) {\n"
+ << " return &__x;\n"
+ << "};\n"
+ << "\n";
+ }
+
+ Out << "template <class _Tp>\n"
+ << "inline __attribute__ ((__visibility__(\"hidden\"),"
+ << "__always_inline__))\n"
+ << "__attribute__((objc_ownership(autoreleasing))) _Tp*\n"
+ << "addressof(__attribute__((objc_ownership(autoreleasing))) _Tp& __x) "
+ << "{\n"
+ << " return &__x;\n"
+ << "}\n"
+ << "\n";
+
+ Out << "template <class _Tp>\n"
+ << "inline __attribute__ ((__visibility__(\"hidden\"), "
+ << "__always_inline__))\n"
+ << "__unsafe_unretained _Tp* addressof(__unsafe_unretained _Tp& __x)"
+ << " {\n"
+ << " return &__x;\n"
+ << "}\n";
+
+ Out << "\n"
+ << "} }\n"
+ << "#pragma clang diagnostic pop\n"
+ << "\n";
+ }
+ Builder.append(Result);
+}
+
+/// \brief Add definitions required for a smooth interaction between
+/// Objective-C++ automated reference counting and libstdc++ (4.2).
+static void AddObjCXXARCLibstdcxxDefines(const LangOptions &LangOpts,
+ MacroBuilder &Builder) {
+ Builder.defineMacro("_GLIBCXX_PREDEFINED_OBJC_ARC_IS_SCALAR");
+
+ std::string Result;
+ {
+ // Provide specializations for the __is_scalar type trait so that
+ // lifetime-qualified objects are not considered "scalar" types, which
+ // libstdc++ uses as an indicator of the presence of trivial copy, assign,
+ // default-construct, and destruct semantics (none of which hold for
+ // lifetime-qualified objects in ARC).
+ llvm::raw_string_ostream Out(Result);
+
+ Out << "namespace std {\n"
+ << "\n"
+ << "struct __true_type;\n"
+ << "struct __false_type;\n"
+ << "\n";
+
+ Out << "template<typename _Tp> struct __is_scalar;\n"
+ << "\n";
+
+ Out << "template<typename _Tp>\n"
+ << "struct __is_scalar<__attribute__((objc_ownership(strong))) _Tp> {\n"
+ << " enum { __value = 0 };\n"
+ << " typedef __false_type __type;\n"
+ << "};\n"
+ << "\n";
+
+ if (LangOpts.ObjCRuntimeHasWeak) {
+ Out << "template<typename _Tp>\n"
+ << "struct __is_scalar<__attribute__((objc_ownership(weak))) _Tp> {\n"
+ << " enum { __value = 0 };\n"
+ << " typedef __false_type __type;\n"
+ << "};\n"
+ << "\n";
+ }
+
+ Out << "template<typename _Tp>\n"
+ << "struct __is_scalar<__attribute__((objc_ownership(autoreleasing)))"
+ << " _Tp> {\n"
+ << " enum { __value = 0 };\n"
+ << " typedef __false_type __type;\n"
+ << "};\n"
+ << "\n";
+
+ Out << "}\n";
+ }
+ Builder.append(Result);
+}
+
static void InitializeStandardPredefinedMacros(const TargetInfo &TI,
const LangOptions &LangOpts,
const FrontendOptions &FEOpts,
@@ -240,11 +359,18 @@ static void InitializeStandardPredefinedMacros(const TargetInfo &TI,
} else {
if (LangOpts.GNUMode)
Builder.defineMacro("__cplusplus");
- else
- // C++ [cpp.predefined]p1:
+ else {
+ // C++0x [cpp.predefined]p1:
+ // The name_ _cplusplus is defined to the value 201103L when compiling a
+ // C++ translation unit.
+ if (LangOpts.CPlusPlus0x)
+ Builder.defineMacro("__cplusplus", "201103L");
+ // C++03 [cpp.predefined]p1:
// The name_ _cplusplus is defined to the value 199711L when compiling a
// C++ translation unit.
- Builder.defineMacro("__cplusplus", "199711L");
+ else
+ Builder.defineMacro("__cplusplus", "199711L");
+ }
}
if (LangOpts.ObjC1)
@@ -312,7 +438,8 @@ static void InitializePredefinedMacros(const TargetInfo &TI,
// darwin_constant_cfstrings controls this. This is also dependent
// on other things like the runtime I believe. This is set even for C code.
- Builder.defineMacro("__CONSTANT_CFSTRINGS__");
+ if (!LangOpts.NoConstantCFStrings)
+ Builder.defineMacro("__CONSTANT_CFSTRINGS__");
if (LangOpts.ObjC2)
Builder.defineMacro("OBJC_NEW_PROPERTIES");
@@ -487,6 +614,15 @@ static void InitializePredefinedMacros(const TargetInfo &TI,
if (LangOpts.FastRelaxedMath)
Builder.defineMacro("__FAST_RELAXED_MATH__");
+ if (LangOpts.ObjCAutoRefCount) {
+ Builder.defineMacro("__weak", "__attribute__((objc_ownership(weak)))");
+ Builder.defineMacro("__strong", "__attribute__((objc_ownership(strong)))");
+ Builder.defineMacro("__autoreleasing",
+ "__attribute__((objc_ownership(autoreleasing)))");
+ Builder.defineMacro("__unsafe_unretained",
+ "__attribute__((objc_ownership(none)))");
+ }
+
// Get other target #defines.
TI.getTargetDefines(LangOpts, Builder);
}
@@ -560,6 +696,7 @@ void clang::InitializePreprocessor(Preprocessor &PP,
const PreprocessorOptions &InitOpts,
const HeaderSearchOptions &HSOpts,
const FrontendOptions &FEOpts) {
+ const LangOptions &LangOpts = PP.getLangOptions();
std::string PredefineBuffer;
PredefineBuffer.reserve(4080);
llvm::raw_string_ostream Predefines(PredefineBuffer);
@@ -575,10 +712,27 @@ void clang::InitializePreprocessor(Preprocessor &PP,
Builder.append("# 1 \"<built-in>\" 3");
// Install things like __POWERPC__, __GNUC__, etc into the macro table.
- if (InitOpts.UsePredefines)
- InitializePredefinedMacros(PP.getTargetInfo(), PP.getLangOptions(),
- FEOpts, Builder);
-
+ if (InitOpts.UsePredefines) {
+ InitializePredefinedMacros(PP.getTargetInfo(), LangOpts, FEOpts, Builder);
+
+ // Install definitions to make Objective-C++ ARC work well with various
+ // C++ Standard Library implementations.
+ if (LangOpts.ObjC1 && LangOpts.CPlusPlus && LangOpts.ObjCAutoRefCount) {
+ switch (InitOpts.ObjCXXARCStandardLibrary) {
+ case ARCXX_nolib:
+ break;
+
+ case ARCXX_libcxx:
+ AddObjCXXARCLibcxxDefines(LangOpts, Builder);
+ break;
+
+ case ARCXX_libstdcxx:
+ AddObjCXXARCLibstdcxxDefines(LangOpts, Builder);
+ break;
+ }
+ }
+ }
+
// Even with predefines off, some macros are still predefined.
// These should all be defined in the preprocessor according to the
// current language configuration.
diff --git a/contrib/llvm/tools/clang/lib/Frontend/PrintPreprocessedOutput.cpp b/contrib/llvm/tools/clang/lib/Frontend/PrintPreprocessedOutput.cpp
index b46e047..c892960 100644
--- a/contrib/llvm/tools/clang/lib/Frontend/PrintPreprocessedOutput.cpp
+++ b/contrib/llvm/tools/clang/lib/Frontend/PrintPreprocessedOutput.cpp
@@ -26,6 +26,7 @@
#include "llvm/ADT/StringRef.h"
#include "llvm/Config/config.h"
#include "llvm/Support/raw_ostream.h"
+#include "llvm/Support/ErrorHandling.h"
#include <cstdio>
using namespace clang;
@@ -122,6 +123,12 @@ public:
virtual void PragmaComment(SourceLocation Loc, const IdentifierInfo *Kind,
const std::string &Str);
virtual void PragmaMessage(SourceLocation Loc, llvm::StringRef Str);
+ virtual void PragmaDiagnosticPush(SourceLocation Loc,
+ llvm::StringRef Namespace);
+ virtual void PragmaDiagnosticPop(SourceLocation Loc,
+ llvm::StringRef Namespace);
+ virtual void PragmaDiagnostic(SourceLocation Loc, llvm::StringRef Namespace,
+ diag::Mapping Map, llvm::StringRef Str);
bool HandleFirstTokOnLine(Token &Tok);
bool MoveToLine(SourceLocation Loc) {
@@ -189,7 +196,7 @@ bool PrintPPOutputPPCallbacks::MoveToLine(unsigned LineNo) {
if (LineNo-CurLine == 1)
OS << '\n';
else if (LineNo == CurLine)
- return false; // Spelling line moved, but instantiation line didn't.
+ return false; // Spelling line moved, but expansion line didn't.
else {
const char *NewLines = "\n\n\n\n\n\n\n\n";
OS.write(NewLines, LineNo-CurLine);
@@ -361,12 +368,49 @@ void PrintPPOutputPPCallbacks::PragmaMessage(SourceLocation Loc,
EmittedTokensOnThisLine = true;
}
+void PrintPPOutputPPCallbacks::
+PragmaDiagnosticPush(SourceLocation Loc, llvm::StringRef Namespace) {
+ MoveToLine(Loc);
+ OS << "#pragma " << Namespace << " diagnostic push";
+ EmittedTokensOnThisLine = true;
+}
+
+void PrintPPOutputPPCallbacks::
+PragmaDiagnosticPop(SourceLocation Loc, llvm::StringRef Namespace) {
+ MoveToLine(Loc);
+ OS << "#pragma " << Namespace << " diagnostic pop";
+ EmittedTokensOnThisLine = true;
+}
+
+void PrintPPOutputPPCallbacks::
+PragmaDiagnostic(SourceLocation Loc, llvm::StringRef Namespace,
+ diag::Mapping Map, llvm::StringRef Str) {
+ MoveToLine(Loc);
+ OS << "#pragma " << Namespace << " diagnostic ";
+ switch (Map) {
+ default: llvm_unreachable("unexpected diagnostic kind");
+ case diag::MAP_WARNING:
+ OS << "warning";
+ break;
+ case diag::MAP_ERROR:
+ OS << "error";
+ break;
+ case diag::MAP_IGNORE:
+ OS << "ignored";
+ break;
+ case diag::MAP_FATAL:
+ OS << "fatal";
+ break;
+ }
+ OS << " \"" << Str << '"';
+ EmittedTokensOnThisLine = true;
+}
/// HandleFirstTokOnLine - When emitting a preprocessed file in -E mode, this
/// is called for the first token on each new line. If this really is the start
/// of a new logical line, handle it and return true, otherwise return false.
/// This may not be the start of a logical line because the "start of line"
-/// marker is set for spelling lines, not instantiation ones.
+/// marker is set for spelling lines, not expansion ones.
bool PrintPPOutputPPCallbacks::HandleFirstTokOnLine(Token &Tok) {
// Figure out what line we went to and insert the appropriate number of
// newline characters.
diff --git a/contrib/llvm/tools/clang/lib/Frontend/TextDiagnosticPrinter.cpp b/contrib/llvm/tools/clang/lib/Frontend/TextDiagnosticPrinter.cpp
index 1c47bf7..e49e19a 100644
--- a/contrib/llvm/tools/clang/lib/Frontend/TextDiagnosticPrinter.cpp
+++ b/contrib/llvm/tools/clang/lib/Frontend/TextDiagnosticPrinter.cpp
@@ -292,8 +292,57 @@ static void SelectInterestingSourceRegion(std::string &SourceLine,
}
}
-void TextDiagnosticPrinter::EmitCaretDiagnostic(Diagnostic::Level Level,
- SourceLocation Loc,
+/// Look through spelling locations for a macro argument expansion, and
+/// if found skip to it so that we can trace the argument rather than the macros
+/// in which that argument is used. If no macro argument expansion is found,
+/// don't skip anything and return the starting location.
+static SourceLocation skipToMacroArgExpansion(const SourceManager &SM,
+ SourceLocation StartLoc) {
+ for (SourceLocation L = StartLoc; L.isMacroID();
+ L = SM.getImmediateSpellingLoc(L)) {
+ if (SM.isMacroArgInstantiation(L))
+ return L;
+ }
+
+ // Otherwise just return initial location, there's nothing to skip.
+ return StartLoc;
+}
+
+/// Gets the location of the immediate macro caller, one level up the stack
+/// toward the initial macro typed into the source.
+static SourceLocation getImmediateMacroCallerLoc(const SourceManager &SM,
+ SourceLocation Loc) {
+ if (!Loc.isMacroID()) return Loc;
+
+ // When we have the location of (part of) an expanded parameter, its spelling
+ // location points to the argument as typed into the macro call, and
+ // therefore is used to locate the macro caller.
+ if (SM.isMacroArgInstantiation(Loc))
+ return SM.getImmediateSpellingLoc(Loc);
+
+ // Otherwise, the caller of the macro is located where this macro is
+ // expanded (while the spelling is part of the macro definition).
+ return SM.getImmediateInstantiationRange(Loc).first;
+}
+
+/// Gets the location of the immediate macro callee, one level down the stack
+/// toward the leaf macro.
+static SourceLocation getImmediateMacroCalleeLoc(const SourceManager &SM,
+ SourceLocation Loc) {
+ if (!Loc.isMacroID()) return Loc;
+
+ // When we have the location of (part of) an expanded parameter, its
+ // expansion location points to the unexpanded paramater reference within
+ // the macro definition (or callee).
+ if (SM.isMacroArgInstantiation(Loc))
+ return SM.getImmediateInstantiationRange(Loc).first;
+
+ // Otherwise, the callee of the macro is located where this location was
+ // spelled inside the macro definition.
+ return SM.getImmediateSpellingLoc(Loc);
+}
+
+void TextDiagnosticPrinter::EmitCaretDiagnostic(SourceLocation Loc,
CharSourceRange *Ranges,
unsigned NumRanges,
const SourceManager &SM,
@@ -307,38 +356,46 @@ void TextDiagnosticPrinter::EmitCaretDiagnostic(Diagnostic::Level Level,
assert(!Loc.isInvalid() && "must have a valid source location here");
// If this is a macro ID, first emit information about where this was
- // instantiated (recursively) then emit information about where the token was
+ // expanded (recursively) then emit information about where the token was
// spelled from.
if (!Loc.isFileID()) {
- // Whether to suppress printing this macro instantiation.
+ // Whether to suppress printing this macro expansion.
bool Suppressed
= OnMacroInst >= MacroSkipStart && OnMacroInst < MacroSkipEnd;
-
- SourceLocation OneLevelUp = SM.getImmediateInstantiationRange(Loc).first;
+ // When processing macros, skip over the expansions leading up to
+ // a macro argument, and trace the argument's expansion stack instead.
+ Loc = skipToMacroArgExpansion(SM, Loc);
+
+ SourceLocation OneLevelUp = getImmediateMacroCallerLoc(SM, Loc);
+
// FIXME: Map ranges?
- EmitCaretDiagnostic(Level, OneLevelUp, Ranges, NumRanges, SM, 0, 0, Columns,
+ EmitCaretDiagnostic(OneLevelUp, Ranges, NumRanges, SM,
+ Hints, NumHints, Columns,
OnMacroInst + 1, MacroSkipStart, MacroSkipEnd);
-
+
// Map the location.
- Loc = SM.getImmediateSpellingLoc(Loc);
+ Loc = getImmediateMacroCalleeLoc(SM, Loc);
// Map the ranges.
for (unsigned i = 0; i != NumRanges; ++i) {
CharSourceRange &R = Ranges[i];
SourceLocation S = R.getBegin(), E = R.getEnd();
if (S.isMacroID())
- R.setBegin(SM.getImmediateSpellingLoc(S));
+ R.setBegin(getImmediateMacroCalleeLoc(SM, S));
if (E.isMacroID())
- R.setEnd(SM.getImmediateSpellingLoc(E));
+ R.setEnd(getImmediateMacroCalleeLoc(SM, E));
}
if (!Suppressed) {
+ // Don't print recursive expansion notes from an expansion note.
+ Loc = SM.getSpellingLoc(Loc);
+
// Get the pretty name, according to #line directives etc.
PresumedLoc PLoc = SM.getPresumedLoc(Loc);
if (PLoc.isInvalid())
return;
-
+
// If this diagnostic is not in the main file, print out the
// "included from" lines.
if (LastWarningLoc != PLoc.getIncludeLoc()) {
@@ -353,9 +410,9 @@ void TextDiagnosticPrinter::EmitCaretDiagnostic(Diagnostic::Level Level,
OS << PLoc.getColumn() << ':';
OS << ' ';
}
- OS << "note: instantiated from:\n";
-
- EmitCaretDiagnostic(Level, Loc, Ranges, NumRanges, SM, Hints, NumHints,
+ OS << "note: expanded from:\n";
+
+ EmitCaretDiagnostic(Loc, Ranges, NumRanges, SM, 0, 0,
Columns, OnMacroInst + 1, MacroSkipStart,
MacroSkipEnd);
return;
@@ -364,13 +421,13 @@ void TextDiagnosticPrinter::EmitCaretDiagnostic(Diagnostic::Level Level,
if (OnMacroInst == MacroSkipStart) {
// Tell the user that we've skipped contexts.
OS << "note: (skipping " << (MacroSkipEnd - MacroSkipStart)
- << " contexts in backtrace; use -fmacro-backtrace-limit=0 to see "
+ << " expansions in backtrace; use -fmacro-backtrace-limit=0 to see "
"all)\n";
}
return;
}
-
+
// Decompose the location into a FID/Offset pair.
std::pair<FileID, unsigned> LocInfo = SM.getDecomposedLoc(Loc);
FileID FID = LocInfo.first;
@@ -769,6 +826,20 @@ static bool PrintWordWrapped(llvm::raw_ostream &OS,
return true;
}
+/// Get the presumed location of a diagnostic message. This computes the
+/// presumed location for the top of any macro backtrace when present.
+static PresumedLoc getDiagnosticPresumedLoc(const SourceManager &SM,
+ SourceLocation Loc) {
+ // This is a condensed form of the algorithm used by EmitCaretDiagnostic to
+ // walk to the top of the macro call stack.
+ while (Loc.isMacroID()) {
+ Loc = skipToMacroArgExpansion(SM, Loc);
+ Loc = getImmediateMacroCallerLoc(SM, Loc);
+ }
+
+ return SM.getPresumedLoc(Loc);
+}
+
void TextDiagnosticPrinter::HandleDiagnostic(Diagnostic::Level Level,
const DiagnosticInfo &Info) {
// Default implementation (Warnings/errors count).
@@ -787,7 +858,7 @@ void TextDiagnosticPrinter::HandleDiagnostic(Diagnostic::Level Level,
// if enabled.
if (Info.getLocation().isValid()) {
const SourceManager &SM = Info.getSourceManager();
- PresumedLoc PLoc = SM.getPresumedLoc(Info.getLocation());
+ PresumedLoc PLoc = getDiagnosticPresumedLoc(SM, Info.getLocation());
if (PLoc.isInvalid()) {
// At least print the file name if available:
FileID FID = SM.getFileID(Info.getLocation());
@@ -1040,15 +1111,17 @@ void TextDiagnosticPrinter::HandleDiagnostic(Diagnostic::Level Level,
}
}
+ const SourceManager &SM = LastLoc.getManager();
unsigned MacroInstSkipStart = 0, MacroInstSkipEnd = 0;
if (DiagOpts && DiagOpts->MacroBacktraceLimit && !LastLoc.isFileID()) {
- // Compute the length of the macro-instantiation backtrace, so that we
+ // Compute the length of the macro-expansion backtrace, so that we
// can establish which steps in the macro backtrace we'll skip.
SourceLocation Loc = LastLoc;
unsigned Depth = 0;
do {
++Depth;
- Loc = LastLoc.getManager().getImmediateInstantiationRange(Loc).first;
+ Loc = skipToMacroArgExpansion(SM, Loc);
+ Loc = getImmediateMacroCallerLoc(SM, Loc);
} while (!Loc.isFileID());
if (Depth > DiagOpts->MacroBacktraceLimit) {
@@ -1058,7 +1131,7 @@ void TextDiagnosticPrinter::HandleDiagnostic(Diagnostic::Level Level,
}
}
- EmitCaretDiagnostic(Level, LastLoc, Ranges, NumRanges, LastLoc.getManager(),
+ EmitCaretDiagnostic(LastLoc, Ranges, NumRanges, LastLoc.getManager(),
Info.getFixItHints(),
Info.getNumFixItHints(),
DiagOpts->MessageLength,
diff --git a/contrib/llvm/tools/clang/lib/FrontendTool/ExecuteCompilerInvocation.cpp b/contrib/llvm/tools/clang/lib/FrontendTool/ExecuteCompilerInvocation.cpp
index 664b533..f2db3ae 100644
--- a/contrib/llvm/tools/clang/lib/FrontendTool/ExecuteCompilerInvocation.cpp
+++ b/contrib/llvm/tools/clang/lib/FrontendTool/ExecuteCompilerInvocation.cpp
@@ -14,6 +14,7 @@
#include "clang/FrontendTool/Utils.h"
#include "clang/StaticAnalyzer/Frontend/FrontendActions.h"
+#include "clang/ARCMigrate/ARCMTActions.h"
#include "clang/CodeGen/CodeGenAction.h"
#include "clang/Driver/CC1Options.h"
#include "clang/Driver/OptTable.h"
@@ -38,7 +39,6 @@ static FrontendAction *CreateFrontendBaseAction(CompilerInstance &CI) {
case ASTDumpXML: return new ASTDumpXMLAction();
case ASTPrint: return new ASTPrintAction();
case ASTView: return new ASTViewAction();
- case BoostCon: return new BoostConAction();
case CreateModule: return 0;
case DumpRawTokens: return new DumpRawTokensAction();
case DumpTokens: return new DumpTokensAction();
@@ -89,6 +89,21 @@ static FrontendAction *CreateFrontendAction(CompilerInstance &CI) {
if (!Act)
return 0;
+ // Potentially wrap the base FE action in an ARC Migrate Tool action.
+ switch (CI.getFrontendOpts().ARCMTAction) {
+ case FrontendOptions::ARCMT_None:
+ break;
+ case FrontendOptions::ARCMT_Check:
+ Act = new arcmt::CheckAction(Act);
+ break;
+ case FrontendOptions::ARCMT_Modify:
+ Act = new arcmt::ModifyAction(Act);
+ break;
+ case FrontendOptions::ARCMT_Migrate:
+ Act = new arcmt::MigrateAction(Act, CI.getFrontendOpts().ARCMTMigrateDir);
+ break;
+ }
+
// If there are any AST files to merge, create a frontend action
// adaptor to perform the merge.
if (!CI.getFrontendOpts().ASTMergeFiles.empty())
diff --git a/contrib/llvm/tools/clang/lib/Headers/float.h b/contrib/llvm/tools/clang/lib/Headers/float.h
index 28fb882..6eede0b 100644
--- a/contrib/llvm/tools/clang/lib/Headers/float.h
+++ b/contrib/llvm/tools/clang/lib/Headers/float.h
@@ -24,6 +24,48 @@
#ifndef __FLOAT_H
#define __FLOAT_H
+/* If we're on MinGW, fall baack to the system's float.h, which might have
+ * additional definitions provided for Windows.
+ * For more details see http://msdn.microsoft.com/en-us/library/y0ybw9fy.aspx
+ */
+#if defined(__MINGW32__) && \
+ defined(__has_include_next) && __has_include_next(<float.h>)
+# include_next <float.h>
+
+/* Undefine anything that we'll be redefining below. */
+# undef FLT_EVAL_METHOD
+# undef FLT_ROUNDS
+# undef FLT_RADIX
+# undef FLT_MANT_DIG
+# undef DBL_MANT_DIG
+# undef LDBL_MANT_DIG
+# undef DECIMAL_DIG
+# undef FLT_DIG
+# undef DBL_DIG
+# undef LDBL_DIG
+# undef FLT_MIN_EXP
+# undef DBL_MIN_EXP
+# undef LDBL_MIN_EXP
+# undef FLT_MIN_10_EXP
+# undef DBL_MIN_10_EXP
+# undef LDBL_MIN_10_EXP
+# undef FLT_MAX_EXP
+# undef DBL_MAX_EXP
+# undef LDBL_MAX_EXP
+# undef FLT_MAX_10_EXP
+# undef DBL_MAX_10_EXP
+# undef LDBL_MAX_10_EXP
+# undef FLT_MAX
+# undef DBL_MAX
+# undef LDBL_MAX
+# undef FLT_EPSILON
+# undef DBL_EPSILON
+# undef LDBL_EPSILON
+# undef FLT_MIN
+# undef DBL_MIN
+# undef LDBL_MIN
+#endif
+
/* Characteristics of floating point types, C99 5.2.4.2.2 */
#define FLT_EVAL_METHOD __FLT_EVAL_METHOD__
diff --git a/contrib/llvm/tools/clang/lib/Headers/stdarg.h b/contrib/llvm/tools/clang/lib/Headers/stdarg.h
index c36ab12..2957bf0 100644
--- a/contrib/llvm/tools/clang/lib/Headers/stdarg.h
+++ b/contrib/llvm/tools/clang/lib/Headers/stdarg.h
@@ -39,7 +39,7 @@ typedef __builtin_va_list va_list;
*/
#define __va_copy(d,s) __builtin_va_copy(d,s)
-#if __STDC_VERSION__ >= 199900L || !defined(__STRICT_ANSI__)
+#if __STDC_VERSION__ >= 199900L || __cplusplus >= 201103L || !defined(__STRICT_ANSI__)
#define va_copy(dest, src) __builtin_va_copy(dest, src)
#endif
diff --git a/contrib/llvm/tools/clang/lib/Lex/HeaderSearch.cpp b/contrib/llvm/tools/clang/lib/Lex/HeaderSearch.cpp
index bb43881..86ab956 100644
--- a/contrib/llvm/tools/clang/lib/Lex/HeaderSearch.cpp
+++ b/contrib/llvm/tools/clang/lib/Lex/HeaderSearch.cpp
@@ -123,10 +123,8 @@ const FileEntry *DirectoryLookup::LookupFile(
llvm::SmallString<1024> TmpDir;
if (isNormalDir()) {
// Concatenate the requested file onto the directory.
- // FIXME: Portability. Filename concatenation should be in sys::Path.
- TmpDir += getDir()->getName();
- TmpDir.push_back('/');
- TmpDir.append(Filename.begin(), Filename.end());
+ TmpDir = getDir()->getName();
+ llvm::sys::path::append(TmpDir, Filename);
if (SearchPath != NULL) {
llvm::StringRef SearchPathRef(getDir()->getName());
SearchPath->clear();
diff --git a/contrib/llvm/tools/clang/lib/Lex/Lexer.cpp b/contrib/llvm/tools/clang/lib/Lex/Lexer.cpp
index 3b1149c..a28b8f6 100644
--- a/contrib/llvm/tools/clang/lib/Lex/Lexer.cpp
+++ b/contrib/llvm/tools/clang/lib/Lex/Lexer.cpp
@@ -156,7 +156,7 @@ Lexer::Lexer(FileID FID, const llvm::MemoryBuffer *FromFile,
///
/// On entrance to this routine, TokStartLoc is a macro location which has a
/// spelling loc that indicates the bytes to be lexed for the token and an
-/// instantiation location that indicates where all lexed tokens should be
+/// expansion location that indicates where all lexed tokens should be
/// "expanded from".
///
/// FIXME: It would really be nice to make _Pragma just be a wrapper around a
@@ -166,8 +166,8 @@ Lexer::Lexer(FileID FID, const llvm::MemoryBuffer *FromFile,
/// out of the critical path of the lexer!
///
Lexer *Lexer::Create_PragmaLexer(SourceLocation SpellingLoc,
- SourceLocation InstantiationLocStart,
- SourceLocation InstantiationLocEnd,
+ SourceLocation ExpansionLocStart,
+ SourceLocation ExpansionLocEnd,
unsigned TokLen, Preprocessor &PP) {
SourceManager &SM = PP.getSourceManager();
@@ -188,8 +188,8 @@ Lexer *Lexer::Create_PragmaLexer(SourceLocation SpellingLoc,
// Set the SourceLocation with the remapping information. This ensures that
// GetMappedTokenLoc will remap the tokens as they are lexed.
L->FileLoc = SM.createInstantiationLoc(SM.getLocForStartOfFile(SpellingFID),
- InstantiationLocStart,
- InstantiationLocEnd, TokLen);
+ ExpansionLocStart,
+ ExpansionLocEnd, TokLen);
// Ensure that the lexer thinks it is inside a directive, so that end \n will
// return an EOD token.
@@ -621,7 +621,7 @@ SourceLocation Lexer::AdvanceToTokenCharacter(SourceLocation TokStart,
unsigned CharNo,
const SourceManager &SM,
const LangOptions &Features) {
- // Figure out how many physical characters away the specified instantiation
+ // Figure out how many physical characters away the specified expansion
// character is. This needs to take into consideration newlines and
// trigraphs.
bool Invalid = false;
@@ -679,9 +679,17 @@ SourceLocation Lexer::AdvanceToTokenCharacter(SourceLocation TokStart,
SourceLocation Lexer::getLocForEndOfToken(SourceLocation Loc, unsigned Offset,
const SourceManager &SM,
const LangOptions &Features) {
- if (Loc.isInvalid() || !Loc.isFileID())
+ if (Loc.isInvalid())
return SourceLocation();
-
+
+ if (Loc.isMacroID()) {
+ if (Offset > 0 || !isAtEndOfMacroExpansion(Loc, SM, Features))
+ return SourceLocation(); // Points inside the macro expansion.
+
+ // Continue and find the location just after the macro expansion.
+ Loc = SM.getInstantiationRange(Loc).second;
+ }
+
unsigned Len = Lexer::MeasureTokenLength(Loc, SM, Features);
if (Len > Offset)
Len = Len - Offset;
@@ -691,6 +699,58 @@ SourceLocation Lexer::getLocForEndOfToken(SourceLocation Loc, unsigned Offset,
return Loc.getFileLocWithOffset(Len);
}
+/// \brief Returns true if the given MacroID location points at the first
+/// token of the macro expansion.
+bool Lexer::isAtStartOfMacroExpansion(SourceLocation loc,
+ const SourceManager &SM,
+ const LangOptions &LangOpts) {
+ assert(loc.isValid() && loc.isMacroID() && "Expected a valid macro loc");
+
+ std::pair<FileID, unsigned> infoLoc = SM.getDecomposedLoc(loc);
+ // FIXME: If the token comes from the macro token paste operator ('##')
+ // this function will always return false;
+ if (infoLoc.second > 0)
+ return false; // Does not point at the start of token.
+
+ SourceLocation expansionLoc =
+ SM.getSLocEntry(infoLoc.first)
+ .getInstantiation().getInstantiationLocStart();
+ if (expansionLoc.isFileID())
+ return true; // No other macro expansions, this is the first.
+
+ return isAtStartOfMacroExpansion(expansionLoc, SM, LangOpts);
+}
+
+/// \brief Returns true if the given MacroID location points at the last
+/// token of the macro expansion.
+bool Lexer::isAtEndOfMacroExpansion(SourceLocation loc,
+ const SourceManager &SM,
+ const LangOptions &LangOpts) {
+ assert(loc.isValid() && loc.isMacroID() && "Expected a valid macro loc");
+
+ SourceLocation spellLoc = SM.getSpellingLoc(loc);
+ unsigned tokLen = MeasureTokenLength(spellLoc, SM, LangOpts);
+ if (tokLen == 0)
+ return false;
+
+ FileID FID = SM.getFileID(loc);
+ SourceLocation afterLoc = loc.getFileLocWithOffset(tokLen+1);
+ if (!SM.isBeforeInSourceLocationOffset(afterLoc, SM.getNextOffset()))
+ return true; // We got past the last FileID, this points to the last token.
+
+ // FIXME: If the token comes from the macro token paste operator ('##')
+ // or the stringify operator ('#') this function will always return false;
+ if (FID == SM.getFileID(afterLoc))
+ return false; // Still in the same FileID, does not point to the last token.
+
+ SourceLocation expansionLoc =
+ SM.getSLocEntry(FID).getInstantiation().getInstantiationLocEnd();
+ if (expansionLoc.isFileID())
+ return true; // No other macro expansions.
+
+ return isAtEndOfMacroExpansion(expansionLoc, SM, LangOpts);
+}
+
//===----------------------------------------------------------------------===//
// Character information.
//===----------------------------------------------------------------------===//
@@ -829,7 +889,7 @@ static inline bool isNumberBody(unsigned char c) {
//===----------------------------------------------------------------------===//
/// GetMappedTokenLoc - If lexing out of a 'mapped buffer', where we pretend the
-/// lexer buffer was all instantiated at a single point, perform the mapping.
+/// lexer buffer was all expanded at a single point, perform the mapping.
/// This is currently only used for _Pragma implementation, so it is the slow
/// path of the hot getSourceLocation method. Do not allow it to be inlined.
static LLVM_ATTRIBUTE_NOINLINE SourceLocation GetMappedTokenLoc(
@@ -837,14 +897,14 @@ static LLVM_ATTRIBUTE_NOINLINE SourceLocation GetMappedTokenLoc(
static SourceLocation GetMappedTokenLoc(Preprocessor &PP,
SourceLocation FileLoc,
unsigned CharNo, unsigned TokLen) {
- assert(FileLoc.isMacroID() && "Must be an instantiation");
+ assert(FileLoc.isMacroID() && "Must be a macro expansion");
// Otherwise, we're lexing "mapped tokens". This is used for things like
- // _Pragma handling. Combine the instantiation location of FileLoc with the
+ // _Pragma handling. Combine the expansion location of FileLoc with the
// spelling location.
SourceManager &SM = PP.getSourceManager();
- // Create a new SLoc which is expanded from Instantiation(FileLoc) but whose
+ // Create a new SLoc which is expanded from Expansion(FileLoc) but whose
// characters come from spelling(FileLoc)+Offset.
SourceLocation SpellingLoc = SM.getSpellingLoc(FileLoc);
SpellingLoc = SpellingLoc.getFileLocWithOffset(CharNo);
diff --git a/contrib/llvm/tools/clang/lib/Lex/MacroArgs.cpp b/contrib/llvm/tools/clang/lib/Lex/MacroArgs.cpp
index dee7da3..968c15e 100644
--- a/contrib/llvm/tools/clang/lib/Lex/MacroArgs.cpp
+++ b/contrib/llvm/tools/clang/lib/Lex/MacroArgs.cpp
@@ -185,7 +185,8 @@ MacroArgs::getPreExpArgument(unsigned Arg, const MacroInfo *MI,
/// a character literal for the Microsoft charize (#@) extension.
///
Token MacroArgs::StringifyArgument(const Token *ArgToks,
- Preprocessor &PP, bool Charify) {
+ Preprocessor &PP, bool Charify,
+ SourceLocation hashInstLoc) {
Token Tok;
Tok.startToken();
Tok.setKind(Charify ? tok::char_constant : tok::string_literal);
@@ -273,14 +274,15 @@ Token MacroArgs::StringifyArgument(const Token *ArgToks,
}
}
- PP.CreateString(&Result[0], Result.size(), Tok);
+ PP.CreateString(&Result[0], Result.size(), Tok, hashInstLoc);
return Tok;
}
/// getStringifiedArgument - Compute, cache, and return the specified argument
/// that has been 'stringified' as required by the # operator.
const Token &MacroArgs::getStringifiedArgument(unsigned ArgNo,
- Preprocessor &PP) {
+ Preprocessor &PP,
+ SourceLocation hashInstLoc) {
assert(ArgNo < NumUnexpArgTokens && "Invalid argument number!");
if (StringifiedArgs.empty()) {
StringifiedArgs.resize(getNumArguments());
@@ -288,6 +290,7 @@ const Token &MacroArgs::getStringifiedArgument(unsigned ArgNo,
sizeof(StringifiedArgs[0])*getNumArguments());
}
if (StringifiedArgs[ArgNo].isNot(tok::string_literal))
- StringifiedArgs[ArgNo] = StringifyArgument(getUnexpArgument(ArgNo), PP);
+ StringifiedArgs[ArgNo] = StringifyArgument(getUnexpArgument(ArgNo), PP,
+ /*Charify=*/false, hashInstLoc);
return StringifiedArgs[ArgNo];
}
diff --git a/contrib/llvm/tools/clang/lib/Lex/MacroArgs.h b/contrib/llvm/tools/clang/lib/Lex/MacroArgs.h
index 6ff4856..a962dac 100644
--- a/contrib/llvm/tools/clang/lib/Lex/MacroArgs.h
+++ b/contrib/llvm/tools/clang/lib/Lex/MacroArgs.h
@@ -20,6 +20,7 @@ namespace clang {
class MacroInfo;
class Preprocessor;
class Token;
+ class SourceLocation;
/// MacroArgs - An instance of this class captures information about
/// the formal arguments specified to a function-like macro invocation.
@@ -86,7 +87,8 @@ public:
/// getStringifiedArgument - Compute, cache, and return the specified argument
/// that has been 'stringified' as required by the # operator.
- const Token &getStringifiedArgument(unsigned ArgNo, Preprocessor &PP);
+ const Token &getStringifiedArgument(unsigned ArgNo, Preprocessor &PP,
+ SourceLocation hashInstLoc);
/// getNumArguments - Return the number of arguments passed into this macro
/// invocation.
@@ -106,7 +108,8 @@ public:
/// a character literal for the Microsoft charize (#@) extension.
///
static Token StringifyArgument(const Token *ArgToks,
- Preprocessor &PP, bool Charify = false);
+ Preprocessor &PP, bool Charify,
+ SourceLocation hashInstLoc);
/// deallocate - This should only be called by the Preprocessor when managing
diff --git a/contrib/llvm/tools/clang/lib/Lex/MacroInfo.cpp b/contrib/llvm/tools/clang/lib/Lex/MacroInfo.cpp
index 66d87a1..0a16a25 100644
--- a/contrib/llvm/tools/clang/lib/Lex/MacroInfo.cpp
+++ b/contrib/llvm/tools/clang/lib/Lex/MacroInfo.cpp
@@ -25,6 +25,7 @@ MacroInfo::MacroInfo(SourceLocation DefLoc) : Location(DefLoc) {
IsUsed = false;
IsAllowRedefinitionsWithoutWarning = false;
IsWarnIfUnused = false;
+ IsDefinitionLengthCached = false;
ArgumentList = 0;
NumArguments = 0;
@@ -43,11 +44,42 @@ MacroInfo::MacroInfo(const MacroInfo &MI, llvm::BumpPtrAllocator &PPAllocator) {
IsUsed = MI.IsUsed;
IsAllowRedefinitionsWithoutWarning = MI.IsAllowRedefinitionsWithoutWarning;
IsWarnIfUnused = MI.IsWarnIfUnused;
+ IsDefinitionLengthCached = MI.IsDefinitionLengthCached;
+ DefinitionLength = MI.DefinitionLength;
ArgumentList = 0;
NumArguments = 0;
setArgumentList(MI.ArgumentList, MI.NumArguments, PPAllocator);
}
+unsigned MacroInfo::getDefinitionLengthSlow(SourceManager &SM) const {
+ assert(!IsDefinitionLengthCached);
+ IsDefinitionLengthCached = true;
+
+ if (ReplacementTokens.empty())
+ return (DefinitionLength = 0);
+
+ const Token &firstToken = ReplacementTokens.front();
+ const Token &lastToken = ReplacementTokens.back();
+ SourceLocation macroStart = firstToken.getLocation();
+ SourceLocation macroEnd = lastToken.getLocation();
+ assert(macroStart.isValid() && macroEnd.isValid());
+ assert((macroStart.isFileID() || firstToken.is(tok::comment)) &&
+ "Macro defined in macro?");
+ assert((macroEnd.isFileID() || lastToken.is(tok::comment)) &&
+ "Macro defined in macro?");
+ std::pair<FileID, unsigned>
+ startInfo = SM.getDecomposedInstantiationLoc(macroStart);
+ std::pair<FileID, unsigned>
+ endInfo = SM.getDecomposedInstantiationLoc(macroEnd);
+ assert(startInfo.first == endInfo.first &&
+ "Macro definition spanning multiple FileIDs ?");
+ assert(startInfo.second <= endInfo.second);
+ DefinitionLength = endInfo.second - startInfo.second;
+ DefinitionLength += lastToken.getLength();
+
+ return DefinitionLength;
+}
+
/// isIdenticalTo - Return true if the specified macro definition is equal to
/// this macro in spelling, arguments, and whitespace. This is used to emit
/// duplicate definition warnings. This implements the rules in C99 6.10.3.
diff --git a/contrib/llvm/tools/clang/lib/Lex/PPDirectives.cpp b/contrib/llvm/tools/clang/lib/Lex/PPDirectives.cpp
index 66e44bb..4af5fab 100644
--- a/contrib/llvm/tools/clang/lib/Lex/PPDirectives.cpp
+++ b/contrib/llvm/tools/clang/lib/Lex/PPDirectives.cpp
@@ -784,8 +784,7 @@ void Preprocessor::HandleLineDirective(Token &Tok) {
Diag(StrTok, diag::err_pp_linemarker_invalid_filename);
return DiscardUntilEndOfDirective();
}
- FilenameID = SourceMgr.getLineTableFilenameID(Literal.GetString(),
- Literal.GetStringLength());
+ FilenameID = SourceMgr.getLineTableFilenameID(Literal.GetString());
// Verify that there is nothing after the string, other than EOD. Because
// of C99 6.10.4p5, macros that expand to empty tokens are ok.
@@ -918,8 +917,7 @@ void Preprocessor::HandleDigitDirective(Token &DigitTok) {
Diag(StrTok, diag::err_pp_linemarker_invalid_filename);
return DiscardUntilEndOfDirective();
}
- FilenameID = SourceMgr.getLineTableFilenameID(Literal.GetString(),
- Literal.GetStringLength());
+ FilenameID = SourceMgr.getLineTableFilenameID(Literal.GetString());
// If a filename was present, read any flags that are present.
if (ReadLineMarkerFlags(IsFileEntry, IsFileExit,
@@ -1182,16 +1180,17 @@ void Preprocessor::HandleIncludeDirective(SourceLocation HashLoc,
const FileEntry *File = LookupFile(
Filename, isAngled, LookupFrom, CurDir,
Callbacks ? &SearchPath : NULL, Callbacks ? &RelativePath : NULL);
- if (File == 0) {
- Diag(FilenameTok, diag::err_pp_file_not_found) << Filename;
- return;
- }
// Notify the callback object that we've seen an inclusion directive.
if (Callbacks)
Callbacks->InclusionDirective(HashLoc, IncludeTok, Filename, isAngled, File,
End, SearchPath, RelativePath);
+ if (File == 0) {
+ Diag(FilenameTok, diag::warn_pp_file_not_found) << Filename;
+ return;
+ }
+
// The #included file will be considered to be a system header if either it is
// in a system include directory, or if the #includer is a system include
// header.
@@ -1210,10 +1209,7 @@ void Preprocessor::HandleIncludeDirective(SourceLocation HashLoc,
// Look up the file, create a File ID for it.
FileID FID = SourceMgr.createFileID(File, FilenameTok.getLocation(),
FileCharacter);
- if (FID.isInvalid()) {
- Diag(FilenameTok, diag::err_pp_file_not_found) << Filename;
- return;
- }
+ assert(!FID.isInvalid() && "Expected valid file ID");
// Finally, if all is good, enter the new file!
EnterSourceFile(FID, CurDir, FilenameTok.getLocation());
@@ -1599,7 +1595,7 @@ void Preprocessor::HandleUndefDirective(Token &UndefTok) {
// If the macro is not defined, this is a noop undef, just return.
if (MI == 0) return;
- if (!MI->isUsed())
+ if (!MI->isUsed() && MI->isWarnIfUnused())
Diag(MI->getDefinitionLoc(), diag::pp_macro_not_used);
// If the callbacks want to know, tell them about the macro #undef.
diff --git a/contrib/llvm/tools/clang/lib/Lex/PPLexerChange.cpp b/contrib/llvm/tools/clang/lib/Lex/PPLexerChange.cpp
index bf0a7fb..bf28199 100644
--- a/contrib/llvm/tools/clang/lib/Lex/PPLexerChange.cpp
+++ b/contrib/llvm/tools/clang/lib/Lex/PPLexerChange.cpp
@@ -265,6 +265,10 @@ bool Preprocessor::HandleEndOfTokenLexer(Token &Result) {
assert(CurTokenLexer && !CurPPLexer &&
"Ending a macro when currently in a #include file!");
+ if (!MacroExpandingLexersStack.empty() &&
+ MacroExpandingLexersStack.back().first == CurTokenLexer.get())
+ removeCachedMacroExpandedTokensOfLastLexer();
+
// Delete or cache the now-dead macro expander.
if (NumCachedTokenLexers == TokenLexerCacheSize)
CurTokenLexer.reset();
diff --git a/contrib/llvm/tools/clang/lib/Lex/PPMacroExpansion.cpp b/contrib/llvm/tools/clang/lib/Lex/PPMacroExpansion.cpp
index 01cd75f..ecd4d4c 100644
--- a/contrib/llvm/tools/clang/lib/Lex/PPMacroExpansion.cpp
+++ b/contrib/llvm/tools/clang/lib/Lex/PPMacroExpansion.cpp
@@ -22,6 +22,7 @@
#include "clang/Lex/CodeCompletionHandler.h"
#include "clang/Lex/ExternalPreprocessorSource.h"
#include "llvm/ADT/StringSwitch.h"
+#include "llvm/ADT/STLExtras.h"
#include "llvm/Config/config.h"
#include "llvm/Support/raw_ostream.h"
#include <cstdio>
@@ -194,9 +195,9 @@ bool Preprocessor::HandleMacroExpandedIdentifier(Token &Identifier,
/// invocation.
MacroArgs *Args = 0;
- // Remember where the end of the instantiation occurred. For an object-like
+ // Remember where the end of the expansion occurred. For an object-like
// macro, this is the identifier. For a function-like macro, this is the ')'.
- SourceLocation InstantiationEnd = Identifier.getLocation();
+ SourceLocation ExpansionEnd = Identifier.getLocation();
// If this is a function-like macro, read the arguments.
if (MI->isFunctionLike()) {
@@ -209,7 +210,7 @@ bool Preprocessor::HandleMacroExpandedIdentifier(Token &Identifier,
// Preprocessor directives used inside macro arguments are not portable, and
// this enables the warning.
InMacroArgs = true;
- Args = ReadFunctionLikeMacroArgs(Identifier, MI, InstantiationEnd);
+ Args = ReadFunctionLikeMacroArgs(Identifier, MI, ExpansionEnd);
// Finished parsing args.
InMacroArgs = false;
@@ -229,8 +230,8 @@ bool Preprocessor::HandleMacroExpandedIdentifier(Token &Identifier,
// If we started lexing a macro, enter the macro expansion body.
- // Remember where the token is instantiated.
- SourceLocation InstantiateLoc = Identifier.getLocation();
+ // Remember where the token is expanded.
+ SourceLocation ExpandLoc = Identifier.getLocation();
// If this macro expands to no tokens, don't bother to push it onto the
// expansion stack, only to take it right back off.
@@ -254,7 +255,7 @@ bool Preprocessor::HandleMacroExpandedIdentifier(Token &Identifier,
if (HadLeadingSpace) Identifier.setFlag(Token::LeadingSpace);
}
Identifier.setFlag(Token::LeadingEmptyMacro);
- LastEmptyMacroInstantiationLoc = InstantiateLoc;
+ LastEmptyMacroExpansionLoc = ExpandLoc;
++NumFastMacroExpanded;
return false;
@@ -280,11 +281,11 @@ bool Preprocessor::HandleMacroExpandedIdentifier(Token &Identifier,
Identifier.setFlagValue(Token::StartOfLine , isAtStartOfLine);
Identifier.setFlagValue(Token::LeadingSpace, hasLeadingSpace);
- // Update the tokens location to include both its instantiation and physical
+ // Update the tokens location to include both its expansion and physical
// locations.
SourceLocation Loc =
- SourceMgr.createInstantiationLoc(Identifier.getLocation(), InstantiateLoc,
- InstantiationEnd,Identifier.getLength());
+ SourceMgr.createInstantiationLoc(Identifier.getLocation(), ExpandLoc,
+ ExpansionEnd,Identifier.getLength());
Identifier.setLocation(Loc);
// If this is a disabled macro or #define X X, we must mark the result as
@@ -302,7 +303,7 @@ bool Preprocessor::HandleMacroExpandedIdentifier(Token &Identifier,
}
// Start expanding the macro.
- EnterMacro(Identifier, InstantiationEnd, Args);
+ EnterMacro(Identifier, ExpansionEnd, Args);
// Now that the macro is at the top of the include stack, ask the
// preprocessor to read the next token from it.
@@ -490,6 +491,46 @@ MacroArgs *Preprocessor::ReadFunctionLikeMacroArgs(Token &MacroName,
isVarargsElided, *this);
}
+/// \brief Keeps macro expanded tokens for TokenLexers.
+//
+/// Works like a stack; a TokenLexer adds the macro expanded tokens that is
+/// going to lex in the cache and when it finishes the tokens are removed
+/// from the end of the cache.
+Token *Preprocessor::cacheMacroExpandedTokens(TokenLexer *tokLexer,
+ llvm::ArrayRef<Token> tokens) {
+ assert(tokLexer);
+ if (tokens.empty())
+ return 0;
+
+ size_t newIndex = MacroExpandedTokens.size();
+ bool cacheNeedsToGrow = tokens.size() >
+ MacroExpandedTokens.capacity()-MacroExpandedTokens.size();
+ MacroExpandedTokens.append(tokens.begin(), tokens.end());
+
+ if (cacheNeedsToGrow) {
+ // Go through all the TokenLexers whose 'Tokens' pointer points in the
+ // buffer and update the pointers to the (potential) new buffer array.
+ for (unsigned i = 0, e = MacroExpandingLexersStack.size(); i != e; ++i) {
+ TokenLexer *prevLexer;
+ size_t tokIndex;
+ llvm::tie(prevLexer, tokIndex) = MacroExpandingLexersStack[i];
+ prevLexer->Tokens = MacroExpandedTokens.data() + tokIndex;
+ }
+ }
+
+ MacroExpandingLexersStack.push_back(std::make_pair(tokLexer, newIndex));
+ return MacroExpandedTokens.data() + newIndex;
+}
+
+void Preprocessor::removeCachedMacroExpandedTokensOfLastLexer() {
+ assert(!MacroExpandingLexersStack.empty());
+ size_t tokIndex = MacroExpandingLexersStack.back().second;
+ assert(tokIndex < MacroExpandedTokens.size());
+ // Pop the cached macro expanded tokens from the end.
+ MacroExpandedTokens.resize(tokIndex);
+ MacroExpandingLexersStack.pop_back();
+}
+
/// ComputeDATE_TIME - Compute the current time, enter it into the specified
/// scratch buffer, then return DATELoc/TIMELoc locations with the position of
/// the identifier tokens inserted.
@@ -551,6 +592,11 @@ static bool HasFeature(const Preprocessor &PP, const IdentifierInfo *II) {
.Case("cxx_exceptions", LangOpts.Exceptions)
.Case("cxx_rtti", LangOpts.RTTI)
.Case("enumerator_attributes", true)
+ // Objective-C features
+ .Case("objc_arr", LangOpts.ObjCAutoRefCount) // FIXME: REMOVE?
+ .Case("objc_arc", LangOpts.ObjCAutoRefCount)
+ .Case("objc_arc_weak", LangOpts.ObjCAutoRefCount &&
+ LangOpts.ObjCRuntimeHasWeak)
.Case("objc_nonfragile_abi", LangOpts.ObjCNonFragileABI)
.Case("objc_weak_class", LangOpts.ObjCNonFragileABI)
.Case("ownership_holds", true)
@@ -787,10 +833,10 @@ void Preprocessor::ExpandBuiltinMacro(Token &Tok) {
Loc = AdvanceToTokenCharacter(Loc, 0);
// One wrinkle here is that GCC expands __LINE__ to location of the *end* of
- // a macro instantiation. This doesn't matter for object-like macros, but
+ // a macro expansion. This doesn't matter for object-like macros, but
// can matter for a function-like macro that expands to contain __LINE__.
- // Skip down through instantiation points until we find a file loc for the
- // end of the instantiation history.
+ // Skip down through expansion points until we find a file loc for the
+ // end of the expansion history.
Loc = SourceMgr.getInstantiationRange(Loc).second;
PresumedLoc PLoc = SourceMgr.getPresumedLoc(Loc);
diff --git a/contrib/llvm/tools/clang/lib/Lex/Pragma.cpp b/contrib/llvm/tools/clang/lib/Lex/Pragma.cpp
index 23855d4..e6b28c1 100644
--- a/contrib/llvm/tools/clang/lib/Lex/Pragma.cpp
+++ b/contrib/llvm/tools/clang/lib/Lex/Pragma.cpp
@@ -326,9 +326,7 @@ void Preprocessor::HandlePragmaSystemHeader(Token &SysHeaderTok) {
if (PLoc.isInvalid())
return;
- unsigned FilenameLen = strlen(PLoc.getFilename());
- unsigned FilenameID = SourceMgr.getLineTableFilenameID(PLoc.getFilename(),
- FilenameLen);
+ unsigned FilenameID = SourceMgr.getLineTableFilenameID(PLoc.getFilename());
// Notify the client, if desired, that we are in a new source file.
if (Callbacks)
@@ -370,7 +368,7 @@ void Preprocessor::HandlePragmaDependency(Token &DependencyTok) {
const DirectoryLookup *CurDir;
const FileEntry *File = LookupFile(Filename, isAngled, 0, CurDir, NULL, NULL);
if (File == 0) {
- Diag(FilenameTok, diag::err_pp_file_not_found) << Filename;
+ Diag(FilenameTok, diag::warn_pp_file_not_found) << Filename;
return;
}
@@ -454,8 +452,7 @@ void Preprocessor::HandlePragmaComment(Token &Tok) {
return;
}
- ArgumentString = std::string(Literal.GetString(),
- Literal.GetString()+Literal.GetStringLength());
+ ArgumentString = Literal.GetString();
}
// FIXME: If the kind is "compiler" warn if the string is present (it is
@@ -531,7 +528,7 @@ void Preprocessor::HandlePragmaMessage(Token &Tok) {
return;
}
- llvm::StringRef MessageString(Literal.GetString(), Literal.GetStringLength());
+ llvm::StringRef MessageString(Literal.GetString());
if (ExpectClosingParen) {
if (Tok.isNot(tok::r_paren)) {
@@ -839,8 +836,11 @@ struct PragmaDebugHandler : public PragmaHandler {
/// PragmaDiagnosticHandler - e.g. '#pragma GCC diagnostic ignored "-Wformat"'
struct PragmaDiagnosticHandler : public PragmaHandler {
+private:
+ const char *Namespace;
public:
- explicit PragmaDiagnosticHandler() : PragmaHandler("diagnostic") {}
+ explicit PragmaDiagnosticHandler(const char *NS) :
+ PragmaHandler("diagnostic"), Namespace(NS) {}
virtual void HandlePragma(Preprocessor &PP, PragmaIntroducerKind Introducer,
Token &DiagToken) {
SourceLocation DiagLoc = DiagToken.getLocation();
@@ -851,6 +851,7 @@ public:
return;
}
IdentifierInfo *II = Tok.getIdentifierInfo();
+ PPCallbacks *Callbacks = PP.getPPCallbacks();
diag::Mapping Map;
if (II->isStr("warning"))
@@ -864,10 +865,13 @@ public:
else if (II->isStr("pop")) {
if (!PP.getDiagnostics().popMappings(DiagLoc))
PP.Diag(Tok, diag::warn_pragma_diagnostic_cannot_pop);
-
+ else if (Callbacks)
+ Callbacks->PragmaDiagnosticPop(DiagLoc, Namespace);
return;
} else if (II->isStr("push")) {
PP.getDiagnostics().pushMappings(DiagLoc);
+ if (Callbacks)
+ Callbacks->PragmaDiagnosticPush(DiagLoc, Namespace);
return;
} else {
PP.Diag(Tok, diag::warn_pragma_diagnostic_invalid);
@@ -906,7 +910,7 @@ public:
return;
}
- llvm::StringRef WarningName(Literal.GetString(), Literal.GetStringLength());
+ llvm::StringRef WarningName(Literal.GetString());
if (WarningName.size() < 3 || WarningName[0] != '-' ||
WarningName[1] != 'W') {
@@ -919,6 +923,8 @@ public:
Map, DiagLoc))
PP.Diag(StrToks[0].getLocation(),
diag::warn_pragma_diagnostic_unknown_warning) << WarningName;
+ else if (Callbacks)
+ Callbacks->PragmaDiagnostic(DiagLoc, Namespace, Map, WarningName);
}
};
@@ -1013,13 +1019,13 @@ void Preprocessor::RegisterBuiltinPragmas() {
AddPragmaHandler("GCC", new PragmaPoisonHandler());
AddPragmaHandler("GCC", new PragmaSystemHeaderHandler());
AddPragmaHandler("GCC", new PragmaDependencyHandler());
- AddPragmaHandler("GCC", new PragmaDiagnosticHandler());
+ AddPragmaHandler("GCC", new PragmaDiagnosticHandler("GCC"));
// #pragma clang ...
AddPragmaHandler("clang", new PragmaPoisonHandler());
AddPragmaHandler("clang", new PragmaSystemHeaderHandler());
AddPragmaHandler("clang", new PragmaDebugHandler());
AddPragmaHandler("clang", new PragmaDependencyHandler());
- AddPragmaHandler("clang", new PragmaDiagnosticHandler());
+ AddPragmaHandler("clang", new PragmaDiagnosticHandler("clang"));
AddPragmaHandler("STDC", new PragmaSTDC_FENV_ACCESSHandler());
AddPragmaHandler("STDC", new PragmaSTDC_CX_LIMITED_RANGEHandler());
diff --git a/contrib/llvm/tools/clang/lib/Lex/PreprocessingRecord.cpp b/contrib/llvm/tools/clang/lib/Lex/PreprocessingRecord.cpp
index 0c8d948..9f93ab0 100644
--- a/contrib/llvm/tools/clang/lib/Lex/PreprocessingRecord.cpp
+++ b/contrib/llvm/tools/clang/lib/Lex/PreprocessingRecord.cpp
@@ -45,8 +45,8 @@ void PreprocessingRecord::MaybeLoadPreallocatedEntities() const {
ExternalSource->ReadPreprocessedEntities();
}
-PreprocessingRecord::PreprocessingRecord(bool IncludeNestedMacroInstantiations)
- : IncludeNestedMacroInstantiations(IncludeNestedMacroInstantiations),
+PreprocessingRecord::PreprocessingRecord(bool IncludeNestedMacroExpansions)
+ : IncludeNestedMacroExpansions(IncludeNestedMacroExpansions),
ExternalSource(0), NumPreallocatedEntities(0),
LoadedPreallocatedEntities(false)
{
@@ -121,14 +121,13 @@ MacroDefinition *PreprocessingRecord::findMacroDefinition(const MacroInfo *MI) {
}
void PreprocessingRecord::MacroExpands(const Token &Id, const MacroInfo* MI) {
- if (!IncludeNestedMacroInstantiations && Id.getLocation().isMacroID())
+ if (!IncludeNestedMacroExpansions && Id.getLocation().isMacroID())
return;
if (MacroDefinition *Def = findMacroDefinition(MI))
PreprocessedEntities.push_back(
- new (*this) MacroInstantiation(Id.getIdentifierInfo(),
- Id.getLocation(),
- Def));
+ new (*this) MacroExpansion(Id.getIdentifierInfo(),
+ Id.getLocation(), Def));
}
void PreprocessingRecord::MacroDefined(const Token &Id,
diff --git a/contrib/llvm/tools/clang/lib/Lex/Preprocessor.cpp b/contrib/llvm/tools/clang/lib/Lex/Preprocessor.cpp
index fdc18f8..e7aa286 100644
--- a/contrib/llvm/tools/clang/lib/Lex/Preprocessor.cpp
+++ b/contrib/llvm/tools/clang/lib/Lex/Preprocessor.cpp
@@ -118,6 +118,8 @@ Preprocessor::Preprocessor(Diagnostic &diags, const LangOptions &opts,
Preprocessor::~Preprocessor() {
assert(BacktrackPositions.empty() && "EnableBacktrack/Backtrack imbalance!");
+ assert(MacroExpandingLexersStack.empty() && MacroExpandedTokens.empty() &&
+ "Preprocessor::HandleEndOfTokenLexer should have cleared those");
while (!IncludeMacroStack.empty()) {
delete IncludeMacroStack.back().TheLexer;
@@ -225,6 +227,10 @@ Preprocessor::macro_begin(bool IncludeExternalMacros) const {
return Macros.begin();
}
+size_t Preprocessor::getTotalMemory() const {
+ return BP.getTotalMemory() + MacroExpandedTokens.capacity()*sizeof(Token);
+}
+
Preprocessor::macro_iterator
Preprocessor::macro_end(bool IncludeExternalMacros) const {
if (IncludeExternalMacros && ExternalSource &&
@@ -322,15 +328,15 @@ llvm::StringRef Preprocessor::getSpelling(const Token &Tok,
/// location for it. If specified, the source location provides a source
/// location for the token.
void Preprocessor::CreateString(const char *Buf, unsigned Len, Token &Tok,
- SourceLocation InstantiationLoc) {
+ SourceLocation ExpansionLoc) {
Tok.setLength(Len);
const char *DestPtr;
SourceLocation Loc = ScratchBuf->getToken(Buf, Len, DestPtr);
- if (InstantiationLoc.isValid())
- Loc = SourceMgr.createInstantiationLoc(Loc, InstantiationLoc,
- InstantiationLoc, Len);
+ if (ExpansionLoc.isValid())
+ Loc = SourceMgr.createInstantiationLoc(Loc, ExpansionLoc,
+ ExpansionLoc, Len);
Tok.setLocation(Loc);
// If this is a raw identifier or a literal token, set the pointer data.
@@ -528,10 +534,10 @@ CommentHandler::~CommentHandler() { }
CodeCompletionHandler::~CodeCompletionHandler() { }
void Preprocessor::createPreprocessingRecord(
- bool IncludeNestedMacroInstantiations) {
+ bool IncludeNestedMacroExpansions) {
if (Record)
return;
- Record = new PreprocessingRecord(IncludeNestedMacroInstantiations);
+ Record = new PreprocessingRecord(IncludeNestedMacroExpansions);
addPPCallbacks(Record);
}
diff --git a/contrib/llvm/tools/clang/lib/Lex/TokenLexer.cpp b/contrib/llvm/tools/clang/lib/Lex/TokenLexer.cpp
index 65aff0d..8ff82f1 100644
--- a/contrib/llvm/tools/clang/lib/Lex/TokenLexer.cpp
+++ b/contrib/llvm/tools/clang/lib/Lex/TokenLexer.cpp
@@ -23,7 +23,7 @@ using namespace clang;
/// Create a TokenLexer for the specified macro with the specified actual
/// arguments. Note that this ctor takes ownership of the ActualArgs pointer.
-void TokenLexer::Init(Token &Tok, SourceLocation ILEnd, MacroArgs *Actuals) {
+void TokenLexer::Init(Token &Tok, SourceLocation ELEnd, MacroArgs *Actuals) {
// If the client is reusing a TokenLexer, make sure to free any memory
// associated with it.
destroy();
@@ -32,14 +32,36 @@ void TokenLexer::Init(Token &Tok, SourceLocation ILEnd, MacroArgs *Actuals) {
ActualArgs = Actuals;
CurToken = 0;
- InstantiateLocStart = Tok.getLocation();
- InstantiateLocEnd = ILEnd;
+ ExpandLocStart = Tok.getLocation();
+ ExpandLocEnd = ELEnd;
AtStartOfLine = Tok.isAtStartOfLine();
HasLeadingSpace = Tok.hasLeadingSpace();
Tokens = &*Macro->tokens_begin();
OwnsTokens = false;
DisableMacroExpansion = false;
NumTokens = Macro->tokens_end()-Macro->tokens_begin();
+ MacroExpansionStart = SourceLocation();
+
+ SourceManager &SM = PP.getSourceManager();
+ MacroStartSLocOffset = SM.getNextOffset();
+
+ if (NumTokens > 0) {
+ assert(Tokens[0].getLocation().isValid());
+ assert((Tokens[0].getLocation().isFileID() || Tokens[0].is(tok::comment)) &&
+ "Macro defined in macro?");
+ assert(ExpandLocStart.isValid());
+
+ // Reserve a source location entry chunk for the length of the macro
+ // definition. Tokens that get lexed directly from the definition will
+ // have their locations pointing inside this chunk. This is to avoid
+ // creating separate source location entries for each token.
+ SourceLocation macroStart = SM.getInstantiationLoc(Tokens[0].getLocation());
+ MacroDefStartInfo = SM.getDecomposedLoc(macroStart);
+ MacroExpansionStart = SM.createInstantiationLoc(macroStart,
+ ExpandLocStart,
+ ExpandLocEnd,
+ Macro->getDefinitionLength(SM));
+ }
// If this is a function-like macro, expand the arguments and change
// Tokens to point to the expanded tokens.
@@ -69,9 +91,10 @@ void TokenLexer::Init(const Token *TokArray, unsigned NumToks,
DisableMacroExpansion = disableMacroExpansion;
NumTokens = NumToks;
CurToken = 0;
- InstantiateLocStart = InstantiateLocEnd = SourceLocation();
+ ExpandLocStart = ExpandLocEnd = SourceLocation();
AtStartOfLine = false;
HasLeadingSpace = false;
+ MacroExpansionStart = SourceLocation();
// Set HasLeadingSpace/AtStartOfLine so that the first token will be
// returned unmodified.
@@ -98,6 +121,8 @@ void TokenLexer::destroy() {
/// Expand the arguments of a function-like macro so that we can quickly
/// return preexpanded tokens from Tokens.
void TokenLexer::ExpandFunctionArguments() {
+ SourceManager &SM = PP.getSourceManager();
+
llvm::SmallVector<Token, 128> ResultToks;
// Loop through 'Tokens', expanding them into ResultToks. Keep
@@ -119,13 +144,19 @@ void TokenLexer::ExpandFunctionArguments() {
int ArgNo = Macro->getArgumentNum(Tokens[i+1].getIdentifierInfo());
assert(ArgNo != -1 && "Token following # is not an argument?");
+ SourceLocation hashInstLoc;
+ if(ExpandLocStart.isValid()) {
+ hashInstLoc = getMacroExpansionLocation(CurTok.getLocation());
+ assert(hashInstLoc.isValid() && "Expected '#' to come from definition");
+ }
+
Token Res;
if (CurTok.is(tok::hash)) // Stringify
- Res = ActualArgs->getStringifiedArgument(ArgNo, PP);
+ Res = ActualArgs->getStringifiedArgument(ArgNo, PP, hashInstLoc);
else {
// 'charify': don't bother caching these.
Res = MacroArgs::StringifyArgument(ActualArgs->getUnexpArgument(ArgNo),
- PP, true);
+ PP, true, hashInstLoc);
}
// The stringified/charified string leading space flag gets set to match
@@ -185,6 +216,27 @@ void TokenLexer::ExpandFunctionArguments() {
unsigned NumToks = MacroArgs::getArgLength(ResultArgToks);
ResultToks.append(ResultArgToks, ResultArgToks+NumToks);
+ // If the '##' came from expanding an argument, turn it into 'unknown'
+ // to avoid pasting.
+ for (unsigned i = FirstResult, e = ResultToks.size(); i != e; ++i) {
+ Token &Tok = ResultToks[i];
+ if (Tok.is(tok::hashhash))
+ Tok.setKind(tok::unknown);
+ }
+
+ if(ExpandLocStart.isValid()) {
+ SourceLocation curInst =
+ getMacroExpansionLocation(CurTok.getLocation());
+ assert(curInst.isValid() &&
+ "Expected arg identifier to come from definition");
+ for (unsigned i = FirstResult, e = ResultToks.size(); i != e; ++i) {
+ Token &Tok = ResultToks[i];
+ Tok.setLocation(SM.createMacroArgInstantiationLoc(Tok.getLocation(),
+ curInst,
+ Tok.getLength()));
+ }
+ }
+
// If any tokens were substituted from the argument, the whitespace
// before the first token should match the whitespace of the arg
// identifier.
@@ -220,6 +272,29 @@ void TokenLexer::ExpandFunctionArguments() {
ResultToks.append(ArgToks, ArgToks+NumToks);
+ // If the '##' came from expanding an argument, turn it into 'unknown'
+ // to avoid pasting.
+ for (unsigned i = ResultToks.size() - NumToks, e = ResultToks.size();
+ i != e; ++i) {
+ Token &Tok = ResultToks[i];
+ if (Tok.is(tok::hashhash))
+ Tok.setKind(tok::unknown);
+ }
+
+ if (ExpandLocStart.isValid()) {
+ SourceLocation curInst =
+ getMacroExpansionLocation(CurTok.getLocation());
+ assert(curInst.isValid() &&
+ "Expected arg identifier to come from definition");
+ for (unsigned i = ResultToks.size() - NumToks, e = ResultToks.size();
+ i != e; ++i) {
+ Token &Tok = ResultToks[i];
+ Tok.setLocation(SM.createMacroArgInstantiationLoc(Tok.getLocation(),
+ curInst,
+ Tok.getLength()));
+ }
+ }
+
// If this token (the macro argument) was supposed to get leading
// whitespace, transfer this information onto the first token of the
// expansion.
@@ -284,15 +359,11 @@ void TokenLexer::ExpandFunctionArguments() {
assert(!OwnsTokens && "This would leak if we already own the token list");
// This is deleted in the dtor.
NumTokens = ResultToks.size();
- llvm::BumpPtrAllocator &Alloc = PP.getPreprocessorAllocator();
- Token *Res =
- static_cast<Token *>(Alloc.Allocate(sizeof(Token)*ResultToks.size(),
- llvm::alignOf<Token>()));
- if (NumTokens)
- memcpy(Res, &ResultToks[0], NumTokens*sizeof(Token));
- Tokens = Res;
-
- // The preprocessor bump pointer owns these tokens, not us.
+ // The tokens will be added to Preprocessor's cache and will be removed
+ // when this TokenLexer finishes lexing them.
+ Tokens = PP.cacheMacroExpandedTokens(this, ResultToks);
+
+ // The preprocessor cache of macro expanded tokens owns these tokens,not us.
OwnsTokens = false;
}
}
@@ -317,6 +388,8 @@ void TokenLexer::Lex(Token &Tok) {
return PPCache.Lex(Tok);
}
+ SourceManager &SM = PP.getSourceManager();
+
// If this is the first token of the expanded result, we inherit spacing
// properties later.
bool isFirstToken = CurToken == 0;
@@ -327,7 +400,8 @@ void TokenLexer::Lex(Token &Tok) {
bool TokenIsFromPaste = false;
// If this token is followed by a token paste (##) operator, paste the tokens!
- if (!isAtEnd() && Tokens[CurToken].is(tok::hashhash)) {
+ // Note that ## is a normal token when not expanding a macro.
+ if (!isAtEnd() && Tokens[CurToken].is(tok::hashhash) && Macro) {
// When handling the microsoft /##/ extension, the final token is
// returned by PasteTokens, not the pasted token.
if (PasteTokens(Tok))
@@ -339,14 +413,25 @@ void TokenLexer::Lex(Token &Tok) {
// The token's current location indicate where the token was lexed from. We
// need this information to compute the spelling of the token, but any
// diagnostics for the expanded token should appear as if they came from
- // InstantiationLoc. Pull this information together into a new SourceLocation
+ // ExpansionLoc. Pull this information together into a new SourceLocation
// that captures all of this.
- if (InstantiateLocStart.isValid()) { // Don't do this for token streams.
- SourceManager &SM = PP.getSourceManager();
- Tok.setLocation(SM.createInstantiationLoc(Tok.getLocation(),
- InstantiateLocStart,
- InstantiateLocEnd,
- Tok.getLength()));
+ if (ExpandLocStart.isValid() && // Don't do this for token streams.
+ // Check that the token's location was not already set properly.
+ SM.isBeforeInSourceLocationOffset(Tok.getLocation(),
+ MacroStartSLocOffset)) {
+ SourceLocation instLoc;
+ if (Tok.is(tok::comment)) {
+ instLoc = SM.createInstantiationLoc(Tok.getLocation(),
+ ExpandLocStart,
+ ExpandLocEnd,
+ Tok.getLength());
+ } else {
+ instLoc = getMacroExpansionLocation(Tok.getLocation());
+ assert(instLoc.isValid() &&
+ "Location for token not coming from definition was not set!");
+ }
+
+ Tok.setLocation(instLoc);
}
// If this is the first token, set the lexical properties of the token to
@@ -384,9 +469,10 @@ void TokenLexer::Lex(Token &Tok) {
bool TokenLexer::PasteTokens(Token &Tok) {
llvm::SmallString<128> Buffer;
const char *ResultTokStrPtr = 0;
+ SourceLocation PasteOpLoc;
do {
// Consume the ## operator.
- SourceLocation PasteOpLoc = Tokens[CurToken].getLocation();
+ PasteOpLoc = Tokens[CurToken].getLocation();
++CurToken;
assert(!isAtEnd() && "No token on the RHS of a paste operator!");
@@ -484,12 +570,12 @@ bool TokenLexer::PasteTokens(Token &Tok) {
// Do not emit the error when preprocessing assembler code.
if (!PP.getLangOptions().AsmPreprocessor) {
- // Explicitly convert the token location to have proper instantiation
+ // Explicitly convert the token location to have proper expansion
// information so that the user knows where it came from.
SourceManager &SM = PP.getSourceManager();
SourceLocation Loc =
- SM.createInstantiationLoc(PasteOpLoc, InstantiateLocStart,
- InstantiateLocEnd, 2);
+ SM.createInstantiationLoc(PasteOpLoc, ExpandLocStart,
+ ExpandLocEnd, 2);
// If we're in microsoft extensions mode, downgrade this from a hard
// error to a warning that defaults to an error. This allows
// disabling it.
@@ -512,12 +598,30 @@ bool TokenLexer::PasteTokens(Token &Tok) {
// Transfer properties of the LHS over the the Result.
Result.setFlagValue(Token::StartOfLine , Tok.isAtStartOfLine());
Result.setFlagValue(Token::LeadingSpace, Tok.hasLeadingSpace());
-
+
// Finally, replace LHS with the result, consume the RHS, and iterate.
++CurToken;
Tok = Result;
} while (!isAtEnd() && Tokens[CurToken].is(tok::hashhash));
+ // The token's current location indicate where the token was lexed from. We
+ // need this information to compute the spelling of the token, but any
+ // diagnostics for the expanded token should appear as if the token was
+ // expanded from the (##) operator. Pull this information together into
+ // a new SourceLocation that captures all of this.
+ if (ExpandLocStart.isValid()) {
+ SourceManager &SM = PP.getSourceManager();
+ SourceLocation pasteLocInst =
+ getMacroExpansionLocation(PasteOpLoc);
+ assert(pasteLocInst.isValid() &&
+ "Expected '##' to come from definition");
+
+ Tok.setLocation(SM.createInstantiationLoc(Tok.getLocation(),
+ pasteLocInst,
+ pasteLocInst,
+ Tok.getLength()));
+ }
+
// Now that we got the result token, it will be subject to expansion. Since
// token pasting re-lexes the result token in raw mode, identifier information
// isn't looked up. As such, if the result is an identifier, look up id info.
@@ -548,7 +652,7 @@ bool TokenLexer::isParsingPreprocessorDirective() const {
/// HandleMicrosoftCommentPaste - In microsoft compatibility mode, /##/ pastes
/// together to form a comment that comments out everything in the current
/// macro, other active macros, and anything left on the current physical
-/// source line of the instantiated buffer. Handle this by returning the
+/// source line of the expanded buffer. Handle this by returning the
/// first token on the next line.
void TokenLexer::HandleMicrosoftCommentPaste(Token &Tok) {
// We 'comment out' the rest of this macro by just ignoring the rest of the
@@ -561,3 +665,23 @@ void TokenLexer::HandleMicrosoftCommentPaste(Token &Tok) {
PP.HandleMicrosoftCommentPaste(Tok);
}
+
+/// \brief If \arg loc is a FileID and points inside the current macro
+/// definition, returns the appropriate source location pointing at the
+/// macro expansion source location entry.
+SourceLocation TokenLexer::getMacroExpansionLocation(SourceLocation loc) const {
+ assert(ExpandLocStart.isValid() && MacroExpansionStart.isValid() &&
+ "Not appropriate for token streams");
+ assert(loc.isValid());
+
+ SourceManager &SM = PP.getSourceManager();
+ unsigned relativeOffset;
+ if (loc.isFileID() &&
+ SM.isInFileID(loc,
+ MacroDefStartInfo.first, MacroDefStartInfo.second,
+ Macro->getDefinitionLength(SM), &relativeOffset)) {
+ return MacroExpansionStart.getFileLocWithOffset(relativeOffset);
+ }
+
+ return SourceLocation();
+}
diff --git a/contrib/llvm/tools/clang/lib/Parse/ParseAST.cpp b/contrib/llvm/tools/clang/lib/Parse/ParseAST.cpp
index 21917b2..56584c9 100644
--- a/contrib/llvm/tools/clang/lib/Parse/ParseAST.cpp
+++ b/contrib/llvm/tools/clang/lib/Parse/ParseAST.cpp
@@ -57,6 +57,10 @@ void clang::ParseAST(Sema &S, bool PrintStats) {
Stmt::CollectingStats(true);
}
+ // Also turn on collection of stats inside of the Sema object.
+ bool OldCollectStats = PrintStats;
+ std::swap(OldCollectStats, S.CollectStats);
+
ASTConsumer *Consumer = &S.getASTConsumer();
llvm::OwningPtr<Parser> ParseOP(new Parser(S.getPreprocessor(), S));
@@ -95,9 +99,10 @@ void clang::ParseAST(Sema &S, bool PrintStats) {
Consumer->HandleTopLevelDecl(DeclGroupRef(*I));
Consumer->HandleTranslationUnit(S.getASTContext());
-
+
+ std::swap(OldCollectStats, S.CollectStats);
if (PrintStats) {
- fprintf(stderr, "\nSTATISTICS:\n");
+ llvm::errs() << "\nSTATISTICS:\n";
P.getActions().PrintStats();
S.getASTContext().PrintStats();
Decl::PrintStats();
diff --git a/contrib/llvm/tools/clang/lib/Parse/ParseDecl.cpp b/contrib/llvm/tools/clang/lib/Parse/ParseDecl.cpp
index ad3fcfe..0e17295 100644
--- a/contrib/llvm/tools/clang/lib/Parse/ParseDecl.cpp
+++ b/contrib/llvm/tools/clang/lib/Parse/ParseDecl.cpp
@@ -31,10 +31,16 @@ using namespace clang;
///
/// Called type-id in C++.
TypeResult Parser::ParseTypeName(SourceRange *Range,
- Declarator::TheContext Context) {
+ Declarator::TheContext Context,
+ ObjCDeclSpec *objcQuals,
+ AccessSpecifier AS,
+ Decl **OwnedType) {
// Parse the common declaration-specifiers piece.
DeclSpec DS(AttrFactory);
- ParseSpecifierQualifierList(DS);
+ DS.setObjCQualifiers(objcQuals);
+ ParseSpecifierQualifierList(DS, AS);
+ if (OwnedType)
+ *OwnedType = DS.isTypeSpecOwned() ? DS.getRepAsDecl() : 0;
// Parse the abstract-declarator, if present.
Declarator DeclaratorInfo(DS, Context);
@@ -672,6 +678,7 @@ Parser::DeclGroupPtrTy Parser::ParseDeclaration(StmtVector &Stmts,
ParenBraceBracketBalancer BalancerRAIIObj(*this);
Decl *SingleDecl = 0;
+ Decl *OwnedType = 0;
switch (Tok.getKind()) {
case tok::kw_template:
case tok::kw_export:
@@ -694,7 +701,7 @@ Parser::DeclGroupPtrTy Parser::ParseDeclaration(StmtVector &Stmts,
break;
case tok::kw_using:
SingleDecl = ParseUsingDirectiveOrDeclaration(Context, ParsedTemplateInfo(),
- DeclEnd, attrs);
+ DeclEnd, attrs, &OwnedType);
break;
case tok::kw_static_assert:
case tok::kw__Static_assert:
@@ -706,8 +713,9 @@ Parser::DeclGroupPtrTy Parser::ParseDeclaration(StmtVector &Stmts,
}
// This routine returns a DeclGroup, if the thing we parsed only contains a
- // single decl, convert it now.
- return Actions.ConvertDeclToDeclGroup(SingleDecl);
+ // single decl, convert it now. Alias declarations can also declare a type;
+ // include that too if it is present.
+ return Actions.ConvertDeclToDeclGroup(SingleDecl, OwnedType);
}
/// simple-declaration: [C99 6.7: declaration] [C++ 7p1: dcl.dcl]
@@ -1079,10 +1087,10 @@ Decl *Parser::ParseDeclarationAfterDeclaratorAndAttributes(Declarator &D,
/// type-qualifier specifier-qualifier-list[opt]
/// [GNU] attributes specifier-qualifier-list[opt]
///
-void Parser::ParseSpecifierQualifierList(DeclSpec &DS) {
+void Parser::ParseSpecifierQualifierList(DeclSpec &DS, AccessSpecifier AS) {
/// specifier-qualifier-list is a subset of declaration-specifiers. Just
/// parse declaration-specifiers and complain about extra stuff.
- ParseDeclarationSpecifiers(DS);
+ ParseDeclarationSpecifiers(DS, ParsedTemplateInfo(), AS);
// Validate declspec for type-name.
unsigned Specs = DS.getParsedSpecifiers();
@@ -1394,8 +1402,7 @@ void Parser::ParseDeclarationSpecifiers(DeclSpec &DS,
// Thus, if the template-name is actually the constructor
// name, then the code is ill-formed; this interpretation is
// reinforced by the NAD status of core issue 635.
- TemplateIdAnnotation *TemplateId
- = static_cast<TemplateIdAnnotation *>(Next.getAnnotationValue());
+ TemplateIdAnnotation *TemplateId = takeTemplateIdAnnotation(Next);
if ((DSContext == DSC_top_level ||
(DSContext == DSC_class && DS.isFriendSpecified())) &&
TemplateId->Name &&
@@ -1597,8 +1604,7 @@ void Parser::ParseDeclarationSpecifiers(DeclSpec &DS,
// type-name
case tok::annot_template_id: {
- TemplateIdAnnotation *TemplateId
- = static_cast<TemplateIdAnnotation *>(Tok.getAnnotationValue());
+ TemplateIdAnnotation *TemplateId = takeTemplateIdAnnotation(Tok);
if (TemplateId->Kind != TNK_Type_template) {
// This template-id does not refer to a type name, so we're
// done with the type-specifiers.
@@ -2444,13 +2450,29 @@ void Parser::ParseEnumSpecifier(SourceLocation StartLoc, DeclSpec &DS,
Actions.CodeCompleteTag(getCurScope(), DeclSpec::TST_enum);
ConsumeCodeCompletionToken();
}
+
+ bool IsScopedEnum = false;
+ bool IsScopedUsingClassTag = false;
+
+ if (getLang().CPlusPlus0x &&
+ (Tok.is(tok::kw_class) || Tok.is(tok::kw_struct))) {
+ IsScopedEnum = true;
+ IsScopedUsingClassTag = Tok.is(tok::kw_class);
+ ConsumeToken();
+ }
// If attributes exist after tag, parse them.
ParsedAttributes attrs(AttrFactory);
MaybeParseGNUAttributes(attrs);
+ bool AllowFixedUnderlyingType = getLang().CPlusPlus0x || getLang().Microsoft;
+
CXXScopeSpec &SS = DS.getTypeSpecScope();
if (getLang().CPlusPlus) {
+ // "enum foo : bar;" is not a potential typo for "enum foo::bar;"
+ // if a fixed underlying type is allowed.
+ ColonProtectionRAIIObject X(*this, AllowFixedUnderlyingType);
+
if (ParseOptionalCXXScopeSpecifier(SS, ParsedType(), false))
return;
@@ -2465,17 +2487,6 @@ void Parser::ParseEnumSpecifier(SourceLocation StartLoc, DeclSpec &DS,
}
}
- bool AllowFixedUnderlyingType = getLang().CPlusPlus0x || getLang().Microsoft;
- bool IsScopedEnum = false;
- bool IsScopedUsingClassTag = false;
-
- if (getLang().CPlusPlus0x &&
- (Tok.is(tok::kw_class) || Tok.is(tok::kw_struct))) {
- IsScopedEnum = true;
- IsScopedUsingClassTag = Tok.is(tok::kw_class);
- ConsumeToken();
- }
-
// Must have either 'enum name' or 'enum {...}'.
if (Tok.isNot(tok::identifier) && Tok.isNot(tok::l_brace) &&
(AllowFixedUnderlyingType && Tok.isNot(tok::colon))) {
@@ -3016,6 +3027,10 @@ bool Parser::isDeclarationSpecifier(bool DisambiguatingWithExpression) {
case tok::kw___attribute:
return true;
+ // C++0x decltype.
+ case tok::kw_decltype:
+ return true;
+
// GNU ObjC bizarre protocol extension: <proto1,proto2> with implicit 'id'.
case tok::less:
return getLang().ObjC1;
@@ -3639,33 +3654,15 @@ void Parser::ParseParenDeclarator(Declarator &D) {
/// declarator D up to a paren, which indicates that we are parsing function
/// arguments.
///
-/// If AttrList is non-null, then the caller parsed those arguments immediately
+/// If attrs is non-null, then the caller parsed those arguments immediately
/// after the open paren - they should be considered to be the first argument of
/// a parameter. If RequiresArg is true, then the first argument of the
/// function is required to be present and required to not be an identifier
/// list.
///
-/// This method also handles this portion of the grammar:
-/// parameter-type-list: [C99 6.7.5]
-/// parameter-list
-/// parameter-list ',' '...'
-/// [C++] parameter-list '...'
-///
-/// parameter-list: [C99 6.7.5]
-/// parameter-declaration
-/// parameter-list ',' parameter-declaration
-///
-/// parameter-declaration: [C99 6.7.5]
-/// declaration-specifiers declarator
-/// [C++] declaration-specifiers declarator '=' assignment-expression
-/// [GNU] declaration-specifiers declarator attributes
-/// declaration-specifiers abstract-declarator[opt]
-/// [C++] declaration-specifiers abstract-declarator[opt]
-/// '=' assignment-expression
-/// [GNU] declaration-specifiers abstract-declarator[opt] attributes
-///
-/// For C++, after the parameter-list, it also parses "cv-qualifier-seq[opt]",
-/// C++0x "ref-qualifier[opt]" and "exception-specification[opt]".
+/// For C++, after the parameter-list, it also parses cv-qualifier-seq[opt],
+/// (C++0x) ref-qualifier[opt], exception-specification[opt], and
+/// (C++0x) trailing-return-type[opt].
///
/// [C++0x] exception-specification:
/// dynamic-exception-specification
@@ -3677,36 +3674,62 @@ void Parser::ParseFunctionDeclarator(SourceLocation LParenLoc, Declarator &D,
// lparen is already consumed!
assert(D.isPastIdentifier() && "Should not call before identifier!");
+ // This should be true when the function has typed arguments.
+ // Otherwise, it is treated as a K&R-style function.
+ bool HasProto = false;
+ // Build up an array of information about the parsed arguments.
+ llvm::SmallVector<DeclaratorChunk::ParamInfo, 16> ParamInfo;
+ // Remember where we see an ellipsis, if any.
+ SourceLocation EllipsisLoc;
+
+ DeclSpec DS(AttrFactory);
+ bool RefQualifierIsLValueRef = true;
+ SourceLocation RefQualifierLoc;
+ ExceptionSpecificationType ESpecType = EST_None;
+ SourceRange ESpecRange;
+ llvm::SmallVector<ParsedType, 2> DynamicExceptions;
+ llvm::SmallVector<SourceRange, 2> DynamicExceptionRanges;
+ ExprResult NoexceptExpr;
ParsedType TrailingReturnType;
+
+ SourceLocation EndLoc;
- // This parameter list may be empty.
- if (Tok.is(tok::r_paren)) {
+ if (isFunctionDeclaratorIdentifierList()) {
if (RequiresArg)
Diag(Tok, diag::err_argument_required_after_attribute);
- SourceLocation EndLoc = ConsumeParen(); // Eat the closing ')'.
+ ParseFunctionDeclaratorIdentifierList(D, ParamInfo);
+
+ EndLoc = MatchRHSPunctuation(tok::r_paren, LParenLoc);
+ } else {
+ // Enter function-declaration scope, limiting any declarators to the
+ // function prototype scope, including parameter declarators.
+ ParseScope PrototypeScope(this,
+ Scope::FunctionPrototypeScope|Scope::DeclScope);
+
+ if (Tok.isNot(tok::r_paren))
+ ParseParameterDeclarationClause(D, attrs, ParamInfo, EllipsisLoc);
+ else if (RequiresArg)
+ Diag(Tok, diag::err_argument_required_after_attribute);
+
+ HasProto = ParamInfo.size() || getLang().CPlusPlus;
+
+ // If we have the closing ')', eat it.
+ EndLoc = MatchRHSPunctuation(tok::r_paren, LParenLoc);
- // cv-qualifier-seq[opt].
- DeclSpec DS(AttrFactory);
- SourceLocation RefQualifierLoc;
- bool RefQualifierIsLValueRef = true;
- ExceptionSpecificationType ESpecType = EST_None;
- SourceRange ESpecRange;
- llvm::SmallVector<ParsedType, 2> DynamicExceptions;
- llvm::SmallVector<SourceRange, 2> DynamicExceptionRanges;
- ExprResult NoexceptExpr;
if (getLang().CPlusPlus) {
MaybeParseCXX0XAttributes(attrs);
+ // Parse cv-qualifier-seq[opt].
ParseTypeQualifierListOpt(DS, false /*no attributes*/);
- if (!DS.getSourceRange().getEnd().isInvalid())
- EndLoc = DS.getSourceRange().getEnd();
+ if (!DS.getSourceRange().getEnd().isInvalid())
+ EndLoc = DS.getSourceRange().getEnd();
- // Parse ref-qualifier[opt]
+ // Parse ref-qualifier[opt].
if (Tok.is(tok::amp) || Tok.is(tok::ampamp)) {
if (!getLang().CPlusPlus0x)
Diag(Tok, diag::ext_ref_qualifier);
-
+
RefQualifierIsLValueRef = Tok.is(tok::amp);
RefQualifierLoc = ConsumeToken();
EndLoc = RefQualifierLoc;
@@ -3720,87 +3743,158 @@ void Parser::ParseFunctionDeclarator(SourceLocation LParenLoc, Declarator &D,
if (ESpecType != EST_None)
EndLoc = ESpecRange.getEnd();
- // Parse trailing-return-type.
+ // Parse trailing-return-type[opt].
if (getLang().CPlusPlus0x && Tok.is(tok::arrow)) {
TrailingReturnType = ParseTrailingReturnType().get();
}
}
- // Remember that we parsed a function type, and remember the attributes.
- // int() -> no prototype, no '...'.
- D.AddTypeInfo(DeclaratorChunk::getFunction(/*prototype*/getLang().CPlusPlus,
- /*variadic*/ false,
- SourceLocation(),
- /*arglist*/ 0, 0,
- DS.getTypeQualifiers(),
- RefQualifierIsLValueRef,
- RefQualifierLoc,
- ESpecType, ESpecRange.getBegin(),
- DynamicExceptions.data(),
- DynamicExceptionRanges.data(),
- DynamicExceptions.size(),
- NoexceptExpr.isUsable() ?
- NoexceptExpr.get() : 0,
- LParenLoc, EndLoc, D,
- TrailingReturnType),
- attrs, EndLoc);
- return;
+ // Leave prototype scope.
+ PrototypeScope.Exit();
}
- // Alternatively, this parameter list may be an identifier list form for a
- // K&R-style function: void foo(a,b,c)
- if (!getLang().CPlusPlus && Tok.is(tok::identifier)
- && !TryAltiVecVectorToken()) {
- if (TryAnnotateTypeOrScopeToken() || !Tok.is(tok::annot_typename)) {
- // K&R identifier lists can't have typedefs as identifiers, per
- // C99 6.7.5.3p11.
- if (RequiresArg)
- Diag(Tok, diag::err_argument_required_after_attribute);
-
- // Identifier list. Note that '(' identifier-list ')' is only allowed for
- // normal declarators, not for abstract-declarators. Get the first
- // identifier.
- Token FirstTok = Tok;
- ConsumeToken(); // eat the first identifier.
-
- // Identifier lists follow a really simple grammar: the identifiers can
- // be followed *only* by a ", moreidentifiers" or ")". However, K&R
- // identifier lists are really rare in the brave new modern world, and it
- // is very common for someone to typo a type in a non-k&r style list. If
- // we are presented with something like: "void foo(intptr x, float y)",
- // we don't want to start parsing the function declarator as though it is
- // a K&R style declarator just because intptr is an invalid type.
- //
- // To handle this, we check to see if the token after the first identifier
- // is a "," or ")". Only if so, do we parse it as an identifier list.
- if (Tok.is(tok::comma) || Tok.is(tok::r_paren))
- return ParseFunctionDeclaratorIdentifierList(LParenLoc,
- FirstTok.getIdentifierInfo(),
- FirstTok.getLocation(), D);
-
- // If we get here, the code is invalid. Push the first identifier back
- // into the token stream and parse the first argument as an (invalid)
- // normal argument declarator.
- PP.EnterToken(Tok);
- Tok = FirstTok;
+ // Remember that we parsed a function type, and remember the attributes.
+ D.AddTypeInfo(DeclaratorChunk::getFunction(HasProto,
+ /*isVariadic=*/EllipsisLoc.isValid(),
+ EllipsisLoc,
+ ParamInfo.data(), ParamInfo.size(),
+ DS.getTypeQualifiers(),
+ RefQualifierIsLValueRef,
+ RefQualifierLoc,
+ /*MutableLoc=*/SourceLocation(),
+ ESpecType, ESpecRange.getBegin(),
+ DynamicExceptions.data(),
+ DynamicExceptionRanges.data(),
+ DynamicExceptions.size(),
+ NoexceptExpr.isUsable() ?
+ NoexceptExpr.get() : 0,
+ LParenLoc, EndLoc, D,
+ TrailingReturnType),
+ attrs, EndLoc);
+}
+
+/// isFunctionDeclaratorIdentifierList - This parameter list may have an
+/// identifier list form for a K&R-style function: void foo(a,b,c)
+///
+/// Note that identifier-lists are only allowed for normal declarators, not for
+/// abstract-declarators.
+bool Parser::isFunctionDeclaratorIdentifierList() {
+ return !getLang().CPlusPlus
+ && Tok.is(tok::identifier)
+ && !TryAltiVecVectorToken()
+ // K&R identifier lists can't have typedefs as identifiers, per C99
+ // 6.7.5.3p11.
+ && (TryAnnotateTypeOrScopeToken() || !Tok.is(tok::annot_typename))
+ // Identifier lists follow a really simple grammar: the identifiers can
+ // be followed *only* by a ", identifier" or ")". However, K&R
+ // identifier lists are really rare in the brave new modern world, and
+ // it is very common for someone to typo a type in a non-K&R style
+ // list. If we are presented with something like: "void foo(intptr x,
+ // float y)", we don't want to start parsing the function declarator as
+ // though it is a K&R style declarator just because intptr is an
+ // invalid type.
+ //
+ // To handle this, we check to see if the token after the first
+ // identifier is a "," or ")". Only then do we parse it as an
+ // identifier list.
+ && (NextToken().is(tok::comma) || NextToken().is(tok::r_paren));
+}
+
+/// ParseFunctionDeclaratorIdentifierList - While parsing a function declarator
+/// we found a K&R-style identifier list instead of a typed parameter list.
+///
+/// After returning, ParamInfo will hold the parsed parameters.
+///
+/// identifier-list: [C99 6.7.5]
+/// identifier
+/// identifier-list ',' identifier
+///
+void Parser::ParseFunctionDeclaratorIdentifierList(
+ Declarator &D,
+ llvm::SmallVector<DeclaratorChunk::ParamInfo, 16> &ParamInfo) {
+ // If there was no identifier specified for the declarator, either we are in
+ // an abstract-declarator, or we are in a parameter declarator which was found
+ // to be abstract. In abstract-declarators, identifier lists are not valid:
+ // diagnose this.
+ if (!D.getIdentifier())
+ Diag(Tok, diag::ext_ident_list_in_param);
+
+ // Maintain an efficient lookup of params we have seen so far.
+ llvm::SmallSet<const IdentifierInfo*, 16> ParamsSoFar;
+
+ while (1) {
+ // If this isn't an identifier, report the error and skip until ')'.
+ if (Tok.isNot(tok::identifier)) {
+ Diag(Tok, diag::err_expected_ident);
+ SkipUntil(tok::r_paren, /*StopAtSemi=*/true, /*DontConsume=*/true);
+ // Forget we parsed anything.
+ ParamInfo.clear();
+ return;
}
- }
- // Finally, a normal, non-empty parameter type list.
+ IdentifierInfo *ParmII = Tok.getIdentifierInfo();
- // Build up an array of information about the parsed arguments.
- llvm::SmallVector<DeclaratorChunk::ParamInfo, 16> ParamInfo;
+ // Reject 'typedef int y; int test(x, y)', but continue parsing.
+ if (Actions.getTypeName(*ParmII, Tok.getLocation(), getCurScope()))
+ Diag(Tok, diag::err_unexpected_typedef_ident) << ParmII;
+
+ // Verify that the argument identifier has not already been mentioned.
+ if (!ParamsSoFar.insert(ParmII)) {
+ Diag(Tok, diag::err_param_redefinition) << ParmII;
+ } else {
+ // Remember this identifier in ParamInfo.
+ ParamInfo.push_back(DeclaratorChunk::ParamInfo(ParmII,
+ Tok.getLocation(),
+ 0));
+ }
+
+ // Eat the identifier.
+ ConsumeToken();
- // Enter function-declaration scope, limiting any declarators to the
- // function prototype scope, including parameter declarators.
- ParseScope PrototypeScope(this,
- Scope::FunctionPrototypeScope|Scope::DeclScope);
+ // The list continues if we see a comma.
+ if (Tok.isNot(tok::comma))
+ break;
+ ConsumeToken();
+ }
+}
+
+/// ParseParameterDeclarationClause - Parse a (possibly empty) parameter-list
+/// after the opening parenthesis. This function will not parse a K&R-style
+/// identifier list.
+///
+/// D is the declarator being parsed. If attrs is non-null, then the caller
+/// parsed those arguments immediately after the open paren - they should be
+/// considered to be the first argument of a parameter.
+///
+/// After returning, ParamInfo will hold the parsed parameters. EllipsisLoc will
+/// be the location of the ellipsis, if any was parsed.
+///
+/// parameter-type-list: [C99 6.7.5]
+/// parameter-list
+/// parameter-list ',' '...'
+/// [C++] parameter-list '...'
+///
+/// parameter-list: [C99 6.7.5]
+/// parameter-declaration
+/// parameter-list ',' parameter-declaration
+///
+/// parameter-declaration: [C99 6.7.5]
+/// declaration-specifiers declarator
+/// [C++] declaration-specifiers declarator '=' assignment-expression
+/// [GNU] declaration-specifiers declarator attributes
+/// declaration-specifiers abstract-declarator[opt]
+/// [C++] declaration-specifiers abstract-declarator[opt]
+/// '=' assignment-expression
+/// [GNU] declaration-specifiers abstract-declarator[opt] attributes
+///
+void Parser::ParseParameterDeclarationClause(
+ Declarator &D,
+ ParsedAttributes &attrs,
+ llvm::SmallVector<DeclaratorChunk::ParamInfo, 16> &ParamInfo,
+ SourceLocation &EllipsisLoc) {
- bool IsVariadic = false;
- SourceLocation EllipsisLoc;
while (1) {
if (Tok.is(tok::ellipsis)) {
- IsVariadic = true;
EllipsisLoc = ConsumeToken(); // Consume the ellipsis.
break;
}
@@ -3817,6 +3911,11 @@ void Parser::ParseFunctionDeclarator(SourceLocation LParenLoc, Declarator &D,
// If the caller parsed attributes for the first argument, add them now.
// Take them so that we only apply the attributes to the first parameter.
+ // FIXME: If we saw an ellipsis first, this code is not reached. Are the
+ // attributes lost? Should they even be allowed?
+ // FIXME: If we can leave the attributes in the token stream somehow, we can
+ // get rid of a parameter (attrs) and this statement. It might be too much
+ // hassle.
DS.takeAttributesFrom(attrs);
ParseDeclarationSpecifiers(DS);
@@ -3912,7 +4011,6 @@ void Parser::ParseFunctionDeclarator(SourceLocation LParenLoc, Declarator &D,
// If the next token is a comma, consume it and keep reading arguments.
if (Tok.isNot(tok::comma)) {
if (Tok.is(tok::ellipsis)) {
- IsVariadic = true;
EllipsisLoc = ConsumeToken(); // Consume the ellipsis.
if (!getLang().CPlusPlus) {
@@ -3930,150 +4028,6 @@ void Parser::ParseFunctionDeclarator(SourceLocation LParenLoc, Declarator &D,
ConsumeToken();
}
- // If we have the closing ')', eat it.
- SourceLocation EndLoc = MatchRHSPunctuation(tok::r_paren, LParenLoc);
-
- DeclSpec DS(AttrFactory);
- SourceLocation RefQualifierLoc;
- bool RefQualifierIsLValueRef = true;
- ExceptionSpecificationType ESpecType = EST_None;
- SourceRange ESpecRange;
- llvm::SmallVector<ParsedType, 2> DynamicExceptions;
- llvm::SmallVector<SourceRange, 2> DynamicExceptionRanges;
- ExprResult NoexceptExpr;
-
- if (getLang().CPlusPlus) {
- MaybeParseCXX0XAttributes(attrs);
-
- // Parse cv-qualifier-seq[opt].
- ParseTypeQualifierListOpt(DS, false /*no attributes*/);
- if (!DS.getSourceRange().getEnd().isInvalid())
- EndLoc = DS.getSourceRange().getEnd();
-
- // Parse ref-qualifier[opt]
- if (Tok.is(tok::amp) || Tok.is(tok::ampamp)) {
- if (!getLang().CPlusPlus0x)
- Diag(Tok, diag::ext_ref_qualifier);
-
- RefQualifierIsLValueRef = Tok.is(tok::amp);
- RefQualifierLoc = ConsumeToken();
- EndLoc = RefQualifierLoc;
- }
-
- // FIXME: We should leave the prototype scope before parsing the exception
- // specification, and then reenter it when parsing the trailing return type.
- // FIXMEFIXME: Why? That wouldn't be right for the noexcept clause.
-
- // Parse exception-specification[opt].
- ESpecType = MaybeParseExceptionSpecification(ESpecRange,
- DynamicExceptions,
- DynamicExceptionRanges,
- NoexceptExpr);
- if (ESpecType != EST_None)
- EndLoc = ESpecRange.getEnd();
-
- // Parse trailing-return-type.
- if (getLang().CPlusPlus0x && Tok.is(tok::arrow)) {
- TrailingReturnType = ParseTrailingReturnType().get();
- }
- }
-
- // Leave prototype scope.
- PrototypeScope.Exit();
-
- // Remember that we parsed a function type, and remember the attributes.
- D.AddTypeInfo(DeclaratorChunk::getFunction(/*proto*/true, IsVariadic,
- EllipsisLoc,
- ParamInfo.data(), ParamInfo.size(),
- DS.getTypeQualifiers(),
- RefQualifierIsLValueRef,
- RefQualifierLoc,
- ESpecType, ESpecRange.getBegin(),
- DynamicExceptions.data(),
- DynamicExceptionRanges.data(),
- DynamicExceptions.size(),
- NoexceptExpr.isUsable() ?
- NoexceptExpr.get() : 0,
- LParenLoc, EndLoc, D,
- TrailingReturnType),
- attrs, EndLoc);
-}
-
-/// ParseFunctionDeclaratorIdentifierList - While parsing a function declarator
-/// we found a K&R-style identifier list instead of a type argument list. The
-/// first identifier has already been consumed, and the current token is the
-/// token right after it.
-///
-/// identifier-list: [C99 6.7.5]
-/// identifier
-/// identifier-list ',' identifier
-///
-void Parser::ParseFunctionDeclaratorIdentifierList(SourceLocation LParenLoc,
- IdentifierInfo *FirstIdent,
- SourceLocation FirstIdentLoc,
- Declarator &D) {
- // Build up an array of information about the parsed arguments.
- llvm::SmallVector<DeclaratorChunk::ParamInfo, 16> ParamInfo;
- llvm::SmallSet<const IdentifierInfo*, 16> ParamsSoFar;
-
- // If there was no identifier specified for the declarator, either we are in
- // an abstract-declarator, or we are in a parameter declarator which was found
- // to be abstract. In abstract-declarators, identifier lists are not valid:
- // diagnose this.
- if (!D.getIdentifier())
- Diag(FirstIdentLoc, diag::ext_ident_list_in_param);
-
- // The first identifier was already read, and is known to be the first
- // identifier in the list. Remember this identifier in ParamInfo.
- ParamsSoFar.insert(FirstIdent);
- ParamInfo.push_back(DeclaratorChunk::ParamInfo(FirstIdent, FirstIdentLoc, 0));
-
- while (Tok.is(tok::comma)) {
- // Eat the comma.
- ConsumeToken();
-
- // If this isn't an identifier, report the error and skip until ')'.
- if (Tok.isNot(tok::identifier)) {
- Diag(Tok, diag::err_expected_ident);
- SkipUntil(tok::r_paren);
- return;
- }
-
- IdentifierInfo *ParmII = Tok.getIdentifierInfo();
-
- // Reject 'typedef int y; int test(x, y)', but continue parsing.
- if (Actions.getTypeName(*ParmII, Tok.getLocation(), getCurScope()))
- Diag(Tok, diag::err_unexpected_typedef_ident) << ParmII;
-
- // Verify that the argument identifier has not already been mentioned.
- if (!ParamsSoFar.insert(ParmII)) {
- Diag(Tok, diag::err_param_redefinition) << ParmII;
- } else {
- // Remember this identifier in ParamInfo.
- ParamInfo.push_back(DeclaratorChunk::ParamInfo(ParmII,
- Tok.getLocation(),
- 0));
- }
-
- // Eat the identifier.
- ConsumeToken();
- }
-
- // If we have the closing ')', eat it and we're done.
- SourceLocation RLoc = MatchRHSPunctuation(tok::r_paren, LParenLoc);
-
- // Remember that we parsed a function type, and remember the attributes. This
- // function type is always a K&R style function type, which is not varargs and
- // has no prototype.
- ParsedAttributes attrs(AttrFactory);
- D.AddTypeInfo(DeclaratorChunk::getFunction(/*proto*/false, /*varargs*/false,
- SourceLocation(),
- &ParamInfo[0], ParamInfo.size(),
- /*TypeQuals*/0,
- true, SourceLocation(),
- EST_None, SourceLocation(), 0, 0,
- 0, 0, LParenLoc, RLoc, D),
- attrs, RLoc);
}
/// [C90] direct-declarator '[' constant-expression[opt] ']'
diff --git a/contrib/llvm/tools/clang/lib/Parse/ParseDeclCXX.cpp b/contrib/llvm/tools/clang/lib/Parse/ParseDeclCXX.cpp
index 51aa010..172049c 100644
--- a/contrib/llvm/tools/clang/lib/Parse/ParseDeclCXX.cpp
+++ b/contrib/llvm/tools/clang/lib/Parse/ParseDeclCXX.cpp
@@ -314,7 +314,8 @@ Decl *Parser::ParseLinkage(ParsingDeclSpec &DS, unsigned Context) {
Decl *Parser::ParseUsingDirectiveOrDeclaration(unsigned Context,
const ParsedTemplateInfo &TemplateInfo,
SourceLocation &DeclEnd,
- ParsedAttributesWithRange &attrs) {
+ ParsedAttributesWithRange &attrs,
+ Decl **OwnedType) {
assert(Tok.is(tok::kw_using) && "Not using token");
// Eat 'using'.
@@ -342,7 +343,8 @@ Decl *Parser::ParseUsingDirectiveOrDeclaration(unsigned Context,
// Using declarations can't have attributes.
ProhibitAttributes(attrs);
- return ParseUsingDeclaration(Context, TemplateInfo, UsingLoc, DeclEnd);
+ return ParseUsingDeclaration(Context, TemplateInfo, UsingLoc, DeclEnd,
+ AS_none, OwnedType);
}
/// ParseUsingDirective - Parse C++ using-directive, assumes
@@ -422,7 +424,8 @@ Decl *Parser::ParseUsingDeclaration(unsigned Context,
const ParsedTemplateInfo &TemplateInfo,
SourceLocation UsingLoc,
SourceLocation &DeclEnd,
- AccessSpecifier AS) {
+ AccessSpecifier AS,
+ Decl **OwnedType) {
CXXScopeSpec SS;
SourceLocation TypenameLoc;
bool IsTypeName;
@@ -511,7 +514,7 @@ Decl *Parser::ParseUsingDeclaration(unsigned Context,
TypeAlias = ParseTypeName(0, TemplateInfo.Kind ?
Declarator::AliasTemplateContext :
- Declarator::AliasDeclContext);
+ Declarator::AliasDeclContext, 0, AS, OwnedType);
} else
// Parse (optional) attributes (most likely GNU strong-using extension).
MaybeParseGNUAttributes(attrs);
@@ -701,8 +704,7 @@ Parser::TypeResult Parser::ParseClassName(SourceLocation &EndLocation,
CXXScopeSpec &SS) {
// Check whether we have a template-id that names a type.
if (Tok.is(tok::annot_template_id)) {
- TemplateIdAnnotation *TemplateId
- = static_cast<TemplateIdAnnotation *>(Tok.getAnnotationValue());
+ TemplateIdAnnotation *TemplateId = takeTemplateIdAnnotation(Tok);
if (TemplateId->Kind == TNK_Type_template ||
TemplateId->Kind == TNK_Dependent_template_name) {
AnnotateTemplateIdTokenAsType();
@@ -976,7 +978,7 @@ void Parser::ParseClassSpecifier(tok::TokenKind TagTokKind,
}
}
} else if (Tok.is(tok::annot_template_id)) {
- TemplateId = static_cast<TemplateIdAnnotation *>(Tok.getAnnotationValue());
+ TemplateId = takeTemplateIdAnnotation(Tok);
NameLoc = ConsumeToken();
if (TemplateId->Kind != TNK_Type_template &&
@@ -993,7 +995,6 @@ void Parser::ParseClassSpecifier(tok::TokenKind TagTokKind,
DS.SetTypeSpecError();
SkipUntil(tok::semi, false, true);
- TemplateId->Destroy();
if (SuppressingAccessChecks)
Actions.ActOnStopSuppressingAccessChecks();
@@ -1051,9 +1052,6 @@ void Parser::ParseClassSpecifier(tok::TokenKind TagTokKind,
}
SkipUntil(tok::comma, true);
-
- if (TemplateId)
- TemplateId->Destroy();
return;
}
@@ -1149,7 +1147,6 @@ void Parser::ParseClassSpecifier(tok::TokenKind TagTokKind,
TemplateParams? &(*TemplateParams)[0] : 0,
TemplateParams? TemplateParams->size() : 0));
}
- TemplateId->Destroy();
} else if (TemplateInfo.Kind == ParsedTemplateInfo::ExplicitInstantiation &&
TUK == Sema::TUK_Declaration) {
// Explicit instantiation of a member of a class template
@@ -1294,6 +1291,11 @@ void Parser::ParseClassSpecifier(tok::TokenKind TagTokKind,
break;
}
+ // C++ [temp]p3 In a template-declaration which defines a class, no
+ // declarator is permitted.
+ if (TemplateInfo.Kind)
+ ExpectedSemi = true;
+
if (ExpectedSemi) {
ExpectAndConsume(tok::semi, diag::err_expected_semi_after_tagdecl,
TagType == DeclSpec::TST_class ? "class"
@@ -1828,14 +1830,16 @@ void Parser::ParseCXXClassMemberDeclaration(AccessSpecifier AS,
Diag(Tok, diag::err_bitfield_member_init);
SkipUntil(tok::comma, true, true);
} else {
- HasDeferredInitializer = !DeclaratorInfo.isFunctionDeclarator() &&
+ HasDeferredInitializer = !DeclaratorInfo.isDeclarationOfFunction() &&
+ DeclaratorInfo.getDeclSpec().getStorageClassSpec()
+ != DeclSpec::SCS_static &&
DeclaratorInfo.getDeclSpec().getStorageClassSpec()
- != DeclSpec::SCS_static;
+ != DeclSpec::SCS_typedef;
if (!HasDeferredInitializer) {
SourceLocation EqualLoc;
Init = ParseCXXMemberInitializer(
- DeclaratorInfo.isFunctionDeclarator(), EqualLoc);
+ DeclaratorInfo.isDeclarationOfFunction(), EqualLoc);
if (Init.isInvalid())
SkipUntil(tok::comma, true, true);
}
@@ -2246,8 +2250,7 @@ Parser::MemInitResult Parser::ParseMemInitializer(Decl *ConstructorDecl) {
ParseOptionalCXXScopeSpecifier(SS, ParsedType(), false);
ParsedType TemplateTypeTy;
if (Tok.is(tok::annot_template_id)) {
- TemplateIdAnnotation *TemplateId
- = static_cast<TemplateIdAnnotation *>(Tok.getAnnotationValue());
+ TemplateIdAnnotation *TemplateId = takeTemplateIdAnnotation(Tok);
if (TemplateId->Kind == TNK_Type_template ||
TemplateId->Kind == TNK_Dependent_template_name) {
AnnotateTemplateIdTokenAsType();
diff --git a/contrib/llvm/tools/clang/lib/Parse/ParseExpr.cpp b/contrib/llvm/tools/clang/lib/Parse/ParseExpr.cpp
index 4e94ed9..fc64ae0 100644
--- a/contrib/llvm/tools/clang/lib/Parse/ParseExpr.cpp
+++ b/contrib/llvm/tools/clang/lib/Parse/ParseExpr.cpp
@@ -220,7 +220,7 @@ ExprResult Parser::ParseAssignmentExpression() {
if (Tok.is(tok::kw_throw))
return ParseThrowExpression();
- ExprResult LHS = ParseCastExpression(false, false, ParsedType());
+ ExprResult LHS = ParseCastExpression(/*isUnaryExpression=*/false);
return ParseRHSOfBinaryExpression(move(LHS), prec::Assignment);
}
@@ -304,13 +304,14 @@ Parser::ParseRHSOfBinaryExpression(ExprResult LHS, prec::Level MinPrec) {
ColonLoc = ConsumeToken();
} else {
// Otherwise, we're missing a ':'. Assume that this was a typo that the
- // user forgot. If we're not in a macro instantion, we can suggest a
+ // user forgot. If we're not in a macro instantiation, we can suggest a
// fixit hint. If there were two spaces before the current token,
// suggest inserting the colon in between them, otherwise insert ": ".
SourceLocation FILoc = Tok.getLocation();
const char *FIText = ": ";
- if (FILoc.isFileID()) {
- const SourceManager &SM = PP.getSourceManager();
+ const SourceManager &SM = PP.getSourceManager();
+ if (FILoc.isFileID() || PP.isAtStartOfMacroExpansion(FILoc)) {
+ FILoc = SM.getInstantiationLoc(FILoc);
bool IsInvalid = false;
const char *SourcePtr =
SM.getCharacterData(FILoc.getFileLocWithOffset(-1), &IsInvalid);
@@ -414,12 +415,12 @@ Parser::ParseRHSOfBinaryExpression(ExprResult LHS, prec::Level MinPrec) {
///
ExprResult Parser::ParseCastExpression(bool isUnaryExpression,
bool isAddressOfOperand,
- ParsedType TypeOfCast) {
+ bool isTypeCast) {
bool NotCastExpr;
ExprResult Res = ParseCastExpression(isUnaryExpression,
isAddressOfOperand,
NotCastExpr,
- TypeOfCast);
+ isTypeCast);
if (NotCastExpr)
Diag(Tok, diag::err_expected_expression);
return move(Res);
@@ -588,7 +589,7 @@ ExprResult Parser::ParseCastExpression(bool isUnaryExpression,
ExprResult Parser::ParseCastExpression(bool isUnaryExpression,
bool isAddressOfOperand,
bool &NotCastExpr,
- ParsedType TypeOfCast) {
+ bool isTypeCast) {
ExprResult Res;
tok::TokenKind SavedKind = Tok.getKind();
NotCastExpr = false;
@@ -619,7 +620,7 @@ ExprResult Parser::ParseCastExpression(bool isUnaryExpression,
ColonProtectionRAIIObject X(*this, false);
Res = ParseParenExpression(ParenExprType, false/*stopIfCastExr*/,
- TypeOfCast, CastTy, RParenLoc);
+ isTypeCast, CastTy, RParenLoc);
}
switch (ParenExprType) {
@@ -791,7 +792,7 @@ ExprResult Parser::ParseCastExpression(bool isUnaryExpression,
return ParseBuiltinPrimaryExpression();
case tok::kw___null:
return Actions.ActOnGNUNullExpr(ConsumeToken());
- break;
+
case tok::plusplus: // unary-expression: '++' unary-expression [C99]
case tok::minusminus: { // unary-expression: '--' unary-expression [C99]
// C++ [expr.unary] has:
@@ -951,12 +952,11 @@ ExprResult Parser::ParseCastExpression(bool isUnaryExpression,
return ExprError();
if (!Tok.is(tok::annot_cxxscope))
return ParseCastExpression(isUnaryExpression, isAddressOfOperand,
- NotCastExpr, TypeOfCast);
+ NotCastExpr, isTypeCast);
Token Next = NextToken();
if (Next.is(tok::annot_template_id)) {
- TemplateIdAnnotation *TemplateId
- = static_cast<TemplateIdAnnotation *>(Next.getAnnotationValue());
+ TemplateIdAnnotation *TemplateId = takeTemplateIdAnnotation(Next);
if (TemplateId->Kind == TNK_Type_template) {
// We have a qualified template-id that we know refers to a
// type, translate it into a type and continue parsing as a
@@ -965,7 +965,7 @@ ExprResult Parser::ParseCastExpression(bool isUnaryExpression,
ParseOptionalCXXScopeSpecifier(SS, ParsedType(), false);
AnnotateTemplateIdTokenAsType();
return ParseCastExpression(isUnaryExpression, isAddressOfOperand,
- NotCastExpr, TypeOfCast);
+ NotCastExpr, isTypeCast);
}
}
@@ -975,15 +975,14 @@ ExprResult Parser::ParseCastExpression(bool isUnaryExpression,
}
case tok::annot_template_id: { // [C++] template-id
- TemplateIdAnnotation *TemplateId
- = static_cast<TemplateIdAnnotation *>(Tok.getAnnotationValue());
+ TemplateIdAnnotation *TemplateId = takeTemplateIdAnnotation(Tok);
if (TemplateId->Kind == TNK_Type_template) {
// We have a template-id that we know refers to a type,
// translate it into a type and continue parsing as a cast
// expression.
AnnotateTemplateIdTokenAsType();
return ParseCastExpression(isUnaryExpression, isAddressOfOperand,
- NotCastExpr, TypeOfCast);
+ NotCastExpr, isTypeCast);
}
// Fall through to treat the template-id as an id-expression.
@@ -1101,17 +1100,20 @@ ExprResult Parser::ParseCastExpression(bool isUnaryExpression,
return ParseObjCAtExpression(AtLoc);
}
case tok::caret:
- return ParsePostfixExpressionSuffix(ParseBlockLiteralExpression());
- case tok::code_completion:
+ Res = ParseBlockLiteralExpression();
+ break;
+ case tok::code_completion: {
Actions.CodeCompleteOrdinaryName(getCurScope(), Sema::PCC_Expression);
ConsumeCodeCompletionToken();
return ParseCastExpression(isUnaryExpression, isAddressOfOperand,
- NotCastExpr, TypeOfCast);
+ NotCastExpr, isTypeCast);
+ }
case tok::l_square:
- // These can be followed by postfix-expr pieces.
- if (getLang().ObjC1)
- return ParsePostfixExpressionSuffix(ParseObjCMessageExpression());
- // FALL THROUGH.
+ if (getLang().ObjC1) {
+ Res = ParseObjCMessageExpression();
+ break;
+ }
+ // FALL THROUGH.
default:
NotCastExpr = true;
return ExprError();
@@ -1261,7 +1263,6 @@ Parser::ParsePostfixExpressionSuffix(ExprResult LHS) {
if (Tok.isNot(tok::r_paren)) {
if (ParseExpressionList(ArgExprs, CommaLocs, &Sema::CodeCompleteCall,
LHS.get())) {
- SkipUntil(tok::r_paren);
LHS = ExprError();
}
}
@@ -1424,7 +1425,7 @@ Parser::ParseExprAfterUnaryExprOrTypeTrait(const Token &OpTok,
EnterExpressionEvaluationContext Unevaluated(Actions,
Sema::Unevaluated);
Operand = ParseParenExpression(ExprType, true/*stopIfCastExpr*/,
- ParsedType(), CastTy, RParenLoc);
+ false, CastTy, RParenLoc);
CastRange = SourceRange(LParenLoc, RParenLoc);
// If ParseParenExpression parsed a '(typename)' sequence only, then this is
@@ -1717,7 +1718,7 @@ ExprResult Parser::ParseBuiltinPrimaryExpression() {
ConsumeParen());
break;
}
-}
+ }
if (Res.isInvalid())
return ExprError();
@@ -1740,10 +1741,15 @@ ExprResult Parser::ParseBuiltinPrimaryExpression() {
/// '(' type-name ')' '{' initializer-list ',' '}'
/// cast-expression: [C99 6.5.4]
/// '(' type-name ')' cast-expression
-///
+/// [ARC] bridged-cast-expression
+///
+/// [ARC] bridged-cast-expression:
+/// (__bridge type-name) cast-expression
+/// (__bridge_transfer type-name) cast-expression
+/// (__bridge_retained type-name) cast-expression
ExprResult
Parser::ParseParenExpression(ParenParseOption &ExprType, bool stopIfCastExpr,
- ParsedType TypeOfCast, ParsedType &CastTy,
+ bool isTypeCast, ParsedType &CastTy,
SourceLocation &RParenLoc) {
assert(Tok.is(tok::l_paren) && "Not a paren expr!");
GreaterThanIsOperatorScope G(GreaterThanIsOperator, true);
@@ -1772,7 +1778,43 @@ Parser::ParseParenExpression(ParenParseOption &ExprType, bool stopIfCastExpr,
// If the substmt parsed correctly, build the AST node.
if (!Stmt.isInvalid())
Result = Actions.ActOnStmtExpr(OpenLoc, Stmt.take(), Tok.getLocation());
-
+ } else if (ExprType >= CompoundLiteral &&
+ (Tok.is(tok::kw___bridge) ||
+ Tok.is(tok::kw___bridge_transfer) ||
+ Tok.is(tok::kw___bridge_retained) ||
+ Tok.is(tok::kw___bridge_retain))) {
+ tok::TokenKind tokenKind = Tok.getKind();
+ SourceLocation BridgeKeywordLoc = ConsumeToken();
+
+ // Parse an Objective-C ARC ownership cast expression.
+ ObjCBridgeCastKind Kind;
+ if (tokenKind == tok::kw___bridge)
+ Kind = OBC_Bridge;
+ else if (tokenKind == tok::kw___bridge_transfer)
+ Kind = OBC_BridgeTransfer;
+ else if (tokenKind == tok::kw___bridge_retained)
+ Kind = OBC_BridgeRetained;
+ else {
+ // As a hopefully temporary workaround, allow __bridge_retain as
+ // a synonym for __bridge_retained, but only in system headers.
+ assert(tokenKind == tok::kw___bridge_retain);
+ Kind = OBC_BridgeRetained;
+ if (!PP.getSourceManager().isInSystemHeader(BridgeKeywordLoc))
+ Diag(BridgeKeywordLoc, diag::err_arc_bridge_retain)
+ << FixItHint::CreateReplacement(BridgeKeywordLoc,
+ "__bridge_retained");
+ }
+
+ TypeResult Ty = ParseTypeName();
+ SourceLocation RParenLoc = MatchRHSPunctuation(tok::r_paren, OpenLoc);
+ ExprResult SubExpr = ParseCastExpression(/*isUnaryExpression=*/false);
+
+ if (Ty.isInvalid() || SubExpr.isInvalid())
+ return ExprError();
+
+ return Actions.ActOnObjCBridgedCast(getCurScope(), OpenLoc, Kind,
+ BridgeKeywordLoc, Ty.get(),
+ RParenLoc, SubExpr.get());
} else if (ExprType >= CompoundLiteral &&
isTypeIdInParens(isAmbiguousTypeId)) {
@@ -1787,20 +1829,23 @@ Parser::ParseParenExpression(ParenParseOption &ExprType, bool stopIfCastExpr,
return ParseCXXAmbiguousParenExpression(ExprType, CastTy,
OpenLoc, RParenLoc);
- TypeResult Ty;
-
- {
- InMessageExpressionRAIIObject InMessage(*this, false);
- Ty = ParseTypeName();
- }
+ // Parse the type declarator.
+ DeclSpec DS(AttrFactory);
+ ParseSpecifierQualifierList(DS);
+ Declarator DeclaratorInfo(DS, Declarator::TypeNameContext);
+ ParseDeclarator(DeclaratorInfo);
// If our type is followed by an identifier and either ':' or ']', then
// this is probably an Objective-C message send where the leading '[' is
// missing. Recover as if that were the case.
- if (!Ty.isInvalid() && Tok.is(tok::identifier) && !InMessageExpression &&
- getLang().ObjC1 && !Ty.get().get().isNull() &&
- (NextToken().is(tok::colon) || NextToken().is(tok::r_square)) &&
- Ty.get().get()->isObjCObjectOrInterfaceType()) {
+ if (!DeclaratorInfo.isInvalidType() && Tok.is(tok::identifier) &&
+ !InMessageExpression && getLang().ObjC1 &&
+ (NextToken().is(tok::colon) || NextToken().is(tok::r_square))) {
+ TypeResult Ty;
+ {
+ InMessageExpressionRAIIObject InMessage(*this, false);
+ Ty = Actions.ActOnTypeName(getCurScope(), DeclaratorInfo);
+ }
Result = ParseObjCMessageExpressionBody(SourceLocation(),
SourceLocation(),
Ty.get(), 0);
@@ -1813,21 +1858,31 @@ Parser::ParseParenExpression(ParenParseOption &ExprType, bool stopIfCastExpr,
if (Tok.is(tok::l_brace)) {
ExprType = CompoundLiteral;
+ TypeResult Ty;
+ {
+ InMessageExpressionRAIIObject InMessage(*this, false);
+ Ty = Actions.ActOnTypeName(getCurScope(), DeclaratorInfo);
+ }
return ParseCompoundLiteralExpression(Ty.get(), OpenLoc, RParenLoc);
}
if (ExprType == CastExpr) {
// We parsed '(' type-name ')' and the thing after it wasn't a '{'.
- if (Ty.isInvalid())
+ if (DeclaratorInfo.isInvalidType())
return ExprError();
- CastTy = Ty.get();
-
// Note that this doesn't parse the subsequent cast-expression, it just
// returns the parsed type to the callee.
- if (stopIfCastExpr)
+ if (stopIfCastExpr) {
+ TypeResult Ty;
+ {
+ InMessageExpressionRAIIObject InMessage(*this, false);
+ Ty = Actions.ActOnTypeName(getCurScope(), DeclaratorInfo);
+ }
+ CastTy = Ty.get();
return ExprResult();
+ }
// Reject the cast of super idiom in ObjC.
if (Tok.is(tok::identifier) && getLang().ObjC1 &&
@@ -1841,17 +1896,21 @@ Parser::ParseParenExpression(ParenParseOption &ExprType, bool stopIfCastExpr,
// Parse the cast-expression that follows it next.
// TODO: For cast expression with CastTy.
- Result = ParseCastExpression(false, false, CastTy);
- if (!Result.isInvalid())
- Result = Actions.ActOnCastExpr(getCurScope(), OpenLoc, CastTy,
+ Result = ParseCastExpression(/*isUnaryExpression=*/false,
+ /*isAddressOfOperand=*/false,
+ /*isTypeCast=*/true);
+ if (!Result.isInvalid()) {
+ Result = Actions.ActOnCastExpr(getCurScope(), OpenLoc,
+ DeclaratorInfo, CastTy,
RParenLoc, Result.take());
+ }
return move(Result);
}
Diag(Tok, diag::err_expected_lbrace_in_compound_literal);
return ExprError();
}
- } else if (TypeOfCast) {
+ } else if (isTypeCast) {
// Parse the expression-list.
InMessageExpressionRAIIObject InMessage(*this, false);
@@ -1861,7 +1920,7 @@ Parser::ParseParenExpression(ParenParseOption &ExprType, bool stopIfCastExpr,
if (!ParseExpressionList(ArgExprs, CommaLocs)) {
ExprType = SimpleExpr;
Result = Actions.ActOnParenOrParenListExpr(OpenLoc, Tok.getLocation(),
- move_arg(ArgExprs), TypeOfCast);
+ move_arg(ArgExprs));
}
} else {
InMessageExpressionRAIIObject InMessage(*this, false);
@@ -2174,6 +2233,7 @@ ExprResult Parser::ParseBlockLiteralExpression() {
SourceLocation(),
0, 0, 0,
true, SourceLocation(),
+ SourceLocation(),
EST_None,
SourceLocation(),
0, 0, 0, 0,
diff --git a/contrib/llvm/tools/clang/lib/Parse/ParseExprCXX.cpp b/contrib/llvm/tools/clang/lib/Parse/ParseExprCXX.cpp
index eab7114..b32eeda 100644
--- a/contrib/llvm/tools/clang/lib/Parse/ParseExprCXX.cpp
+++ b/contrib/llvm/tools/clang/lib/Parse/ParseExprCXX.cpp
@@ -245,8 +245,7 @@ bool Parser::ParseOptionalCXXScopeSpecifier(CXXScopeSpec &SS,
// So we need to check whether the simple-template-id is of the
// right kind (it should name a type or be dependent), and then
// convert it into a type within the nested-name-specifier.
- TemplateIdAnnotation *TemplateId
- = static_cast<TemplateIdAnnotation *>(Tok.getAnnotationValue());
+ TemplateIdAnnotation *TemplateId = takeTemplateIdAnnotation(Tok);
if (CheckForDestructor && GetLookAheadToken(2).is(tok::tilde)) {
*MayBePseudoDestructor = true;
return false;
@@ -281,10 +280,6 @@ bool Parser::ParseOptionalCXXScopeSpecifier(CXXScopeSpec &SS,
SS.SetInvalid(SourceRange(StartLoc, CCLoc));
}
- // If we are caching tokens we will process the TemplateId again,
- // otherwise destroy it.
- if (!PP.isBacktrackEnabled())
- TemplateId->Destroy();
continue;
}
@@ -543,7 +538,14 @@ ExprResult Parser::ParseCXXCasts() {
if (ExpectAndConsume(tok::less, diag::err_expected_less_after, CastName))
return ExprError();
- TypeResult CastTy = ParseTypeName();
+ // Parse the common declaration-specifiers piece.
+ DeclSpec DS(AttrFactory);
+ ParseSpecifierQualifierList(DS);
+
+ // Parse the abstract-declarator, if present.
+ Declarator DeclaratorInfo(DS, Declarator::TypeNameContext);
+ ParseDeclarator(DeclaratorInfo);
+
SourceLocation RAngleBracketLoc = Tok.getLocation();
if (ExpectAndConsume(tok::greater, diag::err_expected_greater))
@@ -559,9 +561,9 @@ ExprResult Parser::ParseCXXCasts() {
// Match the ')'.
RParenLoc = MatchRHSPunctuation(tok::r_paren, LParenLoc);
- if (!Result.isInvalid() && !CastTy.isInvalid())
+ if (!Result.isInvalid() && !DeclaratorInfo.isInvalidType())
Result = Actions.ActOnCXXNamedCast(OpLoc, Kind,
- LAngleBracketLoc, CastTy.get(),
+ LAngleBracketLoc, DeclaratorInfo,
RAngleBracketLoc,
LParenLoc, Result.take(), RParenLoc);
@@ -785,12 +787,12 @@ ExprResult Parser::ParseThrowExpression() {
case tok::r_brace:
case tok::colon:
case tok::comma:
- return Actions.ActOnCXXThrow(ThrowLoc, 0);
+ return Actions.ActOnCXXThrow(getCurScope(), ThrowLoc, 0);
default:
ExprResult Expr(ParseAssignmentExpression());
if (Expr.isInvalid()) return move(Expr);
- return Actions.ActOnCXXThrow(ThrowLoc, Expr.take());
+ return Actions.ActOnCXXThrow(getCurScope(), ThrowLoc, Expr.take());
}
}
@@ -1606,8 +1608,7 @@ bool Parser::ParseUnqualifiedId(CXXScopeSpec &SS, bool EnteringContext,
// unqualified-id:
// template-id (already parsed and annotated)
if (Tok.is(tok::annot_template_id)) {
- TemplateIdAnnotation *TemplateId
- = static_cast<TemplateIdAnnotation*>(Tok.getAnnotationValue());
+ TemplateIdAnnotation *TemplateId = takeTemplateIdAnnotation(Tok);
// If the template-name names the current class, then this is a constructor
if (AllowConstructorName && TemplateId->Name &&
@@ -1630,7 +1631,6 @@ bool Parser::ParseUnqualifiedId(CXXScopeSpec &SS, bool EnteringContext,
/*NontrivialTypeSourceInfo=*/true),
TemplateId->TemplateNameLoc,
TemplateId->RAngleLoc);
- TemplateId->Destroy();
ConsumeToken();
return false;
}
@@ -1755,7 +1755,7 @@ Parser::ParseCXXNewExpression(bool UseGlobal, SourceLocation Start) {
SourceRange TypeIdParens;
DeclSpec DS(AttrFactory);
- Declarator DeclaratorInfo(DS, Declarator::TypeNameContext);
+ Declarator DeclaratorInfo(DS, Declarator::CXXNewContext);
if (Tok.is(tok::l_paren)) {
// If it turns out to be a placement, we change the type location.
PlacementLParen = ConsumeParen();
@@ -2200,7 +2200,8 @@ Parser::ParseCXXAmbiguousParenExpression(ParenParseOption &ExprType,
Result = ParseCastExpression(false/*isUnaryExpression*/,
false/*isAddressofOperand*/,
NotCastExpr,
- ParsedType()/*TypeOfCast*/);
+ // type-id has priority.
+ true/*isTypeCast*/);
}
// If we parsed a cast-expression, it's really a type-id, otherwise it's
@@ -2219,7 +2220,11 @@ Parser::ParseCXXAmbiguousParenExpression(ParenParseOption &ExprType,
ConsumeAnyToken();
if (ParseAs >= CompoundLiteral) {
- TypeResult Ty = ParseTypeName();
+ // Parse the type declarator.
+ DeclSpec DS(AttrFactory);
+ ParseSpecifierQualifierList(DS);
+ Declarator DeclaratorInfo(DS, Declarator::TypeNameContext);
+ ParseDeclarator(DeclaratorInfo);
// Match the ')'.
if (Tok.is(tok::r_paren))
@@ -2229,21 +2234,21 @@ Parser::ParseCXXAmbiguousParenExpression(ParenParseOption &ExprType,
if (ParseAs == CompoundLiteral) {
ExprType = CompoundLiteral;
+ TypeResult Ty = ParseTypeName();
return ParseCompoundLiteralExpression(Ty.get(), LParenLoc, RParenLoc);
}
// We parsed '(' type-id ')' and the thing after it wasn't a '{'.
assert(ParseAs == CastExpr);
- if (Ty.isInvalid())
+ if (DeclaratorInfo.isInvalidType())
return ExprError();
- CastTy = Ty.get();
-
// Result is what ParseCastExpression returned earlier.
if (!Result.isInvalid())
- Result = Actions.ActOnCastExpr(getCurScope(), LParenLoc, CastTy, RParenLoc,
- Result.take());
+ Result = Actions.ActOnCastExpr(getCurScope(), LParenLoc,
+ DeclaratorInfo, CastTy,
+ RParenLoc, Result.take());
return move(Result);
}
diff --git a/contrib/llvm/tools/clang/lib/Parse/ParseObjc.cpp b/contrib/llvm/tools/clang/lib/Parse/ParseObjc.cpp
index a8c18c0..7641565 100644
--- a/contrib/llvm/tools/clang/lib/Parse/ParseObjc.cpp
+++ b/contrib/llvm/tools/clang/lib/Parse/ParseObjc.cpp
@@ -480,6 +480,10 @@ void Parser::ParseObjCInterfaceDeclList(Decl *interfaceDecl,
/// retain
/// copy
/// nonatomic
+/// atomic
+/// strong
+/// weak
+/// unsafe_unretained
///
void Parser::ParseObjCPropertyAttribute(ObjCDeclSpec &DS, Decl *ClassDecl) {
assert(Tok.getKind() == tok::l_paren);
@@ -504,16 +508,22 @@ void Parser::ParseObjCPropertyAttribute(ObjCDeclSpec &DS, Decl *ClassDecl) {
DS.setPropertyAttributes(ObjCDeclSpec::DQ_PR_readonly);
else if (II->isStr("assign"))
DS.setPropertyAttributes(ObjCDeclSpec::DQ_PR_assign);
+ else if (II->isStr("unsafe_unretained"))
+ DS.setPropertyAttributes(ObjCDeclSpec::DQ_PR_unsafe_unretained);
else if (II->isStr("readwrite"))
DS.setPropertyAttributes(ObjCDeclSpec::DQ_PR_readwrite);
else if (II->isStr("retain"))
DS.setPropertyAttributes(ObjCDeclSpec::DQ_PR_retain);
+ else if (II->isStr("strong"))
+ DS.setPropertyAttributes(ObjCDeclSpec::DQ_PR_strong);
else if (II->isStr("copy"))
DS.setPropertyAttributes(ObjCDeclSpec::DQ_PR_copy);
else if (II->isStr("nonatomic"))
DS.setPropertyAttributes(ObjCDeclSpec::DQ_PR_nonatomic);
else if (II->isStr("atomic"))
DS.setPropertyAttributes(ObjCDeclSpec::DQ_PR_atomic);
+ else if (II->isStr("weak"))
+ DS.setPropertyAttributes(ObjCDeclSpec::DQ_PR_weak);
else if (II->isStr("getter") || II->isStr("setter")) {
bool IsSetter = II->getNameStart()[0] == 's';
@@ -775,11 +785,12 @@ ParsedType Parser::ParseObjCTypeName(ObjCDeclSpec &DS,
ParsedType Ty;
if (isTypeSpecifierQualifier()) {
- TypeResult TypeSpec = ParseTypeName(0, Declarator::ObjCPrototypeContext);
+ TypeResult TypeSpec =
+ ParseTypeName(0, Declarator::ObjCPrototypeContext, &DS);
if (!TypeSpec.isInvalid())
Ty = TypeSpec.get();
}
-
+
if (Tok.is(tok::r_paren))
ConsumeParen();
else if (Tok.getLocation() == TypeStartLoc) {
@@ -1622,10 +1633,7 @@ StmtResult Parser::ParseObjCTryStmt(SourceLocation atLoc) {
if (Tok.isNot(tok::ellipsis)) {
DeclSpec DS(AttrFactory);
ParseDeclarationSpecifiers(DS);
- // For some odd reason, the name of the exception variable is
- // optional. As a result, we need to use "PrototypeContext", because
- // we must accept either 'declarator' or 'abstract-declarator' here.
- Declarator ParmDecl(DS, Declarator::PrototypeContext);
+ Declarator ParmDecl(DS, Declarator::ObjCCatchContext);
ParseDeclarator(ParmDecl);
// Inform the actions module about the declarator, so it
@@ -1690,6 +1698,29 @@ StmtResult Parser::ParseObjCTryStmt(SourceLocation atLoc) {
FinallyStmt.take());
}
+/// objc-autoreleasepool-statement:
+/// @autoreleasepool compound-statement
+///
+StmtResult
+Parser::ParseObjCAutoreleasePoolStmt(SourceLocation atLoc) {
+ ConsumeToken(); // consume autoreleasepool
+ if (Tok.isNot(tok::l_brace)) {
+ Diag(Tok, diag::err_expected_lbrace);
+ return StmtError();
+ }
+ // Enter a scope to hold everything within the compound stmt. Compound
+ // statements can always hold declarations.
+ ParseScope BodyScope(this, Scope::DeclScope);
+
+ StmtResult AutoreleasePoolBody(ParseCompoundStatementBody());
+
+ BodyScope.Exit();
+ if (AutoreleasePoolBody.isInvalid())
+ AutoreleasePoolBody = Actions.ActOnNullStmt(Tok.getLocation());
+ return Actions.ActOnObjCAutoreleasePoolStmt(atLoc,
+ AutoreleasePoolBody.take());
+}
+
/// objc-method-def: objc-method-proto ';'[opt] '{' body '}'
///
Decl *Parser::ParseObjCMethodDefinition() {
@@ -1765,6 +1796,9 @@ StmtResult Parser::ParseObjCAtStatement(SourceLocation AtLoc) {
if (Tok.isObjCAtKeyword(tok::objc_synchronized))
return ParseObjCSynchronizedStmt(AtLoc);
+
+ if (Tok.isObjCAtKeyword(tok::objc_autoreleasepool))
+ return ParseObjCAutoreleasePoolStmt(AtLoc);
ExprResult Res(ParseExpressionWithLeadingAt(AtLoc));
if (Res.isInvalid()) {
diff --git a/contrib/llvm/tools/clang/lib/Parse/ParseStmt.cpp b/contrib/llvm/tools/clang/lib/Parse/ParseStmt.cpp
index 6cc8b57..b91bca5 100644
--- a/contrib/llvm/tools/clang/lib/Parse/ParseStmt.cpp
+++ b/contrib/llvm/tools/clang/lib/Parse/ParseStmt.cpp
@@ -226,7 +226,7 @@ Retry:
case tok::semi: { // C99 6.8.3p3: expression[opt] ';'
SourceLocation LeadingEmptyMacroLoc;
if (Tok.hasLeadingEmptyMacro())
- LeadingEmptyMacroLoc = PP.getLastEmptyMacroInstantiationLoc();
+ LeadingEmptyMacroLoc = PP.getLastEmptyMacroExpansionLoc();
return Actions.ActOnNullStmt(ConsumeToken(), LeadingEmptyMacroLoc);
}
@@ -502,6 +502,7 @@ StmtResult Parser::ParseCaseStatement(ParsedAttributes &attrs, bool MissingCase,
StmtTy *DeepestParsedCaseStmt = 0;
// While we have case statements, eat and stack them.
+ SourceLocation ColonLoc;
do {
SourceLocation CaseLoc = MissingCase ? Expr.get()->getExprLoc() :
ConsumeToken(); // eat the 'case'.
@@ -539,7 +540,6 @@ StmtResult Parser::ParseCaseStatement(ParsedAttributes &attrs, bool MissingCase,
ColonProtection.restore();
- SourceLocation ColonLoc;
if (Tok.is(tok::colon)) {
ColonLoc = ConsumeToken();
@@ -589,8 +589,8 @@ StmtResult Parser::ParseCaseStatement(ParsedAttributes &attrs, bool MissingCase,
} else {
// Nicely diagnose the common error "switch (X) { case 4: }", which is
// not valid.
- // FIXME: add insertion hint.
- Diag(Tok, diag::err_label_end_of_compound_statement);
+ SourceLocation AfterColonLoc = PP.getLocForEndOfToken(ColonLoc);
+ Diag(AfterColonLoc, diag::err_label_end_of_compound_statement);
SubStmt = true;
}
@@ -634,7 +634,8 @@ StmtResult Parser::ParseDefaultStatement(ParsedAttributes &attrs) {
// Diagnose the common error "switch (X) {... default: }", which is not valid.
if (Tok.is(tok::r_brace)) {
- Diag(Tok, diag::err_label_end_of_compound_statement);
+ SourceLocation AfterColonLoc = PP.getLocForEndOfToken(ColonLoc);
+ Diag(AfterColonLoc, diag::err_label_end_of_compound_statement);
return StmtError();
}
@@ -646,6 +647,10 @@ StmtResult Parser::ParseDefaultStatement(ParsedAttributes &attrs) {
SubStmt.get(), getCurScope());
}
+StmtResult Parser::ParseCompoundStatement(ParsedAttributes &Attr,
+ bool isStmtExpr) {
+ return ParseCompoundStatement(Attr, isStmtExpr, Scope::DeclScope);
+}
/// ParseCompoundStatement - Parse a "{}" block.
///
@@ -675,14 +680,15 @@ StmtResult Parser::ParseDefaultStatement(ParsedAttributes &attrs) {
/// [OMP] flush-directive
///
StmtResult Parser::ParseCompoundStatement(ParsedAttributes &attrs,
- bool isStmtExpr) {
+ bool isStmtExpr,
+ unsigned ScopeFlags) {
//FIXME: Use attributes?
assert(Tok.is(tok::l_brace) && "Not a compount stmt!");
// Enter a scope to hold everything within the compound stmt. Compound
// statements can always hold declarations.
- ParseScope CompoundScope(this, Scope::DeclScope);
+ ParseScope CompoundScope(this, ScopeFlags);
// Parse the statements in the body.
return ParseCompoundStatementBody(isStmtExpr);
@@ -1909,7 +1915,8 @@ StmtResult Parser::ParseCXXTryBlockCommon(SourceLocation TryLoc) {
return StmtError(Diag(Tok, diag::err_expected_lbrace));
// FIXME: Possible draft standard bug: attribute-specifier should be allowed?
ParsedAttributesWithRange attrs(AttrFactory);
- StmtResult TryBlock(ParseCompoundStatement(attrs));
+ StmtResult TryBlock(ParseCompoundStatement(attrs, /*isStmtExpr=*/false,
+ Scope::DeclScope|Scope::TryScope));
if (TryBlock.isInvalid())
return move(TryBlock);
diff --git a/contrib/llvm/tools/clang/lib/Parse/ParseTemplate.cpp b/contrib/llvm/tools/clang/lib/Parse/ParseTemplate.cpp
index aa89d75..9eab40a 100644
--- a/contrib/llvm/tools/clang/lib/Parse/ParseTemplate.cpp
+++ b/contrib/llvm/tools/clang/lib/Parse/ParseTemplate.cpp
@@ -861,8 +861,7 @@ bool Parser::AnnotateTemplateIdToken(TemplateTy Template, TemplateNameKind TNK,
void Parser::AnnotateTemplateIdTokenAsType() {
assert(Tok.is(tok::annot_template_id) && "Requires template-id tokens");
- TemplateIdAnnotation *TemplateId
- = static_cast<TemplateIdAnnotation *>(Tok.getAnnotationValue());
+ TemplateIdAnnotation *TemplateId = takeTemplateIdAnnotation(Tok);
assert((TemplateId->Kind == TNK_Type_template ||
TemplateId->Kind == TNK_Dependent_template_name) &&
"Only works for type and dependent templates");
@@ -888,7 +887,6 @@ void Parser::AnnotateTemplateIdTokenAsType() {
// Replace the template-id annotation token, and possible the scope-specifier
// that precedes it, with the typename annotation token.
PP.AnnotateCachedTokens(Tok);
- TemplateId->Destroy();
}
/// \brief Determine whether the given token can end a template argument.
diff --git a/contrib/llvm/tools/clang/lib/Parse/ParseTentative.cpp b/contrib/llvm/tools/clang/lib/Parse/ParseTentative.cpp
index 78d2c90..2ba0fc6 100644
--- a/contrib/llvm/tools/clang/lib/Parse/ParseTentative.cpp
+++ b/contrib/llvm/tools/clang/lib/Parse/ParseTentative.cpp
@@ -908,8 +908,7 @@ Parser::TPResult Parser::isCXXDeclarationSpecifier() {
return TPResult::True();
case tok::annot_template_id: {
- TemplateIdAnnotation *TemplateId
- = static_cast<TemplateIdAnnotation *>(Tok.getAnnotationValue());
+ TemplateIdAnnotation *TemplateId = takeTemplateIdAnnotation(Tok);
if (TemplateId->Kind != TNK_Type_template)
return TPResult::False();
CXXScopeSpec SS;
diff --git a/contrib/llvm/tools/clang/lib/Parse/Parser.cpp b/contrib/llvm/tools/clang/lib/Parse/Parser.cpp
index f19472c..5c50290 100644
--- a/contrib/llvm/tools/clang/lib/Parse/Parser.cpp
+++ b/contrib/llvm/tools/clang/lib/Parse/Parser.cpp
@@ -124,9 +124,8 @@ void Parser::SuggestParentheses(SourceLocation Loc, unsigned DK,
/// MatchRHSPunctuation - For punctuation with a LHS and RHS (e.g. '['/']'),
/// this helper function matches and consumes the specified RHS token if
-/// present. If not present, it emits the specified diagnostic indicating
-/// that the parser failed to match the RHS of the token at LHSLoc. LHSName
-/// should be the name of the unmatched LHS token.
+/// present. If not present, it emits a corresponding diagnostic indicating
+/// that the parser failed to match the RHS of the token at LHSLoc.
SourceLocation Parser::MatchRHSPunctuation(tok::TokenKind RHSTok,
SourceLocation LHSLoc) {
@@ -486,6 +485,7 @@ void Parser::Initialize() {
/// ParseTopLevelDecl - Parse one top-level declaration, return whatever the
/// action tells us to. This returns true if the EOF was encountered.
bool Parser::ParseTopLevelDecl(DeclGroupPtrTy &Result) {
+ DelayedCleanupPoint CleanupRAII(TopLevelDeclCleanupPool);
while (Tok.is(tok::annot_pragma_unused))
HandlePragmaUnused();
@@ -548,6 +548,7 @@ void Parser::ParseTranslationUnit() {
Parser::DeclGroupPtrTy
Parser::ParseExternalDeclaration(ParsedAttributesWithRange &attrs,
ParsingDeclSpec *DS) {
+ DelayedCleanupPoint CleanupRAII(TopLevelDeclCleanupPool);
ParenBraceBracketBalancer BalancerRAIIObj(*this);
Decl *SingleDecl = 0;
@@ -1155,6 +1156,18 @@ Parser::ExprResult Parser::ParseSimpleAsm(SourceLocation *EndLoc) {
return move(Result);
}
+/// \brief Get the TemplateIdAnnotation from the token and put it in the
+/// cleanup pool so that it gets destroyed when parsing the current top level
+/// declaration is finished.
+TemplateIdAnnotation *Parser::takeTemplateIdAnnotation(const Token &tok) {
+ assert(tok.is(tok::annot_template_id) && "Expected template-id token");
+ TemplateIdAnnotation *
+ Id = static_cast<TemplateIdAnnotation *>(tok.getAnnotationValue());
+ TopLevelDeclCleanupPool.delayMemberFunc< TemplateIdAnnotation,
+ &TemplateIdAnnotation::Destroy>(Id);
+ return Id;
+}
+
/// TryAnnotateTypeOrScopeToken - If the current token position is on a
/// typename (possibly qualified in C++) or a C++ scope specifier not followed
/// by a typename, TryAnnotateTypeOrScopeToken will replace one or more tokens
@@ -1209,8 +1222,7 @@ bool Parser::TryAnnotateTypeOrScopeToken(bool EnteringContext) {
*Tok.getIdentifierInfo(),
Tok.getLocation());
} else if (Tok.is(tok::annot_template_id)) {
- TemplateIdAnnotation *TemplateId
- = static_cast<TemplateIdAnnotation *>(Tok.getAnnotationValue());
+ TemplateIdAnnotation *TemplateId = takeTemplateIdAnnotation(Tok);
if (TemplateId->Kind == TNK_Function_template) {
Diag(Tok, diag::err_typename_refers_to_non_type_template)
<< Tok.getAnnotationRange();
@@ -1228,7 +1240,6 @@ bool Parser::TryAnnotateTypeOrScopeToken(bool EnteringContext) {
TemplateId->LAngleLoc,
TemplateArgsPtr,
TemplateId->RAngleLoc);
- TemplateId->Destroy();
} else {
Diag(Tok, diag::err_expected_type_name_after_typename)
<< SS.getRange();
@@ -1311,8 +1322,7 @@ bool Parser::TryAnnotateTypeOrScopeToken(bool EnteringContext) {
}
if (Tok.is(tok::annot_template_id)) {
- TemplateIdAnnotation *TemplateId
- = static_cast<TemplateIdAnnotation *>(Tok.getAnnotationValue());
+ TemplateIdAnnotation *TemplateId = takeTemplateIdAnnotation(Tok);
if (TemplateId->Kind == TNK_Type_template) {
// A template-id that refers to a type was parsed into a
// template-id annotation in a context where we weren't allowed
diff --git a/contrib/llvm/tools/clang/lib/Rewrite/FixItRewriter.cpp b/contrib/llvm/tools/clang/lib/Rewrite/FixItRewriter.cpp
index 8dcc5dc..e50793e 100644
--- a/contrib/llvm/tools/clang/lib/Rewrite/FixItRewriter.cpp
+++ b/contrib/llvm/tools/clang/lib/Rewrite/FixItRewriter.cpp
@@ -121,8 +121,7 @@ void FixItRewriter::HandleDiagnostic(Diagnostic::Level DiagLevel,
if (Hint.CodeToInsert.empty()) {
// We're removing code.
- if (Rewrite.RemoveText(Hint.RemoveRange.getBegin(),
- Rewrite.getRangeSize(Hint.RemoveRange)))
+ if (Rewrite.RemoveText(Hint.RemoveRange))
Failed = true;
continue;
}
diff --git a/contrib/llvm/tools/clang/lib/Rewrite/HTMLRewrite.cpp b/contrib/llvm/tools/clang/lib/Rewrite/HTMLRewrite.cpp
index df08cd7..0b54755 100644
--- a/contrib/llvm/tools/clang/lib/Rewrite/HTMLRewrite.cpp
+++ b/contrib/llvm/tools/clang/lib/Rewrite/HTMLRewrite.cpp
@@ -516,7 +516,7 @@ void html::HighlightMacros(Rewriter &R, FileID FID, const Preprocessor& PP) {
}
// Okay, we have the first token of a macro expansion: highlight the
- // instantiation by inserting a start tag before the macro instantiation and
+ // expansion by inserting a start tag before the macro expansion and
// end tag after it.
std::pair<SourceLocation, SourceLocation> LLoc =
SM.getInstantiationRange(Tok.getLocation());
diff --git a/contrib/llvm/tools/clang/lib/Rewrite/RewriteObjC.cpp b/contrib/llvm/tools/clang/lib/Rewrite/RewriteObjC.cpp
index 8cdb55a..8202164 100644
--- a/contrib/llvm/tools/clang/lib/Rewrite/RewriteObjC.cpp
+++ b/contrib/llvm/tools/clang/lib/Rewrite/RewriteObjC.cpp
@@ -2110,8 +2110,7 @@ Stmt *RewriteObjC::RewriteAtEncode(ObjCEncodeExpr *Exp) {
QualType StrType = Context->getPointerType(Context->CharTy);
std::string StrEncoding;
Context->getObjCEncodingForType(Exp->getEncodedType(), StrEncoding);
- Expr *Replacement = StringLiteral::Create(*Context,StrEncoding.c_str(),
- StrEncoding.length(),
+ Expr *Replacement = StringLiteral::Create(*Context, StrEncoding,
false, false, StrType,
SourceLocation());
ReplaceStmt(Exp, Replacement);
@@ -2129,9 +2128,8 @@ Stmt *RewriteObjC::RewriteAtSelector(ObjCSelectorExpr *Exp) {
llvm::SmallVector<Expr*, 8> SelExprs;
QualType argType = Context->getPointerType(Context->CharTy);
SelExprs.push_back(StringLiteral::Create(*Context,
- Exp->getSelector().getAsString().c_str(),
- Exp->getSelector().getAsString().size(),
- false, false, argType,
+ Exp->getSelector().getAsString(),
+ false, false, argType,
SourceLocation()));
CallExpr *SelExp = SynthesizeCallToFunctionDecl(SelGetUidFunctionDecl,
&SelExprs[0], SelExprs.size());
@@ -2798,8 +2796,7 @@ Stmt *RewriteObjC::SynthMessageExpr(ObjCMessageExpr *Exp,
llvm::SmallVector<Expr*, 8> ClsExprs;
QualType argType = Context->getPointerType(Context->CharTy);
ClsExprs.push_back(StringLiteral::Create(*Context,
- ClassDecl->getIdentifier()->getNameStart(),
- ClassDecl->getIdentifier()->getLength(),
+ ClassDecl->getIdentifier()->getName(),
false, false, argType, SourceLocation()));
CallExpr *Cls = SynthesizeCallToFunctionDecl(GetMetaClassFunctionDecl,
&ClsExprs[0],
@@ -2877,8 +2874,7 @@ Stmt *RewriteObjC::SynthMessageExpr(ObjCMessageExpr *Exp,
= Exp->getClassReceiver()->getAs<ObjCObjectType>()->getInterface();
IdentifierInfo *clsName = Class->getIdentifier();
ClsExprs.push_back(StringLiteral::Create(*Context,
- clsName->getNameStart(),
- clsName->getLength(),
+ clsName->getName(),
false, false,
argType, SourceLocation()));
CallExpr *Cls = SynthesizeCallToFunctionDecl(GetClassFunctionDecl,
@@ -2909,8 +2905,7 @@ Stmt *RewriteObjC::SynthMessageExpr(ObjCMessageExpr *Exp,
llvm::SmallVector<Expr*, 8> ClsExprs;
QualType argType = Context->getPointerType(Context->CharTy);
ClsExprs.push_back(StringLiteral::Create(*Context,
- ClassDecl->getIdentifier()->getNameStart(),
- ClassDecl->getIdentifier()->getLength(),
+ ClassDecl->getIdentifier()->getName(),
false, false, argType, SourceLocation()));
CallExpr *Cls = SynthesizeCallToFunctionDecl(GetClassFunctionDecl,
&ClsExprs[0],
@@ -2991,8 +2986,7 @@ Stmt *RewriteObjC::SynthMessageExpr(ObjCMessageExpr *Exp,
llvm::SmallVector<Expr*, 8> SelExprs;
QualType argType = Context->getPointerType(Context->CharTy);
SelExprs.push_back(StringLiteral::Create(*Context,
- Exp->getSelector().getAsString().c_str(),
- Exp->getSelector().getAsString().size(),
+ Exp->getSelector().getAsString(),
false, false, argType, SourceLocation()));
CallExpr *SelExp = SynthesizeCallToFunctionDecl(SelGetUidFunctionDecl,
&SelExprs[0], SelExprs.size(),
diff --git a/contrib/llvm/tools/clang/lib/Rewrite/Rewriter.cpp b/contrib/llvm/tools/clang/lib/Rewrite/Rewriter.cpp
index 51fe379..92f5160 100644
--- a/contrib/llvm/tools/clang/lib/Rewrite/Rewriter.cpp
+++ b/contrib/llvm/tools/clang/lib/Rewrite/Rewriter.cpp
@@ -231,10 +231,44 @@ RewriteBuffer &Rewriter::getEditBuffer(FileID FID) {
/// InsertText - Insert the specified string at the specified location in the
/// original buffer.
bool Rewriter::InsertText(SourceLocation Loc, llvm::StringRef Str,
- bool InsertAfter) {
+ bool InsertAfter, bool indentNewLines) {
+ using llvm::StringRef;
+
if (!isRewritable(Loc)) return true;
FileID FID;
unsigned StartOffs = getLocationOffsetAndFileID(Loc, FID);
+
+ llvm::SmallString<128> indentedStr;
+ if (indentNewLines && Str.find('\n') != StringRef::npos) {
+ StringRef MB = SourceMgr->getBufferData(FID);
+
+ unsigned lineNo = SourceMgr->getLineNumber(FID, StartOffs) - 1;
+ const SrcMgr::ContentCache *
+ Content = SourceMgr->getSLocEntry(FID).getFile().getContentCache();
+ unsigned lineOffs = Content->SourceLineCache[lineNo];
+
+ // Find the whitespace at the start of the line.
+ StringRef indentSpace;
+ {
+ unsigned i = lineOffs;
+ while (isWhitespace(MB[i]))
+ ++i;
+ indentSpace = MB.substr(lineOffs, i-lineOffs);
+ }
+
+ llvm::SmallVector<StringRef, 4> lines;
+ Str.split(lines, "\n");
+
+ for (unsigned i = 0, e = lines.size(); i != e; ++i) {
+ indentedStr += lines[i];
+ if (i < e-1) {
+ indentedStr += '\n';
+ indentedStr += indentSpace;
+ }
+ }
+ Str = indentedStr.str();
+ }
+
getEditBuffer(FID).InsertText(StartOffs, Str, InsertAfter);
return false;
}
@@ -317,6 +351,7 @@ bool Rewriter::IncreaseIndentation(CharSourceRange range,
SourceLocation parentIndent) {
using llvm::StringRef;
+ if (range.isInvalid()) return true;
if (!isRewritable(range.getBegin())) return true;
if (!isRewritable(range.getEnd())) return true;
if (!isRewritable(parentIndent)) return true;
@@ -330,7 +365,7 @@ bool Rewriter::IncreaseIndentation(CharSourceRange range,
if (StartFileID != EndFileID || StartFileID != parentFileID)
return true;
- if (StartOff >= EndOff || parentOff >= StartOff)
+ if (StartOff > EndOff)
return true;
FileID FID = StartFileID;
@@ -343,16 +378,12 @@ bool Rewriter::IncreaseIndentation(CharSourceRange range,
const SrcMgr::ContentCache *
Content = SourceMgr->getSLocEntry(FID).getFile().getContentCache();
- // Find where the line starts for the three offsets.
+ // Find where the lines start.
unsigned parentLineOffs = Content->SourceLineCache[parentLineNo];
unsigned startLineOffs = Content->SourceLineCache[startLineNo];
- unsigned endLineOffs = Content->SourceLineCache[endLineNo];
-
- if (startLineOffs == endLineOffs || startLineOffs == parentLineOffs)
- return true;
// Find the whitespace at the start of each line.
- StringRef parentSpace, startSpace, endSpace;
+ StringRef parentSpace, startSpace;
{
unsigned i = parentLineOffs;
while (isWhitespace(MB[i]))
@@ -363,11 +394,6 @@ bool Rewriter::IncreaseIndentation(CharSourceRange range,
while (isWhitespace(MB[i]))
++i;
startSpace = MB.substr(startLineOffs, i-startLineOffs);
-
- i = endLineOffs;
- while (isWhitespace(MB[i]))
- ++i;
- endSpace = MB.substr(endLineOffs, i-endLineOffs);
}
if (parentSpace.size() >= startSpace.size())
return true;
@@ -378,19 +404,14 @@ bool Rewriter::IncreaseIndentation(CharSourceRange range,
// Indent the lines between start/end offsets.
RewriteBuffer &RB = getEditBuffer(FID);
- for (unsigned i = startLineOffs; i != endLineOffs; ++i) {
- if (MB[i] == '\n') {
- unsigned startOfLine = i+1;
- if (startOfLine == endLineOffs)
- break;
- StringRef origIndent;
- unsigned ws = startOfLine;
- while (isWhitespace(MB[ws]))
- ++ws;
- origIndent = MB.substr(startOfLine, ws-startOfLine);
- if (origIndent.startswith(startSpace))
- RB.InsertText(startOfLine, indent, /*InsertAfter=*/false);
- }
+ for (unsigned lineNo = startLineNo; lineNo <= endLineNo; ++lineNo) {
+ unsigned offs = Content->SourceLineCache[lineNo];
+ unsigned i = offs;
+ while (isWhitespace(MB[i]))
+ ++i;
+ StringRef origIndent = MB.substr(offs, i-offs);
+ if (origIndent.startswith(startSpace))
+ RB.InsertText(offs, indent, /*InsertAfter=*/false);
}
return false;
diff --git a/contrib/llvm/tools/clang/lib/Sema/AnalysisBasedWarnings.cpp b/contrib/llvm/tools/clang/lib/Sema/AnalysisBasedWarnings.cpp
index 9efae61..7a14855e 100644
--- a/contrib/llvm/tools/clang/lib/Sema/AnalysisBasedWarnings.cpp
+++ b/contrib/llvm/tools/clang/lib/Sema/AnalysisBasedWarnings.cpp
@@ -486,7 +486,8 @@ static void SuggestInitializationFixit(Sema &S, const VarDecl *VD) {
const char *initialization = 0;
QualType VariableTy = VD->getType().getCanonicalType();
- if (VariableTy->getAs<ObjCObjectPointerType>()) {
+ if (VariableTy->isObjCObjectPointerType() ||
+ VariableTy->isBlockPointerType()) {
// Check if 'nil' is defined.
if (S.PP.getMacroInfo(&S.getASTContext().Idents.get("nil")))
initialization = " = nil";
@@ -499,6 +500,13 @@ static void SuggestInitializationFixit(Sema &S, const VarDecl *VD) {
initialization = " = false";
else if (VariableTy->isEnumeralType())
return;
+ else if (VariableTy->isPointerType() || VariableTy->isMemberPointerType()) {
+ // Check if 'NULL' is defined.
+ if (S.PP.getMacroInfo(&S.getASTContext().Idents.get("NULL")))
+ initialization = " = NULL";
+ else
+ initialization = " = 0";
+ }
else if (VariableTy->isScalarType())
initialization = " = 0";
@@ -589,7 +597,17 @@ clang::sema::AnalysisBasedWarnings::Policy::Policy() {
enableCheckUnreachable = 0;
}
-clang::sema::AnalysisBasedWarnings::AnalysisBasedWarnings(Sema &s) : S(s) {
+clang::sema::AnalysisBasedWarnings::AnalysisBasedWarnings(Sema &s)
+ : S(s),
+ NumFunctionsAnalyzed(0),
+ NumFunctionsWithBadCFGs(0),
+ NumCFGBlocks(0),
+ MaxCFGBlocksPerFunction(0),
+ NumUninitAnalysisFunctions(0),
+ NumUninitAnalysisVariables(0),
+ MaxUninitAnalysisVariablesPerFunction(0),
+ NumUninitAnalysisBlockVisits(0),
+ MaxUninitAnalysisBlockVisitsPerFunction(0) {
Diagnostic &D = S.getDiagnostics();
DefaultPolicy.enableCheckUnreachable = (unsigned)
(D.getDiagnosticLevel(diag::warn_unreachable, SourceLocation()) !=
@@ -705,8 +723,68 @@ AnalysisBasedWarnings::IssueWarnings(sema::AnalysisBasedWarnings::Policy P,
!= Diagnostic::Ignored) {
if (CFG *cfg = AC.getCFG()) {
UninitValsDiagReporter reporter(S);
+ UninitVariablesAnalysisStats stats;
+ std::memset(&stats, 0, sizeof(UninitVariablesAnalysisStats));
runUninitializedVariablesAnalysis(*cast<DeclContext>(D), *cfg, AC,
- reporter);
+ reporter, stats);
+
+ if (S.CollectStats && stats.NumVariablesAnalyzed > 0) {
+ ++NumUninitAnalysisFunctions;
+ NumUninitAnalysisVariables += stats.NumVariablesAnalyzed;
+ NumUninitAnalysisBlockVisits += stats.NumBlockVisits;
+ MaxUninitAnalysisVariablesPerFunction =
+ std::max(MaxUninitAnalysisVariablesPerFunction,
+ stats.NumVariablesAnalyzed);
+ MaxUninitAnalysisBlockVisitsPerFunction =
+ std::max(MaxUninitAnalysisBlockVisitsPerFunction,
+ stats.NumBlockVisits);
+ }
}
}
+
+ // Collect statistics about the CFG if it was built.
+ if (S.CollectStats && AC.isCFGBuilt()) {
+ ++NumFunctionsAnalyzed;
+ if (CFG *cfg = AC.getCFG()) {
+ // If we successfully built a CFG for this context, record some more
+ // detail information about it.
+ NumCFGBlocks += cfg->getNumBlockIDs();
+ MaxCFGBlocksPerFunction = std::max(MaxCFGBlocksPerFunction,
+ cfg->getNumBlockIDs());
+ } else {
+ ++NumFunctionsWithBadCFGs;
+ }
+ }
+}
+
+void clang::sema::AnalysisBasedWarnings::PrintStats() const {
+ llvm::errs() << "\n*** Analysis Based Warnings Stats:\n";
+
+ unsigned NumCFGsBuilt = NumFunctionsAnalyzed - NumFunctionsWithBadCFGs;
+ unsigned AvgCFGBlocksPerFunction =
+ !NumCFGsBuilt ? 0 : NumCFGBlocks/NumCFGsBuilt;
+ llvm::errs() << NumFunctionsAnalyzed << " functions analyzed ("
+ << NumFunctionsWithBadCFGs << " w/o CFGs).\n"
+ << " " << NumCFGBlocks << " CFG blocks built.\n"
+ << " " << AvgCFGBlocksPerFunction
+ << " average CFG blocks per function.\n"
+ << " " << MaxCFGBlocksPerFunction
+ << " max CFG blocks per function.\n";
+
+ unsigned AvgUninitVariablesPerFunction = !NumUninitAnalysisFunctions ? 0
+ : NumUninitAnalysisVariables/NumUninitAnalysisFunctions;
+ unsigned AvgUninitBlockVisitsPerFunction = !NumUninitAnalysisFunctions ? 0
+ : NumUninitAnalysisBlockVisits/NumUninitAnalysisFunctions;
+ llvm::errs() << NumUninitAnalysisFunctions
+ << " functions analyzed for uninitialiazed variables\n"
+ << " " << NumUninitAnalysisVariables << " variables analyzed.\n"
+ << " " << AvgUninitVariablesPerFunction
+ << " average variables per function.\n"
+ << " " << MaxUninitAnalysisVariablesPerFunction
+ << " max variables per function.\n"
+ << " " << NumUninitAnalysisBlockVisits << " block visits.\n"
+ << " " << AvgUninitBlockVisitsPerFunction
+ << " average block visits per function.\n"
+ << " " << MaxUninitAnalysisBlockVisitsPerFunction
+ << " max block visits per function.\n";
}
diff --git a/contrib/llvm/tools/clang/lib/Sema/AttributeList.cpp b/contrib/llvm/tools/clang/lib/Sema/AttributeList.cpp
index 619a5b9..5a8330b 100644
--- a/contrib/llvm/tools/clang/lib/Sema/AttributeList.cpp
+++ b/contrib/llvm/tools/clang/lib/Sema/AttributeList.cpp
@@ -107,6 +107,7 @@ AttributeList::Kind AttributeList::getKind(const IdentifierInfo *Name) {
return llvm::StringSwitch<AttributeList::Kind>(AttrName)
.Case("weak", AT_weak)
.Case("weakref", AT_weakref)
+ .Case("objc_arc_weak_reference_unavailable", AT_arc_weakref_unavailable)
.Case("pure", AT_pure)
.Case("mode", AT_mode)
.Case("used", AT_used)
@@ -177,6 +178,11 @@ AttributeList::Kind AttributeList::getKind(const IdentifierInfo *Name) {
.Case("cf_consumed", AT_cf_consumed)
.Case("cf_returns_not_retained", AT_cf_returns_not_retained)
.Case("cf_returns_retained", AT_cf_returns_retained)
+ .Case("cf_returns_autoreleased", AT_cf_returns_autoreleased)
+ .Case("ns_consumes_self", AT_ns_consumes_self)
+ .Case("ns_consumed", AT_ns_consumed)
+ .Case("objc_ownership", AT_objc_ownership)
+ .Case("objc_precise_lifetime", AT_objc_precise_lifetime)
.Case("ownership_returns", AT_ownership_returns)
.Case("ownership_holds", AT_ownership_holds)
.Case("ownership_takes", AT_ownership_takes)
diff --git a/contrib/llvm/tools/clang/lib/Sema/CodeCompleteConsumer.cpp b/contrib/llvm/tools/clang/lib/Sema/CodeCompleteConsumer.cpp
index 2334ab5..d7dc5b2 100644
--- a/contrib/llvm/tools/clang/lib/Sema/CodeCompleteConsumer.cpp
+++ b/contrib/llvm/tools/clang/lib/Sema/CodeCompleteConsumer.cpp
@@ -46,7 +46,9 @@ bool CodeCompletionContext::wantConstructorResults() const {
case CCC_ObjCImplementation:
case CCC_ObjCIvarList:
case CCC_ClassStructUnion:
- case CCC_MemberAccess:
+ case CCC_DotMemberAccess:
+ case CCC_ArrowMemberAccess:
+ case CCC_ObjCPropertyAccess:
case CCC_EnumTag:
case CCC_UnionTag:
case CCC_ClassOrStructTag:
@@ -64,6 +66,10 @@ bool CodeCompletionContext::wantConstructorResults() const {
case CCC_TypeQualifiers:
case CCC_Other:
case CCC_OtherWithMacros:
+ case CCC_ObjCInstanceMessage:
+ case CCC_ObjCClassMessage:
+ case CCC_ObjCSuperclass:
+ case CCC_ObjCCategoryName:
return false;
}
diff --git a/contrib/llvm/tools/clang/lib/Sema/DeclSpec.cpp b/contrib/llvm/tools/clang/lib/Sema/DeclSpec.cpp
index 5be16e7..c87f2cf 100644
--- a/contrib/llvm/tools/clang/lib/Sema/DeclSpec.cpp
+++ b/contrib/llvm/tools/clang/lib/Sema/DeclSpec.cpp
@@ -13,8 +13,10 @@
#include "clang/Parse/ParseDiagnostic.h" // FIXME: remove this back-dependency!
#include "clang/Sema/DeclSpec.h"
+#include "clang/Sema/LocInfoType.h"
#include "clang/Sema/ParsedTemplate.h"
#include "clang/AST/ASTContext.h"
+#include "clang/AST/Expr.h"
#include "clang/AST/NestedNameSpecifier.h"
#include "clang/AST/TypeLoc.h"
#include "clang/Lex/Preprocessor.h"
@@ -124,6 +126,12 @@ void CXXScopeSpec::Adopt(NestedNameSpecifierLoc Other) {
Builder.Adopt(Other);
}
+SourceLocation CXXScopeSpec::getLastQualifierNameLoc() const {
+ if (!Builder.getRepresentation())
+ return SourceLocation();
+ return Builder.getTemporary().getLocalBeginLoc();
+}
+
NestedNameSpecifierLoc
CXXScopeSpec::getWithLocInContext(ASTContext &Context) const {
if (!Builder.getRepresentation())
@@ -141,6 +149,7 @@ DeclaratorChunk DeclaratorChunk::getFunction(bool hasProto, bool isVariadic,
unsigned TypeQuals,
bool RefQualifierIsLvalueRef,
SourceLocation RefQualifierLoc,
+ SourceLocation MutableLoc,
ExceptionSpecificationType
ESpecType,
SourceLocation ESpecLoc,
@@ -166,6 +175,7 @@ DeclaratorChunk DeclaratorChunk::getFunction(bool hasProto, bool isVariadic,
I.Fun.ArgInfo = 0;
I.Fun.RefQualifierIsLValueRef = RefQualifierIsLvalueRef;
I.Fun.RefQualifierLoc = RefQualifierLoc.getRawEncoding();
+ I.Fun.MutableLoc = MutableLoc.getRawEncoding();
I.Fun.ExceptionSpecType = ESpecType;
I.Fun.ExceptionSpecLoc = ESpecLoc.getRawEncoding();
I.Fun.NumExceptions = 0;
@@ -213,6 +223,73 @@ DeclaratorChunk DeclaratorChunk::getFunction(bool hasProto, bool isVariadic,
return I;
}
+bool Declarator::isDeclarationOfFunction() const {
+ for (unsigned i = 0, i_end = DeclTypeInfo.size(); i < i_end; ++i) {
+ switch (DeclTypeInfo[i].Kind) {
+ case DeclaratorChunk::Function:
+ return true;
+ case DeclaratorChunk::Paren:
+ continue;
+ case DeclaratorChunk::Pointer:
+ case DeclaratorChunk::Reference:
+ case DeclaratorChunk::Array:
+ case DeclaratorChunk::BlockPointer:
+ case DeclaratorChunk::MemberPointer:
+ return false;
+ }
+ llvm_unreachable("Invalid type chunk");
+ return false;
+ }
+
+ switch (DS.getTypeSpecType()) {
+ case TST_auto:
+ case TST_bool:
+ case TST_char:
+ case TST_char16:
+ case TST_char32:
+ case TST_class:
+ case TST_decimal128:
+ case TST_decimal32:
+ case TST_decimal64:
+ case TST_double:
+ case TST_enum:
+ case TST_error:
+ case TST_float:
+ case TST_int:
+ case TST_struct:
+ case TST_union:
+ case TST_unknown_anytype:
+ case TST_unspecified:
+ case TST_void:
+ case TST_wchar:
+ return false;
+
+ case TST_decltype:
+ case TST_typeofExpr:
+ if (Expr *E = DS.getRepAsExpr())
+ return E->getType()->isFunctionType();
+ return false;
+
+ case TST_underlyingType:
+ case TST_typename:
+ case TST_typeofType: {
+ QualType QT = DS.getRepAsType().get();
+ if (QT.isNull())
+ return false;
+
+ if (const LocInfoType *LIT = dyn_cast<LocInfoType>(QT))
+ QT = LIT->getType();
+
+ if (QT.isNull())
+ return false;
+
+ return QT->isFunctionType();
+ }
+ }
+
+ return false;
+}
+
/// getParsedSpecifiers - Return a bitmask of which flavors of specifiers this
/// declaration specifier includes.
///
@@ -792,9 +869,6 @@ bool DeclSpec::isMissingDeclaratorOk() {
}
void UnqualifiedId::clear() {
- if (Kind == IK_TemplateId)
- TemplateId->Destroy();
-
Kind = IK_Identifier;
Identifier = 0;
StartLocation = SourceLocation();
diff --git a/contrib/llvm/tools/clang/lib/Sema/DelayedDiagnostic.cpp b/contrib/llvm/tools/clang/lib/Sema/DelayedDiagnostic.cpp
index af548fe..c6744ed 100644
--- a/contrib/llvm/tools/clang/lib/Sema/DelayedDiagnostic.cpp
+++ b/contrib/llvm/tools/clang/lib/Sema/DelayedDiagnostic.cpp
@@ -47,5 +47,8 @@ void DelayedDiagnostic::Destroy() {
case Deprecation:
delete [] DeprecationData.Message;
break;
+
+ case ForbiddenType:
+ break;
}
}
diff --git a/contrib/llvm/tools/clang/lib/Sema/JumpDiagnostics.cpp b/contrib/llvm/tools/clang/lib/Sema/JumpDiagnostics.cpp
index ae154aa..59bc263 100644
--- a/contrib/llvm/tools/clang/lib/Sema/JumpDiagnostics.cpp
+++ b/contrib/llvm/tools/clang/lib/Sema/JumpDiagnostics.cpp
@@ -68,7 +68,10 @@ public:
JumpScopeChecker(Stmt *Body, Sema &S);
private:
void BuildScopeInformation(Decl *D, unsigned &ParentScope);
- void BuildScopeInformation(Stmt *S, unsigned ParentScope);
+ void BuildScopeInformation(VarDecl *D, const BlockDecl *BDecl,
+ unsigned &ParentScope);
+ void BuildScopeInformation(Stmt *S, unsigned &origParentScope);
+
void VerifyJumps();
void VerifyIndirectJumps();
void DiagnoseIndirectJump(IndirectGotoStmt *IG, unsigned IGScope,
@@ -87,7 +90,8 @@ JumpScopeChecker::JumpScopeChecker(Stmt *Body, Sema &s) : S(s) {
// Build information for the top level compound statement, so that we have a
// defined scope record for every "goto" and label.
- BuildScopeInformation(Body, 0);
+ unsigned BodyParentScope = 0;
+ BuildScopeInformation(Body, BodyParentScope);
// Check that all jumps we saw are kosher.
VerifyJumps();
@@ -111,87 +115,110 @@ unsigned JumpScopeChecker::GetDeepestCommonScope(unsigned A, unsigned B) {
return A;
}
+typedef std::pair<unsigned,unsigned> ScopePair;
+
/// GetDiagForGotoScopeDecl - If this decl induces a new goto scope, return a
/// diagnostic that should be emitted if control goes over it. If not, return 0.
-static std::pair<unsigned,unsigned>
- GetDiagForGotoScopeDecl(const Decl *D, bool isCPlusPlus) {
+static ScopePair GetDiagForGotoScopeDecl(ASTContext &Context, const Decl *D) {
if (const VarDecl *VD = dyn_cast<VarDecl>(D)) {
unsigned InDiag = 0, OutDiag = 0;
if (VD->getType()->isVariablyModifiedType())
InDiag = diag::note_protected_by_vla;
- if (VD->hasAttr<BlocksAttr>()) {
- InDiag = diag::note_protected_by___block;
- OutDiag = diag::note_exits___block;
- } else if (VD->hasAttr<CleanupAttr>()) {
- InDiag = diag::note_protected_by_cleanup;
- OutDiag = diag::note_exits_cleanup;
- } else if (isCPlusPlus) {
- if (!VD->hasLocalStorage())
- return std::make_pair(InDiag, OutDiag);
-
- ASTContext &Context = D->getASTContext();
- QualType T = Context.getBaseElementType(VD->getType());
- if (!T->isDependentType()) {
- // C++0x [stmt.dcl]p3:
- // A program that jumps from a point where a variable with automatic
- // storage duration is not in scope to a point where it is in scope
- // is ill-formed unless the variable has scalar type, class type with
- // a trivial default constructor and a trivial destructor, a
- // cv-qualified version of one of these types, or an array of one of
- // the preceding types and is declared without an initializer (8.5).
- // Check whether this is a C++ class.
- CXXRecordDecl *Record = T->getAsCXXRecordDecl();
-
- if (const Expr *Init = VD->getInit()) {
- bool CallsTrivialConstructor = false;
- if (Record) {
- // FIXME: With generalized initializer lists, this may
- // classify "X x{};" as having no initializer.
- if (const CXXConstructExpr *Construct
- = dyn_cast<CXXConstructExpr>(Init))
- if (const CXXConstructorDecl *Constructor
- = Construct->getConstructor())
- if ((Context.getLangOptions().CPlusPlus0x
- ? Record->hasTrivialDefaultConstructor()
- : Record->isPOD()) &&
- Constructor->isDefaultConstructor())
- CallsTrivialConstructor = true;
+ if (VD->hasAttr<BlocksAttr>())
+ return ScopePair(diag::note_protected_by___block,
+ diag::note_exits___block);
+
+ if (VD->hasAttr<CleanupAttr>())
+ return ScopePair(diag::note_protected_by_cleanup,
+ diag::note_exits_cleanup);
+
+ if (Context.getLangOptions().ObjCAutoRefCount && VD->hasLocalStorage()) {
+ switch (VD->getType().getObjCLifetime()) {
+ case Qualifiers::OCL_None:
+ case Qualifiers::OCL_ExplicitNone:
+ case Qualifiers::OCL_Autoreleasing:
+ break;
+
+ case Qualifiers::OCL_Strong:
+ case Qualifiers::OCL_Weak:
+ return ScopePair(diag::note_protected_by_objc_ownership,
+ diag::note_exits_objc_ownership);
+ }
+ }
+
+ if (Context.getLangOptions().CPlusPlus && VD->hasLocalStorage()) {
+ // C++0x [stmt.dcl]p3:
+ // A program that jumps from a point where a variable with automatic
+ // storage duration is not in scope to a point where it is in scope
+ // is ill-formed unless the variable has scalar type, class type with
+ // a trivial default constructor and a trivial destructor, a
+ // cv-qualified version of one of these types, or an array of one of
+ // the preceding types and is declared without an initializer.
+
+ // C++03 [stmt.dcl.p3:
+ // A program that jumps from a point where a local variable
+ // with automatic storage duration is not in scope to a point
+ // where it is in scope is ill-formed unless the variable has
+ // POD type and is declared without an initializer.
+
+ if (const Expr *init = VD->getInit()) {
+ // We actually give variables of record type (or array thereof)
+ // an initializer even if that initializer only calls a trivial
+ // ctor. Detect that case.
+ // FIXME: With generalized initializer lists, this may
+ // classify "X x{};" as having no initializer.
+ unsigned inDiagToUse = diag::note_protected_by_variable_init;
+
+ const CXXRecordDecl *record = 0;
+
+ if (const CXXConstructExpr *cce = dyn_cast<CXXConstructExpr>(init)) {
+ const CXXConstructorDecl *ctor = cce->getConstructor();
+ record = ctor->getParent();
+
+ if (ctor->isTrivial() && ctor->isDefaultConstructor()) {
+ if (Context.getLangOptions().CPlusPlus0x) {
+ inDiagToUse = (record->hasTrivialDestructor() ? 0 :
+ diag::note_protected_by_variable_nontriv_destructor);
+ } else {
+ if (record->isPOD())
+ inDiagToUse = 0;
+ }
}
-
- if (!CallsTrivialConstructor)
- InDiag = diag::note_protected_by_variable_init;
+ } else if (VD->getType()->isArrayType()) {
+ record = VD->getType()->getBaseElementTypeUnsafe()
+ ->getAsCXXRecordDecl();
}
-
- // Note whether we have a class with a non-trivial destructor.
- if (Record && !Record->hasTrivialDestructor())
+
+ if (inDiagToUse)
+ InDiag = inDiagToUse;
+
+ // Also object to indirect jumps which leave scopes with dtors.
+ if (record && !record->hasTrivialDestructor())
OutDiag = diag::note_exits_dtor;
}
}
- return std::make_pair(InDiag, OutDiag);
+ return ScopePair(InDiag, OutDiag);
}
if (const TypedefDecl *TD = dyn_cast<TypedefDecl>(D)) {
if (TD->getUnderlyingType()->isVariablyModifiedType())
- return std::make_pair((unsigned) diag::note_protected_by_vla_typedef, 0);
+ return ScopePair(diag::note_protected_by_vla_typedef, 0);
}
if (const TypeAliasDecl *TD = dyn_cast<TypeAliasDecl>(D)) {
if (TD->getUnderlyingType()->isVariablyModifiedType())
- return std::make_pair((unsigned) diag::note_protected_by_vla_type_alias, 0);
+ return ScopePair(diag::note_protected_by_vla_type_alias, 0);
}
- return std::make_pair(0U, 0U);
+ return ScopePair(0U, 0U);
}
/// \brief Build scope information for a declaration that is part of a DeclStmt.
void JumpScopeChecker::BuildScopeInformation(Decl *D, unsigned &ParentScope) {
- bool isCPlusPlus = this->S.getLangOptions().CPlusPlus;
-
// If this decl causes a new scope, push and switch to it.
- std::pair<unsigned,unsigned> Diags
- = GetDiagForGotoScopeDecl(D, isCPlusPlus);
+ std::pair<unsigned,unsigned> Diags = GetDiagForGotoScopeDecl(S.Context, D);
if (Diags.first || Diags.second) {
Scopes.push_back(GotoScope(ParentScope, Diags.first, Diags.second,
D->getLocation()));
@@ -205,11 +232,55 @@ void JumpScopeChecker::BuildScopeInformation(Decl *D, unsigned &ParentScope) {
BuildScopeInformation(Init, ParentScope);
}
+/// \brief Build scope information for a captured block literal variables.
+void JumpScopeChecker::BuildScopeInformation(VarDecl *D,
+ const BlockDecl *BDecl,
+ unsigned &ParentScope) {
+ // exclude captured __block variables; there's no destructor
+ // associated with the block literal for them.
+ if (D->hasAttr<BlocksAttr>())
+ return;
+ QualType T = D->getType();
+ QualType::DestructionKind destructKind = T.isDestructedType();
+ if (destructKind != QualType::DK_none) {
+ std::pair<unsigned,unsigned> Diags;
+ switch (destructKind) {
+ case QualType::DK_cxx_destructor:
+ Diags = ScopePair(diag::note_enters_block_captures_cxx_obj,
+ diag::note_exits_block_captures_cxx_obj);
+ break;
+ case QualType::DK_objc_strong_lifetime:
+ Diags = ScopePair(diag::note_enters_block_captures_strong,
+ diag::note_exits_block_captures_strong);
+ break;
+ case QualType::DK_objc_weak_lifetime:
+ Diags = ScopePair(diag::note_enters_block_captures_weak,
+ diag::note_exits_block_captures_weak);
+ break;
+ case QualType::DK_none:
+ llvm_unreachable("no-liftime captured variable");
+ }
+ SourceLocation Loc = D->getLocation();
+ if (Loc.isInvalid())
+ Loc = BDecl->getLocation();
+ Scopes.push_back(GotoScope(ParentScope,
+ Diags.first, Diags.second, Loc));
+ ParentScope = Scopes.size()-1;
+ }
+}
+
/// BuildScopeInformation - The statements from CI to CE are known to form a
/// coherent VLA scope with a specified parent node. Walk through the
/// statements, adding any labels or gotos to LabelAndGotoScopes and recursively
/// walking the AST as needed.
-void JumpScopeChecker::BuildScopeInformation(Stmt *S, unsigned ParentScope) {
+void JumpScopeChecker::BuildScopeInformation(Stmt *S, unsigned &origParentScope) {
+ // If this is a statement, rather than an expression, scopes within it don't
+ // propagate out into the enclosing scope. Otherwise we have to worry
+ // about block literals, which have the lifetime of their enclosing statement.
+ unsigned independentParentScope = origParentScope;
+ unsigned &ParentScope = ((isa<Expr>(S) && !isa<StmtExpr>(S))
+ ? origParentScope : independentParentScope);
+
bool SkipFirstSubStmt = false;
// If we found a label, remember that it is in ParentScope scope.
@@ -291,17 +362,17 @@ void JumpScopeChecker::BuildScopeInformation(Stmt *S, unsigned ParentScope) {
BuildScopeInformation(*I, ParentScope);
continue;
}
-
// Disallow jumps into any part of an @try statement by pushing a scope and
// walking all sub-stmts in that scope.
if (ObjCAtTryStmt *AT = dyn_cast<ObjCAtTryStmt>(SubStmt)) {
+ unsigned newParentScope;
// Recursively walk the AST for the @try part.
Scopes.push_back(GotoScope(ParentScope,
diag::note_protected_by_objc_try,
diag::note_exits_objc_try,
AT->getAtTryLoc()));
if (Stmt *TryPart = AT->getTryBody())
- BuildScopeInformation(TryPart, Scopes.size()-1);
+ BuildScopeInformation(TryPart, (newParentScope = Scopes.size()-1));
// Jump from the catch to the finally or try is not valid.
for (unsigned I = 0, N = AT->getNumCatchStmts(); I != N; ++I) {
@@ -311,7 +382,8 @@ void JumpScopeChecker::BuildScopeInformation(Stmt *S, unsigned ParentScope) {
diag::note_exits_objc_catch,
AC->getAtCatchLoc()));
// @catches are nested and it isn't
- BuildScopeInformation(AC->getCatchBody(), Scopes.size()-1);
+ BuildScopeInformation(AC->getCatchBody(),
+ (newParentScope = Scopes.size()-1));
}
// Jump from the finally to the try or catch is not valid.
@@ -320,12 +392,13 @@ void JumpScopeChecker::BuildScopeInformation(Stmt *S, unsigned ParentScope) {
diag::note_protected_by_objc_finally,
diag::note_exits_objc_finally,
AF->getAtFinallyLoc()));
- BuildScopeInformation(AF, Scopes.size()-1);
+ BuildScopeInformation(AF, (newParentScope = Scopes.size()-1));
}
continue;
}
-
+
+ unsigned newParentScope;
// Disallow jumps into the protected statement of an @synchronized, but
// allow jumps into the object expression it protects.
if (ObjCAtSynchronizedStmt *AS = dyn_cast<ObjCAtSynchronizedStmt>(SubStmt)){
@@ -339,7 +412,8 @@ void JumpScopeChecker::BuildScopeInformation(Stmt *S, unsigned ParentScope) {
diag::note_protected_by_objc_synchronized,
diag::note_exits_objc_synchronized,
AS->getAtSynchronizedLoc()));
- BuildScopeInformation(AS->getSynchBody(), Scopes.size()-1);
+ BuildScopeInformation(AS->getSynchBody(),
+ (newParentScope = Scopes.size()-1));
continue;
}
@@ -351,7 +425,7 @@ void JumpScopeChecker::BuildScopeInformation(Stmt *S, unsigned ParentScope) {
diag::note_exits_cxx_try,
TS->getSourceRange().getBegin()));
if (Stmt *TryBlock = TS->getTryBlock())
- BuildScopeInformation(TryBlock, Scopes.size()-1);
+ BuildScopeInformation(TryBlock, (newParentScope = Scopes.size()-1));
// Jump from the catch into the try is not allowed either.
for (unsigned I = 0, E = TS->getNumHandlers(); I != E; ++I) {
@@ -360,12 +434,34 @@ void JumpScopeChecker::BuildScopeInformation(Stmt *S, unsigned ParentScope) {
diag::note_protected_by_cxx_catch,
diag::note_exits_cxx_catch,
CS->getSourceRange().getBegin()));
- BuildScopeInformation(CS->getHandlerBlock(), Scopes.size()-1);
+ BuildScopeInformation(CS->getHandlerBlock(),
+ (newParentScope = Scopes.size()-1));
}
continue;
}
+ // Disallow jumps into the protected statement of an @autoreleasepool.
+ if (ObjCAutoreleasePoolStmt *AS = dyn_cast<ObjCAutoreleasePoolStmt>(SubStmt)){
+ // Recursively walk the AST for the @autoreleasepool part, protected by a new
+ // scope.
+ Scopes.push_back(GotoScope(ParentScope,
+ diag::note_protected_by_objc_autoreleasepool,
+ diag::note_exits_objc_autoreleasepool,
+ AS->getAtLoc()));
+ BuildScopeInformation(AS->getSubStmt(), (newParentScope = Scopes.size()-1));
+ continue;
+ }
+
+ if (const BlockExpr *BE = dyn_cast<BlockExpr>(SubStmt)) {
+ const BlockDecl *BDecl = BE->getBlockDecl();
+ for (BlockDecl::capture_const_iterator ci = BDecl->capture_begin(),
+ ce = BDecl->capture_end(); ci != ce; ++ci) {
+ VarDecl *variable = ci->getVariable();
+ BuildScopeInformation(variable, BDecl, ParentScope);
+ }
+ }
+
// Recursively walk the AST.
BuildScopeInformation(SubStmt, ParentScope);
}
diff --git a/contrib/llvm/tools/clang/lib/Sema/Sema.cpp b/contrib/llvm/tools/clang/lib/Sema/Sema.cpp
index 8297b31..fdf3bb3 100644
--- a/contrib/llvm/tools/clang/lib/Sema/Sema.cpp
+++ b/contrib/llvm/tools/clang/lib/Sema/Sema.cpp
@@ -141,9 +141,9 @@ Sema::Sema(Preprocessor &pp, ASTContext &ctxt, ASTConsumer &consumer,
: TheTargetAttributesSema(0), FPFeatures(pp.getLangOptions()),
LangOpts(pp.getLangOptions()), PP(pp), Context(ctxt), Consumer(consumer),
Diags(PP.getDiagnostics()), SourceMgr(PP.getSourceManager()),
- ExternalSource(0), CodeCompleter(CodeCompleter), CurContext(0),
- PackContext(0), MSStructPragmaOn(false), VisContext(0),
- LateTemplateParser(0), OpaqueParser(0),
+ CollectStats(false), ExternalSource(0), CodeCompleter(CodeCompleter),
+ CurContext(0), PackContext(0), MSStructPragmaOn(false), VisContext(0),
+ ExprNeedsCleanups(0), LateTemplateParser(0), OpaqueParser(0),
IdResolver(pp.getLangOptions()), CXXTypeInfoDecl(0), MSVCGuidDecl(0),
GlobalNewDeleteDeclared(false),
CompleteTranslationUnit(CompleteTranslationUnit),
@@ -154,6 +154,8 @@ Sema::Sema(Preprocessor &pp, ASTContext &ctxt, ASTConsumer &consumer,
AnalysisWarnings(*this)
{
TUScope = 0;
+ LoadedExternalKnownNamespaces = false;
+
if (getLangOptions().CPlusPlus)
FieldCollector.reset(new CXXFieldCollector());
@@ -162,7 +164,7 @@ Sema::Sema(Preprocessor &pp, ASTContext &ctxt, ASTConsumer &consumer,
&Context);
ExprEvalContexts.push_back(
- ExpressionEvaluationContextRecord(PotentiallyEvaluated, 0));
+ ExpressionEvaluationContextRecord(PotentiallyEvaluated, 0, false));
FunctionScopes.push_back(new FunctionScopeInfo(Diags));
}
@@ -202,22 +204,61 @@ Sema::~Sema() {
ExternalSema->ForgetSema();
}
+
+/// makeUnavailableInSystemHeader - There is an error in the current
+/// context. If we're still in a system header, and we can plausibly
+/// make the relevant declaration unavailable instead of erroring, do
+/// so and return true.
+bool Sema::makeUnavailableInSystemHeader(SourceLocation loc,
+ llvm::StringRef msg) {
+ // If we're not in a function, it's an error.
+ FunctionDecl *fn = dyn_cast<FunctionDecl>(CurContext);
+ if (!fn) return false;
+
+ // If we're in template instantiation, it's an error.
+ if (!ActiveTemplateInstantiations.empty())
+ return false;
+
+ // If that function's not in a system header, it's an error.
+ if (!Context.getSourceManager().isInSystemHeader(loc))
+ return false;
+
+ // If the function is already unavailable, it's not an error.
+ if (fn->hasAttr<UnavailableAttr>()) return true;
+
+ fn->addAttr(new (Context) UnavailableAttr(loc, Context, msg));
+ return true;
+}
+
ASTMutationListener *Sema::getASTMutationListener() const {
return getASTConsumer().GetASTMutationListener();
}
+/// \brief Print out statistics about the semantic analysis.
+void Sema::PrintStats() const {
+ llvm::errs() << "\n*** Semantic Analysis Stats:\n";
+ llvm::errs() << NumSFINAEErrors << " SFINAE diagnostics trapped.\n";
+
+ BumpAlloc.PrintStats();
+ AnalysisWarnings.PrintStats();
+}
+
/// ImpCastExprToType - If Expr is not of type 'Type', insert an implicit cast.
/// If there is already an implicit cast, merge into the existing one.
/// The result is of the given category.
ExprResult Sema::ImpCastExprToType(Expr *E, QualType Ty,
CastKind Kind, ExprValueKind VK,
- const CXXCastPath *BasePath) {
+ const CXXCastPath *BasePath,
+ CheckedConversionKind CCK) {
QualType ExprTy = Context.getCanonicalType(E->getType());
QualType TypeTy = Context.getCanonicalType(Ty);
if (ExprTy == TypeTy)
return Owned(E);
+ if (getLangOptions().ObjCAutoRefCount)
+ CheckObjCARCConversion(SourceRange(), Ty, E, CCK);
+
// If this is a derived-to-base cast to a through a virtual base, we
// need a vtable.
if (Kind == CK_DerivedToBase &&
@@ -729,8 +770,8 @@ void Sema::PopFunctionOrBlockScope(const AnalysisBasedWarnings::Policy *WP,
/// \brief Determine whether any errors occurred within this function/method/
/// block.
-bool Sema::hasAnyErrorsInThisFunction() const {
- return getCurFunction()->ErrorTrap.hasErrorOccurred();
+bool Sema::hasAnyUnrecoverableErrorsInThisFunction() const {
+ return getCurFunction()->ErrorTrap.hasUnrecoverableErrorOccurred();
}
BlockScopeInfo *Sema::getCurBlock() {
@@ -748,6 +789,10 @@ ExternalSemaSource::ReadMethodPool(Selector Sel) {
return std::pair<ObjCMethodList, ObjCMethodList>();
}
+void ExternalSemaSource::ReadKnownNamespaces(
+ llvm::SmallVectorImpl<NamespaceDecl *> &Namespaces) {
+}
+
void PrettyDeclStackTraceEntry::print(llvm::raw_ostream &OS) const {
SourceLocation Loc = this->Loc;
if (!Loc.isValid() && TheDecl) Loc = TheDecl->getLocation();
diff --git a/contrib/llvm/tools/clang/lib/Sema/SemaCXXCast.cpp b/contrib/llvm/tools/clang/lib/Sema/SemaCXXCast.cpp
index e46ad5b..d053d5a 100644
--- a/contrib/llvm/tools/clang/lib/Sema/SemaCXXCast.cpp
+++ b/contrib/llvm/tools/clang/lib/Sema/SemaCXXCast.cpp
@@ -63,7 +63,8 @@ static void CheckDynamicCast(Sema &Self, ExprResult &SrcExpr, QualType DestType,
CastKind &Kind,
CXXCastPath &BasePath);
-static bool CastsAwayConstness(Sema &Self, QualType SrcType, QualType DestType);
+static bool CastsAwayConstness(Sema &Self, QualType SrcType, QualType DestType,
+ bool CheckCVR, bool CheckObjCLifetime);
// The Try functions attempt a specific way of casting. If they succeed, they
// return TC_Success. If their way of casting is not appropriate for the given
@@ -109,12 +110,14 @@ static TryCastResult TryStaticMemberPointerUpcast(Sema &Self, ExprResult &SrcExp
CXXCastPath &BasePath);
static TryCastResult TryStaticImplicitCast(Sema &Self, ExprResult &SrcExpr,
- QualType DestType, bool CStyle,
+ QualType DestType,
+ Sema::CheckedConversionKind CCK,
const SourceRange &OpRange,
unsigned &msg,
CastKind &Kind);
static TryCastResult TryStaticCast(Sema &Self, ExprResult &SrcExpr,
- QualType DestType, bool CStyle,
+ QualType DestType,
+ Sema::CheckedConversionKind CCK,
const SourceRange &OpRange,
unsigned &msg,
CastKind &Kind,
@@ -131,17 +134,23 @@ static TryCastResult TryReinterpretCast(Sema &Self, ExprResult &SrcExpr,
/// ActOnCXXNamedCast - Parse {dynamic,static,reinterpret,const}_cast's.
ExprResult
Sema::ActOnCXXNamedCast(SourceLocation OpLoc, tok::TokenKind Kind,
- SourceLocation LAngleBracketLoc, ParsedType Ty,
+ SourceLocation LAngleBracketLoc, Declarator &D,
SourceLocation RAngleBracketLoc,
SourceLocation LParenLoc, Expr *E,
SourceLocation RParenLoc) {
-
- TypeSourceInfo *DestTInfo;
- QualType DestType = GetTypeFromParser(Ty, &DestTInfo);
- if (!DestTInfo)
- DestTInfo = Context.getTrivialTypeSourceInfo(DestType, SourceLocation());
- return BuildCXXNamedCast(OpLoc, Kind, DestTInfo, move(E),
+ assert(!D.isInvalidType());
+
+ TypeSourceInfo *TInfo = GetTypeForDeclaratorCast(D, E->getType());
+ if (D.isInvalidType())
+ return ExprError();
+
+ if (getLangOptions().CPlusPlus) {
+ // Check that there are no default arguments (C++ only).
+ CheckExtraCXXDefaultArguments(D);
+ }
+
+ return BuildCXXNamedCast(OpLoc, Kind, TInfo, move(E),
SourceRange(LAngleBracketLoc, RAngleBracketLoc),
SourceRange(LParenLoc, RParenLoc));
}
@@ -248,8 +257,10 @@ static bool tryDiagnoseOverloadedCast(Sema &S, CastType CT,
InitializedEntity entity = InitializedEntity::InitializeTemporary(destType);
InitializationKind initKind
- = InitializationKind::CreateCast(/*type range?*/ range,
- (CT == CT_CStyle || CT == CT_Functional));
+ = (CT == CT_CStyle)? InitializationKind::CreateCStyleCast(range.getBegin(),
+ range)
+ : (CT == CT_Functional)? InitializationKind::CreateFunctionalCast(range)
+ : InitializationKind::CreateCast(/*type range?*/ range);
InitializationSequence sequence(S, entity, initKind, &src, 1);
assert(sequence.Failed() && "initialization succeeded on second try?");
@@ -373,8 +384,19 @@ static bool UnwrapDissimilarPointerTypes(QualType& T1, QualType& T2) {
/// DestType casts away constness as defined in C++ 5.2.11p8ff. This is used by
/// the cast checkers. Both arguments must denote pointer (possibly to member)
/// types.
+///
+/// \param CheckCVR Whether to check for const/volatile/restrict qualifiers.
+///
+/// \param CheckObjCLifetime Whether to check Objective-C lifetime qualifiers.
static bool
-CastsAwayConstness(Sema &Self, QualType SrcType, QualType DestType) {
+CastsAwayConstness(Sema &Self, QualType SrcType, QualType DestType,
+ bool CheckCVR, bool CheckObjCLifetime) {
+ // If the only checking we care about is for Objective-C lifetime qualifiers,
+ // and we're not in ARC mode, there's nothing to check.
+ if (!CheckCVR && CheckObjCLifetime &&
+ !Self.Context.getLangOptions().ObjCAutoRefCount)
+ return false;
+
// Casting away constness is defined in C++ 5.2.11p8 with reference to
// C++ 4.4. We piggyback on Sema::IsQualificationConversion for this, since
// the rules are non-trivial. So first we construct Tcv *...cv* as described
@@ -394,13 +416,23 @@ CastsAwayConstness(Sema &Self, QualType SrcType, QualType DestType) {
// purpose of this check, because other qualifiers (address spaces,
// Objective-C GC, etc.) are part of the type's identity.
while (UnwrapDissimilarPointerTypes(UnwrappedSrcType, UnwrappedDestType)) {
- Qualifiers SrcQuals;
+ // Determine the relevant qualifiers at this level.
+ Qualifiers SrcQuals, DestQuals;
Self.Context.getUnqualifiedArrayType(UnwrappedSrcType, SrcQuals);
- cv1.push_back(Qualifiers::fromCVRMask(SrcQuals.getCVRQualifiers()));
-
- Qualifiers DestQuals;
Self.Context.getUnqualifiedArrayType(UnwrappedDestType, DestQuals);
- cv2.push_back(Qualifiers::fromCVRMask(DestQuals.getCVRQualifiers()));
+
+ Qualifiers RetainedSrcQuals, RetainedDestQuals;
+ if (CheckCVR) {
+ RetainedSrcQuals.setCVRQualifiers(SrcQuals.getCVRQualifiers());
+ RetainedDestQuals.setCVRQualifiers(DestQuals.getCVRQualifiers());
+ }
+
+ if (CheckObjCLifetime &&
+ !DestQuals.compatiblyIncludesObjCLifetime(SrcQuals))
+ return true;
+
+ cv1.push_back(RetainedSrcQuals);
+ cv2.push_back(RetainedDestQuals);
}
if (cv1.empty())
return false;
@@ -420,8 +452,10 @@ CastsAwayConstness(Sema &Self, QualType SrcType, QualType DestType) {
}
// Test if they're compatible.
+ bool ObjCLifetimeConversion;
return SrcConstruct != DestConstruct &&
- !Self.IsQualificationConversion(SrcConstruct, DestConstruct, false);
+ !Self.IsQualificationConversion(SrcConstruct, DestConstruct, false,
+ ObjCLifetimeConversion);
}
/// CheckDynamicCast - Check that a dynamic_cast\<DestType\>(SrcExpr) is valid.
@@ -595,9 +629,10 @@ CheckReinterpretCast(Sema &Self, ExprResult &SrcExpr, QualType DestType,
}
unsigned msg = diag::err_bad_cxx_cast_generic;
- if (TryReinterpretCast(Self, SrcExpr, DestType, /*CStyle*/false, OpRange,
- msg, Kind)
- != TC_Success && msg != 0)
+ TryCastResult tcr =
+ TryReinterpretCast(Self, SrcExpr, DestType,
+ /*CStyle*/false, OpRange, msg, Kind);
+ if (tcr != TC_Success && msg != 0)
{
if (SrcExpr.isInvalid()) // if conversion failed, don't report another error
return;
@@ -611,7 +646,12 @@ CheckReinterpretCast(Sema &Self, ExprResult &SrcExpr, QualType DestType,
} else {
diagnoseBadCast(Self, msg, CT_Reinterpret, OpRange, SrcExpr.get(), DestType);
}
- }
+ } else if (tcr == TC_Success && Self.getLangOptions().ObjCAutoRefCount) {
+ Expr *Exp = SrcExpr.get();
+ // Note that Exp does not change with CCK_OtherCast cast type
+ Self.CheckObjCARCConversion(OpRange, DestType,
+ Exp, Sema::CCK_OtherCast);
+ }
}
@@ -654,8 +694,10 @@ CheckStaticCast(Sema &Self, ExprResult &SrcExpr, QualType DestType,
}
unsigned msg = diag::err_bad_cxx_cast_generic;
- if (TryStaticCast(Self, SrcExpr, DestType, /*CStyle*/false, OpRange, msg,
- Kind, BasePath) != TC_Success && msg != 0) {
+ TryCastResult tcr
+ = TryStaticCast(Self, SrcExpr, DestType, Sema::CCK_OtherCast, OpRange, msg,
+ Kind, BasePath);
+ if (tcr != TC_Success && msg != 0) {
if (SrcExpr.isInvalid())
return;
if (SrcExpr.get()->getType() == Self.Context.OverloadTy) {
@@ -667,6 +709,15 @@ CheckStaticCast(Sema &Self, ExprResult &SrcExpr, QualType DestType,
} else {
diagnoseBadCast(Self, msg, CT_Static, OpRange, SrcExpr.get(), DestType);
}
+ } else if (tcr == TC_Success) {
+ if (Kind == CK_BitCast)
+ Self.CheckCastAlign(SrcExpr.get(), DestType, OpRange);
+ if (Self.getLangOptions().ObjCAutoRefCount) {
+ Expr *Exp = SrcExpr.get();
+ // Note that Exp does not change with CCK_OtherCast cast type
+ Self.CheckObjCARCConversion(OpRange, DestType,
+ Exp, Sema::CCK_OtherCast);
+ }
}
else if (Kind == CK_BitCast)
Self.CheckCastAlign(SrcExpr.get(), DestType, OpRange);
@@ -676,10 +727,15 @@ CheckStaticCast(Sema &Self, ExprResult &SrcExpr, QualType DestType,
/// possible. If @p CStyle, ignore access restrictions on hierarchy casting
/// and casting away constness.
static TryCastResult TryStaticCast(Sema &Self, ExprResult &SrcExpr,
- QualType DestType, bool CStyle,
+ QualType DestType,
+ Sema::CheckedConversionKind CCK,
const SourceRange &OpRange, unsigned &msg,
CastKind &Kind,
CXXCastPath &BasePath) {
+ // Determine whether we have the semantics of a C-style cast.
+ bool CStyle
+ = (CCK == Sema::CCK_CStyleCast || CCK == Sema::CCK_FunctionalCast);
+
// The order the tests is not entirely arbitrary. There is one conversion
// that can be handled in two different ways. Given:
// struct A {};
@@ -715,7 +771,7 @@ static TryCastResult TryStaticCast(Sema &Self, ExprResult &SrcExpr,
// C++ 5.2.9p2: An expression e can be explicitly converted to a type T
// [...] if the declaration "T t(e);" is well-formed, [...].
- tcr = TryStaticImplicitCast(Self, SrcExpr, DestType, CStyle, OpRange, msg,
+ tcr = TryStaticImplicitCast(Self, SrcExpr, DestType, CCK, OpRange, msg,
Kind);
if (SrcExpr.isInvalid())
return TC_Failed;
@@ -792,10 +848,20 @@ static TryCastResult TryStaticCast(Sema &Self, ExprResult &SrcExpr,
QualType DestPointee = DestPointer->getPointeeType();
if (DestPointee->isIncompleteOrObjectType()) {
// This is definitely the intended conversion, but it might fail due
- // to a const violation.
- if (!CStyle && !DestPointee.isAtLeastAsQualifiedAs(SrcPointee)) {
- msg = diag::err_bad_cxx_cast_qualifiers_away;
- return TC_Failed;
+ // to a qualifier violation. Note that we permit Objective-C lifetime
+ // and GC qualifier mismatches here.
+ if (!CStyle) {
+ Qualifiers DestPointeeQuals = DestPointee.getQualifiers();
+ Qualifiers SrcPointeeQuals = SrcPointee.getQualifiers();
+ DestPointeeQuals.removeObjCGCAttr();
+ DestPointeeQuals.removeObjCLifetime();
+ SrcPointeeQuals.removeObjCGCAttr();
+ SrcPointeeQuals.removeObjCLifetime();
+ if (DestPointeeQuals != SrcPointeeQuals &&
+ !DestPointeeQuals.compatiblyIncludes(SrcPointeeQuals)) {
+ msg = diag::err_bad_cxx_cast_qualifiers_away;
+ return TC_Failed;
+ }
}
Kind = CK_BitCast;
return TC_Success;
@@ -845,6 +911,7 @@ TryLValueToRValueCast(Sema &Self, Expr *SrcExpr, QualType DestType,
// FIXME: Should allow casting away constness if CStyle.
bool DerivedToBase;
bool ObjCConversion;
+ bool ObjCLifetimeConversion;
QualType FromType = SrcExpr->getType();
QualType ToType = R->getPointeeType();
if (CStyle) {
@@ -854,8 +921,9 @@ TryLValueToRValueCast(Sema &Self, Expr *SrcExpr, QualType DestType,
if (Self.CompareReferenceRelationship(SrcExpr->getLocStart(),
ToType, FromType,
- DerivedToBase, ObjCConversion) <
- Sema::Ref_Compatible_With_Added_Qualification) {
+ DerivedToBase, ObjCConversion,
+ ObjCLifetimeConversion)
+ < Sema::Ref_Compatible_With_Added_Qualification) {
msg = diag::err_bad_lvalue_to_rvalue_cast;
return TC_Failed;
}
@@ -1172,7 +1240,8 @@ TryStaticMemberPointerUpcast(Sema &Self, ExprResult &SrcExpr, QualType SrcType,
/// @c static_cast if the declaration "T t(e);" is well-formed [...].
TryCastResult
TryStaticImplicitCast(Sema &Self, ExprResult &SrcExpr, QualType DestType,
- bool CStyle, const SourceRange &OpRange, unsigned &msg,
+ Sema::CheckedConversionKind CCK,
+ const SourceRange &OpRange, unsigned &msg,
CastKind &Kind) {
if (DestType->isRecordType()) {
if (Self.RequireCompleteType(OpRange.getBegin(), DestType,
@@ -1184,7 +1253,11 @@ TryStaticImplicitCast(Sema &Self, ExprResult &SrcExpr, QualType DestType,
InitializedEntity Entity = InitializedEntity::InitializeTemporary(DestType);
InitializationKind InitKind
- = InitializationKind::CreateCast(/*FIXME:*/OpRange, CStyle);
+ = (CCK == Sema::CCK_CStyleCast)
+ ? InitializationKind::CreateCStyleCast(OpRange.getBegin(), OpRange)
+ : (CCK == Sema::CCK_FunctionalCast)
+ ? InitializationKind::CreateFunctionalCast(OpRange)
+ : InitializationKind::CreateCast(OpRange);
Expr *SrcExprRaw = SrcExpr.get();
InitializationSequence InitSeq(Self, Entity, InitKind, &SrcExprRaw, 1);
@@ -1193,7 +1266,8 @@ TryStaticImplicitCast(Sema &Self, ExprResult &SrcExpr, QualType DestType,
// There is no other way that works.
// On the other hand, if we're checking a C-style cast, we've still got
// the reinterpret_cast way.
-
+ bool CStyle
+ = (CCK == Sema::CCK_CStyleCast || CCK == Sema::CCK_FunctionalCast);
if (InitSeq.Failed() && (CStyle || !DestType->isReferenceType()))
return TC_NotApplicable;
@@ -1428,7 +1502,8 @@ static TryCastResult TryReinterpretCast(Sema &Self, ExprResult &SrcExpr,
// constness.
// A reinterpret_cast followed by a const_cast can, though, so in C-style,
// we accept it.
- if (!CStyle && CastsAwayConstness(Self, SrcType, DestType)) {
+ if (CastsAwayConstness(Self, SrcType, DestType, /*CheckCVR=*/!CStyle,
+ /*CheckObjCLifetime=*/CStyle)) {
msg = diag::err_bad_cxx_cast_qualifiers_away;
return TC_Failed;
}
@@ -1543,7 +1618,8 @@ static TryCastResult TryReinterpretCast(Sema &Self, ExprResult &SrcExpr,
// C++ 5.2.10p2: The reinterpret_cast operator shall not cast away constness.
// The C-style cast operator can.
- if (!CStyle && CastsAwayConstness(Self, SrcType, DestType)) {
+ if (CastsAwayConstness(Self, SrcType, DestType, /*CheckCVR=*/!CStyle,
+ /*CheckObjCLifetime=*/CStyle)) {
msg = diag::err_bad_cxx_cast_qualifiers_away;
return TC_Failed;
}
@@ -1675,11 +1751,14 @@ Sema::CXXCheckCStyleCast(SourceRange R, QualType CastTy, ExprValueKind &VK,
if (tcr == TC_Success)
Kind = CK_NoOp;
+ Sema::CheckedConversionKind CCK
+ = FunctionalStyle? Sema::CCK_FunctionalCast
+ : Sema::CCK_CStyleCast;
if (tcr == TC_NotApplicable) {
// ... or if that is not possible, a static_cast, ignoring const, ...
ExprResult CastExprRes = Owned(CastExpr);
- tcr = TryStaticCast(*this, CastExprRes, CastTy, /*CStyle*/true, R, msg,
- Kind, BasePath);
+ tcr = TryStaticCast(*this, CastExprRes, CastTy, CCK, R, msg, Kind,
+ BasePath);
if (CastExprRes.isInvalid())
return ExprError();
CastExpr = CastExprRes.take();
@@ -1694,6 +1773,9 @@ Sema::CXXCheckCStyleCast(SourceRange R, QualType CastTy, ExprValueKind &VK,
}
}
+ if (getLangOptions().ObjCAutoRefCount && tcr == TC_Success)
+ CheckObjCARCConversion(R, CastTy, CastExpr, CCK);
+
if (tcr != TC_Success && msg != 0) {
if (CastExpr->getType() == Context.OverloadTy) {
DeclAccessPair Found;
diff --git a/contrib/llvm/tools/clang/lib/Sema/SemaCXXScopeSpec.cpp b/contrib/llvm/tools/clang/lib/Sema/SemaCXXScopeSpec.cpp
index 61d9e93..5f8c9c6 100644
--- a/contrib/llvm/tools/clang/lib/Sema/SemaCXXScopeSpec.cpp
+++ b/contrib/llvm/tools/clang/lib/Sema/SemaCXXScopeSpec.cpp
@@ -211,25 +211,40 @@ bool Sema::RequireCompleteDeclContext(CXXScopeSpec &SS,
DeclContext *DC) {
assert(DC != 0 && "given null context");
- if (TagDecl *Tag = dyn_cast<TagDecl>(DC)) {
+ if (TagDecl *tag = dyn_cast<TagDecl>(DC)) {
// If this is a dependent type, then we consider it complete.
- if (Tag->isDependentContext())
+ if (tag->isDependentContext())
return false;
// If we're currently defining this type, then lookup into the
// type is okay: don't complain that it isn't complete yet.
- const TagType *TagT = Context.getTypeDeclType(Tag)->getAs<TagType>();
- if (TagT && TagT->isBeingDefined())
+ QualType type = Context.getTypeDeclType(tag);
+ const TagType *tagType = type->getAs<TagType>();
+ if (tagType && tagType->isBeingDefined())
return false;
+ SourceLocation loc = SS.getLastQualifierNameLoc();
+ if (loc.isInvalid()) loc = SS.getRange().getBegin();
+
// The type must be complete.
- if (RequireCompleteType(SS.getRange().getBegin(),
- Context.getTypeDeclType(Tag),
+ if (RequireCompleteType(loc, type,
PDiag(diag::err_incomplete_nested_name_spec)
<< SS.getRange())) {
SS.SetInvalid(SS.getRange());
return true;
}
+
+ // Fixed enum types are complete, but they aren't valid as scopes
+ // until we see a definition, so awkwardly pull out this special
+ // case.
+ if (const EnumType *enumType = dyn_cast_or_null<EnumType>(tagType)) {
+ if (!enumType->getDecl()->isDefinition()) {
+ Diag(loc, diag::err_incomplete_nested_name_spec)
+ << type << SS.getRange();
+ SS.SetInvalid(SS.getRange());
+ return true;
+ }
+ }
}
return false;
@@ -464,26 +479,29 @@ bool Sema::BuildCXXNestedNameSpecifier(Scope *S,
// We haven't found anything, and we're not recovering from a
// different kind of error, so look for typos.
DeclarationName Name = Found.getLookupName();
- if (CorrectTypo(Found, S, &SS, LookupCtx, EnteringContext,
- CTC_NoKeywords) &&
- Found.isSingleResult() &&
- isAcceptableNestedNameSpecifier(Found.getAsSingle<NamedDecl>())) {
+ TypoCorrection Corrected;
+ Found.clear();
+ if ((Corrected = CorrectTypo(Found.getLookupNameInfo(),
+ Found.getLookupKind(), S, &SS, LookupCtx,
+ EnteringContext, CTC_NoKeywords)) &&
+ isAcceptableNestedNameSpecifier(Corrected.getCorrectionDecl())) {
+ std::string CorrectedStr(Corrected.getAsString(getLangOptions()));
+ std::string CorrectedQuotedStr(Corrected.getQuoted(getLangOptions()));
if (LookupCtx)
Diag(Found.getNameLoc(), diag::err_no_member_suggest)
- << Name << LookupCtx << Found.getLookupName() << SS.getRange()
- << FixItHint::CreateReplacement(Found.getNameLoc(),
- Found.getLookupName().getAsString());
+ << Name << LookupCtx << CorrectedQuotedStr << SS.getRange()
+ << FixItHint::CreateReplacement(Found.getNameLoc(), CorrectedStr);
else
Diag(Found.getNameLoc(), diag::err_undeclared_var_use_suggest)
- << Name << Found.getLookupName()
- << FixItHint::CreateReplacement(Found.getNameLoc(),
- Found.getLookupName().getAsString());
+ << Name << CorrectedQuotedStr
+ << FixItHint::CreateReplacement(Found.getNameLoc(), CorrectedStr);
- if (NamedDecl *ND = Found.getAsSingle<NamedDecl>())
- Diag(ND->getLocation(), diag::note_previous_decl)
- << ND->getDeclName();
+ if (NamedDecl *ND = Corrected.getCorrectionDecl()) {
+ Diag(ND->getLocation(), diag::note_previous_decl) << CorrectedQuotedStr;
+ Found.addDecl(ND);
+ }
+ Found.setLookupName(Corrected.getCorrection());
} else {
- Found.clear();
Found.setLookupName(&Identifier);
}
}
diff --git a/contrib/llvm/tools/clang/lib/Sema/SemaChecking.cpp b/contrib/llvm/tools/clang/lib/Sema/SemaChecking.cpp
index 7e22b33..b032b8a 100644
--- a/contrib/llvm/tools/clang/lib/Sema/SemaChecking.cpp
+++ b/contrib/llvm/tools/clang/lib/Sema/SemaChecking.cpp
@@ -22,6 +22,7 @@
#include "clang/AST/DeclObjC.h"
#include "clang/AST/ExprCXX.h"
#include "clang/AST/ExprObjC.h"
+#include "clang/AST/EvaluatedExprVisitor.h"
#include "clang/AST/DeclObjC.h"
#include "clang/AST/StmtCXX.h"
#include "clang/AST/StmtObjC.h"
@@ -319,12 +320,41 @@ bool Sema::CheckFunctionCall(FunctionDecl *FDecl, CallExpr *TheCall) {
}
// Memset/memcpy/memmove handling
- if (FDecl->getLinkage() == ExternalLinkage &&
- (!getLangOptions().CPlusPlus || FDecl->isExternC())) {
- if (FnInfo->isStr("memset") || FnInfo->isStr("memcpy") ||
- FnInfo->isStr("memmove"))
- CheckMemsetcpymoveArguments(TheCall, FnInfo);
+ int CMF = -1;
+ switch (FDecl->getBuiltinID()) {
+ case Builtin::BI__builtin_memset:
+ case Builtin::BI__builtin___memset_chk:
+ case Builtin::BImemset:
+ CMF = CMF_Memset;
+ break;
+
+ case Builtin::BI__builtin_memcpy:
+ case Builtin::BI__builtin___memcpy_chk:
+ case Builtin::BImemcpy:
+ CMF = CMF_Memcpy;
+ break;
+
+ case Builtin::BI__builtin_memmove:
+ case Builtin::BI__builtin___memmove_chk:
+ case Builtin::BImemmove:
+ CMF = CMF_Memmove;
+ break;
+
+ default:
+ if (FDecl->getLinkage() == ExternalLinkage &&
+ (!getLangOptions().CPlusPlus || FDecl->isExternC())) {
+ if (FnInfo->isStr("memset"))
+ CMF = CMF_Memset;
+ else if (FnInfo->isStr("memcpy"))
+ CMF = CMF_Memcpy;
+ else if (FnInfo->isStr("memmove"))
+ CMF = CMF_Memmove;
+ }
+ break;
}
+
+ if (CMF != -1)
+ CheckMemsetcpymoveArguments(TheCall, CheckedMemoryFunction(CMF), FnInfo);
return false;
}
@@ -382,14 +412,14 @@ Sema::SemaBuiltinAtomicOverloaded(ExprResult TheCallResult) {
// casts here.
// FIXME: We don't allow floating point scalars as input.
Expr *FirstArg = TheCall->getArg(0);
- if (!FirstArg->getType()->isPointerType()) {
+ const PointerType *pointerType = FirstArg->getType()->getAs<PointerType>();
+ if (!pointerType) {
Diag(DRE->getLocStart(), diag::err_atomic_builtin_must_be_pointer)
<< FirstArg->getType() << FirstArg->getSourceRange();
return ExprError();
}
- QualType ValType =
- FirstArg->getType()->getAs<PointerType>()->getPointeeType();
+ QualType ValType = pointerType->getPointeeType();
if (!ValType->isIntegerType() && !ValType->isAnyPointerType() &&
!ValType->isBlockPointerType()) {
Diag(DRE->getLocStart(), diag::err_atomic_builtin_must_be_pointer_intptr)
@@ -397,6 +427,20 @@ Sema::SemaBuiltinAtomicOverloaded(ExprResult TheCallResult) {
return ExprError();
}
+ switch (ValType.getObjCLifetime()) {
+ case Qualifiers::OCL_None:
+ case Qualifiers::OCL_ExplicitNone:
+ // okay
+ break;
+
+ case Qualifiers::OCL_Weak:
+ case Qualifiers::OCL_Strong:
+ case Qualifiers::OCL_Autoreleasing:
+ Diag(DRE->getLocStart(), diag::err_arc_atomic_ownership)
+ << ValType << FirstArg->getSourceRange();
+ return ExprError();
+ }
+
// The majority of builtins return a value, but a few have special return
// types, so allow them to override appropriately below.
QualType ResultType = ValType;
@@ -518,7 +562,8 @@ Sema::SemaBuiltinAtomicOverloaded(ExprResult TheCallResult) {
CastKind Kind = CK_Invalid;
ExprValueKind VK = VK_RValue;
CXXCastPath BasePath;
- Arg = CheckCastTypes(Arg.get()->getSourceRange(), ValType, Arg.take(), Kind, VK, BasePath);
+ Arg = CheckCastTypes(Arg.get()->getLocStart(), Arg.get()->getSourceRange(),
+ ValType, Arg.take(), Kind, VK, BasePath);
if (Arg.isInvalid())
return ExprError();
@@ -1847,6 +1892,27 @@ static bool isDynamicClassType(QualType T) {
return false;
}
+/// \brief If E is a sizeof expression, returns its argument expression,
+/// otherwise returns NULL.
+static const Expr *getSizeOfExprArg(const Expr* E) {
+ if (const UnaryExprOrTypeTraitExpr *SizeOf =
+ dyn_cast<UnaryExprOrTypeTraitExpr>(E))
+ if (SizeOf->getKind() == clang::UETT_SizeOf && !SizeOf->isArgumentType())
+ return SizeOf->getArgumentExpr()->IgnoreParenImpCasts();
+
+ return 0;
+}
+
+/// \brief If E is a sizeof expression, returns its argument type.
+static QualType getSizeOfArgType(const Expr* E) {
+ if (const UnaryExprOrTypeTraitExpr *SizeOf =
+ dyn_cast<UnaryExprOrTypeTraitExpr>(E))
+ if (SizeOf->getKind() == clang::UETT_SizeOf)
+ return SizeOf->getTypeOfArgument();
+
+ return QualType();
+}
+
/// \brief Check for dangerous or invalid arguments to memset().
///
/// This issues warnings on known problematic, dangerous or unspecified
@@ -1854,35 +1920,95 @@ static bool isDynamicClassType(QualType T) {
///
/// \param Call The call expression to diagnose.
void Sema::CheckMemsetcpymoveArguments(const CallExpr *Call,
- const IdentifierInfo *FnName) {
+ CheckedMemoryFunction CMF,
+ IdentifierInfo *FnName) {
// It is possible to have a non-standard definition of memset. Validate
- // we have the proper number of arguments, and if not, abort further
- // checking.
- if (Call->getNumArgs() != 3)
+ // we have enough arguments, and if not, abort further checking.
+ if (Call->getNumArgs() < 3)
return;
- unsigned LastArg = FnName->isStr("memset")? 1 : 2;
+ unsigned LastArg = (CMF == CMF_Memset? 1 : 2);
+ const Expr *LenExpr = Call->getArg(2)->IgnoreParenImpCasts();
+
+ // We have special checking when the length is a sizeof expression.
+ QualType SizeOfArgTy = getSizeOfArgType(LenExpr);
+ const Expr *SizeOfArg = getSizeOfExprArg(LenExpr);
+ llvm::FoldingSetNodeID SizeOfArgID;
+
for (unsigned ArgIdx = 0; ArgIdx != LastArg; ++ArgIdx) {
const Expr *Dest = Call->getArg(ArgIdx)->IgnoreParenImpCasts();
+ SourceRange ArgRange = Call->getArg(ArgIdx)->getSourceRange();
QualType DestTy = Dest->getType();
if (const PointerType *DestPtrTy = DestTy->getAs<PointerType>()) {
QualType PointeeTy = DestPtrTy->getPointeeType();
+
+ // Never warn about void type pointers. This can be used to suppress
+ // false positives.
if (PointeeTy->isVoidType())
continue;
+ // Catch "memset(p, 0, sizeof(p))" -- needs to be sizeof(*p). Do this by
+ // actually comparing the expressions for equality. Because computing the
+ // expression IDs can be expensive, we only do this if the diagnostic is
+ // enabled.
+ if (SizeOfArg &&
+ Diags.getDiagnosticLevel(diag::warn_sizeof_pointer_expr_memaccess,
+ SizeOfArg->getExprLoc())) {
+ // We only compute IDs for expressions if the warning is enabled, and
+ // cache the sizeof arg's ID.
+ if (SizeOfArgID == llvm::FoldingSetNodeID())
+ SizeOfArg->Profile(SizeOfArgID, Context, true);
+ llvm::FoldingSetNodeID DestID;
+ Dest->Profile(DestID, Context, true);
+ if (DestID == SizeOfArgID) {
+ unsigned ActionIdx = 0; // Default is to suggest dereferencing.
+ if (const UnaryOperator *UnaryOp = dyn_cast<UnaryOperator>(Dest))
+ if (UnaryOp->getOpcode() == UO_AddrOf)
+ ActionIdx = 1; // If its an address-of operator, just remove it.
+ if (Context.getTypeSize(PointeeTy) == Context.getCharWidth())
+ ActionIdx = 2; // If the pointee's size is sizeof(char),
+ // suggest an explicit length.
+ DiagRuntimeBehavior(SizeOfArg->getExprLoc(), Dest,
+ PDiag(diag::warn_sizeof_pointer_expr_memaccess)
+ << FnName << ArgIdx << ActionIdx
+ << Dest->getSourceRange()
+ << SizeOfArg->getSourceRange());
+ break;
+ }
+ }
+
+ // Also check for cases where the sizeof argument is the exact same
+ // type as the memory argument, and where it points to a user-defined
+ // record type.
+ if (SizeOfArgTy != QualType()) {
+ if (PointeeTy->isRecordType() &&
+ Context.typesAreCompatible(SizeOfArgTy, DestTy)) {
+ DiagRuntimeBehavior(LenExpr->getExprLoc(), Dest,
+ PDiag(diag::warn_sizeof_pointer_type_memaccess)
+ << FnName << SizeOfArgTy << ArgIdx
+ << PointeeTy << Dest->getSourceRange()
+ << LenExpr->getSourceRange());
+ break;
+ }
+ }
+
+ unsigned DiagID;
+
// Always complain about dynamic classes.
- if (isDynamicClassType(PointeeTy)) {
- DiagRuntimeBehavior(
- Dest->getExprLoc(), Dest,
- PDiag(diag::warn_dyn_class_memaccess)
- << ArgIdx << FnName << PointeeTy
- << Call->getCallee()->getSourceRange());
- } else {
+ if (isDynamicClassType(PointeeTy))
+ DiagID = diag::warn_dyn_class_memaccess;
+ else if (PointeeTy.hasNonTrivialObjCLifetime() && CMF != CMF_Memset)
+ DiagID = diag::warn_arc_object_memaccess;
+ else
continue;
- }
- SourceRange ArgRange = Call->getArg(0)->getSourceRange();
+ DiagRuntimeBehavior(
+ Dest->getExprLoc(), Dest,
+ PDiag(DiagID)
+ << ArgIdx << FnName << PointeeTy
+ << Call->getCallee()->getSourceRange());
+
DiagRuntimeBehavior(
Dest->getExprLoc(), Dest,
PDiag(diag::note_bad_memaccess_silence)
@@ -1908,7 +2034,8 @@ Sema::CheckReturnStackAddr(Expr *RetValExp, QualType lhsType,
// Perform checking for returned stack addresses, local blocks,
// label addresses or references to temporaries.
- if (lhsType->isPointerType() || lhsType->isBlockPointerType()) {
+ if (lhsType->isPointerType() ||
+ (!getLangOptions().ObjCAutoRefCount && lhsType->isBlockPointerType())) {
stackE = EvalAddr(RetValExp, refVars);
} else if (lhsType->isReferenceType()) {
stackE = EvalVal(RetValExp, refVars);
@@ -2079,7 +2206,8 @@ static Expr *EvalAddr(Expr *E, llvm::SmallVectorImpl<DeclRefExpr *> &refVars) {
// pointer values, and pointer-to-pointer conversions.
case Stmt::ImplicitCastExprClass:
case Stmt::CStyleCastExprClass:
- case Stmt::CXXFunctionalCastExprClass: {
+ case Stmt::CXXFunctionalCastExprClass:
+ case Stmt::ObjCBridgedCastExprClass: {
Expr* SubExpr = cast<CastExpr>(E)->getSubExpr();
QualType T = SubExpr->getType();
@@ -2112,6 +2240,14 @@ static Expr *EvalAddr(Expr *E, llvm::SmallVectorImpl<DeclRefExpr *> &refVars) {
return NULL;
}
+ case Stmt::MaterializeTemporaryExprClass:
+ if (Expr *Result = EvalAddr(
+ cast<MaterializeTemporaryExpr>(E)->GetTemporaryExpr(),
+ refVars))
+ return Result;
+
+ return E;
+
// Everything else: we simply don't reason about them.
default:
return NULL;
@@ -2213,6 +2349,14 @@ do {
return EvalVal(M->getBase(), refVars);
}
+ case Stmt::MaterializeTemporaryExprClass:
+ if (Expr *Result = EvalVal(
+ cast<MaterializeTemporaryExpr>(E)->GetTemporaryExpr(),
+ refVars))
+ return Result;
+
+ return E;
+
default:
// Check that we don't return or take the address of a reference to a
// temporary. This is only useful in C++.
@@ -2477,15 +2621,24 @@ IntRange GetExprRange(ASTContext &C, Expr *E, unsigned MaxWidth) {
case BO_NE:
return IntRange::forBoolType();
- // The type of these compound assignments is the type of the LHS,
- // so the RHS is not necessarily an integer.
+ // The type of the assignments is the type of the LHS, so the RHS
+ // is not necessarily the same type.
case BO_MulAssign:
case BO_DivAssign:
case BO_RemAssign:
case BO_AddAssign:
case BO_SubAssign:
+ case BO_XorAssign:
+ case BO_OrAssign:
+ // TODO: bitfields?
return IntRange::forValueOfType(C, E->getType());
+ // Simple assignments just pass through the RHS, which will have
+ // been coerced to the LHS type.
+ case BO_Assign:
+ // TODO: bitfields?
+ return GetExprRange(C, BO->getRHS(), MaxWidth);
+
// Operations with opaque sources are black-listed.
case BO_PtrMemD:
case BO_PtrMemI:
@@ -2541,14 +2694,54 @@ IntRange GetExprRange(ASTContext &C, Expr *E, unsigned MaxWidth) {
case BO_Sub:
if (BO->getLHS()->getType()->isPointerType())
return IntRange::forValueOfType(C, E->getType());
- // fallthrough
+ break;
- default:
+ // The width of a division result is mostly determined by the size
+ // of the LHS.
+ case BO_Div: {
+ // Don't 'pre-truncate' the operands.
+ unsigned opWidth = C.getIntWidth(E->getType());
+ IntRange L = GetExprRange(C, BO->getLHS(), opWidth);
+
+ // If the divisor is constant, use that.
+ llvm::APSInt divisor;
+ if (BO->getRHS()->isIntegerConstantExpr(divisor, C)) {
+ unsigned log2 = divisor.logBase2(); // floor(log_2(divisor))
+ if (log2 >= L.Width)
+ L.Width = (L.NonNegative ? 0 : 1);
+ else
+ L.Width = std::min(L.Width - log2, MaxWidth);
+ return L;
+ }
+
+ // Otherwise, just use the LHS's width.
+ IntRange R = GetExprRange(C, BO->getRHS(), opWidth);
+ return IntRange(L.Width, L.NonNegative && R.NonNegative);
+ }
+
+ // The result of a remainder can't be larger than the result of
+ // either side.
+ case BO_Rem: {
+ // Don't 'pre-truncate' the operands.
+ unsigned opWidth = C.getIntWidth(E->getType());
+ IntRange L = GetExprRange(C, BO->getLHS(), opWidth);
+ IntRange R = GetExprRange(C, BO->getRHS(), opWidth);
+
+ IntRange meet = IntRange::meet(L, R);
+ meet.Width = std::min(meet.Width, MaxWidth);
+ return meet;
+ }
+
+ // The default behavior is okay for these.
+ case BO_Mul:
+ case BO_Add:
+ case BO_Xor:
+ case BO_Or:
break;
}
- // Treat every other operator as if it were closed on the
- // narrowest type that encompasses both operands.
+ // The default case is to treat the operation as if it were closed
+ // on the narrowest type that encompasses both operands.
IntRange L = GetExprRange(C, BO->getLHS(), MaxWidth);
IntRange R = GetExprRange(C, BO->getRHS(), MaxWidth);
return IntRange::join(L, R);
@@ -2872,18 +3065,16 @@ void DiagnoseFloatingLiteralImpCast(Sema &S, FloatingLiteral *FL, QualType T,
if (&Value.getSemantics() == &llvm::APFloat::PPCDoubleDouble)
return;
- // Try to convert this exactly to an 64-bit integer. FIXME: It would be
- // nice to support arbitrarily large integers here.
+ // Try to convert this exactly to an integer.
bool isExact = false;
- uint64_t IntegerPart;
- if (Value.convertToInteger(&IntegerPart, 64, /*isSigned=*/true,
+ llvm::APSInt IntegerValue(S.Context.getIntWidth(T),
+ T->hasUnsignedIntegerRepresentation());
+ if (Value.convertToInteger(IntegerValue,
llvm::APFloat::rmTowardZero, &isExact)
!= llvm::APFloat::opOK || !isExact)
return;
- llvm::APInt IntegerValue(64, IntegerPart, /*isSigned=*/true);
-
- std::string LiteralValue = IntegerValue.toString(10, /*isSigned=*/true);
+ std::string LiteralValue = IntegerValue.toString(10);
S.Diag(FL->getExprLoc(), diag::note_fix_integral_float_as_integer)
<< FixItHint::CreateReplacement(FL->getSourceRange(), LiteralValue);
}
@@ -2930,6 +3121,11 @@ void CheckImplicitConversion(Sema &S, Expr *E, QualType T,
return;
return DiagnoseImpCast(S, E, T, CC, diag::warn_impcast_vector_scalar);
}
+
+ // If the vector cast is cast between two vectors of the same size, it is
+ // a bitcast, not a conversion.
+ if (S.Context.getTypeSize(Source) == S.Context.getTypeSize(Target))
+ return;
Source = cast<VectorType>(Source)->getElementType().getTypePtr();
Target = cast<VectorType>(Target)->getElementType().getTypePtr();
@@ -3024,9 +3220,7 @@ void CheckImplicitConversion(Sema &S, Expr *E, QualType T,
return;
}
- // People want to build with -Wshorten-64-to-32 and not -Wconversion
- // and by god we'll let them.
-
+ // People want to build with -Wshorten-64-to-32 and not -Wconversion.
if (isFromSystemMacro(S, CC))
return;
@@ -3391,3 +3585,268 @@ void Sema::CheckArrayAccess(const Expr *expr) {
}
}
}
+
+//===--- CHECK: Objective-C retain cycles ----------------------------------//
+
+namespace {
+ struct RetainCycleOwner {
+ RetainCycleOwner() : Variable(0), Indirect(false) {}
+ VarDecl *Variable;
+ SourceRange Range;
+ SourceLocation Loc;
+ bool Indirect;
+
+ void setLocsFrom(Expr *e) {
+ Loc = e->getExprLoc();
+ Range = e->getSourceRange();
+ }
+ };
+}
+
+/// Consider whether capturing the given variable can possibly lead to
+/// a retain cycle.
+static bool considerVariable(VarDecl *var, Expr *ref, RetainCycleOwner &owner) {
+ // In ARC, it's captured strongly iff the variable has __strong
+ // lifetime. In MRR, it's captured strongly if the variable is
+ // __block and has an appropriate type.
+ if (var->getType().getObjCLifetime() != Qualifiers::OCL_Strong)
+ return false;
+
+ owner.Variable = var;
+ owner.setLocsFrom(ref);
+ return true;
+}
+
+static bool findRetainCycleOwner(Expr *e, RetainCycleOwner &owner) {
+ while (true) {
+ e = e->IgnoreParens();
+ if (CastExpr *cast = dyn_cast<CastExpr>(e)) {
+ switch (cast->getCastKind()) {
+ case CK_BitCast:
+ case CK_LValueBitCast:
+ case CK_LValueToRValue:
+ case CK_ObjCReclaimReturnedObject:
+ e = cast->getSubExpr();
+ continue;
+
+ case CK_GetObjCProperty: {
+ // Bail out if this isn't a strong explicit property.
+ const ObjCPropertyRefExpr *pre = cast->getSubExpr()->getObjCProperty();
+ if (pre->isImplicitProperty()) return false;
+ ObjCPropertyDecl *property = pre->getExplicitProperty();
+ if (!(property->getPropertyAttributes() &
+ (ObjCPropertyDecl::OBJC_PR_retain |
+ ObjCPropertyDecl::OBJC_PR_copy |
+ ObjCPropertyDecl::OBJC_PR_strong)) &&
+ !(property->getPropertyIvarDecl() &&
+ property->getPropertyIvarDecl()->getType()
+ .getObjCLifetime() == Qualifiers::OCL_Strong))
+ return false;
+
+ owner.Indirect = true;
+ e = const_cast<Expr*>(pre->getBase());
+ continue;
+ }
+
+ default:
+ return false;
+ }
+ }
+
+ if (ObjCIvarRefExpr *ref = dyn_cast<ObjCIvarRefExpr>(e)) {
+ ObjCIvarDecl *ivar = ref->getDecl();
+ if (ivar->getType().getObjCLifetime() != Qualifiers::OCL_Strong)
+ return false;
+
+ // Try to find a retain cycle in the base.
+ if (!findRetainCycleOwner(ref->getBase(), owner))
+ return false;
+
+ if (ref->isFreeIvar()) owner.setLocsFrom(ref);
+ owner.Indirect = true;
+ return true;
+ }
+
+ if (DeclRefExpr *ref = dyn_cast<DeclRefExpr>(e)) {
+ VarDecl *var = dyn_cast<VarDecl>(ref->getDecl());
+ if (!var) return false;
+ return considerVariable(var, ref, owner);
+ }
+
+ if (BlockDeclRefExpr *ref = dyn_cast<BlockDeclRefExpr>(e)) {
+ owner.Variable = ref->getDecl();
+ owner.setLocsFrom(ref);
+ return true;
+ }
+
+ if (MemberExpr *member = dyn_cast<MemberExpr>(e)) {
+ if (member->isArrow()) return false;
+
+ // Don't count this as an indirect ownership.
+ e = member->getBase();
+ continue;
+ }
+
+ // Array ivars?
+
+ return false;
+ }
+}
+
+namespace {
+ struct FindCaptureVisitor : EvaluatedExprVisitor<FindCaptureVisitor> {
+ FindCaptureVisitor(ASTContext &Context, VarDecl *variable)
+ : EvaluatedExprVisitor<FindCaptureVisitor>(Context),
+ Variable(variable), Capturer(0) {}
+
+ VarDecl *Variable;
+ Expr *Capturer;
+
+ void VisitDeclRefExpr(DeclRefExpr *ref) {
+ if (ref->getDecl() == Variable && !Capturer)
+ Capturer = ref;
+ }
+
+ void VisitBlockDeclRefExpr(BlockDeclRefExpr *ref) {
+ if (ref->getDecl() == Variable && !Capturer)
+ Capturer = ref;
+ }
+
+ void VisitObjCIvarRefExpr(ObjCIvarRefExpr *ref) {
+ if (Capturer) return;
+ Visit(ref->getBase());
+ if (Capturer && ref->isFreeIvar())
+ Capturer = ref;
+ }
+
+ void VisitBlockExpr(BlockExpr *block) {
+ // Look inside nested blocks
+ if (block->getBlockDecl()->capturesVariable(Variable))
+ Visit(block->getBlockDecl()->getBody());
+ }
+ };
+}
+
+/// Check whether the given argument is a block which captures a
+/// variable.
+static Expr *findCapturingExpr(Sema &S, Expr *e, RetainCycleOwner &owner) {
+ assert(owner.Variable && owner.Loc.isValid());
+
+ e = e->IgnoreParenCasts();
+ BlockExpr *block = dyn_cast<BlockExpr>(e);
+ if (!block || !block->getBlockDecl()->capturesVariable(owner.Variable))
+ return 0;
+
+ FindCaptureVisitor visitor(S.Context, owner.Variable);
+ visitor.Visit(block->getBlockDecl()->getBody());
+ return visitor.Capturer;
+}
+
+static void diagnoseRetainCycle(Sema &S, Expr *capturer,
+ RetainCycleOwner &owner) {
+ assert(capturer);
+ assert(owner.Variable && owner.Loc.isValid());
+
+ S.Diag(capturer->getExprLoc(), diag::warn_arc_retain_cycle)
+ << owner.Variable << capturer->getSourceRange();
+ S.Diag(owner.Loc, diag::note_arc_retain_cycle_owner)
+ << owner.Indirect << owner.Range;
+}
+
+/// Check for a keyword selector that starts with the word 'add' or
+/// 'set'.
+static bool isSetterLikeSelector(Selector sel) {
+ if (sel.isUnarySelector()) return false;
+
+ llvm::StringRef str = sel.getNameForSlot(0);
+ while (!str.empty() && str.front() == '_') str = str.substr(1);
+ if (str.startswith("set") || str.startswith("add"))
+ str = str.substr(3);
+ else
+ return false;
+
+ if (str.empty()) return true;
+ return !islower(str.front());
+}
+
+/// Check a message send to see if it's likely to cause a retain cycle.
+void Sema::checkRetainCycles(ObjCMessageExpr *msg) {
+ // Only check instance methods whose selector looks like a setter.
+ if (!msg->isInstanceMessage() || !isSetterLikeSelector(msg->getSelector()))
+ return;
+
+ // Try to find a variable that the receiver is strongly owned by.
+ RetainCycleOwner owner;
+ if (msg->getReceiverKind() == ObjCMessageExpr::Instance) {
+ if (!findRetainCycleOwner(msg->getInstanceReceiver(), owner))
+ return;
+ } else {
+ assert(msg->getReceiverKind() == ObjCMessageExpr::SuperInstance);
+ owner.Variable = getCurMethodDecl()->getSelfDecl();
+ owner.Loc = msg->getSuperLoc();
+ owner.Range = msg->getSuperLoc();
+ }
+
+ // Check whether the receiver is captured by any of the arguments.
+ for (unsigned i = 0, e = msg->getNumArgs(); i != e; ++i)
+ if (Expr *capturer = findCapturingExpr(*this, msg->getArg(i), owner))
+ return diagnoseRetainCycle(*this, capturer, owner);
+}
+
+/// Check a property assign to see if it's likely to cause a retain cycle.
+void Sema::checkRetainCycles(Expr *receiver, Expr *argument) {
+ RetainCycleOwner owner;
+ if (!findRetainCycleOwner(receiver, owner))
+ return;
+
+ if (Expr *capturer = findCapturingExpr(*this, argument, owner))
+ diagnoseRetainCycle(*this, capturer, owner);
+}
+
+bool Sema::checkUnsafeAssigns(SourceLocation Loc,
+ QualType LHS, Expr *RHS) {
+ Qualifiers::ObjCLifetime LT = LHS.getObjCLifetime();
+ if (LT != Qualifiers::OCL_Weak && LT != Qualifiers::OCL_ExplicitNone)
+ return false;
+ // strip off any implicit cast added to get to the one arc-specific
+ while (ImplicitCastExpr *cast = dyn_cast<ImplicitCastExpr>(RHS)) {
+ if (cast->getCastKind() == CK_ObjCConsumeObject) {
+ Diag(Loc, diag::warn_arc_retained_assign)
+ << (LT == Qualifiers::OCL_ExplicitNone)
+ << RHS->getSourceRange();
+ return true;
+ }
+ RHS = cast->getSubExpr();
+ }
+ return false;
+}
+
+void Sema::checkUnsafeExprAssigns(SourceLocation Loc,
+ Expr *LHS, Expr *RHS) {
+ QualType LHSType = LHS->getType();
+ if (checkUnsafeAssigns(Loc, LHSType, RHS))
+ return;
+ Qualifiers::ObjCLifetime LT = LHSType.getObjCLifetime();
+ // FIXME. Check for other life times.
+ if (LT != Qualifiers::OCL_None)
+ return;
+
+ if (ObjCPropertyRefExpr *PRE = dyn_cast<ObjCPropertyRefExpr>(LHS)) {
+ if (PRE->isImplicitProperty())
+ return;
+ const ObjCPropertyDecl *PD = PRE->getExplicitProperty();
+ if (!PD)
+ return;
+
+ unsigned Attributes = PD->getPropertyAttributes();
+ if (Attributes & ObjCPropertyDecl::OBJC_PR_assign)
+ while (ImplicitCastExpr *cast = dyn_cast<ImplicitCastExpr>(RHS)) {
+ if (cast->getCastKind() == CK_ObjCConsumeObject) {
+ Diag(Loc, diag::warn_arc_retained_property_assign)
+ << RHS->getSourceRange();
+ return;
+ }
+ RHS = cast->getSubExpr();
+ }
+ }
+}
diff --git a/contrib/llvm/tools/clang/lib/Sema/SemaCodeComplete.cpp b/contrib/llvm/tools/clang/lib/Sema/SemaCodeComplete.cpp
index e328eeb..b555c8a 100644
--- a/contrib/llvm/tools/clang/lib/Sema/SemaCodeComplete.cpp
+++ b/contrib/llvm/tools/clang/lib/Sema/SemaCodeComplete.cpp
@@ -1676,6 +1676,34 @@ static void AddOrdinaryNameResults(Sema::ParserCompletionContext CCC,
// Fall through: conditions and statements can have expressions.
case Sema::PCC_ParenthesizedExpression:
+ if (SemaRef.getLangOptions().ObjCAutoRefCount &&
+ CCC == Sema::PCC_ParenthesizedExpression) {
+ // (__bridge <type>)<expression>
+ Builder.AddTypedTextChunk("__bridge");
+ Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
+ Builder.AddPlaceholderChunk("type");
+ Builder.AddChunk(CodeCompletionString::CK_RightParen);
+ Builder.AddPlaceholderChunk("expression");
+ Results.AddResult(Result(Builder.TakeString()));
+
+ // (__bridge_transfer <Objective-C type>)<expression>
+ Builder.AddTypedTextChunk("__bridge_transfer");
+ Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
+ Builder.AddPlaceholderChunk("Objective-C type");
+ Builder.AddChunk(CodeCompletionString::CK_RightParen);
+ Builder.AddPlaceholderChunk("expression");
+ Results.AddResult(Result(Builder.TakeString()));
+
+ // (__bridge_retained <CF type>)<expression>
+ Builder.AddTypedTextChunk("__bridge_retained");
+ Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
+ Builder.AddPlaceholderChunk("CF type");
+ Builder.AddChunk(CodeCompletionString::CK_RightParen);
+ Builder.AddPlaceholderChunk("expression");
+ Results.AddResult(Result(Builder.TakeString()));
+ }
+ // Fall through
+
case Sema::PCC_Expression: {
if (SemaRef.getLangOptions().CPlusPlus) {
// 'this', if we're in a non-static member function.
@@ -1828,7 +1856,8 @@ static const char *GetCompletionTypeString(QualType T,
CodeCompletionAllocator &Allocator) {
PrintingPolicy Policy(Context.PrintingPolicy);
Policy.AnonymousTagLocations = false;
-
+ Policy.SuppressStrongLifetime = true;
+
if (!T.getLocalQualifiers()) {
// Built-in type names are constant strings.
if (const BuiltinType *BT = dyn_cast<BuiltinType>(T))
@@ -1878,9 +1907,9 @@ static void AddResultTypeChunk(ASTContext &Context,
T = Context.getTypeDeclType(cast<TypeDecl>(Enumerator->getDeclContext()));
else if (isa<UnresolvedUsingValueDecl>(ND)) {
/* Do nothing: ignore unresolved using declarations*/
- } else if (ValueDecl *Value = dyn_cast<ValueDecl>(ND))
+ } else if (ValueDecl *Value = dyn_cast<ValueDecl>(ND)) {
T = Value->getType();
- else if (ObjCPropertyDecl *Property = dyn_cast<ObjCPropertyDecl>(ND))
+ } else if (ObjCPropertyDecl *Property = dyn_cast<ObjCPropertyDecl>(ND))
T = Property->getType();
if (T.isNull() || Context.hasSameType(T, Context.DependentTy))
@@ -1907,6 +1936,10 @@ static void MaybeAddSentinel(ASTContext &Context, NamedDecl *FunctionOrMethod,
static std::string FormatFunctionParameter(ASTContext &Context,
ParmVarDecl *Param,
bool SuppressName = false) {
+ PrintingPolicy Policy(Context.PrintingPolicy);
+ Policy.AnonymousTagLocations = false;
+ Policy.SuppressStrongLifetime = true;
+
bool ObjCMethodParam = isa<ObjCMethodDecl>(Param->getDeclContext());
if (Param->getType()->isDependentType() ||
!Param->getType()->isBlockPointerType()) {
@@ -1917,8 +1950,7 @@ static std::string FormatFunctionParameter(ASTContext &Context,
if (Param->getIdentifier() && !ObjCMethodParam && !SuppressName)
Result = Param->getIdentifier()->getName();
- Param->getType().getAsStringInternal(Result,
- Context.PrintingPolicy);
+ Param->getType().getAsStringInternal(Result, Policy);
if (ObjCMethodParam) {
Result = "(" + Result;
@@ -1968,8 +2000,7 @@ static std::string FormatFunctionParameter(ASTContext &Context,
// We were unable to find a FunctionProtoTypeLoc with parameter names
// for the block; just use the parameter type as a placeholder.
std::string Result;
- Param->getType().getUnqualifiedType().
- getAsStringInternal(Result, Context.PrintingPolicy);
+ Param->getType().getUnqualifiedType().getAsStringInternal(Result, Policy);
if (ObjCMethodParam) {
Result = "(" + Result;
@@ -1986,7 +2017,7 @@ static std::string FormatFunctionParameter(ASTContext &Context,
std::string Result;
QualType ResultType = Block->getTypePtr()->getResultType();
if (!ResultType->isVoidType())
- ResultType.getAsStringInternal(Result, Context.PrintingPolicy);
+ ResultType.getAsStringInternal(Result, Policy);
Result = '^' + Result;
if (!BlockProto || Block->getNumArgs() == 0) {
@@ -2071,6 +2102,9 @@ static void AddTemplateParameterChunks(ASTContext &Context,
unsigned MaxParameters = 0,
unsigned Start = 0,
bool InDefaultArg = false) {
+ PrintingPolicy Policy(Context.PrintingPolicy);
+ Policy.AnonymousTagLocations = false;
+
typedef CodeCompletionString::Chunk Chunk;
bool FirstParameter = true;
@@ -2098,8 +2132,7 @@ static void AddTemplateParameterChunks(ASTContext &Context,
= dyn_cast<NonTypeTemplateParmDecl>(*P)) {
if (NTTP->getIdentifier())
PlaceholderStr = NTTP->getIdentifier()->getName();
- NTTP->getType().getAsStringInternal(PlaceholderStr,
- Context.PrintingPolicy);
+ NTTP->getType().getAsStringInternal(PlaceholderStr, Policy);
HasDefaultArg = NTTP->hasDefaultArgument();
} else {
assert(isa<TemplateTemplateParmDecl>(*P));
@@ -2286,6 +2319,10 @@ CodeCompletionResult::CreateCodeCompletionString(Sema &S,
typedef CodeCompletionString::Chunk Chunk;
CodeCompletionBuilder Result(Allocator, Priority, Availability);
+ PrintingPolicy Policy(S.Context.PrintingPolicy);
+ Policy.AnonymousTagLocations = false;
+ Policy.SuppressStrongLifetime = true;
+
if (Kind == RK_Pattern) {
Pattern->Priority = Priority;
Pattern->Availability = Availability;
@@ -2470,7 +2507,7 @@ CodeCompletionResult::CreateCodeCompletionString(Sema &S,
if ((*P)->getType()->isBlockPointerType() && !DeclaringEntity)
Arg = FormatFunctionParameter(S.Context, *P, true);
else {
- (*P)->getType().getAsStringInternal(Arg, S.Context.PrintingPolicy);
+ (*P)->getType().getAsStringInternal(Arg, Policy);
Arg = "(" + Arg + ")";
if (IdentifierInfo *II = (*P)->getIdentifier())
if (DeclaringEntity || AllParametersAreInformative)
@@ -2519,7 +2556,10 @@ CodeCompleteConsumer::OverloadCandidate::CreateSignatureString(
Sema &S,
CodeCompletionAllocator &Allocator) const {
typedef CodeCompletionString::Chunk Chunk;
-
+ PrintingPolicy Policy(S.Context.PrintingPolicy);
+ Policy.AnonymousTagLocations = false;
+ Policy.SuppressStrongLifetime = true;
+
// FIXME: Set priority, availability appropriately.
CodeCompletionBuilder Result(Allocator, 1, CXAvailability_Available);
FunctionDecl *FDecl = getFunction();
@@ -2545,7 +2585,7 @@ CodeCompleteConsumer::OverloadCandidate::CreateSignatureString(
else
Result.AddTextChunk(
Result.getAllocator().CopyString(
- Proto->getResultType().getAsString(S.Context.PrintingPolicy)));
+ Proto->getResultType().getAsString(Policy)));
Result.AddChunk(Chunk(CodeCompletionString::CK_LeftParen));
unsigned NumParams = FDecl? FDecl->getNumParams() : Proto->getNumArgs();
@@ -2563,7 +2603,7 @@ CodeCompleteConsumer::OverloadCandidate::CreateSignatureString(
ArgType = Proto->getArgType(I);
}
- ArgType.getAsStringInternal(ArgString, S.Context.PrintingPolicy);
+ ArgType.getAsStringInternal(ArgString, Policy);
if (I == CurrentArg)
Result.AddChunk(Chunk(CodeCompletionString::CK_CurrentParameter,
@@ -3204,8 +3244,23 @@ void Sema::CodeCompleteMemberReferenceExpr(Scope *S, ExprTy *BaseE,
return;
}
+ enum CodeCompletionContext::Kind contextKind;
+
+ if (IsArrow) {
+ contextKind = CodeCompletionContext::CCC_ArrowMemberAccess;
+ }
+ else {
+ if (BaseType->isObjCObjectPointerType() ||
+ BaseType->isObjCObjectOrInterfaceType()) {
+ contextKind = CodeCompletionContext::CCC_ObjCPropertyAccess;
+ }
+ else {
+ contextKind = CodeCompletionContext::CCC_DotMemberAccess;
+ }
+ }
+
ResultBuilder Results(*this, CodeCompleter->getAllocator(),
- CodeCompletionContext(CodeCompletionContext::CCC_MemberAccess,
+ CodeCompletionContext(contextKind,
BaseType),
&ResultBuilder::IsMember);
Results.EnterNewScope();
@@ -3431,10 +3486,17 @@ void Sema::CodeCompleteCase(Scope *S) {
}
Results.ExitScope();
- if (CodeCompleter->includeMacros())
+ //We need to make sure we're setting the right context,
+ //so only say we include macros if the code completer says we do
+ enum CodeCompletionContext::Kind kind = CodeCompletionContext::CCC_Other;
+ if (CodeCompleter->includeMacros()) {
AddMacroResults(PP, Results);
+ kind = CodeCompletionContext::CCC_OtherWithMacros;
+ }
+
+
HandleCodeCompleteResults(this, CodeCompleter,
- CodeCompletionContext::CCC_OtherWithMacros,
+ kind,
Results.data(),Results.size());
}
@@ -3786,6 +3848,10 @@ void Sema::CodeCompleteOperatorName(Scope *S) {
void Sema::CodeCompleteConstructorInitializer(Decl *ConstructorD,
CXXCtorInitializer** Initializers,
unsigned NumInitializers) {
+ PrintingPolicy Policy(Context.PrintingPolicy);
+ Policy.AnonymousTagLocations = false;
+ Policy.SuppressStrongLifetime = true;
+
CXXConstructorDecl *Constructor
= static_cast<CXXConstructorDecl *>(ConstructorD);
if (!Constructor)
@@ -3825,7 +3891,7 @@ void Sema::CodeCompleteConstructorInitializer(Decl *ConstructorD,
Builder.AddTypedTextChunk(
Results.getAllocator().CopyString(
- Base->getType().getAsString(Context.PrintingPolicy)));
+ Base->getType().getAsString(Policy)));
Builder.AddChunk(CodeCompletionString::CK_LeftParen);
Builder.AddPlaceholderChunk("args");
Builder.AddChunk(CodeCompletionString::CK_RightParen);
@@ -3850,7 +3916,7 @@ void Sema::CodeCompleteConstructorInitializer(Decl *ConstructorD,
Builder.AddTypedTextChunk(
Builder.getAllocator().CopyString(
- Base->getType().getAsString(Context.PrintingPolicy)));
+ Base->getType().getAsString(Policy)));
Builder.AddChunk(CodeCompletionString::CK_LeftParen);
Builder.AddPlaceholderChunk("args");
Builder.AddChunk(CodeCompletionString::CK_RightParen);
@@ -4126,18 +4192,24 @@ static bool ObjCPropertyFlagConflicts(unsigned Attributes, unsigned NewFlag) {
if ((Attributes & ObjCDeclSpec::DQ_PR_readonly) &&
(Attributes & (ObjCDeclSpec::DQ_PR_readwrite |
ObjCDeclSpec::DQ_PR_assign |
+ ObjCDeclSpec::DQ_PR_unsafe_unretained |
ObjCDeclSpec::DQ_PR_copy |
- ObjCDeclSpec::DQ_PR_retain)))
+ ObjCDeclSpec::DQ_PR_retain |
+ ObjCDeclSpec::DQ_PR_strong)))
return true;
- // Check for more than one of { assign, copy, retain }.
+ // Check for more than one of { assign, copy, retain, strong }.
unsigned AssignCopyRetMask = Attributes & (ObjCDeclSpec::DQ_PR_assign |
+ ObjCDeclSpec::DQ_PR_unsafe_unretained |
ObjCDeclSpec::DQ_PR_copy |
- ObjCDeclSpec::DQ_PR_retain);
+ ObjCDeclSpec::DQ_PR_retain|
+ ObjCDeclSpec::DQ_PR_strong);
if (AssignCopyRetMask &&
AssignCopyRetMask != ObjCDeclSpec::DQ_PR_assign &&
+ AssignCopyRetMask != ObjCDeclSpec::DQ_PR_unsafe_unretained &&
AssignCopyRetMask != ObjCDeclSpec::DQ_PR_copy &&
- AssignCopyRetMask != ObjCDeclSpec::DQ_PR_retain)
+ AssignCopyRetMask != ObjCDeclSpec::DQ_PR_retain &&
+ AssignCopyRetMask != ObjCDeclSpec::DQ_PR_strong)
return true;
return false;
@@ -4157,10 +4229,15 @@ void Sema::CodeCompleteObjCPropertyFlags(Scope *S, ObjCDeclSpec &ODS) {
Results.AddResult(CodeCompletionResult("readonly"));
if (!ObjCPropertyFlagConflicts(Attributes, ObjCDeclSpec::DQ_PR_assign))
Results.AddResult(CodeCompletionResult("assign"));
+ if (!ObjCPropertyFlagConflicts(Attributes,
+ ObjCDeclSpec::DQ_PR_unsafe_unretained))
+ Results.AddResult(CodeCompletionResult("unsafe_unretained"));
if (!ObjCPropertyFlagConflicts(Attributes, ObjCDeclSpec::DQ_PR_readwrite))
Results.AddResult(CodeCompletionResult("readwrite"));
if (!ObjCPropertyFlagConflicts(Attributes, ObjCDeclSpec::DQ_PR_retain))
Results.AddResult(CodeCompletionResult("retain"));
+ if (!ObjCPropertyFlagConflicts(Attributes, ObjCDeclSpec::DQ_PR_strong))
+ Results.AddResult(CodeCompletionResult("strong"));
if (!ObjCPropertyFlagConflicts(Attributes, ObjCDeclSpec::DQ_PR_copy))
Results.AddResult(CodeCompletionResult("copy"));
if (!ObjCPropertyFlagConflicts(Attributes, ObjCDeclSpec::DQ_PR_nonatomic))
@@ -4522,6 +4599,7 @@ static ObjCInterfaceDecl *GetAssumedMessageSendExprType(Expr *E) {
if (Method->isInstanceMethod())
return llvm::StringSwitch<ObjCInterfaceDecl *>(Id->getName())
.Case("retain", IFace)
+ .Case("strong", IFace)
.Case("autorelease", IFace)
.Case("copy", IFace)
.Case("copyWithZone", IFace)
@@ -4878,7 +4956,7 @@ void Sema::CodeCompleteObjCClassMessage(Scope *S, ParsedType Receiver,
bool AtArgumentExpression,
bool IsSuper) {
ResultBuilder Results(*this, CodeCompleter->getAllocator(),
- CodeCompletionContext::CCC_Other);
+ CodeCompletionContext::CCC_ObjCClassMessage);
AddClassMessageCompletions(*this, S, Receiver, SelIdents, NumSelIdents,
AtArgumentExpression, IsSuper, Results);
@@ -4898,7 +4976,7 @@ void Sema::CodeCompleteObjCClassMessage(Scope *S, ParsedType Receiver,
}
HandleCodeCompleteResults(this, CodeCompleter,
- CodeCompletionContext::CCC_Other,
+ CodeCompletionContext::CCC_ObjCClassMessage,
Results.data(), Results.size());
}
@@ -4941,7 +5019,7 @@ void Sema::CodeCompleteObjCInstanceMessage(Scope *S, ExprTy *Receiver,
// Build the set of methods we can see.
ResultBuilder Results(*this, CodeCompleter->getAllocator(),
- CodeCompletionContext::CCC_Other);
+ CodeCompletionContext::CCC_ObjCInstanceMessage);
Results.EnterNewScope();
// If this is a send-to-super, try to add the special "super" send
@@ -5054,7 +5132,7 @@ void Sema::CodeCompleteObjCInstanceMessage(Scope *S, ExprTy *Receiver,
}
HandleCodeCompleteResults(this, CodeCompleter,
- CodeCompletionContext::CCC_Other,
+ CodeCompletionContext::CCC_ObjCInstanceMessage,
Results.data(),Results.size());
}
@@ -5245,8 +5323,7 @@ void Sema::CodeCompleteObjCInterfaceDecl(Scope *S) {
false, Results);
Results.ExitScope();
- // FIXME: Add a special context for this, use cached global completion
- // results.
+ // FIXME: Use cached global completion results.
HandleCodeCompleteResults(this, CodeCompleter,
CodeCompletionContext::CCC_Other,
Results.data(),Results.size());
@@ -5255,7 +5332,7 @@ void Sema::CodeCompleteObjCInterfaceDecl(Scope *S) {
void Sema::CodeCompleteObjCSuperclass(Scope *S, IdentifierInfo *ClassName,
SourceLocation ClassNameLoc) {
ResultBuilder Results(*this, CodeCompleter->getAllocator(),
- CodeCompletionContext::CCC_Other);
+ CodeCompletionContext::CCC_ObjCSuperclass);
Results.EnterNewScope();
// Make sure that we ignore the class we're currently defining.
@@ -5269,10 +5346,9 @@ void Sema::CodeCompleteObjCSuperclass(Scope *S, IdentifierInfo *ClassName,
false, Results);
Results.ExitScope();
- // FIXME: Add a special context for this, use cached global completion
- // results.
+ // FIXME: Use cached global completion results.
HandleCodeCompleteResults(this, CodeCompleter,
- CodeCompletionContext::CCC_Other,
+ CodeCompletionContext::CCC_ObjCSuperclass,
Results.data(),Results.size());
}
@@ -5286,8 +5362,7 @@ void Sema::CodeCompleteObjCImplementationDecl(Scope *S) {
true, Results);
Results.ExitScope();
- // FIXME: Add a special context for this, use cached global completion
- // results.
+ // FIXME: Use cached global completion results.
HandleCodeCompleteResults(this, CodeCompleter,
CodeCompletionContext::CCC_Other,
Results.data(),Results.size());
@@ -5299,7 +5374,7 @@ void Sema::CodeCompleteObjCInterfaceCategory(Scope *S,
typedef CodeCompletionResult Result;
ResultBuilder Results(*this, CodeCompleter->getAllocator(),
- CodeCompletionContext::CCC_Other);
+ CodeCompletionContext::CCC_ObjCCategoryName);
// Ignore any categories we find that have already been implemented by this
// interface.
@@ -5323,7 +5398,7 @@ void Sema::CodeCompleteObjCInterfaceCategory(Scope *S,
Results.ExitScope();
HandleCodeCompleteResults(this, CodeCompleter,
- CodeCompletionContext::CCC_Other,
+ CodeCompletionContext::CCC_ObjCCategoryName,
Results.data(),Results.size());
}
@@ -5342,7 +5417,7 @@ void Sema::CodeCompleteObjCImplementationCategory(Scope *S,
return CodeCompleteObjCInterfaceCategory(S, ClassName, ClassNameLoc);
ResultBuilder Results(*this, CodeCompleter->getAllocator(),
- CodeCompletionContext::CCC_Other);
+ CodeCompletionContext::CCC_ObjCCategoryName);
// Add all of the categories that have have corresponding interface
// declarations in this class and any of its superclasses, except for
@@ -5363,7 +5438,7 @@ void Sema::CodeCompleteObjCImplementationCategory(Scope *S,
Results.ExitScope();
HandleCodeCompleteResults(this, CodeCompleter,
- CodeCompletionContext::CCC_Other,
+ CodeCompletionContext::CCC_ObjCCategoryName,
Results.data(),Results.size());
}
@@ -6273,6 +6348,7 @@ void Sema::CodeCompleteObjCMethodDecl(Scope *S,
Results.EnterNewScope();
PrintingPolicy Policy(Context.PrintingPolicy);
Policy.AnonymousTagLocations = false;
+ Policy.SuppressStrongLifetime = true;
for (KnownMethodsMap::iterator M = KnownMethods.begin(),
MEnd = KnownMethods.end();
M != MEnd; ++M) {
diff --git a/contrib/llvm/tools/clang/lib/Sema/SemaDecl.cpp b/contrib/llvm/tools/clang/lib/Sema/SemaDecl.cpp
index 9446c0e..9d91a48 100644
--- a/contrib/llvm/tools/clang/lib/Sema/SemaDecl.cpp
+++ b/contrib/llvm/tools/clang/lib/Sema/SemaDecl.cpp
@@ -45,7 +45,12 @@
using namespace clang;
using namespace sema;
-Sema::DeclGroupPtrTy Sema::ConvertDeclToDeclGroup(Decl *Ptr) {
+Sema::DeclGroupPtrTy Sema::ConvertDeclToDeclGroup(Decl *Ptr, Decl *OwnedType) {
+ if (OwnedType) {
+ Decl *Group[2] = { OwnedType, Ptr };
+ return DeclGroupPtrTy::make(DeclGroupRef::Create(Context, Group, 2));
+ }
+
return DeclGroupPtrTy::make(DeclGroupRef(Ptr));
}
@@ -287,41 +292,42 @@ bool Sema::DiagnoseUnknownTypeName(const IdentifierInfo &II,
// There may have been a typo in the name of the type. Look up typo
// results, in case we have something that we can suggest.
- LookupResult Lookup(*this, &II, IILoc, LookupOrdinaryName,
- NotForRedeclaration);
+ if (TypoCorrection Corrected = CorrectTypo(DeclarationNameInfo(&II, IILoc),
+ LookupOrdinaryName, S, SS, NULL,
+ false, CTC_Type)) {
+ std::string CorrectedStr(Corrected.getAsString(getLangOptions()));
+ std::string CorrectedQuotedStr(Corrected.getQuoted(getLangOptions()));
- if (DeclarationName Corrected = CorrectTypo(Lookup, S, SS, 0, 0, CTC_Type)) {
- if (NamedDecl *Result = Lookup.getAsSingle<NamedDecl>()) {
+ if (Corrected.isKeyword()) {
+ // We corrected to a keyword.
+ // FIXME: Actually recover with the keyword we suggest, and emit a fix-it.
+ Diag(IILoc, diag::err_unknown_typename_suggest)
+ << &II << CorrectedQuotedStr;
+ return true;
+ } else {
+ NamedDecl *Result = Corrected.getCorrectionDecl();
if ((isa<TypeDecl>(Result) || isa<ObjCInterfaceDecl>(Result)) &&
!Result->isInvalidDecl()) {
// We found a similarly-named type or interface; suggest that.
if (!SS || !SS->isSet())
Diag(IILoc, diag::err_unknown_typename_suggest)
- << &II << Lookup.getLookupName()
- << FixItHint::CreateReplacement(SourceRange(IILoc),
- Result->getNameAsString());
+ << &II << CorrectedQuotedStr
+ << FixItHint::CreateReplacement(SourceRange(IILoc), CorrectedStr);
else if (DeclContext *DC = computeDeclContext(*SS, false))
Diag(IILoc, diag::err_unknown_nested_typename_suggest)
- << &II << DC << Lookup.getLookupName() << SS->getRange()
- << FixItHint::CreateReplacement(SourceRange(IILoc),
- Result->getNameAsString());
+ << &II << DC << CorrectedQuotedStr << SS->getRange()
+ << FixItHint::CreateReplacement(SourceRange(IILoc), CorrectedStr);
else
llvm_unreachable("could not have corrected a typo here");
Diag(Result->getLocation(), diag::note_previous_decl)
- << Result->getDeclName();
+ << CorrectedQuotedStr;
SuggestedType = getTypeName(*Result->getIdentifier(), IILoc, S, SS,
false, false, ParsedType(),
/*NonTrivialTypeSourceInfo=*/true);
return true;
}
- } else if (Lookup.empty()) {
- // We corrected to a keyword.
- // FIXME: Actually recover with the keyword we suggest, and emit a fix-it.
- Diag(IILoc, diag::err_unknown_typename_suggest)
- << &II << Corrected;
- return true;
}
}
@@ -509,11 +515,15 @@ Corrected:
// Perform typo correction to determine if there is another name that is
// close to this name.
if (!SecondTry) {
- if (DeclarationName Corrected = CorrectTypo(Result, S, &SS)) {
+ SecondTry = true;
+ if (TypoCorrection Corrected = CorrectTypo(Result.getLookupNameInfo(),
+ Result.getLookupKind(), S, &SS)) {
unsigned UnqualifiedDiag = diag::err_undeclared_var_use_suggest;
unsigned QualifiedDiag = diag::err_no_member_suggest;
+ std::string CorrectedStr(Corrected.getAsString(getLangOptions()));
+ std::string CorrectedQuotedStr(Corrected.getQuoted(getLangOptions()));
- NamedDecl *FirstDecl = Result.empty()? 0 : *Result.begin();
+ NamedDecl *FirstDecl = Corrected.getCorrectionDecl();
NamedDecl *UnderlyingFirstDecl
= FirstDecl? FirstDecl->getUnderlyingDecl() : 0;
if (getLangOptions().CPlusPlus && NextToken.is(tok::less) &&
@@ -527,26 +537,33 @@ Corrected:
UnqualifiedDiag = diag::err_unknown_typename_suggest;
QualifiedDiag = diag::err_unknown_nested_typename_suggest;
}
-
+
if (SS.isEmpty())
Diag(NameLoc, UnqualifiedDiag)
- << Name << Corrected
- << FixItHint::CreateReplacement(NameLoc, Corrected.getAsString());
+ << Name << CorrectedQuotedStr
+ << FixItHint::CreateReplacement(NameLoc, CorrectedStr);
else
Diag(NameLoc, QualifiedDiag)
- << Name << computeDeclContext(SS, false) << Corrected
+ << Name << computeDeclContext(SS, false) << CorrectedQuotedStr
<< SS.getRange()
- << FixItHint::CreateReplacement(NameLoc, Corrected.getAsString());
+ << FixItHint::CreateReplacement(NameLoc, CorrectedStr);
// Update the name, so that the caller has the new name.
- Name = Corrected.getAsIdentifierInfo();
+ Name = Corrected.getCorrectionAsIdentifierInfo();
+ // Also update the LookupResult...
+ // FIXME: This should probably go away at some point
+ Result.clear();
+ Result.setLookupName(Corrected.getCorrection());
+ if (FirstDecl) Result.addDecl(FirstDecl);
+
// Typo correction corrected to a keyword.
- if (Result.empty())
- return Corrected.getAsIdentifierInfo();
+ if (Corrected.isKeyword())
+ return Corrected.getCorrectionAsIdentifierInfo();
- Diag(FirstDecl->getLocation(), diag::note_previous_decl)
- << FirstDecl->getDeclName();
+ if (FirstDecl)
+ Diag(FirstDecl->getLocation(), diag::note_previous_decl)
+ << CorrectedQuotedStr;
// If we found an Objective-C instance variable, let
// LookupInObjCMethod build the appropriate expression to
@@ -1137,17 +1154,18 @@ void Sema::ActOnPopScope(SourceLocation Loc, Scope *S) {
/// class could not be found.
ObjCInterfaceDecl *Sema::getObjCInterfaceDecl(IdentifierInfo *&Id,
SourceLocation IdLoc,
- bool TypoCorrection) {
+ bool DoTypoCorrection) {
// The third "scope" argument is 0 since we aren't enabling lazy built-in
// creation from this context.
NamedDecl *IDecl = LookupSingleName(TUScope, Id, IdLoc, LookupOrdinaryName);
- if (!IDecl && TypoCorrection) {
+ if (!IDecl && DoTypoCorrection) {
// Perform typo correction at the given location, but only if we
// find an Objective-C class name.
- LookupResult R(*this, Id, IdLoc, LookupOrdinaryName);
- if (CorrectTypo(R, TUScope, 0, 0, false, CTC_NoKeywords) &&
- (IDecl = R.getAsSingle<ObjCInterfaceDecl>())) {
+ TypoCorrection C;
+ if ((C = CorrectTypo(DeclarationNameInfo(Id, IdLoc), LookupOrdinaryName,
+ TUScope, NULL, NULL, false, CTC_NoKeywords)) &&
+ (IDecl = C.getCorrectionDeclAs<ObjCInterfaceDecl>())) {
Diag(IdLoc, diag::err_undef_interface_suggest)
<< Id << IDecl->getDeclName()
<< FixItHint::CreateReplacement(IdLoc, IDecl->getNameAsString());
@@ -1359,7 +1377,7 @@ void Sema::MergeTypedefNameDecl(TypedefNameDecl *New, LookupResult &OldDecls) {
// The types match. Link up the redeclaration chain if the old
// declaration was a typedef.
- // FIXME: this is a potential source of wierdness if the type
+ // FIXME: this is a potential source of weirdness if the type
// spellings don't match exactly.
if (TypedefNameDecl *Typedef = dyn_cast<TypedefNameDecl>(Old))
New->setPreviousDeclaration(Typedef);
@@ -1527,7 +1545,8 @@ Sema::CXXSpecialMember Sema::getSpecialMember(const CXXMethodDecl *MD) {
/// GNU89 mode.
static bool canRedefineFunction(const FunctionDecl *FD,
const LangOptions& LangOpts) {
- return (LangOpts.GNUInline && !LangOpts.CPlusPlus &&
+ return ((FD->hasAttr<GNUInlineAttr>() || LangOpts.GNUInline) &&
+ !LangOpts.CPlusPlus &&
FD->isInlineSpecified() &&
FD->getStorageClass() == SC_Extern);
}
@@ -1927,6 +1946,7 @@ bool Sema::MergeCompatibleFunctionDecls(FunctionDecl *New, FunctionDecl *Old) {
return false;
}
+
void Sema::mergeObjCMethodDecls(ObjCMethodDecl *newMethod,
const ObjCMethodDecl *oldMethod) {
// Merge the attributes.
@@ -2037,6 +2057,15 @@ void Sema::MergeVarDecl(VarDecl *New, LookupResult &Previous) {
}
mergeDeclAttributes(New, Old, Context);
+ // Warn if an already-declared variable is made a weak_import in a subsequent declaration
+ if (New->getAttr<WeakImportAttr>() &&
+ Old->getStorageClass() == SC_None &&
+ !Old->getAttr<WeakImportAttr>()) {
+ Diag(New->getLocation(), diag::warn_weak_import) << New->getDeclName();
+ Diag(Old->getLocation(), diag::note_previous_definition);
+ // Remove weak_import attribute on new declaration.
+ New->dropAttr<WeakImportAttr>();
+ }
// Merge the types.
MergeVarDeclTypes(New, Old);
@@ -2597,7 +2626,7 @@ Decl *Sema::BuildAnonymousStructOrUnion(Scope *S, DeclSpec &DS,
}
// Mock up a declarator.
- Declarator Dc(DS, Declarator::TypeNameContext);
+ Declarator Dc(DS, Declarator::MemberContext);
TypeSourceInfo *TInfo = GetTypeForDeclarator(Dc, S);
assert(TInfo && "couldn't build declarator info for anonymous struct/union");
@@ -2736,6 +2765,7 @@ Sema::GetNameFromUnqualifiedId(const UnqualifiedId &Name) {
switch (Name.getKind()) {
+ case UnqualifiedId::IK_ImplicitSelfParam:
case UnqualifiedId::IK_Identifier:
NameInfo.setName(Name.Identifier);
NameInfo.setLoc(Name.StartLocation);
@@ -2924,10 +2954,9 @@ static bool RebuildDeclaratorInCurrentInstantiation(Sema &S, Declarator &D,
return false;
}
-Decl *Sema::ActOnDeclarator(Scope *S, Declarator &D,
- bool IsFunctionDefinition) {
+Decl *Sema::ActOnDeclarator(Scope *S, Declarator &D) {
return HandleDeclarator(S, D, MultiTemplateParamsArg(*this),
- IsFunctionDefinition);
+ /*IsFunctionDefinition=*/false);
}
/// DiagnoseClassNameShadow - Implement C++ [class.mem]p13:
@@ -3274,8 +3303,18 @@ Sema::RegisterLocallyScopedExternCDecl(NamedDecl *ND,
if (S && IdResolver.ReplaceDecl(PrevDecl, ND)) {
// The previous declaration was found on the identifer resolver
// chain, so remove it from its scope.
- while (S && !S->isDeclScope(PrevDecl))
- S = S->getParent();
+
+ if (S->isDeclScope(PrevDecl)) {
+ // Special case for redeclarations in the SAME scope.
+ // Because this declaration is going to be added to the identifier chain
+ // later, we should temporarily take it OFF the chain.
+ IdResolver.RemoveDecl(ND);
+
+ } else {
+ // Find the scope for the original declaration.
+ while (S && !S->isDeclScope(PrevDecl))
+ S = S->getParent();
+ }
if (S)
S->RemoveDecl(PrevDecl);
@@ -3472,6 +3511,50 @@ static void SetNestedNameSpecifier(DeclaratorDecl *DD, Declarator &D) {
DD->setQualifierInfo(SS.getWithLocInContext(DD->getASTContext()));
}
+bool Sema::inferObjCARCLifetime(ValueDecl *decl) {
+ QualType type = decl->getType();
+ Qualifiers::ObjCLifetime lifetime = type.getObjCLifetime();
+ if (lifetime == Qualifiers::OCL_Autoreleasing) {
+ // Various kinds of declaration aren't allowed to be __autoreleasing.
+ unsigned kind = -1U;
+ if (VarDecl *var = dyn_cast<VarDecl>(decl)) {
+ if (var->hasAttr<BlocksAttr>())
+ kind = 0; // __block
+ else if (!var->hasLocalStorage())
+ kind = 1; // global
+ } else if (isa<ObjCIvarDecl>(decl)) {
+ kind = 3; // ivar
+ } else if (isa<FieldDecl>(decl)) {
+ kind = 2; // field
+ }
+
+ if (kind != -1U) {
+ Diag(decl->getLocation(), diag::err_arc_autoreleasing_var)
+ << kind;
+ }
+ } else if (lifetime == Qualifiers::OCL_None) {
+ // Try to infer lifetime.
+ if (!type->isObjCLifetimeType())
+ return false;
+
+ lifetime = type->getObjCARCImplicitLifetime();
+ type = Context.getLifetimeQualifiedType(type, lifetime);
+ decl->setType(type);
+ }
+
+ if (VarDecl *var = dyn_cast<VarDecl>(decl)) {
+ // Thread-local variables cannot have lifetime.
+ if (lifetime && lifetime != Qualifiers::OCL_ExplicitNone &&
+ var->isThreadSpecified()) {
+ Diag(var->getLocation(), diag::err_arc_thread_ownership)
+ << var->getType();
+ return true;
+ }
+ }
+
+ return false;
+}
+
NamedDecl*
Sema::ActOnVariableDeclarator(Scope *S, Declarator &D, DeclContext *DC,
QualType R, TypeSourceInfo *TInfo,
@@ -3630,6 +3713,11 @@ Sema::ActOnVariableDeclarator(Scope *S, Declarator &D, DeclContext *DC,
// Handle attributes prior to checking for duplicates in MergeVarDecl
ProcessDeclAttributes(S, NewVD, D);
+ // In auto-retain/release, infer strong retension for variables of
+ // retainable type.
+ if (getLangOptions().ObjCAutoRefCount && inferObjCARCLifetime(NewVD))
+ NewVD->setInvalidDecl();
+
// Handle GNU asm-label extension (encoded as an attribute).
if (Expr *E = (Expr*)D.getAsmLabel()) {
// The parser guarantees this is a string.
@@ -4007,10 +4095,10 @@ bool Sema::AddOverriddenMethods(CXXRecordDecl *DC, CXXMethodDecl *MD) {
for (CXXBasePaths::decl_iterator I = Paths.found_decls_begin(),
E = Paths.found_decls_end(); I != E; ++I) {
if (CXXMethodDecl *OldMD = dyn_cast<CXXMethodDecl>(*I)) {
+ MD->addOverriddenMethod(OldMD->getCanonicalDecl());
if (!CheckOverridingFunctionReturnType(MD, OldMD) &&
!CheckOverridingFunctionExceptionSpec(MD, OldMD) &&
!CheckIfOverriddenFunctionIsMarkedFinal(MD, OldMD)) {
- MD->addOverriddenMethod(OldMD->getCanonicalDecl());
AddedAny = true;
}
}
@@ -4035,7 +4123,7 @@ static void DiagnoseInvalidRedeclaration(Sema &S, FunctionDecl *NewFD) {
}
NamedDecl*
-Sema::ActOnFunctionDeclarator(Scope* S, Declarator& D, DeclContext* DC,
+Sema::ActOnFunctionDeclarator(Scope *S, Declarator &D, DeclContext *DC,
QualType R, TypeSourceInfo *TInfo,
LookupResult &Previous,
MultiTemplateParamsArg TemplateParamLists,
@@ -4611,9 +4699,18 @@ Sema::ActOnFunctionDeclarator(Scope* S, Declarator& D, DeclContext* DC,
// A storage-class-specifier shall not be specified in an explicit
// specialization (14.7.3)
if (SC != SC_None) {
- Diag(NewFD->getLocation(),
- diag::err_explicit_specialization_storage_class)
- << FixItHint::CreateRemoval(D.getDeclSpec().getStorageClassSpecLoc());
+ if (SC != NewFD->getStorageClass())
+ Diag(NewFD->getLocation(),
+ diag::err_explicit_specialization_inconsistent_storage_class)
+ << SC
+ << FixItHint::CreateRemoval(
+ D.getDeclSpec().getStorageClassSpecLoc());
+
+ else
+ Diag(NewFD->getLocation(),
+ diag::ext_explicit_specialization_storage_class)
+ << FixItHint::CreateRemoval(
+ D.getDeclSpec().getStorageClassSpecLoc());
}
} else if (isExplicitSpecialization && isa<CXXMethodDecl>(NewFD)) {
@@ -5208,12 +5305,8 @@ void Sema::AddInitializerToDecl(Decl *RealDecl, Expr *Init,
VarDecl *VDecl = dyn_cast<VarDecl>(RealDecl);
if (!VDecl) {
- if (getLangOptions().CPlusPlus &&
- RealDecl->getLexicalDeclContext()->isRecord() &&
- isa<NamedDecl>(RealDecl))
- Diag(RealDecl->getLocation(), diag::err_member_initialization);
- else
- Diag(RealDecl->getLocation(), diag::err_illegal_initializer);
+ assert(!isa<FieldDecl>(RealDecl) && "field init shouldn't get here");
+ Diag(RealDecl->getLocation(), diag::err_illegal_initializer);
RealDecl->setInvalidDecl();
return;
}
@@ -5232,6 +5325,10 @@ void Sema::AddInitializerToDecl(Decl *RealDecl, Expr *Init,
VDecl->setTypeSourceInfo(DeducedType);
VDecl->setType(DeducedType->getType());
+ // In ARC, infer lifetime.
+ if (getLangOptions().ObjCAutoRefCount && inferObjCARCLifetime(VDecl))
+ VDecl->setInvalidDecl();
+
// If this is a redeclaration, check that the type we just deduced matches
// the previously declared type.
if (VarDecl *Old = VDecl->getPreviousDeclaration())
@@ -5372,15 +5469,23 @@ void Sema::AddInitializerToDecl(Decl *RealDecl, Expr *Init,
// We allow integer constant expressions in all cases.
} else if (T->isIntegralOrEnumerationType()) {
- if (!Init->isValueDependent()) {
- // Check whether the expression is a constant expression.
- llvm::APSInt Value;
- SourceLocation Loc;
- if (!Init->isIntegerConstantExpr(Value, Context, &Loc)) {
- Diag(Loc, diag::err_in_class_initializer_non_constant)
- << Init->getSourceRange();
- VDecl->setInvalidDecl();
- }
+ // Check whether the expression is a constant expression.
+ SourceLocation Loc;
+ if (Init->isValueDependent())
+ ; // Nothing to check.
+ else if (Init->isIntegerConstantExpr(Context, &Loc))
+ ; // Ok, it's an ICE!
+ else if (Init->isEvaluatable(Context)) {
+ // If we can constant fold the initializer through heroics, accept it,
+ // but report this as a use of an extension for -pedantic.
+ Diag(Loc, diag::ext_in_class_initializer_non_constant)
+ << Init->getSourceRange();
+ } else {
+ // Otherwise, this is some crazy unknown case. Report the issue at the
+ // location provided by the isIntegerConstantExpr failed check.
+ Diag(Loc, diag::err_in_class_initializer_non_constant)
+ << Init->getSourceRange();
+ VDecl->setInvalidDecl();
}
// We allow floating-point constants as an extension in C++03, and
@@ -5466,7 +5571,10 @@ void Sema::AddInitializerToDecl(Decl *RealDecl, Expr *Init,
// Check any implicit conversions within the expression.
CheckImplicitConversions(Init, VDecl->getLocation());
-
+
+ if (!VDecl->isInvalidDecl())
+ checkUnsafeAssigns(VDecl->getLocation(), VDecl->getType(), Init);
+
Init = MaybeCreateExprWithCleanups(Init);
// Attach the initializer to the decl.
VDecl->setInit(Init);
@@ -5735,6 +5843,23 @@ void Sema::ActOnCXXForRangeDecl(Decl *D) {
void Sema::CheckCompleteVariableDeclaration(VarDecl *var) {
if (var->isInvalidDecl()) return;
+ // In ARC, don't allow jumps past the implicit initialization of a
+ // local retaining variable.
+ if (getLangOptions().ObjCAutoRefCount &&
+ var->hasLocalStorage()) {
+ switch (var->getType().getObjCLifetime()) {
+ case Qualifiers::OCL_None:
+ case Qualifiers::OCL_ExplicitNone:
+ case Qualifiers::OCL_Autoreleasing:
+ break;
+
+ case Qualifiers::OCL_Weak:
+ case Qualifiers::OCL_Strong:
+ getCurFunction()->setHasBranchProtectedScope();
+ break;
+ }
+ }
+
// All the following checks are C++ only.
if (!getLangOptions().CPlusPlus) return;
@@ -5874,21 +5999,13 @@ Decl *Sema::ActOnParamDeclarator(Scope *S, Declarator &D) {
DiagnoseFunctionSpecifiers(D);
- TagDecl *OwnedDecl = 0;
- TypeSourceInfo *TInfo = GetTypeForDeclarator(D, S, &OwnedDecl);
+ TypeSourceInfo *TInfo = GetTypeForDeclarator(D, S);
QualType parmDeclType = TInfo->getType();
if (getLangOptions().CPlusPlus) {
// Check that there are no default arguments inside the type of this
// parameter.
CheckExtraCXXDefaultArguments(D);
-
- if (OwnedDecl && OwnedDecl->isDefinition()) {
- // C++ [dcl.fct]p6:
- // Types shall not be defined in return or parameter types.
- Diag(OwnedDecl->getLocation(), diag::err_type_defined_in_param_type)
- << Context.getTypeDeclType(OwnedDecl);
- }
// Parameter declarators cannot be qualified (C++ [dcl.meaning]p1).
if (D.getCXXScopeSpec().isSet()) {
@@ -6003,7 +6120,7 @@ void Sema::DiagnoseSizeOfParametersAndReturnValue(ParmVarDecl * const *Param,
// Warn if the return value is pass-by-value and larger than the specified
// threshold.
- if (ReturnTy->isPODType()) {
+ if (ReturnTy.isPODType(Context)) {
unsigned Size = Context.getTypeSizeInChars(ReturnTy).getQuantity();
if (Size > LangOpts.NumLargeByValueCopy)
Diag(D->getLocation(), diag::warn_return_value_size)
@@ -6014,7 +6131,7 @@ void Sema::DiagnoseSizeOfParametersAndReturnValue(ParmVarDecl * const *Param,
// threshold.
for (; Param != ParamEnd; ++Param) {
QualType T = (*Param)->getType();
- if (!T->isPODType())
+ if (!T.isPODType(Context))
continue;
unsigned Size = Context.getTypeSizeInChars(T).getQuantity();
if (Size > LangOpts.NumLargeByValueCopy)
@@ -6028,8 +6145,31 @@ ParmVarDecl *Sema::CheckParameter(DeclContext *DC, SourceLocation StartLoc,
QualType T, TypeSourceInfo *TSInfo,
VarDecl::StorageClass StorageClass,
VarDecl::StorageClass StorageClassAsWritten) {
+ // In ARC, infer a lifetime qualifier for appropriate parameter types.
+ if (getLangOptions().ObjCAutoRefCount &&
+ T.getObjCLifetime() == Qualifiers::OCL_None &&
+ T->isObjCLifetimeType()) {
+
+ Qualifiers::ObjCLifetime lifetime;
+
+ // Special cases for arrays:
+ // - if it's const, use __unsafe_unretained
+ // - otherwise, it's an error
+ if (T->isArrayType()) {
+ if (!T.isConstQualified()) {
+ Diag(NameLoc, diag::err_arc_array_param_no_ownership)
+ << TSInfo->getTypeLoc().getSourceRange();
+ }
+ lifetime = Qualifiers::OCL_ExplicitNone;
+ } else {
+ lifetime = T->getObjCARCImplicitLifetime();
+ }
+ T = Context.getLifetimeQualifiedType(T, lifetime);
+ }
+
ParmVarDecl *New = ParmVarDecl::Create(Context, DC, StartLoc, NameLoc, Name,
- adjustParameterType(T), TSInfo,
+ Context.getAdjustedParameterType(T),
+ TSInfo,
StorageClass, StorageClassAsWritten,
0);
@@ -6318,6 +6458,10 @@ Decl *Sema::ActOnFinishFunctionBody(Decl *dcl, Stmt *Body,
// Implements C++ [basic.start.main]p5 and C99 5.1.2.2.3.
FD->setHasImplicitReturnZero(true);
WP.disableCheckFallThrough();
+ } else if (FD->hasAttr<NakedAttr>()) {
+ // If the function is marked 'naked', don't complain about missing return
+ // statements.
+ WP.disableCheckFallThrough();
}
// MSVC permits the use of pure specifier (=0) on function definition,
@@ -6364,7 +6508,7 @@ Decl *Sema::ActOnFinishFunctionBody(Decl *dcl, Stmt *Body,
// Verify that that gotos and switch cases don't jump into scopes illegally.
if (getCurFunction()->NeedsScopeChecking() &&
!dcl->isInvalidDecl() &&
- !hasAnyErrorsInThisFunction())
+ !hasAnyUnrecoverableErrorsInThisFunction())
DiagnoseInvalidJumps(Body);
if (CXXDestructorDecl *Destructor = dyn_cast<CXXDestructorDecl>(dcl)) {
@@ -6379,15 +6523,17 @@ Decl *Sema::ActOnFinishFunctionBody(Decl *dcl, Stmt *Body,
// been leftover. This ensures that these temporaries won't be picked up for
// deletion in some later function.
if (PP.getDiagnostics().hasErrorOccurred() ||
- PP.getDiagnostics().getSuppressAllDiagnostics())
+ PP.getDiagnostics().getSuppressAllDiagnostics()) {
ExprTemporaries.clear();
- else if (!isa<FunctionTemplateDecl>(dcl)) {
+ ExprNeedsCleanups = false;
+ } else if (!isa<FunctionTemplateDecl>(dcl)) {
// Since the body is valid, issue any analysis-based warnings that are
// enabled.
ActivePolicy = &WP;
}
assert(ExprTemporaries.empty() && "Leftover temporaries in function");
+ assert(!ExprNeedsCleanups && "Unaccounted cleanups in function");
}
if (!IsInstantiation)
@@ -6398,8 +6544,10 @@ Decl *Sema::ActOnFinishFunctionBody(Decl *dcl, Stmt *Body,
// If any errors have occurred, clear out any temporaries that may have
// been leftover. This ensures that these temporaries won't be picked up for
// deletion in some later function.
- if (getDiagnostics().hasErrorOccurred())
+ if (getDiagnostics().hasErrorOccurred()) {
ExprTemporaries.clear();
+ ExprNeedsCleanups = false;
+ }
return dcl;
}
@@ -6439,6 +6587,7 @@ NamedDecl *Sema::ImplicitlyDefineFunction(SourceLocation Loc,
Declarator D(DS, Declarator::BlockContext);
D.AddTypeInfo(DeclaratorChunk::getFunction(false, false, SourceLocation(), 0,
0, 0, true, SourceLocation(),
+ SourceLocation(),
EST_None, SourceLocation(),
0, 0, 0, 0, Loc, Loc, D),
DS.getAttributes(),
@@ -6466,6 +6615,9 @@ NamedDecl *Sema::ImplicitlyDefineFunction(SourceLocation Loc,
/// These attributes can apply both to implicitly-declared builtins
/// (like __builtin___printf_chk) or to library-declared functions
/// like NSLog or printf.
+///
+/// We need to check for duplicate attributes both here and where user-written
+/// attributes are applied to declarations.
void Sema::AddKnownFunctionAttributes(FunctionDecl *FD) {
if (FD->isInvalidDecl())
return;
@@ -6499,9 +6651,9 @@ void Sema::AddKnownFunctionAttributes(FunctionDecl *FD) {
FD->addAttr(::new (Context) ConstAttr(FD->getLocation(), Context));
}
- if (Context.BuiltinInfo.isNoThrow(BuiltinID))
+ if (Context.BuiltinInfo.isNoThrow(BuiltinID) && !FD->getAttr<NoThrowAttr>())
FD->addAttr(::new (Context) NoThrowAttr(FD->getLocation(), Context));
- if (Context.BuiltinInfo.isConst(BuiltinID))
+ if (Context.BuiltinInfo.isConst(BuiltinID) && !FD->getAttr<ConstAttr>())
FD->addAttr(::new (Context) ConstAttr(FD->getLocation(), Context));
}
@@ -7728,6 +7880,11 @@ FieldDecl *Sema::CheckFieldDecl(DeclarationName Name, QualType T,
// FIXME: What to pass instead of TUScope?
ProcessDeclAttributes(TUScope, NewFD, *D);
+ // In auto-retain/release, infer strong retension for fields of
+ // retainable type.
+ if (getLangOptions().ObjCAutoRefCount && inferObjCARCLifetime(NewFD))
+ NewFD->setInvalidDecl();
+
if (T.isObjCGCWeak())
Diag(Loc, diag::warn_attribute_weak_on_field);
@@ -7761,6 +7918,21 @@ bool Sema::CheckNontrivialField(FieldDecl *FD) {
member = CXXDestructor;
if (member != CXXInvalid) {
+ if (getLangOptions().ObjCAutoRefCount && RDecl->hasObjectMember()) {
+ // Objective-C++ ARC: it is an error to have a non-trivial field of
+ // a union. However, system headers in Objective-C programs
+ // occasionally have Objective-C lifetime objects within unions,
+ // and rather than cause the program to fail, we make those
+ // members unavailable.
+ SourceLocation Loc = FD->getLocation();
+ if (getSourceManager().isInSystemHeader(Loc)) {
+ if (!FD->hasAttr<UnavailableAttr>())
+ FD->addAttr(new (Context) UnavailableAttr(Loc, Context,
+ "this system field has retaining ownership"));
+ return false;
+ }
+ }
+
Diag(FD->getLocation(), diag::err_illegal_union_or_anon_struct_member)
<< (int)FD->getParent()->isUnion() << FD->getDeclName() << member;
DiagnoseNontrivial(RT, member);
@@ -7913,6 +8085,21 @@ void Sema::DiagnoseNontrivial(const RecordType* T, CXXSpecialMember member) {
return;
}
}
+
+ if (EltTy->isObjCLifetimeType()) {
+ switch (EltTy.getObjCLifetime()) {
+ case Qualifiers::OCL_None:
+ case Qualifiers::OCL_ExplicitNone:
+ break;
+
+ case Qualifiers::OCL_Autoreleasing:
+ case Qualifiers::OCL_Weak:
+ case Qualifiers::OCL_Strong:
+ Diag((*fi)->getLocation(), diag::note_nontrivial_objc_ownership)
+ << QT << EltTy.getObjCLifetime();
+ return;
+ }
+ }
}
assert(0 && "found no explanation for non-trivial member");
@@ -8022,6 +8209,10 @@ Decl *Sema::ActOnIvar(Scope *S,
if (D.isInvalidType())
NewID->setInvalidDecl();
+ // In ARC, infer 'retaining' for ivars of retainable type.
+ if (getLangOptions().ObjCAutoRefCount && inferObjCARCLifetime(NewID))
+ NewID->setInvalidDecl();
+
if (II) {
// FIXME: When interfaces are DeclContexts, we'll need to add
// these to the interface.
@@ -8093,6 +8284,7 @@ void Sema::ActOnFields(Scope* S,
llvm::SmallVector<FieldDecl*, 32> RecFields;
RecordDecl *Record = dyn_cast<RecordDecl>(EnclosingDecl);
+ bool ARCErrReported = false;
for (unsigned i = 0; i != NumFields; ++i) {
FieldDecl *FD = cast<FieldDecl>(Fields[i]);
@@ -8158,7 +8350,7 @@ void Sema::ActOnFields(Scope* S,
continue;
}
if (!FD->getType()->isDependentType() &&
- !Context.getBaseElementType(FD->getType())->isPODType()) {
+ !Context.getBaseElementType(FD->getType()).isPODType(Context)) {
Diag(FD->getLocation(), diag::err_flexible_array_has_nonpod_type)
<< FD->getDeclName() << FD->getType();
FD->setInvalidDecl();
@@ -8205,17 +8397,45 @@ void Sema::ActOnFields(Scope* S,
FD->setInvalidDecl();
EnclosingDecl->setInvalidDecl();
continue;
- } else if (getLangOptions().ObjC1 &&
+ }
+ else if (!getLangOptions().CPlusPlus) {
+ if (getLangOptions().ObjCAutoRefCount && Record && !ARCErrReported) {
+ // It's an error in ARC if a field has lifetime.
+ // We don't want to report this in a system header, though,
+ // so we just make the field unavailable.
+ // FIXME: that's really not sufficient; we need to make the type
+ // itself invalid to, say, initialize or copy.
+ QualType T = FD->getType();
+ Qualifiers::ObjCLifetime lifetime = T.getObjCLifetime();
+ if (lifetime && lifetime != Qualifiers::OCL_ExplicitNone) {
+ SourceLocation loc = FD->getLocation();
+ if (getSourceManager().isInSystemHeader(loc)) {
+ if (!FD->hasAttr<UnavailableAttr>()) {
+ FD->addAttr(new (Context) UnavailableAttr(loc, Context,
+ "this system field has retaining ownership"));
+ }
+ } else {
+ Diag(FD->getLocation(), diag::err_arc_objc_object_in_struct);
+ }
+ ARCErrReported = true;
+ }
+ }
+ else if (getLangOptions().ObjC1 &&
getLangOptions().getGCMode() != LangOptions::NonGC &&
- Record &&
- (FD->getType()->isObjCObjectPointerType() ||
- FD->getType().isObjCGCStrong()))
- Record->setHasObjectMember(true);
- else if (Context.getAsArrayType(FD->getType())) {
- QualType BaseType = Context.getBaseElementType(FD->getType());
- if (Record && BaseType->isRecordType() &&
- BaseType->getAs<RecordType>()->getDecl()->hasObjectMember())
- Record->setHasObjectMember(true);
+ Record && !Record->hasObjectMember()) {
+ if (FD->getType()->isObjCObjectPointerType() ||
+ FD->getType().isObjCGCStrong())
+ Record->setHasObjectMember(true);
+ else if (Context.getAsArrayType(FD->getType())) {
+ QualType BaseType = Context.getBaseElementType(FD->getType());
+ if (BaseType->isRecordType() &&
+ BaseType->getAs<RecordType>()->getDecl()->hasObjectMember())
+ Record->setHasObjectMember(true);
+ else if (BaseType->isObjCObjectPointerType() ||
+ BaseType.isObjCGCStrong())
+ Record->setHasObjectMember(true);
+ }
+ }
}
// Keep track of the number of named members.
if (FD->getIdentifier())
@@ -8234,6 +8454,42 @@ void Sema::ActOnFields(Scope* S,
Convs->setAccess(I, (*I)->getAccess());
if (!CXXRecord->isDependentType()) {
+ // Objective-C Automatic Reference Counting:
+ // If a class has a non-static data member of Objective-C pointer
+ // type (or array thereof), it is a non-POD type and its
+ // default constructor (if any), copy constructor, copy assignment
+ // operator, and destructor are non-trivial.
+ //
+ // This rule is also handled by CXXRecordDecl::completeDefinition().
+ // However, here we check whether this particular class is only
+ // non-POD because of the presence of an Objective-C pointer member.
+ // If so, objects of this type cannot be shared between code compiled
+ // with instant objects and code compiled with manual retain/release.
+ if (getLangOptions().ObjCAutoRefCount &&
+ CXXRecord->hasObjectMember() &&
+ CXXRecord->getLinkage() == ExternalLinkage) {
+ if (CXXRecord->isPOD()) {
+ Diag(CXXRecord->getLocation(),
+ diag::warn_arc_non_pod_class_with_object_member)
+ << CXXRecord;
+ } else {
+ // FIXME: Fix-Its would be nice here, but finding a good location
+ // for them is going to be tricky.
+ if (CXXRecord->hasTrivialCopyConstructor())
+ Diag(CXXRecord->getLocation(),
+ diag::warn_arc_trivial_member_function_with_object_member)
+ << CXXRecord << 0;
+ if (CXXRecord->hasTrivialCopyAssignment())
+ Diag(CXXRecord->getLocation(),
+ diag::warn_arc_trivial_member_function_with_object_member)
+ << CXXRecord << 1;
+ if (CXXRecord->hasTrivialDestructor())
+ Diag(CXXRecord->getLocation(),
+ diag::warn_arc_trivial_member_function_with_object_member)
+ << CXXRecord << 2;
+ }
+ }
+
// Adjust user-defined destructor exception spec.
if (getLangOptions().CPlusPlus0x &&
CXXRecord->hasUserDeclaredDestructor())
@@ -8807,7 +9063,7 @@ void Sema::ActOnEnumBody(SourceLocation EnumLoc, SourceLocation LBraceLoc,
// Adjust the Expr initializer and type.
if (ECD->getInitExpr() &&
- !Context.hasSameType(NewTy, ECD->getInitExpr()->getType()))
+ !Context.hasSameType(NewTy, ECD->getInitExpr()->getType()))
ECD->setInitExpr(ImplicitCastExpr::Create(Context, NewTy,
CK_IntegralCast,
ECD->getInitExpr(),
diff --git a/contrib/llvm/tools/clang/lib/Sema/SemaDeclAttr.cpp b/contrib/llvm/tools/clang/lib/Sema/SemaDeclAttr.cpp
index 7f93ab7..61b7b3e 100644
--- a/contrib/llvm/tools/clang/lib/Sema/SemaDeclAttr.cpp
+++ b/contrib/llvm/tools/clang/lib/Sema/SemaDeclAttr.cpp
@@ -17,6 +17,7 @@
#include "clang/AST/DeclCXX.h"
#include "clang/AST/DeclObjC.h"
#include "clang/AST/Expr.h"
+#include "clang/Basic/SourceManager.h"
#include "clang/Basic/TargetInfo.h"
#include "clang/Sema/DeclSpec.h"
#include "clang/Sema/DelayedDiagnostic.h"
@@ -48,14 +49,14 @@ enum {
// Helper functions
//===----------------------------------------------------------------------===//
-static const FunctionType *getFunctionType(const Decl *d,
+static const FunctionType *getFunctionType(const Decl *D,
bool blocksToo = true) {
QualType Ty;
- if (const ValueDecl *decl = dyn_cast<ValueDecl>(d))
+ if (const ValueDecl *decl = dyn_cast<ValueDecl>(D))
Ty = decl->getType();
- else if (const FieldDecl *decl = dyn_cast<FieldDecl>(d))
+ else if (const FieldDecl *decl = dyn_cast<FieldDecl>(D))
Ty = decl->getType();
- else if (const TypedefNameDecl* decl = dyn_cast<TypedefNameDecl>(d))
+ else if (const TypedefNameDecl* decl = dyn_cast<TypedefNameDecl>(D))
Ty = decl->getUnderlyingType();
else
return 0;
@@ -73,46 +74,47 @@ static const FunctionType *getFunctionType(const Decl *d,
/// isFunction - Return true if the given decl has function
/// type (function or function-typed variable).
-static bool isFunction(const Decl *d) {
- return getFunctionType(d, false) != NULL;
+static bool isFunction(const Decl *D) {
+ return getFunctionType(D, false) != NULL;
}
/// isFunctionOrMethod - Return true if the given decl has function
/// type (function or function-typed variable) or an Objective-C
/// method.
-static bool isFunctionOrMethod(const Decl *d) {
- return isFunction(d)|| isa<ObjCMethodDecl>(d);
+static bool isFunctionOrMethod(const Decl *D) {
+ return isFunction(D)|| isa<ObjCMethodDecl>(D);
}
/// isFunctionOrMethodOrBlock - Return true if the given decl has function
/// type (function or function-typed variable) or an Objective-C
/// method or a block.
-static bool isFunctionOrMethodOrBlock(const Decl *d) {
- if (isFunctionOrMethod(d))
+static bool isFunctionOrMethodOrBlock(const Decl *D) {
+ if (isFunctionOrMethod(D))
return true;
// check for block is more involved.
- if (const VarDecl *V = dyn_cast<VarDecl>(d)) {
+ if (const VarDecl *V = dyn_cast<VarDecl>(D)) {
QualType Ty = V->getType();
return Ty->isBlockPointerType();
}
- return isa<BlockDecl>(d);
+ return isa<BlockDecl>(D);
}
/// Return true if the given decl has a declarator that should have
/// been processed by Sema::GetTypeForDeclarator.
-static bool hasDeclarator(const Decl *d) {
- // In some sense, TypedefNameDecl really *ought* to be a DeclaratorDecl.
- return isa<DeclaratorDecl>(d) || isa<BlockDecl>(d) || isa<TypedefNameDecl>(d);
+static bool hasDeclarator(const Decl *D) {
+ // In some sense, TypedefDecl really *ought* to be a DeclaratorDecl.
+ return isa<DeclaratorDecl>(D) || isa<BlockDecl>(D) || isa<TypedefNameDecl>(D) ||
+ isa<ObjCPropertyDecl>(D);
}
/// hasFunctionProto - Return true if the given decl has a argument
/// information. This decl should have already passed
/// isFunctionOrMethod or isFunctionOrMethodOrBlock.
-static bool hasFunctionProto(const Decl *d) {
- if (const FunctionType *FnTy = getFunctionType(d))
+static bool hasFunctionProto(const Decl *D) {
+ if (const FunctionType *FnTy = getFunctionType(D))
return isa<FunctionProtoType>(FnTy);
else {
- assert(isa<ObjCMethodDecl>(d) || isa<BlockDecl>(d));
+ assert(isa<ObjCMethodDecl>(D) || isa<BlockDecl>(D));
return true;
}
}
@@ -120,42 +122,42 @@ static bool hasFunctionProto(const Decl *d) {
/// getFunctionOrMethodNumArgs - Return number of function or method
/// arguments. It is an error to call this on a K&R function (use
/// hasFunctionProto first).
-static unsigned getFunctionOrMethodNumArgs(const Decl *d) {
- if (const FunctionType *FnTy = getFunctionType(d))
+static unsigned getFunctionOrMethodNumArgs(const Decl *D) {
+ if (const FunctionType *FnTy = getFunctionType(D))
return cast<FunctionProtoType>(FnTy)->getNumArgs();
- if (const BlockDecl *BD = dyn_cast<BlockDecl>(d))
+ if (const BlockDecl *BD = dyn_cast<BlockDecl>(D))
return BD->getNumParams();
- return cast<ObjCMethodDecl>(d)->param_size();
+ return cast<ObjCMethodDecl>(D)->param_size();
}
-static QualType getFunctionOrMethodArgType(const Decl *d, unsigned Idx) {
- if (const FunctionType *FnTy = getFunctionType(d))
+static QualType getFunctionOrMethodArgType(const Decl *D, unsigned Idx) {
+ if (const FunctionType *FnTy = getFunctionType(D))
return cast<FunctionProtoType>(FnTy)->getArgType(Idx);
- if (const BlockDecl *BD = dyn_cast<BlockDecl>(d))
+ if (const BlockDecl *BD = dyn_cast<BlockDecl>(D))
return BD->getParamDecl(Idx)->getType();
- return cast<ObjCMethodDecl>(d)->param_begin()[Idx]->getType();
+ return cast<ObjCMethodDecl>(D)->param_begin()[Idx]->getType();
}
-static QualType getFunctionOrMethodResultType(const Decl *d) {
- if (const FunctionType *FnTy = getFunctionType(d))
+static QualType getFunctionOrMethodResultType(const Decl *D) {
+ if (const FunctionType *FnTy = getFunctionType(D))
return cast<FunctionProtoType>(FnTy)->getResultType();
- return cast<ObjCMethodDecl>(d)->getResultType();
+ return cast<ObjCMethodDecl>(D)->getResultType();
}
-static bool isFunctionOrMethodVariadic(const Decl *d) {
- if (const FunctionType *FnTy = getFunctionType(d)) {
+static bool isFunctionOrMethodVariadic(const Decl *D) {
+ if (const FunctionType *FnTy = getFunctionType(D)) {
const FunctionProtoType *proto = cast<FunctionProtoType>(FnTy);
return proto->isVariadic();
- } else if (const BlockDecl *BD = dyn_cast<BlockDecl>(d))
+ } else if (const BlockDecl *BD = dyn_cast<BlockDecl>(D))
return BD->isVariadic();
else {
- return cast<ObjCMethodDecl>(d)->isVariadic();
+ return cast<ObjCMethodDecl>(D)->isVariadic();
}
}
-static bool isInstanceMethod(const Decl *d) {
- if (const CXXMethodDecl *MethodDecl = dyn_cast<CXXMethodDecl>(d))
+static bool isInstanceMethod(const Decl *D) {
+ if (const CXXMethodDecl *MethodDecl = dyn_cast<CXXMethodDecl>(D))
return MethodDecl->isInstance();
return false;
}
@@ -192,6 +194,16 @@ static inline bool isCFStringType(QualType T, ASTContext &Ctx) {
return RD->getIdentifier() == &Ctx.Idents.get("__CFString");
}
+static bool checkAttributeNumArgs(Sema &S, const AttributeList &Attr,
+ unsigned int Num) {
+ if (Attr.getNumArgs() != Num) {
+ S.Diag(Attr.getLoc(), diag::err_attribute_wrong_number_arguments) << Num;
+ return false;
+ }
+
+ return true;
+}
+
//===----------------------------------------------------------------------===//
// Attribute Implementations
//===----------------------------------------------------------------------===//
@@ -200,9 +212,9 @@ static inline bool isCFStringType(QualType T, ASTContext &Ctx) {
// least add some helper functions to check most argument patterns (#
// and types of args).
-static void HandleExtVectorTypeAttr(Scope *scope, Decl *d,
- const AttributeList &Attr, Sema &S) {
- TypedefNameDecl *tDecl = dyn_cast<TypedefNameDecl>(d);
+static void handleExtVectorTypeAttr(Sema &S, Scope *scope, Decl *D,
+ const AttributeList &Attr) {
+ TypedefNameDecl *tDecl = dyn_cast<TypedefNameDecl>(D);
if (tDecl == 0) {
S.Diag(Attr.getLoc(), diag::err_typecheck_ext_vector_not_typedef);
return;
@@ -217,13 +229,17 @@ static void HandleExtVectorTypeAttr(Scope *scope, Decl *d,
CXXScopeSpec SS;
UnqualifiedId id;
id.setIdentifier(Attr.getParameterName(), Attr.getLoc());
- sizeExpr = S.ActOnIdExpression(scope, SS, id, false, false).takeAs<Expr>();
+
+ ExprResult Size = S.ActOnIdExpression(scope, SS, id, false, false);
+ if (Size.isInvalid())
+ return;
+
+ sizeExpr = Size.get();
} else {
// check the attribute arguments.
- if (Attr.getNumArgs() != 1) {
- S.Diag(Attr.getLoc(), diag::err_attribute_wrong_number_arguments) << 1;
+ if (!checkAttributeNumArgs(S, Attr, 1))
return;
- }
+
sizeExpr = Attr.getArg(0);
}
@@ -239,16 +255,14 @@ static void HandleExtVectorTypeAttr(Scope *scope, Decl *d,
}
}
-static void HandlePackedAttr(Decl *d, const AttributeList &Attr, Sema &S) {
+static void handlePackedAttr(Sema &S, Decl *D, const AttributeList &Attr) {
// check the attribute arguments.
- if (Attr.getNumArgs() > 0) {
- S.Diag(Attr.getLoc(), diag::err_attribute_wrong_number_arguments) << 0;
+ if (!checkAttributeNumArgs(S, Attr, 0))
return;
- }
- if (TagDecl *TD = dyn_cast<TagDecl>(d))
+ if (TagDecl *TD = dyn_cast<TagDecl>(D))
TD->addAttr(::new (S.Context) PackedAttr(Attr.getLoc(), S.Context));
- else if (FieldDecl *FD = dyn_cast<FieldDecl>(d)) {
+ else if (FieldDecl *FD = dyn_cast<FieldDecl>(D)) {
// If the alignment is less than or equal to 8 bits, the packed attribute
// has no effect.
if (!FD->getType()->isIncompleteType() &&
@@ -261,49 +275,45 @@ static void HandlePackedAttr(Decl *d, const AttributeList &Attr, Sema &S) {
S.Diag(Attr.getLoc(), diag::warn_attribute_ignored) << Attr.getName();
}
-static void HandleMsStructAttr(Decl *d, const AttributeList &Attr, Sema &S) {
- if (TagDecl *TD = dyn_cast<TagDecl>(d))
+static void handleMsStructAttr(Sema &S, Decl *D, const AttributeList &Attr) {
+ if (TagDecl *TD = dyn_cast<TagDecl>(D))
TD->addAttr(::new (S.Context) MsStructAttr(Attr.getLoc(), S.Context));
else
S.Diag(Attr.getLoc(), diag::warn_attribute_ignored) << Attr.getName();
}
-static void HandleIBAction(Decl *d, const AttributeList &Attr, Sema &S) {
+static void handleIBAction(Sema &S, Decl *D, const AttributeList &Attr) {
// check the attribute arguments.
- if (Attr.getNumArgs() > 0) {
- S.Diag(Attr.getLoc(), diag::err_attribute_wrong_number_arguments) << 0;
+ if (!checkAttributeNumArgs(S, Attr, 0))
return;
- }
// The IBAction attributes only apply to instance methods.
- if (ObjCMethodDecl *MD = dyn_cast<ObjCMethodDecl>(d))
+ if (ObjCMethodDecl *MD = dyn_cast<ObjCMethodDecl>(D))
if (MD->isInstanceMethod()) {
- d->addAttr(::new (S.Context) IBActionAttr(Attr.getLoc(), S.Context));
+ D->addAttr(::new (S.Context) IBActionAttr(Attr.getLoc(), S.Context));
return;
}
S.Diag(Attr.getLoc(), diag::warn_attribute_ibaction) << Attr.getName();
}
-static void HandleIBOutlet(Decl *d, const AttributeList &Attr, Sema &S) {
+static void handleIBOutlet(Sema &S, Decl *D, const AttributeList &Attr) {
// check the attribute arguments.
- if (Attr.getNumArgs() > 0) {
- S.Diag(Attr.getLoc(), diag::err_attribute_wrong_number_arguments) << 0;
+ if (!checkAttributeNumArgs(S, Attr, 0))
return;
- }
// The IBOutlet attributes only apply to instance variables of
// Objective-C classes.
- if (isa<ObjCIvarDecl>(d) || isa<ObjCPropertyDecl>(d)) {
- d->addAttr(::new (S.Context) IBOutletAttr(Attr.getLoc(), S.Context));
+ if (isa<ObjCIvarDecl>(D) || isa<ObjCPropertyDecl>(D)) {
+ D->addAttr(::new (S.Context) IBOutletAttr(Attr.getLoc(), S.Context));
return;
}
S.Diag(Attr.getLoc(), diag::warn_attribute_iboutlet) << Attr.getName();
}
-static void HandleIBOutletCollection(Decl *d, const AttributeList &Attr,
- Sema &S) {
+static void handleIBOutletCollection(Sema &S, Decl *D,
+ const AttributeList &Attr) {
// The iboutletcollection attribute can have zero or one arguments.
if (Attr.getParameterName() && Attr.getNumArgs() > 0) {
@@ -313,17 +323,17 @@ static void HandleIBOutletCollection(Decl *d, const AttributeList &Attr,
// The IBOutletCollection attributes only apply to instance variables of
// Objective-C classes.
- if (!(isa<ObjCIvarDecl>(d) || isa<ObjCPropertyDecl>(d))) {
+ if (!(isa<ObjCIvarDecl>(D) || isa<ObjCPropertyDecl>(D))) {
S.Diag(Attr.getLoc(), diag::warn_attribute_iboutlet) << Attr.getName();
return;
}
- if (const ValueDecl *VD = dyn_cast<ValueDecl>(d))
+ if (const ValueDecl *VD = dyn_cast<ValueDecl>(D))
if (!VD->getType()->getAs<ObjCObjectPointerType>()) {
S.Diag(Attr.getLoc(), diag::err_iboutletcollection_object_type)
<< VD->getType() << 0;
return;
}
- if (const ObjCPropertyDecl *PD = dyn_cast<ObjCPropertyDecl>(d))
+ if (const ObjCPropertyDecl *PD = dyn_cast<ObjCPropertyDecl>(D))
if (!PD->getType()->getAs<ObjCObjectPointerType>()) {
S.Diag(Attr.getLoc(), diag::err_iboutletcollection_object_type)
<< PD->getType() << 1;
@@ -335,7 +345,7 @@ static void HandleIBOutletCollection(Decl *d, const AttributeList &Attr,
II = &S.Context.Idents.get("id");
ParsedType TypeRep = S.getTypeName(*II, Attr.getLoc(),
- S.getScopeForContext(d->getDeclContext()->getParent()));
+ S.getScopeForContext(D->getDeclContext()->getParent()));
if (!TypeRep) {
S.Diag(Attr.getLoc(), diag::err_iboutletcollection_type) << II;
return;
@@ -350,14 +360,29 @@ static void HandleIBOutletCollection(Decl *d, const AttributeList &Attr,
S.Diag(Attr.getLoc(), diag::err_iboutletcollection_type) << II;
return;
}
- d->addAttr(::new (S.Context) IBOutletCollectionAttr(Attr.getLoc(), S.Context,
+ D->addAttr(::new (S.Context) IBOutletCollectionAttr(Attr.getLoc(), S.Context,
QT));
}
-static void HandleNonNullAttr(Decl *d, const AttributeList &Attr, Sema &S) {
+static void possibleTransparentUnionPointerType(QualType &T) {
+ if (const RecordType *UT = T->getAsUnionType())
+ if (UT && UT->getDecl()->hasAttr<TransparentUnionAttr>()) {
+ RecordDecl *UD = UT->getDecl();
+ for (RecordDecl::field_iterator it = UD->field_begin(),
+ itend = UD->field_end(); it != itend; ++it) {
+ QualType QT = it->getType();
+ if (QT->isAnyPointerType() || QT->isBlockPointerType()) {
+ T = QT;
+ return;
+ }
+ }
+ }
+}
+
+static void handleNonNullAttr(Sema &S, Decl *D, const AttributeList &Attr) {
// GCC ignores the nonnull attribute on K&R style function prototypes, so we
// ignore it as well
- if (!isFunctionOrMethod(d) || !hasFunctionProto(d)) {
+ if (!isFunctionOrMethod(D) || !hasFunctionProto(D)) {
S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type)
<< Attr.getName() << ExpectedFunction;
return;
@@ -365,8 +390,8 @@ static void HandleNonNullAttr(Decl *d, const AttributeList &Attr, Sema &S) {
// In C++ the implicit 'this' function parameter also counts, and they are
// counted from one.
- bool HasImplicitThisParam = isInstanceMethod(d);
- unsigned NumArgs = getFunctionOrMethodNumArgs(d) + HasImplicitThisParam;
+ bool HasImplicitThisParam = isInstanceMethod(D);
+ unsigned NumArgs = getFunctionOrMethodNumArgs(D) + HasImplicitThisParam;
// The nonnull attribute only applies to pointers.
llvm::SmallVector<unsigned, 10> NonNullArgs;
@@ -405,7 +430,9 @@ static void HandleNonNullAttr(Decl *d, const AttributeList &Attr, Sema &S) {
}
// Is the function argument a pointer type?
- QualType T = getFunctionOrMethodArgType(d, x).getNonReferenceType();
+ QualType T = getFunctionOrMethodArgType(D, x).getNonReferenceType();
+ possibleTransparentUnionPointerType(T);
+
if (!T->isAnyPointerType() && !T->isBlockPointerType()) {
// FIXME: Should also highlight argument in decl.
S.Diag(Attr.getLoc(), diag::warn_nonnull_pointers_only)
@@ -419,23 +446,11 @@ static void HandleNonNullAttr(Decl *d, const AttributeList &Attr, Sema &S) {
// If no arguments were specified to __attribute__((nonnull)) then all pointer
// arguments have a nonnull attribute.
if (NonNullArgs.empty()) {
- for (unsigned I = 0, E = getFunctionOrMethodNumArgs(d); I != E; ++I) {
- QualType T = getFunctionOrMethodArgType(d, I).getNonReferenceType();
+ for (unsigned I = 0, E = getFunctionOrMethodNumArgs(D); I != E; ++I) {
+ QualType T = getFunctionOrMethodArgType(D, I).getNonReferenceType();
+ possibleTransparentUnionPointerType(T);
if (T->isAnyPointerType() || T->isBlockPointerType())
NonNullArgs.push_back(I);
- else if (const RecordType *UT = T->getAsUnionType()) {
- if (UT && UT->getDecl()->hasAttr<TransparentUnionAttr>()) {
- RecordDecl *UD = UT->getDecl();
- for (RecordDecl::field_iterator it = UD->field_begin(),
- itend = UD->field_end(); it != itend; ++it) {
- T = it->getType();
- if (T->isAnyPointerType() || T->isBlockPointerType()) {
- NonNullArgs.push_back(I);
- break;
- }
- }
- }
- }
}
// No pointer arguments?
@@ -451,11 +466,11 @@ static void HandleNonNullAttr(Decl *d, const AttributeList &Attr, Sema &S) {
unsigned* start = &NonNullArgs[0];
unsigned size = NonNullArgs.size();
llvm::array_pod_sort(start, start + size);
- d->addAttr(::new (S.Context) NonNullAttr(Attr.getLoc(), S.Context, start,
+ D->addAttr(::new (S.Context) NonNullAttr(Attr.getLoc(), S.Context, start,
size));
}
-static void HandleOwnershipAttr(Decl *d, const AttributeList &AL, Sema &S) {
+static void handleOwnershipAttr(Sema &S, Decl *D, const AttributeList &AL) {
// This attribute must be applied to a function declaration.
// The first argument to the attribute must be a string,
// the name of the resource, for example "malloc".
@@ -500,7 +515,7 @@ static void HandleOwnershipAttr(Decl *d, const AttributeList &AL, Sema &S) {
llvm_unreachable("Unknown ownership attribute");
}
- if (!isFunction(d) || !hasFunctionProto(d)) {
+ if (!isFunction(D) || !hasFunctionProto(D)) {
S.Diag(AL.getLoc(), diag::warn_attribute_wrong_decl_type)
<< AL.getName() << ExpectedFunction;
return;
@@ -508,8 +523,8 @@ static void HandleOwnershipAttr(Decl *d, const AttributeList &AL, Sema &S) {
// In C++ the implicit 'this' function parameter also counts, and they are
// counted from one.
- bool HasImplicitThisParam = isInstanceMethod(d);
- unsigned NumArgs = getFunctionOrMethodNumArgs(d) + HasImplicitThisParam;
+ bool HasImplicitThisParam = isInstanceMethod(D);
+ unsigned NumArgs = getFunctionOrMethodNumArgs(D) + HasImplicitThisParam;
llvm::StringRef Module = AL.getParameterName()->getName();
@@ -552,7 +567,7 @@ static void HandleOwnershipAttr(Decl *d, const AttributeList &AL, Sema &S) {
case OwnershipAttr::Takes:
case OwnershipAttr::Holds: {
// Is the function argument a pointer type?
- QualType T = getFunctionOrMethodArgType(d, x);
+ QualType T = getFunctionOrMethodArgType(D, x);
if (!T->isAnyPointerType() && !T->isBlockPointerType()) {
// FIXME: Should also highlight argument in decl.
S.Diag(AL.getLoc(), diag::err_ownership_type)
@@ -584,8 +599,8 @@ static void HandleOwnershipAttr(Decl *d, const AttributeList &AL, Sema &S) {
// Check we don't have a conflict with another ownership attribute.
for (specific_attr_iterator<OwnershipAttr>
- i = d->specific_attr_begin<OwnershipAttr>(),
- e = d->specific_attr_end<OwnershipAttr>();
+ i = D->specific_attr_begin<OwnershipAttr>(),
+ e = D->specific_attr_end<OwnershipAttr>();
i != e; ++i) {
if ((*i)->getOwnKind() != K) {
for (const unsigned *I = (*i)->args_begin(), *E = (*i)->args_end();
@@ -609,7 +624,7 @@ static void HandleOwnershipAttr(Decl *d, const AttributeList &AL, Sema &S) {
return;
}
- d->addAttr(::new (S.Context) OwnershipAttr(AL.getLoc(), S.Context, K, Module,
+ D->addAttr(::new (S.Context) OwnershipAttr(AL.getLoc(), S.Context, K, Module,
start, size));
}
@@ -633,20 +648,20 @@ static bool hasEffectivelyInternalLinkage(NamedDecl *D) {
return false;
}
-static void HandleWeakRefAttr(Decl *d, const AttributeList &Attr, Sema &S) {
+static void handleWeakRefAttr(Sema &S, Decl *D, const AttributeList &Attr) {
// Check the attribute arguments.
if (Attr.getNumArgs() > 1) {
S.Diag(Attr.getLoc(), diag::err_attribute_wrong_number_arguments) << 1;
return;
}
- if (!isa<VarDecl>(d) && !isa<FunctionDecl>(d)) {
+ if (!isa<VarDecl>(D) && !isa<FunctionDecl>(D)) {
S.Diag(Attr.getLoc(), diag::err_attribute_wrong_decl_type)
<< Attr.getName() << ExpectedVariableOrFunction;
return;
}
- NamedDecl *nd = cast<NamedDecl>(d);
+ NamedDecl *nd = cast<NamedDecl>(D);
// gcc rejects
// class c {
@@ -658,7 +673,7 @@ static void HandleWeakRefAttr(Decl *d, const AttributeList &Attr, Sema &S) {
// static int a __attribute__((weakref ("v2")));
// }
// we reject them
- const DeclContext *Ctx = d->getDeclContext()->getRedeclContext();
+ const DeclContext *Ctx = D->getDeclContext()->getRedeclContext();
if (!Ctx->isFileContext()) {
S.Diag(Attr.getLoc(), diag::err_attribute_weakref_not_global_context) <<
nd->getNameAsString();
@@ -704,14 +719,14 @@ static void HandleWeakRefAttr(Decl *d, const AttributeList &Attr, Sema &S) {
}
// GCC will accept anything as the argument of weakref. Should we
// check for an existing decl?
- d->addAttr(::new (S.Context) AliasAttr(Attr.getLoc(), S.Context,
+ D->addAttr(::new (S.Context) AliasAttr(Attr.getLoc(), S.Context,
Str->getString()));
}
- d->addAttr(::new (S.Context) WeakRefAttr(Attr.getLoc(), S.Context));
+ D->addAttr(::new (S.Context) WeakRefAttr(Attr.getLoc(), S.Context));
}
-static void HandleAliasAttr(Decl *d, const AttributeList &Attr, Sema &S) {
+static void handleAliasAttr(Sema &S, Decl *D, const AttributeList &Attr) {
// check the attribute arguments.
if (Attr.getNumArgs() != 1) {
S.Diag(Attr.getLoc(), diag::err_attribute_wrong_number_arguments) << 1;
@@ -735,55 +750,52 @@ static void HandleAliasAttr(Decl *d, const AttributeList &Attr, Sema &S) {
// FIXME: check if target symbol exists in current file
- d->addAttr(::new (S.Context) AliasAttr(Attr.getLoc(), S.Context,
+ D->addAttr(::new (S.Context) AliasAttr(Attr.getLoc(), S.Context,
Str->getString()));
}
-static void HandleNakedAttr(Decl *d, const AttributeList &Attr,
- Sema &S) {
+static void handleNakedAttr(Sema &S, Decl *D, const AttributeList &Attr) {
// Check the attribute arguments.
- if (Attr.getNumArgs() != 0) {
- S.Diag(Attr.getLoc(), diag::err_attribute_wrong_number_arguments) << 0;
+ if (!checkAttributeNumArgs(S, Attr, 0))
return;
- }
- if (!isa<FunctionDecl>(d)) {
+ if (!isa<FunctionDecl>(D)) {
S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type)
<< Attr.getName() << ExpectedFunction;
return;
}
- d->addAttr(::new (S.Context) NakedAttr(Attr.getLoc(), S.Context));
+ D->addAttr(::new (S.Context) NakedAttr(Attr.getLoc(), S.Context));
}
-static void HandleAlwaysInlineAttr(Decl *d, const AttributeList &Attr,
- Sema &S) {
+static void handleAlwaysInlineAttr(Sema &S, Decl *D,
+ const AttributeList &Attr) {
// Check the attribute arguments.
if (Attr.hasParameterOrArguments()) {
S.Diag(Attr.getLoc(), diag::err_attribute_wrong_number_arguments) << 0;
return;
}
- if (!isa<FunctionDecl>(d)) {
+ if (!isa<FunctionDecl>(D)) {
S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type)
<< Attr.getName() << ExpectedFunction;
return;
}
- d->addAttr(::new (S.Context) AlwaysInlineAttr(Attr.getLoc(), S.Context));
+ D->addAttr(::new (S.Context) AlwaysInlineAttr(Attr.getLoc(), S.Context));
}
-static void HandleMallocAttr(Decl *d, const AttributeList &Attr, Sema &S) {
+static void handleMallocAttr(Sema &S, Decl *D, const AttributeList &Attr) {
// Check the attribute arguments.
if (Attr.hasParameterOrArguments()) {
S.Diag(Attr.getLoc(), diag::err_attribute_wrong_number_arguments) << 0;
return;
}
- if (const FunctionDecl *FD = dyn_cast<FunctionDecl>(d)) {
+ if (const FunctionDecl *FD = dyn_cast<FunctionDecl>(D)) {
QualType RetTy = FD->getResultType();
if (RetTy->isAnyPointerType() || RetTy->isBlockPointerType()) {
- d->addAttr(::new (S.Context) MallocAttr(Attr.getLoc(), S.Context));
+ D->addAttr(::new (S.Context) MallocAttr(Attr.getLoc(), S.Context));
return;
}
}
@@ -791,46 +803,44 @@ static void HandleMallocAttr(Decl *d, const AttributeList &Attr, Sema &S) {
S.Diag(Attr.getLoc(), diag::warn_attribute_malloc_pointer_only);
}
-static void HandleMayAliasAttr(Decl *d, const AttributeList &Attr, Sema &S) {
+static void handleMayAliasAttr(Sema &S, Decl *D, const AttributeList &Attr) {
// check the attribute arguments.
- if (Attr.getNumArgs() != 0) {
- S.Diag(Attr.getLoc(), diag::err_attribute_wrong_number_arguments) << 0;
+ if (!checkAttributeNumArgs(S, Attr, 0))
return;
- }
- d->addAttr(::new (S.Context) MayAliasAttr(Attr.getLoc(), S.Context));
+ D->addAttr(::new (S.Context) MayAliasAttr(Attr.getLoc(), S.Context));
}
-static void HandleNoCommonAttr(Decl *d, const AttributeList &Attr, Sema &S) {
- assert(Attr.isInvalid() == false);
- if (isa<VarDecl>(d))
- d->addAttr(::new (S.Context) NoCommonAttr(Attr.getLoc(), S.Context));
+static void handleNoCommonAttr(Sema &S, Decl *D, const AttributeList &Attr) {
+ assert(!Attr.isInvalid());
+ if (isa<VarDecl>(D))
+ D->addAttr(::new (S.Context) NoCommonAttr(Attr.getLoc(), S.Context));
else
S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type)
<< Attr.getName() << ExpectedVariable;
}
-static void HandleCommonAttr(Decl *d, const AttributeList &Attr, Sema &S) {
- assert(Attr.isInvalid() == false);
- if (isa<VarDecl>(d))
- d->addAttr(::new (S.Context) CommonAttr(Attr.getLoc(), S.Context));
+static void handleCommonAttr(Sema &S, Decl *D, const AttributeList &Attr) {
+ assert(!Attr.isInvalid());
+ if (isa<VarDecl>(D))
+ D->addAttr(::new (S.Context) CommonAttr(Attr.getLoc(), S.Context));
else
S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type)
<< Attr.getName() << ExpectedVariable;
}
-static void HandleNoReturnAttr(Decl *d, const AttributeList &attr, Sema &S) {
- if (hasDeclarator(d)) return;
+static void handleNoReturnAttr(Sema &S, Decl *D, const AttributeList &attr) {
+ if (hasDeclarator(D)) return;
if (S.CheckNoReturnAttr(attr)) return;
- if (!isa<ObjCMethodDecl>(d)) {
+ if (!isa<ObjCMethodDecl>(D)) {
S.Diag(attr.getLoc(), diag::warn_attribute_wrong_decl_type)
<< attr.getName() << ExpectedFunctionOrMethod;
return;
}
- d->addAttr(::new (S.Context) NoReturnAttr(attr.getLoc(), S.Context));
+ D->addAttr(::new (S.Context) NoReturnAttr(attr.getLoc(), S.Context));
}
bool Sema::CheckNoReturnAttr(const AttributeList &attr) {
@@ -843,19 +853,17 @@ bool Sema::CheckNoReturnAttr(const AttributeList &attr) {
return false;
}
-static void HandleAnalyzerNoReturnAttr(Decl *d, const AttributeList &Attr,
- Sema &S) {
+static void handleAnalyzerNoReturnAttr(Sema &S, Decl *D,
+ const AttributeList &Attr) {
// The checking path for 'noreturn' and 'analyzer_noreturn' are different
// because 'analyzer_noreturn' does not impact the type.
- if (Attr.getNumArgs() != 0) {
- S.Diag(Attr.getLoc(), diag::err_attribute_wrong_number_arguments) << 0;
- return;
- }
+ if(!checkAttributeNumArgs(S, Attr, 0))
+ return;
- if (!isFunctionOrMethod(d) && !isa<BlockDecl>(d)) {
- ValueDecl *VD = dyn_cast<ValueDecl>(d);
+ if (!isFunctionOrMethod(D) && !isa<BlockDecl>(D)) {
+ ValueDecl *VD = dyn_cast<ValueDecl>(D);
if (VD == 0 || (!VD->getType()->isBlockPointerType()
&& !VD->getType()->isFunctionPointerType())) {
S.Diag(Attr.getLoc(),
@@ -866,12 +874,11 @@ static void HandleAnalyzerNoReturnAttr(Decl *d, const AttributeList &Attr,
}
}
- d->addAttr(::new (S.Context) AnalyzerNoReturnAttr(Attr.getLoc(), S.Context));
+ D->addAttr(::new (S.Context) AnalyzerNoReturnAttr(Attr.getLoc(), S.Context));
}
// PS3 PPU-specific.
-static void HandleVecReturnAttr(Decl *d, const AttributeList &Attr,
- Sema &S) {
+static void handleVecReturnAttr(Sema &S, Decl *D, const AttributeList &Attr) {
/*
Returning a Vector Class in Registers
@@ -895,18 +902,18 @@ static void HandleVecReturnAttr(Decl *d, const AttributeList &Attr,
return result; // This will be returned in a register
}
*/
- if (!isa<RecordDecl>(d)) {
+ if (!isa<RecordDecl>(D)) {
S.Diag(Attr.getLoc(), diag::err_attribute_wrong_decl_type)
<< Attr.getName() << ExpectedClass;
return;
}
- if (d->getAttr<VecReturnAttr>()) {
+ if (D->getAttr<VecReturnAttr>()) {
S.Diag(Attr.getLoc(), diag::err_repeat_attribute) << "vecreturn";
return;
}
- RecordDecl *record = cast<RecordDecl>(d);
+ RecordDecl *record = cast<RecordDecl>(D);
int count = 0;
if (!isa<CXXRecordDecl>(record)) {
@@ -928,11 +935,11 @@ static void HandleVecReturnAttr(Decl *d, const AttributeList &Attr,
count++;
}
- d->addAttr(::new (S.Context) VecReturnAttr(Attr.getLoc(), S.Context));
+ D->addAttr(::new (S.Context) VecReturnAttr(Attr.getLoc(), S.Context));
}
-static void HandleDependencyAttr(Decl *d, const AttributeList &Attr, Sema &S) {
- if (!isFunctionOrMethod(d) && !isa<ParmVarDecl>(d)) {
+static void handleDependencyAttr(Sema &S, Decl *D, const AttributeList &Attr) {
+ if (!isFunctionOrMethod(D) && !isa<ParmVarDecl>(D)) {
S.Diag(Attr.getLoc(), diag::err_attribute_wrong_decl_type)
<< Attr.getName() << ExpectedFunctionMethodOrParameter;
return;
@@ -940,45 +947,45 @@ static void HandleDependencyAttr(Decl *d, const AttributeList &Attr, Sema &S) {
// FIXME: Actually store the attribute on the declaration
}
-static void HandleUnusedAttr(Decl *d, const AttributeList &Attr, Sema &S) {
+static void handleUnusedAttr(Sema &S, Decl *D, const AttributeList &Attr) {
// check the attribute arguments.
if (Attr.hasParameterOrArguments()) {
S.Diag(Attr.getLoc(), diag::err_attribute_wrong_number_arguments) << 0;
return;
}
- if (!isa<VarDecl>(d) && !isa<ObjCIvarDecl>(d) && !isFunctionOrMethod(d) &&
- !isa<TypeDecl>(d) && !isa<LabelDecl>(d)) {
+ if (!isa<VarDecl>(D) && !isa<ObjCIvarDecl>(D) && !isFunctionOrMethod(D) &&
+ !isa<TypeDecl>(D) && !isa<LabelDecl>(D)) {
S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type)
<< Attr.getName() << ExpectedVariableFunctionOrLabel;
return;
}
- d->addAttr(::new (S.Context) UnusedAttr(Attr.getLoc(), S.Context));
+ D->addAttr(::new (S.Context) UnusedAttr(Attr.getLoc(), S.Context));
}
-static void HandleUsedAttr(Decl *d, const AttributeList &Attr, Sema &S) {
+static void handleUsedAttr(Sema &S, Decl *D, const AttributeList &Attr) {
// check the attribute arguments.
if (Attr.hasParameterOrArguments()) {
S.Diag(Attr.getLoc(), diag::err_attribute_wrong_number_arguments) << 0;
return;
}
- if (const VarDecl *VD = dyn_cast<VarDecl>(d)) {
+ if (const VarDecl *VD = dyn_cast<VarDecl>(D)) {
if (VD->hasLocalStorage() || VD->hasExternalStorage()) {
S.Diag(Attr.getLoc(), diag::warn_attribute_ignored) << "used";
return;
}
- } else if (!isFunctionOrMethod(d)) {
+ } else if (!isFunctionOrMethod(D)) {
S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type)
<< Attr.getName() << ExpectedVariableOrFunction;
return;
}
- d->addAttr(::new (S.Context) UsedAttr(Attr.getLoc(), S.Context));
+ D->addAttr(::new (S.Context) UsedAttr(Attr.getLoc(), S.Context));
}
-static void HandleConstructorAttr(Decl *d, const AttributeList &Attr, Sema &S) {
+static void handleConstructorAttr(Sema &S, Decl *D, const AttributeList &Attr) {
// check the attribute arguments.
if (Attr.getNumArgs() > 1) {
S.Diag(Attr.getLoc(), diag::err_attribute_too_many_arguments) << 1;
@@ -998,17 +1005,17 @@ static void HandleConstructorAttr(Decl *d, const AttributeList &Attr, Sema &S) {
priority = Idx.getZExtValue();
}
- if (!isa<FunctionDecl>(d)) {
+ if (!isa<FunctionDecl>(D)) {
S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type)
<< Attr.getName() << ExpectedFunction;
return;
}
- d->addAttr(::new (S.Context) ConstructorAttr(Attr.getLoc(), S.Context,
+ D->addAttr(::new (S.Context) ConstructorAttr(Attr.getLoc(), S.Context,
priority));
}
-static void HandleDestructorAttr(Decl *d, const AttributeList &Attr, Sema &S) {
+static void handleDestructorAttr(Sema &S, Decl *D, const AttributeList &Attr) {
// check the attribute arguments.
if (Attr.getNumArgs() > 1) {
S.Diag(Attr.getLoc(), diag::err_attribute_too_many_arguments) << 1;
@@ -1028,17 +1035,17 @@ static void HandleDestructorAttr(Decl *d, const AttributeList &Attr, Sema &S) {
priority = Idx.getZExtValue();
}
- if (!isa<FunctionDecl>(d)) {
+ if (!isa<FunctionDecl>(D)) {
S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type)
<< Attr.getName() << ExpectedFunction;
return;
}
- d->addAttr(::new (S.Context) DestructorAttr(Attr.getLoc(), S.Context,
+ D->addAttr(::new (S.Context) DestructorAttr(Attr.getLoc(), S.Context,
priority));
}
-static void HandleDeprecatedAttr(Decl *d, const AttributeList &Attr, Sema &S) {
+static void handleDeprecatedAttr(Sema &S, Decl *D, const AttributeList &Attr) {
unsigned NumArgs = Attr.getNumArgs();
if (NumArgs > 1) {
S.Diag(Attr.getLoc(), diag::err_attribute_too_many_arguments) << 1;
@@ -1057,10 +1064,10 @@ static void HandleDeprecatedAttr(Decl *d, const AttributeList &Attr, Sema &S) {
Str = SE->getString();
}
- d->addAttr(::new (S.Context) DeprecatedAttr(Attr.getLoc(), S.Context, Str));
+ D->addAttr(::new (S.Context) DeprecatedAttr(Attr.getLoc(), S.Context, Str));
}
-static void HandleUnavailableAttr(Decl *d, const AttributeList &Attr, Sema &S) {
+static void handleUnavailableAttr(Sema &S, Decl *D, const AttributeList &Attr) {
unsigned NumArgs = Attr.getNumArgs();
if (NumArgs > 1) {
S.Diag(Attr.getLoc(), diag::err_attribute_too_many_arguments) << 1;
@@ -1078,11 +1085,23 @@ static void HandleUnavailableAttr(Decl *d, const AttributeList &Attr, Sema &S) {
}
Str = SE->getString();
}
- d->addAttr(::new (S.Context) UnavailableAttr(Attr.getLoc(), S.Context, Str));
+ D->addAttr(::new (S.Context) UnavailableAttr(Attr.getLoc(), S.Context, Str));
+}
+
+static void handleArcWeakrefUnavailableAttr(Sema &S, Decl *D,
+ const AttributeList &Attr) {
+ unsigned NumArgs = Attr.getNumArgs();
+ if (NumArgs > 0) {
+ S.Diag(Attr.getLoc(), diag::err_attribute_too_many_arguments) << 0;
+ return;
+ }
+
+ D->addAttr(::new (S.Context) ArcWeakrefUnavailableAttr(
+ Attr.getLoc(), S.Context));
}
-static void HandleAvailabilityAttr(Decl *d, const AttributeList &Attr,
- Sema &S) {
+static void handleAvailabilityAttr(Sema &S, Decl *D,
+ const AttributeList &Attr) {
IdentifierInfo *Platform = Attr.getParameterName();
SourceLocation PlatformLoc = Attr.getParameterLoc();
@@ -1126,7 +1145,7 @@ static void HandleAvailabilityAttr(Decl *d, const AttributeList &Attr,
return;
}
- d->addAttr(::new (S.Context) AvailabilityAttr(Attr.getLoc(), S.Context,
+ D->addAttr(::new (S.Context) AvailabilityAttr(Attr.getLoc(), S.Context,
Platform,
Introduced.Version,
Deprecated.Version,
@@ -1134,12 +1153,10 @@ static void HandleAvailabilityAttr(Decl *d, const AttributeList &Attr,
IsUnavailable));
}
-static void HandleVisibilityAttr(Decl *d, const AttributeList &Attr, Sema &S) {
+static void handleVisibilityAttr(Sema &S, Decl *D, const AttributeList &Attr) {
// check the attribute arguments.
- if (Attr.getNumArgs() != 1) {
- S.Diag(Attr.getLoc(), diag::err_attribute_wrong_number_arguments) << 1;
+ if(!checkAttributeNumArgs(S, Attr, 1))
return;
- }
Expr *Arg = Attr.getArg(0);
Arg = Arg->IgnoreParenCasts();
@@ -1167,30 +1184,30 @@ static void HandleVisibilityAttr(Decl *d, const AttributeList &Attr, Sema &S) {
return;
}
- d->addAttr(::new (S.Context) VisibilityAttr(Attr.getLoc(), S.Context, type));
+ D->addAttr(::new (S.Context) VisibilityAttr(Attr.getLoc(), S.Context, type));
}
-static void HandleObjCMethodFamilyAttr(Decl *decl, const AttributeList &attr,
- Sema &S) {
+static void handleObjCMethodFamilyAttr(Sema &S, Decl *decl,
+ const AttributeList &Attr) {
ObjCMethodDecl *method = dyn_cast<ObjCMethodDecl>(decl);
if (!method) {
- S.Diag(attr.getLoc(), diag::err_attribute_wrong_decl_type)
+ S.Diag(Attr.getLoc(), diag::err_attribute_wrong_decl_type)
<< ExpectedMethod;
return;
}
- if (attr.getNumArgs() != 0 || !attr.getParameterName()) {
- if (!attr.getParameterName() && attr.getNumArgs() == 1) {
- S.Diag(attr.getLoc(), diag::err_attribute_argument_n_not_string)
+ if (Attr.getNumArgs() != 0 || !Attr.getParameterName()) {
+ if (!Attr.getParameterName() && Attr.getNumArgs() == 1) {
+ S.Diag(Attr.getLoc(), diag::err_attribute_argument_n_not_string)
<< "objc_method_family" << 1;
} else {
- S.Diag(attr.getLoc(), diag::err_attribute_wrong_number_arguments) << 0;
+ S.Diag(Attr.getLoc(), diag::err_attribute_wrong_number_arguments) << 0;
}
- attr.setInvalid();
+ Attr.setInvalid();
return;
}
- llvm::StringRef param = attr.getParameterName()->getName();
+ llvm::StringRef param = Attr.getParameterName()->getName();
ObjCMethodFamilyAttr::FamilyKind family;
if (param == "none")
family = ObjCMethodFamilyAttr::OMF_None;
@@ -1207,20 +1224,26 @@ static void HandleObjCMethodFamilyAttr(Decl *decl, const AttributeList &attr,
else {
// Just warn and ignore it. This is future-proof against new
// families being used in system headers.
- S.Diag(attr.getParameterLoc(), diag::warn_unknown_method_family);
+ S.Diag(Attr.getParameterLoc(), diag::warn_unknown_method_family);
return;
}
- decl->addAttr(new (S.Context) ObjCMethodFamilyAttr(attr.getLoc(),
- S.Context, family));
+ if (family == ObjCMethodFamilyAttr::OMF_init &&
+ !method->getResultType()->isObjCObjectPointerType()) {
+ S.Diag(method->getLocation(), diag::err_init_method_bad_return_type)
+ << method->getResultType();
+ // Ignore the attribute.
+ return;
+ }
+
+ method->addAttr(new (S.Context) ObjCMethodFamilyAttr(Attr.getLoc(),
+ S.Context, family));
}
-static void HandleObjCExceptionAttr(Decl *D, const AttributeList &Attr,
- Sema &S) {
- if (Attr.getNumArgs() != 0) {
- S.Diag(Attr.getLoc(), diag::err_attribute_wrong_number_arguments) << 0;
+static void handleObjCExceptionAttr(Sema &S, Decl *D,
+ const AttributeList &Attr) {
+ if (!checkAttributeNumArgs(S, Attr, 0))
return;
- }
ObjCInterfaceDecl *OCI = dyn_cast<ObjCInterfaceDecl>(D);
if (OCI == 0) {
@@ -1231,7 +1254,7 @@ static void HandleObjCExceptionAttr(Decl *D, const AttributeList &Attr,
D->addAttr(::new (S.Context) ObjCExceptionAttr(Attr.getLoc(), S.Context));
}
-static void HandleObjCNSObject(Decl *D, const AttributeList &Attr, Sema &S) {
+static void handleObjCNSObject(Sema &S, Decl *D, const AttributeList &Attr) {
if (Attr.getNumArgs() != 0) {
S.Diag(Attr.getLoc(), diag::err_attribute_wrong_number_arguments) << 1;
return;
@@ -1248,7 +1271,7 @@ static void HandleObjCNSObject(Decl *D, const AttributeList &Attr, Sema &S) {
}
static void
-HandleOverloadableAttr(Decl *D, const AttributeList &Attr, Sema &S) {
+handleOverloadableAttr(Sema &S, Decl *D, const AttributeList &Attr) {
if (Attr.getNumArgs() != 0) {
S.Diag(Attr.getLoc(), diag::err_attribute_wrong_number_arguments) << 1;
return;
@@ -1262,7 +1285,7 @@ HandleOverloadableAttr(Decl *D, const AttributeList &Attr, Sema &S) {
D->addAttr(::new (S.Context) OverloadableAttr(Attr.getLoc(), S.Context));
}
-static void HandleBlocksAttr(Decl *d, const AttributeList &Attr, Sema &S) {
+static void handleBlocksAttr(Sema &S, Decl *D, const AttributeList &Attr) {
if (!Attr.getParameterName()) {
S.Diag(Attr.getLoc(), diag::err_attribute_argument_n_not_string)
<< "blocks" << 1;
@@ -1283,10 +1306,10 @@ static void HandleBlocksAttr(Decl *d, const AttributeList &Attr, Sema &S) {
return;
}
- d->addAttr(::new (S.Context) BlocksAttr(Attr.getLoc(), S.Context, type));
+ D->addAttr(::new (S.Context) BlocksAttr(Attr.getLoc(), S.Context, type));
}
-static void HandleSentinelAttr(Decl *d, const AttributeList &Attr, Sema &S) {
+static void handleSentinelAttr(Sema &S, Decl *D, const AttributeList &Attr) {
// check the attribute arguments.
if (Attr.getNumArgs() > 2) {
S.Diag(Attr.getLoc(), diag::err_attribute_too_many_arguments) << 2;
@@ -1333,7 +1356,7 @@ static void HandleSentinelAttr(Decl *d, const AttributeList &Attr, Sema &S) {
}
}
- if (FunctionDecl *FD = dyn_cast<FunctionDecl>(d)) {
+ if (FunctionDecl *FD = dyn_cast<FunctionDecl>(D)) {
const FunctionType *FT = FD->getType()->getAs<FunctionType>();
assert(FT && "FunctionDecl has non-function type?");
@@ -1346,19 +1369,19 @@ static void HandleSentinelAttr(Decl *d, const AttributeList &Attr, Sema &S) {
S.Diag(Attr.getLoc(), diag::warn_attribute_sentinel_not_variadic) << 0;
return;
}
- } else if (ObjCMethodDecl *MD = dyn_cast<ObjCMethodDecl>(d)) {
+ } else if (ObjCMethodDecl *MD = dyn_cast<ObjCMethodDecl>(D)) {
if (!MD->isVariadic()) {
S.Diag(Attr.getLoc(), diag::warn_attribute_sentinel_not_variadic) << 0;
return;
}
- } else if (isa<BlockDecl>(d)) {
+ } else if (isa<BlockDecl>(D)) {
// Note! BlockDecl is typeless. Variadic diagnostics will be issued by the
// caller.
;
- } else if (const VarDecl *V = dyn_cast<VarDecl>(d)) {
+ } else if (const VarDecl *V = dyn_cast<VarDecl>(D)) {
QualType Ty = V->getType();
if (Ty->isBlockPointerType() || Ty->isFunctionPointerType()) {
- const FunctionType *FT = Ty->isFunctionPointerType() ? getFunctionType(d)
+ const FunctionType *FT = Ty->isFunctionPointerType() ? getFunctionType(D)
: Ty->getAs<BlockPointerType>()->getPointeeType()->getAs<FunctionType>();
if (!cast<FunctionProtoType>(FT)->isVariadic()) {
int m = Ty->isFunctionPointerType() ? 0 : 1;
@@ -1375,16 +1398,14 @@ static void HandleSentinelAttr(Decl *d, const AttributeList &Attr, Sema &S) {
<< Attr.getName() << ExpectedFunctionMethodOrBlock;
return;
}
- d->addAttr(::new (S.Context) SentinelAttr(Attr.getLoc(), S.Context, sentinel,
+ D->addAttr(::new (S.Context) SentinelAttr(Attr.getLoc(), S.Context, sentinel,
nullPos));
}
-static void HandleWarnUnusedResult(Decl *D, const AttributeList &Attr, Sema &S) {
+static void handleWarnUnusedResult(Sema &S, Decl *D, const AttributeList &Attr) {
// check the attribute arguments.
- if (Attr.getNumArgs() != 0) {
- S.Diag(Attr.getLoc(), diag::err_attribute_wrong_number_arguments) << 0;
+ if (!checkAttributeNumArgs(S, Attr, 0))
return;
- }
if (!isFunction(D) && !isa<ObjCMethodDecl>(D)) {
S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type)
@@ -1407,36 +1428,35 @@ static void HandleWarnUnusedResult(Decl *D, const AttributeList &Attr, Sema &S)
D->addAttr(::new (S.Context) WarnUnusedResultAttr(Attr.getLoc(), S.Context));
}
-static void HandleWeakAttr(Decl *d, const AttributeList &attr, Sema &S) {
+static void handleWeakAttr(Sema &S, Decl *D, const AttributeList &Attr) {
// check the attribute arguments.
- if (attr.hasParameterOrArguments()) {
- S.Diag(attr.getLoc(), diag::err_attribute_wrong_number_arguments) << 0;
+ if (Attr.hasParameterOrArguments()) {
+ S.Diag(Attr.getLoc(), diag::err_attribute_wrong_number_arguments) << 0;
return;
}
- if (!isa<VarDecl>(d) && !isa<FunctionDecl>(d)) {
- S.Diag(attr.getLoc(), diag::warn_attribute_wrong_decl_type)
- << attr.getName() << ExpectedVariableOrFunction;
+ if (!isa<VarDecl>(D) && !isa<FunctionDecl>(D)) {
+ S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type)
+ << Attr.getName() << ExpectedVariableOrFunction;
return;
}
- NamedDecl *nd = cast<NamedDecl>(d);
+ NamedDecl *nd = cast<NamedDecl>(D);
// 'weak' only applies to declarations with external linkage.
if (hasEffectivelyInternalLinkage(nd)) {
- S.Diag(attr.getLoc(), diag::err_attribute_weak_static);
+ S.Diag(Attr.getLoc(), diag::err_attribute_weak_static);
return;
}
- nd->addAttr(::new (S.Context) WeakAttr(attr.getLoc(), S.Context));
+ nd->addAttr(::new (S.Context) WeakAttr(Attr.getLoc(), S.Context));
}
-static void HandleWeakImportAttr(Decl *D, const AttributeList &Attr, Sema &S) {
+static void handleWeakImportAttr(Sema &S, Decl *D, const AttributeList &Attr) {
// check the attribute arguments.
- if (Attr.getNumArgs() != 0) {
- S.Diag(Attr.getLoc(), diag::err_attribute_wrong_number_arguments) << 0;
+ if (!checkAttributeNumArgs(S, Attr, 0))
return;
- }
+
// weak_import only applies to variable & function declarations.
bool isDef = false;
@@ -1459,13 +1479,11 @@ static void HandleWeakImportAttr(Decl *D, const AttributeList &Attr, Sema &S) {
D->addAttr(::new (S.Context) WeakImportAttr(Attr.getLoc(), S.Context));
}
-static void HandleReqdWorkGroupSize(Decl *D, const AttributeList &Attr,
- Sema &S) {
+static void handleReqdWorkGroupSize(Sema &S, Decl *D,
+ const AttributeList &Attr) {
// Attribute has 3 arguments.
- if (Attr.getNumArgs() != 3) {
- S.Diag(Attr.getLoc(), diag::err_attribute_wrong_number_arguments) << 1;
+ if (!checkAttributeNumArgs(S, Attr, 3))
return;
- }
unsigned WGSize[3];
for (unsigned i = 0; i < 3; ++i) {
@@ -1484,12 +1502,10 @@ static void HandleReqdWorkGroupSize(Decl *D, const AttributeList &Attr,
WGSize[2]));
}
-static void HandleSectionAttr(Decl *D, const AttributeList &Attr, Sema &S) {
+static void handleSectionAttr(Sema &S, Decl *D, const AttributeList &Attr) {
// Attribute has no arguments.
- if (Attr.getNumArgs() != 1) {
- S.Diag(Attr.getLoc(), diag::err_attribute_wrong_number_arguments) << 1;
+ if (!checkAttributeNumArgs(S, Attr, 1))
return;
- }
// Make sure that there is a string literal as the sections's single
// argument.
@@ -1519,37 +1535,45 @@ static void HandleSectionAttr(Decl *D, const AttributeList &Attr, Sema &S) {
}
-static void HandleNothrowAttr(Decl *d, const AttributeList &Attr, Sema &S) {
+static void handleNothrowAttr(Sema &S, Decl *D, const AttributeList &Attr) {
// check the attribute arguments.
if (Attr.hasParameterOrArguments()) {
S.Diag(Attr.getLoc(), diag::err_attribute_wrong_number_arguments) << 0;
return;
}
-
- d->addAttr(::new (S.Context) NoThrowAttr(Attr.getLoc(), S.Context));
+
+ if (NoThrowAttr *Existing = D->getAttr<NoThrowAttr>()) {
+ if (Existing->getLocation().isInvalid())
+ Existing->setLocation(Attr.getLoc());
+ } else {
+ D->addAttr(::new (S.Context) NoThrowAttr(Attr.getLoc(), S.Context));
+ }
}
-static void HandleConstAttr(Decl *d, const AttributeList &Attr, Sema &S) {
+static void handleConstAttr(Sema &S, Decl *D, const AttributeList &Attr) {
// check the attribute arguments.
if (Attr.hasParameterOrArguments()) {
S.Diag(Attr.getLoc(), diag::err_attribute_wrong_number_arguments) << 0;
return;
}
- d->addAttr(::new (S.Context) ConstAttr(Attr.getLoc(), S.Context));
+ if (ConstAttr *Existing = D->getAttr<ConstAttr>()) {
+ if (Existing->getLocation().isInvalid())
+ Existing->setLocation(Attr.getLoc());
+ } else {
+ D->addAttr(::new (S.Context) ConstAttr(Attr.getLoc(), S.Context));
+ }
}
-static void HandlePureAttr(Decl *d, const AttributeList &Attr, Sema &S) {
+static void handlePureAttr(Sema &S, Decl *D, const AttributeList &Attr) {
// check the attribute arguments.
- if (Attr.getNumArgs() != 0) {
- S.Diag(Attr.getLoc(), diag::err_attribute_wrong_number_arguments) << 0;
+ if (!checkAttributeNumArgs(S, Attr, 0))
return;
- }
- d->addAttr(::new (S.Context) PureAttr(Attr.getLoc(), S.Context));
+ D->addAttr(::new (S.Context) PureAttr(Attr.getLoc(), S.Context));
}
-static void HandleCleanupAttr(Decl *d, const AttributeList &Attr, Sema &S) {
+static void handleCleanupAttr(Sema &S, Decl *D, const AttributeList &Attr) {
if (!Attr.getParameterName()) {
S.Diag(Attr.getLoc(), diag::err_attribute_wrong_number_arguments) << 1;
return;
@@ -1560,7 +1584,7 @@ static void HandleCleanupAttr(Decl *d, const AttributeList &Attr, Sema &S) {
return;
}
- VarDecl *VD = dyn_cast<VarDecl>(d);
+ VarDecl *VD = dyn_cast<VarDecl>(D);
if (!VD || !VD->hasLocalStorage()) {
S.Diag(Attr.getLoc(), diag::warn_attribute_ignored) << "cleanup";
@@ -1605,18 +1629,17 @@ static void HandleCleanupAttr(Decl *d, const AttributeList &Attr, Sema &S) {
return;
}
- d->addAttr(::new (S.Context) CleanupAttr(Attr.getLoc(), S.Context, FD));
+ D->addAttr(::new (S.Context) CleanupAttr(Attr.getLoc(), S.Context, FD));
S.MarkDeclarationReferenced(Attr.getParameterLoc(), FD);
}
/// Handle __attribute__((format_arg((idx)))) attribute based on
/// http://gcc.gnu.org/onlinedocs/gcc/Function-Attributes.html
-static void HandleFormatArgAttr(Decl *d, const AttributeList &Attr, Sema &S) {
- if (Attr.getNumArgs() != 1) {
- S.Diag(Attr.getLoc(), diag::err_attribute_wrong_number_arguments) << 1;
+static void handleFormatArgAttr(Sema &S, Decl *D, const AttributeList &Attr) {
+ if (!checkAttributeNumArgs(S, Attr, 1))
return;
- }
- if (!isFunctionOrMethod(d) || !hasFunctionProto(d)) {
+
+ if (!isFunctionOrMethod(D) || !hasFunctionProto(D)) {
S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type)
<< Attr.getName() << ExpectedFunction;
return;
@@ -1624,8 +1647,8 @@ static void HandleFormatArgAttr(Decl *d, const AttributeList &Attr, Sema &S) {
// In C++ the implicit 'this' function parameter also counts, and they are
// counted from one.
- bool HasImplicitThisParam = isInstanceMethod(d);
- unsigned NumArgs = getFunctionOrMethodNumArgs(d) + HasImplicitThisParam;
+ bool HasImplicitThisParam = isInstanceMethod(D);
+ unsigned NumArgs = getFunctionOrMethodNumArgs(D) + HasImplicitThisParam;
unsigned FirstIdx = 1;
// checks for the 2nd argument
@@ -1656,7 +1679,7 @@ static void HandleFormatArgAttr(Decl *d, const AttributeList &Attr, Sema &S) {
}
// make sure the format string is really a string
- QualType Ty = getFunctionOrMethodArgType(d, ArgIdx);
+ QualType Ty = getFunctionOrMethodArgType(D, ArgIdx);
bool not_nsstring_type = !isNSStringType(Ty, S.Context);
if (not_nsstring_type &&
@@ -1669,7 +1692,7 @@ static void HandleFormatArgAttr(Decl *d, const AttributeList &Attr, Sema &S) {
<< IdxExpr->getSourceRange();
return;
}
- Ty = getFunctionOrMethodResultType(d);
+ Ty = getFunctionOrMethodResultType(D);
if (!isNSStringType(Ty, S.Context) &&
!isCFStringType(Ty, S.Context) &&
(!Ty->isPointerType() ||
@@ -1681,7 +1704,7 @@ static void HandleFormatArgAttr(Decl *d, const AttributeList &Attr, Sema &S) {
return;
}
- d->addAttr(::new (S.Context) FormatArgAttr(Attr.getLoc(), S.Context,
+ D->addAttr(::new (S.Context) FormatArgAttr(Attr.getLoc(), S.Context,
Idx.getZExtValue()));
}
@@ -1722,19 +1745,19 @@ static FormatAttrKind getFormatAttrKind(llvm::StringRef Format) {
/// Handle __attribute__((init_priority(priority))) attributes based on
/// http://gcc.gnu.org/onlinedocs/gcc/C_002b_002b-Attributes.html
-static void HandleInitPriorityAttr(Decl *d, const AttributeList &Attr,
- Sema &S) {
+static void handleInitPriorityAttr(Sema &S, Decl *D,
+ const AttributeList &Attr) {
if (!S.getLangOptions().CPlusPlus) {
S.Diag(Attr.getLoc(), diag::warn_attribute_ignored) << Attr.getName();
return;
}
- if (!isa<VarDecl>(d) || S.getCurFunctionOrMethodDecl()) {
+ if (!isa<VarDecl>(D) || S.getCurFunctionOrMethodDecl()) {
S.Diag(Attr.getLoc(), diag::err_init_priority_object_attr);
Attr.setInvalid();
return;
}
- QualType T = dyn_cast<VarDecl>(d)->getType();
+ QualType T = dyn_cast<VarDecl>(D)->getType();
if (S.Context.getAsArrayType(T))
T = S.Context.getBaseElementType(T);
if (!T->getAs<RecordType>()) {
@@ -1765,13 +1788,13 @@ static void HandleInitPriorityAttr(Decl *d, const AttributeList &Attr,
Attr.setInvalid();
return;
}
- d->addAttr(::new (S.Context) InitPriorityAttr(Attr.getLoc(), S.Context,
+ D->addAttr(::new (S.Context) InitPriorityAttr(Attr.getLoc(), S.Context,
prioritynum));
}
/// Handle __attribute__((format(type,idx,firstarg))) attributes based on
/// http://gcc.gnu.org/onlinedocs/gcc/Function-Attributes.html
-static void HandleFormatAttr(Decl *d, const AttributeList &Attr, Sema &S) {
+static void handleFormatAttr(Sema &S, Decl *D, const AttributeList &Attr) {
if (!Attr.getParameterName()) {
S.Diag(Attr.getLoc(), diag::err_attribute_argument_n_not_string)
@@ -1784,7 +1807,7 @@ static void HandleFormatAttr(Decl *d, const AttributeList &Attr, Sema &S) {
return;
}
- if (!isFunctionOrMethodOrBlock(d) || !hasFunctionProto(d)) {
+ if (!isFunctionOrMethodOrBlock(D) || !hasFunctionProto(D)) {
S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type)
<< Attr.getName() << ExpectedFunction;
return;
@@ -1792,8 +1815,8 @@ static void HandleFormatAttr(Decl *d, const AttributeList &Attr, Sema &S) {
// In C++ the implicit 'this' function parameter also counts, and they are
// counted from one.
- bool HasImplicitThisParam = isInstanceMethod(d);
- unsigned NumArgs = getFunctionOrMethodNumArgs(d) + HasImplicitThisParam;
+ bool HasImplicitThisParam = isInstanceMethod(D);
+ unsigned NumArgs = getFunctionOrMethodNumArgs(D) + HasImplicitThisParam;
unsigned FirstIdx = 1;
llvm::StringRef Format = Attr.getParameterName()->getName();
@@ -1844,7 +1867,7 @@ static void HandleFormatAttr(Decl *d, const AttributeList &Attr, Sema &S) {
}
// make sure the format string is really a string
- QualType Ty = getFunctionOrMethodArgType(d, ArgIdx);
+ QualType Ty = getFunctionOrMethodArgType(D, ArgIdx);
if (Kind == CFStringFormat) {
if (!isCFStringType(Ty, S.Context)) {
@@ -1881,10 +1904,10 @@ static void HandleFormatAttr(Decl *d, const AttributeList &Attr, Sema &S) {
// check if the function is variadic if the 3rd argument non-zero
if (FirstArg != 0) {
- if (isFunctionOrMethodVariadic(d)) {
+ if (isFunctionOrMethodVariadic(D)) {
++NumArgs; // +1 for ...
} else {
- S.Diag(d->getLocation(), diag::err_format_attribute_requires_variadic);
+ S.Diag(D->getLocation(), diag::err_format_attribute_requires_variadic);
return;
}
}
@@ -1904,26 +1927,42 @@ static void HandleFormatAttr(Decl *d, const AttributeList &Attr, Sema &S) {
return;
}
- d->addAttr(::new (S.Context) FormatAttr(Attr.getLoc(), S.Context, Format,
+ // Check whether we already have an equivalent format attribute.
+ for (specific_attr_iterator<FormatAttr>
+ i = D->specific_attr_begin<FormatAttr>(),
+ e = D->specific_attr_end<FormatAttr>();
+ i != e ; ++i) {
+ FormatAttr *f = *i;
+ if (f->getType() == Format &&
+ f->getFormatIdx() == (int)Idx.getZExtValue() &&
+ f->getFirstArg() == (int)FirstArg.getZExtValue()) {
+ // If we don't have a valid location for this attribute, adopt the
+ // location.
+ if (f->getLocation().isInvalid())
+ f->setLocation(Attr.getLoc());
+ return;
+ }
+ }
+
+ D->addAttr(::new (S.Context) FormatAttr(Attr.getLoc(), S.Context, Format,
Idx.getZExtValue(),
FirstArg.getZExtValue()));
}
-static void HandleTransparentUnionAttr(Decl *d, const AttributeList &Attr,
- Sema &S) {
+static void handleTransparentUnionAttr(Sema &S, Decl *D,
+ const AttributeList &Attr) {
// check the attribute arguments.
- if (Attr.getNumArgs() != 0) {
- S.Diag(Attr.getLoc(), diag::err_attribute_wrong_number_arguments) << 0;
+ if (!checkAttributeNumArgs(S, Attr, 0))
return;
- }
+
// Try to find the underlying union declaration.
RecordDecl *RD = 0;
- TypedefNameDecl *TD = dyn_cast<TypedefNameDecl>(d);
+ TypedefNameDecl *TD = dyn_cast<TypedefNameDecl>(D);
if (TD && TD->getUnderlyingType()->isUnionType())
RD = TD->getUnderlyingType()->getAsUnionType()->getDecl();
else
- RD = dyn_cast<RecordDecl>(d);
+ RD = dyn_cast<RecordDecl>(D);
if (!RD || !RD->isUnion()) {
S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type)
@@ -1977,12 +2016,11 @@ static void HandleTransparentUnionAttr(Decl *d, const AttributeList &Attr,
RD->addAttr(::new (S.Context) TransparentUnionAttr(Attr.getLoc(), S.Context));
}
-static void HandleAnnotateAttr(Decl *d, const AttributeList &Attr, Sema &S) {
+static void handleAnnotateAttr(Sema &S, Decl *D, const AttributeList &Attr) {
// check the attribute arguments.
- if (Attr.getNumArgs() != 1) {
- S.Diag(Attr.getLoc(), diag::err_attribute_wrong_number_arguments) << 1;
+ if (!checkAttributeNumArgs(S, Attr, 1))
return;
- }
+
Expr *ArgExpr = Attr.getArg(0);
StringLiteral *SE = dyn_cast<StringLiteral>(ArgExpr);
@@ -1992,11 +2030,11 @@ static void HandleAnnotateAttr(Decl *d, const AttributeList &Attr, Sema &S) {
S.Diag(ArgExpr->getLocStart(), diag::err_attribute_not_string) <<"annotate";
return;
}
- d->addAttr(::new (S.Context) AnnotateAttr(Attr.getLoc(), S.Context,
+ D->addAttr(::new (S.Context) AnnotateAttr(Attr.getLoc(), S.Context,
SE->getString()));
}
-static void HandleAlignedAttr(Decl *D, const AttributeList &Attr, Sema &S) {
+static void handleAlignedAttr(Sema &S, Decl *D, const AttributeList &Attr) {
// check the attribute arguments.
if (Attr.getNumArgs() > 1) {
S.Diag(Attr.getLoc(), diag::err_attribute_wrong_number_arguments) << 1;
@@ -2045,21 +2083,20 @@ void Sema::AddAlignedAttr(SourceLocation AttrLoc, Decl *D, TypeSourceInfo *TS) {
return;
}
-/// HandleModeAttr - This attribute modifies the width of a decl with primitive
+/// handleModeAttr - This attribute modifies the width of a decl with primitive
/// type.
///
/// Despite what would be logical, the mode attribute is a decl attribute, not a
/// type attribute: 'int ** __attribute((mode(HI))) *G;' tries to make 'G' be
/// HImode, not an intermediate pointer.
-static void HandleModeAttr(Decl *D, const AttributeList &Attr, Sema &S) {
+static void handleModeAttr(Sema &S, Decl *D, const AttributeList &Attr) {
// This attribute isn't documented, but glibc uses it. It changes
// the width of an int or unsigned int to the specified size.
// Check that there aren't any arguments
- if (Attr.getNumArgs() != 0) {
- S.Diag(Attr.getLoc(), diag::err_attribute_wrong_number_arguments) << 0;
+ if (!checkAttributeNumArgs(S, Attr, 0))
return;
- }
+
IdentifierInfo *Name = Attr.getParameterName();
if (!Name) {
@@ -2216,57 +2253,53 @@ static void HandleModeAttr(Decl *D, const AttributeList &Attr, Sema &S) {
cast<ValueDecl>(D)->setType(NewTy);
}
-static void HandleNoDebugAttr(Decl *d, const AttributeList &Attr, Sema &S) {
+static void handleNoDebugAttr(Sema &S, Decl *D, const AttributeList &Attr) {
// check the attribute arguments.
- if (Attr.getNumArgs() > 0) {
- S.Diag(Attr.getLoc(), diag::err_attribute_wrong_number_arguments) << 0;
+ if (!checkAttributeNumArgs(S, Attr, 0))
return;
- }
- if (!isFunctionOrMethod(d)) {
+ if (!isFunctionOrMethod(D)) {
S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type)
<< Attr.getName() << ExpectedFunction;
return;
}
- d->addAttr(::new (S.Context) NoDebugAttr(Attr.getLoc(), S.Context));
+ D->addAttr(::new (S.Context) NoDebugAttr(Attr.getLoc(), S.Context));
}
-static void HandleNoInlineAttr(Decl *d, const AttributeList &Attr, Sema &S) {
+static void handleNoInlineAttr(Sema &S, Decl *D, const AttributeList &Attr) {
// check the attribute arguments.
- if (Attr.getNumArgs() != 0) {
- S.Diag(Attr.getLoc(), diag::err_attribute_wrong_number_arguments) << 0;
+ if (!checkAttributeNumArgs(S, Attr, 0))
return;
- }
- if (!isa<FunctionDecl>(d)) {
+
+ if (!isa<FunctionDecl>(D)) {
S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type)
<< Attr.getName() << ExpectedFunction;
return;
}
- d->addAttr(::new (S.Context) NoInlineAttr(Attr.getLoc(), S.Context));
+ D->addAttr(::new (S.Context) NoInlineAttr(Attr.getLoc(), S.Context));
}
-static void HandleNoInstrumentFunctionAttr(Decl *d, const AttributeList &Attr,
- Sema &S) {
+static void handleNoInstrumentFunctionAttr(Sema &S, Decl *D,
+ const AttributeList &Attr) {
// check the attribute arguments.
- if (Attr.getNumArgs() != 0) {
- S.Diag(Attr.getLoc(), diag::err_attribute_wrong_number_arguments) << 0;
+ if (!checkAttributeNumArgs(S, Attr, 0))
return;
- }
- if (!isa<FunctionDecl>(d)) {
+
+ if (!isa<FunctionDecl>(D)) {
S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type)
<< Attr.getName() << ExpectedFunction;
return;
}
- d->addAttr(::new (S.Context) NoInstrumentFunctionAttr(Attr.getLoc(),
+ D->addAttr(::new (S.Context) NoInstrumentFunctionAttr(Attr.getLoc(),
S.Context));
}
-static void HandleConstantAttr(Decl *d, const AttributeList &Attr, Sema &S) {
+static void handleConstantAttr(Sema &S, Decl *D, const AttributeList &Attr) {
if (S.LangOpts.CUDA) {
// check the attribute arguments.
if (Attr.hasParameterOrArguments()) {
@@ -2274,19 +2307,19 @@ static void HandleConstantAttr(Decl *d, const AttributeList &Attr, Sema &S) {
return;
}
- if (!isa<VarDecl>(d)) {
+ if (!isa<VarDecl>(D)) {
S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type)
<< Attr.getName() << ExpectedVariable;
return;
}
- d->addAttr(::new (S.Context) CUDAConstantAttr(Attr.getLoc(), S.Context));
+ D->addAttr(::new (S.Context) CUDAConstantAttr(Attr.getLoc(), S.Context));
} else {
S.Diag(Attr.getLoc(), diag::warn_attribute_ignored) << "constant";
}
}
-static void HandleDeviceAttr(Decl *d, const AttributeList &Attr, Sema &S) {
+static void handleDeviceAttr(Sema &S, Decl *D, const AttributeList &Attr) {
if (S.LangOpts.CUDA) {
// check the attribute arguments.
if (Attr.getNumArgs() != 0) {
@@ -2294,33 +2327,31 @@ static void HandleDeviceAttr(Decl *d, const AttributeList &Attr, Sema &S) {
return;
}
- if (!isa<FunctionDecl>(d) && !isa<VarDecl>(d)) {
+ if (!isa<FunctionDecl>(D) && !isa<VarDecl>(D)) {
S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type)
<< Attr.getName() << ExpectedVariableOrFunction;
return;
}
- d->addAttr(::new (S.Context) CUDADeviceAttr(Attr.getLoc(), S.Context));
+ D->addAttr(::new (S.Context) CUDADeviceAttr(Attr.getLoc(), S.Context));
} else {
S.Diag(Attr.getLoc(), diag::warn_attribute_ignored) << "device";
}
}
-static void HandleGlobalAttr(Decl *d, const AttributeList &Attr, Sema &S) {
+static void handleGlobalAttr(Sema &S, Decl *D, const AttributeList &Attr) {
if (S.LangOpts.CUDA) {
// check the attribute arguments.
- if (Attr.getNumArgs() != 0) {
- S.Diag(Attr.getLoc(), diag::err_attribute_wrong_number_arguments) << 0;
+ if (!checkAttributeNumArgs(S, Attr, 0))
return;
- }
- if (!isa<FunctionDecl>(d)) {
+ if (!isa<FunctionDecl>(D)) {
S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type)
<< Attr.getName() << ExpectedFunction;
return;
}
- FunctionDecl *FD = cast<FunctionDecl>(d);
+ FunctionDecl *FD = cast<FunctionDecl>(D);
if (!FD->getResultType()->isVoidType()) {
TypeLoc TL = FD->getTypeSourceInfo()->getTypeLoc().IgnoreParens();
if (FunctionTypeLoc* FTL = dyn_cast<FunctionTypeLoc>(&TL)) {
@@ -2335,60 +2366,56 @@ static void HandleGlobalAttr(Decl *d, const AttributeList &Attr, Sema &S) {
return;
}
- d->addAttr(::new (S.Context) CUDAGlobalAttr(Attr.getLoc(), S.Context));
+ D->addAttr(::new (S.Context) CUDAGlobalAttr(Attr.getLoc(), S.Context));
} else {
S.Diag(Attr.getLoc(), diag::warn_attribute_ignored) << "global";
}
}
-static void HandleHostAttr(Decl *d, const AttributeList &Attr, Sema &S) {
+static void handleHostAttr(Sema &S, Decl *D, const AttributeList &Attr) {
if (S.LangOpts.CUDA) {
// check the attribute arguments.
- if (Attr.getNumArgs() != 0) {
- S.Diag(Attr.getLoc(), diag::err_attribute_wrong_number_arguments) << 0;
+ if (!checkAttributeNumArgs(S, Attr, 0))
return;
- }
- if (!isa<FunctionDecl>(d)) {
+
+ if (!isa<FunctionDecl>(D)) {
S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type)
<< Attr.getName() << ExpectedFunction;
return;
}
- d->addAttr(::new (S.Context) CUDAHostAttr(Attr.getLoc(), S.Context));
+ D->addAttr(::new (S.Context) CUDAHostAttr(Attr.getLoc(), S.Context));
} else {
S.Diag(Attr.getLoc(), diag::warn_attribute_ignored) << "host";
}
}
-static void HandleSharedAttr(Decl *d, const AttributeList &Attr, Sema &S) {
+static void handleSharedAttr(Sema &S, Decl *D, const AttributeList &Attr) {
if (S.LangOpts.CUDA) {
// check the attribute arguments.
- if (Attr.getNumArgs() != 0) {
- S.Diag(Attr.getLoc(), diag::err_attribute_wrong_number_arguments) << 0;
+ if (!checkAttributeNumArgs(S, Attr, 0))
return;
- }
- if (!isa<VarDecl>(d)) {
+
+ if (!isa<VarDecl>(D)) {
S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type)
<< Attr.getName() << ExpectedVariable;
return;
}
- d->addAttr(::new (S.Context) CUDASharedAttr(Attr.getLoc(), S.Context));
+ D->addAttr(::new (S.Context) CUDASharedAttr(Attr.getLoc(), S.Context));
} else {
S.Diag(Attr.getLoc(), diag::warn_attribute_ignored) << "shared";
}
}
-static void HandleGNUInlineAttr(Decl *d, const AttributeList &Attr, Sema &S) {
+static void handleGNUInlineAttr(Sema &S, Decl *D, const AttributeList &Attr) {
// check the attribute arguments.
- if (Attr.getNumArgs() != 0) {
- S.Diag(Attr.getLoc(), diag::err_attribute_wrong_number_arguments) << 0;
+ if (!checkAttributeNumArgs(S, Attr, 0))
return;
- }
- FunctionDecl *Fn = dyn_cast<FunctionDecl>(d);
+ FunctionDecl *Fn = dyn_cast<FunctionDecl>(D);
if (Fn == 0) {
S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type)
<< Attr.getName() << ExpectedFunction;
@@ -2400,47 +2427,47 @@ static void HandleGNUInlineAttr(Decl *d, const AttributeList &Attr, Sema &S) {
return;
}
- d->addAttr(::new (S.Context) GNUInlineAttr(Attr.getLoc(), S.Context));
+ D->addAttr(::new (S.Context) GNUInlineAttr(Attr.getLoc(), S.Context));
}
-static void HandleCallConvAttr(Decl *d, const AttributeList &attr, Sema &S) {
- if (hasDeclarator(d)) return;
+static void handleCallConvAttr(Sema &S, Decl *D, const AttributeList &Attr) {
+ if (hasDeclarator(D)) return;
- // Diagnostic is emitted elsewhere: here we store the (valid) attr
+ // Diagnostic is emitted elsewhere: here we store the (valid) Attr
// in the Decl node for syntactic reasoning, e.g., pretty-printing.
CallingConv CC;
- if (S.CheckCallingConvAttr(attr, CC))
+ if (S.CheckCallingConvAttr(Attr, CC))
return;
- if (!isa<ObjCMethodDecl>(d)) {
- S.Diag(attr.getLoc(), diag::warn_attribute_wrong_decl_type)
- << attr.getName() << ExpectedFunctionOrMethod;
+ if (!isa<ObjCMethodDecl>(D)) {
+ S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type)
+ << Attr.getName() << ExpectedFunctionOrMethod;
return;
}
- switch (attr.getKind()) {
+ switch (Attr.getKind()) {
case AttributeList::AT_fastcall:
- d->addAttr(::new (S.Context) FastCallAttr(attr.getLoc(), S.Context));
+ D->addAttr(::new (S.Context) FastCallAttr(Attr.getLoc(), S.Context));
return;
case AttributeList::AT_stdcall:
- d->addAttr(::new (S.Context) StdCallAttr(attr.getLoc(), S.Context));
+ D->addAttr(::new (S.Context) StdCallAttr(Attr.getLoc(), S.Context));
return;
case AttributeList::AT_thiscall:
- d->addAttr(::new (S.Context) ThisCallAttr(attr.getLoc(), S.Context));
+ D->addAttr(::new (S.Context) ThisCallAttr(Attr.getLoc(), S.Context));
return;
case AttributeList::AT_cdecl:
- d->addAttr(::new (S.Context) CDeclAttr(attr.getLoc(), S.Context));
+ D->addAttr(::new (S.Context) CDeclAttr(Attr.getLoc(), S.Context));
return;
case AttributeList::AT_pascal:
- d->addAttr(::new (S.Context) PascalAttr(attr.getLoc(), S.Context));
+ D->addAttr(::new (S.Context) PascalAttr(Attr.getLoc(), S.Context));
return;
case AttributeList::AT_pcs: {
- Expr *Arg = attr.getArg(0);
+ Expr *Arg = Attr.getArg(0);
StringLiteral *Str = dyn_cast<StringLiteral>(Arg);
if (Str == 0 || Str->isWide()) {
- S.Diag(attr.getLoc(), diag::err_attribute_argument_n_not_string)
+ S.Diag(Attr.getLoc(), diag::err_attribute_argument_n_not_string)
<< "pcs" << 1;
- attr.setInvalid();
+ Attr.setInvalid();
return;
}
@@ -2451,12 +2478,12 @@ static void HandleCallConvAttr(Decl *d, const AttributeList &attr, Sema &S) {
else if (StrRef == "aapcs-vfp")
PCS = PcsAttr::AAPCS_VFP;
else {
- S.Diag(attr.getLoc(), diag::err_invalid_pcs);
- attr.setInvalid();
+ S.Diag(Attr.getLoc(), diag::err_invalid_pcs);
+ Attr.setInvalid();
return;
}
- d->addAttr(::new (S.Context) PcsAttr(attr.getLoc(), S.Context, PCS));
+ D->addAttr(::new (S.Context) PcsAttr(Attr.getLoc(), S.Context, PCS));
}
default:
llvm_unreachable("unexpected attribute kind");
@@ -2464,9 +2491,9 @@ static void HandleCallConvAttr(Decl *d, const AttributeList &attr, Sema &S) {
}
}
-static void HandleOpenCLKernelAttr(Decl *d, const AttributeList &Attr, Sema &S){
- assert(Attr.isInvalid() == false);
- d->addAttr(::new (S.Context) OpenCLKernelAttr(Attr.getLoc(), S.Context));
+static void handleOpenCLKernelAttr(Sema &S, Decl *D, const AttributeList &Attr){
+ assert(!Attr.isInvalid());
+ D->addAttr(::new (S.Context) OpenCLKernelAttr(Attr.getLoc(), S.Context));
}
bool Sema::CheckCallingConvAttr(const AttributeList &attr, CallingConv &CC) {
@@ -2515,63 +2542,63 @@ bool Sema::CheckCallingConvAttr(const AttributeList &attr, CallingConv &CC) {
return false;
}
-static void HandleRegparmAttr(Decl *d, const AttributeList &attr, Sema &S) {
- if (hasDeclarator(d)) return;
+static void handleRegparmAttr(Sema &S, Decl *D, const AttributeList &Attr) {
+ if (hasDeclarator(D)) return;
unsigned numParams;
- if (S.CheckRegparmAttr(attr, numParams))
+ if (S.CheckRegparmAttr(Attr, numParams))
return;
- if (!isa<ObjCMethodDecl>(d)) {
- S.Diag(attr.getLoc(), diag::warn_attribute_wrong_decl_type)
- << attr.getName() << ExpectedFunctionOrMethod;
+ if (!isa<ObjCMethodDecl>(D)) {
+ S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type)
+ << Attr.getName() << ExpectedFunctionOrMethod;
return;
}
- d->addAttr(::new (S.Context) RegparmAttr(attr.getLoc(), S.Context, numParams));
+ D->addAttr(::new (S.Context) RegparmAttr(Attr.getLoc(), S.Context, numParams));
}
/// Checks a regparm attribute, returning true if it is ill-formed and
/// otherwise setting numParams to the appropriate value.
-bool Sema::CheckRegparmAttr(const AttributeList &attr, unsigned &numParams) {
- if (attr.isInvalid())
+bool Sema::CheckRegparmAttr(const AttributeList &Attr, unsigned &numParams) {
+ if (Attr.isInvalid())
return true;
- if (attr.getNumArgs() != 1) {
- Diag(attr.getLoc(), diag::err_attribute_wrong_number_arguments) << 1;
- attr.setInvalid();
+ if (Attr.getNumArgs() != 1) {
+ Diag(Attr.getLoc(), diag::err_attribute_wrong_number_arguments) << 1;
+ Attr.setInvalid();
return true;
}
- Expr *NumParamsExpr = attr.getArg(0);
+ Expr *NumParamsExpr = Attr.getArg(0);
llvm::APSInt NumParams(32);
if (NumParamsExpr->isTypeDependent() || NumParamsExpr->isValueDependent() ||
!NumParamsExpr->isIntegerConstantExpr(NumParams, Context)) {
- Diag(attr.getLoc(), diag::err_attribute_argument_not_int)
+ Diag(Attr.getLoc(), diag::err_attribute_argument_not_int)
<< "regparm" << NumParamsExpr->getSourceRange();
- attr.setInvalid();
+ Attr.setInvalid();
return true;
}
if (Context.Target.getRegParmMax() == 0) {
- Diag(attr.getLoc(), diag::err_attribute_regparm_wrong_platform)
+ Diag(Attr.getLoc(), diag::err_attribute_regparm_wrong_platform)
<< NumParamsExpr->getSourceRange();
- attr.setInvalid();
+ Attr.setInvalid();
return true;
}
numParams = NumParams.getZExtValue();
if (numParams > Context.Target.getRegParmMax()) {
- Diag(attr.getLoc(), diag::err_attribute_regparm_invalid_number)
+ Diag(Attr.getLoc(), diag::err_attribute_regparm_invalid_number)
<< Context.Target.getRegParmMax() << NumParamsExpr->getSourceRange();
- attr.setInvalid();
+ Attr.setInvalid();
return true;
}
return false;
}
-static void HandleLaunchBoundsAttr(Decl *d, const AttributeList &Attr, Sema &S){
+static void handleLaunchBoundsAttr(Sema &S, Decl *D, const AttributeList &Attr){
if (S.LangOpts.CUDA) {
// check the attribute arguments.
if (Attr.getNumArgs() != 1 && Attr.getNumArgs() != 2) {
@@ -2580,7 +2607,7 @@ static void HandleLaunchBoundsAttr(Decl *d, const AttributeList &Attr, Sema &S){
return;
}
- if (!isFunctionOrMethod(d)) {
+ if (!isFunctionOrMethod(D)) {
S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type)
<< Attr.getName() << ExpectedFunctionOrMethod;
return;
@@ -2608,7 +2635,7 @@ static void HandleLaunchBoundsAttr(Decl *d, const AttributeList &Attr, Sema &S){
}
}
- d->addAttr(::new (S.Context) CUDALaunchBoundsAttr(Attr.getLoc(), S.Context,
+ D->addAttr(::new (S.Context) CUDALaunchBoundsAttr(Attr.getLoc(), S.Context,
MaxThreads.getZExtValue(),
MinBlocks.getZExtValue()));
} else {
@@ -2627,16 +2654,16 @@ static bool isValidSubjectOfCFAttribute(Sema &S, QualType type) {
return type->isPointerType() || isValidSubjectOfNSAttribute(S, type);
}
-static void HandleNSConsumedAttr(Decl *d, const AttributeList &attr, Sema &S) {
- ParmVarDecl *param = dyn_cast<ParmVarDecl>(d);
+static void handleNSConsumedAttr(Sema &S, Decl *D, const AttributeList &Attr) {
+ ParmVarDecl *param = dyn_cast<ParmVarDecl>(D);
if (!param) {
- S.Diag(d->getLocStart(), diag::warn_attribute_wrong_decl_type)
- << SourceRange(attr.getLoc()) << attr.getName() << ExpectedParameter;
+ S.Diag(D->getLocStart(), diag::warn_attribute_wrong_decl_type)
+ << SourceRange(Attr.getLoc()) << Attr.getName() << ExpectedParameter;
return;
}
bool typeOK, cf;
- if (attr.getKind() == AttributeList::AT_ns_consumed) {
+ if (Attr.getKind() == AttributeList::AT_ns_consumed) {
typeOK = isValidSubjectOfNSAttribute(S, param->getType());
cf = false;
} else {
@@ -2645,47 +2672,52 @@ static void HandleNSConsumedAttr(Decl *d, const AttributeList &attr, Sema &S) {
}
if (!typeOK) {
- S.Diag(d->getLocStart(), diag::warn_ns_attribute_wrong_parameter_type)
- << SourceRange(attr.getLoc()) << attr.getName() << cf;
+ S.Diag(D->getLocStart(), diag::warn_ns_attribute_wrong_parameter_type)
+ << SourceRange(Attr.getLoc()) << Attr.getName() << cf;
return;
}
if (cf)
- param->addAttr(::new (S.Context) CFConsumedAttr(attr.getLoc(), S.Context));
+ param->addAttr(::new (S.Context) CFConsumedAttr(Attr.getLoc(), S.Context));
else
- param->addAttr(::new (S.Context) NSConsumedAttr(attr.getLoc(), S.Context));
+ param->addAttr(::new (S.Context) NSConsumedAttr(Attr.getLoc(), S.Context));
}
-static void HandleNSConsumesSelfAttr(Decl *d, const AttributeList &attr,
- Sema &S) {
- if (!isa<ObjCMethodDecl>(d)) {
- S.Diag(d->getLocStart(), diag::warn_attribute_wrong_decl_type)
- << SourceRange(attr.getLoc()) << attr.getName() << ExpectedMethod;
+static void handleNSConsumesSelfAttr(Sema &S, Decl *D,
+ const AttributeList &Attr) {
+ if (!isa<ObjCMethodDecl>(D)) {
+ S.Diag(D->getLocStart(), diag::warn_attribute_wrong_decl_type)
+ << SourceRange(Attr.getLoc()) << Attr.getName() << ExpectedMethod;
return;
}
- d->addAttr(::new (S.Context) NSConsumesSelfAttr(attr.getLoc(), S.Context));
+ D->addAttr(::new (S.Context) NSConsumesSelfAttr(Attr.getLoc(), S.Context));
}
-static void HandleNSReturnsRetainedAttr(Decl *d, const AttributeList &attr,
- Sema &S) {
+static void handleNSReturnsRetainedAttr(Sema &S, Decl *D,
+ const AttributeList &Attr) {
QualType returnType;
- if (ObjCMethodDecl *MD = dyn_cast<ObjCMethodDecl>(d))
+ if (ObjCMethodDecl *MD = dyn_cast<ObjCMethodDecl>(D))
returnType = MD->getResultType();
- else if (FunctionDecl *FD = dyn_cast<FunctionDecl>(d))
+ else if (ObjCPropertyDecl *PD = dyn_cast<ObjCPropertyDecl>(D))
+ returnType = PD->getType();
+ else if (S.getLangOptions().ObjCAutoRefCount && hasDeclarator(D) &&
+ (Attr.getKind() == AttributeList::AT_ns_returns_retained))
+ return; // ignore: was handled as a type attribute
+ else if (FunctionDecl *FD = dyn_cast<FunctionDecl>(D))
returnType = FD->getResultType();
else {
- S.Diag(d->getLocStart(), diag::warn_attribute_wrong_decl_type)
- << SourceRange(attr.getLoc()) << attr.getName()
+ S.Diag(D->getLocStart(), diag::warn_attribute_wrong_decl_type)
+ << SourceRange(Attr.getLoc()) << Attr.getName()
<< ExpectedFunctionOrMethod;
return;
}
bool typeOK;
bool cf;
- switch (attr.getKind()) {
+ switch (Attr.getKind()) {
default: llvm_unreachable("invalid ownership attribute"); return;
case AttributeList::AT_ns_returns_autoreleased:
case AttributeList::AT_ns_returns_retained:
@@ -2702,39 +2734,95 @@ static void HandleNSReturnsRetainedAttr(Decl *d, const AttributeList &attr,
}
if (!typeOK) {
- S.Diag(d->getLocStart(), diag::warn_ns_attribute_wrong_return_type)
- << SourceRange(attr.getLoc())
- << attr.getName() << isa<ObjCMethodDecl>(d) << cf;
+ S.Diag(D->getLocStart(), diag::warn_ns_attribute_wrong_return_type)
+ << SourceRange(Attr.getLoc())
+ << Attr.getName() << isa<ObjCMethodDecl>(D) << cf;
return;
}
- switch (attr.getKind()) {
+ switch (Attr.getKind()) {
default:
assert(0 && "invalid ownership attribute");
return;
case AttributeList::AT_ns_returns_autoreleased:
- d->addAttr(::new (S.Context) NSReturnsAutoreleasedAttr(attr.getLoc(),
+ D->addAttr(::new (S.Context) NSReturnsAutoreleasedAttr(Attr.getLoc(),
S.Context));
return;
case AttributeList::AT_cf_returns_not_retained:
- d->addAttr(::new (S.Context) CFReturnsNotRetainedAttr(attr.getLoc(),
+ D->addAttr(::new (S.Context) CFReturnsNotRetainedAttr(Attr.getLoc(),
S.Context));
return;
case AttributeList::AT_ns_returns_not_retained:
- d->addAttr(::new (S.Context) NSReturnsNotRetainedAttr(attr.getLoc(),
+ D->addAttr(::new (S.Context) NSReturnsNotRetainedAttr(Attr.getLoc(),
S.Context));
return;
case AttributeList::AT_cf_returns_retained:
- d->addAttr(::new (S.Context) CFReturnsRetainedAttr(attr.getLoc(),
+ D->addAttr(::new (S.Context) CFReturnsRetainedAttr(Attr.getLoc(),
S.Context));
return;
case AttributeList::AT_ns_returns_retained:
- d->addAttr(::new (S.Context) NSReturnsRetainedAttr(attr.getLoc(),
+ D->addAttr(::new (S.Context) NSReturnsRetainedAttr(Attr.getLoc(),
S.Context));
return;
};
}
+static void handleObjCOwnershipAttr(Sema &S, Decl *D,
+ const AttributeList &Attr) {
+ if (hasDeclarator(D)) return;
+
+ SourceLocation L = Attr.getLoc();
+ S.Diag(D->getLocStart(), diag::err_attribute_wrong_decl_type)
+ << SourceRange(L, L) << Attr.getName() << 12 /* variable */;
+}
+
+static void handleObjCPreciseLifetimeAttr(Sema &S, Decl *D,
+ const AttributeList &Attr) {
+ if (!isa<VarDecl>(D) && !isa<FieldDecl>(D)) {
+ SourceLocation L = Attr.getLoc();
+ S.Diag(D->getLocStart(), diag::err_attribute_wrong_decl_type)
+ << SourceRange(L, L) << Attr.getName() << 12 /* variable */;
+ return;
+ }
+
+ ValueDecl *vd = cast<ValueDecl>(D);
+ QualType type = vd->getType();
+
+ if (!type->isDependentType() &&
+ !type->isObjCLifetimeType()) {
+ S.Diag(Attr.getLoc(), diag::err_objc_precise_lifetime_bad_type)
+ << type;
+ return;
+ }
+
+ Qualifiers::ObjCLifetime lifetime = type.getObjCLifetime();
+
+ // If we have no lifetime yet, check the lifetime we're presumably
+ // going to infer.
+ if (lifetime == Qualifiers::OCL_None && !type->isDependentType())
+ lifetime = type->getObjCARCImplicitLifetime();
+
+ switch (lifetime) {
+ case Qualifiers::OCL_None:
+ assert(type->isDependentType() &&
+ "didn't infer lifetime for non-dependent type?");
+ break;
+
+ case Qualifiers::OCL_Weak: // meaningful
+ case Qualifiers::OCL_Strong: // meaningful
+ break;
+
+ case Qualifiers::OCL_ExplicitNone:
+ case Qualifiers::OCL_Autoreleasing:
+ S.Diag(Attr.getLoc(), diag::warn_objc_precise_lifetime_meaningless)
+ << (lifetime == Qualifiers::OCL_Autoreleasing);
+ break;
+ }
+
+ D->addAttr(::new (S.Context)
+ ObjCPreciseLifetimeAttr(Attr.getLoc(), S.Context));
+}
+
static bool isKnownDeclSpecAttr(const AttributeList &Attr) {
return Attr.getKind() == AttributeList::AT_dllimport ||
Attr.getKind() == AttributeList::AT_dllexport ||
@@ -2745,13 +2833,12 @@ static bool isKnownDeclSpecAttr(const AttributeList &Attr) {
// Microsoft specific attribute handlers.
//===----------------------------------------------------------------------===//
-static void HandleUuidAttr(Decl *d, const AttributeList &Attr, Sema &S) {
+static void handleUuidAttr(Sema &S, Decl *D, const AttributeList &Attr) {
if (S.LangOpts.Microsoft || S.LangOpts.Borland) {
// check the attribute arguments.
- if (Attr.getNumArgs() != 1) {
- S.Diag(Attr.getLoc(), diag::err_attribute_wrong_number_arguments) << 1;
+ if (!checkAttributeNumArgs(S, Attr, 1))
return;
- }
+
Expr *Arg = Attr.getArg(0);
StringLiteral *Str = dyn_cast<StringLiteral>(Arg);
if (Str == 0 || Str->isWide()) {
@@ -2794,7 +2881,7 @@ static void HandleUuidAttr(Decl *d, const AttributeList &Attr, Sema &S) {
I++;
}
- d->addAttr(::new (S.Context) UuidAttr(Attr.getLoc(), S.Context,
+ D->addAttr(::new (S.Context) UuidAttr(Attr.getLoc(), S.Context,
Str->getString()));
} else
S.Diag(Attr.getLoc(), diag::warn_attribute_ignored) << "uuid";
@@ -2804,24 +2891,24 @@ static void HandleUuidAttr(Decl *d, const AttributeList &Attr, Sema &S) {
// Top Level Sema Entry Points
//===----------------------------------------------------------------------===//
-static void ProcessNonInheritableDeclAttr(Scope *scope, Decl *D,
- const AttributeList &Attr, Sema &S) {
+static void ProcessNonInheritableDeclAttr(Sema &S, Scope *scope, Decl *D,
+ const AttributeList &Attr) {
switch (Attr.getKind()) {
- case AttributeList::AT_device: HandleDeviceAttr (D, Attr, S); break;
- case AttributeList::AT_host: HandleHostAttr (D, Attr, S); break;
- case AttributeList::AT_overloadable:HandleOverloadableAttr(D, Attr, S); break;
+ case AttributeList::AT_device: handleDeviceAttr (S, D, Attr); break;
+ case AttributeList::AT_host: handleHostAttr (S, D, Attr); break;
+ case AttributeList::AT_overloadable:handleOverloadableAttr(S, D, Attr); break;
default:
break;
}
}
-static void ProcessInheritableDeclAttr(Scope *scope, Decl *D,
- const AttributeList &Attr, Sema &S) {
+static void ProcessInheritableDeclAttr(Sema &S, Scope *scope, Decl *D,
+ const AttributeList &Attr) {
switch (Attr.getKind()) {
- case AttributeList::AT_IBAction: HandleIBAction(D, Attr, S); break;
- case AttributeList::AT_IBOutlet: HandleIBOutlet(D, Attr, S); break;
+ case AttributeList::AT_IBAction: handleIBAction(S, D, Attr); break;
+ case AttributeList::AT_IBOutlet: handleIBOutlet(S, D, Attr); break;
case AttributeList::AT_IBOutletCollection:
- HandleIBOutletCollection(D, Attr, S); break;
+ handleIBOutletCollection(S, D, Attr); break;
case AttributeList::AT_address_space:
case AttributeList::AT_opencl_image_access:
case AttributeList::AT_objc_gc:
@@ -2837,100 +2924,108 @@ static void ProcessInheritableDeclAttr(Scope *scope, Decl *D,
// Ignore, this is a non-inheritable attribute, handled
// by ProcessNonInheritableDeclAttr.
break;
- case AttributeList::AT_alias: HandleAliasAttr (D, Attr, S); break;
- case AttributeList::AT_aligned: HandleAlignedAttr (D, Attr, S); break;
+ case AttributeList::AT_alias: handleAliasAttr (S, D, Attr); break;
+ case AttributeList::AT_aligned: handleAlignedAttr (S, D, Attr); break;
case AttributeList::AT_always_inline:
- HandleAlwaysInlineAttr (D, Attr, S); break;
+ handleAlwaysInlineAttr (S, D, Attr); break;
case AttributeList::AT_analyzer_noreturn:
- HandleAnalyzerNoReturnAttr (D, Attr, S); break;
- case AttributeList::AT_annotate: HandleAnnotateAttr (D, Attr, S); break;
- case AttributeList::AT_availability:HandleAvailabilityAttr(D, Attr, S); break;
+ handleAnalyzerNoReturnAttr (S, D, Attr); break;
+ case AttributeList::AT_annotate: handleAnnotateAttr (S, D, Attr); break;
+ case AttributeList::AT_availability:handleAvailabilityAttr(S, D, Attr); break;
case AttributeList::AT_carries_dependency:
- HandleDependencyAttr (D, Attr, S); break;
- case AttributeList::AT_common: HandleCommonAttr (D, Attr, S); break;
- case AttributeList::AT_constant: HandleConstantAttr (D, Attr, S); break;
- case AttributeList::AT_constructor: HandleConstructorAttr (D, Attr, S); break;
- case AttributeList::AT_deprecated: HandleDeprecatedAttr (D, Attr, S); break;
- case AttributeList::AT_destructor: HandleDestructorAttr (D, Attr, S); break;
+ handleDependencyAttr (S, D, Attr); break;
+ case AttributeList::AT_common: handleCommonAttr (S, D, Attr); break;
+ case AttributeList::AT_constant: handleConstantAttr (S, D, Attr); break;
+ case AttributeList::AT_constructor: handleConstructorAttr (S, D, Attr); break;
+ case AttributeList::AT_deprecated: handleDeprecatedAttr (S, D, Attr); break;
+ case AttributeList::AT_destructor: handleDestructorAttr (S, D, Attr); break;
case AttributeList::AT_ext_vector_type:
- HandleExtVectorTypeAttr(scope, D, Attr, S);
+ handleExtVectorTypeAttr(S, scope, D, Attr);
break;
- case AttributeList::AT_format: HandleFormatAttr (D, Attr, S); break;
- case AttributeList::AT_format_arg: HandleFormatArgAttr (D, Attr, S); break;
- case AttributeList::AT_global: HandleGlobalAttr (D, Attr, S); break;
- case AttributeList::AT_gnu_inline: HandleGNUInlineAttr (D, Attr, S); break;
+ case AttributeList::AT_format: handleFormatAttr (S, D, Attr); break;
+ case AttributeList::AT_format_arg: handleFormatArgAttr (S, D, Attr); break;
+ case AttributeList::AT_global: handleGlobalAttr (S, D, Attr); break;
+ case AttributeList::AT_gnu_inline: handleGNUInlineAttr (S, D, Attr); break;
case AttributeList::AT_launch_bounds:
- HandleLaunchBoundsAttr(D, Attr, S);
+ handleLaunchBoundsAttr(S, D, Attr);
break;
- case AttributeList::AT_mode: HandleModeAttr (D, Attr, S); break;
- case AttributeList::AT_malloc: HandleMallocAttr (D, Attr, S); break;
- case AttributeList::AT_may_alias: HandleMayAliasAttr (D, Attr, S); break;
- case AttributeList::AT_nocommon: HandleNoCommonAttr (D, Attr, S); break;
- case AttributeList::AT_nonnull: HandleNonNullAttr (D, Attr, S); break;
+ case AttributeList::AT_mode: handleModeAttr (S, D, Attr); break;
+ case AttributeList::AT_malloc: handleMallocAttr (S, D, Attr); break;
+ case AttributeList::AT_may_alias: handleMayAliasAttr (S, D, Attr); break;
+ case AttributeList::AT_nocommon: handleNoCommonAttr (S, D, Attr); break;
+ case AttributeList::AT_nonnull: handleNonNullAttr (S, D, Attr); break;
case AttributeList::AT_ownership_returns:
case AttributeList::AT_ownership_takes:
case AttributeList::AT_ownership_holds:
- HandleOwnershipAttr (D, Attr, S); break;
- case AttributeList::AT_naked: HandleNakedAttr (D, Attr, S); break;
- case AttributeList::AT_noreturn: HandleNoReturnAttr (D, Attr, S); break;
- case AttributeList::AT_nothrow: HandleNothrowAttr (D, Attr, S); break;
- case AttributeList::AT_shared: HandleSharedAttr (D, Attr, S); break;
- case AttributeList::AT_vecreturn: HandleVecReturnAttr (D, Attr, S); break;
+ handleOwnershipAttr (S, D, Attr); break;
+ case AttributeList::AT_naked: handleNakedAttr (S, D, Attr); break;
+ case AttributeList::AT_noreturn: handleNoReturnAttr (S, D, Attr); break;
+ case AttributeList::AT_nothrow: handleNothrowAttr (S, D, Attr); break;
+ case AttributeList::AT_shared: handleSharedAttr (S, D, Attr); break;
+ case AttributeList::AT_vecreturn: handleVecReturnAttr (S, D, Attr); break;
+
+ case AttributeList::AT_objc_ownership:
+ handleObjCOwnershipAttr(S, D, Attr); break;
+ case AttributeList::AT_objc_precise_lifetime:
+ handleObjCPreciseLifetimeAttr(S, D, Attr); break;
// Checker-specific.
case AttributeList::AT_cf_consumed:
- case AttributeList::AT_ns_consumed: HandleNSConsumedAttr (D, Attr, S); break;
+ case AttributeList::AT_ns_consumed: handleNSConsumedAttr (S, D, Attr); break;
case AttributeList::AT_ns_consumes_self:
- HandleNSConsumesSelfAttr(D, Attr, S); break;
+ handleNSConsumesSelfAttr(S, D, Attr); break;
case AttributeList::AT_ns_returns_autoreleased:
case AttributeList::AT_ns_returns_not_retained:
case AttributeList::AT_cf_returns_not_retained:
case AttributeList::AT_ns_returns_retained:
case AttributeList::AT_cf_returns_retained:
- HandleNSReturnsRetainedAttr(D, Attr, S); break;
+ handleNSReturnsRetainedAttr(S, D, Attr); break;
case AttributeList::AT_reqd_wg_size:
- HandleReqdWorkGroupSize(D, Attr, S); break;
+ handleReqdWorkGroupSize(S, D, Attr); break;
case AttributeList::AT_init_priority:
- HandleInitPriorityAttr(D, Attr, S); break;
+ handleInitPriorityAttr(S, D, Attr); break;
- case AttributeList::AT_packed: HandlePackedAttr (D, Attr, S); break;
- case AttributeList::AT_MsStruct: HandleMsStructAttr (D, Attr, S); break;
- case AttributeList::AT_section: HandleSectionAttr (D, Attr, S); break;
- case AttributeList::AT_unavailable: HandleUnavailableAttr (D, Attr, S); break;
- case AttributeList::AT_unused: HandleUnusedAttr (D, Attr, S); break;
- case AttributeList::AT_used: HandleUsedAttr (D, Attr, S); break;
- case AttributeList::AT_visibility: HandleVisibilityAttr (D, Attr, S); break;
- case AttributeList::AT_warn_unused_result: HandleWarnUnusedResult(D,Attr,S);
+ case AttributeList::AT_packed: handlePackedAttr (S, D, Attr); break;
+ case AttributeList::AT_MsStruct: handleMsStructAttr (S, D, Attr); break;
+ case AttributeList::AT_section: handleSectionAttr (S, D, Attr); break;
+ case AttributeList::AT_unavailable: handleUnavailableAttr (S, D, Attr); break;
+ case AttributeList::AT_arc_weakref_unavailable:
+ handleArcWeakrefUnavailableAttr (S, D, Attr);
break;
- case AttributeList::AT_weak: HandleWeakAttr (D, Attr, S); break;
- case AttributeList::AT_weakref: HandleWeakRefAttr (D, Attr, S); break;
- case AttributeList::AT_weak_import: HandleWeakImportAttr (D, Attr, S); break;
+ case AttributeList::AT_unused: handleUnusedAttr (S, D, Attr); break;
+ case AttributeList::AT_used: handleUsedAttr (S, D, Attr); break;
+ case AttributeList::AT_visibility: handleVisibilityAttr (S, D, Attr); break;
+ case AttributeList::AT_warn_unused_result: handleWarnUnusedResult(S, D, Attr);
+ break;
+ case AttributeList::AT_weak: handleWeakAttr (S, D, Attr); break;
+ case AttributeList::AT_weakref: handleWeakRefAttr (S, D, Attr); break;
+ case AttributeList::AT_weak_import: handleWeakImportAttr (S, D, Attr); break;
case AttributeList::AT_transparent_union:
- HandleTransparentUnionAttr(D, Attr, S);
+ handleTransparentUnionAttr(S, D, Attr);
break;
case AttributeList::AT_objc_exception:
- HandleObjCExceptionAttr(D, Attr, S);
+ handleObjCExceptionAttr(S, D, Attr);
break;
case AttributeList::AT_objc_method_family:
- HandleObjCMethodFamilyAttr(D, Attr, S);
+ handleObjCMethodFamilyAttr(S, D, Attr);
break;
- case AttributeList::AT_nsobject: HandleObjCNSObject (D, Attr, S); break;
- case AttributeList::AT_blocks: HandleBlocksAttr (D, Attr, S); break;
- case AttributeList::AT_sentinel: HandleSentinelAttr (D, Attr, S); break;
- case AttributeList::AT_const: HandleConstAttr (D, Attr, S); break;
- case AttributeList::AT_pure: HandlePureAttr (D, Attr, S); break;
- case AttributeList::AT_cleanup: HandleCleanupAttr (D, Attr, S); break;
- case AttributeList::AT_nodebug: HandleNoDebugAttr (D, Attr, S); break;
- case AttributeList::AT_noinline: HandleNoInlineAttr (D, Attr, S); break;
- case AttributeList::AT_regparm: HandleRegparmAttr (D, Attr, S); break;
+ case AttributeList::AT_nsobject: handleObjCNSObject (S, D, Attr); break;
+ case AttributeList::AT_blocks: handleBlocksAttr (S, D, Attr); break;
+ case AttributeList::AT_sentinel: handleSentinelAttr (S, D, Attr); break;
+ case AttributeList::AT_const: handleConstAttr (S, D, Attr); break;
+ case AttributeList::AT_pure: handlePureAttr (S, D, Attr); break;
+ case AttributeList::AT_cleanup: handleCleanupAttr (S, D, Attr); break;
+ case AttributeList::AT_nodebug: handleNoDebugAttr (S, D, Attr); break;
+ case AttributeList::AT_noinline: handleNoInlineAttr (S, D, Attr); break;
+ case AttributeList::AT_regparm: handleRegparmAttr (S, D, Attr); break;
case AttributeList::IgnoredAttribute:
// Just ignore
break;
case AttributeList::AT_no_instrument_function: // Interacts with -pg.
- HandleNoInstrumentFunctionAttr(D, Attr, S);
+ handleNoInstrumentFunctionAttr(S, D, Attr);
break;
case AttributeList::AT_stdcall:
case AttributeList::AT_cdecl:
@@ -2938,13 +3033,13 @@ static void ProcessInheritableDeclAttr(Scope *scope, Decl *D,
case AttributeList::AT_thiscall:
case AttributeList::AT_pascal:
case AttributeList::AT_pcs:
- HandleCallConvAttr(D, Attr, S);
+ handleCallConvAttr(S, D, Attr);
break;
case AttributeList::AT_opencl_kernel_function:
- HandleOpenCLKernelAttr(D, Attr, S);
+ handleOpenCLKernelAttr(S, D, Attr);
break;
case AttributeList::AT_uuid:
- HandleUuidAttr(D, Attr, S);
+ handleUuidAttr(S, D, Attr);
break;
default:
// Ask target about the attribute.
@@ -2960,8 +3055,8 @@ static void ProcessInheritableDeclAttr(Scope *scope, Decl *D,
/// the attribute applies to decls. If the attribute is a type attribute, just
/// silently ignore it if a GNU attribute. FIXME: Applying a C++0x attribute to
/// the wrong thing is illegal (C++0x [dcl.attr.grammar]/4).
-static void ProcessDeclAttribute(Scope *scope, Decl *D,
- const AttributeList &Attr, Sema &S,
+static void ProcessDeclAttribute(Sema &S, Scope *scope, Decl *D,
+ const AttributeList &Attr,
bool NonInheritable, bool Inheritable) {
if (Attr.isInvalid())
return;
@@ -2971,10 +3066,10 @@ static void ProcessDeclAttribute(Scope *scope, Decl *D,
return;
if (NonInheritable)
- ProcessNonInheritableDeclAttr(scope, D, Attr, S);
+ ProcessNonInheritableDeclAttr(S, scope, D, Attr);
if (Inheritable)
- ProcessInheritableDeclAttr(scope, D, Attr, S);
+ ProcessInheritableDeclAttr(S, scope, D, Attr);
}
/// ProcessDeclAttributeList - Apply all the decl attributes in the specified
@@ -2983,7 +3078,7 @@ void Sema::ProcessDeclAttributeList(Scope *S, Decl *D,
const AttributeList *AttrList,
bool NonInheritable, bool Inheritable) {
for (const AttributeList* l = AttrList; l; l = l->getNext()) {
- ProcessDeclAttribute(S, D, *l, *this, NonInheritable, Inheritable);
+ ProcessDeclAttribute(*this, S, D, *l, NonInheritable, Inheritable);
}
// GCC accepts
@@ -3085,6 +3180,32 @@ void Sema::ProcessDeclAttributes(Scope *S, Decl *D, const Declarator &PD,
ProcessDeclAttributeList(S, D, Attrs, NonInheritable, Inheritable);
}
+/// Is the given declaration allowed to use a forbidden type?
+static bool isForbiddenTypeAllowed(Sema &S, Decl *decl) {
+ // Private ivars are always okay. Unfortunately, people don't
+ // always properly make their ivars private, even in system headers.
+ // Plus we need to make fields okay, too.
+ if (!isa<FieldDecl>(decl) && !isa<ObjCPropertyDecl>(decl))
+ return false;
+
+ // Require it to be declared in a system header.
+ return S.Context.getSourceManager().isInSystemHeader(decl->getLocation());
+}
+
+/// Handle a delayed forbidden-type diagnostic.
+static void handleDelayedForbiddenType(Sema &S, DelayedDiagnostic &diag,
+ Decl *decl) {
+ if (decl && isForbiddenTypeAllowed(S, decl)) {
+ decl->addAttr(new (S.Context) UnavailableAttr(diag.Loc, S.Context,
+ "this system declaration uses an unsupported type"));
+ return;
+ }
+
+ S.Diag(diag.Loc, diag.getForbiddenTypeDiagnostic())
+ << diag.getForbiddenTypeOperand() << diag.getForbiddenTypeArgument();
+ diag.Triggered = true;
+}
+
// This duplicates a vector push_back but hides the need to know the
// size of the type.
void Sema::DelayedDiagnostics::add(const DelayedDiagnostic &diag) {
@@ -3126,7 +3247,7 @@ void Sema::DelayedDiagnostics::popParsingDecl(Sema &S, ParsingDeclState state,
// We only want to actually emit delayed diagnostics when we
// successfully parsed a decl.
- if (decl) {
+ if (decl && !decl->isInvalidDecl()) {
// We emit all the active diagnostics, not just those starting
// from the saved state. The idea is this: we get one push for a
// decl spec and another for each declarator; in a decl group like:
@@ -3147,6 +3268,10 @@ void Sema::DelayedDiagnostics::popParsingDecl(Sema &S, ParsingDeclState state,
case DelayedDiagnostic::Access:
S.HandleDelayedAccessCheck(diag, decl);
break;
+
+ case DelayedDiagnostic::ForbiddenType:
+ handleDelayedForbiddenType(S, diag, decl);
+ break;
}
}
}
diff --git a/contrib/llvm/tools/clang/lib/Sema/SemaDeclCXX.cpp b/contrib/llvm/tools/clang/lib/Sema/SemaDeclCXX.cpp
index ce99efb..d793daf 100644
--- a/contrib/llvm/tools/clang/lib/Sema/SemaDeclCXX.cpp
+++ b/contrib/llvm/tools/clang/lib/Sema/SemaDeclCXX.cpp
@@ -185,9 +185,9 @@ void Sema::ImplicitExceptionSpecification::CalledExpr(Expr *E) {
// FIXME:
//
// C++0x [except.spec]p14:
- // [An] implicit exception-speciï¬cation speciï¬es the type-id T if and
- // only if T is allowed by the exception-speciï¬cation of a function directly
- // invoked by f’s implicit deï¬nition; f shall allow all exceptions if any
+ // [An] implicit exception-specification specifies the type-id T if and
+ // only if T is allowed by the exception-specification of a function directly
+ // invoked by f's implicit definition; f shall allow all exceptions if any
// function it directly invokes allows all exceptions, and f shall allow no
// exceptions if every function it directly invokes allows no exceptions.
//
@@ -762,13 +762,6 @@ bool Sema::AttachBaseSpecifiers(CXXRecordDecl *Class, CXXBaseSpecifier **Bases,
QualType NewBaseType
= Context.getCanonicalType(Bases[idx]->getType());
NewBaseType = NewBaseType.getLocalUnqualifiedType();
- if (!Class->hasObjectMember()) {
- if (const RecordType *FDTTy =
- NewBaseType.getTypePtr()->getAs<RecordType>())
- if (FDTTy->getDecl()->hasObjectMember())
- Class->setHasObjectMember(true);
- }
-
if (KnownBaseTypes[NewBaseType]) {
// C++ [class.mi]p3:
// A class shall not be specified as a direct base class of a
@@ -1086,14 +1079,7 @@ Sema::ActOnCXXMemberDeclarator(Scope *S, AccessSpecifier AS, Declarator &D,
assert(!DS.isFriendSpecified());
assert(!Init || !HasDeferredInit);
- bool isFunc = false;
- if (D.isFunctionDeclarator())
- isFunc = true;
- else if (D.getNumTypeObjects() == 0 &&
- D.getDeclSpec().getTypeSpecType() == DeclSpec::TST_typename) {
- QualType TDType = GetTypeFromParser(DS.getRepAsType());
- isFunc = TDType->isFunctionType();
- }
+ bool isFunc = D.isDeclarationOfFunction();
// C++ 9.2p6: A member shall not be declared to have automatic storage
// duration (auto, register) or with the extern storage-class-specifier.
@@ -1440,25 +1426,27 @@ Sema::ActOnMemInitializer(Decl *ConstructorD,
}
// If no results were found, try to correct typos.
+ TypoCorrection Corr;
if (R.empty() && BaseType.isNull() &&
- CorrectTypo(R, S, &SS, ClassDecl, 0, CTC_NoKeywords) &&
- R.isSingleResult()) {
- if (FieldDecl *Member = R.getAsSingle<FieldDecl>()) {
+ (Corr = CorrectTypo(R.getLookupNameInfo(), R.getLookupKind(), S, &SS,
+ ClassDecl, false, CTC_NoKeywords))) {
+ std::string CorrectedStr(Corr.getAsString(getLangOptions()));
+ std::string CorrectedQuotedStr(Corr.getQuoted(getLangOptions()));
+ if (FieldDecl *Member = Corr.getCorrectionDeclAs<FieldDecl>()) {
if (Member->getDeclContext()->getRedeclContext()->Equals(ClassDecl)) {
// We have found a non-static data member with a similar
// name to what was typed; complain and initialize that
// member.
Diag(R.getNameLoc(), diag::err_mem_init_not_member_or_class_suggest)
- << MemberOrBase << true << R.getLookupName()
- << FixItHint::CreateReplacement(R.getNameLoc(),
- R.getLookupName().getAsString());
+ << MemberOrBase << true << CorrectedQuotedStr
+ << FixItHint::CreateReplacement(R.getNameLoc(), CorrectedStr);
Diag(Member->getLocation(), diag::note_previous_decl)
- << Member->getDeclName();
+ << CorrectedQuotedStr;
return BuildMemberInitializer(Member, (Expr**)Args, NumArgs, IdLoc,
LParenLoc, RParenLoc);
}
- } else if (TypeDecl *Type = R.getAsSingle<TypeDecl>()) {
+ } else if (TypeDecl *Type = Corr.getCorrectionDeclAs<TypeDecl>()) {
const CXXBaseSpecifier *DirectBaseSpec;
const CXXBaseSpecifier *VirtualBaseSpec;
if (FindBaseInitializer(*this, ClassDecl,
@@ -1468,9 +1456,8 @@ Sema::ActOnMemInitializer(Decl *ConstructorD,
// similar name to what was typed; complain and initialize
// that base class.
Diag(R.getNameLoc(), diag::err_mem_init_not_member_or_class_suggest)
- << MemberOrBase << false << R.getLookupName()
- << FixItHint::CreateReplacement(R.getNameLoc(),
- R.getLookupName().getAsString());
+ << MemberOrBase << false << CorrectedQuotedStr
+ << FixItHint::CreateReplacement(R.getNameLoc(), CorrectedStr);
const CXXBaseSpecifier *BaseSpec = DirectBaseSpec? DirectBaseSpec
: VirtualBaseSpec;
@@ -1617,14 +1604,10 @@ Sema::BuildMemberInitializer(ValueDecl *Member, Expr **Args,
// Can't check initialization for a member of dependent type or when
// any of the arguments are type-dependent expressions.
Init = new (Context) ParenListExpr(Context, LParenLoc, Args, NumArgs,
- RParenLoc);
-
- // Erase any temporaries within this evaluation context; we're not
- // going to track them in the AST, since we'll be rebuilding the
- // ASTs during template instantiation.
- ExprTemporaries.erase(
- ExprTemporaries.begin() + ExprEvalContexts.back().NumTemporaries,
- ExprTemporaries.end());
+ RParenLoc,
+ Member->getType().getNonReferenceType());
+
+ DiscardCleanupsInEvaluationContext();
} else {
// Initialize the member.
InitializedEntity MemberEntity =
@@ -1658,8 +1641,9 @@ Sema::BuildMemberInitializer(ValueDecl *Member, Expr **Args,
// initializer. However, deconstructing the ASTs is a dicey process,
// and this approach is far more likely to get the corner cases right.
if (CurContext->isDependentContext())
- Init = new (Context) ParenListExpr(Context, LParenLoc, Args, NumArgs,
- RParenLoc);
+ Init = new (Context) ParenListExpr(
+ Context, LParenLoc, Args, NumArgs, RParenLoc,
+ Member->getType().getNonReferenceType());
else
Init = MemberInit.get();
}
@@ -1715,22 +1699,7 @@ Sema::BuildDelegatingInitializer(TypeSourceInfo *TInfo,
if (DelegationInit.isInvalid())
return true;
- // If we are in a dependent context, template instantiation will
- // perform this type-checking again. Just save the arguments that we
- // received in a ParenListExpr.
- // FIXME: This isn't quite ideal, since our ASTs don't capture all
- // of the information that we have about the base
- // initializer. However, deconstructing the ASTs is a dicey process,
- // and this approach is far more likely to get the corner cases right.
- if (CurContext->isDependentContext()) {
- ExprResult Init
- = Owned(new (Context) ParenListExpr(Context, LParenLoc, Args,
- NumArgs, RParenLoc));
- return new (Context) CXXCtorInitializer(Context, Loc, LParenLoc,
- Constructor, Init.takeAs<Expr>(),
- RParenLoc);
- }
-
+ assert(!CurContext->isDependentContext());
return new (Context) CXXCtorInitializer(Context, Loc, LParenLoc, Constructor,
DelegationInit.takeAs<Expr>(),
RParenLoc);
@@ -1815,14 +1784,9 @@ Sema::BuildBaseInitializer(QualType BaseType, TypeSourceInfo *BaseTInfo,
// any of the arguments are type-dependent expressions.
ExprResult BaseInit
= Owned(new (Context) ParenListExpr(Context, LParenLoc, Args, NumArgs,
- RParenLoc));
+ RParenLoc, BaseType));
- // Erase any temporaries within this evaluation context; we're not
- // going to track them in the AST, since we'll be rebuilding the
- // ASTs during template instantiation.
- ExprTemporaries.erase(
- ExprTemporaries.begin() + ExprEvalContexts.back().NumTemporaries,
- ExprTemporaries.end());
+ DiscardCleanupsInEvaluationContext();
return new (Context) CXXCtorInitializer(Context, BaseTInfo,
/*IsVirtual=*/false,
@@ -1878,7 +1842,7 @@ Sema::BuildBaseInitializer(QualType BaseType, TypeSourceInfo *BaseTInfo,
if (CurContext->isDependentContext()) {
ExprResult Init
= Owned(new (Context) ParenListExpr(Context, LParenLoc, Args, NumArgs,
- RParenLoc));
+ RParenLoc, BaseType));
return new (Context) CXXCtorInitializer(Context, BaseTInfo,
BaseSpec->isVirtual(),
LParenLoc,
@@ -1989,6 +1953,11 @@ BuildImplicitMemberInitializer(Sema &SemaRef, CXXConstructorDecl *Constructor,
if (ImplicitInitKind == IIK_Copy) {
ParmVarDecl *Param = Constructor->getParamDecl(0);
QualType ParamType = Param->getType().getNonReferenceType();
+
+ // Suppress copying zero-width bitfields.
+ if (const Expr *Width = Field->getBitWidth())
+ if (Width->EvaluateAsInt(SemaRef.Context) == 0)
+ return false;
Expr *MemberExprBase =
DeclRefExpr::Create(SemaRef.Context, NestedNameSpecifierLoc(), Param,
@@ -2134,6 +2103,20 @@ BuildImplicitMemberInitializer(Sema &SemaRef, CXXConstructorDecl *Constructor,
}
}
+ if (SemaRef.getLangOptions().ObjCAutoRefCount &&
+ FieldBaseElementType->isObjCRetainableType() &&
+ FieldBaseElementType.getObjCLifetime() != Qualifiers::OCL_None &&
+ FieldBaseElementType.getObjCLifetime() != Qualifiers::OCL_ExplicitNone) {
+ // Instant objects:
+ // Default-initialize Objective-C pointers to NULL.
+ CXXMemberInit
+ = new (SemaRef.Context) CXXCtorInitializer(SemaRef.Context, Field,
+ Loc, Loc,
+ new (SemaRef.Context) ImplicitValueInitExpr(Field->getType()),
+ Loc);
+ return false;
+ }
+
// Nothing to initialize.
CXXMemberInit = 0;
return false;
@@ -2207,11 +2190,8 @@ static bool CollectFieldInitializer(Sema &SemaRef, BaseAndFieldInfo &Info,
}
}
- // Fallthrough and construct a default initializer for the union as
- // a whole, which can call its default constructor if such a thing exists
- // (C++0x perhaps). FIXME: It's not clear that this is the correct
- // behavior going forward with C++0x, when anonymous unions there are
- // finalized, we should revisit this.
+ // FIXME: C++0x unrestricted unions might call a default constructor here.
+ return false;
} else {
// For structs, we simply descend through to initialize all members where
// necessary.
@@ -2259,11 +2239,10 @@ Sema::SetDelegatingInitializer(CXXConstructorDecl *Constructor,
return false;
}
-bool
-Sema::SetCtorInitializers(CXXConstructorDecl *Constructor,
- CXXCtorInitializer **Initializers,
- unsigned NumInitializers,
- bool AnyErrors) {
+bool Sema::SetCtorInitializers(CXXConstructorDecl *Constructor,
+ CXXCtorInitializer **Initializers,
+ unsigned NumInitializers,
+ bool AnyErrors) {
if (Constructor->getDeclContext()->isDependentContext()) {
// Just store the initializers as written, they will be checked during
// instantiation.
@@ -3405,7 +3384,7 @@ void Sema::CheckExplicitlyDefaultedDestructor(CXXDestructorDecl *DD) {
bool Sema::ShouldDeleteDefaultConstructor(CXXConstructorDecl *CD) {
CXXRecordDecl *RD = CD->getParent();
assert(!RD->isDependentType() && "do deletion after instantiation");
- if (!LangOpts.CPlusPlus0x)
+ if (!LangOpts.CPlusPlus0x || RD->isInvalidDecl())
return false;
SourceLocation Loc = CD->getLocation();
@@ -3586,7 +3565,7 @@ bool Sema::ShouldDeleteDefaultConstructor(CXXConstructorDecl *CD) {
bool Sema::ShouldDeleteCopyConstructor(CXXConstructorDecl *CD) {
CXXRecordDecl *RD = CD->getParent();
assert(!RD->isDependentType() && "do deletion after instantiation");
- if (!LangOpts.CPlusPlus0x)
+ if (!LangOpts.CPlusPlus0x || RD->isInvalidDecl())
return false;
SourceLocation Loc = CD->getLocation();
@@ -3636,7 +3615,7 @@ bool Sema::ShouldDeleteCopyConstructor(CXXConstructorDecl *CD) {
// resolution, as applied to B's [copy] constructor, results in an
// ambiguity or a function that is deleted or inaccessible from the
// defaulted constructor
- CXXConstructorDecl *BaseCtor = LookupCopyConstructor(BaseDecl, ArgQuals);
+ CXXConstructorDecl *BaseCtor = LookupCopyingConstructor(BaseDecl, ArgQuals);
if (!BaseCtor || BaseCtor->isDeleted())
return true;
if (CheckConstructorAccess(Loc, BaseCtor, BaseCtor->getAccess(), PDiag()) !=
@@ -3664,7 +3643,7 @@ bool Sema::ShouldDeleteCopyConstructor(CXXConstructorDecl *CD) {
// resolution, as applied to B's [copy] constructor, results in an
// ambiguity or a function that is deleted or inaccessible from the
// defaulted constructor
- CXXConstructorDecl *BaseCtor = LookupCopyConstructor(BaseDecl, ArgQuals);
+ CXXConstructorDecl *BaseCtor = LookupCopyingConstructor(BaseDecl, ArgQuals);
if (!BaseCtor || BaseCtor->isDeleted())
return true;
if (CheckConstructorAccess(Loc, BaseCtor, BaseCtor->getAccess(), PDiag()) !=
@@ -3726,8 +3705,8 @@ bool Sema::ShouldDeleteCopyConstructor(CXXConstructorDecl *CD) {
// cannot be [copied] because overload resolution, as applied to B's
// [copy] constructor, results in an ambiguity or a function that is
// deleted or inaccessible from the defaulted constructor
- CXXConstructorDecl *FieldCtor = LookupCopyConstructor(FieldRecord,
- ArgQuals);
+ CXXConstructorDecl *FieldCtor = LookupCopyingConstructor(FieldRecord,
+ ArgQuals);
if (!FieldCtor || FieldCtor->isDeleted())
return true;
if (CheckConstructorAccess(Loc, FieldCtor, FieldCtor->getAccess(),
@@ -3742,7 +3721,7 @@ bool Sema::ShouldDeleteCopyConstructor(CXXConstructorDecl *CD) {
bool Sema::ShouldDeleteCopyAssignmentOperator(CXXMethodDecl *MD) {
CXXRecordDecl *RD = MD->getParent();
assert(!RD->isDependentType() && "do deletion after instantiation");
- if (!LangOpts.CPlusPlus0x)
+ if (!LangOpts.CPlusPlus0x || RD->isInvalidDecl())
return false;
SourceLocation Loc = MD->getLocation();
@@ -3752,19 +3731,15 @@ bool Sema::ShouldDeleteCopyAssignmentOperator(CXXMethodDecl *MD) {
bool Union = RD->isUnion();
- bool ConstArg =
- MD->getParamDecl(0)->getType()->getPointeeType().isConstQualified();
+ unsigned ArgQuals =
+ MD->getParamDecl(0)->getType()->getPointeeType().isConstQualified() ?
+ Qualifiers::Const : 0;
// We do this because we should never actually use an anonymous
// union's constructor.
if (Union && RD->isAnonymousStructOrUnion())
return false;
- DeclarationName OperatorName =
- Context.DeclarationNames.getCXXOperatorName(OO_Equal);
- LookupResult R(*this, OperatorName, Loc, LookupOrdinaryName);
- R.suppressDiagnostics();
-
// FIXME: We should put some diagnostic logic right into this function.
// C++0x [class.copy]/11
@@ -3786,37 +3761,11 @@ bool Sema::ShouldDeleteCopyAssignmentOperator(CXXMethodDecl *MD) {
// resolution, as applied to B's [copy] assignment operator, results in
// an ambiguity or a function that is deleted or inaccessible from the
// assignment operator
-
- LookupQualifiedName(R, BaseDecl, false);
-
- // Filter out any result that isn't a copy-assignment operator.
- LookupResult::Filter F = R.makeFilter();
- while (F.hasNext()) {
- NamedDecl *D = F.next();
- if (CXXMethodDecl *Method = dyn_cast<CXXMethodDecl>(D))
- if (Method->isCopyAssignmentOperator())
- continue;
-
- F.erase();
- }
- F.done();
-
- // Build a fake argument expression
- QualType ArgType = BaseType;
- QualType ThisType = BaseType;
- if (ConstArg)
- ArgType.addConst();
- Expr *Args[] = { new (Context) OpaqueValueExpr(Loc, ThisType, VK_LValue)
- , new (Context) OpaqueValueExpr(Loc, ArgType, VK_LValue)
- };
-
- OverloadCandidateSet OCS((Loc));
- OverloadCandidateSet::iterator Best;
-
- AddFunctionCandidates(R.asUnresolvedSet(), Args, 2, OCS);
-
- if (OCS.BestViableFunction(*this, Loc, Best, false) !=
- OR_Success)
+ CXXMethodDecl *CopyOper = LookupCopyingAssignment(BaseDecl, ArgQuals, false,
+ 0);
+ if (!CopyOper || CopyOper->isDeleted())
+ return true;
+ if (CheckDirectMemberAccess(Loc, CopyOper, PDiag()) != AR_accessible)
return true;
}
@@ -3831,37 +3780,11 @@ bool Sema::ShouldDeleteCopyAssignmentOperator(CXXMethodDecl *MD) {
// resolution, as applied to B's [copy] assignment operator, results in
// an ambiguity or a function that is deleted or inaccessible from the
// assignment operator
-
- LookupQualifiedName(R, BaseDecl, false);
-
- // Filter out any result that isn't a copy-assignment operator.
- LookupResult::Filter F = R.makeFilter();
- while (F.hasNext()) {
- NamedDecl *D = F.next();
- if (CXXMethodDecl *Method = dyn_cast<CXXMethodDecl>(D))
- if (Method->isCopyAssignmentOperator())
- continue;
-
- F.erase();
- }
- F.done();
-
- // Build a fake argument expression
- QualType ArgType = BaseType;
- QualType ThisType = BaseType;
- if (ConstArg)
- ArgType.addConst();
- Expr *Args[] = { new (Context) OpaqueValueExpr(Loc, ThisType, VK_LValue)
- , new (Context) OpaqueValueExpr(Loc, ArgType, VK_LValue)
- };
-
- OverloadCandidateSet OCS((Loc));
- OverloadCandidateSet::iterator Best;
-
- AddFunctionCandidates(R.asUnresolvedSet(), Args, 2, OCS);
-
- if (OCS.BestViableFunction(*this, Loc, Best, false) !=
- OR_Success)
+ CXXMethodDecl *CopyOper = LookupCopyingAssignment(BaseDecl, ArgQuals, false,
+ 0);
+ if (!CopyOper || CopyOper->isDeleted())
+ return true;
+ if (CheckDirectMemberAccess(Loc, CopyOper, PDiag()) != AR_accessible)
return true;
}
@@ -3908,37 +3831,12 @@ bool Sema::ShouldDeleteCopyAssignmentOperator(CXXMethodDecl *MD) {
return true;
}
- LookupQualifiedName(R, FieldRecord, false);
-
- // Filter out any result that isn't a copy-assignment operator.
- LookupResult::Filter F = R.makeFilter();
- while (F.hasNext()) {
- NamedDecl *D = F.next();
- if (CXXMethodDecl *Method = dyn_cast<CXXMethodDecl>(D))
- if (Method->isCopyAssignmentOperator())
- continue;
-
- F.erase();
- }
- F.done();
-
- // Build a fake argument expression
- QualType ArgType = FieldType;
- QualType ThisType = FieldType;
- if (ConstArg)
- ArgType.addConst();
- Expr *Args[] = { new (Context) OpaqueValueExpr(Loc, ThisType, VK_LValue)
- , new (Context) OpaqueValueExpr(Loc, ArgType, VK_LValue)
- };
-
- OverloadCandidateSet OCS((Loc));
- OverloadCandidateSet::iterator Best;
-
- AddFunctionCandidates(R.asUnresolvedSet(), Args, 2, OCS);
-
- if (OCS.BestViableFunction(*this, Loc, Best, false) !=
- OR_Success)
- return true;
+ CXXMethodDecl *CopyOper = LookupCopyingAssignment(FieldRecord, ArgQuals,
+ false, 0);
+ if (!CopyOper || CopyOper->isDeleted())
+ return false;
+ if (CheckDirectMemberAccess(Loc, CopyOper, PDiag()) != AR_accessible)
+ return false;
}
}
@@ -3948,7 +3846,7 @@ bool Sema::ShouldDeleteCopyAssignmentOperator(CXXMethodDecl *MD) {
bool Sema::ShouldDeleteDestructor(CXXDestructorDecl *DD) {
CXXRecordDecl *RD = DD->getParent();
assert(!RD->isDependentType() && "do deletion after instantiation");
- if (!LangOpts.CPlusPlus0x)
+ if (!LangOpts.CPlusPlus0x || RD->isInvalidDecl())
return false;
SourceLocation Loc = DD->getLocation();
@@ -4806,6 +4704,13 @@ Decl *Sema::ActOnStartNamespaceDef(Scope *NamespcScope,
// Make our StdNamespace cache point at the first real definition of the
// "std" namespace.
StdNamespace = Namespc;
+
+ // Add this instance of "std" to the set of known namespaces
+ KnownNamespaces[Namespc] = false;
+ } else if (!Namespc->isInline()) {
+ // Since this is an "original" namespace, add it to the known set of
+ // namespaces if it is not an inline namespace.
+ KnownNamespaces[Namespc] = false;
}
PushOnScopeChains(Namespc, DeclRegionScope);
@@ -4941,6 +4846,39 @@ static bool IsUsingDirectiveInToplevelContext(DeclContext *CurContext) {
}
}
+static bool TryNamespaceTypoCorrection(Sema &S, LookupResult &R, Scope *Sc,
+ CXXScopeSpec &SS,
+ SourceLocation IdentLoc,
+ IdentifierInfo *Ident) {
+ R.clear();
+ if (TypoCorrection Corrected = S.CorrectTypo(R.getLookupNameInfo(),
+ R.getLookupKind(), Sc, &SS, NULL,
+ false, S.CTC_NoKeywords, NULL)) {
+ if (Corrected.getCorrectionDeclAs<NamespaceDecl>() ||
+ Corrected.getCorrectionDeclAs<NamespaceAliasDecl>()) {
+ std::string CorrectedStr(Corrected.getAsString(S.getLangOptions()));
+ std::string CorrectedQuotedStr(Corrected.getQuoted(S.getLangOptions()));
+ if (DeclContext *DC = S.computeDeclContext(SS, false))
+ S.Diag(IdentLoc, diag::err_using_directive_member_suggest)
+ << Ident << DC << CorrectedQuotedStr << SS.getRange()
+ << FixItHint::CreateReplacement(IdentLoc, CorrectedStr);
+ else
+ S.Diag(IdentLoc, diag::err_using_directive_suggest)
+ << Ident << CorrectedQuotedStr
+ << FixItHint::CreateReplacement(IdentLoc, CorrectedStr);
+
+ S.Diag(Corrected.getCorrectionDecl()->getLocation(),
+ diag::note_namespace_defined_here) << CorrectedQuotedStr;
+
+ Ident = Corrected.getCorrectionAsIdentifierInfo();
+ R.addDecl(Corrected.getCorrectionDecl());
+ return true;
+ }
+ R.setLookupName(Ident);
+ }
+ return false;
+}
+
Decl *Sema::ActOnUsingDirective(Scope *S,
SourceLocation UsingLoc,
SourceLocation NamespcLoc,
@@ -4969,6 +4907,7 @@ Decl *Sema::ActOnUsingDirective(Scope *S,
return 0;
if (R.empty()) {
+ R.clear();
// Allow "using namespace std;" or "using namespace ::std;" even if
// "std" hasn't been defined yet, for GCC compatibility.
if ((!Qualifier || Qualifier->getKind() == NestedNameSpecifier::Global) &&
@@ -4978,27 +4917,7 @@ Decl *Sema::ActOnUsingDirective(Scope *S,
R.resolveKind();
}
// Otherwise, attempt typo correction.
- else if (DeclarationName Corrected = CorrectTypo(R, S, &SS, 0, false,
- CTC_NoKeywords, 0)) {
- if (R.getAsSingle<NamespaceDecl>() ||
- R.getAsSingle<NamespaceAliasDecl>()) {
- if (DeclContext *DC = computeDeclContext(SS, false))
- Diag(IdentLoc, diag::err_using_directive_member_suggest)
- << NamespcName << DC << Corrected << SS.getRange()
- << FixItHint::CreateReplacement(IdentLoc, Corrected.getAsString());
- else
- Diag(IdentLoc, diag::err_using_directive_suggest)
- << NamespcName << Corrected
- << FixItHint::CreateReplacement(IdentLoc, Corrected.getAsString());
- Diag(R.getFoundDecl()->getLocation(), diag::note_namespace_defined_here)
- << Corrected;
-
- NamespcName = Corrected.getAsIdentifierInfo();
- } else {
- R.clear();
- R.setLookupName(NamespcName);
- }
- }
+ else TryNamespaceTypoCorrection(*this, R, S, SS, IdentLoc, NamespcName);
}
if (!R.empty()) {
@@ -5065,6 +4984,7 @@ Decl *Sema::ActOnUsingDeclaration(Scope *S,
assert(S->getFlags() & Scope::DeclScope && "Invalid Scope.");
switch (Name.getKind()) {
+ case UnqualifiedId::IK_ImplicitSelfParam:
case UnqualifiedId::IK_Identifier:
case UnqualifiedId::IK_OperatorFunctionId:
case UnqualifiedId::IK_LiteralOperatorId:
@@ -5916,30 +5836,7 @@ Decl *Sema::ActOnNamespaceAliasDef(Scope *S,
return 0;
if (R.empty()) {
- if (DeclarationName Corrected = CorrectTypo(R, S, &SS, 0, false,
- CTC_NoKeywords, 0)) {
- if (R.getAsSingle<NamespaceDecl>() ||
- R.getAsSingle<NamespaceAliasDecl>()) {
- if (DeclContext *DC = computeDeclContext(SS, false))
- Diag(IdentLoc, diag::err_using_directive_member_suggest)
- << Ident << DC << Corrected << SS.getRange()
- << FixItHint::CreateReplacement(IdentLoc, Corrected.getAsString());
- else
- Diag(IdentLoc, diag::err_using_directive_suggest)
- << Ident << Corrected
- << FixItHint::CreateReplacement(IdentLoc, Corrected.getAsString());
-
- Diag(R.getFoundDecl()->getLocation(), diag::note_namespace_defined_here)
- << Corrected;
-
- Ident = Corrected.getAsIdentifierInfo();
- } else {
- R.clear();
- R.setLookupName(Ident);
- }
- }
-
- if (R.empty()) {
+ if (!TryNamespaceTypoCorrection(*this, R, S, SS, IdentLoc, Ident)) {
Diag(NamespaceLoc, diag::err_expected_namespace_name) << SS.getRange();
return 0;
}
@@ -5982,6 +5879,8 @@ Sema::ComputeDefaultedDefaultCtorExceptionSpec(CXXRecordDecl *ClassDecl) {
// An implicitly declared special member function (Clause 12) shall have an
// exception-specification. [...]
ImplicitExceptionSpecification ExceptSpec(Context);
+ if (ClassDecl->isInvalidDecl())
+ return ExceptSpec;
// Direct base-class constructors.
for (CXXRecordDecl::base_class_iterator B = ClassDecl->bases_begin(),
@@ -6355,7 +6254,9 @@ Sema::ComputeDefaultedDtorExceptionSpec(CXXRecordDecl *ClassDecl) {
// An implicitly declared special member function (Clause 12) shall have
// an exception-specification.
ImplicitExceptionSpecification ExceptSpec(Context);
-
+ if (ClassDecl->isInvalidDecl())
+ return ExceptSpec;
+
// Direct base-class destructors.
for (CXXRecordDecl::base_class_iterator B = ClassDecl->bases_begin(),
BEnd = ClassDecl->bases_end();
@@ -6687,61 +6588,12 @@ BuildSingleCopyAssign(Sema &S, SourceLocation Loc, QualType T,
Loc, Copy.take());
}
-/// \brief Determine whether the given class has a copy assignment operator
-/// that accepts a const-qualified argument.
-static bool hasConstCopyAssignment(Sema &S, const CXXRecordDecl *CClass) {
- CXXRecordDecl *Class = const_cast<CXXRecordDecl *>(CClass);
-
- if (!Class->hasDeclaredCopyAssignment())
- S.DeclareImplicitCopyAssignment(Class);
-
- QualType ClassType = S.Context.getCanonicalType(S.Context.getTypeDeclType(Class));
- DeclarationName OpName
- = S.Context.DeclarationNames.getCXXOperatorName(OO_Equal);
-
- DeclContext::lookup_const_iterator Op, OpEnd;
- for (llvm::tie(Op, OpEnd) = Class->lookup(OpName); Op != OpEnd; ++Op) {
- // C++ [class.copy]p9:
- // A user-declared copy assignment operator is a non-static non-template
- // member function of class X with exactly one parameter of type X, X&,
- // const X&, volatile X& or const volatile X&.
- const CXXMethodDecl* Method = dyn_cast<CXXMethodDecl>(*Op);
- if (!Method)
- continue;
-
- if (Method->isStatic())
- continue;
- if (Method->getPrimaryTemplate())
- continue;
- const FunctionProtoType *FnType =
- Method->getType()->getAs<FunctionProtoType>();
- assert(FnType && "Overloaded operator has no prototype.");
- // Don't assert on this; an invalid decl might have been left in the AST.
- if (FnType->getNumArgs() != 1 || FnType->isVariadic())
- continue;
- bool AcceptsConst = true;
- QualType ArgType = FnType->getArgType(0);
- if (const LValueReferenceType *Ref = ArgType->getAs<LValueReferenceType>()){
- ArgType = Ref->getPointeeType();
- // Is it a non-const lvalue reference?
- if (!ArgType.isConstQualified())
- AcceptsConst = false;
- }
- if (!S.Context.hasSameUnqualifiedType(ArgType, ClassType))
- continue;
-
- // We have a single argument of type cv X or cv X&, i.e. we've found the
- // copy assignment operator. Return whether it accepts const arguments.
- return AcceptsConst;
- }
- assert(Class->isInvalidDecl() &&
- "No copy assignment operator declared in valid code.");
- return false;
-}
-
std::pair<Sema::ImplicitExceptionSpecification, bool>
Sema::ComputeDefaultedCopyAssignmentExceptionSpecAndConst(
CXXRecordDecl *ClassDecl) {
+ if (ClassDecl->isInvalidDecl())
+ return std::make_pair(ImplicitExceptionSpecification(Context), false);
+
// C++ [class.copy]p10:
// If the class definition does not explicitly declare a copy
// assignment operator, one is declared implicitly.
@@ -6759,11 +6611,28 @@ Sema::ComputeDefaultedCopyAssignmentExceptionSpecAndConst(
for (CXXRecordDecl::base_class_iterator Base = ClassDecl->bases_begin(),
BaseEnd = ClassDecl->bases_end();
HasConstCopyAssignment && Base != BaseEnd; ++Base) {
+ // We'll handle this below
+ if (LangOpts.CPlusPlus0x && Base->isVirtual())
+ continue;
+
assert(!Base->getType()->isDependentType() &&
"Cannot generate implicit members for class with dependent bases.");
- const CXXRecordDecl *BaseClassDecl
- = cast<CXXRecordDecl>(Base->getType()->getAs<RecordType>()->getDecl());
- HasConstCopyAssignment = hasConstCopyAssignment(*this, BaseClassDecl);
+ CXXRecordDecl *BaseClassDecl = Base->getType()->getAsCXXRecordDecl();
+ LookupCopyingAssignment(BaseClassDecl, Qualifiers::Const, false, 0,
+ &HasConstCopyAssignment);
+ }
+
+ // In C++0x, the above citation has "or virtual added"
+ if (LangOpts.CPlusPlus0x) {
+ for (CXXRecordDecl::base_class_iterator Base = ClassDecl->vbases_begin(),
+ BaseEnd = ClassDecl->vbases_end();
+ HasConstCopyAssignment && Base != BaseEnd; ++Base) {
+ assert(!Base->getType()->isDependentType() &&
+ "Cannot generate implicit members for class with dependent bases.");
+ CXXRecordDecl *BaseClassDecl = Base->getType()->getAsCXXRecordDecl();
+ LookupCopyingAssignment(BaseClassDecl, Qualifiers::Const, false, 0,
+ &HasConstCopyAssignment);
+ }
}
// -- for all the nonstatic data members of X that are of a class
@@ -6775,10 +6644,9 @@ Sema::ComputeDefaultedCopyAssignmentExceptionSpecAndConst(
HasConstCopyAssignment && Field != FieldEnd;
++Field) {
QualType FieldType = Context.getBaseElementType((*Field)->getType());
- if (const RecordType *FieldClassType = FieldType->getAs<RecordType>()) {
- const CXXRecordDecl *FieldClassDecl
- = cast<CXXRecordDecl>(FieldClassType->getDecl());
- HasConstCopyAssignment = hasConstCopyAssignment(*this, FieldClassDecl);
+ if (CXXRecordDecl *FieldClassDecl = FieldType->getAsCXXRecordDecl()) {
+ LookupCopyingAssignment(FieldClassDecl, Qualifiers::Const, false, 0,
+ &HasConstCopyAssignment);
}
}
@@ -6790,36 +6658,48 @@ Sema::ComputeDefaultedCopyAssignmentExceptionSpecAndConst(
// C++ [except.spec]p14:
// An implicitly declared special member function (Clause 12) shall have an
// exception-specification. [...]
+
+ // It is unspecified whether or not an implicit copy assignment operator
+ // attempts to deduplicate calls to assignment operators of virtual bases are
+ // made. As such, this exception specification is effectively unspecified.
+ // Based on a similar decision made for constness in C++0x, we're erring on
+ // the side of assuming such calls to be made regardless of whether they
+ // actually happen.
ImplicitExceptionSpecification ExceptSpec(Context);
+ unsigned ArgQuals = HasConstCopyAssignment ? Qualifiers::Const : 0;
for (CXXRecordDecl::base_class_iterator Base = ClassDecl->bases_begin(),
BaseEnd = ClassDecl->bases_end();
Base != BaseEnd; ++Base) {
+ if (Base->isVirtual())
+ continue;
+
CXXRecordDecl *BaseClassDecl
= cast<CXXRecordDecl>(Base->getType()->getAs<RecordType>()->getDecl());
-
- if (!BaseClassDecl->hasDeclaredCopyAssignment())
- DeclareImplicitCopyAssignment(BaseClassDecl);
+ if (CXXMethodDecl *CopyAssign = LookupCopyingAssignment(BaseClassDecl,
+ ArgQuals, false, 0))
+ ExceptSpec.CalledDecl(CopyAssign);
+ }
- if (CXXMethodDecl *CopyAssign
- = BaseClassDecl->getCopyAssignmentOperator(HasConstCopyAssignment))
+ for (CXXRecordDecl::base_class_iterator Base = ClassDecl->vbases_begin(),
+ BaseEnd = ClassDecl->vbases_end();
+ Base != BaseEnd; ++Base) {
+ CXXRecordDecl *BaseClassDecl
+ = cast<CXXRecordDecl>(Base->getType()->getAs<RecordType>()->getDecl());
+ if (CXXMethodDecl *CopyAssign = LookupCopyingAssignment(BaseClassDecl,
+ ArgQuals, false, 0))
ExceptSpec.CalledDecl(CopyAssign);
}
+
for (CXXRecordDecl::field_iterator Field = ClassDecl->field_begin(),
FieldEnd = ClassDecl->field_end();
Field != FieldEnd;
++Field) {
QualType FieldType = Context.getBaseElementType((*Field)->getType());
- if (const RecordType *FieldClassType = FieldType->getAs<RecordType>()) {
- CXXRecordDecl *FieldClassDecl
- = cast<CXXRecordDecl>(FieldClassType->getDecl());
-
- if (!FieldClassDecl->hasDeclaredCopyAssignment())
- DeclareImplicitCopyAssignment(FieldClassDecl);
-
- if (CXXMethodDecl *CopyAssign
- = FieldClassDecl->getCopyAssignmentOperator(HasConstCopyAssignment))
- ExceptSpec.CalledDecl(CopyAssign);
- }
+ if (CXXRecordDecl *FieldClassDecl = FieldType->getAsCXXRecordDecl()) {
+ if (CXXMethodDecl *CopyAssign =
+ LookupCopyingAssignment(FieldClassDecl, ArgQuals, false, 0))
+ ExceptSpec.CalledDecl(CopyAssign);
+ }
}
return std::make_pair(ExceptSpec, HasConstCopyAssignment);
@@ -6875,7 +6755,13 @@ CXXMethodDecl *Sema::DeclareImplicitCopyAssignment(CXXRecordDecl *ClassDecl) {
PushOnScopeChains(CopyAssignment, S, false);
ClassDecl->addDecl(CopyAssignment);
- if (ShouldDeleteCopyAssignmentOperator(CopyAssignment))
+ // C++0x [class.copy]p18:
+ // ... If the class definition declares a move constructor or move
+ // assignment operator, the implicitly declared copy assignment operator is
+ // defined as deleted; ...
+ if (ClassDecl->hasUserDeclaredMoveConstructor() ||
+ ClassDecl->hasUserDeclaredMoveAssignment() ||
+ ShouldDeleteCopyAssignmentOperator(CopyAssignment))
CopyAssignment->setDeletedAsWritten();
AddOverriddenMethods(ClassDecl, CopyAssignment);
@@ -7014,6 +6900,11 @@ void Sema::DefineImplicitCopyAssignment(SourceLocation CurrentLocation,
Invalid = true;
continue;
}
+
+ // Suppress assigning zero-width bitfields.
+ if (const Expr *Width = Field->getBitWidth())
+ if (Width->EvaluateAsInt(Context) == 0)
+ continue;
QualType FieldType = Field->getType().getNonReferenceType();
if (FieldType->isIncompleteArrayType()) {
@@ -7041,10 +6932,8 @@ void Sema::DefineImplicitCopyAssignment(SourceLocation CurrentLocation,
// explicit assignments, do so. This optimization only applies for arrays
// of scalars and arrays of class type with trivial copy-assignment
// operators.
- if (FieldType->isArrayType() &&
- (!BaseType->isRecordType() ||
- cast<CXXRecordDecl>(BaseType->getAs<RecordType>()->getDecl())
- ->hasTrivialCopyAssignment())) {
+ if (FieldType->isArrayType() &&
+ BaseType.hasTrivialCopyAssignment(Context)) {
// Compute the size of the memory buffer to be copied.
QualType SizeType = Context.getSizeType();
llvm::APInt Size(Context.getTypeSize(SizeType),
@@ -7179,6 +7068,9 @@ void Sema::DefineImplicitCopyAssignment(SourceLocation CurrentLocation,
std::pair<Sema::ImplicitExceptionSpecification, bool>
Sema::ComputeDefaultedCopyCtorExceptionSpecAndConst(CXXRecordDecl *ClassDecl) {
+ if (ClassDecl->isInvalidDecl())
+ return std::make_pair(ImplicitExceptionSpecification(Context), false);
+
// C++ [class.copy]p5:
// The implicitly-declared copy constructor for a class X will
// have the form
@@ -7202,8 +7094,8 @@ Sema::ComputeDefaultedCopyCtorExceptionSpecAndConst(CXXRecordDecl *ClassDecl) {
CXXRecordDecl *BaseClassDecl
= cast<CXXRecordDecl>(Base->getType()->getAs<RecordType>()->getDecl());
- LookupCopyConstructor(BaseClassDecl, Qualifiers::Const,
- &HasConstCopyConstructor);
+ LookupCopyingConstructor(BaseClassDecl, Qualifiers::Const,
+ &HasConstCopyConstructor);
}
for (CXXRecordDecl::base_class_iterator Base = ClassDecl->vbases_begin(),
@@ -7212,8 +7104,8 @@ Sema::ComputeDefaultedCopyCtorExceptionSpecAndConst(CXXRecordDecl *ClassDecl) {
++Base) {
CXXRecordDecl *BaseClassDecl
= cast<CXXRecordDecl>(Base->getType()->getAs<RecordType>()->getDecl());
- LookupCopyConstructor(BaseClassDecl, Qualifiers::Const,
- &HasConstCopyConstructor);
+ LookupCopyingConstructor(BaseClassDecl, Qualifiers::Const,
+ &HasConstCopyConstructor);
}
// -- for all the nonstatic data members of X that are of a
@@ -7226,8 +7118,8 @@ Sema::ComputeDefaultedCopyCtorExceptionSpecAndConst(CXXRecordDecl *ClassDecl) {
++Field) {
QualType FieldType = Context.getBaseElementType((*Field)->getType());
if (CXXRecordDecl *FieldClassDecl = FieldType->getAsCXXRecordDecl()) {
- LookupCopyConstructor(FieldClassDecl, Qualifiers::Const,
- &HasConstCopyConstructor);
+ LookupCopyingConstructor(FieldClassDecl, Qualifiers::Const,
+ &HasConstCopyConstructor);
}
}
// Otherwise, the implicitly declared copy constructor will have
@@ -7251,7 +7143,7 @@ Sema::ComputeDefaultedCopyCtorExceptionSpecAndConst(CXXRecordDecl *ClassDecl) {
CXXRecordDecl *BaseClassDecl
= cast<CXXRecordDecl>(Base->getType()->getAs<RecordType>()->getDecl());
if (CXXConstructorDecl *CopyConstructor =
- LookupCopyConstructor(BaseClassDecl, Quals))
+ LookupCopyingConstructor(BaseClassDecl, Quals))
ExceptSpec.CalledDecl(CopyConstructor);
}
for (CXXRecordDecl::base_class_iterator Base = ClassDecl->vbases_begin(),
@@ -7261,7 +7153,7 @@ Sema::ComputeDefaultedCopyCtorExceptionSpecAndConst(CXXRecordDecl *ClassDecl) {
CXXRecordDecl *BaseClassDecl
= cast<CXXRecordDecl>(Base->getType()->getAs<RecordType>()->getDecl());
if (CXXConstructorDecl *CopyConstructor =
- LookupCopyConstructor(BaseClassDecl, Quals))
+ LookupCopyingConstructor(BaseClassDecl, Quals))
ExceptSpec.CalledDecl(CopyConstructor);
}
for (CXXRecordDecl::field_iterator Field = ClassDecl->field_begin(),
@@ -7271,7 +7163,7 @@ Sema::ComputeDefaultedCopyCtorExceptionSpecAndConst(CXXRecordDecl *ClassDecl) {
QualType FieldType = Context.getBaseElementType((*Field)->getType());
if (CXXRecordDecl *FieldClassDecl = FieldType->getAsCXXRecordDecl()) {
if (CXXConstructorDecl *CopyConstructor =
- LookupCopyConstructor(FieldClassDecl, Quals))
+ LookupCopyingConstructor(FieldClassDecl, Quals))
ExceptSpec.CalledDecl(CopyConstructor);
}
}
@@ -7334,7 +7226,13 @@ CXXConstructorDecl *Sema::DeclareImplicitCopyConstructor(
PushOnScopeChains(CopyConstructor, S, false);
ClassDecl->addDecl(CopyConstructor);
- if (ShouldDeleteCopyConstructor(CopyConstructor))
+ // C++0x [class.copy]p7:
+ // ... If the class definition declares a move constructor or move
+ // assignment operator, the implicitly declared constructor is defined as
+ // deleted; ...
+ if (ClassDecl->hasUserDeclaredMoveConstructor() ||
+ ClassDecl->hasUserDeclaredMoveAssignment() ||
+ ShouldDeleteCopyConstructor(CopyConstructor))
CopyConstructor->setDeletedAsWritten();
return CopyConstructor;
@@ -7523,6 +7421,10 @@ void Sema::AddCXXDirectInitializerToDecl(Decl *RealDecl,
VDecl->setTypeSourceInfo(DeducedType);
VDecl->setType(DeducedType->getType());
+ // In ARC, infer lifetime.
+ if (getLangOptions().ObjCAutoRefCount && inferObjCARCLifetime(VDecl))
+ VDecl->setInvalidDecl();
+
// If this is a redeclaration, check that the type we just deduced matches
// the previously declared type.
if (VarDecl *Old = VDecl->getPreviousDeclaration())
@@ -7605,9 +7507,9 @@ void Sema::AddCXXDirectInitializerToDecl(Decl *RealDecl,
// Store the initialization expressions as a ParenListExpr.
unsigned NumExprs = Exprs.size();
- VDecl->setInit(new (Context) ParenListExpr(Context, LParenLoc,
- (Expr **)Exprs.release(),
- NumExprs, RParenLoc));
+ VDecl->setInit(new (Context) ParenListExpr(
+ Context, LParenLoc, (Expr **)Exprs.release(), NumExprs, RParenLoc,
+ VDecl->getType().getNonReferenceType()));
return;
}
@@ -8143,10 +8045,8 @@ VarDecl *Sema::BuildExceptionDeclaration(Scope *S,
Diag(Loc, diag::err_objc_object_catch);
Invalid = true;
} else if (T->isObjCObjectPointerType()) {
- if (!getLangOptions().ObjCNonFragileABI) {
- Diag(Loc, diag::err_objc_pointer_cxx_catch_fragile);
- Invalid = true;
- }
+ if (!getLangOptions().ObjCNonFragileABI)
+ Diag(Loc, diag::warn_objc_pointer_cxx_catch_fragile);
}
}
@@ -8154,7 +8054,7 @@ VarDecl *Sema::BuildExceptionDeclaration(Scope *S,
ExDeclType, TInfo, SC_None, SC_None);
ExDecl->setExceptionVariable(true);
- if (!Invalid) {
+ if (!Invalid && !ExDeclType->isDependentType()) {
if (const RecordType *recordType = ExDeclType->getAs<RecordType>()) {
// C++ [except.handle]p16:
// The object declared in an exception-declaration or, if the
@@ -9020,25 +8920,16 @@ DeclResult Sema::ActOnCXXConditionDeclaration(Scope *S, Declarator &D) {
// new class or enumeration.
assert(D.getDeclSpec().getStorageClassSpec() != DeclSpec::SCS_typedef &&
"Parser allowed 'typedef' as storage class of condition decl.");
-
- TagDecl *OwnedTag = 0;
- TypeSourceInfo *TInfo = GetTypeForDeclarator(D, S, &OwnedTag);
- QualType Ty = TInfo->getType();
-
- if (Ty->isFunctionType()) { // The declarator shall not specify a function...
- // We exit without creating a CXXConditionDeclExpr because a FunctionDecl
- // would be created and CXXConditionDeclExpr wants a VarDecl.
- Diag(D.getIdentifierLoc(), diag::err_invalid_use_of_function_type)
- << D.getSourceRange();
- return DeclResult();
- } else if (OwnedTag && OwnedTag->isDefinition()) {
- // The type-specifier-seq shall not declare a new class or enumeration.
- Diag(OwnedTag->getLocation(), diag::err_type_defined_in_condition);
- }
-
+
Decl *Dcl = ActOnDeclarator(S, D);
if (!Dcl)
- return DeclResult();
+ return true;
+
+ if (isa<FunctionDecl>(Dcl)) { // The declarator shall not specify a function.
+ Diag(Dcl->getLocation(), diag::err_invalid_use_of_function_type)
+ << D.getSourceRange();
+ return true;
+ }
return Dcl;
}
diff --git a/contrib/llvm/tools/clang/lib/Sema/SemaDeclObjC.cpp b/contrib/llvm/tools/clang/lib/Sema/SemaDeclObjC.cpp
index de9097e..aa8152b 100644
--- a/contrib/llvm/tools/clang/lib/Sema/SemaDeclObjC.cpp
+++ b/contrib/llvm/tools/clang/lib/Sema/SemaDeclObjC.cpp
@@ -16,14 +16,96 @@
#include "clang/Sema/ExternalSemaSource.h"
#include "clang/Sema/Scope.h"
#include "clang/Sema/ScopeInfo.h"
+#include "clang/AST/ASTConsumer.h"
#include "clang/AST/Expr.h"
+#include "clang/AST/ExprObjC.h"
#include "clang/AST/ASTContext.h"
#include "clang/AST/DeclObjC.h"
+#include "clang/Basic/SourceManager.h"
#include "clang/Sema/DeclSpec.h"
#include "llvm/ADT/DenseSet.h"
using namespace clang;
+/// Check whether the given method, which must be in the 'init'
+/// family, is a valid member of that family.
+///
+/// \param receiverTypeIfCall - if null, check this as if declaring it;
+/// if non-null, check this as if making a call to it with the given
+/// receiver type
+///
+/// \return true to indicate that there was an error and appropriate
+/// actions were taken
+bool Sema::checkInitMethod(ObjCMethodDecl *method,
+ QualType receiverTypeIfCall) {
+ if (method->isInvalidDecl()) return true;
+
+ // This castAs is safe: methods that don't return an object
+ // pointer won't be inferred as inits and will reject an explicit
+ // objc_method_family(init).
+
+ // We ignore protocols here. Should we? What about Class?
+
+ const ObjCObjectType *result = method->getResultType()
+ ->castAs<ObjCObjectPointerType>()->getObjectType();
+
+ if (result->isObjCId()) {
+ return false;
+ } else if (result->isObjCClass()) {
+ // fall through: always an error
+ } else {
+ ObjCInterfaceDecl *resultClass = result->getInterface();
+ assert(resultClass && "unexpected object type!");
+
+ // It's okay for the result type to still be a forward declaration
+ // if we're checking an interface declaration.
+ if (resultClass->isForwardDecl()) {
+ if (receiverTypeIfCall.isNull() &&
+ !isa<ObjCImplementationDecl>(method->getDeclContext()))
+ return false;
+
+ // Otherwise, we try to compare class types.
+ } else {
+ // If this method was declared in a protocol, we can't check
+ // anything unless we have a receiver type that's an interface.
+ const ObjCInterfaceDecl *receiverClass = 0;
+ if (isa<ObjCProtocolDecl>(method->getDeclContext())) {
+ if (receiverTypeIfCall.isNull())
+ return false;
+
+ receiverClass = receiverTypeIfCall->castAs<ObjCObjectPointerType>()
+ ->getInterfaceDecl();
+
+ // This can be null for calls to e.g. id<Foo>.
+ if (!receiverClass) return false;
+ } else {
+ receiverClass = method->getClassInterface();
+ assert(receiverClass && "method not associated with a class!");
+ }
+
+ // If either class is a subclass of the other, it's fine.
+ if (receiverClass->isSuperClassOf(resultClass) ||
+ resultClass->isSuperClassOf(receiverClass))
+ return false;
+ }
+ }
+
+ SourceLocation loc = method->getLocation();
+
+ // If we're in a system header, and this is not a call, just make
+ // the method unusable.
+ if (receiverTypeIfCall.isNull() && getSourceManager().isInSystemHeader(loc)) {
+ method->addAttr(new (Context) UnavailableAttr(loc, Context,
+ "init method returns a type unrelated to its receiver type"));
+ return true;
+ }
+
+ // Otherwise, it's an error.
+ Diag(loc, diag::err_arc_init_method_unrelated_result_type);
+ method->setInvalidDecl();
+ return true;
+}
+
bool Sema::CheckObjCMethodOverride(ObjCMethodDecl *NewMethod,
const ObjCMethodDecl *Overridden,
bool IsImplementation) {
@@ -36,7 +118,7 @@ bool Sema::CheckObjCMethodOverride(ObjCMethodDecl *NewMethod,
QualType ResultType = NewMethod->getResultType();
SourceRange ResultTypeRange;
if (const TypeSourceInfo *ResultTypeInfo
- = NewMethod->getResultTypeSourceInfo())
+ = NewMethod->getResultTypeSourceInfo())
ResultTypeRange = ResultTypeInfo->getTypeLoc().getSourceRange();
// Figure out which class this method is part of, if any.
@@ -73,7 +155,15 @@ bool Sema::CheckObjCMethodOverride(ObjCMethodDecl *NewMethod,
return false;
}
-
+/// \brief Check for consistency between a given method declaration and the
+/// methods it overrides within the class hierarchy.
+///
+/// This method walks the inheritance hierarchy starting at the given
+/// declaration context (\p DC), invoking Sema::CheckObjCMethodOverride() with
+/// the given new method (\p NewMethod) and any method it directly overrides
+/// in the hierarchy. Sema::CheckObjCMethodOverride() is responsible for
+/// checking consistency, e.g., among return types for methods that return a
+/// related result type.
static bool CheckObjCMethodOverrides(Sema &S, ObjCMethodDecl *NewMethod,
DeclContext *DC,
bool SkipCurrent = true) {
@@ -99,10 +189,10 @@ static bool CheckObjCMethodOverrides(Sema &S, ObjCMethodDecl *NewMethod,
if (CheckObjCMethodOverrides(S, NewMethod, Category, false))
return true;
}
-
+
// Look through protocols.
for (ObjCList<ObjCProtocolDecl>::iterator I = Class->protocol_begin(),
- IEnd = Class->protocol_end();
+ IEnd = Class->protocol_end();
I != IEnd; ++I)
if (CheckObjCMethodOverrides(S, NewMethod, *I, false))
return true;
@@ -115,7 +205,7 @@ static bool CheckObjCMethodOverrides(Sema &S, ObjCMethodDecl *NewMethod,
if (ObjCCategoryDecl *Category = dyn_cast<ObjCCategoryDecl>(DC)) {
// Look through protocols.
for (ObjCList<ObjCProtocolDecl>::iterator I = Category->protocol_begin(),
- IEnd = Category->protocol_end();
+ IEnd = Category->protocol_end();
I != IEnd; ++I)
if (CheckObjCMethodOverrides(S, NewMethod, *I, false))
return true;
@@ -126,7 +216,7 @@ static bool CheckObjCMethodOverrides(Sema &S, ObjCMethodDecl *NewMethod,
if (ObjCProtocolDecl *Protocol = dyn_cast<ObjCProtocolDecl>(DC)) {
// Look through protocols.
for (ObjCList<ObjCProtocolDecl>::iterator I = Protocol->protocol_begin(),
- IEnd = Protocol->protocol_end();
+ IEnd = Protocol->protocol_end();
I != IEnd; ++I)
if (CheckObjCMethodOverrides(S, NewMethod, *I, false))
return true;
@@ -141,13 +231,13 @@ bool Sema::CheckObjCMethodOverrides(ObjCMethodDecl *NewMethod,
DeclContext *DC) {
if (ObjCInterfaceDecl *Class = dyn_cast<ObjCInterfaceDecl>(DC))
return ::CheckObjCMethodOverrides(*this, NewMethod, Class);
-
+
if (ObjCCategoryDecl *Category = dyn_cast<ObjCCategoryDecl>(DC))
return ::CheckObjCMethodOverrides(*this, NewMethod, Category);
-
+
if (ObjCProtocolDecl *Protocol = dyn_cast<ObjCProtocolDecl>(DC))
return ::CheckObjCMethodOverrides(*this, NewMethod, Protocol);
-
+
if (ObjCImplementationDecl *Impl = dyn_cast<ObjCImplementationDecl>(DC))
return ::CheckObjCMethodOverrides(*this, NewMethod,
Impl->getClassInterface());
@@ -159,6 +249,55 @@ bool Sema::CheckObjCMethodOverrides(ObjCMethodDecl *NewMethod,
return ::CheckObjCMethodOverrides(*this, NewMethod, CurContext);
}
+/// \brief Check a method declaration for compatibility with the Objective-C
+/// ARC conventions.
+static bool CheckARCMethodDecl(Sema &S, ObjCMethodDecl *method) {
+ ObjCMethodFamily family = method->getMethodFamily();
+ switch (family) {
+ case OMF_None:
+ case OMF_dealloc:
+ case OMF_retain:
+ case OMF_release:
+ case OMF_autorelease:
+ case OMF_retainCount:
+ case OMF_self:
+ return false;
+
+ case OMF_init:
+ // If the method doesn't obey the init rules, don't bother annotating it.
+ if (S.checkInitMethod(method, QualType()))
+ return true;
+
+ method->addAttr(new (S.Context) NSConsumesSelfAttr(SourceLocation(),
+ S.Context));
+
+ // Don't add a second copy of this attribute, but otherwise don't
+ // let it be suppressed.
+ if (method->hasAttr<NSReturnsRetainedAttr>())
+ return false;
+ break;
+
+ case OMF_alloc:
+ case OMF_copy:
+ case OMF_mutableCopy:
+ case OMF_new:
+ if (method->hasAttr<NSReturnsRetainedAttr>() ||
+ method->hasAttr<NSReturnsNotRetainedAttr>() ||
+ method->hasAttr<NSReturnsAutoreleasedAttr>())
+ return false;
+ break;
+
+ case OMF_performSelector:
+ // we don't annotate performSelector's
+ return true;
+
+ }
+
+ method->addAttr(new (S.Context) NSReturnsRetainedAttr(SourceLocation(),
+ S.Context));
+ return false;
+}
+
static void DiagnoseObjCImplementedDeprecations(Sema &S,
NamedDecl *ND,
SourceLocation ImplLoc,
@@ -212,6 +351,31 @@ void Sema::ActOnStartOfObjCMethodDef(Scope *FnBodyScope, Decl *D) {
if ((*PI)->getIdentifier())
PushOnScopeChains(*PI, FnBodyScope);
}
+
+ // In ARC, disallow definition of retain/release/autorelease/retainCount
+ if (getLangOptions().ObjCAutoRefCount) {
+ switch (MDecl->getMethodFamily()) {
+ case OMF_retain:
+ case OMF_retainCount:
+ case OMF_release:
+ case OMF_autorelease:
+ Diag(MDecl->getLocation(), diag::err_arc_illegal_method_def)
+ << MDecl->getSelector();
+ break;
+
+ case OMF_None:
+ case OMF_dealloc:
+ case OMF_alloc:
+ case OMF_init:
+ case OMF_mutableCopy:
+ case OMF_copy:
+ case OMF_new:
+ case OMF_self:
+ case OMF_performSelector:
+ break;
+ }
+ }
+
// Warn on implementating deprecated methods under
// -Wdeprecated-implementations flag.
if (ObjCInterfaceDecl *IC = MDecl->getClassInterface())
@@ -284,9 +448,10 @@ ActOnStartClassInterface(SourceLocation AtInterfaceLoc,
if (!PrevDecl) {
// Try to correct for a typo in the superclass name.
- LookupResult R(*this, SuperName, SuperLoc, LookupOrdinaryName);
- if (CorrectTypo(R, TUScope, 0, 0, false, CTC_NoKeywords) &&
- (PrevDecl = R.getAsSingle<ObjCInterfaceDecl>())) {
+ TypoCorrection Corrected = CorrectTypo(
+ DeclarationNameInfo(SuperName, SuperLoc), LookupOrdinaryName, TUScope,
+ NULL, NULL, false, CTC_NoKeywords);
+ if ((PrevDecl = Corrected.getCorrectionDeclAs<ObjCInterfaceDecl>())) {
Diag(SuperLoc, diag::err_undef_superclass_suggest)
<< SuperName << ClassName << PrevDecl->getDeclName();
Diag(PrevDecl->getLocation(), diag::note_previous_decl)
@@ -333,10 +498,13 @@ ActOnStartClassInterface(SourceLocation AtInterfaceLoc,
if (!SuperClassDecl)
Diag(SuperLoc, diag::err_undef_superclass)
<< SuperName << ClassName << SourceRange(AtInterfaceLoc, ClassLoc);
- else if (SuperClassDecl->isForwardDecl())
- Diag(SuperLoc, diag::err_undef_superclass)
+ else if (SuperClassDecl->isForwardDecl()) {
+ Diag(SuperLoc, diag::err_forward_superclass)
<< SuperClassDecl->getDeclName() << ClassName
<< SourceRange(AtInterfaceLoc, ClassLoc);
+ Diag(SuperClassDecl->getLocation(), diag::note_forward_class);
+ SuperClassDecl = 0;
+ }
}
IDecl->setSuperClass(SuperClassDecl);
IDecl->setSuperClassLoc(SuperLoc);
@@ -494,12 +662,12 @@ Sema::FindProtocolDeclaration(bool WarnOnDeclarations,
ObjCProtocolDecl *PDecl = LookupProtocol(ProtocolId[i].first,
ProtocolId[i].second);
if (!PDecl) {
- LookupResult R(*this, ProtocolId[i].first, ProtocolId[i].second,
- LookupObjCProtocolName);
- if (CorrectTypo(R, TUScope, 0, 0, false, CTC_NoKeywords) &&
- (PDecl = R.getAsSingle<ObjCProtocolDecl>())) {
+ TypoCorrection Corrected = CorrectTypo(
+ DeclarationNameInfo(ProtocolId[i].first, ProtocolId[i].second),
+ LookupObjCProtocolName, TUScope, NULL, NULL, false, CTC_NoKeywords);
+ if ((PDecl = Corrected.getCorrectionDeclAs<ObjCProtocolDecl>())) {
Diag(ProtocolId[i].second, diag::err_undeclared_protocol_suggest)
- << ProtocolId[i].first << R.getLookupName();
+ << ProtocolId[i].first << Corrected.getCorrection();
Diag(PDecl->getLocation(), diag::note_previous_decl)
<< PDecl->getDeclName();
}
@@ -736,20 +904,20 @@ Decl *Sema::ActOnStartClassImplementation(
} else {
// We did not find anything with the name ClassName; try to correct for
// typos in the class name.
- LookupResult R(*this, ClassName, ClassLoc, LookupOrdinaryName);
- if (CorrectTypo(R, TUScope, 0, 0, false, CTC_NoKeywords) &&
- (IDecl = R.getAsSingle<ObjCInterfaceDecl>())) {
+ TypoCorrection Corrected = CorrectTypo(
+ DeclarationNameInfo(ClassName, ClassLoc), LookupOrdinaryName, TUScope,
+ NULL, NULL, false, CTC_NoKeywords);
+ if ((IDecl = Corrected.getCorrectionDeclAs<ObjCInterfaceDecl>())) {
// Suggest the (potentially) correct interface name. However, put the
// fix-it hint itself in a separate note, since changing the name in
// the warning would make the fix-it change semantics.However, don't
// provide a code-modification hint or use the typo name for recovery,
// because this is just a warning. The program may actually be correct.
+ DeclarationName CorrectedName = Corrected.getCorrection();
Diag(ClassLoc, diag::warn_undef_interface_suggest)
- << ClassName << R.getLookupName();
- Diag(IDecl->getLocation(), diag::note_previous_decl)
- << R.getLookupName()
- << FixItHint::CreateReplacement(ClassLoc,
- R.getLookupName().getAsString());
+ << ClassName << CorrectedName;
+ Diag(IDecl->getLocation(), diag::note_previous_decl) << CorrectedName
+ << FixItHint::CreateReplacement(ClassLoc, CorrectedName.getAsString());
IDecl = 0;
} else {
Diag(ClassLoc, diag::warn_undef_interface) << ClassName;
@@ -915,6 +1083,9 @@ void Sema::CheckImplementationIvars(ObjCImplementationDecl *ImpDecl,
void Sema::WarnUndefinedMethod(SourceLocation ImpLoc, ObjCMethodDecl *method,
bool &IncompleteImpl, unsigned DiagID) {
+ // No point warning no definition of method which is 'unavailable'.
+ if (method->hasAttr<UnavailableAttr>())
+ return;
if (!IncompleteImpl) {
Diag(ImpLoc, diag::warn_incomplete_impl);
IncompleteImpl = true;
@@ -1091,11 +1262,84 @@ static void CheckMethodOverrideParam(Sema &S,
S.Diag(IfaceVar->getLocation(), diag::note_previous_definition)
<< getTypeRange(IfaceVar->getTypeSourceInfo());
}
-
+
+/// In ARC, check whether the conventional meanings of the two methods
+/// match. If they don't, it's a hard error.
+static bool checkMethodFamilyMismatch(Sema &S, ObjCMethodDecl *impl,
+ ObjCMethodDecl *decl) {
+ ObjCMethodFamily implFamily = impl->getMethodFamily();
+ ObjCMethodFamily declFamily = decl->getMethodFamily();
+ if (implFamily == declFamily) return false;
+
+ // Since conventions are sorted by selector, the only possibility is
+ // that the types differ enough to cause one selector or the other
+ // to fall out of the family.
+ assert(implFamily == OMF_None || declFamily == OMF_None);
+
+ // No further diagnostics required on invalid declarations.
+ if (impl->isInvalidDecl() || decl->isInvalidDecl()) return true;
+
+ const ObjCMethodDecl *unmatched = impl;
+ ObjCMethodFamily family = declFamily;
+ unsigned errorID = diag::err_arc_lost_method_convention;
+ unsigned noteID = diag::note_arc_lost_method_convention;
+ if (declFamily == OMF_None) {
+ unmatched = decl;
+ family = implFamily;
+ errorID = diag::err_arc_gained_method_convention;
+ noteID = diag::note_arc_gained_method_convention;
+ }
+
+ // Indexes into a %select clause in the diagnostic.
+ enum FamilySelector {
+ F_alloc, F_copy, F_mutableCopy = F_copy, F_init, F_new
+ };
+ FamilySelector familySelector = FamilySelector();
+
+ switch (family) {
+ case OMF_None: llvm_unreachable("logic error, no method convention");
+ case OMF_retain:
+ case OMF_release:
+ case OMF_autorelease:
+ case OMF_dealloc:
+ case OMF_retainCount:
+ case OMF_self:
+ case OMF_performSelector:
+ // Mismatches for these methods don't change ownership
+ // conventions, so we don't care.
+ return false;
+
+ case OMF_init: familySelector = F_init; break;
+ case OMF_alloc: familySelector = F_alloc; break;
+ case OMF_copy: familySelector = F_copy; break;
+ case OMF_mutableCopy: familySelector = F_mutableCopy; break;
+ case OMF_new: familySelector = F_new; break;
+ }
+
+ enum ReasonSelector { R_NonObjectReturn, R_UnrelatedReturn };
+ ReasonSelector reasonSelector;
+
+ // The only reason these methods don't fall within their families is
+ // due to unusual result types.
+ if (unmatched->getResultType()->isObjCObjectPointerType()) {
+ reasonSelector = R_UnrelatedReturn;
+ } else {
+ reasonSelector = R_NonObjectReturn;
+ }
+
+ S.Diag(impl->getLocation(), errorID) << familySelector << reasonSelector;
+ S.Diag(decl->getLocation(), noteID) << familySelector << reasonSelector;
+
+ return true;
+}
void Sema::WarnConflictingTypedMethods(ObjCMethodDecl *ImpMethodDecl,
ObjCMethodDecl *MethodDecl,
bool IsProtocolMethodDecl) {
+ if (getLangOptions().ObjCAutoRefCount &&
+ checkMethodFamilyMismatch(*this, ImpMethodDecl, MethodDecl))
+ return;
+
CheckMethodOverrideReturn(*this, ImpMethodDecl, MethodDecl,
IsProtocolMethodDecl);
@@ -1204,7 +1448,7 @@ void Sema::CheckProtocolMethodDefs(SourceLocation ImpLoc,
CheckProtocolMethodDefs(ImpLoc, *PI, IncompleteImpl, InsMap, ClsMap, IDecl);
}
-/// MatchAllMethodDeclarations - Check methods declaraed in interface or
+/// MatchAllMethodDeclarations - Check methods declared in interface
/// or protocol against those declared in their implementations.
///
void Sema::MatchAllMethodDeclarations(const llvm::DenseSet<Selector> &InsMap,
@@ -1422,48 +1666,117 @@ Sema::ActOnForwardClassDeclaration(SourceLocation AtClassLoc,
return CDecl;
}
+static bool tryMatchRecordTypes(ASTContext &Context,
+ Sema::MethodMatchStrategy strategy,
+ const Type *left, const Type *right);
+
+static bool matchTypes(ASTContext &Context, Sema::MethodMatchStrategy strategy,
+ QualType leftQT, QualType rightQT) {
+ const Type *left =
+ Context.getCanonicalType(leftQT).getUnqualifiedType().getTypePtr();
+ const Type *right =
+ Context.getCanonicalType(rightQT).getUnqualifiedType().getTypePtr();
+
+ if (left == right) return true;
+
+ // If we're doing a strict match, the types have to match exactly.
+ if (strategy == Sema::MMS_strict) return false;
+
+ if (left->isIncompleteType() || right->isIncompleteType()) return false;
+
+ // Otherwise, use this absurdly complicated algorithm to try to
+ // validate the basic, low-level compatibility of the two types.
+
+ // As a minimum, require the sizes and alignments to match.
+ if (Context.getTypeInfo(left) != Context.getTypeInfo(right))
+ return false;
+
+ // Consider all the kinds of non-dependent canonical types:
+ // - functions and arrays aren't possible as return and parameter types
+
+ // - vector types of equal size can be arbitrarily mixed
+ if (isa<VectorType>(left)) return isa<VectorType>(right);
+ if (isa<VectorType>(right)) return false;
+
+ // - references should only match references of identical type
+ // - structs, unions, and Objective-C objects must match more-or-less
+ // exactly
+ // - everything else should be a scalar
+ if (!left->isScalarType() || !right->isScalarType())
+ return tryMatchRecordTypes(Context, strategy, left, right);
+
+ // Make scalars agree in kind, except count bools as chars.
+ Type::ScalarTypeKind leftSK = left->getScalarTypeKind();
+ Type::ScalarTypeKind rightSK = right->getScalarTypeKind();
+ if (leftSK == Type::STK_Bool) leftSK = Type::STK_Integral;
+ if (rightSK == Type::STK_Bool) rightSK = Type::STK_Integral;
+
+ // Note that data member pointers and function member pointers don't
+ // intermix because of the size differences.
+
+ return (leftSK == rightSK);
+}
+
+static bool tryMatchRecordTypes(ASTContext &Context,
+ Sema::MethodMatchStrategy strategy,
+ const Type *lt, const Type *rt) {
+ assert(lt && rt && lt != rt);
+
+ if (!isa<RecordType>(lt) || !isa<RecordType>(rt)) return false;
+ RecordDecl *left = cast<RecordType>(lt)->getDecl();
+ RecordDecl *right = cast<RecordType>(rt)->getDecl();
+
+ // Require union-hood to match.
+ if (left->isUnion() != right->isUnion()) return false;
+
+ // Require an exact match if either is non-POD.
+ if ((isa<CXXRecordDecl>(left) && !cast<CXXRecordDecl>(left)->isPOD()) ||
+ (isa<CXXRecordDecl>(right) && !cast<CXXRecordDecl>(right)->isPOD()))
+ return false;
+
+ // Require size and alignment to match.
+ if (Context.getTypeInfo(lt) != Context.getTypeInfo(rt)) return false;
+
+ // Require fields to match.
+ RecordDecl::field_iterator li = left->field_begin(), le = left->field_end();
+ RecordDecl::field_iterator ri = right->field_begin(), re = right->field_end();
+ for (; li != le && ri != re; ++li, ++ri) {
+ if (!matchTypes(Context, strategy, li->getType(), ri->getType()))
+ return false;
+ }
+ return (li == le && ri == re);
+}
/// MatchTwoMethodDeclarations - Checks that two methods have matching type and
/// returns true, or false, accordingly.
/// TODO: Handle protocol list; such as id<p1,p2> in type comparisons
-bool Sema::MatchTwoMethodDeclarations(const ObjCMethodDecl *Method,
- const ObjCMethodDecl *PrevMethod,
- bool matchBasedOnSizeAndAlignment,
- bool matchBasedOnStrictEqulity) {
- QualType T1 = Context.getCanonicalType(Method->getResultType());
- QualType T2 = Context.getCanonicalType(PrevMethod->getResultType());
-
- if (T1 != T2) {
- // The result types are different.
- if (!matchBasedOnSizeAndAlignment || matchBasedOnStrictEqulity)
- return false;
- // Incomplete types don't have a size and alignment.
- if (T1->isIncompleteType() || T2->isIncompleteType())
- return false;
- // Check is based on size and alignment.
- if (Context.getTypeInfo(T1) != Context.getTypeInfo(T2))
- return false;
- }
+bool Sema::MatchTwoMethodDeclarations(const ObjCMethodDecl *left,
+ const ObjCMethodDecl *right,
+ MethodMatchStrategy strategy) {
+ if (!matchTypes(Context, strategy,
+ left->getResultType(), right->getResultType()))
+ return false;
- ObjCMethodDecl::param_iterator ParamI = Method->param_begin(),
- E = Method->param_end();
- ObjCMethodDecl::param_iterator PrevI = PrevMethod->param_begin();
+ if (getLangOptions().ObjCAutoRefCount &&
+ (left->hasAttr<NSReturnsRetainedAttr>()
+ != right->hasAttr<NSReturnsRetainedAttr>() ||
+ left->hasAttr<NSConsumesSelfAttr>()
+ != right->hasAttr<NSConsumesSelfAttr>()))
+ return false;
- for (; ParamI != E; ++ParamI, ++PrevI) {
- assert(PrevI != PrevMethod->param_end() && "Param mismatch");
- T1 = Context.getCanonicalType((*ParamI)->getType());
- T2 = Context.getCanonicalType((*PrevI)->getType());
- if (T1 != T2) {
- // The result types are different.
- if (!matchBasedOnSizeAndAlignment || matchBasedOnStrictEqulity)
- return false;
- // Incomplete types don't have a size and alignment.
- if (T1->isIncompleteType() || T2->isIncompleteType())
- return false;
- // Check is based on size and alignment.
- if (Context.getTypeInfo(T1) != Context.getTypeInfo(T2))
- return false;
- }
+ ObjCMethodDecl::param_iterator
+ li = left->param_begin(), le = left->param_end(), ri = right->param_begin();
+
+ for (; li != le; ++li, ++ri) {
+ assert(ri != right->param_end() && "Param mismatch");
+ ParmVarDecl *lparm = *li, *rparm = *ri;
+
+ if (!matchTypes(Context, strategy, lparm->getType(), rparm->getType()))
+ return false;
+
+ if (getLangOptions().ObjCAutoRefCount &&
+ lparm->hasAttr<NSConsumedAttr>() != rparm->hasAttr<NSConsumedAttr>())
+ return false;
}
return true;
}
@@ -1505,8 +1818,10 @@ void Sema::AddMethodToGlobalPool(ObjCMethodDecl *Method, bool impl,
// We've seen a method with this name, see if we have already seen this type
// signature.
- for (ObjCMethodList *List = &Entry; List; List = List->Next)
- if (MatchTwoMethodDeclarations(Method, List->Method)) {
+ for (ObjCMethodList *List = &Entry; List; List = List->Next) {
+ bool match = MatchTwoMethodDeclarations(Method, List->Method);
+
+ if (match) {
ObjCMethodDecl *PrevObjCMethod = List->Method;
PrevObjCMethod->setDefined(impl);
// If a method is deprecated, push it in the global pool.
@@ -1523,6 +1838,7 @@ void Sema::AddMethodToGlobalPool(ObjCMethodDecl *Method, bool impl,
}
return;
}
+ }
// We have a new signature for an existing method - add it.
// This is extremely rare. Only 1% of Cocoa selectors are "overloaded".
@@ -1530,6 +1846,25 @@ void Sema::AddMethodToGlobalPool(ObjCMethodDecl *Method, bool impl,
Entry.Next = new (Mem) ObjCMethodList(Method, Entry.Next);
}
+/// Determines if this is an "acceptable" loose mismatch in the global
+/// method pool. This exists mostly as a hack to get around certain
+/// global mismatches which we can't afford to make warnings / errors.
+/// Really, what we want is a way to take a method out of the global
+/// method pool.
+static bool isAcceptableMethodMismatch(ObjCMethodDecl *chosen,
+ ObjCMethodDecl *other) {
+ if (!chosen->isInstanceMethod())
+ return false;
+
+ Selector sel = chosen->getSelector();
+ if (!sel.isUnarySelector() || sel.getNameForSlot(0) != "length")
+ return false;
+
+ // Don't complain about mismatches for -length if the method we
+ // chose has an integral result type.
+ return (chosen->getResultType()->isIntegerType());
+}
+
ObjCMethodDecl *Sema::LookupMethodInGlobalPool(Selector Sel, SourceRange R,
bool receiverIdOrClass,
bool warn, bool instance) {
@@ -1543,32 +1878,52 @@ ObjCMethodDecl *Sema::LookupMethodInGlobalPool(Selector Sel, SourceRange R,
ObjCMethodList &MethList = instance ? Pos->second.first : Pos->second.second;
- bool strictSelectorMatch = receiverIdOrClass && warn &&
- (Diags.getDiagnosticLevel(diag::warn_strict_multiple_method_decl,
- R.getBegin()) !=
- Diagnostic::Ignored);
if (warn && MethList.Method && MethList.Next) {
- bool issueWarning = false;
+ bool issueDiagnostic = false, issueError = false;
+
+ // We support a warning which complains about *any* difference in
+ // method signature.
+ bool strictSelectorMatch =
+ (receiverIdOrClass && warn &&
+ (Diags.getDiagnosticLevel(diag::warn_strict_multiple_method_decl,
+ R.getBegin()) !=
+ Diagnostic::Ignored));
if (strictSelectorMatch)
for (ObjCMethodList *Next = MethList.Next; Next; Next = Next->Next) {
- // This checks if the methods differ in type mismatch.
- if (!MatchTwoMethodDeclarations(MethList.Method, Next->Method, false, true))
- issueWarning = true;
+ if (!MatchTwoMethodDeclarations(MethList.Method, Next->Method,
+ MMS_strict)) {
+ issueDiagnostic = true;
+ break;
+ }
}
- if (!issueWarning)
+ // If we didn't see any strict differences, we won't see any loose
+ // differences. In ARC, however, we also need to check for loose
+ // mismatches, because most of them are errors.
+ if (!strictSelectorMatch ||
+ (issueDiagnostic && getLangOptions().ObjCAutoRefCount))
for (ObjCMethodList *Next = MethList.Next; Next; Next = Next->Next) {
- // This checks if the methods differ by size & alignment.
- if (!MatchTwoMethodDeclarations(MethList.Method, Next->Method, true))
- issueWarning = true;
+ // This checks if the methods differ in type mismatch.
+ if (!MatchTwoMethodDeclarations(MethList.Method, Next->Method,
+ MMS_loose) &&
+ !isAcceptableMethodMismatch(MethList.Method, Next->Method)) {
+ issueDiagnostic = true;
+ if (getLangOptions().ObjCAutoRefCount)
+ issueError = true;
+ break;
+ }
}
- if (issueWarning) {
- if (strictSelectorMatch)
+ if (issueDiagnostic) {
+ if (issueError)
+ Diag(R.getBegin(), diag::err_arc_multiple_method_decl) << Sel << R;
+ else if (strictSelectorMatch)
Diag(R.getBegin(), diag::warn_strict_multiple_method_decl) << Sel << R;
else
Diag(R.getBegin(), diag::warn_multiple_method_decl) << Sel << R;
- Diag(MethList.Method->getLocStart(), diag::note_using)
+
+ Diag(MethList.Method->getLocStart(),
+ issueError ? diag::note_possibility : diag::note_using)
<< MethList.Method->getSourceRange();
for (ObjCMethodList *Next = MethList.Next; Next; Next = Next->Next)
Diag(Next->Method->getLocStart(), diag::note_also_found)
@@ -1796,6 +2151,7 @@ void Sema::ActOnAtEnd(Scope *S, SourceRange AtEnd,
DefaultSynthesizeProperties(S, IC, IDecl);
ImplMethodsVsClassMethods(S, IC, IDecl);
AtomicPropertySetterGetterRules(IC, IDecl);
+ DiagnoseOwningPropertyGetterSynthesis(IC);
if (LangOpts.ObjCNonFragileABI2)
while (IDecl->getSuperClass()) {
@@ -1968,7 +2324,7 @@ Decl *Sema::ActOnMethodDeclaration(
} else {
ArgType = GetTypeFromParser(ArgInfo[i].Type, &DI);
// Perform the default array/function conversions (C99 6.7.5.3p[7,8]).
- ArgType = adjustParameterType(ArgType);
+ ArgType = Context.getAdjustedParameterType(ArgType);
}
LookupResult R(*this, ArgInfo[i].Name, ArgInfo[i].NameLoc,
@@ -2015,7 +2371,7 @@ Decl *Sema::ActOnMethodDeclaration(
ArgType = Context.getObjCIdType();
else
// Perform the default array/function conversions (C99 6.7.5.3p[7,8]).
- ArgType = adjustParameterType(ArgType);
+ ArgType = Context.getAdjustedParameterType(ArgType);
if (ArgType->isObjCObjectType()) {
Diag(Param->getLocation(),
diag::err_object_cannot_be_passed_returned_by_value)
@@ -2104,7 +2460,11 @@ Decl *Sema::ActOnMethodDeclaration(
mergeObjCMethodDecls(ObjCMethod, InterfaceMD);
}
- if (!ObjCMethod->hasRelatedResultType() &&
+ bool ARCError = false;
+ if (getLangOptions().ObjCAutoRefCount)
+ ARCError = CheckARCMethodDecl(*this, ObjCMethod);
+
+ if (!ObjCMethod->hasRelatedResultType() && !ARCError &&
getLangOptions().ObjCInferRelatedResultType) {
bool InferRelatedResultType = false;
switch (ObjCMethod->getMethodFamily()) {
@@ -2114,6 +2474,7 @@ Decl *Sema::ActOnMethodDeclaration(
case OMF_mutableCopy:
case OMF_release:
case OMF_retainCount:
+ case OMF_performSelector:
break;
case OMF_alloc:
@@ -2255,15 +2616,8 @@ Decl *Sema::ActOnObjCExceptionDecl(Scope *S, Declarator &D) {
if (getLangOptions().CPlusPlus)
CheckExtraCXXDefaultArguments(D);
- TagDecl *OwnedDecl = 0;
- TypeSourceInfo *TInfo = GetTypeForDeclarator(D, S, &OwnedDecl);
+ TypeSourceInfo *TInfo = GetTypeForDeclarator(D, S);
QualType ExceptionType = TInfo->getType();
-
- if (getLangOptions().CPlusPlus && OwnedDecl && OwnedDecl->isDefinition()) {
- // Objective-C++: Types shall not be defined in exception types.
- Diag(OwnedDecl->getLocation(), diag::err_type_defined_in_param_type)
- << Context.getTypeDeclType(OwnedDecl);
- }
VarDecl *New = BuildObjCExceptionDecl(TInfo, ExceptionType,
D.getSourceRange().getBegin(),
diff --git a/contrib/llvm/tools/clang/lib/Sema/SemaExpr.cpp b/contrib/llvm/tools/clang/lib/Sema/SemaExpr.cpp
index 0549e94..5efc365 100644
--- a/contrib/llvm/tools/clang/lib/Sema/SemaExpr.cpp
+++ b/contrib/llvm/tools/clang/lib/Sema/SemaExpr.cpp
@@ -87,7 +87,7 @@ bool Sema::DiagnoseUseOfDecl(NamedDecl *D, SourceLocation Loc,
if (FunctionDecl *FD = dyn_cast<FunctionDecl>(D)) {
if (FD->isDeleted()) {
Diag(Loc, diag::err_deleted_function_use);
- Diag(D->getLocation(), diag::note_unavailable_here) << true;
+ Diag(D->getLocation(), diag::note_unavailable_here) << 1 << true;
return true;
}
}
@@ -104,17 +104,20 @@ bool Sema::DiagnoseUseOfDecl(NamedDecl *D, SourceLocation Loc,
break;
case AR_Unavailable:
- if (Message.empty()) {
- if (!UnknownObjCClass)
- Diag(Loc, diag::err_unavailable) << D->getDeclName();
- else
- Diag(Loc, diag::warn_unavailable_fwdclass_message)
- << D->getDeclName();
+ if (cast<Decl>(CurContext)->getAvailability() != AR_Unavailable) {
+ if (Message.empty()) {
+ if (!UnknownObjCClass)
+ Diag(Loc, diag::err_unavailable) << D->getDeclName();
+ else
+ Diag(Loc, diag::warn_unavailable_fwdclass_message)
+ << D->getDeclName();
+ }
+ else
+ Diag(Loc, diag::err_unavailable_message)
+ << D->getDeclName() << Message;
+ Diag(D->getLocation(), diag::note_unavailable_here)
+ << isa<FunctionDecl>(D) << false;
}
- else
- Diag(Loc, diag::err_unavailable_message)
- << D->getDeclName() << Message;
- Diag(D->getLocation(), diag::note_unavailable_here) << 0;
break;
}
@@ -437,8 +440,12 @@ ExprResult Sema::DefaultArgumentPromotion(Expr *E) {
/// will warn if the resulting type is not a POD type, and rejects ObjC
/// interfaces passed by value.
ExprResult Sema::DefaultVariadicArgumentPromotion(Expr *E, VariadicCallType CT,
- FunctionDecl *FDecl) {
- ExprResult ExprRes = DefaultArgumentPromotion(E);
+ FunctionDecl *FDecl) {
+ ExprResult ExprRes = CheckPlaceholderExpr(E);
+ if (ExprRes.isInvalid())
+ return ExprError();
+
+ ExprRes = DefaultArgumentPromotion(E);
if (ExprRes.isInvalid())
return ExprError();
E = ExprRes.take();
@@ -456,7 +463,7 @@ ExprResult Sema::DefaultVariadicArgumentPromotion(Expr *E, VariadicCallType CT,
<< E->getType() << CT))
return ExprError();
- if (!E->getType()->isPODType()) {
+ if (!E->getType().isPODType(Context)) {
// C++0x [expr.call]p7:
// Passing a potentially-evaluated argument of class type (Clause 9)
// having a non-trivial copy constructor, a non-trivial move constructor,
@@ -471,6 +478,11 @@ ExprResult Sema::DefaultVariadicArgumentPromotion(Expr *E, VariadicCallType CT,
TrivialEnough = true;
}
}
+
+ if (!TrivialEnough &&
+ getLangOptions().ObjCAutoRefCount &&
+ E->getType()->isObjCLifetimeType())
+ TrivialEnough = true;
if (TrivialEnough) {
// Nothing to diagnose. This is okay.
@@ -1004,7 +1016,6 @@ Sema::ActOnStringLiteral(const Token *StringToks, unsigned NumStringToks) {
// Pass &StringTokLocs[0], StringTokLocs.size() to factory!
return Owned(StringLiteral::Create(Context, Literal.GetString(),
- Literal.GetStringLength(),
Literal.AnyWide, Literal.Pascal, StrTy,
&StringTokLocs[0],
StringTokLocs.size()));
@@ -1271,125 +1282,6 @@ Sema::BuildDeclRefExpr(ValueDecl *D, QualType Ty, ExprValueKind VK,
return Owned(E);
}
-static ExprResult
-BuildFieldReferenceExpr(Sema &S, Expr *BaseExpr, bool IsArrow,
- const CXXScopeSpec &SS, FieldDecl *Field,
- DeclAccessPair FoundDecl,
- const DeclarationNameInfo &MemberNameInfo);
-
-ExprResult
-Sema::BuildAnonymousStructUnionMemberReference(const CXXScopeSpec &SS,
- SourceLocation loc,
- IndirectFieldDecl *indirectField,
- Expr *baseObjectExpr,
- SourceLocation opLoc) {
- // First, build the expression that refers to the base object.
-
- bool baseObjectIsPointer = false;
- Qualifiers baseQuals;
-
- // Case 1: the base of the indirect field is not a field.
- VarDecl *baseVariable = indirectField->getVarDecl();
- CXXScopeSpec EmptySS;
- if (baseVariable) {
- assert(baseVariable->getType()->isRecordType());
-
- // In principle we could have a member access expression that
- // accesses an anonymous struct/union that's a static member of
- // the base object's class. However, under the current standard,
- // static data members cannot be anonymous structs or unions.
- // Supporting this is as easy as building a MemberExpr here.
- assert(!baseObjectExpr && "anonymous struct/union is static data member?");
-
- DeclarationNameInfo baseNameInfo(DeclarationName(), loc);
-
- ExprResult result =
- BuildDeclarationNameExpr(EmptySS, baseNameInfo, baseVariable);
- if (result.isInvalid()) return ExprError();
-
- baseObjectExpr = result.take();
- baseObjectIsPointer = false;
- baseQuals = baseObjectExpr->getType().getQualifiers();
-
- // Case 2: the base of the indirect field is a field and the user
- // wrote a member expression.
- } else if (baseObjectExpr) {
- // The caller provided the base object expression. Determine
- // whether its a pointer and whether it adds any qualifiers to the
- // anonymous struct/union fields we're looking into.
- QualType objectType = baseObjectExpr->getType();
-
- if (const PointerType *ptr = objectType->getAs<PointerType>()) {
- baseObjectIsPointer = true;
- objectType = ptr->getPointeeType();
- } else {
- baseObjectIsPointer = false;
- }
- baseQuals = objectType.getQualifiers();
-
- // Case 3: the base of the indirect field is a field and we should
- // build an implicit member access.
- } else {
- // We've found a member of an anonymous struct/union that is
- // inside a non-anonymous struct/union, so in a well-formed
- // program our base object expression is "this".
- QualType ThisTy = getAndCaptureCurrentThisType();
- if (ThisTy.isNull()) {
- Diag(loc, diag::err_invalid_member_use_in_static_method)
- << indirectField->getDeclName();
- return ExprError();
- }
-
- // Our base object expression is "this".
- baseObjectExpr =
- new (Context) CXXThisExpr(loc, ThisTy, /*isImplicit=*/ true);
- baseObjectIsPointer = true;
- baseQuals = ThisTy->castAs<PointerType>()->getPointeeType().getQualifiers();
- }
-
- // Build the implicit member references to the field of the
- // anonymous struct/union.
- Expr *result = baseObjectExpr;
- IndirectFieldDecl::chain_iterator
- FI = indirectField->chain_begin(), FEnd = indirectField->chain_end();
-
- // Build the first member access in the chain with full information.
- if (!baseVariable) {
- FieldDecl *field = cast<FieldDecl>(*FI);
-
- // FIXME: use the real found-decl info!
- DeclAccessPair foundDecl = DeclAccessPair::make(field, field->getAccess());
-
- // Make a nameInfo that properly uses the anonymous name.
- DeclarationNameInfo memberNameInfo(field->getDeclName(), loc);
-
- result = BuildFieldReferenceExpr(*this, result, baseObjectIsPointer,
- EmptySS, field, foundDecl,
- memberNameInfo).take();
- baseObjectIsPointer = false;
-
- // FIXME: check qualified member access
- }
-
- // In all cases, we should now skip the first declaration in the chain.
- ++FI;
-
- while (FI != FEnd) {
- FieldDecl *field = cast<FieldDecl>(*FI++);
-
- // FIXME: these are somewhat meaningless
- DeclarationNameInfo memberNameInfo(field->getDeclName(), loc);
- DeclAccessPair foundDecl = DeclAccessPair::make(field, field->getAccess());
-
- result = BuildFieldReferenceExpr(*this, result, /*isarrow*/ false,
- (FI == FEnd? SS : EmptySS), field,
- foundDecl, memberNameInfo)
- .take();
- }
-
- return Owned(result);
-}
-
/// Decomposes the given name into a DeclarationNameInfo, its location, and
/// possibly a list of template arguments.
///
@@ -1399,215 +1291,30 @@ Sema::BuildAnonymousStructUnionMemberReference(const CXXScopeSpec &SS,
/// This actually loses a lot of source location information for
/// non-standard name kinds; we should consider preserving that in
/// some way.
-static void DecomposeUnqualifiedId(Sema &SemaRef,
- const UnqualifiedId &Id,
- TemplateArgumentListInfo &Buffer,
- DeclarationNameInfo &NameInfo,
- const TemplateArgumentListInfo *&TemplateArgs) {
+void Sema::DecomposeUnqualifiedId(const UnqualifiedId &Id,
+ TemplateArgumentListInfo &Buffer,
+ DeclarationNameInfo &NameInfo,
+ const TemplateArgumentListInfo *&TemplateArgs) {
if (Id.getKind() == UnqualifiedId::IK_TemplateId) {
Buffer.setLAngleLoc(Id.TemplateId->LAngleLoc);
Buffer.setRAngleLoc(Id.TemplateId->RAngleLoc);
- ASTTemplateArgsPtr TemplateArgsPtr(SemaRef,
+ ASTTemplateArgsPtr TemplateArgsPtr(*this,
Id.TemplateId->getTemplateArgs(),
Id.TemplateId->NumArgs);
- SemaRef.translateTemplateArguments(TemplateArgsPtr, Buffer);
+ translateTemplateArguments(TemplateArgsPtr, Buffer);
TemplateArgsPtr.release();
TemplateName TName = Id.TemplateId->Template.get();
SourceLocation TNameLoc = Id.TemplateId->TemplateNameLoc;
- NameInfo = SemaRef.Context.getNameForTemplate(TName, TNameLoc);
+ NameInfo = Context.getNameForTemplate(TName, TNameLoc);
TemplateArgs = &Buffer;
} else {
- NameInfo = SemaRef.GetNameFromUnqualifiedId(Id);
+ NameInfo = GetNameFromUnqualifiedId(Id);
TemplateArgs = 0;
}
}
-/// Determines if the given class is provably not derived from all of
-/// the prospective base classes.
-static bool IsProvablyNotDerivedFrom(Sema &SemaRef,
- CXXRecordDecl *Record,
- const llvm::SmallPtrSet<CXXRecordDecl*, 4> &Bases) {
- if (Bases.count(Record->getCanonicalDecl()))
- return false;
-
- RecordDecl *RD = Record->getDefinition();
- if (!RD) return false;
- Record = cast<CXXRecordDecl>(RD);
-
- for (CXXRecordDecl::base_class_iterator I = Record->bases_begin(),
- E = Record->bases_end(); I != E; ++I) {
- CanQualType BaseT = SemaRef.Context.getCanonicalType((*I).getType());
- CanQual<RecordType> BaseRT = BaseT->getAs<RecordType>();
- if (!BaseRT) return false;
-
- CXXRecordDecl *BaseRecord = cast<CXXRecordDecl>(BaseRT->getDecl());
- if (!IsProvablyNotDerivedFrom(SemaRef, BaseRecord, Bases))
- return false;
- }
-
- return true;
-}
-
-enum IMAKind {
- /// The reference is definitely not an instance member access.
- IMA_Static,
-
- /// The reference may be an implicit instance member access.
- IMA_Mixed,
-
- /// The reference may be to an instance member, but it is invalid if
- /// so, because the context is not an instance method.
- IMA_Mixed_StaticContext,
-
- /// The reference may be to an instance member, but it is invalid if
- /// so, because the context is from an unrelated class.
- IMA_Mixed_Unrelated,
-
- /// The reference is definitely an implicit instance member access.
- IMA_Instance,
-
- /// The reference may be to an unresolved using declaration.
- IMA_Unresolved,
-
- /// The reference may be to an unresolved using declaration and the
- /// context is not an instance method.
- IMA_Unresolved_StaticContext,
-
- /// All possible referrents are instance members and the current
- /// context is not an instance method.
- IMA_Error_StaticContext,
-
- /// All possible referrents are instance members of an unrelated
- /// class.
- IMA_Error_Unrelated
-};
-
-/// The given lookup names class member(s) and is not being used for
-/// an address-of-member expression. Classify the type of access
-/// according to whether it's possible that this reference names an
-/// instance member. This is best-effort; it is okay to
-/// conservatively answer "yes", in which case some errors will simply
-/// not be caught until template-instantiation.
-static IMAKind ClassifyImplicitMemberAccess(Sema &SemaRef,
- Scope *CurScope,
- const LookupResult &R) {
- assert(!R.empty() && (*R.begin())->isCXXClassMember());
-
- DeclContext *DC = SemaRef.getFunctionLevelDeclContext();
-
- bool isStaticContext =
- (!isa<CXXMethodDecl>(DC) ||
- cast<CXXMethodDecl>(DC)->isStatic());
-
- // C++0x [expr.prim]p4:
- // Otherwise, if a member-declarator declares a non-static data member
- // of a class X, the expression this is a prvalue of type "pointer to X"
- // within the optional brace-or-equal-initializer.
- if (CurScope->getFlags() & Scope::ThisScope)
- isStaticContext = false;
-
- if (R.isUnresolvableResult())
- return isStaticContext ? IMA_Unresolved_StaticContext : IMA_Unresolved;
-
- // Collect all the declaring classes of instance members we find.
- bool hasNonInstance = false;
- bool hasField = false;
- llvm::SmallPtrSet<CXXRecordDecl*, 4> Classes;
- for (LookupResult::iterator I = R.begin(), E = R.end(); I != E; ++I) {
- NamedDecl *D = *I;
-
- if (D->isCXXInstanceMember()) {
- if (dyn_cast<FieldDecl>(D))
- hasField = true;
-
- CXXRecordDecl *R = cast<CXXRecordDecl>(D->getDeclContext());
- Classes.insert(R->getCanonicalDecl());
- }
- else
- hasNonInstance = true;
- }
-
- // If we didn't find any instance members, it can't be an implicit
- // member reference.
- if (Classes.empty())
- return IMA_Static;
-
- // If the current context is not an instance method, it can't be
- // an implicit member reference.
- if (isStaticContext) {
- if (hasNonInstance)
- return IMA_Mixed_StaticContext;
-
- if (SemaRef.getLangOptions().CPlusPlus0x && hasField) {
- // C++0x [expr.prim.general]p10:
- // An id-expression that denotes a non-static data member or non-static
- // member function of a class can only be used:
- // (...)
- // - if that id-expression denotes a non-static data member and it appears in an unevaluated operand.
- const Sema::ExpressionEvaluationContextRecord& record = SemaRef.ExprEvalContexts.back();
- bool isUnevaluatedExpression = record.Context == Sema::Unevaluated;
- if (isUnevaluatedExpression)
- return IMA_Mixed_StaticContext;
- }
-
- return IMA_Error_StaticContext;
- }
-
- CXXRecordDecl *contextClass;
- if (CXXMethodDecl *MD = dyn_cast<CXXMethodDecl>(DC))
- contextClass = MD->getParent()->getCanonicalDecl();
- else
- contextClass = cast<CXXRecordDecl>(DC);
-
- // [class.mfct.non-static]p3:
- // ...is used in the body of a non-static member function of class X,
- // if name lookup (3.4.1) resolves the name in the id-expression to a
- // non-static non-type member of some class C [...]
- // ...if C is not X or a base class of X, the class member access expression
- // is ill-formed.
- if (R.getNamingClass() &&
- contextClass != R.getNamingClass()->getCanonicalDecl() &&
- contextClass->isProvablyNotDerivedFrom(R.getNamingClass()))
- return (hasNonInstance ? IMA_Mixed_Unrelated : IMA_Error_Unrelated);
-
- // If we can prove that the current context is unrelated to all the
- // declaring classes, it can't be an implicit member reference (in
- // which case it's an error if any of those members are selected).
- if (IsProvablyNotDerivedFrom(SemaRef, contextClass, Classes))
- return (hasNonInstance ? IMA_Mixed_Unrelated : IMA_Error_Unrelated);
-
- return (hasNonInstance ? IMA_Mixed : IMA_Instance);
-}
-
-/// Diagnose a reference to a field with no object available.
-static void DiagnoseInstanceReference(Sema &SemaRef,
- const CXXScopeSpec &SS,
- NamedDecl *rep,
- const DeclarationNameInfo &nameInfo) {
- SourceLocation Loc = nameInfo.getLoc();
- SourceRange Range(Loc);
- if (SS.isSet()) Range.setBegin(SS.getRange().getBegin());
-
- if (isa<FieldDecl>(rep) || isa<IndirectFieldDecl>(rep)) {
- if (CXXMethodDecl *MD = dyn_cast<CXXMethodDecl>(SemaRef.CurContext)) {
- if (MD->isStatic()) {
- // "invalid use of member 'x' in static member function"
- SemaRef.Diag(Loc, diag::err_invalid_member_use_in_static_method)
- << Range << nameInfo.getName();
- return;
- }
- }
-
- SemaRef.Diag(Loc, diag::err_invalid_non_static_member_use)
- << nameInfo.getName() << Range;
- return;
- }
-
- SemaRef.Diag(Loc, diag::err_member_call_without_object) << Range;
-}
-
/// Diagnose an empty lookup.
///
/// \return false if new lookup candidates were found
@@ -1690,39 +1397,43 @@ bool Sema::DiagnoseEmptyLookup(Scope *S, CXXScopeSpec &SS, LookupResult &R,
}
// We didn't find anything, so try to correct for a typo.
- DeclarationName Corrected;
- if (S && (Corrected = CorrectTypo(R, S, &SS, 0, false, CTC))) {
- if (!R.empty()) {
- if (isa<ValueDecl>(*R.begin()) || isa<FunctionTemplateDecl>(*R.begin())) {
+ TypoCorrection Corrected;
+ if (S && (Corrected = CorrectTypo(R.getLookupNameInfo(), R.getLookupKind(),
+ S, &SS, NULL, false, CTC))) {
+ std::string CorrectedStr(Corrected.getAsString(getLangOptions()));
+ std::string CorrectedQuotedStr(Corrected.getQuoted(getLangOptions()));
+ R.setLookupName(Corrected.getCorrection());
+
+ if (NamedDecl *ND = Corrected.getCorrectionDecl()) {
+ R.addDecl(ND);
+ if (isa<ValueDecl>(ND) || isa<FunctionTemplateDecl>(ND)) {
if (SS.isEmpty())
- Diag(R.getNameLoc(), diagnostic_suggest) << Name << R.getLookupName()
- << FixItHint::CreateReplacement(R.getNameLoc(),
- R.getLookupName().getAsString());
+ Diag(R.getNameLoc(), diagnostic_suggest) << Name << CorrectedQuotedStr
+ << FixItHint::CreateReplacement(R.getNameLoc(), CorrectedStr);
else
Diag(R.getNameLoc(), diag::err_no_member_suggest)
- << Name << computeDeclContext(SS, false) << R.getLookupName()
+ << Name << computeDeclContext(SS, false) << CorrectedQuotedStr
<< SS.getRange()
- << FixItHint::CreateReplacement(R.getNameLoc(),
- R.getLookupName().getAsString());
- if (NamedDecl *ND = R.getAsSingle<NamedDecl>())
+ << FixItHint::CreateReplacement(R.getNameLoc(), CorrectedStr);
+ if (ND)
Diag(ND->getLocation(), diag::note_previous_decl)
- << ND->getDeclName();
+ << CorrectedQuotedStr;
// Tell the callee to try to recover.
return false;
}
- if (isa<TypeDecl>(*R.begin()) || isa<ObjCInterfaceDecl>(*R.begin())) {
+ if (isa<TypeDecl>(ND) || isa<ObjCInterfaceDecl>(ND)) {
// FIXME: If we ended up with a typo for a type name or
// Objective-C class name, we're in trouble because the parser
// is in the wrong place to recover. Suggest the typo
// correction, but don't make it a fix-it since we're not going
// to recover well anyway.
if (SS.isEmpty())
- Diag(R.getNameLoc(), diagnostic_suggest) << Name << R.getLookupName();
+ Diag(R.getNameLoc(), diagnostic_suggest) << Name << CorrectedQuotedStr;
else
Diag(R.getNameLoc(), diag::err_no_member_suggest)
- << Name << computeDeclContext(SS, false) << R.getLookupName()
+ << Name << computeDeclContext(SS, false) << CorrectedQuotedStr
<< SS.getRange();
// Don't try to recover; it won't work.
@@ -1732,15 +1443,15 @@ bool Sema::DiagnoseEmptyLookup(Scope *S, CXXScopeSpec &SS, LookupResult &R,
// FIXME: We found a keyword. Suggest it, but don't provide a fix-it
// because we aren't able to recover.
if (SS.isEmpty())
- Diag(R.getNameLoc(), diagnostic_suggest) << Name << Corrected;
+ Diag(R.getNameLoc(), diagnostic_suggest) << Name << CorrectedQuotedStr;
else
Diag(R.getNameLoc(), diag::err_no_member_suggest)
- << Name << computeDeclContext(SS, false) << Corrected
+ << Name << computeDeclContext(SS, false) << CorrectedQuotedStr
<< SS.getRange();
return true;
}
- R.clear();
}
+ R.clear();
// Emit a special diagnostic for failed member lookups.
// FIXME: computing the declaration context might fail here (?)
@@ -1856,7 +1567,7 @@ ExprResult Sema::ActOnIdExpression(Scope *S,
// Decompose the UnqualifiedId into the following data.
DeclarationNameInfo NameInfo;
const TemplateArgumentListInfo *TemplateArgs;
- DecomposeUnqualifiedId(*this, Id, TemplateArgsBuffer, NameInfo, TemplateArgs);
+ DecomposeUnqualifiedId(Id, TemplateArgsBuffer, NameInfo, TemplateArgs);
DeclarationName Name = NameInfo.getName();
IdentifierInfo *II = Name.getAsIdentifierInfo();
@@ -1892,7 +1603,9 @@ ExprResult Sema::ActOnIdExpression(Scope *S,
bool IvarLookupFollowUp = false;
// Perform the required lookup.
- LookupResult R(*this, NameInfo, LookupOrdinaryName);
+ LookupResult R(*this, NameInfo,
+ (Id.getKind() == UnqualifiedId::IK_ImplicitSelfParam)
+ ? LookupObjCImplicitSelfParam : LookupOrdinaryName);
if (TemplateArgs) {
// Lookup the template name again to correctly establish the context in
// which it was found. This is really unfortunate as we already did the
@@ -2032,38 +1745,6 @@ ExprResult Sema::ActOnIdExpression(Scope *S,
return BuildDeclarationNameExpr(SS, R, ADL);
}
-/// Builds an expression which might be an implicit member expression.
-ExprResult
-Sema::BuildPossibleImplicitMemberExpr(const CXXScopeSpec &SS,
- LookupResult &R,
- const TemplateArgumentListInfo *TemplateArgs) {
- switch (ClassifyImplicitMemberAccess(*this, CurScope, R)) {
- case IMA_Instance:
- return BuildImplicitMemberExpr(SS, R, TemplateArgs, true);
-
- case IMA_Mixed:
- case IMA_Mixed_Unrelated:
- case IMA_Unresolved:
- return BuildImplicitMemberExpr(SS, R, TemplateArgs, false);
-
- case IMA_Static:
- case IMA_Mixed_StaticContext:
- case IMA_Unresolved_StaticContext:
- if (TemplateArgs)
- return BuildTemplateIdExpr(SS, R, false, *TemplateArgs);
- return BuildDeclarationNameExpr(SS, R, false);
-
- case IMA_Error_StaticContext:
- case IMA_Error_Unrelated:
- DiagnoseInstanceReference(*this, SS, R.getRepresentativeDecl(),
- R.getLookupNameInfo());
- return ExprError();
- }
-
- llvm_unreachable("unexpected instance member access kind");
- return ExprError();
-}
-
/// BuildQualifiedDeclarationNameExpr - Build a C++ qualified
/// declaration name, generally during template instantiation.
/// There's a large number of things which don't need to be done along
@@ -2155,6 +1836,7 @@ Sema::LookupInObjCMethod(LookupResult &Lookup, Scope *S,
IdentifierInfo &II = Context.Idents.get("self");
UnqualifiedId SelfName;
SelfName.setIdentifier(&II, SourceLocation());
+ SelfName.setKind(UnqualifiedId::IK_ImplicitSelfParam);
CXXScopeSpec SelfScopeSpec;
ExprResult SelfExpr = ActOnIdExpression(S, SelfScopeSpec,
SelfName, false, false);
@@ -2166,27 +1848,6 @@ Sema::LookupInObjCMethod(LookupResult &Lookup, Scope *S,
return ExprError();
MarkDeclarationReferenced(Loc, IV);
- Expr *base = SelfExpr.take();
- base = base->IgnoreParenImpCasts();
- if (const DeclRefExpr *DE = dyn_cast<DeclRefExpr>(base)) {
- const NamedDecl *ND = DE->getDecl();
- if (!isa<ImplicitParamDecl>(ND)) {
- // relax the rule such that it is allowed to have a shadow 'self'
- // where stand-alone ivar can be found in this 'self' object.
- // This is to match gcc's behavior.
- ObjCInterfaceDecl *selfIFace = 0;
- if (const ObjCObjectPointerType *OPT =
- base->getType()->getAsObjCInterfacePointerType())
- selfIFace = OPT->getInterfaceDecl();
- if (!selfIFace ||
- !selfIFace->lookupInstanceVariable(IV->getIdentifier())) {
- Diag(Loc, diag::error_implicit_ivar_access)
- << IV->getDeclName();
- Diag(ND->getLocation(), diag::note_declared_at);
- return ExprError();
- }
- }
- }
return Owned(new (Context)
ObjCIvarRefExpr(IV, IV->getType(), Loc,
SelfExpr.take(), true, true));
@@ -2385,120 +2046,6 @@ Sema::PerformObjectMemberConversion(Expr *From,
VK, &BasePath);
}
-/// \brief Build a MemberExpr AST node.
-static MemberExpr *BuildMemberExpr(ASTContext &C, Expr *Base, bool isArrow,
- const CXXScopeSpec &SS, ValueDecl *Member,
- DeclAccessPair FoundDecl,
- const DeclarationNameInfo &MemberNameInfo,
- QualType Ty,
- ExprValueKind VK, ExprObjectKind OK,
- const TemplateArgumentListInfo *TemplateArgs = 0) {
- return MemberExpr::Create(C, Base, isArrow, SS.getWithLocInContext(C),
- Member, FoundDecl, MemberNameInfo,
- TemplateArgs, Ty, VK, OK);
-}
-
-static ExprResult
-BuildFieldReferenceExpr(Sema &S, Expr *BaseExpr, bool IsArrow,
- const CXXScopeSpec &SS, FieldDecl *Field,
- DeclAccessPair FoundDecl,
- const DeclarationNameInfo &MemberNameInfo) {
- // x.a is an l-value if 'a' has a reference type. Otherwise:
- // x.a is an l-value/x-value/pr-value if the base is (and note
- // that *x is always an l-value), except that if the base isn't
- // an ordinary object then we must have an rvalue.
- ExprValueKind VK = VK_LValue;
- ExprObjectKind OK = OK_Ordinary;
- if (!IsArrow) {
- if (BaseExpr->getObjectKind() == OK_Ordinary)
- VK = BaseExpr->getValueKind();
- else
- VK = VK_RValue;
- }
- if (VK != VK_RValue && Field->isBitField())
- OK = OK_BitField;
-
- // Figure out the type of the member; see C99 6.5.2.3p3, C++ [expr.ref]
- QualType MemberType = Field->getType();
- if (const ReferenceType *Ref = MemberType->getAs<ReferenceType>()) {
- MemberType = Ref->getPointeeType();
- VK = VK_LValue;
- } else {
- QualType BaseType = BaseExpr->getType();
- if (IsArrow) BaseType = BaseType->getAs<PointerType>()->getPointeeType();
-
- Qualifiers BaseQuals = BaseType.getQualifiers();
-
- // GC attributes are never picked up by members.
- BaseQuals.removeObjCGCAttr();
-
- // CVR attributes from the base are picked up by members,
- // except that 'mutable' members don't pick up 'const'.
- if (Field->isMutable()) BaseQuals.removeConst();
-
- Qualifiers MemberQuals
- = S.Context.getCanonicalType(MemberType).getQualifiers();
-
- // TR 18037 does not allow fields to be declared with address spaces.
- assert(!MemberQuals.hasAddressSpace());
-
- Qualifiers Combined = BaseQuals + MemberQuals;
- if (Combined != MemberQuals)
- MemberType = S.Context.getQualifiedType(MemberType, Combined);
- }
-
- S.MarkDeclarationReferenced(MemberNameInfo.getLoc(), Field);
- ExprResult Base =
- S.PerformObjectMemberConversion(BaseExpr, SS.getScopeRep(),
- FoundDecl, Field);
- if (Base.isInvalid())
- return ExprError();
- return S.Owned(BuildMemberExpr(S.Context, Base.take(), IsArrow, SS,
- Field, FoundDecl, MemberNameInfo,
- MemberType, VK, OK));
-}
-
-/// Builds an implicit member access expression. The current context
-/// is known to be an instance method, and the given unqualified lookup
-/// set is known to contain only instance members, at least one of which
-/// is from an appropriate type.
-ExprResult
-Sema::BuildImplicitMemberExpr(const CXXScopeSpec &SS,
- LookupResult &R,
- const TemplateArgumentListInfo *TemplateArgs,
- bool IsKnownInstance) {
- assert(!R.empty() && !R.isAmbiguous());
-
- SourceLocation loc = R.getNameLoc();
-
- // We may have found a field within an anonymous union or struct
- // (C++ [class.union]).
- // FIXME: template-ids inside anonymous structs?
- if (IndirectFieldDecl *FD = R.getAsSingle<IndirectFieldDecl>())
- return BuildAnonymousStructUnionMemberReference(SS, R.getNameLoc(), FD);
-
- // If this is known to be an instance access, go ahead and build an
- // implicit 'this' expression now.
- // 'this' expression now.
- QualType ThisTy = getAndCaptureCurrentThisType();
- assert(!ThisTy.isNull() && "didn't correctly pre-flight capture of 'this'");
-
- Expr *baseExpr = 0; // null signifies implicit access
- if (IsKnownInstance) {
- SourceLocation Loc = R.getNameLoc();
- if (SS.getRange().isValid())
- Loc = SS.getRange().getBegin();
- baseExpr = new (Context) CXXThisExpr(loc, ThisTy, /*isImplicit=*/true);
- }
-
- return BuildMemberReferenceExpr(baseExpr, ThisTy,
- /*OpLoc*/ SourceLocation(),
- /*IsArrow*/ true,
- SS,
- /*FirstQualifierInScope*/ 0,
- R, TemplateArgs);
-}
-
bool Sema::UseArgumentDependentLookup(const CXXScopeSpec &SS,
const LookupResult &R,
bool HasTrailingLParen) {
@@ -3160,6 +2707,20 @@ bool Sema::CheckUnaryExprOrTypeTraitOperand(Expr *Op,
Op->getSourceRange(), ExprKind))
return true;
+ if (ExprKind == UETT_SizeOf) {
+ if (DeclRefExpr *DeclRef = dyn_cast<DeclRefExpr>(Op->IgnoreParens())) {
+ if (ParmVarDecl *PVD = dyn_cast<ParmVarDecl>(DeclRef->getFoundDecl())) {
+ QualType OType = PVD->getOriginalType();
+ QualType Type = PVD->getType();
+ if (Type->isPointerType() && OType->isArrayType()) {
+ Diag(Op->getExprLoc(), diag::warn_sizeof_array_param)
+ << Type << OType;
+ Diag(PVD->getLocation(), diag::note_declared_at);
+ }
+ }
+ }
+ }
+
return false;
}
@@ -3274,6 +2835,12 @@ Sema::CreateUnaryExprOrTypeTraitExpr(TypeSourceInfo *TInfo,
ExprResult
Sema::CreateUnaryExprOrTypeTraitExpr(Expr *E, SourceLocation OpLoc,
UnaryExprOrTypeTrait ExprKind) {
+ ExprResult PE = CheckPlaceholderExpr(E);
+ if (PE.isInvalid())
+ return ExprError();
+
+ E = PE.get();
+
// Verify that the operand is valid.
bool isInvalid = false;
if (E->isTypeDependent()) {
@@ -3285,10 +2852,6 @@ Sema::CreateUnaryExprOrTypeTraitExpr(Expr *E, SourceLocation OpLoc,
} else if (E->getBitField()) { // C99 6.5.3.4p1.
Diag(E->getExprLoc(), diag::err_sizeof_alignof_bitfield) << 0;
isInvalid = true;
- } else if (E->getType()->isPlaceholderType()) {
- ExprResult PE = CheckPlaceholderExpr(E);
- if (PE.isInvalid()) return ExprError();
- return CreateUnaryExprOrTypeTraitExpr(PE.take(), OpLoc, ExprKind);
} else {
isInvalid = CheckUnaryExprOrTypeTraitOperand(E, UETT_SizeOf);
}
@@ -3372,19 +2935,6 @@ Sema::ActOnPostfixUnaryOp(Scope *S, SourceLocation OpLoc,
return BuildUnaryOp(S, OpLoc, Opc, Input);
}
-/// Expressions of certain arbitrary types are forbidden by C from
-/// having l-value type. These are:
-/// - 'void', but not qualified void
-/// - function types
-///
-/// The exact rule here is C99 6.3.2.1:
-/// An lvalue is an expression with an object type or an incomplete
-/// type other than void.
-static bool IsCForbiddenLValueType(ASTContext &C, QualType T) {
- return ((T->isVoidType() && !T.hasQualifiers()) ||
- T->isFunctionType());
-}
-
ExprResult
Sema::ActOnArraySubscriptExpr(Scope *S, Expr *Base, SourceLocation LLoc,
Expr *Idx, SourceLocation RLoc) {
@@ -3528,7 +3078,7 @@ Sema::CreateBuiltinArraySubscriptExpr(Expr *Base, SourceLocation LLoc,
if (ResultType->isVoidType() && !getLangOptions().CPlusPlus) {
// GNU extension: subscripting on pointer to void
- Diag(LLoc, diag::ext_gnu_void_ptr)
+ Diag(LLoc, diag::ext_gnu_subscript_void_type)
<< BaseExpr->getSourceRange();
// C forbids expressions of unqualified void type from being l-values.
@@ -3548,1109 +3098,12 @@ Sema::CreateBuiltinArraySubscriptExpr(Expr *Base, SourceLocation LLoc,
}
assert(VK == VK_RValue || LangOpts.CPlusPlus ||
- !IsCForbiddenLValueType(Context, ResultType));
+ !ResultType.isCForbiddenLValueType());
return Owned(new (Context) ArraySubscriptExpr(LHSExp, RHSExp,
ResultType, VK, OK, RLoc));
}
-/// Check an ext-vector component access expression.
-///
-/// VK should be set in advance to the value kind of the base
-/// expression.
-static QualType
-CheckExtVectorComponent(Sema &S, QualType baseType, ExprValueKind &VK,
- SourceLocation OpLoc, const IdentifierInfo *CompName,
- SourceLocation CompLoc) {
- // FIXME: Share logic with ExtVectorElementExpr::containsDuplicateElements,
- // see FIXME there.
- //
- // FIXME: This logic can be greatly simplified by splitting it along
- // halving/not halving and reworking the component checking.
- const ExtVectorType *vecType = baseType->getAs<ExtVectorType>();
-
- // The vector accessor can't exceed the number of elements.
- const char *compStr = CompName->getNameStart();
-
- // This flag determines whether or not the component is one of the four
- // special names that indicate a subset of exactly half the elements are
- // to be selected.
- bool HalvingSwizzle = false;
-
- // This flag determines whether or not CompName has an 's' char prefix,
- // indicating that it is a string of hex values to be used as vector indices.
- bool HexSwizzle = *compStr == 's' || *compStr == 'S';
-
- bool HasRepeated = false;
- bool HasIndex[16] = {};
-
- int Idx;
-
- // Check that we've found one of the special components, or that the component
- // names must come from the same set.
- if (!strcmp(compStr, "hi") || !strcmp(compStr, "lo") ||
- !strcmp(compStr, "even") || !strcmp(compStr, "odd")) {
- HalvingSwizzle = true;
- } else if (!HexSwizzle &&
- (Idx = vecType->getPointAccessorIdx(*compStr)) != -1) {
- do {
- if (HasIndex[Idx]) HasRepeated = true;
- HasIndex[Idx] = true;
- compStr++;
- } while (*compStr && (Idx = vecType->getPointAccessorIdx(*compStr)) != -1);
- } else {
- if (HexSwizzle) compStr++;
- while ((Idx = vecType->getNumericAccessorIdx(*compStr)) != -1) {
- if (HasIndex[Idx]) HasRepeated = true;
- HasIndex[Idx] = true;
- compStr++;
- }
- }
-
- if (!HalvingSwizzle && *compStr) {
- // We didn't get to the end of the string. This means the component names
- // didn't come from the same set *or* we encountered an illegal name.
- S.Diag(OpLoc, diag::err_ext_vector_component_name_illegal)
- << llvm::StringRef(compStr, 1) << SourceRange(CompLoc);
- return QualType();
- }
-
- // Ensure no component accessor exceeds the width of the vector type it
- // operates on.
- if (!HalvingSwizzle) {
- compStr = CompName->getNameStart();
-
- if (HexSwizzle)
- compStr++;
-
- while (*compStr) {
- if (!vecType->isAccessorWithinNumElements(*compStr++)) {
- S.Diag(OpLoc, diag::err_ext_vector_component_exceeds_length)
- << baseType << SourceRange(CompLoc);
- return QualType();
- }
- }
- }
-
- // The component accessor looks fine - now we need to compute the actual type.
- // The vector type is implied by the component accessor. For example,
- // vec4.b is a float, vec4.xy is a vec2, vec4.rgb is a vec3, etc.
- // vec4.s0 is a float, vec4.s23 is a vec3, etc.
- // vec4.hi, vec4.lo, vec4.e, and vec4.o all return vec2.
- unsigned CompSize = HalvingSwizzle ? (vecType->getNumElements() + 1) / 2
- : CompName->getLength();
- if (HexSwizzle)
- CompSize--;
-
- if (CompSize == 1)
- return vecType->getElementType();
-
- if (HasRepeated) VK = VK_RValue;
-
- QualType VT = S.Context.getExtVectorType(vecType->getElementType(), CompSize);
- // Now look up the TypeDefDecl from the vector type. Without this,
- // diagostics look bad. We want extended vector types to appear built-in.
- for (unsigned i = 0, E = S.ExtVectorDecls.size(); i != E; ++i) {
- if (S.ExtVectorDecls[i]->getUnderlyingType() == VT)
- return S.Context.getTypedefType(S.ExtVectorDecls[i]);
- }
- return VT; // should never get here (a typedef type should always be found).
-}
-
-static Decl *FindGetterSetterNameDeclFromProtocolList(const ObjCProtocolDecl*PDecl,
- IdentifierInfo *Member,
- const Selector &Sel,
- ASTContext &Context) {
- if (Member)
- if (ObjCPropertyDecl *PD = PDecl->FindPropertyDeclaration(Member))
- return PD;
- if (ObjCMethodDecl *OMD = PDecl->getInstanceMethod(Sel))
- return OMD;
-
- for (ObjCProtocolDecl::protocol_iterator I = PDecl->protocol_begin(),
- E = PDecl->protocol_end(); I != E; ++I) {
- if (Decl *D = FindGetterSetterNameDeclFromProtocolList(*I, Member, Sel,
- Context))
- return D;
- }
- return 0;
-}
-
-static Decl *FindGetterSetterNameDecl(const ObjCObjectPointerType *QIdTy,
- IdentifierInfo *Member,
- const Selector &Sel,
- ASTContext &Context) {
- // Check protocols on qualified interfaces.
- Decl *GDecl = 0;
- for (ObjCObjectPointerType::qual_iterator I = QIdTy->qual_begin(),
- E = QIdTy->qual_end(); I != E; ++I) {
- if (Member)
- if (ObjCPropertyDecl *PD = (*I)->FindPropertyDeclaration(Member)) {
- GDecl = PD;
- break;
- }
- // Also must look for a getter or setter name which uses property syntax.
- if (ObjCMethodDecl *OMD = (*I)->getInstanceMethod(Sel)) {
- GDecl = OMD;
- break;
- }
- }
- if (!GDecl) {
- for (ObjCObjectPointerType::qual_iterator I = QIdTy->qual_begin(),
- E = QIdTy->qual_end(); I != E; ++I) {
- // Search in the protocol-qualifier list of current protocol.
- GDecl = FindGetterSetterNameDeclFromProtocolList(*I, Member, Sel,
- Context);
- if (GDecl)
- return GDecl;
- }
- }
- return GDecl;
-}
-
-ExprResult
-Sema::ActOnDependentMemberExpr(Expr *BaseExpr, QualType BaseType,
- bool IsArrow, SourceLocation OpLoc,
- const CXXScopeSpec &SS,
- NamedDecl *FirstQualifierInScope,
- const DeclarationNameInfo &NameInfo,
- const TemplateArgumentListInfo *TemplateArgs) {
- // Even in dependent contexts, try to diagnose base expressions with
- // obviously wrong types, e.g.:
- //
- // T* t;
- // t.f;
- //
- // In Obj-C++, however, the above expression is valid, since it could be
- // accessing the 'f' property if T is an Obj-C interface. The extra check
- // allows this, while still reporting an error if T is a struct pointer.
- if (!IsArrow) {
- const PointerType *PT = BaseType->getAs<PointerType>();
- if (PT && (!getLangOptions().ObjC1 ||
- PT->getPointeeType()->isRecordType())) {
- assert(BaseExpr && "cannot happen with implicit member accesses");
- Diag(NameInfo.getLoc(), diag::err_typecheck_member_reference_struct_union)
- << BaseType << BaseExpr->getSourceRange();
- return ExprError();
- }
- }
-
- assert(BaseType->isDependentType() ||
- NameInfo.getName().isDependentName() ||
- isDependentScopeSpecifier(SS));
-
- // Get the type being accessed in BaseType. If this is an arrow, the BaseExpr
- // must have pointer type, and the accessed type is the pointee.
- return Owned(CXXDependentScopeMemberExpr::Create(Context, BaseExpr, BaseType,
- IsArrow, OpLoc,
- SS.getWithLocInContext(Context),
- FirstQualifierInScope,
- NameInfo, TemplateArgs));
-}
-
-/// We know that the given qualified member reference points only to
-/// declarations which do not belong to the static type of the base
-/// expression. Diagnose the problem.
-static void DiagnoseQualifiedMemberReference(Sema &SemaRef,
- Expr *BaseExpr,
- QualType BaseType,
- const CXXScopeSpec &SS,
- NamedDecl *rep,
- const DeclarationNameInfo &nameInfo) {
- // If this is an implicit member access, use a different set of
- // diagnostics.
- if (!BaseExpr)
- return DiagnoseInstanceReference(SemaRef, SS, rep, nameInfo);
-
- SemaRef.Diag(nameInfo.getLoc(), diag::err_qualified_member_of_unrelated)
- << SS.getRange() << rep << BaseType;
-}
-
-// Check whether the declarations we found through a nested-name
-// specifier in a member expression are actually members of the base
-// type. The restriction here is:
-//
-// C++ [expr.ref]p2:
-// ... In these cases, the id-expression shall name a
-// member of the class or of one of its base classes.
-//
-// So it's perfectly legitimate for the nested-name specifier to name
-// an unrelated class, and for us to find an overload set including
-// decls from classes which are not superclasses, as long as the decl
-// we actually pick through overload resolution is from a superclass.
-bool Sema::CheckQualifiedMemberReference(Expr *BaseExpr,
- QualType BaseType,
- const CXXScopeSpec &SS,
- const LookupResult &R) {
- const RecordType *BaseRT = BaseType->getAs<RecordType>();
- if (!BaseRT) {
- // We can't check this yet because the base type is still
- // dependent.
- assert(BaseType->isDependentType());
- return false;
- }
- CXXRecordDecl *BaseRecord = cast<CXXRecordDecl>(BaseRT->getDecl());
-
- for (LookupResult::iterator I = R.begin(), E = R.end(); I != E; ++I) {
- // If this is an implicit member reference and we find a
- // non-instance member, it's not an error.
- if (!BaseExpr && !(*I)->isCXXInstanceMember())
- return false;
-
- // Note that we use the DC of the decl, not the underlying decl.
- DeclContext *DC = (*I)->getDeclContext();
- while (DC->isTransparentContext())
- DC = DC->getParent();
-
- if (!DC->isRecord())
- continue;
-
- llvm::SmallPtrSet<CXXRecordDecl*,4> MemberRecord;
- MemberRecord.insert(cast<CXXRecordDecl>(DC)->getCanonicalDecl());
-
- if (!IsProvablyNotDerivedFrom(*this, BaseRecord, MemberRecord))
- return false;
- }
-
- DiagnoseQualifiedMemberReference(*this, BaseExpr, BaseType, SS,
- R.getRepresentativeDecl(),
- R.getLookupNameInfo());
- return true;
-}
-
-static bool
-LookupMemberExprInRecord(Sema &SemaRef, LookupResult &R,
- SourceRange BaseRange, const RecordType *RTy,
- SourceLocation OpLoc, CXXScopeSpec &SS,
- bool HasTemplateArgs) {
- RecordDecl *RDecl = RTy->getDecl();
- if (SemaRef.RequireCompleteType(OpLoc, QualType(RTy, 0),
- SemaRef.PDiag(diag::err_typecheck_incomplete_tag)
- << BaseRange))
- return true;
-
- if (HasTemplateArgs) {
- // LookupTemplateName doesn't expect these both to exist simultaneously.
- QualType ObjectType = SS.isSet() ? QualType() : QualType(RTy, 0);
-
- bool MOUS;
- SemaRef.LookupTemplateName(R, 0, SS, ObjectType, false, MOUS);
- return false;
- }
-
- DeclContext *DC = RDecl;
- if (SS.isSet()) {
- // If the member name was a qualified-id, look into the
- // nested-name-specifier.
- DC = SemaRef.computeDeclContext(SS, false);
-
- if (SemaRef.RequireCompleteDeclContext(SS, DC)) {
- SemaRef.Diag(SS.getRange().getEnd(), diag::err_typecheck_incomplete_tag)
- << SS.getRange() << DC;
- return true;
- }
-
- assert(DC && "Cannot handle non-computable dependent contexts in lookup");
-
- if (!isa<TypeDecl>(DC)) {
- SemaRef.Diag(R.getNameLoc(), diag::err_qualified_member_nonclass)
- << DC << SS.getRange();
- return true;
- }
- }
-
- // The record definition is complete, now look up the member.
- SemaRef.LookupQualifiedName(R, DC);
-
- if (!R.empty())
- return false;
-
- // We didn't find anything with the given name, so try to correct
- // for typos.
- DeclarationName Name = R.getLookupName();
- if (SemaRef.CorrectTypo(R, 0, &SS, DC, false, Sema::CTC_MemberLookup) &&
- !R.empty() &&
- (isa<ValueDecl>(*R.begin()) || isa<FunctionTemplateDecl>(*R.begin()))) {
- SemaRef.Diag(R.getNameLoc(), diag::err_no_member_suggest)
- << Name << DC << R.getLookupName() << SS.getRange()
- << FixItHint::CreateReplacement(R.getNameLoc(),
- R.getLookupName().getAsString());
- if (NamedDecl *ND = R.getAsSingle<NamedDecl>())
- SemaRef.Diag(ND->getLocation(), diag::note_previous_decl)
- << ND->getDeclName();
- return false;
- } else {
- R.clear();
- R.setLookupName(Name);
- }
-
- return false;
-}
-
-ExprResult
-Sema::BuildMemberReferenceExpr(Expr *Base, QualType BaseType,
- SourceLocation OpLoc, bool IsArrow,
- CXXScopeSpec &SS,
- NamedDecl *FirstQualifierInScope,
- const DeclarationNameInfo &NameInfo,
- const TemplateArgumentListInfo *TemplateArgs) {
- if (BaseType->isDependentType() ||
- (SS.isSet() && isDependentScopeSpecifier(SS)))
- return ActOnDependentMemberExpr(Base, BaseType,
- IsArrow, OpLoc,
- SS, FirstQualifierInScope,
- NameInfo, TemplateArgs);
-
- LookupResult R(*this, NameInfo, LookupMemberName);
-
- // Implicit member accesses.
- if (!Base) {
- QualType RecordTy = BaseType;
- if (IsArrow) RecordTy = RecordTy->getAs<PointerType>()->getPointeeType();
- if (LookupMemberExprInRecord(*this, R, SourceRange(),
- RecordTy->getAs<RecordType>(),
- OpLoc, SS, TemplateArgs != 0))
- return ExprError();
-
- // Explicit member accesses.
- } else {
- ExprResult BaseResult = Owned(Base);
- ExprResult Result =
- LookupMemberExpr(R, BaseResult, IsArrow, OpLoc,
- SS, /*ObjCImpDecl*/ 0, TemplateArgs != 0);
-
- if (BaseResult.isInvalid())
- return ExprError();
- Base = BaseResult.take();
-
- if (Result.isInvalid()) {
- Owned(Base);
- return ExprError();
- }
-
- if (Result.get())
- return move(Result);
-
- // LookupMemberExpr can modify Base, and thus change BaseType
- BaseType = Base->getType();
- }
-
- return BuildMemberReferenceExpr(Base, BaseType,
- OpLoc, IsArrow, SS, FirstQualifierInScope,
- R, TemplateArgs);
-}
-
-ExprResult
-Sema::BuildMemberReferenceExpr(Expr *BaseExpr, QualType BaseExprType,
- SourceLocation OpLoc, bool IsArrow,
- const CXXScopeSpec &SS,
- NamedDecl *FirstQualifierInScope,
- LookupResult &R,
- const TemplateArgumentListInfo *TemplateArgs,
- bool SuppressQualifierCheck) {
- QualType BaseType = BaseExprType;
- if (IsArrow) {
- assert(BaseType->isPointerType());
- BaseType = BaseType->getAs<PointerType>()->getPointeeType();
- }
- R.setBaseObjectType(BaseType);
-
- const DeclarationNameInfo &MemberNameInfo = R.getLookupNameInfo();
- DeclarationName MemberName = MemberNameInfo.getName();
- SourceLocation MemberLoc = MemberNameInfo.getLoc();
-
- if (R.isAmbiguous())
- return ExprError();
-
- if (R.empty()) {
- // Rederive where we looked up.
- DeclContext *DC = (SS.isSet()
- ? computeDeclContext(SS, false)
- : BaseType->getAs<RecordType>()->getDecl());
-
- Diag(R.getNameLoc(), diag::err_no_member)
- << MemberName << DC
- << (BaseExpr ? BaseExpr->getSourceRange() : SourceRange());
- return ExprError();
- }
-
- // Diagnose lookups that find only declarations from a non-base
- // type. This is possible for either qualified lookups (which may
- // have been qualified with an unrelated type) or implicit member
- // expressions (which were found with unqualified lookup and thus
- // may have come from an enclosing scope). Note that it's okay for
- // lookup to find declarations from a non-base type as long as those
- // aren't the ones picked by overload resolution.
- if ((SS.isSet() || !BaseExpr ||
- (isa<CXXThisExpr>(BaseExpr) &&
- cast<CXXThisExpr>(BaseExpr)->isImplicit())) &&
- !SuppressQualifierCheck &&
- CheckQualifiedMemberReference(BaseExpr, BaseType, SS, R))
- return ExprError();
-
- // Construct an unresolved result if we in fact got an unresolved
- // result.
- if (R.isOverloadedResult() || R.isUnresolvableResult()) {
- // Suppress any lookup-related diagnostics; we'll do these when we
- // pick a member.
- R.suppressDiagnostics();
-
- UnresolvedMemberExpr *MemExpr
- = UnresolvedMemberExpr::Create(Context, R.isUnresolvableResult(),
- BaseExpr, BaseExprType,
- IsArrow, OpLoc,
- SS.getWithLocInContext(Context),
- MemberNameInfo,
- TemplateArgs, R.begin(), R.end());
-
- return Owned(MemExpr);
- }
-
- assert(R.isSingleResult());
- DeclAccessPair FoundDecl = R.begin().getPair();
- NamedDecl *MemberDecl = R.getFoundDecl();
-
- // FIXME: diagnose the presence of template arguments now.
-
- // If the decl being referenced had an error, return an error for this
- // sub-expr without emitting another error, in order to avoid cascading
- // error cases.
- if (MemberDecl->isInvalidDecl())
- return ExprError();
-
- // Handle the implicit-member-access case.
- if (!BaseExpr) {
- // If this is not an instance member, convert to a non-member access.
- if (!MemberDecl->isCXXInstanceMember())
- return BuildDeclarationNameExpr(SS, R.getLookupNameInfo(), MemberDecl);
-
- SourceLocation Loc = R.getNameLoc();
- if (SS.getRange().isValid())
- Loc = SS.getRange().getBegin();
- BaseExpr = new (Context) CXXThisExpr(Loc, BaseExprType,/*isImplicit=*/true);
- }
-
- bool ShouldCheckUse = true;
- if (CXXMethodDecl *MD = dyn_cast<CXXMethodDecl>(MemberDecl)) {
- // Don't diagnose the use of a virtual member function unless it's
- // explicitly qualified.
- if (MD->isVirtual() && !SS.isSet())
- ShouldCheckUse = false;
- }
-
- // Check the use of this member.
- if (ShouldCheckUse && DiagnoseUseOfDecl(MemberDecl, MemberLoc)) {
- Owned(BaseExpr);
- return ExprError();
- }
-
- // Perform a property load on the base regardless of whether we
- // actually need it for the declaration.
- if (BaseExpr->getObjectKind() == OK_ObjCProperty) {
- ExprResult Result = ConvertPropertyForRValue(BaseExpr);
- if (Result.isInvalid())
- return ExprError();
- BaseExpr = Result.take();
- }
-
- if (FieldDecl *FD = dyn_cast<FieldDecl>(MemberDecl))
- return BuildFieldReferenceExpr(*this, BaseExpr, IsArrow,
- SS, FD, FoundDecl, MemberNameInfo);
-
- if (IndirectFieldDecl *FD = dyn_cast<IndirectFieldDecl>(MemberDecl))
- // We may have found a field within an anonymous union or struct
- // (C++ [class.union]).
- return BuildAnonymousStructUnionMemberReference(SS, MemberLoc, FD,
- BaseExpr, OpLoc);
-
- if (VarDecl *Var = dyn_cast<VarDecl>(MemberDecl)) {
- MarkDeclarationReferenced(MemberLoc, Var);
- return Owned(BuildMemberExpr(Context, BaseExpr, IsArrow, SS,
- Var, FoundDecl, MemberNameInfo,
- Var->getType().getNonReferenceType(),
- VK_LValue, OK_Ordinary));
- }
-
- if (CXXMethodDecl *MemberFn = dyn_cast<CXXMethodDecl>(MemberDecl)) {
- ExprValueKind valueKind;
- QualType type;
- if (MemberFn->isInstance()) {
- valueKind = VK_RValue;
- type = Context.BoundMemberTy;
- } else {
- valueKind = VK_LValue;
- type = MemberFn->getType();
- }
-
- MarkDeclarationReferenced(MemberLoc, MemberDecl);
- return Owned(BuildMemberExpr(Context, BaseExpr, IsArrow, SS,
- MemberFn, FoundDecl, MemberNameInfo,
- type, valueKind, OK_Ordinary));
- }
- assert(!isa<FunctionDecl>(MemberDecl) && "member function not C++ method?");
-
- if (EnumConstantDecl *Enum = dyn_cast<EnumConstantDecl>(MemberDecl)) {
- MarkDeclarationReferenced(MemberLoc, MemberDecl);
- return Owned(BuildMemberExpr(Context, BaseExpr, IsArrow, SS,
- Enum, FoundDecl, MemberNameInfo,
- Enum->getType(), VK_RValue, OK_Ordinary));
- }
-
- Owned(BaseExpr);
-
- // We found something that we didn't expect. Complain.
- if (isa<TypeDecl>(MemberDecl))
- Diag(MemberLoc, diag::err_typecheck_member_reference_type)
- << MemberName << BaseType << int(IsArrow);
- else
- Diag(MemberLoc, diag::err_typecheck_member_reference_unknown)
- << MemberName << BaseType << int(IsArrow);
-
- Diag(MemberDecl->getLocation(), diag::note_member_declared_here)
- << MemberName;
- R.suppressDiagnostics();
- return ExprError();
-}
-
-/// Given that normal member access failed on the given expression,
-/// and given that the expression's type involves builtin-id or
-/// builtin-Class, decide whether substituting in the redefinition
-/// types would be profitable. The redefinition type is whatever
-/// this translation unit tried to typedef to id/Class; we store
-/// it to the side and then re-use it in places like this.
-static bool ShouldTryAgainWithRedefinitionType(Sema &S, ExprResult &base) {
- const ObjCObjectPointerType *opty
- = base.get()->getType()->getAs<ObjCObjectPointerType>();
- if (!opty) return false;
-
- const ObjCObjectType *ty = opty->getObjectType();
-
- QualType redef;
- if (ty->isObjCId()) {
- redef = S.Context.ObjCIdRedefinitionType;
- } else if (ty->isObjCClass()) {
- redef = S.Context.ObjCClassRedefinitionType;
- } else {
- return false;
- }
-
- // Do the substitution as long as the redefinition type isn't just a
- // possibly-qualified pointer to builtin-id or builtin-Class again.
- opty = redef->getAs<ObjCObjectPointerType>();
- if (opty && !opty->getObjectType()->getInterface() != 0)
- return false;
-
- base = S.ImpCastExprToType(base.take(), redef, CK_BitCast);
- return true;
-}
-
-/// Look up the given member of the given non-type-dependent
-/// expression. This can return in one of two ways:
-/// * If it returns a sentinel null-but-valid result, the caller will
-/// assume that lookup was performed and the results written into
-/// the provided structure. It will take over from there.
-/// * Otherwise, the returned expression will be produced in place of
-/// an ordinary member expression.
-///
-/// The ObjCImpDecl bit is a gross hack that will need to be properly
-/// fixed for ObjC++.
-ExprResult
-Sema::LookupMemberExpr(LookupResult &R, ExprResult &BaseExpr,
- bool &IsArrow, SourceLocation OpLoc,
- CXXScopeSpec &SS,
- Decl *ObjCImpDecl, bool HasTemplateArgs) {
- assert(BaseExpr.get() && "no base expression");
-
- // Perform default conversions.
- BaseExpr = DefaultFunctionArrayConversion(BaseExpr.take());
-
- if (IsArrow) {
- BaseExpr = DefaultLvalueConversion(BaseExpr.take());
- if (BaseExpr.isInvalid())
- return ExprError();
- }
-
- QualType BaseType = BaseExpr.get()->getType();
- assert(!BaseType->isDependentType());
-
- DeclarationName MemberName = R.getLookupName();
- SourceLocation MemberLoc = R.getNameLoc();
-
- // For later type-checking purposes, turn arrow accesses into dot
- // accesses. The only access type we support that doesn't follow
- // the C equivalence "a->b === (*a).b" is ObjC property accesses,
- // and those never use arrows, so this is unaffected.
- if (IsArrow) {
- if (const PointerType *Ptr = BaseType->getAs<PointerType>())
- BaseType = Ptr->getPointeeType();
- else if (const ObjCObjectPointerType *Ptr
- = BaseType->getAs<ObjCObjectPointerType>())
- BaseType = Ptr->getPointeeType();
- else if (BaseType->isRecordType()) {
- // Recover from arrow accesses to records, e.g.:
- // struct MyRecord foo;
- // foo->bar
- // This is actually well-formed in C++ if MyRecord has an
- // overloaded operator->, but that should have been dealt with
- // by now.
- Diag(OpLoc, diag::err_typecheck_member_reference_suggestion)
- << BaseType << int(IsArrow) << BaseExpr.get()->getSourceRange()
- << FixItHint::CreateReplacement(OpLoc, ".");
- IsArrow = false;
- } else if (BaseType == Context.BoundMemberTy) {
- goto fail;
- } else {
- Diag(MemberLoc, diag::err_typecheck_member_reference_arrow)
- << BaseType << BaseExpr.get()->getSourceRange();
- return ExprError();
- }
- }
-
- // Handle field access to simple records.
- if (const RecordType *RTy = BaseType->getAs<RecordType>()) {
- if (LookupMemberExprInRecord(*this, R, BaseExpr.get()->getSourceRange(),
- RTy, OpLoc, SS, HasTemplateArgs))
- return ExprError();
-
- // Returning valid-but-null is how we indicate to the caller that
- // the lookup result was filled in.
- return Owned((Expr*) 0);
- }
-
- // Handle ivar access to Objective-C objects.
- if (const ObjCObjectType *OTy = BaseType->getAs<ObjCObjectType>()) {
- IdentifierInfo *Member = MemberName.getAsIdentifierInfo();
-
- // There are three cases for the base type:
- // - builtin id (qualified or unqualified)
- // - builtin Class (qualified or unqualified)
- // - an interface
- ObjCInterfaceDecl *IDecl = OTy->getInterface();
- if (!IDecl) {
- // There's an implicit 'isa' ivar on all objects.
- // But we only actually find it this way on objects of type 'id',
- // apparently.
- if (OTy->isObjCId() && Member->isStr("isa"))
- return Owned(new (Context) ObjCIsaExpr(BaseExpr.take(), IsArrow, MemberLoc,
- Context.getObjCClassType()));
-
- if (ShouldTryAgainWithRedefinitionType(*this, BaseExpr))
- return LookupMemberExpr(R, BaseExpr, IsArrow, OpLoc, SS,
- ObjCImpDecl, HasTemplateArgs);
- goto fail;
- }
-
- ObjCInterfaceDecl *ClassDeclared;
- ObjCIvarDecl *IV = IDecl->lookupInstanceVariable(Member, ClassDeclared);
-
- if (!IV) {
- // Attempt to correct for typos in ivar names.
- LookupResult Res(*this, R.getLookupName(), R.getNameLoc(),
- LookupMemberName);
- if (CorrectTypo(Res, 0, 0, IDecl, false,
- IsArrow ? CTC_ObjCIvarLookup
- : CTC_ObjCPropertyLookup) &&
- (IV = Res.getAsSingle<ObjCIvarDecl>())) {
- Diag(R.getNameLoc(),
- diag::err_typecheck_member_reference_ivar_suggest)
- << IDecl->getDeclName() << MemberName << IV->getDeclName()
- << FixItHint::CreateReplacement(R.getNameLoc(),
- IV->getNameAsString());
- Diag(IV->getLocation(), diag::note_previous_decl)
- << IV->getDeclName();
- } else {
- Res.clear();
- Res.setLookupName(Member);
-
- Diag(MemberLoc, diag::err_typecheck_member_reference_ivar)
- << IDecl->getDeclName() << MemberName
- << BaseExpr.get()->getSourceRange();
- return ExprError();
- }
- }
-
- // If the decl being referenced had an error, return an error for this
- // sub-expr without emitting another error, in order to avoid cascading
- // error cases.
- if (IV->isInvalidDecl())
- return ExprError();
-
- // Check whether we can reference this field.
- if (DiagnoseUseOfDecl(IV, MemberLoc))
- return ExprError();
- if (IV->getAccessControl() != ObjCIvarDecl::Public &&
- IV->getAccessControl() != ObjCIvarDecl::Package) {
- ObjCInterfaceDecl *ClassOfMethodDecl = 0;
- if (ObjCMethodDecl *MD = getCurMethodDecl())
- ClassOfMethodDecl = MD->getClassInterface();
- else if (ObjCImpDecl && getCurFunctionDecl()) {
- // Case of a c-function declared inside an objc implementation.
- // FIXME: For a c-style function nested inside an objc implementation
- // class, there is no implementation context available, so we pass
- // down the context as argument to this routine. Ideally, this context
- // need be passed down in the AST node and somehow calculated from the
- // AST for a function decl.
- if (ObjCImplementationDecl *IMPD =
- dyn_cast<ObjCImplementationDecl>(ObjCImpDecl))
- ClassOfMethodDecl = IMPD->getClassInterface();
- else if (ObjCCategoryImplDecl* CatImplClass =
- dyn_cast<ObjCCategoryImplDecl>(ObjCImpDecl))
- ClassOfMethodDecl = CatImplClass->getClassInterface();
- }
-
- if (IV->getAccessControl() == ObjCIvarDecl::Private) {
- if (ClassDeclared != IDecl ||
- ClassOfMethodDecl != ClassDeclared)
- Diag(MemberLoc, diag::error_private_ivar_access)
- << IV->getDeclName();
- } else if (!IDecl->isSuperClassOf(ClassOfMethodDecl))
- // @protected
- Diag(MemberLoc, diag::error_protected_ivar_access)
- << IV->getDeclName();
- }
-
- return Owned(new (Context) ObjCIvarRefExpr(IV, IV->getType(),
- MemberLoc, BaseExpr.take(),
- IsArrow));
- }
-
- // Objective-C property access.
- const ObjCObjectPointerType *OPT;
- if (!IsArrow && (OPT = BaseType->getAs<ObjCObjectPointerType>())) {
- // This actually uses the base as an r-value.
- BaseExpr = DefaultLvalueConversion(BaseExpr.take());
- if (BaseExpr.isInvalid())
- return ExprError();
-
- assert(Context.hasSameUnqualifiedType(BaseType, BaseExpr.get()->getType()));
-
- IdentifierInfo *Member = MemberName.getAsIdentifierInfo();
-
- const ObjCObjectType *OT = OPT->getObjectType();
-
- // id, with and without qualifiers.
- if (OT->isObjCId()) {
- // Check protocols on qualified interfaces.
- Selector Sel = PP.getSelectorTable().getNullarySelector(Member);
- if (Decl *PMDecl = FindGetterSetterNameDecl(OPT, Member, Sel, Context)) {
- if (ObjCPropertyDecl *PD = dyn_cast<ObjCPropertyDecl>(PMDecl)) {
- // Check the use of this declaration
- if (DiagnoseUseOfDecl(PD, MemberLoc))
- return ExprError();
-
- QualType T = PD->getType();
- if (ObjCMethodDecl *Getter = PD->getGetterMethodDecl())
- T = getMessageSendResultType(BaseType, Getter, false, false);
-
- return Owned(new (Context) ObjCPropertyRefExpr(PD, T,
- VK_LValue,
- OK_ObjCProperty,
- MemberLoc,
- BaseExpr.take()));
- }
-
- if (ObjCMethodDecl *OMD = dyn_cast<ObjCMethodDecl>(PMDecl)) {
- // Check the use of this method.
- if (DiagnoseUseOfDecl(OMD, MemberLoc))
- return ExprError();
- Selector SetterSel =
- SelectorTable::constructSetterName(PP.getIdentifierTable(),
- PP.getSelectorTable(), Member);
- ObjCMethodDecl *SMD = 0;
- if (Decl *SDecl = FindGetterSetterNameDecl(OPT, /*Property id*/0,
- SetterSel, Context))
- SMD = dyn_cast<ObjCMethodDecl>(SDecl);
- QualType PType = getMessageSendResultType(BaseType, OMD, false,
- false);
-
- ExprValueKind VK = VK_LValue;
- if (!getLangOptions().CPlusPlus &&
- IsCForbiddenLValueType(Context, PType))
- VK = VK_RValue;
- ExprObjectKind OK = (VK == VK_RValue ? OK_Ordinary : OK_ObjCProperty);
-
- return Owned(new (Context) ObjCPropertyRefExpr(OMD, SMD, PType,
- VK, OK,
- MemberLoc, BaseExpr.take()));
- }
- }
- // Use of id.member can only be for a property reference. Do not
- // use the 'id' redefinition in this case.
- if (IsArrow && ShouldTryAgainWithRedefinitionType(*this, BaseExpr))
- return LookupMemberExpr(R, BaseExpr, IsArrow, OpLoc, SS,
- ObjCImpDecl, HasTemplateArgs);
-
- return ExprError(Diag(MemberLoc, diag::err_property_not_found)
- << MemberName << BaseType);
- }
-
- // 'Class', unqualified only.
- if (OT->isObjCClass()) {
- // Only works in a method declaration (??!).
- ObjCMethodDecl *MD = getCurMethodDecl();
- if (!MD) {
- if (ShouldTryAgainWithRedefinitionType(*this, BaseExpr))
- return LookupMemberExpr(R, BaseExpr, IsArrow, OpLoc, SS,
- ObjCImpDecl, HasTemplateArgs);
-
- goto fail;
- }
-
- // Also must look for a getter name which uses property syntax.
- Selector Sel = PP.getSelectorTable().getNullarySelector(Member);
- ObjCInterfaceDecl *IFace = MD->getClassInterface();
- ObjCMethodDecl *Getter;
- if ((Getter = IFace->lookupClassMethod(Sel))) {
- // Check the use of this method.
- if (DiagnoseUseOfDecl(Getter, MemberLoc))
- return ExprError();
- } else
- Getter = IFace->lookupPrivateMethod(Sel, false);
- // If we found a getter then this may be a valid dot-reference, we
- // will look for the matching setter, in case it is needed.
- Selector SetterSel =
- SelectorTable::constructSetterName(PP.getIdentifierTable(),
- PP.getSelectorTable(), Member);
- ObjCMethodDecl *Setter = IFace->lookupClassMethod(SetterSel);
- if (!Setter) {
- // If this reference is in an @implementation, also check for 'private'
- // methods.
- Setter = IFace->lookupPrivateMethod(SetterSel, false);
- }
- // Look through local category implementations associated with the class.
- if (!Setter)
- Setter = IFace->getCategoryClassMethod(SetterSel);
-
- if (Setter && DiagnoseUseOfDecl(Setter, MemberLoc))
- return ExprError();
-
- if (Getter || Setter) {
- QualType PType;
-
- ExprValueKind VK = VK_LValue;
- if (Getter) {
- PType = getMessageSendResultType(QualType(OT, 0), Getter, true,
- false);
- if (!getLangOptions().CPlusPlus &&
- IsCForbiddenLValueType(Context, PType))
- VK = VK_RValue;
- } else {
- // Get the expression type from Setter's incoming parameter.
- PType = (*(Setter->param_end() -1))->getType();
- }
- ExprObjectKind OK = (VK == VK_RValue ? OK_Ordinary : OK_ObjCProperty);
-
- // FIXME: we must check that the setter has property type.
- return Owned(new (Context) ObjCPropertyRefExpr(Getter, Setter,
- PType, VK, OK,
- MemberLoc, BaseExpr.take()));
- }
-
- if (ShouldTryAgainWithRedefinitionType(*this, BaseExpr))
- return LookupMemberExpr(R, BaseExpr, IsArrow, OpLoc, SS,
- ObjCImpDecl, HasTemplateArgs);
-
- return ExprError(Diag(MemberLoc, diag::err_property_not_found)
- << MemberName << BaseType);
- }
-
- // Normal property access.
- return HandleExprPropertyRefExpr(OPT, BaseExpr.get(), MemberName, MemberLoc,
- SourceLocation(), QualType(), false);
- }
-
- // Handle 'field access' to vectors, such as 'V.xx'.
- if (BaseType->isExtVectorType()) {
- // FIXME: this expr should store IsArrow.
- IdentifierInfo *Member = MemberName.getAsIdentifierInfo();
- ExprValueKind VK = (IsArrow ? VK_LValue : BaseExpr.get()->getValueKind());
- QualType ret = CheckExtVectorComponent(*this, BaseType, VK, OpLoc,
- Member, MemberLoc);
- if (ret.isNull())
- return ExprError();
-
- return Owned(new (Context) ExtVectorElementExpr(ret, VK, BaseExpr.take(),
- *Member, MemberLoc));
- }
-
- // Adjust builtin-sel to the appropriate redefinition type if that's
- // not just a pointer to builtin-sel again.
- if (IsArrow &&
- BaseType->isSpecificBuiltinType(BuiltinType::ObjCSel) &&
- !Context.ObjCSelRedefinitionType->isObjCSelType()) {
- BaseExpr = ImpCastExprToType(BaseExpr.take(), Context.ObjCSelRedefinitionType,
- CK_BitCast);
- return LookupMemberExpr(R, BaseExpr, IsArrow, OpLoc, SS,
- ObjCImpDecl, HasTemplateArgs);
- }
-
- // Failure cases.
- fail:
-
- // Recover from dot accesses to pointers, e.g.:
- // type *foo;
- // foo.bar
- // This is actually well-formed in two cases:
- // - 'type' is an Objective C type
- // - 'bar' is a pseudo-destructor name which happens to refer to
- // the appropriate pointer type
- if (const PointerType *Ptr = BaseType->getAs<PointerType>()) {
- if (!IsArrow && Ptr->getPointeeType()->isRecordType() &&
- MemberName.getNameKind() != DeclarationName::CXXDestructorName) {
- Diag(OpLoc, diag::err_typecheck_member_reference_suggestion)
- << BaseType << int(IsArrow) << BaseExpr.get()->getSourceRange()
- << FixItHint::CreateReplacement(OpLoc, "->");
-
- // Recurse as an -> access.
- IsArrow = true;
- return LookupMemberExpr(R, BaseExpr, IsArrow, OpLoc, SS,
- ObjCImpDecl, HasTemplateArgs);
- }
- }
-
- // If the user is trying to apply -> or . to a function name, it's probably
- // because they forgot parentheses to call that function.
- QualType ZeroArgCallTy;
- UnresolvedSet<4> Overloads;
- if (isExprCallable(*BaseExpr.get(), ZeroArgCallTy, Overloads)) {
- if (ZeroArgCallTy.isNull()) {
- Diag(BaseExpr.get()->getExprLoc(), diag::err_member_reference_needs_call)
- << (Overloads.size() > 1) << 0 << BaseExpr.get()->getSourceRange();
- UnresolvedSet<2> PlausibleOverloads;
- for (OverloadExpr::decls_iterator It = Overloads.begin(),
- DeclsEnd = Overloads.end(); It != DeclsEnd; ++It) {
- const FunctionDecl *OverloadDecl = cast<FunctionDecl>(*It);
- QualType OverloadResultTy = OverloadDecl->getResultType();
- if ((!IsArrow && OverloadResultTy->isRecordType()) ||
- (IsArrow && OverloadResultTy->isPointerType() &&
- OverloadResultTy->getPointeeType()->isRecordType()))
- PlausibleOverloads.addDecl(It.getDecl());
- }
- NoteOverloads(PlausibleOverloads, BaseExpr.get()->getExprLoc());
- return ExprError();
- }
- if ((!IsArrow && ZeroArgCallTy->isRecordType()) ||
- (IsArrow && ZeroArgCallTy->isPointerType() &&
- ZeroArgCallTy->getPointeeType()->isRecordType())) {
- // At this point, we know BaseExpr looks like it's potentially callable
- // with 0 arguments, and that it returns something of a reasonable type,
- // so we can emit a fixit and carry on pretending that BaseExpr was
- // actually a CallExpr.
- SourceLocation ParenInsertionLoc =
- PP.getLocForEndOfToken(BaseExpr.get()->getLocEnd());
- Diag(BaseExpr.get()->getExprLoc(), diag::err_member_reference_needs_call)
- << (Overloads.size() > 1) << 1 << BaseExpr.get()->getSourceRange()
- << FixItHint::CreateInsertion(ParenInsertionLoc, "()");
- // FIXME: Try this before emitting the fixit, and suppress diagnostics
- // while doing so.
- ExprResult NewBase =
- ActOnCallExpr(0, BaseExpr.take(), ParenInsertionLoc,
- MultiExprArg(*this, 0, 0),
- ParenInsertionLoc.getFileLocWithOffset(1));
- if (NewBase.isInvalid())
- return ExprError();
- BaseExpr = NewBase;
- BaseExpr = DefaultFunctionArrayConversion(BaseExpr.take());
- return LookupMemberExpr(R, BaseExpr, IsArrow, OpLoc, SS,
- ObjCImpDecl, HasTemplateArgs);
- }
- }
-
- Diag(MemberLoc, diag::err_typecheck_member_reference_struct_union)
- << BaseType << BaseExpr.get()->getSourceRange();
-
- return ExprError();
-}
-
-/// The main callback when the parser finds something like
-/// expression . [nested-name-specifier] identifier
-/// expression -> [nested-name-specifier] identifier
-/// where 'identifier' encompasses a fairly broad spectrum of
-/// possibilities, including destructor and operator references.
-///
-/// \param OpKind either tok::arrow or tok::period
-/// \param HasTrailingLParen whether the next token is '(', which
-/// is used to diagnose mis-uses of special members that can
-/// only be called
-/// \param ObjCImpDecl the current ObjC @implementation decl;
-/// this is an ugly hack around the fact that ObjC @implementations
-/// aren't properly put in the context chain
-ExprResult Sema::ActOnMemberAccessExpr(Scope *S, Expr *Base,
- SourceLocation OpLoc,
- tok::TokenKind OpKind,
- CXXScopeSpec &SS,
- UnqualifiedId &Id,
- Decl *ObjCImpDecl,
- bool HasTrailingLParen) {
- if (SS.isSet() && SS.isInvalid())
- return ExprError();
-
- // Warn about the explicit constructor calls Microsoft extension.
- if (getLangOptions().Microsoft &&
- Id.getKind() == UnqualifiedId::IK_ConstructorName)
- Diag(Id.getSourceRange().getBegin(),
- diag::ext_ms_explicit_constructor_call);
-
- TemplateArgumentListInfo TemplateArgsBuffer;
-
- // Decompose the name into its component parts.
- DeclarationNameInfo NameInfo;
- const TemplateArgumentListInfo *TemplateArgs;
- DecomposeUnqualifiedId(*this, Id, TemplateArgsBuffer,
- NameInfo, TemplateArgs);
-
- DeclarationName Name = NameInfo.getName();
- bool IsArrow = (OpKind == tok::arrow);
-
- NamedDecl *FirstQualifierInScope
- = (!SS.isSet() ? 0 : FindFirstQualifierInScope(S,
- static_cast<NestedNameSpecifier*>(SS.getScopeRep())));
-
- // This is a postfix expression, so get rid of ParenListExprs.
- ExprResult Result = MaybeConvertParenListExprToParenExpr(S, Base);
- if (Result.isInvalid()) return ExprError();
- Base = Result.take();
-
- if (Base->getType()->isDependentType() || Name.isDependentName() ||
- isDependentScopeSpecifier(SS)) {
- Result = ActOnDependentMemberExpr(Base, Base->getType(),
- IsArrow, OpLoc,
- SS, FirstQualifierInScope,
- NameInfo, TemplateArgs);
- } else {
- LookupResult R(*this, NameInfo, LookupMemberName);
- ExprResult BaseResult = Owned(Base);
- Result = LookupMemberExpr(R, BaseResult, IsArrow, OpLoc,
- SS, ObjCImpDecl, TemplateArgs != 0);
- if (BaseResult.isInvalid())
- return ExprError();
- Base = BaseResult.take();
-
- if (Result.isInvalid()) {
- Owned(Base);
- return ExprError();
- }
-
- if (Result.get()) {
- // The only way a reference to a destructor can be used is to
- // immediately call it, which falls into this case. If the
- // next token is not a '(', produce a diagnostic and build the
- // call now.
- if (!HasTrailingLParen &&
- Id.getKind() == UnqualifiedId::IK_DestructorName)
- return DiagnoseDtorReference(NameInfo.getLoc(), Result.get());
-
- return move(Result);
- }
-
- Result = BuildMemberReferenceExpr(Base, Base->getType(),
- OpLoc, IsArrow, SS, FirstQualifierInScope,
- R, TemplateArgs);
- }
-
- return move(Result);
-}
-
ExprResult Sema::BuildCXXDefaultArgExpr(SourceLocation CallLoc,
FunctionDecl *FD,
ParmVarDecl *Param) {
@@ -4716,6 +3169,7 @@ ExprResult Sema::BuildCXXDefaultArgExpr(SourceLocation CallLoc,
MarkDeclarationReferenced(Param->getDefaultArg()->getLocStart(),
const_cast<CXXDestructorDecl*>(Temporary->getDestructor()));
ExprTemporaries.push_back(Temporary);
+ ExprNeedsCleanups = true;
}
// We already type-checked the argument, so we know it works.
@@ -4834,7 +3288,8 @@ bool Sema::GatherArgumentsForCall(SourceLocation CallLoc,
InitializedEntity Entity =
Param? InitializedEntity::InitializeParameter(Context, Param)
- : InitializedEntity::InitializeParameter(Context, ProtoArgType);
+ : InitializedEntity::InitializeParameter(Context, ProtoArgType,
+ Proto->isArgConsumed(i));
ExprResult ArgE = PerformCopyInitialization(Entity,
SourceLocation(),
Owned(Arg));
@@ -5157,7 +3612,8 @@ Sema::BuildResolvedCallExpr(Expr *Fn, NamedDecl *NDecl,
if (Proto && i < Proto->getNumArgs()) {
InitializedEntity Entity
= InitializedEntity::InitializeParameter(Context,
- Proto->getArgType(i));
+ Proto->getArgType(i),
+ Proto->isArgConsumed(i));
ExprResult ArgE = PerformCopyInitialization(Entity,
SourceLocation(),
Owned(Arg));
@@ -5248,8 +3704,8 @@ Sema::BuildCompoundLiteralExpr(SourceLocation LParenLoc, TypeSourceInfo *TInfo,
InitializedEntity Entity
= InitializedEntity::InitializeTemporary(literalType);
InitializationKind Kind
- = InitializationKind::CreateCast(SourceRange(LParenLoc, RParenLoc),
- /*IsCStyleCast=*/true);
+ = InitializationKind::CreateCStyleCast(LParenLoc,
+ SourceRange(LParenLoc, RParenLoc));
InitializationSequence InitSeq(*this, Entity, Kind, &literalExpr, 1);
ExprResult Result = InitSeq.Perform(*this, Entity, Kind,
MultiExprArg(*this, &literalExpr, 1),
@@ -5267,8 +3723,9 @@ Sema::BuildCompoundLiteralExpr(SourceLocation LParenLoc, TypeSourceInfo *TInfo,
// In C, compound literals are l-values for some reason.
ExprValueKind VK = getLangOptions().CPlusPlus ? VK_RValue : VK_LValue;
- return Owned(new (Context) CompoundLiteralExpr(LParenLoc, TInfo, literalType,
- VK, literalExpr, isFileScope));
+ return MaybeBindToTemporary(
+ new (Context) CompoundLiteralExpr(LParenLoc, TInfo, literalType,
+ VK, literalExpr, isFileScope));
}
ExprResult
@@ -5426,14 +3883,15 @@ static CastKind PrepareScalarCast(Sema &S, ExprResult &Src, QualType DestTy) {
}
/// CheckCastTypes - Check type constraints for casting between types.
-ExprResult Sema::CheckCastTypes(SourceRange TyR, QualType castType,
- Expr *castExpr, CastKind& Kind, ExprValueKind &VK,
+ExprResult Sema::CheckCastTypes(SourceLocation CastStartLoc, SourceRange TyR,
+ QualType castType, Expr *castExpr,
+ CastKind& Kind, ExprValueKind &VK,
CXXCastPath &BasePath, bool FunctionalStyle) {
if (castExpr->getType() == Context.UnknownAnyTy)
return checkUnknownAnyCast(TyR, castType, castExpr, Kind, VK, BasePath);
if (getLangOptions().CPlusPlus)
- return CXXCheckCStyleCast(SourceRange(TyR.getBegin(),
+ return CXXCheckCStyleCast(SourceRange(CastStartLoc,
castExpr->getLocEnd()),
castType, VK, castExpr, Kind, BasePath,
FunctionalStyle);
@@ -5551,8 +4009,8 @@ ExprResult Sema::CheckCastTypes(SourceRange TyR, QualType castType,
// If either type is a pointer, the other type has to be either an
// integer or a pointer.
+ QualType castExprType = castExpr->getType();
if (!castType->isArithmeticType()) {
- QualType castExprType = castExpr->getType();
if (!castExprType->isIntegralType(Context) &&
castExprType->isArithmeticType()) {
Diag(castExpr->getLocStart(),
@@ -5568,6 +4026,36 @@ ExprResult Sema::CheckCastTypes(SourceRange TyR, QualType castType,
}
}
+ if (getLangOptions().ObjCAutoRefCount) {
+ // Diagnose problems with Objective-C casts involving lifetime qualifiers.
+ CheckObjCARCConversion(SourceRange(CastStartLoc, castExpr->getLocEnd()),
+ castType, castExpr, CCK_CStyleCast);
+
+ if (const PointerType *CastPtr = castType->getAs<PointerType>()) {
+ if (const PointerType *ExprPtr = castExprType->getAs<PointerType>()) {
+ Qualifiers CastQuals = CastPtr->getPointeeType().getQualifiers();
+ Qualifiers ExprQuals = ExprPtr->getPointeeType().getQualifiers();
+ if (CastPtr->getPointeeType()->isObjCLifetimeType() &&
+ ExprPtr->getPointeeType()->isObjCLifetimeType() &&
+ !CastQuals.compatiblyIncludesObjCLifetime(ExprQuals)) {
+ Diag(castExpr->getLocStart(),
+ diag::err_typecheck_incompatible_ownership)
+ << castExprType << castType << AA_Casting
+ << castExpr->getSourceRange();
+
+ return ExprError();
+ }
+ }
+ }
+ else if (!CheckObjCARCUnavailableWeakConversion(castType, castExprType)) {
+ Diag(castExpr->getLocStart(),
+ diag::err_arc_convesion_of_weak_unavailable) << 1
+ << castExprType << castType
+ << castExpr->getSourceRange();
+ return ExprError();
+ }
+ }
+
castExprRes = Owned(castExpr);
Kind = PrepareScalarCast(*this, castExprRes, castType);
if (castExprRes.isInvalid())
@@ -5638,20 +4126,57 @@ ExprResult Sema::CheckExtVectorCast(SourceRange R, QualType DestTy,
}
ExprResult
-Sema::ActOnCastExpr(Scope *S, SourceLocation LParenLoc, ParsedType Ty,
+Sema::ActOnCastExpr(Scope *S, SourceLocation LParenLoc,
+ Declarator &D, ParsedType &Ty,
SourceLocation RParenLoc, Expr *castExpr) {
- assert((Ty != 0) && (castExpr != 0) &&
+ assert(!D.isInvalidType() && (castExpr != 0) &&
"ActOnCastExpr(): missing type or expr");
- TypeSourceInfo *castTInfo;
- QualType castType = GetTypeFromParser(Ty, &castTInfo);
- if (!castTInfo)
- castTInfo = Context.getTrivialTypeSourceInfo(castType);
+ TypeSourceInfo *castTInfo = GetTypeForDeclaratorCast(D, castExpr->getType());
+ if (D.isInvalidType())
+ return ExprError();
+
+ if (getLangOptions().CPlusPlus) {
+ // Check that there are no default arguments (C++ only).
+ CheckExtraCXXDefaultArguments(D);
+ }
+
+ QualType castType = castTInfo->getType();
+ Ty = CreateParsedType(castType, castTInfo);
+
+ bool isVectorLiteral = false;
+
+ // Check for an altivec or OpenCL literal,
+ // i.e. all the elements are integer constants.
+ ParenExpr *PE = dyn_cast<ParenExpr>(castExpr);
+ ParenListExpr *PLE = dyn_cast<ParenListExpr>(castExpr);
+ if (getLangOptions().AltiVec && castType->isVectorType() && (PE || PLE)) {
+ if (PLE && PLE->getNumExprs() == 0) {
+ Diag(PLE->getExprLoc(), diag::err_altivec_empty_initializer);
+ return ExprError();
+ }
+ if (PE || PLE->getNumExprs() == 1) {
+ Expr *E = (PE ? PE->getSubExpr() : PLE->getExpr(0));
+ if (!E->getType()->isVectorType())
+ isVectorLiteral = true;
+ }
+ else
+ isVectorLiteral = true;
+ }
+
+ // If this is a vector initializer, '(' type ')' '(' init, ..., init ')'
+ // then handle it as such.
+ if (isVectorLiteral)
+ return BuildVectorLiteral(LParenLoc, RParenLoc, castExpr, castTInfo);
// If the Expr being casted is a ParenListExpr, handle it specially.
- if (isa<ParenListExpr>(castExpr))
- return ActOnCastOfParenListExpr(S, LParenLoc, RParenLoc, castExpr,
- castTInfo);
+ // This is not an AltiVec-style cast, so turn the ParenListExpr into a
+ // sequence of BinOp comma operators.
+ if (isa<ParenListExpr>(castExpr)) {
+ ExprResult Result = MaybeConvertParenListExprToParenExpr(S, castExpr);
+ if (Result.isInvalid()) return ExprError();
+ castExpr = Result.take();
+ }
return BuildCStyleCastExpr(LParenLoc, castTInfo, RParenLoc, castExpr);
}
@@ -5663,8 +4188,8 @@ Sema::BuildCStyleCastExpr(SourceLocation LParenLoc, TypeSourceInfo *Ty,
ExprValueKind VK = VK_RValue;
CXXCastPath BasePath;
ExprResult CastResult =
- CheckCastTypes(SourceRange(LParenLoc, RParenLoc), Ty->getType(), castExpr,
- Kind, VK, BasePath);
+ CheckCastTypes(LParenLoc, SourceRange(LParenLoc, RParenLoc), Ty->getType(),
+ castExpr, Kind, VK, BasePath);
if (CastResult.isInvalid())
return ExprError();
castExpr = CastResult.take();
@@ -5675,6 +4200,80 @@ Sema::BuildCStyleCastExpr(SourceLocation LParenLoc, TypeSourceInfo *Ty,
LParenLoc, RParenLoc));
}
+ExprResult Sema::BuildVectorLiteral(SourceLocation LParenLoc,
+ SourceLocation RParenLoc, Expr *E,
+ TypeSourceInfo *TInfo) {
+ assert((isa<ParenListExpr>(E) || isa<ParenExpr>(E)) &&
+ "Expected paren or paren list expression");
+
+ Expr **exprs;
+ unsigned numExprs;
+ Expr *subExpr;
+ if (ParenListExpr *PE = dyn_cast<ParenListExpr>(E)) {
+ exprs = PE->getExprs();
+ numExprs = PE->getNumExprs();
+ } else {
+ subExpr = cast<ParenExpr>(E)->getSubExpr();
+ exprs = &subExpr;
+ numExprs = 1;
+ }
+
+ QualType Ty = TInfo->getType();
+ assert(Ty->isVectorType() && "Expected vector type");
+
+ llvm::SmallVector<Expr *, 8> initExprs;
+ const VectorType *VTy = Ty->getAs<VectorType>();
+ unsigned numElems = Ty->getAs<VectorType>()->getNumElements();
+
+ // '(...)' form of vector initialization in AltiVec: the number of
+ // initializers must be one or must match the size of the vector.
+ // If a single value is specified in the initializer then it will be
+ // replicated to all the components of the vector
+ if (VTy->getVectorKind() == VectorType::AltiVecVector) {
+ // The number of initializers must be one or must match the size of the
+ // vector. If a single value is specified in the initializer then it will
+ // be replicated to all the components of the vector
+ if (numExprs == 1) {
+ QualType ElemTy = Ty->getAs<VectorType>()->getElementType();
+ ExprResult Literal = Owned(exprs[0]);
+ Literal = ImpCastExprToType(Literal.take(), ElemTy,
+ PrepareScalarCast(*this, Literal, ElemTy));
+ return BuildCStyleCastExpr(LParenLoc, TInfo, RParenLoc, Literal.take());
+ }
+ else if (numExprs < numElems) {
+ Diag(E->getExprLoc(),
+ diag::err_incorrect_number_of_vector_initializers);
+ return ExprError();
+ }
+ else
+ for (unsigned i = 0, e = numExprs; i != e; ++i)
+ initExprs.push_back(exprs[i]);
+ }
+ else {
+ // For OpenCL, when the number of initializers is a single value,
+ // it will be replicated to all components of the vector.
+ if (getLangOptions().OpenCL &&
+ VTy->getVectorKind() == VectorType::GenericVector &&
+ numExprs == 1) {
+ QualType ElemTy = Ty->getAs<VectorType>()->getElementType();
+ ExprResult Literal = Owned(exprs[0]);
+ Literal = ImpCastExprToType(Literal.take(), ElemTy,
+ PrepareScalarCast(*this, Literal, ElemTy));
+ return BuildCStyleCastExpr(LParenLoc, TInfo, RParenLoc, Literal.take());
+ }
+
+ for (unsigned i = 0, e = numExprs; i != e; ++i)
+ initExprs.push_back(exprs[i]);
+ }
+ // FIXME: This means that pretty-printing the final AST will produce curly
+ // braces instead of the original commas.
+ InitListExpr *initE = new (Context) InitListExpr(Context, LParenLoc,
+ &initExprs[0],
+ initExprs.size(), RParenLoc);
+ initE->setType(Ty);
+ return BuildCompoundLiteralExpr(LParenLoc, TInfo, RParenLoc, initE);
+}
+
/// This is not an AltiVec-style cast, so turn the ParenListExpr into a sequence
/// of comma binary operators.
ExprResult
@@ -5694,91 +4293,18 @@ Sema::MaybeConvertParenListExprToParenExpr(Scope *S, Expr *expr) {
return ActOnParenExpr(E->getLParenLoc(), E->getRParenLoc(), Result.get());
}
-ExprResult
-Sema::ActOnCastOfParenListExpr(Scope *S, SourceLocation LParenLoc,
- SourceLocation RParenLoc, Expr *Op,
- TypeSourceInfo *TInfo) {
- ParenListExpr *PE = cast<ParenListExpr>(Op);
- QualType Ty = TInfo->getType();
- bool isVectorLiteral = false;
-
- // Check for an altivec or OpenCL literal,
- // i.e. all the elements are integer constants.
- if (getLangOptions().AltiVec && Ty->isVectorType()) {
- if (PE->getNumExprs() == 0) {
- Diag(PE->getExprLoc(), diag::err_altivec_empty_initializer);
- return ExprError();
- }
- if (PE->getNumExprs() == 1) {
- if (!PE->getExpr(0)->getType()->isVectorType())
- isVectorLiteral = true;
- }
- else
- isVectorLiteral = true;
- }
-
- // If this is a vector initializer, '(' type ')' '(' init, ..., init ')'
- // then handle it as such.
- if (isVectorLiteral) {
- llvm::SmallVector<Expr *, 8> initExprs;
- // '(...)' form of vector initialization in AltiVec: the number of
- // initializers must be one or must match the size of the vector.
- // If a single value is specified in the initializer then it will be
- // replicated to all the components of the vector
- if (Ty->getAs<VectorType>()->getVectorKind() ==
- VectorType::AltiVecVector) {
- unsigned numElems = Ty->getAs<VectorType>()->getNumElements();
- // The number of initializers must be one or must match the size of the
- // vector. If a single value is specified in the initializer then it will
- // be replicated to all the components of the vector
- if (PE->getNumExprs() == 1) {
- QualType ElemTy = Ty->getAs<VectorType>()->getElementType();
- ExprResult Literal = Owned(PE->getExpr(0));
- Literal = ImpCastExprToType(Literal.take(), ElemTy,
- PrepareScalarCast(*this, Literal, ElemTy));
- return BuildCStyleCastExpr(LParenLoc, TInfo, RParenLoc, Literal.take());
- }
- else if (PE->getNumExprs() < numElems) {
- Diag(PE->getExprLoc(),
- diag::err_incorrect_number_of_vector_initializers);
- return ExprError();
- }
- else
- for (unsigned i = 0, e = PE->getNumExprs(); i != e; ++i)
- initExprs.push_back(PE->getExpr(i));
- }
- else
- for (unsigned i = 0, e = PE->getNumExprs(); i != e; ++i)
- initExprs.push_back(PE->getExpr(i));
-
- // FIXME: This means that pretty-printing the final AST will produce curly
- // braces instead of the original commas.
- InitListExpr *E = new (Context) InitListExpr(Context, LParenLoc,
- &initExprs[0],
- initExprs.size(), RParenLoc);
- E->setType(Ty);
- return BuildCompoundLiteralExpr(LParenLoc, TInfo, RParenLoc, E);
- } else {
- // This is not an AltiVec-style cast, so turn the ParenListExpr into a
- // sequence of BinOp comma operators.
- ExprResult Result = MaybeConvertParenListExprToParenExpr(S, Op);
- if (Result.isInvalid()) return ExprError();
- return BuildCStyleCastExpr(LParenLoc, TInfo, RParenLoc, Result.take());
- }
-}
-
ExprResult Sema::ActOnParenOrParenListExpr(SourceLocation L,
SourceLocation R,
- MultiExprArg Val,
- ParsedType TypeOfCast) {
+ MultiExprArg Val) {
unsigned nexprs = Val.size();
Expr **exprs = reinterpret_cast<Expr**>(Val.release());
assert((exprs != 0) && "ActOnParenOrParenListExpr() missing expr list");
Expr *expr;
- if (nexprs == 1 && TypeOfCast && !TypeIsVectorType(TypeOfCast))
+ if (nexprs == 1)
expr = new (Context) ParenExpr(L, R, exprs[0]);
else
- expr = new (Context) ParenListExpr(Context, L, exprs, nexprs, R);
+ expr = new (Context) ParenListExpr(Context, L, exprs, nexprs, R,
+ exprs[nexprs-1]->getType());
return Owned(expr);
}
@@ -5876,7 +4402,7 @@ QualType Sema::CheckConditionalOperands(ExprResult &Cond, ExprResult &LHS, ExprR
// Now check the two expressions.
if (LHSTy->isVectorType() || RHSTy->isVectorType())
- return CheckVectorOperands(QuestionLoc, LHS, RHS);
+ return CheckVectorOperands(LHS, RHS, QuestionLoc, /*isCompAssign*/false);
// OpenCL: If the condition is a vector, and both operands are scalar,
// attempt to implicity convert them to the vector type to act like the
@@ -6203,43 +4729,21 @@ QualType Sema::FindCompositeObjCPointerType(ExprResult &LHS, ExprResult &RHS,
return QualType();
}
-/// SuggestParentheses - Emit a diagnostic together with a fixit hint that wraps
+/// SuggestParentheses - Emit a note with a fixit hint that wraps
/// ParenRange in parentheses.
static void SuggestParentheses(Sema &Self, SourceLocation Loc,
- const PartialDiagnostic &PD,
- const PartialDiagnostic &FirstNote,
- SourceRange FirstParenRange,
- const PartialDiagnostic &SecondNote,
- SourceRange SecondParenRange) {
- Self.Diag(Loc, PD);
-
- if (!FirstNote.getDiagID())
- return;
-
- SourceLocation EndLoc = Self.PP.getLocForEndOfToken(FirstParenRange.getEnd());
- if (!FirstParenRange.getEnd().isFileID() || EndLoc.isInvalid()) {
- // We can't display the parentheses, so just return.
- return;
- }
-
- Self.Diag(Loc, FirstNote)
- << FixItHint::CreateInsertion(FirstParenRange.getBegin(), "(")
- << FixItHint::CreateInsertion(EndLoc, ")");
-
- if (!SecondNote.getDiagID())
- return;
-
- EndLoc = Self.PP.getLocForEndOfToken(SecondParenRange.getEnd());
- if (!SecondParenRange.getEnd().isFileID() || EndLoc.isInvalid()) {
- // We can't display the parentheses, so just dig the
- // warning/error and return.
- Self.Diag(Loc, SecondNote);
- return;
+ const PartialDiagnostic &Note,
+ SourceRange ParenRange) {
+ SourceLocation EndLoc = Self.PP.getLocForEndOfToken(ParenRange.getEnd());
+ if (ParenRange.getBegin().isFileID() && ParenRange.getEnd().isFileID() &&
+ EndLoc.isValid()) {
+ Self.Diag(Loc, Note)
+ << FixItHint::CreateInsertion(ParenRange.getBegin(), "(")
+ << FixItHint::CreateInsertion(EndLoc, ")");
+ } else {
+ // We can't display the parentheses, so just show the bare note.
+ Self.Diag(Loc, Note) << ParenRange;
}
-
- Self.Diag(Loc, SecondNote)
- << FixItHint::CreateInsertion(SecondParenRange.getBegin(), "(")
- << FixItHint::CreateInsertion(EndLoc, ")");
}
static bool IsArithmeticOp(BinaryOperatorKind Opc) {
@@ -6312,13 +4816,13 @@ static bool ExprLooksBoolean(Expr *E) {
/// "int x = a + someBinaryCondition ? 1 : 2".
static void DiagnoseConditionalPrecedence(Sema &Self,
SourceLocation OpLoc,
- Expr *cond,
- Expr *lhs,
- Expr *rhs) {
+ Expr *Condition,
+ Expr *LHS,
+ Expr *RHS) {
BinaryOperatorKind CondOpcode;
Expr *CondRHS;
- if (!IsArithmeticBinaryExpr(cond, &CondOpcode, &CondRHS))
+ if (!IsArithmeticBinaryExpr(Condition, &CondOpcode, &CondRHS))
return;
if (!ExprLooksBoolean(CondRHS))
return;
@@ -6326,25 +4830,18 @@ static void DiagnoseConditionalPrecedence(Sema &Self,
// The condition is an arithmetic binary expression, with a right-
// hand side that looks boolean, so warn.
- PartialDiagnostic Warn = Self.PDiag(diag::warn_precedence_conditional)
- << cond->getSourceRange()
- << BinaryOperator::getOpcodeStr(CondOpcode);
-
- PartialDiagnostic FirstNote =
- Self.PDiag(diag::note_precedence_conditional_silence)
+ Self.Diag(OpLoc, diag::warn_precedence_conditional)
+ << Condition->getSourceRange()
<< BinaryOperator::getOpcodeStr(CondOpcode);
- SourceRange FirstParenRange(cond->getLocStart(),
- cond->getLocEnd());
-
- PartialDiagnostic SecondNote =
- Self.PDiag(diag::note_precedence_conditional_first);
-
- SourceRange SecondParenRange(CondRHS->getLocStart(),
- rhs->getLocEnd());
+ SuggestParentheses(Self, OpLoc,
+ Self.PDiag(diag::note_precedence_conditional_silence)
+ << BinaryOperator::getOpcodeStr(CondOpcode),
+ SourceRange(Condition->getLocStart(), Condition->getLocEnd()));
- SuggestParentheses(Self, OpLoc, Warn, FirstNote, FirstParenRange,
- SecondNote, SecondParenRange);
+ SuggestParentheses(Self, OpLoc,
+ Self.PDiag(diag::note_precedence_conditional_first),
+ SourceRange(CondRHS->getLocStart(), RHS->getLocEnd()));
}
/// ActOnConditionalOp - Parse a ?: operation. Note that 'LHS' may be null
@@ -6427,17 +4924,31 @@ checkPointerTypesForAssignment(Sema &S, QualType lhsType, QualType rhsType) {
// qualifiers of the type *pointed to* by the right;
Qualifiers lq;
+ // As a special case, 'non-__weak A *' -> 'non-__weak const *' is okay.
+ if (lhq.getObjCLifetime() != rhq.getObjCLifetime() &&
+ lhq.compatiblyIncludesObjCLifetime(rhq)) {
+ // Ignore lifetime for further calculation.
+ lhq.removeObjCLifetime();
+ rhq.removeObjCLifetime();
+ }
+
if (!lhq.compatiblyIncludes(rhq)) {
// Treat address-space mismatches as fatal. TODO: address subspaces
if (lhq.getAddressSpace() != rhq.getAddressSpace())
ConvTy = Sema::IncompatiblePointerDiscardsQualifiers;
- // It's okay to add or remove GC qualifiers when converting to
+ // It's okay to add or remove GC or lifetime qualifiers when converting to
// and from void*.
- else if (lhq.withoutObjCGCAttr().compatiblyIncludes(rhq.withoutObjCGCAttr())
+ else if (lhq.withoutObjCGCAttr().withoutObjCGLifetime()
+ .compatiblyIncludes(
+ rhq.withoutObjCGCAttr().withoutObjCGLifetime())
&& (lhptee->isVoidType() || rhptee->isVoidType()))
; // keep old
+ // Treat lifetime mismatches as fatal.
+ else if (lhq.getObjCLifetime() != rhq.getObjCLifetime())
+ ConvTy = Sema::IncompatiblePointerDiscardsQualifiers;
+
// For GCC compatibility, other qualifier mismatches are treated
// as still compatible in C.
else ConvTy = Sema::CompatiblePointerDiscardsQualifiers;
@@ -6614,6 +5125,7 @@ Sema::AssignConvertType
Sema::CheckAssignmentConstraints(QualType lhsType, ExprResult &rhs,
CastKind &Kind) {
QualType rhsType = rhs.get()->getType();
+ QualType origLhsType = lhsType;
// Get canonical types. We're not formatting these types, just comparing
// them.
@@ -6768,7 +5280,13 @@ Sema::CheckAssignmentConstraints(QualType lhsType, ExprResult &rhs,
// A* -> B*
if (rhsType->isObjCObjectPointerType()) {
Kind = CK_BitCast;
- return checkObjCPointerTypesForAssignment(*this, lhsType, rhsType);
+ Sema::AssignConvertType result =
+ checkObjCPointerTypesForAssignment(*this, lhsType, rhsType);
+ if (getLangOptions().ObjCAutoRefCount &&
+ result == Compatible &&
+ !CheckObjCARCUnavailableWeakConversion(origLhsType, rhsType))
+ result = IncompatibleObjCWeakRef;
+ return result;
}
// int or null -> A*
@@ -6936,8 +5454,12 @@ Sema::CheckSingleAssignmentConstraints(QualType lhsType, ExprResult &rExpr) {
AA_Assigning);
if (Res.isInvalid())
return Incompatible;
+ Sema::AssignConvertType result = Compatible;
+ if (getLangOptions().ObjCAutoRefCount &&
+ !CheckObjCARCUnavailableWeakConversion(lhsType, rExpr.get()->getType()))
+ result = IncompatibleObjCWeakRef;
rExpr = move(Res);
- return Compatible;
+ return result;
}
// FIXME: Currently, we fall through and treat C++ classes like C
@@ -6989,7 +5511,8 @@ QualType Sema::InvalidOperands(SourceLocation Loc, ExprResult &lex, ExprResult &
return QualType();
}
-QualType Sema::CheckVectorOperands(SourceLocation Loc, ExprResult &lex, ExprResult &rex) {
+QualType Sema::CheckVectorOperands(ExprResult &lex, ExprResult &rex,
+ SourceLocation Loc, bool isCompAssign) {
// For conversion purposes, we ignore any qualifiers.
// For example, "const float" and "float" are equivalent.
QualType lhsType =
@@ -7001,42 +5524,33 @@ QualType Sema::CheckVectorOperands(SourceLocation Loc, ExprResult &lex, ExprResu
if (lhsType == rhsType)
return lhsType;
- // Handle the case of a vector & extvector type of the same size and element
- // type. It would be nice if we only had one vector type someday.
- if (getLangOptions().LaxVectorConversions) {
- if (const VectorType *LV = lhsType->getAs<VectorType>()) {
- if (const VectorType *RV = rhsType->getAs<VectorType>()) {
- if (LV->getElementType() == RV->getElementType() &&
- LV->getNumElements() == RV->getNumElements()) {
- if (lhsType->isExtVectorType()) {
- rex = ImpCastExprToType(rex.take(), lhsType, CK_BitCast);
- return lhsType;
- }
-
- lex = ImpCastExprToType(lex.take(), rhsType, CK_BitCast);
- return rhsType;
- } else if (Context.getTypeSize(lhsType) ==Context.getTypeSize(rhsType)){
- // If we are allowing lax vector conversions, and LHS and RHS are both
- // vectors, the total size only needs to be the same. This is a
- // bitcast; no bits are changed but the result type is different.
- rex = ImpCastExprToType(rex.take(), lhsType, CK_BitCast);
- return lhsType;
- }
- }
- }
- }
-
// Handle the case of equivalent AltiVec and GCC vector types
if (lhsType->isVectorType() && rhsType->isVectorType() &&
Context.areCompatibleVectorTypes(lhsType, rhsType)) {
- lex = ImpCastExprToType(lex.take(), rhsType, CK_BitCast);
+ if (lhsType->isExtVectorType()) {
+ rex = ImpCastExprToType(rex.take(), lhsType, CK_BitCast);
+ return lhsType;
+ }
+
+ if (!isCompAssign)
+ lex = ImpCastExprToType(lex.take(), rhsType, CK_BitCast);
return rhsType;
}
+ if (getLangOptions().LaxVectorConversions &&
+ Context.getTypeSize(lhsType) == Context.getTypeSize(rhsType)) {
+ // If we are allowing lax vector conversions, and LHS and RHS are both
+ // vectors, the total size only needs to be the same. This is a
+ // bitcast; no bits are changed but the result type is different.
+ // FIXME: Should we really be allowing this?
+ rex = ImpCastExprToType(rex.take(), lhsType, CK_BitCast);
+ return lhsType;
+ }
+
// Canonicalize the ExtVector to the LHS, remember if we swapped so we can
// swap back (so that we don't reverse the inputs to a subtract, for instance.
bool swapped = false;
- if (rhsType->isExtVectorType()) {
+ if (rhsType->isExtVectorType() && !isCompAssign) {
swapped = true;
std::swap(rex, lex);
std::swap(rhsType, lhsType);
@@ -7069,6 +5583,7 @@ QualType Sema::CheckVectorOperands(SourceLocation Loc, ExprResult &lex, ExprResu
}
// Vectors of different size or scalar and non-ext-vector are errors.
+ if (swapped) std::swap(rex, lex);
Diag(Loc, diag::err_typecheck_vector_not_convertable)
<< lex.get()->getType() << rex.get()->getType()
<< lex.get()->getSourceRange() << rex.get()->getSourceRange();
@@ -7078,7 +5593,7 @@ QualType Sema::CheckVectorOperands(SourceLocation Loc, ExprResult &lex, ExprResu
QualType Sema::CheckMultiplyDivideOperands(
ExprResult &lex, ExprResult &rex, SourceLocation Loc, bool isCompAssign, bool isDiv) {
if (lex.get()->getType()->isVectorType() || rex.get()->getType()->isVectorType())
- return CheckVectorOperands(Loc, lex, rex);
+ return CheckVectorOperands(lex, rex, Loc, isCompAssign);
QualType compType = UsualArithmeticConversions(lex, rex, isCompAssign);
if (lex.isInvalid() || rex.isInvalid())
@@ -7102,7 +5617,7 @@ QualType Sema::CheckRemainderOperands(
if (lex.get()->getType()->isVectorType() || rex.get()->getType()->isVectorType()) {
if (lex.get()->getType()->hasIntegerRepresentation() &&
rex.get()->getType()->hasIntegerRepresentation())
- return CheckVectorOperands(Loc, lex, rex);
+ return CheckVectorOperands(lex, rex, Loc, isCompAssign);
return InvalidOperands(Loc, lex, rex);
}
@@ -7121,10 +5636,149 @@ QualType Sema::CheckRemainderOperands(
return compType;
}
+/// \brief Diagnose invalid arithmetic on two void pointers.
+static void diagnoseArithmeticOnTwoVoidPointers(Sema &S, SourceLocation Loc,
+ Expr *LHS, Expr *RHS) {
+ S.Diag(Loc, S.getLangOptions().CPlusPlus
+ ? diag::err_typecheck_pointer_arith_void_type
+ : diag::ext_gnu_void_ptr)
+ << 1 /* two pointers */ << LHS->getSourceRange() << RHS->getSourceRange();
+}
+
+/// \brief Diagnose invalid arithmetic on a void pointer.
+static void diagnoseArithmeticOnVoidPointer(Sema &S, SourceLocation Loc,
+ Expr *Pointer) {
+ S.Diag(Loc, S.getLangOptions().CPlusPlus
+ ? diag::err_typecheck_pointer_arith_void_type
+ : diag::ext_gnu_void_ptr)
+ << 0 /* one pointer */ << Pointer->getSourceRange();
+}
+
+/// \brief Diagnose invalid arithmetic on two function pointers.
+static void diagnoseArithmeticOnTwoFunctionPointers(Sema &S, SourceLocation Loc,
+ Expr *LHS, Expr *RHS) {
+ assert(LHS->getType()->isAnyPointerType());
+ assert(RHS->getType()->isAnyPointerType());
+ S.Diag(Loc, S.getLangOptions().CPlusPlus
+ ? diag::err_typecheck_pointer_arith_function_type
+ : diag::ext_gnu_ptr_func_arith)
+ << 1 /* two pointers */ << LHS->getType()->getPointeeType()
+ // We only show the second type if it differs from the first.
+ << (unsigned)!S.Context.hasSameUnqualifiedType(LHS->getType(),
+ RHS->getType())
+ << RHS->getType()->getPointeeType()
+ << LHS->getSourceRange() << RHS->getSourceRange();
+}
+
+/// \brief Diagnose invalid arithmetic on a function pointer.
+static void diagnoseArithmeticOnFunctionPointer(Sema &S, SourceLocation Loc,
+ Expr *Pointer) {
+ assert(Pointer->getType()->isAnyPointerType());
+ S.Diag(Loc, S.getLangOptions().CPlusPlus
+ ? diag::err_typecheck_pointer_arith_function_type
+ : diag::ext_gnu_ptr_func_arith)
+ << 0 /* one pointer */ << Pointer->getType()->getPointeeType()
+ << 0 /* one pointer, so only one type */
+ << Pointer->getSourceRange();
+}
+
+/// \brief Check the validity of an arithmetic pointer operand.
+///
+/// If the operand has pointer type, this code will check for pointer types
+/// which are invalid in arithmetic operations. These will be diagnosed
+/// appropriately, including whether or not the use is supported as an
+/// extension.
+///
+/// \returns True when the operand is valid to use (even if as an extension).
+static bool checkArithmeticOpPointerOperand(Sema &S, SourceLocation Loc,
+ Expr *Operand) {
+ if (!Operand->getType()->isAnyPointerType()) return true;
+
+ QualType PointeeTy = Operand->getType()->getPointeeType();
+ if (PointeeTy->isVoidType()) {
+ diagnoseArithmeticOnVoidPointer(S, Loc, Operand);
+ return !S.getLangOptions().CPlusPlus;
+ }
+ if (PointeeTy->isFunctionType()) {
+ diagnoseArithmeticOnFunctionPointer(S, Loc, Operand);
+ return !S.getLangOptions().CPlusPlus;
+ }
+
+ if ((Operand->getType()->isPointerType() &&
+ !Operand->getType()->isDependentType()) ||
+ Operand->getType()->isObjCObjectPointerType()) {
+ QualType PointeeTy = Operand->getType()->getPointeeType();
+ if (S.RequireCompleteType(
+ Loc, PointeeTy,
+ S.PDiag(diag::err_typecheck_arithmetic_incomplete_type)
+ << PointeeTy << Operand->getSourceRange()))
+ return false;
+ }
+
+ return true;
+}
+
+/// \brief Check the validity of a binary arithmetic operation w.r.t. pointer
+/// operands.
+///
+/// This routine will diagnose any invalid arithmetic on pointer operands much
+/// like \see checkArithmeticOpPointerOperand. However, it has special logic
+/// for emitting a single diagnostic even for operations where both LHS and RHS
+/// are (potentially problematic) pointers.
+///
+/// \returns True when the operand is valid to use (even if as an extension).
+static bool checkArithmeticBinOpPointerOperands(Sema &S, SourceLocation Loc,
+ Expr *LHS, Expr *RHS) {
+ bool isLHSPointer = LHS->getType()->isAnyPointerType();
+ bool isRHSPointer = RHS->getType()->isAnyPointerType();
+ if (!isLHSPointer && !isRHSPointer) return true;
+
+ QualType LHSPointeeTy, RHSPointeeTy;
+ if (isLHSPointer) LHSPointeeTy = LHS->getType()->getPointeeType();
+ if (isRHSPointer) RHSPointeeTy = RHS->getType()->getPointeeType();
+
+ // Check for arithmetic on pointers to incomplete types.
+ bool isLHSVoidPtr = isLHSPointer && LHSPointeeTy->isVoidType();
+ bool isRHSVoidPtr = isRHSPointer && RHSPointeeTy->isVoidType();
+ if (isLHSVoidPtr || isRHSVoidPtr) {
+ if (!isRHSVoidPtr) diagnoseArithmeticOnVoidPointer(S, Loc, LHS);
+ else if (!isLHSVoidPtr) diagnoseArithmeticOnVoidPointer(S, Loc, RHS);
+ else diagnoseArithmeticOnTwoVoidPointers(S, Loc, LHS, RHS);
+
+ return !S.getLangOptions().CPlusPlus;
+ }
+
+ bool isLHSFuncPtr = isLHSPointer && LHSPointeeTy->isFunctionType();
+ bool isRHSFuncPtr = isRHSPointer && RHSPointeeTy->isFunctionType();
+ if (isLHSFuncPtr || isRHSFuncPtr) {
+ if (!isRHSFuncPtr) diagnoseArithmeticOnFunctionPointer(S, Loc, LHS);
+ else if (!isLHSFuncPtr) diagnoseArithmeticOnFunctionPointer(S, Loc, RHS);
+ else diagnoseArithmeticOnTwoFunctionPointers(S, Loc, LHS, RHS);
+
+ return !S.getLangOptions().CPlusPlus;
+ }
+
+ Expr *Operands[] = { LHS, RHS };
+ for (unsigned i = 0; i < 2; ++i) {
+ Expr *Operand = Operands[i];
+ if ((Operand->getType()->isPointerType() &&
+ !Operand->getType()->isDependentType()) ||
+ Operand->getType()->isObjCObjectPointerType()) {
+ QualType PointeeTy = Operand->getType()->getPointeeType();
+ if (S.RequireCompleteType(
+ Loc, PointeeTy,
+ S.PDiag(diag::err_typecheck_arithmetic_incomplete_type)
+ << PointeeTy << Operand->getSourceRange()))
+ return false;
+ }
+ }
+ return true;
+}
+
QualType Sema::CheckAdditionOperands( // C99 6.5.6
ExprResult &lex, ExprResult &rex, SourceLocation Loc, QualType* CompLHSTy) {
if (lex.get()->getType()->isVectorType() || rex.get()->getType()->isVectorType()) {
- QualType compType = CheckVectorOperands(Loc, lex, rex);
+ QualType compType = CheckVectorOperands(lex, rex, Loc, CompLHSTy);
if (CompLHSTy) *CompLHSTy = compType;
return compType;
}
@@ -7146,42 +5800,12 @@ QualType Sema::CheckAdditionOperands( // C99 6.5.6
std::swap(PExp, IExp);
if (PExp->getType()->isAnyPointerType()) {
-
if (IExp->getType()->isIntegerType()) {
- QualType PointeeTy = PExp->getType()->getPointeeType();
-
- // Check for arithmetic on pointers to incomplete types.
- if (PointeeTy->isVoidType()) {
- if (getLangOptions().CPlusPlus) {
- Diag(Loc, diag::err_typecheck_pointer_arith_void_type)
- << lex.get()->getSourceRange() << rex.get()->getSourceRange();
- return QualType();
- }
+ if (!checkArithmeticOpPointerOperand(*this, Loc, PExp))
+ return QualType();
- // GNU extension: arithmetic on pointer to void
- Diag(Loc, diag::ext_gnu_void_ptr)
- << lex.get()->getSourceRange() << rex.get()->getSourceRange();
- } else if (PointeeTy->isFunctionType()) {
- if (getLangOptions().CPlusPlus) {
- Diag(Loc, diag::err_typecheck_pointer_arith_function_type)
- << lex.get()->getType() << lex.get()->getSourceRange();
- return QualType();
- }
+ QualType PointeeTy = PExp->getType()->getPointeeType();
- // GNU extension: arithmetic on pointer to function
- Diag(Loc, diag::ext_gnu_ptr_func_arith)
- << lex.get()->getType() << lex.get()->getSourceRange();
- } else {
- // Check if we require a complete type.
- if (((PExp->getType()->isPointerType() &&
- !PExp->getType()->isDependentType()) ||
- PExp->getType()->isObjCObjectPointerType()) &&
- RequireCompleteType(Loc, PointeeTy,
- PDiag(diag::err_typecheck_arithmetic_incomplete_type)
- << PExp->getSourceRange()
- << PExp->getType()))
- return QualType();
- }
// Diagnose bad cases where we step over interface counts.
if (PointeeTy->isObjCObjectType() && LangOpts.ObjCNonFragileABI) {
Diag(Loc, diag::err_arithmetic_nonfragile_interface)
@@ -7209,7 +5833,7 @@ QualType Sema::CheckAdditionOperands( // C99 6.5.6
QualType Sema::CheckSubtractionOperands(ExprResult &lex, ExprResult &rex,
SourceLocation Loc, QualType* CompLHSTy) {
if (lex.get()->getType()->isVectorType() || rex.get()->getType()->isVectorType()) {
- QualType compType = CheckVectorOperands(Loc, lex, rex);
+ QualType compType = CheckVectorOperands(lex, rex, Loc, CompLHSTy);
if (CompLHSTy) *CompLHSTy = compType;
return compType;
}
@@ -7231,35 +5855,6 @@ QualType Sema::CheckSubtractionOperands(ExprResult &lex, ExprResult &rex,
if (lex.get()->getType()->isAnyPointerType()) {
QualType lpointee = lex.get()->getType()->getPointeeType();
- // The LHS must be an completely-defined object type.
-
- bool ComplainAboutVoid = false;
- Expr *ComplainAboutFunc = 0;
- if (lpointee->isVoidType()) {
- if (getLangOptions().CPlusPlus) {
- Diag(Loc, diag::err_typecheck_pointer_arith_void_type)
- << lex.get()->getSourceRange() << rex.get()->getSourceRange();
- return QualType();
- }
-
- // GNU C extension: arithmetic on pointer to void
- ComplainAboutVoid = true;
- } else if (lpointee->isFunctionType()) {
- if (getLangOptions().CPlusPlus) {
- Diag(Loc, diag::err_typecheck_pointer_arith_function_type)
- << lex.get()->getType() << lex.get()->getSourceRange();
- return QualType();
- }
-
- // GNU C extension: arithmetic on pointer to function
- ComplainAboutFunc = lex.get();
- } else if (!lpointee->isDependentType() &&
- RequireCompleteType(Loc, lpointee,
- PDiag(diag::err_typecheck_sub_ptr_object)
- << lex.get()->getSourceRange()
- << lex.get()->getType()))
- return QualType();
-
// Diagnose bad cases where we step over interface counts.
if (lpointee->isObjCObjectType() && LangOpts.ObjCNonFragileABI) {
Diag(Loc, diag::err_arithmetic_nonfragile_interface)
@@ -7269,13 +5864,8 @@ QualType Sema::CheckSubtractionOperands(ExprResult &lex, ExprResult &rex,
// The result type of a pointer-int computation is the pointer type.
if (rex.get()->getType()->isIntegerType()) {
- if (ComplainAboutVoid)
- Diag(Loc, diag::ext_gnu_void_ptr)
- << lex.get()->getSourceRange() << rex.get()->getSourceRange();
- if (ComplainAboutFunc)
- Diag(Loc, diag::ext_gnu_ptr_func_arith)
- << ComplainAboutFunc->getType()
- << ComplainAboutFunc->getSourceRange();
+ if (!checkArithmeticOpPointerOperand(*this, Loc, lex.get()))
+ return QualType();
if (CompLHSTy) *CompLHSTy = lex.get()->getType();
return lex.get()->getType();
@@ -7285,33 +5875,6 @@ QualType Sema::CheckSubtractionOperands(ExprResult &lex, ExprResult &rex,
if (const PointerType *RHSPTy = rex.get()->getType()->getAs<PointerType>()) {
QualType rpointee = RHSPTy->getPointeeType();
- // RHS must be a completely-type object type.
- // Handle the GNU void* extension.
- if (rpointee->isVoidType()) {
- if (getLangOptions().CPlusPlus) {
- Diag(Loc, diag::err_typecheck_pointer_arith_void_type)
- << lex.get()->getSourceRange() << rex.get()->getSourceRange();
- return QualType();
- }
-
- ComplainAboutVoid = true;
- } else if (rpointee->isFunctionType()) {
- if (getLangOptions().CPlusPlus) {
- Diag(Loc, diag::err_typecheck_pointer_arith_function_type)
- << rex.get()->getType() << rex.get()->getSourceRange();
- return QualType();
- }
-
- // GNU extension: arithmetic on pointer to function
- if (!ComplainAboutFunc)
- ComplainAboutFunc = rex.get();
- } else if (!rpointee->isDependentType() &&
- RequireCompleteType(Loc, rpointee,
- PDiag(diag::err_typecheck_sub_ptr_object)
- << rex.get()->getSourceRange()
- << rex.get()->getType()))
- return QualType();
-
if (getLangOptions().CPlusPlus) {
// Pointee types must be the same: C++ [expr.add]
if (!Context.hasSameUnqualifiedType(lpointee, rpointee)) {
@@ -7332,13 +5895,9 @@ QualType Sema::CheckSubtractionOperands(ExprResult &lex, ExprResult &rex,
}
}
- if (ComplainAboutVoid)
- Diag(Loc, diag::ext_gnu_void_ptr)
- << lex.get()->getSourceRange() << rex.get()->getSourceRange();
- if (ComplainAboutFunc)
- Diag(Loc, diag::ext_gnu_ptr_func_arith)
- << ComplainAboutFunc->getType()
- << ComplainAboutFunc->getSourceRange();
+ if (!checkArithmeticBinOpPointerOperands(*this, Loc,
+ lex.get(), rex.get()))
+ return QualType();
if (CompLHSTy) *CompLHSTy = lex.get()->getType();
return Context.getPointerDiffType();
@@ -7394,19 +5953,24 @@ static void DiagnoseBadShiftValues(Sema& S, ExprResult &lex, ExprResult &rex,
llvm::APSInt Result = Left.extend(ResultBits.getLimitedValue());
Result = Result.shl(Right);
+ // Print the bit representation of the signed integer as an unsigned
+ // hexadecimal number.
+ llvm::SmallString<40> HexResult;
+ Result.toString(HexResult, 16, /*Signed =*/false, /*Literal =*/true);
+
// If we are only missing a sign bit, this is less likely to result in actual
// bugs -- if the result is cast back to an unsigned type, it will have the
// expected value. Thus we place this behind a different warning that can be
// turned off separately if needed.
if (LeftBits == ResultBits - 1) {
- S.Diag(Loc, diag::warn_shift_result_overrides_sign_bit)
- << Result.toString(10) << LHSTy
+ S.Diag(Loc, diag::warn_shift_result_sets_sign_bit)
+ << HexResult.str() << LHSTy
<< lex.get()->getSourceRange() << rex.get()->getSourceRange();
return;
}
S.Diag(Loc, diag::warn_shift_result_gt_typewidth)
- << Result.toString(10) << Result.getMinSignedBits() << LHSTy
+ << HexResult.str() << Result.getMinSignedBits() << LHSTy
<< Left.getBitWidth() << lex.get()->getSourceRange() << rex.get()->getSourceRange();
}
@@ -7427,7 +5991,7 @@ QualType Sema::CheckShiftOperands(ExprResult &lex, ExprResult &rex, SourceLocati
// Vector shifts promote their scalar inputs to vector type.
if (lex.get()->getType()->isVectorType() || rex.get()->getType()->isVectorType())
- return CheckVectorOperands(Loc, lex, rex);
+ return CheckVectorOperands(lex, rex, Loc, isCompAssign);
// Shifts don't perform usual arithmetic conversions, they just do integer
// promotions on each operand. C99 6.5.7p3
@@ -7720,7 +6284,8 @@ QualType Sema::CheckCompareOperands(ExprResult &lex, ExprResult &rex, SourceLoca
// comparisons of member pointers to null pointer constants.
if (RHSIsNull &&
((lType->isAnyPointerType() || lType->isNullPtrType()) ||
- (!isRelational && lType->isMemberPointerType()))) {
+ (!isRelational &&
+ (lType->isMemberPointerType() || lType->isBlockPointerType())))) {
rex = ImpCastExprToType(rex.take(), lType,
lType->isMemberPointerType()
? CK_NullToMemberPointer
@@ -7729,7 +6294,8 @@ QualType Sema::CheckCompareOperands(ExprResult &lex, ExprResult &rex, SourceLoca
}
if (LHSIsNull &&
((rType->isAnyPointerType() || rType->isNullPtrType()) ||
- (!isRelational && rType->isMemberPointerType()))) {
+ (!isRelational &&
+ (rType->isMemberPointerType() || rType->isBlockPointerType())))) {
lex = ImpCastExprToType(lex.take(), rType,
rType->isMemberPointerType()
? CK_NullToMemberPointer
@@ -7894,7 +6460,7 @@ QualType Sema::CheckVectorCompareOperands(ExprResult &lex, ExprResult &rex,
bool isRelational) {
// Check to make sure we're operating on vectors of the same type and width,
// Allowing one side to be a scalar of element type.
- QualType vType = CheckVectorOperands(Loc, lex, rex);
+ QualType vType = CheckVectorOperands(lex, rex, Loc, /*isCompAssign*/false);
if (vType.isNull())
return vType;
@@ -7949,7 +6515,7 @@ inline QualType Sema::CheckBitwiseOperands(
if (lex.get()->getType()->isVectorType() || rex.get()->getType()->isVectorType()) {
if (lex.get()->getType()->hasIntegerRepresentation() &&
rex.get()->getType()->hasIntegerRepresentation())
- return CheckVectorOperands(Loc, lex, rex);
+ return CheckVectorOperands(lex, rex, Loc, isCompAssign);
return InvalidOperands(Loc, lex, rex);
}
@@ -7975,8 +6541,8 @@ inline QualType Sema::CheckLogicalOperands( // C99 6.5.[13,14]
// is a constant.
if (lex.get()->getType()->isIntegerType() && !lex.get()->getType()->isBooleanType() &&
rex.get()->getType()->isIntegerType() && !rex.get()->isValueDependent() &&
- // Don't warn in macros.
- !Loc.isMacroID()) {
+ // Don't warn in macros or template instantiations.
+ !Loc.isMacroID() && ActiveTemplateInstantiations.empty()) {
// If the RHS can be constant folded, and if it constant folds to something
// that isn't 0 or 1 (which indicate a potential logical operation that
// happened to fold to true/false) then warn.
@@ -8099,7 +6665,43 @@ static bool CheckForModifiableLvalue(Expr *E, SourceLocation Loc, Sema &S) {
unsigned Diag = 0;
bool NeedType = false;
switch (IsLV) { // C99 6.5.16p2
- case Expr::MLV_ConstQualified: Diag = diag::err_typecheck_assign_const; break;
+ case Expr::MLV_ConstQualified:
+ Diag = diag::err_typecheck_assign_const;
+
+ // In ARC, use some specialized diagnostics for occasions where we
+ // infer 'const'. These are always pseudo-strong variables.
+ if (S.getLangOptions().ObjCAutoRefCount) {
+ DeclRefExpr *declRef = dyn_cast<DeclRefExpr>(E->IgnoreParenCasts());
+ if (declRef && isa<VarDecl>(declRef->getDecl())) {
+ VarDecl *var = cast<VarDecl>(declRef->getDecl());
+
+ // Use the normal diagnostic if it's pseudo-__strong but the
+ // user actually wrote 'const'.
+ if (var->isARCPseudoStrong() &&
+ (!var->getTypeSourceInfo() ||
+ !var->getTypeSourceInfo()->getType().isConstQualified())) {
+ // There are two pseudo-strong cases:
+ // - self
+ ObjCMethodDecl *method = S.getCurMethodDecl();
+ if (method && var == method->getSelfDecl())
+ Diag = diag::err_typecheck_arr_assign_self;
+
+ // - fast enumeration variables
+ else
+ Diag = diag::err_typecheck_arr_assign_enumeration;
+
+ SourceRange Assign;
+ if (Loc != OrigLoc)
+ Assign = SourceRange(OrigLoc, OrigLoc);
+ S.Diag(Loc, Diag) << E->getSourceRange() << Assign;
+ // We need to preserve the AST regardless, so migration tool
+ // can do its job.
+ return false;
+ }
+ }
+ }
+
+ break;
case Expr::MLV_ArrayType:
Diag = diag::err_typecheck_array_not_modifiable_lvalue;
NeedType = true;
@@ -8214,6 +6816,13 @@ QualType Sema::CheckAssignmentOperands(Expr *LHS, ExprResult &RHS,
<< SourceRange(UO->getOperatorLoc(), UO->getOperatorLoc());
}
}
+
+ if (ConvTy == Compatible) {
+ if (LHSType.getObjCLifetime() == Qualifiers::OCL_Strong)
+ checkRetainCycles(LHS, RHS.get());
+ else if (getLangOptions().ObjCAutoRefCount)
+ checkUnsafeExprAssigns(Loc, LHS, RHS.get());
+ }
} else {
// Compound assignment "x += y"
ConvTy = CheckAssignmentConstraints(Loc, LHSType, RHSType);
@@ -8295,29 +6904,9 @@ static QualType CheckIncrementDecrementOperand(Sema &S, Expr *Op,
QualType PointeeTy = ResType->getPointeeType();
// C99 6.5.2.4p2, 6.5.6p2
- if (PointeeTy->isVoidType()) {
- if (S.getLangOptions().CPlusPlus) {
- S.Diag(OpLoc, diag::err_typecheck_pointer_arith_void_type)
- << Op->getSourceRange();
- return QualType();
- }
-
- // Pointer to void is a GNU extension in C.
- S.Diag(OpLoc, diag::ext_gnu_void_ptr) << Op->getSourceRange();
- } else if (PointeeTy->isFunctionType()) {
- if (S.getLangOptions().CPlusPlus) {
- S.Diag(OpLoc, diag::err_typecheck_pointer_arith_function_type)
- << Op->getType() << Op->getSourceRange();
- return QualType();
- }
-
- S.Diag(OpLoc, diag::ext_gnu_ptr_func_arith)
- << ResType << Op->getSourceRange();
- } else if (S.RequireCompleteType(OpLoc, PointeeTy,
- S.PDiag(diag::err_typecheck_arithmetic_incomplete_type)
- << Op->getSourceRange()
- << ResType))
+ if (!checkArithmeticOpPointerOperand(S, OpLoc, Op))
return QualType();
+
// Diagnose bad cases where we step over interface counts.
else if (PointeeTy->isObjCObjectType() && S.LangOpts.ObjCNonFragileABI) {
S.Diag(OpLoc, diag::err_arithmetic_nonfragile_interface)
@@ -8400,6 +6989,8 @@ void Sema::ConvertPropertyForLValue(ExprResult &LHS, ExprResult &RHS, QualType &
LHS.get()->getObjectKind() == OK_ObjCProperty);
const ObjCPropertyRefExpr *PropRef = LHS.get()->getObjCProperty();
+ bool Consumed = false;
+
if (PropRef->isImplicitProperty()) {
// If using property-dot syntax notation for assignment, and there is a
// setter, RHS expression is being passed to the setter argument. So,
@@ -8407,6 +6998,8 @@ void Sema::ConvertPropertyForLValue(ExprResult &LHS, ExprResult &RHS, QualType &
if (const ObjCMethodDecl *SetterMD = PropRef->getImplicitPropertySetter()) {
ObjCMethodDecl::param_iterator P = SetterMD->param_begin();
LHSTy = (*P)->getType();
+ Consumed = (getLangOptions().ObjCAutoRefCount &&
+ (*P)->hasAttr<NSConsumedAttr>());
// Otherwise, if the getter returns an l-value, just call that.
} else {
@@ -8418,14 +7011,26 @@ void Sema::ConvertPropertyForLValue(ExprResult &LHS, ExprResult &RHS, QualType &
return;
}
}
+ } else if (getLangOptions().ObjCAutoRefCount) {
+ const ObjCMethodDecl *setter
+ = PropRef->getExplicitProperty()->getSetterMethodDecl();
+ if (setter) {
+ ObjCMethodDecl::param_iterator P = setter->param_begin();
+ LHSTy = (*P)->getType();
+ Consumed = (*P)->hasAttr<NSConsumedAttr>();
+ }
}
- if (getLangOptions().CPlusPlus && LHSTy->isRecordType()) {
+ if ((getLangOptions().CPlusPlus && LHSTy->isRecordType()) ||
+ getLangOptions().ObjCAutoRefCount) {
InitializedEntity Entity =
- InitializedEntity::InitializeParameter(Context, LHSTy);
+ InitializedEntity::InitializeParameter(Context, LHSTy, Consumed);
ExprResult ArgE = PerformCopyInitialization(Entity, SourceLocation(), RHS);
- if (!ArgE.isInvalid())
+ if (!ArgE.isInvalid()) {
RHS = ArgE;
+ if (getLangOptions().ObjCAutoRefCount && !PropRef->isSuperReceiver())
+ checkRetainCycles(const_cast<Expr*>(PropRef->getBase()), RHS.get());
+ }
}
}
@@ -8682,8 +7287,7 @@ static QualType CheckIndirectionOperand(Sema &S, Expr *Op, ExprValueKind &VK,
VK = VK_LValue;
// ...except that certain expressions are never l-values in C.
- if (!S.getLangOptions().CPlusPlus &&
- IsCForbiddenLValueType(S.Context, Result))
+ if (!S.getLangOptions().CPlusPlus && Result.isCForbiddenLValueType())
VK = VK_RValue;
return Result;
@@ -8815,6 +7419,53 @@ ExprResult Sema::CreateBuiltinBinOp(SourceLocation OpLoc,
rhs = move(resolvedRHS);
}
+ // The canonical way to check for a GNU null is with isNullPointerConstant,
+ // but we use a bit of a hack here for speed; this is a relatively
+ // hot path, and isNullPointerConstant is slow.
+ bool LeftNull = isa<GNUNullExpr>(lhs.get()->IgnoreParenImpCasts());
+ bool RightNull = isa<GNUNullExpr>(rhs.get()->IgnoreParenImpCasts());
+
+ // Detect when a NULL constant is used improperly in an expression. These
+ // are mainly cases where the null pointer is used as an integer instead
+ // of a pointer.
+ if (LeftNull || RightNull) {
+ // Avoid analyzing cases where the result will either be invalid (and
+ // diagnosed as such) or entirely valid and not something to warn about.
+ QualType LeftType = lhs.get()->getType();
+ QualType RightType = rhs.get()->getType();
+ if (!LeftType->isBlockPointerType() && !LeftType->isMemberPointerType() &&
+ !LeftType->isFunctionType() &&
+ !RightType->isBlockPointerType() &&
+ !RightType->isMemberPointerType() &&
+ !RightType->isFunctionType()) {
+ if (Opc == BO_Mul || Opc == BO_Div || Opc == BO_Rem || Opc == BO_Add ||
+ Opc == BO_Sub || Opc == BO_Shl || Opc == BO_Shr || Opc == BO_And ||
+ Opc == BO_Xor || Opc == BO_Or || Opc == BO_MulAssign ||
+ Opc == BO_DivAssign || Opc == BO_AddAssign || Opc == BO_SubAssign ||
+ Opc == BO_RemAssign || Opc == BO_ShlAssign || Opc == BO_ShrAssign ||
+ Opc == BO_AndAssign || Opc == BO_OrAssign || Opc == BO_XorAssign) {
+ // These are the operations that would not make sense with a null pointer
+ // no matter what the other expression is.
+ Diag(OpLoc, diag::warn_null_in_arithmetic_operation)
+ << (LeftNull ? lhs.get()->getSourceRange() : SourceRange())
+ << (RightNull ? rhs.get()->getSourceRange() : SourceRange());
+ } else if (Opc == BO_LE || Opc == BO_LT || Opc == BO_GE || Opc == BO_GT ||
+ Opc == BO_EQ || Opc == BO_NE) {
+ // These are the operations that would not make sense with a null pointer
+ // if the other expression the other expression is not a pointer.
+ if (LeftNull != RightNull &&
+ !LeftType->isAnyPointerType() &&
+ !LeftType->canDecayToPointerType() &&
+ !RightType->isAnyPointerType() &&
+ !RightType->canDecayToPointerType()) {
+ Diag(OpLoc, diag::warn_null_in_arithmetic_operation)
+ << (LeftNull ? lhs.get()->getSourceRange()
+ : rhs.get()->getSourceRange());
+ }
+ }
+ }
+ }
+
switch (Opc) {
case BO_Assign:
ResultTy = CheckAssignmentOperands(lhs.get(), rhs, OpLoc, QualType());
@@ -8953,28 +7604,46 @@ static void DiagnoseBitwisePrecedence(Sema &Self, BinaryOperatorKind Opc,
(BinOp::isComparisonOp(rhsopc) || BinOp::isBitwiseOp(rhsopc)))
return;
- if (BinOp::isComparisonOp(lhsopc))
+ if (BinOp::isComparisonOp(lhsopc)) {
+ Self.Diag(OpLoc, diag::warn_precedence_bitwise_rel)
+ << SourceRange(lhs->getLocStart(), OpLoc)
+ << BinOp::getOpcodeStr(Opc) << BinOp::getOpcodeStr(lhsopc);
SuggestParentheses(Self, OpLoc,
- Self.PDiag(diag::warn_precedence_bitwise_rel)
- << SourceRange(lhs->getLocStart(), OpLoc)
- << BinOp::getOpcodeStr(Opc) << BinOp::getOpcodeStr(lhsopc),
Self.PDiag(diag::note_precedence_bitwise_silence)
<< BinOp::getOpcodeStr(lhsopc),
- lhs->getSourceRange(),
+ lhs->getSourceRange());
+ SuggestParentheses(Self, OpLoc,
Self.PDiag(diag::note_precedence_bitwise_first)
<< BinOp::getOpcodeStr(Opc),
SourceRange(cast<BinOp>(lhs)->getRHS()->getLocStart(), rhs->getLocEnd()));
- else if (BinOp::isComparisonOp(rhsopc))
+ } else if (BinOp::isComparisonOp(rhsopc)) {
+ Self.Diag(OpLoc, diag::warn_precedence_bitwise_rel)
+ << SourceRange(OpLoc, rhs->getLocEnd())
+ << BinOp::getOpcodeStr(Opc) << BinOp::getOpcodeStr(rhsopc);
SuggestParentheses(Self, OpLoc,
- Self.PDiag(diag::warn_precedence_bitwise_rel)
- << SourceRange(OpLoc, rhs->getLocEnd())
- << BinOp::getOpcodeStr(Opc) << BinOp::getOpcodeStr(rhsopc),
Self.PDiag(diag::note_precedence_bitwise_silence)
<< BinOp::getOpcodeStr(rhsopc),
- rhs->getSourceRange(),
+ rhs->getSourceRange());
+ SuggestParentheses(Self, OpLoc,
Self.PDiag(diag::note_precedence_bitwise_first)
<< BinOp::getOpcodeStr(Opc),
- SourceRange(lhs->getLocEnd(), cast<BinOp>(rhs)->getLHS()->getLocStart()));
+ SourceRange(lhs->getLocStart(),
+ cast<BinOp>(rhs)->getLHS()->getLocStart()));
+ }
+}
+
+/// \brief It accepts a '&' expr that is inside a '|' one.
+/// Emit a diagnostic together with a fixit hint that wraps the '&' expression
+/// in parentheses.
+static void
+EmitDiagnosticForBitwiseAndInBitwiseOr(Sema &Self, SourceLocation OpLoc,
+ BinaryOperator *Bop) {
+ assert(Bop->getOpcode() == BO_And);
+ Self.Diag(Bop->getOperatorLoc(), diag::warn_bitwise_and_in_bitwise_or)
+ << Bop->getSourceRange() << OpLoc;
+ SuggestParentheses(Self, Bop->getOperatorLoc(),
+ Self.PDiag(diag::note_bitwise_and_in_bitwise_or_silence),
+ Bop->getSourceRange());
}
/// \brief It accepts a '&&' expr that is inside a '||' one.
@@ -8984,12 +7653,11 @@ static void
EmitDiagnosticForLogicalAndInLogicalOr(Sema &Self, SourceLocation OpLoc,
BinaryOperator *Bop) {
assert(Bop->getOpcode() == BO_LAnd);
+ Self.Diag(Bop->getOperatorLoc(), diag::warn_logical_and_in_logical_or)
+ << Bop->getSourceRange() << OpLoc;
SuggestParentheses(Self, Bop->getOperatorLoc(),
- Self.PDiag(diag::warn_logical_and_in_logical_or)
- << Bop->getSourceRange() << OpLoc,
Self.PDiag(diag::note_logical_and_in_logical_or_silence),
- Bop->getSourceRange(),
- Self.PDiag(0), SourceRange());
+ Bop->getSourceRange());
}
/// \brief Returns true if the given expression can be evaluated as a constant
@@ -9043,13 +7711,28 @@ static void DiagnoseLogicalAndInLogicalOrRHS(Sema &S, SourceLocation OpLoc,
}
}
+/// \brief Look for '&' in the left or right hand of a '|' expr.
+static void DiagnoseBitwiseAndInBitwiseOr(Sema &S, SourceLocation OpLoc,
+ Expr *OrArg) {
+ if (BinaryOperator *Bop = dyn_cast<BinaryOperator>(OrArg)) {
+ if (Bop->getOpcode() == BO_And)
+ return EmitDiagnosticForBitwiseAndInBitwiseOr(S, OpLoc, Bop);
+ }
+}
+
/// DiagnoseBinOpPrecedence - Emit warnings for expressions with tricky
/// precedence.
static void DiagnoseBinOpPrecedence(Sema &Self, BinaryOperatorKind Opc,
SourceLocation OpLoc, Expr *lhs, Expr *rhs){
// Diagnose "arg1 'bitwise' arg2 'eq' arg3".
if (BinaryOperator::isBitwiseOp(Opc))
- return DiagnoseBitwisePrecedence(Self, Opc, OpLoc, lhs, rhs);
+ DiagnoseBitwisePrecedence(Self, Opc, OpLoc, lhs, rhs);
+
+ // Diagnose "arg1 & arg2 | arg3"
+ if (Opc == BO_Or && !OpLoc.isMacroID()/* Don't warn in macros. */) {
+ DiagnoseBitwiseAndInBitwiseOr(Self, OpLoc, lhs);
+ DiagnoseBitwiseAndInBitwiseOr(Self, OpLoc, rhs);
+ }
// Warn about arg1 || arg2 && arg3, as GCC 4.3+ does.
// We don't warn for 'assert(a || b && "bad")' since this is safe.
@@ -9274,6 +7957,29 @@ ExprResult Sema::ActOnAddrLabel(SourceLocation OpLoc, SourceLocation LabLoc,
Context.getPointerType(Context.VoidTy)));
}
+/// Given the last statement in a statement-expression, check whether
+/// the result is a producing expression (like a call to an
+/// ns_returns_retained function) and, if so, rebuild it to hoist the
+/// release out of the full-expression. Otherwise, return null.
+/// Cannot fail.
+static Expr *maybeRebuildARCConsumingStmt(Stmt *s) {
+ // Should always be wrapped with one of these.
+ ExprWithCleanups *cleanups = dyn_cast<ExprWithCleanups>(s);
+ if (!cleanups) return 0;
+
+ ImplicitCastExpr *cast = dyn_cast<ImplicitCastExpr>(cleanups->getSubExpr());
+ if (!cast || cast->getCastKind() != CK_ObjCConsumeObject)
+ return 0;
+
+ // Splice out the cast. This shouldn't modify any interesting
+ // features of the statement.
+ Expr *producer = cast->getSubExpr();
+ assert(producer->getType() == cast->getType());
+ assert(producer->getValueKind() == cast->getValueKind());
+ cleanups->setSubExpr(producer);
+ return cleanups;
+}
+
ExprResult
Sema::ActOnStmtExpr(SourceLocation LPLoc, Stmt *SubStmt,
SourceLocation RPLoc) { // "({..})"
@@ -9301,6 +8007,7 @@ Sema::ActOnStmtExpr(SourceLocation LPLoc, Stmt *SubStmt,
LastLabelStmt = Label;
LastStmt = Label->getSubStmt();
}
+
if (Expr *LastE = dyn_cast<Expr>(LastStmt)) {
// Do function/array conversion on the last expression, but not
// lvalue-to-rvalue. However, initialize an unqualified type.
@@ -9310,12 +8017,24 @@ Sema::ActOnStmtExpr(SourceLocation LPLoc, Stmt *SubStmt,
Ty = LastExpr.get()->getType().getUnqualifiedType();
if (!Ty->isDependentType() && !LastExpr.get()->isTypeDependent()) {
- LastExpr = PerformCopyInitialization(
+ // In ARC, if the final expression ends in a consume, splice
+ // the consume out and bind it later. In the alternate case
+ // (when dealing with a retainable type), the result
+ // initialization will create a produce. In both cases the
+ // result will be +1, and we'll need to balance that out with
+ // a bind.
+ if (Expr *rebuiltLastStmt
+ = maybeRebuildARCConsumingStmt(LastExpr.get())) {
+ LastExpr = rebuiltLastStmt;
+ } else {
+ LastExpr = PerformCopyInitialization(
InitializedEntity::InitializeResult(LPLoc,
Ty,
false),
SourceLocation(),
- LastExpr);
+ LastExpr);
+ }
+
if (LastExpr.isInvalid())
return ExprError();
if (LastExpr.get() != 0) {
@@ -9757,7 +8476,7 @@ ExprResult Sema::ActOnBlockStmtExpr(SourceLocation CaretLoc,
// If we don't have a function type, just build one from nothing.
} else {
FunctionProtoType::ExtProtoInfo EPI;
- EPI.ExtInfo = FunctionType::ExtInfo(NoReturn, false, 0, CC_Default);
+ EPI.ExtInfo = FunctionType::ExtInfo().withNoReturn(NoReturn);
BlockTy = Context.getFunctionType(RetTy, 0, 0, EPI);
}
@@ -9766,15 +8485,25 @@ ExprResult Sema::ActOnBlockStmtExpr(SourceLocation CaretLoc,
BlockTy = Context.getBlockPointerType(BlockTy);
// If needed, diagnose invalid gotos and switches in the block.
- if (getCurFunction()->NeedsScopeChecking() && !hasAnyErrorsInThisFunction())
+ if (getCurFunction()->NeedsScopeChecking() &&
+ !hasAnyUnrecoverableErrorsInThisFunction())
DiagnoseInvalidJumps(cast<CompoundStmt>(Body));
BSI->TheDecl->setBody(cast<CompoundStmt>(Body));
- BlockExpr *Result = new (Context) BlockExpr(BSI->TheDecl, BlockTy);
+ for (BlockDecl::capture_const_iterator ci = BSI->TheDecl->capture_begin(),
+ ce = BSI->TheDecl->capture_end(); ci != ce; ++ci) {
+ const VarDecl *variable = ci->getVariable();
+ QualType T = variable->getType();
+ QualType::DestructionKind destructKind = T.isDestructedType();
+ if (destructKind != QualType::DK_none)
+ getCurFunction()->setHasBranchProtectedScope();
+ }
+ BlockExpr *Result = new (Context) BlockExpr(BSI->TheDecl, BlockTy);
const AnalysisBasedWarnings::Policy &WP = AnalysisWarnings.getDefaultPolicy();
PopFunctionOrBlockScope(&WP, Result->getBlockDecl(), Result);
+
return Owned(Result);
}
@@ -9818,8 +8547,41 @@ ExprResult Sema::BuildVAArgExpr(SourceLocation BuiltinLoc,
<< OrigExpr->getType() << E->getSourceRange());
}
- // FIXME: Check that type is complete/non-abstract
- // FIXME: Warn if a non-POD type is passed in.
+ if (!TInfo->getType()->isDependentType()) {
+ if (RequireCompleteType(TInfo->getTypeLoc().getBeginLoc(), TInfo->getType(),
+ PDiag(diag::err_second_parameter_to_va_arg_incomplete)
+ << TInfo->getTypeLoc().getSourceRange()))
+ return ExprError();
+
+ if (RequireNonAbstractType(TInfo->getTypeLoc().getBeginLoc(),
+ TInfo->getType(),
+ PDiag(diag::err_second_parameter_to_va_arg_abstract)
+ << TInfo->getTypeLoc().getSourceRange()))
+ return ExprError();
+
+ if (!TInfo->getType().isPODType(Context))
+ Diag(TInfo->getTypeLoc().getBeginLoc(),
+ diag::warn_second_parameter_to_va_arg_not_pod)
+ << TInfo->getType()
+ << TInfo->getTypeLoc().getSourceRange();
+
+ // Check for va_arg where arguments of the given type will be promoted
+ // (i.e. this va_arg is guaranteed to have undefined behavior).
+ QualType PromoteType;
+ if (TInfo->getType()->isPromotableIntegerType()) {
+ PromoteType = Context.getPromotedIntegerType(TInfo->getType());
+ if (Context.typesAreCompatible(PromoteType, TInfo->getType()))
+ PromoteType = QualType();
+ }
+ if (TInfo->getType()->isSpecificBuiltinType(BuiltinType::Float))
+ PromoteType = Context.DoubleTy;
+ if (!PromoteType.isNull())
+ Diag(TInfo->getTypeLoc().getBeginLoc(),
+ diag::warn_second_parameter_to_va_arg_never_compatible)
+ << TInfo->getType()
+ << PromoteType
+ << TInfo->getTypeLoc().getSourceRange();
+ }
QualType T = TInfo->getType().getNonLValueExprType(Context);
return Owned(new (Context) VAArgExpr(BuiltinLoc, E, TInfo, RPLoc, T));
@@ -9913,6 +8675,11 @@ bool Sema::DiagnoseAssignmentResult(AssignConvertType ConvTy,
if (lhq.getAddressSpace() != rhq.getAddressSpace()) {
DiagKind = diag::err_typecheck_incompatible_address_space;
break;
+
+
+ } else if (lhq.getObjCLifetime() != rhq.getObjCLifetime()) {
+ DiagKind = diag::err_typecheck_incompatible_ownership;
+ break;
}
llvm_unreachable("unknown error case for discarding qualifiers!");
@@ -9950,6 +8717,9 @@ bool Sema::DiagnoseAssignmentResult(AssignConvertType ConvTy,
case IncompatibleVectors:
DiagKind = diag::warn_incompatible_vectors;
break;
+ case IncompatibleObjCWeakRef:
+ DiagKind = diag::err_arc_weak_unavailable_assign;
+ break;
case Incompatible:
DiagKind = diag::err_typecheck_convert_incompatible;
isInvalid = true;
@@ -10027,7 +8797,10 @@ bool Sema::VerifyIntegerConstantExpression(const Expr *E, llvm::APSInt *Result){
void
Sema::PushExpressionEvaluationContext(ExpressionEvaluationContext NewContext) {
ExprEvalContexts.push_back(
- ExpressionEvaluationContextRecord(NewContext, ExprTemporaries.size()));
+ ExpressionEvaluationContextRecord(NewContext,
+ ExprTemporaries.size(),
+ ExprNeedsCleanups));
+ ExprNeedsCleanups = false;
}
void
@@ -10062,15 +8835,27 @@ Sema::PopExpressionEvaluationContext() {
// temporaries that we may have created as part of the evaluation of
// the expression in that context: they aren't relevant because they
// will never be constructed.
- if (Rec.Context == Unevaluated &&
- ExprTemporaries.size() > Rec.NumTemporaries)
+ if (Rec.Context == Unevaluated) {
ExprTemporaries.erase(ExprTemporaries.begin() + Rec.NumTemporaries,
ExprTemporaries.end());
+ ExprNeedsCleanups = Rec.ParentNeedsCleanups;
+
+ // Otherwise, merge the contexts together.
+ } else {
+ ExprNeedsCleanups |= Rec.ParentNeedsCleanups;
+ }
// Destroy the popped expression evaluation record.
Rec.Destroy();
}
+void Sema::DiscardCleanupsInEvaluationContext() {
+ ExprTemporaries.erase(
+ ExprTemporaries.begin() + ExprEvalContexts.back().NumTemporaries,
+ ExprTemporaries.end());
+ ExprNeedsCleanups = false;
+}
+
/// \brief Note that the given declaration was referenced in the source code.
///
/// This routine should be invoke whenever a given declaration is referenced
@@ -10364,7 +9149,7 @@ void Sema::MarkDeclarationsReferencedInExpr(Expr *E) {
/// during overload resolution or within sizeof/alignof/typeof/typeid.
bool Sema::DiagRuntimeBehavior(SourceLocation Loc, const Stmt *stmt,
const PartialDiagnostic &PD) {
- switch (ExprEvalContexts.back().Context ) {
+ switch (ExprEvalContexts.back().Context) {
case Unevaluated:
// The argument will never be evaluated, so don't complain.
break;
@@ -10780,9 +9565,6 @@ ExprResult RebuildUnknownAnyExpr::VisitCallExpr(CallExpr *call) {
}
ExprResult RebuildUnknownAnyExpr::VisitObjCMessageExpr(ObjCMessageExpr *msg) {
- ObjCMethodDecl *method = msg->getMethodDecl();
- assert(method && "__unknown_anytype message without result type?");
-
// Verify that this is a legal result type of a call.
if (DestType->isArrayType() || DestType->isFunctionType()) {
S.Diag(msg->getExprLoc(), diag::err_func_returning_array_function)
@@ -10790,8 +9572,11 @@ ExprResult RebuildUnknownAnyExpr::VisitObjCMessageExpr(ObjCMessageExpr *msg) {
return ExprError();
}
- assert(method->getResultType() == S.Context.UnknownAnyTy);
- method->setResultType(DestType);
+ // Rewrite the method result type if available.
+ if (ObjCMethodDecl *method = msg->getMethodDecl()) {
+ assert(method->getResultType() == S.Context.UnknownAnyTy);
+ method->setResultType(DestType);
+ }
// Change the type of the message.
msg->setType(DestType.getNonReferenceType());
diff --git a/contrib/llvm/tools/clang/lib/Sema/SemaExprCXX.cpp b/contrib/llvm/tools/clang/lib/Sema/SemaExprCXX.cpp
index 2f5a890..e804fcd 100644
--- a/contrib/llvm/tools/clang/lib/Sema/SemaExprCXX.cpp
+++ b/contrib/llvm/tools/clang/lib/Sema/SemaExprCXX.cpp
@@ -480,23 +480,63 @@ Sema::ActOnCXXNullPtrLiteral(SourceLocation Loc) {
/// ActOnCXXThrow - Parse throw expressions.
ExprResult
-Sema::ActOnCXXThrow(SourceLocation OpLoc, Expr *Ex) {
+Sema::ActOnCXXThrow(Scope *S, SourceLocation OpLoc, Expr *Ex) {
+ bool IsThrownVarInScope = false;
+ if (Ex) {
+ // C++0x [class.copymove]p31:
+ // When certain criteria are met, an implementation is allowed to omit the
+ // copy/move construction of a class object [...]
+ //
+ // - in a throw-expression, when the operand is the name of a
+ // non-volatile automatic object (other than a function or catch-
+ // clause parameter) whose scope does not extend beyond the end of the
+ // innermost enclosing try-block (if there is one), the copy/move
+ // operation from the operand to the exception object (15.1) can be
+ // omitted by constructing the automatic object directly into the
+ // exception object
+ if (DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(Ex->IgnoreParens()))
+ if (VarDecl *Var = dyn_cast<VarDecl>(DRE->getDecl())) {
+ if (Var->hasLocalStorage() && !Var->getType().isVolatileQualified()) {
+ for( ; S; S = S->getParent()) {
+ if (S->isDeclScope(Var)) {
+ IsThrownVarInScope = true;
+ break;
+ }
+
+ if (S->getFlags() &
+ (Scope::FnScope | Scope::ClassScope | Scope::BlockScope |
+ Scope::FunctionPrototypeScope | Scope::ObjCMethodScope |
+ Scope::TryScope))
+ break;
+ }
+ }
+ }
+ }
+
+ return BuildCXXThrow(OpLoc, Ex, IsThrownVarInScope);
+}
+
+ExprResult Sema::BuildCXXThrow(SourceLocation OpLoc, Expr *Ex,
+ bool IsThrownVarInScope) {
// Don't report an error if 'throw' is used in system headers.
if (!getLangOptions().CXXExceptions &&
!getSourceManager().isInSystemHeader(OpLoc))
Diag(OpLoc, diag::err_exceptions_disabled) << "throw";
-
+
if (Ex && !Ex->isTypeDependent()) {
- ExprResult ExRes = CheckCXXThrowOperand(OpLoc, Ex);
+ ExprResult ExRes = CheckCXXThrowOperand(OpLoc, Ex, IsThrownVarInScope);
if (ExRes.isInvalid())
return ExprError();
Ex = ExRes.take();
}
- return Owned(new (Context) CXXThrowExpr(Ex, Context.VoidTy, OpLoc));
+
+ return Owned(new (Context) CXXThrowExpr(Ex, Context.VoidTy, OpLoc,
+ IsThrownVarInScope));
}
/// CheckCXXThrowOperand - Validate the operand of a throw.
-ExprResult Sema::CheckCXXThrowOperand(SourceLocation ThrowLoc, Expr *E) {
+ExprResult Sema::CheckCXXThrowOperand(SourceLocation ThrowLoc, Expr *E,
+ bool IsThrownVarInScope) {
// C++ [except.throw]p3:
// A throw-expression initializes a temporary object, called the exception
// object, the type of which is determined by removing any top-level
@@ -535,14 +575,28 @@ ExprResult Sema::CheckCXXThrowOperand(SourceLocation ThrowLoc, Expr *E) {
// Initialize the exception result. This implicitly weeds out
// abstract types or types with inaccessible copy constructors.
- const VarDecl *NRVOVariable = getCopyElisionCandidate(QualType(), E, false);
-
- // FIXME: Determine whether we can elide this copy per C++0x [class.copy]p32.
+
+ // C++0x [class.copymove]p31:
+ // When certain criteria are met, an implementation is allowed to omit the
+ // copy/move construction of a class object [...]
+ //
+ // - in a throw-expression, when the operand is the name of a
+ // non-volatile automatic object (other than a function or catch-clause
+ // parameter) whose scope does not extend beyond the end of the
+ // innermost enclosing try-block (if there is one), the copy/move
+ // operation from the operand to the exception object (15.1) can be
+ // omitted by constructing the automatic object directly into the
+ // exception object
+ const VarDecl *NRVOVariable = 0;
+ if (IsThrownVarInScope)
+ NRVOVariable = getCopyElisionCandidate(QualType(), E, false);
+
InitializedEntity Entity =
InitializedEntity::InitializeException(ThrowLoc, E->getType(),
- /*NRVO=*/false);
+ /*NRVO=*/NRVOVariable != 0);
Res = PerformMoveOrCopyInitialization(Entity, NRVOVariable,
- QualType(), E);
+ QualType(), E,
+ IsThrownVarInScope);
if (Res.isInvalid())
return ExprError();
E = Res.take();
@@ -691,7 +745,8 @@ Sema::BuildCXXTypeConstructExpr(TypeSourceInfo *TInfo,
ExprValueKind VK = VK_RValue;
CXXCastPath BasePath;
ExprResult CastExpr =
- CheckCastTypes(TInfo->getTypeLoc().getSourceRange(), Ty, Exprs[0],
+ CheckCastTypes(TInfo->getTypeLoc().getBeginLoc(),
+ TInfo->getTypeLoc().getSourceRange(), Ty, Exprs[0],
Kind, VK, BasePath,
/*FunctionalStyle=*/true);
if (CastExpr.isInvalid())
@@ -827,8 +882,7 @@ Sema::ActOnCXXNew(SourceLocation StartLoc, bool UseGlobal,
}
}
- TypeSourceInfo *TInfo = GetTypeForDeclarator(D, /*Scope=*/0, /*OwnedDecl=*/0,
- /*AllowAuto=*/true);
+ TypeSourceInfo *TInfo = GetTypeForDeclarator(D, /*Scope=*/0);
QualType AllocType = TInfo->getType();
if (D.isInvalidType())
return ExprError();
@@ -902,8 +956,16 @@ Sema::BuildCXXNew(SourceLocation StartLoc, bool UseGlobal,
if (CheckAllocatedType(AllocType, TypeRange.getBegin(), TypeRange))
return ExprError();
- QualType ResultType = Context.getPointerType(AllocType);
+ // In ARC, infer 'retaining' for the allocated
+ if (getLangOptions().ObjCAutoRefCount &&
+ AllocType.getObjCLifetime() == Qualifiers::OCL_None &&
+ AllocType->isObjCLifetimeType()) {
+ AllocType = Context.getLifetimeQualifiedType(AllocType,
+ AllocType->getObjCARCImplicitLifetime());
+ }
+ QualType ResultType = Context.getPointerType(AllocType);
+
// C++ 5.3.4p6: "The expression in a direct-new-declarator shall have integral
// or enumeration type with a non-negative value."
if (ArraySize && !ArraySize->isTypeDependent()) {
@@ -964,6 +1026,14 @@ Sema::BuildCXXNew(SourceLocation StartLoc, bool UseGlobal,
}
}
+ // ARC: warn about ABI issues.
+ if (getLangOptions().ObjCAutoRefCount) {
+ QualType BaseAllocType = Context.getBaseElementType(AllocType);
+ if (BaseAllocType.hasStrongOrWeakObjCLifetime())
+ Diag(StartLoc, diag::warn_err_new_delete_object_array)
+ << 0 << BaseAllocType;
+ }
+
// Note that we do *not* convert the argument in any way. It can
// be signed, larger than size_t, whatever.
}
@@ -1078,7 +1148,17 @@ Sema::BuildCXXNew(SourceLocation StartLoc, bool UseGlobal,
if (OperatorDelete)
MarkDeclarationReferenced(StartLoc, OperatorDelete);
- // FIXME: Also check that the destructor is accessible. (C++ 5.3.4p16)
+ // C++0x [expr.new]p17:
+ // If the new expression creates an array of objects of class type,
+ // access and ambiguity control are done for the destructor.
+ if (ArraySize && Constructor) {
+ if (CXXDestructorDecl *dtor = LookupDestructor(Constructor->getParent())) {
+ MarkDeclarationReferenced(StartLoc, dtor);
+ CheckDestructorAccess(StartLoc, dtor,
+ PDiag(diag::err_access_dtor)
+ << Context.getBaseElementType(AllocType));
+ }
+ }
PlacementArgs.release();
ConstructorArgs.release();
@@ -1122,6 +1202,15 @@ bool Sema::CheckAllocatedType(QualType AllocType, SourceLocation Loc,
else if (unsigned AddressSpace = AllocType.getAddressSpace())
return Diag(Loc, diag::err_address_space_qualified_new)
<< AllocType.getUnqualifiedType() << AddressSpace;
+ else if (getLangOptions().ObjCAutoRefCount) {
+ if (const ArrayType *AT = Context.getAsArrayType(AllocType)) {
+ QualType BaseAllocType = Context.getBaseElementType(AT);
+ if (BaseAllocType.getObjCLifetime() == Qualifiers::OCL_None &&
+ BaseAllocType->isObjCLifetimeType())
+ return Diag(Loc, diag::err_arc_new_array_without_ownership)
+ << BaseAllocType;
+ }
+ }
return false;
}
@@ -1774,8 +1863,9 @@ Sema::ActOnCXXDelete(SourceLocation StartLoc, bool UseGlobal,
// delete-expression; it is not necessary to cast away the constness
// (5.2.11) of the pointer expression before it is used as the operand
// of the delete-expression. ]
- Ex = ImpCastExprToType(Ex.take(), Context.getPointerType(Context.VoidTy),
- CK_NoOp);
+ if (!Context.hasSameType(Ex.get()->getType(), Context.VoidPtrTy))
+ Ex = Owned(ImplicitCastExpr::Create(Context, Context.VoidPtrTy, CK_NoOp,
+ Ex.take(), 0, VK_RValue));
if (Pointee->isArrayType() && !ArrayForm) {
Diag(StartLoc, diag::warn_delete_array_type)
@@ -1830,6 +1920,14 @@ Sema::ActOnCXXDelete(SourceLocation StartLoc, bool UseGlobal,
if (!dtor || !dtor->isVirtual())
Diag(StartLoc, diag::warn_delete_non_virtual_dtor) << PointeeElem;
}
+
+ } else if (getLangOptions().ObjCAutoRefCount &&
+ PointeeElem->isObjCLifetimeType() &&
+ (PointeeElem.getObjCLifetime() == Qualifiers::OCL_Strong ||
+ PointeeElem.getObjCLifetime() == Qualifiers::OCL_Weak) &&
+ ArrayForm) {
+ Diag(StartLoc, diag::warn_err_new_delete_object_array)
+ << 1 << PointeeElem;
}
if (!OperatorDelete) {
@@ -1988,11 +2086,12 @@ static ExprResult BuildCXXCastArgument(Sema &S,
ExprResult
Sema::PerformImplicitConversion(Expr *From, QualType ToType,
const ImplicitConversionSequence &ICS,
- AssignmentAction Action, bool CStyle) {
+ AssignmentAction Action,
+ CheckedConversionKind CCK) {
switch (ICS.getKind()) {
case ImplicitConversionSequence::StandardConversion: {
ExprResult Res = PerformImplicitConversion(From, ToType, ICS.Standard,
- Action, CStyle);
+ Action, CCK);
if (Res.isInvalid())
return ExprError();
From = Res.take();
@@ -2027,7 +2126,7 @@ Sema::PerformImplicitConversion(Expr *From, QualType ToType,
ExprResult Res =
PerformImplicitConversion(From, BeforeToType,
ICS.UserDefined.Before, AA_Converting,
- CStyle);
+ CCK);
if (Res.isInvalid())
return ExprError();
From = Res.take();
@@ -2047,7 +2146,7 @@ Sema::PerformImplicitConversion(Expr *From, QualType ToType,
From = CastArg.take();
return PerformImplicitConversion(From, ToType, ICS.UserDefined.After,
- AA_Converting, CStyle);
+ AA_Converting, CCK);
}
case ImplicitConversionSequence::AmbiguousConversion:
@@ -2076,13 +2175,16 @@ Sema::PerformImplicitConversion(Expr *From, QualType ToType,
ExprResult
Sema::PerformImplicitConversion(Expr *From, QualType ToType,
const StandardConversionSequence& SCS,
- AssignmentAction Action, bool CStyle) {
+ AssignmentAction Action,
+ CheckedConversionKind CCK) {
+ bool CStyle = (CCK == CCK_CStyleCast || CCK == CCK_FunctionalCast);
+
// Overall FIXME: we are recomputing too many types here and doing far too
// much extra work. What this means is that we need to keep track of more
// information that is computed when we try the implicit conversion initially,
// so that we don't need to recompute anything here.
QualType FromType = From->getType();
-
+
if (SCS.CopyConstructor) {
// FIXME: When can ToType be a reference type?
assert(!ToType->isReferenceType());
@@ -2149,12 +2251,14 @@ Sema::PerformImplicitConversion(Expr *From, QualType ToType,
case ICK_Array_To_Pointer:
FromType = Context.getArrayDecayedType(FromType);
- From = ImpCastExprToType(From, FromType, CK_ArrayToPointerDecay).take();
+ From = ImpCastExprToType(From, FromType, CK_ArrayToPointerDecay,
+ VK_RValue, /*BasePath=*/0, CCK).take();
break;
case ICK_Function_To_Pointer:
FromType = Context.getPointerType(FromType);
- From = ImpCastExprToType(From, FromType, CK_FunctionToPointerDecay).take();
+ From = ImpCastExprToType(From, FromType, CK_FunctionToPointerDecay,
+ VK_RValue, /*BasePath=*/0, CCK).take();
break;
default:
@@ -2178,17 +2282,20 @@ Sema::PerformImplicitConversion(Expr *From, QualType ToType,
if (CheckExceptionSpecCompatibility(From, ToType))
return ExprError();
- From = ImpCastExprToType(From, ToType, CK_NoOp).take();
+ From = ImpCastExprToType(From, ToType, CK_NoOp,
+ VK_RValue, /*BasePath=*/0, CCK).take();
break;
case ICK_Integral_Promotion:
case ICK_Integral_Conversion:
- From = ImpCastExprToType(From, ToType, CK_IntegralCast).take();
+ From = ImpCastExprToType(From, ToType, CK_IntegralCast,
+ VK_RValue, /*BasePath=*/0, CCK).take();
break;
case ICK_Floating_Promotion:
case ICK_Floating_Conversion:
- From = ImpCastExprToType(From, ToType, CK_FloatingCast).take();
+ From = ImpCastExprToType(From, ToType, CK_FloatingCast,
+ VK_RValue, /*BasePath=*/0, CCK).take();
break;
case ICK_Complex_Promotion:
@@ -2206,21 +2313,26 @@ Sema::PerformImplicitConversion(Expr *From, QualType ToType,
} else {
CK = CK_IntegralComplexCast;
}
- From = ImpCastExprToType(From, ToType, CK).take();
+ From = ImpCastExprToType(From, ToType, CK,
+ VK_RValue, /*BasePath=*/0, CCK).take();
break;
}
case ICK_Floating_Integral:
if (ToType->isRealFloatingType())
- From = ImpCastExprToType(From, ToType, CK_IntegralToFloating).take();
+ From = ImpCastExprToType(From, ToType, CK_IntegralToFloating,
+ VK_RValue, /*BasePath=*/0, CCK).take();
else
- From = ImpCastExprToType(From, ToType, CK_FloatingToIntegral).take();
+ From = ImpCastExprToType(From, ToType, CK_FloatingToIntegral,
+ VK_RValue, /*BasePath=*/0, CCK).take();
break;
case ICK_Compatible_Conversion:
- From = ImpCastExprToType(From, ToType, CK_NoOp).take();
+ From = ImpCastExprToType(From, ToType, CK_NoOp,
+ VK_RValue, /*BasePath=*/0, CCK).take();
break;
+ case ICK_Writeback_Conversion:
case ICK_Pointer_Conversion: {
if (SCS.IncompatibleObjC && Action != AA_Casting) {
// Diagnose incompatible Objective-C conversions
@@ -2234,17 +2346,30 @@ Sema::PerformImplicitConversion(Expr *From, QualType ToType,
diag::ext_typecheck_convert_incompatible_pointer)
<< From->getType() << ToType << Action
<< From->getSourceRange();
-
+
if (From->getType()->isObjCObjectPointerType() &&
ToType->isObjCObjectPointerType())
EmitRelatedResultTypeNote(From);
- }
-
+ }
+ else if (getLangOptions().ObjCAutoRefCount &&
+ !CheckObjCARCUnavailableWeakConversion(ToType,
+ From->getType())) {
+ if (Action == AA_Initializing)
+ Diag(From->getSourceRange().getBegin(),
+ diag::err_arc_weak_unavailable_assign);
+ else
+ Diag(From->getSourceRange().getBegin(),
+ diag::err_arc_convesion_of_weak_unavailable)
+ << (Action == AA_Casting) << From->getType() << ToType
+ << From->getSourceRange();
+ }
+
CastKind Kind = CK_Invalid;
CXXCastPath BasePath;
if (CheckPointerConversion(From, ToType, Kind, BasePath, CStyle))
return ExprError();
- From = ImpCastExprToType(From, ToType, Kind, VK_RValue, &BasePath).take();
+ From = ImpCastExprToType(From, ToType, Kind, VK_RValue, &BasePath, CCK)
+ .take();
break;
}
@@ -2255,13 +2380,15 @@ Sema::PerformImplicitConversion(Expr *From, QualType ToType,
return ExprError();
if (CheckExceptionSpecCompatibility(From, ToType))
return ExprError();
- From = ImpCastExprToType(From, ToType, Kind, VK_RValue, &BasePath).take();
+ From = ImpCastExprToType(From, ToType, Kind, VK_RValue, &BasePath, CCK)
+ .take();
break;
}
case ICK_Boolean_Conversion:
From = ImpCastExprToType(From, Context.BoolTy,
- ScalarTypeToBooleanCastKind(FromType)).take();
+ ScalarTypeToBooleanCastKind(FromType),
+ VK_RValue, /*BasePath=*/0, CCK).take();
break;
case ICK_Derived_To_Base: {
@@ -2276,16 +2403,18 @@ Sema::PerformImplicitConversion(Expr *From, QualType ToType,
From = ImpCastExprToType(From, ToType.getNonReferenceType(),
CK_DerivedToBase, CastCategory(From),
- &BasePath).take();
+ &BasePath, CCK).take();
break;
}
case ICK_Vector_Conversion:
- From = ImpCastExprToType(From, ToType, CK_BitCast).take();
+ From = ImpCastExprToType(From, ToType, CK_BitCast,
+ VK_RValue, /*BasePath=*/0, CCK).take();
break;
case ICK_Vector_Splat:
- From = ImpCastExprToType(From, ToType, CK_VectorSplat).take();
+ From = ImpCastExprToType(From, ToType, CK_VectorSplat,
+ VK_RValue, /*BasePath=*/0, CCK).take();
break;
case ICK_Complex_Real:
@@ -2321,27 +2450,30 @@ Sema::PerformImplicitConversion(Expr *From, QualType ToType,
// _Complex x -> x
From = ImpCastExprToType(From, ElType,
isFloatingComplex ? CK_FloatingComplexToReal
- : CK_IntegralComplexToReal).take();
+ : CK_IntegralComplexToReal,
+ VK_RValue, /*BasePath=*/0, CCK).take();
// x -> y
if (Context.hasSameUnqualifiedType(ElType, ToType)) {
// do nothing
} else if (ToType->isRealFloatingType()) {
From = ImpCastExprToType(From, ToType,
- isFloatingComplex ? CK_FloatingCast : CK_IntegralToFloating).take();
+ isFloatingComplex ? CK_FloatingCast : CK_IntegralToFloating,
+ VK_RValue, /*BasePath=*/0, CCK).take();
} else {
assert(ToType->isIntegerType());
From = ImpCastExprToType(From, ToType,
- isFloatingComplex ? CK_FloatingToIntegral : CK_IntegralCast).take();
+ isFloatingComplex ? CK_FloatingToIntegral : CK_IntegralCast,
+ VK_RValue, /*BasePath=*/0, CCK).take();
}
}
break;
case ICK_Block_Pointer_Conversion: {
- From = ImpCastExprToType(From, ToType.getUnqualifiedType(), CK_BitCast,
- VK_RValue).take();
- break;
- }
+ From = ImpCastExprToType(From, ToType.getUnqualifiedType(), CK_BitCast,
+ VK_RValue, /*BasePath=*/0, CCK).take();
+ break;
+ }
case ICK_TransparentUnionConversion: {
ExprResult FromRes = Owned(From);
@@ -2376,7 +2508,7 @@ Sema::PerformImplicitConversion(Expr *From, QualType ToType,
ExprValueKind VK = ToType->isReferenceType() ?
CastCategory(From) : VK_RValue;
From = ImpCastExprToType(From, ToType.getNonLValueExprType(Context),
- CK_NoOp, VK).take();
+ CK_NoOp, VK, /*BasePath=*/0, CCK).take();
if (SCS.DeprecatedStringLiteralToCharPtr &&
!getLangOptions().WritableStrings)
@@ -2553,6 +2685,23 @@ static bool EvaluateUnaryTypeTrait(Sema &Self, UnaryTypeTrait UTT,
case UTT_IsObject:
return T->isObjectType();
case UTT_IsScalar:
+ // Note: semantic analysis depends on Objective-C lifetime types to be
+ // considered scalar types. However, such types do not actually behave
+ // like scalar types at run time (since they may require retain/release
+ // operations), so we report them as non-scalar.
+ if (T->isObjCLifetimeType()) {
+ switch (T.getObjCLifetime()) {
+ case Qualifiers::OCL_None:
+ case Qualifiers::OCL_ExplicitNone:
+ return true;
+
+ case Qualifiers::OCL_Strong:
+ case Qualifiers::OCL_Weak:
+ case Qualifiers::OCL_Autoreleasing:
+ return false;
+ }
+ }
+
return T->isScalarType();
case UTT_IsCompound:
return T->isCompoundType();
@@ -2566,13 +2715,13 @@ static bool EvaluateUnaryTypeTrait(Sema &Self, UnaryTypeTrait UTT,
case UTT_IsVolatile:
return T.isVolatileQualified();
case UTT_IsTrivial:
- return T->isTrivialType();
+ return T.isTrivialType(Self.Context);
case UTT_IsTriviallyCopyable:
- return T->isTriviallyCopyableType();
+ return T.isTriviallyCopyableType(Self.Context);
case UTT_IsStandardLayout:
return T->isStandardLayoutType();
case UTT_IsPOD:
- return T->isPODType();
+ return T.isPODType(Self.Context);
case UTT_IsLiteral:
return T->isLiteralType();
case UTT_IsEmpty:
@@ -2605,7 +2754,7 @@ static bool EvaluateUnaryTypeTrait(Sema &Self, UnaryTypeTrait UTT,
// If __is_pod (type) is true then the trait is true, else if type is
// a cv class or union type (or array thereof) with a trivial default
// constructor ([class.ctor]) then the trait is true, else it is false.
- if (T->isPODType())
+ if (T.isPODType(Self.Context))
return true;
if (const RecordType *RT =
C.getBaseElementType(T)->getAs<RecordType>())
@@ -2617,7 +2766,7 @@ static bool EvaluateUnaryTypeTrait(Sema &Self, UnaryTypeTrait UTT,
// the trait is true, else if type is a cv class or union type
// with a trivial copy constructor ([class.copy]) then the trait
// is true, else it is false.
- if (T->isPODType() || T->isReferenceType())
+ if (T.isPODType(Self.Context) || T->isReferenceType())
return true;
if (const RecordType *RT = T->getAs<RecordType>())
return cast<CXXRecordDecl>(RT->getDecl())->hasTrivialCopyConstructor();
@@ -2637,7 +2786,7 @@ static bool EvaluateUnaryTypeTrait(Sema &Self, UnaryTypeTrait UTT,
if (C.getBaseElementType(T).isConstQualified())
return false;
- if (T->isPODType())
+ if (T.isPODType(Self.Context))
return true;
if (const RecordType *RT = T->getAs<RecordType>())
return cast<CXXRecordDecl>(RT->getDecl())->hasTrivialCopyAssignment();
@@ -2649,8 +2798,14 @@ static bool EvaluateUnaryTypeTrait(Sema &Self, UnaryTypeTrait UTT,
// type (or array thereof) with a trivial destructor
// ([class.dtor]) then the trait is true, else it is
// false.
- if (T->isPODType() || T->isReferenceType())
+ if (T.isPODType(Self.Context) || T->isReferenceType())
+ return true;
+
+ // Objective-C++ ARC: autorelease types don't require destruction.
+ if (T->isObjCLifetimeType() &&
+ T.getObjCLifetime() == Qualifiers::OCL_Autoreleasing)
return true;
+
if (const RecordType *RT =
C.getBaseElementType(T)->getAs<RecordType>())
return cast<CXXRecordDecl>(RT->getDecl())->hasTrivialDestructor();
@@ -2668,8 +2823,8 @@ static bool EvaluateUnaryTypeTrait(Sema &Self, UnaryTypeTrait UTT,
return false;
if (T->isReferenceType())
return false;
- if (T->isPODType())
- return true;
+ if (T.isPODType(Self.Context) || T->isObjCLifetimeType())
+ return true;
if (const RecordType *RT = T->getAs<RecordType>()) {
CXXRecordDecl* RD = cast<CXXRecordDecl>(RT->getDecl());
if (RD->hasTrivialCopyAssignment())
@@ -2704,7 +2859,7 @@ static bool EvaluateUnaryTypeTrait(Sema &Self, UnaryTypeTrait UTT,
// if type is a cv class or union type with copy constructors that are
// known not to throw an exception then the trait is true, else it is
// false.
- if (T->isPODType() || T->isReferenceType())
+ if (T.isPODType(C) || T->isReferenceType() || T->isObjCLifetimeType())
return true;
if (const RecordType *RT = T->getAs<RecordType>()) {
CXXRecordDecl *RD = cast<CXXRecordDecl>(RT->getDecl());
@@ -2744,7 +2899,7 @@ static bool EvaluateUnaryTypeTrait(Sema &Self, UnaryTypeTrait UTT,
// true, else if type is a cv class or union type (or array
// thereof) with a default constructor that is known not to
// throw an exception then the trait is true, else it is false.
- if (T->isPODType())
+ if (T.isPODType(C) || T->isObjCLifetimeType())
return true;
if (const RecordType *RT = C.getBaseElementType(T)->getAs<RecordType>()) {
CXXRecordDecl *RD = cast<CXXRecordDecl>(RT->getDecl());
@@ -3089,6 +3244,20 @@ QualType Sema::CheckPointerToMemberOperands(ExprResult &lex, ExprResult &rex,
ExprValueKind &VK,
SourceLocation Loc,
bool isIndirect) {
+ assert(!lex.get()->getType()->isPlaceholderType() &&
+ !rex.get()->getType()->isPlaceholderType() &&
+ "placeholders should have been weeded out by now");
+
+ // The LHS undergoes lvalue conversions if this is ->*.
+ if (isIndirect) {
+ lex = DefaultLvalueConversion(lex.take());
+ if (lex.isInvalid()) return QualType();
+ }
+
+ // The RHS always undergoes lvalue conversions.
+ rex = DefaultLvalueConversion(rex.take());
+ if (rex.isInvalid()) return QualType();
+
const char *OpSpelling = isIndirect ? "->*" : ".*";
// C++ 5.5p2
// The binary operator .* [p3: ->*] binds its second operand, which shall
@@ -3556,7 +3725,7 @@ QualType Sema::CXXCheckConditionalOperands(ExprResult &Cond, ExprResult &LHS, Ex
// Extension: conditional operator involving vector types.
if (LTy->isVectorType() || RTy->isVectorType())
- return CheckVectorOperands(QuestionLoc, LHS, RHS);
+ return CheckVectorOperands(LHS, RHS, QuestionLoc, /*isCompAssign*/false);
// -- The second and third operands have arithmetic or enumeration type;
// the usual arithmetic conversions are performed to bring them to a
@@ -3828,17 +3997,83 @@ ExprResult Sema::MaybeBindToTemporary(Expr *E) {
if (!E)
return ExprError();
- if (!Context.getLangOptions().CPlusPlus)
+ assert(!isa<CXXBindTemporaryExpr>(E) && "Double-bound temporary?");
+
+ // If the result is a glvalue, we shouldn't bind it.
+ if (!E->isRValue())
return Owned(E);
- assert(!isa<CXXBindTemporaryExpr>(E) && "Double-bound temporary?");
+ // In ARC, calls that return a retainable type can return retained,
+ // in which case we have to insert a consuming cast.
+ if (getLangOptions().ObjCAutoRefCount &&
+ E->getType()->isObjCRetainableType()) {
+
+ bool ReturnsRetained;
+
+ // For actual calls, we compute this by examining the type of the
+ // called value.
+ if (CallExpr *Call = dyn_cast<CallExpr>(E)) {
+ Expr *Callee = Call->getCallee()->IgnoreParens();
+ QualType T = Callee->getType();
+
+ if (T == Context.BoundMemberTy) {
+ // Handle pointer-to-members.
+ if (BinaryOperator *BinOp = dyn_cast<BinaryOperator>(Callee))
+ T = BinOp->getRHS()->getType();
+ else if (MemberExpr *Mem = dyn_cast<MemberExpr>(Callee))
+ T = Mem->getMemberDecl()->getType();
+ }
+
+ if (const PointerType *Ptr = T->getAs<PointerType>())
+ T = Ptr->getPointeeType();
+ else if (const BlockPointerType *Ptr = T->getAs<BlockPointerType>())
+ T = Ptr->getPointeeType();
+ else if (const MemberPointerType *MemPtr = T->getAs<MemberPointerType>())
+ T = MemPtr->getPointeeType();
+
+ const FunctionType *FTy = T->getAs<FunctionType>();
+ assert(FTy && "call to value not of function type?");
+ ReturnsRetained = FTy->getExtInfo().getProducesResult();
+
+ // ActOnStmtExpr arranges things so that StmtExprs of retainable
+ // type always produce a +1 object.
+ } else if (isa<StmtExpr>(E)) {
+ ReturnsRetained = true;
+
+ // For message sends and property references, we try to find an
+ // actual method. FIXME: we should infer retention by selector in
+ // cases where we don't have an actual method.
+ } else {
+ Decl *D = 0;
+ if (ObjCMessageExpr *Send = dyn_cast<ObjCMessageExpr>(E)) {
+ D = Send->getMethodDecl();
+ } else {
+ CastExpr *CE = cast<CastExpr>(E);
+ // FIXME. What other cast kinds to check for?
+ if (CE->getCastKind() == CK_ObjCProduceObject ||
+ CE->getCastKind() == CK_LValueToRValue)
+ return MaybeBindToTemporary(CE->getSubExpr());
+ assert(CE->getCastKind() == CK_GetObjCProperty);
+ const ObjCPropertyRefExpr *PRE = CE->getSubExpr()->getObjCProperty();
+ D = (PRE->isImplicitProperty() ? PRE->getImplicitPropertyGetter() : 0);
+ }
- const RecordType *RT = E->getType()->getAs<RecordType>();
- if (!RT)
+ ReturnsRetained = (D && D->hasAttr<NSReturnsRetainedAttr>());
+ }
+
+ ExprNeedsCleanups = true;
+
+ CastKind ck = (ReturnsRetained ? CK_ObjCConsumeObject
+ : CK_ObjCReclaimReturnedObject);
+ return Owned(ImplicitCastExpr::Create(Context, E->getType(), ck, E, 0,
+ VK_RValue));
+ }
+
+ if (!getLangOptions().CPlusPlus)
return Owned(E);
- // If the result is a glvalue, we shouldn't bind it.
- if (E->Classify(Context).isGLValue())
+ const RecordType *RT = E->getType()->getAs<RecordType>();
+ if (!RT)
return Owned(E);
// That should be enough to guarantee that this type is complete.
@@ -3847,15 +4082,18 @@ ExprResult Sema::MaybeBindToTemporary(Expr *E) {
if (RD->isInvalidDecl() || RD->hasTrivialDestructor())
return Owned(E);
- CXXTemporary *Temp = CXXTemporary::Create(Context, LookupDestructor(RD));
- ExprTemporaries.push_back(Temp);
- if (CXXDestructorDecl *Destructor = LookupDestructor(RD)) {
+ CXXDestructorDecl *Destructor = LookupDestructor(RD);
+
+ CXXTemporary *Temp = CXXTemporary::Create(Context, Destructor);
+ if (Destructor) {
MarkDeclarationReferenced(E->getExprLoc(), Destructor);
CheckDestructorAccess(E->getExprLoc(), Destructor,
PDiag(diag::err_access_dtor_temp)
<< E->getType());
+
+ ExprTemporaries.push_back(Temp);
+ ExprNeedsCleanups = true;
}
- // FIXME: Add the temporary to the temporaries vector.
return Owned(CXXBindTemporaryExpr::Create(Context, Temp, E));
}
@@ -3864,14 +4102,16 @@ Expr *Sema::MaybeCreateExprWithCleanups(Expr *SubExpr) {
unsigned FirstTemporary = ExprEvalContexts.back().NumTemporaries;
assert(ExprTemporaries.size() >= FirstTemporary);
- if (ExprTemporaries.size() == FirstTemporary)
+ assert(ExprNeedsCleanups || ExprTemporaries.size() == FirstTemporary);
+ if (!ExprNeedsCleanups)
return SubExpr;
Expr *E = ExprWithCleanups::Create(Context, SubExpr,
- &ExprTemporaries[FirstTemporary],
+ ExprTemporaries.begin() + FirstTemporary,
ExprTemporaries.size() - FirstTemporary);
ExprTemporaries.erase(ExprTemporaries.begin() + FirstTemporary,
ExprTemporaries.end());
+ ExprNeedsCleanups = false;
return E;
}
@@ -3887,9 +4127,7 @@ Sema::MaybeCreateExprWithCleanups(ExprResult SubExpr) {
Stmt *Sema::MaybeCreateStmtWithCleanups(Stmt *SubStmt) {
assert(SubStmt && "sub statement can't be null!");
- unsigned FirstTemporary = ExprEvalContexts.back().NumTemporaries;
- assert(ExprTemporaries.size() >= FirstTemporary);
- if (ExprTemporaries.size() == FirstTemporary)
+ if (!ExprNeedsCleanups)
return SubStmt;
// FIXME: In order to attach the temporaries, wrap the statement into
@@ -4047,17 +4285,35 @@ ExprResult Sema::BuildPseudoDestructorExpr(Expr *Base,
QualType DestructedType = DestructedTypeInfo->getType();
SourceLocation DestructedTypeStart
= DestructedTypeInfo->getTypeLoc().getLocalSourceRange().getBegin();
- if (!DestructedType->isDependentType() && !ObjectType->isDependentType() &&
- !Context.hasSameUnqualifiedType(DestructedType, ObjectType)) {
- Diag(DestructedTypeStart, diag::err_pseudo_dtor_type_mismatch)
- << ObjectType << DestructedType << Base->getSourceRange()
- << DestructedTypeInfo->getTypeLoc().getLocalSourceRange();
-
- // Recover by setting the destructed type to the object type.
- DestructedType = ObjectType;
- DestructedTypeInfo = Context.getTrivialTypeSourceInfo(ObjectType,
+ if (!DestructedType->isDependentType() && !ObjectType->isDependentType()) {
+ if (!Context.hasSameUnqualifiedType(DestructedType, ObjectType)) {
+ Diag(DestructedTypeStart, diag::err_pseudo_dtor_type_mismatch)
+ << ObjectType << DestructedType << Base->getSourceRange()
+ << DestructedTypeInfo->getTypeLoc().getLocalSourceRange();
+
+ // Recover by setting the destructed type to the object type.
+ DestructedType = ObjectType;
+ DestructedTypeInfo = Context.getTrivialTypeSourceInfo(ObjectType,
+ DestructedTypeStart);
+ Destructed = PseudoDestructorTypeStorage(DestructedTypeInfo);
+ } else if (DestructedType.getObjCLifetime() !=
+ ObjectType.getObjCLifetime()) {
+
+ if (DestructedType.getObjCLifetime() == Qualifiers::OCL_None) {
+ // Okay: just pretend that the user provided the correctly-qualified
+ // type.
+ } else {
+ Diag(DestructedTypeStart, diag::err_arc_pseudo_dtor_inconstant_quals)
+ << ObjectType << DestructedType << Base->getSourceRange()
+ << DestructedTypeInfo->getTypeLoc().getLocalSourceRange();
+ }
+
+ // Recover by setting the destructed type to the object type.
+ DestructedType = ObjectType;
+ DestructedTypeInfo = Context.getTrivialTypeSourceInfo(ObjectType,
DestructedTypeStart);
- Destructed = PseudoDestructorTypeStorage(DestructedTypeInfo);
+ Destructed = PseudoDestructorTypeStorage(DestructedTypeInfo);
+ }
}
}
@@ -4293,7 +4549,16 @@ ExprResult Sema::IgnoredValueConversions(Expr *E) {
// [Except in specific positions,] an lvalue that does not have
// array type is converted to the value stored in the
// designated object (and is no longer an lvalue).
- if (E->isRValue()) return Owned(E);
+ if (E->isRValue()) {
+ // In C, function designators (i.e. expressions of function type)
+ // are r-values, but we still want to do function-to-pointer decay
+ // on them. This is both technically correct and convenient for
+ // some clients.
+ if (!getLangOptions().CPlusPlus && E->getType()->isFunctionType())
+ return DefaultFunctionArrayConversion(E);
+
+ return Owned(E);
+ }
// We always want to do this on ObjC property references.
if (E->getObjectKind() == OK_ObjCProperty) {
diff --git a/contrib/llvm/tools/clang/lib/Sema/SemaExprMember.cpp b/contrib/llvm/tools/clang/lib/Sema/SemaExprMember.cpp
new file mode 100644
index 0000000..2488dc8
--- /dev/null
+++ b/contrib/llvm/tools/clang/lib/Sema/SemaExprMember.cpp
@@ -0,0 +1,1594 @@
+//===--- SemaExprMember.cpp - Semantic Analysis for Expressions -----------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+//
+// This file implements semantic analysis member access expressions.
+//
+//===----------------------------------------------------------------------===//
+#include "clang/Sema/SemaInternal.h"
+#include "clang/Sema/Lookup.h"
+#include "clang/Sema/Scope.h"
+#include "clang/AST/DeclCXX.h"
+#include "clang/AST/DeclObjC.h"
+#include "clang/AST/DeclTemplate.h"
+#include "clang/AST/ExprCXX.h"
+#include "clang/AST/ExprObjC.h"
+#include "clang/Lex/Preprocessor.h"
+
+using namespace clang;
+using namespace sema;
+
+/// Determines if the given class is provably not derived from all of
+/// the prospective base classes.
+static bool IsProvablyNotDerivedFrom(Sema &SemaRef,
+ CXXRecordDecl *Record,
+ const llvm::SmallPtrSet<CXXRecordDecl*, 4> &Bases) {
+ if (Bases.count(Record->getCanonicalDecl()))
+ return false;
+
+ RecordDecl *RD = Record->getDefinition();
+ if (!RD) return false;
+ Record = cast<CXXRecordDecl>(RD);
+
+ for (CXXRecordDecl::base_class_iterator I = Record->bases_begin(),
+ E = Record->bases_end(); I != E; ++I) {
+ CanQualType BaseT = SemaRef.Context.getCanonicalType((*I).getType());
+ CanQual<RecordType> BaseRT = BaseT->getAs<RecordType>();
+ if (!BaseRT) return false;
+
+ CXXRecordDecl *BaseRecord = cast<CXXRecordDecl>(BaseRT->getDecl());
+ if (!IsProvablyNotDerivedFrom(SemaRef, BaseRecord, Bases))
+ return false;
+ }
+
+ return true;
+}
+
+enum IMAKind {
+ /// The reference is definitely not an instance member access.
+ IMA_Static,
+
+ /// The reference may be an implicit instance member access.
+ IMA_Mixed,
+
+ /// The reference may be to an instance member, but it is invalid if
+ /// so, because the context is not an instance method.
+ IMA_Mixed_StaticContext,
+
+ /// The reference may be to an instance member, but it is invalid if
+ /// so, because the context is from an unrelated class.
+ IMA_Mixed_Unrelated,
+
+ /// The reference is definitely an implicit instance member access.
+ IMA_Instance,
+
+ /// The reference may be to an unresolved using declaration.
+ IMA_Unresolved,
+
+ /// The reference may be to an unresolved using declaration and the
+ /// context is not an instance method.
+ IMA_Unresolved_StaticContext,
+
+ /// All possible referrents are instance members and the current
+ /// context is not an instance method.
+ IMA_Error_StaticContext,
+
+ /// All possible referrents are instance members of an unrelated
+ /// class.
+ IMA_Error_Unrelated
+};
+
+/// The given lookup names class member(s) and is not being used for
+/// an address-of-member expression. Classify the type of access
+/// according to whether it's possible that this reference names an
+/// instance member. This is best-effort; it is okay to
+/// conservatively answer "yes", in which case some errors will simply
+/// not be caught until template-instantiation.
+static IMAKind ClassifyImplicitMemberAccess(Sema &SemaRef,
+ Scope *CurScope,
+ const LookupResult &R) {
+ assert(!R.empty() && (*R.begin())->isCXXClassMember());
+
+ DeclContext *DC = SemaRef.getFunctionLevelDeclContext();
+
+ bool isStaticContext =
+ (!isa<CXXMethodDecl>(DC) ||
+ cast<CXXMethodDecl>(DC)->isStatic());
+
+ // C++0x [expr.prim]p4:
+ // Otherwise, if a member-declarator declares a non-static data member
+ // of a class X, the expression this is a prvalue of type "pointer to X"
+ // within the optional brace-or-equal-initializer.
+ if (CurScope->getFlags() & Scope::ThisScope)
+ isStaticContext = false;
+
+ if (R.isUnresolvableResult())
+ return isStaticContext ? IMA_Unresolved_StaticContext : IMA_Unresolved;
+
+ // Collect all the declaring classes of instance members we find.
+ bool hasNonInstance = false;
+ bool hasField = false;
+ llvm::SmallPtrSet<CXXRecordDecl*, 4> Classes;
+ for (LookupResult::iterator I = R.begin(), E = R.end(); I != E; ++I) {
+ NamedDecl *D = *I;
+
+ if (D->isCXXInstanceMember()) {
+ if (dyn_cast<FieldDecl>(D))
+ hasField = true;
+
+ CXXRecordDecl *R = cast<CXXRecordDecl>(D->getDeclContext());
+ Classes.insert(R->getCanonicalDecl());
+ }
+ else
+ hasNonInstance = true;
+ }
+
+ // If we didn't find any instance members, it can't be an implicit
+ // member reference.
+ if (Classes.empty())
+ return IMA_Static;
+
+ // If the current context is not an instance method, it can't be
+ // an implicit member reference.
+ if (isStaticContext) {
+ if (hasNonInstance)
+ return IMA_Mixed_StaticContext;
+
+ if (SemaRef.getLangOptions().CPlusPlus0x && hasField) {
+ // C++0x [expr.prim.general]p10:
+ // An id-expression that denotes a non-static data member or non-static
+ // member function of a class can only be used:
+ // (...)
+ // - if that id-expression denotes a non-static data member and it
+ // appears in an unevaluated operand.
+ const Sema::ExpressionEvaluationContextRecord& record
+ = SemaRef.ExprEvalContexts.back();
+ bool isUnevaluatedExpression = (record.Context == Sema::Unevaluated);
+ if (isUnevaluatedExpression)
+ return IMA_Mixed_StaticContext;
+ }
+
+ return IMA_Error_StaticContext;
+ }
+
+ CXXRecordDecl *contextClass;
+ if (CXXMethodDecl *MD = dyn_cast<CXXMethodDecl>(DC))
+ contextClass = MD->getParent()->getCanonicalDecl();
+ else
+ contextClass = cast<CXXRecordDecl>(DC);
+
+ // [class.mfct.non-static]p3:
+ // ...is used in the body of a non-static member function of class X,
+ // if name lookup (3.4.1) resolves the name in the id-expression to a
+ // non-static non-type member of some class C [...]
+ // ...if C is not X or a base class of X, the class member access expression
+ // is ill-formed.
+ if (R.getNamingClass() &&
+ contextClass != R.getNamingClass()->getCanonicalDecl() &&
+ contextClass->isProvablyNotDerivedFrom(R.getNamingClass()))
+ return (hasNonInstance ? IMA_Mixed_Unrelated : IMA_Error_Unrelated);
+
+ // If we can prove that the current context is unrelated to all the
+ // declaring classes, it can't be an implicit member reference (in
+ // which case it's an error if any of those members are selected).
+ if (IsProvablyNotDerivedFrom(SemaRef, contextClass, Classes))
+ return (hasNonInstance ? IMA_Mixed_Unrelated : IMA_Error_Unrelated);
+
+ return (hasNonInstance ? IMA_Mixed : IMA_Instance);
+}
+
+/// Diagnose a reference to a field with no object available.
+static void DiagnoseInstanceReference(Sema &SemaRef,
+ const CXXScopeSpec &SS,
+ NamedDecl *rep,
+ const DeclarationNameInfo &nameInfo) {
+ SourceLocation Loc = nameInfo.getLoc();
+ SourceRange Range(Loc);
+ if (SS.isSet()) Range.setBegin(SS.getRange().getBegin());
+
+ if (isa<FieldDecl>(rep) || isa<IndirectFieldDecl>(rep)) {
+ if (CXXMethodDecl *MD = dyn_cast<CXXMethodDecl>(SemaRef.CurContext)) {
+ if (MD->isStatic()) {
+ // "invalid use of member 'x' in static member function"
+ SemaRef.Diag(Loc, diag::err_invalid_member_use_in_static_method)
+ << Range << nameInfo.getName();
+ return;
+ }
+ }
+
+ SemaRef.Diag(Loc, diag::err_invalid_non_static_member_use)
+ << nameInfo.getName() << Range;
+ return;
+ }
+
+ SemaRef.Diag(Loc, diag::err_member_call_without_object) << Range;
+}
+
+/// Builds an expression which might be an implicit member expression.
+ExprResult
+Sema::BuildPossibleImplicitMemberExpr(const CXXScopeSpec &SS,
+ LookupResult &R,
+ const TemplateArgumentListInfo *TemplateArgs) {
+ switch (ClassifyImplicitMemberAccess(*this, CurScope, R)) {
+ case IMA_Instance:
+ return BuildImplicitMemberExpr(SS, R, TemplateArgs, true);
+
+ case IMA_Mixed:
+ case IMA_Mixed_Unrelated:
+ case IMA_Unresolved:
+ return BuildImplicitMemberExpr(SS, R, TemplateArgs, false);
+
+ case IMA_Static:
+ case IMA_Mixed_StaticContext:
+ case IMA_Unresolved_StaticContext:
+ if (TemplateArgs)
+ return BuildTemplateIdExpr(SS, R, false, *TemplateArgs);
+ return BuildDeclarationNameExpr(SS, R, false);
+
+ case IMA_Error_StaticContext:
+ case IMA_Error_Unrelated:
+ DiagnoseInstanceReference(*this, SS, R.getRepresentativeDecl(),
+ R.getLookupNameInfo());
+ return ExprError();
+ }
+
+ llvm_unreachable("unexpected instance member access kind");
+ return ExprError();
+}
+
+/// Check an ext-vector component access expression.
+///
+/// VK should be set in advance to the value kind of the base
+/// expression.
+static QualType
+CheckExtVectorComponent(Sema &S, QualType baseType, ExprValueKind &VK,
+ SourceLocation OpLoc, const IdentifierInfo *CompName,
+ SourceLocation CompLoc) {
+ // FIXME: Share logic with ExtVectorElementExpr::containsDuplicateElements,
+ // see FIXME there.
+ //
+ // FIXME: This logic can be greatly simplified by splitting it along
+ // halving/not halving and reworking the component checking.
+ const ExtVectorType *vecType = baseType->getAs<ExtVectorType>();
+
+ // The vector accessor can't exceed the number of elements.
+ const char *compStr = CompName->getNameStart();
+
+ // This flag determines whether or not the component is one of the four
+ // special names that indicate a subset of exactly half the elements are
+ // to be selected.
+ bool HalvingSwizzle = false;
+
+ // This flag determines whether or not CompName has an 's' char prefix,
+ // indicating that it is a string of hex values to be used as vector indices.
+ bool HexSwizzle = *compStr == 's' || *compStr == 'S';
+
+ bool HasRepeated = false;
+ bool HasIndex[16] = {};
+
+ int Idx;
+
+ // Check that we've found one of the special components, or that the component
+ // names must come from the same set.
+ if (!strcmp(compStr, "hi") || !strcmp(compStr, "lo") ||
+ !strcmp(compStr, "even") || !strcmp(compStr, "odd")) {
+ HalvingSwizzle = true;
+ } else if (!HexSwizzle &&
+ (Idx = vecType->getPointAccessorIdx(*compStr)) != -1) {
+ do {
+ if (HasIndex[Idx]) HasRepeated = true;
+ HasIndex[Idx] = true;
+ compStr++;
+ } while (*compStr && (Idx = vecType->getPointAccessorIdx(*compStr)) != -1);
+ } else {
+ if (HexSwizzle) compStr++;
+ while ((Idx = vecType->getNumericAccessorIdx(*compStr)) != -1) {
+ if (HasIndex[Idx]) HasRepeated = true;
+ HasIndex[Idx] = true;
+ compStr++;
+ }
+ }
+
+ if (!HalvingSwizzle && *compStr) {
+ // We didn't get to the end of the string. This means the component names
+ // didn't come from the same set *or* we encountered an illegal name.
+ S.Diag(OpLoc, diag::err_ext_vector_component_name_illegal)
+ << llvm::StringRef(compStr, 1) << SourceRange(CompLoc);
+ return QualType();
+ }
+
+ // Ensure no component accessor exceeds the width of the vector type it
+ // operates on.
+ if (!HalvingSwizzle) {
+ compStr = CompName->getNameStart();
+
+ if (HexSwizzle)
+ compStr++;
+
+ while (*compStr) {
+ if (!vecType->isAccessorWithinNumElements(*compStr++)) {
+ S.Diag(OpLoc, diag::err_ext_vector_component_exceeds_length)
+ << baseType << SourceRange(CompLoc);
+ return QualType();
+ }
+ }
+ }
+
+ // The component accessor looks fine - now we need to compute the actual type.
+ // The vector type is implied by the component accessor. For example,
+ // vec4.b is a float, vec4.xy is a vec2, vec4.rgb is a vec3, etc.
+ // vec4.s0 is a float, vec4.s23 is a vec3, etc.
+ // vec4.hi, vec4.lo, vec4.e, and vec4.o all return vec2.
+ unsigned CompSize = HalvingSwizzle ? (vecType->getNumElements() + 1) / 2
+ : CompName->getLength();
+ if (HexSwizzle)
+ CompSize--;
+
+ if (CompSize == 1)
+ return vecType->getElementType();
+
+ if (HasRepeated) VK = VK_RValue;
+
+ QualType VT = S.Context.getExtVectorType(vecType->getElementType(), CompSize);
+ // Now look up the TypeDefDecl from the vector type. Without this,
+ // diagostics look bad. We want extended vector types to appear built-in.
+ for (unsigned i = 0, E = S.ExtVectorDecls.size(); i != E; ++i) {
+ if (S.ExtVectorDecls[i]->getUnderlyingType() == VT)
+ return S.Context.getTypedefType(S.ExtVectorDecls[i]);
+ }
+ return VT; // should never get here (a typedef type should always be found).
+}
+
+static Decl *FindGetterSetterNameDeclFromProtocolList(const ObjCProtocolDecl*PDecl,
+ IdentifierInfo *Member,
+ const Selector &Sel,
+ ASTContext &Context) {
+ if (Member)
+ if (ObjCPropertyDecl *PD = PDecl->FindPropertyDeclaration(Member))
+ return PD;
+ if (ObjCMethodDecl *OMD = PDecl->getInstanceMethod(Sel))
+ return OMD;
+
+ for (ObjCProtocolDecl::protocol_iterator I = PDecl->protocol_begin(),
+ E = PDecl->protocol_end(); I != E; ++I) {
+ if (Decl *D = FindGetterSetterNameDeclFromProtocolList(*I, Member, Sel,
+ Context))
+ return D;
+ }
+ return 0;
+}
+
+static Decl *FindGetterSetterNameDecl(const ObjCObjectPointerType *QIdTy,
+ IdentifierInfo *Member,
+ const Selector &Sel,
+ ASTContext &Context) {
+ // Check protocols on qualified interfaces.
+ Decl *GDecl = 0;
+ for (ObjCObjectPointerType::qual_iterator I = QIdTy->qual_begin(),
+ E = QIdTy->qual_end(); I != E; ++I) {
+ if (Member)
+ if (ObjCPropertyDecl *PD = (*I)->FindPropertyDeclaration(Member)) {
+ GDecl = PD;
+ break;
+ }
+ // Also must look for a getter or setter name which uses property syntax.
+ if (ObjCMethodDecl *OMD = (*I)->getInstanceMethod(Sel)) {
+ GDecl = OMD;
+ break;
+ }
+ }
+ if (!GDecl) {
+ for (ObjCObjectPointerType::qual_iterator I = QIdTy->qual_begin(),
+ E = QIdTy->qual_end(); I != E; ++I) {
+ // Search in the protocol-qualifier list of current protocol.
+ GDecl = FindGetterSetterNameDeclFromProtocolList(*I, Member, Sel,
+ Context);
+ if (GDecl)
+ return GDecl;
+ }
+ }
+ return GDecl;
+}
+
+ExprResult
+Sema::ActOnDependentMemberExpr(Expr *BaseExpr, QualType BaseType,
+ bool IsArrow, SourceLocation OpLoc,
+ const CXXScopeSpec &SS,
+ NamedDecl *FirstQualifierInScope,
+ const DeclarationNameInfo &NameInfo,
+ const TemplateArgumentListInfo *TemplateArgs) {
+ // Even in dependent contexts, try to diagnose base expressions with
+ // obviously wrong types, e.g.:
+ //
+ // T* t;
+ // t.f;
+ //
+ // In Obj-C++, however, the above expression is valid, since it could be
+ // accessing the 'f' property if T is an Obj-C interface. The extra check
+ // allows this, while still reporting an error if T is a struct pointer.
+ if (!IsArrow) {
+ const PointerType *PT = BaseType->getAs<PointerType>();
+ if (PT && (!getLangOptions().ObjC1 ||
+ PT->getPointeeType()->isRecordType())) {
+ assert(BaseExpr && "cannot happen with implicit member accesses");
+ Diag(NameInfo.getLoc(), diag::err_typecheck_member_reference_struct_union)
+ << BaseType << BaseExpr->getSourceRange();
+ return ExprError();
+ }
+ }
+
+ assert(BaseType->isDependentType() ||
+ NameInfo.getName().isDependentName() ||
+ isDependentScopeSpecifier(SS));
+
+ // Get the type being accessed in BaseType. If this is an arrow, the BaseExpr
+ // must have pointer type, and the accessed type is the pointee.
+ return Owned(CXXDependentScopeMemberExpr::Create(Context, BaseExpr, BaseType,
+ IsArrow, OpLoc,
+ SS.getWithLocInContext(Context),
+ FirstQualifierInScope,
+ NameInfo, TemplateArgs));
+}
+
+/// We know that the given qualified member reference points only to
+/// declarations which do not belong to the static type of the base
+/// expression. Diagnose the problem.
+static void DiagnoseQualifiedMemberReference(Sema &SemaRef,
+ Expr *BaseExpr,
+ QualType BaseType,
+ const CXXScopeSpec &SS,
+ NamedDecl *rep,
+ const DeclarationNameInfo &nameInfo) {
+ // If this is an implicit member access, use a different set of
+ // diagnostics.
+ if (!BaseExpr)
+ return DiagnoseInstanceReference(SemaRef, SS, rep, nameInfo);
+
+ SemaRef.Diag(nameInfo.getLoc(), diag::err_qualified_member_of_unrelated)
+ << SS.getRange() << rep << BaseType;
+}
+
+// Check whether the declarations we found through a nested-name
+// specifier in a member expression are actually members of the base
+// type. The restriction here is:
+//
+// C++ [expr.ref]p2:
+// ... In these cases, the id-expression shall name a
+// member of the class or of one of its base classes.
+//
+// So it's perfectly legitimate for the nested-name specifier to name
+// an unrelated class, and for us to find an overload set including
+// decls from classes which are not superclasses, as long as the decl
+// we actually pick through overload resolution is from a superclass.
+bool Sema::CheckQualifiedMemberReference(Expr *BaseExpr,
+ QualType BaseType,
+ const CXXScopeSpec &SS,
+ const LookupResult &R) {
+ const RecordType *BaseRT = BaseType->getAs<RecordType>();
+ if (!BaseRT) {
+ // We can't check this yet because the base type is still
+ // dependent.
+ assert(BaseType->isDependentType());
+ return false;
+ }
+ CXXRecordDecl *BaseRecord = cast<CXXRecordDecl>(BaseRT->getDecl());
+
+ for (LookupResult::iterator I = R.begin(), E = R.end(); I != E; ++I) {
+ // If this is an implicit member reference and we find a
+ // non-instance member, it's not an error.
+ if (!BaseExpr && !(*I)->isCXXInstanceMember())
+ return false;
+
+ // Note that we use the DC of the decl, not the underlying decl.
+ DeclContext *DC = (*I)->getDeclContext();
+ while (DC->isTransparentContext())
+ DC = DC->getParent();
+
+ if (!DC->isRecord())
+ continue;
+
+ llvm::SmallPtrSet<CXXRecordDecl*,4> MemberRecord;
+ MemberRecord.insert(cast<CXXRecordDecl>(DC)->getCanonicalDecl());
+
+ if (!IsProvablyNotDerivedFrom(*this, BaseRecord, MemberRecord))
+ return false;
+ }
+
+ DiagnoseQualifiedMemberReference(*this, BaseExpr, BaseType, SS,
+ R.getRepresentativeDecl(),
+ R.getLookupNameInfo());
+ return true;
+}
+
+static bool
+LookupMemberExprInRecord(Sema &SemaRef, LookupResult &R,
+ SourceRange BaseRange, const RecordType *RTy,
+ SourceLocation OpLoc, CXXScopeSpec &SS,
+ bool HasTemplateArgs) {
+ RecordDecl *RDecl = RTy->getDecl();
+ if (SemaRef.RequireCompleteType(OpLoc, QualType(RTy, 0),
+ SemaRef.PDiag(diag::err_typecheck_incomplete_tag)
+ << BaseRange))
+ return true;
+
+ if (HasTemplateArgs) {
+ // LookupTemplateName doesn't expect these both to exist simultaneously.
+ QualType ObjectType = SS.isSet() ? QualType() : QualType(RTy, 0);
+
+ bool MOUS;
+ SemaRef.LookupTemplateName(R, 0, SS, ObjectType, false, MOUS);
+ return false;
+ }
+
+ DeclContext *DC = RDecl;
+ if (SS.isSet()) {
+ // If the member name was a qualified-id, look into the
+ // nested-name-specifier.
+ DC = SemaRef.computeDeclContext(SS, false);
+
+ if (SemaRef.RequireCompleteDeclContext(SS, DC)) {
+ SemaRef.Diag(SS.getRange().getEnd(), diag::err_typecheck_incomplete_tag)
+ << SS.getRange() << DC;
+ return true;
+ }
+
+ assert(DC && "Cannot handle non-computable dependent contexts in lookup");
+
+ if (!isa<TypeDecl>(DC)) {
+ SemaRef.Diag(R.getNameLoc(), diag::err_qualified_member_nonclass)
+ << DC << SS.getRange();
+ return true;
+ }
+ }
+
+ // The record definition is complete, now look up the member.
+ SemaRef.LookupQualifiedName(R, DC);
+
+ if (!R.empty())
+ return false;
+
+ // We didn't find anything with the given name, so try to correct
+ // for typos.
+ DeclarationName Name = R.getLookupName();
+ TypoCorrection Corrected = SemaRef.CorrectTypo(R.getLookupNameInfo(),
+ R.getLookupKind(), NULL,
+ &SS, DC, false,
+ Sema::CTC_MemberLookup);
+ NamedDecl *ND = Corrected.getCorrectionDecl();
+ R.clear();
+ if (ND && (isa<ValueDecl>(ND) || isa<FunctionTemplateDecl>(ND))) {
+ std::string CorrectedStr(
+ Corrected.getAsString(SemaRef.getLangOptions()));
+ std::string CorrectedQuotedStr(
+ Corrected.getQuoted(SemaRef.getLangOptions()));
+ R.setLookupName(Corrected.getCorrection());
+ R.addDecl(ND);
+ SemaRef.Diag(R.getNameLoc(), diag::err_no_member_suggest)
+ << Name << DC << CorrectedQuotedStr << SS.getRange()
+ << FixItHint::CreateReplacement(R.getNameLoc(), CorrectedStr);
+ SemaRef.Diag(ND->getLocation(), diag::note_previous_decl)
+ << ND->getDeclName();
+ }
+
+ return false;
+}
+
+ExprResult
+Sema::BuildMemberReferenceExpr(Expr *Base, QualType BaseType,
+ SourceLocation OpLoc, bool IsArrow,
+ CXXScopeSpec &SS,
+ NamedDecl *FirstQualifierInScope,
+ const DeclarationNameInfo &NameInfo,
+ const TemplateArgumentListInfo *TemplateArgs) {
+ if (BaseType->isDependentType() ||
+ (SS.isSet() && isDependentScopeSpecifier(SS)))
+ return ActOnDependentMemberExpr(Base, BaseType,
+ IsArrow, OpLoc,
+ SS, FirstQualifierInScope,
+ NameInfo, TemplateArgs);
+
+ LookupResult R(*this, NameInfo, LookupMemberName);
+
+ // Implicit member accesses.
+ if (!Base) {
+ QualType RecordTy = BaseType;
+ if (IsArrow) RecordTy = RecordTy->getAs<PointerType>()->getPointeeType();
+ if (LookupMemberExprInRecord(*this, R, SourceRange(),
+ RecordTy->getAs<RecordType>(),
+ OpLoc, SS, TemplateArgs != 0))
+ return ExprError();
+
+ // Explicit member accesses.
+ } else {
+ ExprResult BaseResult = Owned(Base);
+ ExprResult Result =
+ LookupMemberExpr(R, BaseResult, IsArrow, OpLoc,
+ SS, /*ObjCImpDecl*/ 0, TemplateArgs != 0);
+
+ if (BaseResult.isInvalid())
+ return ExprError();
+ Base = BaseResult.take();
+
+ if (Result.isInvalid()) {
+ Owned(Base);
+ return ExprError();
+ }
+
+ if (Result.get())
+ return move(Result);
+
+ // LookupMemberExpr can modify Base, and thus change BaseType
+ BaseType = Base->getType();
+ }
+
+ return BuildMemberReferenceExpr(Base, BaseType,
+ OpLoc, IsArrow, SS, FirstQualifierInScope,
+ R, TemplateArgs);
+}
+
+static ExprResult
+BuildFieldReferenceExpr(Sema &S, Expr *BaseExpr, bool IsArrow,
+ const CXXScopeSpec &SS, FieldDecl *Field,
+ DeclAccessPair FoundDecl,
+ const DeclarationNameInfo &MemberNameInfo);
+
+ExprResult
+Sema::BuildAnonymousStructUnionMemberReference(const CXXScopeSpec &SS,
+ SourceLocation loc,
+ IndirectFieldDecl *indirectField,
+ Expr *baseObjectExpr,
+ SourceLocation opLoc) {
+ // First, build the expression that refers to the base object.
+
+ bool baseObjectIsPointer = false;
+ Qualifiers baseQuals;
+
+ // Case 1: the base of the indirect field is not a field.
+ VarDecl *baseVariable = indirectField->getVarDecl();
+ CXXScopeSpec EmptySS;
+ if (baseVariable) {
+ assert(baseVariable->getType()->isRecordType());
+
+ // In principle we could have a member access expression that
+ // accesses an anonymous struct/union that's a static member of
+ // the base object's class. However, under the current standard,
+ // static data members cannot be anonymous structs or unions.
+ // Supporting this is as easy as building a MemberExpr here.
+ assert(!baseObjectExpr && "anonymous struct/union is static data member?");
+
+ DeclarationNameInfo baseNameInfo(DeclarationName(), loc);
+
+ ExprResult result
+ = BuildDeclarationNameExpr(EmptySS, baseNameInfo, baseVariable);
+ if (result.isInvalid()) return ExprError();
+
+ baseObjectExpr = result.take();
+ baseObjectIsPointer = false;
+ baseQuals = baseObjectExpr->getType().getQualifiers();
+
+ // Case 2: the base of the indirect field is a field and the user
+ // wrote a member expression.
+ } else if (baseObjectExpr) {
+ // The caller provided the base object expression. Determine
+ // whether its a pointer and whether it adds any qualifiers to the
+ // anonymous struct/union fields we're looking into.
+ QualType objectType = baseObjectExpr->getType();
+
+ if (const PointerType *ptr = objectType->getAs<PointerType>()) {
+ baseObjectIsPointer = true;
+ objectType = ptr->getPointeeType();
+ } else {
+ baseObjectIsPointer = false;
+ }
+ baseQuals = objectType.getQualifiers();
+
+ // Case 3: the base of the indirect field is a field and we should
+ // build an implicit member access.
+ } else {
+ // We've found a member of an anonymous struct/union that is
+ // inside a non-anonymous struct/union, so in a well-formed
+ // program our base object expression is "this".
+ QualType ThisTy = getAndCaptureCurrentThisType();
+ if (ThisTy.isNull()) {
+ Diag(loc, diag::err_invalid_member_use_in_static_method)
+ << indirectField->getDeclName();
+ return ExprError();
+ }
+
+ // Our base object expression is "this".
+ baseObjectExpr
+ = new (Context) CXXThisExpr(loc, ThisTy, /*isImplicit=*/ true);
+ baseObjectIsPointer = true;
+ baseQuals = ThisTy->castAs<PointerType>()->getPointeeType().getQualifiers();
+ }
+
+ // Build the implicit member references to the field of the
+ // anonymous struct/union.
+ Expr *result = baseObjectExpr;
+ IndirectFieldDecl::chain_iterator
+ FI = indirectField->chain_begin(), FEnd = indirectField->chain_end();
+
+ // Build the first member access in the chain with full information.
+ if (!baseVariable) {
+ FieldDecl *field = cast<FieldDecl>(*FI);
+
+ // FIXME: use the real found-decl info!
+ DeclAccessPair foundDecl = DeclAccessPair::make(field, field->getAccess());
+
+ // Make a nameInfo that properly uses the anonymous name.
+ DeclarationNameInfo memberNameInfo(field->getDeclName(), loc);
+
+ result = BuildFieldReferenceExpr(*this, result, baseObjectIsPointer,
+ EmptySS, field, foundDecl,
+ memberNameInfo).take();
+ baseObjectIsPointer = false;
+
+ // FIXME: check qualified member access
+ }
+
+ // In all cases, we should now skip the first declaration in the chain.
+ ++FI;
+
+ while (FI != FEnd) {
+ FieldDecl *field = cast<FieldDecl>(*FI++);
+
+ // FIXME: these are somewhat meaningless
+ DeclarationNameInfo memberNameInfo(field->getDeclName(), loc);
+ DeclAccessPair foundDecl = DeclAccessPair::make(field, field->getAccess());
+
+ result = BuildFieldReferenceExpr(*this, result, /*isarrow*/ false,
+ (FI == FEnd? SS : EmptySS), field,
+ foundDecl, memberNameInfo).take();
+ }
+
+ return Owned(result);
+}
+
+/// \brief Build a MemberExpr AST node.
+static MemberExpr *BuildMemberExpr(ASTContext &C, Expr *Base, bool isArrow,
+ const CXXScopeSpec &SS, ValueDecl *Member,
+ DeclAccessPair FoundDecl,
+ const DeclarationNameInfo &MemberNameInfo,
+ QualType Ty,
+ ExprValueKind VK, ExprObjectKind OK,
+ const TemplateArgumentListInfo *TemplateArgs = 0) {
+ return MemberExpr::Create(C, Base, isArrow, SS.getWithLocInContext(C),
+ Member, FoundDecl, MemberNameInfo,
+ TemplateArgs, Ty, VK, OK);
+}
+
+ExprResult
+Sema::BuildMemberReferenceExpr(Expr *BaseExpr, QualType BaseExprType,
+ SourceLocation OpLoc, bool IsArrow,
+ const CXXScopeSpec &SS,
+ NamedDecl *FirstQualifierInScope,
+ LookupResult &R,
+ const TemplateArgumentListInfo *TemplateArgs,
+ bool SuppressQualifierCheck) {
+ QualType BaseType = BaseExprType;
+ if (IsArrow) {
+ assert(BaseType->isPointerType());
+ BaseType = BaseType->getAs<PointerType>()->getPointeeType();
+ }
+ R.setBaseObjectType(BaseType);
+
+ const DeclarationNameInfo &MemberNameInfo = R.getLookupNameInfo();
+ DeclarationName MemberName = MemberNameInfo.getName();
+ SourceLocation MemberLoc = MemberNameInfo.getLoc();
+
+ if (R.isAmbiguous())
+ return ExprError();
+
+ if (R.empty()) {
+ // Rederive where we looked up.
+ DeclContext *DC = (SS.isSet()
+ ? computeDeclContext(SS, false)
+ : BaseType->getAs<RecordType>()->getDecl());
+
+ Diag(R.getNameLoc(), diag::err_no_member)
+ << MemberName << DC
+ << (BaseExpr ? BaseExpr->getSourceRange() : SourceRange());
+ return ExprError();
+ }
+
+ // Diagnose lookups that find only declarations from a non-base
+ // type. This is possible for either qualified lookups (which may
+ // have been qualified with an unrelated type) or implicit member
+ // expressions (which were found with unqualified lookup and thus
+ // may have come from an enclosing scope). Note that it's okay for
+ // lookup to find declarations from a non-base type as long as those
+ // aren't the ones picked by overload resolution.
+ if ((SS.isSet() || !BaseExpr ||
+ (isa<CXXThisExpr>(BaseExpr) &&
+ cast<CXXThisExpr>(BaseExpr)->isImplicit())) &&
+ !SuppressQualifierCheck &&
+ CheckQualifiedMemberReference(BaseExpr, BaseType, SS, R))
+ return ExprError();
+
+ // Construct an unresolved result if we in fact got an unresolved
+ // result.
+ if (R.isOverloadedResult() || R.isUnresolvableResult()) {
+ // Suppress any lookup-related diagnostics; we'll do these when we
+ // pick a member.
+ R.suppressDiagnostics();
+
+ UnresolvedMemberExpr *MemExpr
+ = UnresolvedMemberExpr::Create(Context, R.isUnresolvableResult(),
+ BaseExpr, BaseExprType,
+ IsArrow, OpLoc,
+ SS.getWithLocInContext(Context),
+ MemberNameInfo,
+ TemplateArgs, R.begin(), R.end());
+
+ return Owned(MemExpr);
+ }
+
+ assert(R.isSingleResult());
+ DeclAccessPair FoundDecl = R.begin().getPair();
+ NamedDecl *MemberDecl = R.getFoundDecl();
+
+ // FIXME: diagnose the presence of template arguments now.
+
+ // If the decl being referenced had an error, return an error for this
+ // sub-expr without emitting another error, in order to avoid cascading
+ // error cases.
+ if (MemberDecl->isInvalidDecl())
+ return ExprError();
+
+ // Handle the implicit-member-access case.
+ if (!BaseExpr) {
+ // If this is not an instance member, convert to a non-member access.
+ if (!MemberDecl->isCXXInstanceMember())
+ return BuildDeclarationNameExpr(SS, R.getLookupNameInfo(), MemberDecl);
+
+ SourceLocation Loc = R.getNameLoc();
+ if (SS.getRange().isValid())
+ Loc = SS.getRange().getBegin();
+ BaseExpr = new (Context) CXXThisExpr(Loc, BaseExprType,/*isImplicit=*/true);
+ }
+
+ bool ShouldCheckUse = true;
+ if (CXXMethodDecl *MD = dyn_cast<CXXMethodDecl>(MemberDecl)) {
+ // Don't diagnose the use of a virtual member function unless it's
+ // explicitly qualified.
+ if (MD->isVirtual() && !SS.isSet())
+ ShouldCheckUse = false;
+ }
+
+ // Check the use of this member.
+ if (ShouldCheckUse && DiagnoseUseOfDecl(MemberDecl, MemberLoc)) {
+ Owned(BaseExpr);
+ return ExprError();
+ }
+
+ // Perform a property load on the base regardless of whether we
+ // actually need it for the declaration.
+ if (BaseExpr->getObjectKind() == OK_ObjCProperty) {
+ ExprResult Result = ConvertPropertyForRValue(BaseExpr);
+ if (Result.isInvalid())
+ return ExprError();
+ BaseExpr = Result.take();
+ }
+
+ if (FieldDecl *FD = dyn_cast<FieldDecl>(MemberDecl))
+ return BuildFieldReferenceExpr(*this, BaseExpr, IsArrow,
+ SS, FD, FoundDecl, MemberNameInfo);
+
+ if (IndirectFieldDecl *FD = dyn_cast<IndirectFieldDecl>(MemberDecl))
+ // We may have found a field within an anonymous union or struct
+ // (C++ [class.union]).
+ return BuildAnonymousStructUnionMemberReference(SS, MemberLoc, FD,
+ BaseExpr, OpLoc);
+
+ if (VarDecl *Var = dyn_cast<VarDecl>(MemberDecl)) {
+ MarkDeclarationReferenced(MemberLoc, Var);
+ return Owned(BuildMemberExpr(Context, BaseExpr, IsArrow, SS,
+ Var, FoundDecl, MemberNameInfo,
+ Var->getType().getNonReferenceType(),
+ VK_LValue, OK_Ordinary));
+ }
+
+ if (CXXMethodDecl *MemberFn = dyn_cast<CXXMethodDecl>(MemberDecl)) {
+ ExprValueKind valueKind;
+ QualType type;
+ if (MemberFn->isInstance()) {
+ valueKind = VK_RValue;
+ type = Context.BoundMemberTy;
+ } else {
+ valueKind = VK_LValue;
+ type = MemberFn->getType();
+ }
+
+ MarkDeclarationReferenced(MemberLoc, MemberDecl);
+ return Owned(BuildMemberExpr(Context, BaseExpr, IsArrow, SS,
+ MemberFn, FoundDecl, MemberNameInfo,
+ type, valueKind, OK_Ordinary));
+ }
+ assert(!isa<FunctionDecl>(MemberDecl) && "member function not C++ method?");
+
+ if (EnumConstantDecl *Enum = dyn_cast<EnumConstantDecl>(MemberDecl)) {
+ MarkDeclarationReferenced(MemberLoc, MemberDecl);
+ return Owned(BuildMemberExpr(Context, BaseExpr, IsArrow, SS,
+ Enum, FoundDecl, MemberNameInfo,
+ Enum->getType(), VK_RValue, OK_Ordinary));
+ }
+
+ Owned(BaseExpr);
+
+ // We found something that we didn't expect. Complain.
+ if (isa<TypeDecl>(MemberDecl))
+ Diag(MemberLoc, diag::err_typecheck_member_reference_type)
+ << MemberName << BaseType << int(IsArrow);
+ else
+ Diag(MemberLoc, diag::err_typecheck_member_reference_unknown)
+ << MemberName << BaseType << int(IsArrow);
+
+ Diag(MemberDecl->getLocation(), diag::note_member_declared_here)
+ << MemberName;
+ R.suppressDiagnostics();
+ return ExprError();
+}
+
+/// Given that normal member access failed on the given expression,
+/// and given that the expression's type involves builtin-id or
+/// builtin-Class, decide whether substituting in the redefinition
+/// types would be profitable. The redefinition type is whatever
+/// this translation unit tried to typedef to id/Class; we store
+/// it to the side and then re-use it in places like this.
+static bool ShouldTryAgainWithRedefinitionType(Sema &S, ExprResult &base) {
+ const ObjCObjectPointerType *opty
+ = base.get()->getType()->getAs<ObjCObjectPointerType>();
+ if (!opty) return false;
+
+ const ObjCObjectType *ty = opty->getObjectType();
+
+ QualType redef;
+ if (ty->isObjCId()) {
+ redef = S.Context.ObjCIdRedefinitionType;
+ } else if (ty->isObjCClass()) {
+ redef = S.Context.ObjCClassRedefinitionType;
+ } else {
+ return false;
+ }
+
+ // Do the substitution as long as the redefinition type isn't just a
+ // possibly-qualified pointer to builtin-id or builtin-Class again.
+ opty = redef->getAs<ObjCObjectPointerType>();
+ if (opty && !opty->getObjectType()->getInterface() != 0)
+ return false;
+
+ base = S.ImpCastExprToType(base.take(), redef, CK_BitCast);
+ return true;
+}
+
+/// Look up the given member of the given non-type-dependent
+/// expression. This can return in one of two ways:
+/// * If it returns a sentinel null-but-valid result, the caller will
+/// assume that lookup was performed and the results written into
+/// the provided structure. It will take over from there.
+/// * Otherwise, the returned expression will be produced in place of
+/// an ordinary member expression.
+///
+/// The ObjCImpDecl bit is a gross hack that will need to be properly
+/// fixed for ObjC++.
+ExprResult
+Sema::LookupMemberExpr(LookupResult &R, ExprResult &BaseExpr,
+ bool &IsArrow, SourceLocation OpLoc,
+ CXXScopeSpec &SS,
+ Decl *ObjCImpDecl, bool HasTemplateArgs) {
+ assert(BaseExpr.get() && "no base expression");
+
+ // Perform default conversions.
+ BaseExpr = DefaultFunctionArrayConversion(BaseExpr.take());
+
+ if (IsArrow) {
+ BaseExpr = DefaultLvalueConversion(BaseExpr.take());
+ if (BaseExpr.isInvalid())
+ return ExprError();
+ }
+
+ QualType BaseType = BaseExpr.get()->getType();
+ assert(!BaseType->isDependentType());
+
+ DeclarationName MemberName = R.getLookupName();
+ SourceLocation MemberLoc = R.getNameLoc();
+
+ // For later type-checking purposes, turn arrow accesses into dot
+ // accesses. The only access type we support that doesn't follow
+ // the C equivalence "a->b === (*a).b" is ObjC property accesses,
+ // and those never use arrows, so this is unaffected.
+ if (IsArrow) {
+ if (const PointerType *Ptr = BaseType->getAs<PointerType>())
+ BaseType = Ptr->getPointeeType();
+ else if (const ObjCObjectPointerType *Ptr
+ = BaseType->getAs<ObjCObjectPointerType>())
+ BaseType = Ptr->getPointeeType();
+ else if (BaseType->isRecordType()) {
+ // Recover from arrow accesses to records, e.g.:
+ // struct MyRecord foo;
+ // foo->bar
+ // This is actually well-formed in C++ if MyRecord has an
+ // overloaded operator->, but that should have been dealt with
+ // by now.
+ Diag(OpLoc, diag::err_typecheck_member_reference_suggestion)
+ << BaseType << int(IsArrow) << BaseExpr.get()->getSourceRange()
+ << FixItHint::CreateReplacement(OpLoc, ".");
+ IsArrow = false;
+ } else if (BaseType == Context.BoundMemberTy) {
+ goto fail;
+ } else {
+ Diag(MemberLoc, diag::err_typecheck_member_reference_arrow)
+ << BaseType << BaseExpr.get()->getSourceRange();
+ return ExprError();
+ }
+ }
+
+ // Handle field access to simple records.
+ if (const RecordType *RTy = BaseType->getAs<RecordType>()) {
+ if (LookupMemberExprInRecord(*this, R, BaseExpr.get()->getSourceRange(),
+ RTy, OpLoc, SS, HasTemplateArgs))
+ return ExprError();
+
+ // Returning valid-but-null is how we indicate to the caller that
+ // the lookup result was filled in.
+ return Owned((Expr*) 0);
+ }
+
+ // Handle ivar access to Objective-C objects.
+ if (const ObjCObjectType *OTy = BaseType->getAs<ObjCObjectType>()) {
+ IdentifierInfo *Member = MemberName.getAsIdentifierInfo();
+
+ // There are three cases for the base type:
+ // - builtin id (qualified or unqualified)
+ // - builtin Class (qualified or unqualified)
+ // - an interface
+ ObjCInterfaceDecl *IDecl = OTy->getInterface();
+ if (!IDecl) {
+ if (getLangOptions().ObjCAutoRefCount &&
+ (OTy->isObjCId() || OTy->isObjCClass()))
+ goto fail;
+ // There's an implicit 'isa' ivar on all objects.
+ // But we only actually find it this way on objects of type 'id',
+ // apparently.
+ if (OTy->isObjCId() && Member->isStr("isa"))
+ return Owned(new (Context) ObjCIsaExpr(BaseExpr.take(), IsArrow, MemberLoc,
+ Context.getObjCClassType()));
+
+ if (ShouldTryAgainWithRedefinitionType(*this, BaseExpr))
+ return LookupMemberExpr(R, BaseExpr, IsArrow, OpLoc, SS,
+ ObjCImpDecl, HasTemplateArgs);
+ goto fail;
+ }
+
+ ObjCInterfaceDecl *ClassDeclared;
+ ObjCIvarDecl *IV = IDecl->lookupInstanceVariable(Member, ClassDeclared);
+
+ if (!IV) {
+ // Attempt to correct for typos in ivar names.
+ LookupResult Res(*this, R.getLookupName(), R.getNameLoc(),
+ LookupMemberName);
+ TypoCorrection Corrected = CorrectTypo(
+ R.getLookupNameInfo(), LookupMemberName, NULL, NULL, IDecl, false,
+ IsArrow ? CTC_ObjCIvarLookup : CTC_ObjCPropertyLookup);
+ if ((IV = Corrected.getCorrectionDeclAs<ObjCIvarDecl>())) {
+ Diag(R.getNameLoc(),
+ diag::err_typecheck_member_reference_ivar_suggest)
+ << IDecl->getDeclName() << MemberName << IV->getDeclName()
+ << FixItHint::CreateReplacement(R.getNameLoc(),
+ IV->getNameAsString());
+ Diag(IV->getLocation(), diag::note_previous_decl)
+ << IV->getDeclName();
+ } else {
+ if (IsArrow && IDecl->FindPropertyDeclaration(Member)) {
+ Diag(MemberLoc,
+ diag::err_property_found_suggest)
+ << Member << BaseExpr.get()->getType()
+ << FixItHint::CreateReplacement(OpLoc, ".");
+ return ExprError();
+ }
+ Res.clear();
+ Res.setLookupName(Member);
+
+ Diag(MemberLoc, diag::err_typecheck_member_reference_ivar)
+ << IDecl->getDeclName() << MemberName
+ << BaseExpr.get()->getSourceRange();
+ return ExprError();
+ }
+ }
+
+ // If the decl being referenced had an error, return an error for this
+ // sub-expr without emitting another error, in order to avoid cascading
+ // error cases.
+ if (IV->isInvalidDecl())
+ return ExprError();
+
+ // Check whether we can reference this field.
+ if (DiagnoseUseOfDecl(IV, MemberLoc))
+ return ExprError();
+ if (IV->getAccessControl() != ObjCIvarDecl::Public &&
+ IV->getAccessControl() != ObjCIvarDecl::Package) {
+ ObjCInterfaceDecl *ClassOfMethodDecl = 0;
+ if (ObjCMethodDecl *MD = getCurMethodDecl())
+ ClassOfMethodDecl = MD->getClassInterface();
+ else if (ObjCImpDecl && getCurFunctionDecl()) {
+ // Case of a c-function declared inside an objc implementation.
+ // FIXME: For a c-style function nested inside an objc implementation
+ // class, there is no implementation context available, so we pass
+ // down the context as argument to this routine. Ideally, this context
+ // need be passed down in the AST node and somehow calculated from the
+ // AST for a function decl.
+ if (ObjCImplementationDecl *IMPD =
+ dyn_cast<ObjCImplementationDecl>(ObjCImpDecl))
+ ClassOfMethodDecl = IMPD->getClassInterface();
+ else if (ObjCCategoryImplDecl* CatImplClass =
+ dyn_cast<ObjCCategoryImplDecl>(ObjCImpDecl))
+ ClassOfMethodDecl = CatImplClass->getClassInterface();
+ }
+
+ if (IV->getAccessControl() == ObjCIvarDecl::Private) {
+ if (ClassDeclared != IDecl ||
+ ClassOfMethodDecl != ClassDeclared)
+ Diag(MemberLoc, diag::error_private_ivar_access)
+ << IV->getDeclName();
+ } else if (!IDecl->isSuperClassOf(ClassOfMethodDecl))
+ // @protected
+ Diag(MemberLoc, diag::error_protected_ivar_access)
+ << IV->getDeclName();
+ }
+ if (getLangOptions().ObjCAutoRefCount) {
+ Expr *BaseExp = BaseExpr.get()->IgnoreParenImpCasts();
+ if (UnaryOperator *UO = dyn_cast<UnaryOperator>(BaseExp))
+ if (UO->getOpcode() == UO_Deref)
+ BaseExp = UO->getSubExpr()->IgnoreParenCasts();
+
+ if (DeclRefExpr *DE = dyn_cast<DeclRefExpr>(BaseExp))
+ if (DE->getType().getObjCLifetime() == Qualifiers::OCL_Weak)
+ Diag(DE->getLocation(), diag::error_arc_weak_ivar_access);
+ }
+
+ return Owned(new (Context) ObjCIvarRefExpr(IV, IV->getType(),
+ MemberLoc, BaseExpr.take(),
+ IsArrow));
+ }
+
+ // Objective-C property access.
+ const ObjCObjectPointerType *OPT;
+ if (!IsArrow && (OPT = BaseType->getAs<ObjCObjectPointerType>())) {
+ // This actually uses the base as an r-value.
+ BaseExpr = DefaultLvalueConversion(BaseExpr.take());
+ if (BaseExpr.isInvalid())
+ return ExprError();
+
+ assert(Context.hasSameUnqualifiedType(BaseType, BaseExpr.get()->getType()));
+
+ IdentifierInfo *Member = MemberName.getAsIdentifierInfo();
+
+ const ObjCObjectType *OT = OPT->getObjectType();
+
+ // id, with and without qualifiers.
+ if (OT->isObjCId()) {
+ // Check protocols on qualified interfaces.
+ Selector Sel = PP.getSelectorTable().getNullarySelector(Member);
+ if (Decl *PMDecl = FindGetterSetterNameDecl(OPT, Member, Sel, Context)) {
+ if (ObjCPropertyDecl *PD = dyn_cast<ObjCPropertyDecl>(PMDecl)) {
+ // Check the use of this declaration
+ if (DiagnoseUseOfDecl(PD, MemberLoc))
+ return ExprError();
+
+ QualType T = PD->getType();
+ if (ObjCMethodDecl *Getter = PD->getGetterMethodDecl())
+ T = getMessageSendResultType(BaseType, Getter, false, false);
+
+ return Owned(new (Context) ObjCPropertyRefExpr(PD, T,
+ VK_LValue,
+ OK_ObjCProperty,
+ MemberLoc,
+ BaseExpr.take()));
+ }
+
+ if (ObjCMethodDecl *OMD = dyn_cast<ObjCMethodDecl>(PMDecl)) {
+ // Check the use of this method.
+ if (DiagnoseUseOfDecl(OMD, MemberLoc))
+ return ExprError();
+ Selector SetterSel =
+ SelectorTable::constructSetterName(PP.getIdentifierTable(),
+ PP.getSelectorTable(), Member);
+ ObjCMethodDecl *SMD = 0;
+ if (Decl *SDecl = FindGetterSetterNameDecl(OPT, /*Property id*/0,
+ SetterSel, Context))
+ SMD = dyn_cast<ObjCMethodDecl>(SDecl);
+ QualType PType = getMessageSendResultType(BaseType, OMD, false,
+ false);
+
+ ExprValueKind VK = VK_LValue;
+ if (!getLangOptions().CPlusPlus && PType.isCForbiddenLValueType())
+ VK = VK_RValue;
+ ExprObjectKind OK = (VK == VK_RValue ? OK_Ordinary : OK_ObjCProperty);
+
+ return Owned(new (Context) ObjCPropertyRefExpr(OMD, SMD, PType,
+ VK, OK,
+ MemberLoc, BaseExpr.take()));
+ }
+ }
+ // Use of id.member can only be for a property reference. Do not
+ // use the 'id' redefinition in this case.
+ if (IsArrow && ShouldTryAgainWithRedefinitionType(*this, BaseExpr))
+ return LookupMemberExpr(R, BaseExpr, IsArrow, OpLoc, SS,
+ ObjCImpDecl, HasTemplateArgs);
+
+ return ExprError(Diag(MemberLoc, diag::err_property_not_found)
+ << MemberName << BaseType);
+ }
+
+ // 'Class', unqualified only.
+ if (OT->isObjCClass()) {
+ // Only works in a method declaration (??!).
+ ObjCMethodDecl *MD = getCurMethodDecl();
+ if (!MD) {
+ if (ShouldTryAgainWithRedefinitionType(*this, BaseExpr))
+ return LookupMemberExpr(R, BaseExpr, IsArrow, OpLoc, SS,
+ ObjCImpDecl, HasTemplateArgs);
+
+ goto fail;
+ }
+
+ // Also must look for a getter name which uses property syntax.
+ Selector Sel = PP.getSelectorTable().getNullarySelector(Member);
+ ObjCInterfaceDecl *IFace = MD->getClassInterface();
+ ObjCMethodDecl *Getter;
+ if ((Getter = IFace->lookupClassMethod(Sel))) {
+ // Check the use of this method.
+ if (DiagnoseUseOfDecl(Getter, MemberLoc))
+ return ExprError();
+ } else
+ Getter = IFace->lookupPrivateMethod(Sel, false);
+ // If we found a getter then this may be a valid dot-reference, we
+ // will look for the matching setter, in case it is needed.
+ Selector SetterSel =
+ SelectorTable::constructSetterName(PP.getIdentifierTable(),
+ PP.getSelectorTable(), Member);
+ ObjCMethodDecl *Setter = IFace->lookupClassMethod(SetterSel);
+ if (!Setter) {
+ // If this reference is in an @implementation, also check for 'private'
+ // methods.
+ Setter = IFace->lookupPrivateMethod(SetterSel, false);
+ }
+ // Look through local category implementations associated with the class.
+ if (!Setter)
+ Setter = IFace->getCategoryClassMethod(SetterSel);
+
+ if (Setter && DiagnoseUseOfDecl(Setter, MemberLoc))
+ return ExprError();
+
+ if (Getter || Setter) {
+ QualType PType;
+
+ ExprValueKind VK = VK_LValue;
+ if (Getter) {
+ PType = getMessageSendResultType(QualType(OT, 0), Getter, true,
+ false);
+ if (!getLangOptions().CPlusPlus && PType.isCForbiddenLValueType())
+ VK = VK_RValue;
+ } else {
+ // Get the expression type from Setter's incoming parameter.
+ PType = (*(Setter->param_end() -1))->getType();
+ }
+ ExprObjectKind OK = (VK == VK_RValue ? OK_Ordinary : OK_ObjCProperty);
+
+ // FIXME: we must check that the setter has property type.
+ return Owned(new (Context) ObjCPropertyRefExpr(Getter, Setter,
+ PType, VK, OK,
+ MemberLoc, BaseExpr.take()));
+ }
+
+ if (ShouldTryAgainWithRedefinitionType(*this, BaseExpr))
+ return LookupMemberExpr(R, BaseExpr, IsArrow, OpLoc, SS,
+ ObjCImpDecl, HasTemplateArgs);
+
+ return ExprError(Diag(MemberLoc, diag::err_property_not_found)
+ << MemberName << BaseType);
+ }
+
+ // Normal property access.
+ return HandleExprPropertyRefExpr(OPT, BaseExpr.get(), OpLoc,
+ MemberName, MemberLoc,
+ SourceLocation(), QualType(), false);
+ }
+
+ // Handle 'field access' to vectors, such as 'V.xx'.
+ if (BaseType->isExtVectorType()) {
+ // FIXME: this expr should store IsArrow.
+ IdentifierInfo *Member = MemberName.getAsIdentifierInfo();
+ ExprValueKind VK = (IsArrow ? VK_LValue : BaseExpr.get()->getValueKind());
+ QualType ret = CheckExtVectorComponent(*this, BaseType, VK, OpLoc,
+ Member, MemberLoc);
+ if (ret.isNull())
+ return ExprError();
+
+ return Owned(new (Context) ExtVectorElementExpr(ret, VK, BaseExpr.take(),
+ *Member, MemberLoc));
+ }
+
+ // Adjust builtin-sel to the appropriate redefinition type if that's
+ // not just a pointer to builtin-sel again.
+ if (IsArrow &&
+ BaseType->isSpecificBuiltinType(BuiltinType::ObjCSel) &&
+ !Context.ObjCSelRedefinitionType->isObjCSelType()) {
+ BaseExpr = ImpCastExprToType(BaseExpr.take(), Context.ObjCSelRedefinitionType,
+ CK_BitCast);
+ return LookupMemberExpr(R, BaseExpr, IsArrow, OpLoc, SS,
+ ObjCImpDecl, HasTemplateArgs);
+ }
+
+ // Failure cases.
+ fail:
+
+ // Recover from dot accesses to pointers, e.g.:
+ // type *foo;
+ // foo.bar
+ // This is actually well-formed in two cases:
+ // - 'type' is an Objective C type
+ // - 'bar' is a pseudo-destructor name which happens to refer to
+ // the appropriate pointer type
+ if (const PointerType *Ptr = BaseType->getAs<PointerType>()) {
+ if (!IsArrow && Ptr->getPointeeType()->isRecordType() &&
+ MemberName.getNameKind() != DeclarationName::CXXDestructorName) {
+ Diag(OpLoc, diag::err_typecheck_member_reference_suggestion)
+ << BaseType << int(IsArrow) << BaseExpr.get()->getSourceRange()
+ << FixItHint::CreateReplacement(OpLoc, "->");
+
+ // Recurse as an -> access.
+ IsArrow = true;
+ return LookupMemberExpr(R, BaseExpr, IsArrow, OpLoc, SS,
+ ObjCImpDecl, HasTemplateArgs);
+ }
+ }
+
+ // If the user is trying to apply -> or . to a function name, it's probably
+ // because they forgot parentheses to call that function.
+ QualType ZeroArgCallTy;
+ UnresolvedSet<4> Overloads;
+ if (isExprCallable(*BaseExpr.get(), ZeroArgCallTy, Overloads)) {
+ if (ZeroArgCallTy.isNull()) {
+ Diag(BaseExpr.get()->getExprLoc(), diag::err_member_reference_needs_call)
+ << (Overloads.size() > 1) << 0 << BaseExpr.get()->getSourceRange();
+ UnresolvedSet<2> PlausibleOverloads;
+ for (OverloadExpr::decls_iterator It = Overloads.begin(),
+ DeclsEnd = Overloads.end(); It != DeclsEnd; ++It) {
+ const FunctionDecl *OverloadDecl = cast<FunctionDecl>(*It);
+ QualType OverloadResultTy = OverloadDecl->getResultType();
+ if ((!IsArrow && OverloadResultTy->isRecordType()) ||
+ (IsArrow && OverloadResultTy->isPointerType() &&
+ OverloadResultTy->getPointeeType()->isRecordType()))
+ PlausibleOverloads.addDecl(It.getDecl());
+ }
+ NoteOverloads(PlausibleOverloads, BaseExpr.get()->getExprLoc());
+ return ExprError();
+ }
+ if ((!IsArrow && ZeroArgCallTy->isRecordType()) ||
+ (IsArrow && ZeroArgCallTy->isPointerType() &&
+ ZeroArgCallTy->getPointeeType()->isRecordType())) {
+ // At this point, we know BaseExpr looks like it's potentially callable
+ // with 0 arguments, and that it returns something of a reasonable type,
+ // so we can emit a fixit and carry on pretending that BaseExpr was
+ // actually a CallExpr.
+ SourceLocation ParenInsertionLoc =
+ PP.getLocForEndOfToken(BaseExpr.get()->getLocEnd());
+ Diag(BaseExpr.get()->getExprLoc(), diag::err_member_reference_needs_call)
+ << (Overloads.size() > 1) << 1 << BaseExpr.get()->getSourceRange()
+ << FixItHint::CreateInsertion(ParenInsertionLoc, "()");
+ // FIXME: Try this before emitting the fixit, and suppress diagnostics
+ // while doing so.
+ ExprResult NewBase =
+ ActOnCallExpr(0, BaseExpr.take(), ParenInsertionLoc,
+ MultiExprArg(*this, 0, 0),
+ ParenInsertionLoc.getFileLocWithOffset(1));
+ if (NewBase.isInvalid())
+ return ExprError();
+ BaseExpr = NewBase;
+ BaseExpr = DefaultFunctionArrayConversion(BaseExpr.take());
+ return LookupMemberExpr(R, BaseExpr, IsArrow, OpLoc, SS,
+ ObjCImpDecl, HasTemplateArgs);
+ }
+ }
+
+ Diag(MemberLoc, diag::err_typecheck_member_reference_struct_union)
+ << BaseType << BaseExpr.get()->getSourceRange();
+
+ return ExprError();
+}
+
+/// The main callback when the parser finds something like
+/// expression . [nested-name-specifier] identifier
+/// expression -> [nested-name-specifier] identifier
+/// where 'identifier' encompasses a fairly broad spectrum of
+/// possibilities, including destructor and operator references.
+///
+/// \param OpKind either tok::arrow or tok::period
+/// \param HasTrailingLParen whether the next token is '(', which
+/// is used to diagnose mis-uses of special members that can
+/// only be called
+/// \param ObjCImpDecl the current ObjC @implementation decl;
+/// this is an ugly hack around the fact that ObjC @implementations
+/// aren't properly put in the context chain
+ExprResult Sema::ActOnMemberAccessExpr(Scope *S, Expr *Base,
+ SourceLocation OpLoc,
+ tok::TokenKind OpKind,
+ CXXScopeSpec &SS,
+ UnqualifiedId &Id,
+ Decl *ObjCImpDecl,
+ bool HasTrailingLParen) {
+ if (SS.isSet() && SS.isInvalid())
+ return ExprError();
+
+ // Warn about the explicit constructor calls Microsoft extension.
+ if (getLangOptions().Microsoft &&
+ Id.getKind() == UnqualifiedId::IK_ConstructorName)
+ Diag(Id.getSourceRange().getBegin(),
+ diag::ext_ms_explicit_constructor_call);
+
+ TemplateArgumentListInfo TemplateArgsBuffer;
+
+ // Decompose the name into its component parts.
+ DeclarationNameInfo NameInfo;
+ const TemplateArgumentListInfo *TemplateArgs;
+ DecomposeUnqualifiedId(Id, TemplateArgsBuffer,
+ NameInfo, TemplateArgs);
+
+ DeclarationName Name = NameInfo.getName();
+ bool IsArrow = (OpKind == tok::arrow);
+
+ NamedDecl *FirstQualifierInScope
+ = (!SS.isSet() ? 0 : FindFirstQualifierInScope(S,
+ static_cast<NestedNameSpecifier*>(SS.getScopeRep())));
+
+ // This is a postfix expression, so get rid of ParenListExprs.
+ ExprResult Result = MaybeConvertParenListExprToParenExpr(S, Base);
+ if (Result.isInvalid()) return ExprError();
+ Base = Result.take();
+
+ if (Base->getType()->isDependentType() || Name.isDependentName() ||
+ isDependentScopeSpecifier(SS)) {
+ Result = ActOnDependentMemberExpr(Base, Base->getType(),
+ IsArrow, OpLoc,
+ SS, FirstQualifierInScope,
+ NameInfo, TemplateArgs);
+ } else {
+ LookupResult R(*this, NameInfo, LookupMemberName);
+ ExprResult BaseResult = Owned(Base);
+ Result = LookupMemberExpr(R, BaseResult, IsArrow, OpLoc,
+ SS, ObjCImpDecl, TemplateArgs != 0);
+ if (BaseResult.isInvalid())
+ return ExprError();
+ Base = BaseResult.take();
+
+ if (Result.isInvalid()) {
+ Owned(Base);
+ return ExprError();
+ }
+
+ if (Result.get()) {
+ // The only way a reference to a destructor can be used is to
+ // immediately call it, which falls into this case. If the
+ // next token is not a '(', produce a diagnostic and build the
+ // call now.
+ if (!HasTrailingLParen &&
+ Id.getKind() == UnqualifiedId::IK_DestructorName)
+ return DiagnoseDtorReference(NameInfo.getLoc(), Result.get());
+
+ return move(Result);
+ }
+
+ Result = BuildMemberReferenceExpr(Base, Base->getType(),
+ OpLoc, IsArrow, SS, FirstQualifierInScope,
+ R, TemplateArgs);
+ }
+
+ return move(Result);
+}
+
+static ExprResult
+BuildFieldReferenceExpr(Sema &S, Expr *BaseExpr, bool IsArrow,
+ const CXXScopeSpec &SS, FieldDecl *Field,
+ DeclAccessPair FoundDecl,
+ const DeclarationNameInfo &MemberNameInfo) {
+ // x.a is an l-value if 'a' has a reference type. Otherwise:
+ // x.a is an l-value/x-value/pr-value if the base is (and note
+ // that *x is always an l-value), except that if the base isn't
+ // an ordinary object then we must have an rvalue.
+ ExprValueKind VK = VK_LValue;
+ ExprObjectKind OK = OK_Ordinary;
+ if (!IsArrow) {
+ if (BaseExpr->getObjectKind() == OK_Ordinary)
+ VK = BaseExpr->getValueKind();
+ else
+ VK = VK_RValue;
+ }
+ if (VK != VK_RValue && Field->isBitField())
+ OK = OK_BitField;
+
+ // Figure out the type of the member; see C99 6.5.2.3p3, C++ [expr.ref]
+ QualType MemberType = Field->getType();
+ if (const ReferenceType *Ref = MemberType->getAs<ReferenceType>()) {
+ MemberType = Ref->getPointeeType();
+ VK = VK_LValue;
+ } else {
+ QualType BaseType = BaseExpr->getType();
+ if (IsArrow) BaseType = BaseType->getAs<PointerType>()->getPointeeType();
+
+ Qualifiers BaseQuals = BaseType.getQualifiers();
+
+ // GC attributes are never picked up by members.
+ BaseQuals.removeObjCGCAttr();
+
+ // CVR attributes from the base are picked up by members,
+ // except that 'mutable' members don't pick up 'const'.
+ if (Field->isMutable()) BaseQuals.removeConst();
+
+ Qualifiers MemberQuals
+ = S.Context.getCanonicalType(MemberType).getQualifiers();
+
+ // TR 18037 does not allow fields to be declared with address spaces.
+ assert(!MemberQuals.hasAddressSpace());
+
+ Qualifiers Combined = BaseQuals + MemberQuals;
+ if (Combined != MemberQuals)
+ MemberType = S.Context.getQualifiedType(MemberType, Combined);
+ }
+
+ S.MarkDeclarationReferenced(MemberNameInfo.getLoc(), Field);
+ ExprResult Base =
+ S.PerformObjectMemberConversion(BaseExpr, SS.getScopeRep(),
+ FoundDecl, Field);
+ if (Base.isInvalid())
+ return ExprError();
+ return S.Owned(BuildMemberExpr(S.Context, Base.take(), IsArrow, SS,
+ Field, FoundDecl, MemberNameInfo,
+ MemberType, VK, OK));
+}
+
+/// Builds an implicit member access expression. The current context
+/// is known to be an instance method, and the given unqualified lookup
+/// set is known to contain only instance members, at least one of which
+/// is from an appropriate type.
+ExprResult
+Sema::BuildImplicitMemberExpr(const CXXScopeSpec &SS,
+ LookupResult &R,
+ const TemplateArgumentListInfo *TemplateArgs,
+ bool IsKnownInstance) {
+ assert(!R.empty() && !R.isAmbiguous());
+
+ SourceLocation loc = R.getNameLoc();
+
+ // We may have found a field within an anonymous union or struct
+ // (C++ [class.union]).
+ // FIXME: template-ids inside anonymous structs?
+ if (IndirectFieldDecl *FD = R.getAsSingle<IndirectFieldDecl>())
+ return BuildAnonymousStructUnionMemberReference(SS, R.getNameLoc(), FD);
+
+ // If this is known to be an instance access, go ahead and build an
+ // implicit 'this' expression now.
+ // 'this' expression now.
+ QualType ThisTy = getAndCaptureCurrentThisType();
+ assert(!ThisTy.isNull() && "didn't correctly pre-flight capture of 'this'");
+
+ Expr *baseExpr = 0; // null signifies implicit access
+ if (IsKnownInstance) {
+ SourceLocation Loc = R.getNameLoc();
+ if (SS.getRange().isValid())
+ Loc = SS.getRange().getBegin();
+ baseExpr = new (Context) CXXThisExpr(loc, ThisTy, /*isImplicit=*/true);
+ }
+
+ return BuildMemberReferenceExpr(baseExpr, ThisTy,
+ /*OpLoc*/ SourceLocation(),
+ /*IsArrow*/ true,
+ SS,
+ /*FirstQualifierInScope*/ 0,
+ R, TemplateArgs);
+}
diff --git a/contrib/llvm/tools/clang/lib/Sema/SemaExprObjC.cpp b/contrib/llvm/tools/clang/lib/Sema/SemaExprObjC.cpp
index cb5c1e0..02a4682 100644
--- a/contrib/llvm/tools/clang/lib/Sema/SemaExprObjC.cpp
+++ b/contrib/llvm/tools/clang/lib/Sema/SemaExprObjC.cpp
@@ -19,6 +19,7 @@
#include "clang/AST/ASTContext.h"
#include "clang/AST/DeclObjC.h"
#include "clang/AST/ExprObjC.h"
+#include "clang/AST/StmtVisitor.h"
#include "clang/AST/TypeLoc.h"
#include "llvm/ADT/SmallString.h"
#include "clang/Lex/Preprocessor.h"
@@ -62,7 +63,7 @@ ExprResult Sema::ParseObjCStringLiteral(SourceLocation *AtLocs,
// Create the aggregate string with the appropriate content and location
// information.
- S = StringLiteral::Create(Context, &StrBuf[0], StrBuf.size(),
+ S = StringLiteral::Create(Context, StrBuf,
/*Wide=*/false, /*Pascal=*/false,
Context.getPointerType(Context.CharTy),
&StrLocs[0], StrLocs.size());
@@ -127,7 +128,8 @@ ExprResult Sema::BuildObjCEncodeExpression(SourceLocation AtLoc,
if (EncodedType->isDependentType())
StrTy = Context.DependentTy;
else {
- if (!EncodedType->getAsArrayTypeUnsafe()) // Incomplete array is handled.
+ if (!EncodedType->getAsArrayTypeUnsafe() && //// Incomplete array is handled.
+ !EncodedType->isVoidType()) // void is handled too.
if (RequireCompleteType(AtLoc, EncodedType,
PDiag(diag::err_incomplete_type_objc_at_encode)
<< EncodedTypeInfo->getTypeLoc().getSourceRange()))
@@ -176,12 +178,39 @@ ExprResult Sema::ParseObjCSelectorExpression(Selector Sel,
SourceRange(LParenLoc, RParenLoc));
if (!Method)
Diag(SelLoc, diag::warn_undeclared_selector) << Sel;
+
+ if (!Method ||
+ Method->getImplementationControl() != ObjCMethodDecl::Optional) {
+ llvm::DenseMap<Selector, SourceLocation>::iterator Pos
+ = ReferencedSelectors.find(Sel);
+ if (Pos == ReferencedSelectors.end())
+ ReferencedSelectors.insert(std::make_pair(Sel, SelLoc));
+ }
- llvm::DenseMap<Selector, SourceLocation>::iterator Pos
- = ReferencedSelectors.find(Sel);
- if (Pos == ReferencedSelectors.end())
- ReferencedSelectors.insert(std::make_pair(Sel, SelLoc));
-
+ // In ARC, forbid the user from using @selector for
+ // retain/release/autorelease/dealloc/retainCount.
+ if (getLangOptions().ObjCAutoRefCount) {
+ switch (Sel.getMethodFamily()) {
+ case OMF_retain:
+ case OMF_release:
+ case OMF_autorelease:
+ case OMF_retainCount:
+ case OMF_dealloc:
+ Diag(AtLoc, diag::err_arc_illegal_selector) <<
+ Sel << SourceRange(LParenLoc, RParenLoc);
+ break;
+
+ case OMF_None:
+ case OMF_alloc:
+ case OMF_copy:
+ case OMF_init:
+ case OMF_mutableCopy:
+ case OMF_new:
+ case OMF_self:
+ case OMF_performSelector:
+ break;
+ }
+ }
QualType Ty = Context.getObjCSelType();
return new (Context) ObjCSelectorExpr(Ty, Sel, AtLoc, RParenLoc);
}
@@ -321,11 +350,22 @@ bool Sema::CheckMessageArgumentTypes(QualType ReceiverType,
Args[i] = Result.take();
}
- unsigned DiagID = isClassMessage ? diag::warn_class_method_not_found :
- diag::warn_inst_method_not_found;
+ unsigned DiagID;
+ if (getLangOptions().ObjCAutoRefCount)
+ DiagID = diag::err_arc_method_not_found;
+ else
+ DiagID = isClassMessage ? diag::warn_class_method_not_found
+ : diag::warn_inst_method_not_found;
Diag(lbrac, DiagID)
<< Sel << isClassMessage << SourceRange(lbrac, rbrac);
- ReturnType = Context.getObjCIdType();
+
+ // In debuggers, we want to use __unknown_anytype for these
+ // results so that clients can cast them.
+ if (getLangOptions().DebuggerSupport) {
+ ReturnType = Context.UnknownAnyTy;
+ } else {
+ ReturnType = Context.getObjCIdType();
+ }
VK = VK_RValue;
return false;
}
@@ -404,17 +444,15 @@ bool Sema::CheckMessageArgumentTypes(QualType ReceiverType,
return IsError;
}
-bool Sema::isSelfExpr(Expr *RExpr) {
+bool Sema::isSelfExpr(Expr *receiver) {
// 'self' is objc 'self' in an objc method only.
DeclContext *DC = CurContext;
while (isa<BlockDecl>(DC))
DC = DC->getParent();
if (DC && !isa<ObjCMethodDecl>(DC))
return false;
- if (ImplicitCastExpr *ICE = dyn_cast<ImplicitCastExpr>(RExpr))
- if (ICE->getCastKind() == CK_LValueToRValue)
- RExpr = ICE->getSubExpr();
- if (DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(RExpr))
+ receiver = receiver->IgnoreParenLValueCasts();
+ if (DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(receiver))
if (DRE->getDecl()->getIdentifier() == &Context.Idents.get("self"))
return true;
return false;
@@ -489,7 +527,8 @@ ObjCMethodDecl *Sema::LookupMethodInQualifiedType(Selector Sel,
/// objective C interface. This is a property reference expression.
ExprResult Sema::
HandleExprPropertyRefExpr(const ObjCObjectPointerType *OPT,
- Expr *BaseExpr, DeclarationName MemberName,
+ Expr *BaseExpr, SourceLocation OpLoc,
+ DeclarationName MemberName,
SourceLocation MemberLoc,
SourceLocation SuperLoc, QualType SuperType,
bool Super) {
@@ -635,17 +674,19 @@ HandleExprPropertyRefExpr(const ObjCObjectPointerType *OPT,
}
// Attempt to correct for typos in property names.
- LookupResult Res(*this, MemberName, MemberLoc, LookupOrdinaryName);
- if (CorrectTypo(Res, 0, 0, IFace, false, CTC_NoKeywords, OPT) &&
- Res.getAsSingle<ObjCPropertyDecl>()) {
- DeclarationName TypoResult = Res.getLookupName();
+ TypoCorrection Corrected = CorrectTypo(
+ DeclarationNameInfo(MemberName, MemberLoc), LookupOrdinaryName, NULL,
+ NULL, IFace, false, CTC_NoKeywords, OPT);
+ if (ObjCPropertyDecl *Property =
+ Corrected.getCorrectionDeclAs<ObjCPropertyDecl>()) {
+ DeclarationName TypoResult = Corrected.getCorrection();
Diag(MemberLoc, diag::err_property_not_found_suggest)
<< MemberName << QualType(OPT, 0) << TypoResult
<< FixItHint::CreateReplacement(MemberLoc, TypoResult.getAsString());
- ObjCPropertyDecl *Property = Res.getAsSingle<ObjCPropertyDecl>();
Diag(Property->getLocation(), diag::note_previous_decl)
<< Property->getDeclName();
- return HandleExprPropertyRefExpr(OPT, BaseExpr, TypoResult, MemberLoc,
+ return HandleExprPropertyRefExpr(OPT, BaseExpr, OpLoc,
+ TypoResult, MemberLoc,
SuperLoc, SuperType, Super);
}
ObjCInterfaceDecl *ClassDeclared;
@@ -663,6 +704,11 @@ HandleExprPropertyRefExpr(const ObjCObjectPointerType *OPT,
return ExprError();
}
}
+ Diag(MemberLoc,
+ diag::err_ivar_access_using_property_syntax_suggest)
+ << MemberName << QualType(OPT, 0) << Ivar->getDeclName()
+ << FixItHint::CreateReplacement(OpLoc, "->");
+ return ExprError();
}
Diag(MemberLoc, diag::err_property_not_found)
@@ -699,7 +745,9 @@ ActOnClassPropertyRefExpr(IdentifierInfo &receiverName,
T = Context.getObjCObjectPointerType(T);
return HandleExprPropertyRefExpr(T->getAsObjCInterfacePointerType(),
- /*BaseExpr*/0, &propertyName,
+ /*BaseExpr*/0,
+ SourceLocation()/*OpLoc*/,
+ &propertyName,
propertyNameLoc,
receiverNameLoc, T, true);
}
@@ -862,29 +910,30 @@ Sema::ObjCMessageKind Sema::getObjCMessageKind(Scope *S,
Method->getClassInterface()->getSuperClass())
CTC = CTC_ObjCMessageReceiver;
- if (DeclarationName Corrected = CorrectTypo(Result, S, 0, 0, false, CTC)) {
- if (Result.isSingleResult()) {
+ if (TypoCorrection Corrected = CorrectTypo(Result.getLookupNameInfo(),
+ Result.getLookupKind(), S, NULL,
+ NULL, false, CTC)) {
+ if (NamedDecl *ND = Corrected.getCorrectionDecl()) {
// If we found a declaration, correct when it refers to an Objective-C
// class.
- NamedDecl *ND = Result.getFoundDecl();
if (ObjCInterfaceDecl *Class = dyn_cast<ObjCInterfaceDecl>(ND)) {
Diag(NameLoc, diag::err_unknown_receiver_suggest)
- << Name << Result.getLookupName()
+ << Name << Corrected.getCorrection()
<< FixItHint::CreateReplacement(SourceRange(NameLoc),
ND->getNameAsString());
Diag(ND->getLocation(), diag::note_previous_decl)
- << Corrected;
+ << Corrected.getCorrection();
QualType T = Context.getObjCInterfaceType(Class);
TypeSourceInfo *TSInfo = Context.getTrivialTypeSourceInfo(T, NameLoc);
ReceiverType = CreateParsedType(T, TSInfo);
return ObjCClassMessage;
}
- } else if (Result.empty() && Corrected.getAsIdentifierInfo() &&
- Corrected.getAsIdentifierInfo()->isStr("super")) {
+ } else if (Corrected.isKeyword() &&
+ Corrected.getCorrectionAsIdentifierInfo()->isStr("super")) {
// If we've found the keyword "super", this is a send to super.
Diag(NameLoc, diag::err_unknown_receiver_suggest)
- << Name << Corrected
+ << Name << Corrected.getCorrection()
<< FixItHint::CreateReplacement(SourceRange(NameLoc), "super");
return ObjCSuperMessage;
}
@@ -1013,11 +1062,16 @@ ExprResult Sema::BuildClassMessage(TypeSourceInfo *ReceiverTypeInfo,
// Find the method we are messaging.
if (!Method) {
if (Class->isForwardDecl()) {
+ if (getLangOptions().ObjCAutoRefCount) {
+ Diag(Loc, diag::err_arc_receiver_forward_class) << ReceiverType;
+ } else {
+ Diag(Loc, diag::warn_receiver_forward_class) << Class->getDeclName();
+ }
+
// A forward class used in messaging is treated as a 'Class'
- Diag(Loc, diag::warn_receiver_forward_class) << Class->getDeclName();
Method = LookupFactoryMethodInGlobalPool(Sel,
SourceRange(LBracLoc, RBracLoc));
- if (Method)
+ if (Method && !getLangOptions().ObjCAutoRefCount)
Diag(Method->getLocation(), diag::note_method_sent_forward_class)
<< Method->getDeclName();
}
@@ -1236,6 +1290,14 @@ ExprResult Sema::BuildInstanceMessage(Expr *Receiver,
= ReceiverType->getAsObjCInterfacePointerType()) {
// We allow sending a message to a pointer to an interface (an object).
ClassDecl = OCIType->getInterfaceDecl();
+
+ if (ClassDecl->isForwardDecl() && getLangOptions().ObjCAutoRefCount) {
+ Diag(Loc, diag::err_arc_receiver_forward_instance)
+ << OCIType->getPointeeType()
+ << (Receiver ? Receiver->getSourceRange() : SourceRange(SuperLoc));
+ return ExprError();
+ }
+
// FIXME: consider using LookupInstanceMethodInGlobalPool, since it will be
// faster than the following method (which can do *many* linear searches).
// The idea is to add class info to MethodPool.
@@ -1250,6 +1312,12 @@ ExprResult Sema::BuildInstanceMessage(Expr *Receiver,
// If we have implementations in scope, check "private" methods.
Method = LookupPrivateInstanceMethod(Sel, ClassDecl);
+ if (!Method && getLangOptions().ObjCAutoRefCount) {
+ Diag(Loc, diag::err_arc_may_not_respond)
+ << OCIType->getPointeeType() << Sel;
+ return ExprError();
+ }
+
if (!Method && (!Receiver || !isSelfExpr(Receiver))) {
// If we still haven't found a method, look in the global pool. This
// behavior isn't very desirable, however we need it for GCC
@@ -1267,10 +1335,12 @@ ExprResult Sema::BuildInstanceMessage(Expr *Receiver,
}
if (Method && DiagnoseUseOfDecl(Method, Loc, forwardClass))
return ExprError();
- } else if (!Context.getObjCIdType().isNull() &&
+ } else if (!getLangOptions().ObjCAutoRefCount &&
+ !Context.getObjCIdType().isNull() &&
(ReceiverType->isPointerType() ||
ReceiverType->isIntegerType())) {
// Implicitly convert integers and pointers to 'id' but emit a warning.
+ // But not in ARC.
Diag(Loc, diag::warn_bad_receiver_type)
<< ReceiverType
<< Receiver->getSourceRange();
@@ -1332,8 +1402,84 @@ ExprResult Sema::BuildInstanceMessage(Expr *Receiver,
diag::err_illegal_message_expr_incomplete_type))
return ExprError();
+ // In ARC, forbid the user from sending messages to
+ // retain/release/autorelease/dealloc/retainCount explicitly.
+ if (getLangOptions().ObjCAutoRefCount) {
+ ObjCMethodFamily family =
+ (Method ? Method->getMethodFamily() : Sel.getMethodFamily());
+ switch (family) {
+ case OMF_init:
+ if (Method)
+ checkInitMethod(Method, ReceiverType);
+
+ case OMF_None:
+ case OMF_alloc:
+ case OMF_copy:
+ case OMF_mutableCopy:
+ case OMF_new:
+ case OMF_self:
+ break;
+
+ case OMF_dealloc:
+ case OMF_retain:
+ case OMF_release:
+ case OMF_autorelease:
+ case OMF_retainCount:
+ Diag(Loc, diag::err_arc_illegal_explicit_message)
+ << Sel << SelectorLoc;
+ break;
+
+ case OMF_performSelector:
+ if (Method && NumArgs >= 1) {
+ if (ObjCSelectorExpr *SelExp = dyn_cast<ObjCSelectorExpr>(Args[0])) {
+ Selector ArgSel = SelExp->getSelector();
+ ObjCMethodDecl *SelMethod =
+ LookupInstanceMethodInGlobalPool(ArgSel,
+ SelExp->getSourceRange());
+ if (!SelMethod)
+ SelMethod =
+ LookupFactoryMethodInGlobalPool(ArgSel,
+ SelExp->getSourceRange());
+ if (SelMethod) {
+ ObjCMethodFamily SelFamily = SelMethod->getMethodFamily();
+ switch (SelFamily) {
+ case OMF_alloc:
+ case OMF_copy:
+ case OMF_mutableCopy:
+ case OMF_new:
+ case OMF_self:
+ case OMF_init:
+ // Issue error, unless ns_returns_not_retained.
+ if (!SelMethod->hasAttr<NSReturnsNotRetainedAttr>()) {
+ // selector names a +1 method
+ Diag(SelectorLoc,
+ diag::err_arc_perform_selector_retains);
+ Diag(SelMethod->getLocation(), diag::note_method_declared_at);
+ }
+ break;
+ default:
+ // +0 call. OK. unless ns_returns_retained.
+ if (SelMethod->hasAttr<NSReturnsRetainedAttr>()) {
+ // selector names a +1 method
+ Diag(SelectorLoc,
+ diag::err_arc_perform_selector_retains);
+ Diag(SelMethod->getLocation(), diag::note_method_declared_at);
+ }
+ break;
+ }
+ }
+ } else {
+ // error (may leak).
+ Diag(SelectorLoc, diag::warn_arc_perform_selector_leaks);
+ Diag(Args[0]->getExprLoc(), diag::note_used_here);
+ }
+ }
+ break;
+ }
+ }
+
// Construct the appropriate ObjCMessageExpr instance.
- Expr *Result;
+ ObjCMessageExpr *Result;
if (SuperLoc.isValid())
Result = ObjCMessageExpr::Create(Context, ReturnType, VK, LBracLoc,
SuperLoc, /*IsInstanceSuper=*/true,
@@ -1343,6 +1489,27 @@ ExprResult Sema::BuildInstanceMessage(Expr *Receiver,
Result = ObjCMessageExpr::Create(Context, ReturnType, VK, LBracLoc,
Receiver, Sel, SelectorLoc, Method,
Args, NumArgs, RBracLoc);
+
+ if (getLangOptions().ObjCAutoRefCount) {
+ // In ARC, annotate delegate init calls.
+ if (Result->getMethodFamily() == OMF_init &&
+ (SuperLoc.isValid() || isSelfExpr(Receiver))) {
+ // Only consider init calls *directly* in init implementations,
+ // not within blocks.
+ ObjCMethodDecl *method = dyn_cast<ObjCMethodDecl>(CurContext);
+ if (method && method->getMethodFamily() == OMF_init) {
+ // The implicit assignment to self means we also don't want to
+ // consume the result.
+ Result->setDelegateInitCall(true);
+ return Owned(Result);
+ }
+ }
+
+ // In ARC, check for message sends which are likely to introduce
+ // retain cycles.
+ checkRetainCycles(Result);
+ }
+
return MaybeBindToTemporary(Result);
}
@@ -1364,3 +1531,393 @@ ExprResult Sema::ActOnInstanceMessage(Scope *S,
LBracLoc, SelectorLoc, RBracLoc, move(Args));
}
+enum ARCConversionTypeClass {
+ ACTC_none,
+ ACTC_retainable,
+ ACTC_indirectRetainable
+};
+static ARCConversionTypeClass classifyTypeForARCConversion(QualType type) {
+ ARCConversionTypeClass ACTC = ACTC_retainable;
+
+ // Ignore an outermost reference type.
+ if (const ReferenceType *ref = type->getAs<ReferenceType>())
+ type = ref->getPointeeType();
+
+ // Drill through pointers and arrays recursively.
+ while (true) {
+ if (const PointerType *ptr = type->getAs<PointerType>()) {
+ type = ptr->getPointeeType();
+ } else if (const ArrayType *array = type->getAsArrayTypeUnsafe()) {
+ type = QualType(array->getElementType()->getBaseElementTypeUnsafe(), 0);
+ } else {
+ break;
+ }
+ ACTC = ACTC_indirectRetainable;
+ }
+
+ if (!type->isObjCRetainableType()) return ACTC_none;
+ return ACTC;
+}
+
+namespace {
+ /// Return true if the given expression can be reasonably converted
+ /// between a retainable pointer type and a C pointer type.
+ struct ARCCastChecker : StmtVisitor<ARCCastChecker, bool> {
+ ASTContext &Context;
+ ARCCastChecker(ASTContext &Context) : Context(Context) {}
+ bool VisitStmt(Stmt *s) {
+ return false;
+ }
+ bool VisitExpr(Expr *e) {
+ return e->isNullPointerConstant(Context, Expr::NPC_ValueDependentIsNull);
+ }
+
+ bool VisitParenExpr(ParenExpr *e) {
+ return Visit(e->getSubExpr());
+ }
+ bool VisitCastExpr(CastExpr *e) {
+ switch (e->getCastKind()) {
+ case CK_NullToPointer:
+ return true;
+ case CK_NoOp:
+ case CK_LValueToRValue:
+ case CK_BitCast:
+ case CK_AnyPointerToObjCPointerCast:
+ case CK_AnyPointerToBlockPointerCast:
+ return Visit(e->getSubExpr());
+ default:
+ return false;
+ }
+ }
+ bool VisitUnaryExtension(UnaryOperator *e) {
+ return Visit(e->getSubExpr());
+ }
+ bool VisitBinComma(BinaryOperator *e) {
+ return Visit(e->getRHS());
+ }
+ bool VisitConditionalOperator(ConditionalOperator *e) {
+ // Conditional operators are okay if both sides are okay.
+ return Visit(e->getTrueExpr()) && Visit(e->getFalseExpr());
+ }
+ bool VisitObjCStringLiteral(ObjCStringLiteral *e) {
+ // Always white-list Objective-C string literals.
+ return true;
+ }
+ bool VisitStmtExpr(StmtExpr *e) {
+ return Visit(e->getSubStmt()->body_back());
+ }
+ bool VisitDeclRefExpr(DeclRefExpr *e) {
+ // White-list references to global extern strings from system
+ // headers.
+ if (VarDecl *var = dyn_cast<VarDecl>(e->getDecl()))
+ if (var->getStorageClass() == SC_Extern &&
+ var->getType().isConstQualified() &&
+ Context.getSourceManager().isInSystemHeader(var->getLocation()))
+ return true;
+ return false;
+ }
+ };
+}
+
+bool
+Sema::ValidObjCARCNoBridgeCastExpr(Expr *&Exp, QualType castType) {
+ Expr *NewExp = Exp->IgnoreParenCasts();
+
+ if (!isa<ObjCMessageExpr>(NewExp) && !isa<ObjCPropertyRefExpr>(NewExp)
+ && !isa<CallExpr>(NewExp))
+ return false;
+ ObjCMethodDecl *method = 0;
+ bool MethodReturnsPlusOne = false;
+
+ if (ObjCPropertyRefExpr *PRE = dyn_cast<ObjCPropertyRefExpr>(NewExp)) {
+ method = PRE->getExplicitProperty()->getGetterMethodDecl();
+ }
+ else if (ObjCMessageExpr *ME = dyn_cast<ObjCMessageExpr>(NewExp))
+ method = ME->getMethodDecl();
+ else {
+ CallExpr *CE = cast<CallExpr>(NewExp);
+ Decl *CallDecl = CE->getCalleeDecl();
+ if (!CallDecl)
+ return false;
+ if (CallDecl->hasAttr<CFReturnsNotRetainedAttr>())
+ return true;
+ MethodReturnsPlusOne = CallDecl->hasAttr<CFReturnsRetainedAttr>();
+ if (!MethodReturnsPlusOne) {
+ if (NamedDecl *ND = dyn_cast<NamedDecl>(CallDecl))
+ if (const IdentifierInfo *Id = ND->getIdentifier())
+ if (Id->isStr("__builtin___CFStringMakeConstantString"))
+ return true;
+ }
+ }
+
+ if (!MethodReturnsPlusOne) {
+ if (!method)
+ return false;
+ if (method->hasAttr<CFReturnsNotRetainedAttr>())
+ return true;
+ MethodReturnsPlusOne = method->hasAttr<CFReturnsRetainedAttr>();
+ if (!MethodReturnsPlusOne) {
+ ObjCMethodFamily family = method->getSelector().getMethodFamily();
+ switch (family) {
+ case OMF_alloc:
+ case OMF_copy:
+ case OMF_mutableCopy:
+ case OMF_new:
+ MethodReturnsPlusOne = true;
+ break;
+ default:
+ break;
+ }
+ }
+ }
+
+ if (MethodReturnsPlusOne) {
+ TypeSourceInfo *TSInfo =
+ Context.getTrivialTypeSourceInfo(castType, SourceLocation());
+ ExprResult ExpRes = BuildObjCBridgedCast(SourceLocation(), OBC_BridgeTransfer,
+ SourceLocation(), TSInfo, Exp);
+ Exp = ExpRes.take();
+ }
+ return true;
+}
+
+void
+Sema::CheckObjCARCConversion(SourceRange castRange, QualType castType,
+ Expr *&castExpr, CheckedConversionKind CCK) {
+ QualType castExprType = castExpr->getType();
+
+ ARCConversionTypeClass exprACTC = classifyTypeForARCConversion(castExprType);
+ ARCConversionTypeClass castACTC = classifyTypeForARCConversion(castType);
+ if (exprACTC == castACTC) return;
+ if (exprACTC && castType->isIntegralType(Context)) return;
+
+ // Allow casts between pointers to lifetime types (e.g., __strong id*)
+ // and pointers to void (e.g., cv void *). Casting from void* to lifetime*
+ // must be explicit.
+ if (const PointerType *CastPtr = castType->getAs<PointerType>()) {
+ if (const PointerType *CastExprPtr = castExprType->getAs<PointerType>()) {
+ QualType CastPointee = CastPtr->getPointeeType();
+ QualType CastExprPointee = CastExprPtr->getPointeeType();
+ if ((CCK != CCK_ImplicitConversion &&
+ CastPointee->isObjCIndirectLifetimeType() &&
+ CastExprPointee->isVoidType()) ||
+ (CastPointee->isVoidType() &&
+ CastExprPointee->isObjCIndirectLifetimeType()))
+ return;
+ }
+ }
+
+ if (ARCCastChecker(Context).Visit(castExpr))
+ return;
+
+ SourceLocation loc =
+ (castRange.isValid() ? castRange.getBegin() : castExpr->getExprLoc());
+
+ if (makeUnavailableInSystemHeader(loc,
+ "converts between Objective-C and C pointers in -fobjc-arc"))
+ return;
+
+ unsigned srcKind = 0;
+ switch (exprACTC) {
+ case ACTC_none:
+ srcKind = (castExprType->isPointerType() ? 1 : 0);
+ break;
+ case ACTC_retainable:
+ srcKind = (castExprType->isBlockPointerType() ? 2 : 3);
+ break;
+ case ACTC_indirectRetainable:
+ srcKind = 4;
+ break;
+ }
+
+ if (CCK == CCK_CStyleCast) {
+ // Check whether this could be fixed with a bridge cast.
+ SourceLocation AfterLParen = PP.getLocForEndOfToken(castRange.getBegin());
+ SourceLocation NoteLoc = AfterLParen.isValid()? AfterLParen : loc;
+
+ if (castType->isObjCARCBridgableType() &&
+ castExprType->isCARCBridgableType()) {
+ // explicit unbridged casts are allowed if the source of the cast is a
+ // message sent to an objc method (or property access)
+ if (ValidObjCARCNoBridgeCastExpr(castExpr, castType))
+ return;
+ Diag(loc, diag::err_arc_cast_requires_bridge)
+ << 2
+ << castExprType
+ << (castType->isBlockPointerType()? 1 : 0)
+ << castType
+ << castRange
+ << castExpr->getSourceRange();
+ Diag(NoteLoc, diag::note_arc_bridge)
+ << FixItHint::CreateInsertion(AfterLParen, "__bridge ");
+ Diag(NoteLoc, diag::note_arc_bridge_transfer)
+ << castExprType
+ << FixItHint::CreateInsertion(AfterLParen, "__bridge_transfer ");
+
+ return;
+ }
+
+ if (castType->isCARCBridgableType() &&
+ castExprType->isObjCARCBridgableType()){
+ Diag(loc, diag::err_arc_cast_requires_bridge)
+ << (castExprType->isBlockPointerType()? 1 : 0)
+ << castExprType
+ << 2
+ << castType
+ << castRange
+ << castExpr->getSourceRange();
+
+ Diag(NoteLoc, diag::note_arc_bridge)
+ << FixItHint::CreateInsertion(AfterLParen, "__bridge ");
+ Diag(NoteLoc, diag::note_arc_bridge_retained)
+ << castType
+ << FixItHint::CreateInsertion(AfterLParen, "__bridge_retained ");
+ return;
+ }
+ }
+
+ Diag(loc, diag::err_arc_mismatched_cast)
+ << (CCK != CCK_ImplicitConversion) << srcKind << castExprType << castType
+ << castRange << castExpr->getSourceRange();
+}
+
+bool Sema::CheckObjCARCUnavailableWeakConversion(QualType castType,
+ QualType exprType) {
+ QualType canCastType =
+ Context.getCanonicalType(castType).getUnqualifiedType();
+ QualType canExprType =
+ Context.getCanonicalType(exprType).getUnqualifiedType();
+ if (isa<ObjCObjectPointerType>(canCastType) &&
+ castType.getObjCLifetime() == Qualifiers::OCL_Weak &&
+ canExprType->isObjCObjectPointerType()) {
+ if (const ObjCObjectPointerType *ObjT =
+ canExprType->getAs<ObjCObjectPointerType>())
+ if (ObjT->getInterfaceDecl()->isArcWeakrefUnavailable())
+ return false;
+ }
+ return true;
+}
+
+/// Look for an ObjCReclaimReturnedObject cast and destroy it.
+static Expr *maybeUndoReclaimObject(Expr *e) {
+ // For now, we just undo operands that are *immediately* reclaim
+ // expressions, which prevents the vast majority of potential
+ // problems here. To catch them all, we'd need to rebuild arbitrary
+ // value-propagating subexpressions --- we can't reliably rebuild
+ // in-place because of expression sharing.
+ if (ImplicitCastExpr *ice = dyn_cast<ImplicitCastExpr>(e))
+ if (ice->getCastKind() == CK_ObjCReclaimReturnedObject)
+ return ice->getSubExpr();
+
+ return e;
+}
+
+ExprResult Sema::BuildObjCBridgedCast(SourceLocation LParenLoc,
+ ObjCBridgeCastKind Kind,
+ SourceLocation BridgeKeywordLoc,
+ TypeSourceInfo *TSInfo,
+ Expr *SubExpr) {
+ QualType T = TSInfo->getType();
+ QualType FromType = SubExpr->getType();
+
+ bool MustConsume = false;
+ if (T->isDependentType() || SubExpr->isTypeDependent()) {
+ // Okay: we'll build a dependent expression type.
+ } else if (T->isObjCARCBridgableType() && FromType->isCARCBridgableType()) {
+ // Casting CF -> id
+ switch (Kind) {
+ case OBC_Bridge:
+ break;
+
+ case OBC_BridgeRetained:
+ Diag(BridgeKeywordLoc, diag::err_arc_bridge_cast_wrong_kind)
+ << 2
+ << FromType
+ << (T->isBlockPointerType()? 1 : 0)
+ << T
+ << SubExpr->getSourceRange()
+ << Kind;
+ Diag(BridgeKeywordLoc, diag::note_arc_bridge)
+ << FixItHint::CreateReplacement(BridgeKeywordLoc, "__bridge");
+ Diag(BridgeKeywordLoc, diag::note_arc_bridge_transfer)
+ << FromType
+ << FixItHint::CreateReplacement(BridgeKeywordLoc,
+ "__bridge_transfer ");
+
+ Kind = OBC_Bridge;
+ break;
+
+ case OBC_BridgeTransfer:
+ // We must consume the Objective-C object produced by the cast.
+ MustConsume = true;
+ break;
+ }
+ } else if (T->isCARCBridgableType() && FromType->isObjCARCBridgableType()) {
+ // Okay: id -> CF
+ switch (Kind) {
+ case OBC_Bridge:
+ // Reclaiming a value that's going to be __bridge-casted to CF
+ // is very dangerous, so we don't do it.
+ SubExpr = maybeUndoReclaimObject(SubExpr);
+ break;
+
+ case OBC_BridgeRetained:
+ // Produce the object before casting it.
+ SubExpr = ImplicitCastExpr::Create(Context, FromType,
+ CK_ObjCProduceObject,
+ SubExpr, 0, VK_RValue);
+ break;
+
+ case OBC_BridgeTransfer:
+ Diag(BridgeKeywordLoc, diag::err_arc_bridge_cast_wrong_kind)
+ << (FromType->isBlockPointerType()? 1 : 0)
+ << FromType
+ << 2
+ << T
+ << SubExpr->getSourceRange()
+ << Kind;
+
+ Diag(BridgeKeywordLoc, diag::note_arc_bridge)
+ << FixItHint::CreateReplacement(BridgeKeywordLoc, "__bridge ");
+ Diag(BridgeKeywordLoc, diag::note_arc_bridge_retained)
+ << T
+ << FixItHint::CreateReplacement(BridgeKeywordLoc, "__bridge_retained ");
+
+ Kind = OBC_Bridge;
+ break;
+ }
+ } else {
+ Diag(LParenLoc, diag::err_arc_bridge_cast_incompatible)
+ << FromType << T << Kind
+ << SubExpr->getSourceRange()
+ << TSInfo->getTypeLoc().getSourceRange();
+ return ExprError();
+ }
+
+ Expr *Result = new (Context) ObjCBridgedCastExpr(LParenLoc, Kind,
+ BridgeKeywordLoc,
+ TSInfo, SubExpr);
+
+ if (MustConsume) {
+ ExprNeedsCleanups = true;
+ Result = ImplicitCastExpr::Create(Context, T, CK_ObjCConsumeObject, Result,
+ 0, VK_RValue);
+ }
+
+ return Result;
+}
+
+ExprResult Sema::ActOnObjCBridgedCast(Scope *S,
+ SourceLocation LParenLoc,
+ ObjCBridgeCastKind Kind,
+ SourceLocation BridgeKeywordLoc,
+ ParsedType Type,
+ SourceLocation RParenLoc,
+ Expr *SubExpr) {
+ TypeSourceInfo *TSInfo = 0;
+ QualType T = GetTypeFromParser(Type, &TSInfo);
+ if (!TSInfo)
+ TSInfo = Context.getTrivialTypeSourceInfo(T, LParenLoc);
+ return BuildObjCBridgedCast(LParenLoc, Kind, BridgeKeywordLoc, TSInfo,
+ SubExpr);
+}
diff --git a/contrib/llvm/tools/clang/lib/Sema/SemaInit.cpp b/contrib/llvm/tools/clang/lib/Sema/SemaInit.cpp
index a33f5d0..9fbcbab 100644
--- a/contrib/llvm/tools/clang/lib/Sema/SemaInit.cpp
+++ b/contrib/llvm/tools/clang/lib/Sema/SemaInit.cpp
@@ -769,7 +769,8 @@ void InitListChecker::CheckSubElementType(const InitializedEntity &Entity,
// subaggregate, brace elision is assumed and the initializer is
// considered for the initialization of the first member of
// the subaggregate.
- if (ElemType->isAggregateType() || ElemType->isVectorType()) {
+ if (!SemaRef.getLangOptions().OpenCL &&
+ (ElemType->isAggregateType() || ElemType->isVectorType())) {
CheckImplicitInitList(Entity, IList, ElemType, Index, StructuredList,
StructuredIndex);
++StructuredIndex;
@@ -1184,6 +1185,15 @@ void InitListChecker::CheckStructUnionTypes(const InitializedEntity &Entity,
continue;
}
+ // Make sure we can use this declaration.
+ if (SemaRef.DiagnoseUseOfDecl(*Field,
+ IList->getInit(Index)->getLocStart())) {
+ ++Index;
+ ++Field;
+ hadError = true;
+ continue;
+ }
+
InitializedEntity MemberEntity =
InitializedEntity::InitializeMember(*Field, &Entity);
CheckSubElementType(MemberEntity, IList, Field->getType(), Index,
@@ -1443,19 +1453,23 @@ InitListChecker::CheckDesignatedInitializer(const InitializedEntity &Entity,
// was a typo for another field name.
LookupResult R(SemaRef, FieldName, D->getFieldLoc(),
Sema::LookupMemberName);
- if (SemaRef.CorrectTypo(R, /*Scope=*/0, /*SS=*/0, RT->getDecl(), false,
- Sema::CTC_NoKeywords) &&
- (ReplacementField = R.getAsSingle<FieldDecl>()) &&
+ TypoCorrection Corrected = SemaRef.CorrectTypo(
+ DeclarationNameInfo(FieldName, D->getFieldLoc()),
+ Sema::LookupMemberName, /*Scope=*/NULL, /*SS=*/NULL,
+ RT->getDecl(), false, Sema::CTC_NoKeywords);
+ if ((ReplacementField = Corrected.getCorrectionDeclAs<FieldDecl>()) &&
ReplacementField->getDeclContext()->getRedeclContext()
->Equals(RT->getDecl())) {
+ std::string CorrectedStr(
+ Corrected.getAsString(SemaRef.getLangOptions()));
+ std::string CorrectedQuotedStr(
+ Corrected.getQuoted(SemaRef.getLangOptions()));
SemaRef.Diag(D->getFieldLoc(),
diag::err_field_designator_unknown_suggest)
- << FieldName << CurrentObjectType << R.getLookupName()
- << FixItHint::CreateReplacement(D->getFieldLoc(),
- R.getLookupName().getAsString());
+ << FieldName << CurrentObjectType << CorrectedQuotedStr
+ << FixItHint::CreateReplacement(D->getFieldLoc(), CorrectedStr);
SemaRef.Diag(ReplacementField->getLocation(),
- diag::note_previous_decl)
- << ReplacementField->getDeclName();
+ diag::note_previous_decl) << CorrectedQuotedStr;
} else {
SemaRef.Diag(D->getFieldLoc(), diag::err_field_designator_unknown)
<< FieldName << CurrentObjectType;
@@ -1499,6 +1513,12 @@ InitListChecker::CheckDesignatedInitializer(const InitializedEntity &Entity,
StructuredList->setInitializedFieldInUnion(*Field);
}
+ // Make sure we can use this declaration.
+ if (SemaRef.DiagnoseUseOfDecl(*Field, D->getFieldLoc())) {
+ ++Index;
+ return true;
+ }
+
// Update the designator with the field declaration.
D->setField(*Field);
@@ -2029,10 +2049,10 @@ InitializedEntity InitializedEntity::InitializeBase(ASTContext &Context,
DeclarationName InitializedEntity::getName() const {
switch (getKind()) {
- case EK_Parameter:
- if (!VariableOrMember)
- return DeclarationName();
- // Fall through
+ case EK_Parameter: {
+ ParmVarDecl *D = reinterpret_cast<ParmVarDecl*>(Parameter & ~0x1);
+ return (D ? D->getDeclName() : DeclarationName());
+ }
case EK_Variable:
case EK_Member:
@@ -2057,10 +2077,12 @@ DeclarationName InitializedEntity::getName() const {
DeclaratorDecl *InitializedEntity::getDecl() const {
switch (getKind()) {
case EK_Variable:
- case EK_Parameter:
case EK_Member:
return VariableOrMember;
+ case EK_Parameter:
+ return reinterpret_cast<ParmVarDecl*>(Parameter & ~0x1);
+
case EK_Result:
case EK_Exception:
case EK_New:
@@ -2123,6 +2145,9 @@ void InitializationSequence::Step::Destroy() {
case SK_StringInit:
case SK_ObjCObjectConversion:
case SK_ArrayInit:
+ case SK_PassByIndirectCopyRestore:
+ case SK_PassByIndirectRestore:
+ case SK_ProduceObjCObject:
break;
case SK_ConversionSequence:
@@ -2131,7 +2156,7 @@ void InitializationSequence::Step::Destroy() {
}
bool InitializationSequence::isDirectReferenceBinding() const {
- return getKind() == ReferenceBinding && Steps.back().Kind == SK_BindReference;
+ return !Steps.empty() && Steps.back().Kind == SK_BindReference;
}
bool InitializationSequence::isAmbiguous() const {
@@ -2306,6 +2331,22 @@ void InitializationSequence::AddArrayInitStep(QualType T) {
Steps.push_back(S);
}
+void InitializationSequence::AddPassByIndirectCopyRestoreStep(QualType type,
+ bool shouldCopy) {
+ Step s;
+ s.Kind = (shouldCopy ? SK_PassByIndirectCopyRestore
+ : SK_PassByIndirectRestore);
+ s.Type = type;
+ Steps.push_back(s);
+}
+
+void InitializationSequence::AddProduceObjCObjectStep(QualType T) {
+ Step S;
+ S.Kind = SK_ProduceObjCObject;
+ S.Type = T;
+ Steps.push_back(S);
+}
+
void InitializationSequence::SetOverloadFailure(FailureKind Failure,
OverloadingResult Result) {
setSequenceKind(FailedSequence);
@@ -2317,6 +2358,33 @@ void InitializationSequence::SetOverloadFailure(FailureKind Failure,
// Attempt initialization
//===----------------------------------------------------------------------===//
+static void MaybeProduceObjCObject(Sema &S,
+ InitializationSequence &Sequence,
+ const InitializedEntity &Entity) {
+ if (!S.getLangOptions().ObjCAutoRefCount) return;
+
+ /// When initializing a parameter, produce the value if it's marked
+ /// __attribute__((ns_consumed)).
+ if (Entity.getKind() == InitializedEntity::EK_Parameter) {
+ if (!Entity.isParameterConsumed())
+ return;
+
+ assert(Entity.getType()->isObjCRetainableType() &&
+ "consuming an object of unretainable type?");
+ Sequence.AddProduceObjCObjectStep(Entity.getType());
+
+ /// When initializing a return value, if the return type is a
+ /// retainable type, then returns need to immediately retain the
+ /// object. If an autorelease is required, it will be done at the
+ /// last instant.
+ } else if (Entity.getKind() == InitializedEntity::EK_Result) {
+ if (!Entity.getType()->isObjCRetainableType())
+ return;
+
+ Sequence.AddProduceObjCObjectStep(Entity.getType());
+ }
+}
+
/// \brief Attempt list initialization (C++0x [dcl.init.list])
static void TryListInitialization(Sema &S,
const InitializedEntity &Entity,
@@ -2380,13 +2448,16 @@ static OverloadingResult TryRefInitWithConversionFunction(Sema &S,
bool DerivedToBase;
bool ObjCConversion;
+ bool ObjCLifetimeConversion;
assert(!S.CompareReferenceRelationship(Initializer->getLocStart(),
T1, T2, DerivedToBase,
- ObjCConversion) &&
+ ObjCConversion,
+ ObjCLifetimeConversion) &&
"Must have incompatible references when binding via conversion");
(void)DerivedToBase;
(void)ObjCConversion;
-
+ (void)ObjCLifetimeConversion;
+
// Build the candidate set directly in the initialization sequence
// structure, so that it will persist if we fail.
OverloadCandidateSet &CandidateSet = Sequence.getFailedCandidateSet();
@@ -2513,10 +2584,12 @@ static OverloadingResult TryRefInitWithConversionFunction(Sema &S,
bool NewDerivedToBase = false;
bool NewObjCConversion = false;
+ bool NewObjCLifetimeConversion = false;
Sema::ReferenceCompareResult NewRefRelationship
= S.CompareReferenceRelationship(DeclLoc, T1,
T2.getNonLValueExprType(S.Context),
- NewDerivedToBase, NewObjCConversion);
+ NewDerivedToBase, NewObjCConversion,
+ NewObjCLifetimeConversion);
if (NewRefRelationship == Sema::Ref_Incompatible) {
// If the type we've converted to is not reference-related to the
// type we're looking for, then there is another conversion step
@@ -2550,8 +2623,6 @@ static void TryReferenceInitialization(Sema &S,
const InitializationKind &Kind,
Expr *Initializer,
InitializationSequence &Sequence) {
- Sequence.setSequenceKind(InitializationSequence::ReferenceBinding);
-
QualType DestType = Entity.getType();
QualType cv1T1 = DestType->getAs<ReferenceType>()->getPointeeType();
Qualifiers T1Quals;
@@ -2584,10 +2655,11 @@ static void TryReferenceInitialization(Sema &S,
bool isRValueRef = !isLValueRef;
bool DerivedToBase = false;
bool ObjCConversion = false;
+ bool ObjCLifetimeConversion = false;
Expr::Classification InitCategory = Initializer->Classify(S.Context);
Sema::ReferenceCompareResult RefRelationship
= S.CompareReferenceRelationship(DeclLoc, cv1T1, cv2T2, DerivedToBase,
- ObjCConversion);
+ ObjCConversion, ObjCLifetimeConversion);
// C++0x [dcl.init.ref]p5:
// A reference to type "cv1 T1" is initialized by an expression of type
@@ -2746,11 +2818,15 @@ static void TryReferenceInitialization(Sema &S,
InitializedEntity TempEntity = InitializedEntity::InitializeTemporary(cv1T1);
- if (S.TryImplicitConversion(Sequence, TempEntity, Initializer,
+ ImplicitConversionSequence ICS
+ = S.TryImplicitConversion(Initializer, TempEntity.getType(),
/*SuppressUserConversions*/ false,
AllowExplicit,
/*FIXME:InOverloadResolution=*/false,
- /*CStyle=*/Kind.isCStyleOrFunctionalCast())) {
+ /*CStyle=*/Kind.isCStyleOrFunctionalCast(),
+ /*AllowObjCWritebackConversion=*/false);
+
+ if (ICS.isBad()) {
// FIXME: Use the conversion function set stored in ICS to turn
// this into an overloading ambiguity diagnostic. However, we need
// to keep that set as an OverloadCandidateSet rather than as some
@@ -2764,6 +2840,8 @@ static void TryReferenceInitialization(Sema &S,
else
Sequence.SetFailed(InitializationSequence::FK_ReferenceInitFailed);
return;
+ } else {
+ Sequence.AddConversionSequenceStep(ICS, TempEntity.getType());
}
// [...] If T1 is reference-related to T2, cv1 must be the
@@ -2953,10 +3031,8 @@ static void TryDefaultInitialization(Sema &S,
// C++ [dcl.init]p6:
// To default-initialize an object of type T means:
// - if T is an array type, each element is default-initialized;
- QualType DestType = Entity.getType();
- while (const ArrayType *Array = S.Context.getAsArrayType(DestType))
- DestType = Array->getElementType();
-
+ QualType DestType = S.Context.getBaseElementType(Entity.getType());
+
// - if T is a (possibly cv-qualified) class type (Clause 9), the default
// constructor for T is called (and the initialization is ill-formed if
// T has no accessible default constructor);
@@ -2970,8 +3046,16 @@ static void TryDefaultInitialization(Sema &S,
// If a program calls for the default initialization of an object of
// a const-qualified type T, T shall be a class type with a user-provided
// default constructor.
- if (DestType.isConstQualified() && S.getLangOptions().CPlusPlus)
+ if (DestType.isConstQualified() && S.getLangOptions().CPlusPlus) {
Sequence.SetFailed(InitializationSequence::FK_DefaultInitOfConst);
+ return;
+ }
+
+ // If the destination type has a lifetime property, zero-initialize it.
+ if (DestType.getQualifiers().hasObjCLifetime()) {
+ Sequence.AddZeroInitializationStep(Entity.getType());
+ return;
+ }
}
/// \brief Attempt a user-defined conversion between two types (C++ [dcl.init]),
@@ -3125,6 +3209,86 @@ static void TryUserDefinedConversion(Sema &S,
}
}
+/// The non-zero enum values here are indexes into diagnostic alternatives.
+enum InvalidICRKind { IIK_okay, IIK_nonlocal, IIK_nonscalar };
+
+/// Determines whether this expression is an acceptable ICR source.
+static InvalidICRKind isInvalidICRSource(ASTContext &C, Expr *e,
+ bool isAddressOf) {
+ // Skip parens.
+ e = e->IgnoreParens();
+
+ // Skip address-of nodes.
+ if (UnaryOperator *op = dyn_cast<UnaryOperator>(e)) {
+ if (op->getOpcode() == UO_AddrOf)
+ return isInvalidICRSource(C, op->getSubExpr(), /*addressof*/ true);
+
+ // Skip certain casts.
+ } else if (CastExpr *ce = dyn_cast<CastExpr>(e)) {
+ switch (ce->getCastKind()) {
+ case CK_Dependent:
+ case CK_BitCast:
+ case CK_LValueBitCast:
+ case CK_NoOp:
+ return isInvalidICRSource(C, ce->getSubExpr(), isAddressOf);
+
+ case CK_ArrayToPointerDecay:
+ return IIK_nonscalar;
+
+ case CK_NullToPointer:
+ return IIK_okay;
+
+ default:
+ break;
+ }
+
+ // If we have a declaration reference, it had better be a local variable.
+ } else if (isa<DeclRefExpr>(e) || isa<BlockDeclRefExpr>(e)) {
+ if (!isAddressOf) return IIK_nonlocal;
+
+ VarDecl *var;
+ if (isa<DeclRefExpr>(e)) {
+ var = dyn_cast<VarDecl>(cast<DeclRefExpr>(e)->getDecl());
+ if (!var) return IIK_nonlocal;
+ } else {
+ var = cast<BlockDeclRefExpr>(e)->getDecl();
+ }
+
+ return (var->hasLocalStorage() ? IIK_okay : IIK_nonlocal);
+
+ // If we have a conditional operator, check both sides.
+ } else if (ConditionalOperator *cond = dyn_cast<ConditionalOperator>(e)) {
+ if (InvalidICRKind iik = isInvalidICRSource(C, cond->getLHS(), isAddressOf))
+ return iik;
+
+ return isInvalidICRSource(C, cond->getRHS(), isAddressOf);
+
+ // These are never scalar.
+ } else if (isa<ArraySubscriptExpr>(e)) {
+ return IIK_nonscalar;
+
+ // Otherwise, it needs to be a null pointer constant.
+ } else {
+ return (e->isNullPointerConstant(C, Expr::NPC_ValueDependentIsNull)
+ ? IIK_okay : IIK_nonlocal);
+ }
+
+ return IIK_nonlocal;
+}
+
+/// Check whether the given expression is a valid operand for an
+/// indirect copy/restore.
+static void checkIndirectCopyRestoreSource(Sema &S, Expr *src) {
+ assert(src->isRValue());
+
+ InvalidICRKind iik = isInvalidICRSource(S.Context, src, false);
+ if (iik == IIK_okay) return;
+
+ S.Diag(src->getExprLoc(), diag::err_arc_nonlocal_writeback)
+ << ((unsigned) iik - 1) // shift index into diagnostic explanations
+ << src->getSourceRange();
+}
+
/// \brief Determine whether we have compatible array types for the
/// purposes of GNU by-copy array initialization.
static bool hasCompatibleArrayTypes(ASTContext &Context,
@@ -3144,6 +3308,53 @@ static bool hasCompatibleArrayTypes(ASTContext &Context,
return Source->isConstantArrayType() && Dest->isIncompleteArrayType();
}
+static bool tryObjCWritebackConversion(Sema &S,
+ InitializationSequence &Sequence,
+ const InitializedEntity &Entity,
+ Expr *Initializer) {
+ bool ArrayDecay = false;
+ QualType ArgType = Initializer->getType();
+ QualType ArgPointee;
+ if (const ArrayType *ArgArrayType = S.Context.getAsArrayType(ArgType)) {
+ ArrayDecay = true;
+ ArgPointee = ArgArrayType->getElementType();
+ ArgType = S.Context.getPointerType(ArgPointee);
+ }
+
+ // Handle write-back conversion.
+ QualType ConvertedArgType;
+ if (!S.isObjCWritebackConversion(ArgType, Entity.getType(),
+ ConvertedArgType))
+ return false;
+
+ // We should copy unless we're passing to an argument explicitly
+ // marked 'out'.
+ bool ShouldCopy = true;
+ if (ParmVarDecl *param = cast_or_null<ParmVarDecl>(Entity.getDecl()))
+ ShouldCopy = (param->getObjCDeclQualifier() != ParmVarDecl::OBJC_TQ_Out);
+
+ // Do we need an lvalue conversion?
+ if (ArrayDecay || Initializer->isGLValue()) {
+ ImplicitConversionSequence ICS;
+ ICS.setStandard();
+ ICS.Standard.setAsIdentityConversion();
+
+ QualType ResultType;
+ if (ArrayDecay) {
+ ICS.Standard.First = ICK_Array_To_Pointer;
+ ResultType = S.Context.getPointerType(ArgPointee);
+ } else {
+ ICS.Standard.First = ICK_Lvalue_To_Rvalue;
+ ResultType = Initializer->getType().getNonLValueExprType(S.Context);
+ }
+
+ Sequence.AddConversionSequenceStep(ICS, ResultType);
+ }
+
+ Sequence.AddPassByIndirectCopyRestoreStep(Entity.getType(), ShouldCopy);
+ return true;
+}
+
InitializationSequence::InitializationSequence(Sema &S,
const InitializedEntity &Entity,
const InitializationKind &Kind,
@@ -3255,12 +3466,28 @@ InitializationSequence::InitializationSequence(Sema &S,
return;
}
- // Handle initialization in C
+ // Determine whether we should consider writeback conversions for
+ // Objective-C ARC.
+ bool allowObjCWritebackConversion = S.getLangOptions().ObjCAutoRefCount &&
+ Entity.getKind() == InitializedEntity::EK_Parameter;
+
+ // We're at the end of the line for C: it's either a write-back conversion
+ // or it's a C assignment. There's no need to check anything else.
if (!S.getLangOptions().CPlusPlus) {
+ // If allowed, check whether this is an Objective-C writeback conversion.
+ if (allowObjCWritebackConversion &&
+ tryObjCWritebackConversion(S, *this, Entity, Initializer)) {
+ return;
+ }
+
+ // Handle initialization in C
AddCAssignmentStep(DestType);
+ MaybeProduceObjCObject(S, *this, Entity);
return;
}
+ assert(S.getLangOptions().CPlusPlus);
+
// - If the destination type is a (possibly cv-qualified) class type:
if (DestType->isRecordType()) {
// - If the initialization is direct-initialization, or if it is
@@ -3294,6 +3521,7 @@ InitializationSequence::InitializationSequence(Sema &S,
// type, conversion functions are considered.
if (!SourceType.isNull() && SourceType->isRecordType()) {
TryUserDefinedConversion(S, Entity, Kind, Initializer, *this);
+ MaybeProduceObjCObject(S, *this, Entity);
return;
}
@@ -3302,12 +3530,38 @@ InitializationSequence::InitializationSequence(Sema &S,
// conversions (Clause 4) will be used, if necessary, to convert the
// initializer expression to the cv-unqualified version of the
// destination type; no user-defined conversions are considered.
- if (S.TryImplicitConversion(*this, Entity, Initializer,
- /*SuppressUserConversions*/ true,
+
+ ImplicitConversionSequence ICS
+ = S.TryImplicitConversion(Initializer, Entity.getType(),
+ /*SuppressUserConversions*/true,
/*AllowExplicitConversions*/ false,
/*InOverloadResolution*/ false,
- /*CStyle=*/Kind.isCStyleOrFunctionalCast()))
- {
+ /*CStyle=*/Kind.isCStyleOrFunctionalCast(),
+ allowObjCWritebackConversion);
+
+ if (ICS.isStandard() &&
+ ICS.Standard.Second == ICK_Writeback_Conversion) {
+ // Objective-C ARC writeback conversion.
+
+ // We should copy unless we're passing to an argument explicitly
+ // marked 'out'.
+ bool ShouldCopy = true;
+ if (ParmVarDecl *Param = cast_or_null<ParmVarDecl>(Entity.getDecl()))
+ ShouldCopy = (Param->getObjCDeclQualifier() != ParmVarDecl::OBJC_TQ_Out);
+
+ // If there was an lvalue adjustment, add it as a separate conversion.
+ if (ICS.Standard.First == ICK_Array_To_Pointer ||
+ ICS.Standard.First == ICK_Lvalue_To_Rvalue) {
+ ImplicitConversionSequence LvalueICS;
+ LvalueICS.setStandard();
+ LvalueICS.Standard.setAsIdentityConversion();
+ LvalueICS.Standard.setAllToTypes(ICS.Standard.getToType(0));
+ LvalueICS.Standard.First = ICS.Standard.First;
+ AddConversionSequenceStep(LvalueICS, ICS.Standard.getToType(0));
+ }
+
+ AddPassByIndirectCopyRestoreStep(Entity.getType(), ShouldCopy);
+ } else if (ICS.isBad()) {
DeclAccessPair dap;
if (Initializer->getType() == Context.OverloadTy &&
!S.ResolveAddressOfOverloadedFunction(Initializer
@@ -3315,6 +3569,10 @@ InitializationSequence::InitializationSequence(Sema &S,
SetFailed(InitializationSequence::FK_AddressOfOverloadFailed);
else
SetFailed(InitializationSequence::FK_ConversionFailed);
+ } else {
+ AddConversionSequenceStep(ICS, Entity.getType());
+
+ MaybeProduceObjCObject(S, *this, Entity);
}
}
@@ -3560,7 +3818,7 @@ static ExprResult CopyObject(Sema &S,
<< (int)Entity.getKind() << CurInitExpr->getType()
<< CurInitExpr->getSourceRange();
S.Diag(Best->Function->getLocation(), diag::note_unavailable_here)
- << Best->Function->isDeleted();
+ << 1 << Best->Function->isDeleted();
return ExprError();
}
@@ -3633,6 +3891,11 @@ void InitializationSequence::PrintInitLocationNote(Sema &S,
}
}
+static bool isReferenceBinding(const InitializationSequence::Step &s) {
+ return s.Kind == InitializationSequence::SK_BindReference ||
+ s.Kind == InitializationSequence::SK_BindReferenceToTemporary;
+}
+
ExprResult
InitializationSequence::Perform(Sema &S,
const InitializedEntity &Entity,
@@ -3684,19 +3947,9 @@ InitializationSequence::Perform(Sema &S,
}
}
-
- if (Kind.getKind() == InitializationKind::IK_Copy || Kind.isExplicitCast())
- return ExprResult(Args.release()[0]);
-
- if (Args.size() == 0)
- return S.Owned((Expr *)0);
-
- unsigned NumArgs = Args.size();
- return S.Owned(new (S.Context) ParenListExpr(S.Context,
- SourceLocation(),
- (Expr **)Args.release(),
- NumArgs,
- SourceLocation()));
+ assert(Kind.getKind() == InitializationKind::IK_Copy ||
+ Kind.isExplicitCast());
+ return ExprResult(Args.release()[0]);
}
// No steps means no initialization.
@@ -3733,7 +3986,10 @@ InitializationSequence::Perform(Sema &S,
case SK_CAssignment:
case SK_StringInit:
case SK_ObjCObjectConversion:
- case SK_ArrayInit: {
+ case SK_ArrayInit:
+ case SK_PassByIndirectCopyRestore:
+ case SK_PassByIndirectRestore:
+ case SK_ProduceObjCObject: {
assert(Args.size() == 1);
CurInit = Args.get()[0];
if (!CurInit.get()) return ExprError();
@@ -3841,12 +4097,22 @@ InitializationSequence::Perform(Sema &S,
break;
case SK_BindReferenceToTemporary:
- // Reference binding does not have any corresponding ASTs.
-
// Check exception specifications
if (S.CheckExceptionSpecCompatibility(CurInit.get(), DestType))
return ExprError();
+ // Materialize the temporary into memory.
+ CurInit = new (S.Context) MaterializeTemporaryExpr(
+ Entity.getType().getNonReferenceType(),
+ CurInit.get(),
+ Entity.getType()->isLValueReferenceType());
+
+ // If we're binding to an Objective-C object that has lifetime, we
+ // need cleanups.
+ if (S.getLangOptions().ObjCAutoRefCount &&
+ CurInit.get()->getType()->isObjCLifetimeType())
+ S.ExprNeedsCleanups = true;
+
break;
case SK_ExtraneousCopyToTemporary:
@@ -3925,8 +4191,7 @@ InitializationSequence::Perform(Sema &S,
CreatedObject = Conversion->getResultType()->isRecordType();
}
- bool RequiresCopy = !IsCopy &&
- getKind() != InitializationSequence::ReferenceBinding;
+ bool RequiresCopy = !IsCopy && !isReferenceBinding(Steps.back());
if (RequiresCopy || shouldBindAsTemporary(Entity))
CurInit = S.MaybeBindToTemporary(CurInit.takeAs<Expr>());
else if (CreatedObject && shouldDestroyTemporary(Entity)) {
@@ -3969,10 +4234,14 @@ InitializationSequence::Perform(Sema &S,
}
case SK_ConversionSequence: {
+ Sema::CheckedConversionKind CCK
+ = Kind.isCStyleCast()? Sema::CCK_CStyleCast
+ : Kind.isFunctionalCast()? Sema::CCK_FunctionalCast
+ : Kind.isExplicitCast()? Sema::CCK_OtherCast
+ : Sema::CCK_ImplicitConversion;
ExprResult CurInitExprRes =
S.PerformImplicitConversion(CurInit.get(), Step->Type, *Step->ICS,
- getAssignmentAction(Entity),
- Kind.isCStyleOrFunctionalCast());
+ getAssignmentAction(Entity), CCK);
if (CurInitExprRes.isInvalid())
return ExprError();
CurInit = move(CurInitExprRes);
@@ -4182,7 +4451,20 @@ InitializationSequence::Perform(Sema &S,
}
}
}
+ break;
+ case SK_PassByIndirectCopyRestore:
+ case SK_PassByIndirectRestore:
+ checkIndirectCopyRestoreSource(S, CurInit.get());
+ CurInit = S.Owned(new (S.Context)
+ ObjCIndirectCopyRestoreExpr(CurInit.take(), Step->Type,
+ Step->Kind == SK_PassByIndirectCopyRestore));
+ break;
+
+ case SK_ProduceObjCObject:
+ CurInit = S.Owned(ImplicitCastExpr::Create(S.Context, Step->Type,
+ CK_ObjCProduceObject,
+ CurInit.take(), 0, VK_RValue));
break;
}
}
@@ -4278,7 +4560,7 @@ bool InitializationSequence::Diagnose(Sema &S,
true);
if (Ovl == OR_Deleted) {
S.Diag(Best->Function->getLocation(), diag::note_unavailable_here)
- << Best->Function->isDeleted();
+ << 1 << Best->Function->isDeleted();
} else {
llvm_unreachable("Inconsistent overload resolution?");
}
@@ -4443,7 +4725,7 @@ bool InitializationSequence::Diagnose(Sema &S,
= FailedCandidateSet.BestViableFunction(S, Kind.getLocation(), Best);
if (Ovl == OR_Deleted) {
S.Diag(Best->Function->getLocation(), diag::note_unavailable_here)
- << Best->Function->isDeleted();
+ << 1 << Best->Function->isDeleted();
} else {
llvm_unreachable("Inconsistent overload resolution?");
}
@@ -4587,10 +4869,6 @@ void InitializationSequence::dump(llvm::raw_ostream &OS) const {
case NormalSequence:
OS << "Normal sequence: ";
break;
-
- case ReferenceBinding:
- OS << "Reference binding: ";
- break;
}
for (step_iterator S = step_begin(), SEnd = step_end(); S != SEnd; ++S) {
@@ -4674,6 +4952,18 @@ void InitializationSequence::dump(llvm::raw_ostream &OS) const {
case SK_ArrayInit:
OS << "array initialization";
break;
+
+ case SK_PassByIndirectCopyRestore:
+ OS << "pass by indirect copy and restore";
+ break;
+
+ case SK_PassByIndirectRestore:
+ OS << "pass by indirect restore";
+ break;
+
+ case SK_ProduceObjCObject:
+ OS << "Objective-C object retension";
+ break;
}
}
}
diff --git a/contrib/llvm/tools/clang/lib/Sema/SemaLookup.cpp b/contrib/llvm/tools/clang/lib/Sema/SemaLookup.cpp
index 92ade1e..0e448e3 100644
--- a/contrib/llvm/tools/clang/lib/Sema/SemaLookup.cpp
+++ b/contrib/llvm/tools/clang/lib/Sema/SemaLookup.cpp
@@ -20,6 +20,7 @@
#include "clang/Sema/ScopeInfo.h"
#include "clang/Sema/TemplateDeduction.h"
#include "clang/Sema/ExternalSemaSource.h"
+#include "clang/Sema/TypoCorrection.h"
#include "clang/AST/ASTContext.h"
#include "clang/AST/CXXInheritance.h"
#include "clang/AST/Decl.h"
@@ -42,6 +43,7 @@
#include <iterator>
#include <utility>
#include <algorithm>
+#include <map>
using namespace clang;
using namespace sema;
@@ -207,6 +209,7 @@ static inline unsigned getIDNS(Sema::LookupNameKind NameKind,
bool Redeclaration) {
unsigned IDNS = 0;
switch (NameKind) {
+ case Sema::LookupObjCImplicitSelfParam:
case Sema::LookupOrdinaryName:
case Sema::LookupRedeclarationWithLinkage:
IDNS = Decl::IDNS_Ordinary;
@@ -1095,7 +1098,10 @@ bool Sema::LookupName(LookupResult &R, Scope *S, bool AllowBuiltinCreation) {
if (LeftStartingScope && !((*I)->hasLinkage()))
continue;
}
-
+ else if (NameKind == LookupObjCImplicitSelfParam &&
+ !isa<ImplicitParamDecl>(*I))
+ continue;
+
R.addDecl(*I);
if ((*I)->getAttr<OverloadableAttr>()) {
@@ -1379,6 +1385,7 @@ bool Sema::LookupQualifiedName(LookupResult &R, DeclContext *LookupCtx,
// Look for this member in our base classes
CXXRecordDecl::BaseMatchesCallback *BaseCallback = 0;
switch (R.getLookupKind()) {
+ case LookupObjCImplicitSelfParam:
case LookupOrdinaryName:
case LookupMemberName:
case LookupRedeclarationWithLinkage:
@@ -2137,15 +2144,15 @@ void Sema::LookupOverloadedOperatorName(OverloadedOperatorKind Op, Scope *S,
}
}
-Sema::SpecialMemberOverloadResult *Sema::LookupSpecialMember(CXXRecordDecl *D,
+Sema::SpecialMemberOverloadResult *Sema::LookupSpecialMember(CXXRecordDecl *RD,
CXXSpecialMember SM,
bool ConstArg,
bool VolatileArg,
bool RValueThis,
bool ConstThis,
bool VolatileThis) {
- D = D->getDefinition();
- assert((D && !D->isBeingDefined()) &&
+ RD = RD->getDefinition();
+ assert((RD && !RD->isBeingDefined()) &&
"doing special member lookup into record that isn't fully complete");
if (RValueThis || ConstThis || VolatileThis)
assert((SM == CXXCopyAssignment || SM == CXXMoveAssignment) &&
@@ -2155,7 +2162,7 @@ Sema::SpecialMemberOverloadResult *Sema::LookupSpecialMember(CXXRecordDecl *D,
"parameter-less special members can't have qualified arguments");
llvm::FoldingSetNodeID ID;
- ID.AddPointer(D);
+ ID.AddPointer(RD);
ID.AddInteger(SM);
ID.AddInteger(ConstArg);
ID.AddInteger(VolatileArg);
@@ -2176,9 +2183,9 @@ Sema::SpecialMemberOverloadResult *Sema::LookupSpecialMember(CXXRecordDecl *D,
SpecialMemberCache.InsertNode(Result, InsertPoint);
if (SM == CXXDestructor) {
- if (!D->hasDeclaredDestructor())
- DeclareImplicitDestructor(D);
- CXXDestructorDecl *DD = D->getDestructor();
+ if (!RD->hasDeclaredDestructor())
+ DeclareImplicitDestructor(RD);
+ CXXDestructorDecl *DD = RD->getDestructor();
assert(DD && "record without a destructor");
Result->setMethod(DD);
Result->setSuccess(DD->isDeleted());
@@ -2188,7 +2195,7 @@ Sema::SpecialMemberOverloadResult *Sema::LookupSpecialMember(CXXRecordDecl *D,
// Prepare for overload resolution. Here we construct a synthetic argument
// if necessary and make sure that implicit functions are declared.
- CanQualType CanTy = Context.getCanonicalType(Context.getTagDeclType(D));
+ CanQualType CanTy = Context.getCanonicalType(Context.getTagDeclType(RD));
DeclarationName Name;
Expr *Arg = 0;
unsigned NumArgs;
@@ -2196,18 +2203,18 @@ Sema::SpecialMemberOverloadResult *Sema::LookupSpecialMember(CXXRecordDecl *D,
if (SM == CXXDefaultConstructor) {
Name = Context.DeclarationNames.getCXXConstructorName(CanTy);
NumArgs = 0;
- if (D->needsImplicitDefaultConstructor())
- DeclareImplicitDefaultConstructor(D);
+ if (RD->needsImplicitDefaultConstructor())
+ DeclareImplicitDefaultConstructor(RD);
} else {
if (SM == CXXCopyConstructor || SM == CXXMoveConstructor) {
Name = Context.DeclarationNames.getCXXConstructorName(CanTy);
- if (!D->hasDeclaredCopyConstructor())
- DeclareImplicitCopyConstructor(D);
+ if (!RD->hasDeclaredCopyConstructor())
+ DeclareImplicitCopyConstructor(RD);
// TODO: Move constructors
} else {
Name = Context.DeclarationNames.getCXXOperatorName(OO_Equal);
- if (!D->hasDeclaredCopyAssignment())
- DeclareImplicitCopyAssignment(D);
+ if (!RD->hasDeclaredCopyAssignment())
+ DeclareImplicitCopyAssignment(RD);
// TODO: Move assignment
}
@@ -2225,7 +2232,7 @@ Sema::SpecialMemberOverloadResult *Sema::LookupSpecialMember(CXXRecordDecl *D,
// there is no semantic difference for class types in this restricted
// case.
ExprValueKind VK;
- if (SM == CXXCopyAssignment || SM == CXXMoveAssignment)
+ if (SM == CXXCopyConstructor || SM == CXXCopyAssignment)
VK = VK_LValue;
else
VK = VK_RValue;
@@ -2240,7 +2247,7 @@ Sema::SpecialMemberOverloadResult *Sema::LookupSpecialMember(CXXRecordDecl *D,
ThisTy.addConst();
if (VolatileThis)
ThisTy.addVolatile();
- Expr::Classification ObjectClassification =
+ Expr::Classification Classification =
(new (Context) OpaqueValueExpr(SourceLocation(), ThisTy,
RValueThis ? VK_RValue : VK_LValue))->
Classify(Context);
@@ -2252,16 +2259,33 @@ Sema::SpecialMemberOverloadResult *Sema::LookupSpecialMember(CXXRecordDecl *D,
DeclContext::lookup_iterator I, E;
Result->setConstParamMatch(false);
- llvm::tie(I, E) = D->lookup(Name);
+ llvm::tie(I, E) = RD->lookup(Name);
assert((I != E) &&
"lookup for a constructor or assignment operator was empty");
for ( ; I != E; ++I) {
- if ((*I)->isInvalidDecl())
+ Decl *Cand = *I;
+
+ if (Cand->isInvalidDecl())
continue;
- if (CXXMethodDecl *M = dyn_cast<CXXMethodDecl>(*I)) {
- AddOverloadCandidate(M, DeclAccessPair::make(M, AS_public), &Arg, NumArgs,
- OCS, true);
+ if (UsingShadowDecl *U = dyn_cast<UsingShadowDecl>(Cand)) {
+ // FIXME: [namespace.udecl]p15 says that we should only consider a
+ // using declaration here if it does not match a declaration in the
+ // derived class. We do not implement this correctly in other cases
+ // either.
+ Cand = U->getTargetDecl();
+
+ if (Cand->isInvalidDecl())
+ continue;
+ }
+
+ if (CXXMethodDecl *M = dyn_cast<CXXMethodDecl>(Cand)) {
+ if (SM == CXXCopyAssignment || SM == CXXMoveAssignment)
+ AddMethodCandidate(M, DeclAccessPair::make(M, AS_public), RD, ThisTy,
+ Classification, &Arg, NumArgs, OCS, true);
+ else
+ AddOverloadCandidate(M, DeclAccessPair::make(M, AS_public), &Arg,
+ NumArgs, OCS, true);
// Here we're looking for a const parameter to speed up creation of
// implicit copy methods.
@@ -2269,13 +2293,21 @@ Sema::SpecialMemberOverloadResult *Sema::LookupSpecialMember(CXXRecordDecl *D,
(SM == CXXCopyConstructor &&
cast<CXXConstructorDecl>(M)->isCopyConstructor())) {
QualType ArgType = M->getType()->getAs<FunctionProtoType>()->getArgType(0);
- if (ArgType->getPointeeType().isConstQualified())
+ if (!ArgType->isReferenceType() ||
+ ArgType->getPointeeType().isConstQualified())
Result->setConstParamMatch(true);
}
+ } else if (FunctionTemplateDecl *Tmpl =
+ dyn_cast<FunctionTemplateDecl>(Cand)) {
+ if (SM == CXXCopyAssignment || SM == CXXMoveAssignment)
+ AddMethodTemplateCandidate(Tmpl, DeclAccessPair::make(Tmpl, AS_public),
+ RD, 0, ThisTy, Classification, &Arg, NumArgs,
+ OCS, true);
+ else
+ AddTemplateOverloadCandidate(Tmpl, DeclAccessPair::make(Tmpl, AS_public),
+ 0, &Arg, NumArgs, OCS, true);
} else {
- FunctionTemplateDecl *Tmpl = cast<FunctionTemplateDecl>(*I);
- AddTemplateOverloadCandidate(Tmpl, DeclAccessPair::make(Tmpl, AS_public),
- 0, &Arg, NumArgs, OCS, true);
+ assert(isa<UsingDecl>(Cand) && "illegal Kind of operator = Decl");
}
}
@@ -2310,10 +2342,10 @@ CXXConstructorDecl *Sema::LookupDefaultConstructor(CXXRecordDecl *Class) {
return cast_or_null<CXXConstructorDecl>(Result->getMethod());
}
-/// \brief Look up the copy constructor for the given class.
-CXXConstructorDecl *Sema::LookupCopyConstructor(CXXRecordDecl *Class,
- unsigned Quals,
- bool *ConstParamMatch) {
+/// \brief Look up the copying constructor for the given class.
+CXXConstructorDecl *Sema::LookupCopyingConstructor(CXXRecordDecl *Class,
+ unsigned Quals,
+ bool *ConstParamMatch) {
assert(!(Quals & ~(Qualifiers::Const | Qualifiers::Volatile)) &&
"non-const, non-volatile qualifiers for copy ctor arg");
SpecialMemberOverloadResult *Result =
@@ -2341,6 +2373,27 @@ DeclContext::lookup_result Sema::LookupConstructors(CXXRecordDecl *Class) {
return Class->lookup(Name);
}
+/// \brief Look up the copying assignment operator for the given class.
+CXXMethodDecl *Sema::LookupCopyingAssignment(CXXRecordDecl *Class,
+ unsigned Quals, bool RValueThis,
+ unsigned ThisQuals,
+ bool *ConstParamMatch) {
+ assert(!(Quals & ~(Qualifiers::Const | Qualifiers::Volatile)) &&
+ "non-const, non-volatile qualifiers for copy assignment arg");
+ assert(!(ThisQuals & ~(Qualifiers::Const | Qualifiers::Volatile)) &&
+ "non-const, non-volatile qualifiers for copy assignment this");
+ SpecialMemberOverloadResult *Result =
+ LookupSpecialMember(Class, CXXCopyAssignment, Quals & Qualifiers::Const,
+ Quals & Qualifiers::Volatile, RValueThis,
+ ThisQuals & Qualifiers::Const,
+ ThisQuals & Qualifiers::Volatile);
+
+ if (ConstParamMatch)
+ *ConstParamMatch = Result->hasConstParamMatch();
+
+ return Result->getMethod();
+}
+
/// \brief Look for the destructor of the given class.
///
/// During semantic analysis, this routine should be used in lieu of
@@ -2995,6 +3048,12 @@ LabelDecl *Sema::LookupOrCreateLabel(IdentifierInfo *II, SourceLocation Loc,
//===----------------------------------------------------------------------===//
namespace {
+
+typedef llvm::StringMap<TypoCorrection, llvm::BumpPtrAllocator> TypoResultsMap;
+typedef std::map<unsigned, TypoResultsMap *> TypoEditDistanceMap;
+
+static const unsigned MaxTypoDistanceResultSets = 5;
+
class TypoCorrectionConsumer : public VisibleDeclConsumer {
/// \brief The name written that is a typo in the source.
llvm::StringRef Typo;
@@ -3002,33 +3061,55 @@ class TypoCorrectionConsumer : public VisibleDeclConsumer {
/// \brief The results found that have the smallest edit distance
/// found (so far) with the typo name.
///
- /// The boolean value indicates whether there is a keyword with this name.
- llvm::StringMap<bool, llvm::BumpPtrAllocator> BestResults;
+ /// The pointer value being set to the current DeclContext indicates
+ /// whether there is a keyword with this name.
+ TypoEditDistanceMap BestResults;
+
+ /// \brief The worst of the best N edit distances found so far.
+ unsigned MaxEditDistance;
- /// \brief The best edit distance found so far.
- unsigned BestEditDistance;
+ Sema &SemaRef;
public:
- explicit TypoCorrectionConsumer(IdentifierInfo *Typo)
+ explicit TypoCorrectionConsumer(Sema &SemaRef, IdentifierInfo *Typo)
: Typo(Typo->getName()),
- BestEditDistance((std::numeric_limits<unsigned>::max)()) { }
+ MaxEditDistance((std::numeric_limits<unsigned>::max)()),
+ SemaRef(SemaRef) { }
+ ~TypoCorrectionConsumer() {
+ for (TypoEditDistanceMap::iterator I = BestResults.begin(),
+ IEnd = BestResults.end();
+ I != IEnd;
+ ++I)
+ delete I->second;
+ }
+
virtual void FoundDecl(NamedDecl *ND, NamedDecl *Hiding, bool InBaseClass);
void FoundName(llvm::StringRef Name);
- void addKeywordResult(ASTContext &Context, llvm::StringRef Keyword);
-
- typedef llvm::StringMap<bool, llvm::BumpPtrAllocator>::iterator iterator;
- iterator begin() { return BestResults.begin(); }
- iterator end() { return BestResults.end(); }
- void erase(iterator I) { BestResults.erase(I); }
+ void addKeywordResult(llvm::StringRef Keyword);
+ void addName(llvm::StringRef Name, NamedDecl *ND, unsigned Distance,
+ NestedNameSpecifier *NNS=NULL);
+ void addCorrection(TypoCorrection Correction);
+
+ typedef TypoResultsMap::iterator result_iterator;
+ typedef TypoEditDistanceMap::iterator distance_iterator;
+ distance_iterator begin() { return BestResults.begin(); }
+ distance_iterator end() { return BestResults.end(); }
+ void erase(distance_iterator I) { BestResults.erase(I); }
unsigned size() const { return BestResults.size(); }
bool empty() const { return BestResults.empty(); }
- bool &operator[](llvm::StringRef Name) {
- return BestResults[Name];
+ TypoCorrection &operator[](llvm::StringRef Name) {
+ return (*BestResults.begin()->second)[Name];
+ }
+
+ unsigned getMaxEditDistance() const {
+ return MaxEditDistance;
}
- unsigned getBestEditDistance() const { return BestEditDistance; }
+ unsigned getBestEditDistance() {
+ return (BestResults.empty()) ? MaxEditDistance : BestResults.begin()->first;
+ }
};
}
@@ -3053,55 +3134,181 @@ void TypoCorrectionConsumer::FoundName(llvm::StringRef Name) {
// Use a simple length-based heuristic to determine the minimum possible
// edit distance. If the minimum isn't good enough, bail out early.
unsigned MinED = abs((int)Name.size() - (int)Typo.size());
- if (MinED > BestEditDistance || (MinED && Typo.size() / MinED < 3))
+ if (MinED > MaxEditDistance || (MinED && Typo.size() / MinED < 3))
return;
// Compute an upper bound on the allowable edit distance, so that the
// edit-distance algorithm can short-circuit.
unsigned UpperBound =
- std::min(unsigned((Typo.size() + 2) / 3), BestEditDistance);
+ std::min(unsigned((Typo.size() + 2) / 3), MaxEditDistance);
// Compute the edit distance between the typo and the name of this
// entity. If this edit distance is not worse than the best edit
// distance we've seen so far, add it to the list of results.
unsigned ED = Typo.edit_distance(Name, true, UpperBound);
- if (ED == 0)
- return;
- if (ED < BestEditDistance) {
- // This result is better than any we've seen before; clear out
- // the previous results.
- BestResults.clear();
- BestEditDistance = ED;
- } else if (ED > BestEditDistance) {
+ if (ED > MaxEditDistance) {
// This result is worse than the best results we've seen so far;
// ignore it.
return;
}
- // Add this name to the list of results. By not assigning a value, we
- // keep the current value if we've seen this name before (either as a
- // keyword or as a declaration), or get the default value (not a keyword)
- // if we haven't seen it before.
- (void)BestResults[Name];
+ addName(Name, NULL, ED);
}
-void TypoCorrectionConsumer::addKeywordResult(ASTContext &Context,
- llvm::StringRef Keyword) {
+void TypoCorrectionConsumer::addKeywordResult(llvm::StringRef Keyword) {
// Compute the edit distance between the typo and this keyword.
// If this edit distance is not worse than the best edit
// distance we've seen so far, add it to the list of results.
unsigned ED = Typo.edit_distance(Keyword);
- if (ED < BestEditDistance) {
- BestResults.clear();
- BestEditDistance = ED;
- } else if (ED > BestEditDistance) {
+ if (ED > MaxEditDistance) {
// This result is worse than the best results we've seen so far;
// ignore it.
return;
}
- BestResults[Keyword] = true;
+ addName(Keyword, TypoCorrection::KeywordDecl(), ED);
+}
+
+void TypoCorrectionConsumer::addName(llvm::StringRef Name,
+ NamedDecl *ND,
+ unsigned Distance,
+ NestedNameSpecifier *NNS) {
+ addCorrection(TypoCorrection(&SemaRef.Context.Idents.get(Name),
+ ND, NNS, Distance));
+}
+
+void TypoCorrectionConsumer::addCorrection(TypoCorrection Correction) {
+ llvm::StringRef Name = Correction.getCorrectionAsIdentifierInfo()->getName();
+ TypoResultsMap *& Map = BestResults[Correction.getEditDistance()];
+ if (!Map)
+ Map = new TypoResultsMap;
+
+ TypoCorrection &CurrentCorrection = (*Map)[Name];
+ if (!CurrentCorrection ||
+ // FIXME: The following should be rolled up into an operator< on
+ // TypoCorrection with a more principled definition.
+ CurrentCorrection.isKeyword() < Correction.isKeyword() ||
+ Correction.getAsString(SemaRef.getLangOptions()) <
+ CurrentCorrection.getAsString(SemaRef.getLangOptions()))
+ CurrentCorrection = Correction;
+
+ while (BestResults.size() > MaxTypoDistanceResultSets) {
+ TypoEditDistanceMap::iterator Last = BestResults.end();
+ --Last;
+ delete Last->second;
+ BestResults.erase(Last);
+ }
+}
+
+namespace {
+
+class SpecifierInfo {
+ public:
+ DeclContext* DeclCtx;
+ NestedNameSpecifier* NameSpecifier;
+ unsigned EditDistance;
+
+ SpecifierInfo(DeclContext *Ctx, NestedNameSpecifier *NNS, unsigned ED)
+ : DeclCtx(Ctx), NameSpecifier(NNS), EditDistance(ED) {}
+};
+
+typedef llvm::SmallVector<DeclContext*, 4> DeclContextList;
+typedef llvm::SmallVector<SpecifierInfo, 16> SpecifierInfoList;
+
+class NamespaceSpecifierSet {
+ ASTContext &Context;
+ DeclContextList CurContextChain;
+ bool isSorted;
+
+ SpecifierInfoList Specifiers;
+ llvm::SmallSetVector<unsigned, 4> Distances;
+ llvm::DenseMap<unsigned, SpecifierInfoList> DistanceMap;
+
+ /// \brief Helper for building the list of DeclContexts between the current
+ /// context and the top of the translation unit
+ static DeclContextList BuildContextChain(DeclContext *Start);
+
+ void SortNamespaces();
+
+ public:
+ explicit NamespaceSpecifierSet(ASTContext &Context, DeclContext *CurContext)
+ : Context(Context), CurContextChain(BuildContextChain(CurContext)),
+ isSorted(true) {}
+
+ /// \brief Add the namespace to the set, computing the corresponding
+ /// NestedNameSpecifier and its distance in the process.
+ void AddNamespace(NamespaceDecl *ND);
+
+ typedef SpecifierInfoList::iterator iterator;
+ iterator begin() {
+ if (!isSorted) SortNamespaces();
+ return Specifiers.begin();
+ }
+ iterator end() { return Specifiers.end(); }
+};
+
+}
+
+DeclContextList NamespaceSpecifierSet::BuildContextChain(DeclContext *Start) {
+ assert(Start && "Bulding a context chain from a null context");
+ DeclContextList Chain;
+ for (DeclContext *DC = Start->getPrimaryContext(); DC != NULL;
+ DC = DC->getLookupParent()) {
+ NamespaceDecl *ND = dyn_cast_or_null<NamespaceDecl>(DC);
+ if (!DC->isInlineNamespace() && !DC->isTransparentContext() &&
+ !(ND && ND->isAnonymousNamespace()))
+ Chain.push_back(DC->getPrimaryContext());
+ }
+ return Chain;
+}
+
+void NamespaceSpecifierSet::SortNamespaces() {
+ llvm::SmallVector<unsigned, 4> sortedDistances;
+ sortedDistances.append(Distances.begin(), Distances.end());
+
+ if (sortedDistances.size() > 1)
+ std::sort(sortedDistances.begin(), sortedDistances.end());
+
+ Specifiers.clear();
+ for (llvm::SmallVector<unsigned, 4>::iterator DI = sortedDistances.begin(),
+ DIEnd = sortedDistances.end();
+ DI != DIEnd; ++DI) {
+ SpecifierInfoList &SpecList = DistanceMap[*DI];
+ Specifiers.append(SpecList.begin(), SpecList.end());
+ }
+
+ isSorted = true;
+}
+
+void NamespaceSpecifierSet::AddNamespace(NamespaceDecl *ND) {
+ DeclContext *Ctx = cast<DeclContext>(ND);
+ NestedNameSpecifier *NNS = NULL;
+ unsigned NumSpecifiers = 0;
+ DeclContextList NamespaceDeclChain(BuildContextChain(Ctx));
+
+ // Eliminate common elements from the two DeclContext chains
+ for (DeclContextList::reverse_iterator C = CurContextChain.rbegin(),
+ CEnd = CurContextChain.rend();
+ C != CEnd && !NamespaceDeclChain.empty() &&
+ NamespaceDeclChain.back() == *C; ++C) {
+ NamespaceDeclChain.pop_back();
+ }
+
+ // Build the NestedNameSpecifier from what is left of the NamespaceDeclChain
+ for (DeclContextList::reverse_iterator C = NamespaceDeclChain.rbegin(),
+ CEnd = NamespaceDeclChain.rend();
+ C != CEnd; ++C) {
+ NamespaceDecl *ND = dyn_cast_or_null<NamespaceDecl>(*C);
+ if (ND) {
+ NNS = NestedNameSpecifier::Create(Context, NNS, ND);
+ ++NumSpecifiers;
+ }
+ }
+
+ isSorted = false;
+ Distances.insert(NumSpecifiers);
+ DistanceMap[NumSpecifiers].push_back(SpecifierInfo(Ctx, NNS, NumSpecifiers));
}
/// \brief Perform name lookup for a possible result for typo correction.
@@ -3155,14 +3362,193 @@ static void LookupPotentialTypoResult(Sema &SemaRef,
}
}
+/// \brief Add keywords to the consumer as possible typo corrections.
+static void AddKeywordsToConsumer(Sema &SemaRef,
+ TypoCorrectionConsumer &Consumer,
+ Scope *S, Sema::CorrectTypoContext CTC) {
+ // Add context-dependent keywords.
+ bool WantTypeSpecifiers = false;
+ bool WantExpressionKeywords = false;
+ bool WantCXXNamedCasts = false;
+ bool WantRemainingKeywords = false;
+ switch (CTC) {
+ case Sema::CTC_Unknown:
+ WantTypeSpecifiers = true;
+ WantExpressionKeywords = true;
+ WantCXXNamedCasts = true;
+ WantRemainingKeywords = true;
+
+ if (ObjCMethodDecl *Method = SemaRef.getCurMethodDecl())
+ if (Method->getClassInterface() &&
+ Method->getClassInterface()->getSuperClass())
+ Consumer.addKeywordResult("super");
+
+ break;
+
+ case Sema::CTC_NoKeywords:
+ break;
+
+ case Sema::CTC_Type:
+ WantTypeSpecifiers = true;
+ break;
+
+ case Sema::CTC_ObjCMessageReceiver:
+ Consumer.addKeywordResult("super");
+ // Fall through to handle message receivers like expressions.
+
+ case Sema::CTC_Expression:
+ if (SemaRef.getLangOptions().CPlusPlus)
+ WantTypeSpecifiers = true;
+ WantExpressionKeywords = true;
+ // Fall through to get C++ named casts.
+
+ case Sema::CTC_CXXCasts:
+ WantCXXNamedCasts = true;
+ break;
+
+ case Sema::CTC_ObjCPropertyLookup:
+ // FIXME: Add "isa"?
+ break;
+
+ case Sema::CTC_MemberLookup:
+ if (SemaRef.getLangOptions().CPlusPlus)
+ Consumer.addKeywordResult("template");
+ break;
+
+ case Sema::CTC_ObjCIvarLookup:
+ break;
+ }
+
+ if (WantTypeSpecifiers) {
+ // Add type-specifier keywords to the set of results.
+ const char *CTypeSpecs[] = {
+ "char", "const", "double", "enum", "float", "int", "long", "short",
+ "signed", "struct", "union", "unsigned", "void", "volatile",
+ "_Complex", "_Imaginary",
+ // storage-specifiers as well
+ "extern", "inline", "static", "typedef"
+ };
+
+ const unsigned NumCTypeSpecs = sizeof(CTypeSpecs) / sizeof(CTypeSpecs[0]);
+ for (unsigned I = 0; I != NumCTypeSpecs; ++I)
+ Consumer.addKeywordResult(CTypeSpecs[I]);
+
+ if (SemaRef.getLangOptions().C99)
+ Consumer.addKeywordResult("restrict");
+ if (SemaRef.getLangOptions().Bool || SemaRef.getLangOptions().CPlusPlus)
+ Consumer.addKeywordResult("bool");
+ else if (SemaRef.getLangOptions().C99)
+ Consumer.addKeywordResult("_Bool");
+
+ if (SemaRef.getLangOptions().CPlusPlus) {
+ Consumer.addKeywordResult("class");
+ Consumer.addKeywordResult("typename");
+ Consumer.addKeywordResult("wchar_t");
+
+ if (SemaRef.getLangOptions().CPlusPlus0x) {
+ Consumer.addKeywordResult("char16_t");
+ Consumer.addKeywordResult("char32_t");
+ Consumer.addKeywordResult("constexpr");
+ Consumer.addKeywordResult("decltype");
+ Consumer.addKeywordResult("thread_local");
+ }
+ }
+
+ if (SemaRef.getLangOptions().GNUMode)
+ Consumer.addKeywordResult("typeof");
+ }
+
+ if (WantCXXNamedCasts && SemaRef.getLangOptions().CPlusPlus) {
+ Consumer.addKeywordResult("const_cast");
+ Consumer.addKeywordResult("dynamic_cast");
+ Consumer.addKeywordResult("reinterpret_cast");
+ Consumer.addKeywordResult("static_cast");
+ }
+
+ if (WantExpressionKeywords) {
+ Consumer.addKeywordResult("sizeof");
+ if (SemaRef.getLangOptions().Bool || SemaRef.getLangOptions().CPlusPlus) {
+ Consumer.addKeywordResult("false");
+ Consumer.addKeywordResult("true");
+ }
+
+ if (SemaRef.getLangOptions().CPlusPlus) {
+ const char *CXXExprs[] = {
+ "delete", "new", "operator", "throw", "typeid"
+ };
+ const unsigned NumCXXExprs = sizeof(CXXExprs) / sizeof(CXXExprs[0]);
+ for (unsigned I = 0; I != NumCXXExprs; ++I)
+ Consumer.addKeywordResult(CXXExprs[I]);
+
+ if (isa<CXXMethodDecl>(SemaRef.CurContext) &&
+ cast<CXXMethodDecl>(SemaRef.CurContext)->isInstance())
+ Consumer.addKeywordResult("this");
+
+ if (SemaRef.getLangOptions().CPlusPlus0x) {
+ Consumer.addKeywordResult("alignof");
+ Consumer.addKeywordResult("nullptr");
+ }
+ }
+ }
+
+ if (WantRemainingKeywords) {
+ if (SemaRef.getCurFunctionOrMethodDecl() || SemaRef.getCurBlock()) {
+ // Statements.
+ const char *CStmts[] = {
+ "do", "else", "for", "goto", "if", "return", "switch", "while" };
+ const unsigned NumCStmts = sizeof(CStmts) / sizeof(CStmts[0]);
+ for (unsigned I = 0; I != NumCStmts; ++I)
+ Consumer.addKeywordResult(CStmts[I]);
+
+ if (SemaRef.getLangOptions().CPlusPlus) {
+ Consumer.addKeywordResult("catch");
+ Consumer.addKeywordResult("try");
+ }
+
+ if (S && S->getBreakParent())
+ Consumer.addKeywordResult("break");
+
+ if (S && S->getContinueParent())
+ Consumer.addKeywordResult("continue");
+
+ if (!SemaRef.getCurFunction()->SwitchStack.empty()) {
+ Consumer.addKeywordResult("case");
+ Consumer.addKeywordResult("default");
+ }
+ } else {
+ if (SemaRef.getLangOptions().CPlusPlus) {
+ Consumer.addKeywordResult("namespace");
+ Consumer.addKeywordResult("template");
+ }
+
+ if (S && S->isClassScope()) {
+ Consumer.addKeywordResult("explicit");
+ Consumer.addKeywordResult("friend");
+ Consumer.addKeywordResult("mutable");
+ Consumer.addKeywordResult("private");
+ Consumer.addKeywordResult("protected");
+ Consumer.addKeywordResult("public");
+ Consumer.addKeywordResult("virtual");
+ }
+ }
+
+ if (SemaRef.getLangOptions().CPlusPlus) {
+ Consumer.addKeywordResult("using");
+
+ if (SemaRef.getLangOptions().CPlusPlus0x)
+ Consumer.addKeywordResult("static_assert");
+ }
+ }
+}
+
/// \brief Try to "correct" a typo in the source code by finding
/// visible declarations whose names are similar to the name that was
/// present in the source code.
///
-/// \param Res the \c LookupResult structure that contains the name
-/// that was present in the source code along with the name-lookup
-/// criteria used to search for the name. On success, this structure
-/// will contain the results of name lookup.
+/// \param TypoName the \c DeclarationNameInfo structure that contains
+/// the name that was present in the source code along with its location.
+///
+/// \param LookupKind the name-lookup criteria used to search for the name.
///
/// \param S the scope in which name lookup occurs.
///
@@ -3181,60 +3567,64 @@ static void LookupPotentialTypoResult(Sema &SemaRef,
/// \param OPT when non-NULL, the search for visible declarations will
/// also walk the protocols in the qualified interfaces of \p OPT.
///
-/// \returns the corrected name if the typo was corrected, otherwise returns an
-/// empty \c DeclarationName. When a typo was corrected, the result structure
-/// may contain the results of name lookup for the correct name or it may be
-/// empty.
-DeclarationName Sema::CorrectTypo(LookupResult &Res, Scope *S, CXXScopeSpec *SS,
- DeclContext *MemberContext,
- bool EnteringContext,
- CorrectTypoContext CTC,
- const ObjCObjectPointerType *OPT) {
+/// \returns a \c TypoCorrection containing the corrected name if the typo
+/// along with information such as the \c NamedDecl where the corrected name
+/// was declared, and any additional \c NestedNameSpecifier needed to access
+/// it (C++ only). The \c TypoCorrection is empty if there is no correction.
+TypoCorrection Sema::CorrectTypo(const DeclarationNameInfo &TypoName,
+ Sema::LookupNameKind LookupKind,
+ Scope *S, CXXScopeSpec *SS,
+ DeclContext *MemberContext,
+ bool EnteringContext,
+ CorrectTypoContext CTC,
+ const ObjCObjectPointerType *OPT) {
if (Diags.hasFatalErrorOccurred() || !getLangOptions().SpellChecking)
- return DeclarationName();
+ return TypoCorrection();
// We only attempt to correct typos for identifiers.
- IdentifierInfo *Typo = Res.getLookupName().getAsIdentifierInfo();
+ IdentifierInfo *Typo = TypoName.getName().getAsIdentifierInfo();
if (!Typo)
- return DeclarationName();
+ return TypoCorrection();
// If the scope specifier itself was invalid, don't try to correct
// typos.
if (SS && SS->isInvalid())
- return DeclarationName();
+ return TypoCorrection();
// Never try to correct typos during template deduction or
// instantiation.
if (!ActiveTemplateInstantiations.empty())
- return DeclarationName();
+ return TypoCorrection();
- TypoCorrectionConsumer Consumer(Typo);
+ NamespaceSpecifierSet Namespaces(Context, CurContext);
+
+ TypoCorrectionConsumer Consumer(*this, Typo);
// Perform name lookup to find visible, similarly-named entities.
bool IsUnqualifiedLookup = false;
if (MemberContext) {
- LookupVisibleDecls(MemberContext, Res.getLookupKind(), Consumer);
+ LookupVisibleDecls(MemberContext, LookupKind, Consumer);
// Look in qualified interfaces.
if (OPT) {
for (ObjCObjectPointerType::qual_iterator
I = OPT->qual_begin(), E = OPT->qual_end();
I != E; ++I)
- LookupVisibleDecls(*I, Res.getLookupKind(), Consumer);
+ LookupVisibleDecls(*I, LookupKind, Consumer);
}
} else if (SS && SS->isSet()) {
DeclContext *DC = computeDeclContext(*SS, EnteringContext);
if (!DC)
- return DeclarationName();
+ return TypoCorrection();
// Provide a stop gap for files that are just seriously broken. Trying
// to correct all typos can turn into a HUGE performance penalty, causing
// some files to take minutes to get rejected by the parser.
if (TyposCorrected + UnqualifiedTyposCorrected.size() >= 20)
- return DeclarationName();
+ return TypoCorrection();
++TyposCorrected;
- LookupVisibleDecls(DC, Res.getLookupKind(), Consumer);
+ LookupVisibleDecls(DC, LookupKind, Consumer);
} else {
IsUnqualifiedLookup = true;
UnqualifiedTyposCorrectedMap::iterator Cached
@@ -3244,7 +3634,7 @@ DeclarationName Sema::CorrectTypo(LookupResult &Res, Scope *S, CXXScopeSpec *SS,
// to correct all typos can turn into a HUGE performance penalty, causing
// some files to take minutes to get rejected by the parser.
if (TyposCorrected + UnqualifiedTyposCorrected.size() >= 20)
- return DeclarationName();
+ return TypoCorrection();
// For unqualified lookup, look through all of the names that we have
// seen in this translation unit.
@@ -3268,313 +3658,225 @@ DeclarationName Sema::CorrectTypo(LookupResult &Res, Scope *S, CXXScopeSpec *SS,
} else {
// Use the cached value, unless it's a keyword. In the keyword case, we'll
// end up adding the keyword below.
- if (Cached->second.first.empty())
- return DeclarationName();
+ if (!Cached->second)
+ return TypoCorrection();
- if (!Cached->second.second)
- Consumer.FoundName(Cached->second.first);
+ if (!Cached->second.isKeyword())
+ Consumer.addCorrection(Cached->second);
}
}
- // Add context-dependent keywords.
- bool WantTypeSpecifiers = false;
- bool WantExpressionKeywords = false;
- bool WantCXXNamedCasts = false;
- bool WantRemainingKeywords = false;
- switch (CTC) {
- case CTC_Unknown:
- WantTypeSpecifiers = true;
- WantExpressionKeywords = true;
- WantCXXNamedCasts = true;
- WantRemainingKeywords = true;
-
- if (ObjCMethodDecl *Method = getCurMethodDecl())
- if (Method->getClassInterface() &&
- Method->getClassInterface()->getSuperClass())
- Consumer.addKeywordResult(Context, "super");
-
- break;
-
- case CTC_NoKeywords:
- break;
-
- case CTC_Type:
- WantTypeSpecifiers = true;
- break;
-
- case CTC_ObjCMessageReceiver:
- Consumer.addKeywordResult(Context, "super");
- // Fall through to handle message receivers like expressions.
-
- case CTC_Expression:
- if (getLangOptions().CPlusPlus)
- WantTypeSpecifiers = true;
- WantExpressionKeywords = true;
- // Fall through to get C++ named casts.
-
- case CTC_CXXCasts:
- WantCXXNamedCasts = true;
- break;
-
- case CTC_ObjCPropertyLookup:
- // FIXME: Add "isa"?
- break;
+ AddKeywordsToConsumer(*this, Consumer, S, CTC);
- case CTC_MemberLookup:
- if (getLangOptions().CPlusPlus)
- Consumer.addKeywordResult(Context, "template");
- break;
+ // If we haven't found anything, we're done.
+ if (Consumer.empty()) {
+ // If this was an unqualified lookup, note that no correction was found.
+ if (IsUnqualifiedLookup)
+ (void)UnqualifiedTyposCorrected[Typo];
- case CTC_ObjCIvarLookup:
- break;
+ return TypoCorrection();
}
- if (WantTypeSpecifiers) {
- // Add type-specifier keywords to the set of results.
- const char *CTypeSpecs[] = {
- "char", "const", "double", "enum", "float", "int", "long", "short",
- "signed", "struct", "union", "unsigned", "void", "volatile", "_Bool",
- "_Complex", "_Imaginary",
- // storage-specifiers as well
- "extern", "inline", "static", "typedef"
- };
-
- const unsigned NumCTypeSpecs = sizeof(CTypeSpecs) / sizeof(CTypeSpecs[0]);
- for (unsigned I = 0; I != NumCTypeSpecs; ++I)
- Consumer.addKeywordResult(Context, CTypeSpecs[I]);
-
- if (getLangOptions().C99)
- Consumer.addKeywordResult(Context, "restrict");
- if (getLangOptions().Bool || getLangOptions().CPlusPlus)
- Consumer.addKeywordResult(Context, "bool");
-
- if (getLangOptions().CPlusPlus) {
- Consumer.addKeywordResult(Context, "class");
- Consumer.addKeywordResult(Context, "typename");
- Consumer.addKeywordResult(Context, "wchar_t");
-
- if (getLangOptions().CPlusPlus0x) {
- Consumer.addKeywordResult(Context, "char16_t");
- Consumer.addKeywordResult(Context, "char32_t");
- Consumer.addKeywordResult(Context, "constexpr");
- Consumer.addKeywordResult(Context, "decltype");
- Consumer.addKeywordResult(Context, "thread_local");
- }
- }
+ // Make sure that the user typed at least 3 characters for each correction
+ // made. Otherwise, we don't even both looking at the results.
+ unsigned ED = Consumer.getBestEditDistance();
+ if (ED > 0 && Typo->getName().size() / ED < 3) {
+ // If this was an unqualified lookup, note that no correction was found.
+ if (IsUnqualifiedLookup)
+ (void)UnqualifiedTyposCorrected[Typo];
- if (getLangOptions().GNUMode)
- Consumer.addKeywordResult(Context, "typeof");
+ return TypoCorrection();
}
- if (WantCXXNamedCasts && getLangOptions().CPlusPlus) {
- Consumer.addKeywordResult(Context, "const_cast");
- Consumer.addKeywordResult(Context, "dynamic_cast");
- Consumer.addKeywordResult(Context, "reinterpret_cast");
- Consumer.addKeywordResult(Context, "static_cast");
+ // Build the NestedNameSpecifiers for the KnownNamespaces
+ if (getLangOptions().CPlusPlus) {
+ // Load any externally-known namespaces.
+ if (ExternalSource && !LoadedExternalKnownNamespaces) {
+ llvm::SmallVector<NamespaceDecl *, 4> ExternalKnownNamespaces;
+ LoadedExternalKnownNamespaces = true;
+ ExternalSource->ReadKnownNamespaces(ExternalKnownNamespaces);
+ for (unsigned I = 0, N = ExternalKnownNamespaces.size(); I != N; ++I)
+ KnownNamespaces[ExternalKnownNamespaces[I]] = true;
+ }
+
+ for (llvm::DenseMap<NamespaceDecl*, bool>::iterator
+ KNI = KnownNamespaces.begin(),
+ KNIEnd = KnownNamespaces.end();
+ KNI != KNIEnd; ++KNI)
+ Namespaces.AddNamespace(KNI->first);
}
- if (WantExpressionKeywords) {
- Consumer.addKeywordResult(Context, "sizeof");
- if (getLangOptions().Bool || getLangOptions().CPlusPlus) {
- Consumer.addKeywordResult(Context, "false");
- Consumer.addKeywordResult(Context, "true");
- }
+ // Weed out any names that could not be found by name lookup.
+ llvm::SmallPtrSet<IdentifierInfo*, 16> QualifiedResults;
+ LookupResult TmpRes(*this, TypoName, LookupKind);
+ TmpRes.suppressDiagnostics();
+ while (!Consumer.empty()) {
+ TypoCorrectionConsumer::distance_iterator DI = Consumer.begin();
+ unsigned ED = DI->first;
+ for (TypoCorrectionConsumer::result_iterator I = DI->second->begin(),
+ IEnd = DI->second->end();
+ I != IEnd; /* Increment in loop. */) {
+ // If the item already has been looked up or is a keyword, keep it
+ if (I->second.isResolved()) {
+ ++I;
+ continue;
+ }
- if (getLangOptions().CPlusPlus) {
- const char *CXXExprs[] = {
- "delete", "new", "operator", "throw", "typeid"
- };
- const unsigned NumCXXExprs = sizeof(CXXExprs) / sizeof(CXXExprs[0]);
- for (unsigned I = 0; I != NumCXXExprs; ++I)
- Consumer.addKeywordResult(Context, CXXExprs[I]);
+ // Perform name lookup on this name.
+ IdentifierInfo *Name = I->second.getCorrectionAsIdentifierInfo();
+ LookupPotentialTypoResult(*this, TmpRes, Name, S, SS, MemberContext,
+ EnteringContext, CTC);
- if (isa<CXXMethodDecl>(CurContext) &&
- cast<CXXMethodDecl>(CurContext)->isInstance())
- Consumer.addKeywordResult(Context, "this");
+ switch (TmpRes.getResultKind()) {
+ case LookupResult::NotFound:
+ case LookupResult::NotFoundInCurrentInstantiation:
+ QualifiedResults.insert(Name);
+ // We didn't find this name in our scope, or didn't like what we found;
+ // ignore it.
+ {
+ TypoCorrectionConsumer::result_iterator Next = I;
+ ++Next;
+ DI->second->erase(I);
+ I = Next;
+ }
+ break;
- if (getLangOptions().CPlusPlus0x) {
- Consumer.addKeywordResult(Context, "alignof");
- Consumer.addKeywordResult(Context, "nullptr");
+ case LookupResult::Ambiguous:
+ // We don't deal with ambiguities.
+ return TypoCorrection();
+
+ case LookupResult::Found:
+ case LookupResult::FoundOverloaded:
+ case LookupResult::FoundUnresolvedValue:
+ I->second.setCorrectionDecl(TmpRes.getAsSingle<NamedDecl>());
+ // FIXME: This sets the CorrectionDecl to NULL for overloaded functions.
+ // It would be nice to find the right one with overload resolution.
+ ++I;
+ break;
}
}
- }
-
- if (WantRemainingKeywords) {
- if (getCurFunctionOrMethodDecl() || getCurBlock()) {
- // Statements.
- const char *CStmts[] = {
- "do", "else", "for", "goto", "if", "return", "switch", "while" };
- const unsigned NumCStmts = sizeof(CStmts) / sizeof(CStmts[0]);
- for (unsigned I = 0; I != NumCStmts; ++I)
- Consumer.addKeywordResult(Context, CStmts[I]);
-
- if (getLangOptions().CPlusPlus) {
- Consumer.addKeywordResult(Context, "catch");
- Consumer.addKeywordResult(Context, "try");
- }
- if (S && S->getBreakParent())
- Consumer.addKeywordResult(Context, "break");
-
- if (S && S->getContinueParent())
- Consumer.addKeywordResult(Context, "continue");
-
- if (!getCurFunction()->SwitchStack.empty()) {
- Consumer.addKeywordResult(Context, "case");
- Consumer.addKeywordResult(Context, "default");
- }
- } else {
- if (getLangOptions().CPlusPlus) {
- Consumer.addKeywordResult(Context, "namespace");
- Consumer.addKeywordResult(Context, "template");
- }
+ if (DI->second->empty())
+ Consumer.erase(DI);
+ else if (!getLangOptions().CPlusPlus || QualifiedResults.empty() || !ED)
+ // If there are results in the closest possible bucket, stop
+ break;
- if (S && S->isClassScope()) {
- Consumer.addKeywordResult(Context, "explicit");
- Consumer.addKeywordResult(Context, "friend");
- Consumer.addKeywordResult(Context, "mutable");
- Consumer.addKeywordResult(Context, "private");
- Consumer.addKeywordResult(Context, "protected");
- Consumer.addKeywordResult(Context, "public");
- Consumer.addKeywordResult(Context, "virtual");
+ // Only perform the qualified lookups for C++
+ if (getLangOptions().CPlusPlus) {
+ TmpRes.suppressDiagnostics();
+ for (llvm::SmallPtrSet<IdentifierInfo*,
+ 16>::iterator QRI = QualifiedResults.begin(),
+ QRIEnd = QualifiedResults.end();
+ QRI != QRIEnd; ++QRI) {
+ for (NamespaceSpecifierSet::iterator NI = Namespaces.begin(),
+ NIEnd = Namespaces.end();
+ NI != NIEnd; ++NI) {
+ DeclContext *Ctx = NI->DeclCtx;
+ unsigned QualifiedED = ED + NI->EditDistance;
+
+ // Stop searching once the namespaces are too far away to create
+ // acceptable corrections for this identifier (since the namespaces
+ // are sorted in ascending order by edit distance)
+ if (QualifiedED > Consumer.getMaxEditDistance()) break;
+
+ TmpRes.clear();
+ TmpRes.setLookupName(*QRI);
+ if (!LookupQualifiedName(TmpRes, Ctx)) continue;
+
+ switch (TmpRes.getResultKind()) {
+ case LookupResult::Found:
+ case LookupResult::FoundOverloaded:
+ case LookupResult::FoundUnresolvedValue:
+ Consumer.addName((*QRI)->getName(), TmpRes.getAsSingle<NamedDecl>(),
+ QualifiedED, NI->NameSpecifier);
+ break;
+ case LookupResult::NotFound:
+ case LookupResult::NotFoundInCurrentInstantiation:
+ case LookupResult::Ambiguous:
+ break;
+ }
+ }
}
}
- if (getLangOptions().CPlusPlus) {
- Consumer.addKeywordResult(Context, "using");
-
- if (getLangOptions().CPlusPlus0x)
- Consumer.addKeywordResult(Context, "static_assert");
- }
+ QualifiedResults.clear();
}
- // If we haven't found anything, we're done.
- if (Consumer.empty()) {
- // If this was an unqualified lookup, note that no correction was found.
- if (IsUnqualifiedLookup)
- (void)UnqualifiedTyposCorrected[Typo];
+ // No corrections remain...
+ if (Consumer.empty()) return TypoCorrection();
- return DeclarationName();
- }
+ TypoResultsMap &BestResults = *Consumer.begin()->second;
+ ED = Consumer.begin()->first;
- // Make sure that the user typed at least 3 characters for each correction
- // made. Otherwise, we don't even both looking at the results.
-
- // We also suppress exact matches; those should be handled by a
- // different mechanism (e.g., one that introduces qualification in
- // C++).
- unsigned ED = Consumer.getBestEditDistance();
if (ED > 0 && Typo->getName().size() / ED < 3) {
// If this was an unqualified lookup, note that no correction was found.
if (IsUnqualifiedLookup)
(void)UnqualifiedTyposCorrected[Typo];
- return DeclarationName();
+ return TypoCorrection();
}
- // Weed out any names that could not be found by name lookup.
- bool LastLookupWasAccepted = false;
- for (TypoCorrectionConsumer::iterator I = Consumer.begin(),
- IEnd = Consumer.end();
- I != IEnd; /* Increment in loop. */) {
- // Keywords are always found.
- if (I->second) {
- ++I;
- continue;
- }
-
- // Perform name lookup on this name.
- IdentifierInfo *Name = &Context.Idents.get(I->getKey());
- LookupPotentialTypoResult(*this, Res, Name, S, SS, MemberContext,
- EnteringContext, CTC);
-
- switch (Res.getResultKind()) {
- case LookupResult::NotFound:
- case LookupResult::NotFoundInCurrentInstantiation:
- case LookupResult::Ambiguous:
- // We didn't find this name in our scope, or didn't like what we found;
- // ignore it.
- Res.suppressDiagnostics();
- {
- TypoCorrectionConsumer::iterator Next = I;
- ++Next;
- Consumer.erase(I);
- I = Next;
- }
- LastLookupWasAccepted = false;
- break;
-
- case LookupResult::Found:
- case LookupResult::FoundOverloaded:
- case LookupResult::FoundUnresolvedValue:
- ++I;
- LastLookupWasAccepted = true;
- break;
- }
-
- if (Res.isAmbiguous()) {
- // We don't deal with ambiguities.
- Res.suppressDiagnostics();
- Res.clear();
- return DeclarationName();
+ // If we have multiple possible corrections, eliminate the ones where we
+ // added namespace qualifiers to try to resolve the ambiguity (and to favor
+ // corrections without additional namespace qualifiers)
+ if (getLangOptions().CPlusPlus && BestResults.size() > 1) {
+ TypoCorrectionConsumer::distance_iterator DI = Consumer.begin();
+ for (TypoCorrectionConsumer::result_iterator I = DI->second->begin(),
+ IEnd = DI->second->end();
+ I != IEnd; /* Increment in loop. */) {
+ if (I->second.getCorrectionSpecifier() != NULL) {
+ TypoCorrectionConsumer::result_iterator Cur = I;
+ ++I;
+ DI->second->erase(Cur);
+ } else ++I;
}
}
// If only a single name remains, return that result.
- if (Consumer.size() == 1) {
- IdentifierInfo *Name = &Context.Idents.get(Consumer.begin()->getKey());
- if (Consumer.begin()->second) {
- Res.suppressDiagnostics();
- Res.clear();
-
- // Don't correct to a keyword that's the same as the typo; the keyword
- // wasn't actually in scope.
- if (ED == 0) {
- Res.setLookupName(Typo);
- return DeclarationName();
- }
+ if (BestResults.size() == 1) {
+ const llvm::StringMapEntry<TypoCorrection> &Correction = *(BestResults.begin());
+ const TypoCorrection &Result = Correction.second;
- } else if (!LastLookupWasAccepted) {
- // Perform name lookup on this name.
- LookupPotentialTypoResult(*this, Res, Name, S, SS, MemberContext,
- EnteringContext, CTC);
- }
+ // Don't correct to a keyword that's the same as the typo; the keyword
+ // wasn't actually in scope.
+ if (ED == 0 && Result.isKeyword()) return TypoCorrection();
// Record the correction for unqualified lookup.
if (IsUnqualifiedLookup)
- UnqualifiedTyposCorrected[Typo]
- = std::make_pair(Name->getName(), Consumer.begin()->second);
+ UnqualifiedTyposCorrected[Typo] = Result;
- return &Context.Idents.get(Consumer.begin()->getKey());
+ return Result;
}
- else if (Consumer.size() > 1 && CTC == CTC_ObjCMessageReceiver
- && Consumer["super"]) {
- // Prefix 'super' when we're completing in a message-receiver
+ else if (BestResults.size() > 1 && CTC == CTC_ObjCMessageReceiver
+ && BestResults["super"].isKeyword()) {
+ // Prefer 'super' when we're completing in a message-receiver
// context.
- Res.suppressDiagnostics();
- Res.clear();
// Don't correct to a keyword that's the same as the typo; the keyword
// wasn't actually in scope.
- if (ED == 0) {
- Res.setLookupName(Typo);
- return DeclarationName();
- }
+ if (ED == 0) return TypoCorrection();
// Record the correction for unqualified lookup.
if (IsUnqualifiedLookup)
- UnqualifiedTyposCorrected[Typo]
- = std::make_pair("super", Consumer.begin()->second);
+ UnqualifiedTyposCorrected[Typo] = BestResults["super"];
- return &Context.Idents.get("super");
+ return BestResults["super"];
}
- Res.suppressDiagnostics();
- Res.setLookupName(Typo);
- Res.clear();
- // Record the correction for unqualified lookup.
if (IsUnqualifiedLookup)
(void)UnqualifiedTyposCorrected[Typo];
- return DeclarationName();
+ return TypoCorrection();
+}
+
+std::string TypoCorrection::getAsString(const LangOptions &LO) const {
+ if (CorrectionNameSpec) {
+ std::string tmpBuffer;
+ llvm::raw_string_ostream PrefixOStream(tmpBuffer);
+ CorrectionNameSpec->print(PrefixOStream, PrintingPolicy(LO));
+ return PrefixOStream.str() + CorrectionName.getAsString();
+ }
+
+ return CorrectionName.getAsString();
}
diff --git a/contrib/llvm/tools/clang/lib/Sema/SemaObjCProperty.cpp b/contrib/llvm/tools/clang/lib/Sema/SemaObjCProperty.cpp
index 6c4469c..d826ea8 100644
--- a/contrib/llvm/tools/clang/lib/Sema/SemaObjCProperty.cpp
+++ b/contrib/llvm/tools/clang/lib/Sema/SemaObjCProperty.cpp
@@ -24,6 +24,51 @@ using namespace clang;
// Grammar actions.
//===----------------------------------------------------------------------===//
+/// Check the internal consistency of a property declaration.
+static void checkARCPropertyDecl(Sema &S, ObjCPropertyDecl *property) {
+ if (property->isInvalidDecl()) return;
+
+ ObjCPropertyDecl::PropertyAttributeKind propertyKind
+ = property->getPropertyAttributes();
+ Qualifiers::ObjCLifetime propertyLifetime
+ = property->getType().getObjCLifetime();
+
+ // Nothing to do if we don't have a lifetime.
+ if (propertyLifetime == Qualifiers::OCL_None) return;
+
+ Qualifiers::ObjCLifetime expectedLifetime;
+ unsigned selector;
+
+ // Strong properties should have either strong or no lifetime.
+ if (propertyKind & (ObjCPropertyDecl::OBJC_PR_retain |
+ ObjCPropertyDecl::OBJC_PR_strong |
+ ObjCPropertyDecl::OBJC_PR_copy)) {
+ expectedLifetime = Qualifiers::OCL_Strong;
+ selector = 0;
+ } else if (propertyKind & ObjCPropertyDecl::OBJC_PR_weak) {
+ expectedLifetime = Qualifiers::OCL_Weak;
+ selector = 1;
+ } else if (propertyKind & (ObjCPropertyDecl::OBJC_PR_assign |
+ ObjCPropertyDecl::OBJC_PR_unsafe_unretained) &&
+ property->getType()->isObjCRetainableType()) {
+ expectedLifetime = Qualifiers::OCL_ExplicitNone;
+ selector = 2;
+ } else {
+ // We have a lifetime qualifier but no dominating property
+ // attribute. That's okay.
+ return;
+ }
+
+ if (propertyLifetime == expectedLifetime) return;
+
+ property->setInvalidDecl();
+ S.Diag(property->getLocation(),
+ diag::err_arc_inconsistent_property_ownership)
+ << property->getDeclName()
+ << selector
+ << propertyLifetime;
+}
+
Decl *Sema::ActOnProperty(Scope *S, SourceLocation AtLoc,
FieldDeclarator &FD,
ObjCDeclSpec &ODS,
@@ -34,6 +79,14 @@ Decl *Sema::ActOnProperty(Scope *S, SourceLocation AtLoc,
tok::ObjCKeywordKind MethodImplKind,
DeclContext *lexicalDC) {
unsigned Attributes = ODS.getPropertyAttributes();
+ TypeSourceInfo *TSI = GetTypeForDeclarator(FD.D, S);
+ QualType T = TSI->getType();
+ if ((getLangOptions().getGCMode() != LangOptions::NonGC &&
+ T.isObjCGCWeak()) ||
+ (getLangOptions().ObjCAutoRefCount &&
+ T.getObjCLifetime() == Qualifiers::OCL_Weak))
+ Attributes |= ObjCDeclSpec::DQ_PR_weak;
+
bool isReadWrite = ((Attributes & ObjCDeclSpec::DQ_PR_readwrite) ||
// default is readwrite!
!(Attributes & ObjCDeclSpec::DQ_PR_readonly));
@@ -42,9 +95,10 @@ Decl *Sema::ActOnProperty(Scope *S, SourceLocation AtLoc,
bool isAssign = ((Attributes & ObjCDeclSpec::DQ_PR_assign) ||
(isReadWrite &&
!(Attributes & ObjCDeclSpec::DQ_PR_retain) &&
- !(Attributes & ObjCDeclSpec::DQ_PR_copy)));
-
- TypeSourceInfo *TSI = GetTypeForDeclarator(FD.D, S);
+ !(Attributes & ObjCDeclSpec::DQ_PR_strong) &&
+ !(Attributes & ObjCDeclSpec::DQ_PR_copy) &&
+ !(Attributes & ObjCDeclSpec::DQ_PR_unsafe_unretained) &&
+ !(Attributes & ObjCDeclSpec::DQ_PR_weak)));
// Proceed with constructing the ObjCPropertDecls.
ObjCContainerDecl *ClassDecl =
@@ -58,20 +112,27 @@ Decl *Sema::ActOnProperty(Scope *S, SourceLocation AtLoc,
Attributes,
isOverridingProperty, TSI,
MethodImplKind);
- if (Res)
+ if (Res) {
CheckObjCPropertyAttributes(Res, AtLoc, Attributes);
+ if (getLangOptions().ObjCAutoRefCount)
+ checkARCPropertyDecl(*this, cast<ObjCPropertyDecl>(Res));
+ }
return Res;
}
- Decl *Res = CreatePropertyDecl(S, ClassDecl, AtLoc, FD,
- GetterSel, SetterSel,
- isAssign, isReadWrite,
- Attributes, TSI, MethodImplKind);
+ ObjCPropertyDecl *Res = CreatePropertyDecl(S, ClassDecl, AtLoc, FD,
+ GetterSel, SetterSel,
+ isAssign, isReadWrite,
+ Attributes, TSI, MethodImplKind);
if (lexicalDC)
Res->setLexicalDeclContext(lexicalDC);
// Validate the attributes on the @property.
CheckObjCPropertyAttributes(Res, AtLoc, Attributes);
+
+ if (getLangOptions().ObjCAutoRefCount)
+ checkARCPropertyDecl(*this, Res);
+
return Res;
}
@@ -118,6 +179,7 @@ Sema::HandlePropertyInClassExtension(Scope *S, ObjCCategoryDecl *CDecl,
// Set setter/getter selector name. Needed later.
PDecl->setGetterName(GetterSel);
PDecl->setSetterName(SetterSel);
+ ProcessDeclAttributes(S, PDecl, FD.D);
DC->addDecl(PDecl);
// We need to look in the @interface to see if the @property was
@@ -139,10 +201,6 @@ Sema::HandlePropertyInClassExtension(Scope *S, ObjCCategoryDecl *CDecl,
CreatePropertyDecl(S, CCPrimary, AtLoc,
FD, GetterSel, SetterSel, isAssign, isReadWrite,
Attributes, T, MethodImplKind, DC);
- // Mark written attribute as having no attribute because
- // this is not a user-written property declaration in primary
- // class.
- PDecl->setPropertyAttributesAsWritten(ObjCPropertyDecl::OBJC_PR_noattr);
// A case of continuation class adding a new property in the class. This
// is not what it was meant for. However, gcc supports it and so should we.
@@ -158,6 +216,7 @@ Sema::HandlePropertyInClassExtension(Scope *S, ObjCCategoryDecl *CDecl,
if (isReadWrite && (PIkind & ObjCPropertyDecl::OBJC_PR_readonly)) {
unsigned retainCopyNonatomic =
(ObjCPropertyDecl::OBJC_PR_retain |
+ ObjCPropertyDecl::OBJC_PR_strong |
ObjCPropertyDecl::OBJC_PR_copy |
ObjCPropertyDecl::OBJC_PR_nonatomic);
if ((Attributes & retainCopyNonatomic) !=
@@ -189,6 +248,8 @@ Sema::HandlePropertyInClassExtension(Scope *S, ObjCCategoryDecl *CDecl,
PIDecl->makeitReadWriteAttribute();
if (Attributes & ObjCDeclSpec::DQ_PR_retain)
PIDecl->setPropertyAttributes(ObjCPropertyDecl::OBJC_PR_retain);
+ if (Attributes & ObjCDeclSpec::DQ_PR_strong)
+ PIDecl->setPropertyAttributes(ObjCPropertyDecl::OBJC_PR_strong);
if (Attributes & ObjCDeclSpec::DQ_PR_copy)
PIDecl->setPropertyAttributes(ObjCPropertyDecl::OBJC_PR_copy);
PIDecl->setSetterName(SetterSel);
@@ -272,6 +333,35 @@ ObjCPropertyDecl *Sema::CreatePropertyDecl(Scope *S,
PDecl->setGetterName(GetterSel);
PDecl->setSetterName(SetterSel);
+ unsigned attributesAsWritten = 0;
+ if (Attributes & ObjCDeclSpec::DQ_PR_readonly)
+ attributesAsWritten |= ObjCPropertyDecl::OBJC_PR_readonly;
+ if (Attributes & ObjCDeclSpec::DQ_PR_readwrite)
+ attributesAsWritten |= ObjCPropertyDecl::OBJC_PR_readwrite;
+ if (Attributes & ObjCDeclSpec::DQ_PR_getter)
+ attributesAsWritten |= ObjCPropertyDecl::OBJC_PR_getter;
+ if (Attributes & ObjCDeclSpec::DQ_PR_setter)
+ attributesAsWritten |= ObjCPropertyDecl::OBJC_PR_setter;
+ if (Attributes & ObjCDeclSpec::DQ_PR_assign)
+ attributesAsWritten |= ObjCPropertyDecl::OBJC_PR_assign;
+ if (Attributes & ObjCDeclSpec::DQ_PR_retain)
+ attributesAsWritten |= ObjCPropertyDecl::OBJC_PR_retain;
+ if (Attributes & ObjCDeclSpec::DQ_PR_strong)
+ attributesAsWritten |= ObjCPropertyDecl::OBJC_PR_strong;
+ if (Attributes & ObjCDeclSpec::DQ_PR_weak)
+ attributesAsWritten |= ObjCPropertyDecl::OBJC_PR_weak;
+ if (Attributes & ObjCDeclSpec::DQ_PR_copy)
+ attributesAsWritten |= ObjCPropertyDecl::OBJC_PR_copy;
+ if (Attributes & ObjCDeclSpec::DQ_PR_unsafe_unretained)
+ attributesAsWritten |= ObjCPropertyDecl::OBJC_PR_unsafe_unretained;
+ if (Attributes & ObjCDeclSpec::DQ_PR_nonatomic)
+ attributesAsWritten |= ObjCPropertyDecl::OBJC_PR_nonatomic;
+ if (Attributes & ObjCDeclSpec::DQ_PR_atomic)
+ attributesAsWritten |= ObjCPropertyDecl::OBJC_PR_atomic;
+
+ PDecl->setPropertyAttributesAsWritten(
+ (ObjCPropertyDecl::PropertyAttributeKind)attributesAsWritten);
+
if (Attributes & ObjCDeclSpec::DQ_PR_readonly)
PDecl->setPropertyAttributes(ObjCPropertyDecl::OBJC_PR_readonly);
@@ -287,9 +377,18 @@ ObjCPropertyDecl *Sema::CreatePropertyDecl(Scope *S,
if (Attributes & ObjCDeclSpec::DQ_PR_retain)
PDecl->setPropertyAttributes(ObjCPropertyDecl::OBJC_PR_retain);
+ if (Attributes & ObjCDeclSpec::DQ_PR_strong)
+ PDecl->setPropertyAttributes(ObjCPropertyDecl::OBJC_PR_strong);
+
+ if (Attributes & ObjCDeclSpec::DQ_PR_weak)
+ PDecl->setPropertyAttributes(ObjCPropertyDecl::OBJC_PR_weak);
+
if (Attributes & ObjCDeclSpec::DQ_PR_copy)
PDecl->setPropertyAttributes(ObjCPropertyDecl::OBJC_PR_copy);
+ if (Attributes & ObjCDeclSpec::DQ_PR_unsafe_unretained)
+ PDecl->setPropertyAttributes(ObjCPropertyDecl::OBJC_PR_unsafe_unretained);
+
if (isAssign)
PDecl->setPropertyAttributes(ObjCPropertyDecl::OBJC_PR_assign);
@@ -298,8 +397,12 @@ ObjCPropertyDecl *Sema::CreatePropertyDecl(Scope *S,
else if (Attributes & ObjCDeclSpec::DQ_PR_atomic)
PDecl->setPropertyAttributes(ObjCPropertyDecl::OBJC_PR_atomic);
- PDecl->setPropertyAttributesAsWritten(PDecl->getPropertyAttributes());
-
+ // 'unsafe_unretained' is alias for 'assign'.
+ if (Attributes & ObjCDeclSpec::DQ_PR_unsafe_unretained)
+ PDecl->setPropertyAttributes(ObjCPropertyDecl::OBJC_PR_assign);
+ if (isAssign)
+ PDecl->setPropertyAttributes(ObjCPropertyDecl::OBJC_PR_unsafe_unretained);
+
if (MethodImplKind == tok::objc_required)
PDecl->setPropertyImplementation(ObjCPropertyDecl::Required);
else if (MethodImplKind == tok::objc_optional)
@@ -308,6 +411,93 @@ ObjCPropertyDecl *Sema::CreatePropertyDecl(Scope *S,
return PDecl;
}
+static void checkARCPropertyImpl(Sema &S, SourceLocation propertyImplLoc,
+ ObjCPropertyDecl *property,
+ ObjCIvarDecl *ivar) {
+ if (property->isInvalidDecl() || ivar->isInvalidDecl()) return;
+
+ QualType propertyType = property->getType();
+ Qualifiers::ObjCLifetime propertyLifetime = propertyType.getObjCLifetime();
+ ObjCPropertyDecl::PropertyAttributeKind propertyKind
+ = property->getPropertyAttributes();
+
+ QualType ivarType = ivar->getType();
+ Qualifiers::ObjCLifetime ivarLifetime = ivarType.getObjCLifetime();
+
+ // Case 1: strong properties.
+ if (propertyLifetime == Qualifiers::OCL_Strong ||
+ (propertyKind & (ObjCPropertyDecl::OBJC_PR_retain |
+ ObjCPropertyDecl::OBJC_PR_strong |
+ ObjCPropertyDecl::OBJC_PR_copy))) {
+ switch (ivarLifetime) {
+ case Qualifiers::OCL_Strong:
+ // Okay.
+ return;
+
+ case Qualifiers::OCL_None:
+ case Qualifiers::OCL_Autoreleasing:
+ // These aren't valid lifetimes for object ivars; don't diagnose twice.
+ return;
+
+ case Qualifiers::OCL_ExplicitNone:
+ case Qualifiers::OCL_Weak:
+ S.Diag(propertyImplLoc, diag::err_arc_strong_property_ownership)
+ << property->getDeclName()
+ << ivar->getDeclName()
+ << ivarLifetime;
+ break;
+ }
+
+ // Case 2: weak properties.
+ } else if (propertyLifetime == Qualifiers::OCL_Weak ||
+ (propertyKind & ObjCPropertyDecl::OBJC_PR_weak)) {
+ switch (ivarLifetime) {
+ case Qualifiers::OCL_Weak:
+ // Okay.
+ return;
+
+ case Qualifiers::OCL_None:
+ case Qualifiers::OCL_Autoreleasing:
+ // These aren't valid lifetimes for object ivars; don't diagnose twice.
+ return;
+
+ case Qualifiers::OCL_ExplicitNone:
+ case Qualifiers::OCL_Strong:
+ S.Diag(propertyImplLoc, diag::error_weak_property)
+ << property->getDeclName()
+ << ivar->getDeclName();
+ break;
+ }
+
+ // Case 3: assign properties.
+ } else if ((propertyKind & ObjCPropertyDecl::OBJC_PR_assign) &&
+ propertyType->isObjCRetainableType()) {
+ switch (ivarLifetime) {
+ case Qualifiers::OCL_ExplicitNone:
+ // Okay.
+ return;
+
+ case Qualifiers::OCL_None:
+ case Qualifiers::OCL_Autoreleasing:
+ // These aren't valid lifetimes for object ivars; don't diagnose twice.
+ return;
+
+ case Qualifiers::OCL_Weak:
+ case Qualifiers::OCL_Strong:
+ S.Diag(propertyImplLoc, diag::err_arc_assign_property_ownership)
+ << property->getDeclName()
+ << ivar->getDeclName();
+ break;
+ }
+
+ // Any other property should be ignored.
+ } else {
+ return;
+ }
+
+ S.Diag(property->getLocation(), diag::note_property_declare);
+}
+
/// ActOnPropertyImplDecl - This routine performs semantic checks and
/// builds the AST node for a property implementation declaration; declared
@@ -396,9 +586,18 @@ Decl *Sema::ActOnPropertyImplDecl(Scope *S,
ObjCIvarDecl *Ivar = 0;
// Check that we have a valid, previously declared ivar for @synthesize
if (Synthesize) {
+ if (getLangOptions().ObjCAutoRefCount &&
+ !property->hasWrittenStorageAttribute() &&
+ property->getType()->isObjCRetainableType()) {
+ Diag(PropertyLoc, diag::err_arc_objc_property_default_assign_on_object);
+ Diag(property->getLocation(), diag::note_property_declare);
+ }
+
// @synthesize
if (!PropertyIvar)
PropertyIvar = PropertyId;
+ ObjCPropertyDecl::PropertyAttributeKind kind
+ = property->getPropertyAttributes();
QualType PropType = Context.getCanonicalType(property->getType());
QualType PropertyIvarType = PropType;
if (PropType->isReferenceType())
@@ -407,6 +606,45 @@ Decl *Sema::ActOnPropertyImplDecl(Scope *S,
ObjCInterfaceDecl *ClassDeclared;
Ivar = IDecl->lookupInstanceVariable(PropertyIvar, ClassDeclared);
if (!Ivar) {
+ // In ARC, give the ivar a lifetime qualifier based on its
+ // property attributes.
+ if (getLangOptions().ObjCAutoRefCount &&
+ !PropertyIvarType.getObjCLifetime()) {
+
+ // retain/copy have retaining lifetime.
+ if (kind & (ObjCPropertyDecl::OBJC_PR_retain |
+ ObjCPropertyDecl::OBJC_PR_strong |
+ ObjCPropertyDecl::OBJC_PR_copy)) {
+ Qualifiers qs;
+ qs.addObjCLifetime(Qualifiers::OCL_Strong);
+ PropertyIvarType = Context.getQualifiedType(PropertyIvarType, qs);
+ }
+ else if (kind & ObjCPropertyDecl::OBJC_PR_weak) {
+ if (!getLangOptions().ObjCRuntimeHasWeak) {
+ Diag(PropertyLoc, diag::err_arc_weak_no_runtime);
+ Diag(property->getLocation(), diag::note_property_declare);
+ }
+ Qualifiers qs;
+ qs.addObjCLifetime(Qualifiers::OCL_Weak);
+ PropertyIvarType = Context.getQualifiedType(PropertyIvarType, qs);
+ }
+ else if (kind & ObjCPropertyDecl::OBJC_PR_assign &&
+ PropertyIvarType->isObjCRetainableType()) {
+ // assume that an 'assign' property synthesizes __unsafe_unretained
+ // ivar
+ Qualifiers qs;
+ qs.addObjCLifetime(Qualifiers::OCL_ExplicitNone);
+ PropertyIvarType = Context.getQualifiedType(PropertyIvarType, qs);
+ }
+ }
+
+ if (kind & ObjCPropertyDecl::OBJC_PR_weak &&
+ !getLangOptions().ObjCAutoRefCount &&
+ getLangOptions().getGCMode() == LangOptions::NonGC) {
+ Diag(PropertyLoc, diag::error_synthesize_weak_non_arc_or_gc);
+ Diag(property->getLocation(), diag::note_property_declare);
+ }
+
Ivar = ObjCIvarDecl::Create(Context, ClassImpDecl,
PropertyLoc, PropertyLoc, PropertyIvar,
PropertyIvarType, /*Dinfo=*/0,
@@ -435,7 +673,7 @@ Decl *Sema::ActOnPropertyImplDecl(Scope *S,
if (PropertyIvarType != IvarType) {
bool compat = false;
if (isa<ObjCObjectPointerType>(PropertyIvarType)
- && isa<ObjCObjectPointerType>(IvarType))
+ && isa<ObjCObjectPointerType>(IvarType))
compat =
Context.canAssignObjCInterfaces(
PropertyIvarType->getAs<ObjCObjectPointerType>(),
@@ -470,12 +708,13 @@ Decl *Sema::ActOnPropertyImplDecl(Scope *S,
// Fall thru - see previous comment
}
// __weak is explicit. So it works on Canonical type.
- if (PropType.isObjCGCWeak() && !IvarType.isObjCGCWeak() &&
- getLangOptions().getGCMode() != LangOptions::NonGC) {
+ if ((PropType.isObjCGCWeak() && !IvarType.isObjCGCWeak() &&
+ getLangOptions().getGCMode() != LangOptions::NonGC)) {
Diag(PropertyLoc, diag::error_weak_property)
<< property->getDeclName() << Ivar->getDeclName();
// Fall thru - see previous comment
}
+ // Fall thru - see previous comment
if ((property->getType()->isObjCObjectPointerType() ||
PropType.isObjCGCStrong()) && IvarType.isObjCGCWeak() &&
getLangOptions().getGCMode() != LangOptions::NonGC) {
@@ -484,9 +723,12 @@ Decl *Sema::ActOnPropertyImplDecl(Scope *S,
// Fall thru - see previous comment
}
}
+ if (getLangOptions().ObjCAutoRefCount)
+ checkARCPropertyImpl(*this, PropertyLoc, property, Ivar);
} else if (PropertyIvar)
// @dynamic
Diag(PropertyLoc, diag::error_dynamic_property_ivar_decl);
+
assert (property && "ActOnPropertyImplDecl - property declaration missing");
ObjCPropertyImplDecl *PIDecl =
ObjCPropertyImplDecl::Create(Context, CurContext, AtLoc, PropertyLoc,
@@ -523,6 +765,12 @@ Decl *Sema::ActOnPropertyImplDecl(Scope *S,
PIDecl->setGetterCXXConstructor(ResExpr);
}
}
+ if (property->hasAttr<NSReturnsNotRetainedAttr>() &&
+ !getterMethod->hasAttr<NSReturnsNotRetainedAttr>()) {
+ Diag(getterMethod->getLocation(),
+ diag::warn_property_getter_owning_mismatch);
+ Diag(property->getLocation(), diag::note_property_declare);
+ }
}
if (ObjCMethodDecl *setterMethod = property->getSetterMethodDecl()) {
setterMethod->createImplicitParams(Context, IDecl);
@@ -632,10 +880,19 @@ Sema::DiagnosePropertyMismatch(ObjCPropertyDecl *Property,
!= (SAttr & ObjCPropertyDecl::OBJC_PR_copy))
Diag(Property->getLocation(), diag::warn_property_attribute)
<< Property->getDeclName() << "copy" << inheritedName;
- else if ((CAttr & ObjCPropertyDecl::OBJC_PR_retain)
- != (SAttr & ObjCPropertyDecl::OBJC_PR_retain))
- Diag(Property->getLocation(), diag::warn_property_attribute)
- << Property->getDeclName() << "retain" << inheritedName;
+ else {
+ unsigned CAttrRetain =
+ (CAttr &
+ (ObjCPropertyDecl::OBJC_PR_retain | ObjCPropertyDecl::OBJC_PR_strong));
+ unsigned SAttrRetain =
+ (SAttr &
+ (ObjCPropertyDecl::OBJC_PR_retain | ObjCPropertyDecl::OBJC_PR_strong));
+ bool CStrong = (CAttrRetain != 0);
+ bool SStrong = (SAttrRetain != 0);
+ if (CStrong != SStrong)
+ Diag(Property->getLocation(), diag::warn_property_attribute)
+ << Property->getDeclName() << "retain (or strong)" << inheritedName;
+ }
if ((CAttr & ObjCPropertyDecl::OBJC_PR_nonatomic)
!= (SAttr & ObjCPropertyDecl::OBJC_PR_nonatomic))
@@ -653,13 +910,16 @@ Sema::DiagnosePropertyMismatch(ObjCPropertyDecl *Property,
QualType RHSType =
Context.getCanonicalType(Property->getType());
- if (!Context.typesAreCompatible(LHSType, RHSType)) {
- // FIXME: Incorporate this test with typesAreCompatible.
- if (LHSType->isObjCQualifiedIdType() && RHSType->isObjCQualifiedIdType())
- if (Context.ObjCQualifiedIdTypesAreCompatible(LHSType, RHSType, false))
- return;
- Diag(Property->getLocation(), diag::warn_property_types_are_incompatible)
- << Property->getType() << SuperProperty->getType() << inheritedName;
+ if (!Context.propertyTypesAreCompatible(LHSType, RHSType)) {
+ // Do cases not handled in above.
+ // FIXME. For future support of covariant property types, revisit this.
+ bool IncompatibleObjC = false;
+ QualType ConvertedType;
+ if (!isObjCPointerConversion(RHSType, LHSType,
+ ConvertedType, IncompatibleObjC) ||
+ IncompatibleObjC)
+ Diag(Property->getLocation(), diag::warn_property_types_are_incompatible)
+ << Property->getType() << SuperProperty->getType() << inheritedName;
}
}
@@ -1050,7 +1310,7 @@ void Sema::DiagnoseUnimplementedProperties(Scope *S, ObjCImplDecl* IMPDecl,
// Is there a matching propery synthesize/dynamic?
if (Prop->isInvalidDecl() ||
Prop->getPropertyImplementation() == ObjCPropertyDecl::Optional ||
- PropImplMap.count(Prop))
+ PropImplMap.count(Prop) || Prop->hasAttr<UnavailableAttr>())
continue;
if (!InsMap.count(Prop->getGetterName())) {
Diag(Prop->getLocation(),
@@ -1135,6 +1395,35 @@ Sema::AtomicPropertySetterGetterRules (ObjCImplDecl* IMPDecl,
}
}
+void Sema::DiagnoseOwningPropertyGetterSynthesis(const ObjCImplementationDecl *D) {
+ if (getLangOptions().getGCMode() == LangOptions::GCOnly)
+ return;
+
+ for (ObjCImplementationDecl::propimpl_iterator
+ i = D->propimpl_begin(), e = D->propimpl_end(); i != e; ++i) {
+ ObjCPropertyImplDecl *PID = *i;
+ if (PID->getPropertyImplementation() != ObjCPropertyImplDecl::Synthesize)
+ continue;
+
+ const ObjCPropertyDecl *PD = PID->getPropertyDecl();
+ if (PD && !PD->hasAttr<NSReturnsNotRetainedAttr>() &&
+ !D->getInstanceMethod(PD->getGetterName())) {
+ ObjCMethodDecl *method = PD->getGetterMethodDecl();
+ if (!method)
+ continue;
+ ObjCMethodFamily family = method->getMethodFamily();
+ if (family == OMF_alloc || family == OMF_copy ||
+ family == OMF_mutableCopy || family == OMF_new) {
+ if (getLangOptions().ObjCAutoRefCount)
+ Diag(PID->getLocation(), diag::err_ownin_getter_rule);
+ else
+ Diag(PID->getLocation(), diag::warn_ownin_getter_rule);
+ Diag(PD->getLocation(), diag::note_property_declare);
+ }
+ }
+ }
+}
+
/// AddPropertyAttrs - Propagates attributes from a property to the
/// implicitly-declared getter or setter for that property.
static void AddPropertyAttrs(Sema &S, ObjCMethodDecl *PropertyMethod,
@@ -1214,6 +1503,9 @@ void Sema::ProcessPropertyDecl(ObjCPropertyDecl *property,
// and the real context should be the same.
if (lexicalDC)
GetterMethod->setLexicalDeclContext(lexicalDC);
+ if (property->hasAttr<NSReturnsNotRetainedAttr>())
+ GetterMethod->addAttr(
+ ::new (Context) NSReturnsNotRetainedAttr(Loc, Context));
} else
// A user declared getter will be synthesize when @synthesize of
// the property with the same name is seen in the @implementation
@@ -1245,7 +1537,7 @@ void Sema::ProcessPropertyDecl(ObjCPropertyDecl *property,
ParmVarDecl *Argument = ParmVarDecl::Create(Context, SetterMethod,
Loc, Loc,
property->getIdentifier(),
- property->getType(),
+ property->getType().getUnqualifiedType(),
/*TInfo=*/0,
SC_None,
SC_None,
@@ -1287,7 +1579,7 @@ void Sema::CheckObjCPropertyAttributes(Decl *PDecl,
SourceLocation Loc,
unsigned &Attributes) {
// FIXME: Improve the reported location.
- if (!PDecl)
+ if (!PDecl || PDecl->isInvalidDecl())
return;
ObjCPropertyDecl *PropertyDecl = cast<ObjCPropertyDecl>(PDecl);
@@ -1297,12 +1589,16 @@ void Sema::CheckObjCPropertyAttributes(Decl *PDecl,
if ((Attributes & ObjCDeclSpec::DQ_PR_readonly) &&
(Attributes & (ObjCDeclSpec::DQ_PR_readwrite |
ObjCDeclSpec::DQ_PR_assign |
+ ObjCDeclSpec::DQ_PR_unsafe_unretained |
ObjCDeclSpec::DQ_PR_copy |
- ObjCDeclSpec::DQ_PR_retain))) {
+ ObjCDeclSpec::DQ_PR_retain |
+ ObjCDeclSpec::DQ_PR_strong))) {
const char * which = (Attributes & ObjCDeclSpec::DQ_PR_readwrite) ?
"readwrite" :
(Attributes & ObjCDeclSpec::DQ_PR_assign) ?
"assign" :
+ (Attributes & ObjCDeclSpec::DQ_PR_unsafe_unretained) ?
+ "unsafe_unretained" :
(Attributes & ObjCDeclSpec::DQ_PR_copy) ?
"copy" : "retain";
@@ -1313,14 +1609,15 @@ void Sema::CheckObjCPropertyAttributes(Decl *PDecl,
}
// Check for copy or retain on non-object types.
- if ((Attributes & (ObjCDeclSpec::DQ_PR_copy | ObjCDeclSpec::DQ_PR_retain)) &&
- !PropertyTy->isObjCObjectPointerType() &&
- !PropertyTy->isBlockPointerType() &&
- !Context.isObjCNSObjectType(PropertyTy) &&
+ if ((Attributes & (ObjCDeclSpec::DQ_PR_weak | ObjCDeclSpec::DQ_PR_copy |
+ ObjCDeclSpec::DQ_PR_retain | ObjCDeclSpec::DQ_PR_strong)) &&
+ !PropertyTy->isObjCRetainableType() &&
!PropertyDecl->getAttr<ObjCNSObjectAttr>()) {
Diag(Loc, diag::err_objc_property_requires_object)
- << (Attributes & ObjCDeclSpec::DQ_PR_copy ? "copy" : "retain");
- Attributes &= ~(ObjCDeclSpec::DQ_PR_copy | ObjCDeclSpec::DQ_PR_retain);
+ << (Attributes & ObjCDeclSpec::DQ_PR_weak ? "weak" :
+ Attributes & ObjCDeclSpec::DQ_PR_copy ? "copy" : "retain (or strong)");
+ Attributes &= ~(ObjCDeclSpec::DQ_PR_weak | ObjCDeclSpec::DQ_PR_copy |
+ ObjCDeclSpec::DQ_PR_retain | ObjCDeclSpec::DQ_PR_strong);
}
// Check for more than one of { assign, copy, retain }.
@@ -1335,18 +1632,75 @@ void Sema::CheckObjCPropertyAttributes(Decl *PDecl,
<< "assign" << "retain";
Attributes &= ~ObjCDeclSpec::DQ_PR_retain;
}
+ if (Attributes & ObjCDeclSpec::DQ_PR_strong) {
+ Diag(Loc, diag::err_objc_property_attr_mutually_exclusive)
+ << "assign" << "strong";
+ Attributes &= ~ObjCDeclSpec::DQ_PR_strong;
+ }
+ if (getLangOptions().ObjCAutoRefCount &&
+ (Attributes & ObjCDeclSpec::DQ_PR_weak)) {
+ Diag(Loc, diag::err_objc_property_attr_mutually_exclusive)
+ << "assign" << "weak";
+ Attributes &= ~ObjCDeclSpec::DQ_PR_weak;
+ }
+ } else if (Attributes & ObjCDeclSpec::DQ_PR_unsafe_unretained) {
+ if (Attributes & ObjCDeclSpec::DQ_PR_copy) {
+ Diag(Loc, diag::err_objc_property_attr_mutually_exclusive)
+ << "unsafe_unretained" << "copy";
+ Attributes &= ~ObjCDeclSpec::DQ_PR_copy;
+ }
+ if (Attributes & ObjCDeclSpec::DQ_PR_retain) {
+ Diag(Loc, diag::err_objc_property_attr_mutually_exclusive)
+ << "unsafe_unretained" << "retain";
+ Attributes &= ~ObjCDeclSpec::DQ_PR_retain;
+ }
+ if (Attributes & ObjCDeclSpec::DQ_PR_strong) {
+ Diag(Loc, diag::err_objc_property_attr_mutually_exclusive)
+ << "unsafe_unretained" << "strong";
+ Attributes &= ~ObjCDeclSpec::DQ_PR_strong;
+ }
+ if (getLangOptions().ObjCAutoRefCount &&
+ (Attributes & ObjCDeclSpec::DQ_PR_weak)) {
+ Diag(Loc, diag::err_objc_property_attr_mutually_exclusive)
+ << "unsafe_unretained" << "weak";
+ Attributes &= ~ObjCDeclSpec::DQ_PR_weak;
+ }
} else if (Attributes & ObjCDeclSpec::DQ_PR_copy) {
if (Attributes & ObjCDeclSpec::DQ_PR_retain) {
Diag(Loc, diag::err_objc_property_attr_mutually_exclusive)
<< "copy" << "retain";
Attributes &= ~ObjCDeclSpec::DQ_PR_retain;
}
+ if (Attributes & ObjCDeclSpec::DQ_PR_strong) {
+ Diag(Loc, diag::err_objc_property_attr_mutually_exclusive)
+ << "copy" << "strong";
+ Attributes &= ~ObjCDeclSpec::DQ_PR_strong;
+ }
+ if (Attributes & ObjCDeclSpec::DQ_PR_weak) {
+ Diag(Loc, diag::err_objc_property_attr_mutually_exclusive)
+ << "copy" << "weak";
+ Attributes &= ~ObjCDeclSpec::DQ_PR_weak;
+ }
+ }
+ else if ((Attributes & ObjCDeclSpec::DQ_PR_retain) &&
+ (Attributes & ObjCDeclSpec::DQ_PR_weak)) {
+ Diag(Loc, diag::err_objc_property_attr_mutually_exclusive)
+ << "retain" << "weak";
+ Attributes &= ~ObjCDeclSpec::DQ_PR_weak;
+ }
+ else if ((Attributes & ObjCDeclSpec::DQ_PR_strong) &&
+ (Attributes & ObjCDeclSpec::DQ_PR_weak)) {
+ Diag(Loc, diag::err_objc_property_attr_mutually_exclusive)
+ << "strong" << "weak";
+ Attributes &= ~ObjCDeclSpec::DQ_PR_weak;
}
// Warn if user supplied no assignment attribute, property is
// readwrite, and this is an object type.
if (!(Attributes & (ObjCDeclSpec::DQ_PR_assign | ObjCDeclSpec::DQ_PR_copy |
- ObjCDeclSpec::DQ_PR_retain)) &&
+ ObjCDeclSpec::DQ_PR_unsafe_unretained |
+ ObjCDeclSpec::DQ_PR_retain | ObjCDeclSpec::DQ_PR_strong |
+ ObjCDeclSpec::DQ_PR_weak)) &&
!(Attributes & ObjCDeclSpec::DQ_PR_readonly) &&
PropertyTy->isObjCObjectPointerType()) {
// Skip this warning in gc-only mode.
diff --git a/contrib/llvm/tools/clang/lib/Sema/SemaOverload.cpp b/contrib/llvm/tools/clang/lib/Sema/SemaOverload.cpp
index 4bba6f8..437b2b5 100644
--- a/contrib/llvm/tools/clang/lib/Sema/SemaOverload.cpp
+++ b/contrib/llvm/tools/clang/lib/Sema/SemaOverload.cpp
@@ -38,8 +38,10 @@ using namespace sema;
/// function.
static ExprResult
CreateFunctionRefExpr(Sema &S, FunctionDecl *Fn,
- SourceLocation Loc = SourceLocation()) {
- ExprResult E = S.Owned(new (S.Context) DeclRefExpr(Fn, Fn->getType(), VK_LValue, Loc));
+ SourceLocation Loc = SourceLocation(),
+ const DeclarationNameLoc &LocInfo = DeclarationNameLoc()){
+ ExprResult E = S.Owned(new (S.Context) DeclRefExpr(Fn, Fn->getType(),
+ VK_LValue, Loc, LocInfo));
E = S.DefaultFunctionArrayConversion(E.take());
if (E.isInvalid())
return ExprError();
@@ -49,7 +51,8 @@ CreateFunctionRefExpr(Sema &S, FunctionDecl *Fn,
static bool IsStandardConversion(Sema &S, Expr* From, QualType ToType,
bool InOverloadResolution,
StandardConversionSequence &SCS,
- bool CStyle);
+ bool CStyle,
+ bool AllowObjCWritebackConversion);
static bool IsTransparentUnionStandardConversion(Sema &S, Expr* From,
QualType &ToType,
@@ -106,6 +109,7 @@ GetConversionCategory(ImplicitConversionKind Kind) {
ICC_Conversion,
ICC_Conversion,
ICC_Conversion,
+ ICC_Conversion,
ICC_Conversion
};
return Category[(int)Kind];
@@ -138,7 +142,8 @@ ImplicitConversionRank GetConversionRank(ImplicitConversionKind Kind) {
ICR_Conversion,
ICR_Complex_Real_Conversion,
ICR_Conversion,
- ICR_Conversion
+ ICR_Conversion,
+ ICR_Writeback_Conversion
};
return Rank[(int)Kind];
}
@@ -170,6 +175,7 @@ const char* GetImplicitConversionName(ImplicitConversionKind Kind) {
"Complex-real conversion",
"Block Pointer conversion",
"Transparent Union Conversion"
+ "Writeback conversion"
};
return Name[Kind];
}
@@ -181,12 +187,14 @@ void StandardConversionSequence::setAsIdentityConversion() {
Second = ICK_Identity;
Third = ICK_Identity;
DeprecatedStringLiteralToCharPtr = false;
+ QualificationIncludesObjCLifetime = false;
ReferenceBinding = false;
DirectBinding = false;
IsLvalueReference = true;
BindsToFunctionLvalue = false;
BindsToRvalue = false;
BindsImplicitObjectArgumentWithoutRefQualifier = false;
+ ObjCLifetimeConversionBinding = false;
CopyConstructor = 0;
}
@@ -730,6 +738,15 @@ bool Sema::IsOverload(FunctionDecl *New, FunctionDecl *Old,
return false;
}
+/// \brief Checks availability of the function depending on the current
+/// function context. Inside an unavailable function, unavailability is ignored.
+///
+/// \returns true if \arg FD is unavailable and current context is inside
+/// an available function, false otherwise.
+bool Sema::isFunctionConsideredUnavailable(FunctionDecl *FD) {
+ return FD->isUnavailable() && !cast<Decl>(CurContext)->isUnavailable();
+}
+
/// TryImplicitConversion - Attempt to perform an implicit conversion
/// from the given expression (Expr) to the given type (ToType). This
/// function returns an implicit conversion sequence that can be used
@@ -753,15 +770,20 @@ bool Sema::IsOverload(FunctionDecl *New, FunctionDecl *Old,
/// not permitted.
/// If @p AllowExplicit, then explicit user-defined conversions are
/// permitted.
+///
+/// \param AllowObjCWritebackConversion Whether we allow the Objective-C
+/// writeback conversion, which allows __autoreleasing id* parameters to
+/// be initialized with __strong id* or __weak id* arguments.
static ImplicitConversionSequence
TryImplicitConversion(Sema &S, Expr *From, QualType ToType,
bool SuppressUserConversions,
bool AllowExplicit,
bool InOverloadResolution,
- bool CStyle) {
+ bool CStyle,
+ bool AllowObjCWritebackConversion) {
ImplicitConversionSequence ICS;
if (IsStandardConversion(S, From, ToType, InOverloadResolution,
- ICS.Standard, CStyle)) {
+ ICS.Standard, CStyle, AllowObjCWritebackConversion)){
ICS.setStandard();
return ICS;
}
@@ -867,24 +889,17 @@ TryImplicitConversion(Sema &S, Expr *From, QualType ToType,
return ICS;
}
-bool Sema::TryImplicitConversion(InitializationSequence &Sequence,
- const InitializedEntity &Entity,
- Expr *Initializer,
- bool SuppressUserConversions,
- bool AllowExplicitConversions,
- bool InOverloadResolution,
- bool CStyle) {
- ImplicitConversionSequence ICS
- = clang::TryImplicitConversion(*this, Initializer, Entity.getType(),
- SuppressUserConversions,
- AllowExplicitConversions,
- InOverloadResolution,
- CStyle);
- if (ICS.isBad()) return true;
-
- // Perform the actual conversion.
- Sequence.AddConversionSequenceStep(ICS, Entity.getType());
- return false;
+ImplicitConversionSequence
+Sema::TryImplicitConversion(Expr *From, QualType ToType,
+ bool SuppressUserConversions,
+ bool AllowExplicit,
+ bool InOverloadResolution,
+ bool CStyle,
+ bool AllowObjCWritebackConversion) {
+ return clang::TryImplicitConversion(*this, From, ToType,
+ SuppressUserConversions, AllowExplicit,
+ InOverloadResolution, CStyle,
+ AllowObjCWritebackConversion);
}
/// PerformImplicitConversion - Perform an implicit conversion of the
@@ -903,18 +918,25 @@ ExprResult
Sema::PerformImplicitConversion(Expr *From, QualType ToType,
AssignmentAction Action, bool AllowExplicit,
ImplicitConversionSequence& ICS) {
+ // Objective-C ARC: Determine whether we will allow the writeback conversion.
+ bool AllowObjCWritebackConversion
+ = getLangOptions().ObjCAutoRefCount &&
+ (Action == AA_Passing || Action == AA_Sending);
+
+
ICS = clang::TryImplicitConversion(*this, From, ToType,
/*SuppressUserConversions=*/false,
AllowExplicit,
/*InOverloadResolution=*/false,
- /*CStyle=*/false);
+ /*CStyle=*/false,
+ AllowObjCWritebackConversion);
return PerformImplicitConversion(From, ToType, ICS, Action);
}
/// \brief Determine whether the conversion from FromType to ToType is a valid
/// conversion that strips "noreturn" off the nested function type.
-static bool IsNoReturnConversion(ASTContext &Context, QualType FromType,
- QualType ToType, QualType &ResultTy) {
+bool Sema::IsNoReturnConversion(QualType FromType, QualType ToType,
+ QualType &ResultTy) {
if (Context.hasSameUnqualifiedType(FromType, ToType))
return false;
@@ -1016,7 +1038,8 @@ static bool IsVectorConversion(ASTContext &Context, QualType FromType,
static bool IsStandardConversion(Sema &S, Expr* From, QualType ToType,
bool InOverloadResolution,
StandardConversionSequence &SCS,
- bool CStyle) {
+ bool CStyle,
+ bool AllowObjCWritebackConversion) {
QualType FromType = From->getType();
// Standard conversions (C++ [conv])
@@ -1054,7 +1077,7 @@ static bool IsStandardConversion(Sema &S, Expr* From, QualType ToType,
S.ExtractUnqualifiedFunctionType(ToType), FromType)) {
QualType resultTy;
// if the function type matches except for [[noreturn]], it's ok
- if (!IsNoReturnConversion(S.Context, FromType,
+ if (!S.IsNoReturnConversion(FromType,
S.ExtractUnqualifiedFunctionType(ToType), resultTy))
// otherwise, only a boolean conversion is standard
if (!ToType->isBooleanType())
@@ -1123,6 +1146,7 @@ static bool IsStandardConversion(Sema &S, Expr* From, QualType ToType,
// conversion (4.4). (C++ 4.2p2)
SCS.Second = ICK_Identity;
SCS.Third = ICK_Qualification;
+ SCS.QualificationIncludesObjCLifetime = false;
SCS.setAllToTypes(FromType);
return true;
}
@@ -1199,7 +1223,10 @@ static bool IsStandardConversion(Sema &S, Expr* From, QualType ToType,
SCS.Second = ICK_Floating_Integral;
FromType = ToType.getUnqualifiedType();
} else if (S.IsBlockPointerConversion(FromType, ToType, FromType)) {
- SCS.Second = ICK_Block_Pointer_Conversion;
+ SCS.Second = ICK_Block_Pointer_Conversion;
+ } else if (AllowObjCWritebackConversion &&
+ S.isObjCWritebackConversion(FromType, ToType, FromType)) {
+ SCS.Second = ICK_Writeback_Conversion;
} else if (S.IsPointerConversion(From, FromType, ToType, InOverloadResolution,
FromType, IncompatibleObjC)) {
// Pointer conversions (C++ 4.10).
@@ -1218,7 +1245,7 @@ static bool IsStandardConversion(Sema &S, Expr* From, QualType ToType,
// Compatible conversions (Clang extension for C function overloading)
SCS.Second = ICK_Compatible_Conversion;
FromType = ToType.getUnqualifiedType();
- } else if (IsNoReturnConversion(S.Context, FromType, ToType, FromType)) {
+ } else if (S.IsNoReturnConversion(FromType, ToType, FromType)) {
// Treat a conversion that strips "noreturn" as an identity conversion.
SCS.Second = ICK_NoReturn_Adjustment;
} else if (IsTransparentUnionStandardConversion(S, From, ToType,
@@ -1235,8 +1262,11 @@ static bool IsStandardConversion(Sema &S, Expr* From, QualType ToType,
QualType CanonFrom;
QualType CanonTo;
// The third conversion can be a qualification conversion (C++ 4p1).
- if (S.IsQualificationConversion(FromType, ToType, CStyle)) {
+ bool ObjCLifetimeConversion;
+ if (S.IsQualificationConversion(FromType, ToType, CStyle,
+ ObjCLifetimeConversion)) {
SCS.Third = ICK_Qualification;
+ SCS.QualificationIncludesObjCLifetime = ObjCLifetimeConversion;
FromType = ToType;
CanonFrom = S.Context.getCanonicalType(FromType);
CanonTo = S.Context.getCanonicalType(ToType);
@@ -1253,7 +1283,8 @@ static bool IsStandardConversion(Sema &S, Expr* From, QualType ToType,
if (CanonFrom.getLocalUnqualifiedType()
== CanonTo.getLocalUnqualifiedType() &&
(CanonFrom.getLocalCVRQualifiers() != CanonTo.getLocalCVRQualifiers()
- || CanonFrom.getObjCGCAttr() != CanonTo.getObjCGCAttr())) {
+ || CanonFrom.getObjCGCAttr() != CanonTo.getObjCGCAttr()
+ || CanonFrom.getObjCLifetime() != CanonTo.getObjCLifetime())) {
FromType = ToType;
CanonFrom = CanonTo;
}
@@ -1284,7 +1315,8 @@ IsTransparentUnionStandardConversion(Sema &S, Expr* From,
for (RecordDecl::field_iterator it = UD->field_begin(),
itend = UD->field_end();
it != itend; ++it) {
- if (IsStandardConversion(S, From, it->getType(), InOverloadResolution, SCS, CStyle)) {
+ if (IsStandardConversion(S, From, it->getType(), InOverloadResolution, SCS,
+ CStyle, /*ObjCWritebackConversion=*/false)) {
ToType = it->getType();
return true;
}
@@ -1479,16 +1511,18 @@ bool Sema::IsComplexPromotion(QualType FromType, QualType ToType) {
/// same type qualifiers as FromPtr has on its pointee type. ToType,
/// if non-empty, will be a pointer to ToType that may or may not have
/// the right set of qualifiers on its pointee.
+///
static QualType
BuildSimilarlyQualifiedPointerType(const Type *FromPtr,
QualType ToPointee, QualType ToType,
- ASTContext &Context) {
+ ASTContext &Context,
+ bool StripObjCLifetime = false) {
assert((FromPtr->getTypeClass() == Type::Pointer ||
FromPtr->getTypeClass() == Type::ObjCObjectPointer) &&
"Invalid similarly-qualified pointer type");
- /// \brief Conversions to 'id' subsume cv-qualifier conversions.
- if (ToType->isObjCIdType() || ToType->isObjCQualifiedIdType())
+ /// Conversions to 'id' subsume cv-qualifier conversions.
+ if (ToType->isObjCIdType() || ToType->isObjCQualifiedIdType())
return ToType.getUnqualifiedType();
QualType CanonFromPointee
@@ -1496,6 +1530,9 @@ BuildSimilarlyQualifiedPointerType(const Type *FromPtr,
QualType CanonToPointee = Context.getCanonicalType(ToPointee);
Qualifiers Quals = CanonFromPointee.getQualifiers();
+ if (StripObjCLifetime)
+ Quals.removeObjCLifetime();
+
// Exact qualifier match -> return the pointer type we're converting to.
if (CanonToPointee.getLocalQualifiers() == Quals) {
// ToType is exactly what we need. Return it.
@@ -1599,7 +1636,8 @@ bool Sema::IsPointerConversion(Expr *From, QualType FromType, QualType ToType,
// Beyond this point, both types need to be pointers
// , including objective-c pointers.
QualType ToPointeeType = ToTypePtr->getPointeeType();
- if (FromType->isObjCObjectPointerType() && ToPointeeType->isVoidType()) {
+ if (FromType->isObjCObjectPointerType() && ToPointeeType->isVoidType() &&
+ !getLangOptions().ObjCAutoRefCount) {
ConvertedType = BuildSimilarlyQualifiedPointerType(
FromType->getAs<ObjCObjectPointerType>(),
ToPointeeType,
@@ -1624,7 +1662,8 @@ bool Sema::IsPointerConversion(Expr *From, QualType FromType, QualType ToType,
ToPointeeType->isVoidType()) {
ConvertedType = BuildSimilarlyQualifiedPointerType(FromTypePtr,
ToPointeeType,
- ToType, Context);
+ ToType, Context,
+ /*StripObjCLifetime=*/true);
return true;
}
@@ -1814,6 +1853,7 @@ bool Sema::isObjCPointerConversion(QualType FromType, QualType ToType,
ToPointeeType->getAs<ObjCObjectPointerType>() &&
isObjCPointerConversion(FromPointeeType, ToPointeeType, ConvertedType,
IncompatibleObjC)) {
+
ConvertedType = Context.getPointerType(ConvertedType);
ConvertedType = AdoptQualifiers(Context, ConvertedType, FromQualifiers);
return true;
@@ -1885,6 +1925,73 @@ bool Sema::isObjCPointerConversion(QualType FromType, QualType ToType,
return false;
}
+/// \brief Determine whether this is an Objective-C writeback conversion,
+/// used for parameter passing when performing automatic reference counting.
+///
+/// \param FromType The type we're converting form.
+///
+/// \param ToType The type we're converting to.
+///
+/// \param ConvertedType The type that will be produced after applying
+/// this conversion.
+bool Sema::isObjCWritebackConversion(QualType FromType, QualType ToType,
+ QualType &ConvertedType) {
+ if (!getLangOptions().ObjCAutoRefCount ||
+ Context.hasSameUnqualifiedType(FromType, ToType))
+ return false;
+
+ // Parameter must be a pointer to __autoreleasing (with no other qualifiers).
+ QualType ToPointee;
+ if (const PointerType *ToPointer = ToType->getAs<PointerType>())
+ ToPointee = ToPointer->getPointeeType();
+ else
+ return false;
+
+ Qualifiers ToQuals = ToPointee.getQualifiers();
+ if (!ToPointee->isObjCLifetimeType() ||
+ ToQuals.getObjCLifetime() != Qualifiers::OCL_Autoreleasing ||
+ !ToQuals.withoutObjCGLifetime().empty())
+ return false;
+
+ // Argument must be a pointer to __strong to __weak.
+ QualType FromPointee;
+ if (const PointerType *FromPointer = FromType->getAs<PointerType>())
+ FromPointee = FromPointer->getPointeeType();
+ else
+ return false;
+
+ Qualifiers FromQuals = FromPointee.getQualifiers();
+ if (!FromPointee->isObjCLifetimeType() ||
+ (FromQuals.getObjCLifetime() != Qualifiers::OCL_Strong &&
+ FromQuals.getObjCLifetime() != Qualifiers::OCL_Weak))
+ return false;
+
+ // Make sure that we have compatible qualifiers.
+ FromQuals.setObjCLifetime(Qualifiers::OCL_Autoreleasing);
+ if (!ToQuals.compatiblyIncludes(FromQuals))
+ return false;
+
+ // Remove qualifiers from the pointee type we're converting from; they
+ // aren't used in the compatibility check belong, and we'll be adding back
+ // qualifiers (with __autoreleasing) if the compatibility check succeeds.
+ FromPointee = FromPointee.getUnqualifiedType();
+
+ // The unqualified form of the pointee types must be compatible.
+ ToPointee = ToPointee.getUnqualifiedType();
+ bool IncompatibleObjC;
+ if (Context.typesAreCompatible(FromPointee, ToPointee))
+ FromPointee = ToPointee;
+ else if (!isObjCPointerConversion(FromPointee, ToPointee, FromPointee,
+ IncompatibleObjC))
+ return false;
+
+ /// \brief Construct the type we're converting to, which is a pointer to
+ /// __autoreleasing pointee.
+ FromPointee = Context.getQualifiedType(FromPointee, FromQuals);
+ ConvertedType = Context.getPointerType(FromPointee);
+ return true;
+}
+
bool Sema::IsBlockPointerConversion(QualType FromType, QualType ToType,
QualType& ConvertedType) {
QualType ToPointeeType;
@@ -2178,12 +2285,17 @@ bool Sema::CheckMemberPointerConversion(Expr *From, QualType ToType,
/// IsQualificationConversion - Determines whether the conversion from
/// an rvalue of type FromType to ToType is a qualification conversion
/// (C++ 4.4).
+///
+/// \param ObjCLifetimeConversion Output parameter that will be set to indicate
+/// when the qualification conversion involves a change in the Objective-C
+/// object lifetime.
bool
Sema::IsQualificationConversion(QualType FromType, QualType ToType,
- bool CStyle) {
+ bool CStyle, bool &ObjCLifetimeConversion) {
FromType = Context.getCanonicalType(FromType);
ToType = Context.getCanonicalType(ToType);
-
+ ObjCLifetimeConversion = false;
+
// If FromType and ToType are the same type, this is not a
// qualification conversion.
if (FromType.getUnqualifiedType() == ToType.getUnqualifiedType())
@@ -2206,6 +2318,21 @@ Sema::IsQualificationConversion(QualType FromType, QualType ToType,
Qualifiers FromQuals = FromType.getQualifiers();
Qualifiers ToQuals = ToType.getQualifiers();
+ // Objective-C ARC:
+ // Check Objective-C lifetime conversions.
+ if (FromQuals.getObjCLifetime() != ToQuals.getObjCLifetime() &&
+ UnwrappedAnyPointer) {
+ if (ToQuals.compatiblyIncludesObjCLifetime(FromQuals)) {
+ ObjCLifetimeConversion = true;
+ FromQuals.removeObjCLifetime();
+ ToQuals.removeObjCLifetime();
+ } else {
+ // Qualification conversions cannot cast between different
+ // Objective-C lifetime qualifiers.
+ return false;
+ }
+ }
+
// Allow addition/removal of GC attributes but not changing GC attributes.
if (FromQuals.getObjCGCAttr() != ToQuals.getObjCGCAttr() &&
(!FromQuals.hasObjCGCAttr() || !ToQuals.hasObjCGCAttr())) {
@@ -2713,6 +2840,15 @@ CompareStandardConversionSequences(Sema &S,
QualType UnqualT1 = S.Context.getUnqualifiedArrayType(T1, T1Quals);
QualType UnqualT2 = S.Context.getUnqualifiedArrayType(T2, T2Quals);
if (UnqualT1 == UnqualT2) {
+ // Objective-C++ ARC: If the references refer to objects with different
+ // lifetimes, prefer bindings that don't change lifetime.
+ if (SCS1.ObjCLifetimeConversionBinding !=
+ SCS2.ObjCLifetimeConversionBinding) {
+ return SCS1.ObjCLifetimeConversionBinding
+ ? ImplicitConversionSequence::Worse
+ : ImplicitConversionSequence::Better;
+ }
+
// If the type is an array type, promote the element qualifiers to the
// type for comparison.
if (isa<ArrayType>(T1) && T1Quals)
@@ -2722,7 +2858,7 @@ CompareStandardConversionSequences(Sema &S,
if (T2.isMoreQualifiedThan(T1))
return ImplicitConversionSequence::Better;
else if (T1.isMoreQualifiedThan(T2))
- return ImplicitConversionSequence::Worse;
+ return ImplicitConversionSequence::Worse;
}
}
@@ -2770,6 +2906,17 @@ CompareQualificationConversions(Sema &S,
ImplicitConversionSequence::CompareKind Result
= ImplicitConversionSequence::Indistinguishable;
+
+ // Objective-C++ ARC:
+ // Prefer qualification conversions not involving a change in lifetime
+ // to qualification conversions that do not change lifetime.
+ if (SCS1.QualificationIncludesObjCLifetime !=
+ SCS2.QualificationIncludesObjCLifetime) {
+ Result = SCS1.QualificationIncludesObjCLifetime
+ ? ImplicitConversionSequence::Worse
+ : ImplicitConversionSequence::Better;
+ }
+
while (S.Context.UnwrapSimilarPointerTypes(T1, T2)) {
// Within each iteration of the loop, we check the qualifiers to
// determine if this still looks like a qualification
@@ -3039,7 +3186,8 @@ Sema::ReferenceCompareResult
Sema::CompareReferenceRelationship(SourceLocation Loc,
QualType OrigT1, QualType OrigT2,
bool &DerivedToBase,
- bool &ObjCConversion) {
+ bool &ObjCConversion,
+ bool &ObjCLifetimeConversion) {
assert(!OrigT1->isReferenceType() &&
"T1 must be the pointee type of the reference type");
assert(!OrigT2->isReferenceType() && "T2 cannot be a reference type");
@@ -3056,6 +3204,7 @@ Sema::CompareReferenceRelationship(SourceLocation Loc,
// T1 is a base class of T2.
DerivedToBase = false;
ObjCConversion = false;
+ ObjCLifetimeConversion = false;
if (UnqualT1 == UnqualT2) {
// Nothing to do.
} else if (!RequireCompleteType(Loc, OrigT2, PDiag()) &&
@@ -3090,9 +3239,16 @@ Sema::CompareReferenceRelationship(SourceLocation Loc,
// qualifiers when performing these computations, so that e.g., an int in
// address space 1 is not reference-compatible with an int in address
// space 2.
+ if (T1Quals.getObjCLifetime() != T2Quals.getObjCLifetime() &&
+ T1Quals.compatiblyIncludesObjCLifetime(T2Quals)) {
+ T1Quals.removeObjCLifetime();
+ T2Quals.removeObjCLifetime();
+ ObjCLifetimeConversion = true;
+ }
+
if (T1Quals == T2Quals)
return Ref_Compatible;
- else if (T1.isMoreQualifiedThan(T2))
+ else if (T1Quals.compatiblyIncludes(T2Quals))
return Ref_Compatible_With_Added_Qualification;
else
return Ref_Related;
@@ -3135,13 +3291,14 @@ FindConversionForRefInit(Sema &S, ImplicitConversionSequence &ICS,
if (AllowRvalues) {
bool DerivedToBase = false;
bool ObjCConversion = false;
+ bool ObjCLifetimeConversion = false;
if (!ConvTemplate &&
S.CompareReferenceRelationship(
DeclLoc,
Conv->getConversionType().getNonReferenceType()
.getUnqualifiedType(),
DeclType.getNonReferenceType().getUnqualifiedType(),
- DerivedToBase, ObjCConversion) ==
+ DerivedToBase, ObjCConversion, ObjCLifetimeConversion) ==
Sema::Ref_Incompatible)
continue;
} else {
@@ -3242,10 +3399,11 @@ TryReferenceInit(Sema &S, Expr *&Init, QualType DeclType,
bool isRValRef = DeclType->isRValueReferenceType();
bool DerivedToBase = false;
bool ObjCConversion = false;
+ bool ObjCLifetimeConversion = false;
Expr::Classification InitCategory = Init->Classify(S.Context);
Sema::ReferenceCompareResult RefRelationship
= S.CompareReferenceRelationship(DeclLoc, T1, T2, DerivedToBase,
- ObjCConversion);
+ ObjCConversion, ObjCLifetimeConversion);
// C++0x [dcl.init.ref]p5:
@@ -3283,6 +3441,7 @@ TryReferenceInit(Sema &S, Expr *&Init, QualType DeclType,
ICS.Standard.BindsToFunctionLvalue = T2->isFunctionType();
ICS.Standard.BindsToRvalue = false;
ICS.Standard.BindsImplicitObjectArgumentWithoutRefQualifier = false;
+ ICS.Standard.ObjCLifetimeConversionBinding = ObjCLifetimeConversion;
ICS.Standard.CopyConstructor = 0;
// Nothing more to do: the inaccessibility/ambiguity check for
@@ -3328,7 +3487,7 @@ TryReferenceInit(Sema &S, Expr *&Init, QualType DeclType,
// -- If the initializer expression
//
// -- is an xvalue, class prvalue, array prvalue or function
- // lvalue and "cv1T1" is reference-compatible with "cv2 T2", or
+ // lvalue and "cv1 T1" is reference-compatible with "cv2 T2", or
if (RefRelationship >= Sema::Ref_Compatible_With_Added_Qualification &&
(InitCategory.isXValue() ||
(InitCategory.isPRValue() && (T2->isRecordType() || T2->isArrayType())) ||
@@ -3356,6 +3515,7 @@ TryReferenceInit(Sema &S, Expr *&Init, QualType DeclType,
ICS.Standard.BindsToFunctionLvalue = T2->isFunctionType();
ICS.Standard.BindsToRvalue = InitCategory.isRValue();
ICS.Standard.BindsImplicitObjectArgumentWithoutRefQualifier = false;
+ ICS.Standard.ObjCLifetimeConversionBinding = ObjCLifetimeConversion;
ICS.Standard.CopyConstructor = 0;
return ICS;
}
@@ -3398,7 +3558,17 @@ TryReferenceInit(Sema &S, Expr *&Init, QualType DeclType,
// we would be reference-compatible or reference-compatible with
// added qualification. But that wasn't the case, so the reference
// initialization fails.
- return ICS;
+ //
+ // Note that we only want to check address spaces and cvr-qualifiers here.
+ // ObjC GC and lifetime qualifiers aren't important.
+ Qualifiers T1Quals = T1.getQualifiers();
+ Qualifiers T2Quals = T2.getQualifiers();
+ T1Quals.removeObjCGCAttr();
+ T1Quals.removeObjCLifetime();
+ T2Quals.removeObjCGCAttr();
+ T2Quals.removeObjCLifetime();
+ if (!T1Quals.compatiblyIncludes(T2Quals))
+ return ICS;
}
// If at least one of the types is a class type, the types are not
@@ -3429,7 +3599,8 @@ TryReferenceInit(Sema &S, Expr *&Init, QualType DeclType,
ICS = TryImplicitConversion(S, Init, T1, SuppressUserConversions,
/*AllowExplicit=*/false,
/*InOverloadResolution=*/false,
- /*CStyle=*/false);
+ /*CStyle=*/false,
+ /*AllowObjCWritebackConversion=*/false);
// Of course, that's still a reference binding.
if (ICS.isStandard()) {
@@ -3438,12 +3609,14 @@ TryReferenceInit(Sema &S, Expr *&Init, QualType DeclType,
ICS.Standard.BindsToFunctionLvalue = T2->isFunctionType();
ICS.Standard.BindsToRvalue = true;
ICS.Standard.BindsImplicitObjectArgumentWithoutRefQualifier = false;
+ ICS.Standard.ObjCLifetimeConversionBinding = false;
} else if (ICS.isUserDefined()) {
ICS.UserDefined.After.ReferenceBinding = true;
ICS.Standard.IsLvalueReference = !isRValRef;
ICS.Standard.BindsToFunctionLvalue = T2->isFunctionType();
ICS.Standard.BindsToRvalue = true;
ICS.Standard.BindsImplicitObjectArgumentWithoutRefQualifier = false;
+ ICS.Standard.ObjCLifetimeConversionBinding = false;
}
return ICS;
@@ -3458,7 +3631,8 @@ TryReferenceInit(Sema &S, Expr *&Init, QualType DeclType,
static ImplicitConversionSequence
TryCopyInitialization(Sema &S, Expr *From, QualType ToType,
bool SuppressUserConversions,
- bool InOverloadResolution) {
+ bool InOverloadResolution,
+ bool AllowObjCWritebackConversion) {
if (ToType->isReferenceType())
return TryReferenceInit(S, From, ToType,
/*FIXME:*/From->getLocStart(),
@@ -3469,7 +3643,8 @@ TryCopyInitialization(Sema &S, Expr *From, QualType ToType,
SuppressUserConversions,
/*AllowExplicit=*/false,
InOverloadResolution,
- /*CStyle=*/false);
+ /*CStyle=*/false,
+ AllowObjCWritebackConversion);
}
/// TryObjectArgumentInitialization - Try to initialize the object
@@ -3659,7 +3834,8 @@ TryContextuallyConvertToBool(Sema &S, Expr *From) {
/*SuppressUserConversions=*/false,
/*AllowExplicit=*/true,
/*InOverloadResolution=*/false,
- /*CStyle=*/false);
+ /*CStyle=*/false,
+ /*AllowObjCWritebackConversion=*/false);
}
/// PerformContextuallyConvertToBool - Perform a contextual conversion
@@ -3686,7 +3862,8 @@ TryContextuallyConvertToObjCId(Sema &S, Expr *From) {
/*SuppressUserConversions=*/false,
/*AllowExplicit=*/true,
/*InOverloadResolution=*/false,
- /*CStyle=*/false);
+ /*CStyle=*/false,
+ /*AllowObjCWritebackConversion=*/false);
}
/// PerformContextuallyConvertToObjCId - Perform a contextual conversion
@@ -3980,7 +4157,9 @@ Sema::AddOverloadCandidate(FunctionDecl *Function,
Candidate.Conversions[ArgIdx]
= TryCopyInitialization(*this, Args[ArgIdx], ParamType,
SuppressUserConversions,
- /*InOverloadResolution=*/true);
+ /*InOverloadResolution=*/true,
+ /*AllowObjCWritebackConversion=*/
+ getLangOptions().ObjCAutoRefCount);
if (Candidate.Conversions[ArgIdx].isBad()) {
Candidate.Viable = false;
Candidate.FailureKind = ovl_fail_bad_conversion;
@@ -4153,7 +4332,9 @@ Sema::AddMethodCandidate(CXXMethodDecl *Method, DeclAccessPair FoundDecl,
Candidate.Conversions[ArgIdx + 1]
= TryCopyInitialization(*this, Args[ArgIdx], ParamType,
SuppressUserConversions,
- /*InOverloadResolution=*/true);
+ /*InOverloadResolution=*/true,
+ /*AllowObjCWritebackConversion=*/
+ getLangOptions().ObjCAutoRefCount);
if (Candidate.Conversions[ArgIdx + 1].isBad()) {
Candidate.Viable = false;
Candidate.FailureKind = ovl_fail_bad_conversion;
@@ -4356,25 +4537,26 @@ Sema::AddConversionCandidate(CXXConversionDecl *Conversion,
CK_FunctionToPointerDecay,
&ConversionRef, VK_RValue);
- QualType CallResultType
- = Conversion->getConversionType().getNonLValueExprType(Context);
- if (RequireCompleteType(From->getLocStart(), CallResultType, 0)) {
+ QualType ConversionType = Conversion->getConversionType();
+ if (RequireCompleteType(From->getLocStart(), ConversionType, 0)) {
Candidate.Viable = false;
Candidate.FailureKind = ovl_fail_bad_final_conversion;
return;
}
- ExprValueKind VK = Expr::getValueKindForType(Conversion->getConversionType());
+ ExprValueKind VK = Expr::getValueKindForType(ConversionType);
// Note that it is safe to allocate CallExpr on the stack here because
// there are 0 arguments (i.e., nothing is allocated using ASTContext's
// allocator).
+ QualType CallResultType = ConversionType.getNonLValueExprType(Context);
CallExpr Call(Context, &ConversionFn, 0, 0, CallResultType, VK,
From->getLocStart());
ImplicitConversionSequence ICS =
TryCopyInitialization(*this, &Call, ToType,
/*SuppressUserConversions=*/true,
- /*InOverloadResolution=*/false);
+ /*InOverloadResolution=*/false,
+ /*AllowObjCWritebackConversion=*/false);
switch (ICS.getKind()) {
case ImplicitConversionSequence::StandardConversion:
@@ -4544,7 +4726,9 @@ void Sema::AddSurrogateCandidate(CXXConversionDecl *Conversion,
Candidate.Conversions[ArgIdx + 1]
= TryCopyInitialization(*this, Args[ArgIdx], ParamType,
/*SuppressUserConversions=*/false,
- /*InOverloadResolution=*/false);
+ /*InOverloadResolution=*/false,
+ /*AllowObjCWritebackConversion=*/
+ getLangOptions().ObjCAutoRefCount);
if (Candidate.Conversions[ArgIdx + 1].isBad()) {
Candidate.Viable = false;
Candidate.FailureKind = ovl_fail_bad_conversion;
@@ -4662,7 +4846,9 @@ void Sema::AddBuiltinCandidate(QualType ResultTy, QualType *ParamTys,
Candidate.Conversions[ArgIdx]
= TryCopyInitialization(*this, Args[ArgIdx], ParamTys[ArgIdx],
ArgIdx == 0 && IsAssignmentOperator,
- /*InOverloadResolution=*/false);
+ /*InOverloadResolution=*/false,
+ /*AllowObjCWritebackConversion=*/
+ getLangOptions().ObjCAutoRefCount);
}
if (Candidate.Conversions[ArgIdx].isBad()) {
Candidate.Viable = false;
@@ -6417,7 +6603,8 @@ OverloadCandidateSet::BestViableFunction(Sema &S, SourceLocation Loc,
// Best is the best viable function.
if (Best->Function &&
- (Best->Function->isDeleted() || Best->Function->isUnavailable()))
+ (Best->Function->isDeleted() ||
+ S.isFunctionConsideredUnavailable(Best->Function)))
return OR_Deleted;
return OR_Success;
@@ -6619,6 +6806,17 @@ void DiagnoseBadConversion(Sema &S, OverloadCandidate *Cand, unsigned I) {
return;
}
+ if (FromQs.getObjCLifetime() != ToQs.getObjCLifetime()) {
+ S.Diag(Fn->getLocation(), diag::note_ovl_candidate_bad_ownership)
+ << (unsigned) FnKind << FnDesc
+ << (FromExpr ? FromExpr->getSourceRange() : SourceRange())
+ << FromTy
+ << FromQs.getObjCLifetime() << ToQs.getObjCLifetime()
+ << (unsigned) isObjectArgument << I+1;
+ MaybeEmitInheritedConstructorNote(S, Fn);
+ return;
+ }
+
if (FromQs.getObjCGCAttr() != ToQs.getObjCGCAttr()) {
S.Diag(Fn->getLocation(), diag::note_ovl_candidate_bad_gc)
<< (unsigned) FnKind << FnDesc
@@ -6901,7 +7099,8 @@ void NoteFunctionCandidate(Sema &S, OverloadCandidate *Cand,
FunctionDecl *Fn = Cand->Function;
// Note deleted candidates, but only if they're viable.
- if (Cand->Viable && (Fn->isDeleted() || Fn->isUnavailable())) {
+ if (Cand->Viable && (Fn->isDeleted() ||
+ S.isFunctionConsideredUnavailable(Fn))) {
std::string FnDesc;
OverloadCandidateKind FnKind = ClassifyOverloadCandidate(S, Fn, FnDesc);
@@ -7152,7 +7351,9 @@ void CompleteNonViableCandidate(Sema &S, OverloadCandidate *Cand,
= TryCopyInitialization(S, Args[ConvIdx],
Cand->BuiltinTypes.ParamTypes[ConvIdx],
SuppressUserConversions,
- /*InOverloadResolution*/ true);
+ /*InOverloadResolution*/ true,
+ /*AllowObjCWritebackConversion=*/
+ S.getLangOptions().ObjCAutoRefCount);
return;
}
@@ -7163,7 +7364,9 @@ void CompleteNonViableCandidate(Sema &S, OverloadCandidate *Cand,
Cand->Conversions[ConvIdx]
= TryCopyInitialization(S, Args[ArgIdx], Proto->getArgType(ArgIdx),
SuppressUserConversions,
- /*InOverloadResolution=*/true);
+ /*InOverloadResolution=*/true,
+ /*AllowObjCWritebackConversion=*/
+ S.getLangOptions().ObjCAutoRefCount);
else
Cand->Conversions[ConvIdx].setEllipsis();
}
@@ -7407,8 +7610,8 @@ private:
QualType ResultTy;
if (Context.hasSameUnqualifiedType(TargetFunctionType,
FunDecl->getType()) ||
- IsNoReturnConversion(Context, FunDecl->getType(), TargetFunctionType,
- ResultTy)) {
+ S.IsNoReturnConversion(FunDecl->getType(), TargetFunctionType,
+ ResultTy)) {
Matches.push_back(std::make_pair(CurAccessFunPair,
cast<FunctionDecl>(FunDecl->getCanonicalDecl())));
FoundNonTemplateFunction = true;
@@ -7742,13 +7945,17 @@ static void AddOverloadedCallCandidate(Sema &S,
TemplateArgumentListInfo *ExplicitTemplateArgs,
Expr **Args, unsigned NumArgs,
OverloadCandidateSet &CandidateSet,
- bool PartialOverloading) {
+ bool PartialOverloading,
+ bool KnownValid) {
NamedDecl *Callee = FoundDecl.getDecl();
if (isa<UsingShadowDecl>(Callee))
Callee = cast<UsingShadowDecl>(Callee)->getTargetDecl();
if (FunctionDecl *Func = dyn_cast<FunctionDecl>(Callee)) {
- assert(!ExplicitTemplateArgs && "Explicit template arguments?");
+ if (ExplicitTemplateArgs) {
+ assert(!KnownValid && "Explicit template arguments?");
+ return;
+ }
S.AddOverloadCandidate(Func, FoundDecl, Args, NumArgs, CandidateSet,
false, PartialOverloading);
return;
@@ -7762,9 +7969,7 @@ static void AddOverloadedCallCandidate(Sema &S,
return;
}
- assert(false && "unhandled case in overloaded call candidate");
-
- // do nothing?
+ assert(!KnownValid && "unhandled case in overloaded call candidate");
}
/// \brief Add the overload candidates named by callee and/or found by argument
@@ -7815,7 +8020,7 @@ void Sema::AddOverloadedCallCandidates(UnresolvedLookupExpr *ULE,
E = ULE->decls_end(); I != E; ++I)
AddOverloadedCallCandidate(*this, I.getPair(), ExplicitTemplateArgs,
Args, NumArgs, CandidateSet,
- PartialOverloading);
+ PartialOverloading, /*KnownValid*/ true);
if (ULE->requiresADL())
AddArgumentDependentLookupCandidates(ULE->getName(), /*Operator*/ false,
@@ -7857,13 +8062,15 @@ DiagnoseTwoPhaseLookup(Sema &SemaRef, SourceLocation FnLoc,
for (LookupResult::iterator I = R.begin(), E = R.end(); I != E; ++I)
AddOverloadedCallCandidate(SemaRef, I.getPair(),
ExplicitTemplateArgs, Args, NumArgs,
- Candidates, false);
+ Candidates, false, /*KnownValid*/ false);
OverloadCandidateSet::iterator Best;
- if (Candidates.BestViableFunction(SemaRef, FnLoc, Best) != OR_Success)
+ if (Candidates.BestViableFunction(SemaRef, FnLoc, Best) != OR_Success) {
// No viable functions. Don't bother the user with notes for functions
// which don't work and shouldn't be found anyway.
+ R.clear();
return false;
+ }
// Find the namespaces where ADL would have looked, and suggest
// declaring the function there instead.
@@ -8673,7 +8880,10 @@ Sema::CreateOverloadedArraySubscriptExpr(SourceLocation LLoc,
ResultTy = ResultTy.getNonLValueExprType(Context);
// Build the actual expression node.
- ExprResult FnExpr = CreateFunctionRefExpr(*this, FnDecl, LLoc);
+ DeclarationNameLoc LocInfo;
+ LocInfo.CXXOperatorName.BeginOpNameLoc = LLoc.getRawEncoding();
+ LocInfo.CXXOperatorName.EndOpNameLoc = RLoc.getRawEncoding();
+ ExprResult FnExpr = CreateFunctionRefExpr(*this, FnDecl, LLoc, LocInfo);
if (FnExpr.isInvalid())
return ExprError();
@@ -8963,13 +9173,14 @@ Sema::BuildCallToMemberFunction(Scope *S, Expr *MemExprE,
TheCall->getMethodDecl()->isPure()) {
const CXXMethodDecl *MD = TheCall->getMethodDecl();
- if (isa<CXXThisExpr>(MemExpr->getBase()->IgnoreParenCasts()))
+ if (isa<CXXThisExpr>(MemExpr->getBase()->IgnoreParenCasts())) {
Diag(MemExpr->getLocStart(),
diag::warn_call_to_pure_virtual_member_function_from_ctor_dtor)
<< MD->getDeclName() << isa<CXXDestructorDecl>(CurContext)
<< MD->getParent()->getDeclName();
Diag(MD->getLocStart(), diag::note_previous_decl) << MD->getDeclName();
+ }
}
return MaybeBindToTemporary(TheCall);
}
diff --git a/contrib/llvm/tools/clang/lib/Sema/SemaStmt.cpp b/contrib/llvm/tools/clang/lib/Sema/SemaStmt.cpp
index d7c0a54..65f431d 100644
--- a/contrib/llvm/tools/clang/lib/Sema/SemaStmt.cpp
+++ b/contrib/llvm/tools/clang/lib/Sema/SemaStmt.cpp
@@ -66,8 +66,30 @@ void Sema::ActOnForEachDeclStmt(DeclGroupPtrTy dg) {
// If we have an invalid decl, just return.
if (DG.isNull() || !DG.isSingleDecl()) return;
+ VarDecl *var = cast<VarDecl>(DG.getSingleDecl());
+
// suppress any potential 'unused variable' warning.
- DG.getSingleDecl()->setUsed();
+ var->setUsed();
+
+ // foreach variables are never actually initialized in the way that
+ // the parser came up with.
+ var->setInit(0);
+
+ // In ARC, we don't need to retain the iteration variable of a fast
+ // enumeration loop. Rather than actually trying to catch that
+ // during declaration processing, we remove the consequences here.
+ if (getLangOptions().ObjCAutoRefCount) {
+ QualType type = var->getType();
+
+ // Only do this if we inferred the lifetime. Inferred lifetime
+ // will show up as a local qualifier because explicit lifetime
+ // should have shown up as an AttributedType instead.
+ if (type.getLocalQualifiers().getObjCLifetime() == Qualifiers::OCL_Strong) {
+ // Add 'const' and mark the variable as pseudo-strong.
+ var->setType(type.withConst());
+ var->setARCPseudoStrong(true);
+ }
+ }
}
void Sema::DiagnoseUnusedExprResult(const Stmt *S) {
@@ -114,6 +136,10 @@ void Sema::DiagnoseUnusedExprResult(const Stmt *S) {
}
}
} else if (const ObjCMessageExpr *ME = dyn_cast<ObjCMessageExpr>(E)) {
+ if (getLangOptions().ObjCAutoRefCount && ME->isDelegateInitCall()) {
+ Diag(Loc, diag::err_arc_unused_init_message) << R1;
+ return;
+ }
const ObjCMethodDecl *MD = ME->getMethodDecl();
if (MD && MD->getAttr<WarnUnusedResultAttr>()) {
Diag(Loc, diag::warn_unused_call) << R1 << R2 << "warn_unused_result";
@@ -951,14 +977,13 @@ Sema::ActOnObjCForCollectionStmt(SourceLocation ForLoc,
return StmtError(Diag((*DS->decl_begin())->getLocation(),
diag::err_toomany_element_decls));
- Decl *D = DS->getSingleDecl();
- FirstType = cast<ValueDecl>(D)->getType();
+ VarDecl *D = cast<VarDecl>(DS->getSingleDecl());
+ FirstType = D->getType();
// C99 6.8.5p3: The declaration part of a 'for' statement shall only
// declare identifiers for objects having storage class 'auto' or
// 'register'.
- VarDecl *VD = cast<VarDecl>(D);
- if (VD->isLocalVarDecl() && !VD->hasLocalStorage())
- return StmtError(Diag(VD->getLocation(),
+ if (!D->hasLocalStorage())
+ return StmtError(Diag(D->getLocation(),
diag::err_non_variable_decl_in_for));
} else {
Expr *FirstE = cast<Expr>(First);
@@ -1047,6 +1072,13 @@ static bool FinishForRangeVarDecl(Sema &SemaRef, VarDecl *Decl, Expr *Init,
Decl->setTypeSourceInfo(InitTSI);
Decl->setType(InitTSI->getType());
+ // In ARC, infer lifetime.
+ // FIXME: ARC may want to turn this into 'const __unsafe_unretained' if
+ // we're doing the equivalent of fast iteration.
+ if (SemaRef.getLangOptions().ObjCAutoRefCount &&
+ SemaRef.inferObjCARCLifetime(Decl))
+ Decl->setInvalidDecl();
+
SemaRef.AddInitializerToDecl(Decl, Init, /*DirectInit=*/false,
/*TypeMayContainAuto=*/false);
SemaRef.FinalizeDeclaration(Decl);
@@ -1374,6 +1406,9 @@ Sema::BuildCXXForRangeStmt(SourceLocation ForLoc, SourceLocation ColonLoc,
if (LoopVar->isInvalidDecl())
NoteForRangeBeginEndFunction(*this, BeginExpr.get(), BEF_begin);
}
+ } else {
+ // The range is implicitly used as a placeholder when it is dependent.
+ RangeVar->setUsed();
}
return Owned(new (Context) CXXForRangeStmt(RangeDS,
@@ -1508,7 +1543,8 @@ ExprResult
Sema::PerformMoveOrCopyInitialization(const InitializedEntity &Entity,
const VarDecl *NRVOCandidate,
QualType ResultType,
- Expr *Value) {
+ Expr *Value,
+ bool AllowNRVO) {
// C++0x [class.copy]p33:
// When the criteria for elision of a copy operation are met or would
// be met save for the fact that the source object is a function
@@ -1516,7 +1552,8 @@ Sema::PerformMoveOrCopyInitialization(const InitializedEntity &Entity,
// overload resolution to select the constructor for the copy is first
// performed as if the object were designated by an rvalue.
ExprResult Res = ExprError();
- if (NRVOCandidate || getCopyElisionCandidate(ResultType, Value, true)) {
+ if (AllowNRVO &&
+ (NRVOCandidate || getCopyElisionCandidate(ResultType, Value, true))) {
ImplicitCastExpr AsRvalue(ImplicitCastExpr::OnStack,
Value->getType(), CK_LValueToRValue,
Value, VK_XValue);
@@ -1726,8 +1763,17 @@ Sema::ActOnReturnStmt(SourceLocation ReturnLoc, Expr *RetValExp) {
if (D != diag::ext_return_has_void_expr ||
!getLangOptions().CPlusPlus) {
NamedDecl *CurDecl = getCurFunctionOrMethodDecl();
+
+ int FunctionKind = 0;
+ if (isa<ObjCMethodDecl>(CurDecl))
+ FunctionKind = 1;
+ else if (isa<CXXConstructorDecl>(CurDecl))
+ FunctionKind = 2;
+ else if (isa<CXXDestructorDecl>(CurDecl))
+ FunctionKind = 3;
+
Diag(ReturnLoc, D)
- << CurDecl->getDeclName() << isa<ObjCMethodDecl>(CurDecl)
+ << CurDecl->getDeclName() << FunctionKind
<< RetValExp->getSourceRange();
}
}
@@ -1756,7 +1802,7 @@ Sema::ActOnReturnStmt(SourceLocation ReturnLoc, Expr *RetValExp) {
// overlap restriction of subclause 6.5.16.1 does not apply to the case of
// function return.
- // In C++ the return statement is handled via a copy initialization.
+ // In C++ the return statement is handled via a copy initialization,
// the C version of which boils down to CheckSingleAssignmentConstraints.
NRVOCandidate = getCopyElisionCandidate(FnRetType, RetValExp, false);
InitializedEntity Entity = InitializedEntity::InitializeResult(ReturnLoc,
@@ -1797,7 +1843,7 @@ Sema::ActOnReturnStmt(SourceLocation ReturnLoc, Expr *RetValExp) {
if (getLangOptions().CPlusPlus && FnRetType->isRecordType() &&
!CurContext->isDependentContext())
FunctionScopes.back()->Returns.push_back(Result);
-
+
return Owned(Result);
}
@@ -1955,7 +2001,7 @@ StmtResult Sema::ActOnAsmStmt(SourceLocation AsmLoc, bool IsSimple,
llvm::StringRef Clobber = Literal->getString();
- if (!Context.Target.isValidGCCRegisterName(Clobber))
+ if (!Context.Target.isValidClobber(Clobber))
return StmtError(Diag(Literal->getLocStart(),
diag::err_asm_unknown_register_name) << Clobber);
}
@@ -2179,6 +2225,12 @@ Sema::ActOnCXXCatchBlock(SourceLocation CatchLoc, Decl *ExDecl,
HandlerBlock));
}
+StmtResult
+Sema::ActOnObjCAutoreleasePoolStmt(SourceLocation AtLoc, Stmt *Body) {
+ getCurFunction()->setHasBranchProtectedScope();
+ return Owned(new (Context) ObjCAutoreleasePoolStmt(AtLoc, Body));
+}
+
namespace {
class TypeWithHandler {
@@ -2309,4 +2361,3 @@ Sema::ActOnSEHFinallyBlock(SourceLocation Loc,
assert(Block);
return Owned(SEHFinallyStmt::Create(Context,Loc,Block));
}
-
diff --git a/contrib/llvm/tools/clang/lib/Sema/SemaTemplate.cpp b/contrib/llvm/tools/clang/lib/Sema/SemaTemplate.cpp
index 5d4caac..3ac190e 100644
--- a/contrib/llvm/tools/clang/lib/Sema/SemaTemplate.cpp
+++ b/contrib/llvm/tools/clang/lib/Sema/SemaTemplate.cpp
@@ -294,26 +294,31 @@ void Sema::LookupTemplateName(LookupResult &Found,
if (Found.empty() && !isDependent) {
// If we did not find any names, attempt to correct any typos.
DeclarationName Name = Found.getLookupName();
- if (DeclarationName Corrected = CorrectTypo(Found, S, &SS, LookupCtx,
- false, CTC_CXXCasts)) {
+ Found.clear();
+ if (TypoCorrection Corrected = CorrectTypo(Found.getLookupNameInfo(),
+ Found.getLookupKind(), S, &SS,
+ LookupCtx, false,
+ CTC_CXXCasts)) {
+ Found.setLookupName(Corrected.getCorrection());
+ if (Corrected.getCorrectionDecl())
+ Found.addDecl(Corrected.getCorrectionDecl());
FilterAcceptableTemplateNames(Found);
if (!Found.empty()) {
+ std::string CorrectedStr(Corrected.getAsString(getLangOptions()));
+ std::string CorrectedQuotedStr(Corrected.getQuoted(getLangOptions()));
if (LookupCtx)
Diag(Found.getNameLoc(), diag::err_no_member_template_suggest)
- << Name << LookupCtx << Found.getLookupName() << SS.getRange()
- << FixItHint::CreateReplacement(Found.getNameLoc(),
- Found.getLookupName().getAsString());
+ << Name << LookupCtx << CorrectedQuotedStr << SS.getRange()
+ << FixItHint::CreateReplacement(Found.getNameLoc(), CorrectedStr);
else
Diag(Found.getNameLoc(), diag::err_no_template_suggest)
- << Name << Found.getLookupName()
- << FixItHint::CreateReplacement(Found.getNameLoc(),
- Found.getLookupName().getAsString());
+ << Name << CorrectedQuotedStr
+ << FixItHint::CreateReplacement(Found.getNameLoc(), CorrectedStr);
if (TemplateDecl *Template = Found.getAsSingle<TemplateDecl>())
Diag(Template->getLocation(), diag::note_previous_decl)
- << Template->getDeclName();
+ << CorrectedQuotedStr;
}
} else {
- Found.clear();
Found.setLookupName(Name);
}
}
@@ -1856,7 +1861,8 @@ void Sema::NoteAllFoundTemplates(TemplateName Name) {
QualType Sema::CheckTemplateIdType(TemplateName Name,
SourceLocation TemplateLoc,
TemplateArgumentListInfo &TemplateArgs) {
- DependentTemplateName *DTN = Name.getAsDependentTemplateName();
+ DependentTemplateName *DTN
+ = Name.getUnderlying().getAsDependentTemplateName();
if (DTN && DTN->isIdentifier())
// When building a template-id where the template-name is dependent,
// assume the template is a type template. Either our assumption is
@@ -1892,6 +1898,7 @@ QualType Sema::CheckTemplateIdType(TemplateName Name,
QualType CanonType;
+ bool InstantiationDependent = false;
if (TypeAliasTemplateDecl *AliasTemplate
= dyn_cast<TypeAliasTemplateDecl>(Template)) {
// Find the canonical type for this type alias template specialization.
@@ -1917,7 +1924,7 @@ QualType Sema::CheckTemplateIdType(TemplateName Name,
return QualType();
} else if (Name.isDependent() ||
TemplateSpecializationType::anyDependentTemplateArguments(
- TemplateArgs)) {
+ TemplateArgs, InstantiationDependent)) {
// This class template specialization is a dependent
// type. Therefore, its canonical type is another class template
// specialization type that contains all of the converted
@@ -2357,8 +2364,20 @@ bool Sema::CheckTemplateTypeArgument(TemplateTypeParmDecl *Param,
return true;
// Add the converted template type argument.
- Converted.push_back(
- TemplateArgument(Context.getCanonicalType(Arg.getAsType())));
+ QualType ArgType = Context.getCanonicalType(Arg.getAsType());
+
+ // Objective-C ARC:
+ // If an explicitly-specified template argument type is a lifetime type
+ // with no lifetime qualifier, the __strong lifetime qualifier is inferred.
+ if (getLangOptions().ObjCAutoRefCount &&
+ ArgType->isObjCLifetimeType() &&
+ !ArgType.getObjCLifetime()) {
+ Qualifiers Qs;
+ Qs.setObjCLifetime(Qualifiers::OCL_Strong);
+ ArgType = Context.getQualifiedType(ArgType, Qs);
+ }
+
+ Converted.push_back(TemplateArgument(ArgType));
return false;
}
@@ -2912,16 +2931,6 @@ bool Sema::CheckTemplateArgumentList(TemplateDecl *Template,
// arguments, just break out now and we'll fill in the argument pack below.
if ((*Param)->isTemplateParameterPack())
break;
-
- // If our template is a template template parameter that hasn't acquired
- // its proper context yet (e.g., because we're using the template template
- // parameter in the signature of a function template, before we've built
- // the function template itself), don't attempt substitution of default
- // template arguments at this point: we don't have enough context to
- // do it properly.
- if (isTemplateTemplateParameter &&
- Template->getDeclContext()->isTranslationUnit())
- break;
// We have a default template argument that we will use.
TemplateArgumentLoc Arg;
@@ -3307,8 +3316,7 @@ CheckTemplateArgumentAddressOfObjectOrFunction(Sema &S,
QualType ArgType = Arg->getType();
// See through any implicit casts we added to fix the type.
- while (ImplicitCastExpr *Cast = dyn_cast<ImplicitCastExpr>(Arg))
- Arg = Cast->getSubExpr();
+ Arg = Arg->IgnoreImpCasts();
// C++ [temp.arg.nontype]p1:
//
@@ -3321,7 +3329,6 @@ CheckTemplateArgumentAddressOfObjectOrFunction(Sema &S,
// expressed as & id-expression where the & is optional if
// the name refers to a function or array, or if the
// corresponding template-parameter is a reference; or
- DeclRefExpr *DRE = 0;
// In C++98/03 mode, give an extension warning on any extra parentheses.
// See http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#773
@@ -3337,29 +3344,30 @@ CheckTemplateArgumentAddressOfObjectOrFunction(Sema &S,
Arg = Parens->getSubExpr();
}
+ while (SubstNonTypeTemplateParmExpr *subst =
+ dyn_cast<SubstNonTypeTemplateParmExpr>(Arg))
+ Arg = subst->getReplacement()->IgnoreImpCasts();
+
bool AddressTaken = false;
SourceLocation AddrOpLoc;
if (UnaryOperator *UnOp = dyn_cast<UnaryOperator>(Arg)) {
if (UnOp->getOpcode() == UO_AddrOf) {
- // Support &__uuidof(class_with_uuid) as a non-type template argument.
- // Very common in Microsoft COM headers.
- if (S.getLangOptions().Microsoft &&
- isa<CXXUuidofExpr>(UnOp->getSubExpr())) {
- Converted = TemplateArgument(ArgIn);
- return false;
- }
-
- DRE = dyn_cast<DeclRefExpr>(UnOp->getSubExpr());
+ Arg = UnOp->getSubExpr();
AddressTaken = true;
AddrOpLoc = UnOp->getOperatorLoc();
}
- } else {
- if (S.getLangOptions().Microsoft && isa<CXXUuidofExpr>(Arg)) {
- Converted = TemplateArgument(ArgIn);
- return false;
- }
- DRE = dyn_cast<DeclRefExpr>(Arg);
}
+
+ if (S.getLangOptions().Microsoft && isa<CXXUuidofExpr>(Arg)) {
+ Converted = TemplateArgument(ArgIn);
+ return false;
+ }
+
+ while (SubstNonTypeTemplateParmExpr *subst =
+ dyn_cast<SubstNonTypeTemplateParmExpr>(Arg))
+ Arg = subst->getReplacement()->IgnoreImpCasts();
+
+ DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(Arg);
if (!DRE) {
S.Diag(Arg->getLocStart(), diag::err_template_arg_not_decl_ref)
<< Arg->getSourceRange();
@@ -3513,9 +3521,11 @@ CheckTemplateArgumentAddressOfObjectOrFunction(Sema &S,
return true;
}
+ bool ObjCLifetimeConversion;
if (ParamType->isPointerType() &&
!ParamType->getAs<PointerType>()->getPointeeType()->isFunctionType() &&
- S.IsQualificationConversion(ArgType, ParamType, false)) {
+ S.IsQualificationConversion(ArgType, ParamType, false,
+ ObjCLifetimeConversion)) {
// For pointer-to-object types, qualification conversions are
// permitted.
} else {
@@ -3552,10 +3562,10 @@ CheckTemplateArgumentAddressOfObjectOrFunction(Sema &S,
// We can't perform this conversion or binding.
if (ParamType->isReferenceType())
S.Diag(Arg->getLocStart(), diag::err_template_arg_no_ref_bind)
- << ParamType << Arg->getType() << Arg->getSourceRange();
+ << ParamType << ArgIn->getType() << Arg->getSourceRange();
else
S.Diag(Arg->getLocStart(), diag::err_template_arg_not_convertible)
- << Arg->getType() << ParamType << Arg->getSourceRange();
+ << ArgIn->getType() << ParamType << Arg->getSourceRange();
S.Diag(Param->getLocation(), diag::note_template_param_here);
return true;
}
@@ -3599,6 +3609,10 @@ bool Sema::CheckTemplateArgumentPointerToMember(Expr *Arg,
Arg = Parens->getSubExpr();
}
+ while (SubstNonTypeTemplateParmExpr *subst =
+ dyn_cast<SubstNonTypeTemplateParmExpr>(Arg))
+ Arg = subst->getReplacement()->IgnoreImpCasts();
+
// A pointer-to-member constant written &Class::member.
if (UnaryOperator *UnOp = dyn_cast<UnaryOperator>(Arg)) {
if (UnOp->getOpcode() == UO_AddrOf) {
@@ -3875,8 +3889,9 @@ ExprResult Sema::CheckTemplateArgument(NonTypeTemplateParmDecl *Param,
return Owned(Arg);
}
+ bool ObjCLifetimeConversion;
if (IsQualificationConversion(ArgType, ParamType.getNonReferenceType(),
- false)) {
+ false, ObjCLifetimeConversion)) {
Arg = ImpCastExprToType(Arg, ParamType, CK_NoOp, CastCategory(Arg)).take();
} else if (!Context.hasSameUnqualifiedType(ArgType,
ParamType.getNonReferenceType())) {
@@ -3943,9 +3958,11 @@ ExprResult Sema::CheckTemplateArgument(NonTypeTemplateParmDecl *Param,
// member, qualification conversions (4.4) are applied.
assert(ParamType->isMemberPointerType() && "Only pointers to members remain");
+ bool ObjCLifetimeConversion;
if (Context.hasSameUnqualifiedType(ParamType, ArgType)) {
// Types match exactly: nothing more to do here.
- } else if (IsQualificationConversion(ArgType, ParamType, false)) {
+ } else if (IsQualificationConversion(ArgType, ParamType, false,
+ ObjCLifetimeConversion)) {
Arg = ImpCastExprToType(Arg, ParamType, CK_NoOp, CastCategory(Arg)).take();
} else {
// We can't perform this conversion.
@@ -4053,8 +4070,10 @@ Sema::BuildExpressionFromDeclTemplateArgument(const TemplateArgument &Arg,
// We might need to perform a trailing qualification conversion, since
// the element type on the parameter could be more qualified than the
// element type in the expression we constructed.
+ bool ObjCLifetimeConversion;
if (IsQualificationConversion(((Expr*) RefExpr.get())->getType(),
- ParamType.getUnqualifiedType(), false))
+ ParamType.getUnqualifiedType(), false,
+ ObjCLifetimeConversion))
RefExpr = ImpCastExprToType(RefExpr.take(), ParamType.getUnqualifiedType(), CK_NoOp);
assert(!RefExpr.isInvalid() &&
@@ -4818,10 +4837,12 @@ Sema::ActOnClassTemplateSpecialization(Scope *S, unsigned TagSpec,
Converted))
return true;
+ bool InstantiationDependent;
if (!Name.isDependent() &&
!TemplateSpecializationType::anyDependentTemplateArguments(
TemplateArgs.getArgumentArray(),
- TemplateArgs.size())) {
+ TemplateArgs.size(),
+ InstantiationDependent)) {
Diag(TemplateNameLoc, diag::err_partial_spec_fully_specialized)
<< ClassTemplate->getDeclName();
isPartialSpecialization = false;
@@ -5346,7 +5367,7 @@ Sema::CheckDependentFunctionTemplateSpecialization(FunctionDecl *FD,
/// explicitly provided as in, e.g., \c void sort<>(char*, char*);
/// as it anyway contains info on the angle brackets locations.
///
-/// \param PrevDecl the set of declarations that may be specialized by
+/// \param Previous the set of declarations that may be specialized by
/// this function specialization.
bool
Sema::CheckFunctionTemplateSpecialization(FunctionDecl *FD,
@@ -5410,13 +5431,12 @@ Sema::CheckFunctionTemplateSpecialization(FunctionDecl *FD,
FunctionTemplateSpecializationInfo *SpecInfo
= Specialization->getTemplateSpecializationInfo();
assert(SpecInfo && "Function template specialization info missing?");
- {
- // Note: do not overwrite location info if previous template
- // specialization kind was explicit.
- TemplateSpecializationKind TSK = SpecInfo->getTemplateSpecializationKind();
- if (TSK == TSK_Undeclared || TSK == TSK_ImplicitInstantiation)
- Specialization->setLocation(FD->getLocation());
- }
+
+ // Note: do not overwrite location info if previous template
+ // specialization kind was explicit.
+ TemplateSpecializationKind TSK = SpecInfo->getTemplateSpecializationKind();
+ if (TSK == TSK_Undeclared || TSK == TSK_ImplicitInstantiation)
+ Specialization->setLocation(FD->getLocation());
// FIXME: Check if the prior specialization has a point of instantiation.
// If so, we have run afoul of .
diff --git a/contrib/llvm/tools/clang/lib/Sema/SemaTemplateDeduction.cpp b/contrib/llvm/tools/clang/lib/Sema/SemaTemplateDeduction.cpp
index 7d0ce8b..dcb4ff2 100644
--- a/contrib/llvm/tools/clang/lib/Sema/SemaTemplateDeduction.cpp
+++ b/contrib/llvm/tools/clang/lib/Sema/SemaTemplateDeduction.cpp
@@ -12,7 +12,6 @@
#include "clang/Sema/Sema.h"
#include "clang/Sema/DeclSpec.h"
-#include "clang/Sema/SemaDiagnostic.h" // FIXME: temporary!
#include "clang/Sema/Template.h"
#include "clang/Sema/TemplateDeduction.h"
#include "clang/AST/ASTContext.h"
@@ -820,6 +819,11 @@ static bool hasInconsistentOrSupersetQualifiersOf(QualType ParamType,
ParamQs.hasAddressSpace())
return true;
+ // Mismatched (but not missing) Objective-C lifetime qualifiers.
+ if (ParamQs.getObjCLifetime() != ArgQs.getObjCLifetime() &&
+ ParamQs.hasObjCLifetime())
+ return true;
+
// CVR qualifier superset.
return (ParamQs.getCVRQualifiers() != ArgQs.getCVRQualifiers()) &&
((ParamQs.getCVRQualifiers() | ArgQs.getCVRQualifiers())
@@ -1010,6 +1014,17 @@ DeduceTemplateArguments(Sema &S,
DeducedQs.removeObjCGCAttr();
if (ParamQs.hasAddressSpace())
DeducedQs.removeAddressSpace();
+ if (ParamQs.hasObjCLifetime())
+ DeducedQs.removeObjCLifetime();
+
+ // Objective-C ARC:
+ // If template deduction would produce an argument type with lifetime type
+ // but no lifetime qualifier, the __strong lifetime qualifier is inferred.
+ if (S.getLangOptions().ObjCAutoRefCount &&
+ DeducedType->isObjCLifetimeType() &&
+ !DeducedQs.hasObjCLifetime())
+ DeducedQs.setObjCLifetime(Qualifiers::OCL_Strong);
+
DeducedType = S.Context.getQualifiedType(DeducedType.getUnqualifiedType(),
DeducedQs);
@@ -1054,10 +1069,39 @@ DeduceTemplateArguments(Sema &S,
}
switch (Param->getTypeClass()) {
- // No deduction possible for these types
+ // Non-canonical types cannot appear here.
+#define NON_CANONICAL_TYPE(Class, Base) \
+ case Type::Class: llvm_unreachable("deducing non-canonical type: " #Class);
+#define TYPE(Class, Base)
+#include "clang/AST/TypeNodes.def"
+
+ case Type::TemplateTypeParm:
+ case Type::SubstTemplateTypeParmPack:
+ llvm_unreachable("Type nodes handled above");
+
+ // These types cannot be used in templates or cannot be dependent, so
+ // deduction always fails.
case Type::Builtin:
+ case Type::VariableArray:
+ case Type::Vector:
+ case Type::FunctionNoProto:
+ case Type::Record:
+ case Type::Enum:
+ case Type::ObjCObject:
+ case Type::ObjCInterface:
+ case Type::ObjCObjectPointer:
return Sema::TDK_NonDeducedMismatch;
+ // _Complex T [placeholder extension]
+ case Type::Complex:
+ if (const ComplexType *ComplexArg = Arg->getAs<ComplexType>())
+ return DeduceTemplateArguments(S, TemplateParams,
+ cast<ComplexType>(Param)->getElementType(),
+ ComplexArg->getElementType(),
+ Info, Deduced, TDF);
+
+ return Sema::TDK_NonDeducedMismatch;
+
// T *
case Type::Pointer: {
QualType PointeeType;
@@ -1361,17 +1405,107 @@ DeduceTemplateArguments(Sema &S,
Deduced, 0);
}
+ // (clang extension)
+ //
+ // T __attribute__(((ext_vector_type(<integral constant>))))
+ case Type::ExtVector: {
+ const ExtVectorType *VectorParam = cast<ExtVectorType>(Param);
+ if (const ExtVectorType *VectorArg = dyn_cast<ExtVectorType>(Arg)) {
+ // Make sure that the vectors have the same number of elements.
+ if (VectorParam->getNumElements() != VectorArg->getNumElements())
+ return Sema::TDK_NonDeducedMismatch;
+
+ // Perform deduction on the element types.
+ return DeduceTemplateArguments(S, TemplateParams,
+ VectorParam->getElementType(),
+ VectorArg->getElementType(),
+ Info, Deduced,
+ TDF);
+ }
+
+ if (const DependentSizedExtVectorType *VectorArg
+ = dyn_cast<DependentSizedExtVectorType>(Arg)) {
+ // We can't check the number of elements, since the argument has a
+ // dependent number of elements. This can only occur during partial
+ // ordering.
+
+ // Perform deduction on the element types.
+ return DeduceTemplateArguments(S, TemplateParams,
+ VectorParam->getElementType(),
+ VectorArg->getElementType(),
+ Info, Deduced,
+ TDF);
+ }
+
+ return Sema::TDK_NonDeducedMismatch;
+ }
+
+ // (clang extension)
+ //
+ // T __attribute__(((ext_vector_type(N))))
+ case Type::DependentSizedExtVector: {
+ const DependentSizedExtVectorType *VectorParam
+ = cast<DependentSizedExtVectorType>(Param);
+
+ if (const ExtVectorType *VectorArg = dyn_cast<ExtVectorType>(Arg)) {
+ // Perform deduction on the element types.
+ if (Sema::TemplateDeductionResult Result
+ = DeduceTemplateArguments(S, TemplateParams,
+ VectorParam->getElementType(),
+ VectorArg->getElementType(),
+ Info, Deduced,
+ TDF))
+ return Result;
+
+ // Perform deduction on the vector size, if we can.
+ NonTypeTemplateParmDecl *NTTP
+ = getDeducedParameterFromExpr(VectorParam->getSizeExpr());
+ if (!NTTP)
+ return Sema::TDK_Success;
+
+ llvm::APSInt ArgSize(S.Context.getTypeSize(S.Context.IntTy), false);
+ ArgSize = VectorArg->getNumElements();
+ return DeduceNonTypeTemplateArgument(S, NTTP, ArgSize, S.Context.IntTy,
+ false, Info, Deduced);
+ }
+
+ if (const DependentSizedExtVectorType *VectorArg
+ = dyn_cast<DependentSizedExtVectorType>(Arg)) {
+ // Perform deduction on the element types.
+ if (Sema::TemplateDeductionResult Result
+ = DeduceTemplateArguments(S, TemplateParams,
+ VectorParam->getElementType(),
+ VectorArg->getElementType(),
+ Info, Deduced,
+ TDF))
+ return Result;
+
+ // Perform deduction on the vector size, if we can.
+ NonTypeTemplateParmDecl *NTTP
+ = getDeducedParameterFromExpr(VectorParam->getSizeExpr());
+ if (!NTTP)
+ return Sema::TDK_Success;
+
+ return DeduceNonTypeTemplateArgument(S, NTTP, VectorArg->getSizeExpr(),
+ Info, Deduced);
+ }
+
+ return Sema::TDK_NonDeducedMismatch;
+ }
+
case Type::TypeOfExpr:
case Type::TypeOf:
case Type::DependentName:
+ case Type::UnresolvedUsing:
+ case Type::Decltype:
+ case Type::UnaryTransform:
+ case Type::Auto:
+ case Type::DependentTemplateSpecialization:
+ case Type::PackExpansion:
// No template argument deduction for these types
return Sema::TDK_Success;
-
- default:
- break;
}
- // FIXME: Many more cases to go (to go).
return Sema::TDK_Success;
}
@@ -2189,15 +2323,108 @@ Sema::SubstituteExplicitTemplateArguments(
return TDK_Success;
}
+/// \brief Check whether the deduced argument type for a call to a function
+/// template matches the actual argument type per C++ [temp.deduct.call]p4.
+static bool
+CheckOriginalCallArgDeduction(Sema &S, Sema::OriginalCallArg OriginalArg,
+ QualType DeducedA) {
+ ASTContext &Context = S.Context;
+
+ QualType A = OriginalArg.OriginalArgType;
+ QualType OriginalParamType = OriginalArg.OriginalParamType;
+
+ // Check for type equality (top-level cv-qualifiers are ignored).
+ if (Context.hasSameUnqualifiedType(A, DeducedA))
+ return false;
+
+ // Strip off references on the argument types; they aren't needed for
+ // the following checks.
+ if (const ReferenceType *DeducedARef = DeducedA->getAs<ReferenceType>())
+ DeducedA = DeducedARef->getPointeeType();
+ if (const ReferenceType *ARef = A->getAs<ReferenceType>())
+ A = ARef->getPointeeType();
+
+ // C++ [temp.deduct.call]p4:
+ // [...] However, there are three cases that allow a difference:
+ // - If the original P is a reference type, the deduced A (i.e., the
+ // type referred to by the reference) can be more cv-qualified than
+ // the transformed A.
+ if (const ReferenceType *OriginalParamRef
+ = OriginalParamType->getAs<ReferenceType>()) {
+ // We don't want to keep the reference around any more.
+ OriginalParamType = OriginalParamRef->getPointeeType();
+
+ Qualifiers AQuals = A.getQualifiers();
+ Qualifiers DeducedAQuals = DeducedA.getQualifiers();
+ if (AQuals == DeducedAQuals) {
+ // Qualifiers match; there's nothing to do.
+ } else if (!DeducedAQuals.compatiblyIncludes(AQuals)) {
+ return true;
+ } else {
+ // Qualifiers are compatible, so have the argument type adopt the
+ // deduced argument type's qualifiers as if we had performed the
+ // qualification conversion.
+ A = Context.getQualifiedType(A.getUnqualifiedType(), DeducedAQuals);
+ }
+ }
+
+ // - The transformed A can be another pointer or pointer to member
+ // type that can be converted to the deduced A via a qualification
+ // conversion.
+ //
+ // Also allow conversions which merely strip [[noreturn]] from function types
+ // (recursively) as an extension.
+ // FIXME: Currently, this doesn't place nicely with qualfication conversions.
+ bool ObjCLifetimeConversion = false;
+ QualType ResultTy;
+ if ((A->isAnyPointerType() || A->isMemberPointerType()) &&
+ (S.IsQualificationConversion(A, DeducedA, false,
+ ObjCLifetimeConversion) ||
+ S.IsNoReturnConversion(A, DeducedA, ResultTy)))
+ return false;
+
+
+ // - If P is a class and P has the form simple-template-id, then the
+ // transformed A can be a derived class of the deduced A. [...]
+ // [...] Likewise, if P is a pointer to a class of the form
+ // simple-template-id, the transformed A can be a pointer to a
+ // derived class pointed to by the deduced A.
+ if (const PointerType *OriginalParamPtr
+ = OriginalParamType->getAs<PointerType>()) {
+ if (const PointerType *DeducedAPtr = DeducedA->getAs<PointerType>()) {
+ if (const PointerType *APtr = A->getAs<PointerType>()) {
+ if (A->getPointeeType()->isRecordType()) {
+ OriginalParamType = OriginalParamPtr->getPointeeType();
+ DeducedA = DeducedAPtr->getPointeeType();
+ A = APtr->getPointeeType();
+ }
+ }
+ }
+ }
+
+ if (Context.hasSameUnqualifiedType(A, DeducedA))
+ return false;
+
+ if (A->isRecordType() && isSimpleTemplateIdType(OriginalParamType) &&
+ S.IsDerivedFrom(A, DeducedA))
+ return false;
+
+ return true;
+}
+
/// \brief Finish template argument deduction for a function template,
/// checking the deduced template arguments for completeness and forming
/// the function template specialization.
+///
+/// \param OriginalCallArgs If non-NULL, the original call arguments against
+/// which the deduced argument types should be compared.
Sema::TemplateDeductionResult
Sema::FinishTemplateArgumentDeduction(FunctionTemplateDecl *FunctionTemplate,
llvm::SmallVectorImpl<DeducedTemplateArgument> &Deduced,
unsigned NumExplicitlySpecified,
FunctionDecl *&Specialization,
- TemplateDeductionInfo &Info) {
+ TemplateDeductionInfo &Info,
+ llvm::SmallVectorImpl<OriginalCallArg> const *OriginalCallArgs) {
TemplateParameterList *TemplateParams
= FunctionTemplate->getTemplateParameters();
@@ -2351,6 +2578,24 @@ Sema::FinishTemplateArgumentDeduction(FunctionTemplateDecl *FunctionTemplate,
!Trap.hasErrorOccurred())
Info.take();
+ if (OriginalCallArgs) {
+ // C++ [temp.deduct.call]p4:
+ // In general, the deduction process attempts to find template argument
+ // values that will make the deduced A identical to A (after the type A
+ // is transformed as described above). [...]
+ for (unsigned I = 0, N = OriginalCallArgs->size(); I != N; ++I) {
+ OriginalCallArg OriginalArg = (*OriginalCallArgs)[I];
+ unsigned ParamIdx = OriginalArg.ArgIdx;
+
+ if (ParamIdx >= Specialization->getNumParams())
+ continue;
+
+ QualType DeducedA = Specialization->getParamDecl(ParamIdx)->getType();
+ if (CheckOriginalCallArgDeduction(*this, OriginalArg, DeducedA))
+ return Sema::TDK_SubstitutionFailure;
+ }
+ }
+
// There may have been an error that did not prevent us from constructing a
// declaration. Mark the declaration invalid and return with a substitution
// failure.
@@ -2594,6 +2839,10 @@ static bool AdjustFunctionParmAndArgTypesForDeduction(Sema &S,
return false;
}
+static bool hasDeducibleTemplateParameters(Sema &S,
+ FunctionTemplateDecl *FunctionTemplate,
+ QualType T);
+
/// \brief Perform template argument deduction from a function call
/// (C++ [temp.deduct.call]).
///
@@ -2675,10 +2924,12 @@ Sema::DeduceTemplateArguments(FunctionTemplateDecl *FunctionTemplate,
// Deduce template arguments from the function parameters.
Deduced.resize(TemplateParams->size());
unsigned ArgIdx = 0;
+ llvm::SmallVector<OriginalCallArg, 4> OriginalCallArgs;
for (unsigned ParamIdx = 0, NumParams = ParamTypes.size();
ParamIdx != NumParams; ++ParamIdx) {
- QualType ParamType = ParamTypes[ParamIdx];
-
+ QualType OrigParamType = ParamTypes[ParamIdx];
+ QualType ParamType = OrigParamType;
+
const PackExpansionType *ParamExpansion
= dyn_cast<PackExpansionType>(ParamType);
if (!ParamExpansion) {
@@ -2688,20 +2939,25 @@ Sema::DeduceTemplateArguments(FunctionTemplateDecl *FunctionTemplate,
Expr *Arg = Args[ArgIdx++];
QualType ArgType = Arg->getType();
+
unsigned TDF = 0;
if (AdjustFunctionParmAndArgTypesForDeduction(*this, TemplateParams,
ParamType, ArgType, Arg,
TDF))
continue;
+ // Keep track of the argument type and corresponding parameter index,
+ // so we can check for compatibility between the deduced A and A.
+ if (hasDeducibleTemplateParameters(*this, FunctionTemplate, ParamType))
+ OriginalCallArgs.push_back(OriginalCallArg(OrigParamType, ArgIdx-1,
+ ArgType));
+
if (TemplateDeductionResult Result
= ::DeduceTemplateArguments(*this, TemplateParams,
ParamType, ArgType, Info, Deduced,
TDF))
return Result;
- // FIXME: we need to check that the deduced A is the same as A,
- // modulo the various allowed differences.
continue;
}
@@ -2747,9 +3003,11 @@ Sema::DeduceTemplateArguments(FunctionTemplateDecl *FunctionTemplate,
for (; ArgIdx < NumArgs; ++ArgIdx) {
HasAnyArguments = true;
- ParamType = ParamPattern;
+ QualType OrigParamType = ParamPattern;
+ ParamType = OrigParamType;
Expr *Arg = Args[ArgIdx];
QualType ArgType = Arg->getType();
+
unsigned TDF = 0;
if (AdjustFunctionParmAndArgTypesForDeduction(*this, TemplateParams,
ParamType, ArgType, Arg,
@@ -2760,6 +3018,12 @@ Sema::DeduceTemplateArguments(FunctionTemplateDecl *FunctionTemplate,
break;
}
+ // Keep track of the argument type and corresponding argument index,
+ // so we can check for compatibility between the deduced A and A.
+ if (hasDeducibleTemplateParameters(*this, FunctionTemplate, ParamType))
+ OriginalCallArgs.push_back(OriginalCallArg(OrigParamType, ArgIdx,
+ ArgType));
+
if (TemplateDeductionResult Result
= ::DeduceTemplateArguments(*this, TemplateParams,
ParamType, ArgType, Info, Deduced,
@@ -2792,7 +3056,7 @@ Sema::DeduceTemplateArguments(FunctionTemplateDecl *FunctionTemplate,
return FinishTemplateArgumentDeduction(FunctionTemplate, Deduced,
NumExplicitlySpecified,
- Specialization, Info);
+ Specialization, Info, &OriginalCallArgs);
}
/// \brief Deduce template arguments when taking the address of a function
@@ -2969,9 +3233,6 @@ Sema::DeduceTemplateArguments(FunctionTemplateDecl *FunctionTemplate,
P, A, Info, Deduced, TDF))
return Result;
- // FIXME: we need to check that the deduced A is the same as A,
- // modulo the various allowed differences.
-
// Finish template argument deduction.
LocalInstantiationScope InstScope(*this);
FunctionDecl *Spec = 0;
@@ -3099,8 +3360,19 @@ Sema::DeduceAutoType(TypeSourceInfo *Type, Expr *Init,
QualType DeducedType = Deduced[0].getAsType();
if (DeducedType.isNull())
return false;
-
+
Result = SubstituteAutoTransform(*this, DeducedType).TransformType(Type);
+
+ // Check that the deduced argument type is compatible with the original
+ // argument type per C++ [temp.deduct.call]p4.
+ if (Result &&
+ CheckOriginalCallArgDeduction(*this,
+ Sema::OriginalCallArg(FuncParam,0,InitType),
+ Result->getType())) {
+ Result = 0;
+ return false;
+ }
+
return true;
}
@@ -3227,8 +3499,6 @@ static bool isAtLeastAsSpecializedAs(Sema &S,
case TPOC_Other:
// - In other contexts (14.6.6.2) the function template's function type
// is used.
- // FIXME: Don't we actually want to perform the adjustments on the parameter
- // types?
if (DeduceTemplateArguments(S, TemplateParams, FD2->getType(),
FD1->getType(), Info, Deduced, TDF_None,
/*PartialOrdering=*/true, RefParamComparisons))
@@ -4010,3 +4280,23 @@ Sema::MarkDeducedTemplateParameters(FunctionTemplateDecl *FunctionTemplate,
::MarkUsedTemplateParameters(*this, Function->getParamDecl(I)->getType(),
true, TemplateParams->getDepth(), Deduced);
}
+
+bool hasDeducibleTemplateParameters(Sema &S,
+ FunctionTemplateDecl *FunctionTemplate,
+ QualType T) {
+ if (!T->isDependentType())
+ return false;
+
+ TemplateParameterList *TemplateParams
+ = FunctionTemplate->getTemplateParameters();
+ llvm::SmallVector<bool, 4> Deduced;
+ Deduced.resize(TemplateParams->size());
+ ::MarkUsedTemplateParameters(S, T, true, TemplateParams->getDepth(),
+ Deduced);
+
+ for (unsigned I = 0, N = Deduced.size(); I != N; ++I)
+ if (Deduced[I])
+ return true;
+
+ return false;
+}
diff --git a/contrib/llvm/tools/clang/lib/Sema/SemaTemplateInstantiate.cpp b/contrib/llvm/tools/clang/lib/Sema/SemaTemplateInstantiate.cpp
index 3c19641..1988f14 100644
--- a/contrib/llvm/tools/clang/lib/Sema/SemaTemplateInstantiate.cpp
+++ b/contrib/llvm/tools/clang/lib/Sema/SemaTemplateInstantiate.cpp
@@ -62,8 +62,20 @@ Sema::getTemplateInstantiationArgs(NamedDecl *D,
if (!Ctx) {
Ctx = D->getDeclContext();
- assert((!D->isTemplateParameter() || !Ctx->isTranslationUnit()) &&
- "Template parameter doesn't have its context yet!");
+ // If we have a template template parameter with translation unit context,
+ // then we're performing substitution into a default template argument of
+ // this template template parameter before we've constructed the template
+ // that will own this template template parameter. In this case, we
+ // use empty template parameter lists for all of the outer templates
+ // to avoid performing any substitutions.
+ if (Ctx->isTranslationUnit()) {
+ if (TemplateTemplateParmDecl *TTP
+ = dyn_cast<TemplateTemplateParmDecl>(D)) {
+ for (unsigned I = 0, N = TTP->getDepth() + 1; I != N; ++I)
+ Result.addOuterTemplateArguments(0, 0);
+ return Result;
+ }
+ }
}
while (!Ctx->isFileContext()) {
@@ -788,6 +800,11 @@ namespace {
getSema().CallsUndergoingInstantiation.pop_back();
return move(Result);
}
+
+ private:
+ ExprResult transformNonTypeTemplateParmRef(NonTypeTemplateParmDecl *parm,
+ SourceLocation loc,
+ const TemplateArgument &arg);
};
}
@@ -795,7 +812,7 @@ bool TemplateInstantiator::AlreadyTransformed(QualType T) {
if (T.isNull())
return true;
- if (T->isDependentType() || T->isVariablyModifiedType())
+ if (T->isInstantiationDependentType() || T->isVariablyModifiedType())
return false;
getSema().MarkDeclarationsReferencedInType(Loc, T);
@@ -980,13 +997,14 @@ TemplateName TemplateInstantiator::TransformTemplateName(CXXScopeSpec &SS,
TemplateName Template = Arg.getAsTemplate();
assert(!Template.isNull() && "Null template template argument");
-
+
// We don't ever want to substitute for a qualified template name, since
// the qualifier is handled separately. So, look through the qualified
// template name to its underlying declaration.
if (QualifiedTemplateName *QTN = Template.getAsQualifiedTemplateName())
Template = TemplateName(QTN->getTemplateDecl());
-
+
+ Template = getSema().Context.getSubstTemplateTemplateParm(TTP, Template);
return Template;
}
}
@@ -1065,46 +1083,65 @@ TemplateInstantiator::TransformTemplateParmRefExpr(DeclRefExpr *E,
Arg = Arg.pack_begin()[getSema().ArgumentPackSubstitutionIndex];
}
+ return transformNonTypeTemplateParmRef(NTTP, E->getLocation(), Arg);
+}
+
+ExprResult TemplateInstantiator::transformNonTypeTemplateParmRef(
+ NonTypeTemplateParmDecl *parm,
+ SourceLocation loc,
+ const TemplateArgument &arg) {
+ ExprResult result;
+ QualType type;
+
// The template argument itself might be an expression, in which
// case we just return that expression.
- if (Arg.getKind() == TemplateArgument::Expression)
- return SemaRef.Owned(Arg.getAsExpr());
+ if (arg.getKind() == TemplateArgument::Expression) {
+ Expr *argExpr = arg.getAsExpr();
+ result = SemaRef.Owned(argExpr);
+ type = argExpr->getType();
- if (Arg.getKind() == TemplateArgument::Declaration) {
- ValueDecl *VD = cast<ValueDecl>(Arg.getAsDecl());
+ } else if (arg.getKind() == TemplateArgument::Declaration) {
+ ValueDecl *VD = cast<ValueDecl>(arg.getAsDecl());
// Find the instantiation of the template argument. This is
// required for nested templates.
VD = cast_or_null<ValueDecl>(
- getSema().FindInstantiatedDecl(E->getLocation(),
- VD, TemplateArgs));
+ getSema().FindInstantiatedDecl(loc, VD, TemplateArgs));
if (!VD)
return ExprError();
// Derive the type we want the substituted decl to have. This had
// better be non-dependent, or these checks will have serious problems.
- QualType TargetType;
- if (NTTP->isExpandedParameterPack())
- TargetType = NTTP->getExpansionType(
- getSema().ArgumentPackSubstitutionIndex);
- else if (NTTP->isParameterPack() &&
- isa<PackExpansionType>(NTTP->getType())) {
- TargetType = SemaRef.SubstType(
- cast<PackExpansionType>(NTTP->getType())->getPattern(),
- TemplateArgs, E->getLocation(),
- NTTP->getDeclName());
- } else
- TargetType = SemaRef.SubstType(NTTP->getType(), TemplateArgs,
- E->getLocation(), NTTP->getDeclName());
- assert(!TargetType.isNull() && "type substitution failed for param type");
- assert(!TargetType->isDependentType() && "param type still dependent");
- return SemaRef.BuildExpressionFromDeclTemplateArgument(Arg,
- TargetType,
- E->getLocation());
+ if (parm->isExpandedParameterPack()) {
+ type = parm->getExpansionType(SemaRef.ArgumentPackSubstitutionIndex);
+ } else if (parm->isParameterPack() &&
+ isa<PackExpansionType>(parm->getType())) {
+ type = SemaRef.SubstType(
+ cast<PackExpansionType>(parm->getType())->getPattern(),
+ TemplateArgs, loc, parm->getDeclName());
+ } else {
+ type = SemaRef.SubstType(parm->getType(), TemplateArgs,
+ loc, parm->getDeclName());
+ }
+ assert(!type.isNull() && "type substitution failed for param type");
+ assert(!type->isDependentType() && "param type still dependent");
+ result = SemaRef.BuildExpressionFromDeclTemplateArgument(arg, type, loc);
+
+ if (!result.isInvalid()) type = result.get()->getType();
+ } else {
+ result = SemaRef.BuildExpressionFromIntegralTemplateArgument(arg, loc);
+
+ // Note that this type can be different from the type of 'result',
+ // e.g. if it's an enum type.
+ type = arg.getIntegralType();
}
+ if (result.isInvalid()) return ExprError();
- return SemaRef.BuildExpressionFromIntegralTemplateArgument(Arg,
- E->getSourceRange().getBegin());
+ Expr *resultExpr = result.take();
+ return SemaRef.Owned(new (SemaRef.Context)
+ SubstNonTypeTemplateParmExpr(type,
+ resultExpr->getValueKind(),
+ loc, parm, resultExpr));
}
ExprResult
@@ -1120,36 +1157,9 @@ TemplateInstantiator::TransformSubstNonTypeTemplateParmPackExpr(
assert(Index < ArgPack.pack_size() && "Substitution index out-of-range");
const TemplateArgument &Arg = ArgPack.pack_begin()[Index];
- if (Arg.getKind() == TemplateArgument::Expression)
- return SemaRef.Owned(Arg.getAsExpr());
-
- if (Arg.getKind() == TemplateArgument::Declaration) {
- ValueDecl *VD = cast<ValueDecl>(Arg.getAsDecl());
-
- // Find the instantiation of the template argument. This is
- // required for nested templates.
- VD = cast_or_null<ValueDecl>(
- getSema().FindInstantiatedDecl(E->getParameterPackLocation(),
- VD, TemplateArgs));
- if (!VD)
- return ExprError();
-
- QualType T;
- NonTypeTemplateParmDecl *NTTP = E->getParameterPack();
- if (NTTP->isExpandedParameterPack())
- T = NTTP->getExpansionType(getSema().ArgumentPackSubstitutionIndex);
- else if (const PackExpansionType *Expansion
- = dyn_cast<PackExpansionType>(NTTP->getType()))
- T = SemaRef.SubstType(Expansion->getPattern(), TemplateArgs,
- E->getParameterPackLocation(), NTTP->getDeclName());
- else
- T = E->getType();
- return SemaRef.BuildExpressionFromDeclTemplateArgument(Arg, T,
- E->getParameterPackLocation());
- }
-
- return SemaRef.BuildExpressionFromIntegralTemplateArgument(Arg,
- E->getParameterPackLocation());
+ return transformNonTypeTemplateParmRef(E->getParameterPack(),
+ E->getParameterPackLocation(),
+ Arg);
}
ExprResult
@@ -1327,7 +1337,7 @@ TypeSourceInfo *Sema::SubstType(TypeSourceInfo *T,
"Cannot perform an instantiation without some context on the "
"instantiation stack");
- if (!T->getType()->isDependentType() &&
+ if (!T->getType()->isInstantiationDependentType() &&
!T->getType()->isVariablyModifiedType())
return T;
@@ -1346,7 +1356,7 @@ TypeSourceInfo *Sema::SubstType(TypeLoc TL,
if (TL.getType().isNull())
return 0;
- if (!TL.getType()->isDependentType() &&
+ if (!TL.getType()->isInstantiationDependentType() &&
!TL.getType()->isVariablyModifiedType()) {
// FIXME: Make a copy of the TypeLoc data here, so that we can
// return a new TypeSourceInfo. Inefficient!
@@ -1375,7 +1385,7 @@ QualType Sema::SubstType(QualType T,
// If T is not a dependent type or a variably-modified type, there
// is nothing to do.
- if (!T->isDependentType() && !T->isVariablyModifiedType())
+ if (!T->isInstantiationDependentType() && !T->isVariablyModifiedType())
return T;
TemplateInstantiator Instantiator(*this, TemplateArgs, Loc, Entity);
@@ -1383,7 +1393,8 @@ QualType Sema::SubstType(QualType T,
}
static bool NeedsInstantiationAsFunctionType(TypeSourceInfo *T) {
- if (T->getType()->isDependentType() || T->getType()->isVariablyModifiedType())
+ if (T->getType()->isInstantiationDependentType() ||
+ T->getType()->isVariablyModifiedType())
return true;
TypeLoc TL = T->getTypeLoc().IgnoreParens();
@@ -1397,7 +1408,7 @@ static bool NeedsInstantiationAsFunctionType(TypeSourceInfo *T) {
// The parameter's type as written might be dependent even if the
// decayed type was not dependent.
if (TypeSourceInfo *TSInfo = P->getTypeSourceInfo())
- if (TSInfo->getType()->isDependentType())
+ if (TSInfo->getType()->isInstantiationDependentType())
return true;
// TODO: currently we always rebuild expressions. When we
@@ -1798,9 +1809,11 @@ Sema::InstantiateClass(SourceLocation PointOfInstantiation,
ExprResult NewInit = SubstExpr(OldInit, TemplateArgs);
// If the initialization is no longer dependent, check it now.
- if ((OldField->getType()->isDependentType() || OldInit->isTypeDependent())
- && !NewField->getType()->isDependentType()
- && !NewInit.get()->isTypeDependent()) {
+ if ((OldField->getType()->isDependentType() || OldInit->isTypeDependent() ||
+ OldInit->isValueDependent()) &&
+ !NewField->getType()->isDependentType() &&
+ !NewInit.get()->isTypeDependent() &&
+ !NewInit.get()->isValueDependent()) {
// FIXME: handle list-initialization
SourceLocation EqualLoc = NewField->getLocation();
NewInit = PerformCopyInitialization(
diff --git a/contrib/llvm/tools/clang/lib/Sema/SemaTemplateInstantiateDecl.cpp b/contrib/llvm/tools/clang/lib/Sema/SemaTemplateInstantiateDecl.cpp
index e78aa29..29385e5 100644
--- a/contrib/llvm/tools/clang/lib/Sema/SemaTemplateInstantiateDecl.cpp
+++ b/contrib/llvm/tools/clang/lib/Sema/SemaTemplateInstantiateDecl.cpp
@@ -59,7 +59,7 @@ bool TemplateDeclInstantiator::SubstQualifier(const TagDecl *OldDecl,
// FIXME: Is this still too simple?
void Sema::InstantiateAttrs(const MultiLevelTemplateArgumentList &TemplateArgs,
- Decl *Tmpl, Decl *New) {
+ const Decl *Tmpl, Decl *New) {
for (AttrVec::const_iterator i = Tmpl->attr_begin(), e = Tmpl->attr_end();
i != e; ++i) {
const Attr *TmplAttr = *i;
@@ -132,7 +132,7 @@ Decl *TemplateDeclInstantiator::InstantiateTypedefNameDecl(TypedefNameDecl *D,
bool IsTypeAlias) {
bool Invalid = false;
TypeSourceInfo *DI = D->getTypeSourceInfo();
- if (DI->getType()->isDependentType() ||
+ if (DI->getType()->isInstantiationDependentType() ||
DI->getType()->isVariablyModifiedType()) {
DI = SemaRef.SubstType(DI, TemplateArgs,
D->getLocation(), D->getDeclName());
@@ -415,8 +415,10 @@ Decl *TemplateDeclInstantiator::VisitVarDecl(VarDecl *D) {
!Var->isCXXForRangeDecl())
SemaRef.ActOnUninitializedDecl(Var, false);
- // Diagnose unused local variables.
- if (!Var->isInvalidDecl() && Owner->isFunctionOrMethod() && !Var->isUsed())
+ // Diagnose unused local variables with dependent types, where the diagnostic
+ // will have been deferred.
+ if (!Var->isInvalidDecl() && Owner->isFunctionOrMethod() && !Var->isUsed() &&
+ D->getType()->isDependentType())
SemaRef.DiagnoseUnusedDecl(Var);
return Var;
@@ -433,7 +435,7 @@ Decl *TemplateDeclInstantiator::VisitAccessSpecDecl(AccessSpecDecl *D) {
Decl *TemplateDeclInstantiator::VisitFieldDecl(FieldDecl *D) {
bool Invalid = false;
TypeSourceInfo *DI = D->getTypeSourceInfo();
- if (DI->getType()->isDependentType() ||
+ if (DI->getType()->isInstantiationDependentType() ||
DI->getType()->isVariablyModifiedType()) {
DI = SemaRef.SubstType(DI, TemplateArgs,
D->getLocation(), D->getDeclName());
@@ -1088,9 +1090,26 @@ Decl *TemplateDeclInstantiator::VisitFunctionDecl(FunctionDecl *D,
Function->setLexicalDeclContext(LexicalDC);
// Attach the parameters
- for (unsigned P = 0; P < Params.size(); ++P)
- if (Params[P])
- Params[P]->setOwningFunction(Function);
+ if (isa<FunctionProtoType>(Function->getType().IgnoreParens())) {
+ // Adopt the already-instantiated parameters into our own context.
+ for (unsigned P = 0; P < Params.size(); ++P)
+ if (Params[P])
+ Params[P]->setOwningFunction(Function);
+ } else {
+ // Since we were instantiated via a typedef of a function type, create
+ // new parameters.
+ const FunctionProtoType *Proto
+ = Function->getType()->getAs<FunctionProtoType>();
+ assert(Proto && "No function prototype in template instantiation?");
+ for (FunctionProtoType::arg_type_iterator AI = Proto->arg_type_begin(),
+ AE = Proto->arg_type_end(); AI != AE; ++AI) {
+ ParmVarDecl *Param
+ = SemaRef.BuildParmVarDeclForTypedef(Function, Function->getLocation(),
+ *AI);
+ Param->setScopeInfo(0, Params.size());
+ Params.push_back(Param);
+ }
+ }
Function->setParams(Params.data(), Params.size());
SourceLocation InstantiateAtPOI;
@@ -2264,7 +2283,12 @@ TemplateDeclInstantiator::InitFunctionInstantiation(FunctionDecl *New,
EPI));
}
- SemaRef.InstantiateAttrs(TemplateArgs, Tmpl, New);
+ const FunctionDecl* Definition = Tmpl;
+
+ // Get the definition. Leaves the variable unchanged if undefined.
+ Tmpl->isDefined(Definition);
+
+ SemaRef.InstantiateAttrs(TemplateArgs, Definition, New);
return false;
}
diff --git a/contrib/llvm/tools/clang/lib/Sema/SemaTemplateVariadic.cpp b/contrib/llvm/tools/clang/lib/Sema/SemaTemplateVariadic.cpp
index 86d3bc1..daa1523 100644
--- a/contrib/llvm/tools/clang/lib/Sema/SemaTemplateVariadic.cpp
+++ b/contrib/llvm/tools/clang/lib/Sema/SemaTemplateVariadic.cpp
@@ -716,17 +716,19 @@ ExprResult Sema::ActOnSizeofParameterPackExpr(Scope *S,
case LookupResult::NotFound:
case LookupResult::NotFoundInCurrentInstantiation:
- if (DeclarationName CorrectedName = CorrectTypo(R, S, 0, 0, false,
- CTC_NoKeywords)) {
- if (NamedDecl *CorrectedResult = R.getAsSingle<NamedDecl>())
+ if (TypoCorrection Corrected = CorrectTypo(R.getLookupNameInfo(),
+ R.getLookupKind(), S, 0, 0,
+ false, CTC_NoKeywords)) {
+ if (NamedDecl *CorrectedResult = Corrected.getCorrectionDecl())
if (CorrectedResult->isParameterPack()) {
+ std::string CorrectedQuotedStr(Corrected.getQuoted(getLangOptions()));
ParameterPack = CorrectedResult;
Diag(NameLoc, diag::err_sizeof_pack_no_pack_name_suggest)
- << &Name << CorrectedName
- << FixItHint::CreateReplacement(NameLoc,
- CorrectedName.getAsString());
+ << &Name << CorrectedQuotedStr
+ << FixItHint::CreateReplacement(
+ NameLoc, Corrected.getAsString(getLangOptions()));
Diag(ParameterPack->getLocation(), diag::note_parameter_pack_here)
- << CorrectedName;
+ << CorrectedQuotedStr;
}
}
diff --git a/contrib/llvm/tools/clang/lib/Sema/SemaType.cpp b/contrib/llvm/tools/clang/lib/Sema/SemaType.cpp
index 5fd8afa..f3e73ec 100644
--- a/contrib/llvm/tools/clang/lib/Sema/SemaType.cpp
+++ b/contrib/llvm/tools/clang/lib/Sema/SemaType.cpp
@@ -26,36 +26,11 @@
#include "clang/Basic/TargetInfo.h"
#include "clang/Lex/Preprocessor.h"
#include "clang/Sema/DeclSpec.h"
+#include "clang/Sema/DelayedDiagnostic.h"
#include "llvm/ADT/SmallPtrSet.h"
#include "llvm/Support/ErrorHandling.h"
using namespace clang;
-/// \brief Perform adjustment on the parameter type of a function.
-///
-/// This routine adjusts the given parameter type @p T to the actual
-/// parameter type used by semantic analysis (C99 6.7.5.3p[7,8],
-/// C++ [dcl.fct]p3). The adjusted parameter type is returned.
-QualType Sema::adjustParameterType(QualType T) {
- // C99 6.7.5.3p7:
- // A declaration of a parameter as "array of type" shall be
- // adjusted to "qualified pointer to type", where the type
- // qualifiers (if any) are those specified within the [ and ] of
- // the array type derivation.
- if (T->isArrayType())
- return Context.getArrayDecayedType(T);
-
- // C99 6.7.5.3p8:
- // A declaration of a parameter as "function returning type"
- // shall be adjusted to "pointer to function returning type", as
- // in 6.3.2.1.
- if (T->isFunctionType())
- return Context.getPointerType(T);
-
- return T;
-}
-
-
-
/// isOmittedBlockReturnType - Return true if this declarator is missing a
/// return type because this is a omitted return type on a block literal.
static bool isOmittedBlockReturnType(const Declarator &D) {
@@ -86,6 +61,11 @@ static void diagnoseBadTypeAttribute(Sema &S, const AttributeList &attr,
useInstantiationLoc = true;
break;
+ case AttributeList::AT_objc_ownership:
+ diagID = diag::warn_objc_object_attribute_wrong_type;
+ useInstantiationLoc = true;
+ break;
+
default:
// Assume everything else was a function attribute.
diagID = diag::warn_function_attribute_wrong_type;
@@ -110,7 +90,8 @@ static void diagnoseBadTypeAttribute(Sema &S, const AttributeList &attr,
// objc_gc applies to Objective-C pointers or, otherwise, to the
// smallest available pointer type (i.e. 'void*' in 'void**').
#define OBJC_POINTER_TYPE_ATTRS_CASELIST \
- case AttributeList::AT_objc_gc
+ case AttributeList::AT_objc_gc: \
+ case AttributeList::AT_objc_ownership
// Function type attributes.
#define FUNCTION_TYPE_ATTRS_CASELIST \
@@ -295,11 +276,15 @@ static bool handleFunctionTypeAttr(TypeProcessingState &state,
static bool handleObjCGCTypeAttr(TypeProcessingState &state,
AttributeList &attr, QualType &type);
+static bool handleObjCOwnershipTypeAttr(TypeProcessingState &state,
+ AttributeList &attr, QualType &type);
+
static bool handleObjCPointerTypeAttr(TypeProcessingState &state,
AttributeList &attr, QualType &type) {
- // Right now, we have exactly one of these attributes: objc_gc.
- assert(attr.getKind() == AttributeList::AT_objc_gc);
- return handleObjCGCTypeAttr(state, attr, type);
+ if (attr.getKind() == AttributeList::AT_objc_gc)
+ return handleObjCGCTypeAttr(state, attr, type);
+ assert(attr.getKind() == AttributeList::AT_objc_ownership);
+ return handleObjCOwnershipTypeAttr(state, attr, type);
}
/// Given that an objc_gc attribute was written somewhere on a
@@ -447,7 +432,12 @@ distributeFunctionTypeAttrToInnermost(TypeProcessingState &state,
return true;
}
- return handleFunctionTypeAttr(state, attr, declSpecType);
+ if (handleFunctionTypeAttr(state, attr, declSpecType)) {
+ spliceAttrOutOfList(attr, attrList);
+ return true;
+ }
+
+ return false;
}
/// A function type attribute was written in the decl spec. Try to
@@ -512,6 +502,11 @@ static void distributeTypeAttrsFromDeclarator(TypeProcessingState &state,
distributeObjCPointerTypeAttrFromDeclarator(state, *attr, declSpecType);
break;
+ case AttributeList::AT_ns_returns_retained:
+ if (!state.getSema().getLangOptions().ObjCAutoRefCount)
+ break;
+ // fallthrough
+
FUNCTION_TYPE_ATTRS_CASELIST:
distributeFunctionTypeAttrFromDeclarator(state, *attr, declSpecType);
break;
@@ -560,6 +555,7 @@ static void maybeSynthesizeBlockSignature(TypeProcessingState &state,
/*args*/ 0, 0,
/*type quals*/ 0,
/*ref-qualifier*/true, SourceLocation(),
+ /*mutable qualifier*/SourceLocation(),
/*EH*/ EST_None, SourceLocation(), 0, 0, 0, 0,
/*parens*/ loc, loc,
declarator));
@@ -575,10 +571,11 @@ static void maybeSynthesizeBlockSignature(TypeProcessingState &state,
/// \param D the declarator containing the declaration specifier.
/// \returns The type described by the declaration specifiers. This function
/// never returns null.
-static QualType ConvertDeclSpecToType(Sema &S, TypeProcessingState &state) {
+static QualType ConvertDeclSpecToType(TypeProcessingState &state) {
// FIXME: Should move the logic from DeclSpec::Finish to here for validity
// checking.
+ Sema &S = state.getSema();
Declarator &declarator = state.getDeclarator();
const DeclSpec &DS = declarator.getDeclSpec();
SourceLocation DeclLoc = declarator.getIdentifierLoc();
@@ -1017,6 +1014,51 @@ QualType Sema::BuildParenType(QualType T) {
return Context.getParenType(T);
}
+/// Given that we're building a pointer or reference to the given
+static QualType inferARCLifetimeForPointee(Sema &S, QualType type,
+ SourceLocation loc,
+ bool isReference) {
+ // Bail out if retention is unrequired or already specified.
+ if (!type->isObjCLifetimeType() ||
+ type.getObjCLifetime() != Qualifiers::OCL_None)
+ return type;
+
+ Qualifiers::ObjCLifetime implicitLifetime = Qualifiers::OCL_None;
+
+ // If the object type is const-qualified, we can safely use
+ // __unsafe_unretained. This is safe (because there are no read
+ // barriers), and it'll be safe to coerce anything but __weak* to
+ // the resulting type.
+ if (type.isConstQualified()) {
+ implicitLifetime = Qualifiers::OCL_ExplicitNone;
+
+ // Otherwise, check whether the static type does not require
+ // retaining. This currently only triggers for Class (possibly
+ // protocol-qualifed, and arrays thereof).
+ } else if (type->isObjCARCImplicitlyUnretainedType()) {
+ implicitLifetime = Qualifiers::OCL_ExplicitNone;
+
+ // If that failed, give an error and recover using __autoreleasing.
+ } else {
+ // These types can show up in private ivars in system headers, so
+ // we need this to not be an error in those cases. Instead we
+ // want to delay.
+ if (S.DelayedDiagnostics.shouldDelayDiagnostics()) {
+ S.DelayedDiagnostics.add(
+ sema::DelayedDiagnostic::makeForbiddenType(loc,
+ diag::err_arc_indirect_no_ownership, type, isReference));
+ } else {
+ S.Diag(loc, diag::err_arc_indirect_no_ownership) << type << isReference;
+ }
+ implicitLifetime = Qualifiers::OCL_Autoreleasing;
+ }
+ assert(implicitLifetime && "didn't infer any lifetime!");
+
+ Qualifiers qs;
+ qs.addObjCLifetime(implicitLifetime);
+ return S.Context.getQualifiedType(type, qs);
+}
+
/// \brief Build a pointer type.
///
/// \param T The type to which we'll be building a pointer.
@@ -1041,6 +1083,10 @@ QualType Sema::BuildPointerType(QualType T,
assert(!T->isObjCObjectType() && "Should build ObjCObjectPointerType");
+ // In ARC, it is forbidden to build pointers to unqualified pointers.
+ if (getLangOptions().ObjCAutoRefCount)
+ T = inferARCLifetimeForPointee(*this, T, Loc, /*reference*/ false);
+
// Build the pointer type.
return Context.getPointerType(T);
}
@@ -1094,12 +1140,38 @@ QualType Sema::BuildReferenceType(QualType T, bool SpelledAsLValue,
return QualType();
}
+ // In ARC, it is forbidden to build references to unqualified pointers.
+ if (getLangOptions().ObjCAutoRefCount)
+ T = inferARCLifetimeForPointee(*this, T, Loc, /*reference*/ true);
+
// Handle restrict on references.
if (LValueRef)
return Context.getLValueReferenceType(T, SpelledAsLValue);
return Context.getRValueReferenceType(T);
}
+/// Check whether the specified array size makes the array type a VLA. If so,
+/// return true, if not, return the size of the array in SizeVal.
+static bool isArraySizeVLA(Expr *ArraySize, llvm::APSInt &SizeVal, Sema &S) {
+ // If the size is an ICE, it certainly isn't a VLA.
+ if (ArraySize->isIntegerConstantExpr(SizeVal, S.Context))
+ return false;
+
+ // If we're in a GNU mode (like gnu99, but not c99) accept any evaluatable
+ // value as an extension.
+ Expr::EvalResult Result;
+ if (S.LangOpts.GNUMode && ArraySize->Evaluate(Result, S.Context)) {
+ if (!Result.hasSideEffects() && Result.Val.isInt()) {
+ SizeVal = Result.Val.getInt();
+ S.Diag(ArraySize->getLocStart(), diag::ext_vla_folded_to_constant);
+ return false;
+ }
+ }
+
+ return true;
+}
+
+
/// \brief Build an array type.
///
/// \param T The type of each element in the array.
@@ -1200,11 +1272,13 @@ QualType Sema::BuildArrayType(QualType T, ArrayType::ArraySizeModifier ASM,
T = Context.getIncompleteArrayType(T, ASM, Quals);
} else if (ArraySize->isTypeDependent() || ArraySize->isValueDependent()) {
T = Context.getDependentSizedArrayType(T, ArraySize, ASM, Quals, Brackets);
- } else if (!ArraySize->isIntegerConstantExpr(ConstVal, Context) ||
- (!T->isDependentType() && !T->isIncompleteType() &&
- !T->isConstantSizeType())) {
- // Per C99, a variable array is an array with either a non-constant
- // size or an element type that has a non-constant-size
+ } else if (!T->isDependentType() && !T->isIncompleteType() &&
+ !T->isConstantSizeType()) {
+ // C99: an array with an element type that has a non-constant-size is a VLA.
+ T = Context.getVariableArrayType(T, ArraySize, ASM, Quals, Brackets);
+ } else if (isArraySizeVLA(ArraySize, ConstVal, *this)) {
+ // C99: an array with a non-ICE size is a VLA. We accept any expression
+ // that we can fold to a non-zero positive value as an extension.
T = Context.getVariableArrayType(T, ArraySize, ASM, Quals, Brackets);
} else {
// C99 6.7.5.2p1: If the expression is a constant expression, it shall
@@ -1242,10 +1316,12 @@ QualType Sema::BuildArrayType(QualType T, ArrayType::ArraySizeModifier ASM,
if (!getLangOptions().C99) {
if (T->isVariableArrayType()) {
// Prohibit the use of non-POD types in VLAs.
+ QualType BaseT = Context.getBaseElementType(T);
if (!T->isDependentType() &&
- !Context.getBaseElementType(T)->isPODType()) {
+ !BaseT.isPODType(Context) &&
+ !BaseT->isObjCLifetimeType()) {
Diag(Loc, diag::err_vla_non_pod)
- << Context.getBaseElementType(T);
+ << BaseT;
return QualType();
}
// Prohibit the use of VLAs during template argument deduction.
@@ -1296,8 +1372,7 @@ QualType Sema::BuildExtVectorType(QualType T, Expr *ArraySize,
return QualType();
}
- if (!T->isDependentType())
- return Context.getExtVectorType(T, vectorSize);
+ return Context.getExtVectorType(T, vectorSize);
}
return Context.getDependentSizedExtVectorType(T, ArraySize, AttrLoc);
@@ -1347,7 +1422,7 @@ QualType Sema::BuildFunctionType(QualType T,
bool Invalid = false;
for (unsigned Idx = 0; Idx < NumParamTypes; ++Idx) {
- QualType ParamType = adjustParameterType(ParamTypes[Idx]);
+ QualType ParamType = Context.getAdjustedParameterType(ParamTypes[Idx]);
if (ParamType->isVoidType()) {
Diag(Loc, diag::err_param_with_void_type);
Invalid = true;
@@ -1467,6 +1542,109 @@ QualType Sema::GetTypeFromParser(ParsedType Ty, TypeSourceInfo **TInfo) {
return QT;
}
+static void transferARCOwnershipToDeclaratorChunk(TypeProcessingState &state,
+ Qualifiers::ObjCLifetime ownership,
+ unsigned chunkIndex);
+
+/// Given that this is the declaration of a parameter under ARC,
+/// attempt to infer attributes and such for pointer-to-whatever
+/// types.
+static void inferARCWriteback(TypeProcessingState &state,
+ QualType &declSpecType) {
+ Sema &S = state.getSema();
+ Declarator &declarator = state.getDeclarator();
+
+ // TODO: should we care about decl qualifiers?
+
+ // Check whether the declarator has the expected form. We walk
+ // from the inside out in order to make the block logic work.
+ unsigned outermostPointerIndex = 0;
+ bool isBlockPointer = false;
+ unsigned numPointers = 0;
+ for (unsigned i = 0, e = declarator.getNumTypeObjects(); i != e; ++i) {
+ unsigned chunkIndex = i;
+ DeclaratorChunk &chunk = declarator.getTypeObject(chunkIndex);
+ switch (chunk.Kind) {
+ case DeclaratorChunk::Paren:
+ // Ignore parens.
+ break;
+
+ case DeclaratorChunk::Reference:
+ case DeclaratorChunk::Pointer:
+ // Count the number of pointers. Treat references
+ // interchangeably as pointers; if they're mis-ordered, normal
+ // type building will discover that.
+ outermostPointerIndex = chunkIndex;
+ numPointers++;
+ break;
+
+ case DeclaratorChunk::BlockPointer:
+ // If we have a pointer to block pointer, that's an acceptable
+ // indirect reference; anything else is not an application of
+ // the rules.
+ if (numPointers != 1) return;
+ numPointers++;
+ outermostPointerIndex = chunkIndex;
+ isBlockPointer = true;
+
+ // We don't care about pointer structure in return values here.
+ goto done;
+
+ case DeclaratorChunk::Array: // suppress if written (id[])?
+ case DeclaratorChunk::Function:
+ case DeclaratorChunk::MemberPointer:
+ return;
+ }
+ }
+ done:
+
+ // If we have *one* pointer, then we want to throw the qualifier on
+ // the declaration-specifiers, which means that it needs to be a
+ // retainable object type.
+ if (numPointers == 1) {
+ // If it's not a retainable object type, the rule doesn't apply.
+ if (!declSpecType->isObjCRetainableType()) return;
+
+ // If it already has lifetime, don't do anything.
+ if (declSpecType.getObjCLifetime()) return;
+
+ // Otherwise, modify the type in-place.
+ Qualifiers qs;
+
+ if (declSpecType->isObjCARCImplicitlyUnretainedType())
+ qs.addObjCLifetime(Qualifiers::OCL_ExplicitNone);
+ else
+ qs.addObjCLifetime(Qualifiers::OCL_Autoreleasing);
+ declSpecType = S.Context.getQualifiedType(declSpecType, qs);
+
+ // If we have *two* pointers, then we want to throw the qualifier on
+ // the outermost pointer.
+ } else if (numPointers == 2) {
+ // If we don't have a block pointer, we need to check whether the
+ // declaration-specifiers gave us something that will turn into a
+ // retainable object pointer after we slap the first pointer on it.
+ if (!isBlockPointer && !declSpecType->isObjCObjectType())
+ return;
+
+ // Look for an explicit lifetime attribute there.
+ DeclaratorChunk &chunk = declarator.getTypeObject(outermostPointerIndex);
+ if (chunk.Kind != DeclaratorChunk::Pointer &&
+ chunk.Kind != DeclaratorChunk::BlockPointer)
+ return;
+ for (const AttributeList *attr = chunk.getAttrs(); attr;
+ attr = attr->getNext())
+ if (attr->getKind() == AttributeList::AT_objc_ownership)
+ return;
+
+ transferARCOwnershipToDeclaratorChunk(state, Qualifiers::OCL_Autoreleasing,
+ outermostPointerIndex);
+
+ // Any other number of pointers/references does not trigger the rule.
+ } else return;
+
+ // TODO: mark whether we did this inference?
+}
+
static void DiagnoseIgnoredQualifiers(unsigned Quals,
SourceLocation ConstQualLoc,
SourceLocation VolatileQualLoc,
@@ -1513,47 +1691,28 @@ static void DiagnoseIgnoredQualifiers(unsigned Quals,
<< QualStr << NumQuals << ConstFixIt << VolatileFixIt << RestrictFixIt;
}
-/// GetTypeForDeclarator - Convert the type for the specified
-/// declarator to Type instances.
-///
-/// If OwnedDecl is non-NULL, and this declarator's decl-specifier-seq
-/// owns the declaration of a type (e.g., the definition of a struct
-/// type), then *OwnedDecl will receive the owned declaration.
-///
-/// The result of this call will never be null, but the associated
-/// type may be a null type if there's an unrecoverable error.
-TypeSourceInfo *Sema::GetTypeForDeclarator(Declarator &D, Scope *S,
- TagDecl **OwnedDecl,
- bool AutoAllowedInTypeName) {
- // Determine the type of the declarator. Not all forms of declarator
- // have a type.
+static QualType GetDeclSpecTypeForDeclarator(TypeProcessingState &state,
+ TypeSourceInfo *&ReturnTypeInfo) {
+ Sema &SemaRef = state.getSema();
+ Declarator &D = state.getDeclarator();
QualType T;
- TypeSourceInfo *ReturnTypeInfo = 0;
-
- TypeProcessingState state(*this, D);
+ ReturnTypeInfo = 0;
- // In C++0x, deallocation functions (normal and array operator delete)
- // are implicitly noexcept.
- bool ImplicitlyNoexcept = false;
+ // The TagDecl owned by the DeclSpec.
+ TagDecl *OwnedTagDecl = 0;
switch (D.getName().getKind()) {
+ case UnqualifiedId::IK_ImplicitSelfParam:
case UnqualifiedId::IK_OperatorFunctionId:
- if (getLangOptions().CPlusPlus0x) {
- OverloadedOperatorKind OO = D.getName().OperatorFunctionId.Operator;
- if (OO == OO_Delete || OO == OO_Array_Delete)
- ImplicitlyNoexcept = true;
- }
- // Intentional fall-through.
case UnqualifiedId::IK_Identifier:
case UnqualifiedId::IK_LiteralOperatorId:
case UnqualifiedId::IK_TemplateId:
- T = ConvertDeclSpecToType(*this, state);
+ T = ConvertDeclSpecToType(state);
if (!D.isInvalidType() && D.getDeclSpec().isTypeSpecOwned()) {
- TagDecl* Owned = cast<TagDecl>(D.getDeclSpec().getRepAsDecl());
+ OwnedTagDecl = cast<TagDecl>(D.getDeclSpec().getRepAsDecl());
// Owned declaration is embedded in declarator.
- Owned->setEmbeddedInDeclarator(true);
- if (OwnedDecl) *OwnedDecl = Owned;
+ OwnedTagDecl->setEmbeddedInDeclarator(true);
}
break;
@@ -1562,14 +1721,14 @@ TypeSourceInfo *Sema::GetTypeForDeclarator(Declarator &D, Scope *S,
case UnqualifiedId::IK_DestructorName:
// Constructors and destructors don't have return types. Use
// "void" instead.
- T = Context.VoidTy;
+ T = SemaRef.Context.VoidTy;
break;
case UnqualifiedId::IK_ConversionFunctionId:
// The result type of a conversion function is the type that it
// converts to.
- T = GetTypeFromParser(D.getName().ConversionFunctionId,
- &ReturnTypeInfo);
+ T = SemaRef.GetTypeFromParser(D.getName().ConversionFunctionId,
+ &ReturnTypeInfo);
break;
}
@@ -1581,7 +1740,7 @@ TypeSourceInfo *Sema::GetTypeForDeclarator(Declarator &D, Scope *S,
// type (this is checked later) and we can skip this. In other languages
// using auto, we need to check regardless.
if (D.getDeclSpec().getTypeSpecType() == DeclSpec::TST_auto &&
- (!getLangOptions().CPlusPlus0x || !D.isFunctionDeclarator())) {
+ (!SemaRef.getLangOptions().CPlusPlus0x || !D.isFunctionDeclarator())) {
int Error = -1;
switch (D.getContext()) {
@@ -1595,7 +1754,7 @@ TypeSourceInfo *Sema::GetTypeForDeclarator(Declarator &D, Scope *S,
case Declarator::MemberContext:
if (D.getDeclSpec().getStorageClassSpec() == DeclSpec::SCS_static)
break;
- switch (cast<TagDecl>(CurContext)->getTagKind()) {
+ switch (cast<TagDecl>(SemaRef.CurContext)->getTagKind()) {
case TTK_Enum: assert(0 && "unhandled tag kind"); break;
case TTK_Struct: Error = 1; /* Struct member */ break;
case TTK_Union: Error = 2; /* Union member */ break;
@@ -1603,6 +1762,7 @@ TypeSourceInfo *Sema::GetTypeForDeclarator(Declarator &D, Scope *S,
}
break;
case Declarator::CXXCatchContext:
+ case Declarator::ObjCCatchContext:
Error = 4; // Exception declaration
break;
case Declarator::TemplateParamContext:
@@ -1619,13 +1779,13 @@ TypeSourceInfo *Sema::GetTypeForDeclarator(Declarator &D, Scope *S,
Error = 9; // Type alias
break;
case Declarator::TypeNameContext:
- if (!AutoAllowedInTypeName)
- Error = 11; // Generic
+ Error = 11; // Generic
break;
case Declarator::FileContext:
case Declarator::BlockContext:
case Declarator::ForContext:
case Declarator::ConditionContext:
+ case Declarator::CXXNewContext:
break;
}
@@ -1640,7 +1800,7 @@ TypeSourceInfo *Sema::GetTypeForDeclarator(Declarator &D, Scope *S,
// contains a trailing return type. That is only legal at the outermost
// level. Check all declarator chunks (outermost first) anyway, to give
// better diagnostics.
- if (getLangOptions().CPlusPlus0x && Error != -1) {
+ if (SemaRef.getLangOptions().CPlusPlus0x && Error != -1) {
for (unsigned i = 0, e = D.getNumTypeObjects(); i != e; ++i) {
unsigned chunkIndex = e - i - 1;
state.setCurrentChunkIndex(chunkIndex);
@@ -1656,15 +1816,86 @@ TypeSourceInfo *Sema::GetTypeForDeclarator(Declarator &D, Scope *S,
}
if (Error != -1) {
- Diag(D.getDeclSpec().getTypeSpecTypeLoc(), diag::err_auto_not_allowed)
+ SemaRef.Diag(D.getDeclSpec().getTypeSpecTypeLoc(),
+ diag::err_auto_not_allowed)
<< Error;
- T = Context.IntTy;
+ T = SemaRef.Context.IntTy;
D.setInvalidType(true);
}
}
-
- if (T.isNull())
- return Context.getNullTypeSourceInfo();
+
+ if (SemaRef.getLangOptions().CPlusPlus &&
+ OwnedTagDecl && OwnedTagDecl->isDefinition()) {
+ // Check the contexts where C++ forbids the declaration of a new class
+ // or enumeration in a type-specifier-seq.
+ switch (D.getContext()) {
+ case Declarator::FileContext:
+ case Declarator::MemberContext:
+ case Declarator::BlockContext:
+ case Declarator::ForContext:
+ case Declarator::BlockLiteralContext:
+ // C++0x [dcl.type]p3:
+ // A type-specifier-seq shall not define a class or enumeration unless
+ // it appears in the type-id of an alias-declaration (7.1.3) that is not
+ // the declaration of a template-declaration.
+ case Declarator::AliasDeclContext:
+ break;
+ case Declarator::AliasTemplateContext:
+ SemaRef.Diag(OwnedTagDecl->getLocation(),
+ diag::err_type_defined_in_alias_template)
+ << SemaRef.Context.getTypeDeclType(OwnedTagDecl);
+ break;
+ case Declarator::TypeNameContext:
+ case Declarator::TemplateParamContext:
+ case Declarator::CXXNewContext:
+ case Declarator::CXXCatchContext:
+ case Declarator::ObjCCatchContext:
+ case Declarator::TemplateTypeArgContext:
+ SemaRef.Diag(OwnedTagDecl->getLocation(),
+ diag::err_type_defined_in_type_specifier)
+ << SemaRef.Context.getTypeDeclType(OwnedTagDecl);
+ break;
+ case Declarator::PrototypeContext:
+ case Declarator::ObjCPrototypeContext:
+ case Declarator::KNRTypeListContext:
+ // C++ [dcl.fct]p6:
+ // Types shall not be defined in return or parameter types.
+ SemaRef.Diag(OwnedTagDecl->getLocation(),
+ diag::err_type_defined_in_param_type)
+ << SemaRef.Context.getTypeDeclType(OwnedTagDecl);
+ break;
+ case Declarator::ConditionContext:
+ // C++ 6.4p2:
+ // The type-specifier-seq shall not contain typedef and shall not declare
+ // a new class or enumeration.
+ SemaRef.Diag(OwnedTagDecl->getLocation(),
+ diag::err_type_defined_in_condition);
+ break;
+ }
+ }
+
+ return T;
+}
+
+static TypeSourceInfo *GetFullTypeForDeclarator(TypeProcessingState &state,
+ QualType declSpecType,
+ TypeSourceInfo *TInfo) {
+
+ QualType T = declSpecType;
+ Declarator &D = state.getDeclarator();
+ Sema &S = state.getSema();
+ ASTContext &Context = S.Context;
+ const LangOptions &LangOpts = S.getLangOptions();
+
+ bool ImplicitlyNoexcept = false;
+ if (D.getName().getKind() == UnqualifiedId::IK_OperatorFunctionId &&
+ LangOpts.CPlusPlus0x) {
+ OverloadedOperatorKind OO = D.getName().OperatorFunctionId.Operator;
+ /// In C++0x, deallocation functions (normal and array operator delete)
+ /// are implicitly noexcept.
+ if (OO == OO_Delete || OO == OO_Array_Delete)
+ ImplicitlyNoexcept = true;
+ }
// The name we're declaring, if any.
DeclarationName Name;
@@ -1687,56 +1918,56 @@ TypeSourceInfo *Sema::GetTypeForDeclarator(Declarator &D, Scope *S,
switch (DeclType.Kind) {
default: assert(0 && "Unknown decltype!");
case DeclaratorChunk::Paren:
- T = BuildParenType(T);
+ T = S.BuildParenType(T);
break;
case DeclaratorChunk::BlockPointer:
// If blocks are disabled, emit an error.
if (!LangOpts.Blocks)
- Diag(DeclType.Loc, diag::err_blocks_disable);
+ S.Diag(DeclType.Loc, diag::err_blocks_disable);
- T = BuildBlockPointerType(T, D.getIdentifierLoc(), Name);
+ T = S.BuildBlockPointerType(T, D.getIdentifierLoc(), Name);
if (DeclType.Cls.TypeQuals)
- T = BuildQualifiedType(T, DeclType.Loc, DeclType.Cls.TypeQuals);
+ T = S.BuildQualifiedType(T, DeclType.Loc, DeclType.Cls.TypeQuals);
break;
case DeclaratorChunk::Pointer:
// Verify that we're not building a pointer to pointer to function with
// exception specification.
- if (getLangOptions().CPlusPlus && CheckDistantExceptionSpec(T)) {
- Diag(D.getIdentifierLoc(), diag::err_distant_exception_spec);
+ if (LangOpts.CPlusPlus && S.CheckDistantExceptionSpec(T)) {
+ S.Diag(D.getIdentifierLoc(), diag::err_distant_exception_spec);
D.setInvalidType(true);
// Build the type anyway.
}
- if (getLangOptions().ObjC1 && T->getAs<ObjCObjectType>()) {
+ if (LangOpts.ObjC1 && T->getAs<ObjCObjectType>()) {
T = Context.getObjCObjectPointerType(T);
if (DeclType.Ptr.TypeQuals)
- T = BuildQualifiedType(T, DeclType.Loc, DeclType.Ptr.TypeQuals);
+ T = S.BuildQualifiedType(T, DeclType.Loc, DeclType.Ptr.TypeQuals);
break;
}
- T = BuildPointerType(T, DeclType.Loc, Name);
+ T = S.BuildPointerType(T, DeclType.Loc, Name);
if (DeclType.Ptr.TypeQuals)
- T = BuildQualifiedType(T, DeclType.Loc, DeclType.Ptr.TypeQuals);
+ T = S.BuildQualifiedType(T, DeclType.Loc, DeclType.Ptr.TypeQuals);
break;
case DeclaratorChunk::Reference: {
// Verify that we're not building a reference to pointer to function with
// exception specification.
- if (getLangOptions().CPlusPlus && CheckDistantExceptionSpec(T)) {
- Diag(D.getIdentifierLoc(), diag::err_distant_exception_spec);
+ if (LangOpts.CPlusPlus && S.CheckDistantExceptionSpec(T)) {
+ S.Diag(D.getIdentifierLoc(), diag::err_distant_exception_spec);
D.setInvalidType(true);
// Build the type anyway.
}
- T = BuildReferenceType(T, DeclType.Ref.LValueRef, DeclType.Loc, Name);
+ T = S.BuildReferenceType(T, DeclType.Ref.LValueRef, DeclType.Loc, Name);
Qualifiers Quals;
if (DeclType.Ref.HasRestrict)
- T = BuildQualifiedType(T, DeclType.Loc, Qualifiers::Restrict);
+ T = S.BuildQualifiedType(T, DeclType.Loc, Qualifiers::Restrict);
break;
}
case DeclaratorChunk::Array: {
// Verify that we're not building an array of pointers to function with
// exception specification.
- if (getLangOptions().CPlusPlus && CheckDistantExceptionSpec(T)) {
- Diag(D.getIdentifierLoc(), diag::err_distant_exception_spec);
+ if (LangOpts.CPlusPlus && S.CheckDistantExceptionSpec(T)) {
+ S.Diag(D.getIdentifierLoc(), diag::err_distant_exception_spec);
D.setInvalidType(true);
// Build the type anyway.
}
@@ -1753,13 +1984,13 @@ TypeSourceInfo *Sema::GetTypeForDeclarator(Declarator &D, Scope *S,
// FIXME: This check isn't quite right: it allows star in prototypes
// for function definitions, and disallows some edge cases detailed
// in http://gcc.gnu.org/ml/gcc-patches/2009-02/msg00133.html
- Diag(DeclType.Loc, diag::err_array_star_outside_prototype);
+ S.Diag(DeclType.Loc, diag::err_array_star_outside_prototype);
ASM = ArrayType::Normal;
D.setInvalidType(true);
}
- T = BuildArrayType(T, ASM, ArraySize,
- Qualifiers::fromCVRMask(ATI.TypeQuals),
- SourceRange(DeclType.Loc, DeclType.EndLoc), Name);
+ T = S.BuildArrayType(T, ASM, ArraySize,
+ Qualifiers::fromCVRMask(ATI.TypeQuals),
+ SourceRange(DeclType.Loc, DeclType.EndLoc), Name);
break;
}
case DeclaratorChunk::Function: {
@@ -1775,27 +2006,27 @@ TypeSourceInfo *Sema::GetTypeForDeclarator(Declarator &D, Scope *S,
// and not, for instance, a pointer to a function.
if (D.getDeclSpec().getTypeSpecType() == DeclSpec::TST_auto &&
!FTI.TrailingReturnType && chunkIndex == 0) {
- Diag(D.getDeclSpec().getTypeSpecTypeLoc(),
+ S.Diag(D.getDeclSpec().getTypeSpecTypeLoc(),
diag::err_auto_missing_trailing_return);
T = Context.IntTy;
D.setInvalidType(true);
} else if (FTI.TrailingReturnType) {
// T must be exactly 'auto' at this point. See CWG issue 681.
if (isa<ParenType>(T)) {
- Diag(D.getDeclSpec().getTypeSpecTypeLoc(),
+ S.Diag(D.getDeclSpec().getTypeSpecTypeLoc(),
diag::err_trailing_return_in_parens)
<< T << D.getDeclSpec().getSourceRange();
D.setInvalidType(true);
} else if (T.hasQualifiers() || !isa<AutoType>(T)) {
- Diag(D.getDeclSpec().getTypeSpecTypeLoc(),
+ S.Diag(D.getDeclSpec().getTypeSpecTypeLoc(),
diag::err_trailing_return_without_auto)
<< T << D.getDeclSpec().getSourceRange();
D.setInvalidType(true);
}
- T = GetTypeFromParser(
+ T = S.GetTypeFromParser(
ParsedType::getFromOpaquePtr(FTI.TrailingReturnType),
- &ReturnTypeInfo);
+ &TInfo);
}
}
@@ -1809,7 +2040,7 @@ TypeSourceInfo *Sema::GetTypeForDeclarator(Declarator &D, Scope *S,
if (chunkIndex == 0 &&
D.getContext() == Declarator::BlockLiteralContext)
diagID = diag::err_block_returning_array_function;
- Diag(DeclType.Loc, diagID) << T->isFunctionType() << T;
+ S.Diag(DeclType.Loc, diagID) << T->isFunctionType() << T;
T = Context.IntTy;
D.setInvalidType(true);
}
@@ -1818,7 +2049,7 @@ TypeSourceInfo *Sema::GetTypeForDeclarator(Declarator &D, Scope *S,
// class type in C++.
if (isa<PointerType>(T) && T.getLocalCVRQualifiers() &&
(D.getName().getKind() != UnqualifiedId::IK_ConversionFunctionId) &&
- (!getLangOptions().CPlusPlus || !T->isDependentType())) {
+ (!LangOpts.CPlusPlus || !T->isDependentType())) {
assert(chunkIndex + 1 < e && "No DeclaratorChunk for the return type?");
DeclaratorChunk ReturnTypeChunk = D.getTypeObject(chunkIndex + 1);
assert(ReturnTypeChunk.Kind == DeclaratorChunk::Pointer);
@@ -1829,43 +2060,43 @@ TypeSourceInfo *Sema::GetTypeForDeclarator(Declarator &D, Scope *S,
SourceLocation::getFromRawEncoding(PTI.ConstQualLoc),
SourceLocation::getFromRawEncoding(PTI.VolatileQualLoc),
SourceLocation::getFromRawEncoding(PTI.RestrictQualLoc),
- *this);
+ S);
} else if (T.getCVRQualifiers() && D.getDeclSpec().getTypeQualifiers() &&
- (!getLangOptions().CPlusPlus ||
+ (!LangOpts.CPlusPlus ||
(!T->isDependentType() && !T->isRecordType()))) {
DiagnoseIgnoredQualifiers(D.getDeclSpec().getTypeQualifiers(),
D.getDeclSpec().getConstSpecLoc(),
D.getDeclSpec().getVolatileSpecLoc(),
D.getDeclSpec().getRestrictSpecLoc(),
- *this);
+ S);
}
- if (getLangOptions().CPlusPlus && D.getDeclSpec().isTypeSpecOwned()) {
+ if (LangOpts.CPlusPlus && D.getDeclSpec().isTypeSpecOwned()) {
// C++ [dcl.fct]p6:
// Types shall not be defined in return or parameter types.
TagDecl *Tag = cast<TagDecl>(D.getDeclSpec().getRepAsDecl());
if (Tag->isDefinition())
- Diag(Tag->getLocation(), diag::err_type_defined_in_result_type)
+ S.Diag(Tag->getLocation(), diag::err_type_defined_in_result_type)
<< Context.getTypeDeclType(Tag);
}
// Exception specs are not allowed in typedefs. Complain, but add it
// anyway.
if (IsTypedefName && FTI.getExceptionSpecType())
- Diag(FTI.getExceptionSpecLoc(), diag::err_exception_spec_in_typedef)
+ S.Diag(FTI.getExceptionSpecLoc(), diag::err_exception_spec_in_typedef)
<< (D.getContext() == Declarator::AliasDeclContext ||
D.getContext() == Declarator::AliasTemplateContext);
- if (!FTI.NumArgs && !FTI.isVariadic && !getLangOptions().CPlusPlus) {
+ if (!FTI.NumArgs && !FTI.isVariadic && !LangOpts.CPlusPlus) {
// Simple void foo(), where the incoming T is the result type.
T = Context.getFunctionNoProtoType(T);
} else {
// We allow a zero-parameter variadic function in C if the
// function is marked with the "overloadable" attribute. Scan
// for this attribute now.
- if (!FTI.NumArgs && FTI.isVariadic && !getLangOptions().CPlusPlus) {
+ if (!FTI.NumArgs && FTI.isVariadic && !LangOpts.CPlusPlus) {
bool Overloadable = false;
for (const AttributeList *Attrs = D.getAttributes();
Attrs; Attrs = Attrs->getNext()) {
@@ -1876,13 +2107,13 @@ TypeSourceInfo *Sema::GetTypeForDeclarator(Declarator &D, Scope *S,
}
if (!Overloadable)
- Diag(FTI.getEllipsisLoc(), diag::err_ellipsis_first_arg);
+ S.Diag(FTI.getEllipsisLoc(), diag::err_ellipsis_first_arg);
}
if (FTI.NumArgs && FTI.ArgInfo[0].Param == 0) {
// C99 6.7.5.3p3: Reject int(x,y,z) when it's not a function
// definition.
- Diag(FTI.ArgInfo[0].IdentLoc, diag::err_ident_list_in_fn_declaration);
+ S.Diag(FTI.ArgInfo[0].IdentLoc, diag::err_ident_list_in_fn_declaration);
D.setInvalidType(true);
break;
}
@@ -1899,13 +2130,18 @@ TypeSourceInfo *Sema::GetTypeForDeclarator(Declarator &D, Scope *S,
llvm::SmallVector<QualType, 16> ArgTys;
ArgTys.reserve(FTI.NumArgs);
+ llvm::SmallVector<bool, 16> ConsumedArguments;
+ ConsumedArguments.reserve(FTI.NumArgs);
+ bool HasAnyConsumedArguments = false;
+
for (unsigned i = 0, e = FTI.NumArgs; i != e; ++i) {
ParmVarDecl *Param = cast<ParmVarDecl>(FTI.ArgInfo[i].Param);
QualType ArgTy = Param->getType();
assert(!ArgTy.isNull() && "Couldn't parse type?");
// Adjust the parameter type.
- assert((ArgTy == adjustParameterType(ArgTy)) && "Unadjusted type?");
+ assert((ArgTy == Context.getAdjustedParameterType(ArgTy)) &&
+ "Unadjusted type?");
// Look for 'void'. void is allowed only as a single argument to a
// function with no other parameters (C99 6.7.5.3p10). We record
@@ -1915,19 +2151,19 @@ TypeSourceInfo *Sema::GetTypeForDeclarator(Declarator &D, Scope *S,
// is an incomplete type (C99 6.2.5p19) and function decls cannot
// have arguments of incomplete type.
if (FTI.NumArgs != 1 || FTI.isVariadic) {
- Diag(DeclType.Loc, diag::err_void_only_param);
+ S.Diag(DeclType.Loc, diag::err_void_only_param);
ArgTy = Context.IntTy;
Param->setType(ArgTy);
} else if (FTI.ArgInfo[i].Ident) {
// Reject, but continue to parse 'int(void abc)'.
- Diag(FTI.ArgInfo[i].IdentLoc,
+ S.Diag(FTI.ArgInfo[i].IdentLoc,
diag::err_param_with_void_type);
ArgTy = Context.IntTy;
Param->setType(ArgTy);
} else {
// Reject, but continue to parse 'float(const void)'.
if (ArgTy.hasQualifiers())
- Diag(DeclType.Loc, diag::err_void_param_qualified);
+ S.Diag(DeclType.Loc, diag::err_void_param_qualified);
// Do not add 'void' to the ArgTys list.
break;
@@ -1944,19 +2180,28 @@ TypeSourceInfo *Sema::GetTypeForDeclarator(Declarator &D, Scope *S,
}
}
+ if (LangOpts.ObjCAutoRefCount) {
+ bool Consumed = Param->hasAttr<NSConsumedAttr>();
+ ConsumedArguments.push_back(Consumed);
+ HasAnyConsumedArguments |= Consumed;
+ }
+
ArgTys.push_back(ArgTy);
}
+ if (HasAnyConsumedArguments)
+ EPI.ConsumedArguments = ConsumedArguments.data();
+
llvm::SmallVector<QualType, 4> Exceptions;
EPI.ExceptionSpecType = FTI.getExceptionSpecType();
if (FTI.getExceptionSpecType() == EST_Dynamic) {
Exceptions.reserve(FTI.NumExceptions);
for (unsigned ei = 0, ee = FTI.NumExceptions; ei != ee; ++ei) {
// FIXME: Preserve type source info.
- QualType ET = GetTypeFromParser(FTI.Exceptions[ei].Ty);
+ QualType ET = S.GetTypeFromParser(FTI.Exceptions[ei].Ty);
// Check that the type is valid for an exception spec, and
// drop it if not.
- if (!CheckSpecifiedExceptionType(ET, FTI.Exceptions[ei].Range))
+ if (!S.CheckSpecifiedExceptionType(ET, FTI.Exceptions[ei].Range))
Exceptions.push_back(ET);
}
EPI.NumExceptions = Exceptions.size();
@@ -1973,7 +2218,7 @@ TypeSourceInfo *Sema::GetTypeForDeclarator(Declarator &D, Scope *S,
if (!NoexceptExpr->isValueDependent() &&
!NoexceptExpr->isIntegerConstantExpr(Dummy, Context, &ErrLoc,
/*evaluated*/false))
- Diag(ErrLoc, diag::err_noexcept_needs_constant_expression)
+ S.Diag(ErrLoc, diag::err_noexcept_needs_constant_expression)
<< NoexceptExpr->getSourceRange();
else
EPI.NoexceptExpr = NoexceptExpr;
@@ -1996,8 +2241,8 @@ TypeSourceInfo *Sema::GetTypeForDeclarator(Declarator &D, Scope *S,
if (SS.isInvalid()) {
// Avoid emitting extra errors if we already errored on the scope.
D.setInvalidType(true);
- } else if (isDependentScopeSpecifier(SS) ||
- dyn_cast_or_null<CXXRecordDecl>(computeDeclContext(SS))) {
+ } else if (S.isDependentScopeSpecifier(SS) ||
+ dyn_cast_or_null<CXXRecordDecl>(S.computeDeclContext(SS))) {
NestedNameSpecifier *NNS
= static_cast<NestedNameSpecifier*>(SS.getScopeRep());
NestedNameSpecifier *NNSPrefix = NNS->getPrefix();
@@ -2026,7 +2271,7 @@ TypeSourceInfo *Sema::GetTypeForDeclarator(Declarator &D, Scope *S,
break;
}
} else {
- Diag(DeclType.Mem.Scope().getBeginLoc(),
+ S.Diag(DeclType.Mem.Scope().getBeginLoc(),
diag::err_illegal_decl_mempointer_in_nonclass)
<< (D.getIdentifier() ? D.getIdentifier()->getName() : "type name")
<< DeclType.Mem.Scope().getRange();
@@ -2034,12 +2279,12 @@ TypeSourceInfo *Sema::GetTypeForDeclarator(Declarator &D, Scope *S,
}
if (!ClsType.isNull())
- T = BuildMemberPointerType(T, ClsType, DeclType.Loc, D.getIdentifier());
+ T = S.BuildMemberPointerType(T, ClsType, DeclType.Loc, D.getIdentifier());
if (T.isNull()) {
T = Context.IntTy;
D.setInvalidType(true);
} else if (DeclType.Mem.TypeQuals) {
- T = BuildQualifiedType(T, DeclType.Loc, DeclType.Mem.TypeQuals);
+ T = S.BuildQualifiedType(T, DeclType.Loc, DeclType.Mem.TypeQuals);
}
break;
}
@@ -2054,7 +2299,7 @@ TypeSourceInfo *Sema::GetTypeForDeclarator(Declarator &D, Scope *S,
processTypeAttrs(state, T, false, attrs);
}
- if (getLangOptions().CPlusPlus && T->isFunctionType()) {
+ if (LangOpts.CPlusPlus && T->isFunctionType()) {
const FunctionProtoType *FnTy = T->getAs<FunctionProtoType>();
assert(FnTy && "Why oh why is there not a FunctionProtoType here?");
@@ -2071,7 +2316,7 @@ TypeSourceInfo *Sema::GetTypeForDeclarator(Declarator &D, Scope *S,
FreeFunction = (D.getContext() != Declarator::MemberContext ||
D.getDeclSpec().isFriendSpecified());
} else {
- DeclContext *DC = computeDeclContext(D.getCXXScopeSpec());
+ DeclContext *DC = S.computeDeclContext(D.getCXXScopeSpec());
FreeFunction = (DC && !DC->isRecord());
}
@@ -2109,16 +2354,16 @@ TypeSourceInfo *Sema::GetTypeForDeclarator(Declarator &D, Scope *S,
break;
}
- Diag(D.getIdentifierLoc(),
+ S.Diag(D.getIdentifierLoc(),
diag::ext_qualified_function_type_template_arg)
<< Quals;
} else {
if (FnTy->getTypeQuals() != 0) {
if (D.isFunctionDeclarator())
- Diag(D.getIdentifierLoc(),
+ S.Diag(D.getIdentifierLoc(),
diag::err_invalid_qualified_function_type);
else
- Diag(D.getIdentifierLoc(),
+ S.Diag(D.getIdentifierLoc(),
diag::err_invalid_qualified_typedef_function_type_use)
<< FreeFunction;
}
@@ -2135,11 +2380,11 @@ TypeSourceInfo *Sema::GetTypeForDeclarator(Declarator &D, Scope *S,
}
}
- Diag(Loc, diag::err_invalid_ref_qualifier_function_type)
+ S.Diag(Loc, diag::err_invalid_ref_qualifier_function_type)
<< (FnTy->getRefQualifier() == RQ_LValue)
<< FixItHint::CreateRemoval(Loc);
} else {
- Diag(D.getIdentifierLoc(),
+ S.Diag(D.getIdentifierLoc(),
diag::err_invalid_ref_qualifier_typedef_function_type_use)
<< FreeFunction
<< (FnTy->getRefQualifier() == RQ_LValue);
@@ -2192,7 +2437,7 @@ TypeSourceInfo *Sema::GetTypeForDeclarator(Declarator &D, Scope *S,
// We represent function parameter packs as function parameters whose
// type is a pack expansion.
if (!T->containsUnexpandedParameterPack()) {
- Diag(D.getEllipsisLoc(),
+ S.Diag(D.getEllipsisLoc(),
diag::err_function_parameter_pack_without_parameter_packs)
<< T << D.getSourceRange();
D.setEllipsisLoc(SourceLocation());
@@ -2212,14 +2457,15 @@ TypeSourceInfo *Sema::GetTypeForDeclarator(Declarator &D, Scope *S,
// it expands those parameter packs.
if (T->containsUnexpandedParameterPack())
T = Context.getPackExpansionType(T, llvm::Optional<unsigned>());
- else if (!getLangOptions().CPlusPlus0x)
- Diag(D.getEllipsisLoc(), diag::ext_variadic_templates);
+ else if (!LangOpts.CPlusPlus0x)
+ S.Diag(D.getEllipsisLoc(), diag::ext_variadic_templates);
break;
case Declarator::FileContext:
case Declarator::KNRTypeListContext:
case Declarator::ObjCPrototypeContext: // FIXME: special diagnostic here?
case Declarator::TypeNameContext:
+ case Declarator::CXXNewContext:
case Declarator::AliasDeclContext:
case Declarator::AliasTemplateContext:
case Declarator::MemberContext:
@@ -2227,11 +2473,12 @@ TypeSourceInfo *Sema::GetTypeForDeclarator(Declarator &D, Scope *S,
case Declarator::ForContext:
case Declarator::ConditionContext:
case Declarator::CXXCatchContext:
+ case Declarator::ObjCCatchContext:
case Declarator::BlockLiteralContext:
case Declarator::TemplateTypeArgContext:
// FIXME: We may want to allow parameter packs in block-literal contexts
// in the future.
- Diag(D.getEllipsisLoc(), diag::err_ellipsis_in_declarator_not_parameter);
+ S.Diag(D.getEllipsisLoc(), diag::err_ellipsis_in_declarator_not_parameter);
D.setEllipsisLoc(SourceLocation());
break;
}
@@ -2241,7 +2488,138 @@ TypeSourceInfo *Sema::GetTypeForDeclarator(Declarator &D, Scope *S,
return Context.getNullTypeSourceInfo();
else if (D.isInvalidType())
return Context.getTrivialTypeSourceInfo(T);
- return GetTypeSourceInfoForDeclarator(D, T, ReturnTypeInfo);
+
+ return S.GetTypeSourceInfoForDeclarator(D, T, TInfo);
+}
+
+/// GetTypeForDeclarator - Convert the type for the specified
+/// declarator to Type instances.
+///
+/// The result of this call will never be null, but the associated
+/// type may be a null type if there's an unrecoverable error.
+TypeSourceInfo *Sema::GetTypeForDeclarator(Declarator &D, Scope *S) {
+ // Determine the type of the declarator. Not all forms of declarator
+ // have a type.
+
+ TypeProcessingState state(*this, D);
+
+ TypeSourceInfo *ReturnTypeInfo = 0;
+ QualType T = GetDeclSpecTypeForDeclarator(state, ReturnTypeInfo);
+ if (T.isNull())
+ return Context.getNullTypeSourceInfo();
+
+ if (D.isPrototypeContext() && getLangOptions().ObjCAutoRefCount)
+ inferARCWriteback(state, T);
+
+ return GetFullTypeForDeclarator(state, T, ReturnTypeInfo);
+}
+
+static void transferARCOwnershipToDeclSpec(Sema &S,
+ QualType &declSpecTy,
+ Qualifiers::ObjCLifetime ownership) {
+ if (declSpecTy->isObjCRetainableType() &&
+ declSpecTy.getObjCLifetime() == Qualifiers::OCL_None) {
+ Qualifiers qs;
+ qs.addObjCLifetime(ownership);
+ declSpecTy = S.Context.getQualifiedType(declSpecTy, qs);
+ }
+}
+
+static void transferARCOwnershipToDeclaratorChunk(TypeProcessingState &state,
+ Qualifiers::ObjCLifetime ownership,
+ unsigned chunkIndex) {
+ Sema &S = state.getSema();
+ Declarator &D = state.getDeclarator();
+
+ // Look for an explicit lifetime attribute.
+ DeclaratorChunk &chunk = D.getTypeObject(chunkIndex);
+ for (const AttributeList *attr = chunk.getAttrs(); attr;
+ attr = attr->getNext())
+ if (attr->getKind() == AttributeList::AT_objc_ownership)
+ return;
+
+ const char *attrStr = 0;
+ switch (ownership) {
+ case Qualifiers::OCL_None: llvm_unreachable("no ownership!"); break;
+ case Qualifiers::OCL_ExplicitNone: attrStr = "none"; break;
+ case Qualifiers::OCL_Strong: attrStr = "strong"; break;
+ case Qualifiers::OCL_Weak: attrStr = "weak"; break;
+ case Qualifiers::OCL_Autoreleasing: attrStr = "autoreleasing"; break;
+ }
+
+ // If there wasn't one, add one (with an invalid source location
+ // so that we don't make an AttributedType for it).
+ AttributeList *attr = D.getAttributePool()
+ .create(&S.Context.Idents.get("objc_ownership"), SourceLocation(),
+ /*scope*/ 0, SourceLocation(),
+ &S.Context.Idents.get(attrStr), SourceLocation(),
+ /*args*/ 0, 0,
+ /*declspec*/ false, /*C++0x*/ false);
+ spliceAttrIntoList(*attr, chunk.getAttrListRef());
+
+ // TODO: mark whether we did this inference?
+}
+
+static void transferARCOwnership(TypeProcessingState &state,
+ QualType &declSpecTy,
+ Qualifiers::ObjCLifetime ownership) {
+ Sema &S = state.getSema();
+ Declarator &D = state.getDeclarator();
+
+ int inner = -1;
+ for (unsigned i = 0, e = D.getNumTypeObjects(); i != e; ++i) {
+ DeclaratorChunk &chunk = D.getTypeObject(i);
+ switch (chunk.Kind) {
+ case DeclaratorChunk::Paren:
+ // Ignore parens.
+ break;
+
+ case DeclaratorChunk::Array:
+ case DeclaratorChunk::Reference:
+ case DeclaratorChunk::Pointer:
+ inner = i;
+ break;
+
+ case DeclaratorChunk::BlockPointer:
+ return transferARCOwnershipToDeclaratorChunk(state, ownership, i);
+
+ case DeclaratorChunk::Function:
+ case DeclaratorChunk::MemberPointer:
+ return;
+ }
+ }
+
+ if (inner == -1)
+ return transferARCOwnershipToDeclSpec(S, declSpecTy, ownership);
+
+ DeclaratorChunk &chunk = D.getTypeObject(inner);
+ if (chunk.Kind == DeclaratorChunk::Pointer) {
+ if (declSpecTy->isObjCRetainableType())
+ return transferARCOwnershipToDeclSpec(S, declSpecTy, ownership);
+ if (declSpecTy->isObjCObjectType())
+ return transferARCOwnershipToDeclaratorChunk(state, ownership, inner);
+ } else {
+ assert(chunk.Kind == DeclaratorChunk::Array ||
+ chunk.Kind == DeclaratorChunk::Reference);
+ return transferARCOwnershipToDeclSpec(S, declSpecTy, ownership);
+ }
+}
+
+TypeSourceInfo *Sema::GetTypeForDeclaratorCast(Declarator &D, QualType FromTy) {
+ TypeProcessingState state(*this, D);
+
+ TypeSourceInfo *ReturnTypeInfo = 0;
+ QualType declSpecTy = GetDeclSpecTypeForDeclarator(state, ReturnTypeInfo);
+ if (declSpecTy.isNull())
+ return Context.getNullTypeSourceInfo();
+
+ if (getLangOptions().ObjCAutoRefCount) {
+ Qualifiers::ObjCLifetime ownership = Context.getInnerObjCOwnership(FromTy);
+ if (ownership != Qualifiers::OCL_None)
+ transferARCOwnership(state, declSpecTy, ownership);
+ }
+
+ return GetFullTypeForDeclarator(state, declSpecTy, ReturnTypeInfo);
}
/// Map an AttributedType::Kind to an AttributeList::Kind.
@@ -2259,6 +2637,8 @@ static AttributeList::Kind getAttrListKind(AttributedType::Kind kind) {
return AttributeList::AT_neon_polyvector_type;
case AttributedType::attr_objc_gc:
return AttributeList::AT_objc_gc;
+ case AttributedType::attr_objc_ownership:
+ return AttributeList::AT_objc_ownership;
case AttributedType::attr_noreturn:
return AttributeList::AT_noreturn;
case AttributedType::attr_cdecl:
@@ -2489,6 +2869,9 @@ namespace {
llvm_unreachable("qualified type locs not expected here!");
}
+ void VisitAttributedTypeLoc(AttributedTypeLoc TL) {
+ fillAttributedTypeLoc(TL, Chunk.getAttrs());
+ }
void VisitBlockPointerTypeLoc(BlockPointerTypeLoc TL) {
assert(Chunk.Kind == DeclaratorChunk::BlockPointer);
TL.setCaretLoc(Chunk.Loc);
@@ -2657,8 +3040,7 @@ TypeResult Sema::ActOnTypeName(Scope *S, Declarator &D) {
// the parser.
assert(D.getIdentifier() == 0 && "Type name should have no identifier!");
- TagDecl *OwnedTag = 0;
- TypeSourceInfo *TInfo = GetTypeForDeclarator(D, S, &OwnedTag);
+ TypeSourceInfo *TInfo = GetTypeForDeclarator(D, S);
QualType T = TInfo->getType();
if (D.isInvalidType())
return true;
@@ -2666,26 +3048,11 @@ TypeResult Sema::ActOnTypeName(Scope *S, Declarator &D) {
if (getLangOptions().CPlusPlus) {
// Check that there are no default arguments (C++ only).
CheckExtraCXXDefaultArguments(D);
-
- // C++0x [dcl.type]p3:
- // A type-specifier-seq shall not define a class or enumeration unless
- // it appears in the type-id of an alias-declaration (7.1.3) that is not
- // the declaration of a template-declaration.
- if (OwnedTag && OwnedTag->isDefinition()) {
- if (D.getContext() == Declarator::AliasTemplateContext)
- Diag(OwnedTag->getLocation(), diag::err_type_defined_in_alias_template)
- << Context.getTypeDeclType(OwnedTag);
- else if (D.getContext() != Declarator::AliasDeclContext)
- Diag(OwnedTag->getLocation(), diag::err_type_defined_in_type_specifier)
- << Context.getTypeDeclType(OwnedTag);
- }
}
return CreateParsedType(T, TInfo);
}
-
-
//===----------------------------------------------------------------------===//
// Type Attribute Processing
//===----------------------------------------------------------------------===//
@@ -2744,6 +3111,99 @@ static void HandleAddressSpaceTypeAttribute(QualType &Type,
Type = S.Context.getAddrSpaceQualType(Type, ASIdx);
}
+/// handleObjCOwnershipTypeAttr - Process an objc_ownership
+/// attribute on the specified type.
+///
+/// Returns 'true' if the attribute was handled.
+static bool handleObjCOwnershipTypeAttr(TypeProcessingState &state,
+ AttributeList &attr,
+ QualType &type) {
+ if (!type->isObjCRetainableType() && !type->isDependentType())
+ return false;
+
+ Sema &S = state.getSema();
+
+ if (type.getQualifiers().getObjCLifetime()) {
+ S.Diag(attr.getLoc(), diag::err_attr_objc_ownership_redundant)
+ << type;
+ return true;
+ }
+
+ if (!attr.getParameterName()) {
+ S.Diag(attr.getLoc(), diag::err_attribute_argument_n_not_string)
+ << "objc_ownership" << 1;
+ attr.setInvalid();
+ return true;
+ }
+
+ Qualifiers::ObjCLifetime lifetime;
+ if (attr.getParameterName()->isStr("none"))
+ lifetime = Qualifiers::OCL_ExplicitNone;
+ else if (attr.getParameterName()->isStr("strong"))
+ lifetime = Qualifiers::OCL_Strong;
+ else if (attr.getParameterName()->isStr("weak"))
+ lifetime = Qualifiers::OCL_Weak;
+ else if (attr.getParameterName()->isStr("autoreleasing"))
+ lifetime = Qualifiers::OCL_Autoreleasing;
+ else {
+ S.Diag(attr.getLoc(), diag::warn_attribute_type_not_supported)
+ << "objc_ownership" << attr.getParameterName();
+ attr.setInvalid();
+ return true;
+ }
+
+ // Consume lifetime attributes without further comment outside of
+ // ARC mode.
+ if (!S.getLangOptions().ObjCAutoRefCount)
+ return true;
+
+ Qualifiers qs;
+ qs.setObjCLifetime(lifetime);
+ QualType origType = type;
+ type = S.Context.getQualifiedType(type, qs);
+
+ // If we have a valid source location for the attribute, use an
+ // AttributedType instead.
+ if (attr.getLoc().isValid())
+ type = S.Context.getAttributedType(AttributedType::attr_objc_ownership,
+ origType, type);
+
+ // Forbid __weak if the runtime doesn't support it.
+ if (lifetime == Qualifiers::OCL_Weak &&
+ !S.getLangOptions().ObjCRuntimeHasWeak) {
+
+ // Actually, delay this until we know what we're parsing.
+ if (S.DelayedDiagnostics.shouldDelayDiagnostics()) {
+ S.DelayedDiagnostics.add(
+ sema::DelayedDiagnostic::makeForbiddenType(attr.getLoc(),
+ diag::err_arc_weak_no_runtime, type, /*ignored*/ 0));
+ } else {
+ S.Diag(attr.getLoc(), diag::err_arc_weak_no_runtime);
+ }
+
+ attr.setInvalid();
+ return true;
+ }
+
+ // Forbid __weak for class objects marked as
+ // objc_arc_weak_reference_unavailable
+ if (lifetime == Qualifiers::OCL_Weak) {
+ QualType T = type;
+ while (const PointerType *ptr = T->getAs<PointerType>())
+ T = ptr->getPointeeType();
+ if (const ObjCObjectPointerType *ObjT = T->getAs<ObjCObjectPointerType>()) {
+ ObjCInterfaceDecl *Class = ObjT->getInterfaceDecl();
+ if (Class->isArcWeakrefUnavailable()) {
+ S.Diag(attr.getLoc(), diag::err_arc_unsupported_weak_class);
+ S.Diag(ObjT->getInterfaceDecl()->getLocation(),
+ diag::note_class_declared);
+ }
+ }
+ }
+
+ return true;
+}
+
/// handleObjCGCTypeAttr - Process the __attribute__((objc_gc)) type
/// attribute on the specified type. Returns true to indicate that
/// the attribute was handled, false to indicate that the type does
@@ -2954,6 +3414,23 @@ static bool handleFunctionTypeAttr(TypeProcessingState &state,
return true;
}
+ // ns_returns_retained is not always a type attribute, but if we got
+ // here, we're treating it as one right now.
+ if (attr.getKind() == AttributeList::AT_ns_returns_retained) {
+ assert(S.getLangOptions().ObjCAutoRefCount &&
+ "ns_returns_retained treated as type attribute in non-ARC");
+ if (attr.getNumArgs()) return true;
+
+ // Delay if this is not a function type.
+ if (!unwrapped.isFunctionType())
+ return false;
+
+ FunctionType::ExtInfo EI
+ = unwrapped.get()->getExtInfo().withProducesResult(true);
+ type = unwrapped.wrap(S, S.Context.adjustFunctionType(unwrapped.get(), EI));
+ return true;
+ }
+
if (attr.getKind() == AttributeList::AT_regparm) {
unsigned value;
if (S.CheckRegparmAttr(attr, value))
@@ -3127,6 +3604,40 @@ static void HandleVectorSizeAttr(QualType& CurType, const AttributeList &Attr,
VectorType::GenericVector);
}
+/// \brief Process the OpenCL-like ext_vector_type attribute when it occurs on
+/// a type.
+static void HandleExtVectorTypeAttr(QualType &CurType,
+ const AttributeList &Attr,
+ Sema &S) {
+ Expr *sizeExpr;
+
+ // Special case where the argument is a template id.
+ if (Attr.getParameterName()) {
+ CXXScopeSpec SS;
+ UnqualifiedId id;
+ id.setIdentifier(Attr.getParameterName(), Attr.getLoc());
+
+ ExprResult Size = S.ActOnIdExpression(S.getCurScope(), SS, id, false,
+ false);
+ if (Size.isInvalid())
+ return;
+
+ sizeExpr = Size.get();
+ } else {
+ // check the attribute arguments.
+ if (Attr.getNumArgs() != 1) {
+ S.Diag(Attr.getLoc(), diag::err_attribute_wrong_number_arguments) << 1;
+ return;
+ }
+ sizeExpr = Attr.getArg(0);
+ }
+
+ // Create the vector type.
+ QualType T = S.BuildExtVectorType(CurType, sizeExpr, Attr.getLoc());
+ if (!T.isNull())
+ CurType = T;
+}
+
/// HandleNeonVectorTypeAttr - The "neon_vector_type" and
/// "neon_polyvector_type" attributes are used to create vector types that
/// are mangled according to ARM's ABI. Otherwise, these types are identical
@@ -3217,6 +3728,11 @@ static void processTypeAttrs(TypeProcessingState &state, QualType &type,
case AttributeList::AT_vector_size:
HandleVectorSizeAttr(type, attr, state.getSema());
break;
+ case AttributeList::AT_ext_vector_type:
+ if (state.getDeclarator().getDeclSpec().getStorageClassSpec()
+ != DeclSpec::SCS_typedef)
+ HandleExtVectorTypeAttr(type, attr, state.getSema());
+ break;
case AttributeList::AT_neon_vector_type:
HandleNeonVectorTypeAttr(type, attr, state.getSema(),
VectorType::NeonVector, "neon_vector_type");
@@ -3226,11 +3742,15 @@ static void processTypeAttrs(TypeProcessingState &state, QualType &type,
VectorType::NeonPolyVector,
"neon_polyvector_type");
break;
-
case AttributeList::AT_opencl_image_access:
HandleOpenCLImageAccessAttribute(type, attr, state.getSema());
break;
+ case AttributeList::AT_ns_returns_retained:
+ if (!state.getSema().getLangOptions().ObjCAutoRefCount)
+ break;
+ // fallthrough into the function attrs
+
FUNCTION_TYPE_ATTRS_CASELIST:
// Never process function type attributes as part of the
// declaration-specifiers.
diff --git a/contrib/llvm/tools/clang/lib/Sema/TreeTransform.h b/contrib/llvm/tools/clang/lib/Sema/TreeTransform.h
index ff2e46a..fa87217 100644
--- a/contrib/llvm/tools/clang/lib/Sema/TreeTransform.h
+++ b/contrib/llvm/tools/clang/lib/Sema/TreeTransform.h
@@ -1192,6 +1192,16 @@ public:
Body);
}
+ /// \brief Build a new Objective-C @autoreleasepool statement.
+ ///
+ /// By default, performs semantic analysis to build the new statement.
+ /// Subclasses may override this routine to provide different behavior.
+ StmtResult RebuildObjCAutoreleasePoolStmt(SourceLocation AtLoc,
+ Stmt *Body) {
+ return getSema().ActOnObjCAutoreleasePoolStmt(AtLoc, Body);
+ }
+
+
/// \brief Build a new Objective-C fast enumeration statement.
///
/// By default, performs semantic analysis to build the new statement.
@@ -1537,9 +1547,9 @@ public:
/// By default, performs semantic analysis to build the new expression.
/// Subclasses may override this routine to provide different behavior.
ExprResult RebuildInitList(SourceLocation LBraceLoc,
- MultiExprArg Inits,
- SourceLocation RBraceLoc,
- QualType ResultTy) {
+ MultiExprArg Inits,
+ SourceLocation RBraceLoc,
+ QualType ResultTy) {
ExprResult Result
= SemaRef.ActOnInitList(LBraceLoc, move(Inits), RBraceLoc);
if (Result.isInvalid() || ResultTy->isDependentType())
@@ -1856,8 +1866,9 @@ public:
///
/// By default, performs semantic analysis to build the new expression.
/// Subclasses may override this routine to provide different behavior.
- ExprResult RebuildCXXThrowExpr(SourceLocation ThrowLoc, Expr *Sub) {
- return getSema().ActOnCXXThrow(ThrowLoc, Sub);
+ ExprResult RebuildCXXThrowExpr(SourceLocation ThrowLoc, Expr *Sub,
+ bool IsThrownVariableInScope) {
+ return getSema().BuildCXXThrow(ThrowLoc, Sub, IsThrownVariableInScope);
}
/// \brief Build a new C++ default-argument expression.
@@ -2466,6 +2477,10 @@ bool TreeTransform<Derived>::TransformExprs(Expr **Inputs,
Outputs.push_back(Out.get());
continue;
}
+
+ // Record right away that the argument was changed. This needs
+ // to happen even if the array expands to nothing.
+ if (ArgChanged) *ArgChanged = true;
// The transform has determined that we should perform an elementwise
// expansion of the pattern. Do so.
@@ -2482,8 +2497,6 @@ bool TreeTransform<Derived>::TransformExprs(Expr **Inputs,
return true;
}
- if (ArgChanged)
- *ArgChanged = true;
Outputs.push_back(Out.get());
}
@@ -3162,6 +3175,38 @@ TreeTransform<Derived>::TransformQualifiedType(TypeLocBuilder &TLB,
if (Result->isFunctionType() || Result->isReferenceType())
return Result;
+ // Suppress Objective-C lifetime qualifiers if they don't make sense for the
+ // resulting type.
+ if (Quals.hasObjCLifetime()) {
+ if (!Result->isObjCLifetimeType() && !Result->isDependentType())
+ Quals.removeObjCLifetime();
+ else if (Result.getObjCLifetime()) {
+ // Objective-C ARC:
+ // A lifetime qualifier applied to a substituted template parameter
+ // overrides the lifetime qualifier from the template argument.
+ if (const SubstTemplateTypeParmType *SubstTypeParam
+ = dyn_cast<SubstTemplateTypeParmType>(Result)) {
+ QualType Replacement = SubstTypeParam->getReplacementType();
+ Qualifiers Qs = Replacement.getQualifiers();
+ Qs.removeObjCLifetime();
+ Replacement
+ = SemaRef.Context.getQualifiedType(Replacement.getUnqualifiedType(),
+ Qs);
+ Result = SemaRef.Context.getSubstTemplateTypeParmType(
+ SubstTypeParam->getReplacedParameter(),
+ Replacement);
+ TLB.TypeWasModifiedSafely(Result);
+ } else {
+ // Otherwise, complain about the addition of a qualifier to an
+ // already-qualified type.
+ SourceRange R = TLB.getTemporaryTypeLoc(Result).getSourceRange();
+ SemaRef.Diag(R.getBegin(), diag::err_attr_objc_ownership_redundant)
+ << Result << R;
+
+ Quals.removeObjCLifetime();
+ }
+ }
+ }
if (!Quals.empty()) {
Result = SemaRef.BuildQualifiedType(Result, T.getBeginLoc(), Quals);
TLB.push<QualifiedTypeLoc>(Result);
@@ -3333,7 +3378,11 @@ QualType TreeTransform<Derived>::TransformPointerType(TypeLocBuilder &TLB,
if (Result.isNull())
return QualType();
}
-
+
+ // Objective-C ARC can add lifetime qualifiers to the type that we're
+ // pointing to.
+ TLB.TypeWasModifiedSafely(Result->getPointeeType());
+
PointerTypeLoc NewT = TLB.push<PointerTypeLoc>(Result);
NewT.setSigilLoc(TL.getSigilLoc());
return Result;
@@ -3387,6 +3436,11 @@ TreeTransform<Derived>::TransformReferenceType(TypeLocBuilder &TLB,
return QualType();
}
+ // Objective-C ARC can add lifetime qualifiers to the type that we're
+ // referring to.
+ TLB.TypeWasModifiedSafely(
+ Result->getAs<ReferenceType>()->getPointeeTypeAsWritten());
+
// r-value references can be rebuilt as l-value references.
ReferenceTypeLoc NewTL;
if (isa<LValueReferenceType>(Result))
@@ -5435,6 +5489,25 @@ TreeTransform<Derived>::TransformObjCAtSynchronizedStmt(
template<typename Derived>
StmtResult
+TreeTransform<Derived>::TransformObjCAutoreleasePoolStmt(
+ ObjCAutoreleasePoolStmt *S) {
+ // Transform the body.
+ StmtResult Body = getDerived().TransformStmt(S->getSubStmt());
+ if (Body.isInvalid())
+ return StmtError();
+
+ // If nothing changed, just retain this statement.
+ if (!getDerived().AlwaysRebuild() &&
+ Body.get() == S->getSubStmt())
+ return SemaRef.Owned(S);
+
+ // Build a new statement.
+ return getDerived().RebuildObjCAutoreleasePoolStmt(
+ S->getAtLoc(), Body.get());
+}
+
+template<typename Derived>
+StmtResult
TreeTransform<Derived>::TransformObjCForCollectionStmt(
ObjCForCollectionStmt *S) {
// Transform the element statement.
@@ -6721,7 +6794,8 @@ TreeTransform<Derived>::TransformCXXThrowExpr(CXXThrowExpr *E) {
SubExpr.get() == E->getSubExpr())
return SemaRef.Owned(E);
- return getDerived().RebuildCXXThrowExpr(E->getThrowLoc(), SubExpr.get());
+ return getDerived().RebuildCXXThrowExpr(E->getThrowLoc(), SubExpr.get(),
+ E->isThrownVariableInScope());
}
template<typename Derived>
@@ -6867,9 +6941,13 @@ TreeTransform<Derived>::TransformCXXNewExpr(CXXNewExpr *E) {
AllocType,
AllocTypeInfo,
ArraySize.get(),
- /*FIXME:*/E->getLocStart(),
+ /*FIXME:*/E->hasInitializer()
+ ? E->getLocStart()
+ : SourceLocation(),
move_arg(ConstructorArgs),
- E->getLocEnd());
+ /*FIXME:*/E->hasInitializer()
+ ? E->getLocEnd()
+ : SourceLocation());
}
template<typename Derived>
@@ -7587,6 +7665,21 @@ TreeTransform<Derived>::TransformSubstNonTypeTemplateParmPackExpr(
template<typename Derived>
ExprResult
+TreeTransform<Derived>::TransformSubstNonTypeTemplateParmExpr(
+ SubstNonTypeTemplateParmExpr *E) {
+ // Default behavior is to do nothing with this transformation.
+ return SemaRef.Owned(E);
+}
+
+template<typename Derived>
+ExprResult
+TreeTransform<Derived>::TransformMaterializeTemporaryExpr(
+ MaterializeTemporaryExpr *E) {
+ return getDerived().TransformExpr(E->GetTemporaryExpr());
+}
+
+template<typename Derived>
+ExprResult
TreeTransform<Derived>::TransformObjCStringLiteral(ObjCStringLiteral *E) {
return SemaRef.Owned(E);
}
@@ -7609,6 +7702,43 @@ TreeTransform<Derived>::TransformObjCEncodeExpr(ObjCEncodeExpr *E) {
}
template<typename Derived>
+ExprResult TreeTransform<Derived>::
+TransformObjCIndirectCopyRestoreExpr(ObjCIndirectCopyRestoreExpr *E) {
+ ExprResult result = getDerived().TransformExpr(E->getSubExpr());
+ if (result.isInvalid()) return ExprError();
+ Expr *subExpr = result.take();
+
+ if (!getDerived().AlwaysRebuild() &&
+ subExpr == E->getSubExpr())
+ return SemaRef.Owned(E);
+
+ return SemaRef.Owned(new(SemaRef.Context)
+ ObjCIndirectCopyRestoreExpr(subExpr, E->getType(), E->shouldCopy()));
+}
+
+template<typename Derived>
+ExprResult TreeTransform<Derived>::
+TransformObjCBridgedCastExpr(ObjCBridgedCastExpr *E) {
+ TypeSourceInfo *TSInfo
+ = getDerived().TransformType(E->getTypeInfoAsWritten());
+ if (!TSInfo)
+ return ExprError();
+
+ ExprResult Result = getDerived().TransformExpr(E->getSubExpr());
+ if (Result.isInvalid())
+ return ExprError();
+
+ if (!getDerived().AlwaysRebuild() &&
+ TSInfo == E->getTypeInfoAsWritten() &&
+ Result.get() == E->getSubExpr())
+ return SemaRef.Owned(E);
+
+ return SemaRef.BuildObjCBridgedCast(E->getLParenLoc(), E->getBridgeKind(),
+ E->getBridgeKeywordLoc(), TSInfo,
+ Result.get());
+}
+
+template<typename Derived>
ExprResult
TreeTransform<Derived>::TransformObjCMessageExpr(ObjCMessageExpr *E) {
// Transform arguments.
@@ -8227,11 +8357,24 @@ TreeTransform<Derived>::RebuildCXXOperatorCallExpr(OverloadedOperatorKind Op,
return SemaRef.CreateOverloadedUnaryOp(OpLoc, Opc, Functions, First);
}
- if (Op == OO_Subscript)
- return SemaRef.CreateOverloadedArraySubscriptExpr(Callee->getLocStart(),
- OpLoc,
- First,
- Second);
+ if (Op == OO_Subscript) {
+ SourceLocation LBrace;
+ SourceLocation RBrace;
+
+ if (DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(Callee)) {
+ DeclarationNameLoc &NameLoc = DRE->getNameInfo().getInfo();
+ LBrace = SourceLocation::getFromRawEncoding(
+ NameLoc.CXXOperatorName.BeginOpNameLoc);
+ RBrace = SourceLocation::getFromRawEncoding(
+ NameLoc.CXXOperatorName.EndOpNameLoc);
+ } else {
+ LBrace = Callee->getLocStart();
+ RBrace = OpLoc;
+ }
+
+ return SemaRef.CreateOverloadedArraySubscriptExpr(LBrace, RBrace,
+ First, Second);
+ }
// Create the overloaded operator invocation for binary operators.
BinaryOperatorKind Opc = BinaryOperator::getOverloadedOpcode(Op);
diff --git a/contrib/llvm/tools/clang/lib/Sema/TypeLocBuilder.h b/contrib/llvm/tools/clang/lib/Sema/TypeLocBuilder.h
index 3570737..7a5e43e 100644
--- a/contrib/llvm/tools/clang/lib/Sema/TypeLocBuilder.h
+++ b/contrib/llvm/tools/clang/lib/Sema/TypeLocBuilder.h
@@ -16,7 +16,6 @@
#define LLVM_CLANG_SEMA_TYPELOCBUILDER_H
#include "clang/AST/TypeLoc.h"
-#include "llvm/ADT/SmallVector.h"
#include "clang/AST/ASTContext.h"
namespace clang {
@@ -87,6 +86,14 @@ class TypeLocBuilder {
Index = Capacity;
}
+ /// \brief Tell the TypeLocBuilder that the type it is storing has been
+ /// modified in some safe way that doesn't affect type-location information.
+ void TypeWasModifiedSafely(QualType T) {
+#ifndef NDEBUG
+ LastTy = T;
+#endif
+ }
+
/// Pushes space for a new TypeLoc of the given type. Invalidates
/// any TypeLocs previously retrieved from this builder.
template <class TyLocType> TyLocType push(QualType T) {
@@ -139,7 +146,7 @@ private:
Index -= LocalSize;
- return getTypeLoc(T);
+ return getTemporaryTypeLoc(T);
}
/// Grow to the given capacity.
@@ -171,15 +178,17 @@ private:
reserve(Size);
Index -= Size;
- return getTypeLoc(T);
+ return getTemporaryTypeLoc(T);
}
-
- // This is private because, when we kill off TypeSourceInfo in favor
- // of TypeLoc, we'll want an interface that creates a TypeLoc given
- // an ASTContext, and we don't want people to think they can just
- // use this as an equivalent.
- TypeLoc getTypeLoc(QualType T) {
+public:
+ /// \brief Retrieve a temporary TypeLoc that refers into this \c TypeLocBuilder
+ /// object.
+ ///
+ /// The resulting \c TypeLoc should only be used so long as the
+ /// \c TypeLocBuilder is active and has not had more type information
+ /// pushed into it.
+ TypeLoc getTemporaryTypeLoc(QualType T) {
#ifndef NDEBUG
assert(LastTy == T && "type doesn't match last type pushed!");
#endif
diff --git a/contrib/llvm/tools/clang/lib/Serialization/ASTReader.cpp b/contrib/llvm/tools/clang/lib/Serialization/ASTReader.cpp
index 8fb20d2..a4ed5f4 100644
--- a/contrib/llvm/tools/clang/lib/Serialization/ASTReader.cpp
+++ b/contrib/llvm/tools/clang/lib/Serialization/ASTReader.cpp
@@ -147,9 +147,11 @@ PCHValidator::ReadLanguageOptions(const LangOptions &LangOpts) {
PARSE_LANGOPT_IMPORTANT(OpenCL, diag::warn_pch_opencl);
PARSE_LANGOPT_IMPORTANT(CUDA, diag::warn_pch_cuda);
PARSE_LANGOPT_BENIGN(CatchUndefined);
+ PARSE_LANGOPT_BENIGN(DefaultFPContract);
PARSE_LANGOPT_IMPORTANT(ElideConstructors, diag::warn_pch_elide_constructors);
PARSE_LANGOPT_BENIGN(SpellChecking);
- PARSE_LANGOPT_BENIGN(DefaultFPContract);
+ PARSE_LANGOPT_IMPORTANT(ObjCAutoRefCount, diag::warn_pch_auto_ref_count);
+ PARSE_LANGOPT_BENIGN(ObjCInferRelatedReturnType);
#undef PARSE_LANGOPT_IMPORTANT
#undef PARSE_LANGOPT_BENIGN
@@ -655,7 +657,8 @@ public:
// and associate it with the persistent ID.
IdentifierInfo *II = KnownII;
if (!II)
- II = &Reader.getIdentifierTable().getOwn(k.first, k.first + k.second);
+ II = &Reader.getIdentifierTable().getOwn(llvm::StringRef(k.first,
+ k.second));
Reader.SetIdentifierInfo(ID, II);
II->setIsFromAST();
return II;
@@ -682,7 +685,8 @@ public:
// the new IdentifierInfo.
IdentifierInfo *II = KnownII;
if (!II)
- II = &Reader.getIdentifierTable().getOwn(k.first, k.first + k.second);
+ II = &Reader.getIdentifierTable().getOwn(llvm::StringRef(k.first,
+ k.second));
Reader.SetIdentifierInfo(ID, II);
// Set or check the various bits in the IdentifierInfo structure.
@@ -999,8 +1003,7 @@ bool ASTReader::ParseLineTable(PerFileData &F,
std::string Filename(&Record[Idx], &Record[Idx] + FilenameLen);
Idx += FilenameLen;
MaybeAddSystemRootToFilename(Filename);
- FileIDs[I] = LineTable.getLineTableFilenameID(Filename.c_str(),
- Filename.size());
+ FileIDs[I] = LineTable.getLineTableFilenameID(Filename);
}
// Parse the line entries
@@ -1192,7 +1195,7 @@ ASTReader::ASTReadResult ASTReader::ReadSourceManagerBlock(PerFileData &F) {
case SM_SLOC_FILE_ENTRY:
case SM_SLOC_BUFFER_ENTRY:
- case SM_SLOC_INSTANTIATION_ENTRY:
+ case SM_SLOC_EXPANSION_ENTRY:
// Once we hit one of the source location entries, we're done.
return Success;
}
@@ -1362,7 +1365,7 @@ ASTReader::ASTReadResult ASTReader::ReadSLocEntryRecord(unsigned ID) {
break;
}
- case SM_SLOC_INSTANTIATION_ENTRY: {
+ case SM_SLOC_EXPANSION_ENTRY: {
SourceLocation SpellingLoc = ReadSourceLocation(*F, Record[1]);
SourceMgr.createInstantiationLoc(SpellingLoc,
ReadSourceLocation(*F, Record[2]),
@@ -1553,17 +1556,17 @@ PreprocessedEntity *ASTReader::LoadPreprocessedEntity(PerFileData &F) {
(PreprocessorDetailRecordTypes)F.PreprocessorDetailCursor.ReadRecord(
Code, Record, BlobStart, BlobLen);
switch (RecType) {
- case PPD_MACRO_INSTANTIATION: {
+ case PPD_MACRO_EXPANSION: {
if (PreprocessedEntity *PE = PPRec.getPreprocessedEntity(Record[0]))
return PE;
- MacroInstantiation *MI
- = new (PPRec) MacroInstantiation(DecodeIdentifierInfo(Record[3]),
+ MacroExpansion *ME =
+ new (PPRec) MacroExpansion(DecodeIdentifierInfo(Record[3]),
SourceRange(ReadSourceLocation(F, Record[1]),
ReadSourceLocation(F, Record[2])),
- getMacroDefinition(Record[4]));
- PPRec.SetPreallocatedEntity(Record[0], MI);
- return MI;
+ getMacroDefinition(Record[4]));
+ PPRec.SetPreallocatedEntity(Record[0], ME);
+ return ME;
}
case PPD_MACRO_DEFINITION: {
@@ -2366,6 +2369,15 @@ ASTReader::ReadASTBlock(PerFileData &F) {
TentativeDefinitions.insert(TentativeDefinitions.end(),
Record.begin(), Record.end());
break;
+
+ case KNOWN_NAMESPACES:
+ // Optimization for the first block.
+ if (KnownNamespaces.empty())
+ KnownNamespaces.swap(Record);
+ else
+ KnownNamespaces.insert(KnownNamespaces.end(),
+ Record.begin(), Record.end());
+ break;
}
First = false;
}
@@ -2980,6 +2992,7 @@ bool ASTReader::ParseLanguageOptions(
PARSE_LANGOPT(ElideConstructors);
PARSE_LANGOPT(SpellChecking);
PARSE_LANGOPT(MRTD);
+ PARSE_LANGOPT(ObjCAutoRefCount);
#undef PARSE_LANGOPT
return Listener->ReadLanguageOptions(LangOpts);
@@ -3225,12 +3238,13 @@ QualType ASTReader::ReadTypeRecord(unsigned Index) {
}
case TYPE_FUNCTION_NO_PROTO: {
- if (Record.size() != 5) {
+ if (Record.size() != 6) {
Error("incorrect encoding of no-proto function type");
return QualType();
}
QualType ResultType = GetType(Record[0]);
- FunctionType::ExtInfo Info(Record[1], Record[2], Record[3], (CallingConv)Record[4]);
+ FunctionType::ExtInfo Info(Record[1], Record[2], Record[3],
+ (CallingConv)Record[4], Record[5]);
return Context->getFunctionNoProtoType(ResultType, Info);
}
@@ -3241,9 +3255,10 @@ QualType ASTReader::ReadTypeRecord(unsigned Index) {
EPI.ExtInfo = FunctionType::ExtInfo(/*noreturn*/ Record[1],
/*hasregparm*/ Record[2],
/*regparm*/ Record[3],
- static_cast<CallingConv>(Record[4]));
+ static_cast<CallingConv>(Record[4]),
+ /*produces*/ Record[5]);
- unsigned Idx = 5;
+ unsigned Idx = 6;
unsigned NumParams = Record[Idx++];
llvm::SmallVector<QualType, 16> ParamTypes;
for (unsigned I = 0; I != NumParams; ++I)
@@ -3993,12 +4008,9 @@ Stmt *ASTReader::GetExternalDeclStmt(uint64_t Offset) {
llvm_unreachable("Broken chain");
}
-bool ASTReader::FindExternalLexicalDecls(const DeclContext *DC,
+ExternalLoadResult ASTReader::FindExternalLexicalDecls(const DeclContext *DC,
bool (*isKindWeWant)(Decl::Kind),
llvm::SmallVectorImpl<Decl*> &Decls) {
- assert(DC->hasExternalLexicalStorage() &&
- "DeclContext has no lexical decls in storage");
-
// There might be lexical decls in multiple parts of the chain, for the TU
// at least.
// DeclContextOffsets might reallocate as we load additional decls below,
@@ -4023,7 +4035,7 @@ bool ASTReader::FindExternalLexicalDecls(const DeclContext *DC,
}
++NumLexicalDeclContextsRead;
- return false;
+ return ELR_Success;
}
DeclContext::lookup_result
@@ -4446,6 +4458,17 @@ ASTReader::ReadMethodPool(Selector Sel) {
return std::pair<ObjCMethodList, ObjCMethodList>();
}
+void ASTReader::ReadKnownNamespaces(
+ llvm::SmallVectorImpl<NamespaceDecl *> &Namespaces) {
+ Namespaces.clear();
+
+ for (unsigned I = 0, N = KnownNamespaces.size(); I != N; ++I) {
+ if (NamespaceDecl *Namespace
+ = dyn_cast_or_null<NamespaceDecl>(GetDecl(KnownNamespaces[I])))
+ Namespaces.push_back(Namespace);
+ }
+}
+
void ASTReader::LoadSelector(Selector Sel) {
// It would be complicated to avoid reading the methods anyway. So don't.
ReadMethodPool(Sel);
@@ -4540,7 +4563,7 @@ IdentifierInfo *ASTReader::DecodeIdentifierInfo(unsigned ID) {
unsigned StrLen = (((unsigned) StrLenPtr[0])
| (((unsigned) StrLenPtr[1]) << 8)) - 1;
IdentifiersLoaded[ID]
- = &PP->getIdentifierTable().get(Str, StrLen);
+ = &PP->getIdentifierTable().get(llvm::StringRef(Str, StrLen));
if (DeserializationListener)
DeserializationListener->IdentifierRead(ID + 1, IdentifiersLoaded[ID]);
}
@@ -4716,6 +4739,14 @@ ASTReader::ReadTemplateName(PerFileData &F, const RecordData &Record,
return Context->getDependentTemplateName(NNS,
(OverloadedOperatorKind)Record[Idx++]);
}
+
+ case TemplateName::SubstTemplateTemplateParm: {
+ TemplateTemplateParmDecl *param
+ = cast_or_null<TemplateTemplateParmDecl>(GetDecl(Record[Idx++]));
+ if (!param) return TemplateName();
+ TemplateName replacement = ReadTemplateName(F, Record, Idx);
+ return Context->getSubstTemplateTemplateParm(param, replacement);
+ }
case TemplateName::SubstTemplateTemplateParmPack: {
TemplateTemplateParmDecl *Param
diff --git a/contrib/llvm/tools/clang/lib/Serialization/ASTReaderDecl.cpp b/contrib/llvm/tools/clang/lib/Serialization/ASTReaderDecl.cpp
index fab2069..24ab544 100644
--- a/contrib/llvm/tools/clang/lib/Serialization/ASTReaderDecl.cpp
+++ b/contrib/llvm/tools/clang/lib/Serialization/ASTReaderDecl.cpp
@@ -710,6 +710,7 @@ void ASTDeclReader::VisitVarDecl(VarDecl *VD) {
VD->VarDeclBits.ExceptionVar = Record[Idx++];
VD->VarDeclBits.NRVOVariable = Record[Idx++];
VD->VarDeclBits.CXXForRangeDecl = Record[Idx++];
+ VD->VarDeclBits.ARCPseudoStrong = Record[Idx++];
if (Record[Idx++])
VD->setInit(Reader.ReadExpr(F));
diff --git a/contrib/llvm/tools/clang/lib/Serialization/ASTReaderStmt.cpp b/contrib/llvm/tools/clang/lib/Serialization/ASTReaderStmt.cpp
index f3f67a7..14927b9 100644
--- a/contrib/llvm/tools/clang/lib/Serialization/ASTReaderStmt.cpp
+++ b/contrib/llvm/tools/clang/lib/Serialization/ASTReaderStmt.cpp
@@ -60,136 +60,16 @@ namespace clang {
/// \brief The number of record fields required for the Expr class
/// itself.
- static const unsigned NumExprFields = NumStmtFields + 6;
+ static const unsigned NumExprFields = NumStmtFields + 7;
/// \brief Read and initialize a ExplicitTemplateArgumentList structure.
void ReadExplicitTemplateArgumentList(ExplicitTemplateArgumentList &ArgList,
unsigned NumTemplateArgs);
void VisitStmt(Stmt *S);
- void VisitNullStmt(NullStmt *S);
- void VisitCompoundStmt(CompoundStmt *S);
- void VisitSwitchCase(SwitchCase *S);
- void VisitCaseStmt(CaseStmt *S);
- void VisitDefaultStmt(DefaultStmt *S);
- void VisitLabelStmt(LabelStmt *S);
- void VisitIfStmt(IfStmt *S);
- void VisitSwitchStmt(SwitchStmt *S);
- void VisitWhileStmt(WhileStmt *S);
- void VisitDoStmt(DoStmt *S);
- void VisitForStmt(ForStmt *S);
- void VisitGotoStmt(GotoStmt *S);
- void VisitIndirectGotoStmt(IndirectGotoStmt *S);
- void VisitContinueStmt(ContinueStmt *S);
- void VisitBreakStmt(BreakStmt *S);
- void VisitReturnStmt(ReturnStmt *S);
- void VisitDeclStmt(DeclStmt *S);
- void VisitAsmStmt(AsmStmt *S);
- void VisitExpr(Expr *E);
- void VisitPredefinedExpr(PredefinedExpr *E);
- void VisitDeclRefExpr(DeclRefExpr *E);
- void VisitIntegerLiteral(IntegerLiteral *E);
- void VisitFloatingLiteral(FloatingLiteral *E);
- void VisitImaginaryLiteral(ImaginaryLiteral *E);
- void VisitStringLiteral(StringLiteral *E);
- void VisitCharacterLiteral(CharacterLiteral *E);
- void VisitParenExpr(ParenExpr *E);
- void VisitParenListExpr(ParenListExpr *E);
- void VisitUnaryOperator(UnaryOperator *E);
- void VisitOffsetOfExpr(OffsetOfExpr *E);
- void VisitUnaryExprOrTypeTraitExpr(UnaryExprOrTypeTraitExpr *E);
- void VisitArraySubscriptExpr(ArraySubscriptExpr *E);
- void VisitCallExpr(CallExpr *E);
- void VisitMemberExpr(MemberExpr *E);
- void VisitCastExpr(CastExpr *E);
- void VisitBinaryOperator(BinaryOperator *E);
- void VisitCompoundAssignOperator(CompoundAssignOperator *E);
- void VisitConditionalOperator(ConditionalOperator *E);
- void VisitBinaryConditionalOperator(BinaryConditionalOperator *E);
- void VisitImplicitCastExpr(ImplicitCastExpr *E);
- void VisitExplicitCastExpr(ExplicitCastExpr *E);
- void VisitCStyleCastExpr(CStyleCastExpr *E);
- void VisitCompoundLiteralExpr(CompoundLiteralExpr *E);
- void VisitExtVectorElementExpr(ExtVectorElementExpr *E);
- void VisitInitListExpr(InitListExpr *E);
- void VisitDesignatedInitExpr(DesignatedInitExpr *E);
- void VisitImplicitValueInitExpr(ImplicitValueInitExpr *E);
- void VisitVAArgExpr(VAArgExpr *E);
- void VisitAddrLabelExpr(AddrLabelExpr *E);
- void VisitStmtExpr(StmtExpr *E);
- void VisitChooseExpr(ChooseExpr *E);
- void VisitGNUNullExpr(GNUNullExpr *E);
- void VisitShuffleVectorExpr(ShuffleVectorExpr *E);
- void VisitBlockExpr(BlockExpr *E);
- void VisitBlockDeclRefExpr(BlockDeclRefExpr *E);
- void VisitGenericSelectionExpr(GenericSelectionExpr *E);
- void VisitObjCStringLiteral(ObjCStringLiteral *E);
- void VisitObjCEncodeExpr(ObjCEncodeExpr *E);
- void VisitObjCSelectorExpr(ObjCSelectorExpr *E);
- void VisitObjCProtocolExpr(ObjCProtocolExpr *E);
- void VisitObjCIvarRefExpr(ObjCIvarRefExpr *E);
- void VisitObjCPropertyRefExpr(ObjCPropertyRefExpr *E);
- void VisitObjCMessageExpr(ObjCMessageExpr *E);
- void VisitObjCIsaExpr(ObjCIsaExpr *E);
-
- void VisitObjCForCollectionStmt(ObjCForCollectionStmt *);
- void VisitObjCAtCatchStmt(ObjCAtCatchStmt *);
- void VisitObjCAtFinallyStmt(ObjCAtFinallyStmt *);
- void VisitObjCAtTryStmt(ObjCAtTryStmt *);
- void VisitObjCAtSynchronizedStmt(ObjCAtSynchronizedStmt *);
- void VisitObjCAtThrowStmt(ObjCAtThrowStmt *);
-
- // C++ Statements
- void VisitCXXCatchStmt(CXXCatchStmt *S);
- void VisitCXXTryStmt(CXXTryStmt *S);
- void VisitCXXForRangeStmt(CXXForRangeStmt *);
-
- void VisitCXXOperatorCallExpr(CXXOperatorCallExpr *E);
- void VisitCXXConstructExpr(CXXConstructExpr *E);
- void VisitCXXTemporaryObjectExpr(CXXTemporaryObjectExpr *E);
- void VisitCXXNamedCastExpr(CXXNamedCastExpr *E);
- void VisitCXXStaticCastExpr(CXXStaticCastExpr *E);
- void VisitCXXDynamicCastExpr(CXXDynamicCastExpr *E);
- void VisitCXXReinterpretCastExpr(CXXReinterpretCastExpr *E);
- void VisitCXXConstCastExpr(CXXConstCastExpr *E);
- void VisitCXXFunctionalCastExpr(CXXFunctionalCastExpr *E);
- void VisitCXXBoolLiteralExpr(CXXBoolLiteralExpr *E);
- void VisitCXXNullPtrLiteralExpr(CXXNullPtrLiteralExpr *E);
- void VisitCXXTypeidExpr(CXXTypeidExpr *E);
- void VisitCXXUuidofExpr(CXXUuidofExpr *E);
- void VisitCXXThisExpr(CXXThisExpr *E);
- void VisitCXXThrowExpr(CXXThrowExpr *E);
- void VisitCXXDefaultArgExpr(CXXDefaultArgExpr *E);
- void VisitCXXBindTemporaryExpr(CXXBindTemporaryExpr *E);
-
- void VisitCXXScalarValueInitExpr(CXXScalarValueInitExpr *E);
- void VisitCXXNewExpr(CXXNewExpr *E);
- void VisitCXXDeleteExpr(CXXDeleteExpr *E);
- void VisitCXXPseudoDestructorExpr(CXXPseudoDestructorExpr *E);
-
- void VisitExprWithCleanups(ExprWithCleanups *E);
-
- void VisitCXXDependentScopeMemberExpr(CXXDependentScopeMemberExpr *E);
- void VisitDependentScopeDeclRefExpr(DependentScopeDeclRefExpr *E);
- void VisitCXXUnresolvedConstructExpr(CXXUnresolvedConstructExpr *E);
-
- void VisitOverloadExpr(OverloadExpr *E);
- void VisitUnresolvedMemberExpr(UnresolvedMemberExpr *E);
- void VisitUnresolvedLookupExpr(UnresolvedLookupExpr *E);
-
- void VisitUnaryTypeTraitExpr(UnaryTypeTraitExpr *E);
- void VisitBinaryTypeTraitExpr(BinaryTypeTraitExpr *E);
- void VisitArrayTypeTraitExpr(ArrayTypeTraitExpr *E);
- void VisitExpressionTraitExpr(ExpressionTraitExpr *E);
- void VisitCXXNoexceptExpr(CXXNoexceptExpr *E);
- void VisitPackExpansionExpr(PackExpansionExpr *E);
- void VisitSizeOfPackExpr(SizeOfPackExpr *E);
- void VisitSubstNonTypeTemplateParmPackExpr(
- SubstNonTypeTemplateParmPackExpr *E);
- void VisitOpaqueValueExpr(OpaqueValueExpr *E);
-
- // CUDA Expressions
- void VisitCUDAKernelCallExpr(CUDAKernelCallExpr *E);
+#define STMT(Type, Base) \
+ void Visit##Type(Type *);
+#include "clang/AST/StmtNodes.inc"
};
}
@@ -410,6 +290,7 @@ void ASTStmtReader::VisitExpr(Expr *E) {
E->setType(Reader.GetType(Record[Idx++]));
E->setTypeDependent(Record[Idx++]);
E->setValueDependent(Record[Idx++]);
+ E->setInstantiationDependent(Record[Idx++]);
E->ExprBits.ContainsUnexpandedParameterPack = Record[Idx++];
E->setValueKind(static_cast<ExprValueKind>(Record[Idx++]));
E->setObjectKind(static_cast<ExprObjectKind>(Record[Idx++]));
@@ -589,6 +470,10 @@ void ASTStmtReader::VisitCallExpr(CallExpr *E) {
E->setArg(I, Reader.ReadSubExpr());
}
+void ASTStmtReader::VisitCXXMemberCallExpr(CXXMemberCallExpr *E) {
+ VisitCallExpr(E);
+}
+
void ASTStmtReader::VisitMemberExpr(MemberExpr *E) {
// Don't call VisitExpr, this is fully initialized at creation.
assert(E->getStmtClass() == Stmt::MemberExprClass &&
@@ -602,6 +487,20 @@ void ASTStmtReader::VisitObjCIsaExpr(ObjCIsaExpr *E) {
E->setArrow(Record[Idx++]);
}
+void ASTStmtReader::
+VisitObjCIndirectCopyRestoreExpr(ObjCIndirectCopyRestoreExpr *E) {
+ VisitExpr(E);
+ E->Operand = Reader.ReadSubExpr();
+ E->setShouldCopy(Record[Idx++]);
+}
+
+void ASTStmtReader::VisitObjCBridgedCastExpr(ObjCBridgedCastExpr *E) {
+ VisitExplicitCastExpr(E);
+ E->LParenLoc = ReadSourceLocation(Record, Idx);
+ E->BridgeKeywordLoc = ReadSourceLocation(Record, Idx);
+ E->Kind = Record[Idx++];
+}
+
void ASTStmtReader::VisitCastExpr(CastExpr *E) {
VisitExpr(E);
unsigned NumBaseSpecs = Record[Idx++];
@@ -929,6 +828,7 @@ void ASTStmtReader::VisitObjCMessageExpr(ObjCMessageExpr *E) {
VisitExpr(E);
assert(Record[Idx] == E->getNumArgs());
++Idx;
+ E->setDelegateInitCall(Record[Idx++]);
ObjCMessageExpr::ReceiverKind Kind
= static_cast<ObjCMessageExpr::ReceiverKind>(Record[Idx++]);
switch (Kind) {
@@ -987,6 +887,12 @@ void ASTStmtReader::VisitObjCAtFinallyStmt(ObjCAtFinallyStmt *S) {
S->setAtFinallyLoc(ReadSourceLocation(Record, Idx));
}
+void ASTStmtReader::VisitObjCAutoreleasePoolStmt(ObjCAutoreleasePoolStmt *S) {
+ VisitStmt(S);
+ S->setSubStmt(Reader.ReadSubStmt());
+ S->setAtLoc(ReadSourceLocation(Record, Idx));
+}
+
void ASTStmtReader::VisitObjCAtTryStmt(ObjCAtTryStmt *S) {
VisitStmt(S);
assert(Record[Idx] == S->getNumCatchStmts());
@@ -1125,18 +1031,6 @@ void ASTStmtReader::VisitCXXTypeidExpr(CXXTypeidExpr *E) {
// typeid(42+2)
E->setExprOperand(Reader.ReadSubExpr());
}
-void ASTStmtReader::VisitCXXUuidofExpr(CXXUuidofExpr *E) {
- VisitExpr(E);
- E->setSourceRange(ReadSourceRange(Record, Idx));
- if (E->isTypeOperand()) { // __uuidof(ComType)
- E->setTypeOperandSourceInfo(
- GetTypeSourceInfo(Record, Idx));
- return;
- }
-
- // __uuidof(expr)
- E->setExprOperand(Reader.ReadSubExpr());
-}
void ASTStmtReader::VisitCXXThisExpr(CXXThisExpr *E) {
VisitExpr(E);
@@ -1146,8 +1040,9 @@ void ASTStmtReader::VisitCXXThisExpr(CXXThisExpr *E) {
void ASTStmtReader::VisitCXXThrowExpr(CXXThrowExpr *E) {
VisitExpr(E);
- E->setThrowLoc(ReadSourceLocation(Record, Idx));
- E->setSubExpr(Reader.ReadSubExpr());
+ E->ThrowLoc = ReadSourceLocation(Record, Idx);
+ E->Op = Reader.ReadSubExpr();
+ E->IsThrownVariableInScope = Record[Idx++];
}
void ASTStmtReader::VisitCXXDefaultArgExpr(CXXDefaultArgExpr *E) {
@@ -1388,6 +1283,15 @@ void ASTStmtReader::VisitSizeOfPackExpr(SizeOfPackExpr *E) {
E->Pack = cast_or_null<NamedDecl>(Reader.GetDecl(Record[Idx++]));
}
+void ASTStmtReader::VisitSubstNonTypeTemplateParmExpr(
+ SubstNonTypeTemplateParmExpr *E) {
+ VisitExpr(E);
+ E->Param
+ = cast_or_null<NonTypeTemplateParmDecl>(Reader.GetDecl(Record[Idx++]));
+ E->NameLoc = ReadSourceLocation(Record, Idx);
+ E->Replacement = Reader.ReadSubExpr();
+}
+
void ASTStmtReader::VisitSubstNonTypeTemplateParmPackExpr(
SubstNonTypeTemplateParmPackExpr *E) {
VisitExpr(E);
@@ -1402,6 +1306,11 @@ void ASTStmtReader::VisitSubstNonTypeTemplateParmPackExpr(
E->NameLoc = ReadSourceLocation(Record, Idx);
}
+void ASTStmtReader::VisitMaterializeTemporaryExpr(MaterializeTemporaryExpr *E) {
+ VisitExpr(E);
+ E->Temporary = Reader.ReadSubExpr();
+}
+
void ASTStmtReader::VisitOpaqueValueExpr(OpaqueValueExpr *E) {
VisitExpr(E);
Idx++; // skip ID
@@ -1409,6 +1318,43 @@ void ASTStmtReader::VisitOpaqueValueExpr(OpaqueValueExpr *E) {
}
//===----------------------------------------------------------------------===//
+// Microsoft Expressions and Statements
+//===----------------------------------------------------------------------===//
+void ASTStmtReader::VisitCXXUuidofExpr(CXXUuidofExpr *E) {
+ VisitExpr(E);
+ E->setSourceRange(ReadSourceRange(Record, Idx));
+ if (E->isTypeOperand()) { // __uuidof(ComType)
+ E->setTypeOperandSourceInfo(
+ GetTypeSourceInfo(Record, Idx));
+ return;
+ }
+
+ // __uuidof(expr)
+ E->setExprOperand(Reader.ReadSubExpr());
+}
+
+void ASTStmtReader::VisitSEHExceptStmt(SEHExceptStmt *S) {
+ VisitStmt(S);
+ S->Loc = ReadSourceLocation(Record, Idx);
+ S->Children[SEHExceptStmt::FILTER_EXPR] = Reader.ReadSubStmt();
+ S->Children[SEHExceptStmt::BLOCK] = Reader.ReadSubStmt();
+}
+
+void ASTStmtReader::VisitSEHFinallyStmt(SEHFinallyStmt *S) {
+ VisitStmt(S);
+ S->Loc = ReadSourceLocation(Record, Idx);
+ S->Block = Reader.ReadSubStmt();
+}
+
+void ASTStmtReader::VisitSEHTryStmt(SEHTryStmt *S) {
+ VisitStmt(S);
+ S->IsCXXTry = Record[Idx++];
+ S->TryLoc = ReadSourceLocation(Record, Idx);
+ S->Children[SEHTryStmt::TRY] = Reader.ReadSubStmt();
+ S->Children[SEHTryStmt::HANDLER] = Reader.ReadSubStmt();
+}
+
+//===----------------------------------------------------------------------===//
// CUDA Expressions and Statements
//===----------------------------------------------------------------------===//
@@ -1417,6 +1363,20 @@ void ASTStmtReader::VisitCUDAKernelCallExpr(CUDAKernelCallExpr *E) {
E->setConfig(cast<CallExpr>(Reader.ReadSubExpr()));
}
+//===----------------------------------------------------------------------===//
+// OpenCL Expressions and Statements.
+//===----------------------------------------------------------------------===//
+void ASTStmtReader::VisitAsTypeExpr(AsTypeExpr *E) {
+ VisitExpr(E);
+ E->BuiltinLoc = ReadSourceLocation(Record, Idx);
+ E->RParenLoc = ReadSourceLocation(Record, Idx);
+ E->SrcExpr = Reader.ReadSubExpr();
+}
+
+//===----------------------------------------------------------------------===//
+// ASTReader Implementation
+//===----------------------------------------------------------------------===//
+
Stmt *ASTReader::ReadStmt(PerFileData &F) {
switch (ReadingKind) {
case Read_Decl:
@@ -1784,6 +1744,12 @@ Stmt *ASTReader::ReadStmtFromStream(PerFileData &F) {
case EXPR_OBJC_ISA:
S = new (Context) ObjCIsaExpr(Empty);
break;
+ case EXPR_OBJC_INDIRECT_COPY_RESTORE:
+ S = new (Context) ObjCIndirectCopyRestoreExpr(Empty);
+ break;
+ case EXPR_OBJC_BRIDGED_CAST:
+ S = new (Context) ObjCBridgedCastExpr(Empty);
+ break;
case STMT_OBJC_FOR_COLLECTION:
S = new (Context) ObjCForCollectionStmt(Empty);
break;
@@ -1804,7 +1770,18 @@ Stmt *ASTReader::ReadStmtFromStream(PerFileData &F) {
case STMT_OBJC_AT_THROW:
S = new (Context) ObjCAtThrowStmt(Empty);
break;
-
+ case STMT_OBJC_AUTORELEASE_POOL:
+ S = new (Context) ObjCAutoreleasePoolStmt(Empty);
+ break;
+ case STMT_SEH_EXCEPT:
+ S = new (Context) SEHExceptStmt(Empty);
+ break;
+ case STMT_SEH_FINALLY:
+ S = new (Context) SEHFinallyStmt(Empty);
+ break;
+ case STMT_SEH_TRY:
+ S = new (Context) SEHTryStmt(Empty);
+ break;
case STMT_CXX_CATCH:
S = new (Context) CXXCatchStmt(Empty);
break;
@@ -1978,10 +1955,18 @@ Stmt *ASTReader::ReadStmtFromStream(PerFileData &F) {
S = new (Context) SizeOfPackExpr(Empty);
break;
+ case EXPR_SUBST_NON_TYPE_TEMPLATE_PARM:
+ S = new (Context) SubstNonTypeTemplateParmExpr(Empty);
+ break;
+
case EXPR_SUBST_NON_TYPE_TEMPLATE_PARM_PACK:
S = new (Context) SubstNonTypeTemplateParmPackExpr(Empty);
break;
+ case EXPR_MATERIALIZE_TEMPORARY:
+ S = new (Context) MaterializeTemporaryExpr(Empty);
+ break;
+
case EXPR_OPAQUE_VALUE: {
unsigned key = Record[ASTStmtReader::NumExprFields];
OpaqueValueExpr *&expr = OpaqueValueExprs[key];
diff --git a/contrib/llvm/tools/clang/lib/Serialization/ASTWriter.cpp b/contrib/llvm/tools/clang/lib/Serialization/ASTWriter.cpp
index ba9032e..39f2fbd 100644
--- a/contrib/llvm/tools/clang/lib/Serialization/ASTWriter.cpp
+++ b/contrib/llvm/tools/clang/lib/Serialization/ASTWriter.cpp
@@ -170,6 +170,7 @@ void ASTTypeWriter::VisitFunctionType(const FunctionType *T) {
Record.push_back(C.getRegParm());
// FIXME: need to stabilize encoding of calling convention...
Record.push_back(C.getCC());
+ Record.push_back(C.getProducesResult());
}
void ASTTypeWriter::VisitFunctionNoProtoType(const FunctionNoProtoType *T) {
@@ -780,13 +781,15 @@ void ASTWriter::WriteBlockInfoBlock() {
RECORD(FP_PRAGMA_OPTIONS);
RECORD(OPENCL_EXTENSIONS);
RECORD(DELEGATING_CTORS);
+ RECORD(FILE_SOURCE_LOCATION_OFFSETS);
+ RECORD(KNOWN_NAMESPACES);
// SourceManager Block.
BLOCK(SOURCE_MANAGER_BLOCK);
RECORD(SM_SLOC_FILE_ENTRY);
RECORD(SM_SLOC_BUFFER_ENTRY);
RECORD(SM_SLOC_BUFFER_BLOB);
- RECORD(SM_SLOC_INSTANTIATION_ENTRY);
+ RECORD(SM_SLOC_EXPANSION_ENTRY);
RECORD(SM_LINE_TABLE);
// Preprocessor Block.
@@ -893,7 +896,7 @@ void ASTWriter::WriteBlockInfoBlock() {
AddStmtsExprs(Stream, Record);
BLOCK(PREPROCESSOR_DETAIL_BLOCK);
- RECORD(PPD_MACRO_INSTANTIATION);
+ RECORD(PPD_MACRO_EXPANSION);
RECORD(PPD_MACRO_DEFINITION);
RECORD(PPD_INCLUSION_DIRECTIVE);
@@ -1109,6 +1112,8 @@ void ASTWriter::WriteLanguageOptions(const LangOptions &LangOpts) {
Record.push_back(LangOpts.ElideConstructors);
Record.push_back(LangOpts.SpellChecking);
Record.push_back(LangOpts.MRTD);
+ Record.push_back(LangOpts.ObjCAutoRefCount);
+ Record.push_back(LangOpts.ObjCInferRelatedReturnType);
Stream.EmitRecord(LANGUAGE_OPTIONS, Record);
}
@@ -1169,8 +1174,8 @@ void ASTWriter::WriteStatCache(MemorizeStatCalls &StatCalls) {
for (MemorizeStatCalls::iterator Stat = StatCalls.begin(),
StatEnd = StatCalls.end();
Stat != StatEnd; ++Stat, ++NumStatEntries) {
- const char *Filename = Stat->first();
- Generator.insert(Filename, Stat->second);
+ llvm::StringRef Filename = Stat->first();
+ Generator.insert(Filename.data(), Stat->second);
}
// Create the on-disk hash table in a buffer.
@@ -1245,12 +1250,12 @@ static unsigned CreateSLocBufferBlobAbbrev(llvm::BitstreamWriter &Stream) {
return Stream.EmitAbbrev(Abbrev);
}
-/// \brief Create an abbreviation for the SLocEntry that refers to an
-/// buffer.
-static unsigned CreateSLocInstantiationAbbrev(llvm::BitstreamWriter &Stream) {
+/// \brief Create an abbreviation for the SLocEntry that refers to a macro
+/// expansion.
+static unsigned CreateSLocExpansionAbbrev(llvm::BitstreamWriter &Stream) {
using namespace llvm;
BitCodeAbbrev *Abbrev = new BitCodeAbbrev();
- Abbrev->Add(BitCodeAbbrevOp(SM_SLOC_INSTANTIATION_ENTRY));
+ Abbrev->Add(BitCodeAbbrevOp(SM_SLOC_EXPANSION_ENTRY));
Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 8)); // Offset
Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 8)); // Spelling location
Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 8)); // Start location
@@ -1409,7 +1414,7 @@ void ASTWriter::WriteSourceManagerBlock(SourceManager &SourceMgr,
unsigned SLocFileAbbrv = CreateSLocFileAbbrev(Stream);
unsigned SLocBufferAbbrv = CreateSLocBufferAbbrev(Stream);
unsigned SLocBufferBlobAbbrv = CreateSLocBufferBlobAbbrev(Stream);
- unsigned SLocInstantiationAbbrv = CreateSLocInstantiationAbbrev(Stream);
+ unsigned SLocExpansionAbbrv = CreateSLocExpansionAbbrev(Stream);
// Write the line table.
if (SourceMgr.hasLineTable()) {
@@ -1474,7 +1479,7 @@ void ASTWriter::WriteSourceManagerBlock(SourceManager &SourceMgr,
} else
Code = SM_SLOC_BUFFER_ENTRY;
} else
- Code = SM_SLOC_INSTANTIATION_ENTRY;
+ Code = SM_SLOC_EXPANSION_ENTRY;
Record.clear();
Record.push_back(Code);
@@ -1534,7 +1539,7 @@ void ASTWriter::WriteSourceManagerBlock(SourceManager &SourceMgr,
PreloadSLocs.push_back(BaseSLocID + SLocEntryOffsets.size());
}
} else {
- // The source location entry is an instantiation.
+ // The source location entry is a macro expansion.
const SrcMgr::InstantiationInfo &Inst = SLoc->getInstantiation();
Record.push_back(Inst.getSpellingLoc().getRawEncoding());
Record.push_back(Inst.getInstantiationLocStart().getRawEncoding());
@@ -1545,7 +1550,7 @@ void ASTWriter::WriteSourceManagerBlock(SourceManager &SourceMgr,
if (I + 1 != N)
NextOffset = SourceMgr.getSLocEntry(I + 1).getOffset();
Record.push_back(NextOffset - SLoc->getOffset() - 1);
- Stream.EmitRecordWithAbbrev(SLocInstantiationAbbrv, Record);
+ Stream.EmitRecordWithAbbrev(SLocExpansionAbbrv, Record);
}
}
@@ -1795,13 +1800,13 @@ void ASTWriter::WritePreprocessorDetail(PreprocessingRecord &PPRec) {
SerializationListener->SerializedPreprocessedEntity(*E,
Stream.GetCurrentBitNo());
- if (MacroInstantiation *MI = dyn_cast<MacroInstantiation>(*E)) {
+ if (MacroExpansion *ME = dyn_cast<MacroExpansion>(*E)) {
Record.push_back(IndexBase + NumPreprocessingRecords++);
- AddSourceLocation(MI->getSourceRange().getBegin(), Record);
- AddSourceLocation(MI->getSourceRange().getEnd(), Record);
- AddIdentifierRef(MI->getName(), Record);
- Record.push_back(getMacroDefinitionID(MI->getDefinition()));
- Stream.EmitRecord(PPD_MACRO_INSTANTIATION, Record);
+ AddSourceLocation(ME->getSourceRange().getBegin(), Record);
+ AddSourceLocation(ME->getSourceRange().getEnd(), Record);
+ AddIdentifierRef(ME->getName(), Record);
+ Record.push_back(getMacroDefinitionID(ME->getDefinition()));
+ Stream.EmitRecord(PPD_MACRO_EXPANSION, Record);
continue;
}
@@ -2842,6 +2847,16 @@ void ASTWriter::WriteASTCore(Sema &SemaRef, MemorizeStatCalls *StatCalls,
AddDeclRef(Context.getcudaConfigureCallDecl(), CUDASpecialDeclRefs);
}
+ // Build a record containing all of the known namespaces.
+ RecordData KnownNamespaces;
+ for (llvm::DenseMap<NamespaceDecl*, bool>::iterator
+ I = SemaRef.KnownNamespaces.begin(),
+ IEnd = SemaRef.KnownNamespaces.end();
+ I != IEnd; ++I) {
+ if (!I->second)
+ AddDeclRef(I->first, KnownNamespaces);
+ }
+
// Write the remaining AST contents.
RecordData Record;
Stream.EnterSubblock(AST_BLOCK_ID, 5);
@@ -2951,6 +2966,10 @@ void ASTWriter::WriteASTCore(Sema &SemaRef, MemorizeStatCalls *StatCalls,
if (!DelegatingCtorDecls.empty())
Stream.EmitRecord(DELEGATING_CTORS, DelegatingCtorDecls);
+ // Write the known namespaces.
+ if (!KnownNamespaces.empty())
+ Stream.EmitRecord(KNOWN_NAMESPACES, KnownNamespaces);
+
// Some simple statistics
Record.clear();
Record.push_back(NumStatements);
@@ -3675,6 +3694,14 @@ void ASTWriter::AddTemplateName(TemplateName Name, RecordDataImpl &Record) {
Record.push_back(DepT->getOperator());
break;
}
+
+ case TemplateName::SubstTemplateTemplateParm: {
+ SubstTemplateTemplateParmStorage *subst
+ = Name.getAsSubstTemplateTemplateParm();
+ AddDeclRef(subst->getParameter(), Record);
+ AddTemplateName(subst->getReplacement(), Record);
+ break;
+ }
case TemplateName::SubstTemplateTemplateParmPack: {
SubstTemplateTemplateParmPackStorage *SubstPack
diff --git a/contrib/llvm/tools/clang/lib/Serialization/ASTWriterDecl.cpp b/contrib/llvm/tools/clang/lib/Serialization/ASTWriterDecl.cpp
index 7c24088..2b83494 100644
--- a/contrib/llvm/tools/clang/lib/Serialization/ASTWriterDecl.cpp
+++ b/contrib/llvm/tools/clang/lib/Serialization/ASTWriterDecl.cpp
@@ -645,6 +645,7 @@ void ASTDeclWriter::VisitVarDecl(VarDecl *D) {
Record.push_back(D->isExceptionVariable());
Record.push_back(D->isNRVOVariable());
Record.push_back(D->isCXXForRangeDecl());
+ Record.push_back(D->isARCPseudoStrong());
Record.push_back(D->getInit() ? 1 : 0);
if (D->getInit())
Writer.AddStmt(D->getInit());
@@ -670,7 +671,7 @@ void ASTDeclWriter::VisitVarDecl(VarDecl *D) {
D->RedeclLink.getNext() == D &&
!D->hasCXXDirectInitializer() &&
D->getInit() == 0 &&
- !ParmVarDecl::classofKind(D->getKind()) &&
+ !isa<ParmVarDecl>(D) &&
!SpecInfo)
AbbrevToUse = Writer.getDeclVarAbbrev();
@@ -695,6 +696,8 @@ void ASTDeclWriter::VisitParmVarDecl(ParmVarDecl *D) {
Writer.AddStmt(D->getUninstantiatedDefaultArg());
Code = serialization::DECL_PARM_VAR;
+ assert(!D->isARCPseudoStrong()); // can be true of ImplicitParamDecl
+
// If the assumptions about the DECL_PARM_VAR abbrev are true, use it. Here
// we dynamically check for the properties that we optimize for, but don't
// know are true of all PARM_VAR_DECLs.
@@ -1426,6 +1429,7 @@ void ASTWriter::WriteDeclsBlockAbbrevs() {
Abv->Add(BitCodeAbbrevOp(0)); // isExceptionVariable
Abv->Add(BitCodeAbbrevOp(0)); // isNRVOVariable
Abv->Add(BitCodeAbbrevOp(0)); // isCXXForRangeDecl
+ Abv->Add(BitCodeAbbrevOp(0)); // isARCPseudoStrong
Abv->Add(BitCodeAbbrevOp(0)); // HasInit
Abv->Add(BitCodeAbbrevOp(0)); // HasMemberSpecializationInfo
// ParmVarDecl
@@ -1498,6 +1502,7 @@ void ASTWriter::WriteDeclsBlockAbbrevs() {
Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1)); // isExceptionVariable
Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1)); // isNRVOVariable
Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1)); // isCXXForRangeDecl
+ Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1)); // isARCPseudoStrong
Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1)); // HasInit
Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1)); // HasMemberSpecInfo
// Type Source Info
@@ -1512,8 +1517,9 @@ void ASTWriter::WriteDeclsBlockAbbrevs() {
//Stmt
//Expr
Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // Type
- Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1)); //IsTypeDependent
- Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1)); //IsValueDependent
+ Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1)); //TypeDependent
+ Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1)); //ValueDependent
+ Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1)); //InstantiationDependent
Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1)); //UnexpandedParamPack
Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 3)); //GetValueKind
Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 3)); //GetObjectKind
@@ -1531,8 +1537,9 @@ void ASTWriter::WriteDeclsBlockAbbrevs() {
//Stmt
//Expr
Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // Type
- Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1)); //IsTypeDependent
- Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1)); //IsValueDependent
+ Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1)); //TypeDependent
+ Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1)); //ValueDependent
+ Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1)); //InstantiationDependent
Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1)); //UnexpandedParamPack
Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 3)); //GetValueKind
Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 3)); //GetObjectKind
@@ -1548,8 +1555,9 @@ void ASTWriter::WriteDeclsBlockAbbrevs() {
//Stmt
//Expr
Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // Type
- Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1)); //IsTypeDependent
- Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1)); //IsValueDependent
+ Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1)); //TypeDependent
+ Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1)); //ValueDependent
+ Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1)); //InstantiationDependent
Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1)); //UnexpandedParamPack
Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 3)); //GetValueKind
Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 3)); //GetObjectKind
diff --git a/contrib/llvm/tools/clang/lib/Serialization/ASTWriterStmt.cpp b/contrib/llvm/tools/clang/lib/Serialization/ASTWriterStmt.cpp
index 00e2404..1d73ed4 100644
--- a/contrib/llvm/tools/clang/lib/Serialization/ASTWriterStmt.cpp
+++ b/contrib/llvm/tools/clang/lib/Serialization/ASTWriterStmt.cpp
@@ -39,134 +39,9 @@ namespace clang {
AddExplicitTemplateArgumentList(const ExplicitTemplateArgumentList &Args);
void VisitStmt(Stmt *S);
- void VisitNullStmt(NullStmt *S);
- void VisitCompoundStmt(CompoundStmt *S);
- void VisitSwitchCase(SwitchCase *S);
- void VisitCaseStmt(CaseStmt *S);
- void VisitDefaultStmt(DefaultStmt *S);
- void VisitLabelStmt(LabelStmt *S);
- void VisitIfStmt(IfStmt *S);
- void VisitSwitchStmt(SwitchStmt *S);
- void VisitWhileStmt(WhileStmt *S);
- void VisitDoStmt(DoStmt *S);
- void VisitForStmt(ForStmt *S);
- void VisitGotoStmt(GotoStmt *S);
- void VisitIndirectGotoStmt(IndirectGotoStmt *S);
- void VisitContinueStmt(ContinueStmt *S);
- void VisitBreakStmt(BreakStmt *S);
- void VisitReturnStmt(ReturnStmt *S);
- void VisitDeclStmt(DeclStmt *S);
- void VisitAsmStmt(AsmStmt *S);
- void VisitExpr(Expr *E);
- void VisitPredefinedExpr(PredefinedExpr *E);
- void VisitDeclRefExpr(DeclRefExpr *E);
- void VisitIntegerLiteral(IntegerLiteral *E);
- void VisitFloatingLiteral(FloatingLiteral *E);
- void VisitImaginaryLiteral(ImaginaryLiteral *E);
- void VisitStringLiteral(StringLiteral *E);
- void VisitCharacterLiteral(CharacterLiteral *E);
- void VisitParenExpr(ParenExpr *E);
- void VisitParenListExpr(ParenListExpr *E);
- void VisitUnaryOperator(UnaryOperator *E);
- void VisitOffsetOfExpr(OffsetOfExpr *E);
- void VisitUnaryExprOrTypeTraitExpr(UnaryExprOrTypeTraitExpr *E);
- void VisitArraySubscriptExpr(ArraySubscriptExpr *E);
- void VisitCallExpr(CallExpr *E);
- void VisitMemberExpr(MemberExpr *E);
- void VisitCastExpr(CastExpr *E);
- void VisitBinaryOperator(BinaryOperator *E);
- void VisitCompoundAssignOperator(CompoundAssignOperator *E);
- void VisitConditionalOperator(ConditionalOperator *E);
- void VisitBinaryConditionalOperator(BinaryConditionalOperator *E);
- void VisitImplicitCastExpr(ImplicitCastExpr *E);
- void VisitExplicitCastExpr(ExplicitCastExpr *E);
- void VisitCStyleCastExpr(CStyleCastExpr *E);
- void VisitCompoundLiteralExpr(CompoundLiteralExpr *E);
- void VisitExtVectorElementExpr(ExtVectorElementExpr *E);
- void VisitInitListExpr(InitListExpr *E);
- void VisitDesignatedInitExpr(DesignatedInitExpr *E);
- void VisitImplicitValueInitExpr(ImplicitValueInitExpr *E);
- void VisitVAArgExpr(VAArgExpr *E);
- void VisitAddrLabelExpr(AddrLabelExpr *E);
- void VisitStmtExpr(StmtExpr *E);
- void VisitChooseExpr(ChooseExpr *E);
- void VisitGNUNullExpr(GNUNullExpr *E);
- void VisitShuffleVectorExpr(ShuffleVectorExpr *E);
- void VisitBlockExpr(BlockExpr *E);
- void VisitBlockDeclRefExpr(BlockDeclRefExpr *E);
- void VisitGenericSelectionExpr(GenericSelectionExpr *E);
-
- // Objective-C Expressions
- void VisitObjCStringLiteral(ObjCStringLiteral *E);
- void VisitObjCEncodeExpr(ObjCEncodeExpr *E);
- void VisitObjCSelectorExpr(ObjCSelectorExpr *E);
- void VisitObjCProtocolExpr(ObjCProtocolExpr *E);
- void VisitObjCIvarRefExpr(ObjCIvarRefExpr *E);
- void VisitObjCPropertyRefExpr(ObjCPropertyRefExpr *E);
- void VisitObjCMessageExpr(ObjCMessageExpr *E);
- void VisitObjCIsaExpr(ObjCIsaExpr *E);
-
- // Objective-C Statements
- void VisitObjCForCollectionStmt(ObjCForCollectionStmt *);
- void VisitObjCAtCatchStmt(ObjCAtCatchStmt *);
- void VisitObjCAtFinallyStmt(ObjCAtFinallyStmt *);
- void VisitObjCAtTryStmt(ObjCAtTryStmt *);
- void VisitObjCAtSynchronizedStmt(ObjCAtSynchronizedStmt *);
- void VisitObjCAtThrowStmt(ObjCAtThrowStmt *);
-
- // C++ Statements
- void VisitCXXCatchStmt(CXXCatchStmt *S);
- void VisitCXXTryStmt(CXXTryStmt *S);
- void VisitCXXForRangeStmt(CXXForRangeStmt *);
-
- void VisitCXXOperatorCallExpr(CXXOperatorCallExpr *E);
- void VisitCXXMemberCallExpr(CXXMemberCallExpr *E);
- void VisitCXXConstructExpr(CXXConstructExpr *E);
- void VisitCXXTemporaryObjectExpr(CXXTemporaryObjectExpr *E);
- void VisitCXXNamedCastExpr(CXXNamedCastExpr *E);
- void VisitCXXStaticCastExpr(CXXStaticCastExpr *E);
- void VisitCXXDynamicCastExpr(CXXDynamicCastExpr *E);
- void VisitCXXReinterpretCastExpr(CXXReinterpretCastExpr *E);
- void VisitCXXConstCastExpr(CXXConstCastExpr *E);
- void VisitCXXFunctionalCastExpr(CXXFunctionalCastExpr *E);
- void VisitCXXBoolLiteralExpr(CXXBoolLiteralExpr *E);
- void VisitCXXNullPtrLiteralExpr(CXXNullPtrLiteralExpr *E);
- void VisitCXXTypeidExpr(CXXTypeidExpr *E);
- void VisitCXXUuidofExpr(CXXUuidofExpr *E);
- void VisitCXXThisExpr(CXXThisExpr *E);
- void VisitCXXThrowExpr(CXXThrowExpr *E);
- void VisitCXXDefaultArgExpr(CXXDefaultArgExpr *E);
- void VisitCXXBindTemporaryExpr(CXXBindTemporaryExpr *E);
-
- void VisitCXXScalarValueInitExpr(CXXScalarValueInitExpr *E);
- void VisitCXXNewExpr(CXXNewExpr *E);
- void VisitCXXDeleteExpr(CXXDeleteExpr *E);
- void VisitCXXPseudoDestructorExpr(CXXPseudoDestructorExpr *E);
-
- void VisitExprWithCleanups(ExprWithCleanups *E);
- void VisitCXXDependentScopeMemberExpr(CXXDependentScopeMemberExpr *E);
- void VisitDependentScopeDeclRefExpr(DependentScopeDeclRefExpr *E);
- void VisitCXXUnresolvedConstructExpr(CXXUnresolvedConstructExpr *E);
-
- void VisitOverloadExpr(OverloadExpr *E);
- void VisitUnresolvedMemberExpr(UnresolvedMemberExpr *E);
- void VisitUnresolvedLookupExpr(UnresolvedLookupExpr *E);
-
- void VisitUnaryTypeTraitExpr(UnaryTypeTraitExpr *E);
- void VisitBinaryTypeTraitExpr(BinaryTypeTraitExpr *E);
- void VisitArrayTypeTraitExpr(ArrayTypeTraitExpr *E);
- void VisitExpressionTraitExpr(ExpressionTraitExpr *E);
- void VisitCXXNoexceptExpr(CXXNoexceptExpr *E);
- void VisitPackExpansionExpr(PackExpansionExpr *E);
- void VisitSizeOfPackExpr(SizeOfPackExpr *E);
- void VisitSubstNonTypeTemplateParmPackExpr(
- SubstNonTypeTemplateParmPackExpr *E);
- void VisitOpaqueValueExpr(OpaqueValueExpr *E);
-
- // CUDA Expressions
- void VisitCUDAKernelCallExpr(CUDAKernelCallExpr *E);
-
- void VisitAsTypeExpr(AsTypeExpr *E);
+#define STMT(Type, Base) \
+ void Visit##Type(Type *);
+#include "clang/AST/StmtNodes.inc"
};
}
@@ -371,6 +246,7 @@ void ASTStmtWriter::VisitExpr(Expr *E) {
Writer.AddTypeRef(E->getType(), Record);
Record.push_back(E->isTypeDependent());
Record.push_back(E->isValueDependent());
+ Record.push_back(E->isInstantiationDependent());
Record.push_back(E->containsUnexpandedParameterPack());
Record.push_back(E->getValueKind());
Record.push_back(E->getObjectKind());
@@ -606,6 +482,22 @@ void ASTStmtWriter::VisitObjCIsaExpr(ObjCIsaExpr *E) {
Code = serialization::EXPR_OBJC_ISA;
}
+void ASTStmtWriter::
+VisitObjCIndirectCopyRestoreExpr(ObjCIndirectCopyRestoreExpr *E) {
+ VisitExpr(E);
+ Writer.AddStmt(E->getSubExpr());
+ Record.push_back(E->shouldCopy());
+ Code = serialization::EXPR_OBJC_INDIRECT_COPY_RESTORE;
+}
+
+void ASTStmtWriter::VisitObjCBridgedCastExpr(ObjCBridgedCastExpr *E) {
+ VisitExplicitCastExpr(E);
+ Writer.AddSourceLocation(E->getLParenLoc(), Record);
+ Writer.AddSourceLocation(E->getBridgeKeywordLoc(), Record);
+ Record.push_back(E->getBridgeKind()); // FIXME: Stable encoding
+ Code = serialization::EXPR_OBJC_BRIDGED_CAST;
+}
+
void ASTStmtWriter::VisitCastExpr(CastExpr *E) {
VisitExpr(E);
Record.push_back(E->path_size());
@@ -914,6 +806,7 @@ void ASTStmtWriter::VisitObjCPropertyRefExpr(ObjCPropertyRefExpr *E) {
void ASTStmtWriter::VisitObjCMessageExpr(ObjCMessageExpr *E) {
VisitExpr(E);
Record.push_back(E->getNumArgs());
+ Record.push_back(E->isDelegateInitCall());
Record.push_back((unsigned)E->getReceiverKind()); // FIXME: stable encoding
switch (E->getReceiverKind()) {
case ObjCMessageExpr::Instance:
@@ -973,6 +866,12 @@ void ASTStmtWriter::VisitObjCAtFinallyStmt(ObjCAtFinallyStmt *S) {
Code = serialization::STMT_OBJC_FINALLY;
}
+void ASTStmtWriter::VisitObjCAutoreleasePoolStmt(ObjCAutoreleasePoolStmt *S) {
+ Writer.AddStmt(S->getSubStmt());
+ Writer.AddSourceLocation(S->getAtLoc(), Record);
+ Code = serialization::STMT_OBJC_AUTORELEASE_POOL;
+}
+
void ASTStmtWriter::VisitObjCAtTryStmt(ObjCAtTryStmt *S) {
Record.push_back(S->getNumCatchStmts());
Record.push_back(S->getFinallyStmt() != 0);
@@ -1123,18 +1022,6 @@ void ASTStmtWriter::VisitCXXTypeidExpr(CXXTypeidExpr *E) {
}
}
-void ASTStmtWriter::VisitCXXUuidofExpr(CXXUuidofExpr *E) {
- VisitExpr(E);
- Writer.AddSourceRange(E->getSourceRange(), Record);
- if (E->isTypeOperand()) {
- Writer.AddTypeSourceInfo(E->getTypeOperandSourceInfo(), Record);
- Code = serialization::EXPR_CXX_UUIDOF_TYPE;
- } else {
- Writer.AddStmt(E->getExprOperand());
- Code = serialization::EXPR_CXX_UUIDOF_EXPR;
- }
-}
-
void ASTStmtWriter::VisitCXXThisExpr(CXXThisExpr *E) {
VisitExpr(E);
Writer.AddSourceLocation(E->getLocation(), Record);
@@ -1146,6 +1033,7 @@ void ASTStmtWriter::VisitCXXThrowExpr(CXXThrowExpr *E) {
VisitExpr(E);
Writer.AddSourceLocation(E->getThrowLoc(), Record);
Writer.AddStmt(E->getSubExpr());
+ Record.push_back(E->isThrownVariableInScope());
Code = serialization::EXPR_CXX_THROW;
}
@@ -1408,15 +1296,30 @@ void ASTStmtWriter::VisitSizeOfPackExpr(SizeOfPackExpr *E) {
Code = serialization::EXPR_SIZEOF_PACK;
}
+void ASTStmtWriter::VisitSubstNonTypeTemplateParmExpr(
+ SubstNonTypeTemplateParmExpr *E) {
+ VisitExpr(E);
+ Writer.AddDeclRef(E->getParameter(), Record);
+ Writer.AddSourceLocation(E->getNameLoc(), Record);
+ Writer.AddStmt(E->getReplacement());
+ Code = serialization::EXPR_SUBST_NON_TYPE_TEMPLATE_PARM;
+}
+
void ASTStmtWriter::VisitSubstNonTypeTemplateParmPackExpr(
SubstNonTypeTemplateParmPackExpr *E) {
VisitExpr(E);
- Writer.AddDeclRef(E->Param, Record);
+ Writer.AddDeclRef(E->getParameterPack(), Record);
Writer.AddTemplateArgument(E->getArgumentPack(), Record);
- Writer.AddSourceLocation(E->NameLoc, Record);
+ Writer.AddSourceLocation(E->getParameterPackLocation(), Record);
Code = serialization::EXPR_SUBST_NON_TYPE_TEMPLATE_PARM_PACK;
}
+void ASTStmtWriter::VisitMaterializeTemporaryExpr(MaterializeTemporaryExpr *E) {
+ VisitExpr(E);
+ Writer.AddStmt(E->Temporary);
+ Code = serialization::EXPR_MATERIALIZE_TEMPORARY;
+}
+
void ASTStmtWriter::VisitOpaqueValueExpr(OpaqueValueExpr *E) {
VisitExpr(E);
Record.push_back(Writer.getOpaqueValueID(E));
@@ -1439,11 +1342,52 @@ void ASTStmtWriter::VisitCUDAKernelCallExpr(CUDAKernelCallExpr *E) {
//===----------------------------------------------------------------------===//
void ASTStmtWriter::VisitAsTypeExpr(AsTypeExpr *E) {
VisitExpr(E);
+ Writer.AddSourceLocation(E->getBuiltinLoc(), Record);
+ Writer.AddSourceLocation(E->getRParenLoc(), Record);
Writer.AddStmt(E->getSrcExpr());
Code = serialization::EXPR_ASTYPE;
}
//===----------------------------------------------------------------------===//
+// Microsoft Expressions and Statements.
+//===----------------------------------------------------------------------===//
+void ASTStmtWriter::VisitCXXUuidofExpr(CXXUuidofExpr *E) {
+ VisitExpr(E);
+ Writer.AddSourceRange(E->getSourceRange(), Record);
+ if (E->isTypeOperand()) {
+ Writer.AddTypeSourceInfo(E->getTypeOperandSourceInfo(), Record);
+ Code = serialization::EXPR_CXX_UUIDOF_TYPE;
+ } else {
+ Writer.AddStmt(E->getExprOperand());
+ Code = serialization::EXPR_CXX_UUIDOF_EXPR;
+ }
+}
+
+void ASTStmtWriter::VisitSEHExceptStmt(SEHExceptStmt *S) {
+ VisitStmt(S);
+ Writer.AddSourceLocation(S->getExceptLoc(), Record);
+ Writer.AddStmt(S->getFilterExpr());
+ Writer.AddStmt(S->getBlock());
+ Code = serialization::STMT_SEH_EXCEPT;
+}
+
+void ASTStmtWriter::VisitSEHFinallyStmt(SEHFinallyStmt *S) {
+ VisitStmt(S);
+ Writer.AddSourceLocation(S->getFinallyLoc(), Record);
+ Writer.AddStmt(S->getBlock());
+ Code = serialization::STMT_SEH_FINALLY;
+}
+
+void ASTStmtWriter::VisitSEHTryStmt(SEHTryStmt *S) {
+ VisitStmt(S);
+ Record.push_back(S->getIsCXXTry());
+ Writer.AddSourceLocation(S->getTryLoc(), Record);
+ Writer.AddStmt(S->getTryBlock());
+ Writer.AddStmt(S->getHandler());
+ Code = serialization::STMT_SEH_TRY;
+}
+
+//===----------------------------------------------------------------------===//
// ASTWriter Implementation
//===----------------------------------------------------------------------===//
diff --git a/contrib/llvm/tools/clang/lib/Serialization/ChainedIncludesSource.cpp b/contrib/llvm/tools/clang/lib/Serialization/ChainedIncludesSource.cpp
index da5be95..3b7cd23 100644
--- a/contrib/llvm/tools/clang/lib/Serialization/ChainedIncludesSource.cpp
+++ b/contrib/llvm/tools/clang/lib/Serialization/ChainedIncludesSource.cpp
@@ -185,7 +185,8 @@ ChainedIncludesSource::FindExternalVisibleDeclsByName(const DeclContext *DC,
void ChainedIncludesSource::MaterializeVisibleDecls(const DeclContext *DC) {
return getFinalReader().MaterializeVisibleDecls(DC);
}
-bool ChainedIncludesSource::FindExternalLexicalDecls(const DeclContext *DC,
+ExternalLoadResult
+ChainedIncludesSource::FindExternalLexicalDecls(const DeclContext *DC,
bool (*isKindWeWant)(Decl::Kind),
llvm::SmallVectorImpl<Decl*> &Result) {
return getFinalReader().FindExternalLexicalDecls(DC, isKindWeWant, Result);
diff --git a/contrib/llvm/tools/clang/lib/StaticAnalyzer/Checkers/BasicObjCFoundationChecks.cpp b/contrib/llvm/tools/clang/lib/StaticAnalyzer/Checkers/BasicObjCFoundationChecks.cpp
index 235b400..9fc8163 100644
--- a/contrib/llvm/tools/clang/lib/StaticAnalyzer/Checkers/BasicObjCFoundationChecks.cpp
+++ b/contrib/llvm/tools/clang/lib/StaticAnalyzer/Checkers/BasicObjCFoundationChecks.cpp
@@ -606,7 +606,7 @@ void VariadicMethodTypeChecker::checkPreObjCMessage(ObjCMessage msg,
continue;
// Ignore CF references, which can be toll-free bridged.
- if (cocoa::isCFObjectRef(ArgTy))
+ if (coreFoundation::isCFObjectRef(ArgTy))
continue;
// Generate only one error node to use for all bug reports.
diff --git a/contrib/llvm/tools/clang/lib/StaticAnalyzer/Checkers/CStringChecker.cpp b/contrib/llvm/tools/clang/lib/StaticAnalyzer/Checkers/CStringChecker.cpp
index f2f5c1e..c5dac5d 100644
--- a/contrib/llvm/tools/clang/lib/StaticAnalyzer/Checkers/CStringChecker.cpp
+++ b/contrib/llvm/tools/clang/lib/StaticAnalyzer/Checkers/CStringChecker.cpp
@@ -30,8 +30,11 @@ class CStringChecker : public Checker< eval::Call,
check::DeadSymbols,
check::RegionChanges
> {
- mutable llvm::OwningPtr<BugType> BT_Null, BT_Bounds, BT_BoundsWrite,
- BT_Overlap, BT_NotCString;
+ mutable llvm::OwningPtr<BugType> BT_Null, BT_Bounds,
+ BT_Overlap, BT_NotCString,
+ BT_AdditionOverflow;
+ mutable const char *CurrentFunctionDescription;
+
public:
static void *getTag() { static int tag; return &tag; }
@@ -91,9 +94,11 @@ public:
const MemRegion *MR, SVal strLength);
static SVal getCStringLengthForRegion(CheckerContext &C,
const GRState *&state,
- const Expr *Ex, const MemRegion *MR);
+ const Expr *Ex, const MemRegion *MR,
+ bool hypothetical);
SVal getCStringLength(CheckerContext &C, const GRState *&state,
- const Expr *Ex, SVal Buf) const;
+ const Expr *Ex, SVal Buf,
+ bool hypothetical = false) const;
const StringLiteral *getCStringLiteral(CheckerContext &C,
const GRState *&state,
@@ -112,17 +117,29 @@ public:
const Expr *S, SVal l) const;
const GRState *CheckLocation(CheckerContext &C, const GRState *state,
const Expr *S, SVal l,
- bool IsDestination = false) const;
+ const char *message = NULL) const;
const GRState *CheckBufferAccess(CheckerContext &C, const GRState *state,
const Expr *Size,
const Expr *FirstBuf,
- const Expr *SecondBuf = NULL,
- bool FirstIsDestination = false) const;
+ const Expr *SecondBuf,
+ const char *firstMessage = NULL,
+ const char *secondMessage = NULL,
+ bool WarnAboutSize = false) const;
+ const GRState *CheckBufferAccess(CheckerContext &C, const GRState *state,
+ const Expr *Size, const Expr *Buf,
+ const char *message = NULL,
+ bool WarnAboutSize = false) const {
+ // This is a convenience override.
+ return CheckBufferAccess(C, state, Size, Buf, NULL, message, NULL,
+ WarnAboutSize);
+ }
const GRState *CheckOverlap(CheckerContext &C, const GRState *state,
const Expr *Size, const Expr *First,
const Expr *Second) const;
void emitOverlapBug(CheckerContext &C, const GRState *state,
const Stmt *First, const Stmt *Second) const;
+ const GRState *checkAdditionOverflow(CheckerContext &C, const GRState *state,
+ NonLoc left, NonLoc right) const;
};
class CStringLength {
@@ -176,10 +193,14 @@ const GRState *CStringChecker::checkNonNull(CheckerContext &C,
BT_Null.reset(new BuiltinBug("API",
"Null pointer argument in call to byte string function"));
+ llvm::SmallString<80> buf;
+ llvm::raw_svector_ostream os(buf);
+ assert(CurrentFunctionDescription);
+ os << "Null pointer argument in call to " << CurrentFunctionDescription;
+
// Generate a report for this bug.
BuiltinBug *BT = static_cast<BuiltinBug*>(BT_Null.get());
- EnhancedBugReport *report = new EnhancedBugReport(*BT,
- BT->getDescription(), N);
+ EnhancedBugReport *report = new EnhancedBugReport(*BT, os.str(), N);
report->addRange(S->getSourceRange());
report->addVisitorCreator(bugreporter::registerTrackNullOrUndefValue, S);
@@ -196,7 +217,7 @@ const GRState *CStringChecker::checkNonNull(CheckerContext &C,
const GRState *CStringChecker::CheckLocation(CheckerContext &C,
const GRState *state,
const Expr *S, SVal l,
- bool IsDestination) const {
+ const char *warningMsg) const {
// If a previous check has failed, propagate the failure.
if (!state)
return NULL;
@@ -216,7 +237,8 @@ const GRState *CStringChecker::CheckLocation(CheckerContext &C,
// Get the size of the array.
const SubRegion *superReg = cast<SubRegion>(ER->getSuperRegion());
SValBuilder &svalBuilder = C.getSValBuilder();
- SVal Extent = svalBuilder.convertToArrayIndex(superReg->getExtent(svalBuilder));
+ SVal Extent =
+ svalBuilder.convertToArrayIndex(superReg->getExtent(svalBuilder));
DefinedOrUnknownSVal Size = cast<DefinedOrUnknownSVal>(Extent);
// Get the index of the accessed element.
@@ -229,28 +251,32 @@ const GRState *CStringChecker::CheckLocation(CheckerContext &C,
if (!N)
return NULL;
- BuiltinBug *BT;
- if (IsDestination) {
- if (!BT_BoundsWrite) {
- BT_BoundsWrite.reset(new BuiltinBug("Out-of-bound array access",
- "Byte string function overflows destination buffer"));
- }
- BT = static_cast<BuiltinBug*>(BT_BoundsWrite.get());
+ if (!BT_Bounds) {
+ BT_Bounds.reset(new BuiltinBug("Out-of-bound array access",
+ "Byte string function accesses out-of-bound array element"));
+ }
+ BuiltinBug *BT = static_cast<BuiltinBug*>(BT_Bounds.get());
+
+ // Generate a report for this bug.
+ RangedBugReport *report;
+ if (warningMsg) {
+ report = new RangedBugReport(*BT, warningMsg, N);
} else {
- if (!BT_Bounds) {
- BT_Bounds.reset(new BuiltinBug("Out-of-bound array access",
- "Byte string function accesses out-of-bound array element"));
- }
- BT = static_cast<BuiltinBug*>(BT_Bounds.get());
+ assert(CurrentFunctionDescription);
+ assert(CurrentFunctionDescription[0] != '\0');
+
+ llvm::SmallString<80> buf;
+ llvm::raw_svector_ostream os(buf);
+ os << (char)toupper(CurrentFunctionDescription[0])
+ << &CurrentFunctionDescription[1]
+ << " accesses out-of-bound array element";
+ report = new RangedBugReport(*BT, os.str(), N);
}
// FIXME: It would be nice to eventually make this diagnostic more clear,
// e.g., by referencing the original declaration or by saying *why* this
// reference is outside the range.
- // Generate a report for this bug.
- RangedBugReport *report = new RangedBugReport(*BT, BT->getDescription(), N);
-
report->addRange(S->getSourceRange());
C.EmitReport(report);
return NULL;
@@ -266,13 +292,15 @@ const GRState *CStringChecker::CheckBufferAccess(CheckerContext &C,
const Expr *Size,
const Expr *FirstBuf,
const Expr *SecondBuf,
- bool FirstIsDestination) const {
+ const char *firstMessage,
+ const char *secondMessage,
+ bool WarnAboutSize) const {
// If a previous check has failed, propagate the failure.
if (!state)
return NULL;
SValBuilder &svalBuilder = C.getSValBuilder();
- ASTContext &Ctx = C.getASTContext();
+ ASTContext &Ctx = svalBuilder.getContext();
QualType sizeTy = Size->getType();
QualType PtrTy = Ctx.getPointerType(Ctx.CharTy);
@@ -284,6 +312,8 @@ const GRState *CStringChecker::CheckBufferAccess(CheckerContext &C,
return NULL;
// Get the access length and make sure it is known.
+ // FIXME: This assumes the caller has already checked that the access length
+ // is positive. And that it's unsigned.
SVal LengthVal = state->getSVal(Size);
NonLoc *Length = dyn_cast<NonLoc>(&LengthVal);
if (!Length)
@@ -297,9 +327,11 @@ const GRState *CStringChecker::CheckBufferAccess(CheckerContext &C,
// Check that the first buffer is sufficiently long.
SVal BufStart = svalBuilder.evalCast(BufVal, PtrTy, FirstBuf->getType());
if (Loc *BufLoc = dyn_cast<Loc>(&BufStart)) {
+ const Expr *warningExpr = (WarnAboutSize ? Size : FirstBuf);
+
SVal BufEnd = svalBuilder.evalBinOpLN(state, BO_Add, *BufLoc,
LastOffset, PtrTy);
- state = CheckLocation(C, state, FirstBuf, BufEnd, FirstIsDestination);
+ state = CheckLocation(C, state, warningExpr, BufEnd, firstMessage);
// If the buffer isn't large enough, abort.
if (!state)
@@ -315,9 +347,11 @@ const GRState *CStringChecker::CheckBufferAccess(CheckerContext &C,
BufStart = svalBuilder.evalCast(BufVal, PtrTy, SecondBuf->getType());
if (Loc *BufLoc = dyn_cast<Loc>(&BufStart)) {
+ const Expr *warningExpr = (WarnAboutSize ? Size : SecondBuf);
+
SVal BufEnd = svalBuilder.evalBinOpLN(state, BO_Add, *BufLoc,
LastOffset, PtrTy);
- state = CheckLocation(C, state, SecondBuf, BufEnd);
+ state = CheckLocation(C, state, warningExpr, BufEnd, secondMessage);
}
}
@@ -368,8 +402,7 @@ const GRState *CStringChecker::CheckOverlap(CheckerContext &C,
state = stateFalse;
// Which value comes first?
- ASTContext &Ctx = svalBuilder.getContext();
- QualType cmpTy = Ctx.IntTy;
+ QualType cmpTy = svalBuilder.getConditionType();
SVal reverse = svalBuilder.evalBinOpLL(state, BO_GT,
*firstLoc, *secondLoc, cmpTy);
DefinedOrUnknownSVal *reverseTest = dyn_cast<DefinedOrUnknownSVal>(&reverse);
@@ -402,8 +435,10 @@ const GRState *CStringChecker::CheckOverlap(CheckerContext &C,
// Convert the first buffer's start address to char*.
// Bail out if the cast fails.
+ ASTContext &Ctx = svalBuilder.getContext();
QualType CharPtrTy = Ctx.getPointerType(Ctx.CharTy);
- SVal FirstStart = svalBuilder.evalCast(*firstLoc, CharPtrTy, First->getType());
+ SVal FirstStart = svalBuilder.evalCast(*firstLoc, CharPtrTy,
+ First->getType());
Loc *FirstStartLoc = dyn_cast<Loc>(&FirstStart);
if (!FirstStartLoc)
return state;
@@ -454,12 +489,78 @@ void CStringChecker::emitOverlapBug(CheckerContext &C, const GRState *state,
C.EmitReport(report);
}
+const GRState *CStringChecker::checkAdditionOverflow(CheckerContext &C,
+ const GRState *state,
+ NonLoc left,
+ NonLoc right) const {
+ // If a previous check has failed, propagate the failure.
+ if (!state)
+ return NULL;
+
+ SValBuilder &svalBuilder = C.getSValBuilder();
+ BasicValueFactory &BVF = svalBuilder.getBasicValueFactory();
+
+ QualType sizeTy = svalBuilder.getContext().getSizeType();
+ const llvm::APSInt &maxValInt = BVF.getMaxValue(sizeTy);
+ NonLoc maxVal = svalBuilder.makeIntVal(maxValInt);
+
+ SVal maxMinusRight = svalBuilder.evalBinOpNN(state, BO_Sub, maxVal, right,
+ sizeTy);
+
+ if (maxMinusRight.isUnknownOrUndef()) {
+ // Try switching the operands. (The order of these two assignments is
+ // important!)
+ maxMinusRight = svalBuilder.evalBinOpNN(state, BO_Sub, maxVal, left,
+ sizeTy);
+ left = right;
+ }
+
+ if (NonLoc *maxMinusRightNL = dyn_cast<NonLoc>(&maxMinusRight)) {
+ QualType cmpTy = svalBuilder.getConditionType();
+ // If left > max - right, we have an overflow.
+ SVal willOverflow = svalBuilder.evalBinOpNN(state, BO_GT, left,
+ *maxMinusRightNL, cmpTy);
+
+ const GRState *stateOverflow, *stateOkay;
+ llvm::tie(stateOverflow, stateOkay) =
+ state->assume(cast<DefinedOrUnknownSVal>(willOverflow));
+
+ if (stateOverflow && !stateOkay) {
+ // We have an overflow. Emit a bug report.
+ ExplodedNode *N = C.generateSink(stateOverflow);
+ if (!N)
+ return NULL;
+
+ if (!BT_AdditionOverflow)
+ BT_AdditionOverflow.reset(new BuiltinBug("API",
+ "Sum of expressions causes overflow"));
+
+ // This isn't a great error message, but this should never occur in real
+ // code anyway -- you'd have to create a buffer longer than a size_t can
+ // represent, which is sort of a contradiction.
+ const char *warning =
+ "This expression will create a string whose length is too big to "
+ "be represented as a size_t";
+
+ // Generate a report for this bug.
+ BugReport *report = new BugReport(*BT_AdditionOverflow, warning, N);
+ C.EmitReport(report);
+
+ return NULL;
+ }
+
+ // From now on, assume an overflow didn't occur.
+ assert(stateOkay);
+ state = stateOkay;
+ }
+
+ return state;
+}
+
const GRState *CStringChecker::setCStringLength(const GRState *state,
const MemRegion *MR,
SVal strLength) {
assert(!strLength.isUndef() && "Attempt to set an undefined string length");
- if (strLength.isUnknown())
- return state;
MR = MR->StripCasts();
@@ -474,7 +575,8 @@ const GRState *CStringChecker::setCStringLength(const GRState *state,
case MemRegion::VarRegionKind:
case MemRegion::FieldRegionKind:
case MemRegion::ObjCIvarRegionKind:
- return state->set<CStringLength>(MR, strLength);
+ // These are the types we can currently track string lengths for.
+ break;
case MemRegion::ElementRegionKind:
// FIXME: Handle element regions by upper-bounding the parent region's
@@ -488,16 +590,24 @@ const GRState *CStringChecker::setCStringLength(const GRState *state,
// warning for things like strcpy((char[]){'a', 0}, "b");
return state;
}
+
+ if (strLength.isUnknown())
+ return state->remove<CStringLength>(MR);
+
+ return state->set<CStringLength>(MR, strLength);
}
SVal CStringChecker::getCStringLengthForRegion(CheckerContext &C,
const GRState *&state,
const Expr *Ex,
- const MemRegion *MR) {
- // If there's a recorded length, go ahead and return it.
- const SVal *Recorded = state->get<CStringLength>(MR);
- if (Recorded)
- return *Recorded;
+ const MemRegion *MR,
+ bool hypothetical) {
+ if (!hypothetical) {
+ // If there's a recorded length, go ahead and return it.
+ const SVal *Recorded = state->get<CStringLength>(MR);
+ if (Recorded)
+ return *Recorded;
+ }
// Otherwise, get a new symbol and update the state.
unsigned Count = C.getNodeBuilder().getCurrentBlockCount();
@@ -505,12 +615,16 @@ SVal CStringChecker::getCStringLengthForRegion(CheckerContext &C,
QualType sizeTy = svalBuilder.getContext().getSizeType();
SVal strLength = svalBuilder.getMetadataSymbolVal(CStringChecker::getTag(),
MR, Ex, sizeTy, Count);
- state = state->set<CStringLength>(MR, strLength);
+
+ if (!hypothetical)
+ state = state->set<CStringLength>(MR, strLength);
+
return strLength;
}
SVal CStringChecker::getCStringLength(CheckerContext &C, const GRState *&state,
- const Expr *Ex, SVal Buf) const {
+ const Expr *Ex, SVal Buf,
+ bool hypothetical) const {
const MemRegion *MR = Buf.getAsRegion();
if (!MR) {
// If we can't get a region, see if it's something we /know/ isn't a
@@ -524,8 +638,9 @@ SVal CStringChecker::getCStringLength(CheckerContext &C, const GRState *&state,
llvm::SmallString<120> buf;
llvm::raw_svector_ostream os(buf);
- os << "Argument to byte string function is the address of the label '"
- << Label->getLabel()->getName()
+ assert(CurrentFunctionDescription);
+ os << "Argument to " << CurrentFunctionDescription
+ << " is the address of the label '" << Label->getLabel()->getName()
<< "', which is not a null-terminated string";
// Generate a report for this bug.
@@ -561,7 +676,7 @@ SVal CStringChecker::getCStringLength(CheckerContext &C, const GRState *&state,
case MemRegion::VarRegionKind:
case MemRegion::FieldRegionKind:
case MemRegion::ObjCIvarRegionKind:
- return getCStringLengthForRegion(C, state, Ex, MR);
+ return getCStringLengthForRegion(C, state, Ex, MR, hypothetical);
case MemRegion::CompoundLiteralRegionKind:
// FIXME: Can we track this? Is it necessary?
return UnknownVal();
@@ -581,7 +696,8 @@ SVal CStringChecker::getCStringLength(CheckerContext &C, const GRState *&state,
llvm::SmallString<120> buf;
llvm::raw_svector_ostream os(buf);
- os << "Argument to byte string function is ";
+ assert(CurrentFunctionDescription);
+ os << "Argument to " << CurrentFunctionDescription << " is ";
if (SummarizeRegion(os, C.getASTContext(), MR))
os << ", which is not a null-terminated string";
@@ -700,12 +816,15 @@ void CStringChecker::evalCopyCommon(CheckerContext &C,
const Expr *Size, const Expr *Dest,
const Expr *Source, bool Restricted,
bool IsMempcpy) const {
+ CurrentFunctionDescription = "memory copy function";
+
// See if the size argument is zero.
SVal sizeVal = state->getSVal(Size);
QualType sizeTy = Size->getType();
const GRState *stateZeroSize, *stateNonZeroSize;
- llvm::tie(stateZeroSize, stateNonZeroSize) = assumeZero(C, state, sizeVal, sizeTy);
+ llvm::tie(stateZeroSize, stateNonZeroSize) =
+ assumeZero(C, state, sizeVal, sizeTy);
// Get the value of the Dest.
SVal destVal = state->getSVal(Dest);
@@ -737,8 +856,10 @@ void CStringChecker::evalCopyCommon(CheckerContext &C,
return;
// Ensure the accesses are valid and that the buffers do not overlap.
+ const char * const writeWarning =
+ "Memory copy function overflows destination buffer";
state = CheckBufferAccess(C, state, Size, Dest, Source,
- /* FirstIsDst = */ true);
+ writeWarning, /* sourceWarning = */ NULL);
if (Restricted)
state = CheckOverlap(C, state, Size, Dest, Source);
@@ -824,6 +945,8 @@ void CStringChecker::evalBcopy(CheckerContext &C, const CallExpr *CE) const {
void CStringChecker::evalMemcmp(CheckerContext &C, const CallExpr *CE) const {
// int memcmp(const void *s1, const void *s2, size_t n);
+ CurrentFunctionDescription = "memory comparison function";
+
const Expr *Left = CE->getArg(0);
const Expr *Right = CE->getArg(1);
const Expr *Size = CE->getArg(2);
@@ -861,7 +984,7 @@ void CStringChecker::evalMemcmp(CheckerContext &C, const CallExpr *CE) const {
const GRState *StSameBuf, *StNotSameBuf;
llvm::tie(StSameBuf, StNotSameBuf) = state->assume(SameBuf);
- // If the two arguments might be the same buffer, we know the result is zero,
+ // If the two arguments might be the same buffer, we know the result is 0,
// and we only need to check one size.
if (StSameBuf) {
state = StSameBuf;
@@ -902,58 +1025,126 @@ void CStringChecker::evalstrnLength(CheckerContext &C,
void CStringChecker::evalstrLengthCommon(CheckerContext &C, const CallExpr *CE,
bool IsStrnlen) const {
+ CurrentFunctionDescription = "string length function";
const GRState *state = C.getState();
+
+ if (IsStrnlen) {
+ const Expr *maxlenExpr = CE->getArg(1);
+ SVal maxlenVal = state->getSVal(maxlenExpr);
+
+ const GRState *stateZeroSize, *stateNonZeroSize;
+ llvm::tie(stateZeroSize, stateNonZeroSize) =
+ assumeZero(C, state, maxlenVal, maxlenExpr->getType());
+
+ // If the size can be zero, the result will be 0 in that case, and we don't
+ // have to check the string itself.
+ if (stateZeroSize) {
+ SVal zero = C.getSValBuilder().makeZeroVal(CE->getType());
+ stateZeroSize = stateZeroSize->BindExpr(CE, zero);
+ C.addTransition(stateZeroSize);
+ }
+
+ // If the size is GUARANTEED to be zero, we're done!
+ if (!stateNonZeroSize)
+ return;
+
+ // Otherwise, record the assumption that the size is nonzero.
+ state = stateNonZeroSize;
+ }
+
+ // Check that the string argument is non-null.
const Expr *Arg = CE->getArg(0);
SVal ArgVal = state->getSVal(Arg);
- // Check that the argument is non-null.
state = checkNonNull(C, state, Arg, ArgVal);
- if (state) {
- SVal strLength = getCStringLength(C, state, Arg, ArgVal);
+ if (!state)
+ return;
- // If the argument isn't a valid C string, there's no valid state to
- // transition to.
- if (strLength.isUndef())
- return;
+ SVal strLength = getCStringLength(C, state, Arg, ArgVal);
- // If the check is for strnlen() then bind the return value to no more than
- // the maxlen value.
- if (IsStrnlen) {
- const Expr *maxlenExpr = CE->getArg(1);
- SVal maxlenVal = state->getSVal(maxlenExpr);
-
- NonLoc *strLengthNL = dyn_cast<NonLoc>(&strLength);
- NonLoc *maxlenValNL = dyn_cast<NonLoc>(&maxlenVal);
+ // If the argument isn't a valid C string, there's no valid state to
+ // transition to.
+ if (strLength.isUndef())
+ return;
- QualType cmpTy = C.getSValBuilder().getContext().IntTy;
- const GRState *stateTrue, *stateFalse;
-
- // Check if the strLength is greater than or equal to the maxlen
- llvm::tie(stateTrue, stateFalse) =
+ DefinedOrUnknownSVal result = UnknownVal();
+
+ // If the check is for strnlen() then bind the return value to no more than
+ // the maxlen value.
+ if (IsStrnlen) {
+ QualType cmpTy = C.getSValBuilder().getConditionType();
+
+ // It's a little unfortunate to be getting this again,
+ // but it's not that expensive...
+ const Expr *maxlenExpr = CE->getArg(1);
+ SVal maxlenVal = state->getSVal(maxlenExpr);
+
+ NonLoc *strLengthNL = dyn_cast<NonLoc>(&strLength);
+ NonLoc *maxlenValNL = dyn_cast<NonLoc>(&maxlenVal);
+
+ if (strLengthNL && maxlenValNL) {
+ const GRState *stateStringTooLong, *stateStringNotTooLong;
+
+ // Check if the strLength is greater than the maxlen.
+ llvm::tie(stateStringTooLong, stateStringNotTooLong) =
state->assume(cast<DefinedOrUnknownSVal>
- (C.getSValBuilder().evalBinOpNN(state, BO_GE,
- *strLengthNL, *maxlenValNL,
+ (C.getSValBuilder().evalBinOpNN(state, BO_GT,
+ *strLengthNL,
+ *maxlenValNL,
cmpTy)));
- // If the strLength is greater than or equal to the maxlen, set strLength
- // to maxlen
- if (stateTrue && !stateFalse) {
- strLength = maxlenVal;
+ if (stateStringTooLong && !stateStringNotTooLong) {
+ // If the string is longer than maxlen, return maxlen.
+ result = *maxlenValNL;
+ } else if (stateStringNotTooLong && !stateStringTooLong) {
+ // If the string is shorter than maxlen, return its length.
+ result = *strLengthNL;
}
}
- // If getCStringLength couldn't figure out the length, conjure a return
- // value, so it can be used in constraints, at least.
- if (strLength.isUnknown()) {
+ if (result.isUnknown()) {
+ // If we don't have enough information for a comparison, there's
+ // no guarantee the full string length will actually be returned.
+ // All we know is the return value is the min of the string length
+ // and the limit. This is better than nothing.
unsigned Count = C.getNodeBuilder().getCurrentBlockCount();
- strLength = C.getSValBuilder().getConjuredSymbolVal(NULL, CE, Count);
+ result = C.getSValBuilder().getConjuredSymbolVal(NULL, CE, Count);
+ NonLoc *resultNL = cast<NonLoc>(&result);
+
+ if (strLengthNL) {
+ state = state->assume(cast<DefinedOrUnknownSVal>
+ (C.getSValBuilder().evalBinOpNN(state, BO_LE,
+ *resultNL,
+ *strLengthNL,
+ cmpTy)), true);
+ }
+
+ if (maxlenValNL) {
+ state = state->assume(cast<DefinedOrUnknownSVal>
+ (C.getSValBuilder().evalBinOpNN(state, BO_LE,
+ *resultNL,
+ *maxlenValNL,
+ cmpTy)), true);
+ }
}
- // Bind the return value.
- state = state->BindExpr(CE, strLength);
- C.addTransition(state);
+ } else {
+ // This is a plain strlen(), not strnlen().
+ result = cast<DefinedOrUnknownSVal>(strLength);
+
+ // If we don't know the length of the string, conjure a return
+ // value, so it can be used in constraints, at least.
+ if (result.isUnknown()) {
+ unsigned Count = C.getNodeBuilder().getCurrentBlockCount();
+ result = C.getSValBuilder().getConjuredSymbolVal(NULL, CE, Count);
+ }
}
+
+ // Bind the return value.
+ assert(!result.isUnknown() && "Should have conjured a value by now");
+ state = state->BindExpr(CE, result);
+ C.addTransition(state);
}
void CStringChecker::evalStrcpy(CheckerContext &C, const CallExpr *CE) const {
@@ -999,6 +1190,7 @@ void CStringChecker::evalStrncat(CheckerContext &C, const CallExpr *CE) const {
void CStringChecker::evalStrcpyCommon(CheckerContext &C, const CallExpr *CE,
bool returnEnd, bool isBounded,
bool isAppending) const {
+ CurrentFunctionDescription = "string copy function";
const GRState *state = C.getState();
// Check that the destination is non-null.
@@ -1023,76 +1215,240 @@ void CStringChecker::evalStrcpyCommon(CheckerContext &C, const CallExpr *CE,
if (strLength.isUndef())
return;
+ SValBuilder &svalBuilder = C.getSValBuilder();
+ QualType cmpTy = svalBuilder.getConditionType();
+ QualType sizeTy = svalBuilder.getContext().getSizeType();
+
+ // These two values allow checking two kinds of errors:
+ // - actual overflows caused by a source that doesn't fit in the destination
+ // - potential overflows caused by a bound that could exceed the destination
+ SVal amountCopied = UnknownVal();
+ SVal maxLastElementIndex = UnknownVal();
+ const char *boundWarning = NULL;
+
// If the function is strncpy, strncat, etc... it is bounded.
if (isBounded) {
// Get the max number of characters to copy.
const Expr *lenExpr = CE->getArg(2);
SVal lenVal = state->getSVal(lenExpr);
- // Cast the length to a NonLoc SVal. If it is not a NonLoc then give up.
- NonLoc *strLengthNL = dyn_cast<NonLoc>(&strLength);
- if (!strLengthNL)
- return;
+ // Protect against misdeclared strncpy().
+ lenVal = svalBuilder.evalCast(lenVal, sizeTy, lenExpr->getType());
- // Cast the max length to a NonLoc SVal. If it is not a NonLoc then give up.
+ NonLoc *strLengthNL = dyn_cast<NonLoc>(&strLength);
NonLoc *lenValNL = dyn_cast<NonLoc>(&lenVal);
- if (!lenValNL)
- return;
- QualType cmpTy = C.getSValBuilder().getContext().IntTy;
- const GRState *stateTrue, *stateFalse;
-
- // Check if the max number to copy is less than the length of the src.
- llvm::tie(stateTrue, stateFalse) =
- state->assume(cast<DefinedOrUnknownSVal>
- (C.getSValBuilder().evalBinOpNN(state, BO_GT,
- *strLengthNL, *lenValNL,
- cmpTy)));
-
- if (stateTrue) {
- // Max number to copy is less than the length of the src, so the actual
- // strLength copied is the max number arg.
- strLength = lenVal;
- }
+ // If we know both values, we might be able to figure out how much
+ // we're copying.
+ if (strLengthNL && lenValNL) {
+ const GRState *stateSourceTooLong, *stateSourceNotTooLong;
+
+ // Check if the max number to copy is less than the length of the src.
+ // If the bound is equal to the source length, strncpy won't null-
+ // terminate the result!
+ llvm::tie(stateSourceTooLong, stateSourceNotTooLong) =
+ state->assume(cast<DefinedOrUnknownSVal>
+ (svalBuilder.evalBinOpNN(state, BO_GE, *strLengthNL,
+ *lenValNL, cmpTy)));
+
+ if (stateSourceTooLong && !stateSourceNotTooLong) {
+ // Max number to copy is less than the length of the src, so the actual
+ // strLength copied is the max number arg.
+ state = stateSourceTooLong;
+ amountCopied = lenVal;
+
+ } else if (!stateSourceTooLong && stateSourceNotTooLong) {
+ // The source buffer entirely fits in the bound.
+ state = stateSourceNotTooLong;
+ amountCopied = strLength;
+ }
+ }
+
+ // We still want to know if the bound is known to be too large.
+ if (lenValNL) {
+ if (isAppending) {
+ // For strncat, the check is strlen(dst) + lenVal < sizeof(dst)
+
+ // Get the string length of the destination. If the destination is
+ // memory that can't have a string length, we shouldn't be copying
+ // into it anyway.
+ SVal dstStrLength = getCStringLength(C, state, Dst, DstVal);
+ if (dstStrLength.isUndef())
+ return;
+
+ if (NonLoc *dstStrLengthNL = dyn_cast<NonLoc>(&dstStrLength)) {
+ maxLastElementIndex = svalBuilder.evalBinOpNN(state, BO_Add,
+ *lenValNL,
+ *dstStrLengthNL,
+ sizeTy);
+ boundWarning = "Size argument is greater than the free space in the "
+ "destination buffer";
+ }
+
+ } else {
+ // For strncpy, this is just checking that lenVal <= sizeof(dst)
+ // (Yes, strncpy and strncat differ in how they treat termination.
+ // strncat ALWAYS terminates, but strncpy doesn't.)
+ NonLoc one = cast<NonLoc>(svalBuilder.makeIntVal(1, sizeTy));
+ maxLastElementIndex = svalBuilder.evalBinOpNN(state, BO_Sub, *lenValNL,
+ one, sizeTy);
+ boundWarning = "Size argument is greater than the length of the "
+ "destination buffer";
+ }
+ }
+
+ // If we couldn't pin down the copy length, at least bound it.
+ // FIXME: We should actually run this code path for append as well, but
+ // right now it creates problems with constraints (since we can end up
+ // trying to pass constraints from symbol to symbol).
+ if (amountCopied.isUnknown() && !isAppending) {
+ // Try to get a "hypothetical" string length symbol, which we can later
+ // set as a real value if that turns out to be the case.
+ amountCopied = getCStringLength(C, state, lenExpr, srcVal, true);
+ assert(!amountCopied.isUndef());
+
+ if (NonLoc *amountCopiedNL = dyn_cast<NonLoc>(&amountCopied)) {
+ if (lenValNL) {
+ // amountCopied <= lenVal
+ SVal copiedLessThanBound = svalBuilder.evalBinOpNN(state, BO_LE,
+ *amountCopiedNL,
+ *lenValNL,
+ cmpTy);
+ state = state->assume(cast<DefinedOrUnknownSVal>(copiedLessThanBound),
+ true);
+ if (!state)
+ return;
+ }
+
+ if (strLengthNL) {
+ // amountCopied <= strlen(source)
+ SVal copiedLessThanSrc = svalBuilder.evalBinOpNN(state, BO_LE,
+ *amountCopiedNL,
+ *strLengthNL,
+ cmpTy);
+ state = state->assume(cast<DefinedOrUnknownSVal>(copiedLessThanSrc),
+ true);
+ if (!state)
+ return;
+ }
+ }
+ }
+
+ } else {
+ // The function isn't bounded. The amount copied should match the length
+ // of the source buffer.
+ amountCopied = strLength;
}
+ assert(state);
+
+ // This represents the number of characters copied into the destination
+ // buffer. (It may not actually be the strlen if the destination buffer
+ // is not terminated.)
+ SVal finalStrLength = UnknownVal();
+
// If this is an appending function (strcat, strncat...) then set the
// string length to strlen(src) + strlen(dst) since the buffer will
// ultimately contain both.
if (isAppending) {
- // Get the string length of the destination, or give up.
+ // Get the string length of the destination. If the destination is memory
+ // that can't have a string length, we shouldn't be copying into it anyway.
SVal dstStrLength = getCStringLength(C, state, Dst, DstVal);
if (dstStrLength.isUndef())
return;
- NonLoc *srcStrLengthNL = dyn_cast<NonLoc>(&strLength);
+ NonLoc *srcStrLengthNL = dyn_cast<NonLoc>(&amountCopied);
NonLoc *dstStrLengthNL = dyn_cast<NonLoc>(&dstStrLength);
- // If src or dst cast to NonLoc is NULL, give up.
- if ((!srcStrLengthNL) || (!dstStrLengthNL))
- return;
+ // If we know both string lengths, we might know the final string length.
+ if (srcStrLengthNL && dstStrLengthNL) {
+ // Make sure the two lengths together don't overflow a size_t.
+ state = checkAdditionOverflow(C, state, *srcStrLengthNL, *dstStrLengthNL);
+ if (!state)
+ return;
+
+ finalStrLength = svalBuilder.evalBinOpNN(state, BO_Add, *srcStrLengthNL,
+ *dstStrLengthNL, sizeTy);
+ }
- QualType addTy = C.getSValBuilder().getContext().getSizeType();
+ // If we couldn't get a single value for the final string length,
+ // we can at least bound it by the individual lengths.
+ if (finalStrLength.isUnknown()) {
+ // Try to get a "hypothetical" string length symbol, which we can later
+ // set as a real value if that turns out to be the case.
+ finalStrLength = getCStringLength(C, state, CE, DstVal, true);
+ assert(!finalStrLength.isUndef());
+
+ if (NonLoc *finalStrLengthNL = dyn_cast<NonLoc>(&finalStrLength)) {
+ if (srcStrLengthNL) {
+ // finalStrLength >= srcStrLength
+ SVal sourceInResult = svalBuilder.evalBinOpNN(state, BO_GE,
+ *finalStrLengthNL,
+ *srcStrLengthNL,
+ cmpTy);
+ state = state->assume(cast<DefinedOrUnknownSVal>(sourceInResult),
+ true);
+ if (!state)
+ return;
+ }
+
+ if (dstStrLengthNL) {
+ // finalStrLength >= dstStrLength
+ SVal destInResult = svalBuilder.evalBinOpNN(state, BO_GE,
+ *finalStrLengthNL,
+ *dstStrLengthNL,
+ cmpTy);
+ state = state->assume(cast<DefinedOrUnknownSVal>(destInResult),
+ true);
+ if (!state)
+ return;
+ }
+ }
+ }
- strLength = C.getSValBuilder().evalBinOpNN(state, BO_Add,
- *srcStrLengthNL, *dstStrLengthNL,
- addTy);
+ } else {
+ // Otherwise, this is a copy-over function (strcpy, strncpy, ...), and
+ // the final string length will match the input string length.
+ finalStrLength = amountCopied;
}
+ // The final result of the function will either be a pointer past the last
+ // copied element, or a pointer to the start of the destination buffer.
SVal Result = (returnEnd ? UnknownVal() : DstVal);
+ assert(state);
+
// If the destination is a MemRegion, try to check for a buffer overflow and
// record the new string length.
if (loc::MemRegionVal *dstRegVal = dyn_cast<loc::MemRegionVal>(&DstVal)) {
- // If the length is known, we can check for an overflow.
- if (NonLoc *knownStrLength = dyn_cast<NonLoc>(&strLength)) {
- SVal lastElement =
- C.getSValBuilder().evalBinOpLN(state, BO_Add, *dstRegVal,
- *knownStrLength, Dst->getType());
+ QualType ptrTy = Dst->getType();
+
+ // If we have an exact value on a bounded copy, use that to check for
+ // overflows, rather than our estimate about how much is actually copied.
+ if (boundWarning) {
+ if (NonLoc *maxLastNL = dyn_cast<NonLoc>(&maxLastElementIndex)) {
+ SVal maxLastElement = svalBuilder.evalBinOpLN(state, BO_Add, *dstRegVal,
+ *maxLastNL, ptrTy);
+ state = CheckLocation(C, state, CE->getArg(2), maxLastElement,
+ boundWarning);
+ if (!state)
+ return;
+ }
+ }
- state = CheckLocation(C, state, Dst, lastElement, /* IsDst = */ true);
- if (!state)
- return;
+ // Then, if the final length is known...
+ if (NonLoc *knownStrLength = dyn_cast<NonLoc>(&finalStrLength)) {
+ SVal lastElement = svalBuilder.evalBinOpLN(state, BO_Add, *dstRegVal,
+ *knownStrLength, ptrTy);
+
+ // ...and we haven't checked the bound, we'll check the actual copy.
+ if (!boundWarning) {
+ const char * const warningMsg =
+ "String copy function overflows destination buffer";
+ state = CheckLocation(C, state, Dst, lastElement, warningMsg);
+ if (!state)
+ return;
+ }
// If this is a stpcpy-style copy, the last element is the return value.
if (returnEnd)
@@ -1107,16 +1463,25 @@ void CStringChecker::evalStrcpyCommon(CheckerContext &C, const CallExpr *CE,
// string, but that's still an improvement over blank invalidation.
state = InvalidateBuffer(C, state, Dst, *dstRegVal);
- // Set the C string length of the destination.
- state = setCStringLength(state, dstRegVal->getRegion(), strLength);
+ // Set the C string length of the destination, if we know it.
+ if (isBounded && !isAppending) {
+ // strncpy is annoying in that it doesn't guarantee to null-terminate
+ // the result string. If the original string didn't fit entirely inside
+ // the bound (including the null-terminator), we don't know how long the
+ // result is.
+ if (amountCopied != strLength)
+ finalStrLength = UnknownVal();
+ }
+ state = setCStringLength(state, dstRegVal->getRegion(), finalStrLength);
}
+ assert(state);
+
// If this is a stpcpy-style copy, but we were unable to check for a buffer
// overflow, we still need a result. Conjure a return value.
if (returnEnd && Result.isUnknown()) {
- SValBuilder &svalBuilder = C.getSValBuilder();
unsigned Count = C.getNodeBuilder().getCurrentBlockCount();
- strLength = svalBuilder.getConjuredSymbolVal(NULL, CE, Count);
+ Result = svalBuilder.getConjuredSymbolVal(NULL, CE, Count);
}
// Set the return value.
@@ -1125,29 +1490,30 @@ void CStringChecker::evalStrcpyCommon(CheckerContext &C, const CallExpr *CE,
}
void CStringChecker::evalStrcmp(CheckerContext &C, const CallExpr *CE) const {
- //int strcmp(const char *restrict s1, const char *restrict s2);
+ //int strcmp(const char *s1, const char *s2);
evalStrcmpCommon(C, CE, /* isBounded = */ false, /* ignoreCase = */ false);
}
void CStringChecker::evalStrncmp(CheckerContext &C, const CallExpr *CE) const {
- //int strncmp(const char *restrict s1, const char *restrict s2, size_t n);
+ //int strncmp(const char *s1, const char *s2, size_t n);
evalStrcmpCommon(C, CE, /* isBounded = */ true, /* ignoreCase = */ false);
}
void CStringChecker::evalStrcasecmp(CheckerContext &C,
const CallExpr *CE) const {
- //int strcasecmp(const char *restrict s1, const char *restrict s2);
+ //int strcasecmp(const char *s1, const char *s2);
evalStrcmpCommon(C, CE, /* isBounded = */ false, /* ignoreCase = */ true);
}
void CStringChecker::evalStrncasecmp(CheckerContext &C,
const CallExpr *CE) const {
- //int strncasecmp(const char *restrict s1, const char *restrict s2, size_t n);
+ //int strncasecmp(const char *s1, const char *s2, size_t n);
evalStrcmpCommon(C, CE, /* isBounded = */ true, /* ignoreCase = */ true);
}
void CStringChecker::evalStrcmpCommon(CheckerContext &C, const CallExpr *CE,
bool isBounded, bool ignoreCase) const {
+ CurrentFunctionDescription = "string comparison function";
const GRState *state = C.getState();
// Check that the first string is non-null
@@ -1174,52 +1540,96 @@ void CStringChecker::evalStrcmpCommon(CheckerContext &C, const CallExpr *CE,
if (s2Length.isUndef())
return;
- // Get the string literal of the first string.
- const StringLiteral *s1StrLiteral = getCStringLiteral(C, state, s1, s1Val);
- if (!s1StrLiteral)
- return;
- llvm::StringRef s1StrRef = s1StrLiteral->getString();
+ // If we know the two buffers are the same, we know the result is 0.
+ // First, get the two buffers' addresses. Another checker will have already
+ // made sure they're not undefined.
+ DefinedOrUnknownSVal LV = cast<DefinedOrUnknownSVal>(s1Val);
+ DefinedOrUnknownSVal RV = cast<DefinedOrUnknownSVal>(s2Val);
+
+ // See if they are the same.
+ SValBuilder &svalBuilder = C.getSValBuilder();
+ DefinedOrUnknownSVal SameBuf = svalBuilder.evalEQ(state, LV, RV);
+ const GRState *StSameBuf, *StNotSameBuf;
+ llvm::tie(StSameBuf, StNotSameBuf) = state->assume(SameBuf);
+
+ // If the two arguments might be the same buffer, we know the result is 0,
+ // and we only need to check one size.
+ if (StSameBuf) {
+ StSameBuf = StSameBuf->BindExpr(CE, svalBuilder.makeZeroVal(CE->getType()));
+ C.addTransition(StSameBuf);
+
+ // If the two arguments are GUARANTEED to be the same, we're done!
+ if (!StNotSameBuf)
+ return;
+ }
+
+ assert(StNotSameBuf);
+ state = StNotSameBuf;
+
+ // At this point we can go about comparing the two buffers.
+ // For now, we only do this if they're both known string literals.
- // Get the string literal of the second string.
+ // Attempt to extract string literals from both expressions.
+ const StringLiteral *s1StrLiteral = getCStringLiteral(C, state, s1, s1Val);
const StringLiteral *s2StrLiteral = getCStringLiteral(C, state, s2, s2Val);
- if (!s2StrLiteral)
- return;
- llvm::StringRef s2StrRef = s2StrLiteral->getString();
+ bool canComputeResult = false;
+
+ if (s1StrLiteral && s2StrLiteral) {
+ llvm::StringRef s1StrRef = s1StrLiteral->getString();
+ llvm::StringRef s2StrRef = s2StrLiteral->getString();
+
+ if (isBounded) {
+ // Get the max number of characters to compare.
+ const Expr *lenExpr = CE->getArg(2);
+ SVal lenVal = state->getSVal(lenExpr);
+
+ // If the length is known, we can get the right substrings.
+ if (const llvm::APSInt *len = svalBuilder.getKnownValue(state, lenVal)) {
+ // Create substrings of each to compare the prefix.
+ s1StrRef = s1StrRef.substr(0, (size_t)len->getZExtValue());
+ s2StrRef = s2StrRef.substr(0, (size_t)len->getZExtValue());
+ canComputeResult = true;
+ }
+ } else {
+ // This is a normal, unbounded strcmp.
+ canComputeResult = true;
+ }
- int result;
- if (isBounded) {
- // Get the max number of characters to compare.
- const Expr *lenExpr = CE->getArg(2);
- SVal lenVal = state->getSVal(lenExpr);
+ if (canComputeResult) {
+ // Real strcmp stops at null characters.
+ size_t s1Term = s1StrRef.find('\0');
+ if (s1Term != llvm::StringRef::npos)
+ s1StrRef = s1StrRef.substr(0, s1Term);
- // Dynamically cast the length to a ConcreteInt. If it is not a ConcreteInt
- // then give up, otherwise get the value and use it as the bounds.
- nonloc::ConcreteInt *CI = dyn_cast<nonloc::ConcreteInt>(&lenVal);
- if (!CI)
- return;
- llvm::APSInt lenInt(CI->getValue());
+ size_t s2Term = s2StrRef.find('\0');
+ if (s2Term != llvm::StringRef::npos)
+ s2StrRef = s2StrRef.substr(0, s2Term);
+
+ // Use StringRef's comparison methods to compute the actual result.
+ int result;
- // Create substrings of each to compare the prefix.
- s1StrRef = s1StrRef.substr(0, (size_t)lenInt.getLimitedValue());
- s2StrRef = s2StrRef.substr(0, (size_t)lenInt.getLimitedValue());
+ if (ignoreCase) {
+ // Compare string 1 to string 2 the same way strcasecmp() does.
+ result = s1StrRef.compare_lower(s2StrRef);
+ } else {
+ // Compare string 1 to string 2 the same way strcmp() does.
+ result = s1StrRef.compare(s2StrRef);
+ }
+
+ // Build the SVal of the comparison and bind the return value.
+ SVal resultVal = svalBuilder.makeIntVal(result, CE->getType());
+ state = state->BindExpr(CE, resultVal);
+ }
}
- if (ignoreCase) {
- // Compare string 1 to string 2 the same way strcasecmp() does.
- result = s1StrRef.compare_lower(s2StrRef);
- } else {
- // Compare string 1 to string 2 the same way strcmp() does.
- result = s1StrRef.compare(s2StrRef);
+ if (!canComputeResult) {
+ // Conjure a symbolic value. It's the best we can do.
+ unsigned Count = C.getNodeBuilder().getCurrentBlockCount();
+ SVal resultVal = svalBuilder.getConjuredSymbolVal(NULL, CE, Count);
+ state = state->BindExpr(CE, resultVal);
}
-
- // Build the SVal of the comparison to bind the return value.
- SValBuilder &svalBuilder = C.getSValBuilder();
- QualType intTy = svalBuilder.getContext().IntTy;
- SVal resultVal = svalBuilder.makeIntVal(result, intTy);
- // Bind the return value of the expression.
- // Set the return value.
- state = state->BindExpr(CE, resultVal);
+ // Record this as a possible path.
C.addTransition(state);
}
@@ -1251,7 +1661,7 @@ bool CStringChecker::evalCall(const CallExpr *CE, CheckerContext &C) const {
.Cases("memcmp", "bcmp", &CStringChecker::evalMemcmp)
.Cases("memmove", "__memmove_chk", &CStringChecker::evalMemmove)
.Cases("strcpy", "__strcpy_chk", &CStringChecker::evalStrcpy)
- //.Cases("strncpy", "__strncpy_chk", &CStringChecker::evalStrncpy)
+ .Cases("strncpy", "__strncpy_chk", &CStringChecker::evalStrncpy)
.Cases("stpcpy", "__stpcpy_chk", &CStringChecker::evalStpcpy)
.Cases("strcat", "__strcat_chk", &CStringChecker::evalStrcat)
.Cases("strncat", "__strncat_chk", &CStringChecker::evalStrncat)
@@ -1268,6 +1678,10 @@ bool CStringChecker::evalCall(const CallExpr *CE, CheckerContext &C) const {
if (!evalFunction)
return false;
+ // Make sure each function sets its own description.
+ // (But don't bother in a release build.)
+ assert(!(CurrentFunctionDescription = NULL));
+
// Check and evaluate the call.
(this->*evalFunction)(C, CE);
return true;
@@ -1373,8 +1787,10 @@ void CStringChecker::checkLiveSymbols(const GRState *state,
for (CStringLength::EntryMap::iterator I = Entries.begin(), E = Entries.end();
I != E; ++I) {
SVal Len = I.getData();
- if (SymbolRef Sym = Len.getAsSymbol())
- SR.markInUse(Sym);
+
+ for (SVal::symbol_iterator si = Len.symbol_begin(), se = Len.symbol_end();
+ si != se; ++si)
+ SR.markInUse(*si);
}
}
diff --git a/contrib/llvm/tools/clang/lib/StaticAnalyzer/Checkers/CallAndMessageChecker.cpp b/contrib/llvm/tools/clang/lib/StaticAnalyzer/Checkers/CallAndMessageChecker.cpp
index dfe0a0e..6c3dfac 100644
--- a/contrib/llvm/tools/clang/lib/StaticAnalyzer/Checkers/CallAndMessageChecker.cpp
+++ b/contrib/llvm/tools/clang/lib/StaticAnalyzer/Checkers/CallAndMessageChecker.cpp
@@ -282,7 +282,7 @@ void CallAndMessageChecker::emitNilReceiverBug(CheckerContext &C,
static bool supportsNilWithFloatRet(const llvm::Triple &triple) {
return triple.getVendor() == llvm::Triple::Apple &&
- (triple.getDarwinMajorNumber() >= 9 ||
+ (!triple.isMacOSXVersionLT(10,5) ||
triple.getArch() == llvm::Triple::arm ||
triple.getArch() == llvm::Triple::thumb);
}
diff --git a/contrib/llvm/tools/clang/lib/StaticAnalyzer/Checkers/Checkers.td b/contrib/llvm/tools/clang/lib/StaticAnalyzer/Checkers/Checkers.td
index 1a71fc4..2c196b5 100644
--- a/contrib/llvm/tools/clang/lib/StaticAnalyzer/Checkers/Checkers.td
+++ b/contrib/llvm/tools/clang/lib/StaticAnalyzer/Checkers/Checkers.td
@@ -168,10 +168,6 @@ def ReturnUndefChecker : Checker<"UndefReturn">,
let ParentPackage = CplusplusExperimental in {
-def CStringChecker : Checker<"CString">,
- HelpText<"Check calls to functions in <string.h>">,
- DescFile<"CStringChecker.cpp">;
-
def IteratorsChecker : Checker<"Iterators">,
HelpText<"Check improper uses of STL vector iterators">,
DescFile<"IteratorsChecker.cpp">;
@@ -244,6 +240,10 @@ def ChrootChecker : Checker<"Chroot">,
HelpText<"Check improper use of chroot">,
DescFile<"ChrootChecker.cpp">;
+def CStringChecker : Checker<"CString">,
+ HelpText<"Check calls to functions in <string.h>">,
+ DescFile<"CStringChecker.cpp">;
+
def MallocChecker : Checker<"Malloc">,
HelpText<"Check for potential memory leaks, double free, and use-after-free problems">,
DescFile<"MallocChecker.cpp">;
diff --git a/contrib/llvm/tools/clang/lib/StaticAnalyzer/Checkers/DeadStoresChecker.cpp b/contrib/llvm/tools/clang/lib/StaticAnalyzer/Checkers/DeadStoresChecker.cpp
index bc1d823..ec2a88a 100644
--- a/contrib/llvm/tools/clang/lib/StaticAnalyzer/Checkers/DeadStoresChecker.cpp
+++ b/contrib/llvm/tools/clang/lib/StaticAnalyzer/Checkers/DeadStoresChecker.cpp
@@ -254,13 +254,13 @@ public:
return;
if (Expr* E = V->getInit()) {
+ while (ExprWithCleanups *exprClean = dyn_cast<ExprWithCleanups>(E))
+ E = exprClean->getSubExpr();
+
// Don't warn on C++ objects (yet) until we can show that their
// constructors/destructors don't have side effects.
if (isa<CXXConstructExpr>(E))
return;
-
- if (isa<ExprWithCleanups>(E))
- return;
// A dead initialization is a variable that is dead after it
// is initialized. We don't flag warnings for those variables
diff --git a/contrib/llvm/tools/clang/lib/StaticAnalyzer/Checkers/IteratorsChecker.cpp b/contrib/llvm/tools/clang/lib/StaticAnalyzer/Checkers/IteratorsChecker.cpp
index e4e5f54..de6da4f 100644
--- a/contrib/llvm/tools/clang/lib/StaticAnalyzer/Checkers/IteratorsChecker.cpp
+++ b/contrib/llvm/tools/clang/lib/StaticAnalyzer/Checkers/IteratorsChecker.cpp
@@ -237,8 +237,11 @@ const GRState *IteratorsChecker::invalidateIterators(const GRState *state,
const GRState *IteratorsChecker::handleAssign(const GRState *state,
const Expr *lexp, const Expr *rexp, const LocationContext *LC) const {
// Skip the cast if present.
- if (isa<ImplicitCastExpr>(lexp))
- lexp = dyn_cast<ImplicitCastExpr>(lexp)->getSubExpr();
+ if (const MaterializeTemporaryExpr *M
+ = dyn_cast<MaterializeTemporaryExpr>(lexp))
+ lexp = M->GetTemporaryExpr();
+ if (const ImplicitCastExpr *ICE = dyn_cast<ImplicitCastExpr>(lexp))
+ lexp = ICE->getSubExpr();
SVal sv = state->getSVal(lexp);
const MemRegion *MR = sv.getAsRegion();
if (!MR)
@@ -260,8 +263,11 @@ const GRState *IteratorsChecker::handleAssign(const GRState *state,
const MemRegion *MR, const Expr *rexp, const LocationContext *LC) const {
// Assume unknown until we find something definite.
state = state->set<IteratorState>(MR, RefState::getUnknown());
- if (isa<ImplicitCastExpr>(rexp))
- rexp = dyn_cast<ImplicitCastExpr>(rexp)->getSubExpr();
+ if (const MaterializeTemporaryExpr *M
+ = dyn_cast<MaterializeTemporaryExpr>(rexp))
+ rexp = M->GetTemporaryExpr();
+ if (const ImplicitCastExpr *ICE = dyn_cast<ImplicitCastExpr>(rexp))
+ rexp = ICE->getSubExpr();
// Need to handle three cases: MemberCall, copy, copy with addition.
if (const CallExpr *CE = dyn_cast<CallExpr>(rexp)) {
// Handle MemberCall.
@@ -347,8 +353,10 @@ const DeclRefExpr *IteratorsChecker::getDeclRefExpr(const Expr *E) const {
E = CE->getArg(0);
}
}
- if (isa<ImplicitCastExpr>(E))
- E = dyn_cast<ImplicitCastExpr>(E)->getSubExpr();
+ if (const MaterializeTemporaryExpr *M = dyn_cast<MaterializeTemporaryExpr>(E))
+ E = M->GetTemporaryExpr();
+ if (const ImplicitCastExpr *ICE = dyn_cast<ImplicitCastExpr>(E))
+ E = ICE->getSubExpr();
// If it isn't one of our types, don't do anything.
if (getTemplateKind(E->getType()) != VectorIteratorKind)
return NULL;
@@ -520,8 +528,11 @@ void IteratorsChecker::checkPreStmt(const DeclStmt *DS,
if (const CXXConstructExpr *CE = dyn_cast<CXXConstructExpr>(InitEx)) {
if (CE->getNumArgs() == 1) {
const Expr *E = CE->getArg(0);
- if (isa<ImplicitCastExpr>(E))
- InitEx = dyn_cast<ImplicitCastExpr>(E)->getSubExpr();
+ if (const MaterializeTemporaryExpr *M
+ = dyn_cast<MaterializeTemporaryExpr>(E))
+ E = M->GetTemporaryExpr();
+ if (const ImplicitCastExpr *ICE = dyn_cast<ImplicitCastExpr>(E))
+ InitEx = ICE->getSubExpr();
state = handleAssign(state, MR, InitEx,
C.getPredecessor()->getLocationContext());
}
diff --git a/contrib/llvm/tools/clang/lib/StaticAnalyzer/Checkers/MacOSXAPIChecker.cpp b/contrib/llvm/tools/clang/lib/StaticAnalyzer/Checkers/MacOSXAPIChecker.cpp
index 12ce866..f8d076b 100644
--- a/contrib/llvm/tools/clang/lib/StaticAnalyzer/Checkers/MacOSXAPIChecker.cpp
+++ b/contrib/llvm/tools/clang/lib/StaticAnalyzer/Checkers/MacOSXAPIChecker.cpp
@@ -31,22 +31,17 @@ using namespace ento;
namespace {
class MacOSXAPIChecker : public Checker< check::PreStmt<CallExpr> > {
- enum SubChecks {
- DispatchOnce = 0,
- DispatchOnceF,
- NumChecks
- };
-
- mutable BugType *BTypes[NumChecks];
+ mutable llvm::OwningPtr<BugType> BT_dispatchOnce;
public:
- MacOSXAPIChecker() { memset(BTypes, 0, sizeof(*BTypes) * NumChecks); }
- ~MacOSXAPIChecker() {
- for (unsigned i=0; i != NumChecks; ++i)
- delete BTypes[i];
- }
-
void checkPreStmt(const CallExpr *CE, CheckerContext &C) const;
+
+ void CheckDispatchOnce(CheckerContext &C, const CallExpr *CE,
+ const IdentifierInfo *FI) const;
+
+ typedef void (MacOSXAPIChecker::*SubChecker)(CheckerContext &,
+ const CallExpr *,
+ const IdentifierInfo *) const;
};
} //end anonymous namespace
@@ -54,16 +49,8 @@ public:
// dispatch_once and dispatch_once_f
//===----------------------------------------------------------------------===//
-static void CheckDispatchOnce(CheckerContext &C, const CallExpr *CE,
- BugType *&BT, const IdentifierInfo *FI) {
-
- if (!BT) {
- llvm::SmallString<128> S;
- llvm::raw_svector_ostream os(S);
- os << "Improper use of '" << FI->getName() << '\'';
- BT = new BugType(os.str(), "Mac OS X API");
- }
-
+void MacOSXAPIChecker::CheckDispatchOnce(CheckerContext &C, const CallExpr *CE,
+ const IdentifierInfo *FI) const {
if (CE->getNumArgs() < 1)
return;
@@ -78,6 +65,10 @@ static void CheckDispatchOnce(CheckerContext &C, const CallExpr *CE,
if (!N)
return;
+ if (!BT_dispatchOnce)
+ BT_dispatchOnce.reset(new BugType("Improper use of 'dispatch_once'",
+ "Mac OS X API"));
+
llvm::SmallString<256> S;
llvm::raw_svector_ostream os(S);
os << "Call to '" << FI->getName() << "' uses";
@@ -90,7 +81,7 @@ static void CheckDispatchOnce(CheckerContext &C, const CallExpr *CE,
if (isa<VarRegion>(R) && isa<StackLocalsSpaceRegion>(R->getMemorySpace()))
os << " Perhaps you intended to declare the variable as 'static'?";
- EnhancedBugReport *report = new EnhancedBugReport(*BT, os.str(), N);
+ RangedBugReport *report = new RangedBugReport(*BT_dispatchOnce, os.str(), N);
report->addRange(CE->getArg(0)->getSourceRange());
C.EmitReport(report);
}
@@ -99,47 +90,29 @@ static void CheckDispatchOnce(CheckerContext &C, const CallExpr *CE,
// Central dispatch function.
//===----------------------------------------------------------------------===//
-typedef void (*SubChecker)(CheckerContext &C, const CallExpr *CE, BugType *&BT,
- const IdentifierInfo *FI);
-namespace {
- class SubCheck {
- SubChecker SC;
- BugType **BT;
- public:
- SubCheck(SubChecker sc, BugType *& bt) : SC(sc), BT(&bt) {}
- SubCheck() : SC(NULL), BT(NULL) {}
-
- void run(CheckerContext &C, const CallExpr *CE,
- const IdentifierInfo *FI) const {
- if (SC)
- SC(C, CE, *BT, FI);
- }
- };
-} // end anonymous namespace
-
void MacOSXAPIChecker::checkPreStmt(const CallExpr *CE,
CheckerContext &C) const {
- // FIXME: Mostly copy and paste from UnixAPIChecker. Should refactor.
+ // FIXME: This sort of logic is common to several checkers, including
+ // UnixAPIChecker, PthreadLockChecker, and CStringChecker. Should refactor.
const GRState *state = C.getState();
const Expr *Callee = CE->getCallee();
- const FunctionTextRegion *Fn =
- dyn_cast_or_null<FunctionTextRegion>(state->getSVal(Callee).getAsRegion());
+ const FunctionDecl *Fn = state->getSVal(Callee).getAsFunctionDecl();
if (!Fn)
return;
- const IdentifierInfo *FI = Fn->getDecl()->getIdentifier();
+ const IdentifierInfo *FI = Fn->getIdentifier();
if (!FI)
return;
- const SubCheck &SC =
- llvm::StringSwitch<SubCheck>(FI->getName())
- .Case("dispatch_once", SubCheck(CheckDispatchOnce, BTypes[DispatchOnce]))
- .Case("dispatch_once_f", SubCheck(CheckDispatchOnce,
- BTypes[DispatchOnceF]))
- .Default(SubCheck());
+ SubChecker SC =
+ llvm::StringSwitch<SubChecker>(FI->getName())
+ .Cases("dispatch_once", "dispatch_once_f",
+ &MacOSXAPIChecker::CheckDispatchOnce)
+ .Default(NULL);
- SC.run(C, CE, FI);
+ if (SC)
+ (this->*SC)(C, CE, FI);
}
//===----------------------------------------------------------------------===//
diff --git a/contrib/llvm/tools/clang/lib/StaticAnalyzer/Checkers/StackAddrEscapeChecker.cpp b/contrib/llvm/tools/clang/lib/StaticAnalyzer/Checkers/StackAddrEscapeChecker.cpp
index 07de870..73ce359 100644
--- a/contrib/llvm/tools/clang/lib/StaticAnalyzer/Checkers/StackAddrEscapeChecker.cpp
+++ b/contrib/llvm/tools/clang/lib/StaticAnalyzer/Checkers/StackAddrEscapeChecker.cpp
@@ -121,6 +121,11 @@ void StackAddrEscapeChecker::checkPreStmt(const ReturnStmt *RS,
return;
if (R->hasStackStorage()) {
+ // Automatic reference counting automatically copies blocks.
+ if (C.getASTContext().getLangOptions().ObjCAutoRefCount &&
+ isa<BlockDataRegion>(R))
+ return;
+
EmitStackError(C, R, RetE);
return;
}
@@ -135,12 +140,13 @@ void StackAddrEscapeChecker::checkEndPath(EndOfFunctionNodeBuilder &B,
// a memory region in the stack space.
class CallBack : public StoreManager::BindingsHandler {
private:
+ ExprEngine &Eng;
const StackFrameContext *CurSFC;
public:
llvm::SmallVector<std::pair<const MemRegion*, const MemRegion*>, 10> V;
- CallBack(const LocationContext *LCtx)
- : CurSFC(LCtx->getCurrentStackFrame()) {}
+ CallBack(ExprEngine &Eng, const LocationContext *LCtx)
+ : Eng(Eng), CurSFC(LCtx->getCurrentStackFrame()) {}
bool HandleBinding(StoreManager &SMgr, Store store,
const MemRegion *region, SVal val) {
@@ -151,7 +157,13 @@ void StackAddrEscapeChecker::checkEndPath(EndOfFunctionNodeBuilder &B,
const MemRegion *vR = val.getAsRegion();
if (!vR)
return true;
-
+
+ // Under automated retain release, it is okay to assign a block
+ // directly to a global variable.
+ if (Eng.getContext().getLangOptions().ObjCAutoRefCount &&
+ isa<BlockDataRegion>(vR))
+ return true;
+
if (const StackSpaceRegion *SSR =
dyn_cast<StackSpaceRegion>(vR->getMemorySpace())) {
// If the global variable holds a location in the current stack frame,
@@ -164,7 +176,7 @@ void StackAddrEscapeChecker::checkEndPath(EndOfFunctionNodeBuilder &B,
}
};
- CallBack cb(B.getPredecessor()->getLocationContext());
+ CallBack cb(Eng, B.getPredecessor()->getLocationContext());
state->getStateManager().getStoreManager().iterBindings(state->getStore(),cb);
if (cb.V.empty())
diff --git a/contrib/llvm/tools/clang/lib/StaticAnalyzer/Checkers/UnixAPIChecker.cpp b/contrib/llvm/tools/clang/lib/StaticAnalyzer/Checkers/UnixAPIChecker.cpp
index 48d7c36..0ecc391 100644
--- a/contrib/llvm/tools/clang/lib/StaticAnalyzer/Checkers/UnixAPIChecker.cpp
+++ b/contrib/llvm/tools/clang/lib/StaticAnalyzer/Checkers/UnixAPIChecker.cpp
@@ -28,26 +28,18 @@ using llvm::Optional;
namespace {
class UnixAPIChecker : public Checker< check::PreStmt<CallExpr> > {
- enum SubChecks {
- OpenFn = 0,
- PthreadOnceFn = 1,
- MallocZero = 2,
- NumChecks
- };
-
- mutable BugType *BTypes[NumChecks];
-
-public:
+ mutable llvm::OwningPtr<BugType> BT_open, BT_pthreadOnce, BT_mallocZero;
mutable Optional<uint64_t> Val_O_CREAT;
public:
- UnixAPIChecker() { memset(BTypes, 0, sizeof(*BTypes) * NumChecks); }
- ~UnixAPIChecker() {
- for (unsigned i=0; i != NumChecks; ++i)
- delete BTypes[i];
- }
-
void checkPreStmt(const CallExpr *CE, CheckerContext &C) const;
+
+ void CheckOpen(CheckerContext &C, const CallExpr *CE) const;
+ void CheckPthreadOnce(CheckerContext &C, const CallExpr *CE) const;
+ void CheckMallocZero(CheckerContext &C, const CallExpr *CE) const;
+
+ typedef void (UnixAPIChecker::*SubChecker)(CheckerContext &,
+ const CallExpr *) const;
};
} //end anonymous namespace
@@ -55,23 +47,23 @@ public:
// Utility functions.
//===----------------------------------------------------------------------===//
-static inline void LazyInitialize(BugType *&BT, const char *name) {
+static inline void LazyInitialize(llvm::OwningPtr<BugType> &BT,
+ const char *name) {
if (BT)
return;
- BT = new BugType(name, "Unix API");
+ BT.reset(new BugType(name, "Unix API"));
}
//===----------------------------------------------------------------------===//
// "open" (man 2 open)
//===----------------------------------------------------------------------===//
-static void CheckOpen(CheckerContext &C, const UnixAPIChecker &UC,
- const CallExpr *CE, BugType *&BT) {
+void UnixAPIChecker::CheckOpen(CheckerContext &C, const CallExpr *CE) const {
// The definition of O_CREAT is platform specific. We need a better way
// of querying this information from the checking environment.
- if (!UC.Val_O_CREAT.hasValue()) {
+ if (!Val_O_CREAT.hasValue()) {
if (C.getASTContext().Target.getTriple().getVendor() == llvm::Triple::Apple)
- UC.Val_O_CREAT = 0x0200;
+ Val_O_CREAT = 0x0200;
else {
// FIXME: We need a more general way of getting the O_CREAT value.
// We could possibly grovel through the preprocessor state, but
@@ -80,8 +72,6 @@ static void CheckOpen(CheckerContext &C, const UnixAPIChecker &UC,
}
}
- LazyInitialize(BT, "Improper use of 'open'");
-
// Look at the 'oflags' argument for the O_CREAT flag.
const GRState *state = C.getState();
@@ -101,7 +91,7 @@ static void CheckOpen(CheckerContext &C, const UnixAPIChecker &UC,
}
NonLoc oflags = cast<NonLoc>(V);
NonLoc ocreateFlag =
- cast<NonLoc>(C.getSValBuilder().makeIntVal(UC.Val_O_CREAT.getValue(),
+ cast<NonLoc>(C.getSValBuilder().makeIntVal(Val_O_CREAT.getValue(),
oflagsEx->getType()));
SVal maskedFlagsUC = C.getSValBuilder().evalBinOpNN(state, BO_And,
oflags, ocreateFlag,
@@ -124,8 +114,10 @@ static void CheckOpen(CheckerContext &C, const UnixAPIChecker &UC,
if (!N)
return;
- EnhancedBugReport *report =
- new EnhancedBugReport(*BT,
+ LazyInitialize(BT_open, "Improper use of 'open'");
+
+ RangedBugReport *report =
+ new RangedBugReport(*BT_open,
"Call to 'open' requires a third argument when "
"the 'O_CREAT' flag is set", N);
report->addRange(oflagsEx->getSourceRange());
@@ -137,14 +129,12 @@ static void CheckOpen(CheckerContext &C, const UnixAPIChecker &UC,
// pthread_once
//===----------------------------------------------------------------------===//
-static void CheckPthreadOnce(CheckerContext &C, const UnixAPIChecker &,
- const CallExpr *CE, BugType *&BT) {
+void UnixAPIChecker::CheckPthreadOnce(CheckerContext &C,
+ const CallExpr *CE) const {
// This is similar to 'CheckDispatchOnce' in the MacOSXAPIChecker.
// They can possibly be refactored.
- LazyInitialize(BT, "Improper use of 'pthread_once'");
-
if (CE->getNumArgs() < 1)
return;
@@ -171,7 +161,9 @@ static void CheckPthreadOnce(CheckerContext &C, const UnixAPIChecker &,
if (isa<VarRegion>(R) && isa<StackLocalsSpaceRegion>(R->getMemorySpace()))
os << " Perhaps you intended to declare the variable as 'static'?";
- EnhancedBugReport *report = new EnhancedBugReport(*BT, os.str(), N);
+ LazyInitialize(BT_pthreadOnce, "Improper use of 'pthread_once'");
+
+ RangedBugReport *report = new RangedBugReport(*BT_pthreadOnce, os.str(), N);
report->addRange(CE->getArg(0)->getSourceRange());
C.EmitReport(report);
}
@@ -182,8 +174,8 @@ static void CheckPthreadOnce(CheckerContext &C, const UnixAPIChecker &,
// FIXME: Eventually this should be rolled into the MallocChecker, but this
// check is more basic and is valuable for widespread use.
-static void CheckMallocZero(CheckerContext &C, const UnixAPIChecker &UC,
- const CallExpr *CE, BugType *&BT) {
+void UnixAPIChecker::CheckMallocZero(CheckerContext &C,
+ const CallExpr *CE) const {
// Sanity check that malloc takes one argument.
if (CE->getNumArgs() != 1)
@@ -208,11 +200,11 @@ static void CheckMallocZero(CheckerContext &C, const UnixAPIChecker &UC,
// FIXME: Add reference to CERT advisory, and/or C99 standard in bug
// output.
- LazyInitialize(BT, "Undefined allocation of 0 bytes");
+ LazyInitialize(BT_mallocZero, "Undefined allocation of 0 bytes");
EnhancedBugReport *report =
- new EnhancedBugReport(*BT, "Call to 'malloc' has an allocation size"
- " of 0 bytes", N);
+ new EnhancedBugReport(*BT_mallocZero, "Call to 'malloc' has an allocation"
+ " size of 0 bytes", N);
report->addRange(CE->getArg(0)->getSourceRange());
report->addVisitorCreator(bugreporter::registerTrackNullOrUndefValue,
CE->getArg(0));
@@ -230,51 +222,29 @@ static void CheckMallocZero(CheckerContext &C, const UnixAPIChecker &UC,
// Central dispatch function.
//===----------------------------------------------------------------------===//
-typedef void (*SubChecker)(CheckerContext &C, const UnixAPIChecker &UC,
- const CallExpr *CE, BugType *&BT);
-namespace {
- class SubCheck {
- SubChecker SC;
- const UnixAPIChecker *UC;
- BugType **BT;
- public:
- SubCheck(SubChecker sc, const UnixAPIChecker *uc, BugType *& bt)
- : SC(sc), UC(uc), BT(&bt) {}
- SubCheck() : SC(NULL), UC(NULL), BT(NULL) {}
-
- void run(CheckerContext &C, const CallExpr *CE) const {
- if (SC)
- SC(C, *UC, CE, *BT);
- }
- };
-} // end anonymous namespace
-
void UnixAPIChecker::checkPreStmt(const CallExpr *CE, CheckerContext &C) const {
// Get the callee. All the functions we care about are C functions
// with simple identifiers.
const GRState *state = C.getState();
const Expr *Callee = CE->getCallee();
- const FunctionTextRegion *Fn =
- dyn_cast_or_null<FunctionTextRegion>(state->getSVal(Callee).getAsRegion());
+ const FunctionDecl *Fn = state->getSVal(Callee).getAsFunctionDecl();
if (!Fn)
return;
- const IdentifierInfo *FI = Fn->getDecl()->getIdentifier();
+ const IdentifierInfo *FI = Fn->getIdentifier();
if (!FI)
return;
- const SubCheck &SC =
- llvm::StringSwitch<SubCheck>(FI->getName())
- .Case("open",
- SubCheck(CheckOpen, this, BTypes[OpenFn]))
- .Case("pthread_once",
- SubCheck(CheckPthreadOnce, this, BTypes[PthreadOnceFn]))
- .Case("malloc",
- SubCheck(CheckMallocZero, this, BTypes[MallocZero]))
- .Default(SubCheck());
-
- SC.run(C, CE);
+ SubChecker SC =
+ llvm::StringSwitch<SubChecker>(FI->getName())
+ .Case("open", &UnixAPIChecker::CheckOpen)
+ .Case("pthread_once", &UnixAPIChecker::CheckPthreadOnce)
+ .Case("malloc", &UnixAPIChecker::CheckMallocZero)
+ .Default(NULL);
+
+ if (SC)
+ (this->*SC)(C, CE);
}
//===----------------------------------------------------------------------===//
diff --git a/contrib/llvm/tools/clang/lib/StaticAnalyzer/Core/CFRefCount.cpp b/contrib/llvm/tools/clang/lib/StaticAnalyzer/Core/CFRefCount.cpp
index 0512e2f..bf53029 100644
--- a/contrib/llvm/tools/clang/lib/StaticAnalyzer/Core/CFRefCount.cpp
+++ b/contrib/llvm/tools/clang/lib/StaticAnalyzer/Core/CFRefCount.cpp
@@ -126,6 +126,7 @@ public:
/// ArgEffect is used to summarize a function/method call's effect on a
/// particular argument.
enum ArgEffect { Autorelease, Dealloc, DecRef, DecRefMsg, DoNothing,
+ DecRefBridgedTransfered,
DoNothingByRef, IncRefMsg, IncRef, MakeCollectable, MayEscape,
NewAutoreleasePool, SelfOwn, StopTracking };
@@ -148,7 +149,8 @@ namespace {
class RetEffect {
public:
enum Kind { NoRet, Alias, OwnedSymbol, OwnedAllocatedSymbol,
- NotOwnedSymbol, GCNotOwnedSymbol, ReceiverAlias,
+ NotOwnedSymbol, GCNotOwnedSymbol, ARCNotOwnedSymbol,
+ ReceiverAlias,
OwnedWhenTrackedReceiver };
enum ObjKind { CF, ObjC, AnyObj };
@@ -195,7 +197,9 @@ public:
static RetEffect MakeGCNotOwned() {
return RetEffect(GCNotOwnedSymbol, ObjC);
}
-
+ static RetEffect MakeARCNotOwned() {
+ return RetEffect(ARCNotOwnedSymbol, ObjC);
+ }
static RetEffect MakeNoRet() {
return RetEffect(NoRet);
}
@@ -636,6 +640,9 @@ class RetainSummaryManager {
/// GCEnabled - Records whether or not the analyzed code runs in GC mode.
const bool GCEnabled;
+ /// Records whether or not the analyzed code runs in ARC mode.
+ const bool ARCEnabled;
+
/// FuncSummaries - A map from FunctionDecls to summaries.
FuncSummariesTy FuncSummaries;
@@ -788,14 +795,20 @@ private:
public:
- RetainSummaryManager(ASTContext& ctx, bool gcenabled)
+ RetainSummaryManager(ASTContext& ctx, bool gcenabled, bool usesARC)
: Ctx(ctx),
CFDictionaryCreateII(&ctx.Idents.get("CFDictionaryCreate")),
- GCEnabled(gcenabled), AF(BPAlloc), ScratchArgs(AF.getEmptyMap()),
- ObjCAllocRetE(gcenabled ? RetEffect::MakeGCNotOwned()
- : RetEffect::MakeOwned(RetEffect::ObjC, true)),
- ObjCInitRetE(gcenabled ? RetEffect::MakeGCNotOwned()
- : RetEffect::MakeOwnedWhenTrackedReceiver()),
+ GCEnabled(gcenabled),
+ ARCEnabled(usesARC),
+ AF(BPAlloc), ScratchArgs(AF.getEmptyMap()),
+ ObjCAllocRetE(gcenabled
+ ? RetEffect::MakeGCNotOwned()
+ : (usesARC ? RetEffect::MakeARCNotOwned()
+ : RetEffect::MakeOwned(RetEffect::ObjC, true))),
+ ObjCInitRetE(gcenabled
+ ? RetEffect::MakeGCNotOwned()
+ : (usesARC ? RetEffect::MakeARCNotOwned()
+ : RetEffect::MakeOwnedWhenTrackedReceiver())),
DefaultSummary(AF.getEmptyMap() /* per-argument effects (none) */,
RetEffect::MakeNoRet() /* return effect */,
MayEscape, /* default argument effect */
@@ -871,6 +884,10 @@ public:
bool isGCEnabled() const { return GCEnabled; }
+ bool isARCEnabled() const { return ARCEnabled; }
+
+ bool isARCorGCEnabled() const { return GCEnabled || ARCEnabled; }
+
RetainSummary *copySummary(RetainSummary *OldSumm) {
RetainSummary *Summ = (RetainSummary*) BPAlloc.Allocate<RetainSummary>();
new (Summ) RetainSummary(*OldSumm);
@@ -1118,8 +1135,7 @@ RetainSummary* RetainSummaryManager::getSummary(const FunctionDecl* FD) {
RetainSummary*
RetainSummaryManager::getCFCreateGetRuleSummary(const FunctionDecl* FD,
StringRef FName) {
- if (FName.find("Create") != StringRef::npos ||
- FName.find("Copy") != StringRef::npos)
+ if (coreFoundation::followsCreateRule(FName))
return getCFSummaryCreateRule(FD);
return getCFSummaryGetRule(FD);
@@ -1189,7 +1205,8 @@ RetainSummaryManager::getInitMethodSummary(QualType RetTy) {
assert(ScratchArgs.isEmpty());
// 'init' methods conceptually return a newly allocated object and claim
// the receiver.
- if (cocoa::isCocoaObjectRef(RetTy) || cocoa::isCFObjectRef(RetTy))
+ if (cocoa::isCocoaObjectRef(RetTy) ||
+ coreFoundation::isCFObjectRef(RetTy))
return getPersistentSummary(ObjCInitRetE, DecRefMsg);
return getDefaultSummary();
@@ -1332,15 +1349,15 @@ RetainSummaryManager::getCommonMethodSummary(const ObjCMethodDecl* MD,
if (cocoa::isCocoaObjectRef(RetTy)) {
// EXPERIMENTAL: assume the Cocoa conventions for all objects returned
// by instance methods.
- RetEffect E = cocoa::followsFundamentalRule(S)
+ RetEffect E = cocoa::followsFundamentalRule(S, MD)
? ObjCAllocRetE : RetEffect::MakeNotOwned(RetEffect::ObjC);
return getPersistentSummary(E, ReceiverEff, MayEscape);
}
// Look for methods that return an owned core foundation object.
- if (cocoa::isCFObjectRef(RetTy)) {
- RetEffect E = cocoa::followsFundamentalRule(S)
+ if (coreFoundation::isCFObjectRef(RetTy)) {
+ RetEffect E = cocoa::followsFundamentalRule(S, MD)
? RetEffect::MakeOwned(RetEffect::CF, true)
: RetEffect::MakeNotOwned(RetEffect::CF);
@@ -1411,7 +1428,7 @@ RetainSummaryManager::getInstanceMethodSummary(Selector S,
assert(ScratchArgs.isEmpty());
// "initXXX": pass-through for receiver.
- if (cocoa::deriveNamingConvention(S) == cocoa::InitRule)
+ if (cocoa::deriveNamingConvention(S, MD) == cocoa::InitRule)
Summ = getInitMethodSummary(RetTy);
else
Summ = getCommonMethodSummary(MD, S, RetTy);
@@ -1654,7 +1671,6 @@ public:
const char* nl, const char* sep);
};
-private:
typedef llvm::DenseMap<const ExplodedNode*, const RetainSummary*>
SummaryLogTy;
@@ -1691,7 +1707,7 @@ private:
public:
CFRefCount(ASTContext& Ctx, bool gcenabled, const LangOptions& lopts)
- : Summaries(Ctx, gcenabled),
+ : Summaries(Ctx, gcenabled, (bool)lopts.ObjCAutoRefCount),
LOpts(lopts), useAfterRelease(0), releaseNotOwned(0),
deallocGC(0), deallocNotOwned(0),
leakWithinFunction(0), leakAtReturn(0), overAutorelease(0),
@@ -1706,6 +1722,8 @@ public:
}
bool isGCEnabled() const { return Summaries.isGCEnabled(); }
+ bool isARCorGCEnabled() const { return Summaries.isARCorGCEnabled(); }
+
const LangOptions& getLangOptions() const { return LOpts; }
const RetainSummary *getSummaryOfNode(const ExplodedNode *N) const {
@@ -1907,7 +1925,7 @@ namespace {
CFRefBug(tf, "Method should return an owned object") {}
const char *getDescription() const {
- return "Object with +0 retain counts returned to caller where a +1 "
+ return "Object with a +0 retain count returned to caller where a +1 "
"(owning) retain count is expected";
}
};
@@ -2094,7 +2112,7 @@ PathDiagnosticPiece* CFRefReport::VisitNode(const ExplodedNode* N,
if (static_cast<CFRefBug&>(getBugType()).getTF().isGCEnabled()) {
assert(CurrV.getObjKind() == RetEffect::CF);
- os << " "
+ os << ". "
"Core Foundation objects are not automatically garbage collected.";
}
}
@@ -2416,14 +2434,14 @@ CFRefLeakReport::getEndPath(BugReporterContext& BRC,
if (RV->getKind() == RefVal::ErrorLeakReturned) {
// FIXME: Per comments in rdar://6320065, "create" only applies to CF
- // ojbects. Only "copy", "alloc", "retain" and "new" transfer ownership
+ // objects. Only "copy", "alloc", "retain" and "new" transfer ownership
// to the caller for NS objects.
const Decl *D = &EndN->getCodeDecl();
if (const ObjCMethodDecl *MD = dyn_cast<ObjCMethodDecl>(D)) {
os << " is returned from a method whose name ('"
<< MD->getSelector().getAsString()
<< "') does not start with 'copy', 'mutableCopy', 'alloc' or 'new'."
- " This violates the naming convention rules "
+ " This violates the naming convention rules"
" given in the Memory Management Guide for Cocoa";
}
else {
@@ -2431,7 +2449,7 @@ CFRefLeakReport::getEndPath(BugReporterContext& BRC,
os << " is return from a function whose name ('"
<< FD->getNameAsString()
<< "') does not contain 'Copy' or 'Create'. This violates the naming"
- " convention rules given the Memory Management Guide for Core "
+ " convention rules given the Memory Management Guide for Core"
" Foundation";
}
}
@@ -2777,6 +2795,7 @@ void CFRefCount::evalSummary(ExplodedNodeSet& Dst,
}
case RetEffect::GCNotOwnedSymbol:
+ case RetEffect::ARCNotOwnedSymbol:
case RetEffect::NotOwnedSymbol: {
unsigned Count = Builder.getCurrentBlockCount();
SValBuilder &svalBuilder = Eng.getSValBuilder();
@@ -3103,8 +3122,8 @@ const GRState * CFRefCount::Update(const GRState * state, SymbolRef sym,
// In GC mode [... release] and [... retain] do nothing.
switch (E) {
default: break;
- case IncRefMsg: E = isGCEnabled() ? DoNothing : IncRef; break;
- case DecRefMsg: E = isGCEnabled() ? DoNothing : DecRef; break;
+ case IncRefMsg: E = isARCorGCEnabled() ? DoNothing : IncRef; break;
+ case DecRefMsg: E = isARCorGCEnabled() ? DoNothing : DecRef; break;
case MakeCollectable: E = isGCEnabled() ? DecRef : DoNothing; break;
case NewAutoreleasePool: E = isGCEnabled() ? DoNothing :
NewAutoreleasePool; break;
@@ -3118,9 +3137,13 @@ const GRState * CFRefCount::Update(const GRState * state, SymbolRef sym,
}
switch (E) {
- default:
- assert (false && "Unhandled CFRef transition.");
-
+ case DecRefMsg:
+ case IncRefMsg:
+ case MakeCollectable:
+ assert(false &&
+ "DecRefMsg/IncRefMsg/MakeCollectable already transformed");
+ return state;
+
case Dealloc:
// Any use of -dealloc in GC is *bad*.
if (isGCEnabled()) {
@@ -3193,6 +3216,7 @@ const GRState * CFRefCount::Update(const GRState * state, SymbolRef sym,
V = V ^ RefVal::NotOwned;
// Fall-through.
case DecRef:
+ case DecRefBridgedTransfered:
switch (V.getKind()) {
default:
// case 'RefVal::Released' handled above.
@@ -3200,7 +3224,9 @@ const GRState * CFRefCount::Update(const GRState * state, SymbolRef sym,
case RefVal::Owned:
assert(V.getCount() > 0);
- if (V.getCount() == 1) V = V ^ RefVal::Released;
+ if (V.getCount() == 1)
+ V = V ^ (E == DecRefBridgedTransfered ?
+ RefVal::NotOwned : RefVal::Released);
V = V - 1;
break;
@@ -3280,15 +3306,10 @@ CFRefCount::HandleAutoreleaseCounts(const GRState * state,
std::string sbuf;
llvm::raw_string_ostream os(sbuf);
- os << "Object over-autoreleased: object was sent -autorelease";
+ os << "Object over-autoreleased: object was sent -autorelease ";
if (V.getAutoreleaseCount() > 1)
- os << V.getAutoreleaseCount() << " times";
- os << " but the object has ";
- if (V.getCount() == 0)
- os << "zero (locally visible)";
- else
- os << "+" << V.getCount();
- os << " retain counts";
+ os << V.getAutoreleaseCount() << " times ";
+ os << "but the object has a +" << V.getCount() << " retain count";
CFRefReport *report =
new CFRefReport(*static_cast<CFRefBug*>(overAutorelease),
@@ -3468,7 +3489,9 @@ void CFRefCount::ProcessNonLeakError(ExplodedNodeSet& Dst,
namespace {
class RetainReleaseChecker
- : public Checker< check::PostStmt<BlockExpr>, check::RegionChanges > {
+ : public Checker< check::PostStmt<BlockExpr>,
+ check::PostStmt<CastExpr>,
+ check::RegionChanges > {
public:
bool wantsRegionUpdate;
@@ -3476,6 +3499,9 @@ public:
void checkPostStmt(const BlockExpr *BE, CheckerContext &C) const;
+
+ void checkPostStmt(const CastExpr *CE, CheckerContext &C) const;
+
const GRState *checkRegionChanges(const GRState *state,
const StoreManager::InvalidatedSymbols *invalidated,
const MemRegion * const *begin,
@@ -3545,6 +3571,48 @@ void RetainReleaseChecker::checkPostStmt(const BlockExpr *BE,
C.addTransition(state);
}
+void RetainReleaseChecker::checkPostStmt(const CastExpr *CE,
+ CheckerContext &C) const {
+ const ObjCBridgedCastExpr *BE = dyn_cast<ObjCBridgedCastExpr>(CE);
+ if (!BE)
+ return;
+
+ ArgEffect AE = IncRef;
+
+ switch (BE->getBridgeKind()) {
+ case clang::OBC_Bridge:
+ // Do nothing.
+ return;
+ case clang::OBC_BridgeRetained:
+ AE = IncRef;
+ break;
+ case clang::OBC_BridgeTransfer:
+ AE = DecRefBridgedTransfered;
+ break;
+ }
+
+ const GRState *state = C.getState();
+ SymbolRef Sym = state->getSVal(CE).getAsLocSymbol();
+ if (!Sym)
+ return;
+ const RefVal* T = state->get<RefBindings>(Sym);
+ if (!T)
+ return;
+
+ // This is gross. Once the checker and CFRefCount are unified,
+ // this will go away.
+ CFRefCount &cf = static_cast<CFRefCount&>(C.getEngine().getTF());
+ RefVal::Kind hasErr = (RefVal::Kind) 0;
+ state = cf.Update(state, Sym, *T, AE, hasErr);
+
+ if (hasErr) {
+
+ return;
+ }
+
+ C.generateNode(state);
+}
+
//===----------------------------------------------------------------------===//
// Transfer function creation for external clients.
//===----------------------------------------------------------------------===//
diff --git a/contrib/llvm/tools/clang/lib/StaticAnalyzer/Core/Environment.cpp b/contrib/llvm/tools/clang/lib/StaticAnalyzer/Core/Environment.cpp
index 48f126b..3961c7b 100644
--- a/contrib/llvm/tools/clang/lib/StaticAnalyzer/Core/Environment.cpp
+++ b/contrib/llvm/tools/clang/lib/StaticAnalyzer/Core/Environment.cpp
@@ -83,6 +83,9 @@ SVal Environment::getSVal(const Stmt *E, SValBuilder& svalBuilder,
case Stmt::CXXBindTemporaryExprClass:
E = cast<CXXBindTemporaryExpr>(E)->getSubExpr();
continue;
+ case Stmt::MaterializeTemporaryExprClass:
+ E = cast<MaterializeTemporaryExpr>(E)->GetTemporaryExpr();
+ continue;
// Handle all other Stmt* using a lookup.
default:
break;
diff --git a/contrib/llvm/tools/clang/lib/StaticAnalyzer/Core/ExprEngine.cpp b/contrib/llvm/tools/clang/lib/StaticAnalyzer/Core/ExprEngine.cpp
index aed39eb..ffe5f0b 100644
--- a/contrib/llvm/tools/clang/lib/StaticAnalyzer/Core/ExprEngine.cpp
+++ b/contrib/llvm/tools/clang/lib/StaticAnalyzer/Core/ExprEngine.cpp
@@ -442,7 +442,8 @@ void ExprEngine::Visit(const Stmt* S, ExplodedNode* Pred,
}
switch (S->getStmtClass()) {
- // C++ stuff we don't support yet.
+ // C++ and ARC stuff we don't support yet.
+ case Expr::ObjCIndirectCopyRestoreExprClass:
case Stmt::CXXBindTemporaryExprClass:
case Stmt::CXXCatchStmtClass:
case Stmt::CXXDependentScopeMemberExprClass:
@@ -478,6 +479,7 @@ void ExprEngine::Visit(const Stmt* S, ExplodedNode* Pred,
// We don't handle default arguments either yet, but we can fake it
// for now by just skipping them.
+ case Stmt::SubstNonTypeTemplateParmExprClass:
case Stmt::CXXDefaultArgExprClass: {
Dst.Add(Pred);
break;
@@ -508,7 +510,10 @@ void ExprEngine::Visit(const Stmt* S, ExplodedNode* Pred,
break;
case Stmt::GNUNullExprClass: {
- MakeNode(Dst, S, Pred, GetState(Pred)->BindExpr(S, svalBuilder.makeNull()));
+ // GNU __null is a pointer-width integer, not an actual pointer.
+ const GRState *state = GetState(Pred);
+ state = state->BindExpr(S, svalBuilder.makeIntValWithPtrWidth(0, false));
+ MakeNode(Dst, S, Pred, state);
break;
}
@@ -520,14 +525,27 @@ void ExprEngine::Visit(const Stmt* S, ExplodedNode* Pred,
VisitObjCPropertyRefExpr(cast<ObjCPropertyRefExpr>(S), Pred, Dst);
break;
+ case Stmt::ImplicitValueInitExprClass: {
+ const GRState *state = GetState(Pred);
+ QualType ty = cast<ImplicitValueInitExpr>(S)->getType();
+ SVal val = svalBuilder.makeZeroVal(ty);
+ MakeNode(Dst, S, Pred, state->BindExpr(S, val));
+ break;
+ }
+
+ case Stmt::ExprWithCleanupsClass: {
+ Visit(cast<ExprWithCleanups>(S)->getSubExpr(), Pred, Dst);
+ break;
+ }
+
// Cases not handled yet; but will handle some day.
case Stmt::DesignatedInitExprClass:
case Stmt::ExtVectorElementExprClass:
case Stmt::ImaginaryLiteralClass:
- case Stmt::ImplicitValueInitExprClass:
case Stmt::ObjCAtCatchStmtClass:
case Stmt::ObjCAtFinallyStmtClass:
case Stmt::ObjCAtTryStmtClass:
+ case Stmt::ObjCAutoreleasePoolStmtClass:
case Stmt::ObjCEncodeExprClass:
case Stmt::ObjCIsaExprClass:
case Stmt::ObjCProtocolExprClass:
@@ -548,7 +566,6 @@ void ExprEngine::Visit(const Stmt* S, ExplodedNode* Pred,
case Stmt::IntegerLiteralClass:
case Stmt::CharacterLiteralClass:
case Stmt::CXXBoolLiteralExprClass:
- case Stmt::ExprWithCleanupsClass:
case Stmt::FloatingLiteralClass:
case Stmt::SizeOfPackExprClass:
case Stmt::CXXNullPtrLiteralExprClass:
@@ -668,12 +685,35 @@ void ExprEngine::Visit(const Stmt* S, ExplodedNode* Pred,
case Stmt::CXXDynamicCastExprClass:
case Stmt::CXXReinterpretCastExprClass:
case Stmt::CXXConstCastExprClass:
- case Stmt::CXXFunctionalCastExprClass: {
+ case Stmt::CXXFunctionalCastExprClass:
+ case Stmt::ObjCBridgedCastExprClass: {
const CastExpr* C = cast<CastExpr>(S);
- VisitCast(C, C->getSubExpr(), Pred, Dst);
+ // Handle the previsit checks.
+ ExplodedNodeSet dstPrevisit;
+ getCheckerManager().runCheckersForPreStmt(dstPrevisit, Pred, C, *this);
+
+ // Handle the expression itself.
+ ExplodedNodeSet dstExpr;
+ for (ExplodedNodeSet::iterator i = dstPrevisit.begin(),
+ e = dstPrevisit.end(); i != e ; ++i) {
+ VisitCast(C, C->getSubExpr(), *i, dstExpr);
+ }
+
+ // Handle the postvisit checks.
+ getCheckerManager().runCheckersForPostStmt(Dst, dstExpr, C, *this);
break;
}
+ case Expr::MaterializeTemporaryExprClass: {
+ const MaterializeTemporaryExpr *Materialize
+ = cast<MaterializeTemporaryExpr>(S);
+ if (!Materialize->getType()->isRecordType())
+ CreateCXXTemporaryObject(Materialize->GetTemporaryExpr(), Pred, Dst);
+ else
+ Visit(Materialize->GetTemporaryExpr(), Pred, Dst);
+ break;
+ }
+
case Stmt::InitListExprClass:
VisitInitListExpr(cast<InitListExpr>(S), Pred, Dst);
break;
@@ -2148,10 +2188,19 @@ void ExprEngine::VisitCast(const CastExpr *CastE, const Expr *Ex,
Pred = *I;
switch (CastE->getCastKind()) {
+ case CK_LValueToRValue:
+ assert(false && "LValueToRValue casts handled earlier.");
+ case CK_GetObjCProperty:
+ assert(false && "GetObjCProperty casts handled earlier.");
case CK_ToVoid:
Dst.Add(Pred);
continue;
- case CK_LValueToRValue:
+ // The analyzer doesn't do anything special with these casts,
+ // since it understands retain/release semantics already.
+ case CK_ObjCProduceObject:
+ case CK_ObjCConsumeObject:
+ case CK_ObjCReclaimReturnedObject: // Fall-through.
+ // True no-ops.
case CK_NoOp:
case CK_FunctionToPointerDecay: {
// Copy the SVal of Ex to CastE.
@@ -2161,7 +2210,6 @@ void ExprEngine::VisitCast(const CastExpr *CastE, const Expr *Ex,
MakeNode(Dst, CastE, Pred, state);
continue;
}
- case CK_GetObjCProperty:
case CK_Dependent:
case CK_ArrayToPointerDecay:
case CK_BitCast:
@@ -2273,17 +2321,9 @@ void ExprEngine::VisitDeclStmt(const DeclStmt *DS, ExplodedNode *Pred,
// time a function is called those values may not be current.
ExplodedNodeSet Tmp;
- if (InitEx) {
- if (VD->getType()->isReferenceType() && !InitEx->isLValue()) {
- // If the initializer is C++ record type, it should already has a
- // temp object.
- if (!InitEx->getType()->isRecordType())
- CreateCXXTemporaryObject(InitEx, Pred, Tmp);
- else
- Tmp.Add(Pred);
- } else
- Visit(InitEx, Pred, Tmp);
- } else
+ if (InitEx)
+ Visit(InitEx, Pred, Tmp);
+ else
Tmp.Add(Pred);
ExplodedNodeSet Tmp2;
diff --git a/contrib/llvm/tools/clang/lib/StaticAnalyzer/Core/RegionStore.cpp b/contrib/llvm/tools/clang/lib/StaticAnalyzer/Core/RegionStore.cpp
index d0d8f60..23dd641 100644
--- a/contrib/llvm/tools/clang/lib/StaticAnalyzer/Core/RegionStore.cpp
+++ b/contrib/llvm/tools/clang/lib/StaticAnalyzer/Core/RegionStore.cpp
@@ -1377,7 +1377,12 @@ StoreRef RegionStoreManager::setImplicitDefaultValue(Store store,
V = svalBuilder.makeZeroVal(Ctx.IntTy);
}
else {
- return StoreRef(store, *this);
+ // We can't represent values of this type, but we still need to set a value
+ // to record that the region has been initialized.
+ // If this assertion ever fires, a new case should be added above -- we
+ // should know how to default-initialize any value we can symbolicate.
+ assert(!SymbolManager::canSymbolicate(T) && "This type is representable");
+ V = UnknownVal();
}
return StoreRef(addBinding(B, R, BindingKey::Default,
diff --git a/contrib/llvm/tools/clang/lib/StaticAnalyzer/Core/SimpleSValBuilder.cpp b/contrib/llvm/tools/clang/lib/StaticAnalyzer/Core/SimpleSValBuilder.cpp
index 197442b..80c18a3 100644
--- a/contrib/llvm/tools/clang/lib/StaticAnalyzer/Core/SimpleSValBuilder.cpp
+++ b/contrib/llvm/tools/clang/lib/StaticAnalyzer/Core/SimpleSValBuilder.cpp
@@ -415,6 +415,24 @@ SVal SimpleSValBuilder::evalBinOpNN(const GRState *state,
case nonloc::ConcreteIntKind: {
const nonloc::ConcreteInt& lhsInt = cast<nonloc::ConcreteInt>(lhs);
+ // Is the RHS a symbol we can simplify?
+ // FIXME: This was mostly copy/pasted from the LHS-is-a-symbol case.
+ if (const nonloc::SymbolVal *srhs = dyn_cast<nonloc::SymbolVal>(&rhs)) {
+ SymbolRef RSym = srhs->getSymbol();
+ if (RSym->getType(Context)->isIntegerType()) {
+ if (const llvm::APSInt *Constant = state->getSymVal(RSym)) {
+ // The symbol evaluates to a constant.
+ const llvm::APSInt *rhs_I;
+ if (BinaryOperator::isRelationalOp(op))
+ rhs_I = &BasicVals.Convert(lhsInt.getValue(), *Constant);
+ else
+ rhs_I = &BasicVals.Convert(resultTy, *Constant);
+
+ rhs = nonloc::ConcreteInt(*rhs_I);
+ }
+ }
+ }
+
if (isa<nonloc::ConcreteInt>(rhs)) {
return lhsInt.evalBinOp(*this, op, cast<nonloc::ConcreteInt>(rhs));
} else {
@@ -461,13 +479,22 @@ SVal SimpleSValBuilder::evalBinOpNN(const GRState *state,
case nonloc::SymbolValKind: {
nonloc::SymbolVal *slhs = cast<nonloc::SymbolVal>(&lhs);
SymbolRef Sym = slhs->getSymbol();
+ QualType lhsType = Sym->getType(Context);
+
+ // The conversion type is usually the result type, but not in the case
+ // of relational expressions.
+ QualType conversionType = resultTy;
+ if (BinaryOperator::isRelationalOp(op))
+ conversionType = lhsType;
+
// Does the symbol simplify to a constant? If so, "fold" the constant
// by setting 'lhs' to a ConcreteInt and try again.
- if (Sym->getType(Context)->isIntegerType())
+ if (lhsType->isIntegerType())
if (const llvm::APSInt *Constant = state->getSymVal(Sym)) {
// The symbol evaluates to a constant. If necessary, promote the
// folded constant (LHS) to the result type.
- const llvm::APSInt &lhs_I = BasicVals.Convert(resultTy, *Constant);
+ const llvm::APSInt &lhs_I = BasicVals.Convert(conversionType,
+ *Constant);
lhs = nonloc::ConcreteInt(lhs_I);
// Also promote the RHS (if necessary).
@@ -479,7 +506,7 @@ SVal SimpleSValBuilder::evalBinOpNN(const GRState *state,
// Other operators: do an implicit conversion. This shouldn't be
// necessary once we support truncation/extension of symbolic values.
if (nonloc::ConcreteInt *rhs_I = dyn_cast<nonloc::ConcreteInt>(&rhs)){
- rhs = nonloc::ConcreteInt(BasicVals.Convert(resultTy,
+ rhs = nonloc::ConcreteInt(BasicVals.Convert(conversionType,
rhs_I->getValue()));
}
@@ -492,7 +519,8 @@ SVal SimpleSValBuilder::evalBinOpNN(const GRState *state,
if (RSym->getType(Context)->isIntegerType()) {
if (const llvm::APSInt *Constant = state->getSymVal(RSym)) {
// The symbol evaluates to a constant.
- const llvm::APSInt &rhs_I = BasicVals.Convert(resultTy, *Constant);
+ const llvm::APSInt &rhs_I = BasicVals.Convert(conversionType,
+ *Constant);
rhs = nonloc::ConcreteInt(rhs_I);
}
}
diff --git a/contrib/llvm/tools/clang/lib/Tooling/CMakeLists.txt b/contrib/llvm/tools/clang/lib/Tooling/CMakeLists.txt
deleted file mode 100644
index f52cf6c..0000000
--- a/contrib/llvm/tools/clang/lib/Tooling/CMakeLists.txt
+++ /dev/null
@@ -1,6 +0,0 @@
-SET(LLVM_USED_LIBS clangBasic clangFrontend clangAST)
-
-add_clang_library(clangTooling
- JsonCompileCommandLineDatabase.cpp
- Tooling.cpp
- )
diff --git a/contrib/llvm/tools/clang/tools/driver/cc1_main.cpp b/contrib/llvm/tools/clang/tools/driver/cc1_main.cpp
index 535eaa9..9ad4af1 100644
--- a/contrib/llvm/tools/clang/tools/driver/cc1_main.cpp
+++ b/contrib/llvm/tools/clang/tools/driver/cc1_main.cpp
@@ -126,6 +126,8 @@ int cc1_main(const char **ArgBegin, const char **ArgEnd,
// Initialize targets first, so that --version shows registered targets.
llvm::InitializeAllTargets();
+ llvm::InitializeAllMCAsmInfos();
+ llvm::InitializeAllMCSubtargetInfos();
llvm::InitializeAllAsmPrinters();
llvm::InitializeAllAsmParsers();
diff --git a/contrib/llvm/tools/clang/tools/driver/cc1as_main.cpp b/contrib/llvm/tools/clang/tools/driver/cc1as_main.cpp
index f449235..358d746 100644
--- a/contrib/llvm/tools/clang/tools/driver/cc1as_main.cpp
+++ b/contrib/llvm/tools/clang/tools/driver/cc1as_main.cpp
@@ -29,7 +29,9 @@
#include "llvm/MC/MCAsmInfo.h"
#include "llvm/MC/MCCodeEmitter.h"
#include "llvm/MC/MCContext.h"
+#include "llvm/MC/MCInstrInfo.h"
#include "llvm/MC/MCStreamer.h"
+#include "llvm/MC/MCSubtargetInfo.h"
#include "llvm/Support/CommandLine.h"
#include "llvm/Support/FormattedStream.h"
#include "llvm/Support/ErrorHandling.h"
@@ -47,11 +49,13 @@
#include "llvm/Target/TargetAsmInfo.h"
#include "llvm/Target/TargetAsmParser.h"
#include "llvm/Target/TargetData.h"
+#include "llvm/Target/TargetInstrInfo.h"
#include "llvm/Target/TargetLowering.h"
#include "llvm/Target/TargetLoweringObjectFile.h"
#include "llvm/Target/TargetMachine.h"
#include "llvm/Target/TargetRegistry.h"
#include "llvm/Target/TargetSelect.h"
+#include "llvm/Target/TargetSubtargetInfo.h"
using namespace clang;
using namespace clang::driver;
using namespace llvm;
@@ -252,7 +256,7 @@ static bool ExecuteAssembler(AssemblerInvocation &Opts, Diagnostic &Diags) {
// it later.
SrcMgr.setIncludeDirs(Opts.IncludePaths);
- OwningPtr<MCAsmInfo> MAI(TheTarget->createAsmInfo(Opts.Triple));
+ OwningPtr<MCAsmInfo> MAI(TheTarget->createMCAsmInfo(Opts.Triple));
assert(MAI && "Unable to create target asm info!");
bool IsBinary = Opts.OutputType == AssemblerInvocation::FT_Obj;
@@ -261,7 +265,8 @@ static bool ExecuteAssembler(AssemblerInvocation &Opts, Diagnostic &Diags) {
return false;
// FIXME: We shouldn't need to do this (and link in codegen).
- OwningPtr<TargetMachine> TM(TheTarget->createTargetMachine(Opts.Triple, ""));
+ OwningPtr<TargetMachine> TM(TheTarget->createTargetMachine(Opts.Triple,
+ "", ""));
if (!TM) {
Diags.Report(diag::err_target_unknown_triple) << Opts.Triple;
return false;
@@ -278,14 +283,16 @@ static bool ExecuteAssembler(AssemblerInvocation &Opts, Diagnostic &Diags) {
TM->getTargetLowering()->getObjFileLowering();
const_cast<TargetLoweringObjectFile&>(TLOF).Initialize(Ctx, *TM);
+ const MCSubtargetInfo &STI = TM->getSubtarget<MCSubtargetInfo>();
+
// FIXME: There is a bit of code duplication with addPassesToEmitFile.
if (Opts.OutputType == AssemblerInvocation::FT_Asm) {
MCInstPrinter *IP =
- TheTarget->createMCInstPrinter(*TM, Opts.OutputAsmVariant, *MAI);
+ TheTarget->createMCInstPrinter(Opts.OutputAsmVariant, *MAI);
MCCodeEmitter *CE = 0;
TargetAsmBackend *TAB = 0;
if (Opts.ShowEncoding) {
- CE = TheTarget->createCodeEmitter(*TM, Ctx);
+ CE = TheTarget->createCodeEmitter(*TM->getInstrInfo(), STI, Ctx);
TAB = TheTarget->createAsmBackend(Opts.Triple);
}
Str.reset(TheTarget->createAsmStreamer(Ctx, *Out, /*asmverbose*/true,
@@ -297,7 +304,8 @@ static bool ExecuteAssembler(AssemblerInvocation &Opts, Diagnostic &Diags) {
} else {
assert(Opts.OutputType == AssemblerInvocation::FT_Obj &&
"Invalid file type!");
- MCCodeEmitter *CE = TheTarget->createCodeEmitter(*TM, Ctx);
+ MCCodeEmitter *CE = TheTarget->createCodeEmitter(*TM->getInstrInfo(),
+ STI, Ctx);
TargetAsmBackend *TAB = TheTarget->createAsmBackend(Opts.Triple);
Str.reset(TheTarget->createObjectStreamer(Opts.Triple, Ctx, *TAB, *Out,
CE, Opts.RelaxAll,
@@ -307,7 +315,8 @@ static bool ExecuteAssembler(AssemblerInvocation &Opts, Diagnostic &Diags) {
OwningPtr<MCAsmParser> Parser(createMCAsmParser(*TheTarget, SrcMgr, Ctx,
*Str.get(), *MAI));
- OwningPtr<TargetAsmParser> TAP(TheTarget->createAsmParser(*Parser, *TM));
+ OwningPtr<TargetAsmParser>
+ TAP(TheTarget->createAsmParser(const_cast<MCSubtargetInfo&>(STI), *Parser));
if (!TAP) {
Diags.Report(diag::err_target_unknown_triple) << Opts.Triple;
return false;
@@ -347,6 +356,9 @@ int cc1as_main(const char **ArgBegin, const char **ArgEnd,
InitializeAllTargetInfos();
// FIXME: We shouldn't need to initialize the Target(Machine)s.
InitializeAllTargets();
+ InitializeAllMCAsmInfos();
+ InitializeAllMCInstrInfos();
+ InitializeAllMCSubtargetInfos();
InitializeAllAsmPrinters();
InitializeAllAsmParsers();
diff --git a/contrib/llvm/tools/clang/tools/driver/driver.cpp b/contrib/llvm/tools/clang/tools/driver/driver.cpp
index db72da4..ca89826 100644
--- a/contrib/llvm/tools/clang/tools/driver/driver.cpp
+++ b/contrib/llvm/tools/clang/tools/driver/driver.cpp
@@ -327,9 +327,11 @@ static void ParseProgName(llvm::SmallVectorImpl<const char *> &ArgVector,
std::string IgnoredError;
if (llvm::TargetRegistry::lookupTarget(Prefix, IgnoredError)) {
- ArgVector.insert(&ArgVector[1],
- SaveStringInSet(SavedStrings, Prefix));
- ArgVector.insert(&ArgVector[1],
+ llvm::SmallVectorImpl<const char *>::iterator it = ArgVector.begin();
+ if (it != ArgVector.end())
+ ++it;
+ ArgVector.insert(it, SaveStringInSet(SavedStrings, Prefix));
+ ArgVector.insert(it,
SaveStringInSet(SavedStrings, std::string("-ccc-host-triple")));
}
}
diff --git a/contrib/llvm/utils/TableGen/ARMDecoderEmitter.cpp b/contrib/llvm/utils/TableGen/ARMDecoderEmitter.cpp
index 62bd1c6..8a5dc8b 100644
--- a/contrib/llvm/utils/TableGen/ARMDecoderEmitter.cpp
+++ b/contrib/llvm/utils/TableGen/ARMDecoderEmitter.cpp
@@ -421,6 +421,9 @@ public:
protected:
// Populates the insn given the uid.
void insnWithID(insn_t &Insn, unsigned Opcode) const {
+ if (AllInstructions[Opcode]->isPseudo)
+ return;
+
BitsInit &Bits = getBitsField(*AllInstructions[Opcode]->TheDef, "Inst");
for (unsigned i = 0; i < BIT_WIDTH; ++i)
@@ -1592,10 +1595,6 @@ ARMDEBackend::populateInstruction(const CodeGenInstruction &CGI,
// The following special cases are for conflict resolutions.
//
- // RSCSri and RSCSrs set the 's' bit, but are not predicated. We are
- // better off using the generic RSCri and RSCrs instructions.
- if (Name == "RSCSri" || Name == "RSCSrs") return false;
-
// A8-598: VEXT
// Vector Extract extracts elements from the bottom end of the second
// operand vector and the top end of the first, concatenates them and
@@ -1628,10 +1627,6 @@ ARMDEBackend::populateInstruction(const CodeGenInstruction &CGI,
if (Name == "tBX_RET" || Name == "tBX_RET_vararg")
return false;
- // Ignore the TPsoft (TLS) instructions, which conflict with tBLr9.
- if (Name == "tTPsoft" || Name == "t2TPsoft")
- return false;
-
// Ignore tADR, prefer tADDrPCi.
if (Name == "tADR")
return false;
@@ -1644,12 +1639,8 @@ ARMDEBackend::populateInstruction(const CodeGenInstruction &CGI,
// Ignore tADDrSP, tADDspr, and tPICADD, prefer the generic tADDhirr.
// Ignore t2SUBrSPs, prefer the t2SUB[S]r[r|s].
// Ignore t2ADDrSPs, prefer the t2ADD[S]r[r|s].
- // Ignore t2ADDrSPi/t2SUBrSPi, which have more generic couterparts.
- // Ignore t2ADDrSPi12/t2SUBrSPi12, which have more generic couterparts
if (Name == "tADDrSP" || Name == "tADDspr" || Name == "tPICADD" ||
- Name == "t2SUBrSPs" || Name == "t2ADDrSPs" ||
- Name == "t2ADDrSPi" || Name == "t2SUBrSPi" ||
- Name == "t2ADDrSPi12" || Name == "t2SUBrSPi12")
+ Name == "t2SUBrSPs" || Name == "t2ADDrSPs")
return false;
// FIXME: Use ldr.n to work around a Darwin assembler bug.
@@ -1664,17 +1655,15 @@ ARMDEBackend::populateInstruction(const CodeGenInstruction &CGI,
// Resolve conflicts:
//
// tBfar conflicts with tBLr9
- // tPOP_RET/t2LDMIA_RET conflict with tPOP/t2LDM (ditto)
+ // t2LDMIA_RET conflict with t2LDM (ditto)
// tMOVCCi conflicts with tMOVi8
// tMOVCCr conflicts with tMOVgpr2gpr
- // tSpill conflicts with tSTRspi
// tLDRcp conflicts with tLDRspi
- // tRestore conflicts with tLDRspi
// t2MOVCCi16 conflicts with tMOVi16
if (Name == "tBfar" ||
- Name == "tPOP_RET" || Name == "t2LDMIA_RET" ||
+ Name == "t2LDMIA_RET" ||
Name == "tMOVCCi" || Name == "tMOVCCr" ||
- Name == "tSpill" || Name == "tLDRcp" || Name == "tRestore" ||
+ Name == "tLDRcp" ||
Name == "t2MOVCCi16")
return false;
}
diff --git a/contrib/llvm/utils/TableGen/AsmMatcherEmitter.cpp b/contrib/llvm/utils/TableGen/AsmMatcherEmitter.cpp
index bbe4349..a6a4fec 100644
--- a/contrib/llvm/utils/TableGen/AsmMatcherEmitter.cpp
+++ b/contrib/llvm/utils/TableGen/AsmMatcherEmitter.cpp
@@ -98,6 +98,7 @@
#include "AsmMatcherEmitter.h"
#include "CodeGenTarget.h"
+#include "Error.h"
#include "Record.h"
#include "StringMatcher.h"
#include "llvm/ADT/OwningPtr.h"
@@ -870,6 +871,31 @@ AsmMatcherInfo::getOperandClass(const CGIOperandList::OperandInfo &OI,
if (SubOpIdx != -1)
Rec = dynamic_cast<DefInit*>(OI.MIOperandInfo->getArg(SubOpIdx))->getDef();
+ if (Rec->isSubClassOf("RegisterOperand")) {
+ // RegisterOperand may have an associated ParserMatchClass. If it does,
+ // use it, else just fall back to the underlying register class.
+ const RecordVal *R = Rec->getValue("ParserMatchClass");
+ if (R == 0 || R->getValue() == 0)
+ throw "Record `" + Rec->getName() +
+ "' does not have a ParserMatchClass!\n";
+
+ if (DefInit *DI= dynamic_cast<DefInit*>(R->getValue())) {
+ Record *MatchClass = DI->getDef();
+ if (ClassInfo *CI = AsmOperandClasses[MatchClass])
+ return CI;
+ }
+
+ // No custom match class. Just use the register class.
+ Record *ClassRec = Rec->getValueAsDef("RegClass");
+ if (!ClassRec)
+ throw TGError(Rec->getLoc(), "RegisterOperand `" + Rec->getName() +
+ "' has no associated register class!\n");
+ if (ClassInfo *CI = RegisterClassClasses[ClassRec])
+ return CI;
+ throw TGError(Rec->getLoc(), "register class has no class info!");
+ }
+
+
if (Rec->isSubClassOf("RegisterClass")) {
if (ClassInfo *CI = RegisterClassClasses[Rec])
return CI;
@@ -886,7 +912,8 @@ AsmMatcherInfo::getOperandClass(const CGIOperandList::OperandInfo &OI,
void AsmMatcherInfo::
BuildRegisterClasses(SmallPtrSet<Record*, 16> &SingletonRegisters) {
- const std::vector<CodeGenRegister> &Registers = Target.getRegisters();
+ const std::vector<CodeGenRegister*> &Registers =
+ Target.getRegBank().getRegisters();
const std::vector<CodeGenRegisterClass> &RegClassList =
Target.getRegisterClasses();
@@ -896,8 +923,8 @@ BuildRegisterClasses(SmallPtrSet<Record*, 16> &SingletonRegisters) {
// Gather the defined sets.
for (std::vector<CodeGenRegisterClass>::const_iterator it =
RegClassList.begin(), ie = RegClassList.end(); it != ie; ++it)
- RegisterSets.insert(std::set<Record*>(it->Elements.begin(),
- it->Elements.end()));
+ RegisterSets.insert(std::set<Record*>(it->getOrder().begin(),
+ it->getOrder().end()));
// Add any required singleton sets.
for (SmallPtrSet<Record*, 16>::iterator it = SingletonRegisters.begin(),
@@ -910,9 +937,9 @@ BuildRegisterClasses(SmallPtrSet<Record*, 16> &SingletonRegisters) {
// a unique register set class), and build the mapping of registers to the set
// they should classify to.
std::map<Record*, std::set<Record*> > RegisterMap;
- for (std::vector<CodeGenRegister>::const_iterator it = Registers.begin(),
+ for (std::vector<CodeGenRegister*>::const_iterator it = Registers.begin(),
ie = Registers.end(); it != ie; ++it) {
- const CodeGenRegister &CGR = *it;
+ const CodeGenRegister &CGR = **it;
// Compute the intersection of all sets containing this register.
std::set<Record*> ContainingSet;
@@ -971,8 +998,8 @@ BuildRegisterClasses(SmallPtrSet<Record*, 16> &SingletonRegisters) {
// Name the register classes which correspond to a user defined RegisterClass.
for (std::vector<CodeGenRegisterClass>::const_iterator
it = RegClassList.begin(), ie = RegClassList.end(); it != ie; ++it) {
- ClassInfo *CI = RegisterSetClasses[std::set<Record*>(it->Elements.begin(),
- it->Elements.end())];
+ ClassInfo *CI = RegisterSetClasses[std::set<Record*>(it->getOrder().begin(),
+ it->getOrder().end())];
if (CI->ValueName.empty()) {
CI->ClassName = it->getName();
CI->Name = "MCK_" + it->getName();
@@ -1126,7 +1153,7 @@ void AsmMatcherInfo::BuildInfo() {
assert(FeatureNo < 32 && "Too many subtarget features!");
}
- StringRef CommentDelimiter = AsmParser->getValueAsString("CommentDelimiter");
+ std::string CommentDelimiter = AsmParser->getValueAsString("CommentDelimiter");
// Parse the instructions; we need to do this first so that we can gather the
// singleton register classes.
@@ -1629,6 +1656,10 @@ static void EmitValidateOperandClass(AsmMatcherInfo &Info,
OS << " " << Info.Target.getName() << "Operand &Operand = *("
<< Info.Target.getName() << "Operand*)GOp;\n";
+ // The InvalidMatchClass is not to match any operand.
+ OS << " if (Kind == InvalidMatchClass)\n";
+ OS << " return false;\n\n";
+
// Check for Token operands first.
OS << " if (Operand.isToken())\n";
OS << " return MatchTokenString(Operand.getToken()) == Kind;\n\n";
@@ -1745,14 +1776,16 @@ static void EmitMatchRegisterName(CodeGenTarget &Target, Record *AsmParser,
raw_ostream &OS) {
// Construct the match list.
std::vector<StringMatcher::StringPair> Matches;
- for (unsigned i = 0, e = Target.getRegisters().size(); i != e; ++i) {
- const CodeGenRegister &Reg = Target.getRegisters()[i];
- if (Reg.TheDef->getValueAsString("AsmName").empty())
+ const std::vector<CodeGenRegister*> &Regs =
+ Target.getRegBank().getRegisters();
+ for (unsigned i = 0, e = Regs.size(); i != e; ++i) {
+ const CodeGenRegister *Reg = Regs[i];
+ if (Reg->TheDef->getValueAsString("AsmName").empty())
continue;
Matches.push_back(StringMatcher::StringPair(
- Reg.TheDef->getValueAsString("AsmName"),
- "return " + utostr(i + 1) + ";"));
+ Reg->TheDef->getValueAsString("AsmName"),
+ "return " + utostr(Reg->EnumValue) + ";"));
}
OS << "static unsigned MatchRegisterName(StringRef Name) {\n";
@@ -1788,15 +1821,44 @@ static void EmitComputeAvailableFeatures(AsmMatcherInfo &Info,
Info.AsmParser->getValueAsString("AsmParserClassName");
OS << "unsigned " << Info.Target.getName() << ClassName << "::\n"
- << "ComputeAvailableFeatures(const " << Info.Target.getName()
- << "Subtarget *Subtarget) const {\n";
+ << "ComputeAvailableFeatures(uint64_t FB) const {\n";
OS << " unsigned Features = 0;\n";
for (std::map<Record*, SubtargetFeatureInfo*>::const_iterator
it = Info.SubtargetFeatures.begin(),
ie = Info.SubtargetFeatures.end(); it != ie; ++it) {
SubtargetFeatureInfo &SFI = *it->second;
- OS << " if (" << SFI.TheDef->getValueAsString("CondString")
- << ")\n";
+
+ OS << " if (";
+ std::string CondStorage = SFI.TheDef->getValueAsString("AssemblerCondString");
+ StringRef Conds = CondStorage;
+ std::pair<StringRef,StringRef> Comma = Conds.split(',');
+ bool First = true;
+ do {
+ if (!First)
+ OS << " && ";
+
+ bool Neg = false;
+ StringRef Cond = Comma.first;
+ if (Cond[0] == '!') {
+ Neg = true;
+ Cond = Cond.substr(1);
+ }
+
+ OS << "((FB & " << Info.Target.getName() << "::" << Cond << ")";
+ if (Neg)
+ OS << " == 0";
+ else
+ OS << " != 0";
+ OS << ")";
+
+ if (Comma.second.empty())
+ break;
+
+ First = false;
+ Comma = Comma.second.split(',');
+ } while (true);
+
+ OS << ")\n";
OS << " Features |= " << SFI.getEnumName() << ";\n";
}
OS << " return Features;\n";
@@ -2111,8 +2173,7 @@ void AsmMatcherEmitter::run(raw_ostream &OS) {
OS << "#undef GET_ASSEMBLER_HEADER\n";
OS << " // This should be included into the middle of the declaration of\n";
OS << " // your subclasses implementation of TargetAsmParser.\n";
- OS << " unsigned ComputeAvailableFeatures(const " <<
- Target.getName() << "Subtarget *Subtarget) const;\n";
+ OS << " unsigned ComputeAvailableFeatures(uint64_t FeatureBits) const;\n";
OS << " enum MatchResultTy {\n";
OS << " Match_ConversionFail,\n";
OS << " Match_InvalidOperand,\n";
diff --git a/contrib/llvm/utils/TableGen/AsmWriterEmitter.cpp b/contrib/llvm/utils/TableGen/AsmWriterEmitter.cpp
index e6deb69..f44f050 100644
--- a/contrib/llvm/utils/TableGen/AsmWriterEmitter.cpp
+++ b/contrib/llvm/utils/TableGen/AsmWriterEmitter.cpp
@@ -14,9 +14,11 @@
#include "AsmWriterEmitter.h"
#include "AsmWriterInst.h"
+#include "Error.h"
#include "CodeGenTarget.h"
#include "Record.h"
#include "StringToOffsetTable.h"
+#include "llvm/ADT/Twine.h"
#include "llvm/Support/Debug.h"
#include "llvm/Support/MathExtras.h"
#include <algorithm>
@@ -457,46 +459,107 @@ void AsmWriterEmitter::EmitPrintInstruction(raw_ostream &O) {
O << "}\n";
}
+static void
+emitRegisterNameString(raw_ostream &O, StringRef AltName,
+ const std::vector<CodeGenRegister*> &Registers) {
+ StringToOffsetTable StringTable;
+ O << " static const unsigned RegAsmOffset" << AltName << "[] = {\n ";
+ for (unsigned i = 0, e = Registers.size(); i != e; ++i) {
+ const CodeGenRegister &Reg = *Registers[i];
+
+ std::string AsmName;
+ // "NoRegAltName" is special. We don't need to do a lookup for that,
+ // as it's just a reference to the default register name.
+ if (AltName == "" || AltName == "NoRegAltName") {
+ AsmName = Reg.TheDef->getValueAsString("AsmName");
+ if (AsmName.empty())
+ AsmName = Reg.getName();
+ } else {
+ // Make sure the register has an alternate name for this index.
+ std::vector<Record*> AltNameList =
+ Reg.TheDef->getValueAsListOfDefs("RegAltNameIndices");
+ unsigned Idx = 0, e;
+ for (e = AltNameList.size();
+ Idx < e && (AltNameList[Idx]->getName() != AltName);
+ ++Idx)
+ ;
+ // If the register has an alternate name for this index, use it.
+ // Otherwise, leave it empty as an error flag.
+ if (Idx < e) {
+ std::vector<std::string> AltNames =
+ Reg.TheDef->getValueAsListOfStrings("AltNames");
+ if (AltNames.size() <= Idx)
+ throw TGError(Reg.TheDef->getLoc(),
+ (Twine("Register definition missing alt name for '") +
+ AltName + "'.").str());
+ AsmName = AltNames[Idx];
+ }
+ }
+
+ O << StringTable.GetOrAddStringOffset(AsmName);
+ if (((i + 1) % 14) == 0)
+ O << ",\n ";
+ else
+ O << ", ";
+
+ }
+ O << "0\n"
+ << " };\n"
+ << "\n";
+
+ O << " const char *AsmStrs" << AltName << " =\n";
+ StringTable.EmitString(O);
+ O << ";\n";
+}
void AsmWriterEmitter::EmitGetRegisterName(raw_ostream &O) {
CodeGenTarget Target(Records);
Record *AsmWriter = Target.getAsmWriter();
std::string ClassName = AsmWriter->getValueAsString("AsmWriterClassName");
- const std::vector<CodeGenRegister> &Registers = Target.getRegisters();
+ const std::vector<CodeGenRegister*> &Registers =
+ Target.getRegBank().getRegisters();
+ std::vector<Record*> AltNameIndices = Target.getRegAltNameIndices();
+ bool hasAltNames = AltNameIndices.size() > 1;
- StringToOffsetTable StringTable;
O <<
"\n\n/// getRegisterName - This method is automatically generated by tblgen\n"
"/// from the register set description. This returns the assembler name\n"
"/// for the specified register.\n"
- "const char *" << Target.getName() << ClassName
- << "::getRegisterName(unsigned RegNo) {\n"
- << " assert(RegNo && RegNo < " << (Registers.size()+1)
- << " && \"Invalid register number!\");\n"
- << "\n"
- << " static const unsigned RegAsmOffset[] = {";
- for (unsigned i = 0, e = Registers.size(); i != e; ++i) {
- const CodeGenRegister &Reg = Registers[i];
-
- std::string AsmName = Reg.TheDef->getValueAsString("AsmName");
- if (AsmName.empty())
- AsmName = Reg.getName();
-
-
- if ((i % 14) == 0)
- O << "\n ";
-
- O << StringTable.GetOrAddStringOffset(AsmName) << ", ";
- }
- O << "0\n"
- << " };\n"
+ "const char *" << Target.getName() << ClassName << "::";
+ if (hasAltNames)
+ O << "\ngetRegisterName(unsigned RegNo, unsigned AltIdx) {\n";
+ else
+ O << "getRegisterName(unsigned RegNo) {\n";
+ O << " assert(RegNo && RegNo < " << (Registers.size()+1)
+ << " && \"Invalid register number!\");\n"
<< "\n";
- O << " const char *AsmStrs =\n";
- StringTable.EmitString(O);
- O << ";\n";
+ if (hasAltNames) {
+ for (unsigned i = 0, e = AltNameIndices.size(); i < e; ++i)
+ emitRegisterNameString(O, AltNameIndices[i]->getName(), Registers);
+ } else
+ emitRegisterNameString(O, "", Registers);
+
+ if (hasAltNames) {
+ O << " const unsigned *RegAsmOffset;\n"
+ << " const char *AsmStrs;\n"
+ << " switch(AltIdx) {\n"
+ << " default: assert(0 && \"Invalid register alt name index!\");\n";
+ for (unsigned i = 0, e = AltNameIndices.size(); i < e; ++i) {
+ StringRef Namespace = AltNameIndices[1]->getValueAsString("Namespace");
+ StringRef AltName(AltNameIndices[i]->getName());
+ O << " case " << Namespace << "::" << AltName
+ << ":\n"
+ << " AsmStrs = AsmStrs" << AltName << ";\n"
+ << " RegAsmOffset = RegAsmOffset" << AltName << ";\n"
+ << " break;\n";
+ }
+ O << "}\n";
+ }
- O << " return AsmStrs+RegAsmOffset[RegNo-1];\n"
+ O << " assert (*(AsmStrs+RegAsmOffset[RegNo-1]) &&\n"
+ << " \"Invalid alt name index for register!\");\n"
+ << " return AsmStrs+RegAsmOffset[RegNo-1];\n"
<< "}\n";
}
@@ -543,92 +606,29 @@ void AsmWriterEmitter::EmitGetInstructionName(raw_ostream &O) {
}
namespace {
-
-/// SubtargetFeatureInfo - Helper class for storing information on a subtarget
-/// feature which participates in instruction matching.
-struct SubtargetFeatureInfo {
- /// \brief The predicate record for this feature.
- const Record *TheDef;
-
- /// \brief An unique index assigned to represent this feature.
- unsigned Index;
-
- SubtargetFeatureInfo(const Record *D, unsigned Idx) : TheDef(D), Index(Idx) {}
-
- /// \brief The name of the enumerated constant identifying this feature.
- std::string getEnumName() const {
- return "Feature_" + TheDef->getName();
- }
-};
-
-struct AsmWriterInfo {
- /// Map of Predicate records to their subtarget information.
- std::map<const Record*, SubtargetFeatureInfo*> SubtargetFeatures;
-
- /// getSubtargetFeature - Lookup or create the subtarget feature info for the
- /// given operand.
- SubtargetFeatureInfo *getSubtargetFeature(const Record *Def) const {
- assert(Def->isSubClassOf("Predicate") && "Invalid predicate type!");
- std::map<const Record*, SubtargetFeatureInfo*>::const_iterator I =
- SubtargetFeatures.find(Def);
- return I == SubtargetFeatures.end() ? 0 : I->second;
- }
-
- void addReqFeatures(const std::vector<Record*> &Features) {
- for (std::vector<Record*>::const_iterator
- I = Features.begin(), E = Features.end(); I != E; ++I) {
- const Record *Pred = *I;
-
- // Ignore predicates that are not intended for the assembler.
- if (!Pred->getValueAsBit("AssemblerMatcherPredicate"))
- continue;
-
- if (Pred->getName().empty())
- throw TGError(Pred->getLoc(), "Predicate has no name!");
-
- // Don't add the predicate again.
- if (getSubtargetFeature(Pred))
- continue;
-
- unsigned FeatureNo = SubtargetFeatures.size();
- SubtargetFeatures[Pred] = new SubtargetFeatureInfo(Pred, FeatureNo);
- assert(FeatureNo < 32 && "Too many subtarget features!");
- }
- }
-
- const SubtargetFeatureInfo *getFeatureInfo(const Record *R) {
- return SubtargetFeatures[R];
- }
-};
-
// IAPrinter - Holds information about an InstAlias. Two InstAliases match if
// they both have the same conditionals. In which case, we cannot print out the
// alias for that pattern.
class IAPrinter {
- AsmWriterInfo &AWI;
std::vector<std::string> Conds;
std::map<StringRef, unsigned> OpMap;
std::string Result;
std::string AsmString;
std::vector<Record*> ReqFeatures;
public:
- IAPrinter(AsmWriterInfo &Info, std::string R, std::string AS)
- : AWI(Info), Result(R), AsmString(AS) {}
+ IAPrinter(std::string R, std::string AS)
+ : Result(R), AsmString(AS) {}
void addCond(const std::string &C) { Conds.push_back(C); }
- void addReqFeatures(const std::vector<Record*> &Features) {
- AWI.addReqFeatures(Features);
- ReqFeatures = Features;
- }
void addOperand(StringRef Op, unsigned Idx) { OpMap[Op] = Idx; }
unsigned getOpIndex(StringRef Op) { return OpMap[Op]; }
bool isOpMapped(StringRef Op) { return OpMap.find(Op) != OpMap.end(); }
- bool print(raw_ostream &O) {
+ void print(raw_ostream &O) {
if (Conds.empty() && ReqFeatures.empty()) {
O.indent(6) << "return true;\n";
- return false;
+ return;
}
O << "if (";
@@ -643,27 +643,6 @@ public:
O << *I;
}
- if (!ReqFeatures.empty()) {
- if (Conds.begin() != Conds.end()) {
- O << " &&\n";
- O.indent(8);
- } else {
- O << "if (";
- }
-
- std::string Req;
- raw_string_ostream ReqO(Req);
-
- for (std::vector<Record*>::iterator
- I = ReqFeatures.begin(), E = ReqFeatures.end(); I != E; ++I) {
- if (I != ReqFeatures.begin()) ReqO << " | ";
- ReqO << AWI.getFeatureInfo(*I)->getEnumName();
- }
-
- O << "(AvailableFeatures & (" << ReqO.str() << ")) == ("
- << ReqO.str() << ')';
- }
-
O << ") {\n";
O.indent(6) << "// " << Result << "\n";
O.indent(6) << "AsmString = \"" << AsmString << "\";\n";
@@ -675,7 +654,6 @@ public:
O.indent(6) << "break;\n";
O.indent(4) << '}';
- return !ReqFeatures.empty();
}
bool operator==(const IAPrinter &RHS) {
@@ -707,53 +685,6 @@ public:
} // end anonymous namespace
-/// EmitSubtargetFeatureFlagEnumeration - Emit the subtarget feature flag
-/// definitions.
-static void EmitSubtargetFeatureFlagEnumeration(AsmWriterInfo &Info,
- raw_ostream &O) {
- O << "namespace {\n\n";
- O << "// Flags for subtarget features that participate in "
- << "alias instruction matching.\n";
- O << "enum SubtargetFeatureFlag {\n";
-
- for (std::map<const Record*, SubtargetFeatureInfo*>::const_iterator
- I = Info.SubtargetFeatures.begin(),
- E = Info.SubtargetFeatures.end(); I != E; ++I) {
- SubtargetFeatureInfo &SFI = *I->second;
- O << " " << SFI.getEnumName() << " = (1 << " << SFI.Index << "),\n";
- }
-
- O << " Feature_None = 0\n";
- O << "};\n\n";
- O << "} // end anonymous namespace\n\n";
-}
-
-/// EmitComputeAvailableFeatures - Emit the function to compute the list of
-/// available features given a subtarget.
-static void EmitComputeAvailableFeatures(AsmWriterInfo &Info,
- Record *AsmWriter,
- CodeGenTarget &Target,
- raw_ostream &O) {
- std::string ClassName = AsmWriter->getValueAsString("AsmWriterClassName");
-
- O << "unsigned " << Target.getName() << ClassName << "::\n"
- << "ComputeAvailableFeatures(const " << Target.getName()
- << "Subtarget *Subtarget) const {\n";
- O << " unsigned Features = 0;\n";
-
- for (std::map<const Record*, SubtargetFeatureInfo*>::const_iterator
- I = Info.SubtargetFeatures.begin(),
- E = Info.SubtargetFeatures.end(); I != E; ++I) {
- SubtargetFeatureInfo &SFI = *I->second;
- O << " if (" << SFI.TheDef->getValueAsString("CondString")
- << ")\n";
- O << " Features |= " << SFI.getEnumName() << ";\n";
- }
-
- O << " return Features;\n";
- O << "}\n\n";
-}
-
static void EmitGetMapOperandNumber(raw_ostream &O) {
O << "static unsigned getMapOperandNumber("
<< "const SmallVectorImpl<std::pair<StringRef, unsigned> > &OpMap,\n";
@@ -805,16 +736,16 @@ void AsmWriterEmitter::EmitRegIsInRegClass(raw_ostream &O) {
O << " case RC_" << Name << ":\n";
// Emit the register list now.
- unsigned IE = RC.Elements.size();
+ unsigned IE = RC.getOrder().size();
if (IE == 1) {
- O << " if (Reg == " << getQualifiedName(RC.Elements[0]) << ")\n";
+ O << " if (Reg == " << getQualifiedName(RC.getOrder()[0]) << ")\n";
O << " return true;\n";
} else {
O << " switch (Reg) {\n";
O << " default: break;\n";
for (unsigned II = 0; II != IE; ++II) {
- Record *Reg = RC.Elements[II];
+ Record *Reg = RC.getOrder()[II];
O << " case " << getQualifiedName(Reg) << ":\n";
}
@@ -830,10 +761,46 @@ void AsmWriterEmitter::EmitRegIsInRegClass(raw_ostream &O) {
O << "}\n\n";
}
+static unsigned CountNumOperands(StringRef AsmString) {
+ unsigned NumOps = 0;
+ std::pair<StringRef, StringRef> ASM = AsmString.split(' ');
+
+ while (!ASM.second.empty()) {
+ ++NumOps;
+ ASM = ASM.second.split(' ');
+ }
+
+ return NumOps;
+}
+
+static unsigned CountResultNumOperands(StringRef AsmString) {
+ unsigned NumOps = 0;
+ std::pair<StringRef, StringRef> ASM = AsmString.split('\t');
+
+ if (!ASM.second.empty()) {
+ size_t I = ASM.second.find('{');
+ StringRef Str = ASM.second;
+ if (I != StringRef::npos)
+ Str = ASM.second.substr(I, ASM.second.find('|', I));
+
+ ASM = Str.split(' ');
+
+ do {
+ ++NumOps;
+ ASM = ASM.second.split(' ');
+ } while (!ASM.second.empty());
+ }
+
+ return NumOps;
+}
+
void AsmWriterEmitter::EmitPrintAliasInstruction(raw_ostream &O) {
CodeGenTarget Target(Records);
Record *AsmWriter = Target.getAsmWriter();
+ if (!AsmWriter->getValueAsBit("isMCAsmWriter"))
+ return;
+
O << "\n#ifdef PRINT_ALIAS_INSTR\n";
O << "#undef PRINT_ALIAS_INSTR\n\n";
@@ -842,9 +809,6 @@ void AsmWriterEmitter::EmitPrintAliasInstruction(raw_ostream &O) {
// Emit the method that prints the alias instruction.
std::string ClassName = AsmWriter->getValueAsString("AsmWriterClassName");
- bool isMC = AsmWriter->getValueAsBit("isMCAsmWriter");
- const char *MachineInstrClassName = isMC ? "MCInst" : "MachineInstr";
-
std::vector<Record*> AllInstAliases =
Records.getAllDerivedDefinitions("InstAlias");
@@ -864,7 +828,6 @@ void AsmWriterEmitter::EmitPrintAliasInstruction(raw_ostream &O) {
// A map of which conditions need to be met for each instruction operand
// before it can be matched to the mnemonic.
std::map<std::string, std::vector<IAPrinter*> > IAPrinterMap;
- AsmWriterInfo AWI;
for (std::map<std::string, std::vector<CodeGenInstAlias*> >::iterator
I = AliasMap.begin(), E = AliasMap.end(); I != E; ++I) {
@@ -873,12 +836,16 @@ void AsmWriterEmitter::EmitPrintAliasInstruction(raw_ostream &O) {
for (std::vector<CodeGenInstAlias*>::iterator
II = Aliases.begin(), IE = Aliases.end(); II != IE; ++II) {
const CodeGenInstAlias *CGA = *II;
- IAPrinter *IAP = new IAPrinter(AWI, CGA->Result->getAsString(),
- CGA->AsmString);
+ unsigned LastOpNo = CGA->ResultInstOperandIndex.size();
+ unsigned NumResultOps =
+ CountResultNumOperands(CGA->ResultInst->AsmString);
- IAP->addReqFeatures(CGA->TheDef->getValueAsListOfDefs("Predicates"));
+ // Don't emit the alias if it has more operands than what it's aliasing.
+ if (NumResultOps < CountNumOperands(CGA->AsmString))
+ continue;
- unsigned LastOpNo = CGA->ResultInstOperandIndex.size();
+ IAPrinter *IAP = new IAPrinter(CGA->Result->getAsString(),
+ CGA->AsmString);
std::string Cond;
Cond = std::string("MI->getNumOperands() == ") + llvm::utostr(LastOpNo);
@@ -896,6 +863,9 @@ void AsmWriterEmitter::EmitPrintAliasInstruction(raw_ostream &O) {
const Record *Rec = RO.getRecord();
StringRef ROName = RO.getName();
+
+ if (Rec->isSubClassOf("RegisterOperand"))
+ Rec = Rec->getValueAsDef("RegClass");
if (Rec->isSubClassOf("RegisterClass")) {
Cond = std::string("MI->getOperand(")+llvm::utostr(i)+").isReg()";
IAP->addCond(Cond);
@@ -914,7 +884,7 @@ void AsmWriterEmitter::EmitPrintAliasInstruction(raw_ostream &O) {
}
} else {
assert(Rec->isSubClassOf("Operand") && "Unexpected operand!");
- // FIXME: We need to handle these situations.
+ // FIXME: We may need to handle these situations.
delete IAP;
IAP = 0;
CantHandle = true;
@@ -945,19 +915,15 @@ void AsmWriterEmitter::EmitPrintAliasInstruction(raw_ostream &O) {
}
}
- EmitSubtargetFeatureFlagEnumeration(AWI, O);
- EmitComputeAvailableFeatures(AWI, AsmWriter, Target, O);
-
std::string Header;
raw_string_ostream HeaderO(Header);
HeaderO << "bool " << Target.getName() << ClassName
- << "::printAliasInstr(const " << MachineInstrClassName
+ << "::printAliasInstr(const MCInst"
<< " *MI, raw_ostream &OS) {\n";
std::string Cases;
raw_string_ostream CasesO(Cases);
- bool NeedAvailableFeatures = false;
for (std::map<std::string, std::vector<IAPrinter*> >::iterator
I = IAPrinterMap.begin(), E = IAPrinterMap.end(); I != E; ++I) {
@@ -988,14 +954,14 @@ void AsmWriterEmitter::EmitPrintAliasInstruction(raw_ostream &O) {
II = UniqueIAPs.begin(), IE = UniqueIAPs.end(); II != IE; ++II) {
IAPrinter *IAP = *II;
CasesO.indent(4);
- NeedAvailableFeatures |= IAP->print(CasesO);
+ IAP->print(CasesO);
CasesO << '\n';
}
CasesO.indent(4) << "return false;\n";
}
- if (CasesO.str().empty() || !isMC) {
+ if (CasesO.str().empty()) {
O << HeaderO.str();
O << " return false;\n";
O << "}\n\n";
@@ -1008,8 +974,6 @@ void AsmWriterEmitter::EmitPrintAliasInstruction(raw_ostream &O) {
O << HeaderO.str();
O.indent(2) << "StringRef AsmString;\n";
O.indent(2) << "SmallVector<std::pair<StringRef, unsigned>, 4> OpMap;\n";
- if (NeedAvailableFeatures)
- O.indent(2) << "unsigned AvailableFeatures = getAvailableFeatures();\n\n";
O.indent(2) << "switch (MI->getOpcode()) {\n";
O.indent(2) << "default: return false;\n";
O << CasesO.str();
diff --git a/contrib/llvm/utils/TableGen/ClangDiagnosticsEmitter.cpp b/contrib/llvm/utils/TableGen/ClangDiagnosticsEmitter.cpp
index acaa1f8..0a48e75 100644
--- a/contrib/llvm/utils/TableGen/ClangDiagnosticsEmitter.cpp
+++ b/contrib/llvm/utils/TableGen/ClangDiagnosticsEmitter.cpp
@@ -18,6 +18,7 @@
#include "llvm/ADT/DenseSet.h"
#include "llvm/ADT/StringExtras.h"
#include "llvm/ADT/StringMap.h"
+#include "llvm/ADT/SmallString.h"
#include "llvm/ADT/VectorExtras.h"
#include <map>
#include <algorithm>
@@ -195,6 +196,15 @@ void ClangDiagsDefsEmitter::run(raw_ostream &OS) {
// Warning Group Tables generation
//===----------------------------------------------------------------------===//
+static std::string getDiagCategoryEnum(llvm::StringRef name) {
+ if (name.empty())
+ return "DiagCat_None";
+ llvm::SmallString<256> enumName = llvm::StringRef("DiagCat_");
+ for (llvm::StringRef::iterator I = name.begin(), E = name.end(); I != E; ++I)
+ enumName += isalnum(*I) ? *I : '_';
+ return enumName.str();
+}
+
namespace {
struct GroupInfo {
std::vector<const Record*> DiagsInGroup;
@@ -301,7 +311,7 @@ void ClangDiagGroupsEmitter::run(raw_ostream &OS) {
OS << "\n#ifdef GET_CATEGORY_TABLE\n";
for (DiagCategoryIDMap::iterator I = CategoriesByID.begin(),
E = CategoriesByID.end(); I != E; ++I)
- OS << "CATEGORY(\"" << *I << "\")\n";
+ OS << "CATEGORY(\"" << *I << "\", " << getDiagCategoryEnum(*I) << ")\n";
OS << "#endif // GET_CATEGORY_TABLE\n\n";
}
diff --git a/contrib/llvm/utils/TableGen/CodeEmitterGen.cpp b/contrib/llvm/utils/TableGen/CodeEmitterGen.cpp
index 9d4dc5c4..d828dfc 100644
--- a/contrib/llvm/utils/TableGen/CodeEmitterGen.cpp
+++ b/contrib/llvm/utils/TableGen/CodeEmitterGen.cpp
@@ -34,7 +34,8 @@ void CodeEmitterGen::reverseBits(std::vector<Record*> &Insts) {
for (std::vector<Record*>::iterator I = Insts.begin(), E = Insts.end();
I != E; ++I) {
Record *R = *I;
- if (R->getValueAsString("Namespace") == "TargetOpcode")
+ if (R->getValueAsString("Namespace") == "TargetOpcode" ||
+ R->getValueAsBit("isPseudo"))
continue;
BitsInit *BI = R->getValueAsBitsInit("Inst");
@@ -231,7 +232,8 @@ void CodeEmitterGen::run(raw_ostream &o) {
const CodeGenInstruction *CGI = *IN;
Record *R = CGI->TheDef;
- if (R->getValueAsString("Namespace") == "TargetOpcode") {
+ if (R->getValueAsString("Namespace") == "TargetOpcode" ||
+ R->getValueAsBit("isPseudo")) {
o << " 0U,\n";
continue;
}
@@ -255,7 +257,8 @@ void CodeEmitterGen::run(raw_ostream &o) {
for (std::vector<Record*>::iterator IC = Insts.begin(), EC = Insts.end();
IC != EC; ++IC) {
Record *R = *IC;
- if (R->getValueAsString("Namespace") == "TargetOpcode")
+ if (R->getValueAsString("Namespace") == "TargetOpcode" ||
+ R->getValueAsBit("isPseudo"))
continue;
const std::string &InstName = R->getValueAsString("Namespace") + "::"
+ R->getName();
diff --git a/contrib/llvm/utils/TableGen/CodeGenDAGPatterns.cpp b/contrib/llvm/utils/TableGen/CodeGenDAGPatterns.cpp
index a08cde6..072893f 100644
--- a/contrib/llvm/utils/TableGen/CodeGenDAGPatterns.cpp
+++ b/contrib/llvm/utils/TableGen/CodeGenDAGPatterns.cpp
@@ -13,6 +13,7 @@
//===----------------------------------------------------------------------===//
#include "CodeGenDAGPatterns.h"
+#include "Error.h"
#include "Record.h"
#include "llvm/ADT/StringExtras.h"
#include "llvm/ADT/STLExtras.h"
@@ -1241,6 +1242,16 @@ TreePatternNode *TreePatternNode::InlinePatternFragments(TreePattern &TP) {
///
static EEVT::TypeSet getImplicitType(Record *R, unsigned ResNo,
bool NotRegisters, TreePattern &TP) {
+ // Check to see if this is a register operand.
+ if (R->isSubClassOf("RegisterOperand")) {
+ assert(ResNo == 0 && "Regoperand ref only has one result!");
+ if (NotRegisters)
+ return EEVT::TypeSet(); // Unknown.
+ Record *RegClass = R->getValueAsDef("RegClass");
+ const CodeGenTarget &T = TP.getDAGPatterns().getTargetInfo();
+ return EEVT::TypeSet(T.getRegisterClass(RegClass).getValueTypes());
+ }
+
// Check to see if this is a register or a register class.
if (R->isSubClassOf("RegisterClass")) {
assert(ResNo == 0 && "Regclass ref only has one result!");
@@ -1523,6 +1534,11 @@ bool TreePatternNode::ApplyTypeConstraints(TreePattern &TP, bool NotRegisters) {
if (ResultNode->isSubClassOf("PointerLikeRegClass")) {
MadeChange |= UpdateNodeType(ResNo, MVT::iPTR, TP);
+ } else if (ResultNode->isSubClassOf("RegisterOperand")) {
+ Record *RegClass = ResultNode->getValueAsDef("RegClass");
+ const CodeGenRegisterClass &RC =
+ CDP.getTargetInfo().getRegisterClass(RegClass);
+ MadeChange |= UpdateNodeType(ResNo, RC.getValueTypes(), TP);
} else if (ResultNode->getName() == "unknown") {
// Nothing to do.
} else {
@@ -1581,6 +1597,11 @@ bool TreePatternNode::ApplyTypeConstraints(TreePattern &TP, bool NotRegisters) {
const CodeGenRegisterClass &RC =
CDP.getTargetInfo().getRegisterClass(OperandNode);
MadeChange |= Child->UpdateNodeType(ChildResNo, RC.getValueTypes(), TP);
+ } else if (OperandNode->isSubClassOf("RegisterOperand")) {
+ Record *RegClass = OperandNode->getValueAsDef("RegClass");
+ const CodeGenRegisterClass &RC =
+ CDP.getTargetInfo().getRegisterClass(RegClass);
+ MadeChange |= Child->UpdateNodeType(ChildResNo, RC.getValueTypes(), TP);
} else if (OperandNode->isSubClassOf("Operand")) {
VT = getValueType(OperandNode->getValueAsDef("Type"));
MadeChange |= Child->UpdateNodeType(ChildResNo, VT, TP);
@@ -1723,7 +1744,7 @@ TreePatternNode *TreePattern::ParseTreePattern(Init *TheInit, StringRef OpName){
Record *R = DI->getDef();
// Direct reference to a leaf DagNode or PatFrag? Turn it into a
- // TreePatternNode if its own. For example:
+ // TreePatternNode of its own. For example:
/// (foo GPR, imm) -> (foo GPR, (imm))
if (R->isSubClassOf("SDNode") || R->isSubClassOf("PatFrag"))
return ParseTreePattern(new DagInit(DI, "",
@@ -1927,7 +1948,8 @@ InferAllTypes(const StringMap<SmallVector<TreePatternNode*,1> > *InNamedTypes) {
// def : Pat<(v1i64 (bitconvert(v2i32 DPR:$src))), (v1i64 DPR:$src)>;
if (Nodes[i] == Trees[0] && Nodes[i]->isLeaf()) {
DefInit *DI = dynamic_cast<DefInit*>(Nodes[i]->getLeafValue());
- if (DI && DI->getDef()->isSubClassOf("RegisterClass"))
+ if (DI && (DI->getDef()->isSubClassOf("RegisterClass") ||
+ DI->getDef()->isSubClassOf("RegisterOperand")))
continue;
}
@@ -2210,7 +2232,8 @@ static bool HandleUse(TreePattern *I, TreePatternNode *Pat,
if (Pat->getName().empty()) {
if (Pat->isLeaf()) {
DefInit *DI = dynamic_cast<DefInit*>(Pat->getLeafValue());
- if (DI && DI->getDef()->isSubClassOf("RegisterClass"))
+ if (DI && (DI->getDef()->isSubClassOf("RegisterClass") ||
+ DI->getDef()->isSubClassOf("RegisterOperand")))
I->error("Input " + DI->getDef()->getName() + " must be named!");
}
return false;
@@ -2317,6 +2340,7 @@ FindPatternInputsAndOutputs(TreePattern *I, TreePatternNode *Pat,
I->error("set destination should be a register!");
if (Val->getDef()->isSubClassOf("RegisterClass") ||
+ Val->getDef()->isSubClassOf("RegisterOperand") ||
Val->getDef()->isSubClassOf("PointerLikeRegClass")) {
if (Dest->getName().empty())
I->error("set destination must have a name!");
diff --git a/contrib/llvm/utils/TableGen/CodeGenDAGPatterns.h b/contrib/llvm/utils/TableGen/CodeGenDAGPatterns.h
index e4e8574..936fd01 100644
--- a/contrib/llvm/utils/TableGen/CodeGenDAGPatterns.h
+++ b/contrib/llvm/utils/TableGen/CodeGenDAGPatterns.h
@@ -26,7 +26,7 @@
namespace llvm {
class Record;
- struct Init;
+ class Init;
class ListInit;
class DagInit;
class SDNodeInfo;
diff --git a/contrib/llvm/utils/TableGen/CodeGenInstruction.cpp b/contrib/llvm/utils/TableGen/CodeGenInstruction.cpp
index 5b0aedf..a52ce86 100644
--- a/contrib/llvm/utils/TableGen/CodeGenInstruction.cpp
+++ b/contrib/llvm/utils/TableGen/CodeGenInstruction.cpp
@@ -13,6 +13,7 @@
#include "CodeGenInstruction.h"
#include "CodeGenTarget.h"
+#include "Error.h"
#include "Record.h"
#include "llvm/ADT/StringExtras.h"
#include "llvm/ADT/StringMap.h"
@@ -66,10 +67,14 @@ CGIOperandList::CGIOperandList(Record *R) : TheDef(R) {
Record *Rec = Arg->getDef();
std::string PrintMethod = "printOperand";
std::string EncoderMethod;
+ std::string OperandType = "OPERAND_UNKNOWN";
unsigned NumOps = 1;
DagInit *MIOpInfo = 0;
- if (Rec->isSubClassOf("Operand")) {
+ if (Rec->isSubClassOf("RegisterOperand")) {
PrintMethod = Rec->getValueAsString("PrintMethod");
+ } else if (Rec->isSubClassOf("Operand")) {
+ PrintMethod = Rec->getValueAsString("PrintMethod");
+ OperandType = Rec->getValueAsString("OperandType");
// If there is an explicit encoder method, use it.
EncoderMethod = Rec->getValueAsString("EncoderMethod");
MIOpInfo = Rec->getValueAsDag("MIOperandInfo");
@@ -93,8 +98,9 @@ CGIOperandList::CGIOperandList(Record *R) : TheDef(R) {
} else if (Rec->getName() == "variable_ops") {
isVariadic = true;
continue;
- } else if (!Rec->isSubClassOf("RegisterClass") &&
- !Rec->isSubClassOf("PointerLikeRegClass") &&
+ } else if (Rec->isSubClassOf("RegisterClass")) {
+ OperandType = "OPERAND_REGISTER";
+ } else if (!Rec->isSubClassOf("PointerLikeRegClass") &&
Rec->getName() != "unknown")
throw "Unknown operand class '" + Rec->getName() +
"' in '" + R->getName() + "' instruction!";
@@ -108,7 +114,8 @@ CGIOperandList::CGIOperandList(Record *R) : TheDef(R) {
" has the same name as a previous operand!";
OperandList.push_back(OperandInfo(Rec, ArgName, PrintMethod, EncoderMethod,
- MIOperandNo, NumOps, MIOpInfo));
+ OperandType, MIOperandNo, NumOps,
+ MIOpInfo));
MIOperandNo += NumOps;
}
@@ -308,6 +315,8 @@ CodeGenInstruction::CodeGenInstruction(Record *R) : TheDef(R), Operands(R) {
isAsCheapAsAMove = R->getValueAsBit("isAsCheapAsAMove");
hasExtraSrcRegAllocReq = R->getValueAsBit("hasExtraSrcRegAllocReq");
hasExtraDefRegAllocReq = R->getValueAsBit("hasExtraDefRegAllocReq");
+ isCodeGenOnly = R->getValueAsBit("isCodeGenOnly");
+ isPseudo = R->getValueAsBit("isPseudo");
ImplicitDefs = R->getValueAsListOfDefs("Defs");
ImplicitUses = R->getValueAsListOfDefs("Uses");
@@ -414,10 +423,14 @@ bool CodeGenInstAlias::tryAliasOpMatch(DagInit *Result, unsigned AliasOpNo,
// Handle explicit registers.
if (ADI && ADI->getDef()->isSubClassOf("Register")) {
+ if (InstOpRec->isSubClassOf("RegisterOperand"))
+ InstOpRec = InstOpRec->getValueAsDef("RegClass");
+
if (!InstOpRec->isSubClassOf("RegisterClass"))
return false;
- if (!T.getRegisterClass(InstOpRec).containsRegister(ADI->getDef()))
+ if (!T.getRegisterClass(InstOpRec)
+ .contains(T.getRegBank().getReg(ADI->getDef())))
throw TGError(Loc, "fixed register " +ADI->getDef()->getName()
+ " is not a member of the " + InstOpRec->getName() +
" register class!");
diff --git a/contrib/llvm/utils/TableGen/CodeGenInstruction.h b/contrib/llvm/utils/TableGen/CodeGenInstruction.h
index 5f1e0be..8d7669a 100644
--- a/contrib/llvm/utils/TableGen/CodeGenInstruction.h
+++ b/contrib/llvm/utils/TableGen/CodeGenInstruction.h
@@ -78,6 +78,10 @@ namespace llvm {
/// for binary encoding. "getMachineOpValue" by default.
std::string EncoderMethodName;
+ /// OperandType - A value from MCOI::OperandType representing the type of
+ /// the operand.
+ std::string OperandType;
+
/// MIOperandNo - Currently (this is meant to be phased out), some logical
/// operands correspond to multiple MachineInstr operands. In the X86
/// target for example, one address operand is represented as 4
@@ -101,10 +105,11 @@ namespace llvm {
std::vector<ConstraintInfo> Constraints;
OperandInfo(Record *R, const std::string &N, const std::string &PMN,
- const std::string &EMN, unsigned MION, unsigned MINO,
- DagInit *MIOI)
+ const std::string &EMN, const std::string &OT, unsigned MION,
+ unsigned MINO, DagInit *MIOI)
: Rec(R), Name(N), PrinterMethodName(PMN), EncoderMethodName(EMN),
- MIOperandNo(MION), MINumOperands(MINO), MIOperandInfo(MIOI) {}
+ OperandType(OT), MIOperandNo(MION), MINumOperands(MINO),
+ MIOperandInfo(MIOI) {}
/// getTiedOperand - If this operand is tied to another one, return the
@@ -235,6 +240,8 @@ namespace llvm {
bool isAsCheapAsAMove;
bool hasExtraSrcRegAllocReq;
bool hasExtraDefRegAllocReq;
+ bool isCodeGenOnly;
+ bool isPseudo;
CodeGenInstruction(Record *R);
diff --git a/contrib/llvm/utils/TableGen/CodeGenRegisters.cpp b/contrib/llvm/utils/TableGen/CodeGenRegisters.cpp
index a4504e4..1acf3a8 100644
--- a/contrib/llvm/utils/TableGen/CodeGenRegisters.cpp
+++ b/contrib/llvm/utils/TableGen/CodeGenRegisters.cpp
@@ -14,6 +14,7 @@
#include "CodeGenRegisters.h"
#include "CodeGenTarget.h"
+#include "Error.h"
#include "llvm/ADT/SmallVector.h"
#include "llvm/ADT/StringExtras.h"
@@ -72,10 +73,21 @@ CodeGenRegister::getSubRegs(CodeGenRegBank &RegBank) {
for (unsigned i = 0, e = SubList.size(); i != e; ++i) {
CodeGenRegister *SR = RegBank.getReg(SubList[i]);
const SubRegMap &Map = SR->getSubRegs(RegBank);
+
+ // Add this as a super-register of SR now all sub-registers are in the list.
+ // This creates a topological ordering, the exact order depends on the
+ // order getSubRegs is called on all registers.
+ SR->SuperRegs.push_back(this);
+
for (SubRegMap::const_iterator SI = Map.begin(), SE = Map.end(); SI != SE;
- ++SI)
+ ++SI) {
if (!SubRegs.insert(*SI).second)
Orphans.push_back(Orphan(SI->second, Indices[i], SI->first));
+
+ // Noop sub-register indexes are possible, so avoid duplicates.
+ if (SI->second != SR)
+ SI->second->SuperRegs.push_back(this);
+ }
}
// Process the composites.
@@ -128,11 +140,122 @@ CodeGenRegister::getSubRegs(CodeGenRegBank &RegBank) {
return SubRegs;
}
+void
+CodeGenRegister::addSubRegsPreOrder(SetVector<CodeGenRegister*> &OSet) const {
+ assert(SubRegsComplete && "Must precompute sub-registers");
+ std::vector<Record*> Indices = TheDef->getValueAsListOfDefs("SubRegIndices");
+ for (unsigned i = 0, e = Indices.size(); i != e; ++i) {
+ CodeGenRegister *SR = SubRegs.find(Indices[i])->second;
+ if (OSet.insert(SR))
+ SR->addSubRegsPreOrder(OSet);
+ }
+}
+
+//===----------------------------------------------------------------------===//
+// RegisterTuples
+//===----------------------------------------------------------------------===//
+
+// A RegisterTuples def is used to generate pseudo-registers from lists of
+// sub-registers. We provide a SetTheory expander class that returns the new
+// registers.
+namespace {
+struct TupleExpander : SetTheory::Expander {
+ void expand(SetTheory &ST, Record *Def, SetTheory::RecSet &Elts) {
+ std::vector<Record*> Indices = Def->getValueAsListOfDefs("SubRegIndices");
+ unsigned Dim = Indices.size();
+ ListInit *SubRegs = Def->getValueAsListInit("SubRegs");
+ if (Dim != SubRegs->getSize())
+ throw TGError(Def->getLoc(), "SubRegIndices and SubRegs size mismatch");
+ if (Dim < 2)
+ throw TGError(Def->getLoc(), "Tuples must have at least 2 sub-registers");
+
+ // Evaluate the sub-register lists to be zipped.
+ unsigned Length = ~0u;
+ SmallVector<SetTheory::RecSet, 4> Lists(Dim);
+ for (unsigned i = 0; i != Dim; ++i) {
+ ST.evaluate(SubRegs->getElement(i), Lists[i]);
+ Length = std::min(Length, unsigned(Lists[i].size()));
+ }
+
+ if (Length == 0)
+ return;
+
+ // Precompute some types.
+ Record *RegisterCl = Def->getRecords().getClass("Register");
+ RecTy *RegisterRecTy = new RecordRecTy(RegisterCl);
+ StringInit *BlankName = new StringInit("");
+
+ // Zip them up.
+ for (unsigned n = 0; n != Length; ++n) {
+ std::string Name;
+ Record *Proto = Lists[0][n];
+ std::vector<Init*> Tuple;
+ unsigned CostPerUse = 0;
+ for (unsigned i = 0; i != Dim; ++i) {
+ Record *Reg = Lists[i][n];
+ if (i) Name += '_';
+ Name += Reg->getName();
+ Tuple.push_back(new DefInit(Reg));
+ CostPerUse = std::max(CostPerUse,
+ unsigned(Reg->getValueAsInt("CostPerUse")));
+ }
+
+ // Create a new Record representing the synthesized register. This record
+ // is only for consumption by CodeGenRegister, it is not added to the
+ // RecordKeeper.
+ Record *NewReg = new Record(Name, Def->getLoc(), Def->getRecords());
+ Elts.insert(NewReg);
+
+ // Copy Proto super-classes.
+ for (unsigned i = 0, e = Proto->getSuperClasses().size(); i != e; ++i)
+ NewReg->addSuperClass(Proto->getSuperClasses()[i]);
+
+ // Copy Proto fields.
+ for (unsigned i = 0, e = Proto->getValues().size(); i != e; ++i) {
+ RecordVal RV = Proto->getValues()[i];
+
+ // Replace the sub-register list with Tuple.
+ if (RV.getName() == "SubRegs")
+ RV.setValue(new ListInit(Tuple, RegisterRecTy));
+
+ // Provide a blank AsmName. MC hacks are required anyway.
+ if (RV.getName() == "AsmName")
+ RV.setValue(BlankName);
+
+ // CostPerUse is aggregated from all Tuple members.
+ if (RV.getName() == "CostPerUse")
+ RV.setValue(new IntInit(CostPerUse));
+
+ // Copy fields from the RegisterTuples def.
+ if (RV.getName() == "SubRegIndices" ||
+ RV.getName() == "CompositeIndices") {
+ NewReg->addValue(*Def->getValue(RV.getName()));
+ continue;
+ }
+
+ // Some fields get their default uninitialized value.
+ if (RV.getName() == "DwarfNumbers" ||
+ RV.getName() == "DwarfAlias" ||
+ RV.getName() == "Aliases") {
+ if (const RecordVal *DefRV = RegisterCl->getValue(RV.getName()))
+ NewReg->addValue(*DefRV);
+ continue;
+ }
+
+ // Everything else is copied from Proto.
+ NewReg->addValue(RV);
+ }
+ }
+ }
+};
+}
+
//===----------------------------------------------------------------------===//
// CodeGenRegisterClass
//===----------------------------------------------------------------------===//
-CodeGenRegisterClass::CodeGenRegisterClass(Record *R) : TheDef(R) {
+CodeGenRegisterClass::CodeGenRegisterClass(CodeGenRegBank &RegBank, Record *R)
+ : TheDef(R) {
// Rename anonymous register classes.
if (R->getName().size() > 9 && R->getName()[9] == '.') {
static unsigned AnonCounter = 0;
@@ -149,13 +272,26 @@ CodeGenRegisterClass::CodeGenRegisterClass(Record *R) : TheDef(R) {
}
assert(!VTs.empty() && "RegisterClass must contain at least one ValueType!");
- std::vector<Record*> RegList = R->getValueAsListOfDefs("MemberList");
- for (unsigned i = 0, e = RegList.size(); i != e; ++i) {
- Record *Reg = RegList[i];
- if (!Reg->isSubClassOf("Register"))
- throw "Register Class member '" + Reg->getName() +
- "' does not derive from the Register class!";
- Elements.push_back(Reg);
+ // Default allocation order always contains all registers.
+ Elements = RegBank.getSets().expand(R);
+ for (unsigned i = 0, e = Elements->size(); i != e; ++i)
+ Members.insert(RegBank.getReg((*Elements)[i]));
+
+ // Alternative allocation orders may be subsets.
+ ListInit *Alts = R->getValueAsListInit("AltOrders");
+ AltOrders.resize(Alts->size());
+ SetTheory::RecSet Order;
+ for (unsigned i = 0, e = Alts->size(); i != e; ++i) {
+ RegBank.getSets().evaluate(Alts->getElement(i), Order);
+ AltOrders[i].append(Order.begin(), Order.end());
+ // Verify that all altorder members are regclass members.
+ while (!Order.empty()) {
+ CodeGenRegister *Reg = RegBank.getReg(Order.back());
+ Order.pop_back();
+ if (!contains(Reg))
+ throw TGError(R->getLoc(), " AltOrder register " + Reg->getName() +
+ " is not a class member");
+ }
}
// SubRegClasses is a list<dag> containing (RC, subregindex, ...) dags.
@@ -189,8 +325,28 @@ CodeGenRegisterClass::CodeGenRegisterClass(Record *R) : TheDef(R) {
SpillAlignment = R->getValueAsInt("Alignment");
CopyCost = R->getValueAsInt("CopyCost");
Allocatable = R->getValueAsBit("isAllocatable");
- MethodBodies = R->getValueAsCode("MethodBodies");
- MethodProtos = R->getValueAsCode("MethodProtos");
+ AltOrderSelect = R->getValueAsCode("AltOrderSelect");
+}
+
+bool CodeGenRegisterClass::contains(const CodeGenRegister *Reg) const {
+ return Members.count(Reg);
+}
+
+// Returns true if RC is a strict subclass.
+// RC is a sub-class of this class if it is a valid replacement for any
+// instruction operand where a register of this classis required. It must
+// satisfy these conditions:
+//
+// 1. All RC registers are also in this.
+// 2. The RC spill size must not be smaller than our spill size.
+// 3. RC spill alignment must be compatible with ours.
+//
+bool CodeGenRegisterClass::hasSubClass(const CodeGenRegisterClass *RC) const {
+ return SpillAlignment && RC->SpillAlignment % SpillAlignment == 0 &&
+ SpillSize <= RC->SpillSize &&
+ std::includes(Members.begin(), Members.end(),
+ RC->Members.begin(), RC->Members.end(),
+ CodeGenRegister::Less());
}
const std::string &CodeGenRegisterClass::getName() const {
@@ -202,6 +358,10 @@ const std::string &CodeGenRegisterClass::getName() const {
//===----------------------------------------------------------------------===//
CodeGenRegBank::CodeGenRegBank(RecordKeeper &Records) : Records(Records) {
+ // Configure register Sets to understand register classes and tuples.
+ Sets.addFieldExpander("RegisterClass", "MemberList");
+ Sets.addExpander("RegisterTuples", new TupleExpander());
+
// Read in the user-defined (named) sub-register indices.
// More indices will be synthesized later.
SubRegIndices = Records.getAllDerivedDefinitions("SubRegIndex");
@@ -214,18 +374,45 @@ CodeGenRegBank::CodeGenRegBank(RecordKeeper &Records) : Records(Records) {
Registers.reserve(Regs.size());
// Assign the enumeration values.
for (unsigned i = 0, e = Regs.size(); i != e; ++i)
- Registers.push_back(CodeGenRegister(Regs[i], i + 1));
+ getReg(Regs[i]);
+
+ // Expand tuples and number the new registers.
+ std::vector<Record*> Tups =
+ Records.getAllDerivedDefinitions("RegisterTuples");
+ for (unsigned i = 0, e = Tups.size(); i != e; ++i) {
+ const std::vector<Record*> *TupRegs = Sets.expand(Tups[i]);
+ for (unsigned j = 0, je = TupRegs->size(); j != je; ++j)
+ getReg((*TupRegs)[j]);
+ }
+
+ // Read in register class definitions.
+ std::vector<Record*> RCs = Records.getAllDerivedDefinitions("RegisterClass");
+ if (RCs.empty())
+ throw std::string("No 'RegisterClass' subclasses defined!");
+
+ RegClasses.reserve(RCs.size());
+ for (unsigned i = 0, e = RCs.size(); i != e; ++i)
+ RegClasses.push_back(CodeGenRegisterClass(*this, RCs[i]));
}
CodeGenRegister *CodeGenRegBank::getReg(Record *Def) {
- if (Def2Reg.empty())
- for (unsigned i = 0, e = Registers.size(); i != e; ++i)
- Def2Reg[Registers[i].TheDef] = &Registers[i];
-
- if (CodeGenRegister *Reg = Def2Reg[Def])
+ CodeGenRegister *&Reg = Def2Reg[Def];
+ if (Reg)
return Reg;
+ Reg = new CodeGenRegister(Def, Registers.size() + 1);
+ Registers.push_back(Reg);
+ return Reg;
+}
- throw TGError(Def->getLoc(), "Not a known Register!");
+CodeGenRegisterClass *CodeGenRegBank::getRegClass(Record *Def) {
+ if (Def2RC.empty())
+ for (unsigned i = 0, e = RegClasses.size(); i != e; ++i)
+ Def2RC[RegClasses[i].TheDef] = &RegClasses[i];
+
+ if (CodeGenRegisterClass *RC = Def2RC[Def])
+ return RC;
+
+ throw TGError(Def->getLoc(), "Not a known RegisterClass!");
}
Record *CodeGenRegBank::getCompositeSubRegIndex(Record *A, Record *B,
@@ -254,11 +441,11 @@ void CodeGenRegBank::computeComposites() {
// Precompute all sub-register maps. This will create Composite entries for
// all inferred sub-register indices.
for (unsigned i = 0, e = Registers.size(); i != e; ++i)
- Registers[i].getSubRegs(*this);
+ Registers[i]->getSubRegs(*this);
for (unsigned i = 0, e = Registers.size(); i != e; ++i) {
- CodeGenRegister *Reg1 = &Registers[i];
- const CodeGenRegister::SubRegMap &SRM1 = Reg1->getSubRegs(*this);
+ CodeGenRegister *Reg1 = Registers[i];
+ const CodeGenRegister::SubRegMap &SRM1 = Reg1->getSubRegs();
for (CodeGenRegister::SubRegMap::const_iterator i1 = SRM1.begin(),
e1 = SRM1.end(); i1 != e1; ++i1) {
Record *Idx1 = i1->first;
@@ -266,7 +453,7 @@ void CodeGenRegBank::computeComposites() {
// Ignore identity compositions.
if (Reg1 == Reg2)
continue;
- const CodeGenRegister::SubRegMap &SRM2 = Reg2->getSubRegs(*this);
+ const CodeGenRegister::SubRegMap &SRM2 = Reg2->getSubRegs();
// Try composing Idx1 with another SubRegIndex.
for (CodeGenRegister::SubRegMap::const_iterator i2 = SRM2.begin(),
e2 = SRM2.end(); i2 != e2; ++i2) {
@@ -306,7 +493,127 @@ void CodeGenRegBank::computeComposites() {
}
}
+// Compute sets of overlapping registers.
+//
+// The standard set is all super-registers and all sub-registers, but the
+// target description can add arbitrary overlapping registers via the 'Aliases'
+// field. This complicates things, but we can compute overlapping sets using
+// the following rules:
+//
+// 1. The relation overlap(A, B) is reflexive and symmetric but not transitive.
+//
+// 2. overlap(A, B) implies overlap(A, S) for all S in supers(B).
+//
+// Alternatively:
+//
+// overlap(A, B) iff there exists:
+// A' in { A, subregs(A) } and B' in { B, subregs(B) } such that:
+// A' = B' or A' in aliases(B') or B' in aliases(A').
+//
+// Here subregs(A) is the full flattened sub-register set returned by
+// A.getSubRegs() while aliases(A) is simply the special 'Aliases' field in the
+// description of register A.
+//
+// This also implies that registers with a common sub-register are considered
+// overlapping. This can happen when forming register pairs:
+//
+// P0 = (R0, R1)
+// P1 = (R1, R2)
+// P2 = (R2, R3)
+//
+// In this case, we will infer an overlap between P0 and P1 because of the
+// shared sub-register R1. There is no overlap between P0 and P2.
+//
+void CodeGenRegBank::
+computeOverlaps(std::map<const CodeGenRegister*, CodeGenRegister::Set> &Map) {
+ assert(Map.empty());
+
+ // Collect overlaps that don't follow from rule 2.
+ for (unsigned i = 0, e = Registers.size(); i != e; ++i) {
+ CodeGenRegister *Reg = Registers[i];
+ CodeGenRegister::Set &Overlaps = Map[Reg];
+
+ // Reg overlaps itself.
+ Overlaps.insert(Reg);
+
+ // All super-registers overlap.
+ const CodeGenRegister::SuperRegList &Supers = Reg->getSuperRegs();
+ Overlaps.insert(Supers.begin(), Supers.end());
+
+ // Form symmetrical relations from the special Aliases[] lists.
+ std::vector<Record*> RegList = Reg->TheDef->getValueAsListOfDefs("Aliases");
+ for (unsigned i2 = 0, e2 = RegList.size(); i2 != e2; ++i2) {
+ CodeGenRegister *Reg2 = getReg(RegList[i2]);
+ CodeGenRegister::Set &Overlaps2 = Map[Reg2];
+ const CodeGenRegister::SuperRegList &Supers2 = Reg2->getSuperRegs();
+ // Reg overlaps Reg2 which implies it overlaps supers(Reg2).
+ Overlaps.insert(Reg2);
+ Overlaps.insert(Supers2.begin(), Supers2.end());
+ Overlaps2.insert(Reg);
+ Overlaps2.insert(Supers.begin(), Supers.end());
+ }
+ }
+
+ // Apply rule 2. and inherit all sub-register overlaps.
+ for (unsigned i = 0, e = Registers.size(); i != e; ++i) {
+ CodeGenRegister *Reg = Registers[i];
+ CodeGenRegister::Set &Overlaps = Map[Reg];
+ const CodeGenRegister::SubRegMap &SRM = Reg->getSubRegs();
+ for (CodeGenRegister::SubRegMap::const_iterator i2 = SRM.begin(),
+ e2 = SRM.end(); i2 != e2; ++i2) {
+ CodeGenRegister::Set &Overlaps2 = Map[i2->second];
+ Overlaps.insert(Overlaps2.begin(), Overlaps2.end());
+ }
+ }
+}
+
void CodeGenRegBank::computeDerivedInfo() {
computeComposites();
}
+/// getRegisterClassForRegister - Find the register class that contains the
+/// specified physical register. If the register is not in a register class,
+/// return null. If the register is in multiple classes, and the classes have a
+/// superset-subset relationship and the same set of types, return the
+/// superclass. Otherwise return null.
+const CodeGenRegisterClass*
+CodeGenRegBank::getRegClassForRegister(Record *R) {
+ const CodeGenRegister *Reg = getReg(R);
+ const std::vector<CodeGenRegisterClass> &RCs = getRegClasses();
+ const CodeGenRegisterClass *FoundRC = 0;
+ for (unsigned i = 0, e = RCs.size(); i != e; ++i) {
+ const CodeGenRegisterClass &RC = RCs[i];
+ if (!RC.contains(Reg))
+ continue;
+
+ // If this is the first class that contains the register,
+ // make a note of it and go on to the next class.
+ if (!FoundRC) {
+ FoundRC = &RC;
+ continue;
+ }
+
+ // If a register's classes have different types, return null.
+ if (RC.getValueTypes() != FoundRC->getValueTypes())
+ return 0;
+
+ // Check to see if the previously found class that contains
+ // the register is a subclass of the current class. If so,
+ // prefer the superclass.
+ if (RC.hasSubClass(FoundRC)) {
+ FoundRC = &RC;
+ continue;
+ }
+
+ // Check to see if the previously found class that contains
+ // the register is a superclass of the current class. If so,
+ // prefer the superclass.
+ if (FoundRC->hasSubClass(&RC))
+ continue;
+
+ // Multiple classes, and neither is a superclass of the other.
+ // Return null.
+ return 0;
+ }
+ return FoundRC;
+}
diff --git a/contrib/llvm/utils/TableGen/CodeGenRegisters.h b/contrib/llvm/utils/TableGen/CodeGenRegisters.h
index 09341f0..5edbf47 100644
--- a/contrib/llvm/utils/TableGen/CodeGenRegisters.h
+++ b/contrib/llvm/utils/TableGen/CodeGenRegisters.h
@@ -16,8 +16,11 @@
#define CODEGEN_REGISTERS_H
#include "Record.h"
+#include "SetTheory.h"
#include "llvm/CodeGen/ValueTypes.h"
+#include "llvm/ADT/ArrayRef.h"
#include "llvm/ADT/DenseMap.h"
+#include "llvm/ADT/SetVector.h"
#include <cstdlib>
#include <map>
#include <string>
@@ -49,16 +52,44 @@ namespace llvm {
return SubRegs;
}
+ // Add sub-registers to OSet following a pre-order defined by the .td file.
+ void addSubRegsPreOrder(SetVector<CodeGenRegister*> &OSet) const;
+
+ // List of super-registers in topological order, small to large.
+ typedef std::vector<CodeGenRegister*> SuperRegList;
+
+ // Get the list of super-registers.
+ // This is only valid after computeDerivedInfo has visited all registers.
+ const SuperRegList &getSuperRegs() const {
+ assert(SubRegsComplete && "Must precompute sub-registers");
+ return SuperRegs;
+ }
+
+ // Order CodeGenRegister pointers by EnumValue.
+ struct Less {
+ bool operator()(const CodeGenRegister *A,
+ const CodeGenRegister *B) const {
+ return A->EnumValue < B->EnumValue;
+ }
+ };
+
+ // Canonically ordered set.
+ typedef std::set<const CodeGenRegister*, Less> Set;
+
private:
bool SubRegsComplete;
SubRegMap SubRegs;
+ SuperRegList SuperRegs;
};
- struct CodeGenRegisterClass {
+ class CodeGenRegisterClass {
+ CodeGenRegister::Set Members;
+ const std::vector<Record*> *Elements;
+ std::vector<SmallVector<Record*, 16> > AltOrders;
+ public:
Record *TheDef;
std::string Namespace;
- std::vector<Record*> Elements;
std::vector<MVT::SimpleValueType> VTs;
unsigned SpillSize;
unsigned SpillAlignment;
@@ -66,7 +97,7 @@ namespace llvm {
bool Allocatable;
// Map SubRegIndex -> RegisterClass
DenseMap<Record*,Record*> SubRegClasses;
- std::string MethodProtos, MethodBodies;
+ std::string AltOrderSelect;
const std::string &getName() const;
const std::vector<MVT::SimpleValueType> &getValueTypes() const {return VTs;}
@@ -79,13 +110,10 @@ namespace llvm {
abort();
}
- bool containsRegister(Record *R) const {
- for (unsigned i = 0, e = Elements.size(); i != e; ++i)
- if (Elements[i] == R) return true;
- return false;
- }
+ // Return true if this this class contains the register.
+ bool contains(const CodeGenRegister*) const;
- // Returns true if RC is a strict subclass.
+ // Returns true if RC is a subclass.
// RC is a sub-class of this class if it is a valid replacement for any
// instruction operand where a register of this classis required. It must
// satisfy these conditions:
@@ -94,40 +122,38 @@ namespace llvm {
// 2. The RC spill size must not be smaller than our spill size.
// 3. RC spill alignment must be compatible with ours.
//
- bool hasSubClass(const CodeGenRegisterClass *RC) const {
-
- if (RC->Elements.size() > Elements.size() ||
- (SpillAlignment && RC->SpillAlignment % SpillAlignment) ||
- SpillSize > RC->SpillSize)
- return false;
-
- std::set<Record*> RegSet;
- for (unsigned i = 0, e = Elements.size(); i != e; ++i) {
- Record *Reg = Elements[i];
- RegSet.insert(Reg);
- }
-
- for (unsigned i = 0, e = RC->Elements.size(); i != e; ++i) {
- Record *Reg = RC->Elements[i];
- if (!RegSet.count(Reg))
- return false;
- }
-
- return true;
+ bool hasSubClass(const CodeGenRegisterClass *RC) const;
+
+ // Returns an ordered list of class members.
+ // The order of registers is the same as in the .td file.
+ // No = 0 is the default allocation order, No = 1 is the first alternative.
+ ArrayRef<Record*> getOrder(unsigned No = 0) const {
+ if (No == 0)
+ return *Elements;
+ else
+ return AltOrders[No - 1];
}
- CodeGenRegisterClass(Record *R);
+ // Return the total number of allocation orders available.
+ unsigned getNumOrders() const { return 1 + AltOrders.size(); }
+
+ CodeGenRegisterClass(CodeGenRegBank&, Record *R);
};
// CodeGenRegBank - Represent a target's registers and the relations between
// them.
class CodeGenRegBank {
RecordKeeper &Records;
+ SetTheory Sets;
+
std::vector<Record*> SubRegIndices;
unsigned NumNamedIndices;
- std::vector<CodeGenRegister> Registers;
+ std::vector<CodeGenRegister*> Registers;
DenseMap<Record*, CodeGenRegister*> Def2Reg;
+ std::vector<CodeGenRegisterClass> RegClasses;
+ DenseMap<Record*, CodeGenRegisterClass*> Def2RC;
+
// Composite SubRegIndex instances.
// Map (SubRegIndex, SubRegIndex) -> SubRegIndex.
typedef DenseMap<std::pair<Record*, Record*>, Record*> CompositeMap;
@@ -139,6 +165,8 @@ namespace llvm {
public:
CodeGenRegBank(RecordKeeper&);
+ SetTheory &getSets() { return Sets; }
+
// Sub-register indices. The first NumNamedIndices are defined by the user
// in the .td files. The rest are synthesized such that all sub-registers
// have a unique name.
@@ -151,13 +179,36 @@ namespace llvm {
// Find or create a sub-register index representing the A+B composition.
Record *getCompositeSubRegIndex(Record *A, Record *B, bool create = false);
- const std::vector<CodeGenRegister> &getRegisters() { return Registers; }
+ const std::vector<CodeGenRegister*> &getRegisters() { return Registers; }
// Find a register from its Record def.
CodeGenRegister *getReg(Record*);
+ const std::vector<CodeGenRegisterClass> &getRegClasses() {
+ return RegClasses;
+ }
+
+ // Find a register class from its def.
+ CodeGenRegisterClass *getRegClass(Record*);
+
+ /// getRegisterClassForRegister - Find the register class that contains the
+ /// specified physical register. If the register is not in a register
+ /// class, return null. If the register is in multiple classes, and the
+ /// classes have a superset-subset relationship and the same set of types,
+ /// return the superclass. Otherwise return null.
+ const CodeGenRegisterClass* getRegClassForRegister(Record *R);
+
// Computed derived records such as missing sub-register indices.
void computeDerivedInfo();
+
+ // Compute full overlap sets for every register. These sets include the
+ // rarely used aliases that are neither sub nor super-registers.
+ //
+ // Map[R1].count(R2) is reflexive and symmetric, but not transitive.
+ //
+ // If R1 is a sub-register of R2, Map[R1] is a subset of Map[R2].
+ void computeOverlaps(std::map<const CodeGenRegister*,
+ CodeGenRegister::Set> &Map);
};
}
diff --git a/contrib/llvm/utils/TableGen/CodeGenTarget.cpp b/contrib/llvm/utils/TableGen/CodeGenTarget.cpp
index a0c64ff..929791c 100644
--- a/contrib/llvm/utils/TableGen/CodeGenTarget.cpp
+++ b/contrib/llvm/utils/TableGen/CodeGenTarget.cpp
@@ -90,6 +90,7 @@ std::string llvm::getEnumName(MVT::SimpleValueType T) {
case MVT::Metadata: return "MVT::Metadata";
case MVT::iPTR: return "MVT::iPTR";
case MVT::iPTRAny: return "MVT::iPTRAny";
+ case MVT::untyped: return "MVT::untyped";
default: assert(0 && "ILLEGAL VALUE TYPE!"); return "";
}
}
@@ -163,40 +164,32 @@ CodeGenRegBank &CodeGenTarget::getRegBank() const {
return *RegBank;
}
-void CodeGenTarget::ReadRegisterClasses() const {
- std::vector<Record*> RegClasses =
- Records.getAllDerivedDefinitions("RegisterClass");
- if (RegClasses.empty())
- throw std::string("No 'RegisterClass' subclasses defined!");
-
- RegisterClasses.reserve(RegClasses.size());
- RegisterClasses.assign(RegClasses.begin(), RegClasses.end());
+void CodeGenTarget::ReadRegAltNameIndices() const {
+ RegAltNameIndices = Records.getAllDerivedDefinitions("RegAltNameIndex");
+ std::sort(RegAltNameIndices.begin(), RegAltNameIndices.end(), LessRecord());
}
/// getRegisterByName - If there is a register with the specific AsmName,
/// return it.
const CodeGenRegister *CodeGenTarget::getRegisterByName(StringRef Name) const {
- const std::vector<CodeGenRegister> &Regs = getRegBank().getRegisters();
- for (unsigned i = 0, e = Regs.size(); i != e; ++i) {
- const CodeGenRegister &Reg = Regs[i];
- if (Reg.TheDef->getValueAsString("AsmName") == Name)
- return &Reg;
- }
+ const std::vector<CodeGenRegister*> &Regs = getRegBank().getRegisters();
+ for (unsigned i = 0, e = Regs.size(); i != e; ++i)
+ if (Regs[i]->TheDef->getValueAsString("AsmName") == Name)
+ return Regs[i];
return 0;
}
std::vector<MVT::SimpleValueType> CodeGenTarget::
getRegisterVTs(Record *R) const {
+ const CodeGenRegister *Reg = getRegBank().getReg(R);
std::vector<MVT::SimpleValueType> Result;
const std::vector<CodeGenRegisterClass> &RCs = getRegisterClasses();
for (unsigned i = 0, e = RCs.size(); i != e; ++i) {
- const CodeGenRegisterClass &RC = RegisterClasses[i];
- for (unsigned ei = 0, ee = RC.Elements.size(); ei != ee; ++ei) {
- if (R == RC.Elements[ei]) {
- const std::vector<MVT::SimpleValueType> &InVTs = RC.getValueTypes();
- Result.insert(Result.end(), InVTs.begin(), InVTs.end());
- }
+ const CodeGenRegisterClass &RC = RCs[i];
+ if (RC.contains(Reg)) {
+ const std::vector<MVT::SimpleValueType> &InVTs = RC.getValueTypes();
+ Result.insert(Result.end(), InVTs.begin(), InVTs.end());
}
}
diff --git a/contrib/llvm/utils/TableGen/CodeGenTarget.h b/contrib/llvm/utils/TableGen/CodeGenTarget.h
index 1f1c34c..143daed 100644
--- a/contrib/llvm/utils/TableGen/CodeGenTarget.h
+++ b/contrib/llvm/utils/TableGen/CodeGenTarget.h
@@ -66,9 +66,9 @@ class CodeGenTarget {
mutable DenseMap<const Record*, CodeGenInstruction*> Instructions;
mutable CodeGenRegBank *RegBank;
- mutable std::vector<CodeGenRegisterClass> RegisterClasses;
+ mutable std::vector<Record*> RegAltNameIndices;
mutable std::vector<MVT::SimpleValueType> LegalValueTypes;
- void ReadRegisterClasses() const;
+ void ReadRegAltNameIndices() const;
void ReadInstructions() const;
void ReadLegalValueTypes() const;
@@ -98,80 +98,21 @@ public:
/// getRegBank - Return the register bank description.
CodeGenRegBank &getRegBank() const;
- const std::vector<CodeGenRegister> &getRegisters() const {
- return getRegBank().getRegisters();
- }
-
/// getRegisterByName - If there is a register with the specific AsmName,
/// return it.
const CodeGenRegister *getRegisterByName(StringRef Name) const;
- const std::vector<CodeGenRegisterClass> &getRegisterClasses() const {
- if (RegisterClasses.empty()) ReadRegisterClasses();
- return RegisterClasses;
+ const std::vector<Record*> &getRegAltNameIndices() const {
+ if (RegAltNameIndices.empty()) ReadRegAltNameIndices();
+ return RegAltNameIndices;
}
- const CodeGenRegisterClass &getRegisterClass(Record *R) const {
- const std::vector<CodeGenRegisterClass> &RC = getRegisterClasses();
- for (unsigned i = 0, e = RC.size(); i != e; ++i)
- if (RC[i].TheDef == R)
- return RC[i];
- assert(0 && "Didn't find the register class");
- abort();
+ const std::vector<CodeGenRegisterClass> &getRegisterClasses() const {
+ return getRegBank().getRegClasses();
}
- /// getRegisterClassForRegister - Find the register class that contains the
- /// specified physical register. If the register is not in a register
- /// class, return null. If the register is in multiple classes, and the
- /// classes have a superset-subset relationship and the same set of
- /// types, return the superclass. Otherwise return null.
- const CodeGenRegisterClass *getRegisterClassForRegister(Record *R) const {
- const std::vector<CodeGenRegisterClass> &RCs = getRegisterClasses();
- const CodeGenRegisterClass *FoundRC = 0;
- for (unsigned i = 0, e = RCs.size(); i != e; ++i) {
- const CodeGenRegisterClass &RC = RegisterClasses[i];
- for (unsigned ei = 0, ee = RC.Elements.size(); ei != ee; ++ei) {
- if (R != RC.Elements[ei])
- continue;
-
- // If a register's classes have different types, return null.
- if (FoundRC && RC.getValueTypes() != FoundRC->getValueTypes())
- return 0;
-
- // If this is the first class that contains the register,
- // make a note of it and go on to the next class.
- if (!FoundRC) {
- FoundRC = &RC;
- break;
- }
-
- std::vector<Record *> Elements(RC.Elements);
- std::vector<Record *> FoundElements(FoundRC->Elements);
- std::sort(Elements.begin(), Elements.end());
- std::sort(FoundElements.begin(), FoundElements.end());
-
- // Check to see if the previously found class that contains
- // the register is a subclass of the current class. If so,
- // prefer the superclass.
- if (std::includes(Elements.begin(), Elements.end(),
- FoundElements.begin(), FoundElements.end())) {
- FoundRC = &RC;
- break;
- }
-
- // Check to see if the previously found class that contains
- // the register is a superclass of the current class. If so,
- // prefer the superclass.
- if (std::includes(FoundElements.begin(), FoundElements.end(),
- Elements.begin(), Elements.end()))
- break;
-
- // Multiple classes, and neither is a superclass of the other.
- // Return null.
- return 0;
- }
- }
- return FoundRC;
+ const CodeGenRegisterClass &getRegisterClass(Record *R) const {
+ return *getRegBank().getRegClass(R);
}
/// getRegisterVTs - Find the union of all possible SimpleValueTypes for the
diff --git a/contrib/llvm/utils/TableGen/DAGISelMatcherGen.cpp b/contrib/llvm/utils/TableGen/DAGISelMatcherGen.cpp
index 402a239..c5897c7 100644
--- a/contrib/llvm/utils/TableGen/DAGISelMatcherGen.cpp
+++ b/contrib/llvm/utils/TableGen/DAGISelMatcherGen.cpp
@@ -25,12 +25,12 @@ static MVT::SimpleValueType getRegisterValueType(Record *R,
const CodeGenTarget &T) {
bool FoundRC = false;
MVT::SimpleValueType VT = MVT::Other;
+ const CodeGenRegister *Reg = T.getRegBank().getReg(R);
const std::vector<CodeGenRegisterClass> &RCs = T.getRegisterClasses();
- std::vector<Record*>::const_iterator Element;
for (unsigned rc = 0, e = RCs.size(); rc != e; ++rc) {
const CodeGenRegisterClass &RC = RCs[rc];
- if (!std::count(RC.Elements.begin(), RC.Elements.end(), R))
+ if (!RC.contains(Reg))
continue;
if (!FoundRC) {
@@ -93,10 +93,6 @@ namespace {
/// CurPredicate - As we emit matcher nodes, this points to the latest check
/// which should have future checks stuck into its Next position.
Matcher *CurPredicate;
-
- /// RegisterDefMap - A map of register record definitions to the
- /// corresponding target CodeGenRegister entry.
- DenseMap<const Record *, const CodeGenRegister *> RegisterDefMap;
public:
MatcherGen(const PatternToMatch &pattern, const CodeGenDAGPatterns &cgp);
@@ -165,12 +161,6 @@ MatcherGen::MatcherGen(const PatternToMatch &pattern,
// If there are types that are manifestly known, infer them.
InferPossibleTypes();
-
- // Populate the map from records to CodeGenRegister entries.
- const CodeGenTarget &CGT = CGP.getTargetInfo();
- const std::vector<CodeGenRegister> &Registers = CGT.getRegisters();
- for (unsigned i = 0, e = Registers.size(); i != e; ++i)
- RegisterDefMap[Registers[i].TheDef] = &Registers[i];
}
/// InferPossibleTypes - As we emit the pattern, we end up generating type
@@ -234,6 +224,7 @@ void MatcherGen::EmitLeafMatchCode(const TreePatternNode *N) {
Record *LeafRec = DI->getDef();
if (// Handle register references. Nothing to do here, they always match.
LeafRec->isSubClassOf("RegisterClass") ||
+ LeafRec->isSubClassOf("RegisterOperand") ||
LeafRec->isSubClassOf("PointerLikeRegClass") ||
LeafRec->isSubClassOf("SubRegIndex") ||
// Place holder for SRCVALUE nodes. Nothing to do here.
@@ -589,14 +580,16 @@ void MatcherGen::EmitResultLeafAsOperand(const TreePatternNode *N,
// If this is an explicit register reference, handle it.
if (DefInit *DI = dynamic_cast<DefInit*>(N->getLeafValue())) {
- if (DI->getDef()->isSubClassOf("Register")) {
- AddMatcher(new EmitRegisterMatcher(RegisterDefMap[DI->getDef()],
- N->getType(0)));
+ Record *Def = DI->getDef();
+ if (Def->isSubClassOf("Register")) {
+ const CodeGenRegister *Reg =
+ CGP.getTargetInfo().getRegBank().getReg(Def);
+ AddMatcher(new EmitRegisterMatcher(Reg, N->getType(0)));
ResultOps.push_back(NextRecordedOperandNo++);
return;
}
- if (DI->getDef()->getName() == "zero_reg") {
+ if (Def->getName() == "zero_reg") {
AddMatcher(new EmitRegisterMatcher(0, N->getType(0)));
ResultOps.push_back(NextRecordedOperandNo++);
return;
@@ -604,16 +597,18 @@ void MatcherGen::EmitResultLeafAsOperand(const TreePatternNode *N,
// Handle a reference to a register class. This is used
// in COPY_TO_SUBREG instructions.
- if (DI->getDef()->isSubClassOf("RegisterClass")) {
- std::string Value = getQualifiedName(DI->getDef()) + "RegClassID";
+ if (Def->isSubClassOf("RegisterOperand"))
+ Def = Def->getValueAsDef("RegClass");
+ if (Def->isSubClassOf("RegisterClass")) {
+ std::string Value = getQualifiedName(Def) + "RegClassID";
AddMatcher(new EmitStringIntegerMatcher(Value, MVT::i32));
ResultOps.push_back(NextRecordedOperandNo++);
return;
}
// Handle a subregister index. This is used for INSERT_SUBREG etc.
- if (DI->getDef()->isSubClassOf("SubRegIndex")) {
- std::string Value = getQualifiedName(DI->getDef());
+ if (Def->isSubClassOf("SubRegIndex")) {
+ std::string Value = getQualifiedName(Def);
AddMatcher(new EmitStringIntegerMatcher(Value, MVT::i32));
ResultOps.push_back(NextRecordedOperandNo++);
return;
diff --git a/contrib/llvm/utils/TableGen/DisassemblerEmitter.cpp b/contrib/llvm/utils/TableGen/DisassemblerEmitter.cpp
index d68d3b0..07313d1 100644
--- a/contrib/llvm/utils/TableGen/DisassemblerEmitter.cpp
+++ b/contrib/llvm/utils/TableGen/DisassemblerEmitter.cpp
@@ -9,6 +9,7 @@
#include "DisassemblerEmitter.h"
#include "CodeGenTarget.h"
+#include "Error.h"
#include "Record.h"
#include "X86DisassemblerTables.h"
#include "X86RecognizableInstr.h"
diff --git a/contrib/llvm/utils/TableGen/EDEmitter.cpp b/contrib/llvm/utils/TableGen/EDEmitter.cpp
index daf9617..2f9814a 100644
--- a/contrib/llvm/utils/TableGen/EDEmitter.cpp
+++ b/contrib/llvm/utils/TableGen/EDEmitter.cpp
@@ -588,7 +588,11 @@ static int ARMFlagFromOpName(LiteralConstantEmitter *type,
IMM("imm0_31");
IMM("imm0_31_m1");
IMM("nModImm");
+ IMM("imm0_7");
+ IMM("imm0_15");
+ IMM("imm0_255");
IMM("imm0_4095");
+ IMM("imm0_65535");
IMM("jt2block_operand");
IMM("t_imm_s4");
IMM("pclabel");
@@ -652,12 +656,12 @@ static int ARMFlagFromOpName(LiteralConstantEmitter *type,
MISC("t2am_imm8s4_offset", "kOperandTypeThumb2AddrModeImm8s4Offset");
// R, I
MISC("tb_addrmode", "kOperandTypeARMTBAddrMode"); // I
- MISC("t_addrmode_rrs1", "kOperandTypeThumbAddrModeRegS"); // R, R
- MISC("t_addrmode_rrs2", "kOperandTypeThumbAddrModeRegS"); // R, R
- MISC("t_addrmode_rrs4", "kOperandTypeThumbAddrModeRegS"); // R, R
- MISC("t_addrmode_is1", "kOperandTypeThumbAddrModeImmS"); // R, I
- MISC("t_addrmode_is2", "kOperandTypeThumbAddrModeImmS"); // R, I
- MISC("t_addrmode_is4", "kOperandTypeThumbAddrModeImmS"); // R, I
+ MISC("t_addrmode_rrs1", "kOperandTypeThumbAddrModeRegS1"); // R, R
+ MISC("t_addrmode_rrs2", "kOperandTypeThumbAddrModeRegS2"); // R, R
+ MISC("t_addrmode_rrs4", "kOperandTypeThumbAddrModeRegS4"); // R, R
+ MISC("t_addrmode_is1", "kOperandTypeThumbAddrModeImmS1"); // R, I
+ MISC("t_addrmode_is2", "kOperandTypeThumbAddrModeImmS2"); // R, I
+ MISC("t_addrmode_is4", "kOperandTypeThumbAddrModeImmS4"); // R, I
MISC("t_addrmode_rr", "kOperandTypeThumbAddrModeRR"); // R, R
MISC("t_addrmode_sp", "kOperandTypeThumbAddrModeSP"); // R, I
MISC("t_addrmode_pc", "kOperandTypeThumbAddrModePC"); // R, I
@@ -665,14 +669,9 @@ static int ARMFlagFromOpName(LiteralConstantEmitter *type,
return 1;
}
-#undef SOREG
-#undef SOIMM
-#undef PRED
#undef REG
#undef MEM
-#undef LEA
-#undef IMM
-#undef PCR
+#undef MISC
#undef SET
@@ -773,6 +772,11 @@ static void populateInstInfo(CompoundConstantEmitter &infoArray,
for (index = 0; index < numInstructions; ++index) {
const CodeGenInstruction& inst = *numberedInstructions[index];
+ // We don't need to do anything for pseudo-instructions, as we'll never
+ // see them here. We'll only see real instructions.
+ if (inst.isPseudo)
+ continue;
+
CompoundConstantEmitter *infoStruct = new CompoundConstantEmitter;
infoArray.addEntry(infoStruct);
@@ -868,8 +872,12 @@ static void emitCommonEnums(raw_ostream &o, unsigned int &i) {
operandTypes.addEntry("kOperandTypeARMSPRRegisterList");
operandTypes.addEntry("kOperandTypeARMTBAddrMode");
operandTypes.addEntry("kOperandTypeThumbITMask");
- operandTypes.addEntry("kOperandTypeThumbAddrModeRegS");
- operandTypes.addEntry("kOperandTypeThumbAddrModeImmS");
+ operandTypes.addEntry("kOperandTypeThumbAddrModeImmS1");
+ operandTypes.addEntry("kOperandTypeThumbAddrModeImmS2");
+ operandTypes.addEntry("kOperandTypeThumbAddrModeImmS4");
+ operandTypes.addEntry("kOperandTypeThumbAddrModeRegS1");
+ operandTypes.addEntry("kOperandTypeThumbAddrModeRegS2");
+ operandTypes.addEntry("kOperandTypeThumbAddrModeRegS4");
operandTypes.addEntry("kOperandTypeThumbAddrModeRR");
operandTypes.addEntry("kOperandTypeThumbAddrModeSP");
operandTypes.addEntry("kOperandTypeThumbAddrModePC");
diff --git a/contrib/llvm/utils/TableGen/Error.cpp b/contrib/llvm/utils/TableGen/Error.cpp
new file mode 100644
index 0000000..3f6cda8
--- /dev/null
+++ b/contrib/llvm/utils/TableGen/Error.cpp
@@ -0,0 +1,39 @@
+//===- Error.cpp - tblgen error handling helper routines --------*- C++ -*-===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+//
+// This file contains error handling helper routines to pretty-print diagnostic
+// messages from tblgen.
+//
+//===----------------------------------------------------------------------===//
+
+#include "Error.h"
+#include "llvm/ADT/Twine.h"
+#include "llvm/Support/raw_ostream.h"
+
+namespace llvm {
+
+SourceMgr SrcMgr;
+
+void PrintError(SMLoc ErrorLoc, const Twine &Msg) {
+ SrcMgr.PrintMessage(ErrorLoc, Msg, "error");
+}
+
+void PrintError(const char *Loc, const Twine &Msg) {
+ SrcMgr.PrintMessage(SMLoc::getFromPointer(Loc), Msg, "error");
+}
+
+void PrintError(const Twine &Msg) {
+ errs() << "error:" << Msg << "\n";
+}
+
+void PrintError(const TGError &Error) {
+ PrintError(Error.getLoc(), Error.getMessage());
+}
+
+} // end namespace llvm
diff --git a/contrib/llvm/utils/TableGen/Error.h b/contrib/llvm/utils/TableGen/Error.h
new file mode 100644
index 0000000..b3a0146
--- /dev/null
+++ b/contrib/llvm/utils/TableGen/Error.h
@@ -0,0 +1,43 @@
+//===- Error.h - tblgen error handling helper routines ----------*- C++ -*-===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+//
+// This file contains error handling helper routines to pretty-print diagnostic
+// messages from tblgen.
+//
+//===----------------------------------------------------------------------===//
+
+#ifndef ERROR_H
+#define ERROR_H
+
+#include "llvm/Support/SourceMgr.h"
+
+namespace llvm {
+
+class TGError {
+ SMLoc Loc;
+ std::string Message;
+public:
+ TGError(SMLoc loc, const std::string &message) : Loc(loc), Message(message) {}
+
+ SMLoc getLoc() const { return Loc; }
+ const std::string &getMessage() const { return Message; }
+};
+
+void PrintError(SMLoc ErrorLoc, const Twine &Msg);
+void PrintError(const char *Loc, const Twine &Msg);
+void PrintError(const Twine &Msg);
+void PrintError(const TGError &Error);
+
+
+extern SourceMgr SrcMgr;
+
+
+} // end namespace "llvm"
+
+#endif
diff --git a/contrib/llvm/utils/TableGen/FastISelEmitter.cpp b/contrib/llvm/utils/TableGen/FastISelEmitter.cpp
index 78ac556..f54e8df 100644
--- a/contrib/llvm/utils/TableGen/FastISelEmitter.cpp
+++ b/contrib/llvm/utils/TableGen/FastISelEmitter.cpp
@@ -18,6 +18,7 @@
//===----------------------------------------------------------------------===//
#include "FastISelEmitter.h"
+#include "Error.h"
#include "Record.h"
#include "llvm/ADT/SmallString.h"
#include "llvm/ADT/VectorExtras.h"
@@ -247,10 +248,12 @@ struct OperandsSignature {
// For now, the only other thing we accept is register operands.
const CodeGenRegisterClass *RC = 0;
+ if (OpLeafRec->isSubClassOf("RegisterOperand"))
+ OpLeafRec = OpLeafRec->getValueAsDef("RegClass");
if (OpLeafRec->isSubClassOf("RegisterClass"))
RC = &Target.getRegisterClass(OpLeafRec);
else if (OpLeafRec->isSubClassOf("Register"))
- RC = Target.getRegisterClassForRegister(OpLeafRec);
+ RC = Target.getRegBank().getRegClassForRegister(OpLeafRec);
else
return false;
@@ -406,15 +409,7 @@ static std::string PhyRegForNode(TreePatternNode *Op,
PhysReg += static_cast<StringInit*>(OpLeafRec->getValue( \
"Namespace")->getValue())->getValue();
PhysReg += "::";
-
- std::vector<CodeGenRegister> Regs = Target.getRegisters();
- for (unsigned i = 0; i < Regs.size(); ++i) {
- if (Regs[i].TheDef == OpLeafRec) {
- PhysReg += Regs[i].getName();
- break;
- }
- }
-
+ PhysReg += Target.getRegBank().getReg(OpLeafRec)->getName();
return PhysReg;
}
@@ -461,6 +456,8 @@ void FastISelMap::collectPatterns(CodeGenDAGPatterns &CGP) {
std::string SubRegNo;
if (Op->getName() != "EXTRACT_SUBREG") {
Record *Op0Rec = II.Operands[0].Rec;
+ if (Op0Rec->isSubClassOf("RegisterOperand"))
+ Op0Rec = Op0Rec->getValueAsDef("RegClass");
if (!Op0Rec->isSubClassOf("RegisterClass"))
continue;
DstRC = &Target.getRegisterClass(Op0Rec);
diff --git a/contrib/llvm/utils/TableGen/FixedLenDecoderEmitter.cpp b/contrib/llvm/utils/TableGen/FixedLenDecoderEmitter.cpp
index 9312fe8..c9dcb01 100644
--- a/contrib/llvm/utils/TableGen/FixedLenDecoderEmitter.cpp
+++ b/contrib/llvm/utils/TableGen/FixedLenDecoderEmitter.cpp
@@ -1225,14 +1225,14 @@ bool FixedLenDecoderEmitter::populateInstruction(const CodeGenInstruction &CGI,
//
// This also removes pseudo instructions from considerations of disassembly,
// which is a better design and less fragile than the name matchings.
- BitsInit &Bits = getBitsField(Def, "Inst");
- if (Bits.allInComplete()) return false;
-
// Ignore "asm parser only" instructions.
if (Def.getValueAsBit("isAsmParserOnly") ||
Def.getValueAsBit("isCodeGenOnly"))
return false;
+ BitsInit &Bits = getBitsField(Def, "Inst");
+ if (Bits.allInComplete()) return false;
+
std::vector<OperandInfo> InsnOperands;
// If the instruction has specified a custom decoding hook, use that instead
@@ -1305,8 +1305,10 @@ bool FixedLenDecoderEmitter::populateInstruction(const CodeGenInstruction &CGI,
RecordRecTy *Type = dynamic_cast<RecordRecTy*>(TI->getType());
Record *TypeRecord = Type->getRecord();
bool isReg = false;
+ if (TypeRecord->isSubClassOf("RegisterOperand"))
+ TypeRecord = TypeRecord->getValueAsDef("RegClass");
if (TypeRecord->isSubClassOf("RegisterClass")) {
- Decoder = "Decode" + Type->getRecord()->getName() + "RegisterClass";
+ Decoder = "Decode" + TypeRecord->getName() + "RegisterClass";
isReg = true;
}
@@ -1352,7 +1354,8 @@ bool FixedLenDecoderEmitter::populateInstruction(const CodeGenInstruction &CGI,
void FixedLenDecoderEmitter::populateInstructions() {
for (unsigned i = 0, e = NumberedInstructions.size(); i < e; ++i) {
Record *R = NumberedInstructions[i]->TheDef;
- if (R->getValueAsString("Namespace") == "TargetOpcode")
+ if (R->getValueAsString("Namespace") == "TargetOpcode" ||
+ R->getValueAsBit("isPseudo"))
continue;
if (populateInstruction(*NumberedInstructions[i], i))
diff --git a/contrib/llvm/utils/TableGen/InstrInfoEmitter.cpp b/contrib/llvm/utils/TableGen/InstrInfoEmitter.cpp
index 67cce0e..5ebaf17 100644
--- a/contrib/llvm/utils/TableGen/InstrInfoEmitter.cpp
+++ b/contrib/llvm/utils/TableGen/InstrInfoEmitter.cpp
@@ -27,14 +27,6 @@ static void PrintDefList(const std::vector<Record*> &Uses,
OS << "0 };\n";
}
-static void PrintBarriers(std::vector<Record*> &Barriers,
- unsigned Num, raw_ostream &OS) {
- OS << "static const TargetRegisterClass* Barriers" << Num << "[] = { ";
- for (unsigned i = 0, e = Barriers.size(); i != e; ++i)
- OS << "&" << getQualifiedName(Barriers[i]) << "RegClass, ";
- OS << "NULL };\n";
-}
-
//===----------------------------------------------------------------------===//
// Instruction Itinerary Information.
//===----------------------------------------------------------------------===//
@@ -43,10 +35,10 @@ void InstrInfoEmitter::GatherItinClasses() {
std::vector<Record*> DefList =
Records.getAllDerivedDefinitions("InstrItinClass");
std::sort(DefList.begin(), DefList.end(), LessRecord());
-
+
for (unsigned i = 0, N = DefList.size(); i < N; i++)
ItinClassMap[DefList[i]->getName()] = i;
-}
+}
unsigned InstrInfoEmitter::getItinClassNumber(const Record *InstRec) {
return ItinClassMap[InstRec->getValueAsDef("Itinerary")->getName()];
@@ -59,7 +51,7 @@ unsigned InstrInfoEmitter::getItinClassNumber(const Record *InstRec) {
std::vector<std::string>
InstrInfoEmitter::GetOperandInfo(const CodeGenInstruction &Inst) {
std::vector<std::string> Result;
-
+
for (unsigned i = 0, e = Inst.Operands.size(); i != e; ++i) {
// Handle aggregate operands and normal operands the same way by expanding
// either case into a list of operands for this op.
@@ -70,7 +62,7 @@ InstrInfoEmitter::GetOperandInfo(const CodeGenInstruction &Inst) {
// operand, which has a single operand, but no declared class for the
// operand.
DagInit *MIOI = Inst.Operands[i].MIOperandInfo;
-
+
if (!MIOI || MIOI->getNumArgs() == 0) {
// Single, anonymous, operand.
OperandList.push_back(Inst.Operands[i]);
@@ -86,7 +78,9 @@ InstrInfoEmitter::GetOperandInfo(const CodeGenInstruction &Inst) {
for (unsigned j = 0, e = OperandList.size(); j != e; ++j) {
Record *OpR = OperandList[j].Rec;
std::string Res;
-
+
+ if (OpR->isSubClassOf("RegisterOperand"))
+ OpR = OpR->getValueAsDef("RegClass");
if (OpR->isSubClassOf("RegisterClass"))
Res += getQualifiedName(OpR) + "RegClassID, ";
else if (OpR->isSubClassOf("PointerLikeRegClass"))
@@ -94,39 +88,44 @@ InstrInfoEmitter::GetOperandInfo(const CodeGenInstruction &Inst) {
else
// -1 means the operand does not have a fixed register class.
Res += "-1, ";
-
+
// Fill in applicable flags.
Res += "0";
-
+
// Ptr value whose register class is resolved via callback.
if (OpR->isSubClassOf("PointerLikeRegClass"))
- Res += "|(1<<TOI::LookupPtrRegClass)";
+ Res += "|(1<<MCOI::LookupPtrRegClass)";
// Predicate operands. Check to see if the original unexpanded operand
// was of type PredicateOperand.
if (Inst.Operands[i].Rec->isSubClassOf("PredicateOperand"))
- Res += "|(1<<TOI::Predicate)";
-
+ Res += "|(1<<MCOI::Predicate)";
+
// Optional def operands. Check to see if the original unexpanded operand
// was of type OptionalDefOperand.
if (Inst.Operands[i].Rec->isSubClassOf("OptionalDefOperand"))
- Res += "|(1<<TOI::OptionalDef)";
+ Res += "|(1<<MCOI::OptionalDef)";
// Fill in constraint info.
Res += ", ";
-
+
const CGIOperandList::ConstraintInfo &Constraint =
Inst.Operands[i].Constraints[j];
if (Constraint.isNone())
Res += "0";
else if (Constraint.isEarlyClobber())
- Res += "(1 << TOI::EARLY_CLOBBER)";
+ Res += "(1 << MCOI::EARLY_CLOBBER)";
else {
assert(Constraint.isTied());
Res += "((" + utostr(Constraint.getTiedOperand()) +
- " << 16) | (1 << TOI::TIED_TO))";
+ " << 16) | (1 << MCOI::TIED_TO))";
}
-
+
+ // Fill in operand type.
+ Res += ", MCOI::";
+ assert(!Inst.Operands[i].OperandType.empty() && "Invalid operand type.");
+ Res += Inst.Operands[i].OperandType;
+
Result.push_back(Res);
}
}
@@ -134,12 +133,12 @@ InstrInfoEmitter::GetOperandInfo(const CodeGenInstruction &Inst) {
return Result;
}
-void InstrInfoEmitter::EmitOperandInfo(raw_ostream &OS,
+void InstrInfoEmitter::EmitOperandInfo(raw_ostream &OS,
OperandInfoMapTy &OperandInfoIDs) {
// ID #0 is for no operand info.
unsigned OperandListNum = 0;
OperandInfoIDs[std::vector<std::string>()] = ++OperandListNum;
-
+
OS << "\n";
const CodeGenTarget &Target = CDP.getTargetInfo();
for (CodeGenTarget::inst_iterator II = Target.inst_begin(),
@@ -147,65 +146,40 @@ void InstrInfoEmitter::EmitOperandInfo(raw_ostream &OS,
std::vector<std::string> OperandInfo = GetOperandInfo(**II);
unsigned &N = OperandInfoIDs[OperandInfo];
if (N != 0) continue;
-
+
N = ++OperandListNum;
- OS << "static const TargetOperandInfo OperandInfo" << N << "[] = { ";
+ OS << "static const MCOperandInfo OperandInfo" << N << "[] = { ";
for (unsigned i = 0, e = OperandInfo.size(); i != e; ++i)
OS << "{ " << OperandInfo[i] << " }, ";
OS << "};\n";
}
}
-void InstrInfoEmitter::DetectRegisterClassBarriers(std::vector<Record*> &Defs,
- const std::vector<CodeGenRegisterClass> &RCs,
- std::vector<Record*> &Barriers) {
- std::set<Record*> DefSet;
- unsigned NumDefs = Defs.size();
- for (unsigned i = 0; i < NumDefs; ++i)
- DefSet.insert(Defs[i]);
-
- for (unsigned i = 0, e = RCs.size(); i != e; ++i) {
- const CodeGenRegisterClass &RC = RCs[i];
- unsigned NumRegs = RC.Elements.size();
- if (NumRegs > NumDefs)
- continue; // Can't possibly clobber this RC.
-
- bool Clobber = true;
- for (unsigned j = 0; j < NumRegs; ++j) {
- Record *Reg = RC.Elements[j];
- if (!DefSet.count(Reg)) {
- Clobber = false;
- break;
- }
- }
- if (Clobber)
- Barriers.push_back(RC.TheDef);
- }
-}
-
//===----------------------------------------------------------------------===//
// Main Output.
//===----------------------------------------------------------------------===//
// run - Emit the main instruction description records for the target...
void InstrInfoEmitter::run(raw_ostream &OS) {
+ emitEnums(OS);
+
GatherItinClasses();
EmitSourceFileHeader("Target Instruction Descriptors", OS);
+
+ OS << "\n#ifdef GET_INSTRINFO_MC_DESC\n";
+ OS << "#undef GET_INSTRINFO_MC_DESC\n";
+
OS << "namespace llvm {\n\n";
CodeGenTarget &Target = CDP.getTargetInfo();
const std::string &TargetName = Target.getName();
Record *InstrInfo = Target.getInstructionSet();
- const std::vector<CodeGenRegisterClass> &RCs = Target.getRegisterClasses();
// Keep track of all of the def lists we have emitted already.
std::map<std::vector<Record*>, unsigned> EmittedLists;
unsigned ListNumber = 0;
- std::map<std::vector<Record*>, unsigned> EmittedBarriers;
- unsigned BarrierNumber = 0;
- std::map<Record*, unsigned> BarriersMap;
-
+
// Emit all of the instruction's implicit uses and defs.
for (CodeGenTarget::inst_iterator II = Target.inst_begin(),
E = Target.inst_end(); II != E; ++II) {
@@ -217,42 +191,67 @@ void InstrInfoEmitter::run(raw_ostream &OS) {
}
std::vector<Record*> Defs = Inst->getValueAsListOfDefs("Defs");
if (!Defs.empty()) {
- std::vector<Record*> RCBarriers;
- DetectRegisterClassBarriers(Defs, RCs, RCBarriers);
- if (!RCBarriers.empty()) {
- unsigned &IB = EmittedBarriers[RCBarriers];
- if (!IB) PrintBarriers(RCBarriers, IB = ++BarrierNumber, OS);
- BarriersMap.insert(std::make_pair(Inst, IB));
- }
-
unsigned &IL = EmittedLists[Defs];
if (!IL) PrintDefList(Defs, IL = ++ListNumber, OS);
}
}
OperandInfoMapTy OperandInfoIDs;
-
+
// Emit all of the operand info records.
EmitOperandInfo(OS, OperandInfoIDs);
-
- // Emit all of the TargetInstrDesc records in their ENUM ordering.
+
+ // Emit all of the MCInstrDesc records in their ENUM ordering.
//
- OS << "\nstatic const TargetInstrDesc " << TargetName
- << "Insts[] = {\n";
+ OS << "\nMCInstrDesc " << TargetName << "Insts[] = {\n";
const std::vector<const CodeGenInstruction*> &NumberedInstructions =
Target.getInstructionsByEnumValue();
for (unsigned i = 0, e = NumberedInstructions.size(); i != e; ++i)
emitRecord(*NumberedInstructions[i], i, InstrInfo, EmittedLists,
- BarriersMap, OperandInfoIDs, OS);
- OS << "};\n";
+ OperandInfoIDs, OS);
+ OS << "};\n\n";
+
+ // MCInstrInfo initialization routine.
+ OS << "static inline void Init" << TargetName
+ << "MCInstrInfo(MCInstrInfo *II) {\n";
+ OS << " II->InitMCInstrInfo(" << TargetName << "Insts, "
+ << NumberedInstructions.size() << ");\n}\n\n";
+
+ OS << "} // End llvm namespace \n";
+
+ OS << "#endif // GET_INSTRINFO_MC_DESC\n\n";
+
+ // Create a TargetInstrInfo subclass to hide the MC layer initialization.
+ OS << "\n#ifdef GET_INSTRINFO_HEADER\n";
+ OS << "#undef GET_INSTRINFO_HEADER\n";
+
+ std::string ClassName = TargetName + "GenInstrInfo";
+ OS << "namespace llvm {\n";
+ OS << "struct " << ClassName << " : public TargetInstrInfoImpl {\n"
+ << " explicit " << ClassName << "(int SO = -1, int DO = -1);\n"
+ << "};\n";
+ OS << "} // End llvm namespace \n";
+
+ OS << "#endif // GET_INSTRINFO_HEADER\n\n";
+
+ OS << "\n#ifdef GET_INSTRINFO_CTOR\n";
+ OS << "#undef GET_INSTRINFO_CTOR\n";
+
+ OS << "namespace llvm {\n";
+ OS << "extern MCInstrDesc " << TargetName << "Insts[];\n";
+ OS << ClassName << "::" << ClassName << "(int SO, int DO)\n"
+ << " : TargetInstrInfoImpl(SO, DO) {\n"
+ << " InitMCInstrInfo(" << TargetName << "Insts, "
+ << NumberedInstructions.size() << ");\n}\n";
OS << "} // End llvm namespace \n";
+
+ OS << "#endif // GET_INSTRINFO_CTOR\n\n";
}
void InstrInfoEmitter::emitRecord(const CodeGenInstruction &Inst, unsigned Num,
Record *InstrInfo,
std::map<std::vector<Record*>, unsigned> &EmittedLists,
- std::map<Record*, unsigned> &BarriersMap,
const OperandInfoMapTy &OpInfo,
raw_ostream &OS) {
int MinOperands = 0;
@@ -263,35 +262,37 @@ void InstrInfoEmitter::emitRecord(const CodeGenInstruction &Inst, unsigned Num,
OS << " { ";
OS << Num << ",\t" << MinOperands << ",\t"
- << Inst.Operands.NumDefs << ",\t" << getItinClassNumber(Inst.TheDef)
- << ",\t\"" << Inst.TheDef->getName() << "\", 0";
+ << Inst.Operands.NumDefs << ",\t"
+ << getItinClassNumber(Inst.TheDef) << ",\t"
+ << Inst.TheDef->getValueAsInt("Size") << ",\t\""
+ << Inst.TheDef->getName() << "\", 0";
// Emit all of the target indepedent flags...
- if (Inst.isReturn) OS << "|(1<<TID::Return)";
- if (Inst.isBranch) OS << "|(1<<TID::Branch)";
- if (Inst.isIndirectBranch) OS << "|(1<<TID::IndirectBranch)";
- if (Inst.isCompare) OS << "|(1<<TID::Compare)";
- if (Inst.isMoveImm) OS << "|(1<<TID::MoveImm)";
- if (Inst.isBitcast) OS << "|(1<<TID::Bitcast)";
- if (Inst.isBarrier) OS << "|(1<<TID::Barrier)";
- if (Inst.hasDelaySlot) OS << "|(1<<TID::DelaySlot)";
- if (Inst.isCall) OS << "|(1<<TID::Call)";
- if (Inst.canFoldAsLoad) OS << "|(1<<TID::FoldableAsLoad)";
- if (Inst.mayLoad) OS << "|(1<<TID::MayLoad)";
- if (Inst.mayStore) OS << "|(1<<TID::MayStore)";
- if (Inst.isPredicable) OS << "|(1<<TID::Predicable)";
- if (Inst.isConvertibleToThreeAddress) OS << "|(1<<TID::ConvertibleTo3Addr)";
- if (Inst.isCommutable) OS << "|(1<<TID::Commutable)";
- if (Inst.isTerminator) OS << "|(1<<TID::Terminator)";
- if (Inst.isReMaterializable) OS << "|(1<<TID::Rematerializable)";
- if (Inst.isNotDuplicable) OS << "|(1<<TID::NotDuplicable)";
- if (Inst.Operands.hasOptionalDef) OS << "|(1<<TID::HasOptionalDef)";
- if (Inst.usesCustomInserter) OS << "|(1<<TID::UsesCustomInserter)";
- if (Inst.Operands.isVariadic)OS << "|(1<<TID::Variadic)";
- if (Inst.hasSideEffects) OS << "|(1<<TID::UnmodeledSideEffects)";
- if (Inst.isAsCheapAsAMove) OS << "|(1<<TID::CheapAsAMove)";
- if (Inst.hasExtraSrcRegAllocReq) OS << "|(1<<TID::ExtraSrcRegAllocReq)";
- if (Inst.hasExtraDefRegAllocReq) OS << "|(1<<TID::ExtraDefRegAllocReq)";
+ if (Inst.isReturn) OS << "|(1<<MCID::Return)";
+ if (Inst.isBranch) OS << "|(1<<MCID::Branch)";
+ if (Inst.isIndirectBranch) OS << "|(1<<MCID::IndirectBranch)";
+ if (Inst.isCompare) OS << "|(1<<MCID::Compare)";
+ if (Inst.isMoveImm) OS << "|(1<<MCID::MoveImm)";
+ if (Inst.isBitcast) OS << "|(1<<MCID::Bitcast)";
+ if (Inst.isBarrier) OS << "|(1<<MCID::Barrier)";
+ if (Inst.hasDelaySlot) OS << "|(1<<MCID::DelaySlot)";
+ if (Inst.isCall) OS << "|(1<<MCID::Call)";
+ if (Inst.canFoldAsLoad) OS << "|(1<<MCID::FoldableAsLoad)";
+ if (Inst.mayLoad) OS << "|(1<<MCID::MayLoad)";
+ if (Inst.mayStore) OS << "|(1<<MCID::MayStore)";
+ if (Inst.isPredicable) OS << "|(1<<MCID::Predicable)";
+ if (Inst.isConvertibleToThreeAddress) OS << "|(1<<MCID::ConvertibleTo3Addr)";
+ if (Inst.isCommutable) OS << "|(1<<MCID::Commutable)";
+ if (Inst.isTerminator) OS << "|(1<<MCID::Terminator)";
+ if (Inst.isReMaterializable) OS << "|(1<<MCID::Rematerializable)";
+ if (Inst.isNotDuplicable) OS << "|(1<<MCID::NotDuplicable)";
+ if (Inst.Operands.hasOptionalDef) OS << "|(1<<MCID::HasOptionalDef)";
+ if (Inst.usesCustomInserter) OS << "|(1<<MCID::UsesCustomInserter)";
+ if (Inst.Operands.isVariadic)OS << "|(1<<MCID::Variadic)";
+ if (Inst.hasSideEffects) OS << "|(1<<MCID::UnmodeledSideEffects)";
+ if (Inst.isAsCheapAsAMove) OS << "|(1<<MCID::CheapAsAMove)";
+ if (Inst.hasExtraSrcRegAllocReq) OS << "|(1<<MCID::ExtraSrcRegAllocReq)";
+ if (Inst.hasExtraDefRegAllocReq) OS << "|(1<<MCID::ExtraDefRegAllocReq)";
// Emit all of the target-specific flags...
BitsInit *TSF = Inst.TheDef->getValueAsBitsInit("TSFlags");
@@ -320,12 +321,6 @@ void InstrInfoEmitter::emitRecord(const CodeGenInstruction &Inst, unsigned Num,
else
OS << "ImplicitList" << EmittedLists[DefList] << ", ";
- std::map<Record*, unsigned>::iterator BI = BarriersMap.find(Inst.TheDef);
- if (BI == BarriersMap.end())
- OS << "NULL, ";
- else
- OS << "Barriers" << BI->second << ", ";
-
// Emit the operand info.
std::vector<std::string> OperandInfo = GetOperandInfo(Inst);
if (OperandInfo.empty())
@@ -335,3 +330,38 @@ void InstrInfoEmitter::emitRecord(const CodeGenInstruction &Inst, unsigned Num,
OS << " }, // Inst #" << Num << " = " << Inst.TheDef->getName() << "\n";
}
+
+// emitEnums - Print out enum values for all of the instructions.
+void InstrInfoEmitter::emitEnums(raw_ostream &OS) {
+ EmitSourceFileHeader("Target Instruction Enum Values", OS);
+
+ OS << "\n#ifdef GET_INSTRINFO_ENUM\n";
+ OS << "#undef GET_INSTRINFO_ENUM\n";
+
+ OS << "namespace llvm {\n\n";
+
+ CodeGenTarget Target(Records);
+
+ // We must emit the PHI opcode first...
+ std::string Namespace = Target.getInstNamespace();
+
+ if (Namespace.empty()) {
+ fprintf(stderr, "No instructions defined!\n");
+ exit(1);
+ }
+
+ const std::vector<const CodeGenInstruction*> &NumberedInstructions =
+ Target.getInstructionsByEnumValue();
+
+ OS << "namespace " << Namespace << " {\n";
+ OS << " enum {\n";
+ for (unsigned i = 0, e = NumberedInstructions.size(); i != e; ++i) {
+ OS << " " << NumberedInstructions[i]->TheDef->getName()
+ << "\t= " << i << ",\n";
+ }
+ OS << " INSTRUCTION_LIST_END = " << NumberedInstructions.size() << "\n";
+ OS << " };\n}\n";
+ OS << "} // End llvm namespace \n";
+
+ OS << "#endif // GET_INSTRINFO_ENUM\n\n";
+}
diff --git a/contrib/llvm/utils/TableGen/InstrInfoEmitter.h b/contrib/llvm/utils/TableGen/InstrInfoEmitter.h
index abb1c6b..165ce42 100644
--- a/contrib/llvm/utils/TableGen/InstrInfoEmitter.h
+++ b/contrib/llvm/utils/TableGen/InstrInfoEmitter.h
@@ -39,12 +39,12 @@ public:
void run(raw_ostream &OS);
private:
- typedef std::map<std::vector<std::string>, unsigned> OperandInfoMapTy;
-
+ void emitEnums(raw_ostream &OS);
+
+ typedef std::map<std::vector<std::string>, unsigned> OperandInfoMapTy;
void emitRecord(const CodeGenInstruction &Inst, unsigned Num,
Record *InstrInfo,
std::map<std::vector<Record*>, unsigned> &EL,
- std::map<Record*, unsigned> &BM,
const OperandInfoMapTy &OpInfo,
raw_ostream &OS);
@@ -55,10 +55,6 @@ private:
// Operand information.
void EmitOperandInfo(raw_ostream &OS, OperandInfoMapTy &OperandInfoIDs);
std::vector<std::string> GetOperandInfo(const CodeGenInstruction &Inst);
-
- void DetectRegisterClassBarriers(std::vector<Record*> &Defs,
- const std::vector<CodeGenRegisterClass> &RCs,
- std::vector<Record*> &Barriers);
};
} // End llvm namespace
diff --git a/contrib/llvm/utils/TableGen/IntrinsicEmitter.cpp b/contrib/llvm/utils/TableGen/IntrinsicEmitter.cpp
index 39eb3bd..e5e7cea 100644
--- a/contrib/llvm/utils/TableGen/IntrinsicEmitter.cpp
+++ b/contrib/llvm/utils/TableGen/IntrinsicEmitter.cpp
@@ -214,7 +214,7 @@ static void EmitTypeGenerate(raw_ostream &OS,
if (ArgTypes.size() == 1)
return EmitTypeGenerate(OS, ArgTypes.front(), ArgNo);
- OS << "StructType::get(Context, ";
+ OS << "StructType::get(";
for (std::vector<Record*>::const_iterator
I = ArgTypes.begin(), E = ArgTypes.end(); I != E; ++I) {
@@ -259,7 +259,7 @@ static void EmitTypeGenerate(raw_ostream &OS, const Record *ArgType,
} else if (VT == MVT::iPTRAny) {
// Make sure the user has passed us an argument type to overload. If not,
// treat it as an ordinary (not overloaded) intrinsic.
- OS << "(" << ArgNo << " < numTys) ? Tys[" << ArgNo
+ OS << "(" << ArgNo << " < Tys.size()) ? Tys[" << ArgNo
<< "] : PointerType::getUnqual(";
EmitTypeGenerate(OS, ArgType->getValueAsDef("ElTy"), ArgNo);
OS << ")";
diff --git a/contrib/llvm/utils/TableGen/LLVMCConfigurationEmitter.cpp b/contrib/llvm/utils/TableGen/LLVMCConfigurationEmitter.cpp
index 090faf5..cd0cbeb 100644
--- a/contrib/llvm/utils/TableGen/LLVMCConfigurationEmitter.cpp
+++ b/contrib/llvm/utils/TableGen/LLVMCConfigurationEmitter.cpp
@@ -2969,8 +2969,8 @@ void EmitHookDeclarations(const ToolDescriptions& ToolDescs,
for (HookInfoMap::const_iterator B = HookNames.begin(),
E = HookNames.end(); B != E; ++B) {
- const char* HookName = B->first();
- const HookInfo& Info = B->second;
+ StringRef HookName = B->first();
+ const HookInfo &Info = B->second;
O.indent(Indent1) << "std::string " << HookName << "(";
diff --git a/contrib/llvm/utils/TableGen/NeonEmitter.cpp b/contrib/llvm/utils/TableGen/NeonEmitter.cpp
index 23fdbde..ef977443 100644
--- a/contrib/llvm/utils/TableGen/NeonEmitter.cpp
+++ b/contrib/llvm/utils/TableGen/NeonEmitter.cpp
@@ -24,6 +24,7 @@
//===----------------------------------------------------------------------===//
#include "NeonEmitter.h"
+#include "Error.h"
#include "llvm/ADT/SmallString.h"
#include "llvm/ADT/SmallVector.h"
#include "llvm/ADT/StringExtras.h"
diff --git a/contrib/llvm/utils/TableGen/PseudoLoweringEmitter.cpp b/contrib/llvm/utils/TableGen/PseudoLoweringEmitter.cpp
new file mode 100644
index 0000000..db33c1f
--- /dev/null
+++ b/contrib/llvm/utils/TableGen/PseudoLoweringEmitter.cpp
@@ -0,0 +1,243 @@
+//===- PseudoLoweringEmitter.cpp - PseudoLowering Generator -----*- C++ -*-===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+#define DEBUG_TYPE "pseudo-lowering"
+#include "Error.h"
+#include "CodeGenInstruction.h"
+#include "PseudoLoweringEmitter.h"
+#include "Record.h"
+#include "llvm/ADT/IndexedMap.h"
+#include "llvm/ADT/StringMap.h"
+#include "llvm/Support/ErrorHandling.h"
+#include "llvm/Support/Debug.h"
+#include <vector>
+using namespace llvm;
+
+// FIXME: This pass currently can only expand a pseudo to a single instruction.
+// The pseudo expansion really should take a list of dags, not just
+// a single dag, so we can do fancier things.
+
+unsigned PseudoLoweringEmitter::
+addDagOperandMapping(Record *Rec, DagInit *Dag, CodeGenInstruction &Insn,
+ IndexedMap<OpData> &OperandMap, unsigned BaseIdx) {
+ unsigned OpsAdded = 0;
+ for (unsigned i = 0, e = Dag->getNumArgs(); i != e; ++i) {
+ if (DefInit *DI = dynamic_cast<DefInit*>(Dag->getArg(i))) {
+ // Physical register reference. Explicit check for the special case
+ // "zero_reg" definition.
+ if (DI->getDef()->isSubClassOf("Register") ||
+ DI->getDef()->getName() == "zero_reg") {
+ OperandMap[BaseIdx + i].Kind = OpData::Reg;
+ OperandMap[BaseIdx + i].Data.Reg = DI->getDef();
+ ++OpsAdded;
+ continue;
+ }
+
+ // Normal operands should always have the same type, or we have a
+ // problem.
+ // FIXME: We probably shouldn't ever get a non-zero BaseIdx here.
+ assert(BaseIdx == 0 && "Named subargument in pseudo expansion?!");
+ if (DI->getDef() != Insn.Operands[BaseIdx + i].Rec)
+ throw TGError(Rec->getLoc(),
+ "Pseudo operand type '" + DI->getDef()->getName() +
+ "' does not match expansion operand type '" +
+ Insn.Operands[BaseIdx + i].Rec->getName() + "'");
+ // Source operand maps to destination operand. The Data element
+ // will be filled in later, just set the Kind for now. Do it
+ // for each corresponding MachineInstr operand, not just the first.
+ for (unsigned I = 0, E = Insn.Operands[i].MINumOperands; I != E; ++I)
+ OperandMap[BaseIdx + i + I].Kind = OpData::Operand;
+ OpsAdded += Insn.Operands[i].MINumOperands;
+ } else if (IntInit *II = dynamic_cast<IntInit*>(Dag->getArg(i))) {
+ OperandMap[BaseIdx + i].Kind = OpData::Imm;
+ OperandMap[BaseIdx + i].Data.Imm = II->getValue();
+ ++OpsAdded;
+ } else if (DagInit *SubDag = dynamic_cast<DagInit*>(Dag->getArg(i))) {
+ // Just add the operands recursively. This is almost certainly
+ // a constant value for a complex operand (> 1 MI operand).
+ unsigned NewOps =
+ addDagOperandMapping(Rec, SubDag, Insn, OperandMap, BaseIdx + i);
+ OpsAdded += NewOps;
+ // Since we added more than one, we also need to adjust the base.
+ BaseIdx += NewOps - 1;
+ } else
+ assert(0 && "Unhandled pseudo-expansion argument type!");
+ }
+ return OpsAdded;
+}
+
+void PseudoLoweringEmitter::evaluateExpansion(Record *Rec) {
+ DEBUG(dbgs() << "Pseudo definition: " << Rec->getName() << "\n");
+
+ // Validate that the result pattern has the corrent number and types
+ // of arguments for the instruction it references.
+ DagInit *Dag = Rec->getValueAsDag("ResultInst");
+ assert(Dag && "Missing result instruction in pseudo expansion!");
+ DEBUG(dbgs() << " Result: " << *Dag << "\n");
+
+ DefInit *OpDef = dynamic_cast<DefInit*>(Dag->getOperator());
+ if (!OpDef)
+ throw TGError(Rec->getLoc(), Rec->getName() +
+ " has unexpected operator type!");
+ Record *Operator = OpDef->getDef();
+ if (!Operator->isSubClassOf("Instruction"))
+ throw TGError(Rec->getLoc(), "Pseudo result '" + Operator->getName() +
+ "' is not an instruction!");
+
+ CodeGenInstruction Insn(Operator);
+
+ if (Insn.isCodeGenOnly || Insn.isPseudo)
+ throw TGError(Rec->getLoc(), "Pseudo result '" + Operator->getName() +
+ "' cannot be another pseudo instruction!");
+
+ if (Insn.Operands.size() != Dag->getNumArgs())
+ throw TGError(Rec->getLoc(), "Pseudo result '" + Operator->getName() +
+ "' operand count mismatch");
+
+ IndexedMap<OpData> OperandMap;
+ OperandMap.grow(Insn.Operands.size());
+
+ addDagOperandMapping(Rec, Dag, Insn, OperandMap, 0);
+
+ // If there are more operands that weren't in the DAG, they have to
+ // be operands that have default values, or we have an error. Currently,
+ // PredicateOperand and OptionalDefOperand both have default values.
+
+
+ // Validate that each result pattern argument has a matching (by name)
+ // argument in the source instruction, in either the (outs) or (ins) list.
+ // Also check that the type of the arguments match.
+ //
+ // Record the mapping of the source to result arguments for use by
+ // the lowering emitter.
+ CodeGenInstruction SourceInsn(Rec);
+ StringMap<unsigned> SourceOperands;
+ for (unsigned i = 0, e = SourceInsn.Operands.size(); i != e; ++i)
+ SourceOperands[SourceInsn.Operands[i].Name] = i;
+
+ DEBUG(dbgs() << " Operand mapping:\n");
+ for (unsigned i = 0, e = Insn.Operands.size(); i != e; ++i) {
+ // We've already handled constant values. Just map instruction operands
+ // here.
+ if (OperandMap[Insn.Operands[i].MIOperandNo].Kind != OpData::Operand)
+ continue;
+ StringMap<unsigned>::iterator SourceOp =
+ SourceOperands.find(Dag->getArgName(i));
+ if (SourceOp == SourceOperands.end())
+ throw TGError(Rec->getLoc(),
+ "Pseudo output operand '" + Dag->getArgName(i) +
+ "' has no matching source operand.");
+ // Map the source operand to the destination operand index for each
+ // MachineInstr operand.
+ for (unsigned I = 0, E = Insn.Operands[i].MINumOperands; I != E; ++I)
+ OperandMap[Insn.Operands[i].MIOperandNo + I].Data.Operand =
+ SourceOp->getValue();
+
+ DEBUG(dbgs() << " " << SourceOp->getValue() << " ==> " << i << "\n");
+ }
+
+ Expansions.push_back(PseudoExpansion(SourceInsn, Insn, OperandMap));
+}
+
+void PseudoLoweringEmitter::emitLoweringEmitter(raw_ostream &o) {
+ // Emit file header.
+ EmitSourceFileHeader("Pseudo-instruction MC lowering Source Fragment", o);
+
+ o << "bool " << Target.getName() + "AsmPrinter" << "::\n"
+ << "emitPseudoExpansionLowering(MCStreamer &OutStreamer,\n"
+ << " const MachineInstr *MI) {\n"
+ << " switch (MI->getOpcode()) {\n"
+ << " default: return false;\n";
+ for (unsigned i = 0, e = Expansions.size(); i != e; ++i) {
+ PseudoExpansion &Expansion = Expansions[i];
+ CodeGenInstruction &Source = Expansion.Source;
+ CodeGenInstruction &Dest = Expansion.Dest;
+ o << " case " << Source.Namespace << "::"
+ << Source.TheDef->getName() << ": {\n"
+ << " MCInst TmpInst;\n"
+ << " MCOperand MCOp;\n"
+ << " TmpInst.setOpcode(" << Dest.Namespace << "::"
+ << Dest.TheDef->getName() << ");\n";
+
+ // Copy the operands from the source instruction.
+ // FIXME: Instruction operands with defaults values (predicates and cc_out
+ // in ARM, for example shouldn't need explicit values in the
+ // expansion DAG.
+ unsigned MIOpNo = 0;
+ for (unsigned OpNo = 0, E = Dest.Operands.size(); OpNo != E;
+ ++OpNo) {
+ o << " // Operand: " << Dest.Operands[OpNo].Name << "\n";
+ for (unsigned i = 0, e = Dest.Operands[OpNo].MINumOperands;
+ i != e; ++i) {
+ switch (Expansion.OperandMap[MIOpNo + i].Kind) {
+ default:
+ llvm_unreachable("Unknown operand type?!");
+ case OpData::Operand:
+ o << " lowerOperand(MI->getOperand("
+ << Source.Operands[Expansion.OperandMap[MIOpNo].Data
+ .Operand].MIOperandNo + i
+ << "), MCOp);\n"
+ << " TmpInst.addOperand(MCOp);\n";
+ break;
+ case OpData::Imm:
+ o << " TmpInst.addOperand(MCOperand::CreateImm("
+ << Expansion.OperandMap[MIOpNo + i].Data.Imm << "));\n";
+ break;
+ case OpData::Reg: {
+ Record *Reg = Expansion.OperandMap[MIOpNo + i].Data.Reg;
+ o << " TmpInst.addOperand(MCOperand::CreateReg(";
+ // "zero_reg" is special.
+ if (Reg->getName() == "zero_reg")
+ o << "0";
+ else
+ o << Reg->getValueAsString("Namespace") << "::" << Reg->getName();
+ o << "));\n";
+ break;
+ }
+ }
+ }
+ MIOpNo += Dest.Operands[OpNo].MINumOperands;
+ }
+ if (Dest.Operands.isVariadic) {
+ o << " // variable_ops\n";
+ o << " for (unsigned i = " << MIOpNo
+ << ", e = MI->getNumOperands(); i != e; ++i)\n"
+ << " if (lowerOperand(MI->getOperand(i), MCOp))\n"
+ << " TmpInst.addOperand(MCOp);\n";
+ }
+ o << " OutStreamer.EmitInstruction(TmpInst);\n"
+ << " break;\n"
+ << " }\n";
+ }
+ o << " }\n return true;\n}\n\n";
+}
+
+void PseudoLoweringEmitter::run(raw_ostream &o) {
+ Record *ExpansionClass = Records.getClass("PseudoInstExpansion");
+ Record *InstructionClass = Records.getClass("PseudoInstExpansion");
+ assert(ExpansionClass && "PseudoInstExpansion class definition missing!");
+ assert(InstructionClass && "Instruction class definition missing!");
+
+ std::vector<Record*> Insts;
+ for (std::map<std::string, Record*>::const_iterator I =
+ Records.getDefs().begin(), E = Records.getDefs().end(); I != E; ++I) {
+ if (I->second->isSubClassOf(ExpansionClass) &&
+ I->second->isSubClassOf(InstructionClass))
+ Insts.push_back(I->second);
+ }
+
+ // Process the pseudo expansion definitions, validating them as we do so.
+ for (unsigned i = 0, e = Insts.size(); i != e; ++i)
+ evaluateExpansion(Insts[i]);
+
+ // Generate expansion code to lower the pseudo to an MCInst of the real
+ // instruction.
+ emitLoweringEmitter(o);
+}
+
diff --git a/contrib/llvm/utils/TableGen/PseudoLoweringEmitter.h b/contrib/llvm/utils/TableGen/PseudoLoweringEmitter.h
new file mode 100644
index 0000000..2749280
--- /dev/null
+++ b/contrib/llvm/utils/TableGen/PseudoLoweringEmitter.h
@@ -0,0 +1,65 @@
+//===- PseudoLoweringEmitter.h - PseudoLowering Generator -------*- C++ -*-===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+#ifndef PSEUDOLOWERINGEMITTER_H
+#define PSEUDOLOWERINGEMITTER_H
+
+#include "CodeGenInstruction.h"
+#include "CodeGenTarget.h"
+#include "TableGenBackend.h"
+#include "llvm/ADT/IndexedMap.h"
+#include "llvm/ADT/SmallVector.h"
+
+namespace llvm {
+
+class PseudoLoweringEmitter : public TableGenBackend {
+ struct OpData {
+ enum MapKind { Operand, Imm, Reg };
+ MapKind Kind;
+ union {
+ unsigned Operand; // Operand number mapped to.
+ uint64_t Imm; // Integer immedate value.
+ Record *Reg; // Physical register.
+ } Data;
+ };
+ struct PseudoExpansion {
+ CodeGenInstruction Source; // The source pseudo instruction definition.
+ CodeGenInstruction Dest; // The destination instruction to lower to.
+ IndexedMap<OpData> OperandMap;
+
+ PseudoExpansion(CodeGenInstruction &s, CodeGenInstruction &d,
+ IndexedMap<OpData> &m) :
+ Source(s), Dest(d), OperandMap(m) {}
+ };
+
+ RecordKeeper &Records;
+
+ // It's overkill to have an instance of the full CodeGenTarget object,
+ // but it loads everything on demand, not in the constructor, so it's
+ // lightweight in performance, so it works out OK.
+ CodeGenTarget Target;
+
+ SmallVector<PseudoExpansion, 64> Expansions;
+
+ unsigned addDagOperandMapping(Record *Rec, DagInit *Dag,
+ CodeGenInstruction &Insn,
+ IndexedMap<OpData> &OperandMap,
+ unsigned BaseIdx);
+ void evaluateExpansion(Record *Pseudo);
+ void emitLoweringEmitter(raw_ostream &o);
+public:
+ PseudoLoweringEmitter(RecordKeeper &R) : Records(R), Target(R) {}
+
+ /// run - Output the pseudo-lowerings.
+ void run(raw_ostream &o);
+};
+
+} // end llvm namespace
+
+#endif
diff --git a/contrib/llvm/utils/TableGen/Record.cpp b/contrib/llvm/utils/TableGen/Record.cpp
index 8ac8cd9..730eca1 100644
--- a/contrib/llvm/utils/TableGen/Record.cpp
+++ b/contrib/llvm/utils/TableGen/Record.cpp
@@ -12,6 +12,7 @@
//===----------------------------------------------------------------------===//
#include "Record.h"
+#include "Error.h"
#include "llvm/Support/DataTypes.h"
#include "llvm/Support/Format.h"
#include "llvm/ADT/StringExtras.h"
@@ -1442,6 +1443,25 @@ Record::getValueAsListOfInts(StringRef FieldName) const {
return Ints;
}
+/// getValueAsListOfStrings - This method looks up the specified field and
+/// returns its value as a vector of strings, throwing an exception if the
+/// field does not exist or if the value is not the right type.
+///
+std::vector<std::string>
+Record::getValueAsListOfStrings(StringRef FieldName) const {
+ ListInit *List = getValueAsListInit(FieldName);
+ std::vector<std::string> Strings;
+ for (unsigned i = 0; i < List->getSize(); i++) {
+ if (StringInit *II = dynamic_cast<StringInit*>(List->getElement(i))) {
+ Strings.push_back(II->getValue());
+ } else {
+ throw "Record `" + getName() + "', field `" + FieldName.str() +
+ "' does not have a list of strings initializer!";
+ }
+ }
+ return Strings;
+}
+
/// getValueAsDef - This method looks up the specified field and returns its
/// value as a Record, throwing an exception if the field does not exist or if
/// the value is not the right type.
diff --git a/contrib/llvm/utils/TableGen/Record.h b/contrib/llvm/utils/TableGen/Record.h
index 522b719..2f4080b 100644
--- a/contrib/llvm/utils/TableGen/Record.h
+++ b/contrib/llvm/utils/TableGen/Record.h
@@ -34,7 +34,7 @@ class DagRecTy;
class RecordRecTy;
// Init subclasses.
-struct Init;
+class Init;
class UnsetInit;
class BitInit;
class BitsInit;
@@ -453,7 +453,8 @@ RecTy *resolveTypes(RecTy *T1, RecTy *T2);
// Initializer Classes
//===----------------------------------------------------------------------===//
-struct Init {
+class Init {
+public:
virtual ~Init() {}
/// isComplete - This virtual method should be overridden by values that may
@@ -1368,6 +1369,12 @@ public:
///
std::vector<int64_t> getValueAsListOfInts(StringRef FieldName) const;
+ /// getValueAsListOfStrings - This method looks up the specified field and
+ /// returns its value as a vector of strings, throwing an exception if the
+ /// field does not exist or if the value is not the right type.
+ ///
+ std::vector<std::string> getValueAsListOfStrings(StringRef FieldName) const;
+
/// getValueAsDef - This method looks up the specified field and returns its
/// value as a Record, throwing an exception if the field does not exist or if
/// the value is not the right type.
@@ -1486,22 +1493,8 @@ struct LessRecordFieldName {
}
};
-
-class TGError {
- SMLoc Loc;
- std::string Message;
-public:
- TGError(SMLoc loc, const std::string &message) : Loc(loc), Message(message) {}
-
- SMLoc getLoc() const { return Loc; }
- const std::string &getMessage() const { return Message; }
-};
-
-
raw_ostream &operator<<(raw_ostream &OS, const RecordKeeper &RK);
-void PrintError(SMLoc ErrorLoc, const Twine &Msg);
-
} // End llvm namespace
#endif
diff --git a/contrib/llvm/utils/TableGen/RegisterInfoEmitter.cpp b/contrib/llvm/utils/TableGen/RegisterInfoEmitter.cpp
index 5a441e2..65d4a9b 100644
--- a/contrib/llvm/utils/TableGen/RegisterInfoEmitter.cpp
+++ b/contrib/llvm/utils/TableGen/RegisterInfoEmitter.cpp
@@ -19,19 +19,24 @@
#include "Record.h"
#include "llvm/ADT/StringExtras.h"
#include "llvm/ADT/STLExtras.h"
+#include "llvm/Support/Format.h"
#include <algorithm>
#include <set>
using namespace llvm;
// runEnums - Print out enum values for all of the registers.
-void RegisterInfoEmitter::runEnums(raw_ostream &OS) {
- CodeGenTarget Target(Records);
- CodeGenRegBank &Bank = Target.getRegBank();
- const std::vector<CodeGenRegister> &Registers = Target.getRegisters();
+void
+RegisterInfoEmitter::runEnums(raw_ostream &OS,
+ CodeGenTarget &Target, CodeGenRegBank &Bank) {
+ const std::vector<CodeGenRegister*> &Registers = Bank.getRegisters();
- std::string Namespace = Registers[0].TheDef->getValueAsString("Namespace");
+ std::string Namespace = Registers[0]->TheDef->getValueAsString("Namespace");
EmitSourceFileHeader("Target Register Enum Values", OS);
+
+ OS << "\n#ifdef GET_REGINFO_ENUM\n";
+ OS << "#undef GET_REGINFO_ENUM\n";
+
OS << "namespace llvm {\n\n";
if (!Namespace.empty())
@@ -39,35 +44,166 @@ void RegisterInfoEmitter::runEnums(raw_ostream &OS) {
OS << "enum {\n NoRegister,\n";
for (unsigned i = 0, e = Registers.size(); i != e; ++i)
- OS << " " << Registers[i].getName() << " = " <<
- Registers[i].EnumValue << ",\n";
- assert(Registers.size() == Registers[Registers.size()-1].EnumValue &&
+ OS << " " << Registers[i]->getName() << " = " <<
+ Registers[i]->EnumValue << ",\n";
+ assert(Registers.size() == Registers[Registers.size()-1]->EnumValue &&
"Register enum value mismatch!");
OS << " NUM_TARGET_REGS \t// " << Registers.size()+1 << "\n";
OS << "};\n";
if (!Namespace.empty())
OS << "}\n";
- const std::vector<Record*> &SubRegIndices = Bank.getSubRegIndices();
- if (!SubRegIndices.empty()) {
- OS << "\n// Subregister indices\n";
- Namespace = SubRegIndices[0]->getValueAsString("Namespace");
+ const std::vector<CodeGenRegisterClass> &RegisterClasses =
+ Target.getRegisterClasses();
+ if (!RegisterClasses.empty()) {
+ OS << "\n// Register classes\n";
if (!Namespace.empty())
OS << "namespace " << Namespace << " {\n";
- OS << "enum {\n NoSubRegister,\n";
- for (unsigned i = 0, e = Bank.getNumNamedIndices(); i != e; ++i)
- OS << " " << SubRegIndices[i]->getName() << ",\t// " << i+1 << "\n";
- OS << " NUM_TARGET_NAMED_SUBREGS = " << SubRegIndices.size()+1 << "\n";
+ OS << "enum {\n";
+ for (unsigned i = 0, e = RegisterClasses.size(); i != e; ++i) {
+ if (i) OS << ",\n";
+ OS << " " << RegisterClasses[i].getName() << "RegClassID";
+ OS << " = " << i;
+ }
+ OS << "\n };\n";
+ if (!Namespace.empty())
+ OS << "}\n";
+ }
+
+ const std::vector<Record*> RegAltNameIndices = Target.getRegAltNameIndices();
+ // If the only definition is the default NoRegAltName, we don't need to
+ // emit anything.
+ if (RegAltNameIndices.size() > 1) {
+ OS << "\n// Register alternate name indices\n";
+ if (!Namespace.empty())
+ OS << "namespace " << Namespace << " {\n";
+ OS << "enum {\n";
+ for (unsigned i = 0, e = RegAltNameIndices.size(); i != e; ++i)
+ OS << " " << RegAltNameIndices[i]->getName() << ",\t// " << i << "\n";
+ OS << " NUM_TARGET_REG_ALT_NAMES = " << RegAltNameIndices.size() << "\n";
OS << "};\n";
if (!Namespace.empty())
OS << "}\n";
}
+
+
OS << "} // End llvm namespace \n";
+ OS << "#endif // GET_REGINFO_ENUM\n\n";
}
-void RegisterInfoEmitter::runHeader(raw_ostream &OS) {
+//
+// runMCDesc - Print out MC register descriptions.
+//
+void
+RegisterInfoEmitter::runMCDesc(raw_ostream &OS, CodeGenTarget &Target,
+ CodeGenRegBank &RegBank) {
+ EmitSourceFileHeader("MC Register Information", OS);
+
+ OS << "\n#ifdef GET_REGINFO_MC_DESC\n";
+ OS << "#undef GET_REGINFO_MC_DESC\n";
+
+ std::map<const CodeGenRegister*, CodeGenRegister::Set> Overlaps;
+ RegBank.computeOverlaps(Overlaps);
+
+ OS << "namespace llvm {\n\n";
+
+ const std::string &TargetName = Target.getName();
+ std::string ClassName = TargetName + "GenMCRegisterInfo";
+ OS << "struct " << ClassName << " : public MCRegisterInfo {\n"
+ << " explicit " << ClassName << "(const MCRegisterDesc *D);\n";
+ OS << "};\n";
+
+ OS << "\nnamespace {\n";
+
+ const std::vector<CodeGenRegister*> &Regs = RegBank.getRegisters();
+
+ // Emit an overlap list for all registers.
+ for (unsigned i = 0, e = Regs.size(); i != e; ++i) {
+ const CodeGenRegister *Reg = Regs[i];
+ const CodeGenRegister::Set &O = Overlaps[Reg];
+ // Move Reg to the front so TRI::getAliasSet can share the list.
+ OS << " const unsigned " << Reg->getName() << "_Overlaps[] = { "
+ << getQualifiedName(Reg->TheDef) << ", ";
+ for (CodeGenRegister::Set::const_iterator I = O.begin(), E = O.end();
+ I != E; ++I)
+ if (*I != Reg)
+ OS << getQualifiedName((*I)->TheDef) << ", ";
+ OS << "0 };\n";
+ }
+
+ // Emit the empty sub-registers list
+ OS << " const unsigned Empty_SubRegsSet[] = { 0 };\n";
+ // Loop over all of the registers which have sub-registers, emitting the
+ // sub-registers list to memory.
+ for (unsigned i = 0, e = Regs.size(); i != e; ++i) {
+ const CodeGenRegister &Reg = *Regs[i];
+ if (Reg.getSubRegs().empty())
+ continue;
+ // getSubRegs() orders by SubRegIndex. We want a topological order.
+ SetVector<CodeGenRegister*> SR;
+ Reg.addSubRegsPreOrder(SR);
+ OS << " const unsigned " << Reg.getName() << "_SubRegsSet[] = { ";
+ for (unsigned j = 0, je = SR.size(); j != je; ++j)
+ OS << getQualifiedName(SR[j]->TheDef) << ", ";
+ OS << "0 };\n";
+ }
+
+ // Emit the empty super-registers list
+ OS << " const unsigned Empty_SuperRegsSet[] = { 0 };\n";
+ // Loop over all of the registers which have super-registers, emitting the
+ // super-registers list to memory.
+ for (unsigned i = 0, e = Regs.size(); i != e; ++i) {
+ const CodeGenRegister &Reg = *Regs[i];
+ const CodeGenRegister::SuperRegList &SR = Reg.getSuperRegs();
+ if (SR.empty())
+ continue;
+ OS << " const unsigned " << Reg.getName() << "_SuperRegsSet[] = { ";
+ for (unsigned j = 0, je = SR.size(); j != je; ++j)
+ OS << getQualifiedName(SR[j]->TheDef) << ", ";
+ OS << "0 };\n";
+ }
+ OS << "}\n"; // End of anonymous namespace...
+
+ OS << "\nMCRegisterDesc " << TargetName
+ << "RegDesc[] = { // Descriptors\n";
+ OS << " { \"NOREG\",\t0,\t0,\t0 },\n";
+
+ // Now that register alias and sub-registers sets have been emitted, emit the
+ // register descriptors now.
+ for (unsigned i = 0, e = Regs.size(); i != e; ++i) {
+ const CodeGenRegister &Reg = *Regs[i];
+ OS << " { \"";
+ OS << Reg.getName() << "\",\t" << Reg.getName() << "_Overlaps,\t";
+ if (!Reg.getSubRegs().empty())
+ OS << Reg.getName() << "_SubRegsSet,\t";
+ else
+ OS << "Empty_SubRegsSet,\t";
+ if (!Reg.getSuperRegs().empty())
+ OS << Reg.getName() << "_SuperRegsSet";
+ else
+ OS << "Empty_SuperRegsSet";
+ OS << " },\n";
+ }
+ OS << "};\n\n"; // End of register descriptors...
+
+ // MCRegisterInfo initialization routine.
+ OS << "static inline void Init" << TargetName
+ << "MCRegisterInfo(MCRegisterInfo *RI) {\n";
+ OS << " RI->InitMCRegisterInfo(" << TargetName << "RegDesc, "
+ << Regs.size()+1 << ");\n}\n\n";
+
+ OS << "} // End llvm namespace \n";
+ OS << "#endif // GET_REGINFO_MC_DESC\n\n";
+}
+
+void
+RegisterInfoEmitter::runTargetHeader(raw_ostream &OS, CodeGenTarget &Target,
+ CodeGenRegBank &RegBank) {
EmitSourceFileHeader("Register Information Header Fragment", OS);
- CodeGenTarget Target(Records);
+
+ OS << "\n#ifdef GET_REGINFO_HEADER\n";
+ OS << "#undef GET_REGINFO_HEADER\n";
+
const std::string &TargetName = Target.getName();
std::string ClassName = TargetName + "GenRegisterInfo";
@@ -77,8 +213,7 @@ void RegisterInfoEmitter::runHeader(raw_ostream &OS) {
OS << "namespace llvm {\n\n";
OS << "struct " << ClassName << " : public TargetRegisterInfo {\n"
- << " explicit " << ClassName
- << "(int CallFrameSetupOpcode = -1, int CallFrameDestroyOpcode = -1);\n"
+ << " explicit " << ClassName << "();\n"
<< " virtual int getDwarfRegNumFull(unsigned RegNum, "
<< "unsigned Flavour) const;\n"
<< " virtual int getLLVMRegNumFull(unsigned DwarfRegNum, "
@@ -91,6 +226,21 @@ void RegisterInfoEmitter::runHeader(raw_ostream &OS) {
<< " unsigned composeSubRegIndices(unsigned, unsigned) const;\n"
<< "};\n\n";
+ const std::vector<Record*> &SubRegIndices = RegBank.getSubRegIndices();
+ if (!SubRegIndices.empty()) {
+ OS << "\n// Subregister indices\n";
+ std::string Namespace = SubRegIndices[0]->getValueAsString("Namespace");
+ if (!Namespace.empty())
+ OS << "namespace " << Namespace << " {\n";
+ OS << "enum {\n NoSubRegister,\n";
+ for (unsigned i = 0, e = RegBank.getNumNamedIndices(); i != e; ++i)
+ OS << " " << SubRegIndices[i]->getName() << ",\t// " << i+1 << "\n";
+ OS << " NUM_TARGET_NAMED_SUBREGS = " << SubRegIndices.size()+1 << "\n";
+ OS << "};\n";
+ if (!Namespace.empty())
+ OS << "}\n";
+ }
+
const std::vector<CodeGenRegisterClass> &RegisterClasses =
Target.getRegisterClasses();
@@ -98,21 +248,17 @@ void RegisterInfoEmitter::runHeader(raw_ostream &OS) {
OS << "namespace " << RegisterClasses[0].Namespace
<< " { // Register classes\n";
- OS << " enum {\n";
- for (unsigned i = 0, e = RegisterClasses.size(); i != e; ++i) {
- if (i) OS << ",\n";
- OS << " " << RegisterClasses[i].getName() << "RegClassID";
- OS << " = " << i;
- }
- OS << "\n };\n\n";
-
for (unsigned i = 0, e = RegisterClasses.size(); i != e; ++i) {
- const std::string &Name = RegisterClasses[i].getName();
+ const CodeGenRegisterClass &RC = RegisterClasses[i];
+ const std::string &Name = RC.getName();
// Output the register class definition.
OS << " struct " << Name << "Class : public TargetRegisterClass {\n"
- << " " << Name << "Class();\n"
- << RegisterClasses[i].MethodProtos << " };\n";
+ << " " << Name << "Class();\n";
+ if (!RC.AltOrderSelect.empty())
+ OS << " ArrayRef<unsigned> "
+ "getRawAllocationOrder(const MachineFunction&) const;\n";
+ OS << " };\n";
// Output the extern for the instance.
OS << " extern " << Name << "Class\t" << Name << "RegClass;\n";
@@ -123,72 +269,19 @@ void RegisterInfoEmitter::runHeader(raw_ostream &OS) {
OS << "} // end of namespace " << TargetName << "\n\n";
}
OS << "} // End llvm namespace \n";
+ OS << "#endif // GET_REGINFO_HEADER\n\n";
}
-static void addSuperReg(Record *R, Record *S,
- std::map<Record*, std::set<Record*>, LessRecord> &SubRegs,
- std::map<Record*, std::set<Record*>, LessRecord> &SuperRegs,
- std::map<Record*, std::set<Record*>, LessRecord> &Aliases) {
- if (R == S) {
- errs() << "Error: recursive sub-register relationship between"
- << " register " << getQualifiedName(R)
- << " and its sub-registers?\n";
- abort();
- }
- if (!SuperRegs[R].insert(S).second)
- return;
- SubRegs[S].insert(R);
- Aliases[R].insert(S);
- Aliases[S].insert(R);
- if (SuperRegs.count(S))
- for (std::set<Record*>::iterator I = SuperRegs[S].begin(),
- E = SuperRegs[S].end(); I != E; ++I)
- addSuperReg(R, *I, SubRegs, SuperRegs, Aliases);
-}
-
-static void addSubSuperReg(Record *R, Record *S,
- std::map<Record*, std::set<Record*>, LessRecord> &SubRegs,
- std::map<Record*, std::set<Record*>, LessRecord> &SuperRegs,
- std::map<Record*, std::set<Record*>, LessRecord> &Aliases) {
- if (R == S) {
- errs() << "Error: recursive sub-register relationship between"
- << " register " << getQualifiedName(R)
- << " and its sub-registers?\n";
- abort();
- }
-
- if (!SubRegs[R].insert(S).second)
- return;
- addSuperReg(S, R, SubRegs, SuperRegs, Aliases);
- Aliases[R].insert(S);
- Aliases[S].insert(R);
- if (SubRegs.count(S))
- for (std::set<Record*>::iterator I = SubRegs[S].begin(),
- E = SubRegs[S].end(); I != E; ++I)
- addSubSuperReg(R, *I, SubRegs, SuperRegs, Aliases);
-}
-
-class RegisterSorter {
-private:
- std::map<Record*, std::set<Record*>, LessRecord> &RegisterSubRegs;
-
-public:
- RegisterSorter(std::map<Record*, std::set<Record*>, LessRecord> &RS)
- : RegisterSubRegs(RS) {}
-
- bool operator()(Record *RegA, Record *RegB) {
- // B is sub-register of A.
- return RegisterSubRegs.count(RegA) && RegisterSubRegs[RegA].count(RegB);
- }
-};
-
-// RegisterInfoEmitter::run - Main register file description emitter.
//
-void RegisterInfoEmitter::run(raw_ostream &OS) {
- CodeGenTarget Target(Records);
- CodeGenRegBank &RegBank = Target.getRegBank();
- RegBank.computeDerivedInfo();
- EmitSourceFileHeader("Register Information Source Fragment", OS);
+// runTargetDesc - Output the target register and register file descriptions.
+//
+void
+RegisterInfoEmitter::runTargetDesc(raw_ostream &OS, CodeGenTarget &Target,
+ CodeGenRegBank &RegBank){
+ EmitSourceFileHeader("Target Register and Register Classes Information", OS);
+
+ OS << "\n#ifdef GET_REGINFO_TARGET_DESC\n";
+ OS << "#undef GET_REGINFO_TARGET_DESC\n";
OS << "namespace llvm {\n\n";
@@ -205,20 +298,21 @@ void RegisterInfoEmitter::run(raw_ostream &OS) {
// Emit the register enum value arrays for each RegisterClass
for (unsigned rc = 0, e = RegisterClasses.size(); rc != e; ++rc) {
const CodeGenRegisterClass &RC = RegisterClasses[rc];
+ ArrayRef<Record*> Order = RC.getOrder();
// Collect allocatable registers.
if (RC.Allocatable)
- AllocatableRegs.insert(RC.Elements.begin(), RC.Elements.end());
+ AllocatableRegs.insert(Order.begin(), Order.end());
// Give the register class a legal C name if it's anonymous.
- std::string Name = RC.TheDef->getName();
+ std::string Name = RC.getName();
// Emit the register list now.
OS << " // " << Name << " Register Class...\n"
<< " static const unsigned " << Name
<< "[] = {\n ";
- for (unsigned i = 0, e = RC.Elements.size(); i != e; ++i) {
- Record *Reg = RC.Elements[i];
+ for (unsigned i = 0, e = Order.size(); i != e; ++i) {
+ Record *Reg = Order[i];
OS << getQualifiedName(Reg) << ", ";
}
OS << "\n };\n\n";
@@ -229,7 +323,7 @@ void RegisterInfoEmitter::run(raw_ostream &OS) {
const CodeGenRegisterClass &RC = RegisterClasses[rc];
// Give the register class a legal C name if it's anonymous.
- std::string Name = RC.TheDef->getName() + "VTs";
+ std::string Name = RC.getName() + "VTs";
// Emit the register list now.
OS << " // " << Name
@@ -397,10 +491,9 @@ void RegisterInfoEmitter::run(raw_ostream &OS) {
OS << "\n };\n\n";
}
-
+ // Emit methods.
for (unsigned i = 0, e = RegisterClasses.size(); i != e; ++i) {
const CodeGenRegisterClass &RC = RegisterClasses[i];
- OS << RC.MethodBodies << "\n";
OS << RC.getName() << "Class::" << RC.getName()
<< "Class() : TargetRegisterClass("
<< RC.getName() + "RegClassID" << ", "
@@ -416,8 +509,30 @@ void RegisterInfoEmitter::run(raw_ostream &OS) {
<< RC.SpillAlignment/8 << ", "
<< RC.CopyCost << ", "
<< RC.Allocatable << ", "
- << RC.getName() << ", " << RC.getName() << " + " << RC.Elements.size()
+ << RC.getName() << ", " << RC.getName() << " + "
+ << RC.getOrder().size()
<< ") {}\n";
+ if (!RC.AltOrderSelect.empty()) {
+ OS << "\nstatic inline unsigned " << RC.getName()
+ << "AltOrderSelect(const MachineFunction &MF) {"
+ << RC.AltOrderSelect << "}\n\nArrayRef<unsigned> "
+ << RC.getName() << "Class::"
+ << "getRawAllocationOrder(const MachineFunction &MF) const {\n";
+ for (unsigned oi = 1 , oe = RC.getNumOrders(); oi != oe; ++oi) {
+ ArrayRef<Record*> Elems = RC.getOrder(oi);
+ OS << " static const unsigned AltOrder" << oi << "[] = {";
+ for (unsigned elem = 0; elem != Elems.size(); ++elem)
+ OS << (elem ? ", " : " ") << getQualifiedName(Elems[elem]);
+ OS << " };\n";
+ }
+ OS << " static const ArrayRef<unsigned> Order[] = {\n"
+ << " ArrayRef<unsigned>(" << RC.getName();
+ for (unsigned oi = 1, oe = RC.getNumOrders(); oi != oe; ++oi)
+ OS << "),\n ArrayRef<unsigned>(AltOrder" << oi;
+ OS << ")\n };\n const unsigned Select = " << RC.getName()
+ << "AltOrderSelect(MF);\n assert(Select < " << RC.getNumOrders()
+ << ");\n return Order[Select];\n}\n";
+ }
}
OS << "}\n";
@@ -429,295 +544,33 @@ void RegisterInfoEmitter::run(raw_ostream &OS) {
OS << " &" << getQualifiedName(RegisterClasses[i].TheDef)
<< "RegClass,\n";
OS << " };\n";
+ OS << "}\n"; // End of anonymous namespace...
- // Emit register sub-registers / super-registers, aliases...
- std::map<Record*, std::set<Record*>, LessRecord> RegisterSubRegs;
- std::map<Record*, std::set<Record*>, LessRecord> RegisterSuperRegs;
- std::map<Record*, std::set<Record*>, LessRecord> RegisterAliases;
- typedef std::map<Record*, std::vector<int64_t>, LessRecord> DwarfRegNumsMapTy;
- DwarfRegNumsMapTy DwarfRegNums;
-
- const std::vector<CodeGenRegister> &Regs = Target.getRegisters();
-
- for (unsigned i = 0, e = Regs.size(); i != e; ++i) {
- Record *R = Regs[i].TheDef;
- std::vector<Record*> LI = Regs[i].TheDef->getValueAsListOfDefs("Aliases");
- // Add information that R aliases all of the elements in the list... and
- // that everything in the list aliases R.
- for (unsigned j = 0, e = LI.size(); j != e; ++j) {
- Record *Reg = LI[j];
- if (RegisterAliases[R].count(Reg))
- errs() << "Warning: register alias between " << getQualifiedName(R)
- << " and " << getQualifiedName(Reg)
- << " specified multiple times!\n";
- RegisterAliases[R].insert(Reg);
-
- if (RegisterAliases[Reg].count(R))
- errs() << "Warning: register alias between " << getQualifiedName(R)
- << " and " << getQualifiedName(Reg)
- << " specified multiple times!\n";
- RegisterAliases[Reg].insert(R);
- }
- }
-
- // Process sub-register sets.
- for (unsigned i = 0, e = Regs.size(); i != e; ++i) {
- Record *R = Regs[i].TheDef;
- std::vector<Record*> LI = Regs[i].TheDef->getValueAsListOfDefs("SubRegs");
- // Process sub-register set and add aliases information.
- for (unsigned j = 0, e = LI.size(); j != e; ++j) {
- Record *SubReg = LI[j];
- if (RegisterSubRegs[R].count(SubReg))
- errs() << "Warning: register " << getQualifiedName(SubReg)
- << " specified as a sub-register of " << getQualifiedName(R)
- << " multiple times!\n";
- addSubSuperReg(R, SubReg, RegisterSubRegs, RegisterSuperRegs,
- RegisterAliases);
- }
- }
-
- // Print the SubregHashTable, a simple quadratically probed
- // hash table for determining if a register is a subregister
- // of another register.
- unsigned NumSubRegs = 0;
- std::map<Record*, unsigned> RegNo;
- for (unsigned i = 0, e = Regs.size(); i != e; ++i) {
- RegNo[Regs[i].TheDef] = i;
- NumSubRegs += RegisterSubRegs[Regs[i].TheDef].size();
- }
-
- unsigned SubregHashTableSize = 2 * NextPowerOf2(2 * NumSubRegs);
- unsigned* SubregHashTable = new unsigned[2 * SubregHashTableSize];
- std::fill(SubregHashTable, SubregHashTable + 2 * SubregHashTableSize, ~0U);
-
- unsigned hashMisses = 0;
-
- for (unsigned i = 0, e = Regs.size(); i != e; ++i) {
- Record* R = Regs[i].TheDef;
- for (std::set<Record*>::iterator I = RegisterSubRegs[R].begin(),
- E = RegisterSubRegs[R].end(); I != E; ++I) {
- Record* RJ = *I;
- // We have to increase the indices of both registers by one when
- // computing the hash because, in the generated code, there
- // will be an extra empty slot at register 0.
- size_t index = ((i+1) + (RegNo[RJ]+1) * 37) & (SubregHashTableSize-1);
- unsigned ProbeAmt = 2;
- while (SubregHashTable[index*2] != ~0U &&
- SubregHashTable[index*2+1] != ~0U) {
- index = (index + ProbeAmt) & (SubregHashTableSize-1);
- ProbeAmt += 2;
-
- hashMisses++;
- }
-
- SubregHashTable[index*2] = i;
- SubregHashTable[index*2+1] = RegNo[RJ];
- }
- }
-
- OS << "\n\n // Number of hash collisions: " << hashMisses << "\n";
-
- if (SubregHashTableSize) {
- std::string Namespace = Regs[0].TheDef->getValueAsString("Namespace");
-
- OS << " const unsigned SubregHashTable[] = { ";
- for (unsigned i = 0; i < SubregHashTableSize - 1; ++i) {
- if (i != 0)
- // Insert spaces for nice formatting.
- OS << " ";
-
- if (SubregHashTable[2*i] != ~0U) {
- OS << getQualifiedName(Regs[SubregHashTable[2*i]].TheDef) << ", "
- << getQualifiedName(Regs[SubregHashTable[2*i+1]].TheDef) << ", \n";
- } else {
- OS << Namespace << "::NoRegister, " << Namespace << "::NoRegister, \n";
- }
- }
-
- unsigned Idx = SubregHashTableSize*2-2;
- if (SubregHashTable[Idx] != ~0U) {
- OS << " "
- << getQualifiedName(Regs[SubregHashTable[Idx]].TheDef) << ", "
- << getQualifiedName(Regs[SubregHashTable[Idx+1]].TheDef) << " };\n";
- } else {
- OS << Namespace << "::NoRegister, " << Namespace << "::NoRegister };\n";
- }
-
- OS << " const unsigned SubregHashTableSize = "
- << SubregHashTableSize << ";\n";
- } else {
- OS << " const unsigned SubregHashTable[] = { ~0U, ~0U };\n"
- << " const unsigned SubregHashTableSize = 1;\n";
- }
-
- delete [] SubregHashTable;
-
-
- // Print the AliasHashTable, a simple quadratically probed
- // hash table for determining if a register aliases another register.
- unsigned NumAliases = 0;
- RegNo.clear();
- for (unsigned i = 0, e = Regs.size(); i != e; ++i) {
- RegNo[Regs[i].TheDef] = i;
- NumAliases += RegisterAliases[Regs[i].TheDef].size();
- }
-
- unsigned AliasesHashTableSize = 2 * NextPowerOf2(2 * NumAliases);
- unsigned* AliasesHashTable = new unsigned[2 * AliasesHashTableSize];
- std::fill(AliasesHashTable, AliasesHashTable + 2 * AliasesHashTableSize, ~0U);
-
- hashMisses = 0;
-
- for (unsigned i = 0, e = Regs.size(); i != e; ++i) {
- Record* R = Regs[i].TheDef;
- for (std::set<Record*>::iterator I = RegisterAliases[R].begin(),
- E = RegisterAliases[R].end(); I != E; ++I) {
- Record* RJ = *I;
- // We have to increase the indices of both registers by one when
- // computing the hash because, in the generated code, there
- // will be an extra empty slot at register 0.
- size_t index = ((i+1) + (RegNo[RJ]+1) * 37) & (AliasesHashTableSize-1);
- unsigned ProbeAmt = 2;
- while (AliasesHashTable[index*2] != ~0U &&
- AliasesHashTable[index*2+1] != ~0U) {
- index = (index + ProbeAmt) & (AliasesHashTableSize-1);
- ProbeAmt += 2;
-
- hashMisses++;
- }
-
- AliasesHashTable[index*2] = i;
- AliasesHashTable[index*2+1] = RegNo[RJ];
- }
- }
-
- OS << "\n\n // Number of hash collisions: " << hashMisses << "\n";
-
- if (AliasesHashTableSize) {
- std::string Namespace = Regs[0].TheDef->getValueAsString("Namespace");
-
- OS << " const unsigned AliasesHashTable[] = { ";
- for (unsigned i = 0; i < AliasesHashTableSize - 1; ++i) {
- if (i != 0)
- // Insert spaces for nice formatting.
- OS << " ";
-
- if (AliasesHashTable[2*i] != ~0U) {
- OS << getQualifiedName(Regs[AliasesHashTable[2*i]].TheDef) << ", "
- << getQualifiedName(Regs[AliasesHashTable[2*i+1]].TheDef) << ", \n";
- } else {
- OS << Namespace << "::NoRegister, " << Namespace << "::NoRegister, \n";
- }
- }
-
- unsigned Idx = AliasesHashTableSize*2-2;
- if (AliasesHashTable[Idx] != ~0U) {
- OS << " "
- << getQualifiedName(Regs[AliasesHashTable[Idx]].TheDef) << ", "
- << getQualifiedName(Regs[AliasesHashTable[Idx+1]].TheDef) << " };\n";
- } else {
- OS << Namespace << "::NoRegister, " << Namespace << "::NoRegister };\n";
- }
-
- OS << " const unsigned AliasesHashTableSize = "
- << AliasesHashTableSize << ";\n";
- } else {
- OS << " const unsigned AliasesHashTable[] = { ~0U, ~0U };\n"
- << " const unsigned AliasesHashTableSize = 1;\n";
- }
-
- delete [] AliasesHashTable;
-
- if (!RegisterAliases.empty())
- OS << "\n\n // Register Overlap Lists...\n";
-
- // Emit an overlap list for all registers.
- for (std::map<Record*, std::set<Record*>, LessRecord >::iterator
- I = RegisterAliases.begin(), E = RegisterAliases.end(); I != E; ++I) {
- OS << " const unsigned " << I->first->getName() << "_Overlaps[] = { "
- << getQualifiedName(I->first) << ", ";
- for (std::set<Record*>::iterator ASI = I->second.begin(),
- E = I->second.end(); ASI != E; ++ASI)
- OS << getQualifiedName(*ASI) << ", ";
- OS << "0 };\n";
- }
-
- if (!RegisterSubRegs.empty())
- OS << "\n\n // Register Sub-registers Sets...\n";
-
- // Emit the empty sub-registers list
- OS << " const unsigned Empty_SubRegsSet[] = { 0 };\n";
- // Loop over all of the registers which have sub-registers, emitting the
- // sub-registers list to memory.
- for (std::map<Record*, std::set<Record*>, LessRecord>::iterator
- I = RegisterSubRegs.begin(), E = RegisterSubRegs.end(); I != E; ++I) {
- if (I->second.empty())
- continue;
- OS << " const unsigned " << I->first->getName() << "_SubRegsSet[] = { ";
- std::vector<Record*> SubRegsVector;
- for (std::set<Record*>::iterator ASI = I->second.begin(),
- E = I->second.end(); ASI != E; ++ASI)
- SubRegsVector.push_back(*ASI);
- RegisterSorter RS(RegisterSubRegs);
- std::stable_sort(SubRegsVector.begin(), SubRegsVector.end(), RS);
- for (unsigned i = 0, e = SubRegsVector.size(); i != e; ++i)
- OS << getQualifiedName(SubRegsVector[i]) << ", ";
- OS << "0 };\n";
- }
-
- if (!RegisterSuperRegs.empty())
- OS << "\n\n // Register Super-registers Sets...\n";
-
- // Emit the empty super-registers list
- OS << " const unsigned Empty_SuperRegsSet[] = { 0 };\n";
- // Loop over all of the registers which have super-registers, emitting the
- // super-registers list to memory.
- for (std::map<Record*, std::set<Record*>, LessRecord >::iterator
- I = RegisterSuperRegs.begin(), E = RegisterSuperRegs.end(); I != E; ++I) {
- if (I->second.empty())
- continue;
- OS << " const unsigned " << I->first->getName() << "_SuperRegsSet[] = { ";
-
- std::vector<Record*> SuperRegsVector;
- for (std::set<Record*>::iterator ASI = I->second.begin(),
- E = I->second.end(); ASI != E; ++ASI)
- SuperRegsVector.push_back(*ASI);
- RegisterSorter RS(RegisterSubRegs);
- std::stable_sort(SuperRegsVector.begin(), SuperRegsVector.end(), RS);
- for (unsigned i = 0, e = SuperRegsVector.size(); i != e; ++i)
- OS << getQualifiedName(SuperRegsVector[i]) << ", ";
- OS << "0 };\n";
- }
-
- OS<<"\n const TargetRegisterDesc RegisterDescriptors[] = { // Descriptors\n";
- OS << " { \"NOREG\",\t0,\t0,\t0,\t0,\t0 },\n";
+ // Emit extra information about registers.
+ const std::string &TargetName = Target.getName();
+ OS << "\n static const TargetRegisterInfoDesc "
+ << TargetName << "RegInfoDesc[] = "
+ << "{ // Extra Descriptors\n";
+ OS << " { 0, 0 },\n";
- // Now that register alias and sub-registers sets have been emitted, emit the
- // register descriptors now.
+ const std::vector<CodeGenRegister*> &Regs = RegBank.getRegisters();
for (unsigned i = 0, e = Regs.size(); i != e; ++i) {
- const CodeGenRegister &Reg = Regs[i];
- OS << " { \"";
- OS << Reg.getName() << "\",\t" << Reg.getName() << "_Overlaps,\t";
- if (!RegisterSubRegs[Reg.TheDef].empty())
- OS << Reg.getName() << "_SubRegsSet,\t";
- else
- OS << "Empty_SubRegsSet,\t";
- if (!RegisterSuperRegs[Reg.TheDef].empty())
- OS << Reg.getName() << "_SuperRegsSet,\t";
- else
- OS << "Empty_SuperRegsSet,\t";
- OS << Reg.CostPerUse << ",\t"
+ const CodeGenRegister &Reg = *Regs[i];
+ OS << " { ";
+ OS << Reg.CostPerUse << ", "
<< int(AllocatableRegs.count(Reg.TheDef)) << " },\n";
}
OS << " };\n"; // End of register descriptors...
+
// Calculate the mapping of subregister+index pairs to physical registers.
// This will also create further anonymous indexes.
unsigned NamedIndices = RegBank.getNumNamedIndices();
// Emit SubRegIndex names, skipping 0
const std::vector<Record*> &SubRegIndices = RegBank.getSubRegIndices();
- OS << "\n const char *const SubRegIndexTable[] = { \"";
+ OS << "\n static const char *const " << TargetName
+ << "SubRegIndexTable[] = { \"";
for (unsigned i = 0, e = SubRegIndices.size(); i != e; ++i) {
OS << SubRegIndices[i]->getName();
if (i+1 != e)
@@ -735,7 +588,7 @@ void RegisterInfoEmitter::run(raw_ostream &OS) {
}
OS << "\n };\n\n";
}
- OS << "}\n\n"; // End of anonymous namespace...
+ OS << "\n";
std::string ClassName = Target.getName() + "GenRegisterInfo";
@@ -746,10 +599,10 @@ void RegisterInfoEmitter::run(raw_ostream &OS) {
<< " switch (RegNo) {\n"
<< " default:\n return 0;\n";
for (unsigned i = 0, e = Regs.size(); i != e; ++i) {
- const CodeGenRegister::SubRegMap &SRM = Regs[i].getSubRegs();
+ const CodeGenRegister::SubRegMap &SRM = Regs[i]->getSubRegs();
if (SRM.empty())
continue;
- OS << " case " << getQualifiedName(Regs[i].TheDef) << ":\n";
+ OS << " case " << getQualifiedName(Regs[i]->TheDef) << ":\n";
OS << " switch (Index) {\n";
OS << " default: return 0;\n";
for (CodeGenRegister::SubRegMap::const_iterator ii = SRM.begin(),
@@ -767,10 +620,10 @@ void RegisterInfoEmitter::run(raw_ostream &OS) {
<< " switch (RegNo) {\n"
<< " default:\n return 0;\n";
for (unsigned i = 0, e = Regs.size(); i != e; ++i) {
- const CodeGenRegister::SubRegMap &SRM = Regs[i].getSubRegs();
+ const CodeGenRegister::SubRegMap &SRM = Regs[i]->getSubRegs();
if (SRM.empty())
continue;
- OS << " case " << getQualifiedName(Regs[i].TheDef) << ":\n";
+ OS << " case " << getQualifiedName(Regs[i]->TheDef) << ":\n";
for (CodeGenRegister::SubRegMap::const_iterator ii = SRM.begin(),
ie = SRM.end(); ii != ie; ++ii)
OS << " if (SubRegNo == " << getQualifiedName(ii->second->TheDef)
@@ -806,22 +659,25 @@ void RegisterInfoEmitter::run(raw_ostream &OS) {
OS << " }\n}\n\n";
// Emit the constructor of the class...
+ OS << "extern MCRegisterDesc " << TargetName << "RegDesc[];\n";
+
OS << ClassName << "::" << ClassName
- << "(int CallFrameSetupOpcode, int CallFrameDestroyOpcode)\n"
- << " : TargetRegisterInfo(RegisterDescriptors, " << Regs.size()+1
+ << "()\n"
+ << " : TargetRegisterInfo(" << TargetName << "RegInfoDesc"
<< ", RegisterClasses, RegisterClasses+" << RegisterClasses.size() <<",\n"
- << " SubRegIndexTable,\n"
- << " CallFrameSetupOpcode, CallFrameDestroyOpcode,\n"
- << " SubregHashTable, SubregHashTableSize,\n"
- << " AliasesHashTable, AliasesHashTableSize) {\n"
+ << " " << TargetName << "SubRegIndexTable) {\n"
+ << " InitMCRegisterInfo(" << TargetName << "RegDesc, "
+ << Regs.size()+1 << ");\n"
<< "}\n\n";
// Collect all information about dwarf register numbers
+ typedef std::map<Record*, std::vector<int64_t>, LessRecord> DwarfRegNumsMapTy;
+ DwarfRegNumsMapTy DwarfRegNums;
// First, just pull all provided information to the map
unsigned maxLength = 0;
for (unsigned i = 0, e = Regs.size(); i != e; ++i) {
- Record *Reg = Regs[i].TheDef;
+ Record *Reg = Regs[i]->TheDef;
std::vector<int64_t> RegNums = Reg->getValueAsListOfInts("DwarfNumbers");
maxLength = std::max((size_t)maxLength, RegNums.size());
if (DwarfRegNums.count(Reg))
@@ -864,7 +720,7 @@ void RegisterInfoEmitter::run(raw_ostream &OS) {
OS << " };\n}\n\n";
for (unsigned i = 0, e = Regs.size(); i != e; ++i) {
- Record *Reg = Regs[i].TheDef;
+ Record *Reg = Regs[i]->TheDef;
const RecordVal *V = Reg->getValue("DwarfAlias");
if (!V || !V->getValue())
continue;
@@ -904,4 +760,16 @@ void RegisterInfoEmitter::run(raw_ostream &OS) {
OS << " };\n}\n\n";
OS << "} // End llvm namespace \n";
+ OS << "#endif // GET_REGINFO_TARGET_DESC\n\n";
+}
+
+void RegisterInfoEmitter::run(raw_ostream &OS) {
+ CodeGenTarget Target(Records);
+ CodeGenRegBank &RegBank = Target.getRegBank();
+ RegBank.computeDerivedInfo();
+
+ runEnums(OS, Target, RegBank);
+ runMCDesc(OS, Target, RegBank);
+ runTargetHeader(OS, Target, RegBank);
+ runTargetDesc(OS, Target, RegBank);
}
diff --git a/contrib/llvm/utils/TableGen/RegisterInfoEmitter.h b/contrib/llvm/utils/TableGen/RegisterInfoEmitter.h
index 1456b4f..2c01b5c 100644
--- a/contrib/llvm/utils/TableGen/RegisterInfoEmitter.h
+++ b/contrib/llvm/utils/TableGen/RegisterInfoEmitter.h
@@ -20,19 +20,30 @@
namespace llvm {
+class CodeGenRegBank;
+class CodeGenTarget;
+
class RegisterInfoEmitter : public TableGenBackend {
RecordKeeper &Records;
public:
RegisterInfoEmitter(RecordKeeper &R) : Records(R) {}
- // run - Output the register file description, returning true on failure.
- void run(raw_ostream &o);
+ // runEnums - Print out enum values for all of the registers.
+ void runEnums(raw_ostream &o, CodeGenTarget &Target, CodeGenRegBank &Bank);
- // runHeader - Emit a header fragment for the register info emitter.
- void runHeader(raw_ostream &o);
+ // runMCDesc - Print out MC register descriptions.
+ void runMCDesc(raw_ostream &o, CodeGenTarget &Target, CodeGenRegBank &Bank);
- // runEnums - Print out enum values for all of the registers.
- void runEnums(raw_ostream &o);
+ // runTargetHeader - Emit a header fragment for the register info emitter.
+ void runTargetHeader(raw_ostream &o, CodeGenTarget &Target,
+ CodeGenRegBank &Bank);
+
+ // runTargetDesc - Output the target register and register file descriptions.
+ void runTargetDesc(raw_ostream &o, CodeGenTarget &Target,
+ CodeGenRegBank &Bank);
+
+ // run - Output the register file description.
+ void run(raw_ostream &o);
};
} // End llvm namespace
diff --git a/contrib/llvm/utils/TableGen/SetTheory.cpp b/contrib/llvm/utils/TableGen/SetTheory.cpp
index ade1825..21ac09c 100644
--- a/contrib/llvm/utils/TableGen/SetTheory.cpp
+++ b/contrib/llvm/utils/TableGen/SetTheory.cpp
@@ -13,6 +13,7 @@
//===----------------------------------------------------------------------===//
#include "SetTheory.h"
+#include "Error.h"
#include "Record.h"
#include "llvm/Support/Format.h"
@@ -155,10 +156,15 @@ struct SequenceOp : public SetTheory::Operator {
From = II->getValue();
else
throw "From must be an integer: " + Expr->getAsString();
+ if (From < 0 || From >= (1 << 30))
+ throw "From out of range";
+
if (IntInit *II = dynamic_cast<IntInit*>(Expr->arg_begin()[2]))
To = II->getValue();
else
throw "From must be an integer: " + Expr->getAsString();
+ if (To < 0 || To >= (1 << 30))
+ throw "To out of range";
RecordKeeper &Records =
dynamic_cast<DefInit&>(*Expr->getOperator()).getDef()->getRecords();
@@ -167,7 +173,7 @@ struct SequenceOp : public SetTheory::Operator {
for (To += Step; From != To; From += Step) {
std::string Name;
raw_string_ostream OS(Name);
- OS << format(Format.c_str(), From);
+ OS << format(Format.c_str(), unsigned(From));
Record *Rec = Records.getDef(OS.str());
if (!Rec)
throw "No def named '" + Name + "': " + Expr->getAsString();
diff --git a/contrib/llvm/utils/TableGen/SetTheory.h b/contrib/llvm/utils/TableGen/SetTheory.h
index e37a76e..6e8313b 100644
--- a/contrib/llvm/utils/TableGen/SetTheory.h
+++ b/contrib/llvm/utils/TableGen/SetTheory.h
@@ -55,7 +55,7 @@
namespace llvm {
class DagInit;
-struct Init;
+class Init;
class Record;
class RecordKeeper;
diff --git a/contrib/llvm/utils/TableGen/SubtargetEmitter.cpp b/contrib/llvm/utils/TableGen/SubtargetEmitter.cpp
index 928fa4b..978e91a 100644
--- a/contrib/llvm/utils/TableGen/SubtargetEmitter.cpp
+++ b/contrib/llvm/utils/TableGen/SubtargetEmitter.cpp
@@ -29,16 +29,20 @@ void SubtargetEmitter::Enumeration(raw_ostream &OS,
std::vector<Record*> DefList = Records.getAllDerivedDefinitions(ClassName);
std::sort(DefList.begin(), DefList.end(), LessRecord());
- // Open enumeration
- OS << "enum {\n";
-
- // For each record
unsigned N = DefList.size();
+ if (N == 0)
+ return;
if (N > 64) {
errs() << "Too many (> 64) subtarget features!\n";
exit(1);
}
+ OS << "namespace " << Target << " {\n";
+
+ // Open enumeration
+ OS << "enum {\n";
+
+ // For each record
for (unsigned i = 0; i < N;) {
// Next record
Record *Def = DefList[i];
@@ -57,23 +61,30 @@ void SubtargetEmitter::Enumeration(raw_ostream &OS,
// Close enumeration
OS << "};\n";
+
+ OS << "}\n";
}
//
// FeatureKeyValues - Emit data of all the subtarget features. Used by the
// command line.
//
-void SubtargetEmitter::FeatureKeyValues(raw_ostream &OS) {
+unsigned SubtargetEmitter::FeatureKeyValues(raw_ostream &OS) {
// Gather and sort all the features
std::vector<Record*> FeatureList =
Records.getAllDerivedDefinitions("SubtargetFeature");
+
+ if (FeatureList.empty())
+ return 0;
+
std::sort(FeatureList.begin(), FeatureList.end(), LessRecordFieldName());
// Begin feature table
OS << "// Sorted (by key) array of values for CPU features.\n"
- << "static const llvm::SubtargetFeatureKV FeatureKV[] = {\n";
+ << "llvm::SubtargetFeatureKV " << Target << "FeatureKV[] = {\n";
// For each feature
+ unsigned NumFeatures = 0;
for (unsigned i = 0, N = FeatureList.size(); i < N; ++i) {
// Next feature
Record *Feature = FeatureList[i];
@@ -88,7 +99,7 @@ void SubtargetEmitter::FeatureKeyValues(raw_ostream &OS) {
OS << " { "
<< "\"" << CommandLineName << "\", "
<< "\"" << Desc << "\", "
- << Name << ", ";
+ << Target << "::" << Name << ", ";
const std::vector<Record*> &ImpliesList =
Feature->getValueAsListOfDefs("Implies");
@@ -97,12 +108,13 @@ void SubtargetEmitter::FeatureKeyValues(raw_ostream &OS) {
OS << "0ULL";
} else {
for (unsigned j = 0, M = ImpliesList.size(); j < M;) {
- OS << ImpliesList[j]->getName();
+ OS << Target << "::" << ImpliesList[j]->getName();
if (++j < M) OS << " | ";
}
}
OS << " }";
+ ++NumFeatures;
// Depending on 'if more in the list' emit comma
if ((i + 1) < N) OS << ",";
@@ -113,17 +125,14 @@ void SubtargetEmitter::FeatureKeyValues(raw_ostream &OS) {
// End feature table
OS << "};\n";
- // Emit size of table
- OS<<"\nenum {\n";
- OS<<" FeatureKVSize = sizeof(FeatureKV)/sizeof(llvm::SubtargetFeatureKV)\n";
- OS<<"};\n";
+ return NumFeatures;
}
//
// CPUKeyValues - Emit data of all the subtarget processors. Used by command
// line.
//
-void SubtargetEmitter::CPUKeyValues(raw_ostream &OS) {
+unsigned SubtargetEmitter::CPUKeyValues(raw_ostream &OS) {
// Gather and sort processor information
std::vector<Record*> ProcessorList =
Records.getAllDerivedDefinitions("Processor");
@@ -131,7 +140,7 @@ void SubtargetEmitter::CPUKeyValues(raw_ostream &OS) {
// Begin processor table
OS << "// Sorted (by key) array of values for CPU subtype.\n"
- << "static const llvm::SubtargetFeatureKV SubTypeKV[] = {\n";
+ << "llvm::SubtargetFeatureKV " << Target << "SubTypeKV[] = {\n";
// For each processor
for (unsigned i = 0, N = ProcessorList.size(); i < N;) {
@@ -151,7 +160,7 @@ void SubtargetEmitter::CPUKeyValues(raw_ostream &OS) {
OS << "0ULL";
} else {
for (unsigned j = 0, M = FeatureList.size(); j < M;) {
- OS << FeatureList[j]->getName();
+ OS << Target << "::" << FeatureList[j]->getName();
if (++j < M) OS << " | ";
}
}
@@ -168,10 +177,7 @@ void SubtargetEmitter::CPUKeyValues(raw_ostream &OS) {
// End processor table
OS << "};\n";
- // Emit size of table
- OS<<"\nenum {\n";
- OS<<" SubTypeKVSize = sizeof(SubTypeKV)/sizeof(llvm::SubtargetFeatureKV)\n";
- OS<<"};\n";
+ return ProcessorList.size();
}
//
@@ -192,11 +198,6 @@ CollectAllItinClasses(raw_ostream &OS,
ItinClassesMap[ItinClass->getName()] = i;
}
- // Emit size of table
- OS<<"\nenum {\n";
- OS<<" ItinClassesSize = " << N << "\n";
- OS<<"};\n";
-
// Return itinerary class count
return N;
}
@@ -326,9 +327,9 @@ void SubtargetEmitter::EmitStageAndOperandCycleData(raw_ostream &OS,
OS << "\n// Pipeline forwarding pathes for itineraries \"" << Name
<< "\"\n" << "namespace " << Name << "Bypass {\n";
- OS << " const unsigned NoBypass = 0;\n";
+ OS << " unsigned NoBypass = 0;\n";
for (unsigned j = 0, BPN = BPs.size(); j < BPN; ++j)
- OS << " const unsigned " << BPs[j]->getName()
+ OS << " unsigned " << BPs[j]->getName()
<< " = 1 << " << j << ";\n";
OS << "}\n";
@@ -336,15 +337,17 @@ void SubtargetEmitter::EmitStageAndOperandCycleData(raw_ostream &OS,
}
// Begin stages table
- std::string StageTable = "\nstatic const llvm::InstrStage Stages[] = {\n";
+ std::string StageTable = "\nllvm::InstrStage " + Target + "Stages[] = {\n";
StageTable += " { 0, 0, 0, llvm::InstrStage::Required }, // No itinerary\n";
// Begin operand cycle table
- std::string OperandCycleTable = "static const unsigned OperandCycles[] = {\n";
+ std::string OperandCycleTable = "unsigned " + Target +
+ "OperandCycles[] = {\n";
OperandCycleTable += " 0, // No itinerary\n";
// Begin pipeline bypass table
- std::string BypassTable = "static const unsigned ForwardingPathes[] = {\n";
+ std::string BypassTable = "unsigned " + Target +
+ "ForwardingPathes[] = {\n";
BypassTable += " 0, // No itinerary\n";
unsigned StageCount = 1, OperandCycleCount = 1;
@@ -457,12 +460,6 @@ void SubtargetEmitter::EmitStageAndOperandCycleData(raw_ostream &OS,
OS << StageTable;
OS << OperandCycleTable;
OS << BypassTable;
-
- // Emit size of tables
- OS<<"\nenum {\n";
- OS<<" StagesSize = sizeof(Stages)/sizeof(llvm::InstrStage),\n";
- OS<<" OperandCyclesSize = sizeof(OperandCycles)/sizeof(unsigned)\n";
- OS<<"};\n";
}
//
@@ -491,7 +488,7 @@ EmitProcessorData(raw_ostream &OS,
// Begin processor itinerary table
OS << "\n";
- OS << "static const llvm::InstrItinerary " << Name << "[] = {\n";
+ OS << "llvm::InstrItinerary " << Name << "[] = {\n";
// For each itinerary class
std::vector<InstrItinerary> &ItinList = *ProcListIter++;
@@ -533,7 +530,8 @@ void SubtargetEmitter::EmitProcessorLookup(raw_ostream &OS) {
// Begin processor table
OS << "\n";
OS << "// Sorted (by key) array of itineraries for CPU subtype.\n"
- << "static const llvm::SubtargetInfoKV ProcItinKV[] = {\n";
+ << "llvm::SubtargetInfoKV "
+ << Target << "ProcItinKV[] = {\n";
// For each processor
for (unsigned i = 0, N = ProcessorList.size(); i < N;) {
@@ -559,12 +557,6 @@ void SubtargetEmitter::EmitProcessorLookup(raw_ostream &OS) {
// End processor table
OS << "};\n";
-
- // Emit size of table
- OS<<"\nenum {\n";
- OS<<" ProcItinKVSize = sizeof(ProcItinKV)/"
- "sizeof(llvm::SubtargetInfoKV)\n";
- OS<<"};\n";
}
//
@@ -599,23 +591,27 @@ void SubtargetEmitter::EmitData(raw_ostream &OS) {
// ParseFeaturesFunction - Produces a subtarget specific function for parsing
// the subtarget features string.
//
-void SubtargetEmitter::ParseFeaturesFunction(raw_ostream &OS) {
+void SubtargetEmitter::ParseFeaturesFunction(raw_ostream &OS,
+ unsigned NumFeatures,
+ unsigned NumProcs) {
std::vector<Record*> Features =
Records.getAllDerivedDefinitions("SubtargetFeature");
std::sort(Features.begin(), Features.end(), LessRecord());
OS << "// ParseSubtargetFeatures - Parses features string setting specified\n"
<< "// subtarget options.\n"
- << "std::string llvm::";
+ << "void llvm::";
OS << Target;
- OS << "Subtarget::ParseSubtargetFeatures(const std::string &FS,\n"
- << " const std::string &CPU) {\n"
+ OS << "Subtarget::ParseSubtargetFeatures(StringRef CPU, StringRef FS) {\n"
<< " DEBUG(dbgs() << \"\\nFeatures:\" << FS);\n"
- << " DEBUG(dbgs() << \"\\nCPU:\" << CPU);\n"
- << " SubtargetFeatures Features(FS);\n"
- << " Features.setCPUIfNone(CPU);\n"
- << " uint64_t Bits = Features.getBits(SubTypeKV, SubTypeKVSize,\n"
- << " FeatureKV, FeatureKVSize);\n";
+ << " DEBUG(dbgs() << \"\\nCPU:\" << CPU);\n";
+
+ if (Features.empty()) {
+ OS << "}\n";
+ return;
+ }
+
+ OS << " uint64_t Bits = ReInitMCSubtargetInfo(CPU, FS);\n";
for (unsigned i = 0; i < Features.size(); i++) {
// Next record
@@ -625,23 +621,17 @@ void SubtargetEmitter::ParseFeaturesFunction(raw_ostream &OS) {
const std::string &Attribute = R->getValueAsString("Attribute");
if (Value=="true" || Value=="false")
- OS << " if ((Bits & " << Instance << ") != 0) "
+ OS << " if ((Bits & " << Target << "::"
+ << Instance << ") != 0) "
<< Attribute << " = " << Value << ";\n";
else
- OS << " if ((Bits & " << Instance << ") != 0 && " << Attribute <<
- " < " << Value << ") " << Attribute << " = " << Value << ";\n";
- }
-
- if (HasItineraries) {
- OS << "\n"
- << " InstrItinerary *Itinerary = (InstrItinerary *)"
- << "Features.getInfo(ProcItinKV, ProcItinKVSize);\n"
- << " InstrItins = InstrItineraryData(Stages, OperandCycles, "
- << "ForwardingPathes, Itinerary);\n";
+ OS << " if ((Bits & " << Target << "::"
+ << Instance << ") != 0 && "
+ << Attribute << " < " << Value << ") "
+ << Attribute << " = " << Value << ";\n";
}
- OS << " return Features.getCPU();\n"
- << "}\n";
+ OS << "}\n";
}
//
@@ -652,22 +642,114 @@ void SubtargetEmitter::run(raw_ostream &OS) {
EmitSourceFileHeader("Subtarget Enumeration Source Fragment", OS);
- OS << "#include \"llvm/Support/Debug.h\"\n";
- OS << "#include \"llvm/Support/raw_ostream.h\"\n";
- OS << "#include \"llvm/Target/SubtargetFeature.h\"\n";
- OS << "#include \"llvm/Target/TargetInstrItineraries.h\"\n\n";
+ OS << "\n#ifdef GET_SUBTARGETINFO_ENUM\n";
+ OS << "#undef GET_SUBTARGETINFO_ENUM\n";
-// Enumeration(OS, "FuncUnit", true);
-// OS<<"\n";
-// Enumeration(OS, "InstrItinClass", false);
-// OS<<"\n";
+ OS << "namespace llvm {\n";
Enumeration(OS, "SubtargetFeature", true);
- OS<<"\n";
- FeatureKeyValues(OS);
- OS<<"\n";
- CPUKeyValues(OS);
- OS<<"\n";
+ OS << "} // End llvm namespace \n";
+ OS << "#endif // GET_SUBTARGETINFO_ENUM\n\n";
+
+ OS << "\n#ifdef GET_SUBTARGETINFO_MC_DESC\n";
+ OS << "#undef GET_SUBTARGETINFO_MC_DESC\n";
+
+ OS << "namespace llvm {\n";
+#if 0
+ OS << "namespace {\n";
+#endif
+ unsigned NumFeatures = FeatureKeyValues(OS);
+ OS << "\n";
+ unsigned NumProcs = CPUKeyValues(OS);
+ OS << "\n";
EmitData(OS);
- OS<<"\n";
- ParseFeaturesFunction(OS);
+ OS << "\n";
+#if 0
+ OS << "}\n";
+#endif
+
+ // MCInstrInfo initialization routine.
+ OS << "static inline void Init" << Target
+ << "MCSubtargetInfo(MCSubtargetInfo *II, "
+ << "StringRef TT, StringRef CPU, StringRef FS) {\n";
+ OS << " II->InitMCSubtargetInfo(TT, CPU, FS, ";
+ if (NumFeatures)
+ OS << Target << "FeatureKV, ";
+ else
+ OS << "0, ";
+ if (NumProcs)
+ OS << Target << "SubTypeKV, ";
+ else
+ OS << "0, ";
+ if (HasItineraries) {
+ OS << Target << "ProcItinKV, "
+ << Target << "Stages, "
+ << Target << "OperandCycles, "
+ << Target << "ForwardingPathes, ";
+ } else
+ OS << "0, 0, 0, 0, ";
+ OS << NumFeatures << ", " << NumProcs << ");\n}\n\n";
+
+ OS << "} // End llvm namespace \n";
+
+ OS << "#endif // GET_SUBTARGETINFO_MC_DESC\n\n";
+
+ OS << "\n#ifdef GET_SUBTARGETINFO_TARGET_DESC\n";
+ OS << "#undef GET_SUBTARGETINFO_TARGET_DESC\n";
+
+ OS << "#include \"llvm/Support/Debug.h\"\n";
+ OS << "#include \"llvm/Support/raw_ostream.h\"\n";
+ ParseFeaturesFunction(OS, NumFeatures, NumProcs);
+
+ OS << "#endif // GET_SUBTARGETINFO_TARGET_DESC\n\n";
+
+ // Create a TargetSubtargetInfo subclass to hide the MC layer initialization.
+ OS << "\n#ifdef GET_SUBTARGETINFO_HEADER\n";
+ OS << "#undef GET_SUBTARGETINFO_HEADER\n";
+
+ std::string ClassName = Target + "GenSubtargetInfo";
+ OS << "namespace llvm {\n";
+ OS << "struct " << ClassName << " : public TargetSubtargetInfo {\n"
+ << " explicit " << ClassName << "(StringRef TT, StringRef CPU, "
+ << "StringRef FS);\n"
+ << "};\n";
+ OS << "} // End llvm namespace \n";
+
+ OS << "#endif // GET_SUBTARGETINFO_HEADER\n\n";
+
+ OS << "\n#ifdef GET_SUBTARGETINFO_CTOR\n";
+ OS << "#undef GET_SUBTARGETINFO_CTOR\n";
+
+ OS << "namespace llvm {\n";
+ OS << "extern llvm::SubtargetFeatureKV " << Target << "FeatureKV[];\n";
+ OS << "extern llvm::SubtargetFeatureKV " << Target << "SubTypeKV[];\n";
+ if (HasItineraries) {
+ OS << "extern llvm::SubtargetInfoKV " << Target << "ProcItinKV[];\n";
+ OS << "extern llvm::InstrStage " << Target << "Stages[];\n";
+ OS << "extern unsigned " << Target << "OperandCycles[];\n";
+ OS << "extern unsigned " << Target << "ForwardingPathes[];\n";
+ }
+
+ OS << ClassName << "::" << ClassName << "(StringRef TT, StringRef CPU, "
+ << "StringRef FS)\n"
+ << " : TargetSubtargetInfo() {\n"
+ << " InitMCSubtargetInfo(TT, CPU, FS, ";
+ if (NumFeatures)
+ OS << Target << "FeatureKV, ";
+ else
+ OS << "0, ";
+ if (NumProcs)
+ OS << Target << "SubTypeKV, ";
+ else
+ OS << "0, ";
+ if (HasItineraries) {
+ OS << Target << "ProcItinKV, "
+ << Target << "Stages, "
+ << Target << "OperandCycles, "
+ << Target << "ForwardingPathes, ";
+ } else
+ OS << "0, 0, 0, 0, ";
+ OS << NumFeatures << ", " << NumProcs << ");\n}\n\n";
+ OS << "} // End llvm namespace \n";
+
+ OS << "#endif // GET_SUBTARGETINFO_CTOR\n\n";
}
diff --git a/contrib/llvm/utils/TableGen/SubtargetEmitter.h b/contrib/llvm/utils/TableGen/SubtargetEmitter.h
index 93055b7..b239f3d 100644
--- a/contrib/llvm/utils/TableGen/SubtargetEmitter.h
+++ b/contrib/llvm/utils/TableGen/SubtargetEmitter.h
@@ -15,7 +15,7 @@
#define SUBTARGET_EMITTER_H
#include "TableGenBackend.h"
-#include "llvm/Target/TargetInstrItineraries.h"
+#include "llvm/MC/MCInstrItineraries.h"
#include <vector>
#include <map>
#include <string>
@@ -30,8 +30,8 @@ class SubtargetEmitter : public TableGenBackend {
bool HasItineraries;
void Enumeration(raw_ostream &OS, const char *ClassName, bool isBits);
- void FeatureKeyValues(raw_ostream &OS);
- void CPUKeyValues(raw_ostream &OS);
+ unsigned FeatureKeyValues(raw_ostream &OS);
+ unsigned CPUKeyValues(raw_ostream &OS);
unsigned CollectAllItinClasses(raw_ostream &OS,
std::map<std::string,unsigned> &ItinClassesMap,
std::vector<Record*> &ItinClassList);
@@ -52,7 +52,8 @@ class SubtargetEmitter : public TableGenBackend {
std::vector<std::vector<InstrItinerary> > &ProcList);
void EmitProcessorLookup(raw_ostream &OS);
void EmitData(raw_ostream &OS);
- void ParseFeaturesFunction(raw_ostream &OS);
+ void ParseFeaturesFunction(raw_ostream &OS, unsigned NumFeatures,
+ unsigned NumProcs);
public:
SubtargetEmitter(RecordKeeper &R) : Records(R), HasItineraries(false) {}
diff --git a/contrib/llvm/utils/TableGen/TGLexer.cpp b/contrib/llvm/utils/TableGen/TGLexer.cpp
index 572c36d..b4b90ff 100644
--- a/contrib/llvm/utils/TableGen/TGLexer.cpp
+++ b/contrib/llvm/utils/TableGen/TGLexer.cpp
@@ -12,6 +12,7 @@
//===----------------------------------------------------------------------===//
#include "TGLexer.h"
+#include "Error.h"
#include "llvm/Support/SourceMgr.h"
#include "llvm/Support/MemoryBuffer.h"
#include "llvm/Config/config.h"
@@ -35,7 +36,6 @@ SMLoc TGLexer::getLoc() const {
return SMLoc::getFromPointer(TokStart);
}
-
/// ReturnError - Set the error to the specified string at the specified
/// location. This is defined to always return tgtok::Error.
tgtok::TokKind TGLexer::ReturnError(const char *Loc, const Twine &Msg) {
@@ -43,16 +43,6 @@ tgtok::TokKind TGLexer::ReturnError(const char *Loc, const Twine &Msg) {
return tgtok::Error;
}
-
-void TGLexer::PrintError(const char *Loc, const Twine &Msg) const {
- SrcMgr.PrintMessage(SMLoc::getFromPointer(Loc), Msg, "error");
-}
-
-void TGLexer::PrintError(SMLoc Loc, const Twine &Msg) const {
- SrcMgr.PrintMessage(Loc, Msg, "error");
-}
-
-
int TGLexer::getNextChar() {
char CurChar = *CurPtr++;
switch (CurChar) {
diff --git a/contrib/llvm/utils/TableGen/TGLexer.h b/contrib/llvm/utils/TableGen/TGLexer.h
index c2a6453..84d328b 100644
--- a/contrib/llvm/utils/TableGen/TGLexer.h
+++ b/contrib/llvm/utils/TableGen/TGLexer.h
@@ -101,9 +101,6 @@ public:
}
SMLoc getLoc() const;
-
- void PrintError(const char *Loc, const Twine &Msg) const;
- void PrintError(SMLoc Loc, const Twine &Msg) const;
private:
/// LexToken - Read the next token and return its code.
diff --git a/contrib/llvm/utils/TableGen/TGParser.h b/contrib/llvm/utils/TableGen/TGParser.h
index 419a99b..dce7e1d 100644
--- a/contrib/llvm/utils/TableGen/TGParser.h
+++ b/contrib/llvm/utils/TableGen/TGParser.h
@@ -15,6 +15,7 @@
#define TGPARSER_H
#include "TGLexer.h"
+#include "Error.h"
#include "llvm/ADT/Twine.h"
#include "llvm/Support/SourceMgr.h"
#include <map>
@@ -24,7 +25,7 @@ namespace llvm {
class RecordVal;
class RecordKeeper;
struct RecTy;
- struct Init;
+ class Init;
struct MultiClass;
struct SubClassReference;
struct SubMultiClassReference;
@@ -60,7 +61,7 @@ public:
bool ParseFile();
bool Error(SMLoc L, const Twine &Msg) const {
- Lex.PrintError(L, Msg);
+ PrintError(L, Msg);
return true;
}
bool TokError(const Twine &Msg) const {
diff --git a/contrib/llvm/utils/TableGen/TableGen.cpp b/contrib/llvm/utils/TableGen/TableGen.cpp
index 4e4da36..e8eacb8 100644
--- a/contrib/llvm/utils/TableGen/TableGen.cpp
+++ b/contrib/llvm/utils/TableGen/TableGen.cpp
@@ -26,13 +26,14 @@
#include "DAGISelEmitter.h"
#include "DisassemblerEmitter.h"
#include "EDEmitter.h"
+#include "Error.h"
#include "FastISelEmitter.h"
-#include "InstrEnumEmitter.h"
#include "InstrInfoEmitter.h"
#include "IntrinsicEmitter.h"
#include "LLVMCConfigurationEmitter.h"
#include "NeonEmitter.h"
#include "OptParserEmitter.h"
+#include "PseudoLoweringEmitter.h"
#include "Record.h"
#include "RegisterInfoEmitter.h"
#include "ARMDecoderEmitter.h"
@@ -53,10 +54,13 @@ using namespace llvm;
enum ActionType {
PrintRecords,
GenEmitter,
- GenRegisterEnums, GenRegister, GenRegisterHeader,
- GenInstrEnums, GenInstrs, GenAsmWriter, GenAsmMatcher,
+ GenRegisterInfo,
+ GenInstrInfo,
+ GenAsmWriter,
+ GenAsmMatcher,
GenARMDecoder,
GenDisassembler,
+ GenPseudoLowering,
GenCallingConv,
GenClangAttrClasses,
GenClangAttrImpl,
@@ -92,15 +96,9 @@ namespace {
"Print all records to stdout (default)"),
clEnumValN(GenEmitter, "gen-emitter",
"Generate machine code emitter"),
- clEnumValN(GenRegisterEnums, "gen-register-enums",
- "Generate enum values for registers"),
- clEnumValN(GenRegister, "gen-register-desc",
- "Generate a register info description"),
- clEnumValN(GenRegisterHeader, "gen-register-desc-header",
- "Generate a register info description header"),
- clEnumValN(GenInstrEnums, "gen-instr-enums",
- "Generate enum values for instructions"),
- clEnumValN(GenInstrs, "gen-instr-desc",
+ clEnumValN(GenRegisterInfo, "gen-register-info",
+ "Generate registers and register classes info"),
+ clEnumValN(GenInstrInfo, "gen-instr-info",
"Generate instruction descriptions"),
clEnumValN(GenCallingConv, "gen-callingconv",
"Generate calling convention descriptions"),
@@ -110,6 +108,8 @@ namespace {
"Generate decoders for ARM/Thumb"),
clEnumValN(GenDisassembler, "gen-disassembler",
"Generate disassembler"),
+ clEnumValN(GenPseudoLowering, "gen-pseudo-lowering",
+ "Generate pseudo instruction lowering"),
clEnumValN(GenAsmMatcher, "gen-asm-matcher",
"Generate assembly instruction matcher"),
clEnumValN(GenDAGISel, "gen-dag-isel",
@@ -194,12 +194,6 @@ namespace {
}
-static SourceMgr SrcMgr;
-
-void llvm::PrintError(SMLoc ErrorLoc, const Twine &Msg) {
- SrcMgr.PrintMessage(ErrorLoc, Msg, "error");
-}
-
int main(int argc, char **argv) {
RecordKeeper Records;
@@ -266,20 +260,10 @@ int main(int argc, char **argv) {
case GenEmitter:
CodeEmitterGen(Records).run(Out.os());
break;
-
- case GenRegisterEnums:
- RegisterInfoEmitter(Records).runEnums(Out.os());
- break;
- case GenRegister:
+ case GenRegisterInfo:
RegisterInfoEmitter(Records).run(Out.os());
break;
- case GenRegisterHeader:
- RegisterInfoEmitter(Records).runHeader(Out.os());
- break;
- case GenInstrEnums:
- InstrEnumEmitter(Records).run(Out.os());
- break;
- case GenInstrs:
+ case GenInstrInfo:
InstrInfoEmitter(Records).run(Out.os());
break;
case GenCallingConv:
@@ -334,6 +318,9 @@ int main(int argc, char **argv) {
case GenDisassembler:
DisassemblerEmitter(Records).run(Out.os());
break;
+ case GenPseudoLowering:
+ PseudoLoweringEmitter(Records).run(Out.os());
+ break;
case GenOptParserDefs:
OptParserEmitter(Records, true).run(Out.os());
break;
@@ -403,13 +390,11 @@ int main(int argc, char **argv) {
return 0;
} catch (const TGError &Error) {
- errs() << argv[0] << ": error:\n";
- PrintError(Error.getLoc(), Error.getMessage());
-
+ PrintError(Error);
} catch (const std::string &Error) {
- errs() << argv[0] << ": " << Error << "\n";
+ PrintError(Error);
} catch (const char *Error) {
- errs() << argv[0] << ": " << Error << "\n";
+ PrintError(Error);
} catch (...) {
errs() << argv[0] << ": Unknown unexpected exception occurred.\n";
}
diff --git a/contrib/llvm/utils/TableGen/X86RecognizableInstr.cpp b/contrib/llvm/utils/TableGen/X86RecognizableInstr.cpp
index f7518a9..ea3bb70 100644
--- a/contrib/llvm/utils/TableGen/X86RecognizableInstr.cpp
+++ b/contrib/llvm/utils/TableGen/X86RecognizableInstr.cpp
@@ -229,6 +229,30 @@ RecognizableInstr::RecognizableInstr(DisassemblerTables &tables,
HasFROperands = hasFROperands();
HasVEX_LPrefix = has256BitOperands() || Rec->getValueAsBit("hasVEX_L");
+ // Check for 64-bit inst which does not require REX
+ Is64Bit = false;
+ // FIXME: Is there some better way to check for In64BitMode?
+ std::vector<Record*> Predicates = Rec->getValueAsListOfDefs("Predicates");
+ for (unsigned i = 0, e = Predicates.size(); i != e; ++i) {
+ if (Predicates[i]->getName().find("64Bit") != Name.npos) {
+ Is64Bit = true;
+ break;
+ }
+ }
+ // FIXME: These instructions aren't marked as 64-bit in any way
+ Is64Bit |= Rec->getName() == "JMP64pcrel32" ||
+ Rec->getName() == "MASKMOVDQU64" ||
+ Rec->getName() == "POPFS64" ||
+ Rec->getName() == "POPGS64" ||
+ Rec->getName() == "PUSHFS64" ||
+ Rec->getName() == "PUSHGS64" ||
+ Rec->getName() == "REX64_PREFIX" ||
+ Rec->getName().find("VMREAD64") != Name.npos ||
+ Rec->getName().find("VMWRITE64") != Name.npos ||
+ Rec->getName().find("MOV64") != Name.npos ||
+ Rec->getName().find("PUSH64") != Name.npos ||
+ Rec->getName().find("POP64") != Name.npos;
+
ShouldBeEmitted = true;
}
@@ -276,7 +300,7 @@ InstructionContext RecognizableInstr::insnContext() const {
insnContext = IC_VEX_XS;
else
insnContext = IC_VEX;
- } else if (Name.find("64") != Name.npos || HasREX_WPrefix) {
+ } else if (Is64Bit || HasREX_WPrefix) {
if (HasREX_WPrefix && HasOpSizePrefix)
insnContext = IC_64BIT_REXW_OPSIZE;
else if (HasOpSizePrefix)
diff --git a/contrib/llvm/utils/TableGen/X86RecognizableInstr.h b/contrib/llvm/utils/TableGen/X86RecognizableInstr.h
index c7ec18c..677d9f0 100644
--- a/contrib/llvm/utils/TableGen/X86RecognizableInstr.h
+++ b/contrib/llvm/utils/TableGen/X86RecognizableInstr.h
@@ -64,6 +64,8 @@ private:
bool HasLockPrefix;
/// The isCodeGenOnly filed from the record
bool IsCodeGenOnly;
+ // Whether the instruction has the predicate "Mode64Bit"
+ bool Is64Bit;
/// The instruction name as listed in the tables
std::string Name;
diff --git a/contrib/lukemftpd/src/ftpd.c b/contrib/lukemftpd/src/ftpd.c
index afdd517..8b06649 100644
--- a/contrib/lukemftpd/src/ftpd.c
+++ b/contrib/lukemftpd/src/ftpd.c
@@ -1263,8 +1263,9 @@ end_login(void)
curclass.type = CLASS_REAL;
(void) seteuid((uid_t)0);
#ifdef LOGIN_CAP
- setusercontext(NULL, getpwuid(0), 0,
- LOGIN_SETPRIORITY|LOGIN_SETRESOURCES|LOGIN_SETUMASK|LOGIN_SETMAC);
+ setusercontext(NULL, getpwuid(0), 0, LOGIN_SETALL & ~(LOGIN_SETLOGIN |
+ LOGIN_SETUSER | LOGIN_SETGROUP | LOGIN_SETPATH |
+ LOGIN_SETENV));
#endif
#ifdef USE_PAM
if (pamh) {
@@ -1427,9 +1428,8 @@ pass(const char *passwd)
#endif
}
setsid();
- setusercontext(lc, pw, 0,
- LOGIN_SETLOGIN|LOGIN_SETGROUP|LOGIN_SETPRIORITY|
- LOGIN_SETRESOURCES|LOGIN_SETUMASK|LOGIN_SETMAC);
+ setusercontext(lc, pw, 0, LOGIN_SETALL &
+ ~(LOGIN_SETUSER | LOGIN_SETPATH | LOGIN_SETENV));
#else
(void) initgroups(pw->pw_name, pw->pw_gid);
/* cache groups for cmds.c::matchgroup() */
diff --git a/contrib/pf/man/pf.4 b/contrib/pf/man/pf.4
index 75e421d..936a5a8 100644
--- a/contrib/pf/man/pf.4
+++ b/contrib/pf/man/pf.4
@@ -28,7 +28,7 @@
.\"
.\" $FreeBSD$
.\"
-.Dd September 10 2008
+.Dd July 17 2011
.Dt PF 4
.Os
.Sh NAME
@@ -308,14 +308,17 @@ structure from the state table.
.It Dv DIOCKILLSTATES Fa "struct pfioc_state_kill *psk"
Remove matching entries from the state table.
This ioctl returns the number of killed states in
-.Va psk_af .
+.Va psk_killed .
.Bd -literal
struct pfioc_state_kill {
+ struct pf_state_cmp psk_pfcmp;
sa_family_t psk_af;
int psk_proto;
struct pf_rule_addr psk_src;
struct pf_rule_addr psk_dst;
char psk_ifname[IFNAMSIZ];
+ char psk_label[PF_RULE_LABEL_SIZE];
+ u_int psk_killed;
};
.Ed
.It Dv DIOCCLRSTATES Fa "struct pfioc_state_kill *psk"
@@ -1146,4 +1149,9 @@ main(int argc, char *argv[])
The
.Nm
packet filtering mechanism first appeared in
-.Ox 3.0 .
+.Ox 3.0
+and then
+.Fx 5.2 .
+.Pp
+This implementation matches
+.Ox 4.5 .
diff --git a/contrib/sendmail/src/deliver.c b/contrib/sendmail/src/deliver.c
index acd977f..bb1d60e 100644
--- a/contrib/sendmail/src/deliver.c
+++ b/contrib/sendmail/src/deliver.c
@@ -2416,6 +2416,12 @@ tryhost:
else
pwd = sm_getpwnam(contextaddr->q_user);
sucflags = LOGIN_SETRESOURCES|LOGIN_SETPRIORITY;
+#ifdef LOGIN_SETCPUMASK
+ sucflags |= LOGIN_SETCPUMASK;
+#endif /* LOGIN_SETCPUMASK */
+#ifdef LOGIN_SETLOGINCLASS
+ sucflags |= LOGIN_SETLOGINCLASS;
+#endif /* LOGIN_SETLOGINCLASS */
#ifdef LOGIN_SETMAC
sucflags |= LOGIN_SETMAC;
#endif /* LOGIN_SETMAC */
diff --git a/contrib/top/commands.c b/contrib/top/commands.c
index 7891068..49472fd 100644
--- a/contrib/top/commands.c
+++ b/contrib/top/commands.c
@@ -88,6 +88,7 @@ o - specify sort order (vcsw, ivcsw, read, write, fault, total, jid)\n",
stdout);
#endif
fputs("\
+P - toggle the displaying of per-CPU statistics\n\
r - renice a process\n\
s - change number of seconds to delay between updates\n\
S - toggle the displaying of system processes\n\
diff --git a/contrib/top/display.c b/contrib/top/display.c
index 8d89d82..a5a4e9e 100644
--- a/contrib/top/display.c
+++ b/contrib/top/display.c
@@ -151,16 +151,14 @@ int display_resize()
return(smart_terminal ? lines : Largest);
}
-int display_init(statics)
+int display_updatecpus(statics)
struct statics *statics;
{
register int lines;
- register char **pp;
- register int *ip;
register int i;
-
+
/* call resize to do the dirty work */
lines = display_resize();
num_cpus = statics->ncpus;
@@ -170,6 +168,21 @@ struct statics *statics;
for (i = num_cpus; i > 9; i /= 10)
cpustates_column++;
+ return(lines);
+}
+
+int display_init(statics)
+
+struct statics *statics;
+
+{
+ register int lines;
+ register char **pp;
+ register int *ip;
+ register int i;
+
+ lines = display_updatecpus(statics);
+
/* only do the rest if we need to */
if (lines > -1)
{
diff --git a/contrib/top/top.X b/contrib/top/top.X
index 41c3d78..9c54f85 100644
--- a/contrib/top/top.X
+++ b/contrib/top/top.X
@@ -200,11 +200,17 @@ a user to set his or her own defaults. The number of processes to display
can also be specified in the environment variable
.BR TOP .
The options
+.BR \-a ,
+.BR \-C ,
+.BR \-H ,
.BR \-I ,
+.BR \-j ,
+.BR \-P ,
.BR \-S ,
+.BR \-t ,
.BR \-u ,
and
-.B \-t
+.B \-z
are actually toggles. A second specification of any of these options
will negate the first. Thus a user who has the environment variable
.B TOP
@@ -309,6 +315,9 @@ Toggle the display of
.IR jail (8)
ID.
.TP
+.B P
+Toggle the display of per-CPU statistics.
+.TP
.B t
Toggle the display of the
.I top
diff --git a/contrib/top/top.c b/contrib/top/top.c
index 6673a27..4e4d86d 100644
--- a/contrib/top/top.c
+++ b/contrib/top/top.c
@@ -196,9 +196,9 @@ char *argv[];
fd_set readfds;
#ifdef ORDER
- static char command_chars[] = "\f qh?en#sdkriIutHmSCajzo";
+ static char command_chars[] = "\f qh?en#sdkriIutHmSCajzPo";
#else
- static char command_chars[] = "\f qh?en#sdkriIutHmSCajz";
+ static char command_chars[] = "\f qh?en#sdkriIutHmSCajzP";
#endif
/* these defines enumerate the "strchr"s of the commands in command_chars */
#define CMD_redraw 0
@@ -225,8 +225,9 @@ char *argv[];
#define CMD_showargs 20
#define CMD_jidtog 21
#define CMD_kidletog 22
+#define CMD_pcputog 23
#ifdef ORDER
-#define CMD_order 23
+#define CMD_order 24
#endif
/* set the buffer for stdout */
@@ -411,7 +412,7 @@ char *argv[];
break;
case 'P':
- pcpu_stats = Yes;
+ pcpu_stats = !pcpu_stats;
break;
case 'z':
@@ -1019,7 +1020,7 @@ restart:
case CMD_thrtog:
ps.thread = !ps.thread;
new_message(MT_standout | MT_delayed,
- "Displaying threads %s",
+ " Displaying threads %s",
ps.thread ? "separately" : "as a count");
header_text = format_header(uname_field);
reset_display();
@@ -1028,7 +1029,7 @@ restart:
case CMD_wcputog:
ps.wcpu = !ps.wcpu;
new_message(MT_standout | MT_delayed,
- "Displaying %sCPU",
+ " Displaying %sCPU",
ps.wcpu ? "W" : "");
header_text = format_header(uname_field);
reset_display();
@@ -1088,6 +1089,16 @@ restart:
ps.kidle ? "D" : "Not d");
putchar('\r');
break;
+ case CMD_pcputog:
+ pcpu_stats = !pcpu_stats;
+ new_message(MT_standout | MT_delayed,
+ " Displaying %sCPU statistics.",
+ pcpu_stats ? "per-" : "global ");
+ toggle_pcpustats(&statics);
+ max_topn = display_updatecpus(&statics);
+ reset_display();
+ putchar('\r');
+ break;
default:
new_message(MT_standout, " BAD CASE IN SWITCH!");
putchar('\r');
diff --git a/contrib/xz/ChangeLog b/contrib/xz/ChangeLog
index 7d5406c..0746422 100644
--- a/contrib/xz/ChangeLog
+++ b/contrib/xz/ChangeLog
@@ -1,3 +1,328 @@
+commit edf339227a966f24aebe1845fcca9429b8f6e318
+Author: Anders F Bjorklund <afb@users.sourceforge.net>
+Date: Fri Nov 5 12:56:11 2010 +0100
+
+ add build script for macosx universal
+
+commit 7fcc6334ea8923550ba6b5347ff99dc8432234b0
+Author: Lasse Collin <lasse.collin@tukaani.org>
+Date: Thu Jun 16 12:15:29 2011 +0300
+
+ liblzma: Remove unneeded semicolon.
+
+commit 631f4d3ae6adfda84d1a110781d9402c12e16cfc
+Author: Lasse Collin <lasse.collin@tukaani.org>
+Date: Sat May 28 16:43:26 2011 +0300
+
+ Don't call close(-1) in tuklib_open_stdxxx() on error.
+
+ Thanks to Jim Meyering.
+
+commit c89faf4c9e5970e7f7f8a25521ed9aa62d1a2d9a
+Author: Lasse Collin <lasse.collin@tukaani.org>
+Date: Sat May 28 09:47:56 2011 +0300
+
+ Translations: Update Italian translation.
+
+ Thanks to Milo Casagrande.
+
+commit 6fe2fc9b6ab5bf6848140823e9536370834f42fb
+Author: Lasse Collin <lasse.collin@tukaani.org>
+Date: Sat May 28 08:46:04 2011 +0300
+
+ Tests: Add a test file for the bug in the previous commit.
+
+commit 6c4d4db2bc8d8b682bd927144d37daa2ab21a6d6
+Author: Lasse Collin <lasse.collin@tukaani.org>
+Date: Fri May 27 22:25:44 2011 +0300
+
+ xz: Fix error handling in xz -lvv.
+
+ It could do an invalid free() and read past the end
+ of the uninitialized filters array.
+
+commit 844f84fcad9670c543550edf7c7e42630c8f7715
+Author: Lasse Collin <lasse.collin@tukaani.org>
+Date: Fri May 27 22:09:49 2011 +0300
+
+ liblzma: Handle allocation failures correctly in lzma_index_init().
+
+ Thanks to Jim Meyering.
+
+commit 240e8b9791df597063a3b68d04ffcb3aa4f2de6a
+Author: Lasse Collin <lasse.collin@tukaani.org>
+Date: Mon May 23 18:30:30 2011 +0300
+
+ Build: Set GZIP_ENV=-9n in top-level Makefile.am.
+
+commit e32cb264ea72a4459810f30abad70dae5a4fa17d
+Author: Lasse Collin <lasse.collin@tukaani.org>
+Date: Sat May 21 16:59:22 2011 +0300
+
+ Bump version and soname for 5.0.3.
+
+commit 65cff45f8fd1c250491557157cce0f5f38481082
+Author: Lasse Collin <lasse.collin@tukaani.org>
+Date: Sat May 21 16:56:53 2011 +0300
+
+ Update NEWS for 5.0.3.
+
+commit 316c67ffdae1f811ac95e838d5290a013bff4ca7
+Author: Lasse Collin <lasse.collin@tukaani.org>
+Date: Sat May 21 16:28:44 2011 +0300
+
+ Add French translation.
+
+ It is known that the BCJ filter --help text is only
+ partially translated.
+
+commit 1931175eea6d09c0845d6e8e334a7333647f11c0
+Author: Lasse Collin <lasse.collin@tukaani.org>
+Date: Sat May 21 15:12:10 2011 +0300
+
+ xz: Translate also the string used to print the program name.
+
+ French needs a space before a colon, e.g. "xz : foo error".
+
+commit 841dc1f891b48b23f84c0f0e0c86c7c4e4bdcdf5
+Author: Lasse Collin <lasse.collin@tukaani.org>
+Date: Tue May 17 12:26:28 2011 +0300
+
+ Update THANKS.
+
+commit 0f7e2d36240ebf1159d5fb85d8cd7422337a0d3f
+Author: Lasse Collin <lasse.collin@tukaani.org>
+Date: Tue May 17 12:21:33 2011 +0300
+
+ Update INSTALL with a note about linker problem on OpenSolaris x86.
+
+commit 793d857e01e1725f16fc0c8af8172c91a9e38617
+Author: Lasse Collin <lasse.collin@tukaani.org>
+Date: Tue May 17 12:01:37 2011 +0300
+
+ Build: Fix initialization of enable_check_* variables in configure.ac.
+
+ This doesn't matter much in practice since it is unlikely
+ that anyone would have such environment variable names.
+
+ Thanks to Wim Lewis.
+
+commit afcff45cee04c5c7d9c333504046ffb63d1418b5
+Author: Lasse Collin <lasse.collin@tukaani.org>
+Date: Tue May 17 11:54:38 2011 +0300
+
+ Add underscores to attributes (__attribute((__foo__))).
+
+commit 22159c6ba2300a006f2e46ce85ae132e2d2f7d57
+Author: Lasse Collin <lasse.collin@tukaani.org>
+Date: Mon Apr 18 19:35:49 2011 +0300
+
+ Update THANKS.
+
+commit 5e3499059515033d1ce44b6fb0fa49183c7ac633
+Author: Martin Väth <vaeth@mathematik.uni-wuerzburg.de>
+Date: Fri Apr 15 04:54:49 2011 -0400
+
+ xzgrep: fix typo in $0 parsing
+
+ Reported-by: Diego Elio Pettenò <flameeyes@gentoo.org>
+ Signed-off-by: Martin Väth <vaeth@mathematik.uni-wuerzburg.de>
+ Signed-off-by: Mike Frysinger <vapier@gentoo.org>
+
+commit 1125611b9b8d4a209b6a73d2c76e1b39c065972a
+Author: Lasse Collin <lasse.collin@tukaani.org>
+Date: Tue Apr 12 11:59:49 2011 +0300
+
+ Remove doubled words from documentation and comments.
+
+ Spot candidates by running these commands:
+ git ls-files |xargs perl -0777 -n \
+ -e 'while (/\b(then?|[iao]n|i[fst]|but|f?or|at|and|[dt]o)\s+\1\b/gims)' \
+ -e '{$n=($` =~ tr/\n/\n/ + 1); ($v=$&)=~s/\n/\\n/g; print "$ARGV:$n:$v\n"}'
+
+ Thanks to Jim Meyering for the original patch.
+
+commit 3f8fa53837bae8b44f3addf19923e26401336c3d
+Author: Lasse Collin <lasse.collin@tukaani.org>
+Date: Mon Apr 11 21:04:13 2011 +0300
+
+ liblzma: Document lzma_easy_(enc|dec)oder_memusage() better too.
+
+commit 320d734c20d0776e3eb80f6b5984ddeb494715b5
+Author: Lasse Collin <lasse.collin@tukaani.org>
+Date: Mon Apr 11 20:59:07 2011 +0300
+
+ liblzma: Document lzma_raw_(enc|dec)oder_memusage() better.
+
+ It didn't mention the return value that is used if
+ an error occurs.
+
+commit 2ee4edeffc8d9734bf68230df31b20ac6a94c9b5
+Author: Lasse Collin <lasse.collin@tukaani.org>
+Date: Mon Apr 11 13:59:50 2011 +0300
+
+ liblzma: Don't create an empty Block in lzma_stream_buffer_encode().
+
+ Empty Block was created if the input buffer was empty.
+ Empty Block wastes a few bytes of space, but more importantly
+ it triggers a bug in XZ Utils 5.0.1 and older when trying
+ to decompress such a file. 5.0.1 and older consider such
+ files to be corrupt. I thought that no encoder creates empty
+ Blocks when releasing 5.0.2 but I was wrong.
+
+commit 73f56fb87d54091d0c4fd22d70e6f042902e3b63
+Author: Lasse Collin <lasse.collin@tukaani.org>
+Date: Mon Apr 11 13:28:40 2011 +0300
+
+ liblzma: Fix API docs to mention LZMA_UNSUPPORTED_CHECK.
+
+ This return value was missing from the API comments of
+ four functions.
+
+commit 4ce1cf97a88ae1640a380dd19cbc255d729f966b
+Author: Lasse Collin <lasse.collin@tukaani.org>
+Date: Mon Apr 11 13:21:28 2011 +0300
+
+ liblzma: Validate encoder arguments better.
+
+ The biggest problem was that the integrity check type
+ wasn't validated, and e.g. lzma_easy_buffer_encode()
+ would create a corrupt .xz Stream if given an unsupported
+ Check ID. Luckily applications don't usually try to use
+ an unsupport Check ID, so this bug is unlikely to cause
+ many real-world problems.
+
+commit 972f05d7a4268dbe42573701f83faa45d03249eb
+Author: Lasse Collin <lasse.collin@tukaani.org>
+Date: Sat Apr 9 18:29:30 2011 +0300
+
+ Update THANKS.
+
+commit 28154eeaf6e3442cd1e174f4e81266d60c4dac60
+Author: Lasse Collin <lasse.collin@tukaani.org>
+Date: Sat Apr 9 18:28:58 2011 +0300
+
+ liblzma: Add missing #ifdefs to filter_common.c.
+
+ Passing --disable-decoders to configure broke a few
+ encoders due to missing #ifdefs in filter_common.c.
+
+ Thanks to Jason Gorski for the patch.
+
+commit aa95516d3d509c6b7895ee519004afcf500a0759
+Author: Lasse Collin <lasse.collin@tukaani.org>
+Date: Sat Apr 2 14:49:56 2011 +0300
+
+ liblzma: Fix a memory leak in stream_encoder.c.
+
+ It leaks old filter options structures (hundred bytes or so)
+ every time the lzma_stream is reinitialized. With the xz tool,
+ this happens when compressing multiple files.
+
+commit 58f52c72f49562a08042da9a2f4bbdf4dd162d0c
+Author: Lasse Collin <lasse.collin@tukaani.org>
+Date: Fri Apr 1 08:47:46 2011 +0300
+
+ Bumped version and liblzma soname to 5.0.2.
+
+commit 162779682e01d15f0ce386ef7f40d1be05ad0053
+Author: Lasse Collin <lasse.collin@tukaani.org>
+Date: Fri Apr 1 08:47:20 2011 +0300
+
+ Updated NEWS for 5.0.2.
+
+commit 45553f9b4b0175c292023010dc41520347004852
+Author: Lasse Collin <lasse.collin@tukaani.org>
+Date: Thu Mar 31 15:06:58 2011 +0300
+
+ Update INSTALL with another note about IRIX.
+
+commit af9d48d5515eadef689b1ce9ffb91e4dbcbc7f35
+Author: Lasse Collin <lasse.collin@tukaani.org>
+Date: Thu Mar 31 12:22:55 2011 +0300
+
+ Tests: Add a new file to test empty LZMA2 streams.
+
+commit d099ef9f517b59ab8e3b6f6aa0543c3643983470
+Author: Lasse Collin <lasse.collin@tukaani.org>
+Date: Thu Mar 31 11:54:48 2011 +0300
+
+ liblzma: Fix decoding of LZMA2 streams having no uncompressed data.
+
+ The decoder considered empty LZMA2 streams to be corrupt.
+ This shouldn't matter much with .xz files, because no encoder
+ creates empty LZMA2 streams in .xz. This bug is more likely
+ to cause problems in applications that use raw LZMA2 streams.
+
+commit df87249b26e79a75fd91041e85512944fc247b57
+Author: Lasse Collin <lasse.collin@tukaani.org>
+Date: Thu Mar 24 01:42:49 2011 +0200
+
+ Scripts: Better fix for xzgrep.
+
+ Now it uses "grep -q".
+
+ Thanks to Gregory Margo.
+
+commit 68c453e1c7b09dc9c7d2ef9d994c46f5b367f5d3
+Author: Lasse Collin <lasse.collin@tukaani.org>
+Date: Thu Mar 24 01:22:18 2011 +0200
+
+ Updated THANKS.
+
+commit b441d39855516ae618faffd5156261b8b413394f
+Author: Lasse Collin <lasse.collin@tukaani.org>
+Date: Thu Mar 24 01:21:32 2011 +0200
+
+ Scripts: Fix xzgrep -l.
+
+ It didn't work at all. It tried to use the -q option
+ for grep, but it appended it after "--". This works
+ around it by redirecting to /dev/null. The downside
+ is that this can be slower with big files compared
+ to proper use of "grep -q".
+
+ Thanks to Gregory Margo.
+
+commit 82d5164839517f55daeadd9ee88c76425db30224
+Author: Lasse Collin <lasse.collin@tukaani.org>
+Date: Fri Feb 4 22:49:31 2011 +0200
+
+ xz: Clean up suffix.c.
+
+ struct suffix_pair isn't needed in compresed_name()
+ so get rid of it there.
+
+commit 6decc8b41882c2250f0450eb87b83c9fbf495e95
+Author: Lasse Collin <lasse.collin@tukaani.org>
+Date: Fri Feb 4 11:29:47 2011 +0200
+
+ xz: Check if the file already has custom suffix when compressing.
+
+ Now "xz -S .test foo.test" refuses to compress the
+ file because it already has the suffix .test. The man
+ page had it documented this way already.
+
+commit ecda90061df8d39399e707e5c76c2ec0a0f400e5
+Author: Lasse Collin <lasse.collin@tukaani.org>
+Date: Wed Feb 2 23:01:51 2011 +0200
+
+ Updated THANKS.
+
+commit 0fda1ae5b1aa0a5c629a09e5228db8ba1cd0dd5f
+Author: Lasse Collin <lasse.collin@tukaani.org>
+Date: Wed Feb 2 23:00:33 2011 +0200
+
+ Translations: Add Polish translation.
+
+ Thanks to Jakub Bogusz.
+
+commit 00be32978fedc5038748438bf685ac1713d1db83
+Author: Lasse Collin <lasse.collin@tukaani.org>
+Date: Wed Feb 2 22:24:00 2011 +0200
+
+ Updated THANKS.
+
commit 7232fcf96bf4bd5f9cd4fc6c93ca2912c665e004
Author: Lasse Collin <lasse.collin@tukaani.org>
Date: Fri Jan 28 20:26:38 2011 +0200
diff --git a/contrib/xz/FREEBSD-Xlist b/contrib/xz/FREEBSD-Xlist
index c9c6bdb..b25db96 100644
--- a/contrib/xz/FREEBSD-Xlist
+++ b/contrib/xz/FREEBSD-Xlist
@@ -28,6 +28,7 @@ dos/
extra/
lib/
m4/
+macosx/
makefile.am
src/*/*.rc
src/liblzma/liblzma.pc.in
diff --git a/contrib/xz/FREEBSD-upgrade b/contrib/xz/FREEBSD-upgrade
index 0cc214c..8d48be2 100644
--- a/contrib/xz/FREEBSD-upgrade
+++ b/contrib/xz/FREEBSD-upgrade
@@ -4,7 +4,7 @@ xz
The source code is pulled with git:
- git clone http://git.tukaani.org/xz.git xz
+ git clone --branch=v5.0 http://git.tukaani.org/xz.git xz
ChangeLog is generated with:
@@ -25,4 +25,4 @@ To make local changes to xz, simply patch and commit to the trunk
branch (aka HEAD). Never make local changes on the vendor branch.
mm@FreeBSD.org
-10-May-2010
+11-July-2011
diff --git a/contrib/xz/THANKS b/contrib/xz/THANKS
index a9a2208..70303e0 100644
--- a/contrib/xz/THANKS
+++ b/contrib/xz/THANKS
@@ -10,6 +10,9 @@ has been important. :-) In alphabetical order:
- Karl Berry
- Anders F. Björklund
- Emmanuel Blot
+ - Martin Blumenstingl
+ - Jakub Bogusz
+ - Maarten Bosmans
- Trent W. Buck
- David Burklund
- Daniel Mealha Cabrita
@@ -22,6 +25,7 @@ has been important. :-) In alphabetical order:
- Gilles Espinasse
- Denis Excoffier
- Mike Frysinger
+ - Jason Gorski
- Juan Manuel Guerrero
- Joachim Henke
- Peter Ivanov
@@ -34,7 +38,9 @@ has been important. :-) In alphabetical order:
- Peter Lawler
- Hin-Tak Leung
- Andraž 'ruskie' Levstik
+ - Wim Lewis
- Lorenzo De Liso
+ - Gregory Margo
- Jim Meyering
- Rafał Mużyło
- Adrien Nader
@@ -43,6 +49,7 @@ has been important. :-) In alphabetical order:
- Andre Noll
- Peter O'Gorman
- Igor Pavlov
+ - Diego Elio Pettenò
- Elbert Pol
- Mikko Pouru
- Robert Readman
@@ -55,10 +62,12 @@ has been important. :-) In alphabetical order:
- Dan Shechter
- Stuart Shelton
- Jonathan Stott
+ - Dan Stromberg
- Paul Townsend
- Mohammed Adnène Trojette
- Alexey Tourbin
- Patrick J. Volkerding
+ - Martin Väth
- Christian Weisgerber
- Bert Wesarg
- Ralf Wildenhues
diff --git a/contrib/xz/po/LINGUAS b/contrib/xz/po/LINGUAS
index 7bd249c..6babcab 100644
--- a/contrib/xz/po/LINGUAS
+++ b/contrib/xz/po/LINGUAS
@@ -1,3 +1,5 @@
cs
de
+fr
it
+pl
diff --git a/contrib/xz/po/fr.po b/contrib/xz/po/fr.po
new file mode 100644
index 0000000..2d95411
--- /dev/null
+++ b/contrib/xz/po/fr.po
@@ -0,0 +1,864 @@
+# XZ Utils French Translation
+# This file is put in the public domain.
+# Adrien Nader <camaradetux@gmail.com>, 2011.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: xz-utils\n"
+"Report-Msgid-Bugs-To: lasse.collin@tukaani.org\n"
+"POT-Creation-Date: 2011-05-21 14:35+0200\n"
+"PO-Revision-Date: 2010-09-24 21;12+0200\n"
+"Last-Translator: Adrien Nader <camaradetux@gmail.com>\n"
+"Language-Team: None\n"
+"Language: fr\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n==1) ? 0 : 1;\n"
+
+#: src/xz/args.c:338
+#, c-format
+msgid "%s: Unknown file format type"
+msgstr "%s : Format de fichier inconnu"
+
+#: src/xz/args.c:361 src/xz/args.c:369
+#, c-format
+msgid "%s: Unsupported integrity check type"
+msgstr "%s : Type de vérification d'intégrité inconnu"
+
+#: src/xz/args.c:396
+msgid "Only one file can be specified with `--files' or `--files0'."
+msgstr "Un seul fichier peut être spécifié avec `--files' ou `--files0'."
+
+#: src/xz/args.c:459
+#, c-format
+msgid "The environment variable %s contains too many arguments"
+msgstr "La variable d'environnement %s contient trop d'arguments"
+
+#: src/xz/coder.c:105
+msgid "Maximum number of filters is four"
+msgstr "Le nombre maximal de filtres est quatre"
+
+#: src/xz/coder.c:118
+msgid "Memory usage limit is too low for the given filter setup."
+msgstr "La limite d'utilisation mémoire est trop basse pour la configuration de filtres donnée."
+
+#: src/xz/coder.c:148
+msgid "Using a preset in raw mode is discouraged."
+msgstr "Utiliser un préréglage en mode `raw' est déconseillé."
+
+#: src/xz/coder.c:150
+msgid "The exact options of the presets may vary between software versions."
+msgstr "Le détail des préréglages peut varier entre différentes versions du logiciel."
+
+#: src/xz/coder.c:176
+msgid "The .lzma format supports only the LZMA1 filter"
+msgstr "Le format .lzma ne prend en charge que le filtre LZMA1"
+
+#: src/xz/coder.c:184
+msgid "LZMA1 cannot be used with the .xz format"
+msgstr "Le filtre LZMA1 ne peut être utilisé avec le format .xz"
+
+#: src/xz/coder.c:203
+#, c-format
+msgid "Using up to %<PRIu32> threads."
+msgstr "Jusqu'à %<PRIu32> threads seront utilisés."
+
+#: src/xz/coder.c:216
+msgid "Unsupported filter chain or filter options"
+msgstr "Enchaînement ou options de filtres non pris en charge"
+
+#: src/xz/coder.c:224
+#, c-format
+msgid "Decompression will need %s MiB of memory."
+msgstr "La décompression nécessitera %s MiB de mémoire."
+
+#: src/xz/coder.c:259
+#, c-format
+msgid "Adjusted the number of threads from %s to %s to not exceed the memory usage limit of %s MiB"
+msgstr "Nombre de threads réduit de %s à %s pour ne pas dépasser la limite d'utilisation mémoire de %s MiB"
+
+#: src/xz/coder.c:313
+#, c-format
+msgid "Adjusted LZMA%c dictionary size from %s MiB to %s MiB to not exceed the memory usage limit of %s MiB"
+msgstr "Taille du dictionnaire LZMA%c réduite de %s MiB à %s MiB pour ne pas dépasser la limite d'utilisation mémoire de %s MiB"
+
+#. TRANSLATORS: When compression or decompression finishes,
+#. and xz is going to remove the source file, xz first checks
+#. if the source file still exists, and if it does, does its
+#. device and inode numbers match what xz saw when it opened
+#. the source file. If these checks fail, this message is
+#. shown, %s being the filename, and the file is not deleted.
+#. The check for device and inode numbers is there, because
+#. it is possible that the user has put a new file in place
+#. of the original file, and in that case it obviously
+#. shouldn't be removed.
+#: src/xz/file_io.c:136
+#, c-format
+msgid "%s: File seems to have been moved, not removing"
+msgstr "%s : Le fichier a apparemment été déplacé, suppression annulée"
+
+#: src/xz/file_io.c:143 src/xz/file_io.c:635
+#, c-format
+msgid "%s: Cannot remove: %s"
+msgstr "%s : Impossible de supprimer : %s"
+
+#: src/xz/file_io.c:168
+#, c-format
+msgid "%s: Cannot set the file owner: %s"
+msgstr "%s : Impossible de modifier le propriétaire du fichier : %s"
+
+#: src/xz/file_io.c:174
+#, c-format
+msgid "%s: Cannot set the file group: %s"
+msgstr "%s : Impossible de modifier le groupe propriétaire du fichier : %s"
+
+#: src/xz/file_io.c:193
+#, c-format
+msgid "%s: Cannot set the file permissions: %s"
+msgstr "%s : Impossible de modifier les permissions du fichier : %s"
+
+#: src/xz/file_io.c:340 src/xz/file_io.c:423
+#, c-format
+msgid "%s: Is a symbolic link, skipping"
+msgstr "%s est un lien symbolique : ignoré"
+
+#: src/xz/file_io.c:468
+#, c-format
+msgid "%s: Is a directory, skipping"
+msgstr "%s est un répertoire : ignoré"
+
+#: src/xz/file_io.c:474
+#, c-format
+msgid "%s: Not a regular file, skipping"
+msgstr "%s n'est pas un fichier régulier : ignoré"
+
+#: src/xz/file_io.c:491
+#, c-format
+msgid "%s: File has setuid or setgid bit set, skipping"
+msgstr "%s : Le fichier possède les bits `setuid' ou `setgid' : ignoré"
+
+#: src/xz/file_io.c:498
+#, c-format
+msgid "%s: File has sticky bit set, skipping"
+msgstr "%s : Le fichier possède le bit `sticky' : ignoré"
+
+#: src/xz/file_io.c:505
+#, c-format
+msgid "%s: Input file has more than one hard link, skipping"
+msgstr "%s : Le fichier d'entrée a plus d'un lien matériel : ignoré"
+
+#: src/xz/file_io.c:761
+#, c-format
+msgid "Error restoring the O_APPEND flag to standard output: %s"
+msgstr "Impossible de rétablir le drapeau O_APPEND sur la sortie standard : %s"
+
+#: src/xz/file_io.c:773
+#, c-format
+msgid "%s: Closing the file failed: %s"
+msgstr "%s : Impossible de fermer le fichier : %s"
+
+#: src/xz/file_io.c:809 src/xz/file_io.c:1008
+#, c-format
+msgid "%s: Seeking failed when trying to create a sparse file: %s"
+msgstr "%s : Impossible de se déplacer dans le fichier pour créer un 'sparse file' : %s"
+
+#: src/xz/file_io.c:883
+#, c-format
+msgid "%s: Read error: %s"
+msgstr "%s : Erreur d'écriture : %s"
+
+#: src/xz/file_io.c:906
+#, c-format
+msgid "%s: Error seeking the file: %s"
+msgstr "%s : Impossible de se déplacer dans le fichier : %s"
+
+#: src/xz/file_io.c:916
+#, c-format
+msgid "%s: Unexpected end of file"
+msgstr "%s : Fin de fichier inattendue"
+
+#: src/xz/file_io.c:966
+#, c-format
+msgid "%s: Write error: %s"
+msgstr "%s : Erreur d'écriture : %s"
+
+#: src/xz/hardware.c:101
+msgid "Disabled"
+msgstr "Désactivé"
+
+#. TRANSLATORS: Test with "xz --info-memory" to see if
+#. the alignment looks nice.
+#: src/xz/hardware.c:120
+msgid "Total amount of physical memory (RAM): "
+msgstr "Quantité totale de mémoire physique (RAM) : "
+
+#: src/xz/hardware.c:122
+msgid "Memory usage limit for compression: "
+msgstr "Limite d'utilisation pour la compression : "
+
+#: src/xz/hardware.c:124
+msgid "Memory usage limit for decompression: "
+msgstr "Limite d'utilisation pour la décompression : "
+
+#. TRANSLATORS: Indicates that there is no integrity check.
+#. This string is used in tables, so the width must not
+#. exceed ten columns with a fixed-width font.
+#: src/xz/list.c:62
+msgid "None"
+msgstr "Aucune"
+
+#. TRANSLATORS: Indicates that integrity check name is not known,
+#. but the Check ID is known (here 2). This and other "Unknown-N"
+#. strings are used in tables, so the width must not exceed ten
+#. columns with a fixed-width font. It's OK to omit the dash if
+#. you need space for one extra letter, but don't use spaces.
+#: src/xz/list.c:69
+msgid "Unknown-2"
+msgstr "Inconnue-2"
+
+#: src/xz/list.c:70
+msgid "Unknown-3"
+msgstr "Inconnue-3"
+
+#: src/xz/list.c:72
+msgid "Unknown-5"
+msgstr "Inconnue-5"
+
+#: src/xz/list.c:73
+msgid "Unknown-6"
+msgstr "Inconnue-6"
+
+#: src/xz/list.c:74
+msgid "Unknown-7"
+msgstr "Inconnue-7"
+
+#: src/xz/list.c:75
+msgid "Unknown-8"
+msgstr "Inconnue-8"
+
+#: src/xz/list.c:76
+msgid "Unknown-9"
+msgstr "Inconnue-9"
+
+#: src/xz/list.c:78
+msgid "Unknown-11"
+msgstr "Inconnue-11"
+
+#: src/xz/list.c:79
+msgid "Unknown-12"
+msgstr "Inconnue-12"
+
+#: src/xz/list.c:80
+msgid "Unknown-13"
+msgstr "Inconnue-13"
+
+#: src/xz/list.c:81
+msgid "Unknown-14"
+msgstr "Inconnue-14"
+
+#: src/xz/list.c:82
+msgid "Unknown-15"
+msgstr "Inconnue-15"
+
+#: src/xz/list.c:126
+#, c-format
+msgid "%s: File is empty"
+msgstr "%s : Le fichier est vide"
+
+#: src/xz/list.c:131
+#, c-format
+msgid "%s: Too small to be a valid .xz file"
+msgstr "%s : Trop petit pour être un fichier xz valide."
+
+#. TRANSLATORS: These are column headings. From Strms (Streams)
+#. to Ratio, the columns are right aligned. Check and Filename
+#. are left aligned. If you need longer words, it's OK to
+#. use two lines here. Test with "xz -l foo.xz".
+#: src/xz/list.c:612
+msgid "Strms Blocks Compressed Uncompressed Ratio Check Filename"
+msgstr "Flux Blocs Compressé Décompressé Ratio Vérif Nom de fichier"
+
+#: src/xz/list.c:652
+#, c-format
+msgid " Streams: %s\n"
+msgstr " Flux : %s\n"
+
+#: src/xz/list.c:654
+#, c-format
+msgid " Blocks: %s\n"
+msgstr " Blocs : %s\n"
+
+#: src/xz/list.c:656
+#, c-format
+msgid " Compressed size: %s\n"
+msgstr " Taille compressé : %s\n"
+
+#: src/xz/list.c:659
+#, c-format
+msgid " Uncompressed size: %s\n"
+msgstr " Taille décompressé : %s\n"
+
+#: src/xz/list.c:662
+#, c-format
+msgid " Ratio: %s\n"
+msgstr " Ratio : %s\n"
+
+#: src/xz/list.c:664
+#, c-format
+msgid " Check: %s\n"
+msgstr " Vérification : %s\n"
+
+#: src/xz/list.c:665
+#, c-format
+msgid " Stream padding: %s\n"
+msgstr " Octets de rembourrage du flux : %s\n"
+
+#. TRANSLATORS: The second line is column headings. All except
+#. Check are right aligned; Check is left aligned. Test with
+#. "xz -lv foo.xz".
+#: src/xz/list.c:693
+msgid ""
+" Streams:\n"
+" Stream Blocks CompOffset UncompOffset CompSize UncompSize Ratio Check Padding"
+msgstr ""
+" Flux :\n"
+" Flux Blocs PositionComp PositionDécomp TailleComp TailleDécomp Ratio Vérif. Bourrage"
+
+#. TRANSLATORS: The second line is column headings. All
+#. except Check are right aligned; Check is left aligned.
+#: src/xz/list.c:748
+#, c-format
+msgid ""
+" Blocks:\n"
+" Stream Block CompOffset UncompOffset TotalSize UncompSize Ratio Check"
+msgstr ""
+" Blocs :\n"
+" Flux Bloc PositionComp PositionDécomp TailleTot TailleDécomp Ratio Vérif."
+
+#. TRANSLATORS: These are additional column headings
+#. for the most verbose listing mode. CheckVal
+#. (Check value), Flags, and Filters are left aligned.
+#. Header (Block Header Size), CompSize, and MemUsage
+#. are right aligned. %*s is replaced with 0-120
+#. spaces to make the CheckVal column wide enough.
+#. Test with "xz -lvv foo.xz".
+#: src/xz/list.c:760
+#, c-format
+msgid " CheckVal %*s Header Flags CompSize MemUsage Filters"
+msgstr " ValVérif %*sEn-tête Drapeaux TailleComp UtilMém Filtres"
+
+#: src/xz/list.c:838 src/xz/list.c:1007
+#, c-format
+msgid " Memory needed: %s MiB\n"
+msgstr " Mémoire nécessaire : %s MiB\n"
+
+#: src/xz/list.c:840 src/xz/list.c:1009
+#, c-format
+msgid " Sizes in headers: %s\n"
+msgstr " Tailles stockées dans l'en-tête : %s\n"
+
+#: src/xz/list.c:841 src/xz/list.c:1010
+msgid "Yes"
+msgstr "Oui"
+
+#: src/xz/list.c:841 src/xz/list.c:1010
+msgid "No"
+msgstr "Non"
+
+#. TRANSLATORS: %s is an integer. Only the plural form of this
+#. message is used (e.g. "2 files"). Test with "xz -l foo.xz bar.xz".
+#: src/xz/list.c:986
+#, c-format
+msgid "%s file\n"
+msgid_plural "%s files\n"
+msgstr[0] "%s fichier\n"
+msgstr[1] "%s fichiers\n"
+
+#: src/xz/list.c:999
+msgid "Totals:"
+msgstr "Totaux :"
+
+#: src/xz/list.c:1000
+#, c-format
+msgid " Number of files: %s\n"
+msgstr " Nombre de fichiers : %s\n"
+
+#: src/xz/list.c:1072
+msgid "--list works only on .xz files (--format=xz or --format=auto)"
+msgstr "--list ne marche que sur les fichiers .xz (--format=xz ou --format=auto)"
+
+#: src/xz/list.c:1078
+msgid "--list does not support reading from standard input"
+msgstr "--list est incompatible avec la lecture sur l'entrée standard"
+
+#: src/xz/main.c:89
+#, c-format
+msgid "%s: Error reading filenames: %s"
+msgstr "%s : Erreur lors de la lecture des noms de fichiers : %s"
+
+#: src/xz/main.c:96
+#, c-format
+msgid "%s: Unexpected end of input when reading filenames"
+msgstr "%s : Fin des données inattendue lors de la lecture des noms de fichiers"
+
+#: src/xz/main.c:120
+#, c-format
+msgid "%s: Null character found when reading filenames; maybe you meant to use `--files0' instead of `--files'?"
+msgstr "%s : Caractère NULL détecté lors de la lecture des noms de fichiers ; peut-être pensiez-vous à `--files0' plutot qu'a `--files' ?"
+
+#: src/xz/main.c:174
+msgid "Compression and decompression with --robot are not supported yet."
+msgstr "La compression et la décompression ne marchent pas encore avec --robot."
+
+#: src/xz/main.c:231
+msgid "Cannot read data from standard input when reading filenames from standard input"
+msgstr "Impossible de lire à la fois les données et les noms de fichiers depuis l'entrée standard"
+
+#. TRANSLATORS: This is the program name in the beginning
+#. of the line in messages. Usually it becomes "xz: ".
+#. This is a translatable string because French needs
+#. a space before a colon.
+#: src/xz/message.c:733
+#, c-format
+msgid "%s: "
+msgstr "%s : "
+
+#: src/xz/message.c:796 src/xz/message.c:846
+msgid "Internal error (bug)"
+msgstr "Erreur interne (bug)"
+
+#: src/xz/message.c:803
+msgid "Cannot establish signal handlers"
+msgstr "Impossible d'installer le gestionnaire de signaux"
+
+#: src/xz/message.c:812
+msgid "No integrity check; not verifying file integrity"
+msgstr "Pas de données de vérification d'intégrité ; vérification non effectuée"
+
+#: src/xz/message.c:815
+msgid "Unsupported type of integrity check; not verifying file integrity"
+msgstr "Méthode de vérification d'intégrité non prise en charge ; vérification non effectuée"
+
+#: src/xz/message.c:822
+msgid "Memory usage limit reached"
+msgstr "Limite d'utilisation mémoire atteinte"
+
+#: src/xz/message.c:825
+msgid "File format not recognized"
+msgstr "Format de fichier inconnu"
+
+#: src/xz/message.c:828
+msgid "Unsupported options"
+msgstr "Options non prises en charge"
+
+#: src/xz/message.c:831
+msgid "Compressed data is corrupt"
+msgstr "Les données compressées sont corrompues"
+
+#: src/xz/message.c:834
+msgid "Unexpected end of input"
+msgstr "Fin des données inattendue "
+
+#: src/xz/message.c:885
+#, c-format
+msgid "%s MiB of memory is required. The limit is %s."
+msgstr "%s MiB de mémoire sont nécessaires, la limite étant %s."
+
+#: src/xz/message.c:1052
+#, c-format
+msgid "%s: Filter chain: %s\n"
+msgstr "%s : Enchaînement de filtres : %s\n"
+
+#: src/xz/message.c:1062
+#, c-format
+msgid "Try `%s --help' for more information."
+msgstr "Utilisez `%s --help' pour plus d'informations."
+
+#: src/xz/message.c:1088
+#, c-format
+msgid ""
+"Usage: %s [OPTION]... [FILE]...\n"
+"Compress or decompress FILEs in the .xz format.\n"
+"\n"
+msgstr ""
+"Utilisation : %s [OPTION]... [FICHIER]...\n"
+"Compresse ou decompresse FICHIER(s) au format .xz.\n"
+"\n"
+
+#: src/xz/message.c:1095
+msgid "Mandatory arguments to long options are mandatory for short options too.\n"
+msgstr ""
+"Les arguments obligatoires pour les options longues le sont aussi pour les\n"
+"options courtes.\n"
+
+#: src/xz/message.c:1099
+msgid " Operation mode:\n"
+msgstr " Mode d'opération :\n"
+
+#: src/xz/message.c:1102
+msgid ""
+" -z, --compress force compression\n"
+" -d, --decompress force decompression\n"
+" -t, --test test compressed file integrity\n"
+" -l, --list list information about .xz files"
+msgstr ""
+" -z, --compress forcer la compression\n"
+" -d, --decompress forcer la décompression\n"
+" -t, --test tester l'intégrité du fichier compressé\n"
+" -l, --list lister les informations à propos des fichiers .xz"
+
+#: src/xz/message.c:1108
+msgid ""
+"\n"
+" Operation modifiers:\n"
+msgstr ""
+"\n"
+" Modifictauers :\n"
+
+#: src/xz/message.c:1111
+msgid ""
+" -k, --keep keep (don't delete) input files\n"
+" -f, --force force overwrite of output file and (de)compress links\n"
+" -c, --stdout write to standard output and don't delete input files"
+msgstr ""
+" -k, --keep ne pas supprimer les fichiers d'entrée (\"keep\")\n"
+" -f, --force forcer l'écrasement du fichier de sortie et\n"
+" (dé)compresser les liens\n"
+" -c, --stdout écrire sur la sortie standard et ne pas supprimer les\n"
+" fichiers d'entrée"
+
+#: src/xz/message.c:1117
+msgid ""
+" --single-stream decompress only the first stream, and silently\n"
+" ignore possible remaining input data"
+msgstr ""
+" --single-stream décompresser uniquement le premier flux et ignorer\n"
+" silenciseusement les données éventuellement restantes"
+
+#: src/xz/message.c:1120
+msgid ""
+" --no-sparse do not create sparse files when decompressing\n"
+" -S, --suffix=.SUF use the suffix `.SUF' on compressed files\n"
+" --files[=FILE] read filenames to process from FILE; if FILE is\n"
+" omitted, filenames are read from the standard input;\n"
+" filenames must be terminated with the newline character\n"
+" --files0[=FILE] like --files but use the null character as terminator"
+msgstr ""
+" --no-sparse ne pas créer de 'sparse file' lors de la décompression\n"
+" -S, --suffix=.SUF utiliser le suffixe `.SUF' pour les fichiers compressés\n"
+" --files[=FILE] lire les fichiers sur lesquels opérer depuis FILE ; si\n"
+" FILE est omis, ceux-ci sont lus depuis l'entrée standard\n"
+" et doivent être suivis d'un caractère de retour à la ligne\n"
+" --files0[=FILE] comme --files mais avec un caractère null comme séparateur"
+
+#: src/xz/message.c:1129
+msgid ""
+"\n"
+" Basic file format and compression options:\n"
+msgstr ""
+"\n"
+" Options basiques de format de fichier et de compression :\n"
+
+#: src/xz/message.c:1131
+msgid ""
+" -F, --format=FMT file format to encode or decode; possible values are\n"
+" `auto' (default), `xz', `lzma', and `raw'\n"
+" -C, --check=CHECK integrity check type: `none' (use with caution),\n"
+" `crc32', `crc64' (default), or `sha256'"
+msgstr ""
+" -F, --format=FMT format de fichier à encoder ou décoder ; les possibilités\n"
+" sont : `auto' (par défaut), `xz', `lzma' et `raw'\n"
+" -C, --check=CHECK type de vérification d'intégrité : `none' (à utiliser avec\n"
+" précaution), `crc32', `crc64' (par défaut) ou `sha256'"
+
+#: src/xz/message.c:1138
+msgid ""
+" -0 ... -9 compression preset; default is 6; take compressor *and*\n"
+" decompressor memory usage into account before using 7-9!"
+msgstr ""
+" -0 ... -9 préréglage de compression ; 6 par défaut ; pensez à\n"
+" l'utilisation mémoire du compresseur *et* du décompresseur\n"
+" avant d'utiliser 7, 8 ou 9 !"
+
+#: src/xz/message.c:1142
+msgid ""
+" -e, --extreme try to improve compression ratio by using more CPU time;\n"
+" does not affect decompressor memory requirements"
+msgstr ""
+" -e, --extreme essayer d'améliorer la compression en utilisant davantage\n"
+" de temps processeur sans affecter les besoins mémoire du\n"
+" décompresseur"
+
+#: src/xz/message.c:1147
+msgid ""
+" --block-size=SIZE\n"
+" when compressing to the .xz format, start a new block\n"
+" after every SIZE bytes of input; 0=disabled (default)"
+msgstr ""
+" --block-size=SIZE\n"
+" pour une compression au format .xz, entamer un nouveau\n"
+" bloc après SIZE octets d'entrée ; 0=désactivé (par défaut)"
+
+#: src/xz/message.c:1151
+#, no-c-format
+msgid ""
+" --memlimit-compress=LIMIT\n"
+" --memlimit-decompress=LIMIT\n"
+" -M, --memlimit=LIMIT\n"
+" set memory usage limit for compression, decompression,\n"
+" or both; LIMIT is in bytes, % of RAM, or 0 for defaults"
+msgstr ""
+" --memlimit-compress=LIMIT\n"
+" --memlimit-decompress=LIMIT\n"
+" -M, --memlimit=LIMIT\n"
+" règle la limite d'utilisation mémoire pour la compression,\n"
+" décompression ou les deux ; LIMIT est en octets, % de\n"
+" RAM, ou 0 pour les valeurs par défaut"
+
+#: src/xz/message.c:1158
+msgid ""
+" --no-adjust if compression settings exceed the memory usage limit,\n"
+" give an error instead of adjusting the settings downwards"
+msgstr ""
+" --no-adjust si les réglages de compression dépassent la limite\n"
+" d'utilisation mémoire, renvoyer une erreur plutôt que de\n"
+" diminuer les réglages"
+
+#: src/xz/message.c:1164
+msgid ""
+"\n"
+" Custom filter chain for compression (alternative for using presets):"
+msgstr ""
+"\n"
+" Enchaînement de filtres de compression personnalisé (au lieu des préréglages) :"
+
+#: src/xz/message.c:1173
+msgid ""
+"\n"
+" --lzma1[=OPTS] LZMA1 or LZMA2; OPTS is a comma-separated list of zero or\n"
+" --lzma2[=OPTS] more of the following options (valid values; default):\n"
+" preset=PRE reset options to a preset (0-9[e])\n"
+" dict=NUM dictionary size (4KiB - 1536MiB; 8MiB)\n"
+" lc=NUM number of literal context bits (0-4; 3)\n"
+" lp=NUM number of literal position bits (0-4; 0)\n"
+" pb=NUM number of position bits (0-4; 2)\n"
+" mode=MODE compression mode (fast, normal; normal)\n"
+" nice=NUM nice length of a match (2-273; 64)\n"
+" mf=NAME match finder (hc3, hc4, bt2, bt3, bt4; bt4)\n"
+" depth=NUM maximum search depth; 0=automatic (default)"
+msgstr ""
+"\n"
+" --lzma1[=OPTS] LZMA1 ou LZMA2 ; OPTS est une liste de zéro ou plusieurs\n"
+" --lzma2[=OPTS] options parmi les suivantes (vals. valides ; par défaut) :\n"
+" preset=PRE remettre les options à un préréglage (0-9[e])\n"
+" dict=NUM taille dictionnaire (4KiB - 1536MiB ; 8MiB)\n"
+" lc=NUM nombre de 'literal context bits' (0-4 ; 3)\n"
+" lp=NUM nombre de 'literal position bits' (0-4 ; 0)\n"
+" pb=NUM nombre de 'position bits' (0-4 ; 2)\n"
+" mode=MODE mode de compression (fast, normal ; normal)\n"
+" nice=NUM nice length of a match (2-273; 64)\n"
+" mf=NAME 'match finder' (hc3, hc4, bt2, bt3, bt4; bt4)\n"
+" depth=NUM profondeur de recherche maximale ;\n"
+" 0=automatique (par défaut)"
+
+#: src/xz/message.c:1188
+msgid ""
+"\n"
+" --x86[=OPTS] x86 BCJ filter (32-bit and 64-bit)\n"
+" --powerpc[=OPTS] PowerPC BCJ filter (big endian only)\n"
+" --ia64[=OPTS] IA-64 (Itanium) BCJ filter\n"
+" --arm[=OPTS] ARM BCJ filter (little endian only)\n"
+" --armthumb[=OPTS] ARM-Thumb BCJ filter (little endian only)\n"
+" --sparc[=OPTS] SPARC BCJ filter\n"
+" Valid OPTS for all BCJ filters:\n"
+" start=NUM start offset for conversions (default=0)"
+msgstr ""
+"\n"
+" --x86[=OPTS] filtre BCJ x86 (32-bit et 64-bit)\n"
+" --powerpc[=OPTS] filtre BCJ PowerPC ('big endian' uniquement)\n"
+" --ia64[=OPTS] filtre BCJ IA-64 (Itanium)\n"
+" --arm[=OPTS] filtre BCJ ARM ('little endian' uniquement)\n"
+" --armthumb[=OPTS] filtre BCJ ARM-Thumb ('little endian' uniquement)\n"
+" --sparc[=OPTS] filtre BCJ SPARC\n"
+" OPTS valides pour tous les filtres BCJ :\n"
+" start=NUM start offset for conversions (default=0)"
+
+#: src/xz/message.c:1200
+msgid ""
+"\n"
+" --delta[=OPTS] Delta filter; valid OPTS (valid values; default):\n"
+" dist=NUM distance between bytes being subtracted\n"
+" from each other (1-256; 1)"
+msgstr ""
+"\n"
+" --delta[=OPTS] Filtre delta ; OPTS valides (vals. valides ; par défaut) :\n"
+" dist=NUM distance entre les octets soustraits\n"
+" les uns aux autres (1-256 ; 1)"
+
+#: src/xz/message.c:1208
+msgid ""
+"\n"
+" Other options:\n"
+msgstr ""
+"\n"
+" Autres options :\n"
+
+#: src/xz/message.c:1211
+msgid ""
+" -q, --quiet suppress warnings; specify twice to suppress errors too\n"
+" -v, --verbose be verbose; specify twice for even more verbose"
+msgstr ""
+" -q, --quiet supprimer les avertissemnts ; spécifier deux fois pour\n"
+" aussi supprimer les erreur\n"
+" -v, --verbose être bavard ; spécifier deux fois pour l'être davantage"
+
+#: src/xz/message.c:1216
+msgid " -Q, --no-warn make warnings not affect the exit status"
+msgstr " -Q, --no-warn les avertissements ne modifient pas le code de sortie"
+
+#: src/xz/message.c:1218
+msgid " --robot use machine-parsable messages (useful for scripts)"
+msgstr ""
+" --robot utiliser des messages lisibles par un programme\n"
+" (utile pour les scripts)"
+
+#: src/xz/message.c:1221
+msgid ""
+" --info-memory display the total amount of RAM and the currently active\n"
+" memory usage limits, and exit"
+msgstr ""
+" --info-memory affiche la quantité totale de RAM et la limite actuelle\n"
+" en mémoire puis quitte"
+
+#: src/xz/message.c:1224
+msgid ""
+" -h, --help display the short help (lists only the basic options)\n"
+" -H, --long-help display this long help and exit"
+msgstr ""
+" -h, --help affiche l'aide courte (ne liste que les options de base)\n"
+" -H, --long-help affiche l'aide longue (ceci) puis quitte"
+
+#: src/xz/message.c:1228
+msgid ""
+" -h, --help display this short help and exit\n"
+" -H, --long-help display the long help (lists also the advanced options)"
+msgstr ""
+" -h, --help affiche l'aide courte (ceci) puis quitte\n"
+" -H, --long-help affiche l'aide longue (liste aussi les options avancées)"
+
+#: src/xz/message.c:1233
+msgid " -V, --version display the version number and exit"
+msgstr " -V, --version affiche le numéro de version puis quitte"
+
+#: src/xz/message.c:1235
+msgid ""
+"\n"
+"With no FILE, or when FILE is -, read standard input.\n"
+msgstr ""
+"\n"
+"Sans FILE ou quand FILE est -, lire l'entrée standard.\n"
+
+#. TRANSLATORS: This message indicates the bug reporting address
+#. for this package. Please add _another line_ saying
+#. "Report translation bugs to <...>\n" with the email or WWW
+#. address for translation bugs. Thanks.
+#: src/xz/message.c:1241
+#, c-format
+msgid "Report bugs to <%s> (in English or Finnish).\n"
+msgstr ""
+"Signaler les bogues à <%s> (en anglais ou en finlandais).\n"
+"Signaler les bogues de traduction à <camaradetux@gmail.com>.\n"
+
+#: src/xz/message.c:1243
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "%s page du projet : <%s>\n"
+
+#: src/xz/options.c:86
+#, c-format
+msgid "%s: Options must be `name=value' pairs separated with commas"
+msgstr "%s: Les options doivent être des paires `nom=valeur' séparées par des virgules"
+
+#: src/xz/options.c:93
+#, c-format
+msgid "%s: Invalid option name"
+msgstr "%s : Nom d'option invalide"
+
+#: src/xz/options.c:113
+#, c-format
+msgid "%s: Invalid option value"
+msgstr "%s : Valeur d'option invalide"
+
+#: src/xz/options.c:247
+#, c-format
+msgid "Unsupported LZMA1/LZMA2 preset: %s"
+msgstr "Préréglage LZMA1/LZMA2 non pris en charge : %s"
+
+#: src/xz/options.c:355
+msgid "The sum of lc and lp must not exceed 4"
+msgstr "La somme de lc et lp ne doit pas dépasser 4"
+
+#: src/xz/options.c:359
+#, c-format
+msgid "The selected match finder requires at least nice=%<PRIu32>"
+msgstr "Le `match finder' choisi nécessite au moins nice=%<PRIu32>"
+
+#: src/xz/suffix.c:133 src/xz/suffix.c:258
+#, c-format
+msgid "%s: With --format=raw, --suffix=.SUF is required unless writing to stdout"
+msgstr "%s : Avec --format=raw, --suffix=.SUF est nécessaire sauf lors de l'écriture vers stdout"
+
+#: src/xz/suffix.c:164
+#, c-format
+msgid "%s: Filename has an unknown suffix, skipping"
+msgstr "%s : Le fichier a un suffixe inconnu, ignoré"
+
+#: src/xz/suffix.c:185
+#, c-format
+msgid "%s: File already has `%s' suffix, skipping"
+msgstr "%s : Le fichier a déjà le suffixe '%s', ignoré"
+
+#: src/xz/suffix.c:393
+#, c-format
+msgid "%s: Invalid filename suffix"
+msgstr "%s: Suffixe de nom de fichier invalide"
+
+#: src/xz/util.c:61
+#, c-format
+msgid "%s: Value is not a non-negative decimal integer"
+msgstr "%s : La valeur n'est pas un entier décimal non négatif"
+
+#: src/xz/util.c:103
+#, c-format
+msgid "%s: Invalid multiplier suffix"
+msgstr "%s : Suffixe multiplicateur invalide"
+
+#: src/xz/util.c:105
+msgid "Valid suffixes are `KiB' (2^10), `MiB' (2^20), and `GiB' (2^30)."
+msgstr "Les suffixes valides sont 'KiB' (2^10), 'MiB' (2^20) et 'GiB' (2^30)."
+
+#: src/xz/util.c:122
+#, c-format
+msgid "Value of the option `%s' must be in the range [%<PRIu64>, %<PRIu64>]"
+msgstr "La valeur de l'option '%s' doit être inclue entre %<PRIu64> et %<PRIu64>"
+
+#: src/xz/util.c:247
+msgid "Empty filename, skipping"
+msgstr "Nom de fichier vide, ignoré"
+
+#: src/xz/util.c:261
+msgid "Compressed data cannot be read from a terminal"
+msgstr "Les données compressées ne peuvent pas être lues depuis un terminal"
+
+#: src/xz/util.c:274
+msgid "Compressed data cannot be written to a terminal"
+msgstr "Les données compressées ne peuvent pas être écrites dans un terminal"
+
+#: src/common/tuklib_exit.c:39
+msgid "Writing to standard output failed"
+msgstr "Impossible d'écrire vers la sortie standard"
+
+#: src/common/tuklib_exit.c:42
+msgid "Unknown error"
+msgstr "Erreur inconnue"
diff --git a/contrib/xz/po/it.po b/contrib/xz/po/it.po
index 8e096dd..ea6f858 100644
--- a/contrib/xz/po/it.po
+++ b/contrib/xz/po/it.po
@@ -2,78 +2,83 @@
# This file is in the public domain
# Gruppo traduzione italiano di Ubuntu-it <gruppo-traduzione@ubuntu-it.org>, 2009, 2010
# Lorenzo De Liso <blackz@ubuntu.com>, 2010.
-# Milo Casagrande <milo@ubuntu.com>, 2009, 2010.
+# Milo Casagrande <milo@ubuntu.com>, 2009, 2010, 2011.
+#
msgid ""
msgstr ""
"Project-Id-Version: xz-utils\n"
-"Report-Msgid-Bugs-To: lasse.collin@tukaani.org\n"
-"POT-Creation-Date: 2010-09-10 14:50+0300\n"
-"PO-Revision-Date: 2010-09-16 21:32+0200\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2011-05-27 11:42+0200\n"
+"PO-Revision-Date: 2011-05-27 11:43+0200\n"
"Last-Translator: Milo Casagrande <milo@ubuntu.com>\n"
"Language-Team: Italian <tp@lists.linux.it>\n"
+"Language: it\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2010-08-16 19:16+0000\n"
"X-Generator: Launchpad (build Unknown)\n"
-"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+"Plural-Forms: nplurals=2; plural=(n != 1)\n"
-#: src/xz/args.c:333
+#: ../src/xz/args.c:333
#, c-format
msgid "%s: Unknown file format type"
-msgstr "%s: tipo di formato del file sconosciutoN"
+msgstr "%s: tipo di formato del file sconosciuto"
-#: src/xz/args.c:356 src/xz/args.c:364
+#: ../src/xz/args.c:356 ../src/xz/args.c:364
#, c-format
msgid "%s: Unsupported integrity check type"
msgstr "%s: tipo di controllo integrità non supportato"
-#: src/xz/args.c:382
+#: ../src/xz/args.c:382
msgid "Only one file can be specified with `--files' or `--files0'."
msgstr "Solo un file può essere specificato con \"--files\" o \"--files0\"."
-#: src/xz/args.c:445
+#: ../src/xz/args.c:445
#, c-format
msgid "The environment variable %s contains too many arguments"
msgstr "La variabile d'ambiente %s contiene troppi argomenti"
-#: src/xz/coder.c:95
+#: ../src/xz/coder.c:95
msgid "Maximum number of filters is four"
msgstr "Il numero massimo di filtri è quattro"
-#: src/xz/coder.c:108
+#: ../src/xz/coder.c:108
msgid "Memory usage limit is too low for the given filter setup."
msgstr ""
"Il limite dell'uso della memoria è troppo basso per l'impostazione del "
"filtro dato."
-#: src/xz/coder.c:129
+#. The message is shown only if warnings are allowed
+#. but the exit status isn't changed.
+#: ../src/xz/coder.c:129
msgid "Using a preset in raw mode is discouraged."
msgstr "Non è consigliato usare un preset nella modalità raw."
-#: src/xz/coder.c:131
+#: ../src/xz/coder.c:131
msgid "The exact options of the presets may vary between software versions."
msgstr ""
"Le opzioni esatte per i preset possono variare tra le versioni del software."
-#: src/xz/coder.c:157
+#: ../src/xz/coder.c:157
msgid "The .lzma format supports only the LZMA1 filter"
msgstr "Il formato .lzma supporta solo il filtro LZMA1"
-#: src/xz/coder.c:165
+#: ../src/xz/coder.c:165
msgid "LZMA1 cannot be used with the .xz format"
msgstr "LZMA1 non può essere usato con il formato .xz"
-#: src/xz/coder.c:182
+#: ../src/xz/coder.c:182
msgid "Unsupported filter chain or filter options"
msgstr "Catena di filtri od opzioni del filtro non supportata"
-#: src/xz/coder.c:190
+#: ../src/xz/coder.c:190
#, c-format
msgid "Decompression will need %s MiB of memory."
msgstr "L'estrazione necessita di %s MiB di memoria."
-#: src/xz/coder.c:247
+#. Tell the user that we decreased the dictionary size.
+#: ../src/xz/coder.c:247
#, c-format
msgid ""
"Adjusted LZMA%c dictionary size from %s MiB to %s MiB to not exceed the "
@@ -92,119 +97,128 @@ msgstr ""
#. it is possible that the user has put a new file in place
#. of the original file, and in that case it obviously
#. shouldn't be removed.
-#: src/xz/file_io.c:137
+#: ../src/xz/file_io.c:137
#, c-format
msgid "%s: File seems to have been moved, not removing"
msgstr "%s: sembra che il file sia stato spostato, non viene rimosso"
-#: src/xz/file_io.c:144 src/xz/file_io.c:590
+#: ../src/xz/file_io.c:144 ../src/xz/file_io.c:589
#, c-format
msgid "%s: Cannot remove: %s"
msgstr "%s: impossibile rimuovere: %s"
-#: src/xz/file_io.c:169
+#: ../src/xz/file_io.c:169
#, c-format
msgid "%s: Cannot set the file owner: %s"
msgstr "%s: impossibile impostare il proprietario del file: %s"
-#: src/xz/file_io.c:175
+#: ../src/xz/file_io.c:175
#, c-format
msgid "%s: Cannot set the file group: %s"
msgstr "%s: impossibile impostare il gruppo del file: %s"
-#: src/xz/file_io.c:194
+#: ../src/xz/file_io.c:194
#, c-format
msgid "%s: Cannot set the file permissions: %s"
msgstr "%s: impossibile impostare i permessi del file: %s"
-#: src/xz/file_io.c:337 src/xz/file_io.c:420
+#: ../src/xz/file_io.c:337 ../src/xz/file_io.c:420
#, c-format
msgid "%s: Is a symbolic link, skipping"
msgstr "%s: è un collegamento simbolico, viene saltato"
-#: src/xz/file_io.c:455
+#: ../src/xz/file_io.c:455
#, c-format
msgid "%s: Is a directory, skipping"
msgstr "%s: è una directory, viene saltata"
-#: src/xz/file_io.c:462
+#: ../src/xz/file_io.c:461
#, c-format
msgid "%s: Not a regular file, skipping"
msgstr "%s: non è un file regolare, viene saltato"
-#: src/xz/file_io.c:479
+#. gzip rejects setuid and setgid files even
+#. when --force was used. bzip2 doesn't check
+#. for them, but calls fchown() after fchmod(),
+#. and many systems automatically drop setuid
+#. and setgid bits there.
+#.
+#. We accept setuid and setgid files if
+#. --force was used. We drop these bits
+#. explicitly in io_copy_attr().
+#: ../src/xz/file_io.c:478
#, c-format
msgid "%s: File has setuid or setgid bit set, skipping"
msgstr "%s: il file ha il bit setuid o setgid impostato, viene saltato"
-#: src/xz/file_io.c:486
+#: ../src/xz/file_io.c:485
#, c-format
msgid "%s: File has sticky bit set, skipping"
msgstr "%s: il file ha lo sticky bit impostato, viene saltato"
-#: src/xz/file_io.c:493
+#: ../src/xz/file_io.c:492
#, c-format
msgid "%s: Input file has more than one hard link, skipping"
msgstr "%s: il file di input ha più di un collegamento fisico, viene saltato"
-#: src/xz/file_io.c:714
+#: ../src/xz/file_io.c:713
#, c-format
msgid "Error restoring the O_APPEND flag to standard output: %s"
msgstr "Errore nel ripristinare la flag O_APPEND sullo standard output: %s"
-#: src/xz/file_io.c:726
+#: ../src/xz/file_io.c:725
#, c-format
msgid "%s: Closing the file failed: %s"
msgstr "%s: chiusura del file non riuscita: %s"
-#: src/xz/file_io.c:762 src/xz/file_io.c:946
+#: ../src/xz/file_io.c:761 ../src/xz/file_io.c:945
#, c-format
msgid "%s: Seeking failed when trying to create a sparse file: %s"
msgstr ""
"%s: posizionamento non riuscito nel tentativo di creare un file sparso: %s"
-#: src/xz/file_io.c:821
+#: ../src/xz/file_io.c:820
#, c-format
msgid "%s: Read error: %s"
msgstr "%s: errore di lettura: %s"
-#: src/xz/file_io.c:844
+#: ../src/xz/file_io.c:843
#, c-format
msgid "%s: Error seeking the file: %s"
msgstr "%s: errore nel cercare il file: %s"
-#: src/xz/file_io.c:854
+#: ../src/xz/file_io.c:853
#, c-format
msgid "%s: Unexpected end of file"
msgstr "%s: fine del file inaspettata"
-#: src/xz/file_io.c:904
+#: ../src/xz/file_io.c:903
#, c-format
msgid "%s: Write error: %s"
msgstr "%s: errore di scrittura: %s"
-#: src/xz/hardware.c:100
+#: ../src/xz/hardware.c:100
msgid "Disabled"
msgstr "Disabilitato"
#. TRANSLATORS: Test with "xz --info-memory" to see if
#. the alignment looks nice.
-#: src/xz/hardware.c:119
+#: ../src/xz/hardware.c:119
msgid "Total amount of physical memory (RAM): "
msgstr "Quantità totale di memoria fisica (RAM): "
-#: src/xz/hardware.c:121
+#: ../src/xz/hardware.c:121
msgid "Memory usage limit for compression: "
msgstr "Limite utilizzo memoria per la compressione: "
-#: src/xz/hardware.c:123
+#: ../src/xz/hardware.c:123
msgid "Memory usage limit for decompression: "
msgstr "Limite utilizzo memoria per l'estrazione: "
#. TRANSLATORS: Indicates that there is no integrity check.
#. This string is used in tables, so the width must not
#. exceed ten columns with a fixed-width font.
-#: src/xz/list.c:62
+#: ../src/xz/list.c:62
msgid "None"
msgstr "Nessuno"
@@ -212,61 +226,61 @@ msgstr "Nessuno"
#. but the Check ID is known (here 2). This and other "Unknown-N"
#. strings are used in tables, so the width must not exceed ten
#. columns with a fixed-width font. It's OK to omit the dash if
-#. you need space for one extra letter.
-#: src/xz/list.c:69
+#. you need space for one extra letter, but don't use spaces.
+#: ../src/xz/list.c:69
msgid "Unknown-2"
msgstr "Sconosc2"
-#: src/xz/list.c:70
+#: ../src/xz/list.c:70
msgid "Unknown-3"
msgstr "Sconosc3"
-#: src/xz/list.c:72
+#: ../src/xz/list.c:72
msgid "Unknown-5"
msgstr "Sconosc5"
-#: src/xz/list.c:73
+#: ../src/xz/list.c:73
msgid "Unknown-6"
msgstr "Sconosc6"
-#: src/xz/list.c:74
+#: ../src/xz/list.c:74
msgid "Unknown-7"
msgstr "Sconosc7"
-#: src/xz/list.c:75
+#: ../src/xz/list.c:75
msgid "Unknown-8"
msgstr "Sconosc8"
-#: src/xz/list.c:76
+#: ../src/xz/list.c:76
msgid "Unknown-9"
msgstr "Sconosc9"
-#: src/xz/list.c:78
+#: ../src/xz/list.c:78
msgid "Unknown-11"
msgstr "Sconosc11"
-#: src/xz/list.c:79
+#: ../src/xz/list.c:79
msgid "Unknown-12"
msgstr "Sconosc12"
-#: src/xz/list.c:80
+#: ../src/xz/list.c:80
msgid "Unknown-13"
msgstr "Sconosc13"
-#: src/xz/list.c:81
+#: ../src/xz/list.c:81
msgid "Unknown-14"
msgstr "Sconosc14"
-#: src/xz/list.c:82
+#: ../src/xz/list.c:82
msgid "Unknown-15"
msgstr "Sconosc15"
-#: src/xz/list.c:126
+#: ../src/xz/list.c:126
#, c-format
msgid "%s: File is empty"
msgstr "%s: il file è vuoto"
-#: src/xz/list.c:131
+#: ../src/xz/list.c:131
#, c-format
msgid "%s: Too small to be a valid .xz file"
msgstr "%s: troppo piccolo per essere un file .xz valido"
@@ -275,49 +289,51 @@ msgstr "%s: troppo piccolo per essere un file .xz valido"
#. to Ratio, the columns are right aligned. Check and Filename
#. are left aligned. If you need longer words, it's OK to
#. use two lines here. Test with "xz -l foo.xz".
-#: src/xz/list.c:612
+#: ../src/xz/list.c:612
msgid "Strms Blocks Compressed Uncompressed Ratio Check Filename"
msgstr " Strm Blocc. Compresso Estratto Rapp. Contr Nome file"
-#: src/xz/list.c:652
+#: ../src/xz/list.c:652
#, c-format
msgid " Streams: %s\n"
msgstr " Stream: %s\n"
-#: src/xz/list.c:654
+#: ../src/xz/list.c:654
#, c-format
msgid " Blocks: %s\n"
msgstr " Blocchi: %s\n"
-#: src/xz/list.c:656
+#: ../src/xz/list.c:656
#, c-format
msgid " Compressed size: %s\n"
msgstr " Dim. compresso: %s\n"
-#: src/xz/list.c:659
+#: ../src/xz/list.c:659
#, c-format
msgid " Uncompressed size: %s\n"
msgstr " Dim. estratto: %s\n"
-#: src/xz/list.c:662
+#: ../src/xz/list.c:662
#, c-format
msgid " Ratio: %s\n"
msgstr " Rapporto: %s\n"
-#: src/xz/list.c:664
+#: ../src/xz/list.c:664
#, c-format
msgid " Check: %s\n"
msgstr " Controllo: %s\n"
-#: src/xz/list.c:665
+#: ../src/xz/list.c:665
#, c-format
msgid " Stream padding: %s\n"
msgstr " Padding dello stream: %s\n"
+#. Print information about the Streams.
+#.
#. TRANSLATORS: The second line is column headings. All except
#. Check are right aligned; Check is left aligned. Test with
#. "xz -lv foo.xz".
-#: src/xz/list.c:693
+#: ../src/xz/list.c:693
msgid ""
" Streams:\n"
" Stream Blocks CompOffset UncompOffset CompSize "
@@ -329,7 +345,7 @@ msgstr ""
#. TRANSLATORS: The second line is column headings. All
#. except Check are right aligned; Check is left aligned.
-#: src/xz/list.c:748
+#: ../src/xz/list.c:748
#, c-format
msgid ""
" Blocks:\n"
@@ -347,66 +363,74 @@ msgstr ""
#. are right aligned. %*s is replaced with 0-120
#. spaces to make the CheckVal column wide enough.
#. Test with "xz -lvv foo.xz".
-#: src/xz/list.c:760
+#: ../src/xz/list.c:760
#, c-format
msgid " CheckVal %*s Header Flags CompSize MemUsage Filters"
msgstr " Val.cont %*s Header Flag Dim.compr. Uso mem. Filtri"
-#: src/xz/list.c:838 src/xz/list.c:1007
+#: ../src/xz/list.c:838 ../src/xz/list.c:1007
#, c-format
msgid " Memory needed: %s MiB\n"
msgstr " Memoria necessaria: %s MiB\n"
-#: src/xz/list.c:840 src/xz/list.c:1009
+#: ../src/xz/list.c:840 ../src/xz/list.c:1009
#, c-format
msgid " Sizes in headers: %s\n"
msgstr " Dim. negli header: %s\n"
-#: src/xz/list.c:841 src/xz/list.c:1010
+#: ../src/xz/list.c:841 ../src/xz/list.c:1010
msgid "Yes"
msgstr "Sì"
-#: src/xz/list.c:841 src/xz/list.c:1010
+#: ../src/xz/list.c:841 ../src/xz/list.c:1010
msgid "No"
msgstr "No"
+#. Since we print totals only when there are at least two files,
+#. the English message will always use "%s files". But some other
+#. languages need different forms for different plurals so we
+#. have to translate this with ngettext().
+#.
#. TRANSLATORS: %s is an integer. Only the plural form of this
#. message is used (e.g. "2 files"). Test with "xz -l foo.xz bar.xz".
-#: src/xz/list.c:986
+#: ../src/xz/list.c:986
#, c-format
msgid "%s file\n"
msgid_plural "%s files\n"
msgstr[0] "%s file\n"
msgstr[1] "%s file\n"
-#: src/xz/list.c:999
+#: ../src/xz/list.c:999
msgid "Totals:"
msgstr "Totali:"
-#: src/xz/list.c:1000
+#: ../src/xz/list.c:1000
#, c-format
msgid " Number of files: %s\n"
msgstr " Numero di file: %s\n"
-#: src/xz/list.c:1072
+#: ../src/xz/list.c:1072
msgid "--list works only on .xz files (--format=xz or --format=auto)"
msgstr "--list funziona solamente con file .xz (--format=xz o --format=auto)"
-#: src/xz/list.c:1078
+#: ../src/xz/list.c:1078
msgid "--list does not support reading from standard input"
msgstr "--list non è in grado di leggere dallo standard input"
-#: src/xz/main.c:89
+#: ../src/xz/main.c:89
#, c-format
msgid "%s: Error reading filenames: %s"
msgstr "%s: errore nel leggere i nomi dei file: %s"
-#: src/xz/main.c:96
+#: ../src/xz/main.c:96
#, c-format
msgid "%s: Unexpected end of input when reading filenames"
msgstr "%s: fine dell'input durante la lettura dei nomi dei file non attesa"
-#: src/xz/main.c:120
+#. A null character was found when using --files,
+#. which expects plain text input separated with
+#. newlines.
+#: ../src/xz/main.c:120
#, c-format
msgid ""
"%s: Null character found when reading filenames; maybe you meant to use `--"
@@ -415,11 +439,11 @@ msgstr ""
"%s: nessun carattere trovato durante la lettura dei nomi dei file; forse si "
"intendeva usare \"--files0\" invece di \"--files\"?"
-#: src/xz/main.c:174
+#: ../src/xz/main.c:174
msgid "Compression and decompression with --robot are not supported yet."
msgstr "La compressione e l'estrazione con --robot non sono ancora supportate."
-#: src/xz/main.c:231
+#: ../src/xz/main.c:231
msgid ""
"Cannot read data from standard input when reading filenames from standard "
"input"
@@ -427,61 +451,72 @@ msgstr ""
"Impossibile leggere i dati dallo standard input durante la lettura dei nomi "
"dei file dallo standard input"
-#: src/xz/message.c:800 src/xz/message.c:844
+#. TRANSLATORS: This is the program name in the beginning
+#. of the line in messages. Usually it becomes "xz: ".
+#. This is a translatable string because French needs
+#. a space before a colon.
+#: ../src/xz/message.c:733
+#, c-format
+msgid "%s: "
+msgstr "%s: "
+
+#: ../src/xz/message.c:796 ../src/xz/message.c:846
msgid "Internal error (bug)"
msgstr "Errore interno (bug)"
-#: src/xz/message.c:807
+#: ../src/xz/message.c:803
msgid "Cannot establish signal handlers"
msgstr "Impossibile stabilire i gestori dei segnali"
-#: src/xz/message.c:816
+#: ../src/xz/message.c:812
msgid "No integrity check; not verifying file integrity"
msgstr ""
"Nessun controllo d'integrità; l'integrità del file non viene verificata"
-#: src/xz/message.c:819
+#: ../src/xz/message.c:815
msgid "Unsupported type of integrity check; not verifying file integrity"
msgstr ""
"Tipo di controllo di integrità non supportato; l'integrità del file non "
"viene verificata"
-#: src/xz/message.c:826
+#: ../src/xz/message.c:822
msgid "Memory usage limit reached"
msgstr "Limite di utilizzo della memoria raggiunto"
-#: src/xz/message.c:829
+#: ../src/xz/message.c:825
msgid "File format not recognized"
msgstr "Formato di file non riconosciuto"
-#: src/xz/message.c:832
+#: ../src/xz/message.c:828
msgid "Unsupported options"
msgstr "Opzioni non supportate"
-#: src/xz/message.c:835
+#: ../src/xz/message.c:831
msgid "Compressed data is corrupt"
msgstr "I dati compressi sono danneggiati"
-#: src/xz/message.c:838
+#: ../src/xz/message.c:834
msgid "Unexpected end of input"
msgstr "Fine dell'input non attesa"
-#: src/xz/message.c:886
+#: ../src/xz/message.c:885
#, c-format
msgid "%s MiB of memory is required. The limit is %s."
msgstr "%s MiB di memoria sono richiesti. Il limite è %s."
-#: src/xz/message.c:1053
+#: ../src/xz/message.c:1052
#, c-format
msgid "%s: Filter chain: %s\n"
msgstr "%s: catena di filtri: %s\n"
-#: src/xz/message.c:1063
+#. Print this with V_WARNING instead of V_ERROR to prevent it from
+#. showing up when --quiet has been specified.
+#: ../src/xz/message.c:1062
#, c-format
msgid "Try `%s --help' for more information."
msgstr "Provare \"%s --help\" per maggiori informazioni."
-#: src/xz/message.c:1089
+#: ../src/xz/message.c:1088
#, c-format
msgid ""
"Usage: %s [OPTION]... [FILE]...\n"
@@ -492,18 +527,18 @@ msgstr ""
"Comprime o estrae i FILE nel formato .xz.\n"
"\n"
-#: src/xz/message.c:1096
+#: ../src/xz/message.c:1095
msgid ""
"Mandatory arguments to long options are mandatory for short options too.\n"
msgstr ""
"Gli argomenti obbligatori per le opzioni lunghe lo sono anche per quelle "
"brevi.\n"
-#: src/xz/message.c:1100
+#: ../src/xz/message.c:1099
msgid " Operation mode:\n"
msgstr " Modalità di operazione:\n"
-#: src/xz/message.c:1103
+#: ../src/xz/message.c:1102
msgid ""
" -z, --compress force compression\n"
" -d, --decompress force decompression\n"
@@ -515,7 +550,7 @@ msgstr ""
" -t, --test Verifica l'integrità dei file compressi\n"
" -l, --list Elenca informazioni sui file .xz"
-#: src/xz/message.c:1109
+#: ../src/xz/message.c:1108
msgid ""
"\n"
" Operation modifiers:\n"
@@ -523,7 +558,7 @@ msgstr ""
"\n"
" Modificatori di operazioni:\n"
-#: src/xz/message.c:1112
+#: ../src/xz/message.c:1111
msgid ""
" -k, --keep keep (don't delete) input files\n"
" -f, --force force overwrite of output file and (de)compress links\n"
@@ -536,7 +571,7 @@ msgstr ""
" -c, --stdout Scrive sullo standard output e non elimina i file di "
"input"
-#: src/xz/message.c:1118
+#: ../src/xz/message.c:1117
msgid ""
" --no-sparse do not create sparse files when decompressing\n"
" -S, --suffix=.SUF use the suffix `.SUF' on compressed files\n"
@@ -556,7 +591,7 @@ msgstr ""
" di newline\n"
" --files0=[FILE] Come --files ma usa il carattere null come terminatore"
-#: src/xz/message.c:1126
+#: ../src/xz/message.c:1125
msgid ""
"\n"
" Basic file format and compression options:\n"
@@ -564,7 +599,7 @@ msgstr ""
"\n"
" Formato file di base e opzioni di compressione:\n"
-#: src/xz/message.c:1128
+#: ../src/xz/message.c:1127
msgid ""
" -F, --format=FMT file format to encode or decode; possible values are\n"
" `auto' (default), `xz', `lzma', and `raw'\n"
@@ -579,12 +614,12 @@ msgstr ""
"attenzione),\n"
" \"crc32\", \"crc64\" (predefinito) o \"sha256\""
-#: src/xz/message.c:1135
+#: ../src/xz/message.c:1134
msgid ""
" -0 ... -9 compression preset; default is 6; take compressor "
"*and*\n"
-" decompressor memory usage into account before using 7-"
-"9!"
+" decompressor memory usage into account before using "
+"7-9!"
msgstr ""
" -0 ... -9 Preset di compressione; predefinito è 6; tenere a "
"mente\n"
@@ -592,7 +627,7 @@ msgstr ""
"prima\n"
" di usare 7-9"
-#: src/xz/message.c:1139
+#: ../src/xz/message.c:1138
msgid ""
" -e, --extreme try to improve compression ratio by using more CPU "
"time;\n"
@@ -603,7 +638,7 @@ msgstr ""
"di\n"
" memoria in fase di estrazione"
-#: src/xz/message.c:1144
+#: ../src/xz/message.c:1143
#, no-c-format
msgid ""
" --memlimit-compress=LIMIT\n"
@@ -621,7 +656,7 @@ msgstr ""
"byte,\n"
" % della memoria RAM oppure 0 per il valore predefinito"
-#: src/xz/message.c:1151
+#: ../src/xz/message.c:1150
msgid ""
" --no-adjust if compression settings exceed the memory usage "
"limit,\n"
@@ -633,7 +668,7 @@ msgstr ""
" utilizzo della memoria, lancia un errore invece di\n"
" utilizzare valori più piccoli"
-#: src/xz/message.c:1157
+#: ../src/xz/message.c:1156
msgid ""
"\n"
" Custom filter chain for compression (alternative for using presets):"
@@ -642,7 +677,7 @@ msgstr ""
" Catena di filtri personalizzati per la compressione (alternative per\n"
" l'utilizzo di preset):"
-#: src/xz/message.c:1166
+#: ../src/xz/message.c:1165
msgid ""
"\n"
" --lzma1[=OPTS] LZMA1 or LZMA2; OPTS is a comma-separated list of zero "
@@ -672,8 +707,8 @@ msgstr ""
" (4KiB - 1536MiB; 8MiB)\n"
" lc=NUM Numero di bit letterali di contesto (0-4; "
"3)\n"
-" lp=NUM Numero di bit letterali di posizione (0-"
-"4; 0)\n"
+" lp=NUM Numero di bit letterali di posizione "
+"(0-4; 0)\n"
" pb=NUM Numero di bit di posizione (0-4; 2)\n"
" mode=MODE Modalità di compressione\n"
" (fast, normal; normal)\n"
@@ -685,7 +720,7 @@ msgstr ""
"0=automatica\n"
" (predefinito)"
-#: src/xz/message.c:1181
+#: ../src/xz/message.c:1180
msgid ""
"\n"
" --x86[=OPTS] x86 BCJ filter (32-bit and 64-bit)\n"
@@ -708,7 +743,7 @@ msgstr ""
" start=NUM Offset iniziale per le conversioni\n"
" (predefinito=0)"
-#: src/xz/message.c:1193
+#: ../src/xz/message.c:1192
msgid ""
"\n"
" --delta[=OPTS] Delta filter; valid OPTS (valid values; default):\n"
@@ -720,7 +755,7 @@ msgstr ""
" dist=NUM Distanza tra byte sottratti\n"
" gli uni dagli altri (1-256; 1)"
-#: src/xz/message.c:1201
+#: ../src/xz/message.c:1200
msgid ""
"\n"
" Other options:\n"
@@ -728,7 +763,7 @@ msgstr ""
"\n"
" Altre opzioni:\n"
-#: src/xz/message.c:1204
+#: ../src/xz/message.c:1203
msgid ""
" -q, --quiet suppress warnings; specify twice to suppress errors "
"too\n"
@@ -741,16 +776,16 @@ msgstr ""
"ancora\n"
" più prolisso"
-#: src/xz/message.c:1209
+#: ../src/xz/message.c:1208
msgid " -Q, --no-warn make warnings not affect the exit status"
msgstr " -Q, --no-warn Gli avvisi non influenzano lo stato d'uscita"
-#: src/xz/message.c:1211
+#: ../src/xz/message.c:1210
msgid ""
" --robot use machine-parsable messages (useful for scripts)"
msgstr " --robot Usa messaggi analizzabili (utile per gli script)"
-#: src/xz/message.c:1214
+#: ../src/xz/message.c:1213
msgid ""
" --info-memory display the total amount of RAM and the currently "
"active\n"
@@ -760,7 +795,7 @@ msgstr ""
"attuale\n"
" attivo di utilizzo della memore ed esce"
-#: src/xz/message.c:1217
+#: ../src/xz/message.c:1216
msgid ""
" -h, --help display the short help (lists only the basic options)\n"
" -H, --long-help display this long help and exit"
@@ -768,7 +803,7 @@ msgstr ""
" -h, --help Stampa l'aiuto breve (elenca solo le opzioni di base)\n"
" -H, --long-help Stampa questo lungo aiuto ed esce"
-#: src/xz/message.c:1221
+#: ../src/xz/message.c:1220
msgid ""
" -h, --help display this short help and exit\n"
" -H, --long-help display the long help (lists also the advanced options)"
@@ -776,11 +811,11 @@ msgstr ""
" -h, --help Stampa questo breve aiuto ed esce\n"
" -H, --long-help Stampa l'aiuto lungo (elenca anche le opzioni avanzate)"
-#: src/xz/message.c:1226
+#: ../src/xz/message.c:1225
msgid " -V, --version display the version number and exit"
msgstr " -V, --version Stampa il numero della versione ed esce"
-#: src/xz/message.c:1228
+#: ../src/xz/message.c:1227
msgid ""
"\n"
"With no FILE, or when FILE is -, read standard input.\n"
@@ -792,51 +827,51 @@ msgstr ""
#. for this package. Please add _another line_ saying
#. "Report translation bugs to <...>\n" with the email or WWW
#. address for translation bugs. Thanks.
-#: src/xz/message.c:1234
+#: ../src/xz/message.c:1233
#, c-format
msgid "Report bugs to <%s> (in English or Finnish).\n"
msgstr ""
"Segnalare i bug a <%s> (in inglese o finlandese).\n"
"Segnalare i bug di traduzione a <tp@lists.linux.it>.\n"
-#: src/xz/message.c:1236
+#: ../src/xz/message.c:1235
#, c-format
msgid "%s home page: <%s>\n"
msgstr "Sito web di %s: <%s>\n"
-#: src/xz/options.c:86
+#: ../src/xz/options.c:86
#, c-format
msgid "%s: Options must be `name=value' pairs separated with commas"
msgstr ""
"%s: le opzioni devono essere coppie \"nome=valore\" separate da virgole"
-#: src/xz/options.c:93
+#: ../src/xz/options.c:93
#, c-format
msgid "%s: Invalid option name"
msgstr "%s: nome opzione non valido"
-#: src/xz/options.c:113
+#: ../src/xz/options.c:113
#, c-format
msgid "%s: Invalid option value"
msgstr "%s: valore dell'opzione non valido"
-#: src/xz/options.c:247
+#: ../src/xz/options.c:247
#, c-format
msgid "Unsupported LZMA1/LZMA2 preset: %s"
msgstr "Preset LZMA/LZMA2 non supportato: %s"
-#: src/xz/options.c:355
+#: ../src/xz/options.c:355
msgid "The sum of lc and lp must not exceed 4"
msgstr "La somma di lc e lp non deve superare 4"
-#: src/xz/options.c:359
+#: ../src/xz/options.c:359
#, c-format
msgid "The selected match finder requires at least nice=%<PRIu32>"
msgstr ""
-"Lo strumento per cercare corrispondenze selezionato richiede almeno nice=%"
-"<PRIu32>"
+"Lo strumento per cercare corrispondenze selezionato richiede almeno nice="
+"%<PRIu32>"
-#: src/xz/suffix.c:79 src/xz/suffix.c:164
+#: ../src/xz/suffix.c:101 ../src/xz/suffix.c:194
#, c-format
msgid ""
"%s: With --format=raw, --suffix=.SUF is required unless writing to stdout"
@@ -844,59 +879,59 @@ msgstr ""
"%s: con --format=raw, --suffix=.SUF è richiesto a meno che non si scriva "
"sullo stdout"
-#: src/xz/suffix.c:99
+#: ../src/xz/suffix.c:121
#, c-format
msgid "%s: Filename has an unknown suffix, skipping"
msgstr "%s: il nome del file ha un suffisso sconosciuto, viene saltato"
-#: src/xz/suffix.c:154
+#: ../src/xz/suffix.c:175 ../src/xz/suffix.c:184
#, c-format
msgid "%s: File already has `%s' suffix, skipping"
msgstr "%s: il file ha già il suffisso \"%s\", viene saltato"
-#: src/xz/suffix.c:205
+#: ../src/xz/suffix.c:235
#, c-format
msgid "%s: Invalid filename suffix"
msgstr "%s: suffisso del nome del file non valido"
-#: src/xz/util.c:61
+#: ../src/xz/util.c:61
#, c-format
msgid "%s: Value is not a non-negative decimal integer"
msgstr "%s: il valore non è un numero intero decimale non-negativo"
-#: src/xz/util.c:103
+#: ../src/xz/util.c:103
#, c-format
msgid "%s: Invalid multiplier suffix"
msgstr "%s: suffisso del moltiplicatore non valido"
-#: src/xz/util.c:105
+#: ../src/xz/util.c:105
msgid "Valid suffixes are `KiB' (2^10), `MiB' (2^20), and `GiB' (2^30)."
msgstr ""
"I suffissi validi sono \"KiB\" (2^10), \"MiB\" (2^20), e \"GiB\" (2^30)."
-#: src/xz/util.c:122
+#: ../src/xz/util.c:122
#, c-format
msgid "Value of the option `%s' must be in the range [%<PRIu64>, %<PRIu64>]"
msgstr ""
-"Il valore dell'opzione \"%s\" deve essere nell'intervallo [%<PRIu64>, %"
-"<PRIu64>]"
+"Il valore dell'opzione \"%s\" deve essere nell'intervallo [%<PRIu64>, "
+"%<PRIu64>]"
-#: src/xz/util.c:247
+#: ../src/xz/util.c:247
msgid "Empty filename, skipping"
msgstr "Nome file vuoto, viene saltato"
-#: src/xz/util.c:261
+#: ../src/xz/util.c:261
msgid "Compressed data cannot be read from a terminal"
msgstr "I dati compressi non possono essere letti da un terminale"
-#: src/xz/util.c:274
+#: ../src/xz/util.c:274
msgid "Compressed data cannot be written to a terminal"
msgstr "I dati compressi non possono essere scritti ad un terminale"
-#: src/common/tuklib_exit.c:39
+#: ../src/common/tuklib_exit.c:39
msgid "Writing to standard output failed"
msgstr "Scrittura sullo standard ouput non riuscita"
-#: src/common/tuklib_exit.c:42
+#: ../src/common/tuklib_exit.c:42
msgid "Unknown error"
msgstr "Errore sconosciuto"
diff --git a/contrib/xz/po/pl.po b/contrib/xz/po/pl.po
new file mode 100644
index 0000000..f359fae
--- /dev/null
+++ b/contrib/xz/po/pl.po
@@ -0,0 +1,825 @@
+# Polish translation for xz.
+# This file is in the public domain.
+# Jakub Bogusz <qboosh@pld-linux.org>, 2011.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: xz 5.0.1\n"
+"Report-Msgid-Bugs-To: lasse.collin@tukaani.org\n"
+"POT-Creation-Date: 2011-01-28 20:01+0200\n"
+"PO-Revision-Date: 2011-02-02 16:51+0100\n"
+"Last-Translator: Jakub Bogusz <qboosh@pld-linux.org>\n"
+"Language-Team: Polish <translation-team-pl@lists.sourceforge.net>\n"
+"Language: pl\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=3; plural=n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
+
+#: src/xz/args.c:333
+#, c-format
+msgid "%s: Unknown file format type"
+msgstr "%s: Nieznany typ formatu pliku"
+
+#: src/xz/args.c:356 src/xz/args.c:364
+#, c-format
+msgid "%s: Unsupported integrity check type"
+msgstr "%s: Nieobsługiwany typ kontroli spójności"
+
+#: src/xz/args.c:382
+msgid "Only one file can be specified with `--files' or `--files0'."
+msgstr "Wraz z opcją `--files' lub `--files0' można podać tylko jeden plik."
+
+#: src/xz/args.c:445
+#, c-format
+msgid "The environment variable %s contains too many arguments"
+msgstr "Zmienna środowiskowa %s zawiera zbyt dużo argumentów"
+
+#: src/xz/coder.c:95
+msgid "Maximum number of filters is four"
+msgstr "Maksymalna liczba filtrów to cztery"
+
+#: src/xz/coder.c:108
+msgid "Memory usage limit is too low for the given filter setup."
+msgstr "Limit użycia pamięci jest zbyt mały dla podanej konfiguracji filtra."
+
+#: src/xz/coder.c:129
+msgid "Using a preset in raw mode is discouraged."
+msgstr "Użycie ustawień predefiniowanych w trybie surowym jest odradzane."
+
+#: src/xz/coder.c:131
+msgid "The exact options of the presets may vary between software versions."
+msgstr "Dokładne opcje ustawień predefiniowanych mogą różnić się między wersjami oprogramowania."
+
+#: src/xz/coder.c:157
+msgid "The .lzma format supports only the LZMA1 filter"
+msgstr "Format .lzma obsługuje tylko filtr LZMA1"
+
+#: src/xz/coder.c:165
+msgid "LZMA1 cannot be used with the .xz format"
+msgstr "LZMA1 nie może być używany z formatem .xz"
+
+#: src/xz/coder.c:182
+msgid "Unsupported filter chain or filter options"
+msgstr "Nieobsługiwany łańcuch filtrów lub opcje filtra"
+
+#: src/xz/coder.c:190
+#, c-format
+msgid "Decompression will need %s MiB of memory."
+msgstr "Dekompresja będzie wymagała %s MiB pamięci."
+
+#: src/xz/coder.c:247
+#, c-format
+msgid "Adjusted LZMA%c dictionary size from %s MiB to %s MiB to not exceed the memory usage limit of %s MiB"
+msgstr "Skorygowano rozmiar słownika LZMA%c z %s MiB do %s MiB aby nie przekroczyć limitu użycia pamięci %s MiB"
+
+#. TRANSLATORS: When compression or decompression finishes,
+#. and xz is going to remove the source file, xz first checks
+#. if the source file still exists, and if it does, does its
+#. device and inode numbers match what xz saw when it opened
+#. the source file. If these checks fail, this message is
+#. shown, %s being the filename, and the file is not deleted.
+#. The check for device and inode numbers is there, because
+#. it is possible that the user has put a new file in place
+#. of the original file, and in that case it obviously
+#. shouldn't be removed.
+#: src/xz/file_io.c:137
+#, c-format
+msgid "%s: File seems to have been moved, not removing"
+msgstr "%s: Plik wygląda na przeniesiony, nie zostanie usunięty"
+
+#: src/xz/file_io.c:144 src/xz/file_io.c:589
+#, c-format
+msgid "%s: Cannot remove: %s"
+msgstr "%s: Nie można usunąć: %s"
+
+#: src/xz/file_io.c:169
+#, c-format
+msgid "%s: Cannot set the file owner: %s"
+msgstr "%s: Nie można ustawić właściciela pliku: %s"
+
+#: src/xz/file_io.c:175
+#, c-format
+msgid "%s: Cannot set the file group: %s"
+msgstr "%s: Nie można ustawić grupy pliku: %s"
+
+#: src/xz/file_io.c:194
+#, c-format
+msgid "%s: Cannot set the file permissions: %s"
+msgstr "%s: Nie można ustawić uprawnień pliku: %s"
+
+#: src/xz/file_io.c:337 src/xz/file_io.c:420
+#, c-format
+msgid "%s: Is a symbolic link, skipping"
+msgstr "%s: Jest dowiązaniem symbolicznym, pominięto"
+
+#: src/xz/file_io.c:455
+#, c-format
+msgid "%s: Is a directory, skipping"
+msgstr "%s: Jest katalogiem, pominięto"
+
+#: src/xz/file_io.c:461
+#, c-format
+msgid "%s: Not a regular file, skipping"
+msgstr "%s: Nie jest zwykłym plikiem, pominięto"
+
+#: src/xz/file_io.c:478
+#, c-format
+msgid "%s: File has setuid or setgid bit set, skipping"
+msgstr "%s: Plik ma ustawiony bit setuid lub setgid, pominięto"
+
+#: src/xz/file_io.c:485
+#, c-format
+msgid "%s: File has sticky bit set, skipping"
+msgstr "%s: Plik ma ustawiony bit sticky, pominięto"
+
+#: src/xz/file_io.c:492
+#, c-format
+msgid "%s: Input file has more than one hard link, skipping"
+msgstr "%s: Plik wejściowy ma więcej niż jedno dowiązanie zwykłe, pominięto"
+
+#: src/xz/file_io.c:713
+#, c-format
+msgid "Error restoring the O_APPEND flag to standard output: %s"
+msgstr "Błąd podczas odtwarzania flagi O_APPEND dla standardowego wyjścia: %s"
+
+#: src/xz/file_io.c:725
+#, c-format
+msgid "%s: Closing the file failed: %s"
+msgstr "%s: Zamknięcie pliku nie powiodło się: %s"
+
+#: src/xz/file_io.c:761 src/xz/file_io.c:945
+#, c-format
+msgid "%s: Seeking failed when trying to create a sparse file: %s"
+msgstr "%s: Zmiana pozycji nie powiodła się podczas próby utworzenia pliku rzadkiego: %s"
+
+#: src/xz/file_io.c:820
+#, c-format
+msgid "%s: Read error: %s"
+msgstr "%s: BÅ‚Ä…d odczytu: %s"
+
+#: src/xz/file_io.c:843
+#, c-format
+msgid "%s: Error seeking the file: %s"
+msgstr "%s: BÅ‚Ä…d podczas zmiany pozycji w pliku: %s"
+
+#: src/xz/file_io.c:853
+#, c-format
+msgid "%s: Unexpected end of file"
+msgstr "%s: Nieoczekiwany koniec pliku"
+
+#: src/xz/file_io.c:903
+#, c-format
+msgid "%s: Write error: %s"
+msgstr "%s: BÅ‚Ä…d zapisu: %s"
+
+#: src/xz/hardware.c:100
+msgid "Disabled"
+msgstr "Wyłączony"
+
+#. TRANSLATORS: Test with "xz --info-memory" to see if
+#. the alignment looks nice.
+#: src/xz/hardware.c:119
+msgid "Total amount of physical memory (RAM): "
+msgstr "Całkowita ilość pamięci fizycznej (RAM): "
+
+#: src/xz/hardware.c:121
+msgid "Memory usage limit for compression: "
+msgstr "Limit użycia pamięci dla kompresji: "
+
+#: src/xz/hardware.c:123
+msgid "Memory usage limit for decompression: "
+msgstr "Limit użycia pamięci dla dekompresji: "
+
+#. TRANSLATORS: Indicates that there is no integrity check.
+#. This string is used in tables, so the width must not
+#. exceed ten columns with a fixed-width font.
+#: src/xz/list.c:62
+msgid "None"
+msgstr "Brak"
+
+#. TRANSLATORS: Indicates that integrity check name is not known,
+#. but the Check ID is known (here 2). This and other "Unknown-N"
+#. strings are used in tables, so the width must not exceed ten
+#. columns with a fixed-width font. It's OK to omit the dash if
+#. you need space for one extra letter, but don't use spaces.
+#: src/xz/list.c:69
+msgid "Unknown-2"
+msgstr "Nieznany-2"
+
+#: src/xz/list.c:70
+msgid "Unknown-3"
+msgstr "Nieznany-3"
+
+#: src/xz/list.c:72
+msgid "Unknown-5"
+msgstr "Nieznany-5"
+
+#: src/xz/list.c:73
+msgid "Unknown-6"
+msgstr "Nieznany-6"
+
+#: src/xz/list.c:74
+msgid "Unknown-7"
+msgstr "Nieznany-7"
+
+#: src/xz/list.c:75
+msgid "Unknown-8"
+msgstr "Nieznany-8"
+
+#: src/xz/list.c:76
+msgid "Unknown-9"
+msgstr "Nieznany-9"
+
+#: src/xz/list.c:78
+msgid "Unknown-11"
+msgstr "Nieznany11"
+
+#: src/xz/list.c:79
+msgid "Unknown-12"
+msgstr "Nieznany12"
+
+#: src/xz/list.c:80
+msgid "Unknown-13"
+msgstr "Nieznany13"
+
+#: src/xz/list.c:81
+msgid "Unknown-14"
+msgstr "Nieznany14"
+
+#: src/xz/list.c:82
+msgid "Unknown-15"
+msgstr "Nieznany15"
+
+#: src/xz/list.c:126
+#, c-format
+msgid "%s: File is empty"
+msgstr "%s: Plik jest pusty"
+
+#: src/xz/list.c:131
+#, c-format
+msgid "%s: Too small to be a valid .xz file"
+msgstr "%s: Za mały na poprawny plik .xz"
+
+#. TRANSLATORS: These are column headings. From Strms (Streams)
+#. to Ratio, the columns are right aligned. Check and Filename
+#. are left aligned. If you need longer words, it's OK to
+#. use two lines here. Test with "xz -l foo.xz".
+#: src/xz/list.c:612
+msgid "Strms Blocks Compressed Uncompressed Ratio Check Filename"
+msgstr "Strum. Bloki Spakowany Rozpakowany Wsp. Kontrola Nazwa pliku"
+
+#: src/xz/list.c:652
+#, c-format
+msgid " Streams: %s\n"
+msgstr " Strumienie: %s\n"
+
+#: src/xz/list.c:654
+#, c-format
+msgid " Blocks: %s\n"
+msgstr " Bloki: %s\n"
+
+#: src/xz/list.c:656
+#, c-format
+msgid " Compressed size: %s\n"
+msgstr " Rozmiar spakowany: %s\n"
+
+#: src/xz/list.c:659
+#, c-format
+msgid " Uncompressed size: %s\n"
+msgstr " Rozmiar rozpakowany: %s\n"
+
+#: src/xz/list.c:662
+#, c-format
+msgid " Ratio: %s\n"
+msgstr " Współczynnik: %s\n"
+
+#: src/xz/list.c:664
+#, c-format
+msgid " Check: %s\n"
+msgstr " Kontrola spójności: %s\n"
+
+#: src/xz/list.c:665
+#, c-format
+msgid " Stream padding: %s\n"
+msgstr " Wyrównanie strumienia: %s\n"
+
+#. TRANSLATORS: The second line is column headings. All except
+#. Check are right aligned; Check is left aligned. Test with
+#. "xz -lv foo.xz".
+#: src/xz/list.c:693
+msgid ""
+" Streams:\n"
+" Stream Blocks CompOffset UncompOffset CompSize UncompSize Ratio Check Padding"
+msgstr ""
+" Strumienie:\n"
+" Strumień Bloki Offset spak. Offset rozp. Rozm.spak. Rozm.rozp. Wsp. Kontrola Wyrównanie"
+
+#. TRANSLATORS: The second line is column headings. All
+#. except Check are right aligned; Check is left aligned.
+#: src/xz/list.c:748
+#, c-format
+msgid ""
+" Blocks:\n"
+" Stream Block CompOffset UncompOffset TotalSize UncompSize Ratio Check"
+msgstr ""
+" Bloki:\n"
+" Strumień Blok Offset spak. Offset rozp. Rozm.całkowity Rozm.rozp. Wsp. Kontrola"
+
+#. TRANSLATORS: These are additional column headings
+#. for the most verbose listing mode. CheckVal
+#. (Check value), Flags, and Filters are left aligned.
+#. Header (Block Header Size), CompSize, and MemUsage
+#. are right aligned. %*s is replaced with 0-120
+#. spaces to make the CheckVal column wide enough.
+#. Test with "xz -lvv foo.xz".
+#: src/xz/list.c:760
+#, c-format
+msgid " CheckVal %*s Header Flags CompSize MemUsage Filters"
+msgstr " S.kontr. %*sNagłówek Flagi Rozm. spak. Uż.pamięci Filtry"
+
+#: src/xz/list.c:838 src/xz/list.c:1007
+#, c-format
+msgid " Memory needed: %s MiB\n"
+msgstr " Wymagana pamięć: %s MiB\n"
+
+#: src/xz/list.c:840 src/xz/list.c:1009
+#, c-format
+msgid " Sizes in headers: %s\n"
+msgstr " Rozmiar w nagłówkach: %s\n"
+
+#: src/xz/list.c:841 src/xz/list.c:1010
+msgid "Yes"
+msgstr "Tak"
+
+#: src/xz/list.c:841 src/xz/list.c:1010
+msgid "No"
+msgstr "Nie"
+
+#. TRANSLATORS: %s is an integer. Only the plural form of this
+#. message is used (e.g. "2 files"). Test with "xz -l foo.xz bar.xz".
+#: src/xz/list.c:986
+#, c-format
+msgid "%s file\n"
+msgid_plural "%s files\n"
+msgstr[0] "%s plik\n"
+msgstr[1] "%s pliki\n"
+msgstr[2] "%s plików\n"
+
+#: src/xz/list.c:999
+msgid "Totals:"
+msgstr "Sumarycznie:"
+
+#: src/xz/list.c:1000
+#, c-format
+msgid " Number of files: %s\n"
+msgstr " Liczba plików: %s\n"
+
+#: src/xz/list.c:1072
+msgid "--list works only on .xz files (--format=xz or --format=auto)"
+msgstr "--list działa tylko z plikami .xz (--format=xz lub --format=auto)"
+
+#: src/xz/list.c:1078
+msgid "--list does not support reading from standard input"
+msgstr "--list nie obsługuje odczytu ze standardowego wejścia"
+
+#: src/xz/main.c:89
+#, c-format
+msgid "%s: Error reading filenames: %s"
+msgstr "%s: Błąd odczytu nazw plików: %s"
+
+#: src/xz/main.c:96
+#, c-format
+msgid "%s: Unexpected end of input when reading filenames"
+msgstr "%s: Nieoczekiwany koniec wejścia podczas odczytu nazw plików"
+
+#: src/xz/main.c:120
+#, c-format
+msgid "%s: Null character found when reading filenames; maybe you meant to use `--files0' instead of `--files'?"
+msgstr "%s: Napotkano znak NUL podczas odczytu nazw plików; może miało być `--files0' zamiast `--files'?"
+
+#: src/xz/main.c:174
+msgid "Compression and decompression with --robot are not supported yet."
+msgstr "Kompresja i dekompresja z opcją --robot nie jest jeszcze obsługiwana."
+
+#: src/xz/main.c:231
+msgid "Cannot read data from standard input when reading filenames from standard input"
+msgstr "Nie można odczytać danych ze standardowego wejścia przy czytaniu nazw plików ze standardowego wejścia"
+
+#: src/xz/message.c:792 src/xz/message.c:842
+msgid "Internal error (bug)"
+msgstr "Błąd wewnętrzny"
+
+#: src/xz/message.c:799
+msgid "Cannot establish signal handlers"
+msgstr "Nie można ustawić obsługi sygnałów"
+
+#: src/xz/message.c:808
+msgid "No integrity check; not verifying file integrity"
+msgstr "Brak kontroli spójności; poprawność plików nie będzie weryfikowana"
+
+#: src/xz/message.c:811
+msgid "Unsupported type of integrity check; not verifying file integrity"
+msgstr "Nieobsługiwany typ kontroli spójności; poprawność plików nie będzie weryfikowana"
+
+#: src/xz/message.c:818
+msgid "Memory usage limit reached"
+msgstr "Osiągnięto limit użycia pamięci"
+
+#: src/xz/message.c:821
+msgid "File format not recognized"
+msgstr "Nie rozpoznany format pliku"
+
+#: src/xz/message.c:824
+msgid "Unsupported options"
+msgstr "Nieobsługiwane opcje"
+
+#: src/xz/message.c:827
+msgid "Compressed data is corrupt"
+msgstr "Dane skompresowane sÄ… uszkodzone"
+
+#: src/xz/message.c:830
+msgid "Unexpected end of input"
+msgstr "Nieoczekiwany koniec wejścia"
+
+#: src/xz/message.c:881
+#, c-format
+msgid "%s MiB of memory is required. The limit is %s."
+msgstr "Wymagane jest %s MiB pamięci. Limit to %s."
+
+#: src/xz/message.c:1048
+#, c-format
+msgid "%s: Filter chain: %s\n"
+msgstr "%s: ÅaÅ„cuch filtrów: %s\n"
+
+#: src/xz/message.c:1058
+#, c-format
+msgid "Try `%s --help' for more information."
+msgstr "Polecenie `%s --help' pokaże więcej informacji."
+
+#: src/xz/message.c:1084
+#, c-format
+msgid ""
+"Usage: %s [OPTION]... [FILE]...\n"
+"Compress or decompress FILEs in the .xz format.\n"
+"\n"
+msgstr ""
+"Składnia: %s [OPCJA]... [PLIK]...\n"
+"Kompresja lub dekompresja PLIKÓW w formacie .xz.\n"
+"\n"
+
+#: src/xz/message.c:1091
+msgid "Mandatory arguments to long options are mandatory for short options too.\n"
+msgstr ""
+"Argumenty obowiązkowe dla opcji długich są obowiązkowe również dla opcji\n"
+"krótkich.\n"
+
+#: src/xz/message.c:1095
+msgid " Operation mode:\n"
+msgstr " Tryb pracy:\n"
+
+#: src/xz/message.c:1098
+msgid ""
+" -z, --compress force compression\n"
+" -d, --decompress force decompression\n"
+" -t, --test test compressed file integrity\n"
+" -l, --list list information about .xz files"
+msgstr ""
+" -z, --compress wymuszenie kompresji\n"
+" -d, --decompress wymuszenie dekompresji\n"
+" -t, --test sprawdzenie spójności plików skompresowanych\n"
+" -l, --list wypisanie informacji o plikach .xz"
+
+#: src/xz/message.c:1104
+msgid ""
+"\n"
+" Operation modifiers:\n"
+msgstr ""
+"\n"
+" Modyfikatory operacji:\n"
+
+#: src/xz/message.c:1107
+msgid ""
+" -k, --keep keep (don't delete) input files\n"
+" -f, --force force overwrite of output file and (de)compress links\n"
+" -c, --stdout write to standard output and don't delete input files"
+msgstr ""
+" -k, --keep zachowanie (nieusuwanie) plików wejściowych\n"
+" -f, --force nadpisywanie plików wyjściowych i (de)kompresja dowiązań\n"
+" -c, --stdout zapis na standardowe wyjście, nieusuwanie plików wej."
+
+#: src/xz/message.c:1113
+msgid ""
+" --no-sparse do not create sparse files when decompressing\n"
+" -S, --suffix=.SUF use the suffix `.SUF' on compressed files\n"
+" --files[=FILE] read filenames to process from FILE; if FILE is\n"
+" omitted, filenames are read from the standard input;\n"
+" filenames must be terminated with the newline character\n"
+" --files0[=FILE] like --files but use the null character as terminator"
+msgstr ""
+" --no-sparse nietworzenie plików rzadkich podczas dekompresji\n"
+" -S, --suffix=.ROZ użycie rozszerzenia `.ROZ' dla plików skompresowanych\n"
+" --files[=PLIK] odczyt nazw plików do przetworzenia z PLIKU; jeśli PLIK\n"
+" nie został podany, nazwy są czytane ze standardowego\n"
+" wejścia; muszą być zakończone znakiem nowej linii\n"
+" --files0[=PLIK] podobnie do --files, ale znakiem kończącym musi być NUL"
+
+#: src/xz/message.c:1121
+msgid ""
+"\n"
+" Basic file format and compression options:\n"
+msgstr ""
+"\n"
+" Podstawowe opcje formatu pliku i kompresji:\n"
+
+#: src/xz/message.c:1123
+msgid ""
+" -F, --format=FMT file format to encode or decode; possible values are\n"
+" `auto' (default), `xz', `lzma', and `raw'\n"
+" -C, --check=CHECK integrity check type: `none' (use with caution),\n"
+" `crc32', `crc64' (default), or `sha256'"
+msgstr ""
+" -F, --format=FORM format pliki do kodowania lub dekodowania; możliwe to\n"
+" `auto' (domyślny), `xz', 'lzma' i `raw'\n"
+" -C, --check=TEST typ kontroli spójności: `none' (ostrożnie!),\n"
+" `crc32', `crc64' (domyślny) lub `sha256'"
+
+#: src/xz/message.c:1130
+msgid ""
+" -0 ... -9 compression preset; default is 6; take compressor *and*\n"
+" decompressor memory usage into account before using 7-9!"
+msgstr ""
+" -0 ... -9 predefiniowane opcje kompresji; domyślna to 6; przed\n"
+" użyciem wartości 7-9 należy wziąć pod uwagę wykorzystanie\n"
+" pamięci przy kompresji *oraz* dekompresji!"
+
+#: src/xz/message.c:1134
+msgid ""
+" -e, --extreme try to improve compression ratio by using more CPU time;\n"
+" does not affect decompressor memory requirements"
+msgstr ""
+" -e, --extreme próba poprawy współczynnika kompresji z użyciem większej\n"
+" ilości czasu procesora; nie wpływa na wymagania\n"
+" pamięciowe dekompresora"
+
+#: src/xz/message.c:1139
+#, no-c-format
+msgid ""
+" --memlimit-compress=LIMIT\n"
+" --memlimit-decompress=LIMIT\n"
+" -M, --memlimit=LIMIT\n"
+" set memory usage limit for compression, decompression,\n"
+" or both; LIMIT is in bytes, % of RAM, or 0 for defaults"
+msgstr ""
+" --memlimit-compress=LIMIT\n"
+" --memlimit-decompress=LIMIT\n"
+" -M, --memlimit=LIMIT\n"
+" ustawienie limitu użycia pamięci dla kompresji,\n"
+" dekompresji lub obu; LIMIT jest w bajtach, % RAM lub 0\n"
+" dla limitów domyślnych"
+
+#: src/xz/message.c:1146
+msgid ""
+" --no-adjust if compression settings exceed the memory usage limit,\n"
+" give an error instead of adjusting the settings downwards"
+msgstr ""
+" --no-adjust jeśli ustawienia kompresji przekraczają limit użycia\n"
+" pamięci, zostanie zgłoszony błąd zamiast zmniejszania\n"
+" ustawień"
+
+#: src/xz/message.c:1152
+msgid ""
+"\n"
+" Custom filter chain for compression (alternative for using presets):"
+msgstr ""
+"\n"
+" ÅaÅ„cuch wÅ‚asnych filtrów do kompresji (alternatywa do używania -0 .. -9):"
+
+#: src/xz/message.c:1161
+msgid ""
+"\n"
+" --lzma1[=OPTS] LZMA1 or LZMA2; OPTS is a comma-separated list of zero or\n"
+" --lzma2[=OPTS] more of the following options (valid values; default):\n"
+" preset=PRE reset options to a preset (0-9[e])\n"
+" dict=NUM dictionary size (4KiB - 1536MiB; 8MiB)\n"
+" lc=NUM number of literal context bits (0-4; 3)\n"
+" lp=NUM number of literal position bits (0-4; 0)\n"
+" pb=NUM number of position bits (0-4; 2)\n"
+" mode=MODE compression mode (fast, normal; normal)\n"
+" nice=NUM nice length of a match (2-273; 64)\n"
+" mf=NAME match finder (hc3, hc4, bt2, bt3, bt4; bt4)\n"
+" depth=NUM maximum search depth; 0=automatic (default)"
+msgstr ""
+"\n"
+" --lzma1[=OPCJE] LZMA1 lub LZMA2; OPCJE to oddzielona przecinkami lista\n"
+" --lzma2[=OPCJE] zera lub więcej następujących opcji (w nawiasach wartości\n"
+" poprawne; domyślne):\n"
+" preset=PRE ustawienie opcji na predefiniowane (0-9[e])\n"
+" dict=ILE rozmiar słownika (4KiB - 1536MiB; 8MiB)\n"
+" lc=ILE liczba bitów kontekstu literału (0-4; 3)\n"
+" lp=ILE liczba bitów pozycji literału (0-4; 0)\n"
+" pp=ILE liczba bitów pozycji (0-4; 2)\n"
+" mode=TRYB tryb kompresji (fast, normal; normal)\n"
+" nice=ILE długość dopasowania (2-273; 64)\n"
+" mf=NAZWA dopasowywacz (hc3, hc4, bt2, bt3, bt4; bt4)\n"
+" depth=ILE maks. głębokość szukania; 0=auto (domyślne)"
+
+#: src/xz/message.c:1176
+msgid ""
+"\n"
+" --x86[=OPTS] x86 BCJ filter (32-bit and 64-bit)\n"
+" --powerpc[=OPTS] PowerPC BCJ filter (big endian only)\n"
+" --ia64[=OPTS] IA-64 (Itanium) BCJ filter\n"
+" --arm[=OPTS] ARM BCJ filter (little endian only)\n"
+" --armthumb[=OPTS] ARM-Thumb BCJ filter (little endian only)\n"
+" --sparc[=OPTS] SPARC BCJ filter\n"
+" Valid OPTS for all BCJ filters:\n"
+" start=NUM start offset for conversions (default=0)"
+msgstr ""
+"\n"
+" --x86[=OPCJE] Filtr BCJ x86 (32-bitowy lub 64-bitowy)\n"
+" --powerpc[=OPCJE] Filtr BCJ PowerPC (tylko big-endian)\n"
+" --ia64[=OPCJE] Filtr BCJ IA-64 (Itanium)\n"
+" --arm[=OPCJE] Filtr BCJ ARM (tylko little-endian)\n"
+" --armthumb[=OPCJE] Filtr BCJ ARM-Thumb (tylko little-endian)\n"
+" --sparc[=OPCJE] Filtr BCJ SPARC\n"
+" Poprawne OPCJE dla wszystkich filtrów BCJ:\n"
+" start=ILE offset początku konwersji (domyślnie=0)"
+
+#: src/xz/message.c:1188
+msgid ""
+"\n"
+" --delta[=OPTS] Delta filter; valid OPTS (valid values; default):\n"
+" dist=NUM distance between bytes being subtracted\n"
+" from each other (1-256; 1)"
+msgstr ""
+"\n"
+" --delta[=OPCJE] Filtr delta; poprawne OPCJE (poprawne wart.; domyślne):\n"
+" dist=ILE odległość między bajtami odejmowanymi od\n"
+" siebie (1-256; 1)"
+
+#: src/xz/message.c:1196
+msgid ""
+"\n"
+" Other options:\n"
+msgstr ""
+"\n"
+" Inne opcje:\n"
+
+#: src/xz/message.c:1199
+msgid ""
+" -q, --quiet suppress warnings; specify twice to suppress errors too\n"
+" -v, --verbose be verbose; specify twice for even more verbose"
+msgstr ""
+" -q, --quiet pominięcie ostrzeżeń; dwukrotne podanie pomija też błędy\n"
+" -v, --verbose więcej informacji; dwukrotne podanie to jeszcze więcej"
+
+#: src/xz/message.c:1204
+msgid " -Q, --no-warn make warnings not affect the exit status"
+msgstr " -Q, --no-warn ostrzeżenia nie mają wpływu na status zakończenia"
+
+#: src/xz/message.c:1206
+msgid " --robot use machine-parsable messages (useful for scripts)"
+msgstr " --robot komunikaty w formacie dla maszyny (do skryptów)"
+
+#: src/xz/message.c:1209
+msgid ""
+" --info-memory display the total amount of RAM and the currently active\n"
+" memory usage limits, and exit"
+msgstr ""
+" --info-memory wyświetlenie całkowitej ilości pamięci RAM oraz aktualnie\n"
+" aktywnych limitów pamięci i zakończenie pracy"
+
+#: src/xz/message.c:1212
+msgid ""
+" -h, --help display the short help (lists only the basic options)\n"
+" -H, --long-help display this long help and exit"
+msgstr ""
+" -h, --help wyświetlenie krótkiego opisu (tylko podstawowe opcje)\n"
+" -H, --long-help wyświetlenie tego długiego opisu i zakończenie"
+
+#: src/xz/message.c:1216
+msgid ""
+" -h, --help display this short help and exit\n"
+" -H, --long-help display the long help (lists also the advanced options)"
+msgstr ""
+" -h, --help wyświetlenie tego krótkiego opisu i zakończenie\n"
+" -H, --long-help wyświetlenie długiego opisu (także opcje zaawansowane)"
+
+#: src/xz/message.c:1221
+msgid " -V, --version display the version number and exit"
+msgstr " -V, --version wyświetlenie informacji o wersji i zakończenie"
+
+#: src/xz/message.c:1223
+msgid ""
+"\n"
+"With no FILE, or when FILE is -, read standard input.\n"
+msgstr ""
+"\n"
+"Jeśli nie podano PLIKU lub PLIK to -, czytane jest standardowe wejście.\n"
+
+#. TRANSLATORS: This message indicates the bug reporting address
+#. for this package. Please add _another line_ saying
+#. "Report translation bugs to <...>\n" with the email or WWW
+#. address for translation bugs. Thanks.
+#: src/xz/message.c:1229
+#, c-format
+msgid "Report bugs to <%s> (in English or Finnish).\n"
+msgstr ""
+"Błędy prosimy zgłaszać na adres <%s>\n"
+"(w języku angielskim lub fińskim).\n"
+"Błędy w tłumaczeniu prosimy zgłaszać na adres\n"
+"<translation-team-pl@lists.sourceforge.net>.\n"
+
+#: src/xz/message.c:1231
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "Strona domowa %s: <%s>\n"
+
+#: src/xz/options.c:86
+#, c-format
+msgid "%s: Options must be `name=value' pairs separated with commas"
+msgstr "%s: Opcje muszą być parami `nazwa=wartość' rozdzielonymi przecinkami"
+
+#: src/xz/options.c:93
+#, c-format
+msgid "%s: Invalid option name"
+msgstr "%s: Błędna nazwa opcji"
+
+#: src/xz/options.c:113
+#, c-format
+msgid "%s: Invalid option value"
+msgstr "%s: Błędna wartość opcji"
+
+#: src/xz/options.c:247
+#, c-format
+msgid "Unsupported LZMA1/LZMA2 preset: %s"
+msgstr "Nieobsługiwane ustawienie predefiniowane LZMA1/LZMA2: %s"
+
+#: src/xz/options.c:355
+msgid "The sum of lc and lp must not exceed 4"
+msgstr "Suma lc i lp nie może przekroczyć 4"
+
+#: src/xz/options.c:359
+#, c-format
+msgid "The selected match finder requires at least nice=%<PRIu32>"
+msgstr "Wybrany dopasowywacz wymaga przynajmniej nice=%<PRIu32>"
+
+#: src/xz/suffix.c:104 src/xz/suffix.c:189
+#, c-format
+msgid "%s: With --format=raw, --suffix=.SUF is required unless writing to stdout"
+msgstr "%s: Przy --format=raw i zapisie do pliku wymagana jest opcja --suffix=.ROZ"
+
+#: src/xz/suffix.c:124
+#, c-format
+msgid "%s: Filename has an unknown suffix, skipping"
+msgstr "%s: Nazwa pliku ma nieznane rozszerzenie, pominięto"
+
+#: src/xz/suffix.c:179
+#, c-format
+msgid "%s: File already has `%s' suffix, skipping"
+msgstr "%s: Plik już ma rozszerzenie `%s', pominięto"
+
+#: src/xz/suffix.c:230
+#, c-format
+msgid "%s: Invalid filename suffix"
+msgstr "%s: Błędne rozszerzenie nazwy pliku"
+
+#: src/xz/util.c:61
+#, c-format
+msgid "%s: Value is not a non-negative decimal integer"
+msgstr "%s: Wartość nie jest nieujemną liczbą całkowitą"
+
+#: src/xz/util.c:103
+#, c-format
+msgid "%s: Invalid multiplier suffix"
+msgstr "%s: Błędny przyrostek mnożnika"
+
+#: src/xz/util.c:105
+msgid "Valid suffixes are `KiB' (2^10), `MiB' (2^20), and `GiB' (2^30)."
+msgstr "Poprawne przyrostki to `KiB' (2^10), `MiB' (2^20) i `GiB' (2^30)."
+
+#: src/xz/util.c:122
+#, c-format
+msgid "Value of the option `%s' must be in the range [%<PRIu64>, %<PRIu64>]"
+msgstr "Wartość opcji `%s' musi być w przedziale [%<PRIu64>, %<PRIu64>]"
+
+#: src/xz/util.c:247
+msgid "Empty filename, skipping"
+msgstr "Pusta nazwa pliku, pominięto"
+
+#: src/xz/util.c:261
+msgid "Compressed data cannot be read from a terminal"
+msgstr "Dane skompresowane nie mogą być czytane z terminala"
+
+#: src/xz/util.c:274
+msgid "Compressed data cannot be written to a terminal"
+msgstr "Dane skompresowane nie mogą być zapisywane na terminal"
+
+#: src/common/tuklib_exit.c:39
+msgid "Writing to standard output failed"
+msgstr "Zapis na standardowe wyjście nie powiódł się"
+
+#: src/common/tuklib_exit.c:42
+msgid "Unknown error"
+msgstr "Nieznany błąd"
diff --git a/contrib/xz/src/common/tuklib_open_stdxxx.c b/contrib/xz/src/common/tuklib_open_stdxxx.c
index 08bc60d..26702a6 100644
--- a/contrib/xz/src/common/tuklib_open_stdxxx.c
+++ b/contrib/xz/src/common/tuklib_open_stdxxx.c
@@ -39,12 +39,14 @@ tuklib_open_stdxxx(int err_status)
| (i == 0 ? O_WRONLY : O_RDONLY));
if (fd != i) {
+ if (fd != -1)
+ (void)close(fd);
+
// Something went wrong. Exit with the
// exit status we were given. Don't try
// to print an error message, since stderr
// may very well be non-existent. This
// error should be extremely rare.
- (void)close(fd);
exit(err_status);
}
}
diff --git a/contrib/xz/src/liblzma/api/lzma/block.h b/contrib/xz/src/liblzma/api/lzma/block.h
index 3019bf9..8a4bf23 100644
--- a/contrib/xz/src/liblzma/api/lzma/block.h
+++ b/contrib/xz/src/liblzma/api/lzma/block.h
@@ -483,6 +483,7 @@ extern LZMA_API(size_t) lzma_block_buffer_bound(size_t uncompressed_size)
*
* \return - LZMA_OK: Encoding was successful.
* - LZMA_BUF_ERROR: Not enough output buffer space.
+ * - LZMA_UNSUPPORTED_CHECK
* - LZMA_OPTIONS_ERROR
* - LZMA_MEM_ERROR
* - LZMA_DATA_ERROR
diff --git a/contrib/xz/src/liblzma/api/lzma/container.h b/contrib/xz/src/liblzma/api/lzma/container.h
index 83e70b4..7a9ffc6 100644
--- a/contrib/xz/src/liblzma/api/lzma/container.h
+++ b/contrib/xz/src/liblzma/api/lzma/container.h
@@ -66,6 +66,10 @@
* This function is a wrapper for lzma_raw_encoder_memusage().
*
* \param preset Compression preset (level and possible flags)
+ *
+ * \return Number of bytes of memory required for the given
+ * preset when encoding. If an error occurs, for example
+ * due to unsupported preset, UINT64_MAX is returned.
*/
extern LZMA_API(uint64_t) lzma_easy_encoder_memusage(uint32_t preset)
lzma_nothrow lzma_attr_pure;
@@ -77,6 +81,11 @@ extern LZMA_API(uint64_t) lzma_easy_encoder_memusage(uint32_t preset)
* This function is a wrapper for lzma_raw_decoder_memusage().
*
* \param preset Compression preset (level and possible flags)
+ *
+ * \return Number of bytes of memory required to decompress a file
+ * that was compressed using the given preset. If an error
+ * occurs, for example due to unsupported preset, UINT64_MAX
+ * is returned.
*/
extern LZMA_API(uint64_t) lzma_easy_decoder_memusage(uint32_t preset)
lzma_nothrow lzma_attr_pure;
@@ -148,6 +157,7 @@ extern LZMA_API(lzma_ret) lzma_easy_encoder(
*
* \return - LZMA_OK: Encoding was successful.
* - LZMA_BUF_ERROR: Not enough output buffer space.
+ * - LZMA_UNSUPPORTED_CHECK
* - LZMA_OPTIONS_ERROR
* - LZMA_MEM_ERROR
* - LZMA_DATA_ERROR
@@ -171,6 +181,7 @@ extern LZMA_API(lzma_ret) lzma_easy_buffer_encode(
*
* \return - LZMA_OK: Initialization was successful.
* - LZMA_MEM_ERROR
+ * - LZMA_UNSUPPORTED_CHECK
* - LZMA_OPTIONS_ERROR
* - LZMA_PROG_ERROR
*/
@@ -250,6 +261,7 @@ extern LZMA_API(size_t) lzma_stream_buffer_bound(size_t uncompressed_size)
*
* \return - LZMA_OK: Encoding was successful.
* - LZMA_BUF_ERROR: Not enough output buffer space.
+ * - LZMA_UNSUPPORTED_CHECK
* - LZMA_OPTIONS_ERROR
* - LZMA_MEM_ERROR
* - LZMA_DATA_ERROR
diff --git a/contrib/xz/src/liblzma/api/lzma/filter.h b/contrib/xz/src/liblzma/api/lzma/filter.h
index efd036f..e0bc163 100644
--- a/contrib/xz/src/liblzma/api/lzma/filter.h
+++ b/contrib/xz/src/liblzma/api/lzma/filter.h
@@ -131,7 +131,9 @@ extern LZMA_API(lzma_ret) lzma_filters_copy(const lzma_filter *src,
* .id == LZMA_VLI_UNKNOWN.
*
* \return Number of bytes of memory required for the given
- * filter chain when encoding.
+ * filter chain when encoding. If an error occurs,
+ * for example due to unsupported filter chain,
+ * UINT64_MAX is returned.
*/
extern LZMA_API(uint64_t) lzma_raw_encoder_memusage(const lzma_filter *filters)
lzma_nothrow lzma_attr_pure;
@@ -148,7 +150,9 @@ extern LZMA_API(uint64_t) lzma_raw_encoder_memusage(const lzma_filter *filters)
* .id == LZMA_VLI_UNKNOWN.
*
* \return Number of bytes of memory required for the given
- * filter chain when decoding.
+ * filter chain when decoding. If an error occurs,
+ * for example due to unsupported filter chain,
+ * UINT64_MAX is returned.
*/
extern LZMA_API(uint64_t) lzma_raw_decoder_memusage(const lzma_filter *filters)
lzma_nothrow lzma_attr_pure;
diff --git a/contrib/xz/src/liblzma/api/lzma/version.h b/contrib/xz/src/liblzma/api/lzma/version.h
index 43c211f..9226663 100644
--- a/contrib/xz/src/liblzma/api/lzma/version.h
+++ b/contrib/xz/src/liblzma/api/lzma/version.h
@@ -22,7 +22,7 @@
*/
#define LZMA_VERSION_MAJOR 5
#define LZMA_VERSION_MINOR 0
-#define LZMA_VERSION_PATCH 1
+#define LZMA_VERSION_PATCH 3
#define LZMA_VERSION_STABILITY LZMA_VERSION_STABILITY_STABLE
#ifndef LZMA_VERSION_COMMIT
diff --git a/contrib/xz/src/liblzma/common/alone_decoder.c b/contrib/xz/src/liblzma/common/alone_decoder.c
index 039b428..678c79e 100644
--- a/contrib/xz/src/liblzma/common/alone_decoder.c
+++ b/contrib/xz/src/liblzma/common/alone_decoder.c
@@ -46,7 +46,7 @@ struct lzma_coder_s {
static lzma_ret
alone_decode(lzma_coder *coder,
- lzma_allocator *allocator lzma_attribute((unused)),
+ lzma_allocator *allocator lzma_attribute((__unused__)),
const uint8_t *restrict in, size_t *restrict in_pos,
size_t in_size, uint8_t *restrict out,
size_t *restrict out_pos, size_t out_size,
diff --git a/contrib/xz/src/liblzma/common/alone_encoder.c b/contrib/xz/src/liblzma/common/alone_encoder.c
index d8c0170..eb1697e 100644
--- a/contrib/xz/src/liblzma/common/alone_encoder.c
+++ b/contrib/xz/src/liblzma/common/alone_encoder.c
@@ -32,7 +32,7 @@ struct lzma_coder_s {
static lzma_ret
alone_encode(lzma_coder *coder,
- lzma_allocator *allocator lzma_attribute((unused)),
+ lzma_allocator *allocator lzma_attribute((__unused__)),
const uint8_t *restrict in, size_t *restrict in_pos,
size_t in_size, uint8_t *restrict out,
size_t *restrict out_pos, size_t out_size,
@@ -103,7 +103,7 @@ alone_encoder_init(lzma_next_coder *next, lzma_allocator *allocator,
if (options->dict_size < LZMA_DICT_SIZE_MIN)
return LZMA_OPTIONS_ERROR;
- // Round up to to the next 2^n or 2^n + 2^(n - 1) depending on which
+ // Round up to the next 2^n or 2^n + 2^(n - 1) depending on which
// one is the next unless it is UINT32_MAX. While the header would
// allow any 32-bit integer, we do this to keep the decoder of liblzma
// accepting the resulting files.
diff --git a/contrib/xz/src/liblzma/common/block_buffer_encoder.c b/contrib/xz/src/liblzma/common/block_buffer_encoder.c
index a8f71c2..519c6a6 100644
--- a/contrib/xz/src/liblzma/common/block_buffer_encoder.c
+++ b/contrib/xz/src/liblzma/common/block_buffer_encoder.c
@@ -226,16 +226,23 @@ lzma_block_buffer_encode(lzma_block *block, lzma_allocator *allocator,
const uint8_t *in, size_t in_size,
uint8_t *out, size_t *out_pos, size_t out_size)
{
- // Sanity checks
- if (block == NULL || block->filters == NULL
- || (in == NULL && in_size != 0) || out == NULL
+ // Validate the arguments.
+ if (block == NULL || (in == NULL && in_size != 0) || out == NULL
|| out_pos == NULL || *out_pos > out_size)
return LZMA_PROG_ERROR;
- // Check the version field.
+ // The contents of the structure may depend on the version so
+ // check the version before validating the contents of *block.
if (block->version != 0)
return LZMA_OPTIONS_ERROR;
+ if ((unsigned int)(block->check) > LZMA_CHECK_ID_MAX
+ || block->filters == NULL)
+ return LZMA_PROG_ERROR;
+
+ if (!lzma_check_is_supported(block->check))
+ return LZMA_UNSUPPORTED_CHECK;
+
// Size of a Block has to be a multiple of four, so limit the size
// here already. This way we don't need to check it again when adding
// Block Padding.
@@ -243,8 +250,7 @@ lzma_block_buffer_encode(lzma_block *block, lzma_allocator *allocator,
// Get the size of the Check field.
const size_t check_size = lzma_check_size(block->check);
- if (check_size == UINT32_MAX)
- return LZMA_PROG_ERROR;
+ assert(check_size != UINT32_MAX);
// Reserve space for the Check field.
if (out_size - *out_pos <= check_size)
diff --git a/contrib/xz/src/liblzma/common/block_encoder.c b/contrib/xz/src/liblzma/common/block_encoder.c
index ca51523..1eeb502 100644
--- a/contrib/xz/src/liblzma/common/block_encoder.c
+++ b/contrib/xz/src/liblzma/common/block_encoder.c
@@ -144,7 +144,7 @@ block_encoder_end(lzma_coder *coder, lzma_allocator *allocator)
static lzma_ret
block_encoder_update(lzma_coder *coder, lzma_allocator *allocator,
- const lzma_filter *filters lzma_attribute((unused)),
+ const lzma_filter *filters lzma_attribute((__unused__)),
const lzma_filter *reversed_filters)
{
if (coder->sequence != SEQ_CODE)
@@ -161,6 +161,11 @@ lzma_block_encoder_init(lzma_next_coder *next, lzma_allocator *allocator,
{
lzma_next_coder_init(&lzma_block_encoder_init, next, allocator);
+ if (block == NULL)
+ return LZMA_PROG_ERROR;
+
+ // The contents of the structure may depend on the version so
+ // check the version first.
if (block->version != 0)
return LZMA_OPTIONS_ERROR;
diff --git a/contrib/xz/src/liblzma/common/common.c b/contrib/xz/src/liblzma/common/common.c
index 0408e15..b9e3860 100644
--- a/contrib/xz/src/liblzma/common/common.c
+++ b/contrib/xz/src/liblzma/common/common.c
@@ -35,7 +35,7 @@ lzma_version_string(void)
// Memory allocation //
///////////////////////
-extern void * lzma_attribute((malloc))
+extern void * lzma_attribute((__malloc__)) lzma_attr_alloc_size(1)
lzma_alloc(size_t size, lzma_allocator *allocator)
{
// Some malloc() variants return NULL if called with size == 0.
diff --git a/contrib/xz/src/liblzma/common/common.h b/contrib/xz/src/liblzma/common/common.h
index b819432..45aba4f 100644
--- a/contrib/xz/src/liblzma/common/common.h
+++ b/contrib/xz/src/liblzma/common/common.h
@@ -205,7 +205,7 @@ struct lzma_internal_s {
/// Allocates memory
extern void *lzma_alloc(size_t size, lzma_allocator *allocator)
- lzma_attribute((malloc)) lzma_attr_alloc_size(1);
+ lzma_attribute((__malloc__)) lzma_attr_alloc_size(1);
/// Frees memory
extern void lzma_free(void *ptr, lzma_allocator *allocator);
diff --git a/contrib/xz/src/liblzma/common/filter_common.c b/contrib/xz/src/liblzma/common/filter_common.c
index b157c62..7c95b05 100644
--- a/contrib/xz/src/liblzma/common/filter_common.c
+++ b/contrib/xz/src/liblzma/common/filter_common.c
@@ -43,7 +43,7 @@ static const struct {
.changes_size = true,
},
#endif
-#ifdef HAVE_DECODER_LZMA2
+#if defined(HAVE_ENCODER_LZMA2) || defined(HAVE_DECODER_LZMA2)
{
.id = LZMA_FILTER_LZMA2,
.options_size = sizeof(lzma_options_lzma),
@@ -52,7 +52,7 @@ static const struct {
.changes_size = true,
},
#endif
-#ifdef HAVE_DECODER_X86
+#if defined(HAVE_ENCODER_X86) || defined(HAVE_DECODER_X86)
{
.id = LZMA_FILTER_X86,
.options_size = sizeof(lzma_options_bcj),
@@ -70,7 +70,7 @@ static const struct {
.changes_size = false,
},
#endif
-#ifdef HAVE_DECODER_IA64
+#if defined(HAVE_ENCODER_IA64) || defined(HAVE_DECODER_IA64)
{
.id = LZMA_FILTER_IA64,
.options_size = sizeof(lzma_options_bcj),
diff --git a/contrib/xz/src/liblzma/common/index.c b/contrib/xz/src/liblzma/common/index.c
index ddb9d36..9af4bc1 100644
--- a/contrib/xz/src/liblzma/common/index.c
+++ b/contrib/xz/src/liblzma/common/index.c
@@ -398,10 +398,13 @@ extern LZMA_API(lzma_index *)
lzma_index_init(lzma_allocator *allocator)
{
lzma_index *i = index_init_plain(allocator);
+ if (i == NULL)
+ return NULL;
+
index_stream *s = index_stream_init(0, 0, 1, 0, allocator);
- if (i == NULL || s == NULL) {
- index_stream_end(s, allocator);
+ if (s == NULL) {
lzma_free(i, allocator);
+ return NULL;
}
index_tree_append(&i->streams, &s->node);
diff --git a/contrib/xz/src/liblzma/common/index_decoder.c b/contrib/xz/src/liblzma/common/index_decoder.c
index a6bc650..83c8a3af 100644
--- a/contrib/xz/src/liblzma/common/index_decoder.c
+++ b/contrib/xz/src/liblzma/common/index_decoder.c
@@ -56,10 +56,11 @@ struct lzma_coder_s {
static lzma_ret
index_decode(lzma_coder *coder, lzma_allocator *allocator,
const uint8_t *restrict in, size_t *restrict in_pos,
- size_t in_size, uint8_t *restrict out lzma_attribute((unused)),
- size_t *restrict out_pos lzma_attribute((unused)),
- size_t out_size lzma_attribute((unused)),
- lzma_action action lzma_attribute((unused)))
+ size_t in_size,
+ uint8_t *restrict out lzma_attribute((__unused__)),
+ size_t *restrict out_pos lzma_attribute((__unused__)),
+ size_t out_size lzma_attribute((__unused__)),
+ lzma_action action lzma_attribute((__unused__)))
{
// Similar optimization as in index_encoder.c
const size_t in_start = *in_pos;
diff --git a/contrib/xz/src/liblzma/common/index_encoder.c b/contrib/xz/src/liblzma/common/index_encoder.c
index c10d7af..45919f0 100644
--- a/contrib/xz/src/liblzma/common/index_encoder.c
+++ b/contrib/xz/src/liblzma/common/index_encoder.c
@@ -42,12 +42,13 @@ struct lzma_coder_s {
static lzma_ret
index_encode(lzma_coder *coder,
- lzma_allocator *allocator lzma_attribute((unused)),
- const uint8_t *restrict in lzma_attribute((unused)),
- size_t *restrict in_pos lzma_attribute((unused)),
- size_t in_size lzma_attribute((unused)),
+ lzma_allocator *allocator lzma_attribute((__unused__)),
+ const uint8_t *restrict in lzma_attribute((__unused__)),
+ size_t *restrict in_pos lzma_attribute((__unused__)),
+ size_t in_size lzma_attribute((__unused__)),
uint8_t *restrict out, size_t *restrict out_pos,
- size_t out_size, lzma_action action lzma_attribute((unused)))
+ size_t out_size,
+ lzma_action action lzma_attribute((__unused__)))
{
// Position where to start calculating CRC32. The idea is that we
// need to call lzma_crc32() only once per call to index_encode().
diff --git a/contrib/xz/src/liblzma/common/stream_buffer_encoder.c b/contrib/xz/src/liblzma/common/stream_buffer_encoder.c
index f727d85..2450ee2 100644
--- a/contrib/xz/src/liblzma/common/stream_buffer_encoder.c
+++ b/contrib/xz/src/liblzma/common/stream_buffer_encoder.c
@@ -51,6 +51,9 @@ lzma_stream_buffer_encode(lzma_filter *filters, lzma_check check,
|| out_pos_ptr == NULL || *out_pos_ptr > out_size)
return LZMA_PROG_ERROR;
+ if (!lzma_check_is_supported(check))
+ return LZMA_UNSUPPORTED_CHECK;
+
// Note for the paranoids: Index encoder prevents the Stream from
// getting too big and still being accepted with LZMA_OK, and Block
// encoder catches if the input is too big. So we don't need to
@@ -81,26 +84,32 @@ lzma_stream_buffer_encode(lzma_filter *filters, lzma_check check,
out_pos += LZMA_STREAM_HEADER_SIZE;
- // Block
+ // Encode a Block but only if there is at least one byte of input.
lzma_block block = {
.version = 0,
.check = check,
.filters = filters,
};
- return_if_error(lzma_block_buffer_encode(&block, allocator,
- in, in_size, out, &out_pos, out_size));
+ if (in_size > 0)
+ return_if_error(lzma_block_buffer_encode(&block, allocator,
+ in, in_size, out, &out_pos, out_size));
// Index
{
- // Create an Index with one Record.
+ // Create an Index. It will have one Record if there was
+ // at least one byte of input to encode. Otherwise the
+ // Index will be empty.
lzma_index *i = lzma_index_init(allocator);
if (i == NULL)
return LZMA_MEM_ERROR;
- lzma_ret ret = lzma_index_append(i, allocator,
- lzma_block_unpadded_size(&block),
- block.uncompressed_size);
+ lzma_ret ret = LZMA_OK;
+
+ if (in_size > 0)
+ ret = lzma_index_append(i, allocator,
+ lzma_block_unpadded_size(&block),
+ block.uncompressed_size);
// If adding the Record was successful, encode the Index
// and get its size which will be stored into Stream Footer.
diff --git a/contrib/xz/src/liblzma/common/stream_encoder.c b/contrib/xz/src/liblzma/common/stream_encoder.c
index 48d91da..97a7a23 100644
--- a/contrib/xz/src/liblzma/common/stream_encoder.c
+++ b/contrib/xz/src/liblzma/common/stream_encoder.c
@@ -280,6 +280,7 @@ lzma_stream_encoder_init(lzma_next_coder *next, lzma_allocator *allocator,
next->end = &stream_encoder_end;
next->update = &stream_encoder_update;
+ next->coder->filters[0].id = LZMA_VLI_UNKNOWN;
next->coder->block_encoder = LZMA_NEXT_CODER_INIT;
next->coder->index_encoder = LZMA_NEXT_CODER_INIT;
next->coder->index = NULL;
@@ -289,7 +290,6 @@ lzma_stream_encoder_init(lzma_next_coder *next, lzma_allocator *allocator,
next->coder->sequence = SEQ_STREAM_HEADER;
next->coder->block_options.version = 0;
next->coder->block_options.check = check;
- next->coder->filters[0].id = LZMA_VLI_UNKNOWN;
// Initialize the Index
lzma_index_end(next->coder->index, allocator);
diff --git a/contrib/xz/src/liblzma/delta/delta_encoder.c b/contrib/xz/src/liblzma/delta/delta_encoder.c
index ea1cc2c..15c7951 100644
--- a/contrib/xz/src/liblzma/delta/delta_encoder.c
+++ b/contrib/xz/src/liblzma/delta/delta_encoder.c
@@ -85,7 +85,7 @@ delta_encode(lzma_coder *coder, lzma_allocator *allocator,
static lzma_ret
delta_encoder_update(lzma_coder *coder, lzma_allocator *allocator,
- const lzma_filter *filters_null lzma_attribute((unused)),
+ const lzma_filter *filters_null lzma_attribute((__unused__)),
const lzma_filter *reversed_filters)
{
// Delta doesn't and will never support changing the options in
diff --git a/contrib/xz/src/liblzma/lz/lz_decoder.c b/contrib/xz/src/liblzma/lz/lz_decoder.c
index 2c57355..d74085c 100644
--- a/contrib/xz/src/liblzma/lz/lz_decoder.c
+++ b/contrib/xz/src/liblzma/lz/lz_decoder.c
@@ -126,7 +126,7 @@ decode_buffer(lzma_coder *coder,
static lzma_ret
lz_decode(lzma_coder *coder,
- lzma_allocator *allocator lzma_attribute((unused)),
+ lzma_allocator *allocator lzma_attribute((__unused__)),
const uint8_t *restrict in, size_t *restrict in_pos,
size_t in_size, uint8_t *restrict out,
size_t *restrict out_pos, size_t out_size,
diff --git a/contrib/xz/src/liblzma/lz/lz_encoder.c b/contrib/xz/src/liblzma/lz/lz_encoder.c
index 273f577..e240696 100644
--- a/contrib/xz/src/liblzma/lz/lz_encoder.c
+++ b/contrib/xz/src/liblzma/lz/lz_encoder.c
@@ -480,7 +480,7 @@ lz_encoder_end(lzma_coder *coder, lzma_allocator *allocator)
static lzma_ret
lz_encoder_update(lzma_coder *coder, lzma_allocator *allocator,
- const lzma_filter *filters_null lzma_attribute((unused)),
+ const lzma_filter *filters_null lzma_attribute((__unused__)),
const lzma_filter *reversed_filters)
{
if (coder->lz.options_update == NULL)
diff --git a/contrib/xz/src/liblzma/lz/lz_encoder_hash.h b/contrib/xz/src/liblzma/lz/lz_encoder_hash.h
index c398d7d..342a333 100644
--- a/contrib/xz/src/liblzma/lz/lz_encoder_hash.h
+++ b/contrib/xz/src/liblzma/lz/lz_encoder_hash.h
@@ -39,7 +39,7 @@
// Endianness doesn't matter in hash_2_calc() (no effect on the output).
#ifdef TUKLIB_FAST_UNALIGNED_ACCESS
# define hash_2_calc() \
- const uint32_t hash_value = *(const uint16_t *)(cur);
+ const uint32_t hash_value = *(const uint16_t *)(cur)
#else
# define hash_2_calc() \
const uint32_t hash_value \
diff --git a/contrib/xz/src/liblzma/lzma/lzma2_decoder.c b/contrib/xz/src/liblzma/lzma/lzma2_decoder.c
index f38879c..3e42575 100644
--- a/contrib/xz/src/liblzma/lzma/lzma2_decoder.c
+++ b/contrib/xz/src/liblzma/lzma/lzma2_decoder.c
@@ -67,6 +67,10 @@ lzma2_decode(lzma_coder *restrict coder, lzma_dict *restrict dict,
const uint32_t control = in[*in_pos];
++*in_pos;
+ // End marker
+ if (control == 0x00)
+ return LZMA_STREAM_END;
+
if (control >= 0xE0 || control == 1) {
// Dictionary reset implies that next LZMA chunk has
// to set new properties.
@@ -104,10 +108,6 @@ lzma2_decode(lzma_coder *restrict coder, lzma_dict *restrict dict,
&coder->options);
}
} else {
- // End marker
- if (control == 0x00)
- return LZMA_STREAM_END;
-
// Invalid control values
if (control > 2)
return LZMA_DATA_ERROR;
diff --git a/contrib/xz/src/liblzma/lzma/lzma2_encoder.c b/contrib/xz/src/liblzma/lzma/lzma2_encoder.c
index b48e0d6..992720c 100644
--- a/contrib/xz/src/liblzma/lzma/lzma2_encoder.c
+++ b/contrib/xz/src/liblzma/lzma/lzma2_encoder.c
@@ -374,7 +374,7 @@ lzma_lzma2_props_encode(const void *options, uint8_t *out)
const lzma_options_lzma *const opt = options;
uint32_t d = my_max(opt->dict_size, LZMA_DICT_SIZE_MIN);
- // Round up to to the next 2^n - 1 or 2^n + 2^(n - 1) - 1 depending
+ // Round up to the next 2^n - 1 or 2^n + 2^(n - 1) - 1 depending
// on which one is the next:
--d;
d |= d >> 2;
diff --git a/contrib/xz/src/liblzma/simple/arm.c b/contrib/xz/src/liblzma/simple/arm.c
index 8fcf643..a84702a 100644
--- a/contrib/xz/src/liblzma/simple/arm.c
+++ b/contrib/xz/src/liblzma/simple/arm.c
@@ -15,7 +15,7 @@
static size_t
-arm_code(lzma_simple *simple lzma_attribute((unused)),
+arm_code(lzma_simple *simple lzma_attribute((__unused__)),
uint32_t now_pos, bool is_encoder,
uint8_t *buffer, size_t size)
{
diff --git a/contrib/xz/src/liblzma/simple/armthumb.c b/contrib/xz/src/liblzma/simple/armthumb.c
index eb6a69d..4b49175 100644
--- a/contrib/xz/src/liblzma/simple/armthumb.c
+++ b/contrib/xz/src/liblzma/simple/armthumb.c
@@ -15,7 +15,7 @@
static size_t
-armthumb_code(lzma_simple *simple lzma_attribute((unused)),
+armthumb_code(lzma_simple *simple lzma_attribute((__unused__)),
uint32_t now_pos, bool is_encoder,
uint8_t *buffer, size_t size)
{
diff --git a/contrib/xz/src/liblzma/simple/ia64.c b/contrib/xz/src/liblzma/simple/ia64.c
index fd263d4..ce3692b 100644
--- a/contrib/xz/src/liblzma/simple/ia64.c
+++ b/contrib/xz/src/liblzma/simple/ia64.c
@@ -15,7 +15,7 @@
static size_t
-ia64_code(lzma_simple *simple lzma_attribute((unused)),
+ia64_code(lzma_simple *simple lzma_attribute((__unused__)),
uint32_t now_pos, bool is_encoder,
uint8_t *buffer, size_t size)
{
diff --git a/contrib/xz/src/liblzma/simple/powerpc.c b/contrib/xz/src/liblzma/simple/powerpc.c
index aaa14f2..6f83511 100644
--- a/contrib/xz/src/liblzma/simple/powerpc.c
+++ b/contrib/xz/src/liblzma/simple/powerpc.c
@@ -15,7 +15,7 @@
static size_t
-powerpc_code(lzma_simple *simple lzma_attribute((unused)),
+powerpc_code(lzma_simple *simple lzma_attribute((__unused__)),
uint32_t now_pos, bool is_encoder,
uint8_t *buffer, size_t size)
{
diff --git a/contrib/xz/src/liblzma/simple/simple_coder.c b/contrib/xz/src/liblzma/simple/simple_coder.c
index 06db86e..37de7fa 100644
--- a/contrib/xz/src/liblzma/simple/simple_coder.c
+++ b/contrib/xz/src/liblzma/simple/simple_coder.c
@@ -212,7 +212,7 @@ simple_coder_end(lzma_coder *coder, lzma_allocator *allocator)
static lzma_ret
simple_coder_update(lzma_coder *coder, lzma_allocator *allocator,
- const lzma_filter *filters_null lzma_attribute((unused)),
+ const lzma_filter *filters_null lzma_attribute((__unused__)),
const lzma_filter *reversed_filters)
{
// No update support, just call the next filter in the chain.
diff --git a/contrib/xz/src/liblzma/simple/sparc.c b/contrib/xz/src/liblzma/simple/sparc.c
index 808a59a..8270d6a 100644
--- a/contrib/xz/src/liblzma/simple/sparc.c
+++ b/contrib/xz/src/liblzma/simple/sparc.c
@@ -15,7 +15,7 @@
static size_t
-sparc_code(lzma_simple *simple lzma_attribute((unused)),
+sparc_code(lzma_simple *simple lzma_attribute((__unused__)),
uint32_t now_pos, bool is_encoder,
uint8_t *buffer, size_t size)
{
diff --git a/contrib/xz/src/lzmainfo/lzmainfo.c b/contrib/xz/src/lzmainfo/lzmainfo.c
index 3100dc6..b0ccdfb 100644
--- a/contrib/xz/src/lzmainfo/lzmainfo.c
+++ b/contrib/xz/src/lzmainfo/lzmainfo.c
@@ -26,7 +26,7 @@
#endif
-static void lzma_attribute((noreturn))
+static void lzma_attribute((__noreturn__))
help(void)
{
printf(
@@ -45,7 +45,7 @@ _("Usage: %s [--help] [--version] [FILE]...\n"
}
-static void lzma_attribute((noreturn))
+static void lzma_attribute((__noreturn__))
version(void)
{
puts("lzmainfo (" PACKAGE_NAME ") " LZMA_VERSION_STRING);
diff --git a/contrib/xz/src/xz/coder.c b/contrib/xz/src/xz/coder.c
index 5182ddd..b123ec5 100644
--- a/contrib/xz/src/xz/coder.c
+++ b/contrib/xz/src/xz/coder.c
@@ -102,7 +102,7 @@ coder_add_filter(lzma_vli id, void *options)
}
-static void lzma_attribute((noreturn))
+static void lzma_attribute((__noreturn__))
memlimit_too_small(uint64_t memory_usage)
{
message(V_ERROR, _("Memory usage limit is too low for the given "
diff --git a/contrib/xz/src/xz/file_io.c b/contrib/xz/src/xz/file_io.c
index 09edcca..f9b7f30 100644
--- a/contrib/xz/src/xz/file_io.c
+++ b/contrib/xz/src/xz/file_io.c
@@ -53,7 +53,7 @@ static bool io_write_buf(file_pair *pair, const uint8_t *buf, size_t size);
extern void
io_init(void)
{
- // Make sure that stdin, stdout, and and stderr are connected to
+ // Make sure that stdin, stdout, and stderr are connected to
// a valid file descriptor. Exit immediately with exit code ERROR
// if we cannot make the file descriptors valid. Maybe we should
// print an error message, but our stderr could be screwed anyway.
diff --git a/contrib/xz/src/xz/hardware.h b/contrib/xz/src/xz/hardware.h
index bed952b..ad526f2 100644
--- a/contrib/xz/src/xz/hardware.h
+++ b/contrib/xz/src/xz/hardware.h
@@ -35,4 +35,4 @@ extern void hardware_memlimit_set(uint64_t new_memlimit,
extern uint64_t hardware_memlimit_get(enum operation_mode mode);
/// Display the amount of RAM and memory usage limits and exit.
-extern void hardware_memlimit_show(void) lzma_attribute((noreturn));
+extern void hardware_memlimit_show(void) lzma_attribute((__noreturn__));
diff --git a/contrib/xz/src/xz/list.c b/contrib/xz/src/xz/list.c
index 1c93718..98307eb 100644
--- a/contrib/xz/src/xz/list.c
+++ b/contrib/xz/src/xz/list.c
@@ -382,14 +382,9 @@ parse_block_header(file_pair *pair, const lzma_index_iter *iter,
if (buf.u8[0] == 0)
goto data_error;
- lzma_block block;
- lzma_filter filters[LZMA_FILTERS_MAX + 1];
-
- // Initialize the pointers so that they can be passed to free().
- for (size_t i = 0; i < ARRAY_SIZE(filters); ++i)
- filters[i].options = NULL;
-
// Initialize the block structure and decode Block Header Size.
+ lzma_filter filters[LZMA_FILTERS_MAX + 1];
+ lzma_block block;
block.version = 0;
block.check = iter->stream.flags->check;
block.filters = filters;
@@ -437,6 +432,10 @@ parse_block_header(file_pair *pair, const lzma_index_iter *iter,
break;
case LZMA_DATA_ERROR:
+ // Free the memory allocated by lzma_block_header_decode().
+ for (size_t i = 0; filters[i].id != LZMA_VLI_UNKNOWN; ++i)
+ free(filters[i].options);
+
goto data_error;
default:
@@ -466,14 +465,6 @@ data_error:
// Show the error message.
message_error("%s: %s", pair->src_name,
message_strm(LZMA_DATA_ERROR));
-
- // Free the memory allocated by lzma_block_header_decode().
- // This is truly needed only if we get here after a succcessful
- // call to lzma_block_header_decode() but it doesn't hurt to
- // always do it.
- for (size_t i = 0; filters[i].id != LZMA_VLI_UNKNOWN; ++i)
- free(filters[i].options);
-
return true;
}
diff --git a/contrib/xz/src/xz/message.c b/contrib/xz/src/xz/message.c
index 38cce4a..80c86a4 100644
--- a/contrib/xz/src/xz/message.c
+++ b/contrib/xz/src/xz/message.c
@@ -94,7 +94,7 @@ static volatile sig_atomic_t progress_needs_updating = false;
/// Signal handler for SIGALRM
static void
-progress_signal_handler(int sig lzma_attribute((unused)))
+progress_signal_handler(int sig lzma_attribute((__unused__)))
{
progress_needs_updating = true;
return;
@@ -726,7 +726,11 @@ vmessage(enum message_verbosity v, const char *fmt, va_list ap)
progress_flush(false);
- fprintf(stderr, "%s: ", progname);
+ // TRANSLATORS: This is the program name in the beginning
+ // of the line in messages. Usually it becomes "xz: ".
+ // This is a translatable string because French needs
+ // a space before a colon.
+ fprintf(stderr, _("%s: "), progname);
vfprintf(stderr, fmt, ap);
fputc('\n', stderr);
diff --git a/contrib/xz/src/xz/message.h b/contrib/xz/src/xz/message.h
index e3fca3c..74599bd 100644
--- a/contrib/xz/src/xz/message.h
+++ b/contrib/xz/src/xz/message.h
@@ -45,7 +45,7 @@ extern enum message_verbosity message_verbosity_get(void);
///
/// This doesn't touch the exit status.
extern void message(enum message_verbosity verbosity, const char *fmt, ...)
- lzma_attribute((format(printf, 2, 3)));
+ lzma_attribute((__format__(__printf__, 2, 3)));
/// \brief Prints a warning and possibly sets exit status
@@ -53,7 +53,7 @@ extern void message(enum message_verbosity verbosity, const char *fmt, ...)
/// The message is printed only if verbosity level is at least V_WARNING.
/// The exit status is set to WARNING unless it was already at ERROR.
extern void message_warning(const char *fmt, ...)
- lzma_attribute((format(printf, 1, 2)));
+ lzma_attribute((__format__(__printf__, 1, 2)));
/// \brief Prints an error message and sets exit status
@@ -61,25 +61,25 @@ extern void message_warning(const char *fmt, ...)
/// The message is printed only if verbosity level is at least V_ERROR.
/// The exit status is set to ERROR.
extern void message_error(const char *fmt, ...)
- lzma_attribute((format(printf, 1, 2)));
+ lzma_attribute((__format__(__printf__, 1, 2)));
/// \brief Prints an error message and exits with EXIT_ERROR
///
/// The message is printed only if verbosity level is at least V_ERROR.
extern void message_fatal(const char *fmt, ...)
- lzma_attribute((format(printf, 1, 2)))
- lzma_attribute((noreturn));
+ lzma_attribute((__format__(__printf__, 1, 2)))
+ lzma_attribute((__noreturn__));
/// Print an error message that an internal error occurred and exit with
/// EXIT_ERROR.
-extern void message_bug(void) lzma_attribute((noreturn));
+extern void message_bug(void) lzma_attribute((__noreturn__));
/// Print a message that establishing signal handlers failed, and exit with
/// exit status ERROR.
-extern void message_signal_handler(void) lzma_attribute((noreturn));
+extern void message_signal_handler(void) lzma_attribute((__noreturn__));
/// Convert lzma_ret to a string.
@@ -116,11 +116,11 @@ extern void message_try_help(void);
/// Prints the version number to stdout and exits with exit status SUCCESS.
-extern void message_version(void) lzma_attribute((noreturn));
+extern void message_version(void) lzma_attribute((__noreturn__));
/// Print the help message.
-extern void message_help(bool long_help) lzma_attribute((noreturn));
+extern void message_help(bool long_help) lzma_attribute((__noreturn__));
/// \brief Set the total number of files to be processed
diff --git a/contrib/xz/src/xz/options.c b/contrib/xz/src/xz/options.c
index 379a2e4..f21a0ba 100644
--- a/contrib/xz/src/xz/options.c
+++ b/contrib/xz/src/xz/options.c
@@ -150,7 +150,7 @@ enum {
static void
set_delta(void *options, uint32_t key, uint64_t value,
- const char *valuestr lzma_attribute((unused)))
+ const char *valuestr lzma_attribute((__unused__)))
{
lzma_options_delta *opt = options;
switch (key) {
@@ -194,7 +194,7 @@ enum {
static void
set_bcj(void *options, uint32_t key, uint64_t value,
- const char *valuestr lzma_attribute((unused)))
+ const char *valuestr lzma_attribute((__unused__)))
{
lzma_options_bcj *opt = options;
switch (key) {
@@ -241,7 +241,7 @@ enum {
};
-static void lzma_attribute((noreturn))
+static void lzma_attribute((__noreturn__))
error_lzma_preset(const char *valuestr)
{
message_fatal(_("Unsupported LZMA1/LZMA2 preset: %s"), valuestr);
diff --git a/contrib/xz/src/xz/signals.c b/contrib/xz/src/xz/signals.c
index 4d6a9da..de21364 100644
--- a/contrib/xz/src/xz/signals.c
+++ b/contrib/xz/src/xz/signals.c
@@ -179,7 +179,7 @@ signals_exit(void)
// console window.
static BOOL WINAPI
-signal_handler(DWORD type lzma_attribute((unused)))
+signal_handler(DWORD type lzma_attribute((__unused__)))
{
// Since we don't get a signal number which we could raise() at
// signals_exit() like on POSIX, just set the exit status to
diff --git a/contrib/xz/src/xz/suffix.c b/contrib/xz/src/xz/suffix.c
index ea86c1a..c89f67f 100644
--- a/contrib/xz/src/xz/suffix.c
+++ b/contrib/xz/src/xz/suffix.c
@@ -21,12 +21,6 @@
static char *custom_suffix = NULL;
-struct suffix_pair {
- const char *compressed;
- const char *uncompressed;
-};
-
-
/// \brief Test if the char is a directory separator
static bool
is_dir_sep(char c)
@@ -86,7 +80,10 @@ test_suffix(const char *suffix, const char *src_name, size_t src_len)
static char *
uncompressed_name(const char *src_name, const size_t src_len)
{
- static const struct suffix_pair suffixes[] = {
+ static const struct {
+ const char *compressed;
+ const char *uncompressed;
+ } suffixes[] = {
{ ".xz", "" },
{ ".txz", ".tar" }, // .txz abbreviation for .txt.gz is rare.
{ ".lzma", "" },
@@ -145,25 +142,25 @@ static char *
compressed_name(const char *src_name, const size_t src_len)
{
// The order of these must match the order in args.h.
- static const struct suffix_pair all_suffixes[][3] = {
+ static const char *const all_suffixes[][3] = {
{
- { ".xz", "" },
- { ".txz", ".tar" },
- { NULL, NULL }
+ ".xz",
+ ".txz",
+ NULL
}, {
- { ".lzma", "" },
- { ".tlz", ".tar" },
- { NULL, NULL }
+ ".lzma",
+ ".tlz",
+ NULL
/*
}, {
- { ".gz", "" },
- { ".tgz", ".tar" },
- { NULL, NULL }
+ ".gz",
+ ".tgz",
+ NULL
*/
}, {
// --format=raw requires specifying the suffix
// manually or using stdout.
- { NULL, NULL }
+ NULL
}
};
@@ -171,14 +168,22 @@ compressed_name(const char *src_name, const size_t src_len)
assert(opt_format != FORMAT_AUTO);
const size_t format = opt_format - 1;
- const struct suffix_pair *const suffixes = all_suffixes[format];
+ const char *const *suffixes = all_suffixes[format];
+
+ for (size_t i = 0; suffixes[i] != NULL; ++i) {
+ if (test_suffix(suffixes[i], src_name, src_len) != 0) {
+ message_warning(_("%s: File already has `%s' "
+ "suffix, skipping"), src_name,
+ suffixes[i]);
+ return NULL;
+ }
+ }
- for (size_t i = 0; suffixes[i].compressed != NULL; ++i) {
- if (test_suffix(suffixes[i].compressed, src_name, src_len)
- != 0) {
+ if (custom_suffix != NULL) {
+ if (test_suffix(custom_suffix, src_name, src_len) != 0) {
message_warning(_("%s: File already has `%s' "
"suffix, skipping"), src_name,
- suffixes[i].compressed);
+ custom_suffix);
return NULL;
}
}
@@ -193,7 +198,7 @@ compressed_name(const char *src_name, const size_t src_len)
}
const char *suffix = custom_suffix != NULL
- ? custom_suffix : suffixes[0].compressed;
+ ? custom_suffix : suffixes[0];
const size_t suffix_len = strlen(suffix);
char *dest_name = xmalloc(src_len + suffix_len + 1);
diff --git a/contrib/xz/src/xz/util.h b/contrib/xz/src/xz/util.h
index 4b2d3e2..a2516bf 100644
--- a/contrib/xz/src/xz/util.h
+++ b/contrib/xz/src/xz/util.h
@@ -20,11 +20,11 @@
/// \brief Safe realloc() that never returns NULL
extern void *xrealloc(void *ptr, size_t size)
- lzma_attribute((malloc)) lzma_attr_alloc_size(2);
+ lzma_attribute((__malloc__)) lzma_attr_alloc_size(2);
/// \brief Safe strdup() that never returns NULL
-extern char *xstrdup(const char *src) lzma_attribute((malloc));
+extern char *xstrdup(const char *src) lzma_attribute((__malloc__));
/// \brief Fancy version of strtoull()
@@ -102,7 +102,7 @@ extern const char *uint64_to_nicestr(uint64_t value,
/// A maximum of *left bytes is written starting from *pos. *pos and *left
/// are updated accordingly.
extern void my_snprintf(char **pos, size_t *left, const char *fmt, ...)
- lzma_attribute((format(printf, 3, 4)));
+ lzma_attribute((__format__(__printf__, 3, 4)));
/// \brief Check if filename is empty and print an error message
diff --git a/contrib/xz/src/xz/xz.1 b/contrib/xz/src/xz/xz.1
index cba1d07..f1c9135 100644
--- a/contrib/xz/src/xz/xz.1
+++ b/contrib/xz/src/xz/xz.1
@@ -866,7 +866,7 @@ This is equivalent to specifying \fB\-\-memlimit\-compress=\fIlimit
\fB\-\-memlimit\-decompress=\fIlimit\fR.
.TP
.B \-\-no\-adjust
-Display an error and exit if the compression settings exceed the
+Display an error and exit if the compression settings exceed
the memory usage limit.
The default is to adjust the settings downwards so
that the memory usage limit is not exceeded.
diff --git a/contrib/xz/src/xzdec/xzdec.c b/contrib/xz/src/xzdec/xzdec.c
index fd01507..b7830db 100644
--- a/contrib/xz/src/xzdec/xzdec.c
+++ b/contrib/xz/src/xzdec/xzdec.c
@@ -40,7 +40,7 @@
static unsigned int display_errors = 2;
-static void lzma_attribute((format(printf, 1, 2)))
+static void lzma_attribute((__format__(__printf__, 1, 2)))
my_errorf(const char *fmt, ...)
{
va_list ap;
@@ -57,7 +57,7 @@ my_errorf(const char *fmt, ...)
}
-static void lzma_attribute((noreturn))
+static void lzma_attribute((__noreturn__))
help(void)
{
printf(
@@ -81,7 +81,7 @@ PACKAGE_NAME " home page: <" PACKAGE_URL ">\n", progname);
}
-static void lzma_attribute((noreturn))
+static void lzma_attribute((__noreturn__))
version(void)
{
printf(TOOL_FORMAT "dec (" PACKAGE_NAME ") " LZMA_VERSION_STRING "\n"
diff --git a/etc/namedb/named.conf b/etc/namedb/named.conf
index 27c30ae..f1669ab 100644
--- a/etc/namedb/named.conf
+++ b/etc/namedb/named.conf
@@ -122,18 +122,18 @@ zone "arpa" {
1. Faster local resolution for your users
2. No spurious traffic will be sent from your network to the roots
*/
-// RFCs 1912 and 5735 (and BCP 32 for localhost)
+// RFCs 1912, 5735 and 6303 (and BCP 32 for localhost)
zone "localhost" { type master; file "/etc/namedb/master/localhost-forward.db"; };
zone "127.in-addr.arpa" { type master; file "/etc/namedb/master/localhost-reverse.db"; };
zone "255.in-addr.arpa" { type master; file "/etc/namedb/master/empty.db"; };
-// RFC 1912-style zone for IPv6 localhost address
+// RFC 1912-style zone for IPv6 localhost address (RFC 6303)
zone "0.ip6.arpa" { type master; file "/etc/namedb/master/localhost-reverse.db"; };
-// "This" Network (RFCs 1912 and 5735)
+// "This" Network (RFCs 1912, 5735 and 6303)
zone "0.in-addr.arpa" { type master; file "/etc/namedb/master/empty.db"; };
-// Private Use Networks (RFCs 1918 and 5735)
+// Private Use Networks (RFCs 1918, 5735 and 6303)
zone "10.in-addr.arpa" { type master; file "/etc/namedb/master/empty.db"; };
zone "16.172.in-addr.arpa" { type master; file "/etc/namedb/master/empty.db"; };
zone "17.172.in-addr.arpa" { type master; file "/etc/namedb/master/empty.db"; };
@@ -153,18 +153,18 @@ zone "30.172.in-addr.arpa" { type master; file "/etc/namedb/master/empty.db"; };
zone "31.172.in-addr.arpa" { type master; file "/etc/namedb/master/empty.db"; };
zone "168.192.in-addr.arpa" { type master; file "/etc/namedb/master/empty.db"; };
-// Link-local/APIPA (RFCs 3927 and 5735)
+// Link-local/APIPA (RFCs 3927, 5735 and 6303)
zone "254.169.in-addr.arpa" { type master; file "/etc/namedb/master/empty.db"; };
// IETF protocol assignments (RFCs 5735 and 5736)
zone "0.0.192.in-addr.arpa" { type master; file "/etc/namedb/master/empty.db"; };
-// TEST-NET-[1-3] for Documentation (RFCs 5735 and 5737)
+// TEST-NET-[1-3] for Documentation (RFCs 5735, 5737 and 6303)
zone "2.0.192.in-addr.arpa" { type master; file "/etc/namedb/master/empty.db"; };
zone "100.51.198.in-addr.arpa" { type master; file "/etc/namedb/master/empty.db"; };
zone "113.0.203.in-addr.arpa" { type master; file "/etc/namedb/master/empty.db"; };
-// IPv6 Range for Documentation (RFC 3849)
+// IPv6 Example Range for Documentation (RFCs 3849 and 6303)
zone "8.b.d.0.1.0.0.2.ip6.arpa" { type master; file "/etc/namedb/master/empty.db"; };
// Domain Names for Documentation and Testing (BCP 32)
@@ -231,17 +231,17 @@ zone "5.e.f.ip6.arpa" { type master; file "/etc/namedb/master/empty.db"; };
zone "6.e.f.ip6.arpa" { type master; file "/etc/namedb/master/empty.db"; };
zone "7.e.f.ip6.arpa" { type master; file "/etc/namedb/master/empty.db"; };
-// IPv6 ULA (RFC 4193)
+// IPv6 ULA (RFCs 4193 and 6303)
zone "c.f.ip6.arpa" { type master; file "/etc/namedb/master/empty.db"; };
zone "d.f.ip6.arpa" { type master; file "/etc/namedb/master/empty.db"; };
-// IPv6 Link Local (RFC 4291)
+// IPv6 Link Local (RFCs 4291 and 6303)
zone "8.e.f.ip6.arpa" { type master; file "/etc/namedb/master/empty.db"; };
zone "9.e.f.ip6.arpa" { type master; file "/etc/namedb/master/empty.db"; };
zone "a.e.f.ip6.arpa" { type master; file "/etc/namedb/master/empty.db"; };
zone "b.e.f.ip6.arpa" { type master; file "/etc/namedb/master/empty.db"; };
-// IPv6 Deprecated Site-Local Addresses (RFC 3879)
+// IPv6 Deprecated Site-Local Addresses (RFCs 3879 and 6303)
zone "c.e.f.ip6.arpa" { type master; file "/etc/namedb/master/empty.db"; };
zone "d.e.f.ip6.arpa" { type master; file "/etc/namedb/master/empty.db"; };
zone "e.e.f.ip6.arpa" { type master; file "/etc/namedb/master/empty.db"; };
diff --git a/etc/namedb/named.root b/etc/namedb/named.root
index 87282e5..1c8facf 100644
--- a/etc/namedb/named.root
+++ b/etc/namedb/named.root
@@ -13,8 +13,8 @@
; on server FTP.INTERNIC.NET
; -OR- RS.INTERNIC.NET
;
-; last update: Jun 17, 2010
-; related version of root zone: 2010061700
+; last update: Jun 8, 2011
+; related version of root zone: 2011060800
;
; formerly NS.INTERNIC.NET
;
@@ -36,6 +36,7 @@ C.ROOT-SERVERS.NET. 3600000 A 192.33.4.12
;
. 3600000 NS D.ROOT-SERVERS.NET.
D.ROOT-SERVERS.NET. 3600000 A 128.8.10.90
+D.ROOT-SERVERS.NET. 3600000 AAAA 2001:500:2D::D
;
; FORMERLY NS.NASA.GOV
;
diff --git a/etc/rc.d/Makefile b/etc/rc.d/Makefile
index 65759df..c250e66 100644
--- a/etc/rc.d/Makefile
+++ b/etc/rc.d/Makefile
@@ -24,7 +24,7 @@ FILES= DAEMON FILESYSTEMS LOGIN NETWORKING SERVERS \
mdconfig mdconfig2 mountd moused mroute6d mrouted msgs \
named natd netif netoptions netwait \
newsyslog nfsclient nfscbd nfsd \
- nfsserver nfsuserd nisdomain nsswitch ntpd ntpdate \
+ nfsuserd nisdomain nsswitch ntpd ntpdate \
othermta \
pf pflog pfsync \
powerd power_profile ppp pppoed pwcheck \
diff --git a/etc/rc.d/kld b/etc/rc.d/kld
index 946ec69..cd2fbab 100755
--- a/etc/rc.d/kld
+++ b/etc/rc.d/kld
@@ -41,11 +41,24 @@ kld_start()
{
[ -n "$kld_list" ] || return
- local _kld
+ local _kernel_path _module_path _kld _path
+
+ _kernel_path=`$SYSCTL_N kern.bootfile`
+ _kernel_path="${_kernel_path%/*}"
+
+ _module_path=`$SYSCTL_N kern.module_path`
+ _module_path="${_module_path#*\;}"
+ _module_path="$_kernel_path `ltr $_module_path \; ' '`"
echo 'Loading kernel modules:'
for _kld in $kld_list ; do
- load_kld -e ${_kld}.ko $_kld
+ for _path in $_module_path ; do
+ if [ -x "${_path}/${_kld}.ko" ]; then
+ load_kld -e ${_kld}.ko ${_path}/${_kld}.ko
+ continue 2
+ fi
+ done
+ warn "${_kld}.ko not found in $_module_path"
done
}
diff --git a/etc/rc.d/lockd b/etc/rc.d/lockd
index 1a3fc6b..135dda7 100755
--- a/etc/rc.d/lockd
+++ b/etc/rc.d/lockd
@@ -5,7 +5,7 @@
#
# PROVIDE: lockd
-# REQUIRE: nfsserver nfsclient nfsd rpcbind statd
+# REQUIRE: nfsclient nfsd rpcbind statd
# BEFORE: DAEMON
# KEYWORD: nojail shutdown
diff --git a/etc/rc.d/mountd b/etc/rc.d/mountd
index 1fad302..017418d 100755
--- a/etc/rc.d/mountd
+++ b/etc/rc.d/mountd
@@ -4,7 +4,7 @@
#
# PROVIDE: mountd
-# REQUIRE: NETWORKING nfsserver rpcbind quota
+# REQUIRE: NETWORKING rpcbind quota
# KEYWORD: nojail shutdown
. /etc/rc.subr
diff --git a/etc/rc.d/nfsd b/etc/rc.d/nfsd
index f0a65ba..8dae57c 100755
--- a/etc/rc.d/nfsd
+++ b/etc/rc.d/nfsd
@@ -22,9 +22,9 @@ nfsd_precmd()
if checkyesno oldnfs_server_enable; then
rc_flags="-o ${nfs_server_flags}"
- if ! sysctl vfs.nfsrv >/dev/null 2>&1; then
- force_depend nfsserver || return 1
- fi
+ # Load the module now, so that the vfs.nfsrv sysctl
+ # oids are available.
+ load_kld nfsserver
if checkyesno nfs_reserved_port_only; then
echo 'NFS on reserved port only=YES'
diff --git a/etc/rc.d/nfsserver b/etc/rc.d/nfsserver
deleted file mode 100755
index bfa3f12..0000000
--- a/etc/rc.d/nfsserver
+++ /dev/null
@@ -1,19 +0,0 @@
-#!/bin/sh
-#
-# $FreeBSD$
-#
-
-# PROVIDE: nfsserver
-# REQUIRE: NETWORKING mountcritremote
-# KEYWORD: nojail
-
-. /etc/rc.subr
-
-name="nfsserver"
-rcvar="nfs_server_enable"
-start_cmd=":"
-stop_cmd=":"
-required_modules="nfsserver"
-
-load_rc_config $name
-run_rc_command "$1"
diff --git a/etc/rc.d/routing b/etc/rc.d/routing
index add1e0a..7d18a7c 100755
--- a/etc/rc.d/routing
+++ b/etc/rc.d/routing
@@ -48,7 +48,6 @@ routing_start()
done
;;
esac
- [ -n "${_ropts_initdone}" ] && echo '.'
}
routing_stop()
@@ -250,19 +249,19 @@ static_ipx()
{
}
-_ropts_initdone=
ropts_init()
{
if [ -z "${_ropts_initdone}" ]; then
- echo -n 'Additional routing options:'
+ echo -n "Additional $1 routing options:"
_ropts_initdone=yes
fi
}
options_inet()
{
+ _ropts_initdone=
if checkyesno icmp_bmcastecho; then
- ropts_init
+ ropts_init inet
echo -n ' broadcast ping responses=YES'
${SYSCTL} net.inet.icmp.bmcastecho=1 > /dev/null
else
@@ -270,7 +269,7 @@ options_inet()
fi
if checkyesno icmp_drop_redirect; then
- ropts_init
+ ropts_init inet
echo -n ' ignore ICMP redirect=YES'
${SYSCTL} net.inet.icmp.drop_redirect=1 > /dev/null
else
@@ -278,7 +277,7 @@ options_inet()
fi
if checkyesno icmp_log_redirect; then
- ropts_init
+ ropts_init inet
echo -n ' log ICMP redirect=YES'
${SYSCTL} net.inet.icmp.log_redirect=1 > /dev/null
else
@@ -286,15 +285,15 @@ options_inet()
fi
if checkyesno gateway_enable; then
- ropts_init
- echo -n ' IPv4 gateway=YES'
+ ropts_init inet
+ echo -n ' gateway=YES'
${SYSCTL} net.inet.ip.forwarding=1 > /dev/null
else
${SYSCTL} net.inet.ip.forwarding=0 > /dev/null
fi
if checkyesno forward_sourceroute; then
- ropts_init
+ ropts_init inet
echo -n ' do source routing=YES'
${SYSCTL} net.inet.ip.sourceroute=1 > /dev/null
else
@@ -302,7 +301,7 @@ options_inet()
fi
if checkyesno accept_sourceroute; then
- ropts_init
+ ropts_init inet
echo -n ' accept source routing=YES'
${SYSCTL} net.inet.ip.accept_sourceroute=1 > /dev/null
else
@@ -310,38 +309,51 @@ options_inet()
fi
if checkyesno arpproxy_all; then
- ropts_init
+ ropts_init inet
echo -n ' ARP proxyall=YES'
${SYSCTL} net.link.ether.inet.proxyall=1 > /dev/null
else
${SYSCTL} net.link.ether.inet.proxyall=0 > /dev/null
fi
+
+ [ -n "${_ropts_initdone}" ] && echo '.'
}
options_inet6()
{
+ _ropts_initdone=
+
if checkyesno ipv6_gateway_enable; then
- ropts_init
- echo -n ' IPv6 gateway=YES'
+ ropts_init inet6
+ echo -n ' gateway=YES'
${SYSCTL} net.inet6.ip6.forwarding=1 > /dev/null
else
${SYSCTL} net.inet6.ip6.forwarding=0 > /dev/null
fi
+
+ [ -n "${_ropts_initdone}" ] && echo '.'
}
options_atm()
{
+ _ropts_initdone=
+
+ [ -n "${_ropts_initdone}" ] && echo '.'
}
options_ipx()
{
+ _ropts_initdone=
+
if checkyesno ipxgateway_enable; then
- ropts_init
- echo -n ' IPX gateway=YES'
+ ropts_init ipx
+ echo -n ' gateway=YES'
${SYSCTL} net.ipx.ipx.ipxforwarding=1 > /dev/null
else
${SYSCTL} net.ipx.ipx.ipxforwarding=0 > /dev/null
fi
+
+ [ -n "${_ropts_initdone}" ] && echo '.'
}
load_rc_config $name
diff --git a/etc/rc.d/statd b/etc/rc.d/statd
index 85e003d..4e4a0a4 100755
--- a/etc/rc.d/statd
+++ b/etc/rc.d/statd
@@ -5,7 +5,7 @@
#
# PROVIDE: statd
-# REQUIRE: nfsserver nfsclient nfsd rpcbind
+# REQUIRE: nfsclient nfsd rpcbind
# BEFORE: DAEMON
# KEYWORD: nojail shutdown
diff --git a/etc/regdomain.xml b/etc/regdomain.xml
index 9b40605..ff57113 100644
--- a/etc/regdomain.xml
+++ b/etc/regdomain.xml
@@ -324,6 +324,14 @@
</netband>
<netband mode="11a">
<band>
+ <freqband ref="F1_4920_4980"/>
+ <maxpower>23</maxpower>
+ </band>
+ <band>
+ <freqband ref="F1_5040_5080"/>
+ <maxpower>23</maxpower>
+ </band>
+ <band>
<freqband ref="F1_5180_5240"/>
<maxpower>23</maxpower>
</band>
@@ -333,6 +341,12 @@
<flags>IEEE80211_CHAN_PASSIVE</flags>
<flags>IEEE80211_CHAN_DFS</flags>
</band>
+ <band>
+ <freqband ref="F1_5500_5700"/>
+ <maxpower>23</maxpower>
+ <flags>IEEE80211_CHAN_PASSIVE</flags>
+ <flags>IEEE80211_CHAN_DFS</flags>
+ </band>
</netband>
<netband mode="11ng">
<band>
@@ -350,6 +364,26 @@
</netband>
<netband mode="11na">
<band>
+ <freqband ref="F1_4920_4980"/>
+ <maxpower>23</maxpower>
+ <flags>IEEE80211_CHAN_HT20</flags>
+ </band>
+ <band>
+ <freqband ref="H4_4920_4980"/>
+ <maxpower>23</maxpower>
+ <flags>IEEE80211_CHAN_HT40</flags>
+ </band>
+ <band>
+ <freqband ref="F1_5040_5080"/>
+ <maxpower>23</maxpower>
+ <flags>IEEE80211_CHAN_HT20</flags>
+ </band>
+ <band>
+ <freqband ref="H4_5040_5080"/>
+ <maxpower>23</maxpower>
+ <flags>IEEE80211_CHAN_HT40</flags>
+ </band>
+ <band>
<freqband ref="F1_5180_5240"/>
<maxpower>23</maxpower>
<flags>IEEE80211_CHAN_HT20</flags>
@@ -373,6 +407,20 @@
<flags>IEEE80211_CHAN_PASSIVE</flags>
<flags>IEEE80211_CHAN_DFS</flags>
</band>
+ <band>
+ <freqband ref="F1_5500_5700"/>
+ <maxpower>23</maxpower>
+ <flags>IEEE80211_CHAN_HT20</flags>
+ <flags>IEEE80211_CHAN_PASSIVE</flags>
+ <flags>IEEE80211_CHAN_DFS</flags>
+ </band>
+ <band>
+ <freqband ref="H4_5500_5680"/>
+ <maxpower>23</maxpower>
+ <flags>IEEE80211_CHAN_HT40</flags>
+ <flags>IEEE80211_CHAN_PASSIVE</flags>
+ <flags>IEEE80211_CHAN_DFS</flags>
+ </band>
</netband>
</rd>
@@ -1624,11 +1672,31 @@
<flags>IEEE80211_CHAN_A</flags>
<flags>IEEE80211_CHAN_HALF</flags>
</freqband>
+<freqband id="F1_4920_4980">
+ <freqstart>4920</freqstart> <freqend>4980</freqend>
+ <chanwidth>20</chanwidth> <chansep>20</chansep>
+ <flags>IEEE80211_CHAN_A</flags>
+</freqband>
+<freqband id="H4_4920_4980">
+ <freqstart>4920</freqstart> <freqend>4980</freqend>
+ <chanwidth>40</chanwidth> <chansep>20</chansep>
+ <flags>IEEE80211_CHAN_A</flags>
+</freqband>
<freqband id="F1_4950_4980">
<freqstart>4950</freqstart> <freqend>4980</freqend>
<chanwidth>20</chanwidth> <chansep>5</chansep>
<flags>IEEE80211_CHAN_A</flags>
</freqband>
+<freqband id="F1_5040_5080">
+ <freqstart>5040</freqstart> <freqend>5080</freqend>
+ <chanwidth>20</chanwidth> <chansep>20</chansep>
+ <flags>IEEE80211_CHAN_A</flags>
+</freqband>
+<freqband id="H4_5040_5080">
+ <freqstart>5040</freqstart> <freqend>5080</freqend>
+ <chanwidth>40</chanwidth> <chansep>20</chansep>
+ <flags>IEEE80211_CHAN_A</flags>
+</freqband>
<freqband id="F1_5120_5240">
<freqstart>5120</freqstart> <freqend>5240</freqend>
<chanwidth>20</chanwidth> <chansep>20</chansep>
diff --git a/gnu/lib/libdialog/Makefile b/gnu/lib/libdialog/Makefile
index 7547a60..f0979ac 100644
--- a/gnu/lib/libdialog/Makefile
+++ b/gnu/lib/libdialog/Makefile
@@ -5,16 +5,16 @@ DIALOG= ${.CURDIR}/../../../contrib/dialog
LIB= dialog
SHLIB_MAJOR= 7
SRCS= argv.c arrows.c buttons.c calendar.c checklist.c columns.c \
- dlg_keys.c editbox.c fselect.c formbox.c guage.c inputbox.c \
- inputstr.c menubox.c mixedform.c mixedgauge.c mouse.c \
- mousewget.c msgbox.c pause.c prgbox.c progressbox.c rc.c \
- tailbox.c textbox.c timebox.c trace.c ui_getc.c util.c \
+ dlg_keys.c editbox.c fselect.c formbox.c guage.c help.c \
+ inputbox.c inputstr.c menubox.c mixedform.c mixedgauge.c \
+ mouse.c mousewget.c msgbox.c pause.c prgbox.c progressbox.c \
+ rc.c tailbox.c textbox.c timebox.c trace.c ui_getc.c util.c \
version.c yesno.c
INCS= dialog.h dlg_colors.h dlg_config.h dlg_keys.h
MAN= dialog.3
CFLAGS+= -I${.CURDIR} -I${DIALOG} -D_XOPEN_SOURCE_EXTENDED
.PATH: ${DIALOG}
-WARNS?= 3
+WARNS?= 1
.include <bsd.lib.mk>
diff --git a/gnu/usr.bin/groff/tmac/mdoc.local b/gnu/usr.bin/groff/tmac/mdoc.local
index befc87d..8c356f5 100644
--- a/gnu/usr.bin/groff/tmac/mdoc.local
+++ b/gnu/usr.bin/groff/tmac/mdoc.local
@@ -56,6 +56,7 @@
.ds doc-str-Lb-libnetgraph Netgraph User Library (libnetgraph, \-lnetgraph)
.ds doc-str-Lb-libpmc Performance Monitoring Counters Interface Library (libpmc, \-lpmc)
.ds doc-str-Lb-libproc Processor Monitoring and Analysis Library (libproc, \-lproc)
+.ds doc-str-Lb-libprocstat Process and Files Information Retrieval (libprocstat, \-lprocstat)
.ds doc-str-Lb-librpcsec_gss RPC GSS-API Authentication Library (librpcsec_gss, \-lrpcsec_gss)
.ds doc-str-Lb-librpcsvc RPC Service Library (librpcsvc, \-lrpcsvc)
.ds doc-str-Lb-librtld_db Run-time Linker Debugging Library (librtld_db, \-lrtld_db)
diff --git a/include/rpc/xdr.h b/include/rpc/xdr.h
index a02291b..92116c0 100644
--- a/include/rpc/xdr.h
+++ b/include/rpc/xdr.h
@@ -322,6 +322,7 @@ extern bool_t xdr_hyper(XDR *, quad_t *);
extern bool_t xdr_u_hyper(XDR *, u_quad_t *);
extern bool_t xdr_longlong_t(XDR *, quad_t *);
extern bool_t xdr_u_longlong_t(XDR *, u_quad_t *);
+extern unsigned long xdr_sizeof(xdrproc_t, void *);
__END_DECLS
/*
diff --git a/lib/bind/Makefile b/lib/bind/Makefile
index 4268219..e2457b7 100644
--- a/lib/bind/Makefile
+++ b/lib/bind/Makefile
@@ -1,5 +1,5 @@
# $FreeBSD$
-SUBDIR= bind9 dns isc isccc isccfg lwres
+SUBDIR= isc isccc dns isccfg bind9 lwres
.include <bsd.subdir.mk>
diff --git a/lib/bind/config.h b/lib/bind/config.h
index 7a5ea06..003a756 100644
--- a/lib/bind/config.h
+++ b/lib/bind/config.h
@@ -3,7 +3,7 @@
/* config.h. Generated from config.h.in by configure. */
/* config.h.in. Generated from configure.in by autoheader. */
/*
- * Copyright (C) 2004, 2005, 2007, 2009 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004, 2005, 2007, 2008 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 1999-2003 Internet Software Consortium.
*
* Permission to use, copy, modify, and/or distribute this software for any
@@ -19,7 +19,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: acconfig.h,v 1.51.334.2 2009/02/16 23:47:15 tbox Exp $ */
+/* $Id: acconfig.h,v 1.53 2008-12-01 23:47:44 tbox Exp $ */
/*! \file */
@@ -150,6 +150,9 @@ int sigwait(const unsigned int *set, int *sig);
/* Define if building universal (internal helper macro) */
/* #undef AC_APPLE_UNIVERSAL_BUILD */
+/* Define to enable the "filter-aaaa-on-v4" option. */
+/* #undef ALLOW_FILTER_AAAA_ON_V4 */
+
/* Define if recvmsg() does not meet all of the BSD socket API specifications.
*/
/* #undef BROKEN_RECVMSG */
@@ -160,6 +163,12 @@ int sigwait(const unsigned int *set, int *sig);
/* Define to enable "rrset-order fixed" syntax. */
/* #undef DNS_RDATASET_FIXED */
+/* Define to enable rpz-nsdname rules. */
+/* #undef ENABLE_RPZ_NSDNAME */
+
+/* Define to enable rpz-nsip rules. */
+/* #undef ENABLE_RPZ_NSIP */
+
/* Solaris hack to get select_large_fdset. */
/* #undef FD_SETSIZE */
@@ -193,9 +202,15 @@ int sigwait(const unsigned int *set, int *sig);
/* Define to 1 if you have the <gssapi/gssapi.h> header file. */
/* #undef HAVE_GSSAPI_GSSAPI_H */
+/* Define to 1 if you have the <gssapi/gssapi_krb5.h> header file. */
+/* #undef HAVE_GSSAPI_GSSAPI_KRB5_H */
+
/* Define to 1 if you have the <gssapi.h> header file. */
/* #undef HAVE_GSSAPI_H */
+/* Define to 1 if you have the <gssapi_krb5.h> header file. */
+/* #undef HAVE_GSSAPI_KRB5_H */
+
/* Define to 1 if you have the <inttypes.h> header file. */
#define HAVE_INTTYPES_H 1
@@ -214,6 +229,9 @@ int sigwait(const unsigned int *set, int *sig);
/* Define to 1 if you have the `cap' library (-lcap). */
/* #undef HAVE_LIBCAP */
+/* if system have backtrace function */
+/* #undef HAVE_LIBCTRACE */
+
/* Define to 1 if you have the `c_r' library (-lc_r). */
/* #undef HAVE_LIBC_R */
@@ -250,9 +268,27 @@ int sigwait(const unsigned int *set, int *sig);
/* Define to 1 if you have the <net/if6.h> header file. */
/* #undef HAVE_NET_IF6_H */
+/* Define if your OpenSSL version supports GOST. */
+/* #undef HAVE_OPENSSL_GOST */
+
+/* Define to 1 if you have the <regex.h> header file. */
+#define HAVE_REGEX_H 1
+
+/* Define to 1 if you have the `setegid' function. */
+#define HAVE_SETEGID 1
+
+/* Define to 1 if you have the `seteuid' function. */
+#define HAVE_SETEUID 1
+
/* Define to 1 if you have the `setlocale' function. */
#define HAVE_SETLOCALE 1
+/* Define to 1 if you have the `setresgid' function. */
+#define HAVE_SETRESGID 1
+
+/* Define to 1 if you have the `setresuid' function. */
+#define HAVE_SETRESUID 1
+
/* Define to 1 if you have the <stdint.h> header file. */
#define HAVE_STDINT_H 1
@@ -307,6 +343,15 @@ int sigwait(const unsigned int *set, int *sig);
/* Define to 1 if you have the <unistd.h> header file. */
#define HAVE_UNISTD_H 1
+/* return type of gai_strerror */
+#define IRS_GAISTRERROR_RETURN_T const char *
+
+/* Define to the buffer length type used by getnameinfo(3). */
+#define IRS_GETNAMEINFO_BUFLEN_T size_t
+
+/* Define to the flags type used by getnameinfo(3). */
+#define IRS_GETNAMEINFO_FLAGS_T int
+
/* Define to the sub-directory in which libtool stores uninstalled libraries.
*/
#define LT_OBJDIR ".libs/"
@@ -368,11 +413,8 @@ int sigwait(const unsigned int *set, int *sig);
/* Define to empty if `const' does not conform to ANSI C. */
/* #undef const */
-/* Define to `__inline__' or `__inline' if that's what the C compiler
- calls it, or to nothing if 'inline' is not supported under any name. */
-#ifndef __cplusplus
+/* Define to empty if your compiler does not support "static inline". */
#define inline /**/
-#endif
/* Define to `unsigned int' if <sys/types.h> does not define. */
/* #undef size_t */
diff --git a/lib/bind/config.mk b/lib/bind/config.mk
index 184d017..ebac59a 100644
--- a/lib/bind/config.mk
+++ b/lib/bind/config.mk
@@ -67,8 +67,10 @@ CFLAGS+= -I${LIB_BIND_DIR}
# Use the right version of the atomic.h file from lib/isc
.if ${MACHINE_ARCH} == "amd64" || ${MACHINE_ARCH} == "i386"
ISC_ATOMIC_ARCH= x86_32
+.elif ${MACHINE_ARCH} == "ia64"
+ISC_ATOMIC_ARCH= ia64
.else
-ISC_ATOMIC_ARCH= ${MACHINE_CPUARCH}
+ISC_ATOMIC_ARCH= noatomic
.endif
# Optional features
@@ -78,11 +80,6 @@ CFLAGS+= -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64
.if ${MK_BIND_SIGCHASE} == "yes"
CFLAGS+= -DDIG_SIGCHASE
.endif
-.if ${MK_BIND_XML} == "yes"
-CFLAGS+= -DHAVE_LIBXML2
-CFLAGS+= -I/usr/local/include -I/usr/local/include/libxml2
-CFLAGS+= -L/usr/local/lib -lxml2 -lz -liconv -lm
-.endif
# Link against BIND libraries
.if ${MK_BIND_LIBS} == "no"
@@ -110,6 +107,13 @@ BIND_DPADD= ${LIBBIND9} ${LIBDNS} ${LIBISCCC} ${LIBISCCFG} \
${LIBISC} ${LIBLWRES}
.if ${MK_BIND_LIBS} != "no"
BIND_LDADD= -lbind9 -ldns -lisccc -lisccfg -lisc -llwres
+CFLAGS+= -I${BIND_DIR}/lib/isc/include
+CFLAGS+= -I${BIND_DIR}/lib/isc/unix/include
+CFLAGS+= -I${BIND_DIR}/lib/isc/pthreads/include
+CFLAGS+= -I${.CURDIR}/../dns
+CFLAGS+= -I${BIND_DIR}/lib/dns/include
+CFLAGS+= -I${BIND_DIR}/lib/isccfg/include
+CFLAGS+= -I${.CURDIR}/../isc
.else
BIND_LDADD= ${BIND_DPADD}
.endif
@@ -120,5 +124,16 @@ CRYPTO_DPADD= ${LIBCRYPTO}
CRYPTO_LDADD= -lcrypto
.endif
+.if ${MK_BIND_XML} == "yes"
+CFLAGS+= -DHAVE_LIBXML2
+CFLAGS+= -I/usr/local/include -I/usr/local/include/libxml2
+.if ${MK_BIND_LIBS} != "no"
+BIND_LDADD+= -L/usr/local/lib -lxml2 -lz -liconv -lm
+.else
+BIND_DPADD+= /usr/local/lib/libxml2.a ${LIBZ}
+BIND_DPADD+= /usr/local/lib/libiconv.a ${LIBM}
+.endif
+.endif
+
PTHREAD_DPADD= ${LIBPTHREAD}
PTHREAD_LDADD= -lpthread
diff --git a/lib/bind/dns/Makefile b/lib/bind/dns/Makefile
index 72b9f80..159de00 100644
--- a/lib/bind/dns/Makefile
+++ b/lib/bind/dns/Makefile
@@ -15,26 +15,24 @@ LIB= dns
SRCS+= acache.c acl.c adb.c byaddr.c \
cache.c callbacks.c compress.c \
db.c dbiterator.c dbtable.c diff.c dispatch.c \
- dlz.c dnssec.c ds.c \
+ dlz.c dns64.c dnssec.c ds.c \
dst_api.c dst_lib.c dst_parse.c dst_result.c \
forward.c \
gssapi_link.c gssapictx.c hmac_link.c \
- iptable.c \
- journal.c \
+ iptable.c journal.c \
key.c \
- keytable.c \
- lib.c log.c lookup.c \
+ keydata.c keytable.c lib.c log.c lookup.c \
master.c masterdump.c message.c \
name.c ncache.c nsec.c nsec3.c \
openssl_link.c openssldh_link.c \
- openssldsa_link.c opensslrsa_link.c \
- order.c peer.c portlist.c \
- rbt.c rbtdb.c rbtdb64.c rcode.c rdata.c \
- rdatalist.c \
+ openssldsa_link.c opensslgost_link.c opensslrsa_link.c \
+ order.c peer.c portlist.c private.c \
+ rbt.c rbtdb.c rbtdb64.c rcode.c rdata.c rdatalist.c \
rdataset.c rdatasetiter.c rdataslab.c request.c \
- resolver.c result.c rootns.c sdb.c sdlz.c soa.c ssu.c \
+ resolver.c result.c rootns.c rpz.c rriterator.c \
+ sdb.c sdlz.c soa.c ssu.c ssu_external.c \
stats.c tcpmsg.c time.c timer.c tkey.c \
- tsig.c ttl.c validator.c \
+ tsec.c tsig.c ttl.c validator.c \
version.c view.c xfrin.c zone.c zonekey.c zt.c
CFLAGS+= -I${SRCDIR}/include/dst -I${SRCDIR}/include -I${SRCDIR}
@@ -84,6 +82,7 @@ DNSINCS= ${SRCDIR}/include/dns/acache.h \
${SRCDIR}/include/dns/order.h \
${SRCDIR}/include/dns/peer.h \
${SRCDIR}/include/dns/portlist.h \
+ ${SRCDIR}/include/dns/private.h \
${SRCDIR}/include/dns/rbt.h \
${SRCDIR}/include/dns/rcode.h \
${SRCDIR}/include/dns/rdata.h \
diff --git a/lib/bind/dns/code.h b/lib/bind/dns/code.h
index 779285e..bfc5330 100644
--- a/lib/bind/dns/code.h
+++ b/lib/bind/dns/code.h
@@ -83,11 +83,13 @@
#include "rdata/in_1/dhcid_49.c"
#include "rdata/generic/nsec3_50.c"
#include "rdata/generic/nsec3param_51.c"
+#include "rdata/generic/hip_55.c"
#include "rdata/generic/spf_99.c"
#include "rdata/generic/unspec_103.c"
#include "rdata/generic/tkey_249.c"
#include "rdata/any_255/tsig_250.c"
#include "rdata/generic/dlv_32769.c"
+#include "rdata/generic/keydata_65533.c"
@@ -190,6 +192,7 @@
break; \
case 50: result = fromtext_nsec3(rdclass, type, lexer, origin, options, target, callbacks); break; \
case 51: result = fromtext_nsec3param(rdclass, type, lexer, origin, options, target, callbacks); break; \
+ case 55: result = fromtext_hip(rdclass, type, lexer, origin, options, target, callbacks); break; \
case 99: result = fromtext_spf(rdclass, type, lexer, origin, options, target, callbacks); break; \
case 103: result = fromtext_unspec(rdclass, type, lexer, origin, options, target, callbacks); break; \
case 249: result = fromtext_tkey(rdclass, type, lexer, origin, options, target, callbacks); break; \
@@ -199,6 +202,7 @@
} \
break; \
case 32769: result = fromtext_dlv(rdclass, type, lexer, origin, options, target, callbacks); break; \
+ case 65533: result = fromtext_keydata(rdclass, type, lexer, origin, options, target, callbacks); break; \
default: result = DNS_R_UNKNOWN; break; \
}
@@ -301,6 +305,7 @@
break; \
case 50: result = totext_nsec3(rdata, tctx, target); break; \
case 51: result = totext_nsec3param(rdata, tctx, target); break; \
+ case 55: result = totext_hip(rdata, tctx, target); break; \
case 99: result = totext_spf(rdata, tctx, target); break; \
case 103: result = totext_unspec(rdata, tctx, target); break; \
case 249: result = totext_tkey(rdata, tctx, target); break; \
@@ -310,6 +315,7 @@
} \
break; \
case 32769: result = totext_dlv(rdata, tctx, target); break; \
+ case 65533: result = totext_keydata(rdata, tctx, target); break; \
default: use_default = ISC_TRUE; break; \
}
@@ -412,6 +418,7 @@
break; \
case 50: result = fromwire_nsec3(rdclass, type, source, dctx, options, target); break; \
case 51: result = fromwire_nsec3param(rdclass, type, source, dctx, options, target); break; \
+ case 55: result = fromwire_hip(rdclass, type, source, dctx, options, target); break; \
case 99: result = fromwire_spf(rdclass, type, source, dctx, options, target); break; \
case 103: result = fromwire_unspec(rdclass, type, source, dctx, options, target); break; \
case 249: result = fromwire_tkey(rdclass, type, source, dctx, options, target); break; \
@@ -421,6 +428,7 @@
} \
break; \
case 32769: result = fromwire_dlv(rdclass, type, source, dctx, options, target); break; \
+ case 65533: result = fromwire_keydata(rdclass, type, source, dctx, options, target); break; \
default: use_default = ISC_TRUE; break; \
}
@@ -523,6 +531,7 @@
break; \
case 50: result = towire_nsec3(rdata, cctx, target); break; \
case 51: result = towire_nsec3param(rdata, cctx, target); break; \
+ case 55: result = towire_hip(rdata, cctx, target); break; \
case 99: result = towire_spf(rdata, cctx, target); break; \
case 103: result = towire_unspec(rdata, cctx, target); break; \
case 249: result = towire_tkey(rdata, cctx, target); break; \
@@ -532,6 +541,7 @@
} \
break; \
case 32769: result = towire_dlv(rdata, cctx, target); break; \
+ case 65533: result = towire_keydata(rdata, cctx, target); break; \
default: use_default = ISC_TRUE; break; \
}
@@ -634,6 +644,7 @@
break; \
case 50: result = compare_nsec3(rdata1, rdata2); break; \
case 51: result = compare_nsec3param(rdata1, rdata2); break; \
+ case 55: result = compare_hip(rdata1, rdata2); break; \
case 99: result = compare_spf(rdata1, rdata2); break; \
case 103: result = compare_unspec(rdata1, rdata2); break; \
case 249: result = compare_tkey(rdata1, rdata2); break; \
@@ -643,6 +654,120 @@
} \
break; \
case 32769: result = compare_dlv(rdata1, rdata2); break; \
+ case 65533: result = compare_keydata(rdata1, rdata2); break; \
+ default: use_default = ISC_TRUE; break; \
+ }
+
+#define CASECOMPARESWITCH \
+ switch (rdata1->type) { \
+ case 1: switch (rdata1->rdclass) { \
+ case 1: result = casecompare_in_a(rdata1, rdata2); break; \
+ case 3: result = casecompare_ch_a(rdata1, rdata2); break; \
+ case 4: result = casecompare_hs_a(rdata1, rdata2); break; \
+ default: use_default = ISC_TRUE; break; \
+ } \
+ break; \
+ case 2: result = casecompare_ns(rdata1, rdata2); break; \
+ case 3: result = casecompare_md(rdata1, rdata2); break; \
+ case 4: result = casecompare_mf(rdata1, rdata2); break; \
+ case 5: result = casecompare_cname(rdata1, rdata2); break; \
+ case 6: result = casecompare_soa(rdata1, rdata2); break; \
+ case 7: result = casecompare_mb(rdata1, rdata2); break; \
+ case 8: result = casecompare_mg(rdata1, rdata2); break; \
+ case 9: result = casecompare_mr(rdata1, rdata2); break; \
+ case 10: result = casecompare_null(rdata1, rdata2); break; \
+ case 11: switch (rdata1->rdclass) { \
+ case 1: result = casecompare_in_wks(rdata1, rdata2); break; \
+ default: use_default = ISC_TRUE; break; \
+ } \
+ break; \
+ case 12: result = casecompare_ptr(rdata1, rdata2); break; \
+ case 13: result = casecompare_hinfo(rdata1, rdata2); break; \
+ case 14: result = casecompare_minfo(rdata1, rdata2); break; \
+ case 15: result = casecompare_mx(rdata1, rdata2); break; \
+ case 16: result = casecompare_txt(rdata1, rdata2); break; \
+ case 17: result = casecompare_rp(rdata1, rdata2); break; \
+ case 18: result = casecompare_afsdb(rdata1, rdata2); break; \
+ case 19: result = casecompare_x25(rdata1, rdata2); break; \
+ case 20: result = casecompare_isdn(rdata1, rdata2); break; \
+ case 21: result = casecompare_rt(rdata1, rdata2); break; \
+ case 22: switch (rdata1->rdclass) { \
+ case 1: result = casecompare_in_nsap(rdata1, rdata2); break; \
+ default: use_default = ISC_TRUE; break; \
+ } \
+ break; \
+ case 23: switch (rdata1->rdclass) { \
+ case 1: result = casecompare_in_nsap_ptr(rdata1, rdata2); break; \
+ default: use_default = ISC_TRUE; break; \
+ } \
+ break; \
+ case 24: result = casecompare_sig(rdata1, rdata2); break; \
+ case 25: result = casecompare_key(rdata1, rdata2); break; \
+ case 26: switch (rdata1->rdclass) { \
+ case 1: result = casecompare_in_px(rdata1, rdata2); break; \
+ default: use_default = ISC_TRUE; break; \
+ } \
+ break; \
+ case 27: result = casecompare_gpos(rdata1, rdata2); break; \
+ case 28: switch (rdata1->rdclass) { \
+ case 1: result = casecompare_in_aaaa(rdata1, rdata2); break; \
+ default: use_default = ISC_TRUE; break; \
+ } \
+ break; \
+ case 29: result = casecompare_loc(rdata1, rdata2); break; \
+ case 30: result = casecompare_nxt(rdata1, rdata2); break; \
+ case 33: switch (rdata1->rdclass) { \
+ case 1: result = casecompare_in_srv(rdata1, rdata2); break; \
+ default: use_default = ISC_TRUE; break; \
+ } \
+ break; \
+ case 35: switch (rdata1->rdclass) { \
+ case 1: result = casecompare_in_naptr(rdata1, rdata2); break; \
+ default: use_default = ISC_TRUE; break; \
+ } \
+ break; \
+ case 36: switch (rdata1->rdclass) { \
+ case 1: result = casecompare_in_kx(rdata1, rdata2); break; \
+ default: use_default = ISC_TRUE; break; \
+ } \
+ break; \
+ case 37: result = casecompare_cert(rdata1, rdata2); break; \
+ case 38: switch (rdata1->rdclass) { \
+ case 1: result = casecompare_in_a6(rdata1, rdata2); break; \
+ default: use_default = ISC_TRUE; break; \
+ } \
+ break; \
+ case 39: result = casecompare_dname(rdata1, rdata2); break; \
+ case 41: result = casecompare_opt(rdata1, rdata2); break; \
+ case 42: switch (rdata1->rdclass) { \
+ case 1: result = casecompare_in_apl(rdata1, rdata2); break; \
+ default: use_default = ISC_TRUE; break; \
+ } \
+ break; \
+ case 43: result = casecompare_ds(rdata1, rdata2); break; \
+ case 44: result = casecompare_sshfp(rdata1, rdata2); break; \
+ case 45: result = casecompare_ipseckey(rdata1, rdata2); break; \
+ case 46: result = casecompare_rrsig(rdata1, rdata2); break; \
+ case 47: result = casecompare_nsec(rdata1, rdata2); break; \
+ case 48: result = casecompare_dnskey(rdata1, rdata2); break; \
+ case 49: switch (rdata1->rdclass) { \
+ case 1: result = casecompare_in_dhcid(rdata1, rdata2); break; \
+ default: use_default = ISC_TRUE; break; \
+ } \
+ break; \
+ case 50: result = casecompare_nsec3(rdata1, rdata2); break; \
+ case 51: result = casecompare_nsec3param(rdata1, rdata2); break; \
+ case 55: result = casecompare_hip(rdata1, rdata2); break; \
+ case 99: result = casecompare_spf(rdata1, rdata2); break; \
+ case 103: result = casecompare_unspec(rdata1, rdata2); break; \
+ case 249: result = casecompare_tkey(rdata1, rdata2); break; \
+ case 250: switch (rdata1->rdclass) { \
+ case 255: result = casecompare_any_tsig(rdata1, rdata2); break; \
+ default: use_default = ISC_TRUE; break; \
+ } \
+ break; \
+ case 32769: result = casecompare_dlv(rdata1, rdata2); break; \
+ case 65533: result = casecompare_keydata(rdata1, rdata2); break; \
default: use_default = ISC_TRUE; break; \
}
@@ -745,6 +870,7 @@
break; \
case 50: result = fromstruct_nsec3(rdclass, type, source, target); break; \
case 51: result = fromstruct_nsec3param(rdclass, type, source, target); break; \
+ case 55: result = fromstruct_hip(rdclass, type, source, target); break; \
case 99: result = fromstruct_spf(rdclass, type, source, target); break; \
case 103: result = fromstruct_unspec(rdclass, type, source, target); break; \
case 249: result = fromstruct_tkey(rdclass, type, source, target); break; \
@@ -754,6 +880,7 @@
} \
break; \
case 32769: result = fromstruct_dlv(rdclass, type, source, target); break; \
+ case 65533: result = fromstruct_keydata(rdclass, type, source, target); break; \
default: use_default = ISC_TRUE; break; \
}
@@ -856,6 +983,7 @@
break; \
case 50: result = tostruct_nsec3(rdata, target, mctx); break; \
case 51: result = tostruct_nsec3param(rdata, target, mctx); break; \
+ case 55: result = tostruct_hip(rdata, target, mctx); break; \
case 99: result = tostruct_spf(rdata, target, mctx); break; \
case 103: result = tostruct_unspec(rdata, target, mctx); break; \
case 249: result = tostruct_tkey(rdata, target, mctx); break; \
@@ -865,6 +993,7 @@
} \
break; \
case 32769: result = tostruct_dlv(rdata, target, mctx); break; \
+ case 65533: result = tostruct_keydata(rdata, target, mctx); break; \
default: use_default = ISC_TRUE; break; \
}
@@ -967,6 +1096,7 @@
break; \
case 50: freestruct_nsec3(source); break; \
case 51: freestruct_nsec3param(source); break; \
+ case 55: freestruct_hip(source); break; \
case 99: freestruct_spf(source); break; \
case 103: freestruct_unspec(source); break; \
case 249: freestruct_tkey(source); break; \
@@ -976,6 +1106,7 @@
} \
break; \
case 32769: freestruct_dlv(source); break; \
+ case 65533: freestruct_keydata(source); break; \
default: break; \
}
@@ -1078,6 +1209,7 @@
break; \
case 50: result = additionaldata_nsec3(rdata, add, arg); break; \
case 51: result = additionaldata_nsec3param(rdata, add, arg); break; \
+ case 55: result = additionaldata_hip(rdata, add, arg); break; \
case 99: result = additionaldata_spf(rdata, add, arg); break; \
case 103: result = additionaldata_unspec(rdata, add, arg); break; \
case 249: result = additionaldata_tkey(rdata, add, arg); break; \
@@ -1087,6 +1219,7 @@
} \
break; \
case 32769: result = additionaldata_dlv(rdata, add, arg); break; \
+ case 65533: result = additionaldata_keydata(rdata, add, arg); break; \
default: use_default = ISC_TRUE; break; \
}
@@ -1189,6 +1322,7 @@
break; \
case 50: result = digest_nsec3(rdata, digest, arg); break; \
case 51: result = digest_nsec3param(rdata, digest, arg); break; \
+ case 55: result = digest_hip(rdata, digest, arg); break; \
case 99: result = digest_spf(rdata, digest, arg); break; \
case 103: result = digest_unspec(rdata, digest, arg); break; \
case 249: result = digest_tkey(rdata, digest, arg); break; \
@@ -1198,6 +1332,7 @@
} \
break; \
case 32769: result = digest_dlv(rdata, digest, arg); break; \
+ case 65533: result = digest_keydata(rdata, digest, arg); break; \
default: use_default = ISC_TRUE; break; \
}
@@ -1300,6 +1435,7 @@
break; \
case 50: result = checkowner_nsec3(name, rdclass, type, wildcard); break; \
case 51: result = checkowner_nsec3param(name, rdclass, type, wildcard); break; \
+ case 55: result = checkowner_hip(name, rdclass, type, wildcard); break; \
case 99: result = checkowner_spf(name, rdclass, type, wildcard); break; \
case 103: result = checkowner_unspec(name, rdclass, type, wildcard); break; \
case 249: result = checkowner_tkey(name, rdclass, type, wildcard); break; \
@@ -1309,6 +1445,7 @@
} \
break; \
case 32769: result = checkowner_dlv(name, rdclass, type, wildcard); break; \
+ case 65533: result = checkowner_keydata(name, rdclass, type, wildcard); break; \
default: result = ISC_TRUE; break; \
}
@@ -1411,6 +1548,7 @@
break; \
case 50: result = checknames_nsec3(rdata, owner, bad); break; \
case 51: result = checknames_nsec3param(rdata, owner, bad); break; \
+ case 55: result = checknames_hip(rdata, owner, bad); break; \
case 99: result = checknames_spf(rdata, owner, bad); break; \
case 103: result = checknames_unspec(rdata, owner, bad); break; \
case 249: result = checknames_tkey(rdata, owner, bad); break; \
@@ -1420,6 +1558,7 @@
} \
break; \
case 32769: result = checknames_dlv(rdata, owner, bad); break; \
+ case 65533: result = checknames_keydata(rdata, owner, bad); break; \
default: result = ISC_TRUE; break; \
}
#define RDATATYPE_COMPARE(_s, _d, _tn, _n, _tp) \
@@ -1579,6 +1718,9 @@
case 233: \
RDATATYPE_COMPARE("nsec3", 50, _typename, _length, _typep); \
break; \
+ case 208: \
+ RDATATYPE_COMPARE("hip", 55, _typename, _length, _typep); \
+ break; \
case 230: \
RDATATYPE_COMPARE("uinfo", 100, _typename, _length, _typep); \
break; \
@@ -1605,6 +1747,7 @@
break; \
case 50: \
RDATATYPE_COMPARE("maila", 254, _typename, _length, _typep); \
+ RDATATYPE_COMPARE("keydata", 65533, _typename, _length, _typep); \
break; \
case 68: \
RDATATYPE_COMPARE("any", 255, _typename, _length, _typep); \
@@ -1663,6 +1806,7 @@
case 49: return (RRTYPE_DHCID_ATTRIBUTES); \
case 50: return (RRTYPE_NSEC3_ATTRIBUTES); \
case 51: return (RRTYPE_NSEC3PARAM_ATTRIBUTES); \
+ case 55: return (RRTYPE_HIP_ATTRIBUTES); \
case 99: return (RRTYPE_SPF_ATTRIBUTES); \
case 100: return (DNS_RDATATYPEATTR_RESERVED); \
case 101: return (DNS_RDATATYPEATTR_RESERVED); \
@@ -1676,6 +1820,7 @@
case 254: return (DNS_RDATATYPEATTR_META | DNS_RDATATYPEATTR_QUESTIONONLY); \
case 255: return (DNS_RDATATYPEATTR_META | DNS_RDATATYPEATTR_QUESTIONONLY); \
case 32769: return (RRTYPE_DLV_ATTRIBUTES); \
+ case 65533: return (RRTYPE_KEYDATA_ATTRIBUTES); \
}
#define RDATATYPE_TOTEXT_SW \
switch (type) { \
@@ -1730,6 +1875,7 @@
case 49: return (str_totext("DHCID", target)); \
case 50: return (str_totext("NSEC3", target)); \
case 51: return (str_totext("NSEC3PARAM", target)); \
+ case 55: return (str_totext("HIP", target)); \
case 99: return (str_totext("SPF", target)); \
case 100: return (str_totext("UINFO", target)); \
case 101: return (str_totext("UID", target)); \
@@ -1743,5 +1889,6 @@
case 254: return (str_totext("MAILA", target)); \
case 255: return (str_totext("ANY", target)); \
case 32769: return (str_totext("DLV", target)); \
+ case 65533: return (str_totext("KEYDATA", target)); \
}
#endif /* DNS_CODE_H */
diff --git a/lib/bind/dns/dns/enumtype.h b/lib/bind/dns/dns/enumtype.h
index 1f4e375..ef81791 100644
--- a/lib/bind/dns/dns/enumtype.h
+++ b/lib/bind/dns/dns/enumtype.h
@@ -78,11 +78,13 @@ enum {
dns_rdatatype_dhcid = 49,
dns_rdatatype_nsec3 = 50,
dns_rdatatype_nsec3param = 51,
+ dns_rdatatype_hip = 55,
dns_rdatatype_spf = 99,
dns_rdatatype_unspec = 103,
dns_rdatatype_tkey = 249,
dns_rdatatype_tsig = 250,
dns_rdatatype_dlv = 32769,
+ dns_rdatatype_keydata = 65533,
dns_rdatatype_ixfr = 251,
dns_rdatatype_axfr = 252,
dns_rdatatype_mailb = 253,
@@ -138,11 +140,13 @@ enum {
#define dns_rdatatype_dhcid ((dns_rdatatype_t)dns_rdatatype_dhcid)
#define dns_rdatatype_nsec3 ((dns_rdatatype_t)dns_rdatatype_nsec3)
#define dns_rdatatype_nsec3param ((dns_rdatatype_t)dns_rdatatype_nsec3param)
+#define dns_rdatatype_hip ((dns_rdatatype_t)dns_rdatatype_hip)
#define dns_rdatatype_spf ((dns_rdatatype_t)dns_rdatatype_spf)
#define dns_rdatatype_unspec ((dns_rdatatype_t)dns_rdatatype_unspec)
#define dns_rdatatype_tkey ((dns_rdatatype_t)dns_rdatatype_tkey)
#define dns_rdatatype_tsig ((dns_rdatatype_t)dns_rdatatype_tsig)
#define dns_rdatatype_dlv ((dns_rdatatype_t)dns_rdatatype_dlv)
+#define dns_rdatatype_keydata ((dns_rdatatype_t)dns_rdatatype_keydata)
#define dns_rdatatype_ixfr ((dns_rdatatype_t)dns_rdatatype_ixfr)
#define dns_rdatatype_axfr ((dns_rdatatype_t)dns_rdatatype_axfr)
#define dns_rdatatype_mailb ((dns_rdatatype_t)dns_rdatatype_mailb)
diff --git a/lib/bind/dns/dns/rdatastruct.h b/lib/bind/dns/dns/rdatastruct.h
index e7075c0..880beee 100644
--- a/lib/bind/dns/dns/rdatastruct.h
+++ b/lib/bind/dns/dns/rdatastruct.h
@@ -43,7 +43,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: rdatastructpre.h,v 1.16 2007/06/19 23:47:17 tbox Exp $ */
+/* $Id: rdatastructpre.h,v 1.16 2007-06-19 23:47:17 tbox Exp $ */
#ifndef DNS_RDATASTRUCT_H
#define DNS_RDATASTRUCT_H 1
@@ -89,7 +89,7 @@ typedef struct dns_rdatacommon {
#ifndef IN_1_A_1_H
#define IN_1_A_1_H 1
-/* $Id: a_1.h,v 1.28 2007/06/19 23:47:17 tbox Exp $ */
+/* $Id: a_1.h,v 1.28 2007-06-19 23:47:17 tbox Exp $ */
typedef struct dns_rdata_in_a {
dns_rdatacommon_t common;
@@ -113,7 +113,7 @@ typedef struct dns_rdata_in_a {
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: a_1.h,v 1.5 2007/06/19 23:47:17 tbox Exp $ */
+/* $Id: a_1.h,v 1.5 2007-06-19 23:47:17 tbox Exp $ */
/* by Bjorn.Victor@it.uu.se, 2005-05-07 */
/* Based on generic/mx_15.h */
@@ -152,7 +152,7 @@ typedef struct dns_rdata_ch_a {
#ifndef HS_4_A_1_H
#define HS_4_A_1_H 1
-/* $Id: a_1.h,v 1.12 2007/06/19 23:47:17 tbox Exp $ */
+/* $Id: a_1.h,v 1.12 2007-06-19 23:47:17 tbox Exp $ */
typedef struct dns_rdata_hs_a {
dns_rdatacommon_t common;
@@ -181,7 +181,7 @@ typedef struct dns_rdata_hs_a {
#ifndef GENERIC_NS_2_H
#define GENERIC_NS_2_H 1
-/* $Id: ns_2.h,v 1.27 2007/06/19 23:47:17 tbox Exp $ */
+/* $Id: ns_2.h,v 1.27 2007-06-19 23:47:17 tbox Exp $ */
typedef struct dns_rdata_ns {
dns_rdatacommon_t common;
@@ -212,7 +212,7 @@ typedef struct dns_rdata_ns {
#ifndef GENERIC_MD_3_H
#define GENERIC_MD_3_H 1
-/* $Id: md_3.h,v 1.28 2007/06/19 23:47:17 tbox Exp $ */
+/* $Id: md_3.h,v 1.28 2007-06-19 23:47:17 tbox Exp $ */
typedef struct dns_rdata_md {
dns_rdatacommon_t common;
@@ -243,7 +243,7 @@ typedef struct dns_rdata_md {
#ifndef GENERIC_MF_4_H
#define GENERIC_MF_4_H 1
-/* $Id: mf_4.h,v 1.26 2007/06/19 23:47:17 tbox Exp $ */
+/* $Id: mf_4.h,v 1.26 2007-06-19 23:47:17 tbox Exp $ */
typedef struct dns_rdata_mf {
dns_rdatacommon_t common;
@@ -269,7 +269,7 @@ typedef struct dns_rdata_mf {
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: cname_5.h,v 1.26 2007/06/19 23:47:17 tbox Exp $ */
+/* $Id: cname_5.h,v 1.26 2007-06-19 23:47:17 tbox Exp $ */
#ifndef GENERIC_CNAME_5_H
#define GENERIC_CNAME_5_H 1
@@ -302,7 +302,7 @@ typedef struct dns_rdata_cname {
#ifndef GENERIC_SOA_6_H
#define GENERIC_SOA_6_H 1
-/* $Id: soa_6.h,v 1.32 2007/06/19 23:47:17 tbox Exp $ */
+/* $Id: soa_6.h,v 1.32 2007-06-19 23:47:17 tbox Exp $ */
typedef struct dns_rdata_soa {
dns_rdatacommon_t common;
@@ -339,7 +339,7 @@ typedef struct dns_rdata_soa {
#ifndef GENERIC_MB_7_H
#define GENERIC_MB_7_H 1
-/* $Id: mb_7.h,v 1.27 2007/06/19 23:47:17 tbox Exp $ */
+/* $Id: mb_7.h,v 1.27 2007-06-19 23:47:17 tbox Exp $ */
typedef struct dns_rdata_mb {
dns_rdatacommon_t common;
@@ -369,7 +369,7 @@ typedef struct dns_rdata_mb {
#ifndef GENERIC_MG_8_H
#define GENERIC_MG_8_H 1
-/* $Id: mg_8.h,v 1.26 2007/06/19 23:47:17 tbox Exp $ */
+/* $Id: mg_8.h,v 1.26 2007-06-19 23:47:17 tbox Exp $ */
typedef struct dns_rdata_mg {
dns_rdatacommon_t common;
@@ -399,7 +399,7 @@ typedef struct dns_rdata_mg {
#ifndef GENERIC_MR_9_H
#define GENERIC_MR_9_H 1
-/* $Id: mr_9.h,v 1.26 2007/06/19 23:47:17 tbox Exp $ */
+/* $Id: mr_9.h,v 1.26 2007-06-19 23:47:17 tbox Exp $ */
typedef struct dns_rdata_mr {
dns_rdatacommon_t common;
@@ -429,7 +429,7 @@ typedef struct dns_rdata_mr {
#ifndef GENERIC_NULL_10_H
#define GENERIC_NULL_10_H 1
-/* $Id: null_10.h,v 1.25 2007/06/19 23:47:17 tbox Exp $ */
+/* $Id: null_10.h,v 1.25 2007-06-19 23:47:17 tbox Exp $ */
typedef struct dns_rdata_null {
dns_rdatacommon_t common;
@@ -460,7 +460,7 @@ typedef struct dns_rdata_null {
#ifndef IN_1_WKS_11_H
#define IN_1_WKS_11_H 1
-/* $Id: wks_11.h,v 1.22 2007/06/19 23:47:17 tbox Exp $ */
+/* $Id: wks_11.h,v 1.22 2007-06-19 23:47:17 tbox Exp $ */
typedef struct dns_rdata_in_wks {
dns_rdatacommon_t common;
@@ -493,7 +493,7 @@ typedef struct dns_rdata_in_wks {
#ifndef GENERIC_PTR_12_H
#define GENERIC_PTR_12_H 1
-/* $Id: ptr_12.h,v 1.27 2007/06/19 23:47:17 tbox Exp $ */
+/* $Id: ptr_12.h,v 1.27 2007-06-19 23:47:17 tbox Exp $ */
typedef struct dns_rdata_ptr {
dns_rdatacommon_t common;
@@ -522,7 +522,7 @@ typedef struct dns_rdata_ptr {
#ifndef GENERIC_HINFO_13_H
#define GENERIC_HINFO_13_H 1
-/* $Id: hinfo_13.h,v 1.25 2007/06/19 23:47:17 tbox Exp $ */
+/* $Id: hinfo_13.h,v 1.25 2007-06-19 23:47:17 tbox Exp $ */
typedef struct dns_rdata_hinfo {
dns_rdatacommon_t common;
@@ -555,7 +555,7 @@ typedef struct dns_rdata_hinfo {
#ifndef GENERIC_MINFO_14_H
#define GENERIC_MINFO_14_H 1
-/* $Id: minfo_14.h,v 1.27 2007/06/19 23:47:17 tbox Exp $ */
+/* $Id: minfo_14.h,v 1.27 2007-06-19 23:47:17 tbox Exp $ */
typedef struct dns_rdata_minfo {
dns_rdatacommon_t common;
@@ -586,7 +586,7 @@ typedef struct dns_rdata_minfo {
#ifndef GENERIC_MX_15_H
#define GENERIC_MX_15_H 1
-/* $Id: mx_15.h,v 1.29 2007/06/19 23:47:17 tbox Exp $ */
+/* $Id: mx_15.h,v 1.29 2007-06-19 23:47:17 tbox Exp $ */
typedef struct dns_rdata_mx {
dns_rdatacommon_t common;
@@ -617,7 +617,7 @@ typedef struct dns_rdata_mx {
#ifndef GENERIC_TXT_16_H
#define GENERIC_TXT_16_H 1
-/* $Id: txt_16.h,v 1.28 2007/06/19 23:47:17 tbox Exp $ */
+/* $Id: txt_16.h,v 1.28 2007-06-19 23:47:17 tbox Exp $ */
typedef struct dns_rdata_txt_string {
isc_uint8_t length;
@@ -668,7 +668,7 @@ dns_rdata_txt_current(dns_rdata_txt_t *, dns_rdata_txt_string_t *);
#ifndef GENERIC_RP_17_H
#define GENERIC_RP_17_H 1
-/* $Id: rp_17.h,v 1.21 2007/06/19 23:47:17 tbox Exp $ */
+/* $Id: rp_17.h,v 1.21 2007-06-19 23:47:17 tbox Exp $ */
/*!
* \brief Per RFC1183 */
@@ -702,7 +702,7 @@ typedef struct dns_rdata_rp {
#ifndef GENERIC_AFSDB_18_H
#define GENERIC_AFSDB_18_H 1
-/* $Id: afsdb_18.h,v 1.20 2007/06/19 23:47:17 tbox Exp $ */
+/* $Id: afsdb_18.h,v 1.20 2007-06-19 23:47:17 tbox Exp $ */
/*!
* \brief Per RFC1183 */
@@ -736,7 +736,7 @@ typedef struct dns_rdata_afsdb {
#ifndef GENERIC_X25_19_H
#define GENERIC_X25_19_H 1
-/* $Id: x25_19.h,v 1.18 2007/06/19 23:47:17 tbox Exp $ */
+/* $Id: x25_19.h,v 1.18 2007-06-19 23:47:17 tbox Exp $ */
/*!
* \brief Per RFC1183 */
@@ -769,7 +769,7 @@ typedef struct dns_rdata_x25 {
#ifndef GENERIC_ISDN_20_H
#define GENERIC_ISDN_20_H 1
-/* $Id: isdn_20.h,v 1.18 2007/06/19 23:47:17 tbox Exp $ */
+/* $Id: isdn_20.h,v 1.18 2007-06-19 23:47:17 tbox Exp $ */
/*!
* \brief Per RFC1183 */
@@ -804,7 +804,7 @@ typedef struct dns_rdata_isdn {
#ifndef GENERIC_RT_21_H
#define GENERIC_RT_21_H 1
-/* $Id: rt_21.h,v 1.21 2007/06/19 23:47:17 tbox Exp $ */
+/* $Id: rt_21.h,v 1.21 2007-06-19 23:47:17 tbox Exp $ */
/*!
* \brief Per RFC1183 */
@@ -837,7 +837,7 @@ typedef struct dns_rdata_rt {
#ifndef IN_1_NSAP_22_H
#define IN_1_NSAP_22_H 1
-/* $Id: nsap_22.h,v 1.18 2007/06/19 23:47:17 tbox Exp $ */
+/* $Id: nsap_22.h,v 1.18 2007-06-19 23:47:17 tbox Exp $ */
/*!
* \brief Per RFC1706 */
@@ -870,7 +870,7 @@ typedef struct dns_rdata_in_nsap {
#ifndef IN_1_NSAP_PTR_23_H
#define IN_1_NSAP_PTR_23_H 1
-/* $Id: nsap-ptr_23.h,v 1.19 2007/06/19 23:47:17 tbox Exp $ */
+/* $Id: nsap-ptr_23.h,v 1.19 2007-06-19 23:47:17 tbox Exp $ */
/*!
* \brief Per RFC1348. Obsoleted in RFC 1706 - use PTR instead. */
@@ -902,7 +902,7 @@ typedef struct dns_rdata_in_nsap_ptr {
#ifndef GENERIC_SIG_24_H
#define GENERIC_SIG_24_H 1
-/* $Id: sig_24.h,v 1.26 2007/06/19 23:47:17 tbox Exp $ */
+/* $Id: sig_24.h,v 1.26 2007-06-19 23:47:17 tbox Exp $ */
/*!
* \brief Per RFC2535 */
@@ -944,7 +944,7 @@ typedef struct dns_rdata_sig_t {
#ifndef GENERIC_KEY_25_H
#define GENERIC_KEY_25_H 1
-/* $Id: key_25.h,v 1.19 2007/06/19 23:47:17 tbox Exp $ */
+/* $Id: key_25.h,v 1.19 2007-06-19 23:47:17 tbox Exp $ */
/*!
* \brief Per RFC2535 */
@@ -981,7 +981,7 @@ typedef struct dns_rdata_key_t {
#ifndef IN_1_PX_26_H
#define IN_1_PX_26_H 1
-/* $Id: px_26.h,v 1.19 2007/06/19 23:47:17 tbox Exp $ */
+/* $Id: px_26.h,v 1.19 2007-06-19 23:47:17 tbox Exp $ */
/*!
* \brief Per RFC2163 */
@@ -1015,7 +1015,7 @@ typedef struct dns_rdata_in_px {
#ifndef GENERIC_GPOS_27_H
#define GENERIC_GPOS_27_H 1
-/* $Id: gpos_27.h,v 1.17 2007/06/19 23:47:17 tbox Exp $ */
+/* $Id: gpos_27.h,v 1.17 2007-06-19 23:47:17 tbox Exp $ */
/*!
* \brief per RFC1712 */
@@ -1052,7 +1052,7 @@ typedef struct dns_rdata_gpos {
#ifndef IN_1_AAAA_28_H
#define IN_1_AAAA_28_H 1
-/* $Id: aaaa_28.h,v 1.21 2007/06/19 23:47:17 tbox Exp $ */
+/* $Id: aaaa_28.h,v 1.21 2007-06-19 23:47:17 tbox Exp $ */
/*!
* \brief Per RFC1886 */
@@ -1083,7 +1083,7 @@ typedef struct dns_rdata_in_aaaa {
#ifndef GENERIC_LOC_29_H
#define GENERIC_LOC_29_H 1
-/* $Id: loc_29.h,v 1.19 2007/06/19 23:47:17 tbox Exp $ */
+/* $Id: loc_29.h,v 1.19 2007-06-19 23:47:17 tbox Exp $ */
/*!
* \brief Per RFC1876 */
@@ -1126,7 +1126,7 @@ typedef struct dns_rdata_loc {
#ifndef GENERIC_NXT_30_H
#define GENERIC_NXT_30_H 1
-/* $Id: nxt_30.h,v 1.25 2007/06/19 23:47:17 tbox Exp $ */
+/* $Id: nxt_30.h,v 1.25 2007-06-19 23:47:17 tbox Exp $ */
/*!
* \brief RFC2535 */
@@ -1160,7 +1160,7 @@ typedef struct dns_rdata_nxt {
#ifndef IN_1_SRV_33_H
#define IN_1_SRV_33_H 1
-/* $Id: srv_33.h,v 1.19 2007/06/19 23:47:17 tbox Exp $ */
+/* $Id: srv_33.h,v 1.19 2007-06-19 23:47:17 tbox Exp $ */
/* Reviewed: Fri Mar 17 13:01:00 PST 2000 by bwelling */
@@ -1197,7 +1197,7 @@ typedef struct dns_rdata_in_srv {
#ifndef IN_1_NAPTR_35_H
#define IN_1_NAPTR_35_H 1
-/* $Id: naptr_35.h,v 1.23 2007/06/19 23:47:17 tbox Exp $ */
+/* $Id: naptr_35.h,v 1.23 2007-06-19 23:47:17 tbox Exp $ */
/*!
* \brief Per RFC2915 */
@@ -1237,7 +1237,7 @@ typedef struct dns_rdata_in_naptr {
#ifndef IN_1_KX_36_H
#define IN_1_KX_36_H 1
-/* $Id: kx_36.h,v 1.20 2007/06/19 23:47:17 tbox Exp $ */
+/* $Id: kx_36.h,v 1.20 2007-06-19 23:47:17 tbox Exp $ */
/*!
* \brief Per RFC2230 */
@@ -1267,7 +1267,7 @@ typedef struct dns_rdata_in_kx {
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: cert_37.h,v 1.20 2007/06/19 23:47:17 tbox Exp $ */
+/* $Id: cert_37.h,v 1.20 2007-06-19 23:47:17 tbox Exp $ */
#ifndef GENERIC_CERT_37_H
#define GENERIC_CERT_37_H 1
@@ -1304,7 +1304,7 @@ typedef struct dns_rdata_cert {
#ifndef IN_1_A6_38_H
#define IN_1_A6_38_H 1
-/* $Id: a6_38.h,v 1.24 2007/06/19 23:47:17 tbox Exp $ */
+/* $Id: a6_38.h,v 1.24 2007-06-19 23:47:17 tbox Exp $ */
/*!
* \brief Per RFC2874 */
@@ -1338,7 +1338,7 @@ typedef struct dns_rdata_in_a6 {
#ifndef GENERIC_DNAME_39_H
#define GENERIC_DNAME_39_H 1
-/* $Id: dname_39.h,v 1.21 2007/06/19 23:47:17 tbox Exp $ */
+/* $Id: dname_39.h,v 1.21 2007-06-19 23:47:17 tbox Exp $ */
/*!
* \brief per RFC2672 */
@@ -1370,7 +1370,7 @@ typedef struct dns_rdata_dname {
#ifndef GENERIC_OPT_41_H
#define GENERIC_OPT_41_H 1
-/* $Id: opt_41.h,v 1.18 2007/06/19 23:47:17 tbox Exp $ */
+/* $Id: opt_41.h,v 1.18 2007-06-19 23:47:17 tbox Exp $ */
/*!
* \brief Per RFC2671 */
@@ -1426,7 +1426,7 @@ dns_rdata_opt_current(dns_rdata_opt_t *, dns_rdata_opt_opcode_t *);
#ifndef IN_1_APL_42_H
#define IN_1_APL_42_H 1
-/* $Id: apl_42.h,v 1.6 2007/06/19 23:47:17 tbox Exp $ */
+/* $Id: apl_42.h,v 1.6 2007-06-19 23:47:17 tbox Exp $ */
typedef struct dns_rdata_apl_ent {
isc_boolean_t negative;
@@ -1478,7 +1478,7 @@ dns_rdata_apl_current(dns_rdata_in_apl_t *, dns_rdata_apl_ent_t *);
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: ds_43.h,v 1.7 2007/06/19 23:47:17 tbox Exp $ */
+/* $Id: ds_43.h,v 1.7 2007-06-19 23:47:17 tbox Exp $ */
#ifndef GENERIC_DS_43_H
#define GENERIC_DS_43_H 1
@@ -1513,7 +1513,7 @@ typedef struct dns_rdata_ds {
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: sshfp_44.h,v 1.8 2007/06/19 23:47:17 tbox Exp $ */
+/* $Id: sshfp_44.h,v 1.8 2007-06-19 23:47:17 tbox Exp $ */
/*!
* \brief Per RFC 4255 */
@@ -1547,7 +1547,7 @@ typedef struct dns_rdata_sshfp {
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: ipseckey_45.h,v 1.4 2007/06/19 23:47:17 tbox Exp $ */
+/* $Id: ipseckey_45.h,v 1.4 2007-06-19 23:47:17 tbox Exp $ */
#ifndef GENERIC_IPSECKEY_45_H
#define GENERIC_IPSECKEY_45_H 1
@@ -1586,7 +1586,7 @@ typedef struct dns_rdata_ipseckey {
#ifndef GENERIC_DNSSIG_46_H
#define GENERIC_DNSSIG_46_H 1
-/* $Id: rrsig_46.h,v 1.7 2007/06/19 23:47:17 tbox Exp $ */
+/* $Id: rrsig_46.h,v 1.7 2007-06-19 23:47:17 tbox Exp $ */
/*!
* \brief Per RFC2535 */
@@ -1627,7 +1627,7 @@ typedef struct dns_rdata_rrsig {
#ifndef GENERIC_NSEC_47_H
#define GENERIC_NSEC_47_H 1
-/* $Id: nsec_47.h,v 1.10 2008/07/15 23:47:21 tbox Exp $ */
+/* $Id: nsec_47.h,v 1.10 2008-07-15 23:47:21 tbox Exp $ */
/*!
* \brief Per RFC 3845 */
@@ -1661,7 +1661,7 @@ typedef struct dns_rdata_nsec {
#ifndef GENERIC_DNSKEY_48_H
#define GENERIC_DNSKEY_48_H 1
-/* $Id: dnskey_48.h,v 1.7 2007/06/19 23:47:17 tbox Exp $ */
+/* $Id: dnskey_48.h,v 1.7 2007-06-19 23:47:17 tbox Exp $ */
/*!
* \brief per RFC2535 */
@@ -1698,7 +1698,7 @@ typedef struct dns_rdata_dnskey {
#ifndef IN_1_DHCID_49_H
#define IN_1_DHCID_49_H 1
-/* $Id: dhcid_49.h,v 1.5 2007/06/19 23:47:17 tbox Exp $ */
+/* $Id: dhcid_49.h,v 1.5 2007-06-19 23:47:17 tbox Exp $ */
typedef struct dns_rdata_in_dhcid {
dns_rdatacommon_t common;
@@ -1728,7 +1728,7 @@ typedef struct dns_rdata_in_dhcid {
#ifndef GENERIC_NSEC3_50_H
#define GENERIC_NSEC3_50_H 1
-/* $Id: nsec3_50.h,v 1.4 2008/09/25 04:02:39 tbox Exp $ */
+/* $Id: nsec3_50.h,v 1.4 2008-09-25 04:02:39 tbox Exp $ */
/*!
* \brief Per RFC 5155 */
@@ -1821,7 +1821,7 @@ typedef struct dns_rdata_nsec3 {
#ifndef GENERIC_NSEC3PARAM_51_H
#define GENERIC_NSEC3PARAM_51_H 1
-/* $Id: nsec3param_51.h,v 1.4 2008/09/25 04:02:39 tbox Exp $ */
+/* $Id: nsec3param_51.h,v 1.4 2008-09-25 04:02:39 tbox Exp $ */
/*!
* \brief Per RFC 5155 */
@@ -1840,6 +1840,53 @@ typedef struct dns_rdata_nsec3param {
#endif /* GENERIC_NSEC3PARAM_51_H */
/*
+ * Copyright (C) 2009 Internet Systems Consortium, Inc. ("ISC")
+ *
+ * Permission to use, copy, modify, and/or 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 ISC DISCLAIMS ALL WARRANTIES WITH
+ * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+ * AND FITNESS. IN NO EVENT SHALL ISC 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.
+ */
+
+/* $Id: hip_55.h,v 1.2 2009-02-26 06:09:19 marka Exp $ */
+
+#ifndef GENERIC_HIP_5_H
+#define GENERIC_HIP_5_H 1
+
+/* RFC 5205 */
+
+typedef struct dns_rdata_hip {
+ dns_rdatacommon_t common;
+ isc_mem_t * mctx;
+ unsigned char * hit;
+ unsigned char * key;
+ unsigned char * servers;
+ isc_uint8_t algorithm;
+ isc_uint8_t hit_len;
+ isc_uint16_t key_len;
+ isc_uint16_t servers_len;
+ /* Private */
+ isc_uint16_t offset;
+} dns_rdata_hip_t;
+
+isc_result_t
+dns_rdata_hip_first(dns_rdata_hip_t *);
+
+isc_result_t
+dns_rdata_hip_next(dns_rdata_hip_t *);
+
+void
+dns_rdata_hip_current(dns_rdata_hip_t *, dns_name_t *);
+
+#endif /* GENERIC_HIP_5_H */
+/*
* Copyright (C) 2004, 2005, 2007 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 1998-2001 Internet Software Consortium.
*
@@ -1859,7 +1906,7 @@ typedef struct dns_rdata_nsec3param {
#ifndef GENERIC_SPF_99_H
#define GENERIC_SPF_99_H 1
-/* $Id: spf_99.h,v 1.4 2007/06/19 23:47:17 tbox Exp $ */
+/* $Id: spf_99.h,v 1.4 2007-06-19 23:47:17 tbox Exp $ */
typedef struct dns_rdata_spf_string {
isc_uint8_t length;
@@ -1911,7 +1958,7 @@ dns_rdata_spf_current(dns_rdata_spf_t *, dns_rdata_spf_string_t *);
#ifndef GENERIC_UNSPEC_103_H
#define GENERIC_UNSPEC_103_H 1
-/* $Id: unspec_103.h,v 1.17 2007/06/19 23:47:17 tbox Exp $ */
+/* $Id: unspec_103.h,v 1.17 2007-06-19 23:47:17 tbox Exp $ */
typedef struct dns_rdata_unspec_t {
dns_rdatacommon_t common;
@@ -1941,7 +1988,7 @@ typedef struct dns_rdata_unspec_t {
#ifndef GENERIC_TKEY_249_H
#define GENERIC_TKEY_249_H 1
-/* $Id: tkey_249.h,v 1.24 2007/06/19 23:47:17 tbox Exp $ */
+/* $Id: tkey_249.h,v 1.24 2007-06-19 23:47:17 tbox Exp $ */
/*!
* \brief Per draft-ietf-dnsind-tkey-00.txt */
@@ -1979,7 +2026,7 @@ typedef struct dns_rdata_tkey {
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: tsig_250.h,v 1.25 2007/06/19 23:47:17 tbox Exp $ */
+/* $Id: tsig_250.h,v 1.25 2007-06-19 23:47:17 tbox Exp $ */
#ifndef ANY_255_TSIG_250_H
#define ANY_255_TSIG_250_H 1
@@ -2016,7 +2063,7 @@ typedef struct dns_rdata_any_tsig {
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: dlv_32769.h,v 1.5 2007/06/19 23:47:17 tbox Exp $ */
+/* $Id: dlv_32769.h,v 1.5 2007-06-19 23:47:17 tbox Exp $ */
/* draft-ietf-dnsext-delegation-signer-05.txt */
#ifndef GENERIC_DLV_32769_H
@@ -2034,6 +2081,41 @@ typedef struct dns_rdata_dlv {
#endif /* GENERIC_DLV_32769_H */
/*
+ * Copyright (C) 2009 Internet Systems Consortium, Inc. ("ISC")
+ *
+ * Permission to use, copy, modify, and/or 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 ISC DISCLAIMS ALL WARRANTIES WITH
+ * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+ * AND FITNESS. IN NO EVENT SHALL ISC 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.
+ */
+
+#ifndef GENERIC_KEYDATA_65533_H
+#define GENERIC_KEYDATA_65533_H 1
+
+/* $Id: keydata_65533.h,v 1.2 2009-06-30 02:52:32 each Exp $ */
+
+typedef struct dns_rdata_keydata {
+ dns_rdatacommon_t common;
+ isc_mem_t * mctx;
+ isc_uint32_t refresh; /* Timer for refreshing data */
+ isc_uint32_t addhd; /* Hold-down timer for adding */
+ isc_uint32_t removehd; /* Hold-down timer for removing */
+ isc_uint16_t flags; /* Copy of DNSKEY_48 */
+ isc_uint8_t protocol;
+ isc_uint8_t algorithm;
+ isc_uint16_t datalen;
+ unsigned char * data;
+} dns_rdata_keydata_t;
+
+#endif /* GENERIC_KEYDATA_65533_H */
+/*
* Copyright (C) 2004, 2007 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 1999-2001 Internet Software Consortium.
*
@@ -2050,7 +2132,7 @@ typedef struct dns_rdata_dlv {
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: rdatastructsuf.h,v 1.10 2007/06/19 23:47:17 tbox Exp $ */
+/* $Id: rdatastructsuf.h,v 1.10 2007-06-19 23:47:17 tbox Exp $ */
ISC_LANG_ENDDECLS
diff --git a/lib/bind/isc/Makefile b/lib/bind/isc/Makefile
index 7648da5..f41f604 100644
--- a/lib/bind/isc/Makefile
+++ b/lib/bind/isc/Makefile
@@ -27,18 +27,26 @@ SRCS+= condition.c mutex.c \
.PATH: ${SRCDIR}
SRCS+= inet_pton.c \
- assertions.c base32.c base64.c bitstring.c buffer.c \
- bufferlist.c commandline.c entropy.c error.c event.c \
- fsaccess.c hash.c heap.c hex.c hmacmd5.c hmacsha.c \
- httpd.c inet_aton.c inet_ntop.c iterated_hash.c \
+ assertions.c backtrace.c base32.c base64.c bitstring.c \
+ buffer.c bufferlist.c commandline.c error.c event.c \
+ fsaccess.c hash.c \
+ heap.c hex.c hmacmd5.c hmacsha.c \
+ httpd.c inet_aton.c \
+ inet_ntop.c \
+ iterated_hash.c \
lex.c lfsr.c lib.c log.c \
md5.c mem.c mutexblock.c \
netaddr.c netscope.c ondestroy.c \
- parseint.c portset.c print.c quota.c radix.c random.c \
+ parseint.c portset.c \
+ print.c \
+ quota.c radix.c random.c \
ratelimiter.c refcount.c region.c result.c rwlock.c \
serial.c sha1.c sha2.c sockaddr.c stats.c string.c strtoul.c \
symtab.c task.c taskpool.c timer.c version.c
+.PATH: ${.CURDIR}
+SRCS+= backtrace-emptytbl.c
+
CFLAGS+= -I${SRCDIR}/unix/include -I${SRCDIR}/pthreads/include
CFLAGS+= -I${SRCDIR}/include -I${.CURDIR}
CFLAGS+= -I${SRCDIR}/${ISC_ATOMIC_ARCH}/include
@@ -51,6 +59,7 @@ INCS= ${SRCDIR}/include/isc/app.h \
${SRCDIR}/include/isc/assertions.h \
${SRCDIR}/include/isc/base32.h \
${SRCDIR}/include/isc/base64.h \
+ ${SRCDIR}/include/isc/bind9.h \
${SRCDIR}/include/isc/bitstring.h \
${SRCDIR}/include/isc/boolean.h \
${SRCDIR}/include/isc/buffer.h \
@@ -84,6 +93,7 @@ INCS= ${SRCDIR}/include/isc/app.h \
${SRCDIR}/include/isc/msgcat.h \
${SRCDIR}/include/isc/msgs.h \
${SRCDIR}/include/isc/mutexblock.h \
+ ${SRCDIR}/include/isc/namespace.h \
${SRCDIR}/include/isc/netaddr.h \
${SRCDIR}/include/isc/netscope.h \
${SRCDIR}/include/isc/ondestroy.h \
diff --git a/lib/bind/isc/backtrace-emptytbl.c b/lib/bind/isc/backtrace-emptytbl.c
new file mode 100644
index 0000000..9c50d95
--- /dev/null
+++ b/lib/bind/isc/backtrace-emptytbl.c
@@ -0,0 +1,36 @@
+/* $FreeBSD$ */
+
+/*
+ * Copyright (C) 2009 Internet Systems Consortium, Inc. ("ISC")
+ *
+ * Permission to use, copy, modify, and/or 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 ISC DISCLAIMS ALL WARRANTIES WITH
+ * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+ * AND FITNESS. IN NO EVENT SHALL ISC 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.
+ */
+
+/* $Id: backtrace-emptytbl.c,v 1.3 2009-09-01 20:13:44 each Exp $ */
+
+/*! \file */
+
+/*
+ * This file defines an empty (default) symbol table used in backtrace.c
+ * If the application wants to have a complete symbol table, it should redefine
+ * isc__backtrace_symtable with the complete table in some way, and link the
+ * version of the library not including this definition
+ * (e.g. libisc-nosymbol.a).
+ */
+
+#include <config.h>
+
+#include <isc/backtrace.h>
+
+const int isc__backtrace_nsymbols = 0;
+const isc_backtrace_symmap_t isc__backtrace_symtable[] = { { NULL, "" } };
diff --git a/lib/bind/isc/isc/platform.h b/lib/bind/isc/isc/platform.h
index 2ac5042..7dab495 100644
--- a/lib/bind/isc/isc/platform.h
+++ b/lib/bind/isc/isc/platform.h
@@ -1,6 +1,5 @@
/* $FreeBSD$ */
-
/*
* Copyright (C) 2004-2010 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 1999-2003 Internet Software Consortium.
@@ -18,7 +17,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: platform.h.in,v 1.48.84.4 2010-06-03 23:47:49 tbox Exp $ */
+/* $Id: platform.h.in,v 1.56 2010-12-18 01:56:23 each Exp $ */
#ifndef ISC_PLATFORM_H
#define ISC_PLATFORM_H 1
@@ -149,6 +148,11 @@
*/
#undef ISC_PLATFORM_HAVEDEVPOLL
+/*! \brief
+ * Define if we want to log backtrace
+ */
+#define ISC_PLATFORM_USEBACKTRACE 1
+
/*
*** Printing.
***/
@@ -218,6 +222,12 @@
/*
+ * Defined to <gssapi_krb5.h> or <gssapi/gssapi_krb5.h> for how to
+ * include the GSSAPI KRB5 header.
+ */
+
+
+/*
* Defined to <krb5.h> or <krb5/krb5.h> for how to include
* the KRB5 header.
*/
@@ -253,7 +263,14 @@
* If the "xadd" operation is available on this architecture,
* ISC_PLATFORM_HAVEXADD will be defined.
*/
+/*
+ * FreeBSD local modification, preserve this over upgrades
+ */
+#if defined (__i386__) || defined (__amd64__) || defined (__ia64__)
#define ISC_PLATFORM_HAVEXADD 1
+#else
+#undef ISC_PLATFORM_HAVEXADD
+#endif
/*
* If the "xaddq" operation (64bit xadd) is available on this architecture,
@@ -272,18 +289,39 @@
* If the "atomic swap" operation is available on this architecture,
* ISC_PLATFORM_HAVEATOMICSTORE" will be defined.
*/
+/*
+ * FreeBSD local modification, preserve this over upgrades
+ */
+#if defined (__i386__) || defined (__amd64__) || defined (__ia64__)
#define ISC_PLATFORM_HAVEATOMICSTORE 1
+#else
+#undef ISC_PLATFORM_HAVEATOMICSTORE
+#endif
/*
* If the "compare-and-exchange" operation is available on this architecture,
* ISC_PLATFORM_HAVECMPXCHG will be defined.
*/
+/*
+ * FreeBSD local modification, preserve this over upgrades
+ */
+#if defined (__i386__) || defined (__amd64__) || defined (__ia64__)
#define ISC_PLATFORM_HAVECMPXCHG 1
+#else
+#undef ISC_PLATFORM_HAVECMPXCHG
+#endif
/*
* Define if gcc ASM extension is available
*/
+/*
+ * FreeBSD local modification, preserve this over upgrades
+ */
+#if defined (__i386__) || defined (__amd64__) || defined (__ia64__)
#define ISC_PLATFORM_USEGCCASM 1
+#else
+#undef ISC_PLATFORM_USEGCCASM
+#endif
/*
* Define if Tru64 style ASM syntax must be used.
@@ -300,6 +338,17 @@
*/
#define ISC_PLATFORM_HAVESTRINGSH 1
+/*
+ * Define if the hash functions must be provided by OpenSSL.
+ */
+#undef ISC_PLATFORM_OPENSSLHASH
+
+/*
+ * Defines for the noreturn attribute.
+ */
+#define ISC_PLATFORM_NORETURN_PRE
+#define ISC_PLATFORM_NORETURN_POST __attribute__((noreturn))
+
/***
*** Windows dll support.
***/
diff --git a/lib/bind/lwres/lwres/netdb.h b/lib/bind/lwres/lwres/netdb.h
index cb5cc28..59ad93a 100644
--- a/lib/bind/lwres/lwres/netdb.h
+++ b/lib/bind/lwres/lwres/netdb.h
@@ -17,7 +17,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: netdb.h.in,v 1.39.332.2 2009/01/18 23:47:41 tbox Exp $ */
+/* $Id: netdb.h.in,v 1.41 2009-01-18 23:48:14 tbox Exp $ */
/*! \file */
diff --git a/lib/bind/lwres/lwres/platform.h b/lib/bind/lwres/lwres/platform.h
index 608bb72..9f207db 100644
--- a/lib/bind/lwres/lwres/platform.h
+++ b/lib/bind/lwres/lwres/platform.h
@@ -17,7 +17,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: platform.h.in,v 1.21 2007/06/19 23:47:23 tbox Exp $ */
+/* $Id: platform.h.in,v 1.21 2007-06-19 23:47:23 tbox Exp $ */
/*! \file */
diff --git a/lib/clang/Makefile b/lib/clang/Makefile
index 212c7c8b..abcc113 100644
--- a/lib/clang/Makefile
+++ b/lib/clang/Makefile
@@ -2,6 +2,7 @@
.if !make(install)
SUBDIR= libclanganalysis \
+ libclangarcmigrate \
libclangast \
libclangbasic \
libclangcodegen \
@@ -39,16 +40,21 @@ SUBDIR= libclanganalysis \
\
libllvmarmasmparser \
libllvmarmcodegen \
+ libllvmarmdesc \
libllvmarmdisassembler \
libllvmarminfo \
libllvmarminstprinter \
libllvmmipscodegen \
+ libllvmmipsdesc \
libllvmmipsinfo \
+ libllvmmipsinstprinter \
libllvmpowerpccodegen \
+ libllvmpowerpcdesc \
libllvmpowerpcinfo \
libllvmpowerpcinstprinter \
libllvmx86asmparser \
libllvmx86codegen \
+ libllvmx86desc \
libllvmx86disassembler \
libllvmx86info \
libllvmx86instprinter \
diff --git a/lib/clang/clang.build.mk b/lib/clang/clang.build.mk
index f443f1d..17b47c3 100644
--- a/lib/clang/clang.build.mk
+++ b/lib/clang/clang.build.mk
@@ -34,11 +34,12 @@ CFLAGS+=-DCLANG_PREFIX=\"${TOOLS_PREFIX}\"
.PATH: ${LLVM_SRCS}/${SRCDIR}
-TBLGEN=tblgen ${CFLAGS:M-I*}
+TBLGEN?=tblgen
+TBLINC+=-I ${LLVM_SRCS}/include -I ${LLVM_SRCS}/lib/Target
Intrinsics.inc.h: ${LLVM_SRCS}/include/llvm/Intrinsics.td
- ${TBLGEN} -gen-intrinsic \
- ${LLVM_SRCS}/include/llvm/Intrinsics.td > ${.TARGET}
+ ${TBLGEN} -I ${LLVM_SRCS}/lib/VMCore ${TBLINC} -gen-intrinsic \
+ -o ${.TARGET} ${LLVM_SRCS}/include/llvm/Intrinsics.td
.for arch in \
ARM/ARM Mips/Mips PowerPC/PPC X86/X86
. for hdr in \
@@ -51,79 +52,97 @@ Intrinsics.inc.h: ${LLVM_SRCS}/include/llvm/Intrinsics.td
DisassemblerTables/-gen-disassembler \
EDInfo/-gen-enhanced-disassembly-info \
FastISel/-gen-fast-isel \
- InstrInfo/-gen-instr-desc \
- InstrNames/-gen-instr-enums \
+ InstrInfo/-gen-instr-info \
MCCodeEmitter/-gen-emitter,-mc-emitter \
- RegisterInfo.h/-gen-register-desc-header \
- RegisterInfo/-gen-register-desc \
- RegisterNames/-gen-register-enums \
- Subtarget/-gen-subtarget
+ MCPseudoLowering/-gen-pseudo-lowering \
+ RegisterInfo/-gen-register-info \
+ SubtargetInfo/-gen-subtarget
${arch:T}Gen${hdr:H:C/$/.inc.h/}: ${LLVM_SRCS}/lib/Target/${arch:H}/${arch:T}.td
- ${TBLGEN} ${hdr:T:C/,/ /g} \
- ${LLVM_SRCS}/lib/Target/${arch:H}/${arch:T}.td > ${.TARGET}
+ ${TBLGEN} -I ${LLVM_SRCS}/lib/Target/${arch:H} ${TBLINC} \
+ ${hdr:T:C/,/ /g} -o ${.TARGET} \
+ ${LLVM_SRCS}/lib/Target/${arch:H}/${arch:T}.td
. endfor
.endfor
ARMGenDecoderTables.inc.h: ${LLVM_SRCS}/lib/Target/ARM/ARM.td
- ${TBLGEN} -gen-arm-decoder ${.ALLSRC} > ${.TARGET}
+ ${TBLGEN} -I ${LLVM_SRCS}/lib/Target/ARM ${TBLINC} \
+ -gen-arm-decoder -o ${.TARGET} ${.ALLSRC}
Attrs.inc.h: ${CLANG_SRCS}/include/clang/Basic/Attr.td
- ${TBLGEN} -gen-clang-attr-classes ${.ALLSRC} > ${.TARGET}
+ ${TBLGEN} -I ${CLANG_SRCS}/include/clang/AST ${TBLINC} \
+ -gen-clang-attr-classes -o ${.TARGET} \
+ -I ${CLANG_SRCS}/include ${.ALLSRC}
AttrImpl.inc.h: ${CLANG_SRCS}/include/clang/Basic/Attr.td
- ${TBLGEN} -gen-clang-attr-impl ${.ALLSRC} > ${.TARGET}
+ ${TBLGEN} -I ${CLANG_SRCS}/include/clang/AST ${TBLINC} \
+ -gen-clang-attr-impl -o ${.TARGET} \
+ -I ${CLANG_SRCS}/include ${.ALLSRC}
AttrList.inc.h: ${CLANG_SRCS}/include/clang/Basic/Attr.td
- ${TBLGEN} -gen-clang-attr-list ${.ALLSRC} > ${.TARGET}
+ ${TBLGEN} -I ${CLANG_SRCS}/include/clang/Basic ${TBLINC} \
+ -gen-clang-attr-list -o ${.TARGET} \
+ -I ${CLANG_SRCS}/include ${.ALLSRC}
AttrPCHRead.inc.h: ${CLANG_SRCS}/include/clang/Basic/Attr.td
- ${TBLGEN} -gen-clang-attr-pch-read ${.ALLSRC} > ${.TARGET}
+ ${TBLGEN} -I ${CLANG_SRCS}/include/clang/Serialization \
+ ${TBLINC} -gen-clang-attr-pch-read -o ${.TARGET} \
+ -I ${CLANG_SRCS}/include ${.ALLSRC}
AttrPCHWrite.inc.h: ${CLANG_SRCS}/include/clang/Basic/Attr.td
- ${TBLGEN} -gen-clang-attr-pch-write ${.ALLSRC} > ${.TARGET}
+ ${TBLGEN} -I ${CLANG_SRCS}/include/clang/Serialization \
+ ${TBLINC} -gen-clang-attr-pch-write -o ${.TARGET} \
+ -I ${CLANG_SRCS}/include ${.ALLSRC}
AttrSpellings.inc.h: ${CLANG_SRCS}/include/clang/Basic/Attr.td
- ${TBLGEN} -gen-clang-attr-spelling-list ${.ALLSRC} > ${.TARGET}
+ ${TBLGEN} -I ${CLANG_SRCS}/include/clang/Lex ${TBLINC} \
+ -gen-clang-attr-spelling-list -o ${.TARGET} \
+ -I ${CLANG_SRCS}/include ${.ALLSRC}
DeclNodes.inc.h: ${CLANG_SRCS}/include/clang/Basic/DeclNodes.td
- ${TBLGEN} -gen-clang-decl-nodes ${.ALLSRC} > ${.TARGET}
+ ${TBLGEN} -I ${CLANG_SRCS}/include/clang/AST ${TBLINC} \
+ -gen-clang-decl-nodes -o ${.TARGET} ${.ALLSRC}
StmtNodes.inc.h: ${CLANG_SRCS}/include/clang/Basic/StmtNodes.td
- ${TBLGEN} -gen-clang-stmt-nodes ${.ALLSRC} > ${.TARGET}
+ ${TBLGEN} -I ${CLANG_SRCS}/include/clang/AST ${TBLINC} \
+ -gen-clang-stmt-nodes -o ${.TARGET} ${.ALLSRC}
arm_neon.inc.h: ${CLANG_SRCS}/include/clang/Basic/arm_neon.td
- ${TBLGEN} -gen-arm-neon-sema ${.ALLSRC} > ${.TARGET}
+ ${TBLGEN} -I ${CLANG_SRCS}/include/clang/Basic ${TBLINC} \
+ -gen-arm-neon-sema -o ${.TARGET} ${.ALLSRC}
DiagnosticGroups.inc.h: ${CLANG_SRCS}/include/clang/Basic/Diagnostic.td
- ${TBLGEN} -gen-clang-diag-groups -I${CLANG_SRCS}/include/clang/Basic \
- ${.ALLSRC} > ${.TARGET}
+ ${TBLGEN} -I ${CLANG_SRCS}/include/clang/Basic ${TBLINC} \
+ -gen-clang-diag-groups -o ${.TARGET} ${.ALLSRC}
DiagnosticIndexName.inc.h: ${CLANG_SRCS}/include/clang/Basic/Diagnostic.td
- ${TBLGEN} -gen-clang-diags-index-name \
- -I${CLANG_SRCS}/include/clang/Basic ${.ALLSRC} > ${.TARGET}
+ ${TBLGEN} -I ${CLANG_SRCS}/include/clang/Basic ${TBLINC} \
+ -gen-clang-diags-index-name -o ${.TARGET} ${.ALLSRC}
.for hdr in AST Analysis Common Driver Frontend Lex Parse Sema
Diagnostic${hdr}Kinds.inc.h: ${CLANG_SRCS}/include/clang/Basic/Diagnostic.td
- ${TBLGEN} -gen-clang-diags-defs -clang-component=${hdr} \
- -I${CLANG_SRCS}/include/clang/Basic ${.ALLSRC} > ${.TARGET}
+ ${TBLGEN} -I ${CLANG_SRCS}/include/clang/Basic ${TBLINC} \
+ -gen-clang-diags-defs -clang-component=${hdr} \
+ -o ${.TARGET} ${.ALLSRC}
.endfor
Options.inc.h: ${CLANG_SRCS}/include/clang/Driver/Options.td
- ${TBLGEN} -gen-opt-parser-defs -I${CLANG_SRCS}/include/clang/Driver \
- ${.ALLSRC} > ${.TARGET}
+ ${TBLGEN} -I ${CLANG_SRCS}/include/clang/Driver ${TBLINC} \
+ -gen-opt-parser-defs -o ${.TARGET} ${.ALLSRC}
CC1Options.inc.h: ${CLANG_SRCS}/include/clang/Driver/CC1Options.td
- ${TBLGEN} -gen-opt-parser-defs -I${CLANG_SRCS}/include/clang/Driver \
- ${.ALLSRC} > ${.TARGET}
+ ${TBLGEN} -I ${CLANG_SRCS}/include/clang/Driver ${TBLINC} \
+ -gen-opt-parser-defs -o ${.TARGET} ${.ALLSRC}
CC1AsOptions.inc.h: ${CLANG_SRCS}/include/clang/Driver/CC1AsOptions.td
- ${TBLGEN} -gen-opt-parser-defs -I${CLANG_SRCS}/include/clang/Driver \
- ${.ALLSRC} > ${.TARGET}
+ ${TBLGEN} -I ${CLANG_SRCS}/include/clang/Driver ${TBLINC} \
+ -gen-opt-parser-defs -o ${.TARGET} ${.ALLSRC}
Checkers.inc.h: ${CLANG_SRCS}/lib/StaticAnalyzer/Checkers/Checkers.td \
${CLANG_SRCS}/include/clang/StaticAnalyzer/Checkers/CheckerBase.td
- ${TBLGEN} -gen-clang-sa-checkers -I${CLANG_SRCS}/include \
- ${CLANG_SRCS}/lib/StaticAnalyzer/Checkers/Checkers.td > ${.TARGET}
+ ${TBLGEN} -I ${CLANG_SRCS}/lib/StaticAnalyzer/Checkers \
+ ${TBLINC} -gen-clang-sa-checkers -o ${.TARGET} \
+ -I ${CLANG_SRCS}/include \
+ ${CLANG_SRCS}/lib/StaticAnalyzer/Checkers/Checkers.td
SRCS+= ${TGHDRS:C/$/.inc.h/}
DPADD+= ${TGHDRS:C/$/.inc.h/}
diff --git a/lib/clang/include/ARMGenInstrNames.inc b/lib/clang/include/ARMGenInstrNames.inc
deleted file mode 100644
index 9ecc271..0000000
--- a/lib/clang/include/ARMGenInstrNames.inc
+++ /dev/null
@@ -1,2 +0,0 @@
-/* $FreeBSD$ */
-#include "ARMGenInstrNames.inc.h"
diff --git a/lib/clang/include/ARMGenMCPseudoLowering.inc b/lib/clang/include/ARMGenMCPseudoLowering.inc
new file mode 100644
index 0000000..aa3b617
--- /dev/null
+++ b/lib/clang/include/ARMGenMCPseudoLowering.inc
@@ -0,0 +1,2 @@
+/* $FreeBSD$ */
+#include "ARMGenMCPseudoLowering.inc.h"
diff --git a/lib/clang/include/ARMGenRegisterInfo.h.inc b/lib/clang/include/ARMGenRegisterInfo.h.inc
deleted file mode 100644
index 03bd3a2..0000000
--- a/lib/clang/include/ARMGenRegisterInfo.h.inc
+++ /dev/null
@@ -1,2 +0,0 @@
-/* $FreeBSD$ */
-#include "ARMGenRegisterInfo.h.inc.h"
diff --git a/lib/clang/include/ARMGenRegisterNames.inc b/lib/clang/include/ARMGenRegisterNames.inc
deleted file mode 100644
index 7eb6a0d..0000000
--- a/lib/clang/include/ARMGenRegisterNames.inc
+++ /dev/null
@@ -1,2 +0,0 @@
-/* $FreeBSD$ */
-#include "ARMGenRegisterNames.inc.h"
diff --git a/lib/clang/include/ARMGenSubtarget.inc b/lib/clang/include/ARMGenSubtarget.inc
deleted file mode 100644
index 55d5e8e..0000000
--- a/lib/clang/include/ARMGenSubtarget.inc
+++ /dev/null
@@ -1,2 +0,0 @@
-/* $FreeBSD$ */
-#include "ARMGenSubtarget.inc.h"
diff --git a/lib/clang/include/ARMGenSubtargetInfo.inc b/lib/clang/include/ARMGenSubtargetInfo.inc
new file mode 100644
index 0000000..6579d9f
--- /dev/null
+++ b/lib/clang/include/ARMGenSubtargetInfo.inc
@@ -0,0 +1,2 @@
+/* $FreeBSD$ */
+#include "ARMGenSubtargetInfo.inc.h"
diff --git a/lib/clang/include/IA64GenInstrNames.inc b/lib/clang/include/IA64GenInstrNames.inc
deleted file mode 100644
index 6b2c58e..0000000
--- a/lib/clang/include/IA64GenInstrNames.inc
+++ /dev/null
@@ -1,2 +0,0 @@
-/* $FreeBSD$ */
-#include "IA64GenInstrNames.inc.h"
diff --git a/lib/clang/include/IA64GenRegisterInfo.h.inc b/lib/clang/include/IA64GenRegisterInfo.h.inc
deleted file mode 100644
index 38086d4..0000000
--- a/lib/clang/include/IA64GenRegisterInfo.h.inc
+++ /dev/null
@@ -1,2 +0,0 @@
-/* $FreeBSD$ */
-#include "IA64GenRegisterInfo.h.inc.h"
diff --git a/lib/clang/include/IA64GenRegisterNames.inc b/lib/clang/include/IA64GenRegisterNames.inc
deleted file mode 100644
index d1f0970..0000000
--- a/lib/clang/include/IA64GenRegisterNames.inc
+++ /dev/null
@@ -1,2 +0,0 @@
-/* $FreeBSD$ */
-#include "IA64GenRegisterNames.inc.h"
diff --git a/lib/clang/include/MipsGenInstrNames.inc b/lib/clang/include/MipsGenInstrNames.inc
deleted file mode 100644
index 78759ee..0000000
--- a/lib/clang/include/MipsGenInstrNames.inc
+++ /dev/null
@@ -1,2 +0,0 @@
-/* $FreeBSD$ */
-#include "MipsGenInstrNames.inc.h"
diff --git a/lib/clang/include/MipsGenRegisterInfo.h.inc b/lib/clang/include/MipsGenRegisterInfo.h.inc
deleted file mode 100644
index af66c5f..0000000
--- a/lib/clang/include/MipsGenRegisterInfo.h.inc
+++ /dev/null
@@ -1,2 +0,0 @@
-/* $FreeBSD$ */
-#include "MipsGenRegisterInfo.h.inc.h"
diff --git a/lib/clang/include/MipsGenRegisterNames.inc b/lib/clang/include/MipsGenRegisterNames.inc
deleted file mode 100644
index 3b00971..0000000
--- a/lib/clang/include/MipsGenRegisterNames.inc
+++ /dev/null
@@ -1,2 +0,0 @@
-/* $FreeBSD$ */
-#include "MipsGenRegisterNames.inc.h"
diff --git a/lib/clang/include/MipsGenSubtarget.inc b/lib/clang/include/MipsGenSubtarget.inc
deleted file mode 100644
index 9fb4a70..0000000
--- a/lib/clang/include/MipsGenSubtarget.inc
+++ /dev/null
@@ -1,2 +0,0 @@
-/* $FreeBSD$ */
-#include "MipsGenSubtarget.inc.h"
diff --git a/lib/clang/include/MipsGenSubtargetInfo.inc b/lib/clang/include/MipsGenSubtargetInfo.inc
new file mode 100644
index 0000000..2c069f4
--- /dev/null
+++ b/lib/clang/include/MipsGenSubtargetInfo.inc
@@ -0,0 +1,2 @@
+/* $FreeBSD$ */
+#include "MipsGenSubtargetInfo.inc.h"
diff --git a/lib/clang/include/PPCGenInstrNames.inc b/lib/clang/include/PPCGenInstrNames.inc
deleted file mode 100644
index 67ae90d..0000000
--- a/lib/clang/include/PPCGenInstrNames.inc
+++ /dev/null
@@ -1,2 +0,0 @@
-/* $FreeBSD$ */
-#include "PPCGenInstrNames.inc.h"
diff --git a/lib/clang/include/PPCGenRegisterInfo.h.inc b/lib/clang/include/PPCGenRegisterInfo.h.inc
deleted file mode 100644
index bce5f45..0000000
--- a/lib/clang/include/PPCGenRegisterInfo.h.inc
+++ /dev/null
@@ -1,2 +0,0 @@
-/* $FreeBSD$ */
-#include "PPCGenRegisterInfo.h.inc.h"
diff --git a/lib/clang/include/PPCGenRegisterNames.inc b/lib/clang/include/PPCGenRegisterNames.inc
deleted file mode 100644
index 09e7a2d..0000000
--- a/lib/clang/include/PPCGenRegisterNames.inc
+++ /dev/null
@@ -1,2 +0,0 @@
-/* $FreeBSD$ */
-#include "PPCGenRegisterNames.inc.h"
diff --git a/lib/clang/include/PPCGenSubtarget.inc b/lib/clang/include/PPCGenSubtarget.inc
deleted file mode 100644
index 7032e52..0000000
--- a/lib/clang/include/PPCGenSubtarget.inc
+++ /dev/null
@@ -1,2 +0,0 @@
-/* $FreeBSD$ */
-#include "PPCGenSubtarget.inc.h"
diff --git a/lib/clang/include/PPCGenSubtargetInfo.inc b/lib/clang/include/PPCGenSubtargetInfo.inc
new file mode 100644
index 0000000..a348630
--- /dev/null
+++ b/lib/clang/include/PPCGenSubtargetInfo.inc
@@ -0,0 +1,2 @@
+/* $FreeBSD$ */
+#include "PPCGenSubtargetInfo.inc.h"
diff --git a/lib/clang/include/X86GenInstrNames.inc b/lib/clang/include/X86GenInstrNames.inc
deleted file mode 100644
index 9c856f4..0000000
--- a/lib/clang/include/X86GenInstrNames.inc
+++ /dev/null
@@ -1,2 +0,0 @@
-/* $FreeBSD$ */
-#include "X86GenInstrNames.inc.h"
diff --git a/lib/clang/include/X86GenRegisterInfo.h.inc b/lib/clang/include/X86GenRegisterInfo.h.inc
deleted file mode 100644
index 4a76e0d..0000000
--- a/lib/clang/include/X86GenRegisterInfo.h.inc
+++ /dev/null
@@ -1,2 +0,0 @@
-/* $FreeBSD$ */
-#include "X86GenRegisterInfo.h.inc.h"
diff --git a/lib/clang/include/X86GenRegisterNames.inc b/lib/clang/include/X86GenRegisterNames.inc
deleted file mode 100644
index ad3d722..0000000
--- a/lib/clang/include/X86GenRegisterNames.inc
+++ /dev/null
@@ -1,2 +0,0 @@
-/* $FreeBSD$ */
-#include "X86GenRegisterNames.inc.h"
diff --git a/lib/clang/include/X86GenSubtarget.inc b/lib/clang/include/X86GenSubtarget.inc
deleted file mode 100644
index 1e8907d..0000000
--- a/lib/clang/include/X86GenSubtarget.inc
+++ /dev/null
@@ -1,2 +0,0 @@
-/* $FreeBSD$ */
-#include "X86GenSubtarget.inc.h"
diff --git a/lib/clang/include/X86GenSubtargetInfo.inc b/lib/clang/include/X86GenSubtargetInfo.inc
new file mode 100644
index 0000000..a64b3a4
--- /dev/null
+++ b/lib/clang/include/X86GenSubtargetInfo.inc
@@ -0,0 +1,2 @@
+/* $FreeBSD$ */
+#include "X86GenSubtargetInfo.inc.h"
diff --git a/lib/clang/include/clang/Basic/Version.inc b/lib/clang/include/clang/Basic/Version.inc
index 144a920..3e3b44c 100644
--- a/lib/clang/include/clang/Basic/Version.inc
+++ b/lib/clang/include/clang/Basic/Version.inc
@@ -5,6 +5,6 @@
#define CLANG_VERSION_MINOR 0
#define CLANG_VENDOR "FreeBSD "
-#define CLANG_VENDOR_SUFFIX " 20110612"
+#define CLANG_VENDOR_SUFFIX " 20110717"
-#define SVN_REVISION "132879"
+#define SVN_REVISION "135360"
diff --git a/lib/clang/include/llvm/Config/config.h b/lib/clang/include/llvm/Config/config.h
index 229b705..f264571 100644
--- a/lib/clang/include/llvm/Config/config.h
+++ b/lib/clang/include/llvm/Config/config.h
@@ -569,9 +569,15 @@
/* LLVM architecture name for the native architecture, if available */
#define LLVM_NATIVE_ARCH X86
+/* LLVM name for the native AsmParser init function, if available */
+#define LLVM_NATIVE_ASMPARSER LLVMInitializeX86AsmParser
+
/* LLVM name for the native AsmPrinter init function, if available */
#define LLVM_NATIVE_ASMPRINTER LLVMInitializeX86AsmPrinter
+/* LLVM name for the native MCAsmInfo init function, if available */
+#define LLVM_NATIVE_MCASMINFO LLVMInitializeX86MCAsmInfo
+
/* LLVM name for the native Target init function, if available */
#define LLVM_NATIVE_TARGET LLVMInitializeX86Target
@@ -674,6 +680,9 @@
/* Define if use udis86 library */
#define USE_UDIS86 0
+/* Type of 1st arg on ELM Callback */
+/* #undef WIN32_ELMCB_PCSTR */
+
/* Define to empty if `const' does not conform to ANSI C. */
/* #undef const */
diff --git a/lib/clang/include/llvm/Config/llvm-config.h b/lib/clang/include/llvm/Config/llvm-config.h
index fc3ec97..e76d10f 100644
--- a/lib/clang/include/llvm/Config/llvm-config.h
+++ b/lib/clang/include/llvm/Config/llvm-config.h
@@ -60,9 +60,15 @@
/* LLVM name for the native TargetInfo init function, if available */
#define LLVM_NATIVE_TARGETINFO LLVMInitializeX86TargetInfo
+/* LLVM name for the native MCAsmInfo init function, if available */
+#define LLVM_NATIVE_MCASMINFO LLVMInitializeX86MCAsmInfo
+
/* LLVM name for the native AsmPrinter init function, if available */
#define LLVM_NATIVE_ASMPRINTER LLVMInitializeX86AsmPrinter
+/* LLVM name for the native AsmPrinter init function, if available */
+#define LLVM_NATIVE_ASMPARSER LLVMInitializeX86AsmParser
+
/* Define if this is Unixish platform */
#define LLVM_ON_UNIX 1
diff --git a/lib/clang/libclangarcmigrate/Makefile b/lib/clang/libclangarcmigrate/Makefile
new file mode 100644
index 0000000..c1e4511
--- /dev/null
+++ b/lib/clang/libclangarcmigrate/Makefile
@@ -0,0 +1,29 @@
+# $FreeBSD$
+
+LIB= clangarcmigrate
+
+SRCDIR= tools/clang/lib/ARCMigrate
+SRCS= ARCMT.cpp \
+ ARCMTActions.cpp \
+ FileRemapper.cpp \
+ TransARCAssign.cpp \
+ TransAutoreleasePool.cpp \
+ TransBlockObjCVariable.cpp \
+ TransEmptyStatementsAndDealloc.cpp \
+ TransformActions.cpp \
+ Transforms.cpp \
+ TransProperties.cpp \
+ TransRetainReleaseDealloc.cpp \
+ TransUnbridgedCasts.cpp \
+ TransUnusedInitDelegate.cpp \
+ TransZeroOutPropsInDealloc.cpp
+
+TGHDRS= AttrList \
+ Attrs \
+ DeclNodes \
+ DiagnosticCommonKinds \
+ DiagnosticGroups \
+ DiagnosticSemaKinds \
+ StmtNodes
+
+.include "../clang.lib.mk"
diff --git a/lib/clang/libclangfrontend/Makefile b/lib/clang/libclangfrontend/Makefile
index ff32c08..2087900 100644
--- a/lib/clang/libclangfrontend/Makefile
+++ b/lib/clang/libclangfrontend/Makefile
@@ -6,7 +6,6 @@ SRCDIR= tools/clang/lib/Frontend
SRCS= ASTConsumers.cpp \
ASTMerge.cpp \
ASTUnit.cpp \
- BoostConAction.cpp \
CacheTokens.cpp \
CompilerInstance.cpp \
CompilerInvocation.cpp \
diff --git a/lib/clang/libclangsema/Makefile b/lib/clang/libclangsema/Makefile
index d2c7e34..3c03773 100644
--- a/lib/clang/libclangsema/Makefile
+++ b/lib/clang/libclangsema/Makefile
@@ -21,6 +21,7 @@ SRCS= AnalysisBasedWarnings.cpp \
SemaDecl.cpp \
SemaDeclAttr.cpp \
SemaDeclCXX.cpp \
+ SemaExprMember.cpp \
SemaDeclObjC.cpp \
SemaExceptionSpec.cpp \
SemaExpr.cpp \
diff --git a/lib/clang/libllvmanalysis/Makefile b/lib/clang/libllvmanalysis/Makefile
index 5436631..2b0bccf 100644
--- a/lib/clang/libllvmanalysis/Makefile
+++ b/lib/clang/libllvmanalysis/Makefile
@@ -10,6 +10,7 @@ SRCS= AliasAnalysis.cpp \
AliasSetTracker.cpp \
Analysis.cpp \
BasicAliasAnalysis.cpp \
+ BranchProbabilityInfo.cpp \
CFGPrinter.cpp \
CaptureTracking.cpp \
ConstantFolding.cpp \
diff --git a/lib/clang/libllvmarmasmparser/Makefile b/lib/clang/libllvmarmasmparser/Makefile
index 95dfc5b..c3d0d89 100644
--- a/lib/clang/libllvmarmasmparser/Makefile
+++ b/lib/clang/libllvmarmasmparser/Makefile
@@ -8,8 +8,8 @@ SRCS= ARMAsmLexer.cpp \
ARMAsmParser.cpp
TGHDRS= ARMGenAsmMatcher \
- ARMGenInstrNames \
- ARMGenRegisterInfo.h \
- ARMGenRegisterNames
+ ARMGenInstrInfo \
+ ARMGenRegisterInfo \
+ ARMGenSubtargetInfo
.include "../clang.lib.mk"
diff --git a/lib/clang/libllvmarmcodegen/Makefile b/lib/clang/libllvmarmcodegen/Makefile
index c19a451..0110781 100644
--- a/lib/clang/libllvmarmcodegen/Makefile
+++ b/lib/clang/libllvmarmcodegen/Makefile
@@ -20,11 +20,11 @@ SRCS= ARMAsmBackend.cpp \
ARMISelLowering.cpp \
ARMInstrInfo.cpp \
ARMJITInfo.cpp \
+ ARMLoadStoreOptimizer.cpp \
ARMMCCodeEmitter.cpp \
ARMMCExpr.cpp \
- ARMLoadStoreOptimizer.cpp \
- ARMMCAsmInfo.cpp \
ARMMCInstLower.cpp \
+ ARMMachObjectWriter.cpp \
ARMRegisterInfo.cpp \
ARMSelectionDAGInfo.cpp \
ARMSubtarget.cpp \
@@ -46,12 +46,10 @@ TGHDRS= ARMGenAsmWriter \
ARMGenDAGISel \
ARMGenFastISel \
ARMGenInstrInfo \
- ARMGenInstrNames \
ARMGenMCCodeEmitter \
+ ARMGenMCPseudoLowering \
ARMGenRegisterInfo \
- ARMGenRegisterInfo.h \
- ARMGenRegisterNames \
- ARMGenSubtarget \
+ ARMGenSubtargetInfo \
Intrinsics
.include "../clang.lib.mk"
diff --git a/lib/clang/libllvmarmdesc/Makefile b/lib/clang/libllvmarmdesc/Makefile
new file mode 100644
index 0000000..0074ec2
--- /dev/null
+++ b/lib/clang/libllvmarmdesc/Makefile
@@ -0,0 +1,13 @@
+# $FreeBSD$
+
+LIB= llvmarmdesc
+
+SRCDIR= lib/Target/ARM/MCTargetDesc
+SRCS= ARMMCAsmInfo.cpp \
+ ARMMCTargetDesc.cpp
+
+TGHDRS= ARMGenInstrInfo \
+ ARMGenRegisterInfo \
+ ARMGenSubtargetInfo
+
+.include "../clang.lib.mk"
diff --git a/lib/clang/libllvmarmdisassembler/Makefile b/lib/clang/libllvmarmdisassembler/Makefile
index c824560..c0648bb 100644
--- a/lib/clang/libllvmarmdisassembler/Makefile
+++ b/lib/clang/libllvmarmdisassembler/Makefile
@@ -9,8 +9,7 @@ SRCS= ARMDisassemblerCore.cpp
TGHDRS= ARMGenDecoderTables \
ARMGenEDInfo \
ARMGenInstrInfo \
- ARMGenInstrNames \
- ARMGenRegisterInfo.h \
- ARMGenRegisterNames
+ ARMGenRegisterInfo \
+ ARMGenSubtargetInfo
.include "../clang.lib.mk"
diff --git a/lib/clang/libllvmarminfo/Makefile b/lib/clang/libllvmarminfo/Makefile
index 2f17454..43b9f83 100644
--- a/lib/clang/libllvmarminfo/Makefile
+++ b/lib/clang/libllvmarminfo/Makefile
@@ -6,7 +6,8 @@ SRCDIR= lib/Target/ARM/TargetInfo/
INCDIR= lib/Target/ARM
SRCS= ARMTargetInfo.cpp
-TGHDRS= ARMGenInstrNames \
- ARMGenRegisterNames
+TGHDRS= ARMGenInstrInfo \
+ ARMGenRegisterInfo \
+ ARMGenSubtargetInfo
.include "../clang.lib.mk"
diff --git a/lib/clang/libllvmarminstprinter/Makefile b/lib/clang/libllvmarminstprinter/Makefile
index 630f12a..ca7e7d4 100644
--- a/lib/clang/libllvmarminstprinter/Makefile
+++ b/lib/clang/libllvmarminstprinter/Makefile
@@ -7,7 +7,8 @@ INCDIR= lib/Target/ARM
SRCS= ARMInstPrinter.cpp
TGHDRS= ARMGenAsmWriter \
- ARMGenInstrNames \
- ARMGenRegisterNames
+ ARMGenInstrInfo \
+ ARMGenRegisterInfo \
+ ARMGenSubtargetInfo
.include "../clang.lib.mk"
diff --git a/lib/clang/libllvmcodegen/Makefile b/lib/clang/libllvmcodegen/Makefile
index c657316..702c476 100644
--- a/lib/clang/libllvmcodegen/Makefile
+++ b/lib/clang/libllvmcodegen/Makefile
@@ -62,7 +62,6 @@ SRCS= AggressiveAntiDepBreaker.cpp \
Passes.cpp \
PeepholeOptimizer.cpp \
PostRASchedulerList.cpp \
- PreAllocSplitting.cpp \
ProcessImplicitDefs.cpp \
PrologEpilogInserter.cpp \
PseudoSourceValue.cpp \
@@ -82,7 +81,6 @@ SRCS= AggressiveAntiDepBreaker.cpp \
ScoreboardHazardRecognizer.cpp \
ShadowStackGC.cpp \
ShrinkWrapping.cpp \
- SimpleRegisterCoalescing.cpp \
SjLjEHPrepare.cpp \
SlotIndexes.cpp \
Spiller.cpp \
diff --git a/lib/clang/libllvmcore/Makefile b/lib/clang/libllvmcore/Makefile
index 4e3adde..c37d45a 100644
--- a/lib/clang/libllvmcore/Makefile
+++ b/lib/clang/libllvmcore/Makefile
@@ -31,7 +31,6 @@ SRCS= AsmWriter.cpp \
PassRegistry.cpp \
PrintModulePass.cpp \
Type.cpp \
- TypeSymbolTable.cpp \
Use.cpp \
User.cpp \
Value.cpp \
diff --git a/lib/clang/libllvmipo/Makefile b/lib/clang/libllvmipo/Makefile
index f919dd1..062ba5b 100644
--- a/lib/clang/libllvmipo/Makefile
+++ b/lib/clang/libllvmipo/Makefile
@@ -6,7 +6,6 @@ SRCDIR= lib/Transforms/IPO
SRCS= ArgumentPromotion.cpp \
ConstantMerge.cpp \
DeadArgumentElimination.cpp \
- DeadTypeElimination.cpp \
ExtractGV.cpp \
FunctionAttrs.cpp \
GlobalDCE.cpp \
diff --git a/lib/clang/libllvmmc/Makefile b/lib/clang/libllvmmc/Makefile
index 07b91ad..435cdf4 100644
--- a/lib/clang/libllvmmc/Makefile
+++ b/lib/clang/libllvmmc/Makefile
@@ -30,9 +30,11 @@ SRCS= ELFObjectWriter.cpp \
MCSectionELF.cpp \
MCSectionMachO.cpp \
MCStreamer.cpp \
+ MCSubtargetInfo.cpp \
MCSymbol.cpp \
MCWin64EH.cpp \
MachObjectWriter.cpp \
+ SubtargetFeature.cpp \
TargetAsmBackend.cpp \
WinCOFFObjectWriter.cpp \
WinCOFFStreamer.cpp
diff --git a/lib/clang/libllvmmipscodegen/Makefile b/lib/clang/libllvmmipscodegen/Makefile
index 63e9e0e..1651831 100644
--- a/lib/clang/libllvmmipscodegen/Makefile
+++ b/lib/clang/libllvmmipscodegen/Makefile
@@ -11,7 +11,8 @@ SRCS= MipsAsmPrinter.cpp \
MipsISelDAGToDAG.cpp \
MipsISelLowering.cpp \
MipsInstrInfo.cpp \
- MipsMCAsmInfo.cpp \
+ MipsMCInstLower.cpp \
+ MipsMCSymbolRefExpr.cpp \
MipsRegisterInfo.cpp \
MipsSelectionDAGInfo.cpp \
MipsSubtarget.cpp \
@@ -23,10 +24,7 @@ TGHDRS= Intrinsics \
MipsGenCallingConv \
MipsGenDAGISel \
MipsGenInstrInfo \
- MipsGenInstrNames \
MipsGenRegisterInfo \
- MipsGenRegisterInfo.h \
- MipsGenRegisterNames \
- MipsGenSubtarget
+ MipsGenSubtargetInfo
.include "../clang.lib.mk"
diff --git a/lib/clang/libllvmmipsdesc/Makefile b/lib/clang/libllvmmipsdesc/Makefile
new file mode 100644
index 0000000..4147209
--- /dev/null
+++ b/lib/clang/libllvmmipsdesc/Makefile
@@ -0,0 +1,13 @@
+# $FreeBSD$
+
+LIB= llvmmipsdesc
+
+SRCDIR= lib/Target/Mips/MCTargetDesc
+SRCS= MipsMCAsmInfo.cpp \
+ MipsMCTargetDesc.cpp
+
+TGHDRS= MipsGenInstrInfo \
+ MipsGenRegisterInfo \
+ MipsGenSubtargetInfo
+
+.include "../clang.lib.mk"
diff --git a/lib/clang/libllvmmipsinfo/Makefile b/lib/clang/libllvmmipsinfo/Makefile
index faa6f6f..abf6d8e 100644
--- a/lib/clang/libllvmmipsinfo/Makefile
+++ b/lib/clang/libllvmmipsinfo/Makefile
@@ -6,7 +6,8 @@ SRCDIR= lib/Target/Mips/TargetInfo/
INCDIR= lib/Target/Mips
SRCS= MipsTargetInfo.cpp
-TGHDRS= MipsGenRegisterNames \
- MipsGenInstrNames
+TGHDRS= MipsGenInstrInfo \
+ MipsGenRegisterInfo \
+ MipsGenSubtargetInfo
.include "../clang.lib.mk"
diff --git a/lib/clang/libllvmmipsinstprinter/Makefile b/lib/clang/libllvmmipsinstprinter/Makefile
new file mode 100644
index 0000000..357320e
--- /dev/null
+++ b/lib/clang/libllvmmipsinstprinter/Makefile
@@ -0,0 +1,13 @@
+# $FreeBSD$
+
+LIB= llvmmipsinstprinter
+
+SRCDIR= lib/Target/Mips/InstPrinter
+INCDIR= lib/Target/Mips
+SRCS= MipsInstPrinter.cpp
+
+TGHDRS= MipsGenAsmWriter \
+ MipsGenInstrInfo \
+ MipsGenRegisterInfo
+
+.include "../clang.lib.mk"
diff --git a/lib/clang/libllvmpowerpccodegen/Makefile b/lib/clang/libllvmpowerpccodegen/Makefile
index 7d43ae1..08663e8 100644
--- a/lib/clang/libllvmpowerpccodegen/Makefile
+++ b/lib/clang/libllvmpowerpccodegen/Makefile
@@ -13,7 +13,6 @@ SRCS= PPCAsmBackend.cpp \
PPCISelLowering.cpp \
PPCInstrInfo.cpp \
PPCJITInfo.cpp \
- PPCMCAsmInfo.cpp \
PPCMCCodeEmitter.cpp \
PPCMCInstLower.cpp \
PPCPredicates.cpp \
@@ -27,11 +26,8 @@ TGHDRS= Intrinsics \
PPCGenCodeEmitter \
PPCGenDAGISel \
PPCGenInstrInfo \
- PPCGenInstrNames \
PPCGenMCCodeEmitter \
PPCGenRegisterInfo \
- PPCGenRegisterInfo.h \
- PPCGenRegisterNames \
- PPCGenSubtarget
+ PPCGenSubtargetInfo
.include "../clang.lib.mk"
diff --git a/lib/clang/libllvmpowerpcdesc/Makefile b/lib/clang/libllvmpowerpcdesc/Makefile
new file mode 100644
index 0000000..9207da2
--- /dev/null
+++ b/lib/clang/libllvmpowerpcdesc/Makefile
@@ -0,0 +1,13 @@
+# $FreeBSD$
+
+LIB= llvmpowerpcdesc
+
+SRCDIR= lib/Target/PowerPC/MCTargetDesc
+SRCS= PPCMCAsmInfo.cpp \
+ PPCMCTargetDesc.cpp
+
+TGHDRS= PPCGenInstrInfo \
+ PPCGenRegisterInfo \
+ PPCGenSubtargetInfo
+
+.include "../clang.lib.mk"
diff --git a/lib/clang/libllvmpowerpcinfo/Makefile b/lib/clang/libllvmpowerpcinfo/Makefile
index 5142ce1..8cdaa5a5 100644
--- a/lib/clang/libllvmpowerpcinfo/Makefile
+++ b/lib/clang/libllvmpowerpcinfo/Makefile
@@ -6,7 +6,8 @@ SRCDIR= lib/Target/PowerPC/TargetInfo/
INCDIR= lib/Target/PowerPC
SRCS= PowerPCTargetInfo.cpp
-TGHDRS= PPCGenRegisterNames \
- PPCGenInstrNames
+TGHDRS= PPCGenInstrInfo \
+ PPCGenRegisterInfo \
+ PPCGenSubtargetInfo
.include "../clang.lib.mk"
diff --git a/lib/clang/libllvmpowerpcinstprinter/Makefile b/lib/clang/libllvmpowerpcinstprinter/Makefile
index 8be81c4..c1528ae 100644
--- a/lib/clang/libllvmpowerpcinstprinter/Makefile
+++ b/lib/clang/libllvmpowerpcinstprinter/Makefile
@@ -7,8 +7,8 @@ INCDIR= lib/Target/PowerPC
SRCS= PPCInstPrinter.cpp
TGHDRS= PPCGenAsmWriter \
- PPCGenInstrNames \
- PPCGenRegisterInfo.h \
- PPCGenRegisterNames
+ PPCGenInstrInfo \
+ PPCGenRegisterInfo \
+ PPCGenSubtargetInfo
.include "../clang.lib.mk"
diff --git a/lib/clang/libllvmscalaropts/Makefile b/lib/clang/libllvmscalaropts/Makefile
index 757b8e0..81998a4 100644
--- a/lib/clang/libllvmscalaropts/Makefile
+++ b/lib/clang/libllvmscalaropts/Makefile
@@ -22,6 +22,7 @@ SRCS= ADCE.cpp \
LoopUnrollPass.cpp \
LoopUnswitch.cpp \
MemCpyOptimizer.cpp \
+ ObjCARC.cpp \
Reassociate.cpp \
SCCP.cpp \
ScalarReplAggregates.cpp \
diff --git a/lib/clang/libllvmsupport/Makefile b/lib/clang/libllvmsupport/Makefile
index 72f5c57..e1a16c4 100644
--- a/lib/clang/libllvmsupport/Makefile
+++ b/lib/clang/libllvmsupport/Makefile
@@ -8,6 +8,7 @@ SRCS= APFloat.cpp \
APSInt.cpp \
Allocator.cpp \
Atomic.cpp \
+ BranchProbability.cpp \
CommandLine.cpp \
ConstantRange.cpp \
CrashRecoveryContext.cpp \
diff --git a/lib/clang/libllvmtarget/Makefile b/lib/clang/libllvmtarget/Makefile
index 56544d1..493b7c1 100644
--- a/lib/clang/libllvmtarget/Makefile
+++ b/lib/clang/libllvmtarget/Makefile
@@ -4,7 +4,6 @@ LIB= llvmtarget
SRCDIR= lib/Target
SRCS= Mangler.cpp \
- SubtargetFeature.cpp \
Target.cpp \
TargetAsmInfo.cpp \
TargetAsmLexer.cpp \
@@ -16,6 +15,6 @@ SRCS= Mangler.cpp \
TargetLoweringObjectFile.cpp \
TargetMachine.cpp \
TargetRegisterInfo.cpp \
- TargetSubtarget.cpp
+ TargetSubtargetInfo.cpp
.include "../clang.lib.mk"
diff --git a/lib/clang/libllvmtransformutils/Makefile b/lib/clang/libllvmtransformutils/Makefile
index 0fa0c96..50dae17 100644
--- a/lib/clang/libllvmtransformutils/Makefile
+++ b/lib/clang/libllvmtransformutils/Makefile
@@ -9,7 +9,6 @@ SRCS= AddrModeMatcher.cpp \
BreakCriticalEdges.cpp \
BuildLibCalls.cpp \
CloneFunction.cpp \
- CloneLoop.cpp \
CloneModule.cpp \
CodeExtractor.cpp \
DemoteRegToStack.cpp \
@@ -19,6 +18,7 @@ SRCS= AddrModeMatcher.cpp \
Local.cpp \
LoopSimplify.cpp \
LoopUnroll.cpp \
+ LowerExpectIntrinsic.cpp \
LowerInvoke.cpp \
LowerSwitch.cpp \
Mem2Reg.cpp \
diff --git a/lib/clang/libllvmx86asmparser/Makefile b/lib/clang/libllvmx86asmparser/Makefile
index c6bdab7..c140268 100644
--- a/lib/clang/libllvmx86asmparser/Makefile
+++ b/lib/clang/libllvmx86asmparser/Makefile
@@ -8,7 +8,8 @@ SRCS= X86AsmLexer.cpp \
X86AsmParser.cpp
TGHDRS= X86GenAsmMatcher \
- X86GenInstrNames \
- X86GenRegisterNames
+ X86GenInstrInfo \
+ X86GenRegisterInfo \
+ X86GenSubtargetInfo
.include "../clang.lib.mk"
diff --git a/lib/clang/libllvmx86codegen/Makefile b/lib/clang/libllvmx86codegen/Makefile
index 300ad9a..6964501 100644
--- a/lib/clang/libllvmx86codegen/Makefile
+++ b/lib/clang/libllvmx86codegen/Makefile
@@ -16,7 +16,6 @@ SRCS= SSEDomainFix.cpp \
X86ISelLowering.cpp \
X86InstrInfo.cpp \
X86JITInfo.cpp \
- X86MCAsmInfo.cpp \
X86MCCodeEmitter.cpp \
X86MCInstLower.cpp \
X86MachObjectWriter.cpp \
@@ -31,10 +30,7 @@ TGHDRS= Intrinsics \
X86GenDAGISel \
X86GenFastISel \
X86GenInstrInfo \
- X86GenInstrNames \
X86GenRegisterInfo \
- X86GenRegisterInfo.h \
- X86GenRegisterNames \
- X86GenSubtarget
+ X86GenSubtargetInfo
.include "../clang.lib.mk"
diff --git a/lib/clang/libllvmx86desc/Makefile b/lib/clang/libllvmx86desc/Makefile
new file mode 100644
index 0000000..44b20a5
--- /dev/null
+++ b/lib/clang/libllvmx86desc/Makefile
@@ -0,0 +1,13 @@
+# $FreeBSD$
+
+LIB= llvmx86desc
+
+SRCDIR= lib/Target/X86/MCTargetDesc
+SRCS= X86MCAsmInfo.cpp \
+ X86MCTargetDesc.cpp
+
+TGHDRS= X86GenInstrInfo \
+ X86GenRegisterInfo \
+ X86GenSubtargetInfo
+
+.include "../clang.lib.mk"
diff --git a/lib/clang/libllvmx86disassembler/Makefile b/lib/clang/libllvmx86disassembler/Makefile
index 0b88643..b9055fc 100644
--- a/lib/clang/libllvmx86disassembler/Makefile
+++ b/lib/clang/libllvmx86disassembler/Makefile
@@ -8,6 +8,6 @@ SRCS= X86Disassembler.cpp
TGHDRS= X86GenDisassemblerTables \
X86GenEDInfo \
- X86GenRegisterNames
+ X86GenRegisterInfo
.include "../clang.lib.mk"
diff --git a/lib/clang/libllvmx86info/Makefile b/lib/clang/libllvmx86info/Makefile
index 8e92b62..62b506e 100644
--- a/lib/clang/libllvmx86info/Makefile
+++ b/lib/clang/libllvmx86info/Makefile
@@ -6,7 +6,8 @@ SRCDIR= lib/Target/X86/TargetInfo/
INCDIR= lib/Target/X86
SRCS= X86TargetInfo.cpp
-TGHDRS= X86GenInstrNames \
- X86GenRegisterNames
+TGHDRS= X86GenInstrInfo \
+ X86GenRegisterInfo \
+ X86GenSubtargetInfo
.include "../clang.lib.mk"
diff --git a/lib/clang/libllvmx86instprinter/Makefile b/lib/clang/libllvmx86instprinter/Makefile
index eb30daa..a44006c 100644
--- a/lib/clang/libllvmx86instprinter/Makefile
+++ b/lib/clang/libllvmx86instprinter/Makefile
@@ -10,7 +10,8 @@ SRCS= X86ATTInstPrinter.cpp \
TGHDRS= X86GenAsmWriter \
X86GenAsmWriter1 \
- X86GenInstrNames \
- X86GenRegisterNames
+ X86GenInstrInfo \
+ X86GenRegisterInfo \
+ X86GenSubtargetInfo
.include "../clang.lib.mk"
diff --git a/lib/libarchive/Makefile b/lib/libarchive/Makefile
index edb0915..8d889c8 100644
--- a/lib/libarchive/Makefile
+++ b/lib/libarchive/Makefile
@@ -13,6 +13,9 @@ DPADD+= ${LIBLZMA}
LDADD+= -llzma
CFLAGS+= -DHAVE_LIBLZMA=1 -DHAVE_LZMA_H=1
+DPADD+= ${LIBBSDXML}
+LDADD+= -lbsdxml
+
# FreeBSD SHLIB_MAJOR value is managed as part of the FreeBSD system.
# It has no real relation to the libarchive version number.
SHLIB_MAJOR= 5
@@ -56,6 +59,7 @@ SRCS= archive_check_magic.c \
archive_read_support_compression_gzip.c \
archive_read_support_compression_none.c \
archive_read_support_compression_program.c \
+ archive_read_support_compression_rpm.c \
archive_read_support_compression_uu.c \
archive_read_support_compression_xz.c \
archive_read_support_format_all.c \
@@ -66,6 +70,7 @@ SRCS= archive_check_magic.c \
archive_read_support_format_mtree.c \
archive_read_support_format_raw.c \
archive_read_support_format_tar.c \
+ archive_read_support_format_xar.c \
archive_read_support_format_zip.c \
archive_string.c \
archive_string_sprintf.c \
diff --git a/lib/libarchive/README b/lib/libarchive/README
index 3157108..0c4758a 100644
--- a/lib/libarchive/README
+++ b/lib/libarchive/README
@@ -21,6 +21,7 @@ Currently, the library automatically detects and reads the following:
* gzip compression
* bzip2 compression
* compress/LZW compression
+ * lzma and xz compression
* GNU tar format (including GNU long filenames, long link names, and
sparse files)
* Solaris 9 extended tar format (including ACLs)
@@ -30,18 +31,26 @@ Currently, the library automatically detects and reads the following:
* POSIX octet-oriented cpio
* SVR4 ASCII cpio
* Binary cpio (big-endian or little-endian)
- * ISO9660 CD-ROM images (with optional Rockridge extensions)
+ * ISO9660 CD-ROM images (with optional Rockridge or Joliet extensions)
* ZIP archives (with uncompressed or "deflate" compressed entries)
+ * GNU and BSD 'ar' archives
+ * 'mtree' format
The library can write:
* gzip compression
* bzip2 compression
+ * compress/LZW compression
+ * lzma and xz compression
* POSIX ustar
* POSIX pax interchange format
* "restricted" pax format, which will create ustar archives except for
entries that require pax extensions (for long filenames, ACLs, etc).
* POSIX octet-oriented cpio
+ * SVR4 "newc" cpio
* shar archives
+ * ZIP archives (with uncompressed or "deflate" compressed entries)
+ * GNU and BSD 'ar' archives
+ * 'mtree' format
Notes:
* This is a heavily stream-oriented system. There is no direct
diff --git a/lib/libarchive/archive.h b/lib/libarchive/archive.h
index f97af73..7075e26 100644
--- a/lib/libarchive/archive.h
+++ b/lib/libarchive/archive.h
@@ -52,7 +52,9 @@
/* These should match the types used in 'struct stat' */
#if defined(_WIN32) && !defined(__CYGWIN__)
#define __LA_INT64_T __int64
-# if defined(_WIN64)
+# if defined(_SSIZE_T_DEFINED)
+# define __LA_SSIZE_T ssize_t
+# elif defined(_WIN64)
# define __LA_SSIZE_T __int64
# else
# define __LA_SSIZE_T long
@@ -127,13 +129,13 @@ extern "C" {
* (ARCHIVE_API_VERSION * 1000000 + ARCHIVE_API_FEATURE * 1000)
* #endif
*/
-#define ARCHIVE_VERSION_NUMBER 2007901
+#define ARCHIVE_VERSION_NUMBER 2008004
__LA_DECL int archive_version_number(void);
/*
* Textual name/version of the library, useful for version displays.
*/
-#define ARCHIVE_VERSION_STRING "libarchive 2.7.901a"
+#define ARCHIVE_VERSION_STRING "libarchive 2.8.4"
__LA_DECL const char * archive_version_string(void);
#if ARCHIVE_VERSION_NUMBER < 3000000
@@ -319,6 +321,7 @@ __LA_DECL int archive_read_support_compression_program_signature
(struct archive *, const char *,
const void * /* match */, size_t);
+__LA_DECL int archive_read_support_compression_rpm(struct archive *);
__LA_DECL int archive_read_support_compression_uu(struct archive *);
__LA_DECL int archive_read_support_compression_xz(struct archive *);
@@ -331,6 +334,7 @@ __LA_DECL int archive_read_support_format_iso9660(struct archive *);
__LA_DECL int archive_read_support_format_mtree(struct archive *);
__LA_DECL int archive_read_support_format_raw(struct archive *);
__LA_DECL int archive_read_support_format_tar(struct archive *);
+__LA_DECL int archive_read_support_format_xar(struct archive *);
__LA_DECL int archive_read_support_format_zip(struct archive *);
diff --git a/lib/libarchive/archive_hash.h b/lib/libarchive/archive_hash.h
index 3e10e8d..dc63d94 100644
--- a/lib/libarchive/archive_hash.h
+++ b/lib/libarchive/archive_hash.h
@@ -29,6 +29,10 @@
#error This header is only to be used internally to libarchive.
#endif
+#ifdef HAVE_SYS_TYPES_H
+#include <sys/types.h>
+#endif
+
/*
* Hash function support in various Operating Systems:
*
@@ -41,43 +45,71 @@
* - OpenBSD 4.4 and earlier have SHA2 in libc with _ after algorithm name
*
* DragonFly and FreeBSD (XXX not used yet):
- * - MD5 in libmd: without _ after algorithm name
- * - SHA{1,256,512} in libmd: with _ after algorithm name (conflicts w/OpenSSL!)
+ * - MD5 and SHA1 in libmd: without _ after algorithm name
+ * - SHA256: with _ after algorithm name
+ *
+ * Mac OS X (10.4 and later):
+ * - MD5, SHA1 and SHA2 in libSystem: with CC_ prefix and _ after algorithm name
*
* OpenSSL:
- * - MD5, SHA1, SHA2, SHA{256,384,512} in libcrypto: with _ after algorithm name
+ * - MD5, SHA1 and SHA2 in libcrypto: with _ after algorithm name
+ *
+ * Windows:
+ * - MD5, SHA1 and SHA2 in archive_windows.c: without algorithm name
+ * and with __la_ prefix.
*/
+#if defined(ARCHIVE_HASH_MD5_WIN) ||\
+ defined(ARCHIVE_HASH_SHA1_WIN) || defined(ARCHIVE_HASH_SHA256_WIN) ||\
+ defined(ARCHIVE_HASH_SHA384_WIN) || defined(ARCHIVE_HASH_SHA512_WIN)
+#include <wincrypt.h>
+typedef struct {
+ int valid;
+ HCRYPTPROV cryptProv;
+ HCRYPTHASH hash;
+} Digest_CTX;
+extern void __la_hash_Init(Digest_CTX *, ALG_ID);
+extern void __la_hash_Final(unsigned char *, size_t, Digest_CTX *);
+extern void __la_hash_Update(Digest_CTX *, const unsigned char *, size_t);
+#endif
-#if defined(HAVE_MD5_H) && defined(HAVE_MD5INIT)
+#if defined(ARCHIVE_HASH_MD5_LIBC)
# include <md5.h>
# define ARCHIVE_HAS_MD5
typedef MD5_CTX archive_md5_ctx;
# define archive_md5_init(ctx) MD5Init(ctx)
# define archive_md5_final(ctx, buf) MD5Final(buf, ctx)
# define archive_md5_update(ctx, buf, n) MD5Update(ctx, buf, n)
-#elif defined(HAVE_OPENSSL_MD5_H)
+#elif defined(ARCHIVE_HASH_MD5_LIBSYSTEM)
+# include <CommonCrypto/CommonDigest.h>
+# define ARCHIVE_HAS_MD5
+typedef CC_MD5_CTX archive_md5_ctx;
+# define archive_md5_init(ctx) CC_MD5_Init(ctx)
+# define archive_md5_final(ctx, buf) CC_MD5_Final(buf, ctx)
+# define archive_md5_update(ctx, buf, n) CC_MD5_Update(ctx, buf, n)
+#elif defined(ARCHIVE_HASH_MD5_OPENSSL)
# include <openssl/md5.h>
# define ARCHIVE_HAS_MD5
typedef MD5_CTX archive_md5_ctx;
# define archive_md5_init(ctx) MD5_Init(ctx)
# define archive_md5_final(ctx, buf) MD5_Final(buf, ctx)
# define archive_md5_update(ctx, buf, n) MD5_Update(ctx, buf, n)
-#elif defined(_WIN32) && !defined(__CYGWIN__) && defined(CALG_MD5)
+#elif defined(ARCHIVE_HASH_MD5_WIN)
# define ARCHIVE_HAS_MD5
-typedef MD5_CTX archive_md5_ctx;
-# define archive_md5_init(ctx) MD5_Init(ctx)
-# define archive_md5_final(ctx, buf) MD5_Final(buf, ctx)
-# define archive_md5_update(ctx, buf, n) MD5_Update(ctx, buf, n)
+# define MD5_DIGEST_LENGTH 16
+typedef Digest_CTX archive_md5_ctx;
+# define archive_md5_init(ctx) __la_hash_Init(ctx, CALG_MD5)
+# define archive_md5_final(ctx, buf) __la_hash_Final(buf, MD5_DIGEST_LENGTH, ctx)
+# define archive_md5_update(ctx, buf, n) __la_hash_Update(ctx, buf, n)
#endif
-#if defined(HAVE_RMD160_H) && defined(HAVE_RMD160INIT)
+#if defined(ARCHIVE_HASH_RMD160_LIBC)
# include <rmd160.h>
# define ARCHIVE_HAS_RMD160
typedef RMD160_CTX archive_rmd160_ctx;
# define archive_rmd160_init(ctx) RMD160Init(ctx)
# define archive_rmd160_final(ctx, buf) RMD160Final(buf, ctx)
# define archive_rmd160_update(ctx, buf, n) RMD160Update(ctx, buf, n)
-#elif defined(HAVE_OPENSSL_RIPEMD_H)
+#elif defined(ARCHIVE_HASH_RMD160_OPENSSL)
# include <openssl/ripemd.h>
# define ARCHIVE_HAS_RMD160
typedef RIPEMD160_CTX archive_rmd160_ctx;
@@ -86,111 +118,164 @@ typedef RIPEMD160_CTX archive_rmd160_ctx;
# define archive_rmd160_update(ctx, buf, n) RIPEMD160_Update(ctx, buf, n)
#endif
-#if defined(HAVE_SHA1_H) && defined(HAVE_SHA1INIT)
+#if defined(ARCHIVE_HASH_SHA1_LIBC)
# include <sha1.h>
# define ARCHIVE_HAS_SHA1
typedef SHA1_CTX archive_sha1_ctx;
# define archive_sha1_init(ctx) SHA1Init(ctx)
# define archive_sha1_final(ctx, buf) SHA1Final(buf, ctx)
# define archive_sha1_update(ctx, buf, n) SHA1Update(ctx, buf, n)
-#elif defined(HAVE_OPENSSL_SHA_H)
+#elif defined(ARCHIVE_HASH_SHA1_LIBSYSTEM)
+# include <CommonCrypto/CommonDigest.h>
+# define ARCHIVE_HAS_SHA1
+typedef CC_SHA1_CTX archive_sha1_ctx;
+# define archive_sha1_init(ctx) CC_SHA1_Init(ctx)
+# define archive_sha1_final(ctx, buf) CC_SHA1_Final(buf, ctx)
+# define archive_sha1_update(ctx, buf, n) CC_SHA1_Update(ctx, buf, n)
+#elif defined(ARCHIVE_HASH_SHA1_OPENSSL)
# include <openssl/sha.h>
# define ARCHIVE_HAS_SHA1
typedef SHA_CTX archive_sha1_ctx;
# define archive_sha1_init(ctx) SHA1_Init(ctx)
# define archive_sha1_final(ctx, buf) SHA1_Final(buf, ctx)
# define archive_sha1_update(ctx, buf, n) SHA1_Update(ctx, buf, n)
-#elif defined(_WIN32) && !defined(__CYGWIN__) && defined(CALG_SHA1)
+#elif defined(ARCHIVE_HASH_SHA1_WIN)
# define ARCHIVE_HAS_SHA1
-typedef SHA1_CTX archive_sha1_ctx;
-# define archive_sha1_init(ctx) SHA1_Init(ctx)
-# define archive_sha1_final(ctx, buf) SHA1_Final(buf, ctx)
-# define archive_sha1_update(ctx, buf, n) SHA1_Update(ctx, buf, n)
+# define SHA1_DIGEST_LENGTH 20
+typedef Digest_CTX archive_sha1_ctx;
+# define archive_sha1_init(ctx) __la_hash_Init(ctx, CALG_SHA1)
+# define archive_sha1_final(ctx, buf) __la_hash_Final(buf, SHA1_DIGEST_LENGTH, ctx)
+# define archive_sha1_update(ctx, buf, n) __la_hash_Update(ctx, buf, n)
#endif
-#if defined(HAVE_SHA2_H) && defined(HAVE_SHA256_INIT)
+#if defined(ARCHIVE_HASH_SHA256_LIBC)
# include <sha2.h>
# define ARCHIVE_HAS_SHA256
typedef SHA256_CTX archive_sha256_ctx;
# define archive_sha256_init(ctx) SHA256_Init(ctx)
# define archive_sha256_final(ctx, buf) SHA256_Final(buf, ctx)
# define archive_sha256_update(ctx, buf, n) SHA256_Update(ctx, buf, n)
-#elif defined(HAVE_SHA2_H) && defined(HAVE_SHA256INIT)
+#elif defined(ARCHIVE_HASH_SHA256_LIBC2)
# include <sha2.h>
# define ARCHIVE_HAS_SHA256
typedef SHA256_CTX archive_sha256_ctx;
# define archive_sha256_init(ctx) SHA256Init(ctx)
# define archive_sha256_final(ctx, buf) SHA256Final(buf, ctx)
# define archive_sha256_update(ctx, buf, n) SHA256Update(ctx, buf, n)
-#elif defined(HAVE_OPENSSL_SHA_H) && defined(HAVE_OPENSSL_SHA256_INIT)
+#elif defined(ARCHIVE_HASH_SHA256_LIBC3)
+# include <sha2.h>
+# define ARCHIVE_HAS_SHA256
+typedef SHA2_CTX archive_sha256_ctx;
+# define archive_sha256_init(ctx) SHA256Init(ctx)
+# define archive_sha256_final(ctx, buf) SHA256Final(buf, ctx)
+# define archive_sha256_update(ctx, buf, n) SHA256Update(ctx, buf, n)
+#elif defined(ARCHIVE_HASH_SHA256_LIBSYSTEM)
+# include <CommonCrypto/CommonDigest.h>
+# define ARCHIVE_HAS_SHA256
+typedef CC_SHA256_CTX archive_shs256_ctx;
+# define archive_shs256_init(ctx) CC_SHA256_Init(ctx)
+# define archive_shs256_final(ctx, buf) CC_SHA256_Final(buf, ctx)
+# define archive_shs256_update(ctx, buf, n) CC_SHA256_Update(ctx, buf, n)
+#elif defined(ARCHIVE_HASH_SHA256_OPENSSL)
# include <openssl/sha.h>
# define ARCHIVE_HAS_SHA256
typedef SHA256_CTX archive_sha256_ctx;
# define archive_sha256_init(ctx) SHA256_Init(ctx)
# define archive_sha256_final(ctx, buf) SHA256_Final(buf, ctx)
# define archive_sha256_update(ctx, buf, n) SHA256_Update(ctx, buf, n)
-#elif defined(_WIN32) && !defined(__CYGWIN__) && defined(CALG_SHA_256)
+#elif defined(ARCHIVE_HASH_SHA256_WIN)
# define ARCHIVE_HAS_SHA256
-typedef SHA256_CTX archive_sha256_ctx;
-# define archive_sha256_init(ctx) SHA256_Init(ctx)
-# define archive_sha256_final(ctx, buf) SHA256_Final(buf, ctx)
-# define archive_sha256_update(ctx, buf, n) SHA256_Update(ctx, buf, n)
+# define SHA256_DIGEST_LENGTH 32
+typedef Digest_CTX archive_sha256_ctx;
+# define archive_sha256_init(ctx) __la_hash_Init(ctx, CALG_SHA_256)
+# define archive_sha256_final(ctx, buf) __la_hash_Final(buf, SHA256_DIGEST_LENGTH, ctx)
+# define archive_sha256_update(ctx, buf, n) __la_hash_Update(ctx, buf, n)
#endif
-#if defined(HAVE_SHA2_H) && defined(HAVE_SHA384_INIT)
+#if defined(ARCHIVE_HASH_SHA384_LIBC)
# include <sha2.h>
# define ARCHIVE_HAS_SHA384
typedef SHA384_CTX archive_sha384_ctx;
# define archive_sha384_init(ctx) SHA384_Init(ctx)
# define archive_sha384_final(ctx, buf) SHA384_Final(buf, ctx)
# define archive_sha384_update(ctx, buf, n) SHA384_Update(ctx, buf, n)
-#elif defined(HAVE_SHA2_H) && defined(HAVE_SHA384INIT)
+#elif defined(ARCHIVE_HASH_SHA384_LIBC2)
# include <sha2.h>
# define ARCHIVE_HAS_SHA384
typedef SHA384_CTX archive_sha384_ctx;
# define archive_sha384_init(ctx) SHA384Init(ctx)
# define archive_sha384_final(ctx, buf) SHA384Final(buf, ctx)
# define archive_sha384_update(ctx, buf, n) SHA384Update(ctx, buf, n)
-#elif defined(HAVE_OPENSSL_SHA_H) && defined(HAVE_OPENSSL_SHA384_INIT)
+#elif defined(ARCHIVE_HASH_SHA384_LIBC3)
+# include <sha2.h>
+# define ARCHIVE_HAS_SHA384
+typedef SHA2_CTX archive_sha384_ctx;
+# define archive_sha384_init(ctx) SHA384Init(ctx)
+# define archive_sha384_final(ctx, buf) SHA384Final(buf, ctx)
+# define archive_sha384_update(ctx, buf, n) SHA384Update(ctx, buf, n)
+#elif defined(ARCHIVE_HASH_SHA384_LIBSYSTEM)
+# include <CommonCrypto/CommonDigest.h>
+# define ARCHIVE_HAS_SHA384
+typedef CC_SHA512_CTX archive_shs384_ctx;
+# define archive_shs384_init(ctx) CC_SHA384_Init(ctx)
+# define archive_shs384_final(ctx, buf) CC_SHA384_Final(buf, ctx)
+# define archive_shs384_update(ctx, buf, n) CC_SHA384_Update(ctx, buf, n)
+#elif defined(ARCHIVE_HASH_SHA384_OPENSSL)
# include <openssl/sha.h>
# define ARCHIVE_HAS_SHA384
typedef SHA512_CTX archive_sha384_ctx;
# define archive_sha384_init(ctx) SHA384_Init(ctx)
# define archive_sha384_final(ctx, buf) SHA384_Final(buf, ctx)
# define archive_sha384_update(ctx, buf, n) SHA384_Update(ctx, buf, n)
-#elif defined(_WIN32) && !defined(__CYGWIN__) && defined(CALG_SHA_384)
+#elif defined(ARCHIVE_HASH_SHA384_WIN)
# define ARCHIVE_HAS_SHA384
-typedef SHA512_CTX archive_sha384_ctx;
-# define archive_sha384_init(ctx) SHA384_Init(ctx)
-# define archive_sha384_final(ctx, buf) SHA384_Final(buf, ctx)
-# define archive_sha384_update(ctx, buf, n) SHA384_Update(ctx, buf, n)
+# define SHA384_DIGEST_LENGTH 48
+typedef Digest_CTX archive_sha384_ctx;
+# define archive_sha384_init(ctx) __la_hash_Init(ctx, CALG_SHA_384)
+# define archive_sha384_final(ctx, buf) __la_hash_Final(buf, SHA384_DIGEST_LENGTH, ctx)
+# define archive_sha384_update(ctx, buf, n) __la_hash_Update(ctx, buf, n)
#endif
-#if defined(HAVE_SHA2_H) && defined(HAVE_SHA512_INIT)
+#if defined(ARCHIVE_HASH_SHA512_LIBC)
# include <sha2.h>
# define ARCHIVE_HAS_SHA512
typedef SHA512_CTX archive_sha512_ctx;
# define archive_sha512_init(ctx) SHA512_Init(ctx)
# define archive_sha512_final(ctx, buf) SHA512_Final(buf, ctx)
# define archive_sha512_update(ctx, buf, n) SHA512_Update(ctx, buf, n)
-#elif defined(HAVE_SHA2_H) && defined(HAVE_SHA512INIT)
+#elif defined(ARCHIVE_HASH_SHA512_LIBC2)
# include <sha2.h>
# define ARCHIVE_HAS_SHA512
typedef SHA512_CTX archive_sha512_ctx;
# define archive_sha512_init(ctx) SHA512Init(ctx)
# define archive_sha512_final(ctx, buf) SHA512Final(buf, ctx)
# define archive_sha512_update(ctx, buf, n) SHA512Update(ctx, buf, n)
-#elif defined(HAVE_OPENSSL_SHA_H) && defined(HAVE_OPENSSL_SHA512_INIT)
+#elif defined(ARCHIVE_HASH_SHA512_LIBC3)
+# include <sha2.h>
+# define ARCHIVE_HAS_SHA512
+typedef SHA2_CTX archive_sha512_ctx;
+# define archive_sha512_init(ctx) SHA512Init(ctx)
+# define archive_sha512_final(ctx, buf) SHA512Final(buf, ctx)
+# define archive_sha512_update(ctx, buf, n) SHA512Update(ctx, buf, n)
+#elif defined(ARCHIVE_HASH_SHA512_LIBSYSTEM)
+# include <CommonCrypto/CommonDigest.h>
+# define ARCHIVE_HAS_SHA512
+typedef CC_SHA512_CTX archive_shs512_ctx;
+# define archive_shs512_init(ctx) CC_SHA512_Init(ctx)
+# define archive_shs512_final(ctx, buf) CC_SHA512_Final(buf, ctx)
+# define archive_shs512_update(ctx, buf, n) CC_SHA512_Update(ctx, buf, n)
+#elif defined(ARCHIVE_HASH_SHA512_OPENSSL)
# include <openssl/sha.h>
# define ARCHIVE_HAS_SHA512
typedef SHA512_CTX archive_sha512_ctx;
# define archive_sha512_init(ctx) SHA512_Init(ctx)
# define archive_sha512_final(ctx, buf) SHA512_Final(buf, ctx)
# define archive_sha512_update(ctx, buf, n) SHA512_Update(ctx, buf, n)
-#elif defined(_WIN32) && !defined(__CYGWIN__) && defined(CALG_SHA_512)
+#elif defined(ARCHIVE_HASH_SHA512_WIN)
# define ARCHIVE_HAS_SHA512
-typedef SHA512_CTX archive_sha512_ctx;
-# define archive_sha512_init(ctx) SHA512_Init(ctx)
-# define archive_sha512_final(ctx, buf) SHA512_Final(buf, ctx)
-# define archive_sha512_update(ctx, buf, n) SHA512_Update(ctx, buf, n)
+# define SHA512_DIGEST_LENGTH 64
+typedef Digest_CTX archive_sha512_ctx;
+# define archive_sha512_init(ctx) __la_hash_Init(ctx, CALG_SHA_512)
+# define archive_sha512_final(ctx, buf) __la_hash_Final(buf, SHA512_DIGEST_LENGTH, ctx)
+# define archive_sha512_update(ctx, buf, n) __la_hash_Update(ctx, buf, n)
#endif
diff --git a/lib/libarchive/archive_read.3 b/lib/libarchive/archive_read.3
index 850deb6..4df0db6 100644
--- a/lib/libarchive/archive_read.3
+++ b/lib/libarchive/archive_read.3
@@ -597,7 +597,7 @@ list_archive(const char *name)
archive_read_support_format_all(a);
archive_read_open(a, mydata, myopen, myread, myclose);
while (archive_read_next_header(a, &entry) == ARCHIVE_OK) {
- printf("%s\\n",archive_entry_pathname(entry));
+ printf("%s\en",archive_entry_pathname(entry));
archive_read_data_skip(a);
}
archive_read_free(a);
diff --git a/lib/libarchive/archive_read_disk_entry_from_file.c b/lib/libarchive/archive_read_disk_entry_from_file.c
index dbb7d75..957e4ee 100644
--- a/lib/libarchive/archive_read_disk_entry_from_file.c
+++ b/lib/libarchive/archive_read_disk_entry_from_file.c
@@ -208,6 +208,12 @@ setup_acls_posix1e(struct archive_read_disk *a,
#if HAVE_ACL_GET_LINK_NP
else if (!a->follow_symlinks)
acl = acl_get_link_np(accpath, ACL_TYPE_ACCESS);
+#else
+ else if ((!a->follow_symlinks)
+ && (archive_entry_filetype(entry) == AE_IFLNK))
+ /* We can't get the ACL of a symlink, so we assume it can't
+ have one. */
+ acl = NULL;
#endif
else
acl = acl_get_file(accpath, ACL_TYPE_ACCESS);
@@ -419,7 +425,8 @@ setup_xattrs(struct archive_read_disk *a,
return (ARCHIVE_OK);
}
-#elif HAVE_EXTATTR_GET_FILE && HAVE_EXTATTR_LIST_FILE
+#elif HAVE_EXTATTR_GET_FILE && HAVE_EXTATTR_LIST_FILE && \
+ HAVE_DECL_EXTATTR_NAMESPACE_USER
/*
* FreeBSD extattr interface.
@@ -430,11 +437,11 @@ setup_xattrs(struct archive_read_disk *a,
* to not include the system extattrs that hold ACLs; we handle
* those separately.
*/
-int
+static int
setup_xattr(struct archive_read_disk *a, struct archive_entry *entry,
int namespace, const char *name, const char *fullname, int fd);
-int
+static int
setup_xattr(struct archive_read_disk *a, struct archive_entry *entry,
int namespace, const char *name, const char *fullname, int fd)
{
diff --git a/lib/libarchive/archive_read_disk_set_standard_lookup.c b/lib/libarchive/archive_read_disk_set_standard_lookup.c
index dc2f67f..45f8b43 100644
--- a/lib/libarchive/archive_read_disk_set_standard_lookup.c
+++ b/lib/libarchive/archive_read_disk_set_standard_lookup.c
@@ -182,6 +182,7 @@ lookup_uname(void *data, uid_t uid)
&lookup_uname_helper, (id_t)uid));
}
+#if HAVE_GETPWUID_R
static const char *
lookup_uname_helper(struct name_cache *cache, id_t id)
{
@@ -222,6 +223,20 @@ lookup_uname_helper(struct name_cache *cache, id_t id)
return strdup(result->pw_name);
}
+#else
+static const char *
+lookup_uname_helper(struct name_cache *cache, id_t id)
+{
+ struct passwd *result;
+
+ result = getpwuid((uid_t)id);
+
+ if (result == NULL)
+ return (NULL);
+
+ return strdup(result->pw_name);
+}
+#endif
static const char *
lookup_gname(void *data, gid_t gid)
@@ -231,6 +246,7 @@ lookup_gname(void *data, gid_t gid)
&lookup_gname_helper, (id_t)gid));
}
+#if HAVE_GETGRGID_R
static const char *
lookup_gname_helper(struct name_cache *cache, id_t id)
{
@@ -269,4 +285,19 @@ lookup_gname_helper(struct name_cache *cache, id_t id)
return strdup(result->gr_name);
}
+#else
+static const char *
+lookup_gname_helper(struct name_cache *cache, id_t id)
+{
+ struct group *result;
+
+ result = getgrgid((gid_t)id);
+
+ if (result == NULL)
+ return (NULL);
+
+ return strdup(result->gr_name);
+}
+#endif
+
#endif /* ! (_WIN32 && !__CYGWIN__) */
diff --git a/lib/libarchive/archive_read_support_compression_all.c b/lib/libarchive/archive_read_support_compression_all.c
index bb7b66c..484e557 100644
--- a/lib/libarchive/archive_read_support_compression_all.c
+++ b/lib/libarchive/archive_read_support_compression_all.c
@@ -46,6 +46,8 @@ archive_read_support_compression_all(struct archive *a)
archive_read_support_compression_xz(a);
/* The decode code doesn't use an outside library. */
archive_read_support_compression_uu(a);
+ /* The decode code doesn't use an outside library. */
+ archive_read_support_compression_rpm(a);
/* Note: We always return ARCHIVE_OK here, even if some of the
* above return ARCHIVE_WARN. The intent here is to enable
diff --git a/lib/libarchive/archive_read_support_compression_bzip2.c b/lib/libarchive/archive_read_support_compression_bzip2.c
index e72e1c5..fc419d4 100644
--- a/lib/libarchive/archive_read_support_compression_bzip2.c
+++ b/lib/libarchive/archive_read_support_compression_bzip2.c
@@ -48,7 +48,7 @@ __FBSDID("$FreeBSD$");
#include "archive_private.h"
#include "archive_read_private.h"
-#if HAVE_BZLIB_H
+#if defined(HAVE_BZLIB_H) && defined(BZ_CONFIG_ERROR)
struct private_data {
bz_stream stream;
char *out_block;
@@ -86,7 +86,7 @@ archive_read_support_compression_bzip2(struct archive *_a)
reader->init = bzip2_reader_init;
reader->options = NULL;
reader->free = bzip2_reader_free;
-#if HAVE_BZLIB_H
+#if defined(HAVE_BZLIB_H) && defined(BZ_CONFIG_ERROR)
return (ARCHIVE_OK);
#else
archive_set_error(_a, ARCHIVE_ERRNO_MISC,
@@ -146,7 +146,7 @@ bzip2_reader_bid(struct archive_read_filter_bidder *self, struct archive_read_fi
return (bits_checked);
}
-#ifndef HAVE_BZLIB_H
+#if !defined(HAVE_BZLIB_H) || !defined(BZ_CONFIG_ERROR)
/*
* If we don't have the library on this system, we can't actually do the
diff --git a/lib/libarchive/archive_read_support_compression_rpm.c b/lib/libarchive/archive_read_support_compression_rpm.c
new file mode 100644
index 0000000..f8bd878
--- /dev/null
+++ b/lib/libarchive/archive_read_support_compression_rpm.c
@@ -0,0 +1,288 @@
+/*-
+ * Copyright (c) 2009 Michihiro NAKAJIMA
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR(S) ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "archive_platform.h"
+__FBSDID("$FreeBSD$");
+
+#ifdef HAVE_ERRNO_H
+#include <errno.h>
+#endif
+#ifdef HAVE_STDLIB_H
+#include <stdlib.h>
+#endif
+
+#include "archive.h"
+#include "archive_endian.h"
+#include "archive_private.h"
+#include "archive_read_private.h"
+
+struct rpm {
+ int64_t total_in;
+ size_t hpos;
+ size_t hlen;
+ unsigned char header[16];
+ enum {
+ ST_LEAD, /* Skipping 'Lead' section. */
+ ST_HEADER, /* Reading 'Header' section;
+ * first 16 bytes. */
+ ST_HEADER_DATA, /* Skipping 'Header' section. */
+ ST_PADDING, /* Skipping padding data after the
+ * 'Header' section. */
+ ST_ARCHIVE /* Reading 'Archive' section. */
+ } state;
+ int first_header;
+};
+#define RPM_LEAD_SIZE 96 /* Size of 'Lead' section. */
+
+static int rpm_bidder_bid(struct archive_read_filter_bidder *,
+ struct archive_read_filter *);
+static int rpm_bidder_init(struct archive_read_filter *);
+
+static ssize_t rpm_filter_read(struct archive_read_filter *,
+ const void **);
+static int rpm_filter_close(struct archive_read_filter *);
+
+int
+archive_read_support_compression_rpm(struct archive *_a)
+{
+ struct archive_read *a = (struct archive_read *)_a;
+ struct archive_read_filter_bidder *bidder;
+
+ bidder = __archive_read_get_bidder(a);
+ archive_clear_error(_a);
+ if (bidder == NULL)
+ return (ARCHIVE_FATAL);
+
+ bidder->data = NULL;
+ bidder->bid = rpm_bidder_bid;
+ bidder->init = rpm_bidder_init;
+ bidder->options = NULL;
+ bidder->free = NULL;
+ return (ARCHIVE_OK);
+}
+
+static int
+rpm_bidder_bid(struct archive_read_filter_bidder *self,
+ struct archive_read_filter *filter)
+{
+ const unsigned char *b;
+ ssize_t avail;
+ int bits_checked;
+
+ (void)self; /* UNUSED */
+
+ b = __archive_read_filter_ahead(filter, 8, &avail);
+ if (b == NULL)
+ return (0);
+
+ bits_checked = 0;
+ /*
+ * Verify Header Magic Bytes : 0xed 0xab 0xee 0xdb
+ */
+ if (b[0] != 0xed)
+ return (0);
+ bits_checked += 8;
+ if (b[1] != 0xab)
+ return (0);
+ bits_checked += 8;
+ if (b[2] != 0xee)
+ return (0);
+ bits_checked += 8;
+ if (b[3] != 0xdb)
+ return (0);
+ bits_checked += 8;
+ /*
+ * Check major version.
+ */
+ if (b[4] != 3 && b[4] != 4)
+ return (0);
+ bits_checked += 8;
+ /*
+ * Check package type; binary or source.
+ */
+ if (b[6] != 0)
+ return (0);
+ bits_checked += 8;
+ if (b[7] != 0 && b[7] != 1)
+ return (0);
+ bits_checked += 8;
+
+ return (bits_checked);
+}
+
+static int
+rpm_bidder_init(struct archive_read_filter *self)
+{
+ struct rpm *rpm;
+
+ self->code = ARCHIVE_COMPRESSION_RPM;
+ self->name = "rpm";
+ self->read = rpm_filter_read;
+ self->skip = NULL; /* not supported */
+ self->close = rpm_filter_close;
+
+ rpm = (struct rpm *)calloc(sizeof(*rpm), 1);
+ if (rpm == NULL) {
+ archive_set_error(&self->archive->archive, ENOMEM,
+ "Can't allocate data for rpm");
+ return (ARCHIVE_FATAL);
+ }
+
+ self->data = rpm;
+ rpm->state = ST_LEAD;
+
+ return (ARCHIVE_OK);
+}
+
+static ssize_t
+rpm_filter_read(struct archive_read_filter *self, const void **buff)
+{
+ struct rpm *rpm;
+ const unsigned char *b;
+ ssize_t avail_in, total;
+ size_t used, n;
+ uint32_t section;
+ uint32_t bytes;
+
+ rpm = (struct rpm *)self->data;
+ *buff = NULL;
+ total = avail_in = 0;
+ b = NULL;
+ used = 0;
+ do {
+ if (b == NULL) {
+ b = __archive_read_filter_ahead(self->upstream, 1,
+ &avail_in);
+ if (b == NULL) {
+ if (avail_in < 0)
+ return (ARCHIVE_FATAL);
+ else
+ break;
+ }
+ }
+
+ switch (rpm->state) {
+ case ST_LEAD:
+ if (rpm->total_in + avail_in < RPM_LEAD_SIZE)
+ used += avail_in;
+ else {
+ n = RPM_LEAD_SIZE - rpm->total_in;
+ used += n;
+ b += n;
+ rpm->state = ST_HEADER;
+ rpm->hpos = 0;
+ rpm->hlen = 0;
+ rpm->first_header = 1;
+ }
+ break;
+ case ST_HEADER:
+ n = 16 - rpm->hpos;
+ if (n > avail_in - used)
+ n = avail_in - used;
+ memcpy(rpm->header+rpm->hpos, b, n);
+ b += n;
+ used += n;
+ rpm->hpos += n;
+
+ if (rpm->hpos == 16) {
+ if (rpm->header[0] != 0x8e ||
+ rpm->header[1] != 0xad ||
+ rpm->header[2] != 0xe8 ||
+ rpm->header[3] != 0x01) {
+ if (rpm->first_header) {
+ archive_set_error(
+ &self->archive->archive,
+ ARCHIVE_ERRNO_FILE_FORMAT,
+ "Unrecoginized rpm header");
+ return (ARCHIVE_FATAL);
+ }
+ rpm->state = ST_ARCHIVE;
+ *buff = rpm->header;
+ total = rpm->hpos;
+ break;
+ }
+ /* Calculate 'Header' length. */
+ section = archive_be32dec(rpm->header+8);
+ bytes = archive_be32dec(rpm->header+12);
+ rpm->hlen = 16 + section * 16 + bytes;
+ rpm->state = ST_HEADER_DATA;
+ rpm->first_header = 0;
+ }
+ break;
+ case ST_HEADER_DATA:
+ n = rpm->hlen - rpm->hpos;
+ if (n > avail_in - used)
+ n = avail_in - used;
+ b += n;
+ used += n;
+ rpm->hpos += n;
+ if (rpm->hpos == rpm->hlen)
+ rpm->state = ST_PADDING;
+ break;
+ case ST_PADDING:
+ while (used < (size_t)avail_in) {
+ if (*b != 0) {
+ /* Read next header. */
+ rpm->state = ST_HEADER;
+ rpm->hpos = 0;
+ rpm->hlen = 0;
+ break;
+ }
+ b++;
+ used++;
+ }
+ break;
+ case ST_ARCHIVE:
+ *buff = b;
+ total = avail_in;
+ used = avail_in;
+ break;
+ }
+ if (used == (size_t)avail_in) {
+ rpm->total_in += used;
+ __archive_read_filter_consume(self->upstream, used);
+ b = NULL;
+ used = 0;
+ }
+ } while (total == 0 && avail_in > 0);
+
+ if (used > 0 && b != NULL) {
+ rpm->total_in += used;
+ __archive_read_filter_consume(self->upstream, used);
+ }
+ return (total);
+}
+
+static int
+rpm_filter_close(struct archive_read_filter *self)
+{
+ struct rpm *rpm;
+
+ rpm = (struct rpm *)self->data;
+ free(rpm);
+
+ return (ARCHIVE_OK);
+}
+
diff --git a/lib/libarchive/archive_read_support_compression_uu.c b/lib/libarchive/archive_read_support_compression_uu.c
index 5f397d6..c3c37d6 100644
--- a/lib/libarchive/archive_read_support_compression_uu.c
+++ b/lib/libarchive/archive_read_support_compression_uu.c
@@ -325,7 +325,7 @@ uudecode_bidder_bid(struct archive_read_filter_bidder *self,
--len;
}
b += nl;
-
+
if (avail >= 5 && memcmp(b, "====\n", 5) == 0)
return (firstline+40);
if (avail >= 6 && memcmp(b, "====\r\n", 6) == 0)
diff --git a/lib/libarchive/archive_read_support_format_all.c b/lib/libarchive/archive_read_support_format_all.c
index 753a105..69d16fc 100644
--- a/lib/libarchive/archive_read_support_format_all.c
+++ b/lib/libarchive/archive_read_support_format_all.c
@@ -37,6 +37,7 @@ archive_read_support_format_all(struct archive *a)
archive_read_support_format_iso9660(a);
archive_read_support_format_mtree(a);
archive_read_support_format_tar(a);
+ archive_read_support_format_xar(a);
archive_read_support_format_zip(a);
return (ARCHIVE_OK);
}
diff --git a/lib/libarchive/archive_read_support_format_mtree.c b/lib/libarchive/archive_read_support_format_mtree.c
index 5efe4a8..bb231fa 100644
--- a/lib/libarchive/archive_read_support_format_mtree.c
+++ b/lib/libarchive/archive_read_support_format_mtree.c
@@ -370,7 +370,7 @@ process_add_entry(struct archive_read *a, struct mtree *mtree,
line = next;
next = line + strcspn(line, " \t\r\n");
eq = strchr(line, '=');
- if (eq > next)
+ if (eq == NULL || eq > next)
len = next - line;
else
len = eq - line;
diff --git a/lib/libarchive/archive_read_support_format_xar.c b/lib/libarchive/archive_read_support_format_xar.c
new file mode 100644
index 0000000..7194fa5
--- /dev/null
+++ b/lib/libarchive/archive_read_support_format_xar.c
@@ -0,0 +1,3151 @@
+/*-
+ * Copyright (c) 2009 Michihiro NAKAJIMA
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR(S) ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+#include "archive_platform.h"
+__FBSDID("$FreeBSD$");
+
+#ifdef HAVE_ERRNO_H
+#include <errno.h>
+#endif
+#include <stdio.h>
+#ifdef HAVE_STDLIB_H
+#include <stdlib.h>
+#endif
+#if HAVE_LIBXML_XMLREADER_H
+#include <libxml/xmlreader.h>
+#elif HAVE_BSDXML_H
+#include <bsdxml.h>
+#elif HAVE_EXPAT_H
+#include <expat.h>
+#endif
+#ifdef HAVE_BZLIB_H
+#include <bzlib.h>
+#endif
+#if HAVE_LZMA_H
+#include <lzma.h>
+#elif HAVE_LZMADEC_H
+#include <lzmadec.h>
+#endif
+#ifdef HAVE_ZLIB_H
+#include <zlib.h>
+#endif
+
+#include "archive.h"
+#include "archive_endian.h"
+#include "archive_entry.h"
+#include "archive_hash.h"
+#include "archive_private.h"
+#include "archive_read_private.h"
+
+#if (!defined(HAVE_LIBXML_XMLREADER_H) && \
+ !defined(HAVE_BSDXML_H) && !defined(HAVE_EXPAT_H)) ||\
+ !defined(HAVE_ZLIB_H) || \
+ !defined(ARCHIVE_HAS_MD5) || !defined(ARCHIVE_HAS_SHA1)
+/*
+ * xar needs several external libraries.
+ * o libxml2 or expat --- XML parser
+ * o openssl or MD5/SHA1 hash function
+ * o zlib
+ * o bzlib2 (option)
+ * o liblzma (option)
+ */
+int
+archive_read_support_format_xar(struct archive *_a)
+{
+ struct archive_read *a = (struct archive_read *)_a;
+
+ archive_set_error(&a->archive, ARCHIVE_ERRNO_MISC,
+ "Xar not supported on this platform");
+ return (ARCHIVE_WARN);
+}
+
+#else /* Support xar format */
+
+//#define DEBUG 1
+//#define DEBUG_PRINT_TOC 1
+#if DEBUG_PRINT_TOC
+#define PRINT_TOC(d, outbytes) do { \
+ unsigned char *x = (unsigned char *)(uintptr_t)d; \
+ unsigned char c = x[outbytes-1]; \
+ x[outbytes - 1] = 0; \
+ fprintf(stderr, "%s", x); \
+ fprintf(stderr, "%c", c); \
+ x[outbytes - 1] = c; \
+} while (0)
+#else
+#define PRINT_TOC(d, outbytes)
+#endif
+
+#define HEADER_MAGIC 0x78617221
+#define HEADER_SIZE 28
+#define HEADER_VERSION 1
+#define CKSUM_NONE 0
+#define CKSUM_SHA1 1
+#define CKSUM_MD5 2
+
+#define MD5_SIZE 16
+#define SHA1_SIZE 20
+#define MAX_SUM_SIZE 20
+
+enum enctype {
+ NONE,
+ GZIP,
+ BZIP2,
+ LZMA,
+ XZ,
+};
+
+struct chksumval {
+ int alg;
+ size_t len;
+ unsigned char val[MAX_SUM_SIZE];
+};
+
+struct chksumwork {
+ int alg;
+#ifdef ARCHIVE_HAS_MD5
+ archive_md5_ctx md5ctx;
+#endif
+#ifdef ARCHIVE_HAS_SHA1
+ archive_sha1_ctx sha1ctx;
+#endif
+};
+
+struct xattr {
+ struct xattr *next;
+ struct archive_string name;
+ uint64_t id;
+ uint64_t length;
+ uint64_t offset;
+ uint64_t size;
+ enum enctype encoding;
+ struct chksumval a_sum;
+ struct chksumval e_sum;
+ struct archive_string fstype;
+};
+
+struct xar_file {
+ struct xar_file *next;
+ struct xar_file *hdnext;
+ struct xar_file *parent;
+ int subdirs;
+
+ unsigned int has;
+#define HAS_DATA 0x00001
+#define HAS_PATHNAME 0x00002
+#define HAS_SYMLINK 0x00004
+#define HAS_TIME 0x00008
+#define HAS_UID 0x00010
+#define HAS_GID 0x00020
+#define HAS_MODE 0x00040
+#define HAS_TYPE 0x00080
+#define HAS_DEV 0x00100
+#define HAS_DEVMAJOR 0x00200
+#define HAS_DEVMINOR 0x00400
+#define HAS_INO 0x00800
+#define HAS_FFLAGS 0x01000
+#define HAS_XATTR 0x02000
+#define HAS_ACL 0x04000
+
+ uint64_t id;
+ uint64_t length;
+ uint64_t offset;
+ uint64_t size;
+ enum enctype encoding;
+ struct chksumval a_sum;
+ struct chksumval e_sum;
+ struct archive_string pathname;
+ struct archive_string symlink;
+ time_t ctime;
+ time_t mtime;
+ time_t atime;
+ struct archive_string uname;
+ uid_t uid;
+ struct archive_string gname;
+ gid_t gid;
+ mode_t mode;
+ dev_t dev;
+ dev_t devmajor;
+ dev_t devminor;
+ int64_t ino64;
+ struct archive_string fflags_text;
+ unsigned int link;
+ unsigned int nlink;
+ struct archive_string hardlink;
+ struct xattr *xattr_list;
+};
+
+struct hdlink {
+ struct hdlink *next;
+
+ unsigned int id;
+ int cnt;
+ struct xar_file *files;
+};
+
+struct heap_queue {
+ struct xar_file **files;
+ int allocated;
+ int used;
+};
+
+enum xmlstatus {
+ INIT,
+ XAR,
+ TOC,
+ TOC_CREATION_TIME,
+ TOC_CHECKSUM,
+ TOC_CHECKSUM_OFFSET,
+ TOC_CHECKSUM_SIZE,
+ TOC_FILE,
+ FILE_DATA,
+ FILE_DATA_LENGTH,
+ FILE_DATA_OFFSET,
+ FILE_DATA_SIZE,
+ FILE_DATA_ENCODING,
+ FILE_DATA_A_CHECKSUM,
+ FILE_DATA_E_CHECKSUM,
+ FILE_DATA_CONTENT,
+ FILE_EA,
+ FILE_EA_LENGTH,
+ FILE_EA_OFFSET,
+ FILE_EA_SIZE,
+ FILE_EA_ENCODING,
+ FILE_EA_A_CHECKSUM,
+ FILE_EA_E_CHECKSUM,
+ FILE_EA_NAME,
+ FILE_EA_FSTYPE,
+ FILE_CTIME,
+ FILE_MTIME,
+ FILE_ATIME,
+ FILE_GROUP,
+ FILE_GID,
+ FILE_USER,
+ FILE_UID,
+ FILE_MODE,
+ FILE_DEVICE,
+ FILE_DEVICE_MAJOR,
+ FILE_DEVICE_MINOR,
+ FILE_DEVICENO,
+ FILE_INODE,
+ FILE_LINK,
+ FILE_TYPE,
+ FILE_NAME,
+ FILE_ACL,
+ FILE_ACL_DEFAULT,
+ FILE_ACL_ACCESS,
+ FILE_ACL_APPLEEXTENDED,
+ /* BSD file flags. */
+ FILE_FLAGS,
+ FILE_FLAGS_USER_NODUMP,
+ FILE_FLAGS_USER_IMMUTABLE,
+ FILE_FLAGS_USER_APPEND,
+ FILE_FLAGS_USER_OPAQUE,
+ FILE_FLAGS_USER_NOUNLINK,
+ FILE_FLAGS_SYS_ARCHIVED,
+ FILE_FLAGS_SYS_IMMUTABLE,
+ FILE_FLAGS_SYS_APPEND,
+ FILE_FLAGS_SYS_NOUNLINK,
+ FILE_FLAGS_SYS_SNAPSHOT,
+ /* Linux file flags. */
+ FILE_EXT2,
+ FILE_EXT2_SecureDeletion,
+ FILE_EXT2_Undelete,
+ FILE_EXT2_Compress,
+ FILE_EXT2_Synchronous,
+ FILE_EXT2_Immutable,
+ FILE_EXT2_AppendOnly,
+ FILE_EXT2_NoDump,
+ FILE_EXT2_NoAtime,
+ FILE_EXT2_CompDirty,
+ FILE_EXT2_CompBlock,
+ FILE_EXT2_NoCompBlock,
+ FILE_EXT2_CompError,
+ FILE_EXT2_BTree,
+ FILE_EXT2_HashIndexed,
+ FILE_EXT2_iMagic,
+ FILE_EXT2_Journaled,
+ FILE_EXT2_NoTail,
+ FILE_EXT2_DirSync,
+ FILE_EXT2_TopDir,
+ FILE_EXT2_Reserved,
+ UNKNOWN,
+};
+
+struct unknown_tag {
+ struct unknown_tag *next;
+ struct archive_string name;
+};
+
+struct xar {
+ uint64_t offset; /* Current position in the file. */
+ int64_t total;
+ uint64_t h_base;
+ int end_of_file;
+ unsigned char buff[1024*32];
+
+ enum xmlstatus xmlsts;
+ enum xmlstatus xmlsts_unknown;
+ struct unknown_tag *unknowntags;
+ int base64text;
+
+ /*
+ * TOC
+ */
+ uint64_t toc_remaining;
+ uint64_t toc_total;
+ uint64_t toc_chksum_offset;
+ uint64_t toc_chksum_size;
+
+ /*
+ * For Decoding data.
+ */
+ enum enctype rd_encoding;
+ z_stream stream;
+ int stream_valid;
+#if defined(HAVE_BZLIB_H) && defined(BZ_CONFIG_ERROR)
+ bz_stream bzstream;
+ int bzstream_valid;
+#endif
+#if HAVE_LZMA_H && HAVE_LIBLZMA
+ lzma_stream lzstream;
+ int lzstream_valid;
+#elif HAVE_LZMADEC_H && HAVE_LIBLZMADEC
+ lzmadec_stream lzstream;
+ int lzstream_valid;
+#endif
+ /*
+ * For Checksum data.
+ */
+ struct chksumwork a_sumwrk;
+ struct chksumwork e_sumwrk;
+
+ struct xar_file *file; /* current reading file. */
+ struct xattr *xattr; /* current reading extended attribute. */
+ struct heap_queue file_queue;
+ struct xar_file *hdlink_orgs;
+ struct hdlink *hdlink_list;
+
+ int entry_init;
+ uint64_t entry_total;
+ uint64_t entry_remaining;
+ uint64_t entry_size;
+ enum enctype entry_encoding;
+ struct chksumval entry_a_sum;
+ struct chksumval entry_e_sum;
+};
+
+struct xmlattr {
+ struct xmlattr *next;
+ char *name;
+ char *value;
+};
+
+struct xmlattr_list {
+ struct xmlattr *first;
+ struct xmlattr **last;
+};
+
+static int xar_bid(struct archive_read *);
+static int xar_read_header(struct archive_read *,
+ struct archive_entry *);
+static int xar_read_data(struct archive_read *,
+ const void **, size_t *, off_t *);
+static int xar_read_data_skip(struct archive_read *);
+static int xar_cleanup(struct archive_read *);
+static int move_reading_point(struct archive_read *, uint64_t);
+static int rd_contents_init(struct archive_read *,
+ enum enctype, int, int);
+static int rd_contents(struct archive_read *, const void **,
+ size_t *, size_t *, uint64_t);
+static uint64_t atol10(const char *, size_t);
+static int64_t atol8(const char *, size_t);
+static size_t atohex(unsigned char *, size_t, const char *, size_t);
+static time_t parse_time(const char *p, size_t n);
+static void heap_add_entry(struct heap_queue *, struct xar_file *);
+static struct xar_file *heap_get_entry(struct heap_queue *);
+static void add_link(struct xar *, struct xar_file *);
+static void checksum_init(struct archive_read *, int, int);
+static void checksum_update(struct archive_read *, const void *,
+ size_t, const void *, size_t);
+static int checksum_final(struct archive_read *, const void *,
+ size_t, const void *, size_t);
+static int decompression_init(struct archive_read *, enum enctype);
+static int decompress(struct archive_read *, const void **,
+ size_t *, const void *, size_t *);
+static int decompression_cleanup(struct archive_read *);
+static void xmlattr_cleanup(struct xmlattr_list *);
+static void file_new(struct xar *, struct xmlattr_list *);
+static void file_free(struct xar_file *);
+static void xattr_new(struct xar *, struct xmlattr_list *);
+static void xattr_free(struct xattr *);
+static int getencoding(struct xmlattr_list *);
+static int getsumalgorithm(struct xmlattr_list *);
+static void unknowntag_start(struct xar *, const char *);
+static void unknowntag_end(struct xar *, const char *);
+static void xml_start(void *, const char *, struct xmlattr_list *);
+static void xml_end(void *, const char *);
+static void xml_data(void *, const char *, int);
+static int xml_parse_file_flags(struct xar *, const char *);
+static int xml_parse_file_ext2(struct xar *, const char *);
+#if defined(HAVE_LIBXML_XMLREADER_H)
+static int xml2_xmlattr_setup(struct xmlattr_list *, xmlTextReaderPtr);
+static int xml2_read_cb(void *, char *, int);
+static int xml2_close_cb(void *);
+static void xml2_error_hdr(void *, const char *, xmlParserSeverities,
+ xmlTextReaderLocatorPtr);
+static int xml2_read_toc(struct archive_read *);
+#elif defined(HAVE_BSDXML_H) || defined(HAVE_EXPAT_H)
+static void expat_xmlattr_setup(struct xmlattr_list *, const XML_Char **);
+static void expat_start_cb(void *, const XML_Char *, const XML_Char **);
+static void expat_end_cb(void *, const XML_Char *);
+static void expat_data_cb(void *, const XML_Char *, int);
+static int expat_read_toc(struct archive_read *);
+#endif
+
+int
+archive_read_support_format_xar(struct archive *_a)
+{
+ struct xar *xar;
+ struct archive_read *a = (struct archive_read *)_a;
+ int r;
+
+ xar = (struct xar *)calloc(1, sizeof(*xar));
+ if (xar == NULL) {
+ archive_set_error(&a->archive, ENOMEM,
+ "Can't allocate xar data");
+ return (ARCHIVE_FATAL);
+ }
+
+ r = __archive_read_register_format(a,
+ xar,
+ "xar",
+ xar_bid,
+ NULL,
+ xar_read_header,
+ xar_read_data,
+ xar_read_data_skip,
+ xar_cleanup);
+ if (r != ARCHIVE_OK)
+ free(xar);
+ return (r);
+}
+
+static int
+xar_bid(struct archive_read *a)
+{
+ const unsigned char *b;
+ int bid;
+
+ b = __archive_read_ahead(a, HEADER_SIZE, NULL);
+ if (b == NULL)
+ return (-1);
+
+ bid = 0;
+ /*
+ * Verify magic code
+ */
+ if (archive_be32dec(b) != HEADER_MAGIC)
+ return (0);
+ bid += 32;
+ /*
+ * Verify header size
+ */
+ if (archive_be16dec(b+4) != HEADER_SIZE)
+ return (0);
+ bid += 16;
+ /*
+ * Verify header version
+ */
+ if (archive_be16dec(b+6) != HEADER_VERSION)
+ return (0);
+ bid += 16;
+ /*
+ * Verify type of checksum
+ */
+ switch (archive_be32dec(b+24)) {
+ case CKSUM_NONE:
+ case CKSUM_SHA1:
+ case CKSUM_MD5:
+ bid += 32;
+ break;
+ default:
+ return (0);
+ }
+
+ return (bid);
+}
+
+static int
+read_toc(struct archive_read *a)
+{
+ struct xar *xar;
+ struct xar_file *file;
+ const unsigned char *b;
+ uint64_t toc_compressed_size;
+ uint64_t toc_uncompressed_size;
+ uint32_t toc_chksum_alg;
+ ssize_t bytes;
+ int r;
+
+ xar = (struct xar *)(a->format->data);
+
+ /*
+ * Read xar header.
+ */
+ b = __archive_read_ahead(a, HEADER_SIZE, &bytes);
+ if (bytes < 0)
+ return ((int)bytes);
+ if (bytes < HEADER_SIZE) {
+ archive_set_error(&a->archive,
+ ARCHIVE_ERRNO_FILE_FORMAT,
+ "Truncated archive header");
+ return (ARCHIVE_FATAL);
+ }
+
+ if (archive_be32dec(b) != HEADER_MAGIC) {
+ archive_set_error(&a->archive,
+ ARCHIVE_ERRNO_FILE_FORMAT,
+ "Invalid header magic");
+ return (ARCHIVE_FATAL);
+ }
+ if (archive_be16dec(b+6) != HEADER_VERSION) {
+ archive_set_error(&a->archive,
+ ARCHIVE_ERRNO_FILE_FORMAT,
+ "Unsupported header version(%d)",
+ archive_be16dec(b+6));
+ return (ARCHIVE_FATAL);
+ }
+ toc_compressed_size = archive_be64dec(b+8);
+ xar->toc_remaining = toc_compressed_size;
+ toc_uncompressed_size = archive_be64dec(b+16);
+ toc_chksum_alg = archive_be32dec(b+24);
+ __archive_read_consume(a, HEADER_SIZE);
+ xar->offset += HEADER_SIZE;
+ xar->toc_total = 0;
+
+ /*
+ * Read TOC(Table of Contents).
+ */
+ /* Initialize reading contents. */
+ r = move_reading_point(a, HEADER_SIZE);
+ if (r != ARCHIVE_OK)
+ return (r);
+ r = rd_contents_init(a, GZIP, toc_chksum_alg, CKSUM_NONE);
+ if (r != ARCHIVE_OK)
+ return (r);
+
+#ifdef HAVE_LIBXML_XMLREADER_H
+ r = xml2_read_toc(a);
+#elif defined(HAVE_BSDXML_H) || defined(HAVE_EXPAT_H)
+ r = expat_read_toc(a);
+#endif
+ if (r != ARCHIVE_OK)
+ return (r);
+
+ /* Set 'The HEAP' base. */
+ xar->h_base = xar->offset;
+ if (xar->toc_total != toc_uncompressed_size) {
+ archive_set_error(&a->archive, ARCHIVE_ERRNO_MISC,
+ "TOC uncompressed size error");
+ return (ARCHIVE_FATAL);
+ }
+
+ /*
+ * Checksum TOC
+ */
+ if (toc_chksum_alg != CKSUM_NONE) {
+ r = move_reading_point(a, xar->toc_chksum_offset);
+ if (r != ARCHIVE_OK)
+ return (r);
+ b = __archive_read_ahead(a, xar->toc_chksum_size, &bytes);
+ if (bytes < 0)
+ return ((int)bytes);
+ if ((uint64_t)bytes < xar->toc_chksum_size) {
+ archive_set_error(&a->archive,
+ ARCHIVE_ERRNO_FILE_FORMAT,
+ "Truncated archive file");
+ return (ARCHIVE_FATAL);
+ }
+ r = checksum_final(a, b, xar->toc_chksum_size, NULL, 0);
+ __archive_read_consume(a, xar->toc_chksum_size);
+ xar->offset += xar->toc_chksum_size;
+ if (r != ARCHIVE_OK)
+ return (ARCHIVE_FATAL);
+ }
+
+ /*
+ * Connect hardlinked files.
+ */
+ for (file = xar->hdlink_orgs; file != NULL; file = file->hdnext) {
+ struct hdlink **hdlink;
+
+ for (hdlink = &(xar->hdlink_list); *hdlink != NULL;
+ hdlink = &((*hdlink)->next)) {
+ if ((*hdlink)->id == file->id) {
+ struct hdlink *hltmp;
+ struct xar_file *f2;
+ int nlink = (*hdlink)->cnt + 1;
+
+ file->nlink = nlink;
+ for (f2 = (*hdlink)->files; f2 != NULL;
+ f2 = f2->hdnext) {
+ f2->nlink = nlink;
+ archive_string_copy(
+ &(f2->hardlink), &(file->pathname));
+ }
+ /* Remove resolved files from hdlist_list. */
+ hltmp = *hdlink;
+ *hdlink = hltmp->next;
+ free(hltmp);
+ break;
+ }
+ }
+ }
+ a->archive.archive_format = ARCHIVE_FORMAT_XAR;
+ a->archive.archive_format_name = "xar";
+
+ return (ARCHIVE_OK);
+}
+
+static int
+xar_read_header(struct archive_read *a, struct archive_entry *entry)
+{
+ struct xar *xar;
+ struct xar_file *file;
+ struct xattr *xattr;
+ int r;
+
+ xar = (struct xar *)(a->format->data);
+
+ if (xar->offset == 0) {
+ /* Read TOC. */
+ r = read_toc(a);
+ if (r != ARCHIVE_OK)
+ return (r);
+ }
+
+ for (;;) {
+ file = xar->file = heap_get_entry(&(xar->file_queue));
+ if (file == NULL) {
+ xar->end_of_file = 1;
+ return (ARCHIVE_EOF);
+ }
+ if ((file->mode & AE_IFMT) != AE_IFDIR)
+ break;
+ if (file->has != (HAS_PATHNAME | HAS_TYPE))
+ break;
+ /*
+ * If a file type is a directory and it does not have
+ * any metadata, do not export.
+ */
+ file_free(file);
+ }
+ archive_entry_set_atime(entry, file->atime, 0);
+ archive_entry_set_ctime(entry, file->ctime, 0);
+ archive_entry_set_mtime(entry, file->mtime, 0);
+ archive_entry_set_gid(entry, file->gid);
+ if (file->gname.length > 0)
+ archive_entry_update_gname_utf8(entry, file->gname.s);
+ archive_entry_set_uid(entry, file->uid);
+ if (file->uname.length > 0)
+ archive_entry_update_uname_utf8(entry, file->uname.s);
+ archive_entry_set_mode(entry, file->mode);
+ archive_entry_update_pathname_utf8(entry, file->pathname.s);
+ if (file->symlink.length > 0)
+ archive_entry_update_symlink_utf8(entry, file->symlink.s);
+ /* Set proper nlink. */
+ if ((file->mode & AE_IFMT) == AE_IFDIR)
+ archive_entry_set_nlink(entry, file->subdirs + 2);
+ else
+ archive_entry_set_nlink(entry, file->nlink);
+ archive_entry_set_size(entry, file->size);
+ if (archive_strlen(&(file->hardlink)) > 0)
+ archive_entry_update_hardlink_utf8(entry,
+ file->hardlink.s);
+ archive_entry_set_ino64(entry, file->ino64);
+ if (file->has & HAS_DEV)
+ archive_entry_set_dev(entry, file->dev);
+ if (file->has & HAS_DEVMAJOR)
+ archive_entry_set_devmajor(entry, file->devmajor);
+ if (file->has & HAS_DEVMINOR)
+ archive_entry_set_devminor(entry, file->devminor);
+ if (archive_strlen(&(file->fflags_text)) > 0)
+ archive_entry_copy_fflags_text(entry, file->fflags_text.s);
+
+ xar->entry_init = 1;
+ xar->entry_total = 0;
+ xar->entry_remaining = file->length;
+ xar->entry_size = file->size;
+ xar->entry_encoding = file->encoding;
+ xar->entry_a_sum = file->a_sum;
+ xar->entry_e_sum = file->e_sum;
+ /*
+ * Read extended attributes.
+ */
+ r = ARCHIVE_OK;
+ xattr = file->xattr_list;
+ while (xattr != NULL) {
+ const void *d;
+ size_t outbytes, used;
+
+ r = move_reading_point(a, xattr->offset);
+ if (r != ARCHIVE_OK)
+ break;
+ r = rd_contents_init(a, xattr->encoding,
+ xattr->a_sum.alg, xattr->e_sum.alg);
+ if (r != ARCHIVE_OK)
+ break;
+ d = NULL;
+ r = rd_contents(a, &d, &outbytes, &used, xattr->length);
+ if (r != ARCHIVE_OK)
+ break;
+ if (outbytes != xattr->size) {
+ archive_set_error(&(a->archive), ARCHIVE_ERRNO_MISC,
+ "Decompressed size error");
+ r = ARCHIVE_FATAL;
+ break;
+ }
+ r = checksum_final(a,
+ xattr->a_sum.val, xattr->a_sum.len,
+ xattr->e_sum.val, xattr->e_sum.len);
+ if (r != ARCHIVE_OK)
+ break;
+ archive_entry_xattr_add_entry(entry,
+ xattr->name.s, d, outbytes);
+ xattr = xattr->next;
+ }
+ if (r != ARCHIVE_OK) {
+ file_free(file);
+ return (r);
+ }
+
+ if (xar->entry_remaining > 0)
+ /* Move reading point to the beginning of current
+ * file contents. */
+ r = move_reading_point(a, file->offset);
+ else
+ r = ARCHIVE_OK;
+
+ file_free(file);
+ return (r);
+}
+
+static int
+xar_read_data(struct archive_read *a,
+ const void **buff, size_t *size, off_t *offset)
+{
+ struct xar *xar;
+ size_t used;
+ int r;
+
+ xar = (struct xar *)(a->format->data);
+ if (xar->end_of_file || xar->entry_remaining <= 0) {
+ r = ARCHIVE_EOF;
+ goto abort_read_data;
+ }
+
+ if (xar->entry_init) {
+ r = rd_contents_init(a, xar->entry_encoding,
+ xar->entry_a_sum.alg, xar->entry_e_sum.alg);
+ if (r != ARCHIVE_OK) {
+ xar->entry_remaining = 0;
+ return (r);
+ }
+ xar->entry_init = 0;
+ }
+
+ *buff = NULL;
+ r = rd_contents(a, buff, size, &used, xar->entry_remaining);
+ if (r != ARCHIVE_OK)
+ goto abort_read_data;
+
+ *offset = xar->entry_total;
+ xar->entry_total += *size;
+ xar->total += *size;
+ xar->offset += used;
+ xar->entry_remaining -= used;
+ __archive_read_consume(a, used);
+
+ if (xar->entry_remaining == 0) {
+ if (xar->entry_total != xar->entry_size) {
+ archive_set_error(&(a->archive), ARCHIVE_ERRNO_MISC,
+ "Decompressed size error");
+ r = ARCHIVE_FATAL;
+ goto abort_read_data;
+ }
+ r = checksum_final(a,
+ xar->entry_a_sum.val, xar->entry_a_sum.len,
+ xar->entry_e_sum.val, xar->entry_e_sum.len);
+ if (r != ARCHIVE_OK)
+ goto abort_read_data;
+ }
+
+ return (ARCHIVE_OK);
+abort_read_data:
+ *buff = NULL;
+ *size = 0;
+ *offset = xar->total;
+ return (r);
+}
+
+static int
+xar_read_data_skip(struct archive_read *a)
+{
+ struct xar *xar;
+ int64_t bytes_skipped;
+
+ xar = (struct xar *)(a->format->data);
+ if (xar->end_of_file)
+ return (ARCHIVE_EOF);
+ bytes_skipped = __archive_read_skip(a, xar->entry_remaining);
+ if (bytes_skipped < 0)
+ return (ARCHIVE_FATAL);
+ xar->offset += bytes_skipped;
+ return (ARCHIVE_OK);
+}
+
+static int
+xar_cleanup(struct archive_read *a)
+{
+ struct xar *xar;
+ struct hdlink *hdlink;
+ int i;
+ int r;
+
+ xar = (struct xar *)(a->format->data);
+ r = decompression_cleanup(a);
+ hdlink = xar->hdlink_list;
+ while (hdlink != NULL) {
+ struct hdlink *next = hdlink->next;
+
+ free(hdlink);
+ hdlink = next;
+ }
+ for (i = 0; i < xar->file_queue.used; i++)
+ file_free(xar->file_queue.files[i]);
+ while (xar->unknowntags != NULL) {
+ struct unknown_tag *tag;
+
+ tag = xar->unknowntags;
+ xar->unknowntags = tag->next;
+ archive_string_free(&(tag->name));
+ free(tag);
+ }
+ free(xar);
+ a->format->data = NULL;
+ return (r);
+}
+
+static int
+move_reading_point(struct archive_read *a, uint64_t offset)
+{
+ struct xar *xar;
+
+ xar = (struct xar *)(a->format->data);
+ if (xar->offset - xar->h_base != offset) {
+ /* Seek forward to the start of file contents. */
+ int64_t step;
+
+ step = offset - (xar->offset - xar->h_base);
+ if (step > 0) {
+ step = __archive_read_skip(a, step);
+ if (step < 0)
+ return ((int)step);
+ xar->offset += step;
+ } else {
+ archive_set_error(&(a->archive),
+ ARCHIVE_ERRNO_MISC,
+ "Cannot seek.");
+ return (ARCHIVE_FAILED);
+ }
+ }
+ return (ARCHIVE_OK);
+}
+
+static int
+rd_contents_init(struct archive_read *a, enum enctype encoding,
+ int a_sum_alg, int e_sum_alg)
+{
+ int r;
+
+ /* Init decompress library. */
+ if ((r = decompression_init(a, encoding)) != ARCHIVE_OK)
+ return (r);
+ /* Init checksum library. */
+ checksum_init(a, a_sum_alg, e_sum_alg);
+ return (ARCHIVE_OK);
+}
+
+static int
+rd_contents(struct archive_read *a, const void **buff, size_t *size,
+ size_t *used, uint64_t remaining)
+{
+ const unsigned char *b;
+ ssize_t bytes;
+
+ /* Get whatever bytes are immediately available. */
+ b = __archive_read_ahead(a, 1, &bytes);
+ if (bytes < 0)
+ return ((int)bytes);
+ if (bytes == 0) {
+ archive_set_error(&a->archive, ARCHIVE_ERRNO_MISC,
+ "Truncated archive file");
+ return (ARCHIVE_FATAL);
+ }
+ if ((uint64_t)bytes > remaining)
+ bytes = (ssize_t)remaining;
+
+ /*
+ * Decompress contents of file.
+ */
+ *used = bytes;
+ if (decompress(a, buff, size, b, used) != ARCHIVE_OK)
+ return (ARCHIVE_FATAL);
+
+ /*
+ * Update checksum of a compressed data and a extracted data.
+ */
+ checksum_update(a, b, *used, *buff, *size);
+
+ return (ARCHIVE_OK);
+}
+
+/*
+ * Note that this implementation does not (and should not!) obey
+ * locale settings; you cannot simply substitute strtol here, since
+ * it does obey locale.
+ */
+
+static uint64_t
+atol10(const char *p, size_t char_cnt)
+{
+ uint64_t l;
+ int digit;
+
+ l = 0;
+ digit = *p - '0';
+ while (digit >= 0 && digit < 10 && char_cnt-- > 0) {
+ l = (l * 10) + digit;
+ digit = *++p - '0';
+ }
+ return (l);
+}
+
+static int64_t
+atol8(const char *p, size_t char_cnt)
+{
+ int64_t l;
+ int digit;
+
+ l = 0;
+ while (char_cnt-- > 0) {
+ if (*p >= '0' && *p <= '7')
+ digit = *p - '0';
+ else
+ break;
+ p++;
+ l <<= 3;
+ l |= digit;
+ }
+ return (l);
+}
+
+static size_t
+atohex(unsigned char *b, size_t bsize, const char *p, size_t psize)
+{
+ size_t fbsize = bsize;
+
+ while (bsize && psize > 1) {
+ unsigned char x;
+
+ if (p[0] >= 'a' && p[0] <= 'z')
+ x = (p[0] - 'a' + 0x0a) << 4;
+ else if (p[0] >= 'A' && p[0] <= 'Z')
+ x = (p[0] - 'A' + 0x0a) << 4;
+ else if (p[0] >= '0' && p[0] <= '9')
+ x = (p[0] - '0') << 4;
+ else
+ return (-1);
+ if (p[1] >= 'a' && p[1] <= 'z')
+ x |= p[1] - 'a' + 0x0a;
+ else if (p[1] >= 'A' && p[1] <= 'Z')
+ x |= p[1] - 'A' + 0x0a;
+ else if (p[1] >= '0' && p[1] <= '9')
+ x |= p[1] - '0';
+ else
+ return (-1);
+
+ *b++ = x;
+ bsize--;
+ p += 2;
+ psize -= 2;
+ }
+ return (fbsize - bsize);
+}
+
+static time_t
+time_from_tm(struct tm *t)
+{
+#if HAVE_TIMEGM
+ /* Use platform timegm() if available. */
+ return (timegm(t));
+#else
+ /* Else use direct calculation using POSIX assumptions. */
+ /* First, fix up tm_yday based on the year/month/day. */
+ mktime(t);
+ /* Then we can compute timegm() from first principles. */
+ return (t->tm_sec + t->tm_min * 60 + t->tm_hour * 3600
+ + t->tm_yday * 86400 + (t->tm_year - 70) * 31536000
+ + ((t->tm_year - 69) / 4) * 86400 -
+ ((t->tm_year - 1) / 100) * 86400
+ + ((t->tm_year + 299) / 400) * 86400);
+#endif
+}
+
+static time_t
+parse_time(const char *p, size_t n)
+{
+ struct tm tm;
+ time_t t = 0;
+ int64_t data;
+
+ memset(&tm, 0, sizeof(tm));
+ if (n != 20)
+ return (t);
+ data = atol10(p, 4);
+ if (data < 1900)
+ return (t);
+ tm.tm_year = (int)data - 1900;
+ p += 4;
+ if (*p++ != '-')
+ return (t);
+ data = atol10(p, 2);
+ if (data < 1 || data > 12)
+ return (t);
+ tm.tm_mon = (int)data -1;
+ p += 2;
+ if (*p++ != '-')
+ return (t);
+ data = atol10(p, 2);
+ if (data < 1 || data > 31)
+ return (t);
+ tm.tm_mday = (int)data;
+ p += 2;
+ if (*p++ != 'T')
+ return (t);
+ data = atol10(p, 2);
+ if (data < 0 || data > 23)
+ return (t);
+ tm.tm_hour = (int)data;
+ p += 2;
+ if (*p++ != ':')
+ return (t);
+ data = atol10(p, 2);
+ if (data < 0 || data > 59)
+ return (t);
+ tm.tm_min = (int)data;
+ p += 2;
+ if (*p++ != ':')
+ return (t);
+ data = atol10(p, 2);
+ if (data < 0 || data > 60)
+ return (t);
+ tm.tm_sec = (int)data;
+#if 0
+ p += 2;
+ if (*p != 'Z')
+ return (t);
+#endif
+
+ t = time_from_tm(&tm);
+
+ return (t);
+}
+
+static void
+heap_add_entry(struct heap_queue *heap, struct xar_file *file)
+{
+ uint64_t file_id, parent_id;
+ int hole, parent;
+
+ /* Expand our pending files list as necessary. */
+ if (heap->used >= heap->allocated) {
+ struct xar_file **new_pending_files;
+ int new_size = heap->allocated * 2;
+
+ if (heap->allocated < 1024)
+ new_size = 1024;
+ /* Overflow might keep us from growing the list. */
+ if (new_size <= heap->allocated)
+ __archive_errx(1, "Out of memory");
+ new_pending_files = (struct xar_file **)
+ malloc(new_size * sizeof(new_pending_files[0]));
+ if (new_pending_files == NULL)
+ __archive_errx(1, "Out of memory");
+ memcpy(new_pending_files, heap->files,
+ heap->allocated * sizeof(new_pending_files[0]));
+ if (heap->files != NULL)
+ free(heap->files);
+ heap->files = new_pending_files;
+ heap->allocated = new_size;
+ }
+
+ file_id = file->id;
+
+ /*
+ * Start with hole at end, walk it up tree to find insertion point.
+ */
+ hole = heap->used++;
+ while (hole > 0) {
+ parent = (hole - 1)/2;
+ parent_id = heap->files[parent]->id;
+ if (file_id >= parent_id) {
+ heap->files[hole] = file;
+ return;
+ }
+ // Move parent into hole <==> move hole up tree.
+ heap->files[hole] = heap->files[parent];
+ hole = parent;
+ }
+ heap->files[0] = file;
+}
+
+static struct xar_file *
+heap_get_entry(struct heap_queue *heap)
+{
+ uint64_t a_id, b_id, c_id;
+ int a, b, c;
+ struct xar_file *r, *tmp;
+
+ if (heap->used < 1)
+ return (NULL);
+
+ /*
+ * The first file in the list is the earliest; we'll return this.
+ */
+ r = heap->files[0];
+
+ /*
+ * Move the last item in the heap to the root of the tree
+ */
+ heap->files[0] = heap->files[--(heap->used)];
+
+ /*
+ * Rebalance the heap.
+ */
+ a = 0; // Starting element and its heap key
+ a_id = heap->files[a]->id;
+ for (;;) {
+ b = a + a + 1; // First child
+ if (b >= heap->used)
+ return (r);
+ b_id = heap->files[b]->id;
+ c = b + 1; // Use second child if it is smaller.
+ if (c < heap->used) {
+ c_id = heap->files[c]->id;
+ if (c_id < b_id) {
+ b = c;
+ b_id = c_id;
+ }
+ }
+ if (a_id <= b_id)
+ return (r);
+ tmp = heap->files[a];
+ heap->files[a] = heap->files[b];
+ heap->files[b] = tmp;
+ a = b;
+ }
+}
+
+static void
+add_link(struct xar *xar, struct xar_file *file)
+{
+ struct hdlink *hdlink;
+
+ for (hdlink = xar->hdlink_list; hdlink != NULL; hdlink = hdlink->next) {
+ if (hdlink->id == file->link) {
+ file->hdnext = hdlink->files;
+ hdlink->cnt++;
+ hdlink->files = file;
+ return;
+ }
+ }
+ hdlink = malloc(sizeof(*hdlink));
+ if (hdlink == NULL)
+ __archive_errx(1, "No memory for add_link()");
+ file->hdnext = NULL;
+ hdlink->id = file->link;
+ hdlink->cnt = 1;
+ hdlink->files = file;
+ hdlink->next = xar->hdlink_list;
+ xar->hdlink_list = hdlink;
+}
+
+static void
+_checksum_init(struct chksumwork *sumwrk, int sum_alg)
+{
+ sumwrk->alg = sum_alg;
+ switch (sum_alg) {
+ case CKSUM_NONE:
+ break;
+ case CKSUM_SHA1:
+ archive_sha1_init(&(sumwrk->sha1ctx));
+ break;
+ case CKSUM_MD5:
+ archive_md5_init(&(sumwrk->md5ctx));
+ break;
+ }
+}
+
+static void
+_checksum_update(struct chksumwork *sumwrk, const void *buff, size_t size)
+{
+
+ switch (sumwrk->alg) {
+ case CKSUM_NONE:
+ break;
+ case CKSUM_SHA1:
+ archive_sha1_update(&(sumwrk->sha1ctx), buff, size);
+ break;
+ case CKSUM_MD5:
+ archive_md5_update(&(sumwrk->md5ctx), buff, size);
+ break;
+ }
+}
+
+static int
+_checksum_final(struct chksumwork *sumwrk, const void *val, size_t len)
+{
+ unsigned char sum[MAX_SUM_SIZE];
+ int r = ARCHIVE_OK;
+
+ switch (sumwrk->alg) {
+ case CKSUM_NONE:
+ break;
+ case CKSUM_SHA1:
+ archive_sha1_final(&(sumwrk->sha1ctx), sum);
+ if (len != SHA1_SIZE ||
+ memcmp(val, sum, SHA1_SIZE) != 0)
+ r = ARCHIVE_FAILED;
+ break;
+ case CKSUM_MD5:
+ archive_md5_final(&(sumwrk->md5ctx), sum);
+ if (len != MD5_SIZE ||
+ memcmp(val, sum, MD5_SIZE) != 0)
+ r = ARCHIVE_FAILED;
+ break;
+ }
+ return (r);
+}
+
+static void
+checksum_init(struct archive_read *a, int a_sum_alg, int e_sum_alg)
+{
+ struct xar *xar;
+
+ xar = (struct xar *)(a->format->data);
+ _checksum_init(&(xar->a_sumwrk), a_sum_alg);
+ _checksum_init(&(xar->e_sumwrk), e_sum_alg);
+}
+
+static void
+checksum_update(struct archive_read *a, const void *abuff, size_t asize,
+ const void *ebuff, size_t esize)
+{
+ struct xar *xar;
+
+ xar = (struct xar *)(a->format->data);
+ _checksum_update(&(xar->a_sumwrk), abuff, asize);
+ _checksum_update(&(xar->e_sumwrk), ebuff, esize);
+}
+
+static int
+checksum_final(struct archive_read *a, const void *a_sum_val,
+ size_t a_sum_len, const void *e_sum_val, size_t e_sum_len)
+{
+ struct xar *xar;
+ int r;
+
+ xar = (struct xar *)(a->format->data);
+ r = _checksum_final(&(xar->a_sumwrk), a_sum_val, a_sum_len);
+ if (r == ARCHIVE_OK)
+ r = _checksum_final(&(xar->e_sumwrk), e_sum_val, e_sum_len);
+ if (r != ARCHIVE_OK)
+ archive_set_error(&(a->archive), ARCHIVE_ERRNO_MISC,
+ "Sumcheck error");
+ return (r);
+}
+
+static int
+decompression_init(struct archive_read *a, enum enctype encoding)
+{
+ struct xar *xar;
+ const char *detail;
+ int r;
+
+ xar = (struct xar *)(a->format->data);
+ xar->rd_encoding = encoding;
+ switch (encoding) {
+ case NONE:
+ break;
+ case GZIP:
+ if (xar->stream_valid)
+ r = inflateReset(&(xar->stream));
+ else
+ r = inflateInit(&(xar->stream));
+ if (r != Z_OK) {
+ archive_set_error(&a->archive, ARCHIVE_ERRNO_MISC,
+ "Couldn't initialize zlib stream.");
+ return (ARCHIVE_FATAL);
+ }
+ xar->stream_valid = 1;
+ xar->stream.total_in = 0;
+ xar->stream.total_out = 0;
+ break;
+#if defined(HAVE_BZLIB_H) && defined(BZ_CONFIG_ERROR)
+ case BZIP2:
+ if (xar->bzstream_valid) {
+ BZ2_bzDecompressEnd(&(xar->bzstream));
+ xar->bzstream_valid = 0;
+ }
+ r = BZ2_bzDecompressInit(&(xar->bzstream), 0, 0);
+ if (r == BZ_MEM_ERROR)
+ r = BZ2_bzDecompressInit(&(xar->bzstream), 0, 1);
+ if (r != BZ_OK) {
+ int err = ARCHIVE_ERRNO_MISC;
+ detail = NULL;
+ switch (r) {
+ case BZ_PARAM_ERROR:
+ detail = "invalid setup parameter";
+ break;
+ case BZ_MEM_ERROR:
+ err = ENOMEM;
+ detail = "out of memory";
+ break;
+ case BZ_CONFIG_ERROR:
+ detail = "mis-compiled library";
+ break;
+ }
+ archive_set_error(&a->archive, err,
+ "Internal error initializing decompressor: %s",
+ detail == NULL ? "??" : detail);
+ xar->bzstream_valid = 0;
+ return (ARCHIVE_FATAL);
+ }
+ xar->bzstream_valid = 1;
+ xar->bzstream.total_in_lo32 = 0;
+ xar->bzstream.total_in_hi32 = 0;
+ xar->bzstream.total_out_lo32 = 0;
+ xar->bzstream.total_out_hi32 = 0;
+ break;
+#endif
+#if defined(HAVE_LZMA_H) && defined(HAVE_LIBLZMA)
+ case XZ:
+ case LZMA:
+ if (xar->lzstream_valid) {
+ lzma_end(&(xar->lzstream));
+ xar->lzstream_valid = 0;
+ }
+ if (xar->entry_encoding == XZ)
+ r = lzma_stream_decoder(&(xar->lzstream),
+ (1U << 30),/* memlimit */
+ LZMA_CONCATENATED);
+ else
+ r = lzma_alone_decoder(&(xar->lzstream),
+ (1U << 30));/* memlimit */
+ if (r != LZMA_OK) {
+ switch (r) {
+ case LZMA_MEM_ERROR:
+ archive_set_error(&a->archive,
+ ENOMEM,
+ "Internal error initializing "
+ "compression library: "
+ "Cannot allocate memory");
+ break;
+ case LZMA_OPTIONS_ERROR:
+ archive_set_error(&a->archive,
+ ARCHIVE_ERRNO_MISC,
+ "Internal error initializing "
+ "compression library: "
+ "Invalid or unsupported options");
+ break;
+ default:
+ archive_set_error(&a->archive,
+ ARCHIVE_ERRNO_MISC,
+ "Internal error initializing "
+ "lzma library");
+ break;
+ }
+ return (ARCHIVE_FATAL);
+ }
+ xar->lzstream_valid = 1;
+ xar->lzstream.total_in = 0;
+ xar->lzstream.total_out = 0;
+ break;
+#elif defined(HAVE_LZMADEC_H) && defined(HAVE_LIBLZMADEC)
+ case LZMA:
+ if (xar->lzstream_valid)
+ lzmadec_end(&(xar->lzstream));
+ r = lzmadec_init(&(xar->lzstream));
+ if (r != LZMADEC_OK) {
+ switch (r) {
+ case LZMADEC_HEADER_ERROR:
+ archive_set_error(&a->archive,
+ ARCHIVE_ERRNO_MISC,
+ "Internal error initializing "
+ "compression library: "
+ "invalid header");
+ break;
+ case LZMADEC_MEM_ERROR:
+ archive_set_error(&a->archive,
+ ENOMEM,
+ "Internal error initializing "
+ "compression library: "
+ "out of memory");
+ break;
+ }
+ return (ARCHIVE_FATAL);
+ }
+ xar->lzstream_valid = 1;
+ xar->lzstream.total_in = 0;
+ xar->lzstream.total_out = 0;
+ break;
+#endif
+ /*
+ * Unsupported compression.
+ */
+ default:
+#if !defined(HAVE_BZLIB_H) || !defined(BZ_CONFIG_ERROR)
+ case BZIP2:
+#endif
+#if !defined(HAVE_LZMA_H) || !defined(HAVE_LIBLZMA)
+#if !defined(HAVE_LZMADEC_H) || !defined(HAVE_LIBLZMADEC)
+ case LZMA:
+#endif
+ case XZ:
+#endif
+ switch (xar->entry_encoding) {
+ case BZIP2: detail = "bzip2"; break;
+ case LZMA: detail = "lzma"; break;
+ case XZ: detail = "xz"; break;
+ default: detail = "??"; break;
+ }
+ archive_set_error(&a->archive, ARCHIVE_ERRNO_MISC,
+ "%s compression not supported on this platform",
+ detail);
+ return (ARCHIVE_FAILED);
+ }
+ return (ARCHIVE_OK);
+}
+
+static int
+decompress(struct archive_read *a, const void **buff, size_t *outbytes,
+ const void *b, size_t *used)
+{
+ struct xar *xar;
+ void *outbuff;
+ size_t avail_in, avail_out;
+ int r;
+
+ xar = (struct xar *)(a->format->data);
+ avail_in = *used;
+ outbuff = (void *)(uintptr_t)*buff;
+ if (outbuff == NULL) {
+ outbuff = xar->buff;
+ *buff = outbuff;
+ avail_out = sizeof(xar->buff);
+ } else
+ avail_out = *outbytes;
+ switch (xar->rd_encoding) {
+ case GZIP:
+ xar->stream.next_in = (Bytef *)(uintptr_t)b;
+ xar->stream.avail_in = avail_in;
+ xar->stream.next_out = (unsigned char *)outbuff;
+ xar->stream.avail_out = avail_out;
+ r = inflate(&(xar->stream), 0);
+ switch (r) {
+ case Z_OK: /* Decompressor made some progress.*/
+ case Z_STREAM_END: /* Found end of stream. */
+ break;
+ default:
+ archive_set_error(&a->archive, ARCHIVE_ERRNO_MISC,
+ "File decompression failed (%d)", r);
+ return (ARCHIVE_FATAL);
+ }
+ *used = avail_in - xar->stream.avail_in;
+ *outbytes = avail_out - xar->stream.avail_out;
+ break;
+#if defined(HAVE_BZLIB_H) && defined(BZ_CONFIG_ERROR)
+ case BZIP2:
+ xar->bzstream.next_in = (char *)(uintptr_t)b;
+ xar->bzstream.avail_in = avail_in;
+ xar->bzstream.next_out = (char *)outbuff;
+ xar->bzstream.avail_out = avail_out;
+ r = BZ2_bzDecompress(&(xar->bzstream));
+ switch (r) {
+ case BZ_STREAM_END: /* Found end of stream. */
+ switch (BZ2_bzDecompressEnd(&(xar->bzstream))) {
+ case BZ_OK:
+ break;
+ default:
+ archive_set_error(&(a->archive),
+ ARCHIVE_ERRNO_MISC,
+ "Failed to clean up decompressor");
+ return (ARCHIVE_FATAL);
+ }
+ xar->bzstream_valid = 0;
+ /* FALLTHROUGH */
+ case BZ_OK: /* Decompressor made some progress. */
+ break;
+ default:
+ archive_set_error(&(a->archive),
+ ARCHIVE_ERRNO_MISC,
+ "bzip decompression failed");
+ return (ARCHIVE_FATAL);
+ }
+ *used = avail_in - xar->bzstream.avail_in;
+ *outbytes = avail_out - xar->bzstream.avail_out;
+ break;
+#endif
+#if defined(HAVE_LZMA_H) && defined(HAVE_LIBLZMA)
+ case LZMA:
+ case XZ:
+ xar->lzstream.next_in = b;
+ xar->lzstream.avail_in = avail_in;
+ xar->lzstream.next_out = (unsigned char *)outbuff;
+ xar->lzstream.avail_out = avail_out;
+ r = lzma_code(&(xar->lzstream), LZMA_RUN);
+ switch (r) {
+ case LZMA_STREAM_END: /* Found end of stream. */
+ lzma_end(&(xar->lzstream));
+ xar->lzstream_valid = 0;
+ /* FALLTHROUGH */
+ case LZMA_OK: /* Decompressor made some progress. */
+ break;
+ default:
+ archive_set_error(&(a->archive),
+ ARCHIVE_ERRNO_MISC,
+ "%s decompression failed(%d)",
+ (xar->entry_encoding == XZ)?"xz":"lzma",
+ r);
+ return (ARCHIVE_FATAL);
+ }
+ *used = avail_in - xar->lzstream.avail_in;
+ *outbytes = avail_out - xar->lzstream.avail_out;
+ break;
+#elif defined(HAVE_LZMADEC_H) && defined(HAVE_LIBLZMADEC)
+ case LZMA:
+ xar->lzstream.next_in = (unsigned char *)(uintptr_t)b;
+ xar->lzstream.avail_in = avail_in;
+ xar->lzstream.next_out = (unsigned char *)outbuff;
+ xar->lzstream.avail_out = avail_out;
+ r = lzmadec_decode(&(xar->lzstream), 0);
+ switch (r) {
+ case LZMADEC_STREAM_END: /* Found end of stream. */
+ switch (lzmadec_end(&(xar->lzstream))) {
+ case LZMADEC_OK:
+ break;
+ default:
+ archive_set_error(&(a->archive),
+ ARCHIVE_ERRNO_MISC,
+ "Failed to clean up lzmadec decompressor");
+ return (ARCHIVE_FATAL);
+ }
+ xar->lzstream_valid = 0;
+ /* FALLTHROUGH */
+ case LZMADEC_OK: /* Decompressor made some progress. */
+ break;
+ default:
+ archive_set_error(&(a->archive),
+ ARCHIVE_ERRNO_MISC,
+ "lzmadec decompression failed(%d)",
+ r);
+ return (ARCHIVE_FATAL);
+ }
+ *used = avail_in - xar->lzstream.avail_in;
+ *outbytes = avail_out - xar->lzstream.avail_out;
+ break;
+#endif
+#if !defined(HAVE_BZLIB_H) || !defined(BZ_CONFIG_ERROR)
+ case BZIP2:
+#endif
+#if !defined(HAVE_LZMA_H) || !defined(HAVE_LIBLZMA)
+#if !defined(HAVE_LZMADEC_H) || !defined(HAVE_LIBLZMADEC)
+ case LZMA:
+#endif
+ case XZ:
+#endif
+ case NONE:
+ default:
+ if (outbuff == xar->buff) {
+ *buff = b;
+ *used = avail_in;
+ *outbytes = avail_in;
+ } else {
+ if (avail_out > avail_in)
+ avail_out = avail_in;
+ memcpy(outbuff, b, avail_out);
+ *used = avail_out;
+ *outbytes = avail_out;
+ }
+ break;
+ }
+ return (ARCHIVE_OK);
+}
+
+static int
+decompression_cleanup(struct archive_read *a)
+{
+ struct xar *xar;
+ int r;
+
+ xar = (struct xar *)(a->format->data);
+ r = ARCHIVE_OK;
+ if (xar->stream_valid) {
+ if (inflateEnd(&(xar->stream)) != Z_OK) {
+ archive_set_error(&a->archive,
+ ARCHIVE_ERRNO_MISC,
+ "Failed to clean up zlib decompressor");
+ r = ARCHIVE_FATAL;
+ }
+ }
+#if defined(HAVE_BZLIB_H) && defined(BZ_CONFIG_ERROR)
+ if (xar->bzstream_valid) {
+ if (BZ2_bzDecompressEnd(&(xar->bzstream)) != BZ_OK) {
+ archive_set_error(&a->archive,
+ ARCHIVE_ERRNO_MISC,
+ "Failed to clean up bzip2 decompressor");
+ r = ARCHIVE_FATAL;
+ }
+ }
+#endif
+#if defined(HAVE_LZMA_H) && defined(HAVE_LIBLZMA)
+ if (xar->lzstream_valid)
+ lzma_end(&(xar->lzstream));
+#elif defined(HAVE_LZMA_H) && defined(HAVE_LIBLZMA)
+ if (xar->lzstream_valid) {
+ if (lzmadec_end(&(xar->lzstream)) != LZMADEC_OK) {
+ archive_set_error(&a->archive,
+ ARCHIVE_ERRNO_MISC,
+ "Failed to clean up lzmadec decompressor");
+ r = ARCHIVE_FATAL;
+ }
+ }
+#endif
+ return (r);
+}
+
+static void
+xmlattr_cleanup(struct xmlattr_list *list)
+{
+ struct xmlattr *attr, *next;
+
+ attr = list->first;
+ while (attr != NULL) {
+ next = attr->next;
+ free(attr->name);
+ free(attr->value);
+ free(attr);
+ attr = next;
+ }
+ list->first = NULL;
+ list->last = &(list->first);
+}
+
+static void
+file_new(struct xar *xar, struct xmlattr_list *list)
+{
+ struct xar_file *file;
+ struct xmlattr *attr;
+
+ file = calloc(1, sizeof(*file));
+ if (file == NULL)
+ __archive_errx(1, "Out of memory");
+ file->parent = xar->file;
+ file->mode = 0777 | AE_IFREG;
+ file->atime = time(NULL);
+ file->mtime = time(NULL);
+ xar->file = file;
+ xar->xattr = NULL;
+ for (attr = list->first; attr != NULL; attr = attr->next) {
+ if (strcmp(attr->name, "id") == 0)
+ file->id = atol10(attr->value, strlen(attr->value));
+ }
+ file->nlink = 1;
+ heap_add_entry(&(xar->file_queue), file);
+}
+
+static void
+file_free(struct xar_file *file)
+{
+ struct xattr *xattr;
+
+ archive_string_free(&(file->pathname));
+ archive_string_free(&(file->symlink));
+ archive_string_free(&(file->uname));
+ archive_string_free(&(file->gname));
+ archive_string_free(&(file->hardlink));
+ xattr = file->xattr_list;
+ while (xattr != NULL) {
+ struct xattr *next;
+
+ next = xattr->next;
+ xattr_free(xattr);
+ xattr = next;
+ }
+
+ free(file);
+}
+
+static void
+xattr_new(struct xar *xar, struct xmlattr_list *list)
+{
+ struct xattr *xattr, **nx;
+ struct xmlattr *attr;
+
+ xattr = calloc(1, sizeof(*xattr));
+ if (xattr == NULL)
+ __archive_errx(1, "Out of memory");
+ xar->xattr = xattr;
+ for (attr = list->first; attr != NULL; attr = attr->next) {
+ if (strcmp(attr->name, "id") == 0)
+ xattr->id = atol10(attr->value, strlen(attr->value));
+ }
+ /* Chain to xattr list. */
+ for (nx = &(xar->file->xattr_list);
+ *nx != NULL; nx = &((*nx)->next)) {
+ if (xattr->id < (*nx)->id)
+ break;
+ }
+ xattr->next = *nx;
+ *nx = xattr;
+}
+
+static void
+xattr_free(struct xattr *xattr)
+{
+ archive_string_free(&(xattr->name));
+ free(xattr);
+}
+
+static int
+getencoding(struct xmlattr_list *list)
+{
+ struct xmlattr *attr;
+ enum enctype encoding = NONE;
+
+ for (attr = list->first; attr != NULL; attr = attr->next) {
+ if (strcmp(attr->name, "style") == 0) {
+ if (strcmp(attr->value, "application/octet-stream") == 0)
+ encoding = NONE;
+ else if (strcmp(attr->value, "application/x-gzip") == 0)
+ encoding = GZIP;
+ else if (strcmp(attr->value, "application/x-bzip2") == 0)
+ encoding = BZIP2;
+ else if (strcmp(attr->value, "application/x-lzma") == 0)
+ encoding = LZMA;
+ else if (strcmp(attr->value, "application/x-xz") == 0)
+ encoding = XZ;
+ }
+ }
+ return (encoding);
+}
+
+static int
+getsumalgorithm(struct xmlattr_list *list)
+{
+ struct xmlattr *attr;
+ int alg = CKSUM_NONE;
+
+ for (attr = list->first; attr != NULL; attr = attr->next) {
+ if (strcmp(attr->name, "style") == 0) {
+ const char *v = attr->value;
+ if ((v[0] == 'S' || v[0] == 's') &&
+ (v[1] == 'H' || v[1] == 'h') &&
+ (v[2] == 'A' || v[2] == 'a') &&
+ v[3] == '1' && v[4] == '\0')
+ alg = CKSUM_SHA1;
+ if ((v[0] == 'M' || v[0] == 'm') &&
+ (v[1] == 'D' || v[1] == 'd') &&
+ v[2] == '5' && v[3] == '\0')
+ alg = CKSUM_MD5;
+ }
+ }
+ return (alg);
+}
+
+static void
+unknowntag_start(struct xar *xar, const char *name)
+{
+ struct unknown_tag *tag;
+
+#if DEBUG
+ fprintf(stderr, "unknowntag_start:%s\n", name);
+#endif
+ tag = malloc(sizeof(*tag));
+ if (tag == NULL)
+ __archive_errx(1, "Out of memory");
+ tag->next = xar->unknowntags;
+ archive_string_init(&(tag->name));
+ archive_strcpy(&(tag->name), name);
+ if (xar->unknowntags == NULL) {
+ xar->xmlsts_unknown = xar->xmlsts;
+ xar->xmlsts = UNKNOWN;
+ }
+ xar->unknowntags = tag;
+}
+
+static void
+unknowntag_end(struct xar *xar, const char *name)
+{
+ struct unknown_tag *tag;
+
+#if DEBUG
+ fprintf(stderr, "unknowntag_end:%s\n", name);
+#endif
+ tag = xar->unknowntags;
+ if (tag == NULL || name == NULL)
+ return;
+ if (strcmp(tag->name.s, name) == 0) {
+ xar->unknowntags = tag->next;
+ archive_string_free(&(tag->name));
+ free(tag);
+ if (xar->unknowntags == NULL)
+ xar->xmlsts = xar->xmlsts_unknown;
+ }
+}
+
+static void
+xml_start(void *userData, const char *name, struct xmlattr_list *list)
+{
+ struct archive_read *a;
+ struct xar *xar;
+ struct xmlattr *attr;
+
+ a = (struct archive_read *)userData;
+ xar = (struct xar *)(a->format->data);
+
+#if DEBUG
+ fprintf(stderr, "xml_sta:[%s]\n", name);
+ for (attr = list->first; attr != NULL; attr = attr->next)
+ fprintf(stderr, " attr:\"%s\"=\"%s\"\n",
+ attr->name, attr->value);
+#endif
+ xar->base64text = 0;
+ switch (xar->xmlsts) {
+ case INIT:
+ if (strcmp(name, "xar") == 0)
+ xar->xmlsts = XAR;
+ else
+ unknowntag_start(xar, name);
+ break;
+ case XAR:
+ if (strcmp(name, "toc") == 0)
+ xar->xmlsts = TOC;
+ else
+ unknowntag_start(xar, name);
+ break;
+ case TOC:
+ if (strcmp(name, "creation-time") == 0)
+ xar->xmlsts = TOC_CREATION_TIME;
+ else if (strcmp(name, "checksum") == 0)
+ xar->xmlsts = TOC_CHECKSUM;
+ else if (strcmp(name, "file") == 0) {
+ file_new(xar, list);
+ xar->xmlsts = TOC_FILE;
+ }
+ else
+ unknowntag_start(xar, name);
+ break;
+ case TOC_CHECKSUM:
+ if (strcmp(name, "offset") == 0)
+ xar->xmlsts = TOC_CHECKSUM_OFFSET;
+ else if (strcmp(name, "size") == 0)
+ xar->xmlsts = TOC_CHECKSUM_SIZE;
+ else
+ unknowntag_start(xar, name);
+ break;
+ case TOC_FILE:
+ if (strcmp(name, "file") == 0) {
+ file_new(xar, list);
+ }
+ else if (strcmp(name, "data") == 0)
+ xar->xmlsts = FILE_DATA;
+ else if (strcmp(name, "ea") == 0) {
+ xattr_new(xar, list);
+ xar->xmlsts = FILE_EA;
+ }
+ else if (strcmp(name, "ctime") == 0)
+ xar->xmlsts = FILE_CTIME;
+ else if (strcmp(name, "mtime") == 0)
+ xar->xmlsts = FILE_MTIME;
+ else if (strcmp(name, "atime") == 0)
+ xar->xmlsts = FILE_ATIME;
+ else if (strcmp(name, "group") == 0)
+ xar->xmlsts = FILE_GROUP;
+ else if (strcmp(name, "gid") == 0)
+ xar->xmlsts = FILE_GID;
+ else if (strcmp(name, "user") == 0)
+ xar->xmlsts = FILE_USER;
+ else if (strcmp(name, "uid") == 0)
+ xar->xmlsts = FILE_UID;
+ else if (strcmp(name, "mode") == 0)
+ xar->xmlsts = FILE_MODE;
+ else if (strcmp(name, "device") == 0)
+ xar->xmlsts = FILE_DEVICE;
+ else if (strcmp(name, "deviceno") == 0)
+ xar->xmlsts = FILE_DEVICENO;
+ else if (strcmp(name, "inode") == 0)
+ xar->xmlsts = FILE_INODE;
+ else if (strcmp(name, "link") == 0)
+ xar->xmlsts = FILE_LINK;
+ else if (strcmp(name, "type") == 0) {
+ xar->xmlsts = FILE_TYPE;
+ for (attr = list->first; attr != NULL;
+ attr = attr->next) {
+ if (strcmp(attr->name, "link") != 0)
+ continue;
+ if (strcmp(attr->value, "original") == 0) {
+ xar->file->hdnext = xar->hdlink_orgs;
+ xar->hdlink_orgs = xar->file;
+ } else {
+ xar->file->link = atol10(attr->value,
+ strlen(attr->value));
+ if (xar->file->link > 0)
+ add_link(xar, xar->file);
+ }
+ }
+ }
+ else if (strcmp(name, "name") == 0) {
+ xar->xmlsts = FILE_NAME;
+ for (attr = list->first; attr != NULL;
+ attr = attr->next) {
+ if (strcmp(attr->name, "enctype") == 0 &&
+ strcmp(attr->value, "base64") == 0)
+ xar->base64text = 1;
+ }
+ }
+ else if (strcmp(name, "acl") == 0)
+ xar->xmlsts = FILE_ACL;
+ else if (strcmp(name, "flags") == 0)
+ xar->xmlsts = FILE_FLAGS;
+ else if (strcmp(name, "ext2") == 0)
+ xar->xmlsts = FILE_EXT2;
+ else
+ unknowntag_start(xar, name);
+ break;
+ case FILE_DATA:
+ if (strcmp(name, "length") == 0)
+ xar->xmlsts = FILE_DATA_LENGTH;
+ else if (strcmp(name, "offset") == 0)
+ xar->xmlsts = FILE_DATA_OFFSET;
+ else if (strcmp(name, "size") == 0)
+ xar->xmlsts = FILE_DATA_SIZE;
+ else if (strcmp(name, "encoding") == 0) {
+ xar->xmlsts = FILE_DATA_ENCODING;
+ xar->file->encoding = getencoding(list);
+ }
+ else if (strcmp(name, "archived-checksum") == 0) {
+ xar->xmlsts = FILE_DATA_A_CHECKSUM;
+ xar->file->a_sum.alg = getsumalgorithm(list);
+ }
+ else if (strcmp(name, "extracted-checksum") == 0) {
+ xar->xmlsts = FILE_DATA_E_CHECKSUM;
+ xar->file->e_sum.alg = getsumalgorithm(list);
+ }
+ else if (strcmp(name, "content") == 0)
+ xar->xmlsts = FILE_DATA_CONTENT;
+ else
+ unknowntag_start(xar, name);
+ break;
+ case FILE_DEVICE:
+ if (strcmp(name, "major") == 0)
+ xar->xmlsts = FILE_DEVICE_MAJOR;
+ else if (strcmp(name, "minor") == 0)
+ xar->xmlsts = FILE_DEVICE_MINOR;
+ else
+ unknowntag_start(xar, name);
+ break;
+ case FILE_DATA_CONTENT:
+ unknowntag_start(xar, name);
+ break;
+ case FILE_EA:
+ if (strcmp(name, "length") == 0)
+ xar->xmlsts = FILE_EA_LENGTH;
+ else if (strcmp(name, "offset") == 0)
+ xar->xmlsts = FILE_EA_OFFSET;
+ else if (strcmp(name, "size") == 0)
+ xar->xmlsts = FILE_EA_SIZE;
+ else if (strcmp(name, "encoding") == 0) {
+ xar->xmlsts = FILE_EA_ENCODING;
+ xar->xattr->encoding = getencoding(list);
+ } else if (strcmp(name, "archived-checksum") == 0)
+ xar->xmlsts = FILE_EA_A_CHECKSUM;
+ else if (strcmp(name, "extracted-checksum") == 0)
+ xar->xmlsts = FILE_EA_E_CHECKSUM;
+ else if (strcmp(name, "name") == 0)
+ xar->xmlsts = FILE_EA_NAME;
+ else if (strcmp(name, "fstype") == 0)
+ xar->xmlsts = FILE_EA_FSTYPE;
+ else
+ unknowntag_start(xar, name);
+ break;
+ case FILE_ACL:
+ if (strcmp(name, "appleextended") == 0)
+ xar->xmlsts = FILE_ACL_APPLEEXTENDED;
+ if (strcmp(name, "default") == 0)
+ xar->xmlsts = FILE_ACL_DEFAULT;
+ else if (strcmp(name, "access") == 0)
+ xar->xmlsts = FILE_ACL_ACCESS;
+ else
+ unknowntag_start(xar, name);
+ break;
+ case FILE_FLAGS:
+ if (!xml_parse_file_flags(xar, name))
+ unknowntag_start(xar, name);
+ break;
+ case FILE_EXT2:
+ if (!xml_parse_file_ext2(xar, name))
+ unknowntag_start(xar, name);
+ break;
+ case TOC_CREATION_TIME:
+ case TOC_CHECKSUM_OFFSET:
+ case TOC_CHECKSUM_SIZE:
+ case FILE_DATA_LENGTH:
+ case FILE_DATA_OFFSET:
+ case FILE_DATA_SIZE:
+ case FILE_DATA_ENCODING:
+ case FILE_DATA_A_CHECKSUM:
+ case FILE_DATA_E_CHECKSUM:
+ case FILE_EA_LENGTH:
+ case FILE_EA_OFFSET:
+ case FILE_EA_SIZE:
+ case FILE_EA_ENCODING:
+ case FILE_EA_A_CHECKSUM:
+ case FILE_EA_E_CHECKSUM:
+ case FILE_EA_NAME:
+ case FILE_EA_FSTYPE:
+ case FILE_CTIME:
+ case FILE_MTIME:
+ case FILE_ATIME:
+ case FILE_GROUP:
+ case FILE_GID:
+ case FILE_USER:
+ case FILE_UID:
+ case FILE_INODE:
+ case FILE_DEVICE_MAJOR:
+ case FILE_DEVICE_MINOR:
+ case FILE_DEVICENO:
+ case FILE_MODE:
+ case FILE_TYPE:
+ case FILE_LINK:
+ case FILE_NAME:
+ case FILE_ACL_DEFAULT:
+ case FILE_ACL_ACCESS:
+ case FILE_ACL_APPLEEXTENDED:
+ case FILE_FLAGS_USER_NODUMP:
+ case FILE_FLAGS_USER_IMMUTABLE:
+ case FILE_FLAGS_USER_APPEND:
+ case FILE_FLAGS_USER_OPAQUE:
+ case FILE_FLAGS_USER_NOUNLINK:
+ case FILE_FLAGS_SYS_ARCHIVED:
+ case FILE_FLAGS_SYS_IMMUTABLE:
+ case FILE_FLAGS_SYS_APPEND:
+ case FILE_FLAGS_SYS_NOUNLINK:
+ case FILE_FLAGS_SYS_SNAPSHOT:
+ case FILE_EXT2_SecureDeletion:
+ case FILE_EXT2_Undelete:
+ case FILE_EXT2_Compress:
+ case FILE_EXT2_Synchronous:
+ case FILE_EXT2_Immutable:
+ case FILE_EXT2_AppendOnly:
+ case FILE_EXT2_NoDump:
+ case FILE_EXT2_NoAtime:
+ case FILE_EXT2_CompDirty:
+ case FILE_EXT2_CompBlock:
+ case FILE_EXT2_NoCompBlock:
+ case FILE_EXT2_CompError:
+ case FILE_EXT2_BTree:
+ case FILE_EXT2_HashIndexed:
+ case FILE_EXT2_iMagic:
+ case FILE_EXT2_Journaled:
+ case FILE_EXT2_NoTail:
+ case FILE_EXT2_DirSync:
+ case FILE_EXT2_TopDir:
+ case FILE_EXT2_Reserved:
+ case UNKNOWN:
+ unknowntag_start(xar, name);
+ break;
+ }
+}
+
+static void
+xml_end(void *userData, const char *name)
+{
+ struct archive_read *a;
+ struct xar *xar;
+
+ a = (struct archive_read *)userData;
+ xar = (struct xar *)(a->format->data);
+
+#if DEBUG
+ fprintf(stderr, "xml_end:[%s]\n", name);
+#endif
+ switch (xar->xmlsts) {
+ case INIT:
+ break;
+ case XAR:
+ if (strcmp(name, "xar") == 0)
+ xar->xmlsts = INIT;
+ break;
+ case TOC:
+ if (strcmp(name, "toc") == 0)
+ xar->xmlsts = XAR;
+ break;
+ case TOC_CREATION_TIME:
+ if (strcmp(name, "creation-time") == 0)
+ xar->xmlsts = TOC;
+ break;
+ case TOC_CHECKSUM:
+ if (strcmp(name, "checksum") == 0)
+ xar->xmlsts = TOC;
+ break;
+ case TOC_CHECKSUM_OFFSET:
+ if (strcmp(name, "offset") == 0)
+ xar->xmlsts = TOC_CHECKSUM;
+ break;
+ case TOC_CHECKSUM_SIZE:
+ if (strcmp(name, "size") == 0)
+ xar->xmlsts = TOC_CHECKSUM;
+ break;
+ case TOC_FILE:
+ if (strcmp(name, "file") == 0) {
+ if (xar->file->parent != NULL &&
+ ((xar->file->mode & AE_IFMT) == AE_IFDIR))
+ xar->file->parent->subdirs++;
+ xar->file = xar->file->parent;
+ if (xar->file == NULL)
+ xar->xmlsts = TOC;
+ }
+ break;
+ case FILE_DATA:
+ if (strcmp(name, "data") == 0)
+ xar->xmlsts = TOC_FILE;
+ break;
+ case FILE_DATA_LENGTH:
+ if (strcmp(name, "length") == 0)
+ xar->xmlsts = FILE_DATA;
+ break;
+ case FILE_DATA_OFFSET:
+ if (strcmp(name, "offset") == 0)
+ xar->xmlsts = FILE_DATA;
+ break;
+ case FILE_DATA_SIZE:
+ if (strcmp(name, "size") == 0)
+ xar->xmlsts = FILE_DATA;
+ break;
+ case FILE_DATA_ENCODING:
+ if (strcmp(name, "encoding") == 0)
+ xar->xmlsts = FILE_DATA;
+ break;
+ case FILE_DATA_A_CHECKSUM:
+ if (strcmp(name, "archived-checksum") == 0)
+ xar->xmlsts = FILE_DATA;
+ break;
+ case FILE_DATA_E_CHECKSUM:
+ if (strcmp(name, "extracted-checksum") == 0)
+ xar->xmlsts = FILE_DATA;
+ break;
+ case FILE_DATA_CONTENT:
+ if (strcmp(name, "content") == 0)
+ xar->xmlsts = FILE_DATA;
+ break;
+ case FILE_EA:
+ if (strcmp(name, "ea") == 0) {
+ xar->xmlsts = TOC_FILE;
+ xar->xattr = NULL;
+ }
+ break;
+ case FILE_EA_LENGTH:
+ if (strcmp(name, "length") == 0)
+ xar->xmlsts = FILE_EA;
+ break;
+ case FILE_EA_OFFSET:
+ if (strcmp(name, "offset") == 0)
+ xar->xmlsts = FILE_EA;
+ break;
+ case FILE_EA_SIZE:
+ if (strcmp(name, "size") == 0)
+ xar->xmlsts = FILE_EA;
+ break;
+ case FILE_EA_ENCODING:
+ if (strcmp(name, "encoding") == 0)
+ xar->xmlsts = FILE_EA;
+ break;
+ case FILE_EA_A_CHECKSUM:
+ if (strcmp(name, "archived-checksum") == 0)
+ xar->xmlsts = FILE_EA;
+ break;
+ case FILE_EA_E_CHECKSUM:
+ if (strcmp(name, "extracted-checksum") == 0)
+ xar->xmlsts = FILE_EA;
+ break;
+ case FILE_EA_NAME:
+ if (strcmp(name, "name") == 0)
+ xar->xmlsts = FILE_EA;
+ break;
+ case FILE_EA_FSTYPE:
+ if (strcmp(name, "fstype") == 0)
+ xar->xmlsts = FILE_EA;
+ break;
+ case FILE_CTIME:
+ if (strcmp(name, "ctime") == 0)
+ xar->xmlsts = TOC_FILE;
+ break;
+ case FILE_MTIME:
+ if (strcmp(name, "mtime") == 0)
+ xar->xmlsts = TOC_FILE;
+ break;
+ case FILE_ATIME:
+ if (strcmp(name, "atime") == 0)
+ xar->xmlsts = TOC_FILE;
+ break;
+ case FILE_GROUP:
+ if (strcmp(name, "group") == 0)
+ xar->xmlsts = TOC_FILE;
+ break;
+ case FILE_GID:
+ if (strcmp(name, "gid") == 0)
+ xar->xmlsts = TOC_FILE;
+ break;
+ case FILE_USER:
+ if (strcmp(name, "user") == 0)
+ xar->xmlsts = TOC_FILE;
+ break;
+ case FILE_UID:
+ if (strcmp(name, "uid") == 0)
+ xar->xmlsts = TOC_FILE;
+ break;
+ case FILE_MODE:
+ if (strcmp(name, "mode") == 0)
+ xar->xmlsts = TOC_FILE;
+ break;
+ case FILE_DEVICE:
+ if (strcmp(name, "device") == 0)
+ xar->xmlsts = TOC_FILE;
+ break;
+ case FILE_DEVICE_MAJOR:
+ if (strcmp(name, "major") == 0)
+ xar->xmlsts = FILE_DEVICE;
+ break;
+ case FILE_DEVICE_MINOR:
+ if (strcmp(name, "minor") == 0)
+ xar->xmlsts = FILE_DEVICE;
+ break;
+ case FILE_DEVICENO:
+ if (strcmp(name, "deviceno") == 0)
+ xar->xmlsts = TOC_FILE;
+ break;
+ case FILE_INODE:
+ if (strcmp(name, "inode") == 0)
+ xar->xmlsts = TOC_FILE;
+ break;
+ case FILE_LINK:
+ if (strcmp(name, "link") == 0)
+ xar->xmlsts = TOC_FILE;
+ break;
+ case FILE_TYPE:
+ if (strcmp(name, "type") == 0)
+ xar->xmlsts = TOC_FILE;
+ break;
+ case FILE_NAME:
+ if (strcmp(name, "name") == 0)
+ xar->xmlsts = TOC_FILE;
+ break;
+ case FILE_ACL:
+ if (strcmp(name, "acl") == 0)
+ xar->xmlsts = TOC_FILE;
+ break;
+ case FILE_ACL_DEFAULT:
+ if (strcmp(name, "default") == 0)
+ xar->xmlsts = FILE_ACL;
+ break;
+ case FILE_ACL_ACCESS:
+ if (strcmp(name, "access") == 0)
+ xar->xmlsts = FILE_ACL;
+ break;
+ case FILE_ACL_APPLEEXTENDED:
+ if (strcmp(name, "appleextended") == 0)
+ xar->xmlsts = FILE_ACL;
+ break;
+ case FILE_FLAGS:
+ if (strcmp(name, "flags") == 0)
+ xar->xmlsts = TOC_FILE;
+ break;
+ case FILE_FLAGS_USER_NODUMP:
+ if (strcmp(name, "UserNoDump") == 0)
+ xar->xmlsts = FILE_FLAGS;
+ break;
+ case FILE_FLAGS_USER_IMMUTABLE:
+ if (strcmp(name, "UserImmutable") == 0)
+ xar->xmlsts = FILE_FLAGS;
+ break;
+ case FILE_FLAGS_USER_APPEND:
+ if (strcmp(name, "UserAppend") == 0)
+ xar->xmlsts = FILE_FLAGS;
+ break;
+ case FILE_FLAGS_USER_OPAQUE:
+ if (strcmp(name, "UserOpaque") == 0)
+ xar->xmlsts = FILE_FLAGS;
+ break;
+ case FILE_FLAGS_USER_NOUNLINK:
+ if (strcmp(name, "UserNoUnlink") == 0)
+ xar->xmlsts = FILE_FLAGS;
+ break;
+ case FILE_FLAGS_SYS_ARCHIVED:
+ if (strcmp(name, "SystemArchived") == 0)
+ xar->xmlsts = FILE_FLAGS;
+ break;
+ case FILE_FLAGS_SYS_IMMUTABLE:
+ if (strcmp(name, "SystemImmutable") == 0)
+ xar->xmlsts = FILE_FLAGS;
+ break;
+ case FILE_FLAGS_SYS_APPEND:
+ if (strcmp(name, "SystemAppend") == 0)
+ xar->xmlsts = FILE_FLAGS;
+ break;
+ case FILE_FLAGS_SYS_NOUNLINK:
+ if (strcmp(name, "SystemNoUnlink") == 0)
+ xar->xmlsts = FILE_FLAGS;
+ break;
+ case FILE_FLAGS_SYS_SNAPSHOT:
+ if (strcmp(name, "SystemSnapshot") == 0)
+ xar->xmlsts = FILE_FLAGS;
+ break;
+ case FILE_EXT2:
+ if (strcmp(name, "ext2") == 0)
+ xar->xmlsts = TOC_FILE;
+ break;
+ case FILE_EXT2_SecureDeletion:
+ if (strcmp(name, "SecureDeletion") == 0)
+ xar->xmlsts = FILE_EXT2;
+ break;
+ case FILE_EXT2_Undelete:
+ if (strcmp(name, "Undelete") == 0)
+ xar->xmlsts = FILE_EXT2;
+ break;
+ case FILE_EXT2_Compress:
+ if (strcmp(name, "Compress") == 0)
+ xar->xmlsts = FILE_EXT2;
+ break;
+ case FILE_EXT2_Synchronous:
+ if (strcmp(name, "Synchronous") == 0)
+ xar->xmlsts = FILE_EXT2;
+ break;
+ case FILE_EXT2_Immutable:
+ if (strcmp(name, "Immutable") == 0)
+ xar->xmlsts = FILE_EXT2;
+ break;
+ case FILE_EXT2_AppendOnly:
+ if (strcmp(name, "AppendOnly") == 0)
+ xar->xmlsts = FILE_EXT2;
+ break;
+ case FILE_EXT2_NoDump:
+ if (strcmp(name, "NoDump") == 0)
+ xar->xmlsts = FILE_EXT2;
+ break;
+ case FILE_EXT2_NoAtime:
+ if (strcmp(name, "NoAtime") == 0)
+ xar->xmlsts = FILE_EXT2;
+ break;
+ case FILE_EXT2_CompDirty:
+ if (strcmp(name, "CompDirty") == 0)
+ xar->xmlsts = FILE_EXT2;
+ break;
+ case FILE_EXT2_CompBlock:
+ if (strcmp(name, "CompBlock") == 0)
+ xar->xmlsts = FILE_EXT2;
+ break;
+ case FILE_EXT2_NoCompBlock:
+ if (strcmp(name, "NoCompBlock") == 0)
+ xar->xmlsts = FILE_EXT2;
+ break;
+ case FILE_EXT2_CompError:
+ if (strcmp(name, "CompError") == 0)
+ xar->xmlsts = FILE_EXT2;
+ break;
+ case FILE_EXT2_BTree:
+ if (strcmp(name, "BTree") == 0)
+ xar->xmlsts = FILE_EXT2;
+ break;
+ case FILE_EXT2_HashIndexed:
+ if (strcmp(name, "HashIndexed") == 0)
+ xar->xmlsts = FILE_EXT2;
+ break;
+ case FILE_EXT2_iMagic:
+ if (strcmp(name, "iMagic") == 0)
+ xar->xmlsts = FILE_EXT2;
+ break;
+ case FILE_EXT2_Journaled:
+ if (strcmp(name, "Journaled") == 0)
+ xar->xmlsts = FILE_EXT2;
+ break;
+ case FILE_EXT2_NoTail:
+ if (strcmp(name, "NoTail") == 0)
+ xar->xmlsts = FILE_EXT2;
+ break;
+ case FILE_EXT2_DirSync:
+ if (strcmp(name, "DirSync") == 0)
+ xar->xmlsts = FILE_EXT2;
+ break;
+ case FILE_EXT2_TopDir:
+ if (strcmp(name, "TopDir") == 0)
+ xar->xmlsts = FILE_EXT2;
+ break;
+ case FILE_EXT2_Reserved:
+ if (strcmp(name, "Reserved") == 0)
+ xar->xmlsts = FILE_EXT2;
+ break;
+ case UNKNOWN:
+ unknowntag_end(xar, name);
+ break;
+ }
+}
+
+static const int base64[256] = {
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, /* 00 - 0F */
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, /* 10 - 1F */
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, 62, -1, -1, -1, 63, /* 20 - 2F */
+ 52, 53, 54, 55, 56, 57, 58, 59,
+ 60, 61, -1, -1, -1, -1, -1, -1, /* 30 - 3F */
+ -1, 0, 1, 2, 3, 4, 5, 6,
+ 7, 8, 9, 10, 11, 12, 13, 14, /* 40 - 4F */
+ 15, 16, 17, 18, 19, 20, 21, 22,
+ 23, 24, 25, -1, -1, -1, -1, -1, /* 50 - 5F */
+ -1, 26, 27, 28, 29, 30, 31, 32,
+ 33, 34, 35, 36, 37, 38, 39, 40, /* 60 - 6F */
+ 41, 42, 43, 44, 45, 46, 47, 48,
+ 49, 50, 51, -1, -1, -1, -1, -1, /* 70 - 7F */
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, /* 80 - 8F */
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, /* 90 - 9F */
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, /* A0 - AF */
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, /* B0 - BF */
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, /* C0 - CF */
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, /* D0 - DF */
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, /* E0 - EF */
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, /* F0 - FF */
+};
+
+static void
+strappend_base64(struct archive_string *as, const char *s, size_t l)
+{
+ unsigned char buff[256];
+ unsigned char *out;
+ const unsigned char *b;
+ size_t len;
+
+ len = 0;
+ out = buff;
+ b = (const unsigned char *)s;
+ while (l > 0) {
+ int n = 0;
+
+ if (l > 0) {
+ if (base64[b[0]] < 0 || base64[b[1]] < 0)
+ break;
+ n = base64[*b++] << 18;
+ n |= base64[*b++] << 12;
+ *out++ = n >> 16;
+ len++;
+ l -= 2;
+ }
+ if (l > 0) {
+ if (base64[*b] < 0)
+ break;
+ n |= base64[*b++] << 6;
+ *out++ = (n >> 8) & 0xFF;
+ len++;
+ --l;
+ }
+ if (l > 0) {
+ if (base64[*b] < 0)
+ break;
+ n |= base64[*b++];
+ *out++ = n & 0xFF;
+ len++;
+ --l;
+ }
+ if (len+3 >= sizeof(buff)) {
+ archive_strncat(as, (const char *)buff, len);
+ len = 0;
+ out = buff;
+ }
+ }
+ if (len > 0)
+ archive_strncat(as, (const char *)buff, len);
+}
+
+static void
+xml_data(void *userData, const char *s, int len)
+{
+ struct archive_read *a;
+ struct xar *xar;
+
+ a = (struct archive_read *)userData;
+ xar = (struct xar *)(a->format->data);
+
+#if DEBUG
+ {
+ char buff[1024];
+ if (len > (int)sizeof(buff)-1)
+ len = (int)sizeof(buff)-1;
+ memcpy(buff, s, len);
+ buff[len] = 0;
+ fprintf(stderr, "\tlen=%d:\"%s\"\n", len, buff);
+ }
+#endif
+ switch (xar->xmlsts) {
+ case TOC_CHECKSUM_OFFSET:
+ xar->toc_chksum_offset = atol10(s, len);
+ break;
+ case TOC_CHECKSUM_SIZE:
+ xar->toc_chksum_size = atol10(s, len);
+ break;
+ default:
+ break;
+ }
+ if (xar->file == NULL)
+ return;
+
+ switch (xar->xmlsts) {
+ case FILE_NAME:
+ if (xar->file->parent != NULL) {
+ archive_string_concat(&(xar->file->pathname),
+ &(xar->file->parent->pathname));
+ archive_strappend_char(&(xar->file->pathname), '/');
+ }
+ xar->file->has |= HAS_PATHNAME;
+ if (xar->base64text)
+ strappend_base64(&(xar->file->pathname), s, len);
+ else
+ archive_strncat(&(xar->file->pathname), s, len);
+ break;
+ case FILE_LINK:
+ xar->file->has |= HAS_SYMLINK;
+ archive_strncpy(&(xar->file->symlink), s, len);
+ break;
+ case FILE_TYPE:
+ if (strncmp("file", s, len) == 0 ||
+ strncmp("hardlink", s, len) == 0)
+ xar->file->mode =
+ (xar->file->mode & ~AE_IFMT) | AE_IFREG;
+ if (strncmp("directory", s, len) == 0)
+ xar->file->mode =
+ (xar->file->mode & ~AE_IFMT) | AE_IFDIR;
+ if (strncmp("symlink", s, len) == 0)
+ xar->file->mode =
+ (xar->file->mode & ~AE_IFMT) | AE_IFLNK;
+ if (strncmp("character special", s, len) == 0)
+ xar->file->mode =
+ (xar->file->mode & ~AE_IFMT) | AE_IFCHR;
+ if (strncmp("block special", s, len) == 0)
+ xar->file->mode =
+ (xar->file->mode & ~AE_IFMT) | AE_IFBLK;
+ if (strncmp("socket", s, len) == 0)
+ xar->file->mode =
+ (xar->file->mode & ~AE_IFMT) | AE_IFSOCK;
+ if (strncmp("fifo", s, len) == 0)
+ xar->file->mode =
+ (xar->file->mode & ~AE_IFMT) | AE_IFIFO;
+ xar->file->has |= HAS_TYPE;
+ break;
+ case FILE_INODE:
+ xar->file->has |= HAS_INO;
+ xar->file->ino64 = atol10(s, len);
+ break;
+ case FILE_DEVICE_MAJOR:
+ xar->file->has |= HAS_DEVMAJOR;
+ xar->file->devmajor = (dev_t)atol10(s, len);
+ break;
+ case FILE_DEVICE_MINOR:
+ xar->file->has |= HAS_DEVMINOR;
+ xar->file->devminor = (dev_t)atol10(s, len);
+ break;
+ case FILE_DEVICENO:
+ xar->file->has |= HAS_DEV;
+ xar->file->dev = (dev_t)atol10(s, len);
+ break;
+ case FILE_MODE:
+ xar->file->has |= HAS_MODE;
+ xar->file->mode =
+ (xar->file->mode & AE_IFMT) |
+ (atol8(s, len) & ~AE_IFMT);
+ break;
+ case FILE_GROUP:
+ xar->file->has |= HAS_GID;
+ archive_strncpy(&(xar->file->gname), s, len);
+ break;
+ case FILE_GID:
+ xar->file->has |= HAS_GID;
+ xar->file->gid = atol10(s, len);
+ break;
+ case FILE_USER:
+ xar->file->has |= HAS_UID;
+ archive_strncpy(&(xar->file->uname), s, len);
+ break;
+ case FILE_UID:
+ xar->file->has |= HAS_UID;
+ xar->file->uid = atol10(s, len);
+ break;
+ case FILE_CTIME:
+ xar->file->has |= HAS_TIME;
+ xar->file->ctime = parse_time(s, len);
+ break;
+ case FILE_MTIME:
+ xar->file->has |= HAS_TIME;
+ xar->file->mtime = parse_time(s, len);
+ break;
+ case FILE_ATIME:
+ xar->file->has |= HAS_TIME;
+ xar->file->atime = parse_time(s, len);
+ break;
+ case FILE_DATA_LENGTH:
+ xar->file->has |= HAS_DATA;
+ xar->file->length = atol10(s, len);
+ break;
+ case FILE_DATA_OFFSET:
+ xar->file->has |= HAS_DATA;
+ xar->file->offset = atol10(s, len);
+ break;
+ case FILE_DATA_SIZE:
+ xar->file->has |= HAS_DATA;
+ xar->file->size = atol10(s, len);
+ break;
+ case FILE_DATA_A_CHECKSUM:
+ xar->file->a_sum.len = atohex(xar->file->a_sum.val,
+ sizeof(xar->file->a_sum.val), s, len);
+ break;
+ case FILE_DATA_E_CHECKSUM:
+ xar->file->e_sum.len = atohex(xar->file->e_sum.val,
+ sizeof(xar->file->e_sum.val), s, len);
+ break;
+ case FILE_EA_LENGTH:
+ xar->file->has |= HAS_XATTR;
+ xar->xattr->length = atol10(s, len);
+ break;
+ case FILE_EA_OFFSET:
+ xar->file->has |= HAS_XATTR;
+ xar->xattr->offset = atol10(s, len);
+ break;
+ case FILE_EA_SIZE:
+ xar->file->has |= HAS_XATTR;
+ xar->xattr->size = atol10(s, len);
+ break;
+ case FILE_EA_A_CHECKSUM:
+ xar->file->has |= HAS_XATTR;
+ xar->xattr->a_sum.len = atohex(xar->xattr->a_sum.val,
+ sizeof(xar->xattr->a_sum.val), s, len);
+ break;
+ case FILE_EA_E_CHECKSUM:
+ xar->file->has |= HAS_XATTR;
+ xar->xattr->e_sum.len = atohex(xar->xattr->e_sum.val,
+ sizeof(xar->xattr->e_sum.val), s, len);
+ break;
+ case FILE_EA_NAME:
+ xar->file->has |= HAS_XATTR;
+ archive_strncpy(&(xar->xattr->name), s, len);
+ break;
+ case FILE_EA_FSTYPE:
+ xar->file->has |= HAS_XATTR;
+ archive_strncpy(&(xar->xattr->fstype), s, len);
+ break;
+ break;
+ case FILE_ACL_DEFAULT:
+ case FILE_ACL_ACCESS:
+ case FILE_ACL_APPLEEXTENDED:
+ xar->file->has |= HAS_ACL;
+ /* TODO */
+ break;
+ case INIT:
+ case XAR:
+ case TOC:
+ case TOC_CREATION_TIME:
+ case TOC_CHECKSUM:
+ case TOC_CHECKSUM_OFFSET:
+ case TOC_CHECKSUM_SIZE:
+ case TOC_FILE:
+ case FILE_DATA:
+ case FILE_DATA_ENCODING:
+ case FILE_DATA_CONTENT:
+ case FILE_DEVICE:
+ case FILE_EA:
+ case FILE_EA_ENCODING:
+ case FILE_ACL:
+ case FILE_FLAGS:
+ case FILE_FLAGS_USER_NODUMP:
+ case FILE_FLAGS_USER_IMMUTABLE:
+ case FILE_FLAGS_USER_APPEND:
+ case FILE_FLAGS_USER_OPAQUE:
+ case FILE_FLAGS_USER_NOUNLINK:
+ case FILE_FLAGS_SYS_ARCHIVED:
+ case FILE_FLAGS_SYS_IMMUTABLE:
+ case FILE_FLAGS_SYS_APPEND:
+ case FILE_FLAGS_SYS_NOUNLINK:
+ case FILE_FLAGS_SYS_SNAPSHOT:
+ case FILE_EXT2:
+ case FILE_EXT2_SecureDeletion:
+ case FILE_EXT2_Undelete:
+ case FILE_EXT2_Compress:
+ case FILE_EXT2_Synchronous:
+ case FILE_EXT2_Immutable:
+ case FILE_EXT2_AppendOnly:
+ case FILE_EXT2_NoDump:
+ case FILE_EXT2_NoAtime:
+ case FILE_EXT2_CompDirty:
+ case FILE_EXT2_CompBlock:
+ case FILE_EXT2_NoCompBlock:
+ case FILE_EXT2_CompError:
+ case FILE_EXT2_BTree:
+ case FILE_EXT2_HashIndexed:
+ case FILE_EXT2_iMagic:
+ case FILE_EXT2_Journaled:
+ case FILE_EXT2_NoTail:
+ case FILE_EXT2_DirSync:
+ case FILE_EXT2_TopDir:
+ case FILE_EXT2_Reserved:
+ case UNKNOWN:
+ break;
+ }
+}
+
+/*
+ * BSD file flags.
+ */
+static int
+xml_parse_file_flags(struct xar *xar, const char *name)
+{
+ const char *flag = NULL;
+
+ if (strcmp(name, "UserNoDump") == 0) {
+ xar->xmlsts = FILE_FLAGS_USER_NODUMP;
+ flag = "nodump";
+ }
+ else if (strcmp(name, "UserImmutable") == 0) {
+ xar->xmlsts = FILE_FLAGS_USER_IMMUTABLE;
+ flag = "uimmutable";
+ }
+ else if (strcmp(name, "UserAppend") == 0) {
+ xar->xmlsts = FILE_FLAGS_USER_APPEND;
+ flag = "uappend";
+ }
+ else if (strcmp(name, "UserOpaque") == 0) {
+ xar->xmlsts = FILE_FLAGS_USER_OPAQUE;
+ flag = "opaque";
+ }
+ else if (strcmp(name, "UserNoUnlink") == 0) {
+ xar->xmlsts = FILE_FLAGS_USER_NOUNLINK;
+ flag = "nouunlink";
+ }
+ else if (strcmp(name, "SystemArchived") == 0) {
+ xar->xmlsts = FILE_FLAGS_SYS_ARCHIVED;
+ flag = "archived";
+ }
+ else if (strcmp(name, "SystemImmutable") == 0) {
+ xar->xmlsts = FILE_FLAGS_SYS_IMMUTABLE;
+ flag = "simmutable";
+ }
+ else if (strcmp(name, "SystemAppend") == 0) {
+ xar->xmlsts = FILE_FLAGS_SYS_APPEND;
+ flag = "sappend";
+ }
+ else if (strcmp(name, "SystemNoUnlink") == 0) {
+ xar->xmlsts = FILE_FLAGS_SYS_NOUNLINK;
+ flag = "nosunlink";
+ }
+ else if (strcmp(name, "SystemSnapshot") == 0) {
+ xar->xmlsts = FILE_FLAGS_SYS_SNAPSHOT;
+ flag = "snapshot";
+ }
+
+ if (flag == NULL)
+ return (0);
+ xar->file->has |= HAS_FFLAGS;
+ if (archive_strlen(&(xar->file->fflags_text)) > 0)
+ archive_strappend_char(&(xar->file->fflags_text), ',');
+ archive_strcat(&(xar->file->fflags_text), flag);
+ return (1);
+}
+
+/*
+ * Linux file flags.
+ */
+static int
+xml_parse_file_ext2(struct xar *xar, const char *name)
+{
+ const char *flag = NULL;
+
+ if (strcmp(name, "SecureDeletion") == 0) {
+ xar->xmlsts = FILE_EXT2_SecureDeletion;
+ flag = "securedeletion";
+ }
+ else if (strcmp(name, "Undelete") == 0) {
+ xar->xmlsts = FILE_EXT2_Undelete;
+ flag = "nouunlink";
+ }
+ else if (strcmp(name, "Compress") == 0) {
+ xar->xmlsts = FILE_EXT2_Compress;
+ flag = "compress";
+ }
+ else if (strcmp(name, "Synchronous") == 0) {
+ xar->xmlsts = FILE_EXT2_Synchronous;
+ flag = "sync";
+ }
+ else if (strcmp(name, "Immutable") == 0) {
+ xar->xmlsts = FILE_EXT2_Immutable;
+ flag = "simmutable";
+ }
+ else if (strcmp(name, "AppendOnly") == 0) {
+ xar->xmlsts = FILE_EXT2_AppendOnly;
+ flag = "sappend";
+ }
+ else if (strcmp(name, "NoDump") == 0) {
+ xar->xmlsts = FILE_EXT2_NoDump;
+ flag = "nodump";
+ }
+ else if (strcmp(name, "NoAtime") == 0) {
+ xar->xmlsts = FILE_EXT2_NoAtime;
+ flag = "noatime";
+ }
+ else if (strcmp(name, "CompDirty") == 0) {
+ xar->xmlsts = FILE_EXT2_CompDirty;
+ flag = "compdirty";
+ }
+ else if (strcmp(name, "CompBlock") == 0) {
+ xar->xmlsts = FILE_EXT2_CompBlock;
+ flag = "comprblk";
+ }
+ else if (strcmp(name, "NoCompBlock") == 0) {
+ xar->xmlsts = FILE_EXT2_NoCompBlock;
+ flag = "nocomprblk";
+ }
+ else if (strcmp(name, "CompError") == 0) {
+ xar->xmlsts = FILE_EXT2_CompError;
+ flag = "comperr";
+ }
+ else if (strcmp(name, "BTree") == 0) {
+ xar->xmlsts = FILE_EXT2_BTree;
+ flag = "btree";
+ }
+ else if (strcmp(name, "HashIndexed") == 0) {
+ xar->xmlsts = FILE_EXT2_HashIndexed;
+ flag = "hashidx";
+ }
+ else if (strcmp(name, "iMagic") == 0) {
+ xar->xmlsts = FILE_EXT2_iMagic;
+ flag = "imagic";
+ }
+ else if (strcmp(name, "Journaled") == 0) {
+ xar->xmlsts = FILE_EXT2_Journaled;
+ flag = "journal";
+ }
+ else if (strcmp(name, "NoTail") == 0) {
+ xar->xmlsts = FILE_EXT2_NoTail;
+ flag = "notail";
+ }
+ else if (strcmp(name, "DirSync") == 0) {
+ xar->xmlsts = FILE_EXT2_DirSync;
+ flag = "dirsync";
+ }
+ else if (strcmp(name, "TopDir") == 0) {
+ xar->xmlsts = FILE_EXT2_TopDir;
+ flag = "topdir";
+ }
+ else if (strcmp(name, "Reserved") == 0) {
+ xar->xmlsts = FILE_EXT2_Reserved;
+ flag = "reserved";
+ }
+
+ if (flag == NULL)
+ return (0);
+ if (archive_strlen(&(xar->file->fflags_text)) > 0)
+ archive_strappend_char(&(xar->file->fflags_text), ',');
+ archive_strcat(&(xar->file->fflags_text), flag);
+ return (1);
+}
+
+#ifdef HAVE_LIBXML_XMLREADER_H
+
+static int
+xml2_xmlattr_setup(struct xmlattr_list *list, xmlTextReaderPtr reader)
+{
+ struct xmlattr *attr;
+ int r;
+
+ list->first = NULL;
+ list->last = &(list->first);
+ r = xmlTextReaderMoveToFirstAttribute(reader);
+ while (r == 1) {
+ attr = malloc(sizeof*(attr));
+ if (attr == NULL)
+ __archive_errx(1, "Out of memory");
+ attr->name = strdup(
+ (const char *)xmlTextReaderConstLocalName(reader));
+ if (attr->name == NULL)
+ __archive_errx(1, "Out of memory");
+ attr->value = strdup(
+ (const char *)xmlTextReaderConstValue(reader));
+ if (attr->value == NULL)
+ __archive_errx(1, "Out of memory");
+ attr->next = NULL;
+ *list->last = attr;
+ list->last = &(attr->next);
+ r = xmlTextReaderMoveToNextAttribute(reader);
+ }
+ return (r);
+}
+
+static int
+xml2_read_cb(void *context, char *buffer, int len)
+{
+ struct archive_read *a;
+ struct xar *xar;
+ const void *d;
+ size_t outbytes;
+ size_t used;
+ int r;
+
+ a = (struct archive_read *)context;
+ xar = (struct xar *)(a->format->data);
+
+ if (xar->toc_remaining <= 0)
+ return (0);
+ d = buffer;
+ outbytes = len;
+ r = rd_contents(a, &d, &outbytes, &used, xar->toc_remaining);
+ if (r != ARCHIVE_OK)
+ return (r);
+ __archive_read_consume(a, used);
+ xar->toc_remaining -= used;
+ xar->offset += used;
+ xar->toc_total += outbytes;
+ PRINT_TOC(buffer, len);
+
+ return ((int)outbytes);
+}
+
+static int
+xml2_close_cb(void *context)
+{
+
+ (void)context; /* UNUSED */
+ return (0);
+}
+
+static void
+xml2_error_hdr(void *arg, const char *msg, xmlParserSeverities severity,
+ xmlTextReaderLocatorPtr locator)
+{
+ struct archive_read *a;
+
+ (void)locator; /* UNUSED */
+ a = (struct archive_read *)arg;
+ switch (severity) {
+ case XML_PARSER_SEVERITY_VALIDITY_WARNING:
+ case XML_PARSER_SEVERITY_WARNING:
+ archive_set_error(&a->archive, ARCHIVE_ERRNO_MISC,
+ "XML Parsing error: %s", msg);
+ break;
+ case XML_PARSER_SEVERITY_VALIDITY_ERROR:
+ case XML_PARSER_SEVERITY_ERROR:
+ archive_set_error(&a->archive, ARCHIVE_ERRNO_MISC,
+ "XML Parsing error: %s", msg);
+ break;
+ }
+}
+
+static int
+xml2_read_toc(struct archive_read *a)
+{
+ xmlTextReaderPtr reader;
+ struct xmlattr_list list;
+ int r;
+
+ reader = xmlReaderForIO(xml2_read_cb, xml2_close_cb, a, NULL, NULL, 0);
+ if (reader == NULL) {
+ archive_set_error(&a->archive, ENOMEM,
+ "Couldn't allocate memory for xml parser");
+ return (ARCHIVE_FATAL);
+ }
+ xmlTextReaderSetErrorHandler(reader, xml2_error_hdr, a);
+
+ while ((r = xmlTextReaderRead(reader)) == 1) {
+ const char *name, *value;
+ int type, empty;
+
+ type = xmlTextReaderNodeType(reader);
+ name = (const char *)xmlTextReaderConstLocalName(reader);
+ switch (type) {
+ case XML_READER_TYPE_ELEMENT:
+ empty = xmlTextReaderIsEmptyElement(reader);
+ r = xml2_xmlattr_setup(&list, reader);
+ if (r == 0) {
+ xml_start(a, name, &list);
+ xmlattr_cleanup(&list);
+ if (empty)
+ xml_end(a, name);
+ }
+ break;
+ case XML_READER_TYPE_END_ELEMENT:
+ xml_end(a, name);
+ break;
+ case XML_READER_TYPE_TEXT:
+ value = (const char *)xmlTextReaderConstValue(reader);
+ xml_data(a, value, strlen(value));
+ break;
+ case XML_READER_TYPE_SIGNIFICANT_WHITESPACE:
+ default:
+ break;
+ }
+ if (r < 0)
+ break;
+ }
+ xmlFreeTextReader(reader);
+ xmlCleanupParser();
+
+ return ((r == 0)?ARCHIVE_OK:ARCHIVE_FATAL);
+}
+
+#elif defined(HAVE_BSDXML_H) || defined(HAVE_EXPAT_H)
+
+static void
+expat_xmlattr_setup(struct xmlattr_list *list, const XML_Char **atts)
+{
+ struct xmlattr *attr;
+
+ list->first = NULL;
+ list->last = &(list->first);
+ if (atts == NULL)
+ return;
+ while (atts[0] != NULL && atts[1] != NULL) {
+ attr = malloc(sizeof*(attr));
+ if (attr == NULL)
+ __archive_errx(1, "Out of memory");
+ attr->name = strdup(atts[0]);
+ if (attr->name == NULL)
+ __archive_errx(1, "Out of memory");
+ attr->value = strdup(atts[1]);
+ if (attr->value == NULL)
+ __archive_errx(1, "Out of memory");
+ attr->next = NULL;
+ *list->last = attr;
+ list->last = &(attr->next);
+ atts += 2;
+ }
+}
+
+static void
+expat_start_cb(void *userData, const XML_Char *name, const XML_Char **atts)
+{
+ struct xmlattr_list list;
+
+ expat_xmlattr_setup(&list, atts);
+ xml_start(userData, (const char *)name, &list);
+ xmlattr_cleanup(&list);
+}
+
+static void
+expat_end_cb(void *userData, const XML_Char *name)
+{
+ xml_end(userData, (const char *)name);
+}
+
+static void
+expat_data_cb(void *userData, const XML_Char *s, int len)
+{
+ xml_data(userData, s, len);
+}
+
+static int
+expat_read_toc(struct archive_read *a)
+{
+ struct xar *xar;
+ XML_Parser parser;
+
+ xar = (struct xar *)(a->format->data);
+
+ /* Initialize XML Parser library. */
+ parser = XML_ParserCreate(NULL);
+ if (parser == NULL) {
+ archive_set_error(&a->archive, ENOMEM,
+ "Couldn't allocate memory for xml parser");
+ return (ARCHIVE_FATAL);
+ }
+ XML_SetUserData(parser, a);
+ XML_SetElementHandler(parser, expat_start_cb, expat_end_cb);
+ XML_SetCharacterDataHandler(parser, expat_data_cb);
+ xar->xmlsts = INIT;
+
+ while (xar->toc_remaining) {
+ enum XML_Status xr;
+ const void *d;
+ size_t outbytes;
+ size_t used;
+ int r;
+
+ d = NULL;
+ r = rd_contents(a, &d, &outbytes, &used, xar->toc_remaining);
+ if (r != ARCHIVE_OK)
+ return (r);
+ __archive_read_consume(a, used);
+ xar->toc_remaining -= used;
+ xar->offset += used;
+ xar->toc_total += outbytes;
+ PRINT_TOC(d, outbytes);
+
+ xr = XML_Parse(parser, d, outbytes, xar->toc_remaining == 0);
+ if (xr == XML_STATUS_ERROR) {
+ XML_ParserFree(parser);
+ archive_set_error(&a->archive, ARCHIVE_ERRNO_MISC,
+ "XML Parsing failed");
+ return (ARCHIVE_FATAL);
+ }
+ }
+ XML_ParserFree(parser);
+ return (ARCHIVE_OK);
+}
+#endif /* defined(HAVE_BSDXML_H) || defined(HAVE_EXPAT_H) */
+
+#endif /* Support xar format */
diff --git a/lib/libarchive/archive_write_disk.c b/lib/libarchive/archive_write_disk.c
index f0ca525..8a4fd04 100644
--- a/lib/libarchive/archive_write_disk.c
+++ b/lib/libarchive/archive_write_disk.c
@@ -2477,7 +2477,7 @@ set_xattrs(struct archive_write_disk *a)
}
return (ret);
}
-#elif HAVE_EXTATTR_SET_FILE
+#elif HAVE_EXTATTR_SET_FILE && HAVE_DECL_EXTATTR_NAMESPACE_USER
/*
* Restore extended attributes - FreeBSD implementation
*/
diff --git a/lib/libarchive/archive_write_disk_set_standard_lookup.c b/lib/libarchive/archive_write_disk_set_standard_lookup.c
index 1842cbd..ae9c12a 100644
--- a/lib/libarchive/archive_write_disk_set_standard_lookup.c
+++ b/lib/libarchive/archive_write_disk_set_standard_lookup.c
@@ -117,6 +117,7 @@ lookup_gid(void *private_data, const char *gname, gid_t gid)
/* Note: If strdup fails, that's okay; we just won't cache. */
b->hash = h;
#if HAVE_GRP_H
+# if HAVE_GETGRNAM_R
{
char _buffer[128];
size_t bufsize = 128;
@@ -143,6 +144,15 @@ lookup_gid(void *private_data, const char *gname, gid_t gid)
if (buffer != _buffer)
free(buffer);
}
+# else /* HAVE_GETGRNAM_R */
+ {
+ struct group *result;
+
+ result = getgrnam(gname);
+ if (result != NULL)
+ gid = result->gr_gid;
+ }
+# endif /* HAVE_GETGRNAM_R */
#elif defined(_WIN32) && !defined(__CYGWIN__)
/* TODO: do a gname->gid lookup for Windows. */
#else
@@ -177,6 +187,7 @@ lookup_uid(void *private_data, const char *uname, uid_t uid)
/* Note: If strdup fails, that's okay; we just won't cache. */
b->hash = h;
#if HAVE_PWD_H
+# if HAVE_GETPWNAM_R
{
char _buffer[128];
size_t bufsize = 128;
@@ -203,6 +214,15 @@ lookup_uid(void *private_data, const char *uname, uid_t uid)
if (buffer != _buffer)
free(buffer);
}
+# else /* HAVE_GETPWNAM_R */
+ {
+ struct passwd *result;
+
+ result = getpwnam(uname);
+ if (result != NULL)
+ uid = result->pw_uid;
+ }
+#endif /* HAVE_GETPWNAM_R */
#elif defined(_WIN32) && !defined(__CYGWIN__)
/* TODO: do a uname->uid lookup for Windows. */
#else
diff --git a/lib/libarchive/archive_write_set_compression_bzip2.c b/lib/libarchive/archive_write_set_compression_bzip2.c
index c8b502e..a3ed307 100644
--- a/lib/libarchive/archive_write_set_compression_bzip2.c
+++ b/lib/libarchive/archive_write_set_compression_bzip2.c
@@ -45,7 +45,7 @@ __FBSDID("$FreeBSD$");
#include "archive_private.h"
#include "archive_write_private.h"
-#ifndef HAVE_BZLIB_H
+#if !defined(HAVE_BZLIB_H) || !defined(BZ_CONFIG_ERROR)
int
archive_write_set_compression_bzip2(struct archive *a)
{
@@ -405,4 +405,4 @@ drive_compressor(struct archive_write *a, struct private_data *state, int finish
}
}
-#endif /* HAVE_BZLIB_H */
+#endif /* HAVE_BZLIB_H && BZ_CONFIG_ERROR */
diff --git a/lib/libarchive/config_freebsd.h b/lib/libarchive/config_freebsd.h
index 20d5b93..d1cb462 100644
--- a/lib/libarchive/config_freebsd.h
+++ b/lib/libarchive/config_freebsd.h
@@ -70,6 +70,7 @@
#define HAVE_BSDXML_H 1
#define HAVE_CHFLAGS 1
#define HAVE_CHOWN 1
+#define HAVE_DECL_EXTATTR_NAMESPACE_USER 1
#define HAVE_DECL_INT64_MAX 1
#define HAVE_DECL_INT64_MIN 1
#define HAVE_DECL_SIZE_MAX 1
@@ -92,7 +93,9 @@
#define HAVE_FTRUNCATE 1
#define HAVE_FUTIMES 1
#define HAVE_GETEUID 1
+#define HAVE_GETGRGID_R 1
#define HAVE_GETPID 1
+#define HAVE_GETPWUID_R 1
#define HAVE_GRP_H 1
#define HAVE_INTTYPES_H 1
#define HAVE_LCHFLAGS 1
@@ -149,6 +152,7 @@
#define HAVE_UTIME_H 1
#define HAVE_VFORK 1
#define HAVE_WCHAR_H 1
+#define HAVE_WCSCMP 1
#define HAVE_WCSCPY 1
#define HAVE_WCSLEN 1
#define HAVE_WCTOMB 1
@@ -162,3 +166,18 @@
#define intmax_t int64_t
#define uintmax_t uint64_t
#endif
+
+/* FreeBSD defines for archive_hash.h */
+#ifdef WITH_OPENSSL
+#define ARCHIVE_HASH_MD5_OPENSSL 1
+#define ARCHIVE_HASH_RMD160_OPENSSL 1
+#define ARCHIVE_HASH_SHA1_OPENSSL
+#define ARCHIVE_HASH_SHA256_OPENSSL 1
+#define ARCHIVE_HASH_SHA384_OPENSSL 1
+#define ARCHIVE_HASH_SHA512_OPENSSL 1
+#else
+#define ARCHIVE_HASH_MD5_LIBC 1
+#define ARCHIVE_HASH_SHA1_LIBC 1
+#define ARCHIVE_HASH_SHA256_LIBC 1
+#define ARCHIVE_HASH_SHA512_LIBC 1
+#endif
diff --git a/lib/libarchive/filter_fork.c b/lib/libarchive/filter_fork.c
index a4d1a98..d2a1e88 100644
--- a/lib/libarchive/filter_fork.c
+++ b/lib/libarchive/filter_fork.c
@@ -31,7 +31,7 @@
__FBSDID("$FreeBSD$");
-#if defined(HAVE_POLL)
+#if defined(HAVE_POLL) && (defined(HAVE_POLL_H) || defined(HAVE_SYS_POLL_H))
# if defined(HAVE_POLL_H)
# include <poll.h>
# elif defined(HAVE_SYS_POLL_H)
@@ -121,7 +121,7 @@ state_allocated:
void
__archive_check_child(int in, int out)
{
-#if defined(HAVE_POLL)
+#if defined(HAVE_POLL) && (defined(HAVE_POLL_H) || defined(HAVE_SYS_POLL_H))
struct pollfd fds[2];
int idx;
diff --git a/usr.bin/cpio/err.c b/lib/libarchive/libarchive_fe/err.c
index c74e097..eb3f9f3 100644
--- a/usr.bin/cpio/err.c
+++ b/lib/libarchive/libarchive_fe/err.c
@@ -24,7 +24,7 @@
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
-#include "cpio_platform.h"
+#include "lafe_platform.h"
__FBSDID("$FreeBSD$");
#ifdef HAVE_STDARG_H
@@ -40,12 +40,12 @@ __FBSDID("$FreeBSD$");
#include "err.h"
-const char *progname;
+const char *lafe_progname;
static void
-vwarnc(int code, const char *fmt, va_list ap)
+lafe_vwarnc(int code, const char *fmt, va_list ap)
{
- fprintf(stderr, "%s: ", progname);
+ fprintf(stderr, "%s: ", lafe_progname);
vfprintf(stderr, fmt, ap);
if (code != 0)
fprintf(stderr, ": %s", strerror(code));
@@ -53,22 +53,22 @@ vwarnc(int code, const char *fmt, va_list ap)
}
void
-warnc(int code, const char *fmt, ...)
+lafe_warnc(int code, const char *fmt, ...)
{
va_list ap;
va_start(ap, fmt);
- vwarnc(code, fmt, ap);
+ lafe_vwarnc(code, fmt, ap);
va_end(ap);
}
void
-errc(int eval, int code, const char *fmt, ...)
+lafe_errc(int eval, int code, const char *fmt, ...)
{
va_list ap;
va_start(ap, fmt);
- vwarnc(code, fmt, ap);
+ lafe_vwarnc(code, fmt, ap);
va_end(ap);
exit(eval);
}
diff --git a/usr.bin/cpio/err.h b/lib/libarchive/libarchive_fe/err.h
index fe96c70..4812b28 100644
--- a/usr.bin/cpio/err.h
+++ b/lib/libarchive/libarchive_fe/err.h
@@ -35,9 +35,9 @@
#define __LA_DEAD
#endif
-extern const char *progname;
+extern const char *lafe_progname;
-void warnc(int code, const char *fmt, ...);
-void errc(int eval, int code, const char *fmt, ...) __LA_DEAD;
+void lafe_warnc(int code, const char *fmt, ...);
+void lafe_errc(int eval, int code, const char *fmt, ...) __LA_DEAD;
#endif
diff --git a/usr.bin/cpio/pathmatch.h b/lib/libarchive/libarchive_fe/lafe_platform.h
index 3e82830..38e100d 100644
--- a/usr.bin/cpio/pathmatch.h
+++ b/lib/libarchive/libarchive_fe/lafe_platform.h
@@ -6,8 +6,7 @@
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer
- * in this position and unchanged.
+ * notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
@@ -26,17 +25,31 @@
* $FreeBSD$
*/
-#ifndef LAFE_PATHMATCH_H
-#define LAFE_PATHMATCH_H
+/*
+ * This header is the first thing included in any of the libarchive_fe
+ * source files. As far as possible, platform-specific issues should
+ * be dealt with here and not within individual source files.
+ */
-/* Don't anchor at beginning unless the pattern starts with "^" */
-#define PATHMATCH_NO_ANCHOR_START 1
-/* Don't anchor at end unless the pattern ends with "$" */
-#define PATHMATCH_NO_ANCHOR_END 2
+#ifndef LAFE_PLATFORM_H_INCLUDED
+#define LAFE_PLATFORM_H_INCLUDED
-/* Note that "^" and "$" are not special unless you set the corresponding
- * flag above. */
+#if defined(PLATFORM_CONFIG_H)
+/* Use hand-built config.h in environments that need it. */
+#include PLATFORM_CONFIG_H
+#else
+/* Read config.h or die trying. */
+#include "config.h"
+#endif
-int pathmatch(const char *p, const char *s, int flags);
+/* Get a real definition for __FBSDID if we can */
+#if HAVE_SYS_CDEFS_H
+#include <sys/cdefs.h>
+#endif
+
+/* If not, define it so as to avoid dangling semicolons. */
+#ifndef __FBSDID
+#define __FBSDID(a) struct _undefined_hack
+#endif
#endif
diff --git a/usr.bin/tar/line_reader.c b/lib/libarchive/libarchive_fe/line_reader.c
index c9df1b0..4af60de 100644
--- a/usr.bin/tar/line_reader.c
+++ b/lib/libarchive/libarchive_fe/line_reader.c
@@ -24,7 +24,7 @@
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
-#include "bsdtar_platform.h"
+#include "lafe_platform.h"
__FBSDID("$FreeBSD$");
#include <errno.h>
@@ -62,7 +62,7 @@ lafe_line_reader(const char *pathname, int nullSeparator)
lr = calloc(1, sizeof(*lr));
if (lr == NULL)
- bsdtar_errc(1, ENOMEM, "Can't open %s", pathname);
+ lafe_errc(1, ENOMEM, "Can't open %s", pathname);
lr->nullSeparator = nullSeparator;
lr->pathname = strdup(pathname);
@@ -72,11 +72,11 @@ lafe_line_reader(const char *pathname, int nullSeparator)
else
lr->f = fopen(pathname, "r");
if (lr->f == NULL)
- bsdtar_errc(1, errno, "Couldn't open %s", pathname);
+ lafe_errc(1, errno, "Couldn't open %s", pathname);
lr->buff_length = 8192;
lr->buff = malloc(lr->buff_length);
if (lr->buff == NULL)
- bsdtar_errc(1, ENOMEM, "Can't read %s", pathname);
+ lafe_errc(1, ENOMEM, "Can't read %s", pathname);
lr->line_start = lr->line_end = lr->buff_end = lr->buff;
return (lr);
@@ -135,12 +135,12 @@ lafe_line_reader_next(struct lafe_line_reader *lr)
/* Line is too big; enlarge the buffer. */
new_buff_size = lr->buff_length * 2;
if (new_buff_size <= lr->buff_length)
- bsdtar_errc(1, ENOMEM,
+ lafe_errc(1, ENOMEM,
"Line too long in %s", lr->pathname);
lr->buff_length = new_buff_size;
p = realloc(lr->buff, new_buff_size);
if (p == NULL)
- bsdtar_errc(1, ENOMEM,
+ lafe_errc(1, ENOMEM,
"Line too long in %s", lr->pathname);
lr->buff_end = p + (lr->buff_end - lr->buff);
lr->line_end = p + (lr->line_end - lr->buff);
@@ -153,7 +153,7 @@ lafe_line_reader_next(struct lafe_line_reader *lr)
lr->buff_end += bytes_read;
if (ferror(lr->f))
- bsdtar_errc(1, errno, "Can't read %s", lr->pathname);
+ lafe_errc(1, errno, "Can't read %s", lr->pathname);
if (feof(lr->f)) {
if (lr->f != stdin)
fclose(lr->f);
diff --git a/usr.bin/tar/line_reader.h b/lib/libarchive/libarchive_fe/line_reader.h
index e4c3729..e4c3729 100644
--- a/usr.bin/tar/line_reader.h
+++ b/lib/libarchive/libarchive_fe/line_reader.h
diff --git a/usr.bin/tar/matching.c b/lib/libarchive/libarchive_fe/matching.c
index dc316b1..01e9c39 100644
--- a/usr.bin/tar/matching.c
+++ b/lib/libarchive/libarchive_fe/matching.c
@@ -23,7 +23,7 @@
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
-#include "bsdtar_platform.h"
+#include "lafe_platform.h"
__FBSDID("$FreeBSD$");
#ifdef HAVE_ERRNO_H
@@ -136,7 +136,7 @@ add_pattern(struct match **list, const char *pattern)
len = strlen(pattern);
match = malloc(sizeof(*match) + len + 1);
if (match == NULL)
- bsdtar_errc(1, errno, "Out of memory");
+ lafe_errc(1, errno, "Out of memory");
strcpy(match->pattern, pattern);
/* Both "foo/" and "foo" should match "foo/bar". */
if (len && match->pattern[len - 1] == '/')
@@ -252,7 +252,7 @@ initialize_matching(struct lafe_matching **matching)
{
*matching = calloc(sizeof(**matching), 1);
if (*matching == NULL)
- bsdtar_errc(1, errno, "No memory");
+ lafe_errc(1, errno, "No memory");
}
int
@@ -274,7 +274,7 @@ lafe_unmatched_inclusions_warn(struct lafe_matching *matching, const char *msg)
for (p = matching->inclusions; p != NULL; p = p->next) {
if (p->matches == 0)
- bsdtar_warnc(0, "%s: %s", p->pattern, msg);
+ lafe_warnc(0, "%s: %s", p->pattern, msg);
}
return (matching->inclusions_unmatched_count);
diff --git a/usr.bin/tar/matching.h b/lib/libarchive/libarchive_fe/matching.h
index f4edebd..f4edebd 100644
--- a/usr.bin/tar/matching.h
+++ b/lib/libarchive/libarchive_fe/matching.h
diff --git a/usr.bin/tar/pathmatch.c b/lib/libarchive/libarchive_fe/pathmatch.c
index a994d44..e211362 100644
--- a/usr.bin/tar/pathmatch.c
+++ b/lib/libarchive/libarchive_fe/pathmatch.c
@@ -24,7 +24,7 @@
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
-#include "bsdtar_platform.h"
+#include "lafe_platform.h"
__FBSDID("$FreeBSD$");
#ifdef HAVE_STRING_H
diff --git a/usr.bin/tar/pathmatch.h b/lib/libarchive/libarchive_fe/pathmatch.h
index a92f3ae..a92f3ae 100644
--- a/usr.bin/tar/pathmatch.h
+++ b/lib/libarchive/libarchive_fe/pathmatch.h
diff --git a/lib/libarchive/test/Makefile b/lib/libarchive/test/Makefile
index f9fead9..3f747b6 100644
--- a/lib/libarchive/test/Makefile
+++ b/lib/libarchive/test/Makefile
@@ -45,6 +45,8 @@ TESTS= \
test_read_format_cpio_odc.c \
test_read_format_cpio_svr4_gzip.c \
test_read_format_cpio_svr4c_Z.c \
+ test_read_format_cpio_svr4_bzip2_rpm.c \
+ test_read_format_cpio_svr4_gzip_rpm.c \
test_read_format_empty.c \
test_read_format_gtar_gz.c \
test_read_format_gtar_lzma.c \
@@ -69,6 +71,7 @@ TESTS= \
test_read_format_tlz.c \
test_read_format_txz.c \
test_read_format_tz.c \
+ test_read_format_xar.c \
test_read_format_zip.c \
test_read_large.c \
test_read_pax_truncated.c \
diff --git a/lib/libarchive/test/main.c b/lib/libarchive/test/main.c
index 5f8cbc3..0cd16a0 100644
--- a/lib/libarchive/test/main.c
+++ b/lib/libarchive/test/main.c
@@ -346,7 +346,7 @@ failure_finish(void *extra)
if (dump_on_failure) {
fprintf(stderr,
" *** forcing core dump so failure can be debugged ***\n");
- *(char *)(NULL) = 0;
+ abort();
exit(1);
}
}
@@ -485,6 +485,22 @@ wcsdump(const char *e, const wchar_t *w)
logprintf("\"\n");
}
+#ifndef HAVE_WCSCMP
+static int
+wcscmp(const wchar_t *s1, const wchar_t *s2)
+{
+
+ while (*s1 == *s2++) {
+ if (*s1++ == L'\0')
+ return 0;
+ }
+ if (*s1 > *--s2)
+ return 1;
+ else
+ return -1;
+}
+#endif
+
/* Verify that two wide strings are equal, dump them if not. */
int
assertion_equal_wstring(const char *file, int line,
diff --git a/lib/libarchive/test/read_open_memory.c b/lib/libarchive/test/read_open_memory.c
index 17e7f75..db0de85 100644
--- a/lib/libarchive/test/read_open_memory.c
+++ b/lib/libarchive/test/read_open_memory.c
@@ -43,16 +43,13 @@ struct read_memory_data {
unsigned char *end;
size_t read_size;
size_t copy_buff_size;
+ size_t copy_buff_offset;
char *copy_buff;
};
static int memory_read_close(struct archive *, void *);
static int memory_read_open(struct archive *, void *);
-#if ARCHIVE_VERSION_NUMBER < 2000000
-static ssize_t memory_read_skip(struct archive *, void *, size_t request);
-#else
static off_t memory_read_skip(struct archive *, void *, off_t request);
-#endif
static ssize_t memory_read(struct archive *, void *, const void **buff);
static int read_open_memory_internal(struct archive *a, void *buff,
size_t size, size_t read_size, int fullapi);
@@ -89,8 +86,10 @@ read_open_memory_internal(struct archive *a, void *buff,
mine->buffer = (unsigned char *)buff;
mine->end = mine->buffer + size;
mine->read_size = read_size;
- mine->copy_buff_size = read_size + 64;
+ mine->copy_buff_offset = 32;
+ mine->copy_buff_size = read_size + mine->copy_buff_offset * 2;
mine->copy_buff = malloc(mine->copy_buff_size);
+ memset(mine->copy_buff, 0xA5, mine->copy_buff_size);
if (fullapi)
return (archive_read_open2(a, mine, memory_read_open,
memory_read, memory_read_skip, memory_read_close));
@@ -126,9 +125,10 @@ memory_read(struct archive *a, void *client_data, const void **buff)
size = mine->end - mine->buffer;
if (size > mine->read_size)
size = mine->read_size;
- memset(mine->copy_buff, 0xA5, mine->copy_buff_size);
- memcpy(mine->copy_buff, mine->buffer, size);
- *buff = mine->copy_buff;
+ else
+ memset(mine->copy_buff, 0xA5, mine->copy_buff_size);
+ memcpy(mine->copy_buff + mine->copy_buff_offset, mine->buffer, size);
+ *buff = mine->copy_buff + mine->copy_buff_offset;
mine->buffer += size;
return ((ssize_t)size);
@@ -137,13 +137,8 @@ memory_read(struct archive *a, void *client_data, const void **buff)
/*
* How mean can a skip() routine be? Let's try to find out.
*/
-#if ARCHIVE_VERSION_NUMBER < 2000000
-static ssize_t
-memory_read_skip(struct archive *a, void *client_data, size_t skip)
-#else
static off_t
memory_read_skip(struct archive *a, void *client_data, off_t skip)
-#endif
{
struct read_memory_data *mine = (struct read_memory_data *)client_data;
diff --git a/lib/libarchive/test/test.h b/lib/libarchive/test/test.h
index 6ea7b57..725c899 100644
--- a/lib/libarchive/test/test.h
+++ b/lib/libarchive/test/test.h
@@ -48,9 +48,6 @@
#include <sys/types.h> /* Windows requires this before sys/stat.h */
#include <sys/stat.h>
-#ifdef USE_DMALLOC
-#include <dmalloc.h>
-#endif
#if HAVE_DIRENT_H
#include <dirent.h>
#endif
@@ -299,3 +296,7 @@ int read_open_memory2(struct archive *, void *, size_t, size_t);
assertion_equal_int(__FILE__, __LINE__, (v1), #v1, (v2), #v2, (a))
#define assertEqualStringA(a,v1,v2) \
assertion_equal_string(__FILE__, __LINE__, (v1), #v1, (v2), #v2, (a))
+
+#ifdef USE_DMALLOC
+#include <dmalloc.h>
+#endif
diff --git a/lib/libarchive/test/test_entry.c b/lib/libarchive/test/test_entry.c
index bd946c4..35ca6e3 100644
--- a/lib/libarchive/test/test_entry.c
+++ b/lib/libarchive/test/test_entry.c
@@ -27,6 +27,16 @@ __FBSDID("$FreeBSD$");
#include <locale.h>
+#ifndef HAVE_WCSCPY
+static wchar_t * wcscpy(wchar_t *s1, const wchar_t *s2)
+{
+ wchar_t *dest = s1;
+ while ((*s1 = *s2) != L'\0')
+ ++s1, ++s2;
+ return dest;
+}
+#endif
+
/*
* Most of these tests are system-independent, though a few depend on
* features of the local system. Such tests are conditionalized on
@@ -866,6 +876,7 @@ DEFINE_TEST(test_entry)
assert(NULL == archive_entry_symlink_w(e));
}
+#if HAVE_WCSCPY
l = 0x12345678L;
wc = (wchar_t)l; /* Wide character too big for UTF-8. */
if (NULL == setlocale(LC_ALL, "C") || (long)wc != l) {
@@ -885,6 +896,7 @@ DEFINE_TEST(test_entry)
failure("Converting wide characters from Unicode should fail.");
assertEqualString(NULL, archive_entry_pathname(e));
}
+#endif
/* Release the experimental entry. */
archive_entry_free(e);
diff --git a/lib/libarchive/test/test_fuzz.c b/lib/libarchive/test/test_fuzz.c
index 7e3f28d..8f91fca 100644
--- a/lib/libarchive/test/test_fuzz.c
+++ b/lib/libarchive/test/test_fuzz.c
@@ -62,6 +62,7 @@ static struct {
{0, "test_compat_zip_1.zip"},
{0, "test_read_format_ar.ar"},
{0, "test_read_format_cpio_bin_be.cpio"},
+ {0, "test_read_format_cpio_svr4_gzip_rpm.rpm"}, /* Test RPM unwrapper */
{0, "test_read_format_gtar_sparse_1_17_posix10_modified.tar"},
{0, "test_read_format_mtree.mtree"},
{0, "test_read_format_tar_empty_filename.tar"},
@@ -111,8 +112,10 @@ DEFINE_TEST(test_fuzz)
assert(size > 0);
failure("Internal buffer is not big enough for "
"uncompressed test file: %s", filename);
- if (!assert(size < buffsize))
+ if (!assert(size < buffsize)) {
+ free(rawimage);
continue;
+ }
} else {
rawimage = slurpfile(&size, filename);
if (!assert(rawimage != NULL))
@@ -152,8 +155,8 @@ DEFINE_TEST(test_fuzz)
continue;
}
archive_read_close(a);
- archive_read_finish(a);
}
+ archive_read_finish(a);
}
free(image);
free(rawimage);
diff --git a/lib/libarchive/test/test_pax_filename_encoding.c b/lib/libarchive/test/test_pax_filename_encoding.c
index 5affe9f..af0208c 100644
--- a/lib/libarchive/test/test_pax_filename_encoding.c
+++ b/lib/libarchive/test/test_pax_filename_encoding.c
@@ -225,9 +225,11 @@ test_pax_filename_encoding_3(void)
* setlocale() does not set the default encoding for CP_ACP. */
entry = archive_entry_new();
if (archive_entry_update_pathname_utf8(entry, badname_utf8)) {
+ archive_entry_free(entry);
skipping("Cannot test conversion failures.");
return;
}
+ archive_entry_free(entry);
assert((a = archive_write_new()) != NULL);
assertEqualIntA(a, 0, archive_write_set_format_pax(a));
diff --git a/lib/libarchive/test/test_read_data_large.c b/lib/libarchive/test/test_read_data_large.c
index ecacf65..2dacb50 100644
--- a/lib/libarchive/test/test_read_data_large.c
+++ b/lib/libarchive/test/test_read_data_large.c
@@ -69,7 +69,7 @@ DEFINE_TEST(test_read_data_large)
archive_entry_set_size(ae, sizeof(buff2));
assertA(0 == archive_write_header(a, ae));
archive_entry_free(ae);
- assertA(sizeof(buff2) == archive_write_data(a, buff2, sizeof(buff2)));
+ assertA((int)sizeof(buff2) == archive_write_data(a, buff2, sizeof(buff2)));
/* Close out the archive. */
assertA(0 == archive_write_close(a));
diff --git a/lib/libarchive/test/test_read_format_cpio_svr4_bzip2_rpm.c b/lib/libarchive/test/test_read_format_cpio_svr4_bzip2_rpm.c
new file mode 100644
index 0000000..005838d
--- /dev/null
+++ b/lib/libarchive/test/test_read_format_cpio_svr4_bzip2_rpm.c
@@ -0,0 +1,128 @@
+/*-
+ * Copyright (c) 2003-2007 Tim Kientzle
+ * Copyright (c) 2009 Michihiro NAKAJIMA
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR(S) ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+#include "test.h"
+__FBSDID("$FreeBSD$");
+
+/*
+Execute the following command to rebuild the data for this program:
+ tail -n +32 test_read_format_cpio_svr4_bzip2_rpm.c | /bin/sh
+
+F=test_read_format_cpio_svr4_bzip2_rpm.rpm
+NAME=rpmsample
+TMPRPM=/tmp/rpm
+rm -rf ${TMPRPM}
+mkdir -p ${TMPRPM}/BUILD
+mkdir -p ${TMPRPM}/RPMS
+mkdir -p ${TMPRPM}/SOURCES
+mkdir -p ${TMPRPM}/SPECS
+mkdir -p ${TMPRPM}/SRPMS
+echo "hello" > ${TMPRPM}/BUILD/file1
+echo "hello" > ${TMPRPM}/BUILD/file2
+echo "hello" > ${TMPRPM}/BUILD/file3
+cat > ${TMPRPM}/SPECS/${NAME}.spec <<END
+##
+%define _topdir ${TMPRPM}
+%define _binary_payload w9.bzdio
+
+Summary: Sample data of RPM filter of libarchive
+Name: ${NAME}
+Version: 1.0.0
+Release: 1
+License: BSD
+URL: http://code.google.com/p/libarchive
+BuildArch: noarch
+BuildRoot: %{_tmppath}/%{name}-%{version}-root
+
+%install
+rm -rf \$RPM_BUILD_ROOT
+
+mkdir -p \$RPM_BUILD_ROOT%{_sysconfdir}
+install -m 644 file1 \$RPM_BUILD_ROOT%{_sysconfdir}/file1
+install -m 644 file2 \$RPM_BUILD_ROOT%{_sysconfdir}/file2
+install -m 644 file3 \$RPM_BUILD_ROOT%{_sysconfdir}/file3
+TZ=utc touch -afm -t 197001020000.01 \$RPM_BUILD_ROOT%{_sysconfdir}/file1
+TZ=utc touch -afm -t 197001020000.01 \$RPM_BUILD_ROOT%{_sysconfdir}/file2
+TZ=utc touch -afm -t 197001020000.01 \$RPM_BUILD_ROOT%{_sysconfdir}/file3
+
+%files
+%{_sysconfdir}/file1
+%{_sysconfdir}/file2
+%{_sysconfdir}/file3
+
+%description
+Sample data.
+END
+#
+rpmbuild -bb ${TMPRPM}/SPECS/${NAME}.spec
+uuencode ${F} < ${TMPRPM}/RPMS/noarch/${NAME}-1.0.0-1.noarch.rpm > ${F}.uu
+
+rm -rf ${TMPRPM}
+exit 1
+*/
+
+DEFINE_TEST(test_read_format_cpio_svr4_bzip2_rpm)
+{
+ struct archive_entry *ae;
+ struct archive *a;
+ const char *name = "test_read_format_cpio_svr4_bzip2_rpm.rpm";
+ int r;
+
+ assert((a = archive_read_new()) != NULL);
+ r = archive_read_support_compression_bzip2(a);
+ if (r == ARCHIVE_WARN) {
+ skipping("bzip2 reading not fully supported on this platform");
+ assertEqualInt(ARCHIVE_OK, archive_read_finish(a));
+ return;
+ }
+ assertEqualIntA(a, ARCHIVE_OK, r);
+ assertEqualIntA(a, ARCHIVE_OK,
+ archive_read_support_compression_rpm(a));
+ assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a));
+ extract_reference_file(name);
+ assertEqualIntA(a, ARCHIVE_OK, archive_read_open_filename(a, name, 2));
+
+ assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
+ assertEqualString("./etc/file1", archive_entry_pathname(ae));
+ assertEqualInt(86401, archive_entry_mtime(ae));
+ assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
+ assertEqualString("./etc/file2", archive_entry_pathname(ae));
+ assertEqualInt(86401, archive_entry_mtime(ae));
+ assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
+ assertEqualString("./etc/file3", archive_entry_pathname(ae));
+ assertEqualInt(86401, archive_entry_mtime(ae));
+
+ /* Verify the end-of-archive. */
+ assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header(a, &ae));
+
+ /* Verify that the format detection worked. */
+ assertEqualInt(archive_compression(a), ARCHIVE_COMPRESSION_BZIP2);
+ assertEqualString(archive_compression_name(a), "bzip2");
+ assertEqualInt(archive_format(a), ARCHIVE_FORMAT_CPIO_SVR4_NOCRC);
+
+ assertEqualInt(ARCHIVE_OK, archive_read_close(a));
+ assertEqualInt(ARCHIVE_OK, archive_read_finish(a));
+}
+
diff --git a/lib/libarchive/test/test_read_format_cpio_svr4_bzip2_rpm.rpm.uu b/lib/libarchive/test/test_read_format_cpio_svr4_bzip2_rpm.rpm.uu
new file mode 100644
index 0000000..3e85150
--- /dev/null
+++ b/lib/libarchive/test/test_read_format_cpio_svr4_bzip2_rpm.rpm.uu
@@ -0,0 +1,49 @@
+$FreeBSD$
+
+begin 644 test_read_format_cpio_svr4_bzip2_rpm.rpm
+M[:ONVP,``````7)P;7-A;7!L92TQ+C`N,"TQ````````````````````````
+M```````````````````````````````````````````!``4`````````````
+M````````CJWH`0`````````%````5````#X````'````1````!````$-````
+M!@`````````!```#Z`````0````L`````0```^P````'````,````!````/O
+M````!````$`````!,F4X-3)F-39E,#,W83EE.61A9C<W8V(Q,&0P8S4T-65E
+M9&8S-6$U8@````````:<A,!!LG.$S/]SK-(FA0BH6@```@@````^````!___
+M_[`````0`````(ZMZ`$`````````,0```NP````_````!P```MP````0````
+M9`````@``````````0```^@````&`````@````$```/I````!@````P````!
+M```#Z@````8````2`````0```^P````)````%`````$```/M````"0```#P`
+M```!```#[@````0```!,`````0```^\````&````4`````$```/Q````!```
+M`%P````!```#]@````8```!@`````0```_@````)````9`````$```/\````
+M!@```'`````!```#_0````8```"4`````0```_X````&````F@````$```0$
+M````!````*0````#```$!@````,```"P`````P``!`D````#````M@````,`
+M``0*````!````+P````#```$"P````@```#(`````P``!`P````(```!*P``
+M``,```0-````!````3`````#```$#P````@```$\`````P``!!`````(```!
+M2P````,```04````!@```5H````!```$%0````0```%T`````P``!!<````(
+M```!@`````$```08````!````8P````#```$&0````@```&8`````P``!!H`
+M```(```!Z@````,```0H````!@```@`````!```$1P````0```((`````P``
+M!$@````$```"%`````,```1)````"````B`````#```$6`````0```(D````
+M`0``!%D````(```"*`````$```1<````!````C`````#```$70````@```(\
+M`````P``!%X````(```"3@````$```1B````!@```E0````!```$9`````8`
+M``)S`````0``!&4````&```">`````$```1F````!@```GX````!```$;```
+M``8```*``````0``!'0````$```"E`````,```1U````!````J`````#```$
+M=@````@```*L`````P``!'<````$```"Q`````,```1X````!````M`````#
+M0P!R<&US86UP;&4`,2XP+C``,0!386UP;&4@9&%T82!O9B!24$T@9FEL=&5R
+M(&]F(&QI8F%R8VAI=F4`4V%M<&QE(&1A=&$N`````$L)MWQC=64M9&5S:W1O
+M<``````20E-$`%5N<W!E8VEF:65D`&AT='`Z+R]C;V1E+F=O;V=L92YC;VTO
+M<"]L:6)A<F-H:79E`&QI;G5X`&YO87)C:``````````&````!@````:!I(&D
+M@:0``````````5&!``%1@0`!48%B,3DT-F%C.3(T.3)D,C,T-V,V,C,U8C1D
+M,C8Q,3$X-`!B,3DT-F%C.3(T.3)D,C,T-V,V,C,U8C1D,C8Q,3$X-`!B,3DT
+M-F%C.3(T.3)D,C,T-V,V,C,U8C1D,C8Q,3$X-```````````````````````
+M`')O;W0`<F]O=`!R;V]T`')O;W0`<F]O=`!R;V]T`')P;7-A;7!L92TQ+C`N
+M,"TQ+G-R8RYR<&T`________________<G!M<V%M<&QE`````0``2@$``$H!
+M``!*<G!M;&EB*$-O;7!R97-S961&:6QE3F%M97,I`')P;6QI8BA087EL;V%D
+M1FEL97-(879E4')E9FEX*0!R<&UL:6(H4&%Y;&]A9$ES0GII<#(I`#,N,"XT
+M+3$`-"XP+3$`,RXP+C4M,0`T+C<N,```````"`$```@!```(`0``*H<``"J(
+M```JB0`````````(,2XP+C`M,0````````````````!F:6QE,0!F:6QE,@!F
+M:6QE,P`O971C+P`M3S(@+6<@+6UA<F-H/6DS.#8@+6UT=6YE/6DV.#8`8W!I
+M;P!B>FEP,@`Y`&YO87)C:"UR<&TM;&EN=7@`````````````````````````
+M`0````$````!`$%30TE)('1E>'0`9&ER96-T;W)Y````````````````````
+M````````````````````/P````?___SP````$$)::#DQ05DF4UFX89DX``!=
+M?X!,$`@`*`'_X"(D%``[9(0`(`"2B/50T#0#0`](9!%(C1,0&GJ`R`M@PQRG
+M<PN0PPC]8&X[2P=KHS%0Q<^=89M6CI5L`O2\("`W!K-V.;*M63U;6ES%CQI6
+E4,1$DE)B@G&.7I5?NT46(XB0/D,B!$Z-!A_B[DBG"A(7##,G````
+`
+end
diff --git a/lib/libarchive/test/test_read_format_cpio_svr4_gzip_rpm.c b/lib/libarchive/test/test_read_format_cpio_svr4_gzip_rpm.c
new file mode 100644
index 0000000..59e53f1
--- /dev/null
+++ b/lib/libarchive/test/test_read_format_cpio_svr4_gzip_rpm.c
@@ -0,0 +1,128 @@
+/*-
+ * Copyright (c) 2003-2007 Tim Kientzle
+ * Copyright (c) 2009 Michihiro NAKAJIMA
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR(S) ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+#include "test.h"
+__FBSDID("$FreeBSD$");
+
+/*
+Execute the following command to rebuild the data for this program:
+ tail -n +32 test_read_format_cpio_svr4_gzip_rpm.c | /bin/sh
+
+F=test_read_format_cpio_svr4_gzip_rpm.rpm
+NAME=rpmsample
+TMPRPM=/tmp/rpm
+rm -rf ${TMPRPM}
+mkdir -p ${TMPRPM}/BUILD
+mkdir -p ${TMPRPM}/RPMS
+mkdir -p ${TMPRPM}/SOURCES
+mkdir -p ${TMPRPM}/SPECS
+mkdir -p ${TMPRPM}/SRPMS
+echo "hello" > ${TMPRPM}/BUILD/file1
+echo "hello" > ${TMPRPM}/BUILD/file2
+echo "hello" > ${TMPRPM}/BUILD/file3
+cat > ${TMPRPM}/SPECS/${NAME}.spec <<END
+##
+%define _topdir ${TMPRPM}
+%define _binary_payload w9.gzdio
+
+Summary: Sample data of RPM filter of libarchive
+Name: ${NAME}
+Version: 1.0.0
+Release: 1
+License: BSD
+URL: http://code.google.com/p/libarchive
+BuildArch: noarch
+BuildRoot: %{_tmppath}/%{name}-%{version}-root
+
+%install
+rm -rf \$RPM_BUILD_ROOT
+
+mkdir -p \$RPM_BUILD_ROOT%{_sysconfdir}
+install -m 644 file1 \$RPM_BUILD_ROOT%{_sysconfdir}/file1
+install -m 644 file2 \$RPM_BUILD_ROOT%{_sysconfdir}/file2
+install -m 644 file3 \$RPM_BUILD_ROOT%{_sysconfdir}/file3
+TZ=utc touch -afm -t 197001020000.01 \$RPM_BUILD_ROOT%{_sysconfdir}/file1
+TZ=utc touch -afm -t 197001020000.01 \$RPM_BUILD_ROOT%{_sysconfdir}/file2
+TZ=utc touch -afm -t 197001020000.01 \$RPM_BUILD_ROOT%{_sysconfdir}/file3
+
+%files
+%{_sysconfdir}/file1
+%{_sysconfdir}/file2
+%{_sysconfdir}/file3
+
+%description
+Sample data.
+END
+#
+rpmbuild -bb ${TMPRPM}/SPECS/${NAME}.spec
+uuencode ${F} < ${TMPRPM}/RPMS/noarch/${NAME}-1.0.0-1.noarch.rpm > ${F}.uu
+
+rm -rf ${TMPRPM}
+exit 1
+*/
+
+DEFINE_TEST(test_read_format_cpio_svr4_gzip_rpm)
+{
+ struct archive_entry *ae;
+ struct archive *a;
+ const char *name = "test_read_format_cpio_svr4_gzip_rpm.rpm";
+ int r;
+
+ assert((a = archive_read_new()) != NULL);
+ r = archive_read_support_compression_gzip(a);
+ if (r == ARCHIVE_WARN) {
+ skipping("gzip reading not fully supported on this platform");
+ assertEqualInt(ARCHIVE_OK, archive_read_finish(a));
+ return;
+ }
+ assertEqualIntA(a, ARCHIVE_OK, r);
+ assertEqualIntA(a, ARCHIVE_OK,
+ archive_read_support_compression_rpm(a));
+ assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a));
+ extract_reference_file(name);
+ assertEqualIntA(a, ARCHIVE_OK, archive_read_open_filename(a, name, 2));
+
+ assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
+ assertEqualString("./etc/file1", archive_entry_pathname(ae));
+ assertEqualInt(86401, archive_entry_mtime(ae));
+ assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
+ assertEqualString("./etc/file2", archive_entry_pathname(ae));
+ assertEqualInt(86401, archive_entry_mtime(ae));
+ assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
+ assertEqualString("./etc/file3", archive_entry_pathname(ae));
+ assertEqualInt(86401, archive_entry_mtime(ae));
+
+ /* Verify the end-of-archive. */
+ assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header(a, &ae));
+
+ /* Verify that the format detection worked. */
+ assertEqualInt(archive_compression(a), ARCHIVE_COMPRESSION_GZIP);
+ assertEqualString(archive_compression_name(a), "gzip");
+ assertEqualInt(archive_format(a), ARCHIVE_FORMAT_CPIO_SVR4_NOCRC);
+
+ assertEqualInt(ARCHIVE_OK, archive_read_close(a));
+ assertEqualInt(ARCHIVE_OK, archive_read_finish(a));
+}
+
diff --git a/lib/libarchive/test/test_read_format_cpio_svr4_gzip_rpm.rpm.uu b/lib/libarchive/test/test_read_format_cpio_svr4_gzip_rpm.rpm.uu
new file mode 100644
index 0000000..ac29865
--- /dev/null
+++ b/lib/libarchive/test/test_read_format_cpio_svr4_gzip_rpm.rpm.uu
@@ -0,0 +1,48 @@
+$FreeBSD$
+
+begin 644 test_read_format_cpio_svr4_gzip_rpm.rpm
+M[:ONVP,``````7)P;7-A;7!L92TQ+C`N,"TQ````````````````````````
+M```````````````````````````````````````````!``4`````````````
+M````````CJWH`0`````````%````5````#X````'````1````!````$-````
+M!@`````````!```#Z`````0````L`````0```^P````'````,````!````/O
+M````!````$`````!9&9E8V,W,#4T,C@X,V1D-&8P-6%E.#4Y,S<S,&1F,V)D
+M,#$Q,S0V80````````9=A5.[L^@5U91731!5GLHZC0```@@````^````!___
+M_[`````0`````(ZMZ`$`````````,0```L0````_````!P```K0````0````
+M9`````@``````````0```^@````&`````@````$```/I````!@````P````!
+M```#Z@````8````2`````0```^P````)````%`````$```/M````"0```#P`
+M```!```#[@````0```!,`````0```^\````&````4`````$```/Q````!```
+M`%P````!```#]@````8```!@`````0```_@````)````9`````$```/\````
+M!@```'`````!```#_0````8```"4`````0```_X````&````F@````$```0$
+M````!````*0````#```$!@````,```"P`````P``!`D````#````M@````,`
+M``0*````!````+P````#```$"P````@```#(`````P``!`P````(```!*P``
+M``,```0-````!````3`````#```$#P````@```$\`````P``!!`````(```!
+M2P````,```04````!@```5H````!```$%0````0```%T`````P``!!<````(
+M```!@`````$```08````!````8P````"```$&0````@```&4`````@``!!H`
+M```(```!SP````(```0H````!@```=T````!```$1P````0```'D`````P``
+M!$@````$```!\`````,```1)````"````?P````#```$6`````0```(`````
+M`0``!%D````(```"!`````$```1<````!````@P````#```$70````@```(8
+M`````P``!%X````(```"*@````$```1B````!@```C`````!```$9`````8`
+M``)/`````0``!&4````&```"5`````$```1F````!@```ED````!```$;```
+M``8```);`````0``!'0````$```";`````,```1U````!````G@````#```$
+M=@````@```*$`````P``!'<````$```"G`````,```1X````!````J@````#
+M0P!R<&US86UP;&4`,2XP+C``,0!386UP;&4@9&%T82!O9B!24$T@9FEL=&5R
+M(&]F(&QI8F%R8VAI=F4`4V%M<&QE(&1A=&$N`````$L)MAUC=64M9&5S:W1O
+M<``````20E-$`%5N<W!E8VEF:65D`&AT='`Z+R]C;V1E+F=O;V=L92YC;VTO
+M<"]L:6)A<F-H:79E`&QI;G5X`&YO87)C:``````````&````!@````:!I(&D
+M@:0``````````5&!``%1@0`!48%B,3DT-F%C.3(T.3)D,C,T-V,V,C,U8C1D
+M,C8Q,3$X-`!B,3DT-F%C.3(T.3)D,C,T-V,V,C,U8C1D,C8Q,3$X-`!B,3DT
+M-F%C.3(T.3)D,C,T-V,V,C,U8C1D,C8Q,3$X-```````````````````````
+M`')O;W0`<F]O=`!R;V]T`')O;W0`<F]O=`!R;V]T`')P;7-A;7!L92TQ+C`N
+M,"TQ+G-R8RYR<&T`________________<G!M<V%M<&QE`````0``2@$``$IR
+M<&UL:6(H0V]M<')E<W-E9$9I;&5.86UE<RD`<G!M;&EB*%!A>6QO861&:6QE
+M<TAA=F50<F5F:7@I`#,N,"XT+3$`-"XP+3$`-"XW+C``````"`$```@!```(
+M`0``*H<``"J(```JB0`````````(,2XP+C`M,0````````````````!F:6QE
+M,0!F:6QE,@!F:6QE,P`O971C+P`M3S(@+6<@+6UA<F-H/6DS.#8@+6UT=6YE
+M/6DV.#8`8W!I;P!G>FEP`#D`;F]A<F-H+7)P;2UL:6YU>```````````````
+M```````!`````0````$`05-#24D@=&5X=`!D:7)E8W1O<GD`````````````
+M```````````````````````````_````!____/`````0'XL(```````"`S,P
+M-S`W,#0``J-$"W,0;6&8:&*`'8#4&9H:6AA"^690V@))'AM(AC'T]%-+DO73
+M,G-2#1D8&#)2<W+RN1@8#)#=8$$_-QCA<H,E_=Q@C-4-1`!BU:&#)!@C),C1
+3T\<U2%%1$>@$!@"1O'?9"`(`````
+`
+end
diff --git a/lib/libarchive/test/test_read_format_xar.c b/lib/libarchive/test/test_read_format_xar.c
new file mode 100644
index 0000000..a696677
--- /dev/null
+++ b/lib/libarchive/test/test_read_format_xar.c
@@ -0,0 +1,697 @@
+/*-
+ * Copyright (c) 2003-2007 Tim Kientzle
+ * Copyright (c) 2009 Michihiro NAKAJIMA
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR(S) ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+#include "test.h"
+__FBSDID("$FreeBSD$");
+
+#define UID 1001
+#define UNAME "cue"
+#define GID 1001
+#define GNAME "cue"
+
+/* Verify that a file records with hardlink.
+#How to make
+echo "hellohellohello" > f1
+chown $UNAME:$GNAME f1
+chmod 0644 f1
+ln f1 hardlink
+chown $UNAME:$GNAME hardlink
+chmod 0644 hardlink
+env TZ=utc touch -afm -t 197001020000.01 f1 hardlink
+xar -cf archive1.xar f1 hardlink
+od -t x1 archive1.xar | sed -E -e 's/^0[0-9]+//;s/^ //;s/( )([0-9a-f]{2})/0x\2,/g;$ D' > archive1.xar.txt
+*/
+static unsigned char archive1[] = {
+0x78,0x61,0x72,0x21,0x00,0x1c,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0xc6,
+0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x70,0x00,0x00,0x00,0x01,0x78,0xda,0xc4,0x54,
+0xc9,0x6e,0xdb,0x30,0x14,0xbc,0xe7,0x2b,0x08,0xdd,0x55,0xae,0xb6,0x45,0x83,0x56,
+0xd0,0x4b,0xd1,0x7b,0xd3,0x4b,0x6f,0x34,0x17,0x89,0x88,0x36,0x48,0x54,0xe0,0xe4,
+0xeb,0x4b,0x52,0x52,0x0c,0xa7,0x71,0x6f,0x45,0x01,0x01,0x1a,0x0e,0x87,0xa3,0xa7,
+0xf7,0x06,0x14,0x8f,0x97,0xb6,0x01,0x2f,0x66,0x9c,0x5c,0xdf,0x9d,0x32,0xfc,0x05,
+0x65,0xc0,0x74,0xaa,0xd7,0xae,0xab,0x4e,0xd9,0xcf,0xa7,0x6f,0x79,0x91,0x3d,0x96,
+0x0f,0xe2,0x22,0xc7,0xf2,0x01,0x08,0xdf,0xab,0xf0,0x02,0x42,0x8d,0x46,0xfa,0x70,
+0x22,0xf7,0xae,0x35,0x25,0x41,0x88,0xe7,0x98,0xe4,0x88,0x3c,0x61,0x7a,0xa4,0xe8,
+0x48,0xb9,0x80,0xb7,0x92,0x74,0xa8,0x36,0xea,0x79,0x9a,0x5b,0x30,0xf9,0xd7,0xc6,
+0x9c,0xb2,0xa9,0x96,0x38,0x8b,0x3b,0x40,0xf4,0xd6,0x4e,0xc6,0x97,0x48,0xc0,0x15,
+0x25,0x76,0x72,0x6f,0xd1,0x5c,0xc0,0x04,0xa2,0x05,0xdc,0x3c,0xd2,0xca,0xba,0xc6,
+0x00,0xa7,0x4f,0x19,0x59,0x6d,0xd4,0x9d,0x72,0xd8,0xaf,0x70,0x72,0xab,0x03,0x88,
+0x36,0x41,0xcc,0x0f,0x28,0x47,0x38,0xca,0x10,0x3a,0xc6,0x07,0x07,0x59,0x7b,0x95,
+0xc9,0x7b,0x3f,0x17,0x64,0xf2,0x2a,0xab,0xc6,0x7e,0x1e,0x4a,0x35,0x1b,0x01,0x17,
+0xb8,0xb0,0x4e,0x97,0x18,0x21,0x1c,0xc8,0x80,0x12,0x35,0x4f,0x66,0x5c,0x74,0x09,
+0x2d,0xdc,0xbb,0x6c,0xde,0x64,0x6d,0xaf,0x4d,0x89,0xf6,0x8c,0x85,0x62,0x22,0x4c,
+0xa4,0x7f,0x1d,0x0c,0x68,0x5c,0xf7,0x1c,0x66,0x94,0x95,0xb5,0x1c,0x75,0x5c,0x08,
+0x18,0xf9,0x45,0xd1,0xc9,0x50,0xd0,0x75,0x23,0x2d,0x53,0xcb,0x62,0x97,0x6e,0xdb,
+0xb5,0x75,0x5d,0x4b,0x2f,0x13,0x02,0xa2,0x31,0x5d,0xe5,0xeb,0x92,0x50,0x01,0x57,
+0xb8,0xf0,0xeb,0x38,0xc8,0xed,0x64,0xd6,0xd1,0xe0,0xfd,0x75,0x34,0x81,0xdb,0x72,
+0xb3,0xcd,0x57,0x0e,0x43,0xe3,0x54,0x0a,0x01,0xbc,0xe4,0xd5,0x9b,0x1b,0x32,0xb8,
+0x4a,0xe5,0xa8,0x6a,0xf7,0x62,0x74,0xfe,0x31,0x13,0x3f,0xbe,0x7f,0x0d,0xd5,0xd9,
+0x82,0x52,0x4d,0xac,0x56,0x98,0x53,0xc6,0xa9,0x3c,0xb3,0x82,0x4b,0x2d,0x09,0xb5,
+0x85,0x3d,0x70,0x6c,0xf7,0xc4,0x2a,0xba,0xe7,0x45,0x98,0xc3,0x47,0xa3,0xad,0x96,
+0x8b,0x1f,0xa5,0xf2,0x77,0xbf,0xb0,0xd3,0x07,0x76,0x56,0x67,0x75,0xe0,0x9a,0x5a,
+0x7e,0xb6,0x4c,0xda,0xe0,0xcd,0x8a,0xa2,0x40,0x86,0xed,0xc8,0x7e,0xc7,0xac,0x41,
+0x8a,0x87,0x1c,0xff,0xe9,0xb4,0x34,0x0f,0xbe,0x77,0xef,0x9f,0xc4,0xee,0x73,0xd9,
+0x7f,0x8c,0x5d,0x3f,0xba,0xca,0x75,0xb2,0xf9,0x4b,0xfa,0x2c,0xfe,0x24,0x77,0x41,
+0x15,0x2f,0x0d,0x01,0xd3,0x15,0xf2,0x1b,0x00,0x00,0xff,0xff,0x03,0x00,0x88,0x32,
+0x49,0x7b,0x67,0xbf,0xc6,0x01,0x29,0xf2,0x1c,0x40,0x05,0x3c,0x49,0x25,0x9f,0xab,
+0x7c,0x8e,0xc5,0xa5,0x79,0xe0,0x78,0xda,0xca,0x48,0xcd,0xc9,0xc9,0xcf,0x80,0x13,
+0x5c,0x00,0x00,0x00,0x00,0xff,0xff,0x03,0x00,0x37,0xf7,0x06,0x47
+};
+
+static void verify0(struct archive *a, struct archive_entry *ae)
+{
+ const void *p;
+ size_t size;
+ off_t offset;
+
+ assert(archive_entry_filetype(ae) == AE_IFREG);
+ assertEqualInt(archive_entry_mode(ae) & 0777, 0644);
+ assertEqualInt(archive_entry_uid(ae), UID);
+ assertEqualInt(archive_entry_gid(ae), GID);
+ assertEqualString(archive_entry_uname(ae), UNAME);
+ assertEqualString(archive_entry_gname(ae), GNAME);
+ assertEqualString(archive_entry_pathname(ae), "f1");
+ assert(archive_entry_hardlink(ae) == NULL);
+ assert(archive_entry_symlink(ae) == NULL);
+ assertEqualInt(archive_entry_mtime(ae), 86401);
+ assertEqualInt(archive_entry_size(ae), 16);
+ assertEqualInt(archive_read_data_block(a, &p, &size, &offset), 0);
+ assertEqualInt((int)size, 16);
+ assertEqualInt((int)offset, 0);
+ assertEqualInt(memcmp(p, "hellohellohello\n", 16), 0);
+}
+
+static void verify1(struct archive *a, struct archive_entry *ae)
+{
+ (void)a; /* UNUSED */
+ /* A hardlink is not a symlink. */
+ assert(archive_entry_filetype(ae) != AE_IFLNK);
+ /* Nor is it a directory. */
+ assert(archive_entry_filetype(ae) != AE_IFDIR);
+ assertEqualInt(archive_entry_mode(ae) & 0777, 0644);
+ assertEqualInt(archive_entry_uid(ae), UID);
+ assertEqualInt(archive_entry_gid(ae), GID);
+ assertEqualString(archive_entry_uname(ae), UNAME);
+ assertEqualString(archive_entry_gname(ae), GNAME);
+ assertEqualString(archive_entry_pathname(ae), "hardlink");
+ assertEqualString(archive_entry_hardlink(ae), "f1");
+ assert(archive_entry_symlink(ae) == NULL);
+ assertEqualInt(archive_entry_mtime(ae), 86401);
+ assertEqualInt(archive_entry_nlink(ae), 2);
+}
+
+/* Verify that symlinks are read correctly.
+#How to make
+echo "hellohellohello" > f1
+chown $UNAME:$GNAME f1
+chmod 0644 f1
+ln -s f1 symlink
+chown $UNAME:$GNAME symlink
+chmod 0644 symlink
+env TZ=utc touch -afm -t 197001020000.01 f1 symlink
+xar -cf archive2.xar f1 symlink
+od -t x1 archive2.xar | sed -E -e 's/^0[0-9]+//;s/^ //;s/( )([0-9a-f]{2})/0x\2,/g;$ D' > archive2.xar.txt
+*/
+static unsigned char archive2[] = {
+0x78,0x61,0x72,0x21,0x00,0x1c,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0xe8,
+0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x84,0x00,0x00,0x00,0x01,0x78,0xda,0xb4,0x54,
+0xcb,0x6e,0xa3,0x30,0x14,0xdd,0xf7,0x2b,0x90,0xf7,0x8c,0x1f,0x40,0x82,0x23,0xe3,
+0xaa,0x9b,0x6a,0xf6,0xd3,0xd9,0xcc,0xce,0xf1,0x83,0x58,0xe5,0x25,0x70,0xaa,0xa4,
+0x5f,0x3f,0xb6,0x09,0x4d,0xd3,0x30,0xdd,0x8d,0x84,0xc4,0xf5,0xf1,0xb9,0xc7,0x97,
+0x7b,0x0f,0x66,0x8f,0xa7,0xb6,0x49,0xde,0xf4,0x38,0xd9,0xbe,0xab,0x00,0xfe,0x81,
+0x40,0xa2,0x3b,0xd9,0x2b,0xdb,0xd5,0x15,0xf8,0xfd,0xf2,0x9c,0x96,0xe0,0x91,0x3f,
+0xb0,0x93,0x18,0xf9,0x43,0xc2,0x5c,0x2f,0xfd,0x2b,0x61,0x72,0xd4,0xc2,0xf9,0x8c,
+0xd4,0xd9,0x56,0x73,0x82,0x10,0x4d,0x31,0x49,0x11,0x79,0xc1,0xd9,0x2e,0x2b,0x76,
+0xb8,0x60,0xf0,0x96,0x12,0x93,0x0e,0x5a,0xbe,0x4e,0xc7,0x36,0x99,0xdc,0xb9,0xd1,
+0x15,0x98,0x0e,0x02,0x83,0xb0,0x93,0xb0,0xde,0x98,0x49,0x3b,0x8e,0x18,0xbc,0x44,
+0x11,0x9d,0xec,0x7b,0x10,0x67,0x30,0x06,0x41,0x02,0x2e,0x1a,0x71,0x65,0x6c,0xa3,
+0x13,0xab,0x2a,0x40,0x2e,0x32,0xf2,0xae,0x1c,0xb4,0xcb,0xd1,0x0e,0xd1,0x3f,0x3e,
+0x73,0xa9,0x23,0x61,0xed,0x37,0xb4,0xf6,0x4a,0x13,0xdf,0xd0,0xc4,0x95,0x56,0x8f,
+0xfd,0x71,0xe0,0xf2,0xa8,0x19,0x9c,0xc3,0x19,0xb5,0x8a,0x63,0x84,0xb0,0x07,0x7d,
+0x14,0xa1,0xe3,0xa4,0xc7,0x99,0x17,0xa3,0x19,0xfb,0xa0,0x1d,0x17,0x5a,0xdb,0x2b,
+0xcd,0xd1,0xb6,0xf0,0x3d,0x8c,0x61,0x04,0x1b,0xdb,0xbd,0x26,0xee,0x3c,0xf8,0xb6,
+0x85,0xaf,0x06,0xdc,0xf8,0x94,0x00,0xce,0xdb,0x61,0x87,0x4f,0xe7,0x36,0x20,0x0c,
+0xc6,0x55,0xc4,0x3b,0xd1,0x7e,0xc2,0xe3,0x2a,0xb6,0x31,0x68,0xdc,0xb6,0x70,0x99,
+0x84,0x12,0x4e,0xc4,0xc8,0x9f,0xa9,0xbb,0xda,0x1d,0x38,0xc9,0xfc,0x49,0x73,0x38,
+0xe3,0x97,0x11,0x91,0xdb,0x69,0x5d,0xc6,0x85,0x37,0xd7,0x71,0x79,0x6c,0xf1,0xd2,
+0x32,0x73,0x31,0x0c,0x8d,0x95,0xd1,0x18,0xf0,0x94,0xd6,0xef,0x76,0x00,0xf0,0x42,
+0x15,0xa3,0x3c,0xd8,0x37,0xad,0xd2,0xaf,0x3e,0xf9,0xf5,0xf3,0xc9,0x57,0x67,0xca,
+0x2c,0x53,0xc4,0x28,0x89,0x69,0x96,0xd3,0x4c,0xec,0xf3,0x92,0x0a,0x25,0x48,0x66,
+0x4a,0xb3,0xa5,0xd8,0x6c,0x88,0x91,0xd9,0x86,0x96,0x7e,0x36,0x5f,0x85,0x96,0x5a,
+0x4e,0x6e,0x14,0xd2,0xfd,0xf3,0x84,0x42,0x6d,0xf3,0xbd,0xdc,0xcb,0x2d,0x55,0x99,
+0xa1,0x7b,0x93,0x0b,0xe3,0xb5,0xf3,0xb2,0x2c,0x91,0xce,0x0b,0xb2,0x29,0x72,0xa3,
+0x91,0xa4,0x94,0xc1,0x7b,0xa5,0xb9,0x79,0xf0,0xa3,0x7b,0x2b,0x56,0x9c,0xff,0x0c,
+0xb2,0x66,0x45,0x4c,0xb7,0x28,0x45,0x38,0xd0,0x90,0x37,0x98,0x7f,0xf0,0x9a,0x15,
+0xd7,0x69,0xff,0xdd,0x8a,0x9b,0x3c,0xff,0x6c,0xc5,0xe0,0xae,0x24,0x18,0xaa,0x02,
+0xfd,0x68,0x6b,0xdb,0x89,0x06,0xf0,0x83,0x18,0xd5,0xaa,0xf9,0x82,0x4f,0xef,0x7c,
+0xe7,0x59,0xe1,0x22,0x61,0x30,0x5e,0x2b,0x7f,0x01,0x00,0x00,0xff,0xff,0x03,0x00,
+0x2b,0xab,0x4f,0xf9,0xbb,0xf7,0x90,0xb5,0x34,0x8f,0x7c,0xae,0x72,0xa0,0x80,0xd2,
+0x69,0xc7,0xa2,0xe7,0x44,0x53,0xeb,0x75,0x78,0xda,0xca,0x48,0xcd,0xc9,0xc9,0xcf,
+0x80,0x13,0x5c,0x00,0x00,0x00,0x00,0xff,0xff,0x03,0x00,0x37,0xf7,0x06,0x47
+};
+
+static void verify2(struct archive *a, struct archive_entry *ae)
+{
+ (void)a; /* UNUSED */
+ assertEqualInt(archive_entry_filetype(ae), AE_IFLNK);
+ assertEqualInt(archive_entry_mode(ae) & 0777, 0755);
+ assertEqualInt(archive_entry_uid(ae), UID);
+ assertEqualInt(archive_entry_gid(ae), GID);
+ assertEqualString(archive_entry_uname(ae), UNAME);
+ assertEqualString(archive_entry_gname(ae), GNAME);
+ assertEqualString(archive_entry_pathname(ae), "symlink");
+ assertEqualString(archive_entry_symlink(ae), "f1");
+ assert(archive_entry_hardlink(ae) == NULL);
+}
+
+/* Character device node.
+#How to make
+mknod devchar c 0 30
+chown $UNAME:$GNAME devchar
+chmod 0644 devchar
+env TZ=utc touch -afm -t 197001020000.01 devchar
+xar -cf archive3.xar devchar
+od -t x1 archive3.xar | sed -E -e 's/^0[0-9]+//;s/^ //;s/( )([0-9a-f]{2})/0x\2,/g;$ D' > archive3.xar.txt
+*/
+static unsigned char archive3[] = {
+0x78,0x61,0x72,0x21,0x00,0x1c,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x38,
+0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x3b,0x00,0x00,0x00,0x01,0x78,0xda,0x7c,0x92,
+0x4d,0x6e,0xc3,0x20,0x10,0x85,0xf7,0x39,0x05,0xf2,0xde,0x05,0x9c,0x9f,0x36,0xd6,
+0x84,0xec,0x7a,0x82,0x74,0xd3,0x1d,0xc2,0x93,0x98,0xd4,0x36,0x11,0xe0,0x28,0xe9,
+0xe9,0x0b,0xe3,0xa4,0x69,0xa5,0xaa,0x92,0x25,0x1e,0x8f,0xef,0x8d,0x86,0xc1,0xb0,
+0xbd,0xf4,0x1d,0x3b,0xa3,0x0f,0xd6,0x0d,0x9b,0x42,0x3e,0x89,0x82,0xe1,0x60,0x5c,
+0x63,0x87,0xc3,0xa6,0x78,0xdb,0xbd,0x96,0x2f,0xc5,0x56,0xcd,0xe0,0xa2,0xbd,0x9a,
+0x31,0x88,0xce,0xa4,0x85,0x81,0xf1,0xa8,0x63,0x4a,0x94,0xd1,0xf6,0xa8,0x2a,0x21,
+0xd6,0xa5,0xac,0x4a,0x51,0xed,0xa4,0xa8,0xab,0x79,0x2d,0x57,0xc0,0x7f,0x23,0x14,
+0x6a,0xd1,0x7c,0x84,0xb1,0x67,0x21,0x5e,0x3b,0xdc,0x14,0xa1,0xd5,0xb2,0xc8,0x27,
+0x0c,0xdc,0x7e,0x1f,0x30,0x2a,0x01,0xfc,0xa6,0xc8,0x0d,0xf6,0x33,0x17,0x07,0x4e,
+0x22,0x97,0xe0,0xf7,0x1a,0xb4,0xdb,0xdb,0x0e,0x99,0x6d,0x52,0xdb,0xb7,0x32,0xe6,
+0xaf,0x76,0xaa,0x7a,0xb9,0x7c,0x4f,0xc9,0x7b,0x1f,0x0c,0x7a,0x92,0x72,0xfd,0x2c,
+0x4a,0x21,0x33,0x26,0x44,0x9d,0x3f,0x99,0xb0,0xfe,0x81,0xe9,0x7f,0x30,0xfd,0xc0,
+0x0e,0xde,0x8d,0x27,0x65,0x46,0x04,0x3e,0xc9,0xc9,0xb5,0x8d,0x92,0x42,0xc8,0x64,
+0x26,0x45,0xd6,0x18,0xd0,0x4f,0x1c,0xa9,0xc9,0xfb,0xc6,0xc6,0x3b,0xd6,0xbb,0x06,
+0x95,0x58,0x2d,0x16,0xa9,0x99,0x2c,0xc9,0x6c,0xf0,0x6c,0xcd,0xa4,0x13,0x61,0x07,
+0xe7,0xd5,0x3c,0x0d,0x66,0x52,0x37,0x57,0x1f,0x93,0xce,0x26,0x09,0x8a,0xf1,0x1f,
+0x39,0x88,0xd7,0x13,0x2a,0xd3,0x6a,0xaf,0x4d,0x44,0xcf,0xc2,0x09,0x8d,0xd5,0x1d,
+0x70,0xf2,0x89,0x18,0x74,0xba,0x54,0x8a,0x64,0x08,0x38,0xed,0x68,0xea,0x79,0xd0,
+0xf9,0xf9,0x39,0xbd,0x3f,0x70,0xfa,0x1b,0xbe,0x00,0x00,0x00,0xff,0xff,0x03,0x00,
+0xab,0x43,0xa3,0xac,0x76,0x40,0x1e,0x8b,0x95,0x0d,0x28,0x79,0x79,0x43,0x49,0x4e,
+0x16,0xa1,0x56,0x99,0x1f,0x83,0x77,0x41
+};
+
+static void verify3(struct archive *a, struct archive_entry *ae)
+{
+ (void)a; /* UNUSED */
+ assertEqualInt(archive_entry_filetype(ae), AE_IFCHR);
+ assertEqualInt(archive_entry_mode(ae) & 0777, 0644);
+ assertEqualInt(archive_entry_uid(ae), UID);
+ assertEqualInt(archive_entry_gid(ae), GID);
+ assertEqualString(archive_entry_uname(ae), UNAME);
+ assertEqualString(archive_entry_gname(ae), GNAME);
+ assertEqualString(archive_entry_pathname(ae), "devchar");
+ assert(archive_entry_symlink(ae) == NULL);
+ assert(archive_entry_hardlink(ae) == NULL);
+ assertEqualInt(archive_entry_mtime(ae), 86401);
+}
+
+/* Block device node.
+#How to make
+mknod devblock b 0 30
+chown $UNAME:$GNAME devblock
+chmod 0644 devblock
+env TZ=utc touch -afm -t 197001020000.01 devblock
+xar -cf archive4.xar devblock
+od -t x1 archive4.xar | sed -E -e 's/^0[0-9]+//;s/^ //;s/( )([0-9a-f]{2})/0x\2,/g;$ D' > archive4.xar.txt
+*/
+static unsigned char archive4[] = {
+0x78,0x61,0x72,0x21,0x00,0x1c,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x34,
+0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x38,0x00,0x00,0x00,0x01,0x78,0xda,0x7c,0x92,
+0xc1,0x6e,0xc2,0x30,0x0c,0x86,0xef,0x3c,0x45,0xd4,0x7b,0x17,0x07,0xd0,0x0a,0x95,
+0x09,0xb7,0x3d,0x01,0xbb,0xec,0x96,0xa5,0x06,0x32,0xda,0xa6,0x6a,0x5a,0x04,0x7b,
+0xfa,0x25,0x2e,0x8c,0x4d,0x9a,0x26,0x55,0xea,0x97,0x3f,0x9f,0x2d,0x37,0x29,0x6e,
+0x2f,0x4d,0x2d,0xce,0xd4,0x07,0xe7,0xdb,0x4d,0xa6,0x9e,0x20,0x13,0xd4,0x5a,0x5f,
+0xb9,0xf6,0xb0,0xc9,0x5e,0x77,0x2f,0xf9,0x2a,0xdb,0xea,0x19,0x5e,0x4c,0xaf,0x67,
+0x02,0x07,0x6f,0xe3,0x4b,0xa0,0xed,0xc9,0x0c,0xb1,0x22,0x1f,0x5c,0x43,0x7a,0x0e,
+0xb0,0xce,0xd5,0x3c,0x87,0xf9,0x4e,0x41,0xb9,0x58,0x95,0xaa,0x40,0xf9,0x5b,0xe1,
+0xa2,0x23,0xd9,0x53,0x18,0x1b,0x11,0x86,0x6b,0x4d,0x9b,0x2c,0x1c,0x8d,0xca,0xd2,
+0x8e,0x40,0xbf,0xdf,0x07,0x1a,0x34,0xa0,0xbc,0x11,0xa7,0xc1,0x7d,0xa6,0xe6,0x28,
+0x19,0x52,0x0b,0x79,0xef,0xc1,0xab,0xbd,0xab,0x49,0xb8,0x2a,0x8e,0x7d,0x6b,0x63,
+0xff,0x1e,0x07,0x8a,0xb7,0x58,0x79,0x9f,0x43,0x60,0xc3,0xa8,0xd6,0x05,0xe4,0xa0,
+0x92,0x06,0x50,0xa6,0x47,0x45,0xad,0x79,0x68,0xe6,0x1f,0xcd,0x3c,0xb4,0x43,0xef,
+0xc7,0x4e,0xdb,0x91,0x50,0x4e,0x38,0xa5,0xae,0xd2,0x0a,0x40,0xc5,0x30,0x12,0x47,
+0x63,0xa0,0x7e,0xf2,0x98,0xa6,0xec,0x5b,0x1b,0xef,0x5a,0xe3,0x2b,0xd2,0xf0,0xbc,
+0x5c,0xc6,0x61,0x12,0x72,0x58,0xd1,0xd9,0xd9,0x89,0xa3,0xe1,0x5a,0xdf,0xeb,0x45,
+0x3c,0x98,0x89,0x6e,0xa9,0xf9,0x88,0x9c,0x42,0x06,0x2e,0x93,0x3f,0xea,0x70,0xb8,
+0x76,0xa4,0xdf,0x6b,0x6f,0x4f,0x22,0x74,0x64,0x9d,0xa9,0x51,0x72,0xc6,0xbb,0xad,
+0x89,0x1f,0x14,0x75,0x16,0x50,0xf2,0x92,0x8f,0x3c,0x9d,0x72,0xba,0x7b,0xc9,0x97,
+0x8f,0x92,0x7f,0x85,0x2f,0x00,0x00,0x00,0xff,0xff,0x03,0x00,0xbe,0x66,0xa2,0x82,
+0x3a,0x54,0xd3,0x61,0xaa,0x8e,0x30,0x4c,0xc8,0x36,0x3b,0x7a,0xa4,0xb9,0xef,0xfc,
+0x7a,0x5d,0x21,0xde
+};
+
+static void verify4(struct archive *a, struct archive_entry *ae)
+{
+ (void)a; /* UNUSED */
+ assertEqualInt(archive_entry_filetype(ae), AE_IFBLK);
+ assertEqualInt(archive_entry_mode(ae) & 0777, 0644);
+ assertEqualInt(archive_entry_uid(ae), UID);
+ assertEqualInt(archive_entry_gid(ae), GID);
+ assertEqualString(archive_entry_uname(ae), UNAME);
+ assertEqualString(archive_entry_gname(ae), GNAME);
+ assertEqualString(archive_entry_pathname(ae), "devblock");
+ assert(archive_entry_symlink(ae) == NULL);
+ assert(archive_entry_hardlink(ae) == NULL);
+ assertEqualInt(archive_entry_mtime(ae), 86401);
+}
+
+/* Directory.
+#How to make
+mkdir dir1
+chown $UNAME:$GNAME dir1
+chmod 0755 dir1
+env TZ=utc touch -afm -t 197001020000.01 dir1
+xar -cf archive5.xar dir1
+od -t x1 archive5.xar | sed -E -e 's/^0[0-9]+//;s/^ //;s/( )([0-9a-f]{2})/0x\2,/g;$ D' > archive5.xar.txt
+*/
+static unsigned char archive5[] = {
+0x78,0x61,0x72,0x21,0x00,0x1c,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x16,
+0x00,0x00,0x00,0x00,0x00,0x00,0x01,0xec,0x00,0x00,0x00,0x01,0x78,0xda,0x74,0x91,
+0xc1,0x6e,0xc2,0x30,0x0c,0x86,0xef,0x3c,0x45,0xd4,0x7b,0x17,0xa7,0x83,0x31,0xaa,
+0x34,0xdc,0xf6,0x04,0xec,0xb2,0x5b,0x95,0x1a,0x88,0x68,0x1a,0x94,0xa4,0x13,0xdd,
+0xd3,0x2f,0x71,0xe9,0xd0,0xa4,0x4d,0xaa,0xd4,0x3f,0xbf,0x3f,0xff,0xb2,0x6c,0xb9,
+0xbf,0xd9,0x9e,0x7d,0xa2,0x0f,0xc6,0x0d,0x4d,0x21,0x9e,0xa0,0x60,0x38,0x68,0xd7,
+0x99,0xe1,0xd4,0x14,0xef,0x87,0xb7,0xf2,0xb5,0xd8,0xab,0x95,0xbc,0xb5,0x5e,0xad,
+0x98,0x8c,0x4e,0xa7,0x1f,0x93,0xda,0x63,0x1b,0x53,0x47,0x19,0x8d,0x45,0x55,0x01,
+0xec,0x4a,0x51,0x95,0x50,0x1d,0x04,0xd4,0x6b,0x51,0xaf,0x37,0x92,0xff,0x46,0xa8,
+0xe9,0x8c,0xfa,0x12,0x46,0xcb,0x42,0x9c,0x7a,0x6c,0x8a,0x70,0x6e,0x45,0x91,0x2b,
+0x4c,0xba,0xe3,0x31,0x60,0x54,0x20,0xf9,0x5d,0x91,0x1b,0xcc,0x57,0x0e,0x97,0x9c,
+0x44,0x8e,0xe0,0x4b,0x06,0xbd,0x8e,0xa6,0x47,0x66,0xba,0x34,0xf6,0x3d,0x46,0xff,
+0x3d,0xce,0x33,0x7c,0xa4,0xce,0x65,0x0e,0x26,0x2d,0x49,0xb1,0xdb,0x42,0x09,0x22,
+0x63,0x00,0x75,0xfe,0x44,0xc2,0xec,0x03,0x6b,0xff,0x49,0x7b,0x49,0x58,0xfb,0xc0,
+0x4e,0xde,0x8d,0x57,0xa5,0x47,0x94,0x7c,0x96,0xb3,0x6b,0x3a,0x25,0x00,0x44,0x32,
+0x93,0x22,0x6b,0x0c,0xe8,0x67,0x8e,0xd4,0xec,0xfd,0x60,0xe3,0x82,0x59,0xd7,0xa1,
+0x82,0xed,0x26,0xed,0x90,0x24,0x99,0x71,0xba,0xa2,0xea,0x8c,0x47,0x1d,0x9d,0x9f,
+0x24,0xa7,0x37,0x55,0x86,0xd6,0x52,0x25,0x45,0x90,0xa4,0x35,0xe5,0xcd,0xe4,0x7b,
+0x71,0x3a,0x98,0xe4,0x74,0xbe,0x6f,0x00,0x00,0x00,0xff,0xff,0x03,0x00,0x23,0x7a,
+0x8c,0x2f,0x78,0xe9,0x69,0x28,0x93,0x14,0x72,0x68,0x8d,0xeb,0x42,0x7b,0xf6,0x0f,
+0x70,0x64,0xa3,0xff,0xb9,0x35
+};
+
+static void verify5(struct archive *a, struct archive_entry *ae)
+{
+ (void)a; /* UNUSED */
+ assertEqualInt(archive_entry_filetype(ae), AE_IFDIR);
+ assertEqualInt(archive_entry_mtime(ae), 86401);
+ assertEqualInt(archive_entry_mode(ae) & 0777, 0755);
+ assertEqualInt(archive_entry_uid(ae), UID);
+ assertEqualInt(archive_entry_gid(ae), GID);
+ assertEqualString(archive_entry_uname(ae), UNAME);
+ assertEqualString(archive_entry_gname(ae), GNAME);
+}
+
+/* fifo
+#How to make
+mkfifo -m 0755 fifo
+chown $UNAME:$GNAME fifo
+env TZ=utc touch -afm -t 197001020000.01 fifo
+xar -cf archive6.xar fifo
+od -t x1 archive6.xar | sed -E -e 's/^0[0-9]+//;s/^ //;s/( )([0-9a-f]{2})/0x\2,/g;$ D' > archive6.xar.txt
+*/
+static unsigned char archive6[] = {
+0x78,0x61,0x72,0x21,0x00,0x1c,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x0e,
+0x00,0x00,0x00,0x00,0x00,0x00,0x01,0xe7,0x00,0x00,0x00,0x01,0x78,0xda,0x7c,0x91,
+0xc1,0x6e,0xc3,0x20,0x0c,0x86,0xef,0x7d,0x0a,0xc4,0x3d,0xc3,0x64,0xab,0xda,0x46,
+0x94,0xde,0xf6,0x04,0xdd,0x65,0x37,0x44,0x9c,0x16,0x2d,0x84,0x2a,0x90,0xa9,0xdd,
+0xd3,0x0f,0x9c,0x66,0xd5,0xa4,0x69,0x12,0x52,0xbe,0xfc,0x7c,0xb6,0x2c,0xac,0x0e,
+0x57,0xdf,0xb3,0x4f,0x1c,0xa3,0x0b,0xc3,0x9e,0xcb,0x27,0xe0,0x0c,0x07,0x1b,0x5a,
+0x37,0x9c,0xf6,0xfc,0xed,0xf8,0x5a,0x6d,0xf9,0x41,0xaf,0xd4,0xd5,0x8c,0x7a,0xc5,
+0x54,0x0a,0x36,0x7f,0x98,0xb2,0x23,0x9a,0x94,0x2b,0xaa,0xe4,0x3c,0xea,0x1a,0x60,
+0x57,0xc9,0xba,0x82,0xfa,0x28,0x65,0xf3,0x02,0x4d,0xbd,0x55,0xe2,0xb7,0x42,0x45,
+0x67,0xb4,0x1f,0x71,0xf2,0x2c,0xa6,0x5b,0x8f,0x7b,0x1e,0xcf,0x46,0xf2,0x72,0xc3,
+0x54,0xe8,0xba,0x88,0x49,0x83,0x12,0x77,0xa2,0x34,0xba,0xaf,0xd2,0x5c,0x09,0x82,
+0xd2,0x42,0x2c,0x3d,0xe8,0xaf,0x73,0x3d,0x32,0xd7,0xe6,0xb1,0xef,0x6d,0xec,0xdf,
+0xe3,0xc8,0xe7,0xf7,0x5c,0xb9,0xcc,0xc1,0x94,0x27,0x94,0xbb,0x0d,0x54,0x20,0x8b,
+0x06,0xd0,0x94,0x23,0xb3,0xe6,0x1f,0x9a,0xf9,0x47,0x33,0x0f,0xed,0x34,0x86,0xe9,
+0xa2,0xed,0x84,0x4a,0xcc,0x38,0xa7,0xae,0xd5,0x12,0x40,0xe6,0x30,0x13,0x45,0x53,
+0xc4,0x71,0xf6,0x88,0xe6,0xec,0x47,0x9b,0x16,0xcd,0x87,0x16,0x35,0x6c,0xd6,0xeb,
+0x3c,0x4c,0x41,0x0a,0xd3,0xed,0x82,0xba,0x73,0x5d,0x50,0x82,0x90,0xc2,0xc1,0xf8,
+0x25,0x24,0xa4,0x17,0x2a,0x8f,0x52,0x56,0x25,0x68,0x57,0x4a,0xd0,0xe6,0xbe,0x01,
+0x00,0x00,0xff,0xff,0x03,0x00,0x44,0x19,0x8a,0x2a,0x82,0xbc,0x8c,0xae,0x97,0xa7,
+0x7d,0x65,0xa5,0x82,0xdb,0xaa,0xc2,0xcb,0xbe,0xf0,0x1f,0xd1,0xf9,0x56
+};
+
+static void verify6(struct archive *a, struct archive_entry *ae)
+{
+ (void)a; /* UNUSED */
+ assertEqualInt(archive_entry_filetype(ae), AE_IFIFO);
+ assertEqualInt(archive_entry_mode(ae) & 0777, 0755);
+ assertEqualInt(archive_entry_uid(ae), UID);
+ assertEqualInt(archive_entry_gid(ae), GID);
+ assertEqualString(archive_entry_uname(ae), UNAME);
+ assertEqualString(archive_entry_gname(ae), GNAME);
+ assertEqualString(archive_entry_pathname(ae), "fifo");
+ assert(archive_entry_symlink(ae) == NULL);
+ assert(archive_entry_hardlink(ae) == NULL);
+ assertEqualInt(archive_entry_mtime(ae), 86401);
+}
+
+/* Verify that a file records with directory name.
+#How to make
+mkdir dir1
+echo "hellohellohello" > dir1/f1
+chown $UNAME:$GNAME dir1/f1
+chmod 0644 dir1/f1
+env TZ=utc touch -afm -t 197001020000.01 dir1/f1
+xar -cf archive7.xar dir1/f1
+od -t x1 archive7.xar | sed -E -e 's/^0[0-9]+//;s/^ //;s/( )([0-9a-f]{2})/0x\2,/g;$ D' > archive7.xar.txt
+*/
+
+static unsigned char archive7[] = {
+0x78,0x61,0x72,0x21,0x00,0x1c,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0xbb,
+0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x8a,0x00,0x00,0x00,0x01,0x78,0xda,0x7c,0x53,
+0xc9,0x6e,0xdb,0x30,0x14,0xbc,0xe7,0x2b,0x04,0xdd,0x55,0x2e,0xa2,0x16,0x1a,0xb4,
+0x82,0x5e,0x8a,0xdc,0x93,0x5e,0x7a,0xa3,0xb9,0xd8,0x44,0xb5,0x41,0xa2,0x02,0x3b,
+0x5f,0x5f,0x92,0xa2,0x1c,0xbb,0x59,0x00,0x01,0x1a,0x3e,0xce,0x1b,0x0d,0x9f,0x86,
+0xec,0xf1,0xdc,0xb5,0xc9,0xab,0x9a,0x66,0x33,0xf4,0xfb,0x14,0xfd,0x80,0x69,0xa2,
+0x7a,0x31,0x48,0xd3,0x1f,0xf7,0xe9,0xef,0x97,0x5f,0x59,0x9d,0x3e,0x36,0x0f,0xec,
+0xcc,0xa7,0xe6,0x21,0x61,0x76,0x10,0xee,0x95,0x30,0x31,0x29,0x6e,0x5d,0x47,0x66,
+0x4d,0xa7,0x1a,0x0c,0x21,0xcd,0x10,0xce,0x20,0x7e,0x41,0x68,0x57,0xe0,0x5d,0x51,
+0x31,0x70,0x4f,0x09,0x4d,0x27,0x25,0xfe,0xce,0x4b,0x97,0xcc,0xf6,0xd2,0xaa,0x7d,
+0x3a,0x9f,0x38,0x4a,0xfd,0x4e,0xc2,0x06,0xad,0x67,0x65,0x1b,0xc8,0x40,0x44,0xa1,
+0x3a,0x9b,0x37,0x2f,0xce,0x40,0x00,0x5e,0x02,0x6c,0x1a,0x61,0xa5,0x4d,0xab,0x12,
+0x23,0x9d,0xed,0x28,0x63,0x2f,0xa3,0x6a,0xa4,0x99,0x94,0xb0,0xc3,0x74,0x61,0x20,
+0xac,0xc3,0x4e,0xcf,0xbb,0xb0,0x83,0x18,0x08,0x30,0x14,0xaf,0xfd,0x78,0xed,0x4f,
+0x98,0xe4,0x96,0xaf,0x30,0x61,0xad,0xea,0x8f,0xf6,0xd4,0xe0,0x9c,0x81,0x08,0xe3,
+0x46,0xb4,0x88,0xef,0xdd,0x6e,0x7e,0x51,0xf9,0xee,0xd7,0x17,0xb7,0x69,0x6e,0xa7,
+0xe6,0xe3,0xd8,0x1a,0x11,0x46,0x03,0xce,0xd9,0xf1,0xcd,0x8c,0x29,0xd8,0xb8,0x7c,
+0x12,0x27,0xf3,0xaa,0x64,0xf6,0xff,0xa8,0x9e,0x9f,0x7e,0xba,0x33,0xea,0x3a,0xcf,
+0x25,0xd6,0x52,0x20,0x9a,0x13,0x9a,0xf3,0x03,0xa9,0x29,0x97,0x1c,0xe7,0xba,0xd6,
+0x15,0x45,0xba,0xc4,0x5a,0xe4,0x25,0xad,0x19,0xf8,0x20,0x74,0x75,0x73,0xb6,0x13,
+0x17,0xf6,0xcb,0x4f,0x14,0xb2,0x22,0x07,0x71,0x10,0x15,0x95,0xb9,0xa6,0x07,0x4d,
+0xb8,0x76,0xe2,0xa4,0xae,0x6b,0xa8,0x48,0x81,0xcb,0x82,0x68,0x05,0x05,0xa5,0x0c,
+0x7c,0x54,0x8a,0x33,0x04,0xef,0x43,0x64,0xe2,0xf3,0x7c,0x90,0xfa,0x8f,0xfb,0x95,
+0x5b,0x30,0x1c,0xaf,0x0b,0x18,0xd1,0x0a,0x66,0x10,0x79,0x1e,0x84,0x3b,0xff,0x20,
+0xc7,0xeb,0x6e,0x78,0xfc,0x1b,0x1e,0xbf,0xe1,0x1d,0xa7,0x61,0x19,0x1b,0xb1,0x28,
+0x06,0x56,0x18,0xcb,0x46,0x36,0x08,0x42,0x17,0x02,0x8f,0xd6,0xda,0x32,0xab,0x69,
+0x65,0x06,0x14,0x8b,0x57,0xe2,0x72,0x25,0x76,0x83,0x54,0x0d,0x2c,0x09,0x71,0x96,
+0x3c,0x5c,0xab,0x21,0x62,0x3e,0x48,0x37,0x69,0x8b,0x71,0xd3,0x77,0x61,0x03,0x9e,
+0xb4,0x86,0x38,0x22,0xd7,0xe1,0xaf,0x13,0x03,0xe1,0x72,0xfd,0x03,0x00,0x00,0xff,
+0xff,0x03,0x00,0x8d,0xb1,0x06,0x76,0xa6,0x7a,0xc3,0xbb,0x13,0x3d,0x45,0xe2,0x2b,
+0x3b,0xd0,0x88,0xc7,0x58,0x7b,0xbd,0x30,0x9d,0x01,0x44,0x78,0xda,0xca,0x48,0xcd,
+0xc9,0xc9,0xcf,0x80,0x13,0x5c,0x00,0x00,0x00,0x00,0xff,0xff,0x03,0x00,0x37,0xf7,
+0x06,0x47
+};
+
+static void verify7(struct archive *a, struct archive_entry *ae)
+{
+ (void)a; /* UNUSED */
+ assert(archive_entry_filetype(ae) == AE_IFREG);
+ assertEqualInt(archive_entry_mode(ae) & 0777, 0644);
+ assertEqualInt(archive_entry_uid(ae), UID);
+ assertEqualInt(archive_entry_gid(ae), GID);
+ assertEqualString(archive_entry_uname(ae), UNAME);
+ assertEqualString(archive_entry_gname(ae), GNAME);
+ assertEqualString(archive_entry_pathname(ae), "dir1/f1");
+ assert(archive_entry_hardlink(ae) == NULL);
+ assert(archive_entry_symlink(ae) == NULL);
+ assertEqualInt(archive_entry_mtime(ae), 86401);
+}
+
+/* Verify that a file records with bzip2 compression
+#How to make
+echo "hellohellohello" > f1
+chown $UNAME:$GNAME f1
+chmod 0644 f1
+env TZ=utc touch -afm -t 197001020000.01 f1
+xar --compression bzip2 -cf archive8.xar f1
+od -t x1 archive8.xar | sed -E -e 's/^0[0-9]+//;s/^ //;s/( )([0-9a-f]{2})/0x\2,/g;$ D' > archive8.xar.txt
+*/
+
+static unsigned char archive8[] = {
+0x78,0x61,0x72,0x21,0x00,0x1c,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0xb1,
+0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x42,0x00,0x00,0x00,0x01,0x78,0xda,0x7c,0x53,
+0xcb,0x6e,0xdc,0x20,0x14,0xdd,0xe7,0x2b,0x90,0xf7,0x0e,0x60,0xe3,0x07,0x23,0x86,
+0xa8,0x9b,0xa8,0xfb,0x4e,0x37,0xdd,0x61,0x1e,0x63,0x14,0xbf,0x64,0xe3,0x68,0x92,
+0xaf,0x2f,0x60,0x3b,0xa3,0x34,0x6d,0x25,0x4b,0x3e,0x1c,0x0e,0xe7,0x5e,0xee,0xe5,
+0xb2,0xa7,0x5b,0xdf,0x81,0x57,0x3d,0x2f,0x76,0x1c,0xce,0x09,0x7e,0x44,0x09,0xd0,
+0x83,0x1c,0x95,0x1d,0xae,0xe7,0xe4,0xe7,0xe5,0x39,0xad,0x93,0x27,0xfe,0xc0,0x6e,
+0x62,0xe6,0x0f,0x80,0xb9,0x51,0xfa,0x1f,0x60,0x72,0xd6,0xc2,0xf9,0x13,0xa9,0xb3,
+0xbd,0xe6,0x19,0x42,0x34,0xc5,0x59,0x8a,0xc8,0x05,0xd1,0x13,0xc6,0x27,0x9c,0x33,
+0xf8,0x59,0x12,0x0f,0xb5,0x5a,0xbe,0x2c,0x6b,0x0f,0x16,0xf7,0xd6,0xe9,0x73,0xb2,
+0xb4,0x02,0x27,0x61,0x07,0xb0,0xd1,0x98,0x45,0x3b,0x8e,0x18,0xdc,0x51,0x64,0x17,
+0xfb,0x1e,0xcc,0x19,0x8c,0x20,0x58,0xc0,0xc3,0x23,0xae,0x8c,0xed,0x34,0xb0,0xca,
+0xa7,0xbd,0xdb,0x28,0xe1,0x44,0x44,0x80,0x75,0x7a,0xb8,0xba,0x96,0x13,0xc2,0xe0,
+0x0e,0x37,0x7e,0xf7,0xcf,0x3e,0x87,0xda,0x63,0xe1,0xf2,0x1e,0xcb,0x73,0x47,0x21,
+0x8e,0x84,0xc5,0x34,0x75,0x56,0xc6,0x5b,0xc1,0x5b,0xda,0xbc,0xdb,0x29,0x4b,0xe0,
+0xae,0x15,0xb3,0x6c,0xed,0xab,0x56,0xe9,0x9f,0xb7,0xfc,0xf1,0xfd,0x9b,0x4f,0xcf,
+0xe4,0xa4,0x28,0x4a,0x94,0xcb,0x3a,0xcf,0x9b,0x26,0x93,0xaa,0x92,0xba,0x29,0xa8,
+0x2a,0x89,0x29,0xa8,0x50,0x22,0x97,0x45,0xa1,0x71,0xe5,0xeb,0xf6,0xc5,0xe8,0x48,
+0xe6,0xe6,0x66,0x21,0xdd,0x3f,0x23,0x14,0xaa,0x22,0x8d,0x6c,0x64,0x45,0x55,0x6e,
+0x68,0x63,0x88,0x30,0xa6,0x36,0xa4,0xae,0x6b,0xa4,0x49,0x91,0x95,0x05,0x31,0x1a,
+0x49,0x4a,0x19,0xfc,0xea,0xb4,0x55,0x0f,0x7e,0x94,0x8f,0xc9,0xbf,0xf7,0x15,0xd5,
+0xbf,0x7c,0x0b,0x8e,0x86,0x02,0xd6,0x47,0x88,0x69,0x85,0x52,0x84,0x53,0x94,0x5d,
+0x10,0x3a,0x85,0x0f,0x7b,0x59,0x7f,0x97,0x89,0xff,0xc8,0xc4,0x5d,0x76,0x9d,0xc7,
+0x75,0xe2,0x72,0xd5,0x0c,0x6e,0x70,0x63,0xad,0xe2,0x18,0x21,0xec,0x49,0x8f,0x22,
+0xb5,0x2e,0x7a,0xde,0x74,0x11,0x6d,0xdc,0x87,0x6c,0x3d,0x64,0xfd,0xa8,0x34,0x47,
+0x65,0x78,0x02,0x11,0x46,0xd2,0xbd,0x4d,0x1a,0x74,0x76,0x78,0x39,0x27,0xe3,0x6c,
+0xaf,0x76,0x10,0x5d,0xc2,0x5b,0x31,0xab,0xc0,0x31,0x18,0xb6,0x37,0xe1,0x20,0x7c,
+0x5e,0xc6,0xfb,0x45,0x10,0x1f,0x5f,0x78,0x6f,0x61,0x0a,0x60,0x1c,0x03,0x06,0xe3,
+0x50,0xfc,0x06,0x00,0x00,0xff,0xff,0x03,0x00,0x19,0xcf,0xf5,0xc0,0xf9,0x65,0xe8,
+0x78,0xc3,0xfa,0x5f,0x0a,0xf6,0x09,0x17,0xd8,0xb0,0x54,0xb9,0x02,0x8d,0x91,0x31,
+0x9c,0x42,0x5a,0x68,0x39,0x31,0x41,0x59,0x26,0x53,0x59,0xc1,0x52,0x36,0xf7,0x00,
+0x00,0x03,0x41,0x00,0x00,0x10,0x02,0x44,0xa0,0x00,0x21,0xb4,0x01,0x9a,0x0d,0x46,
+0xa5,0x32,0x38,0xbb,0x92,0x29,0xc2,0x84,0x86,0x0a,0x91,0xb7,0xb8
+};
+
+/* Verify that a file records with no compression
+#How to make
+echo "hellohellohello" > f1
+chown $UNAME:$GNAME f1
+chmod 0644 f1
+env TZ=utc touch -afm -t 197001020000.01 f1
+xar --compression none -cf archive9.xar f1
+od -t x1 archive9.xar | sed -E -e 's/^0[0-9]+//;s/^ //;s/( )([0-9a-f]{2})/0x\2,/g;$ D' > archive9.xar.txt
+*/
+
+static unsigned char archive9[] = {
+0x78,0x61,0x72,0x21,0x00,0x1c,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x98,
+0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x47,0x00,0x00,0x00,0x01,0x78,0xda,0xa4,0x53,
+0x4d,0x6f,0xe3,0x20,0x14,0xbc,0xf7,0x57,0x20,0xee,0x5e,0xc0,0x25,0x89,0x1d,0x11,
+0xaa,0x5e,0xaa,0xbd,0x6f,0xf6,0xb2,0x37,0x02,0x8f,0x18,0xc5,0x1f,0x11,0xc6,0x55,
+0xba,0xbf,0x7e,0x01,0xdb,0xad,0xba,0x55,0x7b,0xa9,0x64,0xc9,0xe3,0x61,0xde,0x78,
+0x78,0xf0,0xc4,0xc3,0xad,0x6b,0xd1,0x33,0xf8,0xd1,0x0d,0xfd,0x01,0xb3,0x1f,0x14,
+0x23,0xe8,0xf5,0x60,0x5c,0x7f,0x3e,0xe0,0xdf,0xc7,0xa7,0xa2,0xc2,0x0f,0xf2,0x4e,
+0xdc,0x94,0x97,0x77,0x48,0x84,0x41,0xc7,0x17,0x12,0xda,0x83,0x0a,0xb1,0xa2,0x08,
+0xae,0x03,0x59,0x52,0x5a,0x17,0xac,0x2c,0x28,0x3f,0xd2,0x7a,0xcf,0xaa,0x3d,0xaf,
+0x05,0x79,0x2f,0xc9,0x45,0x0d,0xe8,0xcb,0x38,0x75,0x68,0x0c,0x2f,0x2d,0x1c,0xf0,
+0xd8,0x28,0x86,0xd3,0x0a,0x12,0x83,0xb5,0x23,0x04,0x49,0x05,0x59,0x50,0x66,0x47,
+0xf7,0x37,0x99,0x0b,0x92,0x41,0xb2,0x20,0xab,0x47,0xfe,0xb2,0xae,0x05,0xe4,0x4c,
+0x8c,0xbd,0xd8,0x18,0x15,0x54,0x46,0x48,0xb4,0xd0,0x9f,0x43,0x23,0xd9,0x56,0x90,
+0x05,0xce,0xfc,0xba,0xb9,0x35,0x84,0xba,0x5e,0x5b,0xa7,0x73,0x52,0x32,0xe8,0x00,
+0xa1,0x18,0x43,0x4c,0xde,0x61,0xb2,0x14,0x2c,0x81,0xca,0xf7,0xd9,0x96,0x70,0xc9,
+0x7e,0x0d,0x17,0x39,0xe5,0x75,0xe3,0x9e,0xc1,0x14,0xff,0x6f,0xf5,0xd7,0xcf,0xc7,
+0x98,0x71,0x63,0x76,0xfc,0xa4,0x4f,0x7a,0x57,0x9b,0x7b,0x5b,0x9f,0x2c,0x57,0xd6,
+0x56,0x96,0x57,0x55,0x45,0x81,0x6f,0xca,0xed,0x86,0x5b,0xa0,0xba,0x8e,0xcd,0xfb,
+0x60,0xb4,0xa6,0xbf,0x05,0xaf,0x62,0xca,0xef,0xff,0xe1,0xa3,0xd3,0xdc,0x42,0xf2,
+0xda,0x43,0xa1,0x3f,0x39,0xdc,0xed,0x9f,0x78,0x0e,0xeb,0xa9,0x22,0xd1,0x65,0xc8,
+0xea,0x1d,0x2d,0x28,0x2b,0x68,0x79,0xa4,0x74,0x9f,0x1e,0x16,0x65,0xdd,0x9b,0x4c,
+0x7d,0x21,0x53,0x6f,0xb2,0xb3,0x1f,0xa6,0xab,0xd4,0x13,0x08,0x32,0xc3,0x99,0x75,
+0x46,0x32,0x4a,0x59,0x24,0x23,0xca,0xd4,0x34,0x82,0x9f,0x75,0x19,0xcd,0xdc,0xab,
+0x6c,0x5a,0x65,0xdd,0x60,0x40,0xd2,0x2d,0xe7,0x31,0x4c,0x82,0x99,0x0c,0x2f,0x57,
+0x40,0xad,0xeb,0x2f,0x07,0x3c,0x78,0x77,0x76,0xbd,0x6a,0xb1,0x6c,0x94,0x37,0x89,
+0x13,0x24,0x2d,0xcf,0xc2,0x5e,0xc5,0x5c,0x36,0xfa,0x65,0x90,0x6f,0x60,0xba,0x74,
+0x69,0x14,0x48,0x9e,0x05,0x41,0xf2,0x64,0xfc,0x03,0x00,0x00,0xff,0xff,0x03,0x00,
+0xee,0x8e,0xf8,0x75,0xa1,0xaf,0x74,0x71,0x3f,0x40,0x08,0xab,0x13,0x7d,0xc0,0x82,
+0x3a,0x56,0xeb,0x4e,0x35,0xf1,0x35,0xb7,0x68,0x65,0x6c,0x6c,0x6f,0x68,0x65,0x6c,
+0x6c,0x6f,0x68,0x65,0x6c,0x6c,0x6f,0x0a
+};
+
+/* Verify that a file records with md5 hashing algorithm
+#How to make
+echo "hellohellohello" > f1
+chown $UNAME:$GNAME f1
+chmod 0644 f1
+env TZ=utc touch -afm -t 197001020000.01 f1
+xar --toc-cksum md5 -cf archive10.xar f1
+od -t x1 archive10.xar | sed -E -e 's/^0[0-9]+//;s/^ //;s/( )([0-9a-f]{2})/0x\2,/g;$ D' > archive10.xar.txt
+*/
+
+static unsigned char archive10[] = {
+0x78,0x61,0x72,0x21,0x00,0x1c,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0xaf,
+0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x40,0x00,0x00,0x00,0x02,0x78,0xda,0x7c,0x53,
+0x4d,0x6f,0xdc,0x20,0x10,0xbd,0xe7,0x57,0x20,0xee,0x0e,0x60,0xb3,0xb6,0x59,0xb1,
+0x44,0xbd,0x44,0xbd,0x77,0x7b,0xe9,0x8d,0xe5,0xc3,0x8b,0xe2,0x2f,0x61,0x1c,0x6d,
+0xf2,0xeb,0x8b,0xb1,0x9d,0xb4,0x4d,0x52,0xc9,0x92,0x1f,0x8f,0xc7,0x9b,0x61,0x86,
+0xe1,0x0f,0xb7,0xae,0x05,0xcf,0xc6,0x4f,0x6e,0xe8,0x4f,0x90,0xdc,0x63,0x08,0x4c,
+0xaf,0x06,0xed,0xfa,0xe6,0x04,0x7f,0x9e,0x1f,0xb3,0x1a,0x3e,0x88,0x3b,0x7e,0x93,
+0x5e,0xdc,0x01,0x1e,0x06,0x15,0x7f,0x80,0x2b,0x6f,0x64,0x88,0x27,0xb2,0xe0,0x3a,
+0x23,0x72,0x8c,0x59,0x46,0xf2,0x0c,0xd3,0x33,0x66,0xc7,0x02,0x1f,0x69,0xcd,0xd1,
+0xdf,0x92,0x74,0xe8,0x6a,0xd4,0xd3,0x34,0x77,0x60,0x0a,0x2f,0xad,0x39,0xc1,0x4e,
+0x1f,0xe0,0xb2,0x01,0xf8,0x60,0xed,0x64,0x82,0xc0,0x1c,0x6d,0x28,0xb1,0x93,0x7b,
+0x35,0x82,0x94,0x1c,0x25,0xb0,0x38,0xa0,0xdd,0x22,0xad,0xac,0x6b,0x0d,0x70,0x3a,
+0x66,0xbd,0xd9,0x68,0x19,0x64,0x42,0x80,0xb7,0xa6,0x6f,0xc2,0x55,0xe4,0x05,0x47,
+0x1b,0x5c,0xf9,0xcd,0x7f,0x71,0xfd,0x23,0xd4,0x27,0xb1,0x22,0xb7,0xd7,0x61,0xcf,
+0x57,0x8e,0x63,0xeb,0x54,0xba,0x14,0xba,0x65,0xcd,0xab,0x1b,0x21,0xda,0xa4,0xd2,
+0xab,0xab,0x7b,0x36,0x3a,0xfb,0xf7,0x8e,0x3f,0xbe,0x7f,0x8b,0xd9,0xd9,0xba,0x28,
+0x74,0x6e,0xb5,0x22,0xac,0xa0,0xac,0x90,0x17,0x5a,0x33,0xa9,0x65,0x5e,0xd8,0xda,
+0x56,0x8c,0xd8,0x32,0xb7,0xaa,0x28,0x59,0xac,0xda,0x07,0xa3,0x3d,0x97,0x5b,0xf0,
+0x52,0x85,0x2f,0x23,0x1c,0x74,0x45,0x2f,0xea,0xa2,0x2a,0xa6,0x0b,0xcb,0x2e,0x96,
+0x4a,0x1b,0xbd,0x69,0x5d,0xd7,0xd8,0xd0,0x43,0x5e,0x1e,0xa8,0x35,0x58,0x31,0xc6,
+0xd1,0x47,0xa7,0xb5,0x78,0xe8,0xad,0x7a,0x5c,0x7d,0xd1,0xd5,0xea,0x57,0xec,0xc0,
+0xde,0x4e,0xc0,0xbb,0x04,0x09,0xab,0x70,0x86,0x49,0x86,0xf3,0x33,0xc6,0xc7,0xe5,
+0x23,0x51,0xd6,0xbd,0xcb,0xe4,0x7f,0x64,0xf2,0x5d,0xd6,0xf8,0x61,0x1e,0x85,0x9a,
+0x0d,0x47,0x2b,0x5c,0x59,0xa7,0x05,0xc1,0x98,0x44,0x32,0xa2,0x44,0xcd,0x93,0xf1,
+0xab,0x2e,0xa1,0x95,0x7b,0x93,0xcd,0xbb,0xac,0x1b,0xb4,0x11,0xb8,0xa4,0x34,0x26,
+0xb3,0xc0,0x44,0x86,0x97,0xd1,0x80,0xd6,0xf5,0x4f,0x27,0x38,0x78,0xd7,0xb8,0x5e,
+0xb6,0x50,0x5c,0xa5,0xd7,0x0b,0xc7,0xd1,0xb2,0xbd,0x0a,0x7b,0x19,0xf3,0xb2,0xd1,
+0x2f,0x81,0xf4,0xf6,0x96,0xe7,0xb6,0xcc,0x00,0x4a,0x43,0xc0,0x51,0x1a,0x89,0xdf,
+0x00,0x00,0x00,0xff,0xff,0x03,0x00,0x27,0xf8,0xf5,0x28,0x87,0x01,0xb1,0xb7,0x18,
+0xe8,0x34,0x20,0x06,0x5c,0x66,0x9a,0x43,0x26,0xe7,0x94,0x78,0xda,0xca,0x48,0xcd,
+0xc9,0xc9,0xcf,0x80,0x13,0x5c,0x00,0x00,0x00,0x00,0xff,0xff,0x03,0x00,0x37,0xf7,
+0x06,0x47
+};
+
+/* Verify that a file records with no hashing algorithm
+#How to make
+echo "hellohellohello" > f1
+chown $UNAME:$GNAME f1
+chmod 0644 f1
+env TZ=utc touch -afm -t 197001020000.01 f1
+xar --toc-cksum none -cf archive11.xar f1
+od -t x1 archive11.xar | sed -E -e 's/^0[0-9]+//;s/^ //;s/( )([0-9a-f]{2})/0x\2,/g;$ D' > archive11.xar.txt
+*/
+
+static unsigned char archive11[] = {
+0x78,0x61,0x72,0x21,0x00,0x1c,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x98,
+0x00,0x00,0x00,0x00,0x00,0x00,0x02,0xef,0x00,0x00,0x00,0x00,0x78,0xda,0x7c,0x52,
+0xcb,0x6e,0xeb,0x20,0x14,0xdc,0xf7,0x2b,0x10,0x7b,0x17,0xb0,0x89,0x63,0x22,0x42,
+0x75,0x37,0x55,0xf7,0xcd,0xdd,0x74,0x47,0x78,0x38,0xa8,0x7e,0xc9,0xc6,0x55,0xda,
+0xaf,0xbf,0x3c,0xe2,0x56,0x55,0xd5,0x2b,0x21,0x79,0x3c,0xcc,0x39,0x67,0x74,0x18,
+0xfe,0x70,0xed,0x3b,0xf0,0x66,0xe6,0xc5,0x8d,0xc3,0x11,0x92,0x7b,0x0c,0x81,0x19,
+0xd4,0xa8,0xdd,0xd0,0x1e,0xe1,0xdf,0xd3,0x63,0xd1,0xc0,0x07,0x71,0xc7,0xaf,0x72,
+0x16,0x77,0x80,0xfb,0x51,0x85,0x0f,0xe0,0x6a,0x36,0xd2,0x87,0x8a,0xc2,0xbb,0xde,
+0x88,0x12,0x63,0x56,0x90,0xb2,0xc0,0xf4,0x44,0xf0,0x81,0x54,0x07,0x5a,0x73,0xf4,
+0x5d,0x12,0x8b,0xac,0xeb,0x0c,0x70,0x3a,0x4c,0x81,0xf1,0x1f,0x70,0x2d,0xbd,0x4c,
+0x08,0xf0,0xce,0x0c,0xad,0xbf,0x88,0xb2,0xe2,0xe8,0x06,0x33,0x3f,0x5a,0xbb,0x18,
+0x2f,0x30,0x47,0x37,0x94,0xe9,0xc5,0x7d,0x18,0x41,0xc2,0x94,0x04,0x32,0xb7,0xd9,
+0x06,0x8b,0x7f,0xef,0xcc,0x11,0xca,0x69,0xea,0x9c,0x4a,0x1e,0xd0,0xb5,0x68,0x3f,
+0xdc,0x04,0xd1,0x4d,0x2a,0x67,0x75,0x71,0x6f,0x46,0x17,0xea,0x62,0xd4,0xeb,0xb2,
+0xf6,0x5b,0xcd,0xf3,0xd3,0x9f,0x60,0xce,0x36,0x55,0xa5,0x4b,0xab,0x15,0x61,0x15,
+0x65,0x95,0x3c,0xd3,0x86,0x49,0x2d,0xcb,0xca,0x36,0x76,0xcf,0x88,0xad,0x4b,0xab,
+0xaa,0x9a,0x35,0x1c,0xfd,0x68,0xb4,0x79,0xb9,0xfa,0x59,0x2a,0xff,0xeb,0x84,0x9d,
+0xde,0xd3,0xb3,0x3a,0xab,0x3d,0xd3,0x95,0x65,0x67,0x4b,0xa5,0x0d,0xbd,0x69,0xd3,
+0x34,0xd8,0xd0,0x5d,0x59,0xef,0xa8,0x35,0x58,0x31,0xc6,0xd1,0xcf,0x4e,0x79,0x77,
+0xe8,0x73,0x79,0x5c,0xfd,0xf2,0x08,0xe4,0x25,0xbc,0xc2,0xb6,0x7d,0xc0,0xfb,0x04,
+0x09,0xdb,0xe3,0x02,0x93,0x02,0x97,0x27,0x8c,0x0f,0xf1,0x44,0x59,0xff,0x25,0x93,
+0xff,0x91,0xc9,0x2f,0x59,0x3b,0x8f,0xeb,0x24,0xd4,0x6a,0x38,0xca,0x30,0xb3,0x4e,
+0x0b,0x82,0x31,0x09,0x64,0x40,0x89,0x5a,0x17,0x33,0x67,0x5d,0x42,0x99,0xfb,0x94,
+0xad,0x9b,0xac,0x1f,0xb5,0x11,0xb8,0xa6,0x34,0x98,0x89,0x30,0x91,0xfe,0x7d,0x32,
+0xa0,0x73,0xc3,0xeb,0x11,0x8e,0xb3,0x6b,0xdd,0x20,0x3b,0x28,0x2e,0x72,0xd6,0x91,
+0xe3,0x28,0x5e,0x67,0xe1,0x20,0x83,0x2f,0x1b,0xfa,0x25,0x10,0xc3,0x86,0x62,0xda,
+0x62,0x64,0x51,0xca,0x2c,0x47,0x29,0xc1,0xff,0x00,0x00,0x00,0xff,0xff,0x03,0x00,
+0xf1,0x18,0xdc,0x71,0x78,0xda,0xca,0x48,0xcd,0xc9,0xc9,0xcf,0x80,0x13,0x5c,0x00,
+0x00,0x00,0x00,0xff,0xff,0x03,0x00,0x37,0xf7,0x06,0x47
+};
+
+enum enc {
+ GZIP,
+ BZIP2
+};
+
+static void verify(unsigned char *d, size_t s,
+ void (*f1)(struct archive *, struct archive_entry *),
+ void (*f2)(struct archive *, struct archive_entry *),
+ enum enc etype)
+{
+ struct archive_entry *ae;
+ struct archive *a;
+ unsigned char *buff;
+ int r;
+
+ assert((a = archive_read_new()) != NULL);
+ switch (etype) {
+ case BZIP2:
+ /* This is only check whether bzip is supported or not.
+ * This filter won't be used this test. */
+ if (ARCHIVE_OK != archive_read_support_compression_bzip2(a)) {
+ skipping("Unsupported bzip2");
+ assertEqualInt(ARCHIVE_OK, archive_read_finish(a));
+ return;
+ }
+ break;
+ case GZIP:
+ /* This gzip must be needed. archive_read_support_format_xar()
+ * will return a warning if gzip is unsupported. */
+ break;
+ }
+ assertA(0 == archive_read_support_compression_all(a));
+ r = archive_read_support_format_xar(a);
+ if (r == ARCHIVE_WARN) {
+ skipping("xar reading not fully supported on this platform");
+ assertEqualInt(ARCHIVE_OK, archive_read_finish(a));
+ return;
+ }
+ assert((buff = malloc(100000)) != NULL);
+ if (buff == NULL)
+ return;
+ memcpy(buff, d, s);
+ memset(buff + s, 0, 2048);
+
+ assertA(0 == archive_read_support_format_all(a));
+ assertA(0 == archive_read_open_memory(a, buff, s + 1024));
+ assertA(0 == archive_read_next_header(a, &ae));
+ assertEqualInt(archive_compression(a), ARCHIVE_COMPRESSION_NONE);
+ assertEqualInt(archive_format(a), ARCHIVE_FORMAT_XAR);
+ /* Verify the only entry. */
+ f1(a, ae);
+ if (f2) {
+ assertA(0 == archive_read_next_header(a, &ae));
+ assertEqualInt(archive_compression(a), ARCHIVE_COMPRESSION_NONE);
+ assertEqualInt(archive_format(a), ARCHIVE_FORMAT_XAR);
+ /* Verify the only entry. */
+ f2(a, ae);
+ }
+ /* End of archive. */
+ assertEqualInt(ARCHIVE_EOF, archive_read_next_header(a, &ae));
+
+ assertA(0 == archive_read_close(a));
+ assertA(0 == archive_read_finish(a));
+ free(buff);
+}
+
+DEFINE_TEST(test_read_format_xar)
+{
+ verify(archive1, sizeof(archive1), verify0, verify1, GZIP);
+ verify(archive2, sizeof(archive2), verify0, verify2, GZIP);
+ verify(archive3, sizeof(archive3), verify3, NULL, GZIP);
+ verify(archive4, sizeof(archive4), verify4, NULL, GZIP);
+ verify(archive5, sizeof(archive5), verify5, NULL, GZIP);
+ verify(archive6, sizeof(archive6), verify6, NULL, GZIP);
+ verify(archive7, sizeof(archive7), verify7, NULL, GZIP);
+ verify(archive8, sizeof(archive8), verify0, NULL, BZIP2);
+ verify(archive9, sizeof(archive9), verify0, NULL, GZIP);
+ verify(archive10, sizeof(archive10), verify0, NULL, GZIP);
+ verify(archive11, sizeof(archive11), verify0, NULL, GZIP);
+}
+
diff --git a/lib/libarchive/test/test_read_large.c b/lib/libarchive/test/test_read_large.c
index ba716c2..5ff01fd 100644
--- a/lib/libarchive/test/test_read_large.c
+++ b/lib/libarchive/test/test_read_large.c
@@ -57,7 +57,7 @@ DEFINE_TEST(test_read_large)
archive_entry_set_pathname(entry, "test");
assertA(0 == archive_write_header(a, entry));
archive_entry_free(entry);
- assertA(sizeof(testdata) == archive_write_data(a, testdata, sizeof(testdata)));
+ assertA((int)sizeof(testdata) == archive_write_data(a, testdata, sizeof(testdata)));
assertA(0 == archive_write_finish(a));
assert(NULL != (a = archive_read_new()));
diff --git a/lib/libarchive/test/test_read_truncated.c b/lib/libarchive/test/test_read_truncated.c
index 4c1fec3..7012684 100644
--- a/lib/libarchive/test/test_read_truncated.c
+++ b/lib/libarchive/test/test_read_truncated.c
@@ -52,7 +52,7 @@ DEFINE_TEST(test_read_truncated)
archive_entry_set_size(ae, sizeof(buff2));
assertA(0 == archive_write_header(a, ae));
archive_entry_free(ae);
- assertA(sizeof(buff2) == archive_write_data(a, buff2, sizeof(buff2)));
+ assertA((int)sizeof(buff2) == archive_write_data(a, buff2, sizeof(buff2)));
/* Close out the archive. */
assertA(0 == archive_write_close(a));
@@ -81,7 +81,7 @@ DEFINE_TEST(test_read_truncated)
assertA(ARCHIVE_FATAL == archive_read_data(a, buff2, sizeof(buff2)));
goto wrap_up;
} else {
- assertA(sizeof(buff2) == archive_read_data(a, buff2, sizeof(buff2)));
+ assertA((int)sizeof(buff2) == archive_read_data(a, buff2, sizeof(buff2)));
}
/* Verify the end of the archive. */
diff --git a/lib/libarchive/test/test_ustar_filenames.c b/lib/libarchive/test/test_ustar_filenames.c
index 09cb857..130a31e 100644
--- a/lib/libarchive/test/test_ustar_filenames.c
+++ b/lib/libarchive/test/test_ustar_filenames.c
@@ -53,7 +53,7 @@ test_filename(const char *prefix, int dlen, int flen)
}
for (; i < dlen + flen + separator; i++)
filename[i] = 'b';
- filename[i++] = '\0';
+ filename[i] = '\0';
strcpy(dirname, filename);
diff --git a/lib/libarchive/test/test_write_format_cpio.c b/lib/libarchive/test/test_write_format_cpio.c
index ffc1d7a..5c7141f 100644
--- a/lib/libarchive/test/test_write_format_cpio.c
+++ b/lib/libarchive/test/test_write_format_cpio.c
@@ -112,6 +112,8 @@ test_format(int (*set_format)(struct archive *))
/*
* Damage the second entry to test the search-ahead recovery.
+ * TODO: Move the damage-recovery checking to a separate test;
+ * it doesn't really belong in this write test.
*/
{
int i;
@@ -124,7 +126,7 @@ test_format(int (*set_format)(struct archive *))
}
}
failure("Unable to locate the second header for damage-recovery test.");
- assert(damaged = 1);
+ assert(damaged == 1);
/*
* Now, read the data back.
@@ -151,28 +153,14 @@ test_format(int (*set_format)(struct archive *))
assert(0 == memcmp(filedata, "12345678", 8));
/*
- * Read the second file back.
+ * The second file can't be read because we damaged its header.
*/
- if (!damaged) {
- assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
- assertEqualInt(1, archive_entry_mtime(ae));
- /* Not the same as above: cpio doesn't store hi-res times. */
- assert(0 == archive_entry_mtime_nsec(ae));
- assert(0 == archive_entry_atime(ae));
- assert(0 == archive_entry_ctime(ae));
- assertEqualString("file2", archive_entry_pathname(ae));
- assert((S_IFREG | 0755) == archive_entry_mode(ae));
- assertEqualInt(4, archive_entry_size(ae));
- assertEqualIntA(a, 4, archive_read_data(a, filedata, 10));
- assert(0 == memcmp(filedata, "1234", 4));
- }
/*
* Read the dir entry back.
+ * ARCHIVE_WARN here because the damaged entry was skipped.
*/
- assertEqualIntA(a,
- damaged ? ARCHIVE_WARN : ARCHIVE_OK,
- archive_read_next_header(a, &ae));
+ assertEqualIntA(a, ARCHIVE_WARN, archive_read_next_header(a, &ae));
assertEqualInt(11, archive_entry_mtime(ae));
assert(0 == archive_entry_mtime_nsec(ae));
assert(0 == archive_entry_atime(ae));
diff --git a/lib/libc/gen/posix_spawn.c b/lib/libc/gen/posix_spawn.c
index e4ceb20..e3124b2 100644
--- a/lib/libc/gen/posix_spawn.c
+++ b/lib/libc/gen/posix_spawn.c
@@ -29,6 +29,7 @@ __FBSDID("$FreeBSD$");
#include "namespace.h"
#include <sys/queue.h>
+#include <sys/wait.h>
#include <errno.h>
#include <fcntl.h>
@@ -216,7 +217,9 @@ do_posix_spawn(pid_t *pid, const char *path,
error = errno;
_exit(127);
default:
- if (pid != NULL)
+ if (error != 0)
+ _waitpid(p, NULL, WNOHANG);
+ else if (pid != NULL)
*pid = p;
return (error);
}
diff --git a/lib/libc/sys/rfork.2 b/lib/libc/sys/rfork.2
index f1ae14b..222bac4 100644
--- a/lib/libc/sys/rfork.2
+++ b/lib/libc/sys/rfork.2
@@ -5,7 +5,7 @@
.\"
.\" $FreeBSD$
.\"
-.Dd March 15, 2011
+.Dd July 12, 2011
.Dt RFORK 2
.Os
.Sh NAME
@@ -84,8 +84,18 @@ Note that a lot of code will not run correctly in such an environment.
.It Dv RFSIGSHARE
If set, the kernel will force sharing the sigacts structure between the
child and the parent.
+.It Dv RFTSIGZMB
+If set, the kernel will deliver a specified signal to the parent
+upon the child exit, instead of default SIGCHLD.
+The signal number
+.Dv signum
+is specified by oring the
+.Dv RFTSIGFLAGS(signum)
+expression into
+.Fa flags .
+Specifying signal number 0 disables signal delivery upon the child exit.
.It Dv RFLINUXTHPN
-If set, the kernel will return SIGUSR1 instead of SIGCHILD upon thread
+If set, the kernel will deliver SIGUSR1 instead of SIGCHLD upon thread
exit for the child.
This is intended to mimic certain Linux clone behaviour.
.El
@@ -164,6 +174,8 @@ would be exceeded (see
Both the RFFDG and the RFCFDG flags were specified.
.It Bq Er EINVAL
Any flags not listed above were specified.
+.It Bq Er EINVAL
+An invalid signal number was specified.
.It Bq Er ENOMEM
There is insufficient swap space for the new process.
.El
diff --git a/lib/libc/xdr/Makefile.inc b/lib/libc/xdr/Makefile.inc
index 2d360ac..d1bb208 100644
--- a/lib/libc/xdr/Makefile.inc
+++ b/lib/libc/xdr/Makefile.inc
@@ -3,7 +3,8 @@
.PATH: ${.CURDIR}/xdr ${.CURDIR}/.
SRCS+= xdr.c xdr_array.c xdr_float.c xdr_mem.c \
- xdr_rec.c xdr_reference.c xdr_stdio.c
+ xdr_rec.c xdr_reference.c xdr_sizeof.c \
+ xdr_stdio.c
SYM_MAPS+= ${.CURDIR}/xdr/Symbol.map
@@ -39,6 +40,7 @@ MLINKS+= rpc_xdr.3 xdr_accepted_reply.3 \
xdr.3 xdr_reference.3 \
xdr.3 xdr_setpos.3 \
xdr.3 xdr_short.3 \
+ xdr.3 xdr_sizeof.3 \
xdr.3 xdrstdio_create.3 \
xdr.3 xdr_string.3 \
xdr.3 xdr_u_char.3 \
diff --git a/lib/libc/xdr/Symbol.map b/lib/libc/xdr/Symbol.map
index 0739b7b..a8eb3a1 100644
--- a/lib/libc/xdr/Symbol.map
+++ b/lib/libc/xdr/Symbol.map
@@ -42,7 +42,6 @@ FBSD_1.0 {
xdrrec_endofrecord;
xdr_reference;
xdr_pointer;
- /* xdr_sizeof; */ /* Why is xdr_sizeof.c not included in Makefileinc? */
xdrstdio_create;
};
@@ -51,3 +50,7 @@ FBSD_1.1 {
xdr_uint32_t;
xdr_uint64_t;
};
+
+FBSD_1.2 {
+ xdr_sizeof;
+};
diff --git a/lib/libc/xdr/xdr.3 b/lib/libc/xdr/xdr.3
index 19c7e57..69f2544 100644
--- a/lib/libc/xdr/xdr.3
+++ b/lib/libc/xdr/xdr.3
@@ -31,6 +31,7 @@
.Nm xdr_reference ,
.Nm xdr_setpos ,
.Nm xdr_short ,
+.Nm xdr_sizeof,
.Nm xdrstdio_create ,
.Nm xdr_string ,
.Nm xdr_u_char ,
@@ -561,6 +562,18 @@ A filter primitive that translates between C
integers and their external representations.
This routine returns one if it succeeds, zero otherwise.
.Pp
+.It Xo
+.Ft unsigned long
+.Xc
+.It Xo
+.Fn xdr_sizeof "xdrproc_t func" "void *data"
+.Xc
+.Pp
+This routine returns the amount of memory required to encode
+.Fa data
+using filter
+.Fa func .
+.Pp
.It Li "#ifdef _STDIO_H_"
.It Li "/* XDR using stdio library */"
.It Xo
@@ -827,3 +840,8 @@ Returns one if it succeeds, zero otherwise.
.%O RFC1014
.%Q "Sun Microsystems, Inc., USC\-ISI"
.Re
+.Sh HISTORY
+The
+.Nm xdr_sizeof
+function first appeared in
+.Fx 9.0 .
diff --git a/lib/libc/xdr/xdr_sizeof.c b/lib/libc/xdr/xdr_sizeof.c
index 20f1c3a..f33c613 100644
--- a/lib/libc/xdr/xdr_sizeof.c
+++ b/lib/libc/xdr/xdr_sizeof.c
@@ -94,7 +94,7 @@ x_inline(xdrs, len)
if (xdrs->x_op != XDR_ENCODE) {
return (NULL);
}
- if (len < (u_int)xdrs->x_base) {
+ if (len < (u_int)(uintptr_t)xdrs->x_base) {
/* x_private was already allocated */
xdrs->x_handy += len;
return ((int32_t *) xdrs->x_private);
@@ -106,7 +106,7 @@ x_inline(xdrs, len)
xdrs->x_base = 0;
return (NULL);
}
- xdrs->x_base = (caddr_t) len;
+ xdrs->x_base = (caddr_t)(uintptr_t)len;
xdrs->x_handy += len;
return ((int32_t *) xdrs->x_private);
}
diff --git a/lib/libkvm/kvm_pcpu.c b/lib/libkvm/kvm_pcpu.c
index bc73baf..d7108b4 100644
--- a/lib/libkvm/kvm_pcpu.c
+++ b/lib/libkvm/kvm_pcpu.c
@@ -39,13 +39,11 @@
__FBSDID("$FreeBSD$");
#include <sys/param.h>
-#include <sys/cpuset.h>
#include <sys/pcpu.h>
#include <sys/sysctl.h>
#include <kvm.h>
#include <limits.h>
#include <stdlib.h>
-#include <unistd.h>
#include "kvm_private.h"
@@ -120,9 +118,6 @@ _kvm_pcpu_clear(void)
void *
kvm_getpcpu(kvm_t *kd, int cpu)
{
- long kcpusetsize;
- ssize_t nbytes;
- uintptr_t readptr;
char *buf;
if (kd == NULL) {
@@ -130,10 +125,6 @@ kvm_getpcpu(kvm_t *kd, int cpu)
return (NULL);
}
- kcpusetsize = sysconf(_SC_CPUSET_SIZE);
- if (kcpusetsize == -1 || (u_long)kcpusetsize > sizeof(cpuset_t))
- return ((void *)-1);
-
if (maxcpu == 0)
if (_kvm_pcpu_init(kd) < 0)
return ((void *)-1);
@@ -146,26 +137,8 @@ kvm_getpcpu(kvm_t *kd, int cpu)
_kvm_err(kd, kd->program, "out of memory");
return ((void *)-1);
}
- nbytes = sizeof(struct pcpu) - 2 * kcpusetsize;
- readptr = (uintptr_t)pcpu_data[cpu];
- if (kvm_read(kd, readptr, buf, nbytes) != nbytes) {
- _kvm_err(kd, kd->program, "unable to read per-CPU data");
- free(buf);
- return ((void *)-1);
- }
-
- /* Fetch the valid cpuset_t objects. */
- CPU_ZERO((cpuset_t *)(buf + nbytes));
- CPU_ZERO((cpuset_t *)(buf + nbytes + sizeof(cpuset_t)));
- readptr += nbytes;
- if (kvm_read(kd, readptr, buf + nbytes, kcpusetsize) != kcpusetsize) {
- _kvm_err(kd, kd->program, "unable to read per-CPU data");
- free(buf);
- return ((void *)-1);
- }
- readptr += kcpusetsize;
- if (kvm_read(kd, readptr, buf + nbytes + sizeof(cpuset_t),
- kcpusetsize) != kcpusetsize) {
+ if (kvm_read(kd, (uintptr_t)pcpu_data[cpu], buf,
+ sizeof(struct pcpu)) != sizeof(struct pcpu)) {
_kvm_err(kd, kd->program, "unable to read per-CPU data");
free(buf);
return ((void *)-1);
diff --git a/lib/liblzma/config.h b/lib/liblzma/config.h
index 374762c..9d97247 100644
--- a/lib/liblzma/config.h
+++ b/lib/liblzma/config.h
@@ -59,10 +59,10 @@
#define PACKAGE "xz"
#define PACKAGE_BUGREPORT "lasse.collin@tukaani.org"
#define PACKAGE_NAME "XZ Utils"
-#define PACKAGE_STRING "XZ Utils 5.0.0"
+#define PACKAGE_STRING "XZ Utils 5.0.3"
#define PACKAGE_TARNAME "xz"
#define PACKAGE_URL "http://tukaani.org/xz/"
-#define PACKAGE_VERSION "5.0.0"
+#define PACKAGE_VERSION "5.0.3"
#define SIZEOF_SIZE_T 8
#define STDC_HEADERS 1
#define TUKLIB_CPUCORES_SYSCTL 1
@@ -82,8 +82,12 @@
#ifndef __EXTENSIONS__
# define __EXTENSIONS__ 1
#endif
-#define VERSION "5.0.0"
+#define VERSION "5.0.3"
#if defined(__FreeBSD__)
+#include <sys/_types.h>
+#if defined(__NO_STRICT_ALIGNMENT)
+#define TUKLIB_FAST_UNALIGNED_ACCESS 1
+#endif
#include <machine/endian.h>
#if _BYTE_ORDER == _BIG_ENDIAN
# define WORDS_BIGENDIAN 1
diff --git a/lib/libprocstat/Makefile b/lib/libprocstat/Makefile
index 05a64e7..9804483 100644
--- a/lib/libprocstat/Makefile
+++ b/lib/libprocstat/Makefile
@@ -15,13 +15,15 @@ SRCS= cd9660.c \
VERSION_DEF= ${.CURDIR}/Versions.def
SYMBOL_MAPS= ${.CURDIR}/Symbol.map
-INCS= libprocstat.h
+INCS= libprocstat.h
CFLAGS+= -I. -I${.CURDIR} -D_KVM_VNODE
SHLIB_MAJOR= 1
-WITHOUT_MAN= yes
+
DPADD= ${LIBKVM} ${LIBUTIL}
LDADD= -lkvm -lutil
+MAN= libprocstat.3
+
.if ${MK_NCP} != "no"
CFLAGS+= -DLIBPROCSTAT_NWFS
SRCS+= nwfs.c
diff --git a/lib/libprocstat/libprocstat.3 b/lib/libprocstat/libprocstat.3
new file mode 100644
index 0000000..49799f5
--- /dev/null
+++ b/lib/libprocstat/libprocstat.3
@@ -0,0 +1,258 @@
+.\" Copyright (c) 2011 Sergey Kandaurov <pluknet@FreeBSD.org>
+.\" All rights reserved.
+.\"
+.\" Redistribution and use in source and binary forms, with or without
+.\" modification, are permitted provided that the following conditions
+.\" are met:
+.\" 1. Redistributions of source code must retain the above copyright
+.\" notice, this list of conditions and the following disclaimer.
+.\" 2. Redistributions in binary form must reproduce the above copyright
+.\" notice, this list of conditions and the following disclaimer in the
+.\" documentation and/or other materials provided with the distribution.
+.\"
+.\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+.\" SUCH DAMAGE.
+.\"
+.\" $FreeBSD$
+.\"
+.Dd July 12, 2011
+.Dt LIBPROCSTAT 3
+.Os
+.Sh NAME
+.Nm procstat_open_kvm ,
+.Nm procstat_open_sysctl ,
+.Nm procstat_close ,
+.Nm procstat_getfiles ,
+.Nm procstat_getprocs ,
+.Nm procstat_freefiles ,
+.Nm procstat_freeprocs ,
+.Nm procstat_get_pipe_info ,
+.Nm procstat_get_pts_info ,
+.Nm procstat_get_socket_info ,
+.Nm procstat_get_vnode_info
+.Nd library interface for file and process information retrieval
+.Sh LIBRARY
+.Lb libprocstat
+.Sh SYNOPSIS
+.In sys/param.h
+.In sys/queue.h
+.In libprocstat.h
+.Ft void
+.Fn procstat_close "struct procstat *procstat"
+.Ft void
+.Fo procstat_freefiles
+.Fa "struct procstat *procstat"
+.Fa "struct filestat_list *head"
+.Fc
+.Ft void
+.Fn procstat_freeprocs "struct procstat *procstat" "struct kinfo_proc *p"
+.Ft int
+.Fo procstat_get_pipe_info
+.Fa "struct procstat *procstat"
+.Fa "struct filestat *fst"
+.Fa "struct pipestat *pipe"
+.Fa "char *errbuf"
+.Fc
+.Ft int
+.Fo procstat_get_pts_info
+.Fa "struct procstat *procstat"
+.Fa "struct filestat *fst"
+.Fa "struct ptsstat *pts"
+.Fa "char *errbuf"
+.Fc
+.Ft int
+.Fo procstat_get_socket_info
+.Fa "struct procstat *procstat"
+.Fa "struct filestat *fst"
+.Fa "struct sockstat *sock"
+.Fa "char *errbuf"
+.Fc
+.Ft int
+.Fo procstat_get_vnode_info
+.Fa "struct procstat *procstat"
+.Fa "struct filestat *fst"
+.Fa "struct vnstat *vn"
+.Fa "char *errbuf"
+.Fc
+.Ft "struct filestat_list *"
+.Fo procstat_getfiles
+.Fa "struct procstat *procstat"
+.Fa "struct kinfo_proc *kp"
+.Fa "int mmapped"
+.Fc
+.Ft "struct kinfo_proc *"
+.Fo procstat_getprocs
+.Fa "struct procstat *procstat"
+.Fa "int what"
+.Fa "int arg"
+.Fa "unsigned int *count"
+.Fc
+.Ft "struct procstat *"
+.Fn procstat_open_kvm "const char *nlistf" "const char *memf"
+.Ft "struct procstat *"
+.Fn procstat_open_sysctl void
+.Sh DESCRIPTION
+The
+.Nm libprocstat
+library contains the API for runtime file and process information
+retrieval from the running kernel via the
+.Xr sysctl 3
+library backend, and for post-mortem analysis via the
+.Xr kvm 3
+library backend.
+.Pp
+The
+.Fn procstat_open_kvm
+and
+.Fn procstat_open_sysctl
+functions use the
+.Xr kvm 3
+or
+.Xr sysctl 3
+library routines, respectively, to access kernel state information
+used to retrieve processes and files states.
+The
+.Fa nlistf
+argument is the executable image of the kernel being examined.
+If this argument is
+.Dv NULL ,
+the currently running kernel is assumed.
+The
+.Fa memf
+argument is the kernel memory device file.
+If this argument is
+.Dv NULL ,
+then
+.Pa /dev/mem
+is assumed.
+See
+.Xr kvm_open 3
+for more details.
+Both functions dynamically allocate and return a
+.Vt procstat
+structure pointer used in the rest of the
+.Nm libprocstat
+library routines until the corresponding
+.Fn procstat_close
+call that cleans up the resources allocated by the
+.Fn procstat_open_*
+functions.
+.Pp
+The
+.Fn procstat_getprocs
+function gets a pointer to the
+.Vt procstat
+structure from one of the
+.Fn procstat_open_*
+functions and returns a dynamically allocated (sub-)set of active processes
+in the kernel filled in to array of
+.Vt kinfo_proc
+structures.
+The
+.Fa what
+and
+.Fa arg
+arguments constitute a filtering predicate as described in the
+.Xr kvm_getprocs 3
+function.
+The number of processes found is returned in the reference parameter
+.Fa cnt .
+The caller is responsible to free the allocated memory with a subsequent
+.Fn procstat_freeprocs
+function call.
+.Pp
+The
+.Fn procstat_getfiles
+function gets a pointer to the
+.Vt procstat
+structure initialized with one of the
+.Fn procstat_open_*
+functions, a pointer to
+.Vt kinfo_proc
+structure from the array obtained from the
+.Fn kvm_getprocs
+function, and returns a dynamically allocated linked list of filled in
+.Vt filestat_list
+structures using the STAILQ macros defined in
+.Xr queue 3 .
+The caller is responsible to free the allocated memory with a subsequent
+.Fn procstat_freefiles
+function call.
+.Pp
+The
+.Fn procstat_get_pipe_info ,
+.Fn procstat_get_pts_info ,
+.Fn procstat_get_socket_info
+and
+.Fn procstat_get_vnode_info
+functions are used to retrive information about pipes, pseudo-terminals,
+sockets, and vnodes, respectively.
+Each of them have a similar interface API.
+The
+.Fa procstat
+argument is a pointer obtained from one of
+.Fn procstat_open_*
+functions.
+The
+.Ft filestat Fa fst
+argument is an element of STAILQ linked list as obtained from the
+.Fn procstat_getfiles
+function.
+The
+.Ft filestat
+structure contains a
+.Fa fs_type
+field that specifies a file type and a corresponding function to be
+called among the
+.Nm procstat_get_*_info
+function family.
+The actual object is returned in the 3rd reference parameter.
+The
+.Fa errbuf
+argument indicates an actual error message in case of failure.
+.Pp
+.Bl -tag -width 20n -compact -offset indent
+.It Li PS_FST_TYPE_FIFO
+.Nm procstat_get_vnode_info
+.It Li PS_FST_TYPE_VNODE
+.Nm procstat_get_vnode_info
+.It Li PS_FST_TYPE_SOCKET
+.Nm procstat_get_socket_info
+.It Li PS_FST_TYPE_PIPE
+.Nm procstat_get_pipe_info
+.It Li PS_FST_TYPE_PTS
+.Nm procstat_get_pts_info
+.El
+.Sh SEE ALSO
+.Xr fstat 1 ,
+.Xr fuser 1 ,
+.Xr pipe 2 ,
+.Xr socket 2 ,
+.Xr kvm 3 ,
+.Xr queue 3 ,
+.Xr sysctl 3 ,
+.Xr pts 4 ,
+.Xr vnode 9
+.Sh HISTORY
+The
+.Nm libprocstat
+library appeared in
+.Fx 9.0 .
+.Sh AUTHORS
+.An -nosplit
+The
+.Nm libprocstat
+library was written by
+.An Stanislav Sedov Aq stas@FreeBSD.org .
+.Pp
+This manual page was written by
+.An Sergey Kandaurov Aq pluknet@FreeBSD.org .
diff --git a/lib/libstand/stand.h b/lib/libstand/stand.h
index eae1605..db0490f 100644
--- a/lib/libstand/stand.h
+++ b/lib/libstand/stand.h
@@ -65,15 +65,13 @@
#include <sys/cdefs.h>
#include <sys/stat.h>
#include <sys/dirent.h>
+
+/* this header intentionally exports NULL from <string.h> */
#include <string.h>
#define CHK(fmt, args...) printf("%s(%d): " fmt "\n", __func__, __LINE__ , ##args)
#define PCHK(fmt, args...) {printf("%s(%d): " fmt "\n", __func__, __LINE__ , ##args); getchar();}
-#ifndef NULL
-#define NULL 0
-#endif
-
/* Avoid unwanted userlandish components */
#define _KERNEL
#include <sys/errno.h>
diff --git a/lib/libstand/zalloc.c b/lib/libstand/zalloc.c
index 2cd71c4..41aef0d 100644
--- a/lib/libstand/zalloc.c
+++ b/lib/libstand/zalloc.c
@@ -77,7 +77,7 @@ __FBSDID("$FreeBSD$");
*/
void *
-znalloc(MemPool *mp, iaddr_t bytes)
+znalloc(MemPool *mp, uintptr_t bytes)
{
/*
* align according to pool object size (can be 0). This is
@@ -136,7 +136,7 @@ znalloc(MemPool *mp, iaddr_t bytes)
*/
void
-zfree(MemPool *mp, void *ptr, iaddr_t bytes)
+zfree(MemPool *mp, void *ptr, uintptr_t bytes)
{
/*
* align according to pool object size (can be 0). This is
@@ -153,8 +153,8 @@ zfree(MemPool *mp, void *ptr, iaddr_t bytes)
if ((char *)ptr < (char *)mp->mp_Base ||
(char *)ptr + bytes > (char *)mp->mp_End ||
- ((iaddr_t)ptr & MEMNODE_SIZE_MASK) != 0)
- panic("zfree(%p,%ju): wild pointer", ptr, bytes);
+ ((uintptr_t)ptr & MEMNODE_SIZE_MASK) != 0)
+ panic("zfree(%p,%ju): wild pointer", ptr, (uintmax_t)bytes);
/*
* free the segment
@@ -177,8 +177,10 @@ zfree(MemPool *mp, void *ptr, iaddr_t bytes)
/*
* range check
*/
- if ((char *)ptr + bytes > (char *)mn)
- panic("zfree(%p,%ju): corrupt memlist1",ptr, bytes);
+ if ((char *)ptr + bytes > (char *)mn) {
+ panic("zfree(%p,%ju): corrupt memlist1", ptr,
+ (uintmax_t)bytes);
+ }
/*
* merge against next area or create independant area
@@ -208,8 +210,10 @@ zfree(MemPool *mp, void *ptr, iaddr_t bytes)
return;
/* NOT REACHED */
}
- if ((char *)ptr < (char *)mn + mn->mr_Bytes)
- panic("zfree(%p,%ju): corrupt memlist2", ptr, bytes);
+ if ((char *)ptr < (char *)mn + mn->mr_Bytes) {
+ panic("zfree(%p,%ju): corrupt memlist2", ptr,
+ (uintmax_t)bytes);
+ }
}
/*
* We are beyond the last MemNode, append new MemNode. Merge against
@@ -241,7 +245,7 @@ zfree(MemPool *mp, void *ptr, iaddr_t bytes)
*/
void
-zextendPool(MemPool *mp, void *base, iaddr_t bytes)
+zextendPool(MemPool *mp, void *base, uintptr_t bytes)
{
if (mp->mp_Size == 0) {
mp->mp_Base = base;
diff --git a/lib/libstand/zalloc_defs.h b/lib/libstand/zalloc_defs.h
index 2544f59..5331ee0 100644
--- a/lib/libstand/zalloc_defs.h
+++ b/lib/libstand/zalloc_defs.h
@@ -38,20 +38,12 @@
#define DMALLOCDEBUG /* add debugging code to gather stats */
#define ZALLOCDEBUG
-#include <string.h>
+#include <sys/stdint.h>
#include "stand.h"
-
-typedef uintptr_t iaddr_t; /* unsigned int same size as pointer */
-typedef intptr_t saddr_t; /* signed int same size as pointer */
#include "zalloc_mem.h"
-#define Prototype extern
#define Library extern
-#ifndef NULL
-#define NULL ((void *)0)
-#endif
-
/*
* block extension for sbrk()
*/
@@ -60,8 +52,7 @@ typedef intptr_t saddr_t; /* signed int same size as pointer */
#define BLKEXTENDMASK (BLKEXTEND - 1)
/*
- * required malloc alignment. Use sizeof(long double) for architecture
- * independance.
+ * required malloc alignment. Just hardwire to 16.
*
* Note: if we implement a more sophisticated realloc, we should ensure that
* MALLOCALIGN is at least as large as MemNode.
@@ -72,10 +63,8 @@ typedef struct Guard {
size_t ga_Magic; /* must be at least 32 bits */
} Guard;
-#define MATYPE long double
-#define MALLOCALIGN ((sizeof(MATYPE) > sizeof(Guard)) ? sizeof(MATYPE) : sizeof(Guard))
+#define MALLOCALIGN 16
#define GAMAGIC 0x55FF44FD
#define GAFREE 0x5F54F4DF
#include "zalloc_protos.h"
-
diff --git a/lib/libstand/zalloc_malloc.c b/lib/libstand/zalloc_malloc.c
index 5cd7bcb..b9a295f 100644
--- a/lib/libstand/zalloc_malloc.c
+++ b/lib/libstand/zalloc_malloc.c
@@ -126,7 +126,7 @@ Free(void *ptr, const char *file, int line)
void *
Calloc(size_t n1, size_t n2, const char *file, int line)
{
- iaddr_t bytes = (iaddr_t)n1 * (iaddr_t)n2;
+ uintptr_t bytes = (uintptr_t)n1 * (uintptr_t)n2;
void *res;
if ((res = Malloc(bytes, file, line)) != NULL) {
diff --git a/lib/libstand/zalloc_mem.h b/lib/libstand/zalloc_mem.h
index c872da1..f29c0d7 100644
--- a/lib/libstand/zalloc_mem.h
+++ b/lib/libstand/zalloc_mem.h
@@ -37,15 +37,15 @@
typedef struct MemNode {
struct MemNode *mr_Next;
- iaddr_t mr_Bytes;
+ uintptr_t mr_Bytes;
} MemNode;
typedef struct MemPool {
void *mp_Base;
void *mp_End;
MemNode *mp_First;
- iaddr_t mp_Size;
- iaddr_t mp_Used;
+ uintptr_t mp_Size;
+ uintptr_t mp_Used;
} MemPool;
#define MEMNODE_SIZE_MASK ((sizeof(MemNode) <= 8) ? 7 : 15)
diff --git a/lib/libstand/zalloc_protos.h b/lib/libstand/zalloc_protos.h
index c90bd5a..53a40e4 100644
--- a/lib/libstand/zalloc_protos.h
+++ b/lib/libstand/zalloc_protos.h
@@ -29,7 +29,7 @@
* $FreeBSD$
*/
-Library void *znalloc(struct MemPool *mpool, iaddr_t bytes);
-Library void zfree(struct MemPool *mpool, void *ptr, iaddr_t bytes);
-Library void zextendPool(MemPool *mp, void *base, iaddr_t bytes);
+Library void *znalloc(struct MemPool *mpool, uintptr_t bytes);
+Library void zfree(struct MemPool *mpool, void *ptr, uintptr_t bytes);
+Library void zextendPool(MemPool *mp, void *base, uintptr_t bytes);
Library void zallocstats(struct MemPool *mp);
diff --git a/lib/libusb/libusb.3 b/lib/libusb/libusb.3
index e7e3115..33d807d 100644
--- a/lib/libusb/libusb.3
+++ b/lib/libusb/libusb.3
@@ -542,6 +542,8 @@ The library is also compliant with LibUSB version 0.1.12.
.Fn usb_device
.Fn usb_get_busses
.Fn usb_check_connected
+.Fn usb_get_driver_np
+.Fn usb_detach_kernel_driver_np
.
.Sh SEE ALSO
.Xr libusb20 3 ,
diff --git a/lib/libusb/libusb01.c b/lib/libusb/libusb01.c
index 4124ef6..17edb0e 100644
--- a/lib/libusb/libusb01.c
+++ b/lib/libusb/libusb01.c
@@ -203,6 +203,12 @@ usb_get_string(usb_dev_handle * dev, int strindex,
{
int err;
+ if (dev == NULL)
+ return (-1);
+
+ if (buflen > 65535)
+ buflen = 65535;
+
err = libusb20_dev_req_string_sync((void *)dev,
strindex, langid, buf, buflen);
@@ -218,6 +224,12 @@ usb_get_string_simple(usb_dev_handle * dev, int strindex,
{
int err;
+ if (dev == NULL)
+ return (-1);
+
+ if (buflen > 65535)
+ buflen = 65535;
+
err = libusb20_dev_req_string_simple_sync((void *)dev,
strindex, buf, buflen);
@@ -233,6 +245,12 @@ usb_get_descriptor_by_endpoint(usb_dev_handle * udev, int ep, uint8_t type,
{
memset(buf, 0, size);
+ if (udev == NULL)
+ return (-1);
+
+ if (size > 65535)
+ size = 65535;
+
return (usb_control_msg(udev, ep | USB_ENDPOINT_IN,
USB_REQ_GET_DESCRIPTOR, (type << 8) + ep_index, 0,
buf, size, 1000));
@@ -244,6 +262,12 @@ usb_get_descriptor(usb_dev_handle * udev, uint8_t type, uint8_t desc_index,
{
memset(buf, 0, size);
+ if (udev == NULL)
+ return (-1);
+
+ if (size > 65535)
+ size = 65535;
+
return (usb_control_msg(udev, USB_ENDPOINT_IN, USB_REQ_GET_DESCRIPTOR,
(type << 8) + desc_index, 0, buf, size, 1000));
}
@@ -943,3 +967,49 @@ usb_get_busses(void)
{
return (usb_busses);
}
+
+int
+usb_get_driver_np(usb_dev_handle * dev, int interface, char *name, int namelen)
+{
+ struct libusb20_device *pdev;
+ char *ptr;
+ int err;
+
+ pdev = (void *)dev;
+
+ if (pdev == NULL)
+ return (-1);
+ if (namelen < 1)
+ return (-1);
+ if (namelen > 255)
+ namelen = 255;
+
+ err = libusb20_dev_get_iface_desc(pdev, interface, name, namelen);
+ if (err != 0)
+ return (-1);
+
+ /* we only want the driver name */
+ ptr = strstr(name, ":");
+ if (ptr != NULL)
+ *ptr = 0;
+
+ return (0);
+}
+
+int
+usb_detach_kernel_driver_np(usb_dev_handle * dev, int interface)
+{
+ struct libusb20_device *pdev;
+ int err;
+
+ pdev = (void *)dev;
+
+ if (pdev == NULL)
+ return (-1);
+
+ err = libusb20_dev_detach_kernel_driver(pdev, interface);
+ if (err != 0)
+ return (-1);
+
+ return (0);
+}
diff --git a/lib/libusb/libusb10.c b/lib/libusb/libusb10.c
index 737e610..3ecba58 100644
--- a/lib/libusb/libusb10.c
+++ b/lib/libusb/libusb10.c
@@ -719,6 +719,8 @@ libusb_get_driver(struct libusb20_device *pdev, int interface,
return (LIBUSB_ERROR_INVALID_PARAM);
if (namelen < 1)
return (LIBUSB_ERROR_INVALID_PARAM);
+ if (namelen > 255)
+ namelen = 255;
err = libusb20_dev_get_iface_desc(
pdev, interface, name, namelen);
diff --git a/lib/libusb/libusb10_desc.c b/lib/libusb/libusb10_desc.c
index 5823723..3448679 100644
--- a/lib/libusb/libusb10_desc.c
+++ b/lib/libusb/libusb10_desc.c
@@ -300,6 +300,9 @@ libusb_get_string_descriptor_ascii(libusb_device_handle *pdev,
if (pdev == NULL || data == NULL || length < 1)
return (LIBUSB20_ERROR_INVALID_PARAM);
+ if (length > 65535)
+ length = 65535;
+
/* put some default data into the destination buffer */
data[0] = 0;
@@ -314,6 +317,12 @@ int
libusb_get_descriptor(libusb_device_handle * devh, uint8_t desc_type,
uint8_t desc_index, uint8_t *data, int length)
{
+ if (devh == NULL || data == NULL || length < 1)
+ return (LIBUSB20_ERROR_INVALID_PARAM);
+
+ if (length > 65535)
+ length = 65535;
+
return (libusb_control_transfer(devh, LIBUSB_ENDPOINT_IN,
LIBUSB_REQUEST_GET_DESCRIPTOR, (desc_type << 8) | desc_index, 0, data,
length, 1000));
diff --git a/lib/libusb/libusb20.c b/lib/libusb/libusb20.c
index 716f540..b35e2bf 100644
--- a/lib/libusb/libusb20.c
+++ b/lib/libusb/libusb20.c
@@ -1081,6 +1081,8 @@ libusb20_dev_get_iface_desc(struct libusb20_device *pdev,
if ((buf == NULL) || (len == 0))
return (LIBUSB20_ERROR_INVALID_PARAM);
+ buf[0] = 0; /* set default string value */
+
return (pdev->beMethods->dev_get_iface_desc(
pdev, iface_index, buf, len));
}
diff --git a/lib/libusb/usb.h b/lib/libusb/usb.h
index 8ee68f2..dc3959e 100644
--- a/lib/libusb/usb.h
+++ b/lib/libusb/usb.h
@@ -299,6 +299,8 @@ int usb_find_busses(void);
int usb_find_devices(void);
struct usb_device *usb_device(usb_dev_handle * dev);
struct usb_bus *usb_get_busses(void);
+int usb_get_driver_np(usb_dev_handle * dev, int interface, char *name, int namelen);
+int usb_detach_kernel_driver_np(usb_dev_handle * dev, int interface);
#if 0
{ /* style */
diff --git a/lib/libutil/login.conf.5 b/lib/libutil/login.conf.5
index 2d1b906..134c779 100644
--- a/lib/libutil/login.conf.5
+++ b/lib/libutil/login.conf.5
@@ -19,7 +19,7 @@
.\"
.\" $FreeBSD$
.\"
-.Dd August 20, 2008
+.Dd July 8, 2011
.Dt LOGIN.CONF 5
.Os
.Sh NAME
@@ -190,6 +190,7 @@ notation may be used.
.It "vmemoryuse size Maximum permitted total VM usage per process.
.It "stacksize size Maximum stack size limit.
.It "pseudoterminals number Maximum number of pseudo-terminals.
+.It "swapuse size Maximum swap space size limit.
.El
.Pp
These resource limit entries actually specify both the maximum
diff --git a/release/Makefile b/release/Makefile
index f8a52d6..0e07ed3 100644
--- a/release/Makefile
+++ b/release/Makefile
@@ -68,12 +68,7 @@ base.txz:
# Set up mergemaster root database
sh ${.CURDIR}/scripts/mm-mtree.sh -F \
"TARGET_ARCH=${TARGET_ARCH} TARGET=${TARGET}" -D "${DISTDIR}/base"
-# Merge handbook, etc. from doc tree into src tree doc distribution
-.if !defined(NODOC)
- cd ${DOCDIR} && ${IMAKE} all install \
- DOCDIR=${DISTDIR}/doc/usr/share/doc 'FORMATS=html html-split txt' \
- INSTALL_COMPRESSED='' URLS_ABSOLUTE=YES
-.endif
+# Package all components
cd ${WORLDDIR} && ${IMAKE} packageworld DISTDIR=${DISTDIR}
mv ${DISTDIR}/*.txz ${.OBJDIR}
diff --git a/release/generate-release.sh b/release/generate-release.sh
index 080512a..cdba026 100755
--- a/release/generate-release.sh
+++ b/release/generate-release.sh
@@ -57,9 +57,8 @@ fi
if [ -d $2/usr/doc ]; then
cp /etc/resolv.conf $2/etc/resolv.conf
- # Build ports to build the docs, then build the docs
+ # Build ports to build release documentation
chroot $2 /bin/sh -c 'pkg_add -r docproj || (cd /usr/ports/textproc/docproj && make install clean BATCH=yes WITHOUT_X11=yes JADETEX=no WITHOUT_PYTHON=yes)'
- chroot $2 make -C /usr/doc $MAKE_FLAGS 'FORMATS=html html-split txt' URLS_ABSOLUTE=YES
fi
chroot $2 make -C /usr/src $MAKE_FLAGS buildworld buildkernel
diff --git a/release/ia64/make-memstick.sh b/release/ia64/make-memstick.sh
new file mode 100755
index 0000000..c9ff580
--- /dev/null
+++ b/release/ia64/make-memstick.sh
@@ -0,0 +1,38 @@
+#!/bin/sh
+#
+# This script generates a "memstick image" (image that can be copied to a
+# USB memory stick) from a directory tree. Note that the script does not
+# clean up after itself very well for error conditions on purpose so the
+# problem can be diagnosed (full filesystem most likely but ...).
+#
+# Usage: make-memstick.sh <directory tree> <image filename>
+#
+# $FreeBSD$
+#
+
+PATH=/bin:/usr/bin:/sbin:/usr/sbin
+export PATH
+
+BLOCKSIZE=10240
+
+if [ $# -ne 2 ]; then
+ echo "make-memstick.sh /path/to/directory /path/to/image/file"
+ exit 1
+fi
+
+if [ ! -d ${1} ]; then
+ echo "${1} must be a directory"
+ exit 1
+fi
+
+if [ -e ${2} ]; then
+ echo "won't overwrite ${2}"
+ exit 1
+fi
+
+makefs -B little ${2} ${1}
+if [ $? -ne 0 ]; then
+ echo "makefs failed"
+ exit 1
+fi
+
diff --git a/sbin/dumpfs/dumpfs.8 b/sbin/dumpfs/dumpfs.8
index a489a47..858881a 100644
--- a/sbin/dumpfs/dumpfs.8
+++ b/sbin/dumpfs/dumpfs.8
@@ -28,7 +28,7 @@
.\" @(#)dumpfs.8 8.1 (Berkeley) 6/5/93
.\" $FreeBSD$
.\"
-.Dd May 8, 2011
+.Dd Jul 14, 2011
.Dt DUMPFS 8
.Os
.Sh NAME
@@ -37,6 +37,7 @@
.Sh SYNOPSIS
.Nm
.Op Fl f
+.Op Fl l
.Op Fl m
.Ar filesys | device
.Sh DESCRIPTION
@@ -44,7 +45,8 @@ The
.Nm
utility prints out the UFS super block and cylinder group information
for the file system or special device specified, unless the
-.Fl f
+.Fl f ,
+.Fl l
or
.Fl m
flag is specified.
@@ -64,6 +66,11 @@ Fragment numbers may be converted to raw byte offsets by multiplying by the
fragment size, which may be useful when recovering deleted data.
.Pp
If
+.Fl l
+is specified, the pathname to the file system's container derived from
+its unique identifier is printed.
+.Pp
+If
.Fl m
is specified, a
.Xr newfs 8
diff --git a/sbin/dumpfs/dumpfs.c b/sbin/dumpfs/dumpfs.c
index eb92ba7..c54fa2b 100644
--- a/sbin/dumpfs/dumpfs.c
+++ b/sbin/dumpfs/dumpfs.c
@@ -68,6 +68,7 @@ static const char rcsid[] =
#include <fcntl.h>
#include <fstab.h>
#include <libufs.h>
+#include <paths.h>
#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>
@@ -79,6 +80,7 @@ static const char rcsid[] =
struct uufsd disk;
int dumpfs(const char *);
+int dumpfsid(void);
int dumpcg(void);
int dumpfreespace(const char *, int);
void dumpfreespacecg(int);
@@ -92,11 +94,11 @@ int
main(int argc, char *argv[])
{
const char *name;
- int ch, dofreespace, domarshal, eval;
+ int ch, dofreespace, domarshal, dolabel, eval;
- dofreespace = domarshal = eval = 0;
+ dofreespace = domarshal = dolabel = eval = 0;
- while ((ch = getopt(argc, argv, "fm")) != -1) {
+ while ((ch = getopt(argc, argv, "lfm")) != -1) {
switch (ch) {
case 'f':
dofreespace++;
@@ -104,6 +106,9 @@ main(int argc, char *argv[])
case 'm':
domarshal = 1;
break;
+ case 'l':
+ dolabel = 1;
+ break;
case '?':
default:
usage();
@@ -129,6 +134,8 @@ main(int argc, char *argv[])
eval |= dumpfreespace(name, dofreespace);
else if (domarshal)
eval |= marshal(name);
+ else if (dolabel)
+ eval |= dumpfsid();
else
eval |= dumpfs(name);
ufs_disk_close(&disk);
@@ -137,6 +144,14 @@ main(int argc, char *argv[])
}
int
+dumpfsid(void)
+{
+
+ printf("%sufsid/%08x%08x\n", _PATH_DEV, afs.fs_id[0], afs.fs_id[1]);
+ return 0;
+}
+
+int
dumpfs(const char *name)
{
time_t fstime;
diff --git a/sbin/fdisk/fdisk.c b/sbin/fdisk/fdisk.c
index 8314906..eb81e3b 100644
--- a/sbin/fdisk/fdisk.c
+++ b/sbin/fdisk/fdisk.c
@@ -108,9 +108,9 @@ typedef struct cmd {
char cmd;
int n_args;
struct arg {
- char argtype;
- int arg_val;
- char *arg_str;
+ char argtype;
+ unsigned long arg_val;
+ char * arg_str;
} args[MAX_ARGS];
} CMD;
@@ -990,7 +990,7 @@ parse_config_line(char *line, CMD *command)
if (isalpha(*cp))
command->args[command->n_args].argtype = *cp++;
end = NULL;
- command->args[command->n_args].arg_val = strtol(cp, &end, 0);
+ command->args[command->n_args].arg_val = strtoul(cp, &end, 0);
if (cp == end || (!isspace(*end) && *end != '\0')) {
char ch;
end = cp;
diff --git a/sbin/fsck_ffs/fsck.h b/sbin/fsck_ffs/fsck.h
index 250fc1f..8091d0f 100644
--- a/sbin/fsck_ffs/fsck.h
+++ b/sbin/fsck_ffs/fsck.h
@@ -395,5 +395,6 @@ void setinodebuf(ino_t);
int setup(char *dev);
void gjournal_check(const char *filesys);
int suj_check(const char *filesys);
+void update_maps(struct cg *, struct cg*, int);
#endif /* !_FSCK_H_ */
diff --git a/sbin/fsck_ffs/pass5.c b/sbin/fsck_ffs/pass5.c
index 01ed8a5..b95df73 100644
--- a/sbin/fsck_ffs/pass5.c
+++ b/sbin/fsck_ffs/pass5.c
@@ -49,8 +49,8 @@ __FBSDID("$FreeBSD$");
#include "fsck.h"
-static void check_maps(u_char *, u_char *, int, ufs2_daddr_t, const char *, int *, int, int);
-
+static void check_maps(u_char *, u_char *, int, ufs2_daddr_t, const char *,
+ int *, int, int, int);
static void clear_blocks(ufs2_daddr_t start, ufs2_daddr_t end);
void
@@ -61,7 +61,7 @@ pass5(void)
struct fs *fs = &sblock;
struct cg *cg = &cgrp;
ufs2_daddr_t d, dbase, dmax, start;
- int excessdirs, rewritecg = 0;
+ int rewritecg = 0;
struct csum *cs;
struct csum_total cstotal;
struct inodesc idesc[3];
@@ -333,27 +333,8 @@ pass5(void)
memmove(cg, newcg, (size_t)basesize);
cgdirty();
}
- if (bkgrdflag != 0 || usedsoftdep || debug) {
- excessdirs = cg->cg_cs.cs_ndir - newcg->cg_cs.cs_ndir;
- if (excessdirs < 0) {
- pfatal("LOST %d DIRECTORIES\n", -excessdirs);
- excessdirs = 0;
- }
- if (excessdirs > 0)
- check_maps(cg_inosused(newcg), cg_inosused(cg),
- inomapsize,
- cg->cg_cgx * (ufs2_daddr_t) fs->fs_ipg,
- "DIR",
- freedirs, 0, excessdirs);
- check_maps(cg_inosused(newcg), cg_inosused(cg),
- inomapsize,
- cg->cg_cgx * (ufs2_daddr_t) fs->fs_ipg, "FILE",
- freefiles, excessdirs, fs->fs_ipg);
- check_maps(cg_blksfree(cg), cg_blksfree(newcg),
- blkmapsize,
- cg->cg_cgx * (ufs2_daddr_t) fs->fs_fpg, "FRAG",
- freeblks, 0, fs->fs_fpg);
- }
+ if (bkgrdflag != 0 || usedsoftdep || debug)
+ update_maps(cg, newcg, bkgrdflag);
if (cursnapshot == 0 &&
memcmp(cg_inosused(newcg), cg_inosused(cg), mapsize) != 0 &&
dofix(&idesc[1], "BLK(S) MISSING IN BIT MAPS")) {
@@ -426,6 +407,40 @@ pass5(void)
}
}
+/*
+ * Compare the original cylinder group inode and block bitmaps with the
+ * updated cylinder group inode and block bitmaps. Free inodes and blocks
+ * that have been added. Complain if any previously freed inodes blocks
+ * are now allocated.
+ */
+void
+update_maps(
+ struct cg *oldcg, /* cylinder group of claimed allocations */
+ struct cg *newcg, /* cylinder group of determined allocations */
+ int usesysctl) /* 1 => use sysctl interface to update maps */
+{
+ int inomapsize, excessdirs;
+ struct fs *fs = &sblock;
+
+ inomapsize = howmany(fs->fs_ipg, CHAR_BIT);
+ excessdirs = oldcg->cg_cs.cs_ndir - newcg->cg_cs.cs_ndir;
+ if (excessdirs < 0) {
+ pfatal("LOST %d DIRECTORIES\n", -excessdirs);
+ excessdirs = 0;
+ }
+ if (excessdirs > 0)
+ check_maps(cg_inosused(newcg), cg_inosused(oldcg), inomapsize,
+ oldcg->cg_cgx * (ufs2_daddr_t)fs->fs_ipg, "DIR", freedirs,
+ 0, excessdirs, usesysctl);
+ check_maps(cg_inosused(newcg), cg_inosused(oldcg), inomapsize,
+ oldcg->cg_cgx * (ufs2_daddr_t)fs->fs_ipg, "FILE", freefiles,
+ excessdirs, fs->fs_ipg, usesysctl);
+ check_maps(cg_blksfree(oldcg), cg_blksfree(newcg),
+ howmany(fs->fs_fpg, CHAR_BIT),
+ oldcg->cg_cgx * (ufs2_daddr_t)fs->fs_fpg, "FRAG",
+ freeblks, 0, fs->fs_fpg, usesysctl);
+}
+
static void
check_maps(
u_char *map1, /* map of claimed allocations */
@@ -435,7 +450,8 @@ check_maps(
const char *name, /* name of resource found in maps */
int *opcode, /* sysctl opcode to free resource */
int skip, /* number of entries to skip before starting to free */
- int limit) /* limit on number of entries to free */
+ int limit, /* limit on number of entries to free */
+ int usesysctl) /* 1 => use sysctl interface to update maps */
{
# define BUFSIZE 16
char buf[BUFSIZE];
@@ -443,7 +459,7 @@ check_maps(
ufs2_daddr_t n, astart, aend, ustart, uend;
void (*msg)(const char *fmt, ...);
- if (bkgrdflag)
+ if (usesysctl)
msg = pfatal;
else
msg = pwarn;
@@ -506,7 +522,7 @@ check_maps(
" MARKED USED\n",
"UNALLOCATED", name, ustart,
ustart + size - 1);
- if (bkgrdflag != 0) {
+ if (usesysctl != 0) {
cmd.value = ustart;
cmd.size = size;
if (sysctl(opcode, MIBSIZE, 0, 0,
@@ -552,7 +568,7 @@ check_maps(
" MARKED USED\n",
name, ustart, ustart + size - 1);
}
- if (bkgrdflag != 0) {
+ if (usesysctl != 0) {
cmd.value = ustart;
cmd.size = size;
if (sysctl(opcode, MIBSIZE, 0, 0, &cmd,
diff --git a/sbin/hastctl/hastctl.c b/sbin/hastctl/hastctl.c
index 2f8a6eb..233b948 100644
--- a/sbin/hastctl/hastctl.c
+++ b/sbin/hastctl/hastctl.c
@@ -403,15 +403,15 @@ main(int argc, char *argv[])
break;
case 'e':
if (expand_number(optarg, &extentsize) < 0)
- err(1, "Invalid extentsize");
+ errx(EX_USAGE, "Invalid extentsize");
break;
case 'k':
if (expand_number(optarg, &keepdirty) < 0)
- err(1, "Invalid keepdirty");
+ errx(EX_USAGE, "Invalid keepdirty");
break;
case 'm':
if (expand_number(optarg, &mediasize) < 0)
- err(1, "Invalid mediasize");
+ errx(EX_USAGE, "Invalid mediasize");
break;
case 'h':
default:
diff --git a/sbin/hastd/control.c b/sbin/hastd/control.c
index 4d00403..57a1c8a 100644
--- a/sbin/hastd/control.c
+++ b/sbin/hastd/control.c
@@ -155,8 +155,7 @@ control_status_worker(struct hast_resource *res, struct nv *nvout,
const char *str;
int error;
- cnvin = cnvout = NULL;
- error = 0;
+ cnvin = NULL;
/*
* Prepare and send command to worker process.
diff --git a/sbin/hastd/primary.c b/sbin/hastd/primary.c
index e1f2ba4..dd414f8 100644
--- a/sbin/hastd/primary.c
+++ b/sbin/hastd/primary.c
@@ -1688,7 +1688,7 @@ ggate_send_thread(void *arg)
if (ggio->gctl_error == 0 && ggio->gctl_cmd == BIO_WRITE) {
mtx_lock(&res->hr_amp_lock);
if (activemap_write_complete(res->hr_amp,
- ggio->gctl_offset, ggio->gctl_length)) {
+ ggio->gctl_offset, ggio->gctl_length)) {
res->hr_stat_activemap_update++;
(void)hast_activemap_flush(res);
}
diff --git a/sbin/ifconfig/Makefile b/sbin/ifconfig/Makefile
index 461de71..d4bdd1e 100644
--- a/sbin/ifconfig/Makefile
+++ b/sbin/ifconfig/Makefile
@@ -29,6 +29,7 @@ SRCS+= af_nd6.c # ND6 support
SRCS+= ifclone.c # clone device support
SRCS+= ifmac.c # MAC support
SRCS+= ifmedia.c # SIOC[GS]IFMEDIA support
+SRCS+= iffib.c # non-default FIB support
SRCS+= ifvlan.c # SIOC[GS]ETVLAN support
SRCS+= ifgre.c # GRE keys etc
SRCS+= ifgif.c # GIF reversed header workaround
diff --git a/sbin/ifconfig/af_inet.c b/sbin/ifconfig/af_inet.c
index 6b4d735..19e27c9 100644
--- a/sbin/ifconfig/af_inet.c
+++ b/sbin/ifconfig/af_inet.c
@@ -200,7 +200,10 @@ static struct afswtch af_inet = {
static __constructor void
inet_ctor(void)
{
+
+#ifndef RESCUE
if (!feature_present("inet"))
return;
+#endif
af_register(&af_inet);
}
diff --git a/sbin/ifconfig/af_inet6.c b/sbin/ifconfig/af_inet6.c
index 585be05..e39c1c8 100644
--- a/sbin/ifconfig/af_inet6.c
+++ b/sbin/ifconfig/af_inet6.c
@@ -545,8 +545,10 @@ inet6_ctor(void)
#define N(a) (sizeof(a) / sizeof(a[0]))
size_t i;
+#ifndef RESCUE
if (!feature_present("inet6"))
return;
+#endif
for (i = 0; i < N(inet6_cmds); i++)
cmd_register(&inet6_cmds[i]);
diff --git a/sbin/ifconfig/ifconfig.8 b/sbin/ifconfig/ifconfig.8
index 45cf59b..cec32c5 100644
--- a/sbin/ifconfig/ifconfig.8
+++ b/sbin/ifconfig/ifconfig.8
@@ -28,7 +28,7 @@
.\" From: @(#)ifconfig.8 8.3 (Berkeley) 1/5/94
.\" $FreeBSD$
.\"
-.Dd May 31, 2011
+.Dd July 3, 2011
.Dt IFCONFIG 8
.Os
.Sh NAME
@@ -296,6 +296,19 @@ Remove the interface from the given
Fill interface index
(lowermost 64bit of an IPv6 address)
automatically.
+.It Cm fib Ar fib_number
+Specify interface FIB.
+A FIB
+.Ar fib_number
+is assigned to all frames or packets received on that interface.
+The FIB is not inherited, e.g. vlans or other sub-interfaces will use
+the default FIB (0) irrespective of the parent interface's FIB.
+The kernel needs to be tuned to support more than the default FIB
+using the
+.Va ROUTETABLES
+kernel configuration option, or the
+.Va net.fibs
+tunable.
.It Cm ipdst
This is used to specify an Internet host who is willing to receive
IP packets encapsulating IPX packets bound for a remote network.
diff --git a/sbin/ifconfig/ifconfig.c b/sbin/ifconfig/ifconfig.c
index 408d77e..af280ce 100644
--- a/sbin/ifconfig/ifconfig.c
+++ b/sbin/ifconfig/ifconfig.c
@@ -498,10 +498,12 @@ ifconfig(int argc, char *const *argv, int iscreate, const struct afswtch *uafp)
* ifconfig IF up/down etc. to work without INET support as people
* never used ifconfig IF link up/down, etc. either.
*/
+#ifndef RESCUE
#ifdef INET
if (afp == NULL && feature_present("inet"))
afp = af_getbyname("inet");
#endif
+#endif
if (afp == NULL)
afp = af_getbyname("link");
if (afp == NULL) {
diff --git a/sbin/ifconfig/iffib.c b/sbin/ifconfig/iffib.c
new file mode 100644
index 0000000..f3498b4
--- /dev/null
+++ b/sbin/ifconfig/iffib.c
@@ -0,0 +1,103 @@
+/*-
+ * Copyright (c) 2011 Alexander V. Chernikov
+ * Copyright (c) 2011 Christian S.J. Peron
+ * Copyright (c) 2011 Bjoern A. Zeeb
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * $FreeBSD$
+ */
+
+#include <sys/param.h>
+#include <sys/ioctl.h>
+#include <sys/socket.h>
+#include <sys/sockio.h>
+
+#include <net/if.h>
+#include <net/route.h>
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <err.h>
+
+#include "ifconfig.h"
+
+static void
+fib_status(int s)
+{
+ struct ifreq ifr;
+
+ memset(&ifr, 0, sizeof(ifr));
+ strncpy(ifr.ifr_name, name, sizeof(ifr.ifr_name));
+
+ if (ioctl(s, SIOCGIFFIB, (caddr_t)&ifr) < 0)
+ return;
+
+ /* Ignore if it is the default. */
+ if (ifr.ifr_fib == 0)
+ return;
+
+ printf("\tfib: %u\n", ifr.ifr_fib);
+}
+
+static void
+setiffib(const char *val, int dummy __unused, int s,
+ const struct afswtch *afp)
+{
+ unsigned long fib;
+ char *ep;
+
+ fib = strtoul(val, &ep, 0);
+ if (*ep != '\0' || fib > UINT_MAX) {
+ warn("fib %s not valid", val);
+ return;
+ }
+
+ strncpy(ifr.ifr_name, name, sizeof (ifr.ifr_name));
+ ifr.ifr_fib = fib;
+ if (ioctl(s, SIOCSIFFIB, (caddr_t)&ifr) < 0)
+ warn("ioctl (SIOCSIFFIB)");
+}
+
+static struct cmd fib_cmds[] = {
+ DEF_CMD_ARG("fib", setiffib),
+};
+
+static struct afswtch af_fib = {
+ .af_name = "af_fib",
+ .af_af = AF_UNSPEC,
+ .af_other_status = fib_status,
+};
+
+static __constructor void
+fib_ctor(void)
+{
+#define N(a) (sizeof(a) / sizeof(a[0]))
+ size_t i;
+
+ for (i = 0; i < N(fib_cmds); i++)
+ cmd_register(&fib_cmds[i]);
+ af_register(&af_fib);
+#undef N
+}
diff --git a/sbin/natd/natd.8 b/sbin/natd/natd.8
index 6bed424..0729e2c 100644
--- a/sbin/natd/natd.8
+++ b/sbin/natd/natd.8
@@ -473,7 +473,7 @@ This option is intended to be used with multiple instances:
packets received on this port are checked against
internal translation tables of every configured instance.
If an entry is found, packet is aliased according to that entry.
-In no entry was found in any of the instances, packet is passed
+If no entry was found in any of the instances, packet is passed
unchanged, and no new entry will be created.
See the section
.Sx MULTIPLE INSTANCES
diff --git a/sbin/newfs_msdos/newfs_msdos.c b/sbin/newfs_msdos/newfs_msdos.c
index 955c3a5..6d8fa7e 100644
--- a/sbin/newfs_msdos/newfs_msdos.c
+++ b/sbin/newfs_msdos/newfs_msdos.c
@@ -44,6 +44,7 @@ static const char rcsid[] =
#include <fcntl.h>
#include <inttypes.h>
#include <paths.h>
+#include <signal.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
@@ -216,6 +217,9 @@ static const u_int8_t bootcode[] = {
0
};
+static volatile sig_atomic_t got_siginfo;
+static void infohandler(int);
+
static void check_mounted(const char *, mode_t);
static void getstdfmt(const char *, struct bpb *);
static void getdiskinfo(int, const char *, const char *, int,
@@ -243,6 +247,7 @@ main(int argc, char *argv[])
int opt_N = 0;
int Iflag = 0, mflag = 0, oflag = 0;
char buf[MAXPATHLEN];
+ struct sigaction si_sa;
struct stat sb;
struct timeval tv;
struct bpb bpb;
@@ -604,7 +609,19 @@ main(int argc, char *argv[])
if (!(img = malloc(bpb.bpbBytesPerSec)))
err(1, NULL);
dir = bpb.bpbResSectors + (bpb.bpbFATsecs ? bpb.bpbFATsecs : bpb.bpbBigFATsecs) * bpb.bpbFATs;
+ memset(&si_sa, 0, sizeof(si_sa));
+ si_sa.sa_handler = infohandler;
+ if (sigaction(SIGINFO, &si_sa, NULL) == -1)
+ err(1, "sigaction SIGINFO");
for (lsn = 0; lsn < dir + (fat == 32 ? bpb.bpbSecPerClust : rds); lsn++) {
+ if (got_siginfo) {
+ fprintf(stderr,"%s: writing sector %u of %u (%u%%)\n",
+ fname, lsn,
+ (dir + (fat == 32 ? bpb.bpbSecPerClust: rds)),
+ (lsn * 100) / (dir +
+ (fat == 32 ? bpb.bpbSecPerClust: rds)));
+ got_siginfo = 0;
+ }
x = lsn;
if (opt_B &&
fat == 32 && bpb.bpbBackup != MAXU16 &&
@@ -1017,3 +1034,10 @@ usage(void)
"\t-u sectors/track\n");
exit(1);
}
+
+static void
+infohandler(int sig __unused)
+{
+
+ got_siginfo = 1;
+}
diff --git a/sbin/shutdown/shutdown.8 b/sbin/shutdown/shutdown.8
index 032c4f3..b7067e1 100644
--- a/sbin/shutdown/shutdown.8
+++ b/sbin/shutdown/shutdown.8
@@ -28,7 +28,7 @@
.\" @(#)shutdown.8 8.2 (Berkeley) 4/27/95
.\" $FreeBSD$
.\"
-.Dd December 30, 2010
+.Dd July 13, 2011
.Dt SHUTDOWN 8
.Os
.Sh NAME
@@ -83,20 +83,20 @@ If one of the
.Fl p
or
.Fl r
-is specified,
+options are specified,
.Nm
will execute
.Xr halt 8
or
.Xr reboot 8
-instead of sending signal to
+instead of sending a signal to
.Xr init 8 .
.It Fl n
If the
.Fl o
-is specified, prevent the file system cache from being flushed by passing
+option is specified, prevent the file system cache from being flushed by passing
.Fl n
-option to
+to
.Xr halt 8
or
.Xr reboot 8 .
@@ -106,10 +106,10 @@ This option should probably not be used.
is the time at which
.Nm
will bring the system down and
-may be the word
+may be the case-insensitive word
.Ar now
(indicating an immediate shutdown) or
-specify a future time in one of two formats:
+a future time in one of two formats:
.Ar +number ,
or
.Ar yymmddhhmm ,
@@ -148,7 +148,7 @@ exits.
.Pp
At shutdown time a message is written to the system log, containing the
time of shutdown, the person who initiated the shutdown and the reason.
-Corresponding signal is then sent to
+The corresponding signal is then sent to
.Xr init 8
to respectively halt, reboot or bring the system down to single-user state
(depending on the above options).
@@ -170,22 +170,24 @@ file that
.Nm
created will be removed automatically.
.Pp
-When run without options, the
+When run without options, the
.Nm
-utility will place the system into single user mode at the
+utility will place the system into single user mode at the
.Ar time
specified.
.Pp
-Calling utility as
-.Nm poweroff
-is equivalent of calling:
+Calling
+.Dq Nm poweroff
+is equivalent to running:
.Bd -literal -offset indent
shutdown -p now
.Ed
.Sh FILES
.Bl -tag -width /var/run/nologin -compact
.It Pa /var/run/nologin
-tells login not to let anyone log in
+tells
+.Xr login 1
+not to let anyone log in
.El
.Sh COMPATIBILITY
The hours and minutes in the second time format may be separated by
diff --git a/sbin/umount/umount.c b/sbin/umount/umount.c
index 9b75449..6c65aec 100644
--- a/sbin/umount/umount.c
+++ b/sbin/umount/umount.c
@@ -154,6 +154,8 @@ main(int argc, char *argv[])
sfs = &mntbuf[mntsize];
if (checkvfsname(sfs->f_fstypename, typelist))
continue;
+ if (strcmp(sfs->f_mntonname, "/dev") == 0)
+ continue;
if (umountfs(sfs) != 0)
errs = 1;
}
diff --git a/share/doc/bind9/Makefile b/share/doc/bind9/Makefile
index 04b5708..4d38b11 100644
--- a/share/doc/bind9/Makefile
+++ b/share/doc/bind9/Makefile
@@ -8,17 +8,20 @@ SRCDIR= ${BIND_DIR}/doc
NO_OBJ=
FILESGROUPS= TOP ARM MISC
-TOP= CHANGES COPYRIGHT FAQ KNOWN-DEFECTS NSEC3-NOTES README \
- README.idnkit README.pkcs11
+TOP= CHANGES COPYRIGHT FAQ HISTORY README
TOPDIR= ${DOCDIR}/bind9
ARM= Bv9ARM.ch01.html Bv9ARM.ch02.html Bv9ARM.ch03.html \
Bv9ARM.ch04.html Bv9ARM.ch05.html Bv9ARM.ch06.html \
Bv9ARM.ch07.html Bv9ARM.ch08.html Bv9ARM.ch09.html \
- Bv9ARM.ch10.html Bv9ARM.html man.dig.html \
+ Bv9ARM.ch10.html Bv9ARM.html \
+ man.arpaname.html man.ddns-confgen.html man.dig.html \
man.dnssec-dsfromkey.html man.dnssec-keyfromlabel.html \
- man.dnssec-keygen.html man.dnssec-signzone.html man.host.html \
+ man.dnssec-keygen.html man.dnssec-revoke.html \
+ man.dnssec-settime.html man.dnssec-signzone.html \
+ man.genrandom.html man.host.html man.isc-hmac-fixup.html \
man.named-checkconf.html man.named-checkzone.html \
- man.named.html man.nsupdate.html \
+ man.named-journalprint.html man.named.html \
+ man.nsec3hash.html man.nsupdate.html \
man.rndc-confgen.html man.rndc.conf.html man.rndc.html
ARMDIR= ${TOPDIR}/arm
MISC= dnssec format-options.pl ipv6 migration migration-4to9 \
diff --git a/share/man/man3/pthread_set_name_np.3 b/share/man/man3/pthread_set_name_np.3
index 3bf430a..aad2fd6 100644
--- a/share/man/man3/pthread_set_name_np.3
+++ b/share/man/man3/pthread_set_name_np.3
@@ -44,9 +44,6 @@ function sets internal name for thread specified by
argument to string value specified by
.Fa name
argument.
-.Pp
-This is a debugging interface and using it on a day-by-day basis makes
-no sense.
.Sh ERRORS
Because of the debugging nature of this function, all errors that may
appear inside are silently ignored.
diff --git a/share/man/man4/axe.4 b/share/man/man4/axe.4
index e11c85a..156aa61 100644
--- a/share/man/man4/axe.4
+++ b/share/man/man4/axe.4
@@ -30,12 +30,12 @@
.\"
.\" $FreeBSD$
.\"
-.Dd January 16, 2011
+.Dd July 14, 2011
.Dt AXE 4
.Os
.Sh NAME
.Nm axe
-.Nd "ASIX Electronics AX88172/178/772 USB Ethernet driver"
+.Nd "ASIX Electronics AX88x7x/760 USB Ethernet driver"
.Sh SYNOPSIS
To compile this driver into the kernel,
place the following lines in your
@@ -59,12 +59,14 @@ if_axe_load="YES"
The
.Nm
driver provides support for USB Ethernet adapters based on the ASIX
-Electronics AX88172, AX88178 and AX88772 USB 2.0 chipsets.
+Electronics AX88172, AX88178, AX88772, AX88772A, AX88772B and AX88760
+USB 2.0 chipsets.
.Pp
-The AX88172 and AX88178 are USB 2.0 devices that contain a 10/100
+The AX88172, AX88772, AX88772A, AX88772B and AX88760 contain a 10/100
Ethernet MAC with MII interface and are designed to work with both
Ethernet and HomePNA transceivers.
-The AX88772 will additionally support 10/100/1000 MACs.
+The AX88178 has a 10/100/1000 Ethernet MAC with GMII/RGMII interface
+for interfacing with Gigabit Ethernet PHY.
.Pp
These devices will operate with
both USB 1.x and USB 2.0 controllers, however performance with 1.x
@@ -85,43 +87,48 @@ driver supports the following media types:
.It Cm autoselect
Enable autoselection of the media type and options.
The user can manually override
-the autoselected mode by adding media options to the
-.Pa /etc/rc.conf
-file.
+the autoselected mode by adding media options to
+.Xr rc.conf 5 .
.It Cm 10baseT/UTP
Set 10Mbps operation.
The
+.Xr ifconfig 8
.Cm mediaopt
-option can also be used to enable
-.Cm full-duplex
-operation.
-Not specifying
+option can also be used to select either
.Cm full-duplex
-implies
+or
.Cm half-duplex
-mode.
+modes.
.It Cm 100baseTX
Set 100Mbps (Fast Ethernet) operation.
The
+.Xr ifconfig 8
.Cm mediaopt
-option can also be used to enable
+option can also be used to select either
.Cm full-duplex
-operation.
-Not specifying
+or
+.Cm half-duplex
+modes.
+.It Cm 1000baseT
+Set 1000Mbps (Gigabit Ethernet) operation (AX88178 only).
+The
+.Xr ifconfig 8
+.Cm mediaopt
+option can also be used to select either
.Cm full-duplex
-implies
+or
.Cm half-duplex
-mode.
+modes.
.El
.Pp
The
.Nm
driver supports the following media options:
-.Bl -tag -width ".Cm 10baseT/UTP"
+.Bl -tag -width ".Cm full-duplex"
.It Cm full-duplex
Force full duplex operation.
-The interface will operate in
-half duplex mode if this media option is not specified.
+.It Cm half-duplex
+Force half duplex operation.
.El
.Pp
For more information on configuring this device, see
@@ -129,8 +136,8 @@ For more information on configuring this device, see
.Sh HARDWARE
The
.Nm
-driver supports ASIX Electronics AX88172/AX88178/AX88772 based USB Ethernet
-adapters including:
+driver supports ASIX Electronics AX88172/AX88178/AX88772/AX88772A/AX88772B/AX88760
+based USB Ethernet adapters including:
.Pp
AX88172:
.Bl -bullet -compact
@@ -139,6 +146,8 @@ AboCom UF200
.It
Acer Communications EP1427X2
.It
+ASIX AX88172
+.It
ATen UC210T
.It
Billionton SnapPort
@@ -167,6 +176,8 @@ System TALKS Inc.\& SGC-X2UL
AX88178:
.Bl -bullet -compact
.It
+ASIX AX88178
+.It
Belkin F5D5055
.It
Logitec LAN-GTJ/U2A
@@ -181,9 +192,9 @@ Sitecom Europe LN-028
AX88772:
.Bl -bullet -compact
.It
-Buffalo (Melco Inc.) LUA3-U2-ATX
+ASIX AX88772
.It
-Cisco-Linksys USB200Mv2
+Buffalo (Melco Inc.) LUA3-U2-ATX
.It
D-Link DUBE100B1
.It
@@ -191,6 +202,26 @@ Planex UE-200TX-G
.It
Planex UE-200TX-G2
.El
+.Pp
+AX88772A:
+.Bl -bullet -compact
+.It
+ASIX AX88772A
+.It
+Cisco-Linksys USB200Mv2
+.El
+.Pp
+AX88772B:
+.Bl -bullet -compact
+.It
+ASIX AX88772B
+.El
+.Pp
+AX88760:
+.Bl -bullet -compact
+.It
+ASIX AX88760
+.El
.Sh DIAGNOSTICS
.Bl -diag
.It "axe%d: watchdog timeout"
@@ -209,7 +240,7 @@ The driver failed to allocate an mbuf for the receiver ring.
.Xr rgephy 4 ,
.Xr ifconfig 8
.Rs
-.%T "ASIX AX88172 AX88178 and AX88772 data sheets"
+.%T "ASIX AX88x7x and AX88760 data sheets"
.%U http://www.asix.com.tw
.Re
.Sh HISTORY
diff --git a/share/man/man8/picobsd.8 b/share/man/man8/picobsd.8
index 21ddb71..e95786d 100644
--- a/share/man/man8/picobsd.8
+++ b/share/man/man8/picobsd.8
@@ -647,7 +647,8 @@ already exists on disk (e.g.\& as a result of a previous update).
.Sh SEE ALSO
.Xr crunchgen 1 ,
.Xr mdconfig 8 ,
-.Xr swapon 8
+.Xr nanobsd 8 ,
+.Xr swapon 8
.Sh AUTHORS
.An -nosplit
.An Andrzej Bialecki Aq abial@FreeBSD.org ,
diff --git a/share/man/man9/Makefile b/share/man/man9/Makefile
index 815ddd0..a04cb68 100644
--- a/share/man/man9/Makefile
+++ b/share/man/man9/Makefile
@@ -296,7 +296,6 @@ MAN= accept_filter.9 \
vm_fault_prefault.9 \
vm_map.9 \
vm_map_check_protection.9 \
- vm_map_clean.9 \
vm_map_create.9 \
vm_map_delete.9 \
vm_map_entry_resize_free.9 \
@@ -314,11 +313,11 @@ MAN= accept_filter.9 \
vm_map_simplify_entry.9 \
vm_map_stack.9 \
vm_map_submap.9 \
+ vm_map_sync.9 \
vm_map_wire.9 \
vm_page_alloc.9 \
vm_page_bits.9 \
vm_page_cache.9 \
- vm_page_copy.9 \
vm_page_deactivate.9 \
vm_page_dontneed.9 \
vm_page_flag.9 \
@@ -328,12 +327,10 @@ MAN= accept_filter.9 \
vm_page_insert.9 \
vm_page_io.9 \
vm_page_lookup.9 \
- vm_page_protect.9 \
vm_page_rename.9 \
vm_page_sleep_if_busy.9 \
vm_page_wakeup.9 \
vm_page_wire.9 \
- vm_page_zero_fill.9 \
vm_set_page_size.9 \
vn_fullpath.9 \
vn_isdisk.9 \
@@ -551,8 +548,10 @@ MLINKS+=config_intrhook.9 config_intrhook_disestablish.9 \
config_intrhook.9 config_intrhook_establish.9
MLINKS+=contigmalloc.9 contigfree.9
MLINKS+=copy.9 copyin.9 \
+ copy.9 copyin_nofault.9 \
copy.9 copyinstr.9 \
copy.9 copyout.9 \
+ copy.9 copyout_nofault.9 \
copy.9 copystr.9
MLINKS+=critical_enter.9 critical.9 \
critical_enter.9 critical_exit.9
@@ -1284,7 +1283,8 @@ MLINKS+=uidinfo.9 uifind.9 \
uidinfo.9 uifree.9 \
uidinfo.9 uihashinit.9 \
uidinfo.9 uihold.9
-MLINKS+=uio.9 uiomove.9
+MLINKS+=uio.9 uiomove.9 \
+ uio.9 uiomove_nofault.9
MLINKS+=usbdi.9 usbd_do_request.9 \
usbdi.9 usbd_do_request_flags.9 \
usbdi.9 usbd_errstr.9 \
diff --git a/share/man/man9/copy.9 b/share/man/man9/copy.9
index b6b975f..37c7a0c 100644
--- a/share/man/man9/copy.9
+++ b/share/man/man9/copy.9
@@ -34,13 +34,15 @@
.\"
.\" $FreeBSD$
.\"
-.Dd January 7, 1996
+.Dd July 9, 2011
.Dt COPY 9
.Os
.Sh NAME
.Nm copy ,
.Nm copyin ,
+.Nm copyin_nofault ,
.Nm copyout ,
+.Nm copyout_nofault ,
.Nm copystr ,
.Nm copyinstr
.Nd kernel copy functions
@@ -50,8 +52,12 @@
.Ft int
.Fn copyin "const void *uaddr" "void *kaddr" "size_t len"
.Ft int
+.Fn copyin_nofault "const void *uaddr" "void *kaddr" "size_t len"
+.Ft int
.Fn copyout "const void *kaddr" "void *uaddr" "size_t len"
.Ft int
+.Fn copyout_nofault "const void *kaddr" "void *uaddr" "size_t len"
+.Ft int
.Fn copystr "const void *kfaddr" "void *kdaddr" "size_t len" "size_t *done"
.Ft int
.Fn copyinstr "const void *uaddr" "void *kaddr" "size_t len" "size_t *done"
@@ -67,25 +73,40 @@ All but
copy data from user-space to kernel-space or vice-versa.
.Pp
The
-.Nm
-routines provide the following functionality:
-.Bl -tag -width "copyoutstr()"
-.It Fn copyin
-Copies
+.Fn copyin
+and
+.Fn copyin_nofault
+functions copy
.Fa len
bytes of data from the user-space address
.Fa uaddr
to the kernel-space address
.Fa kaddr .
-.It Fn copyout
-Copies
+.Pp
+The
+.Fn copyout
+and
+.Fn copyout_nofault
+functions copy
.Fa len
bytes of data from the kernel-space address
.Fa kaddr
to the user-space address
.Fa uaddr .
-.It Fn copystr
-Copies a NUL-terminated string, at most
+.Pp
+The
+.Fn copyin_nofault
+and
+.Fn copyout_nofault
+functions require that the kernel-space and user-space data be
+accessible without incurring a page fault.
+The source and destination addresses must be physically mapped for
+read and write access, respectively, and neither the source nor
+destination addresses may be pageable.
+.Pp
+The
+.Fn copystr
+function copies a NUL-terminated string, at most
.Fa len
bytes long, from kernel-space address
.Fa kfaddr
@@ -98,8 +119,10 @@ NUL, is returned in
.Fa done
is
.No non- Ns Dv NULL ) .
-.It Fn copyinstr
-Copies a NUL-terminated string, at most
+.Pp
+The
+.Fn copyinstr
+function copies a NUL-terminated string, at most
.Fa len
bytes long, from user-space address
.Fa uaddr
@@ -121,7 +144,6 @@ is
.\" The number of bytes actually copied, including the terminating
.\" NUL, is returned in
.\" .Fa *done .
-.El
.Sh RETURN VALUES
The
.Nm
@@ -129,7 +151,13 @@ functions return 0 on success or
.Er EFAULT
if a bad address is encountered.
In addition, the
-.Fn copystr ,
+.Fn copyin_nofault
+and
+.Fn copyout_nofault
+functions return
+.Er EFAULT
+if a page fault occurs, and the
+.Fn copystr
and
.Fn copyinstr
.\" .Fn copyinstr ,
diff --git a/share/man/man9/fail.9 b/share/man/man9/fail.9
index e367eff..0973cea 100644
--- a/share/man/man9/fail.9
+++ b/share/man/man9/fail.9
@@ -116,6 +116,7 @@ The sysctl variable may be set using the following grammar:
( (<float> "%") | (<integer> "*" ) )*
<type>
[ "(" <integer> ")" ]
+ [ "[pid " <integer> "]" ]
<float> ::
<integer> [ "." <integer> ] |
@@ -161,6 +162,10 @@ For the purpose of this operator, the return() and print() operators
are the only types that cascade.
A return() term only cascades if the code executes, and a print()
term only cascades when passed a non-zero argument.
+A pid can optionally be specified.
+The fail point term is only executed when invoked by a process with a
+matching p_pid.
+.Pp
.Sh EXAMPLES
.Bl -tag
.It Sy sysctl debug.fail_point.foobar="2.1%return(5)"
@@ -181,6 +186,8 @@ After that, 1/1000th of the time, return 22.
Return 5 for 1 in 1000 executions, but only 5 times total.
.It Sy sysctl debug.fail_point.foobar="1%*sleep(50)"
1/100th of the time, sleep 50ms.
+.It Sy sysctl debug.fail_point.foobar="1*return(5)[pid 1234]"
+Return 5 once, when pid 1234 executes the fail point.
.El
.Sh AUTHORS
.An -nosplit
diff --git a/share/man/man9/ifnet.9 b/share/man/man9/ifnet.9
index e9dbab5..05264dc 100644
--- a/share/man/man9/ifnet.9
+++ b/share/man/man9/ifnet.9
@@ -28,7 +28,7 @@
.\"
.\" $FreeBSD$
.\"
-.Dd December 1, 2009
+.Dd July 3, 2011
.Dt IFNET 9
.Os
.Sh NAME
@@ -1169,11 +1169,12 @@ list.
Caller must have appropriate privilege.
(No call-down to driver.)
.It Dv SIOCGIFCAP
+.It Dv SIOCGIFFIB
.It Dv SIOCGIFFLAGS
.It Dv SIOCGIFMETRIC
.It Dv SIOCGIFMTU
.It Dv SIOCGIFPHYS
-Get interface capabilities, flags, metric, MTU, medium selection.
+Get interface capabilities, FIB, flags, metric, MTU, medium selection.
(No call-down to driver.)
.Pp
.It Dv SIOCSIFCAP
@@ -1192,6 +1193,12 @@ and
.Va if_data.ifi_hwassist
appropriately.
.Pp
+.It Dv SIOCSIFFIB
+Sets interface FIB.
+Caller must have appropriate privilege.
+FIB values start at 0 and values greater or equals than
+.Va net.fibs
+are considered invalid.
.It Dv SIOCSIFFLAGS
Change interface flags.
Caller must have appropriate privilege.
diff --git a/share/man/man9/uio.9 b/share/man/man9/uio.9
index fb27c9c..9d569b7 100644
--- a/share/man/man9/uio.9
+++ b/share/man/man9/uio.9
@@ -25,12 +25,13 @@
.\"
.\" $FreeBSD$
.\"
-.Dd March 21, 2010
+.Dd July 9, 2011
.Dt UIO 9
.Os
.Sh NAME
.Nm uio ,
-.Nm uiomove
+.Nm uiomove ,
+.Nm uiomove_nofault
.Nd device driver I/O routines
.Sh SYNOPSIS
.In sys/types.h
@@ -48,11 +49,15 @@ struct uio {
.Ed
.Ft int
.Fn uiomove "void *buf" "int howmuch" "struct uio *uiop"
+.Ft int
+.Fn uiomove_nofault "void *buf" "int howmuch" "struct uio *uiop"
.Sh DESCRIPTION
-The function
+The functions
.Fn uiomove
-is used to handle transfer of data between buffers and I/O vectors
-that might possibly also cross the user/kernel space boundary.
+and
+.Fn uiomove_nofault
+are used to transfer data between buffers and I/O vectors that might
+possibly cross the user/kernel space boundary.
.Pp
As a result of any
.Xr read 2 ,
@@ -71,6 +76,8 @@ being passed.
The transfer request is encoded in this structure.
The driver itself should use
.Fn uiomove
+or
+.Fn uiomove_nofault
to get at the data in this structure.
.Pp
The fields in the
@@ -99,7 +106,7 @@ Do not copy, already in object.
.El
.It Va uio_rw
The direction of the desired transfer, either
-.Dv UIO_READ ,
+.Dv UIO_READ
or
.Dv UIO_WRITE .
.It Va uio_td
@@ -110,10 +117,24 @@ for the associated thread; used if
indicates that the transfer is to be made from/to a process's address
space.
.El
+.Pp
+The function
+.Fn uiomove_nofault
+requires that the buffer and I/O vectors be accessible without
+incurring a page fault.
+The source and destination addresses must be physically mapped for
+read and write access, respectively, and neither the source nor
+destination addresses may be pageable.
+Thus, the function
+.Fn uiomove_nofault
+can be called from contexts where acquiring virtual memory system
+locks or sleeping are prohibited.
.Sh RETURN VALUES
On success
.Fn uiomove
-will return 0, on error it will return an appropriate errno.
+and
+.Fn uiomove_nofault
+will return 0; on error they will return an appropriate error code.
.Sh EXAMPLES
The idea is that the driver maintains a private buffer for its data,
and processes the request in chunks of maximal the size of this
@@ -156,6 +177,8 @@ fooread(dev_t dev, struct uio *uio, int flag)
.Ed
.Sh ERRORS
.Fn uiomove
+and
+.Fn uiomove_nofault
will fail and return the following error code if:
.Bl -tag -width Er
.It Bq Er EFAULT
@@ -166,6 +189,14 @@ or
returned
.Er EFAULT
.El
+.Pp
+In addition,
+.Fn uiomove_nofault
+will fail and return the following error code if:
+.Bl -tag -width Er
+.It Bq Er EFAULT
+A page fault occurs.
+.El
.Sh SEE ALSO
.Xr read 2 ,
.Xr readv 2 ,
diff --git a/share/man/man9/vm_map.9 b/share/man/man9/vm_map.9
index 12112cd..f45be0b 100644
--- a/share/man/man9/vm_map.9
+++ b/share/man/man9/vm_map.9
@@ -25,7 +25,7 @@
.\"
.\" $FreeBSD$
.\"
-.Dd September 26, 2004
+.Dd July 9, 2011
.Dt VM_MAP 9
.Os
.Sh NAME
@@ -223,13 +223,9 @@ a user process's address space:
.Bl -tag -width ".Va max_protection"
.It Va protection
Memory protection bits applied to this region.
-These are identical to those defined for
-.Xr vm_page_protect 9 .
.It Va max_protection
Mask for the memory protection bits which may be actually be applied to
this region.
-These are identical to those defined for
-.Xr vm_page_protect 9 .
.It Va inheritance
Contains flags which specify how this entry should be treated
during fork processing.
@@ -328,7 +324,6 @@ is backed by a
.Sh SEE ALSO
.Xr pmap 9 ,
.Xr vm_map_check_protection 9 ,
-.Xr vm_map_clean 9 ,
.Xr vm_map_create 9 ,
.Xr vm_map_delete 9 ,
.Xr vm_map_entry_resize_free 9 ,
@@ -348,8 +343,8 @@ is backed by a
.Xr vm_map_simplify_entry 9 ,
.Xr vm_map_stack 9 ,
.Xr vm_map_submap 9 ,
-.Xr vm_map_wire 9 ,
-.Xr vm_page_protect 9
+.Xr vm_map_sync 9 ,
+.Xr vm_map_wire 9
.Sh AUTHORS
This manual page was written by
.An Bruce M Simpson Aq bms@spc.org .
diff --git a/share/man/man9/vm_map_clean.9 b/share/man/man9/vm_map_sync.9
index eeea5bc..0ee1219 100644
--- a/share/man/man9/vm_map_clean.9
+++ b/share/man/man9/vm_map_sync.9
@@ -25,24 +25,24 @@
.\"
.\" $FreeBSD$
.\"
-.Dd July 19, 2003
-.Dt VM_MAP_CLEAN 9
+.Dd July 9, 2011
+.Dt VM_MAP_SYNC 9
.Os
.Sh NAME
-.Nm vm_map_clean
+.Nm vm_map_sync
.Nd push dirty pages to their pager
.Sh SYNOPSIS
.In sys/param.h
.In vm/vm.h
.In vm/vm_map.h
.Ft int
-.Fo vm_map_clean
+.Fo vm_map_sync
.Fa "vm_map_t map" "vm_offset_t start" "vm_offset_t end" "boolean_t syncio"
.Fa "boolean_t invalidate"
.Fc
.Sh DESCRIPTION
The
-.Fn vm_map_clean
+.Fn vm_map_sync
function forces any dirty cached pages in the range
.Fa start
to
@@ -61,13 +61,9 @@ is TRUE, any cached pages are also freed.
.Pp
The range provided must be contiguous, it MUST NOT contain holes.
The range provided MUST NOT contain any sub-map entries.
-.Sh IMPLEMENTATION NOTES
-This routine holds the
-.Va Giant
-lock to prevent multiple entry.
.Sh RETURN VALUES
The
-.Fn vm_map_clean
+.Fn vm_map_sync
function returns
.Dv KERN_SUCCESS
if successful.
diff --git a/share/man/man9/vm_page_copy.9 b/share/man/man9/vm_page_copy.9
deleted file mode 100644
index 3cf7304..0000000
--- a/share/man/man9/vm_page_copy.9
+++ /dev/null
@@ -1,57 +0,0 @@
-.\"
-.\" Copyright (C) 2001 Chad David <davidc@acns.ab.ca>. All rights reserved.
-.\"
-.\" Redistribution and use in source and binary forms, with or without
-.\" modification, are permitted provided that the following conditions
-.\" are met:
-.\" 1. Redistributions of source code must retain the above copyright
-.\" notice(s), this list of conditions and the following disclaimer as
-.\" the first lines of this file unmodified other than the possible
-.\" addition of one or more copyright notices.
-.\" 2. Redistributions in binary form must reproduce the above copyright
-.\" notice(s), this list of conditions and the following disclaimer in the
-.\" documentation and/or other materials provided with the distribution.
-.\"
-.\" THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER(S) ``AS IS'' AND ANY
-.\" EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
-.\" DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER(S) BE LIABLE FOR ANY
-.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
-.\" (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
-.\" SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
-.\" CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
-.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
-.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
-.\" DAMAGE.
-.\"
-.\" $FreeBSD$
-.\"
-.Dd July 17, 2001
-.Dt VM_PAGE_COPY 9
-.Os
-.Sh NAME
-.Nm vm_page_copy
-.Nd "copy a page"
-.Sh SYNOPSIS
-.In sys/param.h
-.In vm/vm.h
-.In vm/vm_page.h
-.Ft void
-.Fn vm_page_copy "vm_page_t src_m" "vm_page_t dst_m"
-.Sh DESCRIPTION
-The
-.Fn vm_page_copy
-function copies the contents of
-.Fa src_m
-into
-.Fa dst_m .
-.Pp
-The entire contents of
-.Fa dst_m
-are marked as valid.
-.Pp
-The actual copy is performed by
-.Fn pmap_copy_page .
-.Sh AUTHORS
-This manual page was written by
-.An Chad David Aq davidc@acns.ab.ca .
diff --git a/share/man/man9/vm_page_protect.9 b/share/man/man9/vm_page_protect.9
deleted file mode 100644
index 8b4911d..0000000
--- a/share/man/man9/vm_page_protect.9
+++ /dev/null
@@ -1,75 +0,0 @@
-.\"
-.\" Copyright (C) 2001 Chad David <davidc@acns.ab.ca>. All rights reserved.
-.\"
-.\" Redistribution and use in source and binary forms, with or without
-.\" modification, are permitted provided that the following conditions
-.\" are met:
-.\" 1. Redistributions of source code must retain the above copyright
-.\" notice(s), this list of conditions and the following disclaimer as
-.\" the first lines of this file unmodified other than the possible
-.\" addition of one or more copyright notices.
-.\" 2. Redistributions in binary form must reproduce the above copyright
-.\" notice(s), this list of conditions and the following disclaimer in the
-.\" documentation and/or other materials provided with the distribution.
-.\"
-.\" THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER(S) ``AS IS'' AND ANY
-.\" EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
-.\" DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER(S) BE LIABLE FOR ANY
-.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
-.\" (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
-.\" SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
-.\" CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
-.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
-.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
-.\" DAMAGE.
-.\"
-.\" $FreeBSD$
-.\"
-.Dd July 14, 2001
-.Dt VM_PAGE_PROTECT 9
-.Os
-.Sh NAME
-.Nm vm_page_protect
-.Nd "lower a page's protection"
-.Sh SYNOPSIS
-.In sys/param.h
-.In vm/vm.h
-.In vm/vm_page.h
-.Ft void
-.Fn vm_page_protect "vm_page_t mem" "int prot"
-.Sh DESCRIPTION
-The
-.Fn vm_page_protect
-function lowers a page's protection.
-The protection is never raised by this function; therefore, if the page is
-already at
-.Dv VM_PROT_NONE ,
-the function does nothing.
-.Pp
-Its arguments are:
-.Bl -tag -width ".Fa prot"
-.It Fa mem
-The page whose protection is lowered.
-.It Fa prot
-The protection the page should be reduced to.
-If
-.Dv VM_PROT_NONE
-is specified, then the
-.Dv PG_WRITABLE
-and
-.Dv PG_MAPPED
-flags are cleared and the pmap_page's protection is set to
-.Dv VM_PROT_NONE .
-If
-.Dv VM_PROT_READ
-is specified, then the
-.Dv PG_WRITABLE
-flag is cleared and the pmap_page's protection is set to
-.Dv VM_PROT_READ .
-.El
-.Pp
-Higher protection requests are ignored.
-.Sh AUTHORS
-This manual page was written by
-.An Chad David Aq davidc@acns.ab.ca .
diff --git a/share/man/man9/vm_page_zero_fill.9 b/share/man/man9/vm_page_zero_fill.9
deleted file mode 100644
index 2adb301..0000000
--- a/share/man/man9/vm_page_zero_fill.9
+++ /dev/null
@@ -1,53 +0,0 @@
-.\"
-.\" Copyright (C) 2001 Chad David <davidc@acns.ab.ca>. All rights reserved.
-.\"
-.\" Redistribution and use in source and binary forms, with or without
-.\" modification, are permitted provided that the following conditions
-.\" are met:
-.\" 1. Redistributions of source code must retain the above copyright
-.\" notice(s), this list of conditions and the following disclaimer as
-.\" the first lines of this file unmodified other than the possible
-.\" addition of one or more copyright notices.
-.\" 2. Redistributions in binary form must reproduce the above copyright
-.\" notice(s), this list of conditions and the following disclaimer in the
-.\" documentation and/or other materials provided with the distribution.
-.\"
-.\" THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER(S) ``AS IS'' AND ANY
-.\" EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
-.\" DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER(S) BE LIABLE FOR ANY
-.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
-.\" (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
-.\" SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
-.\" CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
-.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
-.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
-.\" DAMAGE.
-.\"
-.\" $FreeBSD$
-.\"
-.Dd July 17, 2001
-.Dt VM_PAGE_ZERO_FILL 9
-.Os
-.Sh NAME
-.Nm vm_page_zero_fill
-.Nd "zero fill a page"
-.Sh SYNOPSIS
-.In sys/param.h
-.In vm/vm.h
-.In vm/vm_page.h
-.Ft boolean_t
-.Fn vm_page_zero_fill "vm_page_t m"
-.Sh DESCRIPTION
-The
-.Fn vm_page_zero_fill
-function zeros the given vm page by calling the machine dependent
-.Fn pmap_zero_page
-routine.
-.Pp
-.Fn vm_page_zero_fill
-always returns
-.Dv TRUE .
-.Sh AUTHORS
-This manual page was written by
-.An Chad David Aq davidc@acns.ab.ca .
diff --git a/share/misc/committers-ports.dot b/share/misc/committers-ports.dot
index 712590c..602ab3b 100644
--- a/share/misc/committers-ports.dot
+++ b/share/misc/committers-ports.dot
@@ -183,6 +183,7 @@ wen [label="Wen Heping\nwen@FreeBSD.org\n2010/12/13"]
wxs [label="Wesley Shields\nwxs@FreeBSD.org\n2008/01/03"]
xride [label="Soeren Straarup\nxride@FreeBSD.org\n2006/09/27"]
yzlin [label="Yi-Jheng Lin\nyzlin@FreeBSD.org\n2009/07/19"]
+zi [label="Ryan Steinmetz\nzi@FreeBSD.org\n2011/07/14"]
znerd [label="Ernst de Haan\nznerd@FreeBSD.org\n2001/11/15"]
# Here are the mentor/mentee relationships.
@@ -413,6 +414,7 @@ tabthorpe -> jadawin
tabthorpe -> jlaffaye
tabthorpe -> pgj
tabthorpe -> rene
+tabthorpe -> zi
thierry -> jadawin
@@ -428,5 +430,6 @@ wxs -> jsa
wxs -> sahil
wxs -> skreuzer
wxs -> swills
+wxs -> zi
}
diff --git a/share/misc/pci_vendors b/share/misc/pci_vendors
index 75420e4..b1ebcd1 100644
--- a/share/misc/pci_vendors
+++ b/share/misc/pci_vendors
@@ -1,11103 +1,20099 @@
-; $FreeBSD$
-;
-; Automatically generated by src/tools/tools/pciid/mk_pci_vendors.pl
-; (with the -l option), using the following source lists:
-;
-; http://www.pcidatabase.com/reports.php?type=csv
-; http://members.datafast.net.au/dft0802/downloads/pcidevs.txt
-;
-; Manual edits on this file will be lost!
-;
-0000 Gammagraphx Inc
-001A Ascend Communications Inc
-0033 Paradyne Corp
-003D Real 3D (Was: Lockheed Martin-Marietta Corp)
- 00D1 i740 PCI Graphics Accelerator
-0070 Hauppauge Computer Works Inc.
- 4000 WinTV PVR-350
- 4001 WinTV PVR-250 (v1)
- 4009 WinTV PVR-250
- 4801 WinTV PVR-250 MCE
- 6800 Hauppage Nova -TD-500 DVB-T Tuner Device ( PCIVEN_1131&DEV_7130&SUBSYS_40510000&REV_014&3B)
-0071 Nebula Electronics Ltd
-0100 Ncipher Corp Ltd
-0123 General Dynamics
-0246 Addtron(??)
-0315 SK - Electronics Co Ltd
-0357 TTTech AG
- 000A TTP-Monitoring Card V2.0
-0403 Future Technology Devices International Ltd
-0432 SCM Microsystems Inc
- 0001 Pluto2 DVB-T Receiver for PCMCIA [EasyWatch MobilSet]
-045E Microsoft
- 006E MN-510 802.11b wireless USB paddle
- 00C2 MN-710 wireless USB paddle
-0482 Kyocera
-04CF Myson Century Inc
- 8818 CS8818 USB2.0-to-ATAPI Bridge Controller with Embedded PHY
-050D Belkin
- 001A FSD7000 802.11g PCI Wireless card
- 0109 F5U409-CU USB/Serial Portable Adapter
- 7050 F5D7050 802.11g Wireless USB Adapter
- 705C F5D7050 v4
-05A9 OmniVision
- 8519 OV519 series
-05E3 CyberDoor
- 0701 CBD516
-064E SUYIN Corporation
- A101 Acer Crystal Eye Webcam (suYin)
- A103 WebCam (SuYin)
- D101 Web Cam (SuYin)
-066F Sigmatel Inc
- 3410 SMTP3410
- 3500 SMTP3500
-0675 Dynalink
- 1700 IS64PH ISDN Adapter
- 1702 IS64PH ISDN Adapter
- 1703 ISDN Adapter (PCI Bus, DV, W)
- 1704 ISDN Adapter (PCI Bus, D, C)
-067B Prolific Technology Inc
- 2303 PL-2303 USB-to-Serial Converter
- 2305 USB-to-Printer Bridge Controller (PL-2305)
- 2393 prolific (prolific)
- 3507 PL-3507 Hi-Speed USB & IEEE 1394 Combo to IDE Bridge Controller
-069D Hughes Network Systems (HNS)
-0700 Stream Machine
-0721 Sapphire Inc
-07CA AVerMedia Technologies Inc
- B808 AVerTV DVB-T Volar (USB 2.0)
-0815 LinTech GmbH
- 0002 ELKA SO-PCI
-0871 Berkom
- FFA1 A1T HCF-PCI Card
- FFA2 T-Concept HCF-PCI Card
- FFA4 A4T
- FFA8 Scitel Quadro
-09C1 Arris
- 0704 CM 200E Cable Modem
-0A5C Broadcom Corporation
- 0201 Broadcom USB iLine10(tm) Network Adapter (Broadcom NetXtreme BCM5782 Gigabie Ethernet Contro)
- 2000 Broadcom Bluetooth Firmware Upgrade Device
- 2009 Broadcom Bluetooth Controller
- 200A Broadcom Bluetooth Controller
- 200F Broadcom Bluetooth Controller
- 201D BROADCOM Bluetooth Device
- 201E IBM Integrated Bluetooth IV
- 2020 Broadcom Bluetooth Dongle
- 2021 BCM2035B3 ROM Adapter Generic
- 2033 Broadcom Blutonium Device Firmware Downloader
- 2035 BCM2035 Bluetooth
- 2038 Broadcom Blutonium Device Firmware Downloader (BCM2038)
- 2039 BROADCOM Bluetooth Device
- 2045 Broadcom Bluetooth Controller
- 2046 Broadcom USB Bluetooth Device ( 5738z)
- 2047 Broadcom USB Bluetooth Device
- 205E Broadcom Bluetooth Firmware Upgrade Device
- 2100 Broadcom Bluetooth 2.0+eDR USB dongle (BT 50)
- 2101 Broadcom Bluetooth 2.0+EDR USB dongle ( 5&11BBCF3F&0&2)
- 2102 ANYCOM Blue USB-200/250 ( USBVID_04B4&PID_21025&38CD4C16&0&6)
- 2110 Broadcom Bluetooth Controller
- 2111 ANYCOM Blue USB-UHE 200/250
- 2120 Broadcom 2045 Bluetooth 2.0 USB-UHE Device with trace filter ( 2045)
- 2121 Broadcom 2045 Bluetooth 2.0 USB Device with trace filter
- 2122 Broadcom Bluetooth 2.0+EDR USB dongle ( BCM92045B3)
- 2124 2045B3ROM Bluetooth Dongle
- 2130 Broadcom 2045 Bluetooth 2.0 USB-UHE Device with trace filter
- 2131 Broadcom 2045 Bluetooth 2.0 USB Device with trace filter
- 2140 2046 Flash UHE Class 2
- 2141 2046 Flash non UHE Class 2
- 2142 2046 Flash non UHE Class 1
- 2143 2046 Flash non UHE Class 1
- 2144 2046 Flash non UHE module Class 2
- 2145 Broadcom BCM9204MD LENO Module
- 2146 Broadcom 2045 Bluetooth 2.1 USB UHE Dongle
- 2147 Broadcom 2046 Bluetooth 2.1 USB Dongle
- 2148 Broadcom 2046 Bluetooth 2.1 USB UHE Dongle
- 2149 Broadcom 2046 Bluetooth 2.1 USB Dongle
- 214A Broadcom 2046 Bluetooth 2.1 USB Module
- 214B Broadcom 2046 Bluetooth 2.1 USB Module
- 214C Broadcom 2046 Bluetooth 2.1 USB Module
- 214D Broadcom Bluetooth 2.1 UHE Module
- 214E Thinkpad Bluetooth with Enhanced Data Rate II
- 214F Broadcom 2046 Bluetooth 2.1 USB UHE Dongle
- 2150 Broadcom 2046 Bluetooth 2.1 USB Dongle
- 2151 Broadcom 2046 Bluetooth 2.1 USB Dongle
- 2152 Broadcom 2046 Bluetooth 2.1 USB UHE Dongle
- 2153 Broadcom 2046 Bluetooth 2.1 USB UHE Dongle
- 2154 Broadcom 2046 Bluetooth 2.1 USB UHE Dongle
- 2155 Broadcom Bluetooth USB Dongle
- 2157 BCM2046 B1 USB 500
- 2158 Broadcom 2046 Bluetooth 2.1 Device
- 4500 Broadcom 2046 Bluetooth 2.1 USB Dongle (BCM2046B1)
- 4502 Broadcom 2046 Bluetooth 2.1 USB Dongle (BCM2046B1)
- 4503 Broadcom 2046 Bluetooth 2.1 USB Dongle ( BCM2046B1)
- 5800 Unified Security Hub
- 6300 Pirelli ISB Remote NDIS Device
-0A89 BREA Technologies Inc
-0B0B Rhino Equiment Corp.
- 0105 Rhino R1T1
- 0205 Rhino R4FXO
- 0206 RCB4FXO 4-channel FXO analog telphony card
- 0305 Rhino R4T1
- 0405 Rhino R8FXX
- 0406 RCB8FXX 8-channel modular analog telphony card
- 0505 Rhino R24FXX
- 0506 RCB24FXS 24-Channel FXS analog telphony card
- 0605 Rhino R2T1
- 0705 Rhino R24FXS
- 0706 RCB24FXO 24-Channel FXO analog telphony card
- 0905 R1T3 Single T3 Digital Telephony Card
- 0906 RCB24FXX 24-channel modular analog telphony card
- 0A06 RCB672FXX 672-channel modular analog telphony card
-0B49 ASCII Corporation
- 064F Trance Vibrator
-0C45 Microdia Ltd.
- 602D USB Webcam (7&2BE7B8E3&0&4)
- 6130 USB CAMERA (5&3512B308&0&1)
-0E11 Compaq Computer Corp (Now owned by Hewlett-Packard)
- 0001 PCI to EISA Bridge
- 0002 PCI to ISA Bridge (ISA Bridge)
- 000F StorageWorks Library Adapter (HVD) (CPQB1A9)
- 0012 686P7 (686P7)
- 0046 Smart Array 6400 Controller (N/A)
- 0049 Gigabit Upgrade Module (NC7132)
- 004A Gigabit Server Adapter (NC6136)
- 005A HP Remote Insight Lights-Out II Board (PowerPC 405GP processor at 200MHz [3305103C])
- 007C NC7770 1000BaseTX
- 007D NC6770 1000BaseTX
- 0085 NC7780 1000BaseTX
- 00B1 HP Remote Insight Lights-Out II PCI Device (3305103C)
- 00BB NC7760
- 00C0 AIC-7899G 64-bit, 66MHz Dual Channel Wide Ultra3 SCSI Controller
- 00CA NC7771
- 00CB NC7781
- 00CF NC7772
- 00D0 NC7782
- 00D1 NC7783
- 00E3 NC7761
- 0508 PCI UTP/STP Controller (Neteligent 4/16 TR)
- 1000 Pentium Bridge (Triflex Model 1000)
- 2000 Pentium Bridge (Triflex Model 2000)
- 3032 GUI Accelerator (QVision 1280/p v0)
- 3033 GUI Accelerator (QVision 1280/p v1)
- 3034 GUI Accelerator (QVision 1280/p v2)
- 4000 Pentium Bridge (Triflex Model 4000)
- 4030 SMART-2/P
- 4031 SMART-2SL
- 4032 Smart Array 3200
- 4033 Smart Array 3100ES
- 4034 Smart Array 221
- 4040 Integrated Array
- 4048 Compaq Raid LC2
- 4050 Smart Array 4200
- 4051 Smart Array 4250ES
- 4058 Smart Array 431
- 4070 Smart Array 5300
- 4080 Smart Array 5i
- 4082 Smart Array 532
- 4083 Smart Array 5312
- 4091 Smart Array 6i
- 409A Smart Array 641
- 409B Smart Array 642
- 409C Smart Array 6400
- 409D Smart Array 6400 EM
- 6010 HotPlug PCI Bridge (Model 6010)
- 7020 USB Controller
- A0EC Original Compaq fibre Channel HBA
- A0F0 Advanced System Management Controller
- A0F3 Triflex PCI to ISA PnP Bridge
- A0F7 PCI Hot Plug Controller
- A0F8 USB Open Host Controller (ZFMicro)
- A0FC HPFC-5166A Tachyon TL 64-bit/66MHz Fibre Channel Adapter
- AE10 Smart-2 Array Controller
- AE29 PCI to ISA Bridge (MIS-L)
- AE2A CPU to PCI Bridge (MPC)
- AE2B PCI to ISA PnP Bridge (MIS-E)
- AE31 System Management Controller (1002&DEV-5653&SUBSYS)
- AE32 Netelligent 10/100 TX PCI UTP TLAN 2.3 (950)
- AE33 Dual EIDE Controller (Triflex)
- AE34 Netelligent 10 T PCI UTP TLAN 2.3
- AE35 Integrated NetFlex-3/P TLAN 2.3
- AE40 Dual-port Netelligent 10/100 TX PCI TLAN 3.03
- AE43 Integrated Netelligent 10/100 TX PCI TLAN 2.3
- AE69 PCI to ISA Bridge (CETUS-L)
- AE6C PCI Bridge (DRACO)
- AE6D CPU to PCI Bridge (NorthStar)
- B011 Dual-port Netelligent 10/100 TX
- B012 UTP/Coax PCI (Netelligent 10 T/2)
- B01E Fast Ethernet NIC (NC3120)
- B01F Fast Ethernet NIC (NC3122)
- B02F Ethernet NIC (NC1120)
- B030 10/100TX Embedded UTP/Coax Controller (Netelligent WS 1500)
- B04A 10/100TX WOL UTP Controller (699209-003)
- B060 CISS SMART2 Array Controller
- B0C6 NC3161 Fast Ethernet Embedded Controller with WOL
- B0C7 Fast Ethernet NIC (NC3160)
- B0D7 Fast Ethernet NIC (NC3121 rev. A & B)
- B0DD Fast Ethernet NIC (NC3131)
- B0DE NC3132 Fast Ethernet Module
- B0DF Gigabit Module (NC6132)
- B0E0 Gigabit Module (NC6133)
- B0E1 Fast Ethernet Module (NC3133)
- B123 Gigabit NIC (NC6134)
- B134 Fast Ethernet NIC (NC3163)
- B13C Fast Ethernet NIC (NC3162)
- B144 Fast Ethernet NIC (NC3123)
- B163 Fast Ethernet NIC (NC3134)
- B164 Fast Ethernet Upgrade Module (NC3135)
- B178 SMART2 Array Controller (CISSB)
- B196 Conexant SoftK56 Modem (0230)
- B1A4 Gigabit Server Adapter (NC7131)
- B200 Memory Hot-Plug Controller
- B203 Integrated Lights Out Processor (iLo)
- B204 Integrated Lights Out Processor (iLo)
- F095 HP StorageWorks 2 Gb, 64-Bit/66-MHz PCI-to-Fibre Channel Host Bus Adapter for Windows 2000, Windows (FCA2101)
- F130 ThunderLAN 1.0 NetFlex-3/P
- F150 ThunderLAN 2.3 NetFlex-3/P with BNC
- F700 LP7000 Compaq/Emulex Fibre Channel HBA
- F800 LP8000 64-bit Compaq/Emulex Fibre Channel HBA
-0E55 HaSoTec GmbH
-1000 LSI Logic (Was: Symbios Logic, NCR)
- 0001 LSI53C810/A/AE PCI-SCSI I/O Processor
- 0002 53C820 820 Fast-Wide-SCSI Adapter
- 0003 LSI53C825/A/AE PCI to SCSI I/O Processor (Fast Wide)
- 0004 SCSI raid controllers (53C815)
- 0005 53C810AP,810ASP, 2081X Fast/Ultra/Wide SCSI Adapter
- 0006 PCI to Ultra SCSI I/O Processor (LSI53C860/860E)
- 000A LSI53C1510 PCI to Dual Channel Wide Ultra2 SCSI Controller (Nonintelligent mode)
- 000B LSI53C896/7 PCI to Dual Channel Ultra2 SCSI Multifunction Controller
- 000C LSI53C895 PCI to Ultra2 SCSI I/O Processor with LVD Link
- 000D Ultra Wide SCSI, Ethernet (53C885)
- 000F LSI53C875/E,LSI53C876/E PCI to Ultra SCSI I/O Processor
- 0010 LSI53C1510 I2O-Ready PCI RAID Ultra2 SCSI Controller (Intelligent mode)
- 0012 PCI to Ultra2 SCSI Controller (LSI53C895A)
- 0013 PCI to Ultra SCSI Controller (LSI53C875A)
- 0020 LSI53C1010-33 PCI to Dual Channel Ultra160 SCSI Multifunction Controller
- 0021 PCI to Ultra160 SCSI Controller (LSI53C1000/1000R/1010R/1010-66)
- 0030 PCI-X to Ultra320 SCSI Controller (LSI53C1020/1030)
- 0031 PCI-X SCSI Controller (LSI53C1030ZC)
- 0032 PCI-X to Ultra320 SCSI Controller (LSI53C1035)
- 0033 1030ZC_53c1035 PCI-X Fusion-MPT Dual Ultra320 SCSI
- 0035 PCI-X SCSI Controller (LSI53C1035)
- 0040 LSI53C1035 LSI53C1035 PCI-X to Ultra320 SCSI Controller (RAID mode)
- 0041 53C1035ZC PCI-X Fusion-MPT Dual Ultra320 SCSI
- 0050 SAS 3000 series, 4-port with 1064 -StorPort
- 0054 SAS 3000 series, 8-port with 1068 -StorPort
- 0055 SAS1068 PCI-X Fusion-MPT SAS
- 0056 SAS 3000 series, 4-port with 1064E -StorPort
- 0057 M1064E MegaRAID SAS
- 0058 SAS 3000 series, 8-port with 1068E -StorPort
- 005A SAS 3000 series, 6-port with 1066E -StorPort
- 005C SAS1064A PCI-X Fusion-MPT SAS
- 005E SAS 3000 series, 6-port with 1066 -StorPort
- 0060 SAS1078 PCI-X Fusion-MPT SAS
- 0062 PCI-Express Fusion-MPT SAS (LSISAS1078)
- 008F LSI 53C8xx SCSI host adapter chip (53C810)
- 0407 MegaRAID
- 0408 MegaRAID
- 0409 MegaRAID Family RAID Controller
- 0411 MegaRAID Family RAID Controller
- 0413 MegaRAID SAS Verde ZCR
- 0621 Fibre Channel I/O Processor (LSIFC909)
- 0622 Dial Channel Fibre Channel I/O Processor (LSIFC929)
- 0623 Dual Channel Fibre Channel I/O Processor (LSIFC929)
- 0624 LSIFC919 Single Channel Fibre Channel I/O Processor
- 0625 LSIFC919 Single Channel Fibre Channel I/O Processor
- 0626 LSIFC929X Dual Channel Fibre Channel I/O Processor
- 0627 LSIFC929X Dual Channel Fibre Channel I/O Processor
- 0628 LSIFC919X Single Channel Fibre Channel I/O Processor
- 0629 LSIFC919X Single Channel Fibre Channel I/O Processor
- 0630 Fibre Channel I/O Processor (LSIFC920)
- 0640 Fibre Channel Adapter (LSIFC949X)
- 0642 Fibre Channel Adapter (LSIFC939X)
- 0646 Fibre Channel Adapter (LSIFC949ES)
- 0701 53C885 NT50 DigitalScape Fast Ethernet Adapter
- 0702 Gigabit Ethernet Controller (Yellowfin G-NIC)
- 0804 SA2010
- 0805 SA2010ZC
- 0806 SA2020
- 0807 SA2020ZC
- 0901 USB Controller (61C102)
- 1000 Fast SCSI Controller (63C815)
- 1001 Symbios Ultra2 SCSI controller (53C895)
- 1010 Single channel SCSI controller (LSI 53C102000)
- 1960 MegaRAID
-1001 Kolter Electronic - Germany
- 0010 PCI1616 Measurement Card with 32 digital I/O lines
- 0011 OPTO-PCI, 16 IN / 16 OUT 24 VDC (ispLSI1032E)
- 0012 PCI-AD, PCI-ADDA analog I/O-card (ispLSI1032E)
- 0013 PCI-OptoRel, PCI-Relais 16 Relais & Opto (ispLSI1032E)
- 0014 Timer, Pulse & Counter-card 16..32 bit (ispLSI1032E)
- 0015 PCI-DAC416, 4 channel D/A16bit precision (ispLSI1032E)
- 0016 PCI-MFB high-speed analog I/O (ispLSI1032E)
- 0017 PROTO-3 PCI, digital I/O with chipselect (ispLSI1032E)
- 0020 Universal digital I/O PCI-Interface (ispLSI1032E)
-1002 ATI Technologies Inc. / Advanced Micro Devices, Inc.
- 0B12 ATI Radeon X1900 (R580)
- 1002 0F2A1787 (0F2A1787)
- 3150 ATI MOBILITY /ATI RADEON X600 (M24)
- 3151 ATI FireMV 2400 (RV380)
- 3152 ATI MOBILITY /ATI RADEON X300 (M24)
- 3154 ATI MOBILITY FireGL V3200 (M24GL)
- 3171 ATI FireMV 2400 Secondary (RV380)
- 3E50 ATI RADEON X600/X550 Series (RV380)
- 3E54 ATI FireGL V3200 (RV380GL)
- 3E70 ATI RADEON X600/X550 Series Secondary (RV380)
- 3E74 ATI FireGL V3200 Secondary (RV380GL)
- 4136 Radeon IGP 320 (A3)
- 4137 Radeon IGP 340 (RS200)
- 4144 Radeon 9500 Series (R300)
- 4145 Radeon 9200 (M+X) (R300)
- 4146 ATI RADEON 9600TX (R300)
- 4147 Fire GL Z1 AGP/Pro Video Accelerator (128 MB, 4P)
- 4148 ATI RADEON 9800 SE (R350)
- 4149 ATI RADEON 9500 (R350)
- 414A Radeon 9800 Family
- 414B Fire GL X2
- 4150 ATI RADEON 9600 Series (RV350)
- 4151 ATI RADEON 9600 Series (RV350)
- 4152 ATI RADEON 9600 Series (RV360)
- 4153 ATI RADEON 9550/X1050 Series (RV350)
- 4154 ATI FireGL T2 (RV350GL)
- 4155 ATI RADEON 9600 Series (RV350)
- 4156 Fire GL T2
- 4157 Fire GL T2
- 4158 Mach32 (68800AX)
- 4164 Radeon 9500 Series (R300) - Secondary
- 4165 Radeon 9700 Pro (R300 AE) - Secondary
- 4166 ATI RADEON 9600TX Secondary (R300)
- 4167 Fire GL Z1 AGP/Pro Secondary Video Accelerator (128 MB, 4P)
- 4168 ATI RADEON 9800 SE Secondary (R350)
- 4169 ATI RADEON 9500 Secondary (R350)
- 4170 ATI RADEON 9600 Series Secondary (RV350)
- 4171 ATI RADEON 9600 Series Secondary (RV350)
- 4172 ATI RADEON 9600 Series Secondary (RV360)
- 4173 ATI RADEON 9550/X1050 Series Secondary (RV350)
- 4174 ATI FireGL T2 Secondary (RV350GL)
- 4175 ATI RADEON 9600 Series Secondary (RV350)
- 4237 Radeon 7000 IGP
- 4242 All-In-Wonder 8500DV (R200AIW)
- 4243 Radeon 8500 DV OHCI FireWire Controller
- 4336 Radeon IGP 320M (rs200)
- 4337 Mobility M6 (U2) (RS200M)
- 4341 AC'97 Audio Controller (SB200)
- 4342 PCI-PCI Bridge (SB200)
- 4345 EHCI USB Controller (SB200)
- 4347 OHCI USB Controller *1
- 4348 OHCI USB Controller *2
- 4349 PATA-100 IDE Controller (SB200)
- 434C PCI-ISA Bridge (SB200)
- 434D AC'97 Modem Controller (SB200)
- 4353 IXP SB200 SMBUS Controller
- 4354 Mach64 CT (215CT222)
- 4358 Mach64 CX (210888CX)
- 4361 AC'97 Audio Controller
- 4363 IXP SB300 SMBUS Controller
- 4369 PATA 133 Controller (IXP 3xx)
- 436D IXP SB300 AC'97 Modem Controller
- 436E IXP SB300 Serial ATA Controller
- 4370 IXP SB400 AC'97 Audio Controller
- 4371 IXP SB400 PCI-PCI Bridge
- 4372 ATI SMBus (x200)
- 4373 IXP SB400 EHCI USB 2.0 Controller
- 4374 IXP SB400 OHCI USB Controller
- 4375 IXP SB400 OHCI USB Controller
- 4376 PATA 133 Controller (SB4xx)
- 4377 IXP SB400 PCI-ISA Bridge
- 4378 IXP SB400 AC'97 Modem Controller
- 4379 IXP SB400 Serial ATA Controller
- 437A IXP SB400 Serial ATA Controller
- 437B IXP SB450 High Definition Audio Controller
- 4380 IXP SB600 Serial ATA Controller
- 4381 IXP SB600 Serial ATA RAID Controller
- 4382 IXP SB600 AC'97 Audio Controller
- 4383 IXP SB600 High Definition Audio Controller
- 4384 IXP SB600 PCI to PCI Bridge
- 4385 ATI SMBus (ATI RD600/RS600)
- 4386 IXP SB600 USB Controller (EHCI)
- 4387 IXP SB600 USB Controller (OHCI0)
- 4388 IXP SB600 USB Controller (OHCI1)
- 4389 IXP SB600 USB Controller (OHCI2)
- 438A IXP SB600 USB Controller (OHCI3)
- 438B IXP SB600 USB Controller (OHCI4)
- 438C ATI RD600/RS600 IDE Controller (RD600/RS600)
- 438D IXP SB600 PCI to LPC Bridge
- 438E IXP SB600 AC'97 Modem Controller
- 4390 Integrated SATA II Controller (SB700)
- 4391 SB700 SATA Controller [AHCI mode]
- 4392 SB700 SATA Controller [Non-RAID5 mode]
- 4393 SB700 SATA Controller [RAID5 mode]
- 4394 SB700 SATA Controller [SATA and FC Enabled]
- 4395 SB SATA Controller [AHCI mode with HyperFlash-PCIE]
- 4396 SB700 USB EHCI Controller
- 4397 SB700 USB OHCI0 Controller
- 4398 Standard OpenHCD USB-Hostcontroller (SB700)
- 4399 SB700 USB OHCI2 Controller
- 439C PATA 133 Controller (SB7xx)
- 439D SB700 LPC host controller
- 4437 Radeon Mobility 7000 IGP
- 4554 Mach64 ET
- 4654 113--34004-104 (Mach64 VT)
- 4742 3D Rage Pro AGP 1X/2X ((GT-C2U2))
- 4744 Rage 3D Pro AGP 2x (Rage 3D Pro AGP 2x)
- 4747 Rage 3D Pro (GT-C2U2)
- 4749 ATI ALL IN WONDER PRO (8MB) (RAGE PRO TURBO AGP 2X)
- 474C k7 som+ (Rage XC PCI-66)
- 474D SLAT (Rage XL AGP 2x)
- 474E Rage XC AGP 2x
- 474F I Need Driver for the Chip (Rage XL PCI-66)
- 4750 ATI 3D Rage Pro 215GP (ATI 3D Rage Pro 215GP)
- 4751 Rage 3D Pro PCI (PQFP Package, Limited 3D)
- 4752 ATI On-Board VGA for HP Proliant 350 G3 (Rage XL PCI)
- 4753 Rage XC PCI
- 4754 Rage 3D II Graphics Accelerator (Mach 64 VT)
- 4755 3d rage 2 + dvd (Rage 3D II+pci)
- 4756 Rage 3D IIC PCI [Mach64 GT IIC] (PQFP Package)
- 4757 Rage 3D IIC AGP (BGA Package)
- 4758 Mach64 GX (210888GX)
- 4759 m3d agp card on agp slot (215r2qzua21)
- 475A Rage 3D IIC AGP (PQFP Package)
- 4964 Radeon 9000 Series (RV250 Id)
- 4965 Radeon 9000 Series (RV250 Ie)
- 4966 Radeon 9000/9000 Pro (RV250)
- 4967 Radeon 9000 (RV250)
- 496E Radeon 9000/9000 Pro - Secondary (RV250)
- 496F Radeon 9000 (RV250) - Secondary
- 4A48 ATI RADEON X800 Series (R420)
- 4A49 ATI RADEON X800 PRO (R420)
- 4A4A ATI RADEON X800 Series (R420)
- 4A4B ATI RADEON X800 XT (R420)
- 4A4C ATI RADEON X800 Series (R420)
- 4A4D ATI FireGL X3-256 (R420GL)
- 4A4E ATI MOBILITY /ATI RADEON 9800 (M18)
- 4A4F ATI RADEON X800 SE (R420)
- 4A50 ATI RADEON X800 XT Platinum Edition (R420)
- 4A54 ATI RADEON X800 VE (R420)
- 4A68 ATI RADEON X800 Series Secondary (R420)
- 4A69 ATI RADEON X800 PRO Secondary (R420)
- 4A6A ATI RADEON X800 Series Secondary (R420)
- 4A6B ATI RADEON X800 XT Secondary (R420)
- 4A6C ATI RADEON X800 Series Secondary (R420)
- 4A6D ATI FireGL X3-256 Secondary (R420GL)
- 4A6F ATI RADEON X800 SE Secondary (R420)
- 4A70 ATI RADEON X800 XT Platinum Edition Secondary (R420)
- 4A74 ATI RADEON X800 VE Secondary (R420)
- 4B49 ATI RADEON X850 XT (R481)
- 4B4A Radeon X850 SE
- 4B4B ATI RADEON X850 PRO (R481)
- 4B4C ATI RADEON X850 XT Platinum Edition (R481)
- 4B69 ATI RADEON X850 XT Secondary (R481)
- 4B6A ATI RADEON X850 SE Secondary (R481)
- 4B6B ATI RADEON X850 PRO Secondary (R481)
- 4B6C ATI RADEON X850 XT Platinum Edition Secondary (R481)
- 4C42 Rage 3D LT Pro AGP 133MHz (BGA-312 Package)
- 4C44 Rage 3D LT Pro AGP 133 MHz (Rage 3D LT Pro AGP)
- 4C45 Rage Mobility M3 AGP
- 4C46 0x4c46 (Mobility M3 AGP)
- 4C47 Rage 3D LT-G (ati rage pro)
- 4C49 Rage 3D LT Pro PCI (BGA-312 Package)
- 4C4D Rage P/M Mobility AGP 2x (01541014)
- 4C4E Rage Mobility l (216lo sasa25)
- 4C50 Rage 3D LT Pro PCI (BGA-256 Package)
- 4C51 Rage 3D LT Pro PCI (BGA-256 Package, Limited 3D)
- 4C52 Rage P/M Mobility PCI
- 4C53 Rage L Mobility PCI (216L0SASA25)
- 4C54 Mach64 LT (264LT)
- 4C57 Mobility Radeon 7500 (M7 [LW])
- 4C58 FireGL Mobility
- 4C59 Radeon Mobility M6 Series (Mobility 6)
- 4C5A Radeon Mobility M6 LZ
- 4C64 Radeon Mobility M9-GL
- 4C65 Radeon Mobility 9000 (R250 Le)
- 4C66 MOBILITY RADEON 9000 (M9) (R250)
- 4C67 Radeon Mobility 9000 (R250 Lg)
- 4C6E Radeon Mobility 9000 - Secondary (R250 Ln)
- 4D46 Rage Mobility 128 AGP 4x (ATI mobility128)
- 4D4C Rage Mobility 128 AGP (216l0sasa25)
- 4D50 Unified AVStream Driver
- 4D51 Unified AVStream Driver
- 4D52 ATI Theater 550 Pro (ATI Theater 550 Pro)
- 4D53 Unified AVStream Driver
- 4E44 Radeon 9700/Pro, 9500 Series (R300)
- 4E45 ATI RADEON 9500 PRO / 9700 (R300)
- 4E46 ATI RADEON 9600 TX (R300)
- 4E47 Fire GL X1/Z1 AGP/Pro Video Accelerator (R300-WS)
- 4E48 ATI RADEON 9800 PRO (R350)
- 4E49 Radeon 9800 (R350) (??)
- 4E4A ATI RADEON 9800 XT (R360)
- 4E4B ATI FireGL X2-256/X2-256t (R350GL)
- 4E50 ATI MOBILITY /ATI RADEON 9600/9700 Series (M10)
- 4E51 ATI RADEON 9600 Series (RV350)
- 4E52 Mobility Radeon 9500/9600 (M10) (RV350)
- 4E53 Radeon Mobility 9600 (M10 NS)
- 4E54 ATI MOBILITY FIRE GL T2/T2e (M10GL)
- 4E56 ATI MOBILITY /ATI RADEON 9550 (M12)
- 4E64 Radeon 9700/Pro, 9500 (R300) Series - Secondary
- 4E65 ATI RADEON 9500 PRO / 9700 Secondary (R300)
- 4E66 ATI RADEON 9600 TX Secondary (R300)
- 4E67 Fire GL X1/Z1 AGP/Pro Secondary Video Accelerator
- 4E68 ATI RADEON 9800 PRO Secondary (R350)
- 4E69 ATI RADEON 9800 Secondary (R350)
- 4E6A ATI RADEON 9800 XT Secondary (R360)
- 4E6B ATI FireGL X2-256/X2-256t Secondary (R350GL)
- 4E71 Radeon Mobility 9600 (M10 NQ) (secondary)
- 4F72 Radeon 9000 Series (RV250)
- 4F73 Radeon 9000 Series (RV250) (Secondary)
- 5041 Rage 128 Pro PA PCI (gt)
- 5042 Rage 128 Pro PB AGP 2x (rage 128 pf pro agp )
- 5043 Rage 128 PC/Pro AGP 4x
- 5044 Rage 128 Pro PD PCI (rv100)
- 5045 Rage 128 PE/Pro AGP 2x (TMDS)
- 5046 Rage 128 PF/Pro AGP 4x (TMDS)
- 5047 3d Rage pro agp 2x (215R3BUA22)
- 5048 Rage 128 Pro PH AGP 2x (8212104D)
- 5049 Rage 128 Pro PI AGP 4x (R128)
- 504A Rage 128 Pro PJ PCI (TMDS) (Rage 128 Pro PJ PCI)
- 504B Rage 128 Pro PK AGP 2x (TMDS) (Rage 128 Pro PK AGP)
- 504C 4x (TMDS) (Rage 128 Pro PL AGP)
- 504D Rage 128 Pro PM PCI (Rage 128 Pro PM PCI)
- 504E Rage 128 Pro PN AGP 2x (Rage 128 Pro PN AGP)
- 504F Rage 128 Pro PO AGP 4x (Rage 128 Pro PO AGP)
- 5050 Rage 128 Pro PP PCI (TMDS) (Scheda Grafica Standard PCI(VGA))
- 5051 Rage 128 Pro PQ AGP 2x (TMDS) (Rage 128 Pro PQ AGP)
- 5052 Rage 128 Pro PR AGP 4x (TMDS) (Rage 128 Pro PR AGP)
- 5053 Rage 128 Pro PS PCI (Rage 128 Pro PS PCI)
- 5054 Rage 128 Pro PT AGP 2x (Rage 128 Pro PT AGP)
- 5055 rage 128 pro agp 4x tmds (rage 128 pro agp 4x tmds)
- 5056 Rage 128 Pro PV PCI (TMDS) (Rage 128 Pro PV PCI)
- 5057 Rage 128 Pro PW AGP 2x (TMDS) (Rage 128 Pro PW AGP)
- 5058 PX AGP 4x (TMDS) (Rage 128 Pro)
- 5144 Radeon 7200 QD SDR/DDR (Radeon 7200 QD SDR/DDR)
- 5145 Radeon QE
- 5146 Radeon QF
- 5147 Radeon QG
- 5148 Radeon R200 QH (R200)
- 5149 Radeon R200 QI
- 514A Radeon R200 QJ
- 514B Radeon R200 QK
- 514C Radeon 8500 / 8500LE (R200)
- 514D Radeon 9100 Series (R200)
- 514E Radeon R200 QM
- 514F Radeon R200 QN
- 5154 Radeon 8500 R200 QT
- 5155 Radeon 9100 R200 QU
- 5157 Radeon 7500 Series (RV200)
- 5158 Radeon 7500 QX (radeon 9700 or 9200)
- 5159 Radeon 7000 / Radeon VE (RV100)
- 515A Radeon VE QZ
- 515E Radeon ES1000 (Radeon ES1000)
- 515F ES1000
- 5168 Radeon R200 Qh (ati)
- 5169 Radeon R200 Qi
- 516A Radeon R200 Qj
- 516B Radeon R200 Qk
- 516C Radeon 8500 / 8500LE (E7505)
- 516D Radeon 9100 Series (R200) - Secondary
- 5245 Rage 128 GL PCI (215R46ASA22)
- 5246 Rage 32MB (Rage 128 PRO)
- 5247 Rage 128 RG (Rage 32MB)
- 524B Rage 128 VR RK PCI (g01080-108)
- 524C Rage 128 RL/VR AGP 2x
- 5345 Rage 128 SE/4x PCI
- 5346 Rage 128 SF 4x AGP 2x (Rage 128 SF 4x AGP 2x)
- 5347 Rage 128 SG/4x AGP 4x
- 5348 Rage 128 4x SH
- 534B Rage 128 4x SK PCI (Rage 128 SK PCI)
- 534C Rage 128 4x SL AGP 2x (Rage 128 SL AGP 2x)
- 534D Rage 128 4x SM AGP 4x (Rage 128 SM AGP 4x)
- 534E Rage 128 4x
- 5354 Mach 64 ST
- 5446 Rage 128 Pro Ultra TF (unknown)
- 544C Rage 128 Pro TL
- 5452 Rage 128 Pro TR
- 5453 Rage 128 Pro Ultra TS
- 5454 Rage 128 Pro Ultra TT
- 5455 Rade 128 Pro Ultra TU
- 5460 ATI MOBILITY /ATI RADEON X300 (M22)
- 5461 ATI MOBILITY /ATI RADEON X300 (M22)
- 5462 ATI MOBILITY /ATI RADEON X600 SE (M24C)
- 5464 ATI MOBILITY FireGL V3100 (M22GL)
- 5548 ATI RADEON X800 Series (R423)
- 5549 ATI RADEON X800 GTO (R423)
- 554A ATI RADEON X800 XT Platinum Edition (R423)
- 554B ATI RADEON X800 GT (R423)
- 554C R430 XTP
- 554D ATI RADEON X800 CrossFire Edition (R430)
- 554E ATI RADEON X800 GT (R430)
- 554F ATI RADEON X800 GTO (R430)
- 5550 ATI FireGL V7100 (R423GL)
- 5551 ATI FireGL V5100 (R423GL)
- 5552 FireGL V5100 (R423 UR)
- 5554 FireGL V7100 (R423 UT)
- 5568 ATI RADEON X800 Series Secondary (R423)
- 5569 ATI RADEON X800 GTO Secondary (R423)
- 556A ATI RADEON X800 XT Platinum Edition Secondary (R423)
- 556B ATI RADEON X800 GT Secondary (R423)
- 556C R430 XTP Secondary
- 556D ATI RADEON X800 CrossFire Edition Secondary (R430)
- 556E ATI RADEON X800 GT Secondary (R430)
- 556F ATI RADEON X800 GTO Secondary (R430)
- 5570 ATI FireGL V7100 Secondary (R423GL)
- 5571 FireGL V5100 PCIe (R423GL-SE) - Secondary
- 564A ATI MOBILITY FireGL V5000 (M26GL)
- 564B ATI MOBILITY FireGL V5000 (M26GL)
- 564F ATI MOBILITY /ATI RADEON X700 XL (M26)
- 5652 ATI MOBILITY /ATI RADEON X700 (M26)
- 5653 ATI MOBILITY/ATI RADEON X700 (RV410)
- 5654 Mach64 VT (215VT22200)
- 5655 Mach 64 VT3
- 5656 Mach 64 VT4 PCI (Mach 64 VT4 PCI)
- 5657 ATI RADEON X550/X700 Series (RV410)
- 566F RADEON X700 SERIES SECONDARY
- 5673 ATI MOBILITY /ATI RADEON X700 Secondary (M26)
- 5677 ATI RADEON X550/X700 Series Secondary (RV410)
- 5830 RS300/100 Host Bridge
- 5831 RS300/133 Host Bridge
- 5832 RS300/166 Host Bridge
- 5833 ATI Radeon 9000/9100 IGP Chipset - Host-PCI Bridge (RS300M)
- 5834 Radeon 9100 IGP (RS300)
- 5835 Mobilitiy Radeon 9100 IGP AGP (RS300M)
- 5838 ATI Radeon 9000/9100 IGP Chipset - AGP Controller (RS300M)
- 5854 Radeon XPRESS 200 Series Secondary
- 5874 Radeon XPRESS 200 Series Secondary
- 5940 Radeon 9200 Pro Secondary (RV280)
- 5941 ATI Radeon 9200 - Secondary (RV280)
- 5942 Radeon 9000U Family - Secondary
- 5944 Radeon 9200SE PCI (RV280)
- 5950 RS480 Host Bridge
- 5951 Radeon Xpress 200 (RS480/RS482/RX480/RX482) Host bridge
- 5952 CrossFire Xpress 3200 (RD580) Chipset Host Bridge
- 5954 ATI RADEON Xpress Series (RS480)
- 5955 ATI RADEON Xpress Series (RS480M)
- 5956 RD790 GFX Dual Slot
- 5957 RX790 GFX Single Slot
- 5958 RD780 GFX Dual Slot
- 5960 Radeon 9200 Pro (RV280)
- 5961 ATI RADEON 9200 se agp (RV280)
- 5962 Radeon 9000U Family
- 5964 Radeon 9200 SE Series (Radeon 9200)
- 5965 FireMV 2200 (unknown)
- 5969 ES1000
- 5974 ATI RADEON Xpress Series (RS482)
- 5975 ATI RADEON Xpress Series (RS482M)
- 5978 RD790 PCI to PCI bridge (external gfx0 port A)
- 5979 RD790 PCI to PCI bridge (external gfx0 port B)
- 597A RD790 PCI to PCI bridge (PCIe gpp port A)
- 597B RD790 PCI to PCI bridge (PCIe gpp port B)
- 597C RD790 PCI to PCI bridge (PCIe gpp port C)
- 597D RD790 PCI to PCI bridge (PCIe gpp port D)
- 597E RD790 PCI to PCI bridge (PCIe gpp port E)
- 597F RD790 PCI to PCI bridge (PCIe gpp port F)
- 5980 RD790 PCI to PCI bridge (external gfx1 port A)
- 5981 RD790 PCI to PCI bridge (external gfx1 port B)
- 5982 RD790 PCI to PCI bridge (NB-SB link)
- 5A10 RD890 GFX dual slot (2x16) PCI-e Hydra
- 5A11 RD890 single slot GFX Hydra
- 5A12 RD890 dual slot (2x8) PCI-e GFX Hydra
- 5A13 RD890 PCI to PCI bridge (external gfx0 port A)
- 5A14 RD890 PCI to PCI bridge (external gfx0 port B)
- 5A15 RD890 PCI to PCI bridge (PCIe gpp port A)
- 5A16 RD890 PCI to PCI bridge (PCIe gpp port B)
- 5A17 RD890 PCI to PCI bridge (PCIe gpp port C)
- 5A18 RD890 PCI to PCI bridge (PCIe gpp port D)
- 5A19 RD890 PCI to PCI bridge (PCIe gpp port E)
- 5A1A RD890 PCI to PCI bridge (PCIe gpp port F)
- 5A1B RD890 PCI to PCI bridge (PCIe gpp port G)
- 5A1C RD890 PCI to PCI bridge (PCIe gpp port H)
- 5A1D RD890 PCI to PCI bridge (external gfx1 port A)
- 5A1E RD890 PCI to PCI bridge (external gfx1 port B)
- 5A1F RD890 PCI to PCI bridge (NB-SB link)
- 5A30 RS400/100 Host Bridge
- 5A31 Host Bridge (RS400/133)
- 5A32 RS400/166 Host Bridge
- 5A33 Northbridge: Radeon Xpress 200 (RC410)
- 5A34 RS480 PCI-X Root Port
- 5A36 RS480 PCI Bridge
- 5A37 RS480 PCI Bridge
- 5A38 RS480 PCI Bridge
- 5A39 RS480 PCI Bridge
- 5A3F RS480 PCI Bridge
- 5A41 ATI RADEON Xpress Series (RS400)
- 5A42 ATI RADEON Xpress Series (RS400M)
- 5A43 Radeon XPRESS 200 Series Secondary
- 5A61 ATI RADEON Xpress Series (RC410)
- 5A62 ATI RADEON Xpress Series (RC410M)
- 5A63 Radeon XPRESS 200 Series Secondary
- 5B60 ATI RADEON X300/X550/X1050 Series (RV370)
- 5B61 RV371
- 5B62 ATI RADEON X600 Series (RV380x)
- 5B63 ATI RADEON X300/X550/X1050 Series (RV370)
- 5B64 ATI FireGL V3100 (RV370GL)
- 5B65 FireGL D1100 (RV370 5B65)
- 5B66 RV370X
- 5B70 ATI RADEON X300/X550/X1050 Series Secondary (RV370)
- 5B71 RV371 Secondary
- 5B72 ATI RADEON X600 Series Secondary (RV380x)
- 5B73 ATI RADEON X300/X550/X1050 Series Secondary (RV370)
- 5B74 ATI FireGL V3100 Secondary (RV370GL)
- 5B75 ATI FireMV 2200 Secondary (RV370)
- 5B76 RV370X Secondary
- 5C61 Mobility Radeon 9200 (bk-ati ver008.016m.085.006)
- 5C63 Mobility Radeon 9200 (RV280 (M9+))
- 5D44 Radeon 9200 SE Series - Secondary (RV280)
- 5D45 ATI FireMV 2200 PCI Secondary (RV280)
- 5D48 ATI MOBILITY/ATI RADEON X800 XT (M28)
- 5D49 ATI MOBILITY FireGL V5100 (M28GL)
- 5D4A ATI MOBILITY /ATI RADEON X800 (M28)
- 5D4C R480 CONSUMER 4P
- 5D4D ATI RADEON X850 XT Platinum Edition (R480)
- 5D4E Radeon X800 GT
- 5D4F ATI RADEON X800 GTO (R480)
- 5D50 ATI FireGL V7200 (R480GL)
- 5D52 ATI RADEON X850 XT (R480)
- 5D57 ATI RADEON X800 XT (R423)
- 5D6C R480 CONSUMER 4P Secondary
- 5D6D ATI RADEON X850 XT Platinum Edition Secondary (R480)
- 5D6E Radeon X800 GT Secondary
- 5D6F ATI RADEON X800 GTO Secondary (R480)
- 5D70 ATI FireGL V7200 Secondary (R480GL)
- 5D72 ATI RADEON X850 XT Secondary (R480)
- 5D77 ATI RADEON X800 XT Secondary (R423)
- 5E48 ATI FireGL V5000 (RV410GL)
- 5E49 FireGL V3300 (RV410)
- 5E4A ATI RADEON X700 XT (RV410)
- 5E4B ATI RADEON X700 PRO (RV410)
- 5E4C ATI RADEON X700 SE (RV410)
- 5E4D ATI RADEON X700 (RV410)
- 5E4F ATI RADEON X700/X550 Series (RV410)
- 5E68 ATI FireGL V5000 Secondary (RV410GL)
- 5E6A ATI RADEON X700 XT Secondary (RV410)
- 5E6B ATI RADEON X700 PRO Secondary (RV410)
- 5E6C ATI RADEON X700 SE Secondary (RV410)
- 5E6D ATI RADEON X700 Secondary (RV410)
- 5E6F ATI RADEON X700/X550 Series Secondary (RV410)
- 5F57 Radeon X800XT PCIe (R423)
- 6898 ATI Radeon HD 5800 Series (EG CYPRESS XT)
- 6899 ATI Radeon HD 5800 Series (EG CYPRESS PRO)
- 68A0 ATI Mobility Radeon HD 5800 Series (EG BROADWAY XT)
- 68A1 ATI Mobility Radeon HD 5800 Series (EG BROADWAY PRO/LP)
- 68B0 ATI Mobility Radeon HD 5800 Series (EG BROADWAY XT)
- 68B8 ATI Radeon HD 5700 Series (EG JUNIPER XT)
- 68BE ATI Radeon HD 5700 Series (EG JUNIPER LE)
- 700F PCI to AGP Bridge (A3/U1)
- 7010 PCI to AGP Bridge (RS200)
- 7100 ATI RADEON X1800 Series (R520)
- 7101 ATI MOBILITY /ATI RADEON X1800 XT (M58)
- 7102 ATI MOBILITY /ATI RADEON X1800 (M58)
- 7103 ATI MOBILITY FireGL V7200 (M58GL)
- 7104 ATI FireGL V7200 (R520GL)
- 7105 ATI FireGL V5300 (R520GL)
- 7106 ATI MOBILITY FireGL V7100 (M58GL)
- 7108 ATI RADEON X1800 Series (R520)
- 7109 Radeon X1800 Series - Secondary
- 710A ATI RADEON X1800 Series (R520)
- 710B ATI RADEON X1800 Series (R520)
- 710C ATI RADEON X1800 Series (R520)
- 710E ATI FireGL V7300 (R520GL)
- 710F ATI FireGL V7350 (R520GL)
- 7120 ATI RADEON X1800 Series Secondary (R520)
- 7124 ATI FireGL V7200 Secondary (R520GL)
- 7125 ATI FireGL V5300 Secondary (R520GL)
- 7128 ATI RADEON X1800 Series Secondary (R520)
- 7129 ATI RADEON X1800 Series Secondary (R520)
- 712A ATI RADEON X1800 Series Secondary (R520)
- 712B ATI RADEON X1800 Series Secondary (R520)
- 712C ATI RADEON X1800 Series Secondary (R520)
- 712E ATI FireGL V7300 Secondary (R520GL)
- 712F ATI FireGL V7350 Secondary (R520GL)
- 7140 ATI RADEON X1600 Series (RV515)
- 7141 RV505
- 7142 ATI RADEON X1300/X1550 Series (RV515)
- 7143 ATI RADEON X1550 Series (RV515)
- 7145 ATI MOBILITY /ATI RADEON X1400 (M54)
- 7146 ATI RADEON X1300 / X1550 Series (RV515)
- 7147 ATI RADEON X1550 64-bit (RV515)
- 7149 ATI MOBILITY /ATI RADEON X1300 (M52)
- 714A ATI MOBILITY /ATI RADEON X1300 (M52)
- 714B ATI MOBILITY /ATI RADEON X1300 (M52)
- 714C ATI MOBILITY /ATI RADEON X1300 (M52)
- 714D ATI RADEON X1300 Series (RV515)
- 714E ATI RADEON X1300 Series (RV515PCI)
- 714F RV505
- 7151 RV505
- 7152 ATI FireGL V3300 (RV515GL)
- 7153 ATI FireGL V3350 (RV515GL)
- 715E ATI RADEON X1300 Series (RV515)
- 715F ATI RADEON X1550 64-bit (RV515)
- 7160 ATI RADEON X1600 Series Secondary (RV515)
- 7161 RV505 Secondary
- 7162 ATI RADEON X1300/X1550 Series Secondary (RV515)
- 7163 ATI RADEON X1550 Series Secondary (RV515)
- 7166 ATI RADEON X1300 / X1550 Series Secondary (RV515)
- 7167 ATI RADEON X1550 64-bit Secondary (RV515)
- 7169 M52 Secondary
- 716D ATI RADEON X1300 Series Secondary (RV515)
- 716E ATI RADEON X1300 Series Secondary (RV515PCI)
- 716F RV505 Secondary
- 7171 RV505 Secondary
- 7172 ATI FireGL V3300 Secondary (RV515GL)
- 7173 ATI FireGL V3350 Secondary (RV515GL)
- 717E ATI RADEON X1300 Series Secondary (RV515)
- 717F ATI RADEON X1550 64-bit Secondary (RV515)
- 7180 ATI RADEON X1300/X1550 Series (RV515)
- 7181 ATI RADEON X1600 Series (RV515)
- 7183 ATI RADEON X1300/X1550 Series (RV515)
- 7186 ATI MOBILITY /ATI RADEON X1450 (M54)
- 7187 ATI RADEON X1300/X1550 Series (RV515)
- 7188 ATI MOBILITY /ATI RADEON X2300 (M54)
- 718A ATI MOBILITY /ATI RADEON X2300 (M54)
- 718B ATI MOBILITY /ATI RADEON X1350 (M52)
- 718C ATI MOBILITY /ATI RADEON X1350 (M52)
- 718D ATI MOBILITY /ATI RADEON X1450 (M54)
- 718F ATI RADEON X1300 Series (RV515PCI)
- 7193 ATI RADEON X1550 Series (RV515)
- 7196 ATI MOBILITY /ATI RADEON X1350 (M52)
- 719B ATI FireMV 2250 (RV515)
- 719F ATI RADEON X1550 64-bit (RV515)
- 71A0 ATI RADEON X1300/X1550 Series Secondary (RV515)
- 71A1 ATI RADEON X1600 Series Secondary (RV515)
- 71A3 ATI RADEON X1300/X1550 Series Secondary (RV515)
- 71A7 ATI RADEON X1300/X1550 Series Secondary (RV515)
- 71AF ATI RADEON X1300 Series Secondary (RV515PCI)
- 71B3 ATI RADEON X1550 Series Secondary (RV515)
- 71BB ATI FireMV 2250 Secondary (RV515)
- 71C0 ATI RADEON X1600 Series (RV530)
- 71C1 ATI RADEON X1650 Series (RV535)
- 71C2 ATI RADEON X1600 Series (RV530)
- 71C3 ATI RADEON X1300 Series (RV535)
- 71C4 ATI MOBILITY FireGL V5200 (M56GL)
- 71C5 ATI MOBILITY /ATI RADEON X1600 (M56)
- 71C6 ATI RADEON X1650 Series (RV530)
- 71C7 ATI RADEON X1650 Series (RV535)
- 71CD ATI RADEON X1600 Series (RV530)
- 71CE ATI RADEON X1600 Pro / ATI RADEON X1300 XT (RV530)
- 71D2 ATI FireGL V3400 (RV530GL)
- 71D4 ATI MOBILITY FireGL V5250 (M56GL)
- 71D5 ATI MOBILITY /ATI RADEON X1700 (M56)
- 71D6 ATI MOBILITY /ATI RADEON X1700 XT (M56)
- 71DA ATI FireGL V5200 (RV530GL)
- 71DE ATI MOBILITY /ATI RADEON X1700 (M56)
- 71E0 ATI RADEON X1600 Series Secondary (RV530)
- 71E1 ATI RADEON X1650 Series Secondary (RV535)
- 71E2 ATI RADEON X1600 Series Secondary (RV530)
- 71E3 ATI RADEON X1300 Series Secondary (RV535)
- 71E5 M56 Secondary
- 71E6 ATI RADEON X1600 Series Secondary (RV530)
- 71E7 ATI RADEON X1650 Series Secondary (RV535)
- 71ED ATI RADEON X1600 Series Secondary (RV530)
- 71EE ATI RADEON X1600 Pro / ATI RADEON X1300 XT Secondary (RV530)
- 71F2 ATI FireGL V3400 Secondary (RV530GL)
- 71FA ATI FireGL V5200 Secondary (RV530GL)
- 71FE RV530 SE Secondary
- 7205 S3G Unichrome IGP KM400/KN400 (1106)
- 7210 ATI MOBILITY /ATI RADEON HD 2300 (M71)
- 7211 ATI MOBILITY /ATI RADEON HD 2300 (M71)
- 7240 ATI RADEON X1950 Series (R580)
- 7241 Radeon X1900 (R580)
- 7242 Radeon X1900 (R580)
- 7243 ATI RADEON X1900 Series (R580)
- 7244 ATI RADEON X1950 Series (R580)
- 7245 ATI RADEON X1900 Series (R580)
- 7246 ATI RADEON X1900 Series (R580)
- 7247 ATI RADEON X1900 Series (R580)
- 7248 ATI RADEON X1900 Series (R580)
- 7249 ATI RADEON X1900 Series (R580)
- 724A ATI RADEON X1900 Series (R580)
- 724B ATI RADEON X1900 Series (R580)
- 724C ATI RADEON X1900 Series (R580)
- 724D ATI RADEON X1900 Series (R580)
- 724E FireGL V7300/V7350 PCIe (R580)
- 724F ATI RADEON X1900 Series (R580)
- 7260 ATI RADEON X1950 Series Secondary (R580)
- 7263 ATI RADEON X1900 Series Secondary (R580)
- 7264 ATI RADEON X1950 Series Secondary (R580)
- 7265 ATI RADEON X1900 Series Secondary (R580)
- 7266 ATI RADEON X1900 Series Secondary (R580)
- 7267 ATI RADEON X1900 Series Secondary (R580)
- 7268 ATI RADEON X1900 Series Secondary (R580)
- 7269 ATI RADEON X1900 Series Secondary (R580)
- 726A ATI RADEON X1900 Series Secondary (R580)
- 726B ATI RADEON X1900 Series Secondary (R580)
- 726C ATI RADEON X1900 Series Secondary (R580)
- 726D ATI RADEON X1900 Series Secondary (R580)
- 726E FireGL V7300/V7350 PCIe (R580) - Secondary
- 726F ATI RADEON X1900 Series Secondary (R580)
- 7280 ATI RADEON X1950 Series (R580)
- 7284 ATI MOBILITY /ATI RADEON X1900 (M58)
- 7288 ATI RADEON X1950 GT (R580)
- 7291 ATI RADEON X1650 Series (R580)
- 7293 ATI RADEON X1650 Series (R580)
- 72A0 ATI RADEON X1950 Series Secondary (R580)
- 72A8 ATI RADEON X1950 GT Secondary (R580)
- 72B1 ATI RADEON X1650 Series Secondary (R580)
- 72B3 ATI RADEON X1650 Series Secondary (R580)
- 7800 ?
- 7830 RS350/100 Host Bridge
- 7831 RS350/133 Host Bridge
- 7832 RS350/166 Host Bridge
- 7833 Radeon 9100 Pro (RS350)
- 7834 Radeon 9000/9100 Pro IGP Series
- 7835 Radeon Mobility 9200 IGP
- 7838 Radeon 9100 IGP PCI/AGP Bridge
- 7910 RS690 Host Bridge
- 7912 RS690 PCI to PCI Bridge (Internal gfx)
- 7916 RS690 PCI to PCI Bridge (PCI Express Port 2)
- 7917 RS690 PCI to PCI Bridge (PCI Express Port 3)
- 7919 Radeon X1200 Series Audio Controller
- 791A HDMI Audio (791A)
- 791E ATI RADEON X1200 Series (RS690)
- 791F ATI Mobility Radeon x1100 (RS690M)
- 7930 RS600(M) Chipset - Host Bridge
- 7933 RS600(M) Chipset - PCI Express Graphics Port 0
- 7935 RS600(M) Chipset - PCI Express Port 1
- 7937 ATI Technoligies Inc (Samsung R25P)
- 793F ATI RADEON Xpress 1200 Series (RS600)
- 7941 ATI RADEON Xpress 1200 Series (RS600)
- 7942 ATI RADEON Xpress 1200 Series (RS600M)
- 796E ATI RADEON 2100 (RS690)
- 7C37 Radeon 9600 SE (RV350 AQ)
- 9400 ATI Radeon HD 2900 XT (R600)
- 9401 ATI RADEON HD 2900 XT (R600)
- 9402 ATI RADEON HD 2900 XT (R600)
- 9403 ATI RADEON HD 2900 PRO (R600)
- 9405 ATI RADEON HD 2900 GT (R600)
- 940A ATI FireGL V8650 (R600GL)
- 940B ATI FireGL V8600 (R600GL)
- 940F ATI FireGL V7600 (R600GL)
- 9440 ATI Radeon HD 4870 (RV770)
- 9441 ATI Radeon HD 4870 X2 (R700)
- 9442 ATI Radeon HD 4800 Series (RV770)
- 9443 ATI Radeon HD 4850 X2 (R700)
- 9444 ATI FirePro V8750 (FireGL) (RV770)
- 9446 ATI FirePro V7770 (FireGL) (RV770)
- 9447 ATI FirePro V8700 Duo (FireGL) (R700)
- 944A ATI Mobility Radeon HD 4850 (M98)
- 944B ATI Mobility Radeon HD 4850 X2 (M98)
- 944C ATI Radeon HD 4800 Series (RV770)
- 944E ATI Radeon HD 4700 Series (RV770)
- 9450 AMD FireStream 9270 (RV770)
- 9452 AMD FireStream 9250 (RV770)
- 9456 ATI FirePro V8700 (FireGL) (RV770)
- 945A ATI Mobility Radeon HD 4870 (M98)
- 9460 ATI Radeon HD 4800 Series (RV790)
- 9462 ATI Radeon HD 5000 Series (RV790)
- 9480 ATI Mobility Radeon HD 4650 (M96)
- 9487 ATI Radeon Graphics Processor (RV730)
- 9488 ATI Mobility Radeon HD 4670 (M96)
- 948F ATI Radeon Graphics Processor (RV730)
- 9490 ATI Radeon HD 4600 Series (RV730)
- 9491 ATI Radeon E4600 (M96)
- 9495 ATI RADEON HD4650 (RV730)
- 9498 ATI Radeon HD 4650 (RV730)
- 949C ATI FirePro V7750 (FireGL) (RV730)
- 949E ATI FirePro V5700 (FireGL) (RV730)
- 949F ATI FirePro V3750 (FireGL) (RV730)
- 94A0 ATI Mobility Radeon HD 4830 (M97)
- 94A1 ATI Mobility Radeon HD 4860 (M97)
- 94A3 ATI FirePro M7740 (M97)
- 94B1 ATI Radeon Graphics Processor (RV740)
- 94B3 ATI Radeon HD 4770 (RV740)
- 94B4 ATI Radeon HD 4700 Series (RV740)
- 94B5 ATI Radeon HD 4770 (RV740)
- 94C1 ATI Radeon HD 2400 XT (RV610-DT (Pro))
- 94C3 ATI Radeon HD 2400 PRO (RV610-DT (LE))
- 94C4 ATI Radeon HD 2400 PRO AGP (RV610LE)
- 94C5 ATI RADEON HD 2400 LE (RV610)
- 94C7 ATI RADEON HD 2350 (RV610)
- 94C8 ATI MOBILITY /ATI RADEON HD 2400 XT (M72)
- 94C9 ATI MOBILITY /ATI RADEON HD 2400 (M72)
- 94CB ATI RADEON E2400 (M72)
- 94CC ATI RADEON HD 2400 (RV610)
- 9501 ATI Radeon HD 3870 (RV670 XT)
- 9504 ATI MOBILITY /ATI RADEON HD 3850 (M76)
- 9505 ATI RADEON HD 3850 (RV630)
- 9506 ATI MOBILITY /ATI RADEON HD 3850 X2 (M76)
- 9507 ATI Radeon HD 3830 (RV670)
- 9508 ATI MOBILITY /ATI RADEON HD 3870 (M76)
- 9509 ATI MOBILITY /ATI RADEON HD 3870 X2 (M76)
- 950F ATI RADEON HD 3870 X2 (RV630)
- 9511 ATI FireGL V7700 (RV630GL)
- 9513 ATI Radeon HD 3850 X2 (R680)
- 9515 ATI Radeon HD 3850 AGP (RV670 AGP)
- 9519 AMD FireStream 9170 (RV670)
- 9540 ATI Radeon HD 4550 (RV710)
- 9541 ATI Radeon Graphics Processor (RV710)
- 954E ATI Radeon Graphics Processor (RV710)
- 954F ATI Radeon HD 4350 (RV710)
- 9552 ATI Mobility Radeon HD 4330 Series (M92)
- 9553 ATI Mobility Radeon HD 4570 Series (M92)
- 9555 ATI Mobility Radeon HD 4500 Series (M93)
- 9557 ATI FirePro RG220 (M93)
- 9581 ATI Mobility Radeon HD 2600 (M76M)
- 9583 ATI MOBILITY /ATI RADEON HD 2600 XT (M76)
- 9586 ATI RADEON HD 2600 XT AGP (RV630)
- 9587 ATI Radeon HD 2600 Pro AGP (RV630 PRO)
- 9588 ATI Radeon HD 2600 XT (RV630 XT)
- 9589 ATI Radeon HD 2600 Pro (RV630 PRO)
- 958A RADEON HD 2600 X2 SERIES
- 958B ATI MOBILITY / ATI RADEON HD 2600 XT Gemini (M76)
- 958C ATI FireGL V5600 (RV630GL)
- 958D ATI FireGL V3600 (RV630GL)
- 958E ATI RADEON HD 2600 LE (RV630)
- 958F ATI Mobility FireGL Graphics Processor (M76)
- 9590 ATI RADEON HD 3650 Series (RV630)
- 9591 ATI Mobility Radeon HD 3650 (M86-M)
- 9593 ATI Mobility Radeon HD 3670 (M86)
- 9595 ATI Mobility FireGL V5700 (M86)
- 9596 ATI RADEON HD 3600 Series (RV630)
- 9597 ATI RADEON HD 3600 Series (RV630)
- 9598 ATI RADEON HD 3600 Series (RV630)
- 9599 ATI RADEON HD 3600 Series (RV630)
- 959B ATI Mobility FireGL Graphics Processor (M86)
- 95C0 ATI RADEON HD 3470 (RV610)
- 95C2 ATI MOBILITY /ATI RADEON HD 3430 (M72)
- 95C4 ATI Mobility Radeon HD 3450 (M82-S)
- 95C5 ATI Radeon HD 3450 (RV620 LE)
- 95C6 ATI Radeon HD 3450 (RV620)
- 95C7 ATI RADEON HD 3430 (RV610)
- 95C9 ATI Radeon HD 3450 (RV620)
- 95CC ATI FirePRO V3700 (RV620)
- 95CD ATI FireMV 2450 (RV610)
- 95CE ATI FireMV 2260 (RV610)
- 95CF ATI FireMV 2260 (RV610)
- 9610 ATI Radeon HD 3200 Graphics (RS780)
- 9611 ATI RADEON 3100 Graphics (RS780)
- 9612 ATI RADEON HD 3200 Graphics (RS780M)
- 9613 ATI RADEON 3100 Graphics (RS780M)
- 9614 ATI RADEON HD 3300 Graphics (RS780)
- 9615 AMD 780E (RS780)
- 9616 AMD 760G (RS780)
- 9710 ATI Radeon HD 4200 (RS880)
- 9711 ATI Radeon 4100 (RS880)
- 9712 ATI Mobility Radeon HD 4200 (RS880)
- 9713 ATI Mobility Radeon 4100 (RS880)
- 9876 ATI 3D Rage Pro AGP 2X (ATI GTC (GT-C2U2))
- AA01 Ati Mobility Radeon HD 2600 (Ati Function driver for high definition audio - AT)
- AA08 High Definition Audio Device (All with HDMI support)
- AA10 HDMI Audio Support
- AA20 ATI Radeon HD 3600 Series (RV630)
- AA28 Radeon HD 3400 Series (3400)
- CAB0 S2K CPU to PCI Bridge (A3/U1)
- CAB1 Slot1 CPU to PCI Bridge (A3/U1)
- CAB2 CPU to PCI Bridge (RS200)
- CAB3 R200 AGP Bridge [Mobility Radeon 7000 IGP]
- CBB2 CPU to PCI Bridge (RS200)
-1003 ULSI Systems
- 0201 GUI Accelerator (0x0201)
-1004 VLSI Technology
- 0005 CPU Bridge (82C591/2-FC1)
- 0006 ISA Bridge (82C593)
- 0007 Wildcat System Controller (82C594)
- 0008 82C596/7 Wildcat PCI to ISA Bridge
- 0009 82C597-AFC2
- 000C 82C541
- 000D 82C543
- 0100 CPU to PCI Bridge for notebook (dtdftdfz)
- 0101 Peripheral Controller (82C532)
- 0102 PCI to PCI Bridge (82C534)
- 0103 PCI to ISA Bridge (82C538)
- 0104 82C535 CPU to PCI Bridge
- 0105 IrDA Controller (82C147)
- 0200 RISC GUI Accelerator (82C975)
- 0280 RISC GUI Accelerator (82C925)
- 0304 ThunderBird PCI Audio Accelerator (SAA7785)
- 0305 QSound ThunderBird PCI Audio Gameport
- 0306 QSound ThunderBird PCI Audio Support Registers
- 0307 Thunderbird Avenger Audio Accelerator
- 0308 Thunderbird Avenger GamePort Enumerator
- 0702 Golden Gate II (VAS96011)
- 0703 Tollgate
-1005 Advance Logic (ADL) Inc
- 2064 ALG2032/2064
- 2128 ALG2364A
- 2301 AVL2301 GUI Accelerator
- 2302 ALG2302 GUI Accelerator
- 2364 ALG2364 GUI Accelerator
- 2464 ALG2364A
- 2501 ALG2564A/25128A
-1006 Reply Group
-1007 Netframe Systems Inc
-1008 Epson
-100A Phoenix Technologies
-100B National Semiconductors
- 0001 DP83810 10/100 Fast Ethernet Adapter
- 0002 PCI-IDE DMA Master Mode Interface Ctrlr (PC87415)
- 000E Legacy I/O Controller (PC87560)
- 000F CS4210 OHCI Compliant FireWire Controller
- 0011 PCI System I/O (PC87560)
- 0012 USB Controller
- 001B Advanced PCI Audio Accelerator (LM4560)
- 0020 DP83815/16 Fast Ethernet Adapter (MacPhyter/MacPhyter-II)
- 0021 PCI to ISA Bridge (PC82440)
- 0022 DP83820/1 10/100/1000 Gigabit Ethernet Adapter
- 0028 PCI Host Bridge (Geode GX2)
- 002A GeodeLink PCI South Bridge (CS5535)
- 002B CS5535 ISA Bridge
- 002D Geode IDE Controller
- 002E GEODE - GX3 Audio CS5535 (Castle ())
- 002F USB Controller (Geode)
- 0030 Geode VGA Compatible Device (NSC)
- 0035 DP83065 [Saturn] 10/100/1000 Ethernet Controller
- 0500 LPC Bridge and GPIO (SCx200)
- 0501 SMI Status and ACPI (SCx200)
- 0502 IDE Controller (SC1100/SCx200)
- 0503 XpressAUDIO (SC1100/SCx200)
- 0504 Video Processor (SCx200)
- 0505 X-Bus Expansion Interface (SCx200)
- 0510 LPC Bridge and GPIO (SC1100)
- 0511 SMI Status and ACPI (SC1100)
- 0515 X-Bus Expansion Interface (SC1100)
- D001 PC87410 PCI EIDE Controller (Single FIFO)
-100C TSENG LABS Inc
- 3202 GUI Accelerator (ET4000W32P-A)
- 3205 GUI Accelerator (ET4000W32P-B)
- 3206 GUI Accelerator (ET4000W32P-C)
- 3207 GUI Accelerator (ET4000W32P-D)
- 3208 Graphics/Multimedia Engine (ET6000)
- 4702 ET6300
-100D AST Computer
-100E Weitek
- 0564 Host Bridge (STPC Client)
- 55CC South Bridge (STPC Client)
- 9000 WeitekPower GUI Accelerator (P9000)
- 9001 WeitekPower P9000 Viper
- 9002 WeitekPower P9000 Viper
- 9100 WeitekPower P9100 Viper
-1010 Video Logic Ltd
-1011 Digital Equipment Corporation
- 0001 DecChip 21050 PCI to PCI Bridge
- 0002 DecChip 21040 "Tulip" Ethernet Adapter
- 0004 DecChip 21030 "TGA" Graphics Accelerator
- 0007 NV-RAM (Zephyr)
- 0008 SCSI to SCSI Adapter (KZPSA)
- 0009 DecChip 21140 Fast Ethernet Adapter
- 000A DecChip 21230 Video Codec
- 000C DecChip 21130 Integrated GUI Accelerator
- 000D DecChip TGA2 PDXGB
- 000F FDDI "DEFPA"
- 0014 DecChip 21041 "Tulip Plus" Ethernet Adapter
- 0016 ATM-Controller "DGLPB"
- 0017 PV-PCI Graphics Controller (ZLXp-L)
- 0019 PCI/CardBus 10/100 Mbit Ethernet Ctlr (DC21142/3)
- 001A Farallon PN9000SX Gigabit Ethernet
- 0021 PCI-PCI Bridge (21052[-AB])
- 0022 PCI-PCI Bridge (DC21150-AA)
- 0023 PCI to PCI Bridge (DC21150)
- 0024 PCI-PCI Bridge (DC21151/2)
- 0025 21153 PCI to PCI Bridge
- 0026 21154 PCI to PCI Bridge
- 0034 CardBus (Modem56)
- 0045 PCI to PCI Bridge (DC21553)
- 0046 21554 PCI to PCI Bridge
- 1011 PCI-PCI Bridge (DC21050)
- 1065 21285 Core Logic for StongArm SA-110 Microprocessor
- 2000 Fault Mgr (3.3v/5v Universal PCI) (3X-KPCON-AA)
-1012 Micronics Computers Inc
-1013 Cirrus Logic
- 0038 pci (FW82371EB)
- 0040 Flat Panel GUI Accelerator (CL-GD7555)
- 004C 64-bit Accelerated LCD/CRT Controller (CL-GD7556)
- 00A0 GUI Accelerator (CL-GD5440)
- 00A2 Alpine GUI Accelerator (CL-GD5432)
- 00A4 Alpine GUI Accelerator (CL-GD5434)
- 00A8 Alpine GUI Accelerator (CL-GD5434)
- 00AC Video card (i guess?) (CL-GD5426)
- 00B0 CL-GD5440
- 00B8 64-bit VisualMedia Accelerator (CL-GD5446)
- 00BC 64-bit SGRAM GUI accelerator (CL-GD5480)
- 00D0 Laguna VisualMedia graphics accelerator (CL-GD5462)
- 00D2 CL-GD5462 (Laguna I)
- 00D4 Laguna 3D VisualMedia Graphics Accel (CL-GD5455)
- 00D5 Laguna BD (CL-GD5464)
- 00D6 Laguna 3D VisualMedia Graphics Accel (CL-GD5465)
- 00E8 CL-GD5436U
- 1013 accelerator do audio do pci de sound fusion (cs4630cm)
- 1100 PCI-to-PC Card host adapter (CL-PD6729)
- 1110 PCMCIA/CardBus Controller (CL-PD6832)
- 1112 PCMCIA/CardBus Controller (CL-PD6834)
- 1113 PCI-to-CardBus Host Adapter (CL-PD6833)
- 1200 Nordic GUI Accelerator (CL-GD7542)
- 1202 Viking GUI Accelerator (CL-GD7543)
- 1204 Nordic-lite VGA Cntrlr (CL-GD7541)
- 4000 Ambient CLM Data Fax Voice (1085)
- 4400 Communications Controller (CL-CD4400)
- 6001 CrystalClear SoundFusion PCI Audio Accelerator (CS4610/4611)
- 6003 Crystal CS4610/14/22/24/30 SoundFusion PCI Audio Accelerator
- 6004 Crystal CS4615 SoundFusion PCI Audio Accelerator
- 6005 Crystal Soundfusion(tm) CS 4281 WDM Audio (CS4281)
- 9876 SoundFusion PCI Audio Accelerator (cirrus logic crystal CS 4614)
-1014 International Business Machines Corp.
- 0002 MCA Bridge (MCA Bridge)
- 0005 CPU Bridge (Alta Lite)
- 0007 CPU Bridge (Alta MP)
- 000A Fire Coral PCI to ISA Bridge with PnP Port
- 0017 CPU to PCI Bridge
- 0018 TR Auto LANStreamer (Auto LANStreamer)
- 001B Graphics Adapter (GXT-150P)
- 001C Carrera
- 001D scsi-2 fast pci adapter (82G2675)
- 0020 PCI to MCA Bridge
- 0022 82351/2 PCI to PCI Bridge
- 002D Python
- 002E Coppertime RAID SCSI Adapter (ServeRAID I/II/3x/4H)
- 0031 2 Port Serial Adapter
- 0036 32-bit LocalBus Bridge (Miami/PCI)
- 0037 PowerPC to PCI Bridge and Memory Ctrlr (IBM27-82660)
- 003A CPU to PCI Bridge
- 003C GXT250P/GXT255P Graphics Adapter
- 003E 85H9533 16/4 Token Ring Controller UTP/STP
- 0045 SSA Adapter
- 0046 Interrupt Controller (MPIC)
- 0047 PCI to PCI Bridge
- 0048 PCI to PCI Bridge
- 0049 Warhead SCSI Controller
- 004D MPEG-2 Decoder (IBM 3780IDSP)
- 004E ATM Controller (14104E00)
- 004F ATM Controller (14104F00)
- 0050 ATM Controller (14105000)
- 0053 25 MBit ATM controller (85h9533)
- 0054 GXT500P/GXT550P Graphics Adapter
- 0057 MPEG PCI Bridge (85g1897)
- 005C 10/100 PCI Ethernet Adapter (i82557B)
- 005D TCP/IP networking device (05J3506)
- 005E GXT800P Graphics Adapter
- 007C ATM Controller (14107C00)
- 007D MPEG-2 Decoder (3780IDSP)
- 008B EADS PCI to PCI Bridge
- 008E GXT3000P Graphics Adapter
- 0090 GXT 3000P
- 0091 SSA Adapter
- 0095 PCI Docking Bridge (20H2999)
- 0096 Chukar chipset SCSI Controller
- 009F PCI 4758 Cryptographic Accelerator
- 00A1 ATM support device (PowerNP NPr2.7)
- 00A5 ATM Controller (1410A500)
- 00A6 ATM 155MBPS MM Controller (1410A600)
- 00B7 GXT2000 256-bit Graphics Rasterizer (Fire GL1)
- 00B8 GXT2000P Graphics Adapter
- 00BE ATM 622MBPS Controller (1410be00)
- 00CE 02LI537 Adapter 2 Token Ring Adapter
- 00DC Advanced Systems Management Adapter (ASMA)
- 00F9 Memory Controller and PCI Bridge (CPC700)
- 00FC PCI-64 Bridge (CPC710)
- 0104 Gigabit Ethernet-SX Adapter
- 0105 PCI-32 Bridge (CPC710)
- 010F Remote Supervisor+Serial Port+Mouse/Keyboard
- 011B Raid controller (cbeh3w)
- 0142 Video Compositor Input (Yotta)
- 0144 Video Compositor Output (Yotta)
- 0153 ?
- 0156 PLB to PCI Bridge (405GP)
- 015E 622Mbps ATM PCI Adapter
- 0160 64bit/66MHz PCI ATM 155 MMF
- 016E GXT4000P Graphics Adapter
- 0170 Rasterizer/IBM GT1000 Geometr (RC1000)
- 017D GXT300P Graphics Adapter
- 0180 Snipe chipset SCSI Controller
- 0188 EADS-X PCI-X to PCI-X Bridge
- 01A2 Modem: Intel Corporation 82440MX AC'97 Modem Controller (prog-if 00 [Generic]) (82801)
- 01A7 PCI-X Bridge R1.1 (IBM 133)
- 01BD Morpheus SCSI RAID Controller (ServeRAID 4/5)
- 01C1 64bit/66MHz PCI ATM 155 UTP
- 01E6 Cryptographic Accelerator
- 01EF PLB to PCI-X Bridge (440GP)
- 01FF 10/100 Mbps Ethernet
- 0219 Multiport Serial Adapter
- 021B GXT6500P Graphics Adapter
- 021C GXT4500P Graphics Adapter
- 0233 GXT135P Graphics Adapter
- 0246 ?
- 0266 PCI-X Dual Channel SCSI
- 0268 Gigabit Ethernet-SX Adapter (PCI-X)
- 0269 10/100/1000 Base-TX Ethernet Adapter (PCI-X)
- 027F Embedded PowerPC CPU (440GX)
- 0289 2-Port 10/100/1000 Base-TX PCI-X Adapter (14108902) (2-Port 10/100/1000 Base-TX PCI-X Adapter (14108902)
- 028C Citrine chipset SCSI Controller
- 0295 IBM SurePOS Riser Card Function 0 (NECSCE 11508082)
- 0297 IBM SurePOS Riser Card Function 1 (UARTs) (NECSCE 11508082)
- 02A1 Calgary PCI-X Host Bridge
- 0302 PCI-X Host Bridge
- 0314 ZISC 036 Neural accelerator Card
- 3022 QLA3022 Network Adapter
- 4022 QLA3022 Network Adapter
- FFFF Interrupt Controller (MPIC 2)
-1015 LSI Logic Corp of Canada
-1016 Fujitsu ICL Personal Systems
-1017 Spea Software AG
- 5343 SPEA 3D Accelerator (v7-mpeg modul)
-1018 Unisys Corporation
-1019 Elitegroup Computer System
- 1B10 VIA chipset (sis-648D)
-101A NCR Corporation
- 0005 8156 100VG/AnyLAN Adapter
- 0009 Altera FLEX RAID Controller(??)
- 1DC1 Bynet
-101B Vitesse Semiconductor
-101C Western Digital
- 0193 WD33C193A PCI-SCSI Bridge
- 0196 WD33C196A PCI-SCSI Bridge
- 0197 WD33C197A PCI-Wide SCSI Bridge
- 0296 WD33C296A PCI-Wide SCSI Bridge
- 3193 WD7193 Fast SCSI II Host Adapter
- 3197 WD7197 Fast Wide SCSI II Host Adapter
- 3296 WD7296a Fast Wide SCSI II Host Adapter
- 4296 WD34C294 Wide Fast-20 SCSI Host Adapter
- 9710 Pipeline 9710
- 9712 Pipeline 9712
- C24A 90C (??)
-101E American Megatrends Inc.
- 0009 MegaRAID 428 Ultra RAID Controller (rev 03)
- 1960 80960RP i960RP Microprocessor
- 9010 MegaRAID 428 Ultra Fast Wide SCSI RAID Controller
- 9030 EIDE Controller
- 9031 EIDE Controller
- 9032 EIDE & SCSI Controller
- 9033 SCSI Controller (I960)
- 9040 Multimedia card (amd sempron(tm)2200+)
- 9060 Ultra GT RAID Controller (MegaRAID 434)
- 9063 Remote Assistant (MegaRAC 780)
-101F PictureTel Corp
-1020 Hitachi Computer Electronics
-1021 Oki Electric Industry
-1022 Advanced Micro Devices (AMD)
- 0058 SSA Adapter [Advanced SerialRAID/X]
- 02BD Obsidian chipset SCSI controller
- 0308 CalIOC2 PCI-E Root Port
- 1100 Athlon64/Opteron/Sempron (K8 Family) HyperTransport Technology Configuration
- 1101 Athlon64/Opteron/Sempron (K8 Family) Address Map
- 1102 Athlon64/Opteron/Sempron (K8 Family) DRAM Controller
- 1103 Athlon64/Opteron/Sempron (K8 Family) Miscellaneous Control
- 1200 (Family 10h) Athlon64/Opteron/Sempron HyperTransport Technology Configuration
- 1201 (Family 10h) Athlon64/Opteron/Sempron Address Map
- 1202 (Family 10h) Athlon64/Opteron/Sempron DRAM Controller
- 1203 (Family 10h) Athlon64/Opteron/Sempron Miscellaneous Control
- 1204 (Family 10h) Athlon64/Opteron/Sempron Link Control
- 1300 (Family 11h) Athlon64/Opteron/Sempron HyperTransport Technology Configuration
- 1301 (Family 11h) Athlon64/Opteron/Sempron Address Map
- 1302 (Family 11h) Athlon64/Opteron/Sempron DRAM Controller
- 1303 (Family 11h) Athlon64/Opteron/Sempron Miscellaneous Control
- 1304 (Family 11h) Athlon64/Opteron/Sempron Link Control
- 2000 PCnet LANCE PCI Ethernet Controller (Am79C970/1/2/3/5/6)
- 2001 AM79C978 PCnet Single Chip Home Networking Controller 1/10Mbps
- 2003 Wireless LAN chipset SMC 2602W V3 http://www.smc.com/index.cfm?event=downloads.doSearchCriteria&loca (Am1772)
- 2020 AM53C974 SCSI Bridge (AKA Qlogic Fast!SCSI Basic, Tekram DC-390)
- 2040 AM79C974 Ethernet & SCSI Bridge
- 2080 Conrad Kostecki
- 2081 GeodeLX graphics adapter (Unknown)
- 2082 Geode GX3 AES Crypto Driver (GX3)
- 208F GeodeLink PCI South Bridge (CS5536)
- 2090 CS5536 [Geode companion] ISA
- 2091 CS5536 [Geode companion] FLASH
- 2093 CS5536 Audio Controller (CS5536)
- 2094 CS5536 OHCI USB Host Controller (CS5536)
- 2095 CS5536 EHCI USB Host Controller (CS5536)
- 2096 CS5536 USB Device Controller (Number: CS5536)
- 2097 CS5536 USB OTG Controller (CS5536)
- 209A CS5536 IDE Controller (CS5536)
- 3000 Elan SC520 MicroController PCI Bus Host Brdge
- 4361 AC'97 Audio
- 5E4B Radeon X700 Pro (RV410)
- 7004 AMD-751 (Irongate) CPU to PCI Bridge (SMP Chipset)
- 7006 Processor-to-PCI Bridge / Memory Ctrlr (AMD-751)
- 7007 AGP and PCI-to-PCI Bridge (1x/2x AGP) (AMD-751)
- 700A AGP Host to PCI Bridge (AMD-IGR4)
- 700B AGP PCI to PCI Bridge (AMD-IGR4)
- 700C CPU to PCI Bridge (SMP chipset) (AMD-762)
- 700D CPU to PCI Bridge (AGP 4x) (AMD-762)
- 700E AMD-761 CPU to PCI Bridge
- 700F CPU to AGP Bridge (AGP 4x) (AMD-761)
- 7400 AMD-755 (Cobra) PCI to ISA Bridge
- 7401 Bus Master IDE Controller (AMD-755)
- 7403 AMD-755 (Cobra) Power Management Controller
- 7404 PCI to USB Open Host Controller (AMD-755)
- 7408 AMD-756 (Viper) PCI to ISA Bridge
- 7409 AMD-756 (Viper) EIDE Controller
- 740B AMD-756 (Viper) Power Management Controller
- 740C AMD-756 (Viper) USB Open Host Controller
- 7410 AMD-766 (ViperPlus) PCI to ISA/LPC Bridge
- 7411 AMD-766 (ViperPlus) EIDE Controller
- 7412 AMD-766 (ViperPlus) USB Controller
- 7413 AMD-766 (ViperPlus) Power Management Controller
- 7414 AMD-766 (ViperPlus) OpenHCD USB Host Controller
- 7440 AMD-768 (Opus) PCI to ISA/LPC Bridge
- 7441 AMD-768 (Opus) EIDE Controller
- 7443 AMD-768 (Opus) ACPI Controller
- 7445 AMD-768 (Opus) AC'97 Audio
- 7446 AMD-768 (Opus) AC'97 Modem
- 7448 AMD-768 (Opus) PCI Bridge
- 7449 AMD-768 (Opus) USB Controller
- 7450 PCI-X Bridge (AMD-8131)
- 7451 PCI-X IOAPIC (AMD-8131)
- 7454 AMD-8151 AGP Device (System Controller)
- 7455 AGP Bridge (AMD-8151)
- 7458 PCI-X Bridge (AMD-8132)
- 7459 PCI-X IOAPIC (AMD-8132)
- 7460 PCI Bridge (AMD-8111)
- 7461 USB 2.0 Controller (AMD-8111)
- 7462 Ethernet Controller (AMD-8111)
- 7463 USB Enhanced Host Controller (AMD-8111)
- 7464 USB OpenHCI Host Controller (AMD-8111)
- 7468 LPC Bridge (AMD-8111)
- 7469 UltraATA/133 Controller (AMD-8111)
- 746A SMBus 2.0 Controller (AMD-8111)
- 746B AMD-8111 ACPI System Management Controller
- 746D Audio Controller (c-media cmi8738)
- 746E AC'97 Modem (AMD-8111)
- 756B ACPI Controller (AMD-8111)
-1023 Trident Microsystems
- 0194 CardBus Controller (82C194)
- 2000 advanced PCI DirectSound accelerator (4DWAVE-DX)
- 2001 PCI Audio (4D WAVE DX SOUND ACCELERATOR)
- 2100 Video Accelerator (Cyber-XP4)
- 2200 Video adapter (Volari V3)
- 8400 sausgauos (84001023)
- 8420 compaq 100 (51331071)
- 8500 Via Tech VT8361/VT8601 Graphics Controller (VT8361)
- 8520 Windows xp (Trident Video Accelerator CyberBlade i1)
- 8620 trident (CyberBlade-i1)
- 8820 TRIDENT DISPLAY CONTROLER (Ai1)
- 9320 32-bit GUI Accelerator (TGUI9320)
- 9350 32-bit GUI Accelerator (TGUI9350)
- 9360 Flat panel GUI Accelerator
- 9382 Cyber9382 Reference Design
- 9383 Cyber9383 Reference Design
- 9385 Cyber9385 Reference Design
- 9386 Video Accelerator (Cyber9386)
- 9388 Video Accelerator (Cyber9388)
- 9397 Video Accelerator 3D (Cyber9397)
- 939A Video Accelerator (Cyber9397DVD)
- 9420 DGi GUI Accelerator (TGUI9420)
- 9430 GUI Accelerator (TGUI9430)
- 9440 DGi GUI Acclerator (TGUI9682)
- 9460 32-bit GUI Accelerator (TGUI9460)
- 9470 TGUI9470
- 9520 Cyber9520 Video Accelerator
- 9525 Video Accelerator (Cyber9525)
- 9540 Video Acclerator (Cyber9540)
- 9660 TGUI9660XGi/968x/938x GUI Accelerator
- 9680 GUI Accelerator (TGUI9680)
- 9682 TGUI9682 Multimedia Accelerator
- 9683 GUI Accelerator (TGUI9683)
- 9685 2MB VGA (ProVIDIA 9685)
- 9750 trident dgi (3DImage 9750 PCI/AGP)
- 9753 Video Accelerator (TGUI9753)
- 9754 Wave Video Accelerator (TGUI9753)
- 9759 Image GUI Accelerator (TGUI975?)
- 9783 TGUI9783
- 9785 TGUI9785
- 9850 4mb (3D Image 9850 AGP)
- 9880 gggggg (Blade 3D 9880)
- 9910 CyberBlade XP (00011178)
- 9930 CyberBlade/XPm
- 9960 Trident Video Accelerator CyberBlade-1A31 (9960)
-1024 Zenith Data Systems
-1025 Acer Incorporated
- 0028 Agere Systems soft modem chip (AC97 ID:SIL REV:0x27, 08)
- 1435 CPU to PCI & PCI to ISA Bridge (M1435)
- 1445 ALI M1445 VL to PCI Bridge & Enhanced IDE Adapter
- 1449 ALI M1449 PCI to ISA Bridge
- 1451 ALI M1451 Pentium Chipset
- 1461 ALI M1461 P54C Chipset
- 1489 ALI M1489 486 Chipset
- 1511 ALI M1511 Aladdin
- 1512 ALI M1512 Aladdin
- 1513 ALI M1513 Aladdin
- 1521 ALI M1521 Aladdin III CPU Bridge
- 1523 ALI M1523 ISA Bridge
- 1531 ALI M1531 Aladdin IV/IV+ North Bridge
- 1533 ALI M1533 Aladdin IV/V ISA South Bridge
- 1535 ALI M1535 Aladdin V+ PCI South Bridge
- 1541 ALI M1541 Aladdin V/V+ AGP+PCI North Bridge
- 1542 ALI M1542 Aladdin V/V+ AGP+PCI North Bridge
- 1543 PCi South Bridge Aladdin IV+/V (M1543C)
- 1561 ALI M1561 Northbridge [Aladdin 7]
- 1621 ALI M1621 Aladdin Pro II PCI North Bridge
- 1631 ALI M1631 Aladdin Pro III PCI North Bridge
- 1641 ALI M1641 Aladdin Pro IV PCI North Bridge
- 3141 ALI M3141 GUI Accelerator, 2 MB Video-RAM
- 3143 ALI M3143 GUI Accelerator, 2 MB Video-RAM with DAC
- 3145 ALI M3145 GUI Accelerator, 2 MB Video-RAM
- 3147 ALI M3147 GUI Accelerator, 2 MB Video-RAM with DAC
- 3149 ALI M3149 GUI Accelerator, 4 MB Video-RAM
- 3151 ALI M3151 GUI Accelerator, 8 MB Video-RAM
- 3307 ALI M3307 MPEG-1 Decoder
- 3309 ALI M3309 MPEG Decoder
- 3321 ALI M3321 MPEG-II Decoder
- 5212 ALI M4803
- 5215 EIDE Controller (M5217)
- 5217 ALI M5217 I/O Controller
- 5219 ALI M5219 I/O Controller
- 5225 ALI M5225 EIDE Controller
- 5229 ALI M5229 EIDE Controller
- 5235 ALI M5235 I/O Controller
- 5237 PCI USB Host Controller (M5237)
- 5239 ALI M5273 USB 2.0 Controller
- 5240 EIDE Controller
- 5241 PCMCIA Bridge
- 5242 General Purpose Controller
- 5243 PCI to PCI Bridge Controller
- 5244 Floppy Disk Controller
- 5247 ALI M1541 PCI to PCI Bridge
- 5251 ALI M5251 P1394 OHCI Controller
- 5427 ALI PCI to AGP Bridge
- 5451 ALI M5451 PCI AC-Link Controller Audio Device
- 5453 ALI M5453 PCI AC-Link Controller Modem Device
- 7101 ALI M7101 PCI PMU Power Management Controller
-1028 Dell Computer Corporation
- 0001 Expandable RAID Controller (PERC) (SCSI) (PowerEdge 2 /Si)
- 0002 Expandable RAID Controller (PowerEdge 3/Di)
- 0003 Expandable RAID Controller (PowerEdge 3/Si)
- 0004 Expandable RAID Controller (PowerEdge 3/Si)
- 0005 Expandable RAID Controller (PowerEdge 3/Di)
- 0006 Expandable RAID Controller (PowerEdge 3/Di)
- 0007 Remote Assistant Card 3
- 0008 PowerEdge Expandable RAID Controller 3/Di
- 000A Expandable RAID Controller (PowerEdge 3/Di)
- 000C Embedded Systems Management Device 4 (53C885 23800 SCSI Adapter)
- 000D LSI53C895 PCI to Ultra2 SCSI I/O Processor with LVD Link
- 000E PERC 4/DI Raid Controller (000E)
- 000F PERC 4/Di RAID Controller
- 0011 Dell Remote Access Controller v4 (DRAC4)
- 0012 Dell RAC v4 Virtual UART (DRAC4-UART)
- 0013 Expandable RAID Controller (PERC 4e/Si and PERC 4e/Di)
- 0014 Dell Remote Access Controller subsystem (DRAC4-0)
- 0015 Integrated RAID controller (PERC 5/i RAID Controller)
- 012C Intel Gigabit controller
- 0287 Adaptec 2200S SCSI RAID controller (DELL PERC 320/DC)
- 1000 A Intel 537 epg v.92 modem repackaged by dell (FA82537EP)
- 1F0C Dell PERC 6/i Integrated RAID Controller (1078)
-1029 Siemens Nixdorf AG
-102A LSI Logic, Headland Division
- 0000 HYDRA Pentium PCI Chipset (MPI)
- 0010 ASPEN 486 PCI Chipset
- 0310 L64364 ATMizer r II+ ATM-SAR Chip
- 9876 P5 CHIPSET (HYDRA)
-102B Matrox Electronic Systems Ltd.
- 0010 MGA-I (Impression??)
- 0040 Matrox P650 very new model (20080724) (chip=0x2539102b)
- 0518 Atlas GUI Accelerator (MGA-PX2085)
- 0519 MGA-2064W Storm (Millennium board)
- 051A Hurricane/Cyclone 64-bit graphics chip (mga-1164sg-a)
- 051B MGA-2164W Millennium II PCI
- 051E MGA-1164SG Mystique 220 AGP
- 051F MGA-2164WA Millennium II AGP
- 0520 AGP (Matrox lnc MGA-G200B)
- 0521 102B (Matrox lnc MGA-G200B)
- 0522 Matrox G200e (ServerEngines) - English (G200e)
- 0525 Chip of G450 graphics card (MGA G450 Dual Head)
- 0527 Parhelia AGP
- 0528 Parhelia 128MB/256MB/PCI/HR256 (Parhelia)
- 0D10 MGA-I Athena (Ultima/Impression board)
- 1000 MGA-G100 Chipset PCI
- 1001 Twister AGP (MGA-G100)
- 1525 Fusion G450 AGP
- 1527 Fusion Plus G800 AGP
- 2007 GUI+3D Accelerator (Mistral)
- 2527 AGP Chipset (MGA-G550)
- 2537 Parhelia Chipset AGP (Parhelia-LX)
- 2538 Matrox Millennium P650 LP PCIe 64 (Matrox Millennium P650 LP PCIe 64)
- 2539 Millennium P690
- 4536 Video Capture Card (Meteor 2 STD/MC/Dig)
- 6573 10/100 Multiport Switch NIC (Shark)
- 80A0 Multimedia Device (RT.x10)
- 9876 Multimedia device (RT 2000)
-102C Asiliant (Chips And Technologies)
- 00B8 Wingine DGX - DRAM Graphics Accelerator (64310)
- 00C0 AGP/PCI Flat Panel/CRT VGA Accelerator (69000)
- 00D0 F65545 Flat Panel GUI Accelerator
- 00D8 Flat Panel/CRT VGA Controller (65540)
- 00DC F65548 Flat Panel GUI Accelerator
- 00E0 F65550 HiQV32 GUI Accelerator
- 00E4 Flat Panel/LCD CRT GUI Accelerator
- 00E5 F65555 HiQVPro GUI Accelerator
- 00F0 vga Controller
- 00F4 F68554 HiQVision GUI Controller
- 00F5 GUI Controller
- 01E0 PCI Flat Panel/CRT VGA Accelerator (65560)
- 0C30 AGP/PCI Flat Panel/CRT VGA Accelerator (69030)
-102D Wyse Technologies
- 50DC 3328 Audio
-102E Olivetti Advanced Technology
-102F Toshiba America
- 0009 CPU Bridge (r4x00)
- 000A TX3927 MIPS RISC PCI Controller
- 0020 ATM PCI Adapter (Meteor 155)
- 0030 PCIVEN_104C&DEV_803B&SUBSYS_8212104D&REV_004&6B16D5B&0&1AF0 (TC35815CF)
- 0031 TC35815CF PCI 10/100 Mbit Ethernet Controller with WOL
- 0032 TC35815CF PCI 10/100 Mbit Ethernet Controller on TX4939
- 0105 GOKU-S Bus Master IDE Controller (TC86C001FG)
- 0106 GOKU-S USB Host Controller (TC86C001FG)
- 0107 GOKU-S USB Device Controller (TC86C001FG)
- 0108 GOKU-S I2C Bus/SIO/GPIO Controller (TC86C001FG)
- 0180 TX4927/38 MIPS RISC PCI Controller
- 0181 MIPS RISC PCI Controller (PCIC) (TX4925)
- 0182 MIPS RISC PCI Controller (PCIC) (TX4937)
-1030 TMC Research
-1031 Miro Computer Products AG
- 5601 MiroVIDEO DC20 Video I/O & JPEG
- 5607 video in and out with motion jpeg compression and deco (2IVDC-PCX1 1250400 033893932)
- 5631 Media 3D
- 6057 DC30D-601601-4.0 (MiroVIDEO DC30D)
-1032 Compaq
-1033 NEC Electronics Hong Kong
- 0001 PCI to 486 like bus Bridge (upD98409)
- 0002 PCI to VL98 Bridge
- 0003 ATM Controller
- 0004 PCI bus Bridge (R4000)
- 0005 PCI to 486 like peripheral bus Bridge (pci 7432)
- 0006 GUI Accelerator
- 0007 PCI to ux-bus Bridge (unknown from Creative.com)
- 0008 GUI Accelerator (vga equivalent)
- 0009 GUI Accelerator for 98
- 0016 PCI to VL Bridge
- 001A [Nile II]
- 001D uPD98405 NEASCOT-S20 ATM Integrated SAR Controller
- 0021 Vrc4373 [Nile I]
- 0029 3D Accelerator (PoverVR PCX1)
- 002A 3D Accelerator (PoverVR)
- 002C Star Alpha 2
- 002D PCI to C-bus Bridge
- 002F 1394 Host Controller (NEC D72874GC)
- 0035 Dual OHCI controllers plus Single EHCI controller (udp9210)
- 0036 NEASCOT-S40C ATM Light SAR Controller (uPD98409)
- 003B PCI to C-bus Bridge
- 003E NAPCCARD CardBus Controller (uPD66369)
- 0046 3D Accelerator (PoverVR PCX2)
- 005A Vrc5074 [Nile 4]
- 0063 uPD72862 Firewarden OHCI Compliant FireWire Controller
- 0067 PowerVR series II graphics processor (PowerVR Neon 250)
- 0072 uPD72874 IEEE1394 OHCI 1.1 3-port PHY-Link Ctrlr
- 0074 56k Voice Modem (NEC FMK 56 V90)
- 009B Vrc5476
- 00A5 VRC4173
- 00A6 VRC5477 AC97
- 00BE 64-bit CPU with Northbridge (VR4122)
- 00CD IEEE1394 1-Chip OHCI Host Controller (uPD72870)
- 00CE IEEE1394 1-Chip OHCI Host Controller (uPD72871/2)
- 00DF Vr4131
- 00E0 uPD720100A/101 USB 2.0 Enhanced Host Controller
- 00E7 IEEE1394 OHCI 1.1 2-port PHY-Link Ctrlr (uPD72874)
- 00F2 IEEE1394+OHCI+1.1+3-port+PHY-Link+Ctrlr (D72874GC)
- 00F3 uPD6113x Multimedia Decoder/Processor [EMMA2]
- 010C VR7701
- 0125 uPD720400 PCI Express - PCI/PCI-X Bridge
- 013A Angel Family MPEG Device
- 0520 1394 CARD (NEC D72874GC)
- 1033 NEC USB 2.0 Host Adapter (0720101gj)
-1034 Burndy/Framatome Connectors USA Ltd
-1035 Industrial Technology Research
-1036 Future Domain Corp
- 0000 TMC-18XX/TMC-3260 SCSI-2 Controller (36c70)
-1037 Hitachi Micro Systems Inc
-1038 AMP Incorporated
-1039 Silicon Integrated Systems (SiS)
- 0001 Virtual PCI-to-PCI bridge (AGP) (SiS760)
- 0002 Virtual PCI to PCI Bridge (AGP) (520)
- 0003 Virtual PCI to PCI Bridge (AGP) (SiS760)
- 0005 Pentium Chipset
- 0006 PCI/ISA Cache Memory Controller (PCMC) (SiS 85C501)
- 0008 SiS PCI to ISA Bridge (LPC Bridge)
- 0009 SiS600 Power Management Controller
- 0016 SiS961/2 SMBus Controller
- 0018 SiS950 PCI to ISA Bridge (LPC Bridge)
- 0160 SiS160 811 Wireless LAN Adapter (SiS160)
- 0180 Raid Controller(?Mode Raid0) (SiS180)
- 0181 Raid Controller(?Mode Raid1)
- 0182 Raid Controller(?Mode Raid0+1)
- 0183 ?SATA (?SIS965)
- 0186 ?
- 0190 SiS191 Gigabit LAN & SiS190 LAN (SiS968, SiS965, SiS966, SiS965L, SiS966L)
- 0191 SIS190 (SIS190)
- 0200 Onboard Graphics Controller (SiS5597/98)
- 0204 PCI1 (SiS 6215)
- 0205 SiS6205 GUI Accelerator with RAM-DAC, UMA-Support
- 0300 SiS300/SiS305 GUI Accelerator+3D
- 0305 2D/3D/Video/DVD Accelerator (SiS305)
- 0315 2D/3D Accelerator (SiS 315)
- 0325 Silicon Integrated Systems (SiS) (SiS6330)
- 0330 Xabre 2D/3D Accelerator (AG400T8-D64) (SiS330)
- 0406 PCI/ISA Cache Memory Controller (PCMC) (85C501)
- 0496 CPU to PCI & PCI to ISA Bridge (85C496)
- 0530 Host-to-PCI bridge (SiS530)
- 0540 Host-to-PCI Bridge (SiS540)
- 0550 SiS550/1/2 CPU to PCI Bridge
- 0596 Pentium PCI chipset with IDE (SiS596)
- 0597 EIDE Controller (step C) (SiS5513)
- 0601 SiS83C601 PCI Enhanced IDE Controller
- 0620 Host-to-PCI Bridge (SiS620)
- 0630 Host-to-PCI Bridge (SiS630)
- 0635 Host-to-PCI Bridge (SiS 635)
- 0640 Host-to-PCI Bridge (SiS 640)
- 0645 Host-to-PCI Bridge (SiS 645)
- 0646 Host-to-PCI Bridge (SiS645DX)
- 0648 Host-to-PCI Bridge (SiS648MX)
- 0649 SiS648FX(??) CPU to PCI Bridge
- 0650 Host-to-PCI Bridge (SiS961)
- 0651 Host-to-PCI Bridge (SiS651)
- 0652 SiSM650(??) CPU to PCI Bridge
- 0655 Host-to-PCI Bridge (SiS655)
- 0656 CPU to PCI Bridge
- 0658 CPU to PCI Bridge (SiS R658)
- 0659 CPU to PCI Bridge (SiS R659)
- 0660 Host-to-PCI Bridge
- 0661 CPU to PCI Bridge (SiS 661FX)
- 0662 CPU to PCI Bridge
- 0663 CPU to PCI Bridge
- 0730 Host-to-PCI Bridge (SiS 730)
- 0735 Host-to-PCI Bridge (SiS 735)
- 0740 SiS740 CPU to PCI Bridge
- 0741 CPU to PCI Bridge (SiS741)
- 0745 Host-to-PCI Bridge (SiS745)
- 0746 Host-to-PCI Bridge (SiS746)
- 0748 CPU to PCI Bridge (SiS748)
- 0750 SiS750 CPU to PCI Bridge
- 0755 Host-to-PCI Bridge (SiSM650?)
- 0756 CPU to PCI Bridge (SiS755FX)
- 0760 Athlon 64 CPU to PCI Bridge (SiS760)
- 0761 Athlon 64 CPU to PCI Bridge (88e8056)
- 0762 Athlon 64 CPU to PCI Bridge
- 0900 sis 900 and integrated lan (SiS 900)
- 0901 SiS900 10/100 Ethernet Adapter (Device ID = 0900 SiS900)
- 0962 LPC Bridge (SiS962)
- 0963 SiS963 PCI to ISA Bridge (LPC Bridge)
- 0964 LPC Bridge (SiS964)
- 0999 pciven_1039&subsys_200b163&rev_a03&61aaa010&17 (sis950)
- 1039 SiS5597 SVGAa (SiS5597a)
- 1040 ?
- 10EC ?
- 1182 SiS965/966 182/1182 RAID Controller
- 1183 ?SATA (?SIS966/968 )
- 1184 Raid/AHCI Controller (SIS966(AHCI)&*12289;SIS968(RAID))
- 1185 AHCI Controller (SIS968)
- 3602 IDE Controller (SiS83C602)
- 5107 Hot Docking Controller (SiS5107)
- 5300 SiS540 PCI Display Adapter
- 5315 GUI Accelerator (SiS530/1/2)
- 5401 486 PCI Chipset (SiS5401)
- 5511 PCI/ISA System Memory Controller (SiS5511/5512)
- 5513 PATA Controller (All SIS SouthBridge)
- 5517 SiS5517 Pentium Chipset, CPU to PCI Bridge
- 5518 UDMA IDE Controller (SiS5518)
- 5571 SiS5571 Pentium Chipset, CPU to PCI Bridge
- 5581 SiS5581 Pentium Chipset
- 5582 PCI to ISA Bridge (SiS5582)
- 5591 SiS5591/2 CPU to PCI Bridge
- 5596 PCI, Memory & VGA Controller (SiS5596)
- 5597 Host to PCI bridge (SiS5597)
- 5600 Host-to-PCI Bridge (SiS600)
- 5630 Host-to-PCI Bridge (SiS630)
- 5811 ?
- 6204 SiS6204 Video decoder & MPEG interface
- 6205 PCI VGA Controller (SiS6215)
- 6225 PCI Graphics & Video Accelerator (SiS 950 m2284dxs)
- 6236 SiS6236 AGP GUI Accelerator+3D
- 6300 GUI Accelerator+3D (SiS630/730)
- 6306 Integrated 3D SVGA Controller (SiS530/620)
- 6325 Sis 650 Integrated GFX Controller (IGP) (pc&*305;VEN_1039&DEV_6330)
- 6326 SiS6326 GUI Accelerator
- 6330 GUI 2D/3D Accelerator (SiS661FX/M661FX/760/741/M760/M741)
- 6342 SiS662/760GX/761/761GX
- 6351 IGP Graphics Drivers (SIS 651)
- 6972 ?
- 7001 SiS5597/8 Universal Serial Bus Controller
- 7002 USB 2.0 Enhanced Host Controller (SiS 7001 PCI to USB Open Host Controller)
- 7005 SiS551/552 Memory Stick Controller
- 7007 OHCI Compliant FireWire Controller (1039)
- 7012 PCI Audio Accelerator (SiS7012 + Realtek AC97 audio)
- 7013 Smart Link 56K Voice Modem (SiS7013)
- 7015 Software Audio dd (SiS550 dd)
- 7016 10/100 Ethernet Adapter (SiS7016)
- 7018 AC97(CMI973X) ..AUDIO Drivers (SiS7018)
- 7019 Hardware Audio (SiS550/1/2)
- 7300 GUI Accelerator+3D (SiS7013)
- 7502 Realtek HDA Audio Driver.
- 8139 2012 (2012)
- 9876 pci vga card for winxp & win2k (sis6215)
-103A Seiko Epson Corp
-103B Tatung Corp Of America
-103C Hewlett-Packard Company
- 0024 Standard Vista USB Keyboard
- 0A01 HP Scanjet 2400 (HP2400)
- 1005 Visialize EG (A4977A)
- 1008 001 (Donner GFX)
- 100A Hewlett-Packard VisualizeFX Series Video (hpVisualizeFX)
- 1028 Tachyon TL Fibre Channel Adapter (ACPI/HPQ0006)
- 1029 Tachyon XL2 Fibre Channel Adapter (HPFC-5200B)
- 102A Tachyon TS Fibre Channel Host Adapter (Tach TS)
- 1030 DeskDirect 10/100VG LAN Adapter (J2585B)
- 1031 DeskDirect 10/100 NIC (J2585B222)
- 1040 DeskDirect 10BaseT NIC (J2973A)
- 1041 DeskDirect 10/100VG NIC (J2585B)
- 1042 DeskDirect 10BaseT/2 NIC (J2970A)
- 1048 SAS
- 1049 DIVA1
- 104A DIVA2
- 104B SP2
- 104D EL-10 Ethernet Adapter (J3242A)
- 1054 PCI Local Bus Adapter
- 1064 PCnet Ethernet Controller (79C970)
- 108B Visualize FXe
- 10C1 NetServer Smart IRQ Router
- 10ED HP Communications Port (TopTools)
- 10F0 rio System Bus Adapter
- 10F1 rio I/O Controller
- 1200 10/100 NIC (82557B)
- 1219 NetServer PCI Hot-Plug Controller
- 121A NetServer SMIC Controller
- 121B NetServer Legacy COM Port Decoder
- 121C NetServer PCI COM Port Decoder
- 1229 System Bus Adapter (zx1)
- 122A I/O Controller (zx1)
- 122B Local Bus Adapter (zx1)
- 122E PCI-X Local Bus Adapter
- 127B sx1000 System Bus Adapter
- 127C sx1000 I/O Controller
- 1290 Auxiliary Diva Serial Port
- 1291 Auxiliary Diva Serial Port
- 12B4 zx1 QuickSilver AGP8x Local Bus Adapter
- 12EB sx2000 System Bus Adapter
- 12EC sx2000 I/O Controller
- 12EE PCI-X 2.0 Local Bus Adapter
- 12F8 Broadcom BCM4306 802.11b/g Wireless LAN
- 12FA Broadcom Wireless miniPCI in a HP laptop (Broadcom BCM4306)
- 1302 HP Management Shared Memory Device (1302103C)
- 1303 RMP-3 (Remote Management Processor)
- 1361 BCM4312 802.11a/b/g WLAN Controller
- 137A Atheros AR5007 (AR5007)
- 1411 HP PSC 750 (HPOJ750)
- 1F1D 3G Broadband device
- 201D 3G Broadband device
- 231D 3G Broadband device
- 2910 PCI Bus Exerciser (E2910A)
- 2920 Fast Host Interface
- 2924 PCI Host Interface Adapter (E2924A)
- 2925 32 bit PCI Bus Exerciser and Analyzer (E2925A)
- 2926 64 bit PCI Bus Exerciser and Analyzer (E2926A)
- 2927 64 Bit, 66/50MHz PCI Analyzer & Exerciser (E2927a)
- 2940 64 bit, 66/50MHz CompactPCI Analyzer&Exerciser (E2940A)
- 3080 Pavilion ze2028ea
- 3085 Realtek RTL8139/8139C/8139C+
- 30B5 Compaq Presario V3000Z
- 31FB DL365 ATI ES1000 VGA controller
- 3206 Adaptec Embedded Serial ATA HostRAID (unknown)
- 3207 not sure (not sure)
- 3220 P600 SmartArray Raid Controller (P600)
- 3222 Smart Array SAS/SATA Controller
- 3230 Smart Array P400 Controller (Smart Array P400 Controller)
- 3231 Smart Array Controller
- 3232 Smart Array SAS/SATA Controller Test Board
- 3233 Smart Array Controller
- 3234 Smart Array Controller
- 3235 Smart Array Controller
- 3236 Smart Array Controller
- 3237 Smart Array Controller
- 3238 Smart Array E200/E200i SAS/SATA Controller
- 3239 Smart Array Controller
- 323A Smart Array P410i Controller (Smart Array P410i Controller)
- 323B Smart Array Controller
- 323C Smart Array Controller
- 3300 Proliant iLO2 virtual USB controller
- 3302 Integrated Lights Out 2.0 (3305103C)
- 3305 Proliant iLO2 [Integrated Lights Out] controller
- 4030 zx2 System Bus Adapter
- 4031 zx2 I/O Controller
- 4037 PCIe Local Bus Adapter
- 403B PCIe Root Port
- 5461 HP integrated Module with Bluetooth 2.0 Wireless support (unknown)
- 60E8 NetRAID-2M : ZX1/M (OEM AMI MegaRAID 493)
-103E Solliday Engineering
-103F Logic Modeling (Synopsys)
-1040 AccelGraphics Inc (Kubota Pacific)
-1041 Computrend
-1042 Micron (Was: PC Technology Inc)
- 1000 RZ1000 EIDE Controller
- 1001 RZ1001 EIDE Controller
- 3000 Samurai 0 CPU to PCI Bridge
- 3010 Samurai 1 CPU to PCI Bridge
- 3020 Samurai IDE Controller
- 3030 MT82P664 Samurai 64M2 North Bridge
- 3120 Samurai-DDR CPU to PCI Bridge
- 3130 Samurai-DDR AGP Controller
-1043 Asustek Computer Inc.
- 0675 Crestline (GML GL960)
- 1969 Attansic L1 Gigabit Ethernet 10/100/1000Base-T Adapter (P5LD2 - EAYZ)
- 5653 ATI Radeon Graphics Processor x700 Mobility [M26-X] (M26-X)
- 82C6 Gigabit Ethernet NIC(NDIS 6.0) (RTL8168/8111)
-1044 Adaptec (Formerly: Distributed Processing Technology (DPT))
- 1012 RAID Engine (Domino)
- A400 DPT 2124/9X SmartCache III/RAID SCSI Controller
- A500 PCI Bridge (unknown)
- A501 I2O SmartRAID V Controller
- A511 SmartRAID Controller (Raptor)
-1045 OPTi Inc.
- 0005 ?
- A0F8 82C750 Vendetta Chipset USB Controller
- C101 GUI Accelerator (82C264)
- C178 pci usb card 2- port (82C178)
- C556 Viper (82C556)
- C557 82C557/8 Viper-M Pentium Bridge
- C558 82C558 Viper PCI to ISA Bridge with PnP
- C567 82C750 Vendetta Chipset (Viper Max) CPU to PCI Bridge
- C568 82C750 Vendetta Chipset (Viper Max) PCI to ISA Bridge
- C569 82C579 Viper XPress+ Chipset, Pentium to PCI Bridge
- C621 82C621 IDE Controller (Single FIFO)
- C700 82C700 FireStar PCI to ISA Bridge (82C700)
- C701 FireStar mobile chipset: host bridge (82C701)
- C814 FireBridge II Docking Station Controller (82C814)
- C822 CPU to PCI & PCI to ISA PnP bridge (82C822)
- C824 FireFox 32-Bit PC Card Controller (82C824)
- C825 PCI-to-ISA Bridge (82C825 function 0)
- C832 82C832 CPU to PCI Bridge and PCI to ISA Bridge
- C861 FireLink PCI-to- 5 x USB Bridge( usb1.1 ) (82C861)
- C881 82C881 FireLink 1394 OHCI Firewire Link Controller
- C895 82C895
- C931 ISA Sound & Game Port controller. (82C931)
- C935 MachOne integrated PCI audio processor (82C935)
- D568 82C825 FireBridge II PCI EIDE Controller
- D768 82C750 Vendetta Chipset UDMA EIDE Controller
-1046 IPC Corp Ltd
-1047 Genoa Systems Corp
-1048 ELSA GmbH
- 0253 ELSA GLADIAC 528 (0x0c92)
- 0C60 NVidia Geforce 2 MX (Elsa Gladiac MX)
- 0C71 NVidia GeForce3 Ti 200 (Elsa Gladiac 721)
- 1000 ISDN Controller (Quick Step 1000)
- 3000 QuickStep 3000 ISDN Controller
- 8901 ELSA GLoria XL
-1049 Fountain Technology
-104A ST Microelectronics (SGS Thomson)
- 0008 diamond (STG 2000X)
- 0009 STG 1764X
- 0010 PowerVR KYRO series 3 graphics processor (STG4000)
- 0123 SPEAr1300 (V65204)
- 0209 STPC Consumer/Industrial North/South Bridge
- 020A STPC Atlas/Consumer-S/Consumer-II/Elite North Bridge
- 0210 ISA Bridge (STPC Atlas)
- 021A STPC Consumer-S/Elite ISA Bridge
- 021B ISA Bridge (STPC Consumer-II)
- 0228 IDE Controller (STPC Atlas)
- 0230 USB Controller (STPC Atlas)
- 0500 ADSL (ST70137)
- 0981 DEC-Tulip Compatible 10/100 Ethernet Adapter
- 1746 STG 1764X
- 2774 STE10/100A PCI 10/100 Ethernet Controller with PHY
- 3520 MPEG-II Video Decoder
- CC00 ConneXt I/O Hub multifunction device (STA2X11)
- CC01 ConneXt I/O Hub multifunction device (STA2X11)
- CC02 ConneXt I/O Hub multifunction device (STA2X11)
- CC03 ConneXt I/O Hub multifunction device (STA2X11)
- CC04 ConneXt I/O Hub multifunction device (STA2X11)
- CC05 ConneXt I/O Hub multifunction device (STA2X11)
- CC06 ConneXt I/O Hub multifunction device (STA2X11)
- CC07 ConneXt I/O Hub multifunction device (STA2X11)
- CC08 ConneXt I/O Hub multifunction device (STA2X11)
- CC09 ConneXt I/O Hub multifunction device (STA2X11)
- CC0A ConneXt I/O Hub multifunction device (STA2X11)
- CC0B ConneXt I/O Hub multifunction device (STA2X11)
- CC0C ConneXt I/O Hub multifunction device (STA2X11)
- CC0D ConneXt I/O Hub multifunction device (STA2X11)
- CC0E ConneXt I/O Hub multifunction device (STA2X11)
- CC0F ConneXt I/O Hub multifunction device (STA2X11)
- CC10 ConneXt I/O Hub multifunction device (STA2X11)
- CC11 ConneXt I/O Hub multifunction device (STA2X11)
- CC12 ConneXt I/O Hub multifunction device (STA2X11)
- CC13 ConneXt I/O Hub multifunction device (STA2X11)
- CC14 ConneXt I/O Hub multifunction device (STA2X11)
- CC15 ConneXt I/O Hub multifunction device (STA2X11)
- CC16 ConneXt I/O Hub multifunction device (STA2X11)
- CC17 ConneXt I/O Hub multifunction device (STA2X11)
- CD00 SPEAr1300 (V65204)
-104B Mylex / Buslogic
- 0140 BT-946C PCI-SCSI-2 MultiMaster
- 1040 BA80c30 PCI-SCSI MultiMaster
- 8130 BT-930/932/950/952 FlashPoint LT/DL/LW/DW Ultra(wide) SCSI
-104C Texas Instruments (TI)
- 014E device (4610,4515,4610fm)
- 0500 ThunderLAN 100 Mbit LAN Controller (TNETE100A/110A/211)
- 0508 PCI interface for TI380 compressors (TI380PCI)
- 1000 TI PCI Eagle i/f AS
- 104C PCI1510 PC Card CardBus Controller
- 3D04 Permedia (TVP4010)
- 3D07 AGP Permedia 2 (TVP4020)
- 8000 LYNX IEEE1394 FireWire Host Controller (TSB12LV21)
- 8009 OHCI-Lynx PCI IEEE 1394 Host Controller (TSB12LV22)
- 8010 OHCI-Lynx IEEE 1394 Host Controller (TSB12LV26)
- 8011 PCI4450 OHCI-Lynx IEEE-1394 FireWire Controller
- 8017 PCI4410A OHCI-Lynx IEEE-1394 FireWire Controller
- 8019 OHCI-Lynx PCI IEEE 1394 Host Controller (TSB12LV23)
- 8020 OHCI-Lynx PCI IEEE 1394 Host Controller (TSB12LV26)
- 8021 1394a-2000 OHCI PHY/Link Layer Ctrlr xxx (TSB43AA22xxx)
- 8022 TSB43AB22 1394a-2000 Controller (PHY/Link)
- 8023 IEEE1394a-2000 OHCI PHY/Link-Layer Ctrlr (TSB43AB21/A)
- 8024 TSB43AB23 1394a-2000 OHCI PHY/link-layer Controller
- 8025 1394b OHCI-Lynx IEEE 1394 Host Controller (TSB82AA2)
- 8026 TSB43AB21 1394a-2000 OHCI PHY/link-layer Controller
- 8027 PCI4451 OHCI-Lynx IEEE-1394 FireWire Adapter
- 8029 OHCI Compliant IEEE-1394 FireWire Controller (040803-2158)
- 802B PCI7410,7510,7610 OHCI-Lynx Controller
- 802E 1394a-2000 OHCI Two-Port PHY/Link-Layer Controller (PCI7420)
- 8031 PCIxx21/x515 Cardbus Controller
- 8032 OHCI Compliant IEEE-1394 FireWire Controller
- 8033 PCIxx11/21 Integrated FlashMedia Controller
- 8034 SDA Standard Compliant SD Host Controller (10981734)
- 8035 PCI GemCore based SmartCard controller (N/A)
- 8036 Texas Instruments PCIxxx12 Cardbus Controller (PCI6515)
- 8038 Texas Instruments PCI GemCore SmartCard (FF001179)
- 8039 PCIxx12 Cardbus Controller
- 803A OHCI Compliant IEEE 1394 Host controller (PCIxx12)
- 803B Texas Instruments an Integrated FlashMedia Controller (PCIVEN_104C&DEV_803B&SUBSYS_207C17AA&REV_00)
- 803C SDA Standard Compliant SD Host Controller (PCIxx12)
- 803D Texas Instruments PCI GemCore based SmartCard controller (0780)
- 8119 iRDA Compatible Controller (na)
- 8201 TI UltraMedia Firmware Loader Device (006D103C)
- 8204 PCI 7510/4510 Cardbus Controller (4610, 4515, 4610FM, 7510)
- 8231 PCI-Express to PCI/PCI-X bridge (XIO2000A)
- 8235 XIO2200(A) IEEE-1394a-2000 Controller (PHY/Link)
- 8400 D-Link AirPlus DWL-520+, Uses a TI 802.11b 22 MBPS Chip (ACX100AGHK)
- 8401 ACX 100 22Mbps Wireless Interface
- 8671 bogus (bogus)
- 9000 Wireless Interface (??)
- 9065 Fixed Point Digital Signal Processor (TMX320C6412)
- 9066 U.S. Robotics 802.11g Wireless Turbo PC Card (USR5410)
- A001 TDC1570 64-Bit PCI ATM Interface
- A100 TDC1561 32-Bit PCI ATM Interface
- A102 TNETA1575 HyperSAR Plus w/PCI Host interface & UTOPIA Interface
- A106 TMS320C6205 Fixed Point DSP
- A186 TI C6416T DSP (TMS320C6416T)
- A828 PCI-to-PCI Bridge (PCI2050BPDV)
- AC10 PC Card Controller (PCI1050)
- AC11 PC Card Controller (PCI1030/1053)
- AC12 PC card CardBus Controller (PCI1131)
- AC13 PCIVEN_0180&DEV_0822&SUBSYS_01270025&REV_22 (PCI9066)
- AC15 PCI1131 PC Card CardBus Controller
- AC16 PC Card CardBus Controller (PCI1250)
- AC17 PCI1220 PC Card CardBus Controller
- AC18 PC card CardBus Controller (PCI1260)
- AC19 PC card CardBus Controller (PCI1221)
- AC1A PC card CardBus Controller (PCI1210)
- AC1B PC card CardBus Controller (PCI1450)
- AC1C PCI1225 PC Card CardBus Controller
- AC1D PCI1251 PC Card CardBus Controller
- AC1E PCI1211 PC Card CardBus Controller
- AC1F PC card CardBus Controller (PCI1251B)
- AC20 PCI to PCI Bridge (PCI2030)
- AC21 PCI to PCI Bridge (PCI2031)
- AC22 PCI Docking Bridge (PCI2032)
- AC23 PCI-to-PCI Bridge (PCI2250)
- AC28 PCI-to-PCI Bridge (PCI2050/2050I)
- AC30 PC card CardBus Controller (PCI1260)
- AC40 PC card CardBus Controller (PCI4450)
- AC41 PC card CardBus Controller (PCI4410)
- AC42 PC card CardBus Controller (PCI4451)
- AC43 PC card CardBus Controller (PCI4550)
- AC44 PC Card Controller SDFSDAFSADFSDAFSDAF (PCI4510SDFSDFSD)
- AC46 PCCard CardBus Controller (PCI4520)
- AC47 PCI7510 PC Card CardBus Controller
- AC48 PCI7610 PC Card CardBus Controller
- AC49 PCI7410 PC Card CardBus Controller
- AC4A PC Card CardBus Controller with SmartCard
- AC4B PC Card CardBus Controller with FlashMedia
- AC4C PC Card CardBus Controller with FlashMedia
- AC50 PC card cardBus Controller (PCI1410)
- AC51 PCI1420 PC Card CardBus Controller
- AC52 PC card CardBus Controller (PCI1451)
- AC53 PC card CardBus Controller - 5-in-1 Media Card Reader (PCI1421)
- AC54 PCI1620 PC Card CardBus Controller with UltraMedia
- AC55 PCCard CardBus Controller (PCI1520)
- AC56 PCCard CardBus Controller (PCI1510)
- AC57 PCCard CardBus Controller (PCI1530)
- AC58 PCCard CardBus Controller (PCI1515)
- AC59 PCI1621 PC Card CardBus Controller with UltraMedia
- AC5A PCI1610 PC Card CardBus Controller with UltraMedia
- AC60 PCI2040 PCI to DSP Bridge Controller
- AC8D PCI7620
- AC8E CardBus Controller (PCI7420)
- AC8F PCI7420/PCI7620 Dual Socket CardBus and Smart Card Cont. w/ 1394a-2000 OHCI Two-Port PHY/Link-Layer Cont. and SD/MS-Pro Sockets
- B000 Device ID: 0xB001 (TMS320C645x)
- B001 DSP with a C64x+ core and M/S PCI interface (TMS320DM647-DM648)
- FE00 FireWire Host Controller (tsb12lv26)
- FE03 FireWire Host Controller (12C01A)
-104D Sony Corporation
- 8004 DTL-H2500 [Playstation development board]
- 8009 i.LINK FireWire PCI Host Controller (CXD1947)
- 8039 OHCI i.LINK (IEEE 1394) PCI Host Ctrlr (CXD3222)
- 8056 Rockwell HCF 56K Modem (0x127a)
- 808A Memory Stick Controller (Qc pass)
-104E Oak Technology Inc
- 0017 OTI-64017
- 0107 Spitfire VGA Accelerator (OTI107)
- 0109 Video Adapter
- 0111 OTI-64111 Spitfire
- 0217 OTI-64217
- 0317 OTI-64317
- 0611 T9732 (OTI-610)
-104F Co-Time Computer Ltd.
- 104F Multi I/O (iatca8262)
-1050 Winbond Electronics Corp.
- 0000 Ethernet Controller (NE2000 compatible) (004005-34c8c8)
- 0001 PCI/IDE controller (W83769F)
- 0033 Winbond W89C33 mPCI 802.11 Wireless LAN Adapter (W89C33)
- 0105 Ethernet Adapter (W82C105)
- 0628 PCI to ISA Bridge Set (W83628F/629D)
- 0840 100/10Mbps Ethernet Controller (W89C840F)
- 0940 W89C940 NE2000-Compatible Ethernet Adapter
- 1050 Video capture card mpeg-1 (W99200aF)
- 5A5A ELANC-PCI Twisted-pair Ether-LAN Ctrlr (W89C940F)
- 6692 W6692/A/CF ISDN S/T Controller
- 9921 MPEG1 capture card (W99200AF)
- 9922 W99200F/W9922PF MPEG1/2 Video Encoder
- 9960 Video Codec (W9960CF)
- 9961 H.263/H.261 Video Codec (W9961CF)
- 9970 W9970CF Video Accelerator
- 9971 W9971CF (W9971CF)
-1051 Anigma Corp.
- 0100 Motorola MC145575
-1052 Young Micro Systems(??)
-1053 Young Micro systems(??)
-1054 Hitachi Ltd
- 0001 PCI Bridge
- 0002 PCI Bus Controller
- 0003 ?
- 3009 2Gbps Fibre Channel to PCI HBA 3009
- 300A 4Gbps Fibre Channel to PCI-X HBA 300a
- 300B 4Gbps Fibre Channel to PCI-X HBA 300b
- 300F ColdFusion 3 Chipset Processor to I/O Controller
- 3010 ColdFusion 3 Chipset Memory Controller Hub
- 3011 ColdFusion 3e Chipset Processor to I/O Controller
- 3012 ColdFusion 3e Chipset Memory Controller Hub
- 3017 Unassigned Hitachi Shared FC Device 3017
- 3505 SuperH (SH) 32-Bit RISC MCU/MPU Series (SH7751)
-1055 Standard Microsystems Corp (Was: EFAR Microsystems)
- 0810 EFAR 486 Host Bridge
- 0922 EFAR Pentium Host Bridge
- 0926 ISA Bridge (I dont know pentium 133 intel everex setpnot mx)
- 9130 SLC90E66 Victory66 UDMA66 EIDE Controller (??)
- 9460 Victory66 PCI to ISA Bridge (SLC90E66)
- 9461 SLC90E66 Victory66 UDMA66 EIDE Controller
- 9462 Victory66 USB Host Controller (SLC90E66)
- 9463 Victory66 Power Management Controller (SLC90E66)
- E420 PCI 10/100 Ethernet controller (LAN9420/LAN9420i)
-1056 ICL
-1057 Motorola
- 0001 PCI Bridge / Memory Controller (PCIB/MC) (MPC105)
- 0002 PCI Bridge/Memory Controller (PCIB/MC) (MPC106)
- 0003 Integrated Processor (MPC8240)
- 0004 PCI Bridge/Memory Controller for PPC (MPC107)
- 0006 Integrated Processor (MPC8245)
- 0008 MPC8540
- 0009 MPC8560
- 0100 MC145575 (HCF-PCI)
- 0431 100VG Ethernet Controller (KTI829c)
- 1801 24-bit Digital Signal Processor (DSP56301)
- 1802 24-Bit Digital Signal Processor (DSP56305)
- 18C0 PowerQUICC II PCI Bridge (MPC8265A/66)
- 18C1 MPC8271/MPC8272
- 3052 MotorolaSM56Modem_PCI device (0644dfea15)
- 3055 Motorola SM56 Data Fax Modem - amilo pi 1536 (SM56)
- 3057 Modem Device on High Definition Audio Bus (HDAUDIOFUNC_02om&VEN_1057&DEV_3057&SUBSYS_0001000)
- 3410 Digital Signal Processor (DSP56361)
- 3421 Modem (56IVMR/Phoenix 56ISM)
- 4801 PowerPC Chipset (Raven)
- 4802 memory control chipset (Falcon)
- 4803 Hawk
- 4806 CPX8216
- 4809 HotSwap Controller (CPX8216T)
- 4D68 20268
- 5600 SM 56 PCI Speakerphone/Data,Fax Modem (WDM MOT8888)
- 5602 Motorola SM56 PCI Modem
- 5608 PCI Fax Voice Modem (52-6116-2A 21-864-4 OR 62802-51 QZ0024 M5T90-000)
- 5803 32-Bit Embedded PowerPC Processor (MPC5200)
- 5806 MCF54 Coldfire
- 5808 MPC8220
- 5809 MPC5200B
- 6400 MPC190 Security Processor (S1 family, encryption)
- 6405 MPC184 Security Processor (S1 family)
-1058 Electronics Telecommunication Research Inc (ETRI)
-1059 Kontron Canada (Was: Teknor Microsystems)
-105A Promise Technology Inc
- 0D30 MBUltra100/MBFastTrack100 Lite (PDC20265/R)
- 0D38 FastTrak66 Lite EIDE Controller (PDC20263)
- 1275 PDC20275 MBUltra133 EIDE Controller
- 1960 SuperTrak 66/100 RAID
- 1962 SuperTrak SX 6000
- 3318 PDC20318(??) FastTrak SATA150 TX4 Controller
- 3319 PDC20319(??) FastTrak SATA150 TX4 Controller
- 3371 PDC20371(??) FastTrak SATA150 TX2plus Controller
- 3373 FastTrak 378/SATA 378 RAID Controller (PDC20378)
- 3375 PDC20375(??) FastTrak SATA150 TX2plus Controller
- 3376 PDC20376 FastTrak 376 SATA/RAID Controller
- 3515 FastTrak TX43xx (PDC40719)
- 3519 FastTrak TX42xx (PDC40519)
- 3570 FastTrak TX2300 SATA300 Controller (PDC20771)
- 3571 Fasttrack TX2200 (PDC20571)
- 3574 Promise SATAII150 579 (tm) IDE Controller
- 3577 PDC40779 SATA-300 779
- 3D17 SATA 300 TX4 Controller (PDC40718-GP)
- 3D18 Promise SATAII150 518 (tm) IDE Controller
- 3D73 SATAII 300 TX2+ (PDC40775)
- 3D75 PDC20575 SATAII150 TX2plus
- 3F19 FastTrak TX2650/4650/4652 (scsi)
- 3F20 FastTrak TX2650(3F21)/4650(3F22)/PDC42819(3716) (PDC42819)
- 4302 SuperTrak EX Series (tm) Controller
- 4D30 FastTrack100 on Intel MB SE7500CW2 (PDC20267)
- 4D33 FastTrak/Ultra33 ATA RAID controller (PDC20246)
- 4D38 PDC20262 FastTrak66 EIDE Controller
- 4D68 Ultra100TX2/FastTrak100TX/LP (PDC20268/R)
- 4D69 PDC20269 Ultra133 TX2 EIDE Controller
- 5275 PDC20276 Ultra133 TX2/FastTrak TX Lite EIDE Controller
- 5300 EIDE Controller (DC5300)
- 6268 PDC20268R FastTrak100 TX2/TX4/LP EIDE Controller
- 6269 FastTrak TX2000 EIDE controller (PDC20271)
- 6300 FastTrak SX 8300
- 6301 FastTrak SX8300-1
- 6302 FastTrak SX 4300
- 6303 FastTrak SX 4300-1
- 6304 FastTrak SX8300-2
- 6305 FastTrak SX8300-3
- 6306 FastTrak SX 4300-2
- 6307 FastTrak SX 4300-3
- 6621 PDC20621 (FastTrak S150 SX4/FastTrak SX4000 lite)
- 6622 PDC20621 [SATA150 SX4] 4 Channel IDE RAID Controller
- 6624 PDC20621 [FastTrak SX4100]
- 6626 PDC20618 (Ultra 618)
- 6629 FastTrak TX4000 Controller
- 7250 Vitesse 7250 SAS RAID
- 7275 PDC20277 FastTrak TX/SBFastTrak133 Lite EIDE Controller
- 8000 SATAII150 SX8
- 8002 SATAII150 SX8
- 8004 SATAII150 SX8
- 8006 SATAII150 SX8
- 8350 SuperTrak EX Series (tm) Controller
- 8650 SuperTrak EX SAS RAID
- C350 SuperTrak EX Series (tm) Controller
- E350 SuperTrak EX 243X0
-105B Foxconn International Inc
-105C Wipro Infotech Limited
-105D Number Nine Visual Technology
- 2309 GUI Accelerator (Imagine 128)
- 2339 Imagine 128 Series 2 (I128s2)
- 493D Revolution 3D (T2R)
- 5348 Revolution IV (Revolution IV)
-105E Vtech Engineering Canada Ltd
-105F Infotronic America Inc
-1060 United Microelectronics (UMC)
- 0001 UM82C881 486 PCI Chipset
- 0002 UM82C886 PCI to ISA Bridge
- 0101 UM8673F PCI Enhanced IDE Controller
- 0881 HB4 486 PCI Chipset (UM8881)
- 0886 UM8886 PCI to ISA Bridge
- 0891 Pentium CPU to PCI bridge (UM82C891)
- 1001 IDE Cntrlr (dual function) (UM886A)
- 673A UM8886 Enhanced IDE Controller
- 673B EIDE Master/DMA
- 8710 UM8710 GUI Accelerator
- 8821 CPU to PCI Bridge
- 8822 PCI to ISA Bridge
- 8851 Pentium CPU to PCI Bridge
- 8852 Pentium CPU to ISA Bridge
- 886A UM8886 PCI to ISA Bridge with EIDE
- 8881 HB4 486 PCI Chipset (UM8881F)
- 8886 ISA Bridge (w/o IDE support) (UM8886)
- 888A UM8886A
- 8891 UM8891 586 PCI Chipset
- 9017 Ethernet (UM9017F)
- 9018 Ethernet (UM9018)
- 9026 Fast Ethernet (UM9026)
- E881 UM8881 486 Chipset (Notebook)
- E886 UM8886 PCI to ISA Bridge with EIDE (Notebook)
- E88A PCI / ISA Bridge (UM8886N)
- E891 UM8891 Pentium Chipset (Notebook)
-1061 I.T.T. (X Tech)
- 0001 ITT AGX013/16 GUI Accelerator
- 0002 ITT 3204/3501 MPEG Decoder
-1062 Maspar Computer Corp
-1063 Ocean Office Automation
-1064 Alcatel CIT
-1065 Texas Microsystems
- 8139 Realtek 8139C Network Card (nic)
-1066 Picopower Technology (A division of National)
- 0000 VL Bridge (PT80C826)
- 0001 Vesuvius V1-LS System Controller (PT86C521)
- 0002 PT86C523 Vesuvius V3-LS PCI to ISA Bridge
- 0003 PT80C524 PCI to PCI Bridge [Nile]
- 0004 PT80C525 PCI to PCI Bridge [Nile-II]
- 0005 National PC87550 System Controller
- 8002 PT86C523 Vesuvius V3-LS ISA Bridge
-1067 Mitsubishi Electronics
- 0301 AccelGraphics AccelECLIPSE
- 0304 AccelGALAXY A2100 [OEM Evans & Sutherland]
- 0308 Tornado 3000 [OEM Evans & Sutherland]
- 1002 VG500 [VolumePro Volume Rendering Accelerator]
-1068 Diversified Technology
-1069 Mylex Corp
- 0001 DAC960P Wide-SCSI RAID Controller
- 0002 DAC960PD RAID Controller
- 0010 DAC960PG/PJ/PR/PT/PTL1/PRL RAID Controller
- 0020 DAC960LA
- 0050 AcceleRAID Disk Array
- B166 AcceleRAID 600/500/400/Sapphire Support Device
- BA55 eXtremeRAID support Device
- BA56 eXtremeRAID Disk Array
- BA57 eXtremeRAID 4000/5000 support Device
-106A Aten Research Inc
-106B Apple Computer Inc
- 0001 PowerPC Host-PCI Bridge (Bandit)
- 0002 I/O Controller (Grand Central)
- 0003 Control Video
- 0004 Video-in (PlanB)
- 0007 I/O Controller (OHare)
- 0009 BCM5703X (BCM5703X)
- 000C DOS on Mac
- 000E Mac I/O Controller (Hydra)
- 0010 Mac I/O Controller (Heathrow)
- 0017 Mac I/O Controller (Paddington)
- 0018 FireWire Controller (UniNorth)
- 0019 KeyLargo USB
- 001E UniNorth Internal PCI
- 001F Host-PCI bridge (UniNorth)
- 0020 AGP interface (UniNorth)
- 0021 UniNorth GMAC
- 0022 Keylargo Mac I/O Controller
- 0024 GMAC Ethernet Controller
- 0025 Pangea I/O Controller
- 0026 USB Interface (Pangea)
- 0027 AGP interface (Pangea)
- 0028 Pangea CPU to PCI Bridge
- 0029 Pangea CPU to PCI Bridge
- 002D AGP Bridge (UniNorth 1.5)
- 002E PCI Bridge (UniNorth 1.5)
- 002F Internal PCI (UniNorth 1.5)
- 0030 FireWire Controller (UniNorth/Pangea)
- 0031 UniNorth 2 FireWire
- 0032 UniNorth 2 GMAC (Sun GEM)
- 0033 UniNorth 2 ATA/100
- 0034 UniNorth 2 AGP
- 0035 UniNorth 2 PCI
- 0036 UniNorth 2 Internal PCI
- 003B Integrated ATA Controller (Intrepid)
- 003E KeyLargo/Intrepid Mac I/O
- 003F KeyLargo/Intrepid USB
- 0040 K2 KeyLargo USB
- 0041 K2 KeyLargo Mac/IO
- 0042 K2 FireWire
- 0043 K2 ATA/100
- 0045 K2 HT-PCI Bridge
- 0046 K2 HT-PCI Bridge
- 0047 K2 HT-PCI Bridge
- 0048 K2 HT-PCI Bridge
- 0049 K2 HT-PCI Bridge
- 004B U3 AGP
- 004C K2 GMAC (Sun GEM)
- 004F Mac I/O controler (Shasta)
- 0050 IDE controler (Shasta)
- 0051 Sungem ethernet controler (Shasta)
- 0052 Firewire controler (Shasta)
- 0053 PCI Bridge (Shasta)
- 0054 PCI Bridge (Shasta)
- 0055 PCI Bridge (Shasta)
- 0058 AGP Bridge (U3L)
- 0059 U3H AGP Bridge
- 0066 Intrepid2 AGP Bridge
- 0067 Intrepid2 PCI Bridge
- 0068 Intrepid2 PCI Bridge
- 0069 Intrepid2 ATA/100
- 006A Intrepid2 Firewire
- 006B Intrepid2 GMAC (Sun GEM)
- 008A Mac Pro RAID Card (Apple RAID Controller)
- 1645 Tigon3 Gigabit Ethernet NIC (BCM5701)
-106C Hyundai Electronics America
- 8801 Dual Pentium ISA/PCI Motherboard
- 8802 PowerPC ISA/PCI Motherboard (P54C Tr8)
- 8803 Dual Window Graphics Accelerator
- 8804 PCI LAN Controller (ht019a)
- 8805 100-BaseT LAN Controller
-106D Sequent Computer Systems
-106E DFI Inc.
- 4362 Yukon PCI-E Gigabit Ethernet Controller (copper) (88E8053)
-106F City Gate Development Ltd
-1070 Daewoo Telecom Ltd
-1071 Mitac
- 8160 8060B Mobile Platform
-1072 GIT Co Ltd
-1073 Yamaha Corporation
- 0001 3D GUI Accelerator
- 0002 RPA3 3D-Graphics Controller (YGV615)
- 0003 YMF740 PCI Audio Controller
- 0004 PCI Audio Controller (YMF754B)
- 0005 DS1 Audio (DS1)
- 0006 DS1 Audio (DS1)
- 0008 DS1 Audio (DS1)
- 000A DS-1L PCI Audio Controller (YMF740)
- 000C DS-1L PCI audio controller (YMF740C)
- 000D Yamaha Onboard Sound System (YMF724F)
- 0010 DS-1 PCI audio controller (YMF744B-V)
- 0012 DS-1E PCI Audio Controller (YMF754B)
- 0020 DS-1 Audio
- 1000 Sound system (SW1000XG)
- 2000 Digital Mixing Card (DS2416)
-1074 Nexgen Microsystems
- 4E78 Nx586 Chipset (82C500/1)
-1075 Advanced Integration Research
-1076 Chaintech Computer Co Ltd
-1077 QLogic Corporation
- 1016 Single Channel Ultra3 SCSI Processor (ISP10160)
- 1020 QLA1020/104x Fast-Wide-SCSI "Fast!SCSI IQ" Host Adapter
- 1022 ISP1022A Fast-Wide-SCSI Host Adapter
- 1080 QLA1080 LVD SCSI Host Adapter
- 1216 Dual Channel Ultra3 SCSI Processor (ISP12160)
- 1240 QLA12xx 60-Bit Dual Chanel SCSI Host Adapter
- 1280 SCSI Host Adapter (ISP1280)
- 2020 Fast!SCSI Basic Adapter (ISP2020A)
- 2100 QLA2100 SANblade 2100 64bit FC-AL Adapter
- 2200 QLA2200 SANblade 2200 PCI FC-AL Adapter
- 2300 QLA2300 SANblade 2300 64-bit FC-AL Adapter
- 2312 QLA2312 SANblade 2300 64-bit FC-AL Adapter
- 2322 QLA2322 Fibre Channel Adapter
- 2422 QLogic PCI to Fibre Channel Host Adapter for QLA2460 (ISP2422)
- 2432 Dual Channel 4G PCIe Fibre Channel Adapter (ISP2432)
- 2532 8Gb PCIe x8 Single/Dual Fibre Channel HBA (ISP2532)
- 3010 QLA3010 Network Adapter
- 3022 QLA3022 Network Adapter
- 4000 QLA4000 SANblade 4000 iSCSI Adapter
- 4010 QLA4010 SANblade 4000 iSCSI Adapter
- 4022 QLA4022 iSCSI TOE Adapter
- 5432 QLogic Fibre Channel Adapter
- 6312 QLA6312 Fibre Channel Adapter
- 6322 QLA6322 Fibre Channel Adapter
- 6422 4-Gbps Fibre Channel to PCI-X 2.0 266MHz controller for Embedded Applications (EP2422)
- 6432 4-Gbps Fibre Channel to PCIe controller for Embedded Applications (EP2432)
-1078 Cyrix Corp (Now owned by VIA)
- 0000 Cx5520 ISA Bridge Rev.0
- 0001 Cyrix Integrated CPU (MediaGXm)
- 0002 Cx5520 ISA Bridge Rev.1
- 0100 5530 Kahula/Geode Legacy ISA Bridge
- 0101 SMI status and ACPI timer (Cx5530)
- 0102 5530 Kahula/Geode IDE Controller
- 0103 5530 Kahula/Geode Audio
- 0104 Video Controller (Cx5530)
- 0400 CPU to PCI Bridge (ZFMicro)
- 0401 Power Management Controller (ZFMicro)
- 0402 IDE Controller (ZFMicro)
- 0403 Expansion Bus (ZFMicro)
-1079 I-Bus
- 0D01 ?
-107A Networth
-107B Gateway 2000
-107C LG Electronics / Goldstar Co Ltd
-107D Leadtek Research
- 0000 S3-805/P86C850 GUI Accelerator
- 204D Winfast PX7800 GTX TDH [GeForce 7800 GTX]
- 2134 WinFast 3D S320 II
- 2971 WinFast A350 TDH MyViVo [GeForce FX 5900]
-107E Interphase Corp
- 0001 FRED Local Bus I/F to PCI Peripheral (FLIPPER)
- 0002 100 VG amylan Controller
- 0004 5526 Fibre Channel Host Adapter
- 0005 Fibre Channel Host Adapter (x526)
- 0008 (i)chipSAR+ 155 MBit ATM controller
- 9003 5535-4P-BRI-ST
- 9007 5535-4P-BRI-U
- 9008 5535-1P-SR
- 900C 5535-1P-SR-ST
- 900E 5535-1P-SR-U
- 9011 5535-1P-PRI
- 9013 5535-2P-PRI
- 9023 5536-4P-BRI-ST
- 9027 5536-4P-BRI-U
- 9031 5536-1P-PRI
- 9033 Adapter (5536-2P-PRI)
- 9060 6535 CompactPCI T1/E1/J1 Communications Controller
- 9070 4538 PMC T1/E1/J1 Communications Controller
- 9080 4532-002/005 PMC ATM Over OC-3/STM-1 Communications Controller
- 9081 4532-001/004 PMC ATM Over OC-3/STM-1 Communications Controller
- 9082 PMC ATM Over OC-3/STM-1 Comm Controller (4532-000/003)
- 9090 4531S-000/001 PMC ATM Over T3/E3 Communications Controller
- 90A0 4539 PMC Quad T1/E1/J1 Communications Controller
-107F Data Technology Corporation
- 0802 pinacale capture card (mb87j3560)
- 0803 EIDE Bus Master Controller
- 0806 EIDE Controller
- 1138 High Speed Parallel Port
- 2015 EIDE Controller
-1080 Cypress Semiconductor
- 0600 CPU to PCI & PCI to ISA Bridge (82C596/9)
- C691 AN2131QC 0230 (Cypress CY7c68001)
- C693 PCI to ISA Bridge (82C693)
-1081 Supermac Technology Inc
- 0D47 Radius PCI to NuBUS Bridge (2330)
-1082 EFA Corp Of America
-1083 Forex Computer Corporation
- 0001 PCI Enhanced IDE Adapter (FR710)
- 0613 Host Bridge (??)
-1084 Parador
-1085 Tulip Computers Int'l BV
- 0001 Datalaster Interface for OBD automotive (UsbDgn)
-1086 J. Bond Computer Systems
-1087 Cache Computer
- 9200 ?
-1088 Microcomputer Systems (M) Son
-1089 Data General Corp
-108A SBS Technologie (Was: Bit3 Computer)
- 0001 PCI-VME Bus Adapter (Model 617)
- 0003 not sure (not sure)
- 0010 VME Bridge (Model 618)
- 0040 dataBLIZZARD
- 3000 VME Bridge (Model 2106)
-108C Oakleigh Systems Inc
-108D Olicom
- 0001 Token-Ring 16/4 PCI Adapter (OC-3136/37)
- 0002 Fastload 16/4 PCI/III Token Ring Adapter (OC-3139f)
- 0004 OC-3139/3140 RapidFire Token-Ring 16/4 Adapter
- 0005 GoCard Token Ring 16/4 Adapter (OC-3250)
- 0006 RapidFire Token Ring 100 Adapter (OC-3530)
- 0007 RapidFire Token Ring 16/4 Adapter (OC-3141)
- 0008 RapidFire HSTR 100/16/4 Adapter (OC-3540)
- 000A RapidFire Token-Ring 16/4 PCI Adapter (OC-3150)
- 0011 Ethernet Controller (OC-2805)
- 0012 Ethernet PCI/II 10/100 Controller (OC-2325)
- 0013 OC-2183/2185 PCI/II Ethernet Controller
- 0014 Ethernet PCI/II 10/100 Controller (OC-2326)
- 0019 10/100 Ethernet Controller (OC-2327/50)
- 0021 155 Mbit ATM Adapter (OC-6151/52)
- 0022 ATM Adapter
-108E Sun Microsystems
- 0001 SPARC EBUS
- 1000 SPARC EBUS PCIO PCI I/O Controller
- 1001 Happy Meal Ethernet (PCIO)
- 1100 RIO EBUS
- 1101 RIO GEM
- 1102 RIO 1394
- 1103 RIO USB
- 1648 [bge] Gigabit Ethernet
- 2BAD Sun Gigabit Ethernet Card (GEM)
- 5000 UltraSPARC-IIi Advanced PCI Bridge (SME2411)
- 5043 Co-processor (SunPCI)
- 7063 PCI card with Intel or AMD processor (SunPCi)
- 8000 STP2223BGA UPA to PCI Bus Interface Module (U2P)
- 8001 PCI Bus Module (Schizo)
- 8002 Schizo+ PCI Bus Module
- A000 Sabre (UltraSPARC IIi)
- A001 Hummingbird (UltraSPARC IIe)
- A801 Tomatillo PCI Bus Module
- ABBA 10/100/1000 Ethernet adapter (CE (Cassini Ethernet))
-108F Systemsoft Corp
-1090 Encore Computer Corp
-1091 Intergraph Corporation
- 0020 3D Graphics Processor
- 0021 3D Graphics Processor w/Texturing
- 0040 3D Graphics Frame Buffer
- 0041 3D Graphics Frame Buffer
- 0060 Proprietary Bus Bridge
- 00E4 Powerstorm 4D50T
- 0720 Motion JPEG Codec
- 07A0 Sun Expert3D-Lite Graphics Accelerator
- 1091 Sun Expert3D Graphics Accelerator
-1092 Diamond Multimedia Systems
- 00A0 GUI Accelerator (SpeedStar Pro SE)
- 00A8 GUI Accelerator (SpeedStar 64)
- 0550 Viper V550
- 08D4 WinModem (Supra 2260)
- 094C SupraExpress 56i Pro (SupraExpress 56i Pro)
- 09C8 SupraExpress 56i Pro VCC (SUP2761)
- 1002 RS56-pci (R6793-12)
- 1092 2710a (Viper V330)
- 6120 DVD (Maximum)
- 8810 GUI Accelerator (Stealth SE)
- 8811 GUI Accelerator (Stealth 64/SE)
- 8880 Stealth Video GUI Accelerator
- 8881 GUI Accelerator (Stealth Video)
- 88B0 GUI Accelerator (Stealth 64 Video)
- 88B1 GUI Accelerator (Stealth 64 Video)
- 88C0 GUI Accelerator (Stealth 64)
- 88C1 GUI Accelerator (Stealth 64)
- 88D0 GUI Accelerator (Stealth 64)
- 88D1 GUI Accelerator (Stealth 64)
- 88F0 GUI Accelerator (Stealth 64 Video)
- 88F1 GUI Accelerator (Stealth 64 Video)
- 9876 Supra Express 56i Pro CW *2
- 9999 Diamand Technology DT0398 (Monster Sound)
-1093 National Instruments
- 0160 data adquisition input and output (PCI-DIO-96)
- 0161 Multifunction data acquisition board (PCI-1200)
- 0162 24MIO 6-03-2 (PCI-MIO-16XE-50)
- 1150 High Speed Digital I/O Board (PCI-DIO-32HS)
- 1170 PCI-MIO-16XE-10
- 1180 PCI-MIO-16E-1
- 1190 PCI-MIO-16E-4
- 11B0 PXI-6070E
- 11C0 PXI-6040E
- 11D0 PXI-6030E
- 11E0 PXI-6011E
- 1270 Multifunction Data Acquisition Card (PCI-6032E)
- 12B0 High Speed DIO (PCI-6534)
- 1310 Data Acquisition Device (PCI-6602)
- 1320 PXI-6533
- 1330 PCI-6031E
- 1340 Multifunction Data Acquisition Card (PCI-6033E)
- 1350 NI PCI-6071E Multifunction I/O & NI-DAQ (PCI-6071E)
- 1360 PXI-6602
- 14E0 PCI-6110
- 14F0 PCI-6111
- 17D0 PCI-6503
- 1870 PCI-6713
- 1880 PCI-6711
- 18B0 PCI-6052E
- 2410 PCI-6733
- 2890 PCI-6036E
- 28B0 I/O Terminal NI-DAQ (Legacy) and NI-DAQmx (NI 6014)
- 2A60 PCI-6023E
- 2A70 Multifunction Data Acquisition Card (PCI-6024E)
- 2A80 Multifunction Data Acquisition Card (PCI-6025E)
- 2B20 PCI-6527
- 2C80 PCI-6035E
- 2CA0 PCI-6034E Multifunction DAQ
- 70A9 PCI-6528 Digital I/O at 60V
- 70AF 16-Bit, 250 kS/s, 16 Analog Inputs (PCI-6221)
- 70B8 PCI-6251 M Series High Speed Multifunction DAQ
- 710E GPIB Controller Interface Board (PCIe-GPIB)
- 715D IMAQ-PCI-1426
- 71BC 16-Bit, 250 kS/s, 16 Analog Inputs (DSUB37) (PCI-6221 )
- B001 IMAQ-PCI-1408
- B011 IMAQ-PXI-1408
- B021 IMAQ-PCI-1424
- B031 IMAQ-PCI-1413
- B041 1pcs (IMAQ-PCI-1407)
- B051 IMAQ-PXI-1407
- B061 IMAQ-PCI-1411
- B071 IMAQ-PCI-1422
- B081 IMAQ-PXI-1422
- B091 bluethooth (IMAQ-PXI-1411)
- C801 GPIB Controller Interface Board (PCI-GPIB)
- C811 PCI-GPIB+
- C821 PXI-GPIB
- C831 PMC-GPIB
- C840 PCI-GPIB
- D130 2-port RS-232 Serial Interface Board (PCI-232/2)
-1094 First International Computers
-1095 Silicon Image Inc (Was: CMD Technology Inc)
- 0240 SATA/Raid controller(2XSATA150) (SIL3112)
- 0242 SATAII/Raid controller (SIL3132)
- 0244 eSATA/Raid controller (SIL3132)
- 0640 PCI-0640 EIDE Adapter (Single FIFO)
- 0641 PCI EIDE Adapter with RAID 1 (PCI0640)
- 0642 PCI-0642 EIDE Adapter with RAID 1
- 0643 PCI EIDE controller (PCI0643)
- 0646 PCI-0646 EIDE Adapter (Single FIFO)
- 0647 9738 (PCI0647)
- 0648 Bus Master Ultra DMA PCI-IDE/ATA Chip (PCI-648)
- 0649 PATA100 ATAPI/RAID Controller (PCI-649)
- 0650 PBC-0650A PCI Fast SCSI II Host Adapter
- 0670 USB0670 USB Controller
- 0673 USB0673 USB Controller
- 0680 SiI 0680 (Was: PCI-0680) Ultra ATA133 EIDE Controller
- 1392 High Definition Audio HDMI output (1390/1392)
- 2455 SATALink 4-Port PCI-X Host Controller (SI3124)
- 3112 SATA/Raid controller(2XSATA150) (SIL3112)
- 3114 SATALink/SATARaid Controller (Sil 3114)
- 3124 PCI-X to Serial ATA Controller (SiI 3124)
- 3132 PCI Express (1x) to 2 Port SATA300 (SiI 3132)
- 3512 SATALink/SATARaid Controller (Sil 3512)
- 3531 SiI 3531 SATA Controller
-1096 Alacron
- 1106 0x47204005&RE (0x3059)
- 3059 South Bridge (VT8235)
-1097 Appian Technology (ETMA)
- 0038 EIDE Controller (Single FIFO)
-1098 Quantum Designs H.K. Ltd
- 0001 EIDE Controller (QD8500)
- 0002 EIDE Controller (QD8580)
-1099 Samsung Electronics Co Ltd
-109A Packard Bell
- 8280 4 channel video digitizer card (0x036e)
-109B Gemlight Computer Ltd
-109C Megachips Corp
-109D Zida Technologies Ltd
-109E Conexant (Was: Brooktree Corp)
- 0350 Bt848AKPF video decoder (BT848KPF)
- 0351 tw card B t878 khf (B t878 khf)
- 0369 Video Capture (Bt878fusion 878a)
- 036C Bt879(??) Video Capture
- 036E Bt878/Fusion 878A Mediastream Controller
- 036F Video Capturee (Bt878)
- 0370 Video Capture (10 bit High qualtiy cap) (Bt880B)
- 0878 TV Video Capture: Hauppauge WinTV GO (SUBSYS_13EB0070&REV_11)
- 0879 Video Capture (Audio Section) (Bt879khf)
- 0880 Video Capture (Audio Section) (Bt880)
- 109E Multimedia Video Controller (Brooktree Corp BT848 SVR-2000 V1.02)
- 2115 BtV Mediastream Controller 9x (BtV 2115)
- 2125 BtV Mediastream Controller (BtV 2125)
- 2164 Display Adapter (BtV 2164)
- 2165 MediaStream Controller (BtV 2165)
- 8230 ATM Segment/Reassembly Controller (SRC) (BtV 8230)
- 8471 Bt8471 32 Channel HDLC Controller
- 8472 32/64-channel HDLC Controllers (Bt8471/72)
- 8474 128-channel HDLC Controller (Bt8474)
-109F Trigem Computer Inc.
- 036F Video Capturee (Bt878)
-10A0 Meidensha Corp
-10A1 Juko Electronics Inc Ltd
-10A2 Quantum Corp
-10A3 Everex Systems Inc
-10A4 Globe Manufacturing Sales
-10A5 Racal Interlan
-10A6 Informtech Industrial
-10A7 Benchmarq
-10A8 Sierra Semiconductor
- 0000 64-bit GUI Accelerator
-10A9 Silicon Graphics
- 0001 Crosstalk to PCI Bridge
- 0002 Linc I/O Controller
- 0003 IOC3 I/O Controller
- 0004 O2 MACE
- 0005 RAD Audio
- 0006 HPCEX
- 0007 RPCEX
- 0008 DiVO VIP
- 0009 Gigabit Ethernet (Alteon)
- 0010 Video I/O (AMP)
- 0011 GRIP
- 0012 SGH PSHAC GSN
- 1001 Magic Carpet
- 1002 Lithium
- 1003 Dual JPEG 1
- 1004 Dual JPEG 2
- 1005 Dual JPEG 3
- 1006 Dual JPEG 4
- 1007 Dual JPEG 5
- 1008 Cesium
- 2001 Fibre Channel
- 2002 ASDE
- 8001 O2 1394
- 8002 G-net NT
-10AA ACC Microelectronics
- 0000 ACC 2056/2188 CPU to PCI Bridge
- 2051 Laptop Chipset CPU Bridge
- 5842 Laptop Chipset ISA Bridge
-10AB Digicom
- 1005 USB Bluetooth (USBVID_0000&PID_00005&5657949&0&8)
-10AC Honeywell IAC
-10AD Winbond Systems Labs
- 0001 W83769F PCI EIDE Controller (Signle FIFO)
- 0003 SL82C103 EIDE Controller
- 0005 SL82C105 EIDE Busmaster Controller
- 0103 PCI-ide mode 4.5 Cntrlr (sl82c103)
- 0105 Sonata bus master PCI-IDE controller (W83789F)
- 0150 EIDE Controller
- 0565 PCI/ISA bridge (W83C553F)
-10AE Cornerstone Technology
- 0002 Graphics Controller
-10AF Microcomputer Systems
- 0001 IDE Controller
-10B0 CardExpert Technology
-10B1 Cabletron Systems Inc
-10B2 Raytheon Company
-10B3 Databook Inc
- 3106 DB87144 PCI to CardBus Bridge
- B106 SMC34C90 PCI to CardBus Bridge
-10B4 STB Systems
- 1B1D Velocity 128 3D
-10B5 PLX Technology Inc.
- 0324 ?
- 0364 PCI9080RDK-RC32364 PCI Reference Design Kit for PCI 9080
- 0401 PCI9080RDK-401B PCI Reference Design Kit for PCI 9080
- 0480 Integrated PowerPC I/O Processor (IOP 480)
- 0860 PCI9080RDK-860 PCI Reference Design Kit for PCI 9080
- 0960 PCI Reference Design Kit for PCI 9080 (PCI 9080RDK-960)
- 1030 ISDN card (Gazel R685)
- 1054 dual channel ISDN card (Gazel R697)
- 1076 VScom PCI-800S 8 x RS-232 Controller
- 1077 VScom PCI-400S 4 x RS-232 Controller
- 1078 Vision Systems VScom PCI-210 (PCI 9050)
- 1103 Vision Systems VScom PCI-200 (PCI 9050)
- 1146 Vision Systems VScom PCI-010S (PCI 9050)
- 1147 Vision Systems VScom PCI-020S (PCI 9050)
- 1151 ISDN card (Gazel R753)
- 1152 ISDN card (Gazel R753)
- 1860 PCI9054RDK-860 PCI Reference Design Kit for PCI 9054
- 2021 PCI9080 used in Daktronics VMax Quad Tansmitter Card
- 2288 Chrislin Industries Memory
- 2724 Thales PCSM Security Card
- 2748 TPCX Transientrecorder Card (9054)
- 3001 PCI9030RDK-LITE PCI Reference Design Kit for PCI 9030
- 30C1 cPCI9030RDK-LITE CompactPCI Reference Design Kit for PCI 9030
- 5406 PCI Reference Design Kit for PLX PCI 9054 (PCI RDK9054-LITE)
- 5601 32-bit; 66MHz PCI Bus Master I/O Accelerator, 17 x 17mm FPBGA (PCI 9056)
- 5602 PCI9056RDk-Lite PCI 9056 Rapid Development Kit
- 56C2 cPCI9056RDK-860 CompactPCI Rapid Design kit for PCI 9056
- 6140 PCI6140 32-bit 33MHz PCI-to-PCI Bridge
- 6150 PCI6150 32-bit 33MHz PCI-to-PCI Bridge
- 6152 PCI6152 32-bit 66MHz PCI-to-PCI Bridge
- 6154 PCI6154 64-bit 66MHz PCI-to-PCI Bridge
- 6254 PCI6254 64-bit 66MHz PCI-to-PCI Bridge
- 6466 GBP32 PCI Adaptive Switch Fabric Generator
- 6520 PCI6520 64-bit 133MHz PCI-X-to-PCI-X Bridge
- 6540 PCI6540 64-bit 133MHz PCI-X-to-PCI-X Bridge
- 6541 PCI6540/6466 PCI-PCI bridge (non-transparent mode, primary side)
- 6542 PCI6540/6466 PCI-PCI bridge (non-transparent mode, secondary side)
- 7709 PCI9080RDK-SH3 PCI Reference Design kit for PCI 9080
- 8111 1 Lane PCI Express to PCI bridge (PEX8111); 1 Lane PCI Express to Generic Local Bus bridge (PEX8311) (PEX 8111, PEX 8311)
- 8112 1 Lane PCI Express to PCI bridge (PEX8112)
- 8114 PEX 8114 PCI Express-to-PCI/PCI-X Bridge
- 8311 PEX8311 x1 Lane PCI Express-to-Generic Local Bus Bridge
- 8505 PEX 8505 5-lane, 5-port PCI Express Switch
- 8508 PEX 8508 8-lane, 5-port PCI Express Switch
- 8509 PEX 8509 8-lane, 8-port PCI Express Switch
- 8512 PEX 8512 12-lane, 5-port PCI Express Switch
- 8516 Versatile PCI Express Switch (PEX 8516)
- 8517 PEX 8517 16-lane, 5-port PCI Express Switch
- 8518 PEX 8518 16-lane, 5-port PCI Express Switch
- 8524 PEX 8524 24-lane, 6-port PCI Express Switch
- 8525 PEX 8525 24-lane, 5-port PCI Express Switch
- 8532 Versatile PCI Express Switch (PEX 8532)
- 8533 PEX 8533 32-lane, 6-port PCI Express Switch
- 8547 PEX 8547 48-lane, 3-port PCI Express Switch
- 8548 PEX 8548 48-lane, 9-port PCI Express Switch
- 8664 64-Lane, 16-Port PCI Express Gen 2 (5.0 GT/s) Switch, 35 x 35mm FCBGA (PEX 8664)
- 9030 PCI SMARTarget I/O Accelerator (PCI 9030)
- 9036 Interface chip - value 1k (PCI9036)
- 9050 Target PCI Interface Chip - value 1k (PCI 9050)
- 9052 PCI 9052 Target PLX PCI Interface Chip (PCI 9052)
- 9054 PCI I/O Accelerator (PCI 9054)
- 9056 32-bit, 66 MHz PCI Bus-Mastering I/O Accelerator for PowerQUICC and Generic 32-bit, 66 MHz Local Bus (PCI9056)
- 9060 PCI Bus Master Interface Chip (PCI9060)
- 906D PCI Bus Master Interface Chip (PCI 9060SD)
- 906E PCI Bus Master Interface Chip (PCI 9060ES)
- 9080 High performance PCI to Local Bus chip (PCI 9080)
- 9601 PCI9656RDK-Lite Rapid Development Kit for PCI 9656
- 9610 PCI9610 64 bit 66MHz PCI Master I/O Accelerator
- 9656 PCI9656 64 bit 66MHz PCI I/O Accelerator
- 96C2 cPCI 9656RDK-860 CompactPCI Rapid Development Kit
- A001 GTEK Jetport II 2 port serial adapter
- A100 Blackmagic DeckLink
- A106 Blackmagic DeckLink
- C001 GTEK/Cronyx Omega-PCI 8/16/32 port serial adapter
- C860 cPCI 9054RDK-860 CompactPCI Reference Design Kit for PCI 9054
-10B6 Madge Networks
- 0001 Ringnode (PCI1b) (Smart 16/4)
- 0002 Ringnode (PCIBM2/CardBus) (Smart 16/4)
- 0003 Smart 16/4 Ringnode (Knossos Series)
- 0004 Smart 16/4 Ringnode Mk1 (PCIBM1)
- 0006 16/4 CardBus Adapter (Eric 2)
- 0007 Presto PCI
- 0009 Smart 100/16/4 PCI-HS Ringnode
- 000A Smart 100/16/4 PCI Ringnode
- 000B 16/4 CardBus Adapter Mk2
- 1000 Collage 25 ATM Adapter
- 1001 ATM adapter (Ambassador)
- 1002 ATM Adapter (Ambassador)
-10B7 3COM Corp, Networking Division
- 0001 3C985 1000BaseSX Gigabit Ethernet Adapter
- 0013 3Com11a/b/g Wireless PCI Adapter (3com p/n: 3CRDAG675)
- 0910 3C910-A01
- 1000 3COM 3C905CX-TXNM with 40-0664-003 ASIC (3C905CX-TXNM)
- 1006 Broadcom Corporation NetXtreme BCM5701 Gigabit Ethernet (14e4:1645)
- 1007 V.90 Mini-PCI Modem (3C556)
- 1201 3c982-TXM 10/100baseTX Dual Port A [Hydra]
- 1202 3c982-TXM 10/100baseTX Dual Port B [Hydra]
- 1700 Gigabit Ethernet PCI CODEC (3C940)
- 1F1F AirConnect Wireless LAN PCI Card (3CRWE777A)
- 3390 Token Link Velocity (3C339)
- 3590 TokenLink Velocity XL Adapter (3C359)
- 4500 3c450 Cyclone/unknown
- 5055 Laptop Hurricane (3C555)
- 5057 Megahertz 10/100 LAN CardBus PC Card (3C575)
- 5157 Megahertz 10/100 LAN CardBus PC Card (3C575B)
- 5257 Cyclone Fast Ethernet CardBus PC Card (3CCFE575CT)
- 5900 Ethernet III Bus Fast PCI (3C590)
- 5920 PCI/EISA 10Mbps Demon/Vortex (3C592)
- 5950 3C595 PCI Ethernet Adapter 100bTX
- 5951 3C595 PCI Ethernet Adapter 100bT4
- 5952 3C595 PCI Ethernet Adapter 100b-MII
- 5970 3C597 PCI/EISA 10/100 Demon/Vortex
- 5B57 Megahertz 10/100 LAN CardBus (3C595)
- 6000 3CRSHPW796 [OfficeConnect Wireless CardBus]
- 6001 3CRWE154G72 [Office Connect Wireless LAN Adapter]
- 6055 10/100 Fast Ethernet MiniPCI Adapter (3C556)
- 6056 MiniPCI 10/100 Ethernet+Modem56k (see devid:1007) (3CN3AC1556B)
- 6560 3CCFE656 Cyclone Ethernet+56k Modem CardBus PC Card
- 6561 10/100 LAN+56K Modem CardBus PC Card (FEM656)
- 6562 3CCFEM656 [id 6562] Cyclone CardBus PC Card
- 6563 10/100 LAN+56K Modem CardBus PC Card (FEM656B)
- 6564 Cyclone CardBus PC Card (3CCFEM656)
- 6565 3CCFEM656C Global 10/100 Fast Ethernet+56K Modem CardBus PC Card
- 7646 Hurricane (3CSOHO100B-TX)
- 7770 AirConnect Wireless PCI
- 7940 3c803 FDDILink UTP Controller
- 7980 3c804 FDDILink SAS Controller
- 7990 3c805 FDDILink DAS Controller
- 80EB 3c940B 10/100/1000Base-T
- 8811 Token Ring Adapter
- 9000 Fast Etherlink PCI TPO NIC (3C900-TPO)
- 9001 Fast Etherlink XL PCI Combo NIC (3C900-COMBO)
- 9004 EtherLink XL TPO 10Mb (3C900-TPO)
- 9005 Fast Etherlink 10Mbps Combo NIC (3C900B-COMBO)
- 9006 EtherLink XL TPC (3C900B-TPC)
- 900A EtherLink PCI Fiber NIC (3C900B-FL)
- 9050 Fast Etherlink XL PCI 10/100 (3C905B - Combo)
- 9051 Fast Etherlink XL 10/100 (3C905-T4)
- 9054 3C905B-TX Fast Etherlink XL PCI
- 9055 Fast Etherlink 10/100 PCI TX NIC (3C905-TX)
- 9056 Fast EtherLink XL 10/100 (3C905B-T4)
- 9058 Deluxe EtherLink 10/100 PCI Combo NIC (3C905B-COMBO)
- 905A 3C905B-FX Fast Etherlink XL Fiber 10/100
- 9200 Fast EtherLink for PC Management NIC (3C905 CX-TXM)
- 9201 Integrated Fast Ethernet Controller (3C920B-EMB)
- 9202 3C920B-EMB-WNM Integrated Fast Ethernet Controller
- 9210 Integrated Fast Ethernet Controller (3C920B-EMB-WNM)
- 9300 3C910 Integrated Fast Ethernet Controller (3CSOHO100B-TX Compatible)
- 9800 Fast EtherLink XL Server Adapter2 (3C980-TX)
- 9805 3C980-TX 10/100baseTX NIC [Python-T]
- 9900 3C990-TX [Typhoon]
- 9902 EtherLink 10/100 PCI with 3XP Processor (3CR990-TX-95)
- 9903 EtherLink 10/100 PCI with 3XP Processor (3CR990-TX-97)
- 9904 3CR990B-TM-X Etherlink 10/100 with 3XP Processor
- 9905 100FX PCI Server NIC w/3XP (3C990B-FX)
- 9908 3CR990SVR95 Etherlink 10/100 Server with 3XP Processor
- 9909 3CR990SVR97 Etherlink 10/100 Server with 3XP Processor
- 990A EC990BSVR Etherlink 10/100 Server with 3XP Processor
- 990B 3C990SVR [Typhoon Server]
- D004 EtherLink XL PCI (3C900B-TPO)
-10B8 Standard Microsystems Corp (SMC,SMSC)
- 0005 EPIC/XF 10/100 Mbps Fast Ethernet Ctrlr (LAN83C170QF/171)
- 0006 EPIC/C Ethernet CardBus Integrated Ctrlr (LAN83C175)
- 1000 FDC (37C665)
- 1001 FDC (37C922)
- A011 Fast ethernet controller (83C170QF)
- B106 CardBus Controller (SMC34C90)
-10B9 Acer Labs Incorporated (ALi/ULi)
- 0101 PCI Audio Device (OEM) (CMI8338/C3DX)
- 0102 PCI Audio Device (OEM) (CMI8338/C3DX)
- 0111 C-Media Audio Device (OEM) (CMI8738/C3DX)
- 0780 Multi-IO Card
- 0782 Multi-IO Card
- 10B9 0402t505 CK46828100B (ALI M5273 A1)
- 1435 ALI M1435 VL to PCI Bridge
- 1445 ALI M1445 VL to PCI Bridge & Enhanced IDE Adapter
- 1449 ALI M1449 PCI to ISA Bridge
- 1451 Pentium CPU to PCI Bridge (M1451)
- 1461 ALI M1461 Pentium PCI Chipset
- 1489 ALI M1489 486 PCI Chipset
- 1511 Aladdin 2 Host Bridge (M1511)
- 1512 ALI M1512 Aladdin
- 1513 Aladdin 2 South Bridge (M1513)
- 1521 ALI M1521 Aladdin III CPU to PCI Bridge
- 1523 ALI M1523 ISA Bridge
- 1531 ALI M1531 Aladdin IV/IV+ CPU to PCI Bridge
- 1533 ALI M1533 Aladdin IV ISA Bridge
- 1535 ALI M1535x ISA Bridge
- 1541 ALI M1541 Aladdin V/V+ AGP System Controller
- 1543 Aladdin V chipset South Bridge (M1543 a1)
- 1561 North Bridge (M1561)
- 1563 ALI M1563 South Bridge with Hypertransport Support
- 1567 ALI M1567 South Bridge with Hypertransport Support
- 1573 ALI M1573 South Bridge with Hypertransport Support
- 1575 ALI M1575 South Bridge with Hypertransport Support
- 1621 ALI M1621 Aladdin Pro II AGP System Controller
- 1631 ALI M1631 Aladdin Pro III AGP System Controller
- 1632 ALI M1632 Aladdin i1 CyberBlade AGP System Controller
- 1641 ALI M1641 Aladdin Pro IV AGP System Controller
- 1644 ALI M1644 AGP System Controller
- 1646 ALI M1646 AGP System Controller
- 1647 ALI M1647 ALiMAGiK 1 AGP System Controller
- 1651 ALI M1651 Aladdin Pro V AGP System Controller
- 1661 ALI M1661 AGP System Controller
- 1667 ALI M1667 AGP System Controller
- 1671 ALI M1671 AGP System Controller
- 1672 ALI M1672 AGP System Controller
- 1681 P4 Nouth Bridge with HyperTransport (M1681)
- 1687 ALI M1687 K8 Northbridge with hypertransport
- 1689 ULi M1689 K8 Northbridge with AGP and hypertransport
- 1691 ALi M1691 Pentium 4/Pentium M Northbridge
- 1695 ULi M1695 K8 Northbridge with PCIe and hypertransport
- 3141 ALI M3141 GUI Accelerator 2Mb
- 3143 ALI M3143 GUI Accelerator 2Mb + DAC
- 3145 ALI M3145 GUI Accelerator 2Mb
- 3147 ALI M3147 GUI Accelerator 2Mb + DAC
- 3149 ALI M3149 GUI Accelerator 4Mb
- 3151 ALI M3151 GUI Accelerator 8Mb
- 3307 ALI M3307 MPEG-1 Decoder
- 3309 ALI M3309 MPEG Decoder
- 5212 ALI M4803
- 5215 ALI MS4803 PCI Enhanced IDE Controller
- 5217 ALI M5217 I/O Controller
- 5219 Ali M5219 PCI BUS MASTER IDE Controller
- 5225 ALI M5225 EIDE Controller
- 5228 M5228 PATA/RAID Controller (M1563)
- 5229 EIDE Controller (M5229 Southbridge)
- 5235 ALI M5235 I/O Controller
- 5236 EHCI USB 2.0 (M5273)
- 5237 OpenHCI 1.1 USB to 2.0 (M5273 A1 for windows 98)
- 5239 USB EHCI2.0 Controller (527210B9)
- 5240 EIDE Controller
- 5241 PCMCIA Bridge
- 5242 General Purpose Controller
- 5243 ALI M1541 PCI to AGP Bridge
- 5244 Floppy Disk Controller
- 5246 ULi AGP 3.0 Controller
- 5247 ALI M1621 PCI to AGP Bridge
- 5249 HyperTransport to PCI Bridge (M5249)
- 524B ALi PCIe Bridge
- 524C ALi PCIe Bridge
- 5251 IEEE P1394 OpenHCI 1.0 Controller (M5251)
- 5253 IEEE P1394 OpenHCI 1.0 Controller (M5253)
- 5261 ALI M5261 Fast Ethernet Controller
- 5263 ULi PCI Fast Ethernet Controller (Albatron K8ULTRA-U Pro)
- 5281 ALI M5281/5283 SATA/RAID Controller (M1565/1566)
- 5287 SATA/Raid controller (ULI M1573)
- 5288 M5288 SATA/Raid controller (ULI M1575/M1697 )
- 5289 M5289 SATA/Raid controller (ULI M1567/M1689 )
- 5427 ALI PCI to AGP Bridge
- 5450 Agere Systems AC'97 Modem
- 5451 ALI M5451 PCI AC-Link Controller Audio Device
- 5453 ALI M5453 PCI AC-Link Controller Modem Device
- 5455 AC'97 Audio Controller (M1563M Southbridge)
- 5457 AC97 Modem controller (M1563M)
- 5459 56k Voice Modem
- 545A 56K Voice Modem
- 5461 High Definition Audio Controller (M5461)
- 5471 Memory Stick Host (M1563M Southbridge)
- 5473 MMC/SD controller (M1563M Southbridge)
- 7101 ALI M7101 Power Management Controller
- 7471 Memory Stick Host (M1563M Southbridge)
- 9876 xhcth700000b (mdv92xp)
-10BA Mitsubishi Electronics Corp.
- 0301 GUI Accelerator
- 0304 AccelGALAXY A2100
-10BB Dapha Electronics Corp
-10BC Advanced Logic Research Inc
-10BD Surecom Technology
- 0803 Ethernet PCI Adapter ( MYSON Technology Inc SURECOM EP-320X-S 100/10M Et)
- 0E34 Ethernet Adapter (NE2000 PCI clone) (NE34)
- 5240 IDE Cntrlr (0055)
- 5241 PCMCIA Bridge
- 5242 General Purpose Controller
- 5243 Bus Cntrlr (00000000)
- 5244 Floppy Disk Controller
- 8139 realtek 8139c (surecom EP-320X-R adapter with realtek 8139c chip)
-10BE Tsenglabs International Corp
-10BF MOST Corp
-10C0 Boca Research Inc
-10C1 ICM Corp Ltd
-10C2 Auspex Systems Inc
-10C3 Samsung Semiconductor Inc
- 1100 SmartEther100 SC1100 LAN Adapter (i82557B)
- 8920 KS8920 Fast Ethernet Adapter
- 8925 KS8925 Fast Ethernet Adapter (??)
-10C4 Award Software International Inc
- 8363 s/n124102160
-10C5 Xerox Corp
-10C6 Rambus Inc
-10C7 Media Vision
-10C8 Neomagic Corporation
- 0000 Graphics Controller
- 0001 NM2070 MagicGraph 128
- 0002 NM2090 MagicGraph 128V
- 0003 MagicGraph 128ZV Video Controller (NM2093)
- 0004 MagicGraph 128XD (NM2160)
- 0005 MagicMedia 256AV (NM2200)
- 0006 NM2360 MagicMedia 256ZX / 256M6D
- 0016 MagicMedia 256XL+ (NM2380)
- 0025 NM2230 NeoMagic MagicMedia 256AV+
- 0083 Graphic Controller NeoMagic MagicGraph128ZV+ (NM2097)
- 8005 MagicMedia 256AV Audio Device (NM2200)
- 8006 MagicMedia 256ZX Audio Device (NM2360)
- 8016 MagicMedia 256XL+ Audio Device (NM2380)
-10C9 Dataexpert Corp
-10CA Fujitsu Microelectronic
-10CB Omron Corp
-10CC Mentor Arc Inc
- 0226 PCI to ISA Bridge
- 0257 CPU to PCI Bridge
- 0660 Articia S Host Bridge
- 0661 Articia S PCI Bridge
-10CD Advanced System Products (AdvanSys)
- 1100 PCI SCSI Host Adapter (ASC1100)
- 1200 ASC1200 PCI SCSI Host Adapter (Fast SCSI II)
- 1300 ASC1300 PCI SCSI Host Adapter (Fast Wide SCSI II)
- 2300 ASC2300 PCI SCSI Hode Adapter (Ultra-Wide SCSI II)
- 2500 PCI Ultra 80/160 SCSI Controllers (ASC38C0800/1600)
- 4000 ASC30c0400 FireWire OHCI Single-Chip Controller
-10CE Radius Inc
-10CF Fujitsu Ltd.
- 10C5 Serial Parallel Card (FMV-103)
- 2001 PCI SCSI Host Adapter (Fast Wide SCSI-2) (MB86605)
- 2002 Fast Wide SCSI Controller (MB86606)
- 2005 10/100 Fast Ethernet Adapter (MB86974)
- 200C IEEE1394 OpenHCI Controller (MB86974)
- 2010 OHCI FireWire Controller
- 2011 MPEG2 R-Engine (MPEG2 Hardware Encoder)
- 2019 Coral-P Graphics Chip (MB86295)
- 201E Coral-PA Graphics Chip (MB86296)
- 202B Carmine Graphisc adapter (mb86297)
-10D0 Fujitsu Ltd
-10D1 FuturePlus Systems
-10D2 Molex Incorporated
-10D3 Jabil Circuit Inc
-10D4 Hualon Microelectronics
-10D5 Autologic Inc
-10D6 Wilson .co .ltd
- FF51 C87899D (0x0100)
- FF66 C87899D (0x0100)
-10D7 BCM Advanced Research
-10D8 Advanced Peripherals Labs
-10D9 Macronix International Co. Ltd.
- 0066 sdas (MX86101P)
- 0431 MX98715
- 0512 MX98713 Fast Ethernet Adapter (PN102TX)
- 0531 Single Chip Fast Ethernet NIC Controller (MX98715/25)
- 0532 PCI/CardBus Fast Ethernet Controller (MX98723/727)
- 0553 Ethernet Adapter (MX987x5)
- 8625 xiankasqudong (MX86250)
- 8626 MX86251+3Dfx Voodoo Rush
- 8627 Voodoo Rush MX86251 (MX86251FC)
- 8888 9619E (MX86250)
- C115 lc82c115
-10DA Thomas-Conrad Corp
- 0508 TC4048 Token Ring
- 3390 Tl3c3x9 Token Ring
-10DB Rohm LSI Research
-10DC CERN-European Lab. for Particle Physics
- 0001 PCI-SCI PMC mezzanine (STAR/RD24)
- 0002 SCI bridge on PCI 5 Volt card (ATT 2C15-3 (FPGA))
- 0004 ALTERA STRATIX (EP20S780)
- 0010 Simple PMC/PCI to S-LINK interface (680-1110-150/400)
- 0011 Simple S-LINK to PMC/PCI interface (680-1110-200/450)
- 0012 32-bit S-LINK to 64-bit PCI interface (S32PCI64)
- 0021 HIPPI destination
- 0022 HIPPI source
- 0033 ALICE DDL to PCI interface (RORC) (EP20KE (APEX-FPGA))
- 0101 Acquisition card for the SPS Orbit System (MACI) (SL651 7057 C200)
- 016A CALICE ODR (XC4VFX100)
- 10DC TTC sr first TTC chip receiver PMC (ATT 2C15-3 (FPGA))
-10DD Evans & Sutherland
- 0001 3D Graphics Processor (?? Freedom GBbus??)
- 0100 Lightning 1200
-10DE NVIDIA Corporation
- 0001 SoundMAX Integrated Digital Audio (Lucent 0x00da)
- 0003 nVIDIA High Definition Audio/HDMI (It seems to be Realtek ALC888/9)
- 0006 realtec based HD Audio (nvidia)
- 0008 NV1 EDGE 3D Accelerator [NV1]
- 0009 NV1 EDGE 3D Multimedia [NV1]
- 0010 Mutara V08 [NV2]
- 0018 Riva 128 Graphics Accelerator [NV3]
- 0019 Riva 128ZX GUI+3D Accelerator [NV3]
- 0020 Riva TNT GUI+3D Accelerator [NV4]
- 0028 NVIDIA RIVA TNT2/TNT2 Pro (NV05)
- 0029 NVIDIA RIVA TNT 2 Ultra (NV05)
- 002A Riva TNT2 [NV5]
- 002B Riva TNT2 [NV5]
- 002C NVIDIA Vanta/Vanta LT (NV05)
- 002D NVIDIA RIVA TNT2 Model 64/Model 64 Pro (NV05)
- 002E Vanta [NV6]
- 002F Vanta [NV6]
- 0030 nForce4 Intel Edition LPC Bridge
- 0034 MCP04 SMBus Controller
- 0035 nForce4 Intel Edition Parallel ATA Controller
- 0036 nForce4 Intel Edition Serial ATA Controller
- 0037 MCP04 Ethernet Controller
- 0038 MCP04 Ethernet Controller
- 003A MCP04 AC'97 Audio Controller
- 003B MCP04 USB Controller
- 003C MCP04 USB Controller
- 003D MCP04 PCI Bridge
- 003E nForce4 Intel Edition Serial ATA Controller
- 003F nForce4 Intel Edition HyperTransport Registers
- 0040 NVIDIA GeForce 6800 Ultra (NV40)
- 0041 NVIDIA GeForce 6800 (NV40)
- 0042 NVIDIA GeForce 6800 LE (NV40)
- 0043 NVIDIA GeForce 6800 XE (NV40)
- 0044 NVIDIA GeForce 6800 XT (NV40)
- 0045 NVIDIA GeForce 6800 GT (NV40)
- 0046 NVIDIA GeForce 6800 GT (NV45)
- 0047 NVIDIA GeForce 6800 GS (NV40)
- 0048 NVIDIA GeForce 6800 XT (NV40)
- 0049 NVIDIA NV40GL (NV40)
- 004D NVIDIA Quadro FX 3400 (NV40)
- 004E NVIDIA Quadro FX 4000 (NV40)
- 0050 nForce4 PCI to ISA Bridge
- 0051 nForce4 ISA Bridge
- 0052 nForce4 SMBus
- 0053 nForce4 Parallel ATA Controller
- 0054 CK804 SATA/RAID Controller (CK804)
- 0055 CK804 SATA/RAID Controller (CK804)
- 0056 nForce4 Ethernet Controller
- 0057 NVIDIA Network Bus Enumerator (CK804)
- 0058 nForce4 AC'97 Modem
- 0059 nForce Audio Controller (unknown)
- 005A nForce4 USB Controller
- 005B nForce4 USB 2.0 Controller
- 005C nForce4 PCI Bridge
- 005D nForce4 PCIe Bridge
- 005E nForce4 Memory Controller
- 005F nForce4 Memory Controller
- 0060 PCI to ISA Bridge (MCP2)
- 0064 nForce 2 SMBus Controller (MCP)
- 0065 PATA Controller (nForce MCP2/MCP2-T/MCP2-U)
- 0066 nForce 2 Networking Controller (MCP2)
- 0067 Nvidia 7050 chipset HDMI Audio (MCP2)
- 0068 nForce2 EHCI USB 2.0 Controller
- 0069 nForce AC'97 Modem
- 006A nForce AC97 Audio Controller (MCP2)
- 006B Audio Processing Unit (Dolby Digital) (nForce MCP-T?)
- 006C nForce MCP-T CPU to PCI Bridge
- 006D Audio Codec Interface (nForce MCP-T)
- 006E OHCI Compliant IEEE 1394 Controller (nForce MCP2)
- 006F nForce4 Intel Edition Memory Registers
- 0071 nForce4 Intel Edition CPU to PCI Bridge
- 0075 nForce4 Intel Edition Memory Registers
- 0076 nForce4 Intel Edition Memory Registers
- 0078 nForce4 Intel Edition Memory Registers
- 0079 nForce4 Intel Edition Memory Registers
- 007A nForce4 Intel Edition Memory Registers
- 007B nForce4 Intel Edition Memory Registers
- 007C nForce4 Intel Edition Memory Registers
- 007D nForce4 Intel Edition Memory Registers
- 007E nForce4 Intel Edition PCIe Root Hub
- 007F nForce4 Intel Edition Memory Registers
- 0080 nForce MCP2S PCI to ISA Bridge
- 0084 nForce MCP2S PCI System Management
- 0085 nForce MCP2S Parallel ATA Controller
- 0086 nForce MCP2A Ethernet Controller
- 0087 nForce MCP2A USB Controller
- 0088 nForce MCP2A USB Controller
- 0089 nForce AC'97 Modem
- 008A nForce AC'97 Audio Codec Interface
- 008B nforce MCP2A PCI Bridge
- 008C Single-Port 10/100M Fast Ethernet PHYceiver (RLT8201BL)
- 008E nForce MCP2S Serial ATA Compatible Controller
- 0090 NVIDIA GeForce 7800 GTX (G70)
- 0091 NVIDIA GeForce 7800 GTX (G70)
- 0092 NVIDIA GeForce 7800 GT (G70)
- 0093 NVIDIA GeForce 7800 GS (G70)
- 0094 NVIDIA GeForce 7800SE/XT/LE/LT/ZT (G70)
- 0095 NVIDIA GeForce 7800 SLI (G70)
- 0098 NVIDIA GeForce Go 7800 (G70)
- 0099 NVIDIA GeForce Go 7800 GTX (G70)
- 009C NVIDIA Quadro FX 350M (G70)
- 009D NVIDIA Quadro FX 4500 (G70)
- 009E NVIDIA G70GL (G70)
- 00A0 RIVA TNT2 Aladdin [NVA0]
- 00B4 nForce4 Intel Edition Memory Registers
- 00C0 NVIDIA GeForce 6800 GS (NV41)
- 00C1 NVIDIA GeForce 6800 (NV41)
- 00C2 NVIDIA GeForce 6800 LE (NV41)
- 00C3 NVIDIA GeForce 6800 XT (NV41)
- 00C8 NVIDIA GeForce Go 6800 (NV41.8)
- 00C9 NVIDIA GeForce Go 6800 Ultra (NV41)
- 00CC NVIDIA Quadro FX Go 1400 (NV41)
- 00CD NVIDIA Quadro FX 3450/4000 SDI (NV41)
- 00CE NVIDIA Quadro FX 1400 (NV41)
- 00D0 LPC Bridge (nForce 3)
- 00D1 Host Bridge (nForce 3)
- 00D2 PCI-to-PCI Bridge (nForce 3?)
- 00D3 nForce4 Memory Controller
- 00D4 nForce MCP3 SMBus Controller
- 00D5 CK8 PATA 133/PATA to SATA Bridge (nForce3-150)
- 00D6 nForce 3 Networking Controller (MCP3)
- 00D7 OpenHCD USB Host Controller (nForce MCP3?)
- 00D8 Enhanced PCI to USB Host Controller (nForce MCP3?)
- 00D9 Agere System PCI Soft Modem (nForce 3)
- 00DA nForce MCP3 Audio Codec Interface
- 00DD PCI-to-PCI Bridge (nForce MCP3?)
- 00DF nForce 7 Networking Controller (MCP73)
- 00E0 LPC Interface Bridge (nForce3 250)
- 00E1 Host/PCI Bridge (nForce3 250)
- 00E2 AGP Host to PCI Bridge (nForce3 250)
- 00E3 CK8S SATA/RAID Controller (nForce 250)
- 00E4 PCI System Management (nForce3 250)
- 00E5 Parallel ATA Controller (nForce3 250)
- 00E6 nForce3 Ethernet Controller
- 00E7 OpenHCD USB Controller (nForce3 250)
- 00E8 Enhanced PCI to USB Controller (nForce3 250)
- 00E9 nForce3 AC'97 Modem
- 00EA nForce3 AC'97 Audio Codec Interface
- 00ED PCI-PCI Bridge (nForce3 250)
- 00EE CK8S SATA/RAID Controller (nForce 250)
- 00F0 NVIDIA Device (BR02)
- 00F1 NVIDIA GeForce 6600 GT (BR02)
- 00F2 NVIDIA GeForce 6600 (BR02)
- 00F3 NVIDIA GeForce 6200 (BR02)
- 00F4 NVIDIA GeForce 6600 LE (BR02)
- 00F5 NVIDIA GeForce 7800 GS (BR02)
- 00F6 NVIDIA GeForce 6800 GS/XT (BR02)
- 00F8 NVIDIA Quadro FX 3400/4400 (BR02)
- 00F9 NVIDIA GeForce 6800 Series GPU (BR02)
- 00FA NVIDIA GeForce PCX 5750 (BR02)
- 00FB NVIDIA GeForce PCX 5900 (BR02)
- 00FC NVIDIA GeForce PCX 5300 (BR02)
- 00FD NVIDIA Quadro PCI-E Series (BR02)
- 00FE NVIDIA Quadro FX 1300 (BR02)
- 00FF NVIDIA GeForce PCX 4300 (BR02)
- 0100 NVIDIA GeForce 256 (NV10)
- 0101 GeForce 256 DDR [NV10DDR]
- 0102 GeForce 256 Ultra [NV10]
- 0103 Quadro (GeForce 256 GL) [NV10GL]
- 0110 NVIDIA GeForce2 MX/MX 400 (NV11)
- 0111 GeForce2 MX 100/200 (DDR) [NV11DDR]
- 0112 GeForce2 Go/MX Ultra [NV11]
- 0113 NVIDIA Quadro2 MXR/EX (NV11)
- 0140 NVIDIA GeForce 6600 GT (NV43)
- 0141 NVIDIA GeForce 6600 (NV43)
- 0142 NVIDIA GeForce 6600 LE (NV43)
- 0143 NVIDIA GeForce 6600 VE (NV43)
- 0144 NVIDIA GeForce Go 6600 (NV43)
- 0145 NVIDIA GeForce 6610 XL (NV43)
- 0146 NVIDIA GeForce Go 6200 TE/6600 TE (NV43)
- 0147 NVIDIA GeForce 6700 XL (NV43)
- 0148 NVIDIA GeForce Go 6600 (NV43)
- 0149 NVIDIA GeForce Go 6600 GT (NV43)
- 014A NVIDIA Quadro NVS 440 (NV43)
- 014B NVIDIA NV43 (NV43)
- 014C NVIDIA Quadro FX 540M (NV43)
- 014D NVIDIA Quadro FX 550 (NV43)
- 014E NVIDIA Quadro FX 540 (NV43)
- 014F NVIDIA GeForce 6200 (NV43)
- 0150 NVIDIA GeForce2 GTS/GeForce2 Pro (NV15)
- 0151 GeForce2 Ti (DDR) [NV15DDR]
- 0152 GeForce2 Ultra (BladeRunner) [NV15BR]
- 0153 NVIDIA Quadro2 Pro (NV15)
- 0160 NVIDIA GeForce 6500 (NV44)
- 0161 NVIDIA GeForce 6200 TurboCache(TM) (NV44)
- 0162 NVIDIA GeForce 6200SE TurboCache(TM) (NV44)
- 0163 NVIDIA GeForce 6200 LE (NV44)
- 0164 GeForce Go 6200 [NV44]
- 0165 NVIDIA Quadro NVS 285 (NV44)
- 0166 NVIDIA GeForce Go 6250 (NV44)
- 0167 NVIDIA GeForce Go 6200 (NV44)
- 0168 NVIDIA GeForce Go 6400 (NV44)
- 0169 NVIDIA GeForce 6250 (NV44)
- 016A NVIDIA GeForce 7100 GS (NV44)
- 016B NVIDIA NV44GLM (NV44)
- 016C NVIDIA NV44GLM (NV44)
- 016D NVIDIA NV44GLM (NV44)
- 016E NVIDIA NV44GL (NV44)
- 0170 NVIDIA GeForce4 MX 460 (NV17)
- 0171 NVIDIA GeForce4 MX 440 (NV17)
- 0172 NVIDIA GeForce4 MX 420 (NV17)
- 0173 NVIDIA GeForce4 MX 440-SE (NV17)
- 0174 NVIDIA GeForce4 MX 440 Go (NV17)
- 0175 NVIDIA GeForce4 MX 420 Go (NV17)
- 0176 NVIDIA GeForce4 MX 420 Go 32M (NV17)
- 0177 NVIDIA GeForce4 460 Go (NV17)
- 0178 NVIDIA Quadro4 550 XGL (NV17)
- 0179 NVIDIA GeForce4 MX 440 Go 64M (NV17)
- 017A NVIDIA Quadro NVS (NV17)
- 017B Quadro4 550 XGL [NV17GL.3]
- 017C NVIDIA Quadro4 500 Go GL (NV17)
- 017D NVIDIA GeForce4 410 Go 16M (NV17)
- 0180 GeForce4 MX 440 with AGP 8X [NV18]
- 0181 NVIDIA GeForce4 MX 440 with AGP8X (NV18)
- 0182 NVIDIA GeForce4 MX 440SE with AGP8X (NV18)
- 0183 NVIDIA GeForce4 MX 420 with AGP8X (NV18)
- 0184 GeForce4 MX [NV18]
- 0185 NVIDIA GeForce4 MX 4000 (NV18)
- 0186 NVIDIA GeForce4 448 Go (NV18)
- 0187 NVIDIA GeForce4 488 Go (NV18)
- 0188 NVIDIA Quadro4 580 XGL (NV18)
- 018A NVIDIA Quadro NVS with AGP8X (NV18)
- 018B NVIDIA Quadro4 380 XGL (NV18)
- 018C NVIDIA Quadro NVS 50 PCI (NV18)
- 018D NVIDIA GeForce4 448 Go (NV18)
- 0191 NVIDIA GeForce 8800 GTX (G80)
- 0193 NVIDIA GeForce 8800 GTS (G80)
- 0194 NVIDIA GeForce 8800 Ultra (G80)
- 0197 NVIDIA Tesla C870 (G80)
- 019D NVIDIA Quadro FX 5600 (G80)
- 019E NVIDIA Quadro FX 4600 (G80)
- 01A0 GeForce2 Integrated Graphics [NVCrush11]
- 01A4 AGP Controller (nForce)
- 01A5 AGP Controller (nForce)
- 01A6 AGP Controller (nForce)
- 01A8 Memory Controller (SDR) (nForce 220)
- 01A9 Memory Controller (SDR) (nForce 420)
- 01AA Memory Controller (DDR) (nForce 220/230)
- 01AB Memory Controller (DDR) (nForce 415/420/430)
- 01AC nForce 220/230/415/420/430 Memory Controller
- 01AD nForce 220/230/415/420/430 Memory Controller
- 01B0 nForce MCP Audio Processing Unit (Dolby Digital)
- 01B1 nForce AC'97 Audio Controller (MCP)
- 01B2 HUB Interface (nForce)
- 01B4 nForce 1/2 SMBus Controller (MCP)
- 01B7 AGP Bridge (nForce)
- 01B8 PCI Bridge (nForce)
- 01BC nForce IDE/ATA Controller (MCP)
- 01C1 nForce PC97 Modem (Intel 537)
- 01C2 nForce OHCI USB Controller
- 01C3 nForce Networking Controller (MCP)
- 01D0 NVIDIA GeForce 7350 LE (G72)
- 01D1 NVIDIA GeForce 7300 LE (G72)
- 01D2 NVIDIA GeForce 7550 LE (G72)
- 01D3 NVIDIA GeForce 7300 SE/7200 GS (G72)
- 01D5 NVIDIA GeForce 7300 LE (G72)
- 01D6 GeForce Go 7200
- 01D7 Quadro NVS 110M / GeForce Go 7300
- 01D8 Quadro NVS 120M / GeForce Go 7400
- 01DA Quadro NVS 110M
- 01DB NVIDIA Quadro NVS 120M (G72)
- 01DC NVIDIA Quadro FX 350M (G72)
- 01DD NVIDIA GeForce 7500 LE (G72)
- 01DE NVIDIA Quadro FX 350 (G72)
- 01DF NVIDIA GeForce 7300 GS (G72)
- 01E0 AGP Controller (nForce2)
- 01E1 AGP Controller (nForce2)
- 01E8 AGP Host to PCI Bridge (nForce2)
- 01EA Memory Controller 0 (nForce2)
- 01EB Memory Controller 1 (nForce2)
- 01EC Memory Controller 2 (nForce2)
- 01ED Memory Controller 3 (nForce2)
- 01EE Memory Controller 4 (nForce2)
- 01EF Memory Controller 5 (nForce2)
- 01F0 NVIDIA GeForce4 MX Integrated GPU (CR17)
- 0200 NVIDIA GeForce3 (NV20)
- 0201 NVIDIA GeForce3 Ti 200 (NV20)
- 0202 NVIDIA GeForce3 Ti 500 (NV20)
- 0203 NVIDIA Quadro DCC (NV20)
- 0210 NVIDIA NV48 (NV48)
- 0211 NVIDIA GeForce 6800 (NV48)
- 0212 NVIDIA GeForce 6800 LE (NV48)
- 0215 NVIDIA GeForce 6800 GT (NV48)
- 0218 NVIDIA GeForce 6800 XT (NV48)
- 0220 NVIDIA NV44 (NV44)
- 0221 NVIDIA GeForce 6200 (NV44)
- 0222 NVIDIA GeForce 6200 A-LE (NV44)
- 0228 NVIDIA NV44M (NV44)
- 0240 NVIDIA GeForce 6150 (C51)
- 0241 NVIDIA GeForce 6150 LE (C51)
- 0242 NVIDIA GeForce 6100 (C51)
- 0243 PCI Express Bridge (C51)
- 0244 Geforce Go 6150 (Geforce Go 6150)
- 0245 NVIDIA Quadro NVS 210S / NVIDIA GeForce 6150LE (C51)
- 0246 PCI Express Bridge (C51)
- 0247 Geforce 6100 Go (C51)
- 0248 PCI Express Bridge (C51)
- 0249 PCI Express Bridge (C51)
- 024A PCI Express Bridge (C51)
- 024B PCI Express Bridge (C51)
- 024C PCI Express Bridge (C51)
- 024D PCI Express Bridge (C51)
- 024E PCI Express Bridge (C51)
- 024F PCI Express Bridge (C51)
- 0250 NVIDIA GeForce4 Ti 4600 (NV25)
- 0251 NVIDIA GeForce4 Ti 4400 (NV25)
- 0252 NVIDIA GeForce4 Ti (NV25)
- 0253 NVIDIA GeForce4 Ti 4200 (NV25)
- 0258 NVIDIA Quadro4 900 XGL (NV25)
- 0259 NVIDIA Quadro4 750 XGL (NV25)
- 025B NVIDIA Quadro4 700 XGL (NV25)
- 0260 MCP51 LPC Bridge
- 0261 MCP51 LPC Bridge
- 0262 MCP51 LPC Bridge
- 0263 MCP51 LPC Bridge
- 0264 NVIDIA nForce PCI System Management (NVIDIA SMB Bus Controller)
- 0265 MCP51 Parallel ATA Controller
- 0266 NVIDIA nForce 430/410 Serial ATA Controller (MCP51S)
- 0267 NVIDIA nForce 430/410 Serial ATA Controller (MCP51S)
- 0268 NVIDIA nForce Networking Controller (MCP51)
- 0269 MCP51 Network Bus Enumerator
- 026A MCP51 MCI
- 026B MCP51 AC'97 Audio Controller (MCP51)
- 026C High Definition Audio Controller (MCP51)
- 026D MCP51 USB Controller
- 026E MCP51 USB Controller
- 026F MCP51 PCI Bridge
- 0270 MCP51 Host Bridge
- 0271 Coprocessor (nForce System Management Controller) (MCP51)
- 0272 MCP51 Memory Controller 0
- 027E C51 Memory Controller 2
- 027F C51 Memory Controller 3
- 0280 NVIDIA GeForce4 Ti 4800 (NV28)
- 0281 NVIDIA GeForce4 Ti 4200 with AGP8X (NV28)
- 0282 NVIDIA GeForce4 Ti 4800 SE (NV28)
- 0286 GeForce4 Ti 4200 Go AGP 8x [NV28]
- 0288 NVIDIA Quadro4 980 XGL (NV28)
- 0289 NVIDIA Quadro4 780 XGL (NV28)
- 028C NVIDIA Quadro4 700 Go GL (NV28)
- 0290 NVIDIA GeForce 7900 GTX (G71)
- 0291 NVIDIA GeForce 7900 GT/GTO (G71)
- 0292 NVIDIA GeForce 7900 GS (G71)
- 0293 NVIDIA GeForce 7950 GX2 (G71)
- 0294 NVIDIA GeForce 7950 GX2 (G71)
- 0295 NVIDIA GeForce 7950 GT (G71)
- 0297 NVIDIA GeForce Go 7950 GTX (G71)
- 0298 NVIDIA GeForce Go 7900 GS (G71)
- 0299 NVIDIA GeForce Go 7900 GTX (G71)
- 029A Quadro FX 2500M
- 029B Quadro FX 1500M
- 029C NVIDIA Quadro FX 5500 (G71)
- 029D NVIDIA Quadro FX 3500 (G71)
- 029E NVIDIA Quadro FX 1500 (G71)
- 029F NVIDIA Quadro FX 4500 X2 (G71)
- 02A0 NVIDIA NV2A GeForce 3 Integrated (XBOX) (NV20)
- 02E0 NVIDIA GeForce 7600 GT (BR02)
- 02E1 NVIDIA GeForce 7600 GS (BR02)
- 02E2 NVIDIA GeForce 7300 GT (BR02)
- 02E3 NVIDIA GeForce 7900 GS (BR02)
- 02E4 NVIDIA GeForce 7950 GT (BR02)
- 02F0 C51 Host Bridge
- 02F1 C51 Host Bridge
- 02F2 C51 Host Bridge
- 02F3 C51 Host Bridge
- 02F4 C51 Host Bridge
- 02F5 C51 Host Bridge
- 02F6 C51 Host Bridge
- 02F7 C51 Host Bridge
- 02F8 C51 Memory Controller 5
- 02F9 C51 Memory Controller 4
- 02FA C51 Memory Controller 0
- 02FB C51 PCIe Bridge
- 02FC C51 PCIe Bridge
- 02FD C51 PCIe Bridge
- 02FE C51 Memory Controller 1
- 02FF C51 Host Bridge
- 0300 GeForce FX [NV30.1]
- 0301 NVIDIA GeForce FX 5800 Ultra (NV30)
- 0302 NVIDIA GeForce FX 5800 (NV30)
- 0308 NVIDIA Quadro FX 2000 (NV30)
- 0309 NVIDIA Quadro FX 1000 (NV30)
- 030A NVIDIA ICE FX 2000 (NV30)
- 0311 NVIDIA GeForce FX 5600 Ultra (NV31)
- 0312 NVIDIA GeForce FX 5600 (NV31)
- 0313 NVIDIA NV31 (NV31)
- 0314 NVIDIA GeForce FX 5600XT (NV31)
- 0316 NVIDIA NV31M (NV31)
- 0317 NVIDIA NV31M Pro (NV31)
- 0318 NVIDIA NV31GL (NV31)
- 0319 NVIDIA NV31GL (NV31)
- 031A NVIDIA GeForce FX Go 5600 (NV31)
- 031B NVIDIA GeForce FX Go 5650 (NV31)
- 031C NVIDIA Quadro FX Go 700 (NV31)
- 031D NVIDIA NV31GLM (NV31)
- 031E NVIDIA NV31GLM Pro (NV31)
- 031F NVIDIA NV31GLM Pro (NV31)
- 0320 NVIDIA GeForce FX 5200 (NV34)
- 0321 NVIDIA GeForce FX 5200 Ultra (NV34)
- 0322 NVIDIA GeForce FX 5200 (NV34)
- 0323 NVIDIA GeForce FX 5200LE (NV34)
- 0324 NVIDIA GeForce FX Go 5200 (NV34)
- 0325 NVIDIA GeForce FX Go 5250/5500 (NV34)
- 0326 NVIDIA GeForce FX 5500 (NV34)
- 0327 NVIDIA GeForce FX 5100 (NV34)
- 0328 NVIDIA GeForce FX Go 5200 32/64M (NV34)
- 0329 GeForce FX Go 5200 [NV34M]
- 032A NVIDIA Quadro NVS 55/280 PCI (NV34)
- 032B NVIDIA Quadro FX 500/FX 600 (NV34)
- 032C NVIDIA GeForce FX Go 53x0 (NV34)
- 032D NVIDIA GeForce FX Go 5100 (NV34)
- 032F NVIDIA NV34GL (NV34)
- 0330 NVIDIA GeForce FX 5900 Ultra (NV35)
- 0331 NVIDIA GeForce FX 5900 (NV35)
- 0332 NVIDIA GeForce FX 5900XT (NV35)
- 0333 NVIDIA GeForce FX 5950 Ultra (NV35)
- 0334 NVIDIA GeForce FX 5900ZT (NV35)
- 0338 NVIDIA Quadro FX 3000 (NV35)
- 033F NVIDIA Quadro FX 700 (NV35)
- 0341 NVIDIA GeForce FX 5700 Ultra (NV36)
- 0342 NVIDIA GeForce FX 5700 (NV36)
- 0343 NVIDIA GeForce FX 5700LE (NV36)
- 0344 NVIDIA GeForce FX 5700VE (NV36)
- 0345 NVIDIA NV36 (NV36)
- 0347 NVIDIA GeForce FX Go 5700 (NV36)
- 0348 NVIDIA GeForce FX Go 5700 (NV36)
- 0349 NVIDIA NV36M Pro (NV36)
- 034B NVIDIA NV36MAP (NV36)
- 034C NVIDIA Quadro FX Go 1000 (NV36)
- 034E NVIDIA Quadro FX 1100 (NV36)
- 034F NVIDIA NV36GL (NV36)
- 0360 MCP55 LPC Bridge
- 0361 MCP55 LPC Bridge
- 0362 MCP55 LPC Bridge
- 0363 MCP55 LPC Bridge
- 0364 MCP55 LPC Bridge
- 0365 MCP55 LPC Bridge
- 0366 MCP55 LPC Bridge
- 0367 MCP55 LPC Bridge
- 0368 SMBus controller ((0xCB84 integrated chip nForce Pro 3400))
- 0369 MCP55 Memory Controller
- 036A MCP55 Memory Controller
- 036B MCP55 SMU
- 036C Standard OpenHCD USB Hostcontroller (81FB1043)
- 036D Standard PCI-to-USB Enhanced Hostcontroller (81FB1043)
- 036E MCP55 PATA Controller (MCP55)
- 036F MCP55 SATA/RAID Controller (MCP55)
- 0370 MCP55 PCI bridge
- 0371 High Definition Audio Controller (MCP55)
- 0372 MCP55 Ethernet
- 0373 MCP55 Ethernet
- 0374 MCP55 PCIe bridge
- 0375 MCP55 PCIe bridge
- 0376 MCP55 PCIe bridge
- 0377 MCP55 PCIe bridge
- 0378 MCP55 PCIe bridge
- 037A MCP55 Memory Controller
- 037C GeForce 7800 GS (MCP55??)
- 037E MCP55 SATA/RAID Controller (MCP55)
- 037F MCP55 SATA/RAID Controller (MCP55S)
- 038B NVIDIA GeForce 7650 GS (G73)
- 0390 NVIDIA GeForce 7650 GS (G73)
- 0391 NVIDIA GeForce 7600 GT (G73)
- 0392 NVIDIA GeForce 7600 GS (G73)
- 0393 NVIDIA GeForce 7300 GT (G73)
- 0394 NVIDIA GeForce 7600 LE (G73)
- 0395 NVIDIA GeForce 7300 GT (G73)
- 0397 GeForce Go 7700
- 0398 NVIDIA GeForce Go 7600 (G73)
- 0399 GeForce Go 7600 GT
- 039B GeForce Go 7900 SE
- 039C Quadro FX 550M
- 039E NVIDIA Quadro FX 560 (G73)
- 03A0 C55 Host Bridge
- 03A1 C55 Host Bridge
- 03A2 C55 Host Bridge
- 03A3 C55 Host Bridge
- 03A4 C55 Host Bridge
- 03A5 C55 Host Bridge
- 03A6 C55 Host Bridge
- 03A7 C55 Host Bridge
- 03A8 C55 Memory Controller
- 03A9 C55 Memory Controller
- 03AA C55 Memory Controller
- 03AB C55 Memory Controller
- 03AC C55 Memory Controller
- 03AD C55 Memory Controller
- 03AE C55 Memory Controller
- 03AF C55 Memory Controller
- 03B0 C55 Memory Controller
- 03B1 C55 Memory Controller
- 03B2 C55 Memory Controller
- 03B3 C55 Memory Controller
- 03B4 C55 Memory Controller
- 03B5 C55 Memory Controller
- 03B6 C55 Memory Controller
- 03B7 C55 PCIe bridge
- 03B8 C55 PCIe bridge
- 03B9 C55 PCIe bridge
- 03BA C55 Memory Controller
- 03BB C55 PCIe bridge
- 03BC C55 Memory Controller
- 03D0 NVIDIA GeForce 6150SE nForce 430 (C61)
- 03D1 NVIDIA GeForce 6100 nForce 405 (C61)
- 03D2 NVIDIA GeForce 6100 nForce 400 (C61)
- 03D5 NVIDIA GeForce 6100 nForce 420 (C61)
- 03E0 PCI standard ISA bridge (nForce 430)
- 03E1 nForce 430 (MCP61) LPC Bridge
- 03E2 nForce 430 (MCP61) LPC Bridge
- 03E3 nForce 430 (MCP61) LPC Bridge
- 03E4 nForce 430 (MCP61) High Definition Audio
- 03E5 nForce 430 (MCP61) Ethernet
- 03E6 nForce 430 (MCP61) Ethernet
- 03E7 nForce 430 (MCP61) SATA Controller
- 03E8 nForce 430 (MCP61) PCIe bridge
- 03E9 nForce 430 (MCP61) PCIe bridge
- 03EA nForce 430 (MCP61) Memory Controller
- 03EB NVIDIA nForce PCI System Management (MCP61)
- 03EC nForce 430 (MCP61) IDE Controller
- 03EE nForce 430 (MCP61) Ethernet
- 03EF Nvidia Networking Card (nForce 405)
- 03F0 nForce 430 (MCP61) High Definition Audio
- 03F1 nForce 430 (MCP61) USB Controller
- 03F2 nForce 430 (MCP61) USB Controller
- 03F3 nForce 430 (MCP61) PCI bridge
- 03F4 nForce 430 (MCP61) SMU
- 03F5 nForce 430 (MCP61) Memory Controller
- 03F6 nForce 430 (MCP61) SATA Controller
- 03F7 nForce 430 (MCP61) SATA Controller
- 0400 NVIDIA GeForce 8600 GTS (G84)
- 0401 NVIDIA GeForce 8600 GT (G84)
- 0402 NVIDIA GeForce 8600 GT (G84)
- 0403 NVIDIA GeForce 8600GS (G84)
- 0404 NVIDIA GeForce 8400 GS (G84)
- 0405 GeForce 9500m GS (unknown)
- 0406 NVIDIA GeForce 8300 GS (G84)
- 0407 NVIDIA GeForce 8600M GT (NVIDIA GeForce 8600M GT)
- 0409 GeForce 8800M GS
- 040A NVIDIA Quadro FX 370 (G84)
- 040B Quadro NVS 320M
- 040C Mobile Quadro FX/NVS video card (NVIDIA Quadro NVS 570M)
- 040D Quadro FX 1600M
- 040E NVIDIA Quadro FX 570 (G84)
- 040F NVIDIA Quadro FX 1700 (G84)
- 0420 NVIDIA GeForce 8400 SE (G86)
- 0421 NVIDIA GeForce 8500 GT (G86)
- 0422 NVIDIA GeForce 8400 GS (G86)
- 0423 NVIDIA GeForce 8300 GS (G86)
- 0424 NVIDIA GeForce 8400 GS (G86)
- 0425 NVIDIA 8600m GS (NVIDIA 8600m GS)
- 0426 Geforce 8400M GT GPU (G86M)
- 0427 Geforce 8400M GS (unknown)
- 0428 NVIDIA GeForce 8400M G (NVIDIA GeForce 8400M G)
- 0429 nVidia Quadro NVS 135M or Quadro NVS 140M (Unknown)
- 042A Quadro NVS 130M
- 042B NVIDIA Quadro NVS 135M (8400 ??)
- 042C NVIDIA GeForce 9400 GT (G86)
- 042D Quadro FX 360 M (Mobile) (Quadro FX 360 M)
- 042F NVIDIA Quadro NVS 290 (G86)
- 0440 MCP65 LPC Bridge
- 0441 MCP65 LPC Bridge
- 0442 MCP65 LPC Bridge
- 0443 MCP65 LPC Bridge
- 0444 MCP65 Memory Controller
- 0445 MCP65 Memory Controller
- 0446 MCP65 SMBus
- 0447 MCP65 SMU
- 0448 MCP65 PATA Controller (MCP65)
- 0449 MCP65 PCI bridge
- 044A MCP65 High Definition Audio
- 044B MCP65 High Definition Audio
- 044C MCP65 AHCI Controller
- 044D MCP65 AHCI Controller
- 044E MCP65 AHCI Controller
- 044F MCP65 AHCI Controller
- 0450 MCP65 Ethernet
- 0451 MCP65 Ethernet
- 0452 MCP65 Ethernet
- 0453 MCP65 Ethernet
- 0454 MCP65 USB Controller
- 0455 MCP65 USB Controller
- 0456 MCP65 USB Controller
- 0457 MCP65 USB Controller
- 0458 MCP65 PCIe bridge
- 0459 MCP65 PCIe bridge
- 045A MCP65 PCIe bridge
- 045C MCP65 SATA Controller
- 045D MCP65 SATA Controller(IDE mode) (MCP65)
- 045E MCP65 SATA Controller
- 045F MCP65 SATA Controller
- 0531 GeForce 7150M
- 0533 nVidia GeForce 7000M / nForce 610M
- 053A NVIDIA GeForce 7050 PV / NVIDIA nForce 630a (C68)
- 053B NVIDIA GeForce 7050 PV / NVIDIA nForce 630a (C68)
- 053E NVIDIA GeForce 7025 / NVIDIA nForce 630a (C68)
- 0542 nForce PCI System Management
- 0543 nForce System Management Controller
- 0547 MCP67 Memory Controller
- 0548 ENE0100 (ENE0100)
- 054C MCP67 Ethernet (MCP67)
- 0550 MCP67 SATA Controller(IDE mode) (MCP67)
- 0554 MCP67 AHCI Controller
- 0555 MCP67 AHCI (MCP67)
- 0556 MCP67 AHCI (MCP67)
- 0558 MCP67 RAID (MCP67)
- 0559 MCP67 RAID (MCP67)
- 055A MCP67 RAID (MCP67)
- 055C MCP67 High Definition Audio
- 055D MCP67 High Definition Audio
- 055E MCP67 OHCI USB 1.1 Controller
- 055F MCP67 EHCI USB 2.0 Controller
- 0560 MCP67 PATA Controller (MCP67)
- 0562 MCP67 PCI Express Bridge
- 0563 MCP67 PCI Express Bridge
- 056C MCP73 PATA (MCP73)
- 05E0 GeForce GTX 295 (GT200b)
- 05E1 NVIDIA GeForce GTX 280 (GT200)
- 05E2 NVIDIA GeForce GTX 260 (GT200)
- 05E3 GeForce GTX 285 (GT200b)
- 05E6 NVIDIA GeForce GTX 275 (GT200)
- 05E7 NVIDIA Tesla C1060 (GT200)
- 05F8 NVIDIA Quadroplex 2200 S4 (GT200)
- 05F9 NVIDIA Quadro CX (GT200)
- 05FD NVIDIA Quadro FX 5800 (GT200)
- 05FE NVIDIA Quadro FX 4800 (GT200)
- 0600 NVIDIA GeForce 8800 GTS 512 (G92)
- 0601 NVIDIA GeForce 9800 GT (G92)
- 0602 NVIDIA GeForce 8800 GT (G92)
- 0604 NVIDIA GeForce 9800 GX2 (G92)
- 0605 NVIDIA GeForce 9800 GT (G92)
- 0606 NVIDIA GeForce 8800 GS (G92)
- 0609 GeForce 8800M GTS
- 060B GeForce 9800M GT (G92)
- 060C GeForce 8800M GTX
- 060D NVIDIA GeForce 8800 GS (G92)
- 0610 NVIDIA GeForce 9600 GSO (G92)
- 0611 NVIDIA GeForce 8800 GT (G92)
- 0612 NVIDIA GeForce 9800 GTX/9800 GTX+ (G92)
- 0613 NVIDIA GeForce 9800 GTX+ (G92)
- 0614 NVIDIA GeForce 9800 GT (G92)
- 0615 GeForce GTS 250 (G92+)
- 0619 NVIDIA Quadro FX 4700 X2 (G92)
- 061A NVIDIA Quadro FX 3700 (G92)
- 061B NVIDIA Quadro VX 200 (G92)
- 0622 NVIDIA GeForce 9600 GT (G94)
- 0623 NVIDIA GeForce 9600 GS (G94)
- 0625 NVIDIA GeForce 9600 GSO 512 (G94)
- 062D NVIDIA GeForce 9600 GT (G94)
- 062E NVIDIA GeForce 9600 GT (G94)
- 0637 NVIDIA GeForce 9600 GT (G94)
- 0638 NVIDIA Quadro FX 1800 (0638)
- 0640 NVIDIA GeForce 9500 GT (G96)
- 0641 NVIDIA GeForce 9400 GT (G96)
- 0642 NVIDIA GeForce 8400 GS (G96)
- 0643 NVIDIA GeForce 9500 GT (G96)
- 0644 NVIDIA GeForce 9500 GS (G96)
- 0645 NVIDIA GeForce 9500 GS (G96)
- 0646 Geforce 9500GS (G95)
- 0648 NVIDIA GeForce 9600M GS (G96)
- 0649 nVidia GeForce 9600M GT (G96)
- 064A GeForce 9700M GT (G96)
- 0652 Ge Force GT 130M (G96M)
- 065C Quadro FX 770M (unkown)
- 06E0 NVIDIA GeForce 9300 GE (G98)
- 06E1 NVIDIA GeForce 9300 GS (G98)
- 06E2 NVIDIA GeForce 8400 (G98)
- 06E3 NVIDIA GeForce 8300 GS (G98)
- 06E4 NVIDIA GeForce 8400 GS (G98)
- 06E6 nVidia G100 (G100)
- 06E7 NVIDIA GeForce 9300 SE (G98)
- 06E9 NVIDIA GeForce 9300M GS (G98)
- 06EA nvidia quadro nvs 150m (unknown)
- 06EB Quadro NVS 160M (unknown)
- 06F8 NVIDIA Quadro NVS 420 (G98)
- 06F9 NVIDIA Quadro FX 370 LP (G98)
- 06FA NVIDIA Quadro NVS 450 (G98)
- 06FD NVidia NVS 295 (NVS 295)
- 0753 NVIDIA nForce System Management Controller (8100)
- 0760 NForce Network Controller (MCP78 NIC)
- 0768 AHCI Controller (MCP ?)
- 07B5 MCP72 AHCI (MCP72)
- 07B9 MCP72 RAID (MCP72)
- 07D8 nForce 7100-630i (MCP73PV) (nForce 7100-630i (MCP73PV))
- 07DC nForce 7100-630i (MCP73PV)asdf (nForce 7100-630i (MCP73PV)asdf)
- 07E0 NVIDIA GeForce 7150 / NVIDIA nForce 630i (C73)
- 07E1 NVIDIA GeForce 7100 / NVIDIA nForce 630i (C73)
- 07E2 NVIDIA GeForce 7050 / NVIDIA nForce 630i (C73)
- 07E3 NVIDIA GeForce 7050 / NVIDIA nForce 610i (C73)
- 07E5 NVIDIA GeForce 7050 / NVIDIA nForce 620i (C73)
- 07F0 MCP73 SATA(IDE mode) (MCP73)
- 07F4 MCP73 AHCI1 (MCP73)
- 07F5 MCP73 AHCI2 (MCP73)
- 07F6 MCP73 AHCI3 (MCP73)
- 07F7 MCP73 AHCI4 (MCP73)
- 07F8 MCP73 RAID1 (MCP73)
- 07F9 MCP73 RAID2 (MCP73)
- 07FA MCP73 RAID3 (MCP73)
- 07FB MCP73 RAID4 (MCP73)
- 07FC High Definition Audio Bus (Possibly nForce 610i)
- 0848 NVIDIA GeForce 8300 (C73)
- 0849 NVIDIA GeForce 8200 (C77)
- 084A NVIDIA nForce 730a (C77)
- 084B NVIDIA GeForce 8200 (C77)
- 084C NVIDIA nForce 780a SLI (C77)
- 084D NVIDIA nForce 750a SLI (C77)
- 084F NVIDIA GeForce 8100 / nForce 720a (C77)
- 0860 NVIDIA GeForce 9300 (C79)
- 0861 NVIDIA GeForce 9400 (C79)
- 0863 NVIDIA GeForce 9400M (C79)
- 0864 NVIDIA GeForce 9300 (C79)
- 0865 NVIDIA GeForce 9300 (C79)
- 0868 NVIDIA nForce 760i SLI (C79)
- 086A NVIDIA GeForce 9400 (C79)
- 086C NVIDIA GeForce 9300 / nForce 730i (C79)
- 086D NVIDIA GeForce 9200 (C79)
- 086F GeForce 8200M G (MCP79MVL)
- 0871 NVIDIA GeForce 9200 (C79)
- 087A NVIDIA Quadro FX 470 (C79)
- 0A65 Nvidia 200 Series (GeForce 210)
- 0AA3 nForce 730i SMBus Controller (MCP7A)
- 0AB0 ID0A80 (NForce 9300)
- 0AB8 MCP79 AHCI1 (MCP79)
- 0AB9 MCP79 AHCI2 (MCP79)
- 0ABC MCP79 RAID1 (MCP79)
- 0ABD MCP79 RAID2 (MCP79)
- 0AD0 SATA Controller IDE mode (MCP78)
- 0BC4 AHCI Controller (MCP?)
- 0BC5 AHCI Controller (MCP?)
- 0BCC Raid Controller (MCP?)
- 0BCD Raid Controller (MCP?)
- 10DE Riva 128 (NV34)
- 10F0 PCI DEVICE (NV3)
- 1112 Gateway Solo 9550 NVIDIA Geforce 2 GO 32 MB (0x1112)
- 8001 nVidia MCP73 HDMI Audio Driver (MCP73)
- 9876 GeForce2 MX / MX 400 (NV11)
-10DF Emulex Corporation
- 10DF Fibre Channel Adapter (Light Pulse)
- 1AE5 LP6000 LightPulse Fibre Channel Host Adapter
- 1AE6 LP 8000 Fibre Channel Host Adapter Alternate ID (JX1:2-3, JX2:1-2)
- 1AE7 LP 8000 Fibre Channel Host Adapter Alternate ID (JX1:2-3, JX2:2-3)
- F005 LP1150e Fibre Channel Host Adapter
- F011 LightPulse Fibre Channel Host Adapter (Saturn)
- F015 LightPulse Fibre Channel Host Adapter (Saturn)
- F085 LightPulse PCI Fibre Channel Host Adapter
- F095 LightPulse PCI Fibre Channel Host Adapter
- F098 LightPulse PCI Fibre Channel Host Adapter
- F0A1 LightPulse PCI Fibre Channel Host Adapter
- F0A5 Emulex 1050EX FC HBA - 2GB PCI-EXPRESS (PL1050Ex)
- F0B5 Viper LightPulse Fibre Channel Host Adapter
- F0D1 Helios LightPulse Fibre Channel Host Adapter
- F0D5 LP1150 Fibre Channel Host Adapter
- F0E1 Zephyr LightPulse Fibre Channel Host Adapter
- F0E5 Zephyr LightPulse Fibre Channel Host Adapter
- F0F5 Neptune LightPulse Fibre Channel Host Adapter
- F0F6 LPX000 Fibre Channel Storport Driver
- F0F7 LPX000 Fibre Channel Storport Driver
- F100 8Gb PCIe Single / Dual port Fibre Channel Adapter (LPe12000 / LPe12002)
- F700 LP7000 LightPulse Fibre Channel Host Adapter
- F701 LP7000 Fibre Channel Host Adapter Alternate ID (JX1:2-3, JX2:1-2)
- F800 LP8000 LightPulse Fibre Channel Host Adapter
- F801 LP8000 Fibre Channel Host Adapter Alternate ID (JX1:2-3, JX2:1-2)
- F900 LightPulse PCI Fibre Channel Host Adapter
- F901 LP9000 Fibre Channel Host Adapter Alternate ID (JX1:2-3, JX2:1-2)
- F980 LP9802 & LP9802DC HBA adapter (LP9802 / DC)
- F981 LP9802 Fibre Channel Host Adapter Alternate ID
- F982 LP9802 Fibre Channel Host Adapter Alternate ID
- FA00 LightPulse PCI Fibre Channel Host Adapter
- FA01 LP101 Fibre Channel Host Adapter
- FB00 LightPulse PCI Fibre Channel Host Adapter
- FC00 Thor-X LightPulse Fibre Channel Host Adapter
- FC10 Helios-X LightPulse Fibre Channel Host Adapter
- FC20 Zephyr-X LightPulse Fibre Channel Host Adapter
- FC40 Saturn-X LightPulse Fibre Channel Host Adapter
- FD00 Emulex LP11002 (L2A2860 HELIOS v1.11)
- FD11 LPX000 Fibre Channel Storport Driver
- FD12 LPX000 Fibre Channel Storport Driver
- FE00 Zephyr-X LightPulse Fibre Channel Host Adapter
- FE04 LPX000 Fibre Channel Storport Driver
- FE11 LPX000 Fibre Channel Storport Driver
- FE12 LPX000 Fibre Channel Storport Driver
- FF00 Neptune LightPulse Fibre Channel Host Adapter
-10E0 Integrated Micro Solutions
- 5026 IMS5026/27/28 P54C "Diamond" PCI Chipset
- 5027 IMS5027
- 5028 IMS5028 ISA Bridge
- 8849 IMS8849/8 386/486 PCI Chipset
- 8853 IMS8853 ATM Network Adapter
- 9128 IMS9129 TwinTurbo 128 GUI Accelerator
- 9135 IMS9135 TwinTurbo 128-3D Display Adapter
-10E1 Tekram Technology Corp. Ltd.
- 0391 0000 (TRM-S1040)
- 690C DC-690c
- DC20 EIDE Controller (DC-290)
- DC29 DC-290
-10E2 Aptix Corp
-10E3 Tundra Semiconductor Corp.
- 0000 Universe/II VMEbus Bridge (CA91C042/142)
- 0108 Tsi108 Host Bridge for Single PowerPC
- 0148 PCI/X-to-VME Bridge (Tundra Tsi148)
- 0513 Dual-Mode PCI-to-PCI Bus Bridge (Tsi320)
- 0850 Power PC Dual PCI Host Bridge (Tsi850)
- 0854 Power PC Single PCI Host Bridge (Tsi850)
- 0860 CA91C860 Qspan PCI to Motorola Processor Bridge
- 0862 CA91L862A QSpan II PCI to Motorola Processor Bridge
- 8114 PCIe to PCI-X Bridge (Tsi384)
- 8260 PowerSpan II PowerPC-to-PCI Bus Switch (CA91L8200/8260)
- 8261 CA91L8200/8260 PowerSpan II PowerPC to PCI Bus Switch (Single PCI Bus)
- A108 Tsi109 Host Bridge for Dual PowerPC
-10E4 Tandem Computers
-10E5 Micro Industries Corp
-10E6 Gainbery Computer Products Inc
-10E7 Vadem
-10E8 Applied Micro Circuits Corp.
- 1072 INES GPIB-PCI (AMCC5920 based)
- 2011 Video Capture/Edit board (Q-Motion pci 264)
- 4750 S5930/33/35 "Matchmaker" PCI Controller
- 5920 S5920 32-Bit PCI Bus target interface
- 8001 S5933 Daktronics VMax transmitter Card
- 8033 Transputer Link Interface (BBK-PCI light)
- 8043 Myrinet LANai interface chip (LANai4.x)
- 8062 Parastation (S5933)
- 807D PCI44 (S5933)
- 8088 Kingsberg Spacetec Format Synchronizer (FS)
- 8089 Kingsberg Spacetec Serial Output Board (SOB)
- 809C Traquair HEPC3 (S5933)
- 80B1 Active ISDN Controller (Data Fire Basic 4MB PCI)
- 80B9 Some sort of Bridge? (PCI MATCHMAKER S5935QF)
- 80D7 Data Acquisition Card (ADLINK) (PCI-9112)
- 80D8 40MB/s 32-channels Digital I/O card (ADLINK) (PCI-7200)
- 80D9 Data Acquisition Card (ADLINK) (PCI-9118)
- 80DA PCI-9812
- 80FC APCI1500 Signal processing controller (16 dig. inputs + 16 dig. outputs)
- 811A PCI-IEEE1355-DS-DE interface (PCI-DSlink)
- 814C Fastcom ESCC-PCI (Commtech, Inc)
- 8170 Matchmaker PCI Chipset Development Tool (S5933QF)
- 81B7 S5933 AJAVideo NTV ITU-R.601 Video stillstore
- 81E6 Multimedia video controller
- 828D APCI3001 Signal processing controller (up to 16 analog inputs)
- 8291 Fastcom 232/8-PCI (Commtech, Inc)
- 82AF CQ2240 Data Aquisition Card
- 82C4 Fastcom 422/4-PCI (Commtech, Inc)
- 82C5 Fastcom 422/2-PCI (Commtech, Inc)
- 82C6 Fastcom IG422/1-PCI (Commtech, Inc)
- 82C7 Fastcom IG232/2-PCI (Commtech, Inc)
- 82CA Fastcom 232/4-PCI (Commtech, Inc)
- 82DB AJA HDNTV HD SDI Framestore
- 82E2 Fastcom DIO24H-PCI (Commtech, Inc)
- 8406 PCIcanx/PCIcan CAN interface [Kvaser AB]
- 8407 PCIcan II CAN interface (A1021, PCB-07, PCB-08) [Kvaser AB]
- 8851 S5933 on Innes Corp FM Radio Capture card
-10E9 Alps Electronic Corp. Ltd.
- 10E9 no (VID_044E&PID_3017)
-10EA Tvia Inc (Was: InterGraphics Systems (IGS))
- 1680 svga (IGA-1680)
- 1682 video (IGA-1682)
- 1683 IGA-1683
- 2000 TV output ram 2MB Cyberpro2010 (CyberPro 2010)
- 2010 vbcvbcvbcvb (CyberPro 20xx/2000A)
- 5000 CyberPro 5000
- 5050 CyberPro 5050
- 5202 CyberPro 5202
- 5252 CyberPro 5252
-10EB Artists Graphics
- 0101 64 bit graphics processor (3GA)
- 8111 Frame Grabber (Twist3)
-10EC Realtek Semiconductor
- 0139 ethernet 10/100 (rtl8139B)
- 0158 Realtek 5121 Driver Disk (Realtek 5121)
- 0260 Driver MS UAA for HD Audio (RTL260)
- 0261 261 High Definition Audio
- 0262 Realtek High Definition Audio (ALC882)
- 0268 Realtek 2+2 High Definition Audio (Realtek ALC268)
- 0269 Realtek High Definition Audio (I don't know about chip number)
- 0280 280 High Definition Audio
- 0660 High Definition Audio (Realtek HD Audio)
- 0662 Realtek 5.1 High Definition Audio (ALC662)
- 0861 Realtek High Definition Audio (ALC660)
- 0862 862 High Definition Audio
- 0880 Realtek 7.1 High Definition Audio (ALC880)
- 0882 Realtek 7.1+2 High Definition Audio (ALC882)
- 0883 Realtek 7.1+2 High Definition Audio (ALC883)
- 0885 8-channel High Definition Audio (ALC885)
- 0888 Realtek 7.1+2 High Definition Audio (ALC888)
- 8021 NIC (RTL8029AS)
- 8029 PCI Full-Duplex Ethernet Controller with PnP Function (RTL8029)
- 8119 32BIT Card Bus 10/100 (10EC-8119) (10)
- 8129 RT8129/8130 Fast Ethernet Adapter
- 8131 ethernet controller (LFE8139ATX)
- 8136 Realtek 10/100/1000 PCI-E NIC Family all in one NDIS Driver v5.728.0604.2009 06/04/2009 (Rtl8023)
- 8138 RT8139 (B/C) CardBus Fast Ethernet Adapter
- 8139 Realtek RTL8139 Family PCI Fast Ethernet NIC (RTL-8139/8139C/8139D)
- 8167 Realtek RTL8169/8110 Family Gigabit Ethernet NIC (RTL8169 / RTL8111B / RTL8111C)
- 8168 Gigabit Ethernet NIC(NDIS 6.0) (RTL8168/8111/8111c)
- 8169 Single Gigabit LOM Ethernet Controller (RTL8110)
- 8172 Realtek RTL8191SE wireless LAN 802.11N PCI-E NIC (RTL8191SE ?)
- 8180 RTL8180L IEEE 802.11b Wireless MAC and Baseband Processor
- 8185 IEEE 802.11a/b/g Wireless LAN Controller (rev 20) (RTL-8185)
- 8186 PCI Express Gigabit Ethernet controller (RTL8111/8168B)
- 8192 - (0280)
- 8197 Wireless 802.11b/g 54Mbps USB 2.0 Network Adapter (8187B)
- 8199 Single-Chip IEEE 802.11b/g WLAN Controller w/PCI Express Interface (RTL8187SE)
- 9876 GIGABIT ETHERNET LOM (RTL 8168/8111)
- 9877 GIGABIT ETHERNET LOM (RTL 8168/8111)
-10ED Ascii Corporation
- 7310 VGA Video Overlay Adapter (V7310)
-10EE Xilinx Corporation
- 0205 Wildcard TE205P
- 0210 Wildcard TE210P
- 0314 Communications Controller (Spartan XC2S50E)
- 0405 Wildcard TE405P (2nd Gen)
- 0410 Wildcard TE410P (2nd Gen)
- 3FC0 RME Digi96
- 3FC1 RME Digi96/8
- 3FC2 RME Digi 96/8 Pro
- 3FC3 RME Digi96/8 Pad (RME Digi96/8 Pad)
- 3FC4 RME Digi9652 Hammerfall DSP
- 3FC5 RME Digi9652 Hammerfall DSP
- 3FC6 RME Hammerfall DSP MADI
- 5343 Security Adapter (Seamont SC100)
- 8130 Virtex-II Bridge, XC2V1000-4FG456C (Durango PMC)
- 8381 Ellips Santos Frame Grabber
- A123 Spartan 3E (XA3S1600E)
- A124 XA3S1600E (Spartan 3E)
- D154 Copley Controls CAN card (PCI-CAN-02)
-10EF Racore Computer Products
- 8154 Token Ring Adapter (M815x)
-10F0 Curtiss-Wright Controls Embedded Computing
- A800 Graphics board (VCL-P)
- B300 graphics board (VCL-M)
-10F1 Tyan Computer
- 1566 IDE/SCSI
- 1677 Multimedia
- 2013 Conexant RS-56 PCI Modem (RS-56 sp-pci)
- 2865 Tyan Thunder K8E S2865
-10F2 Achme Computer Inc
-10F3 Alaris Inc
-10F4 S-MOS Systems
- 1300 PCI to S5U13x06B0B Bridge Adapter (rev1.1)
-10F5 NKK Corporation
- A001 NR4600 Bridge (NDR4000)
-10F6 Creative Electronic Systems SA
- 0111 CMI8738/C3DX Multimedia Audio Controller (PCIVEN)
-10F7 Matsushita Electric Industrial Corp Ltd
-10F8 Altos India Ltd
-10F9 PC Direct
-10FA TrueVision
- 0000 GUI Accelerator (BT848KPF)
- 0001 GUI Accelerator
- 0002 GUI Accelerator
- 0003 GUI Accelerator
- 0004 GUI Accelerator
- 0005 GUI Accelerator
- 0006 GUI Accelerator
- 0007 GUI Accelerator
- 0008 GUI Accelerator
- 0009 GUI Accelerator
- 000A GUI Accelerator
- 000B GUI Accelerator
- 000C Video Capture & Editing card (Targa 1000)
- 000D GUI Accelerator
- 000E GUI Accelerator
- 000F GUI Accelerator
- 0010 GUI Accelerator
- 0011 GUI Accelerator
- 0012 GUI Accelerator
- 0013 GUI Accelerator
- 0014 GUI Accelerator
- 0015 GUI Accelerator
-10FB Thesys Microelectronic's
- 186F TH 6255
-10FC I-O Data Device Inc.
- 0003 Cardbus IDE Controller
- 0005 Cardbus SCSI CBSC II
- 8139 10 (4020011B)
-10FD Soyo Technology Corp. Ltd.
- 7E50 -
-10FE Fast Multimedia AG
-10FF N-Cube
-1100 Jazz Multimedia
- 3044 IEEE1394 Firewire 3 Port PCI Card (VT6306L)
-1101 Initio Corporation
- 0002 Ultra SCSI Adapter (INI-920)
- 1060 Orchid Ultra-2 SCSI Controller (INI-A100U2W)
- 134A Ultra SCSI Adapter
- 1622 PCI SATA Controller (INIC1620)
- 9100 Fast Wide SCSI Controller (INI-9010/9010W)
- 9400 Fast Wide SCSI Controller (INIC-940)
- 9401 Fast Wide SCSI Controller (INIC-935)
- 9500 SCSI Initio ultra wide inci-950 (1101)
- 9502 pci sata controller (INIC-1620)
- 9700 Fast Wide SCSI Controller
-1102 Creative Technology LTD.
- 0002 Sound Blaster Live! (Also Live! 5.1) - OEM from DELL - CT4780 (CT5880DCQ)
- 0003 AWE64D OEM (CT4600) (EMU8008)
- 0004 Audigy Audio Processor (Creative SB Audigy 2 ZS (WDM))
- 0005 SoundBlaster X-FI XtremeMusic (SB0460)
- 0006 Soundblaster Live! 5.1 (SB0200) (emu10k1x)
- 0007 Device ID same for both, but Subsystem ID = 0x1012 - Extreme Audio, 0x100A - Audigy SE 7.1 (C6SB0410515017656A)
- 0008 sound blaster Audigy 2 (ca0108)
- 1017 3D Blaster Banshee PCI CT6760 (ct4830)
- 1020 3D Blaster RIVA TNT2 (NV5)
- 1047 3D Blaster Annihilator 2 (EV1938)
- 1371 ?
- 2898 es56t-p1 (es2898)
- 4001 Audigy IEEE1394a Firewire Controller (EMU10K1)
- 647D AC'97 Audio Device
- 7002 GamePort (EMU10K1)
- 7003 Creative Labs SB Audigy MIDI/Game port (EMU10K2 )
- 7004 Game port for SB Live! Series
- 7005 Audigy LS Series Game Port
- 7802 Environmental Audio (SB Live) (EMU1OK1-NGF)
- 8064 SB0100 (SBLive! 5.1 OEM)
- 8938 Sound (EV1938)
- 9838 Ectiva EV1938
-1103 Triones Technologies Inc. (HighPoint)
- 0003 HPT343/5/6,HPT363 UDMA EIDE Controller
- 0004 ATA Raid Controller/ATA 100 (HPT366/368/370/370A/372)
- 0005 PATA133 Raid Controller (HPT372/372N)
- 0006 HPT302N UDMA/ATA133 RAID Controller
- 0007 HPT371/N UDMA/ATA133 EIDE Controller
- 0008 HPT374 Rocket 154x/1640, RocketRAID 154x/1640 RAID EIDE Controller
- 0009 HPT372N UDMA/ATA133 RAID Controller (OEM)
- 1720 RR172x SATA Controller (RR172x)
- 1740 RR174x SATA Controller (RR174x)
- 1742 RR174x SATA Controller (RR174x)
- 2210 RR2210 SATA Controller (RR2210)
- 2300 RocketRAID 230x SATA Controller
- 2310 RocketRAID 231x SATA Controller
- 2320 RocketRAID 2320 SATA-II Controller
- 2322 RocketRAID 2322 SATA-II Controller
- 2340 RocketRAID 2340 16 Port SATA-II Controller
- 2522 RR252x SATA Controller (RR252x)
- 3120 RR312x SATA Controller (RR312x)
- 3220 RR322x SATA Controller (RR322x)
- 3320 RR332x SATA Controller (RR332x)
- 3410 RR341x SATA Controller (RR341x)
- 3510 RR35xx SATA Controller (RR35xx)
- 3511 RR35xx SATA Controller (RR35xx)
- 3520 RR35xx SATA Controller (RR35xx)
- 3521 RR35xx SATA Controller (RR35xx)
- 3522 RR35xx SATA Controller (RR35xx)
- 3540 RR35xx SATA Controller (RR35xx)
- 4320 RR432x SATA Controller (RR432x)
- 5081 RR18xx SATA Controller (RR18xx)
- 6081 RR222x/224x SATA Controller (RR222x/224x)
- 7042 RR231x SATA Controller (RR231x)
-1104 Rasterops
-1105 Sigma Designs Inc.
- 1105 REALmagic XCard MPEG 1/2/3/4 DVD Decoder
- 5000 Multimedia
- 8300 EM8300 MPEG-2 Decoder (REALmagic Hollywood Plus)
- 8400 MPEG-2 Decoder (EM8400)
- 8401 EM8401 REALmagic DVD/MPEG-2 A/V Decoder
- 8470 multimedia controller/A/V streaming processor (EM8470)
- 8471 EM8471 REALmagic DVD/MPEG-4 A/V Decoder
- 8475 EM8475 MPEG-1/2/4 Decoder Card for Video & Audio
- 8476 EM8476 REALmagic DVD/MPEG-4 A/V Decoder
- 8485 EM8485 REALmagic DVD/MPEG-4 A/V Decoder
- 8486 EM8486 REALmagic DVD/MPEG-4 A/V Decoder
- C622 EM8622L MPEG-4.10 (H.264) and SMPTE 421M (VC-1) A/V Decoder
- C623 Media Decoder SoC (EM8623L)
-1106 VIA Technologies, Inc.
- 0102 Embedded VIA Ethernet Controller
- 0130 VIA Fire 1394.A OHCI Link Layer Ctrlr (VT6305)
- 0198 P4X600 CPU to PCI Bridge
- 0204 K8M400 CPU to PCI Bridge
- 0208 PT890 Standard Host Bridge
- 0238 CPU to PCI Bridge (K8T890)
- 0258 PT880 CPU to PCI Bridge
- 0259 Host Bridge (CN400/PM880)
- 0269 CPU to PCI Bridge (KT880)
- 0282 CPU to PCI Bridge (K8T880Pro)
- 0290 K8M890 Standard Host Bridge
- 0293 PM896 Host Bridge
- 0296 P4M800 Standard Host Bridge
- 0305 VT8363/5 KT133/KM133 System Controller
- 0308 PT894 Standard Host Bridge
- 0314 CN700/VN800/P4M800CE/Pro Host Bridge
- 0324 CX700 Host Bridge
- 0327 P4M890 Standard Host Bridge
- 0336 K8M890CE Host Bridge
- 0340 PT900 Host Bridge
- 0351 VT3351 Host Bridge
- 0364 P4M900 Host Bridge
- 0391 VT8371 KX133 System Controller
- 0397 VIA High Definition Audio (VT1708S)
- 0501 VT8501 Apollo MVP4 System Controller
- 0505 VLB to PCI Bridge (82C505)
- 0561 VT82C570 MV IDE Controller (Single FIFO)
- 0571 Bus Master IDE Controller (VT82C686B/VT823x/A/C)
- 0576 VT82C57x MV System Controller
- 0581 Bus Master IDE Controller; CX700/VX700 RAID Controller
- 0585 VT82C585 Apollo VP,VPX,VPX-97 System Controller
- 0586 VT82C586/A/B PCI to ISA Bridge
- 0591 VIA VT8237A SATA RAID Controller (VT8237S)
- 0595 VT82C595 Apollo VP2,VP2-97 System Controller
- 0596 VT82C596/A/B "Mobile South" PCI to ISA Bridge
- 0597 VT82C597/597AT/598MVP Apollo VP3/MVP3 System Controller
- 0598 VT82C598MVP Apollo MVP3 System Controller
- 0601 VT8601 Apollo PLE133 CPU to PCI Bridge
- 0605 VT8605 ProSavage PM133 System Controller
- 0680 Apollo P6 (VT82C680)
- 0686 VT82C686/A/B "Super South" PCI to ISA Bridge
- 0691 VT82C691/693A/694X Apollo Pro/133/133A System Controller
- 0692 Apollo Pro/BX Chipset
- 0693 VT82C693 Apollo Pro Plus CPU to PCI Bridge
- 0698 VT82C693A Apollo Pro133 AGP
- 0926 VT86C926 Amazon NE2000-Compatible PCI Ethernet Controller
- 1000 VT82C570 MV System Controller
- 1106 VIA Sound VIA AC97 in VT82C686A/B, VIA AC97 in VT8233/AC, VT8235 & VT8237/R, VIA Vinyl audio VT1612A (060000A1106)
- 1107 ISA Bridge w/IDE (060000A)
- 1204 K8M400 CPU to PCI Bridge
- 1208 PT890 Standard Host Bridge
- 1238 CPU to PCI Bridge (K8T890)
- 1258 PT880 CPU to PCI Bridge
- 1259 CN400/PM880 CPU to PCI Bridge
- 1269 CPU to PCI Bridge (KT880)
- 1282 CPU to PCI Bridge (K8T880Pro)
- 1290 K8M890 Standard Host Bridge
- 1293 PM896 Host Bridge
- 1296 P4M800 Standard Host Bridge
- 1308 PT894 Standard Host Bridge
- 1314 CN700/VN800/P4M800CE/Pro Standard Host Bridge
- 1324 CX700 Host Bridge
- 1327 P4M890 Standard Host Bridge
- 1336 K8M890CE Host Bridge
- 1340 PT900 Host Bridge
- 1351 VT3351 Host Bridge
- 1364 P4M900 Host Bridge
- 1401 ISA Bridge w/IDE (060000A)
- 1571 IDE Controller (VT82C416)
- 1595 VT82C595 Apollo VP2,VP2-97 System Controller
- 1708 High Definition Audio controller (VIA VT1708 )
- 2006 VIA Rhine III VT6105M Fast Ethernet controller (VT6105M)
- 2106 VT6105 Rhine Family Fast Ethernet Adapter
- 2204 K8M400 CPU to PCI Bridge
- 2208 PT890 Standard Host Bridge
- 2238 CPU to PCI Bridge (K8T890)
- 2258 PT880 CPU to PCI Bridge
- 2259 Host Bridge (CN400/PM880)
- 2269 CPU to PCI Bridge (KT880)
- 2282 CPU to PCI Bridge (K8T880Pro)
- 2290 K8M890 Standard Host Bridge
- 2293 PM896 Host Bridge
- 2296 P4M800 Standard Host Bridge
- 2308 PT894 Standard Host Bridge
- 2314 CN700/VN800/P4M800CE/Pro Standard Host Bridge
- 2324 CX700 Host Bridge
- 2327 P4M890 Standard Host Bridge
- 2336 K8M890CE Host Bridge
- 2340 PT900 Host Bridge
- 2351 VT3351 Host Bridge
- 2364 P4M900 Host Bridge
- 287A VT8251 Standard PCI to PCI Bridge
- 287B VT8251 Standard PCI to PCIe Bridge
- 287C VT8251 Standard PCIe Root Port
- 287D VT8251 Standard PCIe Root Port
- 287E VT8251 Ultra VLINK Controller
- 3022 CLE266
- 3038 VT82xxxxx UHCI USB 1.1 Controller (All VIA Chipsets)
- 3040 VT83C572, VT86C586/A/B Power Management Controller
- 3041 ISA Bridge w/IDE (82C570MV)
- 3043 Rhine 10/100 Ethernet Adapter (VT86C100A)
- 3044 VT6306 VIA Fire II IEEE-1394 OHCI Link Layer Controller
- 3050 Power Management and SMBus Controller (VT82C596/596A/596)
- 3051 Power Management Controller
- 3053 Rhine III Management Adapter (VT6105M)
- 3057 ACPI Power Management Controller (VT82C686A/B)
- 3058 AC97 Audio Codec (All VIA Chipsets) (VT8275)
- 3059 VT8233/A AC'97 Enhanced Audio Controller
- 3065 Rhine II PCI Fast Ethernet Controller (VT6103)
- 3068 VIA MC97 controller for AC-Link modems (PCIVEN_1106&DEV_3068&SUBSYS_100B14FF&REV_803&267)
- 3074 PCI to ISA Bridge (VT8233)
- 3086 VT82C686 Power Management Controller (??)
- 3091 VT8633 Apollo Pro 266 CPU to PCI Bridge
- 3099 VT8366/A,VT8367 Apollo KT266/A,KT333 CPU to PCI Bridge
- 3101 VT8653 Apollo Pro 266T CPU to PCI Bridge
- 3102 VT8362 ProSavage KN133 CPU to PCI Bridge
- 3103 CPU to PCI Bridge (VT8615)
- 3104 VT6202/12 USB 2.0 Enhanced Host Controller
- 3106 Rhine III PCI Fast Ethernet Controller (VT6105M/LOM)
- 3107 PCI to ISA Bridge (VT8233/A AC97' Enhance Audio Controller)
- 3108 Via Unichrome S3 VGA - part of a VIA Northbridge (8380)
- 3109 PCI to ISA Bridge (VT8233/A AC97' Enhance Audio Controller)
- 3112 VT8361 Apollo KLE133 System Controller
- 3113 VPX/VPX2 PCI to PCI Bridge
- 3116 VT8375 ProSavageDDR PM266/KM266 CPU to PCI Bridge
- 3118 Via Built-In VGA S3 Graphics UniChrome Pro IGP Series CN400 (CN400)
- 3119 'Velocity' Gigabit Ethernet Controllers (VT6120/VT6121/VT6122)
- 3122 VT8623 Apollo CLE266 CastleRock AGP 8X Controller
- 3123 VT8623 Apollo CLE266 CastleRock CPU to PCI Bridge
- 3128 VT8753 Apollo P4X266 System Controller
- 3133 CPU to PCI Bridge (VT3133)
- 3147 PCI to ISA Bridge (VT8233)
- 3148 VT8751 ProSavageDDR P4M266 System Controller
- 3149 SATA RAID Controller (VT8237 Family/ VT6420)
- 3156 VT8372 ProSavageDDR PN266/KN266 CPU to PCI Bridge
- 3157 VIA/S3G Unichrome Pro IAGP (VIA VT8237)
- 3158 ProSavageDDR P4N266 CPU to PCI Bridge
- 3164 VIA VT6410 PATA/PATA RAID Controller (VT6410)
- 3168 P4X400 Host Controller/AGP Bridge (VT8374)
- 3177 PCI to ISA Bridge (VT8235)
- 3178 ProSavageDDR P4N333 CPU to PCI Bridge
- 3188 Apollo K8T800 CPU to PCI Bridge
- 3189 VT8377 Apollo KT400/A/600 CPU to PCI Bridge
- 3198 CPU-to-PCI Bridge (VEN_1106&DEV_B198&SUBSYS_00000000&REV_00)
- 3202 K8N400 CPU to PCI Bridge
- 3204 CPU to PCI Bridge (1394 i2c)
- 3205 CPU to PCI Bridge (PCIVEN_1106&DEV_3205&SUBSYS_00000000&REV_003&61A)
- 3208 CPU to PCI Bridge (PT890)
- 3209 P4M400 CPU to PCI Bridge
- 3213 VPX/VPX2 PCI to PCI Bridge
- 3218 K8T800M CPU to PCI Bridge
- 3227 PCI-to-ISA Bridge (VT8237)
- 3230 Integrated Graphics (K8M890CE & K8N890CE Display Driver)
- 3238 CPU-to-PCI Bridge (K8T890)
- 3249 VIA VT6421 RAID Controller - Windows XP 32.bit (VT6421)
- 324A CX700 PCI to PCI Bridge
- 324B CX700 Host Bridge
- 324E CX700 Internal Module Bus
- 3258 CPU-to-PCI Bridge (PT880)
- 3259 PM880 CPU to PCI Bridge
- 3260 VIA Chrome9 HC IGP
- 3269 CPU to PCI Bridge (KT880)
- 3282 CPU to PCI Bridge (K8T880Pro)
- 3287 VT8251 Standard PCI to ISA Bridge
- 3288 HDA Codec Realtek ALC660 (040300)
- 3290 K8M890 Standard Host Bridge
- 3296 P4M800 Standard Host Bridge
- 3324 CX700 Host Bridge
- 3327 P4M890 Host Bridge
- 3336 K8M890CE Host Bridge
- 3337 VT8237A Standard PCI to ISA Bridge
- 3340 PT900 Host Bridge
- 3343 VIA S3G UniChrome Family (81CE1043)
- 3344 VIA/S3G UniChrome Pro IGP (VT3314)
- 3349 VIA VT8251 AHCI RAID Controller (VT8251)
- 3351 VT3351 Host Bridge
- 3364 P4M900 Host Bridge
- 3371 VIA Chrome9 HC IGP (P4M900)
- 3372 VT8237S PCI to ISA Bridge
- 337A VT8237A Standard PCI to PCI Bridge
- 337B VT8237A Standard PCI to PCIe Bridge
- 4149 VT6420 ATA/ATAPI Host Controller
- 4204 K8M400 CPU to PCI Bridge
- 4208 PT890 Standard Host Bridge
- 4238 K8T890 CPU to PCI Bridge
- 4258 PT880 CPU to PCI Bridge
- 4259 CN400/PM880 CPU to PCI Bridge
- 4269 CPU to PCI Bridge (KT880)
- 4282 CPU to PCI Bridge (K8T880Pro)
- 4290 K8M890 Standard Host Bridge
- 4293 PM896 Host Bridge
- 4296 P4M800 Standard Host Bridge
- 4308 PT894 Standard Host Bridge
- 4314 CN700/VN800/P4M800CE/Pro Host Bridge
- 4324 CX700 Host Bridge
- 4327 P4M890 Host Bridge
- 4336 K8M890CE Host Bridge
- 4340 PT900 Host Bridge
- 4351 VT3351 Host Bridge
- 4364 P4M900 Host Bridge
- 5030 ACPI Power Management Controller (VT82C596)
- 5208 PT890 I/O APIC Interrupt Controller
- 5238 K8T890 I/O APIC Interrupt Controller
- 5287 Serial ATA Controller
- 5290 K8M890 I/O APIC Interrupt Controller
- 5308 Via I/O APIC Interrupt Controller (PT880 Pro / VT8237)
- 5324 CX700M2 Bus Master IDE Controller
- 5327 P4M890 I/O APIC Interrupt Controller
- 5336 K8M890CE I/O APIC Interrupt Controller
- 5337 Serial ATA Controller
- 5340 PT900 I/O APIC Interrupt Controller
- 5351 VT3351 I/O APIC Interrupt Controller
- 5364 P4M900 I/O APIC Interrupt Controller
- 5372 SATA Controller
- 6010 VT86C100A Rhine II Fast Etheenet Adapter (Error??)
- 6100 Rhine II PCI Fast SATA and ethernet controller (VIA VT86C100A)
- 6287 VT8251 AHCI Controller
- 6327 P4M890 Security Device
- 6340 Security Device
- 6364 P4M900 Security Device
- 7204 CPU to PCI Bridge (K8M400)
- 7205 VIA Technologies, Inc. VT8378 [S3 UniChrome] Graphics Adapter (KM400)
- 7208 PT890 Standard Host Bridge
- 7238 CPU to PCI Bridge (K8T890)
- 7258 CPU to PCI Bridge (PT880)
- 7259 CPU to PCI Bridge (PM880)
- 7269 CPU to PCI Bridge (KT880)
- 7282 CPU to PCI Bridge (K8T880Pro)
- 7290 K8M890 Standard Host Bridge
- 7293 PM896 Host Bridge
- 7296 P4M800 Standard Host Bridge
- 7308 PT894 Standard Host Bridge
- 7314 CN700/VN800/P4M800CE/Pro Host Bridge
- 7324 CX700 Host Bridge
- 7327 P4M890 Standard Host Bridge
- 7336 K8M890CE Host Bridge
- 7340 PT900 Host Bridge
- 7351 VT3351 Host Bridge
- 7353 SATA RAID (CX700)
- 7364 P4M900 Host Bridge
- 7372 SATA RAID (VT8237)
- 8208 PT890 (??) PCI to AGP Bridge
- 8231 PCI to ISA Bridge (VT8231)
- 8235 VT8235 Power Management Controller
- 8237 AC97 Enhanced Audio Controller - the 8251 controller is different (VT8237)
- 8305 VT8363/5 Apollo KT133/KM133 PCI to AGP Bridge
- 8324 CX700 PCI to ISA Bridge
- 8391 VT8371 Apollo KX133 PCI to AGP Bridge
- 8501 VT8501 Apollo MVP4 PCI to AGP Bridge
- 8596 VT82C596 Apollo Pro PCI to AGP Bridge
- 8597 VT82C597 Apollo VP3 PCI to AGP Bridge
- 8598 VT82C598MVP/694x Apollo MVP3/Pro133x PCI to AGP Bridge
- 8601 VT82C601 Apollo PLE133 CPU to AGP Bridge
- 8602 PCI to AGP Bridge
- 8605 VT8605 ProSavage PM133 CPU to AGP Bridge
- 8691 VT82C691/693A/694X Apollo Pro/133/133A PCI to PCI Bridge
- 8693 VT82C693 Apollo Pro Plus PCI to PCI Bridge
- 9238 I/O APIC (K8T890)
- 9398 2D/3D Graphics Accelerator (VT8601)
- 9530 Via MSP Cardreader driver (050100)
- 9876 PCI to ISA Bridge (VT8233/A AC97' Enhance Audio Controller)
- A208 PCI-to-PCI Bridge (PT890)
- A238 PCI-to-PCI Bridge (K8T890)
- A327 P4M890 PCI to PCI Bridge Controller
- A364 P4M900 PCI to PCI Bridge Controller
- B091 VT8633 Apollo Pro 266 CPU to AGP Controller
- B099 VT8366/A,VT8367 Apollo KT266/A,KT333 PCI to AGP Bridge
- B101 VT8653 Apollo Pro 266T CPU to AGP Controller
- B102 PCI-to-PCI Bridge (AGP) (VT8362)
- B103 PCI-to-PCI Bridge (AGP) (VT8615)
- B112 VT8361 Apollo KLE133 CPU to AGP Controller
- B113 VPX/VPX2 I/O APIC
- B115 VT8363/5 KT/KM133 CPU to AGP Controller
- B116 VT8375 ProSavageDDR PM266/KM266 PCI to AGP Bridge
- B133 CPU to AGP Controller (vt686b)
- B148 VT8751 ProSavageDDR P4M266 CPU to AGP Bridge
- B156 VT8372 ProSavageDDR PN266/KN266 PCI to AGP Bridge
- B158 PCI-to-PCI Bridge (AGP) (VIA Technologies Inc)
- B168 ProSavageDDR P4X333 CPU to AGP 2.0/3.0 Bridge
- B188 PCI-to-PCI Bridge (AGP 2.0/3.0) (3200+)
- B198 ProSavageDDR P4X600,Apollo KT400/A/600 CPU to AGP Bridge
- B213 VPX/VPX2 I/O APIC
- B999 K8T890 PCI Bridge
- C208 PCI-to-PCI Bridge (PT890)
- C238 PCI-to-PCI Bridge (K8T890)
- C327 P4M890 PCI to PCI Bridge Controller
- C340 PT900 PCI to PCI Bridge Controller
- C364 P4M900 PCI to PCI Bridge Controller
- D104 VT8237 Integrated Fast Ethernet Controller
- D208 PCI-to-PCI Bridge (PT890)
- D213 VPX/VPX2 PCI to PCI Bridge
- D238 PCI-to-PCI Bridge (K8T890)
- D340 PT900 PCI to PCI Bridge Controller
- E208 PCI-to-PCI Bridge (PT890)
- E238 PCI-to-PCI Bridge (K8T890)
- E340 PT900 PCI to PCI Bridge Controller
- F208 PCI-to-PCI Bridge (PT890)
- F238 PCI-to-PCI Bridge (K8T890)
- F340 PT900 PCI to PCI Bridge Controller
-1107 Stratus Computer
- 8576 PCI Host Bridge
-1108 Proteon Inc.
- 0100 P1690Plus-AA Single Port Token Ring Adapter
- 0101 P1690Plus-AB Dual Port Token Ring Adapter
- 0105 Token Ring Adapter (P1690Plus)
- 0108 Token Ring Adapter (P1690Plus)
- 0138 Token Ring Adapter (P1690Plus)
- 0139 Token Ring Adapter (P1690Plus)
- 013C Token Ring Adapter (P1690Plus)
- 013D Token Ring Adapter (P1690Plus)
-1109 Adaptec/Cogent Data Technologies
- 1400 EX110TX PCI Fast Ethernet Adapter (EM110TX)
-110A Siemens PC Systeme GmBH
- 0002 Piranha PCI-EIDE-Adapter (2 Port)
- 0005 Tulip-Controller, Power-Management, Switch Extender
- 0006 PINC
- 0015 Multiprocessor Interrupt Controller (MINT)
- 0017 PCI-WAN Adapter (SiemensCard PWAN)
- 001D Copernicus Management Controller
- 113C FPGA-CPTR Hardware Tracer for CP113C/CP113D
- 113E FPGA-CPTRE Hardware Tracer for CP113E
- 2101 Multichannel Network Interface Controller for HDLC (PEB 20321)
- 2102 DMA supported serial communication controller with 4 channels (PEB 20534)
- 2103 PEB 20324 MUNICH128X Multichannel NIC for HDLC + Extensions
- 2104 PSB 4600/4610 PCI Interface for Telephony Applications (PITA)
- 2106 PEB 20256E Multichannel NIC for HDLC/PPP (256 Channels)
- 2108 PEB 20256M E MUNICH256FM NIC for HDLC/PPP (256 Channels)
- 3141 PROFIBUS Communication Processor CP5611 A2 (01)
- 3160 MCCA Pentium-PCI Host Bridge Core ASIC
- 4033 EB400 ProfiNet Device-Kit (ERTEC400)
- 4942 FPGA I-Bus Tracer for MBD
- 6120 SZB6120 Multimedia Adapter
-110B CHROMATIC Research Inc / Xenon Microsystems
- 0001 Media Processor (Mpact)
- 0002 MPACT DVD decoder. (GM90C7110VX)
- 0004 Integrated video card (Mpact)
-110C Mini-Max Technology Inc
-110D ZNyX Corp
-110E CPU Technology
-110F Ross Technology
-1110 Powerhouse Systems
- 6037 Firepower Powerized SMP I/O ASIC
- 6073 Firepower Powerized SMP I/O ASIC
-1111 Caldera Systems Inc (Was: Santa Cruz Operation)
-1112 Osicom Technologies Inc.
- 2200 FDDI adapter (2200)
- 2300 Fast Ethernet adapter (2300)
- 2340 4 Port Fast Ethernet Adapter
- 2400 ATM adapter (2400)
-1113 Accton Technology Corporation
- 1211 Ethernet Controller 10/100 MBit (EN5030, EN5038)
- 1216 EN-5251 Based Fast Ethernet Adapter
- 1217 Ethernet Adapter (EN-2242)
- 5105 10Mbps Network Card
- 9211 Fast Ethernet Adapter (EN-1207D)
- 9511 0445tabgf16143.1 (SMC en5251be)
- 9876 Ethernet Controller/ drivers (EN5251BE)
-1114 Atmel Corp.
- 0506 802.11b Wireless Network Adaptor (AT76C506)
- 3202 TPM - Trusted Platform Module (AT97SC3202)
-1115 Dupont Pixel Systems Ltd
-1116 Media 100 Inc (Was: Data Translation)
- 0022 DT3001
- 0023 DT3002
- 0024 DT3003
- 0025 DT3004
- 0026 DT3005
- 0027 DT3001-PGL
- 0028 DT3003-PGL
-1117 Datacube Inc.
- 9500 Max-1C SVGA Card
- 9501 MaxPCI image processing board
-1118 Berg Electronics
-1119 ICP-Vortex Computersysteme GmbH
- 0000 PCI SCSI RAID Controller (GDT6000/6020/6050)
- 0001 PCI 1-channel SCSI RAID Controller (GDT6000/6010)
- 0002 PCI 1-channel SCSI RAID Controller (GDT6110/6510)
- 0003 PCI 2-channel SCSI RAID Controller (GDT6120/6520)
- 0004 PCI 3-channel SCSI RAID Controller (GDT6530)
- 0005 PCI 5-channel SCSI RAID Controller (GDT6550)
- 0006 Wide Ultra SCSI Controller (GDT6117/6517)
- 0007 Wide Ultra SCSI Controller (GDT6127/6527)
- 0008 Wide Ultra SCSI Controller (GDT6537)
- 0009 Wide Ultra SCSI Controller (GDT6557/6557-ECC)
- 000A Ultra SCSI Controller (GDT6115/6515)
- 000B Wide SCSI Controller (GDT6125/6525)
- 000C Wide SCSI Controller (GDT6535)
- 000D Wide SCSI Controller (GDT6555/6555-ECC)
- 0100 2 Channel Wide Ultra SCSI (GDT6117RP/6517RP)
- 0101 Wide Ultra SCSI HBA (GDT6127RP/6527RP)
- 0102 Wide Ultra SCSI HBA (GDT6537RP)
- 0103 Wide Ultra SCSI HBA (GDT6557RP)
- 0104 Ultra SCSI HBA (GDT6111RP/6511RP)
- 0105 Ultra SCSI HBA (GDT6121RP/6521RP)
- 0110 Wide Ultra SCSI HBA (GDT6117RD/6517RD)
- 0111 Wide Ultra SCSI HBA (GDT6127RD/6527RD)
- 0112 Wide Ultra SCSI HBA (GDT6537RD)
- 0113 Wide Ultra SCSI HBA (GDT6557RD)
- 0114 Ultra SCSI HBA (GDT6111RD/6511RD)
- 0115 Ultra SCSI HBA (GDT6127RD/6527RD)
- 0118 Wide Ultra2 SCSI HBA (GDT6x18RD)
- 0119 Wide Ultra2 SCSI HBA (GDT6x28RD)
- 011A Wide Ultra2 SCSI HBA (GDT6538RD/6638RD)
- 011B Wide Ultra2 SCSI HBA (GDT6558RD/6658RD)
- 0120 GDT6117RP2/6517RP2
- 0121 GDT6127RP2/6527RP2
- 0122 GDT6537RP2
- 0123 GDT6557RP2
- 0124 GDT6111RP2/6511RP2
- 0125 GDT6127RP2/6527RP2
- 0136 GDT 6113RS/6513RS
- 0137 Disk Array Controller (GDT 6x23RS)
- 0138 GDT 6118RS/6518RS/6618RS
- 0139 GDT 6128RS/6528RS/6628RS
- 013A IBM IXA - Integrated xSeries Adapter (GDT 6x38RS)
- 013B GDT 6558RS/6658RS
- 013C GDT 6533RS/6633RS
- 013D GDT 6543RS/6643RS
- 013E GDT 6553RS/6653RS
- 013F GDT 6563RS/6663RS
- 0166 GDT 7113RN/7513RN/7613RN
- 0167 GDT 7123RN/7523RN/7623RN
- 0168 64-bit PCI Wide Untra2 SCSI HBA (GDT7x18RN)
- 0169 64-bit PCI Wide Ultra2 SCSI HBA (GDT7x28RN)
- 016A 64-bit PCI Wide Ultra2 SCSI HBA (GDT7538RN/7638RN)
- 016B 64-bit PCI Wide Ultra2 SCSI HBA (GDT7558RN/7658RN)
- 016C GDT 7533RN/7633RN
- 016D GDT 7543RN/7643RN
- 016E GDT 7553RN/7653RN
- 016F GDT 7563RN/7663RN
- 01D6 GDT 4x13RZ
- 01D7 GDT 4x23RZ
- 01F6 GDT 8x13RZ
- 01F7 BtYVKixCnmzB
- 01FC GDT 8x33RZ
- 01FD GDT 8x43RZ
- 01FE GDT 8x53RZ
- 01FF GDT 8x63RZ
- 0210 Fibre Channel HBA (GDT6519RD/6619RD)
- 0211 Fibre Channel HBA (GDT6529RD/6629RD)
- 0260 64-bit PCI Fibre Channel HBA (GDT7519RN/7619RN)
- 0261 64-bit PCI Fibre Channel HBA (GDT7529RN/7629RN)
- 02F6 GDT8x22RZ Disk Array Controller
- 0300 GDT Rx Controller
-111A Efficient Networks Inc
- 0000 155P-MF1 (FPGA)
- 0002 155P-MF1 (ASCI)
- 0003 ATM Adapter (ENI-25P)
- 0005 SpeedStream ENI-30x0 ATM Adapter
- 0007 SpeedStream ADSL
-111B Teledyne Electronic Systems
-111C Tricord Systems Inc.
- 0001 Powerbis Bridge
-111D Integrated Device Technology Inc.
- 0001 NICStAR ATM Adapter (IDT77201/211)
- 0003 MICRO ABR SAR PCI ATM Controller (IDT77222/252)
- 0004 MICRO ABR SAR PCI ATM Controller (IDT77V252)
- 7608 IDT High Definition Audio CODEC (IDT Audio CODEC)
- 7618 SigmaTel High Definition Audio CODEC (STAC9227)
- 7634 IDT/Sigmae HDl Audio Driver v6.10.5939.0 05/06/2008 (IDT_Audiov5939)
- 7662 IDT/Sigmae HDl Audio Driver v6.10.5939.0 05/06/2008 (IDT_Audiov5939)
- 7675 92HD73C1 (92HD73C1)
- 76B2 IDT Audio (92HD71B7)
- 76D5 0x3649 (0x76D5)
-111E Eldec Corp
-111F Precision Digital Images
- 4A47 Video engine interface (Precision MX)
- 5243 Frame Capture Bus Interface
-1120 EMC Corp
-1121 Zilog
-1122 Multi-Tech Systems Inc
-1123 Excellent Design Inc
-1124 Leutron Vision AG
-1125 Eurocore
-1126 Vigra
-1127 FORE Systems Inc
- 0200 ForeRunner PCA-200 ATM Adapter
- 0210 PCA-200PC ATM Adapter
- 0250 ATM
- 0300 PCA-200EPC ATM Adapter
- 0310 ATM
- 0400 ATM Adapter (ForeRunner HE)
-1129 Firmworks
-112A Hermes Electronics Co Ltd
-112B Linotype - Hell AG
-112C ZENITH DATA Systems
-112D Ravicad
-112E Infomedia Microelectronics
- 0000 EIDE/hdd and IDE/cd-rom Ctrlr
- 000B EIDE/hdd and IDE/cd-rom Ctrlr
-112F Imaging Technlogy Inc
- 0000 MVC IC-PCI
- 0001 Video Frame Grabber / Processor
-1130 Computervision
- F211 USB Audio Sound Card (0x010)
-1131 Animation Technologies Inc
- 1001 BlueTooth Adapter ISSCBTA [Tripper USB Dongle] (bm05e )
- 1131 01384E42y8
- 1201 VPN IPSEC coprocessor (PTD3000)
- 1234 EHCI USB 2.0 Controller
- 1301 SSL Accelerator (PTD3210)
- 1562 EHCI USB 2.0 Controller (ISP1561)
- 2780 TV deflection controller (TDA2780AQ)
- 3400 UCB1500 Modem Device
- 3401 Multimedia Audio Device (UCB1500)
- 5400 Multimedia processor (TriMedia TM1000/1100)
- 5402 Media Processor (TriMedia TM-1300EH)
- 5406 TriMedia PNX1700
- 7130 PCI video broadcast decoder (SAA7130HL)
- 7133 Phillips TV7131 WDM video capture (Phillips TV7131 WDM video capture)
- 7134 SAA7134HL Multimedia Capture Device
- 7135 SAA???? Multimedia Device(??)
- 7145 SAA7145 Multimedia PCI Bridge
- 7146 PCIVEN_1131&DEV_7130&SUBSYS_D1091461&REV_013&61AAA01&0&60 (saa7146)
- 7160 PCIVEN_13D0&DEV_2103&SUBSYS_210313D0&REV_024&1AF1648C&0&10F0 (Philips SAA7134E, TDA10046 and TDA8275A)
- 7162 SAA7162 Hybrid Capture Device
- 9730 Ethernet controller (SAA9730)
-1132 Mitel Corp
-1133 Eicon Networks Corp (Was: Eicon Technology)
- 7711 EiconCard C91
- 7901 EiconCard S90
- 7902 EiconCard S90
- 7911 EiconCard S91
- 7912 EiconCard S91
- 7941 EiconCard S94
- 7942 EiconCard S94
- 7943 EiconCard S94
- 7944 EiconCard S94
- 7945 EiconCard S94
- 7948 EiconCard S94 64-bit/66MHz
- 9711 EiconCard C91 rev 2.0
- B921 EiconCard P92
- B922 EiconCard P92
- B923 EiconCard P92
- E001 DIVA Pro 2.0 S/T
- E002 DIVA 2.0 S/T
- E003 DIVA Pro 2.0 U
- E004 chip (DIVA 2.0 U)
- E005 Eicon ISDN card using Siemens IPAC chip (DIVA 2.01 S/T)
- E006 Diva CT S/T PCI
- E007 Diva CT U PCI
- E008 Diva CT Lite S/T PCI
- E009 Diva CT Lite U PCI
- E00A Diva ISDN+V.90 PCI
- E00B Eicon ISDN card using Infineon chip (DIVA ISDN 2.02 PCI)
- E00C Diva 2.02 PCI U
- E00D Diva ISDN Pro 3.0 PCI
- E00E Diva ISDN+CT S/T PCI Rev 2
- E010 DIVA Server BRI-2M (Maestra)
- E011 Diva Server BRI 2.0
- E012 DIVA Server BRI-8M (MaestraQ)
- E013 DIVA Server 4BRI/PCI (MaestraQ-U)
- E014 DIVA Server PRI-30M (MaestraP)
- E015 Diva Server PRI-30M PCI v.2
- E016 Diva Server Voice 4BRI PCI
- E017 Diva Server Voice 4BRI PCI Rev 2
- E018 DIVA Server BRI-2M/-2F (00)
- E019 DIVA Server Voice PRI 2.0 PCI
- E01A Diva Server 2FX
- E01B Diva Server BRI-2M Voice Revision 2
- E01C Diva Server PRI Rev 3.0
- E01E Diva Server 2PRI
- E020 Diva Server 4PRI
- E022 Diva Server Analog-2P
- E024 Diva Server Analog-4P
- E028 Diva Server Analog-8P
- E02A Diva Server IPM-300
- E02C Diva Server IPM-600
-1134 Mercury Computer Systems Inc.
- 0001 audio driver (3059)
- 0002 Dual PCI to RapidIO Bridge (DPRB)
- 9876 aodio driver (3059)
-1135 Fuji Xerox Co Ltd
- 0001 Printer Controller
-1136 Momentum Data Systems
-1137 Cisco Systems Inc
-1138 Ziatech Corporation
- 8905 STD 32 Bridge (8905)
-1139 Dynamic Pictures Inc
- 0001 VGA Compatable 3D Graphics
-113A FWB Inc
-113B Network Computing Devices
-113C Cyclone Microsystems Inc.
- 0000 i960 Bridge (PCI9060)
- 0001 i960 Bridge / Evaluation Platform (PCI9060)
- 0911 i960Jx I/O Controller (PCI911)
- 0912 i960Cx I/O Controller (PCI912)
- 0913 i960Hx I/O Controller (PCI913)
- 0914 I/O Controller with secondary PCI bus (PCI914)
-113D Leading Edge Products Inc
-113E Sanyo Electric Co
-113F Equinox Systems
- 0808 Adapter (SST-64P)
- 1010 Adapter (SST-128P)
- 80C0 SST-16P Adapter
- 80C4 SST-16P Adapter
- 80C8 SST-16P Adapter
- 80D0 SST-16P Adapter
- 8888 SST-4P Adapter
- 9090 SST-8P Adapter
-1140 Intervoice Inc
-1141 Crest Microsystem Inc
- 0001 EIDE/ATAPI super adapter
-1142 Alliance Semiconductor
- 3210 ProMotion 3210(6410?) VGA and AVI Playback Accelerator
- 6410 GUI Accelerator (6410 6422)
- 6412 GUI Accelerator
- 6420 GUI Accelerator
- 6422 ProMotion-6422 (ProMotion-6422)
- 6424 ProMotion AT24 GUI Accelerator (ProVideo 6424)
- 6425 0752 20005 (ProMotion AT25)
- 6426 GUI Accelerator
- 643D ProMotion-AT3D (AT25)
- 9876 139K76B 9808 (ProMotion 6422)
-1143 Netpower Inc
-1144 Vickers Inc/Cincinnati Milacron
- 0001 Noservo Controller
-1145 Workbit Corp
- 8007 NinjaSCSI-32 Workbit
- F)21 HDCClassName=
- F007 NinjaSCSI-32 KME
- F010 NinjaSCSI-32 Workbit
- F012 NinjaSCSI-32 Logitec
- F013 NinjaSCSI-32 Logitec
- F015 NinjaSCSI-32 Melco
- F020 CardBus ATAPI Host Adapter
- F021 CardBus CompactFlash Adapter (NPATA32)
- F024 CardBus CompactFlash Adapter (NPATA-32)
-1146 Force Computers
-1147 Interface Corp
- 1123 131dq
-1148 Marvell Semiconductor Germany GmbH
- 4000 FDDI adapter (SK-NET)
- 4200 Token Ring Adapter
- 4300 SK-NET Gigabit Ethernet Adapter (SysKonnect Genesis)
- 4320 SysKonnect Gigabit Ethernet SK-98xx Version 2.0 (Marvell Yukon D-Link DGE530T)
- 4362 Marvell Yukon 88E8053 based Ethernet Controller (88E8053)
- 4400 SK-9Dxx Gigabit Ethernet Adapter
- 4500 SK-9Mxx Gigabit Ethernet Adapter
- 9000 PCI-X 10/100/1000Base-T Server (Marvell Yukon II PCI-X)
- 9843 [Fujitsu] Gigabit Ethernet
- 9E00 PCI Express 10/100/1000Base-T Desktop (Marvell Yukon EC)
-1149 Win System Corp
-114A VMIC
- 5565 Ultrahigh-Speed Fiber-Optics Reflective Memory w/ Interrupts (VMIPCI-5565)
- 5579 Reflective Memory Card (VMIPCI-5579)
- 5587 VMIPCI-5587 Reflective Memory Card
- 5588 VMICPCI5588 Reflective Memory Card (VMICPCI5588)
- 6504 VMICPCI-7755 FPGA
- 7587 VMIVME-7587
-114B Canopus Co Ltd
-114C Annabooks
-114D IC Corporation
- 2189 PCTel HSP56 PCI Modem (0x1002114D)
-114E Nikon Systems Inc
-114F Digi International
- 0002 AccelePort EPC/X
- 0003 RightSwitch SE-6
- 0004 driver (AccelePort Xem)
- 0005 AccelePort Xr EIA-232
- 0006 AccelePort C/X
- 0007 Digi Data Fire PCI 1 S/T (DataFire PCI 1 S/T)
- 0009 AccelePort Xr/J EIA-232
- 000A AccelePort EPC/X
- 000C DataFirePRIme T1 (1-port)
- 000D SyncPort 2-Port (x.25/FR)
- 0011 AccelePort 8r EIA-232 (IBM)
- 0012 AccelePort 8r EIA-422
- 0013 AccelePort Xr EIA-232
- 0014 AccelePort 8r EIA-422
- 0015 AccelePort Xem
- 0016 AccelePort EPC/X
- 0017 AccelePort C/X
- 0019 Datafire PCI 1 U (Multifunction)
- 001A DataFirePRIme E1 (1-port)
- 001B AccelePort C/X (IBM)
- 001D T1/E1/PRI (DataFire RAS)
- 001F ClydeNonCsu6034
- 0020 ClydeNonCsu6032
- 0021 ClydeNonCsu4
- 0022 ClydeNonCsu2
- 0023 AccelePort RAS
- 0024 DataFire RAS B4 ST/U
- 0026 AccelePort 4r 920
- 0027 AccelePort 8r 920
- 0028 ClassicBoard 4
- 0029 DigiClassic PCI
- 0034 AccelePort 2r 920
- 0035 T1/E1/PRI, Compact PCI (DataFire DSP)
- 0040 AccelePort Xp
- 0042 AccelePort 2p PCI
- 0043 AccelePort 4p
- 0044 AccelePort 8p
- 0045 AccelePort 16p
- 004E AccelePort 32p
- 0070 Datafire Micro V IOM2 (Europe)
- 0071 Datafire Micro V (Europe)
- 0072 Datafire Micro V IOM2 (North America)
- 0073 Datafire Micro V (North America)
- 0081 DataFire SYNC 2000 2P Adapter
- 00B0 Digi Neo 4
- 00B1 Digi Neo 8
- 00C8 Digi Neo 2 DB9
- 00C9 Digi Neo 2 DB9 PRI
- 00CA Digi Neo 2 RJ45
- 00CB Digi Neo 2 RJ45 PRI
- 00D0 ClassicBoard 4 422
- 00D1 ClassicBoard 8 422
- 5012 DataFire Sync/570i 2P PCI Adapter
- 5013 DataFire Sync/570i 4P PCI Adapter
- 6001 Avanstar
-1150 Thinking Machines Corp
-1151 JAE Electronics Inc
-1152 Megatek
-1153 Land Win Electronic Corp
-1154 Melco Inc
-1155 Pine Technology Ltd
- 0810 486 CPU/PCI Bridge
- 0922 Pentium CPU/PCI Bridge
- 0926 PCI/ISA Bridge
-1156 Periscope Engineering
-1157 Avsys Corp
-1158 Voarx R&D Inc
- 3011 Tokenet/vg 1001/10m anylan
- 9050 Lanfleet/Truevalue
- 9051 Lanfleet/Truevalue
-1159 MuTech Corp
- 0001 MV-1000
- 0002 Frame Grabber (MV-1500)
-115A Harlequin Ltd
-115B Parallax Graphics
-115C PHOTRON Ltd
-115D Xircom
- 0003 Cardbus Ethernet 10/100+Modem 56 (RBEM56G-100)
- 0005 CardBus Ethernet 10/100
- 0007 CardBus Ethernet 10/100
- 000B CardBus Ethernet 10/100
- 000C Mini-PCI V.90 56k Modem (MPCI 3A56GSP-100 PA)
- 000F CardBus Ethernet 10/100
- 0016 MPCI Modem 56
- 0022 MPCI Modem 56
- 0029 MPCI Modem 56
- 002B Winmodem built into NEC Versa VXi
- 0076 Xircom MPCI3B-56G (Lucent SCORPIO) Soft
- 00D3 Xircom MPCI Modem 56
- 00D4 Modem 56k (MPCI)
- 0101 CardBus 56k Modem (Ms0612006303)
- 0103 CardBus Ethernet + 56k Modem
- 0104 RealPort2 CardBus Modem 56
-115E Peer Protocols Inc
-115F MAXTOR Corp
-1160 Megasoft Inc
-1161 PFU Ltd
- 0001 Host Bridge
-1162 OA Laboratory Co Ltd
-1163 mohamed alsherif
- 0001 3D Blaster (Verite 1000)
- 2000 Rendition V2200 (BLITZ 2200 AGP) (Rendition V2200 (1179-002))
-1164 Advanced Peripherals Tech
-1165 Imagraph Corporation
- 0001 Motion JPEG Recorder/Player with Audio
-1166 ServerWorks (Was: Reliance Computer Corp)
- 0000 CMIC-LE
- 0005 PCI to PCI Bridge, bus/dev/func 0/0/1 (NB6536 (CNB20-LE))
- 0006 Host Bridge, function 2 and function 3 (NB6536 (CNB20-HE))
- 0007 CPU to PCI Bridge (NB6635 (CNB20-LE/HE))
- 0008 Hostbridge & MCH, bus/dev/func 0/0/0 (NB6536 (CNB20-HE))
- 0009 AGP interface (NB6536 (CNB20-LE))
- 0010 CIOB30
- 0011 CMIC-HE
- 0012 CMIC-LE
- 0013 CNB20-HE CPU to PCI Bridge & MCH
- 0014 Host Bridge (CNB20-HE)
- 0015 CMIC-GC CPU to PCI Bridge & MCH
- 0016 Host Bridge (CMIC-GC)
- 0017 CMIC-SL
- 0031 HT1100 HPX0 HT Host Bridge
- 0036 HT1000 PCI/PCI-X bridge
- 0101 CIOB-X2
- 0103 EPB PCIe to PCI-X Bridge
- 0104 HT1000 PCI/PCI-X bridge
- 0110 I/O Bridge with Gigabit Ethernet ServerWorks Grand Champion (CIOB-E)
- 0130 HT1000 PCI-X bridge
- 0132 HT1000 PCIe bridge
- 0140 HT2100 PCIe Bridge
- 0141 HT2100 PCIe Bridge
- 0142 HT2100 PCIe Bridge
- 0144 HT2100 PCI-Express Bridge
- 0200 PCI to ISA Bridge (OSB4)
- 0201 CSB5 PCI to ISA Bridge
- 0203 PCI to ISA Bridge (CSB6)
- 0205 HT1000 Legacy South Bridge
- 0211 OSB4 PCI EIDE Controller
- 0212 CSB5 PCI EIDE Controller
- 0213 OSB6/CSB6 PCI EIDE Controller
- 0214 HT1000 Legacy IDE controller
- 0217 PCI EIDE Controller (Tertiary) (OSB6)
- 021B HT1100 HD Audio
- 0220 OpenHCI Compliant USB Controller (OSB4)
- 0221 OHCI Compliant USB Controller (OSB6)
- 0223 USB controller (0x0223)
- 0225 PCI Bridge (CSB5)
- 0227 PCI Bridge (CSB6)
- 0230 PCI to ISA Bridge
- 0234 HT1000 LPC Bridge
- 0235 Keypad Controller
- 0236 Local Display Controller
- 0237 NVRAM Controller
- 0238 BCM5785 [HT1000] WDTimer
- 0240 K2 SATA
- 0241 8-Channel RAIDCore SATA RAID Host Bus Adapter (BC4852)
- 0242 RAIDCore BC4000
- 024A Broadcom/Serverworks HT1000 SATA Controller (HT1000)
- 024B BCM5785 (HT1000) PATA/IDE Mode
- 0406 HT1100 PCI-X Bridge
- 0408 HT1100 Legacy Device
- 040A HT1100 ISA-LPC Bridge
- 0410 HT1100 SATA Controller (Native SATA Mode)
- 0411 HT1100 SATA Controller (PATA / IDE Mode)
- 0412 HT1100 USB OHCI Controller
- 0414 HT1100 USB EHCI Controller
- 0416 HT1100 USB EHCI Controller (with Debug Port)
- 0420 HT1100 PCI-Express Bridge
- 0421 HT1100 SAS/SATA Controller
- 0422 HT1100 PCI-Express Bridge
-1167 Mutoh Industries Inc
-1168 Thine Electronics Inc
-1169 Centre for Development of Advanced Computing
- 0102 32 Channel Digital Input Card Interface (QL5032)
- 0202 16 Channel Digital Output, 16 Channel Digital Input Interface (QL5032)
- 0302 32 Channel Analog Input Interface (QL5032)
- 0402 16 Channel Analog Output / Analog Input Interface (QL5032)
- 0502 8 Channel Timer Counter Interface (QL5232)
- 0902 PCI to TigerSHARC FPGA Interface (QL5232)
- 2001 PCI to C-DAC RTU bus interface FPGA (Ql5032-33APQ208C)
-116A Polaris Communications
- 6100 BUS/Tag Channel
- 6800 Escon Channel
- 7100 Bus/Tag Channel
- 7800 Escon Channel
-116B Connectware Inc
-116C Intelligent resources
-116D Martin-Marietta
-116E Electronics for Imaging
- 0015 Fiery EX2000D RIP Card Melbourne VX120 (VX120)
- 0500 Printer ASIC (Vx500)
-116F Workstation Technology
-1170 Inventec Corp
-1171 Loughborough Sound Images
-1172 Altera Corporation
- 0001 S CCA5000243A (EPF6016ATC144-2)
- 0004 Multi-serial card (-epf6016qc240-2)
- 0007 Altera FPGA board (StratixIIGX)
- D4AA Arria GX (EP1AGX90EF1152C6N)
-1173 Adobe Systems
-1174 Bridgeport Machines
-1175 Mitron Computer Inc
-1176 One Stop Systems (Was: SBE Inc; Bought out)
- 8474 Conexant Multichannel Synchronous Communications Controller (MUSYCC) (42000133)
-1177 Silicon Engineering
-1178 Alfa Inc
- AFA1 Fast Ethernet Adapter
-1179 Toshiba America Information Systems
- 0102 Extended PCI IDE Controller (toshiba america info systems)
- 0103 Extended PCI IDE Controller Type-B
- 0404 DVD Decoder Card
- 0406 Video Capture device (Tecra a2)
- 0407 DVD Decoder Card (Version 2)
- 0601 Toshiba CPU to PCI bridge (0555873412)
- 0602 PCI to ISA Bridge for Notebooks
- 0603 PCI to CardBus Bridge for Notebooks (ToPIC95)
- 0604 PCI to PCI Bridge for Notebooks
- 0605 PCI to ISA Bridge for Notebooks
- 0606 PCI to ISA Bridge for Notebooks
- 0609 PCI to PCI Bridge for Notebooks
- 060A Toshiba ToPIC95 CardBus Controller (ToPIC95B)
- 060F CardBus Controller (ToPIC97)
- 0611 PCI to ISA Bridge
- 0617 PCI to CardBus Bridge with ZV support (ToPIC100)
- 0618 CPU to PCI and PCI to ISA Bridge
- 0701 PCI Communication Device (vt82c693)
- 0804 Toshiba Smart Media Host Controller (0x0804)
- 0805 SD Card Controller (PCIVEN_1179&DEV_0805&SUBSYS_FF001179&REV_03 )
- 0D01 FIR Port Type-O (0x0D01)
- 13A8 Multi-channel PCI UART (XR17C158/154/152)
-117A A-Trend Technology
-117B LG (Lucky Goldstar) Electronics Inc.
- 8320 USB DEVICE (NOFM12)
-117C Atto Technology
- 0030 Ultra320 SCSI Host Adapter
-117D Becton Dickinson
-117E T/R Systems
- 0001 Printer Host
-117F Integrated Circuit Systems
-1180 Ricoh Co Ltd
- 0465 RL5c465 CardBus Controller
- 0466 RL5c466 CardBus Controller
- 0475 Cardbus Controller (RL5c592)
- 0476 Ricoh R/RL/5C476(II) (unknown)
- 0477 RL5c477 CardBus Controller
- 0478 Cardbus Controller (RB5c478)
- 0511 R5C511
- 0522 R5C522 IEEE-1394 Controller
- 0551 R5C551 IEEE-1394 Controller
- 0552 FireWire (IEEE 1394) Controller (R5C552)
- 0554 R5C554
- 0575 SD Bus Host Adapter
- 0576 SD Bus Host Adapter
- 0592 Ricoh Memory Stick Host Controller (13171043)
- 0811 R5C811
- 0822 SDA Standard Compliant SD Host Controller (R5C832)
- 0832 IEEE 1394 (4 pin firewire) chip) (30CF103C)
- 0841 R5C841 CardBus/SD/SDIO/MMC/MS/MSPro/xD/IEEE1394
- 0843 Ricoh SD/MMC Host Controller (R5C853)
- 0852 http://driverzone.com/device.php?id=51441 (01cf1028)
- 5551 IEEE 1394 Controller (Unknown)
- E230 Ricoh PCIe Memory Stick Host Controller (R5U230)
- E832 Ricoh PCIe IEEE1394 Fireware Host Controller (R5U832)
-1181 Telmatics International
-1183 Fujikura Ltd
-1184 Forks Inc
-1185 Dataworld International Ltd
- 8929 EIDE Controller
-1186 D-Link System Inc
- 0100 DEC DC21041-Based Ethernet Adapter
- 1002 Fast Ethernet Adapter (DFE-550TX/580TX/DFE-550FX)
- 1025 DWL-G650 AirPlus Xtreme G Adapter
- 1026 DWL-AG650 AirXpert Wireless CardBus Adapter
- 1043 DWL-AG650 AirXpert Wireless CardBus Adapter
- 1100 Fast Ethernet Adapter (driv16c003206)
- 1300 DFE-528TX/530TX+/538TX Fast Ethernet Adapter (DL 10038C Chipset)
- 1301 Fast Ethernet Adapter (DGE-528T )
- 1340 Fast Ethernet CardBus PC Card (DFE-690TXD)
- 1405 DFE-520TX Fast Ethernet PCI Adapter
- 1541 DFE-680TXD CardBus PC Card
- 1561 CardBus PC Card (DRP-32TXD)
- 2027 DWL-G520 AirPlus Xtreme G Adapter
- 3065 D-Link DFE-500Tx PCI fast Ethernet adapter Re v.A (14001186)
- 3106 Fast Ethernet Adapter (DFE 530TX+ rev E1)
- 3203 DWL-G520 AirPlus Xtreme G Adapter
- 3300 IEEE 802.11g PCI card (D-Link Air Wireless Network (DWL-G510))
- 3A03 DWL-A650 AirPro Wireless CardBus Adapter(rev.B)
- 3A04 DWL-AB650 AirPro Multimode Wireless CardBus Adapter
- 3A05 DWL-AB520 AirPro Multimode Wireless PCI Adapter
- 3A07 DWL-AG650 AirXpert Wireless CardBus Adapter
- 3A08 DWL-AG520 AirXpert Wireless PCI Adapter
- 3A10 DWL-AG650 AirXpert Wireless CardBus Adapter(rev.B)
- 3A11 DWL-AG520 AirXpert Wireless PCI Adapter(rev.B)
- 3A12 DWL-G650 AirPlus Wireless CardBus Adapter(rev.C)
- 3A13 DWL-G520 AirPlus Wireless PCI Adapter(rev.B)
- 3A14 DWL-AG530 AirPremier Wireless PCI Adapter
- 3A63 DWL-AG660 AirXpert Wireless CardBus Adapter
- 3B00 D-LINK DWL-650+ (0x3b001186)
- 3B05 DWL-G650+ CardBus PC Card
- 3C09 Ralink RT61 (DWL-G510 Version C1)
- 4000 Gigabit Ethernet Adapter (DL2000)
- 4001 D Link Fast Ethernet PCMCIA Card (DFE-650TX)
- 4300 Used on DGE-528T Gigabit adaptor (dlg10086)
- 4346 DGE-560SX Single Fiber Gigabit Ethernet PCI-E Adapter V.A1
- 4B00 DGE-560T PCIe Gigabit Ethernet Adapter
- 4B01 DGE-530T V.B1 Gigabit Ethernet Adapter (rev 11)
- 4B02 DGE-560SX PCIe Gigabit Ethernet Adapter
- 4B03 DGE-550T Gigabit Ethernet Adapter V.B1
- 4C00 Gigabit Ethernet Adapter (DGE-530T)
- 8400 DWL-650+ CardBus PC Card
-1187 Advanced Technology Laboratories
-1188 Shima Seiki Manufacturing Ltd
-1189 Matsushita Electronics Co
- 1592 VL/PCI Bridge
-118A Hilevel Technology
-118B Hypertec Pty Ltd
-118C Corollary Inc
- 0014 C-bus II to PCI bus host bridge chip (PCIB)
- 1117 MAC-94C201B3 Profusion Memory Controller Chip [Xeon 8-way SMP]
-118D BitFlow Inc
- 0001 Raptor-PCI framegrabber (n/a)
- 0012 Road Runner Frame Grabber (Model 12)
- 0014 Road Runner Frame Grabber (Model 14)
- 0024 Road Runner Frame Grabber (Model 24)
- 0044 Road Runner Frame Grabber (Model 44)
- 0112 Road Runner Frame Grabber (Model 12)
- 0114 Road Runner Frame Grabber (Model 14)
- 0124 Road Runner Frame Grabber (Model 24)
- 0144 Road Runner Frame Grabber (Model 44)
- 0212 Road Runner Frame Grabber (Model 12)
- 0214 Road Runner Frame Grabber (Model 14)
- 0224 Road Runner Frame Grabber (Model 24)
- 0244 Road Runner Frame Grabber (Model 44)
- 0312 Road Runner Frame Grabber (Model 12)
- 0314 Road Runner Frame Grabber (Model 14)
- 0324 Road Runner Frame Grabber (Model 24)
- 0344 Road Runner Frame Grabber (Model 44)
-118E Hermstedt GmbH
- 0042 ?
- 0142 ?
- 0242 ?
- 0342 ?
- 0440 ?
- 0442 ?
- 0842 ?
-118F GREEN LOGIC
-1190 Tripace
- 2550 Single Chip Ultra (Wide) SCSI Processor (TC-2550)
- C721 EIDE
- C731 PCI Ultra (Wide) SCSI Adapter (TP-910/920/940)
-1191 Acard Technology Corp.
- 0001 EIDE Adapter
- 0002 UltraDMA33 EIDE Controller (AEC6210UF) (ATP850UF)
- 0003 SCSI Cache Host Adapter
- 0004 ATP8400 UltraDMA33 EIDE (Cache??) Controller (AEC6210UF)
- 0005 UltraDMA33 EIDE Controller (AEC6210UF) (ATP850UF)
- 0006 ATP860A UltraDMA66 EIDE Controller, NO-BIOS (AEC6260)
- 0007 UltraDMA66 EIDE Controller (AEC6260) (ATP860R)
- 0008 2CH PCI UltraDMA133 IDE Controller (ATP865)
- 0009 2CH PCI UltraDMA133 IDE Controller (ATP865)
- 000A ACARD AEC-6885/6895/6896 RAID Controller (aec6885)
- 000B ACARD AEC-6897/6898 RAID Controller (AEC6897/6898)
- 000D 2S1P PCI-X SATA(3G)/UDMA Combo Controller (ATP8620)
- 8001 ATP8600 SCSI-2 RAID (Cache??) Host Adapter (AEC6820U)
- 8002 SCSI-2 Host Adapter (AEC6710L/F/s) (ATP850S)
- 8010 ATP870 Ultra Wide SCSI Contoller (AEC6712UW)
- 8020 ATP870 Ultra SCSI Controller (AEC6712U)
- 8030 ATP870 SCSI Controller (AEC6710S/6712S)
- 8040 ATP870 SCSI Controller (AEC6710D)
- 8050 AEC6712SUW SCSI Controller
- 8060 SCSI Host Adapter (AEC671x)
- 8081 PCI Ultra160 LVD/SE SCSI Adapter (AEC-67160)
- 808A AEC67162 PCI Ultra3 LVD/SE Controller (ATP885)
-1192 Densan Co Ltd
-1193 Zeitnet
- 0001 ZN1221 ATM Adapter
- 0002 ZN1225 ATM Adapter
-1194 Toucan Technology
-1195 Ratoc System Inc
-1196 Hytec Electronics Ltd
-1197 Gage Applied Sciences Inc
- 010C 8-bit 2GS/s Analog Input Card (CompuScope 82G)
-1198 Lambda Systems Inc
-1199 Attachmate Corp.
- 0001 IRMA 3270 PCI Adapter
- 0002 Advanced ISCA PCI Adapter
- 0201 SDLC PCI Adapter
-119A Mindshare Inc
-119B Omega Micro Inc.
- 1221 PCI PCMCIA bridge (82C092G)
-119C Information Technology Institute
-119D Bug Sapporo Japan
-119E Fujitsu Microelectronics Ltd.
- 0001 FireStream 155 ATM adapter (MB86697)
- 0003 FireStream 50 ATM adapter (MB86695)
-119F Bull Hn Information Systems
-11A0 Convex Computer Corp
-11A1 Hamamatsu Photonics K.K.
-11A2 Sierra Research and Technology
-11A3 Deuretzbacher GmbH & Co ENG. KG
-11A4 Barco Graphics NV
-11A5 MicroUnity Systems Engineering Inc
-11A6 Pure Data Ltd
-11A7 Power Computing Corp
-11A8 Systech Corp.
- 7302 NTX-8023-PCI 2MB Long Card
- 7308 NTX-8023-PCI 8MB Long Card
- 7402 NTX-8023-PCI 2MB Short Card
- 7408 NTX-8023-PCI 8MB Short Card
-11A9 InnoSys Inc.
- 4240 pci matchmaker 9622qac (AMCC S5933Q)
-11AA Actel
-11AB Marvell Semiconductor (Was: Galileo Technology Ltd)
- 0146 GT-64010/A System Controller for R4xxx/5000 Family CPUs
- 11AB Gigabit Ethernet Controler (88E8055 PCI-E)
- 138F W8300 802.11 Adapter
- 13F8 802.11 Adapter (W8300)
- 1FA6 The Libertas WLAN 802.11b/g (88W8300)
- 1FA7 88W8310 and 88W8000G Libertas 802.11g Chipset
- 1FAA Marvell Libertas 802.11b/g Wireless (8335)
- 1FAB Libertas 802.11b/g Wireless LAN Client Adapter
- 2A01 Libertas 802.11a/b/g Wireless Controller (CB55)
- 2A30 PCI-Express 802.11bg Wireless (88W8687)
- 4320 Yukon 88E8001/8003/8010 PCI Gigabit Ethernet Controller (Copper)
- 4340 Yukon 88E8021 PCI-X IPMI Gigabit Ethernet Controller
- 4341 Yukon 88E8022 PCI-X IPMI Gigabit Ethernet Controller
- 4342 Yukon 88E8061 PCI-E IPMI Gigabit Ethernet Controller
- 4343 Yukon 88E8062 PCI-E IPMI Gigabit Ethernet Controller
- 4344 Yukon 88E8021 PCI-X IPMI Gigabit Ethernet Controller
- 4345 Yukon 88E8022 PCI-X IPMI Gigabit Ethernet Controller
- 4346 Yukon 88E8061 PCI-E IPMI Gigabit Ethernet Controller
- 4347 Yukon 88E8062 PCI-E IPMI Gigabit Ethernet Controller
- 4350 Yukon PCI-E Fast Ethernet Controller (88E8036)
- 4351 Yukon PCI-E Fast Ethernet Controller (88E8036)
- 4352 Marvell Yukon 88E8038 PCI-E Fast Ethernet Controller (88E8038)
- 4353 Gigabit (88E8039 - http://www.marvell.com/drivers/driverDis)
- 4354 Marvell Yukon 88E8040 PCI-E Fast Ethernet Controller (88E8040)
- 4355 Marvell Yukon 88E8040T PCI-E Fast Ethernet Controller (88E8040T)
- 4356 Yukon 88EC033 PCI-E Fast Ethernet Controller
- 4357 marvell ethernet lan (0)
- 4360 Yukon PCI-E ASF Gigabit Ethernet Controller (88E8050)
- 4361 Yukon 88E8050 PCI-E ASF Gigabit Ethernet Controller
- 4362 Marvell Yukon 88E8053 PCI-E Gigabit Ethernet Controller (88E8053)
- 4363 Yukon PCI-E Gigabit Ethernet Controller (88E8055)
- 4364 Yukon PCI-E Gigabit Ethernet Controller (88E8056)
- 4365 Yukon 88E8070 PCI-E Gigabit Ethernet Controller
- 4366 Yukon 88EC036 PCI-E Gigabit Ethernet Controller
- 4367 Yukon 88EC032 based Ethernet Controller
- 4368 Yukon 88EC034 based Ethernet Controller
- 4369 Yukon 88EC042 PCI-E Gigabit Ethernet Controller
- 436A Yukon 88E8058 PCI-E Gigabit Ethernet Controller
- 436B Yukon 88E8071 PCI-E Gigabit Ethernet Controller
- 436C Marvell 8072 Ethernet Nic (88E8072)
- 4380 Marvell Yukon 88E8057 PCI-E Gigabit Ethernet Controller (88e8057)
- 4611 System Controller (GT-64115)
- 4620 System Controller for R5000 & R7000 (64-bit PCI) (GT-64120)
- 4801 GT-48001 8-port Switched Ethernet Controller
- 4809 GT-48300 4-port (2.4Gb each) Crossbar Switch
- 5005 Belkin F5D5005 Gigabit Desktop Network PCI Card
- 5040 4-port SATA I PCI-X Controller (88SX5040)
- 5041 4-port SATA I PCI-X Controller (88SX504)
- 5080 MV88SX5080 8-port SATA PCI-X Controller
- 5081 MV88SX5081 8-port SATA PCI-X Controller
- 6041 Marvell Technology Group Ltd. MV88SX6041 4-port SATA II PCI-X Controller (rev 03) (MV88SX6041)
- 6042 MV88SX6042 4-port SATA II PCI-X Controller
- 6081 MV88SX6081 8-port SATA II PCI-X Controller
- 6101 PATA 133 One Channel (88SE6101)
- 6111 6111 SATA2 Controller
- 6120 6120 SATA2 Controller
- 6121 6121 SATA2 Controller
- 6122 6122 SATA2 Controller
- 6140 6140 SATA2 Controller
- 6141 6141 SATA2 Controller
- 6145 Add-on IC to provide 4x SATA Ports, attached to ICH7 (SthBridge?) via PCI-Express. (88SE6145)
- 6320 System Controller for PowerPC Processors (GT-64130/131)
- 6440 64xx/63xx SAS
- 6460 MV64360/64361/64362 System Controller
- 6480 MV64460/64461/64462 System Controller
- 6485 System Controller for PowerPC Processors, Revision B (MV6446x)
- 7042 MV88SXxxxx Family 4-port SATA II PCIe Controller (??)
- 9653 Advanced Communication Controller (GT-96100A)
- F003 Primary Image Piranha Image Generator (GT-64010)
- F004 Primary Image Barracuda Image Generator (GT64120)
- F006 Primary Image Cruncher Geometry Accelerator (GT-64120A)
- FFFF PATA2SATA/SATA2PATA Bridge (88SA8040)
-11AC Canon Information Systems
-11AD Lite-On Communications Inc
- 0001 LC82C168 Fast Ethernet Adapter (??)
- 0002 NETGEAR FA310TX Fast Ethernet PCI Adapter (LC82C169C)
- C115 PNIC II PCI MAC/PHY (LC82C115)
-11AE Scitex Corporation Ltd
- 4153 Bridge Controller
- 5842 Bridge Controller
-11AF Pro-Log Corp/AVID Technology Inc
- 0001 Cinema (9704)
- 000A Nitris
- 000B Nitris DX / Mojo DX
-11B0 V3 Semiconductor Inc
- 0001 i960 Local Bus to PCI Bridge (V960PBC/PSC)
- 0002 i960Jx Local Bus to PCI Bridge (V961PBC/PSC)
- 0004 i960Cx/Hx Local Bus to PCI Bridge (V962PBC/PSC)
- 0010 Am29K Local Bus to PCI Bridge (V292PBC/PSC)
- 0021 i960Sx Local Bus to PCI Bridge (V363EPC)
- 0022 i960Jx Local Bus to PCI Bridge (V363EPC)
- 0024 i960Cx/Hx Local Bus to PCI Bridge (V363EPC)
- 0030 Am29K Local Bus to PCI Bridge (V363EPC)
- 0100 V320USC PCI System Controller for 32-bit MIPS CPUs (9 bit SYSCMD Bus)
- 0101 V320USC PCI System Controller for 32-bit MIPS CPUs (5 bit SYSCMD Bus)
- 0102 V320USC PCI System Controller for Super-H SH3 CPU
- 0103 V320USC PCI System Controller for Super-H SH4 CPU
- 0200 V370PDC High Perf. SDRAM Controller & I/O Control Unit
- 0292 V292PBC Am29030/40 PCI Bridge
- 0500 V340HPC PCI System Controller for 64-bit MIPS CPUs
- 0960 i960 Bridges for i960 Processors (V96xPBC)
- C960 i960 Dual PCI Bridge (V96DPC)
-11B1 Apricot Computers
-11B2 Eastman Kodak
-11B3 Barr Systems Inc
-11B4 Leitch Technology International
-11B5 Radstone Technology Ltd.
- 0001 1553 Bus Interface Card (PMC/PMX1553)
- 0002 FLASH memory Card (PMCF1)
- 0003 Multi Media Adapter (PMCMMA)
- 0004 Video Graphics Overlay (PMCVGO)
- 0005 PPzero Slave Interface Card (PMCPCIS)
- 0006 PPzero Master Interface Card (PMCPCIM)
- 0007 Serial/1553 Interface Card (PMCQ1)
- 0008 Intelligent Serial/Ethernet Card (EPMCQ2)
- 0009 Parallel I/O Module (PMCPIO1)
- 000A Fibre Channel Adapter (PMCFA1C)
- 000B High Speed DSP Gateway Module (PMCHH1)
- 000C Memory Adaptor Module (PMCMA2)
- 0012 FLASH memory Card (V2) (PMCF1)
- 0013 1553 Bus Interface Card (PMC1553EX)
- 0014 1553 Bus Interface Card (PMC1553E)
- 2200 Dual Fibre Channel Adapter (PMCFA2C)
-11B6 United Video Corp
-11B7 Motorola
-11B8 Xpoint Technologies Inc
- 0001 Quad PeerMaster
-11B9 Pathlight Technology Inc.
- C0ED SSA Controller
-11BA Videotron Corp
-11BB Pyramid Technology/DAPHA Electronics Corp
-11BC Network Peripherals Inc
- 0001 PCI FDDI (NPI NuCard)
-11BD Pinnacle Systems Inc
- 0015 rob2d (660806-2.0)
- 1158 spcialit lectronique et informatique
- 11BD maintenance informatique
- BEBE MAINTENANCE INFORMATIQUE VENTE DE CONSOMABLE (51015777)
- BEDE MB87J3560 (51011810)
-11BE International Microcircuits Inc
-11BF Astrodesign Inc
-11C0 Hewlett Packard
-11C1 Lucent/Agere Systems (Was: AT&T MicroElectronics)
- 0420 CardBus 56k Modem
- 0440 Data+Fax+Voice+DSVD (LT Winmodem 56k)
- 0441 LT WinModem 56k Data+Fax
- 0442 LT WinModem 56K Data+Fax (1646T00)
- 0443 1646T00 (LT Winmodem)
- 0444 845G (LT Winmodem)
- 0445 LT WinModem
- 0446 PCIVEN_10DE&DEV_0446&SUBSYS_73691462&REV_A13&267A616A&0&09 (LT Winmodem)
- 0447 windowsme (LT Winmodem)
- 0448 SV2P2 (LT Winmodem 56k)
- 0449 0449144F (LT Winmodem 56k)
- 044A LT WinModem 56k
- 044B LT WinModem
- 044C 9M56PML-G (LT Winmodem)
- 044D LT WinModem
- 044E LT WinModem 56k Data+Fax or Agere F-1156IV/A3
- 044F LT V.90+DSL WildFire Modem (90094-1)
- 0450 LT Winmodem 56K (1456VQH19R-1(INT))
- 0451 LT WinModem 56k Data+Fax+Voice+DSVD (LT Winmodem)
- 0452 1513144 (LT Winmodem)
- 0453 LT WinModem
- 0454 LT WinModem
- 0455 LT WinModem
- 0456 LT WinModem
- 0457 LT WinModem
- 0458 Mars 3 Mercury v.92 v.44 (1648C)
- 0459 LT WinModem
- 045A LT WinModem
- 045B LT WinModem
- 045C LT WinModem
- 045D mars2 (LT WinModem)
- 0461 V90 Wildfire Modem
- 0462 56K.V90/ADSL Wildwire Modem (1690)
- 0464 Lucent Wildwire v.90 + DSL modem (This is NOT a Riptide! (as previously stated))
- 0480 56k.V90/ADSL Wildfire Modem (Venus Winmodem)
- 048B creative modem blaster di5733-1 (1648T00)
- 048C net-comm modem (1648c-tv5)
- 048D 9m56pml-g (lt winmodem)
- 048E 56k V.92modem (svp92pl-t00)
- 048F Agere PCI Soft Modem. SV92PL (SV92P-T00)
- 0540 ?
- 0600 SV92P-T00 Agere PCI Soft Modem. SV92PL (sv92p2)
- 0620 Agere PCI Soft Modem (SV92PP)
- 1040 VEN_11C1&DEV_1040&SUBSYS_11790001 (Prespa)
- 11C1 VEN_11C1&DEV_0620&SUBSYS_11790001&REV_1002 (Prespa)
- 3026 Agere Systems HDA Modem (0x11c11040)
- 5400 FPSC FPGA with 32/64bit, 33/66MHz core (OR3TP12)
- 5801 USB Open Host Controller
- 5802 2-port PCI-to-USB OpenHCI Host Ctrlr (USS-312MC)
- 5803 USS-344 Quadrabus 4-port OpenHCI USB Host Controller
- 5805 USB Advanced Host Controller (uss344)
- 5811 1394A PCI PHY/Link Open Host Ctrlr I/F (FW322)
- 5901 firewire chip for macbook pro (unknown)
- 7121 ?
- 9876 LT WinModem 56K Data+Fax (lucent 1646T00)
- AB10 WL60010 Wireless LAN MAC
- AB11 WL60040 Multimode Wireles LAN MAC
- AB20 PCI Wireless LAN Adapter (WaveLAN)
- AB21 Wireless PCI Adapter
- AB30 Mini-PCI WaveLAN a/b/g (wlsam48d)
- ED00 ET-131x PCI-E Gigabit Ethernet Adapter
- ED01 ET-1301 PCI-E Fast Ethernet Adapter
-11C2 Sand Microelectronics
-11C3 NEC Corp
-11C4 Document Technologies Industries
-11C5 Shiva Corp
-11C6 Dainippon Screen MFG Co Ltd
- 3001 VM-1200 Opto Unit Controller
-11C7 D.C.M. Data Systems
-11C8 Dolphin Interconnect Solutions
- 0658 32 bit , 33 Mhz PCI-SCI Bridge (PSB 32)
- AB34 802.11b MiniPCI Wireless Card
- D665 64 bit , 33 Mhz PCI-SCI Bridge (PSB64)
- D667 64 bit , 66 Mhz PCI-SCI Bridge. (D33x) (PSB66)
-11C9 Magma
- 0010 16-line serial port w/- DMA
- 0011 4-line serial port w/- DMA
-11CA LSI Systems Inc
-11CB Specialix International Ltd.
- 2000 port small IC (PCI-9050-1100083-11)
- 4000 XIO/SIO Host (SUPI-1)
- 8000 Bridge RIO Host (T225)
- 9501 SPEED4+ PCI Adapter
- 9511 SPEED4+ PCI Adapter Local Bus
-11CC Michels & Kleberhoff Computer GmbH
-11CD HAL Computer Systems Inc
-11CE Primary Rate Inc
- 102B FF00102B (1001)
-11CF Pioneer Electronic Corp
-11D0 Loral Frederal Systems - Manassas
-11D1 AuraVision Corporation
- 01F7 PCI Video Processor (VxP524)
- 01F8 PCI Video Processor (VxP524)
- 01F9 tuner card (rev_03)
-11D2 Intercom Inc
-11D3 Trancell Systems Inc
-11D4 Analog Devices, Inc.
- 1535 Blackfin DSP PCI Bus Interface (ADSP-21535)
- 1805 Motorola SM56 PCI Speakerphone Modem
- 1807 56k Winmodem Chip
- 1884 SoundMAX Integrated Digital HD Audio (AD1884HD)
- 1889 Sound Chip (AD1980)
- 194A SoundMAX Integrated Digital Audio (AD1984A)
- 1981 SoundMAX Integrated Digital Audio (8086)
- 1983 SoundMAX Integrated Digital HD Audio (AD1983HD)
- 1984 Analog Devices ADI 198x Integrated HD Audio (Analog Devices ADI 198x)
- 1986 SoundMAX Integrated Digital HD Audio (AD198b)
- 1988 HD Audio Codec (AD1988A)
- 198B AD1988B HD (AD1988B)
- 2192 DSP Microcomputer (function *0) (ADSP-2192)
- 219A DSP Microcomputer (function *1) (ADSP-2192)
- 219E DSP Microcomputer (function *2) (ADSP-2192)
- 2F44 SafeNet Crypto Accelerator chip (ADSP-2141)
- 989B AD1989B HD Audio Codec (AD1989B)
-11D5 Tahoma Technology
- 0115 Versatec Parallel Interface (VPI) + Centronics (10115)
- 0116 DR11-W emulator (10118)
- 0117 Versatec Parallel Interface (VPI) + Centronics (10117)
- 0118 DR11-W emulator (10118)
-11D6 Tekelec Technologies
-11D7 Trenton Terminals Inc
-11D8 Image Technologies Development
-11D9 TEC Corp
-11DA Novell
- 2000 Virtual-Bus / AlacrityVM bridge
-11DB SEGA Enterprises Ltd
- 1234 Dreamcast Broadband Adapter
-11DC Questra Corp
-11DD Crosfield Electronics Ltd
-11DE Zoran Corporation
- 6057 ZR36057/36067 MotionJPEG/TV Card
- 6067 zoran (zr36067pqc)
- 6120 MPEG VideoBVPSXI Capture Card (ZR36120PQC)
- 6O57 ZORAN PCI Bridge (interface for transferring video across the PCI bus) (ZR36057PQC)
- 9876 ?
-11DF New Wave PDG
-11E0 Cray Communications A/S
-11E1 Gec Plessey Semiconductors Inc
-11E2 Samsung Information Systems America
-11E3 Quicklogic Corp
- 5030 PC Watchdog
-11E4 Second Wave Inc
-11E5 IIX consulting
-11E6 Mitsui-Zosen System Research
-11E7 Toshiba America, Electric Company
-11E8 Digital Processing Systems Inc
-11E9 Highwater Designs Ltd
-11EA Elsag Bailey
-11EB Formation Inc
-11EC Coreco Inc
- 2064 ?
-11ED Mediamatics
-11EE Dome Imaging Systems Inc
-11EF Nicolet Technologies B.V.
-11F0 Compu-Shack GmbH
- 4231 FDDI Network Card
- 4232 PCIVEN_8086&DEV_4232&subsys_12018086&rev_004&b04cce1&0&00e1 (FASTline UTP Quattro)
- 4233 FASTline FO
- 4234 FASTline UTP
- 4235 FASTline-II UTP
- 4236 FASTline-II FO
- 4731 Gigabit Ethernet Adapter (GIGAline)
-11F1 Symbios Logic Inc
-11F2 Picture Tel Japan K.K.
-11F3 Keithley Metrabyte
-11F4 Kinetic Systems Corporation
- 2915 2915
-11F5 Computing Devices International
-11F6 Powermatic Data Systems Ltd
- 0112 ReadyLink ENET100-VG4 (ATT2MD11)
- 0113 FreedomLine 100
- 1401 ReadyLink RL2000 Ethernet Adapter (Winbond W89C940)
- 2011 ReadyLink RL100ATX/PCI Fast Ethernet Adapter (TXA9882)
- 2201 ReadyLink 100TX (Winbond W89C840) (TXA9883)
- 9881 ReadyLink RL100TX Fast Ethernet Adapter (TXA9881?)
-11F7 Scientific Atlanta
-11F8 PMC-Sierra Inc.
- 7364 PM7364 FREEDM-32 Frame Engine and Datalink Manager
- 7366 PM7366 FREEDM-8 Frame Engine and Datalink Manager
- 7367 PM7367 FREEDM-32P32 Frame Engine and Datalink Manager
- 7375 LASAR-155 ATM SAR (PM7375)
- 7380 PM7380 FREEDM-32P672 Frame Engine and Datalink Manager
- 7382 PM7382 FREEDM-32P256 Frame Engine and Datalink Manager
- 7384 PM7384 FREEDM-84P672 Frame Engine and Datalink Manager
- 8000 6G SAS/SATA Controller (PM8000 SPC)
- 8010 6G SAS/SATA RAID Controller (PM8010 SRC)
-11F9 I-CUBE Inc
-11FA Kasan Electronics Company Ltd
-11FB Datel Inc
-11FC Silicon Magic
-11FD High Street Consultants
-11FE Comtrol Corp
- 0001 RocketPort 32-port
- 0002 RocketPort 8-port
- 0003 RocketPort 16-port
- 0004 RocketPort 4-port
- 0005 RocketPort 8-port
- 0006 RocketPort 8-port
- 0007 RocketPort 4-port
- 0008 RocketPort 8-port
- 0009 RocketPort 16-port
- 000A RocketPort 4-port
- 000B RocketPort 8-port
- 000C RocketPort 6-port
- 000D RocketPort 4-port
- 000E RocketPort 2-port
- 000F RocketPort 2-port
- 0040 RocketPort Infinity Octa, 8port, RJ45
- 0041 RocketPort Infinity 32port, External Interface
- 0042 RocketPort Infinity 8port, External Interface
- 0043 RocketPort Infinity 16port, External Interface
- 0044 RocketPort Infinity Quad, 4port, DB
- 0045 RocketPort Infinity Octa, 8port, DB
- 0047 RocketPort Infinity 4port, RJ45
- 004F RocketPort Infinity 2port, SMPTE
- 0052 RocketPort Infinity Octa, 8port, SMPTE
- 0801 RocketPort UPCI 32 port w/external I/F
- 0802 RocketPort UPCI 8 port w/external I/F
- 0803 RocketPort UPCI 16 port w/external I/F
- 0805 RocketPort UPCI 8 port w/octa cable
- 080C RocketModem III 8 port
- 080D RocketModem III 4 port
- 0812 RocketPort UPCI Plus 8 port RS422
- 0903 RocketPort Compact PCI 16 port w/external I/F
- 8015 4-port UART 16954 (RocketPort)
-11FF Scion Corp
-1200 CSS Corp
-1201 Vista Controls Corp
-1202 Network General Corp
- 0001 PCI ATM Adapter (NAIATMPCI)
- 4300 Gigabit Ethernet Adapter
-1203 Bayer Corp, Agfa Division
-1204 Lattice Semiconductor Corp
-1205 Array Corp
-1206 Amdahl Corp
-1208 Parsytec GmbH
- 4853 HS-Link Device
-1209 SCI Systems Inc
- 0100 PLX PCI BRIDGE (PCI 9054)
-120A Synaptel
-120B Adaptive Solutions
-120C Technical Corp
-120D Compression Labs Inc
-120E Cyclades Corporation
- 0100 Multiport Serial Card (Cyclom-Y)
- 0101 Multiport Serial Card (Cyclom-Y)
- 0102 Multiport Serial Card (Cyclom-4Y)
- 0103 Multiport Serial Card (Cyclom-4Y)
- 0104 Multiport Serial Card (Cyclom-8Y)
- 0105 Multiport Serial Card (Cyclom-8Y)
- 0200 Cyclom-Z below 1Mb Intelligent Serial Card
- 0201 Cyclom-Z above 1Mb Intelligent Serial Card
- 0300 PC300 RX 2
- 0301 PC300 RX 1
- 0302 PC300 TE 2
- 0303 teclado (PC300 TE 1)
- 0310 PC300 TE 2
- 0311 PC300 TE 1
- 0320 PC300/TE-M (2 ports)
- 0321 PC300/TE-M (1 port)
- 0400 PC400
-120F Essential Communications
- 0001 Roadrunner
-1210 Hyperparallel Technologies
-1211 Braintech Inc
-1212 Kingston Technology Corp
-1213 Applied Intelligent Systems Inc
-1214 Performance Technologies Inc
-1215 Interware Co Ltd
-1216 Purup Prepress A/S
- 0003 PTM400 PCI Taxi Module (188A2L432B)
-1217 O2 Micro Inc
- 00F7 1394 Open Host Controller Interface (0x00f71217)
- 6729 PCI to PCMCIA Bridge (OZ6729)
- 673A PCI to PCMCIA Bridge (OZ6730)
- 6832 CardBus Controller (OZ6832/3)
- 6836 CardBus Controller (OZ6836/6860)
- 6872 CardBus Controller (OZ6812)
- 6925 CardBus Controller (OZ6922)
- 6933 OZ6933/711E1 SmartCardBus Controller
- 6972 OZ6912/711E0 SmartCardBus Controller
- 7110 MemoryCardBus Accelerator (OZ711Mx)
- 7112 OZ711EC1/M1 SmartCardBus MultiMediaBay Controller
- 7113 SmartCardBus Contoller (0Z711EC1)
- 7114 OZ711M1 SmartCardBus MultiMediaBay Controller
- 7120 O2Micro Integrated MMC/SD controller (Unknown device)
- 7130 O2Micro Integrated MMC/SD/MS/xD/SM Controller (0000000A)
- 7134 MemoryCardBus Controller 6-in-1 (OZ711MP1/MS1)
- 7135 MemoryCardBus Contoller (OZ711EZ1)
- 7136 O2Micro CardBus Controller (OZ711SP1)
- 71E2 OZ711E2 SmartCardBus Controller
- 7212 OZ711M2 SmartCardBus MultiMediaBay Controller
- 7213 OZ6933E CardBus Controller
- 7222 pci to pcmcia bridge (unknow)
- 7223 OZ711M3 SmartCardBus MultiMediaBay Controller
- 7233 OZ711MP3/MS3 MemoryCardBus Controller
-1218 Hybricon Corp
-1219 First Virtual Corp
-121A 3Dfx Interactive Inc
- 0001 Voodoo 3D Acceleration Chip (Voodoo)
- 0002 Voodoo 2 3D Accelerator (Voodoo2)
- 0003 Voodoo Banshee (Voodoo Banshee)
- 0004 VooDoo Banshee [Velocity 100]
- 0005 All Voodoo3 chips, 3000 (Voodoo3)
- 0007 Voodoo4
- 0009 Voodoo4/5
- 0010 Rev.A AGPx4, 0.25, 200/2x200 core/RAM (Rampage)
- 0057 Voodoo 3/3000 [Avenger]
-121B Advanced Telecommunications Modules
-121C Nippon Texaco Ltd
-121D Lippert Automationstechnik GmbH
-121E CSPI
-121F Arcus Technology Inc
-1220 Ariel Corporation
- 1220 AMCC 5933 TMS320C80 DSP/Imaging Board (9622qac)
- 4242 controller audio multimediale
-1221 Contec Co Ltd
-1222 Ancor Communications Inc
-1223 Emerson Network Power, Embedded Computing
- 0001 Real-Time Processing Blade in a standard single-slot AdvancedTCA formfactor (KatanaQp)
- 0002 Intel Pentium-M based AMC Module (KosaiPM)
- 0003 PM/Link
- 0004 PM/T1
- 0005 PM/E1
- 0008 PM/SLS
- 0009 BajaSpan Resource Target
- 000A BajaSpan Section 0
- 000B BajaSpan Section 1
- 000C BajaSpan Section 2
- 000D BajaSpan Section 3
- 000E PM/PPC
- 0044 Memory controller (Memory controller)
-1224 Interactive Images
- 1000 Plum Audio, Video and VTR Controller (CL560?)
-1225 Power I/O Inc
-1227 Tech-Source
- 0006 Raptor GFX 8P
-1228 Norsk Elektro Optikk A/S
-1229 Data Kinesis Inc
-122A Integrated Telecom
-122B LG Industrial Systems Co Ltd
-122C Sican GmbH
-122D Aztech System Ltd
- 1206 Asus (ICH2)
- 4201 AMR 56K modem (MR2800W)
- 50DC PCI168/3328 Audio Device
- 80DA 3328 Audio
-122E Xyratex
-122F Andrew Corp.
- 37AF Reflectometer using PLX 9030 (0x9030)
-1230 Fishcamp Engineering
-1231 Woodard McCoach Inc
-1232 GPT Limited
-1233 Bus-tech Inc
-1234 Technical Corp
-1235 RISQ Modular Systems Inc
-1236 Sigma Designs Corp
- 0000 SD6425 (RealMagic64/GX)
- 0531 Single Chip Fast Ethernet NIC Controller (MX98715/25)
- 3D01 RealMagic/2D
- 6401 REALmagic64/GX GUI Accelerator
- 9708 sd6425 (realmagic64/gx)
-1237 Alta Technology Corp
-1238 Adtran
-1239 3DO Company
-123A Visicom Labrotories Inc
-123B SEEQ Technology Inc
-123C Century Systems Inc
-123D Engineering Design Team Inc.
- 0000 EasyConnect 8/32
- 0002 EasyConnect 8/64
- 0003 EasyIO
- 0010 PCI-DV Digital Video Interface (PCI-DV)
-123E Simutech Inc
-123F C-Cube Microsystems
- 00E4 MPEG (cl 480)
- 5111 DV/MPEG Device
- 6120 DVD device (12.03)
- 8120 i845E
- 8888 cPEG C 3.0 DVD/MPEG2 Decoder (12.03)
-1240 Marathon Technologies Corp
-1241 DSC Communications
- 1603 keyboard
-1242 Jaycor Networks Inc
- 1460 2-Gb/s Fibre Channel-PCI 64-bit 66 MHz (JNIC-1460)
- 1560 Dual Channel 2 Gb/s Fibre Channel-PCI-X (JNIC-1560)
- 4643 JNI PCI 64-bit Fibrechannel (needs clone) (JNI PCI 64-bit Fibrechannel)
- 6562 FCX2-6562 Dual Channel PCI-X Fibre Channel Adapter
- 656A FCX-6562 PCI-X Fibre Channel Adapter
-1243 Delphax
-1244 AVM Audiovisuelles MKTG & Computer GmbH
- 0700 ISDN controller (B1)
- 0800 ISDN Controller (C4)
- 0A00 Fritz!Card A1 ISDN Controller
- 0E00 Fritz!PCI v2.0 ISDN Controller
- 1100 ISDN Controller (C2)
- 1200 ISDN Controller (T1)
- 2700 DSP TNETD5100GHK / TNETD5015 (E13 32A5KYW / 2CAKRCT)
- 2900 Fritz!Card DSL v2.0
-1245 A.P.D., S.A.
-1246 Dipix Technologies Inc
-1247 Xylon Research Inc
-1248 Central Data Corp
-1249 Samsung Electronics Co Ltd
-124A AEG Electrocom GmbH
- 10BD Intel Gigabit network connection (82566DM-2)
-124B Greenspring Computers Inc
- 0040 cPCI-200 Four Slot IndustryPack Carrier
-124C Solitron Technologies Inc.
- 0220 .
-124D Stallion Technologies Inc
- 0000 EasyConnect 8/32
- 0002 EasyConnect 8/64
- 0003 EasyIO PCI
- 0004 EasyConnection ECRA-PCI
-124E Cylink
-124F Infortrend Technology Inc
- 0041 IFT-2000 Series PCI RAID Controller
-1250 Hitachi Microcomputer System Ltd.
- 1978 ?
- 2898 ?
-1251 VLSI Solution OY
-1253 Guzik Technical Enterprises
-1254 Linear Systems Ltd
-1255 Optibase Ltd.
- 1110 MPEG Forge
- 1210 MPEG Fusion
- 2110 VideoPlex pci bpc1825 rev a (VideoPlex-pci)
- 2120 VideoPlex BPC 1851 A (VideoPlex plus)
- 2130 VideoQuest
-1256 Perceptive Solutions Inc.
- 4201 PCI-2240i Dale EIDE Adapter
- 4401 Dale EIDE Adapter (PCI-2220i)
- 5201 PCI-2000 IntelliCache SCSI Controller
-1257 Vertex Networks Inc
-1258 Gilbarco Inc.
- 1988 ?
-1259 Allied Telesyn International
- 2503 Realtek 8139b
- 2560 AT-2560 Fast Ethernet Adapter (i82557B)
- C107 Realtek 8169S
-125A ABB Power Systems
-125B Asix Electronics Corp.
- 0B95 USB2.0 to 10/100M Fast Ethernet Controller (AX88772)
- 1400 ASIX AX88140 Based PCI Fast Ethernet Adapter (AX88140A)
- 1720 USB2 to Fast Ethernet Adapter (AX88172)
-125C Aurora Technologies Inc
- 0101 Saturn 4520P
- 0640 Aries 16000P
-125D ESS Technology
- 0000 PCI Fax Modem (early model) (ESS336H)
- 1948 Solo??
- 1961 ESS Solo-1 Soundcard (Multimedia Device)
- 1968 Maestro-2 PCI audio accelerator (ES2839)
- 1969 Solo-1 PCI AudioDrive family (ES72222)
- 1978 ES1978 Maestro-2E Audiodrive, ES1970 Canyon3D
- 1988 ESS Allegro PCI Audio (WDM) (ES1989)
- 1989 ES1989 Allegro ES56CVM-PI PCI Voice+Fax Modem
- 1990 ES2898S
- 1992 ?
- 1998 ES1980 Maestro-3 PCI Audio Accelerator
- 1999 ES1983 Maestro-3.COMM ES56CVM-PI PCI voice+Fax Modem
- 199A ES1980 Maestro-3 PCI Audio Accelerator
- 199B Maestro-3.COMM PCI Voice+audio (ES1938/41/46 solo audio)
- 2808 PCI Fax Modem (later model) (ES336H)
- 2828 TeleDrive (ES2828S)
- 2838 Data Fax Modem (ES56H-PI4555)
- 2839 Superlink Modem/V.92 chipset 56K
- 2843 ES2838/2839 SuperLink-MLP Voice Modem
- 2847 ES2838/2839 SuperLink-MLP 10 Voice Modem
- 2898 TelDrive ES56T-PI family V.90 PCI modem
-125E Specialvideo Engineering SRL
-125F Concurrent Technologies Inc.
- 2084 AMCC Bridge + 2 x Super I/O (National PC97338) (AMCC S5933)
-1260 Intersil Americas Inc (Was: Harris Semiconductor)
- 3872 LAN-Express IEEE 802.11b PCI Adapter (PRISM 3)
- 3873 PRISM 2.5 802.11b 11Mbps Wireless Controller
- 3886 Creatix CTX405 WLAN Controller (Unknown)
- 3890 PRISM GT 802.11g 54Mbps Wireless Controller (ISL3890)
- 8130 NTSC/PAL Video Decoder (HMP8130)
- 8131 NTSC/PAL Video Decoder (HMP8131)
- FFFF ISL3886IK
-1261 Matsushita-Kotobuki Electronics Industries
-1262 ES Computer Company Ltd
-1263 Sonic Solutions
-1264 AVAL NAGASAKI Corp
-1265 Casio Computer Co Ltd
-1266 Microdyne Corp.
- 0001 NE10/100 Adapter (i82557B)
- 1910 NE2000Plus (RT8029) Ethernet Adapter
-1267 S.A. Telecommunications
- 1016 NICCY PCI Card
- 4243 Satellite receiver board / MPEG2 decoder
- 5352 PCR2101
- 5A4B Telsatturbo
-1268 Tektronix
- 0204 Tektronix IO Processor / Tektronix PCI Acquisition Interface Rev 204 (Unknown)
-1269 Thomson-CSF/TTM
-126A Lexmark International Inc
-126B ADAX Inc
-126C Nortel Networks (Was: Northern Telecom)
- 1211 10/100BaseTX [RTL81xx]
- 126C 802.11b Wireless Ethernet Adapter
- 1F1F e-mobility 802.11b Wireless LAN PCI Card
-126D Splash Technology Inc
-126E Sumitomo Metal Industries Ltd
-126F Silicon Motion Inc
- 0710 LynxEM (SM710)
- 0712 LynxEM+ (SM712)
- 0720 SM720/1 Lynx3DM, SM722 Lynx3DM+
- 0810 LynxE (SM810)
- 0811 LynxE (SM811)
- 0820 Lynx3D (SM820)
- 0910 SILICON MOTION (SM910)
-1270 Olympus Optical Co Ltd
-1271 GW Instruments
- 1025 SoftV90 Data Fax Modem
-1272 Telematics International
- 0780 PCIVEN_1272&DEV_0780&SUBSYS_00000008&REV_7A3&61AAA01&0&58 (PCIVEN_1272&DEV_0780&SUBSYS_00000008&REV_7A3&61A)
-1273 Hughes Network systems
- 0002 t9p17af-01 (DirecPC)
-1274 Creative (Was: Ensoniq)
- 1274 multimedia audio device (5880x)
- 1371 ES1371, ES1373 AudioPCI
- 1373 Sound Blaster Audio(PCI) (ES1373)
- 5000 AudioPCI (ES1371)
- 5880 Soundblaster (CT4750) (5880x)
- 9876 ?
-1275 Network Appliance Corp
-1276 Switched Network Technologies Inc
-1277 Comstream
-1278 VMETRO Ltd (was: Transtech Parallel Systems Ltd)
- 0701 PowerPC Node (TPE3/TM3)
- 0710 TPE5 PowerPC PCI board
- 1100 PMC-FPGA02
-1279 Transmeta Corp.
- 0060 Efficeon Virtual Northbridge (TM8000)
- 0061 Efficeon AGP Bridge (TMTM8000)
- 0295 Virtual Northbridge
- 0395 Northbridge (LongRun)
- 0396 SDRAM Controller
- 0397 BIOS scratchpad
-127A Rockwell Semiconductor Systems (Also Conexant)
- 1002 RC56HCFPCI HCF 56k V.90 Modem
- 1003 HCF 56k V.90 Modem
- 1004 HCF 56k V.90 Modem
- 1005 R6786-61 HCF 56k V.90 Speakerphone Modem
- 1022 HCF V.90 Modem
- 1023 HCF V.90 Data/Fax Modem
- 1024 HCF 56k PCI Modem
- 1025 HCF 56k PCI Modem
- 1026 HCF 56k PCI Speakerphone Modem
- 1032 HCF 56k PCI Modem
- 1033 HCF 56k PCI Modem
- 1034 HCF 56k PCI Modem
- 1035 RH56D/SP-PCI HCF 56k PCI Speakerphone Modem
- 1036 HCF 56k PCI Modem
- 1085 Volcano HCF 56k PCI Modem
- 2003 Conexant SoftK56 PCI Modem
- 2004 Conexant SoftK56 PCI Modem
- 2005 RS56/SP-PCI11P1 Conexant SoftK56 Speakerphone Modem
- 2013 Conexant SoftK56 Modem
- 2014 RS56 SP-PCI Conexant SoftK56 Modem
- 2015 R6793-11 Conexant SoftK56 Speakerphone Modem
- 2016 HSF 56k Data/Fax/Voice/Speakerphone Modem
- 2043 Generic SoftK56
- 2044 Generic SoftK56
- 2045 Generic SoftK56
- 2046 Generic SoftK56
- 2114 R6793-12 Conexant SoftK56 PCI Modem
- 2F15 U.S. Robotics 56k Fax Host Int
- 4300 Riptide Bus / Firmware Downloader
- 4302 Riptide Input Device
- 4310 Master Riptide PCI Audio Device
- 4311 Conexant PCI Modem Enumerator
- 4312 Riptide PCI Game Controller
- 4320 Riptide PCI Audio Controller
- 4321 Riptide HCF 56k PCI Modem
- 4322 Riptide PCI Game Controller
- 4330 Riptide Bus / Firmware Downloader
- 4332 Riptide Input Device
- 4340 Riptide Bus / Firmware Downloader
- 4342 Riptide Input Device
- 4350 Riptide Bus / Firmware Downloader (No Audio)
- 4352 Riptide Input Device
- 4360 Riptide Bus / Firmware Downloader (No Audio)
- 4362 Riptide Input Device
- 5278 Harmonic DVB Network Adapter
- 8234 RapidFire 616X ATM155 Adapter
-127B PIXERA Corp
-127C Crosspoint Solutions Inc
-127D VELA Research
-127E Winnou, L.P.
- 0010 Videum AVX Adapter (Unknown)
-127F Fujifilm
-1280 Photoscript Group Ltd
-1281 Yokogawa Electric Corp
-1282 Davicom Semiconductor Inc.
- 9009 Ethernet Adapter (DM9009)
- 9100 DM9100 Ethernet Controller
- 9102 10/100 Mbps Fast Ethernet Controller (DM9102/A/AF)
-1283 Integrated Technology Express (ITE) Inc
- 0801 Audio Digital Controller (Audio Digital Controller)
- 673A IT8330G PCI EIDE Controller
- 8152 Advanced RISC-to-PCI Companion Chip (IT8152F/G)
- 8172 Ultra RISC (MIPS, SH4) Companion Chip (IT8172G)
- 8211 ATA/ATAPI Controller (IT8211F)
- 8212 ATA 133 IDE RAID Controller (IT8212F)
- 8213 IDE Controller (IT8213F)
- 8330 IT8330G PCI Host Bridge
- 8872 IT8871/72 PCI to ISA I/O chip with SMB, Parallel Port & GPIO
- 8875 PCI Parallel Port (IT8875F)
- 8888 IT8888F PCI to ISA Bridge with SMB
- 8889 IT8889F PCI to ISA Bridge
- 9876 PCI I/O CARD (IT8875F)
- E886 PCI to ISA Bridge (IT8330G)
-1284 Sahara Networks Inc
-1285 Platform Technologies Inc.
- 0100 Maestro-1 AudioDrive (ES1849)
-1286 Mazet GmbH
-1287 LuxSonor Inc.
- 001E DVD Decoder (LS220D)
- 001F DVD Decoder (LS220C)
- 0020 MPEG/DVD video decoder (LS242)
-1288 Timestep Corp
-1289 AVC Technology Inc.
- 1006 ?
-128A Asante Technologies Inc.
- F001 AsanteFAST 10/100 PCI Ethernet Adapter (Ethernet 10/100)
-128B Transwitch Corporation
-128C Retix Corp
-128D G2 Networks Inc.
- 0021 ATM155 Adapter
-128E Hoon Tech co Ltd/Samho Multi Tech Ltd
- 0008 ST128 WSS/SB
- 0009 ST128 SAM9407
- 000A ST128 Game Port
- 000B ST128 MPU Port
- 000C ST128 Ctrl Port
-128F Tateno Dennou Inc
-1290 Sord Computer Corporation
-1291 NCS Computer Italia
-1292 Tritech Microelectronics
-1293 Media Reality Technology
-1294 Rhetorex Inc
-1295 Imagenation Corp
-1296 Kofax Image Products
-1297 Holco Ent Co Ltd/Shuttle Computer
-1298 Spellcaster Telecommunications Inc
-1299 Knowledge Technology Lab
-129A VMETRO Inc.
- 0415 PCI 66MHz Analyzer and 33MHz Exerciser (PBT-415)
- 0515 PCI 66MHz Analyzer and Exerciser (PBT-515)
- 0615 PCI 66MHz and PCI-X 100MHz Bus Analyzer and Exerciser (PBT-615)
- 0715 PCI 66MHz and PCI-X 133MHz Bus Analyzer and Exerciser (Vanguard PCI/PMC/cPCI)
- 1100 PMC-FPGA05
- DD10 Digital Parallel Input Output Device 32bit, 33MHz PCI bus (DPIO)
- DD11 Digital Parallel Input Output Device 64bit, 33MHz PCI bus (DPIO2)
- DD12 Digital Parallel Input Output Device 64bit, 66MHz PCI bus (DPIO2-66)
-129B Image Access
-129C Xantel Corp/Jaycor
-129D Compcore Multimedia Inc
-129E Victor Company of Japan Ltd
-129F OEC Medical Systems Inc
-12A0 Allen-Bradley Company
- 0008 Allen-Bradley 1784-PKTX (1784-PKTX)
-12A1 Simpact Associates Inc
-12A2 Newgen systems Corp
-12A3 Lucent Technologies AMR
- ECB8 V.92 Lucent Modem (1646T00)
-12A4 NTT Electronics Technology Company
-12A5 Vision Dynamics Ltd
-12A6 Scalable Networks Inc
-12A7 AMO GmbH
-12A8 News Datacom
-12A9 Xiotech Corp
-12AA SDL Communications Inc.
- 5568 WANic 400 series X.21 controller (Wan405)
- 556C NAI HSSI Sniffer PCI Adapter
-12AB Yuan Yuan Enterprise Co. Ltd.
- 3000 TUN-200/MPG-200C PCI TV (and possibly DVD Decoder??) Card
-12AC Measurex Corp
-12AD Multidata GmbH
- 0010 HERMES-S0
- 0020 HERMES-PRI
- 0080 HERMES-PRI/PCIX
-12AE Alteon Networks Inc.
- 0001 3C986 ACENIC 1000 Base-SX Gigabit Ethernet Adapter
- 0002 Copper Gigabit Ethernet Adapter (3C986-T)
-12AF TDK USA Corp
-12B0 Jorge Scientific Corp
-12B1 GammaLink
-12B2 General Signal Networks
- 0209 SNA Link/9000 PCI to ESCON Controller
-12B3 Inter-Face Co Ltd
-12B4 FutureTel Inc
-12B5 Granite Systems Inc
-12B6 Natural Microsystems
-12B7 ACCUMEN/Cognex Modular Vision Systems
-12B8 Korg
-12B9 3COM Corp, Modem Division (Formerly US Robotics)
- 1006 5610 56K FaxModem WinModem (5610)
- 1007 US Robotics 56K DATA FAX WINMODEM (AD1807JS)
- 1008 USR5610B (0005610-02) 56K Performance Pro Modem (PCI Internal) (USR5610B)
-12BA Bittware Research/PMC Sierra
- 0032 DSP Prototyping & Development Card (Hammerhead-Lite-PCI)
-12BB Nippon Unisoft Corp
-12BC Array Microsystems
-12BD Computerm Corp
-12BE Anchor Chips Inc
- 3041 AN3041Q CO-MEM PCI Bus Interface/Cache
- 3042 AN3042Q CO-MEM Lite PCI Generic Host Bridge/Shared Memory
-12BF Fujifilm Microdevices
-12C0 Infimed
-12C1 GMM Research Corp.
- 9080 Sync4hs/CCP/PCI/MP communications coprocessor
-12C2 Mentec Ltd
-12C3 Holtek Microelectronics Inc.
- 0058 LAN Adapter (NE2000-compatible) (HT80232)
- 5598 Ethernet Adapter (NE2000-compatible) (HT80229)
-12C4 Connect Tech Inc.
- 0001 Blue Heat PCI/8 RS-232
- 0002 Blue Heat PCI/4 RS-232
- 0003 Blue Heat PCI/2 RS-232
- 0004 Blue Heat PCI/8 RS-485
- 0005 BlueHeat 8 Port RS232 Serial Board (Blue Heat-8 RS232)
- 0006 Blue Heat PCI/4 RS-485
- 0007 Blue Heat PCI/2+2 RS-232/485
- 0008 Blue Heat PCI/2 RS-485
- 0009 Blue Heat PCI/2+6 RS-232/485
- 000A Blue Heat PCI/8 RS-485 (BH081101V1)
- 000B Blue Heat PCI/4 RS-485 (BH041101V1)
- 000C Blue Heat PCI/2 RS-485 (BH021101V1)
- 000D Blue Heat PCI/2 PTM
- 000E Blue Heat PCI Custom Osc
- 000F Blue Heat PCI/8 RS-485 (BH081104V4)
- 0100 NT960/PCI
- 0201 cPCI Titan - 2 Port
- 0202 cPCI Titan - 4 Port
- 0300 BLueStorm/LP 2 RS232
- 0301 BLueStorm/LP 4 RS232
- 0302 BLueStorm/LP 8 RS232
- 0303 BLueStorm/LP 2 RS232/RS485
- 0304 BLueStorm/LP 4 RS232/RS485
- 0305 BLueStorm/LP 8 RS232/RS485
- 0306 BLueStorm/LP 2 Opto
- 0307 BLueStorm/LP 4 Opto
- 0308 Starcom UM100 Wireless modem for WiMax
- 0309 BLueStorm/LP 2 RS485
- 030A BLueStorm/LP 4 RS485
- 030B BLueStorm/LP 8 RS485
- 0310 CTI PCI UART 1+1 (RS232/485)
- 0311 CTI PCI UART 2+2 (RS232/485)
- 0312 CTI PCI UART 4+4 (RS232/485)
- 0320 CTI PCI UART 2
- 0321 CTI PCI UART 4
- 0322 CTI PCI UART 8
- 0330 CTI PCI UART 2 (RS485)
- 0331 CTI PCI UART 4 (RS485)
- 0332 CTI PCI UART 8 (RS485)
-12C5 Picture Elements Inc.
- 007F PEI Imaging Subsystem Engine (ISE)
- 0081 PCI Thresholding Engine (PCIVST)
- 0085 Video Simulator/Sender
- 0086 Multi-scale Thresholder (THR2)
-12C6 Mitani Corp
-12C7 Dialogic Corp.
- 0546 D120JCT-LS Card (kssjsjj)
- 0561 BRI/2 Type Card (Voice Driver)
- 0647 D/240JCT-T1 Card
- 0648 D/300JCT-E1 Card
- 0649 D/300JCT-E1 Card
- 0651 MSI PCI Card
- 0673 BRI/160-PCI Card
- 0674 BRI/120-PCI Card
- 0675 BRI/80-PCI Card
- 0676 D/41JCT Card
- 0685 D/480JCT-2T1 Card
- 0687 D/600JCT-2E1 (75 Ohm) Card
- 0689 Dialogic 2E1 - JCT series (D/600JCT-2E1)
- 0707 D/320JCT (Resource Only) Card
- 0708 D/160JCT (Resource Only) Card
-12C8 G Force Co Ltd
-12C9 Gigi Operations
-12CA Integrated Computing Engines
-12CB Antex Electronics Corp.
- 0027 StudioCard
- 002D BX-12
- 002E SC-2000
- 002F LX-44
- 0030 SC-22
- 0031 BX-44
- 0032 LX-24M Professional 20-bit 2-in, 4-out audio Card w/- MPEG2
- 0033 LX-22M
- 0034 BX-8
- 0035 BX-12e
-12CC Pluto Technologies International
-12CD Aims Lab
-12CE Netspeed Inc
-12CF Prophet Systems Inc
-12D0 GDE Systems Inc
-12D1 PSITech
-12D2 Nvidia (Was:STB,SGS Thompson)
- 0008 NV1
- 0009 DAC64
- 0018 RIVA 128 2D/3D GUI Accelerator
- 0019 RIVA 128ZX 2D/3D GUI Accelerator
- 0020 TNT
- 0028 TNT2
- 0029 UTNT2
- 002C VTNT2
- 00A0 ITNT2
-12D3 Vingmed Sound A/S
-12D4 Ulticom, Inc.
- 0301 SS7 Telecommunications Interface Adapter (EP1S)
-12D5 Equator Technologies
- 1000 Broadband Signal Processor (MAP-CA)
- 1002 Digital Signal Processor (MAP-1000)
-12D6 Analogic Corp
-12D7 Biotonic SRL
-12D8 Pericom Semiconductor
- 71E2 3 Port PCI to PCI bridge (PI7C7300)
- 8150 2-Port PCI to PCI Bridge (PI7C8150)
- 8152 2-Port PCI-To-PCI Bridge (PI7C8152)
- A404 PCIe Packet Switch (PI7C9X20404SL)
- E130 PCI-X Bridge (PI7C9X130)
-12D9 Acculab PLC
-12DA True Time
-12DB Annapolis Micro Systems Inc.
- 0003 FoxFire II
-12DC Symicron Computer Communication Ltd
-12DD Management Graphics
-12DE Rainbow Technologies
- 0200 Cryptoswift 200
-12DF SBS Technologies Inc.
- 2102 Communications Controller (Infineon PEB 20534)
- 8236 PCI Controller (Unknown)
-12E0 Chase Research PLC
- 0010 Quad UART (ST16C654)
- 0020 Quad UART (ST16C654)
- 0021 8x UART
- 0030 Quad UART (ST16C654)
-12E1 Nintendo co Ltd
-12E2 Datum Inc Bancomm-Timing Division
-12E3 Imation Corp - Medical Imaging Systems
-12E4 Brooktrout Technology Inc.
- 1000 PRI Controller (TR1000 PRI)
- 1120 TruFax Board
- 1140 Tr114 Fax Board
- B005 BRI Controller (TR1000 BRI)
- B006 BRI Controller (TR1000 BRI)
-12E5 XCD Inc/Apex Inc
-12E6 Cirel Systems
-12E7 Sunsgroup Corp
-12E8 CRISC Corp
-12E9 GE Spacenet
-12EA Zuken
-12EB Aureal Semiconductor
- 0001 Vortex 1 Digital Audio Processor (AU8820)
- 0002 AU8830 Vortex 2 3D Digital Audio Processor
- 0003 AU8810 Vortex Digital Audio Processor
- 8803 Vortex 56k Software Modem
-12EC 3A International Inc.
- 8139 0xxxx (0xxxx)
-12ED Optivision Inc
-12EE Orange Micro
-12EF Vienna Systems
-12F0 Pentek
-12F1 Sorensen Vision Inc
-12F2 Gammagraphix Inc
- 1002 Grapics Radeon X850 (215RAAGCGA11F)
- 3059 AC97 Enhanced Audio Controller - the 8251 controller is different (VT8235)
-12F3 Radstone Technology / XING Inc
-12F4 Megatel
-12F5 Forks Inc
-12F6 Dawson France
-12F7 Cognex
-12F8 Electronic-Design GmbH
- 0002 s3 trio (VideoMaker)
-12F9 FourFold Technologies
-12FB Spectrum Signal Processing
- 0001 PMC-MAI
- 00F5 F5 Dakar
- 02AD PMC-2MAI
- 2ADC ePMC-2ADC
- 3100 PRO-3100
- 3500 PRO-3500
- 4D4F Modena
- 8120 ePMC-8120
- DA62 Daytona C6201 PCI (Hurricane)
- DB62 Ingliston XBIF
- DC62 Ingliston PLX9054
- DD62 Ingliston JTAG/ISP
- EDDC ePMC-MSDDC
- FA01 ePMC-FPGA
-12FC Capital Equipment Corp
- 5CEC IEEE 488 (PCI-488 GPIB)
-12FD i2S
-12FE ESD Electronic System Design GmbH
-12FF Lexicon
-1300 Harman International Industries Inc
-1302 Computer Sciences Corp
-1303 Innovative Integration
- 0001 cM67 CompactPCI DSP Card (0239)
- 0002 M44/cM44 DSP board
- 0003 Quattro6x DSP board
- 0004 Chico/ChicoPlus Data Acquisition Board
- 0005 Code Hammer Jtag Debugger board
- 0006 Matador DSP board
- 0007 Quixote DSP board
- 0008 Quadia C64x DSP
- 0009 Quadia DSP Baseboard
-1304 Juniper Networks
-1305 NetPhone Inc
-1306 Duet Technologies
-1307 ComputerBoards Inc
- 0001 PCI-DAS1602/16
- 0006 PCI-GPIB
- 000B PCI-DIO48H
- 000C PCI-PDISO8
- 000D PCI-PDISO16
- 000F PCI-DAS1200
- 0010 PCI-DAS1602/12
- 0014 24 Bit Digital Input/Output Board (PCI-DIO24H)
- 0015 PCI-DIO24H/CTR3
- 0016 PCI-DIO24H/CTR15
- 0017 PCI-DIO96H
- 0018 PCI-CTR05
- 0019 PCI-DAS1200/JR
- 001A PCI-DAS1001
- 001B PCI-DAS1002
- 001C PCI-DAS1602JR/16
- 001D PCI-DAS6402/16
- 001E PCI-DAS6402/12
- 001F PCI-DAS16/M1
- 0020 PCI-DDA02/12
- 0021 PCI-DDA04/12
- 0022 PCI-DDA08/12
- 0023 PCI-DDA02/16
- 0024 PCI-DDA04/16
- 0025 PCI-DDA08/16
- 0026 PCI-DAC04/12-HS
- 0027 PCI-DAC04/16-HS
- 0028 24 Bit Digital Input/Output Board (PCI-DIO24)
- 0029 PCI-DAS08
- 002C PCI-INT32 (PCI-INT32)
- 0033 PCI-DUAL-AC5
- 0034 PCI-DAS-TC
- 0035 PCI-DAS64/M1/16
- 0036 PCI-DAS64/M2/16
- 0037 PCI-DAS64/M3/16
- 004C PCI-DAS1000
- 004D PCI-QUAD04
- 0052 PCI-DAS4020/12
- 0054 PCI-DIO96
- 005D PCI-DAS6023
- 005E PCI-DAS6025
- 005F PCI-DAS6030
- 0060 PCI-DAS6031
- 0061 PCI-DAS6032
- 0062 PCI-DAS6033
- 0063 PCI-DAS6034
- 0064 10 channels, 16 bit counter/timer with 32-Bits of Digital I/O (PCI-CTR10)
- 0065 PCI-DAS6040
- 0066 PCI-DAS6052
- 0067 PCI-DAS6070
- 0068 PCI-DAS6071
- 006F PCI-DAS6036
- 0078 PCI-DAS6013
- 0079 PCI-DAS6014
-1308 Jato Technologies Inc.
- 0001 NetCelerator Adapter
-1309 AB Semicon Ltd
-130A Mitsubishi Electric Microcomputer
-130B Colorgraphic Communications Corp
-130C AMBEX Technologies Inc
-130D Accelerix Inc
-130E Yamatake-Honeywell Co Ltd
-130F Advanet Inc
-1310 GESPAC
- 0003 CompactPCI Interface (9060)
- 000D FPGA PCI Bridge
-1311 VideoServer Inc
-1312 Acuity Imaging Inc
-1313 Yaskawa Electric Co
-1316 Teradyne Inc
-1317 ADMtek Inc
- 0531 ADMtek AN986 (nm0403A03461H121S122P)
- 0981 FastNIC 10/100 Fast Ethernet Adapter (AN981)
- 0985 AN983 FastNIC PCI 10/100 Fast Ethernet Adapter
- 1985 AN985 FastNIC CardBus 10/100 Fast Ethernet Adapter
- 2850 HSP56 MicroModem (016)
- 5120 ADMtek ADM5120 SOC (rev: 0) (ADM5120)
- 7892 HSP56 MicroModem (PCT 789T-A)
- 8201 ADM8211 based 802.11b Wireless PCI Card
- 9511 ADM9511 FastNIC PCI 10/100 Fast Ethernet Adapter
- 9513 ADM9513 FastNIC PCI 10/100 Fast Ethernet Adapter
-1318 Packet Engines, Inc.
- 0911 1000BT Network Interface Card (G-NIC II)
-1319 ForteMedia Inc
- 0801 PCI Card MediaForte made in singapore (driver - ftp://ftp.terratec.net/Audio/OEM/Integra/Driver/Inte (FM0801-au)
- 0802 Xwave PCI Joystick (FM801-as)
- 1000 FM801 PCI Audio Device
- 1001 FM801 PCI Joystick
- 1319 Xwave PCI audio controller (FM0801-as)
- 4901 ForteMedia PCI Audio Card (FM801-AU)
-131A Finisar Corp
-131C Nippon Electro-Sensory Devices Corp
-131D Sysmic Inc
-131E Xinex Networks Inc
-131F SIIG Inc
- 1000 PCI Serial Card
- 1001 CyberSerial (1-port) 16650
- 1002 CyberSerial (1-port) 16850
- 1010 Duet 1S(16550)+1P
- 1011 Duet 1S(16650)+1P
- 1012 Duet 1S(16850)+1P
- 1020 CyberParallel PCI Card
- 1021 CyberParallel PCI Card
- 1030 CyberSerial (2-port) 16550
- 1031 CyberSerial (2-port) 16650
- 1032 CyberSerial (2-port) 16850
- 1034 Trio 2S(16550)+1P
- 1035 Trio 2S(16650)+1P
- 1036 Trio 2S(16850)+1P
- 1050 CyberSerial (4-port) 16550
- 1051 CyberSerial (4-port) 16650
- 1052 CyberSerial (4-port) 16850
- 2000 CyberSerial (1-port) 16550
- 2001 CyberSerial (1-port) 16650
- 2002 CyberSerial (1-port) 16850
- 2010 Duet 1S(16550)+1P
- 2011 Siig Inc Duet 1S(16550)+1P
- 2012 Duet 1S(16850)+1P
- 2020 Communication controller (SIIG cyber8000)
- 2021 CyberParallel (2-port)
- 2030 SIIG Cyber Serial Dual PCI Board (SIIG CyberSerial PCI 16C550)
- 2031 CyberSerial (2-port) 16650
- 2032 CyberSerial (2-port) 16850
- 2040 Trio 1S(16550)+2P
- 2041 Trio 1S(16650)+2P
- 2042 Trio 1S(16850)+2P
- 2050 Siig Inc CyberSerial (4-port) 16550 (Siig Inc CyberSerial (4-port) 16550)
- 2051 CyberSerial (4-port) 16650
- 2052 CyberSerial (4-port) 16850
- 2060 Trio 2S(16550)+1P (JJ_P21022-B)
- 2061 Trio 2S(16650)+1P
- 2062 Trio 2S(16850)+1P
-1320 Crypto AG
-1321 Arcobel Graphics BV
-1322 MTT Co Ltd
-1323 DOME Inc
-1324 Sphere Communications
-1325 Salix Technologies Inc
-1326 SeaChange International
-1327 Voss Scientific
-1328 CIFELLI SYSTEMS CORPORATION
- 2048 ?
- 8888 cPEG C 3.0 DVD/MPEG2 decoder (rev 1.5)
-1329 Productivity Enhancement
-132A Microcom Inc
-132B BroadBand Technologies
-132C Micrel Inc
-132D Integrated Silicon Solution Inc
-1330 MMC Networks
-1331 RadiSys Corporation
- 0030 ENP-2611
- 8200 82600 Host Bridge
- 8201 82600 IDE
- 8202 82600 USB
- 8210 82600 PCI Bridge
-1332 Micro Memory
- 5410 PCI 32bit Bulk Memory w/DMA (MM-5410D)
- 5415 MM-5415CN PCI Memory Module with Battery Backup
- 5425 MM-5425CN PCI 64/66 Memory Module with Battery Backup
- 6140 Memory Module (MM-6140D)
-1334 Redcreek Communications Inc
-1335 Videomail Inc
-1337 Third Planet Publishing
-1338 BT Electronics
-133A VTEL Corp
-133B Softcom Microsystems
-133C Holontech Corp
-133D S S Technologies
- 1000 Industrial I/O Card (SST-5136-PFB-PCI)
-133E Virtual Computer Corp
-133F SCM Microsystems
-1340 Atalla Corp
-1341 Kyoto Microcomputer Co
-1342 Promax Systems Inc
-1343 Phylon Communications Inc
-1344 Micron Technology (Was: Crucial Technology?)
- 3240 CopperHead CopperTail SC1 AMC AC'97
- 3320 North Bridge (MT8LLN21PADF)
- 3321 North Bridge (21PAD)
- 3470 South Bridge (MT7LLN22NCNE)
- 4020 CopperHead CopperTail SC1 IDE Controller
- 4030 CopperHead CopperTail SC1 USB Controller
-1345 Arescom Inc
-1347 Odetics
-1349 Sumitomo Electric Industries Ltd
-134A DTC Technology Corp.
- 0001 Domex DMX 3191 PCI SCSI Controller (F01 2ASV17184.1)
- 0002 Domex DMX3192U/3194UP SCSI Adapter
-134B Ark Research Corp
-134C Chori Joho System Co Ltd
-134D PCTEL Inc.
- 2188 intel (fa82537ep)
- 2189 HSP56 Micromodem
- 2486 2304WT V.92 MDC Modem
- 7890 HSP56 MicroModem
- 7891 HSP MicroModem 56 (PCT 789T)
- 7892 HSP56 MicroModem (PCT 789T-A)
- 7893 HSP MicroModem 56 (S911 K017)
- 7894 HSP MicroModem 56 (688w)
- 7895 HSP MicroModem 56 (PCT789T)
- 7896 HSP MicroModem 56 (pct789t-c)
- 7897 HSP MicroModem 56/PCT789T (97860963)
- 8086 dev (hfp56)
- 9714 PCTEL (PCT 288-1A)
- D800 pctel 56k modem (pct388p-a)
-134E CSTI
-134F Algo System Co Ltd
-1350 Systec Co Ltd
-1351 Sonix Inc
-1353 Dassault A.T.
- 0002 Proserver
- 0003 PCI-FUT
- 0004 PCI-S0
- 0005 PCI-FUT-S0
-1354 dWave System Inc
-1355 Kratos Analytical Ltd
-1356 The Logical Co
-1359 Prisa Networks
-135A Brain Boxes Limited
- 0224 PLX PCI Bus Logic (PLX9050)
- 0228 pq100akj9737 (f97260118)
-135B Giganet Inc
-135C Quatech Inc
- 0010 QSC-100
- 0020 DSC-100
- 0030 DSC-200/300
- 0040 QSC-200/300
- 0050 ESC-100D
- 0060 ESC-100M
- 00F0 MPAC-100 Syncronous Serial Card (Zilog 85230)
- 0170 QSCLP-100
- 0180 DSCLP-100
- 0190 SSCLP-100
- 01A0 QSCLP-200/300
- 01B0 DSCLP-200/300
- 01C0 SSCLP-200/300
-135D ABB Network Partner AB
-135E Sealevel Systems Inc.
- 5101 Route 56 (5101)
- 5102 RS-232 synchronous card (PCI-ACB)
- 7101 Single Port RS-232/422/485/530
- 7201 Dual Port RS-232/422/485 Interface
- 7202 Dual Port RS-232 Interface
- 7401 Four Port RS-232 Interface
- 7402 Four Port RS-422/485 Interface
- 7801 Eight Port RS-232 Interface
- 8001 Digital I/O Adapter (8001)
-135F I-Data International A-S
-1360 Meinberg Funkuhren GmbH & Co. KG
- 0101 DCF77 Radio Clock (PCI32)
- 0102 DCF77 Radio Clock (PCI509)
- 0103 DCF77 Radio Clock (PCI510)
- 0104 DCF77 Radio Clock (PCI511)
- 0105 PEX511 DCF77 Radio Clock (PCI Express)
- 0201 GPS Receiver (GPS167PCI)
- 0202 GPS Receiver (GPS168PCI)
- 0203 GPS Receiver (GPS169PCI)
- 0204 GPS Receiver (GPS170PCI)
- 0205 GPS170PEX GPS Receiver (PCI Express)
- 0301 IRIG Timecode Reader (TCR510PCI)
- 0302 IRIG Timecode Reader (TCR167PCI)
- 0303 IRIG Timecode Reader (TCR511PCI)
- 0304 TCR511PEX IRIG Timecode Reader (PCI Express)
- 0305 IRIG Timecode Reader (TCR170PEX)
- 0501 PTP/IEEE1588 Slave Card (PTP270PEX)
- 0601 Free Running Clock (FRC511PEX)
-1361 Soliton Systems K.K.
-1362 Fujifacom Corp
-1363 Phoenix Technology Ltd
-1364 ATM Communications Inc
-1365 Hypercope Corp.
- 9050 HYSDN
-1366 Teijin Seiki Co Ltd
-1367 Hitachi Zosen Corp
-1368 Skyware Corp
-1369 Digigram
-136A High Soft Tech
- 0004 HST Saphir VII mini PCI
- 0007 HST Saphir III E MultiLink 4
- 0008 HST Saphir III E MultiLink 8
- 000A HST Saphir III E MultiLink 2
-136B Kawasaki Steel Corp
- FF01 KL5A72002 Motion JPEG
-136C Adtek System Science Co Ltd
-136D Gigalabs Ltd
-136F Applied Magic Inc
-1370 ATL Products
-1371 CNET Technology Inc
- 434E GigaCard Network Adapter
-1373 Silicon Vision Inc
-1374 Silicom Ltd
- 0024 Dual port Giga Ethernet BGE Bypass Server Adapter
- 0025 Quad port Giga Ethernet BGE Bypass Server Adapter
- 0026 Dual port Fiber Giga Ethernet 546 Bypass Server Adapter
- 0027 Dual port Fiber LX Giga Ethernet 546 Bypass Server Adapter
- 0028 Dual port Copper Giga Ethernet 546 Bypass Server Adapter
- 0029 Dual port Copper Giga Ethernet 546GB Bypass Server Adapter
- 002A Dual port Fiber Giga Ethernet 546 TAP/Bypass Server Adapter
- 002B Dual port Copper Fast Ethernet 546 TAP/Bypass Server Adapter PXE2TBI
- 002C Quad port Copper Giga Ethernet 546GB Bypass Server Adapter PXG4BPI
- 002D Quad port Fiber-SX Giga Ethernet 546GB Bypass Server Adapter PXG4BPFI
- 002E Quad port Fiber-LX Giga Ethernet 546GB Bypass Server Adapter PXG4BPFI-LX
- 002F Dual port Fiber-SX Giga Ethernet 546GB Low profile Bypass Server Adapter PXG2BPFIL
- 0030 Dual port Fiber-LX Giga Ethernet 546GB Low profile Bypass Server Adapter
- 0031 Quad port Copper Giga Ethernet PCI-E Bypass Server Adapter
- 0032 Dual port Copper Fast Ethernet 546 TAP/Bypass Server Adapter
- 0034 Dual port Copper Giga Ethernet PCI-E BGE Bypass Server Adapter
- 0035 Quad port Copper Giga Ethernet PCI-E BGE Bypass Server Adapter
- 0036 Dual port Fiber Giga Ethernet PCI-E BGE Bypass Server Adapter
- 0037 Quad port Copper Ethernet PCI-E Intel based Bypass Server Adapter
- 0038 Quad port Copper Ethernet PCI-E Intel based Bypass Server Adapter
- 0039 Dual port Fiber-SX Ethernet PCI-E Intel based Bypass Server Adapter
- 003A Dual port Fiber-LX Ethernet PCI-E Intel based Bypass Server Adapter
- 003B Dual port Fiber Ethernet PMC Intel based Bypass Server Adapter (PMCX2BPFI)
- 003C Dual port Copper Ethernet PCI-X BGE based Bypass Server Adapter (PXG2BPRB)
-1375 Boeing - Sunnyvale
- 2571 NA (NA)
-1376 One Stop Systems (Originally LMC; Previously bought out by SBE Inc)
-1377 Electronic Equipment Production GmbH
-1378 Telemann Co Ltd
-1379 Asahi Kasei Microsystems Co Ltd
-137A Mark Of The Unicorn Inc
- 0001 PCI-324 Audiowire Interface
-137B PPT Vision
-137C Iwatsu Electric Co Ltd
-137D Dynachip Corp
-137E Patriot Scientific Corp
-137F Japan Satellite Systems Inc
-1380 Sanritz Automation Co Ltd
-1381 Brains Co Ltd
-1382 Marian - Electronic & Software
- 0001 Sek'D ARC88 professional soundcard (f97260118)
- 2008 Prodif 96 Pro sound system
- 2009 SEK'D Prodif 96 Pro - professional audio card (PLX TECHNOLOGY n PCI9052 n 0435 n BX9497.1 MALA)
- 2048 Prodif Plus sound card (2048)
- 2088 8-in, 8-out sound card (Marc 8 Midi)
- 20C8 Marc A sound system
- 4008 Marc 2 Sound System
- 4010 Marc 2 Pro sound system
- 4048 Marc 4 MIDI sound system
- 4088 Marc 4 Digi sound system
- 4248 Marc X sound system
- 4424 TRACE D4 Sound System
-1383 Controlnet Inc
-1384 Reality Simulation Systems Inc
-1385 Netgear Inc
- 0013 WG311T 108 Mbps Wireless PCI Adapter
- 006B WA301 802.11b Wireless PCI Adapter
- 311A GA511 Gigabit Ethernet
- 4100 802.11b Wireless Adapter (MA301)
- 4105 MA311 802.11b wireless adapter
- 4251 WG111T 108 Mbps Wireless USB 2.0 Adapter
- 4400 WAG511 802.11a/b/g Dual Band Wireless PC Card
- 4600 WAG511 802.11a/b/g Dual Band Wireless PC Card
- 4601 WAG511 802.11a/b/g Dual Band Wireless PC Card
- 4610 WAG511 802.11a/b/g Dual Band Wireless PC Card
- 4800 WG511v1 54 Mbps Wireless PC Card
- 4900 WG311v1 54 Mbps Wireless PCI Adapter
- 4A00 WAG311 802.11a/g Wireless PCI Adapter
- 4B00 WG511T 108 Mbps Wireless PC Card
- 4C00 WG311v2 54 Mbps Wireless PCI Adapter
- 4D00 WG311T 108 Mbps Wireless PCI Adapter
- 4E00 WG511v2 54 Mbps Wireless PC Card
- 4F00 WG511U Double 108 Mbps Wireless PC Card
- 5200 GA511 Gigabit PC Card
- 620A GA620
- 622A GA622
- 630A GA630
- 6B00 WG311v3 54 Mbps Wireless PCI Adapter
- 6D00 WPNT511 RangeMax 240 Mbps Wireless PC Card
- 7B00 WN511B RangeMax Next 280 Mbps Wireless PC Card
- 7C00 WN511T RangeMax Next 300 Mbps Wireless PC Card
- 7D00 WN311B RangeMax Next 280 Mbps Wireless PCI Adapter
- 7E00 WN311T RangeMax Next 300 Mbps Wireless PCI Adapter
- 8169 Gigabit Ethernet Adapter (GA311)
- F004 FA310TX Fast Ethernet Adapter
- F311 Fast Ethernet Adapter (FA311)
- F312 ?
-1386 Video Domain Technologies
-1387 Curtiss-Wright Controls Embedded Computing
- 5310 SCRAMNet GT200 (N/A)
-1388 Hitachi Information Technology Co Ltd
-1389 Applicom International
- 0001 Intelligent fieldbus Adapter (PCI1500PFB)
- 0104 PCI-CANIO adapter (PCI-CANIO)
-138A Fusion Micromedia Corp
-138B Tokimec Inc
-138C Silicon Reality
-138D Future Techno Designs Pty Ltd
-138E Basler GmbH
-138F Patapsco Designs Inc
-1390 Concept Development Inc
-1391 Development Concepts Inc
-1392 Medialight Inc
-1393 Moxa Technologies Co Ltd
- 0001 UC7000 Seria
- 1010 C101/PCI Super Sync Board
- 1020 Smartio CP-102 Series
- 1021 CP102UL (2-port RS-232 Universal PCI)
- 1022 CP102U (2-port RS-232 Universal PCI)
- 1040 Smartio (C104H/PCI)
- 1041 Smartio CP-104UL
- 1042 Smartio CP-104JU
- 1043 CP104EL (4-port RS-232 Smart PCI Express)
- 1044 POS104UL (4-port RS-232 Universal PCI)
- 1140 Industio CT-114I
- 1141 Industio CP-114 Series
- 1142 CB114 (4-port RS-232/422/485 PC/104-plus Module)
- 1180 CP118U (8-port RS-232/422/485 Smart Universal PCI)
- 1181 CP118EL (8-port RS-232/422/485 Smart PCI Express)
- 1320 Industio CP-132 Series
- 1321 Industio CP-132U Series
- 1340 UniversalPCI board, 4 ports RS-422/485 with Isolation DB9M (CP--134U-I-DB9 V2.3 UPCI Board)
- 1341 CB134I (4-port RS-422/485 PC/104-plus Module)
- 1380 CP138U (8-port RS-232/422/485 Smart Universal PCI)
- 1401 ?
- 1680 Smartio (C168H/PCI)
- 1681 CP-168U Smart Serial Board (CP-168U)
- 1682 CP168EL (8-port RS-232 Smart PCI Express)
- 2040 Intelligent CP-204J
- 2180 Intelligent C218Turbo/PCI
- 2210 ---
- 2240 ---
- 3200 Intelligent C320Turbo/PCI
- 5020 C502/PCI Dual-Port Sync Board
- 6800 dvr capture card (0x0000)
-1394 Level One Communications
- 0001 LXT1001 NetCelerator Family Gigabit Ethernet Adapter
-1395 Ambicom Inc
-1396 Cipher Systems Inc
-1397 Cologne Chip Designs GmbH
- 08B4 ISDN network Controller [HFC-4S]
- 0B4D HFC-8S ISDN 16B8D8S0 ISDN HDLC FIFO Controller with 8 S/T
- 16B8 ISDN network Controller [HFC-8S]
- 2BD0 HFC-S PCI A ISDN 2BDS0 ISDN HDLC FIFO Controller
- 30B1 ISDN network Controller [HFC-E1]
- 8B4D HFC-4S ISDN 8B4D4S0 ISDN HDLC FIFO Controller with 4 S/T
- B000 HCF-PCI card (B000)
- B006 HCF-PCI card (B006)
- B007 HCF-PCI card (B007)
- B008 HCF-PCI card (B008)
- B009 HCF-PCI card (B009)
- B00A HCF-PCI card (B00A)
- B00B HCF-PCI card (B00B)
- B00C HCF-PCI card (B00C)
- B100 HCF-PCI card (B100)
- F001 GSM Network Controller [HFC-4GSM]
-1398 Clarion Co Ltd
-1399 Rios Systems Co Ltd
-139A Alacritech Inc
- 0001 Quad Port 10/100 Server Accelerator
- 0003 Single Port 10/100 Server Accelerator
- 0005 Single Port Gigabit Server Accelerator
- 0007 Alacritech iSCSI Controller (SES2000)
-139B Mediasonic Multimedia Systems Ltd
-139C Quantum 3D Inc
-139D EPL Ltd
-139E Media4
-139F Aethra S.R.L.
-13A0 Crystal Group Inc
-13A1 Kawasaki Heavy Industries Ltd
-13A2 Ositech Communications Inc
-13A3 HI-FN Inc.
- 0005 7751 Security Processor
- 0006 Public Key Processor (6500)
- 0007 7811 Security Processor
- 0012 7951 Security Processor
- 0014 78XX Security Processor
- 0015 Security Processor (8065)
- 0016 8065 Security Processor
- 0017 8165 Security Processor
- 0018 8154 Security Processor
- 001D 7956 Security Processor
- 0020 7955 Security Processor
- 0026 8155 Security Processor
-13A4 Rascom Inc
-13A5 Audio Digital Imaging Inc
-13A6 Videonics Inc
-13A7 Teles AG
- 6240 BSRV2-301A (Network Controller)
-13A8 Exar Corp.
- 0152 XR17C/D152 Dual PCI UART
- 0154 Four Channel PCI Bus UART (XR17C154)
- 0158 Eight Channel PCI Bus UART (5V) (XR17C158)
-13A9 Siemens Medical Solutions
-13AA Broadband Networks Inc
-13AB Arcom Control Systems Ltd
-13AC Motion Media Technology Ltd
-13AD Nexus Inc
-13AE ALD Technology Ltd
-13AF T.Sqware
-13B0 Maxspeed Corp
-13B1 Tamura Corp
-13B2 Techno Chips Co Ltd
-13B3 Lanart Corp
-13B4 Wellbean Co Inc
-13B5 ARM
-13B6 DLoG GmbH
- 13B6 sguiu (0x13b6)
-13B7 LOGIC Devices Inc
-13B8 Nokia Telecommunications Oy
-13B9 Elecom Co Ltd
-13BA Oxford Instruments
-13BB Sanyo Technosound Co Ltd
-13BC Bitran Corp
-13BD Sharp Corp
-13BE Miroku Jyoho Service Co Ltd
-13BF Sharewave Inc
-13C0 Microgate Corp.
- 0010 single port multiprotocol serial adapter (SyncLink Adapter)
- 0020 low speed single port multiprotocol serial adapter (SyncLink SCC)
- 0030 4 port multiprotocol serial adapter (SyncLink 4 Port Adapter)
- 0070 single port multiprotocol serial adapter (SyncLink GT Adapter)
- 0080 4 port multiprotocol serial adapter (SyncLink GT4 Adapter)
- 0090 one port asynchronous serial adapter (SyncLink AC Adapter)
- 00A0 2 port multiprotocol serial adapter (SyncLink GT2 Adapter)
- 0210 single port multiprotocol serial adapter (SyncLink Serial Adapter version 2)
-13C1 3ware Inc
- 1000 ATA-RAID Controller (9548qad)
- 1001 ATA-133 Storage Controller (7000/8000 series)
- 1002 SATA/PATA Storage Controller (9000 series)
- 1003 SATA2 Raid Controller (9550SX/9590SE Series)
- 1004 PCI-Express SATA2 Raid Controller (9650SE Series)
- 1005 PCI-Express SATA2/SAS Raid Controller (9690SA Series)
- 1010 PCI-Express2 SAS2/SATA2 Raid Controller (9750 Series)
-13C2 Technotrend Systemtechnik GmbH
- 000E Technotrend/Hauppauge DVB card rev2.3
-13C3 Janz Computer AG
-13C4 Phase Metrics
-13C5 Alphi Technology Corp
-13C6 Condor Engineering Inc
- 0520 CEI-520 A429 Card
- 0620 CEI-620 A429 Card
- 0820 CEI-820 A429 Card
-13C7 Blue Chip Technology Ltd
- 0ADC Multi-Function Analogue/Digital IO Card
- 0B10 Parallel I/O Card
- 0D10 Digital I/O Card
- 5744 Watchdog Card
-13C8 Apptech Inc
-13C9 Eaton Corp
-13CA IOMEGA Corp
-13CB Yano Electric Co Ltd
-13CC Metheus Corp
-13CD Compatible Systems Corp
-13CE Cocom A/S
-13CF Studio Audio & Video Ltd
-13D0 Techsan Electronics Co Ltd
- 2103 B2C2 Sky2PC Core Chip sky star 2 <technisat> (T228502)
- 2200 B2C2 Broadband Receiver PCI Adapter (FCIII)
-13D1 AboCom Systems, Inc
- AB02 Ethernet Controller
- AB03 Ethernet Controller
- AB06 FE2000VX 10/100 CardBus /Atelco Fibreline Ethernet Adapter
- AB08 EZ Card 10/100 Fast Ethernet CardBus Adapter (SMC8035TX)
-13D2 Shark Multimedia Inc
-13D3 IMC Networks
-13D4 Graphics Microsystems Inc
-13D5 Media 100 Inc
-13D6 K.I. Technology Co Inc
-13D7 Toshiba Engineering Corporation
- 8086 toshiba (6205)
-13D8 Phobos Corporation
- 1000 XaQti 1000Mbit/sec Gbit Ethernet Controller (XQ11800FP)
-13D9 Apex PC Solutions Inc
-13DA IntreSource Systems Pty Ltd
-13DB Janich & Klass Computertechnik GmbH
-13DC Netboost Corp
-13DD Multimedia Bundle Inc
-13DE ABB Robotics Products AB
-13DF E-Tech Inc.
- 0001 Modem (PCI56RVP)
-13E0 GVC Corporation
-13E1 Silicom Multimedia Systems Inc
-13E2 Dynamics Research Corp
-13E3 Nest Inc
-13E4 Calculex Inc
-13E5 Telesoft Design Ltd
-13E6 Argosy Research Inc
-13E7 NAC Inc
-13E8 Chip Express Corp
-13E9 Intraserver Technology Inc
-13EA Dallas Semiconductor (Now known as Maxim)
- 3131 BoSS Bit Synchronous HDLC Controller (DS3131)
- 3134 DS3134/31256 Chateau/Envoy 256 Channel HDLC Controller
-13EB Hauppauge Computer Works Inc
-13EC Zydacron Inc
- 000A NPC-RC01 Remote control receiver
-13ED Raytheion E-Systems
-13EE Hayes Microcomputer Products Inc
-13EF Coppercom Inc
-13F0 Sundance Technology Inc
- 0200 Encorest Ethernet PCI Ad ENL832-TX-ICNT Faapter (0x0200)
- 0201 Fast Ehternet Adapter (ST201)
- 0300 Network Adapter (NX1001)
- 1021 Tamarack 9021A Gigabit Ethernet adapter (Tamarack 9021A)
- 1023 IC Plus IP1000 Family Gigabit Ethernet Adapter
- 13F0 ST201 Fast Ethernet Adapter (-PCIVEN_13F0&DEV_0200&SUBSYS_82121043&REV_313&61)
-13F1 Oce' - Technologies B.V.
-13F2 Ford Microelectronics Inc
-13F3 McData Corp
-13F4 Troika Design Inc
- 1401 Zentai Fibre Channel Adapter
-13F5 Kansai Electric Co Ltd
-13F6 C-Media Electronics Inc.
- 0100 CMI8338/C3DX PCI Audio Device
- 0101 PCI Audio Device (CMI8338-031)
- 0111 C-Media Audio Controller (CMI8738)
- 0112 PCI Audio Chip (CMI-8378B/PCI-6CH)
- 0191 CMI 8768 8CH Sound Card (PCIVEN_13F6&DEV_0191&REV_10)
- 0211 HSP56 MICROMODEM (PCIVEN_13F6&DEV_0111&SUBSYS_011113F6&REV_10_13F6&)
- 0300 pci audio driver (0x4005)
- 8788 C-Media Oxygen HD (CMI8788/PCI-8CH)
-13F7 Wildfire Communications
-13F8 Ad Lib Multimedia Inc
-13F9 NTT Advanced Technology Corp
-13FA Pentland Systems Ltd
-13FB Aydin Corp
-13FC Computer Peripherals International
-13FD Micro Science Inc
- 160E a (a)
- 161F s (1D59CB92)
- 1840 USB Harddisk adapter (don't know what you mean... :-()
-13FE Advantech Co., Ltd.
- 1240 4-Axis Stepping/Servo Motor Card (NOVA MCX314)
- 1600 PCI-16xx series PCI multiport serial board (function 0)
- 1680 2-port CAN UniversalPCI Communication Card with Isolation (PCI-1680U-A)
- 16FF PCI-16xx series PCI multiport serial board (function 1: RX/TX steering CPLD)
- 1713 32-channel Isolated Analog Input Card (PCI-1713)
- 1723 16-bit, 8-ch Analog Output PCI Card with 16-ch Digital I/O (PCI-1723)
- 1724 14-bit, 32-channel Isolated Analog Output Card (PCI-1724)
- 1733 PCI-1733 32-channel isolated digital input card
- 1750 PCI-1750 Opto Isolated Digital I/O Card w/Counter
- 1752 PCI-1752
- 1754 PCI-1754
- 1756 PCI-1756
- 1760 ?
- 1761 8-channel relay actuator and 8-channel isolated input card (PCI-1761)
- 1A00 0x0200 (0x03)
- 3730 16Bit dig. I/O Board (PCM-3730I)
-13FF Silicon Spice Inc
-1400 ARTX Inc
- 0001 ArtX1 AGP System Controller
- 0003 ArtX1 Media Device
- 0004 ArtX1 Display Device
- 1401 hd 2600xt (9432 TX)
-1401 CR-Systems A/S
-1402 Meilhaus Electronic GmbH Germany
- 2E00 ME-2000 / 2600 Multifunction Data Aquistion Card
- 4610 Multi-IO board (16x 16bit ADC, 32x TTL I/O) (ME-4610)
- 4650 Multi-IO board (16x 16bit ADC, 32x TTL I/O) (ME-4650)
-1403 Ascor Inc
-1404 Fundamental Software Inc
-1405 Excalibur Systems Inc
-1406 Oce' Printing Systems GmbH
-1407 Lava Computer Manufacturing Inc
- 0100 Lava Dual Serial 550 PCI (0439)
- 0101 Lava Quattro PCI A/B
- 0102 Lava Quattro PCI C/D
- 0110 Lava DSerial PCI Port A (0110)
- 0111 Lava DSerial PCI Port B (nep5p)
- 0180 Lava Octopus PCI Ports 1-4
- 0181 Lava Octopus PCI Ports 5-8
- 0200 LavaPort Dual-650 PCI
- 0201 LavaPort Quad-650 PCI A/B
- 0202 LavaPort Quad-650 PCI C/D
- 0220 LavaPort Quad-650 PCI A/B
- 0221 LavaPort Quad-650 PCI C/D
- 0400 Lava 8255 PIO PCI
- 0500 Lava Single Serial 550 PCI (P4)
- 0510 Lava SP Serial 550 PCI
- 0511 Lava SP BIDIR Parallel PCI
- 0520 Lava RS422 SS-PCI
- 0600 LavaPort 650 PCI (4-0 9253)
- 0A00 COM Port Accelerator (LavaPort PCI)
- 8000 Lava Parallel
- 8001 Lava Dual Parallel port A
- 8002 Lava Dual Parallel port A
- 8003 Lava Dual Parallel port B
- 8800 BOCA Research IOPPAR (2003)
-1408 Aloka Co Ltd
-1409 Timedia Technology Co Ltd
- 7168 PCI / ISA Asynchronous UART Signal Chips Solution (40371409)
- 7268 PCI parallel port (PCI / ISA IEEE1284 ECP/EPP/SPP/BPP Signal Chips So)
-140A DSP Research Inc
-140B Ramix Inc
- 0610 ?
-140C Elmic Systems Inc
-140D Matsushita Electrics Works Ltd
-140E Goepel Electronic GmbH
-140F Salient Systems Corp
-1410 Midas Lab Inc
-1411 Ikos Systems Inc
-1412 VIA Technologies Inc (Was: IC Ensemble Inc)
- 1712 ICE1712 Envy24 Multichannel Audio Controller
- 1724 Envy24PT/HT PCI Multi-Channel Audio Controller (VT1720/24)
-1413 Addonics
-1414 Microsoft Corp
-1415 Oxford Semiconductor Ltd - now part of PLX Technology
- 8401 PCI Interface to local bus (OX9162)
- 8403 OX12PCI840/OX9162 Integrated Parallel Port
- 9500 Quad UART (disabled) (OX16PCI954)
- 9501 Quad UART (OX16PCI954)
- 9504 OX16PCI954 PCI UARTs (unique bars)
- 9505 OX16PCI952 PCI UARTs (unique bars)
- 950A OX16PCI954 Dual PCI UART (??)
- 950B OXCB950 Integrated High Performance UART (CardBus/PCI Interface)
- 9510 PCI Interface (disabled) (OX16PCI954)
- 9511 OX9160/OX16PCI954 PCI Interface to 8-bit Local Bus
- 9512 OX9160/OX16PCI954 PCI Interface to 32-bit Local Bus
- 9513 OX9160/OX16PCI954 Parallel Port
- 9521 OX16PCI952 Integrated Dual UART
- 9523 Integrated Parallel Port (OX16PCI952)
- C158 2 native UARTs (function 0) (OXPCIe952)
- C15D 2 native UARTs (function 1) (OXPCIe952)
- C208 Quad UARTs (OXPCIe954)
- C20D Quad UARTs (function 1) (OXPCIe954)
- C308 Octo UARTs (OXPCIe958)
- C30D Octo UARTs (function 1) (OXPCIe958)
-1416 Multiwave Innovation Pte Ltd
-1417 Convergenet Technologies Inc
-1418 Kyushu Electronics Systems Inc
-1419 Excel Switching Corp
-141A Apache Micro Peripherals Inc
- 1035 PCI Modem Enumerator
-141B Zoom Telephonics Inc
-141C Zoom Telephonics Inc
-141D Digitan Systems Inc
-141E Fanuc Ltd
-141F Visiontech Ltd
- 6181 MPEG decoder (KFIR)
-1420 Psion Dacom PLC
- 8002 Gold Card NetGlobal 56k+10/100Mb CardBus (Ethernet part)
- 8003 Gold Card NetGlobal 56k+10/100Mb CardBus (Modem part)
-1421 ADS Technologies Inc
-1422 Ygrec Systems Co Ltd
-1423 Custom 7Technology Corp
-1424 Vidoeserver Connections
-1425 ASIC Designers Inc
- 000B T210 Protocol Engine
- 000C T204 Protocol Engine
- 0030 T310 10GbE Single Port Protocol Engine Ethernet Adapter
- 0031 T320 10GbE Dual Port Protocol Engine Ethernet Adapter
- 0032 T302 1GbE Dual Port Protocol Engine Ethernet adapter
- 0033 T304 1GbE Quad Port Protocol Engine Ethernet adapter
-1426 Storage Technology Corp
-1427 Better On-line Solutions
-1428 EDEC Co Ltd
-1429 UNEX Technology Corp
-142A Kingmax Technology Inc
-142B RadioLAN
-142C Minton Optic Industry Co Ltd
-142D Pix Stream Inc
-142E Vitec Multimedia
- 4020 VM2-2 [Video Maker 2] MPEG1/2 Encoder
- 4337 VM2-2-C7 [Video Maker 2 rev. C7] MPEG1/2 Encoder
-142F Radicom Research Inc
-1430 ITT Aerospace/Communications Division
-1431 Gilat Satellite Networks
-1432 Edimax Computer Co
- 9230 Realtek RTL8169/8110 Family PCI Gigabit Ethernet NIC
-1433 Eltec Elektronik GmbH
-1435 RTD Embedded Technologies, Inc.
- 0531 DELETE (DELETE)
- 4520 PCI4520 PCI Data Acquisition Controller
- 6020 PCI-104 dspModule (SPM6020)
- 6030 PC/104-Plus dspModule (SPM6030)
- 6420 PC/104-Plus dspModule (SPM186420)
- 6430 PC/104-Plus dspModule (SPM176430)
- 7520 PC/104-Plus dataModule (DM7520)
- 7540 PC/104-Plus dataModule with SmartCal (SDM7540)
-1436 CIS Technology Inc
-1437 Nissin Co Inc
-1438 Atmel-Dream
-1439 Outsource Engineering & Manufacturing Inc
-143A Stargate Solutions Inc
-143B Canon Research Center, America
-143C Amlogic Inc
-143D Tamarack Microelectronics Inc
-143E Jones Futurex Inc
-143F Lightwell Co Ltd - Zax Division
-1440 Algol Corp
-1441 AGIE Ltd
-1442 Phoenix Contact Co GmbH
- 0002 Interbus PCI MPM Board
- 0004 Interbus PCI MPM Board
- 0005 Interbus PCI MPM Board
-1443 Unibrain S.A.
-1444 TRW
-1445 Logical do Ltd
-1446 Graphin Co Ltd
-1447 AIM GmbH
-1448 Alesis Studio
- 0001 Audio Editing (ADAT/EDIT)
-1449 TUT Systems Inc
-144A ADLINK Technology Inc
- 7230 PCI-7230
- 7248 PLX PCI9052 (PCI-9052)
- 7250 PLX PCI9052 (PCI-7250)
- 7256 PCI-7256 16-CH Latching Relay & 16-CH Isolated Digital Input Card (PCI-7256)
- 7296 96-ch digital I/O card (PCI-7296 (PLX PCI-9052))
- 7432 PCI-7432
- 7433 64-ch digital Input card (PCI-7433)
- 7434 PCI-7434
- 7841 SJA 1000- baseddual port CAN bus card (PCI-7841)
- 8133 PCI-8133
- 8554 PCI-8554
- 9111 PCI-9111
- 9113 PCI-9113
- 9114 PCI-9114
-144B Loronix Information Systems, Inc.
- 0601 ?
-144C Catalina Research Inc
-144D Samsung Electronics Co Ltd
-144E Olitec
-144F Askey Computer Corp
-1450 Nexus Systems Inc
-1451 SP3D Chip Design GmbH
-1453 Mycom Inc
-1454 Altiga Networks
-1455 Logic Plus Plus Inc
-1456 Advanced Hardware
-1457 Nuera Communications Inc
-1458 Giga-Byte Technologies
- 1458 microsoft (0x1458)
- 5000 GA-X48T-DQ6 (0x29e0)
-1459 Dooin Electronics
-145A Escalate Networks Inc
-145B Praim SRL
-145C Cryptek
-145D Gallant Computer Inc
-145E Aashima Technology B.V.
-145F Baldor Electric Company
- 0001 Multi-axis Motion Controller (NextMove PCI)
- 0002 Multi-axis Motion Controller (NextMove PCI-2)
-1460 Dynarc Inc
-1461 Avermedia Technologies Inc
-1462 Micro-Star International Co Ltd (MSI)
- 00C1 NX6800-TD256E (NV41.1)
- 4720 Audio controller
- 5071 Audio controller
- 7120 ?
- 7960 MCP2T (MCP2T)
-1463 Fast Corp
-1464 Interactive Circuits & Systems Ltd
-1465 GN Nettest Telecom Division
-1466 Designpro Inc
-1467 Digicom SPA
-1468 Ambit microsystem Corp
-1469 Cleveland Motion Controls
-146A IFR Ltd
-146B Parascan Technologies Ltd
-146C Ruby Tech Corp
-146D Tachyon Inc
-146E Williams Electronic Games Inc
-146F Multi Dimensional Consulting Inc
-1470 Bay Networks
-1471 Integrated Telecom Express Inc (ITE)
- 0188 ADSL PCI (RoadRunner 10)
-1472 Daikin Indistries Ltd
-1473 Zapex Technologies Inc
-1474 Doug Carson & Associates
-1475 Picazo Communications
-1476 Mortara Instrument Inc
-1477 Net Insight
-1478 Diatrend Corp
-1479 Toray Industries Inc
-147A Formosa Industrial Computing
-147B Abit Computer Corp
-147C Aware Inc
-147D Interworks Computer Products
-147E Matsushita Graphic Communication Systems Inc
-147F Nihon Unisys Ltd
-1480 SCII Telecom
-1481 Biopac Systems Inc
-1482 Isytec
-1483 Labway Corp
-1484 Logic Coporation
-1485 ERMA - Electronic GmbH
-1486 L3 Communications Telemetry & Instrumentation
-1487 Marquette Medical Systems
-1488 Kontron Electronik GmbH
-1489 KYE Systems Corp
-148A OPTO 22
-148B Innomedialogic Inc
-148C PowerColor (C.P. Technology Co Ltd)
- 4011 RADEON 9000 PRO EVIL COMMANDO (RV250)
- 4152 0x2079 (0x1002)
-148D Digicom Systems Inc.
- 1003 Creative ModemBlaster V.90 PCI DI5655 (Rockwell HCF chipset)
-148E OSI Plus Corp
-148F Plant Equipment Inc.
- 2573 802.11 bg (1192Af7b)
- 2870 802.11 n WLAN (1.0)
-1490 Stone Microsystems Pty Ltd
-1491 Zeal Corp
-1492 TIME LOGIC Corp
-1493 Maker Communications
-1494 Wintop Technology Inc
-1495 Tokai Communications Industry Co Ltd
-1496 Joytech Computer Co Ltd
-1497 SMA Regelsysteme GmbH
-1498 Tews Datentechnik GmbH
-1499 Emtec Co Ltd
-149A Andor Technology Ltd
-149B Seiko Instruments Inc
-149C Ovislink Corp
-149D Newtek Inc
-149E Mapletree Networks Inc
-149F Lectron Co Ltd
-14A0 Softing GmbH
-14A1 Systembase Co Ltd
-14A2 Millennium Engineering Inc
-14A3 Maverick Networks
-14A4 GVC/BCM Advanced Research
-14A5 Xionics Document Technologies Inc
-14A6 Inova Computers GmbH & Co KG
-14A7 Mythos Systems Inc
-14A8 Featron Technologies Corp
-14A9 Hivertec Inc.
- AD1F 1
-14AA Advanced MOS Technology Inc
-14AB Mentor Graphics Corp
-14AC Novaweb Technologies Inc
-14AD Time Space Radio AB
-14AE CTI Inc
-14AF Guillemot Corp
-14B0 BST Communication Technology Ltd
-14B1 Nextcom K.K.
- 1033 RH56D-PCI (R6795-12)
- 2F30 zyxel omni 56k CI lus rev. (01)
-14B2 Ennovate Networks Inc
-14B3 Xpeed Inc.
- 0000 DSL NIC (9ff-usa-a99-99-0970)
-14B4 Philips Business Electronics B.V.
-14B5 Creamware GmbH
- 0200 Scope
- 0300 Pulsar
- 0400 Pulsar SRB
- 0600 Pulsar 2
- 0800 DSP-Board
- 0900 DSP-Board
- 0A00 DSP-Board
- 0B00 DSP-Board
-14B6 Quantum Data Corp
-14B7 Proxim Inc.
- 0001 pci9052 (Symphony 4110)
-14B8 Techsoft Technology Co Ltd
-14B9 Aironet Wireless Communications (Cisco)
- 0001 werwerwerwe (PC4800)
- 0340 Cisco Systems 340 Series PCI Wireless LAN Adapter
- 0350 Cisco Systems 350 Series PCI Wireless LAN Adapter
- 2500 Wireless PCI LAN Adapter (PC2500 DS)
- 3100 Wireless PCI LAN Adapter (PC3100 FH)
- 3101 Wireless PCI LAN Adapter (PC3100 FH)
- 3500 Wireless PCI LAN Adapter (PC3500 FH)
- 4500 Wireless PCI LAN Adapter (PC4500 DS)
- 4800 Wireless PCI LAN Adapter (PC4800 DS)
- A504 Cisco Aironet 350 Series Mini-PCI (MPI350) (A504 Cisco MAC)
- A505 Cisco Aironet CB20a 802.11a Wireless LAN Adapter
- A506 802.11b/g wireless adapter (AIR-MP21G)
-14BA Internix Inc
-14BB Semtech Corp
-14BC Globespan Semiconductor Inc
- D002 Pulsar [PCI ADSL Card]
- D00F Pulsar [PCI ADSL Card]
-14BD Cardio Control N.V.
-14BE L3 Communications
-14BF Spider Communications Inc
-14C0 Compal Electronics Inc
-14C1 Myricom Inc.
- 0008 Myri-10G Dual-Protocol NIC (10G-PCIE-8A)
- 8043 Myrinet 2000 Scalable Cluster Interconnect
-14C2 DTK Computer
-14C3 Mediatek Corp
-14C4 Iwasaki Information Systems Co Ltd
-14C5 ABB Automation Products AB
-14C6 Data Race Inc
-14C7 Modular Technoloy Holdings Ltd
-14C8 Turbocomm Tech Inc
-14C9 ODIN Telesystems Inc
-14CA PE Logic Corp
-14CB Billionton Systems Inc/Cadmus Micro Inc
-14CC Nakayo Telecommunications Inc
-14CD Universal Scientific Ind
-14CE Whistle Communications
-14CF TEK Microsystems Inc.
- 2920 Serial I/O Controller aka FPMC-DFLEX64 (FPMC-FIO1-F100-1)
-14D0 Ericsson AXE R & D
-14D1 Computer HI-TECH Co Ltd
-14D2 Titan Electronics Inc
- 8001 VScom PCI-010L 1 x Printer Controller
- 8002 VScom PCI-020L 2 x Printer Controller
- 8010 VScom PCI-100L 1 x RS-232 Controller
- 8011 VScom PCI-110L 1 x RS-232 and 1 x Printer Controller
- 8020 VScom PCI-200L 2 x RS-232 Controller
- 8021 VScom PCI-210L 2 x RS-232 and 1 x Printer Controller
- 8040 VScom PCI-400L 4 x RS-232 Controller
- 8041 VScom PCI-410L 4 x RS-232 and 1 x Printer Controller
- 8042 VScom PCI-420L 4 x RS-232 and 2 x Printer Controller
- 8080 VScom PCI-800L 8 x RS-232 Controller
- A000 VScom PCI-010H 1 x Printer Controller
- A001 VScom PCI-110H 1 x RS-232 and 1 x Printer Controller
- A003 VScom PCI-400H 4 x RS-232 Controller
- A004 VScom PCI-400HF1 4 x RS-232 Controller
- A005 VScom PCI-200H 2 x RS-232 Controller
- E001 VScom PCI-010HV2 1 x Printer Controler
- E010 VScom PCI-100HV2 1 x RS-232 Controller
- E020 VScom PCI-200HV2 2 x RS-232 Controller
- FFFF VScom Dummy Controller
-14D3 Cirtech (UK) Ltd
-14D4 Panacom Technology Corporation
- 0400 Interface chip (Panacom 7)
-14D5 Nitsuko Corp
-14D6 Accusys Inc
- 6101 ACS-61xxx, PCIe to SAS/SATA RAID HBA
- 6201 ACS-62xxx, External PCIe to SAS/SATA RAID controller
-14D7 Hirakawa Hewtech Corp
-14D8 Hopf Elektronik GmbH
-14D9 Alpha Processor Inc
- 0010 AP1011/SP1011 HyperTransport-PCI Bridge [Sturgeon]
- 9000 AS90L10204/10208 HyperTransport to PCI-X Bridge
-14DA National Aerospace Laboratories
-14DB Avlab Technology Inc.
- 2100 download drivers (PCI IO 1S)
- 2101 PCI IO 1S-650
- 2102 PCI IO 1S-850
- 2110 OX16PCI952 (PCI IO 1S1P)
- 2111 PCI IO 1S1P-650
- 2112 PCI IO 1S1P-850
- 2120 PCI IO 1P, TK9902, Avlab P005
- 2121 Avlab Technology PCI IO 2P (PCI IO 2P)
- 2130 2 Port PCI Serial Card (PCI IO 2S)
- 2131 pci serial port (PCI IO 2S-650)
- 2132 PCI IO 2S-850
- 2140 PCI IO 2P1S
- 2141 PCI IO 2P1S-650
- 2142 PCI IO 2P1S-850
- 2144 PCI IO 2P2S
- 2145 PCI IO 2P2S-650
- 2146 PCI IO 2P2S-850
- 2150 PCI IO 4S
- 2151 PCI IO 4S-654
- 2152 PCI IO 4S-850
- 2160 PCI IO 2S1P
- 2161 PCI IO 2S1P-650
- 2162 PCI IO 2S1P-850
- 2180 VEN_14DB&DEV_2180&SUBSYS_218014DB&REV_00 (PCI IO 8S)
- 2181 Avlab Technology Inc (PCI IO 8S-654)
- 2182 Avlab Technology Inc (PCI IO 8S-850)
-14DC Amplicon Liveline Limited
- 0000 PCI230 16-chan A/D, 2-chan D/A, 24 DIO, 3 counter timers
- 0001 4-port high speed RS-232 (PCI242H)
- 0002 8-port high speed RS-232 (PCI244H)
- 0003 2-port high speed RS-232 (PCI247H)
- 0004 2-port high speed RS-422/485 (PCI248H)
- 0005 2-port high speed RS-232 and RS-422/485 (PCI249H)
- 0006 16-channel analog input (with timers) (PCI260)
- 0007 PCI224 16-channel 12-bit analog output (with timers)
- 0008 PCI234 4-channel 16-bit analogue output (with timers)
- 0009 24-channel digital I/O (PCI236)
- 000A 72-channel digital I/O (PCI272)
- 000B PCI215 48-channel digital I/O with 6 counter timers
- 000C 16-channel reed relay output (PCI263)
-14DD Bolder Design Labs Inc
-14DE Applied Integration Corp
-14DF Basis Communications Corp
-14E1 Invertex
-14E2 Infolibria
-14E3 Amtelco
-14E4 Broadcom Corporation
- 034F ??? (NV36GL?)
- 04B5 Broadcom 54bg Wireless (BCM4312)
- 0800 Sentry5 Chipcommon I/O Controller (BCM33xx/47xx)
- 0804 Sentry5 PCI Bridge (BCM33xx/47xx)
- 0805 Sentry5 MIPS32 CPU (BCM33xx/47xx)
- 0806 Sentry5 Ethernet Controller (BCM33xx/47xx)
- 080B Sentry5 Crypto Accelerator (BCM33xx/47xx)
- 080F Sentry5 DDR/SDR RAM Controller (BCM33xx/47xx)
- 0811 Sentry5 External Interface (BCM33xx/47xx)
- 0816 Sentry5 MIPS32 CPU (BCM3302)
- 14E4 802.11b/g Wireless Lan Controller (BCM5787M)
- 1600 NetXtreme BCM5752 Gigabit Ethernet PCI Express (BCM5752)
- 1601 NetXtreme BCM5752M Gigabit Ethernet PCIe
- 1612 Broadcom Video Decoder/Accelerator (BCM70010/BCM70012)
- 1639 NetXtreme II Gigabit Ethernet (BCM5709)
- 163A NetXtreme II BCM5709S Gigabit Ethernet
- 1644 BCM5700 NetXtreme Gigabit Ethernet Controller
- 1645 broadtcomBCM5701 Gigabit Ethernet (BCM5701)
- 1646 NetXtreme Gigabit Ethernet (BCM5702x1)
- 1647 NetXtreme Gigabit Ethernet (BCM5703)
- 1648 NetXtreme Dual Gigabit Adapter (BCM5704)
- 1649 NetXtreme BCM5704S_2 Gigabit Ethernet
- 164A BCM5706 NetXtreme II Gigabit Ethernet
- 164C Broadcom NetXtreme II Gigabit Ethernet Adapter (BCM5708)
- 164D NetXtreme Fast Ethernet Controller (BCM5702FE)
- 1653 Broadcom NetXtreme Gigabit Ethernet (BCM5788)
- 1654 NetXtreme Gigabit Ethernet (BCM5705-)
- 1658 BCM5750A1 NetXtreme Gigabit Ethernet
- 1659 NetXtreme Gigabit Ethernet PCI Express (BCM5721)
- 165A Broadcom NetXtreme BCM5722 Gigabit (94309)
- 165D Broadcom NetXtreme Gigabit Ethernet (BCM5705M)
- 165E BCM5705MA2 NetXtreme Gigabit Ethernet
- 1668 NetXtreme BCM5714 Gigabit Ethernet
- 1669 NetXtreme 5714S Gigabit Ethernet
- 166A Broadcom NetXtreme Gigabit Ethernet 5780 (BCM5780)
- 166B NetXtreme Gigabit Ethernet (BCM5780S)
- 166D NetXtreme Ethernet 100kB (BCM5705MFE)
- 166E BCM5705F 10/100 Integrated Controller
- 1672 NetXtreme BCM5754M Gigabit Ethernet PCIe
- 1673 NetXtreme BCM5755M Gigabit Ethernet PCIe
- 1674 NetXtreme BCM5756ME Gigabit Ethernet PCIe
- 1676 NetXtreme Gigabit Ethernet (BCM5750A1)
- 1677 NetXtreme Gigabit Ethernet PCI Express (BCM5750A1)
- 1678 BCM5715C 10/100/100 PCIe Ethernet Controller
- 1679 NetXtreme 5715S Gigabit Ethernet
- 167A Broadcom NetXtreme Gigabit Ethernet Controller (BCM5754)
- 167B NetXtreme Gigabit Ethernet (BCM5755/5780)
- 167C BCM5750A1 NetXtreme Gigabit Ethernet
- 167D Broadcom NetXtreme Gigabit Ethernet (BCM5751M)
- 167E BCM5751F NetXtreme Fast Ethernet PCIe
- 167F NetLink BCM5787F Fast Ethernet PCIe
- 1681 Broadcom 57XX Gigabit Integrated Controller (BCM5761)
- 1684 Broadcom NetXtreme Gigabit Ethernet (BCM5764)
- 1693 Ethernet Controller Broadcom Netlink Gigabit (BCM5787A)
- 1696 Broadcom NetXtreme Gigabit Ethernet - http://www.broadcom.com/support/ethernet_nic/downloaddrivers.p (BCM5782)
- 1698 NetLink (BCM5786gigabit ethernet pcie)
- 169A NetLink BCM5786 Gigabit Ethernet PCIe
- 169B NetLink BCM5787 Gigabit Ethernet PCIe
- 169C Broadcom NetLink (TM) Gigabit Ethernet (BCM5788)
- 169D Broadcom Ethernet Adapter (BCM5782k, BCM5789)
- 169E NetXtreme Gigabit Ethernet PCI Express (BCM5754)
- 16A6 BCM5702X NetXtreme Gigabit Ethernet
- 16A7 BCM5703X NetXtreme Gigabit Ethernet
- 16A8 NetXtreme Gigabit Ethernet (BCM5704)
- 16AA BroadCom NetExtreme II Server (B06BDRV)
- 16AC NetXtreme II BCM5708S Gigabit Ethernet
- 16C6 NetXtreme Gigabit Ethernet (BCM5702A3)
- 16C7 BCM5703A3 NetXtreme Gigabit Ethernet
- 16DD NetLink BCM5781 Gigabit Ethernet PCIe
- 16F7 NetXtreme BCM5753 Gigabit PCI Express (BCM5753)
- 16FD NetXtreme Gigabit Ethernet PciXpress (BCM5753M)
- 16FE BCM5753F NetXtreme Fast Ethernet PCIe
- 16FF NetXtreme Gigabit Ethernet
- 170C Broadcom NetLink 4401 10/100 Ethernet NIC (BCM4401)
- 170D BCM5901 NetXtreme Fast Ethernet
- 170E BCM5901 NetXtreme Fast Ethernet
- 1712 NetLink BCM5906 Fast Ethernet PCIe
- 1713 Broadcom NetLink (TM) Fast Ethernet (BCM5906m)
- 3352 BCM3352 QAMLink Single-Chip 4-Line VoIP (BCM3352)
- 3360 Advanced PHY Broadband Gateway Cable Modem (BCM3360)
- 4210 BCM4210 iLine10 HomePNA 2.0
- 4211 BCM4211 iLine10 HomeHPNA 2.0 10Mb/s NIC
- 4212 56k Modem (BCM V.90)
- 4220 802-11b/g Wireless PCI controller
- 4301 Dell Truemobile 1180 802.11g MiniPCI (Broadcom BCM4301 802.11g Wireless LAN Controller)
- 4303 BCM4301 802.11b802.11b Wireless LAN Controller (BCM4303)
- 4305 V.90 56k Modem (BCM4307)
- 4306 Unknown device 4306 (rev 02) (BCM4306)
- 4307 802.11b Wireless LAN Controller (BCM4306)
- 4310 BCM4301 802.11bChipcommon I/O Controller (BCM4310)
- 4311 Broadcom Corporation Dell Wireless 1390 WLAN Mini-PCI Card (BCM4311)
- 4312 BCM4310 UART (Wireless Ethernet Adapter)
- 4313 wireless network card (BCM4310)
- 4315 Broadcom Wireless b/g (BCM4315/BCM22062000)
- 4318 Broadcom 802.11b/g (BCM4318)
- 4319 Dell Wireless 1470 DualBand WLAN
- 431A 802.11a Network Adapter
- 4320 802.11b/g Wireless LAN Controller (BCM4309)
- 4321 802.11a Wireless LAN Controller (BCM4306)
- 4322 UART (BCM4306)
- 4323 V.90 56k Modem (BCM4306)
- 4324 802.11a/b/g Wireless LAN Controller (BCM4309)
- 4325 802.11b/g Wireless LAN Controller (BCM4306)
- 4326 BCM4307 Chipcommon I/O Controller(??)
- 4328 Broadcom 432AGN 802.11a/b/g/draft-n Wi-Fi Solution (BCM4321KFBG)
- 4329 BCM43XNG 802.11n Network Adapter
- 432A 802.11n Network Adapter
- 432B WIRELESS for Hp pavilion, Wireless for macbook pro (late 2009 model), Wireless for Dell e6500 , Ali
- 4344 EDGE/GPRS data and 802.11b/g combo cardbus [GC89]
- 4401 10/100 Integrated Ethernet Controller (BCM4401)
- 4402 10/100 Integrated Ethernet Controller (BCM440)
- 4403 V.90 56k Modem (BCM4402)
- 4410 BCM4410 iLine32(tm) Network Adapter
- 4411 V.90 56k Modem (BCM4212)
- 4412 BCM4412 10/100 Ethernet Network Adapter
- 4430 CardBus iLine32 HomePNA 2.0 (BCM44xx)
- 4431 V.90 56k Modem
- 4432 CardBus 10/100BaseT Ethernet (BCM44xx)
- 4610 Sentry5 PCI to SB Bridge (BCM4610)
- 4611 Sentry5 iLine32 HomePNA 1.0 (BCM4610)
- 4612 Sentry5 V.90 56k Modem (BCM4610)
- 4613 Sentry5 Ethernet Controller (BCM4610)
- 4614 Sentry5 External Interface (BCM4610)
- 4615 Sentry5 USB Controller (BCM4610)
- 4704 Sentry5 PCI to SB Bridge (BCM4704)
- 4705 BCM4704 Sentry5 802.11b Wireless LAN Controller
- 4706 BCM4704 Sentry5 Ethernet Controller
- 4707 BCM4704 Sentry5 USB Controller
- 4708 Crypto Accelerator (BCM4704)
- 4710 Sentry5 PCI to SB Bridge (BCM4710)
- 4711 Sentry5 iLine32 HomePNA 2.0 (BCM47xx)
- 4712 Sentry5 V.92 56k modem (BCM47xx)
- 4713 Sentry5 Ethernet Controller (BCM47xx)
- 4714 Sentry5 External Interface (BCM47xx)
- 4715 Sentry5 USB Controller (BCM47xx)
- 4716 Sentry5 USB Host Controller (BCM47xx)
- 4717 Sentry5 USB Device Controller (BCM47xx)
- 4718 Sentry5 Crypto Accelerator (BCM47xx)
- 4719 BCM47xx/53xx RoboSwitch Core
- 4720 MIPS CPU (BCM4712)
- 5365 Sentry5 PCI to SB Bridge (BCM5365P)
- 5600 StrataSwitch 24+2 Ethernet Switch Controller (BCM5600)
- 5605 StrataSwitch 24+2 Ethernet Switch Controller (BCM5605)
- 5615 StrataSwitch 24+2 Ethernet Switch Controller (BCM5615)
- 5625 StrataSwitch 24+2 Ethernet Switch Controller (BCM5625)
- 5645 StrataSwitch 24+2 Ethernet Switch Controller (BCM5645)
- 5670 8-Port 10GE Ethernet Switch Fabric (BCM5670)
- 5680 G-Switch 8-Port Gigabit Ethernet Switch Controller (BCM5680)
- 5690 12-port Multi-Layer Gigabit Ethernet Switch (BCM5690)
- 5691 GE/10GE 8+2 Gigabit Ethernet Switch Controller (BCM5691)
- 5692 BCM5692 12-port Multi-Layer Gigabit Ethernet Switch
- 5695 BCM5695 12-port + HiGig Multi-Layer Gigabit Ethernet Switch
- 5698 BCM5698 12-port Multi-Layer Gigabit Ethernet Switch
- 5802 The BCM5802 Security Processor integrates Broadcoms IPSec engine (DES, 3DES, HMAC-SHA-1, HMAC-MD5), (BCM5802)
- 5805 The BCM5805 Security Processor integrates a high-performance IPSec engine (DES, 3DES, HMAC-SHA-1, HM (BCM5805)
- 5820 Crypto Accelerator (BCM5820)
- 5821 Crypto Accelerator (BCM5821)
- 5822 Crypto Accelerator (BCM5822)
- 5823 Crypto Accelerator (BCM5823)
- 5824 Crypto Accelerator (BCM5824)
- 5825 BCM5825 (BCM5825)
- 5840 Crypto Accelerator (BCM5840)
- 5841 Crypto Accelerator (BCM5841)
- 5850 Crypto Accelerator (BCM5850)
- 7321 network card integrated (BCM5751)
- 7411 High Definition Video/Audio Decoder (BCM7411)
-14E5 Pixelfusion Ltd
-14E6 Shining Technology Inc
-14E7 3CX
-14E8 Raycer Inc
-14E9 Garnets System Co Ltd
-14EA Planex Communications, Inc.
- AB06 10/100 Fast Ethernet CardBus (RTL8139) (FNW-3603-TX)
- AB07 RTL81xx RealTek Ethernet
- AB08 FNW-3602-TX CardBus Fast Ethernet
-14EB Seiko Epson Corporation
- 0020 PCI to S5U13xxxB00B Bridge Adapter (BEMx.x)
- 0C01 Embedded Memory Display Controller (S1D13808)
-14EC Acqiris
-14ED Datakinetics Ltd
-14EE Maspro Kenkoh Corp
-14EF Carry Computer Engineering Co Ltd
-14F0 Canon Reseach Centre France
-14F1 Conexant Systems, Inc.
- 0F00 ..........
- 1002 HCF 56k Modem
- 1003 HCF 56k Modem
- 1004 HCF 56k Modem
- 1005 HCF 56k Modem
- 1006 HCF 56k Modem
- 1022 HCF 56k Modem
- 1023 HCF 56k Modem
- 1024 HCF 56k Modem
- 1025 HCF 56k Modem
- 1026 HCF 56k Modem
- 1031 dfd
- 1032 HCF 56k Modem
- 1033 HCF 56K Winmodem
- 1034 HCF 56k DFVS Modem
- 1035 PCI Modem Enumerator
- 1036 unknown (Conexant RH56D/SP-PCI)
- 1052 HCF 56k Data/Fax Modem (Worldwide)
- 1053 HCF 56k Data/Fax Modem (Worldwide)
- 1054 HCF 56k Data/Fax/Voice Modem (Worldwide)
- 1055 HCF 56k Data/Fax/Voice/Spkp (w/Handset) Modem (Worldwide)
- 1056 HCF 56k Data/Fax/Voice/Spkp Modem (Worldwide)
- 1057 HCF 56k Data/Fax/Voice/Spkp Modem (Worldwide)
- 1058 HCF P96 Data/Fax/Voice/Spkp Modem
- 1059 HCF 56k Data/Fax/Voice Modem (Worldwide)
- 1063 HCF 56k Data/Fax Modem
- 1064 HCF 56k Data/Fax/Voice Modem
- 1065 HCF 56k Data/Fax/Voice/Spkp (w/Handset) Modem
- 1066 HCF 56k Data/Fax/Voice/Spkp Modem
- 1085 CX11250 SmartHSF Mobile Modem host side device
- 10B3 HCF Data/Fax
- 10B4 All Conextant HFC Modems (PCI) (Conextant HFC)
- 10B5 HCF Data/Fax/Voice/Spkp
- 10B6 Conexant HCF PCI Soft modem (unknown)
- 1433 HCF 56k Data/Fax Modem
- 1434 HCF 56k Data/Fax/Voice Modem
- 1435 HCF 56k Data/Fax/Voice/Spkp (w/Handset) Modem
- 1436 HCF 56k Data/Fax Modem
- 1453 HCF 56k Data/Fax Modem
- 1454 HCF 56k Data/Fax/Voice Modem
- 1455 HCF 56k Data/Fax/Voice/Spkp (w/Handset) Modem
- 1456 HCF 56k Data/Fax/Voice/Spkp Modem
- 14F1 Conextant High Definition Audio_Venice5051 (14F12F30)
- 1610 ADSL AccessRunner PCI Arbitration Device
- 1611 AccessRunner PCI ADSL Interface Device
- 1612 8
- 1620 ADSL AccessRunner V2 PCI Arbitration Device
- 1621 AccessRunner V2 PCI ADSL Interface Device
- 1622 AccessRunner V2 PCI ADSL Yukon WAN Adapter
- 1803 HCF 56k Modem
- 1815 HCF 56k Modem
- 1F10 HCF Data/Fax (USA)
- 1F11 HCF Data/Fax (Worldwide)
- 1F14 HCF Data/Fax/Voice (USA)
- 1F15 HCF Data/Fax/Voice (Worldwide)
- 2003 SoftK56 Winmodem
- 2004 SoftK56 RemoteTAM Winmodem
- 2005 SoftK56 Speakerphone Winmodem
- 2006 SoftK56 Speakerphone Winmodem
- 2013 SoftK56 Winmodem
- 2014 SoftK56 RemoteTAM Winmodem
- 2015 SoftK56 Speakerphone Winmodem
- 2016 SoftK56 Speakerphone Winmodem
- 2043 HSF 56k Data/Fax Modem (WorldW SmartDAA)
- 2044 HSF 56k Data/Fax/Voice Modem (WorldW SmartDAA)
- 2045 HSF 56k Data/Fax/Voice/Spkp (w/Handset) Modem (WorldW SmartDAA)
- 2046 HSF 56k Data/Fax/Voice/Spkp Modem (WorldW SmartDAA)
- 2053 HSF Data/Fax
- 2054 HSF Data/Fax/TAM
- 2055 HSF Data/Fax/Voice/Spkp
- 2056 HSF Data/Fax/TAM/Spkp
- 2063 HSF 56k Data/Fax Modem (SmartDAA)
- 2064 HSF 56k Data/Fax/Voice Modem (SmartDAA)
- 2065 HSF 56k Data/Fax/Voice/Spkp (w/Handset) Modem (SmartDAA)
- 2066 HSF 56k Data/Fax/Voice/Spkp Modem (SmartDAA)
- 2093 HSF 56k Modem
- 2143 HSF 56k Data/Fax/Cell Modem (Mob WorldW SmartDAA)
- 2144 HSF 56k Data/Fax/Voice/Cell Modem (Mob WorldW SmartDAA)
- 2145 HSF 56k Data/Fax/Voice/Spkp (w/HS)/Cell Modem (Mob WorldW SmartDAA)
- 2146 HSF 56k Data/Fax/Voice/Spkp/Cell Modem (Mob WorldW SmartDAA)
- 2163 HSF 56k Data/Fax/Cell Modem (Mob SmartDAA)
- 2164 HSF 56k Data/Fax/Voice/Cell Modem (Mob SmartDAA)
- 2165 HSF 56k Data/Fax/Voice/Spkp (w/HS)/Cell Modem (Mob SmartDAA)
- 2166 HSF 56k Data/Fax/Voice/Spkp/Cell Modem (Mob SmartDAA)
- 2343 HSF 56k Data/Fax CardBus Modem (Mob WorldW SmartDAA)
- 2344 HSF 56k Data/Fax/Voice CardBus Modem (Mob WorldW SmartDAA)
- 2345 HSF 56k Data/Fax/Voice/Spkp (w/HS) CardBus Modem (Mob WorldW SmartDAA)
- 2346 HSF 56k Data/Fax/Voice/Spkp CardBus Modem (Mob WorldW SmartDAA)
- 2363 HSF 56k Data/Fax CardBus Modem (Mob SmartDAA)
- 2364 HSF 56k Data/Fax/Voice CardBus Modem (Mob SmartDAA)
- 2365 HSF 56k Data/Fax/Voice/Spkp (w/HS) CardBus Modem (Mob SmartDAA)
- 2366 HSF 56k Data/Fax/Voice/Spkp CardBus Modem (Mob SmartDAA)
- 2400 unknown (unknown)
- 2443 HSF 56k Data/Fax Modem (Mob WorldW SmartDAA)
- 2444 HSF 56k Data/Fax/Voice Modem (Mob WorldW SmartDAA)
- 2445 HSF 56k Data/Fax/Voice/Spkp (w/HS) Modem (Mob WorldW SmartDAA)
- 2446 HSF 56k Data/Fax/Voice/Spkp Modem (Mob WorldW SmartDAA)
- 2463 HSF 56k Data/Fax Modem (Mob SmartDAA)
- 2464 HSF 56k Data/Fax/Voice Modem (Mob SmartDAA)
- 2465 HSF 56k Data/Fax/Voice/Spkp (w/HS) Modem (Mob SmartDAA)
- 2466 HSF 56k Data/Fax/Voice/Spkp Modem (Mob SmartDAA)
- 2702 HSFp or Soft V92 Data Fax Modem (cx11252-11)
- 2BFA HDA D100 MDC v.92 Modem (Unknown)
- 2C06 CXT - Network - HDAUDIO Soft Data Fax Modem with SmartCP
- 2F00 HSF 56k HSFi Churchill Data/Fax Modem
- 2F01 missing driver for pci simple communications controller (0x0780)
- 2F02 HSF 56k HSFi Churchill Data/Fax Modem
- 2F04 CX11252 Modem
- 2F05 CX11252 Modem
- 2F10 HSF Data/Fax (USA)
- 2F11 HSF 56K Data/Fax
- 2F12 HSF Data/Fax/Voice (USA)
- 2F13 HSF Data/Fax (USA)
- 2F14 US Robotics 56K PCI Software Modem
- 2F15 US Robotics 56K Fax Host Int
- 2F20 SoftV92 Data Fax Modem with SmartCP (CX11256)
- 2F30 PCI SoftV92 Modem (CX11252-41z)
- 2F40 Conexant Modem RD02-D490 (71030277)
- 2F50 unknown (205F14F1)
- 2F82 Conexant PCI-E Soft Data/Fax Modem with SmartCP (cx9510-11z)
- 5045 HDAUDIO Soft Data Fax Modem with SmartCP / Conexant High Definition Audio (SmartAudio HD2) (4.0.3.1)
- 5051 Audio (4.0.1.6)
- 5B7A Single-Chip MPEG-2 Encoder with Integrated Analog Video/Broadcast Audio Decoder (Belived to be a CX23416)
- 8234 RS8234 ATM SAR Controller [ServiceSAR Plus]
- 8237 CN8237 ATM OC2 ServiceSAR+ Controller with BR Traffic Management
- 8471 CN8471A 32 Channel HDLC Controller
- 8472 CN8472A 64 Channel HDLC Controller
- 8474 CN8474A 128 Channel HDLC Controller
- 8478 CN8478 256 Channel HDLC Controller
- 8502 CX28500 676 Channel HDLC Controller
- 8503 CX28500 1024 Channel HDLC Controller
- 8563 CX28560 2047 Channel HDLC Controller
- 8800 Conexant 23881 Video Capture (NTSC) (2003)
- 8801 CX2388x TV Capture Chip
- 8802 CX2388x TV Capture Chip
- 8803 CX2388x TV Capture Chip
- 8804 CX2388x TV Capture Chip
- 8811 CX2388x TV Capture Chip
- 8852 CX23881-21 (cx23885)
- 8880 PCI Express Video and Broadcast Audio Decoder (CX23888)
-14F2 Mobility Electronics, Inc.
- 0001 Moselle Split Bridge
- 0002 Capilano Split Bridge
- 0120 EV1000 PCI to PCI Bridge
- 0121 EV1000 Parallel port
- 0122 PCI Serial Port (unknown)
- 0123 EV1000 Keyboard Controller
- 0124 PCI PS/2 Mouse Port (3103)
-14F3 Broadlogic
- 2030 2030 DVB-S Satellite Reciever
- 2050 2050 DVB-T Terrestrial (Cable) Reciever
- 2060 2060 ATSC Terrestrial (Cable) Reciever
-14F4 Tokyo Electronic Industry Co Ltd
-14F5 Sopac Ltd
- 2F00 x (x)
-14F6 Coyote Technologies LLC
-14F7 Wolf Technology Inc
-14F8 Audiocodes Inc
- 2077 TP-240 dual span E1 VoIP PCI Card
-14F9 AG Communications
-14FA Wandel & Gochermann
-14FB Transas Marine (UK) Ltd
-14FC Quadrics Supercomputers World
- 0000 QsNet Elan3 Network Adapter
- 0001 QsNetII Elan4 Network Adapter
-14FD Japan Computer Industry Inc
- 0001 H260u printer server for HP Printer (H260u)
-14FE Archtek Telecom Corp
-14FF Twinhead International Corp
-1500 Lantech Computer Company
- 1300 SIS900 10/100M PCI Fast Ethernet Controller
- 1320 VT86C100A 10/100M PCI Fast Ethernet Controler
- 1360 RTL8139A 10/100 Mbps PCI Fast Ethernet Controller
- 1380 DEC21143PD 10/100M PCI Fast Ethernet Controller
-1501 Banksoft Canada Ltd
-1502 Mitsubishi Electric Logistics Support Co Ltd
-1503 Kawasaki LSI USA Inc
-1504 Kaiser Electronics
-1505 ITA Ingenieurburo Fur Testaufgaben GmbH
-1506 Chameleon Systems Inc
-1507 Htec Ltd.
- 0001 MPC105 [Eagle]
- 0002 MPC106 [Grackle]
- 0003 MPC8240 [Kahlua]
- 0100 MC145575 [HFC-PCI]
- 0431 KTI829c 100VG
- 4801 Raven
- 4802 Falcon
- 4803 Hawk
- 4806 CPX8216
-1508 Honda Connectors/Mhotronics Inc
-1509 First International Computer Inc
-150A Forvus Research Inc
-150B Yamashita Systems Corp
-150C Kyopal Co Ltd
-150D Warpspped Inc
-150E C-Port Corp
-150F Intec GmbH
-1510 Behavior Tech Computer Corp
-1511 Centillium Technology Corp
-1512 Rosun Technologies Inc
-1513 Raychem
-1514 TFL LAN Inc
-1515 Advent design
-1516 Myson Technology Inc
- 0800 10/100 Mbps Fast Ethernet Controller (MTD800)
- 0803 PCI Ethernet controller (Myson MTD803/TAMARACK TC6020)
- 0891 10/100/1000 Mbps Gigabit Ethernet Controller (MTD891)
-1517 Echotek Corp
-1518 PEP Modular Computers GmbH
-1519 Telefon Aktiebolaget LM Ericsson
- 2004 PCI Interface bus (0x1)
-151A Globetek Inc.
- 1002 4370 (PCI-1002 5A62)
- 1004 PCI-1004
- 1008 PCI-1008
-151B Combox Ltd
- 9080 combox cb 300a (me594v02100 combox)
-151C Digital Audio Labs Inc
- 0002 CardDeluxe Analog + Digital Audio
- 0003 Prodif T 2496
- 4000 Prodif 88
-151D Fujitsu Computer Products Of America
- 9876 ?
-151E Matrix Corp
-151F Topic Semiconductor Corp
- 0000 TP560 D/F/V 56k Modem
- 0001 TOPIC FM-56PCI-TP (TOPIC FM-56PCI-TP)
- 0568 56k Internal Data Fax Voice Modem (1.0.1.8)
-1520 Chaplet System Inc
-1521 Bell Corp
-1522 Mainpine Limited
- 0100 PCI Interface Chip (PBridge+)
-1523 Music Semiconductors
-1524 ENE Technology Inc
- 0510 PCI Memory Card Reader Controller (1.4.5.0)
- 0520 PCI SmartMedia / xD Card Reader Controller
- 0530 Memory Stick Card Reader (CB-712/714/810)
- 0550 Secure Digital Card Reader (CB-712/714/810)
- 0551 PCI SD/MMC Card Reader Controller
- 0610 PCI Smart Card Reader Controller
- 0730 PCI Memory Stick Card Reader Controller
- 0750 PCI SmartMedia / xD Card Reader Controller
- 0751 PCI Secure Digital / MMC Card Reader Controller
- 1211 CardBus Controller (CB-1211)
- 1225 CardBus Controller (CB-1225)
- 1410 CardBus Controller (CB-1420)
- 1411 Cardbus Controller (CB-710/2/4/810)
- 1412 CB-712/714 CardBus Controller
- 1420 CardBus Controller (CB-1420)
- 1421 CB-720/722/724 CardBus Controller
- 1422 CB-722/724 CardBus Controller
- FC10 pci device (card bus)
-1525 Impact Technologies
-1526 ISS Inc
-1527 Solectron
-1528 Acksys
-1529 American Microsystems Inc
-152A Quickturn Design Systems
-152B Flytech Technology Co Ltd
-152C Macraigor Systems LLC
-152D Quanta Computer Inc
-152E Melec Inc
- 2507 0 (0)
-152F Philips - Crypto
-1530 Acqis Technology Inc
-1531 Chryon Corp
-1532 Echelon Corp
- 0020 LonWorks PCLTA-20 PCI LonTalk Adapter
-1533 Baltimore
-1534 Road Corp
-1535 Evergreen Technologies Inc
-1536 ACTIS Computer
-1537 Datalex Communications
-1538 Aralion Inc.
- 0301 Ultima RAID-100/Multi RAID-100 Controller
- 0303 UltimaRAID-133 Controller
-1539 Atelier Informatiques et Electronique Etudes S.A.
-153A Ono Sokki
-153B Terratec Electronic GmbH
- 1115 IC Ensemble Inc ICE1712 Envy24 Multichannel Audio Controller (ICE1712 Envy24)
- 1143 Philips Semiconductors SAA7134HL Multimedia Capture Device (SAA7134HL)
- 6003 CrystalClear SoundFusion PCI Audio Accel (CS4614/22/24)
-153C Antal Electronic
-153D Filanet Corp
-153E Techwell Inc
-153F MIPS Technologies, Inc
- DEAD Not a chip ... (xx12345)
-1540 Provideo Multimedia Co Ltd
- 9524 PAL/SECAM TV card w/ FM1216ME MK3 tuner (+FM radio) (saa7134)
-1541 Machone Communications
-1542 Vivid Technology Inc
-1543 Silicon Laboratories
- 3052 Modem Intel 537EP (Chipset KAIOMY) (30201543)
- 3155 Modem Device on High Definition Audio Bus (Unknown)
-1544 DCM Technologies Ltd
-1545 Visiontek
-1546 IOI Technology Corp
-1547 Mitutoyo Corp
-1548 Jet Propulsion Laboratory
-1549 Interconnect Systems Solutions
- 80FF PCI/ISA Bus Bridge (PCI-ISA-001)
-154A Max Technologies Inc.
- 9016 USB DVB-T Device AF9015 (AF9015)
-154B Computex Co Ltd
-154C Visual Technology Inc
-154D Pan International Industrial Corp
-154E Servotest Ltd
-154F Stratabeam Technology
-1550 Open Network Co Ltd
-1551 Smart Electronic Development GmbH
-1552 Racal Airtech Ltd
-1553 Chicony Electronics Co Ltd
-1554 Prolink Microsystems Corp
-1555 Gesytec GmbH
- 0002 Easylon PCI Bus Interface (PLX PCI 9050)
-1556 PLD Applications
-1557 Mediastar Co Ltd
-1558 Clevo/Kapok Computer
- 1558 ?
-1559 SI Logic Ltd
-155A Innomedia Inc
-155B Protac International Corp
-155C Cemax-Icon Inc
-155D Mac System Co Ltd
-155E LP Elektronik GmbH
- 0020 Multi Function Card Version 3 (MFC3)
-155F Perle Systems Ltd
-1560 Terayon Communications Systems
-1561 Viewgraphics Inc
-1562 Symbol Technologies, Inc.
- 0001 LA-41x3 Spectrum24 802.11b Wireless LAN PCI Card
- 0002 Symbol Wireless Networker 802.11a/g CardBus (LA-5030)
- 0003 Symbol Wireless Networker 802.11a/g PCI (LA-5033)
-1563 A-Trend Technology Co Ltd
-1564 Yamakatsu Electronics Industry Co Ltd
-1565 Biostar Microtech Int'l Corp
-1566 Ardent Technologies Inc
-1567 Jungsoft
- 07D2 Disk Protection Card for Windows 2000
-1568 DDK Electronics Inc
-1569 Palit Microsystems Inc
-156A Avtec Systems Inc
- 5000 Wideband Advanced Signal Processor (NA)
- 5100 High Data Rate Radio (NA)
-156B 2wire Inc
-156C Vidac Electronics GmbH
- 0001 VMagic MPEG Encoder
-156D Alpha-Top Corp
-156E Alfa Inc
-156F M-Systems Flash Disk Pioneers Ltd
-1570 Lecroy Corp
-1571 Contemporary Controls
- A001 ARCNET backplane (CCSI PCI20)
- A002 ARCnet (CCSI PCI20-485D)
- A003 ARCnet (CCSI PCI20-485X)
- A004 ARCnet (CCSI PCI20-CXB)
- A005 ARCnet (CCSI PCI20-CXS)
- A006 ARCnet (CCSI PCI20-FOG-SMA)
- A007 ARCnet (CCSI PCI20-FOG-ST)
- A008 ARCnet (CCSI PCI20-TB5)
- A009 5 Mbit ARCnet (CCSI PCI20-5-485)
- A00A 5 Mbit ARCnet (CCSI PCI20-5-485D)
- A00B 5 Mbit ARCnet (CCSI PCI20-5-485X)
- A00C 5 Mbit ARCnet (CCSI PIC20-5-FOG-ST)
- A00D 5 Mbit ARCnet (CCSI PCI20-5-FOG-SMA)
- A00E ARCNET (COM200C22)
- A201 10 Mbit ARCnet (CCSI PCI22-485)
- A202 10 Mbit ARCnet (CCSI PCI22-485D)
- A203 10 Mbit ARCnet (CCSI PCI22-485X)
- A204 10 Mbit ARCnet (CCSI PCI22-CHB)
- A205 10 Mbit ARCnet (CCSI PCI22-FOG-ST)
- A206 10 Mbit ARCnet (CCSI PCI22-THB)
-1572 Otis Elevator Company
-1573 Lattice - Vantis
-1574 Fairchild Semiconductor
-1575 Voltaire Advanced Data Security Ltd
-1576 Viewcast COM
-1578 HITT
-1579 Dual Technology Corp
-157A Japan Elecronics Ind Inc
-157B Star Multimedia Corp
-157C Eurosoft (UK)
- 8001 PCI Y2K Compliance Card (Fix2000)
-157D Gemflex Networks
-157E Transition Networks
-157F PX Instruments Technology Ltd
-1580 Primex Aerospace Co
-1581 SEH Computertechnik GmbH
-1582 Cytec Corp
-1583 Inet Technologies Inc
-1584 Uniwill Computer Corp.
- 4003 ?
-1585 Logitron
-1586 Lancast Inc
- 0803 ?
-1587 Konica Corp
-1588 Solidum Systems Corp
- 1100 PAX.ware 1100 dual Gb classifier engine (PAX.port 1100)
- 2000 SNP 8023 packet classifier - AMD component (AMD '971)
- 8023 PAX.ware 100 packet classifier (SNP8023)
-1589 Atlantek Microsystems Pty Ltd
-158A Digalog Systems Inc
-158B Allied Data Technologies
- 0015 Standar HSP Modem Series (HLF-VMPEU560-C)
-158C Hitachi Semiconductor & Devices Sales Co Ltd
-158D Point Multimedia Systems
-158E Lara Technology Inc
-158F Ditect Coop
-1590 3pardata Inc
-1591 ARN
-1592 Syba Tech Ltd.
- 0780 Multi-IO Card
- 0781 Multi-IO Card (W83787IF)
- 0782 Parallel Port Card (EPP) (W837871F)
- 0783 Multi-IO Card (TC32001 PCI I/O)
- 0785 Multi-IO Card (907ab184740802)
- 0786 Multi-IO Card (Winbond w83787if)
- 0787 Multi-IO Card 2 series (winbond w83787if)
- 0788 Multi-IO Card (w837871f)
- 078A Multi-IO Card (007AB192367002ND)
-1593 Bops Inc
-1594 Netgame Ltd
-1595 Diva Systems Corp
-1596 Folsom Research Inc
-1597 Memec Design Services
-1598 Granite Microsystems
-1599 Delta Electronics Inc
-159A General Instrument
-159B Faraday Technology Corp
-159C Stratus Computer Systems
-159D Ningbo Harrison Electronics Co Ltd
-159E A-Max Technology Co Ltd
-159F Galea Network Security
-15A0 Compumaster SRL
-15A1 Geocast Network Systems
-15A2 Catalyst Enterprises Inc
- 0001 PCI Bus Analyzer/Exerciser (TA700)
-15A3 Italtel
-15A4 X-Net OY
-15A5 Toyota Macs Inc
-15A6 Sunlight Ultrasound Technologies Ltd
-15A7 SSE Telecom Inc
-15A8 Shanghai Communications Technologies Center
-15AA Moreton Bay
-15AB Bluesteel Networks Inc
-15AC North Atlantic Instruments
-15AD VMware Inc.
- 0405 NVIDIA (9500MGS)
- 0710 Virtual SVGA
- 0720 VMware PCI Ethernet Adapter (VMXNET)
- 0740 Virtual Machine Communication Interface
- 0770 Standard Enhanced PCI to USB Host Controller (n/a)
- 0801 Virtual Machine Interface
-15AE Amersham Pharmacia Biotech
-15B0 Zoltrix International Limited
- 0001 Pctel (FM-1789)
- 2BD0 soft56k voice,data,fax CARP (2BD0)
-15B1 Source Technology Inc
-15B2 Mosaid Technologies Inc
-15B3 Mellanox Technology
- 0191 MT25408 [ConnectX IB SDR Flash Recovery]
- 5274 InfiniBridge (MT21108)
- 5A44 MT23108 InfiniHost
- 5A45 MT23108 Infinihost HCA Flash Recovery
- 5A46 MT23108 PCI Bridge
- 5E8C MT24204 InfiniHost III Lx HCA
- 5E8D MT24204 InfiniHost III Lx HCA Flash Recovery
- 6274 MT25204 InfiniHost III Lx HCA
- 6278 MT25208 InfiniHost III Ex (Tavor compatibility mode)
- 6279 MT25208 InfiniHost III Ex HCA Flash Recovery
- 6282 MT25218 [InfiniHost III Ex] (MT25218)
- 6340 MT25408 [ConnectX IB SDR]
- 634A MT25418 [ConnectX IB DDR, PCIe 2.0 2.5GT/s]
- 6354 MT25428 [ConnectX IB QDR]
- 6368 MT25448 [ConnectX EN 10GigE, PCIe 2.0 2.5GT/s]
- 6732 MT26418 [ConnectX IB DDR, PCIe 2.0 5GT/s]
- 673C MT26428 [ConnectX IB QDR, PCIe 2.0 5GT/s]
- 6750 MT26448 [ConnectX EN 10GigE, PCIe 2.0 5GT/s]
-15B4 CCI/TRIAD
-15B5 Cimetrics Inc
-15B6 Texas Memory Systems Inc
-15B7 Sandisk Corp
-15B8 ADDI-DATA GmbH
- 3009 Analog output board (xPCI-3504)
-15B9 Maestro Digital Communications
-15BA Impacct Technology Corp
-15BB Portwell Inc
-15BC Agilent Technologies
- 0100 ATTO Celerity FC-22XH Fibre Channel Adapter
- 0101 ATTO Celerity FC-22XH Fibre Channel Adapter
- 0103 4 Port Fibre Channel Controller (QX4)
- 0105 ATTO Celerity FC-42XS Fibre Channel Adapter
- 1100 E8001-66442 PCI Express CIC
- 1203 ATTO Celerity FC-42EN Fibre Channel Adapter
- 2530 HP Communications Port
- 2531 HP Toptools Remote Control Adapter
- 2532 HP Toptools Remote Control Adapter
- 2922 64 Bit, 133MHz PCI-X Exerciser & Protocol Checker
- 2928 64 Bit, 66MHz PCI Exerciser & Analyzer
- 2929 E2929A 64 Bit, 133MHz PCI-X Analyzer & Exerciser
-15BD DFI Inc
-15BE Sola Electronics
-15BF High Tech Computer Corp (HTC)
-15C0 BVM Ltd
-15C1 Quantel
-15C2 Newer Technology Inc
-15C3 Taiwan Mycomp Co Ltd
-15C4 EVSX Inc
-15C5 Procomp Informatics Ltd
-15C6 Technical University of Budapest
-15C7 Tateyama Dystem Laboratory Co Ltd
-15C8 Penta Media Co Ltd
-15C9 Serome Technology Inc
-15CA Bitboys OY
-15CB AG Electronics Ltd
-15CC Hotrail Inc
-15CD Dreamtech Co Ltd
-15CE Genrad Inc
-15CF Hilscher GmbH
-15D1 Infineon Technologies AG
- 0001 TC11IB TriCore 32-Bit Single-Chip MicroController
- 0002 PEB 20535 E v3.1 DSCC4 4 Channel Serial Communication Controller
- 0003 PEB 20544 E v1.1 SPOCC Six Port Optimized Communication Controller
- 0004 PEB 3454 E v1.1 TE3-SPICE Six Port Integrated Communication Controller w/- 4 DS3 Framers & 2 Fast Ethernet MACs
-15D2 First International Computer Inc (FIC)
-15D3 NDS Technologies Israel Ltd
-15D4 Iwill Corp
-15D5 Tatung Co
-15D6 Entridia Corp
-15D7 Rockwell-Collins Inc
- RS56 hcf 56 (hcf cx11252-41z)
-15D8 Cybernetics Technology Co Ltd
- 9001 ?
-15D9 Super Micro Computer Inc
-15DA Cyberfirm Inc
-15DB Applied Computing Systems Inc
-15DC Litronic Inc.
- 0001 PCI Cryptography Module (Argus 300)
-15DD Sigmatel Inc.
- 7664 idt high audio (vgn-ar71mr)
- 7680 SIGMATEL STAC 92XX C-Major HD Audio
- 7690 9200 HD Audio CODEC (10F70000)
- 8384 IDT High Definition Audio CODEC (*2UF1a)
- 9876 1
-15DE Malleable Technologies Inc
-15DF Infinilink Corp
-15E0 Cacheflow Inc
- 7134 01 (01385168)
-15E1 Voice Technologies Group Inc
-15E2 Quicknet Technologies Inc
- 0500 Internet PhoneJack PCI Card
-15E3 Networth Technologies Inc
-15E4 VSN Systemen BV
-15E5 Valley technologies Inc
-15E6 Agere Inc
-15E7 Get Engineering Corp
-15E8 National Datacomm Corp.
- 0130 Wireless NIC (NCP130)
- 0131 InstantWave HR PCI card (Prism II)
-15E9 Pacific Digital Corp.
- 1841 ATA controller (NetStaQ ADMA-100)
-15EA Tokyo Denshi Sekei K.K.
-15EB Drsearch GmbH
-15EC Beckhoff GmbH
-15ED Macrolink Inc
-15EE In Win Development Inc
-15EF Intelligent Paradigm Inc
-15F0 B-Tree Systems Inc
-15F1 Times N Systems Inc
- 2F30 Conexant HSFi (CX11252-15)
-15F2 Diagnostic Instruments Inc
- 0001 Spot RT Interface Board (Spot RT)
- 0002 Spot RT Interface Board (Spot RT *2)
- 0003 Spot Insight Interface Board (Spot Insight)
-15F3 Digitmedia Corp
-15F4 Valuesoft
-15F5 Power Micro Research
-15F6 Extreme Packet Device Inc
-15F7 Banctec
-15F8 Koga Electronics Co
-15F9 Zenith Electronics Corp
-15FA J.P. Axzam Corp
-15FB Zilog Inc
-15FC Techsan Electronics Co Ltd
-15FD N-CUBED.NET
-15FE Kinpo Electronics Inc
-15FF Fastpoint Technologies Inc
-1600 Northrop Grumman - Canada Ltd
-1601 Tenta Technology
-1602 Prosys-TEC Inc
-1603 Nokia Wireless Communications
-1604 Central System Research Co Ltd
-1605 Pairgain Technologies
-1606 Europop AG
-1607 Lava Semiconductor Manufacturing Inc
-1608 Automated Wagering International
-1609 Scimetric Instruments Inc
-160A Kollmorgen Servotronix
-160B Onkyo Corp
-160C Oregon Micro Systems Inc
-160D Aaeon Electronics Inc
-160E CML Emergency Services
-160F ITEC Co Ltd
-1610 Tottori Sanyo Electric Co Ltd
-1611 Bel Fuse Inc
-1612 Telesynergy Research Inc
-1613 System Craft Inc
-1614 Jace Tech Inc
-1615 Equus Computer Systems Inc
-1616 Iotech Inc
-1617 Rapidstream Inc
-1618 Esec SA
-1619 FarSite Communications Limited
- 0400 Two Port Intelligent Sync Comms Card (FarSync T2P)
- 0440 Four Port Intelligent Sync Comms Card (FarSync T4P)
- 0610 One Port Intelligent Sync Comms Card (FarSync T1U)
- 0620 Two Port Intelligent Sync Comms Card (FarSync T2U)
- 0640 Four Port Intelligent Sync Comms Card (FarSync T4U)
- 1610 One Port Intelligent Sync Comms Card (FarSync TE1)
- 1612 Channelized Intelligent Sync Comms Card (FarSync TE1C)
- 2610 G.SHDSL Intelligent Sync Comms Card (FarSync DSL-S1)
- 3640 Four Port Intelligent Sync Comms Card (FarSync T4E)
- 4620 Two Port Intelligent Sync Comms Card (FarSync T2Ue (PCI Express))
- 4640 Four Port Intelligent Sync Comms Card (FarSync T4Ue (PCI Express))
-161A Wvinten Ltd
-161B Mobilian Israel Ltd
-161C Berkshire Products
-161D Gatec
-161E Kyoei Sangyo Co Ltd
-161F Arima Computer Co
-1620 Sigmacom Co Ltd
-1621 Lynx Studio Technology Inc
- 0020 4 in/4 out Professional Digital Audio Card (LynxTWO-A)
- 0021 2 in/6 out Professional Digital Audio Card (LynxTWO-B)
- 0022 6 in/2 out Professional Digital Audio Card (LynxTWO-C)
- 0023 2 in/2 out Professional Digital Audio Card (Lynx L22)
- 0024 16 in/16 out AES/EBU Audio Card (Lynx AES16)
- 0025 16 in/16 out AES/EBU Audio Card w/SRC (Lynx AES16-SRC)
-1622 Nokia Home Communications
-1623 KRF Tech Ltd
-1624 CE Infosys GmBH
-1625 Warp Nine Engineering
-1626 TDK Semiconductor Corp
-1627 BCom Electronics Inc
-1629 Kongsberg Spacetec a.s.
- 1003 Format synchronizer v3.0
- 2002 Fast Universal Data Output
-162A Sejin Computerland Co Ltd
-162B Shanghai Bell Company Limited
-162C C&H Technologies Inc
-162D Reprosoft Co Ltd
- 0100 Repeographics Controller
- 0101 Reprographics Controller
- 0102 Reprographics Controller
- 0103 Reprographics Controller
-162E Margi Systems Inc
-162F Rohde & Schwarz GmBH & Co KG
- 1111 General Purpose Relay Card (TS-PRL1)
- 1112 TS-PMA Matrix Module
- 1113 TS-PSAM Source and Measurement Module
- 1114 TS-PBAS Basic Interface Module
- 1115 TS-PICT In-Circuit Test Module
- 1116 TS-PFG Function Generator Module
- 1117 TS-PAM Analyzer Module
- 1118 TS-PDFT Digital Functional Test Module
-1630 Sky Computers Inc
-1631 NEC Computer International
-1632 Verisys Inc
-1633 Adac Corporation
-1634 Visionglobal Network Corp
-1635 Decros
-1636 Jean Company Ltd
-1637 NSI
-1638 Eumitcom Technology Inc
- 1100 WL11000P (WL11000P)
-163A Air Prime Inc
-163B Glotrex Co Ltd
-163C Smart Link
- 3052 RS56/HSP-PCI (R6793-11)
- FF02 Intel Chipset (82945G)
-163D Heidelberg Digital LLC
-163E 3dpower
-163F Renishaw PLC
-1640 Intelliworxx Inc
-1641 MKNet Corporation
-1642 Bitland
-1643 Hajime Industries Ltd
-1644 Western Avionics Ltd
-1645 Quick-Serv. Computer Co Ltd
-1646 Nippon Systemware Co Ltd
-1647 Hertz Systemtechnik GmBH
-1648 MeltDown Systems LLC
-1649 Jupiter Systems
-164A Aiwa Co Ltd
-164C Department Of Defense
-164D Ishoni Networks
-164E Micrel Inc
-164F Datavoice (Pty) Ltd.
- 0001 PCI interface chip (PLX 9054)
- 0002 PCI interaface chip (PLX 9054)
-1650 Admore Technology Inc
-1651 Chaparral Network Storage
-1652 Spectrum Digital Inc
-1653 Nature Worldwide Technology Corp
-1654 Sonicwall Inc
-1655 Dazzle Multimedia Inc
-1656 Insyde Software Corp
-1657 Brocade Communications Systems
- 0646 Brocade 400 series PCIe HBA (BRE040)
-1658 Med Associates Inc.
- 0704 DIG 704 PCI - Interface with Millisecond Timer and Interrupts (905410B5)
-1659 Shiba Denshi Systems Inc
-165A Epix Inc.
- C100 PCI camera link video capture board (PIXCI CL1)
- D200 PCI digital video capture board (PIXCI D2X)
- D300 PCI digital video capture board (PIXCI D3X)
-165B Real-Time Digital Inc
-165C Kondo Kagaku
- 0002 FT232BL (FT232BL)
-165D Hsing Tech Enterprise Co Ltd
-165E Hyunju Computer Co Ltd
-165F Comartsystem Korea
- 2000 16 Channel Audio Capture Card (XILINX SPARTAN)
-1660 Network Security Technologies Inc
-1661 Worldspace Corp
-1662 Int Labs
-1663 Elmec Inc Ltd
-1664 Fastfame Technology Co Ltd
-1665 Edax Inc
-1666 Norpak Corporation
-1667 CoSystems Inc
-1668 Action Tec Electronics Inc
- 0100 PCI to PCI Bridge (0304)
-166A Komatsu Ltd
-166B Supernet Inc
-166C Shade Ltd
-166D Sibyte Inc.
- 0001 BCM1125/BCM1250 PCI Configuration Header
- 0002 MIPS BCM1125/BCM1250 processors (BCM1125/BCM1250 HyperTransport Configuration Heade)
-166E Schneider Automation Inc
-166F Televox Software Inc
-1670 Rearden Steel
-1671 Atan Technology Inc
-1672 Unitec Co Ltd
-1673 Connex
-1675 Square Wave Technology
-1676 Emachines Inc.
- 1001 Realtek AC' 97 Audio Driver (5.10.00.5760)
-1677 Bernecker + Rainer
- 104E B&R Dual CAN Interface Card 5LS172.6
- 12D7 B&R Dual CAN Interface Card 5LS172.61
- 20AD Profibus DP / K-Feldbus / COM (5ACPCI.MFIO-K01)
-1678 INH Semiconductor
-1679 Tokyo Electron Device Ltd
-167B ZyDAS Technology Corp
-167D Samsung Electro-Mechanics Co Ltd
-167E Onnto Corp
-167F iba AG
- 4634 FOB-IO Card
- 4C32 L2B PCI Board
- 5344 FOB-SD Card
- 5443 FOB-TDC Card
- F0B2 ibaFOB-2io-D (ibaFOB-2io-D)
- F0B4 ibaFOB-4io-D (ibaFOB-4io-D)
-1680 Dunti Corp
-1681 Hercules
- 0050 Hercules WiFi PCI 802.11G (HWGPCI-54)
-1682 PINE Technology, Ltd.
- 9875 ?
-1688 Castlenet Technology
-168A Utimaco Safeware AG
-168B Circut Assembly Corp (Ca)
-168C Atheros Communications Inc.
- 0007 802.11a Wireless Adapter (AR5007)
- 0011 802.11a Wireless Adapter (AR5bmb5)
- 0012 802.11a/b/g Mini-PCI Wireless Adapter (AR5211)
- 0013 802.11a/b/g Wireless Adapter (AR2312)
- 0014 Wireless Network Adapter
- 0015 Wireless Network Adapter
- 0016 Wireless Network Adapter
- 0017 Wireless Network Adapter
- 0018 Wireless Network Adapter
- 0019 Wireless Network Adapter
- 001A http://cr.am/framed.php?url=http%3A%2F%2Fwww.tp%2Dlink.com%2Fsupport%2Fdownload.asp&ref=driverguide (Atheros AR5005G)
- 001B AR5006 family 802.11abg Wireless NIC
- 001C AR5006 family 802.11abg Wireless NIC
- 001D PCIVEN_168C&DEV_001D&SUBSYS_2055168C&REV_013&267A616A&0&50 (TP-Link TL-WN350GD)
- 0020 AR5005VL 802.11bg Wireless NIC
- 0023 802.11a/b/g/n Wireless PCI Adapter (AR5416)
- 0024 Atheros 802.11a/b/g/n (pre-N) radio (AR5008)
- 002A Atheros AR5B91 Wireless Network Adapter (0001)
- 002B Atheros AR9285 Wireless LAN 802.11 a/b/g/n Controller (AR928x)
- 1014 Atheros AR5212 802.11abg wireless Drivers (AR5212)
- 14F1 PCIVEN_14f1&DEV_10b6&SUBSYS_10b614f&REV_89 (nForce6100-430 )
- FF19 AR5006X Wireless Network Adapter
- FF1C AR5008 Wireless Network Adapter
- FF1D AR5008 Wireless Network Adapter
- FF96 LAN-Express AS IEEE 802.11g miniPCI adapter (AR5212)
-168D NMI Electronics Ltd
-168E Hyundai Multicav Computer Co Ltd
-168F KDS Innotech Corp
-1690 Netcontinuum Inc
-1693 Ferma
- 0212 EPONINE ESR-PCI Board (PLX PCI9054)
- 0213 EPONINE MTM120 PCI Board (Motorola MPC8245)
-1695 Epox Computer Co Ltd
-1696 Hitachi Video and Information System Inc
-169A Otari Inc
-169B Decsys Corporation
-169C Netcell Corporation
- 0044 SyncRAID SR3000/5000 Series SATA RAID Controllers
-169D Link Evolution Corp
-16A5 Tekram Technology Co Ltd
-16A8 Shatai Systems Inc
-16AA Enseo
-16AB Global Sun Technology Inc
- 1100 GL24110P
- 1101 PLX9052 PCMCIA-to-PCI Wireless LAN
- 1102 PCMCIA-to-PCI Wireless Network Bridge
- 8501 WL-8305 Wireless LAN PCI Adapter
-16AE SafeNet Inc.
- 1141 ??? (SafeXcel-1141)
-16AF Nextcomm Inc
-16B0 Wincor Nixdorf International GmbH
-16B2 Design Of Systems On Silicon (DS2)
-16B3 CNF Mobile Solutions
-16B4 Aspex Technology Ltd
-16B8 Sonnet Technologies Inc
-16BD Aristos Logic Corporation
-16BE Creatix Polymedia GmbH
-16C3 Insilicon Corporation
-16C5 Puretek Industrial Co Ltd
-16C6 Micrel-Kendin
- 8695 KS8695 Centaur ARM processor
- 8841 KSZ8841 Single-port Ethernet MAC Controller
- 8842 KDZ8842 2-port Ethernet switch/MAC Controller
-16C7 Micrel - Kendin Operations
-16C8 OCTASIC Inc
-16C9 EONIC B.V. The Netherlands
-16CA Cenatek Inc.
- 0001 Solid State Disk (Rocket Drive)
-16CB Minolta Co Ltd
-16CC Inari
-16CD Densitron Computers Ltd
-16CE Roland Corp(??)
-16CF Roland Corp
-16D0 Systemax
-16D2 Axis Corporation
-16D5 Acromag Inc
- 0504 PMC-DX504 Reconfigurable FPGA with LVDS I/O
- 0520 PMC520 Serial Communication, 232 Octal
- 0521 PMC521 Serial Communication, 422/485 Octal
- 1020 PMC-AX1020 Reconfigurable FPGA with A/D & D/A
- 1065 PMC-AX1065 Reconfigurable FPGA with A/D & D/A
- 2004 PMC-DX2004 Reconfigurable FPGA with LVDS I/O
- 2020 PMC-AX2020 Reconfigurable FPGA with A/D & D/A
- 2065 PMC-AX2065 Reconfigurable FPGA with A/D & D/A
- 3020 PMC-AX3020 Reconfigurable FPGA with A/D & D/A
- 3065 PMC-AX3065 Reconfigurable FPGA with A/D & D/A
- 4243 PMC424, APC424, AcPC424 Digital I/O and Counter Timer Module
- 4248 PMC464, APC464, AcPC464 Digital I/O and Counter Timer Module
- 424B PMC-DX2002 Reconfigurable FPGA with Differential I/O
- 4253 PMC-DX503 Reconfigurable FPGA with TTL and Differential I/O
- 4312 PMC-CX1002 Reconfigurable Conduction-Cooled FPGA Virtex-II with Differential I/O
- 4313 PMC-CX1003 Reconfigurable Conduction-Cooled FPGA Virtex-II with CMOS and Differential I/O
- 4322 PMC-CX2002 Reconfigurable Conduction-Cooled FPGA Virtex-II with Differential I/O
- 4323 PMC-CX2003 Reconfigurable Conduction-Cooled FPGA Virtex-II with CMOS and Differential I/O
- 4350 PMC-DX501 Reconfigurable Digital I/O Module
- 4353 PMC-DX2003 Reconfigurable FPGA with TTL and Differential I/O
- 4357 PMC-DX502 Reconfigurable Differential I/O Module
- 4457 PMC730, APC730, AcPC730 Multifunction Module
- 464D PMC408 32-Channel Digital Input/Output Module
- 4A42 PMC483, APC483, AcPC483 Counter Timer Module
- 4A50 PMC484, APC484, AcPC484 Counter Timer Module
- 4A56 PMC230 16-Bit Analog Output Module
- 4B47 PMC330 16-Bit Analog Input Module
- 4C40 PMC-LX40 Reconfigurable Virtex-4 FPGA with plug-in I/O
- 4C60 PMC-LX60 Reconfigurable Virtex-4 FPGA with plug-in I/O
- 4D4D PMC341 Simultaneous Sampling Analog Input Module
- 4D4E PMC482, APC482, AcPC482 Counter Timer Board
- 524D PMC-DX2001 Reconfigurable FPGA with TTL I/O
- 5335 PMC-SX35 Reconfigurable Virtex-4 FPGA with plug-in I/O
-16D8 Omnicluster Technologies
-16DA Marek Micro GmBH
-16DE Digital Stream Technology Inc
-16DF Pika Technology Inc
-16E0 Third Millenium Test Solutions
-16E2 Geotest-Marvin Test Systems Inc
-16E3 European Space agency
-16E5 Intellon Corp
- 6000 INT6000 Ethernet-to-Powerline Bridge [HomePlug AV]
- 6300 INT6300 Ethernet-to-Powerline Bridge [HomePlug AV]
-16E7 Keisoku Giken Co Ltd
-16E9 Silicon Sccess Networks
-16EB Inside Telnetcom Co Ltd
-16EC U.S. Robotics
- 00FF USR997900 10/100 Mbps PCI Network Card
- 0116 Realtek RTL8169/8110 Family PCI Gigabit Ethernet NIC (??)
- 1007 U.S. Robotics 56K Win INT (0637)
- 2013 U.S. Robotics 56K Voice Host Int (11323A)
- 2F00 http://www.usr.com/support/product-template.asp?prod=5660a (USRobotics 5660A - Internal Soft Modem)
- 2F12 U.S.Robotic (A- Modem/PCI) (E129336-1)
- 3685 Wireless Access Adapter Model 022415
- 5685 U.S. Robotics 56K Voice Host Int (A-Modem/ PCI) (E129336-1)
-16ED Sycron N.V.
- 1001 UMIO communication Card
-16EE Canberra Industries Inc
-16EF Amigo Technology
-16F0 TLA Inc
-16F1 Adicti Corp
-16F2 Bosch Rexroth AG
-16F3 Jetway Information Co Ltd
-16F4 VWEB Corp
- 8000 VW2010
-16F6 VideoTele.com Inc
-16F7 Advanced Rendering Technology Ltd
-16FC Ciena Corp
-16FE Fujitsu LSI Solution Ltd
-1700 Antara LLC
-1701 Interactive computer Products Inc
-1702 Internet Machines Corp (IMC)
-1703 Desana Systems
-1704 Clearwater Networks
-1705 Digital First
-1706 Pacific Broadband Communications
-1707 Cogency Semiconductor Inc
-1708 Harris MCD
-1709 Zarlink Semiconductor (Was: Mitel Semiconductor)
-170A Alpine Electronics Inc
-170B NetOctave Inc.
- 0100 Crypto Aceletator (NSP2000-SSL)
-170C YottaYotta Inc
-170D SensoMotoric Instruments GmbH
-170E SanValley Systems Inc
-170F Cyberdyne Inc
-1710 Pelago Networks
- 9835 2 serial, 1 LPT port PCI Card
-1711 Netscreen Technologies Inc
-1712 Nice Systems
-1713 Topcon Corp
-1714 Science Park Corp
-1715 The Imaging Source Europe GMbH
-1716 Aldec Inc
-1717 Runtop Inc
-1718 Pixela corp
-1719 EZChip Technologies
-171A Fantasma Networks Inc
-171B Andor System Support Co Ltd
-171C Merilus Inc
-171D TEAC Corp
-171E Realchip Inc
-171F Pijnenburg
-1720 Top Layer Networks Inc
-1721 Glonet Systems INC
-1722 Trimedia Technologies Inc
-1725 Vitesse Semiconductor
- 7174 VSC7174 PCI/PCI-X Serial ATA Host Bus Controller
-1726 Avaya
-1729 Danam Communications Inc
-172A Accelerated Encryption
- 13C8 AEP SureWare Runner 1000V3
-172C Ampere Inc
-172E Digianswer A/S
-172F Sparkle Computer Co Ltd
-1730 Brainvision Inc
-1734 Fujitsu-Siemens Computers GmbH
- 007A ATI Rage XL (rev 27) (Rage XL)
- 1011 Adaptec AIC-7902 Dual Channel U320 SCSI (AIC-7902W)
- 1012 Serverworks Southbridge with RAID/IDE (rev a0), OHCI USB (rev 05), GCLE-2 Host Bridge (CSB6)
- 1013 Broadcom Corp. NetXtreme Gigabyte Ethernet (BCM5703)
- 1078 Amilo Pro v2010
- 1085 Celsius M450
- 1098 Amilo L 1310G
- 10B9 SAS 3000 series, 8-port with 1068 -StorPort (0x00541000)
-1735 ATEN International Co Ltd
-1737 Linksys
- 0013 WMP54G Wireless Pci Card
- 0015 WMP54GS Wireless Pci Card
- 0029 WPG54G ver. 4 PCI Card
- 0071 Dual Band Wireless N USB Network Adapter (RT2870)
- 1032 Linksys Instant Gigabit Desktop Network Interface (EG1032 v3)
- 1064 Gigabit Network Adapter
- AB08 21x4x DEC-Tulip compatible 10/100 Ethernet
- AB09 PCM200 10/100 CardBus Ethernet Adapter
-1738 Harris Corp
-1739 Interface Concept
-173B Broadcom (Was: Altima Communications Inc)
- 03E8 Gigabit Ethernet Adapter (AC1000)
- 03E9 AC1001 Gigabit Ethernet
- 03EA Gigabit Ethernet Adapter (AC1002)
- 03EB AC1003 Gigabit Ethernet
-1740 Ulyssix Technologies Inc
-1743 Peppercon AG
- 8139 Fast Ethernet Adapter with ROL (ROL/F-100)
-1745 VIXS
- 2020 PureTV
- 2100 PureTV
-1746 Corrent Corp
-1747 Test Research Inc
-1749 RLX Technologies Inc
-174A Spirent Communications
-174B PC Partner Limited
- 0260 Saphire Radeon 9250 (RV280)
- 0261 Sapphire Radeon 9250 - Secondary (RV280)
- 7176 RADEON 9000 ATLANTIS PRO (RV250)
- 7177 RADEON 9000 ATLANTIS PRO - Secondary (RV280)
- 7C12 RADEON 9200 ATLANTIS - Secondary (RV280)
- 7C13 RADEON 9200 ATLANTIS (RV280)
- 9501 ATI Radeon HD 3870 (RV670 )
- E131 ATI 4870 (RV770)
-174C Intelitek
-174D WellX Telecom
-174E Xi'an Tongshi Data Co Ltd
-174F TAIKO Electric Works Ltd
-1751 Pixelworks Inc
-1752 Global Brands Manufacture Ltd
-1753 TeraRecon, Inc.
- 1001 VolumePro 500 (VP500)
- 1004 VolumePro 1000 (VP1000)
-1754 Antares Microsystems Inc
-1755 Alchemy Semiconductor Inc.
- 0000 Au1500 Processor (Au1500)
-1757 Laservall S.P.A.
-1758 National Hybrid Inc
-1759 Trinamic Microchips
-175C AudioScience Inc
-175D CTC Parker Automation
-175E Ascension Technology Corp
-175F Asita Technologies Inc
-1760 Tedia Spol. Sr.o
-1761 Pickering Interfaces Ltd
-1762 JR3 Inc
-1763 Cmicro Corporation
-1764 Micro Vision Co Ltd
-1765 Future Systems Inc
-1766 Eurotech Spa
-1767 Well Communication Corp
-1768 Malachite Technologies Inc
-176A General Dynamics Canada
-176E Kaba Mas Corporation
-176F SAYA Limited
-1771 InnoVision Multimedia Ltd
-1772 Siber Core Technologies Inc
-1773 Soma Networks Inc
-1775 SBS Technologies Inc
-1778 For-A Company Limited
-1779 V One Multimedia PTE Ltd
-177B Racal Instruments Inc
-177C Tanbac Co Ltd
-177D Cavium Networks
- 0001 Nitrox XL
-177E Jeol USA Inc
-177F Precision Instruments Inc
-1780 Unixtar Technology Inc
-1782 Lightsand Communications Inc
-1783 Trebia Networks
-1784 Lockheed Martin Systems Integration
-1787 Hightech Information System Ltd (Medion??)
-1789 Ennyah Technologies Corp
-178A Sandcraft Inc
-178D DesignTech Co Ltd
-178E Envara
-1790 Zuken Inc
-1791 Dotcast Inc
-1792 Artiza Networks Inc
-1793 Unitech Electronics Co Ltd
-1795 OKB SAPR Ltd
- 0003 Accord 5MX
- 0005 Accord-TINY
- 0006 Accord 5MX miniPCI
- 0010 Accord 5.5 PCI
- 0020 Accord 5.5 PCIe
-1796 Forschungszentrum (Research Centre) Julich
- 0001 SIS1100 [Gigabit link]
- 0002 HOTlink
- 0003 Counter Timer
- 0004 CAMAC Controller
- 0005 PROFIBUS
- 0006 AMCC HOTlink
- 000D Synchronisation Slave
-1797 JumpTec h, GMBH
-1798 iReady Corp
-1799 Belkin Research and Development Labs
- 6001 Wireless PCI Card - F5D6001
- 6020 Wireless PCMCIA Card - F5D6020
- 6060 Wireless PDA Card - F5D6060
- 7000 Wireless PCI Card - F5D7000
- 700A Wireless PCI Card - F5D7000UK
- 7010 BCM4306 802.11b/g Wireless Lan Controller - F5D7010
-179B Ratio Entwicklungen GmbH
-179C Indus TeQ Site Pvt Ltd
- 0557 DP-PCI-557 [PCI 1553B]
- 0566 DP-PCI-566 [Intelligent PCI 1553B]
- 5031 DP-CPCI-5031-Synchro Module
- 5121 DP-CPCI-5121-IP Carrier
- 5211 DP-CPCI-5211-IP Carrier
- 5679 AGE Display Module
-179D SES Japn Co Ltd
-179E IntelliBus Network Systems
-17A0 Genesys Logic, Inc
- 8033 GL880S USB 1.1 Controller
- 8034 GL880S USB 2.0 Controller
-17A1 Macro Image Technology Inc
-17A3 Dongguan Chang'an Global Smart Electronic Factory
-17A4 Resonext Communications Inc
-17A5 Quest Tech Consulting Inc
-17A6 Primarion
-17A7 Start Network Technology Co Ltd
-17A8 Gtech
-17A9 Arunta Comsec Pty Ltd
-17AA Legend Ltd
-17AB Phillips Components
-17AD Genesys Logic Inc
-17AE NEC Corp
-17AF Hightech Information Systems, Ltd.
- 4150 HIS Excalibur Radeon 9600 (200)
-17B0 Sphinx Elektronik GmbH
-17B1 Astec Inc
-17B2 Aeroflex Test Solutions
-17B3 Hawking Technologies Inc
- AB08 PN672TX 10/100 Ethernet
-17B4 Indra Networks Inc
- 0011 WebEnhance 100 GZIP Compression Card
-17B5 Emerge Core Networks LLC
-17B6 GE Medical Systems
-17B7 CAE
-17B9 Sapura Devices
-17BA Sandburst Corporation
-17BB ArTile Microsystems Inc
-17BC Infiniswitch Corporation
-17BD Merging Technologies
-17BE Systemonic AG
-17BF Max Diligent Technology Inc
-17C0 Wistron Corporation
- 12AB ?
-17C1 Nital Consulting Services Inc
-17C2 Newisys Inc
-17C3 Protogate Inc
-17C4 Movita Tehnologies Inc
-17C5 Digital Safety Technologies Inc
-17C6 American Computers & Digital Components Inc
-17C7 Bystronic Laser AG
-17C8 Hexium Ltd
-17C9 OPCiel Networks Inc
-17CA Uniwide Technologies
-17CB Woodside Networks Inc
- 0001 AGN100 802.11 a/b/g True MIMO Wireless Card
- 0002 AGN300 802.11 a/b/g True MIMO Wireless Card
-17CC NetChip Technology Inc
- 2280 USB 2.0 Device Controller (Net 2280)
-17CD Tality Corporation
-17CF Z-Com Inc
-17D0 Fodus Communications Inc
-17D1 Patton Electronics
-17D2 Red River
-17D3 Areca Technology Corporation
- 1110 ARC-1110 4-Port PCI-X to SATA RAID Controller
- 1120 ARC-1120 8-Port PCI-X to SATA RAID Controller
- 1130 ARC-1130 12-Port PCI-X to SATA RAID Controller
- 1160 ARC-1160 16-Port PCI-X to SATA RAID Controller
- 1210 ARC-1210 4-Port PCIe to SATA RAID Controller
- 1220 ARC-1220 8-Port PCIe to SATA RAID Controller
- 1230 ARC-1230 12-Port PCIe to SATA RAID Controller
- 1260 ARC-1260 16-Port PCIe to SATA RAID Controller
-17D4 Darim Vision Company
-17D5 S2IO Technologies
- 5831 Xframe 10 Gigabit Ethernet PCI-X
- 5832 Xframe II 10GbE PCI-X 2.0 Adapter (X2)
- 5833 E3100 PCI-Express 10Gb Ethernet Interface (X3)
-17D6 Virtual Silicon Technology Inc
-17D7 SITA
-17D8 Wing-Span Enterprise Co Ltd
-17D9 Leader Electronics Corp
-17DA 0-In Design Automation Inc
-17DB Cray Inc
-17DC Visiowave S.A.
-17DD ICOM Inc
-17DE Kworld Computer Co Ltd
-17DF Dini Group LaJalla Inc
-17E0 Integrated Circuit Solution Incorporation
-17E1 ETI A/S
-17E2 DoTop Technology Inc
-17E3 Opteon Corporation
-17E4 Sectra AB
- 0001 KK671 Cardbus encryption board
- 0002 KK672 Cardbus encryption board
-17E5 Paceline Systems
-17E6 Entropic Communications Inc
- 0010 EN2010 [c.Link] MoCA Network Controller (Coax, PCI interface)
- 0011 EN2010 [c.Link] MoCA Network Controller (Coax, MPEG interface)
- 0021 EN2210 [c.Link] MoCA Network Controller (Coax)
-17E7 Mitsubishi Electric Engineering Company Limited
-17E8 Chrontel Inc
-17E9 DH Electronics GmbH
-17EA iStor Networks Inc
-17EB Aplux Communications Ltd
-17EC Chip Engines Inc
-17ED Arbor Technology Corp
-17EE Connect Components, Ltd.
- 4153 Radeon 9550 (RV350)
-17EF Sonexis
-17F0 Velio Communications Inc
-17F1 Interactive Silicon Inc
-17F2 Albatron Corp
-17F3 RDC Semiconductor Co., Ltd.
- 1010 IDE Controller (D1010)
- 1011 Standard IDE Controller (D1011)
- 1030 PCI to PCI-E Bridge (M1030)
- 2010 GPU (VGA ) (M2010)
- 3010 HD Audio (M3010)
- 6020 R6020 North Bridge
- 6021 Host Bridge
- 6030 R6030 ISA Bridge
- 6036 PCI to ISA Bridge
- 6040 R6040 MAC Controller
- 6060 R6060 USB 1.1 Controller
- 6061 USB 2.0 Controller (EHCI)
-17F4 MicroPlex Printware AG
-17F5 Cymer Inc
-17F6 Leopard Logic Inc
-17F7 Topdek Semiconductor Inc
-17F8 Bermai Inc
-17F9 GemTek Technology Co Ltd
-17FA E-MOVE Technology Co Ltd
-17FB Wavecrest Corp
-17FC Iogear Inc
-17FD Netexcell
-17FE Linksys (Was: InProComm Inc)
- 2120 WMP11v4 802.11b PCI Card
- 2220 INPROCOMM IPN 2220 Wireless LAN Adapter
-17FF Benq Corp
-1800 Virtual IP group Inc
-1801 Pro-Nets Technology Corp
-1802 Sinus Messtechnik GmbH
-1803 ProdaSafe GmbH
-1804 Enterasys Networks
-1805 Euresys S.A.
-1806 Nexio Systems Inc
-1807 Comit Systems Inc
-1808 Pigeon Point System
-1809 Emuzed Inc
-180A Brecis Communications
-180B Formoza-Altair
-180C ICP Electronics Inc
-180D Prolific Technology Inc
-180E HCL Technologies Ltd
-1810 HCL Technologies Ltd
-1811 Wipro Technologies
-1812 LANergy
-1813 Ambient Technologies Inc
- 3059 AC97 Enhanced Audio Controller - the 8251 controller is different (VT8237)
- 4000 intel V.92 HaM Modem (MD5628D-L-A)
- 4100 Intel HaM V.92 Modem (Ambient MD8820)
-1814 Ralink Technology, Corp.
- 0001 ...I don't know (...B742000)
- 0101 RT2460 802.11b Baseband/MAC integrated chip (2460 802.11b)
- 0200 RT2500 802.11g PCI
- 0201 Ralink Chipset 802.11b/g WLAN Card ( RT2560F)
- 0300 Wireless Adapter Canyon CN-WF511
- 0301 Edimax 54 MBit WLan 802.11g rt 2500 (b8341462)
- 0302 wireless a/b (RT2525 2.4GHz transceiver + RT2560 MAC/BBP)
- 0401 Ralink MIMO RT 2661 Wireless 54 Mbps (RT 2661)
- 0601 b/g/n Wlan (RT2860T)
- 0781 Wireless (RT2860/RT2890)
- 9876 Edimax 54 MBit WLan 802.11g rt 2500 (b8341462)
- E932 RT2560F 802.11 b/g PCI
-1815 Devolo AG
-1816 Pro Team Computer Corporation
-1817 JAE
-1818 SMAR Equipamentos Industriais Ltd
-1819 Rosta Ltd
-181A NurLogic Design Inc
-181B Comax Technology Inc
-181C Yamatake Corporation
-181D eInfochips
-181E TiARIS
-181F Tachys Technologies
-1820 InfiniCom System
-1821 RedSwitch Inc
-1822 TwinHan Technology Co Ltd (AKA: VisionPlus)
- 0001 VisionPlus DVB
- 4E35 Mantis DTV PCI Bridge Controller [Ver 1.0]
-1823 FulCrum Microsystems
-1824 2C Computing Inc
-1825 Computer Access Technology Corporation
-1826 Cradle Technologies Inc
-1827 Denali Software Inc
-1828 Xsido Corporation
-1829 Verisity Design Inc
-182A Ampro Computers Inc
-182B Commetrex Corporation
-182C SYNAD Technology Ltd
-182D SiteCom Europe BV
- 3069 ISDN PCI DC-105V2
- 9790 WL-121 Wireless Network Adapter 100g+ [Ver.3]
-182E Raza Foundries Inc
- 0008 XLR516 Processor
-182F Broadcom
- 000B BCM5785 [HT1000] SATA (RAID Mode)
-1830 Credence
-1831 Glimmergalss Networks
-1832 Acquisition Logic Inc
-1833 Cognitronics Corporation
-1834 Delphi Connection Systems
-1835 SimpleTech Inc
-1836 IPFlex Inc
-1837 Sierra Logic Inc
-1838 Precision Photonics Corp
-1839 Genesis Microchip Inc
-183A Transwarp Networks Inc
-183B Mikrom GmbH
- 08A7 MVC100 DVI
- 08A8 MVC101 SDI
- 08A9 MVC102 DVI+Audio
- 08B0 MVC200-DC
-183C GCT Semicondustor Inc
-183D SI Packets
-183E Telewise Communications Inc
-183F Computer Ultrasound Global Inc
-1840 vpr Matrix Inc
-1841 Lamprey Networks Inc
-1842 Camtel Technology Corp
-1843 Firstech Technology Co Ltd
-1844 Controlnet Inc
-1845 Siliquent Technologies Ltd
-1846 Lucent Technologies NS UK
-1847 Engim Inc
-1848 Microcom C.E. as
-1849 ASRock Inc
-184A Thales Computers
-184B Systec Corporation
-184C Hirose Electric Co Ltd
-184D ICTV Inc
-184E Netlogic Microsystems Inc
-184F Ionwerks Inc
-1850 Advantest Corp
-1851 Microtune Inc
-1852 Anritsu Corp
-1853 Oasis Silicon Systems AG
-1854 LG Electronics
-1855 Cascade Semiconductor Solutions Inc
-1856 Silicon Logic Engineering Inc
-185B Compro Technology Inc
-185F Wistron NeWeb Corp
-1860 Primagraphics Ltd
-1864 SilverBack
- 2110 ISNAP 2110
-1866 Supergrace
-1867 Topspin Communications
- 5A44 MT23108 PCI-X HCA
- 5A45 MT23108 PCI-X HCA flash recovery
- 5A46 MT23108 PCI-X HCA bridge
- 6278 MT25208 InfiniHost III Ex (Tavor compatibility mode)
- 6282 MT25208 InfiniHost III Ex
-186C Humusoft s.r.o.
- 0612 AD612 Data Acquisition Device
- 0614 MF614 Multifunction I/O Card
- 0622 AD622 Data Acquisition Device
- 0624 MF624 Multifunction I/O Card
- 0625 MF625 3-phase Motor Driver
-1876 L-3 Communications
- A101 VigraWATCH PCI
- A102 VigraWATCH PMC
- A103 Vigra I/O
-187E ZyXEL Communication Corporation
- 3403 ZyAir G-110 802.11g
- 340E M-302 802.11g XtremeMIMO
-1885 Avvida Systems Inc
-1887 Elan Digital Systems Ltd
-1888 Varisys Limited
- 0301 VMFX1 FPGA PMC module
- 0601 VSM2 dual PMC carrier
- 0710 VS14x series PowerPC PCI board
- 0720 VS24x series PowerPC PCI board
- 2503 Video Capture (10 bit High qualtiy cap) (Bt881)
- 2504 Video Capture (Bt878)
- 3503 VGA Geforce4 MX440 (nVidia NV28)
- 3505 VGA Geforce4 Ti4200 (nVidia NV28)
-188A Ample Communications Inc
-1890 Egenera Inc
-1894 KNC One
-1896 B&B Electronics Manufacturing Company Inc
-1898 DIC Information Technology Ltd
- 2001 DVB Receiver Card
-18A1 Astute Networks Inc
-18AC DViCO Corp
- D500 FusionHDTV 5
- D800 FusionHDTV 3 Gold
- D810 FusionHDTV 3
- D820 FusionHDTV 3 Gold-T
- DB30 FusionHDTV DVB-T Pro
-18B8 Ammasso
- B001 AMSO 1100 iWARP/RDMA Gigabit Ethernet Coprocessor
-18BC Ge-Cube
-18C3 Micronas Semiconductor Holding AG
-18C8 Cray Inc (Was: Octigabay System)
-18C9 ARVOO Engineering BV
- 1011 Video processor (Leonardo CL)
- 1012 Video processor (Leonardo CL-P)
- 1013 Video processor (Leonardo CL-DB)
- 1014 Video processor (Leonardo CL-P-DB)
- 1015 Video processor (Leonardo CL-DVR)
- 1016 Video processor (Leonardo CL-DVR-DB)
- 2011 Framegrabber (Picasso 2SQ)
- 2012 Framegrabber (Picasso 3C/3Cpro)
- 2013 Framegrabber (Picasso LS)
- 2014 Framegrabber (Picasso CL)
- 2015 Framegrabber (Picasso FI)
- 2016 Framegrabber (Picasso SDI)
- 2017 Framegrabber (Picasso DUO)
- 2021 Framegrabber (Colory)
- 3011 Video Output Board (Valentino)
-18CA XGI Technology Inc
- 0020 XGI Compatible Super VGA (Volari Z9s) controller (Volari Z9s)
- 0040 Volari Family (8085)
- 0047 Volari 8300 (chip: XP10, codename: XG47)
-18D0 Kobian Pte Ltd
-18D2 Sitecom
- 3069 DC-105v2 ISDN controller
-18D4 Celestica
-18DD Artimi Inc
- 4C6F Artimi RTMI-100 UWB adapter
-18E6 MPL AG
- 0001 OSCI [Octal Serial Communication Interface]
-18EC Cesnet z.s.p.o.
- C006 COMBO6
- C045 COMBO6E
- C050 COMBO-PTM
- C058 COMBO6X
-18F1 Spectrum Systementwicklung Microelectronic GmbH
-18F4 Napatech A/S
-18F6 NextIO
- 1000 [Nexsis] Switch Virtual P2P PCIe Bridge
- 1050 [Nexsis] Switch Virtual P2P PCI Bridge
- 2000 [Nexsis] Switch Integrated Mgmt. Endpoint
-18F7 Commtech, Inc.
- 0001 Fastcom:ESCC-PCI-335 Syncronous RS422/485 serial communication adapter (ESCC-PCI-335)
- 0002 Fastcom:422/4-PCI-335 Asyncronous RS422/485 serial adapter (422/4-PCI-335)
- 0004 Fastcom:422/2-PCI-335 Asyncronous RS422/485 serial adapter (422/2-PCI-335)
- 0005 Fastcom IGESCC-PCI-ISO/1
- 000A Fastcom:232/4-PCI-335 Asyncronous RS232 serial adapter (232/4-PCI-335)
- 000F Fastcom FSCC
- 0010 Fastcom GSCC
- 0011 Fastcom QSSB
- 0014 SuperFSCC
-18FB Resilience Corp
-1904 Hangzhou Silan Microelectronics Co Ltd
- 8139 RTL8139D (Realtek) PCI 10/100BaseTX ethernet adaptor
-1905 WIS Technology Inc
-1910 Seaway Networks
- 0001 Seaway Network Content Accelerator (SW5000-NCA)
-1923 Sangoma Technologies Corp
- 0040 A200/Remora FXO/FXS Analog AFT card
- 0100 A104d QUAD T1/E1 AFT card
- 0300 A101 single-port T1/E1
- 0400 A104u Quad T1/E1 AFT
-1924 Level 5 Networks Inc
-192E TransDimension
- 0104 PCI Development Card
-1931 Option N.V.
- 000C Qualcomm MSM6275 UMTS chip
-1942 ClearSpeed Technology plc
- E511 CSX600 Advance Accelerator Board
-194A DapTechnology B.V.
- 1111 FireSpy3850
- 1112 FireSpy450b
- 1113 FireSpy450bT
- 1114 FireSpy850
- 1115 FireSpy850bT
-1954 Curtis Inc
-1957 Freescale Semiconductor Inc
- 0012 MPC8548 [PowerQUICC III]
- 0013 MPC8548
- 0014 MPC8543E
- 0015 MPC8543
- 0018 MPC8547E
- 0019 MPC8545E
- 001A MPC8545
- 0020 MPC8568E
- 0021 MPC8568
- 0022 MPC8567E
- 0023 MPC8567
- 0030 MPC8533E
- 0031 MPC8533
- 0032 MPC8544E
- 0033 MPC8544
- 0080 MPC8349E
- 0081 MPC8349
- 0082 MPC8347E TBGA
- 0083 MPC8347 TBGA
- 0084 MPC8347E PBGA
- 0085 MPC8347 PBGA
- 0086 MPC8343E
- 0087 MPC8343
- 7010 MPC8641 PCI Host Bridge
- 7011 MPC8641D PCI Host Bridge
-1958 Faster Technology LLC
-1959 PA Semi Inc
-1966 Orad Hi-Tec Systems
- 1975 DVG64 family
-1969 Attansic (Now owned by Atheros)
- 1026 PCI-E ETHERNET CONTROLLER (AR8121/AR8113 )
- 1048 Gigabit Ethernet 10/100/1000 Base-T Controller (Atheros L1)
- 1062 Atheros AR8132 PCI-E Fast Ethernet Controller (AR8132)
- 1063 Atheros AR8131 PCI-E Gigabit Ethernet Controller (AR8131)
- 2048 Fast Ethernet 10/100 Base-T Controller (Atheros L2)
-196A Sensory Networks Inc
- 0101 NodalCore C-1000 Content Classification Accelerator
- 0102 NodalCore C-2000 Content Classification Accelerator
- 0105 NodalCore C-3000 Content Classification Accelerator
-196D Club-3D BV
-1971 AGEIA Technologies, Inc.
- 0001 AGEIA PhysX 100 Series PCI Express Card (PCIVEN_1971&DEV_0000&SUBSYS_00021028&REV_004&2)
- 1011 AGEIA PhysX 100 Series PCI Card (PCIVEN_1971&DEV_1011&CC_FF00)
- 1021 AGEIA PhysX 200 Series PCI Express Card
- 1975 DVG64 family
-197B JMicron Technology Corp.
- 0250 JMC250 PCI Express Gigabit Ethernet (JMC2XX)
- 0256 JMC260 PCI Express Fast Ethernet (JMC2XX)
- 0260 JMC260 PCI Express Fast Ethernet (JMC2XX)
- 197B JMB38X SD/MMC Host Controller (JMB38X)
- 2360 JMicron 20360/20363 AHCI Controller
- 2361 PCI Express to SATA II and PATA Host Controller (JMB363)
- 2363 JMicron JMB362/JMB363 AHCI Controller (JMB36X)
- 2365 JMB365 AHCI/IDE
- 2366 JMicron JMB366 AHCI/IDE Controller (JMB36X)
- 2368 IDE Comtroller (JMB368)
- 2380 IEEE 1394 Host Controller (JMB38X)
- 2382 JMB38X SD/MMC Host Controller (JMB38X)
- 2383 JMB38X MS Host Controller (JMB38X)
- 2384 JMB38X xD Host Controller (JMB38X)
-1982 Distant Early Warning Communications Inc
- 1600 OX16C954 HOST-A
- 16FF OX16C954 HOST-B
-1989 Montilio Inc
- 0001 RapidFile Bridge
- 8001 RapidFile Bridge
-198A Nallatech
- 0210 XMC-210
- 0220 XMC-220
- 0230 XMC-230
- 0240 XMC-240
- 1180 PCIe-180 ( pm 965)
- 1280 PCIe-280
- 402F BenNUEY PCIX
- 4030 H100-PCIX
- 4031 BenNUEY PCI-104-V4
- 4032 BenONE-PCIe
- 4033 BenONE-Xilinx-Kit-ROHS
- 4034 BenNUEY PCIX RoHS
-1993 Innominate Security Technologies AG
-199A Pulse-LINK Inc
-19A2 ServerEngines LLC
- 0001 ACA2400 Crypto Accelerator
- 0200 BladeEngine 10Gb PCI-E iSCSI adapter
- 0201 BladeEngine 10Gb PCI-E Network Adpater
- 0520 4135 HFT Interface Controller
-19A8 DAQDATA GmbH
-19AC Kasten Chase Applied Research
- 0001 Crypto Accelerator (ACA2400)
-19AE Progeny Systems Corp
- 0520 4135 HFT Interface Controller
-19D4 Quixant Limited
-19DE Pico Computing
-19E2 Vector Informatik GmbH
-19E3 DDRdrive LLC
- DD52 DDRdrive X1
-19E7 NET (Network Equipment Technologies)
- 1001 STIX DSP Card
- 1002 STIX - 1 Port T1/E1 Card
- 1003 STIX - 2 Port T1/E1 Card
- 1004 STIX - 4 Port T1/E1 Card
- 1005 STIX - 4 Port FXS Card
-1A03 ASPEED Technology Inc
-1A07 Kvaser AB
- 0006 CAN interface PC104+ HS/HS
- 0007 CAN interface PCIcanx II HS or HS/HS
-1A08 Sierra Semiconductor
- 0000 SC15064
-1A1D GFaI e.V.
-1A22 Ambric Inc
-1A29 Fortinet Inc
-1A51 Hectronic AB
-1A58 Razer USA Ltd
-1A5D Celoxica
-1A68 VirtenSys Limited
-1A71 XenSource Inc
-1A73 Violin Technologies Inc
-1A77 Lightfleet Corporation
-1A78 Virident Systems Inc
-1A8C Verigy Pte Ltd
- 1100 E8001-66443 PCIe CIC
-1AB9 Espia Srl
-1AE8 Silicon Software GmbH
- 0A40 microEnable IV-Base x1
- 0A41 microEnable IV-FULL x1
-1B13 Jaton Corporation USA
- 0001 nVidia Corporation NV17 (GeForce4 MX 440)
-1B28 Taicom Data Systems Co Ltd
-1B47 Proxim(??) (Possibly Incorrect)
-1C1C DTC / Symphony / Forex Computer Corp
- 0001 FR710/82C101 EIDE
-1D44 Distributed Processing Technology (DPT)
- A400 PM2x24/PM3224 SCSI Adapter
-1DE1 Tekram Technology
- 0391 TRM-S1040 DC-315U Ultra SCSI Controller
- 2020 SCSI Controller (DC-390)
- 690C IDE Cache Controller (DC-690C)
- DC29 Bus Master IDE PCI 2 controllers (DC290M)
-1DE2 A/DHOC Systems
- 1190 001 Slave PCI protyting board
-1FC0 Tumsan Oy
- 0300 E2200 Dual E1/Rawpipe Card
-1FC1 PathScale Inc
-1FC9 Tehuti Networks Ltd.
- 3009 10 Giga TOE SmartNIC
- 3010 10 Giga TOE SmartNIC
- 3014 10 Giga TOE SmartNIC 2-Port
-1FCE Cognio Inc
- 0001 Spectrum Analyzer PC Card (SAgE)
-2000 Agat-RT(??)
- 0DDD Alder-9P computer telephony interface board
- 2800 56K Voice Modem
-2001 Temporal Research Ltd
-2002 Automation Technology GmbH
- 2003 PCI Frame Grabber
-2003 Netodragon?? Smartlink??
- 8800 Netodragon 56K voice modem
-2004 Smart Link Ltd
-2014 NONTECH Nonnenmacher GmbH
- 0004 aa551234 PCI Master Target
- 0040 0xff8000 PCI to Private Bus Bridge
-21C3 21st Century Computer Corp
-22B8 Motorola Inc
-2348 Racore
- 2010 8142 100VG/AnyLAN
-2646 Kingston Technology Corp
-270B Xantel Corp
-270F Chaintech Computer Co Ltd
-2711 AVID Technology Inc
-2EC1 Zenic Inc
-3000 Hansol Electronics Inc
-3030 C-Net
-3142 Post Impression Systems
-3388 PLX Technology (Was: HiNT Corp)
- 0013 HiNT HC4 PCI to ISDN bridge, Multimedia audio Controller
- 0014 HiNT HC4 PCI to ISDN bridge, Network Controller
- 0020 PCI 6154/6254 HB2/HB6 Universal PCI to PCI bridge (transparent mode)
- 0021 PCI 6140/52/6254 HB1/1-SE/HB6 Universal PCI to PCI Bridge (non-transparent mode)
- 0022 PCI 6150 HB4 PCI to PCI Bridge
- 0026 PCI 6154 HB2 PCI to PCI Bridge
- 0028 PCI 6540 HB8 Dual Mode PCI-X-to-PCI-X Bridge (transparent mode)
- 0029 PCI 6540 HB8 Dual Mode PCI-X-to-PCI-X Bridge (non-transparent mode)
- 0030 PCI 6520 HB7 Transparent PCI-X-to-PCI-X Bridge
- 0031 Synchronous 32-Bit, 33 MHz PCI-to-PCI Bridge for Video Capture Applications (PCI 6156)
- 101A E.Band [AudioTrak Inca88]
- 101B E.Band [AudioTrak Inca88]
- 8011 VXPro II Chipset CPU to PCI Bridge
- 8012 VXPro II Chipset PCI to ISA Bridge
- 8013 EIDE Controller (PLX Registration Record Management)
- A101 Blackmagic DeckLink
- A102 Blackmagic DeckLink
- A103 Blackmagic DeckLink
- A104 Blackmagic DeckLink
- A105 Blackmagic DeckLink
-3411 Quantum Designs (H.K.) Inc
-3513 ARCOM Control Systems Ltd
-3842 EVGA.COM
-38D0 mfp-online.de
- 62D6 fieldbus-master PCI Measurement bus Controller for EPSI
-38EF 4Links
-3D3D 3Dlabs, Inc. Ltd
- 0001 3D Accelerator (GLint 300SX)
- 0002 Sapphire 3D Accelerator (GLint 500TX)
- 0003 Delta Geometry processor (GLint)
- 0004 2D+3D Accelerator (3C0SX)
- 0005 2D+3D Accelerator (Permedia)
- 0006 3D Accelerator (GLint MX)
- 0007 Permedia II 2D+3D Accelerator (3D Extreme)
- 0008 GLINT Gamma G1
- 0009 2d+3d chipset, integrated ramdac (Permedia2v)
- 000A Driver Ethernet Pci Ven 1969 (Permedia 3)
- 000C Permedia 3
- 000D 3D Accelerator (GLINT R4)
- 000E GLINT Gamma G2
- 0011 GLint R4 rev B
- 0012 GLint R5 rev A
- 0013 GLint R5 rev B
- 0020 3Dlabs Wildcat VP 880 Pro (0x0020)
- 0022 VP10 visual processor
- 0024 VP9 visual processor
- 0030 3Dlabs Wildcat Realizm 800 (0x030000)
- 0100 2D+3D Accelerator (Permedia II)
- 07A1 Wildcat III 6210
- 07A2 Sun XVR-500 Graphics Accelerator
- 07A3 Wildcat IV 7210
- 1004 3D+3D Accelerator (Permedia)
- 3D04 2D+3D Accelerator (Permedia)
- FFFF Glint VGA (Error??)
-4005 Avance Logic Inc.
- 0300 ALS300 PCI Audio Device
- 0308 PCI Audio Device + modem (3220)
- 0309 PCI Input Controller (ALS300 )
- 1064 GUI Accelerator (ALG2064)
- 2064 ALG-2032/64i GUI Accelerator
- 2128 GUI Accelerator (ALG2364A)
- 2301 GUI Accelerator (ALG2301)
- 2302 GUI Accelerator (ALG2302)
- 2303 GUI Accelerator (AVG2302)
- 2364 GUI Accelerator (ALG2364)
- 2464 GUI Accelerator (ALG2464)
- 2501 GUI Accelerator (ALG2564A/25128A)
- 4000 Audio Chipset (ALS4000)
-4033 Delta Networks Inc
- 1300 SIS900 10/100Mbps Fast Ethernet Controller
- 1320 VT86C100A 10/100M PCI Fast Ethernet Controller
- 1360 RTL8139A 10/100 Mbps PCI Fast Ethernet Controller
- 1380 DEC 21143PD 10/100M PCI Fast Ethernet Controller
- 7001 ISL36341M PRISM 2.5 Mini-PCI 802.11b Wireless Controller
-4040 NetXen Incorporated
- 0001 NXB-10GXSR 10 Gigabit Ethernet PCIe Adapter with SR-XFP optical interface
- 0002 NXB-10GCX4 10 Gigabit Ethernet PCIe Adapter with CX4 copper interface
- 0003 NXB-4GCU Quad Gigabit Ethernet PCIe Adapter with 1000-BASE-T interface
- 0004 BladeCenter-H 10 Gigabit Ethernet High Speed Daughter Card
-4143 Digital Equipment Corp
-4144 Alpha Data Parallel Systems Ltd
- 0040 Virtex-E Bridge (ADM-XRC)
- 0041 Virtex-II Bridge (ADM-XRC-II Lite)
- 0042 Virtex-II Bridge (ADM-XRC-II)
- 0043 Virtex-II Pro Bridge (ADM-XPL)
- 0044 Virtex-II Pro PCI/PCI-X Bridge (ADM-XP)
- 0045 Virtex-II Bridge (ADP-WRC-II)
- 0046 Virtex-II Bridge (ADP-DRC-II)
- 0049 Virtex-II Pro PCI (ADP-XPI)
- 004A Virtex-II Pro PCI-X Bridge (ADP-XPI (PCI-X))
- 004F Virtex-II Pro PCI-X Bridge (ADM-XRC-4FX)
- 0050 Virtex-4LX Bridge (ADM-XRC-5LX)
- 0051 ADM-XRC-5T1 (ADM-XRC-5T1)
-416C Aladdin Knowledge Systems
- 0100 AladdinCARD
- 0200 CPC
-4250 Burke Porter Ltd
-4321 Tata Power Strategic Electronics Division
-434D ?? Unknown (Present in WinXP Drivers)
- 1002 56K Voice Modem
-434E CAST Navigation LLC
-4444 Conexant Inc (Was: Globespan, ICompression Inc)
- 0002 iTVC12 MPEG Codec
- 0016 iTVC16/CX23416 MPEG Codec
- 0803 iTVC15/CX23415 MPEG Codec
-4468 Bridgeport Machines
-4594 Cogetec Informatique Inc
-45FB Baldor Electric Company
-4680 UMAX Computer Corp
-4843 Hercules Computer Technology Inc
-4916 RedCreek Communications Inc
- 1960 RedCreek PCI Adapter
-4943 Growth Networks
-494F ICS Advent
- 22C0 Watchdog WDT500
- ACA8 PCI-AI/1216 ADC Card
- ACA9 PCI-AI/1216(M) ADC Card
-4954 Integral Technologies
-4978 Axil Computer Inc
-4A14 NetVin
- 5000 NV5000 RPTI RTL8029-Based PCI Ethernet Adapter
-4ABD Applied Biosystems Division
-4B10 Buslogic Inc
- 3080 SCSI Host Adapter
- 4010 Wide SCSI Host Adapter
-4C48 Lung Hwa Electronics
-4C53 SBS Technologies (AKA: SBS-Or Industrial Computers)
- 0000 Diagnostics Device (PLUSTEST)
-4CA1 Seanix Technology Inc
-4CCC Computer Conversions Corp
-4D51 Mediaq Inc.
- 0200 MQ-200
-4D54 Microtechnica Co Ltd
-4D56 MATRIX VISION GmbH
-4DDC ILC Data Device Corp
- 0100 DD-42924I5-300 (ARINC 429 Data Bus)
- 0801 BU-65570I1 MIL-STD-1553 Test and Simulation
- 0802 BU-65570I2 MIL-STD-1553 Test and Simulation
- 0811 BU-65572I1 MIL-STD-1553 Test and Simulation
- 0812 BU-65572I2 MIL-STD-1553 Test and Simulation
- 0881 BU-65570T1 MIL-STD-1553 Test and Simulation
- 0882 BU-65570T2 MIL-STD-1553 Test and Simulation
- 0891 BU-65572T1 MIL-STD-1553 Test and Simulation
- 0892 BU-65572T2 MIL-STD-1553 Test and Simulation
- 0901 BU-65565C1 MIL-STD-1553 Data Bus
- 0902 BU-65565C2 MIL-STD-1553 Data Bus
- 0903 BU-65565C3 MIL-STD-1553 Data Bus
- 0904 BU-65565C4 MIL-STD-1553 Data Bus
- 0B01 BU-65569I1 MIL-STD-1553 Data Bus
- 0B02 BU-65569I2 MIL-STD-1553 Data Bus
- 0B03 BU-65569I3 MIL-STD-1553 Data Bus
- 0B04 BU-65569I4 MIL-STD-1553 Data Bus
-5046 GemTek Technology corp
- 1001 PCI Radio
-5053 TBS/Voyetra Technologies
- 2010 Daytona Audio Adapter
-5136 S S Technologies
-5143 Qualcomm Inc
-5145 Ensoniq (Oldest ID)
- 3031 Concert AudioPCI
-5168 Animation Technologies Inc
- 0300 FlyDVB-S
- 0301 FlyDVB-T
-5301 Alliance Semiconductor Corp
- 0001 ProMotion aT3D
-5333 S3 Graphics Co., Ltd
- 0551 Plato/PX (86C551)
- 5333 via (S3 86c765)
- 5631 Virge 3D (86C325)
- 8800 Vision 866 GUI Accelerator (86C866)
- 8801 Vision 964 GUI Accelerator (86C964)
- 8810 S3 TRIO32 IACB2 86C732-P (86C732-P)
- 8811 86C732 Trio32, 86C764 Trio64, 86C765 Trio64V+ Rev 01
- 8812 Aurora 64V+ (86CM65?)
- 8813 Trio 32/64 GUI Accelerator v3 (86C764)
- 8814 Trio 64UV+ (86C767)
- 8815 Aurora128 (86CM66)
- 883D ViRGE/VX 3D GUI Accelerator (86C988)
- 8870 Fire GL
- 8880 Vision 868 GUI Accelerator VRAM rev. 0 (86C868)
- 8881 Vision 868 GUI Accelerator VRAM rev. 1 (86C868)
- 8882 Vision 868 GUI Accelerator VRAM rev. 2 (86C868)
- 8883 Vision 868 GUI Accelerator VRAM rev. 3 (86C868)
- 88B0 Vision 928 GUI Accelerator VRAM rev. 0 (86C928)
- 88B1 Vision 928 GUI Accelerator VRAM rev. 1 (86C928)
- 88B2 Vision 928 GUI Accelerator VRAM rev. 2 (86C928)
- 88B3 Vision 928 GUI Accelerator VRAM rev. 3 (86C928)
- 88C0 Vision 864 GUI Accelerator DRAM rev. 0 (86C864)
- 88C1 Vision 864 GUI Accelerator DRAM rev. 1 (86C864)
- 88C2 Vision 864 GUI Accelerator DRAM rev. 2 (86C864)
- 88C3 Vision 864 GUI Accelerator DRAM rev. 3 (86C864)
- 88D0 Vision 964 GUI Accelerator VRAM rev. 0 (86C964)
- 88D1 Vision 964-P GUI Accelerator VRAM rev. 1 (86C964)
- 88D2 Vision 964-P GUI Accelerator DRAM rev 2 (86C964)
- 88D3 Vision 964-P GUI Accelerator VRAM rev. 3 (86C964)
- 88F0 Vision 968 GUI Accelerator VRAM rev. 0 (86C968)
- 88F1 Vision 968 GUI Accelerator VRAM rev. 1 (86C968)
- 88F2 Vision 968 GUI Accelerator VRAM rev. 2 (86C968)
- 88F3 Vision 968 GUI Accelerator VRAM rev. 3 (86C968)
- 8900 Trio64V2/DX (86C775)
- 8901 S3 trio64uv+ for windows xp (pciven_5333dev_8C2E&SUBSYS_00011179&REV_054&74C6)
- 8902 SMA Family (86C551)
- 8903 TrioV Family
- 8904 86C365 Trio3D QFP, 86C366 Trio3D BGA
- 8905 86C765 Trio64V+ compatible (86c765)
- 8906 86C765 Trio64V+ compatible (86c765)
- 8907 86C765 Trio64V+ compatible (86c765)
- 8908 86C765 Trio64V+ compatible (9711 MCN74)
- 8909 86C765 Trio64V+ Compatible
- 890A 86C765 Trio64V+ compatible (0x00091011)
- 890B 86C765 Trio64V+ compatible (9726 c19394.00)
- 890C 86C765 Trio64V+ compatible (86C765)
- 890D 86C765 Trio64V+ Compatible
- 890E 86C765 Trio64V+ compatible (9711 MCN74)
- 890F 86C765 Trio64V+ compatible (86c765)
- 8A01 86C375 ViRGE/DX, 86C385 ViRGE/GX
- 8A10 86C357 ViRGE/GX2, 86C359 ViRGE/GX2+
- 8A11 ViRGE /GX2+ Macrovision (86C359)
- 8A12 ViRGE /GX2+ (86C359)
- 8A13 Trio3D2x & Trio3D2x+ AGP / Trio3D2x & Trio3D2x+ 8MB (86C368)
- 8A20 S3savage3D (86C391)
- 8A21 Savage3D/MV (86C390)
- 8A22 86C394/5/6/7/8 Savage4 LT/GT/Pro-M/Pro/Xtreme
- 8A23 Savage 4 (86C394-397)
- 8A25 Savage4 ProSavage PM133
- 8A26 ProSavage (86C395B)
- 8C00 ViRGE/M3 (ViRGE/MX) (85C260)
- 8C01 ViRGE/M5 (ViRGE/MX) (86C260)
- 8C02 ViRGE/MXC (86C240)
- 8C03 86C280 ViRGE/MX+ Macrovision
- 8C10 86C270 Savage/MX,274 Savage/IX,290 Savage/MX+MV,294 Savage/IX+MV
- 8C11 82C270-294 Savage/MX
- 8C12 Savage MX/IX/MX+MV/IX+MV (86C270/274/290/294)
- 8C13 SAVAGE IX (82C294)
- 8C22 SuperSavage 128/MX (86C508)
- 8C24 SuperSavage MX/64
- 8C26 SuperSavage MX/64C
- 8C2A SuperSavage 128/IX (86C544)
- 8C2B SuperSavage 128/IX DDR (86C553)
- 8C2C SuperSavage/IX (86C564)
- 8C2D SuperSavage/IX DDR (86C573)
- 8C2E SuperSavage/IXC SDRAM (86C584)
- 8C2F SuperSavage/IXC DDR (86C594)
- 8D01 82C380 Twister, 82C381 Twister T
- 8D02 Twister K (86c387)
- 8D03 VT8751 ProSavageDDR P4M266
- 8D04 ProSavage DDR (86C410)
- 8E00 86C777 DeltaChromeS8, 86C787 DeltaChromeF1
- 8E01 DeltaChromeX9m (86C732)
- 8E10 GammaChromeS18
- 8E48 Chrome 20 Series
- 9102 Inno Savage 2000 (86c410)
- CA00 SonicVibes PCI Audio Accelerator (86C617)
-5401 Ericsson
- 0101 DSSS Wireless LAN PCI Card
-5430 Evergreen Technologies Inc
- 0100 AcceleraPCI Upgrade Card Adapter
-544C Teralogic Inc
- 0350 TL880-based HDTV/ATSC tuner
-5455 Technische Universitaet Berlin
- 4458 S5933 PCI to MyBus Bridge
-5456 GoTView
-5519 Cnet Technologies Inc
-5544 Dunord Technologies
- 0001 I-30xx Scanner Interface
-5555 Genroco Inc.
- 0003 Digital Video OEM computer module (VPI General Digital Video Component)
-5654 VoiceTronix Pty Ltd
- 3132 OpenSwitch12
-5700 Netpower
-5851 Exacq Technologies
-5853 XenSource Inc
- 0001 Xen Platform Device
-6356 UltraStor
- 4002 ULTRA24 SCSI Host
- 4102 ULTRA24 SCSI Host
- 4202 ULTRA24 SCSI Host
- 4302 ULTRA24 SCSI Host
- 4402 ULTRA24 SCSI Host
- 4502 ULTRA24 SCSI Host
- 4602 ULTRA24 SCSI Host
- 4702 ULTRA24 SCSI Host
- 4802 ULTRA24 SCSI Host
- 4902 ULTRA24 SCSI Host
- 4A02 ULTRA24 SCSI Host
- 4B02 ULTRA24 SCSI Host
- 4C02 ULTRA24 SCSI Host
- 4D02 ULTRA24 SCSI Host
- 4E02 ULTRA24 SCSI Host
- 4F02 ULTRA24 SCSI Host
-6374 c't Magazin fuer Computertechnik
- 6773 CT-GPPCI General Purpose PCI Interface
-6409 Logitec Corp
-6666 Decision Computer International Co.
- 0001 PCCOM4
- 0002 PCCOM8
- 0004 PCCOM2
- 0101 PCI 8255/8254 I/O Card
-6809 Kurusugawa Electronics Industry Inc
-7063 pcHDTV
- 2000 HD-2000
- 3000 HD-3000
- 5500 HD5500 HDTV
-7604 O.N. Electric Co Ltd
-7747 DaoGuo Technology Co Ltd
-7BDE Midac Corporation
-7FED PowerTV
-8001 Beyertone AG Germany
-8008 Quancom Electronic GmbH
- 0010 PWDOG1 Watchdog
- 0011 PWDOG2 Watchdog2
- 0016 PROTO2
- 0100 PREL8
- 0102 PREL16
- 0103 POPTOREL16
- 0105 POPTO16IN
- 0106 PTTL24IO
- 0107 PUNIREL
- 1000 PDAC4
- 1001 PAD12DAC4
- 1002 PAD16DAC4
- 1005 PAD12
- 1006 PAD16
- 3000 POPTOLCA
- 3100 PCIPROTO
- 3103 PCIOPTO16IO
- 3104 PCIOPTOREL16
- 3203 PCIOPTO16IO/LC
- 3204 PCIREL16
- 3301 PCITTL32IO
- 3302 PCIGPIB
-807D Asustek Computer Inc
-8086 Intel Corporation
- 0007 82379AB (??)
- 0008 Extended Express System Support Controller
- 0039 21145 Ethernet Adapter
- 0122 82437FX 430FX (Triton) System Controller
- 0308 PCI Audio Device + modem (3220)
- 0309 I/O Processor PCI-to-PCI Bridge Unit (80303)
- 030D I/O Companion Unit PCI-to-PCI Bridge (80312)
- 0318 80219 400 MHz Gen Purpose PCI Processor Address Translation Unit
- 0319 80219 600 MHz Gen Purpose PCI Processor Address Translation Unit
- 0326 6700/6702PXH I/OxAPIC Interrupt Controller A
- 0327 I/OxAPIC Interrupt Controller B (6700PXH)
- 0329 PCI Express-to-PCI Express Bridge A (6700PXH)
- 032A PCI Express-to-PCI Express Bridge B (6700PXH)
- 032C PCI Express-to-PCI Express Bridge (6702PXH)
- 032D 41110 [Lanai-V] Serial to Parallel PCI Bridge - Single Segment Bridge
- 0330 80332 [Dobson] I/O processor A-segment Bridge
- 0331 80332 [Dobson] I/O processor A-segment IOAPIC
- 0332 80332 [Dobson] I/O processor B-segment Bridge
- 0333 80332 [Dobson] I/O processor B-segment IOAPIC
- 0334 80332 [Dobson] I/O processor Address Translation Unit (ATU)
- 0335 80331 [Lindsay] I/O processor PCI-X bridge
- 0336 80331 [Lindsay] I/O processor Address Translation Unit (ATU)
- 0340 41210 [Lanai] Serial to Parallel PCI Bridge A-segment Bridge
- 0341 41210 [Lanai] Serial to Parallel PCI Bridge B-segment Bridge
- 0370 Segment-A PCI Express-to-PCI Express Bridge (80333)
- 0371 A-Bus IOAPIC (80333)
- 0372 Segment-B PCI Express-to-PCI Express Bridge (80333)
- 0373 B-Bus IOAPIC (80333)
- 0374 Address Translation Unit (80333)
- 0482 PCI-EISA Bridge (PCEB)hp dx 7300 microwave tower (82375MB)
- 0483 82424TX/ZX (Saturn) Cache/DRAM Controller
- 0484 82378ZB/IB,82379AB PCI to ISA Bridge, System I/O
- 0486 82420EX/ZX 486 PCIset System, ISA Bridge & EIDE Controller
- 04A3 82434LX/NX (Mercury/Neptune) Cache/DRAM Controller
- 04D0 82437FX 430FX CPU to PCI Bridge
- 0500 Processor Bus Controller (E8870)
- 0501 Memory Controller (E8870)
- 0502 Scalability Port 0 (E8870)
- 0503 E8870 Scalability Port 1 / Global Performance Monitoring
- 0510 E8870IO Hub Interface Port 0 (8-bit Compatibility)
- 0511 Hub Interface Port 2 (E8870IO)
- 0512 Hub Interface Port 2 (E8870IO)
- 0513 Hub Interface Port 3 (E8870IO)
- 0514 Hub Interface Port 4 (E8870IO)
- 0515 Server I/O Hub (SIOH) (E8870IO)
- 0516 E8870IO Reliabilty, Availability and Serviceability (RAS)
- 0530 Scalability Port 0 (E8870SP)
- 0531 Scalability Port 1 (E8870SP)
- 0532 Scalability Port 2 (E8870SP)
- 0533 Scalability Port 3 (E8870SP)
- 0534 Scalability Port 4 (E8870SP)
- 0535 Scalability Port 5 (E8870SP)
- 0536 Scalability Port Switch Global Registers (E8870SP)
- 0537 Interleave Configuration Registers (E8870SP)
- 0600 Storage RAID Controller (01af8086)
- 0601 RAID Controller
- 061F 80303 I/O Processor
- 0800 pci/ven_8086&dev_27da&subsys_30b2103c&rev_023&b1bfb68&0&fb (10B01734)
- 0960 i960 RP Microprocessor/Bridge (80960RP)
- 0962 i960RM/RN Microprocessor/Bridge (80960RM/RN)
- 0964 i960 RP Microprocessor Bridge (80960RP)
- 1000 82542 Gigabit Ethernet Controller
- 1001 82543GC Gigabit Ethernet Adapter (Fiber)
- 1002 Pro 100 LAN+Modem 56 CardBus II
- 1004 Gigabit Ethernet Controller (Copper) (82543GC)
- 1008 Gigabit Ethernet Controller (Copper) (82544EI/GC)
- 1009 Gigabit Ethernet Controller (Fiber) (82544EI)
- 100A 82540EM Gigabit Ethernet Controller
- 100C Gigabit Ethernet Controller (Copper) (82543EI/GC)
- 100D Gigabit Ethernet Controller (LOM) (82544GC)
- 100E Gigabit Ethernet Controller (82540EM)
- 100F Gigabit Ethernet Controller (copper) (82545EM)
- 1010 Dual Port Gigabit Ethernet Controller (Copper) (82546EB)
- 1011 Gigabit Ethernet Controller (Fiber) (82545EM)
- 1012 Dual Port Gigabit Ethernet Controller (Fiber) (82546EB)
- 1013 Gigabit Ethernet Controller (Copper) (82541EI)
- 1014 Gigabit Ethernet Controller (82541ER)
- 1015 Gigabit Ethernet Controller (LOM) (82540EM)
- 1016 Gigabit Ethernet Controller (LOM) (82540EP)
- 1017 Gigabit Ethernet Controller (LOM) (82540EP)
- 1018 PRO/1000 MT Mobile connection (82541EI)
- 1019 Gigabit Ethernet Controller (LOM) (82547EI)
- 101A Gigabit Ethernet Controller (LOM) (82547EI)
- 101D Dual Port Gigabit Ethernet Controller (82546EB)
- 101E Gigabit Ethernet Controller (Mobile) (82540EP)
- 1026 Gigabit Ethernet Controller (82545ep)
- 1027 Gigabit Ethernet Controller (Fiber) (82545GM)
- 1028 Gigabit Ethernet Controller (82545GM)
- 1029 Fast Ethernet PCI/CardBus Controller
- 1030 82559 InBusiness 10/100
- 1031 82801CAM (ICH3) PRO/100 VE (LOM) Network Connection
- 1032 82801CAM (ICH3) PRO/100 VE Network Connection
- 1033 82801CAM (ICH3) PRO/100 VM Network Connection
- 1034 82801CAM (ICH3) PRO/100 VM Network Connection
- 1035 82801CAM (ICH3)/82562EH based Phoneline Network Connection
- 1036 82801CAM (ICH3)/82562EH based Phoneline Network Connection
- 1037 82801CAM (ICH3) Chipset Ethernet Controller
- 1038 82801CAM (ICH3) PRO/100 VM (KM) Network Connection
- 1039 82801DB/DBL (ICH4/ICH4-L) PRO/100 VE Network Connection
- 103A 82801DB/DBL (ICH4/ICH4-L) PRO/100 VE Network Connection
- 103B 82801DB/DBL (ICH4/ICH4-L) PRO/100 VM Network Connection
- 103C 82801DB/DBL (ICH4/ICH4-L) PRO/100 VM Network Connection
- 103D 82801DB (ICH4) PRO/100 VE Network Connection
- 103E 82801DB (ICH4) PRO/100 VM Network Connection
- 1040 V.92 PCI (DSP) Data Fax Modema (536EP)
- 1042 PRO/Wireless 2011 LAN PCI Card
- 1043 Intel(R) PRO/Wireless 2100 LAN Card Driver (82801)
- 1048 10 Gigabit Ethernet Controller (82597EX)
- 1049 Gigabit Network Connection Interface Controller (82566MM NIC)
- 104A 82566DM Gigabit Network Connection
- 104B 82566DC Gigabit Network Connection
- 104C 82562V 10/100 Network Connection
- 104D 82566MC Gigabit Network Connection
- 1050 PRO/100 VE Network Connection (82801EB/ER)
- 1051 82801EB/ER (ICH5/ICH5R) PRO/100 VE Network Connection
- 1052 PRO/100 VM Network Connection (82801EB/ER)
- 1053 PRO/100 VM Network Connection (82801EB/ER)
- 1054 PRO/100 VE Network Connection (mobile) (82801EB/ER)
- 1055 PRO/100 VM Network Connection (mobile) (82801EB/ER)
- 1056 PRO/100 VE Network Connection
- 1057 PRO/100 VE Network Connection
- 1059 Fast Ethernet PCI/CardBus Controller (82551QM)
- 105B 82546GB Gigabit Ethernet Controller (Copper)
- 105E HP NC360T PCIe DP Gigabit Server Adapter (n1e5132)
- 105F PRO/1000 PF Family
- 1060 PRO/1000 PB
- 1064 82562EZ PRO/100 Ethernet Controller
- 1065 82562ET/EZ/GT/GZ PRO/100 VE Ethernet Controller
- 1066 82562EM/EX/GX PRO/100 VM (LOM) Ethernet Controller
- 1067 82562EM/EX/GX PRO/100 VM Ethernet Controller
- 1068 82562ET/EZ/GT/GZ PRO/100 VE (LOM) Ethernet Controller Mobile
- 1069 82562EM/EX/GX PRO/100 VM (LOM) Ethernet Controller Mobile
- 106A 82562Gt PRO/100 VE (LOM) Ethernet Controller
- 106B 82562Gt PRO/100 VE Ethernet Controller Mobile
- 1075 Gigabit Ethernet Controller (82547EI)
- 1076 Gigabit Ethernet Controller (82541EI)
- 1077 Gigabit Ethernet Controller (Mobile) (82547EI)
- 1078 Gigabit Ethernet Controller (82541ER)
- 1079 Dual Port Gigabit Ethernet Controller (82546EB)
- 107A Dual Port Gigabit Ethernet Controller (Fiber) (82546EB)
- 107B Dual Port Gigabit Ethernet Controller (Copper) (82546EB)
- 107C Gigabit Ethernet Controller (Copper) rev 5 (82541PI)
- 107D PRO/1000 PT
- 107E PRO/1000 PF
- 107F PRO/1000 PB
- 1080 FA82537EP - Intel 537EP V.92 (PCI) modem (0321CGEA04)
- 1081 PRO/1000 EB Network Connection
- 1082 PRO/1000 EB Server Connection
- 1083 PRO/1000 EB Backplane Connection
- 1084 Enterprise Southbridge IDE Redirection
- 1085 Enterprise Southbridge Serial Port Redirection
- 1086 Enterprise Southbridge IPMI/KCS0
- 1087 Enterprise Southbridge UHCI Redirection
- 1089 Enterprise Southbridge BT
- 108A PRO/1000 P
- 108B Intel network controller (PCIE Gigabit Ethernet) (PC82573V)
- 108C Intel Corporation 82573E Gigabit Ethernet Controller (Copper) (82573E)
- 108D Active Management Technology - IDE
- 108E Intel(R) Active Management Technology - KCS (ICH7R)
- 108F Intel(R) Active Management Technology - SOL (ICH7R)
- 1091 PRO/100 VM Network Connection
- 1092 PRO/100 VE Network Controller (27DA)
- 1093 PRO/100 VM Network Connection
- 1094 get PRO2KXP.exe from Intel (Onboard - Intel PRO 100/VE nic)
- 1095 PRO/100 VE Network Connection
- 1096 Intel PRO/1000 EB (Intel PRO/1000 EB)
- 1097 PRO/1000 EB Server Connection
- 1098 PRO/1000 EB Backplane Connection
- 1099 82546GB Quad Port Server Adapter
- 109A Intel PRO/1000 PL Network Adaptor (82573L)
- 109B 82546GB PRO/1000 GF Quad Port Server Adapter
- 109E 82597-based CX4 10 Gigabit Adapter
- 10A0 82571EB PRO/1000 AT Quad Port Bypass Adapter
- 10A1 82571EB PRO/1000 AF Quad Port Bypass Adapter
- 10A4 82571EB Gigabit Ethernet Controller
- 10A5 82571EB Gigabit Ethernet Controller (Fiber)
- 10A7 82575EB Gigabit Network Connection
- 10A9 82575EB Gigabit Backplane Connection
- 10B0 82573L PRO/1000 PL Network Connection
- 10B2 82573V PRO/1000 PM Network Connection
- 10B3 82573E PRO/1000 PM Network Connection
- 10B4 82573L PRO/1000 PL Network Connection
- 10B5 82546GB PRO/1000 GT Quad Port Server Adapter
- 10B6 82598 10GbE PCI-Express Ethernet Controller
- 10B9 82572EI PRO/1000 PT Desktop Adapter (Copper)
- 10BA PRO/1000 EB1 Network Connection with I/O Acceleration
- 10BB PRO/1000 EB1 Backplane Connection with I/O Acceleration
- 10BC 82571EB Gigabit Ethernet Controller (Copper)
- 10BD Intel 82566DM Gigabit Ethernet Adapter (82566DM)
- 10C0 Intel(R) 82562V-2 10/100 Network Connection (8082)
- 10C2 82562G-2 10/100 Network Connection
- 10C3 82562GT-2 10/100 Network Connection
- 10C4 Intel 82562GT 10/100 Network Controller (82562GT)
- 10C5 82562G 10/100 Network Connection
- 10C6 82598EB 10 Gigabit AF Dual Port Network Connection
- 10C7 82598EB 10 Gigabit AF Network Connection
- 10CE Intel 82567V-2 Gigabit Network Connection (82567V-2)
- 10D3 Intel 82574L Gigabit Ethernet Controller (82574L)
- 10D5 82571PT Gigabit PT Quad Port Server ExpressModule
- 10D6 82575GB Gigabit Network Connection
- 10D9 82571EB Dual Port Gigabit Mezzanine Adapter
- 10DA 82571EB Quad Port Gigabit Mezzanine Adapter
- 10DD 82598EB 10 Gigabit AT CX4 Network Connection
- 10DE Intel Gigabit network connection (82567LM-3 )
- 10E2 82575GB Gigabit Network Connection
- 10E8 Unknown (Unknown)
- 10F5 Intel 82567LM-2 Gigabit Network Connection (82567LM)
- 1100 82815 815/E (Solano) Host to I/O Hub Bridge with 100MHz DRAM Controller
- 1101 82815 815/E (Solano) PCI to AGP Bridge
- 1102 82815 815/E (Solano) Internal GUI Accelerator
- 1107 PRO/1000 MF Server Adapter (LX)
- 1110 82815 815/E (Solano) Host to I/O Hub Bridge, AGP Not Implemented
- 1112 82815 815/E (Solano) Internal GUI Accelerator
- 1120 82815 815/E (Solano) Host to I/O Hub Bridge, AGP Implemented
- 1121 82815 815/E (Solano) PCI to AGP Bridge
- 1130 82815/EM/EP/P 815/EM/EP/P (Solano) Host to I/O Hub Bridge
- 1131 82815/EM/EP/P 815/EM/EP/P (Solano) PCI to AGP Bridge
- 1132 82815/EM/EP/P 815/EM/EP/P (Solano) Interal GUI Accelerator
- 1161 82806AA PCI64 Hub Advanced Programmable Interrupt Controller
- 1162 BECC XScale 80200 Companion Chip (FPGA by ADI Engineering Inc)
- 1179 Dual Port Gigabit Ethernet Controller (82546EB)
- 1200 Network Processor (IXP1200)
- 1209 Fast Ethernet Controller (8255xER/IT)
- 1221 82092AA PCI to PCMCIA Bridge
- 1222 82092AA EIDE Controller
- 1223 Video Controller (SAA 7116 H)
- 1225 82452KX/GX Orion Extended Express Processor to PCI Bridge
- 1226 82596 EtherExpress PRO/10
- 1227 LAN Controller with 82562EM/EX PHYPCI (82801db ich4)
- 1228 Intelligent 10/100 Fast Ethernet Adapter (EE PRO/100 Smart)
- 1229 82550/1/7/8/9 EtherExpress PRO/100(B) Ethernet Adapter
- 122D 82437FX 430FX (Triton) Cache/DRAM Controller
- 122E PCI to ISA Bridge (Triton) (82371FB)
- 1230 82338/82371FB PIIX PCI EIDE Controller
- 1231 DSVD Modem
- 1234 82371MX 430MX Mobile Chipset MPIIX + EIDE + I/O
- 1235 82437MX 430MX Mobile Chipset System Controller
- 1237 82440/1FX 440FX (Natoma) System Controller
- 1239 82371FB 430FX PCI EIDE Controller
- 123B PCI to PCI Docking Bridge (82380PB)
- 123C Mobile PCI-to-ISA Bridge (MISA) (82380AB)
- 123D Programmable Interrupt Device (683053)
- 123E 82466GX Integrated Hot-Plug Controller ("Hidden" mode)
- 123F Integrated Hot-Plug Controller (IHPC) (82466GX)
- 1240 Intel752 AGP Graphics Accelerator
- 124B 82380FB 380FB Mobile Chipset PCI Bridge
- 1250 System Controller (TXC) (82430HX)
- 12D8 SIGMATEL STAC 92XX C-Major HD Audio (92XX)
- 1360 Hub Interface to PCI Bridge (82806AA)
- 1361 82806AA PCI64 Hub Controller (HRes), APIC
- 1460 82870P2 P64H2 PCI/PCI-X Hub Controller
- 1461 P64H2 I/O Advanced Programmable Interrupt Controller
- 1462 82870P2 P64H2 PCI/PCI-X Hot Plug Controller
- 1960 i960RP Microprocessor (80960RP)
- 1962 Windows 2003 Server Promise SuperTrak SX6000 (tm) IDE RAID Controller
- 1A10 Celeron(tm) Processor to I/O Controller
- 1A11 Celeron(tm) Processor to I/O Controller
- 1A12 Eicon DIVA Server Voice PRI 2.0 (PCI)
- 1A13 Eicon DIVA Server Voice PRI 2.0 (PCI)
- 1A20 82840 840 (Carmel) Chipset
- 1A21 82840 840 (Carmel) Chipset Host to I/O Hub Bridge (Dual CPU)
- 1A22 82840 840 (Carmel) Chipset Host to I/O Hub Bridge (Quad CPU)
- 1A23 82840 840 (Carmel) Chipset PCI to AGP Bridge
- 1A24 82840 840 (Carmel) Chipset PCI Bridge (Hub B)
- 1A30 Host-Hub Interface Bridge (82845G[GL/GV/GE/PE])
- 1A31 82845/E/MP/MZ Brookdale CPU to AGP Bridge
- 1A38 5000 Series Chipset DMA Engine (5000P)
- 1A48 82597-based 10 Gigabit Adapter
- 1B48 82597-based 10 Gigabit Adapter
- 2125 AC97 Audio Controller. website to download - http://www.intel.com/design/chipsets/manuals/29802801.p (82801AA)
- 2406 AC97 Modem Controller / PCI Modem (82801 / ?)
- 2410 82801AA 8xx Chipset LPC Interface Bridge
- 2411 IDE Controller (UltraATA/66) (82801AA)
- 2412 82801AA 8xx Chipset USB Controllers
- 2413 82801AA 8xx Chipset SMBus Controller
- 2415 Aureal (AD1881 SOUNDMAX) Placa Me Asaki P3-141 (Intel 82801DBM SM/BUS Controller 24C3)
- 2416 82801AA 8xx Chipset AC'97 PCI Modem
- 2418 82801AA 8xx Chipset Hub to PCI Bridge
- 2420 82801AB 8xx Chipset LPC Interface Bridge
- 2421 IDE Controller (UltraATA/33) (82801AB)
- 2422 82801AB 8xx Chipset USB Controller
- 2423 82801AB 8xx Chipset SMBus Controller
- 2425 82801AB 8xx Chipset AC'97 Audio Controller
- 2426 82801AB 8xx Chipset AC'97 PCI Modem
- 2428 82801AB 8xx Chipset Hub to PCI Bridge
- 2431 pci bus (82810)
- 2440 82801BA (ICH2) LPC Interface Controller
- 2441 82801BA (ICH2) UltraATA/66 EIDE Controller
- 2442 82801BA/BAM (ICH2/ICH2-M) USB Universal Host Controller
- 2443 82801BA/BAM (ICH2/ICH2-M) SMBus Controller
- 2444 82801BA/BAM (ICH2/ICH2-M) USB Universal Host Controller
- 2445 82801BA/BAM (ICH2/ICH2-M) AC'97 Audio Controller
- 2446 82801BA/BAM (ICH2/ICH2-M) AC'97 Modem Controller
- 2448 82801 Family (ICH2/3/4/5/6/7/8/9-M) Hub Interface to PCI Bridge
- 2449 82559ER Integrated 10Base-T/100Base-TX Ethernet Controller (82559ER)
- 244A 82801BAM (ICH2-M) UltraATA/100 IDE Controller
- 244B 82801BA (ICH2) UltraATA/100 IDE Controller
- 244C 82801BAM (ICH2-M) LPC Interface Controller
- 244E 82801 Family (ICH2/3/4/5/6/7/8/9,63xxESB) Hub Interface to PCI Bridge
- 2450 82801E PCI to ISA Bridge (LPC Bridge)
- 2452 USB Controller (82801E)
- 2453 SMBus Controller (82801E)
- 2459 82562 based Fast Ethernet Connection
- 245B IDE Controller (82801E)
- 245D 82562 based Fast Ethernet Connection
- 245E Hub Interface to PCI Bridge (82801E)
- 2480 82801CA/CAM (ICH3-S/ICH3-M) LPC Interface
- 2481 82801CA (ICH3-S/ICH3-M) UltraATA/66 IDE Controller
- 2482 82801CA/CAM (ICH3-S/ICH3-M) USB Controller *1
- 2483 82801CA/CAM (ICH3-S/ICH3-M) SMBus Controller
- 2484 82801CA/CAM (ICH3-S/ICH3-M) USB Controller *2
- 2485 82801CA/CAM (ICH3-S/ICH3-M) AC'97 Audio Controller
- 2486 82801CA/CAM (ICH3-S/ICH3-M) AC'97 Modem Controller
- 2487 82801CA/CAM USB Controller *3 (ICH3-S/ICH3-M)
- 248A 82801CAM (ICH3-M) UltraATA/100 EIDE Controller
- 248B 82801CA (ICH3) UltraATA/100 EIDE Controller
- 248C LPC Interface or ISA bridge: see Notes (82801CAM)
- 248D 82801(??) USB 2.0 Enhanced Host Controller w/HCReset Disabled
- 24C0 82801DB/DBL (ICH4/ICH4-L) LPC Interface Bridge
- 24C1 82801DBL (ICH4-L) IDE Controller
- 24C2 82801DB/DBL/DBM (ICH4/ICH4-L/ICH4-M) USB UHCI Controller *1
- 24C3 82801DB/DBL/DBM (ICH4/ICH4-L/ICH4-M) SMBus Controller
- 24C4 82801DB/DBL/DBM (ICH4/ICH4-L/ICH4-M) USB UHCI Controller *2
- 24C5 Realtek AC97 Audio (82801DBM SoundMAXController (ICH4-M B0 step))
- 24C6 82801DB/DBL/DBM (ICH4/ICH4-L/ICH4-M) AC'97 Modem Controller
- 24C7 82801DB/DBL/DBM (ICH4/ICH4-L/ICH4-M) USB UHCI Controller *3
- 24CA 82801DBM (ICH4-M) UltraATA/100 EIDE Controller
- 24CB 82801DB/DBL (ICH4/ICH4-L) UltraATA/100 EIDE Controller
- 24CC 82801DBM (ICH4-M) LPC Interface Bridge
- 24CD 82801DB/DBL/DBM (ICH4/ICH4-L/ICH4-M) USB 2.0 EHCI Controller
- 24D0 82801EB/ER (ICH5/ICH5R) LPC Interface Bridge
- 24D1 82801EB (ICH5) SATA Controller
- 24D2 82801EB/ER (ICH5/ICH5R) USB UHCI Controller *1
- 24D3 82801EB/ER (ICH5/ICH5R) SMBus Controller
- 24D4 82801EB/ER (ICH5/ICH5R) USB UHCI Controller *2
- 24D5 ADI SoundMAX Audio Device Driver, Version 5.12.1.3622 for the Microsoft Windows XP Operating Sys (8086)
- 24D6 82801EB/ER (ICH5/ICH5R) AC'97 Modem Controller
- 24D7 82801EB/ER (ICH5/ICH5R) USB UHCI Controller *3
- 24DB 82801EB/ER (ICH5/ICH5R) EIDE Controller
- 24DC LPC Interface Controller (82801EB)
- 24DD 82801EB/ER (ICH5/ICH5R) USB 2.0 EHCI Controller
- 24DE 82801EB/ER (ICH5/ICH5R) USB UHCI Controller *4
- 24DF SATA Controller (RAID) (82801ER)
- 2500 Host-Hub Interface Bridge / DRAM Ctrlr (82820)
- 2501 82820 820 (Camino) Chipset Host Bridge (MCH) (UP Only)
- 2502 82820
- 2503 82820
- 2504 82820
- 250B 82820 820 (Camino) Chipset CPU Host Bridge (MCH) (RDRAM Only)
- 250F 82820 820 (Camino) Chipset PCI to AGP Bridge
- 2520 Memory Translator Hub (MTH) (82805AA)
- 2521 Memory Repeater Hub for SDRAM (MRH-S) (82804AA)
- 2530 Host-Hub Interface Bridge(A2 step) (82850/E)
- 2531 82860 (860) CPU to I/O Hub Bridge (Interface A)
- 2532 AGP Bridge (82850/850E/860)
- 2533 82860 (860) PCI Bridge (Hub Interface B)
- 2534 82860 (860) PCI Bridge (Hub Interface C)
- 2535 82860 (860) PCI Bridge
- 2536 82860 (860) PCI Bridge
- 2537 82850/82860 (850/860) ??? Controller
- 2539 (Quad Processor mode) (82860)
- 2540 E7500 System Controller (MCH, Hub Interface A)
- 2541 E7500 System Controller (MCH, Hub Interface A) Error Reporter
- 2543 HI_B Virtual PCI-to-PCI Bridge (E7500/E7501)
- 2544 HI_B PCI-to-PCI Bridge Error Reporting (E7500/E7501)
- 2545 HI_C Virtual PCI-to-PCI Bridge (E7500/E7501)
- 2546 HI_C PCI-to-PCI Bridge Error Reporting (E7500/E7501)
- 2547 HI_D Virtual PCI-to-PCI Bridge (E7500/E7501)
- 2548 HI_D PCI-to-PCI Bridge Error Reporting (E7500/E7501)
- 254C Host Controller (E7501)
- 2550 Host Controller (E7505)
- 2551 E7205/E7505 Host RAS Controller
- 2552 PCI-to-AGP Bridge (E7205/E7505)
- 2553 Hub Interface_B PCI-to-PCI Bridge (E7505)
- 2554 E7505 Hub Interface_B PCI to PCI Bridge Error Reporing
- 255D Host Controller (E7205)
- 2560 DRAM Controller / Host-Hub I/F Bridge (82845G/GL/GV/GE/PE)
- 2561 82845G/GL/GV/GE/PE Brookdale Host to AGP Bridge
- 2562 82845G/GL/GV/GE/PE Integrated Graphics Device
- 2570 DRAM Controller / Host-Hub Interface (82865G/PE/P, 82848P)
- 2571 PCI-to-AGP Bridge (82865G/PE/P, 82848P)
- 2572 Integrated Graphics Device (82865G)
- 2573 PCI-to-CSA Bridge (82865G/PE/P, 82848P)
- 2576 Overflow Configuration (82865G/PE/P, 82848P)
- 2578 DRAM Controller / Host-Hub Interface (82875P/E7210)
- 2579 PCI-to-AGP Bridge (82875P)
- 257A ?
- 257B PCI to CSA Bridge (82875P/E7210)
- 257E 82875P,E7210 PCU to I/O Memory Controller (Overflow Configuration)
- 2580 82915G/GV/GL/P/PL/GL/910GE/GL Grantsdale Host Bridge/DRAM Controller
- 2581 82915G/GV/GL/P/PL/GL/910GE/GL Grantsdale Host-PCIe Graphics Bridge
- 2582 82915G/GV/GL, 82910GL Integrated Graphics Device
- 2584 Host Bridge / DRAM Controller (82925X/XE)
- 2585 82925X/XE Host-PCIe Graphics Bridge
- 2588 Host Bridge/DRAM Controller (E7221)
- 2589 E7220/E7221 PCIe Root Port
- 258A E7221 Integrated Graphics Controller
- 2590 Mobile Intel(R) 915GM/PM/GMS/910GML Express Processor to DRAM Controller (915GM)
- 2591 82915PM/GM PCIe Graphics Port
- 2592 82915GM/GMS, 82910GML Integrated Graphics Device
- 25A1 6300ESB LPC Inteface Controller
- 25A2 IDE Controller (6300ESB)
- 25A3 6300ESB Serial ATA Controller
- 25A4 SMBus Controller (6300ESB)
- 25A6 AC'97 Audio Controller (6300ESB)
- 25A7 AC'97 Modem Controller (6300ESB)
- 25A9 USB 1.1 UHCI Controller *1 (6300ESB)
- 25AA USB 1.1 UHCI Controller *2 (6300ESB)
- 25AB Watchdog Timer (6300ESB)
- 25AC 6300ESB I/O Advanced Programmable Interrupt Controller
- 25AD USB 2.0 EHCI Controller (6300ESB)
- 25AE Hub Interface to PCI-X Bridge (6300ESB)
- 25B0 Serial ATA Controller (RAID mode) (6300ESB)
- 25C0 5000X Chipset Memory Controller Hub
- 25D0 5000Z Chipset Memory Controller Hub
- 25D4 5000V Chipset Memory Controller Hub
- 25D8 5000P Chipset Memory Controller Hub
- 25E2 5000 Series Chipset PCIe x4 Port 2
- 25E3 5000 Series Chipset PCIe x4 Port 3
- 25E4 5000 Series Chipset PCIe x4 Port 4
- 25E5 5000 Series Chipset PCIe x4 Port 5
- 25E6 5000 Series Chipset PCIe x4 Port 6
- 25E7 5000 Series Chipset PCIe x4 Port 7
- 25E8 5000 Series Chipset AMB Memory Mapped Registers
- 25F0 5000 Series Chipset Error Reporting Registers
- 25F1 5000 Series Chipset Reserved Registers
- 25F3 5000 Series Chipset Reserved Registers
- 25F5 5000 Series Chipset FBD Registers
- 25F6 5000 Series Chipset FBD Registers
- 25F7 5000 Series Chipset PCIe x8 Port 2-3
- 25F8 5000 Series Chipset PCIe x8 Port 4-5
- 25F9 5000 Series Chipset PCIe x8 Port 6-7
- 25FA 5000X Chipset PCIe x16 Port 4-7
- 2600 E8500/E8501 Hub Interface 1.5
- 2601 E8500/E8501 PCIe x4 Port D
- 2602 E8500/E8501 PCIe x4 Port C0
- 2603 E8500/E8501 PCIe x4 Port C1
- 2604 E8500/E8501 PCIe x4 Port B0
- 2605 E8500/E8501 PCIe x4 Port B1
- 2606 E8500/E8501 PCIe x4 Port A0
- 2607 E8500/E8501 PCIe x4 Port A1
- 2608 E8500/E8501 PCIe x8 Port C
- 2609 E8500/E8501 PCIe x8 Port B
- 260A E8500/E8501 PCIe x8 Port A
- 260C E8500/E8501 IMI Registers
- 2610 E8500/E8501 Front Side Bus, Boot and Interrupt Registers
- 2611 E8500/E8501 Address Mapping Registers
- 2612 E8500/E8501 RAS Registers
- 2613 E8500/E8501 Miscellaneous Registers
- 2614 E8500/E8501 Miscellaneous Registers
- 2615 E8500/E8501 Miscellaneous Registers
- 2617 E8500/E8501 Debug Registers
- 2618 E8500/E8501 Debug Registers
- 2619 E8500/E8501 Debug Registers
- 261A E8500/E8501 Debug Registers
- 261B E8500/E8501 Debug Registers
- 261C E8500/E8501 Debug Registers
- 261D E8500/E8501 Debug Registers
- 261E E8500/E8501 Debug Registers
- 2620 E8500/E8501 XMB A/B/C/D Identification Registers
- 2621 E8500/E8501 XMB A/B/C/D Miscellaneous Registers
- 2622 E8500/E8501 XMB A/B/C/D Memory Interleaving Registers
- 2623 E8500/E8501 XMB A/B/C/D DDR Initialization and Calibration Registers
- 2624 E8500/E8501 XMB A/B/C/D Reserved
- 2625 E8500/E8501 XMB A/B/C/D Reserved
- 2626 E8500/E8501 XMB A/B/C/D Reserved
- 2627 E8500/E8501 XMB A/B/C/D Reserved
- 2640 82801FB/FR (ICH6/ICH6R) LPC Interface Bridge
- 2641 LPC Interface Bridge (ICH6-M) (82801FBM)
- 2642 82801FW/FRW (ICH6W/ICH6RW) LPC Interface Bridge
- 2651 82801FB (ICH6) SATA Controller
- 2652 82801FR/FRW (ICH6R/ICH6RW) SATA Controller
- 2653 82801FBM (ICH6M) SATA Controller
- 2658 USB UHCI Controller *1 (82801FB/FR/FW/FRW)
- 2659 USB UHCI Controller *2 (82801FB/FR/FW/FRW)
- 265A USB UHCI Controller *3 (82801FB/FR/FW/FRW)
- 265B USB UHCI Controller *4 (82801FB/FR/FW/FRW)
- 265C USB 2.0 EHCI Controller (82801FB/FR/FW/FRW)
- 2660 PCI Express Port 1 (82801FB/FR/FW/FRW)
- 2662 PCI Express Port 2 (82801FB/FR/FW/FRW)
- 2664 82801FB (ICH6) PCIe Root Port 3
- 2666 PCI Express Port 4 (82801FB/FR/FW/FRW)
- 2668 82801FB (ICH6) High Definition Audio Controller
- 2669 jkn (2028026)
- 266A 82801FB (ICH6) SMBus Controller
- 266C LAN Controller (82801FB/FR/FW/FRW)
- 266D hp/Compal - http://service.marasst.com/Compal/DL75/HDL75%20driver%20Ver%2002/Modem.zip (czc82809kr)
- 266E VIA AC97 codec incorporated into VT82C686A/B, VT8231, VT8233/A/C, VT8235, VT8237/R, VT8251 Southbrid (VIA Technologies Vinyl AC'97 Codec Combo Driver (W)
- 266F PATA100 Controller - 266F (82801FB/FBM/FW/FR/FRW)
- 2670 LPC Interface Controller (631xESB/6321ESB/3100 )
- 2680 631xESB/632xESB/3100 Serial ATA Storage Controller
- 2681 LSI LOGIC, 62089A2, LSISAS1068 B0, T 0620, WE 119200.1 (62089A2)
- 2682 Enterprise Southbridge SATA cc=RAID
- 2683 Enterprise Southbridge SATA cc=RAID
- 2688 631xESB/632xESB/3100 Chipset USB Universal Host Controller *1
- 2689 631xESB/632xESB/3100 Chipset USB Universal Host Controller *2
- 268A 631xESB/632xESB/3100 Chipset USB Universal Host Controller *3
- 268B 631xESB/632xESB/3100 Chipset USB Universal Host Controller *4
- 268C 631xESB/632xESB/3100 Chipset USB2 Enhanced Host Controller
- 2690 631xESB/632xESB/3100 PCIe Root Port 1
- 2692 631xESB/632xESB/3100 PCIe Root Port 2
- 2694 631xESB/632xESB/3100 PCIe Root Port 3
- 2696 631xESB/632xESB/3100 PCIe Root Port 4
- 2698 Enterprise Southbridge AC'97 Audio
- 2699 Enterprise Southbridge AC'97 Modem
- 269A Enterprise Southbridge High Definition Audio
- 269B SMBus Controller (631xESB/6321ESB/3100)
- 269E 631xESB/632xESB/3100 Ultra ATA Storage Controller
- 2770 Host Bridge/DRAM Controller (82945G/GZ/P/PL)
- 2771 Host to PCI Express Bridge (82945G/GZ/P/PL)
- 2772 Integrated Graphics Device (82945G/GZ)
- 2774 82955X Memory Controller Hub
- 2775 82955X PCIe Root Port
- 2776 82945G Integrated Graphics Controller
- 2778 E7230/3000/3010 Processor to I/O Controller
- 2779 E7230/3000/3010 PCIe Root Port
- 277A 82975X PCIe Root Port
- 277C Intel 975X Express Chipset (82975X)
- 277D 82975X PCIe Root Port
- 2780 82915G/GV/GL, 82910GL Integrated Graphics Device (Secondary) (??)
- 2782 Graphics device: 82915G/GV/910GL Express Chipset Family (82915G)
- 2790 82915GM/GMS, 82910GML Integrated Graphics Device (Secondary) (??)
- 2792 Mobile Intel(R) 915GM/GMS/, 910GML Express Chipset Family (Mobile 82915GLx/x/x)
- 27A0 955XM/945GM/PM/GMS/940GML Express Processor to DRAM Controller
- 27A1 955XM/945GM/PM/GMS/940GML Express PCIe Root Port
- 27A2 Mobile 945GM/GU Express Integrated Graphics Controller
- 27A3 Intel Hardware Monitoring (Found on Apple Mac Family Computers)
- 27A6 Mobile 945GM/GU Express Integrated Graphics Controller
- 27AC Mobile 945GME Express Processor to DRAM Controller
- 27AD Mobile 945GME Express PCI Express Root Port
- 27AE Mobile 945 Express Chipset Family
- 27B0 82801GH (ICH7DH) LPC Interface Controller
- 27B1 82801GBM (ICH7) LPC Interface Controller
- 27B8 Intel 82801GB/GR (ICH7 Family) LPC Interface Controller - 27B8 (945GL)
- 27B9 82801GBM (ICH7-M) LPC Interface Controller
- 27BD 82801GHM (ICH7-M DH) LPC Interface Controller
- 27C0 82801GB/GR/GH (ICH7 Family) Serial ATA Storage Controller
- 27C1 82801GB I/O Controller Hub SATA cc=AHCI
- 27C3 82801GB I/O Controller Hub SATA cc=RAID
- 27C4 82801GBM/GHM (ICH7-M Family) Serial ATA Storage Controller
- 27C5 82801GB Mobile I/O Controller Hub SATA cc=AHCI
- 27C6 82801G (ICH7 Family) Serial ATA Storage Controller (RAID)
- 27C8 82801G (ICH7 Family) USB Universal Host Controller
- 27C9 82801G (ICH7 Family) USB Universal Host Controller
- 27CA 82801G (ICH7 Family) USB Universal Host Controller
- 27CB 82801G (ICH7 Family) USB Universal Host Controller
- 27CC 82801G (ICH7 Family) USB 2.0 Enhanced Host Controller
- 27D0 82801G (ICH7 Family) PCIe Root Port
- 27D2 82801G (ICH7 Family) PCIe Root Port
- 27D4 82801G (ICH7 Family) PCIe Root Port
- 27D6 82801G (ICH7 Family) PCIe Root Port
- 27D8 IDT High Definition Audio Driver (BA101897)
- 27DA Intel[R] 82801G (ICH7 Family) C- 27DA (82801G)
- 27DC Intel PRO/100 VE Desktop Adapter (GF)
- 27DD 82801GB I/O Controller Hub AC'97 Modem
- 27DE 82801GB I/O Controller Hub AC'97 Audio
- 27DF 82801G (ICH7 Family) Ultra ATA Storage Controller
- 27E0 82801GR/GH/GHM (ICH7 Family) PCIe Root Port
- 27E2 82801GR/GH/GHM (ICH7 Family) PCIe Root Port
- 2802 INTEL(R) HIGH DEFINITION AUDIO HDMI (8086)
- 2810 82801HB/HR (ICH8/R) LPC Interface Controller
- 2811 82801HBM (ICH8M) LPC Interface Controller
- 2812 82801HH (ICH8DH) LPC Interface Controller
- 2814 82801HO (ICH8DO) LPC Interface Controller
- 2815 82801HEM (ICH8M-E) LPC Interface Controller
- 2820 SATA IDE Controller:4 port (82801HB/HR/HH/HO)
- 2821 82801 (ICH8R) SATA AHCI Controller
- 2822 Raid Controller (82801HR/HH/HO&82801IR/IH/IO(AIE=0)/ICH10R)
- 2824 82801HR/HO/HH (ICH8R/DO/DH) SATA AHCI Controller
- 2825 82801H (ICH8 Family) 2 port SATA Controller
- 2828 82801 (ICH8M) 3 port SATA Controller
- 2829 Mobile SATA AHCI Controller
- 282A Raid Controller (ICH8ME/9ME)
- 2830 82801H (ICH8 Family) USB UHCI *1
- 2831 82801H (ICH8 Family) USB UHCI *2
- 2832 82801H (ICH8 Family) USB UHCI *3
- 2834 82801H (ICH8 Family) USB UHCI *4
- 2835 82801H (ICH8 Family) USB UHCI *5
- 2836 82801H (ICH8 Family) USB2 EHCI *1
- 283A ICH8 Enhanced USB2 Enhanced Host Controller (81EC1043 (?))
- 283E SM Bus Controller (PCIVEN_8086&DEV_283E&SUBSYS_FF641179&REV_033&B1B)
- 283F 82801H (ICH8 Family) PCIe Port 1
- 2841 82801H (ICH8 Family) PCIe Port 2
- 2843 82801H (ICH8 Family) PCIe Port 3
- 2845 82801H (ICH8 Family) PCIe Port 4
- 2847 82801H (ICH8 Family) PCIe Port 5
- 2849 82801H (ICH8 Family) PCIe Port 6
- 284B Intel audio controller embedded with the 82801H chipset ( ICH8 chipset ) (82801H)
- 284F 82801H (ICH8 Family) Thermal Reporting Device
- 2850 82801H (ICH8 Family) Ultra ATA Storage Controllers
- 28B4 Management Engine Interface
- 28C4 Management Engine Interface
- 28D4 Management Engine Interface
- 28E4 Management Engine Interface
- 28F4 Management Engine Interface
- 2910 82801IB/IR/IH (ICH9 Family) LPC Interface Controller
- 2911 82801IB/IR/IH (ICH9 Family) Mobile LPC Interface Controller
- 2912 82801IH (ICH9DH) LPC Interface Controller
- 2913 82801IB/IR/IH (ICH9 Family) MDH LPC Interface Controller
- 2914 82801IB/IR/IH (ICH9 Family) DO LPC Interface Controller
- 2915 82801IB/IR/IH (ICH9 Family) MDO LPC Interface Controller
- 2916 82801IR (ICH9R) LPC Interface Controller
- 2917 ICH9M-E LPC Interface Controller
- 2918 82801IB (ICH9) LPC Interface Controller
- 2919 ICH9M LPC Interface Controller
- 2920 82801IB/IR/IH (ICH9 Family) 4 port Serial ATA Storage Controller 1
- 2921 82801IB/IR/IH (ICH9 Family) 2 port Serial ATA Storage Controller 1
- 2922 82801IB/IR/IH (ICH9 Family) 6 port SATA AHCI Controller
- 2923 82801IB/IR/IH (ICH9 Family) 4 port SATA AHCI Controller
- 2925 82801IB/IR/IH (ICH9 Family) SATA RAID Controller
- 2926 82801IB/IR/IH (ICH9 Family) 2 port Serial ATA Storage Controller 2
- 2928 82801IB/IR/IH (ICH9 Family) Mobile 2 port Serial ATA Storage Controller 1
- 2929 82801IB/IR/IH (ICH9 Family) Mobile SATA AHCI Controller
- 292C 82801IB/IR/IH (ICH9 Family) Mobile SATA RAID Controller
- 292D 82801IB/IR/IH (ICH9 Family) Mobile 2 port Serial ATA Storage Controller 2
- 292E 82801IB/IR/IH (ICH9 Family) Mobile 1 port Serial ATA Storage Controller 2
- 2930 Intel(R) ICH9 Family SMBus Controller working fine with http://download.cnet.com/Chipset-Driver-Inte (8086)
- 2932 82801IB/IR/IH (ICH9 Family) Thermal Subsystem
- 2934 82801IB/IR/IH (ICH9 Family) USB Universal Host Controller
- 2935 82801IB/IR/IH (ICH9 Family) USB Universal Host Controller
- 2936 82801IB/IR/IH (ICH9 Family) USB Universal Host Controller
- 2937 82801IB/IR/IH (ICH9 Family) USB Universal Host Controller
- 2938 82801IB/IR/IH (ICH9 Family) USB Universal Host Controller
- 2939 82801IB/IR/IH (ICH9 Family) USB Universal Host Controller
- 293A 82801IB/IR/IH (ICH9 Family) USB2 Enhanced Host Controller
- 293B 82801IB/IR/IH (ICH9 Family) USB2 Enhanced Host Controller
- 293C 82801IB/IR/IH (ICH9 Family) USB2 Enhanced Host Controller
- 293D 82801IB/IR/IH (ICH9 Family) USB2 Enhanced Host Controller
- 293E 82801IB/IR/IH (ICH9 Family) HD Audio Controller
- 2940 82801IB/IR/IH (ICH9 Family) PCIe Root Port 1
- 2941 82801IB/IR/IH (ICH9 Family) PCIe Root Port 1
- 2942 82801IB/IR/IH (ICH9 Family) PCIe Root Port 2
- 2943 82801IB/IR/IH (ICH9 Family) PCIe Root Port 2
- 2944 82801IB/IR/IH (ICH9 Family) PCIe Root Port 3
- 2945 82801IB/IR/IH (ICH9 Family) PCIe Root Port 3
- 2946 82801IB/IR/IH (ICH9 Family) PCIe Root Port 4
- 2947 82801IB/IR/IH (ICH9 Family) PCIe Root Port 4
- 2948 82801IB/IR/IH (ICH9 Family) PCIe Root Port 5
- 2949 82801IB/IR/IH (ICH9 Family) PCIe Root Port 5
- 294A 82801IB/IR/IH (ICH9 Family) PCIe Root Port 6
- 294B 82801IB/IR/IH (ICH9 Family) PCIe Root Port 6
- 294C Intel(R) 82566DC-2 Gigabit Network Connection (82566DC-2)
- 2970 946GZ/PL/GL Processor to I/O Controller
- 2971 946GZ/PL/GL PCIe Root Port
- 2972 Onboard Video Device for 82946GZ chips (82946GZ )
- 2973 946GZ/GL Integrated Graphics Controller
- 2974 946GZ/GL HECI Controller
- 2975 946GZ/GL HECI Controller
- 2976 946GZ/GL PT IDER Controller
- 2977 946GZ/GL KT Controller
- 2980 Processor to I/O Controller
- 2981 PCIe Root Port
- 2982 G965 Graphics Media Accelerator
- 2983 G965 Graphics Media Accelerator
- 2984 82G35 Express HECI Controller
- 2987 Active Management Technology - SOL
- 2990 Q963/Q965 Memory Controller Hub
- 2991 Q963/Q965 PCIe Root Port
- 2992 Intel(R) Express Chipset video (Q965/Q963)
- 2993 Q963/Q965 Integrated Graphics Controller
- 2994 intel management engine interface (0x8086)
- 2995 Q963/Q965 HECI Controller
- 2996 Q963/Q965 PT IDER Controller
- 2997 Intel PCI Serial Port (Q965/Q963)
- 29A0 Intel P965/G965 Processor to I/O Controller (?(82P965))
- 29A1 Intel P965/G965 PCI Express Root Port (?(82Q965, 82G965, 82P965))
- 29A2 G965 Integrated Graphics Controller
- 29A3 G965 Integrated Graphics Controller
- 29A4 The Intel Management Engine provides thermal management for Intel Desktop Boards. (Intel DG965SS)
- 29A5 P965/G965 HECI Controller
- 29A6 P965/G965 PT IDER Controller
- 29A7 P965/G965 KT Controller
- 29B0 Q35 (??) DRAM Controller
- 29B1 Q35 (??) PCIe Root Port
- 29B2 Intel(R) Q35 Express Chipset Family (Q35)
- 29B3 Q35 (??) Integrated Graphics Controller
- 29B4 Intel(R) Management Engine Interface (HECI) (Q35-Chipset)
- 29B5 Q35 (??) HECI Controller
- 29B6 Q35 (??) PT IDER Controller
- 29B7 Q35 (??) Serial KT Controller
- 29C0 P35/G33 (Bearlake) Processor to I/O Controller
- 29C1 P35/G33 (Bearlake) PCIe Root Port
- 29C2 P35/G33 (Bearlake) Integrated Graphics Controller
- 29C3 P35/G33 (Bearlake) Integrated Graphics Controller
- 29C4 Intel ME: Management Engine Interface (Intel DG33fb)
- 29C5 P35/G33 (Bearlake) HECI Controller
- 29C6 P35/G33 (Bearlake) PT IDER Controller
- 29C7 P35/G33 (Bearlake) Serial KT Controller
- 29CF P35/G33 (Bearlake) Virtual HECI Controller
- 29D0 Q33 (Bearlake) Processor to I/O Controller
- 29D1 Q33 (Bearlake) PCIe Root Port
- 29D2 Q33 (Bearlake) Integrated Graphics Controller
- 29D3 Q33 (Bearlake) Integrated Graphics Controller
- 29D4 Intel Management Interface (82801)
- 29D5 Q33 (Bearlake) HECI Controller
- 29D6 Q33 (Bearlake) PT IDER Controller
- 29D7 Q33 (Bearlake) Serial KT Controller
- 29E0 X38/X48 (Bearlake) Processor to I/O Controller
- 29E1 X38/X48 (Bearlake) PCIe Root Port 1
- 29E4 X38/X48 (Bearlake) HECI Controller
- 29E5 X38/X48 (Bearlake) HECI Controller
- 29E6 X38/X48 (Bearlake) PT IDER Controller
- 29E7 X38/X48 (Bearlake) Serial KT Controller
- 29E9 X38/X48 (Bearlake) PCIe Root Port 2
- 29F0 3200 Chipset (Bearlake) Processor to I/O Controller
- 29F1 3200 Chipset (Bearlake) PCIe Root Port 1
- 29F4 3200 Chipset (Bearlake) Server HECI Controller
- 29F5 3200 Chipset (Bearlake) Server HECI Controller
- 29F6 3200 Chipset (Bearlake) Server PT IDER Controller
- 29F7 3200 Chipset (Bearlake) Server Serial KT Controller
- 29F9 3200 Chipset (Bearlake) PCIe Root Port 2
- 2A00 Mobile PM965/GM965/GL960 Express Processor to DRAM Controller
- 2A01 Mobile PM965/GM965/GL960 Express PCIe Root Port
- 2A02 Mobile 965 Express Integrated Graphics Controller
- 2A03 Mobile 965 Express Integrated Graphics Controller
- 2A04 Intel PCI communication controller (Q965/Q96)
- 2A05 Mobile HECI Controller
- 2A06 Mobile PT IDER Controller
- 2A07 Intel PCI Serial Port (Q965/Q963)
- 2A08 Intel(R) Extended Thermal Model MCH (Q965 Chipset)
- 2A10 Mobile GME965/GLE960 Express Processor to DRAM Controller
- 2A11 Mobile GME965/GLE960 Express PCI Express Root Port
- 2A12 Mobile 965 Express Chipset Family
- 2A13 Mobile 965 Express Chipset Family
- 2A14 Mobile GME965/GLE960 MEI Controller
- 2A15 Mobile GME965/GLE960 MEI Controller
- 2A16 Mobile GME965/GLE960 PT IDER Controller
- 2A17 Mobile GME965/GLE960 KT Controller
- 2A40 Mobile Memory Controller Hub
- 2A41 Mobile PCI Express Graphics Port
- 2A42 Intel Mobile Graphic (Mobile Intel 4 Series Chipset Family)
- 2A43 Intel Mobile Graphic (Mobile Intel 4 Series Chipset Family)
- 2A44 Intel Management Engine Interface (Mobile 4 Series Chipset)
- 2A47 Active Management Technology - SOL (20EC17AA)
- 2A50 Mobile MEI Controller
- 2A51 Mobile MEI Controller
- 2A52 Mobile PT IDER Controller
- 2A53 Mobile AMT SOL Redirection
- 2C01 QuickPath Architecture System Address Decoder
- 2C10 QuickPath Interconnect Link 0
- 2C11 QuickPath Interconnect Physical 0
- 2C14 QuickPath Interconnect Link 1
- 2C18 QuickPath Memory Controller
- 2C19 QuickPath Memory Controller Target Address Decoder
- 2C1A QuickPath Memory Controller RAS Registers
- 2C1C QuickPath Memory Controller Test Registers
- 2C20 QuickPath Memory Controller Channel 0 Control Registers
- 2C21 QuickPath Memory Controller Channel 0 Address Registers
- 2C22 QuickPath Memory Controller Channel 0 Rank Registers
- 2C23 QuickPath Memory Controller Channel 0 Thermal Control Registers
- 2C28 QuickPath Memory Controller Channel 1 Control Registers
- 2C29 QuickPath Memory Controller Channel 1 Address Registers
- 2C2A QuickPath Memory Controller Channel 1 Rank Registers
- 2C2B QuickPath Memory Controller Channel 1 Thermal Control Registers
- 2C30 QuickPath Memory Controller Channel 2 Control Registers
- 2C31 QuickPath Memory Controller Channel 2 Address Registers
- 2C32 QuickPath Memory Controller Channel 2 Rank Registers
- 2C33 QuickPath Memory Controller Channel 2 Thermal Control Registers
- 2C40 QuickPath Architecture Generic Non-Core Registers
- 2E00 DRAM Controller
- 2E01 PCI Express Root Port
- 2E02 Integrated Graphics Controller
- 2E03 Integrated Graphics Controller
- 2E04 HECI Controller
- 2E05 HECI Controller
- 2E06 PT IDER Controller
- 2E07 Serial KT Controller
- 2E14 Intel Active Client Manager HECI Device (PCIVEN_8086&DEV_2E14&SUBSYS_3035103C&REV_03B1B68)
- 2E17 Intel PCI Serial Port (CC_0700)
- 2E24 Intel Management Engine Interface (PCIVEN_8086&DEV_2E24&SUBSYS_028A1028&REV_03)
- 2E32 Intel G41 express graphics (PCIVEN_8086&DEV_2E32&SUBSYS_31031565&REV_033&115)
- 2F00 multimedia audio device (codec AC97) SoundMAX or VIA (815B104D)
- 3092 I2O 1.5 RAID Controller (SRCU32)
- 3200 31244 PCI-X to Serial ATA Controller
- 3313 IOP348 I/O Processor (SL8e) in IOC Mode SAS/SATA
- 331B IOP348 I/O Processor (SL8x) in IOC Mode SAS/SATA
- 3331 IOC340 I/O Controller (VV8e) SAS/SATA
- 3339 IOC340 I/O Controller (VV8x) SAS/SATA
- 3340 82855PM Processor to I/O Controller
- 3341 82855PM Processor to AGP Controller
- 3342 Power Management (82855PM)
- 3363 IOC340 I/O Controller in IOC Mode SAS/SATA
- 33C3 IOP348 I/O Processor (SL8De) in IOC Mode SAS/SATA
- 33CB IOP348 I/O Processor (SL8Dx) in IOC Mode SAS/SATA
- 3400 QuickPath Architecture I/O Hub to ESI Port
- 3401 QuickPath Architecture I/O Hub to ESI Port
- 3402 QuickPath Architecture I/O Hub to ESI Port
- 3403 QuickPath Architecture I/O Hub to ESI Port
- 3404 QuickPath Architecture I/O Hub to ESI Port
- 3405 QuickPath Architecture I/O Hub to ESI Port
- 3406 QuickPath Architecture I/O Hub to ESI Port
- 3407 QuickPath Architecture I/O Hub to ESI Port
- 3408 QuickPath Architecture I/O Hub PCI Express Root Port 1
- 3409 QuickPath Architecture I/O Hub PCI Express Root Port 2
- 340A QuickPath Architecture I/O Hub PCI Express Root Port 3
- 340B QuickPath Architecture I/O Hub PCI Express Root Port 4
- 340C QuickPath Architecture I/O Hub PCI Express Root Port 5
- 340D QuickPath Architecture I/O Hub PCI Express Root Port 6
- 340E QuickPath Architecture I/O Hub PCI Express Root Port 7
- 340F QuickPath Architecture I/O Hub PCI Express Root Port 8
- 3410 QuickPath Architecture I/O Hub PCI Express Root Port 9
- 3411 QuickPath Architecture I/O Hub PCI Express Root Port 10
- 3418 Quickpath Interconnect Physical Layer Port 0
- 3419 Quickpath Interconnect Physical Layer Port 1
- 3420 QuickPath Architecture I/O Hub PCI Express Root Port 0
- 3421 QuickPath Architecture I/O Hub PCI Express Root Port 0
- 3422 QuickPath Architecture I/O Hub GPIO and Scratch Pad Registers
- 3423 QuickPath Architecture I/O Hub Control Status and RAS Registers
- 3425 QuickPath Interconnect Physical and Link Layer Registers - Port 0
- 3426 QuickPath Interconnect Routing and Protocol Layer Registers - Port 0
- 3427 QuickPath Interconnect Physical and Link Layer Registers - Port 1
- 3428 QuickPath Interconnect Routing & Protocol Layer Registers - Port 1
- 3429 DMA Engine
- 342A DMA Engine
- 342B DMA Engine
- 342C DMA Engine
- 342D QuickPath Architecture I/O Hub I/OxAPIC Interrupt Controller
- 342E QuickPath Architecture I/O Hub System Management Registers
- 342F Trusted Execution Technology Registers
- 3430 DMA Engine
- 3431 DMA Engine
- 3432 DMA Engine
- 3433 DMA Engine
- 3438 QuickPath Architecture I/O Hub Throttle Registers
- 348D Gigabit Ethernet Controller (82541EI)
- 3500 631xESB/632xESB PCIe Upstream Port
- 3501 6310ESB PCIe Upstream Port
- 3504 631xESB/632xESB I/OxAPIC Interrupt Controller
- 3505 6310ESB I/OxAPIC Interrupt Controller
- 350C 631xESB/632xESB PCIe to PCI-X Bridge
- 350D 6310ESB PCIe to PCI-X Bridge
- 3510 631xESB/632xESB PCIe Downstream Port E1
- 3511 6310ESB PCIe Downstream Port E1
- 3514 631xESB/632xESB PCIe Downstream Port E2
- 3515 6310ESB PCIe Downstream Port E2
- 3518 631xESB/632xESB PCIe Downstream Port E3
- 3519 6310ESB PCIe Downstream Port E3
- 3575 Host-Hub I/F Bridge / SDRAM Controller (82830[MP])
- 3576 82830M/MP CPU to AGP Bridge
- 3577 Integrated Graphics Device (82830M/MG)
- 3578 CPU to I/O Bridge (82830[MP])
- 3579 82835 SDRAM Controlller / Host-Hub Interface Bridge
- 357B 82835 Integrated Graphics Device
- 3580 82852GM/GME/GMV/PM, 855GM/GME Montara Host-Hub Interface Bridge
- 3581 82852GME/PM Montara Virtual PCI to AGP Bridge
- 3582 82852GM/GME/GMV/PM, 855GM/GME Montara Integrated Graphics Device
- 3584 82852GM/GME/GMV/PM, 855GM/GME Montara System Memory Controller
- 3585 82852GM/GME/GMV/PM, 855GM/GME Montara Configuration Process
- 3590 E7520 Server Memory Controller Hub
- 3591 E752x Memory Controller Hub Error Reporting Registers
- 3592 E732x Server Memory Controller Hub
- 3593 E752x Memory Controller Hub Error Reporting Registers
- 3594 E752x Memory Controller Hub DMA Controller
- 3595 E752x Memory Controller Hub PCIe Port A0
- 3596 E752x Memory Controller Hub PCIe Port A1
- 3597 E752x Memory Controller Hub PCIe Port B0
- 3598 E752x Memory Controller Hub PCIe Port B1
- 3599 E752x Memory Controller Hub PCIe Port C0
- 359A E752x Memory Controller Hub DMA Controller
- 359B E752x Memory Controller Hub Extended Configuration Registers
- 359E E7525 Workstation Memory Controller Hub
- 35B0 3100 Chipset Memory I/O Controller Hub
- 35B1 3100 Chipset DRAM Controller Error Reporting Registers
- 35B5 3100 Chipset Enhanced DMA Controller
- 35B6 3100 Chipset PCIe Port A
- 35B7 3100 Chipset PCIe Port A1
- 35C8 3100 Chipset Extended Configuration Test Overflow Registers
- 3600 7300 Chipset (Caneland) Memory Controller Hub
- 3604 7300 Chipset (Caneland) PCIe Port 1
- 3605 7300 Chipset (Caneland) PCIe Port 2
- 3606 7300 Chipset (Caneland) PCIe Port 3
- 3607 7300 Chipset (Caneland) PCIe Port 4
- 3608 7300 Chipset (Caneland) PCIe Port 5
- 3609 7300 Chipset (Caneland) PCIe Port 6
- 360A 7300 Chipset (Caneland) PCIe Port 7
- 360B who knows&erka (PCIVEN_8086&DEV_2448&SUBSYS_00000000&REV8813&18d)
- 360C 7300 Chipset (Caneland) FSB Registers
- 360D 7300 Chipset (Caneland) Snoop Filter Registers
- 360E 7300 Chipset (Caneland) Debug and Miscellaneous Registers
- 360F 7300 Chipset (Caneland) FBD Branch 0 Registers
- 3610 7300 Chipset (Caneland) FBD Branch 1 Registers
- 3A00 ICH10 4 port SATA IDE Controller (ICH10 Family)
- 3A01 2 port SATA IDE Controller
- 3A02 ICH10D SATA Controller (82801JD)
- 3A03 4 port SATA AHCI Controller
- 3A05 ICH10D SATA Controller (82801JD)
- 3A06 SATA2(2Port1) (ICH10 Family)
- 3A10 LPC Interface Controller
- 3A14 82801JDO ICH10DO (82801JDO)
- 3A16 LPC Interface Controller
- 3A18 LPC Interface Controller
- 3A1A LPC Interface Controller
- 3A1E LPC Interface Controller
- 3A20 SATA2(4Port2) (ICH10 Family)
- 3A21 2 port SATA IDE Controller
- 3A22 6 port SATA AHCI Controller
- 3A23 4 port SATA AHCI Controller
- 3A25 SATA RAID Controller
- 3A26 SATA2(2Port2) (ICH10 Family)
- 3A30 SMB controller (50011458)
- 3A32 Thermal Subsystem
- 3A34 USB UHCI Controller *1
- 3A35 USB UHCI Controller *2
- 3A36 USB UHCI Controller *3
- 3A37 USB UHCI Controller *4
- 3A38 USB UHCI Controller *5
- 3A39 USB UHCI Controller *6
- 3A3A USB EHCI Controller *1
- 3A3C USB EHCI Controller *2
- 3A3E Microsoft UAA Bus Driver for High Definition Audio (Microsoft UAA Bus Driver for High Definition Audio)
- 3A40 PCI Express Port 1
- 3A42 PCI Express Port 2
- 3A44 PCI Express Port 3
- 3A46 PCI Express Port 4
- 3A48 PCI Express Port 5
- 3A4A PCI Express Port 6
- 3A4C Gigabit Ethernet Controller
- 3A51 VECI Controller
- 3A55 Virtual SATA Contoller
- 3A60 SM-Bus Controller (ICH10)
- 3A62 Thermal Subsystem
- 3A64 USB UHCI Controller *1
- 3A65 USB UHCI Controller *2
- 3A66 USB UHCI Controller *3
- 3A67 USB UHCI Controller *4
- 3A68 USB UHCI Controller *5
- 3A69 USB UHCI Controller *6
- 3A6A USB EHCI Controller *1
- 3A6C USB EHCI Controller *2
- 3A6E HD Audio Controller
- 3A70 PCI Express Port 1
- 3A72 PCI Express Port 2
- 3A74 PCI Express Port 3
- 3A76 PCI Express Port 4
- 3A78 PCI Express Port 5
- 3A7A PCI Express Port 6
- 3A7C Gigabit Ethernet Controller
- 3B20 IBEX SATA Controller
- 3B21 IBEX SATA Controller
- 3B22 IBEX AHCI Controller(6Port) (Intel Q57 Express)
- 3B23 IBEX AHCI Controller(4Port)
- 3B26 IBEX SATA Controller
- 3B28 IBEX SATA Controller
- 3B29 IBEX AHCI Controller(4Port)
- 3B2E IBEX SATA Controller
- 3B2F IBEX AHCI Controller(6Port)
- 4000 V.90 HaM Modem (Creatix)
- 4001 5400A Chipset Memory Controller Hub
- 4003 5400B Chipset Memory Controller Hub
- 4008 5400 Series Chipset Memory Controller Hub
- 4010 5400 Series Chipset Memory Controller Hub
- 4021 5400 Series Chipset PCIe Port 1
- 4022 5400 Series Chipset PCIe Port 2
- 4023 5400 Series Chipset PCIe Port 3
- 4024 5400 Series Chipset PCIe Port 4
- 4025 5400 Series Chipset PCIe Port 5
- 4026 5400 Series Chipset PCIe Port 6
- 4027 5400 Series Chipset PCIe Port 7
- 4028 5400 Series Chipset PCIe Port 8
- 4029 5400 Series Chipset PCIe Port 9
- 402D 5400 Series Chipset PCI Express Ports 4 - 1 and ESI port
- 402E 5400 Series Chipset PCI Express Ports 9 - 5
- 402F 5400 Series Chipset DMA/DCA Engine
- 4030 5400 Series Chipset FSB Registers
- 4031 5400 Series Chipset Coherency Engine, Data Manager and Snoop Filter.
- 4032 5400 Series Chipset I/OxAPIC
- 4035 5400 Series Chipset Channel Control for FB-DIMM Branch 0
- 4036 5400 Series Chipset Channel Control for FB-DIMM Branch 1
- 4220 driverIntel PRO/Wireless 2200BG (MPCI3B)
- 4222 Intel 3945ABG Wireless LAN controller (10208086)
- 4223 Intel (R) PRO/Wireless 2200BG Network Connection, (R) PRO/Wireless 2915ABG Network Connection (2915ABG)
- 4224 802.11a/b/g WLan adapter (Intel Pro Wireless 2915ABG)
- 4227 PRO/Wireless 3945ABG Network Connection
- 4228 PRO/Wireless 3965ABG Network Connection
- 4229 Intel Wireless WiFi Link 4965AGN(supporting 802.11a/b/g/Draft-N) (Intel 4965AGN)
- 422D Intel Wireless WiFi Link 4965AGN (Intel 4965AGN)
- 4230 Intel Wireless WiFi Link 4965AGN (Intel 4965AGN)
- 4232 Carte Intel WiFi Link 5100 AGN (Intel WiFi Link 5100)
- 4233 Intel Wireless WiFi Link 4965AGN (Intel 4965AGN)
- 4235 Intel WiFi Link 5300 AGN (5300AGN)
- 4237 Intel (R) WiFi Link 5100 AGN (5100 AGN)
- 4318 Dell Wireless 1370 WLAN Mini-PCI Card (1370 (0280))
- 444D Flash Cache Logic Chip
- 444E Intel TurboMemory (TurboMemory)
- 4813 Dell Wireless 1370 WLAN Mini-PCI Card (1370 (0280))
- 4888 intel 3945abg wireless lan controller
- 5001 Modem - PPP (Device0000004c)
- 5002 LE80578 Graphics Processor Unit
- 5005 Modem - PPPoA (PRO/DSL 2200)
- 5009 LE80578 Video Display Controller
- 500D LE80578 Expansion Bus
- 500E LE80578 UART Controller
- 500F LE80578 General Purpose IO
- 5010 LE80578 I2C Controller
- 5012 LE80578 Serial Peripheral Interface Bus
- 5020 Memory Controller Hub
- 5021 DRAM Error Reporting Registers
- 5023 EDMA Controller
- 5024 PCI Express Port PEA0
- 5025 PCI Express Port PEA1
- 5028 S-ATA IDE
- 5029 AHCI Controller (?(EP80579))
- 502A S-ATA RAID0/1
- 502B S-ATA Reserved
- 502C System Device
- 5030 System Device
- 5031 LPC Bus
- 5032 SMBus Controller
- 5033 USB 1.1 Controller
- 5035 USB 2.0 Controller
- 5037 PCI-PCI Bridge (transparent mode)
- 5039 Controller Area Network (CAN) interface *1
- 503A Controller Area Network (CAN) interface *2
- 503B Synchronous Serial Port (SPP)
- 503C IEEE 1588 Hardware Assist
- 503D Local Expansion Bus
- 503E Global Control Unit (GCU)
- 503F System Device
- 5040 Gigabit Ethernet MAC
- 5041 Gigabit Ethernet MAC
- 5042 Gigabit Ethernet MAC
- 5043 Gigabit Ethernet MAC
- 5044 Gigabit Ethernet MAC
- 5045 Gigabit Ethernet MAC
- 5046 Gigabit Ethernet MAC
- 5047 Gigabit Ethernet MAC
- 5048 Gigabit Ethernet MAC
- 5049 Gigabit Ethernet MAC
- 504A Gigabit Ethernet MAC
- 504B Gigabit Ethernet MAC
- 504C TDM
- 5200 EtherExpress PRO/100 Server PCI to PCI Bridge
- 5201 EtherExpress PRO/100 Server Ethernet Adapter
- 5309 I/O Processor Address Translation Unit (80303)
- 530D I/O Companion Unit Address Translation (80312)
- 5378 GW80314 I/O Companion Chip (with SRAM)
- 5379 GW80314 I/O Companion Chip (without SRAM)
- 537C 31154 133MHz PCI-X to PCI-X Bridge
- 65C0 5100 Chipset Memory Controller Hub (??)
- 65E0 5100 Chipset Memory Controller Hub (??)
- 65E2 5100 Chipset PCIe x4 Port 2
- 65E3 5100 Chipset PCIe x4 Port 3
- 65E4 5100 Chipset PCIe x4 Port 4
- 65E5 5100 Chipset PCIe x4 Port 5
- 65E6 5100 Chipset PCIe x4 Port 6
- 65E7 5100 Chipset PCIe x4 Port 7
- 65F0 5100 Chipset FSB Registers
- 65F1 5100 Chipset Reserved Registers
- 65F3 5100 Chipset Miscellaneous Registers
- 65F5 5100 Chipset DDR Channel 0 Registers
- 65F6 5100 Chipset DDR Channel 1 Registers
- 65F7 5100 Chipset PCIe x8 Port 2-3
- 65F8 5100 Chipset PCIe x8 Port 4-5
- 65F9 5100 Chipset PCIe x8 Port 6-7
- 65FA 5100 Chipset PCIe x16 Port 4-7
- 65FF 5100 Chipset DMA Engine
- 6960 EHCI 960 Emulator
- 7000 PIIX3 PCI-to-ISA Bridge (Triton II) (82371SB)
- 7010 PIIX3 IDE Interface (Triton II) (82371SB)
- 7020 PIIX3 USB Host Controller (Triton II) (82371SB)
- 7030 82437VX 430VX System Controller
- 7050 Intercast Video Capture Card
- 7051 Intel Business Video Conferencing Card (PB 642365-003)
- 7100 System Controller (MTXC), part of 430TX chipset (82439TX)
- 7110 PIIX4/4E/4M ISBridgeA (82371AB/EB/MB)
- 7111 PIIX4/4E/4M IDE Controller (82371AB/EB/MB)
- 7112 PIIX4/4E/4M USB Interface (82371AB/EB/MB)
- 7113 PIIX4/4E/4M Power Management Controller (82371AB/EB/MB)
- 7120 Host-Hub Interface Bridge / DRAM Ctrlr (Intel(R) 82801IMB)
- 7121 82810 810 Chipset Graphics Controller
- 7122 Host-Hub Interface Bridge / DRAM Ctrlr (82810-DC100)
- 7123 Intel 82810 Graphics Controller (82810-DC100)
- 7124 82810E 810e Host-Hub Interface and Memory Controller
- 7125 Intel Direct AGP 810 Chipset (82810E)
- 7126 82810 810 Chipset Host Bridge and Memory Controller Hub
- 7127 82810E 810 Chipset Graphics Controller (at 133MHz)
- 7128 82810-M DC-100 810 Chipset Host Bridge and Graphics Controller
- 712A 82810-M DC-133 810 Chipset Host Bridge and Graphics Controller
- 7180 Host/PCI bridge in 440LX/EX AGP chipset (rmc)
- 7181 AGP device in 440LX/EX AGP chipset (82443 ex/lx)
- 7182 intel (440LX/EX)
- 7190 82443BX/ZX 440BX/ZX CPU to PCI Bridge (AGP Implemented)
- 7191 440BX/ZX AGPset PCI-to-PCI bridge (82443BX/ZX)
- 7192 82443BX/ZX 440BX/ZX CPU to PCI Bridge (AGP Not Implemented)
- 7194 82440MX CPU to I/O Controller
- 7195 AC97 Audio Controller (82443MX)
- 7196 AC97 Modem Controller (Winmodem) (82440 - 443MX)
- 7198 PCI to ISA Bridge (82443MX)
- 7199 EIDE Controller (82443MX)
- 719A USB Universal Host Controller (82443MX)
- 719B Power Management Controller (82443MX)
- 71A0 82443GX 440GX CPU to PCI Bridge (AGP Implemented)
- 71A1 fabricated by Intel (intel 82801 IB ICH9 )
- 71A2 82443GX 440GX CPU to PCI Bridge (AGP Not Implemented)
- 7221 graphics device (82810)
- 7600 82472FB/82468GX PCI to ISA/LPC Bridge
- 7601 82472FB/82468GX PCI EIDE Controller
- 7602 82472FB/82468GX USB Universal Host Controller
- 7603 82472FB/82468GX System Management Bus Controller
- 7605 IEEE1394 OpenHCI Host Controller (82372FB)
- 7800 Intel740 AGP Graphics Accelerator
- 8002 Trusted Execution Technology
- 8003 Trusted Execution Technology Registers
- 803B 0x81ef (0x104d)
- 8086 PRO/100 VE Network Connection (24D0)
- 811A Atom SCH PATA (Atom SCH)
- 84C4 82454KX/GX 450KX/GX Orion System Controller
- 84C5 450KX/GX Memory Controller (Orion) (82453KX/GX)
- 84CA 450NX PCIset Memory & I/O Controller (82451NX)
- 84CB 82454NX/82467GX 450NX PCI Expander Bridge
- 84E0 82460GX 460GX System Address Controller
- 84E1 82460GX 460GX System Data Controller
- 84E2 82460GX 460GX AGP Bridge (GXB Function 2)
- 84E3 82460GX 460GX Memory Address Controller
- 84E4 82460GX 460GX Memory Data Controller
- 84E6 82466GX 460GX Wide and fast PCI eXpander Bridge
- 84EA 82460GX 460GX AGP Bridge (GXB Function 1)
- 8500 IXP4XX - Intel Network Processor family. IXP420, IXP421, IXP422, IXP425 and IXC1100
- 85A1 LPC Bridge (6300ESB)
- 85A2 IDE Controller (6300ESB)
- 85A3 Serial ATA Controller (6300ESB)
- 85A4 SMBus Controller (6300ESB)
- 85A6 AC'97 Audio Controller (6300ESB)
- 85A7 AC'97 Modem Controller (6300ESB)
- 85A9 USB 1.1 UHCI Controller *1 (6300ESB)
- 85AA USB 1.1 UHCI Controller *2 (6300ESB)
- 8671 ?
- 9000 IXP2000 Family Network Processor
- 9001 IXP2400 Network Processor
- 9002 IXP2300 Network Processor
- 9004 IXP2800 Network Processor
- 9620 I2O RAID PCI to PCI Bridge
- 9621 SRCU21 I2O 1.5 RAID Controller (F/W<6.0)
- 9622 SRCUxx I2O 1.5 RAID Controller (F/W<6.0)
- 9641 SRCU31 I2O 1.5 RAID Controller (F/W<6.0)
- 96A1 SRCU31L I2O 1.5 RAID Controller (F/W<6.0)
- 9874 AUDIO CONTROLLER (AC97)
- 9876 intel brokdale (i845)
- 9877 1
- 9888 HDAUDIOFUNC_01&VEN_8086&DEV_2802&REV_1000 (HDAUDIOFUNC_01&VEN_8086&DEV_2802&SUBSYS_80860101&)
- 9999 Interface chip (pci30b2103c)
- A01F PRO/10GbE LR Server Adapter retail verson
- A11F PRO/10GbE LR Server Adapter OEM version
- A620 6400/6402 Advanced Memory Buffer (AMB)
- B152 PCI to PCI Bridge (S21152BB)
- B154 S21152BA,S21154AE/BE PCI to PCI Bridge
- B555 21555 Non-transparent PCI to PCI Bridge
- FFFF 82450KX/GX Orion Cache/DRAM Controller (Buggy ID)
-80EE InnoTek Systemberatung GmbH
- BEEF VirtualBox Graphics Adapter
- CAFE VirtualBox Guest Service
-8384 Sigmatel Inc (??)
- 7618 High Definition Audio Codec
- 7670 9770 High Definition Audio
- 7672 9772 High Definition Audio
-8401 TRENDware International Inc
-8686 ScaleMP
- 1010 vSMPowered system controller [vSMP CTL]
-8800 Trigem Computer
- 2008 Video assistent component
-8866 T-Square Design Inc.
- 1689 MP3 player/FM radio/voice recorder 256 Mo flash (T2-MP3-001)
-8888 Silicon Magic Corp
-8912 TRX
-8E0E Computone Corp
-8E2E KTI
- 3000 ET32/Px Ethernet Adapter
-9004 Adaptec Inc
- 0078 AHA-2940UW/CN (aic-7880p)
- 1078 RAID Coprocessor (AIC-7810C)
- 1135 Texas Instruments (0x0035)
- 1160 AIC-1160 Family Fibre Channel Adapter
- 2178 AIC-7821 SCSI Host Adapter
- 3860 AHA-2930CU PCI SCSI Controller
- 3B78 QuadChannel Fast-Wide/Ultra-Wide Diff. SCSI Ctrlr (AHA-4944W/4944UW)
- 5075 AIC-755x SCSI Controller
- 5078 AVA-2902I/E,AVA-2904,AVA-2910 (AIC-7850P) Fast/Wide SCSI II
- 5175 AIC-755x SCSI Controller
- 5178 AIC-7850 Fast SCSI Controller
- 5275 AIC-755x SCSI Controller
- 5278 AIC-7850 Fast SCSI Controller
- 5375 AIC-755x SCSI Controller
- 5378 AIC-7850 Fast SCSI Controller
- 5475 AIC-755x SCSI Controller
- 5478 AIC-7850 Fast SCSI Controller
- 5575 AVA-2930 SCSI Host Adapter
- 5578 AIC-7855 Fast SCSI Controller
- 5647 ANA-7711 TCP Offload Engine
- 5675 AIC-755x SCSI Controller
- 5678 AIC-7856 Fast SCSI Controller
- 5775 AIC-755x SCSI Controller
- 5778 AIC-7850 Fast SCSI Controller
- 5800 AIC-5800 IEEE-1394 FireWire Controller
- 5900 ATM155 & 25 LAN Controller (ANA-5910/30/40)
- 5905 ANA-5910A/5930A/5940A ATM Adapter
- 6038 Ultra SCSI Adpater (VAR) (AHA-2930C)
- 6075 CardBus Ultra SCSI Controller (AIC-7560?)
- 6078 PCI SCSI Controller (AIC-7860)
- 6178 AIC-7861 AHA-2940AU PCI SCSI Controller
- 6278 AIC-7860 SCSI Controller
- 6378 AIC-7860 SCSI Controller
- 6478 AIC-786x SCSI Controller
- 6578 AIC-786x SCSI Controller
- 6678 AIC-786x SCSI Controller
- 6778 AIC-786x SCSI Controller
- 6915 ANA620xx/ANA69011A Fast Ethernet
- 7078 Fast and Wide SCSI Ctrlr (AIC-7870)
- 7178 Fast/Fast-Wide SCSI Ctrlr (AHA-2940/2940W)
- 7278 Multichannel Fast/Fast-Wide SCSI Ctrlr (AHA-3940/3940W)
- 7378 AHA-3985 4 Channel RAID SCSI Host Adapter
- 7478 AHA-2944/W SCSI Host Adapter
- 7578 Multichannel Fast/Fast-Wide Diff. SCSI Ctrlr (AHA-3944/3944W)
- 7678 QuadChannel Fast-Wide/Ultra-Wide Diff. SCSI Ctrlr (AHA-4944W/4944UW)
- 7710 ANA-7711F Network Accelerator Card (NAC) - Optical
- 7711 ANA-7711C Network Accelerator Card (NAC) - Copper
- 7778 AIC-787x SCSI Controller
- 7810 AIC-7810 Memory Controller IC
- 7815 RAID + Memory Controller IC (AIC-7515)
- 7850 Fast/Wide SCSI-2 Controller (aic-7850)
- 7855 Single channel SCSI Host Adapter (AHA-2930)
- 7860 AIC-7860 based PCI SCSI Controller
- 7870 Fast/Wide SCSI-2 Controller (AIC-7870)
- 7871 AHA-2940 Fast/Wide SCSI Host Adapter
- 7872 AHA-3940 Dual-Channel FAST/Wide SCSI Host Adapter
- 7873 AHA-3985 4 Channel RAID SCSI Host Adapter (AIC-7873)
- 7874 Differential SCSI (aha 2944)
- 7880 AIC-7880P Ultra/Ultra Wide SCSI Chipset
- 7890 SCSI controller (AIC-7890)
- 7891 SCSI controller (AIC-789x)
- 7892 SCSI controller (AIC-789x)
- 7893 SCSI controller (AIC-789x)
- 7894 SCSI controller (AIC-789x)
- 7895 Ultra-Wide SCSI Ctrlr on AHA-2940 AHA-394x (AIC-7895)
- 7896 SCSI controller (AIC-789x)
- 7897 SCSI controller (AIC-789x)
- 8078 AIC-7880P Ultra/Ultra Wide SCSI Chipset
- 8178 AHA-2940U/UW/2940D Ultra/Ultra Wide/Dual SCSI Host Adapter
- 8278 AHA-3940U/UW/UWD Ultra/Ultra Wide/Dual SCSI Host Adapter
- 8378 SCSI Controller (AIC-7883U)
- 8478 Ultra-Wide Diff. SCSI Ctrlr (ADAPTEC 2940UW CN SCSI)
- 8578 Fast-Wide/Ultra-Wide Diff. SCSI Ctrlr (AHA-3944U/3944UWD)
- 8678 QuadChannel Ultra-Wide Diff. SCSI Ctrlr (AHA-4944UW)
- 8778 AHA-2940UW Pro AIC-788x Ultra-Wide SCSI Controller
- 8878 Ultra Wide SCSI Controller (AIC-7888?)
- 8B78 AIC-7880P (ABA-1030)
- EC78 QuadChannel Fast-Wide/Ultra-Wide Diff. SCSI Ctrlr (AHA-4944W/4944UW)
-9005 Adaptec Inc
- 0010 AHA-2940U2W/U2B,2950U2W Ultra2 SCSI (AIC-7890AB scsi controller)
- 0011 AHA-2930U2 Ultra2 SCSI Host Adapter
- 0013 AIC-7890/1 SCSI Host Adapter
- 001F Ultra2-Wide SCSI controller (AIC-7890 AB for Windows XP)
- 0020 SCSI Controller (AIC-789x)
- 002F SCSI Controller (AIC-789x)
- 0030 SCSI Controller (AIC-789x)
- 003F SCSI Controller (AIC-789x)
- 0050 AHA-3940U2x/AHA-3950U2x Ultra2 SCSI Controller
- 0051 AHA-3950U2x Ultra2 SCSI Controller
- 0053 SCSI Controller (AIC-7896)
- 005F Ultra2 SCSI Controller (AIC-7896/7)
- 0080 29160/N/LP Ultra160 (AIC-7892A) SCSI Host Adapter
- 0081 19160 AIC-7892B Ultra160 SCSI Adapter
- 0082 2915/2930LP PCI SCSI Controller
- 0083 AIC-7892D Ultra160 SCSI Host Adapter
- 008F AIC-7892 Ultra160 SCSI Host Adapter
- 00C0 AHA-39160 (AIC-7899A) Ultra160 SCSI Host Adapter
- 00C1 AIC-7899B Ultra160 SCSI Host Adapter
- 00C3 AIC-7899D Ultra160 SCSI Host Adapter
- 00C5 RAID Subsystem HBA
- 00CF AIC-7899P Ultra160 SCSI Host Adapter
- 0241 Serial ATA II RAID 1420SA
- 0250 ServeRAID Controller
- 0258 Adaptec AAR-2610SA SATA 6-Port Raid (AAC-RAID)
- 0279 ServeRAID 6M
- 0283 AAC-RAID
- 0284 AAC-RAID
- 0285 PCIX133 32/64bit (Adaptec 2410SA SATA RAID)
- 0286 SUBSYS_95801014REV_02 (SUBSYS_95801014REV_02)
- 0410 AIC-9410W SAS (Razor HBA RAID)
- 0412 AIC-9410W SAS (Razor HBA non-RAID)
- 0415 ASC-58300 SAS/SATA Controller
- 0416 ASC-58300 SAS/SATA Controller
- 041E AIC-9410W SAS (Razor ASIC non-RAID)
- 041F AIC-9410W SAS (Razor ASIC RAID)=20
- 0430 AIC-9405W SAS (Razor-Lite HBA RAID)
- 0432 AIC-9405W SAS (Razor-Lite HBA non-RAID)
- 043E AIC-9405W SAS (Razor-Lite ASIC non-RAID)=20
- 043F AIC-9405W SAS (Razor-Lite ASIC RAID)=20
- 0500 Obsidian chipset SCSI controller
- 0503 Scamp chipset SCSI controller
- 0910 AUA-3100B
- 091E AUA-3100B
- 8000 Ultra320 SCSI Controller (ASC-29320A)
- 800F Ultra320 SCSI Controller (AIC-7901)
- 8010 Ultra320 SCSI Controller (ASC-39320)
- 8011 Ultra320 SCSI Controller (ASC-39320D)
- 8012 Ultra320 SCSI Controller (ASC-29320)
- 8013 ASC-29320B Ultra320 SCSI Controller
- 8014 Ultra320 SCSI Controller (ASC-29320LP)
- 8015 SCSI Card 39320 Ultra320 SCSI Controller
- 8016 Ultra320 SCSI Controller (ASC-39320A)
- 8017 Ultra320 SCSI Controller (ASC-29320ALP)
- 801C Ultra320 SCSI Controller (AIC-?????)
- 801D Ultra320 SCSI Controller (AIC-7902B)
- 801E Ultra320 SCSI Controller (AIC-7901)
- 801F Ultra320 SCSI Controller (AIC-7902)
- 8080 Ultra320 HostRAID Controller (ASC-29320A)
- 808F Ultra320 HostRAID Controller (AIC-7901)
- 8090 HostRAID SCSI Controller (ASC-39320)
- 8091 HostRAID SCSI Controller (ASC-39320D)
- 8092 HostRAID SCSI Controller (ASC-29320)
- 8093 HostRAID SCSI Controller (ASC-29320LPE)
- 8094 HostRAID SCSI Controller (ASC-29320LP)
- 8095 HostRAID SCSI Controller (ASC-39320)
- 8096 HostRAID SCSI Controller (ASC-39320A)
- 8097 HostRAID SCSI Controller (ASC-29320ALP)
- 809C HostRAID SCSI Controller (ASC-39320D)
- 809D HostRAID SCSI Controller (AIC-7902B)
- 809E HostRAID SCSI Controller (AIC-7901A)
- 809F HostRAID SCSI Controller (AIC-7902B)
-907F Atronics
- 2015 IDE-2015PL EIDE Controller
-919A Gigapixel Corp
-9412 Holtek
- 6565 HT6565 PCI EIDE Controller
-9699 Omni Media Technology Inc
-9710 MosChip Semiconductors (Was: Netmos Technology)
- 7780 USB IRDA-port
- 9250 MCS9250 PCI to PCI Bridge
- 9705 Nm9705 Parallel Port Adapter
- 9715 Nm9715 Dual Parallel Port Adapter
- 9735 Nm9735 Single Parallel / Dual Serial Port Adapter
- 9745 Nm9745 Dual UART and PCI-ISA Bridge
- 9755 Nm9755 Parallel Port and PCI-ISA Bridge
- 9805 Netmos Parallel port PCI card (9805)
- 9815 Nm9715CV Parallel/Serial Port Adapter
- 9820 Nm9820 Single PCI UART
- 9825 Nm9825 Single PCI UART
- 9835 Nm9835 Parallel/Serial Port Adapter
- 9845 4 serial, 1 parallel port PCI card (NM9845CV)
- 9855 Nm9855 Parallel/Serial Port Adapter
-9877 Pan Asia Superitendence Corp
-9902 StarGen, Inc.
- 0001 PCI-to-PCI Bridge (SG2010)
- 0002 PCI to high speed serial bridge (SG2010)
- 0003 6 port serial switch /PCI-to-PCI bridge (SG1010)
-A0A0 AOpen Inc
-A0F1 Unisys Corp
-A200 NEC Corp.
- A200 tv (saa1735hl)
-A259 Hewlett Packard
-A25A Hewlett Packard Convex Division
-A25B Hewlett Packard GmbH PL24-MKT
-A304 Sony
-A727 3Com Corp
- 0013 3CRPAG175 Wireless PC Card
-AA42 Scitex Digital Video
- 03A3 CharKey (9400-0931)
-AAAA Parallels Software International Inc
- 1112 PCI Tool Device
- 1131 Parallels Video Driver
-AC1E Digital Receiver Technology Inc
-AC3D Actuality Systems
-AECB Adrienne Electronics Corporation
-B00C IC Book Labs
- 001C IC80+PCI POST Diagnostics Card
- 011C IC128 PCI Parallel Port Controller
- 021C Gunboat x4 Quad PCI Serial Port Controller (Low Speed)
- 031C Gunboat x4 Pro Quad PCI Serial Port Controller (High Speed)
- 041C Ironclad x8 Octal PCI Serial Port Controller (Standard Speed)
- 051C Ironclad x8 Pro Octal PCI Serial Port Controller (High Speed)
- 061C IC138 PCI Parallel Port Controller
- 081C Dreadnought x16 Pro 16-port PCI Serial Controller (High Speed)
- 091C Dreadnought x16 Lite 16-port Serial Controller
-B1B3 Shiva Europe Ltd
-B54B Contec Co Ltd
-B894 Brown & Sharpe Mfg Co
-BDBD Blackmagic Design
- A106 Blackmagic DeckLink
- A107 Blackmagic DeckLink
- A108 Blackmagic DeckLink
- A109 Blackmagic DeckLink
- A10B Blackmagic DeckLink
- A10C Blackmagic DeckLink
- A10E Blackmagic DeckLink
- A10F Blackmagic DeckLink
- A112 Blackmagic DeckLink
- A113 Blackmagic DeckLink
- A114 Blackmagic DeckLink
- A115 Blackmagic DeckLink
-C001 TSI Telsys
-C0A9 Micron (Crucial Technology)
-C0DE Motorola
- 5600 62802
- C0DE oZ0030 (62802-51)
-C0FE Motion Engineering Inc
-C622 Hudson Soft Co Ltd
-CA50 Varian Australia Pty Ltd
-CAFE Chrysalis-ITS
- 0003 Luna K3 Hardware Security Module
-CCCC Catapult Communications
-CCEC Curtiss-Wright Controls Embedded Computing
-CDDD Tyxz Inc
- 0101 DeepSea 1 High-Speed Stereo Vision Capture Card
- 0200 DeepSea 2 High Speed Stereo Vision Frame Grabber
-D161 Digium, Inc
- 0120 Wildcard TE120P single-span T1/E1/J1 card
- 0205 Wildcard TE205P
- 0210 Wildcard TE210P
- 0405 Wildcard TE405P Quad-Span togglable E1/T1/J1 card 5.0v
- 0406 Wildcard TE406P Quad-Span togglable E1/T1/J1 echo cancellation card 5.0v
- 0410 Wildcard TE410P Quad-Span togglable E1/T1/J1 card 3.3v
- 0411 Wildcard TE411P Quad-Span togglable E1/T1/J1 echo cancellation card 3.3v
- 0800 Wildcard TDM800P 8-port analog card
- 2400 Wildcard TDM2400P
- 3400 Wildcard TC400P transcoder base card
- B410 Wildcard B410 quad-BRI card
-D4D4 Curtiss-Wright Controls Embedded Computing
- 010F PMC-211 (PMC-211)
- 0601 PCI Mezzanine Card
-D531 I+ME ACTIA GmBH
-D841 Super PCI(??)
-D84D Exsys
-DC93 Dawicontrol
-DEAD Indigita Corp
-DEAF Middle Digital, Inc
- 9050 PC Weasel PCI VGA Device
- 9051 PC Weasel PCI Serial Communication Device
- 9052 PC Weasel PCI
-E000 Winbond
- E000 W89C940 Ethernet Adapter
-E159 Tiger Jet Network Inc
- 0001 Multiple devices use this ID: General Purpose I/O Controller
- 0002 Tiger 100APC ISDN Chipset
- 0600 PCI-to-PCI Bridge (Tiger 600)
-E4BF EKF Electronik GmbH
-E55E Essence Technology Inc
-EA01 Eagle Technology
- 000A PCI-773 Temperature Card
- 0032 PCI-730 & PC104P-30 Card
- 003E PCI-762 Opto-Isolator Card
- 0041 PCI-763 Reed Relay Card
- 0043 PCI-769 Opto-Isolator Reed Relay Combo Card
- 0046 PCI-766 Analog Output Card
- 0052 PCI-703 Analog I/O Card
- 0800 PCI-800 Digital I/O Card
-EA60 RME
- 9896 Digi32
- 9897 Digi32 Pro
- 9898 Digi32/8
-EABB Aashima Technology B.V.
-EACE Endace Measurement Systems Ltd.
- 3100 OC-3/OC-12 (DAG 3.10)
- 3200 OC-3/OC-12 (DAG 3.2x)
- 320E Fast Ethernet (DAG 3.2E)
- 340E Fast Ethernet (DAG 3.4E)
- 341E Fast Ethernet (DAG 3.41E)
- 3500 OC-3/OC-12 (DAG 3.5)
- 351C Fast Ethernet (DAG 3.5ECM)
- 4100 OC-48 (DAG 4.10)
- 4110 OC-48 (DAG 4.11)
- 4200 OC-48 (DAG 4.2)
- 420E Dual Gigabit Ethernet (DAG 4.2E)
- 4220 DAG 4.2 OC-48
- 422E DAG 4.2E Dual Gigabit Ethernet
- 430E Dual Gigabit Ethernet (DAG 4.3E)
-EC80 Belkin Corp
- EC00 F5D6000
-ECC0 Echo Digital Audio Corporation
- 0050 Gina24_301
- 0051 Gina24_361
- 0060 Layla24
- 0070 Mona_301_80
- 0071 Mona_301_66
- 0072 Mona_361
- 0080 4/2 channel (analog/digital) audio card (MiaMIDI)
- 0100 6/8 channel (analog/digital) audio card (GINA3G)
-EDD8 ARK Logic, Inc
- A091 Stingray GUI Accelerator (ARK1000PV)
- A099 Stingray GUI Accelerator (ARK2000PV)
- A0A1 Stingray 64 ARK2000MT 64-bit GUI W/DCI Playback
- A0A9 Quadro645 GUI Accelerator (ARK2000MI)
- A0B1 GUI Accelerator (ARK2000MI+)
-F1D0 AJA Video
- C0FE Xena HS/HD-R
- C0FF Kona/Xena 2
- CAFE KONA SD SMPTE 259M I/O
- CFEE Xena LS/SD-22-DA/SD-DA
- DCAF Kona HD
- DFEE Xena HD-DA
- EFAC KONA SD SMPTE 259M I/O
- FACD KONA HD SMPTE 292M I/O
-F5F5 F5 Networks Inc
-FA57 Interagon AS (Was: Fast Search & Transfer ASA)
- 0001 Pattern Matching Chip (PMC)
-FAB7 Fabric7 Systems Inc
-FEBD Ultraview Corp
-FEDA Broadcom (Was: Epigram Inc; Bought out in 1999)
- A0FA BCM4210 iLine10 HomePNA 2.0
- A10E BCM4230 iLine10 HomePNA 2.0
-FEDE Fedetec Inc
- 0003 TABIC PCI v3
-FFFD XenSource Inc
- 0101 PCI Event Channel Controller
-FFFE VMWare Inc (Older Product Versions)
- 0405 Virtual SVGA 4.0
- 0710 Virtual SVGA
+# $FreeBSD$
+
+#
+# List of PCI ID's
+#
+# Version: 2011.07.14
+# Date: 2011-07-14 03:15:06
+#
+# Maintained by Martin Mares <mj@ucw.cz> and other volunteers from the
+# PCI ID Project at http://pciids.sf.net/.
+#
+# New data are always welcome, especially if they are accurate. If you have
+# anything to contribute, please follow the instructions at the web site.
+#
+# This file can be distributed under either the GNU General Public License
+# (version 2 or higher) or the 3-clause BSD License.
+#
+
+# Vendors, devices and subsystems. Please keep sorted.
+
+# Syntax:
+# vendor vendor_name
+# device device_name <-- single tab
+# subvendor subdevice subsystem_name <-- two tabs
+
+0000 Gammagraphx, Inc. (or missing ID)
+0010 Allied Telesis, Inc
+# This is a relabelled RTL-8139
+ 8139 AT-2500TX V3 Ethernet
+001a Ascend Communications, Inc.
+001c PEAK-System Technik GmbH
+ 0001 PCAN-PCI CAN-Bus controller
+ 001c 0004 2 Channel CAN Bus SJC1000
+ 001c 0005 2 Channel CAN Bus SJC1000 (Optically Isolated)
+0033 Paradyne corp.
+003d Lockheed Martin-Marietta Corp
+# Real TJN ID is e159, but they got it wrong several times --mj
+0059 Tiger Jet Network Inc. (Wrong ID)
+0070 Hauppauge computer works Inc.
+ 0003 WinTV PVR-250
+ 0009 WinTV PVR-150
+ 0801 WinTV PVR-150
+ 0807 WinTV PVR-150
+ 4000 WinTV PVR-350
+ 4001 WinTV PVR-250 (v1)
+ 4009 WinTV PVR-250
+ 4800 WinTV PVR-350
+ 4801 WinTV PVR-250 MCE
+ 4803 WinTV PVR-250
+ 7444 WinTV HVR-1600
+ 7801 WinTV HVR-1800 MCE
+ 8003 WinTV PVR-150
+ 8801 WinTV PVR-150
+ c108 WinTV-HVR-4400-HD model 1278
+ c801 WinTV PVR-150
+ e807 WinTV PVR-500 MCE (1st tuner)
+ e817 WinTV PVR-500 MCE (2nd tuner)
+0071 Nebula Electronics Ltd.
+0095 Silicon Image, Inc. (Wrong ID)
+ 0680 Ultra ATA/133 IDE RAID CONTROLLER CARD
+# Wrong ID used in subsystem ID of the TELES.S0/PCI 2.x ISDN adapter
+00a7 Teles AG (Wrong ID)
+00f5 BFG Technologies, Inc.
+0100 Ncipher Corp Ltd
+0123 General Dynamics
+# 018a is not LevelOne but there is a board misprogrammed
+018a LevelOne
+ 0106 FPC-0106TX misprogrammed [RTL81xx]
+# 021b is not Compaq but there is a board misprogrammed
+021b Compaq Computer Corporation
+ 8139 HNE-300 (RealTek RTL8139c) [iPaq Networking]
+0270 Hauppauge computer works Inc. (Wrong ID)
+0291 Davicom Semiconductor, Inc.
+ 8212 DM9102A(DM9102AE, SM9102AF) Ethernet 100/10 MBit(Rev 40)
+# SpeedStream is Efficient Networks, Inc, a Siemens Company
+02ac SpeedStream
+ 1012 1012 PCMCIA 10/100 Ethernet Card [RTL81xx]
+02e0 XFX Pine Group Inc
+0308 ZyXEL Communications Corporation
+0315 SK-Electronics Co., Ltd.
+0357 TTTech AG
+ 000a TTP-Monitoring Card V2.0
+036f Trigem Computer Inc.
+0403 Future Technology Devices International Ltd
+0432 SCM Microsystems, Inc.
+ 0001 Pluto2 DVB-T Receiver for PCMCIA [EasyWatch MobilSet]
+0482 Kyocera
+# vendor code used for (at a minimum) RSA cards
+04b3 IBM Corp.
+ 4001 Remote System Administration device [RSA2]
+050d Belkin
+058f Alcor Micro Corporation
+05a9 OmniVision
+ 8519 OV519 series
+05e3 CyberDoor
+ 0701 CBD516
+066f Sigmatel Inc.
+ 3410 SMTP3410
+ 3500 SMTP3500
+0675 Dynalink
+ 1700 IS64PH ISDN Adapter
+ 1702 IS64PH ISDN Adapter
+ 1703 ISDN Adapter (PCI Bus, DV, W)
+ 1704 ISDN Adapter (PCI Bus, D, C)
+069d Hughes Network Systems (HNS)
+0721 Sapphire, Inc.
+0777 Ubiquiti Networks, Inc.
+# Atheros, 6th Generation, AR5414, 802.11a, 5GHz
+ 3005 XtremeRange5
+0795 Wired Inc.
+ 6663 Butane II (MPEG2 encoder board)
+ 6666 MediaPress (MPEG2 encoder board)
+07ca AVerMedia Technologies Inc.
+# Expresscard DVB-T tuner sold by Fujitsu for notebooks
+ 534a Slim mobile Express DVB-T (Fujitsu)
+ a301 AVerTV 301
+ b808 AVerTV DVB-T Volar (USB 2.0)
+07d0 ITT Geospatial Systems
+07d1 D-Link System Inc
+07e2 ELMEG Communication Systems GmbH
+0842 NPG, Personal Grand Technology
+# Nee Gemplus International, SA
+08e6 Gemalto NV
+08ff AuthenTec
+ afe4 [Anchor] AF-S2 FingerLoc Sensor Module
+0925 First International Computer, Inc.
+ 1234 VA-502 Mainboard
+093a PixArt Imaging Inc.
+ 010e Innovage Mini Digital Camera
+ 010f SDC-300 Webcam
+ 020f Digital Photo Viewer
+ 2468 CIF Single Chip
+ 2600 PAC7311
+ 2603 Philips Webcam SPC500NC
+ 2608 Maxell MaxCam RotaWeb
+ 2620 C3 Tech Mod. 153
+09c1 Arris
+ 0704 CM 200E Cable Modem
+0a89 BREA Technologies Inc
+0b0b Rhino Equipment Corp.
+ 0105 Rhino R1T1
+ 0205 Rhino R4FXO
+ 0206 RCB4FXO 4-channel FXO analog telphony card
+ 0305 Rhino R4T1
+ 0405 Rhino R8FXX
+ 0406 RCB8FXX 8-channel modular analog telphony card
+ 0505 Rhino R24FXX
+ 0506 RCB24FXS 24-Channel FXS analog telphony card
+ 0605 Rhino R2T1
+ 0705 Rhino R24FXS
+ 0706 RCB24FXO 24-Channel FXO analog telphony card
+ 0905 R1T3 Single T3 Digital Telephony Card
+ 0906 RCB24FXX 24-channel modular analog telphony card
+ 0a06 RCB672FXX 672-channel modular analog telphony card
+0b3d Brontes Technologies
+0b49 ASCII Corporation
+ 064f Trance Vibrator
+0ccd TerraTec Electronic GmbH
+ 0038 Cinergy T^2 DVB-T Receiver
+0e11 Compaq Computer Corporation
+ 0001 PCI to EISA Bridge
+ 0002 PCI to ISA Bridge
+ 0046 Smart Array 64xx
+ 0e11 4091 Smart Array 6i
+ 0e11 409a Smart Array 641
+ 0e11 409b Smart Array 642
+ 0e11 409c Smart Array 6400
+ 0e11 409d Smart Array 6400 EM
+ 0049 NC7132 Gigabit Upgrade Module
+ 004a NC6136 Gigabit Server Adapter
+ 005a Remote Insight II board - Lights-Out
+ 007c NC7770 1000BaseTX
+ 007d NC6770 1000BaseTX
+ 0085 NC7780 1000BaseTX
+ 00b1 Remote Insight II board - PCI device
+ 00bb NC7760
+ 00ca NC7771
+ 00cb NC7781
+ 00cf NC7772
+ 00d0 NC7782
+ 00d1 NC7783
+ 00e3 NC7761
+ 0508 Netelligent 4/16 Token Ring
+ 1000 Triflex/Pentium Bridge, Model 1000
+ 2000 Triflex/Pentium Bridge, Model 2000
+ 3032 QVision 1280/p
+ 3033 QVision 1280/p
+ 3034 QVision 1280/p
+ 4000 4000 [Triflex]
+ 4040 Integrated Array
+ 4048 Compaq Raid LC2
+ 4050 Smart Array 4200
+ 4051 Smart Array 4250ES
+ 4058 Smart Array 431
+ 4070 Smart Array 5300
+ 4080 Smart Array 5i
+ 4082 Smart Array 532
+ 4083 Smart Array 5312
+ 4091 Smart Array 6i
+ 409a Smart Array 641
+ 409b Smart Array 642
+ 409c Smart Array 6400
+ 409d Smart Array 6400 EM
+ 6010 HotPlug PCI Bridge 6010
+ 7020 USB Controller
+ a0ec Fibre Channel Host Controller
+ a0f0 Advanced System Management Controller
+ a0f3 Triflex PCI to ISA Bridge
+ a0f7 PCI Hotplug Controller
+ 8086 002a PCI Hotplug Controller A
+ 8086 002b PCI Hotplug Controller B
+ a0f8 ZFMicro Chipset USB
+ a0fc FibreChannel HBA Tachyon
+ ae10 Smart-2/P RAID Controller
+ 0e11 4030 Smart-2/P Array Controller
+ 0e11 4031 Smart-2SL Array Controller
+ 0e11 4032 Smart Array 3200 Controller
+ 0e11 4033 Smart Array 3100ES Controller
+ 0e11 4034 Smart Array 221 Controller
+ ae29 MIS-L
+ ae2a MPC
+ ae2b MIS-E
+ ae31 System Management Controller
+ ae32 Netelligent 10/100 TX PCI UTP
+ ae33 Triflex Dual EIDE Controller
+ ae34 Netelligent 10 T PCI UTP
+ ae35 Integrated NetFlex-3/P
+ ae40 Netelligent Dual 10/100 TX PCI UTP
+ ae43 Netelligent Integrated 10/100 TX UTP
+ ae69 CETUS-L
+ ae6c Northstar
+ ae6d NorthStar CPU to PCI Bridge
+ b011 Netelligent 10/100 TX Embedded UTP
+ b012 Netelligent 10 T/2 PCI UTP/Coax
+ b01e NC3120 Fast Ethernet NIC
+ b01f NC3122 Fast Ethernet NIC
+ b02f NC1120 Ethernet NIC
+ b030 Netelligent 10/100 TX UTP
+ b04a 10/100 TX PCI Intel WOL UTP Controller
+ b060 Smart Array 5300 Controller
+ b0c6 NC3161 Fast Ethernet NIC
+ b0c7 NC3160 Fast Ethernet NIC
+ b0d7 NC3121 Fast Ethernet NIC
+ b0dd NC3131 Fast Ethernet NIC
+ b0de NC3132 Fast Ethernet Module
+ b0df NC6132 Gigabit Module
+ b0e0 NC6133 Gigabit Module
+ b0e1 NC3133 Fast Ethernet Module
+ b123 NC6134 Gigabit NIC
+ b134 NC3163 Fast Ethernet NIC
+ b13c NC3162 Fast Ethernet NIC
+ b144 NC3123 Fast Ethernet NIC
+ b163 NC3134 Fast Ethernet NIC
+ b164 NC3165 Fast Ethernet Upgrade Module
+ b178 Smart Array 5i/532
+ 0e11 4080 Smart Array 5i
+ 0e11 4082 Smart Array 532
+ 0e11 4083 Smart Array 5312
+ b1a4 NC7131 Gigabit Server Adapter
+ b200 Memory Hot-Plug Controller
+ b203 Integrated Lights Out Controller
+ b204 Integrated Lights Out Processor
+ c000 Remote Insight Lights-Out Edition
+ f130 NetFlex-3/P ThunderLAN 1.0
+ f150 NetFlex-3/P ThunderLAN 2.3
+0e21 Cowon Systems, Inc.
+0e55 HaSoTec GmbH
+0eac SHF Communication Technologies AG
+ 0008 Ethernet Powerlink Managing Node 01
+0f62 Acrox Technologies Co., Ltd.
+# Formerly NCR
+1000 LSI Logic / Symbios Logic
+ 0001 53c810
+ 1000 1000 LSI53C810AE PCI to SCSI I/O Processor
+ 0002 53c820
+ 0003 53c825
+ 1000 1000 LSI53C825AE PCI to SCSI I/O Processor (Ultra Wide)
+ 0004 53c815
+ 0005 53c810AP
+ 0006 53c860
+ 1000 1000 LSI53C860E PCI to Ultra SCSI I/O Processor
+ 000a 53c1510
+ 0e11 b143 Integrated Dual Channel Wide Ultra2 SCSI Controller
+ 1000 1000 LSI53C1510 PCI to Dual Channel Wide Ultra2 SCSI Controller (Nonintelligent mode)
+ 000b 53C896/897
+ 0e11 6004 EOB003 Series SCSI host adapter
+ 1000 1000 LSI53C896/7 PCI to Dual Channel Ultra2 SCSI Multifunction Controller
+ 1000 1010 LSI22910 PCI to Dual Channel Ultra2 SCSI host adapter
+ 1000 1020 LSI21002 PCI to Dual Channel Ultra2 SCSI host adapter
+ 13e9 1000 6221L-4U (Dual U2W SCSI, dual 10/100TX, graphics)
+ 000c 53c895
+ 1000 1010 LSI8951U PCI to Ultra2 SCSI host adapter
+ 1000 1020 LSI8952U PCI to Ultra2 SCSI host adapter
+ 1de1 3906 DC-390U2B SCSI adapter
+ 1de1 3907 DC-390U2W
+ 000d 53c885
+ 000f 53c875
+ 0e11 7004 Embedded Ultra Wide SCSI Controller
+ 1000 1000 LSI53C876/E PCI to Dual Channel SCSI Controller
+ 1000 1010 LSI22801 PCI to Dual Channel Ultra SCSI host adapter
+ 1000 1020 LSI22802 PCI to Dual Channel Ultra SCSI host adapter
+ 1092 8760 FirePort 40 Dual SCSI Controller
+ 1775 10d0 V5D Single Board Computer Wide Ultra SCSI
+ 1775 10d1 V5D Single Board Computer Ultra SCSI
+ 1de1 3904 DC390F/U Ultra Wide SCSI Adapter
+ 4c53 1000 CC7/CR7/CP7/VC7/VP7/VR7 mainboard
+ 4c53 1050 CT7 mainboard
+ 0010 53C1510
+ 0e11 4040 Integrated Smart Array Controller
+ 0e11 4048 RAID LC2 Controller
+ 1000 1000 53C1510 PCI to Dual Channel Wide Ultra2 SCSI Controller (Intelligent mode)
+ 0012 53c895a
+ 1000 1000 LSI53C895A PCI to Ultra2 SCSI Controller
+ 0013 53c875a
+ 1000 1000 LSI53C875A PCI to Ultra SCSI Controller
+ 0020 53c1010 Ultra3 SCSI Adapter
+ 1000 1000 LSI53C1010-33 PCI to Dual Channel Ultra160 SCSI Controller
+ 107b 1040 Server Onboard 53C1010-33
+ 1de1 1020 DC-390U3W
+ 0021 53c1010 66MHz Ultra3 SCSI Adapter
+ 1000 1000 LSI53C1000/1000R/1010R/1010-66 PCI to Ultra160 SCSI Controller
+ 1000 1010 Asus TR-DLS onboard 53C1010-66
+ 103c 1300 Ultra160 SCSI [AB306A]
+ 103c 1310 Ultra160 SCSI [A9918A]
+ 103c 1330 Ultra160 SCSI [A7059A]
+ 103c 1340 Ultra160 SCSI [A7060A]
+ 124b 1070 PMC-USCSI3
+ 4c53 1080 CT8 mainboard
+ 4c53 1300 P017 mezzanine (32-bit PMC)
+ 4c53 1310 P017 mezzanine (64-bit PMC)
+ 0030 53c1030 PCI-X Fusion-MPT Dual Ultra320 SCSI
+ 0e11 00da ProLiant ML 350
+ 1028 0123 LSI Logic 1020/1030
+ 1028 014a LSI Logic 1020/1030
+ 1028 016c PowerEdge 1850 MPT Fusion SCSI/RAID (Perc 4)
+ 1028 0183 LSI Logic 1020/1030
+ 1028 018a PERC 4/IM
+ 1028 1010 LSI U320 SCSI Controller
+ 103c 12c5 Ultra320 SCSI [A7173A]
+ 103c 1323 Core I/O LAN/SCSI Combo [AB314A]
+ 103c 3108 Single Channel Ultra320 SCSI HBA G2
+ 124b 1170 PMC-USCSI320
+# VMware's emulation of this device. Was missing from the list.
+ 15ad 1976 LSI Logic Parallel SCSI Controller
+ 1734 1052 PRIMERGY BX/RX/TX S2 series onboard SCSI(IME)
+ 0031 53c1030ZC PCI-X Fusion-MPT Dual Ultra320 SCSI
+ 0032 53c1035 PCI-X Fusion-MPT Dual Ultra320 SCSI
+ 1000 1000 LSI53C1020/1030 PCI-X to Ultra320 SCSI Controller
+ 0033 1030ZC_53c1035 PCI-X Fusion-MPT Dual Ultra320 SCSI
+ 0040 53c1035 PCI-X Fusion-MPT Dual Ultra320 SCSI
+ 1000 0033 MegaRAID SCSI 320-2XR
+ 1000 0066 MegaRAID SCSI 320-2XRWS
+ 0041 53C1035ZC PCI-X Fusion-MPT Dual Ultra320 SCSI
+ 0050 SAS1064 PCI-X Fusion-MPT SAS
+ 1028 1f04 SAS 5/E
+ 1028 1f09 SAS 5i/R
+ 0054 SAS1068 PCI-X Fusion-MPT SAS
+ 1028 1f04 SAS 5/E Adapter Controller
+ 1028 1f05 SAS 5/i Adapter Controller
+ 1028 1f06 SAS 5/i Integrated Controller
+ 1028 1f07 SAS 5/iR Integrated RAID Controller
+ 1028 1f08 SAS 5/iR Integrated RAID Controller
+ 1028 1f09 SAS 5/iR Adapter RAID Controller
+ 15ad 1976 SAS Controller
+ 0055 SAS1068 PCI-X Fusion-MPT SAS
+ 1033 8336 SAS1068
+ 0056 SAS1064ET PCI-Express Fusion-MPT SAS
+ 1014 03bb ServeRAID BR10il SAS/SATA Controller v2
+ 0057 M1064E MegaRAID SAS
+ 8086 346c Embedded Software RAID Technology II (ESTRII)
+ 0058 SAS1068E PCI-Express Fusion-MPT SAS
+ 1000 3140 SAS3081E-R 8-Port SAS/SATA Host Bus Adapter
+ 1028 021d SAS 6/iR Integrated Workstations RAID Controller
+ 1028 1f0e SAS 6/iR Adapter RAID Controller
+ 1028 1f0f SAS 6/iR Integrated Blades RAID Controller
+ 1028 1f10 SAS 6/iR Integrated RAID Controller
+ 103c 3229 SC44Ge Host Bus Adapter
+ 0059 MegaRAID SAS 8208ELP/8208ELP
+ 005a SAS1066E PCI-Express Fusion-MPT SAS
+ 005b MegaRAID SAS 2208 [Thunderbolt]
+ 1028 1f2d PERC H810 Adapter
+ 1028 1f30 PERC H710 Embedded
+ 1028 1f31 PERC H710P Adapter
+ 1028 1f33 PERC H710P Mini (for blades)
+ 1028 1f34 PERC H710P Mini (for monolithics)
+ 1028 1f35 PERC H710 Adapter
+ 1028 1f37 PERC H710 Mini (for blades)
+ 1028 1f38 PERC H710 Mini (for monolithics)
+ 005c SAS1064A PCI-X Fusion-MPT SAS
+ 005d MegaRAID SAS-3 3108 [Invader]
+ 005e SAS1066 PCI-X Fusion-MPT SAS
+ 0060 MegaRAID SAS 1078
+ 1000 1006 MegaRAID SAS 8888ELP
+ 1000 100a MegaRAID SAS 8708ELP
+ 1000 100e MegaRAID SAS 8884E
+ 1000 100f MegaRAID SAS 8708E
+ 1000 1010 MegaRAID SATA 350-8ELP
+ 1000 1011 MegaRAID SATA 350-4ELP
+ 1000 1012 MegaRAID SAS 8704ELP
+ 1000 1016 MegaRAID SAS 8880EM2
+ 1014 0363 MegaRAID SAS PCI Express ROMB
+ 1014 0364 SystemX MegaRAID SAS 8808E
+ 1014 0365 SystemX MegaRAID SAS 8884E
+ 1014 0379 SystemX MegaRAID SAS 8880EM2
+ 1028 1f0a PERC 6/E Adapter RAID Controller
+ 1028 1f0b PERC 6/i Adapter RAID Controller
+ 1028 1f0c PERC 6/i Integrated RAID Controller
+ 1028 1f0d PERC 6/i Integrated RAID Controller
+ 1028 1f11 CERC 6/i Integrated RAID Controller
+ 1033 835a MegaRAID SAS PCI Express ROMB
+ 1043 824d MegaRAID SAS PCI Express ROMB
+ 1170 002f MegaRAID SAS PCI Express ROMB
+ 1170 0036 MegaRAID SAS PCI Express ROMB
+ 15d9 c080 MegaRAID SAS PCI Express ROMB
+ 17aa 6b7c MegaRAID SAS PCI Express ROMB
+ 18a1 0003 LSI MegaRAID SAS PCI Express ROMB
+ 8086 1006 RAID Controller SRCSAS28EP
+ 8086 100a RAID Controller SRCSAS28EV
+ 8086 1010 RAID Controller SRCSATA28E
+ 8086 34cc Integrated RAID Controller SROMBSAS28E
+ 8086 34cd Integrated RAID Controller SROMBSAS28E
+ 0062 SAS1078 PCI-Express Fusion-MPT SAS
+ 1000 0062 SAS1078 PCI-Express Fusion-MPT SAS
+ 0064 SAS2116 PCI-Express Fusion-MPT SAS-2 [Meteor]
+ 0065 SAS2116 PCI-Express Fusion-MPT SAS-2 [Meteor]
+ 006e SAS2308 PCI-Express Fusion-MPT SAS-2
+ 0070 SAS2004 PCI-Express Fusion-MPT SAS-2 [Spitfire]
+ 0071 MR SAS HBA
+ 0072 SAS2008 PCI-Express Fusion-MPT SAS-2 [Falcon]
+ 1028 1f1c 6Gbps SAS HBA Adapter
+ 1028 1f1d PERC H200 Adapter
+ 1028 1f1e PERC H200 Integrated
+ 1028 1f1f PERC H200 Modular
+ 1028 1f20 PERC H200 Embedded
+ 1028 1f22 Internal Tape Adapter
+ 8086 350f RMS2LL040 RAID Controller
+ 0073 MegaRAID SAS 9240
+ 1000 9240 MegaRAID SAS 9240-8i
+ 1000 9241 MegaRAID SAS 9240-4i
+ 1014 03b1 ServeRAID M1015 SAS/SATA Controller
+ 1028 1f4e PERC H310 Adapter
+ 1028 1f4f PERC H310 Integrated
+ 1028 1f50 PERC H310 Mini Blades
+ 1028 1f51 PERC H310 Mini Monolithics
+ 1028 1f52 PERC H310 Embedded1
+ 1028 1f53 PERC H310 Embedded2
+ 1028 1f54 PERC H310 Reserved
+ 1054 3035 LSI MegaRAID SAS 9240-8i
+ 1137 0072 2004 iMR ROMB
+ 1137 0073 2008 ROMB
+ 15d9 0400 Supermicro SMC2008-iMR
+ 1734 1177 RAID Ctrl SAS 6G 0/1 (D2607)
+ 8086 350d RMS2AF040 RAID Controller
+ 8086 9240 RAID Controller RS2WC080
+ 8086 9241 RAID Controller RS2WC040
+ 0074 SAS2108 PCI-Express Fusion-MPT SAS-2 [Liberator]
+ 0076 SAS2108 PCI-Express Fusion-MPT SAS-2 [Liberator]
+ 0077 SAS2108 PCI-Express Fusion-MPT SAS-2 [Liberator]
+ 0079 MegaRAID SAS 2108 [Liberator]
+ 1000 9251 MegaRAID SAS 9260-4ix
+ 1000 9256 MegaRAID SAS 9260-8ix
+ 1000 9260 MegaRAID SAS 9260-4i
+ 1000 9261 MegaRAID SAS 9260-8i
+ 1000 9262 MegaRAID SAS 9262-8i
+ 1000 9263 MegaRAID SAS 9261-8i
+ 1000 9264 MegaRAID SAS 9264-8i
+ 1000 9275 MegaRAID SAS 9280-8ex
+ 1000 9276 MR9260-16i
+ 1000 9280 MegaRAID SAS 9280-8e
+ 1000 9281 MegaRAID SAS 9281-8E
+ 1000 9282 MegaRAID SAS 9280-4i4e
+ 1000 9290 MegaRAID SAS 9280DE-24i4e
+ 1014 03b2 ServeRAID M5015 SAS/SATA Controller
+ 1014 03b3 ServeRAID M5025 SAS/SATA Controller
+ 1028 1f15 PERC H800 Adapter
+ 1028 1f16 PERC H700 Adapter
+ 1028 1f17 PERC H700 Integrated
+ 1028 1f18 PERC H700 Modular
+ 1028 1f1a PERC H800 Proto Adapter
+ 1028 1f1b PERC H700 Integrated
+ 1043 8480 PIKE-2108 16PD
+ 1734 1176 RAID Ctrl SAS 6G 5/6 512MB (D2616)
+ 1734 1177 RAID Ctrl SAS 6G 0/1 (D2607)
+ 8086 9256 MegaRAID SAS 9260DE-8i
+ 8086 9260 RAID Controller RS2BL040
+ 8086 9261 RAID Controller RS2BL080
+ 8086 9264 Warm Beach (Caster Lite)
+ 8086 9267 RAID Controller RS2VB040
+ 8086 9268 RAID Controller RS2VB080
+ 007c MegaRAID SAS 1078DE
+ 1014 0395 ServeRAID-AR10is SAS/SATA Controller
+ 007e SSS6200 PCI-Express Flash SSD
+ 0080 SAS2208 PCI-Express Fusion-MPT SAS-2
+ 0081 SAS2208 PCI-Express Fusion-MPT SAS-2
+ 0082 SAS2208 PCI-Express Fusion-MPT SAS-2
+ 0083 SAS2208 PCI-Express Fusion-MPT SAS-2
+ 0084 SAS2208 PCI-Express Fusion-MPT SAS-2
+ 0085 SAS2208 PCI-Express Fusion-MPT SAS-2
+ 0086 SAS2308 PCI-Express Fusion-MPT SAS-2
+ 0087 SAS2308 PCI-Express Fusion-MPT SAS-2
+ 008f 53c875J
+ 1092 8000 FirePort 40 SCSI Controller
+ 1092 8760 FirePort 40 Dual SCSI Host Adapter
+ 0090 SAS3108 PCI-Express Fusion-MPT SAS-3
+ 0091 SAS3108 PCI-Express Fusion-MPT SAS-3
+ 0094 SAS3108 PCI-Express Fusion-MPT SAS-3
+ 0095 SAS3108 PCI-Express Fusion-MPT SAS-3
+ 0096 SAS3004 PCI-Express Fusion-MPT SAS-3
+ 0097 SAS3008 PCI-Express Fusion-MPT SAS-3
+ 0407 MegaRAID
+ 1000 0530 MegaRAID 530 SCSI 320-0X RAID Controller
+ 1000 0531 MegaRAID 531 SCSI 320-4X RAID Controller
+ 1000 0532 MegaRAID 532 SCSI 320-2X RAID Controller
+ 1028 0531 PowerEdge Expandable RAID Controller 4/QC
+ 1028 0533 PowerEdge Expandable RAID Controller 4/QC
+ 8086 0530 MegaRAID Intel RAID Controller SRCZCRX
+ 8086 0532 MegaRAID Intel RAID Controller SRCU42X
+ 0408 MegaRAID
+ 1000 0001 MegaRAID SCSI 320-1E RAID Controller
+ 1000 0002 MegaRAID SCSI 320-2E RAID Controller
+ 1025 004d MegaRAID ACER ROMB-2E RAID Controller
+ 1028 0001 PowerEdge RAID Controller PERC4e/SC
+ 1028 0002 PowerEdge RAID Controller PERC4e/DC
+ 1028 0012 PowerEdge RAID Controller RAC4
+ 1028 0015 PowerEdge RAID Controller PERC5
+ 1028 1f03 PowerEdge RAID Controller PERC5
+ 1734 1065 FSC MegaRAID PCI Express ROMB
+ 8086 0002 MegaRAID Intel RAID Controller SRCU42E
+ 8086 3449 MegaRAID Intel RAID Controller SROMBU
+ 0409 MegaRAID
+ 1000 3004 MegaRAID SATA 300-4X RAID Controller
+ 1000 3008 MegaRAID SATA 300-8X RAID Controller
+ 8086 3008 MegaRAID RAID Controller SRCS28X
+ 8086 3431 MegaRAID RAID Controller Alief SROMBU42E
+ 8086 3499 MegaRAID RAID Controller Harwich SROMBU42E
+ 0411 MegaRAID SAS
+ 1000 1001 MegaRAID SAS 8408E
+ 1000 1002 MegaRAID SAS 8480E
+ 1000 1003 MegaRAID SAS 8344ELP
+ 1000 1004 MegaRAID SAS 8308ELP
+ 1000 1008 MegaRAID SAS 84016E
+ 1000 100c MegaRAID SATA 300-12E
+ 1000 100d MegaRAID SATA 300-16E
+ 1000 2004 MegaRAID SATA 300-8ELP
+ 1000 2005 MegaRAID SATA 300-4ELP
+ 1033 8287 MegaRAID SAS PCI Express ROMB
+ 1054 3016 MegaRAID SAS RoMB Server
+ 1734 1081 MegaRAID SAS PCI Express ROMB
+ 1734 10a3 MegaRAID SAS PCI Express ROMB
+ 8086 1001 RAID Controller SRCSAS18E
+ 8086 1003 RAID Controller SRCSAS144E
+ 8086 3500 SROMBSAS18E RAID Controller
+ 8086 3501 SROMBSAS18E RAID Controller
+ 8086 3504 SROMBSAS18E RAID Controller
+ 0413 MegaRAID SAS Verde ZCR
+ 1000 1005 MegaRAID SAS 8300XLP
+ 0621 FC909 Fibre Channel Adapter
+ 0622 FC929 Fibre Channel Adapter
+ 1000 1020 44929 O Dual Fibre Channel card
+ 0623 FC929 LAN
+ 0624 FC919 Fibre Channel Adapter
+ 0625 FC919 LAN
+ 0626 FC929X Fibre Channel Adapter
+ 1000 1010 7202-XP-LC Dual Fibre Channel card
+ 0627 FC929X LAN
+ 0628 FC919X Fibre Channel Adapter
+ 0629 FC919X LAN
+ 0640 FC949X Fibre Channel Adapter
+ 0642 FC939X Fibre Channel Adapter
+ 0646 FC949ES Fibre Channel Adapter
+ 0701 83C885 NT50 DigitalScape Fast Ethernet
+ 0702 Yellowfin G-NIC gigabit ethernet
+ 1318 0000 PEI100X
+ 0804 SA2010
+ 0805 SA2010ZC
+ 0806 SA2020
+ 0807 SA2020ZC
+ 0901 61C102
+ 1000 63C815
+ 1960 MegaRAID
+ 1000 0518 MegaRAID 518 SCSI 320-2 Controller
+ 1000 0520 MegaRAID 520 SCSI 320-1 Controller
+ 1000 0522 MegaRAID 522 i4 133 RAID Controller
+ 1000 0523 MegaRAID SATA 150-6 RAID Controller
+ 1000 4523 MegaRAID SATA 150-4 RAID Controller
+ 1000 a520 MegaRAID ZCR SCSI 320-0 Controller
+ 1028 0518 MegaRAID 518 DELL PERC 4/DC RAID Controller
+ 1028 0520 MegaRAID 520 DELL PERC 4/SC RAID Controller
+ 1028 0531 PowerEdge Expandable RAID Controller 4/QC
+ 1028 0533 PowerEdge Expandable RAID Controller 4/QC
+ 8086 0520 MegaRAID RAID Controller SRCU41L
+ 8086 0523 MegaRAID RAID Controller SRCS16
+ 6001 DX1 Multiformat Broadcast HD/SD Encoder/Decoder
+1001 Kolter Electronic
+ 0010 PCI 1616 Measurement card with 32 digital I/O lines
+ 0011 OPTO-PCI Opto-Isolated digital I/O board
+ 0012 PCI-AD/DA Analogue I/O board
+ 0013 PCI-OPTO-RELAIS Digital I/O board with relay outputs
+ 0014 PCI-Counter/Timer Counter Timer board
+ 0015 PCI-DAC416 Analogue output board
+ 0016 PCI-MFB Analogue I/O board
+ 0017 PROTO-3 PCI Prototyping board
+ 9100 INI-9100/9100W SCSI Host
+1002 ATI Technologies Inc
+ 1314 Wrestler HDMI Audio [Radeon HD 6250/6310]
+ 3150 M24 1P [Radeon Mobility X600]
+ 103c 0934 nx8220
+ 3151 M24 [FireMV 2400]
+ 3152 M22 [Radeon Mobility X300]
+ 3154 M24GL [Mobility FireGL V3200]
+ 3171 M24 [FireMV 2400] (Secondary)
+ 3e50 RV380 0x3e50 [Radeon X600]
+ 3e54 RV380 0x3e54 [FireGL V3200]
+ 3e70 RV380 [Radeon X600] (Secondary)
+ 4136 Radeon IGP 320 M
+ 4137 Radeon IGP330/340/350
+ 4144 R300 AD [Radeon 9500 Pro]
+ 4145 R300 AE [Radeon 9700 Pro]
+ 4146 R300 AF [Radeon 9700 Pro]
+ 4147 R300 AG [FireGL Z1/X1]
+ 4148 R350 AH [Radeon 9800]
+ 4149 R350 AI [Radeon 9800]
+ 414a R350 AJ [Radeon 9800]
+ 414b R350 AK [FireGL X2]
+ 4150 RV350 AP [Radeon 9600]
+ 1002 0002 R9600 Pro primary (Asus OEM for HP)
+ 1002 0003 R9600 Pro secondary (Asus OEM for HP)
+ 1002 4722 All-in-Wonder 2006 AGP Edition
+ 1458 4024 Giga-Byte GV-R96128D (Primary)
+ 148c 2064 PowerColor R96A-C3N
+ 148c 2066 PowerColor R96A-C3N
+ 174b 7c19 Sapphire Atlantis Radeon 9600 Pro
+ 174b 7c29 GC-R9600PRO [Sapphire] (Primary)
+ 17ee 2002 Radeon 9600 256Mb Primary
+ 18bc 0101 GC-R9600PRO (Primary)
+ 4151 RV350 AQ [Radeon 9600]
+ 1043 c004 A9600SE
+ 4152 RV350 AR [Radeon 9600]
+ 1002 0002 Radeon 9600XT
+ 1002 4772 All-in-Wonder 9600 XT
+ 1043 c002 Radeon 9600 XT TVD
+ 1043 c01a A9600XT/TD
+ 174b 7c29 Sapphire Radeon 9600XT
+ 1787 4002 Radeon 9600 XT
+ 4153 RV350 AS [Radeon 9550]
+ 1043 010c A9550GE/TD
+ 1462 932c RX9550SE-TD128 (MS-8932)
+ 4154 RV350 AT [FireGL T2]
+ 4155 RV350 AU [FireGL T2]
+ 4156 RV350 AV [FireGL T2]
+ 4157 RV350 AW [FireGL T2]
+ 4158 68800AX [Mach32]
+ 4164 R300 AD [Radeon 9500 Pro] (Secondary)
+ 4165 R300 AE [Radeon 9700 Pro] (Secondary)
+ 4166 R300 AF [Radeon 9700 Pro] (Secondary)
+ 4168 Radeon R350 [Radeon 9800] (Secondary)
+ 4170 RV350 AP [Radeon 9600] (Secondary)
+ 1002 0003 R9600 Pro secondary (Asus OEM for HP)
+ 1002 4723 All-in-Wonder 2006 AGP Edition (Secondary)
+ 1458 4025 Giga-Byte GV-R96128D (Secondary)
+ 148c 2067 PowerColor R96A-C3N (Secondary)
+ 174b 7c28 GC-R9600PRO [Sapphire] (Secondary)
+ 17ee 2003 Radeon 9600 256Mb (Secondary)
+ 18bc 0100 GC-R9600PRO (Secondary)
+ 4171 RV350 AQ [Radeon 9600] (Secondary)
+ 1043 c005 A9600SE (Secondary)
+ 4172 RV350 AR [Radeon 9600] (Secondary)
+ 1002 0003 Radeon 9600XT (Secondary)
+ 1002 4773 All-in-Wonder 9600 XT (Secondary)
+ 1043 c003 A9600XT (Secondary)
+ 1043 c01b A9600XT/TD (Secondary)
+ 174b 7c28 Sapphire Radeon 9600XT (Secondary)
+ 1787 4003 Radeon 9600 XT (Secondary)
+ 4173 RV350 AS [Radeon 9550] (Secondary)
+ 1043 010d A9550GE/TD (Secondary)
+ 4237 Radeon 7000 IGP
+ 4242 R200 BB [Radeon All in Wonder 8500DV]
+ 1002 02aa Radeon 8500 AIW DV Edition
+ 4243 R200 BC [Radeon All in Wonder 8500]
+ 4336 Radeon Mobility U1
+ 1002 4336 Pavilion ze4300 ATI Radeon Mobility U1 (IGP 320 M)
+ 103c 0024 Pavilion ze4400 builtin Video
+ 161f 2029 eMachines M5312 builtin Video
+ 4337 Radeon IGP 330M/340M/350M
+ 1014 053a ThinkPad R40e
+ 103c 0850 Radeon IGP 345M
+ 4341 IXP150 AC'97 Audio Controller
+ 4342 IXP200 3COM 3C920B Ethernet Controller
+ 4345 EHCI USB Controller
+ 4347 OHCI USB Controller #1
+ 4348 OHCI USB Controller #2
+ 4349 Dual Channel Bus Master PCI IDE Controller
+ 434d IXP AC'97 Modem
+ 4353 SMBus
+ 4354 215CT [Mach64 CT]
+ 4358 210888CX [Mach64 CX]
+ 4361 IXP SB300 AC'97 Audio Controller
+ 4363 SMBus
+ 436e 436E Serial ATA Controller
+ 4370 IXP SB400 AC'97 Audio Controller
+ 1025 0079 Aspire 5024WLMMi
+ 1025 0091 Aspire 5032WXMi
+ 103c 2a05 Pavilion t3030.de Desktop PC
+ 103c 308b MX6125
+ 105b 0c81 Realtek ALC 653
+ 107b 0300 MX6421
+ 1462 0131 MS-1013 Notebook
+ 4371 IXP SB400 PCI-PCI Bridge
+ 103c 308b MX6125
+ 1462 7217 Aspire L250
+ 4372 IXP SB400 SMBus Controller
+ 1025 0080 Aspire 5024WLMMi
+ 103c 2a20 Pavilion t3030.de Desktop PC
+ 103c 308b MX6125
+ 1462 0131 MS-1013 Notebook
+ 1462 7217 Aspire L250
+ 4373 IXP SB400 USB2 Host Controller
+ 1025 0080 Aspire 5024WLMMi
+ 103c 2a20 Pavilion t3030.de Desktop PC
+ 103c 308b MX6125
+ 1462 7217 Aspire L250
+ 4374 IXP SB400 USB Host Controller
+ 103c 2a20 Pavilion t3030.de Desktop PC
+ 103c 308b MX6125
+ 1462 7217 Aspire L250
+ 4375 IXP SB400 USB Host Controller
+ 1025 0080 Aspire 5024WLMMi
+ 103c 2a20 Pavilion t3030.de Desktop PC
+ 103c 308b MX6125
+ 1462 7217 Aspire L250
+ 4376 IXP SB400 IDE Controller
+ 1025 0080 Aspire 5024WLMMi
+ 103c 2a20 Pavilion t3030.de Desktop PC
+ 103c 308b MX6125
+ 1462 0131 MS-1013 Notebook
+ 1462 7217 Aspire L250
+ 4377 IXP SB400 PCI-ISA Bridge
+ 1025 0080 Aspire 5024WLMi
+ 103c 2a20 Pavilion t3030.de Desktop PC
+ 103c 308b MX6125
+ 1462 7217 Aspire L250
+ 4378 SB400 AC'97 Modem Controller
+ 1025 0080 Aspire 5024WLMMi
+ 103c 308b MX6125
+ 1462 0131 MS-1013 Notebook
+ 4379 IXP SB400 Serial ATA Controller
+ 1462 7141 Aspire L250
+ 437a IXP SB400 Serial ATA Controller
+ 1002 4379 4379 Serial ATA Controller
+ 1002 437a 437A Serial ATA Controller
+ 1462 7141 Aspire L250
+ 14f1 8800 Leadtek WinFast TV2000XP Expert
+ 437b IXP SB4x0 High Definition Audio Controller
+ 1002 437b IXP SB4x0 High Definition Audio Controller
+ 10cf 1326 Fujitsu Lifebook A3040
+ 1734 10b8 Realtek High Definition Audio
+ 4380 SB600 Non-Raid-5 SATA
+ 103c 2813 DC5750 Microtower
+ 1179 ff50 Satellite P305D-S8995E
+ 1458 b003 GA-MA790FX-DS5 (rev. 1.0)
+ 1458 b005 Gigabyte GA-MA69G-S3H Motherboard
+ 1462 7327 K9AG Neo2
+ 17f2 5999 KI690-AM2 Motherboard
+ 4381 SB600 Raid-5 SATA
+ 4382 SB600 AC97 Audio
+ 4383 SBx00 Azalia (Intel HDA)
+ 103c 1611 Pavilion DM1Z-3000
+ 103c 280a DC5750 Microtower
+ 1043 8230 M3A78-EH Motherboard
+ 1043 836c M4A785TD Motherboard
+ 1043 8410 M4A89GTD PRO/USB3 Motherboard
+ 1043 841b M5A88-V EVO
+ 1179 ff50 Satellite P305D-S8995E
+ 1458 a022 GA-MA770-DS3rev2.0 Motherboard
+ 17f2 5000 KI690-AM2 Motherboard
+ 4384 SBx00 PCI to PCI Bridge
+ 4385 SBx00 SMBus Controller
+ 103c 1611 Pavilion DM1Z-3000
+ 103c 280a DC5750 Microtower
+ 1043 82ef M3A78-EH Motherboard
+ 1043 8389 M4A785TD Motherboard
+ 1179 ff50 Satellite P305D-S8995E
+ 1458 4385 GA-MA770-DS3rev2.0 Motherboard
+ 1462 7368 K9AG Neo2
+ 17f2 5000 KI690-AM2 Motherboard
+ 4386 SB600 USB Controller (EHCI)
+ 103c 280a DC5750 Microtower
+ 1179 ff50 Satellite P305D-S8995E
+ 1462 7368 K9AG Neo2
+ 17f2 5000 KI690-AM2 Motherboard
+ 4387 SB600 USB (OHCI0)
+ 103c 280a DC5750 Microtower
+ 1179 ff50 Satellite P305D-S8995E
+ 1462 7368 K9AG Neo2
+ 17f2 5000 KI690-AM2 Motherboard
+ 4388 SB600 USB (OHCI1)
+ 103c 280a DC5750 Microtower
+ 1179 ff50 Satellite P305D-S8995E
+ 1462 7368 K9AG Neo2
+ 17f2 5000 KI690-AM2 Motherboard
+ 4389 SB600 USB (OHCI2)
+ 103c 280a DC5750 Microtower
+ 1179 ff50 Satellite P305D-S8995E
+ 1462 7368 K9AG Neo2
+ 17f2 5000 KI690-AM2 Motherboard
+ 438a SB600 USB (OHCI3)
+ 103c 280a DC5750 Microtower
+ 1179 ff50 Satellite P305D-S8995E
+ 1462 7368 K9AG Neo2
+ 17f2 5000 KI690-AM2 Motherboard
+ 438b SB600 USB (OHCI4)
+ 103c 280a DC5750 Microtower
+ 1179 ff50 Satellite P305D-S8995E
+ 1462 7368 K9AG Neo2
+ 17f2 5000 KI690-AM2 Motherboard
+ 438c SB600 IDE
+ 103c 280a DC5750 Microtower
+ 1179 ff50 Satellite P305D-S8995E
+ 1458 5002 Gigabyte GA-MA69G-S3H Motherboard
+ 1462 7368 K9AG Neo2
+ 17f2 5000 KI690-AM2 Motherboard
+ 438d SB600 PCI to LPC Bridge
+ 103c 280a DC5750 Microtower
+ 1179 ff50 Satellite P305D-S8995E
+ 1462 7368 K9AG Neo2
+ 17f2 5000 KI690-AM2 Motherboard
+ 438e SB600 AC97 Modem
+ 4390 SB7x0/SB8x0/SB9x0 SATA Controller [IDE mode]
+ 1043 82ef M3A78-EH Motherboard
+ 1043 8389 M4A785TD Motherboard
+ 1458 b002 GA-MA770-DS3rev2.0 Motherboard
+ 1849 4390 Motherboard (one of many)
+ 4391 SB7x0/SB8x0/SB9x0 SATA Controller [AHCI mode]
+ 103c 1611 Pavilion DM1Z-3000
+ 1043 82ef M3A78-EH Motherboard
+ 1043 8443 M5A88-V EVO
+ 4392 SB7x0/SB8x0/SB9x0 SATA Controller [Non-RAID5 mode]
+ 4393 SB7x0/SB8x0/SB9x0 SATA Controller [RAID5 mode]
+ 4394 SB7x0/SB8x0/SB9x0 SATA Controller [AHCI mode]
+ 4395 SB8x0/SB9x0 SATA Controller [Storage mode]
+ 4396 SB7x0/SB8x0/SB9x0 USB EHCI Controller
+ 103c 1611 Pavilion DM1Z-3000
+ 1043 82ef M3A78-EH Motherboard
+ 1043 8443 M5A88-V EVO
+ 4397 SB7x0/SB8x0/SB9x0 USB OHCI0 Controller
+ 103c 1611 Pavilion DM1Z-3000
+ 1043 82ef M3A78-EH Motherboard
+ 1043 8443 M5A88-V EVO
+ 4398 SB7x0 USB OHCI1 Controller
+ 1043 82ef M3A78-EH Motherboard
+ 4399 SB7x0/SB8x0/SB9x0 USB OHCI2 Controller
+ 1043 82ef M3A78-EH Motherboard
+ 1043 8443 M5A88-V EVO
+ 439c SB7x0/SB8x0/SB9x0 IDE Controller
+ 1043 82ef M3A78-EH Motherboard
+ 439d SB7x0/SB8x0/SB9x0 LPC host controller
+ 103c 1611 Pavilion DM1Z-3000
+ 1043 82ef M3A78-EH Motherboard
+ 1043 8443 M5A88-V EVO
+ 43a0 SB700/SB800 PCI to PCI bridge (PCIE port 0)
+ 43a1 SB700/SB800 PCI to PCI bridge (PCIE port 1)
+ 4437 Radeon Mobility 7000 IGP
+ 4554 210888ET [Mach64 ET]
+ 4654 Mach64 VT
+ 4742 3D Rage Pro AGP 1X/2X
+ 1002 0040 Rage Pro Turbo AGP 2X
+ 1002 0044 Rage Pro Turbo AGP 2X
+ 1002 0061 Rage Pro AIW AGP 2X
+ 1002 0062 Rage Pro AIW AGP 2X
+ 1002 0063 Rage Pro AIW AGP 2X
+ 1002 0080 Rage Pro Turbo AGP 2X
+ 1002 0084 Rage Pro Turbo AGP 2X
+ 1002 4742 Rage Pro Turbo AGP 2X
+ 1002 8001 Rage Pro Turbo AGP 2X
+ 1028 0082 Rage Pro Turbo AGP 2X
+ 1028 4082 Optiplex GX1 Onboard Display Adapter
+ 1028 8082 Rage Pro Turbo AGP 2X
+ 1028 c082 Rage Pro Turbo AGP 2X
+ 8086 4152 Xpert 98D AGP 2X
+ 8086 464a Rage Pro Turbo AGP 2X
+ 4744 3D Rage Pro AGP 1X
+ 1002 4744 Rage Pro Turbo AGP
+ 8086 4d55 Rage 3D Pro AGP 1X [Intel MU440EX]
+ 4747 3D Rage Pro
+ 4749 3D Rage Pro
+ 1002 0061 Rage Pro AIW
+ 1002 0062 Rage Pro AIW
+ 474c Rage XC
+ 474d Rage XL AGP 2X
+ 1002 0004 Xpert 98 RXL AGP 2X
+ 1002 0008 Xpert 98 RXL AGP 2X
+ 1002 0080 Rage XL AGP 2X
+ 1002 0084 Xpert 98 AGP 2X
+ 1002 474d Rage XL AGP
+ 1033 806a Rage XL AGP
+ 474e Rage XC AGP
+ 1002 474e Rage XC AGP
+ 474f Rage XL
+ 1002 0008 Rage XL
+ 1002 474f Rage XL
+ 4750 3D Rage Pro 215GP
+ 1002 0040 Rage Pro Turbo
+ 1002 0044 Rage Pro Turbo
+ 1002 0080 Rage Pro Turbo
+ 1002 0084 Rage Pro Turbo
+ 1002 4750 Rage Pro Turbo
+ 4751 3D Rage Pro 215GQ
+ 4752 Rage XL
+ 0e11 001e Proliant Rage XL
+ 1002 0008 Rage XL
+ 1002 4752 Proliant Rage XL
+ 1002 8008 Rage XL
+ 1014 0240 eServer xSeries server mainboard
+ 1028 00ce PowerEdge 1400
+ 1028 00d1 PowerEdge 2550
+ 1028 00d9 PowerEdge 2500
+ 1028 0134 PowerEdge 600SC
+ 1028 014a PowerEdge 1750
+ 1028 0165 PowerEdge 750
+ 103c 10e1 NetServer Rage XL
+ 107b 6400 6400 Server
+ 1734 007a PRIMERGY RX/TX series onboard VGA
+ 8086 3411 SDS2 Mainboard
+ 8086 3427 S875WP1-E mainboard
+ 8086 5744 S845WD1-E mainboard
+ 4753 Rage XC
+ 1002 4753 Rage XC
+ 4754 3D Rage I/II 215GT [Mach64 GT]
+ 4755 3D Rage II+ 215GTB [Mach64 GTB]
+ 4756 3D Rage IIC 215IIC [Mach64 GT IIC]
+ 1002 4756 Rage IIC
+ 4757 3D Rage IIC AGP
+ 1002 4757 Rage IIC AGP
+ 1028 0089 Rage 3D IIC
+ 1028 008e PowerEdge 1300 onboard video
+ 1028 4082 Rage 3D IIC
+ 1028 8082 Rage 3D IIC
+ 1028 c082 Rage 3D IIC
+ 4758 210888GX [Mach64 GX]
+ 4759 3D Rage IIC
+ 475a 3D Rage IIC AGP
+ 1002 0084 Rage 3D Pro AGP 2x XPERT 98
+ 1002 0087 Rage 3D IIC
+ 1002 475a Rage IIC AGP
+ 4964 Radeon RV250 Id [Radeon 9000]
+ 4965 Radeon RV250 Ie [Radeon 9000]
+ 4966 Radeon RV250 If [Radeon 9000]
+ 10f1 0002 RV250 If [Tachyon G9000 PRO]
+ 148c 2039 RV250 If [Radeon 9000 Pro "Evil Commando"]
+ 1509 9a00 RV250 If [Radeon 9000 "AT009"]
+ 1681 0040 RV250 If [3D prophet 9000]
+ 174b 7176 RV250 If [Sapphire Radeon 9000 Pro]
+ 174b 7192 RV250 If [Radeon 9000 "Atlantis"]
+ 17af 2005 RV250 If [Excalibur Radeon 9000 Pro]
+ 17af 2006 RV250 If [Excalibur Radeon 9000]
+ 4967 Radeon RV250 Ig [Radeon 9000]
+ 496e Radeon RV250 [Radeon 9000] (Secondary)
+ 4a48 R420 JH [Radeon X800]
+ 4a49 R420 JI [Radeon X800PRO]
+ 4a4a R420 JJ [Radeon X800SE]
+ 4a4b R420 JK [Radeon X800]
+ 4a4c R420 JL [Radeon X800]
+ 4a4d R420 JM [FireGL X3]
+ 4a4e M18 JN [Radeon Mobility 9800]
+ 4a4f Radeon X800 SE (R420) (AGP)
+ 4a50 R420 JP [Radeon X800XT]
+ 4a54 R420 [Radeon X800 VE]
+ 4a69 R420 [Radeon X800 PRO/GTO] (Secondary)
+ 4a6a R420 [Radeon X800] (Secondary)
+ 4a6b R420 [Radeon X800] (Secondary)
+ 4a70 R420 [X800XT-PE] (Secondary)
+ 4a74 R420 [Radeon X800 VE] (Secondary)
+ 4b48 Radeon X850 Consumer (R481)
+ 4b49 R480 [Radeon X850XT]
+ 4b4a Radeon X850 SE (R480) (AGP)
+ 4b4b R480 [Radeon X850Pro]
+ 4b4c R481 [Radeon X850XT-PE]
+ 4b69 R480 [Radeon X850XT] (Secondary)
+ 4b6b R480 [Radeon X850Pro] (Secondary)
+ 4b6c R481 [Radeon X850XT-PE] (Secondary)
+ 4c42 3D Rage LT Pro AGP-133
+ 0e11 b0e7 Rage LT Pro (Compaq Presario 5240)
+ 0e11 b0e8 Rage 3D LT Pro
+ 0e11 b10e 3D Rage LT Pro (Compaq Armada 1750)
+ 1002 0040 Rage LT Pro AGP 2X
+ 1002 0044 Rage LT Pro AGP 2X
+ 1002 4c42 Rage LT Pro AGP 2X
+ 1002 8001 Rage LT Pro AGP 2X
+ 1028 0085 Rage 3D LT Pro
+ 4c44 3D Rage LT Pro AGP-66
+ 4c45 Rage Mobility M3 AGP
+ 4c46 Rage Mobility M3 AGP 2x
+ 1002 0155 IBM Thinkpad A22p
+ 1014 0155 IBM Thinkpad A22p
+ 1028 00b1 Latitude C600
+ 4c47 3D Rage LT-G 215LG
+ 4c49 3D Rage LT Pro
+ 1002 0004 Rage LT Pro
+ 1002 0040 Rage LT Pro
+ 1002 0044 Rage LT Pro
+ 1002 4c49 Rage LT Pro
+ 4c4d Rage Mobility P/M AGP 2x
+ 0e11 b111 Armada M700
+ 0e11 b160 Armada E500
+ 1002 0084 Xpert 98 AGP 2X (Mobility)
+ 1014 0154 ThinkPad A20m/A21m
+ 1028 00aa Latitude CPt
+ 1028 00bb Latitude CPx
+ 1179 ff00 Satellite 1715XCDS laptop
+ 13bd 1019 PC-AR10
+ 4c4e Rage Mobility L AGP 2x
+ 4c50 3D Rage LT Pro
+ 1002 4c50 Rage LT Pro
+ 4c51 3D Rage LT Pro
+ 4c52 Rage Mobility P/M
+ 1033 8112 Versa Note VXi
+ 4c53 Rage Mobility L
+ 4c54 264LT [Mach64 LT]
+ 4c57 Radeon Mobility M7 LW [Radeon Mobility 7500]
+ 1014 0517 ThinkPad T30
+ 1014 0530 ThinkPad T42 2373-4WU
+ 1028 00e6 Radeon Mobility M7 LW (Dell Inspiron 8100)
+ 1028 012a Latitude C640
+ 1043 1622 Mobility Radeon M7 (L3C/S)
+ 144d c006 Radeon Mobility M7 LW in vpr Matrix 170B4
+ 4c58 Radeon RV200 LX [Mobility FireGL 7800 M7]
+ 4c59 Radeon Mobility M6 LY
+ 0e11 b111 Evo N600c
+ 1014 0235 ThinkPad A30/A30p (2652/2653)
+ 1014 0239 ThinkPad X22/X23/X24
+ 103c 0025 XE4500 Notebook
+ 104d 80e7 VAIO PCG-GR214EP/GR214MP/GR215MP/GR314MP/GR315MP
+ 104d 8140 PCG-Z1SP laptop
+ 1509 1930 Medion MD9703
+ 4c5a Radeon Mobility M6 LZ
+ 4c64 Radeon RV250 Ld [Radeon Mobility 9000 M9]
+ 4c65 Radeon RV250 Le [Radeon Mobility 9000 M9]
+ 4c66 Radeon RV250 [Mobility FireGL 9000]
+ 1014 054d ThinkPad T41
+ 4c67 Radeon RV250 Lg [Radeon Mobility 9000 M9]
+# Secondary chip to the Lf
+ 4c6e Radeon RV250 Ln [Radeon Mobility 9000 M9] (Secondary)
+ 4d46 Rage Mobility M4 AGP
+ 4d4c Rage Mobility M4 AGP
+ 4d52 Theater 550 PRO PCI [ATI TV Wonder 550]
+ 4d53 Theater 550 PRO PCIe
+ 4e44 Radeon R300 ND [Radeon 9700 Pro]
+ 1002 515e Radeon ES1000
+ 1002 5965 Radeon ES1000
+ 4e45 Radeon R300 NE [Radeon 9500 Pro]
+ 1002 0002 Radeon R300 NE [Radeon 9500 Pro]
+ 1681 0002 Hercules 3D Prophet 9500 PRO [Radeon 9500 Pro]
+ 4e46 R300 NF [Radeon 9600 TX]
+ 4e47 Radeon R300 NG [FireGL X1]
+ 4e48 Radeon R350 [Radeon 9800 Pro]
+ 4e49 Radeon R350 [Radeon 9800]
+ 4e4a R360 NJ [Radeon 9800 XT]
+ 1002 4e4a R360 [Radeon 9800 XT]
+ 4e4b R350 NK [FireGL X2]
+ 4e50 RV350 [Mobility Radeon 9600 M10]
+ 1025 005a TravelMate 290
+ 103c 088c NC8000 laptop
+ 103c 0890 NC6000 laptop
+ 144d c00c P35 notebook
+ 1462 0311 MSI M510A
+ 1734 1055 Amilo M1420W
+ 4e51 M10 NQ [Radeon Mobility 9600]
+ 4e52 RV350 [Mobility Radeon 9600 M10]
+ 144d c00c P35 notebook
+ 4e53 M10 NS [Radeon Mobility 9600]
+ 4e54 M10 NT [FireGL Mobility T2]
+ 4e56 M11 NV [FireGL Mobility T2e]
+ 4e64 Radeon R300 [Radeon 9700 Pro] (Secondary)
+ 4e65 Radeon R300 [Radeon 9500 Pro] (Secondary)
+ 1002 0003 Radeon R300 NE [Radeon 9500 Pro]
+ 1681 0003 Hercules 3D Prophet 9500 PRO [Radeon 9500 Pro] (Secondary)
+ 4e66 RV350 NF [Radeon 9600] (Secondary)
+ 4e67 Radeon R300 [FireGL X1] (Secondary)
+ 4e68 Radeon R350 [Radeon 9800 Pro] (Secondary)
+ 4e69 Radeon R350 [Radeon 9800] (Secondary)
+ 4e6a RV350 NJ [Radeon 9800 XT] (Secondary)
+ 1002 4e6a R360 [Radeon 9800 XT] (Secondary)
+ 1002 4e71 M10 NQ [Radeon Mobility 9600]
+ 4e71 M10 NQ [Radeon Mobility 9600] (Secondary)
+ 4f72 RV250 [Radeon 9000 Series]
+ 4f73 Radeon RV250 [Radeon 9000 Series] (Secondary)
+ 5041 Rage 128 PA/PRO
+ 5042 Rage 128 PB/PRO AGP 2x
+ 5043 Rage 128 PC/PRO AGP 4x
+ 5044 Rage 128 PD/PRO TMDS
+ 1002 0028 Rage 128 AIW
+ 1002 0029 Rage 128 AIW
+ 5045 Rage 128 PE/PRO AGP 2x TMDS
+ 5046 Rage 128 PF/PRO AGP 4x TMDS
+ 1002 0004 Rage Fury Pro
+ 1002 0008 Rage Fury Pro/Xpert 2000 Pro
+ 1002 0014 Rage Fury Pro
+ 1002 0018 Rage Fury Pro/Xpert 2000 Pro
+ 1002 0028 Rage 128 Pro AIW AGP
+ 1002 002a Rage 128 Pro AIW AGP
+ 1002 0048 Rage Fury Pro
+ 1002 2000 Rage Fury MAXX AGP 4x (TMDS) (VGA device)
+ 1002 2001 Rage Fury MAXX AGP 4x (TMDS) (Extra device?!)
+ 5047 Rage 128 PG/PRO
+ 5048 Rage 128 PH/PRO AGP 2x
+ 5049 Rage 128 PI/PRO AGP 4x
+ 504a Rage 128 PJ/PRO TMDS
+ 504b Rage 128 PK/PRO AGP 2x TMDS
+ 504c Rage 128 PL/PRO AGP 4x TMDS
+ 504d Rage 128 PM/PRO
+ 504e Rage 128 PN/PRO AGP 2x
+ 504f Rage 128 PO/PRO AGP 4x
+ 5050 Rage 128 PP/PRO TMDS [Xpert 128]
+ 1002 0008 Xpert 128
+ 5051 Rage 128 PQ/PRO AGP 2x TMDS
+ 5052 Rage 128 PR/PRO AGP 4x TMDS
+ 5053 Rage 128 PS/PRO
+ 5054 Rage 128 PT/PRO AGP 2x
+ 5055 Rage 128 PU/PRO AGP 4x
+ 5056 Rage 128 PV/PRO TMDS
+ 5057 Rage 128 PW/PRO AGP 2x TMDS
+ 5058 Rage 128 PX/PRO AGP 4x TMDS
+ 5144 Radeon R100 QD [Radeon 7200]
+ 1002 0008 Radeon 7000/Radeon VE
+ 1002 0009 Radeon 7000/Radeon
+ 1002 000a Radeon 7000/Radeon
+ 1002 001a Radeon 7000/Radeon
+ 1002 0029 Radeon AIW
+ 1002 0038 Radeon 7000/Radeon
+ 1002 0039 Radeon 7000/Radeon
+ 1002 008a Radeon 7000/Radeon
+ 1002 00ba Radeon 7000/Radeon
+ 1002 0139 Radeon 7000/Radeon
+ 1002 028a Radeon 7000/Radeon
+ 1002 02aa Radeon AIW
+ 1002 053a Radeon 7000/Radeon
+ 5145 Radeon R100 QE
+ 5146 Radeon R100 QF
+ 5147 Radeon R100 QG
+ 5148 Radeon R200 QH [Radeon 8500]
+ 1002 010a FireGL 8800 64Mb
+ 1002 0152 FireGL 8800 128Mb
+ 1002 0162 FireGL 8700 32Mb
+ 1002 0172 FireGL 8700 64Mb
+ 5149 Radeon R200 QI
+ 514a Radeon R200 QJ
+ 514b Radeon R200 QK
+ 514c Radeon R200 QL [Radeon 8500 LE]
+ 1002 003a Radeon R200 QL [Radeon 8500 LE]
+ 1002 013a Radeon 8500
+ 148c 2026 R200 QL [Radeon 8500 Evil Master II Multi Display Edition]
+ 1681 0010 Radeon 8500 [3D Prophet 8500 128Mb]
+ 174b 7149 Radeon R200 QL [Sapphire Radeon 8500 LE]
+ 1787 0f08 Radeon R200 QL [PowerMagic Radeon 8500]
+ 514d Radeon R200 QM [Radeon 9100]
+ 514e Radeon R200 QN [Radeon 8500LE]
+ 514f Radeon R200 QO [Radeon 8500LE]
+ 5154 R200 QT [Radeon 8500]
+ 5155 R200 QU [Radeon 9100]
+ 5157 Radeon RV200 QW [Radeon 7500]
+ 1002 013a Radeon 7500
+ 1002 0f2b ALL-IN-WONDER VE PCI
+ 1002 103a Dell Optiplex GX260
+ 1458 4000 RV200 QW [RADEON 7500 PRO MAYA AR]
+ 148c 2024 RV200 QW [Radeon 7500LE Dual Display]
+ 148c 2025 RV200 QW [Radeon 7500 Evil Master Multi Display Edition]
+ 148c 2036 RV200 QW [Radeon 7500 PCI Dual Display]
+ 174b 7146 RV200 QW [Radeon 7500 LE]
+ 174b 7147 RV200 QW [Sapphire Radeon 7500LE]
+ 174b 7161 Radeon RV200 QW [Radeon 7500 LE]
+ 17af 0202 RV200 QW [Excalibur Radeon 7500LE]
+ 5158 Radeon RV200 QX [Radeon 7500]
+ 5159 Radeon RV100 QY [Radeon 7000/VE]
+ 1002 000a Radeon 7000/Radeon VE
+ 1002 000b Radeon 7000
+ 1002 0038 Radeon 7000/Radeon VE
+ 1002 003a Radeon 7000/Radeon VE
+ 1002 00ba Radeon 7000/Radeon VE
+ 1002 013a Radeon 7000/Radeon VE
+ 1002 0908 XVR-100 (supplied by Sun)
+# The IBM card doubles as an ATI PCI video adapter
+ 1014 029a Remote Supervisor Adapter II (RSA2)
+ 1014 02c8 eServer xSeries server mainboard
+ 1028 016c PowerEdge 1850 Embedded Radeon 7000/VE
+ 1028 016d PowerEdge 2850 Embedded Radeon 7000-M
+ 1028 0170 PowerEdge 6850 Embedded Radeon 7000/VE
+ 1028 019a PowerEdge SC1425
+ 103c 1292 Radeon 7000
+ 1043 c00a A7000/T/64M
+ 1458 4002 RV100 QY [RADEON 7000 PRO MAYA AV Series]
+ 148c 2003 RV100 QY [Radeon 7000 Multi-Display Edition]
+ 148c 2023 RV100 QY [Radeon 7000 Evil Master Multi-Display]
+ 174b 0280 Radeon RV100 QY [Radeon 7000/VE]
+ 174b 7112 RV100 QY [Sapphire Radeon VE 7000]
+ 174b 7c28 Sapphire Radeon VE 7000 DDR
+ 1787 0202 RV100 QY [Excalibur Radeon 7000]
+ 17ee 1001 Radeon 7000 64MB DDR + DVI
+ 515a Radeon RV100 QZ [Radeon 7000/VE]
+ 515e ES1000
+ 1028 01bb PowerEdge 1955 Embedded ATI ES1000
+ 1028 01df PowerEdge SC440
+ 1028 01e6 PowerEdge 860
+ 1028 01f0 PowerEdge R900 Embedded ATI ES1000
+ 1028 0205 PowerEdge 2970 Embedded ATI ES1000
+ 1028 020b PowerEdge T605 Embedded ATI ES1000
+ 1028 020f PowerEdge R300 Embedded ATI ES1000
+ 1028 0210 PowerEdge T300 Embedded ATI ES1000
+ 1028 0221 PowerEdge R805 Embedded ATI ES1000
+ 1028 0223 PowerEdge R905 Embedded ATI ES1000
+ 1028 0225 PowerEdge T105 Embedded ATI ES1000
+ 1028 023c PowerEdge R200 Embedded ATI ES1000
+ 103c 1304 Integrity iLO2 Advanced KVM VGA [AD307A]
+ 15d9 8680 X7DVL-E-O motherboard
+ 8086 3476 S5000PSLSATA Server Board
+ 515f ES1000
+ 5168 Radeon R200 Qh
+ 5169 Radeon R200 Qi
+ 516a Radeon R200 Qj
+ 516b Radeon R200 Qk
+# This one is not in ATI documentation, but is in XFree86 source code
+ 516c Radeon R200 Ql
+ 5245 Rage 128 RE/SG
+ 1002 0008 Xpert 128
+ 1002 0028 Rage 128 AIW
+ 1002 0029 Rage 128 AIW
+ 1002 0068 Rage 128 AIW
+ 5246 Rage 128 RF/SG AGP
+ 1002 0004 Magnum/Xpert 128/Xpert 99
+ 1002 0008 Magnum/Xpert128/X99/Xpert2000
+ 1002 0028 Rage 128 AIW AGP
+ 1002 0044 Rage Fury/Xpert 128/Xpert 2000
+ 1002 0068 Rage 128 AIW AGP
+ 1002 0448 Rage Fury
+ 5247 Rage 128 RG
+ 524b Rage 128 RK/VR
+ 524c Rage 128 RL/VR AGP
+ 1002 0008 Xpert 99/Xpert 2000
+ 1002 0088 Xpert 99
+ 5345 Rage 128 SE/4x
+ 5346 Rage 128 SF/4x AGP 2x
+ 1002 0048 RAGE 128 16MB VGA TVOUT AMC PAL
+ 5347 Rage 128 SG/4x AGP 4x
+ 5348 Rage 128 SH
+ 534b Rage 128 SK/4x
+ 534c Rage 128 SL/4x AGP 2x
+ 534d Rage 128 SM/4x AGP 4x
+ 1002 0008 Xpert 99/Xpert 2000
+ 1002 0018 Xpert 2000
+ 534e Rage 128 4x
+ 5354 Mach 64 VT
+ 1002 5654 Mach 64 reference
+ 5446 Rage 128 Pro Ultra TF
+ 1002 0004 Rage Fury Pro
+ 1002 0008 Rage Fury Pro/Xpert 2000 Pro
+ 1002 0018 Rage Fury Pro/Xpert 2000 Pro
+ 1002 0028 Rage 128 AIW Pro AGP
+ 1002 0029 Rage 128 AIW
+ 1002 002a Rage 128 AIW Pro AGP
+ 1002 002b Rage 128 AIW
+ 1002 0048 Xpert 2000 Pro
+ 544c Rage 128 Pro Ultra TL
+ 5452 Rage 128 Pro Ultra TR
+ 1002 001c Rage 128 Pro 4XL
+ 103c 1279 Rage 128 Pro 4XL
+ 5453 Rage 128 Pro Ultra TS
+ 5454 Rage 128 Pro Ultra TT
+ 5455 Rage 128 Pro Ultra TU
+ 5460 M22 [Mobility Radeon X300]
+ 1775 1100 CR11/VR11 Single Board Computer
+ 5461 M22 [Mobility Radeon X300]
+ 5462 M24 [Radeon Mobility X600]
+ 5464 M22 [FireGL GL]
+ 5548 R423 UH [Radeon X800 (PCIE)]
+ 5549 R423 UI [Radeon X800PRO (PCIE)]
+ 554a R423 UJ [Radeon X800LE (PCIE)]
+ 554b R423 UK [Radeon X800SE (PCIE)]
+ 554c Radeon X800 XTP (R430) (PCIE)
+ 554d R430 [Radeon X800 XL] (PCIe)
+ 1458 2124 GV-R80L256V-B (AGP)
+ 554e Radeon X800 SE (R430) (PCIE)
+ 554f R430 [Radeon X800 (PCIE)]
+ 5550 R423 [FireGL V7100]
+ 5551 R423 [FireGL V5100 (PCIE)]
+ 5552 R423 UR [FireGL V5100 (PCIE)]
+ 5554 R423 UT [FireGL V7100 (PCIE)]
+ 5555 R430 GL PRO
+ 5569 R423 UI [Radeon X800PRO (PCIE)] (Secondary)
+ 556b Radeon R423 UK (PCIE) [X800 SE] (Secondary)
+ 556d R430 [Radeon X800 XL] (PCIe) (Secondary)
+ 1458 2125 GV-R80L256V-B (AGP)
+ 556f R430 [Radeon X800] (PCIE) (Secondary)
+ 5571 R423GL-SE [FireGL V5100 (PCIE)] (Secondary)
+ 564a M26 [Mobility FireGL V5000]
+ 564b M26 [Mobility FireGL V5000]
+ 564f M26 [Radeon Mobility X700 XL (PCIE)]
+ 5652 M26 [Radeon Mobility X700]
+ 5653 Radeon Mobility X700 (PCIE)
+ 1025 0080 Aspire 5024WLMi
+ 103c 0940 HP Compaq NW8240 Mobile Workstation
+ 5654 264VT [Mach64 VT]
+ 1002 5654 Mach64VT Reference
+ 5655 264VT3 [Mach64 VT3]
+ 5656 264VT4 [Mach64 VT4]
+ 5657 Radeon X550/X700 Series (RV410)
+ 5830 RS300 Host Bridge
+ 5831 RS300 Host Bridge
+ 5832 RS300 Host Bridge
+ 5833 Radeon 9100 IGP Host Bridge
+ 5834 Radeon 9100 IGP
+ 5835 RS300M AGP [Radeon Mobility 9100IGP]
+ 5838 Radeon 9100 IGP AGP Bridge
+ 5854 Radeon Xpress Series (RS480)
+ 5874 Radeon Xpress Series (RS482)
+ 5940 RV280 [Radeon 9200 PRO] (Secondary)
+ 17af 2021 Excalibur Radeon 9250 (Secondary)
+ 5941 RV280 [Radeon 9200] (Secondary)
+ 1458 4019 Gigabyte Radeon 9200
+ 174b 7c12 Sapphire Radeon 9200
+ 17af 200d Excalibur Radeon 9200
+ 18bc 0050 GeXcube GC-R9200-C3 (Secondary)
+ 5944 RV280 [Radeon 9200 SE (PCI)]
+ 5950 RS480 Host Bridge
+ 1025 0080 Aspire 5024WLMMi
+ 103c 280a DC5750 Microtower
+ 103c 2a20 Pavilion t3030.de Desktop PC
+ 103c 308b MX6125
+ 1462 0131 MS-1013 Notebook
+ 1462 7217 Aspire L250
+ 5951 Radeon Xpress 200 (RS480/RS482/RX480/RX482) Chipset - Host bridge
+ 5952 RD580 [CrossFire Xpress 3200] Chipset Host Bridge
+ 5954 RS480 [Radeon Xpress 200G Series]
+ 1002 5954 RV370 [Radeon Xpress 200G Series]
+ 5955 Radeon XPRESS 200M 5955 (PCIE)
+ 1002 5955 RS480 0x5955 [Radeon XPRESS 200M 5955 (PCIE)]
+ 103c 308b MX6125
+ 1462 0131 MS-1013 Notebook
+ 5956 RD790 Northbridge only dual slot PCI-e_GFX and HT3 K8 part
+ 5957 RX780/RX790 Chipset Host Bridge
+ 1849 5957 A770CrossFire Motherboard
+ 5958 RD780 Northbridge only dual slot PCI-e_GFX and HT1 K8 part
+ 5960 RV280 [Radeon 9200 PRO]
+ 17af 2020 Excalibur Radeon 9250
+ 5961 RV280 [Radeon 9200]
+ 1002 2f72 All-in-Wonder 9200 Series
+ 1019 4c30 Radeon 9200 VIVO
+ 12ab 5961 YUAN SMARTVGA Radeon 9200
+ 1458 4018 Gigabyte Radeon 9200
+ 174b 7c13 Sapphire Radeon 9200
+ 17af 200c Excalibur Radeon 9200
+ 18bc 0050 Radeon 9200 Game Buster
+ 18bc 0051 GeXcube GC-R9200-C3
+ 18bc 0053 Radeon 9200 Game Buster VIVO
+ 5962 RV280 [Radeon 9200]
+ 5964 RV280 [Radeon 9200 SE]
+ 1002 5964 Radeon 9200 SE, 64-bit 128MB DDR, 200/166MHz
+ 1043 c006 ASUS Radeon 9200 SE / TD / 128M
+ 1458 4018 Radeon 9200 SE
+ 1458 4032 Radeon 9200 SE 128MB
+ 147b 6191 R9200SE-DT
+ 148c 2073 CN-AG92E
+ 174b 7c13 Sapphire Radeon 9200 SE
+ 1787 5964 Excalibur 9200SE VIVO 128M
+ 17af 2012 Radeon 9200 SE Excalibur
+ 18bc 0170 Sapphire Radeon 9200 SE 128MB Game Buster
+ 18bc 0173 GC-R9200L(SE)-C3H [Radeon 9200 Game Buster]
+ 5965 RV280 [FireMV 2200 PCI]
+ 5969 ES1000
+ 5974 RS482 [Radeon Xpress 200]
+ 103c 280a DC5750 Microtower
+ 1462 7141 Aspire L250
+ 5975 RS482 [Radeon Xpress 200M]
+ 5978 RD790 PCI to PCI bridge (external gfx0 port A)
+ 1849 5957 A770CrossFire Motherboard
+ 5979 RD790 PCI to PCI bridge (external gfx0 port B)
+ 597a RD790 PCI to PCI bridge (PCI express gpp port A)
+ 597b RD790 PCI to PCI bridge (PCI express gpp port B)
+ 597c RD790 PCI to PCI bridge (PCI express gpp port C)
+ 597d RD790 PCI to PCI bridge (PCI express gpp port D)
+ 597e RD790 PCI to PCI bridge (PCI express gpp port E)
+ 1849 5957 A770CrossFire Motherboard
+ 597f RD790 PCI to PCI bridge (PCI express gpp port F)
+ 1849 5957 A770CrossFire Motherboard
+ 5980 RD790 PCI to PCI bridge (external gfx1 port A)
+ 5981 RD790 PCI to PCI bridge (external gfx1 port B)
+ 5982 RD790 PCI to PCI bridge (NB-SB link)
+ 5a10 RD890 Northbridge only dual slot (2x16) PCI-e GFX Hydra part
+ 5a11 RD890 Northbridge only single slot PCI-e GFX Hydra part
+ 5a12 RD890 Northbridge only dual slot (2x8) PCI-e GFX Hydra part
+ 5a13 RD890 PCI to PCI bridge (external gfx0 port A)
+ 5a14 RD890 PCI to PCI bridge (external gfx0 port B)
+ 5a15 RD890 PCI to PCI bridge (PCI express gpp port A)
+ 5a16 RD890 PCI to PCI bridge (PCI express gpp port B)
+ 5a17 RD890 PCI to PCI bridge (PCI express gpp port C)
+ 5a18 RD890 PCI to PCI bridge (PCI express gpp port D)
+ 5a19 RD890 PCI to PCI bridge (PCI express gpp port E)
+ 5a1a RD890 PCI to PCI bridge (PCI express gpp port F)
+ 5a1b RD890 PCI to PCI bridge (PCI express gpp port G)
+ 5a1c RD890 PCI to PCI bridge (PCI express gpp port H)
+ 5a1d RD890 PCI to PCI bridge (external gfx1 port A)
+ 5a1e RD890 PCI to PCI bridge (external gfx1 port B)
+ 5a1f RD890 PCI to PCI bridge (NB-SB link)
+ 5a33 Radeon Xpress 200 Host Bridge
+ 5a34 RS480 PCI-X Root Port
+# Comes in pair with 5a3f
+ 5a36 RS480 PCI Bridge
+ 5a37 RS480 PCI Bridge
+ 5a38 RS480 PCI Bridge
+# Comes in pair with 5a38
+ 5a39 RS480 PCI Bridge
+ 5a3f RS480 PCI Bridge
+ 1462 7217 Aspire L250
+ 5a41 RS400 [Radeon Xpress 200]
+ 5a42 RS400 [Radeon Xpress 200M]
+ 5a43 Radeon Xpress Series (RS400)
+ 5a61 RC410 [Radeon Xpress 200]
+ 5a62 RC410 [Radeon Xpress 200M]
+ 5a63 Radeon Xpress Series (RC410)
+ 5b60 RV370 5B60 [Radeon X300 (PCIE)]
+ 1043 002a Extreme AX300SE-X
+ 1043 032e Extreme AX300/TD
+ 1458 2102 GV-RX30S128D (X300SE)
+ 1462 0400 RX300SE-TD128E (MS-8940 REV:200)
+ 1462 0402 RX300SE-TD128E (MS-8940)
+ 174b 0500 Radeon X300 (PCIE)
+ 196d 1086 X300SE HM
+ 5b62 RV380 [Radeon X600 (PCIE)]
+ 5b63 RV370 [Sapphire X550 Silent]
+ 5b64 RV370 5B64 [FireGL V3100 (PCIE)]
+ 5b65 RV370 5B65 [FireGL D1100 (PCIE)]
+ 5b66 RV370X
+ 5b70 RV370 [Radeon X300SE]
+ 1462 0403 RX300SE-TD128E (MS-8940) (secondary display)
+ 174b 0501 Radeon X300SE
+ 196d 1087 X300SE HM
+ 5b72 RV380 [Radeon X600]
+ 5b73 RV370 secondary [Sapphire X550 Silent]
+ 5b74 RV370 5B64 [FireGL V3100 (PCIE)] (Secondary)
+ 5b75 RV370 5B75 [FireGL D1100 (PCIE)] (Secondary)
+ 5c61 M9+ 5C61 [Radeon Mobility 9200 (AGP)]
+ 5c63 M9+ 5C63 [Radeon Mobility 9200 (AGP)]
+ 1002 5c63 Apple iBook G4 2004
+ 144d c00c P30 notebook
+ 5d44 RV280 [Radeon 9200 SE] (Secondary)
+ 1458 4019 Radeon 9200 SE (Secondary)
+ 1458 4032 Radeon 9200 SE 128MB
+ 147b 6190 R9200SE-DT (Secondary)
+ 174b 7c12 Sapphire Radeon 9200 SE (Secondary)
+ 1787 5965 Excalibur 9200SE VIVO 128M (Secondary)
+ 17af 2013 Radeon 9200 SE Excalibur (Secondary)
+ 18bc 0171 Radeon 9200 SE 128MB Game Buster (Secondary)
+ 18bc 0172 GC-R9200L(SE)-C3H [Radeon 9200 Game Buster]
+ 5d45 RV280 [FireMV 2200 PCI] (secondary)
+ 5d48 M28 [Radeon Mobility X800XT]
+ 5d49 M28 [Mobility FireGL V5100]
+ 5d4a Mobility Radeon X800
+ 5d4c Radeon X850 (PCIE)
+ 5d4d R480 [Radeon X850XT Platinum (PCIE)]
+ 5d4e Radeon X850 SE (R480) (PCIE)
+ 5d4f R480 [Radeon X800 GTO (PCIE)]
+ 5d50 FireGL V7200 (R480) (PCIE)
+ 5d51 R480 GL 12P
+ 5d52 R480 [Radeon X850XT (PCIE)] (Primary)
+ 1002 0b12 PowerColor X850XT PCIe (Primary)
+ 1002 0b13 PowerColor X850XT PCIe (Secondary)
+ 5d57 R423 5F57 [Radeon X800XT (PCIE)]
+ 5d6d R480 [Radeon X850XT Platinum (PCIE)] (Secondary)
+ 5d6f R480 [Radeon X800 GTO (PCIE)] (Secondary)
+ 5d72 R480 [Radeon X850XT (PCIE)] (Secondary)
+ 5d77 R423 5F57 [Radeon X800XT (PCIE)] (Secondary)
+ 5e48 RV410 [FireGL V5000]
+ 5e49 RV410 [FireGL V3300]
+ 5e4a RV410 [Radeon X700XT]
+ 5e4b RV410 [Radeon X700 Pro (PCIE)]
+ 5e4c RV410 [Radeon X700SE]
+ 5e4d RV410 [Radeon X700 (PCIE)]
+ 148c 2116 PowerColor Bravo X700
+ 5e4f RV410 [Radeon X700]
+ 5e6b RV410 [Radeon X700 Pro (PCIE)] (Secondary)
+ 5e6d RV410 [Radeon X700 (PCIE)] (Secondary)
+ 148c 2117 PowerColor Bravo X700
+ 5f57 R423 [Radeon X800XT (PCIE)]
+ 6718 Cayman XT [AMD Radeon HD 6900 Series]
+ 6719 Cayman PRO [AMD Radeon 6900 Series]
+ 671d Antilles [AMD Radeon HD 6990]
+ 671f NI CAYMAN [Radeon HD 6900 Series]
+ 6720 Blackcomb [AMD Radeon HD 6900M Series]
+ 6738 Barts XT [ATI Radeon HD 6800 Series]
+ 6739 Barts PRO [ATI Radeon HD 6800 Series]
+ 673e Barts LE [AMD Radeon HD 6700 Series]
+ 6740 Whistler XT [AMD Radeon HD 6700M Series]
+ 6741 NI Whistler [AMD Radeon HD 6600M Series]
+ 6742 Whistler LE [AMD Radeon HD 6625M Graphics]
+ 6743 NI WHISTLER [Radeon E6760]
+ 6750 Turks [AMD Radeon HD 6500 series]
+ 6758 Turks XT [AMD Radeon HD 6600 Series]
+ 6759 NI Turks [AMD Radeon HD 6500]
+ 6760 NI Seymour [AMD Radeon HD 6470M]
+ 6761 NI Seymour [AMD Radeon HD 6430M]
+ 6763 NI SEYMOUR [Radoen] E6460
+ 6770 NI CAICOS [AMD Radeon HD 6400 Series]
+ 6779 NI Caicos [AMD RADEON HD 6450]
+ 174b e164 Sapphire HD 6450 1GB DDR3
+ 6858 SI LOMBOK [Radoen HD 6000 Series]
+ 6889 EG Cypress [FirePro V7800]
+ 688c Cypress [AMD FireStream 9370]
+ 688d Cypress [AMD FireStream 9350]
+ 6898 Radeon HD 5870 (Cypress)
+ 1462 8032 R5870 PM2D1G
+ 6899 Cypress [Radeon HD 5800 Series]
+ 689b EG CYPRESS [Radeon HD 6800 Series]
+ 689c Hemlock [ATI Radeon HD 5900 Series]
+ 689e Radeon HD 5800 Series (Cypress LE)
+ 68a0 Broadway XT [Mobility Radeon HD 5800 Series]
+ 103c 1520 Broadway XT [FirePro M7820]
+ 68a1 Broadway PRO [Mobility Radeon HD 5800 Series]
+ 68a8 Broadway [ATI Mobility Radeon HD 6800 Series]
+ 68b8 Juniper [Radeon HD 5700 Series]
+ 68b9 Juniper [ATI Radeon HD 5600/5700]
+ 68ba Juniper XT [AMD Radeon HD 6000 Series]
+ 68be Juniper [Radeon HD 5750 Series]
+ 68bf Juniper LE [AMD Radeon HD 6700 Series]
+ 68c0 Madison [Mobility Radeon HD 5000 Series]
+ 103c 1521 Madison XT [FirePro M5800]
+ 68c1 Madison [AMD Radeon HD 5000M Series]
+ 1025 0347 Aspire 7740G
+ 103c 1521 Madison Pro [FirePro M5800]
+ 68c7 Pinewood [Radeon HD 5570]
+ 68c8 FirePro V4800
+ 68d8 Redwood [Radeon HD 5670]
+ 68d9 Redwood PRO [Radeon HD 5500 Series]
+ 68da Redwood PRO [Radeon HD 5500 Series]
+ 68e0 Manhattan [Mobility Radeon HD 5400 Series]
+ 103c 1486 TouchSmart tm2-2050er discrete GPU (Mobility Radeon HD 5450)
+ 68e1 Manhattan [Mobility Radeon HD 5430 Series]
+ 68e4 Robson CE [AMD Radeon HD 6300 Series]
+ 68e5 Robson LE [AMD Radeon HD 6300M Series]
+ 68f1 Cadar [FirePro 2460]
+ 68f2 Cedar [FirePro 2270]
+ 68f9 Cedar PRO [Radeon HD 5450]
+ 1028 010e XPS 8300
+ 700f PCI Bridge [IGP 320M]
+ 7010 PCI Bridge [IGP 340M]
+ 7100 R520 [Radeon X1800]
+ 7102 M58 [Radeon Mobility X1800]
+ 7103 M58 [Mobility FireGL V7200]
+ 7104 R520GL [FireGL V7200] (Primary)
+ 7105 R520 [FireGL]
+ 7106 M58 [Mobility FireGL V7100]
+ 7108 M58 [Radeon Mobility X1800]
+ 7109 R520 [Radeon X1800]
+ 1002 0322 All-in-Wonder X1800XL
+ 1002 0d02 Radeon X1800 CrossFire Edition
+ 710a R520 [Radeon X1800]
+ 710b R520 [Radeon X1800]
+ 710c R520 [Radeon X1800]
+ 7120 R520 [Radeon X1800] (Secondary)
+ 7124 R520GL [FireGL V7200] (Secondary)
+ 7129 R520 [Radeon X1800] (Secondary)
+ 1002 0323 All-in-Wonder X1800XL (Secondary)
+ 1002 0d03 Radeon X1800 CrossFire Edition (Secondary)
+ 7140 RV515 [Radeon X1600]
+ 7142 RV515 PRO [Radeon X1300/X1550 Series]
+ 1002 0322 All-in-Wonder 2006 PCI-E Edition
+ 1043 0142 EAX1300PRO/TD/256M
+ 7143 RV505 [Radeon X1550 Series]
+ 7145 Radeon Mobility X1400
+ 17aa 2006 Thinkpad T60 model 2007
+ 7146 RV515 [Radeon X1300]
+ 1002 0322 All-in-Wonder 2006 PCI-E Edition
+ 1545 1996 Radeon X1300 512MB PCI-e
+ 7147 RV505 [Radeon X1550 64-bit]
+ 7149 M52 [Mobility Radeon X1300]
+ 714a M52 [Mobility Radeon X1300]
+ 714b M52 [Mobility Radeon X1300]
+ 714c M52 [Mobility Radeon X1300]
+ 714d RV515 [Radeon X1300]
+ 714e RV515LE [Radeon X1300]
+ 7152 RV515GL [FireGL V3300] (Primary)
+ 7153 RV515GL [FireGL V3350]
+ 715e RV515 [Radeon X1300]
+ 715f RV505 CE [Radeon X1550 64-bit]
+ 7162 RV515 PRO [Radeon X1300/X1550 Series] (Secondary)
+ 1002 0323 All-in-Wonder 2006 PCI-E Edition (Secondary)
+ 7163 RV505 [Radeon X1550 Series] (Secondary)
+ 7166 RV515 [Radeon X1300] (Secondary)
+ 1002 0323 All-in-Wonder 2006 PCI-E Edition (Secondary)
+ 1545 1997 Radeon X1300 512MB PCI-e (Secondary)
+ 7167 RV515 [Radeon X1550 64-bit] (Secondary)
+ 716e RV515LE [Radeon X1300] Secondary
+ 7172 RV515GL [FireGL V3300] (Secondary)
+ 7173 RV515GL [FireGL V3350] (Secondary)
+ 7180 RV516 [Radeon X1300/X1550 Series]
+ 7181 RV516 XT Radeon X1600 Series (Primary)
+ 7183 RV516 [Radeon X1300/X1550 Series]
+ 7186 RV515 [Radeon Mobility X1450]
+ 7187 RV516 [Radeon X1300/X1550 Series]
+ 7188 M64-S [Mobility Radeon X2300]
+ 103c 30c1 6910p
+ 718a Mobility Radeon X2300
+ 718c M62CSP64 [Mobility Radeon X1350]
+ 718d M64CSP128 [Mobility Radeon X1450]
+ 7193 RV516 [Radeon X1550 Series]
+ 7196 RV516 [Mobility Radeon X1350]
+ 719b FireMV 2250
+ 719f RV516LE [Radeon X1550 64-bit]
+ 71a0 RV516 [Radeon X1300/X1550 Series] (Secondary)
+ 71a1 RV516 XT Radeon X1600 Series (Secondary)
+ 71a3 RV516 [Radeon X1300 Pro] (Secondary)
+ 71a7 RV516 [Radeon X1300/X1550 Series] (Secondary)
+ 71bb FireMV 2250 (Secondary)
+ 71c0 RV530 [Radeon X1600]
+ 71c1 Radeon X1650 Pro
+ 71c2 RV530 [Radeon X1600]
+ 71c4 M56GL [Mobility FireGL V5200]
+ 17aa 2007 ThinkPad T60p
+ 71c5 M56P [Radeon Mobility X1600]
+ 103c 309f Compaq nx9420 Notebook
+ 103c 30a3 Compaq NW8440
+ 1043 10b2 A6J-Q008
+ 106b 0080 MacBook Pro
+ 71c6 RV530LE [Radeon X1600/X1650 PRO]
+ 71c7 RV535 [Radeon X1650 Series]
+ 71ce RV530LE [Radeon X1600]
+ 71d2 RV530GL [FireGL V3400]
+ 71d4 M66GL [ATI Mobility FireGL V5250]
+ 71d5 M66-P [Mobility Radeon X1700]
+ 71d6 M66-XT [Mobility Radeon X1700]
+ 71de RV530LE [Radeon X1600]
+ 71e0 RV530 [Radeon X1600] (Secondary)
+ 71e1 Radeon X1650 Pro (Secondary)
+ 71e2 RV530 [Radeon X1600] (Secondary)
+ 71e6 RV530LE [Radeon X1650 PRO] (Secondary)
+ 71e7 RV535 [Radeon X1650 Series]
+ 71f2 RV530GL [FireGL V3400 (Secondary)]
+ 7210 M71 [Mobility Radeon X2100]
+ 7211 M71 [Mobility Radeon X2100] (Secondary)
+ 7240 R580 [Radeon X1900]
+ 7241 R580 [Radeon X1900]
+ 7242 R580 [Radeon X1900]
+ 7243 R580 [Radeon X1900]
+ 7244 R580 [Radeon X1900]
+ 7245 R580 [Radeon X1900]
+ 7246 R580 [Radeon X1900]
+ 7247 R580 [Radeon X1900]
+ 7248 R580 [Radeon X1900]
+ 7249 R580 [Radeon X1900 XT] (Primary)
+ 724a R580 [Radeon X1900]
+ 724b R580 [Radeon X1900]
+ 1002 0b12 Radeon X1900 (Primary)
+ 1002 0b13 Radeon X1900 (Secondary)
+ 724c R580 [Radeon X1900]
+ 724d R580 [Radeon X1900]
+ 724e R580 [AMD Stream Processor]
+ 7269 R580 [Radeon X1900 XT] (Secondary)
+ 726b R580 [Radeon X1900]
+ 726e R580 [AMD Stream Processor] (Secondary)
+ 7280 RV570 [Radeon X1950 Pro]
+ 7288 Radeon X1950 GT
+ 7291 Radeon X1650 XT (Primary) (PCIE)
+ 7293 Radeon X1650 Series
+ 72a0 RV570 [Radeon X1950 Pro] (secondary)
+ 72a8 Radeon X1950 GT (Secondary)
+ 72b1 Radeon X1650 XT (Secondary) (PCIE)
+ 72b3 Radeon X1650 Series (Secondary)
+ 7833 Radeon 9100 IGP Host Bridge
+ 7834 Radeon 9100 PRO IGP
+ 7835 Radeon Mobility 9200 IGP
+ 7838 Radeon 9100 IGP PCI/AGP Bridge
+ 7910 RS690 Host Bridge
+ 1179 ff50 Satellite P305D-S8995E
+ 17f2 5000 KI690-AM2 Motherboard
+ 7911 RS690 Host Bridge
+ 7912 RS690 PCI to PCI Bridge (Internal gfx)
+ 7913 RS690 PCI to PCI Bridge (PCI Express Graphics Port 0)
+ 7915 RS690 PCI to PCI Bridge (PCI Express Port 1)
+ 7916 RS690 PCI to PCI Bridge (PCI Express Port 2)
+ 7917 RS690 PCI to PCI Bridge (PCI Express Port 3)
+ 1002 7910 RS690 PCI to PCI Bridge
+ 7919 Radeon X1200 Series Audio Controller
+ 1179 7919 Satellite P305D-S8995E
+ 17f2 5000 KI690-AM2 Motherboard
+ 791e RS690 [Radeon X1200 Series]
+ 1462 7327 K9AG Neo2
+ 17f2 5000 KI690-AM2 Motherboard
+ 791f RS690M [Radeon X1200 Series]
+ 1179 ff50 Satellite P305D-S8995E
+ 7930 Radeon Xpress 7930 Host Bridge
+ 7932 RS7932 PCI Bridge
+ 7933 RS7933 PCI Bridge
+ 7936 RS7936 PCI Bridge
+ 793b RS600 audio device [Radeon Xpress 12xx Series]
+ 793f RS600 [Radeon Xpress 1200 Series]
+ 7941 RS600 [Radeon Xpress 1200 Series]
+ 7942 Radeon Xpress 1250
+ 796e Radeon 2100
+ 7c37 RV350 AQ [Radeon 9600 SE]
+ 9400 R600 [Radeon HD 2900 Series]
+ 1002 3000 Sapphire Radeon HD 2900 XT
+ 1002 3142 HIS Radeon HD 2900XT 512MB GDDR3 VIVO PCIe
+ 9403 R600 [Radeon HD 2900 PRO]
+ 940a R600GL [Fire GL V8650]
+ 940b R600GL [Fire GL V8600]
+ 940f R600 [FireGL V7600]
+ 9440 RV770 [Radeon HD 4870]
+ 9441 R700 [Radeon HD 4870 X2]
+ 9442 RV770 [Radeon HD 4850]
+ 1002 0502 MSI R4850-T2D512
+ 174b e810 Sapphire HD 4850 512MB GDDR3 PCI-E Dual Slot Fansink
+ 9443 R700 [Radeon HD 4850]
+ 944a M98L [Mobility Radeon HD 4850]
+ 944c RV770 LE [Radeon HD 4800 Series]
+ 944e RV770 CE [Radeon HD 4710]
+ 9450 RV770 [FireStream 9270]
+ 9452 RV770 [FireStream 9250]
+ 945a M98 XT [Mobility Radeon HD 4870]
+ 9460 RV790 [Radeon HD 4890]
+ 9462 RV790LE [Radeon HD 4800 Series]
+ 9480 M96 [Mobility Radeon HD 4650]
+ 103c 3628 ATI Mobility Radeon HD 4650 [dv6-1190en]
+ 9485 RV740 Pro [Radeon HD 4770]
+ 9489 M96 XT [Mobility FireGL V5725]
+ 9490 RV730XT [Radeon HD 4670]
+ 174b e880 Radeon HD 4670 512MB DDR3
+ 9491 M96 CSP [ATI RADEON E4690]
+ 9495 RV730 Pro AGP [Radeon HD 4600 Series]
+ 1002 9495 RV730 XT [PowerColor Radeon HD4670 AGP 1GB DDR]
+ 1458 0028 HD4650
+ 9498 RV730 PRO [Radeon HD 4650]
+ 949e RV370 [FirePro V5700]
+ 949f RV730 [FirePro V5700]
+ 94a0 Mobility Radeon HD 4830 [M97]
+ 94a1 [M97 XT] Mobility Radeon HD 4860
+ 94a3 M97 GL [ATI FirePro M7740]
+ 94b3 Radeon HD 4770 [RV740]
+ 94b4 RV740 LE [ATI Radeon HD 4700 Series]
+ 94c1 RV610 [Radeon HD 2400 XT]
+ 1028 0211 Optiplex 755
+ 1028 0d02 Optiplex 755
+ 94c3 RV610 video device [Radeon HD 2400 PRO]
+ 1002 94c3 Radeon HD 2400PRO
+ 1028 0302 Radeon HD 2400 Pro
+ 174b e400 Sapphire HD 2400 PRO video device
+ 18bc 3550 GeCube Radeon HD2400 PRO
+ 94c4 RV610 LE AGP [Radeon HD 2400 PRO AGP]
+ 94c8 Radeon HD 2400 XT
+ 94c9 Mobility Radeon HD 2400
+ 1002 94c9 Radeon HD2400
+ 94cb Radeon E2400
+ 94cc RV 610LE PCI [Radeon HD 2400]
+ 9501 Radeon HD 3870
+ 174b e620 Sapphire Radeon HD 3870 PCIe 2.0
+ 9504 Mobility Radeon HD 3850
+ 9505 RV670PRO [Radeon HD 3850]
+ 9507 RV670 [Radeon HD 3850]
+ 9508 M88 XT Mobility Radeon HD 3870]
+ 950f R680 [Radeon HD 3870 x2]
+ 9511 RV670 [FireGL 7700]
+ 9515 RV670 AGP [Radeon HD 3850]
+ 9519 RV670 [FireStream 9170]
+ 9540 RV710 [Radeon HD 4550]
+ 954f RV710 [Radeon HD 4350]
+ 1462 1618 R4350 MD512H (MS-V161)
+ 9552 M92 LP [Mobility Radeon HD 4300 Series]
+ 9553 M92 [Mobility Radeon HD 4500/5100 Series]
+ 1179 ff82 Satellite L505-13T GPU (Mobility Radeon HD 5145)
+ 9555 M93 [Mobility Radeon HD 4300/4500 Series]
+ 103c 1411 ProBook 4720s GPU (Mobility Radeon HD 4350)
+ 9559 Mobility Radeon HD 3600 Series
+ 955f M92 [Mobility Radeon HD 4330]
+ 9581 M76 [Radeon Mobility HD 2600 Series]
+ 9583 M76XT [Mobility Radeon HD 2600 XT]
+ 9586 RV 630 XT AGP [Radeon HD 2600 XT AGP]
+ 9587 RV630 PRO AGP [Radeon HD 2600 PRO AGP]
+ 9588 RV630 [Radeon HD 2600XT]
+ 1458 216c Radeon HD 2600 XT, 256MB GDDR3, 2x DVI, TV-out, PCIe (GV-RX26T256H)
+ 9589 RV630 [Radeon HD 2600 Series]
+ 958c RV630GL [FireGL v5600]
+ 958d RV630 [FireGL V3600]
+ 9591 Mobility Radeon HD 3650
+ 1002 9591 Mobility Radeon HD 3650
+ 9593 Radeon Mobility HD 3670
+ 9595 M86GL [Mobility FireGL V5700]
+ 9596 RV635 PRO AGP [Radeon HD 3650]
+ 1043 0028 EAH3650 SILENT/HTDI/512M/A
+ 9598 Mobility Radeon HD 3600 Series
+ 1002 9598 Mobility Radeon HD 3600
+ 1043 01d6 EAH3650 Silent
+ 95c0 Mobility Radeon HD 3470
+ 1002 95c0 Mobility Radeon HD 3470
+ 95c4 Mobility Radeon HD 3400 Series
+ 1002 95c4 Mobility Radeon HD 3400
+ 95c5 RV620 LE [Radeon HD 3450]
+ 95c6 RV620 LE AGP [Radeon HD 3450]
+ 95c7 RV620 CE [Radeon HD 3430]
+ 95c9 RV620 PCI [Radeon HD 3450]
+ 95cc RV620 [ATI FireGL V3700]
+ 95cd RV620 [FireMV 2450]
+ 95ce RV620 [FirePro 2260]
+ 95cf RV620 [FirePro 2260]
+ 960f RS780 Azalia controller
+ 9610 Radeon HD 3200 Graphics
+ 1458 d000 GA-MA78GM-S2H Motherboard
+ 9611 Radeon 3100 Graphics
+ 9612 RS780M/RS780MN [Radeon HD 3200 Graphics]
+ 9613 RS780MC [Radeon HD 3100 Graphics]
+ 9614 Radeon HD 3300 Graphics
+ 9615 RS780E [AMD 780E]
+ 9616 760G [Radeon 3000]
+ 970f RS880 Audio Device [Radeon HD 4200]
+ 1043 83a2 M4A785TD Motherboard
+ 1043 843e M5A88-V EVO
+ 9710 RS880 [Radeon HD 4200]
+ 1043 83a2 M4A785TD Motherboard
+ 9712 M880G [Mobility Radeon HD 4200]
+ 9713 M860G [Mobility Radeon 4100]
+ 9714 RS880 [Radeon HD 4290]
+ 9715 RS880 [Radeon HD 4250]
+ 1043 843e M5A88-V EVO
+ 9723 Radeon HD 5450
+ 9802 AMD Radeon HD 6310 GraphicsATI
+ aa00 R600 Audio Device [Radeon HD 2900 Series]
+ aa08 RV630/M76 audio device [Radeon HD 2600 Series]
+ aa10 RV610 audio device [Radeon HD 2400 PRO]
+ 174b aa10 Sapphire HD 2400 PRO audio device
+ 18bc aa10 GeCube Radeon HD 2400 PRO HDCP-capable digital-only audio device
+ aa18 Radeon HD 3870 Audio device
+ aa20 RV635 Audio device [Radeon HD 3600 Series]
+ aa28 RV620 Audio device [Radeon HD 34xx Series]
+ aa30 HD48x0 audio
+ 174b aa30 Sapphire HD 4850 512MB GDDR3 PCI-E Dual Slot Fansink
+ aa38 RV710/730
+ 103c 3628 ATI RV710/730 [dv6-1190en]
+ 174b aa38 R700 Audio Device [Radeon HD 4000 Series]
+ aa50 Cypress HDMI Audio [Radeon HD 5800 Series]
+ aa58 Juniper HDMI Audio [Radeon HD 5700 Series]
+ aa60 Redwood HDMI Audio [Radeon HD 5600 Series]
+ 1025 0347 Aspire 7740G
+ aa68 Manhattan HDMI Audio [Mobility Radeon HD 5000 Series]
+ 1028 aa68 XPS 8300
+ aa88 Barts HDMI Audio [Radeon HD 6800 Series]
+ aa98 NI Caicos HDMI Audio [AMD RADEON HD 6450]
+ 174b aa98 Sapphire HD 6450 1GB DDR3
+ ac00 Theater 600 Pro
+ ac02 TV Wonder HD 600 PCIe
+ ac12 Theater HD T507 (DVB-T) TV tuner/capture device
+ cab0 AGP Bridge [IGP 320M]
+ cab2 RS200/RS200M AGP Bridge [IGP 340M]
+ cab3 R200 AGP Bridge [Mobility Radeon 7000 IGP]
+ cbb2 RS200/RS200M AGP Bridge [IGP 340M]
+1003 ULSI Systems
+ 0201 US201
+1004 VLSI Technology Inc
+ 0005 82C592-FC1
+ 0006 82C593-FC1
+ 0007 82C594-AFC2
+ 0008 82C596/7 [Wildcat]
+ 0009 82C597-AFC2
+ 000c 82C541 [Lynx]
+ 000d 82C543 [Lynx]
+ 0101 82C532
+ 0102 82C534 [Eagle]
+ 0103 82C538
+ 0104 82C535
+ 0105 82C147
+ 0200 82C975
+ 0280 82C925
+ 0304 QSound ThunderBird PCI Audio
+ 1004 0304 QSound ThunderBird PCI Audio
+ 122d 1206 DSP368 Audio
+ 1483 5020 XWave Thunder 3D Audio
+ 0305 QSound ThunderBird PCI Audio Gameport
+ 1004 0305 QSound ThunderBird PCI Audio Gameport
+ 122d 1207 DSP368 Audio Gameport
+ 1483 5021 XWave Thunder 3D Audio Gameport
+ 0306 QSound ThunderBird PCI Audio Support Registers
+ 1004 0306 QSound ThunderBird PCI Audio Support Registers
+ 122d 1208 DSP368 Audio Support Registers
+ 1483 5022 XWave Thunder 3D Audio Support Registers
+ 0307 Thunderbird
+ 0308 Thunderbird
+ 0702 VAS96011 [Golden Gate II]
+ 0703 Tollgate
+1005 Avance Logic Inc. [ALI]
+ 2064 ALG2032/2064
+ 2128 ALG2364A
+ 2301 ALG2301
+ 2302 ALG2302
+ 2364 ALG2364
+ 2464 ALG2364A
+ 2501 ALG2564A/25128A
+1006 Reply Group
+1007 NetFrame Systems Inc
+1008 Epson
+100a Phoenix Technologies
+100b National Semiconductor Corporation
+ 0001 DP83810
+ 0002 87415/87560 IDE
+ 000e 87560 Legacy I/O
+ 000f FireWire Controller
+ 0011 NS87560 National PCI System I/O
+ 0012 USB Controller
+ 0020 DP83815 (MacPhyter) Ethernet Controller
+ 103c 0024 Pavilion ze4400 builtin Network
+ 12d9 000c Aculab E1/T1 PMXc cPCI carrier card
+ 1385 f311 FA311 / FA312 (FA311 with WoL HW)
+ 0021 PC87200 PCI to ISA Bridge
+ 0022 DP83820 10/100/1000 Ethernet Controller
+ 1186 4900 DGE-500T
+ 1385 621a GA621
+ 1385 622a GA622T
+ 0028 Geode GX2 Host Bridge
+ 002a CS5535 South Bridge
+ 002b CS5535 ISA bridge
+ 002d CS5535 IDE
+ 002e CS5535 Audio
+ 002f CS5535 USB
+ 0030 Geode GX2 Graphics Processor
+ 0035 DP83065 [Saturn] 10/100/1000 Ethernet Controller
+ 0500 SCx200 Bridge
+ 0501 SCx200 SMI
+ 0502 SCx200, SC1100 IDE controller
+ 100b 0502 IDE Controller
+ 0503 SCx200, SC1100 Audio Controller
+ 100b 0503 XpressAudio controller
+ 0504 SCx200 Video
+ 0505 SCx200 XBus
+ 0510 SC1100 Bridge
+ 100b 0500 GPIO and LPC support bridge
+ 0511 SC1100 SMI & ACPI
+ 100b 0501 SC1100 SMI & ACPI bridge
+ 0515 SC1100 XBus
+ 100b 0505 SC1100 PCI to XBus bridge
+ d001 87410 IDE
+100c Tseng Labs Inc
+ 3202 ET4000/W32p rev A
+ 3205 ET4000/W32p rev B
+ 3206 ET4000/W32p rev C
+ 3207 ET4000/W32p rev D
+ 3208 ET6000
+ 4702 ET6300
+100d AST Research Inc
+100e Weitek
+ 9000 P9000 Viper
+ 9001 P9000 Viper
+ 9002 P9000 Viper
+ 9100 P9100 Viper Pro/SE
+1010 Video Logic, Ltd.
+1011 Digital Equipment Corporation
+ 0001 DECchip 21050
+ 0002 DECchip 21040 [Tulip]
+ 0004 DECchip 21030 [TGA]
+ 0007 NVRAM [Zephyr NVRAM]
+ 0008 KZPSA [KZPSA]
+ 0009 DECchip 21140 [FasterNet]
+ 1025 0310 21140 Fast Ethernet
+ 10b8 2001 SMC9332BDT EtherPower 10/100
+ 10b8 2002 SMC9332BVT EtherPower T4 10/100
+ 10b8 2003 SMC9334BDT EtherPower 10/100 (1-port)
+ 1109 2400 ANA-6944A/TX Fast Ethernet
+ 1112 2300 RNS2300 Fast Ethernet
+ 1112 2320 RNS2320 Fast Ethernet
+ 1112 2340 RNS2340 Fast Ethernet
+ 1113 1207 EN-1207-TX Fast Ethernet
+ 1186 1100 DFE-500TX Fast Ethernet
+ 1186 1112 DFE-570TX Fast Ethernet
+ 1186 1140 DFE-660 Cardbus Ethernet 10/100
+ 1186 1142 DFE-660 Cardbus Ethernet 10/100
+ 11f6 0503 Freedomline Fast Ethernet
+ 1282 9100 AEF-380TXD Fast Ethernet
+ 1385 1100 FA310TX Fast Ethernet
+ 2646 0001 KNE100TX Fast Ethernet
+ 000a 21230 Video Codec
+ 000d PBXGB [TGA2]
+ 000f PCI-to-PDQ Interface Chip [PFI]
+ 1011 def1 FDDI controller (DEFPA)
+ 103c def1 FDDI controller (3X-DEFPA)
+ 0014 DECchip 21041 [Tulip Pass 3]
+ 1186 0100 DE-530+
+ 0016 DGLPB [OPPO]
+ 0017 PV-PCI Graphics Controller (ZLXp-L)
+ 0018 Memory Channel interface
+ 0019 DECchip 21142/43
+ 1011 500a DE500A Fast Ethernet
+ 1011 500b DE500B Fast Ethernet
+ 1014 0001 10/100 EtherJet Cardbus
+ 1025 0315 ALN315 Fast Ethernet
+ 1033 800c PC-9821-CS01 100BASE-TX Interface Card
+ 1033 800d PC-9821NR-B06 100BASE-TX Interface Card
+ 103c 125a 10/100Base-TX (PCI) [A5506B]
+ 108d 0016 Rapidfire 2327 10/100 Ethernet
+ 108d 0017 GoCard 2250 Ethernet 10/100 Cardbus
+ 10b8 2005 SMC8032DT Extreme Ethernet 10/100
+ 10b8 8034 SMC8034 Extreme Ethernet 10/100
+ 10ef 8169 Cardbus Fast Ethernet
+ 1109 2a00 ANA-6911A/TX Fast Ethernet
+ 1109 2b00 ANA-6911A/TXC Fast Ethernet
+ 1109 3000 ANA-6922/TX Fast Ethernet
+ 1113 1207 Cheetah Fast Ethernet
+ 1113 2220 Cardbus Fast Ethernet
+ 115d 0002 Cardbus Ethernet 10/100
+ 1179 0203 Fast Ethernet
+ 1179 0204 Cardbus Fast Ethernet
+ 1186 1100 DFE-500TX Fast Ethernet
+ 1186 1101 DFE-500TX Fast Ethernet
+ 1186 1102 DFE-500TX Fast Ethernet
+ 1186 1112 DFE-570TX Quad Fast Ethernet
+ 1259 2800 AT-2800Tx Fast Ethernet
+ 1266 0004 Eagle Fast EtherMAX
+ 12af 0019 NetFlyer Cardbus Fast Ethernet
+ 1374 0001 Cardbus Ethernet Card 10/100
+ 1374 0002 Cardbus Ethernet Card 10/100
+ 1374 0007 Cardbus Ethernet Card 10/100
+ 1374 0008 Cardbus Ethernet Card 10/100
+ 1385 2100 FA510
+ 1395 0001 10/100 Ethernet CardBus PC Card
+ 13d1 ab01 EtherFast 10/100 Cardbus (PCMPC200)
+ 1498 000a TPMC880-10 10/100Base-T and 10Base2 PMC Ethernet Adapter
+ 1498 000b TPMC880-11 Single 10/100Base-T PMC Ethernet Adapter
+ 1498 000c TPMC880-12 Single 10Base2 PMC Ethernet Adapter
+ 14cb 0100 LNDL-100N 100Base-TX Ethernet PC Card
+ 1668 2000 FastNet Pro (PE2000)
+ 2646 0001 KNE100TX
+ 2646 0002 KNE-CB4TX
+ 8086 0001 EtherExpress PRO/100 Mobile CardBus 32
+ 001a Farallon PN9000SX Gigabit Ethernet
+ 0021 DECchip 21052
+ 0022 DECchip 21150
+ 0023 DECchip 21150
+ 0024 DECchip 21152
+ 0025 DECchip 21153
+ 0026 DECchip 21154
+ 0034 56k Modem Cardbus
+ 1374 0003 56k Modem Cardbus
+ 0045 DECchip 21553
+ 0046 DECchip 21554
+ 0e11 4050 Smart Array 4200 Controller
+ 0e11 4051 Smart Array 4250ES Controller
+ 0e11 4058 Smart Array 431 Controller
+ 103c 10c2 NetRAID-4M
+ 12d9 000a IP Telephony card
+ 4c53 1050 CT7 mainboard
+ 4c53 1051 CE7 mainboard
+ 9005 0364 5400S (Mustang)
+ 9005 0365 5400S (Mustang)
+ 9005 1364 Dell PowerEdge RAID Controller 2
+ 9005 1365 Dell PowerEdge RAID Controller 2
+ e4bf 1000 CC8-1-BLUES
+ 1065 StrongARM DC21285
+ 1069 0020 DAC960P / DAC1164P
+1012 Micronics Computers Inc
+1013 Cirrus Logic
+ 0038 GD 7548
+ 0040 GD 7555 Flat Panel GUI Accelerator
+ 004c GD 7556 Video/Graphics LCD/CRT Ctrlr
+ 00a0 GD 5430/40 [Alpine]
+ 00a2 GD 5432 [Alpine]
+ 00a4 GD 5434-4 [Alpine]
+ 00a8 GD 5434-8 [Alpine]
+ 00ac GD 5436 [Alpine]
+ 00b0 GD 5440
+ 00b8 GD 5446
+ 00bc GD 5480
+ 1013 00bc CL-GD5480
+ 00d0 GD 5462
+ 00d2 GD 5462 [Laguna I]
+ 00d4 GD 5464 [Laguna]
+ 00d5 GD 5464 BD [Laguna]
+ 00d6 GD 5465 [Laguna]
+ 13ce 8031 Barco Metheus 2 Megapixel, Dual Head
+ 13cf 8031 Barco Metheus 2 Megapixel, Dual Head
+ 00e8 GD 5436U
+ 1100 CL 6729
+ 1110 PD 6832 PCMCIA/CardBus Ctrlr
+ 1112 PD 6834 PCMCIA/CardBus Ctrlr
+ 1113 PD 6833 PCMCIA/CardBus Ctrlr
+ 1200 GD 7542 [Nordic]
+ 1202 GD 7543 [Viking]
+ 1204 GD 7541 [Nordic Light]
+ 4000 MD 5620 [CLM Data Fax Voice]
+ 4400 CD 4400
+ 6001 CS 4610/11 [CrystalClear SoundFusion Audio Accelerator]
+ 1014 1010 CS4610 SoundFusion Audio Accelerator
+ 6003 CS 4614/22/24/30 [CrystalClear SoundFusion Audio Accelerator]
+ 1013 4280 Crystal SoundFusion PCI Audio Accelerator
+ 1014 0153 ThinkPad 600X/A20m
+ 153b 112e DMX XFire 1024
+ 153b 1136 SiXPack 5.1+
+ 1681 0050 Game Theater XP
+ 1681 a010 Gamesurround Fortissimo II
+ 1681 a011 Gamesurround Fortissimo III 7.1
+ 5053 3357 Santa Cruz
+ 6004 CS 4614/22/24 [CrystalClear SoundFusion Audio Accelerator]
+ 6005 Crystal CS4281 PCI Audio
+ 1013 4281 Crystal CS4281 PCI Audio
+ 10cf 10a8 Crystal CS4281 PCI Audio
+ 10cf 10a9 Crystal CS4281 PCI Audio
+ 10cf 10aa Crystal CS4281 PCI Audio
+ 10cf 10ab Crystal CS4281 PCI Audio
+ 10cf 10ac Crystal CS4281 PCI Audio
+ 10cf 10ad Crystal CS4281 PCI Audio
+ 10cf 10b4 Crystal CS4281 PCI Audio
+ 1179 0001 Crystal CS4281 PCI Audio
+ 14c0 000c Crystal CS4281 PCI Audio
+1014 IBM
+ 0002 PCI to MCA Bridge
+ 0005 Processor to I/O Controller [Alta Lite]
+ 0007 Processor to I/O Controller [Alta MP]
+ 000a PCI to ISA Bridge (IBM27-82376) [Fire Coral]
+ 0017 CPU to PCI Bridge
+ 0018 TR Auto LANstreamer
+ 001b GXT-150P
+ 001c Carrera
+ 001d SCSI-2 FAST PCI Adapter (82G2675)
+ 0020 GXT1000 Graphics Adapter
+ 0022 PCI to PCI Bridge (IBM27-82351)
+ 002d Processor to I/O Controller [Python]
+ 002e SCSI RAID Adapter [ServeRAID]
+ 1014 002e ServeRAID-3x
+ 1014 022e ServeRAID-4H
+ 0031 2 Port Serial Adapter
+# AS400 iSeries PCI sync serial card
+ 1014 0031 2721 WAN IOA - 2 Port Sync Serial Adapter
+ 0036 PCI to 32-bit LocalBus Bridge [Miami]
+ 0037 PowerPC to PCI Bridge (IBM27-82660)
+ 003a CPU to PCI Bridge
+ 003c GXT250P/GXT255P Graphics Adapter
+ 003e 16/4 Token ring UTP/STP controller
+ 1014 003e Token-Ring Adapter
+ 1014 00cd Token-Ring Adapter + Wake-On-LAN
+ 1014 00ce 16/4 Token-Ring Adapter 2
+ 1014 00cf 16/4 Token-Ring Adapter Special
+ 1014 00e4 High-Speed 100/16/4 Token-Ring Adapter
+ 1014 00e5 16/4 Token-Ring Adapter 2 + Wake-On-LAN
+ 1014 016d iSeries 2744 Card
+ 0045 SSA Adapter
+ 0046 MPIC interrupt controller
+ 0047 PCI to PCI Bridge
+ 0048 PCI to PCI Bridge
+ 0049 Warhead SCSI Controller
+ 004e ATM Controller (14104e00)
+ 004f ATM Controller (14104f00)
+ 0050 ATM Controller (14105000)
+ 0053 25 MBit ATM Controller
+ 0054 GXT500P/GXT550P Graphics Adapter
+ 0057 MPEG PCI Bridge
+ 0058 SSA Adapter [Advanced SerialRAID/X]
+ 005c i82557B 10/100
+ 005e GXT800P Graphics Adapter
+ 007c ATM Controller (14107c00)
+ 007d 3780IDSP [MWave]
+ 008b EADS PCI to PCI Bridge
+ 008e GXT3000P Graphics Adapter
+ 0090 GXT 3000P
+ 1014 008e GXT-3000P
+ 0091 SSA Adapter
+ 0095 20H2999 PCI Docking Bridge
+ 0096 Chukar chipset SCSI controller
+ 1014 0097 iSeries 2778 DASD IOA
+ 1014 0098 iSeries 2763 DASD IOA
+ 1014 0099 iSeries 2748 DASD IOA
+ 009f PCI 4758 Cryptographic Accelerator
+ 00a5 ATM Controller (1410a500)
+ 00a6 ATM 155MBPS MM Controller (1410a600)
+ 00b7 256-bit Graphics Rasterizer [FireGL1]
+ 1092 00b8 FireGL1 AGP 32Mb
+ 00b8 GXT2000P Graphics Adapter
+ 00be ATM 622MBPS Controller (1410be00)
+ 00dc Advanced Systems Management Adapter (ASMA)
+ 00fc CPC710 Dual Bridge and Memory Controller (PCI-64)
+ 0104 Gigabit Ethernet-SX Adapter
+ 0105 CPC710 Dual Bridge and Memory Controller (PCI-32)
+ 010f Remote Supervisor Adapter (RSA)
+ 0142 Yotta Video Compositor Input
+ 1014 0143 Yotta Input Controller (ytin)
+ 0144 Yotta Video Compositor Output
+ 1014 0145 Yotta Output Controller (ytout)
+ 0156 405GP PLB to PCI Bridge
+ 015e 622Mbps ATM PCI Adapter
+ 0160 64bit/66MHz PCI ATM 155 MMF
+ 016e GXT4000P Graphics Adapter
+ 0170 GXT6000P Graphics Adapter
+ 017d GXT300P Graphics Adapter
+ 0180 Snipe chipset SCSI controller
+ 1014 0241 iSeries 2757 DASD IOA
+ 1014 0264 Quad Channel PCI-X U320 SCSI RAID Adapter (2780)
+ 0188 EADS-X PCI-X to PCI-X Bridge
+ 01a7 PCI-X to PCI-X Bridge
+ 01bd ServeRAID Controller
+ 1014 01bd ServeRAID 4Lx
+ 1014 01be ServeRAID-4M
+ 1014 01bf ServeRAID-4L
+ 1014 0208 ServeRAID-4Mx
+ 1014 020e ServeRAID-4Lx
+ 1014 022e ServeRAID-4H
+ 1014 0258 ServeRAID-5i
+ 1014 0259 ServeRAID-5i
+ 01c1 64bit/66MHz PCI ATM 155 UTP
+ 01e6 Cryptographic Accelerator
+ 01ef PowerPC 440GP PCI Bridge
+ 1734 102b PCEAS PCI-X Dual Port ESCON Adapter
+ 1734 10f8 PCEAT PCI-Express Dual Port ESCON Adapter
+ 01ff 10/100 Mbps Ethernet
+ 0219 Multiport Serial Adapter
+ 1014 021a Dual RVX
+ 1014 0251 Internal Modem/RVX
+ 1014 0252 Quad Internal Modem
+ 021b GXT6500P Graphics Adapter
+ 021c GXT4500P Graphics Adapter
+ 0233 GXT135P Graphics Adapter
+ 0266 PCI-X Dual Channel SCSI
+ 0268 Gigabit Ethernet-SX Adapter (PCI-X)
+ 0269 10/100/1000 Base-TX Ethernet Adapter (PCI-X)
+ 028c Citrine chipset SCSI controller
+ 1014 028d Dual Channel PCI-X DDR SAS RAID Adapter (572E)
+ 1014 02be Dual Channel PCI-X DDR U320 SCSI RAID Adapter (571B)
+ 1014 02c0 Dual Channel PCI-X DDR U320 SCSI Adapter (571A)
+ 1014 030d PCI-X DDR Auxiliary Cache Adapter (575B)
+ 02a1 Calgary PCI-X Host Bridge
+ 02bd Obsidian chipset SCSI controller
+ 1014 02c1 PCI-X DDR 3Gb SAS Adapter (572A/572C)
+ 1014 02c2 PCI-X DDR 3Gb SAS RAID Adapter (572B/571D)
+ 1014 0338 PCI-X DDR Auxiliary Cache Adapter (575C)
+ 0302 Winnipeg PCI-X Host Bridge
+ 0308 CalIOC2 PCI-E Root Port
+ 0314 ZISC 036 Neural accelerator card
+ 032d Axon - Cell Companion Chip
+ 1014 03a1 PCIe PowerXCell 8i Cell Accelerator Board
+ 0339 Obsidian-E PCI-E SCSI controller
+ 1014 030a PCIe 3Gb SAS RAID Adapter (574E)
+ 1014 033a PCIe 3Gb SAS Adapter (57B3)
+ 1014 0360 PCI-E Auxiliary Cache Adapter (57B7)
+ 033d PCI-E IPR SAS Adapter (FPGA)
+ 1014 033c PCIe2 1.8GB Cache 6Gb SAS RAID Adapter Tri-port (57B5)
+ 1014 0356 PCIe2 1.8GB Cache 6Gb SAS RAID & SSD Adapter (574D)
+ 1014 035f PCIe2 6Gb SAS Adapter Quad-port (57B2)
+ 034a PCI-E IPR SAS Adapter (ASIC)
+ 1014 033b PCIe2 6Gb SAS RAID Adapter Quad-port (57B4)
+ 1014 0355 PCIe2 3.6GB Cache 6Gb SAS RAID Adapter Quad-port (57B1)
+ 1014 0357 PCIe2 6Gb SAS Adapter Quad-port (57C6)
+ 1014 035d PCIe2 3.6GB Cache 6Gb SAS RAID & SSD Adapter (575D)
+ 1014 035e PCIe2 3.6GB Cache 6Gb SAS RAID Adapter Quad-port (57CE)
+ 3022 QLA3022 Network Adapter
+ 4022 QLA3022 Network Adapter
+ ffff MPIC-2 interrupt controller
+1015 LSI Logic Corp of Canada
+1016 ICL Personal Systems
+1017 SPEA Software AG
+ 5343 SPEA 3D Accelerator
+1018 Unisys Systems
+1019 Elitegroup Computer Systems
+101a AT&T GIS (NCR)
+ 0005 100VG ethernet
+ 0007 BYNET BIC4G/2C/2G
+ 101a 0019 BYNET BIC2C
+ 101a 001c BYNET BIC2G
+ 101a 001f BYNET BIC4G
+ 0009 PQS Memory Controller
+ 000a BYNET BPCI Adapter
+ 000b BYNET 4 Port BYA Switch (BYA4P)
+ 000c BYNET 4 Port BYA Switch (BYA4G)
+ 0010 NCR AMC Memory Controller
+ 1dc1 BYNET BIC2M/BIC4M/BYA4M
+ 101a 0019 BIC2M
+ 101a 001f BIC4M
+ 101a 0ece BYA4M
+ 1fa8 BYNET Multi-port BIC Adapter (XBIC Based)
+ 101a 00c3 BYNET BIC2SE
+101b Vitesse Semiconductor
+# Maxim VSC452 Super BMC Controller with Video
+ 0452 VSC452 [SuperBMC]
+101c Western Digital
+ 0193 33C193A
+ 0196 33C196A
+ 0197 33C197A
+ 0296 33C296A
+ 3193 7193
+ 3197 7197
+ 3296 33C296A
+ 4296 34C296
+ 9710 Pipeline 9710
+ 9712 Pipeline 9712
+ c24a 90C
+# ID for Newly Acquired Storage Products from Vitesse
+101d Maxim Integrated Products
+101e American Megatrends Inc.
+ 0009 MegaRAID 428 Ultra RAID Controller (rev 03)
+ 1960 MegaRAID
+ 101e 0471 MegaRAID 471 Enterprise 1600 RAID Controller
+ 101e 0475 MegaRAID 475 Express 500/500LC RAID Controller
+ 101e 0477 MegaRAID 477 Elite 3100 RAID Controller
+ 101e 0493 MegaRAID 493 Elite 1600 RAID Controller
+ 101e 0494 MegaRAID 494 Elite 1650 RAID Controller
+ 101e 0503 MegaRAID 503 Enterprise 1650 RAID Controller
+ 101e 0511 MegaRAID 511 i4 IDE RAID Controller
+ 101e 0522 MegaRAID 522 i4133 RAID Controller
+ 1028 0471 PowerEdge RAID Controller 3/QC
+ 1028 0475 PowerEdge RAID Controller 3/SC
+ 1028 0493 PowerEdge RAID Controller 3/DC
+ 1028 0511 PowerEdge Cost Effective RAID Controller ATA100/4Ch
+ 103c 60e7 NetRAID-1M
+ 9010 MegaRAID 428 Ultra RAID Controller
+ 9030 EIDE Controller
+ 9031 EIDE Controller
+ 9032 EIDE & SCSI Controller
+ 9033 SCSI Controller
+ 9040 Multimedia card
+ 9060 MegaRAID 434 Ultra GT RAID Controller
+ 9063 MegaRAC
+ 101e 0767 Dell Remote Assistant Card 2
+101f PictureTel
+1020 Hitachi Computer Products
+1021 OKI Electric Industry Co. Ltd.
+1022 Advanced Micro Devices [AMD]
+ 1100 K8 [Athlon64/Opteron] HyperTransport Technology Configuration
+ 1101 K8 [Athlon64/Opteron] Address Map
+ 1102 K8 [Athlon64/Opteron] DRAM Controller
+ 1103 K8 [Athlon64/Opteron] Miscellaneous Control
+ 1200 Family 10h Processor HyperTransport Configuration
+ 1201 Family 10h Processor Address Map
+ 1202 Family 10h Processor DRAM Controller
+ 1203 Family 10h Processor Miscellaneous Control
+ 1204 Family 10h Processor Link Control
+ 1300 Family 11h Processor HyperTransport Configuration
+ 1301 Family 11h Processor Address Map
+ 1302 Family 11h Processor DRAM Controller
+ 1303 Family 11h Processor Miscellaneous Control
+ 1304 Family 11h Processor Link Control
+ 1510 Family 14h Processor Root Complex
+ 1022 1510 Pavilion DM1Z-3000 Host bridge
+ 1512 Family 14h Processor Root Port
+ 1513 Family 14h Processor Root Port
+ 1514 Family 14h Processor Root Port
+ 1515 Family 14h Processor Root Port
+ 1516 Family 14h Processor Root Port
+ 1600 Family 15h Processor Function 0
+ 1601 Family 15h Processor Function 1
+ 1602 Family 15h Processor Function 2
+ 1603 Family 15h Processor Function 3
+ 1604 Family 15h Processor Function 4
+ 1605 Family 15h Processor Function 5
+ 1700 Family 12h/14h Processor Function 0
+ 1701 Family 12h/14h Processor Function 1
+ 1702 Family 12h/14h Processor Function 2
+ 1703 Family 12h/14h Processor Function 3
+ 1704 Family 12h/14h Processor Function 4
+ 1705 Family 12h Processor Root Complex
+ 1707 Family 12h Processor Root Port
+ 1708 Family 12h Processor Root Port
+ 1709 Family 12h Processor Root Port
+ 170a Family 12h Processor Root Port
+ 170b Family 12h Processor Root Port
+ 170c Family 12h Processor Root Port
+ 170d Family 12h Processor Root Port
+ 1716 Family 12h/14h Processor Function 5
+ 1718 Family 12h/14h Processor Function 6
+ 1719 Family 12h/14h Processor Function 7
+ 2000 79c970 [PCnet32 LANCE]
+ 1014 2000 NetFinity 10/100 Fast Ethernet
+ 1022 2000 PCnet - Fast 79C971
+ 103c 104c Ethernet with LAN remote power Adapter
+ 103c 1064 Ethernet with LAN remote power Adapter
+ 103c 1065 Ethernet with LAN remote power Adapter
+ 103c 106c Ethernet with LAN remote power Adapter
+ 103c 106e Ethernet with LAN remote power Adapter
+ 103c 10ea Ethernet with LAN remote power Adapter
+ 1113 1220 EN1220 10/100 Fast Ethernet
+ 1259 2450 AT-2450 10/100 Fast Ethernet
+ 1259 2454 AT-2450v4 10Mb Ethernet Adapter
+ 1259 2700 AT-2700TX 10/100 Fast Ethernet
+ 1259 2701 AT-2700FX 100Mb Ethernet
+ 1259 2702 AT-2700FTX 10/100 Mb Fiber/Copper Fast Ethernet
+ 1259 2703 AT-2701FX
+ 1259 2704 AT-2701FTX 10/100 Mb Fiber/Copper Fast Ethernet
+ 4c53 1000 CC7/CR7/CP7/VC7/VP7/VR7 mainboard
+ 4c53 1010 CP5/CR6 mainboard
+ 4c53 1020 VR6 mainboard
+ 4c53 1030 PC5 mainboard
+ 4c53 1040 CL7 mainboard
+ 4c53 1060 PC7 mainboard
+ 2001 79c978 [HomePNA]
+ 1092 0a78 Multimedia Home Network Adapter
+ 1668 0299 ActionLink Home Network Adapter
+ 2003 Am 1771 MBW [Alchemy]
+ 2020 53c974 [PCscsi]
+ 2040 79c974
+ 2080 CS5536 [Geode companion] Host Bridge
+ 2081 Geode LX Video
+ 2082 Geode LX AES Security Block
+ 208f CS5536 GeodeLink PCI South Bridge
+ 2090 CS5536 [Geode companion] ISA
+ 2091 CS5536 [Geode companion] FLASH
+ 2093 CS5536 [Geode companion] Audio
+ 2094 CS5536 [Geode companion] OHC
+ 2095 CS5536 [Geode companion] EHC
+ 2096 CS5536 [Geode companion] UDC
+ 2097 CS5536 [Geode companion] UOC
+ 209a CS5536 [Geode companion] IDE
+ 3000 ELanSC520 Microcontroller
+ 7006 AMD-751 [Irongate] System Controller
+ 7007 AMD-751 [Irongate] AGP Bridge
+ 700a AMD-IGR4 AGP Host to PCI Bridge
+ 700b AMD-IGR4 PCI to PCI Bridge
+ 700c AMD-760 MP [IGD4-2P] System Controller
+ 700d AMD-760 MP [IGD4-2P] AGP Bridge
+ 700e AMD-760 [IGD4-1P] System Controller
+ 700f AMD-760 [IGD4-1P] AGP Bridge
+ 7400 AMD-755 [Cobra] ISA
+ 7401 AMD-755 [Cobra] IDE
+ 7403 AMD-755 [Cobra] ACPI
+ 7404 AMD-755 [Cobra] USB
+ 7408 AMD-756 [Viper] ISA
+ 7409 AMD-756 [Viper] IDE
+ 740b AMD-756 [Viper] ACPI
+ 740c AMD-756 [Viper] USB
+ 7410 AMD-766 [ViperPlus] ISA
+ 7411 AMD-766 [ViperPlus] IDE
+ 7413 AMD-766 [ViperPlus] ACPI
+ 7414 AMD-766 [ViperPlus] USB
+ 7440 AMD-768 [Opus] ISA
+ 1043 8044 A7M-D Mainboard
+ 7441 AMD-768 [Opus] IDE
+ 7443 AMD-768 [Opus] ACPI
+ 1043 8044 A7M-D Mainboard
+ 7445 AMD-768 [Opus] Audio
+ 7446 AMD-768 [Opus] MC97 Modem (Smart Link HAMR5600 compatible)
+ 7448 AMD-768 [Opus] PCI
+ 7449 AMD-768 [Opus] USB
+ 7450 AMD-8131 PCI-X Bridge
+ 7451 AMD-8131 PCI-X IOAPIC
+ 7454 AMD-8151 System Controller
+ 7455 AMD-8151 AGP Bridge
+ 7458 AMD-8132 PCI-X Bridge
+ 7459 AMD-8132 PCI-X IOAPIC
+ 7460 AMD-8111 PCI
+ 161f 3017 HDAMB
+ 7461 AMD-8111 USB
+ 7462 AMD-8111 Ethernet
+ 7463 AMD-8111 USB EHCI
+ 7464 AMD-8111 USB OHCI
+ 161f 3017 HDAMB
+ 7468 AMD-8111 LPC
+ 161f 3017 HDAMB
+ 7469 AMD-8111 IDE
+ 1022 2b80 AMD-8111 IDE [Quartet]
+ 161f 3017 HDAMB
+ 746a AMD-8111 SMBus 2.0
+ 746b AMD-8111 ACPI
+ 161f 3017 HDAMB
+ 746d AMD-8111 AC97 Audio
+ 161f 3017 HDAMB
+ 746e AMD-8111 MC97 Modem
+ 756b AMD-8111 ACPI
+ 7800 Hudson SATA Controller [IDE mode]
+ 7801 Hudson SATA Controller [AHCI mode]
+ 7802 Hudson SATA Controller [RAID mode]
+ 7803 Hudson SATA Controller [RAID mode]
+ 7804 Hudson SATA Controller [AHCI mode]
+ 7805 Hudson SATA Controller [RAID mode]
+ 7806 Hudson SD Flash Controller
+ 7807 Hudson USB OHCI Controller
+ 7808 Hudson USB EHCI Controller
+ 7809 Hudson USB OHCI Controller
+ 780b Hudson SMBus Controller
+ 780c Hudson IDE Controller
+ 780d Hudson Azalia Controller
+ 780e Hudson LPC Bridge
+ 780f Hudson PCI Bridge
+ 7812 Hudson USB XHCI Controller
+ 9600 RS780 Host Bridge
+ 1043 82f1 M3A78-EH Motherboard
+ 9601 RS880 Host Bridge
+ 1043 843e M5A88-V EVO
+ 9602 RS780/RS880 PCI to PCI bridge (int gfx)
+ 9603 RS780 PCI to PCI bridge (ext gfx port 0)
+ 9604 RS780 PCI to PCI bridge (PCIE port 0)
+ 9605 RS780 PCI to PCI bridge (PCIE port 1)
+ 9606 RS780 PCI to PCI bridge (PCIE port 2)
+ 9607 RS780 PCI to PCI bridge (PCIE port 3)
+ 9608 RS780/RS880 PCI to PCI bridge (PCIE port 4)
+ 9609 RS780/RS880 PCI to PCI bridge (PCIE port 5)
+ 960a RS780 PCI to PCI bridge (NB-SB link)
+ 960b RS780 PCI to PCI bridge (ext gfx port 1)
+1023 Trident Microsystems
+ 0194 82C194
+ 2000 4DWave DX
+ 2001 4DWave NX
+ 122d 1400 Trident PCI288-Q3DII (NX)
+ 2100 CyberBlade XP4m32
+ 2200 XGI Volari XP5
+ 8400 CyberBlade/i7
+ 1023 8400 CyberBlade i7 AGP
+ 8420 CyberBlade/i7d
+ 0e11 b15a CyberBlade i7 AGP
+ 8500 CyberBlade/i1
+ 8520 CyberBlade i1
+ 0e11 b16e CyberBlade i1 AGP
+ 1023 8520 CyberBlade i1 AGP
+ 8620 CyberBlade/i1
+ 1014 0502 ThinkPad R30/T30
+ 1014 1025 Travelmate 352TE
+ 8820 CyberBlade XPAi1
+ 9320 TGUI 9320
+ 9350 GUI Accelerator
+ 9360 Flat panel GUI Accelerator
+ 9382 Cyber 9382 [Reference design]
+ 9383 Cyber 9383 [Reference design]
+ 9385 Cyber 9385 [Reference design]
+ 9386 Cyber 9386
+ 9388 Cyber 9388
+ 9397 Cyber 9397
+ 939a Cyber 9397DVD
+ 9420 TGUI 9420
+ 9430 TGUI 9430
+ 9440 TGUI 9440
+ 9460 TGUI 9460
+ 9470 TGUI 9470
+ 9520 Cyber 9520
+ 9525 Cyber 9525
+ 9540 Cyber 9540
+ 9660 TGUI 9660/938x/968x
+ 9680 TGUI 9680
+ 9682 TGUI 9682
+ 9683 TGUI 9683
+ 9685 ProVIDIA 9685
+ 9750 3DImage 9750
+ 1014 9750 3DImage 9750
+ 1023 9750 3DImage 9750
+ 9753 TGUI 9753
+ 9754 TGUI 9754
+ 9759 TGUI 975
+ 9783 TGUI 9783
+ 9785 TGUI 9785
+ 9850 3DImage 9850
+ 9880 Blade 3D PCI/AGP
+ 1023 9880 Blade 3D
+ 9910 CyberBlade/XP
+ 9930 CyberBlade/XPm
+ 9960 CyberBlade XP2
+1024 Zenith Data Systems
+1025 Acer Incorporated [ALI]
+ 1435 M1435
+ 1445 M1445
+ 1449 M1449
+ 1451 M1451
+ 1461 M1461
+ 1489 M1489
+ 1511 M1511
+ 1512 ALI M1512 Aladdin
+ 1513 M1513
+ 1521 ALI M1521 Aladdin III CPU Bridge
+ 10b9 1521 ALI M1521 Aladdin III CPU Bridge
+ 1523 ALI M1523 ISA Bridge
+ 10b9 1523 ALI M1523 ISA Bridge
+ 1531 M1531 Northbridge [Aladdin IV/IV+]
+ 1533 M1533 PCI-to-ISA Bridge
+ 10b9 1533 ALI M1533 Aladdin IV/V ISA South Bridge
+ 1535 M1535 PCI Bridge + Super I/O + FIR
+ 1541 M1541 Northbridge [Aladdin V]
+ 10b9 1541 ALI M1541 Aladdin V/V+ AGP+PCI North Bridge
+ 1542 M1542 Northbridge [Aladdin V]
+ 1543 M1543 PCI-to-ISA Bridge + Super I/O + FIR
+ 1561 M1561 Northbridge [Aladdin 7]
+ 1621 M1621 Northbridge [Aladdin-Pro II]
+ 1631 M1631 Northbridge+3D Graphics [Aladdin TNT2]
+ 1641 M1641 Northbridge [Aladdin-Pro IV]
+ 1647 M1647 [MaGiK1] PCI North Bridge
+ 1671 M1671 Northbridge [ALADDiN-P4]
+ 1672 Northbridge [CyberALADDiN-P4]
+ 3141 M3141
+ 3143 M3143
+ 3145 M3145
+ 3147 M3147
+ 3149 M3149
+ 3151 M3151
+ 3307 M3307 MPEG-I Video Controller
+ 3309 M3309 MPEG-II Video w/ Software Audio Decoder
+ 3321 M3321 MPEG-II Audio/Video Decoder
+ 5212 M4803
+ 5215 ALI PCI EIDE Controller
+ 5217 M5217H
+ 5219 M5219
+ 5225 M5225
+ 5229 M5229
+ 5235 M5235
+ 5237 M5237 PCI USB Host Controller
+ 5240 EIDE Controller
+ 5241 PCMCIA Bridge
+ 5242 General Purpose Controller
+ 5243 PCI to PCI Bridge Controller
+ 5244 Floppy Disk Controller
+ 5247 M1541 PCI to PCI Bridge
+ 5251 M5251 P1394 Controller
+ 5427 PCI to AGP Bridge
+ 5451 M5451 PCI AC-Link Controller Audio Device
+ 5453 M5453 PCI AC-Link Controller Modem Device
+ 7101 M7101 PCI PMU Power Management Controller
+ 10b9 7101 M7101 PCI PMU Power Management Controller
+1028 Dell
+ 0001 PowerEdge Expandable RAID Controller 2/Si
+ 1028 0001 PowerEdge 2400
+ 0002 PowerEdge Expandable RAID Controller 3/Di
+ 1028 0002 PowerEdge 4400
+ 1028 00d1 PERC 3/DiV [Viper]
+ 1028 00d9 PERC 3/DiL [Lexus]
+ 0003 PowerEdge Expandable RAID Controller 3/Si
+ 1028 0003 PowerEdge 2450
+# PowerEdge Codename Iguana
+ 0004 PowerEdge Expandable RAID Controller 3/Di [Iguana]
+ 1028 0004 PERC 3/DiF [Iguana]
+ 0006 PowerEdge Expandable RAID Controller 3/Di
+ 0007 Remote Access Card III
+ 0008 Remote Access Card III
+ 0009 Remote Access Card III: BMC/SMIC device not present
+ 000a PowerEdge Expandable RAID Controller 3/Di
+ 1028 0106 PERC 3/DiJ [Jaguar]
+ 1028 011b PERC 3/DiD [Dagger]
+ 1028 0121 PERC 3/DiB [Boxster]
+ 000c Embedded Remote Access or ERA/O
+ 000d Embedded Remote Access: BMC/SMIC device
+ 000e PowerEdge Expandable RAID controller 4/Di
+ 000f PowerEdge Expandable RAID controller 4/Di
+ 1028 014a PowerEdge 1750
+ 0010 Remote Access Card 4
+ 0011 Remote Access Card 4 Daughter Card
+ 0012 Remote Access Card 4 Daughter Card Virtual UART
+ 0013 PowerEdge Expandable RAID controller 4
+ 1028 016c PowerEdge Expandable RAID Controller 4e/Si
+ 1028 016d PowerEdge Expandable RAID Controller 4e/Di
+ 1028 016e PowerEdge Expandable RAID Controller 4e/Di
+ 1028 016f PowerEdge Expandable RAID Controller 4e/Di
+ 1028 0170 PowerEdge Expandable RAID Controller 4e/Di
+ 0014 Remote Access Card 4 Daughter Card SMIC interface
+ 0015 PowerEdge Expandable RAID controller 5
+ 1028 1f01 PERC 5/E Adapter RAID Controller
+ 1028 1f02 PERC 5/i Adapter RAID Controller
+ 1028 1f03 PERC 5/i Integrated RAID Controller
+ 0016 PowerEdge Expandable RAID controller S300
+ 1028 1f24 PERC S300 Controller
+1029 Siemens Nixdorf IS
+102a LSI Logic
+ 0000 HYDRA
+ 0010 ASPEN
+ 001f AHA-2940U2/U2W /7890/7891 SCSI Controllers
+ 9005 000f 2940U2W SCSI Controller
+ 9005 0106 2940U2W SCSI Controller
+ 9005 a180 2940U2W SCSI Controller
+ 00c5 AIC-7899 U160/m SCSI Controller
+ 1028 00c5 PowerEdge 2550/2650/4600
+ 00cf AIC-7899P U160/m
+ 1028 0106 PowerEdge 4600
+ 1028 0121 PowerEdge 2650
+102b Matrox Graphics, Inc.
+# DJ: I've a suspicion that 0010 is a duplicate of 0d10.
+ 0010 MGA-I [Impression?]
+ 0100 MGA 1064SG [Mystique]
+ 0518 MGA-II [Athena]
+ 0519 MGA 2064W [Millennium]
+ 051a MGA 1064SG [Mystique]
+ 102b 0100 MGA-1064SG Mystique
+ 102b 1100 MGA-1084SG Mystique
+ 102b 1200 MGA-1084SG Mystique
+ 1100 102b MGA-1084SG Mystique
+ 110a 0018 Scenic Pro C5 (D1025)
+ 051b MGA 2164W [Millennium II]
+ 102b 051b MGA-2164W Millennium II
+ 102b 1100 MGA-2164W Millennium II
+ 102b 1200 MGA-2164W Millennium II
+ 102b 2100 MGA-2164W Millennium II
+ 051e MGA 1064SG [Mystique] AGP
+ 051f MGA 2164W [Millennium II] AGP
+ 0520 MGA G200
+ 102b dbc2 G200 Multi-Monitor
+ 102b dbc8 G200 Multi-Monitor
+ 102b dbe2 G200 Multi-Monitor
+ 102b dbe8 G200 Multi-Monitor
+ 102b ff03 Millennium G200 SD
+ 102b ff04 Marvel G200
+ 0521 MGA G200 AGP
+ 1014 ff03 Millennium G200 AGP
+ 102b 48e9 Mystique G200 AGP
+ 102b 48f8 Millennium G200 SD AGP
+ 102b 4a60 Millennium G200 LE AGP
+ 102b 4a64 Millennium G200 AGP
+ 102b c93c Millennium G200 AGP
+ 102b c9b0 Millennium G200 AGP
+ 102b c9bc Millennium G200 AGP
+ 102b ca60 Millennium G250 LE AGP
+ 102b ca6c Millennium G250 AGP
+ 102b dbbc Millennium G200 AGP
+ 102b dbc2 Millennium G200 MMS (Dual G200)
+ 102b dbc3 G200 Multi-Monitor
+ 102b dbc8 Millennium G200 MMS (Dual G200)
+ 102b dbd2 G200 Multi-Monitor
+ 102b dbd3 G200 Multi-Monitor
+ 102b dbd4 G200 Multi-Monitor
+ 102b dbd5 G200 Multi-Monitor
+ 102b dbd8 G200 Multi-Monitor
+ 102b dbd9 G200 Multi-Monitor
+ 102b dbe2 Millennium G200 MMS (Quad G200)
+ 102b dbe3 G200 Multi-Monitor
+ 102b dbe8 Millennium G200 MMS (Quad G200)
+ 102b dbf2 G200 Multi-Monitor
+ 102b dbf3 G200 Multi-Monitor
+ 102b dbf4 G200 Multi-Monitor
+ 102b dbf5 G200 Multi-Monitor
+ 102b dbf8 G200 Multi-Monitor
+ 102b dbf9 G200 Multi-Monitor
+ 102b f806 Mystique G200 Video AGP
+ 102b ff00 MGA-G200 AGP
+ 102b ff02 Mystique G200 AGP
+ 102b ff03 Millennium G200 AGP
+ 102b ff04 Marvel G200 AGP
+ 110a 0032 MGA-G200 AGP
+ 0522 MGA G200e [Pilot] ServerEngines (SEP1)
+ 0525 MGA G400/G450
+ 0e11 b16f MGA-G400 AGP
+ 102b 0328 Millennium G400 16Mb SDRAM
+ 102b 0338 Millennium G400 16Mb SDRAM
+ 102b 0378 Millennium G400 32Mb SDRAM
+ 102b 0541 Millennium G450 Dual Head
+ 102b 0542 Millennium G450 Dual Head LX
+ 102b 0543 Millennium G450 Single Head LX
+ 102b 0641 Millennium G450 32Mb SDRAM Dual Head
+ 102b 0642 Millennium G450 32Mb SDRAM Dual Head LX
+ 102b 0643 Millennium G450 32Mb SDRAM Single Head LX
+ 102b 07c0 Millennium G450 Dual Head LE
+ 102b 07c1 Millennium G450 SDR Dual Head LE
+ 102b 0d41 Millennium G450 Dual Head PCI
+ 102b 0d42 Millennium G450 Dual Head LX PCI
+ 102b 0d43 Millennium G450 32Mb Dual Head PCI
+ 102b 0e00 Marvel G450 eTV
+ 102b 0e01 Marvel G450 eTV
+ 102b 0e02 Marvel G450 eTV
+ 102b 0e03 Marvel G450 eTV
+ 102b 0f80 Millennium G450 Low Profile
+ 102b 0f81 Millennium G450 Low Profile
+ 102b 0f82 Millennium G450 Low Profile DVI
+ 102b 0f83 Millennium G450 Low Profile DVI
+ 102b 19d8 Millennium G400 16Mb SGRAM
+ 102b 19f8 Millennium G400 32Mb SGRAM
+ 102b 2159 Millennium G400 Dual Head 16Mb
+ 102b 2179 Millennium G400 MAX/Dual Head 32Mb
+ 102b 217d Millennium G400 Dual Head Max
+ 102b 23c0 Millennium G450
+ 102b 23c1 Millennium G450
+ 102b 23c2 Millennium G450 DVI
+ 102b 23c3 Millennium G450 DVI
+ 102b 2f58 Millennium G400
+ 102b 2f78 Millennium G400
+ 102b 3693 Marvel G400 AGP
+ 102b 5dd0 4Sight II
+ 102b 5f50 4Sight II
+ 102b 5f51 4Sight II
+ 102b 5f52 4Sight II
+ 102b 9010 Millennium G400 Dual Head
+ 1458 0400 GA-G400
+ 1705 0001 Millennium G450 32MB SGRAM
+ 1705 0002 Millennium G450 16MB SGRAM
+ 1705 0003 Millennium G450 32MB
+ 1705 0004 Millennium G450 16MB
+ 0527 Parhelia
+ 102b 0840 Parhelia 128Mb
+ 102b 0850 Parhelia 256MB
+ 102b 0870 MED2mp-DVI
+ 102b 0880 P-256 Edge Overlap Controller
+ 0528 Parhelia
+ 102b 1020 Parhelia 128MB
+ 102b 1030 Parhelia 256 MB Dual DVI
+ 102b 1040 MED2mp-DVI
+ 102b 1050 Sono S20
+ 102b 1060 PJ-30L
+ 102b 1070 PJ-40L
+ 102b 1421 MED5mp
+ 102b 1431 MED3mp-DVI
+ 102b 1451 MED5mp-DVI
+ 102b 1491 MED2mp-DVI
+ 102b 14b1 MED3mp-DVI
+ 102b 14c1 MED5mp-DVI
+ 102b 14e1 Parhelia PCI 256MB
+ 102b 14f1 Parhelia Precision SGT
+ 102b 1501 ATC-4MP
+ 102b 1511 ATC-4MP
+ 102b 1521 TheatreVUE T30
+ 102b 1531 TheatreVUE T20
+ 102b 1541 MED2mp-DVI
+ 102b 1551 MED3mp-DVI
+ 102b 1561 MED5mp-DVI
+ 102b 1571 Parhelia DL256 PCI
+ 102b 1591 Parhelia Precision SDT
+ 102b 15a1 MED4mp-DVI
+ 102b 2011 Parhelia HR256
+ 102b 2021 QID Pro
+ 102b 2061 PJ-40LP
+ 102b 2081 EWS Quad
+ 102b 2411 PPX-OUT8
+ 102b 2421 VPX-OUT8
+ 102b 2441 PPX-OUT4
+ 102b 2451 VPX-OUT4
+ 102b 2491 LPX-OUT4
+ 0530 MGA G200EV
+ 0532 MGA G200eW WPCM450
+ 1028 0235 PowerEdge R710 MGA G200eW WPCM450
+ 1028 0236 PowerEdge R610 MGA G200eW WPCM450
+ 1028 0237 PowerEdge T610 MGA G200eW WPCM450
+ 1028 0287 PowerEdge M610 MGA G200eW WPCM450
+ 1028 028c PowerEdge R410 MGA G200eW WPCM450
+ 1028 028d PowerEdge T410 MGA G200eW WPCM450
+ 1028 029c PowerEdge M710 MGA G200eW WPCM450
+ 1028 02a4 PowerEdge T310 MGA G200eW WPCM450
+ 0533 MGA G200EH
+ 103c 3381 iLO4
+ 0534 G200eR2
+ 0540 M91XX
+ 102b 2080 M9140 LP PCIe x16
+ 102b 20c0 Xenia
+ 102b 20c1 Xenia Pro
+ 102b 2100 M9120 PCIe x16
+ 102b 2140 M9125 PCIe x16
+ 102b 2180 M9120 Plus LP PCIe x16
+ 102b 21c0 M9120 Plus LP PCIe x1
+ 102b 2200 VDA1164 Output Board
+ 102b 2240 M9148 LP PCIe x16
+ 102b 2241 M9138 LP PCIe x16
+ 102b 2280 M9188 ATX PCIe x16
+ 102b 22c0 M9128 LP PCIe x16
+ 0d10 MGA Ultima/Impression
+ 1000 MGA G100 [Productiva]
+ 102b ff01 Productiva G100
+ 102b ff05 Productiva G100 Multi-Monitor
+ 1001 MGA G100 [Productiva] AGP
+ 102b 1001 MGA-G100 AGP
+ 102b ff00 MGA-G100 AGP
+ 102b ff01 MGA-G100 Productiva AGP
+ 102b ff03 Millennium G100 AGP
+ 102b ff04 MGA-G100 AGP
+ 102b ff05 MGA-G100 Productiva AGP Multi-Monitor
+ 110a 001e MGA-G100 AGP
+ 2007 MGA Mistral
+ 2527 MGA G550 AGP
+ 102b 0f83 Millennium G550
+ 102b 0f84 Millennium G550 Dual Head DDR 32Mb
+ 102b 1e41 Millennium G550
+# Clearly the device name should not say AGP anymore...
+ 102b 2300 Millennium G550 LP PCIE
+ 2537 Millenium P650/P750
+ 102b 1820 Millennium P750 64MB
+ 102b 1830 Millennium P650 64MB
+ 102b 1850 RAD2mp
+ 102b 1860 RAD3mp
+ 102b 1880 Sono S10
+ 102b 1c10 QID 128MB
+ 102b 2811 Millennium P650 Low-profile PCI 64MB
+ 102b 2821 Millenium P650 Low-profile PCI
+ 102b 2841 RAD PCI
+ 102b 2851 Spectrum PCI
+ 102b 2871 EpicA TC2
+ 102b 2c11 QID Low-profile PCI
+ 102b 2c21 QID LP PCI LW
+ 102b 2c31 QID LP PCI
+ 102b 2c41 EpicA TC4
+ 102b 3001 Extio F1400
+ 102b 3011 Extio F1220
+ 102b 3041 RG-200DL
+ 102b 3051 RG-400SL
+ 102b 3061 Extio F1420
+ 102b 3081 Extio F1240
+ 2538 Millenium P650 PCIe
+ 102b 0847 RAD PCIe
+ 102b 08c7 Millennium P650 PCIe 128MB
+ 102b 0907 Millennium P650 PCIe 64MB
+ 102b 0947 Parhelia APVe
+ 102b 0987 ATC PCIe 4MP
+ 102b 1047 Millennium P650 LP PCIe 128MB
+ 102b 1087 Millennium P650 LP PCIe 64MB
+ 102b 1801 Millenium P650 PCIe x1
+ 102b 2538 Parhelia APVe
+ 102b 3007 QID Low-profile PCIe
+ 102b 3087 Aurora VX3mp
+ 102b 30c7 QID LP PCIe
+ 2539 Millennium P690
+ 102b 0040 Millenium P690 PCIe x16
+ 102b 0042 ONYX
+ 102b 0043 SPECTRA
+ 102b 0080 Millenium P690 Plus LP PCIe x16
+ 102b 0081 Millenium P690 LP PCIe x16
+ 102b 0082 RAD LPX PCIe x16
+ 102b 00c0 Millenium P690 Plus LP PCI
+ 102b 00c2 Millenium P690 LP PCI
+ 102b 00c3 RAD LPX PCI
+ 102b 0101 Millenium P690 PCI
+ 102b 0140 Millenium P690 LP PCIe x1
+ 102b 0180 Display Wall IP Decode 128 MB
+ 4536 VIA Framegrabber
+ 4cdc Morphis Vision System Jpeg2000
+ 4fc5 Morphis Vision System
+ 5e10 Morphis Vision System Aux/IO
+ 6573 Shark 10/100 Multiport SwitchNIC
+102c Chips and Technologies
+ 00b8 F64310
+ 00c0 F69000 HiQVideo
+ 102c 00c0 F69000 HiQVideo
+ 4c53 1000 CC7/CR7/CP7/VC7/VP7/VR7 mainboard
+ 4c53 1010 CP5/CR6 mainboard
+ 4c53 1020 VR6 mainboard
+ 4c53 1030 PC5 mainboard
+ 4c53 1050 CT7 mainboard
+ 4c53 1051 CE7 mainboard
+ 00d0 F65545
+ 00d8 F65545
+ 00dc F65548
+ 00e0 F65550
+ 00e4 F65554
+ 00e5 F65555 HiQVPro
+ 0e11 b049 Armada 1700 Laptop Display Controller
+ 1179 0001 Satellite Pro/Satellite
+ 00f0 F68554
+ 00f4 F68554 HiQVision
+ 00f5 F68555
+ 0c30 F69030
+ 4c53 1000 CC7/CR7/CP7/VC7/VP7/VR7 mainboard
+ 4c53 1050 CT7 mainboard
+ 4c53 1051 CE7 mainboard
+ 4c53 1080 CT8 mainboard
+102d Wyse Technology Inc.
+ 50dc 3328 Audio
+102e Olivetti Advanced Technology
+102f Toshiba America
+ 0009 r4x00
+ 000a TX3927 MIPS RISC PCI Controller
+ 0020 ATM Meteor 155
+ 102f 00f8 ATM Meteor 155
+ 0030 TC35815CF PCI 10/100 Mbit Ethernet Controller
+ 0031 TC35815CF PCI 10/100 Mbit Ethernet Controller with WOL
+ 0032 TC35815CF PCI 10/100 Mbit Ethernet Controller on TX4939
+ 0105 TC86C001 [goku-s] IDE
+ 0106 TC86C001 [goku-s] USB 1.1 Host
+ 0107 TC86C001 [goku-s] USB Device Controller
+ 0108 TC86C001 [goku-s] I2C/SIO/GPIO Controller
+ 0180 TX4927/38 MIPS RISC PCI Controller
+ 0181 TX4925 MIPS RISC PCI Controller
+ 0182 TX4937 MIPS RISC PCI Controller
+ 01b4 Celleb platform IDE interface
+ 01b5 SCC USB 2.0 EHCI controller
+ 01b6 SCC USB 1.1 OHCI controller
+1030 TMC Research
+1031 Miro Computer Products AG
+ 5601 DC20 ASIC
+ 5607 Video I/O & motion JPEG compressor
+ 5631 Media 3D
+ 6057 MiroVideo DC10/DC30+
+1032 Compaq
+1033 NEC Corporation
+ 0000 Vr4181A USB Host or Function Control Unit
+ 0001 PCI to 486-like bus Bridge
+ 0002 PCI to VL98 Bridge
+ 0003 ATM Controller
+ 0004 R4000 PCI Bridge
+ 0005 PCI to 486-like bus Bridge
+ 0006 PC-9800 Graphic Accelerator
+ 0007 PCI to UX-Bus Bridge
+ 0008 PC-9800 Graphic Accelerator
+ 0009 PCI to PC9800 Core-Graph Bridge
+ 0016 PCI to VL Bridge
+ 001a [Nile II]
+ 0021 Vrc4373 [Nile I]
+ 0029 PowerVR PCX1
+ 002a PowerVR 3D
+ 002c Star Alpha 2
+ 002d PCI to C-bus Bridge
+ 0035 USB
+ 1033 0035 Hama USB 2.0 CardBus
+ 103c 1293 USB add-in card
+ 103c 1294 USB 2.0 add-in card
+ 1179 0001 USB
+ 12ee 7000 Root Hub
+ 14c2 0105 PTI-205N USB 2.0 Host Controller
+ 1799 0001 Root Hub
+ 1931 000a GlobeTrotter Fusion Quad Lite (PPP data)
+ 1931 000b GlobeTrotter Fusion Quad Lite (GSM data)
+ 807d 0035 PCI-USB2 (OHCI subsystem)
+ 003b PCI to C-bus Bridge
+ 003e NAPCCARD Cardbus Controller
+ 0046 PowerVR PCX2 [midas]
+ 005a Vrc5074 [Nile 4]
+ 0063 Firewarden
+ 0067 PowerVR Neon 250 Chipset
+ 1010 0020 PowerVR Neon 250 AGP 32Mb
+ 1010 0080 PowerVR Neon 250 AGP 16Mb
+ 1010 0088 PowerVR Neon 250 16Mb
+ 1010 0090 PowerVR Neon 250 AGP 16Mb
+ 1010 0098 PowerVR Neon 250 16Mb
+ 1010 00a0 PowerVR Neon 250 AGP 32Mb
+ 1010 00a8 PowerVR Neon 250 32Mb
+ 1010 0120 PowerVR Neon 250 AGP 32Mb
+ 0072 uPD72874 IEEE1394 OHCI 1.1 3-port PHY-Link Ctrlr
+ 0074 56k Voice Modem
+ 1033 8014 RCV56ACF 56k Voice Modem
+ 009b Vrc5476
+ 00a5 VRC4173
+ 00a6 VRC5477 AC97
+ 00cd IEEE 1394 [OrangeLink] Host Controller
+ 12ee 8011 Root hub
+ 00ce IEEE 1394 Host Controller
+ 00df Vr4131
+ 00e0 USB 2.0
+ 12ee 7001 Root hub
+ 14c2 0205 PTI-205N USB 2.0 Host Controller
+ 1799 0002 Root Hub
+ 807d 1043 PCI-USB2 (EHCI subsystem)
+ 00e7 uPD72873 IEEE1394 OHCI 1.1 2-port Host Controller
+ 00f2 uPD72874 IEEE1394 OHCI 1.1 3-port PHY-Link Ctrlr
+ 00f3 uPD6113x Multimedia Decoder/Processor [EMMA2]
+ 010c VR7701
+ 0125 uPD720400 PCI Express - PCI/PCI-X Bridge
+ 013a Dual Tuner/MPEG Encoder
+ 0194 uPD720200 USB 3.0 Host Controller
+ 1043 8413 P8P67 Deluxe Motherboard
+1034 Framatome Connectors USA Inc.
+1035 Comp. & Comm. Research Lab
+1036 Future Domain Corp.
+ 0000 TMC-18C30 [36C70]
+1037 Hitachi Micro Systems
+1038 AMP, Inc
+1039 Silicon Integrated Systems [SiS]
+ 0001 Virtual PCI-to-PCI bridge (AGP)
+ 0002 SG86C202
+ 0003 SiS AGP Port (virtual PCI-to-PCI bridge)
+ 0004 PCI-to-PCI bridge
+ 0006 85C501/2/3
+ 0008 SiS85C503/5513 (LPC Bridge)
+ 0009 ACPI
+ 000a PCI-to-PCI bridge
+ 0016 SiS961/2 SMBus Controller
+ 0018 SiS85C503/5513 (LPC Bridge)
+ 0180 RAID bus controller 180 SATA/PATA [SiS]
+ 0181 SATA
+ 0182 182 SATA/RAID Controller
+ 1734 1095 D2030-A1
+ 0186 AHCI Controller (0106)
+ 0190 190 Ethernet Adapter
+ 0191 191 Gigabit Ethernet Adapter
+ 0200 5597/5598/6326 VGA
+ 1039 0000 SiS5597 SVGA (Shared RAM)
+ 0204 82C204
+ 0205 SG86C205
+ 0300 300/305 PCI/AGP VGA Display Adapter
+ 107d 2720 Leadtek WinFast VR300
+ 0310 315H PCI/AGP VGA Display Adapter
+ 0315 315 PCI/AGP VGA Display Adapter
+ 0325 315PRO PCI/AGP VGA Display Adapter
+ 0330 330 [Xabre] PCI/AGP VGA Display Adapter
+ 0406 85C501/2
+ 0496 85C496
+ 0530 530 Host
+ 0540 540 Host
+ 0550 550 Host
+ 0597 5513C
+ 0601 85C601
+ 0620 620 Host
+ 0630 630 Host
+ 0633 633 Host
+ 0635 635 Host
+ 0645 SiS645 Host & Memory & AGP Controller
+ 0646 SiS645DX Host & Memory & AGP Controller
+ 0648 645xx
+ 0649 SiS649 Host
+ 0650 650/M650 Host
+ 0651 651 Host
+ 0655 655 Host
+ 0660 660 Host
+ 0661 661FX/M661FX/M661MX Host
+ 0662 662 Host
+ 0671 671MX
+ 0730 730 Host
+ 0733 733 Host
+ 0735 735 Host
+ 0740 740 Host
+ 0741 741/741GX/M741 Host
+ 0745 745 Host
+ 0746 746 Host
+ 0755 755 Host
+ 0760 760/M760 Host
+ 0761 761/M761 Host
+ 1734 1099 D2030-A1 Motherboard
+ 0900 SiS900 PCI Fast Ethernet
+ 1019 0a14 K7S5A motherboard
+ 1039 0900 SiS900 10/100 Ethernet Adapter onboard [Asus P4SC-EA]
+ 1043 8035 CUSI-FX motherboard
+ 1043 80a7 Motherboard P4S800D-X
+ 1462 0900 MS-6701 motherboard
+ 0961 SiS961 [MuTIOL Media IO]
+ 0962 SiS962 [MuTIOL Media IO]
+ 0963 SiS963 [MuTIOL Media IO]
+ 0964 SiS964 [MuTIOL Media IO]
+ 0965 SiS965 [MuTIOL Media IO]
+ 0966 SiS966 [MuTIOL Media IO]
+ 0968 SiS968 [MuTIOL Media IO]
+ 1180 SATA Controller / IDE mode
+ 1182 SATA Controller / RAID mode
+ 1183 SATA Controller / IDE mode
+ 1184 AHCI Controller / RAID mode
+ 1185 AHCI IDE Controller (0106)
+ 3602 83C602
+ 5107 5107
+ 5300 SiS540 PCI Display Adapter
+ 5315 550 PCI/AGP VGA Display Adapter
+ 5401 486 PCI Chipset
+ 5511 5511/5512
+ 5513 5513 [IDE]
+ 1019 0970 P6STP-FL motherboard
+ 1039 5513 SiS5513 EIDE Controller (A,B step)
+ 1043 8035 CUSI-FX motherboard
+ 1462 7010 MS-6701 motherboard
+ 1631 5513 GA-8SIML Rev1.0 Motherboard
+ 1734 1095 D2030-A1 Motherboard
+ 5517 5517
+ 5571 5571
+ 5581 5581 Pentium Chipset
+ 5582 5582
+ 5591 5591/5592 Host
+ 5596 5596 Pentium Chipset
+ 5597 5597 [SiS5582]
+ 5600 5600 Host
+ 6204 Video decoder & MPEG interface
+ 6205 VGA Controller
+ 6236 6236 3D-AGP
+ 6300 630/730 PCI/AGP VGA Display Adapter
+ 1019 0970 P6STP-FL motherboard
+ 1043 8035 CUSI-FX motherboard
+ 104d 80e2 VAIO PCV-J200
+ 6306 530/620 PCI/AGP VGA Display Adapter
+ 6325 65x/M650/740 PCI/AGP VGA Display Adapter
+ 1039 6325 SiS 651 onboard [Asus P4SC-EA]
+ 1631 1004 SiS 651C onboard [Gigabyte GA-8SIML Rev1.0]
+ 6326 86C326 5598/6326
+ 1039 6326 SiS6326 GUI Accelerator
+ 1092 0a50 SpeedStar A50
+ 1092 0a70 SpeedStar A70
+ 1092 4910 SpeedStar A70
+ 1092 4920 SpeedStar A70
+ 10b0 6326 S6110-B (AGP)
+ 1569 6326 SiS6326 GUI Accelerator
+ 6330 661/741/760 PCI/AGP or 662/761Gx PCIE VGA Display Adapter
+ 1039 6330 [M]661xX/[M]741[GX]/[M]760 PCI/AGP VGA Adapter
+ 1043 8113 SiS Real 256E (ASUS P5S800-VM motherboard)
+ 1458 d000 SiS661FX GUI 2D/3D Accelerator
+ 1734 1099 D2030-A1
+ 6350 770/670 PCIE VGA Display Adapter
+ 6351 771/671 PCIE VGA Display Adapter
+ 7001 USB 1.1 Controller
+ 1019 0a14 K7S5A motherboard
+ 1039 7000 Onboard USB Controller
+ 1462 5470 ECS K7SOM+ motherboard
+ 1462 7010 MS-6701 motherboard
+ 1734 1095 D2030-A1 Motherboard
+ 7002 USB 2.0 Controller
+ 1462 5470 K7SOM+ 5.2C Motherboard
+ 1462 7010 MS-6701 motherboard
+ 1509 7002 Onboard USB Controller
+ 1734 1095 D2030-A1
+ 7007 FireWire Controller
+ 1462 701d MS-6701
+ 7012 C-Media AC'97 Sound Controller
+ 1039 7012 SiS 7012 onboard [Asus P4SC-EA] AC'97 Sound Controller
+ 1043 818f A8S-X Motherboard
+ 13f6 0300 CMI9739(A) on ECS K7SOM+ motherboard
+ 1462 5850 MSI 648 Max (MS-6585)
+ 1462 7010 MS-6701 motherboard
+ 15bd 1001 DFI 661FX motherboard
+ 1734 109f D2030-A1 Motherboard
+ 1849 7012 K7S41GX motherboard
+# There are may be different modem codecs here (Intel537 compatible and incompatible)
+ 7013 AC'97 Modem Controller
+ 7016 SiS7016 PCI Fast Ethernet Adapter
+ 1039 7016 SiS7016 10/100 Ethernet Adapter
+ 7018 SiS PCI Audio Accelerator
+ 1014 01b6 SiS PCI Audio Accelerator
+ 1014 01b7 SiS PCI Audio Accelerator
+ 1019 7018 SiS PCI Audio Accelerator
+ 1025 000e SiS PCI Audio Accelerator
+ 1025 0018 SiS PCI Audio Accelerator
+ 1039 7018 SiS PCI Audio Accelerator
+ 1043 1453 SiS PCI Audio Accelerator
+ 1043 800b SiS PCI Audio Accelerator
+ 104d 80e2 VAIO PCV-J200
+ 1054 7018 SiS PCI Audio Accelerator
+ 107d 5330 SiS PCI Audio Accelerator
+ 107d 5350 SiS PCI Audio Accelerator
+ 1170 3209 SiS PCI Audio Accelerator
+ 1462 400a SiS PCI Audio Accelerator
+ 14a4 2089 SiS PCI Audio Accelerator
+ 14cd 2194 SiS PCI Audio Accelerator
+ 14ff 1100 SiS PCI Audio Accelerator
+ 152d 8808 SiS PCI Audio Accelerator
+ 1558 1103 SiS PCI Audio Accelerator
+ 1558 2200 SiS PCI Audio Accelerator
+ 1563 7018 SiS PCI Audio Accelerator
+ 15c5 0111 SiS PCI Audio Accelerator
+ 270f a171 SiS PCI Audio Accelerator
+ a0a0 0022 SiS PCI Audio Accelerator
+ 7019 SiS7019 Audio Accelerator
+ 7502 Azalia Audio Controller
+103a Seiko Epson Corporation
+103b Tatung Corp. Of America
+103c Hewlett-Packard Company
+ 0025 XE4500 Notebook
+ 002a NX9000 Notebook
+ 08bc NX5000 Notebook
+ 1005 A4977A Visualize EG
+ 1008 Visualize FX
+ 1028 Tach TL Fibre Channel Host Adapter
+ 1029 Tach XL2 Fibre Channel Host Adapter
+ 107e 000f Interphase 5560 Fibre Channel Adapter
+ 9004 9210 1Gb/2Gb Family Fibre Channel Controller
+ 9004 9211 1Gb/2Gb Family Fibre Channel Controller
+ 102a Tach TS Fibre Channel Host Adapter
+ 107e 000e Interphase 5540/5541 Fibre Channel Adapter
+ 9004 9110 1Gb/2Gb Family Fibre Channel Controller
+ 9004 9111 1Gb/2Gb Family Fibre Channel Controller
+ 1030 J2585A DeskDirect 10/100VG NIC
+ 1031 J2585B HP 10/100VG PCI LAN Adapter
+ 103c 1040 J2973A DeskDirect 10BaseT NIC
+ 103c 1041 J2585B DeskDirect 10/100VG NIC
+ 103c 1042 J2970A DeskDirect 10BaseT/2 NIC
+ 1040 J2973A DeskDirect 10BaseT NIC
+ 1041 J2585B DeskDirect 10/100 NIC
+ 1042 J2970A DeskDirect 10BaseT/2 NIC
+ 1048 Diva Serial [GSP] Multiport UART
+ 103c 1049 Tosca Console
+ 103c 104a Tosca Secondary
+ 103c 104b Maestro SP2
+ 103c 1223 Superdome Console
+ 103c 1226 Keystone SP2
+ 103c 1227 Powerbar SP2
+ 103c 1282 Everest SP2
+ 103c 1301 Diva RMP3
+ 1054 PCI Local Bus Adapter
+ 1064 79C970 PCnet Ethernet Controller
+ 108b Visualize FXe
+ 10c1 NetServer Smart IRQ Router
+ 10ed TopTools Remote Control
+ 10f0 rio System Bus Adapter
+ 10f1 rio I/O Controller
+ 1200 82557B 10/100 NIC
+ 1219 NetServer PCI Hot-Plug Controller
+ 121a NetServer SMIC Controller
+ 121b NetServer Legacy COM Port Decoder
+ 121c NetServer PCI COM Port Decoder
+ 1229 zx1 System Bus Adapter
+ 122a zx1 I/O Controller
+ 122e PCI-X Local Bus Adapter
+ 127b sx1000 System Bus Adapter
+ 127c sx1000 I/O Controller
+ 1290 Auxiliary Diva Serial Port
+ 103c 1291 Diva SP2
+ 1291 Auxiliary Diva Serial Port
+ 12b4 zx1 QuickSilver AGP8x Local Bus Adapter
+ 12eb sx2000 System Bus Adapter
+ 12ec sx2000 I/O Controller
+ 12ee PCI-X 2.0 Local Bus Adapter
+ 12f8 Broadcom BCM4306 802.11b/g Wireless LAN
+ 12fa BCM4306 802.11b/g Wireless LAN Controller
+ 1302 RMP-3 Shared Memory Driver
+ 1303 RMP-3 (Remote Management Processor)
+ 1361 BCM4312 802.11a/b/g WLAN Controller
+ 1371 Broadcom Corporation BCM4312 802.11a/b/g (rev 02)
+ 2910 E2910A PCIBus Exerciser
+ 2925 E2925A 32 Bit, 33 MHzPCI Exerciser & Analyzer
+ 3080 Pavilion ze2028ea
+ 3085 Realtek RTL8139/8139C/8139C+
+ 30a3 Compaq NW8440 Notebook
+ 30b5 Compaq Presario V3000Z
+ 31fb DL365 ATI ES1000 VGA controller
+ 3206 Adaptec Embedded Serial ATA HostRAID
+ 3220 Smart Array P600
+ 103c 3225 3 Gb/s SAS RAID
+ 3230 Smart Array Controller
+ 103c 3223 Smart Array P800
+ 103c 3234 P400 SAS Controller
+ 103c 3235 P400i SAS Controller
+ 103c 3237 E500 SAS Controller
+ 103c 323d P700m SAS Controller
+ 3238 Smart Array E200i (SAS Controller)
+ 103c 3211 Smart Array E200i
+ 103c 3212 Smart Array E200
+ 323a Smart Array G6 controllers
+ 103c 3241 Smart Array P212
+ 103c 3243 Smart Array P410
+ 103c 3245 Smart Array P410i
+ 103c 3247 Smart Array P411
+ 103c 3249 Smart Array P812
+ 103c 324a HP Smart Array 712m (Mezzanine RAID controller)
+ 103c 324b Smart Array P711m (Mezzanine RAID controller)
+ 3300 Integrated Lights-Out Standard Virtual USB Controller
+ 103c 3304 iLO2
+ 103c 3305 iLO2
+ 103c 3309 iLO2 GXL/iLO3 GXE
+ 103c 330e iLO3
+ 103c 3381 iLO4
+ 3301 Integrated Lights-Out Standard Serial Port
+ 103c 3304 iLO2
+ 103c 3305 iLO2
+ 103c 330e iLO3
+ 103c 3381 iLO4
+# Virtual serial port which is presented on a Java applet
+ 3302 Integrated Lights-Out Standard KCS Interface
+ 103c 3304 iLO2
+ 103c 3305 iLO2
+ 103c 330e iLO3
+ 103c 3381 iLO4
+ 3305 Integrated Lights-Out (iLO2) Controller
+ 3306 Integrated Lights-Out Standard Slave Instrumentation & System Support
+ 103c 330e iLO3
+ 103c 3381 iLO4
+ 3307 Integrated Lights-Out Standard Management Processor Support and Messaging
+ 103c 330e iLO3
+ 103c 3381 iLO4
+ 3308 Integrated Lights-Out Standard MS Watchdog Timer
+ 103c 330e iLO3
+ 103c 3381 iLO4
+ 402f PCIe Root Port
+ 4030 zx2 System Bus Adapter
+ 4031 zx2 I/O Controller
+ 4037 PCIe Local Bus Adapter
+ 403b PCIe Root Port
+ 60e8 NetRAID-2M : ZX1/M (OEM AMI MegaRAID 493)
+103e Solliday Engineering
+103f Synopsys/Logic Modeling Group
+1040 Accelgraphics Inc.
+1041 Computrend
+1042 Micron
+ 1000 PC Tech RZ1000
+ 1001 PC Tech RZ1001
+ 3000 Samurai_0
+ 3010 Samurai_1
+ 3020 Samurai_IDE
+1043 ASUSTeK Computer Inc.
+ 0675 ISDNLink P-IN100-ST-D
+ 0675 1704 ISDN Adapter (PCI Bus, D, C)
+ 0675 1707 ISDN Adapter (PCI Bus, DV, W)
+ 10cf 105e ISDN Adapter (PCI Bus, DV, W)
+ 0c11 A7N8X Motherboard nForce2 IDE/USB/SMBus
+ 4015 v7100 SDRAM [GeForce2 MX]
+ 4021 v7100 Combo Deluxe [GeForce2 MX + TV tuner]
+ 4057 v8200 GeForce 3
+ 8043 v8240 PAL 128M [P4T] Motherboard
+ 8047 v8420 Deluxe [GeForce4 Ti4200]
+ 807b v9280/TD [Geforce4 TI4200 8X With TV-Out and DVI]
+ 8095 A7N8X Motherboard nForce2 AC97 Audio
+ 80ac A7N8X Motherboard nForce2 AGP/Memory
+ 80bb v9180 Magic/T [GeForce4 MX440 AGP 8x 64MB TV-out]
+ 80c5 nForce3 chipset motherboard [SK8N]
+ 80df v9520 Magic/T
+ 815a A8N-SLI Motherboard nForce4 SATA
+ 8168 Realtek PCI-E Gigabit Ethernet Controller (RTL8111B)
+ 8187 802.11a/b/g Wireless LAN Card
+ 8188 Tiger Hybrid TV Capture Device
+# Found on ASUS M2V motherboard
+ 81e7 Realtek ALC-660 6-channel CODEC
+ 81f4 EN7300TC512/TD/128M/A(C262G) [Graphics Card EN7300TC512]
+ 8233 EEE-PC 701 Netbook
+ 82ca G96 GeForce 9500 GT
+ 82e8 M3N72-D
+ 8383 P7P55D Series Motherboard
+ 83a4 Motherboard M2N68-AM SE2
+ 843e M5A88-V EVO
+# wrong vendor ID (should have been AMD)
+ 9602 RS880 PCI to PCI bridge (int gfx)
+ 1043 83a2 M4A785TD Motherboard
+1044 Adaptec (formerly DPT)
+ 1012 Domino RAID Engine
+ a400 SmartCache/Raid I-IV Controller
+ a500 PCI Bridge
+ a501 SmartRAID V Controller
+ 1044 c001 PM1554U2 Ultra2 Single Channel
+ 1044 c002 PM1654U2 Ultra2 Single Channel
+ 1044 c003 PM1564U3 Ultra3 Single Channel
+ 1044 c004 PM1564U3 Ultra3 Dual Channel
+ 1044 c005 PM1554U2 Ultra2 Single Channel (NON ACPI)
+ 1044 c00a PM2554U2 Ultra2 Single Channel
+ 1044 c00b PM2654U2 Ultra2 Single Channel
+ 1044 c00c PM2664U3 Ultra3 Single Channel
+ 1044 c00d PM2664U3 Ultra3 Dual Channel
+ 1044 c00e PM2554U2 Ultra2 Single Channel (NON ACPI)
+ 1044 c00f PM2654U2 Ultra2 Single Channel (NON ACPI)
+ 1044 c014 PM3754U2 Ultra2 Single Channel (NON ACPI)
+ 1044 c015 PM3755U2B Ultra2 Single Channel (NON ACPI)
+ 1044 c016 PM3755F Fibre Channel (NON ACPI)
+ 1044 c01e PM3757U2 Ultra2 Single Channel
+ 1044 c01f PM3757U2 Ultra2 Dual Channel
+ 1044 c020 PM3767U3 Ultra3 Dual Channel
+ 1044 c021 PM3767U3 Ultra3 Quad Channel
+ 1044 c028 PM2865U3 Ultra3 Single Channel
+ 1044 c029 PM2865U3 Ultra3 Dual Channel
+ 1044 c02a PM2865F Fibre Channel
+ 1044 c03c 2000S Ultra3 Single Channel
+ 1044 c03d 2000S Ultra3 Dual Channel
+ 1044 c03e 2000F Fibre Channel
+ 1044 c046 3000S Ultra3 Single Channel
+ 1044 c047 3000S Ultra3 Dual Channel
+ 1044 c048 3000F Fibre Channel
+ 1044 c050 5000S Ultra3 Single Channel
+ 1044 c051 5000S Ultra3 Dual Channel
+ 1044 c052 5000F Fibre Channel
+ 1044 c05a 2400A UDMA Four Channel
+ 1044 c05b 2400A UDMA Four Channel DAC
+ 1044 c064 3010S Ultra3 Dual Channel
+ 1044 c065 3410S Ultra160 Four Channel
+ 1044 c066 3010S Fibre Channel
+ a511 SmartRAID V Controller
+ 1044 c032 ASR-2005S I2O Zero Channel
+ 1044 c035 ASR-2010S I2O Zero Channel
+ c066 3010S Ultra3 Dual Channel
+1045 OPTi Inc.
+ a0f8 82C750 [Vendetta] USB Controller
+ c101 92C264
+ c178 92C178
+ c556 82X556 [Viper]
+ c557 82C557 [Viper-M]
+ c558 82C558 [Viper-M ISA+IDE]
+ c567 82C750 [Vendetta], device 0
+ c568 82C750 [Vendetta], device 1
+ c569 82C579 [Viper XPress+ Chipset]
+ c621 82C621 [Viper-M/N+]
+ c700 82C700 [FireStar]
+ c701 82C701 [FireStar Plus]
+ c814 82C814 [Firebridge 1]
+ c822 82C822
+ c824 82C824
+ c825 82C825 [Firebridge 2]
+ c832 82C832
+ c861 82C861
+ c895 82C895
+ c935 EV1935 ECTIVA MachOne PCIAudio
+ d568 82C825 [Firebridge 2]
+ d721 IDE [FireStar]
+1046 IPC Corporation, Ltd.
+1047 Genoa Systems Corp
+1048 Elsa AG
+ 0c60 Gladiac MX
+ 0d22 Quadro4 900XGL [ELSA GLoria4 900XGL]
+ 1000 QuickStep 1000
+ 3000 QuickStep 3000
+ 8901 Gloria XL
+ 1048 0935 GLoria XL (Virge)
+1049 Fountain Technologies, Inc.
+# nee SGS Thomson Microelectronics
+104a STMicroelectronics
+ 0000 STLS2F Host Bridge
+ 0008 STG 2000X
+ 0009 STG 1764X
+ 0010 STG4000 [3D Prophet Kyro Series]
+ 0201 STPC Vega Northbridge
+ 0209 STPC Consumer/Industrial North- and Southbridge
+ 020a STPC Atlas/ConsumerS/Consumer IIA Northbridge
+ 020b STPC Consumer II ISA Bridge
+ 0210 STPC Atlas ISA Bridge
+ 021a STPC Consumer S Southbridge
+ 021b STPC Consumer IIA Southbridge
+ 0220 STPC Industrial PCI to PCCard bridge
+ 0228 STPC Atlas IDE
+ 0229 STPC Vega IDE
+ 0230 STPC Atlas/Vega OHCI USB Controller
+ 0238 STPC Vega LAN
+ 0500 ST70137 [Unicorn] ADSL DMT Transceiver
+ 104a 0500 BeWAN ADSL PCI st
+ 0564 STPC Client Northbridge
+ 0981 21x4x DEC-Tulip compatible 10/100 Ethernet
+ 1746 STG 1764X
+ 2774 21x4x DEC-Tulip compatible 10/100 Ethernet
+ 3520 MPEG-II decoder card
+ 55cc STPC Client Southbridge
+104b BusLogic
+ 0140 BT-946C (old) [multimaster 01]
+ 1040 BT-946C (BA80C30) [MultiMaster 10]
+ 8130 Flashpoint LT
+104c Texas Instruments
+ 0500 100 MBit LAN Controller
+ 0508 TMS380C2X Compressor Interface
+ 1000 Eagle i/f AS
+ 104c PCI1510 PC card Cardbus Controller
+ 3d04 TVP4010 [Permedia]
+ 3d07 TVP4020 [Permedia 2]
+ 1011 4d10 Comet
+ 1040 000f AccelStar II
+ 1040 0011 AccelStar II
+ 1048 0a31 WINNER 2000
+ 1048 0a32 GLoria Synergy
+ 1048 0a34 GLoria Synergy
+ 1048 0a35 GLoria Synergy
+ 1048 0a36 GLoria Synergy
+ 1048 0a43 GLoria Synergy
+ 1048 0a44 GLoria Synergy
+ 107d 2633 WinFast 3D L2300
+ 1092 0126 FIRE GL 1000 PRO
+ 1092 0127 FIRE GL 1000 PRO
+ 1092 0136 FIRE GL 1000 PRO
+ 1092 0141 FIRE GL 1000 PRO
+ 1092 0146 FIRE GL 1000 PRO
+ 1092 0148 FIRE GL 1000 PRO
+ 1092 0149 FIRE GL 1000 PRO
+ 1092 0152 FIRE GL 1000 PRO
+ 1092 0154 FIRE GL 1000 PRO
+ 1092 0155 FIRE GL 1000 PRO
+ 1092 0156 FIRE GL 1000 PRO
+ 1092 0157 FIRE GL 1000 PRO
+ 1097 3d01 Jeronimo Pro
+ 1102 100f Graphics Blaster Extreme
+ 3d3d 0100 Reference Permedia 2 3D
+ 8000 PCILynx/PCILynx2 IEEE 1394 Link Layer Controller
+ 1443 8003 FireBoard200
+ e4bf 1010 CF1-1-SNARE
+ e4bf 1020 CF1-2-SNARE
+ 8009 TSB12LV22 IEEE-1394 Controller
+ 104d 8032 8032 OHCI i.LINK (IEEE 1394) Controller
+ 8017 PCI4410 FireWire Controller
+ 8019 TSB12LV23 IEEE-1394 Controller
+ 11bd 000a Studio DV500-1394
+ 11bd 000e Studio DV
+ e4bf 1010 CF2-1-CYMBAL
+ 8020 TSB12LV26 IEEE-1394 Controller (Link)
+ 1028 00d8 Precision 530
+ 104d 80e2 VAIO PCV-J200
+ 11bd 000f Studio DV500-1394
+ 11bd 001c Excalibur 4.1
+ 8021 TSB43AA22 IEEE-1394 Controller (PHY/Link Integrated)
+ 104d 80df Vaio PCG-FX403
+ 104d 80e7 VAIO PCG-GR214EP/GR214MP/GR215MP/GR314MP/GR315MP
+ 8022 TSB43AB22 IEEE-1394a-2000 Controller (PHY/Link) [iOHCI-Lynx]
+ 104c 8023 TSB43AB22/A IEEE-1394a-2000 Controller (PHY/Link)
+ 8023 TSB43AB22A IEEE-1394a-2000 Controller (PHY/Link) [iOHCI-Lynx]
+ 103c 088c NC8000 laptop
+ 1043 808b K8N4-E Mainboard
+ 1043 815b P5W DH Deluxe Motherboard
+ 1443 8023 FireCard400
+ 8024 TSB43AB23 IEEE-1394a-2000 Controller (PHY/Link)
+ 107d 6620 Winfast DV2000 FireWire Controller
+ 1443 8024 FireBoard Blue
+ 1458 1000 GA-EP45-DS5 Motherboard
+ 8025 TSB82AA2 IEEE-1394b Link Layer Controller
+ 1458 1000 GA-K8N Ultra-9 Mainboard
+ 8026 TSB43AB21 IEEE-1394a-2000 Controller (PHY/Link)
+ 1025 0035 TravelMate 660
+ 1025 003c Aspire 2001WLCi (Compaq CL50 motherboard)
+ 103c 0025 XE4500 Notebook
+ 103c 006a NX9500
+ 1043 808d A7V333 mainboard.
+ 8027 PCI4451 IEEE-1394 Controller
+ 1028 00e6 PCI4451 IEEE-1394 Controller (Dell Inspiron 8100)
+ 8029 PCI4510 IEEE-1394 Controller
+ 1028 0163 Latitude D505
+ 1028 0196 Inspiron 5160
+ 1071 8160 MIM2900
+ 802b PCI7410,7510,7610 OHCI-Lynx Controller
+ 1028 0139 Latitude D400
+ 1028 014e PCI7410,7510,7610 OHCI-Lynx Controller (Latitude D800)
+ 802e PCI7x20 1394a-2000 OHCI Two-Port PHY/Link-Layer Controller
+ 1028 018d Inspiron 700m/710m
+ 8031 PCIxx21/x515 Cardbus Controller
+ 1025 0080 Aspire 5024WLMi
+ 103c 0934 Compaq nw8240/nx8220
+ 103c 099c NX6110/NC6120
+ 103c 308b MX6125
+ 8032 OHCI Compliant IEEE 1394 Host Controller
+ 1025 0080 Aspire 5024WLMi
+ 103c 0934 Compaq nw8240/nx8220
+ 103c 099c NX6110/NC6120
+ 103c 308b MX6125
+ 8033 PCIxx21 Integrated FlashMedia Controller
+ 1025 0080 Aspire 5024WLMi
+ 103c 0934 Compaq nw8240/nx8220
+ 103c 099c NX6110/NC6120
+ 103c 308b MX6125
+ 8034 PCI6411/6421/6611/6621/7411/7421/7611/7621 Secure Digital Controller
+ 1025 0080 Aspire 5024WLMi
+ 103c 0934 Compaq nw8240/nx8220
+ 103c 099c NX6110/NC6120
+ 103c 308b MX6125
+ 8035 PCI6411/6421/6611/6621/7411/7421/7611/7621 Smart Card Controller
+ 103c 0934 Compaq nw8240/nx8220
+ 103c 099c NX6110/NC6120
+ 8036 PCI6515 Cardbus Controller
+ 8038 PCI6515 SmartCard Controller
+ 8039 PCIxx12 Cardbus Controller
+ 103c 309f Compaq nx9420 Notebook
+ 103c 30a1 NC2400
+ 103c 30a3 Compaq nw8440
+ 104d 902d VAIO VGN-NR120E
+ 803a PCIxx12 OHCI Compliant IEEE 1394 Host Controller
+ 103c 309f nx9420
+ 103c 30a1 NC2400
+ 103c 30a3 Compaq nw8440
+ 104d 902d VAIO VGN-NR120E
+ 803b 5-in-1 Multimedia Card Reader (SD/MMC/MS/MS PRO/xD)
+ 103c 309f nx9420
+ 103c 30a3 Compaq nw8440
+ 104d 902d VAIO VGN-NR120E
+ 803c PCIxx12 SDA Standard Compliant SD Host Controller
+ 103c 309f nx9420
+ 103c 30a3 Compaq nw8440
+ 803d PCIxx12 GemCore based SmartCard controller
+ 103c 309f Compaq nx9420 Notebook
+ 103c 30a1 NC2400
+ 103c 30a3 nc8430
+ 103c 30aa nc6310
+ 8101 TSB43DB42 IEEE-1394a-2000 Controller (PHY/Link)
+ 8201 PCI1620 Firmware Loading Function
+ 8204 PCI7410,7510,7610 PCI Firmware Loading Function
+ 1028 0139 Latitude D400
+ 1028 014e Latitude D800
+ 8231 XIO2000(A)/XIO2200A PCI Express-to-PCI Bridge
+ 5678 1234 DC-1394 PCIe
+ 8232 XIO3130 PCI Express Switch (Upstream)
+ 8233 XIO3130 PCI Express Switch (Downstream)
+ 8235 XIO2200A IEEE-1394a-2000 Controller (PHY/Link)
+ 5678 1234 DC-1394 PCIe
+ 823e XIO2213A/B/XIO2221 PCI Express to PCI Bridge [Cheetah Express]
+ 823f XIO2213A/B/XIO2221 IEEE-1394b OHCI Controller [Cheetah Express]
+ 1546 803c FWB-PCIE1X11B
+ 8240 XIO2001 PCI Express-to-PCI Bridge
+ 8400 ACX 100 22Mbps Wireless Interface
+ 1186 3b00 DWL-650+ PC Card cardbus 22Mbs Wireless Adapter [AirPlus]
+ 1186 3b01 DWL-520+ 22Mbps PCI Wireless Adapter
+ 1395 2201 WL22-PC
+ 16ab 8501 WL-8305 IEEE802.11b+ Wireless LAN PCI Adapter
+ 8401 ACX 100 22Mbps Wireless Interface
+ 9000 Wireless Interface (of unknown type)
+ 9065 TMS320DM642
+ 9066 ACX 111 54Mbps Wireless Interface
+ 0308 3404 G-102 v1 802.11g Wireless Cardbus Adapter
+ 0308 3406 G-162 v2 802.11g Wireless Cardbus Adapter
+ 104c 9066 WL212 Sitecom Wireless Network PCI-Card 100M (Version 1)
+ 104c 9096 Trendnet TEW-412PC Wireless PCI Adapter (Version A)
+ 1186 3b04 DWL-G520+ Wireless PCI Adapter
+ 1186 3b05 DWL-G650+ AirPlusG+ CardBus Wireless LAN
+ 1186 3b08 AirPlus G DWL-G630 Wireless Cardbus Adapter (rev.B1)
+ 1385 4c00 WG311v2 802.11g Wireless PCI Adapter
+ 13d1 aba0 SWLMP-54108 108Mbps Wireless mini PCI card 802.11g+
+ 14ea ab07 GW-NS54GM Wireless Cardbus Adapter
+ 16ec 010d USR5416 802.11g Wireless Turbo PCI Adapter
+ 16ec 010e USR5410 802.11g Wireless Cardbus Adapter
+ 1737 0033 WPC54G v2 802.11g Wireless-G Notebook Adapter
+ 17cf 0032 G-162 v1 802.11g Wireless Cardbus Adapter
+ 17cf 0033 Z-Com XG650 Wireless miniPCI 802.11b/g
+ 187e 340b G-302 v2 802.11g Wireless PCI Adapter
+ 187e 340c G-360 v2 802.11g Wireless PCI Adapter
+ a001 TDC1570
+ a100 TDC1561
+ a102 TNETA1575 HyperSAR Plus w/PCI Host i/f & UTOPIA i/f
+ a106 TMS320C6414 TMS320C6415 TMS320C6416
+ 175c 5000 ASI50xx Audio Adapter
+ 175c 6400 ASI6400 Cobranet series
+ 175c 8700 ASI87xx Radio Tuner card
+ ac10 PCI1050
+ ac11 PCI1053
+ ac12 PCI1130
+ ac13 PCI1031
+ ac15 PCI1131
+ ac16 PCI1250
+ 1014 0092 ThinkPad 600
+ ac17 PCI1220
+ ac18 PCI1260
+ ac19 PCI1221
+ ac1a PCI1210
+ ac1b PCI1450
+ 0e11 b113 Armada M700
+ 1014 0130 ThinkPad 600X/A21m/T20/T22
+ ac1c PCI1225
+ 0e11 b121 Armada E500
+ 1028 0088 Latitude CPi A400XT
+ ac1d PCI1251A
+ ac1e PCI1211
+ ac1f PCI1251B
+ ac20 TI 2030
+ ac21 PCI2031
+ ac22 PCI2032 PCI Docking Bridge
+ ac23 PCI2250 PCI-to-PCI Bridge
+ ac28 PCI2050 PCI-to-PCI Bridge
+ ac2c PCI2060 PCI-to-PCI Bridge
+ ac30 PCI1260 PC card Cardbus Controller
+ ac40 PCI4450 PC card Cardbus Controller
+ ac41 PCI4410 PC card Cardbus Controller
+ ac42 PCI4451 PC card Cardbus Controller
+ 1028 00e6 PCI4451 PC card CardBus Controller (Inspiron 8100)
+ ac44 PCI4510 PC card Cardbus Controller
+ 1028 0149 Inspiron 5100
+ 1028 0163 Latitude D505
+ 1028 0196 Inspiron 5160
+ 1071 8160 MIM2000
+ ac46 PCI4520 PC card Cardbus Controller
+ 1014 0552 ThinkPad
+ ac47 PCI7510 PC card Cardbus Controller
+ 1028 0139 Latitude D400
+ 1028 013f Precision M60
+ 1028 014e Latitude D800
+ ac48 PCI7610 PC Card Cardbus Controller
+ ac49 PCI7410 PC Card Cardbus Controller
+ ac4a PCI7510,7610 PC card Cardbus Controller
+ 1028 0139 Latitude D400
+ 1028 014e Latitude D800
+ ac4b PCI7610 SD/MMC controller
+ ac4c PCI7610 Memory Stick controller
+ ac50 PCI1410 PC card Cardbus Controller
+ ac51 PCI1420 PC card Cardbus Controller
+ 0e11 004e Evo N600c
+ 1014 0148 ThinkPad A20m
+ 1014 023b ThinkPad T23
+ 1028 00b1 Latitude C600
+ 1028 012a Latitude C640
+ 1033 80cd Versa Note VXi
+ 10cf 1095 Lifebook S-4510/C6155
+ e4bf 1000 CP2-2-HIPHOP
+ ac52 PCI1451 PC card Cardbus Controller
+ ac53 PCI1421 PC card Cardbus Controller
+ ac54 PCI1620 PC Card Controller
+ 103c 08b0 tc1100 tablet
+ ac55 PCI1520 PC card Cardbus Controller
+ 1014 0512 ThinkPad T30/T40
+ 103c 0025 XE4500 Notebook
+ ac56 PCI1510 PC card Cardbus Controller
+ 1014 0512 ThinkPad R50e
+ 1014 0528 ThinkPad R40e
+ 17aa 2012 ThinkPad T60/R60 series
+ ac60 PCI2040 PCI to DSP Bridge Controller
+ 175c 5100 ASI51xx Audio Adapter
+ 175c 6100 ASI61xx Audio Adapter
+ 175c 6200 ASI62xx Audio Adapter
+ 175c 8800 ASI88xx Audio Adapter
+ 186f 3001 WR-G303 PCI radio receiver
+ 186f 3005 WR-G305 PCI radio receiver
+ 186f 3101 WR-G313 PCI radio receiver
+ 186f 3105 WR-G315 PCI radio receiver
+ ac8d PCI 7620
+ ac8e PCI7420 CardBus Controller
+ 1028 018d Inspiron 700m/710m
+ ac8f PCI7420/7620 Combo CardBus, 1394a-2000 OHCI and SD/MS-Pro Controller
+ 1028 018d Inspiron 700m/710m
+ b001 TMS320C6424
+ fe00 FireWire Host Controller
+ fe03 12C01A FireWire Host Controller
+104d Sony Corporation
+ 8004 DTL-H2500 [Playstation development board]
+ 8009 CXD1947Q i.LINK Controller
+ 8039 CXD3222 i.LINK Controller
+ 8056 Rockwell HCF 56K modem
+ 808a Memory Stick Controller
+ 81ce SxS Pro memory card
+ 902d VAIO VGN-NR120E
+104e Oak Technology, Inc
+ 0017 OTI-64017
+ 0107 OTI-107 [Spitfire]
+ 0109 Video Adapter
+ 0111 OTI-64111 [Spitfire]
+ 0217 OTI-64217
+ 0317 OTI-64317
+104f Co-time Computer Ltd
+1050 Winbond Electronics Corp
+ 0000 NE2000
+ 0001 W83769F
+ 0033 W89C33D 802.11 a/b/g BB/MAC
+ 0105 W82C105
+ 0840 W89C840
+ 1050 0001 W89C840 Ethernet Adapter
+ 1050 0840 W89C840 Ethernet Adapter
+ 0940 W89C940
+ 5a5a W89C940F
+ 6692 W6692
+ 1043 1702 ISDN Adapter (PCI Bus, D, W)
+ 1043 1703 ISDN Adapter (PCI Bus, DV, W)
+ 1043 1707 ISDN Adapter (PCI Bus, DV, W)
+ 144f 1702 ISDN Adapter (PCI Bus, D, W)
+ 144f 1703 ISDN Adapter (PCI Bus, DV, W)
+ 144f 1707 ISDN Adapter (PCI Bus, DV, W)
+ 9921 W99200F MPEG-1 Video Encoder
+ 9922 W99200F/W9922PF MPEG-1/2 Video Encoder
+ 9970 W9970CF
+1051 Anigma, Inc.
+1052 ?Young Micro Systems
+1053 Young Micro Systems
+1054 Hitachi, Ltd
+ 3009 2Gbps Fibre Channel to PCI HBA 3009
+ 300a 4Gbps Fibre Channel to PCI-X HBA 300a
+ 300b 4Gbps Fibre Channel to PCI-X HBA 300b
+ 300f ColdFusion 3 Chipset Processor to I/O Controller
+ 3010 ColdFusion 3 Chipset Memory Controller Hub
+ 3011 ColdFusion 3e Chipset Processor to I/O Controller
+ 3012 ColdFusion 3e Chipset Memory Controller Hub
+ 3017 Unassigned Hitachi Shared FC Device 3017
+ 301b Virtual VGA Device
+ 301d PCIe-to-PCIe Bridge with Virtualization IO Assist Feature
+ 3020 FIVE-EX based Fibre Channel to PCIe HBA
+ 302c M001 PCI Express Switch Upstream Port
+ 302d M001 PCI Express Switch Downstream Port
+ 3505 SH7751 PCI Controller (PCIC)
+ 350e SH7751R PCI Controller (PCIC)
+1055 Efar Microsystems
+ 9130 SLC90E66 [Victory66] IDE
+ 9460 SLC90E66 [Victory66] ISA
+ 9462 SLC90E66 [Victory66] USB
+ 9463 SLC90E66 [Victory66] ACPI
+ e420 LAN9420/LAN9420i
+1056 ICL
+# Motorola made a mistake and used 1507 instead of 1057 in some chips. Please look at the 1507 entry as well when updating this.
+1057 Motorola
+ 0001 MPC105 [Eagle]
+ 0002 MPC106 [Grackle]
+ 0003 MPC8240 [Kahlua]
+ 0004 MPC107
+ 0006 MPC8245 [Unity]
+ 0008 MPC8540
+ 0009 MPC8560
+ 0012 MPC8548 [PowerQUICC III]
+ 0100 MC145575 [HFC-PCI]
+ 0431 KTI829c 100VG
+ 1073 Nokia N770
+ 1219 Nokia N800
+ 1801 DSP56301 Digital Signal Processor
+ 14fb 0101 Transas Radar Imitator Board [RIM]
+ 14fb 0102 Transas Radar Imitator Board [RIM-2]
+ 14fb 0202 Transas Radar Integrator Board [RIB-2]
+ 14fb 0611 1 channel CAN bus Controller [CanPci-1]
+ 14fb 0612 2 channels CAN bus Controller [CanPci-2]
+ 14fb 0613 3 channels CAN bus Controller [CanPci-3]
+ 14fb 0614 4 channels CAN bus Controller [CanPci-4]
+ 14fb 0621 1 channel CAN bus Controller [CanPci2-1]
+ 14fb 0622 2 channels CAN bus Controller [CanPci2-2]
+ 14fb 0810 Transas VTS Radar Integrator Board [RIB-4]
+ 175c 4200 ASI4215 Audio Adapter
+ 175c 4300 ASI43xx Audio Adapter
+ 175c 4400 ASI4401 Audio Adapter
+ ecc0 0010 Darla
+ ecc0 0020 Gina
+ ecc0 0030 Layla rev.0
+ ecc0 0031 Layla rev.1
+ ecc0 0040 Darla24 rev.0
+ ecc0 0041 Darla24 rev.1
+ ecc0 0050 Gina24 rev.0
+ ecc0 0051 Gina24 rev.1
+ ecc0 0070 Mona rev.0
+ ecc0 0071 Mona rev.1
+ ecc0 0072 Mona rev.2
+ 18c0 MPC8265A/8266/8272
+ 18c1 MPC8271/MPC8272
+ 3052 SM56 Data Fax Modem
+ 3055 SM56 Data Fax Modem
+ 3410 DSP56361 Digital Signal Processor
+ ecc0 0050 Gina24 rev.0
+ ecc0 0051 Gina24 rev.1
+ ecc0 0060 Layla24
+ ecc0 0070 Mona rev.0
+ ecc0 0071 Mona rev.1
+ ecc0 0072 Mona rev.2
+ ecc0 0080 Mia rev.0
+ ecc0 0081 Mia rev.1
+ ecc0 0090 Indigo
+ ecc0 00a0 Indigo IO
+ ecc0 00b0 Indigo DJ
+ ecc0 0100 3G
+ 4801 Raven
+ 4802 Falcon
+ 4803 Hawk
+ 4806 CPX8216
+ 4d68 20268
+ 5600 SM56 PCI Modem
+ 1057 0300 SM56 PCI Speakerphone Modem
+ 1057 0301 SM56 PCI Voice Modem
+ 1057 0302 SM56 PCI Fax Modem
+ 1057 5600 SM56 PCI Voice modem
+ 13d2 0300 SM56 PCI Speakerphone Modem
+ 13d2 0301 SM56 PCI Voice modem
+ 13d2 0302 SM56 PCI Fax Modem
+ 1436 0300 SM56 PCI Speakerphone Modem
+ 1436 0301 SM56 PCI Voice modem
+ 1436 0302 SM56 PCI Fax Modem
+ 144f 100c SM56 PCI Fax Modem
+ 1494 0300 SM56 PCI Speakerphone Modem
+ 1494 0301 SM56 PCI Voice modem
+ 14c8 0300 SM56 PCI Speakerphone Modem
+ 14c8 0302 SM56 PCI Fax Modem
+ 1668 0300 SM56 PCI Speakerphone Modem
+ 1668 0302 SM56 PCI Fax Modem
+ 5608 Wildcard X100P
+ 5803 MPC5200
+ 5806 MCF54 Coldfire
+ 5808 MPC8220
+ 5809 MPC5200B
+ 6400 MPC190 Security Processor (S1 family, encryption)
+ 6405 MPC184 Security Processor (S1 family)
+1058 Electronics & Telecommunications RSH
+# Formerly: Teknor Industrial Computers Inc
+1059 Kontron
+105a Promise Technology, Inc.
+ 0d30 PDC20265 (FastTrak100 Lite/Ultra100)
+ 1043 8042 AV7266-E South Bridge Promise RAID
+ 105a 4d33 Ultra100
+ 0d38 20263
+ 105a 4d39 Fasttrak66
+ 1275 20275
+ 3318 PDC20318 (SATA150 TX4)
+ 3319 PDC20319 (FastTrak S150 TX4)
+ 8086 3427 S875WP1-E mainboard
+ 3371 PDC20371 (FastTrak S150 TX2plus)
+ 3373 PDC20378 (FastTrak 378/SATA 378)
+ 1043 80f5 K8V Deluxe/PC-DL Deluxe motherboard
+ 1462 590d KT6 Delta-FIS2R (MS-6590)
+ 1462 702e K8T NEO FIS2R motherboard
+ 3375 PDC20375 (SATA150 TX2plus)
+ 3376 PDC20376 (FastTrak 376)
+ 1043 809e A7V8X motherboard
+ 3515 PDC40719 [FastTrak TX4300/TX4310]
+ 3519 PDC40519 (FastTrak TX4200)
+ 3570 20771 (FastTrak TX2300)
+ 3571 PDC20571 (FastTrak TX2200)
+ 3574 PDC20579 SATAII 150 IDE Controller
+ 3577 PDC40779 (SATA 300 779)
+ 3d17 PDC40718 (SATA 300 TX4)
+ 3d18 PDC20518/PDC40518 (SATAII 150 TX4)
+ 3d73 PDC40775 (SATA 300 TX2plus)
+ 3d75 PDC20575 (SATAII150 TX2plus)
+ 3f20 PDC42819 [FastTrak TX2650/TX4650]
+ 4302 80333 [SuperTrak EX4350]
+ 4d30 PDC20267 (FastTrak100/Ultra100)
+ 105a 4d33 Ultra100
+ 105a 4d39 FastTrak100
+ 8086 5744 S845WD1-E mainboard
+ 4d33 20246
+ 105a 4d33 20246 IDE Controller
+ 4d38 PDC20262 (FastTrak66/Ultra66)
+ 105a 4d30 Ultra Device on SuperTrak
+ 105a 4d33 Ultra66
+ 105a 4d39 FastTrak66
+ 4d68 PDC20268 (Ultra100 TX2)
+ 105a 4d68 Ultra100TX2
+ 4d69 20269
+ 105a 4d68 Ultra133TX2
+ 5275 PDC20276 (MBFastTrak133 Lite)
+ 1043 807e A7V333 motherboard.
+ 105a 0275 SuperTrak SX6000 IDE
+ 105a 1275 MBFastTrak133 Lite (tm) Controller (RAID mode)
+ 1458 b001 MBUltra 133
+ 5300 DC5300
+ 6268 PDC20270 (FastTrak100 LP/TX2/TX4)
+ 105a 4d68 FastTrak100 TX2
+ 6269 PDC20271 (FastTrak TX2000)
+ 105a 6269 FastTrak TX2/TX2000
+ 6300 PDC81731 [FastTrak SX8300]
+ 6621 PDC20621 (FastTrak S150 SX4/FastTrak SX4000 lite)
+ 6622 PDC20621 [SATA150 SX4] 4 Channel IDE RAID Controller
+ 6624 PDC20621 [FastTrak SX4100]
+ 6626 PDC20618 (Ultra 618)
+ 6629 PDC20619 (FastTrak TX4000)
+ 7275 PDC20277 (SBFastTrak133 Lite)
+ 8002 SATAII150 SX8
+ 8350 80333 [SuperTrak EX8350/EX16350], 80331 [SuperTrak EX8300/EX16300]
+ 8650 81384 [SuperTrak EX SAS and SATA RAID Controller]
+ 105a 4600 SuperTrak EX4650A
+ 105a 4601 SuperTrak EX4650
+ 105a 4610 SuperTrak EX4650EL
+ 105a 8600 SuperTrak EX8650EL
+ 105a 8601 SuperTrak EX8650A
+ 105a 8602 SuperTrak EX8654
+ 105a 8603 SuperTrak EX8658
+ 105a 8604 SuperTrak EX8650
+ 105a 8610 SuperTrak EX8650M
+ 105a a600 SuperTrak EX12650
+ 105a b600 SuperTrak EX16650
+ 105a b601 SuperTrak EX16654
+ 105a b602 SuperTrak EX16658
+ 8760 PM8010 [SuperTrak EX SAS and SATA 6G RAID Controller]
+ c350 80333 [SuperTrak EX12350]
+ e350 80333 [SuperTrak EX24350]
+105b Foxconn International, Inc.
+ 0c4d SiS AC'97 Sound Controller
+105c Wipro Infotech Limited
+105d Number 9 Computer Company
+ 2309 Imagine 128
+ 2339 Imagine 128-II
+ 105d 0000 Imagine 128 series 2 4Mb VRAM
+ 105d 0001 Imagine 128 series 2 4Mb VRAM
+ 105d 0002 Imagine 128 series 2 4Mb VRAM
+ 105d 0003 Imagine 128 series 2 4Mb VRAM
+ 105d 0004 Imagine 128 series 2 4Mb VRAM
+ 105d 0005 Imagine 128 series 2 4Mb VRAM
+ 105d 0006 Imagine 128 series 2 4Mb VRAM
+ 105d 0007 Imagine 128 series 2 4Mb VRAM
+ 105d 0008 Imagine 128 series 2e 4Mb DRAM
+ 105d 0009 Imagine 128 series 2e 4Mb DRAM
+ 105d 000a Imagine 128 series 2 8Mb VRAM
+ 105d 000b Imagine 128 series 2 8Mb H-VRAM
+ 11a4 000a Barco Metheus 5 Megapixel
+ 13cc 0000 Barco Metheus 5 Megapixel
+ 13cc 0004 Barco Metheus 5 Megapixel
+ 13cc 0005 Barco Metheus 5 Megapixel
+ 13cc 0006 Barco Metheus 5 Megapixel
+ 13cc 0008 Barco Metheus 5 Megapixel
+ 13cc 0009 Barco Metheus 5 Megapixel
+ 13cc 000a Barco Metheus 5 Megapixel
+ 13cc 000c Barco Metheus 5 Megapixel
+ 493d Imagine 128 T2R [Ticket to Ride]
+ 11a4 000a Barco Metheus 5 Megapixel, Dual Head
+ 11a4 000b Barco Metheus 5 Megapixel, Dual Head
+ 13cc 0002 Barco Metheus 4 Megapixel, Dual Head
+ 13cc 0003 Barco Metheus 5 Megapixel, Dual Head
+ 13cc 0007 Barco Metheus 5 Megapixel, Dual Head
+ 13cc 0008 Barco Metheus 5 Megapixel, Dual Head
+ 13cc 0009 Barco Metheus 5 Megapixel, Dual Head
+ 13cc 000a Barco Metheus 5 Megapixel, Dual Head
+ 5348 Revolution 4
+ 105d 0037 Revolution IV-FP AGP (For SGI 1600SW)
+ 11a4 0028 PVS5600M
+ 11a4 0038 PVS5600D
+105e Vtech Computers Ltd
+105f Infotronic America Inc
+1060 United Microelectronics [UMC]
+ 0001 UM82C881
+ 0002 UM82C886
+ 0101 UM8673F
+ 0881 UM8881
+ 0886 UM8886F
+ 0891 UM8891A
+ 1001 UM886A
+ 673a UM8886BF
+ 673b EIDE Master/DMA
+ 8710 UM8710
+ 886a UM8886A
+ 8881 UM8881F
+ 8886 UM8886F
+ 888a UM8886A
+ 8891 UM8891A
+ 9017 UM9017F
+ 9018 UM9018
+ 9026 UM9026
+ e881 UM8881N
+ e886 UM8886N
+ e88a UM8886N
+ e891 UM8891N
+1061 I.I.T.
+ 0001 AGX016
+ 0002 IIT3204/3501
+1062 Maspar Computer Corp
+1063 Ocean Office Automation
+1064 Alcatel
+ 1102 Dynamite 2840 (ADSL PCI modem)
+1065 Texas Microsystems
+1066 PicoPower Technology
+ 0000 PT80C826
+ 0001 PT86C521 [Vesuvius v1] Host Bridge
+ 0002 PT86C523 [Vesuvius v3] PCI-ISA Bridge Master
+ 0003 PT86C524 [Nile] PCI-to-PCI Bridge
+ 0004 PT86C525 [Nile-II] PCI-to-PCI Bridge
+ 0005 National PC87550 System Controller
+ 8002 PT86C523 [Vesuvius v3] PCI-ISA Bridge Slave
+1067 Mitsubishi Electric
+ 0301 AccelGraphics AccelECLIPSE
+ 0304 AccelGALAXY A2100 [OEM Evans & Sutherland]
+ 0308 Tornado 3000 [OEM Evans & Sutherland]
+ 1002 VG500 [VolumePro Volume Rendering Accelerator]
+1068 Diversified Technology
+1069 Mylex Corporation
+ 0001 DAC960P
+ 0002 DAC960PD
+ 0010 DAC960PG
+ 0020 DAC960LA
+ 0050 AcceleRAID 352/170/160 support Device
+ 1069 0050 AcceleRAID 352 support Device
+ 1069 0052 AcceleRAID 170 support Device
+ 1069 0054 AcceleRAID 160 support Device
+ b166 AcceleRAID 600/500/400/Sapphire support Device
+ 1014 0242 iSeries 2872 DASD IOA
+ 1014 0266 Dual Channel PCI-X U320 SCSI Adapter
+ 1014 0278 Dual Channel PCI-X U320 SCSI RAID Adapter
+ 1014 02d3 Dual Channel PCI-X U320 SCSI Adapter
+ 1014 02d4 Dual Channel PCI-X U320 SCSI RAID Adapter
+ 1069 0200 AcceleRAID 400, Single Channel, PCI-X, U320, SCSI RAID
+ 1069 0202 AcceleRAID Sapphire, Dual Channel, PCI-X, U320, SCSI RAID
+ 1069 0204 AcceleRAID 500, Dual Channel, Low-Profile, PCI-X, U320, SCSI RAID
+ 1069 0206 AcceleRAID 600, Dual Channel, PCI-X, U320, SCSI RAID
+ ba55 eXtremeRAID 1100 support Device
+ ba56 eXtremeRAID 2000/3000 support Device
+ 1069 0030 eXtremeRAID 3000 support Device
+ 1069 0040 eXtremeRAID 2000 support Device
+ ba57 eXtremeRAID 4000/5000 support Device
+ 1069 0072 eXtremeRAID 5000 support Device
+106a Aten Research Inc
+106b Apple Computer Inc.
+ 0001 Bandit PowerPC host bridge
+ 0002 Grand Central I/O
+ 0003 Control Video
+ 0004 PlanB Video-In
+ 0007 O'Hare I/O
+ 000c DOS on Mac
+ 000e Hydra Mac I/O
+ 0010 Heathrow Mac I/O
+ 0017 Paddington Mac I/O
+ 0018 UniNorth FireWire
+ 0019 KeyLargo USB
+ 001e UniNorth Internal PCI
+ 001f UniNorth PCI
+ 0020 UniNorth AGP
+ 0021 UniNorth GMAC (Sun GEM)
+ 0022 KeyLargo Mac I/O
+ 0024 UniNorth/Pangea GMAC (Sun GEM)
+ 0025 KeyLargo/Pangea Mac I/O
+ 0026 KeyLargo/Pangea USB
+ 0027 UniNorth/Pangea AGP
+ 0028 UniNorth/Pangea PCI
+ 0029 UniNorth/Pangea Internal PCI
+ 002d UniNorth 1.5 AGP
+ 002e UniNorth 1.5 PCI
+ 002f UniNorth 1.5 Internal PCI
+ 0030 UniNorth/Pangea FireWire
+ 0031 UniNorth 2 FireWire
+ 106b 5811 iBook G4 2004
+ 0032 UniNorth 2 GMAC (Sun GEM)
+ 0033 UniNorth 2 ATA/100
+ 0034 UniNorth 2 AGP
+ 0035 UniNorth 2 PCI
+ 0036 UniNorth 2 Internal PCI
+ 003b UniNorth/Intrepid ATA/100
+ 003e KeyLargo/Intrepid Mac I/O
+ 003f KeyLargo/Intrepid USB
+ 0040 K2 KeyLargo USB
+ 0041 K2 KeyLargo Mac/IO
+ 0042 K2 FireWire
+ 0043 K2 ATA/100
+ 0045 K2 HT-PCI Bridge
+ 0046 K2 HT-PCI Bridge
+ 0047 K2 HT-PCI Bridge
+ 0048 K2 HT-PCI Bridge
+ 0049 K2 HT-PCI Bridge
+ 004a CPC945 HT Bridge
+ 004b U3 AGP
+ 004c K2 GMAC (Sun GEM)
+ 004f Shasta Mac I/O
+ 0050 Shasta IDE
+ 0051 Shasta (Sun GEM)
+ 0052 Shasta Firewire
+ 0053 Shasta PCI Bridge
+ 0054 Shasta PCI Bridge
+ 0055 Shasta PCI Bridge
+ 0056 U4 PCIe
+ 0057 U3 HT Bridge
+ 0058 U3L AGP Bridge
+ 0059 U3H AGP Bridge
+ 005b CPC945 PCIe Bridge
+ 0066 Intrepid2 AGP Bridge
+ 0067 Intrepid2 PCI Bridge
+ 0068 Intrepid2 PCI Bridge
+ 0069 Intrepid2 ATA/100
+ 006a Intrepid2 Firewire
+ 006b Intrepid2 GMAC (Sun GEM)
+ 0074 U4 HT Bridge
+ 1645 Tigon3 Gigabit Ethernet NIC (BCM5701)
+106c Hynix Semiconductor
+ 8801 Dual Pentium ISA/PCI Motherboard
+ 8802 PowerPC ISA/PCI Motherboard
+ 8803 Dual Window Graphics Accelerator
+ 8804 LAN Controller
+ 8805 100-BaseT LAN
+106d Sequent Computer Systems
+106e DFI, Inc
+106f City Gate Development Ltd
+1070 Daewoo Telecom Ltd
+1071 Mitac
+ 8160 Mitac 8060B Mobile Platform
+1072 GIT Co Ltd
+1073 Yamaha Corporation
+ 0001 3D GUI Accelerator
+ 0002 YGV615 [RPA3 3D-Graphics Controller]
+ 0003 YMF-740
+ 0004 YMF-724
+ 1073 0004 YMF724-Based PCI Audio Adapter
+ 0005 DS1 Audio
+ 1073 0005 DS-XG PCI Audio CODEC
+ 0006 DS1 Audio
+ 0008 DS1 Audio
+ 1073 0008 DS-XG PCI Audio CODEC
+ 000a DS1L Audio
+ 1073 0004 DS-XG PCI Audio CODEC
+ 1073 000a DS-XG PCI Audio CODEC
+ 8086 4d55 DS-XG PCI Audio CODEC [Intel MU440EX]
+ 000c YMF-740C [DS-1L Audio Controller]
+ 107a 000c DS-XG PCI Audio CODEC
+ 000d YMF-724F [DS-1 Audio Controller]
+ 1073 000d DS-XG PCI Audio CODEC
+ 0010 YMF-744B [DS-1S Audio Controller]
+ 1073 0006 DS-XG PCI Audio CODEC
+ 1073 0010 DS-XG PCI Audio CODEC
+ 0012 YMF-754 [DS-1E Audio Controller]
+ 1073 0012 DS-XG PCI Audio Codec
+ 0020 DS-1 Audio
+ 1000 SW1000XG [XG Factory]
+ 2000 DS2416 Digital Mixing Card
+ 1073 2000 DS2416 Digital Mixing Card
+1074 NexGen Microsystems
+ 4e78 82c500/1
+1075 Advanced Integrations Research
+1076 Chaintech Computer Co. Ltd
+1077 QLogic Corp.
+ 1016 ISP10160 Single Channel Ultra3 SCSI Processor
+ 1020 ISP1020 Fast-wide SCSI
+ 1022 ISP1022 Fast-wide SCSI
+ 1080 ISP1080 SCSI Host Adapter
+ 1216 ISP12160 Dual Channel Ultra3 SCSI Processor
+ 101e 8471 QLA12160 on AMI MegaRAID
+ 101e 8493 QLA12160 on AMI MegaRAID
+ 1240 ISP1240 SCSI Host Adapter
+ 1280 ISP1280 SCSI Host Adapter
+ 2020 ISP2020A Fast!SCSI Basic Adapter
+ 2100 QLA2100 64-bit Fibre Channel Adapter
+ 1077 0001 QLA2100 64-bit Fibre Channel Adapter
+ 2200 QLA2200 64-bit Fibre Channel Adapter
+ 1077 0002 QLA2200
+ 2300 QLA2300 64-bit Fibre Channel Adapter
+ 2312 ISP2312-based 2Gb Fibre Channel to PCI-X HBA
+ 103c 0131 2Gb Fibre Channel - Single port [A7538A]
+ 103c 12ba 2Gb Fibre Channel - Dual port [A6826A]
+ 2322 ISP2322-based 2Gb Fibre Channel to PCI-X HBA
+ 2422 ISP2422-based 4Gb Fibre Channel to PCI-X HBA
+ 103c 12d7 4Gb Fibre Channel [AB379A]
+ 103c 12dd 4Gb Fibre Channel [AB429A]
+ 2432 ISP2432-based 4Gb Fibre Channel to PCI Express HBA
+ 2532 ISP2532-based 8Gb Fibre Channel to PCI Express HBA
+ 3022 ISP4022-based Ethernet NIC
+ 3032 ISP4032-based Ethernet IPv6 NIC
+ 4010 ISP4010-based iSCSI TOE HBA
+ 4022 ISP4022-based iSCSI TOE HBA
+ 4032 ISP4032-based iSCSI TOE IPv6 HBA
+ 5432 SP232-based 4Gb Fibre Channel to PCI Express HBA
+ 6312 SP202-based 2Gb Fibre Channel to PCI-X HBA
+ 6322 SP212-based 2Gb Fibre Channel to PCI-X HBA
+ 7220 IBA7220 InfiniBand HCA
+ 7322 IBA7322 QDR InfiniBand HCA
+ 8000 10GbE Converged Network Adapter (TCP/IP Networking)
+ 8001 10GbE Converged Network Adapter (FCoE)
+ 8020 cLOM8214 1/10GbE Controller
+ 103c 3346 CN1000Q Dual Port Converged Network Adapter
+ 103c 3733 NC523SFP 10Gb 2-port Server Adapter
+ 1077 0203 8200 Series Single Port 10GbE Converged Network Adapter (TCP/IP Networking)
+ 1077 0207 8200 Series Dual Port 10GbE Converged Network Adapter (TCP/IP Networking)
+ 1077 020b 3200 Series Dual Port 10Gb Intelligent Ethernet Adapter
+ 1077 020c 3200 Series Quad Port 1Gb Intelligent Ethernet Adapter
+ 1077 020f 3200 Series Single Port 10Gb Intelligent Ethernet Adapter
+ 1077 0210 QME8242-k 10GbE Dual Port Mezzanine Card
+ 8021 8200 Series 10GbE Converged Network Adapter (FCoE)
+ 103c 3348 CN1000Q Dual Port Converged Network Adapter
+ 1077 0211 QME8242-k 10GbE Dual Port Mezzanine Card, FCoE
+ 8022 8200 Series 10GbE Converged Network Adapter (iSCSI)
+ 103c 3347 CN1000Q Dual Port Converged Network Adapter
+ 1077 0212 QME8242-k 10GbE Dual Port Mezzanine Card, iSCSI
+ 8432 ISP2432M-based 10GbE Converged Network Adapter (CNA)
+1078 Cyrix Corporation
+ 0000 5510 [Grappa]
+ 0001 PCI Master
+ 0002 5520 [Cognac]
+ 0100 5530 Legacy [Kahlua]
+ 0101 5530 SMI [Kahlua]
+ 0102 5530 IDE [Kahlua]
+ 0103 5530 Audio [Kahlua]
+ 0104 5530 Video [Kahlua]
+ 0400 ZFMicro PCI Bridge
+ 0401 ZFMicro Chipset SMI
+ 0402 ZFMicro Chipset IDE
+ 0403 ZFMicro Expansion Bus
+1079 I-Bus
+107a NetWorth
+107b Gateway 2000
+107c LG Electronics [Lucky Goldstar Co. Ltd]
+107d LeadTek Research Inc.
+ 0000 P86C850
+ 204d [GeForce 7800 GTX] Winfast PX7800 GTX TDH
+ 2134 WinFast 3D S320 II
+ 2971 [GeForce FX 5900] WinFast A350 TDH MyViVo
+ 6609 Winfast TV 2000 XP RM
+ 6654 Conexant CX23883 [WinFast DTV1800 H]
+ 6f22 WinFast PxTV1200
+ 6f34 WinFast DVR3100 H
+107e Interphase Corporation
+ 0001 5515 ATM Adapter [Flipper]
+ 0002 100 VG AnyLan Controller
+ 0004 5526 Fibre Channel Host Adapter
+ 0005 x526 Fibre Channel Host Adapter
+ 0008 5525/5575 ATM Adapter (155 Mbit) [Atlantic]
+ 9003 5535-4P-BRI-ST
+ 9007 5535-4P-BRI-U
+ 9008 5535-1P-SR
+ 900c 5535-1P-SR-ST
+ 900e 5535-1P-SR-U
+ 9011 5535-1P-PRI
+ 9013 5535-2P-PRI
+ 9023 5536-4P-BRI-ST
+ 9027 5536-4P-BRI-U
+ 9031 5536-1P-PRI
+ 9033 5536-2P-PRI
+107f Data Technology Corporation
+ 0802 SL82C105
+1080 Contaq Microsystems
+ 0600 82C599
+ c691 Cypress CY82C691
+ c693 82c693
+1081 Supermac Technology
+ 0d47 Radius PCI to NuBUS Bridge
+1082 EFA Corporation of America
+1083 Forex Computer Corporation
+ 0001 FR710
+1084 Parador
+1085 Tulip Computers Int.B.V.
+1086 J. Bond Computer Systems
+1087 Cache Computer
+1088 Microcomputer Systems (M) Son
+1089 Data General Corporation
+# Formerly Bit3 Computer Corp.
+108a SBS Technologies
+ 0001 VME Bridge Model 617
+ 0010 VME Bridge Model 618
+ 0040 dataBLIZZARD
+ 3000 VME Bridge Model 2706
+108c Oakleigh Systems Inc.
+108d Olicom
+ 0001 Token-Ring 16/4 PCI Adapter (3136/3137)
+ 0002 16/4 Token Ring
+ 0004 RapidFire 3139 Token-Ring 16/4 PCI Adapter
+ 108d 0004 OC-3139/3140 RapidFire Token-Ring 16/4 Adapter
+ 0005 GoCard 3250 Token-Ring 16/4 CardBus PC Card
+ 0006 OC-3530 RapidFire Token-Ring 100
+ 0007 RapidFire 3141 Token-Ring 16/4 PCI Fiber Adapter
+ 108d 0007 OC-3141 RapidFire Token-Ring 16/4 Adapter
+ 0008 RapidFire 3540 HSTR 100/16/4 PCI Adapter
+ 108d 0008 OC-3540 RapidFire HSTR 100/16/4 Adapter
+ 0011 OC-2315
+ 0012 OC-2325
+ 0013 OC-2183/2185
+ 0014 OC-2326
+ 0019 OC-2327/2250 10/100 Ethernet Adapter
+ 108d 0016 OC-2327 Rapidfire 10/100 Ethernet Adapter
+ 108d 0017 OC-2250 GoCard 10/100 Ethernet Adapter
+ 0021 OC-6151/6152 [RapidFire ATM 155]
+ 0022 ATM Adapter
+# formerly Sun Microsystems
+108e Oracle Corporation
+ 0001 EBUS
+ 1000 EBUS
+ 1001 Happy Meal 10/100 Ethernet [hme]
+ 1100 RIO EBUS
+ 108e 1100 RIO EBUS on Blade 100 motherboard
+# Correction
+ 1101 RIO 10/100 Ethernet [eri]
+ 108e 1101 RIO GEM on Blade 100 motherboard
+ 1102 RIO 1394
+ 108e 1102 RIO 1394 on Blade 100 motherboard
+ 1103 RIO USB
+ 108e 1103 RIO USB on Blade 100 motherboard
+ 1647 Broadcom 570x 10/100/1000 Ethernet [bge]
+ 1648 Broadcom 570x 10/100/1000 Ethernet [bge]
+ 16a7 Broadcom 570x 10/100/1000 Ethernet [bge]
+ 16a8 Broadcom 570x 10/100/1000 Ethernet [bge]
+ 2bad GEM 10/100/1000 Ethernet [ge]
+ 5000 Simba Advanced PCI Bridge
+ 108e 5000 Netra AX1105-500
+ 5043 SunPCI Co-processor
+ 5ca0 Crypto Accelerator 6000 [mca]
+ 6300 Intel 21554 PCI-PCI bus bridge [db21554]
+ 6301 Intel 21554 PCI-PCI bus bridge [db21554]
+ 6302 Intel 21554 PCI-PCI bus bridge [db21554]
+ 6303 Intel 21554 PCI-PCI bus bridge [db21554]
+ 6310 Intel 21554 PCI-PCI bus bridge [db21554]
+ 6311 Intel 21554 PCI-PCI bus bridge [db21554]
+ 6312 Intel 21554 PCI-PCI bus bridge [db21554]
+ 6313 Intel 21554 PCI-PCI bus bridge [db21554]
+ 6320 Intel 21554 PCI-PCI bus bridge [db21554]
+ 6323 Intel 21554 PCI-PCI bus bridge [db21554]
+ 6330 Intel 21554 PCI-PCI bus bridge [db21554]
+ 6331 Intel 21554 PCI-PCI bus bridge [db21554]
+ 6332 Intel 21554 PCI-PCI bus bridge [db21554]
+ 6333 Intel 21554 PCI-PCI bus bridge [db21554]
+ 6340 Intel 21554 PCI-PCI bus bridge [db21554]
+ 6343 Intel 21554 PCI-PCI bus bridge [db21554]
+ 6350 Intel 21554 PCI-PCI bus bridge [db21554]
+ 6353 Intel 21554 PCI-PCI bus bridge [db21554]
+ 6722 Intel 21554 PCI-PCI bus bridge [db21554]
+ 676e SunPCiIII
+ 7063 SunPCiII / SunPCiIIpro
+ 8000 Psycho PCI Bus Module
+ 8001 Schizo PCI Bus Module
+ 8002 Schizo+ PCI Bus Module
+ 80f0 PCIe switch [px]
+ 80f8 PCIe switch [px]
+ 9010 PCIe/PCI bridge switch [pxb_plx]
+ 9020 PCIe/PCI bridge switch [pxb_plx]
+ 9102 Davicom Fast Ethernet driver for Davicom DM9102A [dmfe]
+ a000 Psycho UPA-PCI Bus Module [pcipsy]
+ a001 Psycho UPA-PCI Bus Module [pcipsy]
+ 108e a001 Ultra IIe on Blade 100 motherboard
+ a801 Schizo Fireplane-PCI bus bridge module [pcisch]
+ aaaa Multithreaded Shared 10GbE Ethernet Network Controller
+ abba Cassini 10/100/1000
+ abcd Multithreaded 10-Gigabit Ethernet Network Controller
+ c416 Sun Fire System/System Controller Interface chip [sbbc]
+108f Systemsoft
+1090 Compro Computer Services, Inc.
+ 4610 PCI RTOM
+ 4620 GPIO HSD
+1091 Intergraph Corporation
+ 0020 3D graphics processor
+ 0021 3D graphics processor w/Texturing
+ 0040 3D graphics frame buffer
+ 0041 3D graphics frame buffer
+ 0060 Proprietary bus bridge
+ 00e4 Powerstorm 4D50T
+ 0720 Motion JPEG codec
+ 0780 Intense3D Wildcat 3410 (MSMT496)
+ 07a0 Sun Expert3D-Lite Graphics Accelerator
+ 1091 Sun Expert3D Graphics Accelerator
+1092 Diamond Multimedia Systems
+ 0028 Viper V770
+ 1092 4a00 Viper V770 32MB
+ 00a0 Speedstar Pro SE
+ 00a8 Speedstar 64
+ 0550 Viper V550
+ 08d4 Supra 2260 Modem
+ 094c SupraExpress 56i Pro
+ 1001 Video Crunch It 1001 capture card
+ 1092 Viper V330
+ 6120 Maximum DVD
+ 8810 Stealth SE
+ 8811 Stealth 64/SE
+ 8880 Stealth
+ 8881 Stealth
+ 88b0 Stealth 64
+ 88b1 Stealth 64
+ 88c0 Stealth 64
+ 88c1 Stealth 64
+ 88d0 Stealth 64
+ 88d1 Stealth 64
+ 88f0 Stealth 64
+ 88f1 Stealth 64
+ 9999 DMD-I0928-1 "Monster sound" sound chip
+1093 National Instruments
+ 0160 PCI-DIO-96
+ 0162 PCI-MIO-16XE-50
+ 1150 PCI-DIO-32HS High Speed Digital I/O Board
+ 1170 PCI-MIO-16XE-10
+ 1180 PCI-MIO-16E-1
+ 1190 PCI-MIO-16E-4
+ 11b0 PXI-6070E
+ 11c0 PXI-6040e
+ 11d0 PXI-6030e
+ 1270 PCI-6032e
+ 1310 PCI-6602
+ 1330 PCI-6031E
+ 1340 PCI-6033e
+ 1350 PCI-6071E
+ 1360 PXI-6602
+ 14e0 PCI-6110
+ 14f0 PCI-6111
+ 1580 PXI-6031E
+ 15b0 PXI-6071E
+ 1710 PXI-6509
+ 17d0 PCI-6503
+ 1870 PCI-6713
+ 1880 PCI-6711
+ 18b0 PCI-6052E
+ 18c0 PXI-6052E
+ 2410 PCI-6733
+ 2420 PXI-6733
+ 2430 PCI-6731
+ 2880 DAQCard-6601
+ 2890 PCI-6036E
+ 28c0 PCI-6014
+ 2a60 PCI-6023E
+ 2a70 PCI-6024E
+ 2a80 PCI-6025E
+ 2ab0 PXI-6025e
+ 2b80 PXI-6713
+ 2b90 PXI-6711
+ 2c60 PCI-6601
+ 2c70 PXI-6601
+ 2c80 PCI-6035E
+ 2ca0 PCI-6034E
+ 2cc0 PXI-6608
+ 2db0 PCI-6608
+ 70a9 PCI-6528 (Digital I/O at 60V)
+ 70aa PCI-6229
+ 70ab PCI-6259
+ 70ac PCI-6289
+ 70ae PXI-6220
+ 70af PCI-6221
+ 70b0 PCI-6220
+ 70b4 PCI-6250
+ 70b6 PCI-6280
+ 70b7 PCI-6254
+ 70b8 PCI-6251 [M Series - High Speed Multifunction DAQ]
+ 70bc PCI-6284
+ 70bd PCI-6281
+ 70bf PXI-6281
+ 70c0 PCI-6143
+ 70f2 PCI-6224
+ 7144 PXI-5124 (12-bit 200 MS/s Digitizer)
+ 716c PCI-6225
+ 717d PCIE-6251
+ 717f PCIe-6259
+ 71bc PCI-6221 (37pin)
+ 71d0 PXI-6143
+ b001 IMAQ-PCI-1408
+ b011 IMAQ-PXI-1408
+ b021 IMAQ-PCI-1424
+ b031 IMAQ-PCI-1413
+ b041 IMAQ-PCI-1407
+ b051 IMAQ-PXI-1407
+ b061 IMAQ-PCI-1411
+ b071 IMAQ-PCI-1422
+ b081 IMAQ-PXI-1422
+ b091 IMAQ-PXI-1411
+ c801 PCI-GPIB
+ c831 PCI-GPIB bridge
+1094 First International Computers [FIC]
+# nee CMD Technology Inc
+1095 Silicon Image, Inc.
+ 0240 Adaptec AAR-1210SA SATA HostRAID Controller
+ 0640 PCI0640
+ 0643 PCI0643
+ 0646 PCI0646
+ 0647 PCI0647
+ 0648 PCI0648
+ 1043 8025 CUBX motherboard
+ 0649 SiI 0649 Ultra ATA/100 PCI to ATA Host Controller
+ 0e11 005d Integrated Ultra ATA-100 Dual Channel Controller
+ 0e11 007e Integrated Ultra ATA-100 IDE RAID Controller
+ 101e 0649 AMI MegaRAID IDE 100 Controller
+ 0650 PBC0650A
+ 0670 USB0670
+ 1095 0670 USB0670
+ 0673 USB0673
+ 0680 PCI0680 Ultra ATA-133 Host Controller
+ 1095 0680 SiI 0680 ATA/133 Controller
+ 1095 3680 Winic W-680 (Silicon Image 680 based)
+ 3112 SiI 3112 [SATALink/SATARaid] Serial ATA Controller
+ 1095 3112 SiI 3112 SATALink Controller
+ 1095 6112 SiI 3112 SATARaid Controller
+ 9005 0250 SATAConnect 1205SA Host Controller
+ 3114 SiI 3114 [SATALink/SATARaid] Serial ATA Controller
+ 1095 3114 SiI 3114 SATALink Controller
+ 1095 6114 SiI 3114 SATARaid Controller
+ 3124 SiI 3124 PCI-X Serial ATA Controller
+ 1095 3124 SiI 3124 PCI-X Serial ATA Controller
+ 3132 SiI 3132 Serial ATA Raid II Controller
+ 3512 SiI 3512 [SATALink/SATARaid] Serial ATA Controller
+ 1095 3512 SiI 3512 SATALink Controller
+ 1095 6512 SiI 3512 SATARaid Controller
+ 3531 SiI 3531 [SATALink/SATARaid] Serial ATA Controller
+1096 Alacron
+1097 Appian Technology
+1098 Quantum Designs (H.K.) Ltd
+ 0001 QD-8500
+ 0002 QD-8580
+1099 Samsung Electronics Co., Ltd
+109a Packard Bell
+109b Gemlight Computer Ltd.
+109c Megachips Corporation
+109d Zida Technologies Ltd.
+109e Brooktree Corporation
+ 032e Bt878 Video Capture
+ 0350 Bt848 Video Capture
+ 0351 Bt849A Video capture
+ 0369 Bt878 Video Capture
+ 1002 0001 TV-Wonder
+ 1002 0003 TV-Wonder/VE
+ 036c Bt879(??) Video Capture
+ 13e9 0070 Win/TV (Video Section)
+ 036e Bt878 Video Capture
+ 0070 13eb WinTV Series
+ 0070 ff01 Viewcast Osprey 200
+ 0071 0101 DigiTV PCI
+ 107d 6606 WinFast TV 2000
+ 11bd 0012 PCTV pro (TV + FM stereo receiver)
+ 11bd 001c PCTV Sat (DBC receiver)
+ 127a 0001 Bt878 Mediastream Controller NTSC
+ 127a 0002 Bt878 Mediastream Controller PAL BG
+ 127a 0003 Bt878a Mediastream Controller PAL BG
+ 127a 0048 Bt878/832 Mediastream Controller
+ 144f 3000 MagicTView CPH060 - Video
+ 1461 0002 TV98 Series (TV/No FM/Remote)
+ 1461 0003 AverMedia UltraTV PCI 350
+ 1461 0004 AVerTV WDM Video Capture
+ 1461 0761 AverTV DVB-T
+ 1461 0771 AverMedia AVerTV DVB-T 771
+ 14f1 0001 Bt878 Mediastream Controller NTSC
+ 14f1 0002 Bt878 Mediastream Controller PAL BG
+ 14f1 0003 Bt878a Mediastream Controller PAL BG
+ 14f1 0048 Bt878/832 Mediastream Controller
+ 1822 0001 VisionPlus DVB card
+ 1851 1850 FlyVideo'98 - Video
+ 1851 1851 FlyVideo II
+ 1852 1852 FlyVideo'98 - Video (with FM Tuner)
+ 18ac d500 DViCO FusionHDTV5 Lite
+ 270f fc00 Digitop DTT-1000
+ bd11 1200 PCTV pro (TV + FM stereo receiver)
+ 036f Bt879 Video Capture
+ 127a 0044 Bt879 Video Capture NTSC
+ 127a 0122 Bt879 Video Capture PAL I
+ 127a 0144 Bt879 Video Capture NTSC
+ 127a 0222 Bt879 Video Capture PAL BG
+ 127a 0244 Bt879a Video Capture NTSC
+ 127a 0322 Bt879 Video Capture NTSC
+ 127a 0422 Bt879 Video Capture NTSC
+ 127a 1122 Bt879 Video Capture PAL I
+ 127a 1222 Bt879 Video Capture PAL BG
+ 127a 1322 Bt879 Video Capture NTSC
+ 127a 1522 Bt879a Video Capture PAL I
+ 127a 1622 Bt879a Video Capture PAL BG
+ 127a 1722 Bt879a Video Capture NTSC
+ 14f1 0044 Bt879 Video Capture NTSC
+ 14f1 0122 Bt879 Video Capture PAL I
+ 14f1 0144 Bt879 Video Capture NTSC
+ 14f1 0222 Bt879 Video Capture PAL BG
+ 14f1 0244 Bt879a Video Capture NTSC
+ 14f1 0322 Bt879 Video Capture NTSC
+ 14f1 0422 Bt879 Video Capture NTSC
+ 14f1 1122 Bt879 Video Capture PAL I
+ 14f1 1222 Bt879 Video Capture PAL BG
+ 14f1 1322 Bt879 Video Capture NTSC
+ 14f1 1522 Bt879a Video Capture PAL I
+ 14f1 1622 Bt879a Video Capture PAL BG
+ 14f1 1722 Bt879a Video Capture NTSC
+ 1851 1850 FlyVideo'98 - Video
+ 1851 1851 FlyVideo II
+ 1852 1852 FlyVideo'98 - Video (with FM Tuner)
+ 0370 Bt880 Video Capture
+ 1851 1850 FlyVideo'98
+ 1851 1851 FlyVideo'98 EZ - video
+ 1852 1852 FlyVideo'98 (with FM Tuner)
+ 0878 Bt878 Audio Capture
+ 0070 13eb WinTV Series
+ 0070 ff01 Viewcast Osprey 200
+ 0071 0101 DigiTV PCI
+ 1002 0001 TV-Wonder
+ 1002 0003 TV-Wonder/VE
+ 11bd 0012 PCTV pro (TV + FM stereo receiver, audio section)
+ 11bd 001c PCTV Sat (DBC receiver)
+ 127a 0001 Bt878 Video Capture (Audio Section)
+ 127a 0002 Bt878 Video Capture (Audio Section)
+ 127a 0003 Bt878 Video Capture (Audio Section)
+ 127a 0048 Bt878 Video Capture (Audio Section)
+ 13e9 0070 Win/TV (Audio Section)
+ 144f 3000 MagicTView CPH060 - Audio
+ 1461 0002 Avermedia PCTV98 Audio Capture
+ 1461 0003 UltraTV PCI 350
+ 1461 0004 AVerTV WDM Audio Capture
+ 1461 0761 AVerTV DVB-T
+ 1461 0771 AverMedia AVerTV DVB-T 771
+ 14f1 0001 Bt878 Video Capture (Audio Section)
+ 14f1 0002 Bt878 Video Capture (Audio Section)
+ 14f1 0003 Bt878 Video Capture (Audio Section)
+ 14f1 0048 Bt878 Video Capture (Audio Section)
+ 1822 0001 VisionPlus DVB Card
+ 18ac d500 DViCO FusionHDTV5 Lite
+ 270f fc00 Digitop DTT-1000
+ bd11 1200 PCTV pro (TV + FM stereo receiver, audio section)
+ 0879 Bt879 Audio Capture
+ 127a 0044 Bt879 Video Capture (Audio Section)
+ 127a 0122 Bt879 Video Capture (Audio Section)
+ 127a 0144 Bt879 Video Capture (Audio Section)
+ 127a 0222 Bt879 Video Capture (Audio Section)
+ 127a 0244 Bt879 Video Capture (Audio Section)
+ 127a 0322 Bt879 Video Capture (Audio Section)
+ 127a 0422 Bt879 Video Capture (Audio Section)
+ 127a 1122 Bt879 Video Capture (Audio Section)
+ 127a 1222 Bt879 Video Capture (Audio Section)
+ 127a 1322 Bt879 Video Capture (Audio Section)
+ 127a 1522 Bt879 Video Capture (Audio Section)
+ 127a 1622 Bt879 Video Capture (Audio Section)
+ 127a 1722 Bt879 Video Capture (Audio Section)
+ 14f1 0044 Bt879 Video Capture (Audio Section)
+ 14f1 0122 Bt879 Video Capture (Audio Section)
+ 14f1 0144 Bt879 Video Capture (Audio Section)
+ 14f1 0222 Bt879 Video Capture (Audio Section)
+ 14f1 0244 Bt879 Video Capture (Audio Section)
+ 14f1 0322 Bt879 Video Capture (Audio Section)
+ 14f1 0422 Bt879 Video Capture (Audio Section)
+ 14f1 1122 Bt879 Video Capture (Audio Section)
+ 14f1 1222 Bt879 Video Capture (Audio Section)
+ 14f1 1322 Bt879 Video Capture (Audio Section)
+ 14f1 1522 Bt879 Video Capture (Audio Section)
+ 14f1 1622 Bt879 Video Capture (Audio Section)
+ 14f1 1722 Bt879 Video Capture (Audio Section)
+ 0880 Bt880 Audio Capture
+ 2115 BtV 2115 Mediastream controller
+ 2125 BtV 2125 Mediastream controller
+ 2164 BtV 2164
+ 2165 BtV 2165
+ 8230 Bt8230 ATM Segment/Reassembly Ctrlr (SRC)
+ 8472 Bt8472
+ 8474 Bt8474
+109f Trigem Computer Inc.
+10a0 Meidensha Corporation
+10a1 Juko Electronics Ind. Co. Ltd
+10a2 Quantum Corporation
+10a3 Everex Systems Inc
+10a4 Globe Manufacturing Sales
+10a5 Smart Link Ltd.
+ 3052 SmartPCI562 56K Modem
+ 5449 SmartPCI561 modem
+10a6 Informtech Industrial Ltd.
+10a7 Benchmarq Microelectronics
+10a8 Sierra Semiconductor
+ 0000 STB Horizon 64
+10a9 Silicon Graphics Intl. Corp.
+ 0001 Crosstalk to PCI Bridge
+ 0002 Linc I/O controller
+ 0003 IOC3 I/O controller
+ 0004 O2 MACE
+ 0005 RAD Audio
+ 0006 HPCEX
+ 0007 RPCEX
+ 0008 DiVO VIP
+ 0009 AceNIC Gigabit Ethernet
+ 10a9 8002 AceNIC Gigabit Ethernet
+ 0010 AMP Video I/O
+ 0011 GRIP
+ 0012 SGH PSHAC GSN
+ 0208 SSIM1 SAS Adapter
+ 1001 Magic Carpet
+ 1002 Lithium
+ 1003 Dual JPEG 1
+ 1004 Dual JPEG 2
+ 1005 Dual JPEG 3
+ 1006 Dual JPEG 4
+ 1007 Dual JPEG 5
+ 1008 Cesium
+ 100a IOC4 I/O controller
+ 1504 SSIM1 Fibre Channel Adapter
+ 2001 Fibre Channel
+ 2002 ASDE
+ 4001 TIO-CE PCI Express Bridge
+ 4002 TIO-CE PCI Express Port
+ 8001 O2 1394
+ 8002 G-net NT
+10aa ACC Microelectronics
+ 0000 ACCM 2188
+ 2051 2051 CPU bridge
+ 5842 2051 ISA bridge
+10ab Digicom
+10ac Honeywell IAC
+10ad Symphony Labs
+ 0001 W83769F
+ 0003 SL82C103
+ 0005 SL82C105
+ 0103 SL82c103
+ 0105 SL82c105
+ 0565 W83C553F/W83C554F
+10ae Cornerstone Technology
+10af Micro Computer Systems Inc
+10b0 CardExpert Technology
+10b1 Cabletron Systems Inc
+10b2 Raytheon Company
+10b3 Databook Inc
+ 3106 DB87144
+ b106 DB87144
+10b4 STB Systems Inc
+ 1b1d Velocity 128 3D
+ 10b4 237e Velocity 4400
+10b5 PLX Technology, Inc.
+ 0001 i960 PCI bus interface
+ 1024 Acromag, Inc. IndustryPack Carrier Card
+ 1042 Brandywine / jxi2, Inc. - PMC-SyncClock32, IRIG A & B, Nasa 36
+ 106a Dual OX16C952 4 port serial adapter [Megawolf Romulus/4]
+ 1076 VScom 800 8 port serial adaptor
+ 1077 VScom 400 4 port serial adaptor
+ 1078 VScom 210 2 port serial and 1 port parallel adaptor
+ 1103 VScom 200 2 port serial adaptor
+ 1146 VScom 010 1 port parallel adaptor
+ 1147 VScom 020 2 port parallel adaptor
+ 2540 IXXAT CAN-Interface PC-I 04/PCI
+ 2724 Thales PCSM Security Card
+ 3376 Cosateq 4 Port CAN Card
+ 6140 PCI6140 32-bit 33MHz PCI-to-PCI Bridge
+ 6150 PCI6150 32-bit 33MHz PCI-to-PCI Bridge
+ 6152 PCI6152 32-bit 66MHz PCI-to-PCI Bridge
+ 6154 PCI6154 64-bit 66MHz PCI-to-PCI Bridge
+ 6254 PCI6254 64-bit 66MHz PCI-to-PCI Bridge
+ 6466 PCI6466 64-bit 66MHz PCI-to-PCI Bridge
+ 6520 PCI6520 64-bit 133MHz PCI-X-to-PCI-X Bridge
+ 6540 PCI6540 64-bit 133MHz PCI-X-to-PCI-X Bridge
+ 1775 1100 CR11 Single Board Computer
+ 4c53 10e0 PSL09 PrPMC
+ 6541 PCI6540/6466 PCI-PCI bridge (non-transparent mode, primary side)
+ 1775 1100 CR11 Single Board Computer
+ 4c53 10e0 PSL09 PrPMC
+ 6542 PCI6540/6466 PCI-PCI bridge (non-transparent mode, secondary side)
+ 1775 1100 CR11 Single Board Computer
+ 4c53 10e0 PSL09 PrPMC
+ 8111 PEX 8111 PCI Express-to-PCI Bridge
+ 8112 PEX8112 x1 Lane PCI Express-to-PCI Bridge
+ 8114 PEX 8114 PCI Express-to-PCI/PCI-X Bridge
+ 8311 PEX8311 x1 Lane PCI Express-to-Generic Local Bus Bridge
+ 8505 PEX 8505 5-lane, 5-port PCI Express Switch
+ 8508 PEX 8508 8-lane, 5-port PCI Express Switch
+ 8509 PEX 8509 8-lane, 8-port PCI Express Switch
+ 8512 PEX 8512 12-lane, 5-port PCI Express Switch
+ 8516 PEX 8516 Versatile PCI Express Switch
+ 8517 PEX 8517 16-lane, 5-port PCI Express Switch
+ 8518 PEX 8518 16-lane, 5-port PCI Express Switch
+ 8524 PEX 8524 24-lane, 6-port PCI Express Switch
+ 8525 PEX 8525 24-lane, 5-port PCI Express Switch
+ 8532 PEX 8532 Versatile PCI Express Switch
+ 8533 PEX 8533 32-lane, 6-port PCI Express Switch
+ 8547 PEX 8547 48-lane, 3-port PCI Express Switch
+ 8548 PEX 8548 48-lane, 9-port PCI Express Switch
+ 8604 PEX 8604 4-lane, 4-Port PCI Express Gen 2 (5.0 GT/s) Switch
+ 8606 PEX 8606 6 Lane, 6 Port PCI Express Gen 2 (5.0 GT/s) Switch
+ 8608 PEX 8608 8-lane, 8-Port PCI Express Gen 2 (5.0 GT/s) Switch
+ 8609 PEX 8609 8-lane, 8-Port PCI Express Gen 2 (5.0 GT/s) Switch with DMA
+ 8612 PEX 8612 12-lane, 4-Port PCI Express Gen 2 (5.0 GT/s) Switch
+ 8613 PEX 8613 12-lane, 3-Port PCI Express Gen 2 (5.0 GT/s) Switch
+ 8614 PEX 8614 12-lane, 12-Port PCI Express Gen 2 (5.0 GT/s) Switch
+ 8615 PEX 8615 12-lane, 12-Port PCI Express Gen 2 (5.0 GT/s) Switch with DMA
+ 8616 PEX 8616 16-lane, 4-Port PCI Express Gen 2 (5.0 GT/s) Switch
+ 8617 PEX 8617 16-lane, 4-Port PCI Express Gen 2 (5.0 GT/s) Switch with P2P
+ 8618 PEX 8618 16-lane, 16-Port PCI Express Gen 2 (5.0 GT/s) Switch
+ 8619 PEX 8619 16-lane, 16-Port PCI Express Gen 2 (5.0 GT/s) Switch with DMA
+ 8624 PEX 8624 24-lane, 6-Port PCI Express Gen 2 (5.0 GT/s) Switch [ExpressLane]
+ 13a3 1845 DX1845 Acceleration Card
+ 8625 PEX 8625 24-lane, 24-Port PCI Express Gen 2 (5.0 GT/s) Switch
+ 8632 PEX 8632 32-lane, 12-Port PCI Express Gen 2 (5.0 GT/s) Switch
+ 8636 PEX 8636 36-lane, 24-Port PCI Express Gen 2 (5.0 GT/s) Switch
+ 8647 PEX 8647 48-Lane, 3-Port PCI Express Gen 2 (5.0 GT/s) Switch
+ 8648 PEX 8648 48-lane, 12-Port PCI Express Gen 2 (5.0 GT/s) Switch
+ 8649 PEX 8649 48-lane, 12-Port PCI Express Gen 2 (5.0 GT/s) Switch
+ 8664 PEX 8664 64-lane, 16-Port PCI Express Gen 2 (5.0 GT/s) Switch
+ 8680 PEX 8680 80-lane, 20-Port PCI Express Gen 2 (5.0 GT/s) Multi-Root Switch
+ 8696 PEX 8696 96-lane, 24-Port PCI Express Gen 2 (5.0 GT/s) Multi-Root Switch
+ 9016 PLX 9016 8-port serial controller
+ 9030 PCI9030 32-bit 33MHz PCI <-> IOBus Bridge
+ 10b5 2695 Hilscher CIF50-PB Profibus Master Board
+ 10b5 2862 Alpermann+Velte PCL PCI LV (3V/5V): Timecode Reader Board
+ 10b5 2906 Alpermann+Velte PCI TS (3V/5V): Time Synchronisation Board
+ 10b5 2940 Alpermann+Velte PCL PCI D (3V/5V): Timecode Reader Board
+ 10b5 2977 IXXAT iPC-I XC16/PCI CAN Board
+ 10b5 2978 SH ARC-PCIu/SH ARC-PCI104/SH ARC-PCIe SOHARD ARCNET card
+ 10b5 3025 Alpermann+Velte PCL PCI L (3V/5V): Timecode Reader Board
+ 10b5 3068 Alpermann+Velte PCL PCI HD (3V/5V): Timecode Reader Board
+ 10b5 3463 Alpermann+Velte PCL PCI D (v2) (3V/5V): Timecode Reader Board
+ 12fe 0111 CPCI-ASIO4 (ESD 4-port Serial Interface Board)
+ 1369 9c01 VX222v2
+ 1369 9d01 VX222-Mic
+ 1369 9d02 VX222-Mic
+ 1369 9e01 PCX924v2
+ 1369 9f01 PCX924-Mic
+ 1369 9f02 PCX924-Mic
+ 1369 a001 PCX22v2
+ 1369 a701 LCM220v2
+ 1369 a801 LCM200
+ 1397 3136 4xS0-ISDN PCI Adapter
+ 1397 3137 S2M-E1-ISDN PCI Adapter
+ 1518 0200 Kontron ThinkIO-C
+ 15ed 1002 MCCS 8-port Serial Hot Swap
+ 15ed 1003 MCCS 16-port Serial Hot Swap
+# MIL-STD-1553B Board
+ e1c5 0001 TE1-PCI
+ e1c5 0005 TA1-PCI
+ e1c5 0006 TA1-PCI4
+ 9036 9036
+ 9050 PCI <-> IOBus Bridge
+ 10b5 1067 IXXAT CAN i165
+ 10b5 114e Wasco WITIO PCI168extended
+ 10b5 1169 Wasco OPTOIO32standard 32 digital in, 32 digital out
+ 10b5 1172 IK220 (Heidenhain)
+ 10b5 2036 SatPak GPS
+ 10b5 2221 Alpermann+Velte PCL PCI LV: Timecode Reader Board
+ 10b5 2273 SH ARC-PCI SOHARD ARCNET card
+ 10b5 2431 Alpermann+Velte PCL PCI D: Timecode Reader Board
+ 10b5 2905 Alpermann+Velte PCI TS: Time Synchronisation Board
+ 10b5 3196 Goramo PLX200SYN sync serial card
+ 10b5 9050 PCI-I04 PCI Passive PC/CAN Interface
+ 1369 8901 PCX11+ PCI
+ 1369 8f01 VX222
+ 1369 9401 PCX924
+ 1369 9501 PCX22
+ 1498 0362 TPMC866 8 Channel Serial Card
+ 1522 0001 RockForce 4 Port V.90 Data/Fax/Voice Modem
+ 1522 0002 RockForce 2 Port V.90 Data/Fax/Voice Modem
+ 1522 0003 RockForce 6 Port V.90 Data/Fax/Voice Modem
+ 1522 0004 RockForce 8 Port V.90 Data/Fax/Voice Modem
+ 1522 0010 RockForce2000 4 Port V.90 Data/Fax/Voice Modem
+ 1522 0020 RockForce2000 2 Port V.90 Data/Fax/Voice Modem
+ 15ed 1000 Macrolink MCCS 8-port Serial
+ 15ed 1001 Macrolink MCCS 16-port Serial
+ 15ed 1002 Macrolink MCCS 8-port Serial Hot Swap
+ 15ed 1003 Macrolink MCCS 16-port Serial Hot Swap
+ 5654 2036 OpenSwitch 6 Telephony card
+ 5654 3132 OpenSwitch 12 Telephony card
+ 5654 5634 OpenLine4 Telephony Card
+ d531 c002 PCIntelliCAN 2xSJA1000 CAN bus
+ d84d 4006 EX-4006 1P
+ d84d 4008 EX-4008 1P EPP/ECP
+ d84d 4014 EX-4014 2P
+ d84d 4018 EX-4018 3P EPP/ECP
+ d84d 4025 EX-4025 1S(16C550) RS-232
+ d84d 4027 EX-4027 1S(16C650) RS-232
+ d84d 4028 EX-4028 1S(16C850) RS-232
+ d84d 4036 EX-4036 2S(16C650) RS-232
+ d84d 4037 EX-4037 2S(16C650) RS-232
+ d84d 4038 EX-4038 2S(16C850) RS-232
+ d84d 4052 EX-4052 1S(16C550) RS-422/485
+ d84d 4053 EX-4053 2S(16C550) RS-422/485
+ d84d 4055 EX-4055 4S(16C550) RS-232
+ d84d 4058 EX-4055 4S(16C650) RS-232
+ d84d 4065 EX-4065 8S(16C550) RS-232
+ d84d 4068 EX-4068 8S(16C650) RS-232
+ d84d 4078 EX-4078 2S(16C552) RS-232+1P
+ 9052 PCI9052 PCI <-> IOBus Bridge
+ 9054 PCI9054 32-bit 33MHz PCI <-> IOBus Bridge
+ 10b5 2455 Wessex Techology PHIL-PCI
+ 10b5 2696 Innes Corp AM Radcap card
+ 10b5 2717 Innes Corp Auricon card
+ 10b5 2844 Innes Corp TVS Encoder card
+ 12c7 4001 Intel Dialogic DM/V960-4T1 PCI
+ 12d9 0002 PCI Prosody Card rev 1.5
+ 14b4 d100 Dektec DTA-100
+ 14b4 d114 Dektec DTA-120
+ 16df 0011 PIKA PrimeNet MM PCI
+ 16df 0012 PIKA PrimeNet MM cPCI 8
+ 16df 0013 PIKA PrimeNet MM cPCI 8 (without CAS Signaling)
+ 16df 0014 PIKA PrimeNet MM cPCI 4
+ 16df 0015 PIKA Daytona MM
+ 16df 0016 PIKA InLine MM
+ 9056 PCI9056 32-bit 66MHz PCI <-> IOBus Bridge
+ 10b5 2979 CellinkBlade 11 - CPCI board VoATM AAL1
+ 10b5 3268 IXXAT iPC-I XC16/PCIe CAN Board
+ 10b5 3352 Alpermann+Velte PCL PCIe HD: Timecode Reader Board
+ 10b5 3353 Alpermann+Velte PCL PCIe D: Timecode Reader Board
+ 10b5 3354 Alpermann+Velte PCL PCIe LV: Timecode Reader Board
+ 10b5 3355 Alpermann+Velte PCL PCIe L: Timecode Reader Board
+ 10b5 3415 Alpermann+Velte PCIe TS: Time Synchronisation Board
+ 1369 c001 LX6464ES
+ 1369 c201 LX1616ES
+ 14b4 d10a DekTec DTA-110T
+ 14b4 d140 Dektec DTA-140
+ 1a0e 006f Dektec DTA-111
+ 9060 PCI9060 32-bit 33MHz PCI <-> IOBus Bridge
+ 906d 9060SD
+ 125c 0640 Aries 16000P
+ 906e 9060ES
+ 9080 PCI9080 32-bit; 33MHz PCI <-> IOBus Bridge
+ 103c 10eb (Agilent) E2777B 83K Series Optical Communication Interface
+ 103c 10ec (Agilent) E6978-66442 PCI CIC
+ 10b5 1123 Sectra KK631 encryption board
+ 10b5 9080 9080 [real subsystem ID not set]
+ 12d9 0002 PCI Prosody Card
+ 12df 4422 4422PCI ["Do-All" Telemetry Data Aquisition System]
+ 1369 9601 PCX822np
+ 1369 a102 PCX822v2
+ 1369 a201 PCX442
+ 1369 a301 LCM440v2
+ 1369 a401 VX822
+ 1369 a402 VX822v2
+ 1369 a901 LCM420
+ 1369 aa01 VX820v2
+ 1517 000b ECSG-1R3ADC-PMC Clock synthesizer
+ 9656 PCI9656 PCI <-> IOBus Bridge
+ 1517 000f ECDR-GC314-PMC Receiver
+ 1885 0700 Tsunami FPGA PMC with Altera Stratix S40
+ 1885 0701 Tsunami FPGA PMC with Altera Stratix S30
+ a100 Blackmagic Design DeckLink
+ bb04 B&B 3PCIOSD1A Isolated PCI Serial
+ c001 CronyxOmega-PCI (8-port RS232)
+10b6 Madge Networks
+ 0001 Smart 16/4 PCI Ringnode
+ 0002 Smart 16/4 PCI Ringnode Mk2
+ 10b6 0002 Smart 16/4 PCI Ringnode Mk2
+ 10b6 0006 16/4 CardBus Adapter
+ 0003 Smart 16/4 PCI Ringnode Mk3
+ 0e11 b0fd Compaq NC4621 PCI, 4/16, WOL
+ 10b6 0003 Smart 16/4 PCI Ringnode Mk3
+ 10b6 0007 Presto PCI Plus Adapter
+ 0004 Smart 16/4 PCI Ringnode Mk1
+ 0006 16/4 Cardbus Adapter
+ 10b6 0006 16/4 CardBus Adapter
+ 0007 Presto PCI Adapter
+ 10b6 0007 Presto PCI
+ 0009 Smart 100/16/4 PCI-HS Ringnode
+ 10b6 0009 Smart 100/16/4 PCI-HS Ringnode
+ 000a Smart 100/16/4 PCI Ringnode
+ 10b6 000a Smart 100/16/4 PCI Ringnode
+ 000b 16/4 CardBus Adapter Mk2
+ 10b6 0008 16/4 CardBus Adapter Mk2
+ 10b6 000b 16/4 Cardbus Adapter Mk2
+ 000c RapidFire 3140V2 16/4 TR Adapter
+ 10b6 000c RapidFire 3140V2 16/4 TR Adapter
+ 1000 Collage 25/155 ATM Client Adapter
+ 1001 Collage 155 ATM Server Adapter
+10b7 3Com Corporation
+ 0001 3c985 1000BaseSX (SX/TX)
+ 0013 AR5212 802.11abg NIC (3CRDAG675)
+ 10b7 2031 3CRDAG675 11a/b/g Wireless PCI Adapter
+ 0910 3C910-A01
+ 1006 MINI PCI type 3B Data Fax Modem
+ 1007 Mini PCI 56k Winmodem
+ 10b7 615b Mini PCI 56K Modem
+ 10b7 615c Mini PCI 56K Modem
+ 1201 3c982-TXM 10/100baseTX Dual Port A [Hydra]
+ 1202 3c982-TXM 10/100baseTX Dual Port B [Hydra]
+ 1700 3c940 10/100/1000Base-T [Marvell]
+ 1043 80eb A7V600/P4P800/K8V motherboard
+ 10b7 0010 3C940 Gigabit LOM Ethernet Adapter
+ 10b7 0020 3C941 Gigabit LOM Ethernet Adapter
+ 147b 1407 KV8-MAX3 motherboard
+ 3390 3c339 TokenLink Velocity
+ 3590 3c359 TokenLink Velocity XL
+ 10b7 3590 TokenLink Velocity XL Adapter (3C359/359B)
+ 4500 3c450 HomePNA [Tornado]
+ 5055 3c555 Laptop Hurricane
+ 5057 3c575 Megahertz 10/100 LAN CardBus [Boomerang]
+ 10b7 5a57 3C575 Megahertz 10/100 LAN Cardbus PC Card
+ 5157 3cCFE575BT Megahertz 10/100 LAN CardBus [Cyclone]
+ 10b7 5b57 3C575 Megahertz 10/100 LAN Cardbus PC Card
+ 5257 3cCFE575CT CardBus [Cyclone]
+ 10b7 5c57 FE575C-3Com 10/100 LAN CardBus-Fast Ethernet
+ 5900 3c590 10BaseT [Vortex]
+ 5920 3c592 EISA 10mbps Demon/Vortex
+ 5950 3c595 100BaseTX [Vortex]
+ 5951 3c595 100BaseT4 [Vortex]
+ 5952 3c595 100Base-MII [Vortex]
+ 5970 3c597 EISA Fast Demon/Vortex
+ 5b57 3c595 Megahertz 10/100 LAN CardBus [Boomerang]
+ 10b7 5b57 3C575 Megahertz 10/100 LAN Cardbus PC Card
+ 6000 3CRSHPW796 [OfficeConnect Wireless CardBus]
+ 6001 3com 3CRWE154G72 [Office Connect Wireless LAN Adapter]
+ 6055 3c556 Hurricane CardBus [Cyclone]
+ 6056 3c556B CardBus [Tornado]
+ 10b7 6556 10/100 Mini PCI Ethernet Adapter
+ 6560 3cCFE656 CardBus [Cyclone]
+ 10b7 656a 3CCFEM656 10/100 LAN+56K Modem CardBus
+ 6561 3cCFEM656 10/100 LAN+56K Modem CardBus
+ 10b7 656b 3CCFEM656 10/100 LAN+56K Modem CardBus
+ 6562 3cCFEM656B 10/100 LAN+Winmodem CardBus [Cyclone]
+ 10b7 656b 3CCFEM656B 10/100 LAN+56K Modem CardBus
+ 6563 3cCFEM656B 10/100 LAN+56K Modem CardBus
+ 10b7 656b 3CCFEM656 10/100 LAN+56K Modem CardBus
+ 6564 3cXFEM656C 10/100 LAN+Winmodem CardBus [Tornado]
+ 7646 3cSOHO100-TX Hurricane
+ 7770 3CRWE777 PCI(PLX) Wireless Adaptor [Airconnect]
+ 7940 3c803 FDDILink UTP Controller
+ 7980 3c804 FDDILink SAS Controller
+ 7990 3c805 FDDILink DAS Controller
+ 80eb 3c940B 10/100/1000Base-T
+ 8811 Token ring
+ 9000 3c900 10BaseT [Boomerang]
+ 9001 3c900 10Mbps Combo [Boomerang]
+ 9004 3c900B-TPO Etherlink XL [Cyclone]
+ 10b7 9004 3C900B-TPO Etherlink XL TPO 10Mb
+ 9005 3c900B-Combo Etherlink XL [Cyclone]
+ 10b7 9005 3C900B-Combo Etherlink XL Combo
+ 9006 3c900B-TPC Etherlink XL [Cyclone]
+ 900a 3c900B-FL 10base-FL [Cyclone]
+ 9050 3c905 100BaseTX [Boomerang]
+ 9051 3c905 100BaseT4 [Boomerang]
+ 9054 3C905B-TX Fast Etherlink XL PCI
+ 10b7 9054 3C905B-TX Fast Etherlink XL PCI
+ 9055 3c905B 100BaseTX [Cyclone]
+ 1028 0080 3C905B Fast Etherlink XL 10/100
+ 1028 0081 3C905B Fast Etherlink XL 10/100
+ 1028 0082 3C905B Fast Etherlink XL 10/100
+ 1028 0083 3C905B Fast Etherlink XL 10/100
+ 1028 0084 3C905B Fast Etherlink XL 10/100
+ 1028 0085 3C905B Fast Etherlink XL 10/100
+ 1028 0086 3C905B Fast Etherlink XL 10/100
+ 1028 0087 3C905B Fast Etherlink XL 10/100
+ 1028 0088 3C905B Fast Etherlink XL 10/100
+ 1028 0089 3C905B Fast Etherlink XL 10/100
+ 1028 0090 3C905B Fast Etherlink XL 10/100
+ 1028 0091 3C905B Fast Etherlink XL 10/100
+ 1028 0092 3C905B Fast Etherlink XL 10/100
+ 1028 0093 3C905B Fast Etherlink XL 10/100
+ 1028 0094 3C905B Fast Etherlink XL 10/100
+ 1028 0095 3C905B Fast Etherlink XL 10/100
+ 1028 0096 3C905B Fast Etherlink XL 10/100
+ 1028 0097 3C905B Fast Etherlink XL 10/100
+ 1028 0098 3C905B Fast Etherlink XL 10/100
+ 1028 0099 3C905B Fast Etherlink XL 10/100
+ 10b7 9055 3C905B Fast Etherlink XL 10/100
+ 9056 3c905B-T4 Fast EtherLink XL [Cyclone]
+ 9058 3c905B Deluxe Etherlink 10/100/BNC [Cyclone]
+ 905a 3c905B-FX Fast Etherlink XL FX 100baseFx [Cyclone]
+ 9200 3c905C-TX/TX-M [Tornado]
+ 1028 0095 3C920 Integrated Fast Ethernet Controller
+ 1028 0097 3C920 Integrated Fast Ethernet Controller
+ 1028 00b4 OptiPlex GX110
+ 1028 00d8 Precision 530
+ 1028 00fe Optiplex GX240
+ 1028 012a 3C920 Integrated Fast Ethernet Controller [Latitude C640]
+ 10b7 1000 3C905CX-TX/TX-M Fast Etherlink for PC Management NIC
+ 10b7 7000 10/100 Mini PCI Ethernet Adapter
+ 10f1 2466 Tiger MPX S2466 (3C920 Integrated Fast Ethernet Controller)
+ 144d c005 X10 Laptop
+ 9201 3C920B-EMB Integrated Fast Ethernet Controller [Tornado]
+ 1043 80ab A7N8X Deluxe onboard 3C920B-EMB Integrated Fast Ethernet Controller
+ 9202 3Com 3C920B-EMB-WNM Integrated Fast Ethernet Controller
+ 9210 3C920B-EMB-WNM Integrated Fast Ethernet Controller
+ 9300 3CSOHO100B-TX 910-A01 [tulip]
+ 9800 3c980-TX Fast Etherlink XL Server Adapter [Cyclone]
+ 10b7 9800 3c980-TX Fast Etherlink XL Server Adapter
+ 9805 3c980-C 10/100baseTX NIC [Python-T]
+ 10b7 1201 EtherLink Server 10/100 Dual Port A
+ 10b7 1202 EtherLink Server 10/100 Dual Port B
+ 10b7 9805 3c980 10/100baseTX NIC [Python-T]
+ 10f1 2462 Thunder K7 S2462
+ 9900 3C990-TX [Typhoon]
+ 9902 3CR990-TX-95 [Typhoon 56-bit]
+ 9903 3CR990-TX-97 [Typhoon 168-bit]
+ 9904 3C990B-TX-M/3C990BSVR [Typhoon2]
+ 10b7 1000 3CR990B-TX-M [Typhoon2]
+ 10b7 2000 3CR990BSVR [Typhoon2 Server]
+ 9905 3CR990-FX-95/97/95 [Typhon Fiber]
+ 10b7 1101 3CR990-FX-95 [Typhoon Fiber 56-bit]
+ 10b7 1102 3CR990-FX-97 [Typhoon Fiber 168-bit]
+ 10b7 2101 3CR990-FX-95 Server [Typhoon Fiber 56-bit]
+ 10b7 2102 3CR990-FX-97 Server [Typhoon Fiber 168-bit]
+ 9908 3CR990SVR95 [Typhoon Server 56-bit]
+ 9909 3CR990SVR97 [Typhoon Server 168-bit]
+ 990a 3C990SVR [Typhoon Server]
+ 990b 3C990SVR [Typhoon Server]
+10b8 Standard Microsystems Corp [SMC]
+ 0005 83c170 EPIC/100 Fast Ethernet Adapter
+ 1055 e000 LANEPIC 10/100 [EVB171Q-PCI]
+ 1055 e002 LANEPIC 10/100 [EVB171G-PCI]
+ 10b8 a011 EtherPower II 10/100
+ 10b8 a014 EtherPower II 10/100
+ 10b8 a015 EtherPower II 10/100
+ 10b8 a016 EtherPower II 10/100
+ 10b8 a017 EtherPower II 10/100
+ 0006 83c175 EPIC/100 Fast Ethernet Adapter
+ 1055 e100 LANEPIC Cardbus Fast Ethernet Adapter
+ 1055 e102 LANEPIC Cardbus Fast Ethernet Adapter
+ 1055 e300 LANEPIC Cardbus Fast Ethernet Adapter
+ 1055 e302 LANEPIC Cardbus Fast Ethernet Adapter
+ 10b8 a012 LANEPIC Cardbus Fast Ethernet Adapter
+ 13a2 8002 LANEPIC Cardbus Fast Ethernet Adapter
+ 13a2 8006 LANEPIC Cardbus Fast Ethernet Adapter
+ 1000 FDC 37c665
+ 1001 FDC 37C922
+ a011 83C170QF
+ b106 SMC34C90
+10b9 ALi Corporation
+ 0101 CMI8338/C3DX PCI Audio Device
+ 0111 C-Media CMI8738/C3DX Audio Device (OEM)
+ 10b9 0111 C-Media CMI8738/C3DX Audio Device (OEM)
+ 0780 Multi-IO Card
+ 0782 Multi-IO Card
+ 1435 M1435
+ 1445 M1445
+ 1449 M1449
+ 1451 M1451
+ 1461 M1461
+ 1489 M1489
+ 1511 M1511 [Aladdin]
+ 1512 M1512 [Aladdin]
+ 1513 M1513 [Aladdin]
+ 1521 M1521 [Aladdin III]
+ 10b9 1521 ALI M1521 Aladdin III CPU Bridge
+ 1523 M1523
+ 10b9 1523 ALI M1523 ISA Bridge
+ 1531 M1531 [Aladdin IV]
+ 1533 M1533/M1535/M1543 PCI to ISA Bridge [Aladdin IV/V/V+]
+ 1014 053b ThinkPad R40e
+ 10b9 1533 ALi M1533 Aladdin IV/V ISA Bridge
+ 1541 M1541
+ 10b9 1541 ALI M1541 Aladdin V/V+ AGP System Controller
+ 1543 M1543
+ 1563 M1563 HyperTransport South Bridge
+ 10b9 1563 ASRock 939Dual-SATA2 Motherboard
+ 1849 1563 ASRock 939Dual-SATA2 Motherboard
+ 1573 PCI to LPC Controller
+ 1575 M1575 South Bridge
+ 1621 M1621
+ 1631 ALI M1631 PCI North Bridge Aladdin Pro III
+ 1632 M1632M Northbridge+Trident
+ 1641 ALI M1641 PCI North Bridge Aladdin Pro IV
+ 1644 M1644/M1644T Northbridge+Trident
+ 1646 M1646 Northbridge+Trident
+ 1647 M1647 Northbridge [MAGiK 1 / MobileMAGiK 1]
+ 1651 M1651/M1651T Northbridge [Aladdin-Pro 5/5M,Aladdin-Pro 5T/5TM]
+ 1671 M1671 Super P4 Northbridge [AGP4X,PCI and SDR/DDR]
+ 1672 M1672 Northbridge [CyberALADDiN-P4]
+ 1681 M1681 P4 Northbridge [AGP8X,HyperTransport and SDR/DDR]
+ 1687 M1687 K8 Northbridge [AGP8X and HyperTransport]
+ 1689 M1689 K8 Northbridge [Super K8 Single Chip]
+ 1695 M1695 K8 Northbridge [PCI Express and HyperTransport]
+ 1697 M1697 HTT Host Bridge
+ 3141 M3141
+ 3143 M3143
+ 3145 M3145
+ 3147 M3147
+ 3149 M3149
+ 3151 M3151
+ 3307 M3307
+ 3309 M3309
+ 3323 M3325 Video/Audio Decoder
+ 5212 M4803
+ 5215 MS4803
+ 5217 M5217H
+ 5219 M5219
+ 5225 M5225
+ 5228 M5228 ALi ATA/RAID Controller
+ 5229 M5229 IDE
+ 1014 050f ThinkPad R30
+ 1014 053d ThinkPad R40e
+ 103c 0024 Pavilion ze4400 builtin IDE
+ 103c 0025 XE4500 Notebook
+ 1043 8053 A7A266 Motherboard IDE
+ 1849 5229 ASRock 939Dual-SATA2 Motherboard IDE (PATA)
+ 5235 M5225
+ 5237 USB 1.1 Controller
+ 1014 0540 ThinkPad R40e
+ 103c 0024 Pavilion ze4400 builtin USB
+ 103c 0025 XE4500 Notebook
+ 104d 810f VAIO PCG-U1 USB/OHCI Revision 1.0
+ 10b9 5237 ASRock 939Dual-SATA2 Motherboard
+ 1849 5237 ASRock 939Dual-SATA2 Motherboard
+ 5239 USB 2.0 Controller
+ 10b9 5239 ASRock 939Dual-SATA2 Motherboard
+ 1849 5239 ASRock 939Dual-SATA2 Motherboard
+ 5243 M1541 PCI to AGP Controller
+ 5246 AGP8X Controller
+ 5247 PCI to AGP Controller
+ 5249 M5249 HTT to PCI Bridge
+ 524b PCI Express Root Port
+ 524c PCI Express Root Port
+ 524d PCI Express Root Port
+ 524e PCI Express Root Port
+ 5251 M5251 P1394 OHCI 1.0 Controller
+ 5253 M5253 P1394 OHCI 1.1 Controller
+ 5261 M5261 Ethernet Controller
+ 5263 ULi 1689,1573 integrated ethernet.
+ 5281 ALi M5281 Serial ATA / RAID Host Controller
+ 5287 ULi 5287 SATA
+ 5288 ULi M5288 SATA
+ 1043 8056 A8R-MVP Mainboard
+ 5289 ULi 5289 SATA
+ 5450 Lucent Technologies Soft Modem AMR
+ 5451 M5451 PCI AC-Link Controller Audio Device
+ 1014 0506 ThinkPad R30
+ 1014 053e ThinkPad R40e
+ 103c 0024 Pavilion ze4400 builtin Audio
+ 103c 0025 XE4500 Notebook
+ 5453 M5453 PCI AC-Link Controller Modem Device
+ 5455 M5455 PCI AC-Link Controller Audio Device
+ 10b9 5455 ASRock 939Dual-SATA2 Motherboard
+ 1849 0850 ASRock 939Dual-SATA2 Motherboard
+ 5457 M5457 AC'97 Modem Controller
+ 1014 0535 ThinkPad R40e
+ 103c 0024 Pavilion ze4400 builtin Modem Device
+ 103c 0025 XE4500 Notebook
+ 5459 SmartLink SmartPCI561 56K Modem
+ 545a SmartLink SmartPCI563 56K Modem
+ 5461 High Definition Audio/AC'97 Host Controller
+ 5471 M5471 Memory Stick Controller
+ 5473 M5473 SD-MMC Controller
+ 7101 M7101 Power Management Controller [PMU]
+ 1014 0510 ThinkPad R30
+ 1014 053c ThinkPad R40e
+ 103c 0024 Pavilion ze4400
+ 103c 0025 XE4500 Notebook
+ 1849 7101 ASRock 939Dual-SATA2 Motherboard
+10ba Mitsubishi Electric Corp.
+ 0301 AccelGraphics AccelECLIPSE
+ 0304 AccelGALAXY A2100 [OEM Evans & Sutherland]
+ 0308 Tornado 3000 [OEM Evans & Sutherland]
+ 10dd 0024 Tornado 3000
+ 1002 VG500 [VolumePro Volume Rendering Accelerator]
+10bb Dapha Electronics Corporation
+10bc Advanced Logic Research
+10bd Surecom Technology
+ 0e34 NE-34
+10be Tseng Labs International Co.
+10bf Most Inc
+10c0 Boca Research Inc.
+10c1 ICM Co., Ltd.
+10c2 Auspex Systems Inc.
+10c3 Samsung Semiconductors, Inc.
+ 1100 Smartether100 SC1100 LAN Adapter (i82557B)
+10c4 Award Software International Inc.
+10c5 Xerox Corporation
+10c6 Rambus Inc.
+10c7 Media Vision
+10c8 Neomagic Corporation
+ 0001 NM2070 [MagicGraph 128]
+ 0002 NM2090 [MagicGraph 128V]
+ 0003 NM2093 [MagicGraph 128ZV]
+ 0004 NM2160 [MagicGraph 128XD]
+ 1014 00ba MagicGraph 128XD
+ 1025 1007 MagicGraph 128XD
+ 1028 0074 MagicGraph 128XD
+ 1028 0075 MagicGraph 128XD
+ 1028 007d MagicGraph 128XD
+ 1028 007e MagicGraph 128XD
+ 1033 802f MagicGraph 128XD
+ 104d 801b MagicGraph 128XD
+ 104d 802f MagicGraph 128XD
+ 104d 830b MagicGraph 128XD
+ 10ba 0e00 MagicGraph 128XD
+ 10c8 0004 MagicGraph 128XD
+ 10cf 1029 MagicGraph 128XD
+ 10f7 8308 MagicGraph 128XD
+ 10f7 8309 MagicGraph 128XD
+ 10f7 830b MagicGraph 128XD
+ 10f7 830d MagicGraph 128XD
+ 10f7 8312 MagicGraph 128XD
+ 0005 NM2200 [MagicGraph 256AV]
+ 1014 00dd ThinkPad 570
+ 1028 0088 Latitude CPi A
+ 0006 NM2360 [MagicMedia 256ZX]
+ 1014 0152 ThinkPad 600X
+ 0016 NM2380 [MagicMedia 256XL+]
+ 10c8 0016 MagicMedia 256XL+
+ 0025 NM2230 [MagicGraph 256AV+]
+ 0083 NM2093 [MagicGraph 128ZV+]
+ 8005 NM2200 [MagicMedia 256AV Audio]
+ 0e11 b0d1 MagicMedia 256AV Audio Device on Discovery
+ 0e11 b126 MagicMedia 256AV Audio Device on Durango
+ 1014 00dd ThinkPad 390/i1720/i1721
+ 1025 1003 MagicMedia 256AV Audio Device on TravelMate 720
+ 1028 0088 Latitude CPi A
+ 1028 008f MagicMedia 256AV Audio Device on Colorado Inspiron
+ 103c 0007 MagicMedia 256AV Audio Device on Voyager II
+ 103c 0008 MagicMedia 256AV Audio Device on Voyager III
+ 103c 000d MagicMedia 256AV Audio Device on Omnibook 900
+ 10c8 8005 MagicMedia 256AV Audio Device on FireAnt
+ 110a 8005 MagicMedia 256AV Audio Device
+ 14c0 0004 MagicMedia 256AV Audio Device
+ 8006 NM2360 [MagicMedia 256ZX Audio]
+ 8016 NM2380 [MagicMedia 256XL+ Audio]
+10c9 Dataexpert Corporation
+10ca Fujitsu Microelectr., Inc.
+10cb Omron Corporation
+# nee Mentor ARC Inc
+10cc Mai Logic Incorporated
+ 0660 Articia S Host Bridge
+ 0661 Articia S PCI Bridge
+10cd Advanced System Products, Inc
+ 1100 ASC1100
+ 1200 ASC1200 [(abp940) Fast SCSI-II]
+ 1300 ABP940-U / ABP960-U
+ 10cd 1310 ASC1300 SCSI Adapter
+ 1195 1320 Ultra-SCSI CardBus PC Card REX CB31
+ 2300 ABP940-UW
+ 2500 ABP940-U2W
+ 2700 ABP3950-U3W
+10ce Radius
+# nee Citicorp TTI
+10cf Fujitsu Limited.
+ 01ef PCEA4 PCI-Express Dual Port ESCON Adapter
+ 1414 On-board USB 1.1 companion controller
+ 1415 On-board USB 2.0 EHCI controller
+ 1422 E8410 nVidia graphics adapter
+ 142d HD audio (Realtek ALC262)
+ 1430 82566MM Intel 1Gb copper LAN interface
+ 1623 PCEA4 PCI-Express Dual Port ESCON Adapter
+ 2001 mb86605
+ 200c MB86613L IEEE1394 OHCI 1.0 Controller
+ 2019 MB86295S [CORAL P]
+ 201e MB86296S [CORAL PA]
+ 202b MB86297A [Carmine Graphics Controller]
+10d1 FuturePlus Systems Corp.
+10d2 Molex Incorporated
+10d3 Jabil Circuit Inc
+10d4 Hualon Microelectronics
+10d5 Autologic Inc.
+10d6 Cetia
+10d7 BCM Advanced Research
+10d8 Advanced Peripherals Labs
+10d9 Macronix, Inc. [MXIC]
+ 0431 MX98715
+ 0512 MX98713
+ 0531 MX987x5
+ 1186 1200 DFE-540TX ProFAST 10/100 Adapter
+ 8625 MX86250
+ 8626 Macronix MX86251 + 3Dfx Voodoo Rush
+ 8888 MX86200
+10da Compaq IPG-Austin
+ 0508 TC4048 Token Ring 4/16
+ 3390 Tl3c3x9
+10db Rohm LSI Systems, Inc.
+10dc CERN/ECP/EDU
+ 0001 STAR/RD24 SCI-PCI (PMC)
+ 0002 TAR/RD24 SCI-PCI (PMC)
+ 0021 HIPPI destination
+ 0022 HIPPI source
+ 10dc ATT2C15-3 FPGA
+10dd Evans & Sutherland
+ 0100 Lightning 1200
+ 10dd 0023 Lightning 1200 15+16M
+10de nVidia Corporation
+ 0008 NV1 [EDGE 3D]
+ 0009 NV1 [EDGE 3D]
+ 0010 NV2 [Mutara V08]
+ 0020 NV4 [RIVA TNT]
+ 1043 0200 V3400 TNT
+ 1048 0c18 Erazor II SGRAM
+ 1048 0c19 Erazor II
+ 1048 0c1b Erazor II
+ 1048 0c1c Erazor II
+ 1092 0550 Viper V550
+ 1092 0552 Viper V550
+ 1092 4804 Viper V550
+ 1092 4808 Viper V550
+ 1092 4810 Viper V550
+ 1092 4812 Viper V550
+ 1092 4815 Viper V550
+ 1092 4820 Viper V550 with TV out
+ 1092 4822 Viper V550
+ 1092 4904 Viper V550
+ 1092 4914 Viper V550
+ 1092 8225 Viper V550
+ 10b4 273d Velocity 4400
+ 10b4 273e Velocity 4400
+ 10b4 2740 Velocity 4400
+ 10de 0020 Riva TNT
+ 1102 1015 Graphics Blaster CT6710
+ 1102 1016 Graphics Blaster RIVA TNT
+ 0028 NV5 [RIVA TNT2/TNT2 Pro]
+ 1043 0200 AGP-V3800 SGRAM
+ 1043 0201 AGP-V3800 SDRAM
+ 1043 0205 PCI-V3800
+ 1043 4000 AGP-V3800PRO
+ 1048 0c21 Synergy II
+ 1048 0c28 Erazor III
+ 1048 0c29 Erazor III
+ 1048 0c2a Erazor III
+ 1048 0c2b Erazor III
+ 1048 0c31 Erazor III Pro
+ 1048 0c32 Erazor III Pro
+ 1048 0c33 Erazor III Pro
+ 1048 0c34 Erazor III Pro
+ 107d 2134 WinFast 3D S320 II + TV-Out
+ 1092 4804 Viper V770
+ 1092 4a00 Viper V770
+ 1092 4a02 Viper V770 Ultra
+ 1092 5a00 RIVA TNT2/TNT2 Pro
+ 1092 6a02 Viper V770 Ultra
+ 1092 7a02 Viper V770 Ultra
+ 10de 0005 RIVA TNT2 Pro
+ 10de 000f Compaq NVIDIA TNT2 Pro
+ 1102 1020 3D Blaster RIVA TNT2
+ 1102 1026 3D Blaster RIVA TNT2 Digital
+ 14af 5810 Maxi Gamer Xentor
+ 0029 NV5 [RIVA TNT2 Ultra]
+ 1043 0200 AGP-V3800 Deluxe
+ 1043 0201 AGP-V3800 Ultra SDRAM
+ 1043 0205 PCI-V3800 Ultra
+ 1048 0c2e Erazor III Ultra
+ 1048 0c2f Erazor III Ultra
+ 1048 0c30 Erazor III Ultra
+ 1102 1021 3D Blaster RIVA TNT2 Ultra
+ 1102 1029 3D Blaster RIVA TNT2 Ultra
+ 1102 102f 3D Blaster RIVA TNT2 Ultra
+ 14af 5820 Maxi Gamer Xentor 32
+ 002a NV5 [Riva TNT2]
+ 002b NV5 [Riva TNT2]
+ 002c NV6 [Vanta/Vanta LT]
+ 1043 0200 AGP-V3800 Combat SDRAM
+ 1043 0201 AGP-V3800 Combat
+ 1048 0c20 TNT2 Vanta
+ 1048 0c21 TNT2 Vanta
+ 1092 6820 Viper V730
+ 1102 1031 CT6938 VANTA 8MB
+ 1102 1034 CT6894 VANTA 16MB
+ 14af 5008 Maxi Gamer Phoenix 2
+ 002d NV5M64 [RIVA TNT2 Model 64/Model 64 Pro]
+ 1043 0200 AGP-V3800M
+ 1043 0201 AGP-V3800M
+ 1048 0c3a Erazor III LT
+ 1048 0c3b Erazor III LT
+ 10de 0006 RIVA TNT2 Model 64/Model 64 Pro
+ 10de 001e M64 AGP4x
+ 1102 1023 CT6892 RIVA TNT2 Value
+ 1102 1024 CT6932 RIVA TNT2 Value 32Mb
+ 1102 102c CT6931 RIVA TNT2 Value [Jumper]
+ 1462 8808 MSI-8808
+ 1554 1041 Pixelview RIVA TNT2 M64
+ 1569 002d Palit Microsystems Daytona TNT2 M64
+ 002e NV6 [Vanta]
+ 002f NV6 [Vanta]
+ 0034 MCP04 SMBus
+ 0035 MCP04 IDE
+ 0036 MCP04 Serial ATA Controller
+ 0037 MCP04 Ethernet Controller
+ 0038 MCP04 Ethernet Controller
+ 003a MCP04 AC'97 Audio Controller
+ 003b MCP04 USB Controller
+ 003c MCP04 USB Controller
+ 003d MCP04 PCI Bridge
+ 003e MCP04 Serial ATA Controller
+ 0040 NV40 [GeForce 6800 Ultra]
+ 0041 NV40 [GeForce 6800]
+ 1043 817b V9999 Gamer Edition
+ 0042 NV40.2 [GeForce 6800 LE]
+ 0043 NV40.3 [GeForce 6800 XE]
+ 0044 NV40 [GeForce 6800 XT]
+ 0045 NV40 [GeForce 6800 GT]
+ 0046 NV45 [GeForce 6800 GT]
+ 0047 NV40 [GeForce 6800 GS]
+ 1682 2109 GeForce 6800 GS
+ 0048 NV40 [GeForce 6800 XT]
+ 0049 NV40GL
+ 004d NV40GL [Quadro FX 4000]
+ 004e NV40GL [Quadro FX 4000]
+ 0050 CK804 ISA Bridge
+ 1043 815a K8N4-E or A8N-E Mainboard
+ 10f1 2865 Tomcat K8E (S2865)
+ 1458 0c11 GA-K8N Ultra-9 Mainboard
+ 1462 7100 MSI K8N Diamond
+ 147b 1c1a KN8-Ultra Mainboard
+ 1565 3402 NF4 AM2L Mainboard
+ 0051 CK804 ISA Bridge
+ 1028 0225 PowerEdge T105 ISA Bridge
+ 0052 CK804 SMBus
+ 1028 0225 PowerEdge T105 SMBus
+ 1043 815a K8N4-E or A8N-E Mainboard
+ 10f1 2865 Tomcat K8E (S2865)
+ 1458 0c11 GA-K8N Ultra-9 Mainboard
+ 1462 7100 MSI K8N Diamond
+ 147b 1c1a KN8-Ultra Mainboard
+ 1565 3402 NF4 AM2L Mainboard
+ 0053 CK804 IDE
+ 1043 815a K8N4-E or A8N-E Mainboard
+ 10f1 2865 Tomcat K8E (S2865)
+ 1458 5002 GA-K8N Ultra-9 Mainboard
+ 1462 7100 MSI K8N Diamond
+ 147b 1c1a KN8-Ultra Mainboard
+ 1565 3402 NF4 AM2L Mainboard
+ 0054 CK804 Serial ATA Controller
+ 1028 0225 PowerEdge T105 Serial ATA
+ 1043 815a A8N-E Mainboard
+ 10f1 2865 Tomcat K8E (S2865)
+ 1458 b003 GA-K8N Ultra-9 Mainboard
+ 1462 7100 MSI K8N Diamond
+ 147b 1c1a KN8-Ultra Mainboard
+ 1565 5401 NF4 AM2L Mainboard
+ 0055 CK804 Serial ATA Controller
+ 1028 0225 PowerEdge T105 Serial ATA
+ 1043 815a K8N4-E or A8N-E Mainboard
+ 10f1 2865 Tomcat K8E (S2865)
+ 1458 b003 GA-K8N Ultra-9 Mainboard
+ 147b 1c1a KN8-Ultra Mainboard
+ 1565 5401 NF4 AM2L Mainboard
+ 0056 CK804 Ethernet Controller
+ 0057 CK804 Ethernet Controller
+ 1043 8141 K8N4-E or A8N-E Mainboard
+ 10de cb84 NF4 Lanparty
+ 10f1 2865 Tomcat K8E (S2865)
+ 1458 e000 GA-K8N Ultra-9 Mainboard
+ 1462 7100 MSI K8N Diamond
+ 147b 1c1a KN8-Ultra Mainboard
+ 1565 2501 NF4 AM2L Mainboard
+ 0058 CK804 AC'97 Modem
+ 0059 CK804 AC'97 Audio Controller
+ 1043 812a K8N4-E or A8N-E Mainboard
+ 10f1 2865 Tomcat K8E (S2865)
+ 147b 1c1a KN8-Ultra Mainboard
+ 1565 8211 NF4 AM2L Mainboard
+ 005a CK804 USB Controller
+ 1028 0225 PowerEdge T105 onboard USB
+ 1043 815a K8N4-E or A8N-E Mainboard
+ 10f1 2865 Tomcat K8E (S2865)
+ 1458 5004 GA-K8N Ultra-9 Mainboard
+ 1462 7100 MSI K8N Diamond
+ 147b 1c1a KN8-Ultra Mainboard
+ 1565 3402 NF4 AM2L Mainboard
+ 005b CK804 USB Controller
+ 1028 0225 PowerEdge T105 onboard USB
+ 1043 815a K8N4-E or A8N-E Mainboard
+ 10f1 2865 Tomcat K8E (S2865)
+ 1458 5004 GA-K8N Ultra-9 Mainboard
+ 1462 7100 MSI K8N Diamond
+ 147b 1c1a KN8-Ultra Mainboard
+ 1565 3402 NF4 AM2L Mainboard
+ 005c CK804 PCI Bridge
+ 005d CK804 PCIE Bridge
+ 005e CK804 Memory Controller
+ 1028 0225 PowerEdge T105 Memory Controller
+ 1043 815a A8N-E Mainboard
+ 10de 005e ECS Elitegroup NFORCE3-A939 motherboard.
+ 10f1 2865 Tomcat K8E (S2865)
+ 10f1 2891 Thunder K8SRE Mainboard
+ 1458 5000 GA-K8N Ultra-9 Mainboard
+ 1462 7100 MSI K8N Diamond
+ 147b 1c1a KN8-Ultra Mainboard
+ 1565 3402 NF4 AM2L Mainboard
+ 005f CK804 Memory Controller
+ 0060 nForce2 ISA Bridge
+ 1043 80ad A7N8X Mainboard
+ 147b 1c02 NF7-S/NF7 (nVidia-nForce2) 2.X
+ a0a0 03ba UK79G-1394 motherboard
+ 0064 nForce2 SMBus (MCP)
+ 147b 1c02 NF7-S/NF7 (nVidia-nForce2) 2.X
+ a0a0 03bb UK79G-1394 motherboard
+ 0065 nForce2 IDE
+ 10de 0c11 nForce 2 EIDE Controller
+ a0a0 03b2 UK79G-1394 motherboard
+ 0066 nForce2 Ethernet Controller
+ 1043 80a7 A7N8X Mainboard onboard nForce2 Ethernet
+ 10de 0c11 nForce MCP-T Networking Adapter
+ a0a0 03b3 UK79G-1394 motherboard
+ 0067 nForce2 USB Controller
+ 1043 0c11 A7N8X Mainboard
+ a0a0 03b4 UK79G-1394 motherboard
+ 0068 nForce2 USB Controller
+ 1043 0c11 A7N8X Mainboard
+ a0a0 03b4 UK79G-1394 motherboard
+ 006a nForce2 AC97 Audio Controler (MCP)
+ 1043 8095 nForce2 AC97 Audio Controler (MCP)
+ a0a0 0304 UK79G-1394 motherboard
+ 006b nForce Audio Processing Unit
+ 10de 006b nForce2 MCP Audio Processing Unit
+ a0a0 0304 UK79G-1394 motherboard
+ 006c nForce2 External PCI Bridge
+ 006d nForce2 PCI Bridge
+ 006e nForce2 FireWire (IEEE 1394) Controller
+ a0a0 0306 UK79G-1394 motherboard
+ 0080 MCP2A ISA bridge
+ 147b 1c09 NV7 Motherboard
+ 0084 MCP2A SMBus
+ 147b 1c09 NV7 Motherboard
+ 0085 MCP2A IDE
+ 147b 1c09 NV7 Motherboard
+ 0086 MCP2A Ethernet Controller
+ 0087 MCP2A USB Controller
+ 147b 1c09 NV7 Motherboard
+ 0088 MCP2A USB Controller
+ 147b 1c09 NV7 Motherboard
+ 008a MCP2S AC'97 Audio Controller
+ 147b 1c09 NV7 Motherboard
+ 008b MCP2A PCI Bridge
+ 008c MCP2A Ethernet Controller
+ 008e nForce2 Serial ATA Controller
+ 0090 G70 [GeForce 7800 GTX]
+ 0091 G70 [GeForce 7800 GTX]
+ 0092 G70 [GeForce 7800 GT]
+ 0093 G70 [GeForce 7800 GS]
+ 0095 G70 [GeForce 7800 SLI]
+ 0098 G70 [GeForce Go 7800]
+ 0099 G70 [GeForce Go 7800 GTX]
+ 009d G70GL [Quadro FX 4500]
+ 00a0 NV5 [Aladdin TNT2]
+ 14af 5810 Maxi Gamer Xentor
+ 00c0 NV41 [GeForce 6800 GS]
+ 00c1 NV41.1 [GeForce 6800]
+ 00c2 NV41.2 [GeForce 6800 LE]
+ 00c3 NV42 [GeForce 6800 XT]
+ 00c8 NV41.8 [GeForce Go 6800]
+ 00c9 NV41.9 [GeForce Go 6800 Ultra]
+ 00cc NV41 [Quadro FX Go1400]
+ 00cd NV41 [Quadro FX 3450/4000 SDI]
+ 10de 029b wx4300 Workstation
+ 00ce NV41GL [Quadro FX 1400]
+ 00d0 nForce3 LPC Bridge
+ 00d1 nForce3 Host Bridge
+ 00d2 nForce3 AGP Bridge
+ 00d3 CK804 Memory Controller
+ 00d4 nForce3 SMBus
+ 00d5 nForce3 IDE
+ 00d6 nForce3 Ethernet
+ 00d7 nForce3 USB 1.1
+ 00d8 nForce3 USB 2.0
+ 00d9 nForce3 Audio
+ 00da nForce3 Audio
+ 00dd nForce3 PCI Bridge
+ 00df CK8S Ethernet Controller
+ 1043 80a7 K8N-E
+ 105b 0c43 Winfast NF3250K8AA
+ 147b 1c0b NF8 Mainboard
+ 00e0 nForce3 250Gb LPC Bridge
+ 1043 813f K8N-E
+ 10de 0c11 Winfast NF3250K8AA
+ 1462 7030 K8N Neo-FSR v2.0
+ 147b 1c0b NF8 Mainboard
+ 1849 00e0 Motherboard (one of many)
+ 00e1 nForce3 250Gb Host Bridge
+ 1043 813f K8N-E
+ 1462 7030 K8N Neo-FSR v2.0
+ 147b 1c0b NF8 Mainboard
+ 1849 00e1 Motherboard (one of many)
+ 00e2 nForce3 250Gb AGP Host to PCI Bridge
+ 00e3 nForce3 Serial ATA Controller
+ 1043 813f K8N-E
+ 105b 0c43 Winfast NF3250K8AA
+ 147b 1c0b NF8 Mainboard
+ 1849 00e3 Motherboard (one of many)
+ 00e4 nForce 250Gb PCI System Management
+ 1043 813f K8N-E
+ 105b 0c43 Winfast NF3250K8AA
+ 1462 7030 K8N Neo-FSR v2.0
+ 147b 1c0b NF8 Mainboard
+ 1849 00e4 Motherboard (one of many)
+ 00e5 CK8S Parallel ATA Controller (v2.5)
+ 1043 813f K8N-E
+ 105b 0c43 Winfast NF3250K8AA
+ 1462 7030 K8N Neo-FSR v2.0
+ 147b 1c0b NF8 Mainboard
+ 1849 00e5 Motherboard (one of many)
+ f849 00e5 Motherboard (one of many)
+ 00e6 CK8S Ethernet Controller
+ 00e7 CK8S USB Controller
+ 1043 813f K8N-E
+ 105b 0c43 Winfast NF3250K8AA
+ 1462 7030 K8N Neo-FSR v2.0
+ 147b 1c0b NF8 Mainboard
+ 1849 00e7 Motherboard (one of many)
+ 00e8 nForce3 EHCI USB 2.0 Controller
+ 1043 813f K8N-E
+ 105b 0c43 Winfast NF3250K8AA
+ 1462 7030 K8N Neo-FSR v2.0
+ 147b 1c0b NF8 Mainboard
+ 1849 00e8 Motherboard (one of many)
+ 00ea nForce3 250Gb AC'97 Audio Controller
+ 1043 819d K8N-E
+ 105b 0c43 Winfast NF3250K8AA
+ 1462 b010 K8N Neo-FSR v2.0
+ 147b 1c0b NF8 Mainboard
+ 00ed nForce3 250Gb PCI-to-PCI Bridge
+ 00ee nForce3 Serial ATA Controller 2
+ 00f0 NV40 [GeForce 6800 Ultra]
+ 00f1 NV43 [GeForce 6600 GT]
+ 1043 81a6 N6600GT TD 128M AGP
+ 1043 81c6 N6600GT TD 128M AGP
+ 1458 3150 GV-N66T128VP
+ 1554 1191 PixelView PV-N43UA (128KD)
+ 1682 2119 GeForce 6600 GT AGP 128MB DDR3 DUAL DVI TV
+ 00f2 NV43 [GeForce 6600]
+ 1554 1194 PixelView PV-N43AT (256KD)
+ 1682 211c GeForce 6600 256MB DDR DUAL DVI TV
+ 00f3 NV43 [GeForce 6200]
+ 00f4 NV43 [GeForce 6600 LE]
+ 00f5 G70 [GeForce 7800 GS]
+ 00f6 NV43 [GeForce 6800 GS]
+ 1682 217e XFX GeForce 6800 XTreme 256MB DDR3 AGP
+ 00f8 NV45GL [Quadro FX 3400/4400]
+ 00f9 NV45 [GeForce 6800 GTO]
+ 10de 00f9 NV40 [GeForce 6800 GT]
+ 1682 2120 GEFORCE 6800 GT PCI-E
+ 00fa NV36 [GeForce PCX 5750]
+ 00fb NV35 [GeForce PCX 5900]
+ 00fc NV37GL [Quadro FX 330/GeForce PCX 5300]
+ 00fd NV37GL [Quadro PCI-E Series]
+ 00fe NV38GL [Quadro FX 1300]
+ 00ff NV18 [GeForce PCX 4300]
+ 0100 NV10 [GeForce 256 SDR]
+ 1043 0200 AGP-V6600 SGRAM
+ 1043 0201 AGP-V6600 SDRAM
+ 1043 4008 AGP-V6600 SGRAM
+ 1043 4009 AGP-V6600 SDRAM
+ 1048 0c41 Erazor X
+ 1048 0c43 ERAZOR X PCI
+ 1048 0c48 Synergy Force
+ 1102 102d CT6941 GeForce 256
+ 14af 5022 3D Prophet SE
+ 0101 NV10DDR [GeForce 256 DDR]
+ 1043 0202 AGP-V6800 DDR
+ 1043 400a AGP-V6800 DDR SGRAM
+ 1043 400b AGP-V6800 DDR SDRAM
+ 1048 0c42 Erazor X
+ 107d 2822 WinFast GeForce 256
+ 1102 102e CT6971 GeForce 256 DDR
+ 14af 5021 3D Prophet DDR-DVI
+ 0103 NV10GL [Quadro]
+ 1048 0c40 GLoria II-64
+ 1048 0c44 GLoria II
+ 1048 0c45 GLoria II
+ 1048 0c4a GLoria II-64 Pro
+ 1048 0c4b GLoria II-64 Pro DVII
+ 0110 NV11 [GeForce2 MX/MX 400]
+ 1043 4015 AGP-V7100 Pro
+ 1043 4021 V7100 Deluxe Combo
+ 1043 4031 V7100 Pro with TV output
+ 1048 0c60 Gladiac MX
+ 1048 0c61 Gladiac 511PCI
+ 1048 0c63 Gladiac 511TV-OUT 32MB
+ 1048 0c64 Gladiac 511TV-OUT 64MB
+ 1048 0c65 Gladiac 511TWIN
+ 1048 0c66 Gladiac 311
+ 10de 0091 Dell OEM GeForce 2 MX 400
+ 10de 00a1 Apple OEM GeForce2 MX
+ 1462 8817 MSI GeForce2 MX400 Pro32S [MS-8817]
+ 14af 7102 3D Prophet II MX
+ 14af 7103 3D Prophet II MX Dual-Display
+ 1545 0023 Xtasy Rev. B2
+ 0111 NV11DDR [GeForce2 MX200]
+ 0112 NV11 [GeForce2 Go]
+ 0113 NV11GL [Quadro2 MXR/EX/Go]
+ 0140 NV43 [GeForce 6600 GT]
+ 0141 NV43 [GeForce 6600]
+ 1043 81b0 EN6600 Silencer
+ 1458 3124 GV-NX66128DP Turbo Force Edition
+ 0142 NV43 [GeForce 6600 LE]
+ 0143 NV43 [GeForce 6600 VE]
+ 0144 NV43 [GeForce Go 6600]
+ 0145 NV43 [GeForce 6610 XL]
+ 0146 NV43 [Geforce Go 6600TE/6200TE]
+ 0147 NV43 [GeForce 6700 XL]
+ 0148 NV43 [GeForce Go 6600]
+ 0149 NV43 [GeForce Go 6600 GT]
+ 014a NV43 [Quadro NVS 440]
+ 014c NV43 [Quadro FX 540 MXM]
+ 014d NV43GL [Quadro FX 550]
+ 014e NV43GL [Quadro FX 540]
+ 014f NV43 [GeForce 6200]
+ 0150 NV15 [GeForce2 GTS/Pro]
+ 1043 4016 V7700 AGP Video Card
+ 1048 0c50 Gladiac
+ 1048 0c52 Gladiac-64
+ 107d 2840 WinFast GeForce2 GTS with TV output
+ 107d 2842 WinFast GeForce 2 Pro
+ 10de 002e GeForce2 GTS
+ 1462 8831 Creative GeForce2 Pro
+ 0151 NV15DDR [GeForce2 Ti]
+ 1043 405f V7700Ti
+ 1462 5506 Creative 3D Blaster Geforce2 Titanium
+ 0152 NV15BR [GeForce2 Ultra, Bladerunner]
+ 1048 0c56 GLADIAC Ultra
+ 0153 NV15GL [Quadro2 Pro]
+ 0160 NV44 [GeForce 6500]
+ 0161 NV44 [GeForce 6200 TurboCache(TM)]
+ 0162 NV44 [GeForce 6200SE TurboCache (TM)]
+ 0163 NV44 [GeForce 6200 LE]
+ 0164 NV44 [GeForce Go 6200]
+ 0165 NV44 [Quadro NVS 285]
+ 0166 NV44 [GeForce Go 6400]
+ 0167 NV44 [GeForce Go 6200]
+ 0168 NV44 [GeForce Go 6400]
+ 0169 NV44 [GeForce 6250]
+ 016a NV44 [GeForce 7100 GS]
+ 0170 NV17 [GeForce4 MX 460]
+ 0171 NV17 [GeForce4 MX 440]
+ 10b0 0002 Gainward Pro/600 TV
+ 10de 0008 Apple OEM GeForce4 MX 440
+ 1462 8661 G4MX440-VTP
+ 1462 8730 MX440SES-T (MS-8873)
+ 1462 8852 GeForce4 MX440 PCI
+ 147b 8f00 Abit Siluro GeForce4MX440
+ 0172 NV17 [GeForce4 MX 420]
+ 0173 NV17 [GeForce4 MX 440-SE]
+ 0174 NV17 [GeForce4 440 Go]
+ 0175 NV17 [GeForce4 420 Go]
+ 0176 NV17 [GeForce4 420 Go 32M]
+ 103c 08b0 tc1100 tablet
+ 144d c005 X10 Laptop
+ 4c53 1090 Cx9 / Vx9 mainboard
+ 0177 NV17 [GeForce4 460 Go]
+ 0178 NV17GL [Quadro4 550 XGL]
+ 0179 NV17 [GeForce4 440 Go 64M]
+ 10de 0179 GeForce4 MX (Mac)
+ 017a NV17GL [Quadro NVS]
+ 017b NV17GL [Quadro4 550 XGL]
+ 017c NV17GL [Quadro4 500 GoGL]
+ 017d NV17 [GeForce4 410 Go 16M]
+ 0181 NV18 [GeForce4 MX 440 AGP 8x]
+ 1043 8063 GeForce4 MX 440 AGP 8X
+ 1043 806f V9180 Magic
+ 1462 8880 MS-StarForce GeForce4 MX 440 with AGP8X
+ 1462 8900 MS-8890 GeForce 4 MX440 AGP8X
+ 1462 9350 MSI Geforce4 MX T8X with AGP8X
+ 147b 8f0d Siluro GF4 MX-8X
+ 1554 1111 PixelView MVGA-NVG18A
+ 0182 NV18 [GeForce4 MX 440SE AGP 8x]
+ 0183 NV18 [GeForce4 MX 420 AGP 8x]
+ 0184 NV18 [GeForce4 MX]
+ 0185 NV18 [GeForce4 MX 4000]
+ 0186 NV18M [GeForce4 448 Go]
+ 0187 NV18M [GeForce4 488 Go]
+ 0188 NV18GL [Quadro4 580 XGL]
+ 0189 NV18 [GeForce4 MX with AGP8X (Mac)]
+ 018a NV18GL [Quadro NVS 280 SD]
+ 018b NV18GL [Quadro4 380 XGL]
+ 018c NV18GL [Quadro NVS 50 PCI]
+ 018d NV18M [GeForce4 448 Go]
+ 0191 G80 [GeForce 8800 GTX]
+ 0193 G80 [GeForce 8800 GTS]
+ 107d 20bd WinFast PX 8800 GTS TDH
+ 0194 G80 [GeForce 8800 Ultra]
+# Found in GPU server Tesla D870 and S870
+ 0197 G80 [Tesla C870]
+ 019d G80 [Quadro FX 5600]
+ 019e G80 [Quadro FX 4600]
+ 01a0 NVCrush11 [GeForce2 MX Integrated Graphics]
+ 01a4 nForce CPU bridge
+ 01ab nForce 420 Memory Controller (DDR)
+ 01ac nForce 220/420 Memory Controller
+ 01ad nForce 220/420 Memory Controller
+ 01b0 nForce Audio Processing Unit
+ 01b1 nForce AC'97 Audio Controller
+ 01b2 nForce ISA Bridge
+ 01b4 nForce PCI System Management
+ 01b7 nForce AGP to PCI Bridge
+ 01b8 nForce PCI-to-PCI bridge
+ 01bc nForce IDE
+ 01c1 nForce AC'97 Modem Controller
+ 01c2 nForce USB Controller
+ 01c3 nForce Ethernet Controller
+ 01d0 G72 [GeForce 7350 LE]
+ 01d1 G72 [GeForce 7300 LE]
+ 1462 0345 7300LE PCI Express Graphics Adapter
+ 01d2 G72 [GeForce 7550 LE]
+ 01d3 G72 [GeForce 7300 SE/7200 GS]
+ 01d6 G72M [GeForce Go 7200]
+ 01d7 G72M [Quadro NVS 110M/GeForce Go 7300]
+ 01d8 G72M [GeForce Go 7400]
+ 1028 01d7 XPS M1210
+ 01d9 G72M [GeForce Go 7450]
+ 01da G72M [Quadro NVS 110M]
+ 01db G72M [Quadro NVS 120M]
+ 01dc G72GL [Quadro FX 350M]
+ 01dd G72 [GeForce 7500 LE]
+ 01de G72GL [Quadro FX 350]
+ 10de 01dc Quadro FX Go350M
+ 01df G71 [GeForce 7300 GS]
+ 01e0 nForce2 IGP2
+ 147b 1c09 NV7 Motherboard
+ 01e8 nForce2 AGP
+ 01ea nForce2 Memory Controller 0
+ a0a0 03b9 UK79G-1394 motherboard
+ 01eb nForce2 Memory Controller 1
+ a0a0 03b9 UK79G-1394 motherboard
+ 01ec nForce2 Memory Controller 2
+ a0a0 03b9 UK79G-1394 motherboard
+ 01ed nForce2 Memory Controller 3
+ a0a0 03b9 UK79G-1394 motherboard
+ 01ee nForce2 Memory Controller 4
+ 10de 01ee MSI Delta-L nForce2 memory controller
+ a0a0 03b9 UK79G-1394 motherboard
+ 01ef nForce2 Memory Controller 5
+ a0a0 03b9 UK79G-1394 motherboard
+ 01f0 NV18 [GeForce4 MX - nForce GPU]
+ a0a0 03b5 UK79G-1394 motherboard
+ 0200 NV20 [GeForce3]
+ 1043 402f AGP-V8200 DDR
+ 1048 0c70 GLADIAC 920
+ 0201 NV20 [GeForce3 Ti 200]
+ 0202 NV20 [GeForce3 Ti 500]
+ 1043 405b V8200 T5
+ 1545 002f Xtasy 6964
+ 0203 NV20DCC [Quadro DCC]
+ 0211 NV48 [GeForce 6800]
+ 0212 NV48 [GeForce 6800 LE]
+ 0215 NV48 [GeForce 6800 GT]
+ 0218 NV48 [GeForce 6800 XT]
+ 0221 NV44A [GeForce 6200]
+ 3842 a341 256A8N341DX
+ 0222 NV44 [GeForce 6200 A-LE]
+ 0240 C51PV [GeForce 6150]
+ 1043 81cd A8N-VM CSM
+ 1462 7207 K8NGM2 series
+ 0241 C51 [GeForce 6150 LE]
+ 0242 C51G [GeForce 6100]
+ 105b 0cad Winfast 6100K8MB
+ 0243 C51 PCI Express Bridge
+ 0244 C51 [Geforce Go 6150]
+ 103c 30b5 Presario V3242AU
+ 103c 30b7 Presario V6133CL
+ 10de 0244 GeForce Go 6150
+ 0245 C51 [Quadro NVS 210S/GeForce 6150LE]
+ 0246 C51 PCI Express Bridge
+ 0247 C51 [GeForce Go 6100]
+ 1043 1382 MCP51 PCI-X GeForce Go 6100
+ 0248 C51 PCI Express Bridge
+ 0249 C51 PCI Express Bridge
+ 024a C51 PCI Express Bridge
+ 024b C51 PCI Express Bridge
+ 024c C51 PCI Express Bridge
+ 024d C51 PCI Express Bridge
+ 024e C51 PCI Express Bridge
+ 024f C51 PCI Express Bridge
+ 0250 NV25 [GeForce4 Ti 4600]
+ 0251 NV25 [GeForce4 Ti 4400]
+ 1043 8023 v8440 GeForce 4 Ti4400
+ 10de 0251 PNY GeForce4 Ti 4400
+ 1462 8710 PNY GeForce4 Ti 4400
+ 0252 NV25 [GeForce4 Ti]
+ 0253 NV25 [GeForce4 Ti 4200]
+ 107d 2896 WinFast A250 LE TD (Dual VGA/TV-out/DVI)
+ 147b 8f09 Siluro (Dual VGA/TV-out/DVI)
+ 0258 NV25GL [Quadro4 900 XGL]
+ 0259 NV25GL [Quadro4 750 XGL]
+ 025b NV25GL [Quadro4 700 XGL]
+ 0260 MCP51 LPC Bridge
+ 103c 30b7 Presario V6133CL
+ 1043 81bc A8N-VM CSM Mainboard
+ 1458 5001 GA-M55plus-S3G
+ 1462 7207 K8NGM2 series
+ 0261 MCP51 LPC Bridge
+ 105b 0cad Winfast 6100K8MB
+ 0262 MCP51 LPC Bridge
+ 0263 MCP51 LPC Bridge
+ 0264 MCP51 SMBus
+ 103c 30b7 Presario V6133CL
+ 1043 81bc A8N-VM CSM Mainboard
+ 105b 0cad Winfast 6100K8MB
+ 1462 7207 K8NGM2 series
+ 0265 MCP51 IDE
+ 103c 30b7 Presario V6133CL
+ 1043 81bc A8N-VM CSM Mainboard
+ 1462 7207 K8NGM2 series
+# Foxconn has used a wrong vendor ID for this one
+ f05b 0cad Winfast 6100K8MB
+ 0266 MCP51 Serial ATA Controller
+ 103c 30b7 Presario V6133CL
+ 1043 81bc A8N-VM CSM Mainboard
+ 1462 7207 K8NGM2 series
+ 0267 MCP51 Serial ATA Controller
+ 1043 81bc A8N-VM CSM Mainboard
+ 1462 7207 K8NGM2 series
+ 0268 MCP51 Ethernet Controller
+ 0269 MCP51 Ethernet Controller
+ 103c 30b7 Presario V6133CL
+ 1043 8141 A8N-VM CSM Mainboard
+ 1462 7207 K8NGM2 series
+ 026a MCP51 MCI
+ 026b MCP51 AC97 Audio Controller
+ 105b 0cad Winfast 6100K8MB
+ 026c MCP51 High Definition Audio
+ 103c 30b5 Presario V3242AU
+ 103c 30b7 Presario V6133CL
+ 10de cb84 ASUSTeK Computer Inc. A8N-VM CSM Mainboard
+ 1462 7207 K8NGM2 series
+ 026d MCP51 USB Controller
+ 103c 30b7 Presario V6133CL
+ 1043 81bc A8N-VM CSM Mainboard
+ 105b 0cad Winfast 6100K8MB
+ 1462 7207 K8NGM2 series
+ 026e MCP51 USB Controller
+ 103c 30b7 Presario V6133CL
+ 1043 81bc A8N-VM CSM Mainboard
+ 105b 0cad Winfast 6100K8MB
+ 1462 7207 K8NGM2 series
+ 026f MCP51 PCI Bridge
+ 103c 30b7 Presario V6133CL
+ 0270 MCP51 Host Bridge
+ 103c 30b7 Presario V6133CL
+ 1043 81bc A8N-VM CSM Mainboard
+ 105b 0cad Winfast 6100K8MB
+ 1458 5001 GA-M55plus-S3G
+ 1462 7207 K8NGM2 series
+ 0271 MCP51 PMU
+ 103c 30b5 Presario V3242AU
+ 103c 30b7 Presario V6133CL
+ 0272 MCP51 Memory Controller 0
+ 105b 0cad Winfast 6100K8MB
+ 027e C51 Memory Controller 2
+ 103c 30b7 Presario V6133CL
+ 1043 81cd A8N-VM CSM Mainboard
+ 1458 5000 GA-M55plus-S3G
+ 1462 7207 K8NGM2 series
+ 027f C51 Memory Controller 3
+ 103c 30b7 Presario V6133CL
+ 1043 81cd A8N-VM CSM Mainboard
+ 1458 5000 GA-M55plus-S3G
+ 1462 7207 K8NGM2 series
+ 0280 NV28 [GeForce4 Ti 4800]
+ 0281 NV28 [GeForce4 Ti 4200 AGP 8x]
+ 0282 NV28 [GeForce4 Ti 4800 SE]
+ 0286 NV28 [GeForce4 Ti 4200 Go AGP 8x]
+ 0288 NV28GL [Quadro4 980 XGL]
+ 0289 NV28GL [Quadro4 780 XGL]
+ 028c NV28GLM [Quadro4 Go700]
+ 0290 G71 [GeForce 7900 GTX]
+ 0291 G71 [GeForce 7900 GT/GTO]
+ 10de 042b NX7900GTO-T2D512E [7900 GTO]
+ 0292 G71 [GeForce 7900 GS]
+ 0293 G71 [GeForce 7900 GX2]
+ 0294 G71 [GeForce 7950 GX2]
+ 0295 G71 [GeForce 7950 GT]
+ 1043 8225 GeForce 7950 GT
+ 107d 2a68 WinFast PX7950GT TDH
+ 1462 0663 NX7950GT-VT2D512EZ-HD
+ 0297 G71 [GeForce Go 7950 GTX]
+ 0298 G71 [GeForce Go 7900 GS]
+ 0299 G71 [GeForce Go 7900 GTX]
+ 029a G71 [Quadro FX 2500M]
+ 029b G71 [Quadro FX 1500M]
+ 029c G71 [Quadro FX 5500]
+ 029d G71GL [Quadro FX 3500]
+ 029e G71 [Quadro FX 1500]
+ 029f G70 [Quadro FX 4500 X2]
+# Xbox Graphics Processing Unit (Integrated). GeForce3 derivative (NV20 < NV2A < NV25).
+ 02a0 NV2A [XGPU]
+ 02a5 MCPX CPU Bridge
+ 02a6 MCPX Memory Controller
+ 02e0 G73 [GeForce 7600 GT]
+ 02e0 2249 GF 7600GT 560M 256MB DDR3 DUAL DVI TV
+ 02e1 G73 [GeForce 7600 GS]
+ 1682 222b PV-T73K-UAL3 (256MB)
+ 1682 2247 GF 7600GS 512MB DDR2
+ 02e2 G73 [GeForce 7300 GT]
+ 02e3 G71 [GeForce 7900 GS]
+ 02e4 G71 [GeForce 7950 GT]
+ 1682 2271 PV-T71A-YDF7 (512MB)
+ 02f0 C51 Host Bridge
+ 103c 30b7 Presario V6133CL
+ 1043 81cd A8N-VM CSM Mainboard
+ 1462 7207 K8NGM2 series
+ 02f1 C51 Host Bridge
+ 1458 5000 GA-M55plus-S3G
+ 02f2 C51 Host Bridge
+ 02f3 C51 Host Bridge
+ 02f4 C51 Host Bridge
+ 02f5 C51 Host Bridge
+ 02f6 C51 Host Bridge
+ 02f7 C51 Host Bridge
+ 02f8 C51 Memory Controller 5
+ 103c 30b7 Presario V6133CL
+ 1043 81cd A8N-VM CSM Mainboard
+ 1458 5000 GA-M55plus-S3G
+ 1462 7207 K8NGM2 series
+ 02f9 C51 Memory Controller 4
+ 103c 30b7 Presario V6133CL
+ 1043 81cd A8N-VM CSM Mainboard
+ 1458 5000 GA-M55plus-S3G
+ 1462 7207 K8NGM2 series
+ 02fa C51 Memory Controller 0
+ 103c 30b7 Presario V6133CL
+ 1043 81cd A8N-VM CSM Mainboard
+ 1458 5000 GA-M55plus-S3G
+ 1462 7207 K8NGM2 series
+ 02fb C51 PCI Express Bridge
+ 02fc C51 PCI Express Bridge
+ 103c 30b7 Presario V6133CL
+ 02fd C51 PCI Express Bridge
+ 103c 30b7 Presario V6133CL
+ 02fe C51 Memory Controller 1
+ 103c 30b7 Presario V6133CL
+ 1043 81cd A8N-VM CSM Mainboard
+ 1458 5000 GA-M55plus-S3G
+ 1462 7207 K8NGM2 series
+ 02ff C51 Host Bridge
+ 103c 30b7 Presario V6133CL
+ 1043 81cd A8N-VM CSM Mainboard
+ 1458 5000 GA-M55plus-S3G
+ 1462 7207 K8NGM2 series
+ 0300 NV30 [GeForce FX]
+ 0301 NV30 [GeForce FX 5800 Ultra]
+ 0302 NV30 [GeForce FX 5800]
+ 0308 NV30GL [Quadro FX 2000]
+ 0309 NV30GL [Quadro FX 1000]
+ 0311 NV31 [GeForce FX 5600 Ultra]
+ 0312 NV31 [GeForce FX 5600]
+ 0313 NV31
+ 0314 NV31 [GeForce FX 5600XT]
+ 1043 814a V9560XT/TD
+ 0316 NV31M
+ 0317 NV31M Pro
+ 031a NV31M [GeForce FX Go5600]
+ 031b NV31M [GeForce FX Go5650]
+ 031c NV31 [Quadro FX Go700]
+ 031d NV31GLM
+ 031e NV31GLM Pro
+ 031f NV31GLM Pro
+ 0320 NV34 [GeForce FX 5200]
+ 0321 NV34 [GeForce FX 5200 Ultra]
+ 0322 NV34 [GeForce FX 5200]
+ 1043 02fb V9250 Magic
+ 1043 8180 V9520-X/TD/128M
+ 1462 9110 MS-8911 (FX5200-TD128)
+ 1462 9171 MS-8917 (FX5200-T128)
+ 1462 9360 MS-8936 (FX5200-T128)
+ 0323 NV34 [GeForce FX 5200LE]
+ 0324 NV34M [GeForce FX Go5200 64M]
+ 1028 0196 Inspiron 5160
+ 103c 006a Pavilion ZD7000 laptop
+ 1071 8160 MIM2000
+ 0325 NV34M [GeForce FX Go5250]
+ 0326 NV34 [GeForce FX 5500]
+ 1458 310d GeForce FX 5500 128 MB
+ 1682 2034 GeForce 5500 256 MB
+ 0327 NV34 [GeForce FX 5100]
+ 0328 NV34M [GeForce FX Go5200 32M/64M]
+ 0329 NV34M [GeForce FX Go5200]
+ 10de 0010 Powerbook G4
+ 032a NV34GL [Quadro NVS 280 PCI]
+ 032b NV34GL [Quadro FX 500/600 PCI]
+ 032c NV34GLM [GeForce FX Go 5300]
+ 032d NV34 [GeForce FX Go5100]
+ 032f NV34GL
+ 0330 NV35 [GeForce FX 5900 Ultra]
+ 1043 8137 V9950 Ultra / 256 MB
+ 0331 NV35 [GeForce FX 5900]
+ 1043 8145 V9950GE
+ 0332 NV35 [GeForce FX 5900XT]
+ 0333 NV38 [GeForce FX 5950 Ultra]
+ 0334 NV35 [GeForce FX 5900ZT]
+ 1462 9373 FX5900ZT-VTD128 (MS-8937)
+ 0338 NV35GL [Quadro FX 3000]
+ 033f NV35GL [Quadro FX 700]
+ 0341 NV36.1 [GeForce FX 5700 Ultra]
+ 1462 9380 MS-8938 (FX5700U-TD128)
+ 0342 NV36.2 [GeForce FX 5700]
+ 0343 NV36 [GeForce FX 5700LE]
+ 0344 NV36.4 [GeForce FX 5700VE]
+ 0345 NV36.5
+ 0347 NV36 [GeForce FX Go5700]
+ 103c 006a NX9500
+ 0348 NV36 [GeForce FX Go5700]
+ 0349 NV36M Pro
+ 034b NV36MAP
+ 034c NV36 [Quadro FX Go1000]
+ 034e NV36GL [Quadro FX 1100]
+ 034f NV36GL
+ 0360 MCP55 LPC Bridge
+ 0361 MCP55 LPC Bridge
+ 1028 0221 PowerEdge R805 MCP55 LPC Bridge
+ 0362 MCP55 LPC Bridge
+ 147b 12c4 KN9-Ultra Mainboard
+ 0363 MCP55 LPC Bridge
+ 0364 MCP55 LPC Bridge
+ 1028 0221 PowerEdge R805 MCP55 LPC Bridge
+ 0365 MCP55 LPC Bridge
+ 0366 MCP55 LPC Bridge
+ 0367 MCP55 LPC Bridge
+ 0368 MCP55 SMBus
+ 1028 020c PowerEdge M605 MCP55 SMBus
+ 1028 0221 PowerEdge R805 MCP55 SMBus
+ 147b 12c4 KN9-Ultra Mainboard
+ 0369 MCP55 Memory Controller
+ 147b 12c4 KN9-Ultra Mainboard
+ 036a MCP55 Memory Controller
+ 036b MCP55 SMU
+ 036c MCP55 USB Controller
+ 1028 020c PowerEdge M605 MCP55 USB Controller
+ 1028 0221 PowerEdge R805 MCP55 USB Controller
+ 147b 12c4 KN9-Ultra Mainboard
+ 036d MCP55 USB Controller
+ 1028 020c PowerEdge M605 MCP55 USB Controller
+ 1028 0221 PowerEdge R805 MCP55 USB Controller
+ 147b 12c4 KN9-Ultra Mainboard
+ 036e MCP55 IDE
+ 147b 12c4 KN9-Ultra Mainboard
+ 0370 MCP55 PCI bridge
+ 0371 MCP55 High Definition Audio
+ 0372 MCP55 Ethernet
+ 0373 MCP55 Ethernet
+ 147b 12c4 KN9-Ultra Mainboard
+ 0374 MCP55 PCI Express bridge
+ 0375 MCP55 PCI Express bridge
+ 0376 MCP55 PCI Express bridge
+ 0377 MCP55 PCI Express bridge
+ 0378 MCP55 PCI Express bridge
+ 037a MCP55 Memory Controller
+ 037e MCP55 SATA Controller
+ 037f MCP55 SATA Controller
+ 1028 0221 PowerEdge R805 MCP55 SATA Controller
+ 147b 12c4 KN9-Ultra Mainboard
+ 038b G73 [GeForce 7650 GS]
+ 0390 G73 [GeForce 7650 GS]
+ 0391 G73 [GeForce 7600 GT]
+ 1458 3427 GV-NX76T128D-RH
+ 0392 G73 [GeForce 7600 GS]
+ 1462 0622 NX7600GS-T2D256EH
+ 0393 G73 [GeForce 7300 GT]
+ 10de 0412 NX7300GT-TD256EH
+ 1462 0412 NX7300GT-TD256EH
+ 0394 G73 [GeForce 7600 LE]
+ 0395 G73 [GeForce 7300 GT]
+ 0397 G73 [GeForce Go 7700]
+ 0398 G73 [GeForce Go 7600]
+ 1025 006c Acer 9814 WKMI
+ 0399 G73 [GeForce Go 7600 GT]
+ 039a G73M [Quadro NVS 300M]
+ 039b G73 [GeForce Go 7900 SE]
+ 039c G73 [Quadro FX 550M]
+ 10de 039c Quadro FX 560M
+ 039e G73GL [Quadro FX 560]
+ 03a0 C55 Host Bridge
+ 03a1 C55 Host Bridge
+ 03a2 C55 Host Bridge
+ 03a3 C55 Host Bridge
+ 03a4 C55 Host Bridge
+ 03a5 C55 Host Bridge
+ 03a6 C55 Host Bridge
+ 03a7 C55 Host Bridge
+ 03a8 C55 Memory Controller
+ 03a9 C55 Memory Controller
+ 03aa C55 Memory Controller
+ 03ab C55 Memory Controller
+ 03ac C55 Memory Controller
+ 03ad C55 Memory Controller
+ 03ae C55 Memory Controller
+ 03af C55 Memory Controller
+ 03b0 C55 Memory Controller
+ 03b1 C55 Memory Controller
+ 03b2 C55 Memory Controller
+ 03b3 C55 Memory Controller
+ 03b4 C55 Memory Controller
+ 03b5 C55 Memory Controller
+ 03b6 C55 Memory Controller
+ 03b7 C55 PCI Express bridge
+ 03b8 C55 PCI Express bridge
+ 03b9 C55 PCI Express bridge
+ 03ba C55 Memory Controller
+ 03bb C55 PCI Express bridge
+ 03bc C55 Memory Controller
+ 03d0 C61 [GeForce 6150SE nForce 430]
+ 1028 020e Inspiron 531
+ 03d1 C61 [GeForce 6100 nForce 405]
+ 03d2 C61 [GeForce 6100 nForce 400]
+ 03d5 C61 [GeForce 6100 nForce 420]
+ 03d6 C61 [GeForce 7025 / nForce 630a]
+ 03e0 MCP61 LPC Bridge
+ 1028 020e Inspiron 531
+ 1849 03e0 939NF6G-VSTA Board
+ 03e1 MCP61 LPC Bridge
+ 03e2 MCP61 LPC Bridge
+ 03e3 MCP61 LPC Bridge
+ 03e4 MCP61 High Definition Audio
+ 03e5 MCP61 Ethernet
+ 03e6 MCP61 Ethernet
+ 03e7 MCP61 SATA Controller
+ 03e8 MCP61 PCI Express bridge
+ 1028 020e Inspiron 531
+ 1849 03e8 939NF6G-VSTA Board
+ 03e9 MCP61 PCI Express bridge
+ 1028 020e Inspiron 531
+ 1849 03e9 939NF6G-VSTA Board
+ 03ea MCP61 Memory Controller
+ 1028 020e Inspiron 531
+ 1849 03ea 939NF6G-VSTA Board
+ 03eb MCP61 SMBus
+ 1028 020e Inspiron 531
+ 1849 03eb 939NF6G-VSTA Board
+ 03ec MCP61 IDE
+ 1028 020e Inspiron 531
+ 1849 03ec 939NF6G-VSTA Board
+ 03ee MCP61 Ethernet
+ 03ef MCP61 Ethernet
+ 1028 020e Inspiron 531
+ 1849 03ef 939NF6G-VSTA Board
+ 03f0 MCP61 High Definition Audio
+ 1028 020e Inspiron 531
+ 1849 0888 939NF6G-VSTA Board
+ 03f1 MCP61 USB Controller
+ 1028 020e Inspiron 531
+ 1849 03f1 939NF6G-VSTA Board
+ 03f2 MCP61 USB Controller
+ 1028 020e Inspiron 531
+ 1849 03f2 939NF6G-VSTA Board
+ 03f3 MCP61 PCI bridge
+ 1028 020e Inspiron 531
+ 1849 03f3 939NF6G-VSTA Board
+ 03f4 MCP61 SMU
+ 03f5 MCP61 Memory Controller
+ 1028 020e Inspiron 531
+ 1849 03eb 939NF6G-VSTA Board
+ 03f6 MCP61 SATA Controller
+ 1028 020e Inspiron 531
+ 1849 03f6 939NF6G-VSTA Board
+ 03f7 MCP61 SATA Controller
+ 0400 G84 [GeForce 8600 GTS]
+ 0401 G84 [GeForce 8600GT]
+ 0402 G84 [GeForce 8600 GT]
+ 1462 0910 NX8600GT-T2D256EZ
+ 0403 G84 [GeForce 8600 GS]
+ 0404 G84 [GeForce 8400 GS]
+ 1462 1230 NX8400GS-TD256E
+ 0405 G84 [GeForce 9500M GS]
+ 0406 G84 [GeForce 8300 GS]
+ 0407 G84 [GeForce 8600M GT]
+ 0408 G84 [GeForce 9650M GS]
+ 0409 G84 [GeForce 8700M GT]
+ 040a G84 [Quadro FX 370]
+ 040b G84M [Quadro NVS 320M]
+ 040c G84M [Quadro FX 570M]
+ 17aa 20d9 ThinkPad T61p
+ 040d G84 [Quadro FX 1600M]
+ 040e G84 [Quadro FX 570]
+ 040f G84 [Quadro FX 1700]
+ 0410 G92 [GeForce GT 330]
+ 0420 G86 [GeForce 8400 SE]
+ 0421 G86 [GeForce 8500 GT]
+ 1462 0960 NX8500GT-TD512EH/M2
+ 0422 G86 [GeForce 8400 GS]
+ 0423 G86 [GeForce 8300 GS]
+ 0424 G86 [GeForce 8400 GS]
+ 0425 G86 [GeForce 8600M GS]
+ 1025 0121 Aspire 5920G
+ 0426 G86 [GeForce 8400M GT]
+ 0427 G86 [GeForce 8400M GS]
+ 0428 G86 [GeForce 8400M G]
+ 0429 G84M [Quadro NVS 140M]
+ 17aa 20d8 ThinkPad T61
+ 042a G86M [Quadro NVS 130M]
+ 042b G86M [Quadro NVS 135M]
+ 042c G86 [GeForce 9400 GT]
+ 042d G86M [Quadro FX 360M]
+ 042e G86 [GeForce 9300M G]
+ 042f G86 [Quadro NVS 290]
+ 0440 MCP65 LPC Bridge
+ 0441 MCP65 LPC Bridge
+ 0442 MCP65 LPC Bridge
+ 0443 MCP65 LPC Bridge
+ 0444 MCP65 Memory Controller
+ 0445 MCP65 Memory Controller
+ 0446 MCP65 SMBus
+ 0447 MCP65 SMU
+ 0448 MCP65 IDE
+ 0449 MCP65 PCI bridge
+ 044a MCP65 High Definition Audio
+ 044b MCP65 High Definition Audio
+ 044c MCP65 AHCI Controller
+ 044d MCP65 AHCI Controller
+ 044e MCP65 AHCI Controller
+ 044f MCP65 AHCI Controller
+ 0450 MCP65 Ethernet
+ 0451 MCP65 Ethernet
+ 0452 MCP65 Ethernet
+ 0453 MCP65 Ethernet
+ 0454 MCP65 USB Controller
+ 0455 MCP65 USB Controller
+ 0456 MCP65 USB Controller
+ 0457 MCP65 USB Controller
+ 0458 MCP65 PCI Express bridge
+ 0459 MCP65 PCI Express bridge
+ 045a MCP65 PCI Express bridge
+ 045c MCP65 SATA Controller
+ 045d MCP65 SATA Controller
+ 045e MCP65 SATA Controller
+ 045f MCP65 SATA Controller
+ 0531 C67 [GeForce 7150M / nForce 630M]
+ 0533 C67 [GeForce 7000M / nForce 610M]
+ 053a C68 [GeForce 7050 PV / nForce 630a]
+ 053b C68 [GeForce 7050 PV / nForce 630a]
+ 1043 8308 M2N68-AM Motherbord
+ 053e C68 [GeForce 7025 / nForce 630a]
+ 0541 MCP67 Memory Controller
+ 0542 MCP67 SMBus
+ 1043 8308 M2N68-AM Motherbord
+ 0543 MCP67 Co-processor
+ 0547 MCP67 Memory Controller
+ 1043 8308 M2N68-AM Motherbord
+ 1849 0547 ALiveNF7G-HDready
+ 0548 MCP67 ISA Bridge
+ 1043 8308 M2N68-AM Motherboard
+ 054c MCP67 Ethernet
+ 1043 8308 M2N68-AM Motherbord
+ 1849 054c ALiveNF7G-HDready, MCP67 Gigabit Ethernet
+ 054d MCP67 Ethernet
+ 054e MCP67 Ethernet
+# forcedeth source code from Nvidi
+ 054f MCP67 Ethernet
+ 0550 MCP67 AHCI Controller
+ 1043 8308 M2N68-AM Motherboard
+ 0554 MCP67 AHCI Controller
+ 1043 8308 M2N68-AM Motherboard
+ 0555 MCP67 SATA Controller
+ 1043 8308 M2N68-AM Motherboard
+ 055c MCP67 High Definition Audio
+ 1043 8290 M2N68-AM Motherboard
+ 055d MCP67 High Definition Audio
+ 055e MCP67 OHCI USB 1.1 Controller
+ 1043 8308 M2N68-AM Motherboard
+ 055f MCP67 EHCI USB 2.0 Controller
+ 1043 8308 M2N68-AM Motherboard
+ 0560 MCP67 IDE Controller
+ f043 8308 M2N68-AM Motherboard
+ 0561 MCP67 PCI Bridge
+ 0562 MCP67 PCI Express Bridge
+ 1849 0562 ALiveNF7G-HDready
+ 0563 MCP67 PCI Express Bridge
+ 0568 MCP78S [GeForce 8200] Memory Controller
+ 1043 82e8 M3N72-D
+ 1462 7508 K9N2GM-FIH
+ 1849 0568 K10N78FullHD-hSLI R3.0 Memory Controller
+ 0569 MCP78S [GeForce 8200] PCI Express Bridge
+ 1043 82e8 M3N72-D
+ 1462 7508 K9N2GM-FIH
+ 1849 0569 K10N78FullHD-hSLI R3.0 PCI Express Bridge
+ 056a MCP73 [nForce 630i] USB 2.0 Controller (EHCI)
+ 1019 297a MCP73PVT-SM
+ 056c MCP73 IDE
+ 1019 297a MCP73PVT-SM
+ 1afa 7150 JW-IN7150-HD
+ 056d MCP73 PCI Express bridge
+ 1019 297a MCP73PVT-SM
+ 056e MCP73 PCI Express bridge
+ 1019 297a MCP73PVT-SM
+ 056f MCP73 PCI Express bridge
+ 1019 297a MCP73PVT-SM
+ 05b1 NF200 PCIe 2.0 switch for mainboards
+ 05b8 NF200 PCIe 2.0 switch for GTX 295
+ 05be NF200 PCIe 2.0 switch for Quadro Plex S4 / Tesla S870 / Tesla S1070 / Tesla S2050
+ 05e0 GT200b [GeForce GTX 295]
+ 05e1 GT200 [GeForce GTX 280]
+# GT200 [GTX 260] or GT200 [GTX 260-216] or GT200b [GTX 260-216]
+ 05e2 GT200 [GeForce GTX 260]
+ 05e3 GT200b [GeForce GTX 285]
+ 05e6 GT200b [GeForce GTX 275]
+# Found in GPU server Tesla S1070
+ 05e7 GT200 [Tesla C1060]
+ 05ea GT200 [GeForce GTX 260]
+ 05eb GT200 [GeForce GTX 295]
+ 05ed GT200GL [Quadro Plex 2200 D2]
+ 05f8 GT200GL [Quadro Plex 2200 S4]
+ 05f9 GT200GL [Quadro CX]
+ 05fd GT200GL [Quadro FX 5800]
+ 05fe GT200GL [Quadro FX 4800]
+ 05ff GT200GL [NVIDIA Quadro FX 3800]
+ 0600 G92 [GeForce 8800 GTS 512]
+ 0601 G92 [GeForce 9800 GT]
+ 0602 G92 [GeForce 8800 GT]
+ 0603 G92 [GeForce GT 230]
+ 0604 G92 [GeForce 9800 GX2]
+ 0605 G92 [GeForce 9800 GT]
+ 0606 G92 [GeForce 8800 GS]
+ 0607 G92 [GeForce GTS 240]
+ 0608 G92 [GeForce 9800M GTX]
+ 0609 G92 [GeForce 8800M GTS]
+ 060a GT200 [GeForce GTX 280M]
+ 060b G92 [GeForce 9800M GT]
+ 060c G92 [GeForce 8800M GTX]
+ 060d G92 [GeForce 8800 GS]
+ 060f G92 [GeForce GTX 285M]
+ 0610 G92 [GeForce 9600 GSO]
+ 1682 2385 GeForce 9600 GSO 768mb
+ 0611 G92 [GeForce 8800 GT]
+ 107d 2ab0 Winfast PX8800 GT PCI-E
+ 19da 1040 ZT-88TES2P-FSP
+ 0612 G92 [GeForce 9800 GTX]
+ 0613 G92 [GeForce 9800 GTX+]
+ 0614 G92 [GeForce 9800 GT]
+ 107d 2ab3 WinFast PX9800 GT (S-Fanpipe)
+ 0615 G92 [GeForce GTS 250]
+ 3842 1150 GeForce GTS 250 P/N 512-P3-1150-TR
+# Overclocked
+ 3842 1151 GeForce GTS 250 P/N 512-P3-1151-TR
+ 3842 1155 GeForce GTS 250 P/N 01G-P3-1155-TR
+# Overclocked
+ 3842 1156 GeForce GTS 250 P/N 01G-P3-1156-TR
+ 0617 G92 [GeForce 9800M GTX]
+ 0618 G92 [GeForce GTX 260M]
+ 0619 G92GL [Quadro FX 4700 X2]
+ 061a G92 [Quadro FX 3700]
+ 061b G92GL [Quadro VX 200]
+ 061c G92M [Quadro FX 3600M]
+ 061d G92 [Quadro FX 2800M]
+ 061e G92 [Quadro FX 3700M]
+ 061f G92 [Quadro FX 3800M]
+ 0622 G94 [GeForce 9600 GT]
+ 107d 2ac1 WinFast PX9600GT 1024MB
+ 1458 3481 GV-NX96T512HP
+ 0623 G94 [GeForce 9600 GS]
+ 0625 G94 [GeForce 9600 GSO 512]
+ 0626 G94 [GeForce GT 130]
+ 0627 G94 [GeForce GT 140]
+ 0628 G94 [GeForce 9800M GTS]
+ 062a G94 [GeForce 9700M GTS]
+ 062b G94 [GeForce 9800M GS]
+ 062c G94 [GeForce 9800M GTS]
+ 062d G94 [GeForce 9600 GT]
+ 062e G94 [GeForce 9600 GT]
+ 0631 G94M [GeForce GTS 160M]
+ 0632 G94M [GeForce GTS 150M]
+ 0635 G94 [GeForce 9600 GSO]
+ 0637 G94 [GeForce 9600 GT]
+ 0638 G94 [Quadro FX 1800]
+ 063a G94M [Quadro FX 2700M]
+ 0640 G96 [GeForce 9500 GT]
+ 0641 G96 [GeForce 9400 GT]
+ 0643 G96 [GeForce 9500 GT]
+ 0644 G96 [GeForce 9500 GS]
+ 0645 G96 [GeForce 9500 GS]
+ 0646 G96 [GeForce GT 120]
+ 0647 G96 [GeForce 9600M GT]
+ 0648 G96 [GeForce 9600M GS]
+ 0649 G96 [GeForce 9600M GT]
+ 064a G96 [GeForce 9700M GT]
+ 064b G96 [GeForce 9500M G]
+ 064c G96 [GeForce 9650M GT]
+ 0651 G96 [GeForce G 110M]
+ 0652 G96 [GeForce GT 130M]
+ 0653 G96M [GeForce GT 120M]
+ 0654 G96 [GeForce GT 220M]
+ 0656 G96 [GeForce 9650 S]
+ 0658 G96 [Quadro FX 380]
+ 0659 G96 [Quadro FX 580]
+ 065a G96 [Quadro FX 1700M]
+ 065b G96 [GeForce 9400 GT]
+ 065c G96M [Quadro FX 770M]
+ 06c0 GF100 [GeForce GTX 480]
+ 06cd GF100 [GeForce GTX 470]
+ 06d1 GF100 [Tesla C2050 / C2070]
+ 06d2 GF100 [M2070]
+ 06d8 GF100 [Quadro 6000]
+ 06d9 GF100 [Quadro 5000]
+ 06dd GF100 [Quadro 4000]
+ 06de GF100 [Tesla S2050]
+ 06df GF100 [M2070Q]
+ 06e0 G98 [GeForce 9300 GE]
+ 06e1 G98 [GeForce 9300 GS]
+ 06e2 G98 [GeForce 8400]
+ 06e3 G98 [GeForce 8300 GS]
+ 06e4 G98 [GeForce 8400 GS]
+ 1458 3475 GV-NX84S256HE [GeForce 8400 GS]
+ 06e5 G98 [GeForce 9300M GS]
+ 06e6 G98 [GeForce G100]
+ 06e7 G98 [GeForce 9300 SE]
+ 06e8 G98 [GeForce 9200M GS]
+ 06e9 G98 [GeForce 9300M GS]
+ 1043 19b2 U6V laptop
+ 06ea G86M [Quadro NVS 150M]
+ 06eb G98M [Quadro NVS 160M]
+ 06ec G98M [GeForce G 105M]
+ 06ef G98M [GeForce G 103M]
+ 06f1 G98 [GeForce G105M]
+ 06f8 G98 [Quadro NVS 420]
+ 06f9 G98 [Quadro FX 370 LP]
+ 06fa G98 [Quadro NVS 450]
+ 06fb G98 [Quadro FX 370M]
+ 06fd G98 [Quadro NVS 295]
+ 06ff G98 [HICx16 + Graphics]
+ 0751 MCP78S [GeForce 8200] Memory Controller
+ 1043 82e8 M3N72-D
+ 1462 7508 K9N2GM-FIH
+ 1849 0751 K10N78FullHD-hSLI R3.0 Memory Controller
+ 0752 MCP78S [GeForce 8200] SMBus
+ 1043 82e8 M3N72-D
+ 1462 7508 K9N2GM-FIH
+ 1849 0752 K10N78FullHD-hSLI R3.0 SMBus
+ 0753 MCP78S [GeForce 8200] Co-Processor
+ 1043 82e8 M3N72-D
+ 1462 7508 K9N2GM-FIH
+ 1849 0753 K10N78FullHD-hSLI R3.0 Co-Processor
+ 0754 MCP78S [GeForce 8200] Memory Controller
+ 1043 82e8 M3N72-D
+ 1462 7508 K9N2GM-FIH
+ 1849 0754 K10N78FullHD-hSLI R3.0 Memory Controller
+ 0759 MCP78S [GeForce 8200] IDE
+ 1043 82e8 M3N72-D
+ 1462 7508 K9N2GM-FIH
+ 1849 0759 K10N78FullHD-hSLI R3.0 IDE
+ 075a MCP78S [GeForce 8200] PCI Bridge
+ 1043 82e8 M3N72-D
+ 1849 075a K10N78FullHD-hSLI R3.0 PCI Bridge
+ 075b MCP78S [GeForce 8200] PCI Express Bridge
+ 1043 82e8 M3N72-D
+ 1462 7508 K9N2GM-FIH
+ 1849 075b K10N78FullHD-hSLI R3.0 PCI Express Bridge
+ 075c MCP78S [GeForce 8200] LPC Bridge
+ 1462 7508 K9N2GM-FIH
+ 1849 075c K10N78FullHD-hSLI R3.0 LPC Bridge
+ 075d MCP78S [GeForce 8200] LPC Bridge
+ 1043 82e8 M3N72-D
+ 0760 MCP77 Ethernet
+ 1043 82e8 M3N72-D
+ 1462 7508 K9N2GM-FIH
+ 1849 0760 K10N78FullHD-hSLI R3.0 Ethernet
+ 0761 MCP77 Ethernet
+ 0762 MCP77 Ethernet
+ 0763 MCP77 Ethernet
+ 0774 MCP72XE/MCP72P/MCP78U/MCP78S High Definition Audio
+# has a Realtek ALC1200 HDAudio Codec
+ 1043 82fe M3N72-D
+ 1462 7508 K9N2GM-FIH
+ 1849 3662 K10N78FullHD-hSLI R3.0 High Definition Audio
+ 0778 MCP78S [GeForce 8200] PCI Express Bridge
+ 1043 82e8 M3N72-D
+ 1462 7508 K9N2GM-FIH
+ 1849 0778 K10N78FullHD-hSLI R3.0 PCI Express Bridge
+ 077a MCP78S [GeForce 8200] PCI Bridge
+ 1043 82e8 M3N72-D
+ 1462 7508 K9N2GM-FIH
+ 1849 077a K10N78FullHD-hSLI R3.0 PCI Bridge
+ 077b MCP78S [GeForce 8200] OHCI USB 1.1 Controller
+ 1043 82e8 M3N72-D
+ 1462 7508 K9N2GM-FIH
+ 1849 077b K10N78FullHD-hSLI R3.0 OHCI USB 1.1 Controller
+ 077c MCP78S [GeForce 8200] EHCI USB 2.0 Controller
+ 1043 82e8 M3N72-D
+ 1462 7508 K9N2GM-FIH
+ 1849 077c K10N78FullHD-hSLI R3.0 EHCI USB 2.0 Controller
+ 077d MCP78S [GeForce 8200] OHCI USB 1.1 Controller
+ 1043 82e8 M3N72-D
+ 1462 7508 K9N2GM-FIH
+ 1849 077d K10N78FullHD-hSLI R3.0 OHCI USB 1.1 Controller
+ 077e MCP78S [GeForce 8200] EHCI USB 2.0 Controller
+ 1043 82e8 M3N72-D
+ 1462 7508 K9N2GM-FIH
+ 1849 077e K10N78FullHD-hSLI R3.0 EHCI USB 2.0 Controller
+ 07c0 MCP73 Host Bridge
+ 1afa 7150 JW-IN7150-HD
+ 07c1 MCP73 Host Bridge
+ 1019 297a MCP73PVT-SM
+ 07c2 MCP73 Host Bridge
+ 07c5 MCP73 Host Bridge
+ 07c8 MCP73 Memory Controller
+ 1019 297a MCP73PVT-SM
+ 1afa 7150 JW-IN7150-HD
+ 07cb nForce 630i memory controller
+ 1019 297a MCP73PVT-SM
+ 1afa 7150 JW-IN7150-HD
+ 07cd nForce 630i memory controller
+ 1019 297a MCP73PVT-SM
+ 1afa 7150 JW-IN7150-HD
+ 07ce nForce 630i memory controller
+ 1019 297a MCP73PVT-SM
+ 1afa 7150 JW-IN7150-HD
+ 07cf nForce 630i memory controller
+ 1019 297a MCP73PVT-SM
+ 1afa 7150 JW-IN7150-HD
+ 07d0 nForce 630i memory controller
+ 1019 297a MCP73PVT-SM
+ 1afa 7150 JW-IN7150-HD
+ 07d1 nForce 630i memory controller
+ 1019 297a MCP73PVT-SM
+ 1afa 7150 JW-IN7150-HD
+ 07d2 nForce 630i memory controller
+ 1019 297a MCP73PVT-SM
+ 1afa 7150 JW-IN7150-HD
+ 07d3 nForce 630i memory controller
+ 1019 297a MCP73PVT-SM
+ 1afa 7150 JW-IN7150-HD
+ 07d6 nForce 630i memory controller
+ 1019 297a MCP73PVT-SM
+ 1afa 7150 JW-IN7150-HD
+ 07d7 MCP73 LPC Bridge
+ 1019 297a MCP73PVT-SM
+ 1afa 7150 JW-IN7150-HD
+ 07d8 MCP73 SMBus
+ 1019 297a MCP73PVT-SM
+ 1afa 7150 JW-IN7150-HD
+ 07d9 MCP73 Memory Controller
+ 1019 297a MCP73PVT-SM
+ 1afa 7150 JW-IN7150-HD
+ 07da MCP73 Co-processor
+ 1afa 7150 JW-IN7150-HD
+ 07dc MCP73 Ethernet
+ 07dd MCP73 Ethernet
+ 07de MCP73 Ethernet
+ 07df MCP73 Ethernet
+ 07e0 C73 [GeForce 7150 / nForce 630i]
+ 1afa 7150 JW-IN7150-HD
+ 07e1 C73 [GeForce 7100 / nForce 630i]
+ 1019 297a MCP73PVT-SM
+ 07e2 C73 [GeForce 7050 / nForce 630i]
+ 07e3 C73 [GeForce 7050 / nForce 610i]
+ 07e5 C73 [GeForce 7100 / nForce 620i]
+ 07f0 MCP73 IDE
+ 07f4 GeForce 7100/nForce 630i SATA
+ 1019 297a MCP73PVT-SM
+ 07f8 MCP73 SATA RAID Controller
+ 07fc MCP73 High Definition Audio
+ 1019 297a MCP73PVT-SM
+ 10de 07fc MCP73 High Definition Audio
+ 07fe GeForce 7100/nForce 630i USB
+ 1019 297a MCP73PVT-SM
+ 1afa 7150 JW-IN7150-HD
+ 0844 C77 [GeForce 9100M G]
+ 0845 C77 [GeForce 8200M G]
+ 0846 C77 [GeForce 9200]
+ 0847 C78 [GeForce 9100]
+ 0848 C77 [GeForce 8300]
+ 0849 C77 [GeForce 8200]
+ 1462 7508 K9N2GM-FIH
+ 1849 0849 K10N78FullHD-hSLI R3.0 GeForce 8200
+ 084a C77 [nForce 730a]
+ 084b C77 [GeForce 8200]
+ 084c C77 [nForce 780a SLI]
+ 084d C77 [nForce 750a SLI]
+ 1043 82e8 M3N72-D mGPU
+ 084f C77 [GeForce 8100 / nForce 720a]
+ 0860 C79 [GeForce 9300]
+ 0861 C79 [GeForce 9400]
+ 0862 C79 [GeForce 9400M G]
+ 0863 C79 [GeForce 9400M]
+ 0864 C79 [GeForce 9300]
+ 0865 C79 [GeForce 9300]
+ 0866 C79 [GeForce 9400M G]
+ 0867 C79 [GeForce 9400]
+ 0868 C79 [nForce 760i SLI]
+ 086a C79 [GeForce 9400]
+ 086c C79 [GeForce 9300 / nForce 730i]
+ 086d C79 [GeForce 9200]
+ 086e C79 [GeForce 9100M G]
+ 086f C79 [GeForce 9200M G]
+ 0870 C79 [GeForce 9400M]
+ 0871 C79 [GeForce 9200]
+ 0872 C79 [GeForce G102M]
+ 0873 C79 [GeForce G102M]
+ 0874 C79 [ION]
+ 0876 ION VGA [GeForce 9400M]
+ 087a C79 [GeForce 9400]
+ 087d ION VGA
+ 19da a123 IONITX-F-E
+ 087e ION LE VGA
+ 087f ION LE VGA
+ 08a4 GT216 [GeForce 320M]
+ 0a20 GT216 [GeForce GT 220]
+ 0a23 GT218 [GeForce 210]
+ 0a28 GT216 [GeForce GT 230M]
+ 0a29 GT216 [GeForce GT 330M]
+ 0a2a GT216 [GeForce GT 230M]
+ 0a2b GT216 [GeForce GT 330M]
+ 0a2c GT216 [NVS 5100M]
+ 0a2d GT216 [GeForce GT 320M]
+ 0a34 GT216 [GeForce GT 240M]
+ 0a35 GT216 [GeForce GT 325M]
+ 0a38 GT216GL [Quadro 400]
+ 0a3c GT216 [Quadro FX 880M]
+ 0a60 GT218 [GeForce G210]
+ 0a62 GT218 [GeForce 205]
+ 0a63 GT218 [GeForce 310]
+ 0a64 GT218 [ION]
+ 0a65 GT218 [GeForce 210]
+ 1043 8334 EN210 SILENT
+ 0a66 GT218 [GeForce 310]
+ 0a68 G98M [GeForce G105M]
+ 0a69 G98M [GeForce G105M]
+ 0a6a GT218 [NVS 2100M]
+ 0a6c GT218 [NVS 3100M]
+ 1028 040b Latitude E6510
+ 17aa 2142 ThinkPad T410
+ 0a6e GT218 [GeForce 305M]
+ 0a6f GT218 [ION]
+ 0a70 GT218 [GeForce 310M]
+ 0a71 GT218 [GeForce 305M]
+ 0a72 GT218 [GeForce 310M]
+ 0a73 GT218 [GeForce 305M]
+ 0a74 GT218 [GeForce G210M]
+ 0a75 GT218 [GeForce 310M]
+ 0a78 GT218GL [Quadro FX 380 LP]
+ 0a7c GT218 [Quadro FX 380M]
+ 0a80 MCP79 Host Bridge
+ 0a81 MCP79 Host Bridge
+ 0a82 MCP79 Host Bridge
+ 0a83 MCP79 Host Bridge
+ 0a84 MCP79 Host Bridge
+ 0a85 MCP79 Host Bridge
+ 0a86 MCP79 Host Bridge
+ 0a87 MCP79 Host Bridge
+ 0a88 MCP79 Memory Controller
+ 0a89 MCP79 Memory Controller
+ 0aa0 MCP79 PCI Express Bridge
+ 0aa2 MCP79 SMBus
+ 19da a123 IONITX-F-E
+ 0aa3 MCP79 Co-processor
+ 19da a123 IONITX-F-E
+ 0aa4 MCP79 Memory Controller
+ 19da a123 IONITX-F-E
+ 0aa5 MCP79 OHCI USB 1.1 Controller
+ 19da a123 IONITX-F-E
+ 0aa6 MCP79 EHCI USB 2.0 Controller
+ 19da a123 IONITX-F-E
+ 0aa7 MCP79 OHCI USB 1.1 Controller
+ 19da a123 IONITX-F-E
+ 0aa8 MCP79 OHCI USB 1.1 Controller
+ 0aa9 MCP79 EHCI USB 2.0 Controller
+ 19da a123 IONITX-F-E
+ 0aaa MCP79 EHCI USB 2.0 Controller
+ 0aab MCP79 PCI Bridge
+ 0aac MCP79 LPC Bridge
+ 0aad MCP79 LPC Bridge
+ 19da a123 IONITX-F-E
+ 0aae MCP79 LPC Bridge
+ 0aaf MCP79 LPC Bridge
+ 0ab0 MCP79 Ethernet
+ 19da a123 IONITX-F-E
+ 0ab1 MCP79 Ethernet
+ 0ab2 MCP79 Ethernet
+ 0ab3 MCP79 Ethernet
+ 0ab4 MCP79 SATA Controller
+ 19da a123 IONITX-F-E
+ 0ab5 MCP79 SATA Controller
+ 0ab6 MCP79 SATA Controller
+ 0ab7 MCP79 SATA Controller
+ 0ab8 MCP79 AHCI Controller
+ 0ab9 MCP79 AHCI Controller
+ 0aba MCP79 AHCI Controller
+ 0abb MCP79 AHCI Controller
+ 0abc MCP79 RAID Controller
+ 0abd MCP79 RAID Controller
+ 0abe MCP79 RAID Controller
+ 0abf MCP79 RAID Controller
+ 0ac0 MCP79 High Definition Audio
+ 0ac1 MCP79 High Definition Audio
+ 0ac2 MCP79 High Definition Audio
+ 0ac3 MCP79 High Definition Audio
+ 0ac4 MCP79 PCI Express Bridge
+ 0ac5 MCP79 PCI Express Bridge
+ 0ac6 MCP79 PCI Express Bridge
+ 0ac7 MCP79 PCI Express Bridge
+ 0ac8 MCP79 PCI Express Bridge
+ 0ad0 MCP78S [GeForce 8200] SATA Controller (non-AHCI mode)
+ 1462 7508 K9N2GM-FIH
+ 1849 0ad0 K10N78FullHD-hSLI R3.0 IDE
+ 0ad4 MCP78S [GeForce 8200] AHCI Controller
+ 1043 82e8 M3N72-D
+ 1849 0ad4 K10N78FullHD-hSLI R3.0 AHCI Controller
+ 0ad8 MCP78S [GeForce 8200] SATA Controller (RAID mode)
+ 0be2 High Definition Audio Controller
+ 0be3 High Definition Audio Controller
+ 1028 040b Latitude E6510
+ 10de 066d G98 [GeForce 8400GS]
+ 0be4 High Definition Audio Controller
+ 0be5 GF100 High Definition Audio Controller
+ 0be9 GF106 High Definition Audio Controller
+ 1558 8687 CLEVO/KAPOK W860CU
+ 0bea GF108 High Definition Audio Controller
+ 0beb GF104 High Definition Audio Controller
+ 1462 2322 N460GTX Cyclone 1GD5/OC
+ 0ca0 GT215 [GeForce GT 330]
+ 0ca2 GT215 [GeForce GT 320]
+ 0ca3 GT215 [GeForce GT 240]
+ 0ca4 GT215 [GeForce GT 340]
+ 0ca7 GT215 [GeForce GT 330]
+ 0ca8 GT215 [GeForce GTS 260M]
+ 0ca9 GT215 [GeForce GTS 250M]
+ 0caf GT215 [GeForce GT 335M]
+ 0cb0 GT215 [GeForce GTS 350M]
+ 0cb1 GT215 [GeForce GTS 360M]
+ 0cbc GT215 [Quadro FX 1800M]
+ 0d60 MCP89 HOST Bridge
+ 0d68 MCP89 Memory Controller
+ 0d69 MCP89 Memory Controller
+ 0d76 MCP89 PCI Express Bridge
+ 0d79 MCP89 SMBus
+ 0d7a MCP89 Co-Processor
+ 0d7b MCP89 Memory Controller
+ 0d7d MCP89 Ethernet
+ 0d80 MCP89 LPC Bridge
+ 0d85 MCP89 SATA Controller
+ 0d88 MCP89 SATA Controller (AHCI mode)
+ 0d89 MCP89 SATA Controller (AHCI mode)
+ 0d8d MCP89 SATA Controller (RAID mode)
+ 0d94 MCP89 High Definition Audio
+ 0d9c MCP89 OHCI USB 1.1 Controller
+ 0d9d MCP89 EHCI USB 2.0 Controller
+ 0dc4 GF106 [GeForce 450 GTS]
+# rev a1
+ 0dd1 GF106 [GeForce GTX 460M]
+ 1558 8687 CLEVO/KAPOK W860CU
+ 0dd2 GF106 [GeForce GT 445M]
+ 0dd8 GF106GL [Quadro 2000]
+ 0dda GF106 [Quadro 2000M]
+ 0de1 GF108 [GeForce GT 430]
+ 0dee GF108 [Geforce GT 415M]
+ 0df4 GF106 [GeForce GT 555M SDDR3]
+ 0df8 GF108 [Quadro 600]
+ 0dfa GF108 [Quadro 1000M]
+ 0e08 HDMI Audio stub
+ 0e09 GF110 High Definition Audio Controller
+ 0e22 GF104 [GeForce GTX 460]
+ 1462 2322 N460GTX Cyclone 1GD5/OC
+ 0e3a GF104 [Quadro 3000M]
+ 0e3b GF104 [Quadro 4000M]
+ 1056 GF108 [Quadro NVS 4200M]
+ 1080 GF110 [Geforce GTX 580]
+ 1081 GF110 [Geforce GTX 570]
+ 10de 087e Leadtek WinFast GTX 570
+ 1086 GF110 [Geforce GTX 570 HD]
+ 10c3 GT218 [GeForce 8400 GS]
+ 10de 066d G98 [GeForce 8400GS]
+ 10c5 M116N
+ 10d8 GT218 [NVS 300]
+ 1200 GF110 [GeForce GTX 560 Ti]
+ 1244 GF116 [GeForce GTX 550 Ti]
+10df Emulex Corporation
+ 1ae5 LP6000 Fibre Channel Host Adapter
+ e100 Proteus-X: LightPulse IOV Fibre Channel Host Adapter
+ e131 LightPulse 8Gb/s PCIe Shared I/O Fibre Channel Adapter
+ e180 Proteus-X: LightPulse IOV Fibre Channel Host Adapter
+ e200 Lancer-X: LightPulse Fibre Channel Host Adapter
+ e208 LightPulse 16Gb Fibre Channel Host Adapter (Lancer-VF)
+ e220 OneConnect NIC (Lancer)
+ e240 OneConnect iSCSI Initiator (Lancer)
+ e260 OneConnect FCoE Initiator (Lancer)
+ e268 OneConnect 10Gb FCoE Converged Network Adapter (Lancer-VF)
+ f011 Saturn: LightPulse Fibre Channel Host Adapter
+ f015 Saturn: LightPulse Fibre Channel Host Adapter
+ f085 LP850 Fibre Channel Host Adapter
+ f095 LP952 Fibre Channel Host Adapter
+ f098 LP982 Fibre Channel Host Adapter
+ f0a1 Thor LightPulse Fibre Channel Host Adapter
+ f0a5 Thor LightPulse Fibre Channel Host Adapter
+ f0b5 Viper LightPulse Fibre Channel Host Adapter
+ f0d1 Helios LightPulse Fibre Channel Host Adapter
+ f0d5 Helios LightPulse Fibre Channel Host Adapter
+ f0e1 Zephyr LightPulse Fibre Channel Host Adapter
+ f0e5 Zephyr LightPulse Fibre Channel Host Adapter
+ f0f5 Neptune LightPulse Fibre Channel Host Adapter
+ f100 Saturn-X: LightPulse Fibre Channel Host Adapter
+ f111 Saturn-X LightPulse Fibre Channel Host Adapter
+ f112 Saturn-X LightPulse Fibre Channel Host Adapter
+ f180 LPSe12002 EmulexSecure Fibre Channel Adapter
+ f700 LP7000 Fibre Channel Host Adapter
+ f701 LP7000 Fibre Channel Host Adapter Alternate ID (JX1:2-3, JX2:1-2)
+ f800 LP8000 Fibre Channel Host Adapter
+ f801 LP8000 Fibre Channel Host Adapter Alternate ID (JX1:2-3, JX2:1-2)
+ f900 LP9000 Fibre Channel Host Adapter
+ f901 LP9000 Fibre Channel Host Adapter Alternate ID (JX1:2-3, JX2:1-2)
+ f980 LP9802 Fibre Channel Host Adapter
+ f981 LP9802 Fibre Channel Host Adapter Alternate ID
+ f982 LP9802 Fibre Channel Host Adapter Alternate ID
+ fa00 Thor-X LightPulse Fibre Channel Host Adapter
+ fb00 Viper LightPulse Fibre Channel Host Adapter
+ fc00 Thor-X LightPulse Fibre Channel Host Adapter
+ 10df fc00 LP10000 LightPulse Fibre Channel Host Adapter
+ fc10 Helios-X LightPulse Fibre Channel Host Adapter
+ fc20 Zephyr-X LightPulse Fibre Channel Host Adapter
+ fc40 Saturn-X: LightPulse Fibre Channel Host Adapter
+ fc50 Proteus-X: LightPulse IOV Fibre Channel Host Adapter
+ fd00 Helios-X LightPulse Fibre Channel Host Adapter
+ fd11 Helios-X LightPulse Fibre Channel Host Adapter
+ fd12 Helios-X LightPulse Fibre Channel Host Adapter
+ fe00 Zephyr-X LightPulse Fibre Channel Host Adapter
+ fe05 Zephyr-X: LightPulse FCoE Adapter
+ fe11 Zephyr-X LightPulse Fibre Channel Host Adapter
+ fe12 Zephyr-X LightPulse FCoE Adapter
+ ff00 Neptune LightPulse Fibre Channel Host Adapter
+10e0 Integrated Micro Solutions Inc.
+ 5026 IMS5026/27/28
+ 5027 IMS5027
+ 5028 IMS5028
+ 8849 IMS8849
+ 8853 IMS8853
+ 9128 IMS9128 [Twin turbo 128]
+10e1 Tekram Technology Co.,Ltd.
+ 0391 TRM-S1040
+ 10e1 0391 DC-315U SCSI-3 Host Adapter
+ 690c DC-690c
+ dc29 DC-290
+10e2 Aptix Corporation
+10e3 Tundra Semiconductor Corp.
+ 0000 CA91C042 [Universe]
+ 0108 Tsi108 Host Bridge for Single PowerPC
+ 0148 Tsi148 [Tempe]
+ 1775 1100 VR11 Single Board Computer
+ 0860 CA91C860 [QSpan]
+ 0862 CA91C862A [QSpan-II]
+ 8260 CA91L8200B [Dual PCI PowerSpan II]
+ 8261 CA91L8260B [Single PCI PowerSpan II]
+ a108 Tsi109 Host Bridge for Dual PowerPC
+10e4 Tandem Computers
+ 8029 Realtek 8029 Network Card
+10e5 Micro Industries Corporation
+10e6 Gainbery Computer Products Inc.
+10e7 Vadem
+10e8 Applied Micro Circuits Corp.
+ 1072 INES GPIB-PCI (AMCC5920 based)
+ 2011 Q-Motion Video Capture/Edit board
+ 4750 S5930 [Matchmaker]
+ 5920 S5920
+ 8043 LANai4.x [Myrinet LANai interface chip]
+ 8062 S5933_PARASTATION
+ 807d S5933 [Matchmaker]
+ 8088 Kongsberg Spacetec Format Synchronizer
+ 8089 Kongsberg Spacetec Serial Output Board
+ 809c S5933_HEPC3
+ 80b9 Harmonix Hi-Card P8 (4x active ISDN BRI)
+ 80d7 PCI-9112
+ 80d8 PCI-7200
+ 80d9 PCI-9118
+ 80da PCI-9812
+ 80fc APCI1500 Signal processing controller (16 dig. inputs + 16 dig. outputs)
+ 811a PCI-IEEE1355-DS-DE Interface
+ 814c Fastcom ESCC-PCI (Commtech, Inc.)
+ 8170 S5933 [Matchmaker] (Chipset Development Tool)
+ 81e6 Multimedia video controller
+ 828d APCI3001 Signal processing controller (up to 16 analog inputs)
+ 8291 Fastcom 232/8-PCI (Commtech, Inc.)
+ 82c4 Fastcom 422/4-PCI (Commtech, Inc.)
+ 82c5 Fastcom 422/2-PCI (Commtech, Inc.)
+ 82c6 Fastcom IG422/1-PCI (Commtech, Inc.)
+ 82c7 Fastcom IG232/2-PCI (Commtech, Inc.)
+ 82ca Fastcom 232/4-PCI (Commtech, Inc.)
+ 82db AJA HDNTV HD SDI Framestore
+ 82e2 Fastcom DIO24H-PCI (Commtech, Inc.)
+ 8406 PCIcanx/PCIcan CAN interface [Kvaser AB]
+ 8407 PCIcan II CAN interface (A1021, PCB-07, PCB-08) [Kvaser AB]
+ 8851 S5933 on Innes Corp FM Radio Capture card
+10e9 Alps Electric Co., Ltd.
+10ea Integraphics
+ 1680 IGA-1680
+ 1682 IGA-1682
+ 1683 IGA-1683
+ 2000 CyberPro 2000
+ 2010 CyberPro 2000A
+ 5000 CyberPro 5000
+ 5050 CyberPro 5050
+ 5202 CyberPro 5202
+# CyberPro5202 Audio Function
+ 5252 CyberPro5252
+10eb Artists Graphics
+ 0101 3GA
+ 8111 Twist3 Frame Grabber
+10ec Realtek Semiconductor Co., Ltd.
+ 0139 Zonet Zen3200
+ 0260 Realtek 260 High Definition Audio
+ 0261 Realtek 261 High Definition Audio
+ 0262 Realtek 262 High Definition Audio
+ 0269 Realtek ALC269 High Definition Audio (82801G)
+ 0280 Realtek 280 High Definition Audio
+ 0660 Realtek 660 High Definition Audio
+ 0662 Realtek 662 High Definition Audio
+ 0861 Realtek 861 High Definition Audio
+ 0862 Realtek 862 High Definition Audio
+ 0880 Realtek 880 High Definition Audio
+ 0883 Realtek 883 High Definition Audio
+ 1025 1605 TravelMate 5600 series
+ 0885 Realtek 885 High Definition Audio
+ 0888 Realtek 888 High Definition Audio
+ 1028 020d Inspiron 530
+ 8029 RTL-8029(AS)
+ 10b8 2011 EZ-Card (SMC1208)
+ 10ec 8029 RTL-8029(AS)
+ 1113 1208 EN1208
+ 1186 0300 DE-528
+ 1259 2400 AT-2400
+ 1af4 1100 Qemu virtual machine
+ 8129 RTL-8129
+ 10ec 8129 RT8129 Fast Ethernet Adapter
+ 11ec 8129 RT8129 Fast Ethernet Adapter
+ 8136 RTL8101E/RTL8102E PCI Express Fast Ethernet controller
+ 1179 ff64 RTL8102E PCI-E Fast Ethernet NIC
+ 8138 RT8139 (B/C) Cardbus Fast Ethernet Adapter
+ 10ec 8138 RT8139 (B/C) Fast Ethernet Adapter
+ 8139 RTL-8139/8139C/8139C+
+ 0357 000a TTP-Monitoring Card V2.0
+ 1025 005a TravelMate 290
+ 1025 8920 ALN-325
+ 1025 8921 ALN-325
+ 103c 006a NX9500
+ 103c 2a20 Pavilion t3030.de Desktop PC
+ 103c 30d9 Presario C700
+ 1043 1045 L8400B or L3C/S notebook
+ 1043 8109 P5P800-MX Mainboard
+ 1071 8160 MIM2000
+ 10bd 0320 EP-320X-R
+ 10f7 8338 Panasonic CF-Y5 laptop
+ 1113 ec01 FNC-0107TX
+ 1186 1300 DFE-538TX
+ 1186 1320 SN5200
+ 1186 8139 DRN-32TX
+ 11f6 8139 FN22-3(A) LinxPRO Ethernet Adapter
+ 1259 2500 AT-2500TX
+ 1259 2503 AT-2500TX/ACPI
+ 1385 f31d FA311 v2
+ 1395 2100 AMB2100
+ 1429 d010 ND010/ND012
+ 1432 9130 EN-9130TX
+ 1436 8139 RT8139
+ 144d c00c P30/P35 notebook
+ 1458 e000 GA-7VM400M/7VT600 Motherboard
+ 1462 0131 MS-1013 Notebook
+ 1462 217c Aspire L250
+ 1462 788c 865PE Neo2-V Mainboard
+ 146c 1439 FE-1439TX
+ 1489 6001 GF100TXRII
+ 1489 6002 GF100TXRA
+ 149c 139a LFE-8139ATX
+ 149c 8139 LFE-8139TX
+ 14cb 0200 LNR-100 Family 10/100 Base-TX Ethernet
+ 1565 2300 P4TSV Onboard LAN (RTL8100B)
+ 1631 7003 Onboard RTL8111 on GA-8SIML Rev1.0 Mainboard
+ 1695 9001 Onboard RTL8101L 10/100 MBit
+ 16ec 00ff USR997900A
+ 1799 5000 F5D5000 PCI Card/Desktop Network PCI Card
+ 1799 5010 F5D5010 CardBus Notebook Network Card
+ 187e 3303 FN312
+ 1904 8139 RTL8139D Fast Ethernet Adapter
+ 2646 0001 KNE120TX
+ 8e2e 7000 KF-230TX
+ 8e2e 7100 KF-230TX/2
+ a0a0 0007 ALN-325C
+ 8167 RTL-8110SC/8169SC Gigabit Ethernet
+ 1458 e000 GA-MA69G-S3H Motherboard
+ 1462 235c P965 Neo MS-7235 mainboard
+ 1462 236c 945P Neo3-F motherboard
+ 8168 RTL8111/8168B PCI Express Gigabit Ethernet controller
+ 1019 8168 MCP73PVT-SM
+ 103c 1611 Pavilion DM1Z-3000
+ 1043 11f5 A6J-Q008
+ 1043 16d5 U6V/U31J laptop
+ 1043 81aa P5B
+ 1043 82c6 M3A78-EH Motherboard
+ 1043 83a3 M4A785TD Motherboard
+ 1043 8432 P8P67 Deluxe Motherboard [Realtek RTL8111E]
+ 10ec 8168 TEG-ECTX Gigabit PCI-E Adapter [Trendnet]
+ 1458 e000 GA-EP45-DS5 Motherboard
+ 1462 238c Onboard RTL8111b on MSI P965 Platinum Mainboard
+ 1462 368c K9AG Neo2
+ 1775 11cc CC11/CL11
+ 1849 8168 Motherboard (one of many)
+ 8086 d615 DeskTop Board D510MO
+ 8169 RTL-8169 Gigabit Ethernet
+ 1025 0079 Aspire 5024WLMi
+ 10bd 3202 EP-320G-TX1 32-bit PCI Gigabit Ethernet Adapter
+ 10ec 8169 RTL8169/8110 Family PCI Gigabit Ethernet NIC
+ 1259 c107 CG-LAPCIGT
+ 1371 434e ProG-2000L
+ 1385 311a GA311
+ 1458 e000 GA-8I915ME-G Mainboard
+ 1462 030c K8N Neo-FSR v2.0 mainboard
+ 1462 065c Hetis 865GV-E (MS-7065)
+ 1462 702c K8T NEO 2 motherboard
+ 1462 7094 K8T Neo2-F V2.0
+ 16ec 011f USR997903
+ 1734 1091 D2030-A1
+ a0a0 0449 AK86-L motherboard
+ 8171 RTL8191SEvA Wireless LAN Controller
+ 8172 RTL8191SEvB Wireless LAN Controller
+ 8173 RTL8192SE Wireless LAN Controller
+ 8174 RTL8192SE Wireless LAN Controller
+ 8176 RTL8188CE 802.11b/g/n WiFi Adapter
+ 8177 RTL8188CE 802.11b/g/n WiFi Adapter
+ 8178 RTL8188CE 802.11b/g/n WiFi Adapter
+ 8180 RTL8180L 802.11b MAC
+ 1385 4700 MA521 802.11b Wireless PC Card
+ 1737 0019 WPC11v4 802.11b Wireless-B Notebook Adapter
+ 8185 RTL-8185 IEEE 802.11a/b/g Wireless LAN Controller
+ 8191 RTL8188CE 802.11b/g/n WiFi Adapter
+ 8192 RTL8192E/RTL8192SE Wireless LAN Controller
+ 8197 SmartLAN56 56K Modem
+ 8199 RTL8187SE Wireless LAN Controller
+10ed Ascii Corporation
+ 7310 V7310
+10ee Xilinx Corporation
+ 0001 EUROCOM for PCI (ECOMP)
+ 0002 Octal E1/T1 for PCI ETP Card
+ 0007 Zomojo Z1
+ 0205 Wildcard TE205P
+ 0210 Wildcard TE210P
+ 0314 Wildcard TE405P/TE410P (1st Gen)
+ 0405 Wildcard TE405P (2nd Gen)
+ 0410 Wildcard TE410P (2nd Gen)
+ 2b00 Zomojo Zcard
+ 3fc0 RME Digi96
+ 3fc1 RME Digi96/8
+ 3fc2 RME Digi96/8 Pro
+ 3fc3 RME Digi96/8 Pad
+ 3fc4 RME Digi9652 (Hammerfall)
+ 3fc5 RME Hammerfall DSP
+ 3fc6 RME Hammerfall DSP MADI
+ 8380 Ellips ProfiXpress Profibus Master
+ 8381 Ellips Santos Frame Grabber
+ d154 Copley Controls CAN card (PCI-CAN-02)
+# SED is assigned Xilinx PCI device IDs ebf0 through ebff
+ ebf0 SED Systems Modulator/Demodulator
+ ebf1 SED Systems Audio Interface Card
+ ebf2 SED Systems Common PCI Interface
+10ef Racore Computer Products, Inc.
+ 8154 M815x Token Ring Adapter
+10f0 Peritek Corporation
+10f1 Tyan Computer
+ 2865 Tyan Thunder K8E S2865
+ 5300 Tyan S5380 Mainboard
+10f2 Achme Computer, Inc.
+10f3 Alaris, Inc.
+10f4 S-MOS Systems, Inc.
+10f5 NKK Corporation
+ a001 NDR4000 [NR4600 Bridge]
+10f6 Creative Electronic Systems SA
+10f7 Matsushita Electric Industrial Co., Ltd.
+10f8 Altos India Ltd
+10f9 PC Direct
+10fa Truevision
+ 000c TARGA 1000
+10fb Thesys Gesellschaft fuer Mikroelektronik mbH
+ 186f TH 6255
+10fc I-O Data Device, Inc.
+# What's in the cardbus end of a Sony ACR-A01 card, comes with newer Vaio CD-RW drives
+ 0003 Cardbus IDE Controller
+ 0005 Cardbus SCSI CBSC II
+10fd Soyo Computer, Inc
+10fe Fast Multimedia AG
+10ff NCube
+1100 Jazz Multimedia
+1101 Initio Corporation
+ 0002 INI-920 Ultra SCSI Adapter
+ 1060 INI-A100U2W
+ 1622 INI-1623 PCI SATA-II Controller
+ 9100 INI-9100/9100W
+ 9400 INI-940 Fast Wide SCSI Adapter
+ 9401 INI-935 Fast Wide SCSI Adapter
+ 9500 INI-950 SCSI Adapter
+ 9502 INI-950P Ultra Wide SCSI Adapter
+1102 Creative Labs
+ 0002 SB Live! EMU10k1
+ 100a 1102 SB Live! 5.1 Digital OEM SB0220 EMU10K1-JFF
+ 1102 0020 CT4850 SBLive! Value
+ 1102 0021 CT4620 SBLive!
+ 1102 002f SBLive! mainboard implementation
+ 1102 100a SB Live! 5.1 Digital OEM [SB0220]
+ 1102 4001 E-mu APS
+ 1102 8022 CT4780 SBLive! Value
+ 1102 8023 CT4790 SoundBlaster PCI512
+ 1102 8024 CT4760 SBLive!
+ 1102 8025 SBLive! Mainboard Implementation
+ 1102 8026 CT4830 SBLive! Value
+ 1102 8027 CT4832 SBLive! Value
+ 1102 8028 CT4760 SBLive! OEM version
+ 1102 8031 CT4831 SBLive! Value
+ 1102 8040 CT4760 SBLive!
+ 1102 8051 CT4850 SBLive! Value
+ 1102 8061 SBLive! Player 5.1
+ 1102 8064 SBLive! 5.1 Model SB0100
+ 1102 8065 SBLive! 5.1 Digital Model SB0220
+ 1102 8066 Live! 5.1 Digital [SB0228]
+ 1102 8067 SBLive! 5.1 eMicro 28028
+ 0004 SB Audigy
+ 1102 0051 SB0090 Audigy Player
+ 1102 0053 SB0090 Audigy Player/OEM
+ 1102 0058 SB0090 Audigy Player/OEM
+ 1102 1002 SB Audigy2 Platinum
+ 1102 1007 SB0240 Audigy 2 Platinum 6.1
+ 1102 1009 SB Audigy2 OEM HP
+ 1102 2002 SB Audigy 2 ZS (SB0350)
+ 1102 4001 E-MU 1010
+ 0005 SB X-Fi
+ 1102 0021 X-Fi Platinum
+ 1102 002c X-Fi XtremeGamer FATAL1TY PRO
+ 1102 1003 X-Fi XtremeMusic
+ 0006 [SB Live! Value] EMU10k1X
+ 0007 CA0106 Soundblaster
+ 1102 0007 SBLive! 24bit
+ 1102 1001 SB0310 Audigy LS
+ 1102 1002 SB0312 Audigy LS
+ 1102 1006 SB0410 SBLive! 24-bit
+ 1102 100a SB0570 [SB Audigy SE]
+ 1102 1012 SB0790 X-Fi XA
+ 1102 1013 Soundblaster X-Fi Xtreme Audio
+ 1462 1009 K8N Diamond
+ 0008 SB0400 Audigy2 Value
+ 1102 0008 EMU0404 Digital Audio System
+ 1102 4004 EMU1010 Digital Audio System [MAEM8960]
+ 0009 [SB X-Fi Xtreme Audio] CA0110-IBG
+ 1102 0010 [SB X-Fi Xtreme Audio] CA0110-IBG
+ 1102 0018 SB1040
+ 000b X-Fi Titanium series [EMU20k2]
+ 1102 0041 SB X-Fi Titanium PCI-e [SB0880]
+ 4001 SB Audigy FireWire Port
+ 1102 0010 SB Audigy FireWire Port
+ 7002 SB Live! Game Port
+ 1102 0020 Gameport Joystick
+ 7003 SB Audigy Game Port
+ 1102 0040 SB Audigy Game Port
+ 1102 0060 SB Audigy2 MIDI/Game Port
+ 7004 [SB Live! Value] Input device controller
+ 7005 SB Audigy LS Game Port
+ 1102 1001 SB0310 Audigy LS MIDI/Game port
+ 1102 1002 SB0312 Audigy LS MIDI/Game port
+ 7006 [SB X-Fi Xtreme Audio] CA0110-IBG PCI to PCIe Bridge
+ 8938 Ectiva EV1938
+ 1033 80e5 SlimTower-Jim (NEC)
+ 1071 7150 Mitac 7150
+ 110a 5938 Siemens Scenic Mobile 510PIII
+ 13bd 100c Ceres-C (Sharp, Intel BX)
+ 13bd 100d Sharp, Intel Banister
+ 13bd 100e TwinHead P09S/P09S3 (Sharp)
+ 13bd f6f1 Marlin (Sharp)
+ 14ff 0e70 P88TE (TWINHEAD INTERNATIONAL Corp)
+ 14ff c401 Notebook 9100/9200/2000 (TWINHEAD INTERNATIONAL Corp)
+ 156d b400 G400 - Geo (AlphaTop (Taiwan))
+ 156d b550 G560 (AlphaTop (Taiwan))
+ 156d b560 G560 (AlphaTop (Taiwan))
+ 156d b700 G700/U700 (AlphaTop (Taiwan))
+ 156d b795 G795 (AlphaTop (Taiwan))
+ 156d b797 G797 (AlphaTop (Taiwan))
+# nee Triones Technologies, Inc.
+1103 HighPoint Technologies, Inc.
+ 0003 HPT343/345/346/363
+ 0004 HPT366/368/370/370A/372/372N
+ 1103 0001 HPT370A
+ 1103 0004 HPT366 UDMA66 (r1) / HPT368 UDMA66 (r2) / HPT370 UDMA100 (r3) / HPT370 UDMA100 RAID (r4)
+ 1103 0005 HPT370 UDMA100
+ 1103 0006 HPT302/302N
+ 0005 HPT372A/372N
+ 0006 HPT302/302N
+ 0007 HPT371/371N
+ 0008 HPT374
+ 0009 HPT372N
+ 1720 RocketRAID 1720 (2x SATA II RAID Controller)
+ 1740 RocketRAID 1740
+ 1742 RocketRAID 1742
+ 2210 RocketRAID 2210 SATA-II Controller
+ 2300 RocketRAID 230x 4 Port SATA-II Controller
+ 2310 RocketRAID 2310 4 Port SATA-II Controller
+ 2320 RocketRAID 2320 SATA-II Controller
+ 2322 RocketRAID 2322 SATA-II Controller
+ 2340 RocketRAID 2340 16 Port SATA-II Controller
+ 2640 RocketRAID 2640 SAS/SATA Controller
+ 2722 RocketRAID 2722
+ 3220 RocketRAID 3220
+ 3320 RocketRAID 3320
+1104 RasterOps Corp.
+1105 Sigma Designs, Inc.
+ 1105 REALmagic Xcard MPEG 1/2/3/4 DVD Decoder
+ 8300 REALmagic Hollywood Plus DVD Decoder
+ 8400 EM840x REALmagic DVD/MPEG-2 Audio/Video Decoder
+ 8401 EM8401 REALmagic DVD/MPEG-2 A/V Decoder
+ 8470 EM8470 REALmagic DVD/MPEG-4 A/V Decoder
+ 8471 EM8471 REALmagic DVD/MPEG-4 A/V Decoder
+ 8475 EM8475 REALmagic DVD/MPEG-4 A/V Decoder
+ 1105 0001 REALmagic X-Card
+ 8476 EM8476 REALmagic DVD/MPEG-4 A/V Decoder
+ 127d 0000 CineView II
+ 8485 EM8485 REALmagic DVD/MPEG-4 A/V Decoder
+ 8486 EM8486 REALmagic DVD/MPEG-4 A/V Decoder
+ c622 EM8622L MPEG-4.10 (H.264) and SMPTE 421M (VC-1) A/V Decoder
+1106 VIA Technologies, Inc.
+ 0102 Embedded VIA Ethernet Controller
+ 0130 VT6305 1394.A Controller
+ 0198 P4X600 Host Bridge
+ 0204 K8M800 Host Bridge
+ 0208 PT890 Host Bridge
+ 0238 K8T890 Host Bridge
+ 0258 PT880 Host Bridge
+ 0259 CN333/CN400/PM880 Host Bridge
+ 0269 KT880 Host Bridge
+ 0282 K8T800Pro Host Bridge
+ 1043 80a3 A8V Deluxe
+ 0290 K8M890 Host Bridge
+ 0293 PM896 Host Bridge
+ 0296 P4M800 Host Bridge
+ 0305 VT8363/8365 [KT133/KM133]
+ 1019 0987 K7VZA Mainboard
+ 1043 8033 A7V Mainboard
+ 1043 803e A7V-E Mainboard
+ 1043 8042 A7V133/A7V133-C Mainboard
+ 147b a401 KT7/KT7-RAID/KT7A/KT7A-RAID Mainboard
+ 0308 PT880 Ultra/PT894 Host Bridge
+ 1043 8199 P4V800D-X Mainboard
+ 0314 CN700/VN800/P4M800CE/Pro Host Bridge
+ 0324 CX700/VX700 Host Bridge
+ 0327 P4M890 Host Bridge
+ 0336 K8M890CE Host Bridge
+ 0340 PT900 Host Bridge
+ 0351 K8T890CF Host Bridge
+ 0353 VX800 Host Bridge
+ 0364 CN896/VN896/P4M900 Host Bridge
+ 1043 81ce P5VD2-VM mothervoard
+ 0391 VT8371 [KX133]
+ 0397 VT1708S HD Audio
+ 1043 836c P7H55
+ 1043 83c7 P5KPL-AM EPU
+ 0409 VX855/VX875 Host Bridge: Host Control
+ 0415 VT6415 PATA IDE Host Controller
+ 1043 838f M5A88-V EVO
+ 0501 VT8501 [Apollo MVP4]
+ 0505 VT82C505
+# Shares chip with :0576. The VT82C576M has :1571 instead of :0561.
+ 0561 VT82C576MV
+ 0571 VT82C586A/B/VT82C686/A/B/VT823x/A/C PIPC Bus Master IDE
+ 1019 0985 P6VXA Motherboard
+ 1019 0a81 L7VTA v1.0 Motherboard (KT400-8235)
+ 1043 8052 VT8233A Bus Master ATA100/66/33 IDE
+ 1043 808c A7V8X / A7V333 motherboard
+ 1043 80a1 A7V8X-X motherboard rev. 1.01
+ 1043 80ed A7V600/K8V-X/A8V Deluxe motherboard
+ 1106 0571 VT82C586/B/VT82C686/A/B/VT8233/A/C/VT8235 PIPC Bus Master IDE
+ 1179 0001 Magnia Z310
+ 1297 f641 FX41 motherboard
+ 1458 5002 GA-7VAX Mainboard
+ 1462 5901 KT6 Delta-FIS2R (MS-6590)
+ 1462 7020 K8T NEO 2 motherboard
+ 1462 7094 K8T Neo2-F V2.0
+ 1462 7120 KT4AV motherboard
+ 1462 7181 K8MM3-V mainboard
+ 147b 1407 KV8-MAX3 motherboard
+ 1849 0571 K7VT2/K7VT6 motherboard
+ 0576 VT82C576 3V [Apollo Master]
+ 0581 CX700/VX700 RAID Controller
+# Upgrade bios to get correct ID: 5324 instead of 0581
+ 1106 0581 Wrong IDE ID
+ 0585 VT82C585VP [Apollo VP1/VPX]
+ 0586 VT82C586/A/B PCI-to-ISA [Apollo VP]
+ 1106 0000 MVP3 ISA Bridge
+ 0591 VT8237A SATA 2-Port Controller
+ 0595 VT82C595 [Apollo VP2]
+ 0596 VT82C596 ISA [Mobile South]
+ 1106 0000 VT82C596/A/B PCI to ISA Bridge
+ 1458 0596 VT82C596/A/B PCI to ISA Bridge
+ 0597 VT82C597 [Apollo VP3]
+ 0598 VT82C598 [Apollo MVP3]
+ 0601 VT8601 [Apollo ProMedia]
+ 0605 VT8605 [ProSavage PM133]
+ 103c 1254 D9840-60001 [Brio BA410 Motherboard]
+ 1043 802c CUV4X mainboard
+ 0680 VT82C680 [Apollo P6]
+ 0686 VT82C686 [Apollo Super South]
+ 1019 0985 P6VXA Motherboard
+ 103c 1256 D9840-60001 [Brio BA410 Motherboard]
+ 1043 802c CUV4X mainboard
+ 1043 8033 A7V Mainboard
+ 1043 803e A7V-E Mainboard
+ 1043 8040 A7M266 Mainboard
+ 1043 8042 A7V133/A7V133-C Mainboard
+ 1106 0000 VT82C686/A PCI to ISA Bridge
+ 1106 0686 VT82C686/A PCI to ISA Bridge
+ 1179 0001 Magnia Z310
+ 147b a702 KG7-Lite Mainboard
+ 0691 VT82C693A/694x [Apollo PRO133x]
+ 1019 0985 P6VXA Motherboard
+ 1179 0001 Magnia Z310
+ 1458 0691 VT82C691 Apollo Pro System Controller
+ 0693 VT82C693 [Apollo Pro Plus]
+ 0698 VT82C693A [Apollo Pro133 AGP]
+ 0926 VT82C926 [Amazon]
+ 1000 VT82C570MV
+ 1106 VT82C570MV
+ 1122 VX800/VX820 Chrome 9 HC3 Integrated Graphics
+ 1204 K8M800 Host Bridge
+ 1208 PT890 Host Bridge
+ 1238 K8T890 Host Bridge
+ 1258 PT880 Host Bridge
+ 1259 CN333/CN400/PM880 Host Bridge
+ 1269 KT880 Host Bridge
+ 1282 K8T800Pro Host Bridge
+ 1290 K8M890 Host Bridge
+ 1293 PM896 Host Bridge
+ 1296 P4M800 Host Bridge
+ 1308 PT894 Host Bridge
+ 1314 CN700/VN800/P4M800CE/Pro Host Bridge
+ 1324 CX700/VX700 Host Bridge
+ 1327 P4M890 Host Bridge
+ 1336 K8M890CE Host Bridge
+ 1340 PT900 Host Bridge
+ 1351 VT3351 Host Bridge
+ 1353 VX800/VX820 Error Reporting
+ 1364 CN896/VN896/P4M900 Host Bridge
+ 1409 VX855/VX875 Error Reporting
+ 1571 VT82C576M/VT82C586
+ 1595 VT82C595/97 [Apollo VP2/97]
+ 1732 VT1732 [Envy24 II] PCI Multi-Channel Audio Controller
+ 2106 VIA Rhine Family Fast Ethernet Adapter (VT6105)
+ 2204 K8M800 Host Bridge
+ 2208 PT890 Host Bridge
+ 2238 K8T890 Host Bridge
+ 2258 PT880 Host Bridge
+ 2259 CN333/CN400/PM880 CPU Host Bridge
+ 2269 KT880 Host Bridge
+ 2282 K8T800Pro Host Bridge
+ 2290 K8M890 Host Bridge
+ 2293 PM896 Host Bridge
+ 2296 P4M800 Host Bridge
+ 2308 PT894 Host Bridge
+ 2314 CN700/VN800/P4M800CE/Pro Host Bridge
+ 2324 CX700/VX700 Host Bridge
+ 2327 P4M890 Host Bridge
+ 2336 K8M890CE Host Bridge
+ 2340 PT900 Host Bridge
+ 2351 VT3351 Host Bridge
+ 2353 VX800/VX820 Host Bus Control
+ 2364 CN896/VN896/P4M900 Host Bridge
+ 2409 VX855/VX875 Host Bus Control
+ 287a VT8251 PCI to PCI Bridge
+ 287b VT8251 Host Bridge
+ 287c VT8251 PCIE Root Port
+ 287d VT8251 PCIE Root Port
+ 287e VT8251 Ultra VLINK Controller
+ 3022 CLE266
+ 3038 VT82xxxxx UHCI USB 1.1 Controller
+# possibly Hewlett-Packard D9840-60001 [Brio BA410 Motherboard]
+ 0925 1234 VA-502 Mainboard
+ 1019 0985 P6VXA Motherboard
+ 1019 0a81 L7VTA v1.0 Motherboard (KT400-8235)
+ 1043 8080 A7V333 motherboard
+ 1043 808c VT6202 USB2.0 4 port controller
+ 1043 80a1 A7V8X-X motherboard
+ 1043 80ed A7V600/K8V-X/A8V Deluxe motherboard
+ 1179 0001 Magnia Z310
+ 1458 5004 GA-7VAX Mainboard
+ 1462 5901 KT6 Delta-FIS2R (MS-6590)
+ 1462 7020 K8T NEO 2 motherboard
+ 1462 7094 K8T Neo2-F V2.0
+ 1462 7120 KT4AV motherboard
+ 1462 7181 K8MM3-V mainboard
+ 147b 1407 KV8-MAX3 motherboard
+ 182d 201d CN-029 USB2.0 4 port PCI Card
+ 1849 3038 K7VT6
+ 3040 VT82C586B ACPI
+ 3043 VT86C100A [Rhine]
+ 10bd 0000 VT86C100A Fast Ethernet Adapter
+ 1106 0100 VT86C100A Fast Ethernet Adapter
+ 1186 1400 DFE-530TX rev A
+ 3044 VT6306/7/8 [Fire II(M)] IEEE 1394 OHCI Controller
+ 0010 0001 IEEE 1394 4port DCST 1394-3+1B
+ 1025 005a TravelMate 290
+ 103c 2a20 Pavilion t3030.de Desktop PC
+ 1043 808a A8V/A8N/P4P800 series motherboard
+ 1043 81fe M4A series motherboard
+ 1458 1000 GA-7VT600-1394 Motherboard
+ 1462 207d K8NGM2 series motherboard
+ 1462 217d Aspire L250
+ 1462 590d KT6 Delta-FIS2R (MS-6590)
+ 1462 702d K8T NEO 2 motherboard
+ 1462 971d MS-6917
+ 3050 VT82C596 Power Management
+ 3051 VT82C596 Power Management
+ 3053 VT6105M [Rhine-III]
+ 3057 VT82C686 [Apollo Super ACPI]
+ 1019 0985 P6VXA Motherboard
+ 1019 0987 K7VZA Motherboard
+ 1043 8033 A7V Mainboard
+ 1043 803e A7V-E Mainboard
+ 1043 8040 A7M266 Mainboard
+ 1043 8042 A7V133/A7V133-C Mainboard
+ 1179 0001 Magnia Z310
+ 3058 VT82C686 AC97 Audio Controller
+ 0e11 0097 SoundMax Digital Integrated Audio
+ 0e11 b194 Soundmax integrated digital audio
+ 1019 0985 P6VXA Motherboard
+ 1019 0987 K7VZA Motherboard
+ 103c 1251 D9840-60001 [Brio BA410 Motherboard]
+ 1043 1106 A7V133/A7V133-C Mainboard
+ 1106 4511 Onboard Audio on EP7KXA
+ 1106 aa03 VT1612A AC'97 Audio Controller
+ 11d4 5348 AD1881A audio
+ 1458 7600 Onboard Audio
+ 1462 3091 MS-6309 Onboard Audio
+ 1462 3092 MS-6309 v2.x Mainboard (VIA VT1611A codec)
+ 1462 3300 MS-6330 Onboard Audio
+ 15dd 7609 Onboard Audio
+ 3059 VT8233/A/8235/8237 AC97 Audio Controller
+ 1019 0a81 L7VTA v1.0 Motherboard (KT400-8235)
+ 1019 1877 K8M800-M2 (V2.0) onboard audio
+ 1043 8095 A7V8X Motherboard (Realtek ALC650 codec)
+ 1043 80a1 A7V8X-X Motherboard
+ 1043 80b0 A7V600/K8V-X/K8V Deluxe motherboard (ADI AD1980 codec [SoundMAX])
+ 1043 810d Asus P5VD1-X (AD1888 codec [SoundMax])
+ 1043 812a A8V Deluxe motherboard (Realtek ALC850 codec)
+ 10ec 8168 High Definition Audio
+ 1106 3059 L7VMM2 Motherboard
+ 1106 4161 K7VT2 motherboard
+ 1106 4170 PCPartner P4M800-8237R Motherboard
+ 1106 4552 Soyo KT-600 Dragon Plus (Realtek ALC 650)
+ 1297 c160 FX41 motherboard (Realtek ALC650 codec)
+ 1413 147b KV8 Pro motherboard onboard audio
+ 1458 a002 GA-7VAX Onboard Audio (Realtek ALC650)
+ 1462 0080 K8T NEO 2 motherboard
+ 1462 3800 KT266 onboard audio
+ 1462 5901 KT6 Delta-FIS2R (MS-6590)
+ 1462 7181 K8MM3-V mainboard
+ 147b 1407 KV8-MAX3 motherboard
+ 1695 300c EP-8KRA2+ Mainboard
+ 1849 0850 ASRock 775Dual-880 Pro onboard audio (Realtek ALC850)
+ 1849 9739 P4VT8 Mainboard (C-Media CMI9739A codec)
+ 1849 9761 K7VT6 motherboard
+ 4005 4710 MSI K7T266 Pro2-RU (MSI-6380 v2) onboard audio (Realtek/ALC 200/200P)
+ a0a0 01b6 AK77-8XN onboard audio
+ a0a0 0342 AK86-L motherboard
+ 3065 VT6102 [Rhine-II]
+ 1043 80a1 A7V8X-X Motherboard
+ 1043 80ed A7V600-X Motherboard
+ 1106 0102 VT6102 [Rhine II] Embeded Ethernet Controller on VT8235
+ 1186 1400 DFE-530TX rev A
+ 1186 1401 DFE-530TX rev B
+ 13b9 1421 LD-10/100AL PCI Fast Ethernet Adapter (rev.B)
+ 1462 7061 MS-7061
+ 1462 7181 K8MM3-V mainboard
+ 147b 1c09 NV7 Motherboard
+ 1695 3005 VT6103
+ 1695 300c Realtek ALC655 sound chip
+ 1849 3065 K7VT6 motherboard
+# This hosts more than just the Intel 537 codec, it also hosts PCtel (SIL33) and SmartLink (SIL34) codecs
+ 3068 AC'97 Modem Controller
+ 1462 309e MS-6309 Saturn Motherboard
+ 3074 VT8233 PCI to ISA Bridge
+ 1043 8052 VT8233A
+ 3091 VT8633 [Apollo Pro266]
+ 3099 VT8366/A/7 [Apollo KT266/A/333]
+ 1043 8064 A7V266-E Mainboard
+ 1043 807f A7V333 Mainboard
+ 1849 3099 K7VT2 motherboard
+ 3101 VT8653 Host Bridge
+ 3102 VT8662 Host Bridge
+ 3103 VT8615 Host Bridge
+ 3104 USB 2.0
+ 1019 0a81 L7VTA v1.0 Motherboard (KT400-8235)
+ 1043 808c A7V8X motherboard
+ 1043 80a1 A7V8X-X motherboard rev 1.01
+ 1043 80ed A7V600/K8V-X/A8V Deluxe motherboard
+ 1297 f641 FX41 motherboard
+ 1458 5004 GA-7VAX Mainboard
+ 1462 5901 KT6 Delta-FIS2R (MS-6590)
+ 1462 7020 K8T NEO 2 motherboard
+ 1462 7094 K8T Neo2-F V2.0
+ 1462 7120 KT4AV motherboard
+ 1462 7181 K8MM3-V mainboard
+ 147b 1407 KV8-MAX3 motherboard
+ 182d 201d CN-029 USB 2.0 4 port PCI Card
+ 1849 3104 K7VT6 motherboard
+ 3106 VT6105/VT6106S [Rhine-III]
+ 1106 0105 VT6106S [Rhine-III]
+ 1186 1403 DFE-530TX rev C
+ 1186 1406 DFE-530TX+ rev F2
+ 1186 1407 DFE-538TX
+ 3108 K8M800/K8N800/K8N800A [S3 UniChrome Pro]
+ 3109 VT8233C PCI to ISA Bridge
+ 3112 VT8361 [KLE133] Host Bridge
+ 3113 VPX/VPX2 PCI to PCI Bridge Controller
+ 3116 VT8375 [KM266/KL266] Host Bridge
+ 1297 f641 FX41 motherboard
+ 3118 CN400/PM800/PM880/PN800/PN880 [S3 UniChrome Pro]
+ 3119 VT6120/VT6121/VT6122 Gigabit Ethernet Adapter
+ 3122 VT8623 [Apollo CLE266] integrated CastleRock graphics
+ 3123 VT8623 [Apollo CLE266]
+ 3128 VT8753 [P4X266 AGP]
+ 3133 VT3133 Host Bridge
+ 3142 VT6651 WiFi Adapter, 802.11b
+ 3147 VT8233A ISA Bridge
+ 1043 808c A7V333 motherboard
+ 3148 P4M266 Host Bridge
+ 3149 VIA VT6420 SATA RAID Controller
+ 1043 80ed A7V600/K8V Deluxe/K8V-X/A8V Deluxe motherboard
+ 1458 b003 GA-7VM400AM(F) Motherboard
+ 1462 5901 KT6 Delta-FIS2R (MS-6590)
+ 1462 7020 K8T Neo 2 Motherboard
+ 1462 7094 K8T Neo2-F V2.0
+ 1462 7181 K8MM3-V mainboard
+ 147b 1407 KV8-MAX3 motherboard
+ 147b 1408 KV7
+ 1849 3149 K7VT6 motherboard
+ a0a0 04ad AK86-L motherboard
+ 3156 P/KN266 Host Bridge
+ 3157 CX700/VX700 [S3 UniChrome Pro]
+ 3164 VT6410 ATA133 RAID controller
+ 1043 80f4 P4P800 Mainboard Deluxe ATX
+ 1462 7028 915P/G Neo2
+ 3168 P4X333/P4X400/PT800 AGP Bridge
+ 1849 3168 P4VT8 Mainboard
+ 3177 VT8235 ISA Bridge
+ 1019 0a81 L7VTA v1.0 Motherboard (KT400-8235)
+ 1043 808c A7V8X motherboard
+ 1043 80a1 A7V8X-X motherboard
+ 1106 0000 KT4AV motherboard
+ 1297 f641 FX41 motherboard
+ 1458 5001 GA-7VAX Mainboard
+ 1849 3177 K7VT2 motherboard
+ 3178 ProSavageDDR P4N333 Host Bridge
+ 3188 VT8385 [K8T800 AGP] Host Bridge
+ 1043 80a3 K8V Deluxe/K8V-X motherboard
+ 147b 1407 KV8-MAX3 motherboard
+ 3189 VT8377 [KT400/KT600 AGP] Host Bridge
+ 1043 807f A7V8X motherboard
+ 1106 0000 KT4AV motherboard (KT400A)
+ 1458 5000 GA-7VAX Mainboard
+ 1849 3189 K7VT6 motherboard
+ 3204 K8M800 Host Bridge
+ 3205 VT8378 [KM400/A] Chipset Host Bridge
+ 1458 5000 GA-7VM400M Motherboard
+ 3208 PT890 Host Bridge
+ 3213 VPX/VPX2 PCI to PCI Bridge Controller
+ 3218 K8T800M Host Bridge
+ 3227 VT8237 ISA bridge [KT600/K8T800/K8T890 South]
+ 1043 80ed A7V600/K8V-X/A8V Deluxe motherboard
+ 1106 3227 DFI KT600-AL / Soltek SL-B9D-FGR Motherboard
+ 1458 5001 GA-7VT600 Motherboard
+ 147b 1407 KV8-MAX3 motherboard
+ 1849 3227 K7VT4 motherboard
+ 3230 K8M890CE/K8N890CE [Chrome 9]
+ 3238 K8T890 Host Bridge
+ 3249 VT6421 IDE RAID Controller
+ 324a CX700/VX700 PCI to PCI Bridge
+ 324b CX700/VX700 Host Bridge
+ 324e CX700/VX700 Internal Module Bus
+ 3253 VT6655 WiFi Adapter, 802.11a/b/g
+ 3258 PT880 Host Bridge
+ 3259 CN333/CN400/PM880 Host Bridge
+ 3260 VIA Chrome9 HC IGP
+ 3269 KT880 Host Bridge
+ 3282 K8T800Pro Host Bridge
+ 3287 VT8251 PCI to ISA Bridge
+ 3288 VT1708/A [Azalia HDAC] (VIA High Definition Audio Controller)
+ 3290 K8M890 Host Bridge
+ 3296 P4M800 Host Bridge
+ 3324 CX700/VX700 Host Bridge
+ 3327 P4M890 Host Bridge
+ 3336 K8M890CE Host Bridge
+ 3337 VT8237A PCI to ISA Bridge
+ 3340 PT900 Host Bridge
+ 3343 P4M890 [S3 UniChrome Pro]
+ 3344 CN700/P4M800 Pro/P4M800 CE/VN800 [S3 UniChrome Pro]
+ 3349 VT8251 AHCI/SATA 4-Port Controller
+ 3351 VT3351 Host Bridge
+ 3353 VX800 PCI to PCI Bridge
+ 3364 CN896/VN896/P4M900 Host Bridge
+ 3371 CN896/VN896/P4M900 [Chrome 9 HC]
+ 3372 VT8237S PCI to ISA Bridge
+ 337a VT8237A PCI to PCI Bridge
+ 337b VT8237A Host Bridge
+ 3403 VT6315 Series Firewire Controller
+ 1043 8374 M5A88-V EVO
+ 1043 8384 P8P67 Deluxe Motherboard
+ 3409 VX855/VX875 DRAM Bus Control
+ 4149 VIA VT6420 (ATA133) Controller
+ 4204 K8M800 Host Bridge
+ 4208 PT890 Host Bridge
+ 4238 K8T890 Host Bridge
+ 4258 PT880 Host Bridge
+ 4259 CN333/CN400/PM880 Host Bridge
+ 4269 KT880 Host Bridge
+ 4282 K8T800Pro Host Bridge
+ 4290 K8M890 Host Bridge
+ 4293 PM896 Host Bridge
+ 4296 P4M800 Host Bridge
+ 4308 PT894 Host Bridge
+ 4314 CN700/VN800/P4M800CE/Pro Host Bridge
+ 4324 CX700/VX700 Host Bridge
+ 4327 P4M890 Host Bridge
+ 4336 K8M890CE Host Bridge
+ 4340 PT900 Host Bridge
+ 4351 VT3351 Host Bridge
+ 4353 VX800/VX820 Power Management Control
+ 4364 CN896/VN896/P4M900 Host Bridge
+ 4397 VT1708B/1702S/1708S HD audio codec
+ 4409 VX855/VX875 Power Management Control
+ 5030 VT82C596 ACPI [Apollo PRO]
+ 5122 VX855/VX875 Chrome 9 HCM Integrated Graphics
+ 5208 PT890 I/O APIC Interrupt Controller
+ 5238 K8T890 I/O APIC Interrupt Controller
+ 5287 VT8251 Serial ATA Controller
+ 5290 K8M890 I/O APIC Interrupt Controller
+ 5308 PT894 I/O APIC Interrupt Controller
+ 5324 VX800 Serial ATA and EIDE Controller
+ 5327 P4M890 I/O APIC Interrupt Controller
+ 5336 K8M890CE I/O APIC Interrupt Controller
+ 5340 PT900 I/O APIC Interrupt Controller
+ 5351 VT3351 I/O APIC Interrupt Controller
+ 5353 VX800/VX820 APIC and Central Traffic Control
+ 5364 CN896/VN896/P4M900 I/O APIC Interrupt Controller
+ 5409 VX855/VX875 APIC and Central Traffic Control
+ 6100 VT85C100A [Rhine II]
+ 6287 SATA RAID Controller
+ 6327 P4M890 Security Device
+ 6353 VX800/VX820 Scratch Registers
+ 6364 CN896/VN896/P4M900 Security Device
+ 6409 VX855/VX875 Scratch Registers
+ 7204 K8M800 Host Bridge
+ 7205 KM400/KN400/P4M800 [S3 UniChrome]
+ 1458 d000 Gigabyte GA-7VM400(A)M(F) Motherboard
+ 1462 7061 MS-7061
+ 7208 PT890 Host Bridge
+ 7238 K8T890 Host Bridge
+ 7258 PT880 Host Bridge
+ 7259 CN333/CN400/PM880 Host Bridge
+ 7269 KT880 Host Bridge
+ 7282 K8T800Pro Host Bridge
+ 7290 K8M890 Host Bridge
+ 7293 PM896 Host Bridge
+ 7296 P4M800 Host Bridge
+ 7308 PT894 Host Bridge
+ 7314 CN700/VN800/P4M800CE/Pro Host Bridge
+ 7324 CX700/VX700 Host Bridge
+ 7327 P4M890 Host Bridge
+ 7336 K8M890CE Host Bridge
+ 7340 PT900 Host Bridge
+ 7351 VT3351 Host Bridge
+ 7353 VX800/VX820 North-South Module Interface Control
+ 7364 CN896/VN896/P4M900 Host Bridge
+ 7409 VX855/VX875 North-South Module Interface Control
+ 8231 VT8231 [PCI-to-ISA Bridge]
+ 8235 VT8235 ACPI
+ 8305 VT8363/8365 [KT133/KM133 AGP]
+ 8324 CX700/VX700 PCI to ISA Bridge
+ 8353 VX800/VX820 Bus Control and Power Management
+ 8391 VT8371 [KX133 AGP]
+ 8400 MVP4
+ 8409 VX855/VX875 Bus Control and Power Management
+ 8500 KLE133/PLE133/PLE133T
+ 8501 VT8501 [Apollo MVP4 AGP]
+ 8596 VT82C596 [Apollo PRO AGP]
+ 8597 VT82C597 [Apollo VP3 AGP]
+ 8598 VT82C598/694x [Apollo MVP3/Pro133x AGP]
+ 1019 0985 P6VXA Motherboard
+ 8601 VT8601 [Apollo ProMedia AGP]
+ 8605 VT8605 [PM133 AGP]
+ 8691 VT82C691 [Apollo Pro]
+ 8693 VT82C693 [Apollo Pro Plus] PCI Bridge
+ 8a25 PL133/PL133T [S3 ProSavage]
+ 8a26 KL133/KL133A/KM133/KM133A [S3 ProSavage]
+ 8d01 PN133/PN133T [S3 Twister]
+ 8d04 KM266/P4M266/P4M266A/P4N266 [S3 ProSavageDDR]
+ 9530 Secure Digital Memory Card Controller
+ 95d0 SDIO Host Controller
+ a208 PT890 PCI to PCI Bridge Controller
+ a238 K8T890 PCI to PCI Bridge Controller
+ a327 P4M890 PCI to PCI Bridge Controller
+ a353 VX8xx South-North Module Interface Control
+ a364 CN896/VN896/P4M900 PCI to PCI Bridge Controller
+ a409 VX855/VX875 USB Device Controller
+ b091 VT8633 [Apollo Pro266 AGP]
+ b099 VT8366/A/7 [Apollo KT266/A/333 AGP]
+ b101 VT8653 AGP Bridge
+ b102 VT8362 AGP Bridge
+ b103 VT8615 AGP Bridge
+ b112 VT8361 [KLE133] AGP Bridge
+ b113 VPX/VPX2 I/O APIC Interrupt Controller
+ b115 VT8363/8365 [KT133/KM133] PCI Bridge
+ b168 VT8235 PCI Bridge
+ b188 VT8237 PCI bridge [K8T800/K8T890 South]
+ 147b 1407 KV8-MAX3 motherboard
+ b198 VT8237/VX700 PCI Bridge
+ b213 VPX/VPX2 I/O APIC Interrupt Controller
+ b353 VX855/VX875 PCI to PCI Bridge
+ b999 [K8T890 North / VT8237 South] PCI Bridge
+ c208 PT890 PCI to PCI Bridge Controller
+ c238 K8T890 PCI to PCI Bridge Controller
+ c327 P4M890 PCI to PCI Bridge Controller
+ c340 PT900 PCI to PCI Bridge Controller
+ c353 VX800/VX820 PCI Express Root Port
+ c364 CN896/VN896/P4M900 PCI to PCI Bridge Controller
+ c409 VX855/VX875 EIDE Controller
+ d104 VT8237R USB UDCI Controller
+ d208 PT890 PCI to PCI Bridge Controller
+ d213 VPX/VPX2 PCI to PCI Bridge Controller
+ d238 K8T890 PCI to PCI Bridge Controller
+ d340 PT900 PCI to PCI Bridge Controller
+ e208 PT890 PCI to PCI Bridge Controller
+ e238 K8T890 PCI to PCI Bridge Controller
+ e340 PT900 PCI to PCI Bridge Controller
+ e353 VX800/VX820 PCI Express Root Port
+ e721 VT1708B 8-channel High Definition Audio CODEC
+ f208 PT890 PCI to PCI Bridge Controller
+ f238 K8T890 PCI to PCI Bridge Controller
+ f340 PT900 PCI to PCI Bridge Controller
+ f353 VX800/VX820 PCI Express Root Port
+1107 Stratus Computers
+ 0576 VIA VT82C570MV [Apollo] (Wrong vendor ID!)
+1108 Proteon, Inc.
+ 0100 p1690plus_AA
+ 0101 p1690plus_AB
+ 0105 P1690Plus
+ 0108 P1690Plus
+ 0138 P1690Plus
+ 0139 P1690Plus
+ 013c P1690Plus
+ 013d P1690Plus
+1109 Cogent Data Technologies, Inc.
+ 1400 EM110TX [EX110TX]
+110a Siemens Nixdorf AG
+ 0002 Pirahna 2-port
+ 0005 Tulip controller, power management, switch extender
+ 0006 FSC PINC (I/O-APIC)
+ 0015 FSC Multiprocessor Interrupt Controller
+ 001d FSC Copernicus Management Controller
+ 007b FSC Remote Service Controller, mailbox device
+ 007c FSC Remote Service Controller, shared memory device
+ 007d FSC Remote Service Controller, SMIC device
+ 2101 HST SAPHIR V Primary PCI (ISDN/PMx)
+# Superfastcom-PCI (Commtech, Inc.) or DSCC4 WAN Adapter
+ 2102 DSCC4 PEB/PEF 20534 DMA Supported Serial Communication Controller with 4 Channels
+ 2104 Eicon Diva 2.02 compatible passive ISDN card
+ 3141 SIMATIC NET CP 5611 (Profibus Adapter)
+ 3142 SIMATIC NET CP 5613A1 (Profibus Adapter)
+ 4021 SIMATIC NET CP 5512 (Profibus and MPI Cardbus Adapter)
+ 4029 SIMATIC NET CP 5613A2 (Profibus Adapter)
+ 4942 FPGA I-Bus Tracer for MBD
+ 6120 SZB6120
+110b Chromatic Research Inc.
+ 0001 Mpact Media Processor
+ 0004 Mpact 2
+110c Mini-Max Technology, Inc.
+110d Znyx Advanced Systems
+110e CPU Technology
+110f Ross Technology
+1110 Powerhouse Systems
+ 6037 Firepower Powerized SMP I/O ASIC
+ 6073 Firepower Powerized SMP I/O ASIC
+1111 Santa Cruz Operation
+# Also claimed to be RNS or Rockwell International, current PCISIG records list Osicom
+1112 Osicom Technologies Inc
+ 2200 FDDI Adapter
+ 2300 Fast Ethernet Adapter
+ 2340 4 Port Fast Ethernet Adapter
+ 2400 ATM Adapter
+1113 Accton Technology Corporation
+ 1211 SMC2-1211TX
+ 103c 1207 EN-1207D Fast Ethernet Adapter
+ 1113 1211 EN-1207D Fast Ethernet Adapter
+ 1216 EN-1216 Ethernet Adapter
+ 1113 1216 EN1207F series PCI Fast Ethernet Adapter
+ 1113 2220 EN2220A Cardbus Fast Ethernet Adapter
+ 1113 2242 EN2242 10/100 Ethernet Mini-PCI Card
+ 111a 1020 SpeedStream 1020 PCI 10/100 Ethernet Adaptor [EN-1207F-TX ?]
+ 1217 EN-1217 Ethernet Adapter
+ 5105 10Mbps Network card
+ 9211 EN-1207D Fast Ethernet Adapter
+ 1113 9211 EN-1207D Fast Ethernet Adapter
+ 9511 21x4x DEC-Tulip compatible Fast Ethernet
+ d301 CPWNA100 (Philips wireless PCMCIA)
+ ec02 SMC 1244TX v3
+ ee23 SMCWPCIT-G 108Mbps Wireless PCI adapter
+1114 Atmel Corporation
+ 0506 at76c506 802.11b Wireless Network Adaptor
+1115 3D Labs
+1116 Data Translation
+ 0022 DT3001
+ 0023 DT3002
+ 0024 DT3003
+ 0025 DT3004
+ 0026 DT3005
+ 0027 DT3001-PGL
+ 0028 DT3003-PGL
+ 0051 DT322
+ 0060 DT340
+ 0069 DT332
+ 80c2 DT3162
+1117 Datacube, Inc
+ 9500 Max-1C SVGA card
+ 9501 Max-1C image processing
+1118 Berg Electronics
+1119 ICP Vortex Computersysteme GmbH
+ 0000 GDT 6000/6020/6050
+ 0001 GDT 6000B/6010
+ 0002 GDT 6110/6510
+ 0003 GDT 6120/6520
+ 0004 GDT 6530
+ 0005 GDT 6550
+ 0006 GDT 6117/6517
+ 0007 GDT 6127/6527
+ 0008 GDT 6537
+ 0009 GDT 6557/6557-ECC
+ 000a GDT 6115/6515
+ 000b GDT 6125/6525
+ 000c GDT 6535
+ 000d GDT 6555/6555-ECC
+ 0100 GDT 6117RP/6517RP
+ 0101 GDT 6127RP/6527RP
+ 0102 GDT 6537RP
+ 0103 GDT 6557RP
+ 0104 GDT 6111RP/6511RP
+ 0105 GDT 6121RP/6521RP
+ 0110 GDT 6117RD/6517RD
+ 0111 GDT 6127RD/6527RD
+ 0112 GDT 6537RD
+ 0113 GDT 6557RD
+ 0114 GDT 6111RD/6511RD
+ 0115 GDT 6121RD/6521RD
+ 0118 GDT 6118RD/6518RD/6618RD
+ 0119 GDT 6128RD/6528RD/6628RD
+ 011a GDT 6538RD/6638RD
+ 011b GDT 6558RD/6658RD
+ 0120 GDT 6117RP2/6517RP2
+ 0121 GDT 6127RP2/6527RP2
+ 0122 GDT 6537RP2
+ 0123 GDT 6557RP2
+ 0124 GDT 6111RP2/6511RP2
+ 0125 GDT 6121RP2/6521RP2
+ 0136 GDT 6113RS/6513RS
+ 0137 GDT 6123RS/6523RS
+ 0138 GDT 6118RS/6518RS/6618RS
+ 0139 GDT 6128RS/6528RS/6628RS
+ 013a GDT 6538RS/6638RS
+ 013b GDT 6558RS/6658RS
+ 013c GDT 6533RS/6633RS
+ 013d GDT 6543RS/6643RS
+ 013e GDT 6553RS/6653RS
+ 013f GDT 6563RS/6663RS
+ 0166 GDT 7113RN/7513RN/7613RN
+ 0167 GDT 7123RN/7523RN/7623RN
+ 0168 GDT 7118RN/7518RN/7518RN
+ 0169 GDT 7128RN/7528RN/7628RN
+ 016a GDT 7538RN/7638RN
+ 016b GDT 7558RN/7658RN
+ 016c GDT 7533RN/7633RN
+ 016d GDT 7543RN/7643RN
+ 016e GDT 7553RN/7653RN
+ 016f GDT 7563RN/7663RN
+ 01d6 GDT 4x13RZ
+ 01d7 GDT 4x23RZ
+ 01f6 GDT 8x13RZ
+ 01f7 GDT 8x23RZ
+ 01fc GDT 8x33RZ
+ 01fd GDT 8x43RZ
+ 01fe GDT 8x53RZ
+ 01ff GDT 8x63RZ
+ 0210 GDT 6519RD/6619RD
+ 0211 GDT 6529RD/6629RD
+ 0260 GDT 7519RN/7619RN
+ 0261 GDT 7529RN/7629RN
+ 02ff GDT MAXRP
+ 0300 GDT NEWRX
+ 0301 GDT NEWRX2
+111a Efficient Networks, Inc
+ 0000 155P-MF1 (FPGA)
+ 0002 155P-MF1 (ASIC)
+ 0003 ENI-25P ATM
+ 111a 0000 ENI-25p Miniport ATM Adapter
+ 0005 SpeedStream (LANAI)
+ 111a 0001 ENI-3010 ATM
+ 111a 0009 ENI-3060 ADSL (VPI=0)
+ 111a 0101 ENI-3010 ATM
+ 111a 0109 ENI-3060CO ADSL (VPI=0)
+ 111a 0809 ENI-3060 ADSL (VPI=0 or 8)
+ 111a 0909 ENI-3060CO ADSL (VPI=0 or 8)
+ 111a 0a09 ENI-3060 ADSL (VPI=<0..15>)
+ 0007 SpeedStream ADSL
+ 111a 1001 ENI-3061 ADSL [ASIC]
+ 1020 SpeedStream PCI 10/100 Network Card
+ 1203 SpeedStream 1023 Wireless PCI Adapter
+111b Teledyne Electronic Systems
+111c Tricord Systems Inc.
+ 0001 Powerbis Bridge
+111d Integrated Device Technology, Inc.
+ 0001 IDT77201/77211 155Mbps ATM SAR Controller [NICStAR]
+ 0003 IDT77222/77252 155Mbps ATM MICRO ABR SAR Controller
+ 0004 IDT77V252 155Mbps ATM MICRO ABR SAR Controller
+ 0005 IDT77V222 155Mbps ATM MICRO ABR SAR Controller
+ 8018 PES12N3A PCI Express Switch
+ 801c PES24N3A PCI Express Switch
+ 8028 PES4T4 PCI Express Switch
+ 802b PES8T5A PCI Express Switch
+ 802c PES16T4 PCI Express Switch
+ 802d PES16T7 PCI Express Switch
+ 802e PES24T6 PCI Express Switch
+ 802f PES32T8 PCI Express Switch
+ 8032 PES48T12 PCI Express Switch
+ 8034 PES16/22/34H16 PCI Express Switch
+ 8035 PES32H8 PCI Express Switch
+ 8036 PES48H12 PCI Express Switch
+ 8037 PES64H16 PCI Express Switch
+ 8039 PES3T3 PCI Express Switch
+ 803a PES4T4 PCI Express Switch
+ 803c PES5T5 PCI Express Switch
+ 803d PES6T5 PCI Express Switch
+ 8048 PES8NT2 PCI Express Switch
+ 8049 PES8NT2 PCI Express Switch
+ 804a PES8NT2 PCI Express Internal NTB
+ 804b PES8NT2 PCI Express External NTB
+ 804c PES16NT2 PCI Express Switch
+ 804d PES16NT2 PCI Express Switch
+ 804e PES16NT2 PCI Express Internal NTB
+ 804f PES16NT2 PCI Express External NTB
+ 8058 PES12NT3 PCI Express Switch
+ 8059 PES12NT3 PCI Express Switch
+ 805a PES12NT3 PCI Express Internal NTB
+ 805b PES12NT3 PCI Express External NTB
+ 805c PES24NT3 PCI Express Switch
+ 805d PES24NT3 PCI Express Switch
+ 805e PES24NT3 PCI Express Internal NTB
+ 805f PES24NT3 PCI Express External NTB
+ 8060 PES16T4G2 PCI Express Gen2 Switch
+ 8061 PES12T3G2 PCI Express Gen2 Switch
+ 8068 PES6T6G2 PCI Express Gen2 Switch
+ 806a PES24T3G2 PCI Express Gen2 Switch
+ 14c1 000c 10G-PCIE2-8B2
+ 806c PES16T4A/4T4G2 PCI Express Gen2 Switch
+ 806e PES24T6G2 PCI Express Gen2 Switch
+ 806f HIO524G2 PCI Express Gen2 Switch
+111e Eldec
+111f Precision Digital Images
+ 4a47 Precision MX Video engine interface
+ 5243 Frame capture bus interface
+1120 EMC Corporation
+1121 Zilog
+1122 Multi-tech Systems, Inc.
+1123 Excellent Design, Inc.
+1124 Leutron Vision AG
+ 2581 Picport Monochrome
+1125 Eurocore
+1126 Vigra
+1127 FORE Systems Inc
+ 0200 ForeRunner PCA-200 ATM
+ 0210 PCA-200PC
+ 0250 ATM
+ 0300 ForeRunner PCA-200EPC ATM
+ 0310 ATM
+ 0400 ForeRunnerHE ATM Adapter
+ 1127 0400 ForeRunnerHE ATM
+1129 Firmworks
+112a Hermes Electronics Company, Ltd.
+112b Linotype - Hell AG
+112c Zenith Data Systems
+112d Ravicad
+112e Infomedia Microelectronics Inc.
+112f Dalsa Inc.
+ 0000 MVC IC-PCI
+ 0001 MVC IM-PCI Video frame grabber/processor
+ 0008 PC-CamLink PCI framegrabber
+1130 Computervision
+1131 Philips Semiconductors
+ 1561 USB 1.1 Host Controller
+ 1775 c200 C2K onboard USB 1.1 host controller
+ 1562 USB 2.0 Host Controller
+ 1775 c200 C2K onboard USB 2.0 host controller
+ 3400 SmartPCI56(UCB1500) 56K Modem
+ 5400 TriMedia TM1000/1100
+ 12ca 0000 BlueICE
+ 5402 TriMedia TM1300
+ 1244 0f00 Fritz!Card DSL
+ 15eb 1300 DT1300
+ 15eb 1302 DT1302
+ 15eb 1304 DT1304
+ 15eb 1305 DT1305
+ 15eb 1306 PMCDT1306
+ 15eb 1308 DT1308
+ 15eb 1331 DT1301 with SAA7121
+ 15eb 1337 DT1301 with SAA7127
+ 15eb 2d3d X3D
+ 15eb 7022 PTM1300
+ 5405 TriMedia TM1500
+ 1136 0005 LCP-1500
+ 5406 TriMedia TM1700
+ 540b PNX1005 Media Processor
+ 1131 0020 PNXLite PCI Demo Board
+ 7130 SAA7130 Video Broadcast Decoder
+ 0000 4016 Behold TV 401
+ 0000 4051 Behold TV 405 FM
+ 0000 5051 Behold TV 505 RDS
+ 0000 505b Behold TV 505 RDS
+ 102b 48d0 Matrox CronosPlus
+ 1048 226b ELSA EX-VISION 300TV
+ 107d 6655 WinFast DTV1000S
+ 1131 0000 Behold TV 401
+ 1131 2001 10MOONS PCI TV CAPTURE CARD
+ 1131 2005 Techcom (India) TV Tuner Card (SSD-TV-670)
+ 1458 9006 GT-PS700 DVB-S tuner
+ 1461 050c Nagase Sangyo TransGear 3000TV
+ 1461 10ff AVerMedia DVD EZMaker
+ 1461 2108 AverMedia AverTV/305
+ 1461 2115 AverMedia AverTV Studio 305
+ 153b 1152 Terratec Cinergy 200 TV
+ 185b c100 Compro VideoMate TV PVR/FM
+ 185b c901 Videomate DVB-T200
+ 5168 0138 LifeView FlyVIDEO2000
+ 5ace 5010 Behold TV 501
+ 5ace 5050 Behold TV 505 FM
+ 7133 SAA7131/SAA7133/SAA7135 Video Broadcast Decoder
+ 0000 4091 Beholder BeholdTV 409 FM
+ 0000 5071 Behold TV 507 RDS
+ 0000 507b Behold TV 507 RDS
+ 0000 5201 Behold TV Columbus
+# Deleting vendor name after rereading submit instructions
+ 0070 6701 WinTV HVR-1110
+ 1019 4cb5 Elitegroup ECS TVP3XP FM1236 Tuner Card (NTSC,FM)
+ 1043 0210 FlyTV mini Asus Digimatrix
+ 1043 4843 ASUS TV-FM 7133
+ 1043 4845 TV-FM 7135
+ 1043 4862 P7131 Dual
+ 1043 4876 My Cinema-P7131 Hybrid
+ 1131 0000 KWorld V-Stream Studio TV Terminator
+ 1131 2001 Proteus Pro [philips reference design]
+ 1131 2018 Tiger reference design
+ 1131 4ee9 MonsterTV Mobile
+ 11bd 002b PCTV Stereo
+ 11bd 002e PCTV 110i (saa7133)
+ 12ab 0800 PURPLE TV
+ 13c2 2804 Technotrend Budget T-3000 Hybrid
+ 1421 0335 Instant TV DVB-T Cardbus
+ 1421 1370 Instant TV (saa7135)
+ 1435 7330 VFG7330
+ 1435 7350 VFG7350
+ 1458 9002 GT-PTV-TAF-RH DVB-T/Analog TV/FM tuner
+ 1458 9003 GT-PTV-AF-RH Analog TV/FM tuner
+ 1458 9004 GT-P8000 DVB-T/Analog TV/FM tuner
+ 1458 9005 GT-P6000 Analog TV/FM tuner
+ 1458 9008 GT-P5100 Analog TV tuner
+ 1461 1044 AVerTVHD MCE A180
+ 1461 4836 M10D Hybrid DVBT
+ 1461 861e M105 PAL/SECAM/NTSC/FM Tuner
+ 1461 a14b AVerTV Studio 509
+ 1461 a836 M115 DVB-T, PAL/SECAM/NTSC Tuner
+ 1461 f01d DVB-T Super 007
+ 1461 f31f Avermedia AVerTV GO 007 FM
+ 1461 f936 Hybrid+FM PCI (rev A16D)
+ 1462 6231 TV@nywhere Plus
+ 1489 0214 LifeView FlyTV Platinum FM
+ 14c0 1212 LifeView FlyTV Platinum Mini2
+ 153b 1160 Cinergy 250 PCI TV
+ 153b 1162 Terratec Cinergy 400 mobile
+ 17de 7350 ATSC 110 Digital / Analog HDTV Tuner
+ 17de 7352 ATSC 115 Digital / Analog HDTV Tuner
+ 185b c100 VideoMate TV
+ 185b c900 VideoMate T750
+ 5168 0306 LifeView FlyDVB-T DUO
+ 5168 0319 LifeView FlyDVB Trio
+ 5168 0502 LifeView FlyDVB-T Duo CardBus
+ 5168 0520 LifeView FlyDVB Trio CardBus
+ 5168 1502 LifeView FlyTV CardBus
+ 5168 2502 LifeView FlyDVB-T CardBus
+ 5168 2520 LifeView FlyDVB-S Duo CardBus
+ 5168 3502 LifeView FlyDVB-T Hybrid CardBus
+ 5168 3520 LifeView FlyDVB Trio N CardBus
+ 5ace 5030 Behold TV 503 FM
+ 5ace 5090 Behold TV 509 FM
+ 5ace 6090 Behold TV 609 FM
+ 5ace 6091 Behold TV 609 FM
+ 5ace 6092 Behold TV 609 RDS
+ 5ace 6093 Behold TV 609 RDS
+ 5ace 6190 Behold TV M6
+ 5ace 6191 Behold TV M63
+ 5ace 6193 Behold TV M6 Extra
+ 5ace 6290 Behold TV H6
+ 5ace 7090 Behold TV A7
+ 5ace 7190 Behold TV H7
+ 5ace 7595 Behold TV X7
+ 7134 SAA7134/SAA7135HL Video Broadcast Decoder
+ 0000 4036 Behold TV 403
+ 0000 4037 Behold TV 403 FM
+ 0000 4071 Behold TV 407 FM
+ 1019 4cb4 Elitegroup ECS TVP3XP FM1216 Tuner Card(PAL-BG,FM)
+ 1043 0210 Digimatrix TV
+ 1043 4840 ASUS TV-FM 7134
+ 1043 4842 TV-FM 7134
+ 1131 0000 Behold TV 403 FM
+ 1131 2004 EUROPA V3 reference design
+ 1131 4e85 SKNet Monster TV
+ 1131 6752 EMPRESS
+ 11bd 002b PCTV Stereo
+ 11bd 002d PCTV 300i DVB-T + PAL
+ 1461 2c00 AverTV Hybrid+FM PCI
+ 1461 9715 AVerTV Studio 307
+ 1461 a70a Avermedia AVerTV 307
+ 1461 a70b AverMedia M156 / Medion 2819
+ 1461 d6ee Cardbus TV/Radio (E500)
+ 1471 b7e9 AVerTV Cardbus plus
+ 153b 1142 Terratec Cinergy 400 TV
+ 153b 1143 Terratec Cinergy 600 TV
+ 153b 1158 Terratec Cinergy 600 TV MK3
+ 1540 9524 ProVideo PV952
+ 16be 0003 Medion 7134
+ 185b c200 Compro VideoMate Gold+ Pal
+ 185b c900 Videomate DVB-T300
+ 1894 a006 KNC One TV-Station DVR
+ 1894 fe01 KNC One TV-Station RDS / Typhoon TV Tuner RDS
+ 5168 0138 FLY TV PRIME 34FM
+ 5ace 5070 Behold TV 507 FM
+ 5ace 6070 Behold TV 607 FM
+ 5ace 6071 Behold TV 607 FM
+ 5ace 6072 Behold TV 607 RDS
+ 5ace 6073 Behold TV 607 RDS
+ 7145 SAA7145
+ 7146 SAA7146
+ 110a 0000 Fujitsu/Siemens DVB-C card rev1.5
+ 110a ffff Fujitsu/Siemens DVB-C card rev1.5
+ 1124 2581 Leutron Vision PicPort
+ 1131 4f56 KNC1 DVB-S Budget
+ 1131 4f60 Fujitsu-Siemens Activy DVB-S Budget Rev AL
+ 1131 4f61 Activy DVB-S Budget Rev GR
+ 1131 5f61 Activy DVB-T Budget
+ 114b 2003 DVRaptor Video Edit/Capture Card
+ 11bd 0006 DV500 Overlay
+ 11bd 000a DV500 Overlay
+ 11bd 000f DV500 Overlay
+ 13c2 0000 Siemens/Technotrend/Hauppauge DVB card rev1.3 or rev1.5
+ 13c2 0001 Technotrend/Hauppauge DVB card rev1.3 or rev1.6
+ 13c2 0002 Technotrend/Hauppauge DVB card rev2.1
+ 13c2 0003 Technotrend/Hauppauge DVB card rev2.1
+ 13c2 0004 Technotrend/Hauppauge DVB card rev2.1
+ 13c2 0006 Technotrend/Hauppauge DVB card rev1.3 or rev1.6
+ 13c2 0008 Technotrend/Hauppauge DVB-T
+ 13c2 000a Octal/Technotrend DVB-C for iTV
+ 13c2 000e Technotrend/Hauppauge DVB card rev2.3
+ 13c2 1003 Technotrend-Budget/Hauppauge WinTV-NOVA-S DVB card
+ 13c2 1004 Technotrend-Budget/Hauppauge WinTV-NOVA-C DVB card
+ 13c2 1005 Technotrend-Budget/Hauppauge WinTV-NOVA-T DVB card
+ 13c2 100c Technotrend-Budget/Hauppauge WinTV-NOVA-CI DVB card
+ 13c2 100f Technotrend-Budget/Hauppauge WinTV-NOVA-CI DVB card
+ 13c2 1010 DVB C-1500
+ 13c2 1011 Technotrend-Budget/Hauppauge WinTV-NOVA-T DVB card
+ 13c2 1012 DVB T-1500
+ 13c2 1013 SATELCO Multimedia DVB
+ 13c2 1016 WinTV-NOVA-SE DVB card
+ 13c2 1018 DVB S-1401
+ 13c2 1019 S2-3200
+ 13c2 1102 Technotrend/Hauppauge DVB card rev2.1
+ 153b 1155 Cinergy 1200 DVB-S
+ 153b 1156 Terratec Cynergy 1200C
+ 153b 1157 Cinergy 1200 DVB-T
+ 1894 0020 KNC One DVB-C V1.0
+ 1894 0023 TVStation DVB-C plus
+ 7160 SAA7160
+ 1458 9009 E8000 DVB-T/Analog TV/FM tuner
+ 7162 SAA7162
+ 11bd 0101 Pinnacle PCTV 7010iX TV Card
+ 7164 SAA7164
+ 0070 8800 WinTV HVR-2250
+ 0070 8810 WinTV HVR-2250
+ 0070 8851 WinTV HVR-2250
+ 0070 8853 WinTV HVR-2250
+ 0070 8880 WinTV HVR-2250
+ 0070 8891 WinTV HVR-2250
+ 0070 88a0 WinTV HVR-2250
+ 0070 88a1 WinTV HVR-2250
+ 0070 8900 WinTV HVR-2200
+ 0070 8901 WinTV HVR-2200
+ 0070 8940 WinTV HVR-2200 (submodel 89619)
+ 0070 8951 WinTV HVR-2200
+ 0070 8953 WinTV HVR-2200
+ 0070 8980 WinTV HVR-2200
+ 0070 8991 WinTV HVR-2200
+ 0070 8993 WinTV HVR-2200
+ 0070 89a0 WinTV HVR-2200
+ 0070 89a1 WinTV HVR-2200
+ 7231 SAA7231
+ 5ace 8000 Behold TV H8
+ 5ace 8100 Behold TV A8
+ 9730 SAA9730 Integrated Multimedia and Peripheral Controller
+ 1131 0000 Integrated Multimedia and Peripheral Controller
+1132 Mitel Corp.
+1133 Dialogic Corporation
+ 7701 Eiconcard C90
+ 7711 Eiconcard C91
+ 7901 EiconCard S90
+ 7902 EiconCard S90
+ 7911 EiconCard S91
+ 7912 EiconCard S91
+ 7921 Eiconcard S92
+ 7941 EiconCard S94
+ 7942 EiconCard S94
+ 7943 EiconCard S94
+ 7944 EiconCard S94
+ 7945 Eiconcard S94
+ 7948 Eiconcard S94 64bit/66MHz
+ 9711 Eiconcard S91 V2
+ 9911 Eiconcard S91 V2
+ 9941 Eiconcard S94 V2
+ 9a41 Eiconcard S94 PCIe
+ b921 EiconCard P92
+ b922 EiconCard P92
+ b923 EiconCard P92
+ e001 Diva Pro 2.0 S/T
+ e002 Diva 2.0 S/T PCI
+ e003 Diva Pro 2.0 U
+ e004 Diva 2.0 U PCI
+ e005 Diva 2.01 S/T PCI
+ e006 Diva CT S/T PCI
+ e007 Diva CT U PCI
+ e008 Diva CT Lite S/T PCI
+ e009 Diva CT Lite U PCI
+ e00a Diva ISDN+V.90 PCI
+ e00b Diva ISDN PCI 2.02
+ e00c Diva 2.02 PCI U
+ e00d Diva Pro 3.0 PCI
+ e00e Diva ISDN+CT S/T PCI Rev 2
+ e010 Diva Server BRI-2M PCI
+ 110a 0021 Fujitsu Siemens ISDN S0
+ e011 Diva Server BRI S/T Rev 2
+ e012 Diva Server 4BRI-8M PCI
+ e013 4BRI
+ 1133 1300 Diva V-4BRI-8 PCI v2
+ 1133 e013 Diva 4BRI-8 PCI v2
+ e014 Diva Server PRI-30M PCI
+ e015 Diva PRI PCI v2
+ e016 Diva Server Voice 4BRI PCI
+ e017 Diva Server Voice 4BRI Rev 2
+ 1133 e017 Diva Server Voice 4BRI-8M 2.0 PCI
+ e018 BRI
+ 1133 1800 Diva V-BRI-2 PCI v2
+ 1133 e018 Diva BRI-2 PCI v2
+ e019 Diva Server Voice PRI Rev 2
+ 1133 e019 Diva Server Voice PRI 2.0 PCI
+ e01a Diva BRI-2FX PCI v2
+ e01b Diva Server Voice BRI-2M 2.0 PCI
+ 1133 e01b Diva Server Voice BRI-2M 2.0 PCI
+ e01c PRI
+ 1133 1c01 Diva PRI/E1/T1-8 PCI v3
+ 1133 1c02 Diva PRI/T1-24 PCI(e) v3
+ 1133 1c03 Diva PRI/E1-30 PCI(e) v3
+ 1133 1c04 Diva PRI/E1/T1-CTI PCI(e) v3
+ 1133 1c05 Diva V-PRI/T1-24 PCI(e) v3
+ 1133 1c06 Diva V-PRI/E1-30 PCI(e) v3
+ 1133 1c07 Diva Server PRI/E1/T1-8 Cornet NQ
+ 1133 1c08 Diva Server PRI/T1-24 Cornet NQ
+ 1133 1c09 Diva Server PRI/E1-30 Cornet NQ
+ 1133 1c0a Diva Server PRI/E1/T1 Cornet NQ
+ 1133 1c0b Diva Server V-PRI/T1-24 Cornet NQ
+ 1133 1c0c Diva Server V-PRI/E1-30 Cornet NQ
+ e01e 2PRI
+ 1133 1e01 Diva 2PRI/E1/T1-60 PCI v1
+ 1133 e01e Diva V-2PRI/E1/T1-60 PCI v1
+ e020 4PRI
+ 1133 2001 Diva 4PRI/E1/T1-120 PCI v1
+ 1133 e020 Diva V-4PRI/E1/T1-120 PCI v1
+ e022 Analog-2
+ 1133 2200 Diva V-Analog-2 PCI v1
+ 1133 e022 Diva Analog-2 PCI v1
+ e024 Analog-4
+ 1133 2400 Diva V-Analog-4 PCI v1
+ 1133 e024 Diva Analog-4 PCI v1
+ e028 Analog-8
+ 1133 2800 Diva V-Analog-8 PCI v1
+ 1133 e028 Diva Analog-8 PCI v1
+ e02a Diva IPM-300 PCI v1
+ e02c Diva IPM-600 PCI v1
+ e02e 4BRI
+ 1133 2e01 Diva V-4BRI-8 PCIe v2
+ 1133 e02e Diva 4BRI-8 PCIe v2
+ e032 BRI
+ 1133 3201 Diva V-BRI-2 PCIe v2
+ 1133 e032 Diva BRI-2 PCIe v2
+ e034 Diva BRI-CTI PCI v2
+1134 Mercury Computer Systems
+ 0001 Raceway Bridge
+ 0002 Dual PCI to RapidIO Bridge
+1135 Fuji Xerox Co Ltd
+ 0001 Printer controller
+1136 Momentum Data Systems
+ 0002 PCI-JTAG
+1137 Cisco Systems Inc
+ 0023 81 VIC PCIe Upstream Port
+ 0040 VIC PCIe Upstream Port
+ 0041 VIC PCIe Downstream Port
+ 0042 VIC Management Controller
+ 1137 0047 P81E PCIe
+ 0043 VIC Ethernet NIC
+ 1137 0047 P81E PCIe
+ 1137 0048 M81KR Mezzanine
+ 0044 VIC Ethernet NIC Dynamic
+ 1137 0047 P81E PCIe
+ 1137 0048 M81KR Mezzanine
+ 0045 VIC FCoE HBA
+ 1137 0047 P81E PCIe
+ 1137 0048 M81KR Mezzanine
+1138 Ziatech Corporation
+ 8905 8905 [STD 32 Bridge]
+1139 Dynamic Pictures, Inc
+ 0001 VGA Compatable 3D Graphics
+113a FWB Inc
+113b Network Computing Devices
+113c Cyclone Microsystems, Inc.
+ 0000 PCI-9060 i960 Bridge
+ 0001 PCI-SDK [PCI i960 Evaluation Platform]
+ 0911 PCI-911 [i960Jx-based Intelligent I/O Controller]
+ 0912 PCI-912 [i960CF-based Intelligent I/O Controller]
+ 0913 PCI-913
+ 0914 PCI-914 [I/O Controller w/ secondary PCI bus]
+113d Leading Edge Products Inc
+113e Sanyo Electric Co - Computer Engineering Dept
+113f Equinox Systems, Inc.
+ 0808 SST-64P Adapter
+ 1010 SST-128P Adapter
+ 80c0 SST-16P DB Adapter
+ 80c4 SST-16P RJ Adapter
+ 80c8 SST-16P Adapter
+ 8888 SST-4P Adapter
+ 9090 SST-8P Adapter
+1140 Intervoice Inc
+1141 Crest Microsystem Inc
+1142 Alliance Semiconductor Corporation
+ 3210 AP6410
+ 6422 ProVideo 6422
+ 6424 ProVideo 6424
+ 6425 ProMotion AT25
+ 643d ProMotion AT3D
+1143 NetPower, Inc
+1144 Cincinnati Milacron
+ 0001 Noservo controller
+1145 Workbit Corporation
+ 8007 NinjaSCSI-32 Workbit
+ f007 NinjaSCSI-32 KME
+ f010 NinjaSCSI-32 Workbit
+ f012 NinjaSCSI-32 Logitec
+ f013 NinjaSCSI-32 Logitec
+ f015 NinjaSCSI-32 Melco
+ f020 NinjaSCSI-32 Sony PCGA-DVD51
+ f021 NinjaPATA-32 Delkin Cardbus UDMA
+ f024 NinjaPATA-32 Delkin Cardbus UDMA
+ f103 NinjaPATA-32 Delkin Cardbus UDMA
+1146 Force Computers
+1147 Interface Corp
+# Nee Schneider & Koch
+1148 SysKonnect
+ 4000 FDDI Adapter
+ 0e11 b03b Netelligent 100 FDDI DAS Fibre SC
+ 0e11 b03c Netelligent 100 FDDI SAS Fibre SC
+ 0e11 b03d Netelligent 100 FDDI DAS UTP
+ 0e11 b03e Netelligent 100 FDDI SAS UTP
+ 0e11 b03f Netelligent 100 FDDI SAS Fibre MIC
+ 1148 5521 FDDI SK-5521 (SK-NET FDDI-UP)
+ 1148 5522 FDDI SK-5522 (SK-NET FDDI-UP DAS)
+ 1148 5541 FDDI SK-5541 (SK-NET FDDI-FP)
+ 1148 5543 FDDI SK-5543 (SK-NET FDDI-LP)
+ 1148 5544 FDDI SK-5544 (SK-NET FDDI-LP DAS)
+ 1148 5821 FDDI SK-5821 (SK-NET FDDI-UP64)
+ 1148 5822 FDDI SK-5822 (SK-NET FDDI-UP64 DAS)
+ 1148 5841 FDDI SK-5841 (SK-NET FDDI-FP64)
+ 1148 5843 FDDI SK-5843 (SK-NET FDDI-LP64)
+ 1148 5844 FDDI SK-5844 (SK-NET FDDI-LP64 DAS)
+ 4200 Token Ring adapter
+ 4300 SK-9872 Gigabit Ethernet Server Adapter (SK-NET GE-ZX dual link)
+ 1148 9821 SK-9821 Gigabit Ethernet Server Adapter (SK-NET GE-T)
+ 1148 9822 SK-9822 Gigabit Ethernet Server Adapter (SK-NET GE-T dual link)
+ 1148 9841 SK-9841 Gigabit Ethernet Server Adapter (SK-NET GE-LX)
+ 1148 9842 SK-9842 Gigabit Ethernet Server Adapter (SK-NET GE-LX dual link)
+ 1148 9843 SK-9843 Gigabit Ethernet Server Adapter (SK-NET GE-SX)
+ 1148 9844 SK-9844 Gigabit Ethernet Server Adapter (SK-NET GE-SX dual link)
+ 1148 9861 SK-9861 Gigabit Ethernet Server Adapter (SK-NET GE-SX Volition)
+ 1148 9862 SK-9862 Gigabit Ethernet Server Adapter (SK-NET GE-SX Volition dual link)
+ 1148 9871 SK-9871 Gigabit Ethernet Server Adapter (SK-NET GE-ZX)
+ 1148 9872 SK-9872 Gigabit Ethernet Server Adapter (SK-NET GE-ZX dual link)
+ 1259 2970 AT-2970SX Gigabit Ethernet Adapter
+ 1259 2971 AT-2970LX Gigabit Ethernet Adapter
+ 1259 2972 AT-2970TX Gigabit Ethernet Adapter
+ 1259 2973 AT-2971SX Gigabit Ethernet Adapter
+ 1259 2974 AT-2971T Gigabit Ethernet Adapter
+ 1259 2975 AT-2970SX/2SC Gigabit Ethernet Adapter
+ 1259 2976 AT-2970LX/2SC Gigabit Ethernet Adapter
+ 1259 2977 AT-2970TX/2TX Gigabit Ethernet Adapter
+ 4320 SK-9871 V2.0 Gigabit Ethernet 1000Base-ZX Adapter, PCI64, Fiber ZX/SC
+ 1148 0121 Marvell RDK-8001 Adapter
+ 1148 0221 Marvell RDK-8002 Adapter
+ 1148 0321 Marvell RDK-8003 Adapter
+ 1148 0421 Marvell RDK-8004 Adapter
+ 1148 0621 Marvell RDK-8006 Adapter
+ 1148 0721 Marvell RDK-8007 Adapter
+ 1148 0821 Marvell RDK-8008 Adapter
+ 1148 0921 Marvell RDK-8009 Adapter
+ 1148 1121 Marvell RDK-8011 Adapter
+ 1148 1221 Marvell RDK-8012 Adapter
+ 1148 3221 SK-9521 V2.0 10/100/1000Base-T Adapter
+ 1148 5021 SK-9821 V2.0 Gigabit Ethernet 10/100/1000Base-T Adapter
+ 1148 5041 SK-9841 V2.0 Gigabit Ethernet 1000Base-LX Adapter
+ 1148 5043 SK-9843 V2.0 Gigabit Ethernet 1000Base-SX Adapter
+ 1148 5051 SK-9851 V2.0 Gigabit Ethernet 1000Base-SX Adapter
+ 1148 5061 SK-9861 V2.0 Gigabit Ethernet 1000Base-SX Adapter
+ 1148 5071 SK-9871 V2.0 Gigabit Ethernet 1000Base-ZX Adapter
+ 1148 9521 SK-9521 10/100/1000Base-T Adapter
+ 4400 SK-9Dxx Gigabit Ethernet Adapter
+ 4500 SK-9Mxx Gigabit Ethernet Adapter
+ 9000 SK-9S21 10/100/1000Base-T Server Adapter, PCI-X, Copper RJ-45
+ 9843 [Fujitsu] Gigabit Ethernet
+ 9e00 SK-9E21D 10/100/1000Base-T Adapter, Copper RJ-45
+ 1148 2100 SK-9E21 Server Adapter
+ 1148 21d0 SK-9E21D 10/100/1000Base-T Adapter
+ 1148 2200 SK-9E22 Server Adapter
+ 1148 8100 SK-9E81 Server Adapter
+ 1148 8200 SK-9E82 Server Adapter
+ 1148 9100 SK-9E91 Server Adapter
+ 1148 9200 SK-9E92 Server Adapter
+ 9e01 SK-9E21M 10/100/1000Base-T Adapter
+1149 Win System Corporation
+114a VMIC
+ 5565 GE-IP PCI5565,PMC5565 Reflective Memory Node
+ 5579 VMIPCI-5579 (Reflective Memory Card)
+ 5587 VMIPCI-5587 (Reflective Memory Card)
+ 6504 VMIC PCI 7755 FPGA
+ 7587 VMIVME-7587
+114b Canopus Co., Ltd
+114c Annabooks
+114d IC Corporation
+114e Nikon Systems Inc
+114f Digi International
+ 0002 AccelePort EPC
+ 0003 RightSwitch SE-6
+ 0004 AccelePort Xem
+ 0005 AccelePort Xr
+ 0006 AccelePort Xr,C/X
+ 0009 AccelePort Xr/J
+ 000a AccelePort EPC/J
+ 000c DataFirePRIme T1 (1-port)
+ 000d SyncPort 2-Port (x.25/FR)
+ 0011 AccelePort 8r EIA-232 (IBM)
+ 0012 AccelePort 8r EIA-422
+ 0013 AccelePort Xr
+ 0014 AccelePort 8r EIA-422
+ 0015 AccelePort Xem
+ 0016 AccelePort EPC/X
+ 0017 AccelePort C/X
+ 001a DataFirePRIme E1 (1-port)
+ 001b AccelePort C/X (IBM)
+ 001c AccelePort Xr (SAIP)
+ 001d DataFire RAS T1/E1/PRI
+ 114f 0050 DataFire RAS E1 Adapter
+ 114f 0051 DataFire RAS Dual E1 Adapter
+ 114f 0052 DataFire RAS T1 Adapter
+ 114f 0053 DataFire RAS Dual T1 Adapter
+ 0023 AccelePort RAS
+ 0024 DataFire RAS B4 ST/U
+ 114f 0030 DataFire RAS BRI U Adapter
+ 114f 0031 DataFire RAS BRI S/T Adapter
+ 0026 AccelePort 4r 920
+ 0027 AccelePort Xr 920
+ 0028 ClassicBoard 4
+ 0029 ClassicBoard 8
+ 0034 AccelePort 2r 920
+ 0035 DataFire DSP T1/E1/PRI cPCI
+ 0040 AccelePort Xp
+ 114f 0042 AccelePort 2p PCI
+ 114f 0043 AccelePort 4p PCI
+ 114f 0044 AccelePort 8p PCI
+ 114f 0045 AccelePort 16p PCI
+ 114f 004e AccelePort 32p PCI
+ 0042 AccelePort 2p
+ 0043 AccelePort 4p
+ 0044 AccelePort 8p
+ 0045 AccelePort 16p
+ 004e AccelePort 32p
+ 0070 Datafire Micro V IOM2 (Europe)
+ 0071 Datafire Micro V (Europe)
+ 0072 Datafire Micro V IOM2 (North America)
+ 0073 Datafire Micro V (North America)
+ 00b0 Digi Neo 4
+ 00b1 Digi Neo 8
+ 00c8 Digi Neo 2 DB9
+ 00c9 Digi Neo 2 DB9 PRI
+ 00ca Digi Neo 2 RJ45
+ 00cb Digi Neo 2 RJ45 PRI
+ 00cc Digi Neo 1 422
+ 00cd Digi Neo 1 422 485
+ 00ce Digi Neo 2 422 485
+ 00d0 ClassicBoard 4 422
+ 00d1 ClassicBoard 8 422
+ 00f1 Digi Neo PCI-E 4 port
+ 00f4 Digi Neo 4 (IBM version)
+ 6001 Avanstar
+1150 Thinking Machines Corp
+1151 JAE Electronics Inc.
+1152 Megatek
+1153 Land Win Electronic Corp
+1154 Melco Inc
+1155 Pine Technology Ltd
+1156 Periscope Engineering
+1157 Avsys Corporation
+1158 Voarx R & D Inc
+ 3011 Tokenet/vg 1001/10m anylan
+ 9050 Lanfleet/Truevalue
+ 9051 Lanfleet/Truevalue
+1159 Mutech Corp
+ 0001 MV-1000
+ 0002 MV-1500
+115a Harlequin Ltd
+115b Parallax Graphics
+115c Photron Ltd.
+115d Xircom
+ 0003 Cardbus Ethernet 10/100
+ 1014 0181 10/100 EtherJet Cardbus Adapter
+ 1014 1181 10/100 EtherJet Cardbus Adapter
+ 1014 8181 10/100 EtherJet Cardbus Adapter
+ 1014 9181 10/100 EtherJet Cardbus Adapter
+ 115d 0181 Cardbus Ethernet 10/100
+ 115d 0182 RealPort2 CardBus Ethernet 10/100 (R2BE-100)
+ 115d 1181 Cardbus Ethernet 10/100
+ 1179 0181 Cardbus Ethernet 10/100
+ 8086 8181 EtherExpress PRO/100 Mobile CardBus 32 Adapter
+ 8086 9181 EtherExpress PRO/100 Mobile CardBus 32 Adapter
+ 0005 Cardbus Ethernet 10/100
+ 1014 0182 10/100 EtherJet Cardbus Adapter
+ 1014 1182 10/100 EtherJet Cardbus Adapter
+ 115d 0182 Cardbus Ethernet 10/100
+ 115d 1182 Cardbus Ethernet 10/100
+ 0007 Cardbus Ethernet 10/100
+ 1014 0182 10/100 EtherJet Cardbus Adapter
+ 1014 1182 10/100 EtherJet Cardbus Adapter
+ 115d 0182 Cardbus Ethernet 10/100
+ 115d 1182 Cardbus Ethernet 10/100
+ 000b Cardbus Ethernet 10/100
+ 1014 0183 10/100 EtherJet Cardbus Adapter
+ 115d 0183 Cardbus Ethernet 10/100
+ 000c Mini-PCI V.90 56k Modem
+ 000f Cardbus Ethernet 10/100
+ 1014 0183 10/100 EtherJet Cardbus Adapter
+ 115d 0183 Cardbus Ethernet 10/100
+ 00d4 Mini-PCI K56Flex Modem
+ 0101 Cardbus 56k modem
+ 115d 1081 Cardbus 56k Modem
+ 0103 Cardbus Ethernet + 56k Modem
+ 1014 9181 Cardbus 56k Modem
+ 1115 1181 Cardbus Ethernet 100 + 56k Modem
+ 115d 1181 CBEM56G-100 Ethernet + 56k Modem
+ 8086 9181 PRO/100 LAN + Modem56 CardBus
+115e Peer Protocols Inc
+115f Maxtor Corporation
+1160 Megasoft Inc
+1161 PFU Limited
+1162 OA Laboratory Co Ltd
+1163 Rendition
+ 0001 Verite 1000
+ 2000 Verite V2000/V2100/V2200
+ 1092 2000 Stealth II S220
+1164 Advanced Peripherals Technologies
+1165 Imagraph Corporation
+ 0001 Motion TPEG Recorder/Player with audio
+# nee ServerWorks
+1166 Broadcom
+ 0000 CMIC-LE
+ 0005 CNB20-LE Host Bridge
+ 0006 CNB20HE Host Bridge
+ 0007 CNB20-LE Host Bridge
+ 0008 CNB20HE Host Bridge
+ 0009 CNB20LE Host Bridge
+ 0010 CIOB30
+ 0011 CMIC-HE
+ 0012 CMIC-WS Host Bridge (GC-LE chipset)
+ 0013 CNB20-HE Host Bridge
+ 0014 CMIC-LE Host Bridge (GC-LE chipset)
+ 0015 CMIC-GC Host Bridge
+ 0016 CMIC-GC Host Bridge
+ 0017 GCNB-LE Host Bridge
+ 0031 HT1100 HPX0 HT Host Bridge
+ 0036 BCM5785 [HT1000] PCI/PCI-X Bridge
+ 0101 CIOB-X2 PCI-X I/O Bridge
+ 0103 EPB PCI-Express to PCI-X Bridge
+ 0104 BCM5785 [HT1000] PCI/PCI-X Bridge
+ 0110 CIOB-E I/O Bridge with Gigabit Ethernet
+ 0130 BCM5780 [HT2000] PCI-X bridge
+ 0132 BCM5780 [HT2000] PCI-Express Bridge
+ 1166 0132 HT2000 PCI-Express bridge
+ 0140 HT2100 PCI-Express Bridge
+ 0141 HT2100 PCI-Express Bridge
+ 0142 HT2100 PCI-Express Bridge
+ 0144 HT2100 PCI-Express Bridge
+ 0200 OSB4 South Bridge
+ 0201 CSB5 South Bridge
+ 4c53 1080 CT8 mainboard
+ 0203 CSB6 South Bridge
+ 1734 1012 PRIMERGY RX/TX series
+ 0205 BCM5785 [HT1000] Legacy South Bridge
+ 0211 OSB4 IDE Controller
+ 0212 CSB5 IDE Controller
+ 1028 014a PowerEdge 1750
+ 1028 810b PowerEdge 1650/2550
+ 4c53 1080 CT8 mainboard
+ 0213 CSB6 RAID/IDE Controller
+ 1028 4134 PowerEdge 600SC
+ 1028 c134 Poweredge SC600
+ 1734 1012 PRIMERGY RX/TX series onboard IDE
+ 0214 BCM5785 [HT1000] IDE
+ 1028 0205 PowerEdge 2970 HT1000 IDE
+ 0217 CSB6 IDE Controller
+ 1028 4134 Poweredge SC600
+ 021b HT1100 HD Audio
+ 0220 OSB4/CSB5 OHCI USB Controller
+ 4c53 1080 CT8 mainboard
+ 0221 CSB6 OHCI USB Controller
+ 1734 1012 PRIMERGY RX/TX series onboard OHCI
+ 0223 BCM5785 [HT1000] USB
+ 1028 0205 PowerEdge 2970 HT1000 USB Controller
+ 1028 020b PowerEdge T605 HT1000 USB Controller
+ 0225 CSB5 LPC bridge
+ 0227 GCLE-2 Host Bridge
+ 1734 1012 PRIMERGY RX/TX series
+ 0230 CSB5 LPC bridge
+ 4c53 1080 CT8 mainboard
+ 0234 BCM5785 [HT1000] LPC
+ 1028 0205 PowerEdge 2970 HT1000 LPC
+ 1028 020b PowerEdge T605 HT1000 LPC
+ 0235 BCM5785 [HT1000] XIOAPIC0-2
+ 0238 BCM5785 [HT1000] WDTimer
+ 0240 K2 SATA
+ 0241 RAIDCore RC4000
+ 0242 RAIDCore BC4000
+ 024a BCM5785 [HT1000] SATA (Native SATA Mode)
+ 1028 020b PowerEdge T605 onboard SATA Controller
+# The device starts as 024A, and changes to 024B if set to PATA mode in BIOS
+ 024b BCM5785 [HT1000] SATA (PATA/IDE Mode)
+ 1028 0205 PowerEdge 2970 HT1000 SATA controller
+ 0406 HT1100 PCI-X Bridge
+ 0408 HT1100 Legacy Device
+ 040a HT1100 ISA-LPC Bridge
+ 1028 0223 PowerEdge R905 HT1100 ISA-LPC Bridge
+ 0410 HT1100 SATA Controller (Native SATA Mode)
+ 0411 HT1100 SATA Controller (PATA / IDE Mode)
+ 0412 HT1100 USB OHCI Controller
+ 0414 HT1100 USB EHCI Controller
+ 0416 HT1100 USB EHCI Controller (with Debug Port)
+ 0420 HT1100 PCI-Express Bridge
+ 0421 HT1100 SAS/SATA Controller
+ 0422 HT1100 PCI-Express Bridge
+1167 Mutoh Industries Inc
+1168 Thine Electronics Inc
+1169 Centre for Development of Advanced Computing
+# nee Polaris Communications
+116a Luminex Software, Inc.
+ 6100 Bus/Tag Channel
+ 6800 Escon Channel
+ 7100 Bus/Tag Channel
+ 7800 Escon Channel
+116b Connectware Inc
+116c Intelligent Resources Integrated Systems
+116d Martin-Marietta
+116e Electronics for Imaging
+116f Workstation Technology
+1170 Inventec Corporation
+1171 Loughborough Sound Images Plc
+1172 Altera Corporation
+1173 Adobe Systems, Inc
+1174 Bridgeport Machines
+1175 Mitron Computer Inc.
+1176 SBE Incorporated
+1177 Silicon Engineering
+1178 Alfa, Inc.
+ afa1 Fast Ethernet Adapter
+1179 Toshiba America Info Systems
+ 0102 Extended IDE Controller
+ 0103 EX-IDE Type-B
+ 0404 DVD Decoder card
+ 0406 Tecra Video Capture device
+ 0407 DVD Decoder card (Version 2)
+ 0601 CPU to PCI bridge
+ 1179 0001 Satellite Pro
+ 0602 PCI to ISA bridge
+ 0603 ToPIC95 PCI to CardBus Bridge for Notebooks
+ 0604 PCI-Docking Host bridge
+ 060a ToPIC95
+ 1179 0001 Satellite Pro
+ 060f ToPIC97
+ 1179 0001 Satellite 4010
+ 0617 ToPIC100 PCI to Cardbus Bridge with ZV Support
+ 0618 CPU to PCI and PCI to ISA bridge
+ 0701 FIR Port Type-O
+ 0804 TC6371AF SmartMedia Controller
+ 0805 SD TypA Controller
+ 0d01 FIR Port Type-DO
+ 1179 0001 FIR Port Type-DO
+117a A-Trend Technology
+117b L G Electronics, Inc.
+117c Atto Technology
+ 002c SAS RAID Adapter
+ 0030 Ultra320 SCSI Host Adapter
+ 117c 8013 ExpressPCI UL4D
+ 117c 8014 ExpressPCI UL4S
+ 117c 8027 ExpressPCI UL5D
+ 117c 802f ExpressPCI UL5D Low Profile
+ 0033 SAS Adapter
+117d Becton & Dickinson
+117e T/R Systems
+117f Integrated Circuit Systems
+1180 Ricoh Co Ltd
+ 0465 RL5c465
+ 0466 RL5c466
+ 0475 RL5c475
+ 144d c006 vpr Matrix 170B4 CardBus bridge
+ 0476 RL5c476 II
+ 1014 0185 ThinkPad A/T/X Series
+ 1014 056c ThinkPad Z60t
+ 1028 014f Latitude X300 laptop
+ 1028 0188 Inspiron 6000 laptop
+ 103c 30c0 Compaq 6710b
+ 103c 30c1 Compaq 6910p
+ 1043 1237 A6J-Q008
+ 1043 1967 V6800V
+ 1043 1987 Asus A4K and Z81K notebooks, possibly others ( mid-2005 machines )
+ 104d 80df Vaio PCG-FX403
+ 104d 80e7 VAIO PCG-GR214EP/GR214MP/GR215MP/GR314MP/GR315MP
+ 104d 814e VAIO GRZ390Z
+ 10f7 8338 Panasonic CF-Y5 laptop
+ 144d c005 X10 Laptop
+ 144d c00c P30/P35 notebook
+ 14ef 0220 PCD-RP-220S
+ 17aa 201c ThinkPad X60s
+ 17aa 20c4 ThinkPad T61
+ 0477 RL5c477
+ 0478 RL5c478
+ 1014 0184 ThinkPad A30p
+ 0511 R5C511
+ 0522 R5C522 IEEE 1394 Controller
+ 1014 01cf ThinkPad A30p
+ 1043 1967 V6800V
+ 0551 R5C551 IEEE 1394 Controller
+ 144d c006 vpr Matrix 170B4
+ 0552 R5C552 IEEE 1394 Controller
+ 1014 0511 ThinkPad A/T/X Series
+ 1028 014f Latitude X300 laptop
+ 1028 0188 Inspiron 6000 laptop
+ 1043 1237 A6J-Q008
+ 144d c005 X10 Laptop
+ 144d c00c P30/P35 notebook
+ 17aa 201e ThinkPad X60s
+ 0554 R5C554
+ 0575 R5C575 SD Bus Host Adapter
+ 0576 R5C576 SD Bus Host Adapter
+ 0592 R5C592 Memory Stick Bus Host Adapter
+ 1025 0121 Aspire 5920G
+ 1028 01d7 XPS M1210
+ 1028 01f3 Inspiron 1420
+ 103c 30b5 Presario V3242AU
+ 103c 30b7 Presario V6133CL
+ 1043 1237 A6J-Q008
+ 1043 1967 V6800V
+ 144d c018 X20 IV
+ 17aa 20ca ThinkPad T61
+ 0811 R5C811
+ 0822 R5C822 SD/SDIO/MMC/MS/MSPro Host Adapter
+ 1014 0556 ThinkPad X60s / Z60t
+ 1014 0598 ThinkPad Z60m
+ 1025 0121 Aspire 5920G
+ 1028 0188 Inspiron 6000 laptop
+ 1028 01a2 Inspiron 9200
+ 1028 01d7 XPS M1210
+ 1028 01f3 Inspiron 1420
+ 103c 03b5 Presario V3242AU
+ 103c 30b7 Presario V6133CL
+ 103c 30c1 Compaq 6910p
+ 1043 1237 A6J-Q008
+ 1043 1967 ASUS V6800V
+ 10f7 8338 Panasonic CF-Y5 laptop
+ 144d c018 X20 IV
+ 17aa 201d ThinkPad X60s
+ 17aa 20c7 ThinkPad T61
+ 0832 R5C832 IEEE 1394 Controller
+ 1025 0121 Aspire 5920G
+ 1028 01d7 XPS M1210
+ 1028 01f3 Inspiron 1420
+ 103c 30b5 Presario V3242AU
+ 103c 30b7 Presario V6133CL
+ 103c 30c1 Compaq 6910p
+ 0841 R5C841 CardBus/SD/SDIO/MMC/MS/MSPro/xD/IEEE1394
+ 0843 R5C843 MMC Host Controller
+ 1025 0121 Aspire 5920G
+ 1028 01d7 XPS M1210
+ 1028 01f3 Inspiron 1420
+ 1028 01f5 Dell Inspiron 1501
+ 103c 03b5 Presario V3242AU
+ 103c 30b7 Presario V6133CL
+ 1183 0843 Alienware Aurora m9700
+ 0852 xD-Picture Card Controller
+ 1025 0121 Aspire 5920G
+ 1028 01f3 Inspiron 1420
+ 103c 30b5 Presario V3242AU
+ 103c 30b7 Presario V6133CL
+ 1043 1967 V6800V
+ 1180 0852 Pavilion 2410us
+ 1324 10cf P7120
+ e230 Memory Stick Host Controller
+ e822 MMC/SD Host Controller
+ 1028 040b Latitude E6510
+ e832 FireWire Host Controller
+ 1028 040b Latitude E6510
+1181 Telmatics International
+1183 Fujikura Ltd
+1184 Forks Inc
+1185 Dataworld International Ltd
+1186 D-Link System Inc
+ 0100 DC21041
+ 1002 DL10050 Sundance Ethernet
+ 1186 1002 DFE-550TX/FX
+ 1186 1012 DFE-580TX
+ 1025 AirPlus Xtreme G DWL-G650 Adapter
+ 1026 AirXpert DWL-AG650 Wireless Cardbus Adapter
+ 1043 AirXpert DWL-AG650 Wireless Cardbus Adapter
+ 1300 RTL8139 Ethernet
+ 1186 1300 DFE-538TX 10/100 Ethernet Adapter
+ 1186 1301 DFE-530TX+ 10/100 Ethernet Adapter
+ 1186 1303 DFE-528TX 10/100 Fast Ethernet PCI Adapter
+ 1340 DFE-690TXD CardBus PC Card
+ 1405 DFE-520TX Fast Ethernet PCI Adapter
+ 1540 DFE-680TX
+ 1541 DFE-680TXD CardBus PC Card
+ 1561 DRP-32TXD Cardbus PC Card
+ 3300 DWL-510 / DWL-610 802.11b [Realtek RTL8180L]
+ 1186 3300 DWL-610 Wireless Cardbus Adapter
+ 1186 3301 DWL-510 Wireless PCI Adapter
+ 3a03 AirPro DWL-A650 Wireless Cardbus Adapter(rev.B)
+ 3a04 AirPro DWL-AB650 Multimode Wireless Cardbus Adapter
+ 3a05 AirPro DWL-AB520 Multimode Wireless PCI Adapter
+ 3a07 AirXpert DWL-AG650 Wireless Cardbus Adapter
+ 3a08 AirXpert DWL-AG520 Wireless PCI Adapter
+ 3a10 AirXpert DWL-AG650 Wireless Cardbus Adapter(rev.B)
+ 3a11 AirXpert DWL-AG520 Wireless PCI Adapter(rev.B)
+ 3a12 AirPlus DWL-G650 Wireless Cardbus Adapter(rev.C)
+ 3a63 AirXpert DWL-AG660 Wireless Cardbus Adapter
+ 3a70 DWA-556 Xtreme N PCI Express Desktop Adapter
+ 3c00 D-link DWL-G650X
+ 3c09 AirPlus G DWL-G510
+ 4000 DL2000-based Gigabit Ethernet
+ 4001 DGE-550SX PCI-X Gigabit Ethernet Adapter
+ 4300 DGE-528T Gigabit Ethernet Adapter
+# There are at least 3 revisions of this adapter; 4800 is board revision A1 as far as I can tell, revision B1 is 4c00.
+ 4800 DGE-530T Gigabit Ethernet Adapter (rev 11)
+ 4b00 DGE-560T PCI Express Gigabit Ethernet Adapter
+ 4b01 DGE-530T Gigabit Ethernet Adapter (rev 11)
+ 4b02 DGE-560SX PCI Express Gigabit Ethernet Adapter
+ 4b03 DGE-550T Gigabit Ethernet Adapter V.B1
+ 4c00 Gigabit Ethernet Adapter
+ 1186 4c00 DGE-530T Gigabit Ethernet Adapter
+ 8400 D-Link DWL-650+ CardBus PC Card
+1187 Advanced Technology Laboratories, Inc.
+1188 Shima Seiki Manufacturing Ltd.
+1189 Matsushita Electronics Co Ltd
+118a Hilevel Technology
+118b Hypertec Pty Limited
+118c Corollary, Inc
+ 0014 PCIB [C-bus II to PCI bus host bridge chip]
+ 1117 Intel 8-way XEON Profusion Chipset [Cache Coherency Filter]
+118d BitFlow Inc
+ 0001 Raptor-PCI framegrabber
+ 0012 Model 12 Road Runner Frame Grabber
+ 0014 Model 14 Road Runner Frame Grabber
+ 0024 Model 24 Road Runner Frame Grabber
+ 0044 Model 44 Road Runner Frame Grabber
+ 0112 Model 12 Road Runner Frame Grabber
+ 0114 Model 14 Road Runner Frame Grabber
+ 0124 Model 24 Road Runner Frame Grabber
+ 0144 Model 44 Road Runner Frame Grabber
+ 0212 Model 12 Road Runner Frame Grabber
+ 0214 Model 14 Road Runner Frame Grabber
+ 0224 Model 24 Road Runner Frame Grabber
+ 0244 Model 44 Road Runner Frame Grabber
+ 0312 Model 12 Road Runner Frame Grabber
+ 0314 Model 14 Road Runner Frame Grabber
+ 0324 Model 24 Road Runner Frame Grabber
+ 0344 Model 44 Road Runner Frame Grabber
+118e Hermstedt GmbH
+118f Green Logic
+1190 Tripace
+ c731 TP-910/920/940 PCI Ultra(Wide) SCSI Adapter
+1191 Artop Electronic Corp
+ 0003 SCSI Cache Host Adapter
+ 0004 ATP8400
+ 0005 ATP850UF
+ 0006 ATP860 NO-BIOS
+ 0007 ATP860
+ 0008 ATP865 NO-ROM
+ 0009 ATP865
+ 000a ATP867-A
+ 000b ATP867-B
+ 000d ATP8620
+ 000e ATP8620
+ 8002 AEC6710 SCSI-2 Host Adapter
+ 8010 AEC6712UW SCSI
+ 8020 AEC6712U SCSI
+ 8030 AEC6712S SCSI
+ 8040 AEC6712D SCSI
+ 8050 AEC6712SUW SCSI
+ 8060 AEC6712 SCSI
+ 8080 AEC67160 SCSI
+ 8081 AEC67160S SCSI
+ 808a AEC67162 2-ch. LVD SCSI
+1192 Densan Company Ltd
+1193 Zeitnet Inc.
+ 0001 1221
+ 0002 1225
+1194 Toucan Technology
+1195 Ratoc System Inc
+1196 Hytec Electronics Ltd
+1197 Gage Applied Sciences, Inc.
+ 010c CompuScope 82G 8bit 2GS/s Analog Input Card
+1198 Lambda Systems Inc
+1199 Attachmate Corporation
+ 6832 Sierra Wireless MC8780 Device
+119a Mind Share, Inc.
+119b Omega Micro Inc.
+ 1221 82C092G
+119c Information Technology Inst.
+119d Bug, Inc. Sapporo Japan
+119e Fujitsu Microelectronics Ltd.
+ 0001 FireStream 155
+ 0003 FireStream 50
+119f Bull HN Information Systems
+11a0 Convex Computer Corporation
+11a1 Hamamatsu Photonics K.K.
+11a2 Sierra Research and Technology
+11a3 Deuretzbacher GmbH & Co. Eng. KG
+11a4 Barco Graphics NV
+11a5 Microunity Systems Eng. Inc
+11a6 Pure Data Ltd.
+11a7 Power Computing Corp.
+11a8 Systech Corp.
+11a9 InnoSys Inc.
+ 4240 AMCC S933Q Intelligent Serial Card
+11aa Actel
+# Nee Galileo Technology, Inc.
+11ab Marvell Technology Group Ltd.
+ 0146 GT-64010/64010A System Controller
+ 0f53 88E6318 Link Street network controller
+ 11ab MV88SE614x SATA II PCI-E controller
+ 138f W8300 802.11 Adapter (rev 07)
+ 1fa6 Marvell W8300 802.11 Adapter
+ 1186 3b08 AirPlus G DWL-G630 Wireless Cardbus Adapter (rev.A1)
+ 1fa7 88W8310 and 88W8000G [Libertas] 802.11g client chipset
+ 1faa 88w8335 [Libertas] 802.11b/g Wireless
+ 1385 4e00 WG511v2 54 Mbps Wireless PC Card
+ 1385 6b00 WG311v3 802.11g Wireless PCI Adapter
+ 1737 0040 WPC54G v5 802.11g Wireless-G Notebook Adapter
+ 2211 88SB2211 PCI Express to PCI Bridge
+ 2a01 88W8335 [Libertas] 802.11b/g Wireless
+ 2a02 88W8361 [TopDog] 802.11n Wireless
+ 07d1 3b02 DIR-615 rev. A1 Mini PCI Wireless Module
+ 1385 7e00 WN311T RangeMax Next 300 Mbps Wireless PCI Adapter
+ 1799 801b F5D8011 v2 802.11n N1 Wireless Notebook Card
+ 2a08 88W8362e [TopDog] 802.11a/b/g/n Wireless
+ 2a0a 88W8363 [TopDog] 802.11n Wireless
+ 2a0c 88W8363 [TopDog] 802.11n Wireless
+ 2a24 88W8363 [TopDog] 802.11n Wireless
+ 2a2b 88W8687 [TopDog] 802.11b/g Wireless
+ 2a30 88W8687 [TopDog] 802.11b/g Wireless
+ 2a40 88W8366 [TopDog] 802.11n Wireless
+ 2a43 88W8366 [TopDog] 802.11n Wireless
+ 4101 OLPC Cafe Controller Secure Digital Controller
+ 4320 88E8001 Gigabit Ethernet Controller
+ 1019 0f38 Marvell 88E8001 Gigabit Ethernet Controller (ECS)
+ 1019 8001 Marvell 88E8001 Gigabit Ethernet Controller (ECS)
+ 1043 173c Marvell 88E8001 Gigabit Ethernet Controller (Asus)
+ 1043 811a Marvell 88E8001 Gigabit Ethernet Controller (Asus)
+ 105b 0c19 Marvell 88E8001 Gigabit Ethernet Controller (Foxconn)
+ 10b8 b452 EZ Card 1000 (SMC9452TXV.2)
+ 11ab 0121 Marvell RDK-8001
+ 11ab 0321 Marvell RDK-8003
+ 11ab 1021 Marvell RDK-8010
+ 11ab 4320 Marvell Yukon Gigabit Ethernet 10/100/1000Baset-T Constroller (Asus)
+ 11ab 5021 Marvell Yukon Gigabit Ethernet 10/100/1000Base-T Controller (64 bit)
+ 11ab 9521 Marvell Yukon Gigabit Ethernet 10/100/1000Base-T Controller (32 bit)
+ 1458 e000 Marvell 88E8001 Gigabit Ethernet Controller (Gigabyte)
+ 147b 1406 Marvell 88E8001 Gigabit Ethernet Controller (Abit)
+ 15d4 0047 Marvell 88E8001 Gigabit Ethernet Controller (Iwill)
+ 1695 9025 Marvell 88E8001 Gigabit Ethernet Controller (Epox)
+ 17f2 1c03 Marvell 88E8001 Gigabit Ethernet Controller (Albatron)
+ 270f 2803 Marvell 88E8001 Gigabit Ethernet Controller (Chaintech)
+ 4340 88E8021 PCI-X IPMI Gigabit Ethernet Controller
+ 4341 88E8022 PCI-X IPMI Gigabit Ethernet Controller
+ 4342 88E8061 PCI-E IPMI Gigabit Ethernet Controller
+ 4343 88E8062 PCI-E IPMI Gigabit Ethernet Controller
+ 4344 88E8021 PCI-X IPMI Gigabit Ethernet Controller
+ 4345 88E8022 PCI-X IPMI Gigabit Ethernet Controller
+ 4346 88E8061 PCI-E IPMI Gigabit Ethernet Controller
+ 4347 88E8062 PCI-E IPMI Gigabit Ethernet Controller
+ 4c53 10d0 Telum ASLP10 PrAMC Gigabit Ethernet
+ 4350 88E8035 PCI-E Fast Ethernet Controller
+ 1179 0001 Marvell 88E8035 Fast Ethernet Controller (Toshiba)
+ 11ab 3521 Marvell RDK-8035
+ 1854 000d Marvell 88E8035 Fast Ethernet Controller (LGE)
+ 1854 000e Marvell 88E8035 Fast Ethernet Controller (LGE)
+ 1854 000f Marvell 88E8035 Fast Ethernet Controller (LGE)
+ 1854 0011 Marvell 88E8035 Fast Ethernet Controller (LGE)
+ 1854 0012 Marvell 88E8035 Fast Ethernet Controller (LGE)
+ 1854 0016 Marvell 88E8035 Fast Ethernet Controller (LGE)
+ 1854 0017 Marvell 88E8035 Fast Ethernet Controller (LGE)
+ 1854 0018 Marvell 88E8035 Fast Ethernet Controller (LGE)
+ 1854 0019 Marvell 88E8035 Fast Ethernet Controller (LGE)
+ 1854 001c Marvell 88E8035 Fast Ethernet Controller (LGE)
+ 1854 001e Marvell 88E8035 Fast Ethernet Controller (LGE)
+ 1854 0020 Marvell 88E8035 Fast Ethernet Controller (LGE)
+ 4351 88E8036 PCI-E Fast Ethernet Controller
+ 107b 4009 Marvell 88E8036 Fast Ethernet Controller (Wistron)
+ 10f7 8338 Marvell 88E8036 Fast Ethernet Controller (Panasonic)
+ 1179 0001 Marvell 88E8036 Fast Ethernet Controller (Toshiba)
+ 1179 ff00 Marvell 88E8036 Fast Ethernet Controller (Compal)
+ 1179 ff10 Marvell 88E8036 Fast Ethernet Controller (Inventec)
+ 11ab 3621 Marvell RDK-8036
+ 13d1 ac12 Abocom EFE3K - 10/100 Ethernet Expresscard
+ 161f 203d Marvell 88E8036 Fast Ethernet Controller (Arima)
+ 1854 000d Marvell 88E8036 Fast Ethernet Controller (LGE)
+ 1854 000e Marvell 88E8036 Fast Ethernet Controller (LGE)
+ 1854 000f Marvell 88E8036 Fast Ethernet Controller (LGE)
+ 1854 0011 Marvell 88E8036 Fast Ethernet Controller (LGE)
+ 1854 0012 Marvell 88E8036 Fast Ethernet Controller (LGE)
+ 1854 0016 Marvell 88E8036 Fast Ethernet Controller (LGE)
+ 1854 0017 Marvell 88E8036 Fast Ethernet Controller (LGE)
+ 1854 0018 Marvell 88E8036 Fast Ethernet Controller (LGE)
+ 1854 0019 Marvell 88E8036 Fast Ethernet Controller (LGE)
+ 1854 001c Marvell 88E8036 Fast Ethernet Controller (LGE)
+ 1854 001e Marvell 88E8036 Fast Ethernet Controller (LGE)
+ 1854 0020 Marvell 88E8036 Fast Ethernet Controller (LGE)
+ 4352 88E8038 PCI-E Fast Ethernet Controller
+ 4353 88E8039 PCI-E Fast Ethernet Controller
+ 104d 902d VAIO VGN-NR120E
+ 4354 88E8040 PCI-E Fast Ethernet Controller
+ 4355 88E8040T PCI-E Fast Ethernet Controller
+ 1179 ff50 Satellite P305D-S8995E
+ 4356 88EC033 PCI-E Fast Ethernet Controller
+ 4357 88E8042 PCI-E Fast Ethernet Controller
+ 435a 88E8048 PCI-E Fast Ethernet Controller
+ 4360 88E8052 PCI-E ASF Gigabit Ethernet Controller
+ 1043 8134 Marvell 88E8052 Gigabit Ethernet Controller (Asus)
+ 107b 4009 Marvell 88E8052 Gigabit Ethernet Controller (Wistron)
+ 11ab 5221 Marvell RDK-8052
+ 1458 e000 Marvell 88E8052 Gigabit Ethernet Controller (Gigabyte)
+ 1462 052c Marvell 88E8052 Gigabit Ethernet Controller (MSI)
+ 1849 8052 Marvell 88E8052 Gigabit Ethernet Controller (ASRock)
+ a0a0 0509 Marvell 88E8052 Gigabit Ethernet Controller (Aopen)
+ 4361 88E8050 PCI-E ASF Gigabit Ethernet Controller
+ 107b 3015 Marvell 88E8050 Gigabit Ethernet Controller (Gateway)
+ 11ab 5021 Marvell 88E8050 Gigabit Ethernet Controller (Intel)
+ 8086 3063 D925XCVLK mainboard
+ 8086 3439 Marvell 88E8050 Gigabit Ethernet Controller (Intel)
+ 4362 88E8053 PCI-E Gigabit Ethernet Controller
+ 103c 2a0d Marvell 88E8053 Gigabit Ethernet Controller (Asus)
+ 1043 8142 Marvell 88E8053 Gigabit Ethernet controller PCIe (Asus)
+ 109f 3197 Marvell 88E8053 Gigabit Ethernet Controller (Trigem)
+ 10f7 8338 Marvell 88E8053 Gigabit Ethernet Controller (Panasonic)
+ 10fd a430 Marvell 88E8053 Gigabit Ethernet Controller (SOYO)
+ 1179 0001 Marvell 88E8053 Gigabit Ethernet Controller (Toshiba)
+ 1179 ff00 Marvell 88E8053 Gigabit Ethernet Controller (Compal)
+ 1179 ff10 Marvell 88E8053 Gigabit Ethernet Controller (Inventec)
+ 11ab 5321 Marvell RDK-8053
+ 1297 c240 Marvell 88E8053 Gigabit Ethernet Controller (Shuttle)
+ 1297 c241 Marvell 88E8053 Gigabit Ethernet Controller (Shuttle)
+ 1297 c242 Marvell 88E8053 Gigabit Ethernet Controller (Shuttle)
+ 1297 c243 Marvell 88E8053 Gigabit Ethernet Controller (Shuttle)
+ 1297 c244 Marvell 88E8053 Gigabit Ethernet Controller (Shuttle)
+ 13d1 ac11 EGE5K - Giga Ethernet Expresscard
+ 1458 e000 Marvell 88E8053 Gigabit Ethernet Controller (Gigabyte)
+ 1462 058c Marvell 88E8053 Gigabit Ethernet Controller (MSI)
+ 14c0 0012 Marvell 88E8053 Gigabit Ethernet Controller (Compal)
+ 1558 04a0 Marvell 88E8053 Gigabit Ethernet Controller (Clevo)
+ 15bd 1003 Marvell 88E8053 Gigabit Ethernet Controller (DFI)
+ 161f 203c Marvell 88E8053 Gigabit Ethernet Controller (Arima)
+ 161f 203d Marvell 88E8053 Gigabit Ethernet Controller (Arima)
+ 1695 9029 Marvell 88E8053 Gigabit Ethernet Controller (Epox)
+ 17f2 2c08 Marvell 88E8053 Gigabit Ethernet Controller (Albatron)
+ 17ff 0585 Marvell 88E8053 Gigabit Ethernet Controller (Quanta)
+ 1849 8053 Marvell 88E8053 Gigabit Ethernet Controller (ASRock)
+ 1854 000b Marvell 88E8053 Gigabit Ethernet Controller (LGE)
+ 1854 000c Marvell 88E8053 Gigabit Ethernet Controller (LGE)
+ 1854 0010 Marvell 88E8053 Gigabit Ethernet Controller (LGE)
+ 1854 0013 Marvell 88E8053 Gigabit Ethernet Controller (LGE)
+ 1854 0014 Marvell 88E8053 Gigabit Ethernet Controller (LGE)
+ 1854 0015 Marvell 88E8053 Gigabit Ethernet Controller (LGE)
+ 1854 001a Marvell 88E8053 Gigabit Ethernet Controller (LGE)
+ 1854 001b Marvell 88E8053 Gigabit Ethernet Controller (LGE)
+ 1854 001d Marvell 88E8053 Gigabit Ethernet Controller (LGE)
+ 1854 001f Marvell 88E8053 Gigabit Ethernet Controller (LGE)
+ 1854 0021 Marvell 88E8053 Gigabit Ethernet Controller (LGE)
+ 1854 0022 Marvell 88E8053 Gigabit Ethernet Controller (LGE)
+ 270f 2801 Marvell 88E8053 Gigabit Ethernet Controller (Chaintech)
+ a0a0 0506 Marvell 88E8053 Gigabit Ethernet Controller (Aopen)
+ 4363 88E8055 PCI-E Gigabit Ethernet Controller
+ 4364 88E8056 PCI-E Gigabit Ethernet Controller
+ 11ba 00ba 8056 Gigabit Ethernet Controller
+ 4365 88E8070 based Ethernet Controller
+ 4366 88EC036 PCI-E Gigabit Ethernet Controller
+ 4367 88EC032 Ethernet Controller
+ 4368 88EC034 Ethernet Controller
+ 4369 88EC042 Ethernet Controller
+ 436a 88E8058 PCI-E Gigabit Ethernet Controller
+ 436b 88E8071 PCI-E Gigabit Ethernet Controller
+ 436c 88E8072 PCI-E Gigabit Ethernet Controller
+ 436d 88E8055 PCI-E Gigabit Ethernet Controller
+ 4370 88E8075 PCI-E Gigabit Ethernet Controller
+ 4380 88E8057 PCI-E Gigabit Ethernet Controller
+# AVB = "Audio Video Bridging"
+ 4381 Yukon Optima 88E8059 [PCIe Gigabit Ethernet Controller with AVB]
+ 4611 GT-64115 System Controller
+ 4620 GT-64120/64120A/64121A System Controller
+ 4801 GT-48001
+ 5005 Belkin F5D5005 Gigabit Desktop Network PCI Card
+ 5040 MV88SX5040 4-port SATA I PCI-X Controller
+ 5041 MV88SX5041 4-port SATA I PCI-X Controller
+ 5080 MV88SX5080 8-port SATA I PCI-X Controller
+ 5081 MV88SX5081 8-port SATA I PCI-X Controller
+ 5181 88f5181 [Orion-1] ARM SoC
+ 5182 88f5182 [Orion-NAS] ARM SoC
+ 5281 88f5281 [Orion-2] ARM SoC
+ 6041 MV88SX6041 4-port SATA II PCI-X Controller
+ 6042 88SX6042 PCI-X 4-Port SATA-II
+ 6081 MV88SX6081 8-port SATA II PCI-X Controller
+ 6101 88SE6101/6102 single-port PATA133 interface
+ 6111 88SE6111 1-port PATA133(IDE) and 1-port SATA II Controllers
+ 6121 88SE6121 SATA II Controller
+ 6141 88SE614x SATA II PCI-E controller
+ 6145 88SE6145 SATA II PCI-E controller
+ 6180 88F6180 [Kirkwood] ARM SoC
+ 6192 88F6190/6192 [Kirkwood] ARM SoC
+ 6281 88F6281 [Kirkwood] ARM SoC
+# This device ID was used for earlier chips.
+ 6381 MV78xx0 [Discovery Innovation] ARM SoC
+ 6440 88SE6440 SAS/SATA PCIe controller
+ 6450 64560 System Controller
+ 6460 MV64360/64361/64362 System Controller
+ 6480 MV64460/64461/64462 System Controller
+ 1775 c200 C2K CompactPCI single board computer
+ 6485 MV64460/64461/64462 System Controller, Revision B
+ 7042 88SX7042 PCI-e 4-port SATA-II
+ 16b8 434b Tempo SATA E4P
+ 7810 MV78100 [Discovery Innovation] ARM SoC
+ 7820 MV78200 [Discovery Innovation] ARM SoC
+ f003 GT-64010 Primary Image Piranha Image Generator
+11ac Canon Information Systems Research Aust.
+11ad Lite-On Communications Inc
+ 0002 LNE100TX
+ 11ad 0002 LNE100TX
+ 11ad 0003 LNE100TX
+ 11ad f003 LNE100TX
+ 11ad ffff LNE100TX
+ 1385 f004 FA310TX
+ 2646 f002 KNE110TX EtheRx Fast Ethernet
+ c115 LNE100TX [Linksys EtherFast 10/100]
+ 11ad c001 LNE100TX [ver 2.0]
+ 2646 000b KNE111TX
+11ae Aztech System Ltd
+11af Avid Technology Inc.
+ 0001 Cinema
+ ee40 Digidesign Audiomedia III
+11b0 V3 Semiconductor Inc.
+ 0002 V300PSC
+ 0292 V292PBC [Am29030/40 Bridge]
+ 0960 V96xPBC
+ c960 V96DPC
+11b1 Apricot Computers
+11b2 Eastman Kodak
+11b3 Barr Systems Inc.
+11b4 Leitch Technology International
+11b5 Radstone Technology Plc
+11b6 United Video Corp
+11b7 Motorola
+11b8 XPoint Technologies, Inc
+ 0001 Quad PeerMaster
+11b9 Pathlight Technology Inc.
+ c0ed SSA Controller
+11ba Videotron Corp
+11bb Pyramid Technology
+11bc Network Peripherals Inc
+ 0001 NP-PCI
+11bd Pinnacle Systems Inc.
+ 002e PCTV 40i
+ 0040 Royal TS Function 1
+ 11bd 0044 PCTV 2000i Dual DVB-T Pro PCI Tuner 1
+ 11bd 0045 PCTV Dual Sat Pro PCI 4000i Tuner 1
+ 0041 RoyalTS Function 2
+ 11bd 0044 PCTV 2000i Dual DVB-T Pro PCI Tuner 2
+ 11bd 0045 PCTV Dual Sat Pro PCI 4000i Tuner 2
+ 0042 Royal TS Function 3
+ 11bd 0044 PCTV 2000i Dual DVB-T Pro PCI Common
+ 11bd 0045 PCTV Dual Sat Pro PCI 4000i Common
+ 0051 PCTV HD 800i
+ bede AV/DV Studio Capture Card
+11be International Microcircuits Inc
+11bf Astrodesign, Inc.
+11c0 Hewlett Packard
+# Nee Lucent Microelectronics
+11c1 Agere Systems
+ 0440 56k WinModem
+ 1033 8015 LT WinModem 56k Data+Fax+Voice+Dsvd
+ 1033 8047 LT WinModem 56k Data+Fax+Voice+Dsvd
+ 1033 804f LT WinModem 56k Data+Fax+Voice+Dsvd
+ 10cf 102c LB LT Modem V.90 56k
+ 10cf 104a BIBLO LT Modem 56k
+ 10cf 105f LB2 LT Modem V.90 56k
+ 1179 0001 Internal V.90 Modem
+ 11c1 0440 LT WinModem 56k Data+Fax+Voice+Dsvd
+ 122d 4101 MDP7800-U Modem
+ 122d 4102 MDP7800SP-U Modem
+ 13e0 0040 LT WinModem 56k Data+Fax+Voice+Dsvd
+ 13e0 0440 LT WinModem 56k Data+Fax+Voice+Dsvd
+ 13e0 0441 LT WinModem 56k Data+Fax+Voice+Dsvd
+ 13e0 0450 LT WinModem 56k Data+Fax+Voice+Dsvd
+ 13e0 f100 LT WinModem 56k Data+Fax+Voice+Dsvd
+ 13e0 f101 LT WinModem 56k Data+Fax+Voice+Dsvd
+ 144d 2101 LT56PV Modem
+ 149f 0440 LT WinModem 56k Data+Fax+Voice+Dsvd
+ 0441 56k WinModem
+ 1033 804d LT WinModem 56k Data+Fax
+ 1033 8065 LT WinModem 56k Data+Fax
+ 1092 0440 Supra 56i
+ 1179 0001 Internal V.90 Modem
+ 11c1 0440 LT WinModem 56k Data+Fax
+ 11c1 0441 LT WinModem 56k Data+Fax
+ 122d 4100 MDP7800-U Modem
+ 13e0 0040 LT WinModem 56k Data+Fax
+ 13e0 0100 LT WinModem 56k Data+Fax
+ 13e0 0410 LT WinModem 56k Data+Fax
+ 13e0 0420 TelePath Internet 56k WinModem
+ 13e0 0440 LT WinModem 56k Data+Fax
+ 13e0 0443 LT WinModem 56k Data+Fax
+ 13e0 f102 LT WinModem 56k Data+Fax
+ 1416 9804 CommWave 56k Modem
+ 141d 0440 LT WinModem 56k Data+Fax
+ 144f 0441 Lucent 56k V.90 DF Modem
+ 144f 0449 Lucent 56k V.90 DF Modem
+ 144f 110d Lucent Win Modem
+ 1468 0441 Presario 56k V.90 DF Modem
+ 1668 0440 Lucent Win Modem
+ 0442 56k WinModem
+ 11c1 0440 LT WinModem 56k Data+Fax+Voice+VoiceView+Dsvd
+ 11c1 0442 LT WinModem 56k Data+Fax+Voice+VoiceView+Dsvd
+ 13e0 0412 LT WinModem 56k Data+Fax+Voice+VoiceView+Dsvd
+ 13e0 0442 LT WinModem 56k Data+Fax+Voice+VoiceView+Dsvd
+ 13fc 2471 LT WinModem 56k Data+Fax+Voice+VoiceView+Dsvd
+ 144d 2104 LT56PT Modem
+ 144f 1104 LT WinModem 56k Data+Fax+Voice+VoiceView+Dsvd
+ 149f 0440 LT WinModem 56k Data+Fax+Voice+VoiceView+Dsvd
+ 1668 0440 LT WinModem 56k Data+Fax+Voice+VoiceView+Dsvd
+ 0443 LT WinModem
+ 0444 LT WinModem
+ 0445 LT WinModem
+ 8086 2203 PRO/100+ MiniPCI (probably an Ambit U98.003.C.00 combo card)
+ 8086 2204 PRO/100+ MiniPCI on Armada E500
+ 0446 LT WinModem
+ 0447 LT WinModem
+ 0448 WinModem 56k
+ 1014 0131 Lucent Win Modem
+ 1033 8066 LT WinModem 56k Data+Fax+Voice+Dsvd
+ 13e0 0030 56k Voice Modem
+ 13e0 0040 LT WinModem 56k Data+Fax+Voice+Dsvd
+# Actiontech eth+modem card as used by Dell &c.
+ 1668 2400 LT WinModem 56k (MiniPCI Ethernet+Modem)
+ 0449 L56xM+S [Mars-2] WinModem 56k
+ 0e11 b14d 56k V.90 Modem
+ 1014 018c ThinkPad 600X
+ 13e0 0020 LT WinModem 56k Data+Fax
+ 13e0 0041 TelePath Internet 56k WinModem
+ 1436 0440 Lucent Win Modem
+ 144f 0449 Lucent 56k V.90 DFi Modem
+ 1468 0410 IBM ThinkPad T23
+ 1468 0440 Lucent Win Modem
+ 1468 0449 Presario 56k V.90 DFi Modem
+ 044a F-1156IV WinModem (V90, 56KFlex)
+ 10cf 1072 LB Global LT Modem
+ 13e0 0012 LT WinModem 56k Data+Fax+Voice+VoiceView+Dsvd
+ 13e0 0042 LT WinModem 56k Data+Fax+Voice+VoiceView+Dsvd
+ 144f 1005 LT WinModem 56k Data+Fax+Voice+VoiceView+Dsvd
+ 044b LT WinModem
+ 044c LT WinModem
+ 044d LT WinModem
+ 044e LT WinModem
+ 044f V90 WildWire Modem
+ 0450 LT WinModem
+ 1033 80a8 Versa Note Vxi
+ 144f 4005 Magnia SG20
+ 1468 0450 Evo N600c
+ 0451 LT WinModem
+ 0452 LT WinModem
+ 0453 LT WinModem
+ 0454 LT WinModem
+ 0455 LT WinModem
+ 0456 LT WinModem
+ 0457 LT WinModem
+ 0458 LT WinModem
+ 0459 LT WinModem
+ 045a LT WinModem
+ 045c LT WinModem
+ 0461 V90 WildWire Modem
+ 0462 V90 WildWire Modem
+ 0480 Venus Modem (V90, 56KFlex)
+ 048c V.92 56K WinModem
+# InPorte Home Internal 56k Modem/fax/answering machine/SMS Features
+ 048f V.92 56k WinModem
+ 0620 Lucent V.92 Data/Fax Modem
+ 1040 HDA softmodem
+ 2600 StarPro26XX family (SP2601, SP2603, SP2612) DSP
+ 3026 HDA Modem
+ 5400 OR3TP12 FPSC
+ 5656 Venus Modem
+ 5801 USB
+ 5802 USS-312 USB Controller
+ 5803 USS-344S USB Controller
+ 5811 FW322/323
+ 1043 8294 IEEE 1394a Firewire Controller
+ 8086 524c D865PERL mainboard
+ dead 0800 FireWire Host Bus Adapter
+ 5901 FW643 PCI Express1394b Controller (PHY/Link)
+ 1443 0643 FireBoard800-e V.2
+ 1546 0643 FWB-PCIE1X20
+ 8110 T8110 H.100/H.110 TDM switch
+ 12d9 000c E1/T1 PMXc cPCI carrier card
+ ab10 WL60010 Wireless LAN MAC
+ ab11 WL60040 Multimode Wireles LAN MAC
+ 11c1 ab12 WaveLAN 11abg Cardbus card (Model 1102)
+ 11c1 ab13 WaveLAN 11abg MiniPCI card (Model 0512)
+ 11c1 ab15 WaveLAN 11abg Cardbus card (Model 1106)
+ 11c1 ab16 WaveLAN 11abg MiniPCI card (Model 0516)
+ ab20 ORiNOCO PCI Adapter
+ ab21 Agere Wireless PCI Adapter
+ ab30 Hermes2 Mini-PCI WaveLAN a/b/g
+ 14cd 2012 Hermes2 Mini-PCI WaveLAN a/b/g
+ ed00 ET-131x PCI-E Ethernet Controller
+ ed01 ET-131x PCI-E Ethernet Controller
+11c2 Sand Microelectronics
+11c3 NEC Corporation
+11c4 Document Technologies, Inc
+11c5 Shiva Corporation
+11c6 Dainippon Screen Mfg. Co. Ltd
+11c7 D.C.M. Data Systems
+11c8 Dolphin Interconnect Solutions AS
+ 0658 PSB32 SCI-Adapter D31x
+ d665 PSB64 SCI-Adapter D32x
+ d667 PSB66 SCI-Adapter D33x
+11c9 Magma
+ 0010 16-line serial port w/- DMA
+ 0011 4-line serial port w/- DMA
+11ca LSI Systems, Inc
+11cb Specialix Research Ltd.
+ 2000 PCI_9050
+ 11cb 0200 SX
+ 11cb b008 I/O8+
+ 4000 SUPI_1
+ 8000 T225
+11cc Michels & Kleberhoff Computer GmbH
+11cd HAL Computer Systems, Inc.
+11ce Netaccess
+11cf Pioneer Electronic Corporation
+11d0 Lockheed Martin Federal Systems-Manassas
+11d1 Auravision
+ 01f7 VxP524
+ 01f9 VxP951
+11d2 Intercom Inc.
+11d3 Trancell Systems Inc
+11d4 Analog Devices
+ 0078 AD1986HD sound chip
+ 1535 Blackfin BF535 processor
+ 1805 SM56 PCI modem
+ 1889 AD1889 sound chip
+ 194a AD1984A sound chip
+ 1981 AD1981HD sound chip
+ 1983 AD1983HD sound chip
+ 1984 AD1984HD sound chip
+ 17aa 20bb T61p Notebook
+ 1986 AD1986A sound chip
+ 11d4 1986 Lenovo N100 B9G
+ 198b AD1988B Sound Chip
+ 5340 AD1881 sound chip
+11d5 Ikon Corporation
+ 0115 10115
+ 0117 10117
+11d6 Tekelec Telecom
+11d7 Trenton Technology, Inc.
+11d8 Image Technologies Development
+11d9 TEC Corporation
+11da Novell
+11db Sega Enterprises Ltd
+11dc Questra Corporation
+11dd Crosfield Electronics Limited
+11de Zoran Corporation
+ 6017 miroVIDEO DC30
+ 6057 ZR36057PQC Video cutting chipset
+ 1031 7efe DC10 Plus
+ 1031 fc00 MiroVIDEO DC50, Motion JPEG Capture/CODEC Board
+ 12f8 8a02 Tekram Video Kit
+ 13ca 4231 JPEG/TV Card
+ 6120 ZR36120
+ 1328 f001 Cinemaster C DVD Decoder
+ 13c2 0000 MediaFocus Satellite TV Card
+ 1de1 9fff Video Kit C210
+11df New Wave PDG
+11e0 Cray Communications A/S
+11e1 GEC Plessey Semi Inc.
+11e2 Samsung Information Systems America
+11e3 Quicklogic Corporation
+ 0001 COM-ON-AIR Dosch&Amand DECT
+ 0560 QL5064 Companion Design Demo Board
+ 5030 PC Watchdog
+ 8417 QL5064 [QuickPCI] PCI v2.2 bridge for SMT417 Dual TMS320C6416T PMC Module
+11e4 Second Wave Inc
+11e5 IIX Consulting
+11e6 Mitsui-Zosen System Research
+11e7 Toshiba America, Elec. Company
+11e8 Digital Processing Systems Inc.
+11e9 Highwater Designs Ltd.
+11ea Elsag Bailey
+11eb Formation Inc.
+11ec Coreco Inc
+ 000d Oculus-F/64P
+ 1800 Cobra/C6
+11ed Mediamatics
+11ee Dome Imaging Systems Inc
+11ef Nicolet Technologies B.V.
+11f0 Compu-Shack
+ 4231 FDDI
+ 4232 FASTline UTP Quattro
+ 4233 FASTline FO
+ 4234 FASTline UTP
+ 4235 FASTline-II UTP
+ 4236 FASTline-II FO
+ 4731 GIGAline
+11f1 Symbios Logic Inc
+11f2 Picture Tel Japan K.K.
+11f3 Keithley Metrabyte
+ 0011 KPCI-PIO24
+11f4 Kinetic Systems Corporation
+ 2915 CAMAC controller
+11f5 Computing Devices International
+11f6 Compex
+ 0112 ENet100VG4
+ 0113 FreedomLine 100
+ 1401 ReadyLink 2000
+ 2011 RL100-ATX 10/100
+ 11f6 2011 RL100-ATX
+ 2201 ReadyLink 100TX (Winbond W89C840)
+ 11f6 2011 ReadyLink 100TX
+ 9881 RL100TX Fast Ethernet
+11f7 Scientific Atlanta
+11f8 PMC-Sierra Inc.
+ 5220 BR522x [PMC-Sierra maxRAID SAS Controller]
+ 7364 PM7364 [FREEDM - 32 Frame Engine & Datalink Mgr]
+ 7375 PM7375 [LASAR-155 ATM SAR]
+ 7384 PM7384 [FREEDM - 84P672 Frm Engine & Datalink Mgr]
+ 8000 PM8000 [SPC - SAS Protocol Controller]
+11f9 I-Cube Inc
+11fa Kasan Electronics Company, Ltd.
+11fb Datel Inc
+11fc Silicon Magic
+11fd High Street Consultants
+11fe Comtrol Corporation
+ 0001 RocketPort 32 port w/external I/F
+ 0002 RocketPort 8 port w/external I/F
+ 0003 RocketPort 16 port w/external I/F
+ 0004 RocketPort 4 port w/quad cable
+ 0005 RocketPort 8 port w/octa cable
+ 0006 RocketPort 8 port w/RJ11 connectors
+ 0007 RocketPort 4 port w/RJ11 connectors
+ 0008 RocketPort 8 port w/ DB78 SNI (Siemens) connector
+ 0009 RocketPort 16 port w/ DB78 SNI (Siemens) connector
+ 000a RocketPort Plus 4 port
+ 000b RocketPort Plus 8 port
+ 000c RocketModem 6 port
+ 000d RocketModem 4-port
+ 000e RocketPort Plus 2 port RS232
+ 000f RocketPort Plus 2 port RS422
+ 0040 RocketPort Infinity Octa, 8port, RJ45
+ 0041 RocketPort Infinity 32port, External Interface
+ 0042 RocketPort Infinity 8port, External Interface
+ 0043 RocketPort Infinity 16port, External Interface
+ 0044 RocketPort Infinity Quad, 4port, DB
+ 0045 RocketPort Infinity Octa, 8port, DB
+ 0047 RocketPort Infinity 4port, RJ45
+ 004f RocketPort Infinity 2port, SMPTE
+ 0052 RocketPort Infinity Octa, 8port, SMPTE
+ 0801 RocketPort UPCI 32 port w/external I/F
+ 0802 RocketPort UPCI 8 port w/external I/F
+ 0803 RocketPort UPCI 16 port w/external I/F
+ 0805 RocketPort UPCI 8 port w/octa cable
+ 080c RocketModem III 8 port
+ 080d RocketModem III 4 port
+ 0811 RocketPort UPCI Plus 8 port RS232
+ 0812 RocketPort UPCI Plus 8 port RS422
+ 0903 RocketPort Compact PCI 16 port w/external I/F
+ 8015 RocketPort 4-port UART 16954
+11ff Scion Corporation
+ 0003 AG-5
+1200 CSS Corporation
+1201 Vista Controls Corp
+1202 Network General Corp.
+ 4300 Gigabit Ethernet Adapter
+ 1202 9841 SK-9841 LX
+ 1202 9842 SK-9841 LX dual link
+ 1202 9843 SK-9843 SX
+ 1202 9844 SK-9843 SX dual link
+1203 Bayer Corporation, Agfa Division
+1204 Lattice Semiconductor Corporation
+1205 Array Corporation
+1206 Amdahl Corporation
+1208 Parsytec GmbH
+ 4853 HS-Link Device
+1209 SCI Systems Inc
+120a Synaptel
+120b Adaptive Solutions
+120c Technical Corp.
+120d Compression Labs, Inc.
+120e Cyclades Corporation
+ 0100 Cyclom-Y below first megabyte
+ 0101 Cyclom-Y above first megabyte
+ 0102 Cyclom-4Y below first megabyte
+ 0103 Cyclom-4Y above first megabyte
+ 0104 Cyclom-8Y below first megabyte
+ 0105 Cyclom-8Y above first megabyte
+ 0200 Cyclades-Z below first megabyte
+ 0201 Cyclades-Z above first megabyte
+ 0300 PC300/RSV or /X21 (2 ports)
+ 0301 PC300/RSV or /X21 (1 port)
+ 0310 PC300/TE (2 ports)
+ 0311 PC300/TE (1 port)
+ 0320 PC300/TE-M (2 ports)
+ 0321 PC300/TE-M (1 port)
+ 0400 PC400
+120f Essential Communications
+ 0001 Roadrunner serial HIPPI
+1210 Hyperparallel Technologies
+1211 Braintech Inc
+1212 Kingston Technology Corp.
+1213 Applied Intelligent Systems, Inc.
+1214 Performance Technologies, Inc.
+1215 Interware Co., Ltd
+1216 Purup Prepress A/S
+1217 O2 Micro, Inc.
+ 00f7 Firewire (IEEE 1394)
+ 1179 ff50 Satellite P305D-S8995E
+ 6729 OZ6729
+ 673a OZ6730
+ 6832 OZ6832/6833 CardBus Controller
+ 6836 OZ6836/6860 CardBus Controller
+ 6872 OZ6812 CardBus Controller
+ 6925 OZ6922 CardBus Controller
+ 6933 OZ6933/711E1 CardBus/SmartCardBus Controller
+ 1025 1016 Travelmate 612 TX
+ 6972 OZ601/6912/711E0 CardBus/SmartCardBus Controller
+ 1014 020c ThinkPad R30
+ 1028 0152 Latitude D500
+ 1179 0001 Magnia Z310
+ 7110 OZ711Mx 4-in-1 MemoryCardBus Accelerator
+ 103c 088c NC8000 laptop
+ 103c 0890 NC6000 laptop
+ 1734 106c Amilo A1645
+ 7112 OZ711EC1/M1 SmartCardBus/MemoryCardBus Controller
+ 7113 OZ711EC1 SmartCardBus Controller
+ 1025 0035 TravelMate 660
+ 7114 OZ711M1/MC1 4-in-1 MemoryCardBus Controller
+ 7120 Integrated MMC/SD Controller
+ 1179 ff50 Satellite P305D-S8995E
+ 7130 Integrated MS/xD Controller
+ 1179 ff50 Satellite P305D-S8995E
+ 7134 OZ711MP1/MS1 MemoryCardBus Controller
+ 7135 Cardbus bridge
+ 7136 OZ711SP1 Memory CardBus Controller
+ 71e2 OZ711E2 SmartCardBus Controller
+ 7212 OZ711M2 4-in-1 MemoryCardBus Controller
+ 7213 OZ6933E CardBus Controller
+ 7223 OZ711M3/MC3 4-in-1 MemoryCardBus Controller
+ 103c 088c NC8000 laptop
+ 103c 0890 NC6000 laptop
+ 10cf 11c4 Lifebook P5020D Laptop
+ 7233 OZ711MP3/MS3 4-in-1 MemoryCardBus Controller
+1218 Hybricon Corp.
+1219 First Virtual Corporation
+121a 3Dfx Interactive, Inc.
+ 0001 Voodoo
+ 0002 Voodoo 2
+ 0003 Voodoo Banshee
+ 1092 0003 Monster Fusion
+ 1092 4000 Monster Fusion
+ 1092 4002 Monster Fusion
+ 1092 4801 Monster Fusion AGP
+ 1092 4803 Monster Fusion AGP
+ 1092 8030 Monster Fusion
+ 1092 8035 Monster Fusion AGP
+ 10b0 0001 Dragon 4000
+ 1102 1017 3D Blaster Banshee PCI (CT6760)
+ 1102 1018 3D Blaster Banshee VE
+ 121a 0001 Voodoo Banshee AGP
+ 121a 0003 Voodoo Banshee AGP SGRAM
+ 121a 0004 Voodoo Banshee
+ 139c 0016 Raven
+ 139c 0017 Raven
+ 14af 0002 Maxi Gamer Phoenix
+ 0004 Voodoo Banshee [Velocity 100]
+ 0005 Voodoo 3
+ 121a 0004 Voodoo3 AGP
+ 121a 0030 Voodoo3 AGP
+ 121a 0031 Voodoo3 AGP
+ 121a 0034 Voodoo3 AGP
+ 121a 0036 Voodoo3 2000 PCI
+ 121a 0037 Voodoo3 AGP
+ 121a 0038 Voodoo3 AGP
+ 121a 003a Voodoo3 AGP
+ 121a 0044 Voodoo3
+ 121a 004b Velocity 100
+ 121a 004c Velocity 200
+ 121a 004d Voodoo3 AGP
+ 121a 004e Voodoo3 AGP
+ 121a 0051 Voodoo3 AGP
+ 121a 0052 Voodoo3 AGP
+ 121a 0057 Voodoo3 3000 PCI
+ 121a 0060 Voodoo3 3500 TV (NTSC)
+ 121a 0061 Voodoo3 3500 TV (PAL)
+ 121a 0062 Voodoo3 3500 TV (SECAM)
+ 0009 Voodoo 4 / Voodoo 5
+ 121a 0003 Voodoo5 PCI 5500
+ 121a 0009 Voodoo5 AGP 5500/6000
+ 0057 Voodoo 3/3000 [Avenger]
+121b Advanced Telecommunications Modules
+121c Nippon Texaco., Ltd
+121d Lippert Automationstechnik GmbH
+121e CSPI
+ 0201 Myrinet 2000 Scalable Cluster Interconnect
+121f Arcus Technology, Inc.
+1220 Ariel Corporation
+ 1220 AMCC 5933 TMS320C80 DSP/Imaging board
+1221 Contec Co., Ltd
+ 9172 PO-64L(PCI)H [Isolated Digital Output Board for PCI]
+ 91a2 PO-32L(PCI)H [Isolated Digital Output Board for PCI]
+ 91c3 DA16-16(LPCI)L [Un-insulated highly precise analog output board for Low Profile PCI]
+ b152 DIO-96D2-LPCI
+ c103 ADA16-32/2(PCI)F [High-Speed Analog I/O Board for PCI]
+1222 Ancor Communications, Inc.
+1223 Artesyn Communication Products
+ 0003 PM/Link
+ 0004 PM/T1
+ 0005 PM/E1
+ 0008 PM/SLS
+ 0009 BajaSpan Resource Target
+ 000a BajaSpan Section 0
+ 000b BajaSpan Section 1
+ 000c BajaSpan Section 2
+ 000d BajaSpan Section 3
+ 000e PM/PPC
+1224 Interactive Images
+1225 Power I/O, Inc.
+1227 Tech-Source
+ 0006 Raptor GFX 8P
+ 0023 Raptor GFX [1100T]
+ 0045 Raptor 4000-L [Linux version]
+ 004a Raptor 4000-LR-L [Linux version]
+1228 Norsk Elektro Optikk A/S
+1229 Data Kinesis Inc.
+122a Integrated Telecom
+122b LG Industrial Systems Co., Ltd
+122c Sican GmbH
+122d Aztech System Ltd
+ 1206 368DSP
+ 1400 Trident PCI288-Q3DII (NX)
+ 50dc 3328 Audio
+ 122d 0001 3328 Audio
+ 80da 3328 Audio
+ 122d 0001 3328 Audio
+122e Xyratex
+ 7722 Napatech XL1
+ 7724 Napatech XL2/XA
+ 7729 Napatech XD
+122f Andrew Corporation
+1230 Fishcamp Engineering
+1231 Woodward McCoach, Inc.
+ 04e1 Desktop PCI Telephony 4
+ 05e1 Desktop PCI Telephony 5/6
+ 0d00 LightParser
+ 0d02 LightParser 2
+ 0d13 Desktop PCI L1/L3 Telephony
+1232 GPT Limited
+1233 Bus-Tech, Inc.
+# Also Bochs uses this for virtual VGA...
+1234 Technical Corp.
+1235 Risq Modular Systems, Inc.
+1236 Sigma Designs Corporation
+ 0000 RealMagic64/GX
+ 6401 REALmagic 64/GX (SD 6425)
+1237 Alta Technology Corporation
+1238 Adtran
+1239 3DO Company
+123a Visicom Laboratories, Inc.
+123b Seeq Technology, Inc.
+123c Century Systems, Inc.
+123d Engineering Design Team, Inc.
+ 0000 EasyConnect 8/32
+ 0002 EasyConnect 8/64
+ 0003 EasyIO
+123e Simutech, Inc.
+123f C-Cube Microsystems
+ 00e4 MPEG
+ 8120 E4?
+ 11bd 0006 DV500 E4
+ 11bd 000a DV500 E4
+ 11bd 000f DV500 E4
+ 1809 0016 Emuzed MAUI-III PCI PVR FM TV
+ 8888 Cinemaster C 3.0 DVD Decoder
+ 1002 0001 Cinemaster C 3.0 DVD Decoder
+ 1002 0002 Cinemaster C 3.0 DVD Decoder
+ 1328 0001 Cinemaster C 3.0 DVD Decoder
+1240 Marathon Technologies Corp.
+1241 DSC Communications
+# Formerly Jaycor Networks, Inc.
+1242 JNI Corporation
+ 1560 JNIC-1560 PCI-X Fibre Channel Controller
+ 1242 6562 FCX2-6562 Dual Channel PCI-X Fibre Channel Adapter
+ 1242 656a FCX-6562 PCI-X Fibre Channel Adapter
+ 4643 FCI-1063 Fibre Channel Adapter
+ 6562 FCX2-6562 Dual Channel PCI-X Fibre Channel Adapter
+ 656a FCX-6562 PCI-X Fibre Channel Adapter
+1243 Delphax
+# Audio-Visuelles Marketing und Computersysteme
+1244 AVM GmbH
+ 0700 B1 ISDN
+ 0800 C4 ISDN
+ 0a00 A1 ISDN [Fritz]
+ 1244 0a00 FRITZ!Card ISDN Controller
+ 0e00 Fritz!PCI v2.0 ISDN
+ 1100 C2 ISDN
+ 1200 T1 ISDN
+ 2700 Fritz!Card DSL SL
+ 2900 Fritz!Card DSL v2.0
+1245 A.P.D., S.A.
+1246 Dipix Technologies, Inc.
+1247 Xylon Research, Inc.
+1248 Central Data Corporation
+1249 Samsung Electronics Co., Ltd.
+124a AEG Electrocom GmbH
+124b SBS/Greenspring Modular I/O
+ 0040 PCI-40A or cPCI-200 Quad IndustryPack carrier
+ 124b 9080 PCI9080 Bridge
+124c Solitron Technologies, Inc.
+124d Stallion Technologies, Inc.
+ 0000 EasyConnection 8/32
+ 0002 EasyConnection 8/64
+ 0003 EasyIO
+ 0004 EasyConnection/RA
+124e Cylink
+124f Infortrend Technology, Inc.
+ 0041 IFT-2000 Series RAID Controller
+1250 Hitachi Microcomputer System Ltd
+1251 VLSI Solutions Oy
+1253 Guzik Technical Enterprises
+1254 Linear Systems Ltd.
+ 0065 DVB Master FD
+ 007c DVB Master Quad/o
+1255 Optibase Ltd
+ 1110 MPEG Forge
+ 1210 MPEG Fusion
+ 2110 VideoPlex
+ 2120 VideoPlex CC
+ 2130 VideoQuest
+1256 Perceptive Solutions, Inc.
+ 4201 PCI-2220I
+ 4401 PCI-2240I
+ 5201 PCI-2000
+1257 Vertex Networks, Inc.
+1258 Gilbarco, Inc.
+1259 Allied Telesyn International
+ 2560 AT-2560 Fast Ethernet Adapter (i82557B)
+ 2801 AT-2801FX (RTL-8139)
+ a117 RTL81xx Fast Ethernet
+ a11e RTL81xx Fast Ethernet
+ a120 21x4x DEC-Tulip compatible 10/100 Ethernet
+125a ABB Power Systems
+125b Asix Electronics Corporation
+ 1400 AX88141 Fast Ethernet Controller
+ 1186 1100 AX8814X Based PCI Fast Ethernet Adapter
+125c Aurora Technologies, Inc.
+ 0101 Saturn 4520P
+ 0640 Aries 16000P
+125d ESS Technology
+ 0000 ES336H Fax Modem (Early Model)
+ 1948 ES1948 Maestro-1
+ 1968 ES1968 Maestro 2
+ 1028 0085 ES1968 Maestro-2 PCI
+ 1033 8051 ES1968 Maestro-2 Audiodrive
+ 1969 ES1969 Solo-1 Audiodrive
+ 1014 0166 ES1969 SOLO-1 AudioDrive on IBM Aptiva Mainboard
+ 125d 8888 Solo-1 Audio Adapter
+ 153b 111b Terratec 128i PCI
+ 1978 ES1978 Maestro 2E
+ 0e11 b112 Armada M700/E500
+ 1033 803c ES1978 Maestro-2E Audiodrive
+ 1033 8058 ES1978 Maestro-2E Audiodrive
+ 1092 4000 Monster Sound MX400
+ 1179 0001 ES1978 Maestro-2E Audiodrive
+ 1988 ES1988 Allegro-1
+ 0e11 0098 Evo N600c
+ 1092 4100 Sonic Impact S100
+ 125d 0431 Allegro AudioDrive
+ 125d 1988 ESS Allegro-1 Audiodrive
+ 125d 1998 Allegro AudioDrive
+ 125d 1999 Allegro-1 AudioDrive
+ 1989 ESS Modem
+ 125d 1989 ESS Modem
+ 1998 ES1983S Maestro-3i PCI Audio Accelerator
+ 1028 00b1 Latitude C600
+ 1028 00e6 ES1983S Maestro-3i (Dell Inspiron 8100)
+ 1999 ES1983S Maestro-3i PCI Modem Accelerator
+ 199a ES1983S Maestro-3i PCI Audio Accelerator
+ 199b ES1983S Maestro-3i PCI Modem Accelerator
+ 2808 ES336H Fax Modem (Later Model)
+ 2838 ES2838/2839 SuperLink Modem
+ 2898 ES2898 Modem
+ 125d 0424 ES56-PI Data Fax Modem
+ 125d 0425 ES56T-PI Data Fax Modem
+ 125d 0426 ES56V-PI Data Fax Modem
+ 125d 0427 VW-PI Data Fax Modem
+ 125d 0428 ES56ST-PI Data Fax Modem
+ 125d 0429 ES56SV-PI Data Fax Modem
+ 147a c001 ES56-PI Data Fax Modem
+ 148d 1030 HCF WV-PI56 [ESS ES56-PI Data Fax Modem]
+ 14fe 0428 ES56-PI Data Fax Modem
+ 14fe 0429 ES56-PI Data Fax Modem
+125e Specialvideo Engineering SRL
+125f Concurrent Technologies, Inc.
+1260 Intersil Corporation
+ 3872 ISL3872 [Prism 3]
+ 1468 0202 LAN-Express IEEE 802.11b Wireless LAN
+ 3873 ISL3874 [Prism 2.5]/ISL3872 [Prism 3]
+ 10cf 1169 MBH7WM01-8734 802.11b Wireless Mini PCI Card [ISL3874]
+ 1186 3501 DWL-520 Wireless PCI Adapter (rev A) [ISL3874]
+ 1186 3700 DWL-520 Wireless PCI Adapter (rev E1) [ISL3872]
+ 1385 4105 MA311 802.11b wireless adapter [ISL3874]
+ 1668 0414 HWP01170-01 802.11b PCI Wireless Adapter
+ 16a5 1601 AIR.mate PC-400 PCI Wireless LAN Adapter
+ 1737 3874 WMP11 v1 802.11b Wireless-B PCI Adapter [ISL3874]
+ 8086 2510 M3AWEB Wireless 802.11b MiniPCI Adapter
+ 8086 2513 Wireless 802.11b MiniPCI Adapter
+ 3877 ISL3877 [Prism Indigo]
+ 3886 ISL3886 [Prism Javelin/Prism Xbow]
+ 17cf 0037 XG-901 and clones Wireless Adapter
+ 3890 ISL3890 [Prism GT/Prism Duette]/ISL3886 [Prism Javelin/Prism Xbow]
+ 10b8 2802 SMC2802W V1 Wireless PCI Adapter [ISL3890]
+ 10b8 2835 SMC2835W Wireless Cardbus Adapter
+ 10b8 a835 SMC2835W V2 Wireless Cardbus Adapter
+ 1113 4203 WN4201B
+ 1113 8201 T-Com T-Sinus 154pcicard Wireless PCI Adapter
+ 1113 b301 T-Sinus 154card Cardbus
+ 1113 ee03 SMC2802W V2 Wireless PCI Adapter [ISL3886]
+ 1113 ee08 SMC2835W V3 EU Wireless Cardbus Adapter
+ 1186 3202 DWL-G650 A1 Wireless Adapter
+ 1259 c104 CG-WLCB54GT Wireless Adapter
+ 1260 0000 WG511 v1 54 Mbps Wireless PC Card
+ 1385 4800 WG511 v2/v3 54 Mbps Wireless PC Card
+ 16a5 1605 ALLNET ALL0271 Wireless PCI Adapter
+ 17cf 0014 XG-600 and clones Wireless Adapter
+ 17cf 0020 XG-900 and clones Wireless Adapter
+ 187e 3403 G-110 802.11g Wireless Cardbus Adapter
+ 8130 HMP8130 NTSC/PAL Video Decoder
+ 8131 HMP8131 NTSC/PAL Video Decoder
+# This is probably more likely a HW fault, but I am keeping it for now --mj
+ ffff ISL3886IK
+ 1260 0000 Senao 3054MP+ (J) mini-PCI WLAN 802.11g adapter
+1261 Matsushita-Kotobuki Electronics Industries, Ltd.
+1262 ES Computer Company, Ltd.
+1263 Sonic Solutions
+1264 Aval Nagasaki Corporation
+1265 Casio Computer Co., Ltd.
+1266 Microdyne Corporation
+ 0001 NE10/100 Adapter (i82557B)
+ 1910 NE2000Plus (RT8029) Ethernet Adapter
+ 1266 1910 NE2000Plus Ethernet Adapter
+1267 S. A. Telecommunications
+ 5352 PCR2101
+ 5a4b Telsat Turbo
+1268 Tektronix
+1269 Thomson-CSF/TTM
+126a Lexmark International, Inc.
+126b Adax, Inc.
+126c Northern Telecom
+ 1211 10/100BaseTX [RTL81xx]
+ 126c 802.11b Wireless Ethernet Adapter
+126d Splash Technology, Inc.
+126e Sumitomo Metal Industries, Ltd.
+126f Silicon Motion, Inc.
+ 0501 SM501 VoyagerGX Rev. AA
+ 0510 SM501 VoyagerGX Rev. B
+ 0710 SM710 LynxEM
+ 0712 SM712 LynxEM+
+ 0720 SM720 Lynx3DM
+ 0730 SM731 Cougar3DR
+ 0810 SM810 LynxE
+ 0811 SM811 LynxE
+ 0820 SM820 Lynx3D
+ 0910 SM910
+1270 Olympus Optical Co., Ltd.
+1271 GW Instruments
+1272 Telematics International
+1273 Hughes Network Systems
+ 0002 DirecPC
+1274 Ensoniq
+ 1171 ES1373 [AudioPCI] (also Creative Labs CT5803)
+ 1371 ES1371 [AudioPCI-97]
+ 0e11 0024 AudioPCI on Motherboard Compaq Deskpro
+ 0e11 b1a7 ES1371, ES1373 AudioPCI
+ 1033 80ac ES1371, ES1373 AudioPCI
+ 1042 1854 Tazer
+ 107b 8054 Tabor2
+ 1274 1371 Creative Sound Blaster AudioPCI64V, AudioPCI128
+ 1274 8001 CT4751 board
+ 1462 6470 ES1371, ES1373 AudioPCI On Motherboard MS-6147 1.1A
+ 1462 6560 ES1371, ES1373 AudioPCI On Motherboard MS-6156 1.10
+ 1462 6630 ES1371, ES1373 AudioPCI On Motherboard MS-6163BX 1.0A
+ 1462 6631 ES1371, ES1373 AudioPCI On Motherboard MS-6163VIA 1.0A
+ 1462 6632 ES1371, ES1373 AudioPCI On Motherboard MS-6163BX 2.0A
+ 1462 6633 ES1371, ES1373 AudioPCI On Motherboard MS-6163VIA 2.0A
+ 1462 6820 ES1371, ES1373 AudioPCI On Motherboard MS-6182 1.00
+ 1462 6822 ES1371, ES1373 AudioPCI On Motherboard MS-6182 1.00A
+ 1462 6830 ES1371, ES1373 AudioPCI On Motherboard MS-6183 1.00
+ 1462 6880 ES1371, ES1373 AudioPCI On Motherboard MS-6188 1.00
+ 1462 6900 ES1371, ES1373 AudioPCI On Motherboard MS-6190 1.00
+ 1462 6910 ES1371, ES1373 AudioPCI On Motherboard MS-6191
+ 1462 6930 ES1371, ES1373 AudioPCI On Motherboard MS-6193
+ 1462 6990 ES1371, ES1373 AudioPCI On Motherboard MS-6199BX 2.0A
+ 1462 6991 ES1371, ES1373 AudioPCI On Motherboard MS-6199VIA 2.0A
+ 14a4 2077 ES1371, ES1373 AudioPCI On Motherboard KR639
+ 14a4 2105 ES1371, ES1373 AudioPCI On Motherboard MR800
+ 14a4 2107 ES1371, ES1373 AudioPCI On Motherboard MR801
+ 14a4 2172 ES1371, ES1373 AudioPCI On Motherboard DR739
+ 1509 9902 ES1371, ES1373 AudioPCI On Motherboard KW11
+ 1509 9903 ES1371, ES1373 AudioPCI On Motherboard KW31
+ 1509 9904 ES1371, ES1373 AudioPCI On Motherboard KA11
+ 1509 9905 ES1371, ES1373 AudioPCI On Motherboard KC13
+ 152d 8801 ES1371, ES1373 AudioPCI On Motherboard CP810E
+ 152d 8802 ES1371, ES1373 AudioPCI On Motherboard CP810
+ 152d 8803 ES1371, ES1373 AudioPCI On Motherboard P3810E
+ 152d 8804 ES1371, ES1373 AudioPCI On Motherboard P3810-S
+ 152d 8805 ES1371, ES1373 AudioPCI On Motherboard P3820-S
+ 270f 2001 ES1371, ES1373 AudioPCI On Motherboard 6CTR
+ 270f 2200 ES1371, ES1373 AudioPCI On Motherboard 6WTX
+ 270f 3000 ES1371, ES1373 AudioPCI On Motherboard 6WSV
+ 270f 3100 ES1371, ES1373 AudioPCI On Motherboard 6WIV2
+ 270f 3102 ES1371, ES1373 AudioPCI On Motherboard 6WIV
+ 270f 7060 ES1371, ES1373 AudioPCI On Motherboard 6ASA2
+ 8086 4249 ES1371, ES1373 AudioPCI On Motherboard BI440ZX
+ 8086 424c ES1371, ES1373 AudioPCI On Motherboard BL440ZX
+ 8086 425a ES1371, ES1373 AudioPCI On Motherboard BZ440ZX
+ 8086 4341 ES1371, ES1373 AudioPCI On Motherboard Cayman
+ 8086 4343 ES1371, ES1373 AudioPCI On Motherboard Cape Cod
+ 8086 4541 D815EEA Motherboard
+ 8086 4649 ES1371, ES1373 AudioPCI On Motherboard Fire Island
+ 8086 464a ES1371, ES1373 AudioPCI On Motherboard FJ440ZX
+ 8086 4d4f ES1371, ES1373 AudioPCI On Motherboard Montreal
+ 8086 4f43 ES1371, ES1373 AudioPCI On Motherboard OC440LX
+ 8086 5243 ES1371, ES1373 AudioPCI On Motherboard RC440BX
+ 8086 5352 ES1371, ES1373 AudioPCI On Motherboard SunRiver
+ 8086 5643 ES1371, ES1373 AudioPCI On Motherboard Vancouver
+ 8086 5753 ES1371, ES1373 AudioPCI On Motherboard WS440BX
+ 5000 ES1370 [AudioPCI]
+ 5880 5880B [AudioPCI]
+ 1274 2000 Creative Sound Blaster AudioPCI128
+ 1274 2003 Creative SoundBlaster AudioPCI 128
+ 1274 5880 Creative Sound Blaster AudioPCI128
+ 1274 8001 Sound Blaster 16PCI 4.1ch
+ 1458 a000 5880 AudioPCI On Motherboard 6OXET
+ 1462 6880 5880 AudioPCI On Motherboard MS-6188 1.00
+ 270f 2001 5880 AudioPCI On Motherboard 6CTR
+ 270f 2200 5880 AudioPCI On Motherboard 6WTX
+ 270f 7040 5880 AudioPCI On Motherboard 6ATA4
+ 8001 CT5880 [AudioPCI]
+ 8002 5880A [AudioPCI]
+1275 Network Appliance Corporation
+1276 Switched Network Technologies, Inc.
+1277 Comstream
+1278 Transtech Parallel Systems Ltd.
+ 0701 TPE3/TM3 PowerPC Node
+ 0710 TPE5 PowerPC PCI board
+ 1100 PMC-FPGA02
+ 1101 TS-C43 card with 4 ADSP-TS101 processors
+1279 Transmeta Corporation
+ 0060 TM8000 Northbridge
+ 0061 TM8000 AGP bridge
+ 0295 Northbridge
+ 0395 LongRun Northbridge
+ 0396 SDRAM controller
+ 0397 BIOS scratchpad
+127a Rockwell International
+ 1002 HCF 56k Data/Fax Modem
+ 1092 094c SupraExpress 56i PRO [Diamond SUP2380]
+ 122d 4002 HPG / MDP3858-U
+ 122d 4005 MDP3858-E
+ 122d 4007 MDP3858-A/-NZ
+ 122d 4012 MDP3858-SA
+ 122d 4017 MDP3858-W
+ 122d 4018 MDP3858-W
+ 127a 1002 Rockwell 56K D/F HCF Modem
+ 1003 HCF 56k Data/Fax Modem
+ 0e11 b0bc 229-DF Zephyr
+ 0e11 b114 229-DF Cheetah
+ 1033 802b 229-DF
+ 13df 1003 PCI56RX Modem
+ 13e0 0117 IBM
+ 13e0 0147 IBM F-1156IV+/R3 Spain V.90 Modem
+ 13e0 0197 IBM
+ 13e0 01c7 IBM F-1156IV+/R3 WW V.90 Modem
+ 13e0 01f7 IBM
+ 1436 1003 IBM
+ 1436 1103 IBM 5614PM3G V.90 Modem
+ 1436 1602 Compaq 229-DF Ducati
+ 1004 HCF 56k Data/Fax/Voice Modem
+ 1048 1500 MicroLink 56k Modem
+ 10cf 1059 Fujitsu 229-DFRT
+ 1005 HCF 56k Data/Fax/Voice/Spkp (w/Handset) Modem
+ 1005 127a AOpen FM56-P
+ 1033 8029 229-DFSV
+ 1033 8054 Modem
+ 10cf 103c Fujitsu
+ 10cf 1055 Fujitsu 229-DFSV
+ 10cf 1056 Fujitsu 229-DFSV
+ 122d 4003 MDP3858SP-U
+ 122d 4006 Packard Bell MDP3858V-E
+ 122d 4008 MDP3858SP-A/SP-NZ
+ 122d 4009 MDP3858SP-E
+ 122d 4010 MDP3858V-U
+ 122d 4011 MDP3858SP-SA
+ 122d 4013 MDP3858V-A/V-NZ
+ 122d 4015 MDP3858SP-W
+ 122d 4016 MDP3858V-W
+ 122d 4019 MDP3858V-SA
+ 13df 1005 PCI56RVP Modem
+ 13e0 0187 IBM
+ 13e0 01a7 IBM
+ 13e0 01b7 IBM DF-1156IV+/R3 Spain V.90 Modem
+ 13e0 01d7 IBM DF-1156IV+/R3 WW V.90 Modem
+ 1436 1005 IBM
+ 1436 1105 IBM
+ 1437 1105 IBM 5614PS3G V.90 Modem
+ 1022 HCF 56k Modem
+ 1436 1303 M3-5614PM3G V.90 Modem
+ 1023 HCF 56k Data/Fax Modem
+ 122d 4020 Packard Bell MDP3858-WE
+ 122d 4023 MDP3858-UE
+ 13e0 0247 IBM F-1156IV+/R6 Spain V.90 Modem
+ 13e0 0297 IBM
+ 13e0 02c7 IBM F-1156IV+/R6 WW V.90 Modem
+ 1436 1203 IBM
+ 1436 1303 IBM
+ 1024 HCF 56k Data/Fax/Voice Modem
+ 1025 HCF 56k Data/Fax/Voice/Spkp (w/Handset) Modem
+ 10cf 106a Fujitsu 235-DFSV
+ 122d 4021 Packard Bell MDP3858V-WE
+ 122d 4022 MDP3858SP-WE
+ 122d 4024 MDP3858V-UE
+ 122d 4025 MDP3858SP-UE
+ 1026 HCF 56k PCI Speakerphone Modem
+ 1032 HCF 56k Modem
+ 1033 HCF 56k Modem
+ 1034 HCF 56k Modem
+ 1035 HCF 56k PCI Speakerphone Modem
+ 1036 HCF 56k Modem
+ 1085 HCF 56k Volcano PCI Modem
+ 2004 HSF 56k Data/Fax/Voice/Spkp (w/Handset) Modem
+ 2005 HCF 56k Data/Fax Modem
+ 104d 8044 229-DFSV
+ 104d 8045 229-DFSV
+ 104d 8055 PBE/Aztech 235W-DFSV
+ 104d 8056 235-DFSV
+ 104d 805a Modem
+ 104d 805f Modem
+ 104d 8074 Modem
+ 2013 HSF 56k Data/Fax Modem
+ 1179 0001 Modem
+ 1179 ff00 Modem
+ 2014 HSF 56k Data/Fax/Voice Modem
+ 10cf 1057 Fujitsu Citicorp III
+ 122d 4050 MSP3880-U
+ 122d 4055 MSP3880-W
+ 2015 HSF 56k Data/Fax/Voice/Spkp (w/Handset) Modem
+ 10cf 1063 Fujitsu
+ 10cf 1064 Fujitsu
+ 1468 2015 Fujitsu
+ 2016 HSF 56k Data/Fax/Voice/Spkp Modem
+ 122d 4051 MSP3880V-W
+ 122d 4052 MSP3880SP-W
+ 122d 4054 MSP3880V-U
+ 122d 4056 MSP3880SP-U
+ 122d 4057 MSP3880SP-A
+ 4311 Riptide HSF 56k PCI Modem
+ 127a 4311 Ring Modular? Riptide HSF RT HP Dom
+ 13e0 0210 HP-GVC
+ 4320 Riptide PCI Audio Controller
+ 1235 4320 Riptide PCI Audio Controller
+ 4321 Riptide HCF 56k PCI Modem
+ 1235 4321 Hewlett Packard DF
+ 1235 4324 Hewlett Packard DF
+ 13e0 0210 Hewlett Packard DF
+ 144d 2321 Riptide
+ 4322 Riptide PCI Game Controller
+ 1235 4322 Riptide PCI Game Controller
+ 8234 RapidFire 616X ATM155 Adapter
+ 108d 0022 RapidFire 616X ATM155 Adapter
+ 108d 0027 RapidFire 616X ATM155 Adapter
+127b Pixera Corporation
+127c Crosspoint Solutions, Inc.
+127d Vela Research
+127e Winnov, L.P.
+ 0010 Videum 1000 Plus
+127f Fujifilm
+1280 Photoscript Group Ltd.
+1281 Yokogawa Electric Corporation
+1282 Davicom Semiconductor, Inc.
+ 6585 DM562P V90 Modem
+ 9009 Ethernet 100/10 MBit
+ 9100 21x4x DEC-Tulip compatible 10/100 Ethernet
+ 9102 21x4x DEC-Tulip compatible 10/100 Ethernet
+# Subsystem ID is main ID reveresed.
+ 0291 8212 DM9102A (DM9102AE, SM9102AF) Ethernet 100/10 MBit
+ 9132 Ethernet 100/10 MBit
+1283 Integrated Technology Express, Inc.
+ 673a IT8330G
+ 8152 IT8152F/G Advanced RISC-to-PCI Companion Chip
+ 8211 ITE 8211F Single Channel UDMA 133
+ 1043 8138 P5GD1-VW Mainboard
+# PCI version seems to be IT8212, embedded seems to be ITE8212
+ 8212 IT/ITE8212 Dual channel ATA RAID controller
+ 1283 0001 IT/ITE8212 Dual channel ATA RAID controller
+ 8213 IT8213 IDE Controller
+ 8330 IT8330G
+ 8872 IT8874F PCI Dual Serial Port Controller
+ 8888 IT8888F/G PCI to ISA Bridge with SMB [Golden Gate]
+ 8889 IT8889F PCI to ISA Bridge
+ e886 IT8330G
+1284 Sahara Networks, Inc.
+1285 Platform Technologies, Inc.
+ 0100 AGOGO sound chip (aka ESS Maestro 1)
+1286 Mazet GmbH
+1287 M-Pact, Inc.
+ 001e LS220D DVD Decoder
+ 001f LS220C DVD Decoder
+1288 Timestep Corporation
+1289 AVC Technology, Inc.
+128a Asante Technologies, Inc.
+128b Transwitch Corporation
+128c Retix Corporation
+128d G2 Networks, Inc.
+ 0021 ATM155 Adapter
+128e Hoontech Corporation/Samho Multi Tech Ltd.
+ 0008 ST128 WSS/SB
+ 0009 ST128 SAM9407
+ 000a ST128 Game Port
+ 000b ST128 MPU Port
+ 000c ST128 Ctrl Port
+128f Tateno Dennou, Inc.
+1290 Sord Computer Corporation
+1291 NCS Computer Italia
+1292 Tritech Microelectronics Inc
+ fc02 Pyramid3D TR25202
+1293 Media Reality Technology
+1294 Rhetorex, Inc.
+1295 Imagenation Corporation
+ 0800 PXR800
+ 1000 PXD1000
+1296 Kofax Image Products
+1297 Holco Enterprise Co, Ltd/Shuttle Computer
+1298 Spellcaster Telecommunications Inc.
+1299 Knowledge Technology Lab.
+129a VMetro, inc.
+ 0615 PBT-615 PCI-X Bus Analyzer
+ 1100 PMC-FPGA05
+ 1106 XMC-FPGA05F, PCI interface
+ 1107 XMC-FPGA05F, PCIe interface
+ 1108 XMC-FPGA05D, PCI interface
+ 1109 XMC-FPGA05D, PCIe interface
+129b Image Access
+129c Jaycor
+129d Compcore Multimedia, Inc.
+129e Victor Company of Japan, Ltd.
+129f OEC Medical Systems, Inc.
+12a0 Allen-Bradley Company
+12a1 Simpact Associates, Inc.
+12a2 Newgen Systems Corporation
+12a3 Lucent Technologies
+ 8105 T8105 H100 Digital Switch
+12a4 NTT Electronics Technology Company
+12a5 Vision Dynamics Ltd.
+12a6 Scalable Networks, Inc.
+12a7 AMO GmbH
+12a8 News Datacom
+12a9 Xiotech Corporation
+12aa SDL Communications, Inc.
+12ab Yuan Yuan Enterprise Co., Ltd.
+ 0000 MPG160/Kuroutoshikou ITVC15-STVLP
+ 0002 AU8830 [Vortex2] Based Sound Card With A3D Support
+ 0003 T507 (DVB-T) TV tuner/capture device
+ 2300 Club-3D Zap TV2100
+ 3000 MPG-200C PCI DVD Decoder Card
+ 4789 MPC788 MiniPCI Hybrid TV Tuner
+ fff3 MPG600/Kuroutoshikou ITVC16-STVLP
+ ffff MPG600/Kuroutoshikou ITVC16-STVLP
+12ac Measurex Corporation
+12ad Multidata GmbH
+12ae Alteon Networks Inc.
+ 0001 AceNIC Gigabit Ethernet
+ 1014 0104 Gigabit Ethernet-SX PCI Adapter
+ 12ae 0001 Gigabit Ethernet-SX (Universal)
+ 1410 0104 Gigabit Ethernet-SX PCI Adapter
+ 0002 AceNIC Gigabit Ethernet (Copper)
+ 10a9 8002 Acenic Gigabit Ethernet
+ 12ae 0002 Gigabit Ethernet-T (3C986-T)
+ 00fa Farallon PN9100-T Gigabit Ethernet
+12af TDK USA Corp
+12b0 Jorge Scientific Corp
+12b1 GammaLink
+12b2 General Signal Networks
+12b3 Inter-Face Co Ltd
+12b4 FutureTel Inc
+12b5 Granite Systems Inc.
+12b6 Natural Microsystems
+12b7 Cognex Modular Vision Systems Div. - Acumen Inc.
+12b8 Korg
+# Nee US Robotics
+12b9 3Com Corp, Modem Division
+ 1006 WinModem
+ 12b9 005c USR 56k Internal Voice WinModem (Model 3472)
+ 12b9 005e USR 56k Internal WinModem (Models 662975)
+ 12b9 0062 USR 56k Internal Voice WinModem (Model 662978)
+ 12b9 0068 USR 56k Internal Voice WinModem (Model 5690)
+ 12b9 007a USR 56k Internal Voice WinModem (Model 662974)
+ 12b9 007f USR 56k Internal WinModem (Models 5698, 5699)
+ 12b9 0080 USR 56k Internal WinModem (Models 2975, 3528)
+ 12b9 0081 USR 56k Internal Voice WinModem (Models 2974, 3529)
+ 12b9 0091 USR 56k Internal Voice WinModem (Model 2978)
+ 1007 USR 56k Internal WinModem
+ 12b9 00a3 USR 56k Internal WinModem (Model 3595)
+ 12b9 00c4 U.S. Robotics V.92 Voice Faxmodem (2884A/B/C)
+ 1008 56K FaxModem Model 5610
+ 12b9 00a2 USR 56k Internal FAX Modem (Model 2977)
+ 12b9 00aa USR 56k Internal Voice Modem (Model 2976)
+ 12b9 00ab USR 56k Internal Voice Modem (Model 5609)
+ 12b9 00ac USR 56k Internal Voice Modem (Model 3298)
+ 12b9 00ad USR 56k Internal FAX Modem (Model 5610)
+ 12b9 00d3 USR 56K Internal V92 FAX Modem (Model 5610)
+ 12b9 baba USR 56K Internal Voice Modem 3CP3298-DEL (Model 5601) [Hawk]
+12ba BittWare, Inc.
+12bb Nippon Unisoft Corporation
+12bc Array Microsystems
+12bd Computerm Corp.
+12be Anchor Chips Inc.
+ 3041 AN3041Q CO-MEM
+ 3042 AN3042Q CO-MEM Lite
+ 12be 3042 Anchor Chips Lite Evaluation Board
+12bf Fujifilm Microdevices
+12c0 Infimed
+12c1 GMM Research Corp
+12c2 Mentec Limited
+12c3 Holtek Microelectronics Inc
+ 0058 PCI NE2K Ethernet
+ 5598 PCI NE2K Ethernet
+12c4 Connect Tech Inc
+ 0001 Blue HEAT/PCI 8 (RS232/CL/RJ11)
+ 0002 Blue HEAT/PCI 4 (RS232)
+ 0003 Blue HEAT/PCI 2 (RS232)
+ 0004 Blue HEAT/PCI 8 (UNIV, RS485)
+ 0005 Blue HEAT/PCI 4+4/6+2 (UNIV, RS232/485)
+ 0006 Blue HEAT/PCI 4 (OPTO, RS485)
+ 0007 Blue HEAT/PCI 2+2 (RS232/485)
+ 0008 Blue HEAT/PCI 2 (OPTO, Tx, RS485)
+ 0009 Blue HEAT/PCI 2+6 (RS232/485)
+ 000a Blue HEAT/PCI 8 (Tx, RS485)
+ 000b Blue HEAT/PCI 4 (Tx, RS485)
+ 000c Blue HEAT/PCI 2 (20 MHz, RS485)
+ 000d Blue HEAT/PCI 2 PTM
+ 0100 NT960/PCI
+ 0201 cPCI Titan - 2 Port
+ 0202 cPCI Titan - 4 Port
+ 0300 CTI PCI UART 2 (RS232)
+ 0301 CTI PCI UART 4 (RS232)
+ 0302 CTI PCI UART 8 (RS232)
+ 0310 CTI PCI UART 1+1 (RS232/485)
+ 0311 CTI PCI UART 2+2 (RS232/485)
+ 0312 CTI PCI UART 4+4 (RS232/485)
+ 0320 CTI PCI UART 2
+ 0321 CTI PCI UART 4
+ 0322 CTI PCI UART 8
+ 0330 CTI PCI UART 2 (RS485)
+ 0331 CTI PCI UART 4 (RS485)
+ 0332 CTI PCI UART 8 (RS485)
+12c5 Picture Elements Incorporated
+ 007e Imaging/Scanning Subsystem Engine
+ 007f Imaging/Scanning Subsystem Engine
+ 0081 PCIVST [Grayscale Thresholding Engine]
+ 0085 Video Simulator/Sender
+ 0086 THR2 Multi-scale Thresholder
+12c6 Mitani Corporation
+12c7 Dialogic Corp
+# 12 Line, 6 port, CT-BUS/SC-BUS, loopstart FXO adaptor.
+ 0546 Springware D/120JCT-LS
+# 24 Channel, 1 Port, CT-BUS/SC-BUS, T1/PRI adaptor.
+ 0647 Springware D/240JCT-T1
+# 4 Line, 4 port, CT-BUS/SC-BUS, loopstart FXO adaptor. Revision 01
+ 0676 Springware D/41JCT-LS
+# 48 Channel, 2 Port, CT-BUS/SC-BUS, T1/PRI adaptor.
+ 0685 Springware D/480JCT-2T1
+12c8 G Force Co, Ltd
+12c9 Gigi Operations
+12ca Integrated Computing Engines
+12cb Antex Electronics Corporation
+ 0027 SC4 (StudioCard)
+ 002e StudioCard 2000
+12cc Pluto Technologies International
+12cd Aims Lab
+12ce Netspeed Inc.
+12cf Prophet Systems, Inc.
+12d0 GDE Systems, Inc.
+12d1 PSITech
+12d2 NVidia / SGS Thomson (Joint Venture)
+ 0008 NV1
+ 0009 DAC64
+ 0018 Riva128
+ 1048 0c10 VICTORY Erazor
+ 107b 8030 STB Velocity 128
+ 1092 0350 Viper V330
+ 1092 1092 Viper V330
+ 10b4 1b1b STB Velocity 128
+ 10b4 1b1d STB Velocity 128
+ 10b4 1b1e STB Velocity 128, PAL TV-Out
+ 10b4 1b20 STB Velocity 128 Sapphire
+ 10b4 1b21 STB Velocity 128
+ 10b4 1b22 STB Velocity 128 AGP, NTSC TV-Out
+ 10b4 1b23 STB Velocity 128 AGP, PAL TV-Out
+ 10b4 1b27 STB Velocity 128 DVD
+ 10b4 1b88 MVP Pro 128
+ 10b4 222a STB Velocity 128 AGP
+ 10b4 2230 STB Velocity 128
+ 10b4 2232 STB Velocity 128
+ 10b4 2235 STB Velocity 128 AGP
+ 2a15 54a3 3DVision-SAGP / 3DexPlorer 3000
+ 0019 Riva128ZX
+ 0020 TNT
+ 0028 TNT2
+ 0029 UTNT2
+ 002c VTNT2
+ 00a0 ITNT2
+12d3 Vingmed Sound A/S
+12d4 Ulticom (Formerly DGM&S)
+ 0200 T1 Card
+12d5 Equator Technologies Inc
+ 0003 BSP16
+ 1000 BSP15
+12d6 Analogic Corp
+12d7 Biotronic SRL
+12d8 Pericom Semiconductor
+ 01a7 PI7C21P100 PCI to PCI Bridge
+ 71e2 PI7C7300A/PI7C7300D PCI-to-PCI Bridge
+ 71e3 PI7C7300A/PI7C7300D PCI-to-PCI Bridge (Secondary Bus 2)
+ 8140 PI7C8140A PCI-to-PCI Bridge
+ 8148 PI7C8148A/PI7C8148B PCI-to-PCI Bridge
+ 8150 PCI to PCI Bridge
+ 8152 PI7C8152A/PI7C8152B/PI7C8152BI PCI-to-PCI Bridge
+ 8154 PI7C8154A/PI7C8154B/PI7C8154BI PCI-to-PCI Bridge
+ e110 PI7C9X110 PCI Express to PCI bridge
+ 1775 11cc CC11/CL11 CompactPCI Bridge
+ e130 PCI Express to PCI-XPI7C9X130 PCI-X Bridge
+12d9 Aculab PLC
+ 0002 PCI Prosody
+ 0004 cPCI Prosody
+ 0005 Aculab E1/T1 PCI card
+ 1078 Prosody X class e1000 device
+ 12d9 000d Prosody X PCI
+ 12d9 000e Prosody X cPCI
+12da True Time Inc.
+12db Annapolis Micro Systems, Inc
+12dc Symicron Computer Communication Ltd.
+12dd Management Graphics
+12de Rainbow Technologies
+ 0200 CryptoSwift CS200
+12df SBS Technologies Inc
+12e0 Chase Research
+ 0010 ST16C654 Quad UART
+ 0020 ST16C654 Quad UART
+ 0030 ST16C654 Quad UART
+12e1 Nintendo Co, Ltd
+12e2 Datum Inc. Bancomm-Timing Division
+12e3 Imation Corp - Medical Imaging Systems
+12e4 Brooktrout Technology Inc
+12e5 Apex Semiconductor Inc
+12e6 Cirel Systems
+12e7 Sunsgroup Corporation
+12e8 Crisc Corp
+12e9 GE Spacenet
+12ea Zuken
+12eb Aureal Semiconductor
+ 0001 Vortex 1
+ 104d 8036 AU8820 Vortex Digital Audio Processor
+ 1092 2000 Sonic Impact A3D
+ 1092 2100 Sonic Impact A3D
+ 1092 2110 Sonic Impact A3D
+ 1092 2200 Sonic Impact A3D
+ 122d 1002 AU8820 Vortex Digital Audio Processor
+ 12eb 0001 AU8820 Vortex Digital Audio Processor
+ 5053 3355 Montego
+ 0002 Vortex 2
+ 104d 8049 AU8830 Vortex 3D Digital Audio Processor
+ 104d 807b AU8830 Vortex 3D Digital Audio Processor
+ 1092 3000 Monster Sound II
+ 1092 3001 Monster Sound II
+ 1092 3002 Monster Sound II
+ 1092 3003 Monster Sound II
+ 1092 3004 Monster Sound II
+ 12eb 0002 AU8830 Vortex 3D Digital Audio Processor
+ 12eb 0088 AU8830 Vortex 3D Digital Audio Processor
+ 144d 3510 AU8830 Vortex 3D Digital Audio Processor
+ 5053 3356 Montego II
+ 0003 AU8810 Vortex Digital Audio Processor
+ 104d 8049 AU8810 Vortex Digital Audio Processor
+ 104d 8077 AU8810 Vortex Digital Audio Processor
+ 109f 1000 AU8810 Vortex Digital Audio Processor
+ 12eb 0003 AU8810 Vortex Digital Audio Processor
+ 1462 6780 AU8810 Vortex Digital Audio Processor
+ 14a4 2073 AU8810 Vortex Digital Audio Processor
+ 14a4 2091 AU8810 Vortex Digital Audio Processor
+ 14a4 2104 AU8810 Vortex Digital Audio Processor
+ 14a4 2106 AU8810 Vortex Digital Audio Processor
+ 8803 Vortex 56k Software Modem
+ 12eb 8803 Vortex 56k Software Modem
+12ec 3A International, Inc.
+12ed Optivision Inc.
+12ee Orange Micro
+12ef Vienna Systems
+12f0 Pentek
+12f1 Sorenson Vision Inc
+12f2 Gammagraphx, Inc.
+12f3 Radstone Technology
+12f4 Megatel
+12f5 Forks
+12f6 Dawson France
+12f7 Cognex
+12f8 Electronic Design GmbH
+ 0002 VideoMaker
+12f9 Four Fold Ltd
+12fb Spectrum Signal Processing
+ 0001 PMC-MAI
+ 00f5 F5 Dakar
+ 02ad PMC-2MAI
+ 2adc ePMC-2ADC
+ 3100 PRO-3100
+ 3500 PRO-3500
+ 4d4f Modena
+ 8120 ePMC-8120
+ da62 Daytona C6201 PCI (Hurricane)
+ db62 Ingliston XBIF
+ dc62 Ingliston PLX9054
+ dd62 Ingliston JTAG/ISP
+ eddc ePMC-MSDDC
+ fa01 ePMC-FPGA
+12fc Capital Equipment Corp
+12fd I2S
+12fe ESD Electronic System Design GmbH
+12ff Lexicon
+1300 Harman International Industries Inc
+1302 Computer Sciences Corp
+1303 Innovative Integration
+ 0030 X3-SDF 4-channel XMC acquisition board
+1304 Juniper Networks
+1305 Netphone, Inc
+1306 Duet Technologies
+# Nee ComputerBoards
+1307 Measurement Computing
+ 0001 PCI-DAS1602/16
+ 000b PCI-DIO48H
+ 000c PCI-PDISO8
+ 000d PCI-PDISO16
+ 000f PCI-DAS1200
+ 0010 PCI-DAS1602/12
+ 0014 PCI-DIO24H
+ 0015 PCI-DIO24H/CTR3
+ 0016 PCI-DIO48H/CTR15
+ 0017 PCI-DIO96H
+ 0018 PCI-CTR05
+ 0019 PCI-DAS1200/JR
+ 001a PCI-DAS1001
+ 001b PCI-DAS1002
+ 001c PCI-DAS1602JR/16
+ 001d PCI-DAS6402/16
+ 001e PCI-DAS6402/12
+ 001f PCI-DAS16/M1
+ 0020 PCI-DDA02/12
+ 0021 PCI-DDA04/12
+ 0022 PCI-DDA08/12
+ 0023 PCI-DDA02/16
+ 0024 PCI-DDA04/16
+ 0025 PCI-DDA08/16
+ 0026 PCI-DAC04/12-HS
+ 0027 PCI-DAC04/16-HS
+ 0028 PCI-DIO24
+ 0029 PCI-DAS08
+ 002c PCI-INT32
+ 0033 PCI-DUAL-AC5
+ 0034 PCI-DAS-TC
+ 0035 PCI-DAS64/M1/16
+ 0036 PCI-DAS64/M2/16
+ 0037 PCI-DAS64/M3/16
+ 004c PCI-DAS1000
+ 004d PCI-QUAD04
+ 0052 PCI-DAS4020/12
+ 0053 PCIM-DDA06/16
+ 0054 PCI-DIO96
+ 005d PCI-DAS6023
+ 005e PCI-DAS6025
+ 005f PCI-DAS6030
+ 0060 PCI-DAS6031
+ 0061 PCI-DAS6032
+ 0062 PCI-DAS6033
+ 0063 PCI-DAS6034
+ 0064 PCI-DAS6035
+ 0065 PCI-DAS6040
+ 0066 PCI-DAS6052
+ 0067 PCI-DAS6070
+ 0068 PCI-DAS6071
+ 006f PCI-DAS6036
+ 0078 PCI-DAS6013
+ 0079 PCI-DAS6014
+1308 Jato Technologies Inc.
+ 0001 NetCelerator Adapter
+ 1308 0001 NetCelerator Adapter
+1309 AB Semiconductor Ltd
+130a Mitsubishi Electric Microcomputer
+130b Colorgraphic Communications Corp
+130c Ambex Technologies, Inc
+130d Accelerix Inc
+130e Yamatake-Honeywell Co. Ltd
+130f Advanet Inc
+1310 Gespac
+1311 Videoserver, Inc
+1312 Acuity Imaging, Inc
+1313 Yaskawa Electric Co.
+1315 Wavesat
+1316 Teradyne Inc
+1317 ADMtek
+ 0981 21x4x DEC-Tulip compatible 10/100 Ethernet
+ 0985 NC100 Network Everywhere Fast Ethernet 10/100
+ 1734 100c Scenic N300 ADMtek AN983 10/100 Mbps PCI Adapter
+ 1985 21x4x DEC-Tulip compatible 10/100 Ethernet
+ 1385 511a FA511
+ 1395 2103 CB100-EZ (4-LED version)
+ 2850 HSP MicroModem 56
+ 5120 ADM5120 OpenGate System-on-Chip
+ 8201 ADM8211 802.11b Wireless Interface
+ 10b8 2635 SMC2635W v1 802.11b Wireless Cardbus Adapter
+ 1317 8201 SMC2635W v2 802.11b Wireless Cardbus Adapter
+ 8211 ADM8211 802.11b Wireless Interface
+ 9511 21x4x DEC-Tulip compatible 10/100 Ethernet
+1318 Packet Engines Inc.
+ 0911 GNIC-II PCI Gigabit Ethernet [Hamachi]
+1319 Fortemedia, Inc
+ 0801 Xwave QS3000A [FM801]
+ 1319 1319 FM801 PCI Audio
+ 0802 Xwave QS3000A [FM801 game port]
+ 1319 1319 FM801 PCI Joystick
+ 1000 FM801 PCI Audio
+ 1001 FM801 PCI Joystick
+131a Finisar Corp.
+131c Nippon Electro-Sensory Devices Corp
+131d Sysmic, Inc.
+131e Xinex Networks Inc
+131f Siig Inc
+ 1000 CyberSerial (1-port) 16550
+ 1001 CyberSerial (1-port) 16650
+ 1002 CyberSerial (1-port) 16850
+ 1010 Duet 1S(16550)+1P
+ 1011 Duet 1S(16650)+1P
+ 1012 Duet 1S(16850)+1P
+ 1020 CyberParallel (1-port)
+ 1021 CyberParallel (2-port)
+ 1030 CyberSerial (2-port) 16550
+ 1031 CyberSerial (2-port) 16650
+ 1032 CyberSerial (2-port) 16850
+ 1034 Trio 2S(16550)+1P
+ 1035 Trio 2S(16650)+1P
+ 1036 Trio 2S(16850)+1P
+ 1050 CyberSerial (4-port) 16550
+ 1051 CyberSerial (4-port) 16650
+ 1052 CyberSerial (4-port) 16850
+ 2000 CyberSerial (1-port) 16550
+ 2001 CyberSerial (1-port) 16650
+ 2002 CyberSerial (1-port) 16850
+ 2010 Duet 1S(16550)+1P
+ 2011 Duet 1S(16650)+1P
+ 2012 Duet 1S(16850)+1P
+ 2020 CyberParallel (1-port)
+ 2021 CyberParallel (2-port)
+ 2030 CyberSerial (2-port) 16550
+ 131f 2030 PCI Serial Card
+ 2031 CyberSerial (2-port) 16650
+ 2032 CyberSerial (2-port) 16850
+ 2040 Trio 1S(16550)+2P
+ 2041 Trio 1S(16650)+2P
+ 2042 Trio 1S(16850)+2P
+ 2050 CyberSerial (4-port) 16550
+ 2051 CyberSerial (4-port) 16650
+ 2052 CyberSerial (4-port) 16850
+ 2060 Trio 2S(16550)+1P
+ 2061 Trio 2S(16650)+1P
+ 2062 Trio 2S(16850)+1P
+ 2081 CyberSerial (8-port) ST16654
+1320 Crypto AG
+1321 Arcobel Graphics BV
+1322 MTT Co., Ltd
+1323 Dome Inc
+1324 Sphere Communications
+1325 Salix Technologies, Inc
+1326 Seachange international
+1327 Voss scientific
+1328 quadrant international
+1329 Productivity Enhancement
+132a Microcom Inc.
+132b Broadband Technologies
+132c Micrel Inc
+132d Integrated Silicon Solution, Inc.
+1330 MMC Networks
+1331 RadiSys Corporation
+ 0030 ENP-2611
+ 8200 82600 Host Bridge
+ 8201 82600 IDE
+ 8202 82600 USB
+ 8210 82600 PCI Bridge
+1332 Micro Memory
+ 5415 MM-5415CN PCI Memory Module with Battery Backup
+ 5425 MM-5425CN PCI 64/66 Memory Module with Battery Backup
+ 6140 MM-6140D
+1334 Redcreek Communications, Inc
+1335 Videomail, Inc
+1337 Third Planet Publishing
+1338 BT Electronics
+133a Vtel Corp
+133b Softcom Microsystems
+133c Holontech Corp
+133d SS Technologies
+133e Virtual Computer Corp
+133f SCM Microsystems
+1340 Atalla Corp
+1341 Kyoto Microcomputer Co
+1342 Promax Systems Inc
+1343 Phylon Communications Inc
+# nee Crucial Technology
+1344 Micron Technology Inc
+1345 Arescom Inc
+1347 Odetics
+1349 Sumitomo Electric Industries, Ltd.
+134a DTC Technology Corp.
+ 0001 Domex 536
+ 0002 Domex DMX3194UP SCSI Adapter
+134b ARK Research Corp.
+134c Chori Joho System Co. Ltd
+134d PCTel Inc
+ 2189 HSP56 MicroModem
+ 2486 2304WT V.92 MDC Modem
+ 7890 HSP MicroModem 56
+ 134d 0001 PCT789 adapter
+ 7891 HSP MicroModem 56
+ 134d 0001 HSP MicroModem 56
+ 7892 HSP MicroModem 56
+ 7893 HSP MicroModem 56
+ 7894 HSP MicroModem 56
+ 7895 HSP MicroModem 56
+ 7896 HSP MicroModem 56
+ 7897 HSP MicroModem 56
+134e CSTI
+134f Algo System Co Ltd
+1350 Systec Co. Ltd
+1351 Sonix Inc
+1353 Thales Idatys
+ 0002 Proserver
+ 0003 PCI-FUT
+ 0004 PCI-S0
+ 0005 PCI-FUT-S0
+1354 Dwave System Inc
+1355 Kratos Analytical Ltd
+1356 The Logical Co
+1359 Prisa Networks
+135a Brain Boxes
+ 0a61 UC-324 [VELOCITY RS422/485]
+135b Giganet Inc
+135c Quatech Inc
+ 0010 QSC-100
+ 0020 DSC-100
+ 0030 DSC-200/300
+ 0040 QSC-200/300
+ 0050 ESC-100D
+ 0060 ESC-100M
+ 00f0 MPAC-100 Syncronous Serial Card (Zilog 85230)
+ 0170 QSCLP-100
+ 0180 DSCLP-100
+ 0190 SSCLP-100
+ 01a0 QSCLP-200/300
+ 01b0 DSCLP-200/300
+ 01c0 SSCLP-200/300
+ 0258 DSPSX-200/300
+135d ABB Network Partner AB
+135e Sealevel Systems Inc
+ 5101 Route 56.PCI - Multi-Protocol Serial Interface (Zilog Z16C32)
+ 7101 Single Port RS-232/422/485/530
+ 7201 Dual Port RS-232/422/485 Interface
+ 7202 Dual Port RS-232 Interface
+ 7401 Four Port RS-232 Interface
+ 7402 Four Port RS-422/485 Interface
+ 7801 Eight Port RS-232 Interface
+ 7804 Eight Port RS-232/422/485 Interface
+ 8001 8001 Digital I/O Adapter
+135f I-Data International A-S
+1360 Meinberg Funkuhren
+ 0101 PCI32 DCF77 Radio Clock
+ 0102 PCI509 DCF77 Radio Clock
+ 0103 PCI510 DCF77 Radio Clock
+ 0104 PCI511 DCF77 Radio Clock
+ 0105 PEX511 DCF77 Radio Clock (PCI Express)
+ 0201 GPS167PCI GPS Receiver
+ 0202 GPS168PCI GPS Receiver
+ 0203 GPS169PCI GPS Receiver
+ 0204 GPS170PCI GPS Receiver
+ 0205 GPS170PEX GPS Receiver (PCI Express)
+ 0206 GPS180PEX GPS Receiver (PCI Express)
+ 0301 TCR510PCI IRIG Timecode Reader
+ 0302 TCR167PCI IRIG Timecode Reader
+ 0303 TCR511PCI IRIG Timecode Reader
+ 0304 TCR511PEX IRIG Timecode Reader (PCI Express)
+ 0305 TCR170PEX IRIG Timecode Reader (PCI Express)
+ 0306 TCR180PEX IRIG Timecode Reader (PCI Express)
+ 0501 PTP270PEX PTP/IEEE1588 slave card (PCI Express)
+ 0601 FRC511PEX Free Running Clock (PCI Express)
+1361 Soliton Systems K.K.
+1362 Fujifacom Corporation
+1363 Phoenix Technology Ltd
+1364 ATM Communications Inc
+1365 Hypercope GmbH
+1366 Teijin Seiki Co. Ltd
+1367 Hitachi Zosen Corporation
+1368 Skyware Corporation
+1369 Digigram
+136a High Soft Tech
+ 0004 HST Saphir VII mini PCI
+ 0007 HST Saphir III E MultiLink 4
+ 0008 HST Saphir III E MultiLink 8
+ 000a HST Saphir III E MultiLink 2
+136b Kawasaki Steel Corporation
+ ff01 KL5A72002 Motion JPEG
+136c Adtek System Science Co Ltd
+136d Gigalabs Inc
+136f Applied Magic Inc
+1370 ATL Products
+1371 CNet Technology Inc
+ 434e GigaCard Network Adapter
+ 1371 434e N-Way PCI-Bus Giga-Card 1000/100/10Mbps(L)
+1373 Silicon Vision Inc
+1374 Silicom Ltd.
+ 0024 Silicom Dual port Giga Ethernet BGE Bypass Server Adapter
+ 0025 Silicom Quad port Giga Ethernet BGE Bypass Server Adapter
+ 0026 Silicom Dual port Fiber Giga Ethernet 546 Bypass Server Adapter
+ 0027 Silicom Dual port Fiber LX Giga Ethernet 546 Bypass Server Adapter
+ 0029 Silicom Dual port Copper Giga Ethernet 546GB Bypass Server Adapter
+ 002a Silicom Dual port Fiber Giga Ethernet 546 TAP/Bypass Server Adapter
+ 002b Silicom Dual port Copper Fast Ethernet 546 TAP/Bypass Server Adapter (PXE2TBI)
+ 002c Silicom Quad port Copper Giga Ethernet 546GB Bypass Server Adapter (PXG4BPI)
+ 002d Silicom Quad port Fiber-SX Giga Ethernet 546GB Bypass Server Adapter (PXG4BPFI)
+ 002e Silicom Quad port Fiber-LX Giga Ethernet 546GB Bypass Server Adapter (PXG4BPFI-LX)
+ 002f Silicom Dual port Fiber-SX Giga Ethernet 546GB Low profile Bypass Server Adapter (PXG2BPFIL)
+ 0030 Silicom Dual port Fiber-LX Giga Ethernet 546GB Low profile Bypass Server Adapter
+ 0031 Silicom Quad port Copper Giga Ethernet PCI-E Bypass Server Adapter
+ 0032 Silicom Dual port Copper Fast Ethernet 546 TAP/Bypass Server Adapter
+ 0034 Silicom Dual port Copper Giga Ethernet PCI-E BGE Bypass Server Adapter
+ 0035 Silicom Quad port Copper Giga Ethernet PCI-E BGE Bypass Server Adapter
+ 0036 Silicom Dual port Fiber Giga Ethernet PCI-E BGE Bypass Server Adapter
+ 0037 Silicom Dual port Copper Ethernet PCI-E Intel based Bypass Server Adapter
+ 0038 Silicom Quad port Copper Ethernet PCI-E Intel based Bypass Server Adapter
+ 0039 Silicom Dual port Fiber-SX Ethernet PCI-E Intel based Bypass Server Adapter
+ 003a Silicom Dual port Fiber-LX Ethernet PCI-E Intel based Bypass Server Adapter
+ 003b Silicom Dual port Fiber Ethernet PMC Intel based Bypass Server Adapter (PMCX2BPFI)
+ 003c Silicom Dual port Copper Ethernet PCI-X BGE based Bypass Server Adapter (PXG2BPRB)
+ 003e Silicom Dual port Fiber Giga Ethernet PCI-E 571 TAP/Bypass Server Adapter (PEG2TBFI)
+ 003f Silicom Dual port Copper Giga Ethernet PCI-X 546 TAP/Bypass Server Adapter (PXG2TBI)
+ 0040 Silicom Quad port Fiber-SX Giga Ethernet 571 Bypass Server Adapter (PEG4BPFI)
+ 0043 Silicom Quad port Fiber-SX Giga Ethernet 546 Bypass Server Adapter (PXG4BPFID)
+ 0045 Silicom 6 port Copper Giga Ethernet 546 Bypass Server Adapter (PXG6BPI)
+ 0047 Silicom Dual port Fiber-SX Giga Ethernet 571 Bypass Disconnect Server Adapter (PEG2BPFID)
+ 004a Silicom Quad port Fiber-LX Giga Ethernet 571 Bypass Server Adapter (PEG4BPFI-LX)
+ 004d Dual port Copper Giga Ethernet PCI-E Bypass Server Adapter
+1375 Argosystems Inc
+1376 LMC
+1377 Electronic Equipment Production & Distribution GmbH
+1378 Telemann Co. Ltd
+1379 Asahi Kasei Microsystems Co Ltd
+137a Mark of the Unicorn Inc
+ 0001 PCI-324 Audiowire Interface
+137b PPT Vision
+137c Iwatsu Electric Co Ltd
+137d Dynachip Corporation
+137e Patriot Scientific Corporation
+137f Japan Satellite Systems Inc
+1380 Sanritz Automation Co Ltd
+1381 Brains Co. Ltd
+1382 Marian - Electronic & Software
+ 0001 ARC88 audio recording card
+ 2008 Prodif 96 Pro sound system
+ 2048 Prodif Plus sound system
+ 2088 Marc 8 Midi sound system
+ 20c8 Marc A sound system
+ 4008 Marc 2 sound system
+ 4010 Marc 2 Pro sound system
+ 4048 Marc 4 MIDI sound system
+ 4088 Marc 4 Digi sound system
+ 4248 Marc X sound system
+ 4424 TRACE D4 Sound System
+1383 Controlnet Inc
+1384 Reality Simulation Systems Inc
+1385 Netgear
+ 006b WA301 802.11b Wireless PCI Adapter
+ 4100 MA301 802.11b Wireless PCI Adapter
+ 4105 MA311 802.11b Wireless PCI Adapter
+ 4400 WAG511 802.11a/b/g Dual Band Wireless PC Card
+ 4600 WAG511 802.11a/b/g Dual Band Wireless PC Card
+ 4601 WAG511 802.11a/b/g Dual Band Wireless PC Card
+ 4610 WAG511 802.11a/b/g Dual Band Wireless PC Card
+ 4a00 WAG311 802.11a/g Wireless PCI Adapter
+ 5200 GA511 Gigabit PC Card
+ 620a GA620 Gigabit Ethernet
+ 630a GA630 Gigabit Ethernet
+ 6d00 WPNT511 RangeMax 240 Mbps Wireless PC Card
+ 7b00 WN511B RangeMax Next 270 Mbps Wireless PC Card
+ 7c00 WN511T RangeMax Next 300 Mbps Wireless PC Card
+ 7d00 WN311B RangeMax Next 270 Mbps Wireless PCI Adapter
+ f004 FA310TX
+ f312 FA312 REV-A1 Fast Ethernet PCI Adapter
+1386 Video Domain Technologies
+1387 Systran Corp
+1388 Hitachi Information Technology Co Ltd
+1389 Applicom International
+ 0001 PCI1500PFB [Intelligent fieldbus adaptor]
+138a Fusion Micromedia Corp
+138b Tokimec Inc
+138c Silicon Reality
+138d Future Techno Designs pte Ltd
+138e Basler GmbH
+138f Patapsco Designs Inc
+1390 Concept Development Inc
+1391 Development Concepts Inc
+1392 Medialight Inc
+1393 Moxa Technologies Co Ltd
+ 0001 UC7000 Serial
+ 1020 CP102 (2-port RS-232 PCI)
+ 1021 CP102UL (2-port RS-232 Universal PCI)
+ 1022 CP102U (2-port RS-232 Universal PCI)
+ 1023 CP-102UF
+ 1024 CP-102E (2-port RS-232 Smart PCI Express Serial Board)
+ 1025 CP-102EL (2-port RS-232 Smart PCI Express Serial Board)
+ 1040 Smartio C104H/PCI
+ 1041 CP104U (4-port RS-232 Universal PCI)
+ 1042 CP104JU (4-port RS-232 Universal PCI)
+ 1043 CP104EL (4-port RS-232 Smart PCI Express)
+ 1044 POS104UL (4-port RS-232 Universal PCI)
+ 1045 CP-104EL-A (4-port RS-232 PCI Express Serial Board)
+ 1080 CB108 (8-port RS-232 PC/104-plus Module)
+ 1140 CT-114 series
+ 1141 Industrio CP-114
+ 1142 CB114 (4-port RS-232/422/485 PC/104-plus Module)
+ 1143 CP-114UL (4-port RS-232/422/485 Smart Universal PCI Serial Board)
+ 1144 CP-114EL (4-port RS-232/422/485 Smart PCI Express Serial Board)
+ 1180 CP118U (8-port RS-232/422/485 Smart Universal PCI)
+ 1181 CP118EL (8-port RS-232/422/485 Smart PCI Express)
+ 1182 CP-118EL-A (8-port RS-232/422/485 PCI Express Serial Board)
+ 1320 CP132 (2-port RS-422/485 PCI)
+ 1321 CP132U (2-Port RS-422/485 Universal PCI)
+ 1322 CP-132EL (2-port RS-422/485 Smart PCI Express Serial Board)
+ 1340 CP134U (4-Port RS-422/485 Universal PCI)
+ 1341 CB134I (4-port RS-422/485 PC/104-plus Module)
+ 1380 CP138U (8-port RS-232/422/485 Smart Universal PCI)
+ 1680 Smartio C168H/PCI
+ 1681 CP-168U V2 Smart Serial Board (8-port RS-232)
+ 1682 CP168EL (8-port RS-232 Smart PCI Express)
+ 1683 CP-168EL-A (8-port RS-232 PCI Express Serial Board)
+ 2040 Intellio CP-204J
+ 2180 Intellio C218 Turbo PCI
+ 3200 Intellio C320 Turbo PCI
+1394 Level One Communications
+ 0001 LXT1001 Gigabit Ethernet
+ 1186 4800 DGE-500SX
+ 1394 0001 NetCelerator Adapter
+1395 Ambicom Inc
+1396 Cipher Systems Inc
+1397 Cologne Chip Designs GmbH
+ 08b4 ISDN network Controller [HFC-4S]
+ 1397 b520 HFC-4S [IOB4ST]
+ 1397 b540 HFC-4S [Swyx 4xS0 SX2 QuadBri]
+ 1397 b550 HFC-4S [Junghanns quadBRI]
+ 1397 b556 HFC-4S [Junghanns DuoDBRI]
+ 1397 e888 HFC-4S [OpenVox B200P / B400P]
+ 16b8 ISDN network Controller [HFC-8S]
+ 1397 b562 HFC-8S [IOB8ST]
+ 2bd0 ISDN network controller [HFC-PCI]
+ 0675 1704 ISDN Adapter (PCI Bus, D, C)
+ 0675 1708 ISDN Adapter (PCI Bus, D, C, ACPI)
+ 1397 2bd0 ISDN Board
+ e4bf 1000 CI1-1-Harp
+ 30b1 ISDN network Controller [HFC-E1]
+ b700 ISDN network controller PrimuX S0 [HFC-PCI]
+ f001 GSM Network Controller [HFC-4GSM]
+1398 Clarion co. Ltd
+1399 Rios systems Co Ltd
+139a Alacritech Inc
+ 0001 Quad Port 10/100 Server Accelerator
+ 0003 Single Port 10/100 Server Accelerator
+ 0005 Single Port Gigabit Server Accelerator
+139b Mediasonic Multimedia Systems Ltd
+139c Quantum 3d Inc
+139d EPL limited
+139e Media4
+139f Aethra s.r.l.
+13a0 Crystal Group Inc
+13a1 Kawasaki Heavy Industries Ltd
+13a2 Ositech Communications Inc
+13a3 Hifn Inc.
+ 0005 7751 Security Processor
+ 0006 6500 Public Key Processor
+ 0007 7811 Security Processor
+ 0012 7951 Security Processor
+ 0014 78XX Security Processor
+ 0016 8065 Security Processor
+ 0017 8165 Security Processor
+ 0018 8154 Security Processor
+ 001d 7956 Security Processor
+ 001f 7855 Security Processor
+ 0020 7955 Security Processor
+ 0026 8155 Security Processor
+ 002e 9630 Compression Processor
+ 002f 9725 Compression and Security Processor
+ 13a3 1600 DR1600 Acceleration Card
+ 13a3 1605 DR1605 Acceleration Card
+ 13a3 1610 DR1610 Acceleration Card
+ 13a3 1615 DR1615 Acceleration Card
+ 13a3 1620 DR1620 Acceleration Card
+ 13a3 1625 DR1625 Acceleration Card
+ 0033 8201 Acceleration Processor
+ 13a3 0036 DX1710 Acceleration Card
+ 0034 8202 Acceleration Processor
+ 13a3 0036 DX1720 Acceleration Card
+ 0035 8203 Acceleration Processor
+ 13a3 0036 DX1730 Acceleration Card
+ 0037 8204 Acceleration Processor
+ 13a3 0036 DX1740 Acceleration Card
+13a4 Rascom Inc
+13a5 Audio Digital Imaging Inc
+13a6 Videonics Inc
+13a7 Teles AG
+13a8 Exar Corp.
+ 0152 XR17C/D152 Dual PCI UART
+ 0154 XR17C154 Quad UART
+ 0158 XR17C158 Octal UART
+ 0252 XR17V252 Dual UART PCI controller
+ 0254 XR17V254 Quad UART PCI controller
+ 0258 XR17V258 Octal UART PCI controller
+13a9 Siemens Medical Systems, Ultrasound Group
+13aa Broadband Networks Inc
+13ab Arcom Control Systems Ltd
+13ac Motion Media Technology Ltd
+13ad Nexus Inc
+13ae ALD Technology Ltd
+13af T.Sqware
+13b0 Maxspeed Corp
+13b1 Tamura corporation
+13b2 Techno Chips Co. Ltd
+13b3 Lanart Corporation
+13b4 Wellbean Co Inc
+13b5 ARM
+13b6 Dlog GmbH
+13b7 Logic Devices Inc
+13b8 Nokia Telecommunications oy
+13b9 Elecom Co Ltd
+13ba Oxford Instruments
+13bb Sanyo Technosound Co Ltd
+13bc Bitran Corporation
+13bd Sharp corporation
+13be Miroku Jyoho Service Co. Ltd
+13bf Sharewave Inc
+13c0 Microgate Corporation
+ 0010 SyncLink Adapter v1
+ 0020 SyncLink SCC Adapter
+ 0030 SyncLink Multiport Adapter
+ 0070 SyncLink GT Adapter
+ 0080 SyncLink GT4 Adapter
+ 00a0 SyncLink GT2 Adapter
+ 0210 SyncLink Adapter v2
+13c1 3ware Inc
+ 1000 5xxx/6xxx-series PATA-RAID
+ 1001 7xxx/8xxx-series PATA/SATA-RAID
+ 13c1 1001 7xxx/8xxx-series PATA/SATA-RAID
+ 1002 9xxx-series SATA-RAID
+ 1003 9550SX SATA-II RAID PCI-X
+ 1004 9650SE SATA-II RAID PCIe
+ 1005 9690SA SAS/SATA-II RAID PCIe
+ 1010 9750 SAS2/SATA-II RAID PCIe
+13c2 Technotrend Systemtechnik GmbH
+ 000e Technotrend/Hauppauge DVB card rev2.3
+ 1019 TTechnoTrend-budget DVB S2-3200
+13c3 Janz Computer AG
+13c4 Phase Metrics
+13c5 Alphi Technology Corp
+13c6 Condor Engineering Inc
+ 0520 CEI-520 A429 Card
+ 0620 CEI-620 A429 Card
+ 0820 CEI-820 A429 Card
+ 0830 CEI-830 A429 Card
+ 1004 P-SER Multi-channel PMC to RS-485/422/232 adapter
+13c7 Blue Chip Technology Ltd
+ 0adc PCI-ADC
+ 0b10 PCI-PIO
+ 0d10 PCI-DIO
+ 524c PCI-RLY
+ 5744 PCI-WDT
+13c8 Apptech Inc
+13c9 Eaton Corporation
+13ca Iomega Corporation
+13cb Yano Electric Co Ltd
+13cc Metheus Corporation
+13cd Compatible Systems Corporation
+13ce Cocom A/S
+13cf Studio Audio & Video Ltd
+13d0 Techsan Electronics Co Ltd
+ 2103 B2C2 FlexCopII DVB chip / Technisat SkyStar2 DVB card
+ 2104 B2C2 FlexCopIII DVB chip / Technisat SkyStar2 DVB card (rev 01)
+ 2200 B2C2 FlexCopIII DVB chip / Technisat SkyStar2 DVB card
+13d1 Abocom Systems Inc
+ ab02 ADMtek Centaur-C rev 17 [D-Link DFE-680TX] CardBus Fast Ethernet Adapter
+ ab03 21x4x DEC-Tulip compatible 10/100 Ethernet
+ ab06 RTL8139 [FE2000VX] CardBus Fast Ethernet Attached Port Adapter
+ ab08 21x4x DEC-Tulip compatible 10/100 Ethernet
+13d2 Shark Multimedia Inc
+13d4 Graphics Microsystems Inc
+13d5 Media 100 Inc
+13d6 K.I. Technology Co Ltd
+13d7 Toshiba Engineering Corporation
+13d8 Phobos corporation
+13d9 Apex PC Solutions Inc
+13da Intresource Systems pte Ltd
+13db Janich & Klass Computertechnik GmbH
+13dc Netboost Corporation
+13dd Multimedia Bundle Inc
+13de ABB Robotics Products AB
+13df E-Tech Inc
+ 0001 PCI56RVP Modem
+ 13df 0001 PCI56RVP Modem
+13e0 GVC Corporation
+13e1 Silicom Multimedia Systems Inc
+13e2 Dynamics Research Corporation
+13e3 Nest Inc
+13e4 Calculex Inc
+13e5 Telesoft Design Ltd
+13e6 Argosy research Inc
+13e7 NAC Incorporated
+13e8 Chip Express Corporation
+13e9 Intraserver Technology Inc
+13ea Dallas Semiconductor
+13eb Hauppauge Computer Works Inc
+13ec Zydacron Inc
+ 000a NPC-RC01 Remote control receiver
+13ed Raytheion E-Systems
+13ee Hayes Microcomputer Products Inc
+13ef Coppercom Inc
+13f0 Sundance Technology Inc / IC Plus Corp
+ 0200 IC Plus IP100A Integrated 10/100 Ethernet MAC + PHY
+ 1043 8213 NX1001
+ 0201 ST201 Sundance Ethernet
+ 1021 TC902x Gigabit Ethernet
+ 1023 IP1000 Family Gigabit Ethernet
+ 1043 8180 NX1101
+13f1 Oce' - Technologies B.V.
+13f2 Ford Microelectronics Inc
+13f3 Mcdata Corporation
+13f4 Troika Networks, Inc.
+ 1401 Zentai Fibre Channel Adapter
+13f5 Kansai Electric Co. Ltd
+13f6 C-Media Electronics Inc
+ 0011 CMI8738
+ 0100 CM8338A
+ 13f6 ffff CMI8338/C3DX PCI Audio Device
+ 0101 CM8338B
+ 13f6 0101 CMI8338-031 PCI Audio Device
+ 0111 CM8738
+ 1019 0970 P6STP-FL motherboard
+ 1043 8035 CUSI-FX motherboard
+ 1043 8077 CMI8738 6-channel audio controller
+ 1043 80e2 CMI8738 6ch-MX
+ 13f6 0111 CMI8738/C3DX PCI Audio Device
+ 13f6 9761 Theatron Agrippa
+ 153b 1144 Aureon 5.1
+ 153b 1170 Aureon 7.1
+ 1681 a000 Gamesurround MUSE XL
+ 270f 1103 CT-7NJS Ultra motherboard
+ 270f f462 7NJL1 motherboard
+ 584d 3731 Digital X-Mystique
+ 584d 3741 X-Plosion 7.1
+ 584d 3751 X-Raider 7.1
+ 584d 3761 X-Mystique 7.1 LP
+ 584d 3771 X-Mystique 7.1 LP Value
+ 7284 8384 Striker 7.1
+ 0211 CM8738
+ 8788 CMI8788 [Oxygen HD Audio]
+ 1043 8269 Virtuoso 200 (Xonar D2)
+ 1043 8275 Virtuoso 100 (Xonar DX)
+ 1043 82b7 Virtuoso 200 (Xonar D2X)
+ 1043 8314 Virtuoso 200 (Xonar HDAV1.3)
+ 1043 8327 Virtuoso 100 (Xonar DX)
+ 1043 834f Virtuoso 100 (Xonar D1)
+ 1043 835c Virtuoso 100 (Xonar Essence STX)
+ 1043 835d Virtuoso 100 (Xonar ST)
+ 1043 835e Virtuoso 200 (Xonar HDAV1.3 Slim)
+ 1043 838e Virtuoso 66 (Xonar DS)
+ 1043 8428 Virtuoso 100 (Xonar Xense)
+ 1043 8467 CMI8786 (Xonar DG)
+ 13f6 8782 PCI 2.0 HD Audio
+ 13f6 ffff CMI8787-HG2PCI
+ 14c3 1710 HiFier Fantasia
+ 14c3 1711 HiFier Serenade
+ 1a58 0910 Barracuda AC-1
+ 415a 5431 X-Meridian 7.1
+ 5431 017a X-Meridian 7.1 2G
+ 584d 3781 HDA X-Purity 7.1 Platinum
+ 7284 9761 CLARO
+ 7284 9781 CLARO halo
+ 7284 9783 eCLARO
+ 9880 CM9880
+13f7 Wildfire Communications
+13f8 Ad Lib Multimedia Inc
+13f9 NTT Advanced Technology Corp.
+13fa Pentland Systems Ltd
+13fb Aydin Corp
+13fc Computer Peripherals International
+13fd Micro Science Inc
+13fe Advantech Co. Ltd
+ 1240 PCI-1240 4-channel stepper motor controller card
+ 1600 PCI-16xx series PCI multiport serial board (function 0)
+# This board has two PCI functions, appears as two PCI devices
+ 1601 0002 PCI-1601 2-port unisolated RS-422/485
+# This board has two PCI functions, appears as two PCI devices
+ 1602 0002 PCI-1602 2-port isolated RS-422/485
+ 1612 0004 PCI-1612 4-port RS-232/422/485
+ 1603 PCI-1603 2-port isolated RS-232/current loop
+ 1604 PCI-1604 2-port RS-232
+ 16ff PCI-16xx series PCI multiport serial board (function 1: RX/TX steering CPLD)
+ 1601 0000 PCI-1601 2-port unisolated RS-422/485 PCI communications card
+ 1602 0000 PCI-1602 2-port isolated RS-422/485
+ 1612 0000 PCI-1612 4-port RS-232/422/485
+ 1711 PCI-1711 16-channel data acquisition card 12-bit, 100kS/s
+ 1733 PCI-1733 32-channel isolated digital input card
+ 1752 PCI-1752
+ 1754 PCI-1754
+ 1756 PCI-1756
+13ff Silicon Spice Inc
+1400 Artx Inc
+ 1401 9432 TX
+1401 CR-Systems A/S
+1402 Meilhaus Electronic GmbH
+ 0630 ME-630
+ 0940 ME-94
+ 0950 ME-95
+ 0960 ME-96
+ 1000 ME-1000
+ 100a ME-1000
+ 100b ME-1000
+ 1400 ME-1400
+ 140a ME-1400A
+ 140b ME-1400B
+ 140c ME-1400C
+ 140d ME-1400D
+ 140e ME-1400E
+ 14ea ME-1400EA
+ 14eb ME-1400EB
+ 1604 ME-1600/4U
+ 1608 ME-1600/8U
+ 160c ME-1600/12U
+ 160f ME-1600/16U
+ 168f ME-1600/16U8I
+ 4610 ME-4610
+ 4650 ME-4650
+ 4660 ME-4660
+ 4661 ME-4660I
+ 4662 ME-4660
+ 4663 ME-4660I
+ 4670 ME-4670
+ 4671 ME-4670I
+ 4672 ME-4670S
+ 4673 ME-4670IS
+ 4680 ME-4680
+ 4681 ME-4680I
+ 4682 ME-4680S
+ 4683 ME-4680IS
+ 6004 ME-6000/4
+ 6008 ME-6000/8
+ 600f ME-6000/16
+ 6014 ME-6000I/4
+ 6018 ME-6000I/8
+ 601f ME-6000I/16
+ 6034 ME-6000ISLE/4
+ 6038 ME-6000ISLE/8
+ 603f ME-6000ISLE/16
+ 6044 ME-6000/4/DIO
+ 6048 ME-6000/8/DIO
+ 604f ME-6000/16/DIO
+ 6054 ME-6000I/4/DIO
+ 6058 ME-6000I/8/DIO
+ 605f ME-6000I/16/DIO
+ 6074 ME-6000ISLE/4/DIO
+ 6078 ME-6000ISLE/8/DIO
+ 607f ME-6000ISLE/16/DIO
+ 6104 ME-6100/4
+ 6108 ME-6100/8
+ 610f ME-6100/16
+ 6114 ME-6100I/4
+ 6118 ME-6100I/8
+ 611f ME-6100I/16
+ 6134 ME-6100ISLE/4
+ 6138 ME-6100ISLE/8
+ 613f ME-6100ISLE/16
+ 6144 ME-6100/4/DIO
+ 6148 ME-6100/8/DIO
+ 614f ME-6100/16/DIO
+ 6154 ME-6100I/4/DIO
+ 6158 ME-6100I/8/DIO
+ 615f ME-6100I/16/DIO
+ 6174 ME-6100ISLE/4/DIO
+ 6178 ME-6100ISLE/8/DIO
+ 617f ME-6100ISLE/16/DIO
+ 6259 ME-6200I/9/DIO
+ 6359 ME-6300I/9/DIO
+ 810a ME-8100A
+ 810b ME-8100B
+ 820a ME-8200A
+ 820b ME-8200B
+1403 Ascor Inc
+1404 Fundamental Software Inc
+1405 Excalibur Systems Inc
+1406 Oce' Printing Systems GmbH
+1407 Lava Computer mfg Inc
+ 0100 Lava Dual Serial
+ 0101 Lava Quatro A
+ 0102 Lava Quatro B
+ 0110 Lava DSerial-PCI Port A
+ 0111 Lava DSerial-PCI Port B
+ 0120 Quattro-PCI A
+ 0121 Quattro-PCI B
+ 0180 Lava Octo A
+ 0181 Lava Octo B
+ 0200 Lava Port Plus
+ 0201 Lava Quad A
+ 0202 Lava Quad B
+ 0220 Lava Quattro PCI Ports A/B
+ 0221 Lava Quattro PCI Ports C/D
+ 0400 Lava 8255-PIO-PCI
+ 0500 Lava Single Serial
+ 0520 Lava RS422-SS-PCI
+ 0600 Lava Port 650
+ 8000 Lava Parallel
+ 8001 Dual parallel port controller A
+ 8002 Lava Dual Parallel port A
+ 8003 Lava Dual Parallel port B
+ 8800 BOCA Research IOPPAR
+1408 Aloka Co. Ltd
+1409 Timedia Technology Co Ltd
+ 7168 PCI2S550 (Dual 16550 UART)
+ 1409 0002 SER4036A3V (2x RS232 port)
+ 1409 4027 SER4027A (1x RS232 port)
+ 1409 4037 SER4037A (2x RS232 port)
+# Single DC-37 connector
+ 1409 4056 SER4056A (4x RS232)
+ 1409 5027 SER4027D
+ 1409 5037 SER4037D (2x RS232 port)
+# Single DC-62 connector
+ 1409 5066 SER4066R (8x RS232)
+# 4x 8p8c connectors
+ 1409 6056 SER4056D (4x RS232 port)
+ 7268 SUN1888 (Dual IEEE1284 parallel port)
+ 1409 0103 PAR4008A
+ 1409 0104 PAR4018A
+140a DSP Research Inc
+# Formerly RAMiX, Inc.
+140b GE Intelligent Platforms
+140c Elmic Systems Inc
+140d Matsushita Electric Works Ltd
+140e Goepel Electronic GmbH
+140f Salient Systems Corp
+1410 Midas lab Inc
+1411 Ikos Systems Inc
+# Nee IC Ensemble Inc.
+1412 VIA Technologies Inc.
+ 1712 ICE1712 [Envy24] PCI Multi-Channel I/O Controller
+ 1412 1712 Hoontech ST Audio DSP 24
+ 1412 3632 M-Audio Delta Audiophile 192
+ 1412 d630 M-Audio Delta 1010
+ 1412 d631 M-Audio Delta DiO
+ 1412 d632 M-Audio Delta 66
+ 1412 d633 M-Audio Delta 44
+ 1412 d634 M-Audio Delta Audiophile 2496
+ 1412 d635 M-Audio Delta TDIF
+ 1412 d637 M-Audio Delta RBUS
+ 1412 d638 M-Audio Delta 410
+ 1412 d63b M-Audio Delta 1010LT
+ 1412 d63c Digigram VX442
+ 1416 1712 Hoontech ST Audio DSP 24 Media 7.1
+ 153b 1115 EWS88 MT
+ 153b 1125 EWS88 MT (Master)
+ 153b 112b EWS88 D
+ 153b 112c EWS88 D (Master)
+ 153b 1130 EWX 24/96
+ 153b 1138 DMX 6fire 24/96
+ 153b 1151 PHASE88
+ 16ce 1040 Edirol DA-2496
+ 1724 VT1720/24 [Envy24PT/HT] PCI Multi-Channel Audio Controller
+ 1412 1724 Albatron PX865PE 7.1
+ 1412 3630 M-Audio Revolution 7.1
+ 1412 3631 M-Audio Revolution 5.1
+ 153b 1145 Aureon 7.1 Space
+ 153b 1147 Aureon 5.1 Sky
+ 153b 1150 PHASE 22
+ 153b 1153 Aureon 7.1 Universe
+ 17ab 1906 PSC 724 [Ultimate Edge]
+ 270f f641 ZNF3-150
+ 270f f645 ZNF3-250
+ 3130 4154 MAYA 44 MKII
+1413 Addonics
+1414 Microsoft Corporation
+ 0001 MN-120 (ADMtek Centaur-C based)
+ 0002 MN-130 (ADMtek Centaur-P based)
+ 5353 Hyper-V virtual VGA
+ 5801 XMA Decoder (Xenon)
+ 5802 SATA Controller - CdRom (Xenon)
+ 5803 SATA Controller - Disk (Xenon)
+ 5804 OHCI Controller 0 (Xenon)
+ 5805 EHCI Controller 0 (Xenon)
+ 5806 OHCI Controller 1 (Xenon)
+ 5807 EHCI Controller 1 (Xenon)
+ 580a Fast Ethernet Adapter (Xenon)
+ 580b Secure Flash Controller (Xenon)
+ 580d System Management Controller (Xenon)
+ 5811 Xenos GPU (Xenon)
+1415 Oxford Semiconductor Ltd
+ 8401 OX9162 Mode 1 (8-bit bus)
+ 8403 OX9162 Mode 0 (parallel port)
+ 9500 OX16PCI954 (Quad 16950 UART) function 0 (Disabled)
+ 9501 OX16PCI954 (Quad 16950 UART) function 0 (Uart)
+ 12c4 0201 Titan/cPCI (2 port)
+ 12c4 0202 Titan/cPCI (4 port)
+ 12c4 0203 Titan/cPCI (8 port)
+ 12c4 0210 Titan/104-Plus (8 port, p1-4)
+ 131f 2050 CyberPro (4-port)
+# Model IO1085, Part No: JJ-P46012
+ 131f 2051 CyberSerial 4S Plus
+ 15ed 2000 MCCR Serial p0-3 of 8
+ 15ed 2001 MCCR Serial p0-3 of 16
+ 9505 OXuPCI952 (Dual 16C950 UART)
+ 950a EXSYS EX-41092 Dual 16950 Serial adapter
+ 950b OXCB950 Cardbus 16950 UART
+ 9510 OX16PCI954 (Quad 16950 UART) function 1 (Disabled)
+ 12c4 0200 Titan/cPCI (Unused)
+ 9511 OX16PCI954 (Quad 16950 UART) function 1 (8bit bus)
+ 12c4 0211 Titan/104-Plus (8 port, p5-8)
+ 15ed 2000 MCCR Serial p4-7 of 8
+ 15ed 2001 MCCR Serial p4-15 of 16
+ 9512 OX16PCI954 (Quad 16950 UART) function 1 (32bit bus)
+ 9513 OX16PCI954 (Quad 16950 UART) function 1 (parallel port)
+ 9521 OX16PCI952 (Dual 16950 UART)
+ 9523 OX16PCI952 Integrated Parallel Port
+ c308 EX-44016 16-port serial
+1416 Multiwave Innovation pte Ltd
+1417 Convergenet Technologies Inc
+1418 Kyushu electronics systems Inc
+1419 Excel Switching Corp
+141a Apache Micro Peripherals Inc
+141b Zoom Telephonics Inc
+141d Digitan Systems Inc
+141e Fanuc Ltd
+141f Visiontech Ltd
+1420 Psion Dacom plc
+ 8002 Gold Card NetGlobal 56k+10/100Mb CardBus (Ethernet part)
+ 8003 Gold Card NetGlobal 56k+10/100Mb CardBus (Modem part)
+1421 Ads Technologies Inc
+1422 Ygrec Systems Co Ltd
+1423 Custom Technology Corp.
+1424 Videoserver Connections
+1425 Chelsio Communications Inc
+ 000b T210 Protocol Engine
+ 000c T204 Protocol Engine
+ 0022 10GbE Ethernet Adapter
+ 0030 T310 10GbE Single Port Adapter
+ 103c 705e PCIe 10GBase-SR [AD386A]
+ 0031 T320 10GbE Dual Port Adapter
+ 0032 T302 1GbE Dual Port Adapter
+ 0033 T304 1GbE Quad Port Adapter
+ 0034 B320 10GbE Dual Port Adapter
+ 0035 S310-CR 10GbE Single Port Adapter
+ 0036 S320-LP-CR 10GbE Dual Port Adapter
+ 0037 N320-G2-CR 10GbE Dual Port Adapter
+ 4001 T420-CR Unified Wire Ethernet Controller
+ 4002 T422-CR Unified Wire Ethernet Controller
+ 4003 T440-CR Unified Wire Ethernet Controller
+ 4004 T420-BCH Unified Wire Ethernet Controller
+ 4005 T440-BCH Unified Wire Ethernet Controller
+ 4006 T440-CH Unified Wire Ethernet Controller
+ 4007 T420-SO Unified Wire Ethernet Controller
+ 4008 T420-CX Unified Wire Ethernet Controller
+ 4009 T420-BT Unified Wire Ethernet Controller
+ 400a T404-BT Unified Wire Ethernet Controller
+ 4401 T420-CR Unified Wire Ethernet Controller
+ 4402 T422-CR Unified Wire Ethernet Controller
+ 4403 T440-CR Unified Wire Ethernet Controller
+ 4404 T420-BCH Unified Wire Ethernet Controller
+ 4405 T440-BCH Unified Wire Ethernet Controller
+ 4406 T440-CH Unified Wire Ethernet Controller
+ 4407 T420-SO Unified Wire Ethernet Controller
+ 4408 T420-CX Unified Wire Ethernet Controller
+ 4409 T420-BT Unified Wire Ethernet Controller
+ 440a T404-BT Unified Wire Ethernet Controller
+ 4501 T420-CR Unified Wire Storage Controller
+ 4502 T422-CR Unified Wire Storage Controller
+ 4503 T440-CR Unified Wire Storage Controller
+ 4504 T420-BCH Unified Wire Storage Controller
+ 4505 T440-BCH Unified Wire Storage Controller
+ 4506 T440-CH Unified Wire Storage Controller
+ 4507 T420-SO Unified Wire Storage Controller
+ 4508 T420-CX Unified Wire Storage Controller
+ 4509 T420-BT Unified Wire Storage Controller
+ 450a T404-BT Unified Wire Storage Controller
+ 4601 T420-CR Unified Wire Storage Controller
+ 4602 T422-CR Unified Wire Storage Controller
+ 4603 T440-CR Unified Wire Storage Controller
+ 4604 T420-BCH Unified Wire Storage Controller
+ 4605 T440-BCH Unified Wire Storage Controller
+ 4606 T440-CH Unified Wire Storage Controller
+ 4607 T420-SO Unified Wire Storage Controller
+ 4608 T420-CX Unified Wire Storage Controller
+ 4609 T420-BT Unified Wire Storage Controller
+ 460a T404-BT Unified Wire Storage Controller
+ 4701 T420-CR Unified Wire Ethernet Controller
+ 4702 T422-CR Unified Wire Ethernet Controller
+ 4703 T440-CR Unified Wire Ethernet Controller
+ 4704 T420-BCH Unified Wire Ethernet Controller
+ 4705 T440-BCH Unified Wire Ethernet Controller
+ 4706 T440-CH Unified Wire Ethernet Controller
+ 4707 T420-SO Unified Wire Ethernet Controller
+ 4708 T420-CX Unified Wire Ethernet Controller
+ 4709 T420-BT Unified Wire Ethernet Controller
+ 470a T404-BT Unified Wire Ethernet Controller
+ 4801 T420-CR Unified Wire Ethernet Controller
+ 4802 T422-CR Unified Wire Ethernet Controller
+ 4803 T440-CR Unified Wire Ethernet Controller
+ 4804 T420-BCH Unified Wire Ethernet Controller
+ 4805 T440-BCH Unified Wire Ethernet Controller
+ 4806 T440-CH Unified Wire Ethernet Controller
+ 4807 T420-SO Unified Wire Ethernet Controller
+ 4808 T420-CX Unified Wire Ethernet Controller
+ 4809 T420-BT Unified Wire Ethernet Controller
+ 480a T404-BT Unified Wire Ethernet Controller
+ a000 PE10K Unified Wire Ethernet Controller
+1426 Storage Technology Corp.
+1427 Better On-Line Solutions
+1428 Edec Co Ltd
+1429 Unex Technology Corp.
+142a Kingmax Technology Inc
+142b Radiolan
+142c Minton Optic Industry Co Ltd
+142d Pix stream Inc
+142e Vitec Multimedia
+ 4020 VM2-2 [Video Maker 2] MPEG1/2 Encoder
+ 4337 VM2-2-C7 [Video Maker 2 rev. C7] MPEG1/2 Encoder
+142f Radicom Research Inc
+1430 ITT Aerospace/Communications Division
+1431 Gilat Satellite Networks
+1432 Edimax Computer Co.
+ 9130 RTL81xx Fast Ethernet
+1433 Eltec Elektronik GmbH
+# Nee Real Time Devices US Inc.
+1435 RTD Embedded Technologies, Inc.
+ 4520 PCI4520
+ 6020 SPM6020
+ 6030 SPM6030
+ 6420 SPM186420
+ 6430 SPM176430
+ 6431 SPM176431
+ 7520 DM7520
+ 7540 SDM7540
+ 7820 DM7820
+1436 CIS Technology Inc
+1437 Nissin Inc Co
+1438 Atmel-dream
+1439 Outsource Engineering & Mfg. Inc
+143a Stargate Solutions Inc
+143b Canon Research Center, America
+143c Amlogic Inc
+143d Tamarack Microelectronics Inc
+143e Jones Futurex Inc
+143f Lightwell Co Ltd - Zax Division
+1440 ALGOL Corp.
+1441 AGIE Ltd
+1442 Phoenix Contact GmbH & Co.
+1443 Unibrain S.A.
+1444 TRW
+1445 Logical DO Ltd
+1446 Graphin Co Ltd
+1447 AIM GmBH
+1448 Alesis Studio Electronics
+1449 TUT Systems Inc
+144a Adlink Technology
+ 6208 PCI-6208V
+ 7250 PCI-7250
+ 7296 PCI-7296
+ 7432 PCI-7432
+ 7433 PCI-7433
+ 7434 PCI-7434
+ 7841 PCI-7841
+ 8133 PCI-8133
+ 8164 PCI-8164
+ 8554 PCI-8554
+ 9111 PCI-9111
+ 9113 PCI-9113
+ 9114 PCI-9114
+# nee Loronix Information Systems Inc.
+144b Verint Systems Inc.
+144c Catalina Research Inc
+144d Samsung Electronics Co Ltd
+ c00c P35 laptop
+ c511 R20 Laptop
+144e OLITEC
+144f Askey Computer Corp.
+1450 Octave Communications Ind.
+1451 SP3D Chip Design GmBH
+1453 MYCOM Inc
+1454 Altiga Networks
+1455 Logic Plus Plus Inc
+1456 Advanced Hardware Architectures
+1457 Nuera Communications Inc
+1458 Giga-byte Technology
+ 9001 GC-PTV-TAF Hybrid TV card
+ e911 GN-WIAG02
+1459 DOOIN Electronics
+145a Escalate Networks Inc
+145b PRAIM SRL
+145c Cryptek
+145d Gallant Computer Inc
+145e Aashima Technology B.V.
+145f Baldor Electric Company
+ 0001 NextMove PCI
+1460 DYNARC INC
+1461 Avermedia Technologies Inc
+ a3ce M179
+ a3cf M179
+ a836 M115 DVB-T, PAL/SECAM/NTSC Tuner
+ e836 M115S Hybrid Analog/DVB PAL/SECAM/NTSC Tuner
+ f436 AVerTV Hybrid+FM
+1462 Micro-Star International Co., Ltd.
+ 5501 nVidia NV15DDR [GeForce2 Ti]
+ 6819 Broadcom Corporation BCM4306 802.11b/g Wireless LAN Controller [MSI CB54G]
+ 6825 PCI Card wireless 11g [PC54G]
+ 6834 RaLink RT2500 802.11g [PC54G2]
+ 7125 MS-7125 [K8N Neo4 Platinum]
+ 7235 P965 Neo MS-7235 mainboard
+ 7242 K9AGM RS485 Motherboard
+ 7250 MS-7250 Motherboard [K9N Platinum SLI/non-SLI]
+ 7327 K9AGM2-FIH Motherboard
+ 7650 Hetis 865GV-E (MS-7065)
+ 8725 NVIDIA NV25 [GeForce4 Ti 4600] VGA Adapter
+ 9000 NVIDIA NV28 [GeForce4 Ti 4800] VGA Adapter
+ 9110 GeFORCE FX5200
+ 9119 NVIDIA NV31 [GeForce FX 5600XT] VGA Adapter
+ 9123 NVIDIA NV31 [GeForce FX 5600] FX5600-VTDR128 [MS-8912]
+ 9510 Radeon 9600XT
+ 9511 Radeon 9600XT
+ 9591 nVidia Corporation NV36 [GeForce FX 5700LE]
+ b834 Wireless 11g Turbo G PCI card [MSI PC60G]
+1463 Fast Corporation
+1464 Interactive Circuits & Systems Ltd
+1465 GN NETTEST Telecom DIV.
+1466 Designpro Inc.
+1467 DIGICOM SPA
+1468 AMBIT Microsystem Corp.
+1469 Cleveland Motion Controls
+146a IFR
+146b Parascan Technologies Ltd
+146c Ruby Tech Corp.
+ 1430 FE-1430TX Fast Ethernet PCI Adapter
+146d Tachyon, INC.
+146e Williams Electronics Games, Inc.
+146f Multi Dimensional Consulting Inc
+1470 Bay Networks
+1471 Integrated Telecom Express Inc
+1472 DAIKIN Industries, Ltd
+1473 ZAPEX Technologies Inc
+1474 Doug Carson & Associates
+1475 PICAZO Communications
+1476 MORTARA Instrument Inc
+1477 Net Insight
+1478 DIATREND Corporation
+1479 TORAY Industries Inc
+147a FORMOSA Industrial Computing
+147b ABIT Computer Corp.
+ 1084 IP35 [Dark Raider]
+147c AWARE, Inc.
+147d Interworks Computer Products
+147e Matsushita Graphic Communication Systems, Inc.
+147f NIHON UNISYS, Ltd.
+1480 SCII Telecom
+1481 BIOPAC Systems Inc
+1482 ISYTEC - Integrierte Systemtechnik GmBH
+ 0001 PCI-16 Host Interface for ITC-16
+1483 LABWAY Corporation
+1484 Logic Corporation
+1485 ERMA - Electronic GmBH
+1486 L3 Communications Telemetry & Instrumentation
+1487 MARQUETTE Medical Systems
+1488 KONTRON Electronik GmBH
+1489 KYE Systems Corporation
+148a OPTO
+148b INNOMEDIALOGIC Inc.
+148c C.P. Technology Co. Ltd
+148d DIGICOM Systems, Inc.
+ 1003 HCF 56k Data/Fax Modem
+148e OSI Plus Corporation
+148f Plant Equipment, Inc.
+1490 Stone Microsystems PTY Ltd.
+1491 ZEAL Corporation
+1492 Time Logic Corporation
+1493 MAKER Communications
+1494 WINTOP Technology, Inc.
+1495 TOKAI Communications Industry Co. Ltd
+1496 JOYTECH Computer Co., Ltd.
+1497 SMA Regelsysteme GmBH
+ 1497 SMA Technologie AG
+1498 TEWS Technologies GmbH
+ 0330 TPMC816 2 Channel CAN bus controller.
+ 035d TPMC861 4-Channel Isolated Serial Interface RS422/RS485
+ 0385 TPMC901 Extended CAN bus with 2/4/6 CAN controller
+ 21cc TCP460 CompactPCI 16 Channel Serial Interface RS232/RS422
+ 21cd TCP461 CompactPCI 8 Channel Serial Interface RS232/RS422
+ 3064 TPCI100 (2 Slot IndustryPack PCI Carrier)
+ 30c8 TPCI200
+1499 EMTEC CO., Ltd
+149a ANDOR Technology Ltd
+149b SEIKO Instruments Inc
+149c OVISLINK Corp.
+149d NEWTEK Inc
+ 0001 Video Toaster for PC
+149e Mapletree Networks Inc.
+149f LECTRON Co Ltd
+14a0 SOFTING GmBH
+14a1 Systembase Co Ltd
+14a2 Millennium Engineering Inc
+14a3 Maverick Networks
+14a4 GVC/BCM Advanced Research
+ 4318 BCM4318 [AirForce One 54g] 802.11g Wireless LAN Controller
+14a5 XIONICS Document Technologies Inc
+14a6 INOVA Computers GmBH & Co KG
+14a7 MYTHOS Systems Inc
+14a8 FEATRON Technologies Corporation
+14a9 HIVERTEC Inc
+14aa Advanced MOS Technology Inc
+14ab Mentor Graphics Corp.
+14ac Novaweb Technologies Inc
+14ad Time Space Radio AB
+14ae CTI, Inc
+14af Guillemot Corporation
+ 7102 3D Prophet II MX
+14b0 BST Communication Technology Ltd
+14b1 Nextcom K.K.
+14b2 ENNOVATE Networks Inc
+14b3 XPEED Inc
+ 0000 DSL NIC
+14b4 PHILIPS Business Electronics B.V.
+14b5 Creamware GmBH
+ 0200 Scope
+ 0300 Pulsar
+ 0400 PulsarSRB
+ 0600 Pulsar2
+ 0800 DSP-Board
+ 0900 DSP-Board
+ 0a00 DSP-Board
+ 0b00 DSP-Board
+14b6 Quantum Data Corp.
+14b7 PROXIM Inc
+ 0001 Symphony 4110
+14b8 Techsoft Technology Co Ltd
+14b9 AIRONET Wireless Communications
+ 0001 PC4800
+ 0340 PC4800
+ 0350 PC4800
+ 4500 PC4500
+ 4800 Cisco Aironet 340 802.11b Wireless LAN Adapter/Aironet PC4800
+ a504 Cisco Aironet Wireless 802.11b
+ a505 Cisco Aironet CB20a 802.11a Wireless LAN Adapter
+ a506 Cisco Aironet Mini PCI b/g
+14ba INTERNIX Inc.
+# ARCNET interface card based on SMSC COM20022 chip and manufactured for SMSC Japan
+ 0600 ARC-PCI/22
+14bb SEMTECH Corporation
+14bc Globespan Semiconductor Inc.
+ d002 Pulsar [PCI ADSL Card]
+ d00f Pulsar [PCI ADSL Card]
+14bd CARDIO Control N.V.
+14be L3 Communications
+14bf SPIDER Communications Inc.
+14c0 COMPAL Electronics Inc
+14c1 MYRICOM Inc.
+ 0008 Myri-10G Dual-Protocol NIC
+ 14c1 0008 10G-PCIE-8A
+ 14c1 0009 10G-PCIE-8A (MSI-X firmware)
+ 14c1 000a 10G-PCIE-8B
+ 14c1 000b 10G-PCIE-8B2
+ 14c1 000c 10G-PCIE2-8B2
+ 8043 Myrinet 2000 Scalable Cluster Interconnect
+ 103c 1240 Myrinet M2L-PCI64/2-3.0 LANai 7.4 (HP OEM)
+14c2 DTK Computer
+14c3 MEDIATEK Corp.
+14c4 IWASAKI Information Systems Co Ltd
+14c5 Automation Products AB
+14c6 Data Race Inc
+14c7 Modular Technology Holdings Ltd
+14c8 Turbocomm Tech. Inc.
+14c9 ODIN Telesystems Inc
+14ca PE Logic Corp.
+14cb Billionton Systems Inc
+14cc NAKAYO Telecommunications Inc
+14cd Universal Scientific Ind.
+14ce Whistle Communications
+14cf TEK Microsystems Inc.
+14d0 Ericsson Axe R & D
+14d1 Computer Hi-Tech Co Ltd
+14d2 Titan Electronics Inc
+ 8001 VScom 010L 1 port parallel adaptor
+ 8002 VScom 020L 2 port parallel adaptor
+ 8010 VScom 100L 1 port serial adaptor
+ 8011 VScom 110L 1 port serial and 1 port parallel adaptor
+ 8020 VScom 200L 1 port serial adaptor
+ 8021 VScom 210L 2 port serial and 1 port parallel adaptor
+ 8028 VScom 200I/200I-SI 2-port serial adapter
+ 8040 VScom 400L 4 port serial adaptor
+ 8043 VScom 430L 4-port serial and 3-port parallel adapter
+ 8048 VScom 400I 4-port serial adapter
+ 8080 VScom 800L 8 port serial adaptor
+ 8088 VScom 800I 8-port serial adapter
+ a000 VScom 010H 1 port parallel adaptor
+ a001 VScom 100H 1 port serial adaptor
+ a003 VScom 400H 4 port serial adaptor
+ a004 VScom 400HF1 4 port serial adaptor
+ a005 VScom 200H 2 port serial adaptor
+ a007 VScom PCI800EH (PCIe) 8-port serial adapter Port 1-4
+ a008 VScom PCI800EH (PCIe) 8-port serial adapter Port 5-8
+ a009 VScom PCI400EH (PCIe) 4-port serial adapter
+ e001 VScom 010HV2 1 port parallel adaptor
+ e010 VScom 100HV2 1 port serial adaptor
+ e020 VScom 200HV2 2 port serial adaptor
+14d3 CIRTECH (UK) Ltd
+14d4 Panacom Technology Corp
+14d5 Nitsuko Corporation
+14d6 Accusys Inc
+ 6101 ACS-61xxx, PCIe to SAS/SATA RAID HBA
+ 6201 ACS-62xxx, External PCIe to SAS/SATA RAID controller
+14d7 Hirakawa Hewtech Corp
+14d8 HOPF Elektronik GmBH
+# Formerly SiPackets, Inc., formerly API NetWorks, Inc., formerly Alpha Processor, Inc.
+14d9 Alliance Semiconductor Corporation
+ 0010 AP1011/SP1011 HyperTransport-PCI Bridge [Sturgeon]
+ 9000 AS90L10204/10208 HyperTransport to PCI-X Bridge
+14da National Aerospace Laboratories
+14db AFAVLAB Technology Inc
+ 2120 TK9902
+ 2182 AFAVLAB Technology Inc. 8-port serial card
+14dc Amplicon Liveline Ltd
+ 0000 PCI230
+ 0001 PCI242
+ 0002 PCI244
+ 0003 PCI247
+ 0004 PCI248
+ 0005 PCI249
+ 0006 PCI260
+ 0007 PCI224
+ 0008 PCI234
+ 0009 PCI236
+ 000a PCI272
+ 000b PCI215
+14dd Boulder Design Labs Inc
+14de Applied Integration Corporation
+14df ASIC Communications Corp
+14e1 INVERTEX
+14e2 INFOLIBRIA
+14e3 AMTELCO
+14e4 Broadcom Corporation
+ 0576 BCM43224 802.11a/b/g/n
+ 0800 Sentry5 Chipcommon I/O Controller
+ 0804 Sentry5 PCI Bridge
+ 0805 Sentry5 MIPS32 CPU
+ 0806 Sentry5 Ethernet Controller
+ 080b Sentry5 Crypto Accelerator
+ 080f Sentry5 DDR/SDR RAM Controller
+ 0811 Sentry5 External Interface Core
+ 0816 BCM3302 Sentry5 MIPS32 CPU
+ 1600 NetXtreme BCM5752 Gigabit Ethernet PCI Express
+ 1028 01c1 Precision 490
+ 1028 01c2 Latitude D620
+ 103c 3015 PCIe LAN on Motherboard
+ 107b 5048 E4500 Onboard
+ 1601 NetXtreme BCM5752M Gigabit Ethernet PCI Express
+ 1612 BCM70012 Video Decoder [Crystal HD]
+ 1615 BCM70015 Video Decoder [Crystal HD]
+ 1639 NetXtreme II BCM5709 Gigabit Ethernet
+ 1028 0235 PowerEdge R710 BCM5709 Gigabit Ethernet
+ 1028 0236 PowerEdge R610 BCM5709 Gigabit Ethernet
+ 1028 0237 PowerEdge T610 BCM5709 Gigabit Ethernet
+ 103c 7055 NC382i Integrated Quad Port PCI Express Gigabit Server Adapter
+ 103c 7059 NC382T PCI Express Dual Port Multifunction Gigabit Server Adapter
+ 10a9 8027 Quad port Gigabit Ethernet Controller
+ 163a NetXtreme II BCM5709S Gigabit Ethernet
+ 1028 027b PowerEdge M805 Broadcom NetXtreme II BCM5709S
+ 1028 029c PowerEdge M710 BCM5709S Gigabit Ethernet
+ 103c 171d NC382m Dual Port 1GbE Multifunction BL-c Adapter
+ 103c 7056 NC382i Integrated Quad Port PCI Express Gigabit Server Adapter
+ 163b NetXtreme II BCM5716 Gigabit Ethernet
+ 1028 028c PowerEdge R410 BCM5716 Gigabit Ethernet
+ 1028 028d PowerEdge T410 BCM5716 Gigabit Ethernet
+ 163c NetXtreme II BCM5716S Gigabit Ethernet
+ 1644 NetXtreme BCM5700 Gigabit Ethernet
+ 1014 0277 Broadcom Vigil B5700 1000Base-T
+ 1028 00d1 Broadcom BCM5700
+ 1028 0106 Broadcom BCM5700
+ 1028 0109 Broadcom BCM5700 1000Base-T
+ 1028 010a Broadcom BCM5700 1000BaseTX
+ 10b7 1000 3C996-T 1000Base-T
+ 10b7 1001 3C996B-T 1000Base-T
+ 10b7 1002 3C996C-T 1000Base-T
+ 10b7 1003 3C997-T 1000Base-T Dual Port
+ 10b7 1004 3C996-SX 1000Base-SX
+ 10b7 1005 3C997-SX 1000Base-SX Dual Port
+ 10b7 1008 3C942 Gigabit LOM (31X31)
+ 14e4 0002 NetXtreme 1000Base-SX
+ 14e4 0003 NetXtreme 1000Base-SX
+ 14e4 0004 NetXtreme 1000Base-T
+ 14e4 1028 NetXtreme 1000BaseTX
+ 14e4 1644 BCM5700 1000Base-T
+ 1645 NetXtreme BCM5701 Gigabit Ethernet
+ 0e11 007c NC7770 Gigabit Server Adapter (PCI-X, 10/100/1000-T)
+ 0e11 007d NC6770 Gigabit Server Adapter (PCI-X, 1000-SX)
+ 0e11 0085 NC7780 Gigabit Server Adapter (embedded, WOL)
+ 0e11 0099 NC7780 Gigabit Server Adapter (embedded, WOL)
+ 0e11 009a NC7770 Gigabit Server Adapter (PCI-X, 10/100/1000-T)
+ 0e11 00c1 NC6770 Gigabit Server Adapter (PCI-X, 1000-SX)
+ 1028 0121 Broadcom BCM5701 1000Base-T
+ 103c 128a BCM5701 1000Base-T (HP, OEM 3COM)
+ 103c 128b 1000Base-SX (PCI) [A7073A]
+ 103c 12a4 Core Lan 1000Base-T
+ 103c 12c1 IOX Core Lan 1000Base-T [A7109AX]
+ 103c 1300 Core LAN/SCSI Combo [A6794A]
+ 10a9 8010 IO9/IO10 Gigabit Ethernet (Copper)
+ 10a9 8011 Gigabit Ethernet (Copper)
+ 10a9 8012 Gigabit Ethernet (Fiber)
+ 10b7 1004 3C996-SX 1000Base-SX
+ 10b7 1006 3C996B-T 1000Base-T
+ 10b7 1007 3C1000-T 1000Base-T
+ 10b7 1008 3C940-BR01 1000Base-T
+ 14e4 0001 BCM5701 1000Base-T
+ 14e4 0005 BCM5701 1000Base-T
+ 14e4 0006 BCM5701 1000Base-T
+ 14e4 0007 BCM5701 1000Base-SX
+ 14e4 0008 BCM5701 1000Base-T
+ 14e4 1645 NetXtreme BCM5701 Gigabit Ethernet
+ 14e4 8008 BCM5701 1000Base-T
+ 1646 NetXtreme BCM5702 Gigabit Ethernet
+ 0e11 00bb NC7760 1000BaseTX
+ 1028 0126 Broadcom BCM5702 1000BaseTX
+ 14e4 8009 BCM5702 1000BaseTX
+ 1647 NetXtreme BCM5703 Gigabit Ethernet
+ 0e11 0099 NC7780 1000BaseTX
+ 0e11 009a NC7770 1000BaseTX
+ 10a9 8010 SGI IO9 Gigabit Ethernet (Copper)
+ 14e4 0009 BCM5703 1000BaseTX
+ 14e4 000a BCM5703 1000BaseSX
+ 14e4 000b BCM5703 1000BaseTX
+ 14e4 8009 BCM5703 1000BaseTX
+ 14e4 800a BCM5703 1000BaseTX
+ 1648 NetXtreme BCM5704 Gigabit Ethernet
+ 0e11 00cf NC7772 Gigabit Server Adapter (PCI-X, 10,100,1000-T)
+ 0e11 00d0 NC7782 Gigabit Server Adapter (PCI-X, 10,100,1000-T)
+ 0e11 00d1 NC7783 Gigabit Server Adapter (PCI-X, 10,100,1000-T)
+ 1028 014a PowerEdge 1750
+ 1028 0170 PowerEdge 6850 Broadcom NetXtreme BCM5704
+ 103c 310f NC7782 Gigabit Server Adapter (PCI-X, 10,100,1000-T)
+ 10a9 8013 Dual Port Gigabit Ethernet (PCI-X,Copper)
+ 10a9 8018 Dual Port Gigabit Ethernet (A330)
+ 10a9 801a Dual Port Gigabit Ethernet (IA-blade)
+ 10a9 801b Quad Port Gigabit Ethernet (PCI-E,Copper)
+ 10b7 2000 3C998-T Dual Port 10/100/1000 PCI-X
+ 10b7 3000 3C999-T Quad Port 10/100/1000 PCI-X
+ 1166 1648 NetXtreme CIOB-E 1000Base-T
+ 1734 100b PRIMERGY RX/TX series onboard LAN
+ 1649 NetXtreme BCM5704S_2 Gigabit Ethernet
+ 164a NetXtreme II BCM5706 Gigabit Ethernet
+ 103c 1709 NC371i Integrated PCI-X Multifunction Gigabit Server Adapter
+ 103c 3070 NC380T PCI Express Dual Port Multifunction Gigabit Server Adapter
+ 103c 3101 NC370T MultifuNCtion Gigabit Server Adapter
+ 103c 3106 NC370i Multifunction Gigabit Server Adapter
+ 164c NetXtreme II BCM5708 Gigabit Ethernet
+ 1028 01f0 PowerEdge R900 Broadcom NetXtreme II BCM5708
+ 1028 0205 PowerEdge 2970 Broadcom NetXtreme II BCM5708
+ 1028 020b PowerEdge T605 Broadcom NetXtreme II BCM5708
+ 1028 0221 PowerEdge R805 Broadcom NetXtreme II BCM5708
+ 1028 0223 PowerEdge R905 Broadcom NetXtreme II BCM5708
+ 1028 1f12 PowerEdge R805/R905 Broadcom NetXtreme II BCM5708
+ 103c 7037 NC373T PCI Express Multifunction Gigabit Server Adapter
+ 103c 7038 NC373i Integrated Multifunction Gigabit Server Adapter
+ 103c 7045 NC374m PCI Express Dual Port Multifunction Gigabit Server Adapter
+ 164d NetXtreme BCM5702FE Gigabit Ethernet
+ 164e NetXtreme II BCM57710 10-Gigabit PCIe [Everest]
+ 103c 171c NC532m Dual Port 10GbE Multifunction BL-C Adapter
+ 103c 7058 NC532i Dual Port 10GbE Multifunction BL-C Adapter
+ 164f NetXtreme II BCM57711 10-Gigabit PCIe
+ 1650 NetXtreme II BCM57711E 10-Gigabit PCIe
+ 103c 171c NC532m Dual Port 10GbE Multifunction BL-C Adapter
+ 103c 7058 NC532i Dual Port 10GbE Multifunction BL-C Adapter
+ 1653 NetXtreme BCM5705 Gigabit Ethernet
+ 0e11 00e3 NC7761 Gigabit Server Adapter
+ 1654 NetXtreme BCM5705_2 Gigabit Ethernet
+ 0e11 00e3 NC7761 Gigabit Server Adapter
+ 103c 3100 NC1020 ProLiant Gigabit Server Adapter 32 PCI
+ 103c 3226 NC150T 4-port Gigabit Combo Switch & Adapter
+ 1655 NetXtreme BCM5717 Gigabit Ethernet PCIe
+ 1656 NetXtreme BCM5718 Gigabit Ethernet PCIe
+ 1657 NetXtreme BCM5719 Gigabit Ethernet PCIe
+ 1659 NetXtreme BCM5721 Gigabit Ethernet PCI Express
+ 1014 02c6 eServer xSeries server mainboard
+ 1028 01e6 PowerEdge 860
+ 1028 023c PowerEdge R200 Broadcom NetXtreme BCM5721
+ 103c 170b NC320m PCI Express Dual Port Gigabit Server Adapter
+ 103c 7031 NC320T PCIe Gigabit Server Adapter
+ 103c 7032 NC320i PCIe Gigabit Server Adapter
+ 1734 1061 PRIMERGY RX/TX S2 series onboard LAN
+ 165a NetXtreme BCM5722 Gigabit Ethernet PCI Express
+# Dual NIC server
+ 1014 0378 IBM System x3350 (Machine type 4192)
+ 1028 020f PowerEdge R300 Broadcom NetXtreme 5722
+ 1028 0210 PowerEdge T300 Broadcom NetXtreme 5722
+ 1028 0225 PowerEdge T105 Broadcom NetXtreme 5722
+ 103c 7051 NC105i PCIe Gigabit Server Adapter
+ 103c 7052 NC105T PCIe Gigabit Server Adapter
+ 165b NetXtreme BCM5723 Gigabit Ethernet PCIe
+ 103c 705d NC107i Integrated PCI Express Gigabit Server Adapter
+ 165c NetXtreme BCM5724 Gigabit Ethernet PCIe
+ 165d NetXtreme BCM5705M Gigabit Ethernet
+ 1028 865d Latitude D400
+ 14e4 165d Dell Latitude D600
+ 165e NetXtreme BCM5705M_2 Gigabit Ethernet
+ 103c 088c NC8000 laptop
+ 103c 0890 NC6000 laptop
+ 103c 099c NX6110/NC6120
+ 10cf 1279 LifeBook E8010D
+ 165f NetXtreme BCM5720 Gigabit Ethernet PCIe
+ 1662 NetXtreme II BCM57712 10 Gigabit Ethernet
+ 1663 NetXtreme II BCM57712 10 Gigabit Ethernet Multi Function
+ 1668 NetXtreme BCM5714 Gigabit Ethernet
+ 103c 7039 NC324i PCIe Dual Port Gigabit Server Adapter
+ 1669 NetXtreme 5714S Gigabit Ethernet
+ 166a NetXtreme BCM5780 Gigabit Ethernet
+ 103c 7035 NC325i Integrated Dual port PCIe Express Gigabit Server Adapter
+ 166b NetXtreme BCM5780S Gigabit Ethernet
+ 166e 570x 10/100 Integrated Controller
+ 166f NetXtreme II BCM57712 10 Gigabit Ethernet Virtual Function
+ 1672 NetXtreme BCM5754M Gigabit Ethernet PCI Express
+ 1673 NetXtreme BCM5755M Gigabit Ethernet PCI Express
+ 1674 NetXtreme BCM5756ME Gigabit Ethernet PCI Express
+ 1677 NetXtreme BCM5751 Gigabit Ethernet PCI Express
+ 1028 0176 Dimension XPS Gen 4
+ 1028 0177 Dimension 8400
+ 1028 0179 Optiplex GX280
+ 1028 0182 Latitude D610
+ 1028 0187 Precision M70
+ 1028 01a8 Precision 380
+ 1028 01ad OptiPlex GX620
+ 103c 3006 DC7100 SFF(DX878AV)
+ 1462 028c 915P/G Neo2
+ 1734 105d Scenic W620
+ 1678 NetXtreme BCM5715 Gigabit Ethernet
+ 103c 703e NC326i PCIe Dual Port Gigabit Server Adapter
+ 1679 NetXtreme BCM5715S Gigabit Ethernet
+ 103c 1707 NC326m PCIe Dual Port Adapter
+ 103c 170c NC325m PCIe Quad Port Adapter
+ 103c 703c NC326i PCIe Dual Port Gigabit Server Adapter
+ 167a NetXtreme BCM5754 Gigabit Ethernet PCI Express
+ 1028 01da OptiPlex 745
+ 1028 01de Precision 390
+ 1028 01df PowerEdge SC440
+ 1028 0214 Precision T3400
+ 1028 021e Precision T5400
+ 167b NetXtreme BCM5755 Gigabit Ethernet PCI Express
+ 103c 280a DC5750 Microtower
+ 167d NetXtreme BCM5751M Gigabit Ethernet PCI Express
+ 1014 0577 ThinkPad Z60t
+ 103c 0940 HP Compaq nw8240 Mobile Workstation
+ 17aa 2081 ThinkPad R60e
+ 167e NetXtreme BCM5751F Fast Ethernet PCI Express
+ 167f NetLink BCM5787F Fast Ethernet PCI Express
+ 1680 NetXtreme BCM5761e Gigabit Ethernet PCIe
+ 1681 NetXtreme BCM5761 Gigabit Ethernet PCIe
+ 1684 NetXtreme BCM5764M Gigabit Ethernet PCIe
+ 1685 NetXtreme II BCM57500S Gigabit Ethernet
+ 168a NetXtreme II BCM57800 10 Gigabit Ethernet
+ 168d NetXtreme II BCM57840 10/20 Gigabit Ethernet
+ 168e NetXtreme II BCM57810 10 Gigabit Ethernet
+ 1690 NetXtreme BCM57760 Gigabit Ethernet PCIe
+ 1691 NetLink BCM57788 Gigabit Ethernet PCIe
+ 1028 04aa XPS 8300
+ 1692 NetLink BCM57780 Gigabit Ethernet PCIe
+ 1025 033d Aspire 7740G
+ 1693 NetLink BCM5787M Gigabit Ethernet PCI Express
+ 1025 0121 Aspire 5920G
+ 103c 30c0 6710b
+ 1694 NetLink BCM57790 Gigabit Ethernet PCIe
+ 1696 NetXtreme BCM5782 Gigabit Ethernet
+ 103c 12bc d530 CMT (DG746A)
+ 14e4 000d NetXtreme BCM5782 1000Base-T
+ 1698 NetLink BCM5784M Gigabit Ethernet PCIe
+ 1699 NetLink BCM5785 Gigabit Ethernet
+ 169a NetLink BCM5786 Gigabit Ethernet PCI Express
+ 169b NetLink BCM5787 Gigabit Ethernet PCI Express
+ 169c NetXtreme BCM5788 Gigabit Ethernet
+ 103c 308b MX6125
+ 103c 30a1 NC2400
+ 144d c018 X20
+ 1462 590c KT6 Delta-FIS2R (MS-6590)
+ 169d NetLink BCM5789 Gigabit Ethernet PCI Express
+ 16a0 NetLink BCM5785 Fast Ethernet
+ 16a5 NetXtreme II BCM57800 10 Gigabit Ethernet Multi Function
+ 16a6 NetXtreme BCM5702X Gigabit Ethernet
+ 0e11 00bb NC7760 Gigabit Server Adapter (PCI-X, 10/100/1000-T)
+ 1028 0126 BCM5702 1000Base-T
+ 14e4 000c BCM5702 1000Base-T
+ 14e4 8009 BCM5702 1000Base-T
+ 16a7 NetXtreme BCM5703X Gigabit Ethernet
+ 0e11 00ca NC7771 Gigabit Server Adapter (PCI-X, 10,100,1000-T)
+ 0e11 00cb NC7781 Gigabit Server Adapter (PCI-X, 10,100,1000-T)
+ 1014 026f eServer xSeries server mainboard
+ 14e4 0009 NetXtreme BCM5703 1000Base-T
+ 14e4 000a NetXtreme BCM5703 1000Base-SX
+ 14e4 000b NetXtreme BCM5703 1000Base-T
+ 14e4 800a NetXtreme BCM5703 1000Base-T
+ 16a8 NetXtreme BCM5704S Gigabit Ethernet
+ 103c 132b PCI-X 1000Mbps Dual-port Built-in
+ 10a9 8014 Dual Port Gigabit Ethernet (PCI-X,Fiber)
+ 10a9 801c Quad Port Gigabit Ethernet (PCI-E,Fiber)
+ 10b7 2001 3C998-SX Dual Port 1000-SX PCI-X
+ 16a9 NetXtreme II BCM57800 10 Gigabit Ethernet Virtual Function
+ 16aa NetXtreme II BCM5706S Gigabit Ethernet
+ 103c 3102 NC370F MultifuNCtion Gigabit Server Adapter
+ 103c 310c NC370i Multifunction Gigabit Server Adapter
+ 16ab NetXtreme II BCM57840 10/20 Gigabit Ethernet Multi Function
+ 16ac NetXtreme II BCM5708S Gigabit Ethernet
+ 1014 0304 NetXtreme II BCM5708S Gigabit Ethernet
+ 1028 01bb PowerEdge 1955 Broadcom NetXtreme II BCM5708S
+ 1028 020c PowerEdge M605 Broadcom NetXtreme II BCM5708S
+ 103c 1706 NC373m Multifunction Gigabit Server Adapter
+ 103c 7038 NC373i PCI Express Multifunction Gigabit Server Adapter
+ 103c 703b NC373i Integrated Multifunction Gigabit Server Adapter
+ 103c 703d NC373F PCI Express Multifunction Gigabit Server Adapter
+ 16ad NetXtreme II BCM57840 10/20 Gigabit Ethernet Virtual Function
+ 16ae NetXtreme II BCM57810 10 Gigabit Ethernet Multi Function
+ 16af NetXtreme II BCM57810 10 Gigabit Ethernet Virtual Function
+ 16b0 NetXtreme BCM57761 Gigabit Ethernet PCIe
+ 16b1 NetLink BCM57781 Gigabit Ethernet PCIe
+ 16b2 NetLink BCM57791 Gigabit Ethernet PCIe
+ 16b4 NetXtreme BCM57765 Gigabit Ethernet PCIe
+ 16b5 NetLink BCM57785 Gigabit Ethernet PCIe
+ 16b6 NetLink BCM57795 Gigabit Ethernet PCIe
+ 16bc NetXtreme BCM57765 Memory Card Reader
+ 16c6 NetXtreme BCM5702A3 Gigabit Ethernet
+ 10b7 1100 3C1000B-T 10/100/1000 PCI
+ 14e4 000c BCM5702 1000Base-T
+ 14e4 8009 BCM5702 1000Base-T
+ 16c7 NetXtreme BCM5703 Gigabit Ethernet
+ 0e11 00ca NC7771 Gigabit Server Adapter (PCI-X, 10,100,1000-T)
+ 0e11 00cb NC7781 Gigabit Server Adapter (PCI-X, 10,100,1000-T)
+ 103c 12c3 Combo FC/GigE-SX [A9782A]
+ 103c 12ca Combo FC/GigE-T [A9784A]
+ 103c 1321 Core I/O LAN/SCSI Combo [AB314A]
+ 14e4 0009 NetXtreme BCM5703 1000Base-T
+ 14e4 000a NetXtreme BCM5703 1000Base-SX
+ 16dd NetLink BCM5781 Gigabit Ethernet PCI Express
+ 16f7 NetXtreme BCM5753 Gigabit Ethernet PCI Express
+ 16fd NetXtreme BCM5753M Gigabit Ethernet PCI Express
+ 103c 309f Compaq nx9420 Notebook
+ 103c 30a3 Compaq nw8440
+ 16fe NetXtreme BCM5753F Fast Ethernet PCI Express
+ 170c BCM4401-B0 100Base-TX
+ 1028 0188 Inspiron 6000 laptop
+ 1028 018d Inspiron 700m/710m
+ 1028 0196 Inspiron 5160
+ 1028 01af Inspiron 6400
+ 1028 01cd Inspiron 9400 Laptop
+ 1028 01d7 XPS M1210
+ 1028 01d8 Inspiron E1405
+ 103c 099c NX6110/NC6120
+ 103c 30a2 NX7300 laptop
+ 14e4 170c HP Compaq 6720t Mobile Thin Client
+ 170d NetXtreme BCM5901 100Base-TX
+ 1014 0545 ThinkPad R40e
+ 170e NetXtreme BCM5901 100Base-TX
+ 1712 NetLink BCM5906 Fast Ethernet PCI Express
+ 1713 NetLink BCM5906M Fast Ethernet PCI Express
+ 1028 01f3 Inspiron 1420
+ 1028 0209 XPS M1330
+ 103c 30c0 Compaq 6710b
+ 17aa 3a23 IdeaPad S10e
+ 3352 BCM3352
+ 3360 BCM3360
+ 4210 BCM4210 iLine10 HomePNA 2.0
+ 4211 BCM4211 iLine10 HomePNA 2.0 + V.90 56k modem
+ 4212 BCM4212 v.90 56k modem
+ 4220 802-11b/g Wireless PCI controller, packaged as a Linksys WPC54G ver 1.2 PCMCIA card
+ 4222 NetXtreme BCM5753M Gigabit Ethernet PCI Express
+ 4301 BCM4301 802.11b Wireless LAN Controller
+ 1028 0407 TrueMobile 1180 Onboard WLAN
+ 1043 0120 WL-103b Wireless LAN PC Card
+ 16a5 1602 B-300 802.11b Wireless CardBus Adapter
+ 1737 4301 WMP11 v2.7 802.11b Wireless-B PCI Adapter
+ 4305 BCM4307 V.90 56k Modem
+ 4306 BCM4307 Ethernet Controller
+ 4307 BCM4307 802.11b Wireless LAN Controller
+ 4310 BCM4310 Chipcommon I/OController
+ 4311 BCM4311 802.11b/g WLAN
+ 1028 0007 Wireless 1390 WLAN Mini-Card
+ 1028 0008 Wireless 1390 WLAN ExpressCard
+ 103c 1363 BCM4311 802.11b/g Wireless LAN Controller
+ 103c 1364 BCM4311 802.11b/g Wireless LAN Controller
+ 103c 1365 BCM4311 802.11b/g Wireless LAN Controller
+ 103c 1374 BCM4311 802.11b/g Wireless LAN Controller
+ 103c 1375 BCM4311 802.11b/g Wireless LAN Controller
+ 103c 1376 BCM4311 802.11b/g Wireless LAN Controller
+ 103c 1377 BCM4311 802.11b/g Wireless LAN Controller
+ 103c 137f BCM4322 802.11a/b/g/n Wireless LAN Controller
+ 103c 1380 BCM4322 802.11a/b/g/n Wireless LAN Controller
+ 14e4 4311 BCM94311MCG
+ 4312 BCM4311 802.11a/b/g
+ 1028 0007 Wireless 1490 Dual Band WLAN Mini-Card
+ 1028 0008 Wireless 1490 Dual Band WLAN ExpressCard
+ 103c 135a Broadcom 802.11a/b/g WLAN
+ 103c 135f Broadcom 802.11a/b/g WLAN
+ 103c 1360 Broadcom 802.11a/b/g WLAN
+ 103c 1361 Broadcom 802.11a/b/g WLAN
+ 103c 1362 Broadcom 802.11a/b/g WLAN
+ 103c 1370 Broadcom 802.11a/b/g WLAN
+ 103c 1371 Broadcom 802.11a/b/g WLAN
+ 103c 1372 Broadcom 802.11a/b/g WLAN
+ 103c 1373 Broadcom 802.11a/b/g WLAN
+ 103c 30b5 Presario V3242AU
+ 1371 103c Broadcom 802.11 Multiband-netwerkadapter(6715s)
+ 4313 BCM4311 802.11a
+ 4315 BCM4312 802.11b/g LP-PHY
+ 1028 000b Wireless 1395 WLAN Mini-Card
+ 1028 000c Wireless 1397 WLAN Mini-Card
+ 103c 137c BCM4312 802.11b/g Wireless LAN Controller
+ 103c 137d BCM4312 802.11b/g Wireless LAN Controller
+ 4318 BCM4318 [AirForce One 54g] 802.11g Wireless LAN Controller
+ 1028 0005 Wireless 1370 WLAN Mini-PCI Card
+ 1028 0006 Wireless 1370 WLAN PC Card
+ 103c 1355 Broadcom 802.11b/g WLAN
+ 103c 1356 Broadcom 802.11b/g WLAN
+ 103c 1357 Broadcom 802.11b/g WLAN
+ 1043 100f WL-138G v2 / WL-138gE / WL-100gE
+ 1043 120f A6U notebook embedded card
+ 1154 0355 Buffalo WLI2-PCI-G54S High Speed Mode Wireless Adapter
+ 1468 0311 Aspire 3022WLMi, 5024WLMi, 5020
+ 1468 0312 TravelMate 2410
+ 14e4 0449 Gateway 7510GX
+ 16ec 0119 U.S.Robotics Wireless MAXg PC Card
+ 1737 0042 WMP54GS v1.1 802.11g Wireless-G PCI Adapter with SpeedBooster
+ 1737 0048 WPC54G v3 802.11g Wireless-G Notebook Adapter
+ 1737 0049 WPC54GS v2 802.11g Wireless-G Notebook Adapter with SpeedBooster
+ 1799 7000 F5D7000 v4000 Wireless G Desktop Card
+ 1799 7001 F5D7001 v2000 Wireless G Plus Desktop Card
+ 1799 7010 F5D7010 v4000 Wireless G Notebook Card
+ 1799 7011 F5D7011 v2000 High-Speed Mode Wireless G Notebook Card
+ 4319 BCM4318 [AirForce 54g] 802.11a/b/g PCI Express Transceiver
+ 1028 0005 Wireless 1470 Dual Band WLAN Mini-PCI Card
+ 1028 0006 Wireless 1470 Dual Band WLAN PC Card
+ 103c 1358 Broadcom 802.11a/b/g WLAN
+ 103c 1359 Broadcom 802.11a/b/g WLAN
+ 103c 135a Broadcom 802.11a/b/g WLAN
+ 4320 BCM4306 802.11b/g Wireless LAN Controller
+ 1028 0001 TrueMobile 1300 WLAN Mini-PCI Card
+ 1028 0002 TrueMobile 1300 WLAN PC Card
+ 1028 0003 Wireless 1350 WLAN Mini-PCI Card
+ 1028 0004 Wireless 1350 WLAN PC Card
+ 103c 12f4 Broadcom 802.11b/g WLAN
+ 103c 12f8 Broadcom 802.11b/g WLAN
+ 103c 12fa Broadcom 802.11b/g WLAN
+ 103c 12fb Broadcom 802.11b/g WLAN
+ 1043 100f WL-100G
+ 1057 7025 WN825G
+ 106b 004e AirPort Extreme
+ 1154 0330 Buffalo WLI2-PCI-G54S High Speed Mode Wireless Desktop Adapter
+ 144f 7050 eMachines M6805 802.11g Built-in Wireless
+ 144f 7051 Sonnet Aria Extreme PCI
+ 14e4 4320 Linksys WMP54G PCI
+ 1737 0015 WMP54GS v1.0 802.11g Wireless-G PCI Adapter with SpeedBooster
+ 1737 4320 WPC54G v1 / WPC54GS v1 802.11g Wireless-G Notebook Adapter
+ 1799 7000 F5D7000 v1000 Wireless G Desktop Card
+ 1799 7001 F5D7001 v1000 Wireless G Plus Desktop Card
+ 1799 7010 F5D7010 v1000 Wireless G Notebook Card
+ 1799 7011 F5D7011 v1000 High-Speed Mode Wireless G Notebook Card
+ 185f 1220 TravelMate 290E WLAN Mini-PCI Card
+ 4321 BCM4306 802.11a Wireless LAN Controller
+ 4322 BCM4306 UART
+ 4324 BCM4306 802.11a/b/g
+ 1028 0001 Truemobile 1400
+ 1028 0002 TrueMobile 1400 Dual Band WLAN PC Card
+ 1028 0003 Truemobile 1450 MiniPCI
+ 1028 0004 Wireless 1450 Dual Band WLAN PC Card
+ 103c 12f9 Broadcom 802.11a/b/g WLAN
+ 103c 12fc Broadcom 802.11a/b/g WLAN
+ 4325 BCM43xG 802.11b/g
+ 1414 0003 Wireless Notebook Adapter MN-720
+ 1414 0004 Wireless PCI Adapter MN-730
+ 4326 BCM4307 Chipcommon I/O Controller?
+ 4328 BCM4321 802.11a/b/g/n
+ 1028 0009 Wireless 1500 Draft 802.11n WLAN Mini-Card
+ 1028 000a Wireless 1500 Draft 802.11n WLAN Mini-card
+ 103c 1366 BCM4321 802.11a/b/g/n Wireless LAN Controller
+ 103c 1367 BCM4321 802.11a/b/g/n Wireless LAN Controller
+ 103c 1368 BCM4321 802.11a/b/g/n Wireless LAN Controller
+ 103c 1369 BCM4321 802.11a/b/g/n Wireless LAN Controller
+ 14e4 4328 BCM4328 802.11a/b/g/n
+ 4329 BCM4321 802.11b/g/n
+ 1737 0058 WPC300N v1 Wireless-N Notebook Adapter
+ 432a BCM4321
+ 432b BCM4322 802.11a/b/g/n Wireless LAN Controller
+ 1028 000d Wireless 1510 Wireless-N WLAN Mini-Card
+ 432c BCM4322 802.11b/g/n
+ 1799 d311 Dynex DX-NNBX 802.11n WLAN Cardbus Card
+ 432d BCM4322 802.11a/b/g/n
+ 4331 BCM4331 802.11a/b/g/n
+ 106b 00d6 AirPort Extreme
+ 4344 EDGE/GPRS data and 802.11b/g combo cardbus [GC89]
+ 4353 BCM43224 802.11a/b/g/n
+ 4357 BCM43225 802.11b/g/n
+ 4358 BCM43227 802.11b/g/n
+ 4359 BCM43228 802.11a/b/g/n
+ 4401 BCM4401 100Base-T
+ 1025 0035 TravelMate 660
+ 103c 08b0 tc1100 tablet
+ 1043 80a8 A7V8X motherboard
+ 4402 BCM4402 Integrated 10/100BaseT
+ 4403 BCM4402 V.90 56k Modem
+ 4410 BCM4413 iLine32 HomePNA 2.0
+ 4411 BCM4413 V.90 56k modem
+ 4412 BCM4412 10/100BaseT
+ 4430 BCM44xx CardBus iLine32 HomePNA 2.0
+ 4432 BCM4432 CardBus 10/100BaseT
+ 4610 BCM4610 Sentry5 PCI to SB Bridge
+ 4611 BCM4610 Sentry5 iLine32 HomePNA 1.0
+ 4612 BCM4610 Sentry5 V.90 56k Modem
+ 4613 BCM4610 Sentry5 Ethernet Controller
+ 4614 BCM4610 Sentry5 External Interface
+ 4615 BCM4610 Sentry5 USB Controller
+ 4704 BCM4704 PCI to SB Bridge
+ 4705 BCM4704 Sentry5 802.11b Wireless LAN Controller
+ 4706 BCM4704 Sentry5 Ethernet Controller
+ 4707 BCM4704 Sentry5 USB Controller
+ 4708 BCM4704 Crypto Accelerator
+ 4710 BCM4710 Sentry5 PCI to SB Bridge
+ 4711 BCM47xx Sentry5 iLine32 HomePNA 2.0
+ 4712 BCM47xx V.92 56k modem
+ 4713 Sentry5 Ethernet Controller
+ 4714 BCM47xx Sentry5 External Interface
+ 4715 Sentry5 USB Controller
+ 4716 BCM47xx Sentry5 USB Host Controller
+ 4717 BCM47xx Sentry5 USB Device Controller
+ 4718 Sentry5 Crypto Accelerator
+ 4719 BCM47xx/53xx RoboSwitch Core
+ 4720 BCM4712 MIPS CPU
+ 4727 BCM4313 802.11b/g/n Wireless LAN Controller
+ 1028 0010 XPS 8300
+ 5365 BCM5365P Sentry5 Host Bridge
+ 5600 BCM5600 StrataSwitch 24+2 Ethernet Switch Controller
+ 5605 BCM5605 StrataSwitch 24+2 Ethernet Switch Controller
+ 5615 BCM5615 StrataSwitch 24+2 Ethernet Switch Controller
+ 5625 BCM5625 StrataSwitch 24+2 Ethernet Switch Controller
+ 5645 BCM5645 StrataSwitch 24+2 Ethernet Switch Controller
+ 5670 BCM5670 8-Port 10GE Ethernet Switch Fabric
+ 5680 BCM5680 G-Switch 8 Port Gigabit Ethernet Switch Controller
+ 5690 BCM5690 12-port Multi-Layer Gigabit Ethernet Switch
+ 5691 BCM5691 GE/10GE 8+2 Gigabit Ethernet Switch Controller
+ 5692 BCM5692 12-port Multi-Layer Gigabit Ethernet Switch
+ 5695 BCM5695 12-port + HiGig Multi-Layer Gigabit Ethernet Switch
+ 5698 BCM5698 12-port Multi-Layer Gigabit Ethernet Switch
+ 5820 BCM5820 Crypto Accelerator
+ 5821 BCM5821 Crypto Accelerator
+ 5822 BCM5822 Crypto Accelerator
+ 5823 BCM5823 Crypto Accelerator
+ 5824 BCM5824 Crypto Accelerator
+ 5840 BCM5840 Crypto Accelerator
+ 5841 BCM5841 Crypto Accelerator
+ 5850 BCM5850 Crypto Accelerator
+ b800 BCM56800 StrataXGS 10GE Switch Controller
+14e5 Pixelfusion Ltd
+14e6 SHINING Technology Inc
+14e7 3CX
+14e8 RAYCER Inc
+14e9 GARNETS System CO Ltd
+14ea Planex Communications, Inc
+ ab06 FNW-3603-TX CardBus Fast Ethernet
+ ab07 RTL81xx RealTek Ethernet
+ ab08 FNW-3602-TX CardBus Fast Ethernet
+14eb SEIKO EPSON Corp
+14ec ACQIRIS
+14ed DATAKINETICS Ltd
+14ee MASPRO KENKOH Corp
+14ef CARRY Computer ENG. CO Ltd
+14f0 CANON RESEACH CENTRE FRANCE
+14f1 Conexant Systems, Inc.
+ 1002 HCF 56k Modem
+ 1003 HCF 56k Modem
+ 1004 HCF 56k Modem
+ 1005 HCF 56k Modem
+ 1006 HCF 56k Modem
+ 1022 HCF 56k Modem
+ 1023 HCF 56k Modem
+ 1024 HCF 56k Modem
+ 1025 HCF 56k Modem
+ 1026 HCF 56k Modem
+ 1032 HCF 56k Modem
+ 1033 HCF 56k Data/Fax Modem
+ 1033 8077 NEC
+ 122d 4027 Dell Zeus - MDP3880-W(B) Data Fax Modem
+ 122d 4030 Dell Mercury - MDP3880-U(B) Data Fax Modem
+ 122d 4034 Dell Thor - MDP3880-W(U) Data Fax Modem
+ 13e0 020d Dell Copper
+ 13e0 020e Dell Silver
+ 13e0 0261 IBM
+ 13e0 0290 Compaq Goldwing
+ 13e0 02a0 IBM
+ 13e0 02b0 IBM
+ 13e0 02c0 Compaq Scooter
+ 13e0 02d0 IBM
+ 144f 1500 IBM P85-DF (1)
+ 144f 1501 IBM P85-DF (2)
+ 144f 150a IBM P85-DF (3)
+ 144f 150b IBM P85-DF Low Profile (1)
+ 144f 1510 IBM P85-DF Low Profile (2)
+ 1034 HCF 56k Data/Fax/Voice Modem
+ 1035 HCF 56k Data/Fax/Voice/Spkp (w/Handset) Modem
+ 10cf 1098 Fujitsu P85-DFSV
+ 1036 HCF 56k Data/Fax/Voice/Spkp Modem
+ 104d 8067 HCF 56k Modem
+ 122d 4029 MDP3880SP-W
+ 122d 4031 MDP3880SP-U
+ 13e0 0209 Dell Titanium
+ 13e0 020a Dell Graphite
+ 13e0 0260 Gateway Red Owl
+ 13e0 0270 Gateway White Horse
+ 1052 HCF 56k Data/Fax Modem (Worldwide)
+ 1053 HCF 56k Data/Fax Modem (Worldwide)
+ 1054 HCF 56k Data/Fax/Voice Modem (Worldwide)
+ 1055 HCF 56k Data/Fax/Voice/Spkp (w/Handset) Modem (Worldwide)
+ 1056 HCF 56k Data/Fax/Voice/Spkp Modem (Worldwide)
+ 1057 HCF 56k Data/Fax/Voice/Spkp Modem (Worldwide)
+ 1059 HCF 56k Data/Fax/Voice Modem (Worldwide)
+ 1063 HCF 56k Data/Fax Modem
+ 1064 HCF 56k Data/Fax/Voice Modem
+ 1065 HCF 56k Data/Fax/Voice/Spkp (w/Handset) Modem
+ 1066 HCF 56k Data/Fax/Voice/Spkp Modem
+ 122d 4033 Dell Athena - MDP3900V-U
+ 1085 HCF V90 56k Data/Fax/Voice/Spkp PCI Modem
+ 10b6 CX06834-11 HCF V.92 56k Data/Fax/Voice/Spkp Modem
+ 1433 HCF 56k Data/Fax Modem
+ 1434 HCF 56k Data/Fax/Voice Modem
+ 1435 HCF 56k Data/Fax/Voice/Spkp (w/Handset) Modem
+ 1436 HCF 56k Data/Fax Modem
+ 1453 HCF 56k Data/Fax Modem
+ 13e0 0240 IBM
+ 13e0 0250 IBM
+ 144f 1502 IBM P95-DF (1)
+ 144f 1503 IBM P95-DF (2)
+ 1454 HCF 56k Data/Fax/Voice Modem
+ 1455 HCF 56k Data/Fax/Voice/Spkp (w/Handset) Modem
+ 1456 HCF 56k Data/Fax/Voice/Spkp Modem
+ 122d 4035 Dell Europa - MDP3900V-W
+ 122d 4302 Dell MP3930V-W(C) MiniPCI
+ 1610 ADSL AccessRunner PCI Arbitration Device
+ 1611 AccessRunner PCI ADSL Interface Device
+ 1620 AccessRunner V2 PCI ADSL Arbitration Device
+ 1621 AccessRunner V2 PCI ADSL Interface Device
+ 1622 AccessRunner V2 PCI ADSL Yukon WAN Adapter
+ 1803 HCF 56k Modem
+ 0e11 0023 623-LAN Grizzly
+ 0e11 0043 623-LAN Yogi
+ 1811 MiniPCI Network Adapter
+ 1815 HCF 56k Modem
+ 0e11 0022 Grizzly
+ 0e11 0042 Yogi
+ 2003 HSF 56k Data/Fax Modem
+ 2004 HSF 56k Data/Fax/Voice Modem
+ 2005 HSF 56k Data/Fax/Voice/Spkp (w/Handset) Modem
+ 2006 HSF 56k Data/Fax/Voice/Spkp Modem
+ 2013 HSF 56k Data/Fax Modem
+ 0e11 b195 Bear
+ 0e11 b196 Seminole 1
+ 0e11 b1be Seminole 2
+ 1025 8013 Acer
+ 1033 809d NEC
+ 1033 80bc NEC
+ 155d 6793 HP
+ 155d 8850 E Machines
+ 2014 HSF 56k Data/Fax/Voice Modem
+ 2015 HSF 56k Data/Fax/Voice/Spkp (w/Handset) Modem
+ 2016 HSF 56k Data/Fax/Voice/Spkp Modem
+ 2043 HSF 56k Data/Fax Modem (WorldW SmartDAA)
+ 2044 HSF 56k Data/Fax/Voice Modem (WorldW SmartDAA)
+ 2045 HSF 56k Data/Fax/Voice/Spkp (w/Handset) Modem (WorldW SmartDAA)
+ 14f1 2045 Generic SoftK56
+ 2046 HSF 56k Data/Fax/Voice/Spkp Modem (WorldW SmartDAA)
+ 2063 HSF 56k Data/Fax Modem (SmartDAA)
+ 2064 HSF 56k Data/Fax/Voice Modem (SmartDAA)
+ 2065 HSF 56k Data/Fax/Voice/Spkp (w/Handset) Modem (SmartDAA)
+ 2066 HSF 56k Data/Fax/Voice/Spkp Modem (SmartDAA)
+ 2093 HSF 56k Modem
+ 155d 2f07 Legend
+ 2143 HSF 56k Data/Fax/Cell Modem (Mob WorldW SmartDAA)
+ 2144 HSF 56k Data/Fax/Voice/Cell Modem (Mob WorldW SmartDAA)
+ 2145 HSF 56k Data/Fax/Voice/Spkp (w/HS)/Cell Modem (Mob WorldW SmartDAA)
+ 2146 HSF 56k Data/Fax/Voice/Spkp/Cell Modem (Mob WorldW SmartDAA)
+ 2163 HSF 56k Data/Fax/Cell Modem (Mob SmartDAA)
+ 2164 HSF 56k Data/Fax/Voice/Cell Modem (Mob SmartDAA)
+ 2165 HSF 56k Data/Fax/Voice/Spkp (w/HS)/Cell Modem (Mob SmartDAA)
+ 2166 HSF 56k Data/Fax/Voice/Spkp/Cell Modem (Mob SmartDAA)
+ 2343 HSF 56k Data/Fax CardBus Modem (Mob WorldW SmartDAA)
+ 2344 HSF 56k Data/Fax/Voice CardBus Modem (Mob WorldW SmartDAA)
+ 2345 HSF 56k Data/Fax/Voice/Spkp (w/HS) CardBus Modem (Mob WorldW SmartDAA)
+ 2346 HSF 56k Data/Fax/Voice/Spkp CardBus Modem (Mob WorldW SmartDAA)
+ 2363 HSF 56k Data/Fax CardBus Modem (Mob SmartDAA)
+ 2364 HSF 56k Data/Fax/Voice CardBus Modem (Mob SmartDAA)
+ 2365 HSF 56k Data/Fax/Voice/Spkp (w/HS) CardBus Modem (Mob SmartDAA)
+ 2366 HSF 56k Data/Fax/Voice/Spkp CardBus Modem (Mob SmartDAA)
+ 2443 HSF 56k Data/Fax Modem (Mob WorldW SmartDAA)
+ 104d 8075 Modem
+ 104d 8083 Modem
+ 104d 8097 Modem
+ 2444 HSF 56k Data/Fax/Voice Modem (Mob WorldW SmartDAA)
+ 2445 HSF 56k Data/Fax/Voice/Spkp (w/HS) Modem (Mob WorldW SmartDAA)
+ 2446 HSF 56k Data/Fax/Voice/Spkp Modem (Mob WorldW SmartDAA)
+ 2463 HSF 56k Data/Fax Modem (Mob SmartDAA)
+ 2464 HSF 56k Data/Fax/Voice Modem (Mob SmartDAA)
+ 2465 HSF 56k Data/Fax/Voice/Spkp (w/HS) Modem (Mob SmartDAA)
+ 2466 HSF 56k Data/Fax/Voice/Spkp Modem (Mob SmartDAA)
+ 2bfa D110 HDAudio Soft Data Fax Modem with SmartCP
+ 1025 0009 Aspire 5622WLMi
+ 2f00 HSF 56k HSFi Modem
+ 13e0 8d84 IBM HSFi V.90
+ 13e0 8d85 Compaq Stinger
+ 14f1 2004 Dynalink 56PMi
+ 2f02 HSF 56k HSFi Data/Fax
+ 2f11 HSF 56k HSFi Modem
+ 2f20 HSF 56k Data/Fax Modem
+ 14f1 200c Soft Data Fax Modem with SmartCP
+ 14f1 200f Dimension 3000
+ 2f30 SoftV92 SpeakerPhone SoftRing Modem with SmartSP
+ 14f1 2014 Devolo MikroLink 56K Modem PCI
+ 2f50 Conexant SoftK56 Data/Fax Modem
+ 5045 CX20549 (Venice)
+ 5047 High Definition Audio [Waikiki]
+ 5051 High Definition Audio (HERMOSA)
+ 5b7a CX23418 Single-Chip MPEG-2 Encoder with Integrated Analog Video/Broadcast Audio Decoder
+ 0070 7444 WinTV HVR-1600
+ 5854 3343 GoTView PCI DVD3 Hybrid
+ 8200 CX25850
+ 8234 RS8234 ATM SAR Controller [ServiceSAR Plus]
+ 8800 CX23880/1/2/3 PCI Video and Audio Decoder
+ 0070 2801 Hauppauge WinTV 28xxx (Roslyn) models
+ 0070 3401 Hauppauge WinTV 34xxx models
+ 0070 6902 WinTV HVR-4000-HD
+ 0070 7801 WinTV HVR-1800 MCE
+ 0070 9001 Nova-T DVB-T
+ 0070 9200 Nova-SE2 DVB-S
+ 0070 9202 Nova-S-Plus DVB-S
+ 0070 9402 WinTV-HVR1100 DVB-T/Hybrid
+ 0070 9600 WinTV 88x Video
+ 0070 9802 WinTV-HVR1100 DVB-T/Hybrid (Low Profile)
+ 1002 00f8 ATI TV Wonder Pro
+ 1002 a101 HDTV Wonder
+ 1043 4823 ASUS PVR-416
+ 107d 6611 Winfast TV 2000XP Expert
+ 107d 6613 Leadtek Winfast 2000XP Expert
+ 107d 6620 Leadtek Winfast DV2000
+ 107d 663c Leadtek PVR 2000
+ 107d 665f WinFast DTV1000-T
+ 10fc d003 IODATA GV-VCP3/PCI
+ 10fc d035 IODATA GV/BCTV7E
+ 1421 0334 Instant TV DVB-T PCI
+ 1461 000a AVerTV 303 (M126)
+ 1461 000b AverTV Studio 303 (M126)
+ 1461 8011 UltraTV Media Center PCI 550
+ 1462 8606 MSI TV-@nywhere Master
+ 14c7 0107 GDI Black Gold
+ 14f1 0187 Conexant DVB-T reference design
+ 14f1 0342 Digital-Logic MICROSPACE Entertainment Center (MEC)
+ 153b 1166 Cinergy 1400 DVB-T
+ 1540 2580 Provideo PV259
+ 1554 4811 PixelView
+ 1554 4813 Club 3D ZAP1000 MCE Edition
+ 17de 08a1 KWorld/VStream XPert DVB-T with cx22702
+ 17de 08a6 KWorld/VStream XPert DVB-T
+ 17de 08b2 KWorld DVB-S 100
+ 17de a8a6 digitalnow DNTV Live! DVB-T
+ 1822 0025 digitalnow DNTV Live! DVB-T Pro
+ 185b e000 VideoMate X500
+ 18ac d500 FusionHDTV 5 Gold
+ 18ac d810 FusionHDTV 3 Gold-Q
+ 18ac d820 FusionHDTV 3 Gold-T
+ 18ac db00 FusionHDTV DVB-T1
+ 18ac db11 FusionHDTV DVB-T Plus
+ 18ac db50 FusionHDTV DVB-T Dual Digital
+ 5654 2388 GoTView PCI Hybrid TV Tuner Card
+ 7063 3000 pcHDTV HD3000 HDTV
+ 7063 5500 pcHDTV HD-5500
+ 8801 CX23880/1/2/3 PCI Video and Audio Decoder [Audio Port]
+ 0070 2801 Hauppauge WinTV 28xxx (Roslyn) models
+ 185b e000 VideoMate X500
+ 5654 2388 GoTView PCI Hybrid Audio AVStream Device
+ 7063 5500 pcHDTV HD-5500
+ 8802 CX23880/1/2/3 PCI Video and Audio Decoder [MPEG Port]
+ 0070 2801 Hauppauge WinTV 28xxx (Roslyn) models
+ 0070 6902 WinTV HVR-4000-HD
+ 0070 9002 Nova-T DVB-T Model 909
+ 0070 9402 WinTV-HVR1100 DVB-T/Hybrid
+ 0070 9600 WinTV 88x MPEG Encoder
+ 1043 4823 ASUS PVR-416
+ 107d 663c Leadtek PVR 2000
+ 107d 665f WinFast DTV1000-T
+ 14f1 0187 Conexant DVB-T reference design
+ 17de 08a1 XPert DVB-T PCI BDA DVBT 23880 Transport Stream Capture
+ 17de 08a6 KWorld/VStream XPert DVB-T
+ 18ac d500 DViCO FusionHDTV5 Gold
+ 18ac d810 DViCO FusionHDTV3 Gold-Q
+ 18ac d820 DViCO FusionHDTV3 Gold-T
+ 18ac db00 DVICO FusionHDTV DVB-T1
+ 18ac db10 DVICO FusionHDTV DVB-T Plus
+ 5654 2388 GoTView PCI Hybrid TS Capture Device
+ 7063 3000 pcHDTV HD3000 HDTV
+ 7063 5500 pcHDTV HD-5500
+ 8804 CX23880/1/2/3 PCI Video and Audio Decoder [IR Port]
+ 0070 6902 WinTV HVR-4000-HD
+ 0070 9002 Nova-T DVB-T Model 909
+ 0070 9402 WinTV-HVR1100 DVB-T/Hybrid
+ 7063 5500 pcHDTV HD-5500
+ 8811 CX23880/1/2/3 PCI Video and Audio Decoder [Audio Port]
+ 0070 3401 Hauppauge WinTV 34xxx models
+ 0070 6902 WinTV HVR-4000-HD
+ 0070 9402 WinTV-HVR1100 DVB-T/Hybrid
+ 0070 9600 WinTV 88x Audio
+ 1462 8606 MSI TV-@nywhere Master
+ 18ac d500 DViCO FusionHDTV5 Gold
+ 18ac d810 DViCO FusionHDTV3 Gold-Q
+ 18ac d820 DViCO FusionHDTV3 Gold-T
+ 18ac db00 DVICO FusionHDTV DVB-T1
+ 5654 2388 GoTView PCI Hybrid Audio Capture Device
+ 8852 CX23885 PCI Video and Audio Decoder
+ 0070 8010 Hauppauge WinTV HVR-1400 ExpressCard
+ 1461 c039 AVerTV Hybrid Express (A577)
+ 18ac db78 FusionHDTV DVB-T Dual Express
+ 8880 CX23887/8 PCIe Broadcast Audio and Video Decoder with 3D Comb
+ 0070 c108 WinTV-HVR-4400-HD model 1278
+ 5654 2389 GoTView X5 DVD Hybrid PCI-E
+ 5654 2390 GoTView X5 3D HYBRID PCI-E
+14f2 MOBILITY Electronics
+ 0120 EV1000 bridge
+ 0121 EV1000 Parallel port
+ 0122 EV1000 Serial port
+ 0123 EV1000 Keyboard controller
+ 0124 EV1000 Mouse controller
+14f3 BroadLogic
+ 2030 2030 DVB-S Satellite Receiver
+ 2035 2035 DVB-S Satellite Receiver
+ 2050 2050 DVB-T Terrestrial (Cable) Receiver
+ 2060 2060 ATSC Terrestrial (Cable) Receiver
+14f4 TOKYO Electronic Industry CO Ltd
+14f5 SOPAC Ltd
+14f6 COYOTE Technologies LLC
+14f7 WOLF Technology Inc
+14f8 AUDIOCODES Inc
+ 2077 TP-240 dual span E1 VoIP PCI card
+14f9 AG COMMUNICATIONS
+14fa WANDEL & GOLTERMANN
+14fb TRANSAS MARINE (UK) Ltd
+14fc Quadrics Ltd
+ 0000 QsNet Elan3 Network Adapter
+ 0001 QsNetII Elan4 Network Adapter
+ 0002 QsNetIII Elan5 Network Adapter
+14fd JAPAN Computer Industry Inc
+14fe ARCHTEK TELECOM Corp
+14ff TWINHEAD INTERNATIONAL Corp
+1500 DELTA Electronics, Inc
+ 1360 RTL81xx RealTek Ethernet
+1501 BANKSOFT CANADA Ltd
+1502 MITSUBISHI ELECTRIC LOGISTICS SUPPORT Co Ltd
+1503 KAWASAKI LSI USA Inc
+1504 KAISER Electronics
+1505 ITA INGENIEURBURO FUR TESTAUFGABEN GmbH
+1506 CHAMELEON Systems Inc
+# Should be HTEC Ltd, but there are no known HTEC chips and 1507 is already used by mistake by Motorola (see vendor ID 1057).
+1507 Motorola ?? / HTEC
+ 0001 MPC105 [Eagle]
+ 0002 MPC106 [Grackle]
+ 0003 MPC8240 [Kahlua]
+ 0100 MC145575 [HFC-PCI]
+ 0431 KTI829c 100VG
+ 4801 Raven
+ 4802 Falcon
+ 4803 Hawk
+ 4806 CPX8216
+1508 HONDA CONNECTORS/MHOTRONICS Inc
+1509 FIRST INTERNATIONAL Computer Inc
+150a FORVUS RESEARCH Inc
+150b YAMASHITA Systems Corp
+150c KYOPAL CO Ltd
+150d WARPSPPED Inc
+150e C-PORT Corp
+150f INTEC GmbH
+1510 BEHAVIOR TECH Computer Corp
+1511 CENTILLIUM Technology Corp
+1512 ROSUN Technologies Inc
+1513 Raychem
+1514 TFL LAN Inc
+1515 Advent design
+1516 MYSON Technology Inc
+ 0800 MTD-8xx 100/10M Ethernet PCI Adapter
+ 0803 SURECOM EP-320X-S 100/10M Ethernet PCI Adapter
+ 1320 10bd SURECOM EP-320X-S 100/10M Ethernet PCI Adapter
+ 0891 MTD-8xx 100/10M Ethernet PCI Adapter
+1517 ECHOTEK Corp
+# nee PEP MODULAR Computers GmbH
+1518 Kontron Modular Computers GmbH
+1519 TELEFON AKTIEBOLAGET LM Ericsson
+151a Globetek
+ 1002 PCI-1002
+ 1004 PCI-1004
+ 1008 PCI-1008
+151b COMBOX Ltd
+151c DIGITAL AUDIO LABS Inc
+ 0003 Prodif T 2496
+ 4000 Prodif 88
+151d Fujitsu Computer Products Of America
+151e MATRIX Corp
+151f TOPIC SEMICONDUCTOR Corp
+ 0000 TP560 Data/Fax/Voice 56k modem
+1520 CHAPLET System Inc
+1521 BELL Corp
+1522 MainPine Ltd
+ 0100 PCI <-> IOBus Bridge
+ 1522 0200 RockForceDUO 2 Port V.92/V.44 Data/Fax/Voice Modem
+ 1522 0300 RockForceQUATRO 4 Port V.92/V.44 Data/Fax/Voice Modem
+ 1522 0400 RockForceDUO+ 2 Port V.92/V.44 Data/Fax/Voice Modem
+ 1522 0500 RockForceQUATRO+ 4 Port V.92/V.44 Data/Fax/Voice Modem
+ 1522 0600 RockForce+ 2 Port V.90 Data/Fax/Voice Modem
+ 1522 0700 RockForce+ 4 Port V.90 Data/Fax/Voice Modem
+ 1522 0800 RockForceOCTO+ 8 Port V.92/V.44 Data/Fax/Voice Modem
+ 1522 0c00 RockForceDUO+ 2 Port V.92/V.44 Data, V.34 Super-G3 Fax, Voice Modem
+ 1522 0d00 RockForceQUATRO+ 4 Port V.92/V.44 Data, V.34 Super-G3 Fax, Voice Modem
+ 1522 1d00 RockForceOCTO+ 8 Port V.92/V.44 Data, V.34 Super-G3 Fax, Voice Modem
+ 1522 2000 RockForceD1 1 Port V.90 Data Modem
+ 1522 2100 RockForceF1 1 Port V.34 Super-G3 Fax Modem
+ 1522 2200 RockForceD2 2 Port V.90 Data Modem
+ 1522 2300 RockForceF2 2 Port V.34 Super-G3 Fax Modem
+ 1522 2400 RockForceD4 4 Port V.90 Data Modem
+ 1522 2500 RockForceF4 4 Port V.34 Super-G3 Fax Modem
+ 1522 2600 RockForceD8 8 Port V.90 Data Modem
+ 1522 2700 RockForceF8 8 Port V.34 Super-G3 Fax Modem
+ 1522 3000 IQ Express D1 - 1 Port V.92 Data Modem
+ 1522 3100 IQ Express F1 - 1 Port V.34 Super-G3 Fax Modem
+ 1522 3200 IQ Express D2 - 2 Port V.92 Data Modem
+ 1522 3300 IQ Express F2 - 2 Port V.34 Super-G3 Fax Modem
+ 1522 3400 IQ Express D4 - 4 Port V.92 Data Modem
+ 1522 3500 IQ Express F4 - 4 Port V.34 Super-G3 Fax Modem
+ 1522 3c00 IQ Express D8 - 8 Port V.92 Data Modem
+ 1522 3d00 IQ Express F8 - 8 Port V.34 Super-G3 Fax Modem
+ 4000 PCI Express UART
+ 1522 4001 IQ Express 1-port V.34 Super-G3 Fax
+ 1522 4002 IQ Express 2-port V.34 Super-G3 Fax
+ 1522 4004 IQ Express 4-port V.34 Super-G3 Fax
+ 1522 4008 IQ Express 8-port V.34 Super-G3 Fax
+ 1522 4100 IQ Express SideBand
+1523 MUSIC Semiconductors
+1524 ENE Technology Inc
+ 0510 CB710 Memory Card Reader Controller
+ 103c 006a NX9500
+ 0520 FLASH memory: ENE Technology Inc:
+ 0530 ENE PCI Memory Stick Card Reader Controller
+ 0550 ENE PCI Secure Digital Card Reader Controller
+ 0551 SD/MMC Card Reader Controller
+ 0610 PCI Smart Card Reader Controller
+ 0720 Memory Stick Card Reader Controller
+ 0730 ENE PCI Memory Stick Card Reader Controller
+ 0750 ENE PCI SmartMedia / xD Card Reader Controller
+ 0751 ENE PCI Secure Digital / MMC Card Reader Controller
+ 1211 CB1211 Cardbus Controller
+ 1225 CB1225 Cardbus Controller
+ 1410 CB1410 Cardbus Controller
+ 1025 003c CL50 motherboard
+ 1025 005a TravelMate 290
+ 1411 CB-710/2/4 Cardbus Controller
+ 103c 006a NX9500
+ 1412 CB-712/4 Cardbus Controller
+ 1420 CB1420 Cardbus Controller
+ 1421 CB-720/2/4 Cardbus Controller
+ 1422 CB-722/4 Cardbus Controller
+1525 IMPACT Technologies
+1526 ISS, Inc
+1527 SOLECTRON
+1528 ACKSYS
+1529 AMERICAN MICROSystems Inc
+152a QUICKTURN DESIGN Systems
+152b FLYTECH Technology CO Ltd
+152c MACRAIGOR Systems LLC
+152d QUANTA Computer Inc
+152e MELEC Inc
+152f PHILIPS - CRYPTO
+1530 ACQIS Technology Inc
+1531 CHRYON Corp
+1532 ECHELON Corp
+ 0020 LonWorks PCLTA-20 PCI LonTalk Adapter
+1533 BALTIMORE
+1534 ROAD Corp
+1535 EVERGREEN Technologies Inc
+1536 ACTIS Computer
+1537 DATALEX COMMUNCATIONS
+1538 ARALION Inc
+ 0303 ARS106S Ultra ATA 133/100/66 Host Controller
+1539 ATELIER INFORMATIQUES et ELECTRONIQUE ETUDES S.A.
+153a ONO SOKKI
+153b TERRATEC Electronic GmbH
+ 1144 Aureon 5.1
+# Terratec seems to use several IDs for the same card.
+ 1147 Aureon 5.1 Sky
+ 1158 Philips Semiconductors SAA7134 (rev 01) [Terratec Cinergy 600 TV]
+153c ANTAL Electronic
+153d FILANET Corp
+153e TECHWELL Inc
+153f MIPS Technologies, Inc.
+ 0001 SOC-it 101 System Controller
+1540 PROVIDEO MULTIMEDIA Co Ltd
+1541 MACHONE Communications
+1542 Concurrent Computer Corporation
+ 9260 RCIM-II Real-Time Clock & Interrupt Module
+1543 SILICON Laboratories
+ 3052 Intel 537 [Winmodem]
+ 3155 Motorola SM56 Speakerphone Modem
+ 4c22 Si3036 MC'97 DAA
+1544 DCM DATA Systems
+1545 VISIONTEK
+1546 IOI Technology Corp
+1547 MITUTOYO Corp
+1548 JET PROPULSION Laboratory
+1549 INTERCONNECT Systems Solutions
+154a MAX Technologies Inc
+154b COMPUTEX Co Ltd
+154c VISUAL Technology Inc
+154d PAN INTERNATIONAL Industrial Corp
+154e SERVOTEST Ltd
+154f STRATABEAM Technology
+1550 OPEN NETWORK Co Ltd
+1551 SMART Electronic DEVELOPMENT GmBH
+1552 RACAL AIRTECH Ltd
+1553 CHICONY Electronics Co Ltd
+1554 PROLINK Microsystems Corp
+1555 GESYTEC GmBH
+1556 PLD APPLICATIONS
+1557 MEDIASTAR Co Ltd
+1558 CLEVO/KAPOK Computer
+1559 SI LOGIC Ltd
+155a INNOMEDIA Inc
+155b PROTAC INTERNATIONAL Corp
+155c Cemax-Icon Inc
+155d Mac System Co Ltd
+155e LP Elektronik GmbH
+155f Perle Systems Ltd
+1560 Terayon Communications Systems
+1561 Viewgraphics Inc
+1562 Symbol Technologies
+1563 A-Trend Technology Co Ltd
+1564 Yamakatsu Electronics Industry Co Ltd
+1565 Biostar Microtech Int'l Corp
+1566 Ardent Technologies Inc
+1567 Jungsoft
+1568 DDK Electronics Inc
+1569 Palit Microsystems Inc.
+156a Avtec Systems
+156b 2wire Inc
+156c Vidac Electronics GmbH
+156d Alpha-Top Corp
+156e Alfa Inc
+156f M-Systems Flash Disk Pioneers Ltd
+1570 Lecroy Corp
+1571 Contemporary Controls
+ a001 CCSI PCI20-485 ARCnet
+ a002 CCSI PCI20-485D ARCnet
+ a003 CCSI PCI20-485X ARCnet
+ a004 CCSI PCI20-CXB ARCnet
+ a005 CCSI PCI20-CXS ARCnet
+ a006 CCSI PCI20-FOG-SMA ARCnet
+ a007 CCSI PCI20-FOG-ST ARCnet
+ a008 CCSI PCI20-TB5 ARCnet
+ a009 CCSI PCI20-5-485 5Mbit ARCnet
+ a00a CCSI PCI20-5-485D 5Mbit ARCnet
+ a00b CCSI PCI20-5-485X 5Mbit ARCnet
+ a00c CCSI PCI20-5-FOG-ST 5Mbit ARCnet
+ a00d CCSI PCI20-5-FOG-SMA 5Mbit ARCnet
+ a201 CCSI PCI22-485 10Mbit ARCnet
+ a202 CCSI PCI22-485D 10Mbit ARCnet
+ a203 CCSI PCI22-485X 10Mbit ARCnet
+ a204 CCSI PCI22-CHB 10Mbit ARCnet
+ a205 CCSI PCI22-FOG_ST 10Mbit ARCnet
+ a206 CCSI PCI22-THB 10Mbit ARCnet
+1572 Otis Elevator Company
+1573 Lattice - Vantis
+1574 Fairchild Semiconductor
+1575 Voltaire Advanced Data Security Ltd
+1576 Viewcast COM
+1578 HITT
+ 4d34 VPMK4 [Video Processor Mk IV]
+ 5615 VPMK3 [Video Processor Mk III]
+1579 Dual Technology Corp
+157a Japan Elecronics Ind Inc
+157b Star Multimedia Corp
+157c Eurosoft (UK)
+ 8001 Fix2000 PCI Y2K Compliance Card
+157d Gemflex Networks
+157e Transition Networks
+157f PX Instruments Technology Ltd
+1580 Primex Aerospace Co
+1581 SEH Computertechnik GmbH
+1582 Cytec Corp
+1583 Inet Technologies Inc
+1584 Uniwill Computer Corp
+1585 Logitron
+1586 Lancast Inc
+1587 Konica Corp
+1588 Solidum Systems Corp
+1589 Atlantek Microsystems Pty Ltd
+ 0008 Leutron Vision PicPortExpress CL
+ 0009 Leutron Vision PicPortExpress CL Stereo
+158a Digalog Systems Inc
+158b Allied Data Technologies
+158c Hitachi Semiconductor & Devices Sales Co Ltd
+158d Point Multimedia Systems
+158e Lara Technology Inc
+158f Ditect Coop
+1590 3PAR Inc.
+ 0001 Eagle Cluster Manager
+ 0002 Osprey Cluster Manager
+ 0003 Harrier Cluster Manager
+ a01d FC044X Fibre Channel HBA
+1591 ARN
+1592 Syba Tech Ltd
+ 0781 Multi-IO Card
+ 0782 Parallel Port Card 2xEPP
+ 0783 Multi-IO Card
+ 0785 Multi-IO Card
+ 0786 Multi-IO Card
+ 0787 Multi-IO Card
+ 0788 Multi-IO Card
+ 078a Multi-IO Card
+1593 Bops Inc
+1594 Netgame Ltd
+1595 Diva Systems Corp
+1596 Folsom Research Inc
+1597 Memec Design Services
+1598 Granite Microsystems
+1599 Delta Electronics Inc
+159a General Instrument
+159b Faraday Technology Corp
+159c Stratus Computer Systems
+159d Ningbo Harrison Electronics Co Ltd
+159e A-Max Technology Co Ltd
+159f Galea Network Security
+15a0 Compumaster SRL
+15a1 Geocast Network Systems
+15a2 Catalyst Enterprises Inc
+ 0001 TA700 PCI Bus Analyzer/Exerciser
+15a3 Italtel
+15a4 X-Net OY
+15a5 Toyota Macs Inc
+15a6 Sunlight Ultrasound Technologies Ltd
+15a7 SSE Telecom Inc
+15a8 Shanghai Communications Technologies Center
+15aa Moreton Bay
+15ab Bluesteel Networks Inc
+15ac North Atlantic Instruments
+15ad VMware
+ 0405 SVGA II Adapter
+ 0710 SVGA Adapter
+ 0720 VMXNET Ethernet Controller
+ 0740 Virtual Machine Communication Interface
+ 0770 USB2 EHCI Controller
+ 0774 USB1.1 UHCI Controller
+ 0790 PCI bridge
+ 07a0 PCI Express Root Port
+ 07b0 VMXNET3 Ethernet Controller
+ 07c0 PVSCSI SCSI Controller
+ 0801 Virtual Machine Interface
+ 15ad 0800 Hypervisor ROM Interface
+15ae Amersham Pharmacia Biotech
+15b0 Zoltrix International Ltd
+15b1 Source Technology Inc
+15b2 Mosaid Technologies Inc
+15b3 Mellanox Technologies
+ 0191 MT25408 [ConnectX IB Flash Recovery]
+ 01f5 MT27500 Family [ConnectX-3 Flash Recovery]
+ 1002 MT25400 Family [ConnectX-2 Virtual Function]
+ 1003 MT27500 Family [ConnectX-3]
+ 1004 MT27500 Family [ConnectX-3 Virtual Function]
+ 1005 MT27510 Family
+ 1006 MT27511 Family
+ 1007 MT27520 Family
+ 1008 MT27521 Family
+ 1009 MT27530 Family
+ 100a MT27531 Family
+ 100b MT27540 Family
+ 100c MT27541 Family
+ 100d MT27550 Family
+ 100e MT27551 Family
+ 100f MT27560 Family
+ 1010 MT27561 Family
+ 5274 MT21108 InfiniBridge
+ 5a44 MT23108 InfiniHost
+ 5a45 MT23108 [Infinihost HCA Flash Recovery]
+ 5a46 MT23108 PCI Bridge
+ 5e8c MT24204 [InfiniHost III Lx HCA]
+ 5e8d MT25204 [InfiniHost III Lx HCA Flash Recovery]
+ 6274 MT25204 [InfiniHost III Lx HCA]
+ 6278 MT25208 InfiniHost III Ex (Tavor compatibility mode)
+ 6279 MT25208 [InfiniHost III Ex HCA Flash Recovery]
+ 6282 MT25208 [InfiniHost III Ex]
+ 6340 MT25408 [ConnectX VPI - IB SDR / 10GigE]
+ 634a MT25418 [ConnectX VPI PCIe 2.0 2.5GT/s - IB DDR / 10GigE]
+ 6368 MT25448 [ConnectX EN 10GigE, PCIe 2.0 2.5GT/s]
+ 6372 MT25408 [ConnectX EN 10GigE 10GBaseT, PCIe 2.0 2.5GT/s]
+ 6732 MT26418 [ConnectX VPI PCIe 2.0 5GT/s - IB DDR / 10GigE]
+ 673c MT26428 [ConnectX VPI PCIe 2.0 5GT/s - IB QDR / 10GigE]
+ 6746 MT26438 [ConnectX VPI PCIe 2.0 5GT/s - IB QDR / 10GigE Virtualization+]
+ 103c 1781 NC543i 1-port 4x QDR IB/Flex-10 10Gb Adapter
+ 103c 3349 NC543i 2-port 4xQDR IB/10Gb Adapter
+ 6750 MT26448 [ConnectX EN 10GigE, PCIe 2.0 5GT/s]
+ 675a MT25408 [ConnectX EN 10GigE 10GBaseT, PCIe Gen2 5GT/s]
+ 6764 MT26468 [ConnectX EN 10GigE, PCIe 2.0 5GT/s Virtualization+]
+ 103c 3313 HP NC542m Dual Port Flex-10 10GbE BLc Adapter
+ 676e MT26478 [ConnectX EN 40GigE, PCIe 2.0 5GT/s]
+ 6778 MT26488 [ConnectX VPI PCIe 2.0 5GT/s - IB DDR / 10GigE Virtualization+]
+15b4 CCI/TRIAD
+15b5 Cimetrics Inc
+15b6 Texas Memory Systems Inc
+ 0001 XP15 DSP Accelerator
+ 0002 XP30 DSP Accelerator
+ 0003 XP00 Data Acquisition Device
+ 0004 XP35 DSP Accelerator
+ 0007 XP100 DSP Accelerator [XP100-T0]
+ 0008 XP100 DSP Accelerator [XP100-T1]
+ 0009 XP100 DSP Accelerator [XP100-E0]
+ 000a XP100 DSP Accelerator [XP100-E1]
+ 000e XP100 DSP Accelerator [XP100-0]
+ 000f XP100 DSP Accelerator [XP100-1]
+ 0010 XP100 DSP Accelerator [XP100-P0]
+ 0011 XP100 DSP Accelerator [XP100-P1]
+ 0012 XP100 DSP Accelerator [XP100-P2]
+ 0013 XP100 DSP Accelerator [XP100-P3]
+ 0014 RamSan Flash SSD
+ 0015 ZBox
+15b7 Sandisk Corp
+15b8 ADDI-DATA GmbH
+ 1001 APCI1516 SP controller (16 digi outputs)
+ 1003 APCI1032 SP controller (32 digi inputs w/ opto coupler)
+ 1004 APCI2032 SP controller (32 digi outputs)
+ 1005 APCI2200 SP controller (8/16 digi outputs (relay))
+ 1006 APCI1564 SP controller (32 digi ins, 32 digi outs)
+ 100a APCI1696 SP controller (96 TTL I/Os)
+ 3001 APCI3501 SP controller (analog output board)
+ 300f APCI3600 Noise and vibration measurement board
+ 7001 APCI7420 2-port Serial Controller
+ 7002 APCI7300 Serial Controller
+15b9 Maestro Digital Communications
+15ba Impacct Technology Corp
+15bb Portwell Inc
+15bc Agilent Technologies
+ 0103 QX4 PCI Express quad 4-gigabit Fibre Channel controller
+ 0105 Celerity FC-42XS Fibre Channel Adapter
+ 117c 0022 Celerity FC-42XS Fibre Channel Adapter
+ 1100 E8001-66442 PCI Express CIC
+ 2922 64 Bit, 133MHz PCI-X Exerciser & Protocol Checker
+ 2928 64 Bit, 66MHz PCI Exerciser & Analyzer
+ 2929 64 Bit, 133MHz PCI-X Analyzer & Exerciser
+15bd DFI Inc
+15be Sola Electronics
+15bf High Tech Computer Corp (HTC)
+15c0 BVM Ltd
+15c1 Quantel
+15c2 Newer Technology Inc
+15c3 Taiwan Mycomp Co Ltd
+15c4 EVSX Inc
+15c5 Procomp Informatics Ltd
+ 8010 1394b - 1394 Firewire 3-Port Host Adapter Card
+15c6 Technical University of Budapest
+15c7 Tateyama System Laboratory Co Ltd
+ 0349 Tateyama C-PCI PLC/NC card Rev.01A
+15c8 Penta Media Co Ltd
+15c9 Serome Technology Inc
+15ca Bitboys OY
+15cb AG Electronics Ltd
+15cc Hotrail Inc
+15cd Dreamtech Co Ltd
+15ce Genrad Inc
+15cf Hilscher GmbH
+15d1 Infineon Technologies AG
+15d2 FIC (First International Computer Inc)
+15d3 NDS Technologies Israel Ltd
+15d4 Iwill Corp
+15d5 Tatung Co
+15d6 Entridia Corp
+15d7 Rockwell-Collins Inc
+15d8 Cybernetics Technology Co Ltd
+15d9 Super Micro Computer Inc
+15da Cyberfirm Inc
+15db Applied Computing Systems Inc
+15dc Litronic Inc
+ 0001 Argus 300 PCI Cryptography Module
+15dd Sigmatel Inc
+15de Malleable Technologies Inc
+15df Infinilink Corp
+15e0 Cacheflow Inc
+15e1 Voice Technologies Group Inc
+15e2 Quicknet Technologies Inc
+ 0500 PhoneJack-PCI
+15e3 Networth Technologies Inc
+15e4 VSN Systemen BV
+15e5 Valley technologies Inc
+15e6 Agere Inc
+15e7 Get Engineering Corp
+15e8 National Datacomm Corp
+ 0130 Wireless PCI Card
+ 0131 NCP130A2 Wireless NIC
+15e9 Pacific Digital Corp
+ 1841 ADMA-100 DiscStaQ ATA Controller
+15ea Tokyo Denshi Sekei K.K.
+15eb DResearch Digital Media Systems GmbH
+15ec Beckhoff GmbH
+ 3101 FC3101 Profibus DP 1 Channel PCI
+ 5102 FC5102
+15ed Macrolink Inc
+15ee In Win Development Inc
+15ef Intelligent Paradigm Inc
+15f0 B-Tree Systems Inc
+15f1 Times N Systems Inc
+15f2 Diagnostic Instruments Inc
+15f3 Digitmedia Corp
+15f4 Valuesoft
+15f5 Power Micro Research
+15f6 Extreme Packet Device Inc
+15f7 Banctec
+15f8 Koga Electronics Co
+15f9 Zenith Electronics Corp
+15fa J.P. Axzam Corp
+15fb Zilog Inc
+15fc Techsan Electronics Co Ltd
+15fd N-CUBED.NET
+15fe Kinpo Electronics Inc
+15ff Fastpoint Technologies Inc
+1600 Northrop Grumman - Canada Ltd
+1601 Tenta Technology
+1602 Prosys-tec Inc
+1603 Nokia Wireless Communications
+1604 Central System Research Co Ltd
+1605 Pairgain Technologies
+1606 Europop AG
+1607 Lava Semiconductor Manufacturing Inc
+1608 Automated Wagering International
+1609 Scimetric Instruments Inc
+1612 Telesynergy Research Inc.
+1618 Stone Ridge Technology
+ 0001 RDX 11
+ 0002 HFT-01
+ 0400 FarSync T2P (2 port X.21/V.35/V.24)
+ 0440 FarSync T4P (4 port X.21/V.35/V.24)
+ 0610 FarSync T1U (1 port X.21/V.35/V.24)
+ 0620 FarSync T2U (2 port X.21/V.35/V.24)
+ 0640 FarSync T4U (4 port X.21/V.35/V.24)
+ 1610 FarSync TE1 (T1,E1)
+ 2610 FarSync DSL-S1 (SHDSL)
+ 3640 FarSync T4E (4-port X.21/V.35/V.24)
+ 4620 FarSync T2Ue PCI Express (2-port X.21/V.35/V.24)
+ 4640 FarSync T4Ue PCI Express (4-port X.21/V.35/V.24)
+1619 FarSite Communications Ltd
+ 0400 FarSync T2P (2 port X.21/V.35/V.24)
+ 0440 FarSync T4P (4 port X.21/V.35/V.24)
+ 0610 FarSync T1U (1 port X.21/V.35/V.24)
+ 0620 FarSync T2U (2 port X.21/V.35/V.24)
+ 0640 FarSync T4U (4 port X.21/V.35/V.24)
+ 1610 FarSync TE1 (T1,E1)
+ 2610 FarSync DSL-S1 (SHDSL)
+ 3640 FarSync T4E (4-port X.21/V.35/V.24)
+ 4620 FarSync T2Ue PCI Express (2-port X.21/V.35/V.24)
+ 4640 FarSync T4Ue PCI Express (4-port X.21/V.35/V.24)
+161f Rioworks
+1626 TDK Semiconductor Corp.
+ 8410 RTL81xx Fast Ethernet
+1629 Kongsberg Spacetec AS
+ 1003 Format synchronizer v3.0
+ 1006 Format synchronizer, model 10500
+ 1007 Format synchronizer, model 21000
+ 2002 Fast Universal Data Output
+1631 Packard Bell B.V.
+1638 Standard Microsystems Corp [SMC]
+ 1100 SMC2602W EZConnect / Addtron AWA-100 / Eumitcom PCI WL11000
+163c Smart Link Ltd.
+ 3052 SmartLink SmartPCI562 56K Modem
+ 5449 SmartPCI561 Modem
+1641 MKNet Corp.
+1657 Brocade Communications Systems, Inc.
+ 0013 425/825/42B/82B 4Gbps/8Gbps PCIe dual port FC HBA
+ 103c 1742 HP 82B 8Gbps dual port FC HBA
+ 103c 1744 HP 42B 4Gbps dual port FC HBA
+ 1657 0014 425/825 4Gbps/8Gbps PCIe dual port FC HBA
+ 0014 1010/1020/1007 10Gbps CNA
+ 1657 0014 1010/1020/1007 10Gbps CNA - FCOE
+ 1657 0015 1010/1020/1007 10Gbps CNA - LL
+ 0017 415/815/41B/81B 4Gbps/8Gbps PCIe single port FC HBA
+ 103c 1741 HP 41B 4Gbps single port FC HBA
+ 103c 1743 HP 81B 8Gbps single port FC HBA
+ 1657 0014 415/815 4Gbps/8Gbps single port PCIe FC HBA
+ 0021 804/807 8Gbps FC HBA
+ 103c 1779 804 8Gbps FC HBA for HP Bladsystem c-class
+ 1657 0014 8Gbps FC HBA
+# Same Device_ID used for 410 (1port) and 420 (2 port) HBAs.
+ 0646 400 4Gbps PCIe FC HBA
+165a Epix Inc
+ c100 PIXCI(R) CL1 Camera Link Video Capture Board [custom QL5232]
+ d200 PIXCI(R) D2X Digital Video Capture Board [custom QL5232]
+ d300 PIXCI(R) D3X Digital Video Capture Board [custom QL5232]
+165d Hsing Tech. Enterprise Co., Ltd.
+165f Linux Media Labs, LLC
+ 1020 LMLM4 MPEG-4 encoder
+1661 Worldspace Corp.
+1668 Actiontec Electronics Inc
+ 0100 Mini-PCI bridge
+# Formerly SiByte, Inc.
+166d Broadcom Corporation
+ 0001 SiByte BCM1125/1125H/1250 System-on-a-Chip PCI
+ 0002 SiByte BCM1125H/1250 System-on-a-Chip HyperTransport
+ 0012 SiByte BCM1280/BCM1480 System-on-a-Chip PCI-X
+ 0014 Sibyte BCM1280/BCM1480 System-on-a-Chip HyperTransport
+1677 Bernecker + Rainer
+ 104e 5LS172.6 B&R Dual CAN Interface Card
+ 12d7 5LS172.61 B&R Dual CAN Interface Card
+ 20ad 5ACPCI.MFIO-K01 Profibus DP / K-Feldbus / COM
+1678 NetEffect
+ 0100 NE020 10Gb Accelerated Ethernet Adapter (iWARP RNIC)
+1679 Tokyo Electron Device Ltd.
+ 3000 SD Standard host controller [Ellen]
+167b ZyDAS Technology Corp.
+ 2102 ZyDAS ZD1202
+ 187e 3406 ZyAIR B-122 CardBus 11Mbs Wireless LAN Card
+ 187e 3407 ZyAIR B-320 802.11b Wireless PCI Adapter
+ 2116 ZD1212B Wireless Adapter
+167d Samsung Electro-Mechanics Co., Ltd.
+ a000 MagicLAN SWL-2210P 802.11b [Intersil ISL3874]
+167e ONNTO Corp.
+1681 Hercules
+ 0010 Hercules 3d Prophet II Ultra 64MB (350 MHz NV15BR core)
+1682 XFX Pine Group Inc.
+1688 CastleNet Technology Inc.
+ 1170 WLAN 802.11b card
+168c Atheros Communications Inc.
+ 0007 AR5000 802.11a Wireless Adapter
+ 1737 0007 WPC54A Wireless PC Card
+ 1b47 0100 Harmony 8450CN Wireless CardBus Module
+ 1b47 0110 Skyline 4030 / Harmony 8450 802.11a Wireless CardBus Adapter
+ 8086 2501 PRO/Wireless 5000 LAN PCI Adapter Module
+ 0011 AR5210 802.11a NIC
+ 0012 AR5211 802.11ab NIC
+ 126c 8031 2201 Mobile Adapter
+ 1385 4400 WAB501 802.11ab Wireless CardBus Card
+ 1b47 aa00 8460 802.11ab Wireless CardBus Adapter
+ 0013 Atheros AR5001X+ Wireless Network Adapter
+ 0308 3402 AG-100 802.11ag Wireless Cardbus Adapter
+ 0308 3405 G-102 v2 802.11g Wireless Cardbus Adapter
+ 0308 3408 G-170S 802.11g Wireless CardBus Adapter
+ 0e11 00e5 NC6000 laptop
+ 10b7 6002 3CRWE154A72 802.11abg Cardbus Adapter
+ 1113 d301 Philips CPWNA100 Wireless CardBus adapter
+ 1113 ee23 SMCWPCIT-G 108Mbps Wireless PCI adapter
+ 1154 033b Buffalo WLI-CB-AMG54
+ 1154 034e Buffalo WLI-CB-AG108HP 802.11abg Cardbus Adapter
+ 1186 3202 DWL-G650 (Rev B3,B5) Wireless cardbus adapter
+ 1186 3203 AirPlus DWL-G520 Wireless PCI Adapter (rev. A)
+ 1186 3a12 D-Link AirPlus DWL-G650 Wireless Cardbus Adapter(rev.C)
+ 1186 3a13 AirPlus DWL-G520 Wireless PCI Adapter (rev. B)
+ 1186 3a14 AirPremier AG DWL-AG530 Wireless PCI Adapter (rev.A)
+ 1186 3a17 D-Link AirPremier DWL-G680 Wireless Cardbus Adapter
+ 1186 3a18 D-Link AirPremier DWL-G550 Wireless PCI Adapter
+ 1186 3a1a WNA-2330 802.11bg Wireless CardBus Adapter
+ 1186 3a63 D-Link AirPremier DWL-AG660 Wireless Cardbus Adapter
+ 1186 3a93 Conceptronic C54I Wireless 801.11g PCI card
+ 1186 3a94 C54C Wireless 801.11g cardbus
+ 1186 3ab0 Allnet ALL0281 Wireless PCI Card
+ 1385 4900 WG311v1 802.11g Wireless PCI Adapter
+ 1385 4b00 WG511T 108 Mbps Wireless PC Card (rev.A/B)
+ 1385 4d00 WG311T 108 Mbps Wireless PCI Adapter (rev.A2)
+ 1385 4f00 WG511U Double 108 Mbps Wireless PC Card
+ 1385 5a00 WG311T 108 Mbps Wireless PCI Adapter (rev.A3)
+ 1385 5b00 WG511T 108 Mbps Wireless PC Card (rev.C)
+ 1385 5d00 WPN511 RangeMax Wireless PC Card
+ 1458 e911 Gigabyte GN-WIAG02
+ 1468 0403 U10H014 802.11g Cardbus Adapter
+ 1468 0408 ThinkPad 11b/g Wireless LAN Mini PCI Adapter
+ 14b7 0a10 8480-WD 802.11abg Cardbus Adapter
+ 14b7 0a60 8482-WD ORiNOCO 11a/b/g Wireless PCI Adapter
+ 14b7 aa30 8800-FC 802.11bg Cardbus Adapter
+ 14b7 aa40 8470-WD 802.11bg Cardbus Adapter
+ 14b9 cb21 CB21 802.11a/b/g Cardbus Adapter
+ 1668 1026 IBM HighRate 11 a/b/g Wireless CardBus Adapter
+ 168c 0013 AirPlus XtremeG DWL-G650 Wireless PCMCIA Adapter
+ 168c 1025 DWL-G650B2 Wireless CardBus Adapter
+ 168c 1027 Engenius NL-3054CB ARIES b/g CardBus Adapter
+ 168c 1042 Ubiquiti Networks SuperRange a/b/g Cardbus Adapter
+ 168c 1051 EZ Connect g 802.11g 108Mbps Wireless PCI Adapter
+ 168c 2026 Netgate 5354MP ARIES a(108Mb turbo)/b/g MiniPCI Adapter
+ 168c 2027 D-Link AirPlus DWL-G520 Wireless PCI Adapter (rev. A)
+ 168c 2041 Engenius 5354MP Plus ARIES2 b/g MiniPCI Adapter
+ 168c 2042 Engenius 5354MP Plus ARIES2 a/b/g MiniPCI Adapter
+ 168c 2051 TRENDnet TEW-443PI Wireless PCI Adapter
+ 16a5 160a BWP712 802.11bg Wireless CardBus Adapter
+ 16ab 7302 Trust Speedshare Turbo Pro Wireless PCI Adapter
+ 1737 0017 WPC55AG
+ 1737 0026 WMP55AG v1.1
+ 1737 0035 WPC55AG v1.2 802.11abg Cardbus Adapter
+ 1799 3000 F6D3000 Dual-Band Wireless A+G Desktop Card
+ 1799 3010 F6D3010 Dual-Band Wireless A+G Notebook Card
+ 17cf 0042 Z-COMAX Highpower XG-622H (400mw) 802.11b/g mini-PCI Adapter
+ 185f 1012 CM9 Wireless a/b/g MiniPCI Adapter
+ 185f 2012 Wistron NeWeb WLAN a+b+g model CB9
+ a727 6801 3CRXJK10075 OfficeConnect Wireless 108Mbps 11g XJACK PC Card
+# the name AR5005G is used for the reference design using AR2413
+ 001a AR2413 802.11bg NIC
+ 1052 168c Sweex Wireless Lan PC Card 54Mbps
+ 1113 ee20 SMC Wireless CardBus Adapter 802.11g (SMCWCB-G EU)
+ 1113 ee24 SMC Wireless PCI Card WPCI-G
+ 1186 3a15 AirPlus G DWL-G630 Wireless Cardbus Adapter (rev.D1)
+ 1186 3a16 AirPlus G DWL-G510 Wireless PCI Adapter(rev.B)
+ 1186 3a1c WNA-1330 Notebook Adapter
+ 1186 3a1d WDA-1320 Desktop Adapter
+ 1186 3a23 AirPlus G DWL-G520+A Wireless PCI Adapter
+ 1186 3a24 AirPlus G DWL-G650+A Wireless Cardbus Adapter
+ 1186 3b08 AirPlus G DWL-G630 Wireless Cardbus Adapter (rev.C1)
+ 168c 001a Belkin FD7000
+ 168c 1052 TP-Link TL-WN510G Wireless CardBus Adapter
+ 168c 2052 Compex Wireless 802.11 b/g MiniPCI Adapter, Rev A1 [WLM54G]
+ 16ec 0122 Wireless PCI Adapter Model 5418
+ 1737 0053 WPC54G v7 802.11g Wireless-G Notebook Adapter
+ 1799 700c F5D7000 v5000 Wireless G Desktop Card
+ 1799 701d F5D7010 v5000 Wireless G Notebook Card
+ 17f9 0008 DX-WGNBC 802.11bg Wireless CardBus Adapter
+ 17f9 0018 DX-WGDTC 802.11bg Wireless PCI Adapter
+# the name AR5006X is used for the reference design using AR5413
+ 001b AR5413 802.11abg NIC
+ 0777 3002 XR2 802.11g Wireless Mini PCI Adapter
+ 0777 3005 XR5 802.11a Wireless Mini PCI Adapter
+ 0777 3009 XR9 900MHz Wireless Mini PCI Adapter
+ 1154 034e WLI-CB-AG108HP 802.11abg Wireless CardBus Adapter
+ 1186 3a19 D-Link AirPremier AG DWL-AG660 Wireless Cardbus Adapter
+ 1186 3a22 AirPremier AG DWL-AG530 Wireless PCI Adapter (rev.B)
+ 11ad 5001 WN5301A 802.11bg Wireless PCI Adapter
+ 1458 e901 GN-WI01HT Wireless a/b/g MiniPCI Adapter
+ 168c 001b Wireless LAN PCI LiteOn
+ 168c 1062 IPN-W100CB 802.11abg Wireless CardBus Adapter
+ 168c 2062 EnGenius EMP-8602 (400mw) or Compex WLM54AG (SuperAG)
+ 168c 2063 EnGenius EMP-8602 (400mw) or Compex WLM54AG
+ 17f9 000b WL-711A 802.11abg Wireless CardBus Adapter
+ 17f9 000c WPIA-112AG 802.11abg Wireless PCI Adapter
+ 17f9 000d PC-686X 802.11abg Wireless Mini PCI Adapter
+ 185f 1600 DCMA-82 High Power WLAN 802.11a/b/g mini-PCI Module (Super A/G, eXtended Range, 400mW)
+ 1948 3aba RBTBJ-AW 802.11abg Wireless Cardbus Adapter
+ a727 6804 Wireless 11a/b/g PC Card with XJACK(r) Antenna
+ 001c AR242x / AR542x Wireless Network Adapter (PCI-Express)
+ 0777 3006 SRX 802.11abg Wireless ExpressCard Adapter
+ 103c 137a AR5BXB63 (Foxconn) 802.11bg Mini PCIe NIC
+ 144f 7128 WLL3141 (Toshiba PA3613U-1MPC) 802.11bg Wireless Adapter
+ 1468 0428 AR5BXB63 802.11bg NIC
+ 1468 042a AR5007EG 802.11bg NIC
+ 147b 1033 AirPace Wi-Fi
+ 168c 001c AR242x 802.11abg NIC (PCI Express)
+ 168c 3061 AR5006EGS 802.11bg NIC (2.4GHz, PCI Express)
+ 168c 3062 AR5006EXS 802.11abg NIC (2.4/5.0GHz, PCI Express)
+ 168c 3063 AR5006EX 802.11abg NIC (2.4/5.0GHz, PCI Express)
+ 168c 3065 AR5006EG 802.11bg NIC (2.4GHz, PCI Express)
+ 168c 3067 AR242x 802.11abg Wireless PCI Express Adapter (rev 01)
+ 1a3b 1026 AR5007EG 802.11bg Wi-Fi mini PCI express card
+ 001d AR5007G Wireless Network Adapter
+ 1799 720b F5D7000 v8000 Wireless G Desktop Card
+ 1799 721b F5D7010 v8000 Wireless G Notebook Card
+# the name AR5005VL is used for some AR5513 based designs
+ 0020 AR5513 802.11abg Wireless NIC
+ 0308 3407 M-102 802.11g Wireless Cardbus Adapter
+ 1186 3a67 DWL-G650M Super G MIMO Wireless Notebook Adapter
+ 1186 3a68 DWL-G520M Wireless 108G MIMO Desktop Adapter
+ 187e 340e M-302 802.11g Wireless PCI Adapter
+ 1976 2003 TEW-601PC 802.11g Wireless CardBus Adapter
+ 0023 AR5008 Wireless Network Adapter
+ 0308 340b NWD-170N 802.11bgn Wireless CardBus Adapter
+ 1154 0365 Buffalo WLP-CB-AG300 802.11abgn Cardbus Adapter
+ 1154 0367 WLI-CB-AG301N 802.11abgn Wireless CardBus Adapter
+ 1186 3a6a DWA-642 802.11n RangeBooster N CardBus Adapter
+ 1186 3a6d DWA-552 802.11n Xtreme N Desktop Adapter (rev A1)
+ 1186 3a76 DWA-645 802.11n RangeBooster N 650 Notebook Adapter (rev A1)
+ 1737 0059 WPC300N v2 Wireless-N Notebook Adapter
+ 1737 0069 WPC100 v1 802.11n RangePlus Wireless Notebook Adapter
+ 1799 8011 F5D8011 v1 802.11n N1 Wireless Notebook Card
+ 187e 3411 NWD-370N 802.11n Wireless PCI Adapter
+ 1976 2008 TEW-621PC 802.11bgn Wireless CardBus Adapter
+ 0024 AR5008 Wireless Network Adapter
+ 0027 AR9160 802.11abgn Wireless PCI Adapter
+ 0777 4082 SR71-A 802.11abgn Wireless Mini PCI Adapter
+ 0029 AR922X Wireless Network Adapter
+ 1186 3a7a DWA-552 802.11n Xtreme N Desktop Adapter (rev A2)
+ 002a AR928X Wireless Network Adapter (PCI-Express)
+ 103c 3041 AR5BHB92-H 802.11abgn Wireless Half-size Mini PCIe Card
+ 1a3b 1081 AW-NE773 802.11abgn Wireless Half-size Mini PCIe Card
+ 002b AR9285 Wireless Network Adapter (PCI-Express)
+ 1931 0023 Option GTM67x PCIe WiFi Adapter
+ 002c AR2427 Wireless Network Adapter (PCI-Express)
+ 002d AR9287 Wireless Network Adapter
+ 002e AR9287 Wireless Network Adapter (PCI-Express)
+ 0030 AR9300 Wireless LAN adaptor
+ 0032 AR9485 Wireless Network Adapter
+ 0033 11a/b/g/n Wireless LAN Mini-PCI Express Adapter
+ 0207 AR5210
+ 1014 AR5212 802.11abg NIC
+ 1014 058a ThinkPad 11a/b/g Wireless LAN Mini Express Adapter (AR5BXB6)
+ 9013 AR5001X+ Wireless Network Adapter
+ ff19 AR5006X Wireless Network Adapter
+ ff1c AR5008 Wireless Network Adapter
+ ff1d AR5008 Wireless Network Adapter
+1695 EPoX Computer Co., Ltd.
+169c Netcell Corporation
+ 0044 Revolution Storage Processing Card
+# The right ID is 196d, but they got it nibble-swapped in 2202.
+169d Club-3D VB (Wrong ID)
+ 3306 ZAP TV 2202
+16a5 Tekram Technology Co.,Ltd.
+16ab Global Sun Technology Inc
+ 1100 GL24110P
+ 1101 PLX9052 PCMCIA-to-PCI Wireless LAN
+ 1102 PCMCIA-to-PCI Wireless Network Bridge
+ 8501 WL-8305 Wireless LAN PCI Adapter
+16ae SafeNet Inc
+ 0001 SafeXcel 1140
+ 000a SafeXcel 1841
+ 1141 SafeXcel 1141
+ 1841 SafeXcel 1842
+16af SparkLAN Communications, Inc.
+16b4 Aspex Semiconductor Ltd
+16b8 Sonnet Technologies, Inc.
+16be Creatix Polymedia GmbH
+16c6 Micrel-Kendin
+ 8695 Centaur KS8695 ARM processor
+ 8842 KSZ8842-PMQL 2-Port Ethernet Switch
+16c8 Octasic Inc.
+16c9 EONIC B.V. The Netherlands
+16ca CENATEK Inc
+ 0001 Rocket Drive DL
+16cd Densitron Technologies
+16ce Roland Corp.
+16d5 Acromag, Inc.
+ 0504 PMC-DX504 Reconfigurable FPGA with LVDS I/O
+ 0520 PMC520 Serial Communication, 232 Octal
+ 0521 PMC521 Serial Communication, 422/485 Octal
+ 1020 PMC-AX1020 Reconfigurable FPGA with A/D & D/A
+ 1065 PMC-AX1065 Reconfigurable FPGA with A/D & D/A
+ 2004 PMC-DX2004 Reconfigurable FPGA with LVDS I/O
+ 2020 PMC-AX2020 Reconfigurable FPGA with A/D & D/A
+ 2065 PMC-AX2065 Reconfigurable FPGA with A/D & D/A
+ 3020 PMC-AX3020 Reconfigurable FPGA with A/D & D/A
+ 3065 PMC-AX3065 Reconfigurable FPGA with A/D & D/A
+ 4243 PMC424, APC424, AcPC424 Digital I/O and Counter Timer Module
+ 4248 PMC464, APC464, AcPC464 Digital I/O and Counter Timer Module
+ 424b PMC-DX2002 Reconfigurable FPGA with Differential I/O
+ 4253 PMC-DX503 Reconfigurable FPGA with TTL and Differential I/O
+ 4312 PMC-CX1002 Reconfigurable Conduction-Cooled FPGA Virtex-II with Differential I/O
+ 4313 PMC-CX1003 Reconfigurable Conduction-Cooled FPGA Virtex-II with CMOS and Differential I/O
+ 4322 PMC-CX2002 Reconfigurable Conduction-Cooled FPGA Virtex-II with Differential I/O
+ 4323 PMC-CX2003 Reconfigurable Conduction-Cooled FPGA Virtex-II with CMOS and Differential I/O
+ 4350 PMC-DX501 Reconfigurable Digital I/O Module
+ 4353 PMC-DX2003 Reconfigurable FPGA with TTL and Differential I/O
+ 4357 PMC-DX502 Reconfigurable Differential I/O Module
+ 4457 PMC730, APC730, AcPC730 Multifunction Module
+ 464d PMC408 32-Channel Digital Input/Output Module
+ 4850 PMC220-16 12-Bit Analog Output Module
+ 4a42 PMC483, APC483, AcPC483 Counter Timer Module
+ 4a50 PMC484, APC484, AcPC484 Counter Timer Module
+ 4a56 PMC230 16-Bit Analog Output Module
+ 4b47 PMC330, APC330, AcPC330 Analog Input Module, 16-bit A/D
+ 4c40 PMC-LX40 Reconfigurable Virtex-4 FPGA with plug-in I/O
+ 4c60 PMC-LX60 Reconfigurable Virtex-4 FPGA with plug-in I/O
+ 4d4d PMC341, APC341, AcPC341 Analog Input Module, Simultaneous Sample & Hold
+ 4d4e PMC482, APC482, AcPC482 Counter Timer Board
+ 524d PMC-DX2001 Reconfigurable FPGA with TTL I/O
+ 5335 PMC-SX35 Reconfigurable Virtex-4 FPGA with plug-in I/O
+ 5456 PMC470 48-Channel Digital Input/Output Module
+ 5601 PMC-VLX85 Reconfigurable Virtex-5 FPGA with plug-in I/O
+ 5602 PMC-VLX110 Reconfigurable Virtex-5 FPGA with plug-in I/O
+ 5603 PMC-VSX95 Reconfigurable Virtex-5 FPGA with plug-in I/O
+ 5604 PMC-VLX155 Reconfigurable Virtex-5 FPGA with plug-in I/O
+ 5605 PMC-VFX70 Reconfigurable Virtex-5 FPGA with plug-in I/O
+ 5606 PMC-VLX155-1M Reconfigurable Virtex-5 FPGA with plug-in I/O
+ 5801 XMC-VLX85 Reconfigurable Virtex-5 FPGA with plug-in I/O
+ 5802 XMC-VLX110 Reconfigurable Virtex-5 FPGA with plug-in I/O
+ 5804 XMC-VLX155 Reconfigurable Virtex-5 FPGA with plug-in I/O
+ 5807 XMC-SLX150: Reconfigurable Spartan-6 FPGA with plug-in I/O
+ 5808 XMC-SLX150-1M: Reconfigurable Spartan-6 FPGA with plug-in I/O
+ 5901 APCe8650 PCI Express IndustryPack Carrier Card
+16da Advantech Co., Ltd.
+ 0011 INES GPIB-PCI
+16df PIKA Technologies Inc.
+16e2 Geotest-MTS
+16e3 European Space Agency
+ 1e0f LEON2FT Processor
+16e5 Intellon Corp.
+ 6000 INT6000 Ethernet-to-Powerline Bridge [HomePlug AV]
+ 6300 INT6300 Ethernet-to-Powerline Bridge [HomePlug AV]
+16ec U.S. Robotics
+ 00ed USR997900
+ 0116 USR997902 10/100/1000 Mbps PCI Network Card
+ 2f00 USR5660A (USR265660A, USR5660A-BP) 56K PCI Faxmodem
+ 3685 Wireless Access PCI Adapter Model 022415
+ 4320 USR997904 10/100/1000 64-bit NIC (Marvell Yukon)
+ ab06 USR997901A 10/100 Cardbus NIC
+16ed Sycron N. V.
+ 1001 UMIO communication card
+16f3 Jetway Information Co., Ltd.
+16f4 Vweb Corp
+ 8000 VW2010
+16f6 VideoTele.com, Inc.
+1702 Internet Machines Corporation (IMC)
+1705 Digital First, Inc.
+170b NetOctave
+ 0100 NSP2000-SSL crypto accelerator
+170c YottaYotta Inc.
+1719 EZChip Technologies
+# Seems to be a 2nd ID for Vitesse Semiconductor
+1725 Vitesse Semiconductor
+ 7174 VSC7174 PCI/PCI-X Serial ATA Host Bus Controller
+172a Accelerated Encryption
+ 13c8 AEP SureWare Runner 1000V3
+1734 Fujitsu Technology Solutions
+ 1078 Amilo Pro v2010
+ 1085 Celsius M450
+ 1098 Amilo L 1310G
+1735 Aten International Co. Ltd.
+1737 Linksys
+ 0013 WMP54G Wireless Pci Card
+ 0029 WPG54G ver. 4 PCI Card
+ 1032 Gigabit Network Adapter
+ 1737 0015 EG1032 v2 Instant Gigabit Network Adapter
+ 1737 0024 EG1032 v3 Instant Gigabit Network Adapter
+ 1064 Gigabit Network Adapter
+ 1737 0016 EG1064 v2 Instant Gigabit Network Adapter
+ ab08 21x4x DEC-Tulip compatible 10/100 Ethernet
+ ab09 21x4x DEC-Tulip compatible 10/100 Ethernet
+173b Altima (nee Broadcom)
+ 03e8 AC1000 Gigabit Ethernet
+ 03e9 AC1001 Gigabit Ethernet
+ 03ea AC9100 Gigabit Ethernet
+ 173b 0001 AC1002
+ 03eb AC1003 Gigabit Ethernet
+1743 Peppercon AG
+ 8139 ROL/F-100 Fast Ethernet Adapter with ROL
+1745 ViXS Systems, Inc.
+ 2020 XCode II Series
+ 2100 XCode 2100 Series
+1749 RLX Technologies
+174b PC Partner Limited
+174d WellX Telecom SA
+175c AudioScience Inc
+175e Sanera Systems, Inc.
+1760 TEDIA spol. s r. o.
+1771 InnoVISION Multimedia Ltd.
+# nee SBS Technologies
+1775 GE Intelligent Platforms
+177d Cavium Networks
+ 0001 Nitrox XL N1
+ 0003 Nitrox XL N1 Lite
+ 0004 Octeon (and older) FIPS
+ 0005 Octeon CN38XX Network Processor Pass 3.x
+ 0006 RoHS
+ 0010 Nitrox XL NPX
+ 0020 Octeon CN31XX Network Processor
+ 0030 Octeon CN30XX Network Processor
+ 0040 Octeon CN58XX Network Processor
+ 0050 Octeon CN57XX Network Processor (CN54XX/CN55XX/CN56XX)
+ 0070 Octeon CN50XX Network Processor
+ 0080 Octeon CN52XX Network Processor
+ 0090 Octeon II CN63XX Network Processor
+ 0091 Octeon II CN68XX Network Processor
+ 0092 Octeon II CN65XX Network Processor
+ 0093 Octeon II CN61XX Network Processor
+1787 Hightech Information System Ltd.
+1789 Ennyah Technologies Corp.
+# also used by Struck Innovative Systeme for joint developments
+1796 Research Centre Juelich
+ 0001 SIS1100 [Gigabit link]
+ 0002 HOTlink
+ 0003 Counter Timer
+ 0004 CAMAC Controller
+ 0005 PROFIBUS
+ 0006 AMCC HOTlink
+ 000d Synchronisation Slave
+ 000e SIS1100-eCMC
+ 000f TDC (GPX)
+ 0010 PCIe Counter Timer
+ 0011 SIS1100-e single link
+ 0012 SIS1100-e quad link
+1797 Techwell Inc.
+ 6801 TW6802 multimedia video card
+ 6802 TW6802 multimedia other device
+1799 Belkin
+ 6001 F5D6001 Wireless PCI Card [Realtek RTL8180]
+ 6020 F5D6020 v3000 Wireless PCMCIA Card [Realtek RTL8180]
+ 6060 F5D6060 Wireless PDA Card
+ 700f F5D7000 v7000 Wireless G Desktop Card [Realtek RTL8185]
+ 701f F5D7010 v7000 Wireless G Notebook Card [Realtek RTL8185]
+179a id Quantique
+ 0001 Quantis PCI 16Mbps
+179c Data Patterns
+ 0557 DP-PCI-557 [PCI 1553B]
+ 0566 DP-PCI-566 [Intelligent PCI 1553B]
+ 1152 DP-cPCI-1152 (8-channel Isolated ADC Module)
+ 5031 DP-CPCI-5031-Synchro Module
+# cPCI Carrier for Mezzanine Modules
+ 5112 DP-cPCI-5112 [MM-Carrier]
+ 5121 DP-CPCI-5121-IP Carrier
+ 5211 DP-CPCI-5211-IP Carrier
+ 5679 AGE Display Module
+17a0 Genesys Logic, Inc
+ 7163 GL9701 PCIe to PCI Bridge
+ 8083 GL880 USB 1.1 UHCI controller
+ 8084 GL880 USB 2.0 EHCI controller
+17aa Lenovo
+ 20b1 ThinkPad T61p
+17ab Phillips Components
+17af Hightech Information System Ltd.
+17b3 Hawking Technologies
+ ab08 PN672TX 10/100 Ethernet
+17b4 Indra Networks, Inc.
+ 0011 WebEnhance 100 GZIP Compression Card
+ 0012 WebEnhance 200 GZIP Compression Card
+ 0015 WebEnhance 300 GZIP Compression Card
+ 0016 StorCompress 300 GZIP Compression Card
+ 0017 StorSecure 300 GZIP Compression and AES Encryption Card
+17c0 Wistron Corp.
+17c2 Newisys, Inc.
+17cb Airgo Networks Inc
+ 0001 AGN100 802.11 a/b/g True MIMO Wireless Card
+ 1385 5c00 WGM511 Pre-N 802.11g Wireless CardBus Adapter
+ 0002 AGN300 802.11 a/b/g True MIMO Wireless Card
+ 1385 6d00 WPNT511 RangeMax 240 Mbps Wireless CardBus Adapter
+ 1737 0054 WPC54GX4 v1 802.11g Wireless-G Notebook Adapter with SRX400
+17cc NetChip Technology, Inc
+ 2280 USB 2.0
+17cf Z-Com, Inc.
+17d3 Areca Technology Corp.
+ 1110 ARC-1110 4-Port PCI-X to SATA RAID Controller
+ 1120 ARC-1120 8-Port PCI-X to SATA RAID Controller
+ 1130 ARC-1130 12-Port PCI-X to SATA RAID Controller
+ 1160 ARC-1160 16-Port PCI-X to SATA RAID Controller
+ 1170 ARC-1170 24-Port PCI-X to SATA RAID Controller
+ 1201 ARC-1200 2-Port PCI-Express to SATA II RAID Controller
+ 1210 ARC-1210 4-Port PCI-Express to SATA RAID Controller
+ 1220 ARC-1220 8-Port PCI-Express to SATA RAID Controller
+ 1230 ARC-1230 12-Port PCI-Express to SATA RAID Controller
+ 1260 ARC-1260 16-Port PCI-Express to SATA RAID Controller
+ 1280 ARC-1280/1280ML 24-Port PCI-Express to SATA II RAID Controller
+ 17d3 1221 ARC-1221 8-Port PCI-Express to SATA RAID Controller
+ 1300 ARC-1300ix-16 16-Port PCI-Express to SAS Non-RAID Host Adapter
+ 1680 ARC-1680 8 port PCIe/PCI-X to SAS/SATA II RAID Controller
+ 1880 ARC-1880 8/12 port PCIe/PCI-X to SAS/SATA II RAID Controller
+# nee Neterion Inc., previously S2io Inc.
+17d5 Exar Corp.
+ 5731 Xframe 10-Gigabit Ethernet PCI-X
+ 5732 Xframe II 10-Gigabit Ethernet PCI-X 2.0
+ 5831 Xframe 10-Gigabit Ethernet PCI-X
+ 103c 12d5 PCI-X 133MHz 10GbE SR Fiber
+ 10a9 8020 Single Port 10-Gigabit Ethernet (PCI-X, Fiber)
+ 10a9 8024 Single Port 10-Gigabit Ethernet (PCI-X, Fiber)
+ 5832 Xframe II 10-Gigabit Ethernet PCI-X 2.0
+ 103c 1337 PCI-X 266MHz 10GigE SR [AD385A]
+ 10a9 8021 Single Port 10-Gigabit Ethernet II (PCI-X, Fiber)
+ 17d5 6020 Xframe II SR
+ 17d5 6021 Xframe II SR, Low Profile
+ 17d5 6022 Xframe E SR
+ 17d5 6420 Xframe II LR
+ 17d5 6421 Xframe II LR, Low Profile
+ 17d5 6422 Xframe E LR
+ 17d5 6c20 Xframe II CX4
+ 17d5 6c21 Xframe II CX4, Low Profile
+ 17d5 6c22 Xframe E CX4
+ 5833 X3100 Series 10 Gigabit Ethernet PCIe
+ 17d5 6030 X3110 Single Port SR
+ 17d5 6031 X3120 Dual Port SR
+ 17d5 6430 X3110 Single Port LR
+ 17d5 6431 X3120 Dual Port LR
+ 17d5 7030 X3110 Single Port LRM
+ 17d5 7031 X3120 Dual Port LRM
+ 17d5 7430 X3110 Single Port 10GBase-T
+ 17d5 7431 X3120 Dual Port 10GBase-T
+ 17d5 7830 X3110 Single Port 10GBase-CR
+ 17d5 7831 X3120 Dual Port 10GBase-CR
+17db Cray Inc
+ 0101 XT Series [Seastar] 3D Toroidal Router
+17de KWorld Computer Co. Ltd.
+17e4 Sectra AB
+ 0001 KK671 Cardbus encryption board
+ 0002 KK672 Cardbus encryption board
+17e6 Entropic Communications Inc.
+ 0010 EN2010 [c.Link] MoCA Network Controller (Coax, PCI interface)
+ 0011 EN2010 [c.Link] MoCA Network Controller (Coax, MPEG interface)
+ 0021 EN2210 [c.Link] MoCA Network Controller (Coax)
+ 0025 EN2510 [c.Link] MoCA Network Controller (Coax, PCIe interface)
+17ee Connect Components Ltd
+17f2 Albatron Corp.
+17f3 RDC Semiconductor, Inc.
+ 1010 R1010 IDE Controller
+ 6020 R6020 North Bridge
+ 6021 R6021 Host Bridge
+ 6030 R6030 ISA Bridge
+ 6031 R6031 ISA Bridge
+ 6040 R6040 MAC Controller
+ 6060 R6060 USB 1.1 Controller
+ 6061 R6061 USB 2.0 Controller
+17f7 Topdek Semiconductor Inc.
+17f9 Gemtek Technology Co., Ltd
+17fe InProComm Inc.
+ 2120 IPN 2120 802.11b
+ 1737 0020 WMP11 v4 802.11b Wireless-B PCI Adapter
+ 2220 IPN 2220 802.11g
+ 1468 0305 T60N871 802.11g Mini PCI Wireless Adapter
+ 1737 0029 WPC54G v4 802.11g Wireless-G Notebook Adapter
+17ff Benq Corporation
+1803 ProdaSafe GmbH
+1805 Euresys S.A.
+1809 Lumanate, Inc.
+1813 Ambient Technologies Inc
+ 4000 HaM controllerless modem
+ 16be 0001 V9x HAM Data Fax Modem
+ 4100 HaM plus Data Fax Modem
+ 16be 0002 V9x HAM 1394
+1814 Ralink corp.
+ 0101 Wireless PCI Adapter RT2400 / RT2460
+ 1043 0127 WiFi-b add-on Card
+ 1371 0010 Minitar MNW2BPCI Wireless PCI Card
+ 1462 6828 PC11B2 (MS-6828) Wireless 11b PCI Card
+ 0200 RT2500 802.11g PCI [PC54G2]
+ 0201 RT2500 802.11g
+ 1043 130f WL-130g
+ 1371 001e CWC-854 Wireless-G CardBus Adapter
+ 1371 001f CWM-854 Wireless-G Mini PCI Adapter
+ 1371 0020 CWP-854 Wireless-G PCI Adapter
+ 1458 e381 GN-WMKG 802.11b/g Wireless CardBus Adapter
+ 1458 e931 GN-WIKG 802.11b/g mini-PCI Adapter
+ 1462 6833 Unknown 802.11g mini-PCI Adapter
+ 1462 6835 Wireless 11G CardBus CB54G2
+ 1737 0032 WMP54G 2.0 PCI Adapter
+ 1799 700a F5D7000 v2000/v3000 Wireless G Desktop Card
+ 1799 701a F5D7010 v2000/v3000 Wireless G Notebook Card
+ 185f 22a0 CN-WF513 Wireless Cardbus Adapter
+ 1948 3c00 C54RC v1 Wireless 11g CardBus Adapter
+ 1948 3c01 C54Ri v1 Wireless 11g PCI Adapter
+ 0300 Wireless Adapter Canyon CN-WF511
+ 0301 RT2561/RT61 802.11g PCI
+ 1186 3c08 AirPlus G DWL-G630 Wireless Cardbus Adapter (rev.E1)
+ 1186 3c09 DWL-G510 Rev C
+ 13d1 abe3 miniPCI Pluscom 802.11 a/b/g
+ 1458 e933 GN-WI01GS
+ 1458 e934 GN-WP01GS
+ 1737 0055 WMP54G ver 4.1
+ 1799 700e F5D7000 v6000 Wireless G Desktop Card
+ 1799 701e F5D7010 v6000 Wireless G Notebook Card
+ 17f9 0012 AWLC3026T 802.11g Wireless CardBus Adapter
+ 1814 2561 EW-7108PCg
+ 0302 RT2561/RT61 rev B 802.11g
+ 1186 3a71 DWA-510 Wireless G Desktop Adapter
+ 1186 3c08 AirPlus G DWL-G630 Wireless Cardbus Adapter (rev.E2)
+ 1186 3c09 AirPlus G DWL-G510 Wireless Network Adapter (Rev.C)
+ 1462 b834 PC54G3 Wireless 11g PCI Card
+ 1948 3c23 C54RC v2 Wireless 11g CardBus Adapter
+ 1948 3c24 C54Ri v2 Wireless 11g PCI Adapter
+ 0401 RT2600 802.11 MIMO
+ 1737 0052 WPC54GR v1 802.11g Wireless-G Notebook Adapter with RangeBooster
+ 17f9 0011 WPCR-137G 802.11bg Wireless CardBus Adapter
+ 17f9 0016 WPIR-119GH 802.11bg Wireless Desktop Adapter
+ 0601 RT2800 802.11n PCI
+ 1799 801c F5D8011 v3 802.11n N1 Wireless Notebook Card
+ 187e 3412 NWD-310N 802.11n Wireless PCI Adapter
+ 0681 RT2860 Wireless 802.11n PCIe
+ 0701 RT2760 Wireless 802.11n 1T/2R Cardbus
+ 0781 RT2860
+ 3060 RT3060 Wireless 802.11n 1T/1R
+ 1186 3c04 DWA-525 Wireless N 150 Desktop Adapter (rev.A1)
+ 3090 RT3090 Wireless 802.11n 1T/1R PCIe
+ 13bd 1057 GN-WS32L-RH Half-size Mini PCIe Card
+ 3091 RT3091 Wireless 802.11n 1T/2R PCIe
+ 3092 RT3092 Wireless 802.11n 2T/2R PCIe
+ e932 RT2560F 802.11 b/g PCI
+1815 Devolo AG
+1820 InfiniCon Systems Inc.
+1822 Twinhan Technology Co. Ltd
+ 4e35 Mantis DTV PCI Bridge Controller [Ver 1.0]
+182d SiteCom Europe BV
+# HFC-based ISDN card
+ 3069 ISDN PCI DC-105V2
+ 9790 WL-121 Wireless Network Adapter 100g+ [Ver.3]
+182e Raza Microelectronics, Inc.
+ 0008 XLR516 Processor
+# Strange vendor ID used by BCM5785 when in RAID mode
+182f Broadcom
+# HT1000 uses 3 IDs 1166:024a (Native SATA Mode), 1166:024b (PATA/IDE Mode), 182f:000b (RAID Mode) depends on SATA BIOS setting
+ 000b BCM5785 [HT1000] SATA (RAID Mode)
+1830 Credence Systems Corporation
+183b MikroM GmbH
+ 08a7 MVC100 DVI
+ 08a8 MVC101 SDI
+ 08a9 MVC102 DVI+Audio
+ 08b0 MVC200-DC
+1849 ASRock Incorporation
+184a Thales Computers
+ 1100 MAX II cPLD
+1851 Microtune, Inc.
+1852 Anritsu Corp.
+1853 SMSC Automotive Infotainment System Group
+1854 LG Electronics, Inc.
+185b Compro Technology, Inc.
+ 1489 VideoMate Vista T100
+185f Wistron NeWeb Corp.
+1864 SilverBack
+ 2110 ISNAP 2110
+1867 Topspin Communications
+ 5a44 MT23108 InfiniHost HCA
+ 5a45 MT23108 InfiniHost HCA flash recovery
+ 5a46 MT23108 InfiniHost HCA bridge
+ 6278 MT25208 InfiniHost III Ex (Tavor compatibility mode)
+ 6282 MT25208 InfiniHost III Ex
+186c Humusoft, s.r.o.
+ 0612 AD612 Data Acquisition Device
+ 0614 MF614 Multifunction I/O Card
+ 0622 AD622 Data Acquisition Device
+ 0624 MF624 Multifunction I/O Card
+ 0625 MF625 3-phase Motor Driver
+186f WiNRADiO Communications
+1876 L-3 Communications
+ a101 VigraWATCH PCI
+ a102 VigraWATCH PMC
+ a103 Vigra I/O
+187e ZyXEL Communication Corporation
+ 3403 ZyAir G-110 802.11g
+ 340e M-302 802.11g XtremeMIMO
+1885 Avvida Systems Inc.
+1888 Varisys Ltd
+ 0301 VMFX1 FPGA PMC module
+ 0601 VSM2 dual PMC carrier
+ 0710 VS14x series PowerPC PCI board
+ 0720 VS24x series PowerPC PCI board
+188a Ample Communications, Inc
+1890 Egenera, Inc.
+1894 KNC One
+1896 B&B Electronics Manufacturing Company, Inc.
+ 4202 MIport 3PCIU2 2-port Serial
+ 4204 MIport 3PCIU4 4-port Serial
+ 4208 MIport 3PCIU8 8-port Serial
+ 4211 MIport 3PCIOU1 1-port Isolated Serial
+ 4212 MIport 3PCIOU2 2-port Isolated Serial
+ 4214 MIport 3PCIOU4 4-port Isolated Serial
+ bb10 3PCI2 2-Port Serial
+ bb11 3PCIO1 1-Port Isolated Serial
+1897 AMtek
+18a1 Astute Networks Inc.
+18a2 Stretch Inc.
+ 0002 VRC6016 16-Channel PCIe DVR Card
+18a3 AT&T
+18ac DViCO Corporation
+ d500 FusionHDTV 5
+ d800 FusionHDTV 3 Gold
+ d810 FusionHDTV 3 Gold-Q
+ d820 FusionHDTV 3 Gold-T
+ db30 FusionHDTV DVB-T Pro
+ db40 FusionHDTV DVB-T Hybrid
+ db78 FusionHDTV DVB-T Dual Express
+18b8 Ammasso
+ b001 AMSO 1100 iWARP/RDMA Gigabit Ethernet Coprocessor
+18bc Info-Tek Corp.
+18c3 Micronas Semiconductor Holding AG
+# Nee Octigabay System
+18c8 Cray Inc
+18c9 ARVOO Engineering BV
+18ca XGI Technology Inc. (eXtreme Graphics Innovation)
+ 0020 Z7/Z9 (XG20 core)
+ 0021 Z9s/Z9m (XG21 core)
+# duh! Device name, not my name :)
+ 0027 Z11/Z11M
+ 0040 Volari V3XT/V5/V8
+ 0047 Volari 8300 (chip: XP10, codename: XG47)
+18d2 Sitecom
+# Sitecom HFC-S based ISDN controller card DC-105v2
+ 3069 DC-105v2 ISDN controller
+18d8 Dialogue Technology Corp.
+18dd Artimi Inc
+ 4c6f Artimi RTMI-100 UWB adapter
+18e6 MPL AG
+ 0001 OSCI [Octal Serial Communication Interface]
+18eb Advance Multimedia Internet Technology, Inc.
+18ec Cesnet, z.s.p.o.
+ 6d05 ML555
+ 18ec 0100 NIC (ethernet interfaces)
+ 18ec 0200 NIC (szedata2) 4x1G
+ 18ec 0201 NIC (szedata2) 2x10G
+ 18ec 0300 NIFIC (szedata2) 4x1G
+ 18ec 0302 NIFIC (szedata2) 2x10G
+ 18ec 4200 Flexible FlowMon (szedata2) 1x10G
+ 18ec ff00 Testing design
+ 18ec ff01 Boot design
+ c006 COMBO6
+ 18ec d001 COMBO-4MTX
+ 18ec d002 COMBO-4SFP
+ 18ec d003 COMBO-4SFPRO
+ 18ec d004 COMBO-2XFP
+ c032 COMBO-LXT110
+ 18ec 0100 NIC (ethernet interfaces)
+ 18ec 0200 NIC (szedata2) 4x1G
+ 18ec 0201 NIC (szedata2) 2x10G
+ 18ec 0300 NIFIC (szedata2) 4x1G
+ 18ec 0302 NIFIC (szedata2) 2x10G
+ 18ec 4200 Flexible FlowMon (szedata2) 1x10G
+ 18ec ff00 Testing design
+ 18ec ff01 Boot design
+ c045 COMBO6E
+ c050 COMBO-PTM
+ c058 COMBO6X
+ 18ec d001 COMBO-4MTX
+ 18ec d002 COMBO-4SFP
+ 18ec d003 COMBO-4SFPRO
+ 18ec d004 COMBO-2XFP
+ c132 COMBO-LXT155
+ 18ec 0100 NIC (ethernet interfaces)
+ 18ec 0200 NIC (szedata2) 4x1G
+ 18ec 0201 NIC (szedata2) 2x10G
+ 18ec 0300 NIFIC (szedata2) 4x1G
+ 18ec 0302 NIFIC (szedata2) 2x10G
+ 18ec 4200 Flexible FlowMon (szedata2) 1x10G
+ 18ec ff00 Testing design
+ 18ec ff01 Boot design
+ c232 COMBO-FXT100
+ 18ec 0100 NIC (ethernet interfaces)
+ 18ec 0200 NIC (szedata2) 4x1G
+ 18ec 0201 NIC (szedata2) 2x10G
+ 18ec 0300 NIFIC (szedata2) 4x1G
+ 18ec 0302 NIFIC (szedata2) 2x10G
+ 18ec 4200 Flexible FlowMon (szedata2) 1x10G
+ 18ec ff00 Testing design
+ 18ec ff01 Boot design
+18ee Chenming Mold Ind. Corp.
+18f1 Spectrum GmbH
+18f4 Napatech A/S
+ 0051 NT20-X Capture Card
+ 0061 NT20E Capture Card
+ 0064 NT20E Inline Card
+ 0071 NT4E Capture Card
+ 0074 NT4E Inline Card
+ 0081 NT4E 4-port Expansion Card
+ 0091 NT20X Capture Card [New Rev]
+ 00a1 NT4E-STD Capture Card
+ 00a4 NT4E-STD Inline Card
+18f6 NextIO
+ 1000 [Nexsis] Switch Virtual P2P PCIe Bridge
+ 1050 [Nexsis] Switch Virtual P2P PCI Bridge
+ 2000 [Nexsis] Switch Integrated Mgmt. Endpoint
+18f7 Commtech, Inc.
+ 0001 Fastcom ESCC-PCI-335
+ 0002 Fastcom 422/4-PCI-335
+ 0003 Fastcom 232/4-1M-PCI
+ 0004 Fastcom 422/2-PCI-335
+ 0005 Fastcom IGESCC-PCI-ISO/1
+ 000a Fastcom 232/4-PCI-335
+ 000b Fastcom 232/8-PCI-335 Async 8-Port RS-232 Serial PCI Adapter
+ 000f Fastcom FSCC
+ 0010 Fastcom GSCC
+# Dual Serocco
+ 0011 Fastcom QSSB
+ 0014 SuperFSCC
+ 0015 SuperFSCC-104
+ 0016 Fastcom FSCC-232 Sync/Async 2-Port RS-232 Serial PCI Adapter (F-Core)
+ 0017 SuperFSCC-104-NOUART
+ 0018 Fastcom SuperFSCC/4 Sync/Async 4-Port RS-422 Serial PCI Adapter with DMA (F-Core)
+ 0019 SuperFSCC with soft UARTs
+ 001a Fastcom SuperFSCC-104-LVDS Sync/Async 2-Port RS-644 Serial PC/104+ Adapter with DMA (F-Core)
+ 001b Fastcom FSCC/4 Sync/Async 4-Port RS-422 Serial PCI Adapter (F-Core)
+ 001c Fastcom SuperFSCC/4-LVDSSync/Async 4-Port RS-644 Serial PCI Adapter with DMA (F-Core)
+18fb Resilience Corporation
+1904 Hangzhou Silan Microelectronics Co., Ltd.
+ 2031 SC92031 PCI Fast Ethernet Adapter
+ 8139 RTL8139D [Realtek] PCI 10/100BaseTX ethernet adaptor
+1905 Micronas USA, Inc.
+1912 Renesas Technology Corp.
+ 0002 SH7780 PCI Controller (PCIC)
+ 0011 SH7757 PCIe End-Point [PBI]
+ 0012 SH7757 PCIe-PCI Bridge [PPB]
+ 0013 SH7757 PCIe Switch [PS]
+1919 Soltek Computer Inc.
+1923 Sangoma Technologies Corp.
+ 0040 A200/Remora FXO/FXS Analog AFT card
+ 0100 A104d QUAD T1/E1 AFT card
+ 0300 A101 single-port T1/E1
+ 0400 A104u Quad T1/E1 AFT
+1924 Solarflare Communications
+ 0703 SFC4000 rev A net [Solarstorm]
+ 10b8 0102 SMC10GPCIe-10BT (A2) [TigerCard]
+ 10b8 0103 SMC10GPCIe-10BT (A3) [TigerCard]
+ 10b8 0201 SMC10GPCIe-XFP (A1) [TigerCard]
+ 1924 0101 SFE4001-A1
+ 1924 0102 SFE4001-A2
+ 1924 0103 SFE4001-A3
+ 1924 0201 SFE4002-A1
+ 1924 0301 SFE4003-A1
+ 1924 0302 SFE4003-A2
+ 1924 0303 SFE4003-A3
+ 1924 0304 SFE4003-A4
+ 1924 0500 SFE4005-A0
+ 0710 SFC4000 rev B [Solarstorm]
+ 10b8 0103 SMC10GPCIe-10BT (A3) [TigerCard]
+ 10b8 0201 SMC10GPCIe-XFP (A1) [TigerCard]
+ 1924 0102 SFE4001-A2
+ 1924 0103 SFE4001-A3
+ 1924 0201 SFE4002-A1
+ 1924 0302 SFE4003-A2
+ 1924 0303 SFE4003-A3
+ 1924 0304 SFE4003-A4
+ 1924 0500 SFE4005-A0
+ 1924 5102 SFN4111T-A2
+ 1924 5103 SFN4111T-R3
+ 1924 5104 SFN4111T-R4
+ 1924 5105 SFN4111T-R5
+ 1924 5201 SFN4112F-R1
+ 1924 5202 SFN4112F-R2
+ 0803 SFC9020 [Solarstorm]
+ 1924 6200 SFN5122F-R0
+ 1924 6201 SFN5122F-R1
+ 1924 6202 SFN5122F-R2
+ 1924 6204 SFN5122F-R4
+ 1924 6205 SFN5122F-R5
+ 1924 6206 SFN5122F-R6
+ 1924 6210 SFN5322F-R0
+ 1924 6211 SFN5322F-R1
+ 1924 6a05 SFN5112F-R5
+ 1924 6a06 SFN5112F-R6
+ 1924 7206 SFN5162F-R6
+ 1924 7a06 SFN5152F-R6
+ 0813 SFL9021 [Solarstorm]
+ 1924 6100 SFN5121T-R0
+ 1924 6102 SFN5121T-R2
+ 1924 6103 SFN5121T-R3
+ 1924 6104 SFN5121T-R4
+ 1924 6902 SFN5111T-R2
+ 1924 6904 SFN5111T-R4
+ 1924 7104 SFN5161T-R4
+ 1924 7904 SFN5151T-R4
+ 1803 SFC9020 Virtual Function [Solarstorm]
+ 1813 SFL9021 Virtual Function [Solarstorm]
+ 6703 SFC4000 rev A iSCSI/Onload [Solarstorm]
+ 10b8 0102 SMC10GPCIe-10BT (A2) [TigerCard]
+ 10b8 0103 SMC10GPCIe-10BT (A3) [TigerCard]
+ 10b8 0201 SMC10GPCIe-XFP (A1) [TigerCard]
+ 1924 0101 SFE4001-A1
+ 1924 0102 SFE4001-A2
+ 1924 0103 SFE4001-A3
+ 1924 0201 SFE4002-A1
+ 1924 0301 SFE4003-A1
+ 1924 0302 SFE4003-A2
+ 1924 0303 SFE4003-A3
+ 1924 0304 SFE4003-A4
+ 1924 0500 SFE4005-A0
+ c101 EF1-21022T [EtherFabric]
+192e TransDimension
+1931 Option N.V.
+ 000c Qualcomm MSM6275 UMTS chip
+1932 DiBcom
+193c MAXIM Integrated Products
+193f Comtech AHA Corp.
+ 0001 AHA36x-PCIX
+ 0360 AHA360-PCIe
+ 0363 AHA363-PCIe
+ 0364 AHA364-PCIe
+ 0367 AHA367-PCIe
+1942 ClearSpeed Technology plc
+ e511 Advance X620 accelerator card
+ e521 Advance e620 accelerator card
+1947 C-guys, Inc.
+ 4743 CG200 Dual SD/SDIO Host controller device
+1948 Alpha Networks Inc.
+194a DapTechnology B.V.
+ 1111 FireSpy3850
+ 1112 FireSpy450b
+ 1113 FireSpy450bT
+ 1114 FireSpy850
+ 1115 FireSpy850bT
+ 1200 FireTrac 3460bT
+ 1201 FireTrac 3460bT (fallback firmware)
+ 1202 FireTrac 3460bT
+ 1203 FireTrac 3460bT (fallback firmware)
+1954 Curtis, Inc.
+1957 Freescale Semiconductor Inc
+ 0012 MPC8548E
+ 0013 MPC8548
+ 0014 MPC8543E
+ 0015 MPC8543
+ 0018 MPC8547E
+ 0019 MPC8545E
+ 001a MPC8545
+ 0020 MPC8568E
+ 0021 MPC8568
+ 0022 MPC8567E
+ 0023 MPC8567
+ 0030 MPC8533E
+ 0031 MPC8533
+ 0032 MPC8544E
+ 0033 MPC8544
+ 0040 MPC8572E
+ 0041 MPC8572
+ 0050 MPC8536E
+ 0051 MPC8536
+ 0052 MPC8535E
+ 0053 MPC8535
+ 0060 MPC8569
+ 0061 MPC8569E
+ 0070 P2020E
+ 0071 P2020
+ 0078 P2010E
+ 0079 P2010
+ 0080 MPC8349E
+ 0081 MPC8349
+ 0082 MPC8347E TBGA
+ 0083 MPC8347 TBGA
+ 0084 MPC8347E PBGA
+ 0085 MPC8347 PBGA
+ 0086 MPC8343E
+ 0087 MPC8343
+ 00b4 MPC8315E
+ 0100 P1020E
+ 0101 P1020
+ 0102 P1021E
+ 0103 P1021
+ 0108 P1011E
+ 0109 P1011
+ 010a P1012E
+ 010b P1012
+ 0110 P1022E
+ 0111 P1022
+ 0118 P1013E
+ 0119 P1013
+ 0400 P4080E
+ 0401 P4080
+ 0408 P4040E
+ 0409 P4040
+ 7010 MPC8641 PCI Host Bridge
+ 7011 MPC8641D PCI Host Bridge
+ 7018 MPC8610
+1958 Faster Technology, LLC.
+1959 PA Semi, Inc
+ a000 PA6T Core
+ a001 PWRficient Host Bridge
+ a002 PWRficient PCI-Express Port
+ a003 PWRficient SMBus Controller
+ a004 PWRficient 16550 UART
+ a005 PWRficient Gigabit Ethernet
+ a006 PWRficient 10-Gigabit Ethernet
+ a007 PWRficient DMA Controller
+ a008 PWRficient LPC/Localbus Interface
+ a009 PWRficient L2 Cache
+ a00a PWRficient DDR2 Memory Controller
+ a00b PWRficient SERDES
+ a00c PWRficient System/Debug Controller
+ a00d PWRficient PCI-Express Internal Endpoint
+1966 Orad Hi-Tec Systems
+ 1975 DVG64 family
+ 1977 DVG128 family
+# nee Attansic Technology Corp.
+1969 Atheros Communications
+ 1026 AR8121/AR8113/AR8114 Gigabit or Fast Ethernet
+ 1043 8304 P5KPL-CM Motherboard
+ 1048 L1 Gigabit Ethernet
+ 1043 8226 P5KPL-VM Motherboard
+ 1062 AR8132 Fast Ethernet
+ 1063 AR8131 Gigabit Ethernet
+ 1458 e000 GA-G31M-ES2L Motherboard
+ 1066 L2c Gigabit Ethernet
+ 1067 L1c Gigabit Ethernet
+ 1073 AR8151 v1.0 Gigabit Ethernet
+ 1083 AR8151 v2.0 Gigabit Ethernet
+ 2048 L2 Fast Ethernet
+ 2060 AR8152 v1.1 Fast Ethernet
+ 2062 AR8152 v2.0 Fast Ethernet
+196a Sensory Networks Inc.
+ 0101 NodalCore C-1000 Content Classification Accelerator
+ 0102 NodalCore C-2000 Content Classification Accelerator
+ 0105 NodalCore C-3000 Content Classification Accelerator
+196d Club-3D BV
+1971 AGEIA Technologies, Inc.
+ 1011 Physics Processing Unit [PhysX]
+ 1043 0001 PhysX P1
+1974 TransferZentrum Mikroelektronik
+1976 TRENDnet
+1977 Parsec
+197b JMicron Technology Corp.
+ 0250 JMC250 PCI Express Gigabit Ethernet Controller
+ 0260 JMC260 PCI Express Fast Ethernet Controller
+ 0368 JMB368 IDE controller
+ 2360 JMB360 AHCI Controller
+ 2361 JMB361 AHCI/IDE
+ 1462 7235 P965 Neo MS-7235 mainboard
+ 2362 JMB362 AHCI Controller
+ 1043 8460 P8P67 Deluxe Motherboard
+ 2363 JMB362/JMB363 Serial ATA Controller
+ 1043 81e4 P5B [JMB363]
+ 1458 b000 GA-EP45-DS5 Motherboard
+ 1849 2363 Motherboard (one of many)
+ 2364 JMB364 AHCI Controller
+ 2365 JMB365 AHCI/IDE
+ 2366 JMB366 AHCI/IDE
+ 2368 JMB368 IDE controller
+ 2369 JMB369 Serial ATA Controller
+ 2380 IEEE 1394 Host Controller
+ 2381 Standard SD Host Controller
+ 2382 SD/MMC Host Controller
+ 2383 MS Host Controller
+ 2384 xD Host Controller
+ 2386 Standard SD Host Controller
+ 2387 SD/MMC Host Controller
+ 2388 MS Host Controller
+ 2389 xD Host Controller
+ 2391 Standard SD Host Controller
+ 2392 SD/MMC Host Controller
+ 2393 MS Host Controller
+ 2394 xD Host Controller
+1982 Distant Early Warning Communications Inc
+ 1600 OX16C954 HOST-A
+ 16ff OX16C954 HOST-B
+1989 Montilio Inc.
+ 0001 RapidFile Bridge
+ 8001 RapidFile
+198a Nallatech Ltd.
+1993 Innominate Security Technologies AG
+199a Pulse-LINK, Inc.
+199d Xsigo Systems
+ 8209 Virtual NIC Device
+ 890a Virtual HBA Device
+199f Auvitek
+ 8501 AU85X1 PCI REV1.1
+# nee ServerEngines Corp.
+19a2 Emulex Corporation
+ 0200 BladeEngine 10Gb PCI-E iSCSI adapter
+ 0201 BladeEngine 10Gb PCIe Network Adapter
+ 0211 BladeEngine2 10Gb Gen2 PCIe Network Adapter
+ 0212 BladeEngine2 10Gb Gen2 PCIe iSCSI Adapter
+ 0221 BladeEngine3 10Gb Gen2 PCIe Network Adapter
+ 0222 BladeEngine3 10Gb Gen2 PCIe iSCSI Adapter
+ 0700 OneConnect 10Gb NIC
+ 103c 1747 NC550SFP DualPort 10GbE Server Adapter
+ 103c 1749 NC550SFP Dual Port Server Adapter
+ 103c 174a NC551m Dual Port FlexFabric 10Gb Adapter
+ 103c 174b StorageWorks NC550 DualPort Converged Network Adapter
+ 103c 3314 NC551i Dual Port FlexFabric 10Gb Adapter
+ 0702 OneConnect 10Gb iSCSI Initiator
+ 0704 OneConnect 10Gb FCoE Initiator
+ 0710 OneConnect 10Gb NIC (be3)
+ 103c 3315 NC553i 10Gb 2-port FlexFabric Converged Network Adapter
+ 103c 3340 NC552SFP 2-port 10Gb Server Adapter
+ 103c 3341 NC552m 10Gb 2-port FlexFabric Converged Network Adapter
+ 103c 3345 NC553m 10Gb 2-port FlexFabric Converged Network Adapter
+ 0712 OneConnect 10Gb iSCSI Initiator (be3)
+ 0714 OneConnect 10Gb FCoE Initiator (be3)
+ 103c 3315 NC553i 10Gb 2-port FlexFabric Converged Network Adapter
+19a8 DAQDATA GmbH
+19ac Kasten Chase Applied Research
+ 0001 ACA2400 Crypto Accelerator
+19ae Progeny Systems Corporation
+ 0520 4135 HFT Interface Controller
+ 0521 Decimator
+19c1 Exegy Inc.
+# nee NextNet Wireless
+19d1 Motorola Expedience
+19d4 Quixant Limited
+19da ZOTAC International (MCO) Ltd.
+19de Pico Computing
+19e2 Vector Informatik GmbH
+19e3 DDRdrive LLC
+ 5801 DDRdrive X1
+ 5808 DDRdrive X8
+ dd52 DDRdrive X1-30
+19e7 NET (Network Equipment Technologies)
+ 1001 STIX DSP Card
+ 1002 STIX - 1 Port T1/E1 Card
+ 1003 STIX - 2 Port T1/E1 Card
+ 1004 STIX - 4 Port T1/E1 Card
+ 1005 STIX - 4 Port FXS Card
+19ee Netronome Systems, Inc.
+19f1 BFG Tech
+19ff Eclipse Electronic Systems, Inc.
+1a03 ASPEED Technology, Inc.
+ 1150 AST1150 PCI-to-PCI Bridge
+ 2000 ASPEED Graphics Family
+1a07 Kvaser AB
+ 0006 CAN interface PC104+ HS/HS
+ 0007 CAN interface PCIcanx II HS or HS/HS
+ 0008 CAN interface PCIEcan HS or HS/HS
+ 0009 CAN interface PCI104 HS/HS
+1a08 Sierra semiconductor
+ 0000 SC15064
+1a0e DekTec Digital Video B.V.
+1a17 Force10 Networks, Inc.
+ 8002 PB-10GE-2P 10GbE Security Card
+1a1d GFaI e.V.
+ 1a17 Meta Networks MTP-1G IDPS NIC
+1a1e 3Leaf Systems, Inc.
+1a22 Ambric Inc.
+1a29 Fortinet, Inc.
+1a2b Ascom AG
+ 0000 GESP v1.2
+ 0001 GESP v1.3
+ 0002 ECOMP v1.3
+ 0005 ETP v1.4
+ 000a ETP-104 v1.1
+ 000e DSLP-104 v1.1
+1a3b AzureWave
+ 1112 AR9285 Wireless Network Adapter (PCI-Express)
+1a51 Hectronic AB
+1a56 Bigfoot Networks, Inc.
+1a57 Highly Reliable Systems
+1a58 Razer USA Ltd.
+1a5d Celoxica
+1a5e Aprius Inc.
+1a5f System TALKS Inc.
+1a68 VirtenSys Limited
+1a71 XenSource, Inc.
+1a73 Violin Memory, Inc
+ 0001 Mozart [Memory Appliance 1010]
+1a76 Wavesat
+1a77 Lightfleet Corporation
+1a78 Virident Systems Inc.
+ 0031 Virident tachIOn Drive
+ 1a78 0034 tachIOn PCIe SSD [rev 3]
+ 1a78 0037 tachIOn PCIe SSD [rev 3D]
+ 1a78 0038 tachIOn PCIe SSD [rev 4]
+ 1a78 0039 tachIOn PCIe SSD [rev 4D]
+1a84 Commex Technologies
+ 0001 Vulcan SP HT6210 10-Gigabit Ethernet (rev 02)
+1a88 MEN Mikro Elektronik
+ 4d45 Multifunction IP core
+1a8c Verigy Pte. Ltd.
+ 1100 E8001-66443 PCI Express CIC
+1a8e DRS Technologies
+ 2090 Model 2090 PCI Express
+1aa8 Ciprico, Inc.
+ 0009 RAIDCore Controller
+ 000a RAIDCore Controller
+1aae Global Velocity, Inc.
+1ab6 CalDigit, Inc.
+ 6201 RAID Card
+1ab9 Espia Srl
+1ad7 Spectracom Corporation
+ 8000 TSync-PCIe Time Code Processor
+ 9100 TPRO-PCI-66U Timecode Reader/Generator
+1ade Spin Master Ltd.
+ 1501 Swipetech barcode scanner
+1ae0 Google, Inc.
+1ae8 Silicon Software GmbH
+ 0a40 microEnable IV-BASE x1
+ 0a41 microEnable IV-FULL x1
+ 0a44 microEnable IV-FULL x4
+ 0e44 microEnable IV-GigE x4
+1aec Wolfson Microelectronics
+1aed Fusion-io
+ 1003 ioDimm3 (v1.2)
+ 1005 ioDimm3
+ 1006 ioXtreme
+ 1007 ioXtreme Pro
+ 1008 ioXtreme-2
+1aee Caustic Graphics Inc.
+# nee Qumranet, Inc.
+1af4 Red Hat, Inc
+ 1000 Virtio network device
+ 1001 Virtio block device
+ 1002 Virtio memory balloon
+ 1003 Virtio console
+1af5 Netezza Corp.
+1afa J & W Electronics Co., Ltd.
+1b03 Magnum Semiconductor, Inc,
+ 6100 DXT/DXTPro Multiformat Broadcast HD/SD Encoder/Decoder/Transcoder
+1b13 Jaton Corp
+1b1a K&F Computing Research Co.
+ 0e70 GRAPE
+1b21 ASMedia Technology Inc.
+ 1042 ASM1042 SuperSpeed USB Host Controller
+1b36 Red Hat, Inc.
+1b3a Westar Display Technologies
+ 7589 HRED J2000 - JPEG 2000 Video Codec Device
+1b3e Teradata Corp.
+ 1fa8 BYNET BIC2SE/X
+ 1b3e 00a3 BYNET BIC2SX
+ 1b3e 00c3 BYNET BIC2SE
+1b40 Schooner Information Technology, Inc.
+# Early Proxim devices use 1b47 rather than 14b7.
+1b47 PROXIM Inc (Wrong ID)
+1b4b Marvell Technology Group Ltd.
+ 9123 88SE9123 PCIe SATA 6.0 Gb/s controller
+ 9125 88SE9125 PCIe SATA 6.0 Gb/s controller
+ 9128 88SE9128 PCIe SATA 6 Gb/s RAID controller
+ 9130 88SE9128 PCIe SATA 6 Gb/s RAID controller with HyperDuo
+ 1043 8438 P8P67 Deluxe Motherboard
+ 91a0 88SE91A0 SATA 6Gb/s Controller
+ 91a4 88SE91A4 SATA 6Gb/s Controller
+1b55 NetUP Inc.
+ 2a2c Dual DVB-S2-CI card
+ e2e4 Dual DVB-T/C-CI RF card
+1b73 Fresco Logic
+ 1000 FL1000G USB 3.0 Host Controller
+1bad ReFLEX CES
+1bb3 Bluecherry
+ 4304 BC-04120A MPEG4 4 port video encoder / decoder
+ 4309 BC-08240A MPEG4 4 port video encoder / decoder
+ 4310 BC-16480A MPEG4 16 port video encoder / decoder
+ 4e04 BC-04120A 4 port MPEG4 video encoder / decoder
+ 4e09 BC-08240A 8 port MPEG4 video encoder / decoder
+ 4e10 BC-16480A 16 port MPEG4 video encoder / decoder
+ 5304 BC-H04120A 4 port H.264 video and audio encoder / decoder
+ 5308 BC-H08240A 8 port H.264 video and audio encoder / decoder
+ 5310 BC-H16480A 16 port H.264 video and audio encoder / decoder
+1bb5 Quantenna Communications, Inc.
+1bf4 VTI Instruments Corporation
+1c1c Symphony
+ 0001 82C101
+1d44 DPT
+ a400 PM2x24/PM3224
+1de1 Tekram Technology Co.,Ltd.
+ 0391 TRM-S1040
+ 2020 DC-390
+ 690c 690c
+ dc29 DC290
+# nee Tumsan Oy
+1fc0 Ascom (Finland) Oy
+ 0300 E2200 Dual E1/Rawpipe Card
+ 0301 C5400 SHDSL/E1 Card
+# nee PathScale, Inc
+1fc1 QLogic, Corp.
+ 000d IBA6110 InfiniBand HCA
+ 0010 IBA6120 InfiniBand HCA
+1fc9 Tehuti Networks Ltd.
+ 3009 10-Giga TOE SmartNIC
+ 3010 10-Giga TOE SmartNIC
+ 0000 3002 10-Giga TOE Single Port XFP SmartNIC
+ 0000 3004 10-Giga TOE Single Port SFP+ SmartNIC
+ 0000 3008 10-Giga TOE Single Port CX4 SmartNIC
+ 3014 10-Giga TOE SmartNIC 2-Port
+ 0000 3003 10-Giga TOE Dual Port XFP Low Profile SmartNIC
+ 0000 3005 10-Giga TOE Dual Port SFP+ Low Profile SmartNIC
+ 0000 3014 10-Giga TOE Dual Port CX4 Low Profile SmartNIC
+ 3110 10-Giga TOE Single Port SmartNIC
+ 0000 3004 10-Giga TOE Single Port SFP+ SmartNIC
+ 3114 10-Giga TOE Dual Port Low Profile SmartNIC
+ 0000 3005 10-Giga TOE Dual Port SFP+ Low Profile SmartNIC
+ 0000 3011 10-Giga TOE Dual Port SFP+/CX4 Low Profile SmartNIC
+ 0000 3012 10-Giga TOE Dual Port CX4/SFP+ Low Profile SmartNIC
+ 0000 3014 10-Giga TOE Dual Port CX4 Low Profile SmartNIC
+ 3310 10-Giga TOE SFP+ Single Port SmartNIC
+ 0000 3004 10-Giga TOE Single Port SFP+ SmartNIC
+ 3314 10-Giga TOE Dual Port Low Profile SmartNIC
+ 0000 3005 10-Giga TOE Dual Port SFP+ Low Profile SmartNIC
+ 0000 3011 10-Giga TOE Dual Port SFP+/CX4 Low Profile SmartNIC
+ 0000 3012 10-Giga TOE Dual Port CX4/SFP+ Low Profile SmartNIC
+ 0000 3014 10-Giga TOE Dual Port CX4 Low Profile SmartNIC
+1fce Cognio Inc.
+ 0001 Spectrum Analyzer PC Card (SAgE)
+1fd4 SUNIX Co., Ltd.
+ 0001 Matrix multiport serial adapter
+2000 Smart Link Ltd.
+ 2800 SmartPCI2800 V.92 PCI Soft DFT
+2001 Temporal Research Ltd
+2003 Smart Link Ltd.
+ 8800 LM-I56N
+2004 Smart Link Ltd.
+2116 ZyDAS Technology Corp.
+21c3 21st Century Computer Corp.
+# (Probably only the Mobile Phone Division)
+22b8 Motorola, Inc.
+2304 Colorgraphic Communications Corp.
+2348 Racore
+ 2010 8142 100VG/AnyLAN
+2646 Kingston Technologies
+270b Xantel Corporation
+270f Chaintech Computer Co. Ltd
+2711 AVID Technology Inc.
+29b4 82q35 Express MEI Controller
+2a15 3D Vision(???)
+3000 Hansol Electronics Inc.
+3142 Post Impression Systems.
+3388 Hint Corp
+ 0013 HiNT HC4 PCI to ISDN bridge, Multimedia audio controller
+ 0014 HiNT HC4 PCI to ISDN bridge, Network controller
+ 0020 HB6 Universal PCI-PCI bridge (transparent mode)
+ 0021 HB6 Universal PCI-PCI bridge (non-transparent mode)
+ 1775 c200 C2K CompactPCI interface bridge
+ 1775 ce90 CE9
+ 4c53 1050 CT7 mainboard
+ 4c53 1080 CT8 mainboard
+ 4c53 1090 Cx9 mainboard
+ 4c53 10a0 CA3/CR3 mainboard
+ 4c53 3010 PPCI mezzanine (32-bit PMC)
+ 4c53 3011 PPCI mezzanine (64-bit PMC)
+ 4c53 4000 PMCCARR1 carrier board
+ 0022 HiNT HB4 PCI-PCI Bridge (PCI6150)
+ 0026 HB2 PCI-PCI Bridge
+ 1018 Audiotrak INCA88
+ 1019 Miditrak 2120
+ 101a E.Band [AudioTrak Inca88]
+ 101b E.Band [AudioTrak Inca88]
+ 8011 VXPro II Chipset
+ 3388 8011 VXPro II Chipset CPU to PCI Bridge
+ 8012 VXPro II Chipset
+ 3388 8012 VXPro II Chipset PCI to ISA Bridge
+ 8013 VXPro II IDE
+ 3388 8013 VXPro II Chipset EIDE Controller
+ a103 Blackmagic Design DeckLink HD Pro
+3411 Quantum Designs (H.K.) Inc
+3442 Bihl+Wiedemann GmbH
+ 1783 AS-i 3.0 cPCI Master
+ 1922 AS-i 3.0 PCI Master
+3475 Arastra Inc.
+3513 ARCOM Control Systems Ltd
+3842 eVga.com. Corp.
+38ef 4Links
+3d3d 3DLabs
+ 0001 GLINT 300SX
+ 0002 GLINT 500TX
+ 0000 0000 GLoria L
+ 0003 GLINT Delta
+ 0000 0000 GLoria XL
+ 0004 Permedia
+ 0005 Permedia
+ 0006 GLINT MX
+ 0000 0000 GLoria XL
+ 1048 0a42 GLoria XXL
+ 0007 3D Extreme
+ 0008 GLINT Gamma G1
+ 1048 0a42 GLoria XXL
+ 0009 Permedia II 2D+3D
+ 1040 0011 AccelStar II
+ 1048 0a42 GLoria XXL
+ 13e9 1000 6221L-4U
+ 3d3d 0100 AccelStar II 3D Accelerator
+ 3d3d 0111 Permedia 3:16
+ 3d3d 0114 Santa Ana
+ 3d3d 0116 Oxygen GVX1
+ 3d3d 0119 Scirocco
+ 3d3d 0120 Santa Ana PCL
+ 3d3d 0125 Oxygen VX1
+ 3d3d 0127 Permedia3 Create!
+ 000a GLINT R3
+ 3d3d 0121 Oxygen VX1
+ 000c GLINT R3 [Oxygen VX1]
+ 3d3d 0144 Oxygen VX1-4X AGP [Permedia 4]
+ 000d GLint R4 rev A
+ 000e GLINT Gamma G2
+ 0011 GLint R4 rev B
+ 0012 GLint R5 rev A
+ 0013 GLint R5 rev B
+ 0020 VP10 visual processor
+ 0022 VP10 visual processor
+ 0024 VP9 visual processor
+ 002c Wildcat Realizm 100/200
+ 0030 Wildcat Realizm 800
+ 0032 Wildcat Realizm 500
+ 0100 Permedia II 2D+3D
+ 07a1 Wildcat III 6210
+ 07a2 Sun XVR-500 Graphics Accelerator
+ 07a3 Wildcat IV 7210
+ 1004 Permedia
+ 3d04 Permedia
+ ffff Glint VGA
+4005 Avance Logic Inc.
+ 0300 ALS300 PCI Audio Device
+ 0308 ALS300+ PCI Audio Device
+ 0309 PCI Input Controller
+ 1064 ALG-2064
+ 2064 ALG-2064i
+ 2128 ALG-2364A GUI Accelerator
+ 2301 ALG-2301
+ 2302 ALG-2302
+ 2303 AVG-2302 GUI Accelerator
+ 2364 ALG-2364A
+ 2464 ALG-2464
+ 2501 ALG-2564A/25128A
+ 4000 ALS4000 Audio Chipset
+ 4005 4000 ALS4000 Audio Chipset
+ 4710 ALC200/200P
+4033 Addtron Technology Co, Inc.
+ 1360 RTL8139 Ethernet
+4040 NetXen Incorporated
+ 0001 NXB-10GXSR 10-Gigabit Ethernet PCIe Adapter with SR-XFP optical interface
+ 103c 7047 NC510F PCIe 10-Gigabit Server Adapter
+ 0002 NXB-10GCX4 10-Gigabit Ethernet PCIe Adapter with CX4 copper interface
+ 103c 7048 NC510c PCIe 10-Gigabit Server Adapter
+ 0003 NXB-4GCU Quad Gigabit Ethernet PCIe Adapter with 1000-BASE-T interface
+ 0004 BladeCenter-H 10-Gigabit Ethernet High Speed Daughter Card
+ 0005 NetXen Dual Port 10GbE Multifunction Adapter for c-Class
+ 103c 170e NC512m Dual Port 10GbE Multifunction BL-C Adapter
+ 0024 XG Mgmt
+ 0025 XG Mgmt
+ 0100 NX3031 Multifunction 1/10-Gigabit Server Adapter
+ 103c 171b NC522m Dual Port 10GbE Multifunction BL-c Adapter
+ 103c 1740 NC375T PCI Express Quad Port Gigabit Server Adapter
+ 103c 3251 NC375i 1G w/NC524SFP 10G Module
+ 103c 705a NC375i Integrated Quad Port Multifunction Gigabit Server Adapter
+ 103c 705b NC522SFP Dual Port 10GbE Server Adapter
+ 152d 896b TG20 Dual Port 10GbE Server/Storage Adapter
+ 4040 0124 NX3031 Quad Port Gigabit Server Adapter
+ 4040 0126 Dual Port SFP+ 10GbE Server Adapter
+4143 Digital Equipment Corp
+4144 Alpha Data
+ 0044 ADM-XRCIIPro
+4150 ONA Electroerosion
+ 0001 PCI32TLITE FILSTRUP1 PCI to VME Bridge Controller
+ 0006 PCI32TLITE UART 16550 Opencores
+ 0007 PCI32TLITE CAN Controller Opencores
+415a Auzentech, Inc.
+416c Aladdin Knowledge Systems
+ 0100 AladdinCARD
+ 0200 CPC
+4321 Tata Power Strategic Electronics Division
+434e CAST Navigation LLC
+4444 Internext Compression Inc
+ 0016 iTVC16 (CX23416) MPEG-2 Encoder
+ 0070 0003 WinTV PVR 250
+ 0070 0009 WinTV PVR 150
+ 0070 0801 WinTV PVR 150
+ 0070 0807 WinTV PVR 150
+ 0070 4001 WinTV PVR 250
+ 0070 4009 WinTV PVR 250
+ 0070 4801 WinTV PVR 250
+ 0070 4803 WinTV PVR 250
+ 0070 8003 WinTV PVR 150
+ 0070 8801 WinTV PVR 150
+ 0070 c801 WinTV PVR 150
+ 0070 e807 WinTV PVR 500 (1st unit)
+ 0070 e817 WinTV PVR 500 (2nd unit)
+ 0070 ff92 WiNTV PVR-550
+ 0270 0801 WinTV PVR 150
+ 104d 013d ENX-26 TV Encoder
+ 10fc d038 GV-MVP/RX2W (1st unit)
+ 10fc d039 GV-MVP/RX2W (2nd unit)
+ 12ab fff3 MPG600
+ 12ab ffff MPG600
+ 1461 c00a M113 PCI Analog TV (PAL/SECAM, Philips FQ1216MK3 tuner)
+ 1461 c00b M113 PCI Analog TV (PAL/SECAM+FM, Philips FM1216MK3 tuner)
+ 1461 c00c M113 PCI Analog TV (NTSC, JAPAN version, Philips FI1286MK2 tuner)
+ 1461 c010 M113 PCI Analog TV (NTSC, Philips FI1236MK3 tuner)
+ 1461 c011 M113 PCI Analog TV (NTSC+FM, Philips FM1236MK3 tuner)
+ 1461 c018 M113 PCI Analog TV (NTSC, Philips FQ1236MK5 tuner)
+ 1461 c019 UltraTV 1500 MCE, a.k.a. M113 PCI Analog TV (NTSC+FM, Philips FQ1236MK5 tuner)
+ 1461 c01a M113 PCI Analog TV (PAL/SECAM, Philips FQ1216MK5 tuner)
+ 1461 c01b M113 PCI Analog TV (PAL/SECAM+FM, Philips FM1216MK5 tuner)
+ 1461 c030 M113 PCI Analog TV (NTSC-J, Partsnic tuner)
+ 1461 c031 M113 PCI Analog TV (NTSC-J+FM, Partsnic tuner)
+ 1461 c032 M113 PCI Analog TV (PAL/SECAM, Partsnic tuner)
+ 1461 c033 M113 PCI Analog TV (PAL/SECAM+FM, Partsnic tuner)
+ 1461 c034 M113 PCI Analog TV (NTSC, Partsnic tuner)
+ 1461 c035 M113 PCI Analog TV (NTSC+FM, Partsnic tuner)
+ 1461 c03f C115 PCI video capture card (no tuner)
+ 1461 c136 M104 mini-PCI Analog TV
+ 1461 c20a M755 AVerTV Video Capture (PAL/SECAM, Philips FQ1216MK3 tuner)
+ 1461 c218 M755 AVerTV Video Capture (NTSC, Philips FQ1236MK5 tuner)
+ 1461 c219 M755 AVerTV Video Capture (NTSC+FM, Philips FQ1236MK5 tuner)
+ 1461 c21a M755 AVerTV Video Capture (PAL/SECAM, Philips FQ1216MK5 tuner)
+ 1461 c21b M755 AVerTV Video Capture (PAL/SECAM+FM, Philips FM1216MK5 tuner)
+ 1461 c230 M755 AVerTV Video Capture (NTSC-J, Partsnic tuner)
+ 1461 c231 M755 AVerTV Video Capture (NTSC-J+FM, Partsnic tuner)
+ 1461 c232 M755 AVerTV Video Capture (PAL/SECAM, Partsnic tuner)
+ 1461 c233 M755 AVerTV Video Capture (PAL/SECAM+FM, Partsnic tuner)
+ 1461 c234 M755 AVerTV Video Capture (NTSC, Partsnic tuner)
+ 1461 c235 M755 AVerTV Video Capture (NTSC+FM, Partsnic tuner)
+ 1461 c337 E106 AVerMedia AVerTV Video Capture
+ 1461 c439 M116 AVerMedia AVerTV MCE 116 Plus (NTSC/PAL/SECAM+FM+REMOTE, Xceive 2028 tuner)
+ 1461 c5ff C755 AVerTV Video Capture card (no tuner)
+ 1461 c6ff C115 PCI video capture card (no tuner)
+ 1461 c739 M785 AVerMedia PCI Analog TV (NTSC/PAL/SECAM+FM, Xceive 2028 tuner)
+ 9005 0092 VideOh! AVC-2010
+ 9005 0093 VideOh! AVC-2410
+ 0803 iTVC15 MPEG-2 Encoder
+ 0070 4000 WinTV PVR-350
+ 0070 4001 WinTV PVR-250
+ 0070 4800 WinTV PVR-350 (V1)
+ 12ab 0000 MPG160
+ 1461 a3ce M179
+ 1461 a3cf M179
+4468 Bridgeport machines
+4594 Cogetec Informatique Inc
+45fb Baldor Electric Company
+4624 Budker Institute of Nuclear Physics
+ adc1 ADC200ME High speed ADC
+ de01 DL200ME High resolution delay line PCI based card
+ de02 DL200ME Middle resolution delay line PCI based card
+4680 Umax Computer Corp
+4843 Hercules Computer Technology Inc
+4916 RedCreek Communications Inc
+ 1960 RedCreek PCI adapter
+4943 Growth Networks
+494f ACCES I/O Products, Inc.
+ 0520 PCI-IDO-48
+ 0920 PCI-IDI-48
+ 0c50 PCI-DIO-24H
+ 0c51 PCI-DIO-24D
+ 0c60 PCI-DIO-48(H)
+ 0c68 PCI-DIO-72
+ 0c70 PCI-DIO-96
+ 0c78 PCI-DIO-120
+ 0dc8 PCI-IDIO-16
+ 0e50 PCI-DIO-24S
+ 0e51 PCI-DIO-24H(C)
+ 0e52 PCI-DIO-24D(C)
+ 0e60 PCI-DIO-48S(H)
+ 0e61 P104-DIO-24S
+ 0f00 PCI-IIRO-8
+ 0f01 LPCI-IIRO-8
+ 0f08 PCI-IIRO-16
+ 1050 PCI-422/485-2
+ 1058 PCI-COM422/4
+ 1059 PCI-COM485/4
+ 1068 PCI-COM422/8
+ 1069 PCI-COM485/8
+ 1088 PCI-COM232/1
+ 1090 PCI-COM232/2
+ 10a8 P104-COM232-8
+ 10c9 PCI-COM-1S
+ 10d0 PCI-COM2S
+ 10e8 PCI-COM-8SM
+ 1148 PCI-ICM-1S
+ 1150 PCI-ICM-2S
+ 1158 PCI-ICM422/4
+ 1159 PCI-ICM485/4
+ 1250 PCI-WDG-2S
+ 12d0 PCI-WDG-IMPAC
+ 22c0 PCI-WDG-CSM
+ 2c50 PCI-DIO-96CT
+ 2c58 PCI-DIO-96C3
+ 5ed0 PCI-DAC
+ 6c90 PCI-DA12-2
+ 6c98 PCI-DA12-4
+ 6ca0 PCI-DA12-6
+ 6ca8 PCI-DA12-8
+ 6ca9 PCI-DA12-8V
+ 6cb0 PCI-DA12-16
+ 6cb1 PCI-DA12-16V
+ 8ef0 P104-FAS16-16
+ aca8 PCI-AI12-16
+ aca9 PCI-AI12-16A
+ eca8 PCI-AIO12-16
+ eca9 PCI-A12-16
+ ecaa PCI-A12-16A
+ ece8 PCI-A16-16
+4978 Axil Computer Inc
+4a14 NetVin
+ 5000 NV5000SC
+ 4a14 5000 RT8029-Based Ethernet Adapter
+4b10 Buslogic Inc.
+4c48 LUNG HWA Electronics
+4c53 SBS Technologies
+ 0000 PLUSTEST device
+ 4c53 3000 PLUSTEST card (PC104+)
+ 4c53 3001 PLUSTEST card (PMC)
+ 0001 PLUSTEST-MM device
+ 4c53 3002 PLUSTEST-MM card (PMC)
+4ca1 Seanix Technology Inc
+4d51 MediaQ Inc.
+ 0200 MQ-200
+4d54 Microtechnica Co Ltd
+4d56 MATRIX VISION GmbH
+ 0000 [mvHYPERION-CLe/CLb] CameraLink PCI Express x1 Frame Grabber
+ 0001 [mvHYPERION-CLf/CLm] CameraLink PCI Express x4 Frame Grabber
+ 0010 [mvHYPERION-16R16/-32R16] 16 Video Channel PCI Express x4 Frame Grabber
+ 0020 [mvHYPERION-HD-SDI] HD-SDI PCI Express x4 Frame Grabber
+ 0030 [mvHYPERION-HD-SDI-Merger] HD-SDI PCI Express x4 Frame Grabber
+4ddc ILC Data Device Corp
+ 0100 DD-42924I5-300 (ARINC 429 Data Bus)
+ 0801 BU-65570I1 MIL-STD-1553 Test and Simulation
+ 0802 BU-65570I2 MIL-STD-1553 Test and Simulation
+ 0811 BU-65572I1 MIL-STD-1553 Test and Simulation
+ 0812 BU-65572I2 MIL-STD-1553 Test and Simulation
+ 0881 BU-65570T1 MIL-STD-1553 Test and Simulation
+ 0882 BU-65570T2 MIL-STD-1553 Test and Simulation
+ 0891 BU-65572T1 MIL-STD-1553 Test and Simulation
+ 0892 BU-65572T2 MIL-STD-1553 Test and Simulation
+ 0901 BU-65565C1 MIL-STD-1553 Data Bus
+ 0902 BU-65565C2 MIL-STD-1553 Data Bus
+ 0903 BU-65565C3 MIL-STD-1553 Data Bus
+ 0904 BU-65565C4 MIL-STD-1553 Data Bus
+ 0b01 BU-65569I1 MIL-STD-1553 Data Bus
+ 0b02 BU-65569I2 MIL-STD-1553 Data Bus
+ 0b03 BU-65569I3 MIL-STD-1553 Data Bus
+ 0b04 BU-65569I4 MIL-STD-1553 Data Bus
+5045 University of Toronto
+ 4243 BLASTbus PCI Interface Card v1
+5046 GemTek Technology Corporation
+ 1001 PCI Radio
+5053 Voyetra Technologies
+ 2010 Daytona Audio Adapter
+50b2 TerraTec Electronic GmbH
+ 1111 Terratec XLerate
+5136 S S Technologies
+5143 Qualcomm Inc
+5145 Ensoniq (Old)
+ 3031 Concert AudioPCI
+5168 Animation Technologies Inc.
+ 0300 FlyDVB-S
+ 0301 FlyDVB-T
+5301 Alliance Semiconductor Corp.
+ 0001 ProMotion aT3D
+5333 S3 Inc.
+ 0551 Plato/PX (system)
+ 5631 86c325 [ViRGE]
+ 8800 86c866 [Vision 866]
+ 8801 86c964 [Vision 964]
+ 8810 86c764_0 [Trio 32 vers 0]
+ 8811 86c764/765 [Trio32/64/64V+]
+ 8812 86cM65 [Aurora64V+]
+ 8813 86c764_3 [Trio 32/64 vers 3]
+ 8814 86c767 [Trio 64UV+]
+ 8815 86cM65 [Aurora 128]
+ 883d 86c988 [ViRGE/VX]
+ 8870 FireGL
+ 8880 86c868 [Vision 868 VRAM] vers 0
+ 8881 86c868 [Vision 868 VRAM] vers 1
+ 8882 86c868 [Vision 868 VRAM] vers 2
+ 8883 86c868 [Vision 868 VRAM] vers 3
+ 88b0 86c928 [Vision 928 VRAM] vers 0
+ 88b1 86c928 [Vision 928 VRAM] vers 1
+ 88b2 86c928 [Vision 928 VRAM] vers 2
+ 88b3 86c928 [Vision 928 VRAM] vers 3
+ 88c0 86c864 [Vision 864 DRAM] vers 0
+ 88c1 86c864 [Vision 864 DRAM] vers 1
+ 88c2 86c864 [Vision 864-P DRAM] vers 2
+ 88c3 86c864 [Vision 864-P DRAM] vers 3
+ 88d0 86c964 [Vision 964 VRAM] vers 0
+ 88d1 86c964 [Vision 964 VRAM] vers 1
+ 88d2 86c964 [Vision 964-P VRAM] vers 2
+ 88d3 86c964 [Vision 964-P VRAM] vers 3
+ 88f0 86c968 [Vision 968 VRAM] rev 0
+ 88f1 86c968 [Vision 968 VRAM] rev 1
+ 88f2 86c968 [Vision 968 VRAM] rev 2
+ 88f3 86c968 [Vision 968 VRAM] rev 3
+ 8900 86c755 [Trio 64V2/DX]
+ 5333 8900 86C775 Trio64V2/DX
+ 8901 86c775/86c785 [Trio 64V2/DX or /GX]
+ 5333 8901 86C775 Trio64V2/DX, 86C785 Trio64V2/GX
+ 8902 Plato/PX
+ 8903 Trio 3D business multimedia
+ 8904 86c365, 86c366 [Trio 3D]
+ 1014 00db Integrated Trio3D
+ 4843 314a Terminator 128/3D GLH
+ 5333 8904 86C365 Trio3D AGP
+ 8905 Trio 64V+ family
+ 8906 Trio 64V+ family
+ 8907 Trio 64V+ family
+ 8908 Trio 64V+ family
+ 8909 Trio 64V+ family
+ 890a Trio 64V+ family
+ 890b Trio 64V+ family
+ 890c Trio 64V+ family
+ 890d Trio 64V+ family
+ 890e Trio 64V+ family
+ 890f Trio 64V+ family
+ 8a01 86c375 [ViRGE/DX] or 86c385 [ViRGE/GX]
+ 0e11 b032 ViRGE/GX
+ 10b4 1617 Nitro 3D
+ 10b4 1717 Nitro 3D
+ 5333 8a01 ViRGE/DX
+ 8a10 ViRGE/GX2
+ 1092 8a10 Stealth 3D 4000
+ 8a13 86c360 [Trio 3D/1X], 86c362, 86c368 [Trio 3D/2X]
+ 5333 8a13 Trio3D/2X
+ 8a20 86c794 [Savage 3D]
+ 5333 8a20 86C391 Savage3D
+ 8a21 86c390 [Savage 3D/MV]
+ 5333 8a21 86C390 Savage3D/MV
+ 8a22 Savage 4
+ 1033 8068 Savage 4
+ 1033 8069 Savage 4
+ 1033 8110 Savage 4 LT
+ 105d 0018 SR9 8Mb SDRAM
+ 105d 002a SR9 Pro 16Mb SDRAM
+ 105d 003a SR9 Pro 32Mb SDRAM
+ 105d 092f SR9 Pro+ 16Mb SGRAM
+ 1092 4207 Stealth III S540
+ 1092 4800 Stealth III S540
+ 1092 4807 SpeedStar A90
+ 1092 4808 Stealth III S540
+ 1092 4809 Stealth III S540
+ 1092 480e Stealth III S540
+ 1092 4904 Stealth III S520
+ 1092 4905 SpeedStar A200
+ 1092 4a09 Stealth III S540
+ 1092 4a0b Stealth III S540 Xtreme
+ 1092 4a0f Stealth III S540
+ 1092 4e01 Stealth III S540
+ 1102 101d 3d Blaster Savage 4
+ 1102 101e 3d Blaster Savage 4
+ 5333 8100 86C394-397 Savage4 SDRAM 100
+ 5333 8110 86C394-397 Savage4 SDRAM 110
+ 5333 8125 86C394-397 Savage4 SDRAM 125
+ 5333 8143 86C394-397 Savage4 SDRAM 143
+ 5333 8a22 86C394-397 Savage4
+ 5333 8a2e 86C394-397 Savage4 32bit
+ 5333 9125 86C394-397 Savage4 SGRAM 125
+ 5333 9143 86C394-397 Savage4 SGRAM 143
+ 8a23 Savage 4
+ 8a25 ProSavage PM133
+ 0303 0303 D9840-60001 [Brio BA410 Motherboard]
+ 8a26 ProSavage KM133
+ 8c00 ViRGE/M3
+ 8c01 ViRGE/MX
+ 1179 0001 ViRGE/MX
+ 8c02 ViRGE/MX+
+ 8c03 ViRGE/MX+MV
+ 8c10 86C270-294 Savage/MX-MV
+ 8c11 82C270-294 Savage/MX
+ 8c12 86C270-294 Savage/IX-MV
+ 1014 017f ThinkPad T20/T22
+ 1179 0001 86C584 SuperSavage/IXC Toshiba
+ 8c13 86C270-294 Savage/IX
+ 1179 0001 Magnia Z310
+ 8c22 SuperSavage MX/128
+ 8c24 SuperSavage MX/64
+ 8c26 SuperSavage MX/64C
+ 8c2a SuperSavage IX/128 SDR
+ 8c2b SuperSavage IX/128 DDR
+ 8c2c SuperSavage IX/64 SDR
+ 8c2d SuperSavage IX/64 DDR
+ 8c2e SuperSavage IX/C SDR
+ 1014 01fc ThinkPad T23
+ 8c2f SuperSavage IX/C DDR
+ 8d01 86C380 [ProSavageDDR K4M266]
+ 8d02 VT8636A [ProSavage KN133] AGP4X VGA Controller (TwisterK)
+ 8d03 VT8751 [ProSavageDDR P4M266]
+ 8d04 VT8375 [ProSavage8 KM266/KL266]
+ 8e40 2300E Graphics Processor
+ 8e48 Chrome S27 PCIE
+ 5333 0130 Chrome S27 256M DDR2
+ 9102 86C410 Savage 2000
+ 1092 5932 Viper II Z200
+ 1092 5934 Viper II Z200
+ 1092 5952 Viper II Z200
+ 1092 5954 Viper II Z200
+ 1092 5a35 Viper II Z200
+ 1092 5a37 Viper II Z200
+ 1092 5a55 Viper II Z200
+ 1092 5a57 Viper II Z200
+ ca00 SonicVibes
+5431 AuzenTech, Inc.
+544c Teralogic Inc
+ 0350 TL880-based HDTV/ATSC tuner
+5452 SCANLAB AG
+ 3443 RTC4
+5455 Technische University Berlin
+ 4458 S5933
+5456 GoTView
+5519 Cnet Technologies, Inc.
+5544 Dunord Technologies
+ 0001 I-30xx Scanner Interface
+5555 Genroco, Inc
+ 0003 TURBOstor HFP-832 [HiPPI NIC]
+5646 Vector Fabrics BV
+5654 VoiceTronix Pty Ltd
+5700 Netpower
+584d AuzenTech Co., Ltd.
+5851 Exacq Technologies
+5853 XenSource, Inc.
+ 0001 Xen Platform Device
+# Virtual device surfaced in guests to provide HID events.
+ c110 Virtualized HID
+# Device surfaced in guests to provide 2d graphics capabilities
+ c147 Virtualized Graphics Device
+5854 GoTView
+5ace Beholder International Ltd.
+631c SmartInfra Ltd
+ 1652 PXI-1652 Signal Generator
+ 2504 PXI-2504 Signal Interrogator
+6356 UltraStor
+6374 c't Magazin fuer Computertechnik
+ 6773 GPPCI
+6409 Logitec Corp.
+6549 Teradici Corp.
+ 1200 TERA1200 PC-over-IP Host
+6666 Decision Computer International Co.
+ 0001 PCCOM4
+ 0002 PCCOM8
+ 0004 PCCOM2
+ 0101 PCI 8255/8254 I/O Card
+ 0200 12-bit AD/DA Card
+ 0201 14-bit AD/DA Card
+ 1011 Industrial Card
+ 1021 8 photo couple 8 relay Card
+ 1022 4 photo couple 4 relay Card
+ 1025 16 photo couple 16 relay Card
+ 4000 WatchDog Card
+6739 RV 940 [Barts Pro]
+# nee Qumranet
+6900 Red Hat, Inc.
+7063 pcHDTV
+ 2000 HD-2000
+ 3000 HD-3000
+ 5500 HD5500 HDTV
+7284 HT OMEGA Inc.
+7604 O.N. Electronic Co Ltd.
+7bde MIDAC Corporation
+7fed PowerTV
+8008 Quancom Electronic GmbH
+ 0010 WDOG1 [PCI-Watchdog 1]
+ 0011 PWDOG2 [PCI-Watchdog 2]
+ 0015 Clock77/PCI & Clock77/PCIe (DCF-77 receiver)
+# Wrong ID used in subsystem ID of AsusTek PCI-USB2 PCI card.
+807d Asustek Computer, Inc.
+8086 Intel Corporation
+ 0007 82379AB
+ 0008 Extended Express System Support Controller
+ 0039 21145 Fast Ethernet
+ 0040 Core Processor DRAM Controller
+ 0041 Core Processor PCI Express x16 Root Port
+ 0042 Core Processor Integrated Graphics Controller
+ 0043 Core Processor Secondary PCI Express Root Port
+ 0044 Core Processor DRAM Controller
+ 1025 0347 Aspire 7740G
+ e4bf 50c1 PC1-GROOVE
+ 0045 Core Processor PCI Express x16 Root Port
+ 0046 Core Processor Integrated Graphics Controller
+ e4bf 50c1 PC1-GROOVE
+ 0047 Core Processor Secondary PCI Express Root Port
+ 0048 Core Processor DRAM Controller
+ 0049 Core Processor PCI Express x16 Root Port
+ 004a Core Processor Integrated Graphics Controller
+ 004b Core Processor Secondary PCI Express Root Port
+ 0050 Core Processor Thermal Management Controller
+ 0069 Core Processor DRAM Controller
+ 0082 Centrino Advanced-N 6205
+ 8086 1301 Centrino Advanced-N 6205 AGN
+ 8086 1306 Centrino Advanced-N 6205 ABG
+ 8086 1307 Centrino Advanced-N 6205 BG
+ 8086 1321 Centrino Advanced-N 6205 AGN
+ 8086 1326 Centrino Advanced-N 6205 ABG
+ 0083 Centrino Wireless-N 1000
+ 8086 1205 Centrino Wireless-N 1000 BGN
+ 8086 1206 Centrino Wireless-N 1000 BG
+ 8086 1225 Centrino Wireless-N 1000 BGN
+ 8086 1226 Centrino Wireless-N 1000 BG
+ 8086 1305 Centrino Wireless-N 1000 BGN
+ 8086 1306 Centrino Wireless-N 1000 BG
+ 8086 1325 Centrino Wireless-N 1000 BGN
+ 8086 1326 Centrino Wireless-N 1000 BG
+ 0084 Centrino Wireless-N 1000
+ 8086 1215 Centrino Wireless-N 1000 BGN
+ 8086 1216 Centrino Wireless-N 1000 BG
+ 8086 1315 Centrino Wireless-N 1000 BGN
+ 8086 1316 Centrino Wireless-N 1000 BG
+ 0085 Centrino Advanced-N 6205
+ 8086 1311 Centrino Advanced-N 6205 AGN
+ 8086 1316 Centrino Advanced-N 6205 ABG
+ 0087 Centrino Advanced-N + WiMAX 6250
+ 8086 1301 Centrino Advanced-N + WiMAX 6250 2x2 AGN
+ 8086 1306 Centrino Advanced-N + WiMAX 6250 2x2 ABG
+ 8086 1321 Centrino Advanced-N + WiMAX 6250 2x2 AGN
+ 8086 1326 Centrino Advanced-N + WiMAX 6250 2x2 ABG
+ 0089 Centrino Advanced-N + WiMAX 6250
+ 8086 1311 Centrino Advanced-N + WiMAX 6250 2x2 AGN
+ 8086 1316 Centrino Advanced-N + WiMAX 6250 2x2 ABG
+ 008a Centrino Wireless-N 1030
+ 8086 5305 Centrino Wireless-N 1030 BGN
+ 8086 5307 Centrino Wireless-N 1030 BG
+ 8086 5325 Centrino Wireless-N 1030 BGN
+ 8086 5327 Centrino Wireless-N 1030 BG
+ 008b Centrino Wireless-N 1030
+ 8086 5315 Centrino Wireless-N 1030 BGN
+ 8086 5317 Centrino Wireless-N 1030 BG
+ 0090 Centrino Advanced-N 6230
+ 8086 5211 Centrino Advanced-N 6230 AGN
+ 8086 5215 Centrino Advanced-N 6230 BGN
+ 8086 5216 Centrino Advanced-N 6230 ABG
+ 0091 Centrino Advanced-N 6230
+ 8086 5201 Centrino Advanced-N 6230 AGN
+ 8086 5205 Centrino Advanced-N 6230 BGN
+ 8086 5206 Centrino Advanced-N 6230 ABG
+ 8086 5207 Centrino Advanced-N 6230 BG
+ 8086 5221 Centrino Advanced-N 6230 AGN
+ 8086 5225 Centrino Advanced-N 6230 BGN
+ 8086 5226 Centrino Advanced-N 6230 ABG
+ 0100 2nd Generation Core Processor Family DRAM Controller
+ 1028 04aa XPS 8300
+ 1043 844d P8P67 Deluxe Motherboard
+ 0101 Xeon E3-1200/2nd Generation Core Processor Family PCI Express Root Port
+ 0102 2nd Generation Core Processor Family Integrated Graphics Controller
+ 0104 2nd Generation Core Processor Family DRAM Controller
+ 0105 Xeon E3-1200/2nd Generation Core Processor Family PCI Express Root Port
+ 0106 2nd Generation Core Processor Family Integrated Graphics Controller
+ 0108 Xeon E3-1200 Processor Family DRAM Controller
+ 0109 Xeon E3-1200/2nd Generation Core Processor Family PCI Express Root Port
+ 010a Xeon E3-1200 Processor Family Integrated Graphics Controller
+ 010b Xeon E3-1200/2nd Generation Core Processor Family Integrated Graphics Controller
+ 010c Xeon E3-1200/2nd Generation Core Processor Family DRAM Controller
+ 010d Xeon E3-1200/2nd Generation Core Processor Family PCI Express Root Port
+ 010e Xeon E3-1200/2nd Generation Core Processor Family Integrated Graphics Controller
+ 0112 2nd Generation Core Processor Family Integrated Graphics Controller
+ 0116 2nd Generation Core Processor Family Integrated Graphics Controller
+ 0122 2nd Generation Core Processor Family Integrated Graphics Controller
+ 0126 2nd Generation Core Processor Family Integrated Graphics Controller
+ 0150 Ivy Bridge DRAM Controller
+ 0151 Ivy Bridge PCI Express Root Port
+ 0152 Ivy Bridge Graphics Controller
+ 0154 Ivy Bridge DRAM Controller
+ 0155 Ivy Bridge PCI Express Root Port
+ 0156 Ivy Bridge Graphics Controller
+ 0158 Ivy Bridge DRAM Controller
+ 0159 Ivy Bridge PCI Express Root Port
+ 015a Ivy Bridge Graphics Controller
+ 015c Ivy Bridge DRAM Controller
+ 015d Ivy Bridge PCI Express Root Port
+ 015e Ivy Bridge Graphics Controller
+ 0309 80303 I/O Processor PCI-to-PCI Bridge
+ 030d 80312 I/O Companion Chip PCI-to-PCI Bridge
+ 0326 6700/6702PXH I/OxAPIC Interrupt Controller A
+ 1775 1100 CR11/VR11 Single Board Computer
+ 0327 6700PXH I/OxAPIC Interrupt Controller B
+ 1775 1100 CR11/VR11 Single Board Computer
+ 0329 6700PXH PCI Express-to-PCI Bridge A
+ 032a 6700PXH PCI Express-to-PCI Bridge B
+ 032c 6702PXH PCI Express-to-PCI Bridge A
+ 0330 80332 [Dobson] I/O processor (A-Segment Bridge)
+ 0331 80332 [Dobson] I/O processor (A-Segment IOAPIC)
+ 0332 80332 [Dobson] I/O processor (B-Segment Bridge)
+ 0333 80332 [Dobson] I/O processor (B-Segment IOAPIC)
+ 0334 80332 [Dobson] I/O processor (ATU)
+ 0335 80331 [Lindsay] I/O processor (PCI-X Bridge)
+ 0336 80331 [Lindsay] I/O processor (ATU)
+ 0340 41210 [Lanai] Serial to Parallel PCI Bridge (A-Segment Bridge)
+ 0341 41210 [Lanai] Serial to Parallel PCI Bridge (B-Segment Bridge)
+ 0370 80333 Segment-A PCI Express-to-PCI Express Bridge
+ 0371 80333 A-Bus IOAPIC
+ 0372 80333 Segment-B PCI Express-to-PCI Express Bridge
+ 0373 80333 B-Bus IOAPIC
+ 0374 80333 Address Translation Unit
+ 0436 DH89xxCC Gigabit SGMII Connection
+ 0438 DH8900CC Series Gigabit Network Connection
+ 043a DH8900CC Series Gigabit Fiber Network Connection
+ 043c DH8900CC Series Gigabit Backplane Network Connection
+ 0440 DH8900CC Series Gigabit SFP Network Connection
+ 0482 82375EB/SB PCI to EISA Bridge
+ 0483 82424TX/ZX [Saturn] CPU to PCI bridge
+ 0484 82378ZB/IB, 82379AB (SIO, SIO.A) PCI to ISA Bridge
+ 0486 82425EX/ZX [Aries] PCIset with ISA bridge
+ 04a3 82434LX/NX [Mercury/Neptune] Processor to PCI bridge
+ 04d0 82437FX [Triton FX]
+ 0500 E8870 Processor bus control
+ 0501 E8870 Memory controller
+# and registers common to both SPs
+ 0502 E8870 Scalability Port 0
+# and global performance monitoring
+ 0503 E8870 Scalability Port 1
+ 0510 E8870IO Hub Interface Port 0 registers (8-bit compatibility port)
+ 0511 E8870IO Hub Interface Port 1 registers
+ 0512 E8870IO Hub Interface Port 2 registers
+ 0513 E8870IO Hub Interface Port 3 registers
+ 0514 E8870IO Hub Interface Port 4 registers
+ 0515 E8870IO General SIOH registers
+ 0516 E8870IO RAS registers
+ 0530 E8870SP Scalability Port 0 registers
+ 0531 E8870SP Scalability Port 1 registers
+ 0532 E8870SP Scalability Port 2 registers
+ 0533 E8870SP Scalability Port 3 registers
+ 0534 E8870SP Scalability Port 4 registers
+ 0535 E8870SP Scalability Port 5 registers
+# (bi-interleave 0) and global registers that are neither per-port nor per-interleave
+ 0536 E8870SP Interleave registers 0 and 1
+# (bi-interleave 1)
+ 0537 E8870SP Interleave registers 2 and 3
+ 0600 RAID Controller
+ 8086 0136 SRCU31L
+ 8086 01af SRCZCR
+ 8086 01c1 ICP Vortex GDT8546RZ
+ 8086 01f7 SCRU32
+# uninitialized SRCU32 RAID Controller
+ 061f 80303 I/O Processor
+ 0700 CE Media Processor A/V Bridge
+ 0701 CE Media Processor NAND Flash Controller
+ 0703 CE Media Processor Media Control Unit 1
+ 0704 CE Media Processor Video Capture Interface
+ 0707 CE Media Processor SPI Slave
+ 0708 CE Media Processor 4100
+ 0800 Moorestown SPI Ctrl 0
+ 0801 Moorestown SPI Ctrl 1
+ 0802 Moorestown I2C 0
+ 0803 Moorestown I2C 1
+ 0804 Moorestown I2C 2
+ 0805 Moorestown Keyboard Ctrl
+ 0806 Moorestown USB Ctrl
+ 0807 Moorestown SD Host Ctrl 0
+ 0808 Moorestown SD Host Ctrl 1
+ 0809 Moorestown NAND Ctrl
+ 080a Moorestown Audio Ctrl
+ 080b Moorestown ISP
+ 080c Moorestown Security Controller
+ 080d Moorestown External Displays
+ 080e Moorestown SCU IPC
+ 080f Moorestown GPIO Controller
+ 0810 Moorestown Power Management Unit
+ 0811 Moorestown OTG Ctrl
+ 0812 Moorestown SPI Ctrl 2
+ 0813 Moorestown SC DMA
+ 0814 Moorestown LPE DMA
+ 0815 Moorestown SSP0
+ 0885 Centrino Wireless-N + WiMAX 6150
+ 8086 1305 Centrino Wireless-N + WiMAX 6150 BGN
+ 8086 1307 Centrino Wireless-N + WiMAX 6150 BG
+ 8086 1325 Centrino Wireless-N + WiMAX 6150 BGN
+ 8086 1327 Centrino Wireless-N + WiMAX 6150 BG
+ 0886 Centrino Wireless-N + WiMAX 6150
+ 8086 1315 Centrino Wireless-N + WiMAX 6150 BGN
+ 8086 1317 Centrino Wireless-N + WiMAX 6150 BG
+ 0896 Centrino Wireless-N 130
+ 8086 5005 Centrino Wireless-N 130 BGN
+ 8086 5007 Centrino Wireless-N 130 BG
+ 8086 5025 Centrino Wireless-N 130 BGN
+ 8086 5027 Centrino Wireless-N 130 BG
+ 0897 Centrino Wireless-N 130
+ 8086 5015 Centrino Wireless-N 130 BGN
+ 8086 5017 Centrino Wireless-N 130 BG
+ 08ae Centrino Wireless-N 100
+ 8086 1005 Centrino Wireless-N 100 BGN
+ 8086 1007 Centrino Wireless-N 100 BG
+ 8086 1025 Centrino Wireless-N 100 BGN
+ 8086 1027 Centrino Wireless-N 100 BG
+ 08af Centrino Wireless-N 100
+ 8086 1015 Centrino Wireless-N 100 BGN
+ 8086 1017 Centrino Wireless-N 100 BG
+ 0960 80960RP (i960RP) Microprocessor/Bridge
+ 0962 80960RM (i960RM) Bridge
+ 0964 80960RP (i960RP) Microprocessor/Bridge
+ 0be0 Cedarview Integrated Graphics Controller
+ 0be1 Cedarview Integrated Graphics Controller
+ 0be2 Cedarview Integrated Graphics Controller
+ 0be3 Cedarview Integrated Graphics Controller
+ 0be4 Cedarview Integrated Graphics Controller
+ 0be5 Cedarview Integrated Graphics Controller
+ 0be6 Cedarview Integrated Graphics Controller
+ 0be7 Cedarview Integrated Graphics Controller
+ 0be8 Cedarview Integrated Graphics Controller
+ 0be9 Cedarview Integrated Graphics Controller
+ 0bea Cedarview Integrated Graphics Controller
+ 0beb Cedarview Integrated Graphics Controller
+ 0bec Cedarview Integrated Graphics Controller
+ 0bed Cedarview Integrated Graphics Controller
+ 0bee Cedarview Integrated Graphics Controller
+ 0bef Cedarview Integrated Graphics Controller
+ 0bf0 Cedarview DRAM Controller
+ 0bf1 Cedarview DRAM Controller
+ 0bf2 Cedarview DRAM Controller
+ 0bf3 Cedarview DRAM Controller
+ 0bf4 Cedarview DRAM Controller
+ 0bf5 Cedarview DRAM Controller
+ 0bf6 Cedarview DRAM Controller
+ 0bf7 Cedarview DRAM Controller
+ 1000 82542 Gigabit Ethernet Controller (Fiber)
+ 0e11 b0df NC6132 Gigabit Ethernet Adapter (1000-SX)
+ 0e11 b0e0 NC6133 Gigabit Ethernet Adapter (1000-LX)
+ 0e11 b123 NC6134 Gigabit Ethernet Adapter (1000-LX)
+ 1014 0119 Netfinity Gigabit Ethernet SX Adapter
+ 8086 1000 PRO/1000 Gigabit Server Adapter
+ 1001 82543GC Gigabit Ethernet Controller (Fiber)
+ 0e11 004a NC6136 Gigabit Server Adapter
+ 1014 01ea Netfinity Gigabit Ethernet SX Adapter
+ 8086 1002 PRO/1000 F Server Adapter
+ 8086 1003 PRO/1000 F Server Adapter
+ 1002 Pro 100 LAN+Modem 56 Cardbus II
+ 8086 200e Pro 100 LAN+Modem 56 Cardbus II
+ 8086 2013 Pro 100 SR Mobile Combo Adapter
+ 8086 2017 Pro 100 S Combo Mobile Adapter
+ 1004 82543GC Gigabit Ethernet Controller (Copper)
+ 0e11 0049 NC7132 Gigabit Upgrade Module
+ 0e11 b1a4 NC7131 Gigabit Server Adapter
+ 1014 10f2 Gigabit Ethernet Server Adapter
+ 8086 1004 PRO/1000 T Server Adapter
+ 8086 2004 PRO/1000 T Server Adapter
+ 1008 82544EI Gigabit Ethernet Controller (Copper)
+ 1014 0269 iSeries 1000/100/10 Ethernet Adapter
+ 1028 011b PowerEdge 1650/2550
+ 1028 011c PRO/1000 XT Network Connection
+ 8086 1107 PRO/1000 XT Server Adapter
+ 8086 2107 PRO/1000 XT Server Adapter
+ 8086 2110 PRO/1000 XT Desktop Adapter
+ 8086 3108 PRO/1000 XT Network Connection
+ 1009 82544EI Gigabit Ethernet Controller (Fiber)
+ 1014 0268 iSeries Gigabit Ethernet Adapter
+ 8086 1109 PRO/1000 XF Server Adapter
+ 8086 2109 PRO/1000 XF Server Adapter
+ 100a 82540EM Gigabit Ethernet Controller
+ 100c 82544GC Gigabit Ethernet Controller (Copper)
+ 8086 1112 PRO/1000 T Desktop Adapter
+ 8086 2112 PRO/1000 T Desktop Adapter
+ 100d 82544GC Gigabit Ethernet Controller (LOM)
+ 1028 0123 PRO/1000 XT Network Connection
+ 1079 891f 82544GC Based Network Connection
+ 4c53 1080 CT8 mainboard
+ 8086 110d 82544GC Based Network Connection
+ 100e 82540EM Gigabit Ethernet Controller
+ 1014 0265 PRO/1000 MT Network Connection
+ 1014 0267 PRO/1000 MT Network Connection
+ 1014 026a PRO/1000 MT Network Connection
+ 1028 002e Optiplex GX260
+ 1028 0134 PowerEdge 600SC
+ 1028 0151 Optiplex GX270
+ 107b 8920 PRO/1000 MT Desktop Adapter
+ 8086 001e PRO/1000 MT Desktop Adapter
+ 8086 002e PRO/1000 MT Desktop Adapter
+ 8086 1376 PRO/1000 GT Desktop Adapter
+ 8086 1476 PRO/1000 GT Desktop Adapter
+ 100f 82545EM Gigabit Ethernet Controller (Copper)
+ 1014 0269 iSeries 1000/100/10 Ethernet Adapter
+ 1014 028e PRO/1000 MT Network Connection
+ 15ad 0750 PRO/1000 MT Single Port Adapter
+ 8086 1000 PRO/1000 MT Network Connection
+ 8086 1001 PRO/1000 MT Server Adapter
+ 1010 82546EB Gigabit Ethernet Controller (Copper)
+ 0e11 00db NC7170 Gigabit Server Adapter
+ 1014 027c PRO/1000 MT Dual Port Network Adapter
+ 15ad 0760 PRO/1000 MT Dual Port Adapter
+ 18fb 7872 RESlink-X
+ 1fc1 0026 Niagara 2260 Bypass Card
+ 4c53 1080 CT8 mainboard
+ 4c53 10a0 CA3/CR3 mainboard
+ 8086 1011 PRO/1000 MT Dual Port Server Adapter
+ 8086 1012 PRO/1000 MT Dual Port Server Adapter
+ 8086 101a PRO/1000 MT Dual Port Network Connection
+ 8086 3424 SE7501HG2 Mainboard
+ 1011 82545EM Gigabit Ethernet Controller (Fiber)
+ 1014 0268 iSeries Gigabit Ethernet Adapter
+ 8086 1002 PRO/1000 MF Server Adapter
+ 8086 1003 PRO/1000 MF Server Adapter (LX)
+ 1012 82546EB Gigabit Ethernet Controller (Fiber)
+ 0e11 00dc NC6170 Gigabit Server Adapter
+ 8086 1012 PRO/1000 MF Dual Port Server Adapter
+ 1013 82541EI Gigabit Ethernet Controller
+ 8086 0013 PRO/1000 MT Network Connection
+ 8086 1013 PRO/1000 MT Network Connection
+ 8086 1113 PRO/1000 MT Desktop Adapter
+ 1014 82541ER Gigabit Ethernet Controller
+ 8086 0014 PRO/1000 MT Desktop Connection
+ 8086 1014 PRO/1000 MT Network Connection
+ 1015 82540EM Gigabit Ethernet Controller (LOM)
+ 8086 1015 PRO/1000 MT Mobile Connection
+ 1016 82540EP Gigabit Ethernet Controller (Mobile)
+ 1014 052c PRO/1000 MT Mobile Connection
+ 1179 0001 PRO/1000 MT Mobile Connection
+ 8086 1016 PRO/1000 MT Mobile Connection
+ 1017 82540EP Gigabit Ethernet Controller
+ 8086 1017 PR0/1000 MT Desktop Connection
+ 1018 82541EI Gigabit Ethernet Controller
+ 8086 1018 PRO/1000 MT Mobile Connection
+ 1019 82547EI Gigabit Ethernet Controller
+ 1458 1019 GA-8IPE1000 Pro2 motherboard (865PE)
+ 1458 e000 Intel Gigabit Ethernet (Kenai II)
+ 8086 1019 PRO/1000 CT Desktop Connection
+ 8086 301f D865PERL mainboard
+ 8086 3025 D875PBZ motherboard
+ 8086 302c Intel 82865G Mainboard (D865GBF)
+ 8086 3427 S875WP1-E mainboard
+ 101a 82547EI Gigabit Ethernet Controller (Mobile)
+ 8086 101a PRO/1000 CT Mobile Connection
+ 101d 82546EB Gigabit Ethernet Controller
+ 8086 1000 PRO/1000 MT Quad Port Server Adapter
+ 101e 82540EP Gigabit Ethernet Controller (Mobile)
+ 1014 0549 Thinkpad
+ 1179 0001 PRO/1000 MT Mobile Connection
+ 8086 101e PRO/1000 MT Mobile Connection
+ 1026 82545GM Gigabit Ethernet Controller
+ 1028 0169 Precision 470
+ 8086 1000 PRO/1000 MT Server Connection
+ 8086 1001 PRO/1000 MT Server Adapter
+ 8086 1002 PRO/1000 MT Server Adapter
+ 8086 1003 PRO/1000 GT Server Adapter
+ 8086 1026 PRO/1000 MT Server Connection
+ 1027 82545GM Gigabit Ethernet Controller
+ 103c 3103 NC310F PCI-X Gigabit Server Adapter
+ 8086 1001 PRO/1000 MF Server Adapter(LX)
+ 8086 1002 PRO/1000 MF Server Adapter(LX)
+ 8086 1003 PRO/1000 MF Server Adapter(LX)
+ 8086 1027 PRO/1000 MF Server Adapter
+ 1028 82545GM Gigabit Ethernet Controller
+ 8086 1028 PRO/1000 MB Server Connection
+ 1029 82559 Ethernet Controller
+ 1030 82559 InBusiness 10/100
+ 1031 82801CAM (ICH3) PRO/100 VE (LOM) Ethernet Controller
+ 1014 0209 ThinkPad A/T/X Series
+ 104d 80e7 Vaio PCG-GR214EP/GR214MP/GR215MP/GR314MP/GR315MP
+ 104d 813c Vaio PCG-GRV616G
+ 107b 5350 EtherExpress PRO/100 VE
+ 1179 0001 EtherExpress PRO/100 VE
+ 144d c000 EtherExpress PRO/100 VE
+ 144d c001 EtherExpress PRO/100 VE
+ 144d c003 EtherExpress PRO/100 VE
+ 144d c006 vpr Matrix 170B4
+ 1032 82801CAM (ICH3) PRO/100 VE Ethernet Controller
+ 1033 82801CAM (ICH3) PRO/100 VM (LOM) Ethernet Controller
+ 1034 82801CAM (ICH3) PRO/100 VM Ethernet Controller
+ 1035 82801CAM (ICH3)/82562EH (LOM) Ethernet Controller
+ 1036 82801CAM (ICH3) 82562EH Ethernet Controller
+ 1037 82801CAM (ICH3) Chipset Ethernet Controller
+ 1038 82801CAM (ICH3) PRO/100 VM (KM) Ethernet Controller
+ 0e11 0098 Evo N600c
+ 1039 82801DB PRO/100 VE (LOM) Ethernet Controller
+ 1014 0267 NetVista A30p
+ 114a 0582 PC8 onboard ethernet ETH1
+ 103a 82801DB PRO/100 VE (CNR) Ethernet Controller
+ 103b 82801DB PRO/100 VM (LOM) Ethernet Controller
+ 103c 82801DB PRO/100 VM (CNR) Ethernet Controller
+ 103d 82801DB PRO/100 VE (MOB) Ethernet Controller
+ 1014 0522 ThinkPad R40
+ 1028 2002 Latitude D500
+ 8086 103d 82562EZ 10/100 Ethernet Controller
+ 103e 82801DB PRO/100 VM (MOB) Ethernet Controller
+ 1040 536EP Data Fax Modem
+ 16be 1040 V.9X DSP Data Fax Modem
+ 1043 PRO/Wireless LAN 2100 3B Mini PCI Adapter
+ 103c 08b0 tc1100 tablet
+ 8086 2522 Samsung X10/P30 integrated WLAN
+ 8086 2527 MIM2000/Centrino
+ 8086 2561 Dell Latitude D800
+ 8086 2581 Toshiba Satellite M10
+ 1048 82597EX 10GbE Ethernet Controller
+ 8086 a01f PRO/10GbE LR Server Adapter
+ 8086 a11f PRO/10GbE LR Server Adapter
+ 1049 82566MM Gigabit Network Connection
+ 103c 30c1 Compaq 6910p
+ 17aa 20b9 ThinkPad T61
+ 104a 82566DM Gigabit Network Connection
+ 104b 82566DC Gigabit Network Connection
+ 104c 82562V 10/100 Network Connection
+ 104d 82566MC Gigabit Network Connection
+ 1050 82562EZ 10/100 Ethernet Controller
+ 1028 019d Dimension 3000
+ 1462 728c 865PE Neo2 (MS-6728)
+ 1462 758c MS-6758 (875P Neo)
+ 8086 3020 D865PERL mainboard
+ 8086 302f Desktop Board D865GBF
+ 8086 3427 S875WP1-E mainboard
+ 1051 82801EB/ER (ICH5/ICH5R) integrated LAN Controller
+ 1052 PRO/100 VM Network Connection
+ 1053 PRO/100 VM Network Connection
+ 1054 PRO/100 VE Network Connection
+ 1055 PRO/100 VM Network Connection
+ 1056 PRO/100 VE Network Connection
+ 1057 PRO/100 VE Network Connection
+ 1059 82551QM Ethernet Controller
+ 105b 82546GB Gigabit Ethernet Controller (Copper)
+ 105e 82571EB Gigabit Ethernet Controller
+ 103c 7044 NC360T PCI Express Dual Port Gigabit Server Adapter
+ 103c 704e Dual Port 1000Base-T (PCIe) [AD337A]
+ 1775 1100 CR11/VR11 Single Board Computer
+ 1775 6003 Telum GE-QT
+ 8086 005e PRO/1000 PT Dual Port Server Connection
+ 8086 105e PRO/1000 PT Dual Port Network Connection
+ 8086 10d5 82571PT Gigabit PT Quad Port Server ExpressModule
+ 8086 115e PRO/1000 PT Dual Port Server Adapter
+ 8086 125e PRO/1000 PT Dual Port Server Adapter
+ 8086 135e PRO/1000 PT Dual Port Server Adapter
+ 105f 82571EB Gigabit Ethernet Controller
+ 103c 704f Dual Port 1000Base-SX (PCIe) [AD338A]
+ 8086 005a PRO/1000 PF Dual Port Server Adapter
+ 8086 115f PRO/1000 PF Dual Port Server Adapter
+ 8086 125f PRO/1000 PF Dual Port Server Adapter
+ 8086 135f PRO/1000 PF Dual Port Server Adapter
+ 1060 82571EB Gigabit Ethernet Controller
+ 8086 0060 PRO/1000 PB Dual Port Server Connection
+ 8086 1060 PRO/1000 PB Dual Port Server Connection
+ 1064 82562ET/EZ/GT/GZ - PRO/100 VE (LOM) Ethernet Controller
+ 1043 80f8 P5GD1-VW Mainboard
+ 1065 82562ET/EZ/GT/GZ - PRO/100 VE Ethernet Controller
+ 1066 82562 EM/EX/GX - PRO/100 VM (LOM) Ethernet Controller
+ 1067 82562 EM/EX/GX - PRO/100 VM Ethernet Controller
+ 1068 82562ET/EZ/GT/GZ - PRO/100 VE (LOM) Ethernet Controller Mobile
+ 1069 82562EM/EX/GX - PRO/100 VM (LOM) Ethernet Controller Mobile
+ 106a 82562G - PRO/100 VE (LOM) Ethernet Controller
+ 106b 82562G - PRO/100 VE Ethernet Controller Mobile
+ 1075 82547GI Gigabit Ethernet Controller
+ 1028 0165 PowerEdge 750
+ 8086 0075 PRO/1000 CT Network Connection
+ 8086 1075 PRO/1000 CT Network Connection
+ 1076 82541GI Gigabit Ethernet Controller
+ 1028 0165 PRO/1000 MT Network Connection
+ 1028 016d PRO/1000 MT Network Connection
+ 1028 019a PRO/1000 MT Network Connection
+ 1028 106d PRO/1000 MT Network Connection
+ 8086 0076 PRO/1000 MT Network Connection
+ 8086 1076 PRO/1000 MT Network Connection
+ 8086 1176 PRO/1000 MT Desktop Adapter
+ 8086 1276 PRO/1000 MT Network Adapter
+ 1077 82541GI Gigabit Ethernet Controller
+ 1179 0001 PRO/1000 MT Mobile Connection
+ 8086 0077 PRO/1000 MT Mobile Connection
+ 8086 1077 PRO/1000 MT Mobile Connection
+ 1078 82541ER Gigabit Ethernet Controller
+ 8086 1078 82541ER-based Network Connection
+ 1079 82546GB Gigabit Ethernet Controller
+ 103c 12a6 Dual Port 1000Base-T [A9900A]
+ 103c 12cf Core Dual Port 1000Base-T [AB352A]
+ 1775 10d0 V5D Single Board Computer Gigabit Ethernet
+ 1775 ce90 CE9
+ 1fc1 0027 Niagara 2261 Failover NIC
+ 4c53 1090 Cx9 / Vx9 mainboard
+ 4c53 10b0 CL9 mainboard
+ 8086 0079 PRO/1000 MT Dual Port Network Connection
+ 8086 1079 PRO/1000 MT Dual Port Network Connection
+ 8086 1179 PRO/1000 MT Dual Port Server Adapter
+ 8086 117a PRO/1000 MT Dual Port Server Adapter
+ 107a 82546GB Gigabit Ethernet Controller
+ 103c 12a8 Dual Port 1000base-SX [A9899A]
+ 8086 107a PRO/1000 MF Dual Port Server Adapter
+ 8086 127a PRO/1000 MF Dual Port Server Adapter
+ 107b 82546GB Gigabit Ethernet Controller
+ 8086 007b PRO/1000 MB Dual Port Server Connection
+ 8086 107b PRO/1000 MB Dual Port Server Connection
+ 107c 82541PI Gigabit Ethernet Controller
+ 8086 1376 PRO/1000 GT Desktop Adapter
+ 8086 1476 PRO/1000 GT Desktop Adapter
+ 107d 82572EI Gigabit Ethernet Controller (Copper)
+ 8086 1082 PRO/1000 PT Server Adapter
+ 8086 1084 PRO/1000 PT Server Adapter
+ 8086 1092 PRO/1000 PT Server Adapter
+ 107e 82572EI Gigabit Ethernet Controller (Fiber)
+ 8086 1084 PRO/1000 PF Server Adapter
+ 8086 1085 PRO/1000 PF Server Adapter
+ 8086 1094 PRO/1000 PF Server Adapter
+ 107f 82572EI Gigabit Ethernet Controller
+ 1080 FA82537EP 56K V.92 Data/Fax Modem PCI
+ 1081 631xESB/632xESB LAN Controller Copper
+ 1082 631xESB/632xESB LAN Controller fiber
+ 1083 631xESB/632xESB LAN Controller SERDES
+ 1084 631xESB/632xESB IDE Redirection
+ 1085 631xESB/632xESB Serial Port Redirection
+ 1086 631xESB/632xESB IPMI/KCS0
+ 1087 631xESB/632xESB UHCI Redirection
+ 1089 631xESB/632xESB BT
+ 108a 82546GB Gigabit Ethernet Controller
+ 8086 108a PRO/1000 P Dual Port Server Adapter
+ 8086 118a PRO/1000 P Dual Port Server Adapter
+ 108b 82573V Gigabit Ethernet Controller (Copper)
+ 1462 176c on board on MSI 945P - NEO (MS-7176)
+ 108c 82573E Gigabit Ethernet Controller (Copper)
+ 108e 82573E KCS (Active Management)
+ 108f Active Management Technology - SOL
+ 1091 PRO/100 VM Network Connection
+ 1092 PRO/100 VE Network Connection
+ 1093 PRO/100 VM Network Connection
+ 1094 PRO/100 VE Network Connection
+ 1095 PRO/100 VE Network Connection
+ 1096 80003ES2LAN Gigabit Ethernet Controller (Copper)
+ 15d9 8680 X7DVL-E-O motherboard
+ 8086 3476 Intel S5000PSLSATA Server Board
+ 1097 631xESB/632xESB DPT LAN Controller (Fiber)
+ 1098 80003ES2LAN Gigabit Ethernet Controller (Serdes)
+ 1099 82546GB Gigabit Ethernet Controller (Copper)
+ 8086 1099 PRO/1000 GT Quad Port Server Adapter
+ 109a 82573L Gigabit Ethernet Controller
+ 1179 ff10 PRO/1000 PL
+ 17aa 2001 ThinkPad T60
+ 17aa 207e ThinkPad X60s
+ 8086 109a PRO/1000 PL Network Connection
+ 8086 309c DeskTop Board D945GTP
+ 8086 30a5 DeskTop Board D975XBX
+ 109b 82546GB PRO/1000 GF Quad Port Server Adapter
+ 109e 82597EX 10GbE Ethernet Controller
+ 8086 a01f PRO/10GbE CX4 Server Adapter
+ 8086 a11f PRO/10GbE CX4 Server Adapter
+ 10a0 82571EB PRO/1000 AT Quad Port Bypass Adapter
+ 10a1 82571EB PRO/1000 AF Quad Port Bypass Adapter
+ 10a4 82571EB Gigabit Ethernet Controller
+ 8086 10a4 PRO/1000 PT Quad Port Server Adapter
+ 8086 11a4 PRO/1000 PT Quad Port Server Adapter
+ 10a5 82571EB Gigabit Ethernet Controller (Fiber)
+ 8086 10a5 PRO/1000 PF Quad Port Server Adapter
+ 8086 10a6 PRO/1000 PF Quad Port Server Adapter
+ 10a6 82599EB 10-Gigabit Dummy Function
+ 10a7 82575EB Gigabit Network Connection
+ 8086 10a8 82575EB Gigabit Riser Card
+ 10a9 82575EB Gigabit Backplane Connection
+ 10b0 82573L PRO/1000 PL Network Connection
+ 10b2 82573V PRO/1000 PM Network Connection
+ 10b3 82573E PRO/1000 PM Network Connection
+ 10b4 82573L PRO/1000 PL Network Connection
+ 10b5 82546GB Gigabit Ethernet Controller (Copper)
+ 103c 3109 NC340T PCI-X Quad-port Gigabit Server Adapter
+ 8086 1099 PRO/1000 GT Quad Port Server Adapter
+ 8086 1199 PRO/1000 GT Quad Port Server Adapter
+ 10b6 82598 10GbE PCI-Express Ethernet Controller
+ 10b9 82572EI Gigabit Ethernet Controller (Copper)
+ 103c 704a HP 110T PCIe Gigabit Server Adapter
+ 8086 1083 PRO/1000 PT Desktop Adapter
+ 8086 1093 PRO/1000 PT Desktop Adapter
+ 10ba 80003ES2LAN Gigabit Ethernet Controller (Copper)
+ 10bb 80003ES2LAN Gigabit Ethernet Controller (Serdes)
+ 10bc 82571EB Gigabit Ethernet Controller (Copper)
+ 103c 704b NC364T PCI Express Quad Port Gigabit Server Adapter
+ 108e 11bc x4 PCI-Express Quad Gigabit Ethernet UTP Low Profile Adapter
+ 8086 10bc PRO/1000 PT Quad Port LP Server Adapter
+ 8086 11bc PRO/1000 PT Quad Port LP Server Adapter
+ 10bd 82566DM-2 Gigabit Network Connection
+ 1028 0211 OptiPlex 755
+ 10bf 82567LF Gigabit Network Connection
+ 10c0 82562V-2 10/100 Network Connection
+ 1028 020d Inspiron 530
+ 10c2 82562G-2 10/100 Network Connection
+ 10c3 82562GT-2 10/100 Network Connection
+ 10c4 82562GT 10/100 Network Connection
+ 10c5 82562G 10/100 Network Connection
+ 10c6 82598EB 10-Gigabit AF Dual Port Network Connection
+ 8086 a05f 10-Gigabit XF SR Dual Port Server Adapter
+ 8086 a15f 10-Gigabit XF SR Dual Port Server Adapter
+ 10c7 82598EB 10-Gigabit AF Network Connection
+ 1014 037f 10-Gigabit XF SR Server Adapter
+ 1014 0380 10-Gigabit XF LR Server Adapter
+ 8086 a05f 10-Gigabit XF SR Server Adapter
+ 8086 a15f 10-Gigabit XF SR Server Adapter
+ 8086 a16f 10-Gigabit XF SR Server Adapter
+ 10c8 82598EB 10-Gigabit AT Network Connection
+ 8086 a10c 10-Gigabit AT Server Adapter
+ 8086 a11c 10-Gigabit AT Server Adapter
+ 8086 a12c 10-Gigabit AT Server Adapter
+ 10c9 82576 Gigabit Network Connection
+ 103c 31ef NC362i Integrated Dual port Gigabit Server Adapter
+ 103c 323f NC362i Integrated Dual port Gigabit Server Adapter
+ 10a9 8028 UV-BaseIO dual-port GbE
+ 13a3 0037 DS4100 Secure Multi-Gigabit Server Adapter with Compression
+ 8086 a01c Gigabit ET Dual Port Server Adapter
+ 8086 a03c Gigabit ET Dual Port Server Adapter
+ 8086 a04c Gigabit ET Dual Port Server Adapter
+ 10ca 82576 Virtual Function
+ 10cb 82567V Gigabit Network Connection
+ 10cc 82567LM-2 Gigabit Network Connection
+ 10cd 82567LF-2 Gigabit Network Connection
+ 10ce 82567V-2 Gigabit Network Connection
+ 10d3 82574L Gigabit Network Connection
+ 103c 3250 NC112T PCI Express single Port Gigabit Server Adapter
+ 10a9 8029 Prism XL Single Port Gigabit Ethernet
+ 8086 0001 Gigabit CT2 Desktop Adapter
+ 8086 a01f Gigabit CT Desktop Adapter
+ e4bf 50c1 PC1-GROOVE
+ 10d5 82571PT Gigabit PT Quad Port Server ExpressModule
+ 10d6 82575GB Gigabit Network Connection
+ 8086 10d6 Gigabit VT Quad Port Server Adapter
+ 8086 145a Gigabit VT Quad Port Server Adapter
+ 8086 147a Gigabit VT Quad Port Server Adapter
+ 10d8 82599EB 10 Gigabit Unprogrammed
+ 10d9 82571EB Dual Port Gigabit Mezzanine Adapter
+ 103c 1716 NC360m Dual Port 1GbE BL-c Adapter
+ 10da 82571EB Quad Port Gigabit Mezzanine Adapter
+ 103c 1717 NC364m Quad Port 1GbE BL-c Adapter
+ 10db 82598EB 10-Gigabit Dual Port Network Connection
+ 10dd 82598EB 10-Gigabit AT CX4 Network Connection
+ 10de 82567LM-3 Gigabit Network Connection
+ 10df 82567LF-3 Gigabit Network Connection
+ 10e1 82598EB 10-Gigabit AF Dual Port Network Connection
+ 8086 a15f 10-Gigabit SR Dual Port Express Module
+ 10e2 82575GB Gigabit Network Connection
+ 8086 10e2 Gigabit VT Quad Port Server Adapter
+ 10e5 82567LM-4 Gigabit Network Connection
+ 10e6 82576 Gigabit Network Connection
+ 8086 a01f Gigabit EF Dual Port Server Adapter
+ 8086 a02f Gigabit EF Dual Port Server Adapter
+ 10e7 82576 Gigabit Network Connection
+ 103c 31ff NC362i Integrated Dual Port BL-c Gigabit Server Adapter
+ 10e8 82576 Gigabit Network Connection
+ 8086 a02b Gigabit ET Quad Port Server Adapter
+ 8086 a02c Gigabit ET Quad Port Server Adapter
+ 10ea 82577LM Gigabit Network Connection
+ 1028 040b Latitude E6510
+ e4bf 50c1 PC1-GROOVE
+ 10eb 82577LC Gigabit Network Connection
+ 10ec 82598EB 10-Gigabit AT CX4 Network Connection
+ 8086 a01f 10-Gigabit CX4 Dual Port Server Adapter
+ 8086 a11f 10-Gigabit CX4 Dual Port Server Adapter
+ 10ed 82599 Ethernet Controller Virtual Function
+ 10ef 82578DM Gigabit Network Connection
+ 10f0 82578DC Gigabit Network Connection
+ 10f1 82598EB 10-Gigabit AF Dual Port Network Connection
+ 8086 a20f 10-Gigabit AF DA Dual Port Server Adapter
+ 8086 a21f 10-Gigabit AF DA Dual Port Server Adapter
+ 10f4 82598EB 10-Gigabit AF Network Connection
+ 8086 106f 10-Gigabit XF LR Server Adapter
+ 8086 a06f 10-Gigabit XF LR Server Adapter
+ 10f5 82567LM Gigabit Network Connection
+ 10f6 82574L Gigabit Network Connection
+ 10f7 82599EB 10-Gigabit KX4 Network Connection
+ 108e 7b12 Sun Dual 10GbE PCIe 2.0 FEM
+ 8086 000d Ethernet Mezzanine Adapter X520-KX4-2
+ 10f8 82599EB 10 Gigabit Dual Port Backplane Connection
+ 1028 1f63 10GbE 2P X520k bNDC
+ 8086 000c Ethernet X520 10GbE Dual Port KX4-KR Mezz
+ 10f9 82599EB 10 Gigabit CX4 Dual Port Network Connection
+ 10fb 82599EB 10-Gigabit SFI/SFP+ Network Connection
+ 108e 7b11 Ethernet Server Adapter X520-2
+ 1734 11a9 10 Gigabit Dual Port Network Connection
+ 8086 0002 Ethernet Server Adapter X520-DA2
+ 8086 0003 Ethernet Server Adapter X520-2
+ 8086 0006 Ethernet Server Adapter X520-1
+ 8086 000a Ethernet Server Adapter X520-1
+ 8086 000c Ethernet Server Adapter X520-2
+ 8086 7a11 Ethernet Server Adapter X520-2
+ 10fc 82599EB 10-Gigabit XAUI/BX4 Network Connection
+ 10fe 82552 10/100 Network Connection
+ 1107 PRO/1000 MF Server Adapter (LX)
+ 1130 82815 815 Chipset Host Bridge and Memory Controller Hub
+ 1025 1016 Travelmate 612 TX
+ 1043 8027 TUSL2-C Mainboard
+ 104d 80df Vaio PCG-FX403
+ 8086 4532 D815EEA2 mainboard
+ 8086 4557 D815EGEW Mainboard
+ 1131 82815 815 Chipset AGP Bridge
+ 1132 82815 Chipset Graphics Controller (CGC)
+ 1025 1016 Travelmate 612 TX
+ 103c 2001 e-pc 40
+ 104d 80df Vaio PCG-FX403
+ 8086 4532 D815EEA2 Mainboard
+ 8086 4541 D815EEA Motherboard
+ 8086 4557 D815EGEW Mainboard
+ 1161 82806AA PCI64 Hub Advanced Programmable Interrupt Controller
+ 8086 1161 82806AA PCI64 Hub APIC
+ 1162 Xscale 80200 Big Endian Companion Chip
+ 1200 IXP1200 Network Processor
+ 172a 0000 AEP SSL Accelerator
+ 1209 8255xER/82551IT Fast Ethernet Controller
+ 140b 0610 PMC610 quad Ethernet board
+ 4c53 1050 CT7 mainboard
+ 4c53 1051 CE7 mainboard
+ 4c53 1070 PC6 mainboard
+ 1221 82092AA PCI to PCMCIA Bridge
+ 1222 82092AA IDE Controller
+ 1223 SAA7116
+ 1225 82452KX/GX [Orion]
+ 1226 82596 PRO/10 PCI
+ 1227 82865 EtherExpress PRO/100A
+ 1228 82556 EtherExpress PRO/100 Smart
+ 1229 82557/8/9/0/1 Ethernet Pro 100
+ 0e11 3001 82559 Fast Ethernet LOM with Alert on LAN*
+ 0e11 3002 82559 Fast Ethernet LOM with Alert on LAN*
+ 0e11 3003 82559 Fast Ethernet LOM with Alert on LAN*
+ 0e11 3004 82559 Fast Ethernet LOM with Alert on LAN*
+ 0e11 3005 82559 Fast Ethernet LOM with Alert on LAN*
+ 0e11 3006 82559 Fast Ethernet LOM with Alert on LAN*
+ 0e11 3007 82559 Fast Ethernet LOM with Alert on LAN*
+ 0e11 b01e NC3120 Fast Ethernet NIC
+ 0e11 b01f NC3122 Fast Ethernet NIC (dual port)
+ 0e11 b02f NC1120 Ethernet NIC
+ 0e11 b04a Netelligent 10/100TX NIC with Wake on LAN
+ 0e11 b0c6 NC3161 Fast Ethernet NIC (embedded, WOL)
+ 0e11 b0c7 NC3160 Fast Ethernet NIC (embedded)
+ 0e11 b0d7 NC3121 Fast Ethernet NIC (WOL)
+ 0e11 b0dd NC3131 Fast Ethernet NIC (dual port)
+ 0e11 b0de NC3132 Fast Ethernet Module (dual port)
+ 0e11 b0e1 NC3133 Fast Ethernet Module (100-FX)
+ 0e11 b134 NC3163 Fast Ethernet NIC (embedded, WOL)
+ 0e11 b13c NC3162 Fast Ethernet NIC (embedded)
+ 0e11 b144 NC3123 Fast Ethernet NIC (WOL)
+ 0e11 b163 NC3134 Fast Ethernet NIC (dual port)
+ 0e11 b164 NC3135 Fast Ethernet Upgrade Module (dual port)
+ 0e11 b1a4 NC7131 Gigabit Server Adapter
+ 1014 005c 82558B Ethernet Pro 10/100
+ 1014 01bc 82559 Fast Ethernet LAN On Motherboard
+ 1014 01f1 10/100 Ethernet Server Adapter
+ 1014 01f2 10/100 Ethernet Server Adapter
+ 1014 0207 Ethernet Pro/100 S
+ 1014 0232 10/100 Dual Port Server Adapter
+ 1014 023a ThinkPad R30
+ 1014 105c Netfinity 10/100
+ 1014 2205 ThinkPad A22p
+ 1014 305c 10/100 EtherJet Management Adapter
+ 1014 405c 10/100 EtherJet Adapter with Alert on LAN
+ 1014 505c 10/100 EtherJet Secure Management Adapter
+ 1014 605c 10/100 EtherJet Secure Management Adapter
+ 1014 705c 10/100 Netfinity 10/100 Ethernet Security Adapter
+ 1014 805c 10/100 Netfinity 10/100 Ethernet Security Adapter
+ 1028 009b 10/100 Ethernet Server Adapter
+ 1028 00ce 10/100 Ethernet Server Adapter
+ 1033 8000 PC-9821X-B06
+ 1033 8016 PK-UG-X006
+ 1033 801f PK-UG-X006
+ 1033 8026 PK-UG-X006
+ 1033 8063 82559-based Fast Ethernet Adapter
+ 1033 8064 82559-based Fast Ethernet Adapter
+ 103c 10c0 NetServer 10/100TX
+ 103c 10c3 NetServer 10/100TX
+ 103c 10ca NetServer 10/100TX
+ 103c 10cb NetServer 10/100TX
+ 103c 10e3 NetServer 10/100TX
+ 103c 10e4 NetServer 10/100TX
+ 103c 1200 NetServer 10/100TX
+ 108e 10cf EtherExpress PRO/100(B)
+ 10c3 1100 SmartEther100 SC1100
+ 10cf 1115 8255x-based Ethernet Adapter (10/100)
+ 10cf 1143 8255x-based Ethernet Adapter (10/100)
+ 110a 008b 82551QM Fast Ethernet Multifuction PCI/CardBus Controller
+ 114a 0582 PC8 onboard ethernet ETH2
+ 1179 0001 8255x-based Ethernet Adapter (10/100)
+ 1179 0002 PCI FastEther LAN on Docker
+ 1179 0003 8255x-based Fast Ethernet
+ 1259 2560 AT-2560 100
+ 1259 2561 AT-2560 100 FX Ethernet Adapter
+ 1266 0001 NE10/100 Adapter
+ 13e9 1000 6221L-4U
+ 144d 2501 SEM-2000 MiniPCI LAN Adapter
+ 144d 2502 SEM-2100IL MiniPCI LAN Adapter
+ 1668 1100 EtherExpress PRO/100B (TX) (MiniPCI Ethernet+Modem)
+ 1775 1100 CR11/VR11 Single Board Computer
+ 1775 ce90 CE9
+ 4c53 1080 CT8 mainboard
+ 4c53 10e0 PSL09 PrPMC
+ 8086 0001 EtherExpress PRO/100B (TX)
+ 8086 0002 EtherExpress PRO/100B (T4)
+ 8086 0003 EtherExpress PRO/10+
+ 8086 0004 EtherExpress PRO/100 WfM
+ 8086 0005 82557 10/100
+ 8086 0006 82557 10/100 with Wake on LAN
+ 8086 0007 82558 10/100 Adapter
+ 8086 0008 82558 10/100 with Wake on LAN
+ 8086 0009 82558B PRO/100+ PCI (TP)
+ 8086 000a EtherExpress PRO/100+ Management Adapter
+ 8086 000b EtherExpress PRO/100+
+ 8086 000c EtherExpress PRO/100+ Management Adapter
+ 8086 000d EtherExpress PRO/100+ Alert On LAN II* Adapter
+ 8086 000e EtherExpress PRO/100+ Management Adapter with Alert On LAN*
+ 8086 000f EtherExpress PRO/100 Desktop Adapter
+ 8086 0010 EtherExpress PRO/100 S Management Adapter
+ 8086 0011 EtherExpress PRO/100 S Management Adapter
+ 8086 0012 EtherExpress PRO/100 S Advanced Management Adapter (D)
+ 8086 0013 EtherExpress PRO/100 S Advanced Management Adapter (E)
+ 8086 0030 EtherExpress PRO/100 Management Adapter with Alert On LAN* GC
+ 8086 0031 EtherExpress PRO/100 Desktop Adapter
+ 8086 0040 EtherExpress PRO/100 S Desktop Adapter
+ 8086 0041 EtherExpress PRO/100 S Desktop Adapter
+ 8086 0042 EtherExpress PRO/100 Desktop Adapter
+ 8086 0050 EtherExpress PRO/100 S Desktop Adapter
+ 8086 1009 EtherExpress PRO/100+ Server Adapter
+ 8086 100c EtherExpress PRO/100+ Server Adapter (PILA8470B)
+ 8086 1012 EtherExpress PRO/100 S Server Adapter (D)
+ 8086 1013 EtherExpress PRO/100 S Server Adapter (E)
+ 8086 1015 EtherExpress PRO/100 S Dual Port Server Adapter
+ 8086 1017 EtherExpress PRO/100+ Dual Port Server Adapter
+ 8086 1030 EtherExpress PRO/100+ Management Adapter with Alert On LAN* G Server
+ 8086 1040 EtherExpress PRO/100 S Server Adapter
+ 8086 1041 EtherExpress PRO/100 S Server Adapter
+ 8086 1042 EtherExpress PRO/100 Server Adapter
+ 8086 1050 EtherExpress PRO/100 S Server Adapter
+ 8086 1051 EtherExpress PRO/100 Server Adapter
+ 8086 1052 EtherExpress PRO/100 Server Adapter
+ 8086 10f0 EtherExpress PRO/100+ Dual Port Adapter
+ 8086 1229 82557/8/9 [Ethernet Pro 100]
+ 8086 2009 EtherExpress PRO/100 S Mobile Adapter
+ 8086 200d EtherExpress PRO/100 Cardbus
+ 8086 200e EtherExpress PRO/100 LAN+V90 Cardbus Modem
+ 8086 200f EtherExpress PRO/100 SR Mobile Adapter
+ 8086 2010 EtherExpress PRO/100 S Mobile Combo Adapter
+ 8086 2013 EtherExpress PRO/100 SR Mobile Combo Adapter
+ 8086 2016 EtherExpress PRO/100 S Mobile Adapter
+ 8086 2017 EtherExpress PRO/100 S Combo Mobile Adapter
+ 8086 2018 EtherExpress PRO/100 SR Mobile Adapter
+ 8086 2019 EtherExpress PRO/100 SR Combo Mobile Adapter
+ 8086 2101 EtherExpress PRO/100 P Mobile Adapter
+ 8086 2102 EtherExpress PRO/100 SP Mobile Adapter
+ 8086 2103 EtherExpress PRO/100 SP Mobile Adapter
+ 8086 2104 EtherExpress PRO/100 SP Mobile Adapter
+ 8086 2105 EtherExpress PRO/100 SP Mobile Adapter
+ 8086 2106 EtherExpress PRO/100 P Mobile Adapter
+ 8086 2107 EtherExpress PRO/100 Network Connection
+ 8086 2108 EtherExpress PRO/100 Network Connection
+ 8086 2200 EtherExpress PRO/100 P Mobile Combo Adapter
+ 8086 2201 EtherExpress PRO/100 P Mobile Combo Adapter
+ 8086 2202 EtherExpress PRO/100 SP Mobile Combo Adapter
+ 8086 2203 EtherExpress PRO/100+ MiniPCI
+ 8086 2204 EtherExpress PRO/100+ MiniPCI
+ 8086 2205 EtherExpress PRO/100 SP Mobile Combo Adapter
+ 8086 2206 EtherExpress PRO/100 SP Mobile Combo Adapter
+ 8086 2207 EtherExpress PRO/100 SP Mobile Combo Adapter
+ 8086 2208 EtherExpress PRO/100 P Mobile Combo Adapter
+ 8086 2402 EtherExpress PRO/100+ MiniPCI
+ 8086 2407 EtherExpress PRO/100+ MiniPCI
+ 8086 2408 EtherExpress PRO/100+ MiniPCI
+ 8086 2409 EtherExpress PRO/100+ MiniPCI
+ 8086 240f EtherExpress PRO/100+ MiniPCI
+ 8086 2410 EtherExpress PRO/100+ MiniPCI
+ 8086 2411 EtherExpress PRO/100+ MiniPCI
+ 8086 2412 EtherExpress PRO/100+ MiniPCI
+ 8086 2413 EtherExpress PRO/100+ MiniPCI
+ 8086 3000 82559 Fast Ethernet LAN on Motherboard
+ 8086 3001 82559 Fast Ethernet LOM with Basic Alert on LAN*
+ 8086 3002 82559 Fast Ethernet LOM with Alert on LAN II*
+ 8086 3006 EtherExpress PRO/100 S Network Connection
+ 8086 3007 EtherExpress PRO/100 S Network Connection
+ 8086 3008 EtherExpress PRO/100 Network Connection
+ 8086 3010 EtherExpress PRO/100 S Network Connection
+ 8086 3011 EtherExpress PRO/100 S Network Connection
+ 8086 3012 EtherExpress PRO/100 Network Connection
+ 8086 301a S845WD1-E mainboard
+ 8086 3411 SDS2 Mainboard
+ 122d 430FX - 82437FX TSC [Triton I]
+ 122e 82371FB PIIX ISA [Triton I]
+ 1230 82371FB PIIX IDE [Triton I]
+ 1231 DSVD Modem
+ 1234 430MX - 82371MX Mobile PCI I/O IDE Xcelerator (MPIIX)
+ 1235 430MX - 82437MX Mob. System Ctrlr (MTSC) & 82438MX Data Path (MTDP)
+ 1237 440FX - 82441FX PMC [Natoma]
+ 1af4 1100 Qemu virtual machine
+ 1239 82371FB PIIX IDE Interface
+ 123b 82380PB PCI to PCI Docking Bridge
+ 123c 82380AB (MISA) Mobile PCI-to-ISA Bridge
+ 123d 683053 Programmable Interrupt Device
+ 123e 82466GX (IHPC) Integrated Hot-Plug Controller (hidden mode)
+ 123f 82466GX Integrated Hot-Plug Controller (IHPC)
+ 1240 82752 (752) AGP Graphics Accelerator
+ 124b 82380FB (MPCI2) Mobile Docking Controller
+ 1250 430HX - 82439HX TXC [Triton II]
+ 1360 82806AA PCI64 Hub PCI Bridge
+ 1361 82806AA PCI64 Hub Controller (HRes)
+ 8086 1361 82806AA PCI64 Hub Controller (HRes)
+ 8086 8000 82806AA PCI64 Hub Controller (HRes)
+ 1460 82870P2 P64H2 Hub PCI Bridge
+ 1461 82870P2 P64H2 I/OxAPIC
+ 15d9 3480 P4DP6
+ 4c53 1090 Cx9/Vx9 mainboard
+ 1462 82870P2 P64H2 Hot Plug Controller
+ 1501 82567V-3 Gigabit Network Connection
+ 1502 82579LM Gigabit Network Connection
+ 1503 82579V Gigabit Network Connection
+ 1043 849c P8P67 Deluxe Motherboard
+ 1507 82599EB 10 Gigabit Network Connection
+ 1508 82598EB Gigabit BX Network Connection
+ 150a 82576NS Gigabit Network Connection
+ 150b 82598EB 10-Gigabit AT2 Server Adapter
+ 8086 a10c 82598EB 10-Gigabit AT2 Server Adapter
+ 8086 a11c 82598EB 10-Gigabit AT2 Server Adapter
+ 8086 a12c 82598EB 10-Gigabit AT2 Server Adapter
+ 150c 82583V Gigabit Network Connection
+ 150d 82576 Gigabit Backplane Connection
+ 8086 a10c Gigabit ET Quad Port Mezzanine Card
+ 150e 82580 Gigabit Network Connection
+ 103c 1780 NC365T 4-port Ethernet Server Adapter
+ 8086 12a1 Ethernet Server Adapter I340-T4
+ 8086 12a2 Ethernet Server Adapter I340-T4
+ 150f 82580 Gigabit Fiber Network Connection
+ 1510 82580 Gigabit Backplane Connection
+ 1511 82580 Gigabit SFP Connection
+ 1514 82599EB 10 Gigabit KX4 Network Connection
+ 8086 000b Ethernet X520 10GbE Dual Port KX4 Mezz
+ 1516 82580 Gigabit Network Connection
+ 8086 12b1 Ethernet Server Adapter I340-T2
+ 8086 12b2 Ethernet Server Adapter I340-T2
+ 1517 82599ES 10 Gigabit Network Connection
+ 1137 006a UCS CNA M61KR-I Intel Converged Network Adapter
+ 1518 82576NS SerDes Gigabit Network Connection
+ 151c 82599EB 10 Gigabit TN Network Connection
+ 108e 7b13 Dual 10GBASE-T LP
+ 1521 I350 Gigabit Network Connection
+ 1028 1f60 Intel GbE 4P I350crNDC
+ 1028 1f62 Intel GbE 2P I350crNDC
+ 10a9 802a UV2-BaseIO dual-port GbE
+ 8086 0001 Ethernet Server Adapter I350-T4
+ 8086 0002 Ethernet Server Adapter I350-T2
+ 8086 00a1 Ethernet Server Adapter I350-T4
+ 8086 00a2 Ethernet Server Adapter I350-T2
+ 8086 5001 Ethernet Server Adapter I350-T4
+ 8086 5002 Ethernet Server Adapter I350-T2
+ 1522 I350 Gigabit Fiber Network Connection
+ 8086 0002 Ethernet Server Adapter I350-T2
+ 8086 0003 Ethernet Server Adapter I350-F4
+ 8086 0004 Ethernet Server Adapter I350-F2
+ 8086 00a3 Ethernet Server Adapter I350-F4
+ 8086 00a4 Ethernet Server Adapter I350-F2
+ 1523 I350 Gigabit Backplane Connection
+ 8086 1f52 1GbE 4P I350 Mezz
+ 1524 I350 Gigabit Connection
+ 1525 82567V-4 Gigabit Network Connection
+ 1526 82576 Gigabit Network Connection
+ 8086 a05c Gigabit ET2 Quad Port Server Adapter
+ 8086 a06c Gigabit ET2 Quad Port Server Adapter
+ 1527 82580 Gigabit Fiber Network Connection
+ 8086 0001 Ethernet Server Adapter I340-F4
+ 8086 0002 Ethernet Server Adapter I340-F4
+ 1528 Ethernet Controller 10 Gigabit X540-AT2
+ 8086 0001 Ethernet Server Adapter X540-T2
+ 8086 0002 Ethernet Server Adapter X540-T1
+ 8086 001a Ethernet Server Adapter X540-T2
+ 8086 00a2 Ethernet Server Adapter X540-T1
+ 8086 5003 Ethernet Server Adapter X540-T2
+ 1529 82599 10 Gigabit Dual Port Backplane Connection with FCoE
+ 152a 82599 10 Gigabit Dual port Network Connection with FCoE
+ 154d 82599EB 10-Gigabit SFP+ Network Connection
+ 8086 7b11 10GbE 2P X520 Adapter
+ 1960 80960RP (i960RP) Microprocessor
+ 101e 0431 MegaRAID 431 RAID Controller
+ 101e 0438 MegaRAID 438 Ultra2 LVD RAID Controller
+ 101e 0466 MegaRAID 466 Express Plus RAID Controller
+ 101e 0467 MegaRAID 467 Enterprise 1500 RAID Controller
+ 101e 0490 MegaRAID 490 Express 300 RAID Controller
+ 101e 0762 MegaRAID 762 Express RAID Controller
+ 101e 09a0 PowerEdge Expandable RAID Controller 2/SC
+ 1028 0467 PowerEdge Expandable RAID Controller 2/DC
+ 1028 1111 PowerEdge Expandable RAID Controller 2/SC
+ 103c 03a2 MegaRAID
+ 103c 10c6 MegaRAID 438, NetRAID-3Si
+ 103c 10c7 MegaRAID T5, Integrated NetRAID
+ 103c 10cc MegaRAID, Integrated NetRAID
+ 103c 10cd NetRAID-1Si
+ 105a 0000 SuperTrak
+ 105a 2168 SuperTrak Pro
+ 105a 5168 SuperTrak66/100
+ 1111 1111 MegaRAID 466, PowerEdge Expandable RAID Controller 2/SC
+ 1111 1112 PowerEdge Expandable RAID Controller 2/SC
+ 113c 03a2 MegaRAID
+ e4bf 1010 CG1-RADIO
+ e4bf 1020 CU2-QUARTET
+ e4bf 1040 CU1-CHORUS
+ e4bf 3100 CX1-BAND
+ 1962 80960RM (i960RM) Microprocessor
+ 105a 0000 SuperTrak SX6000 I2O CPU
+ 1a21 82840 840 [Carmel] Chipset Host Bridge (Hub A)
+ 1a23 82840 840 [Carmel] Chipset AGP Bridge
+ 1a24 82840 840 [Carmel] Chipset PCI Bridge (Hub B)
+ 1a30 82845 845 [Brookdale] Chipset Host Bridge
+ 1028 010e Optiplex GX240
+ 15d9 3280 Supermicro P4SBE Mainboard
+ 1a31 82845 845 [Brookdale] Chipset AGP Bridge
+ 1a38 5000 Series Chipset DMA Engine
+ 15d9 8680 X7DVL-E-O motherboard
+ 8086 3476 Intel S5000PSLSATA Server Board
+ 1a48 82597EX 10GbE Ethernet Controller
+ 8086 a01f PRO/10GbE SR Server Adapter
+ 8086 a11f PRO/10GbE SR Server Adapter
+ 1b48 82597EX 10GbE Ethernet Controller
+ 8086 a01f PRO/10GbE LR Server Adapter
+ 8086 a11f PRO/10GbE LR Server Adapter
+ 1c00 6 Series/C200 Series Chipset Family 4 port SATA IDE Controller
+ 1c01 6 Series/C200 Series Chipset Family 4 port SATA IDE Controller
+ 1c02 6 Series/C200 Series Chipset Family 6 port SATA AHCI Controller
+ 1028 04aa XPS 8300
+ 1043 844d P8P67 Deluxe Motherboard
+ 1c03 6 Series/C200 Series Chipset Family 6 port SATA AHCI Controller
+ 1c04 6 Series/C200 Series Chipset Family SATA RAID Controller
+ 1c05 6 Series/C200 Series Chipset Family SATA RAID Controller
+ 1c08 6 Series/C200 Series Chipset Family 2 port SATA IDE Controller
+ 1c09 6 Series/C200 Series Chipset Family 2 port SATA IDE Controller
+ 1c10 6 Series/C200 Series Chipset Family PCI Express Root Port 1
+ 1c12 6 Series/C200 Series Chipset Family PCI Express Root Port 2
+ 1c14 6 Series/C200 Series Chipset Family PCI Express Root Port 3
+ 1c16 6 Series/C200 Series Chipset Family PCI Express Root Port 4
+ 1c18 6 Series/C200 Series Chipset Family PCI Express Root Port 5
+ 1c1a 6 Series/C200 Series Chipset Family PCI Express Root Port 6
+ 1c1c 6 Series/C200 Series Chipset Family PCI Express Root Port 7
+ 1c1e 6 Series/C200 Series Chipset Family PCI Express Root Port 8
+ 1c20 6 Series/C200 Series Chipset Family High Definition Audio Controller
+ 1028 04aa XPS 8300
+ 1043 8418 P8P67 Deluxe Motherboard
+ 1c22 6 Series/C200 Series Chipset Family SMBus Controller
+ 1028 04aa XPS 8300
+ 1043 844d P8P67 Deluxe Motherboard
+ 1c24 6 Series/C200 Series Chipset Family Thermal Management Controller
+ 1c25 6 Series/C200 Series Chipset Family DMI to PCI Bridge
+ 1c26 6 Series/C200 Series Chipset Family USB Enhanced Host Controller #1
+ 1028 04aa XPS 8300
+ 1043 844d P8P67 Deluxe Motherboard
+ 1c2d 6 Series/C200 Series Chipset Family USB Enhanced Host Controller #2
+ 1028 04aa XPS 8300
+ 1043 844d P8P67 Deluxe Motherboard
+ 1c33 6 Series/C200 Series Chipset Family LAN Controller
+ 1c35 6 Series/C200 Series Chipset Family VECI Controller
+ 1c3a 6 Series/C200 Series Chipset Family MEI Controller #1
+ 1028 04aa XPS 8300
+ 1043 844d P8P67 Deluxe Motherboard
+ 1c3b 6 Series/C200 Series Chipset Family MEI Controller #2
+ 1c3c 6 Series/C200 Series Chipset Family IDE-r Controller
+ 1c3d 6 Series/C200 Series Chipset Family KT Controller
+ 1c40 6 Series/C200 Series Chipset Family LPC Controller
+ 1c41 Mobile SFF 6 Series Chipset Family LPC Controller
+ 1c42 6 Series/C200 Series Chipset Family LPC Controller
+ 1c43 Mobile 6 Series Chipset Family LPC Controller
+ 1c44 Z68 Express Chipset Family LPC Controller
+ 1c45 6 Series/C200 Series Chipset Family LPC Controller
+ 1c46 P67 Express Chipset Family LPC Controller
+ 1043 844d P8P67 Deluxe Motherboard
+ 1c47 UM67 Express Chipset Family LPC Controller
+ 1c48 6 Series/C200 Series Chipset Family LPC Controller
+ 1c49 HM65 Express Chipset Family LPC Controller
+ 1c4a H67 Express Chipset Family LPC Controller
+ 1028 04aa XPS 8300
+ 1c4b HM67 Express Chipset Family LPC Controller
+ 1c4c Q65 Express Chipset Family LPC Controller
+ 1c4d QS67 Express Chipset Family LPC Controller
+ 1c4e Q67 Express Chipset Family LPC Controller
+ 1c4f QM67 Express Chipset Family LPC Controller
+ 1c50 B65 Express Chipset Family LPC Controller
+ 1c51 6 Series/C200 Series Chipset Family LPC Controller
+ 1c52 C202 Chipset Family LPC Controller
+ 1c53 6 Series/C200 Series Chipset Family LPC Controller
+ 1c54 C204 Chipset Family LPC Controller
+ 1c55 6 Series/C200 Series Chipset Family LPC Controller
+ 1c56 C206 Chipset Family LPC Controller
+ 1c57 6 Series/C200 Series Chipset Family LPC Controller
+ 1c58 Upgraded B65 Express Chipset Family LPC Controller
+ 1c59 Upgraded HM67 Express Chipset Family LPC Controller
+ 1c5a Upgraded Q67 Express Chipset Family LPC Controller
+ 1c5b 6 Series/C200 Series Chipset Family LPC Controller
+ 1c5c H61 Express Chipset Family LPC Controller
+ 1c5d 6 Series/C200 Series Chipset Family LPC Controller
+ 1c5e 6 Series/C200 Series Chipset Family LPC Controller
+ 1c5f 6 Series/C200 Series Chipset Family LPC Controller
+ 1d00 Patsburg 4-Port SATA IDE Controller
+ 1d02 Patsburg 6-Port SATA AHCI Controller
+ 1d04 Patsburg SATA RAID Controller
+ 1d06 Patsburg SATA Premium RAID Controller
+ 1d08 Patsburg 2-Port SATA IDE Controller
+ 1d10 Patsburg PCI Express Root Port 1
+ 1d11 Patsburg PCI Express Root Port 1
+ 1d12 Patsburg PCI Express Root Port 2
+ 1d13 Patsburg PCI Express Root Port 2
+ 1d14 Patsburg PCI Express Root Port 3
+ 1d15 Patsburg PCI Express Root Port 3
+ 1d16 Patsburg PCI Express Root Port 4
+ 1d17 Patsburg PCI Express Root Port 4
+ 1d18 Patsburg PCI Express Root Port 5
+ 1d19 Patsburg PCI Express Root Port 5
+ 1d1a Patsburg PCI Express Root Port 6
+ 1d1b Patsburg PCI Express Root Port 6
+ 1d1c Patsburg PCI Express Root Port 7
+ 1d1d Patsburg PCI Express Root Port 7
+ 1d1e Patsburg PCI Express Root Port 8
+ 1d1f Patsburg PCI Express Root Port 8
+ 1d20 Patsburg High Definition Audio Controller
+ 1d22 Patsburg SMBus Host Controller
+ 1d24 Patsburg Thermal Management Controller
+ 1d25 Patsburg DMI to PCI Bridge
+ 1d26 Patsburg USB2 Enhanced Host Controller #1
+ 1d2d Patsburg USB2 Enhanced Host Controller #2
+ 1d33 Patsburg LAN Controller
+ 1d35 Patsburg VECI Controller
+ 1d3a Patsburg MEI Controller #1
+ 1d3b Patsburg MEI Controller #2
+ 1d3c Patsburg IDE-r Controller
+ 1d3d Patsburg KT Controller
+ 1d3e Patsburg PCI Express Virtual Root Port
+ 1d3f Patsburg PCI Express Virtual Switch Port
+ 1d40 Patsburg LPC Controller
+ 1d41 Patsburg LPC Controller
+ 1d50 Patsburg Dual 4-Port SATA/SAS Storage Control Unit
+ 1d54 Patsburg Dual 4-Port SATA/SAS Storage Control Unit
+ 1d55 Patsburg 4-Port SATA/SAS Storage Control Unit
+ 1d58 Patsburg Dual 4-Port SATA/SAS Storage Control Unit
+ 1d59 Patsburg 4-Port SATA/SAS Storage Control Unit
+ 1d5b Patsburg 4-Port SATA Storage Control Unit
+ 1d60 Patsburg Dual 4-Port SATA/SAS Storage Control Unit
+ 1d61 Patsburg SAS Storage Control Unit 1
+ 1d64 Patsburg Dual 4-Port SATA/SAS Storage Control Unit
+ 1d65 Patsburg 4-Port SATA/SAS Storage Control Unit
+ 1d68 Patsburg Dual 4-Port SATA/SAS Storage Control Unit
+ 1d69 Patsburg 4-Port SATA/SAS Storage Control Unit
+ 1d6b Patsburg 4-Port SATA Storage Control Unit
+ 1d70 Patsburg SMBus Controller 0
+ 1d71 Patsburg SMBus Controller 1
+ 1d72 Patsburg SMBus Controller 2
+ 1d73 Patsburg Integrated NVSRAM Controller
+ 1d74 Patsburg PCI Express Upstream Port
+ 1d76 Patsburg Multi-Function Glue
+ 1e00 Panther Point 4 port SATA IDE Controller
+ 1e01 Panther Point 4 port SATA IDE Controller
+ 1e02 Panther Point 6 port SATA AHCI Controller
+ 1e03 Panther Point 6 port SATA AHCI Controller
+ 1e04 Panther Point SATA RAID Controller
+ 1e05 Panther Point SATA RAID Controller
+ 1e06 Panther Point SATA Premium RAID Controller
+ 1e07 Panther Point SATA Premium RAID Controller
+ 1e08 Panther Point 2 port SATA IDE Controller
+ 1e09 Panther Point 2 port SATA IDE Controller
+ 1e10 Panther Point PCI Express Root Port 1
+ 1e12 Panther Point PCI Express Root Port 2
+ 1e14 Panther Point PCI Express Root Port 3
+ 1e16 Panther Point PCI Express Root Port 4
+ 1e18 Panther Point PCI Express Root Port 5
+ 1e1a Panther Point PCI Express Root Port 6
+ 1e1c Panther Point PCI Express Root Port 7
+ 1e1e Panther Point PCI Express Root Port 8
+ 1e20 Panther Point High Definition Audio Controller
+ 1e22 Panther Point SMBus Controller
+ 1e24 Panther Point Thermal Management Controller
+ 1e25 Panther Point DMI to PCI Bridge
+ 1e26 Panther Point USB Enhanced Host Controller #1
+ 1e2d Panther Point USB Enhanced Host Controller #2
+ 1e31 Panther Point USB xHCI Host Controller
+ 1e33 Panther Point LAN Controller
+ 1e3a Panther Point MEI Controller #1
+ 1e3b Panther Point MEI Controller #2
+ 1e3c Panther Point IDE-r Controller
+ 1e3d Panther Point KT Controller
+ 1e40 Panther Point LPC Controller
+ 1e41 Panther Point LPC Controller
+ 1e42 Panther Point LPC Controller
+ 1e43 Panther Point LPC Controller
+ 1e44 Panther Point LPC Controller
+ 1e45 Panther Point LPC Controller
+ 1e46 Panther Point LPC Controller
+ 1e47 Panther Point LPC Controller
+ 1e48 Panther Point LPC Controller
+ 1e49 Panther Point LPC Controller
+ 1e4a Panther Point LPC Controller
+ 1e4b Panther Point LPC Controller
+ 1e4c Panther Point LPC Controller
+ 1e4d Panther Point LPC Controller
+ 1e4e Panther Point LPC Controller
+ 1e4f Panther Point LPC Controller
+ 1e50 Panther Point LPC Controller
+ 1e51 Panther Point LPC Controller
+ 1e52 Panther Point LPC Controller
+ 1e53 Panther Point LPC Controller
+ 1e54 Panther Point LPC Controller
+ 1e55 Panther Point LPC Controller
+ 1e56 Panther Point LPC Controller
+ 1e57 Panther Point LPC Controller
+ 1e58 Panther Point LPC Controller
+ 1e59 Panther Point LPC Controller
+ 1e5a Panther Point LPC Controller
+ 1e5b Panther Point LPC Controller
+ 1e5c Panther Point LPC Controller
+ 1e5d Panther Point LPC Controller
+ 1e5e Panther Point LPC Controller
+ 1e5f Panther Point LPC Controller
+ 2310 DH89xxCC LPC Controller
+ 2323 DH89xxCC 4 Port SATA AHCI Controller
+ 2330 DH89xxCC SMBus Controller
+ 2331 DH89xxCC Chap Counter
+ 2332 DH89xxCC Thermal Subsystem
+ 2334 DH89xxCC USB2 Enhanced Host Controller #1
+ 2335 DH89xxCC USB2 Enhanced Host Controller #1
+ 2342 DH89xxCC PCI Express Root Port #1
+ 2343 DH89xxCC PCI Express Root Port #1
+ 2344 DH89xxCC PCI Express Root Port #2
+ 2345 DH89xxCC PCI Express Root Port #2
+ 2346 DH89xxCC PCI Express Root Port #3
+ 2347 DH89xxCC PCI Express Root Port #3
+ 2348 DH89xxCC PCI Express Root Port #4
+ 2349 DH89xxCC PCI Express Root Port #4
+ 2360 DH89xxCC Watchdog Timer
+ 2364 DH89xxCC MEI 0
+ 2365 DH89xxCC MEI 1
+ 2410 82801AA ISA Bridge (LPC)
+ 2411 82801AA IDE Controller
+ 2412 82801AA USB Controller
+ 2413 82801AA SMBus Controller
+ 2415 82801AA AC'97 Audio Controller
+ 1028 0095 Precision Workstation 220 Integrated Digital Audio
+ 1028 00b4 OptiPlex GX110
+ 110a 0051 Activy 2xx
+ 11d4 0040 SoundMAX Integrated Digital Audio
+ 11d4 0048 SoundMAX Integrated Digital Audio
+ 11d4 5340 SoundMAX Integrated Digital Audio
+ 1734 1025 Activy 3xx
+ 2416 82801AA AC'97 Modem Controller
+ 2418 82801AA PCI Bridge
+ 2420 82801AB ISA Bridge (LPC)
+ 2421 82801AB IDE Controller
+ 2422 82801AB USB Controller
+ 2423 82801AB SMBus Controller
+ 2425 82801AB AC'97 Audio Controller
+ 11d4 0040 SoundMAX Integrated Digital Audio
+ 11d4 0048 SoundMAX Integrated Digital Audio
+ 2426 82801AB AC'97 Modem Controller
+ 2428 82801AB PCI Bridge
+ 2440 82801BA ISA Bridge (LPC)
+ 8086 5744 S845WD1-E
+ 2442 82801BA/BAM USB Controller #1
+ 1014 01c6 Netvista A40/A40p
+ 1025 1016 Travelmate 612 TX
+ 1028 00c7 Dimension 8100
+ 1028 00d8 Precision 530
+ 1028 010e Optiplex GX240
+ 103c 126f e-pc 40
+ 1043 8027 TUSL2-C Mainboard
+ 104d 80df Vaio PCG-FX403
+ 147b 0507 TH7II-RAID
+ 8086 4532 D815EEA2 mainboard
+ 8086 4557 D815EGEW Mainboard
+ 8086 5744 S845WD1-E mainboard
+ 2443 82801BA/BAM SMBus Controller
+ 1014 01c6 Netvista A40/A40p
+ 1025 1016 Travelmate 612 TX
+ 1028 00c7 Dimension 8100
+ 1028 00d8 Precision 530
+ 1028 010e Optiplex GX240
+ 103c 126f e-pc 40
+ 1043 8027 TUSL2-C Mainboard
+ 104d 80df Vaio PCG-FX403
+ 147b 0507 TH7II-RAID
+ 15d9 3280 Supermicro P4SBE Mainboard
+ 8086 4532 D815EEA2 mainboard
+ 8086 4557 D815EGEW Mainboard
+ 8086 5744 S845WD1-E mainboard
+ 2444 82801BA/BAM USB Controller #1
+ 1025 1016 Travelmate 612 TX
+ 1028 00c7 Dimension 8100
+ 1028 00d8 Precision 530
+ 1028 010e Optiplex GX240
+ 103c 126f e-pc 40
+ 1043 8027 TUSL2-C Mainboard
+ 104d 80df Vaio PCG-FX403
+ 147b 0507 TH7II-RAID
+ 8086 4532 D815EEA2 mainboard
+ 8086 5744 S845WD1-E mainboard
+ 2445 82801BA/BAM AC'97 Audio Controller
+ 0e11 000b Compaq Deskpro EN Audio
+ 0e11 0088 Evo D500
+ 1014 01c6 Netvista A40/A40p
+ 1025 1016 Travelmate 612 TX
+ 1028 00d8 Precision 530
+ 103c 126f e-pc 40
+ 104d 80df Vaio PCG-FX403
+ 1462 3370 STAC9721 AC
+ 147b 0507 TH7II-RAID
+ 8086 4557 D815EGEW Mainboard
+ 2446 82801BA/BAM AC'97 Modem Controller
+ 1025 1016 Travelmate 612 TX
+ 104d 80df Vaio PCG-FX403
+ 2448 82801 Mobile PCI Bridge
+# (rev d3) (prog-if (rev d3) (prog-if 01 [Subtractive decode])
+ 103c 0934 HP Compaq nw8240 Mobile Workstation
+ 103c 099c NX6110/NC6120
+ 103c 309f Compaq nx9420 Notebook
+ 103c 30a3 Compaq nw8440
+ 103c 30c1 Compaq 6910p
+ 104d 902d VAIO VGN-NR120E
+ 144d c00c P30 notebook
+ 1734 1055 Amilo M1420
+ 17aa 20ae ThinkPad T61
+ e4bf cc47 CCG-RUMBA
+ 2449 82801BA/BAM/CA/CAM Ethernet Controller
+ 0e11 0012 EtherExpress PRO/100 VM
+ 0e11 0091 EtherExpress PRO/100 VE
+ 1014 01ce EtherExpress PRO/100 VE
+ 1014 01dc EtherExpress PRO/100 VE
+ 1014 01eb EtherExpress PRO/100 VE
+ 1014 01ec EtherExpress PRO/100 VE
+ 1014 0202 EtherExpress PRO/100 VE
+ 1014 0205 EtherExpress PRO/100 VE
+ 1014 0217 EtherExpress PRO/100 VE
+ 1014 0234 EtherExpress PRO/100 VE
+ 1014 023d EtherExpress PRO/100 VE
+ 1014 0244 EtherExpress PRO/100 VE
+ 1014 0245 EtherExpress PRO/100 VE
+ 1014 0265 PRO/100 VE Desktop Connection
+ 1014 0267 PRO/100 VE Desktop Connection
+ 1014 026a PRO/100 VE Desktop Connection
+ 109f 315d EtherExpress PRO/100 VE
+ 109f 3181 EtherExpress PRO/100 VE
+ 1179 ff01 PRO/100 VE Network Connection
+ 1186 7801 EtherExpress PRO/100 VE
+ 144d 2602 HomePNA 1M CNR
+ 8086 3010 EtherExpress PRO/100 VE
+ 8086 3011 EtherExpress PRO/100 VM
+ 8086 3012 82562EH based Phoneline
+ 8086 3013 EtherExpress PRO/100 VE
+ 8086 3014 EtherExpress PRO/100 VM
+ 8086 3015 82562EH based Phoneline
+ 8086 3016 EtherExpress PRO/100 P Mobile Combo
+ 8086 3017 EtherExpress PRO/100 P Mobile
+ 8086 3018 EtherExpress PRO/100
+ 244a 82801BAM IDE U100 Controller
+ 1025 1016 Travelmate 612TX
+ 104d 80df Vaio PCG-FX403
+ 244b 82801BA IDE U100 Controller
+ 1014 01c6 Netvista A40/A40p
+ 1028 00c7 Dimension 8100
+ 1028 00d8 Precision 530
+ 1028 010e Optiplex GX240
+ 103c 126f e-pc 40
+ 1043 8027 TUSL2-C Mainboard
+ 147b 0507 TH7II-RAID
+ 15d9 3280 Supermicro P4SBE Mainboard
+ 8086 4532 D815EEA2 mainboard
+ 8086 4557 D815EGEW Mainboard
+ 8086 5744 S845WD1-E mainboard
+ 244c 82801BAM ISA Bridge (LPC)
+ 244e 82801 PCI Bridge
+ 1014 0267 NetVista A30p
+ 1028 020d Inspiron 530
+ 1028 0211 Optiplex 755
+ 103c 2a3b Pavilion A1512X
+ 1458 5000 GA-EP45-DS5 Motherboard
+ 1775 11cc CC11/CL11
+ 2450 82801E ISA Bridge (LPC)
+ 2452 82801E USB Controller
+ 2453 82801E SMBus Controller
+ 2459 82801E Ethernet Controller 0
+ 245b 82801E IDE U100 Controller
+ 245d 82801E Ethernet Controller 1
+ 245e 82801E PCI Bridge
+ 2480 82801CA LPC Interface Controller
+ 2482 82801CA/CAM USB Controller #1
+ 0e11 0030 Evo N600c
+ 1014 0220 ThinkPad A/T/X Series
+ 104d 80e7 VAIO PCG-GR214EP/GR214MP/GR215MP/GR314MP/GR315MP
+ 15d9 3480 P4DP6
+ 8086 1958 vpr Matrix 170B4
+ 8086 3424 SE7501HG2 Mainboard
+ 8086 4541 Latitude C640
+ 2483 82801CA/CAM SMBus Controller
+ 1014 0220 ThinkPad A/T/X Series
+ 104d 80e7 VAIO PCG-GR214EP/GR214MP/GR215MP/GR314MP/GR315MP
+ 15d9 3480 P4DP6
+ 8086 1958 vpr Matrix 170B4
+ 2484 82801CA/CAM USB Controller #2
+ 0e11 0030 Evo N600c
+ 1014 0220 ThinkPad A/T/X Series
+ 104d 80e7 VAIO PCG-GR214EP/GR214MP/GR215MP/GR314MP/GR315MP
+ 15d9 3480 P4DP6
+ 8086 1958 vpr Matrix 170B4
+ 2485 82801CA/CAM AC'97 Audio Controller
+ 1013 5959 Crystal WMD Audio Codec
+ 1014 0222 ThinkPad A30/A30p/T23
+ 1014 0508 ThinkPad T30
+ 1014 051c ThinkPad A/T/X Series
+ 1043 1583 L3C (SPDIF)
+ 1043 1623 L2B (no SPDIF)
+ 1043 1643 L3F
+ 104d 80e7 VAIO PCG-GR214EP/GR214MP/GR215MP/GR314MP/GR315MP
+ 144d c006 vpr Matrix 170B4
+ 2486 82801CA/CAM AC'97 Modem Controller
+ 1014 0223 ThinkPad A/T/X Series
+ 1014 0503 ThinkPad R31
+ 1014 051a ThinkPad A/T/X Series
+ 101f 1025 620 Series
+ 1043 1496 PCtel HSP56 MR
+ 104d 80e7 VAIO PCG-GR214EP/GR214MP/GR215MP/GR314MP/GR315MP
+ 134d 4c21 Dell Inspiron 2100 internal modem
+ 144d 2115 vpr Matrix 170B4 internal modem
+ 14f1 5421 MD56ORD V.92 MDC Modem
+ 2487 82801CA/CAM USB Controller #3
+ 0e11 0030 Evo N600c
+ 1014 0220 ThinkPad A/T/X Series
+ 104d 80e7 VAIO PCG-GR214EP/GR214MP/GR215MP/GR314MP/GR315MP
+ 15d9 3480 P4DP6
+ 8086 1958 vpr Matrix 170B4
+ 248a 82801CAM IDE U100 Controller
+ 0e11 0030 Evo N600c
+ 1014 0220 ThinkPad A/T/X Series
+ 104d 80e7 VAIO PCG-GR214EP/GR214MP/GR215MP/GR314MP/GR315MP
+ 8086 1958 vpr Matrix 170B4
+ 8086 4541 Latitude C640
+ 248b 82801CA Ultra ATA Storage Controller
+ 15d9 3480 P4DP6
+ 248c 82801CAM ISA Bridge (LPC)
+ 24c0 82801DB/DBL (ICH4/ICH4-L) LPC Interface Bridge
+ 1014 0267 NetVista A30p
+ 1462 5800 845PE Max (MS-6580)
+ 24c1 82801DBL (ICH4-L) IDE Controller
+ 24c2 82801DB/DBL/DBM (ICH4/ICH4-L/ICH4-M) USB UHCI Controller #1
+ 1014 0267 NetVista A30p
+ 1014 052d ThinkPad
+ 1025 005a TravelMate 290
+ 1028 0126 Optiplex GX260
+ 1028 0163 Latitude D505
+ 1028 018d Inspiron 700m/710m
+ 1028 0196 Inspiron 5160
+ 103c 088c NC8000 laptop
+ 103c 0890 NC6000 laptop
+ 103c 08b0 tc1100 tablet
+ 1043 8089 P4B533
+ 1071 8160 MIM2000
+ 114a 0582 PC8 onboard USB 1.x
+ 144d c005 X10 Laptop
+ 144d c00c P30/P35 notebook
+ 1462 5800 845PE Max (MS-6580)
+ 1509 2990 Averatec 5110H laptop
+ 1734 1004 D1451 Mainboard (SCENIC N300, i845GV)
+ 1734 1055 Amilo M1420
+ 4c53 1090 Cx9 / Vx9 mainboard
+ 8086 24c2 Latitude X300
+ 8086 4541 Latitude D400/D500
+ e4bf 0cc9 CC9-SAMBA
+ e4bf 0cd2 CD2-BEBOP
+ 24c3 82801DB/DBL/DBM (ICH4/ICH4-L/ICH4-M) SMBus Controller
+ 1014 0267 NetVista A30p
+ 1014 052d ThinkPad
+ 1025 005a TravelMate 290
+ 1028 0126 Optiplex GX260
+ 1028 014f Latitude X300
+ 1028 018d Inspiron 700m/710m
+ 103c 088c NC8000 laptop
+ 103c 0890 NC6000 laptop
+ 103c 08b0 tc1100 tablet
+ 1071 8160 MIM2000
+ 114a 0582 PC8 onboard SMbus
+ 144d c005 X10 Laptop
+ 144d c00c P30/P35 notebook
+ 1458 24c2 GA-8PE667 Ultra
+ 1462 5800 845PE Max (MS-6580)
+ 1734 1004 D1451 Mainboard (SCENIC N300, i845GV)
+ 1734 1055 Amilo M1420
+ 4c53 1090 Cx9 / Vx9 mainboard
+ e4bf 0cc9 CC9-SAMBA
+ e4bf 0cd2 CD2-BEBOP
+ 24c4 82801DB/DBL/DBM (ICH4/ICH4-L/ICH4-M) USB UHCI Controller #2
+ 1014 0267 NetVista A30p
+ 1014 052d ThinkPad
+ 1025 005a TravelMate 290
+ 1028 0126 Optiplex GX260
+ 1028 0163 Latitude D505
+ 1028 018d Inspiron 700m/710m
+ 1028 0196 Inspiron 5160
+ 103c 088c NC8000 laptop
+ 103c 0890 NC6000 laptop
+ 103c 08b0 tc1100 tablet
+ 1043 8089 P4B533
+ 1071 8160 MIM2000
+ 144d c00c P30/P35 notebook
+ 1462 5800 845PE Max (MS-6580)
+ 1509 2990 Averatec 5110H
+ 1734 1004 D1451 Mainboard (SCENIC N300, i845GV)
+ 4c53 1090 Cx9 / Vx9 mainboard
+ 8086 24c2 Latitude X300
+ 8086 4541 Latitude D400/D500
+ e4bf 0cc9 CC9-SAMBA
+ e4bf 0cd2 CD2-BEBOP
+ 24c5 82801DB/DBL/DBM (ICH4/ICH4-L/ICH4-M) AC'97 Audio Controller
+ 0e11 00b8 Analog Devices Inc. codec [SoundMAX]
+ 1014 0267 NetVista A30p
+ 1014 0537 ThinkPad T41
+ 1014 055f Thinkpad R50e model 1634
+ 1025 005a TravelMate 290
+ 1028 0139 Latitude D400
+ 1028 014f Latitude X300
+ 1028 0152 Latitude D500
+ 1028 0163 Latitude D505
+ 1028 018d Inspiron 700m/710m [SigmaTel STAC9750,51]
+ 1028 0196 Inspiron 5160
+ 103c 088c NC8000 laptop
+ 103c 0890 NC6000 laptop
+ 103c 08b0 tc1100 tablet
+ 1043 1713 M6800N
+ 1043 80b0 P4B533
+ 1071 8160 MIM2000
+ 1179 0201 Toshiba Tecra M1
+ 144d c005 X10 Laptop
+ 144d c00c P30/P35 notebook
+ 1458 a002 GA-8PE667 Ultra
+ 1462 5800 845PE Max (MS-6580)
+ 1734 1005 D1451 (SCENIC N300, i845GV) Sigmatel STAC9750T
+ 1734 1055 Amilo M1420
+ 8086 24c5 Dell Dimension 2400
+ 24c6 82801DB/DBL/DBM (ICH4/ICH4-L/ICH4-M) AC'97 Modem Controller
+ 1014 0524 ThinkPad T41
+ 1014 0525 ThinkPad
+ 1014 0559 ThinkPad R50e
+ 1025 003c Aspire 2001WLCi (Compal CL50 motherboard) implementation
+ 1025 005a TravelMate 290
+ 1028 0196 Inspiron 5160
+ 103c 088c NC8000 laptop
+ 103c 0890 NC6000 laptop
+ 103c 08b0 tc1100 tablet
+ 1043 1826 M6800N
+ 1071 8160 MIM2000
+ 134d 4c21 Latitude D500
+ 144d 2115 X10 Laptop
+ 144d c00c P30/P35 notebook
+# Conexant HSF Softmodem (CXT22)
+ 14f1 5422 D480 MDC V.9x Modem
+ 24c7 82801DB/DBL/DBM (ICH4/ICH4-L/ICH4-M) USB UHCI Controller #3
+ 1014 0267 NetVista A30p
+ 1014 052d ThinkPad
+ 1025 005a TravelMate 290
+ 1028 0126 Optiplex GX260
+ 1028 0163 Latitude D505
+ 1028 018d Inspiron 700m/710m
+ 1028 0196 Inspiron 5160
+ 103c 088c NC8000 laptop
+ 103c 0890 NC6000 laptop
+ 103c 08b0 tc1100 tablet
+ 1043 8089 P4B533
+ 1071 8160 MIM2000
+ 144d c00c P30/P35 notebook
+ 1462 5800 845PE Max (MS-6580)
+ 1509 2990 Averatec 5110H
+ 1734 1004 D1451 Mainboard (SCENIC N300, i845GV)
+ 4c53 1090 Cx9 / Vx9 mainboard
+ 8086 24c2 Latitude X300
+ 8086 4541 Latitude D400/D500
+ e4bf 0cc9 CC9-SAMBA
+ e4bf 0cd2 CD2-BEBOP
+ 24ca 82801DBM (ICH4-M) IDE Controller
+ 1014 052d ThinkPad
+ 1025 005a TravelMate 290
+ 1028 014f Latitude X300
+ 1028 0163 Latitude D505
+ 1028 018d Inspiron 700m/710m
+ 1028 0196 Inspiron 5160
+ 103c 088c NC8000 laptop
+ 103c 0890 NC6000 laptop
+ 103c 08b0 tc1100 tablet
+ 1071 8160 MIM2000
+ 144d c005 X10 Laptop
+ 144d c00c P30/P35 notebook
+ 1734 1055 Amilo M1420
+ 8086 4541 Latitude D400/D500
+ 24cb 82801DB (ICH4) IDE Controller
+ 1014 0267 NetVista A30p
+ 1028 0126 Optiplex GX260
+ 1043 8089 P4B533
+ 114a 0582 PC8 onboard IDE
+ 1458 24c2 GA-8PE667 Ultra
+ 1462 5800 845PE Max (MS-6580)
+ 1734 1004 D1451 Mainboard (SCENIC N300, i845GV)
+ 4c53 1090 Cx9 / Vx9 mainboard
+ e4bf 0cc9 CC9-SAMBA
+ e4bf 0cd2 CD2-BEBOP
+ 24cc 82801DBM (ICH4-M) LPC Interface Bridge
+ 144d c00c P30 notebook
+ 1734 1055 Amilo M1420
+ 24cd 82801DB/DBM (ICH4/ICH4-M) USB2 EHCI Controller
+ 1014 0267 NetVista A30p
+ 1014 052e ThinkPad
+ 1025 005a TravelMate 290
+ 1028 011d Latitude D600
+ 1028 0126 Optiplex GX260
+ 1028 0139 Latitude D400
+ 1028 0152 Latitude D500
+ 1028 0163 Latitude D505
+ 1028 018d Inspiron 700m/710m
+ 1028 0196 Inspiron 5160
+ 103c 088c NC8000 laptop
+ 103c 0890 NC6000 laptop
+ 103c 08b0 tc1100 tablet
+ 1043 8089 P4B533
+ 1071 8160 MIM2000
+ 114a 0582 PC8 onboard USB 2.0
+ 1179 ff00 Satellite 2430
+ 144d c005 X10 Laptop
+ 144d c00c P30/P35 notebook
+ 1462 3981 845PE Max (MS-6580)
+ 1509 1968 Averatec 5110H
+ 1734 1004 D1451 Mainboard (SCENIC N300, i845GV)
+ 1734 1055 Amilo M1420
+ 4c53 1090 Cx9 / Vx9 mainboard
+ 8086 24c2 Latitude X300
+ e4bf 0cc9 CC9-SAMBA
+ e4bf 0cd2 CD2-BEBOP
+ 24d0 82801EB/ER (ICH5/ICH5R) LPC Interface Bridge
+ 24d1 82801EB (ICH5) SATA Controller
+ 1028 0169 Precision 470
+ 1028 019a PowerEdge SC1425
+ 103c 12bc d530 CMT (DG746A)
+ 1043 80a6 P4P800 series motherboard
+ 1458 24d1 GA-8IPE1000 Pro2 motherboard (865PE)
+ 1462 7280 865PE Neo2 (MS-6728)
+ 1462 7650 Hetis 865GV-E (MS-7065)
+ 1565 5200 P4TSV Motherboard (865G)
+ 15d9 4580 P4SCE Mainboard
+ 8086 3427 S875WP1-E mainboard
+ 8086 4246 Desktop Board D865GBF
+ 8086 4c43 Desktop Board D865GLC
+ 8086 524c D865PERL mainboard
+ 24d2 82801EB/ER (ICH5/ICH5R) USB UHCI Controller #1
+ 1014 02dd eServer xSeries server mainboard
+ 1014 02ed eServer xSeries server mainboard
+ 1028 0169 Precision 470
+ 1028 016c PowerEdge 1850 onboard UHCI
+ 1028 016d PowerEdge 2850 onboard UHCI
+ 1028 0170 PowerEdge 6850 onboard UHCI
+ 1028 0183 PowerEdge 1800
+ 1028 019a PowerEdge SC1425
+ 103c 006a NX9500
+ 103c 12bc d530 CMT (DG746A)
+ 1043 80a6 P4P800/P5P800 series motherboard
+ 1458 24d2 GA-8IPE1000/8KNXP motherboard
+ 1462 7280 865PE Neo2 (MS-6728)
+ 1565 3101 P4TSV Motherboard (865G)
+ 15d9 4580 P4SCE Mainboard
+ 1734 101c PRIMERGY RX/TX series onboard UHCI
+ 8086 3427 S875WP1-E mainboard
+ 8086 4246 Desktop Board D865GBF
+ 8086 4c43 Desktop Board D865GLC
+ 8086 524c D865PERL mainboard
+ 24d3 82801EB/ER (ICH5/ICH5R) SMBus Controller
+ 1014 02dd eServer xSeries server mainboard
+ 1014 02ed eServer xSeries server mainboard
+ 1028 0156 Precision 360
+ 1028 0169 Precision 470
+ 103c 12bc d330 uT
+ 1043 80a6 P4P800 Mainboard
+ 1458 24d2 GA-8IPE1000 Pro2 motherboard (865PE)
+ 1462 7280 865PE Neo2 (MS-6728)
+ 1462 7650 Hetis 865GV-E (MS-7065)
+ 1565 3101 P4TSV Motherboard (865G)
+ 15d9 4580 P4SCE Mainboard
+ 1734 101c PRIMERGY RX/TX S2 series SMBus
+ 8086 3427 S875WP1-E mainboard
+ 8086 4246 Desktop Board D865GBF
+ 8086 4c43 Desktop Board D865GLC
+ 8086 524c D865PERL mainboard
+ 24d4 82801EB/ER (ICH5/ICH5R) USB UHCI Controller #2
+ 1014 02dd eServer xSeries server mainboard
+ 1014 02ed eServer xSeries server mainboard
+ 1028 0169 Precision 470
+ 1028 016c PowerEdge 1850 onboard UHCI
+ 1028 016d PowerEdge 2850 onboard UHCI
+ 1028 0170 PowerEdge 6850 onboard UHCI
+ 1028 0183 PowerEdge 1800
+ 1028 019a PowerEdge SC1425
+ 103c 006a NX9500
+ 103c 12bc d530 CMT (DG746A)
+ 1043 80a6 P4P800/P5P800 series motherboard
+ 1458 24d2 GA-8IPE1000 Pro2 motherboard (865PE)
+ 1462 7280 865PE Neo2 (MS-6728)
+ 1462 7650 Hetis 865GV-E (MS-7065)
+ 1565 3101 P4TSV Motherboard (865G)
+ 15d9 4580 P4SCE Mainboard
+ 1734 101c PRIMERGY RX/TX S2 series onboard UHCI
+ 8086 3427 S875WP1-E mainboard
+ 8086 4246 Desktop Board D865GBF
+ 8086 4c43 Desktop Board D865GLC
+ 8086 524c D865PERL mainboard
+ 24d5 82801EB/ER (ICH5/ICH5R) AC'97 Audio Controller
+ 100a 147b Abit IS7-E motherboard
+ 1028 0169 Precision 470
+ 103c 006a NX9500
+ 103c 12bc d330 uT
+ 1043 80f3 P4P800 Mainboard
+ 1043 810f P5P800-MX Mainboard
+ 1458 a002 GA-8IPE1000/8KNXP motherboard
+ 1462 0080 865PE Neo2-V (MS-6788) Mainboard
+ 1462 7280 865PE Neo2 (MS-6728)
+ 1462 7650 Hetis 865GV-E (MS-7065)
+ 8086 a000 D865PERL mainboard
+ 8086 e000 D865PERL mainboard
+ 8086 e001 Desktop Board D865GBF
+ 8086 e002 SoundMax Intergrated Digital Audio
+ 24d6 82801EB/ER (ICH5/ICH5R) AC'97 Modem Controller
+ 103c 006a NX9500
+ 24d7 82801EB/ER (ICH5/ICH5R) USB UHCI Controller #3
+ 1014 02ed xSeries server mainboard
+ 1028 0169 Precision 470
+ 1028 016c PowerEdge 1850 onboard UHCI
+ 1028 016d PowerEdge 2850 onboard UHCI
+ 1028 0170 PowerEdge 6850 onboard UHCI
+ 1028 0183 PowerEdge 1800
+ 103c 006a NX9500
+ 103c 12bc d530 CMT (DG746A)
+ 1043 80a6 P4P800/P5P800 series motherboard
+ 1458 24d2 GA-8IPE1000 Pro2 motherboard (865PE)
+ 1462 7280 865PE Neo2 (MS-6728)
+ 1462 7650 Hetis 865GV-E (MS-7065)
+ 1565 3101 P4TSV Motherboard (865G)
+ 15d9 4580 P4SCE Mainboard
+ 1734 101c PRIMERGY RX/TX S2 series onboard UHCI
+ 8086 3427 S875WP1-E mainboard
+ 8086 4246 Desktop Board D865GBF
+ 8086 4c43 Desktop Board D865GLC
+ 8086 524c D865PERL mainboard
+ 24db 82801EB/ER (ICH5/ICH5R) IDE Controller
+ 1014 02dd eServer xSeries server mainboard
+ 1014 02ed eServer xSeries server mainboard
+ 1028 0169 Precision 470
+ 1028 016c PowerEdge 1850 IDE Controller
+ 1028 016d PowerEdge 2850 IDE Controller
+ 1028 0170 PowerEdge 6850 IDE Controller
+ 1028 019a PowerEdge SC1425
+ 103c 006a NX9500
+ 103c 12bc d530 CMT (DG746A)
+ 1043 80a6 P4P800/P5P800 series motherboard
+ 1458 24d2 GA-8IPE1000 Pro2 motherboard (865PE)
+ 1462 7280 865PE Neo2 (MS-6728)
+ 1462 7580 MSI 875P
+ 1462 7650 Hetis 865GV-E (MS-7065)
+ 1565 3101 P4TSV Motherboard (865G)
+ 15d9 4580 P4SCE Mainboard
+ 1734 101c PRIMERGY RX/TX S2 series onboard IDE
+ 8086 24db P4C800 Mainboard
+ 8086 3427 S875WP1-E mainboard
+ 8086 4246 Desktop Board D865GBF
+ 8086 4c43 Desktop Board D865GLC
+ 8086 524c D865PERL mainboard
+ 24dc 82801EB (ICH5) LPC Interface Bridge
+ 24dd 82801EB/ER (ICH5/ICH5R) USB2 EHCI Controller
+ 1014 02dd eServer xSeries server mainboard
+ 1014 02ed eServer xSeries server mainboard
+ 1028 0169 Precision 470
+ 1028 016c PowerEdge 1850 onboard EHCI
+ 1028 016d PowerEdge 2850 onboard EHCI
+ 1028 0170 PowerEdge 6850 onboard EHCI
+ 1028 0183 PowerEdge 1800
+ 1028 019a PowerEdge SC1425
+ 103c 006a NX9500
+ 103c 12bc d530 CMT (DG746A)
+ 1043 80a6 P4P800/P5P800 series motherboard
+ 1458 5006 GA-8IPE1000 Pro2 motherboard (865PE)
+ 1462 7280 865PE Neo2 (MS-6728)
+ 1462 7650 Hetis 865GV-E (MS-7065)
+ 8086 3427 S875WP1-E mainboard
+ 8086 4246 Desktop Board D865GBF
+ 8086 4c43 Desktop Board D865GLC
+ 8086 524c D865PERL mainboard
+ 24de 82801EB/ER (ICH5/ICH5R) USB UHCI Controller #4
+ 1014 02ed xSeries server mainboard
+ 1028 0169 Precision 470
+ 1043 80a6 P4P800/P5P800 series motherboard
+ 1458 24d2 GA-8IPE1000 Pro2 motherboard (865PE)
+ 1462 7280 865PE Neo2 (MS-6728)
+ 1462 7650 Hetis 865GV-E (MS-7065)
+ 1565 3101 P4TSV Motherboard (865G)
+ 15d9 4580 P4SCE Mainboard
+ 1734 101c PRIMERGY RX/TX S2 series onboard UHCI
+ 8086 3427 S875WP1-E mainboard
+ 8086 4246 Desktop Board D865GBF
+ 8086 4c43 Desktop Board D865GLC
+ 8086 524c D865PERL mainboard
+ 24df 82801ER (ICH5R) SATA Controller
+ 2500 82820 820 (Camino) Chipset Host Bridge (MCH)
+ 1028 0095 Precision Workstation 220 Chipset
+ 1043 801c P3C-2000 system chipset
+ 2501 82820 820 (Camino) Chipset Host Bridge (MCH)
+ 1043 801c P3C-2000 system chipset
+ 250b 82820 820 (Camino) Chipset Host Bridge
+ 250f 82820 820 (Camino) Chipset AGP Bridge
+ 2520 82805AA MTH Memory Translator Hub
+ 2521 82804AA MRH-S Memory Repeater Hub for SDRAM
+ 2530 82850 850 (Tehama) Chipset Host Bridge (MCH)
+ 1028 00c7 Dimension 8100
+ 147b 0507 TH7II-RAID
+ 2531 82860 860 (Wombat) Chipset Host Bridge (MCH)
+ 1028 00d8 Precision 530
+ 2532 82850 850 (Tehama) Chipset AGP Bridge
+ 2533 82860 860 (Wombat) Chipset AGP Bridge
+ 2534 82860 860 (Wombat) Chipset PCI Bridge
+ 2540 E7500 Memory Controller Hub
+ 15d9 3480 P4DP6
+ 2541 E7500/E7501 Host RASUM Controller
+ 15d9 3480 P4DP6
+ 4c53 1090 Cx9 / Vx9 mainboard
+ 8086 3424 SE7501HG2 Mainboard
+ 2543 E7500/E7501 Hub Interface B PCI-to-PCI Bridge
+ 2544 E7500/E7501 Hub Interface B RASUM Controller
+ 4c53 1090 Cx9 / Vx9 mainboard
+ 2545 E7500/E7501 Hub Interface C PCI-to-PCI Bridge
+ 2546 E7500/E7501 Hub Interface C RASUM Controller
+ 2547 E7500/E7501 Hub Interface D PCI-to-PCI Bridge
+ 2548 E7500/E7501 Hub Interface D RASUM Controller
+ 254c E7501 Memory Controller Hub
+ 4c53 1090 Cx9 / Vx9 mainboard
+ 8086 3424 SE7501HG2 Mainboard
+ 2550 E7505 Memory Controller Hub
+ 2551 E7505/E7205 Series RAS Controller
+ 2552 E7505/E7205 PCI-to-AGP Bridge
+ 2553 E7505 Hub Interface B PCI-to-PCI Bridge
+ 2554 E7505 Hub Interface B PCI-to-PCI Bridge RAS Controller
+ 255d E7205 Memory Controller Hub
+ 2560 82845G/GL[Brookdale-G]/GE/PE DRAM Controller/Host-Hub Interface
+ 1028 0126 Optiplex GX260
+ 1458 2560 GA-8PE667 Ultra
+ 1462 5800 845PE Max (MS-6580)
+ 2561 82845G/GL[Brookdale-G]/GE/PE Host-to-AGP Bridge
+ 2562 82845G/GL[Brookdale-G]/GE Chipset Integrated Graphics Device
+ 0e11 00b9 Evo D510 SFF
+ 1014 0267 NetVista A30p
+ 1734 1003 D1521 Mainboard (Fujitsu-Siemens)
+ 1734 1004 D1451 Mainboard (SCENIC N300, i845GV)
+ 2570 82865G/PE/P DRAM Controller/Host-Hub Interface
+ 103c 006a NX9500
+ 103c 12bc d330 uT
+ 1043 80f2 P4P800/P5P800 series motherboard
+ 1458 2570 GA-8IPE1000 Pro2 motherboard (865PE)
+ 2571 82865G/PE/P PCI to AGP Controller
+ 2572 82865G Integrated Graphics Controller
+ 1028 019d Dimension 3000
+ 103c 12bc D530 sff(dc578av)
+ 1043 80a5 P5P800-MX Mainboard
+ 1462 7650 Hetis 865GV-E (MS-7065)
+ 1734 101b Fujitsu-Siemens Scenic E300 i865GV
+ 8086 4246 Desktop Board D865GBF
+ 8086 4c43 Desktop Board D865GLC
+ 2573 82865G/PE/P PCI to CSA Bridge
+ 2576 82865G/PE/P Processor to I/O Memory Interface
+ 2578 82875P/E7210 Memory Controller Hub
+ 1458 2578 GA-8KNXP motherboard (875P)
+ 1462 7580 MS-6758 (875P Neo)
+ 15d9 4580 P4SCE Motherboard
+ 2579 82875P Processor to AGP Controller
+ 257b 82875P/E7210 Processor to PCI to CSA Bridge
+ 257e 82875P/E7210 Processor to I/O Memory Interface
+ 2580 82915G/P/GV/GL/PL/910GL Memory Controller Hub
+ 1458 2580 GA-8I915ME-G Mainboard
+ 1462 7028 915P/G Neo2
+ 1734 105b Scenic W620
+ 2581 82915G/P/GV/GL/PL/910GL PCI Express Root Port
+ 2582 82915G/GV/910GL Integrated Graphics Controller
+ 1028 1079 Optiplex GX280
+ 103c 3006 DC7100 SFF(DX878AV)
+ 1043 2582 P5GD1-VW Mainboard
+ 1458 2582 GA-8I915ME-G Mainboard
+ 1734 105b Scenic W620
+ 1849 2582 ASRock P4Dual-915GL
+ 2584 82925X/XE Memory Controller Hub
+ 1028 0177 Dimension 8400
+ 2585 82925X/XE PCI Express Root Port
+ 2588 E7220/E7221 Memory Controller Hub
+ 2589 E7220/E7221 PCI Express Root Port
+ 258a E7221 Integrated Graphics Controller
+ 2590 Mobile 915GM/PM/GMS/910GML Express Processor to DRAM Controller
+ 1014 0575 ThinkPad Z60t
+ 1028 0182 Dell Latidude C610
+ 103c 0934 Compaq nw8240/nx8220
+ 103c 099c NX6110/NC6120
+ 104d 81b7 Vaio VGN-S3XP
+ a304 81b7 Vaio VGN-S3XP
+ e4bf 0ccd CCD-CALYPSO
+ e4bf 0cd3 CD3-JIVE
+ e4bf 58b1 XB1
+ 2591 Mobile 915GM/PM Express PCI Express Root Port
+ 103c 0934 HP Compaq nw8240 Mobile Workstation
+ 2592 Mobile 915GM/GMS/910GML Express Graphics Controller
+ 103c 099c NX6110/NC6120
+ 103c 308a NC6220
+ 1043 1881 GMA 900 915GM Integrated Graphics
+ e4bf 0ccd CCD-CALYPSO
+ e4bf 0cd3 CD3-JIVE
+ e4bf 58b1 XB1
+ 25a1 6300ESB LPC Interface Controller
+ 25a2 6300ESB PATA Storage Controller
+ 1775 10d0 V5D Single Board Computer IDE
+ 1775 1100 CR11/VR11 Single Board Computer
+ 1775 ce90 CE9
+ 4c53 10b0 CL9 mainboard
+ 4c53 10e0 PSL09 PrPMC
+ 25a3 6300ESB SATA Storage Controller
+ 1775 1100 CR11/VR11 Single Board Computer
+ 1775 ce90 CE9
+ 4c53 10b0 CL9 mainboard
+ 4c53 10d0 Telum ASLP10 Processor AMC
+ 4c53 10e0 PSL09 PrPMC
+ 25a4 6300ESB SMBus Controller
+ 1775 10d0 V5D Single Board Computer
+ 1775 1100 CR11/VR11 Single Board Computer
+ 1775 ce90 CE9
+ 4c53 10b0 CL9 mainboard
+ 4c53 10d0 Telum ASLP10 Processor AMC
+ 4c53 10e0 PSL09 PrPMC
+ 25a6 6300ESB AC'97 Audio Controller
+ 1775 1100 CR11/VR11 Single Board Computer
+ 1775 ce90 CE9
+ 4c53 10b0 CL9 mainboard
+ 25a7 6300ESB AC'97 Modem Controller
+ 25a9 6300ESB USB Universal Host Controller
+ 1775 10d0 V5D Single Board Computer USB
+ 1775 1100 CR11/VR11 Single Board Computer
+ 1775 ce90 CE9
+ 4c53 10b0 CL9 mainboard
+ 4c53 10d0 Telum ASLP10 Processor AMC
+ 4c53 10e0 PSL09 PrPMC
+ 25aa 6300ESB USB Universal Host Controller
+ 1775 1100 CR11/VR11 Single Board Computer
+ 1775 ce90 CE9
+ 4c53 10b0 CL9 mainboard
+ 4c53 10d0 Telum ASLP10 Processor AMC
+ 4c53 10e0 PSL09 PrPMC
+ 25ab 6300ESB Watchdog Timer
+ 1775 10d0 V5D Single Board Computer
+ 1775 1100 CR11/VR11 Single Board Computer
+ 1775 ce90 CE9
+ 4c53 10b0 CL9 mainboard
+ 4c53 10d0 Telum ASLP10 Processor AMC
+ 4c53 10e0 PSL09 PrPMC
+ 25ac 6300ESB I/O Advanced Programmable Interrupt Controller
+ 1775 10d0 V5D Single Board Computer
+ 1775 1100 CR11/VR11 Single Board Computer
+ 1775 ce90 CE9
+ 4c53 10b0 CL9 mainboard
+ 4c53 10d0 Telum ASLP10 Processor AMC
+ 4c53 10e0 PSL09 PrPMC
+ 25ad 6300ESB USB2 Enhanced Host Controller
+ 1775 10d0 V5D Single Board Computer USB 2.0
+ 1775 1100 CR11/VR11 Single Board Computer
+ 1775 ce90 CE9
+ 4c53 10b0 CL9 mainboard
+ 4c53 10d0 Telum ASLP10 Processor AMC
+ 4c53 10e0 PSL09 PrPMC
+ 25ae 6300ESB 64-bit PCI-X Bridge
+ 25b0 6300ESB SATA RAID Controller
+ 1775 1100 CR11/VR11 Single Board Computer
+ 4c53 10d0 Telum ASLP10 Processor AMC
+ 4c53 10e0 PSL09 PrPMC
+ 25c0 5000X Chipset Memory Controller Hub
+ 25d0 5000Z Chipset Memory Controller Hub
+ 25d4 5000V Chipset Memory Controller Hub
+ 15d9 8680 X7DVL-E-O motherboard
+ 25d8 5000P Chipset Memory Controller Hub
+ 8086 3476 Intel S5000PSLSATA Server Board
+ 25e2 5000 Series Chipset PCI Express x4 Port 2
+ 25e3 5000 Series Chipset PCI Express x4 Port 3
+ 25e4 5000 Series Chipset PCI Express x4 Port 4
+ 25e5 5000 Series Chipset PCI Express x4 Port 5
+ 25e6 5000 Series Chipset PCI Express x4 Port 6
+ 25e7 5000 Series Chipset PCI Express x4 Port 7
+ 25f0 5000 Series Chipset FSB Registers
+ 1028 01bb PowerEdge 1955 FSB Registers
+ 15d9 8680 X7DVL-E-O motherboard
+ 8086 3476 Intel S5000PSLSATA Server Board
+ 25f1 5000 Series Chipset Reserved Registers
+ 15d9 8680 X7DVL-E-O motherboard
+ 8086 3476 Intel S5000PSLSATA Server Board
+ 25f3 5000 Series Chipset Reserved Registers
+ 15d9 8680 X7DVL-E-O motherboard
+ 8086 3476 Intel S5000PSLSATA Server Board
+ 25f5 5000 Series Chipset FBD Registers
+ 15d9 8680 X7DVL-E-O motherboard
+ 8086 3476 Intel S5000PSLSATA Server Board
+ 25f6 5000 Series Chipset FBD Registers
+ 15d9 8680 X7DVL-E-O motherboard
+ 8086 3476 Intel S5000PSLSATA Server Board
+ 25f7 5000 Series Chipset PCI Express x8 Port 2-3
+ 25f8 5000 Series Chipset PCI Express x8 Port 4-5
+ 25f9 5000 Series Chipset PCI Express x8 Port 6-7
+ 25fa 5000X Chipset PCI Express x16 Port 4-7
+ 2600 E8500/E8501 Hub Interface 1.5
+ 1028 0170 PowerEdge 6850 Hub Interface
+ 2601 E8500/E8501 PCI Express x4 Port D
+ 2602 E8500/E8501 PCI Express x4 Port C0
+ 2603 E8500/E8501 PCI Express x4 Port C1
+ 2604 E8500/E8501 PCI Express x4 Port B0
+ 2605 E8500/E8501 PCI Express x4 Port B1
+ 2606 E8500/E8501 PCI Express x4 Port A0
+ 2607 E8500/E8501 PCI Express x4 Port A1
+ 2608 E8500/E8501 PCI Express x8 Port C
+ 2609 E8500/E8501 PCI Express x8 Port B
+ 260a E8500/E8501 PCI Express x8 Port A
+ 260c E8500/E8501 IMI Registers
+ 2610 E8500/E8501 FSB Registers
+ 2611 E8500/E8501 Address Mapping Registers
+ 2612 E8500/E8501 RAS Registers
+ 2613 E8500/E8501 Reserved Registers
+ 2614 E8500/E8501 Reserved Registers
+ 2615 E8500/E8501 Miscellaneous Registers
+ 2617 E8500/E8501 Reserved Registers
+ 2618 E8500/E8501 Reserved Registers
+ 2619 E8500/E8501 Reserved Registers
+ 261a E8500/E8501 Reserved Registers
+ 261b E8500/E8501 Reserved Registers
+ 261c E8500/E8501 Reserved Registers
+ 261d E8500/E8501 Reserved Registers
+ 261e E8500/E8501 Reserved Registers
+ 2620 E8500/E8501 eXternal Memory Bridge
+ 1028 0170 PowerEdge 6850 Memory Bridge
+ 2621 E8500/E8501 XMB Miscellaneous Registers
+ 1028 0170 PowerEdge 6850 XMB Registers
+ 2622 E8500/E8501 XMB Memory Interleaving Registers
+ 1028 0170 PowerEdge 6850 Memory Interleaving Registers
+ 2623 E8500/E8501 XMB DDR Initialization and Calibration
+ 1028 0170 PowerEdge 6850 DDR Initialization and Calibration
+ 2624 E8500/E8501 XMB Reserved Registers
+ 1028 0170 PowerEdge 6850 Reserved Registers
+ 2625 E8500/E8501 XMB Reserved Registers
+ 1028 0170 PowerEdge 6850 Reserved Registers
+ 2626 E8500/E8501 XMB Reserved Registers
+ 1028 0170 PowerEdge 6850 Reserved Registers
+ 2627 E8500/E8501 XMB Reserved Registers
+ 1028 0170 PowerEdge 6850 Reserved Registers
+ 2640 82801FB/FR (ICH6/ICH6R) LPC Interface Bridge
+ 1462 7028 915P/G Neo2
+ 1734 105c Scenic W620
+ e4bf 0ccd CCD-CALYPSO
+ e4bf 0cd3 CD3-JIVE
+ e4bf 58b1 XB1
+ 2641 82801FBM (ICH6M) LPC Interface Bridge
+ 103c 0934 Compaq nw8240/nx8220
+ 103c 099c NX6110/NC6120
+ 2642 82801FW/FRW (ICH6W/ICH6RW) LPC Interface Bridge
+ 2651 82801FB/FW (ICH6/ICH6W) SATA Controller
+ 1028 0179 Optiplex GX280
+ 1043 2601 P5GD1-VW Mainboard
+ 1734 105c Scenic W620
+ 8086 4147 D915GAG Motherboard
+ e4bf 0ccd CCD-CALYPSO
+ e4bf 0cd3 CD3-JIVE
+ e4bf 58b1 XB1
+ 2652 82801FR/FRW (ICH6R/ICH6RW) SATA Controller
+ 1028 0177 Dimension 8400
+ 1462 7028 915P/G Neo2
+ 2653 82801FBM (ICH6M) SATA Controller
+ 2658 82801FB/FBM/FR/FW/FRW (ICH6 Family) USB UHCI #1
+ 1028 0177 Dimension 8400
+ 1028 0179 Optiplex GX280
+ 103c 0934 Compaq nw8240/nx8220
+ 103c 099c NX6110/NC6120
+ 1043 80a6 P5GD1-VW Mainboard
+ 1458 2558 GA-8I915ME-G Mainboard
+ 1462 7028 915P/G Neo2
+ 1734 105c Scenic W620
+ e4bf 0ccd CCD-CALYPSO
+ e4bf 0cd3 CD3-JIVE
+ e4bf 58b1 XB1
+ 2659 82801FB/FBM/FR/FW/FRW (ICH6 Family) USB UHCI #2
+ 1028 0177 Dimension 8400
+ 1028 0179 Optiplex GX280
+ 103c 0934 Compaq nw8240/nx8220
+ 103c 099c NX6110/NC6120
+ 1043 80a6 P5GD1-VW Mainboard
+ 1458 2659 GA-8I915ME-G Mainboard
+ 1462 7028 915P/G Neo2
+ 1734 105c Scenic W620
+ e4bf 0ccd CCD-CALYPSO
+ e4bf 0cd3 CD3-JIVE
+ e4bf 58b1 XB1
+ 265a 82801FB/FBM/FR/FW/FRW (ICH6 Family) USB UHCI #3
+ 1028 0177 Dimension 8400
+ 1028 0179 Optiplex GX280
+ 103c 0934 Compaq nw8240/nx8220
+ 103c 099c NX6110/NC6120
+ 1043 80a6 P5GD1-VW Mainboard
+ 1458 265a GA-8I915ME-G Mainboard
+ 1462 7028 915P/G Neo2
+ 1734 105c Scenic W620
+ e4bf 0ccd CCD-CALYPSO
+ e4bf 0cd3 CD3-JIVE
+ e4bf 58b1 XB1
+ 265b 82801FB/FBM/FR/FW/FRW (ICH6 Family) USB UHCI #4
+ 1028 0177 Dimension 8400
+ 1028 0179 Optiplex GX280
+ 103c 099c NX6110/NC6120
+ 1043 80a6 P5GD1-VW Mainboard
+ 1458 265a GA-8I915ME-G Mainboard
+ 1462 7028 915P/G Neo2
+ 1734 105c Scenic W620
+ e4bf 0ccd CCD-CALYPSO
+ e4bf 0cd3 CD3-JIVE
+ e4bf 58b1 XB1
+ 265c 82801FB/FBM/FR/FW/FRW (ICH6 Family) USB2 EHCI Controller
+ 1028 0177 Dimension 8400
+ 1028 0179 Optiplex GX280
+ 103c 0934 Compaq nw8240/nx8220
+ 103c 099c NX6110/NC6120
+ 1043 80a6 P5GD1-VW Mainboard
+ 1458 5006 GA-8I915ME-G Mainboard
+ 1462 7028 915P/G Neo2
+ 1734 105c Scenic W620
+ 8086 265c Dimension 3100
+ e4bf 0ccd CCD-CALYPSO
+ e4bf 0cd3 CD3-JIVE
+ e4bf 58b1 XB1
+ 2660 82801FB/FBM/FR/FW/FRW (ICH6 Family) PCI Express Port 1
+ 103c 0934 HP Compaq nw8240 Mobile Workstation
+ 103c 099c NX6110/NC6120
+ e4bf 0ccd CCD-CALYPSO
+ e4bf 0cd3 CD3-JIVE
+ e4bf 58b1 XB1
+ 2662 82801FB/FBM/FR/FW/FRW (ICH6 Family) PCI Express Port 2
+ 103c 0934 HP Compaq nw8240 Mobile Workstation
+ e4bf 0ccd CCD-CALYPSO
+ e4bf 0cd3 CD3-JIVE
+ e4bf 58b1 XB1
+ 2664 82801FB/FBM/FR/FW/FRW (ICH6 Family) PCI Express Port 3
+ e4bf 0ccd CCD-CALYPSO
+ e4bf 0cd3 CD3-JIVE
+ e4bf 58b1 XB1
+ 2666 82801FB/FBM/FR/FW/FRW (ICH6 Family) PCI Express Port 4
+ e4bf 0ccd CCD-CALYPSO
+ e4bf 0cd3 CD3-JIVE
+ e4bf 58b1 XB1
+ 2668 82801FB/FBM/FR/FW/FRW (ICH6 Family) High Definition Audio Controller
+ 1014 05b7 ThinkPad Z60t
+# based on the PTGD1-LA motherboard
+ 103c 2a09 PufferM-UL8E
+ 1043 1173 Asus A6VC
+ 1043 814e P5GD1-VW Mainboard
+ 1462 7028 915P/G Neo2
+ 266a 82801FB/FBM/FR/FW/FRW (ICH6 Family) SMBus Controller
+ 1028 0177 Dimension 8400
+ 1028 0179 Optiplex GX280
+ 1043 80a6 P5GD1-VW Mainboard
+ 1458 266a GA-8I915ME-G Mainboard
+ 1462 7028 915P/G Neo2
+ 1734 105c Scenic W620
+ e4bf 0ccd CCD-CALYPSO
+ e4bf 0cd3 CD3-JIVE
+ e4bf 58b1 XB1
+ 266c 82801FB/FBM/FR/FW/FRW (ICH6 Family) LAN Controller
+ 266d 82801FB/FBM/FR/FW/FRW (ICH6 Family) AC'97 Modem Controller
+ 1025 006a Conexant AC'97 CoDec (in Acer TravelMate 2410 serie laptop)
+ 103c 0934 Compaq nw8240/nx8220
+ 103c 099c NX6110/NC6120
+ 266e 82801FB/FBM/FR/FW/FRW (ICH6 Family) AC'97 Audio Controller
+ 1025 006a Realtek ALC 655 codec (in Acer TravelMate 2410 serie laptop)
+ 1028 0177 Dimension 8400
+ 1028 0179 Optiplex GX280
+ 1028 0182 Latitude D610 Laptop
+ 1028 0187 Dell Precision M70 Laptop
+ 1028 0188 Inspiron 6000 laptop
+ 103c 0934 Compaq nw8240/nx8220
+ 103c 0944 Compaq NC6220
+ 103c 099c NX6110/NC6120
+ 103c 3006 DC7100 SFF(DX878AV)
+ 1458 a002 GA-8I915ME-G Mainboard
+ 152d 0745 Packard Bell A8550 Laptop
+ 1734 105a Scenic W620
+ 266f 82801FB/FBM/FR/FW/FRW (ICH6 Family) IDE Controller
+ 1028 0177 Dimension 8400
+ 103c 0934 Compaq nw8240/nx8220
+ 103c 099c NX6110/NC6120
+ 1043 80a6 P5GD1-VW Mainboard
+ 1458 266f GA-8I915ME-G Mainboard
+ 1462 7028 915P/G Neo2
+ 1734 105c Scenic W620
+ e4bf 0ccd CCD-CALYPSO
+ e4bf 0cd3 CD3-JIVE
+ e4bf 58b1 XB1
+ 2670 631xESB/632xESB/3100 Chipset LPC Interface Controller
+ 15d9 8680 X7DVL-E-O motherboard
+ 8086 3476 Intel S5000PSLSATA Server Board
+ 2680 631xESB/632xESB/3100 Chipset SATA IDE Controller
+ 2681 631xESB/632xESB SATA AHCI Controller
+ 15d9 8680 X7DVL-E-O motherboard
+ 8086 3476 Intel S5000PSLSATA Server Board
+ 2682 631xESB/632xESB SATA RAID Controller
+ 2683 631xESB/632xESB SATA RAID Controller
+ 2688 631xESB/632xESB/3100 Chipset UHCI USB Controller #1
+ 1028 01bb PowerEdge 1955 onboard USB
+ 1028 01f0 PowerEdge R900 onboard USB
+ 15d9 8680 X7DVL-E-O motherboard
+ 8086 3476 Intel S5000PSLSATA Server Board
+ 2689 631xESB/632xESB/3100 Chipset UHCI USB Controller #2
+ 1028 01bb PowerEdge 1955 onboard USB
+ 1028 01f0 PowerEdge R900 onboard USB
+ 15d9 8680 X7DVL-E-O motherboard
+ 8086 3476 Intel S5000PSLSATA Server Board
+ 268a 631xESB/632xESB/3100 Chipset UHCI USB Controller #3
+ 1028 01f0 PowerEdge R900 onboard USB
+ 15d9 8680 X7DVL-E-O motherboard
+ 8086 3476 Intel S5000PSLSATA Server Board
+ 268b 631xESB/632xESB/3100 Chipset UHCI USB Controller #4
+ 1028 01f0 PowerEdge R900 onboard USB
+ 15d9 8680 X7DVL-E-O motherboard
+ 8086 3476 Intel S5000PSLSATA Server Board
+ 268c 631xESB/632xESB/3100 Chipset EHCI USB2 Controller
+ 1028 01bb PowerEdge 1955 onboard USB
+ 1028 01f0 PowerEdge R900 onboard USB
+ 15d9 8680 X7DVL-E-O motherboard
+ 8086 3476 Intel S5000PSLSATA Server Board
+ 2690 631xESB/632xESB/3100 Chipset PCI Express Root Port 1
+ 2692 631xESB/632xESB/3100 Chipset PCI Express Root Port 2
+ 2694 631xESB/632xESB/3100 Chipset PCI Express Root Port 3
+ 2696 631xESB/632xESB/3100 Chipset PCI Express Root Port 4
+ 2698 631xESB/632xESB AC '97 Audio Controller
+ 2699 631xESB/632xESB AC '97 Modem Controller
+ 269a 631xESB/632xESB High Definition Audio Controller
+ 269b 631xESB/632xESB/3100 Chipset SMBus Controller
+ 15d9 8680 X7DVL-E-O motherboard
+ 8086 3476 Intel S5000PSLSATA Server Board
+ 269e 631xESB/632xESB IDE Controller
+ 15d9 8680 X7DVL-E-O motherboard
+ 2770 82945G/GZ/P/PL Memory Controller Hub
+ 1028 01ad OptiPlex GX620
+ 103c 2a3b Pavilion A1512X
+ 1043 817a P5LD2-VM Mainboard
+ 107b 5048 E4500
+ 8086 544e DeskTop Board D945GTP
+ 2771 82945G/GZ/P/PL PCI Express Root Port
+ 2772 82945G/GZ Integrated Graphics Controller
+ 103c 2a3b Pavilion A1512X
+ 8086 544e DeskTop Board D945GTP
+ 8086 d605 Intel Desktop Board D945GCCR
+ 2774 82955X Memory Controller Hub
+ 2775 82955X PCI Express Root Port
+ 2776 82945G/GZ Integrated Graphics Controller
+ 2778 E7230/3000/3010 Memory Controller Hub
+ 1028 01df PowerEdge SC440
+ 1028 01e6 PowerEdge 860
+ 2779 E7230/3000/3010 PCI Express Root Port
+ 277a 82975X/3010 PCI Express Root Port
+ 277c 82975X Memory Controller Hub
+ 1043 8178 P5WDG2 WS Professional motherboard
+ 277d 82975X PCI Express Root Port
+ 2782 82915G Integrated Graphics Controller
+ 1043 2582 P5GD1-VW Mainboard
+ 1734 105b Scenic W620
+ 2792 Mobile 915GM/GMS/910GML Express Graphics Controller
+ 103c 099c NX6110/NC6120
+ 1043 1881 GMA 900 915GM Integrated Graphics
+ e4bf 0ccd CCD-CALYPSO
+ e4bf 0cd3 CD3-JIVE
+ e4bf 58b1 XB1
+ 27a0 Mobile 945GM/PM/GMS, 943/940GML and 945GT Express Memory Controller Hub
+ 1025 006c 9814 WKMI
+ 1028 01d7 XPS M1210
+ 103c 309f Compaq nx9420 Notebook
+ 103c 30a1 NC2400
+ 103c 30a3 Compaq nw8440
+ 1043 1237 A6J-Q008
+ 17aa 2015 ThinkPad T60
+ 17aa 2017 ThinkPad T60/R60 series
+ 27a1 Mobile 945GM/PM/GMS, 943/940GML and 945GT Express PCI Express Root Port
+ 103c 309f Compaq nx9420 Notebook
+ 103c 30a3 Compaq nw8440
+ 27a2 Mobile 945GM/GMS, 943/940GML Express Integrated Graphics Controller
+ 103c 30a1 NC2400
+ 17aa 201a ThinkPad T60/R60 series
+ 9902 1584 CCE MPL-D10H120F
+ 27a6 Mobile 945GM/GMS/GME, 943/940GML Express Integrated Graphics Controller
+ 103c 30a1 NC2400
+ 1775 11cc CC11/CL11 integrated graphics (secondary)
+ 17aa 201a ThinkPad T60/R60 series
+ 27ac Mobile 945GME Express Memory Controller Hub
+ 1775 11cc CC11/CL11
+ 27ad Mobile 945GME Express PCI Express Root Port
+ 27ae Mobile 945GME Express Integrated Graphics Controller
+ 1775 11cc CC11/CL11 integrated graphics (primary)
+ 27b0 82801GH (ICH7DH) LPC Interface Bridge
+ 103c 2a3b Pavilion A1512X
+ 8086 544e DeskTop Board D945GTP
+ 27b8 82801GB/GR (ICH7 Family) LPC Interface Bridge
+ 1028 01e6 PowerEdge 860
+ 1043 8179 P5KPL-VM Motherboard
+ 107b 5048 E4500
+ 1775 11cc CC11/CL11
+ 8086 544e DeskTop Board D945GTP
+ 27b9 82801GBM (ICH7-M) LPC Interface Bridge
+ 1028 01d7 XPS M1210
+ 103c 309f Compaq nx9420 Notebook
+ 103c 30a1 NC2400
+ 103c 30a3 Compaq nw8440
+ 10f7 8338 Panasonic CF-Y5 laptop
+ 17aa 2009 ThinkPad T60/R60 series
+ 27bc NM10 Family LPC Controller
+ 8086 4f4d DeskTop Board D510MO
+ 27bd 82801GHM (ICH7-M DH) LPC Interface Bridge
+ 1025 006c 9814 WKMI
+ 27c0 N10/ICH7 Family SATA IDE Controller
+ 1028 01ad OptiPlex GX620
+ 1028 01df PowerEdge SC440
+ 1028 01e6 PowerEdge 860
+ 1043 8179 P5KPL-VM Motherboard
+ 107b 5048 E4500
+ 1462 2310 MSI Hetis 945
+ 1462 7236 945P Neo3-F Rev. 2.2 motherboard
+ 1775 11cc CC11/CL11
+ 8086 544e DeskTop Board D945GTP
+ 27c1 N10/ICH7 Family SATA AHCI Controller
+ 1028 01df PowerEdge SC440
+ 103c 2a3b Pavilion A1512X
+ 1775 11cc CC11/CL11
+ 8086 4f4d DeskTop Board D510MO
+ 8086 5842 DeskTop Board D975XBX
+ 27c3 82801GR/GH (ICH7 Family) SATA RAID Controller
+ 1775 11cc CC11/CL11
+ 8086 544e DeskTop Board D945GTP
+ 27c4 82801GBM/GHM (ICH7 Family) SATA IDE Controller
+ 1025 006c 9814 WKMI
+ 1028 01d7 XPS M1210
+ 17aa 200e Thinkpad T60 model 2007
+ 27c5 82801GBM/GHM (ICH7 Family) SATA AHCI Controller
+ 103c 309f Compaq nx9420 Notebook
+ 103c 30a3 Compaq nw8440
+ 17aa 200d ThinkPad T60/R60 series
+ 27c6 82801GHM (ICH7-M DH) SATA RAID Controller
+ 27c8 N10/ICH 7 Family USB UHCI Controller #1
+ 1025 006c 9814 WKMI
+ 1028 01ad OptiPlex GX620
+ 1028 01d7 XPS M1210
+ 1028 01df PowerEdge SC440
+ 1028 01e6 PowerEdge 860
+ 103c 2a3b Pavilion A1512X
+ 103c 309f Compaq nx9420 Notebook
+ 103c 30a1 NC2400
+ 103c 30a3 Compaq nw8440
+ 1043 1237 A6J-Q008
+ 1043 8179 P5KPL-VM,P5LD2-VM Mainboard
+ 107b 5048 E4500
+ 1775 11cc CC11/CL11
+ 17aa 200a ThinkPad T60/R60 series
+ 8086 4f4d DeskTop Board D510MO
+ 8086 544e DeskTop Board D945GTP
+ 27c9 N10/ICH 7 Family USB UHCI Controller #2
+ 1025 006c 9814 WKMI
+ 1028 01ad OptiPlex GX620
+ 1028 01d7 XPS M1210
+ 1028 01df PowerEdge SC440
+ 1028 01e6 PowerEdge 860
+ 103c 2a3b Pavilion A1512X
+ 103c 309f Compaq nx9420 Notebook
+ 103c 30a1 NC2400
+ 103c 30a3 Compaq nw8440
+ 1043 1237 A6J-Q008
+ 1043 8179 P5KPL-VM,P5LD2-VM Mainboard
+ 107b 5048 E4500
+ 1775 11cc CC11/CL11
+ 17aa 200a ThinkPad T60/R60 series
+ 8086 4f4d DeskTop Board D510MO
+ 8086 544e DeskTop Board D945GTP
+ 27ca N10/ICH 7 Family USB UHCI Controller #3
+ 1025 006c 9814 WKMI
+ 1028 01ad OptiPlex GX620
+ 1028 01d7 XPS M1210
+ 1028 01df PowerEdge SC440
+ 1028 01e6 PowerEdge 860
+ 103c 2a3b Pavilion A1512X
+ 103c 309f Compaq nx9420 Notebook
+ 103c 30a1 NC2400
+ 103c 30a3 Compaq nw8440
+ 1043 1237 A6J-Q008
+ 1043 8179 P5KPL-VM,P5LD2-VM Mainboard
+ 107b 5048 E4500
+ 1775 11cc CC11/CL11
+ 17aa 200a ThinkPad T60/R60 series
+ 8086 4f4d DeskTop Board D510MO
+ 8086 544e DeskTop Board D945GTP
+ 27cb N10/ICH 7 Family USB UHCI Controller #4
+ 1025 006c 9814 WKMI
+ 1028 01ad OptiPlex GX620
+ 1028 01d7 XPS M1210
+ 1028 01df PowerEdge SC440
+ 103c 2a3b Pavilion A1512X
+ 103c 309f Compaq nx9420 Notebook
+ 103c 30a1 NC2400
+ 103c 30a3 Compaq nw8440
+ 1043 1237 A6J-Q008
+ 1043 8179 P5KPL-VM,P5LD2-VM Mainboard
+ 107b 5048 E4500
+ 1775 11cc CC11/CL11
+ 17aa 200a ThinkPad T60/R60 series
+ 8086 4f4d DeskTop Board D510MO
+ 8086 544e DeskTop Board D945GTP
+ 27cc N10/ICH 7 Family USB2 EHCI Controller
+ 1025 006c 9814 WKMI
+ 1028 01ad OptiPlex GX620
+ 1028 01d7 XPS M1210
+ 1028 01df PowerEdge SC440
+ 1028 01e6 PowerEdge 860
+ 103c 2a3b Pavilion A1512X
+ 103c 309f Compaq nx9420 Notebook
+ 103c 30a1 NC2400
+ 103c 30a3 Compaq nw8440
+ 1043 1237 A6J-Q008
+ 1043 8179 P5KPL-VM,P5LD2-VM Mainboard
+ 1775 11cc CC11/CL11
+ 17aa 200b ThinkPad T60/R60 series
+ 8086 4f4d DeskTop Board D510MO
+ 8086 544e DeskTop Board D945GTP
+ 27d0 N10/ICH 7 Family PCI Express Port 1
+ 103c 309f Compaq nx9420 Notebook
+ 103c 30a3 Compaq nw8440
+ 1775 11cc CC11/CL11
+ 27d2 N10/ICH 7 Family PCI Express Port 2
+ 103c 309f Compaq nx9420 Notebook
+ 103c 30a3 Compaq nw8440
+ 1775 11cc CC11/CL11
+ 27d4 N10/ICH 7 Family PCI Express Port 3
+ 1775 11cc CC11/CL11
+ 27d6 N10/ICH 7 Family PCI Express Port 4
+ 103c 30a3 Compaq nw8440
+ 1775 11cc CC11/CL11
+ 27d8 N10/ICH 7 Family High Definition Audio Controller
+ 1025 006c 9814 WKMI
+ 1028 01d7 XPS M1210
+ 103c 2a3b Pavilion A1512X
+ 103c 309f Compaq nx9420 Notebook
+ 103c 30a1 NC2400
+ 103c 30a3 Compaq nw8440
+ 1043 1123 A6J-Q008
+ 1043 13c4 Asus G2P
+ 1043 817f P5LD2-VM Mainboard (Realtek ALC 882 codec)
+ 1043 8290 P5KPL-VM Motherboard
+ 1043 82ea P5KPL-CM Motherboard
+ 107b 5048 E4500
+ 10f7 8338 Panasonic CF-Y5 laptop
+ 1179 ff10 Toshiba Satellite A100-796 audio (Realtek ALC861)
+ 1179 ff31 AC97 Data Fax SoftModem with SmartCP
+ 1447 1043 Asus A8JP (Analog Devices AD1986A)
+ 1458 a102 GA-8I945PG-RH Mainboard
+ 152d 0753 Softmodem
+ 1734 10ad Conexant softmodem SmartCP
+ 17aa 2010 ThinkPad T60/R60 series
+ 17aa 3802 Lenovo 3000 C200 audio [Realtek ALC861VD]
+ 8086 1112 DeskTop Board D945GTP
+ 8086 27d8 DeskTop Board D945GTP
+ 8086 d618 DeskTop Board D510MO
+ 27da N10/ICH 7 Family SMBus Controller
+ 1025 006c 9814 WKMI
+ 1028 01ad OptiPlex GX620
+ 1028 01d7 XPS M1210
+ 1028 01df PowerEdge SC440
+ 1028 01e6 PowerEdge 860
+ 103c 2a3b Pavilion A1512X
+ 1043 8179 P5KPL-VM Motherboard
+ 10f7 8338 Panasonic CF-Y5 laptop
+ 1458 5001 GA-8I945PG-RH Mainboard
+ 1775 11cc CC11/CL11
+ 17aa 200f ThinkPad T60/R60 series
+ 8086 4f4d DeskTop Board D510MO
+ 8086 544e DeskTop Board D945GTP
+ 8086 5842 DeskTop Board D975XBX
+ 27dc N10/ICH 7 Family LAN Controller
+ 103c 2a3b Pavilion A1512X
+ 8086 308d DeskTop Board D945GTP
+ 27dd 82801G (ICH7 Family) AC'97 Modem Controller
+ 27de 82801G (ICH7 Family) AC'97 Audio Controller
+ 1028 01ad OptiPlex GX620
+ 1462 7267 Realtek ALC883 Audio Controller
+ 1775 11cc CC11 integrated audio (AD1981BL codec)
+ 27df 82801G (ICH7 Family) IDE Controller
+ 1028 01df PowerEdge SC440
+ 1028 01e6 PowerEdge 860
+ 103c 2a3b Pavilion A1512X
+ 103c 309f Compaq nx9420 Notebook
+ 103c 30a1 NC2400
+ 103c 30a3 Compaq nw8440
+ 1043 1237 A6J-Q008
+ 1043 8179 P5KPL-VM Motherboard
+ 107b 5048 E4500
+ 10f7 8338 Panasonic CF-Y5 laptop
+ 1775 11cc CC11/CL11
+ 17aa 200c ThinkPad T60/R60 series
+ 8086 544e DeskTop Board D945GTP
+ 27e0 82801GR/GH/GHM (ICH7 Family) PCI Express Port 5
+ 1775 11cc CC11/CL11
+ 27e2 82801GR/GH/GHM (ICH7 Family) PCI Express Port 6
+ 1775 11cc CC11/CL11
+ 2802 82GL40 [Cantiga] High Definition Audio HDMI Service
+ 2810 82801HB/HR (ICH8/R) LPC Interface Controller
+ 1043 81ec P5B
+ 2811 82801HBM (ICH8M-E) LPC Interface Controller
+ 103c 30c1 Compaq 6910p
+ 17aa 20b6 T61
+ e4bf cc47 CCG-RUMBA
+ 2812 82801HH (ICH8DH) LPC Interface Controller
+ 2814 82801HO (ICH8DO) LPC Interface Controller
+ 2815 82801HEM (ICH8M) LPC Interface Controller
+ 1025 0121 Aspire 5920G
+ 1028 01f3 Inspiron 1420
+ 103c 30c0 Compaq 6710b
+ 103c 30d9 Presario C700
+ 104d 9005 Vaio VGN-FZ260E
+ 104d 902d VAIO VGN-NR120E
+ 2820 82801H (ICH8 Family) 4 port SATA IDE Controller
+ 1028 01da OptiPlex 745
+ 1462 7235 P965 Neo MS-7235 mainboard
+ 2821 82801HR/HO/HH (ICH8R/DO/DH) 6 port SATA AHCI Controller
+ 2822 82801 SATA RAID Controller
+ 1028 020d Inspiron 530
+ 2824 82801HB (ICH8) 4 port SATA AHCI Controller
+ 1043 81ec P5B
+ 2825 82801H (ICH8 Family) 2 port SATA IDE Controller
+ 1028 01da OptiPlex 745
+ 1462 7235 P965 Neo MS-7235 mainboard
+ 2826 Patsburg SATA RAID Controller
+ 2828 82801HBM/HEM (ICH8M/ICH8M-E) SATA IDE Controller
+ 1028 01f3 Inspiron 1420
+ 103c 30c0 Compaq 6710b
+ e4bf cc47 CCG-RUMBA
+ 2829 82801HBM/HEM (ICH8M/ICH8M-E) SATA AHCI Controller
+ 1025 0121 Aspire 5920G
+ 103c 30c0 Compaq 6710b
+ 103c 30c1 Compaq 6910p
+ 103c 30d9 Presario C700
+ 104d 9005 Vaio VGN-FZ260E
+ 104d 902d VAIO VGN-NR120E
+ 17aa 20a7 ThinkPad T61
+ e4bf cc47 CCG-RUMBA
+ 282a Mobile 82801 SATA RAID Controller
+ 1028 040b Latitude E6510
+ e4bf 50c1 PC1-GROOVE
+ 2830 82801H (ICH8 Family) USB UHCI Controller #1
+ 1025 0121 Acer Aspire 5920G
+ 1028 01da OptiPlex 745
+ 1028 01f3 Inspiron 1420
+ 103c 30c0 Compaq 6710b
+ 103c 30c1 Compaq 6910p
+ 103c 30d9 Presario C700
+ 1043 81ec P5B
+ 104d 9005 Vaio VGN-FZ260E
+ 104d 902d VAIO VGN-NR120E
+ 1462 7235 P965 Neo MS-7235 mainboard
+ 17aa 20aa ThinkPad T61
+ e4bf cc47 CCG-RUMBA
+ 2831 82801H (ICH8 Family) USB UHCI Controller #2
+ 1025 0121 Aspire 5920G
+ 1028 01da OptiPlex 745
+ 1028 01f3 Inspiron 1420
+ 103c 30c0 Compaq 6710b
+# Name mistyped on previous submission
+ 103c 30c1 Compaq 6910p
+ 103c 30d9 Presario C700
+ 1043 81ec P5B
+ 104d 9005 Vaio VGN-FZ260E
+ 104d 902d VAIO VGN-NR120E
+ 1462 7235 P965 Neo MS-7235 mainboard
+ 17aa 20aa ThinkPad T61
+ e4bf cc47 CCG-RUMBA
+ 2832 82801H (ICH8 Family) USB UHCI Controller #3
+ 1025 0121 Aspire 5920G
+ 1028 01da OptiPlex 745
+ 1028 01f3 Inspiron 1420
+ 103c 30c0 Compaq 6710b
+ 103c 30c1 Compaq 6910p
+ 103c 30d9 Presario C700
+ 1043 81ec P5B
+ 104d 9005 Vaio VGN-FZ260E
+ 104d 902d VAIO VGN-NR120E
+ 17aa 20aa ThinkPad T61
+ e4bf cc47 CCG-RUMBA
+ 2833 82801H (ICH8 Family) USB UHCI Controller #4
+ 1043 81ec P5B
+ 2834 82801H (ICH8 Family) USB UHCI Controller #4
+ 1025 0121 Aspire 5920G
+ 1028 01da OptiPlex 745
+ 1028 01f3 Inspiron 1420
+ 103c 30c0 Compaq 6710b
+ 103c 30c1 Compaq 6910p
+ 1043 81ec P5B
+ 104d 9005 Vaio VGN-FZ260E
+ 104d 902d VAIO VGN-NR120E
+ 1462 7235 P965 Neo MS-7235 mainboard
+ 17aa 20aa ThinkPad T61
+ e4bf cc47 CCG-RUMBA
+ 2835 82801H (ICH8 Family) USB UHCI Controller #5
+ 1025 0121 Acer Aspire 5920G
+ 1028 01da OptiPlex 745
+ 1028 01f3 Inspiron 1420
+ 103c 30c0 Compaq 6710b
+ 103c 30c1 Compaq 6910p
+ 1043 81ec P5B
+ 104d 9005 Vaio VGN-FZ260E
+ 104d 902d VAIO VGN-NR120E
+ 17aa 20aa ThinkPad T60
+ e4bf cc47 CCG-RUMBA
+ 2836 82801H (ICH8 Family) USB2 EHCI Controller #1
+ 1025 0121 Aspire 5920G
+ 1028 01da OptiPlex 745
+ 1028 01f3 Inspiron 1420
+ 103c 30c0 Compaq 6710b
+ 103c 30c1 Compaq 6910p
+ 103c 30d9 Presario C700
+ 1043 81ec P5B
+ 104d 9005 Vaio VGN-FZ260E
+ 104d 902d VAIO VGN-NR120E
+ 1462 7235 P965 Neo MS-7235 mainboard
+ 17aa 20ab ThinkPad T61
+ e4bf cc47 CCG-RUMBA
+ 283a 82801H (ICH8 Family) USB2 EHCI Controller #2
+ 1025 0121 Acer Aspire 5920G
+ 1028 01da OptiPlex 745
+ 1028 01f3 Inspiron 1420
+ 103c 30c0 Compaq 6710b
+ 103c 30c1 Compaq 6910p
+ 1043 81ec P5B
+ 104d 9005 Vaio VGN-FZ260E
+ 104d 902d VAIO VGN-NR120E
+ 17aa 20ab ThinkPad T61
+ e4bf cc47 CCG-RUMBA
+ 283e 82801H (ICH8 Family) SMBus Controller
+ 1025 0121 Aspire 5920G
+ 1028 01da OptiPlex 745
+ 1028 01f3 Inspiron 1420
+ 103c 30d9 Presario C700
+ 1043 81ec P5B
+ 104d 9005 Vaio VGN-FZ260E
+ 104d 9008 Vaio VGN-SZ79SN_C
+ 104d 902d VAIO VGN-NR120E
+ 1462 7235 P965 Neo MS-7235 mainboard
+ 17aa 20a9 ThinkPad T61
+ e4bf cc47 CCG-RUMBA
+ 283f 82801H (ICH8 Family) PCI Express Port 1
+ 1028 01da OptiPlex 745
+ 103c 30c1 Compaq 6910p
+ 104d 902d VAIO VGN-NR120E
+ 17aa 20ad ThinkPad T61
+ 2841 82801H (ICH8 Family) PCI Express Port 2
+ 103c 30c1 Compaq 6910p
+ 104d 902d VAIO VGN-NR120E
+ 17aa 20ad ThinkPad T61
+ 2843 82801H (ICH8 Family) PCI Express Port 3
+ 104d 902d VAIO VGN-NR120E
+ 17aa 20ad ThinkPad T61
+ 2845 82801H (ICH8 Family) PCI Express Port 4
+ 17aa 20ad ThinkPad T61
+ 2847 82801H (ICH8 Family) PCI Express Port 5
+ 1028 01da OptiPlex 745
+ 103c 30c1 Compaq 6910p
+ 17aa 20ad ThinkPad T61
+ 2849 82801H (ICH8 Family) PCI Express Port 6
+ 284b 82801H (ICH8 Family) HD Audio Controller
+ 1025 011f Realtek ALC268 audio codec
+ 1025 0121 Aspire 5920G
+ 1025 0145 Realtek ALC889 (Aspire 8920G w. Dolby Theather)
+ 1028 01da OptiPlex 745
+ 1028 01f3 Inspiron 1420
+ 1028 01f9 Dell Latitude D630
+ 1028 01ff Dell Precision M4300
+ 1028 0256 Studio 1735
+ 103c 2802 HP Compaq dc7700p
+ 103c 30c0 Compaq 6710b
+ 103c 30c1 Compaq 6910p
+ 1043 1339 Asus M51S series
+ 1043 81ec P5B
+ 104d 9005 Vaio VGN-FZ260E
+ 104d 9008 Vaio VGN-SZ79SN_C
+ 104d 9016 Sony VAIO VGN-AR51M
+ 104d 902d VAIO VGN-NR120E
+ 14f1 5051 Presario C700
+ 17aa 20ac ThinkPad T61
+ 8384 7616 Dell Vostro 1400
+ e4bf cc47 CCG-RUMBA
+ 284f 82801H (ICH8 Family) Thermal Reporting Device
+ 2850 82801HBM/HEM (ICH8M/ICH8M-E) IDE Controller
+ 1025 0121 Aspire 5920G
+ 1028 01f3 Inspiron 1420
+ 103c 30c0 Compaq 6710b
+ 103c 30c1 Compaq 6910p
+ 103c 30d9 Presario C700
+ 104d 9005 Vaio VGN-FZ260E
+ 104d 902d VAIO VGN-NR120E
+ 17aa 20a6 ThinkPad T61
+ e4bf cc47 CCG-RUMBA
+ 2912 82801IH (ICH9DH) LPC Interface Controller
+ 2914 82801IO (ICH9DO) LPC Interface Controller
+ 1028 0211 Optiplex 755
+ 2916 82801IR (ICH9R) LPC Interface Controller
+ 1028 020d Inspiron 530
+ 2917 ICH9M-E LPC Interface Controller
+ e4bf cc4d CCM-BOOGIE
+ 2918 82801IB (ICH9) LPC Interface Controller
+ 1028 0236 PowerEdge R610 82801IB (ICH9) LPC Interface Controller
+ 1462 7360 G33/P35 Neo
+ 2919 ICH9M LPC Interface Controller
+ 2920 82801IR/IO/IH (ICH9R/DO/DH) 4 port SATA IDE Controller
+ 1028 020d Inspiron 530
+ 1028 020f PowerEdge R300 onboard SATA Controller
+ 1028 0210 PowerEdge T300 onboard SATA Controller
+ 1028 0211 Optiplex 755
+ 1028 023c PowerEdge R200 onboard SATA Controller
+ 2921 82801IB (ICH9) 2 port SATA IDE Controller
+ 1028 0235 PowerEdge R710 SATA IDE Controller
+ 1028 0236 PowerEdge R610 SATA IDE Controller
+ 1028 0237 PowerEdge T610 SATA IDE Controller
+ 1462 7360 G33/P35 Neo
+ 2922 82801IR/IO/IH (ICH9R/DO/DH) 6 port SATA AHCI Controller
+ 2923 82801IB (ICH9) 4 port SATA AHCI Controller
+ 2925 82801IR/IO (ICH9R/DO) SATA RAID Controller
+ 1734 10e0 System Board D2542
+ 8086 2925 System Board D2542
+ 2926 82801I (ICH9 Family) 2 port SATA IDE Controller
+ 1028 020d Inspiron 530
+ 1028 020f PowerEdge R300 onboard SATA Controller
+ 1028 0210 PowerEdge T300 onboard SATA Controller
+ 1028 0211 Optiplex 755
+ 1462 7360 G33/P35 Neo
+ 2928 ICH9M/M-E 2 port SATA IDE Controller
+ 2929 ICH9M/M-E SATA AHCI Controller
+ 103c 3628 dv6-1190en
+ e4bf cc4d CCM-BOOGIE
+ 292c ICH9M-E SATA RAID Controller
+ 292d ICH9M/M-E 2 port SATA IDE Controller
+ e4bf cc4d CCM-BOOGIE
+ 292e ICH9M SATA IDE Controller
+ 2930 82801I (ICH9 Family) SMBus Controller
+ 1028 020d Inspiron 530
+ 1028 0211 Optiplex 755
+ 103c 3628 dv6-1190en
+ 1462 7360 G33/P35 Neo
+ e4bf cc4d CCM-BOOGIE
+ 2932 82801I (ICH9 Family) Thermal Subsystem
+ 103c 3628 dv6-1190en
+ 2934 82801I (ICH9 Family) USB UHCI Controller #1
+ 1028 020d Inspiron 530
+ 1028 020f PowerEdge R300 onboard UHCI
+ 1028 0210 PowerEdge T300 onboard UHCI
+ 1028 0211 Optiplex 755
+ 1028 0235 PowerEdge R710 USB UHCI Controller
+ 1028 0236 PowerEdge R610 USB UHCI Controller
+ 1028 0237 PowerEdge T610 USB UHCI Controller
+ 1028 023c PowerEdge R200 onboard UHCI
+ 1028 0287 PowerEdge M610 onboard UHCI
+ 1028 029c PowerEdge M710 USB UHCI Controller
+ 1028 2011 Optiplex 755
+ 1462 7360 G33/P35 Neo
+ e4bf cc4d CCM-BOOGIE
+ 2935 82801I (ICH9 Family) USB UHCI Controller #2
+ 1028 020d Inspiron 530
+ 1028 020f PowerEdge R300 onboard UHCI
+ 1028 0210 PowerEdge T300 onboard UHCI
+ 1028 0211 Optiplex 755
+ 1028 0235 PowerEdge R710 USB UHCI Controller
+ 1028 0236 PowerEdge R610 USB UHCI Controller
+ 1028 0237 PowerEdge T610 USB UHCI Controller
+ 1028 023c PowerEdge R200 onboard UHCI
+ 1028 0287 PowerEdge M610 onboard UHCI
+ 1028 029c PowerEdge M710 USB UHCI Controller
+ 1462 7360 G33/P35 Neo
+ e4bf cc4d CCM-BOOGIE
+ 2936 82801I (ICH9 Family) USB UHCI Controller #3
+ 1028 020d Inspiron 530
+ 1028 020f PowerEdge R300 onboard UHCI
+ 1028 0210 PowerEdge T300 onboard UHCI
+ 1028 0211 Optiplex 755
+ 1028 0237 PowerEdge T610 USB UHCI Controller
+ 1028 023c PowerEdge R200 onboard UHCI
+ 1028 0287 PowerEdge M610 onboard UHCI
+ 1028 029c PowerEdge M710 USB UHCI Controller
+ 1462 7360 G33/P35 Neo
+ e4bf cc4d CCM-BOOGIE
+ 2937 82801I (ICH9 Family) USB UHCI Controller #4
+ 1028 020d Inspiron 530
+ 1028 0211 Optiplex 755
+ 1028 0235 PowerEdge R710 USB UHCI Controller
+ 1028 0236 PowerEdge R610 USB UHCI Controller
+ 1028 0237 PowerEdge T610 USB UHCI Controller
+ 1028 0287 PowerEdge M610 onboard UHCI
+ 1028 029c PowerEdge M710 USB UHCI Controller
+ 1028 2011 Optiplex 755
+ 1462 7360 G33/P35 Neo
+ 8086 2937 Optiplex 755
+ 8086 2942 828011 (ICH9 Family ) USB UHCI Controller
+ e4bf cc4d CCM-BOOGIE
+ 2938 82801I (ICH9 Family) USB UHCI Controller #5
+ 1028 020d Inspiron 530
+ 1028 0211 Optiplex 755
+ 1028 0235 PowerEdge R710 USB UHCI Controller
+ 1028 0236 PowerEdge R610 USB UHCI Controller
+ 1028 0237 PowerEdge T610 USB UHCI Controller
+ 1028 0287 PowerEdge M610 onboard UHCI
+ 1028 029c PowerEdge M710 USB UHCI Controller
+ 1462 7360 G33/P35 Neo
+ 8086 2938 Optiplex 755
+ e4bf cc4d CCM-BOOGIE
+ 2939 82801I (ICH9 Family) USB UHCI Controller #6
+ 1028 020d Inspiron 530
+ 1028 0210 PowerEdge T300 onboard UHCI
+ 1028 0237 PowerEdge T610 USB UHCI Controller
+ 1462 7360 G33/P35 Neo
+ e4bf cc4d CCM-BOOGIE
+ 293a 82801I (ICH9 Family) USB2 EHCI Controller #1
+ 1028 020d Inspiron 530
+ 1028 020f PowerEdge R300 onboard EHCI
+ 1028 0210 PowerEdge T300 onboard EHCI
+ 1028 0211 Optiplex 755
+ 1028 0235 PowerEdge R710 USB EHCI Controller
+ 1028 0236 PowerEdge R610 USB EHCI Controller
+ 1028 0237 PowerEdge T610 USB EHCI Controller
+ 1028 023c PowerEdge R200 onboard EHCI
+ 1028 0287 PowerEdge M610 onboard EHCI
+ 1028 029c PowerEdge M710 USB EHCI Controller
+ 1462 7360 G33/P35 Neo
+ e4bf cc4d CCM-BOOGIE
+ 293c 82801I (ICH9 Family) USB2 EHCI Controller #2
+ 1028 020d Inspiron 530
+ 1028 0211 Optiplex 755
+ 1028 0235 PowerEdge R710 USB EHCI Controller
+ 1028 0236 PowerEdge R610 USB EHCI Controller
+ 1028 0237 PowerEdge T610 USB EHCI Controller
+ 1028 0287 PowerEdge M610 onboard EHCI
+ 1028 029c PowerEdge M710 USB EHCI Controller
+ 1462 7360 G33/P35 Neo
+ 8086 293c Optiplex 755
+ e4bf cc4d CCM-BOOGIE
+ 293e 82801I (ICH9 Family) HD Audio Controller
+ 1028 020d Inspiron 530
+ 1028 0211 Optiplex 755
+ 103c 3628 dv6-1190en
+ 1462 7360 G33/P35 Neo
+ 8086 293e Optiplex 755
+ 8086 2940 Optiplex 755
+ e4bf cc4d CCM-BOOGIE
+ 2940 82801I (ICH9 Family) PCI Express Port 1
+ 1028 020d Inspiron 530
+ 1028 0211 Optiplex 755
+ 8086 2940 Optiplex 755
+ 2942 82801I (ICH9 Family) PCI Express Port 2
+ 1028 020d Inspiron 530
+ 2944 82801I (ICH9 Family) PCI Express Port 3
+ 1028 020d Inspiron 530
+ 2946 82801I (ICH9 Family) PCI Express Port 4
+ 1028 020d Inspiron 530
+ 2948 82801I (ICH9 Family) PCI Express Port 5
+ 1028 020d Inspiron 530
+ 294a 82801I (ICH9 Family) PCI Express Port 6
+ 1028 020d Inspiron 530
+ 294c 82566DC-2 Gigabit Network Connection
+ 17aa 302e 82566DM-2 Gigabit Network Connection
+ 2970 82946GZ/PL/GL Memory Controller Hub
+ 2971 82946GZ/PL/GL PCI Express Root Port
+ 2972 82946GZ/GL Integrated Graphics Controller
+ 2973 82946GZ/GL Integrated Graphics Controller
+ 2974 82946GZ/GL HECI Controller
+ 2975 82946GZ/GL HECI Controller
+ 2976 82946GZ/GL PT IDER Controller
+ 2977 82946GZ/GL KT Controller
+ 2980 82G35 Express DRAM Controller
+ 2981 82G35 Express PCI Express Root Port
+ 2982 82G35 Express Integrated Graphics Controller
+ 2983 82G35 Express Integrated Graphics Controller
+ 2984 82G35 Express HECI Controller
+ 2990 82Q963/Q965 Memory Controller Hub
+ 1028 01da OptiPlex 745
+ 2991 82Q963/Q965 PCI Express Root Port
+ 2992 82Q963/Q965 Integrated Graphics Controller
+ 2993 82Q963/Q965 Integrated Graphics Controller
+ 2994 82Q963/Q965 HECI Controller
+ 2995 82Q963/Q965 HECI Controller
+ 2996 82Q963/Q965 PT IDER Controller
+ 2997 82Q963/Q965 KT Controller
+ 29a0 82P965/G965 Memory Controller Hub
+ 1043 81ea P5B
+ 1462 7276 MS-7276 [G965MDH]
+ 29a1 82P965/G965 PCI Express Root Port
+ 29a2 82G965 Integrated Graphics Controller
+ 1462 7276 MS-7276 [G965MDH]
+ 29a3 82G965 Integrated Graphics Controller
+ 29a4 82P965/G965 HECI Controller
+ 29a5 82P965/G965 HECI Controller
+ 29a6 82P965/G965 PT IDER Controller
+ 29a7 82P965/G965 KT Controller
+ 29b0 82Q35 Express DRAM Controller
+ 1028 0211 OptiPlex 755
+ 29b1 82Q35 Express PCI Express Root Port
+ 1028 0211 OptiPlex 755
+ 29b2 82Q35 Express Integrated Graphics Controller
+ 1028 0211 OptiPlex 755
+ 29b3 82Q35 Express Integrated Graphics Controller
+ 1028 0211 OptiPlex 755
+ 29b4 82Q35 Express MEI Controller
+ 1028 0211 OptiPlex 755
+ 29b5 82Q35 Express MEI Controller
+ 29b6 82Q35 Express PT IDER Controller
+ 1028 0211 OptiPlex 755
+ 29b7 82Q35 Express Serial KT Controller
+ 1028 0211 OptiPlex 755
+ 29c0 82G33/G31/P35/P31 Express DRAM Controller
+ 1028 020d Inspiron 530
+ 1043 82b0 P5KPL-VM Motherboard
+ 1462 7360 G33/P35 Neo
+ 29c1 82G33/G31/P35/P31 Express PCI Express Root Port
+ 1028 020d Inspiron 530
+ 29c2 82G33/G31 Express Integrated Graphics Controller
+ 1028 020d Inspiron 530
+ 1043 82b0 P5KPL-VM Motherboard
+ 29c3 82G33/G31 Express Integrated Graphics Controller
+ 1028 020d Inspiron 530
+ 1043 82b0 P5KPL-VM Motherboard
+ 29c4 82G33/G31/P35/P31 Express MEI Controller
+ 29c5 82G33/G31/P35/P31 Express MEI Controller
+ 29c6 82G33/G31/P35/P31 Express PT IDER Controller
+ 29c7 82G33/G31/P35/P31 Express Serial KT Controller
+ 29cf Virtual HECI Controller
+ 29d0 82Q33 Express DRAM Controller
+ 29d1 82Q33 Express PCI Express Root Port
+ 29d2 82Q33 Express Integrated Graphics Controller
+ 29d3 82Q33 Express Integrated Graphics Controller
+ 29d4 82Q33 Express MEI Controller
+ 29d5 82Q33 Express MEI Controller
+ 29d6 82Q33 Express PT IDER Controller
+ 29d7 82Q33 Express Serial KT Controller
+ 29e0 82X38/X48 Express DRAM Controller
+ 29e1 82X38/X48 Express Host-Primary PCI Express Bridge
+ 29e4 82X38/X48 Express MEI Controller
+ 29e5 82X38/X48 Express MEI Controller
+ 29e6 82X38/X48 Express PT IDER Controller
+ 29e7 82X38/X48 Express Serial KT Controller
+ 29e9 82X38/X48 Express Host-Secondary PCI Express Bridge
+ 29f0 3200/3210 Chipset DRAM Controller
+ 29f1 3200/3210 Chipset Host-Primary PCI Express Bridge
+ 29f4 3200/3210 Chipset MEI Controller
+ 29f5 3200/3210 Chipset MEI Controller
+ 29f6 3200/3210 Chipset PT IDER Controller
+ 29f7 3200/3210 Chipset Serial KT Controller
+ 29f9 3210 Chipset Host-Secondary PCI Express Bridge
+ 2a00 Mobile PM965/GM965/GL960 Memory Controller Hub
+ 1025 0121 Acer Aspire 5920G
+ 1028 01f3 Inspiron 1420
+ 103c 30c0 Compaq 6710b
+ 103c 30c1 Compaq 6910p
+ 103c 30d9 Presario C700
+ 104d 9005 Vaio VGN-FZ260E
+ 104d 902d VAIO VGN-NR120E
+ 17aa 20b1 ThinkPad T61
+ 17aa 20b3 T61
+ e4bf cc47 CCG-RUMBA
+ 2a01 Mobile PM965/GM965/GL960 PCI Express Root Port
+ 2a02 Mobile GM965/GL960 Integrated Graphics Controller (primary)
+ 1028 01f3 Inspiron 1420
+ 1028 01f9 Latitude D630
+ 103c 30c0 Compaq 6710b
+ 103c 30d9 Presario C700
+ 104d 902d VAIO VGN-NR120E
+ 17aa 20b5 T61
+ e4bf cc47 CCG-RUMBA
+ 2a03 Mobile GM965/GL960 Integrated Graphics Controller (secondary)
+ 1028 01f3 Dell Inspiron 1420
+ 103c 30c0 Compaq 6710b
+ 103c 30d9 Presario C700
+ 104d 902d VAIO VGN-NR120E
+ 17aa 20b5 T61
+ e4bf cc47 CCG-RUMBA
+ 2a04 Mobile PM965/GM965 MEI Controller
+ 103c 30c1 Compaq 6910p
+ 2a05 Mobile PM965/GM965 MEI Controller
+ 2a06 Mobile PM965/GM965 PT IDER Controller
+ 103c 30c1 Compaq 6910p
+ 2a07 Mobile PM965/GM965 KT Controller
+ 103c 30c1 Compaq 6910p
+ 2a10 Mobile GME965/GLE960 Memory Controller Hub
+ e4bf cc47 CCG-RUMBA
+ 2a11 Mobile GME965/GLE960 PCI Express Root Port
+ 2a12 Mobile GME965/GLE960 Integrated Graphics Controller
+ e4bf cc47 CCG-RUMBA
+ 2a13 Mobile GME965/GLE960 Integrated Graphics Controller
+ e4bf cc47 CCG-RUMBA
+ 2a14 Mobile GME965/GLE960 MEI Controller
+ 2a15 Mobile GME965/GLE960 MEI Controller
+ 2a16 Mobile GME965/GLE960 PT IDER Controller
+ 2a17 Mobile GME965/GLE960 KT Controller
+ 2a40 Mobile 4 Series Chipset Memory Controller Hub
+ e4bf cc4d CCM-BOOGIE
+ 2a41 Mobile 4 Series Chipset PCI Express Graphics Port
+ e4bf cc4d CCM-BOOGIE
+ 2a42 Mobile 4 Series Chipset Integrated Graphics Controller
+ e4bf cc4d CCM-BOOGIE
+ 2a43 Mobile 4 Series Chipset Integrated Graphics Controller
+ e4bf cc4d CCM-BOOGIE
+ 2a44 Mobile 4 Series Chipset MEI Controller
+ 2a45 Mobile 4 Series Chipset MEI Controller
+ 2a46 Mobile 4 Series Chipset PT IDER Controller
+ 2a47 Mobile 4 Series Chipset AMT SOL Redirection
+ 2a50 Cantiga MEI Controller
+ 2a51 Cantiga MEI Controller
+ 2a52 Cantiga PT IDER Controller
+ 2a53 Cantiga AMT SOL Redirection
+ 2b00 Xeon Processor E7 Product Family System Configuration Controller 1
+ 2b02 Xeon Processor E7 Product Family System Configuration Controller 2
+ 2b04 Xeon Processor E7 Product Family Power Controller
+ 2b08 Xeon Processor E7 Product Family Caching Agent 0
+ 2b0c Xeon Processor E7 Product Family Caching Agent 1
+ 2b10 Xeon Processor E7 Product Family QPI Home Agent 0
+ 2b13 Xeon Processor E7 Product Family Memory Controller 0c
+ 2b14 Xeon Processor E7 Product Family Memory Controller 0a
+ 2b16 Xeon Processor E7 Product Family Memory Controller 0b
+ 2b18 Xeon Processor E7 Product Family QPI Home Agent 1
+ 2b1b Xeon Processor E7 Product Family Memory Controller 1c
+ 2b1c Xeon Processor E7 Product Family Memory Controller 1a
+ 2b1e Xeon Processor E7 Product Family Memory Controller 1b
+ 2b20 Xeon Processor E7 Product Family Last Level Cache Coherence Engine 0
+ 2b22 Xeon Processor E7 Product Family System Configuration Controller 3
+ 2b24 Xeon Processor E7 Product Family Last Level Cache Coherence Engine 1
+ 2b28 Xeon Processor E7 Product Family Last Level Cache Coherence Engine 2
+ 2b2a Xeon Processor E7 Product Family System Configuration Controller 4
+ 2b2c Xeon Processor E7 Product Family Last Level Cache Coherence Engine 3
+ 2b30 Xeon Processor E7 Product Family Last Level Cache Coherence Engine 4
+ 2b34 Xeon Processor E7 Product Family Last Level Cache Coherence Engine 5
+ 2b38 Xeon Processor E7 Product Family Last Level Cache Coherence Engine 6
+ 2b3c Xeon Processor E7 Product Family Last Level Cache Coherence Engine 7
+ 2b40 Xeon Processor E7 Product Family QPI Router Port 0-1
+ 2b42 Xeon Processor E7 Product Family QPI Router Port 2-3
+ 2b44 Xeon Processor E7 Product Family QPI Router Port 4-5
+ 2b46 Xeon Processor E7 Product Family QPI Router Port 6-7
+ 2b48 Xeon Processor E7 Product Family Test and Debug 0
+ 2b4c Xeon Processor E7 Product Family Test and Debug 1
+ 2b50 Xeon Processor E7 Product Family QPI Physical Port 0: REUT control/status
+ 2b52 Xeon Processor E7 Product Family QPI Physical Port 0: Misc. control/status
+ 2b54 Xeon Processor E7 Product Family QPI Physical Port 1: REUT control/status
+ 2b56 Xeon Processor E7 Product Family QPI Physical Port 1: Misc. control/status
+ 2b58 Xeon Processor E7 Product Family QPI Physical Port 2: REUT control/status
+ 2b5a Xeon Processor E7 Product Family QPI Physical Port 2: Misc. control/status
+ 2b5c Xeon Processor E7 Product Family QPI Physical Port 3: REUT control/status
+ 2b5e Xeon Processor E7 Product Family QPI Physical Port 3: Misc. control/status
+ 2b60 Xeon Processor E7 Product Family SMI Physical Port 0: REUT control/status
+ 2b62 Xeon Processor E7 Product Family SMI Physical Port 0: Misc control/status
+ 2b64 Xeon Processor E7 Product Family SMI Physical Port 1: REUT control/status
+ 2b66 Xeon Processor E7 Product Family SMI Physical Port 1: Misc control/status
+ 2b68 Xeon Processor E7 Product Family Last Level Cache Coherence Engine 8
+ 2b6c Xeon Processor E7 Product Family Last Level Cache Coherence Engine 9
+ 2c01 Xeon 5500/Core i7 QuickPath Architecture System Address Decoder
+ 2c10 Xeon 5500/Core i7 QPI Link 0
+ 2c11 Xeon 5500/Core i7 QPI Physical 0
+ 2c14 Xeon 5500/Core i7 QPI Link 1
+ 2c15 Xeon 5500/Core i7 QPI Physical 1
+ 2c18 Xeon 5500/Core i7 Integrated Memory Controller
+ 2c19 Xeon 5500/Core i7 Integrated Memory Controller Target Address Decoder
+ 2c1a Xeon 5500/Core i7 Integrated Memory Controller RAS Registers
+ 2c1c Xeon 5500/Core i7 Integrated Memory Controller Test Registers
+ 2c20 Xeon 5500/Core i7 Integrated Memory Controller Channel 0 Control Registers
+ 2c21 Xeon 5500/Core i7 Integrated Memory Controller Channel 0 Address Registers
+ 2c22 Xeon 5500/Core i7 Integrated Memory Controller Channel 0 Rank Registers
+ 2c23 Xeon 5500/Core i7 Integrated Memory Controller Channel 0 Thermal Control Registers
+ 2c28 Xeon 5500/Core i7 Integrated Memory Controller Channel 1 Control Registers
+ 2c29 Xeon 5500/Core i7 Integrated Memory Controller Channel 1 Address Registers
+ 2c2a Xeon 5500/Core i7 Integrated Memory Controller Channel 1 Rank Registers
+ 2c2b Xeon 5500/Core i7 Integrated Memory Controller Channel 1 Thermal Control Registers
+ 2c30 Xeon 5500/Core i7 Integrated Memory Controller Channel 2 Control Registers
+ 2c31 Xeon 5500/Core i7 Integrated Memory Controller Channel 2 Address Registers
+ 2c32 Xeon 5500/Core i7 Integrated Memory Controller Channel 2 Rank Registers
+ 2c33 Xeon 5500/Core i7 Integrated Memory Controller Channel 2 Thermal Control Registers
+ 2c40 Xeon 5500/Core i7 QuickPath Architecture Generic Non-Core Registers
+ 2c41 Xeon 5500/Core i7 QuickPath Architecture Generic Non-Core Registers
+ 2c50 Core Processor QuickPath Architecture Generic Non-Core Registers
+ 2c51 Core Processor QuickPath Architecture Generic Non-Core Registers
+ 2c52 Core Processor QuickPath Architecture Generic Non-Core Registers
+ 2c53 Core Processor QuickPath Architecture Generic Non-Core Registers
+ 2c54 Core Processor QuickPath Architecture Generic Non-Core Registers
+ 2c55 Core Processor QuickPath Architecture Generic Non-Core Registers
+ 2c56 Core Processor QuickPath Architecture Generic Non-Core Registers
+ 2c57 Core Processor QuickPath Architecture Generic Non-Core Registers
+ 2c58 Xeon C5500/C3500 QPI Generic Non-core Registers
+ 2c59 Xeon C5500/C3500 QPI Generic Non-core Registers
+ 2c5a Xeon C5500/C3500 QPI Generic Non-core Registers
+ 2c5b Xeon C5500/C3500 QPI Generic Non-core Registers
+ 2c5c Xeon C5500/C3500 QPI Generic Non-core Registers
+ 2c5d Xeon C5500/C3500 QPI Generic Non-core Registers
+ 2c5e Xeon C5500/C3500 QPI Generic Non-core Registers
+ 2c5f Xeon C5500/C3500 QPI Generic Non-core Registers
+ 2c61 Core Processor QuickPath Architecture Generic Non-core Registers
+ 2c62 Core Processor QuickPath Architecture Generic Non-core Registers
+ 2c70 Xeon 5600 Series QuickPath Architecture Generic Non-core Registers
+ 2c81 Core Processor QuickPath Architecture System Address Decoder
+ 2c90 Core Processor QPI Link 0
+ 2c91 Core Processor QPI Physical 0
+ 2c98 Core Processor Integrated Memory Controller
+ 2c99 Core Processor Integrated Memory Controller Target Address Decoder
+ 2c9a Core Processor Integrated Memory Controller Test Registers
+ 2c9c Core Processor Integrated Memory Controller Test Registers
+ 2ca0 Core Processor Integrated Memory Controller Channel 0 Control Registers
+ 2ca1 Core Processor Integrated Memory Controller Channel 0 Address Registers
+ 2ca2 Core Processor Integrated Memory Controller Channel 0 Rank Registers
+ 2ca3 Core Processor Integrated Memory Controller Channel 0 Thermal Control Registers
+ 2ca8 Core Processor Integrated Memory Controller Channel 1 Control Registers
+ 2ca9 Core Processor Integrated Memory Controller Channel 1 Address Registers
+ 2caa Core Processor Integrated Memory Controller Channel 1 Rank Registers
+ 2cab Core Processor Integrated Memory Controller Channel 1 Thermal Control Registers
+ 2cc1 Xeon C5500/C3500 QPI System Address Decoder
+ 2cd0 Xeon C5500/C3500 QPI Link 0
+ 2cd1 Xeon C5500/C3500 QPI Physical 0
+ 2cd4 Xeon C5500/C3500 QPI Link 1
+ 2cd5 Xeon C5500/C3500 QPI Physical 1
+ 2cd8 Xeon C5500/C3500 Integrated Memory Controller Registers
+ 2cd9 Xeon C5500/C3500 Integrated Memory Controller Target Address Decoder
+ 2cda Xeon C5500/C3500 Integrated Memory Controller RAS Registers
+ 2cdc Xeon C5500/C3500 Integrated Memory Controller Test Registers
+ 2ce0 Xeon C5500/C3500 Integrated Memory Controller Channel 0 Control
+ 2ce1 Xeon C5500/C3500 Integrated Memory Controller Channel 0 Address
+ 2ce2 Xeon C5500/C3500 Integrated Memory Controller Channel 0 Rank
+ 2ce3 Xeon C5500/C3500 Integrated Memory Controller Channel 0 Thermal Control
+ 2ce8 Xeon C5500/C3500 Integrated Memory Controller Channel 1 Control
+ 2ce9 Xeon C5500/C3500 Integrated Memory Controller Channel 1 Address
+ 2cea Xeon C5500/C3500 Integrated Memory Controller Channel 1 Rank
+ 2ceb Xeon C5500/C3500 Integrated Memory Controller Channel 1 Thermal Control
+ 2cf0 Xeon C5500/C3500 Integrated Memory Controller Channel 2 Control
+ 2cf1 Xeon C5500/C3500 Integrated Memory Controller Channel 2 Address
+ 2cf2 Xeon C5500/C3500 Integrated Memory Controller Channel 2 Rank
+ 2cf3 Xeon C5500/C3500 Integrated Memory Controller Channel 2 Thermal Control
+ 2d01 Core Processor QuickPath Architecture System Address Decoder
+ 2d10 Core Processor QPI Link 0
+ 2d11 Core Processor QPI Physical 0
+ 2d12 Core Processor Reserved
+ 2d13 Core Processor Reserved
+ 2d81 Xeon 5600 Series QuickPath Architecture System Address Decoder
+ 2d90 Xeon 5600 Series QPI Link 0
+ 2d91 Xeon 5600 Series QPI Physical 0
+ 2d92 Xeon 5600 Series Mirror Port Link 0
+ 2d93 Xeon 5600 Series Mirror Port Link 1
+ 2d94 Xeon 5600 Series QPI Link 1
+ 2d95 Xeon 5600 Series QPI Physical 1
+ 2d98 Xeon 5600 Series Integrated Memory Controller Registers
+ 2d99 Xeon 5600 Series Integrated Memory Controller Target Address Decoder
+ 2d9a Xeon 5600 Series Integrated Memory Controller RAS Registers
+ 2d9c Xeon 5600 Series Integrated Memory Controller Test Registers
+ 2da0 Xeon 5600 Series Integrated Memory Controller Channel 0 Control
+ 2da1 Xeon 5600 Series Integrated Memory Controller Channel 0 Address
+ 2da2 Xeon 5600 Series Integrated Memory Controller Channel 0 Rank
+ 2da3 Xeon 5600 Series Integrated Memory Controller Channel 0 Thermal Control
+ 2da8 Xeon 5600 Series Integrated Memory Controller Channel 1 Control
+ 2da9 Xeon 5600 Series Integrated Memory Controller Channel 1 Address
+ 2daa Xeon 5600 Series Integrated Memory Controller Channel 1 Rank
+ 2dab Xeon 5600 Series Integrated Memory Controller Channel 1 Thermal Control
+ 2db0 Xeon 5600 Series Integrated Memory Controller Channel 2 Control
+ 2db1 Xeon 5600 Series Integrated Memory Controller Channel 2 Address
+ 2db2 Xeon 5600 Series Integrated Memory Controller Channel 2 Rank
+ 2db3 Xeon 5600 Series Integrated Memory Controller Channel 2 Thermal Control
+ 2e00 4 Series Chipset DRAM Controller
+ 2e01 4 Series Chipset PCI Express Root Port
+ 2e02 4 Series Chipset Integrated Graphics Controller
+ 2e03 4 Series Chipset Integrated Graphics Controller
+ 2e04 4 Series Chipset HECI Controller
+ 2e05 4 Series Chipset HECI Controller
+ 2e06 4 Series Chipset PT IDER Controller
+ 2e07 4 Series Chipset Serial KT Controller
+ 2e10 4 Series Chipset DRAM Controller
+ 2e11 4 Series Chipset PCI Express Root Port
+ 2e12 4 Series Chipset Integrated Graphics Controller
+ 2e13 4 Series Chipset Integrated Graphics Controller
+ 2e14 4 Series Chipset HECI Controller
+ 2e15 4 Series Chipset HECI Controller
+ 2e16 4 Series Chipset PT IDER Controller
+ 2e17 4 Series Chipset Serial KT Controller
+ 2e20 4 Series Chipset DRAM Controller
+ 1458 5000 GA-EP45-DS5 Motherboard
+ 2e21 4 Series Chipset PCI Express Root Port
+ 1458 5000 GA-EP45-DS5 Motherboard
+ 2e22 4 Series Chipset Integrated Graphics Controller
+ 2e23 4 Series Chipset Integrated Graphics Controller
+ 2e24 4 Series Chipset HECI Controller
+ 2e25 4 Series Chipset HECI Controller
+ 2e26 4 Series Chipset PT IDER Controller
+ 2e27 4 Series Chipset Serial KT Controller
+ 2e29 4 Series Chipset PCI Express Root Port
+ 2e30 4 Series Chipset DRAM Controller
+ 2e31 4 Series Chipset PCI Express Root Port
+ 2e32 4 Series Chipset Integrated Graphics Controller
+ 2e33 4 Series Chipset Integrated Graphics Controller
+ 2e34 4 Series Chipset HECI Controller
+ 2e35 4 Series Chipset HECI Controller
+ 2e36 4 Series Chipset PT IDER Controller
+ 2e37 4 Series Chipset Serial KT Controller
+ 2e40 4 Series Chipset DRAM Controller
+ 2e41 4 Series Chipset PCI Express Root Port
+ 2e42 4 Series Chipset Integrated Graphics Controller
+ 2e43 4 Series Chipset Integrated Graphics Controller
+ 2e44 4 Series Chipset HECI Controller
+ 2e45 4 Series Chipset HECI Controller
+ 2e46 4 Series Chipset PT IDER Controller
+ 2e47 4 Series Chipset Serial KT Controller
+ 2e50 CE Media Processor CE3100
+ 2e52 CE Media Processor Clock and Reset Controller
+ 2e58 CE Media Processor Interrupt Controller
+ 2e5a CE Media Processor CE3100 A/V Bridge
+ 2e5b Graphics Media Accelerator 500 Graphics
+ 2e5c CE Media Processor Video Decoder
+ 2e5d CE Media Processor Transport Stream Interface
+ 2e5e CE Media Processor Transport Stream Processor 0
+ 2e5f CE Media Processor Audio DSP
+ 2e60 CE Media Processor Audio Interfaces
+ 2e61 CE Media Processor Video Display Controller
+ 2e62 CE Media Processor Video Processing Unit
+ 2e63 CE Media Processor HDMI Tx Interface
+ 2e65 CE Media Processor Expansion Bus Interface
+ 2e66 CE Media Processor UART
+ 2e67 CE Media Processor General Purpose I/Os
+ 2e68 CE Media Processor I2C Interface
+ 2e69 CE Media Processor Smart Card Interface
+ 2e6a CE Media Processor SPI Master Interface
+ 2e6e CE Media Processor Gigabit Ethernet Controller
+ 2e6f CE Media Processor Media Timing Unit
+ 2e70 CE Media Processor USB
+ 2e71 CE Media Processor SATA
+ 2e73 CE Media Processor CE3100 PCI Express
+ 2e90 4 Series Chipset DRAM Controller
+ 2e91 4 Series Chipset PCI Express Root Port
+ 2e92 4 Series Chipset Integrated Graphics Controller
+ 2e93 4 Series Chipset Integrated Graphics Controller
+ 2e94 4 Series Chipset HECI Controller
+ 2e95 4 Series Chipset HECI Controller
+ 2e96 4 Series Chipset PT IDER Controller
+ 3200 GD31244 PCI-X SATA HBA
+ 1775 c200 C2K onboard SATA host bus adapter
+ 3310 IOP348 I/O Processor
+ 1054 3030 HRA380 Hitachi RAID Adapter to PCIe
+ 1054 3034 HRA381 Hitachi RAID Adapter to PCIe
+ 3313 IOP348 I/O Processor (SL8e) in IOC Mode SAS/SATA
+ 331b IOP348 I/O Processor (SL8x) in IOC Mode SAS/SATA
+ 3331 IOC340 I/O Controller (VV8e) SAS/SATA
+ 3339 IOC340 I/O Controller (VV8x) SAS/SATA
+ 3340 82855PM Processor to I/O Controller
+ 1014 0529 Thinkpad T40 series
+ 1025 005a TravelMate 290
+ 103c 088c NC8000 laptop
+ 103c 0890 NC6000 laptop
+ 103c 08b0 tc1100 tablet
+ 144d c005 X10 Laptop
+ 144d c00c P30/P35 notebook
+ 3341 82855PM Processor to AGP Controller
+ 144d c00c P30 notebook
+ 3363 IOC340 I/O Controller in IOC Mode SAS/SATA
+ 3382 81342 [Chevelon] I/O Processor (ATUe)
+ 33c3 IOP348 I/O Processor (SL8De) in IOC Mode SAS/SATA
+ 33cb IOP348 I/O Processor (SL8Dx) in IOC Mode SAS/SATA
+ 3400 5520/5500/X58 I/O Hub to ESI Port
+ 3401 5520/5500/X58 I/O Hub to ESI Port
+ 3402 5520/5500/X58 I/O Hub to ESI Port
+ 3403 5500 I/O Hub to ESI Port
+ 1028 0236 PowerEdge R610 I/O Hub to ESI Port
+ 1028 0287 PowerEdge M610 I/O Hub to ESI Port
+ 1028 028c PowerEdge R410 I/O Hub to ESI Port
+ 1028 028d PowerEdge T410 I/O Hub to ESI Port
+ 3404 5520/5500/X58 I/O Hub to ESI Port
+ 3405 5520/5500/X58 I/O Hub to ESI Port
+ 3406 5520 I/O Hub to ESI Port
+ 3407 5520/5500/X58 I/O Hub to ESI Port
+ 3408 5520/5500/X58 I/O Hub PCI Express Root Port 1
+ 3409 5520/5500/X58 I/O Hub PCI Express Root Port 2
+ 340a 5520/5500/X58 I/O Hub PCI Express Root Port 3
+ 340b 5520/X58 I/O Hub PCI Express Root Port 4
+ 340c 5520/X58 I/O Hub PCI Express Root Port 5
+ 340d 5520/X58 I/O Hub PCI Express Root Port 6
+ 340e 5520/5500/X58 I/O Hub PCI Express Root Port 7
+ 340f 5520/5500/X58 I/O Hub PCI Express Root Port 8
+ 3410 5520/5500/X58 I/O Hub PCI Express Root Port 9
+ 3411 5520/5500/X58 I/O Hub PCI Express Root Port 10
+ 3418 5520/5500/X58 Physical Layer Port 0
+ 3419 5520/5500 Physical Layer Port 1
+ 3420 5500 Non-Legacy I/O Hub PCI Express Root Port 0
+ 3421 5520 Non-Legacy I/O Hub PCI Express Root Port 0
+ 3422 5520/5500/X58 I/O Hub GPIO and Scratch Pad Registers
+ 3423 5520/5500/X58 I/O Hub Control Status and RAS Registers
+ 3425 5520/5500/X58 Physical and Link Layer Registers Port 0
+ 3426 5520/5500/X58 Routing and Protocol Layer Registers Port 0
+ 3427 5520/5500 Physical and Link Layer Registers Port 1
+ 3428 5520/5500 Routing & Protocol Layer Register Port 1
+ 3429 5520/5500/X58 Chipset QuickData Technology Device
+ 342a 5520/5500/X58 Chipset QuickData Technology Device
+ 342b 5520/5500/X58 Chipset QuickData Technology Device
+ 342c 5520/5500/X58 Chipset QuickData Technology Device
+ 342d 5520/5500/X58 I/O Hub I/OxAPIC Interrupt Controller
+ 342e 5520/5500/X58 I/O Hub System Management Registers
+ 342f 5520/5500/X58 Trusted Execution Technology Registers
+ 3430 5520/5500/X58 Chipset QuickData Technology Device
+ 3431 5520/5500/X58 Chipset QuickData Technology Device
+ 3432 5520/5500/X58 Chipset QuickData Technology Device
+ 3433 5520/5500/X58 Chipset QuickData Technology Device
+ 3438 5520/5500/X58 I/O Hub Throttle Registers
+ 3500 6311ESB/6321ESB PCI Express Upstream Port
+ 3501 6310ESB PCI Express Upstream Port
+ 3504 6311ESB/6321ESB I/OxAPIC Interrupt Controller
+ 3505 6310ESB I/OxAPIC Interrupt Controller
+ 350c 6311ESB/6321ESB PCI Express to PCI-X Bridge
+ 350d 6310ESB PCI Express to PCI-X Bridge
+ 3510 6311ESB/6321ESB PCI Express Downstream Port E1
+ 3511 6310ESB PCI Express Downstream Port E1
+ 3514 6311ESB/6321ESB PCI Express Downstream Port E2
+ 3515 6310ESB PCI Express Downstream Port E2
+ 3518 6311ESB/6321ESB PCI Express Downstream Port E3
+ 3519 6310ESB PCI Express Downstream Port E3
+ 3575 82830 830 Chipset Host Bridge
+ 0e11 0030 Evo N600c
+ 1014 021d ThinkPad A/T/X Series
+ 104d 80e7 VAIO PCG-GR214EP/GR214MP/GR215MP/GR314MP/GR315MP
+ 3576 82830 830 Chipset AGP Bridge
+ 3577 82830 CGC [Chipset Graphics Controller]
+ 1014 0513 ThinkPad A/T/X Series
+ 3578 82830 830 Chipset Host Bridge
+ 3580 82852/82855 GM/GME/PM/GMV Processor to I/O Controller
+ 1014 055c ThinkPad R50e
+ 1028 0139 Latitude D400
+ 1028 014f Latitude X300
+ 1028 0152 Latitude D500
+ 1028 0163 Latitude D505
+ 1028 018d Inspiron 700m/710m
+ 1028 0196 Inspiron 5160
+ 114a 0582 PC8
+ 1734 1055 Amilo M1420
+ 1775 10d0 V5D Single Board Computer
+ 1775 ce90 CE9
+ 4c53 10b0 CL9 mainboard
+ 4c53 10e0 PSL09 PrPMC
+ e4bf 0cc9 CC9-SAMBA
+ e4bf 0cd2 CD2-BEBOP
+ 3581 82852/82855 GM/GME/PM/GMV Processor to AGP Controller
+ 1734 1055 Amilo M1420
+ 3582 82852/855GM Integrated Graphics Device
+ 1014 0562 ThinkPad R50e
+ 1028 0139 Latitude D400
+ 1028 014f Latitude X300
+ 1028 0152 Latitude D500
+ 1028 0163 Latitude D505
+ 1028 018d Inspiron 700m/710m
+ 114a 0582 PC8 integrated graphics
+ 1775 10d0 V5D Single Board Computer VGA
+ 1775 ce90 CE9
+ 4c53 10b0 CL9 mainboard
+ 4c53 10e0 PSL09 PrPMC
+ e4bf 0cc9 CC9-SAMBA
+ e4bf 0cd2 CD2-BEBOP
+ 3584 82852/82855 GM/GME/PM/GMV Processor to I/O Controller
+ 1014 055d ThinkPad R50e
+ 1028 0139 Latitude D400
+ 1028 014f Latitude X300
+ 1028 0152 Latitude D500
+ 1028 0163 Latitude D505
+ 1028 018d Inspiron 700m/710m
+ 1028 0196 Inspiron 5160
+ 114a 0582 PC8
+ 1734 1055 Amilo M1420
+ 1775 10d0 V5D Single Board Computer
+ 1775 ce90 CE9
+ 4c53 10b0 CL9 mainboard
+ 4c53 10e0 PSL09 PrPMC
+ 3585 82852/82855 GM/GME/PM/GMV Processor to I/O Controller
+ 1014 055e ThinkPad R50e
+ 1028 0139 Latitude D400
+ 1028 014f Latitude X300
+ 1028 0152 Latitude D500
+ 1028 0163 Latitude D505
+ 1028 018d Inspiron 700m/710m
+ 1028 0196 Inspiron 5160
+ 114a 0582 PC8
+ 1734 1055 Amilo M1420
+ 1775 10d0 V5D Single Board Computer
+ 1775 ce90 CE9
+ 4c53 10b0 CL9 mainboard
+ 4c53 10e0 PSL09 PrPMC
+ 358c 82854 GMCH
+ 358e 82854 GMCH Integrated Graphics Device
+ 3590 E7520 Memory Controller Hub
+ 1014 02dd eServer xSeries server mainboard
+ 1028 016c PowerEdge 1850 Memory Controller Hub
+ 1028 016d PowerEdge 2850 Memory Controller Hub
+ 1028 019a PowerEdge SC1425
+ 1734 103e PRIMERGY RX/TX S2 series
+ 1775 1100 CR11/VR11 Single Board Computer
+ 4c53 10d0 Telum ASLP10 Processor AMC
+ 3591 E7525/E7520 Error Reporting Registers
+ 1014 02dd eServer xSeries server mainboard
+ 1028 0169 Precision 470
+ 4c53 10d0 Telum ASLP10 Processor AMC
+ 3592 E7320 Memory Controller Hub
+ 3593 E7320 Error Reporting Registers
+ 3594 E7520 DMA Controller
+ 1775 1100 CR11/VR11 Single Board Computer
+ 4c53 10d0 Telum ASLP10 Processor AMC
+ 3595 E7525/E7520/E7320 PCI Express Port A
+ 1775 1100 CR11/VR11 Single Board Computer
+ 3596 E7525/E7520/E7320 PCI Express Port A1
+ 3597 E7525/E7520 PCI Express Port B
+ 1775 1100 CR11/VR11 Single Board Computer
+ 3598 E7520 PCI Express Port B1
+ 1775 1100 CR11/VR11 Single Board Computer
+ 3599 E7520 PCI Express Port C
+ 1775 1100 CR11/VR11 Single Board Computer
+ 359a E7520 PCI Express Port C1
+ 359b E7525/E7520/E7320 Extended Configuration Registers
+ 1014 02dd eServer xSeries server mainboard
+ 359e E7525 Memory Controller Hub
+ 1028 0169 Precision 470
+ 35b0 3100 Chipset Memory I/O Controller Hub
+ 35b1 3100 DRAM Controller Error Reporting Registers
+ 35b5 3100 Chipset Enhanced DMA Controller
+ 35b6 3100 Chipset PCI Express Port A
+ 35b7 3100 Chipset PCI Express Port A1
+ 35c8 3100 Extended Configuration Test Overflow Registers
+ 3600 7300 Chipset Memory Controller Hub
+ 3604 7300 Chipset PCI Express Port 1
+ 3605 7300 Chipset PCI Express Port 2
+ 3606 7300 Chipset PCI Express Port 3
+ 3607 7300 Chipset PCI Express Port 4
+ 3608 7300 Chipset PCI Express Port 5
+ 3609 7300 Chipset PCI Express Port 6
+ 360a 7300 Chipset PCI Express Port 7
+ 360b 7300 Chipset QuickData Technology Device
+ 360c 7300 Chipset FSB Registers
+ 1028 01f0 PowerEdge R900 7300 Chipset FSB Registers
+ 360d 7300 Chipset Snoop Filter Registers
+ 360e 7300 Chipset Debug and Miscellaneous Registers
+ 360f 7300 Chipset FBD Branch 0 Registers
+ 3610 7300 Chipset FBD Branch 1 Registers
+ 3700 Xeon C5500/C3500 DMI
+ 3701 Xeon C5500/C3500 DMI
+ 3702 Xeon C5500/C3500 DMI
+ 3703 Xeon C5500/C3500 DMI
+ 3704 Xeon C5500/C3500 DMI
+ 3705 Xeon C5500/C3500 DMI
+ 3706 Xeon C5500/C3500 DMI
+ 3707 Xeon C5500/C3500 DMI
+ 3708 Xeon C5500/C3500 DMI
+ 3709 Xeon C5500/C3500 DMI
+ 370a Xeon C5500/C3500 DMI
+ 370b Xeon C5500/C3500 DMI
+ 370c Xeon C5500/C3500 DMI
+ 370d Xeon C5500/C3500 DMI
+ 370e Xeon C5500/C3500 DMI
+ 370f Xeon C5500/C3500 DMI
+ 3710 Xeon C5500/C3500 CB3 DMA
+ 3711 Xeon C5500/C3500 CB3 DMA
+ 3712 Xeon C5500/C3500 CB3 DMA
+ 3713 Xeon C5500/C3500 CB3 DMA
+ 3714 Xeon C5500/C3500 CB3 DMA
+ 3715 Xeon C5500/C3500 CB3 DMA
+ 3716 Xeon C5500/C3500 CB3 DMA
+ 3717 Xeon C5500/C3500 CB3 DMA
+ 3718 Xeon C5500/C3500 CB3 DMA
+ 3719 Xeon C5500/C3500 CB3 DMA
+ 371a Xeon C5500/C3500 QPI Link
+ 371b Xeon C5500/C3500 QPI Routing and Protocol
+ 371d Xeon C5500/C3500 QPI Routing and Protocol
+ 3720 Xeon C5500/C3500 PCI Express Root Port 0
+ 3721 Xeon C5500/C3500 PCI Express Root Port 1
+ 3722 Xeon C5500/C3500 PCI Express Root Port 2
+ 3723 Xeon C5500/C3500 PCI Express Root Port 3
+ 3724 Xeon C5500/C3500 PCI Express Root Port 4
+ 3725 Xeon C5500/C3500 NTB Primary
+ 3726 Xeon C5500/C3500 NTB Primary
+ 3727 Xeon C5500/C3500 NTB Secondary
+ 3728 Xeon C5500/C3500 Core
+ 3729 Xeon C5500/C3500 Core
+ 372a Xeon C5500/C3500 Core
+ 372b Xeon C5500/C3500 Core
+ 372c Xeon C5500/C3500 Reserved
+ 373f Xeon C5500/C3500 IOxAPIC
+ 3a00 82801JD/DO (ICH10 Family) 4-port SATA IDE Controller
+ 3a02 82801JD/DO (ICH10 Family) SATA AHCI Controller
+ 3a05 82801JD/DO (ICH10 Family) SATA RAID Controller
+ 3a06 82801JD/DO (ICH10 Family) 2-port SATA IDE Controller
+ 3a14 82801JDO (ICH10DO) LPC Interface Controller
+ 3a16 82801JIR (ICH10R) LPC Interface Controller
+ 1028 028c PowerEdge R410 LPC Interface Controller
+ 1028 028d PowerEdge T410 LPC Interface Controller
+ 1458 5001 GA-EP45-DS5 Motherboard
+ 3a18 82801JIB (ICH10) LPC Interface Controller
+ 3a1a 82801JD (ICH10D) LPC Interface Controller
+ 3a20 82801JI (ICH10 Family) 4 port SATA IDE Controller #1
+ 1028 028c PowerEdge R410 SATA IDE Controller
+ 1028 028d PowerEdge T410 SATA IDE Controller
+ 3a22 82801JI (ICH10 Family) SATA AHCI Controller
+ 1043 82d4 P5Q Deluxe Motherboard
+ 1458 b005 GA-EP45-DS5 Motherboard
+ 3a25 82801JIR (ICH10R) SATA RAID Controller
+ 1028 028c PERC S100 Controller (PE R410)
+ 1028 028d PERC S100 Controller (PE T410)
+ 1028 02f1 PERC S100 Controller (PE R510)
+ 3a26 82801JI (ICH10 Family) 2 port SATA IDE Controller #2
+ 1028 028c PowerEdge R410 SATA IDE Controller
+ 1028 028d PowerEdge T410 SATA IDE Controller
+ 3a30 82801JI (ICH10 Family) SMBus Controller
+ 1458 5001 GA-EP45-DS5 Motherboard
+ 3a32 82801JI (ICH10 Family) Thermal Subsystem
+ 3a34 82801JI (ICH10 Family) USB UHCI Controller #1
+ 1028 028c PowerEdge R410 USB UHCI Controller
+ 1028 028d PowerEdge T410 USB UHCI Controller
+ 1458 5004 GA-EP45-DS5 Motherboard
+ 3a35 82801JI (ICH10 Family) USB UHCI Controller #2
+ 1028 028c PowerEdge R410 USB UHCI Controller
+ 1028 028d PowerEdge T410 USB UHCI Controller
+ 1458 5004 GA-EP45-DS5 Motherboard
+ 3a36 82801JI (ICH10 Family) USB UHCI Controller #3
+ 1028 028c PowerEdge R410 USB UHCI Controller
+ 1028 028d PowerEdge T410 USB UHCI Controller
+ 1458 5004 GA-EP45-DS5 Motherboard
+ 3a37 82801JI (ICH10 Family) USB UHCI Controller #4
+ 1028 028c PowerEdge R410 USB UHCI Controller
+ 1028 028d PowerEdge T410 USB UHCI Controller
+ 1458 5004 GA-EP45-DS5 Motherboard
+ 3a38 82801JI (ICH10 Family) USB UHCI Controller #5
+ 1028 028c PowerEdge R410 USB UHCI Controller
+ 1028 028d PowerEdge T410 USB UHCI Controller
+ 1458 5004 GA-EP45-DS5 Motherboard
+ 3a39 82801JI (ICH10 Family) USB UHCI Controller #6
+ 1028 028c PowerEdge R410 USB UHCI Controller
+ 1028 028d PowerEdge T410 USB UHCI Controller
+ 1458 5004 GA-EP45-DS5 Motherboard
+ 3a3a 82801JI (ICH10 Family) USB2 EHCI Controller #1
+ 1028 028c PowerEdge R410 USB EHCI Controller
+ 1028 028d PowerEdge T410 USB EHCI Controller
+ 1458 5006 GA-EP45-DS5 Motherboard
+ 3a3c 82801JI (ICH10 Family) USB2 EHCI Controller #2
+ 1028 028c PowerEdge R410 USB EHCI Controller
+ 1028 028d PowerEdge T410 USB EHCI Controller
+ 1458 5006 GA-EP45-DS5 Motherboard
+ 3a3e 82801JI (ICH10 Family) HD Audio Controller
+ 1458 a002 GA-EP45-UD3R Motherboard
+ 1458 a102 GA-EP45-DS5 Motherboard
+ 3a40 82801JI (ICH10 Family) PCI Express Root Port 1
+ 1028 028c PowerEdge R410 PCI Express Port 1
+ 1028 028d PowerEdge T410 PCI Express Port 1
+ 1043 82ea P6T DeLuxe Motherboard
+ 1458 5001 GA-EP45-DS5 Motherboard
+ 3a42 82801JI (ICH10 Family) PCI Express Port 2
+ 3a44 82801JI (ICH10 Family) PCI Express Root Port 3
+ 1043 82ea P6T DeLuxe Motherboard
+ 3a46 82801JI (ICH10 Family) PCI Express Root Port 4
+ 1043 82ea P6T DeLuxe Motherboard
+ 1458 5001 GA-EP45-DS5 Motherboard
+ 3a48 82801JI (ICH10 Family) PCI Express Root Port 5
+ 1043 82ea P6T Deluxe Motherboard
+ 1458 5001 GA-EP45-DS5 Motherboard
+ 3a4a 82801JI (ICH10 Family) PCI Express Root Port 6
+ 1043 82ea P6T DeLuxe Motherboard
+ 1458 5001 GA-EP45-DS5 Motherboard
+ 3a4c 82801JI (ICH10 Family) Gigabit Ethernet Controller
+ 3a51 82801JDO (ICH10DO) VECI Controller
+ 3a55 82801JD/DO (ICH10 Family) Virtual SATA Controller
+ 3a60 82801JD/DO (ICH10 Family) SMBus Controller
+ 3a62 82801JD/DO (ICH10 Family) Thermal Subsystem
+ 3a64 82801JD/DO (ICH10 Family) USB UHCI Controller #1
+ 3a65 82801JD/DO (ICH10 Family) USB UHCI Controller #2
+ 3a66 82801JD/DO (ICH10 Family) USB UHCI Controller #3
+ 3a67 82801JD/DO (ICH10 Family) USB UHCI Controller #4
+ 3a68 82801JD/DO (ICH10 Family) USB UHCI Controller #5
+ 3a69 82801JD/DO (ICH10 Family) USB UHCI Controller #6
+ 3a6a 82801JD/DO (ICH10 Family) USB2 EHCI Controller #1
+ 3a6c 82801JD/DO (ICH10 Family) USB2 EHCI Controller #2
+ 3a6e 82801JD/DO (ICH10 Family) HD Audio Controller
+ 3a70 82801JD/DO (ICH10 Family) PCI Express Port 1
+ 3a72 82801JD/DO (ICH10 Family) PCI Express Port 2
+ 3a74 82801JD/DO (ICH10 Family) PCI Express Port 3
+ 3a76 82801JD/DO (ICH10 Family) PCI Express Port 4
+ 3a78 82801JD/DO (ICH10 Family) PCI Express Port 5
+ 3a7a 82801JD/DO (ICH10 Family) PCI Express Port 6
+ 3a7c 82801JD/DO (ICH10 Family) Gigabit Ethernet Controller
+ 3b00 5 Series/3400 Series Chipset LPC Interface Controller
+ 3b01 Mobile 5 Series Chipset LPC Interface Controller
+ 3b02 5 Series Chipset LPC Interface Controller
+ 3b03 Mobile 5 Series Chipset LPC Interface Controller
+ 3b04 5 Series Chipset LPC Interface Controller
+ 3b05 Mobile 5 Series Chipset LPC Interface Controller
+ 3b06 5 Series Chipset LPC Interface Controller
+ 3b07 Mobile 5 Series Chipset LPC Interface Controller
+ 1028 040b Latitude E6510
+ e4bf 50c1 PC1-GROOVE
+ 3b08 5 Series Chipset LPC Interface Controller
+ 3b09 Mobile 5 Series Chipset LPC Interface Controller
+ 1025 0347 Aspire 7740G
+ 3b0a 5 Series Chipset LPC Interface Controller
+ 3b0b Mobile 5 Series Chipset LPC Interface Controller
+ 3b0c 5 Series Chipset LPC Interface Controller
+ 3b0d 5 Series/3400 Series Chipset LPC Interface Controller
+ 3b0e 5 Series/3400 Series Chipset LPC Interface Controller
+ 3b0f 5 Series/3400 Series Chipset LPC Interface Controller
+ 3b10 5 Series/3400 Series Chipset LPC Interface Controller
+ 3b11 5 Series/3400 Series Chipset LPC Interface Controller
+ 3b12 3400 Series Chipset LPC Interface Controller
+ 3b13 5 Series/3400 Series Chipset LPC Interface Controller
+ 3b14 3400 Series Chipset LPC Interface Controller
+ 3b15 5 Series/3400 Series Chipset LPC Interface Controller
+ 3b16 3400 Series Chipset LPC Interface Controller
+ 3b17 5 Series/3400 Series Chipset LPC Interface Controller
+ 3b18 5 Series/3400 Series Chipset LPC Interface Controller
+ 3b19 5 Series/3400 Series Chipset LPC Interface Controller
+ 3b1a 5 Series/3400 Series Chipset LPC Interface Controller
+ 3b1b 5 Series/3400 Series Chipset LPC Interface Controller
+ 3b1c 5 Series/3400 Series Chipset LPC Interface Controller
+ 3b1d 5 Series/3400 Series Chipset LPC Interface Controller
+ 3b1e 5 Series/3400 Series Chipset LPC Interface Controller
+ 3b1f 5 Series/3400 Series Chipset LPC Interface Controller
+ 3b20 5 Series/3400 Series Chipset 4 port SATA IDE Controller
+ 3b21 5 Series/3400 Series Chipset 2 port SATA IDE Controller
+ 3b22 5 Series/3400 Series Chipset 6 port SATA AHCI Controller
+ 3b23 5 Series/3400 Series Chipset 4 port SATA AHCI Controller
+ 3b25 5 Series/3400 Series Chipset SATA RAID Controller
+ 3b26 5 Series/3400 Series Chipset 2 port SATA IDE Controller
+ 3b28 5 Series/3400 Series Chipset 4 port SATA IDE Controller
+ 3b29 5 Series/3400 Series Chipset 4 port SATA AHCI Controller
+ 1025 0347 Aspire 7740G
+ 3b2c 5 Series/3400 Series Chipset SATA RAID Controller
+ 3b2d 5 Series/3400 Series Chipset 2 port SATA IDE Controller
+ e4bf 50c1 PC1-GROOVE
+ 3b2e 5 Series/3400 Series Chipset 4 port SATA IDE Controller
+ e4bf 50c1 PC1-GROOVE
+ 3b2f 5 Series/3400 Series Chipset 6 port SATA AHCI Controller
+ e4bf 50c1 PC1-GROOVE
+ 3b30 5 Series/3400 Series Chipset SMBus Controller
+ 1025 0347 Aspire 7740G
+ 1028 040b Latitude E6510
+ e4bf 50c1 PC1-GROOVE
+ 3b32 5 Series/3400 Series Chipset Thermal Subsystem
+ 1025 0347 Aspire 7740G
+ 3b34 5 Series/3400 Series Chipset USB2 Enhanced Host Controller
+ 1025 0347 Aspire 7740G
+ 1028 040b Latitude E6510
+ e4bf 50c1 PC1-GROOVE
+ 3b36 5 Series/3400 Series Chipset USB Universal Host Controller
+ 3b37 5 Series/3400 Series Chipset USB Universal Host Controller
+ 3b38 5 Series/3400 Series Chipset USB Universal Host Controller
+ 3b39 5 Series/3400 Series Chipset USB Universal Host Controller
+ 3b3a 5 Series/3400 Series Chipset USB Universal Host Controller
+ 3b3b 5 Series/3400 Series Chipset USB Universal Host Controller
+ 3b3c 5 Series/3400 Series Chipset USB2 Enhanced Host Controller
+ 1025 0347 Aspire 7740G
+ 1028 040b Latitude E6510
+ e4bf 50c1 PC1-GROOVE
+ 3b3e 5 Series/3400 Series Chipset USB Universal Host Controller
+ 3b3f 5 Series/3400 Series Chipset USB Universal Host Controller
+ 3b40 5 Series/3400 Series Chipset USB Universal Host Controller
+ 3b41 5 Series/3400 Series Chipset LAN Controller
+ 3b42 5 Series/3400 Series Chipset PCI Express Root Port 1
+ 3b44 5 Series/3400 Series Chipset PCI Express Root Port 2
+ 3b46 5 Series/3400 Series Chipset PCI Express Root Port 3
+ 3b48 5 Series/3400 Series Chipset PCI Express Root Port 4
+ 3b4a 5 Series/3400 Series Chipset PCI Express Root Port 5
+ 3b4c 5 Series/3400 Series Chipset PCI Express Root Port 6
+ 3b4e 5 Series/3400 Series Chipset PCI Express Root Port 7
+ 3b50 5 Series/3400 Series Chipset PCI Express Root Port 8
+ 3b53 5 Series/3400 Series Chipset VECI Controller
+ 3b56 5 Series/3400 Series Chipset High Definition Audio
+ 1025 0347 Aspire 7740G
+ 1028 040b Latitude E6510
+ e4bf 50c1 PC1-GROOVE
+ 3b57 5 Series/3400 Series Chipset High Definition Audio
+ 3b64 5 Series/3400 Series Chipset HECI Controller
+ 1025 0347 Aspire 7740G
+ e4bf 50c1 PC1-GROOVE
+ 3b65 5 Series/3400 Series Chipset HECI Controller
+ 3b66 5 Series/3400 Series Chipset PT IDER Controller
+ 3b67 5 Series/3400 Series Chipset KT Controller
+ e4bf 50c1 PC1-GROOVE
+ 3c00 Sandy Bridge DMI2
+ 3c01 Sandy Bridge DMI2 in PCI Express Mode
+ 3c02 Sandy Bridge IIO PCI Express Root Port 1a
+ 3c03 Sandy Bridge IIO PCI Express Root Port 1b
+ 3c04 Sandy Bridge IIO PCI Express Root Port 2a
+ 3c05 Sandy Bridge IIO PCI Express Root Port 2b
+ 3c06 Sandy Bridge IIO PCI Express Root Port 2c
+ 3c07 Sandy Bridge IIO PCI Express Root Port 2d
+ 3c08 Sandy Bridge IIO PCI Express Root Port 3a in PCI Express Mode
+ 3c09 Sandy Bridge IIO PCI Express Root Port 3b
+ 3c0a Sandy Bridge IIO PCI Express Root Port 3c
+ 3c0b Sandy Bridge IIO PCI Express Root Port 3d
+ 3c0d Sandy Bridge Non-Transparent Bridge
+ 3c0e Sandy Bridge Non-Transparent Bridge
+ 3c0f Sandy Bridge Non-Transparent Bridge
+ 3c20 Sandy Bridge DMA Channel 0
+ 3c21 Sandy Bridge DMA Channel 1
+ 3c22 Sandy Bridge DMA Channel 2
+ 3c23 Sandy Bridge DMA Channel 3
+ 3c24 Sandy Bridge DMA Channel 4
+ 3c25 Sandy Bridge DMA Channel 5
+ 3c26 Sandy Bridge DMA Channel 6
+ 3c27 Sandy Bridge DMA Channel 7
+ 3c28 Sandy Bridge Address Map, VTd_Misc, System Management
+ 3c2a Sandy Bridge Control Status and Global Errors
+ 3c2c Sandy Bridge I/O APIC
+ 3c2e Sandy Bridge DMA
+ 3c2f Sandy Bridge DMA
+ 3c40 Sandy Bridge IIO Switch and IRP Performance Monitor
+ 3c41 Sandy Bridge QPI Port 0 Performance Monitor
+ 3c42 Sandy Bridge QPI Port 1 Performance Monitor
+ 3c43 Sandy Bridge Ring to PCI Express Performance Monitor
+ 3c44 Sandy Bridge Ring to QuickPath Interconnect Link 0 Performance Monitor
+ 3c45 Sandy Bridge Ring to QuickPath Interconnect Link 1 Performance Monitor
+ 3c46 Sandy Bridge Processor Home Agent Performance Monitoring
+ 3c71 Sandy Bridge Integrated Memory Controller RAS Registers
+ 3c80 Sandy Bridge QPI Link 0
+ 3c83 Sandy Bridge QPI Link Reut 0
+ 3c84 Sandy Bridge QPI Link Reut 0
+ 3c86 Sandy Bridge QPI Port 0 DFX Link
+ 3c90 Sandy Bridge QPI Link 1
+ 3c93 Sandy Bridge QPI Link Reut 1
+ 3c94 Sandy Bridge QPI Link Reut 1
+ 3c96 Sandy Bridge QPI Port 1 DFX Link
+ 3ca0 Sandy Bridge Processor Home Agent
+ 3ca8 Sandy Bridge Integrated Memory Controller Registers
+ 3caa Sandy Bridge Integrated Memory Controller Target Address Decoder 0
+ 3cab Sandy Bridge Integrated Memory Controller Target Address Decoder 1
+ 3cac Sandy Bridge Integrated Memory Controller Target Address Decoder 2
+ 3cad Sandy Bridge Integrated Memory Controller Target Address Decoder 3
+ 3cae Sandy Bridge Integrated Memory Controller Target Address Decoder 4
+ 3cb0 Sandy Bridge Integrated Memory Controller Channel 0-3 Thermal Control 0
+ 3cb1 Sandy Bridge Integrated Memory Controller Channel 0-3 Thermal Control 1
+ 3cb2 Sandy Bridge Integrated Memory Controller ERROR Registers 0
+ 3cb3 Sandy Bridge Integrated Memory Controller ERROR Registers 1
+ 3cb4 Sandy Bridge Integrated Memory Controller Channel 0-3 Thermal Control 2
+ 3cb5 Sandy Bridge Integrated Memory Controller Channel 0-3 Thermal Control 3
+ 3cb6 Sandy Bridge Integrated Memory Controller ERROR Registers 2
+ 3cb7 Sandy Bridge Integrated Memory Controller ERROR Registers 3
+ 3cb8 Sandy Bridge DDRIO
+ 3cc0 Sandy Bridge Power Control Unit 0
+ 3cc1 Sandy Bridge Power Control Unit 1
+ 3cc2 Sandy Bridge Power Control Unit 2
+ 3cd0 Sandy Bridge Power Control Unit 3
+ 3ce0 Sandy Bridge Interrupt Control Registers
+ 3ce3 Sandy Bridge Semaphore and Scratchpad Configuration Registers
+ 3ce4 Sandy Bridge R2PCIe
+ 3ce6 Sandy Bridge QuickPath Interconnect Agent Ring Registers
+ 3ce8 Sandy Bridge Unicast Register 0
+ 3ce9 Sandy Bridge Unicast Register 5
+ 3cea Sandy Bridge Unicast Register 1
+ 3ceb Sandy Bridge Unicast Register 6
+ 3cec Sandy Bridge Unicast Register 3
+ 3ced Sandy Bridge Unicast Register 7
+ 3cee Sandy Bridge Unicast Register 4
+ 3cef Sandy Bridge Unicast Register 8
+ 3cf4 Sandy Bridge Integrated Memory Controller System Address Decoder 0
+ 3cf5 Sandy Bridge Integrated Memory Controller System Address Decoder 1
+ 3cf6 Sandy Bridge System Address Decoder
+ 4000 5400 Chipset Memory Controller Hub
+ 4001 5400 Chipset Memory Controller Hub
+ 4003 5400 Chipset Memory Controller Hub
+ 4021 5400 Chipset PCI Express Port 1
+ 4022 5400 Chipset PCI Express Port 2
+ 4023 5400 Chipset PCI Express Port 3
+ 4024 5400 Chipset PCI Express Port 4
+ 4025 5400 Chipset PCI Express Port 5
+ 4026 5400 Chipset PCI Express Port 6
+ 4027 5400 Chipset PCI Express Port 7
+ 4028 5400 Chipset PCI Express Port 8
+ 4029 5400 Chipset PCI Express Port 9
+ 402d 5400 Chipset IBIST Registers
+ 402e 5400 Chipset IBIST Registers
+ 402f 5400 Chipset QuickData Technology Device
+ 4030 5400 Chipset FSB Registers
+ 4031 5400 Chipset CE/SF Registers
+ 4032 5400 Chipset IOxAPIC
+ 4035 5400 Chipset FBD Registers
+ 4036 5400 Chipset FBD Registers
+ 4100 Moorestown Graphics and Video
+ 4108 Atom Processor E6xx Integrated Graphics Controller
+ 4109 Atom Processor E6xx Integrated Graphics Controller
+ 410a Atom Processor E6xx Integrated Graphics Controller
+ 410b Atom Processor E6xx Integrated Graphics Controller
+ 410c Atom Processor E6xx Integrated Graphics Controller
+ 410d Atom Processor E6xx Integrated Graphics Controller
+ 410e Atom Processor E6xx Integrated Graphics Controller
+ 410f Atom Processor E6xx Integrated Graphics Controller
+ 4114 Atom Processor E6xx PCI Host Bridge #1
+ 4115 Atom Processor E6xx PCI Host Bridge #2
+ 4116 Atom Processor E6xx PCI Host Bridge #3
+ 4117 Atom Processor E6xx PCI Host Bridge #4
+ 4220 PRO/Wireless 2200BG [Calexico2] Network Connection
+ 103c 0934 Compaq nw8240/nx8220
+ 103c 12f6 Compaq nw8240/nx8220
+ 8086 2712 IBM ThinkPad R50e
+ 8086 2721 Dell B130 laptop integrated WLAN
+ 8086 2722 Dell Latitude D600
+ 8086 2731 Samsung P35 integrated WLAN
+ 4222 PRO/Wireless 3945ABG [Golan] Network Connection
+ 103c 135c Compaq 6710b or nx9420 Notebook
+ 8086 1000 PRO/Wireless 3945ABG Network Connection
+ 8086 1001 PRO/Wireless 3945ABG Network Connection
+ 8086 1005 PRO/Wireless 3945BG Network Connection
+ 8086 1034 PRO/Wireless 3945BG Network Connection
+ 8086 1044 PRO/Wireless 3945BG Network Connection
+ 8086 1c00 PRO/Wireless 3945ABG Network Connection
+ 4223 PRO/Wireless 2915ABG [Calexico2] Network Connection
+ 1000 8086 mPCI 3B Americas/Europe ZZA
+ 1001 8086 mPCI 3B Europe ZZE
+ 1002 8086 mPCI 3B Japan ZZJ
+ 1003 8086 mPCI 3B High-Band ZZH
+ 1351 103c Compaq NC6220
+ 4224 PRO/Wireless 2915ABG [Calexico2] Network Connection
+ 4227 PRO/Wireless 3945ABG [Golan] Network Connection
+ 8086 1011 ThinkPad R60e/X60s
+ 8086 1014 PRO/Wireless 3945BG Network Connection
+ 4229 PRO/Wireless 4965 AG or AGN [Kedron] Network Connection
+ 8086 1100 Vaio VGN-SZ79SN_C
+ 8086 1101 PRO/Wireless 4965 AG or AGN
+ 422b Centrino Ultimate-N 6300
+ 8086 1101 Centrino Ultimate-N 6300 3x3 AGN
+ 8086 1121 Centrino Ultimate-N 6300 3x3 AGN
+ 422c Centrino Advanced-N 6200
+ 8086 1301 Centrino Advanced-N 6200 2x2 AGN
+ 8086 1306 Centrino Advanced-N 6200 2x2 ABG
+ 8086 1307 Centrino Advanced-N 6200 2x2 BG
+ 8086 1321 Centrino Advanced-N 6200 2x2 AGN
+ 8086 1326 Centrino Advanced-N 6200 2x2 ABG
+ 4230 PRO/Wireless 4965 AG or AGN [Kedron] Network Connection
+ 8086 1110 Lenovo ThinkPad T51
+ 8086 1111 Lenovo ThinkPad T61
+ 4232 WiFi Link 5100
+ 8086 1201 WiFi Link 5100 AGN
+ 8086 1204 WiFi Link 5100 AGN
+ 8086 1205 WiFi Link 5100 BGN
+ 8086 1206 WiFi Link 5100 ABG
+ 8086 1221 WiFi Link 5100 AGN
+ 8086 1224 WiFi Link 5100 AGN
+ 8086 1225 WiFi Link 5100 BGN
+ 8086 1226 WiFi Link 5100 ABG
+ 8086 1301 WiFi Link 5100 AGN
+ 8086 1304 WiFi Link 5100 AGN
+ 8086 1305 WiFi Link 5100 BGN
+ 8086 1306 WiFi Link 5100 ABG
+ 8086 1321 WiFi Link 5100 AGN
+ 8086 1324 WiFi Link 5100 AGN
+ 8086 1325 WiFi Link 5100 BGN
+ 8086 1326 WiFi Link 5100 ABG
+ 4235 Ultimate N WiFi Link 5300
+ 4236 Ultimate N WiFi Link 5300
+ 4237 PRO/Wireless 5100 AGN [Shiloh] Network Connection
+ 8086 1211 WiFi Link 5100 AGN
+ 8086 1214 WiFi Link 5100 AGN
+ 8086 1215 WiFi Link 5100 BGN
+ 8086 1216 WiFi Link 5100 ABG
+ 8086 1311 WiFi Link 5100 AGN
+ 8086 1314 WiFi Link 5100 AGN
+ 8086 1315 WiFi Link 5100 BGN
+ 8086 1316 WiFi Link 5100 ABG
+ 4238 Centrino Ultimate-N 6300
+ 8086 1111 Centrino Ultimate-N 6300 3x3 AGN
+ 4239 Centrino Advanced-N 6200
+ 8086 1311 Centrino Advanced-N 6200 2x2 AGN
+ 8086 1316 Centrino Advanced-N 6200 2x2 ABG
+ 423a PRO/Wireless 5350 AGN [Echo Peak] Network Connection
+ 423b PRO/Wireless 5350 AGN [Echo Peak] Network Connection
+ 423c WiMAX/WiFi Link 5150
+ 8086 1201 WiMAX/WiFi Link 5150 AGN
+ 8086 1206 WiMAX/WiFi Link 5150 ABG
+ 8086 1221 WiMAX/WiFi Link 5150 AGN
+ 8086 1301 WiMAX/WiFi Link 5150 AGN
+ 8086 1306 WiMAX/WiFi Link 5150 ABG
+ 8086 1321 WiMAX/WiFi Link 5150 AGN
+ 423d WiMAX/WiFi Link 5150
+ 8086 1211 WiMAX/WiFi Link 5150 AGN
+ 8086 1216 WiMAX/WiFi Link 5150 ABG
+ 8086 1311 WiMAX/WiFi Link 5150 AGN
+ 8086 1316 WiMAX/WiFi Link 5150 ABG
+ 444e Turbo Memory Controller
+ 5001 LE80578
+ 5002 LE80578 Graphics Processor Unit
+ 5009 LE80578 Video Display Controller
+ 500d LE80578 Expansion Bus
+ 500e LE80578 UART Controller
+ 500f LE80578 General Purpose IO
+ 5010 LE80578 I2C Controller
+ 5012 LE80578 Serial Peripheral Interface Bus
+ 5020 EP80579 Memory Controller Hub
+ 5021 EP80579 DRAM Error Reporting Registers
+ 5023 EP80579 EDMA Controller
+ 5024 EP80579 PCI Express Port PEA0
+ 5025 EP80579 PCI Express Port PEA1
+ 5028 EP80579 S-ATA IDE
+ 5029 EP80579 S-ATA AHCI
+ 502a EP80579 S-ATA Reserved
+ 502b EP80579 S-ATA Reserved
+ 502c EP80579 Integrated Processor ASU
+ 502d EP80579 Integrated Processor with QuickAssist ASU
+ 502e EP80579 Reserved
+ 502f EP80579 Reserved
+ 5030 EP80579 Reserved
+ 5031 EP80579 LPC Bus
+ 5032 EP80579 SMBus Controller
+ 5033 EP80579 USB 1.1 Controller
+ 5035 EP80579 USB 2.0 Controller
+ 5037 EP80579 PCI-PCI Bridge (transparent mode)
+ 5039 EP80579 Controller Area Network (CAN) interface #1
+ 503a EP80579 Controller Area Network (CAN) interface #2
+ 503b EP80579 Synchronous Serial Port (SPP)
+ 503c EP80579 IEEE 1588 Hardware Assist
+ 503d EP80579 Local Expansion Bus
+ 503e EP80579 Global Control Unit (GCU)
+ 503f EP80579 Reserved
+ 5040 EP80579 Integrated Processor Gigabit Ethernet MAC
+ 5041 EP80579 Integrated Processor with QuickAssist Gigabit Ethernet MAC
+ 5042 EP80579 Reserved
+ 5043 EP80579 Reserved
+ 5044 EP80579 Integrated Processor Gigabit Ethernet MAC
+ 5045 EP80579 Integrated Processor with QuickAssist Gigabit Ethernet MAC
+ 5046 EP80579 Reserved
+ 5047 EP80579 Reserved
+ 5048 EP80579 Integrated Processor Gigabit Ethernet MAC
+ 5049 EP80579 Integrated Processor with QuickAssist Gigabit Ethernet MAC
+ 504a EP80579 Reserved
+ 504b EP80579 Reserved
+ 504c EP80579 Integrated Processor with QuickAssist TDM
+ 5200 EtherExpress PRO/100 Intelligent Server
+ 5201 EtherExpress PRO/100 Intelligent Server
+ 8086 0001 EtherExpress PRO/100 Server Ethernet Adapter
+ 530d 80310 (IOP) IO Processor
+ 65c0 5100 Chipset Memory Controller Hub
+ 65e2 5100 Chipset PCI Express x4 Port 2
+ 65e3 5100 Chipset PCI Express x4 Port 3
+ 65e4 5100 Chipset PCI Express x4 Port 4
+ 65e5 5100 Chipset PCI Express x4 Port 5
+ 65e6 5100 Chipset PCI Express x4 Port 6
+ 65e7 5100 Chipset PCI Express x4 Port 7
+ 65f0 5100 Chipset FSB Registers
+ 1028 020f PowerEdge R300
+ 1028 0210 PowerEdge T300
+ 65f1 5100 Chipset Reserved Registers
+ 1028 0210 PowerEdge T300
+ 65f3 5100 Chipset Reserved Registers
+ 65f5 5100 Chipset DDR Channel 0 Registers
+ 65f6 5100 Chipset DDR Channel 1 Registers
+ 65f7 5100 Chipset PCI Express x8 Port 2-3
+ 65f8 5100 Chipset PCI Express x8 Port 4-5
+ 65f9 5100 Chipset PCI Express x8 Port 6-7
+ 65fa 5100 Chipset PCI Express x16 Port 4-7
+ 65ff 5100 Chipset DMA Engine
+ 7000 82371SB PIIX3 ISA [Natoma/Triton II]
+ 1af4 1100 Qemu virtual machine
+ 7010 82371SB PIIX3 IDE [Natoma/Triton II]
+ 1af4 1100 Qemu virtual machine
+ 7020 82371SB PIIX3 USB [Natoma/Triton II]
+ 1af4 1100 Qemu virtual machine
+ 7030 430VX - 82437VX TVX [Triton VX]
+ 7050 Intercast Video Capture Card
+ 7051 PB 642365-003 (Business Video Conferencing Card)
+ 7100 430TX - 82439TX MTXC
+ 7110 82371AB/EB/MB PIIX4 ISA
+ 15ad 1976 Virtual Machine Chipset
+ 7111 82371AB/EB/MB PIIX4 IDE
+ 15ad 1976 Virtual Machine Chipset
+ 7112 82371AB/EB/MB PIIX4 USB
+ 15ad 1976 Virtual Machine Chipset
+ 7113 82371AB/EB/MB PIIX4 ACPI
+ 15ad 1976 Virtual Machine Chipset
+ 1af4 1100 Qemu virtual machine
+ 7120 82810 GMCH (Graphics Memory Controller Hub)
+ 4c53 1040 CL7 mainboard
+ 4c53 1060 PC7 mainboard
+ 7121 82810 (CGC) Chipset Graphics Controller
+ 4c53 1040 CL7 mainboard
+ 4c53 1060 PC7 mainboard
+ 8086 4341 Cayman (CA810) Mainboard
+ 7122 82810 DC-100 (GMCH) Graphics Memory Controller Hub
+ 7123 82810 DC-100 (CGC) Chipset Graphics Controller
+ 7124 82810E DC-133 (GMCH) Graphics Memory Controller Hub
+ 1028 00b4 OptiPlex GX110
+ 7125 82810E DC-133 (CGC) Chipset Graphics Controller
+ 1028 00b4 OptiPlex GX110
+ 7126 82810 DC-133 System and Graphics Controller
+ 7128 82810-M DC-100 System and Graphics Controller
+ 712a 82810-M DC-133 System and Graphics Controller
+ 7180 440LX/EX - 82443LX/EX Host bridge
+ 7181 440LX/EX - 82443LX/EX AGP bridge
+ 7190 440BX/ZX/DX - 82443BX/ZX/DX Host bridge
+ 0e11 0500 Armada 1750 Laptop System Chipset
+ 0e11 b110 Armada M700/E500
+ 1028 008e PowerEdge 1300 mainboard
+ 1043 803b CUBX-L/E Mainboard
+ 1179 0001 Toshiba Tecra 8100 Laptop System Chipset
+ 15ad 1976 Virtual Machine Chipset
+ 4c53 1050 CT7 mainboard
+ 4c53 1051 CE7 mainboard
+ 7191 440BX/ZX/DX - 82443BX/ZX/DX AGP bridge
+ 1028 008e PowerEdge 1300 mainboard
+ 7192 440BX/ZX/DX - 82443BX/ZX/DX Host bridge (AGP disabled)
+ 0e11 0460 Armada 1700 Laptop System Chipset
+ 1179 0001 Satellite 4010
+ 4c53 1000 CC7/CR7/CP7/VC7/VP7/VR7 mainboard
+ 8086 7190 Dell PowerEdge 350
+ 7194 82440MX Host Bridge
+ 1033 0000 Versa Note Vxi
+ 4c53 10a0 CA3/CR3 mainboard
+ 7195 82440MX AC'97 Audio Controller
+ 1033 80cc Versa Note VXi
+ 10cf 1099 QSound_SigmaTel Stac97 PCI Audio
+ 11d4 0040 SoundMAX Integrated Digital Audio
+ 11d4 0048 SoundMAX Integrated Digital Audio
+ 7196 82440MX AC'97 Modem Controller
+ 7198 82440MX ISA Bridge
+ 7199 82440MX EIDE Controller
+ 719a 82440MX USB Universal Host Controller
+ 719b 82440MX Power Management Controller
+ 71a0 440GX - 82443GX Host bridge
+ 4c53 1050 CT7 mainboard
+ 4c53 1051 CE7 mainboard
+ 71a1 440GX - 82443GX AGP bridge
+ 71a2 440GX - 82443GX Host bridge (AGP disabled)
+ 4c53 1000 CC7/CR7/CP7/VC7/VP7/VR7 mainboard
+ 7600 82372FB PIIX5 ISA
+ 7601 82372FB PIIX5 IDE
+ 7602 82372FB PIIX5 USB
+ 7603 82372FB PIIX5 SMBus
+ 7800 82740 (i740) AGP Graphics Accelerator
+ 003d 0008 Starfighter AGP
+ 003d 000b Starfighter AGP
+ 1092 0100 Stealth II G460
+ 10b4 201a Lightspeed 740
+ 10b4 202f Lightspeed 740
+ 8086 0000 Terminator 2x/i
+ 8086 0100 Intel740 Graphics Accelerator
+ 8002 Trusted Execution Technology Registers
+ 8003 Trusted Execution Technology Registers
+ 8100 System Controller Hub (SCH Poulsbo)
+ 8108 System Controller Hub (SCH Poulsbo) Graphics Controller
+ 8110 System Controller Hub (SCH Poulsbo) PCI Express Port 1
+ 8112 System Controller Hub (SCH Poulsbo) PCI Express Port 2
+ 8114 System Controller Hub (SCH Poulsbo) USB UHCI #1
+ 8115 System Controller Hub (SCH Poulsbo) USB UHCI #2
+ 8116 System Controller Hub (SCH Poulsbo) USB UHCI #3
+ 8117 System Controller Hub (SCH Poulsbo) USB EHCI #1
+ 8118 System Controller Hub (SCH Poulsbo) USB Client Controller
+ 8119 System Controller Hub (SCH Poulsbo) LPC Bridge
+ 811a System Controller Hub (SCH Poulsbo) IDE Controller
+ 811b System Controller Hub (SCH Poulsbo) HD Audio Controller
+ 811c System Controller Hub (SCH Poulsbo) SDIO Controller #1
+ 811d System Controller Hub (SCH Poulsbo) SDIO Controller #2
+ 811e System Controller Hub (SCH Poulsbo) SDIO Controller #3
+ 8180 Atom Processor E6xx PCI Express Port 3
+ 8181 Atom Processor E6xx PCI Express Port 4
+ 8182 Atom Processor E6xx Integrated Graphics Controller
+ 8183 Atom Processor E6xx Configuration Unit
+ 8184 Atom Processor E6xx PCI Express Port 1
+ 8185 Atom Processor E6xx PCI Express Port 2
+ 8186 Atom Processor E6xx LPC Bridge
+ 84c4 450KX/GX [Orion] - 82454KX/GX PCI bridge
+ 84c5 450KX/GX [Orion] - 82453KX/GX Memory controller
+ 84ca 450NX - 82451NX Memory & I/O Controller
+ 84cb 450NX - 82454NX/84460GX PCI Expander Bridge
+ 84e0 460GX - 84460GX System Address Controller (SAC)
+ 84e1 460GX - 84460GX System Data Controller (SDC)
+ 84e2 460GX - 84460GX AGP Bridge (GXB function 2)
+ 84e3 460GX - 84460GX Memory Address Controller (MAC)
+ 84e4 460GX - 84460GX Memory Data Controller (MDC)
+ 84e6 460GX - 82466GX Wide and fast PCI eXpander Bridge (WXB)
+ 84ea 460GX - 84460GX AGP Bridge (GXB function 1)
+ 8500 IXP4XX Network Processor (IXP420/421/422/425/IXC1100)
+ 1993 0ded mGuard-PCI AV#2
+ 1993 0dee mGuard-PCI AV#1
+ 1993 0def mGuard-PCI AV#0
+ 8800 Platform Controller Hub EG20T PCI Express Port
+ 8801 Platform Controller Hub EG20T Packet Hub
+ 8802 Platform Controller Hub EG20T Gigabit Ethernet Controller
+ 8803 Platform Controller Hub EG20T General Purpose IO Controller
+ 8804 Platform Controller Hub EG20T USB OHCI Controller #4
+ 8805 Platform Controller Hub EG20T USB OHCI Controller #5
+ 8806 Platform Controller Hub EG20T USB OHCI Controller #6
+ 8807 Platform Controller Hub EG20T USB2 EHCI Controller #2
+ 8808 Platform Controller Hub EG20T USB Client Controller
+ 8809 Platform Controller Hub EG20T SDIO Controller #1
+ 880a Platform Controller Hub EG20T SDIO Controller #2
+ 880b Platform Controller Hub EG20T SATA AHCI Controller
+ 880c Platform Controller Hub EG20T USB OHCI Controller #1
+ 880d Platform Controller Hub EG20T USB OHCI Controller #2
+ 880e Platform Controller Hub EG20T USB OHCI Controller #3
+ 880f Platform Controller Hub EG20T USB2 EHCI Controller #1
+ 8810 Platform Controller Hub EG20T DMA Controller #1
+ 8811 Platform Controller Hub EG20T UART Controller 0
+ 8812 Platform Controller Hub EG20T UART Controller 1
+ 8813 Platform Controller Hub EG20T UART Controller 2
+ 8814 Platform Controller Hub EG20T UART Controller 3
+ 8815 Platform Controller Hub EG20T DMA Controller #2
+ 8816 Platform Controller Hub EG20T Serial Peripheral Interface Bus
+ 8817 Platform Controller Hub EG20T I2C Controller
+ 8818 Platform Controller Hub EG20T Controller Area Network (CAN) Controller
+ 8819 Platform Controller Hub EG20T IEEE 1588 Hardware Assist
+ 9000 IXP2000 Family Network Processor
+ 9001 IXP2400 Network Processor
+ 9002 IXP2300 Network Processor
+ 9004 IXP2800 Network Processor
+ 9621 Integrated RAID
+ 9622 Integrated RAID
+ 9641 Integrated RAID
+ 96a1 Integrated RAID
+ a000 N10 Family DMI Bridge
+ 8086 4f4d DeskTop Board D510MO
+ a001 N10 Family Integrated Graphics Controller
+ 8086 4f4d DeskTop Board D510MO
+ a002 N10 Family Integrated Graphics Controller
+ a003 N10 Family CHAPS counter
+ a010 N10 Family DMI Bridge
+ a011 N10 Family Integrated Graphics Controller
+ a012 N10 Family Integrated Graphics Controller
+ a013 N10 Family CHAPS counter
+ a620 6400/6402 Advanced Memory Buffer (AMB)
+ b152 21152 PCI-to-PCI Bridge
+ 8086 b152 21152 PCI-to-PCI Bridge
+# observed, and documented in Intel revision note; new mask of 1011:0026
+ b154 21154 PCI-to-PCI Bridge
+ b555 21555 Non transparent PCI-to-PCI Bridge
+ 12c7 5005 SS7HD PCI Adaptor Card
+ 12c7 5006 SS7HDC cPCI Adaptor Card
+ 12d9 000a PCI VoIP Gateway
+ 4c53 1050 CT7 mainboard
+ 4c53 1051 CE7 mainboard
+ e4bf 1000 CC8-1-BLUES
+ d130 Core Processor DMI
+ d131 Core Processor DMI
+ d132 Core Processor DMI
+ 1028 040b Latitude E6510
+ d133 Core Processor DMI
+ d134 Core Processor DMI
+ d135 Core Processor DMI
+ d136 Core Processor DMI
+ d137 Core Processor DMI
+ d138 Core Processor PCI Express Root Port 1
+ d139 Core Processor PCI Express Root Port 2
+ d13a Core Processor PCI Express Root Port 3
+ d13b Core Processor PCI Express Root Port 4
+ d150 Core Processor QPI Link
+ d151 Core Processor QPI Routing and Protocol Registers
+ d155 Core Processor System Management Registers
+ d156 Core Processor Semaphore and Scratchpad Registers
+ d157 Core Processor System Control and Status Registers
+ d158 Core Processor Miscellaneous Registers
+80ee InnoTek Systemberatung GmbH
+ beef VirtualBox Graphics Adapter
+ cafe VirtualBox Guest Service
+8322 Sodick America Corp.
+8384 SigmaTel
+ 7618 High Definition Audio Codec
+ 7634 9250 HD Audio Codec
+ 7662 High Definition Audio Codec
+ 104d 1e00 High Definition Audio Codec [STAC9872AK]
+ 7664 High Definition Audio Codec
+ 7670 9770 High Definition Audio
+ 7672 9772 High Definition Audio
+ 7682 IDT High Definition Audio Codec
+ 7690 9200 HD Audio Codec
+ 1028 01c1 Precision 490
+8401 TRENDware International Inc.
+8686 ScaleMP
+ 1010 vSMPowered system controller [vSMP CTL]
+8800 Trigem Computer Inc.
+ 2008 Video assistent component
+8866 T-Square Design Inc.
+8888 Silicon Magic
+8912 TRX
+# 8c4a is not Winbond but there is a board misprogrammed
+8c4a Winbond
+ 1980 W89C940 misprogrammed [ne2k]
+8e0e Computone Corporation
+8e2e KTI
+ 3000 ET32P2
+9004 Adaptec
+ 0078 AHA-2940U_CN
+ 1078 AIC-7810
+ 1160 AIC-1160 [Family Fibre Channel Adapter]
+ 2178 AIC-7821
+ 3860 AHA-2930CU
+ 3b78 AHA-4844W/4844UW
+ 5075 AIC-755x
+ 5078 AIC-7850
+ 9004 7850 AHA-2904/Integrated AIC-7850
+ 5175 AIC-755x
+ 5178 AIC-7851
+ 5275 AIC-755x
+ 5278 AIC-7852
+ 5375 AIC-755x
+ 5378 AIC-7850
+ 5475 AIC-755x
+ 5478 AIC-7850
+ 5575 AVA-2930
+ 5578 AIC-7855
+ 5647 ANA-7711 TCP Offload Engine
+ 9004 7710 ANA-7711F TCP Offload Engine - Optical
+ 9004 7711 ANA-7711LP TCP Offload Engine - Copper
+ 5675 AIC-755x
+ 5678 AIC-7856
+ 5775 AIC-755x
+ 5778 AIC-7850
+ 5800 AIC-5800
+ 5900 ANA-5910/5930/5940 ATM155 & 25 LAN Adapter
+ 5905 ANA-5910A/5930A/5940A ATM Adapter
+ 6038 AIC-3860
+ 6075 AIC-1480 / APA-1480
+ 9004 7560 AIC-1480 / APA-1480 Cardbus
+ 6078 AIC-7860
+ 6178 AIC-7861
+ 9004 7861 AHA-2940AU Single
+ 6278 AIC-7860
+ 6378 AIC-7860
+ 6478 AIC-786x
+ 6578 AIC-786x
+ 6678 AIC-786x
+ 6778 AIC-786x
+ 6915 ANA620xx/ANA69011A
+ 9004 0008 ANA69011A/TX 10/100
+ 9004 0009 ANA69011A/TX 10/100
+ 9004 0010 ANA62022 2-port 10/100
+ 9004 0018 ANA62044 4-port 10/100
+ 9004 0019 ANA62044 4-port 10/100
+ 9004 0020 ANA62022 2-port 10/100
+ 9004 0028 ANA69011A/TX 10/100
+ 9004 8008 ANA69011A/TX 64 bit 10/100
+ 9004 8009 ANA69011A/TX 64 bit 10/100
+ 9004 8010 ANA62022 2-port 64 bit 10/100
+ 9004 8018 ANA62044 4-port 64 bit 10/100
+ 9004 8019 ANA62044 4-port 64 bit 10/100
+ 9004 8020 ANA62022 2-port 64 bit 10/100
+ 9004 8028 ANA69011A/TX 64 bit 10/100
+ 7078 AHA-294x / AIC-7870
+ 7178 AHA-2940/2940W / AIC-7871
+ 7278 AHA-3940/3940W / AIC-7872
+ 7378 AHA-3985 / AIC-7873
+ 7478 AHA-2944/2944W / AIC-7874
+ 7578 AHA-3944/3944W / AIC-7875
+ 7678 AHA-4944W/UW / AIC-7876
+ 7710 ANA-7711F Network Accelerator Card (NAC) - Optical
+ 7711 ANA-7711C Network Accelerator Card (NAC) - Copper
+ 7778 AIC-787x
+ 7810 AIC-7810
+ 7815 AIC-7815 RAID+Memory Controller IC
+ 9004 7815 ARO-1130U2 RAID Controller
+ 9004 7840 AIC-7815 RAID+Memory Controller IC
+ 7850 AIC-7850
+ 7855 AHA-2930
+ 7860 AIC-7860
+ 7870 AIC-7870
+ 7871 AHA-2940
+ 7872 AHA-3940
+ 7873 AHA-3980
+ 7874 AHA-2944
+ 7880 AIC-7880P
+ 7890 AIC-7890
+ 7891 AIC-789x
+ 7892 AIC-789x
+ 7893 AIC-789x
+ 7894 AIC-789x
+ 7895 AHA-2940U/UW / AHA-39xx / AIC-7895
+ 9004 7890 AHA-2940U/2940UW Dual AHA-394xAU/AUW/AUWD AIC-7895B
+ 9004 7891 AHA-2940U/2940UW Dual
+ 9004 7892 AHA-3940AU/AUW/AUWD/UWD
+ 9004 7894 AHA-3944AUWD
+ 9004 7895 AHA-2940U/2940UW Dual AHA-394xAU/AUW/AUWD AIC-7895B
+ 9004 7896 AHA-2940U/2940UW Dual AHA-394xAU/AUW/AUWD AIC-7895B
+ 9004 7897 AHA-2940U/2940UW Dual AHA-394xAU/AUW/AUWD AIC-7895B
+ 7896 AIC-789x
+ 7897 AIC-789x
+ 8078 AIC-7880U
+ 9004 7880 AIC-7880P Ultra/Ultra Wide SCSI Chipset
+ 8178 AHA-2940U/UW/D / AIC-7881U
+ 9004 7881 AHA-2940UW SCSI Host Adapter
+ 8278 AHA-3940U/UW/UWD / AIC-7882U
+ 8378 AHA-3940U/UW / AIC-7883U
+ 8478 AHA-2944UW / AIC-7884U
+ 8578 AHA-3944U/UWD / AIC-7885
+ 8678 AHA-4944UW / AIC-7886
+ 8778 AHA-2940UW Pro / AIC-788x
+ 9004 7887 2940UW Pro Ultra-Wide SCSI Controller
+ 8878 AHA-2930UW / AIC-7888
+ 9004 7888 AHA-2930UW SCSI Controller
+ 8b78 ABA-1030
+ ec78 AHA-4944W/UW
+9005 Adaptec
+ 0010 AHA-2940U2/U2W
+ 9005 2180 AHA-2940U2 SCSI Controller
+ 9005 8100 AHA-2940U2B SCSI Controller
+ 9005 a100 AHA-2940U2B SCSI Controller
+ 9005 a180 AHA-2940U2W SCSI Controller
+ 9005 e100 AHA-2950U2B SCSI Controller
+ 0011 AHA-2930U2
+ 0013 78902
+ 9005 0003 AAA-131U2 Array1000 1 Channel RAID Controller
+ 9005 000f AIC7890_ARO
+ 001f AHA-2940U2/U2W / 7890/7891
+ 9005 000f 2940U2W SCSI Controller
+ 9005 a180 2940U2W SCSI Controller
+ 0020 AIC-7890
+ 002f AIC-7890
+ 0030 AIC-7890
+ 003f AIC-7890
+ 0050 AHA-3940U2x/395U2x
+ 9005 f500 AHA-3950U2B
+ 9005 ffff AHA-3950U2B
+ 0051 AHA-3950U2D
+ 9005 b500 AHA-3950U2D
+ 0053 AIC-7896 SCSI Controller
+ 9005 ffff AIC-7896 SCSI Controller mainboard implementation
+ 005f AIC-7896U2/7897U2
+ 0080 AIC-7892A U160/m
+ 0e11 e2a0 Compaq 64-Bit/66MHz Wide Ultra3 SCSI Adapter
+ 9005 6220 AHA-29160C
+ 9005 62a0 29160N Ultra160 SCSI Controller
+ 9005 e220 29160LP Low Profile Ultra160 SCSI Controller
+ 9005 e2a0 29160 Ultra160 SCSI Controller
+ 0081 AIC-7892B U160/m
+ 9005 62a1 19160 Ultra160 SCSI Controller
+ 0083 AIC-7892D U160/m
+ 008f AIC-7892P U160/m
+ 1179 0001 Magnia Z310
+ 15d9 9005 Onboard SCSI Host Adapter
+ 0092 AVC-2010 [VideoH!]
+ 0093 AVC-2410 [VideoH!]
+ 00c0 AHA-3960D / AIC-7899A U160/m
+ 0e11 f620 Compaq 64-Bit/66MHz Dual Channel Wide Ultra3 SCSI Adapter
+ 9005 f620 AHA-3960D U160/m
+ 00c1 AIC-7899B U160/m
+ 00c3 AIC-7899D U160/m
+ 00c5 RAID subsystem HBA
+ 1028 00c5 PowerEdge 2400,2500,2550,4400
+ 00cf AIC-7899P U160/m
+ 1028 00ce PowerEdge 1400
+ 1028 00d1 PowerEdge 2550
+ 1028 00d9 PowerEdge 2500
+ 10f1 2462 Thunder K7 S2462
+ 15d9 9005 Onboard SCSI Host Adapter
+ 8086 3411 SDS2 Mainboard
+ 0241 Serial ATA II RAID 1420SA
+ 0242 Serial ATA II RAID 1220SA
+ 0243 Serial ATA II RAID 1430SA
+ 0244 eSATA II RAID 1225SA
+ 0250 ServeRAID Controller
+ 1014 0279 ServeRAID 6M
+ 1014 028c ServeRAID 6i/6i+
+ 1014 028e ServeRAID 7k
+ 0279 ServeRAID 6M
+ 0283 AAC-RAID
+ 9005 0283 Catapult
+ 0284 AAC-RAID
+ 9005 0284 Tomcat
+ 0285 AAC-RAID
+ 0e11 0295 SATA 6Ch (Bearcat)
+ 1014 02f2 ServeRAID 8i
+ 1028 0287 PowerEdge Expandable RAID Controller 320/DC
+ 1028 0291 CERC SATA RAID 2 PCI SATA 6ch (DellCorsair)
+ 103c 3227 AAR-2610SA
+ 108e 0286 STK RAID INT
+ 108e 0287 STK RAID EXT
+ 108e 7aac STK RAID REM
+ 108e 7aae STK RAID EX
+ 15d9 02b5 SMC AOC-USAS-S4i
+ 15d9 02b6 SMC AOC-USAS-S8i
+ 15d9 02c9 SMC AOC-USAS-S4iR
+ 15d9 02ca SMC AOC-USAS-S8iR
+ 15d9 02d2 SMC AOC-USAS-S8i-LP
+ 15d9 02d3 SMC AOC-USAS-S8iR-LP
+ 17aa 0286 Legend S220 (Legend Crusader)
+ 17aa 0287 Legend S230 (Legend Vulcan)
+ 9005 0285 2200S (Vulcan)
+ 9005 0286 2120S (Crusader)
+ 9005 0287 2200S (Vulcan-2m)
+ 9005 0288 3230S (Harrier)
+ 9005 0289 3240S (Tornado)
+# Some early versions reported 2020S
+ 9005 028a ASR-2020ZCR
+# Some early versions reported 2025S
+ 9005 028b ASR-2025ZCR (Terminator)
+ 9005 028e ASR-2020SA (Skyhawk)
+ 9005 028f ASR-2025SA
+ 9005 0290 AAR-2410SA PCI SATA 4ch (Jaguar II)
+ 9005 0292 AAR-2810SA PCI SATA 8ch (Corsair-8)
+ 9005 0293 AAR-21610SA PCI SATA 16ch (Corsair-16)
+ 9005 0294 ESD SO-DIMM PCI-X SATA ZCR (Prowler)
+ 9005 0296 ASR-2240S
+ 9005 0297 ASR-4005SAS
+ 9005 0298 ASR-4000
+ 9005 0299 ASR-4800SAS
+ 9005 029a 4805SAS
+ 9005 02a4 ICP ICP9085LI
+ 9005 02a5 ICP ICP5085BR
+ 9005 02b5 ASR5800
+ 9005 02b6 ASR5805
+ 9005 02b7 ASR5808
+ 9005 02b8 ICP5445SL
+ 9005 02b9 ICP5085SL
+ 9005 02ba ICP5805SL
+ 9005 02bb 3405
+ 9005 02bc 3805
+ 9005 02bd 31205
+ 9005 02be 31605
+ 9005 02bf ICP ICP5045BL
+ 9005 02c0 ICP ICP5085BL
+ 9005 02c1 ICP ICP5125BR
+ 9005 02c2 ICP ICP5165BR
+ 9005 02c3 51205
+ 9005 02c4 51605
+ 9005 02c5 ICP ICP5125SL
+ 9005 02c6 ICP ICP5165SL
+ 9005 02c7 3085
+ 9005 02c8 ICP5805BL
+ 9005 02ce 51245
+ 9005 02cf 51645
+ 9005 02d0 52445
+ 9005 02d1 5405
+ 9005 02d4 ASR-2045
+ 9005 02d5 ASR-2405
+ 9005 02d6 ASR-2445
+ 9005 02d7 ASR-2805
+ 9005 02d8 5405G
+ 9005 02d9 5445G
+ 9005 02da 5805G
+ 9005 02db 5085G
+ 9005 02dc 51245G
+ 9005 02dd 51645G
+ 9005 02de 52445G
+ 9005 02df ASR-2045G
+ 9005 02e0 ASR-2405G
+ 9005 02e1 ASR-2445G
+ 9005 02e2 ASR-2805G
+ 0286 AAC-RAID (Rocket)
+ 1014 034d 8s
+ 1014 9540 ServeRAID 8k/8k-l4
+ 1014 9580 ServeRAID 8k/8k-l8
+ 9005 028c ASR-2230S + ASR-2230SLP PCI-X (Lancer)
+ 9005 028d ASR-2130S
+ 9005 029b ASR-2820SA
+ 9005 029c ASR-2620SA
+ 9005 029d ASR-2420SA
+ 9005 029e ICP ICP9024R0
+ 9005 029f ICP ICP9014R0
+ 9005 02a0 ICP ICP9047MA
+ 9005 02a1 ICP ICP9087MA
+ 9005 02a2 3800
+ 9005 02a3 ICP ICP5445AU
+ 9005 02a4 ICP ICP9085LI
+ 9005 02a5 ICP ICP5085BR
+ 9005 02a6 ICP9067MA
+ 9005 02a7 3805
+ 9005 02a8 3400
+ 9005 02a9 ICP ICP5085AU
+ 9005 02aa ICP ICP5045AU
+ 9005 02ac 1800
+ 9005 02b3 2400
+ 9005 02b4 ICP ICP5045AL
+ 9005 0800 Callisto
+ 0410 AIC-9410W SAS (Razor HBA RAID)
+ 9005 0410 ASC-48300(Spirit RAID)
+ 9005 0411 ASC-58300 (Oakmont RAID)
+ 0412 AIC-9410W SAS (Razor HBA non-RAID)
+ 9005 0412 ASC-48300 (Spirit non-RAID)
+ 9005 0413 ASC-58300 (Oakmont non-RAID)
+ 0415 ASC-58300 SAS (Razor-External HBA RAID)
+ 0416 ASC-58300 SAS (Razor-External HBA non-RAID)
+ 041e AIC-9410W SAS (Razor ASIC non-RAID)
+ 041f AIC-9410W SAS (Razor ASIC RAID)
+ 9005 041f AIC-9410W SAS (Razor ASIC RAID)
+ 042f VSC7250/7251 SAS (Aurora ASIC non-RAID)
+ 0430 AIC-9405W SAS (Razor-Lite HBA RAID)
+ 9005 0430 ASC-44300 (Spirit-Lite RAID)
+ 0432 AIC-9405W SAS (Razor-Lite HBA non-RAID)
+ 9005 0432 ASC-44300 (Spirit-Lite non-RAID)
+ 043e AIC-9405W SAS (Razor-Lite ASIC non-RAID)
+ 043f AIC-9405W SAS (Razor-Lite ASIC RAID)
+ 0450 ASC-1405 Unified Serial HBA
+ 0500 Obsidian chipset SCSI controller
+ 1014 02c1 PCI-X DDR 3Gb SAS Adapter (572A/572C)
+ 1014 02c2 PCI-X DDR 3Gb SAS RAID Adapter (572B/572D)
+ 0503 Scamp chipset SCSI controller
+ 1014 02bf Quad Channel PCI-X DDR U320 SCSI RAID Adapter (571E)
+ 1014 02c3 PCI-X DDR 3Gb SAS RAID Adapter (572F)
+ 1014 02d5 Quad Channel PCI-X DDR U320 SCSI RAID Adapter (571F)
+ 0910 AUA-3100B
+ 091e AUA-3100B
+ 8000 ASC-29320A U320
+ 800f AIC-7901 U320
+ 8010 ASC-39320 U320
+ 8011 ASC-39320D
+ 0e11 00ac ASC-39320D U320
+ 9005 0041 ASC-39320D U320
+ 8012 ASC-29320 U320
+ 8013 ASC-29320B U320
+ 8014 ASC-29320LP U320
+ 8015 ASC-39320B U320
+ 8016 ASC-39320A U320
+ 8017 ASC-29320ALP U320
+ 9005 0044 ASC-29320ALP PCIx U320
+ 9005 0045 ASC-29320LPE PCIe U320
+ 801c ASC-39320D U320
+ 801d AIC-7902B U320
+ 1014 02cc ServeRAID 7e
+ 801e AIC-7901A U320
+ 801f AIC-7902 U320
+ 1734 1011 PRIMERGY RX300 onboard SCSI
+ 8080 ASC-29320A U320 w/HostRAID
+ 808f AIC-7901 U320 w/HostRAID
+ 8090 ASC-39320 U320 w/HostRAID
+ 8091 ASC-39320D U320 w/HostRAID
+ 8092 ASC-29320 U320 w/HostRAID
+ 8093 ASC-29320B U320 w/HostRAID
+ 8094 ASC-29320LP U320 w/HostRAID
+ 8095 ASC-39320(B) U320 w/HostRAID
+ 8096 ASC-39320A U320 w/HostRAID
+ 8097 ASC-29320ALP U320 w/HostRAID
+ 809c ASC-39320D(B) U320 w/HostRAID
+ 809d AIC-7902(B) U320 w/HostRAID
+ 1014 02cc ServeRAID 7e
+ 809e AIC-7901A U320 w/HostRAID
+ 809f AIC-7902 U320 w/HostRAID
+907f Atronics
+ 2015 IDE-2015PL
+919a Gigapixel Corp
+9412 Holtek
+ 6565 6565
+9699 Omni Media Technology Inc
+ 6565 6565
+9710 NetMos Technology
+ 9250 PCI-to-PCI bridge [MCS9250]
+ 9805 PCI 1 port parallel adapter
+ 9815 PCI 9815 Multi-I/O Controller
+ 1000 0020 2P0S (2 port parallel adaptor)
+ 9820 PCI 9820 Multi-I/O Controller
+ 9835 PCI 9835 Multi-I/O Controller
+ 1000 0002 2S (16C550 UART)
+ 1000 0012 1P2S
+ 9845 PCI 9845 Multi-I/O Controller
+# Serial ports at BAR0-3
+ 1000 0004 0P4S (4 port 16550A serial card)
+ 1000 0006 0P6S (6 port 16550a serial card)
+# Serial ports at BAR0-3, Parallel port at BAR4
+ 1000 0014 1P4S (1 Parallel / 4 16550A Serial Port Adapter)
+ 9855 PCI 9855 Multi-I/O Controller
+# Parallel port at BAR0. Serial ports at BAR2-5
+ 1000 0014 1P4S
+# Parallel ports at BAR0,BAR2. Serial ports at BAR4-5
+ 1000 0022 2P2S (2 Parallel / 2 16550A Serial Port Adapter)
+ 9865 PCI 9865 Multi-I/O Controller
+ 9901 PCIe 9901 Multi-I/O Controller
+ 9904 4-Port PCIe Serial Adapter
+ 9922 PCIe 9922 Multi-I/O Controller
+ 9990 MCS9990 PCIe to 4â€Port USB 2.0 Host Controller
+9902 Stargen Inc.
+ 0001 SG2010 PCI over Starfabric Bridge
+ 0002 SG2010 PCI to Starfabric Gateway
+ 0003 SG1010 Starfabric Switch and PCI Bridge
+a0a0 AOPEN Inc.
+a0f1 UNISYS Corporation
+a200 NEC Corporation
+a259 Hewlett Packard
+a25b Hewlett Packard GmbH PL24-MKT
+a304 Sony
+a727 3Com Corporation
+ 0013 3CRPAG175 Wireless PC Card
+ 6803 3CRDAG675B Wireless 11a/b/g Adapter
+aa42 Scitex Digital Video
+aa55 Ncomputing X300 PCI-Engine
+aaaa Adnaco Technology Inc.
+ 0001 H1 PCIe over fiber optic host controller
+ 0002 R1BP1 PCIe over fiber optic expansion chassis
+abcd Vadatech Inc.
+ac1e Digital Receiver Technology Inc
+ac3d Actuality Systems
+ad00 Alta Data Technologies LLC
+aecb Adrienne Electronics Corporation
+ 6250 VITC/LTC Timecode Reader card [PCI-VLTC/RDR]
+affe Sirrix AG security technologies
+ 01e1 PCI1E1 1-port ISDN E1 interface
+ 02e1 PCI2E1 2-port ISDN E1 interface
+ 450e PCI4S0EC 4-port ISDN S0 interface
+ dead Sirrix.PCI4S0 4-port ISDN S0 interface
+b100 OpenVox Communication Co. Ltd.
+# Not registered officially
+b10b Uakron PCI Project
+b1b3 Shiva Europe Limited
+b1d9 ATCOM Technology co., LTD.
+# Pinnacle should be 11bd, but they got it wrong several times --mj
+bd11 Pinnacle Systems, Inc. (Wrong ID)
+bdbd Blackmagic Design
+c001 TSI Telsys
+c0a9 Micron/Crucial Technology
+c0de Motorola
+c0fe Motion Engineering, Inc.
+ca50 Varian Australia Pty Ltd
+cace CACE Technologies, Inc.
+ 0001 TurboCap Port A
+ 0002 TurboCap Port B
+ 0023 AirPcap N
+cafe Chrysalis-ITS
+ 0003 Luna K3 Hardware Security Module
+cccc Catapult Communications
+ccec Curtiss-Wright Controls Embedded Computing
+cddd Tyzx, Inc.
+ 0101 DeepSea 1 High Speed Stereo Vision Frame Grabber
+ 0200 DeepSea 2 High Speed Stereo Vision Frame Grabber
+ceba KEBA AG
+d161 Digium, Inc.
+ 0120 Wildcard TE120P single-span T1/E1/J1 card
+ 0205 Wildcard TE205P/TE207P dual-span T1/E1/J1 card 5.0V
+ 0210 Wildcard TE210P/TE212P dual-span T1/E1/J1 card 3.3V
+ 0220 Wildcard TE220 dual-span T1/E1/J1 card 3.3V (PCI-Express)
+ 0405 Wildcard TE405P/TE407P quad-span T1/E1/J1 card 5.0V
+ 0410 Wildcard TE410P/TE412P quad-span T1/E1/J1 card 3.3V
+ 0420 Wildcard TE420P quad-span T1/E1/J1 card 3.3V (PCI-Express)
+ 0800 Wildcard TDM800P 8-port analog card
+ 1205 Wildcard TE205P/TE207P dual-span T1/E1/J1 card 5.0V (u1)
+ 1220 Wildcard TE220 dual-span T1/E1/J1 card 3.3V (PCI-Express) (5th gen)
+ 1405 Wildcard TE405P/TE407P quad-span T1/E1/J1 card 5.0V (u1)
+ 1420 Wildcard TE420 quad-span T1/E1/J1 card 3.3V (PCI-Express) (5th gen)
+ 2400 Wildcard TDM2400P 24-port analog card
+ 3400 Wildcard TC400P transcoder base card
+ 8000 Wildcard TE121 single-span T1/E1/J1 card (PCI-Express)
+ 8001 Wildcard TE122 single-span T1/E1/J1 card
+ 8002 Wildcard AEX800 8-port analog card (PCI-Express)
+ 8003 Wildcard AEX2400 24-port analog card (PCI-Express)
+ 8004 Wildcard TCE400P transcoder base card
+ 8005 Wildcard TDM410 4-port analog card
+ 8006 Wildcard AEX410 4-port analog card (PCI-Express)
+ 8007 Hx8 Series 8-port Base Card
+ 8008 Hx8 Series 8-port Base Card (PCI-Express)
+ b410 Wildcard B410 quad-BRI card
+d4d4 Dy4 Systems Inc
+ 0601 PCI Mezzanine Card
+d531 I+ME ACTIA GmbH
+d84d Exsys
+db10 Diablo Technologies
+dead Indigita Corporation
+deaf Middle Digital Inc.
+ 9050 PC Weasel Virtual VGA
+ 9051 PC Weasel Serial Port
+ 9052 PC Weasel Watchdog Timer
+deda SoftHard Technology Ltd.
+e000 Winbond
+ e000 W89C940
+e159 Tiger Jet Network Inc.
+ 0001 Tiger3XX Modem/ISDN interface
+ 0059 0001 128k ISDN-S/T Adapter
+ 0059 0003 128k ISDN-U Adapter
+ 00a7 0001 TELES.S0/PCI 2.x ISDN Adapter
+ 8086 0003 Digium X100P/X101P analogue PSTN FXO interface
+ b100 0003 OpenVox A400P 4-port analog card
+ b1d9 0003 AX400P 4-port analog card
+ 0002 Tiger100APC ISDN chipset
+e1c5 Elcus
+e4bf EKF Elektronik GmbH
+e55e Essence Technology, Inc.
+ea01 Eagle Technology
+ 000a PCI-773 Temperature Card
+ 0032 PCI-730 & PC104P-30 Card
+ 003e PCI-762 Opto-Isolator Card
+ 0041 PCI-763 Reed Relay Card
+ 0043 PCI-769 Opto-Isolator Reed Relay Combo Card
+ 0046 PCI-766 Analog Output Card
+ 0052 PCI-703 Analog I/O Card
+ 0800 PCI-800 Digital I/O Card
+# The main chip of all these devices is by Xilinx -> It could also be a Xilinx ID.
+ea60 RME
+ 9896 Digi32
+ 9897 Digi32 Pro
+ 9898 Digi32/8
+eabb Aashima Technology B.V.
+eace Endace Measurement Systems, Ltd
+ 3100 DAG 3.10 OC-3/OC-12
+ 3200 DAG 3.2x OC-3/OC-12
+ 320e DAG 3.2E Fast Ethernet
+ 340e DAG 3.4E Fast Ethernet
+ 341e DAG 3.41E Fast Ethernet
+ 3500 DAG 3.5 OC-3/OC-12
+ 351c DAG 3.5ECM Fast Ethernet
+ 360d DAG 3.6D DS3
+ 360e DAG 3.6E Fast Ethernet
+ 368e DAG 3.6E Gig Ethernet
+ 3707 DAG 3.7T T1/E1/J1
+ 370d DAG 3.7D DS3/E3
+ 378e DAG 3.7G Gig Ethernet
+ 3800 DAG 3.8S OC-3/OC-12
+ 4100 DAG 4.10 OC-48
+ 4110 DAG 4.11 OC-48
+ 4220 DAG 4.2 OC-48
+ 422e DAG 4.2GE Gig Ethernet
+ 4230 DAG 4.2S OC-48
+ 423e DAG 4.2GE Gig Ethernet
+ 4300 DAG 4.3S OC-48
+ 430e DAG 4.3GE Gig Ethernet
+ 452e DAG 4.5G2 Gig Ethernet
+ 454e DAG 4.5G4 Gig Ethernet
+ 45b8 DAG 4.5Z8 Gig Ethernet
+ 45be DAG 4.5Z2 Gig Ethernet
+ 520e DAG 5.2X 10G Ethernet
+ 521a DAG 5.2SXA 10G Ethernet/OC-192
+ 5400 DAG 5.4S-12 OC-3/OC-12
+ 5401 DAG 5.4SG-48 Gig Ethernet/OC-3/OC-12/OC-48
+ 540a DAG 5.4GA Gig Ethernet
+ 541a DAG 5.4SA-12 OC-3/OC-12
+ 542a DAG 5.4SGA-48 Gig Ethernet/OC-3/OC-12/OC-48
+ 6000 DAG 6.0SE 10G Ethernet/OC-192
+ 6100 DAG 6.1SE 10G Ethernet/OC-192
+ 6200 DAG 6.2SE 10G Ethernet/OC-192
+ 7100 DAG 7.1S OC-3/OC-12
+ 7400 DAG 7.4S OC-3/OC-12
+ 7401 DAG 7.4S48 OC-48
+ 752e DAG 7.5G2 Gig Ethernet
+ 754e DAG 7.5G4 Gig Ethernet
+ 8100 DAG 8.1X 10G Ethernet
+ 8101 DAG 8.1SX 10G Ethernet/OC-192
+ 8102 DAG 8.1X 10G Ethernet
+ 820e DAG 8.2X 10G Ethernet
+ 820f DAG 8.2X 10G Ethernet (2nd bus)
+ 8400 DAG 8.4I Infiniband x4 SDR
+ 8500 DAG 8.5I Infiniband x4 DDR
+ 920e DAG 9.2X2 10G Ethernet
+ec80 Belkin Corporation
+ ec00 F5D6000
+ecc0 Echo Digital Audio Corporation
+edd8 ARK Logic Inc
+ a091 1000PV [Stingray]
+ a099 2000PV [Stingray]
+ a0a1 2000MT
+ a0a9 2000MI
+# Found on M2N68-AM Motherboard
+f043 ASUSTeK Computer Inc. (Wrong ID)
+f05b Foxconn International, Inc. (Wrong ID)
+f1d0 AJA Video
+ c0fe Xena HS/HD-R
+ c0ff Kona/Xena 2
+ cafe Kona SD
+ cfee Xena LS/SD-22-DA/SD-DA
+ dcaf Kona HD
+ dfee Xena HD-DA
+ efac Xena SD-MM/SD-22-MM
+ facd Xena HD-MM
+f5f5 F5 Networks, Inc.
+# Subsystem ID for PATA controller on nForce motherboard
+f849 ASRock Incorporation (Wrong ID)
+fa57 Interagon AS
+ 0001 PMC [Pattern Matching Chip]
+fab7 Fabric7 Systems, Inc.
+febd Ultraview Corp.
+# Nee Epigram
+feda Broadcom Inc
+ a0fa BCM4210 iLine10 HomePNA 2.0
+ a10e BCM4230 iLine10 HomePNA 2.0
+fede Fedetec Inc.
+ 0003 TABIC PCI v3
+ffee FNK Tech
+fffd XenSource, Inc.
+ 0101 PCI Event Channel Controller
+# Used in some old VMWare products before they got a real ID assigned
+fffe VMWare Inc (temporary ID)
+ 0710 Virtual SVGA
+ffff Illegal Vendor ID
+
+
+# List of known device classes, subclasses and programming interfaces
+
+# Syntax:
+# C class class_name
+# subclass subclass_name <-- single tab
+# prog-if prog-if_name <-- two tabs
+
+C 00 Unclassified device
+ 00 Non-VGA unclassified device
+ 01 VGA compatible unclassified device
+C 01 Mass storage controller
+ 00 SCSI storage controller
+ 01 IDE interface
+ 02 Floppy disk controller
+ 03 IPI bus controller
+ 04 RAID bus controller
+ 05 ATA controller
+ 20 ADMA single stepping
+ 30 ADMA continuous operation
+ 06 SATA controller
+ 00 Vendor specific
+ 01 AHCI 1.0
+ 07 Serial Attached SCSI controller
+ 08 Non-Volatile memory controller
+ 80 Mass storage controller
+C 02 Network controller
+ 00 Ethernet controller
+ 01 Token ring network controller
+ 02 FDDI network controller
+ 03 ATM network controller
+ 04 ISDN controller
+ 05 WorldFip controller
+ 06 PICMG controller
+ 80 Network controller
+C 03 Display controller
+ 00 VGA compatible controller
+ 00 VGA controller
+ 01 8514 controller
+ 01 XGA compatible controller
+ 02 3D controller
+ 80 Display controller
+C 04 Multimedia controller
+ 00 Multimedia video controller
+ 01 Multimedia audio controller
+ 02 Computer telephony device
+ 03 Audio device
+ 80 Multimedia controller
+C 05 Memory controller
+ 00 RAM memory
+ 01 FLASH memory
+ 80 Memory controller
+C 06 Bridge
+ 00 Host bridge
+ 01 ISA bridge
+ 02 EISA bridge
+ 03 MicroChannel bridge
+ 04 PCI bridge
+ 00 Normal decode
+ 01 Subtractive decode
+ 05 PCMCIA bridge
+ 06 NuBus bridge
+ 07 CardBus bridge
+ 08 RACEway bridge
+ 00 Transparent mode
+ 01 Endpoint mode
+ 09 Semi-transparent PCI-to-PCI bridge
+ 40 Primary bus towards host CPU
+ 80 Secondary bus towards host CPU
+ 0a InfiniBand to PCI host bridge
+ 80 Bridge
+C 07 Communication controller
+ 00 Serial controller
+ 00 8250
+ 01 16450
+ 02 16550
+ 03 16650
+ 04 16750
+ 05 16850
+ 06 16950
+ 01 Parallel controller
+ 00 SPP
+ 01 BiDir
+ 02 ECP
+ 03 IEEE1284
+ fe IEEE1284 Target
+ 02 Multiport serial controller
+ 03 Modem
+ 00 Generic
+ 01 Hayes/16450
+ 02 Hayes/16550
+ 03 Hayes/16650
+ 04 Hayes/16750
+ 04 GPIB controller
+ 05 Smard Card controller
+ 80 Communication controller
+C 08 Generic system peripheral
+ 00 PIC
+ 00 8259
+ 01 ISA PIC
+ 02 EISA PIC
+ 10 IO-APIC
+ 20 IO(X)-APIC
+ 01 DMA controller
+ 00 8237
+ 01 ISA DMA
+ 02 EISA DMA
+ 02 Timer
+ 00 8254
+ 01 ISA Timer
+ 02 EISA Timers
+ 03 RTC
+ 00 Generic
+ 01 ISA RTC
+ 04 PCI Hot-plug controller
+ 05 SD Host controller
+ 80 System peripheral
+C 09 Input device controller
+ 00 Keyboard controller
+ 01 Digitizer Pen
+ 02 Mouse controller
+ 03 Scanner controller
+ 04 Gameport controller
+ 00 Generic
+ 10 Extended
+ 80 Input device controller
+C 0a Docking station
+ 00 Generic Docking Station
+ 80 Docking Station
+C 0b Processor
+ 00 386
+ 01 486
+ 02 Pentium
+ 10 Alpha
+ 20 Power PC
+ 30 MIPS
+ 40 Co-processor
+C 0c Serial bus controller
+ 00 FireWire (IEEE 1394)
+ 00 Generic
+ 10 OHCI
+ 01 ACCESS Bus
+ 02 SSA
+ 03 USB Controller
+ 00 UHCI
+ 10 OHCI
+ 20 EHCI
+ 30 XHCI
+ 80 Unspecified
+ fe USB Device
+ 04 Fibre Channel
+ 05 SMBus
+ 06 InfiniBand
+ 07 IPMI SMIC interface
+ 08 SERCOS interface
+ 09 CANBUS
+C 0d Wireless controller
+ 00 IRDA controller
+ 01 Consumer IR controller
+ 10 RF controller
+ 11 Bluetooth
+ 12 Broadband
+ 20 802.1a controller
+ 21 802.1b controller
+ 80 Wireless controller
+C 0e Intelligent controller
+ 00 I2O
+C 0f Satellite communications controller
+ 01 Satellite TV controller
+ 02 Satellite audio communication controller
+ 03 Satellite voice communication controller
+ 04 Satellite data communication controller
+C 10 Encryption controller
+ 00 Network and computing encryption device
+ 10 Entertainment encryption device
+ 80 Encryption controller
+C 11 Signal processing controller
+ 00 DPIO module
+ 01 Performance counters
+ 10 Communication synchronizer
+ 20 Signal processing management
+ 80 Signal processing controller
+C ff Unassigned class
diff --git a/sys/amd64/acpica/acpi_wakeup.c b/sys/amd64/acpica/acpi_wakeup.c
index 29e66c5..43aeec3 100644
--- a/sys/amd64/acpica/acpi_wakeup.c
+++ b/sys/amd64/acpica/acpi_wakeup.c
@@ -226,7 +226,8 @@ acpi_sleep_machdep(struct acpi_softc *sc, int state)
return (ret);
#ifdef SMP
- wakeup_cpus = PCPU_GET(other_cpus);
+ wakeup_cpus = all_cpus;
+ CPU_CLR(PCPU_GET(cpuid), &wakeup_cpus);
#endif
AcpiSetFirmwareWakingVector(WAKECODE_PADDR(sc));
diff --git a/sys/amd64/amd64/genassym.c b/sys/amd64/amd64/genassym.c
index aba790d..1c9abd5 100644
--- a/sys/amd64/amd64/genassym.c
+++ b/sys/amd64/amd64/genassym.c
@@ -201,7 +201,6 @@ ASSYM(UC_EFLAGS, offsetof(ucontext_t, uc_mcontext.mc_rflags));
ASSYM(ENOENT, ENOENT);
ASSYM(EFAULT, EFAULT);
ASSYM(ENAMETOOLONG, ENAMETOOLONG);
-ASSYM(MAXCPU, MAXCPU);
ASSYM(MAXCOMLEN, MAXCOMLEN);
ASSYM(MAXPATHLEN, MAXPATHLEN);
ASSYM(PC_SIZEOF, sizeof(struct pcpu));
diff --git a/sys/amd64/amd64/intr_machdep.c b/sys/amd64/amd64/intr_machdep.c
index 4557177..e64f89d 100644
--- a/sys/amd64/amd64/intr_machdep.c
+++ b/sys/amd64/amd64/intr_machdep.c
@@ -82,6 +82,11 @@ static int round_robin_interrupts = 1;
TUNABLE_INT("round_robin_interrupts", &round_robin_interrupts);
#endif
+u_long intrcnt[INTRCNT_COUNT];
+char intrnames[INTRCNT_COUNT * (MAXCOMLEN + 1)];
+size_t sintrcnt = sizeof(intrcnt);
+size_t sintrnames = sizeof(intrnames);
+
static int intr_assign_cpu(void *arg, u_char cpu);
static void intr_disable_src(void *arg);
static void intr_init(void *__dummy);
diff --git a/sys/amd64/amd64/mp_machdep.c b/sys/amd64/amd64/mp_machdep.c
index dcf70d4..5cce565 100644
--- a/sys/amd64/amd64/mp_machdep.c
+++ b/sys/amd64/amd64/mp_machdep.c
@@ -624,10 +624,10 @@ cpu_mp_announce(void)
void
init_secondary(void)
{
- cpuset_t tcpuset, tallcpus;
struct pcpu *pc;
struct nmi_pcpu *np;
u_int64_t msr, cr0;
+ u_int cpuid;
int cpu, gsel_tss, x;
struct region_descriptor ap_gdt;
@@ -731,8 +731,9 @@ init_secondary(void)
fpuinit();
/* A quick check from sanity claus */
+ cpuid = PCPU_GET(cpuid);
if (PCPU_GET(apic_id) != lapic_id()) {
- printf("SMP: cpuid = %d\n", PCPU_GET(cpuid));
+ printf("SMP: cpuid = %d\n", cpuid);
printf("SMP: actual apic_id = %d\n", lapic_id());
printf("SMP: correct apic_id = %d\n", PCPU_GET(apic_id));
panic("cpuid mismatch! boom!!");
@@ -754,19 +755,13 @@ init_secondary(void)
smp_cpus++;
- CTR1(KTR_SMP, "SMP: AP CPU #%d Launched", PCPU_GET(cpuid));
- printf("SMP: AP CPU #%d Launched!\n", PCPU_GET(cpuid));
- tcpuset = PCPU_GET(cpumask);
+ CTR1(KTR_SMP, "SMP: AP CPU #%d Launched", cpuid);
+ printf("SMP: AP CPU #%d Launched!\n", cpuid);
/* Determine if we are a logical CPU. */
/* XXX Calculation depends on cpu_logical being a power of 2, e.g. 2 */
if (cpu_logical > 1 && PCPU_GET(apic_id) % cpu_logical != 0)
- CPU_OR(&logical_cpus_mask, &tcpuset);
-
- /* Build our map of 'other' CPUs. */
- tallcpus = all_cpus;
- CPU_NAND(&tallcpus, &tcpuset);
- PCPU_SET(other_cpus, tallcpus);
+ CPU_SET(cpuid, &logical_cpus_mask);
if (bootverbose)
lapic_dump("AP");
@@ -913,7 +908,6 @@ assign_cpu_ids(void)
static int
start_all_aps(void)
{
- cpuset_t tallcpus, tcpuset;
vm_offset_t va = boot_address + KERNBASE;
u_int64_t *pt4, *pt3, *pt2;
u_int32_t mpbioswarmvec;
@@ -1004,12 +998,6 @@ start_all_aps(void)
CPU_SET(cpu, &all_cpus); /* record AP in CPU map */
}
- /* build our map of 'other' CPUs */
- tallcpus = all_cpus;
- tcpuset = PCPU_GET(cpumask);
- CPU_NAND(&tallcpus, &tcpuset);
- PCPU_SET(other_cpus, tallcpus);
-
/* restore the warmstart vector */
*(u_int32_t *) WARMBOOT_OFF = mpbioswarmvec;
@@ -1193,9 +1181,7 @@ smp_targeted_tlb_shootdown(cpuset_t mask, u_int vector, vm_offset_t addr1, vm_of
if (othercpus < 1)
return;
} else {
- sched_pin();
- CPU_NAND(&mask, PCPU_PTR(cpumask));
- sched_unpin();
+ CPU_CLR(PCPU_GET(cpuid), &mask);
if (CPU_EMPTY(&mask))
return;
}
@@ -1392,11 +1378,13 @@ ipi_cpu(int cpu, u_int ipi)
void
ipi_all_but_self(u_int ipi)
{
+ cpuset_t other_cpus;
+
+ other_cpus = all_cpus;
+ CPU_CLR(PCPU_GET(cpuid), &other_cpus);
- sched_pin();
if (IPI_IS_BITMAPED(ipi)) {
- ipi_selected(PCPU_GET(other_cpus), ipi);
- sched_unpin();
+ ipi_selected(other_cpus, ipi);
return;
}
@@ -1406,8 +1394,7 @@ ipi_all_but_self(u_int ipi)
* Set the mask of receiving CPUs for this purpose.
*/
if (ipi == IPI_STOP_HARD)
- CPU_OR_ATOMIC(&ipi_nmi_pending, PCPU_PTR(other_cpus));
- sched_unpin();
+ CPU_OR_ATOMIC(&ipi_nmi_pending, &other_cpus);
CTR2(KTR_SMP, "%s: ipi: %x", __func__, ipi);
lapic_ipi_vectored(ipi, APIC_IPI_DEST_OTHERS);
@@ -1416,7 +1403,7 @@ ipi_all_but_self(u_int ipi)
int
ipi_nmi_handler()
{
- cpuset_t cpumask;
+ u_int cpuid;
/*
* As long as there is not a simple way to know about a NMI's
@@ -1424,13 +1411,11 @@ ipi_nmi_handler()
* the global pending bitword an IPI_STOP_HARD has been issued
* and should be handled.
*/
- sched_pin();
- cpumask = PCPU_GET(cpumask);
- sched_unpin();
- if (!CPU_OVERLAP(&ipi_nmi_pending, &cpumask))
+ cpuid = PCPU_GET(cpuid);
+ if (!CPU_ISSET(cpuid, &ipi_nmi_pending))
return (1);
- CPU_NAND_ATOMIC(&ipi_nmi_pending, &cpumask);
+ CPU_CLR_ATOMIC(cpuid, &ipi_nmi_pending);
cpustop_handler();
return (0);
}
@@ -1442,25 +1427,21 @@ ipi_nmi_handler()
void
cpustop_handler(void)
{
- cpuset_t cpumask;
u_int cpu;
- sched_pin();
cpu = PCPU_GET(cpuid);
- cpumask = PCPU_GET(cpumask);
- sched_unpin();
savectx(&stoppcbs[cpu]);
/* Indicate that we are stopped */
- CPU_OR_ATOMIC(&stopped_cpus, &cpumask);
+ CPU_SET_ATOMIC(cpu, &stopped_cpus);
/* Wait for restart */
- while (!CPU_OVERLAP(&started_cpus, &cpumask))
+ while (!CPU_ISSET(cpu, &started_cpus))
ia32_pause();
- CPU_NAND_ATOMIC(&started_cpus, &cpumask);
- CPU_NAND_ATOMIC(&stopped_cpus, &cpumask);
+ CPU_CLR_ATOMIC(cpu, &started_cpus);
+ CPU_CLR_ATOMIC(cpu, &stopped_cpus);
if (cpu == 0 && cpustop_restartfunc != NULL) {
cpustop_restartfunc();
@@ -1475,19 +1456,17 @@ cpustop_handler(void)
void
cpususpend_handler(void)
{
- cpuset_t cpumask;
register_t cr3, rf;
u_int cpu;
cpu = PCPU_GET(cpuid);
- cpumask = PCPU_GET(cpumask);
rf = intr_disable();
cr3 = rcr3();
if (savectx(susppcbs[cpu])) {
wbinvd();
- CPU_OR_ATOMIC(&stopped_cpus, &cpumask);
+ CPU_SET_ATOMIC(cpu, &stopped_cpus);
} else {
pmap_init_pat();
PCPU_SET(switchtime, 0);
@@ -1495,11 +1474,11 @@ cpususpend_handler(void)
}
/* Wait for resume */
- while (!CPU_OVERLAP(&started_cpus, &cpumask))
+ while (!CPU_ISSET(cpu, &started_cpus))
ia32_pause();
- CPU_NAND_ATOMIC(&started_cpus, &cpumask);
- CPU_NAND_ATOMIC(&stopped_cpus, &cpumask);
+ CPU_CLR_ATOMIC(cpu, &started_cpus);
+ CPU_CLR_ATOMIC(cpu, &stopped_cpus);
/* Restore CR3 and enable interrupts */
load_cr3(cr3);
diff --git a/sys/amd64/amd64/pmap.c b/sys/amd64/amd64/pmap.c
index 941e85e..bed795b 100644
--- a/sys/amd64/amd64/pmap.c
+++ b/sys/amd64/amd64/pmap.c
@@ -925,16 +925,18 @@ pmap_update_pde_invalidate(vm_offset_t va, pd_entry_t newpde)
void
pmap_invalidate_page(pmap_t pmap, vm_offset_t va)
{
- cpuset_t cpumask, other_cpus;
+ cpuset_t other_cpus;
+ u_int cpuid;
sched_pin();
if (pmap == kernel_pmap || !CPU_CMP(&pmap->pm_active, &all_cpus)) {
invlpg(va);
smp_invlpg(va);
} else {
- cpumask = PCPU_GET(cpumask);
- other_cpus = PCPU_GET(other_cpus);
- if (CPU_OVERLAP(&pmap->pm_active, &cpumask))
+ cpuid = PCPU_GET(cpuid);
+ other_cpus = all_cpus;
+ CPU_CLR(cpuid, &other_cpus);
+ if (CPU_ISSET(cpuid, &pmap->pm_active))
invlpg(va);
CPU_AND(&other_cpus, &pmap->pm_active);
if (!CPU_EMPTY(&other_cpus))
@@ -946,8 +948,9 @@ pmap_invalidate_page(pmap_t pmap, vm_offset_t va)
void
pmap_invalidate_range(pmap_t pmap, vm_offset_t sva, vm_offset_t eva)
{
- cpuset_t cpumask, other_cpus;
+ cpuset_t other_cpus;
vm_offset_t addr;
+ u_int cpuid;
sched_pin();
if (pmap == kernel_pmap || !CPU_CMP(&pmap->pm_active, &all_cpus)) {
@@ -955,9 +958,10 @@ pmap_invalidate_range(pmap_t pmap, vm_offset_t sva, vm_offset_t eva)
invlpg(addr);
smp_invlpg_range(sva, eva);
} else {
- cpumask = PCPU_GET(cpumask);
- other_cpus = PCPU_GET(other_cpus);
- if (CPU_OVERLAP(&pmap->pm_active, &cpumask))
+ cpuid = PCPU_GET(cpuid);
+ other_cpus = all_cpus;
+ CPU_CLR(cpuid, &other_cpus);
+ if (CPU_ISSET(cpuid, &pmap->pm_active))
for (addr = sva; addr < eva; addr += PAGE_SIZE)
invlpg(addr);
CPU_AND(&other_cpus, &pmap->pm_active);
@@ -970,16 +974,18 @@ pmap_invalidate_range(pmap_t pmap, vm_offset_t sva, vm_offset_t eva)
void
pmap_invalidate_all(pmap_t pmap)
{
- cpuset_t cpumask, other_cpus;
+ cpuset_t other_cpus;
+ u_int cpuid;
sched_pin();
if (pmap == kernel_pmap || !CPU_CMP(&pmap->pm_active, &all_cpus)) {
invltlb();
smp_invltlb();
} else {
- cpumask = PCPU_GET(cpumask);
- other_cpus = PCPU_GET(other_cpus);
- if (CPU_OVERLAP(&pmap->pm_active, &cpumask))
+ cpuid = PCPU_GET(cpuid);
+ other_cpus = all_cpus;
+ CPU_CLR(cpuid, &other_cpus);
+ if (CPU_ISSET(cpuid, &pmap->pm_active))
invltlb();
CPU_AND(&other_cpus, &pmap->pm_active);
if (!CPU_EMPTY(&other_cpus))
@@ -999,11 +1005,11 @@ pmap_invalidate_cache(void)
}
struct pde_action {
- cpuset_t store; /* processor that updates the PDE */
cpuset_t invalidate; /* processors that invalidate their TLB */
vm_offset_t va;
pd_entry_t *pde;
pd_entry_t newpde;
+ u_int store; /* processor that updates the PDE */
};
static void
@@ -1011,12 +1017,8 @@ pmap_update_pde_action(void *arg)
{
struct pde_action *act = arg;
- sched_pin();
- if (!CPU_CMP(&act->store, PCPU_PTR(cpumask))) {
- sched_unpin();
+ if (act->store == PCPU_GET(cpuid))
pde_store(act->pde, act->newpde);
- } else
- sched_unpin();
}
static void
@@ -1024,12 +1026,8 @@ pmap_update_pde_teardown(void *arg)
{
struct pde_action *act = arg;
- sched_pin();
- if (CPU_OVERLAP(&act->invalidate, PCPU_PTR(cpumask))) {
- sched_unpin();
+ if (CPU_ISSET(PCPU_GET(cpuid), &act->invalidate))
pmap_update_pde_invalidate(act->va, act->newpde);
- } else
- sched_unpin();
}
/*
@@ -1044,28 +1042,30 @@ static void
pmap_update_pde(pmap_t pmap, vm_offset_t va, pd_entry_t *pde, pd_entry_t newpde)
{
struct pde_action act;
- cpuset_t active, cpumask, other_cpus;
+ cpuset_t active, other_cpus;
+ u_int cpuid;
sched_pin();
- cpumask = PCPU_GET(cpumask);
- other_cpus = PCPU_GET(other_cpus);
+ cpuid = PCPU_GET(cpuid);
+ other_cpus = all_cpus;
+ CPU_CLR(cpuid, &other_cpus);
if (pmap == kernel_pmap)
active = all_cpus;
else
active = pmap->pm_active;
if (CPU_OVERLAP(&active, &other_cpus)) {
- act.store = cpumask;
+ act.store = cpuid;
act.invalidate = active;
act.va = va;
act.pde = pde;
act.newpde = newpde;
- CPU_OR(&cpumask, &active);
- smp_rendezvous_cpus(cpumask,
+ CPU_SET(cpuid, &active);
+ smp_rendezvous_cpus(active,
smp_no_rendevous_barrier, pmap_update_pde_action,
pmap_update_pde_teardown, &act);
} else {
pde_store(pde, newpde);
- if (CPU_OVERLAP(&active, &cpumask))
+ if (CPU_ISSET(cpuid, &active))
pmap_update_pde_invalidate(va, newpde);
}
sched_unpin();
@@ -2104,7 +2104,7 @@ pmap_collect(pmap_t locked_pmap, struct vpgqueues *vpq)
vm_page_t m, free;
TAILQ_FOREACH(m, &vpq->pl, pageq) {
- if (m->hold_count || m->busy)
+ if ((m->flags & PG_MARKER) != 0 || m->hold_count || m->busy)
continue;
TAILQ_FOREACH_SAFE(pv, &m->md.pv_list, pv_list, next_pv) {
va = pv->pv_va;
@@ -5095,17 +5095,19 @@ void
pmap_activate(struct thread *td)
{
pmap_t pmap, oldpmap;
+ u_int cpuid;
u_int64_t cr3;
critical_enter();
pmap = vmspace_pmap(td->td_proc->p_vmspace);
oldpmap = PCPU_GET(curpmap);
+ cpuid = PCPU_GET(cpuid);
#ifdef SMP
- CPU_NAND_ATOMIC(&oldpmap->pm_active, PCPU_PTR(cpumask));
- CPU_OR_ATOMIC(&pmap->pm_active, PCPU_PTR(cpumask));
+ CPU_CLR_ATOMIC(cpuid, &oldpmap->pm_active);
+ CPU_SET_ATOMIC(cpuid, &pmap->pm_active);
#else
- CPU_NAND(&oldpmap->pm_active, PCPU_PTR(cpumask));
- CPU_OR(&pmap->pm_active, PCPU_PTR(cpumask));
+ CPU_CLR(cpuid, &oldpmap->pm_active);
+ CPU_SET(cpuid, &pmap->pm_active);
#endif
cr3 = DMAP_TO_PHYS((vm_offset_t)pmap->pm_pml4);
td->td_pcb->pcb_cr3 = cr3;
diff --git a/sys/amd64/amd64/support.S b/sys/amd64/amd64/support.S
index d3522ec..fed852c 100644
--- a/sys/amd64/amd64/support.S
+++ b/sys/amd64/amd64/support.S
@@ -38,18 +38,6 @@
#include "assym.s"
- .data
- ALIGN_DATA
- .globl intrcnt, eintrcnt
-intrcnt:
- .space INTRCNT_COUNT * 8
-eintrcnt:
-
- .globl intrnames, eintrnames
-intrnames:
- .space INTRCNT_COUNT * (MAXCOMLEN + 1)
-eintrnames:
-
.text
/*
diff --git a/sys/amd64/amd64/vm_machdep.c b/sys/amd64/amd64/vm_machdep.c
index 2a9dd7a..db0d51b 100644
--- a/sys/amd64/amd64/vm_machdep.c
+++ b/sys/amd64/amd64/vm_machdep.c
@@ -59,7 +59,6 @@ __FBSDID("$FreeBSD$");
#include <sys/mutex.h>
#include <sys/pioctl.h>
#include <sys/proc.h>
-#include <sys/sched.h>
#include <sys/sf_buf.h>
#include <sys/smp.h>
#include <sys/sysctl.h>
@@ -537,8 +536,8 @@ cpu_reset()
u_int cnt;
if (smp_active) {
- sched_pin();
- map = PCPU_GET(other_cpus);
+ map = all_cpus;
+ CPU_CLR(PCPU_GET(cpuid), &map);
CPU_NAND(&map, &stopped_cpus);
if (!CPU_EMPTY(&map)) {
printf("cpu_reset: Stopping other CPUs\n");
@@ -547,7 +546,6 @@ cpu_reset()
if (PCPU_GET(cpuid) != 0) {
cpu_reset_proxyid = PCPU_GET(cpuid);
- sched_unpin();
cpustop_restartfunc = cpu_reset_proxy;
cpu_reset_proxy_active = 0;
printf("cpu_reset: Restarting BSP\n");
@@ -569,8 +567,7 @@ cpu_reset()
while (1)
ia32_pause();
/* NOTREACHED */
- } else
- sched_unpin();
+ }
DELAY(1000000);
}
diff --git a/sys/amd64/include/cpufunc.h b/sys/amd64/include/cpufunc.h
index 9b61d37..c07e09b 100644
--- a/sys/amd64/include/cpufunc.h
+++ b/sys/amd64/include/cpufunc.h
@@ -467,16 +467,18 @@ load_es(u_short sel)
}
static __inline void
-cpu_monitor(const void *addr, int extensions, int hints)
+cpu_monitor(const void *addr, u_long extensions, u_int hints)
{
- __asm __volatile("monitor;"
- : :"a" (addr), "c" (extensions), "d"(hints));
+
+ __asm __volatile("monitor"
+ : : "a" (addr), "c" (extensions), "d" (hints));
}
static __inline void
-cpu_mwait(int extensions, int hints)
+cpu_mwait(u_long extensions, u_int hints)
{
- __asm __volatile("mwait;" : :"a" (hints), "c" (extensions));
+
+ __asm __volatile("mwait" : : "a" (hints), "c" (extensions));
}
#ifdef _KERNEL
diff --git a/sys/arm/arm/irq_dispatch.S b/sys/arm/arm/irq_dispatch.S
index 8624717..e357756 100644
--- a/sys/arm/arm/irq_dispatch.S
+++ b/sys/arm/arm/irq_dispatch.S
@@ -102,14 +102,16 @@ ASENTRY_NP(irq_entry)
.align 0
- .global _C_LABEL(intrnames), _C_LABEL(eintrnames)
- .global _C_LABEL(intrcnt), _C_LABEL(eintrcnt)
+ .global _C_LABEL(intrnames), _C_LABEL(sintrnames)
+ .global _C_LABEL(intrcnt), _C_LABEL(sintrcnt)
_C_LABEL(intrnames):
.space NIRQ * (MAXCOMLEN + 1)
-_C_LABEL(eintrnames):
_C_LABEL(intrcnt):
.space NIRQ * 4
-_C_LABEL(eintrcnt):
+_C_LABEL(sintrnames):
+ .word NIRQ * (MAXCOMLEN + 1)
+_C_LABEL(sintrcnt):
+ .word NIRQ * 4
.global _C_LABEL(current_intr_depth)
_C_LABEL(current_intr_depth):
diff --git a/sys/arm/arm/pmap.c b/sys/arm/arm/pmap.c
index f684402..d24a422 100644
--- a/sys/arm/arm/pmap.c
+++ b/sys/arm/arm/pmap.c
@@ -3242,9 +3242,12 @@ pmap_protect(pmap_t pm, vm_offset_t sva, vm_offset_t eva, vm_prot_t prot)
PTE_SYNC(ptep);
if (pg != NULL) {
- f = pmap_modify_pv(pg, pm, sva,
- PVF_WRITE, 0);
- vm_page_dirty(pg);
+ if (!(pg->flags & PG_UNMANAGED)) {
+ f = pmap_modify_pv(pg, pm, sva,
+ PVF_WRITE, 0);
+ vm_page_dirty(pg);
+ } else
+ f = 0;
} else
f = PVF_REF | PVF_EXEC;
diff --git a/sys/arm/mv/gpio.c b/sys/arm/mv/gpio.c
index 93c1577..ffcab14 100644
--- a/sys/arm/mv/gpio.c
+++ b/sys/arm/mv/gpio.c
@@ -197,10 +197,7 @@ mv_gpio_attach(device_t dev)
}
}
- /*
- * GPIO lines setup is already done at this stage (see mv_machdep.c).
- */
- return (0);
+ return (platform_gpio_init());
}
static int
@@ -565,20 +562,6 @@ mv_handle_gpios_prop(phandle_t ctrl, pcell_t *gpios, int len)
if (fdt_regsize(ctrl, &gpio_ctrl, &size))
return (ENXIO);
- /*
- * Since to set up GPIO we use the same functions as GPIO driver, and
- * mv_gpio_softc is NULL at this early stage, we need to create a fake
- * softc and set mv_gpio_softc pointer to that newly created object.
- * After successful GPIO setup, the [shared] pointer will be set back
- * to NULL.
- */
- mv_gpio_softc = &sc;
-
- sc.bst = fdtbus_bs_tag;
- gpio_ctrl += fdt_immr_va;
-
- if (bus_space_map(sc.bst, gpio_ctrl, size, 0, &sc.bsh) != 0)
- return (ENXIO);
if (OF_getprop(ctrl, "pin-count", &pincnt, sizeof(pcell_t)) < 0)
return (ENXIO);
@@ -612,8 +595,6 @@ mv_handle_gpios_prop(phandle_t ctrl, pcell_t *gpios, int len)
gpios += gpio_cells + inc;
}
- /* Reset pointer. */
- mv_gpio_softc = NULL;
return (0);
}
diff --git a/sys/arm/mv/mv_machdep.c b/sys/arm/mv/mv_machdep.c
index 771f16c..fdcef9c 100644
--- a/sys/arm/mv/mv_machdep.c
+++ b/sys/arm/mv/mv_machdep.c
@@ -340,6 +340,7 @@ initarm(void *mdp, void *unused __unused)
#endif
}
+ preload_addr_relocate = KERNVIRTADDR - KERNPHYSADDR;
} else {
/* Fall back to hardcoded metadata. */
lastaddr = fake_preload_metadata();
@@ -511,13 +512,8 @@ initarm(void *mdp, void *unused __unused)
if (platform_mpp_init() != 0)
while (1);
- /*
- * Initialize GPIO as early as possible.
- */
- if (platform_gpio_init() != 0)
- while (1);
-
cninit();
+
physmem = memsize / PAGE_SIZE;
debugf("initarm: console initialized\n");
diff --git a/sys/arm/sa11x0/sa11x0_irq.S b/sys/arm/sa11x0/sa11x0_irq.S
index 30f250c..3cc3d14 100644
--- a/sys/arm/sa11x0/sa11x0_irq.S
+++ b/sys/arm/sa11x0/sa11x0_irq.S
@@ -118,16 +118,11 @@ ENTRY(sa11x0_activateirqs)
mov r1, #0xffffffff
str r1, [r0, #(SAIPIC_MR)]
mov pc, lr
-#ifdef IRQSTATS
-Lintrcnt:
- .word _C_LABEL(intrcnt)
-#endif
- .global _C_LABEL(intrnames), _C_LABEL(eintrnames)
- .global _C_LABEL(eintrcnt)
+ .global _C_LABEL(intrnames), _C_LABEL(sintrnames)
_C_LABEL(intrnames):
-_C_LABEL(eintrnames):
-_C_LABEL(eintrcnt):
+_C_LABEL(sintrnames):
+ .word 0
.globl _C_LABEL(intrcnt), _C_LABEL(sintrcnt)
@@ -135,4 +130,4 @@ _C_LABEL(intrcnt):
.space ICU_LEN*4 /* XXX Should be linked to number of interrupts */
_C_LABEL(sintrcnt):
- .space 32*4
+ .word ICU_LEN*4
diff --git a/sys/boot/common/disk.c b/sys/boot/common/disk.c
index 40dbc8a..e1de382 100644
--- a/sys/boot/common/disk.c
+++ b/sys/boot/common/disk.c
@@ -93,6 +93,8 @@ static uuid_t ms_basic_data = GPT_ENT_TYPE_MS_BASIC_DATA;
#endif
+#if defined(LOADER_GPT_SUPPORT) || defined(LOADER_MBR_SUPPORT)
+
/* Given a size in 512 byte sectors, convert it to a human-readable number. */
static char *
display_size(uint64_t size)
@@ -116,6 +118,10 @@ display_size(uint64_t size)
return (buf);
}
+#endif
+
+#ifdef LOADER_MBR_SUPPORT
+
static void
disk_checkextended(struct disk_devdesc *dev,
struct dos_partition *slicetab, int slicenum, int *nslicesp)
@@ -469,7 +475,7 @@ disk_printslice(struct disk_devdesc *dev, int slice,
pager_output(line);
}
-int
+static int
disk_printmbr(struct disk_devdesc *dev, char *prefix, int verbose)
{
struct dos_partition *slicetab;
@@ -488,6 +494,8 @@ disk_printmbr(struct disk_devdesc *dev, char *prefix, int verbose)
return (0);
}
+#endif
+
#ifdef LOADER_GPT_SUPPORT
static int
@@ -630,7 +638,7 @@ disk_bestgpt(struct gpt_part *gpt, int ngpt)
return (prefpart);
}
-int
+static int
disk_opengpt(struct disk_devdesc *dev)
{
struct gpt_part *gpt = NULL, *gp;
@@ -759,6 +767,7 @@ disk_open(struct disk_devdesc *dev)
{
int rc;
+ rc = 0;
/*
* While we are reading disk metadata, make sure we do it relative
* to the start of the disk
@@ -769,7 +778,9 @@ disk_open(struct disk_devdesc *dev)
rc = disk_opengpt(dev);
if (rc)
#endif
+#ifdef LOADER_MBR_SUPPORT
rc = disk_openmbr(dev);
+#endif
return (rc);
}
@@ -777,12 +788,12 @@ disk_open(struct disk_devdesc *dev)
void
disk_print(struct disk_devdesc *dev, char *prefix, int verbose)
{
- int rc;
#ifdef LOADER_GPT_SUPPORT
- rc = disk_printgpt(dev, prefix, verbose);
- if (rc == 0)
+ if (disk_printgpt(dev, prefix, verbose) == 0)
return;
#endif
+#ifdef LOADER_MBR_SUPPORT
disk_printmbr(dev, prefix, verbose);
+#endif
}
diff --git a/sys/boot/common/ufsread.c b/sys/boot/common/ufsread.c
index 2724d7c..b767732 100644
--- a/sys/boot/common/ufsread.c
+++ b/sys/boot/common/ufsread.c
@@ -49,6 +49,7 @@ __FBSDID("$FreeBSD$");
#include <ufs/ufs/dinode.h>
#include <ufs/ufs/dir.h>
#include <ufs/ffs/fs.h>
+
#ifdef UFS_SMALL_CGBASE
/* XXX: Revert to old (broken for over 1.5Tb filesystems) version of cgbase
(see sys/ufs/ffs/fs.h rev 1.39) so that small boot loaders (e.g. boot2) can
@@ -90,7 +91,7 @@ static ssize_t fsread(ino_t, void *, size_t);
static uint8_t ls, dsk_meta;
static uint32_t fs_off;
-static __inline int
+static __inline uint8_t
fsfind(const char *name, ino_t * ino)
{
char buf[DEV_BSIZE];
@@ -158,7 +159,7 @@ static int sblock_try[] = SBLOCKSEARCH;
#elif defined(UFS1_ONLY)
#define DIP(field) dp1.field
#else
-#define DIP(field) fs->fs_magic == FS_UFS1_MAGIC ? dp1.field : dp2.field
+#define DIP(field) fs.fs_magic == FS_UFS1_MAGIC ? dp1.field : dp2.field
#endif
static ssize_t
@@ -173,7 +174,7 @@ fsread(ino_t inode, void *buf, size_t nbyte)
static ino_t inomap;
char *blkbuf;
void *indbuf;
- struct fs *fs;
+ struct fs fs;
char *s;
size_t n, nb, size, off, vboff;
ufs_lbn_t lbn;
@@ -181,30 +182,29 @@ fsread(ino_t inode, void *buf, size_t nbyte)
static ufs2_daddr_t blkmap, indmap;
u_int u;
-
blkbuf = dmadat->blkbuf;
indbuf = dmadat->indbuf;
- fs = (struct fs *)dmadat->sbbuf;
if (!dsk_meta) {
inomap = 0;
for (n = 0; sblock_try[n] != -1; n++) {
- if (dskread(fs, sblock_try[n] / DEV_BSIZE,
+ if (dskread(dmadat->sbbuf, sblock_try[n] / DEV_BSIZE,
SBLOCKSIZE / DEV_BSIZE))
return -1;
+ memcpy(&fs, dmadat->sbbuf, sizeof(struct fs));
if ((
#if defined(UFS1_ONLY)
- fs->fs_magic == FS_UFS1_MAGIC
+ fs.fs_magic == FS_UFS1_MAGIC
#elif defined(UFS2_ONLY)
- (fs->fs_magic == FS_UFS2_MAGIC &&
- fs->fs_sblockloc == sblock_try[n])
+ (fs.fs_magic == FS_UFS2_MAGIC &&
+ fs.fs_sblockloc == sblock_try[n])
#else
- fs->fs_magic == FS_UFS1_MAGIC ||
- (fs->fs_magic == FS_UFS2_MAGIC &&
- fs->fs_sblockloc == sblock_try[n])
+ fs.fs_magic == FS_UFS1_MAGIC ||
+ (fs.fs_magic == FS_UFS2_MAGIC &&
+ fs.fs_sblockloc == sblock_try[n])
#endif
) &&
- fs->fs_bsize <= MAXBSIZE &&
- fs->fs_bsize >= sizeof(struct fs))
+ fs.fs_bsize <= MAXBSIZE &&
+ fs.fs_bsize >= sizeof(struct fs))
break;
}
if (sblock_try[n] == -1) {
@@ -212,12 +212,13 @@ fsread(ino_t inode, void *buf, size_t nbyte)
return -1;
}
dsk_meta++;
- }
+ } else
+ memcpy(&fs, dmadat->sbbuf, sizeof(struct fs));
if (!inode)
return 0;
if (inomap != inode) {
- n = IPERVBLK(fs);
- if (dskread(blkbuf, INO_TO_VBA(fs, n, inode), DBPERVBLK))
+ n = IPERVBLK(&fs);
+ if (dskread(blkbuf, INO_TO_VBA(&fs, n, inode), DBPERVBLK))
return -1;
n = INO_TO_VBO(n, inode);
#if defined(UFS1_ONLY)
@@ -227,13 +228,12 @@ fsread(ino_t inode, void *buf, size_t nbyte)
memcpy(&dp2, (struct ufs2_dinode *)blkbuf + n,
sizeof(struct ufs2_dinode));
#else
- if (fs->fs_magic == FS_UFS1_MAGIC)
+ if (fs.fs_magic == FS_UFS1_MAGIC)
memcpy(&dp1, (struct ufs1_dinode *)blkbuf + n,
sizeof(struct ufs1_dinode));
else
memcpy(&dp2, (struct ufs2_dinode *)blkbuf + n,
sizeof(struct ufs2_dinode));
-
#endif
inomap = inode;
fs_off = 0;
@@ -246,15 +246,15 @@ fsread(ino_t inode, void *buf, size_t nbyte)
nbyte = n;
nb = nbyte;
while (nb) {
- lbn = lblkno(fs, fs_off);
- off = blkoff(fs, fs_off);
+ lbn = lblkno(&fs, fs_off);
+ off = blkoff(&fs, fs_off);
if (lbn < NDADDR) {
addr = DIP(di_db[lbn]);
- } else if (lbn < NDADDR + NINDIR(fs)) {
- n = INDIRPERVBLK(fs);
+ } else if (lbn < NDADDR + NINDIR(&fs)) {
+ n = INDIRPERVBLK(&fs);
addr = DIP(di_ib[0]);
u = (u_int)(lbn - NDADDR) / n * DBPERVBLK;
- vbaddr = fsbtodb(fs, addr) + u;
+ vbaddr = fsbtodb(&fs, addr) + u;
if (indmap != vbaddr) {
if (dskread(indbuf, vbaddr, DBPERVBLK))
return -1;
@@ -262,21 +262,25 @@ fsread(ino_t inode, void *buf, size_t nbyte)
}
n = (lbn - NDADDR) & (n - 1);
#if defined(UFS1_ONLY)
- addr = ((ufs1_daddr_t *)indbuf)[n];
+ memcpy(&addr, (ufs1_daddr_t *)indbuf + n,
+ sizeof(ufs1_daddr_t));
#elif defined(UFS2_ONLY)
- addr = ((ufs2_daddr_t *)indbuf)[n];
+ memcpy(&addr, (ufs2_daddr_t *)indbuf + n,
+ sizeof(ufs2_daddr_t));
#else
- if (fs->fs_magic == FS_UFS1_MAGIC)
- addr = ((ufs1_daddr_t *)indbuf)[n];
+ if (fs.fs_magic == FS_UFS1_MAGIC)
+ memcpy(&addr, (ufs1_daddr_t *)indbuf + n,
+ sizeof(ufs1_daddr_t));
else
- addr = ((ufs2_daddr_t *)indbuf)[n];
+ memcpy(&addr, (ufs2_daddr_t *)indbuf + n,
+ sizeof(ufs2_daddr_t));
#endif
} else {
return -1;
}
- vbaddr = fsbtodb(fs, addr) + (off >> VBLKSHIFT) * DBPERVBLK;
+ vbaddr = fsbtodb(&fs, addr) + (off >> VBLKSHIFT) * DBPERVBLK;
vboff = off & VBLKMASK;
- n = sblksize(fs, size, lbn) - (off & ~VBLKMASK);
+ n = sblksize(&fs, size, lbn) - (off & ~VBLKMASK);
if (n > VBLKSIZE)
n = VBLKSIZE;
if (blkmap != vbaddr) {
diff --git a/sys/boot/i386/Makefile.inc b/sys/boot/i386/Makefile.inc
index f165042..0cad7d2 100644
--- a/sys/boot/i386/Makefile.inc
+++ b/sys/boot/i386/Makefile.inc
@@ -11,6 +11,7 @@ LDFLAGS+= -nostdlib
.if ${MACHINE_CPUARCH} == "amd64"
CFLAGS+= -m32 -march=i386
+ACFLAGS+= -m32
LDFLAGS+= -m elf_i386_fbsd
AFLAGS+= --32
.endif
diff --git a/sys/boot/i386/boot2/Makefile b/sys/boot/i386/boot2/Makefile
index 9568c1c1..e2fc534 100644
--- a/sys/boot/i386/boot2/Makefile
+++ b/sys/boot/i386/boot2/Makefile
@@ -89,6 +89,9 @@ boot2.out: ${BTXCRT} boot2.o sio.o
${LD} ${LDFLAGS} -Ttext ${ORG2} -o ${.TARGET} ${.ALLSRC}
boot2.o: boot2.s
+.if ${CC:T:Mclang} == "clang"
+ ${CC} ${ACFLAGS} -c boot2.s
+.endif
SRCS= boot2.c boot2.h
diff --git a/sys/boot/i386/zfsboot/Makefile b/sys/boot/i386/zfsboot/Makefile
index 65df86f..8caff27 100644
--- a/sys/boot/i386/zfsboot/Makefile
+++ b/sys/boot/i386/zfsboot/Makefile
@@ -86,6 +86,9 @@ zfsboot.out: ${BTXCRT} zfsboot.o sio.o drv.o cons.o util.o
${LD} ${LDFLAGS} -Ttext ${ORG2} -o ${.TARGET} ${.ALLSRC} ${LIBSTAND}
zfsboot.o: zfsboot.s
+.if ${CC:T:Mclang} == "clang"
+ ${CC} ${ACFLAGS} -c zfsboot.s
+.endif
SRCS= zfsboot.c
diff --git a/sys/boot/powerpc/ps3/Makefile b/sys/boot/powerpc/ps3/Makefile
index b05470b..0f0b782 100644
--- a/sys/boot/powerpc/ps3/Makefile
+++ b/sys/boot/powerpc/ps3/Makefile
@@ -10,13 +10,13 @@ INSTALLFLAGS= -b
# Architecture-specific loader code
SRCS= start.S conf.c metadata.c vers.c main.c devicename.c ppc64_elf_freebsd.c
-SRCS+= lv1call.S ps3cons.c font.h ps3mmu.c ps3net.c
+SRCS+= lv1call.S ps3cons.c font.h ps3mmu.c ps3net.c ps3repo.c ps3stor.c ps3disk.c
SRCS+= ucmpdi2.c
LOADER_DISK_SUPPORT?= yes
LOADER_UFS_SUPPORT?= yes
LOADER_CD9660_SUPPORT?= yes
-LOADER_EXT2FS_SUPPORT?= no
+LOADER_EXT2FS_SUPPORT?= yes
LOADER_NET_SUPPORT?= yes
LOADER_NFS_SUPPORT?= yes
LOADER_TFTP_SUPPORT?= no
diff --git a/sys/boot/powerpc/ps3/conf.c b/sys/boot/powerpc/ps3/conf.c
index 7749a15..200fc7f 100644
--- a/sys/boot/powerpc/ps3/conf.c
+++ b/sys/boot/powerpc/ps3/conf.c
@@ -1,5 +1,5 @@
/*-
- * Copyright (c) 1999 Michael Smith <msmith@freebsd.org>
+ * Copyright (C) 1999 Michael Smith <msmith@freebsd.org>
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
@@ -34,6 +34,8 @@ __FBSDID("$FreeBSD$");
#include "dev_net.h"
#endif
+extern struct devsw ps3disk;
+
/*
* We could use linker sets for some or all of these, but
* then we would have to control what ended up linked into
@@ -46,10 +48,8 @@ __FBSDID("$FreeBSD$");
/* Exported for libstand */
struct devsw *devsw[] = {
#if defined(LOADER_DISK_SUPPORT) || defined(LOADER_CD9660_SUPPORT)
-#ifdef NOTYET
&ps3disk,
#endif
-#endif
#if defined(LOADER_NET_SUPPORT)
&netdev,
#endif
diff --git a/sys/boot/powerpc/ps3/devicename.c b/sys/boot/powerpc/ps3/devicename.c
index b652d9b..c46bc89 100644
--- a/sys/boot/powerpc/ps3/devicename.c
+++ b/sys/boot/powerpc/ps3/devicename.c
@@ -33,8 +33,10 @@ __FBSDID("$FreeBSD$");
#include <string.h>
#include "bootstrap.h"
+#include "ps3.h"
+#include "ps3devdesc.h"
-static int ps3_parsedev(struct devdesc **dev, const char *devspec,
+static int ps3_parsedev(struct ps3_devdesc **dev, const char *devspec,
const char **path);
/*
@@ -45,7 +47,7 @@ static int ps3_parsedev(struct devdesc **dev, const char *devspec,
int
ps3_getdev(void **vdev, const char *devspec, const char **path)
{
- struct devdesc **dev = (struct devdesc **)vdev;
+ struct ps3_devdesc **dev = (struct ps3_devdesc **)vdev;
int rv = 0;
/*
@@ -82,9 +84,9 @@ ps3_getdev(void **vdev, const char *devspec, const char **path)
*
*/
static int
-ps3_parsedev(struct devdesc **dev, const char *devspec, const char **path)
+ps3_parsedev(struct ps3_devdesc **dev, const char *devspec, const char **path)
{
- struct devdesc *idev;
+ struct ps3_devdesc *idev;
struct devsw *dv;
char *cp;
const char *np;
@@ -104,7 +106,7 @@ ps3_parsedev(struct devdesc **dev, const char *devspec, const char **path)
}
if (dv == NULL)
return(ENOENT);
- idev = malloc(sizeof(struct devdesc));
+ idev = malloc(sizeof(struct ps3_devdesc));
err = 0;
np = (devspec + strlen(dv->dv_name));
@@ -112,7 +114,6 @@ ps3_parsedev(struct devdesc **dev, const char *devspec, const char **path)
case DEVT_NONE:
break;
-#ifdef NOTYET
case DEVT_DISK:
unit = -1;
pnum = -1;
@@ -154,7 +155,6 @@ ps3_parsedev(struct devdesc **dev, const char *devspec, const char **path)
if (path != NULL)
*path = (*cp == 0) ? cp : cp + 1;
break;
-#endif
case DEVT_NET:
/*
@@ -188,7 +188,7 @@ fail:
char *
ps3_fmtdev(void *vdev)
{
- struct devdesc *dev = (struct devdesc *)vdev;
+ struct ps3_devdesc *dev = (struct ps3_devdesc *)vdev;
char *cp;
static char buf[128];
@@ -197,7 +197,6 @@ ps3_fmtdev(void *vdev)
strcpy(buf, "(no device)");
break;
-#ifdef NOTYET
case DEVT_DISK:
cp = buf;
cp += sprintf(cp, "%s%d", dev->d_dev->dv_name, dev->d_unit);
@@ -212,7 +211,6 @@ ps3_fmtdev(void *vdev)
strcat(cp, ":");
break;
-#endif
case DEVT_NET:
sprintf(buf, "%s%d:", dev->d_dev->dv_name, dev->d_unit);
@@ -227,7 +225,7 @@ ps3_fmtdev(void *vdev)
int
ps3_setcurrdev(struct env_var *ev, int flags, const void *value)
{
- struct devdesc *ncurr;
+ struct ps3_devdesc *ncurr;
int rv;
if ((rv = ps3_parsedev(&ncurr, value, NULL)) != 0)
diff --git a/sys/boot/powerpc/ps3/lv1call.S b/sys/boot/powerpc/ps3/lv1call.S
index a5dafdd..1c1e28e 100644
--- a/sys/boot/powerpc/ps3/lv1call.S
+++ b/sys/boot/powerpc/ps3/lv1call.S
@@ -1,5 +1,6 @@
/*-
* Copyright (C) 2010 Nathan Whitehorn
+ * Copyright (C) 2011 glevand (geoffrey.levand@mail.ru)
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
@@ -163,7 +164,7 @@ lv1_gpu_context_allocate:
sldi %r3,%r3,32
clrldi %r4,%r4,32
- ori %r3,%r3,%r4
+ or %r3,%r3,%r4
clrldi %r4,%r5,32
clrldi %r5,%r6,32
@@ -254,3 +255,98 @@ lv1_setup_dma:
mtlr %r0
blr
+.global lv1_get_repository_node_value
+lv1_get_repository_node_value:
+ mflr %r0
+ stw %r0,4(%r1)
+
+ sldi %r3,%r3,32
+ clrldi %r4,%r4,32
+ or %r3,%r3,%r4
+ sldi %r4,%r5,32
+ clrldi %r5,%r6,32
+ or %r4,%r4,%r5
+ sldi %r5,%r7,32
+ clrldi %r6,%r8,32
+ or %r5,%r5,%r6
+ sldi %r6,%r9,32
+ clrldi %r7,%r10,32
+ or %r6,%r6,%r7
+ lwz %r7,8(%r1)
+ lwz %r8,12(%r1)
+ sldi %r7,%r7,32
+ or %r7,%r7,%r8
+
+ li %r11,91
+ hc
+ extsw %r3,%r3
+
+ lwz %r6,16(%r1)
+ std %r4,0(%r6)
+ lwz %r6,20(%r1)
+ std %r5,0(%r6)
+
+ lwz %r0,4(%r1)
+ mtlr %r0
+ blr
+
+.global lv1_storage_read
+lv1_storage_read:
+ mflr %r0
+ stw %r0,4(%r1)
+
+ sldi %r3,%r3,32
+ clrldi %r4,%r4,32
+ or %r3,%r3,%r4
+ sldi %r4,%r5,32
+ clrldi %r5,%r6,32
+ or %r4,%r4,%r5
+ sldi %r5,%r7,32
+ clrldi %r6,%r8,32
+ or %r5,%r5,%r6
+ sldi %r6,%r9,32
+ clrldi %r7,%r10,32
+ or %r6,%r6,%r7
+ lwz %r7,8(%r1)
+ lwz %r8,12(%r1)
+ sldi %r7,%r7,32
+ or %r7,%r7,%r8
+ lwz %r8,16(%r1)
+ lwz %r9,20(%r1)
+ sldi %r8,%r8,32
+ or %r8,%r8,%r9
+
+ li %r11,245
+ hc
+ extsw %r3,%r3
+
+ lwz %r5,24(%r1)
+ std %r4,0(%r5)
+
+ lwz %r0,4(%r1)
+ mtlr %r0
+ blr
+
+.global lv1_storage_check_async_status
+lv1_storage_check_async_status:
+ mflr %r0
+ stw %r0,4(%r1)
+ stw %r7,-4(%r1)
+
+ sldi %r3,%r3,32
+ clrldi %r4,%r4,32
+ or %r3,%r3,%r4
+ sldi %r4,%r5,32
+ clrldi %r5,%r6,32
+ or %r4,%r4,%r5
+
+ li %r11,254
+ hc
+ extsw %r3,%r3
+
+ lwz %r5,-4(%r1)
+ std %r4,0(%r5)
+
+ lwz %r0,4(%r1)
+ mtlr %r0
+ blr
diff --git a/sys/boot/powerpc/ps3/lv1call.h b/sys/boot/powerpc/ps3/lv1call.h
index 26e6e14..da47afb 100644
--- a/sys/boot/powerpc/ps3/lv1call.h
+++ b/sys/boot/powerpc/ps3/lv1call.h
@@ -68,5 +68,13 @@ int lv1_net_start_rx_dma(int bus, int dev, uint32_t addr, int);
int lv1_net_stop_tx_dma(int bus, int dev, int);
int lv1_net_stop_rx_dma(int bus, int dev, int);
+int lv1_get_repository_node_value(uint64_t lpar_id, uint64_t n1, uint64_t n2,
+ uint64_t n3, uint64_t n4, uint64_t *v1, uint64_t *v2);
+
+int lv1_storage_read(uint64_t dev_id, uint64_t region_id,
+ uint64_t start_sector, uint64_t sector_count,
+ uint64_t flags, uint64_t buf, uint64_t *tag);
+int lv1_storage_check_async_status(uint64_t dev_id, uint64_t tag, uint64_t *status);
+
#endif
diff --git a/sys/boot/powerpc/ps3/main.c b/sys/boot/powerpc/ps3/main.c
index 22c51fa..db808ad 100644
--- a/sys/boot/powerpc/ps3/main.c
+++ b/sys/boot/powerpc/ps3/main.c
@@ -1,5 +1,6 @@
/*-
* Copyright (C) 2010 Nathan Whitehorn
+ * Copyright (C) 2011 glevand (geoffrey.levand@mail.ru)
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
@@ -35,6 +36,7 @@ __FBSDID("$FreeBSD$");
#include "bootstrap.h"
#include "lv1call.h"
#include "ps3.h"
+#include "ps3devdesc.h"
struct arch_switch archsw;
extern void *_end;
@@ -58,7 +60,9 @@ main(void)
{
uint64_t maxmem = 0;
void *heapbase;
- int i;
+ int i, err;
+ struct ps3_devdesc currdev;
+ struct open_file f;
lv1_get_physmem(&maxmem);
@@ -78,9 +82,37 @@ main(void)
/*
* March through the device switch probing for things.
*/
- for (i = 0; devsw[i] != NULL; i++)
- if (devsw[i]->dv_init != NULL)
- (devsw[i]->dv_init)();
+ for (i = 0; devsw[i] != NULL; i++) {
+ if (devsw[i]->dv_init != NULL) {
+ err = (devsw[i]->dv_init)();
+ if (err) {
+ printf("\n%s: initialization failed err=%d\n",
+ devsw[i]->dv_name, err);
+ continue;
+ }
+ }
+
+ printf("\nDevice: %s\n", devsw[i]->dv_name);
+
+ currdev.d_dev = devsw[i];
+ currdev.d_type = currdev.d_dev->dv_type;
+
+ if (strcmp(devsw[i]->dv_name, "disk") == 0) {
+ f.f_devdata = &currdev;
+ currdev.d_unit = 3;
+ currdev.d_disk.pnum = 1;
+ currdev.d_disk.ptype = PTYPE_GPT;
+
+ if (devsw[i]->dv_open(&f, &currdev) == 0)
+ break;
+ }
+
+ if (strcmp(devsw[i]->dv_name, "net") == 0)
+ break;
+ }
+
+ if (devsw[i] == NULL)
+ panic("No boot device found!");
/*
* Get timebase at boot.
@@ -98,8 +130,10 @@ main(void)
printf("(%s, %s)\n", bootprog_maker, bootprog_date);
printf("Memory: %lldKB\n", maxmem / 1024);
- env_setenv("currdev", EV_VOLATILE, "net", ps3_setcurrdev, env_nounset);
- env_setenv("loaddev", EV_VOLATILE, "net", env_noset, env_nounset);
+ env_setenv("currdev", EV_VOLATILE, ps3_fmtdev(&currdev),
+ ps3_setcurrdev, env_nounset);
+ env_setenv("loaddev", EV_VOLATILE, ps3_fmtdev(&currdev), env_noset,
+ env_nounset);
setenv("LINES", "24", 1);
setenv("hw.platform", "ps3", 1);
diff --git a/sys/boot/powerpc/ps3/ps3bus.h b/sys/boot/powerpc/ps3/ps3bus.h
new file mode 100644
index 0000000..a3b20f3
--- /dev/null
+++ b/sys/boot/powerpc/ps3/ps3bus.h
@@ -0,0 +1,41 @@
+/*-
+ * Copyright (C) 2011 glevand (geoffrey.levand@mail.ru)
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL TOOLS GMBH BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
+ * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+ * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * $FreeBSD$
+ */
+
+#ifndef _PS3_BUS_H
+#define _PS3_BUS_H
+
+enum {
+ PS3_BUS_TYPE_STOR = 5,
+};
+
+enum {
+ PS3_DEV_TYPE_STOR_DISK = 0,
+ PS3_DEV_TYPE_STOR_CDROM = 5,
+ PS3_DEV_TYPE_STOR_FLASH = 14,
+};
+
+#endif
diff --git a/sys/boot/powerpc/ps3/ps3devdesc.h b/sys/boot/powerpc/ps3/ps3devdesc.h
new file mode 100644
index 0000000..5a6e52f
--- /dev/null
+++ b/sys/boot/powerpc/ps3/ps3devdesc.h
@@ -0,0 +1,53 @@
+/*-
+ * Copyright (C) 2000 Benno Rice.
+ * Copyright (C) 2007 Semihalf, Rafal Jaworowski <raj@semihalf.com>
+ * Copyright (C) 2011 glevand (geoffrey.levand@mail.ru)
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL TOOLS GMBH BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
+ * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+ * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * $FreeBSD$
+ */
+
+#ifndef _PS3_DEV_DESC_H
+#define _PS3_DEV_DESC_H
+
+/* Note: Must match the 'struct devdesc' in bootstrap.h */
+struct ps3_devdesc {
+ struct devsw *d_dev;
+ int d_type;
+ int d_unit;
+
+ union {
+ struct {
+ void *data;
+ int pnum;
+ int ptype;
+ } disk;
+ } d_kind;
+};
+
+#define d_disk d_kind.disk
+
+#define PTYPE_BSDLABEL 1
+#define PTYPE_GPT 2
+
+#endif
diff --git a/sys/boot/powerpc/ps3/ps3disk.c b/sys/boot/powerpc/ps3/ps3disk.c
new file mode 100644
index 0000000..5c5195b
--- /dev/null
+++ b/sys/boot/powerpc/ps3/ps3disk.c
@@ -0,0 +1,313 @@
+/*-
+ * Copyright (C) 2008 Semihalf, Rafal Jaworowski
+ * Copyright (C) 2009 Semihalf, Piotr Ziecik
+ * Copyright (C) 2011 glevand (geoffrey.levand@mail.ru)
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL TOOLS GMBH BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
+ * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+ * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * $FreeBSD$
+ */
+
+#include <sys/endian.h>
+#include <machine/stdarg.h>
+#include <stand.h>
+#include <uuid.h>
+
+#define FSTYPENAMES
+#include <sys/disklabel.h>
+#include <sys/diskmbr.h>
+#include <sys/gpt.h>
+
+#include "bootstrap.h"
+#include "ps3bus.h"
+#include "ps3devdesc.h"
+#include "ps3stor.h"
+
+#define dev_printf(dev, fmt, args...) \
+ printf("%s%d: " fmt "\n" , dev->d_dev->dv_name, dev->d_unit, ##args)
+
+#ifdef DISK_DEBUG
+#define DEBUG(fmt, args...) printf("%s:%d: " fmt "\n" , __func__ , __LINE__, ##args)
+#else
+#define DEBUG(fmt, args...)
+#endif
+
+struct open_dev;
+
+static int ps3disk_open_gpt(struct ps3_devdesc *dev, struct open_dev *od);
+static void ps3disk_uuid_letoh(uuid_t *uuid);
+
+static int ps3disk_init(void);
+static int ps3disk_strategy(void *devdata, int flag, daddr_t dblk,
+ size_t size, char *buf, size_t *rsize);
+static int ps3disk_open(struct open_file *f, ...);
+static int ps3disk_close(struct open_file *f);
+static void ps3disk_print(int verbose);
+
+struct devsw ps3disk = {
+ "disk",
+ DEVT_DISK,
+ ps3disk_init,
+ ps3disk_strategy,
+ ps3disk_open,
+ ps3disk_close,
+ noioctl,
+ ps3disk_print,
+};
+
+struct gpt_part {
+ int gp_index;
+ uuid_t gp_type;
+ uint64_t gp_start;
+ uint64_t gp_end;
+};
+
+struct open_dev {
+ uint64_t od_start;
+
+ union {
+ struct {
+ int nparts;
+ struct gpt_part *parts;
+ } gpt;
+ } od_kind;
+};
+
+#define od_gpt_nparts od_kind.gpt.nparts
+#define od_gpt_parts od_kind.gpt.parts
+
+static struct ps3_stordev stor_dev;
+
+static int ps3disk_init(void)
+{
+ int err;
+
+ err = ps3stor_setup(&stor_dev, PS3_DEV_TYPE_STOR_DISK);
+ if (err)
+ return err;
+
+ return 0;
+}
+
+static int ps3disk_strategy(void *devdata, int flag, daddr_t dblk,
+ size_t size, char *buf, size_t *rsize)
+{
+ struct ps3_devdesc *dev = (struct ps3_devdesc *) devdata;
+ struct open_dev *od = (struct open_dev *) dev->d_disk.data;
+ int err;
+
+ if (flag != F_READ) {
+ dev_printf(dev, "write operation is not supported!\n");
+ return EROFS;
+ }
+
+ if (size % stor_dev.sd_blksize) {
+ dev_printf(dev, "size=%u is not multiple of device block size=%llu\n",
+ size, stor_dev.sd_blksize);
+ return EIO;
+ }
+
+ if (rsize)
+ *rsize = 0;
+
+ err = ps3stor_read_sectors(&stor_dev, dev->d_unit, od->od_start + dblk,
+ size / stor_dev.sd_blksize, 0, buf);
+
+ if (!err && rsize)
+ *rsize = size;
+
+ if (err)
+ dev_printf(dev, "read operation failed dblk=%llu size=%d err=%d\n",
+ dblk, size, err);
+
+ return err;
+}
+
+static int ps3disk_open(struct open_file *f, ...)
+{
+ va_list ap;
+ struct ps3_devdesc *dev;
+ struct open_dev *od;
+ int err;
+
+ va_start(ap, f);
+ dev = va_arg(ap, struct ps3_devdesc *);
+ va_end(ap);
+
+ od = malloc(sizeof(struct open_dev));
+ if (!od) {
+ dev_printf(dev, "couldn't allocate memory for new open_dev\n");
+ return ENOMEM;
+ }
+
+ err = ps3disk_open_gpt(dev, od);
+
+ if (err) {
+ dev_printf(dev, "couldn't open GPT disk error=%d\n", err);
+ free(od);
+ } else {
+ ((struct ps3_devdesc *) (f->f_devdata))->d_disk.data = od;
+ }
+
+ return err;
+}
+
+static int ps3disk_close(struct open_file *f)
+{
+ struct ps3_devdesc *dev = f->f_devdata;
+ struct open_dev *od = dev->d_disk.data;
+
+ if (dev->d_disk.ptype == PTYPE_GPT && od->od_gpt_nparts)
+ free(od->od_gpt_parts);
+
+ free(od);
+
+ dev->d_disk.data = NULL;
+
+ return 0;
+}
+
+static void ps3disk_print(int verbose)
+{
+}
+
+static int ps3disk_open_gpt(struct ps3_devdesc *dev, struct open_dev *od)
+{
+ char buf[512];
+ struct gpt_hdr *hdr;
+ struct gpt_ent *ent;
+ daddr_t slba, elba, lba;
+ int nparts, eps, i, part, err;
+
+ od->od_gpt_nparts = 0;
+ od->od_gpt_parts = NULL;
+
+ err = ps3stor_read_sectors(&stor_dev, dev->d_unit, 0, 1, 0, buf);
+ if (err) {
+ err = EIO;
+ goto out;
+ }
+
+ if (le16toh(*((uint16_t *) (buf + DOSMAGICOFFSET))) != DOSMAGIC) {
+ err = ENXIO;
+ goto out;
+ }
+
+ err = ps3stor_read_sectors(&stor_dev, dev->d_unit, 1, 1, 0, buf);
+ if (err) {
+ err = EIO;
+ goto out;
+ }
+
+ hdr = (struct gpt_hdr *) buf;
+
+ if (bcmp(hdr->hdr_sig, GPT_HDR_SIG, sizeof(hdr->hdr_sig)) ||
+ le64toh(hdr->hdr_lba_self) != 1 || le32toh(hdr->hdr_revision) < 0x00010000 ||
+ le32toh(hdr->hdr_entsz) < sizeof(struct gpt_ent) ||
+ stor_dev.sd_blksize % le32toh(hdr->hdr_entsz) != 0) {
+ err = ENXIO;
+ goto out;
+ }
+
+ nparts = 0;
+ eps = stor_dev.sd_blksize / le32toh(hdr->hdr_entsz);
+ slba = le64toh(hdr->hdr_lba_table);
+ elba = slba + le32toh(hdr->hdr_entries) / eps;
+
+ for (lba = slba; lba < elba; lba++) {
+ err = ps3stor_read_sectors(&stor_dev, dev->d_unit, lba, 1, 0, buf);
+ if (err) {
+ err = EIO;
+ goto out;
+ }
+
+ ent = (struct gpt_ent *) buf;
+
+ for (i = 0; i < eps; i++) {
+ if (uuid_is_nil(&ent[i].ent_type, NULL) ||
+ le64toh(ent[i].ent_lba_start) == 0 ||
+ le64toh(ent[i].ent_lba_end) < le64toh(ent[i].ent_lba_start))
+ continue;
+
+ nparts++;
+ }
+ }
+
+ if (nparts) {
+ od->od_gpt_nparts = nparts;
+
+ od->od_gpt_parts = malloc(nparts * sizeof(struct gpt_part));
+ if (!od->od_gpt_parts) {
+ err = ENOMEM;
+ goto out;
+ }
+
+ for (lba = slba, part = 0; lba < elba; lba++) {
+ err = ps3stor_read_sectors(&stor_dev, dev->d_unit, lba, 1, 0, buf);
+ if (err) {
+ err = EIO;
+ goto out;
+ }
+
+ ent = (struct gpt_ent *) buf;
+
+ for (i = 0; i < eps; i++) {
+ if (uuid_is_nil(&ent[i].ent_type, NULL) ||
+ le64toh(ent[i].ent_lba_start) == 0 ||
+ le64toh(ent[i].ent_lba_end) < le64toh(ent[i].ent_lba_start))
+ continue;
+
+ od->od_gpt_parts[part].gp_index = (lba - slba) * eps + i + 1;
+ od->od_gpt_parts[part].gp_type = ent[i].ent_type;
+ od->od_gpt_parts[part].gp_start = le64toh(ent[i].ent_lba_start);
+ od->od_gpt_parts[part].gp_end = le64toh(ent[i].ent_lba_end);
+ ps3disk_uuid_letoh(&od->od_gpt_parts[part].gp_type);
+ part++;
+ }
+ }
+ }
+
+ dev->d_disk.ptype = PTYPE_GPT;
+
+ if (od->od_gpt_nparts && !dev->d_disk.pnum)
+ dev->d_disk.pnum = od->od_gpt_parts[0].gp_index;
+
+ for (i = 0; i < od->od_gpt_nparts; i++)
+ if (od->od_gpt_parts[i].gp_index == dev->d_disk.pnum)
+ od->od_start = od->od_gpt_parts[i].gp_start;
+
+ err = 0;
+
+out:
+
+ if (err && od->od_gpt_parts)
+ free(od->od_gpt_parts);
+
+ return err;
+}
+
+static void ps3disk_uuid_letoh(uuid_t *uuid)
+{
+ uuid->time_low = le32toh(uuid->time_low);
+ uuid->time_mid = le16toh(uuid->time_mid);
+ uuid->time_hi_and_version = le16toh(uuid->time_hi_and_version);
+}
diff --git a/sys/boot/powerpc/ps3/ps3repo.c b/sys/boot/powerpc/ps3/ps3repo.c
new file mode 100644
index 0000000..0064769
--- /dev/null
+++ b/sys/boot/powerpc/ps3/ps3repo.c
@@ -0,0 +1,249 @@
+/*-
+ * Copyright (C) 2011 glevand (geoffrey.levand@mail.ru)
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL TOOLS GMBH BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
+ * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+ * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * $FreeBSD$
+ */
+
+#include <stand.h>
+
+#include "lv1call.h"
+#include "ps3.h"
+#include "ps3repo.h"
+
+static uint64_t make_n1(const char *text, unsigned int index)
+{
+ uint64_t n1;
+
+ n1 = 0;
+ strncpy((char *) &n1, text, sizeof(n1));
+ n1 = (n1 >> 32) + index;
+
+ return n1;
+}
+
+static uint64_t make_n(const char *text, unsigned int index)
+{
+ uint64_t n;
+
+ n = 0;
+ strncpy((char *) &n, text, sizeof(n));
+ n = n + index;
+
+ return n;
+}
+
+int ps3repo_read_bus_type(unsigned int bus_index, uint64_t *bus_type)
+{
+ uint64_t v1, v2;
+ int err;
+
+ err = lv1_get_repository_node_value(PS3_LPAR_ID_PME, make_n1("bus", bus_index),
+ make_n("type", 0), 0, 0, &v1, &v2);
+
+ *bus_type = v1;
+
+ return err;
+}
+
+int ps3repo_read_bus_id(unsigned int bus_index, uint64_t *bus_id)
+{
+ uint64_t v1, v2;
+ int err;
+
+ err = lv1_get_repository_node_value(PS3_LPAR_ID_PME, make_n1("bus", bus_index),
+ make_n("id", 0), 0, 0, &v1, &v2);
+
+ *bus_id = v1;
+
+ return err;
+}
+
+int ps3repo_read_bus_num_dev(unsigned int bus_index, uint64_t *num_dev)
+{
+ uint64_t v1, v2;
+ int err;
+
+ err = lv1_get_repository_node_value(PS3_LPAR_ID_PME, make_n1("bus", bus_index),
+ make_n("num_dev", 0), 0, 0, &v1, &v2);
+
+ *num_dev = v1;
+
+ return err;
+}
+
+int ps3repo_read_bus_dev_type(unsigned int bus_index, unsigned int dev_index, uint64_t *dev_type)
+{
+ uint64_t v1, v2;
+ int err;
+
+ err = lv1_get_repository_node_value(PS3_LPAR_ID_PME, make_n1("bus", bus_index),
+ make_n("dev", dev_index), make_n("type", 0), 0, &v1, &v2);
+
+ *dev_type = v1;
+
+ return err;
+}
+
+int ps3repo_read_bus_dev_id(unsigned int bus_index, unsigned int dev_index, uint64_t *dev_id)
+{
+ uint64_t v1, v2;
+ int err;
+
+ err = lv1_get_repository_node_value(PS3_LPAR_ID_PME, make_n1("bus", bus_index),
+ make_n("dev", dev_index), make_n("id", 0), 0, &v1, &v2);
+
+ *dev_id = v1;
+
+ return err;
+}
+
+int ps3repo_read_bus_dev_blk_size(unsigned int bus_index, unsigned int dev_index, uint64_t *blk_size)
+{
+ uint64_t v1, v2;
+ int err;
+
+ err = lv1_get_repository_node_value(PS3_LPAR_ID_PME, make_n1("bus", bus_index),
+ make_n("dev", dev_index), make_n("blk_size", 0), 0, &v1, &v2);
+
+ *blk_size = v1;
+
+ return err;
+}
+
+int ps3repo_read_bus_dev_nblocks(unsigned int bus_index, unsigned int dev_index, uint64_t *nblocks)
+{
+ uint64_t v1, v2;
+ int err;
+
+ err = lv1_get_repository_node_value(PS3_LPAR_ID_PME, make_n1("bus", bus_index),
+ make_n("dev", dev_index), make_n("n_blocks", 0), 0, &v1, &v2);
+
+ *nblocks = v1;
+
+ return err;
+}
+
+int ps3repo_read_bus_dev_nregs(unsigned int bus_index, unsigned int dev_index, uint64_t *nregs)
+{
+ uint64_t v1, v2;
+ int err;
+
+ err = lv1_get_repository_node_value(PS3_LPAR_ID_PME, make_n1("bus", bus_index),
+ make_n("dev", dev_index), make_n("n_regs", 0), 0, &v1, &v2);
+
+ *nregs = v1;
+
+ return err;
+}
+
+int ps3repo_read_bus_dev_reg_id(unsigned int bus_index, unsigned int dev_index,
+ unsigned int reg_index, uint64_t *reg_id)
+{
+ uint64_t v1, v2;
+ int err;
+
+ err = lv1_get_repository_node_value(PS3_LPAR_ID_PME, make_n1("bus", bus_index),
+ make_n("dev", dev_index), make_n("region", reg_index), make_n("id", 0), &v1, &v2);
+
+ *reg_id = v1;
+
+ return err;
+}
+
+int ps3repo_read_bus_dev_reg_start(unsigned int bus_index, unsigned int dev_index,
+ unsigned int reg_index, uint64_t *reg_start)
+{
+ uint64_t v1, v2;
+ int err;
+
+ err = lv1_get_repository_node_value(PS3_LPAR_ID_PME, make_n1("bus", bus_index),
+ make_n("dev", dev_index), make_n("region", reg_index), make_n("start", 0), &v1, &v2);
+
+ *reg_start = v1;
+
+ return err;
+}
+
+int ps3repo_read_bus_dev_reg_size(unsigned int bus_index, unsigned int dev_index,
+ unsigned int reg_index, uint64_t *reg_size)
+{
+ uint64_t v1, v2;
+ int err;
+
+ err = lv1_get_repository_node_value(PS3_LPAR_ID_PME, make_n1("bus", bus_index),
+ make_n("dev", dev_index), make_n("region", reg_index), make_n("size", 0), &v1, &v2);
+
+ *reg_size = v1;
+
+ return err;
+}
+
+int ps3repo_find_bus_by_type(uint64_t bus_type, unsigned int *bus_index)
+{
+ unsigned int i;
+ uint64_t type;
+ int err;
+
+ for (i = 0; i < 10; i++) {
+ err = ps3repo_read_bus_type(i, &type);
+ if (err) {
+ *bus_index = (unsigned int) -1;
+ return err;
+ }
+
+ if (type == bus_type) {
+ *bus_index = i;
+ return 0;
+ }
+ }
+
+ *bus_index = (unsigned int) -1;
+
+ return ENODEV;
+}
+
+int ps3repo_find_bus_dev_by_type(unsigned int bus_index, uint64_t dev_type,
+ unsigned int *dev_index)
+{
+ unsigned int i;
+ uint64_t type;
+ int err;
+
+ for (i = 0; i < 10; i++) {
+ err = ps3repo_read_bus_dev_type(bus_index, i, &type);
+ if (err) {
+ *dev_index = (unsigned int) -1;
+ return err;
+ }
+
+ if (type == dev_type) {
+ *dev_index = i;
+ return 0;
+ }
+ }
+
+ *dev_index = (unsigned int) -1;
+
+ return ENODEV;
+}
diff --git a/sys/boot/powerpc/ps3/ps3repo.h b/sys/boot/powerpc/ps3/ps3repo.h
new file mode 100644
index 0000000..68001df
--- /dev/null
+++ b/sys/boot/powerpc/ps3/ps3repo.h
@@ -0,0 +1,51 @@
+/*-
+ * Copyright (C) 2011 glevand (geoffrey.levand@mail.ru)
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL TOOLS GMBH BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
+ * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+ * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * $FreeBSD$
+ */
+
+#ifndef _PS3_REPO_H
+#define _PS3_REPO_H
+
+#define PS3_LPAR_ID_PME 1
+
+int ps3repo_read_bus_type(unsigned int bus_index, uint64_t *bus_type);
+int ps3repo_read_bus_id(unsigned int bus_index, uint64_t *bus_id);
+int ps3repo_read_bus_num_dev(unsigned int bus_index, uint64_t *num_dev);
+int ps3repo_read_bus_dev_type(unsigned int bus_index, unsigned int dev_index, uint64_t *dev_type);
+int ps3repo_read_bus_dev_id(unsigned int bus_index, unsigned int dev_index, uint64_t *dev_id);
+int ps3repo_read_bus_dev_blk_size(unsigned int bus_index, unsigned int dev_index, uint64_t *blk_size);
+int ps3repo_read_bus_dev_nblocks(unsigned int bus_index, unsigned int dev_index, uint64_t *nblocks);
+int ps3repo_read_bus_dev_nregs(unsigned int bus_index, unsigned int dev_index, uint64_t *nregs);
+int ps3repo_read_bus_dev_reg_id(unsigned int bus_index, unsigned int dev_index,
+ unsigned int reg_index, uint64_t *reg_id);
+int ps3repo_read_bus_dev_reg_start(unsigned int bus_index, unsigned int dev_index,
+ unsigned int reg_index, uint64_t *reg_start);
+int ps3repo_read_bus_dev_reg_size(unsigned int bus_index, unsigned int dev_index,
+ unsigned int reg_index, uint64_t *reg_size);
+int ps3repo_find_bus_by_type(uint64_t bus_type, unsigned int *bus_index);
+int ps3repo_find_bus_dev_by_type(unsigned int bus_index, uint64_t dev_type,
+ unsigned int *dev_index);
+
+#endif
diff --git a/sys/boot/powerpc/ps3/ps3stor.c b/sys/boot/powerpc/ps3/ps3stor.c
new file mode 100644
index 0000000..667b39c
--- /dev/null
+++ b/sys/boot/powerpc/ps3/ps3stor.c
@@ -0,0 +1,165 @@
+/*-
+ * Copyright (C) 2011 glevand (geoffrey.levand@mail.ru)
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL TOOLS GMBH BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
+ * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+ * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * $FreeBSD$
+ */
+
+#include <stand.h>
+
+#include "bootstrap.h"
+#include "lv1call.h"
+#include "ps3bus.h"
+#include "ps3repo.h"
+#include "ps3stor.h"
+
+int ps3stor_setup(struct ps3_stordev *sd, int type)
+{
+ unsigned int i;
+ int err;
+
+ sd->sd_type = type;
+
+ err = ps3repo_find_bus_by_type(PS3_BUS_TYPE_STOR, &sd->sd_busidx);
+ if (err)
+ goto out;
+
+ err = ps3repo_read_bus_id(sd->sd_busidx, &sd->sd_busid);
+ if (err)
+ goto out;
+
+ err = ps3repo_find_bus_dev_by_type(sd->sd_busidx, type, &sd->sd_devidx);
+ if (err)
+ goto out;
+
+ err = ps3repo_read_bus_dev_id(sd->sd_busidx, sd->sd_devidx, &sd->sd_devid);
+ if (err)
+ goto out;
+
+ err = ps3repo_read_bus_dev_blk_size(sd->sd_busidx, sd->sd_devidx, &sd->sd_blksize);
+ if (err)
+ goto out;
+
+ err = ps3repo_read_bus_dev_nblocks(sd->sd_busidx, sd->sd_devidx, &sd->sd_nblocks);
+ if (err)
+ goto out;
+
+ err = ps3repo_read_bus_dev_nregs(sd->sd_busidx, sd->sd_devidx, &sd->sd_nregs);
+ if (err)
+ goto out;
+
+ for (i = 0; i < sd->sd_nregs; i++) {
+ err = ps3repo_read_bus_dev_reg_id(sd->sd_busidx, sd->sd_devidx, i,
+ &sd->sd_regs[i].sr_id);
+ if (err)
+ goto out;
+
+ err = ps3repo_read_bus_dev_reg_start(sd->sd_busidx, sd->sd_devidx, i,
+ &sd->sd_regs[i].sr_start);
+ if (err)
+ goto out;
+
+ err = ps3repo_read_bus_dev_reg_size(sd->sd_busidx, sd->sd_devidx, i,
+ &sd->sd_regs[i].sr_size);
+ if (err)
+ goto out;
+ }
+
+ if (!sd->sd_nregs) {
+ err = ENODEV;
+ goto out;
+ }
+
+ err = lv1_open_device(sd->sd_busid, sd->sd_devid, 0);
+ if (err)
+ goto out;
+
+ err = lv1_setup_dma(sd->sd_busid, sd->sd_devid, &sd->sd_dmabase);
+ if (err)
+ goto close_dev;
+
+ return 0;
+
+close_dev:
+
+ lv1_close_device(sd->sd_busid, sd->sd_devid);
+
+out:
+
+ return err;
+}
+
+int ps3stor_read_sectors(struct ps3_stordev *sd, int regidx,
+ uint64_t start_sector, uint64_t sector_count, uint64_t flags, char *buf)
+{
+#define MIN(a, b) ((a) <= (b) ? (a) : (b))
+#define BOUNCE_SECTORS 4
+#define ASYNC_STATUS_POLL_PERIOD 100 /* microseconds */
+
+ struct ps3_storreg *reg = &sd->sd_regs[regidx];
+ char dma_buf[sd->sd_blksize * BOUNCE_SECTORS];
+ uint64_t nleft, nread, nsectors;
+ uint64_t tag, status;
+ unsigned int timeout;
+ int err;
+
+ nleft = sector_count;
+ nread = 0;
+
+ while (nleft) {
+ nsectors = MIN(nleft, BOUNCE_SECTORS);
+
+ err = lv1_storage_read(sd->sd_devid, reg->sr_id, start_sector + nread, nsectors,
+ flags, (uint32_t) dma_buf, &tag);
+ if (err)
+ return err;
+
+ timeout = 5000000; /* microseconds */
+
+ while (1) {
+ if (timeout < ASYNC_STATUS_POLL_PERIOD)
+ return ETIMEDOUT;
+
+ err = lv1_storage_check_async_status(sd->sd_devid, tag, &status);
+ if (!err && !status)
+ break;
+
+ delay(ASYNC_STATUS_POLL_PERIOD);
+ timeout -= ASYNC_STATUS_POLL_PERIOD;
+ }
+
+ memcpy(buf + nread * sd->sd_blksize, (u_char *) dma_buf, nsectors * sd->sd_blksize);
+ nread += nsectors;
+ nleft -= nsectors;
+ }
+
+ return 0;
+
+#undef MIN
+#undef BOUNCE_SECTORS
+#undef ASYNC_STATUS_POLL_PERIOD
+}
+
+void ps3stor_print(struct ps3_stordev *sd)
+{
+}
diff --git a/sys/boot/powerpc/ps3/ps3stor.h b/sys/boot/powerpc/ps3/ps3stor.h
new file mode 100644
index 0000000..350b716
--- /dev/null
+++ b/sys/boot/powerpc/ps3/ps3stor.h
@@ -0,0 +1,59 @@
+/*-
+ * Copyright (C) 2011 glevand (geoffrey.levand@mail.ru)
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL TOOLS GMBH BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
+ * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+ * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * $FreeBSD$
+ */
+
+#ifndef _PS3_STOR_H
+#define _PS3_STOR_H
+
+#define PS3_STOR_DEV_MAXREGS 8
+
+struct ps3_storreg {
+ uint64_t sr_id;
+ uint64_t sr_start;
+ uint64_t sr_size;
+};
+
+struct ps3_stordev {
+ int sd_type;
+ unsigned int sd_busidx;
+ unsigned int sd_devidx;
+ uint64_t sd_busid;
+ uint64_t sd_devid;
+ uint64_t sd_blksize;
+ uint64_t sd_nblocks;
+ uint64_t sd_nregs;
+ struct ps3_storreg sd_regs[PS3_STOR_DEV_MAXREGS];
+ uint64_t sd_dmabase;
+};
+
+int ps3stor_setup(struct ps3_stordev *sd, int type);
+
+int ps3stor_read_sectors(struct ps3_stordev *sd, int regidx,
+ uint64_t start_sector, uint64_t sector_count, uint64_t flags, char *buf);
+
+void ps3stor_print(struct ps3_stordev *sd);
+
+#endif
diff --git a/sys/boot/powerpc/ps3/version b/sys/boot/powerpc/ps3/version
index fa0b185..fdac54e 100644
--- a/sys/boot/powerpc/ps3/version
+++ b/sys/boot/powerpc/ps3/version
@@ -3,4 +3,6 @@ $FreeBSD$
NOTE ANY CHANGES YOU MAKE TO THE BOOTBLOCKS HERE. The format of this
file is important. Make sure the current version number is on line 6.
+0.3: Added GPT support to disk.
+0.2: Added disk support.
0.1: Initial PS3/PowerPC version.
diff --git a/sys/boot/sparc64/loader/main.c b/sys/boot/sparc64/loader/main.c
index 9a3ae58..be0819f 100644
--- a/sys/boot/sparc64/loader/main.c
+++ b/sys/boot/sparc64/loader/main.c
@@ -96,10 +96,10 @@ static struct mmu_ops {
typedef void kernel_entry_t(vm_offset_t mdp, u_long o1, u_long o2, u_long o3,
void *openfirmware);
-static inline u_long dtlb_get_data_sun4u(u_int);
+static inline u_long dtlb_get_data_sun4u(u_int, u_int);
static int dtlb_enter_sun4u(u_int, u_long data, vm_offset_t);
static vm_offset_t dtlb_va_to_pa_sun4u(vm_offset_t);
-static inline u_long itlb_get_data_sun4u(u_int);
+static inline u_long itlb_get_data_sun4u(u_int, u_int);
static int itlb_enter_sun4u(u_int, u_long data, vm_offset_t);
static vm_offset_t itlb_va_to_pa_sun4u(vm_offset_t);
static void itlb_relocate_locked0_sun4u(void);
@@ -136,6 +136,7 @@ u_int itlb_slot;
static int cpu_impl;
static u_int dtlb_slot_max;
static u_int itlb_slot_max;
+static u_int tlb_locked;
static vm_offset_t curkva = 0;
static vm_offset_t heapva;
@@ -355,42 +356,55 @@ __elfN(exec)(struct preloaded_file *fp)
}
static inline u_long
-dtlb_get_data_sun4u(u_int slot)
+dtlb_get_data_sun4u(u_int tlb, u_int slot)
{
+ u_long data, pstate;
+ slot = TLB_DAR_SLOT(tlb, slot);
/*
- * We read ASI_DTLB_DATA_ACCESS_REG twice in order to work
- * around errata of USIII and beyond.
+ * We read ASI_DTLB_DATA_ACCESS_REG twice back-to-back in order to
+ * work around errata of USIII and beyond.
*/
- (void)ldxa(TLB_DAR_SLOT(slot), ASI_DTLB_DATA_ACCESS_REG);
- return (ldxa(TLB_DAR_SLOT(slot), ASI_DTLB_DATA_ACCESS_REG));
+ pstate = rdpr(pstate);
+ wrpr(pstate, pstate & ~PSTATE_IE, 0);
+ (void)ldxa(slot, ASI_DTLB_DATA_ACCESS_REG);
+ data = ldxa(slot, ASI_DTLB_DATA_ACCESS_REG);
+ wrpr(pstate, pstate, 0);
+ return (data);
}
static inline u_long
-itlb_get_data_sun4u(u_int slot)
+itlb_get_data_sun4u(u_int tlb, u_int slot)
{
+ u_long data, pstate;
+ slot = TLB_DAR_SLOT(tlb, slot);
/*
- * We read ASI_ITLB_DATA_ACCESS_REG twice in order to work
- * around errata of USIII and beyond.
+ * We read ASI_DTLB_DATA_ACCESS_REG twice back-to-back in order to
+ * work around errata of USIII and beyond.
*/
- (void)ldxa(TLB_DAR_SLOT(slot), ASI_ITLB_DATA_ACCESS_REG);
- return (ldxa(TLB_DAR_SLOT(slot), ASI_ITLB_DATA_ACCESS_REG));
+ pstate = rdpr(pstate);
+ wrpr(pstate, pstate & ~PSTATE_IE, 0);
+ (void)ldxa(slot, ASI_ITLB_DATA_ACCESS_REG);
+ data = ldxa(slot, ASI_ITLB_DATA_ACCESS_REG);
+ wrpr(pstate, pstate, 0);
+ return (data);
}
static vm_offset_t
dtlb_va_to_pa_sun4u(vm_offset_t va)
{
u_long pstate, reg;
- int i;
+ u_int i, tlb;
pstate = rdpr(pstate);
wrpr(pstate, pstate & ~PSTATE_IE, 0);
for (i = 0; i < dtlb_slot_max; i++) {
- reg = ldxa(TLB_DAR_SLOT(i), ASI_DTLB_TAG_READ_REG);
+ reg = ldxa(TLB_DAR_SLOT(tlb_locked, i),
+ ASI_DTLB_TAG_READ_REG);
if (TLB_TAR_VA(reg) != va)
continue;
- reg = dtlb_get_data_sun4u(i);
+ reg = dtlb_get_data_sun4u(tlb_locked, i);
wrpr(pstate, pstate, 0);
reg >>= TD_PA_SHIFT;
if (cpu_impl == CPU_IMPL_SPARC64V ||
@@ -411,10 +425,11 @@ itlb_va_to_pa_sun4u(vm_offset_t va)
pstate = rdpr(pstate);
wrpr(pstate, pstate & ~PSTATE_IE, 0);
for (i = 0; i < itlb_slot_max; i++) {
- reg = ldxa(TLB_DAR_SLOT(i), ASI_ITLB_TAG_READ_REG);
+ reg = ldxa(TLB_DAR_SLOT(tlb_locked, i),
+ ASI_ITLB_TAG_READ_REG);
if (TLB_TAR_VA(reg) != va)
continue;
- reg = itlb_get_data_sun4u(i);
+ reg = itlb_get_data_sun4u(tlb_locked, i);
wrpr(pstate, pstate, 0);
reg >>= TD_PA_SHIFT;
if (cpu_impl == CPU_IMPL_SPARC64V ||
@@ -458,14 +473,14 @@ itlb_relocate_locked0_sun4u(void)
pstate = rdpr(pstate);
wrpr(pstate, pstate & ~PSTATE_IE, 0);
- data = itlb_get_data_sun4u(0);
+ data = itlb_get_data_sun4u(tlb_locked, 0);
if ((data & (TD_V | TD_L)) != (TD_V | TD_L)) {
wrpr(pstate, pstate, 0);
return;
}
/* Flush the mapping of slot 0. */
- tag = ldxa(TLB_DAR_SLOT(0), ASI_ITLB_TAG_READ_REG);
+ tag = ldxa(TLB_DAR_SLOT(tlb_locked, 0), ASI_ITLB_TAG_READ_REG);
stxa(TLB_DEMAP_VA(TLB_TAR_VA(tag)) | TLB_DEMAP_PRIMARY |
TLB_DEMAP_PAGE, ASI_IMMU_DEMAP, 0);
flush(0); /* The USIII-family ignores the address. */
@@ -475,11 +490,12 @@ itlb_relocate_locked0_sun4u(void)
* that formerly were in slot 0.
*/
for (i = 1; i < itlb_slot_max; i++) {
- if ((itlb_get_data_sun4u(i) & TD_V) != 0)
+ if ((itlb_get_data_sun4u(tlb_locked, i) & TD_V) != 0)
continue;
stxa(AA_IMMU_TAR, ASI_IMMU, tag);
- stxa(TLB_DAR_SLOT(i), ASI_ITLB_DATA_ACCESS_REG, data);
+ stxa(TLB_DAR_SLOT(tlb_locked, i), ASI_ITLB_DATA_ACCESS_REG,
+ data);
flush(0); /* The USIII-family ignores the address. */
break;
}
@@ -651,6 +667,26 @@ tlb_init_sun4u(void)
phandle_t bsp;
cpu_impl = VER_IMPL(rdpr(ver));
+ switch (cpu_impl) {
+ case CPU_IMPL_SPARC64:
+ case CPU_IMPL_ULTRASPARCI:
+ case CPU_IMPL_ULTRASPARCII:
+ case CPU_IMPL_ULTRASPARCIIi:
+ case CPU_IMPL_ULTRASPARCIIe:
+ tlb_locked = TLB_DAR_T32;
+ break;
+ case CPU_IMPL_ULTRASPARCIII:
+ case CPU_IMPL_ULTRASPARCIIIp:
+ case CPU_IMPL_ULTRASPARCIIIi:
+ case CPU_IMPL_ULTRASPARCIIIip:
+ case CPU_IMPL_ULTRASPARCIV:
+ case CPU_IMPL_ULTRASPARCIVp:
+ tlb_locked = TLB_DAR_T16;
+ break;
+ case CPU_IMPL_SPARC64V:
+ tlb_locked = TLB_DAR_FTLB;
+ break;
+ }
bsp = find_bsp_sun4u(OF_child(root), cpu_get_mid_sun4u());
if (bsp == 0)
panic("%s: no node for bootcpu?!?!", __func__);
@@ -821,21 +857,23 @@ pmap_print_tlb_sun4u(void)
pstate = rdpr(pstate);
for (i = 0; i < itlb_slot_max; i++) {
wrpr(pstate, pstate & ~PSTATE_IE, 0);
- tte = itlb_get_data_sun4u(i);
+ tte = itlb_get_data_sun4u(tlb_locked, i);
wrpr(pstate, pstate, 0);
if (!(tte & TD_V))
continue;
- tag = ldxa(TLB_DAR_SLOT(i), ASI_ITLB_TAG_READ_REG);
+ tag = ldxa(TLB_DAR_SLOT(tlb_locked, i),
+ ASI_ITLB_TAG_READ_REG);
printf("iTLB-%2u: ", i);
pmap_print_tte_sun4u(tag, tte);
}
for (i = 0; i < dtlb_slot_max; i++) {
wrpr(pstate, pstate & ~PSTATE_IE, 0);
- tte = dtlb_get_data_sun4u(i);
+ tte = dtlb_get_data_sun4u(tlb_locked, i);
wrpr(pstate, pstate, 0);
if (!(tte & TD_V))
continue;
- tag = ldxa(TLB_DAR_SLOT(i), ASI_DTLB_TAG_READ_REG);
+ tag = ldxa(TLB_DAR_SLOT(tlb_locked, i),
+ ASI_DTLB_TAG_READ_REG);
printf("dTLB-%2u: ", i);
pmap_print_tte_sun4u(tag, tte);
}
diff --git a/sys/boot/userboot/userboot/Makefile b/sys/boot/userboot/userboot/Makefile
index 7271fa7..28ddc12 100644
--- a/sys/boot/userboot/userboot/Makefile
+++ b/sys/boot/userboot/userboot/Makefile
@@ -32,7 +32,7 @@ CFLAGS+= -I${.CURDIR}/../../common
CFLAGS+= -I${.CURDIR}/../../..
CFLAGS+= -I${.CURDIR}/../../../../lib/libstand
CFLAGS+= -ffreestanding -I.
-CFLAGS+= -DLOADER_GPT_SUPPORT
+CFLAGS+= -DLOADER_GPT_SUPPORT -DLOADER_MBR_SUPPORT
LDFLAGS+= -nostdlib -Wl,-Bsymbolic
diff --git a/sys/cddl/contrib/opensolaris/common/acl/acl_common.c b/sys/cddl/contrib/opensolaris/common/acl/acl_common.c
index 47e0ffd..a681905 100644
--- a/sys/cddl/contrib/opensolaris/common/acl/acl_common.c
+++ b/sys/cddl/contrib/opensolaris/common/acl/acl_common.c
@@ -20,6 +20,7 @@
*/
/*
* Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright 2011 Nexenta Systems, Inc. All rights reserved.
*/
#include <sys/types.h>
@@ -376,7 +377,7 @@ access_mask_set(int haswriteperm, int hasreadperm, int isowner, int isallow)
* by nfsace, assuming aclent_t -> nfsace semantics.
*/
static uint32_t
-mode_to_ace_access(mode_t mode, int isdir, int isowner, int isallow)
+mode_to_ace_access(mode_t mode, boolean_t isdir, int isowner, int isallow)
{
uint32_t access = 0;
int haswriteperm = 0;
@@ -419,7 +420,7 @@ mode_to_ace_access(mode_t mode, int isdir, int isowner, int isallow)
access |= ACE_DELETE_CHILD;
}
/* exec */
- if (mode & 01) {
+ if (mode & S_IXOTH) {
access |= ACE_EXECUTE;
}
@@ -670,7 +671,7 @@ out:
}
static int
-convert_aent_to_ace(aclent_t *aclentp, int aclcnt, int isdir,
+convert_aent_to_ace(aclent_t *aclentp, int aclcnt, boolean_t isdir,
ace_t **retacep, int *retacecnt)
{
ace_t *acep;
@@ -696,7 +697,7 @@ convert_aent_to_ace(aclent_t *aclentp, int aclcnt, int isdir,
dfaclcnt = aclcnt - i;
}
- if (dfaclcnt && isdir == 0) {
+ if (dfaclcnt && !isdir) {
return (EINVAL);
}
@@ -734,7 +735,7 @@ convert_aent_to_ace(aclent_t *aclentp, int aclcnt, int isdir,
}
static int
-ace_mask_to_mode(uint32_t mask, o_mode_t *modep, int isdir)
+ace_mask_to_mode(uint32_t mask, o_mode_t *modep, boolean_t isdir)
{
int error = 0;
o_mode_t mode = 0;
@@ -1031,7 +1032,7 @@ out:
}
static int
-ace_allow_to_mode(uint32_t mask, o_mode_t *modep, int isdir)
+ace_allow_to_mode(uint32_t mask, o_mode_t *modep, boolean_t isdir)
{
/* ACE_READ_ACL and ACE_READ_ATTRIBUTES must both be set */
if ((mask & (ACE_READ_ACL | ACE_READ_ATTRIBUTES)) !=
@@ -1044,7 +1045,7 @@ ace_allow_to_mode(uint32_t mask, o_mode_t *modep, int isdir)
static int
acevals_to_aent(acevals_t *vals, aclent_t *dest, ace_list_t *list,
- uid_t owner, gid_t group, int isdir)
+ uid_t owner, gid_t group, boolean_t isdir)
{
int error;
uint32_t flips = ACE_POSIX_SUPPORTED_BITS;
@@ -1084,7 +1085,7 @@ out:
static int
ace_list_to_aent(ace_list_t *list, aclent_t **aclentp, int *aclcnt,
- uid_t owner, gid_t group, int isdir)
+ uid_t owner, gid_t group, boolean_t isdir)
{
int error = 0;
aclent_t *aent, *result = NULL;
@@ -1264,7 +1265,7 @@ acevals_compare(const void *va, const void *vb)
static int
ln_ace_to_aent(ace_t *ace, int n, uid_t owner, gid_t group,
aclent_t **aclentp, int *aclcnt, aclent_t **dfaclentp, int *dfaclcnt,
- int isdir)
+ boolean_t isdir)
{
int error = 0;
ace_t *acep;
@@ -1459,7 +1460,7 @@ out:
}
static int
-convert_ace_to_aent(ace_t *acebufp, int acecnt, int isdir,
+convert_ace_to_aent(ace_t *acebufp, int acecnt, boolean_t isdir,
uid_t owner, gid_t group, aclent_t **retaclentp, int *retaclcnt)
{
int error = 0;
@@ -1501,7 +1502,7 @@ convert_ace_to_aent(ace_t *acebufp, int acecnt, int isdir,
int
-acl_translate(acl_t *aclp, int target_flavor, int isdir, uid_t owner,
+acl_translate(acl_t *aclp, int target_flavor, boolean_t isdir, uid_t owner,
gid_t group)
{
int aclcnt;
@@ -1573,101 +1574,105 @@ out:
}
void
-acl_trivial_access_masks(mode_t mode, uint32_t *allow0, uint32_t *deny1,
- uint32_t *deny2, uint32_t *owner, uint32_t *group, uint32_t *everyone)
+acl_trivial_access_masks(mode_t mode, boolean_t isdir, trivial_acl_t *masks)
{
- *deny1 = *deny2 = *allow0 = *group = 0;
+ uint32_t read_mask = ACE_READ_DATA;
+ uint32_t write_mask = ACE_WRITE_DATA|ACE_APPEND_DATA;
+ uint32_t execute_mask = ACE_EXECUTE;
+ (void) isdir; /* will need this later */
+
+ masks->deny1 = 0;
if (!(mode & S_IRUSR) && (mode & (S_IRGRP|S_IROTH)))
- *deny1 |= ACE_READ_DATA;
+ masks->deny1 |= read_mask;
if (!(mode & S_IWUSR) && (mode & (S_IWGRP|S_IWOTH)))
- *deny1 |= ACE_WRITE_DATA|ACE_APPEND_DATA;
+ masks->deny1 |= write_mask;
if (!(mode & S_IXUSR) && (mode & (S_IXGRP|S_IXOTH)))
- *deny1 |= ACE_EXECUTE;
+ masks->deny1 |= execute_mask;
+ masks->deny2 = 0;
if (!(mode & S_IRGRP) && (mode & S_IROTH))
- *deny2 = ACE_READ_DATA;
+ masks->deny2 |= read_mask;
if (!(mode & S_IWGRP) && (mode & S_IWOTH))
- *deny2 |= ACE_WRITE_DATA|ACE_APPEND_DATA;
+ masks->deny2 |= write_mask;
if (!(mode & S_IXGRP) && (mode & S_IXOTH))
- *deny2 |= ACE_EXECUTE;
+ masks->deny2 |= execute_mask;
+ masks->allow0 = 0;
if ((mode & S_IRUSR) && (!(mode & S_IRGRP) && (mode & S_IROTH)))
- *allow0 |= ACE_READ_DATA;
+ masks->allow0 |= read_mask;
if ((mode & S_IWUSR) && (!(mode & S_IWGRP) && (mode & S_IWOTH)))
- *allow0 |= ACE_WRITE_DATA|ACE_APPEND_DATA;
+ masks->allow0 |= write_mask;
if ((mode & S_IXUSR) && (!(mode & S_IXGRP) && (mode & S_IXOTH)))
- *allow0 |= ACE_EXECUTE;
+ masks->allow0 |= execute_mask;
- *owner = ACE_WRITE_ATTRIBUTES|ACE_WRITE_OWNER|ACE_WRITE_ACL|
+ masks->owner = ACE_WRITE_ATTRIBUTES|ACE_WRITE_OWNER|ACE_WRITE_ACL|
ACE_WRITE_NAMED_ATTRS|ACE_READ_ACL|ACE_READ_ATTRIBUTES|
ACE_READ_NAMED_ATTRS|ACE_SYNCHRONIZE;
if (mode & S_IRUSR)
- *owner |= ACE_READ_DATA;
+ masks->owner |= read_mask;
if (mode & S_IWUSR)
- *owner |= ACE_WRITE_DATA|ACE_APPEND_DATA;
+ masks->owner |= write_mask;
if (mode & S_IXUSR)
- *owner |= ACE_EXECUTE;
+ masks->owner |= execute_mask;
- *group = ACE_READ_ACL|ACE_READ_ATTRIBUTES| ACE_READ_NAMED_ATTRS|
+ masks->group = ACE_READ_ACL|ACE_READ_ATTRIBUTES|ACE_READ_NAMED_ATTRS|
ACE_SYNCHRONIZE;
if (mode & S_IRGRP)
- *group |= ACE_READ_DATA;
+ masks->group |= read_mask;
if (mode & S_IWGRP)
- *group |= ACE_WRITE_DATA|ACE_APPEND_DATA;
+ masks->group |= write_mask;
if (mode & S_IXGRP)
- *group |= ACE_EXECUTE;
+ masks->group |= execute_mask;
- *everyone = ACE_READ_ACL|ACE_READ_ATTRIBUTES| ACE_READ_NAMED_ATTRS|
+ masks->everyone = ACE_READ_ACL|ACE_READ_ATTRIBUTES|ACE_READ_NAMED_ATTRS|
ACE_SYNCHRONIZE;
if (mode & S_IROTH)
- *everyone |= ACE_READ_DATA;
+ masks->everyone |= read_mask;
if (mode & S_IWOTH)
- *everyone |= ACE_WRITE_DATA|ACE_APPEND_DATA;
+ masks->everyone |= write_mask;
if (mode & S_IXOTH)
- *everyone |= ACE_EXECUTE;
+ masks->everyone |= execute_mask;
}
int
-acl_trivial_create(mode_t mode, ace_t **acl, int *count)
+acl_trivial_create(mode_t mode, boolean_t isdir, ace_t **acl, int *count)
{
- uint32_t deny1, deny2;
- uint32_t allow0;
- uint32_t owner, group, everyone;
- int index = 0;
+ int index = 0;
int error;
+ trivial_acl_t masks;
*count = 3;
- acl_trivial_access_masks(mode, &allow0, &deny1, &deny2, &owner, &group,
- &everyone);
+ acl_trivial_access_masks(mode, isdir, &masks);
- if (allow0)
+ if (masks.allow0)
(*count)++;
- if (deny1)
+ if (masks.deny1)
(*count)++;
- if (deny2)
+ if (masks.deny2)
(*count)++;
if ((error = cacl_malloc((void **)acl, *count * sizeof (ace_t))) != 0)
return (error);
- if (allow0) {
- SET_ACE(acl, index, -1, allow0, ACE_ACCESS_ALLOWED_ACE_TYPE,
- ACE_OWNER);
+ if (masks.allow0) {
+ SET_ACE(acl, index, -1, masks.allow0,
+ ACE_ACCESS_ALLOWED_ACE_TYPE, ACE_OWNER);
}
- if (deny1) {
- SET_ACE(acl, index, -1, deny1, ACE_ACCESS_DENIED_ACE_TYPE,
- ACE_OWNER);
+ if (masks.deny1) {
+ SET_ACE(acl, index, -1, masks.deny1,
+ ACE_ACCESS_DENIED_ACE_TYPE, ACE_OWNER);
}
- if (deny2) {
- SET_ACE(acl, index, -1, deny2, ACE_ACCESS_DENIED_ACE_TYPE,
- ACE_GROUP|ACE_IDENTIFIER_GROUP);
+ if (masks.deny2) {
+ SET_ACE(acl, index, -1, masks.deny2,
+ ACE_ACCESS_DENIED_ACE_TYPE, ACE_GROUP|ACE_IDENTIFIER_GROUP);
}
- SET_ACE(acl, index, -1, owner, ACE_ACCESS_ALLOWED_ACE_TYPE, ACE_OWNER);
- SET_ACE(acl, index, -1, group, ACE_ACCESS_ALLOWED_ACE_TYPE,
+ SET_ACE(acl, index, -1, masks.owner, ACE_ACCESS_ALLOWED_ACE_TYPE,
+ ACE_OWNER);
+ SET_ACE(acl, index, -1, masks.group, ACE_ACCESS_ALLOWED_ACE_TYPE,
ACE_IDENTIFIER_GROUP|ACE_GROUP);
- SET_ACE(acl, index, -1, everyone, ACE_ACCESS_ALLOWED_ACE_TYPE,
+ SET_ACE(acl, index, -1, masks.everyone, ACE_ACCESS_ALLOWED_ACE_TYPE,
ACE_EVERYONE);
return (0);
diff --git a/sys/cddl/contrib/opensolaris/common/acl/acl_common.h b/sys/cddl/contrib/opensolaris/common/acl/acl_common.h
index 20be9a0..acf1f5d 100644
--- a/sys/cddl/contrib/opensolaris/common/acl/acl_common.h
+++ b/sys/cddl/contrib/opensolaris/common/acl/acl_common.h
@@ -20,6 +20,7 @@
*/
/*
* Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright 2011 Nexenta Systems, Inc. All rights reserved.
*/
#ifndef _ACL_COMMON_H
@@ -33,7 +34,14 @@
extern "C" {
#endif
-extern ace_t trivial_acl[6];
+typedef struct trivial_acl {
+ uint32_t allow0; /* allow mask for bits only in owner */
+ uint32_t deny1; /* deny mask for bits not in owner */
+ uint32_t deny2; /* deny mask for bits not in group */
+ uint32_t owner; /* allow mask matching mode */
+ uint32_t group; /* allow mask matching mode */
+ uint32_t everyone; /* allow mask matching mode */
+} trivial_acl_t;
extern int acltrivial(const char *);
extern void adjust_ace_pair(ace_t *pair, mode_t mode);
@@ -45,14 +53,14 @@ extern int ace_trivial_common(void *, int,
#if !defined(_KERNEL)
extern acl_t *acl_alloc(acl_type_t);
extern void acl_free(acl_t *aclp);
-extern int acl_translate(acl_t *aclp, int target_flavor,
- int isdir, uid_t owner, gid_t group);
+extern int acl_translate(acl_t *aclp, int target_flavor, boolean_t isdir,
+ uid_t owner, gid_t group);
#endif /* !_KERNEL */
void ksort(caddr_t v, int n, int s, int (*f)());
int cmp2acls(void *a, void *b);
-int acl_trivial_create(mode_t mode, ace_t **acl, int *count);
-void acl_trivial_access_masks(mode_t mode, uint32_t *allow0, uint32_t *deny1,
- uint32_t *deny2, uint32_t *owner, uint32_t *group, uint32_t *everyone);
+int acl_trivial_create(mode_t mode, boolean_t isdir, ace_t **acl, int *count);
+void acl_trivial_access_masks(mode_t mode, boolean_t isdir,
+ trivial_acl_t *masks);
#ifdef __cplusplus
}
diff --git a/sys/cddl/contrib/opensolaris/common/zfs/zfs_prop.c b/sys/cddl/contrib/opensolaris/common/zfs/zfs_prop.c
index 4fa75195..baa5e49 100644
--- a/sys/cddl/contrib/opensolaris/common/zfs/zfs_prop.c
+++ b/sys/cddl/contrib/opensolaris/common/zfs/zfs_prop.c
@@ -105,6 +105,13 @@ zfs_prop_init(void)
{ NULL }
};
+ static zprop_index_t acl_mode_table[] = {
+ { "discard", ZFS_ACL_DISCARD },
+ { "groupmask", ZFS_ACL_GROUPMASK },
+ { "passthrough", ZFS_ACL_PASSTHROUGH },
+ { NULL }
+ };
+
static zprop_index_t acl_inherit_table[] = {
{ "discard", ZFS_ACL_DISCARD },
{ "noallow", ZFS_ACL_NOALLOW },
@@ -208,6 +215,9 @@ zfs_prop_init(void)
zprop_register_index(ZFS_PROP_SNAPDIR, "snapdir", ZFS_SNAPDIR_HIDDEN,
PROP_INHERIT, ZFS_TYPE_FILESYSTEM,
"hidden | visible", "SNAPDIR", snapdir_table);
+ zprop_register_index(ZFS_PROP_ACLMODE, "aclmode", ZFS_ACL_DISCARD,
+ PROP_INHERIT, ZFS_TYPE_FILESYSTEM,
+ "discard | groupmask | passthrough", "ACLMODE", acl_mode_table);
zprop_register_index(ZFS_PROP_ACLINHERIT, "aclinherit",
ZFS_ACL_RESTRICTED, PROP_INHERIT, ZFS_TYPE_FILESYSTEM,
"discard | noallow | restricted | passthrough | passthrough-x",
@@ -374,13 +384,6 @@ zfs_prop_init(void)
zprop_register_hidden(ZFS_PROP_OBJSETID, "objsetid", PROP_TYPE_NUMBER,
PROP_READONLY, ZFS_TYPE_DATASET, "OBJSETID");
- /*
- * Property to be removed once libbe is integrated
- */
- zprop_register_hidden(ZFS_PROP_PRIVATE, "priv_prop",
- PROP_TYPE_NUMBER, PROP_READONLY, ZFS_TYPE_FILESYSTEM,
- "PRIV_PROP");
-
/* oddball properties */
zprop_register_impl(ZFS_PROP_CREATION, "creation", PROP_TYPE_NUMBER, 0,
NULL, PROP_READONLY, ZFS_TYPE_DATASET,
diff --git a/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/metaslab.c b/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/metaslab.c
index 17b4b12..a0620b8 100644
--- a/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/metaslab.c
+++ b/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/metaslab.c
@@ -20,6 +20,7 @@
*/
/*
* Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2011 by Delphix. All rights reserved.
*/
#include <sys/zfs_context.h>
@@ -30,10 +31,35 @@
#include <sys/vdev_impl.h>
#include <sys/zio.h>
+/*
+ * Allow allocations to switch to gang blocks quickly. We do this to
+ * avoid having to load lots of space_maps in a given txg. There are,
+ * however, some cases where we want to avoid "fast" ganging and instead
+ * we want to do an exhaustive search of all metaslabs on this device.
+ * Currently we don't allow any gang or dump device related allocations
+ * to "fast" gang.
+ */
+#define CAN_FASTGANG(flags) \
+ (!((flags) & (METASLAB_GANG_CHILD | METASLAB_GANG_HEADER | \
+ METASLAB_GANG_AVOID)))
+
uint64_t metaslab_aliquot = 512ULL << 10;
uint64_t metaslab_gang_bang = SPA_MAXBLOCKSIZE + 1; /* force gang blocks */
/*
+ * This value defines the number of allowed allocation failures per vdev.
+ * If a device reaches this threshold in a given txg then we consider skipping
+ * allocations on that device.
+ */
+int zfs_mg_alloc_failures = 0;
+
+SYSCTL_DECL(_vfs_zfs);
+SYSCTL_INT(_vfs_zfs, OID_AUTO, mg_alloc_failures, CTLFLAG_RDTUN,
+ &zfs_mg_alloc_failures, 0,
+ "Number of allowed allocation failures per vdev");
+TUNABLE_INT("vfs.zfs.mg_alloc_failures", &zfs_mg_alloc_failures);
+
+/*
* Metaslab debugging: when set, keeps all space maps in core to verify frees.
*/
static int metaslab_debug = 0;
@@ -671,7 +697,7 @@ static space_map_ops_t metaslab_ndf_ops = {
metaslab_ndf_fragmented
};
-space_map_ops_t *zfs_metaslab_ops = &metaslab_ndf_ops;
+space_map_ops_t *zfs_metaslab_ops = &metaslab_df_ops;
/*
* ==========================================================================
@@ -844,7 +870,7 @@ metaslab_prefetch(metaslab_group_t *mg)
}
static int
-metaslab_activate(metaslab_t *msp, uint64_t activation_weight, uint64_t size)
+metaslab_activate(metaslab_t *msp, uint64_t activation_weight)
{
metaslab_group_t *mg = msp->ms_group;
space_map_t *sm = &msp->ms_map;
@@ -877,13 +903,6 @@ metaslab_activate(metaslab_t *msp, uint64_t activation_weight, uint64_t size)
mutex_exit(&mg->mg_lock);
}
- /*
- * If we were able to load the map then make sure
- * that this map is still able to satisfy our request.
- */
- if (msp->ms_weight < size)
- return (ENOSPC);
-
metaslab_group_sort(msp->ms_group, msp,
msp->ms_weight | activation_weight);
}
@@ -1099,6 +1118,7 @@ void
metaslab_sync_reassess(metaslab_group_t *mg)
{
vdev_t *vd = mg->mg_vd;
+ int64_t failures = mg->mg_alloc_failures;
/*
* Re-evaluate all metaslabs which have lower offsets than the
@@ -1115,6 +1135,8 @@ metaslab_sync_reassess(metaslab_group_t *mg)
mutex_exit(&msp->ms_lock);
}
+ atomic_add_64(&mg->mg_alloc_failures, -failures);
+
/*
* Prefetch the next potential metaslabs
*/
@@ -1139,9 +1161,10 @@ metaslab_distance(metaslab_t *msp, dva_t *dva)
}
static uint64_t
-metaslab_group_alloc(metaslab_group_t *mg, uint64_t size, uint64_t txg,
- uint64_t min_distance, dva_t *dva, int d)
+metaslab_group_alloc(metaslab_group_t *mg, uint64_t psize, uint64_t asize,
+ uint64_t txg, uint64_t min_distance, dva_t *dva, int d, int flags)
{
+ spa_t *spa = mg->mg_vd->vdev_spa;
metaslab_t *msp = NULL;
uint64_t offset = -1ULL;
avl_tree_t *t = &mg->mg_metaslab_tree;
@@ -1162,11 +1185,17 @@ metaslab_group_alloc(metaslab_group_t *mg, uint64_t size, uint64_t txg,
mutex_enter(&mg->mg_lock);
for (msp = avl_first(t); msp; msp = AVL_NEXT(t, msp)) {
- if (msp->ms_weight < size) {
+ if (msp->ms_weight < asize) {
+ spa_dbgmsg(spa, "%s: failed to meet weight "
+ "requirement: vdev %llu, txg %llu, mg %p, "
+ "msp %p, psize %llu, asize %llu, "
+ "failures %llu, weight %llu",
+ spa_name(spa), mg->mg_vd->vdev_id, txg,
+ mg, msp, psize, asize,
+ mg->mg_alloc_failures, msp->ms_weight);
mutex_exit(&mg->mg_lock);
return (-1ULL);
}
-
was_active = msp->ms_weight & METASLAB_ACTIVE_MASK;
if (activation_weight == METASLAB_WEIGHT_PRIMARY)
break;
@@ -1185,6 +1214,25 @@ metaslab_group_alloc(metaslab_group_t *mg, uint64_t size, uint64_t txg,
if (msp == NULL)
return (-1ULL);
+ /*
+ * If we've already reached the allowable number of failed
+ * allocation attempts on this metaslab group then we
+ * consider skipping it. We skip it only if we're allowed
+ * to "fast" gang, the physical size is larger than
+ * a gang block, and we're attempting to allocate from
+ * the primary metaslab.
+ */
+ if (mg->mg_alloc_failures > zfs_mg_alloc_failures &&
+ CAN_FASTGANG(flags) && psize > SPA_GANGBLOCKSIZE &&
+ activation_weight == METASLAB_WEIGHT_PRIMARY) {
+ spa_dbgmsg(spa, "%s: skipping metaslab group: "
+ "vdev %llu, txg %llu, mg %p, psize %llu, "
+ "asize %llu, failures %llu", spa_name(spa),
+ mg->mg_vd->vdev_id, txg, mg, psize, asize,
+ mg->mg_alloc_failures);
+ return (-1ULL);
+ }
+
mutex_enter(&msp->ms_lock);
/*
@@ -1193,7 +1241,7 @@ metaslab_group_alloc(metaslab_group_t *mg, uint64_t size, uint64_t txg,
* another thread may have changed the weight while we
* were blocked on the metaslab lock.
*/
- if (msp->ms_weight < size || (was_active &&
+ if (msp->ms_weight < asize || (was_active &&
!(msp->ms_weight & METASLAB_ACTIVE_MASK) &&
activation_weight == METASLAB_WEIGHT_PRIMARY)) {
mutex_exit(&msp->ms_lock);
@@ -1208,14 +1256,16 @@ metaslab_group_alloc(metaslab_group_t *mg, uint64_t size, uint64_t txg,
continue;
}
- if (metaslab_activate(msp, activation_weight, size) != 0) {
+ if (metaslab_activate(msp, activation_weight) != 0) {
mutex_exit(&msp->ms_lock);
continue;
}
- if ((offset = space_map_alloc(&msp->ms_map, size)) != -1ULL)
+ if ((offset = space_map_alloc(&msp->ms_map, asize)) != -1ULL)
break;
+ atomic_inc_64(&mg->mg_alloc_failures);
+
metaslab_passivate(msp, space_map_maxsize(&msp->ms_map));
mutex_exit(&msp->ms_lock);
@@ -1224,7 +1274,7 @@ metaslab_group_alloc(metaslab_group_t *mg, uint64_t size, uint64_t txg,
if (msp->ms_allocmap[txg & TXG_MASK].sm_space == 0)
vdev_dirty(mg->mg_vd, VDD_METASLAB, msp, txg);
- space_map_add(&msp->ms_allocmap[txg & TXG_MASK], offset, size);
+ space_map_add(&msp->ms_allocmap[txg & TXG_MASK], offset, asize);
mutex_exit(&msp->ms_lock);
@@ -1351,7 +1401,8 @@ top:
asize = vdev_psize_to_asize(vd, psize);
ASSERT(P2PHASE(asize, 1ULL << vd->vdev_ashift) == 0);
- offset = metaslab_group_alloc(mg, asize, txg, distance, dva, d);
+ offset = metaslab_group_alloc(mg, psize, asize, txg, distance,
+ dva, d, flags);
if (offset != -1ULL) {
/*
* If we've just selected this metaslab group,
@@ -1363,18 +1414,24 @@ top:
vdev_stat_t *vs = &vd->vdev_stat;
int64_t vu, cu;
- /*
- * Determine percent used in units of 0..1024.
- * (This is just to avoid floating point.)
- */
- vu = (vs->vs_alloc << 10) / (vs->vs_space + 1);
- cu = (mc->mc_alloc << 10) / (mc->mc_space + 1);
+ vu = (vs->vs_alloc * 100) / (vs->vs_space + 1);
+ cu = (mc->mc_alloc * 100) / (mc->mc_space + 1);
/*
- * Bias by at most +/- 25% of the aliquot.
+ * Calculate how much more or less we should
+ * try to allocate from this device during
+ * this iteration around the rotor.
+ * For example, if a device is 80% full
+ * and the pool is 20% full then we should
+ * reduce allocations by 60% on this device.
+ *
+ * mg_bias = (20 - 80) * 512K / 100 = -307K
+ *
+ * This reduces allocations by 307K for this
+ * iteration.
*/
mg->mg_bias = ((cu - vu) *
- (int64_t)mg->mg_aliquot) / (1024 * 4);
+ (int64_t)mg->mg_aliquot) / 100;
}
if (atomic_add_64_nv(&mc->mc_aliquot, asize) >=
@@ -1488,7 +1545,7 @@ metaslab_claim_dva(spa_t *spa, const dva_t *dva, uint64_t txg)
mutex_enter(&msp->ms_lock);
if ((txg != 0 && spa_writeable(spa)) || !msp->ms_map.sm_loaded)
- error = metaslab_activate(msp, METASLAB_WEIGHT_SECONDARY, 0);
+ error = metaslab_activate(msp, METASLAB_WEIGHT_SECONDARY);
if (error == 0 && !space_map_contains(&msp->ms_map, offset, size))
error = ENOENT;
diff --git a/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/spa_misc.c b/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/spa_misc.c
index 1709f68..9138309 100644
--- a/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/spa_misc.c
+++ b/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/spa_misc.c
@@ -20,6 +20,7 @@
*/
/*
* Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2011 by Delphix. All rights reserved.
*/
#include <sys/zfs_context.h>
@@ -1674,3 +1675,9 @@ spa_scan_get_stats(spa_t *spa, pool_scan_stat_t *ps)
return (0);
}
+
+boolean_t
+spa_debug_enabled(spa_t *spa)
+{
+ return (spa->spa_debug);
+}
diff --git a/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/sys/metaslab.h b/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/sys/metaslab.h
index 583d630..2cf4d2b 100644
--- a/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/sys/metaslab.h
+++ b/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/sys/metaslab.h
@@ -20,6 +20,7 @@
*/
/*
* Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2011 by Delphix. All rights reserved.
*/
#ifndef _SYS_METASLAB_H
@@ -47,6 +48,8 @@ extern void metaslab_sync_reassess(metaslab_group_t *mg);
#define METASLAB_HINTBP_FAVOR 0x0
#define METASLAB_HINTBP_AVOID 0x1
#define METASLAB_GANG_HEADER 0x2
+#define METASLAB_GANG_CHILD 0x4
+#define METASLAB_GANG_AVOID 0x8
extern int metaslab_alloc(spa_t *spa, metaslab_class_t *mc, uint64_t psize,
blkptr_t *bp, int ncopies, uint64_t txg, blkptr_t *hintbp, int flags);
diff --git a/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/sys/metaslab_impl.h b/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/sys/metaslab_impl.h
index 07988dd..6c670a1 100644
--- a/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/sys/metaslab_impl.h
+++ b/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/sys/metaslab_impl.h
@@ -21,6 +21,7 @@
/*
* Copyright 2009 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
+ * Copyright (c) 2011 by Delphix. All rights reserved.
*/
#ifndef _SYS_METASLAB_IMPL_H
@@ -52,6 +53,7 @@ struct metaslab_group {
avl_tree_t mg_metaslab_tree;
uint64_t mg_aliquot;
uint64_t mg_bonus_area;
+ uint64_t mg_alloc_failures;
int64_t mg_bias;
int64_t mg_activation_count;
metaslab_class_t *mg_class;
diff --git a/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/sys/spa.h b/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/sys/spa.h
index 9cdec18..fe6e727 100644
--- a/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/sys/spa.h
+++ b/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/sys/spa.h
@@ -20,6 +20,7 @@
*/
/*
* Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2011 by Delphix. All rights reserved.
*/
#ifndef _SYS_SPA_H
@@ -698,6 +699,13 @@ _NOTE(CONSTCOND) } while (0)
#define dprintf_bp(bp, fmt, ...)
#endif
+extern boolean_t spa_debug_enabled(spa_t *spa);
+#define spa_dbgmsg(spa, ...) \
+{ \
+ if (spa_debug_enabled(spa)) \
+ zfs_dbgmsg(__VA_ARGS__); \
+}
+
extern int spa_mode_global; /* mode, e.g. FREAD | FWRITE */
#ifdef __cplusplus
diff --git a/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/sys/spa_impl.h b/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/sys/spa_impl.h
index a2f15d2..2dbe552 100644
--- a/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/sys/spa_impl.h
+++ b/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/sys/spa_impl.h
@@ -20,6 +20,7 @@
*/
/*
* Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2011 by Delphix. All rights reserved.
*/
#ifndef _SYS_SPA_IMPL_H
@@ -196,6 +197,7 @@ struct spa {
kcondvar_t spa_suspend_cv; /* notification of resume */
uint8_t spa_suspended; /* pool is suspended */
uint8_t spa_claiming; /* pool is doing zil_claim() */
+ boolean_t spa_debug; /* debug enabled? */
boolean_t spa_is_root; /* pool is root */
int spa_minref; /* num refs when first opened */
int spa_mode; /* FREAD | FWRITE */
diff --git a/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/sys/zfs_acl.h b/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/sys/zfs_acl.h
index d3c471a..f700b53 100644
--- a/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/sys/zfs_acl.h
+++ b/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/sys/zfs_acl.h
@@ -217,7 +217,7 @@ int zfs_fastaccesschk_execute(struct znode *, cred_t *);
extern int zfs_zaccess_rwx(struct znode *, mode_t, int, cred_t *);
extern int zfs_zaccess_unix(struct znode *, mode_t, cred_t *);
extern int zfs_acl_access(struct znode *, int, cred_t *);
-void zfs_acl_chmod_setattr(struct znode *, zfs_acl_t **, uint64_t);
+int zfs_acl_chmod_setattr(struct znode *, zfs_acl_t **, uint64_t);
int zfs_zaccess_delete(struct znode *, struct znode *, cred_t *);
int zfs_zaccess_rename(struct znode *, struct znode *,
struct znode *, struct znode *, cred_t *cr);
diff --git a/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/sys/zfs_vfsops.h b/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/sys/zfs_vfsops.h
index c328a03..0560672 100644
--- a/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/sys/zfs_vfsops.h
+++ b/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/sys/zfs_vfsops.h
@@ -55,6 +55,7 @@ struct zfsvfs {
boolean_t z_fuid_dirty; /* need to sync fuid table ? */
struct zfs_fuid_info *z_fuid_replay; /* fuid info for replay */
zilog_t *z_log; /* intent log pointer */
+ uint_t z_acl_mode; /* acl chmod/mode behavior */
uint_t z_acl_inherit; /* acl inheritance behavior */
zfs_case_t z_case; /* case-sense */
boolean_t z_utf8; /* utf8-only */
diff --git a/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_acl.c b/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_acl.c
index f893383..73219ea 100644
--- a/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_acl.c
+++ b/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_acl.c
@@ -20,6 +20,7 @@
*/
/*
* Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright 2011 Nexenta Systems, Inc. All rights reserved.
*/
#include <sys/types.h>
@@ -1327,75 +1328,8 @@ zfs_aclset_common(znode_t *zp, zfs_acl_t *aclp, cred_t *cr, dmu_tx_t *tx)
return (sa_bulk_update(zp->z_sa_hdl, bulk, count, tx));
}
-/*
- * Update access mask for prepended ACE
- *
- * This applies the "groupmask" value for aclmode property.
- */
-static void
-zfs_acl_prepend_fixup(zfs_acl_t *aclp, void *acep, void *origacep,
- mode_t mode, uint64_t owner)
-{
- int rmask, wmask, xmask;
- int user_ace;
- uint16_t aceflags;
- uint32_t origmask, acepmask;
- uint64_t fuid;
-
- aceflags = aclp->z_ops.ace_flags_get(acep);
- fuid = aclp->z_ops.ace_who_get(acep);
- origmask = aclp->z_ops.ace_mask_get(origacep);
- acepmask = aclp->z_ops.ace_mask_get(acep);
-
- user_ace = (!(aceflags &
- (ACE_OWNER|ACE_GROUP|ACE_IDENTIFIER_GROUP)));
-
- if (user_ace && (fuid == owner)) {
- rmask = S_IRUSR;
- wmask = S_IWUSR;
- xmask = S_IXUSR;
- } else {
- rmask = S_IRGRP;
- wmask = S_IWGRP;
- xmask = S_IXGRP;
- }
-
- if (origmask & ACE_READ_DATA) {
- if (mode & rmask) {
- acepmask &= ~ACE_READ_DATA;
- } else {
- acepmask |= ACE_READ_DATA;
- }
- }
-
- if (origmask & ACE_WRITE_DATA) {
- if (mode & wmask) {
- acepmask &= ~ACE_WRITE_DATA;
- } else {
- acepmask |= ACE_WRITE_DATA;
- }
- }
-
- if (origmask & ACE_APPEND_DATA) {
- if (mode & wmask) {
- acepmask &= ~ACE_APPEND_DATA;
- } else {
- acepmask |= ACE_APPEND_DATA;
- }
- }
-
- if (origmask & ACE_EXECUTE) {
- if (mode & xmask) {
- acepmask &= ~ACE_EXECUTE;
- } else {
- acepmask |= ACE_EXECUTE;
- }
- }
- aclp->z_ops.ace_mask_set(acep, acepmask);
-}
-
static void
-zfs_acl_chmod(zfsvfs_t *zfsvfs, uint64_t mode, zfs_acl_t *aclp)
+zfs_acl_chmod(vtype_t vtype, uint64_t mode, boolean_t trim, zfs_acl_t *aclp)
{
void *acep = NULL;
uint64_t who;
@@ -1407,30 +1341,31 @@ zfs_acl_chmod(zfsvfs_t *zfsvfs, uint64_t mode, zfs_acl_t *aclp)
zfs_acl_node_t *newnode;
size_t abstract_size = aclp->z_ops.ace_abstract_size();
void *zacep;
- uint32_t owner, group, everyone;
- uint32_t deny1, deny2, allow0;
+ boolean_t isdir;
+ trivial_acl_t masks;
new_count = new_bytes = 0;
- acl_trivial_access_masks((mode_t)mode, &allow0, &deny1, &deny2,
- &owner, &group, &everyone);
+ isdir = (vtype == VDIR);
+
+ acl_trivial_access_masks((mode_t)mode, isdir, &masks);
newnode = zfs_acl_node_alloc((abstract_size * 6) + aclp->z_acl_bytes);
zacep = newnode->z_acldata;
- if (allow0) {
- zfs_set_ace(aclp, zacep, allow0, ALLOW, -1, ACE_OWNER);
+ if (masks.allow0) {
+ zfs_set_ace(aclp, zacep, masks.allow0, ALLOW, -1, ACE_OWNER);
zacep = (void *)((uintptr_t)zacep + abstract_size);
new_count++;
new_bytes += abstract_size;
- } if (deny1) {
- zfs_set_ace(aclp, zacep, deny1, DENY, -1, ACE_OWNER);
+ } if (masks.deny1) {
+ zfs_set_ace(aclp, zacep, masks.deny1, DENY, -1, ACE_OWNER);
zacep = (void *)((uintptr_t)zacep + abstract_size);
new_count++;
new_bytes += abstract_size;
}
- if (deny2) {
- zfs_set_ace(aclp, zacep, deny2, DENY, -1, OWNING_GROUP);
+ if (masks.deny2) {
+ zfs_set_ace(aclp, zacep, masks.deny2, DENY, -1, OWNING_GROUP);
zacep = (void *)((uintptr_t)zacep + abstract_size);
new_count++;
new_bytes += abstract_size;
@@ -1449,10 +1384,17 @@ zfs_acl_chmod(zfsvfs_t *zfsvfs, uint64_t mode, zfs_acl_t *aclp)
continue;
}
+ /*
+ * If this ACL has any inheritable ACEs, mark that in
+ * the hints (which are later masked into the pflags)
+ * so create knows to do inheritance.
+ */
+ if (isdir && (inherit_flags &
+ (ACE_FILE_INHERIT_ACE|ACE_DIRECTORY_INHERIT_ACE)))
+ aclp->z_hints |= ZFS_INHERIT_ACE;
+
if ((type != ALLOW && type != DENY) ||
(inherit_flags & ACE_INHERIT_ONLY_ACE)) {
- if (inherit_flags)
- aclp->z_hints |= ZFS_INHERIT_ACE;
switch (type) {
case ACE_ACCESS_ALLOWED_OBJECT_ACE_TYPE:
case ACE_ACCESS_DENIED_OBJECT_ACE_TYPE:
@@ -1465,20 +1407,13 @@ zfs_acl_chmod(zfsvfs_t *zfsvfs, uint64_t mode, zfs_acl_t *aclp)
/*
* Limit permissions to be no greater than
- * group permissions
+ * group permissions.
+ * The "aclinherit" and "aclmode" properties
+ * affect policy for create and chmod(2),
+ * respectively.
*/
- if (type == ALLOW && zfsvfs->z_acl_inherit == ZFS_ACL_RESTRICTED) {
- if (!(mode & S_IRGRP))
- access_mask &= ~ACE_READ_DATA;
- if (!(mode & S_IWGRP))
- access_mask &=
- ~(ACE_WRITE_DATA|ACE_APPEND_DATA);
- if (!(mode & S_IXGRP))
- access_mask &= ~ACE_EXECUTE;
- access_mask &=
- ~(ACE_WRITE_OWNER|ACE_WRITE_ACL|
- ACE_WRITE_ATTRIBUTES|ACE_WRITE_NAMED_ATTRS);
- }
+ if ((type == ALLOW) && trim)
+ access_mask &= masks.group;
}
zfs_set_ace(aclp, zacep, access_mask, type, who, iflags);
ace_size = aclp->z_ops.ace_size(acep);
@@ -1486,11 +1421,11 @@ zfs_acl_chmod(zfsvfs_t *zfsvfs, uint64_t mode, zfs_acl_t *aclp)
new_count++;
new_bytes += ace_size;
}
- zfs_set_ace(aclp, zacep, owner, 0, -1, ACE_OWNER);
+ zfs_set_ace(aclp, zacep, masks.owner, 0, -1, ACE_OWNER);
zacep = (void *)((uintptr_t)zacep + abstract_size);
- zfs_set_ace(aclp, zacep, group, 0, -1, OWNING_GROUP);
+ zfs_set_ace(aclp, zacep, masks.group, 0, -1, OWNING_GROUP);
zacep = (void *)((uintptr_t)zacep + abstract_size);
- zfs_set_ace(aclp, zacep, everyone, 0, -1, ACE_EVERYONE);
+ zfs_set_ace(aclp, zacep, masks.everyone, 0, -1, ACE_EVERYONE);
new_count += 3;
new_bytes += abstract_size * 3;
@@ -1502,17 +1437,27 @@ zfs_acl_chmod(zfsvfs_t *zfsvfs, uint64_t mode, zfs_acl_t *aclp)
list_insert_tail(&aclp->z_acl, newnode);
}
-void
+int
zfs_acl_chmod_setattr(znode_t *zp, zfs_acl_t **aclp, uint64_t mode)
{
+ int error = 0;
+
mutex_enter(&zp->z_acl_lock);
mutex_enter(&zp->z_lock);
- *aclp = zfs_acl_alloc(zfs_acl_version_zp(zp));
- (*aclp)->z_hints = zp->z_pflags & V4_ACL_WIDE_FLAGS;
- zfs_acl_chmod(zp->z_zfsvfs, mode, *aclp);
+ if (zp->z_zfsvfs->z_acl_mode == ZFS_ACL_DISCARD)
+ *aclp = zfs_acl_alloc(zfs_acl_version_zp(zp));
+ else
+ error = zfs_acl_node_read(zp, B_TRUE, aclp, B_TRUE);
+
+ if (error == 0) {
+ (*aclp)->z_hints = zp->z_pflags & V4_ACL_WIDE_FLAGS;
+ zfs_acl_chmod(ZTOV(zp)->v_type, mode,
+ (zp->z_zfsvfs->z_acl_mode == ZFS_ACL_GROUPMASK), *aclp);
+ }
mutex_exit(&zp->z_lock);
mutex_exit(&zp->z_acl_lock);
- ASSERT(*aclp);
+
+ return (error);
}
/*
@@ -1764,8 +1709,8 @@ zfs_acl_ids_create(znode_t *dzp, int flag, vattr_t *vap, cred_t *cr,
if (acl_ids->z_aclp == NULL) {
mutex_enter(&dzp->z_acl_lock);
mutex_enter(&dzp->z_lock);
- if (!(flag & IS_ROOT_NODE) && (ZTOV(dzp)->v_type == VDIR &&
- (dzp->z_pflags & ZFS_INHERIT_ACE)) &&
+ if (!(flag & IS_ROOT_NODE) &&
+ (dzp->z_pflags & ZFS_INHERIT_ACE) &&
!(dzp->z_pflags & ZFS_XATTR)) {
VERIFY(0 == zfs_acl_node_read(dzp, B_TRUE,
&paclp, B_FALSE));
@@ -1782,7 +1727,9 @@ zfs_acl_ids_create(znode_t *dzp, int flag, vattr_t *vap, cred_t *cr,
if (need_chmod) {
acl_ids->z_aclp->z_hints |= (vap->va_type == VDIR) ?
ZFS_ACL_AUTO_INHERIT : 0;
- zfs_acl_chmod(zfsvfs, acl_ids->z_mode, acl_ids->z_aclp);
+ zfs_acl_chmod(vap->va_type, acl_ids->z_mode,
+ (zfsvfs->z_acl_inherit == ZFS_ACL_RESTRICTED),
+ acl_ids->z_aclp);
}
}
diff --git a/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_vfsops.c b/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_vfsops.c
index fffc181..eff9779 100644
--- a/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_vfsops.c
+++ b/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_vfsops.c
@@ -364,6 +364,14 @@ vscan_changed_cb(void *arg, uint64_t newval)
}
static void
+acl_mode_changed_cb(void *arg, uint64_t newval)
+{
+ zfsvfs_t *zfsvfs = arg;
+
+ zfsvfs->z_acl_mode = newval;
+}
+
+static void
acl_inherit_changed_cb(void *arg, uint64_t newval)
{
zfsvfs_t *zfsvfs = arg;
@@ -488,6 +496,8 @@ zfs_register_callbacks(vfs_t *vfsp)
error = error ? error : dsl_prop_register(ds,
"snapdir", snapdir_changed_cb, zfsvfs);
error = error ? error : dsl_prop_register(ds,
+ "aclmode", acl_mode_changed_cb, zfsvfs);
+ error = error ? error : dsl_prop_register(ds,
"aclinherit", acl_inherit_changed_cb, zfsvfs);
error = error ? error : dsl_prop_register(ds,
"vscan", vscan_changed_cb, zfsvfs);
@@ -525,6 +535,7 @@ unregister:
(void) dsl_prop_unregister(ds, "setuid", setuid_changed_cb, zfsvfs);
(void) dsl_prop_unregister(ds, "exec", exec_changed_cb, zfsvfs);
(void) dsl_prop_unregister(ds, "snapdir", snapdir_changed_cb, zfsvfs);
+ (void) dsl_prop_unregister(ds, "aclmode", acl_mode_changed_cb, zfsvfs);
(void) dsl_prop_unregister(ds, "aclinherit", acl_inherit_changed_cb,
zfsvfs);
(void) dsl_prop_unregister(ds, "vscan", vscan_changed_cb, zfsvfs);
@@ -1202,6 +1213,9 @@ zfs_unregister_callbacks(zfsvfs_t *zfsvfs)
VERIFY(dsl_prop_unregister(ds, "snapdir", snapdir_changed_cb,
zfsvfs) == 0);
+ VERIFY(dsl_prop_unregister(ds, "aclmode", acl_mode_changed_cb,
+ zfsvfs) == 0);
+
VERIFY(dsl_prop_unregister(ds, "aclinherit",
acl_inherit_changed_cb, zfsvfs) == 0);
diff --git a/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_vnops.c b/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_vnops.c
index 17eedee..588ea85 100644
--- a/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_vnops.c
+++ b/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_vnops.c
@@ -3223,7 +3223,8 @@ top:
uint64_t acl_obj;
new_mode = (pmode & S_IFMT) | (vap->va_mode & ~S_IFMT);
- zfs_acl_chmod_setattr(zp, &aclp, new_mode);
+ if (err = zfs_acl_chmod_setattr(zp, &aclp, new_mode))
+ goto out;
mutex_enter(&zp->z_lock);
if (!zp->z_is_sa && ((acl_obj = zfs_external_acl(zp)) != 0)) {
diff --git a/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zio.c b/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zio.c
index 9a04344..5f8f00b 100644
--- a/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zio.c
+++ b/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zio.c
@@ -20,6 +20,7 @@
*/
/*
* Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2011 by Delphix. All rights reserved.
*/
#include <sys/zfs_context.h>
@@ -85,6 +86,7 @@ kmem_cache_t *zio_data_buf_cache[SPA_MAXBLOCKSIZE >> SPA_MINBLOCKSHIFT];
#ifdef _KERNEL
extern vmem_t *zio_alloc_arena;
#endif
+extern int zfs_mg_alloc_failures;
/*
* An allocating zio is one that either currently has the DVA allocate
@@ -160,6 +162,15 @@ zio_init(void)
zio_data_buf_cache[c - 1] = zio_data_buf_cache[c];
}
+ /*
+ * The zio write taskqs have 1 thread per cpu, allow 1/2 of the taskqs
+ * to fail 3 times per txg or 8 failures, whichever is greater.
+ */
+ if (zfs_mg_alloc_failures == 0)
+ zfs_mg_alloc_failures = MAX((3 * max_ncpus / 2), 8);
+ else if (zfs_mg_alloc_failures < 8)
+ zfs_mg_alloc_failures = 8;
+
zio_inject_init();
}
@@ -2135,6 +2146,7 @@ zio_dva_allocate(zio_t *zio)
metaslab_class_t *mc = spa_normal_class(spa);
blkptr_t *bp = zio->io_bp;
int error;
+ int flags = 0;
if (zio->io_gang_leader == NULL) {
ASSERT(zio->io_child_type > ZIO_CHILD_GANG);
@@ -2147,10 +2159,21 @@ zio_dva_allocate(zio_t *zio)
ASSERT3U(zio->io_prop.zp_copies, <=, spa_max_replication(spa));
ASSERT3U(zio->io_size, ==, BP_GET_PSIZE(bp));
+ /*
+ * The dump device does not support gang blocks so allocation on
+ * behalf of the dump device (i.e. ZIO_FLAG_NODATA) must avoid
+ * the "fast" gang feature.
+ */
+ flags |= (zio->io_flags & ZIO_FLAG_NODATA) ? METASLAB_GANG_AVOID : 0;
+ flags |= (zio->io_flags & ZIO_FLAG_GANG_CHILD) ?
+ METASLAB_GANG_CHILD : 0;
error = metaslab_alloc(spa, mc, zio->io_size, bp,
- zio->io_prop.zp_copies, zio->io_txg, NULL, 0);
+ zio->io_prop.zp_copies, zio->io_txg, NULL, flags);
if (error) {
+ spa_dbgmsg(spa, "%s: metaslab allocation failure: zio %p, "
+ "size %llu, error %d", spa_name(spa), zio, zio->io_size,
+ error);
if (error == ENOSPC && zio->io_size > SPA_MINBLOCKSIZE)
return (zio_write_gang_block(zio));
zio->io_error = error;
diff --git a/sys/cddl/contrib/opensolaris/uts/common/sys/fs/zfs.h b/sys/cddl/contrib/opensolaris/uts/common/sys/fs/zfs.h
index e4070c2..c5ed728 100644
--- a/sys/cddl/contrib/opensolaris/uts/common/sys/fs/zfs.h
+++ b/sys/cddl/contrib/opensolaris/uts/common/sys/fs/zfs.h
@@ -90,7 +90,7 @@ typedef enum {
ZFS_PROP_READONLY,
ZFS_PROP_ZONED,
ZFS_PROP_SNAPDIR,
- ZFS_PROP_PRIVATE, /* not exposed to user, temporary */
+ ZFS_PROP_ACLMODE,
ZFS_PROP_ACLINHERIT,
ZFS_PROP_CREATETXG, /* not exposed to the user */
ZFS_PROP_NAME, /* not exposed to the user */
diff --git a/sys/cddl/dev/dtrace/amd64/dtrace_subr.c b/sys/cddl/dev/dtrace/amd64/dtrace_subr.c
index 0b86eac..d2a1cf1 100644
--- a/sys/cddl/dev/dtrace/amd64/dtrace_subr.c
+++ b/sys/cddl/dev/dtrace/amd64/dtrace_subr.c
@@ -412,8 +412,8 @@ dtrace_gethrtime_init(void *arg)
continue;
pc = pcpu_find(i);
- map = PCPU_GET(cpumask);
- CPU_OR(&map, &pc->pc_cpumask);
+ CPU_SETOF(PCPU_GET(cpuid), &map);
+ CPU_SET(pc->pc_cpuid, &map);
smp_rendezvous_cpus(map, NULL,
dtrace_gethrtime_init_cpu,
diff --git a/sys/cddl/dev/dtrace/i386/dtrace_subr.c b/sys/cddl/dev/dtrace/i386/dtrace_subr.c
index 412fc38..b52097b 100644
--- a/sys/cddl/dev/dtrace/i386/dtrace_subr.c
+++ b/sys/cddl/dev/dtrace/i386/dtrace_subr.c
@@ -413,8 +413,8 @@ dtrace_gethrtime_init(void *arg)
continue;
pc = pcpu_find(i);
- map = PCPU_GET(cpumask);
- CPU_OR(&map, &pc->pc_cpumask);
+ CPU_SETOF(PCPU_GET(cpuid), &map);
+ CPU_SET(pc->pc_cpuid, &map);
smp_rendezvous_cpus(map, NULL,
dtrace_gethrtime_init_cpu,
diff --git a/sys/compat/freebsd32/freebsd32.h b/sys/compat/freebsd32/freebsd32.h
index 560db72..82bdc53 100644
--- a/sys/compat/freebsd32/freebsd32.h
+++ b/sys/compat/freebsd32/freebsd32.h
@@ -58,7 +58,7 @@ struct timespec32 {
#define TS_CP(src,dst,fld) do { \
CP((src).fld,(dst).fld,tv_sec); \
CP((src).fld,(dst).fld,tv_nsec); \
-} while (0);
+} while (0)
struct rusage32 {
struct timeval32 ru_utime;
diff --git a/sys/compat/freebsd32/freebsd32_proto.h b/sys/compat/freebsd32/freebsd32_proto.h
index c10c6a8..21b84e8 100644
--- a/sys/compat/freebsd32/freebsd32_proto.h
+++ b/sys/compat/freebsd32/freebsd32_proto.h
@@ -3,7 +3,7 @@
*
* DO NOT EDIT-- this file is automatically generated.
* $FreeBSD$
- * created from FreeBSD: head/sys/compat/freebsd32/syscalls.master 223166 2011-06-16 22:05:56Z kib
+ * created from FreeBSD
*/
#ifndef _FREEBSD32_SYSPROTO_H_
diff --git a/sys/compat/freebsd32/freebsd32_syscall.h b/sys/compat/freebsd32/freebsd32_syscall.h
index 8903338..19f91be 100644
--- a/sys/compat/freebsd32/freebsd32_syscall.h
+++ b/sys/compat/freebsd32/freebsd32_syscall.h
@@ -3,7 +3,7 @@
*
* DO NOT EDIT-- this file is automatically generated.
* $FreeBSD$
- * created from FreeBSD: head/sys/compat/freebsd32/syscalls.master 223166 2011-06-16 22:05:56Z kib
+ * created from FreeBSD
*/
#define FREEBSD32_SYS_syscall 0
@@ -411,6 +411,8 @@
#define FREEBSD32_SYS_freebsd32_msgctl 511
#define FREEBSD32_SYS_freebsd32_shmctl 512
#define FREEBSD32_SYS_lpathconf 513
+#define FREEBSD32_SYS_cap_new 514
+#define FREEBSD32_SYS_cap_getrights 515
#define FREEBSD32_SYS_cap_enter 516
#define FREEBSD32_SYS_cap_getmode 517
#define FREEBSD32_SYS_freebsd32_pselect 522
diff --git a/sys/compat/freebsd32/freebsd32_syscalls.c b/sys/compat/freebsd32/freebsd32_syscalls.c
index eac2385..8e67e8b 100644
--- a/sys/compat/freebsd32/freebsd32_syscalls.c
+++ b/sys/compat/freebsd32/freebsd32_syscalls.c
@@ -3,7 +3,7 @@
*
* DO NOT EDIT-- this file is automatically generated.
* $FreeBSD$
- * created from FreeBSD: head/sys/compat/freebsd32/syscalls.master 223166 2011-06-16 22:05:56Z kib
+ * created from FreeBSD
*/
const char *freebsd32_syscallnames[] = {
@@ -537,8 +537,8 @@ const char *freebsd32_syscallnames[] = {
"freebsd32_msgctl", /* 511 = freebsd32_msgctl */
"freebsd32_shmctl", /* 512 = freebsd32_shmctl */
"lpathconf", /* 513 = lpathconf */
- "#514", /* 514 = cap_new */
- "#515", /* 515 = cap_getrights */
+ "cap_new", /* 514 = cap_new */
+ "cap_getrights", /* 515 = cap_getrights */
"cap_enter", /* 516 = cap_enter */
"cap_getmode", /* 517 = cap_getmode */
"#518", /* 518 = pdfork */
diff --git a/sys/compat/freebsd32/freebsd32_sysent.c b/sys/compat/freebsd32/freebsd32_sysent.c
index 61d1448..66f42ac 100644
--- a/sys/compat/freebsd32/freebsd32_sysent.c
+++ b/sys/compat/freebsd32/freebsd32_sysent.c
@@ -3,7 +3,7 @@
*
* DO NOT EDIT-- this file is automatically generated.
* $FreeBSD$
- * created from FreeBSD: head/sys/compat/freebsd32/syscalls.master 223166 2011-06-16 22:05:56Z kib
+ * created from FreeBSD
*/
#include "opt_compat.h"
@@ -574,8 +574,8 @@ struct sysent freebsd32_sysent[] = {
{ AS(freebsd32_msgctl_args), (sy_call_t *)lkmressys, AUE_NULL, NULL, 0, 0, 0, SY_THR_ABSENT }, /* 511 = freebsd32_msgctl */
{ AS(freebsd32_shmctl_args), (sy_call_t *)lkmressys, AUE_NULL, NULL, 0, 0, 0, SY_THR_ABSENT }, /* 512 = freebsd32_shmctl */
{ AS(lpathconf_args), (sy_call_t *)lpathconf, AUE_LPATHCONF, NULL, 0, 0, 0, SY_THR_STATIC }, /* 513 = lpathconf */
- { 0, (sy_call_t *)nosys, AUE_NULL, NULL, 0, 0, 0, SY_THR_ABSENT }, /* 514 = cap_new */
- { 0, (sy_call_t *)nosys, AUE_NULL, NULL, 0, 0, 0, SY_THR_ABSENT }, /* 515 = cap_getrights */
+ { AS(cap_new_args), (sy_call_t *)cap_new, AUE_CAP_NEW, NULL, 0, 0, 0, SY_THR_STATIC }, /* 514 = cap_new */
+ { AS(cap_getrights_args), (sy_call_t *)cap_getrights, AUE_CAP_GETRIGHTS, NULL, 0, 0, 0, SY_THR_STATIC }, /* 515 = cap_getrights */
{ 0, (sy_call_t *)cap_enter, AUE_CAP_ENTER, NULL, 0, 0, 0, SY_THR_STATIC }, /* 516 = cap_enter */
{ AS(cap_getmode_args), (sy_call_t *)cap_getmode, AUE_CAP_GETMODE, NULL, 0, 0, 0, SY_THR_STATIC }, /* 517 = cap_getmode */
{ 0, (sy_call_t *)nosys, AUE_NULL, NULL, 0, 0, 0, SY_THR_ABSENT }, /* 518 = pdfork */
diff --git a/sys/compat/freebsd32/freebsd32_systrace_args.c b/sys/compat/freebsd32/freebsd32_systrace_args.c
index 10eea64..39b66fd 100644
--- a/sys/compat/freebsd32/freebsd32_systrace_args.c
+++ b/sys/compat/freebsd32/freebsd32_systrace_args.c
@@ -2918,6 +2918,22 @@ systrace_args(int sysnum, void *params, uint64_t *uarg, int *n_args)
*n_args = 2;
break;
}
+ /* cap_new */
+ case 514: {
+ struct cap_new_args *p = params;
+ iarg[0] = p->fd; /* int */
+ uarg[1] = p->rights; /* u_int64_t */
+ *n_args = 2;
+ break;
+ }
+ /* cap_getrights */
+ case 515: {
+ struct cap_getrights_args *p = params;
+ iarg[0] = p->fd; /* int */
+ uarg[1] = (intptr_t) p->rightsp; /* u_int64_t * */
+ *n_args = 2;
+ break;
+ }
/* cap_enter */
case 516: {
*n_args = 0;
@@ -7873,6 +7889,32 @@ systrace_setargdesc(int sysnum, int ndx, char *desc, size_t descsz)
break;
};
break;
+ /* cap_new */
+ case 514:
+ switch(ndx) {
+ case 0:
+ p = "int";
+ break;
+ case 1:
+ p = "u_int64_t";
+ break;
+ default:
+ break;
+ };
+ break;
+ /* cap_getrights */
+ case 515:
+ switch(ndx) {
+ case 0:
+ p = "int";
+ break;
+ case 1:
+ p = "u_int64_t *";
+ break;
+ default:
+ break;
+ };
+ break;
/* cap_enter */
case 516:
break;
diff --git a/sys/compat/freebsd32/syscalls.master b/sys/compat/freebsd32/syscalls.master
index 3e19298..d4b67ae 100644
--- a/sys/compat/freebsd32/syscalls.master
+++ b/sys/compat/freebsd32/syscalls.master
@@ -957,8 +957,9 @@
512 AUE_SHMCTL NOSTD { int freebsd32_shmctl(int shmid, int cmd, \
struct shmid_ds32 *buf); }
513 AUE_LPATHCONF NOPROTO { int lpathconf(char *path, int name); }
-514 AUE_CAP_NEW UNIMPL cap_new
-515 AUE_CAP_GETRIGHTS UNIMPL cap_getrights
+514 AUE_CAP_NEW NOPROTO { int cap_new(int fd, u_int64_t rights); }
+515 AUE_CAP_GETRIGHTS NOPROTO { int cap_getrights(int fd, \
+ u_int64_t *rightsp); }
516 AUE_CAP_ENTER NOPROTO { int cap_enter(void); }
517 AUE_CAP_GETMODE NOPROTO { int cap_getmode(u_int *modep); }
518 AUE_PDFORK UNIMPL pdfork
diff --git a/sys/compat/linux/linux_ipc.c b/sys/compat/linux/linux_ipc.c
index 97cea53..36223b1 100644
--- a/sys/compat/linux/linux_ipc.c
+++ b/sys/compat/linux/linux_ipc.c
@@ -575,7 +575,15 @@ linux_semctl(struct thread *td, struct linux_semctl_args *args)
return (error);
case LINUX_IPC_INFO:
case LINUX_SEM_INFO:
- bcopy(&seminfo, &linux_seminfo, sizeof(linux_seminfo) );
+ bcopy(&seminfo, &linux_seminfo.semmni, sizeof(linux_seminfo) -
+ sizeof(linux_seminfo.semmap) );
+ /*
+ * Linux does not use the semmap field but populates it with
+ * the defined value from SEMMAP, which really is redefined to
+ * SEMMNS, which they define as SEMMNI * SEMMSL. Try to
+ * simulate this returning our dynamic semmns value.
+ */
+ linux_seminfo.semmap = linux_seminfo.semmns;
/* XXX BSD equivalent?
#define used_semids 10
#define used_sems 10
diff --git a/sys/conf/Makefile.mips b/sys/conf/Makefile.mips
index 55d57e6..ab2b40a 100644
--- a/sys/conf/Makefile.mips
+++ b/sys/conf/Makefile.mips
@@ -50,7 +50,13 @@ HACK_EXTRA_FLAGS=-shared
# is extremely poor, as well as -mno-abicalls to force no ABI usage.
CFLAGS+=${EXTRA_FLAGS} $(ARCH_FLAGS)
HACK_EXTRA_FLAGS+=${EXTRA_FLAGS} $(ARCH_FLAGS)
-TRAMP_EXTRA_FLAGS=${EXTRA_FLAGS} $(ARCH_FLAGS)
+TRAMP_ARCH_FLAGS?=$(ARCH_FLAGS)
+TRAMP_EXTRA_FLAGS=${EXTRA_FLAGS} ${TRAMP_ARCH_FLAGS}
+.if ${MACHINE_ARCH:Mmips64*} != ""
+TRAMP_ELFSIZE=64
+.else
+TRAMP_ELFSIZE=32
+.endif
# XXX hardcoded kernel entry point
ASM_CFLAGS+=${CFLAGS} -D_LOCORE -DLOCORE
@@ -64,11 +70,12 @@ ${KERNEL_KO}.tramp.bin: ${KERNEL_KO} $S/$M/$M/elf_trampoline.c \
sed -e s/${KERNLOADADDR}/${TRAMPLOADADDR}/ -e s/" + SIZEOF_HEADERS"// \
${LDSCRIPT_NAME} > ${LDSCRIPT_NAME}.tramp.noheader
${CC} -O -nostdlib -I. -I$S ${TRAMP_EXTRA_FLAGS} ${TRAMP_LDFLAGS} -Xlinker \
- -T -Xlinker ${LDSCRIPT_NAME}.tramp.noheader \
- -DKERNNAME="\"${KERNEL_KO}.tmp\"" $S/$M/$M/elf_trampoline.c \
- $S/$M/$M/inckern.S -o ${KERNEL_KO}.tramp.noheader
- ${OBJCOPY} -S -O binary ${KERNEL_KO}.tramp.noheader \
- ${KERNEL_KO}.tramp.bin \
+ -T -Xlinker ${LDSCRIPT_NAME}.tramp.noheader \
+ -DKERNNAME="\"${KERNEL_KO}.tmp\"" -DELFSIZE=${TRAMP_ELFSIZE} \
+ $S/$M/$M/elf_trampoline.c $S/$M/$M/inckern.S \
+ -o ${KERNEL_KO}.tramp.elf
+ ${OBJCOPY} -S -O binary ${KERNEL_KO}.tramp.elf \
+ ${KERNEL_KO}.tramp.bin
%BEFORE_DEPEND
@@ -83,7 +90,7 @@ ${KERNEL_KO}.tramp.bin: ${KERNEL_KO} $S/$M/$M/elf_trampoline.c \
%CLEAN
CLEAN+= ${LDSCRIPT_NAME} ${LDSCRIPT_NAME}.tramp.noheader \
- ${KERNEL_KO}.tramp.noheader ${KERNEL_KO}.tramp.bin
+ ${KERNEL_KO}.tramp.elf ${KERNEL_KO}.tramp.bin
${LDSCRIPT_NAME}: $S/conf/${LDSCRIPT_NAME}
sed s/KERNLOADADDR/${KERNLOADADDR}/g $S/conf/${LDSCRIPT_NAME} \
diff --git a/sys/conf/NOTES b/sys/conf/NOTES
index 835c30b..d3951e3 100644
--- a/sys/conf/NOTES
+++ b/sys/conf/NOTES
@@ -1162,7 +1162,8 @@ options MAC_STUB
options MAC_TEST
# Support for Capsicum
-options CAPABILITY_MODE
+options CAPABILITIES # fine-grained rights on file descriptors
+options CAPABILITY_MODE # sandboxes with no global namespace access
#####################################################################
@@ -2252,14 +2253,14 @@ device sound
# conjunction with snd_sbc.
# snd_sbc: Creative SoundBlaster ISA PnP/non-PnP.
# Supports ESS and Avance ISA chips as well.
-# snd_spicds: SPI codec driver, needed by Envy24/Envy24HT drivers.
# snd_solo: ESS Solo-1x PCI.
+# snd_spicds: SPI codec driver, needed by Envy24/Envy24HT drivers.
# snd_t4dwave: Trident 4DWave DX/NX PCI, Sis 7018 PCI and Acer Labs
# M5451 PCI.
+# snd_uaudio: USB audio.
# snd_via8233: VIA VT8233x PCI.
# snd_via82c686: VIA VT82C686A PCI.
# snd_vibes: S3 Sonicvibes PCI.
-# snd_uaudio: USB audio.
device snd_ad1816
device snd_als4000
@@ -2289,10 +2290,10 @@ device snd_sbc
device snd_solo
device snd_spicds
device snd_t4dwave
+device snd_uaudio
device snd_via8233
device snd_via82c686
device snd_vibes
-device snd_uaudio
# For non-PnP sound cards:
hint.pcm.0.at="isa"
@@ -2832,9 +2833,6 @@ options VERBOSE_SYSINIT
#####################################################################
# SYSV IPC KERNEL PARAMETERS
#
-# Maximum number of entries in a semaphore map.
-options SEMMAP=31
-
# Maximum number of System V semaphores that can be used on the system at
# one time.
options SEMMNI=11
diff --git a/sys/conf/files b/sys/conf/files
index 853c0c8..0dc814e 100644
--- a/sys/conf/files
+++ b/sys/conf/files
@@ -1918,6 +1918,7 @@ dev/usb/net/if_kue.c optional kue
dev/usb/net/if_mos.c optional mos
dev/usb/net/if_rue.c optional rue
dev/usb/net/if_udav.c optional udav
+dev/usb/net/if_usie.c optional usie
dev/usb/net/usb_ethernet.c optional aue | axe | cdce | cue | kue | mos | \
rue | udav
dev/usb/net/uhso.c optional uhso
@@ -1970,8 +1971,8 @@ dev/usb/serial/uvscom.c optional uvscom
dev/usb/serial/usb_serial.c optional ucom | u3g | uark | ubsa | ubser | \
uchcom | ucycom | ufoma | uftdi | \
ugensa | uipaq | umcs | umct | \
- umodem | umoscom | uplcom | uslcom | \
- uvisor | uvscom
+ umodem | umoscom | uplcom | usie | \
+ uslcom | uvisor | uvscom
#
# USB misc drivers
#
diff --git a/sys/conf/files.i386 b/sys/conf/files.i386
index 41a1772..a19b93c 100644
--- a/sys/conf/files.i386
+++ b/sys/conf/files.i386
@@ -412,7 +412,7 @@ x86/x86/io_apic.c optional apic
x86/x86/local_apic.c optional apic
x86/x86/mca.c standard
x86/x86/mptable.c optional apic native
-x86/x86/mptable_pci.c optional apic pci
+x86/x86/mptable_pci.c optional apic native pci
x86/x86/msi.c optional apic pci
x86/x86/nexus.c standard
x86/x86/tsc.c standard
diff --git a/sys/conf/files.mips b/sys/conf/files.mips
index 7ad93a5..6438c49 100644
--- a/sys/conf/files.mips
+++ b/sys/conf/files.mips
@@ -106,4 +106,5 @@ dev/siba/siba_pcib.c optional siba pci
dev/hwpmc/hwpmc_mips.c optional hwpmc
dev/hwpmc/hwpmc_mips24k.c optional hwpmc
+dev/rt/if_rt.c optional rt
dev/nvram2env/nvram2env.c optional nvram2env
diff --git a/sys/conf/options b/sys/conf/options
index 35c0dfc..9f1ac80 100644
--- a/sys/conf/options
+++ b/sys/conf/options
@@ -63,6 +63,7 @@ SYSCTL_DEBUG opt_sysctl.h
ADAPTIVE_LOCKMGRS
ALQ
AUDIT opt_global.h
+CAPABILITIES opt_capsicum.h
CAPABILITY_MODE opt_capsicum.h
CODA_COMPAT_5 opt_coda.h
COMPAT_43 opt_compat.h
@@ -163,7 +164,6 @@ MSGMNI opt_sysvipc.h
MSGSEG opt_sysvipc.h
MSGSSZ opt_sysvipc.h
MSGTQL opt_sysvipc.h
-SEMMAP opt_sysvipc.h
SEMMNI opt_sysvipc.h
SEMMNS opt_sysvipc.h
SEMMNU opt_sysvipc.h
@@ -426,7 +426,6 @@ SLIP_IFF_OPTS opt_slip.h
TCPDEBUG
TCP_OFFLOAD_DISABLE opt_inet.h #Disable code to dispatch tcp offloading
TCP_SIGNATURE opt_inet.h
-TCP_SORECEIVE_STREAM opt_inet.h
VLAN_ARRAY opt_vlan.h
XBONEHACK
FLOWTABLE opt_route.h
diff --git a/sys/conf/options.mips b/sys/conf/options.mips
index c3ba6b9..0384283 100644
--- a/sys/conf/options.mips
+++ b/sys/conf/options.mips
@@ -36,6 +36,7 @@ CPU_HAVEFPU opt_global.h
CPU_SB1 opt_global.h
CPU_CNMIPS opt_global.h
CPU_RMI opt_global.h
+CPU_NLM opt_global.h
ISA_MIPS1 opt_cputype.h
ISA_MIPS3 opt_cputype.h
@@ -70,3 +71,11 @@ OCTEON_BOARD_CAPK_0100ND opt_cvmx.h
# Options that control the Atheros SoC peripherals
#
ARGE_DEBUG opt_global.h
+
+#
+# Options that control the Ralink RT305xF Etherenet MAC.
+#
+IF_RT_DEBUG opt_if_rt.h
+IF_RT_PHY_SUPPORT opt_if_rt.h
+IF_RT_RING_DATA_COUNT opt_if_rt.h
+
diff --git a/sys/dev/acpica/acpi_pcib_acpi.c b/sys/dev/acpica/acpi_pcib_acpi.c
index 73b2f70..99e3f1f 100644
--- a/sys/dev/acpica/acpi_pcib_acpi.c
+++ b/sys/dev/acpica/acpi_pcib_acpi.c
@@ -32,6 +32,7 @@ __FBSDID("$FreeBSD$");
#include <sys/param.h>
#include <sys/bus.h>
#include <sys/kernel.h>
+#include <sys/limits.h>
#include <sys/malloc.h>
#include <sys/module.h>
#include <sys/rman.h>
@@ -62,6 +63,9 @@ struct acpi_hpcib_softc {
int ap_bus; /* bios-assigned bus number */
ACPI_BUFFER ap_prt; /* interrupt routing table */
+#ifdef NEW_PCIB
+ struct pcib_host_resources ap_host_res;
+#endif
};
static int acpi_pcib_acpi_probe(device_t bus);
@@ -87,6 +91,11 @@ static struct resource *acpi_pcib_acpi_alloc_resource(device_t dev,
device_t child, int type, int *rid,
u_long start, u_long end, u_long count,
u_int flags);
+#ifdef NEW_PCIB
+static int acpi_pcib_acpi_adjust_resource(device_t dev,
+ device_t child, int type, struct resource *r,
+ u_long start, u_long end);
+#endif
static device_method_t acpi_pcib_acpi_methods[] = {
/* Device interface */
@@ -101,7 +110,11 @@ static device_method_t acpi_pcib_acpi_methods[] = {
DEVMETHOD(bus_read_ivar, acpi_pcib_read_ivar),
DEVMETHOD(bus_write_ivar, acpi_pcib_write_ivar),
DEVMETHOD(bus_alloc_resource, acpi_pcib_acpi_alloc_resource),
+#ifdef NEW_PCIB
+ DEVMETHOD(bus_adjust_resource, acpi_pcib_acpi_adjust_resource),
+#else
DEVMETHOD(bus_adjust_resource, bus_generic_adjust_resource),
+#endif
DEVMETHOD(bus_release_resource, bus_generic_release_resource),
DEVMETHOD(bus_activate_resource, bus_generic_activate_resource),
DEVMETHOD(bus_deactivate_resource, bus_generic_deactivate_resource),
@@ -149,6 +162,113 @@ acpi_pcib_acpi_probe(device_t dev)
return (0);
}
+#ifdef NEW_PCIB
+static ACPI_STATUS
+acpi_pcib_producer_handler(ACPI_RESOURCE *res, void *context)
+{
+ struct acpi_hpcib_softc *sc;
+ UINT64 length, min, max;
+ u_int flags;
+ int error, type;
+
+ sc = context;
+ switch (res->Type) {
+ case ACPI_RESOURCE_TYPE_START_DEPENDENT:
+ case ACPI_RESOURCE_TYPE_END_DEPENDENT:
+ panic("host bridge has depenedent resources");
+ case ACPI_RESOURCE_TYPE_ADDRESS16:
+ case ACPI_RESOURCE_TYPE_ADDRESS32:
+ case ACPI_RESOURCE_TYPE_ADDRESS64:
+ case ACPI_RESOURCE_TYPE_EXTENDED_ADDRESS64:
+ if (res->Data.Address.ProducerConsumer != ACPI_PRODUCER)
+ break;
+ switch (res->Type) {
+ case ACPI_RESOURCE_TYPE_ADDRESS16:
+ min = res->Data.Address16.Minimum;
+ max = res->Data.Address16.Maximum;
+ length = res->Data.Address16.AddressLength;
+ break;
+ case ACPI_RESOURCE_TYPE_ADDRESS32:
+ min = res->Data.Address32.Minimum;
+ max = res->Data.Address32.Maximum;
+ length = res->Data.Address32.AddressLength;
+ break;
+ case ACPI_RESOURCE_TYPE_ADDRESS64:
+ min = res->Data.Address64.Minimum;
+ max = res->Data.Address64.Maximum;
+ length = res->Data.Address64.AddressLength;
+ break;
+ default:
+ KASSERT(res->Type ==
+ ACPI_RESOURCE_TYPE_EXTENDED_ADDRESS64,
+ ("should never happen"));
+ min = res->Data.ExtAddress64.Minimum;
+ max = res->Data.ExtAddress64.Maximum;
+ length = res->Data.ExtAddress64.AddressLength;
+ break;
+ }
+ if (length == 0 ||
+ res->Data.Address.MinAddressFixed != ACPI_ADDRESS_FIXED ||
+ res->Data.Address.MaxAddressFixed != ACPI_ADDRESS_FIXED)
+ break;
+ flags = 0;
+ switch (res->Data.Address.ResourceType) {
+ case ACPI_MEMORY_RANGE:
+ type = SYS_RES_MEMORY;
+ if (res->Type != ACPI_RESOURCE_TYPE_EXTENDED_ADDRESS64) {
+ if (res->Data.Address.Info.Mem.Caching ==
+ ACPI_PREFETCHABLE_MEMORY)
+ flags |= RF_PREFETCHABLE;
+ } else {
+ /*
+ * XXX: Parse prefetch flag out of
+ * TypeSpecific.
+ */
+ }
+ break;
+ case ACPI_IO_RANGE:
+ type = SYS_RES_IOPORT;
+ break;
+#ifdef PCI_RES_BUS
+ case ACPI_BUS_NUMBER_RANGE:
+ type = PCI_RES_BUS;
+ break;
+#endif
+ default:
+ return (AE_OK);
+ }
+
+ if (min + length - 1 != max)
+ device_printf(sc->ap_dev,
+ "Length mismatch for %d range: %jx vs %jx\n", type,
+ (uintmax_t)max - min + 1, (uintmax_t)length);
+#ifdef __i386__
+ if (min > ULONG_MAX) {
+ device_printf(sc->ap_dev,
+ "Ignoring %d range above 4GB (%#jx-%#jx)\n",
+ type, (uintmax_t)min, (uintmax_t)max);
+ break;
+ }
+ if (max > ULONG_MAX) {
+ device_printf(sc->ap_dev,
+ "Truncating end of %d range above 4GB (%#jx-%#jx)\n",
+ type, (uintmax_t)min, (uintmax_t)max);
+ max = ULONG_MAX;
+ }
+#endif
+ error = pcib_host_res_decodes(&sc->ap_host_res, type, min, max,
+ flags);
+ if (error)
+ panic("Failed to manage %d range (%#jx-%#jx): %d",
+ type, (uintmax_t)min, (uintmax_t)max, error);
+ break;
+ default:
+ break;
+ }
+ return (AE_OK);
+}
+#endif
+
static int
acpi_pcib_acpi_attach(device_t dev)
{
@@ -179,6 +299,22 @@ acpi_pcib_acpi_attach(device_t dev)
sc->ap_segment = 0;
}
+#ifdef NEW_PCIB
+ /*
+ * Determine which address ranges this bridge decodes and setup
+ * resource managers for those ranges.
+ */
+ if (pcib_host_res_init(sc->ap_dev, &sc->ap_host_res) != 0)
+ panic("failed to init hostb resources");
+ if (!acpi_disabled("hostres")) {
+ status = AcpiWalkResources(sc->ap_handle, "_CRS",
+ acpi_pcib_producer_handler, sc);
+ if (ACPI_FAILURE(status) && status != AE_NOT_FOUND)
+ device_printf(sc->ap_dev, "failed to parse resources: %s\n",
+ AcpiFormatException(status));
+ }
+#endif
+
/*
* Get our base bus number by evaluating _BBN.
* If this doesn't work, we assume we're bus number 0.
@@ -361,10 +497,33 @@ struct resource *
acpi_pcib_acpi_alloc_resource(device_t dev, device_t child, int type, int *rid,
u_long start, u_long end, u_long count, u_int flags)
{
+#ifdef NEW_PCIB
+ struct acpi_hpcib_softc *sc;
+#endif
#if defined(__i386__) || defined(__amd64__)
start = hostb_alloc_start(type, start, end, count);
#endif
+
+#ifdef NEW_PCIB
+ sc = device_get_softc(dev);
+ return (pcib_host_res_alloc(&sc->ap_host_res, child, type, rid, start, end,
+ count, flags));
+#else
return (bus_generic_alloc_resource(dev, child, type, rid, start, end,
count, flags));
+#endif
+}
+
+#ifdef NEW_PCIB
+int
+acpi_pcib_acpi_adjust_resource(device_t dev, device_t child, int type,
+ struct resource *r, u_long start, u_long end)
+{
+ struct acpi_hpcib_softc *sc;
+
+ sc = device_get_softc(dev);
+ return (pcib_host_res_adjust(&sc->ap_host_res, child, type, r, start,
+ end));
}
+#endif
diff --git a/sys/dev/adb/adb_kbd.c b/sys/dev/adb/adb_kbd.c
index 22ab97d..e66b5b2 100644
--- a/sys/dev/adb/adb_kbd.c
+++ b/sys/dev/adb/adb_kbd.c
@@ -747,6 +747,7 @@ static int akbd_ioctl(keyboard_t *kbd, u_long cmd, caddr_t data)
break;
case PIO_KEYMAP:
+ case OPIO_KEYMAP:
case PIO_KEYMAPENT:
case PIO_DEADKEYMAP:
default:
diff --git a/sys/dev/ahci/ahci.c b/sys/dev/ahci/ahci.c
index 136011c..0bc094e 100644
--- a/sys/dev/ahci/ahci.c
+++ b/sys/dev/ahci/ahci.c
@@ -195,6 +195,7 @@ static struct {
{0x91201b4b, 0x00, "Marvell 88SE912x", AHCI_Q_EDGEIS|AHCI_Q_NOBSYRES},
{0x91231b4b, 0x11, "Marvell 88SE912x", AHCI_Q_NOBSYRES|AHCI_Q_ALTSIG},
{0x91231b4b, 0x00, "Marvell 88SE912x", AHCI_Q_EDGEIS|AHCI_Q_SATA2|AHCI_Q_NOBSYRES},
+ {0x91251b4b, 0x00, "Marvell 88SE9125", AHCI_Q_NOBSYRES},
{0x91721b4b, 0x00, "Marvell 88SE9172", AHCI_Q_NOBSYRES},
{0x91821b4b, 0x00, "Marvell 88SE9182", AHCI_Q_NOBSYRES},
{0x06201103, 0x00, "HighPoint RocketRAID 620", AHCI_Q_NOBSYRES},
diff --git a/sys/dev/aic7xxx/aicasm/aicasm.c b/sys/dev/aic7xxx/aicasm/aicasm.c
index 6c88f90..1b88ba0 100644
--- a/sys/dev/aic7xxx/aicasm/aicasm.c
+++ b/sys/dev/aic7xxx/aicasm/aicasm.c
@@ -53,7 +53,7 @@
#include <sysexits.h>
#include <unistd.h>
-#if linux
+#if defined(__linux__) || defined(__GLIBC__)
#include <endian.h>
#else
#include <machine/endian.h>
diff --git a/sys/dev/aic7xxx/aicasm/aicasm.h b/sys/dev/aic7xxx/aicasm/aicasm.h
index 440cb49..0cc1c2b 100644
--- a/sys/dev/aic7xxx/aicasm/aicasm.h
+++ b/sys/dev/aic7xxx/aicasm/aicasm.h
@@ -42,11 +42,7 @@
* $FreeBSD$
*/
-#ifdef __linux__
-#include "../queue.h"
-#else
#include <sys/queue.h>
-#endif
#ifndef TRUE
#define TRUE 1
diff --git a/sys/dev/aic7xxx/aicasm/aicasm_gram.y b/sys/dev/aic7xxx/aicasm/aicasm_gram.y
index d50d2b9..e4ee307 100644
--- a/sys/dev/aic7xxx/aicasm/aicasm_gram.y
+++ b/sys/dev/aic7xxx/aicasm/aicasm_gram.y
@@ -51,12 +51,7 @@
#include <stdlib.h>
#include <string.h>
#include <sysexits.h>
-
-#ifdef __linux__
-#include "../queue.h"
-#else
#include <sys/queue.h>
-#endif
#include "aicasm.h"
#include "aicasm_symbol.h"
diff --git a/sys/dev/aic7xxx/aicasm/aicasm_macro_gram.y b/sys/dev/aic7xxx/aicasm/aicasm_macro_gram.y
index 95e20f1..923cd5d 100644
--- a/sys/dev/aic7xxx/aicasm/aicasm_macro_gram.y
+++ b/sys/dev/aic7xxx/aicasm/aicasm_macro_gram.y
@@ -51,12 +51,7 @@
#include <stdlib.h>
#include <string.h>
#include <sysexits.h>
-
-#ifdef __linux__
-#include "../queue.h"
-#else
#include <sys/queue.h>
-#endif
#include "aicasm.h"
#include "aicasm_symbol.h"
diff --git a/sys/dev/aic7xxx/aicasm/aicasm_macro_scan.l b/sys/dev/aic7xxx/aicasm/aicasm_macro_scan.l
index ad06507..ac14c12 100644
--- a/sys/dev/aic7xxx/aicasm/aicasm_macro_scan.l
+++ b/sys/dev/aic7xxx/aicasm/aicasm_macro_scan.l
@@ -51,11 +51,7 @@
#include <stdio.h>
#include <string.h>
#include <sysexits.h>
-#ifdef __linux__
-#include "../queue.h"
-#else
#include <sys/queue.h>
-#endif
#include "aicasm.h"
#include "aicasm_symbol.h"
diff --git a/sys/dev/aic7xxx/aicasm/aicasm_scan.l b/sys/dev/aic7xxx/aicasm/aicasm_scan.l
index 2821862..acc74a4 100644
--- a/sys/dev/aic7xxx/aicasm/aicasm_scan.l
+++ b/sys/dev/aic7xxx/aicasm/aicasm_scan.l
@@ -51,11 +51,7 @@
#include <stdio.h>
#include <string.h>
#include <sysexits.h>
-#ifdef __linux__
-#include "../queue.h"
-#else
#include <sys/queue.h>
-#endif
#include "aicasm.h"
#include "aicasm_symbol.h"
diff --git a/sys/dev/aic7xxx/aicasm/aicasm_symbol.c b/sys/dev/aic7xxx/aicasm/aicasm_symbol.c
index 2e5d5c4..53a2c5d 100644
--- a/sys/dev/aic7xxx/aicasm/aicasm_symbol.c
+++ b/sys/dev/aic7xxx/aicasm/aicasm_symbol.c
@@ -43,11 +43,11 @@
*/
#include <sys/types.h>
-
-#ifdef __linux__
-#include "aicdb.h"
-#else
+#include <sys/param.h>
+#ifdef BSD
#include <db.h>
+#else
+#include <db_185.h>
#endif
#include <ctype.h>
#include <fcntl.h>
diff --git a/sys/dev/aic7xxx/aicasm/aicasm_symbol.h b/sys/dev/aic7xxx/aicasm/aicasm_symbol.h
index 7cdace8..3242152 100644
--- a/sys/dev/aic7xxx/aicasm/aicasm_symbol.h
+++ b/sys/dev/aic7xxx/aicasm/aicasm_symbol.h
@@ -42,11 +42,7 @@
* $FreeBSD$
*/
-#ifdef __linux__
-#include "../queue.h"
-#else
#include <sys/queue.h>
-#endif
typedef enum {
UNINITIALIZED,
diff --git a/sys/dev/ath/ah_osdep.c b/sys/dev/ath/ah_osdep.c
index cfcfc4a..cceb9a4 100644
--- a/sys/dev/ath/ah_osdep.c
+++ b/sys/dev/ath/ah_osdep.c
@@ -127,7 +127,9 @@ ath_hal_ether_sprintf(const u_int8_t *mac)
void
DO_HALDEBUG(struct ath_hal *ah, u_int mask, const char* fmt, ...)
{
- if ((mask == HAL_DEBUG_UNMASKABLE) || (ah->ah_config.ah_debug & mask)) {
+ if ((mask == HAL_DEBUG_UNMASKABLE) ||
+ (ah->ah_config.ah_debug & mask) ||
+ (ath_hal_debug & mask)) {
__va_list ap;
va_start(ap, fmt);
ath_hal_vprintf(ah, fmt, ap);
diff --git a/sys/dev/atkbdc/atkbd.c b/sys/dev/atkbdc/atkbd.c
index f2f5d74..e58ffc7 100644
--- a/sys/dev/atkbdc/atkbd.c
+++ b/sys/dev/atkbdc/atkbd.c
@@ -982,6 +982,7 @@ atkbd_ioctl(keyboard_t *kbd, u_long cmd, caddr_t arg)
return error;
case PIO_KEYMAP: /* set keyboard translation table */
+ case OPIO_KEYMAP: /* set keyboard translation table (compat) */
case PIO_KEYMAPENT: /* set keyboard translation table entry */
case PIO_DEADKEYMAP: /* set accent key translation table */
state->ks_accents = 0;
diff --git a/sys/dev/cas/if_cas.c b/sys/dev/cas/if_cas.c
index e39b1b4..858c8bc 100644
--- a/sys/dev/cas/if_cas.c
+++ b/sys/dev/cas/if_cas.c
@@ -203,7 +203,7 @@ cas_attach(struct cas_softc *sc)
IFQ_SET_READY(&ifp->if_snd);
callout_init_mtx(&sc->sc_tick_ch, &sc->sc_mtx, 0);
- callout_init(&sc->sc_rx_ch, 1);
+ callout_init_mtx(&sc->sc_rx_ch, &sc->sc_mtx, 0);
/* Create local taskq. */
TASK_INIT(&sc->sc_intr_task, 0, cas_intr_task, sc);
TASK_INIT(&sc->sc_tx_task, 1, cas_tx_task, ifp);
@@ -759,7 +759,7 @@ cas_reset_rx(struct cas_softc *sc)
* Resetting while DMA is in progress can cause a bus hang, so we
* disable DMA first.
*/
- cas_disable_rx(sc);
+ (void)cas_disable_rx(sc);
CAS_WRITE_4(sc, CAS_RX_CONF, 0);
CAS_BARRIER(sc, CAS_RX_CONF, 4,
BUS_SPACE_BARRIER_READ | BUS_SPACE_BARRIER_WRITE);
@@ -771,7 +771,7 @@ cas_reset_rx(struct cas_softc *sc)
((sc->sc_flags & CAS_SERDES) != 0 ? CAS_RESET_PCS_DIS : 0));
CAS_BARRIER(sc, CAS_RESET, 4,
BUS_SPACE_BARRIER_READ | BUS_SPACE_BARRIER_WRITE);
- if (!cas_bitwait(sc, CAS_RESET, CAS_RESET_RX | CAS_RESET_TX, 0)) {
+ if (!cas_bitwait(sc, CAS_RESET, CAS_RESET_RX, 0)) {
device_printf(sc->sc_dev, "cannot reset receiver\n");
return (1);
}
@@ -786,7 +786,7 @@ cas_reset_tx(struct cas_softc *sc)
* Resetting while DMA is in progress can cause a bus hang, so we
* disable DMA first.
*/
- cas_disable_tx(sc);
+ (void)cas_disable_tx(sc);
CAS_WRITE_4(sc, CAS_TX_CONF, 0);
CAS_BARRIER(sc, CAS_TX_CONF, 4,
BUS_SPACE_BARRIER_READ | BUS_SPACE_BARRIER_WRITE);
@@ -798,7 +798,7 @@ cas_reset_tx(struct cas_softc *sc)
((sc->sc_flags & CAS_SERDES) != 0 ? CAS_RESET_PCS_DIS : 0));
CAS_BARRIER(sc, CAS_RESET, 4,
BUS_SPACE_BARRIER_READ | BUS_SPACE_BARRIER_WRITE);
- if (!cas_bitwait(sc, CAS_RESET, CAS_RESET_RX | CAS_RESET_TX, 0)) {
+ if (!cas_bitwait(sc, CAS_RESET, CAS_RESET_TX, 0)) {
device_printf(sc->sc_dev, "cannot reset transmitter\n");
return (1);
}
@@ -813,7 +813,10 @@ cas_disable_rx(struct cas_softc *sc)
CAS_READ_4(sc, CAS_MAC_RX_CONF) & ~CAS_MAC_RX_CONF_EN);
CAS_BARRIER(sc, CAS_MAC_RX_CONF, 4,
BUS_SPACE_BARRIER_READ | BUS_SPACE_BARRIER_WRITE);
- return (cas_bitwait(sc, CAS_MAC_RX_CONF, CAS_MAC_RX_CONF_EN, 0));
+ if (cas_bitwait(sc, CAS_MAC_RX_CONF, CAS_MAC_RX_CONF_EN, 0))
+ return (1);
+ device_printf(sc->sc_dev, "cannot disable RX MAC\n");
+ return (0);
}
static int
@@ -824,7 +827,10 @@ cas_disable_tx(struct cas_softc *sc)
CAS_READ_4(sc, CAS_MAC_TX_CONF) & ~CAS_MAC_TX_CONF_EN);
CAS_BARRIER(sc, CAS_MAC_TX_CONF, 4,
BUS_SPACE_BARRIER_READ | BUS_SPACE_BARRIER_WRITE);
- return (cas_bitwait(sc, CAS_MAC_TX_CONF, CAS_MAC_TX_CONF_EN, 0));
+ if (cas_bitwait(sc, CAS_MAC_TX_CONF, CAS_MAC_TX_CONF_EN, 0))
+ return (1);
+ device_printf(sc->sc_dev, "cannot disable TX MAC\n");
+ return (0);
}
static inline void
@@ -987,7 +993,6 @@ cas_init_locked(struct cas_softc *sc)
cas_init_regs(sc);
/* step 5. RX MAC registers & counters */
- cas_setladrf(sc);
/* step 6 & 7. Program Ring Base Addresses. */
CAS_WRITE_4(sc, CAS_TX_DESC3_BASE_HI,
@@ -1132,23 +1137,20 @@ cas_init_locked(struct cas_softc *sc)
/* step 11. Configure Media. */
/* step 12. RX_MAC Configuration Register */
- v = CAS_READ_4(sc, CAS_MAC_RX_CONF) & ~CAS_MAC_RX_CONF_STRPPAD;
- v |= CAS_MAC_RX_CONF_EN | CAS_MAC_RX_CONF_STRPFCS;
- CAS_WRITE_4(sc, CAS_MAC_RX_CONF, 0);
- CAS_BARRIER(sc, CAS_MAC_RX_CONF, 4,
- BUS_SPACE_BARRIER_READ | BUS_SPACE_BARRIER_WRITE);
- if (!cas_bitwait(sc, CAS_MAC_RX_CONF, CAS_MAC_RX_CONF_EN, 0))
- device_printf(sc->sc_dev, "cannot configure RX MAC\n");
- CAS_WRITE_4(sc, CAS_MAC_RX_CONF, v);
+ v = CAS_READ_4(sc, CAS_MAC_RX_CONF);
+ v &= ~(CAS_MAC_RX_CONF_STRPPAD | CAS_MAC_RX_CONF_EN);
+ v |= CAS_MAC_RX_CONF_STRPFCS;
+ sc->sc_mac_rxcfg = v;
+ /*
+ * Clear the RX filter and reprogram it. This will also set the
+ * current RX MAC configuration and enable it.
+ */
+ cas_setladrf(sc);
/* step 13. TX_MAC Configuration Register */
v = CAS_READ_4(sc, CAS_MAC_TX_CONF);
v |= CAS_MAC_TX_CONF_EN;
- CAS_WRITE_4(sc, CAS_MAC_TX_CONF, 0);
- CAS_BARRIER(sc, CAS_MAC_TX_CONF, 4,
- BUS_SPACE_BARRIER_READ | BUS_SPACE_BARRIER_WRITE);
- if (!cas_bitwait(sc, CAS_MAC_TX_CONF, CAS_MAC_TX_CONF_EN, 0))
- device_printf(sc->sc_dev, "cannot configure TX MAC\n");
+ (void)cas_disable_tx(sc);
CAS_WRITE_4(sc, CAS_MAC_TX_CONF, v);
/* step 14. Issue Transmit Pending command. */
@@ -1597,7 +1599,7 @@ cas_rint_timeout(void *arg)
{
struct cas_softc *sc = arg;
- CAS_LOCK_ASSERT(sc, MA_NOTOWNED);
+ CAS_LOCK_ASSERT(sc, MA_OWNED);
cas_rint(sc);
}
@@ -1612,7 +1614,7 @@ cas_rint(struct cas_softc *sc)
uint32_t rxhead;
u_int idx, idx2, len, off, skip;
- CAS_LOCK_ASSERT(sc, MA_NOTOWNED);
+ CAS_LOCK_ASSERT(sc, MA_OWNED);
callout_stop(&sc->sc_rx_ch);
@@ -1740,9 +1742,11 @@ cas_rint(struct cas_softc *sc)
cas_rxcksum(m, CAS_GET(word4,
CAS_RC4_TCP_CSUM));
/* Pass it on. */
+ CAS_UNLOCK(sc);
(*ifp->if_input)(ifp, m);
+ CAS_LOCK(sc);
} else
- ifp->if_ierrors++;
+ ifp->if_iqdrops++;
if ((word1 & CAS_RC1_RELEASE_HDR) != 0 &&
refcount_release(&rxds->rxds_refcount) != 0)
@@ -1836,9 +1840,11 @@ cas_rint(struct cas_softc *sc)
cas_rxcksum(m, CAS_GET(word4,
CAS_RC4_TCP_CSUM));
/* Pass it on. */
+ CAS_UNLOCK(sc);
(*ifp->if_input)(ifp, m);
+ CAS_LOCK(sc);
} else
- ifp->if_ierrors++;
+ ifp->if_iqdrops++;
if ((word1 & CAS_RC1_RELEASE_DATA) != 0 &&
refcount_release(&rxds->rxds_refcount) != 0)
@@ -1874,7 +1880,7 @@ cas_free(void *arg1, void *arg2)
{
struct cas_rxdsoft *rxds;
struct cas_softc *sc;
- u_int idx;
+ u_int idx, locked;
#if __FreeBSD_version < 800016
rxds = arg2;
@@ -1892,17 +1898,18 @@ cas_free(void *arg1, void *arg2)
* NB: this function can be called via m_freem(9) within
* this driver!
*/
-
+ if ((locked = CAS_LOCK_OWNED(sc)) == 0)
+ CAS_LOCK(sc);
cas_add_rxdesc(sc, idx);
+ if (locked == 0)
+ CAS_UNLOCK(sc);
}
static inline void
cas_add_rxdesc(struct cas_softc *sc, u_int idx)
{
- u_int locked;
- if ((locked = CAS_LOCK_OWNED(sc)) == 0)
- CAS_LOCK(sc);
+ CAS_LOCK_ASSERT(sc, MA_OWNED);
bus_dmamap_sync(sc->sc_rdmatag, sc->sc_rxdsoft[idx].rxds_dmamap,
BUS_DMASYNC_PREREAD);
@@ -1920,9 +1927,6 @@ cas_add_rxdesc(struct cas_softc *sc, u_int idx)
CAS_WRITE_4(sc, CAS_RX_KICK,
(sc->sc_rxdptr + CAS_NRXDESC - 4) & CAS_NRXDESC_MASK);
}
-
- if (locked == 0)
- CAS_UNLOCK(sc);
}
static void
@@ -1930,7 +1934,7 @@ cas_eint(struct cas_softc *sc, u_int status)
{
struct ifnet *ifp = sc->sc_ifp;
- CAS_LOCK_ASSERT(sc, MA_NOTOWNED);
+ CAS_LOCK_ASSERT(sc, MA_OWNED);
ifp->if_ierrors++;
@@ -1947,7 +1951,7 @@ cas_eint(struct cas_softc *sc, u_int status)
printf("\n");
ifp->if_drv_flags &= ~IFF_DRV_RUNNING;
- cas_init(sc);
+ cas_init_locked(sc);
if (!IFQ_DRV_IS_EMPTY(&ifp->if_snd))
taskqueue_enqueue(sc->sc_tq, &sc->sc_tx_task);
}
@@ -1984,6 +1988,7 @@ cas_intr_task(void *arg, int pending __unused)
if (__predict_false((status & CAS_INTR_SUMMARY) == 0))
goto done;
+ CAS_LOCK(sc);
#ifdef CAS_DEBUG
CTR4(KTR_CAS, "%s: %s: cplt %x, status %x",
device_get_name(sc->sc_dev), __func__,
@@ -2023,6 +2028,7 @@ cas_intr_task(void *arg, int pending __unused)
(CAS_INTR_TX_TAG_ERR | CAS_INTR_RX_TAG_ERR |
CAS_INTR_RX_LEN_MMATCH | CAS_INTR_PCI_ERROR_INT)) != 0)) {
cas_eint(sc, status);
+ CAS_UNLOCK(sc);
return;
}
@@ -2030,7 +2036,7 @@ cas_intr_task(void *arg, int pending __unused)
status2 = CAS_READ_4(sc, CAS_MAC_TX_STATUS);
if ((status2 &
(CAS_MAC_TX_UNDERRUN | CAS_MAC_TX_MAX_PKT_ERR)) != 0)
- sc->sc_ifp->if_oerrors++;
+ ifp->if_oerrors++;
else if ((status2 & ~CAS_MAC_TX_FRAME_XMTD) != 0)
device_printf(sc->sc_dev,
"MAC TX fault, status %x\n", status2);
@@ -2039,7 +2045,7 @@ cas_intr_task(void *arg, int pending __unused)
if (__predict_false(status & CAS_INTR_RX_MAC_INT)) {
status2 = CAS_READ_4(sc, CAS_MAC_RX_STATUS);
if ((status2 & CAS_MAC_RX_OVERFLOW) != 0)
- sc->sc_ifp->if_ierrors++;
+ ifp->if_ierrors++;
else if ((status2 & ~CAS_MAC_RX_FRAME_RCVD) != 0)
device_printf(sc->sc_dev,
"MAC RX fault, status %x\n", status2);
@@ -2059,16 +2065,15 @@ cas_intr_task(void *arg, int pending __unused)
}
if ((status &
- (CAS_INTR_TX_INT_ME | CAS_INTR_TX_ALL | CAS_INTR_TX_DONE)) != 0) {
- CAS_LOCK(sc);
+ (CAS_INTR_TX_INT_ME | CAS_INTR_TX_ALL | CAS_INTR_TX_DONE)) != 0)
cas_tint(sc);
- CAS_UNLOCK(sc);
- }
- if ((ifp->if_drv_flags & IFF_DRV_RUNNING) == 0)
+ if ((ifp->if_drv_flags & IFF_DRV_RUNNING) == 0) {
+ CAS_UNLOCK(sc);
return;
- else if (!IFQ_DRV_IS_EMPTY(&ifp->if_snd))
+ } else if (!IFQ_DRV_IS_EMPTY(&ifp->if_snd))
taskqueue_enqueue(sc->sc_tq, &sc->sc_tx_task);
+ CAS_UNLOCK(sc);
status = CAS_READ_4(sc, CAS_STATUS_ALIAS);
if (__predict_false((status & CAS_INTR_SUMMARY) != 0)) {
@@ -2330,8 +2335,8 @@ cas_mii_statchg(device_t dev)
* the Cassini+ ASIC Specification.
*/
- rxcfg = CAS_READ_4(sc, CAS_MAC_RX_CONF);
- rxcfg &= ~(CAS_MAC_RX_CONF_EN | CAS_MAC_RX_CONF_CARR);
+ rxcfg = sc->sc_mac_rxcfg;
+ rxcfg &= ~CAS_MAC_RX_CONF_CARR;
txcfg = CAS_MAC_TX_CONF_EN_IPG0 | CAS_MAC_TX_CONF_NGU |
CAS_MAC_TX_CONF_NGUL;
if ((IFM_OPTIONS(sc->sc_mii->mii_media_active) & IFM_FDX) != 0)
@@ -2340,17 +2345,9 @@ cas_mii_statchg(device_t dev)
rxcfg |= CAS_MAC_RX_CONF_CARR;
txcfg |= CAS_MAC_TX_CONF_CARR;
}
- CAS_WRITE_4(sc, CAS_MAC_TX_CONF, 0);
- CAS_BARRIER(sc, CAS_MAC_TX_CONF, 4,
- BUS_SPACE_BARRIER_READ | BUS_SPACE_BARRIER_WRITE);
- if (!cas_bitwait(sc, CAS_MAC_TX_CONF, CAS_MAC_TX_CONF_EN, 0))
- device_printf(sc->sc_dev, "cannot disable TX MAC\n");
+ (void)cas_disable_tx(sc);
CAS_WRITE_4(sc, CAS_MAC_TX_CONF, txcfg);
- CAS_WRITE_4(sc, CAS_MAC_RX_CONF, 0);
- CAS_BARRIER(sc, CAS_MAC_RX_CONF, 4,
- BUS_SPACE_BARRIER_READ | BUS_SPACE_BARRIER_WRITE);
- if (!cas_bitwait(sc, CAS_MAC_RX_CONF, CAS_MAC_RX_CONF_EN, 0))
- device_printf(sc->sc_dev, "cannot disable RX MAC\n");
+ (void)cas_disable_rx(sc);
CAS_WRITE_4(sc, CAS_MAC_RX_CONF, rxcfg);
v = CAS_READ_4(sc, CAS_MAC_CTRL_CONF) &
@@ -2408,7 +2405,8 @@ cas_mii_statchg(device_t dev)
v |= CAS_MAC_XIF_CONF_FDXLED;
CAS_WRITE_4(sc, CAS_MAC_XIF_CONF, v);
- if ((sc->sc_ifp->if_drv_flags & IFF_DRV_RUNNING) != 0 &&
+ sc->sc_mac_rxcfg = rxcfg;
+ if ((ifp->if_drv_flags & IFF_DRV_RUNNING) != 0 &&
(sc->sc_flags & CAS_LINK) != 0) {
CAS_WRITE_4(sc, CAS_MAC_TX_CONF,
txcfg | CAS_MAC_TX_CONF_EN);
@@ -2522,23 +2520,21 @@ cas_setladrf(struct cas_softc *sc)
CAS_LOCK_ASSERT(sc, MA_OWNED);
- /* Get the current RX configuration. */
- v = CAS_READ_4(sc, CAS_MAC_RX_CONF);
-
/*
- * Turn off promiscuous mode, promiscuous group mode (all multicast),
- * and hash filter. Depending on the case, the right bit will be
- * enabled.
+ * Turn off the RX MAC and the hash filter as required by the Sun
+ * Cassini programming restrictions.
*/
- v &= ~(CAS_MAC_RX_CONF_PROMISC | CAS_MAC_RX_CONF_HFILTER |
- CAS_MAC_RX_CONF_PGRP);
-
+ v = sc->sc_mac_rxcfg & ~(CAS_MAC_RX_CONF_HFILTER |
+ CAS_MAC_RX_CONF_EN);
CAS_WRITE_4(sc, CAS_MAC_RX_CONF, v);
CAS_BARRIER(sc, CAS_MAC_RX_CONF, 4,
BUS_SPACE_BARRIER_READ | BUS_SPACE_BARRIER_WRITE);
- if (!cas_bitwait(sc, CAS_MAC_RX_CONF, CAS_MAC_RX_CONF_HFILTER, 0))
- device_printf(sc->sc_dev, "cannot disable RX hash filter\n");
+ if (!cas_bitwait(sc, CAS_MAC_RX_CONF, CAS_MAC_RX_CONF_HFILTER |
+ CAS_MAC_RX_CONF_EN, 0))
+ device_printf(sc->sc_dev,
+ "cannot disable RX MAC or hash filter\n");
+ v &= ~(CAS_MAC_RX_CONF_PROMISC | CAS_MAC_RX_CONF_PGRP);
if ((ifp->if_flags & IFF_PROMISC) != 0) {
v |= CAS_MAC_RX_CONF_PROMISC;
goto chipit;
@@ -2584,7 +2580,8 @@ cas_setladrf(struct cas_softc *sc)
hash[i]);
chipit:
- CAS_WRITE_4(sc, CAS_MAC_RX_CONF, v);
+ sc->sc_mac_rxcfg = v;
+ CAS_WRITE_4(sc, CAS_MAC_RX_CONF, v | CAS_MAC_RX_CONF_EN);
}
static int cas_pci_attach(device_t dev);
diff --git a/sys/dev/cas/if_casvar.h b/sys/dev/cas/if_casvar.h
index fa2e6af..10b81dd 100644
--- a/sys/dev/cas/if_casvar.h
+++ b/sys/dev/cas/if_casvar.h
@@ -196,6 +196,8 @@ struct cas_softc {
u_int sc_rxcptr; /* next ready RX completion */
u_int sc_rxdptr; /* next ready RX descriptor */
+ uint32_t sc_mac_rxcfg; /* RX MAC conf. % CAS_MAC_RX_CONF_EN */
+
int sc_ifflags;
};
diff --git a/sys/dev/e1000/if_igb.c b/sys/dev/e1000/if_igb.c
index 972b745..ff2e424 100644
--- a/sys/dev/e1000/if_igb.c
+++ b/sys/dev/e1000/if_igb.c
@@ -1041,8 +1041,8 @@ igb_ioctl(struct ifnet *ifp, u_long command, caddr_t data)
struct ifreq *ifr = (struct ifreq *)data;
#if defined(INET) || defined(INET6)
struct ifaddr *ifa = (struct ifaddr *)data;
- bool avoid_reset = FALSE;
#endif
+ bool avoid_reset = FALSE;
int error = 0;
if (adapter->in_detach)
@@ -1058,7 +1058,6 @@ igb_ioctl(struct ifnet *ifp, u_long command, caddr_t data)
if (ifa->ifa_addr->sa_family == AF_INET6)
avoid_reset = TRUE;
#endif
-#if defined(INET) || defined(INET6)
/*
** Calling init results in link renegotiation,
** so we avoid doing it when possible.
@@ -1067,10 +1066,11 @@ igb_ioctl(struct ifnet *ifp, u_long command, caddr_t data)
ifp->if_flags |= IFF_UP;
if (!(ifp->if_drv_flags & IFF_DRV_RUNNING))
igb_init(adapter);
+#ifdef INET
if (!(ifp->if_flags & IFF_NOARP))
arp_ifinit(ifp, ifa);
- } else
#endif
+ } else
error = ether_ioctl(ifp, command, data);
break;
case SIOCSIFMTU:
diff --git a/sys/dev/gem/if_gem.c b/sys/dev/gem/if_gem.c
index 7f44f22..6f53eae 100644
--- a/sys/dev/gem/if_gem.c
+++ b/sys/dev/gem/if_gem.c
@@ -121,7 +121,7 @@ static void gem_rint_timeout(void *arg);
#endif
static inline void gem_rxcksum(struct mbuf *m, uint64_t flags);
static void gem_rxdrain(struct gem_softc *sc);
-static void gem_setladrf(struct gem_softc *sc, u_int enable);
+static void gem_setladrf(struct gem_softc *sc);
static void gem_start(struct ifnet *ifp);
static void gem_start_locked(struct ifnet *ifp);
static void gem_stop(struct ifnet *ifp, int disable);
@@ -626,7 +626,9 @@ gem_reset(struct gem_softc *sc)
gem_reset_tx(sc);
/* Do a full reset. */
- GEM_BANK2_WRITE_4(sc, GEM_RESET, GEM_RESET_RX | GEM_RESET_TX);
+ GEM_BANK2_WRITE_4(sc, GEM_RESET, GEM_RESET_RX | GEM_RESET_TX |
+ (sc->sc_variant == GEM_SUN_ERI ? GEM_ERI_CACHE_LINE_SIZE <<
+ GEM_RESET_CLSZ_SHFT : 0));
GEM_BANK2_BARRIER(sc, GEM_RESET, 4,
BUS_SPACE_BARRIER_READ | BUS_SPACE_BARRIER_WRITE);
if (!GEM_BANK2_BITWAIT(sc, GEM_RESET, GEM_RESET_RX | GEM_RESET_TX, 0))
@@ -716,11 +718,12 @@ gem_reset_rx(struct gem_softc *sc)
DELAY(5000);
/* Reset the ERX. */
- GEM_BANK2_WRITE_4(sc, GEM_RESET, GEM_RESET_RX);
+ GEM_BANK2_WRITE_4(sc, GEM_RESET, GEM_RESET_RX |
+ (sc->sc_variant == GEM_SUN_ERI ? GEM_ERI_CACHE_LINE_SIZE <<
+ GEM_RESET_CLSZ_SHFT : 0));
GEM_BANK2_BARRIER(sc, GEM_RESET, 4,
BUS_SPACE_BARRIER_READ | BUS_SPACE_BARRIER_WRITE);
- if (!GEM_BANK2_BITWAIT(sc, GEM_RESET, GEM_RESET_RX | GEM_RESET_TX,
- 0)) {
+ if (!GEM_BANK2_BITWAIT(sc, GEM_RESET, GEM_RESET_RX, 0)) {
device_printf(sc->sc_dev, "cannot reset receiver\n");
return (1);
}
@@ -769,24 +772,22 @@ gem_reset_rxdma(struct gem_softc *sc)
GEM_RX_CONFIG_CXM_START_SHFT) |
(GEM_THRSH_1024 << GEM_RX_CONFIG_FIFO_THRS_SHIFT) |
(ETHER_ALIGN << GEM_RX_CONFIG_FBOFF_SHFT));
- /* Adjust for the SBus clock probably isn't worth the fuzz. */
+ /* Adjusting for the SBus clock probably isn't worth the fuzz. */
GEM_BANK1_WRITE_4(sc, GEM_RX_BLANKING,
((6 * (sc->sc_flags & GEM_PCI66) != 0 ? 2 : 1) <<
GEM_RX_BLANKING_TIME_SHIFT) | 6);
GEM_BANK1_WRITE_4(sc, GEM_RX_PAUSE_THRESH,
(3 * sc->sc_rxfifosize / 256) |
((sc->sc_rxfifosize / 256) << 12));
- /*
- * Clear the RX filter and reprogram it. This will also set the
- * current RX MAC configuration.
- */
- gem_setladrf(sc, 0);
GEM_BANK1_WRITE_4(sc, GEM_RX_CONFIG,
GEM_BANK1_READ_4(sc, GEM_RX_CONFIG) | GEM_RX_CONFIG_RXDMA_EN);
GEM_BANK1_WRITE_4(sc, GEM_MAC_RX_MASK,
GEM_MAC_RX_DONE | GEM_MAC_RX_FRAME_CNT);
- GEM_BANK1_WRITE_4(sc, GEM_MAC_RX_CONFIG,
- sc->sc_mac_rxcfg | GEM_MAC_RX_ENABLE);
+ /*
+ * Clear the RX filter and reprogram it. This will also set the
+ * current RX MAC configuration and enable it.
+ */
+ gem_setladrf(sc);
}
static int
@@ -808,11 +809,12 @@ gem_reset_tx(struct gem_softc *sc)
DELAY(5000);
/* Finally, reset the ETX. */
- GEM_BANK2_WRITE_4(sc, GEM_RESET, GEM_RESET_TX);
+ GEM_BANK2_WRITE_4(sc, GEM_RESET, GEM_RESET_TX |
+ (sc->sc_variant == GEM_SUN_ERI ? GEM_ERI_CACHE_LINE_SIZE <<
+ GEM_RESET_CLSZ_SHFT : 0));
GEM_BANK2_BARRIER(sc, GEM_RESET, 4,
BUS_SPACE_BARRIER_READ | BUS_SPACE_BARRIER_WRITE);
- if (!GEM_BANK2_BITWAIT(sc, GEM_RESET, GEM_RESET_RX | GEM_RESET_TX,
- 0)) {
+ if (!GEM_BANK2_BITWAIT(sc, GEM_RESET, GEM_RESET_TX, 0)) {
device_printf(sc->sc_dev, "cannot reset transmitter\n");
return (1);
}
@@ -945,8 +947,10 @@ gem_init_locked(struct gem_softc *sc)
GEM_LOCK_ASSERT(sc, MA_OWNED);
+#ifdef notyet
if ((ifp->if_drv_flags & IFF_DRV_RUNNING) != 0)
return;
+#endif
#ifdef GEM_DEBUG
CTR2(KTR_GEM, "%s: %s: calling stop", device_get_name(sc->sc_dev),
@@ -979,7 +983,6 @@ gem_init_locked(struct gem_softc *sc)
gem_init_regs(sc);
/* step 5. RX MAC registers & counters */
- gem_setladrf(sc, 0);
/* step 6 & 7. Program Descriptor Ring Base Addresses. */
/* NOTE: we use only 32-bit DMA addresses here. */
@@ -1051,7 +1054,7 @@ gem_init_locked(struct gem_softc *sc)
(ETHER_ALIGN << GEM_RX_CONFIG_FBOFF_SHFT) |
GEM_RX_CONFIG_RXDMA_EN);
- /* Adjust for the SBus clock probably isn't worth the fuzz. */
+ /* Adjusting for the SBus clock probably isn't worth the fuzz. */
GEM_BANK1_WRITE_4(sc, GEM_RX_BLANKING,
((6 * (sc->sc_flags & GEM_PCI66) != 0 ? 2 : 1) <<
GEM_RX_BLANKING_TIME_SHIFT) | 6);
@@ -1068,10 +1071,14 @@ gem_init_locked(struct gem_softc *sc)
/* step 12. RX_MAC Configuration Register */
v = GEM_BANK1_READ_4(sc, GEM_MAC_RX_CONFIG);
- v |= GEM_MAC_RX_ENABLE | GEM_MAC_RX_STRIP_CRC;
- (void)gem_disable_rx(sc);
- sc->sc_mac_rxcfg = v & ~GEM_MAC_RX_ENABLE;
- GEM_BANK1_WRITE_4(sc, GEM_MAC_RX_CONFIG, v);
+ v &= ~GEM_MAC_RX_ENABLE;
+ v |= GEM_MAC_RX_STRIP_CRC;
+ sc->sc_mac_rxcfg = v;
+ /*
+ * Clear the RX filter and reprogram it. This will also set the
+ * current RX MAC configuration and enable it.
+ */
+ gem_setladrf(sc);
/* step 13. TX_MAC Configuration Register */
v = GEM_BANK1_READ_4(sc, GEM_MAC_TX_CONFIG);
@@ -2152,7 +2159,7 @@ gem_ioctl(struct ifnet *ifp, u_long cmd, caddr_t data)
if ((ifp->if_drv_flags & IFF_DRV_RUNNING) != 0 &&
((ifp->if_flags ^ sc->sc_ifflags) &
(IFF_ALLMULTI | IFF_PROMISC)) != 0)
- gem_setladrf(sc, 1);
+ gem_setladrf(sc);
else
gem_init_locked(sc);
} else if ((ifp->if_drv_flags & IFF_DRV_RUNNING) != 0)
@@ -2170,7 +2177,7 @@ gem_ioctl(struct ifnet *ifp, u_long cmd, caddr_t data)
case SIOCDELMULTI:
GEM_LOCK(sc);
if ((ifp->if_drv_flags & IFF_DRV_RUNNING) != 0)
- gem_setladrf(sc, 1);
+ gem_setladrf(sc);
GEM_UNLOCK(sc);
break;
case SIOCGIFMEDIA:
@@ -2195,7 +2202,7 @@ gem_ioctl(struct ifnet *ifp, u_long cmd, caddr_t data)
}
static void
-gem_setladrf(struct gem_softc *sc, u_int enable)
+gem_setladrf(struct gem_softc *sc)
{
struct ifnet *ifp = sc->sc_ifp;
struct ifmultiaddr *inm;
@@ -2265,7 +2272,5 @@ gem_setladrf(struct gem_softc *sc, u_int enable)
chipit:
sc->sc_mac_rxcfg = v;
- if (enable)
- v |= GEM_MAC_RX_ENABLE;
- GEM_BANK1_WRITE_4(sc, GEM_MAC_RX_CONFIG, v);
+ GEM_BANK1_WRITE_4(sc, GEM_MAC_RX_CONFIG, v | GEM_MAC_RX_ENABLE);
}
diff --git a/sys/dev/gem/if_gem_pci.c b/sys/dev/gem/if_gem_pci.c
index cfea337..c5e1acd 100644
--- a/sys/dev/gem/if_gem_pci.c
+++ b/sys/dev/gem/if_gem_pci.c
@@ -177,6 +177,10 @@ gem_pci_attach(device_t dev)
if (pci_get_intpin(dev) == 0)
pci_set_intpin(dev, 1);
+ /* Set the PCI latency timer for Sun ERIs. */
+ if (sc->sc_variant == GEM_SUN_ERI)
+ pci_write_config(dev, PCIR_LATTIMER, GEM_ERI_LATENCY_TIMER, 1);
+
sc->sc_dev = dev;
sc->sc_flags |= GEM_PCI;
diff --git a/sys/dev/gem/if_gemreg.h b/sys/dev/gem/if_gemreg.h
index effcaf5..394fd90 100644
--- a/sys/dev/gem/if_gemreg.h
+++ b/sys/dev/gem/if_gemreg.h
@@ -35,7 +35,7 @@
/* register definitions for Apple GMAC, Sun ERI and Sun GEM */
/*
- * First bank: this registers live at the start of the PCI
+ * First bank: these registers live at the start of the PCI
* mapping, and at the start of the second bank of the SBus
* version.
*/
@@ -93,7 +93,7 @@
"b\x10MAC_CONTROL\0b\x11MIF\0b\x12IBERR\0\0"
/*
- * Second bank: this registers live at offset 0x1000 of the PCI
+ * Second bank: these registers live at offset 0x1000 of the PCI
* mapping, and at the start of the first bank of the SBus
* version.
*/
@@ -128,7 +128,7 @@
/* GEM_PCI_BIF_DIAG register bits */
#define GEN_PCI_BIF_DIAG_BC_SM 0x007f0000 /* burst ctrl. state machine */
-#define GEN_PCI_BIF_DIAG_SM 0xff000000 /* BIF state machine */
+#define GEN_PCI_BIF_DIAG_SM 0xff000000 /* BIF state machine */
/* Bits in GEM_SBUS_CONFIG register */
#define GEM_SBUS_CFG_BURST_32 0x00000001 /* 32 byte bursts */
@@ -147,6 +147,8 @@
#define GEM_RESET_TX 0x00000001 /* Reset TX half. */
#define GEM_RESET_RX 0x00000002 /* Reset RX half. */
#define GEM_RESET_PCI_RSTOUT 0x00000004 /* Force PCI RSTOUT#. */
+#define GEM_RESET_CLSZ_MASK 0x00ff0000 /* ERI cache line size */
+#define GEM_RESET_CLSZ_SHFT 16
/* The rest of the registers live in the first bank again. */
@@ -586,6 +588,10 @@
#define GEM_PHYAD_INTERNAL 1
#define GEM_PHYAD_EXTERNAL 0
+/* Miscellaneous */
+#define GEM_ERI_CACHE_LINE_SIZE 16
+#define GEM_ERI_LATENCY_TIMER 64
+
/*
* descriptor table structures
*/
@@ -594,7 +600,11 @@ struct gem_desc {
uint64_t gd_addr;
};
-/* Transmit flags */
+/*
+ * Transmit flags
+ * GEM_TD_CXSUM_ENABLE, GEM_TD_CXSUM_START, GEM_TD_CXSUM_STUFF and
+ * GEM_TD_INTERRUPT_ME only need to be set in the first descriptor of a group.
+ */
#define GEM_TD_BUFSIZE 0x0000000000007fffULL
#define GEM_TD_CXSUM_START 0x00000000001f8000ULL /* Cxsum start offset */
#define GEM_TD_CXSUM_STARTSHFT 15
@@ -605,10 +615,6 @@ struct gem_desc {
#define GEM_TD_START_OF_PACKET 0x0000000080000000ULL
#define GEM_TD_INTERRUPT_ME 0x0000000100000000ULL /* Interrupt me now */
#define GEM_TD_NO_CRC 0x0000000200000000ULL /* do not insert crc */
-/*
- * Only need to set GEM_TD_CXSUM_ENABLE, GEM_TD_CXSUM_STUFF,
- * GEM_TD_CXSUM_START, and GEM_TD_INTERRUPT_ME in 1st descriptor of a group.
- */
/* Receive flags */
#define GEM_RD_CHECKSUM 0x000000000000ffffULL /* is the complement */
@@ -618,7 +624,6 @@ struct gem_desc {
#define GEM_RD_HASH_PASS 0x1000000000000000ULL /* passed hash filter */
#define GEM_RD_ALTERNATE_MAC 0x2000000000000000ULL /* Alternate MAC adrs */
#define GEM_RD_BAD_CRC 0x4000000000000000ULL
-
#define GEM_RD_BUFSHIFT 16
#define GEM_RD_BUFLEN(x) (((x) & GEM_RD_BUFSIZE) >> GEM_RD_BUFSHIFT)
diff --git a/sys/dev/iicbus/if_ic.c b/sys/dev/iicbus/if_ic.c
index 6ac6401..fd072c1 100644
--- a/sys/dev/iicbus/if_ic.c
+++ b/sys/dev/iicbus/if_ic.c
@@ -308,6 +308,7 @@ icintr(device_t dev, int event, char *ptr)
top = m_devget(sc->ic_ifbuf + ICHDRLEN, len, 0, sc->ic_ifp, 0);
if (top) {
mtx_unlock(&sc->ic_lock);
+ M_SETFIB(top, sc->ic_ifp->if_fib);
netisr_dispatch(NETISR_IP, top);
mtx_lock(&sc->ic_lock);
}
diff --git a/sys/dev/kbd/kbd.c b/sys/dev/kbd/kbd.c
index 21818cb..01e262e 100644
--- a/sys/dev/kbd/kbd.c
+++ b/sys/dev/kbd/kbd.c
@@ -837,13 +837,12 @@ static int fkey_change_ok(fkeytab_t *, fkeyarg_t *, struct thread *);
int
genkbd_commonioctl(keyboard_t *kbd, u_long cmd, caddr_t arg)
{
-#ifndef KBD_DISABLE_KEYMAP_LOAD
keymap_t *mapp;
-#endif
+ okeymap_t *omapp;
keyarg_t *keyp;
fkeyarg_t *fkeyp;
int s;
- int i;
+ int i, j;
int error;
s = spltty();
@@ -874,14 +873,39 @@ genkbd_commonioctl(keyboard_t *kbd, u_long cmd, caddr_t arg)
sizeof(keymap_t));
splx(s);
return (error);
+ case OGIO_KEYMAP: /* get keyboard translation table (compat) */
+ mapp = kbd->kb_keymap;
+ omapp = (okeymap_t *)arg;
+ omapp->n_keys = mapp->n_keys;
+ for (i = 0; i < NUM_KEYS; i++) {
+ for (j = 0; j < NUM_STATES; j++)
+ omapp->key[i].map[j] =
+ mapp->key[i].map[j];
+ omapp->key[i].spcl = mapp->key[i].spcl;
+ omapp->key[i].flgs = mapp->key[i].flgs;
+ }
+ return (0);
case PIO_KEYMAP: /* set keyboard translation table */
+ case OPIO_KEYMAP: /* set keyboard translation table (compat) */
#ifndef KBD_DISABLE_KEYMAP_LOAD
mapp = malloc(sizeof *mapp, M_TEMP, M_NOWAIT);
- error = copyin(*(void **)arg, mapp, sizeof *mapp);
- if (error != 0) {
- splx(s);
- free(mapp, M_TEMP);
- return (error);
+ if (cmd == OPIO_KEYMAP) {
+ omapp = (okeymap_t *)arg;
+ mapp->n_keys = omapp->n_keys;
+ for (i = 0; i < NUM_KEYS; i++) {
+ for (j = 0; j < NUM_STATES; j++)
+ mapp->key[i].map[j] =
+ omapp->key[i].map[j];
+ mapp->key[i].spcl = omapp->key[i].spcl;
+ mapp->key[i].flgs = omapp->key[i].flgs;
+ }
+ } else {
+ error = copyin(*(void **)arg, mapp, sizeof *mapp);
+ if (error != 0) {
+ splx(s);
+ free(mapp, M_TEMP);
+ return (error);
+ }
}
error = keymap_change_ok(kbd->kb_keymap, mapp, curthread);
diff --git a/sys/dev/kbdmux/kbdmux.c b/sys/dev/kbdmux/kbdmux.c
index 64d5c24..a21b37c 100644
--- a/sys/dev/kbdmux/kbdmux.c
+++ b/sys/dev/kbdmux/kbdmux.c
@@ -1198,6 +1198,7 @@ kbdmux_ioctl(keyboard_t *kbd, u_long cmd, caddr_t arg)
break;
case PIO_KEYMAP: /* set keyboard translation table */
+ case OPIO_KEYMAP: /* set keyboard translation table (compat) */
case PIO_KEYMAPENT: /* set keyboard translation table entry */
case PIO_DEADKEYMAP: /* set accent key translation table */
KBDMUX_LOCK(state);
diff --git a/sys/dev/lmc/if_lmc.c b/sys/dev/lmc/if_lmc.c
index 604e8df..d5fb9ba 100644
--- a/sys/dev/lmc/if_lmc.c
+++ b/sys/dev/lmc/if_lmc.c
@@ -2527,6 +2527,7 @@ lmc_raw_input(struct ifnet *ifp, struct mbuf *mbuf)
{
softc_t *sc = IFP2SC(ifp);
+ M_SETFIB(mbuf, ifp->if_fib);
# if INET
if (mbuf->m_data[0]>>4 == 4)
netisr_dispatch(NETISR_IP, mbuf);
diff --git a/sys/dev/md/md.c b/sys/dev/md/md.c
index c488728..078eca8 100644
--- a/sys/dev/md/md.c
+++ b/sys/dev/md/md.c
@@ -75,6 +75,7 @@
#include <sys/namei.h>
#include <sys/proc.h>
#include <sys/queue.h>
+#include <sys/sbuf.h>
#include <sys/sched.h>
#include <sys/sf_buf.h>
#include <sys/sysctl.h>
diff --git a/sys/dev/mfi/mfi.c b/sys/dev/mfi/mfi.c
index 1962648..f9bfffe 100644
--- a/sys/dev/mfi/mfi.c
+++ b/sys/dev/mfi/mfi.c
@@ -260,8 +260,12 @@ mfi_transition_firmware(struct mfi_softc *sc)
case MFI_FWSTATE_FLUSH_CACHE:
max_wait = 20;
break;
+ case MFI_FWSTATE_BOOT_MESSAGE_PENDING:
+ MFI_WRITE4(sc, MFI_IDB, MFI_FWINIT_HOTPLUG);
+ max_wait = 10;
+ break;
default:
- device_printf(sc->mfi_dev,"Unknown firmware state %d\n",
+ device_printf(sc->mfi_dev,"Unknown firmware state %#x\n",
fw_state);
return (ENXIO);
}
@@ -273,7 +277,7 @@ mfi_transition_firmware(struct mfi_softc *sc)
break;
}
if (fw_state == cur_state) {
- device_printf(sc->mfi_dev, "firmware stuck in state "
+ device_printf(sc->mfi_dev, "Firmware stuck in state "
"%#x\n", fw_state);
return (ENXIO);
}
@@ -1149,7 +1153,8 @@ mfi_aen_complete(struct mfi_command *cm)
if (sc->mfi_aen_cm == NULL)
return;
- if (sc->mfi_aen_cm->cm_aen_abort || hdr->cmd_status == 0xff) {
+ if (sc->mfi_aen_cm->cm_aen_abort ||
+ hdr->cmd_status == MFI_STAT_INVALID_STATUS) {
sc->mfi_aen_cm->cm_aen_abort = 0;
aborted = 1;
} else {
@@ -1405,7 +1410,7 @@ mfi_bio_complete(struct mfi_command *cm)
hdr = &cm->cm_frame->header;
sc = cm->cm_sc;
- if ((hdr->cmd_status != 0) || (hdr->scsi_status != 0)) {
+ if ((hdr->cmd_status != MFI_STAT_OK) || (hdr->scsi_status != 0)) {
bio->bio_flags |= BIO_ERROR;
bio->bio_error = EIO;
device_printf(sc->mfi_dev, "I/O error, status= %d "
@@ -1549,7 +1554,7 @@ mfi_send_frame(struct mfi_softc *sc, struct mfi_command *cm)
cm->cm_timestamp = time_uptime;
mfi_enqueue_busy(cm);
} else {
- hdr->cmd_status = 0xff;
+ hdr->cmd_status = MFI_STAT_INVALID_STATUS;
hdr->flags |= MFI_FRAME_DONT_POST_IN_REPLY_QUEUE;
}
@@ -1574,14 +1579,14 @@ mfi_send_frame(struct mfi_softc *sc, struct mfi_command *cm)
return (0);
/* This is a polled command, so busy-wait for it to complete. */
- while (hdr->cmd_status == 0xff) {
+ while (hdr->cmd_status == MFI_STAT_INVALID_STATUS) {
DELAY(1000);
tm -= 1;
if (tm <= 0)
break;
}
- if (hdr->cmd_status == 0xff) {
+ if (hdr->cmd_status == MFI_STAT_INVALID_STATUS) {
device_printf(sc->mfi_dev, "Frame %p timed out "
"command 0x%X\n", hdr, cm->cm_frame->dcmd.opcode);
return (ETIMEDOUT);
diff --git a/sys/dev/mfi/mfireg.h b/sys/dev/mfi/mfireg.h
index efee827..f005c37 100644
--- a/sys/dev/mfi/mfireg.h
+++ b/sys/dev/mfi/mfireg.h
@@ -112,6 +112,7 @@ __FBSDID("$FreeBSD$");
#define MFI_FWSTATE_WAIT_HANDSHAKE 0x60000000
#define MFI_FWSTATE_FW_INIT_2 0x70000000
#define MFI_FWSTATE_DEVICE_SCAN 0x80000000
+#define MFI_FWSTATE_BOOT_MESSAGE_PENDING 0x90000000
#define MFI_FWSTATE_FLUSH_CACHE 0xa0000000
#define MFI_FWSTATE_READY 0xb0000000
#define MFI_FWSTATE_OPERATIONAL 0xc0000000
@@ -127,6 +128,7 @@ __FBSDID("$FreeBSD$");
#define MFI_FWINIT_READY 0x00000002 /* Move from operational to ready */
#define MFI_FWINIT_MFIMODE 0x00000004 /* unknown */
#define MFI_FWINIT_CLEAR_HANDSHAKE 0x00000008 /* Respond to WAIT_HANDSHAKE */
+#define MFI_FWINIT_HOTPLUG 0x00000010
/* MFI Commands */
typedef enum {
diff --git a/sys/dev/mpt/mpt.h b/sys/dev/mpt/mpt.h
index 47af5ba..d12c307 100644
--- a/sys/dev/mpt/mpt.h
+++ b/sys/dev/mpt/mpt.h
@@ -721,11 +721,9 @@ struct mpt_softc {
* DMA Mapping Stuff
*/
struct resource * pci_reg; /* Register map for chip */
- int pci_mem_rid; /* Resource ID */
bus_space_tag_t pci_st; /* Bus tag for registers */
bus_space_handle_t pci_sh; /* Bus handle for registers */
/* PIO versions of above. */
- int pci_pio_rid;
struct resource * pci_pio_reg;
bus_space_tag_t pci_pio_st;
bus_space_handle_t pci_pio_sh;
diff --git a/sys/dev/mpt/mpt_pci.c b/sys/dev/mpt/mpt_pci.c
index a3cb611..f7201b6 100644
--- a/sys/dev/mpt/mpt_pci.c
+++ b/sys/dev/mpt/mpt_pci.c
@@ -193,8 +193,6 @@ __FBSDID("$FreeBSD$");
#define PCIM_CMD_SERRESPEN 0x0100
#endif
-
-
static int mpt_pci_probe(device_t);
static int mpt_pci_attach(device_t);
static void mpt_free_bus_resources(struct mpt_softc *mpt);
@@ -362,17 +360,17 @@ mpt_set_options(struct mpt_softc *mpt)
mpt->cfg_role = tval;
mpt->do_cfg_role = 1;
}
-
tval = 0;
mpt->msi_enable = 0;
- if (resource_int_value(device_get_name(mpt->dev),
- device_get_unit(mpt->dev), "msi_enable", &tval) == 0 && tval == 1) {
+ if (mpt->is_sas)
mpt->msi_enable = 1;
+ if (resource_int_value(device_get_name(mpt->dev),
+ device_get_unit(mpt->dev), "msi_enable", &tval) == 0) {
+ mpt->msi_enable = tval;
}
}
#endif
-
static void
mpt_link_peer(struct mpt_softc *mpt)
{
@@ -411,7 +409,6 @@ mpt_unlink_peer(struct mpt_softc *mpt)
}
}
-
static int
mpt_pci_attach(device_t dev)
{
@@ -522,9 +519,9 @@ mpt_pci_attach(device_t dev)
* certain reset operations (but must be disabled for
* some cards otherwise).
*/
- mpt->pci_pio_rid = PCIR_BAR(mpt_io_bar);
+ mpt_io_bar = PCIR_BAR(mpt_io_bar);
mpt->pci_pio_reg = bus_alloc_resource_any(dev, SYS_RES_IOPORT,
- &mpt->pci_pio_rid, RF_ACTIVE);
+ &mpt_io_bar, RF_ACTIVE);
if (mpt->pci_pio_reg == NULL) {
device_printf(dev, "unable to map registers in PIO mode\n");
goto bad;
@@ -533,9 +530,9 @@ mpt_pci_attach(device_t dev)
mpt->pci_pio_sh = rman_get_bushandle(mpt->pci_pio_reg);
/* Allocate kernel virtual memory for the 9x9's Mem0 region */
- mpt->pci_mem_rid = PCIR_BAR(mpt_mem_bar);
+ mpt_mem_bar = PCIR_BAR(mpt_mem_bar);
mpt->pci_reg = bus_alloc_resource_any(dev, SYS_RES_MEMORY,
- &mpt->pci_mem_rid, RF_ACTIVE);
+ &mpt_mem_bar, RF_ACTIVE);
if (mpt->pci_reg == NULL) {
device_printf(dev, "Unable to memory map registers.\n");
if (mpt->is_sas) {
@@ -575,7 +572,7 @@ mpt_pci_attach(device_t dev)
}
}
mpt->pci_irq = bus_alloc_resource_any(dev, SYS_RES_IRQ, &iqd,
- RF_ACTIVE | RF_SHAREABLE);
+ RF_ACTIVE | (mpt->pci_msi_count ? 0 : RF_SHAREABLE));
if (mpt->pci_irq == NULL) {
device_printf(dev, "could not allocate interrupt\n");
goto bad;
@@ -594,7 +591,6 @@ mpt_pci_attach(device_t dev)
}
/* Allocate dma memory */
-/* XXX JGibbs -Should really be done based on IOCFacts. */
if (mpt_dma_mem_alloc(mpt)) {
mpt_prt(mpt, "Could not allocate DMA memory\n");
goto bad;
@@ -660,13 +656,13 @@ mpt_free_bus_resources(struct mpt_softc *mpt)
{
if (mpt->ih) {
bus_teardown_intr(mpt->dev, mpt->pci_irq, mpt->ih);
- mpt->ih = 0;
+ mpt->ih = NULL;
}
if (mpt->pci_irq) {
bus_release_resource(mpt->dev, SYS_RES_IRQ,
- mpt->pci_msi_count ? 1 : 0, mpt->pci_irq);
- mpt->pci_irq = 0;
+ rman_get_rid(mpt->pci_irq), mpt->pci_irq);
+ mpt->pci_irq = NULL;
}
if (mpt->pci_msi_count) {
@@ -675,19 +671,18 @@ mpt_free_bus_resources(struct mpt_softc *mpt)
}
if (mpt->pci_pio_reg) {
- bus_release_resource(mpt->dev, SYS_RES_IOPORT, mpt->pci_pio_rid,
- mpt->pci_pio_reg);
- mpt->pci_pio_reg = 0;
+ bus_release_resource(mpt->dev, SYS_RES_IOPORT,
+ rman_get_rid(mpt->pci_pio_reg), mpt->pci_pio_reg);
+ mpt->pci_pio_reg = NULL;
}
if (mpt->pci_reg) {
- bus_release_resource(mpt->dev, SYS_RES_MEMORY, mpt->pci_mem_rid,
- mpt->pci_reg);
- mpt->pci_reg = 0;
+ bus_release_resource(mpt->dev, SYS_RES_MEMORY,
+ rman_get_rid(mpt->pci_reg), mpt->pci_reg);
+ mpt->pci_reg = NULL;
}
MPT_LOCK_DESTROY(mpt);
}
-
/*
* Disconnect ourselves from the system.
*/
@@ -712,7 +707,6 @@ mpt_pci_detach(device_t dev)
return(0);
}
-
/*
* Disable the hardware
*/
@@ -808,8 +802,6 @@ mpt_dma_mem_alloc(struct mpt_softc *mpt)
return (0);
}
-
-
/* Deallocate memory that was allocated by mpt_dma_mem_alloc
*/
static void
@@ -826,14 +818,11 @@ mpt_dma_mem_free(struct mpt_softc *mpt)
bus_dmamem_free(mpt->reply_dmat, mpt->reply, mpt->reply_dmap);
bus_dma_tag_destroy(mpt->reply_dmat);
bus_dma_tag_destroy(mpt->parent_dmat);
- mpt->reply_dmat = 0;
+ mpt->reply_dmat = NULL;
free(mpt->request_pool, M_DEVBUF);
- mpt->request_pool = 0;
-
+ mpt->request_pool = NULL;
}
-
-
/* Reads modifiable (via PCI transactions) config registers */
static void
mpt_read_config_regs(struct mpt_softc *mpt)
diff --git a/sys/dev/mxge/eth_z8e.h b/sys/dev/mxge/eth_z8e.h
index 31e8488..ecd6bcf 100644
--- a/sys/dev/mxge/eth_z8e.h
+++ b/sys/dev/mxge/eth_z8e.h
@@ -1,6 +1,6 @@
/*******************************************************************************
-Copyright (c) 2006-2010, Myricom Inc.
+Copyright (c) 2006-2011, Myricom Inc.
All rights reserved.
Redistribution and use in source and binary forms, with or without
@@ -28,7287 +28,7495 @@ POSSIBILITY OF SUCH DAMAGE.
$FreeBSD$
***************************************************************************/
-static unsigned int eth_z8e_uncompressed_length = 367564 ;
-static unsigned int eth_z8e_length = 116477 ;
-static unsigned char eth_z8e[116477 + 1] =
- "\x78\x9c\xec\xbd\x7f\x78\x54\x45\xb2\x37\x5e\x99\x0c\x32\x89\x81"
- "\x19\x31\xe2\x88\xb8\x0e\x8a\x1a\x5d\x90\xa8\xb8\x1b\x5d\xd0\x28"
- "\xe0\xa2\xf2\x23\xab\xe8\x46\x45\x03\x1a\x70\xd0\x88\x11\x02\x0c"
- "\x10\x32\x61\xc0\xdd\x04\xf9\xa5\x46\x8d\x10\x48\x80\xe0\xc5\x5d"
- "\x54\x44\xbc\x46\x05\x9c\xdd\x64\xbf\x0f\xf7\x5e\x92\x61\xf7\xb2"
- "\xef\x9b\xdd\x2f\x7b\x77\xc4\xc8\x8e\xbc\x01\x46\x32\x90\x31\x99"
- "\x39\xfd\xfd\x54\xf7\x39\xc9\xcc\x30\x41\x79\xef\x7d\x9e\xef\x3f"
- "\x9b\xe7\x99\x9c\x73\xfa\x74\x57\x57\x57\x57\x55\x57\x77\x57\xd7"
- "\x21\xba\xf0\x3f\x3f\x59\xf8\x92\x42\xa6\x86\xe0\xef\xfe\x2f\xca"
+static unsigned int eth_z8e_uncompressed_length = 375636 ;
+static unsigned int eth_z8e_length = 119802 ;
+static unsigned char eth_z8e[119802 + 1] =
+ "\x78\x9c\xec\xbd\x7f\x78\x54\xd5\xb5\x3f\xbc\x32\x99\xc8\x24\x06"
+ "\x26\x62\xc4\x29\xc5\x76\xb0\x41\xa3\x05\x89\x16\xdb\xd4\x42\x0d"
+ "\x02\x1a\x2c\xbf\x14\x6c\xa3\xa2\x09\x1a\xe8\xa0\x11\x22\x44\x18"
+ "\x20\x64\xc2\x80\x36\x41\x20\xa9\xa0\x46\x09\x09\xbd\xf2\x23\x56"
+ "\xac\xd8\x02\x62\x45\x19\x24\xf6\x4b\x7b\x93\x0c\xed\x8b\xf7\x9b"
+ "\xdb\x17\x6f\x47\x6e\x84\x94\x1b\x60\x4a\x06\x32\x26\x33\x67\xbf"
+ "\x9f\xb5\xf7\x39\xc9\xcc\x30\x41\xb9\xf7\x3e\xcf\xfb\x4f\xf3\x3c"
+ "\x93\x73\xce\x3e\x7b\xaf\xbd\xf6\xda\x6b\xad\xbd\xf6\xde\x6b\xaf"
+ "\x43\x74\xe5\x7f\x3e\xb2\xf0\x25\x81\x4c\x07\x8a\x0f\xfd\x37\xca"
"\xff\xf3\xef\x9f\x7f\xff\xfc\xfb\xe7\xdf\x3f\xff\xfe\xf9\xf7\xcf"
- "\xbf\xff\x7f\xff\x82\x29\x34\xfa\xb4\xc9\x4c\xbf\x5f\x4f\xd4\xe9"
- "\xb1\x0c\xf5\x53\x57\xf1\x5b\xaf\x8b\x08\x5e\xa5\x60\x9c\x1f\xca"
- "\x57\xfe\xbd\x86\x34\xd3\x7a\xb2\x5c\x63\xa3\x8c\x71\x9b\x88\xaa"
- "\x06\x8b\xf6\xd7\xdf\x14\xc1\x15\x6f\x8a\xf6\xf1\xdb\x89\x9a\x86"
- "\x13\xbd\x3e\x58\x84\x00\x63\xba\x9f\x9e\x9a\xc6\x30\x56\xe0\x99"
- "\xdf\xaf\x1c\x2c\x82\x48\x2f\x41\xfa\x41\x4e\x5f\x3e\x18\xb0\x32"
- "\x89\x3c\x6f\x8a\x70\x0c\x5c\x0b\x97\x67\x98\xe3\x87\x49\x5c\xea"
- "\x13\xe0\x30\x8c\x06\x3f\x15\x8c\x3f\x0f\x8c\x0c\x03\xaf\x90\x89"
- "\x52\x18\x5e\x87\x87\xec\x21\x8f\xf7\x32\x94\x0d\xa1\x3d\x59\x5c"
- "\x76\x1d\xf2\x08\x0f\xa5\x36\xb9\x22\xe4\xb8\x86\x52\x8e\x51\xfa"
- "\x16\x5c\x4d\xb8\xbe\xc1\x6d\x5d\xa1\xca\x0d\x67\x18\x28\x9b\xd2"
- "\xe9\x49\xcb\xee\x29\x0b\xd8\x8e\x32\x32\x23\xef\x9c\x90\xc9\x6b"
- "\x52\x79\x6d\x69\x7a\x5e\x13\xf2\x4e\x37\xf2\xaa\x77\xa6\xfb\xf5"
- "\x77\x17\xe3\x9d\x2b\xfe\x9d\xf9\x35\xfd\x5d\x06\xde\x55\x25\xe0"
- "\x67\xf6\x75\x45\xe8\x18\xa5\xed\x04\x2e\x8e\x46\xf4\x08\x97\xd1"
- "\xf3\x5f\x82\xfc\x4d\xf1\xb0\x88\xf4\x77\x83\xf0\xce\x1f\xff\x6e"
- "\x7f\xb6\xfe\xee\x72\xbc\x8b\xc4\xbf\x4b\x31\xca\xd9\x3b\x3d\xe9"
- "\xf6\x24\xed\xe4\xfa\x53\x54\xdd\xdc\x86\xf4\x31\xc8\x53\xce\x79"
- "\xa6\x39\xca\x89\xfb\x8a\xdf\x35\xd6\xf5\xd4\xcf\x79\x66\x18\x70"
- "\xfc\x28\x1f\x43\x53\xd0\x32\xbd\xd4\x28\x3f\xde\xc1\x30\x48\xd2"
- "\x90\xe1\xf8\x29\x6d\x22\xc3\xe1\x67\xdc\x0f\xe5\x76\xeb\xf7\x0e"
- "\x6e\x5f\x6c\x9f\x13\x99\x01\xb6\x1f\x0c\xd1\x8b\xf0\xeb\x6f\x31"
- "\x78\x60\xbe\x5d\x68\xee\x2b\xc8\x2c\x56\x6d\xa9\xd3\x3c\x82\x7c"
- "\xae\x30\x39\x86\x90\xfb\x28\x5d\x6c\x07\x7e\xb4\x76\x09\x59\xdc"
- "\xc5\x22\xec\x73\xb5\x53\x4b\xb0\x9d\xdc\x41\x11\xf0\x45\xce\x50"
- "\xd9\x19\xb2\xf8\x22\x27\xa8\xec\x25\xb2\x37\x95\x7e\x4d\xc9\xf8"
- "\x4b\x33\x09\x72\x0f\xe5\xb2\x6d\xd4\x52\xd3\x46\xee\x9a\xf8\xb2"
- "\xee\xab\xc8\xde\x8c\x67\xf4\x9d\x95\xf1\x68\x72\x44\x28\x92\xbe"
- "\xa5\xae\xf4\x6d\x32\xbb\x87\x91\xa9\xb9\xd0\x6b\xe0\xe2\x67\x5c"
- "\x56\x1e\x27\xcb\xb6\xd9\xe0\xa1\xe3\x8c\xef\xbb\x75\x1f\x2c\x09"
- "\x9b\x1a\xed\x93\xa8\xd1\x7e\x84\x9a\xec\x63\xa9\xc9\x35\x9e\xd6"
- "\x1e\xa7\x8c\xc6\xf0\x18\x6a\x32\xdf\x07\x19\x1b\x4f\xbe\x76\xdc"
- "\x3b\xa2\xc8\x13\x22\xc7\x42\x02\x7f\x5c\x7c\xa8\xea\x39\xb2\xf8"
- "\x15\x4c\xd0\xf7\xe2\x23\xbf\x2b\x21\x62\xfa\xf2\x73\xb2\x76\xcc"
- "\xbf\x82\xec\xc0\x2f\x00\x5c\xee\x38\x4a\x19\x97\x0d\xb7\x53\x36"
- "\x70\xee\xef\xab\x8e\x90\xb9\x94\xd2\xfa\x90\xad\x4c\xcd\x23\x65"
- "\xbc\x7d\xf3\x9b\x22\xc0\x3c\xda\xb1\x34\x1f\x72\x9a\x31\x09\x75"
- "\xb7\x73\x7d\x6b\x21\xeb\xee\x2d\x64\xee\x58\x94\x9f\x52\xfb\xa6"
- "\x68\xc3\x3b\xa7\xf1\x0e\xfc\xd4\x86\xf7\x81\x51\x99\x64\xf3\x45"
- "\x72\xe9\x8b\xae\x80\x99\x61\x0c\x0c\x51\x0a\xc3\xb3\xba\x28\x15"
- "\xed\xe9\x07\x7c\xee\xa8\x45\xfa\xb5\xc8\x87\xf2\x3b\xfc\xf4\x9a"
- "\x9d\xcb\x8b\xcb\x9f\x08\x69\x97\x3f\x71\x46\x7b\xeb\x89\x0e\xf1"
- "\xd6\x13\xa7\xa3\x6f\x3d\xf1\xad\x7b\x31\x59\xa2\x97\x3f\x11\x6c"
- "\x29\x96\x7d\x60\x6b\x29\x46\x1f\x44\xc9\xb2\xec\x04\xd9\x9e\x7a"
- "\x09\x7d\x1f\xf9\x1b\x2d\x9b\x43\x76\x2d\x6d\x47\xbe\x2f\xf2\x67"
- "\x7a\xaa\x94\x04\xee\x9d\xc9\xda\xd7\x91\xfe\xae\x5f\xc9\x90\x05"
- "\x6d\x1a\xe0\xf0\x9b\xea\xaa\xb9\xde\x60\xda\x87\x7e\xfc\xda\xf0"
- "\x0b\xe0\xd7\x2e\xd2\xdf\x65\xd9\x74\x0f\x5c\x9e\x42\x9b\xbb\x88"
- "\x46\x69\x94\x72\x9c\x06\x8c\x01\xfe\xb6\x3e\xe8\x36\x54\x5b\xb5"
- "\xf7\xd0\x0d\xe5\x54\xd6\xd9\xe9\x24\xd6\x4d\xac\x97\x58\x4f\xa1"
- "\x9e\x0a\xd4\xd3\x2a\x65\xf1\x4d\x11\x12\xe9\x7b\x0f\x21\x3d\x10"
- "\x5a\xea\x4c\x09\x2e\x75\x9a\x3a\xd2\xf7\xfe\x27\xf2\xec\xf4\x9b"
- "\xb6\xd8\x74\x1a\x06\x18\x16\x64\x22\x38\x20\x42\xa9\x80\x59\xfc"
- "\xc9\xd9\x56\xf3\xa6\x37\xc5\x11\xe4\x3b\xdc\x03\x0b\xb0\x01\x07"
- "\xf4\x1f\x10\x30\xd2\x40\xeb\xb6\x35\xc8\xc7\xe5\x7d\xe1\x5c\xd6"
- "\xdf\x7e\x5f\x51\x80\xac\x11\x4a\x17\xdd\xaa\x3e\xe4\x09\xb0\x9e"
- "\x1d\x10\xa6\x8b\x3a\x3d\x94\xc7\xb0\xb9\x9c\xaf\x3d\x40\x28\xf7"
- "\x9f\xc2\xed\x84\x7e\xa3\x29\x9d\xc2\x99\x02\x9d\xde\xd6\x88\xf2"
- "\xaa\xee\x81\x79\x06\x8e\x5c\x07\xf7\xb5\xc4\x13\xfc\xd0\x58\x14"
- "\xa6\x01\xd5\x94\x8a\x72\x0f\x33\x3c\x86\x05\x3e\xf0\xa3\xad\xff"
- "\xd9\x58\x14\x24\x4d\xc4\xc1\xf4\xeb\xf0\xea\xe2\xe0\x21\x5d\x00"
- "\x1e\xf3\x5f\x13\xca\x0c\xa8\x93\xf0\x1e\xfa\x44\x63\x78\x61\x32"
- "\x3b\x24\xbe\x8f\x32\x8c\x4e\xd6\x31\x80\xe9\x5d\x78\x2f\xb5\x93"
- "\xd5\x12\x74\x3b\x53\x5b\x4a\x89\xb8\xfc\x07\x65\x81\x7e\xa2\x23"
- "\x3f\x95\x79\x8e\xdf\xfb\x22\xa7\x91\x67\xe0\x37\xa2\xc3\x99\x3a"
- "\xa0\x9d\xcc\x8c\x33\xca\xbb\x18\xcf\xd8\xbe\x7c\x68\xc2\xa3\x63"
- "\xe9\xd1\xf1\xf7\x8f\x1f\x4b\x93\xef\x19\x37\x96\xb2\xef\x18\x99"
- "\x7d\xdb\x4f\x73\x6e\xa3\xbc\x5f\x3e\x34\x96\xf2\xa6\x8c\xa5\x87"
- "\xf1\xcb\x7b\x78\xc2\x43\xe3\x27\x3c\x3c\x96\xf2\xef\xbb\x1f\x4f"
- "\xe3\xc6\xde\x92\xfd\xf3\x91\x79\xe3\xee\x9f\x40\xbf\x98\x76\x6b"
- "\xf6\xad\xb7\xd2\x3d\x13\x26\xdd\x92\x9d\xad\x5f\x6f\xc9\xe6\x2c"
- "\x8f\xe7\x4c\x78\x78\x64\xde\xbc\x17\x4b\x5e\x1c\x39\xe5\xfe\x71"
- "\x9c\xc2\x63\x72\x0c\xef\x64\x45\xcf\x6a\x4c\xe3\x90\x38\x35\x91"
- "\x34\xe8\x8c\xcd\xe8\x7b\xfc\xda\xbd\x65\x47\x21\xfb\xb6\x3f\x6f"
- "\xe6\x3e\x93\xba\xd5\xca\xe3\x95\xb9\xd3\x63\x3d\x02\xda\xe5\x31"
- "\xed\x30\xa6\x21\xcf\xe0\xc5\x78\x77\xa3\x3e\x76\xf4\xc3\xfb\x48"
- "\xfc\xfb\x41\xd0\xb3\xd6\x51\x2d\x0e\x22\x1f\x7e\xa0\x77\x08\x3a"
- "\x10\x74\x0d\x52\x87\x3b\xbf\x1f\xf8\x3a\x05\x75\xb4\x41\x26\x41"
- "\x1b\x5b\x4e\x8c\xac\xb7\xa1\x5f\x0e\x39\x96\x50\xea\x49\xb2\x5d"
- "\xd2\x52\x92\x4b\xdc\x3f\xbe\x12\x1d\xc6\x99\x1e\x18\xe9\x12\x06"
- "\xfa\x1c\x70\x0e\xeb\x70\xca\x63\xf4\x82\x9f\xe1\xac\xc5\x3b\x1d"
- "\xd6\x23\x2d\xd0\x0f\xd0\xdf\xbf\xd1\xdc\x59\x24\xd2\xb7\xec\xd0"
- "\xba\xb3\xe4\x98\x80\x72\x0d\x06\x3f\xa3\xfe\x50\x13\xea\x14\xdb"
- "\x26\xa6\xa0\xff\x53\x30\x56\xa1\x2d\xd6\x26\xf0\x35\xe4\xe8\xc3"
- "\xa0\xe8\xce\x27\x95\x76\x89\x39\xba\x0a\xcf\xab\x3e\xfc\x56\xb8"
- "\x91\xb6\x44\xa6\xf5\xc3\x33\xec\x09\xf0\x91\x70\x52\xf4\x14\xd2"
- "\xe7\x52\x2a\xd2\xff\x00\x5a\xb7\xca\xfc\xa7\x64\xf9\xfe\x48\xdb"
- "\x0e\x78\xdf\x6a\xe9\x1f\x9e\x06\xef\x70\x1a\xec\x84\x4b\x2a\x51"
- "\xbe\x83\xf5\x9d\xd2\xc1\x83\xdf\xe6\x31\x0e\xed\x08\x2a\xf8\xfa"
- "\x33\xe4\x55\xe1\x30\xf8\xed\x46\xd0\xa5\x11\xa3\x56\x53\x29\xdb"
- "\x36\x97\xa0\xfd\x03\xf2\xd5\xf8\x38\xb8\x9a\xf3\x6a\x22\x9f\x84"
- "\x25\x7a\x00\x70\x43\xde\x25\xed\x74\xac\x98\x4c\x7e\xba\x64\x8c"
- "\xe6\x76\x52\x4c\x5b\xb2\x18\x0f\xe0\x6d\xee\xec\x76\x62\xbc\xbc"
- "\x64\x84\x2c\x0b\xfc\x74\xdc\x38\x8f\x9d\xf1\x67\x1d\x81\x7e\x1d"
- "\x8d\x3e\x4f\x43\x7d\xc1\x84\x3e\xcf\x60\x7a\x00\xdf\x56\x0d\x57"
- "\xc0\xc9\x14\x8b\x9c\xc0\x8b\x4c\x4c\x0f\x7f\x2f\x8c\x90\xe2\xa9"
- "\x41\xd9\x09\x3c\xf5\x24\x60\x8f\x8d\x79\x9f\x97\xf0\xfe\x1e\xbc"
- "\xbf\x57\x7f\x0f\x59\x1d\x54\x9c\x50\xff\x6a\xbc\xbf\x8f\xfb\x10"
- "\xb2\x98\xea\x27\xdb\x8e\xcd\x6c\x4b\xf6\xe6\xaf\x4b\xc8\xbf\x17"
- "\xf9\x1f\x00\xbe\x21\x1e\x27\x38\x7f\xad\xce\xf7\xc8\x6f\x41\xfe"
- "\x43\x09\xf5\x0f\x43\xfe\x87\x63\xf0\x4b\x68\xff\xa5\x0d\x78\x9f"
- "\xcf\x7c\x8a\x6b\x21\xf2\xf4\x67\xf9\x67\xdd\xd3\x58\xc4\xfd\x73"
- "\xa9\x23\x21\x7f\x2e\xf2\x3d\xcf\x74\x96\x34\xea\x60\x1a\xd9\x76"
- "\xe8\x76\xcd\x11\x85\xc3\xa5\xd3\x12\xca\x94\xa0\xcc\x7c\xa6\xaf"
- "\xe4\xb3\xce\xa4\x65\x2a\x12\xca\xec\x90\x7c\xaa\xea\xd1\xfb\x58"
- "\x95\xd1\xf5\x5a\x2c\x0c\x6e\x1b\x6c\xad\x4b\x0f\xc6\xc3\xb8\x6c"
- "\x07\xea\x5d\xba\x46\xe9\x8c\x8b\xc1\x13\xb7\x22\xed\x6d\xc0\x3c"
- "\xc3\x7c\x04\x39\x0b\xf9\x82\x61\xe8\xdd\x89\x19\x8a\x77\x33\x47"
- "\x5a\x4b\x89\xef\x47\xf2\x3d\xc3\x16\xdd\x93\x74\x79\xca\x1c\x89"
- "\x2b\xa7\x67\x72\x3a\xcb\xb1\xe8\x7e\x50\x53\x30\x33\x7f\x01\x79"
- "\x37\xe1\x39\xaa\xd7\xf1\x2a\x9e\x53\x80\xff\x69\xe8\x74\xf0\xec"
- "\x44\xe6\xc7\xd1\x48\xaf\xd4\xdf\x2f\xe7\xfc\xb8\xbf\x45\xbf\x4f"
- "\x01\x8f\x9d\xd6\xe5\x0c\x32\x75\xd9\x62\x59\x37\xe4\xca\x28\xaf"
- "\x29\xbe\x1f\x87\x77\xb3\x70\xbd\x1f\xd7\x5f\xe0\xfa\x0b\x5c\x47"
- "\xba\xcf\x90\xdd\x1d\x95\xf2\xc5\xcf\x57\xe0\xfa\x10\xae\xfd\x70"
- "\x7d\x18\xb8\x7d\x0b\xba\x07\x83\xe0\xe9\x04\x9e\x69\x47\x1f\xb2"
- "\xdc\xf7\x57\x7d\x98\xe9\xe7\x3a\xa3\x86\x2e\x38\xd5\x9b\xa6\xeb"
- "\x07\x5d\x1e\xf4\xb4\xee\x89\x4c\x97\x3c\xc0\xdf\xcb\xf5\x0b\x05"
- "\xab\x9f\xea\x27\x95\x47\x53\xe5\xcc\xaa\xbf\xf5\x34\x95\x2f\x25"
- "\xb6\x4e\x5c\xd7\x97\x85\x84\xc0\xb5\x94\xe9\xea\xa7\xcb\xca\x41"
- "\x13\x33\x9e\xf3\x98\x4e\x32\xbf\x84\x7b\x69\x7b\x4c\x7f\xc3\xb6"
- "\xbf\x6c\x6f\x42\x7f\xb3\x9c\xaf\x91\xfd\x0d\xda\x19\x38\x33\xfe"
- "\xe0\x69\x1e\x27\x2f\x32\xf8\x06\xfc\xdd\xde\x2b\x63\x83\xcd\xf1"
- "\x70\x14\x5f\x31\x7f\x0c\x2c\xd6\x65\x12\xf4\x82\x0e\x0b\xa5\x96"
- "\x32\xaf\x0e\x1e\xed\xa7\xdf\x4e\x94\xb6\xd8\xaa\x0f\xcf\xf2\xfb"
- "\x10\x74\x13\xe7\x4f\x2d\x66\x19\x1b\x3c\xcd\x78\x2f\xdf\xa5\xed"
- "\xcb\x63\x9c\x52\x8b\xe4\xbb\x62\x3f\x58\xcc\x78\x27\xeb\xe1\x77"
- "\x25\xf2\xdd\xea\x5e\xb8\x5b\x0e\xe8\x70\x53\x93\xd9\x52\xa2\x62"
- "\x4b\x03\x18\xd4\x74\x53\x39\xf5\xf3\x45\x0e\xd3\xd4\x88\x88\x8e"
- "\x2c\xa7\x34\x5f\x64\x27\xdd\x48\x74\x89\x2f\x72\x84\x6e\x22\x1a"
- "\xe6\x8b\x54\x61\x6c\xaf\xe7\xf7\x5f\xdc\x40\x29\x29\xb8\xba\xaf"
- "\x2f\x37\xa5\xf8\x22\x25\x34\xbc\xdc\x8c\x6b\x11\xdd\xd7\x4f\x74"
- "\xfa\x22\x93\x90\xaf\x90\xa6\x46\xc5\xa9\xf1\xfd\xc4\xdf\x0b\xa2"
- "\x64\x9b\xf4\xb2\x70\xfb\x22\xb0\xb3\x23\x07\x91\xae\x89\xa9\xd1"
- "\xef\xf0\xeb\x14\x5a\xc5\x96\x03\x53\xa3\xa7\xc4\xb8\x97\xbf\xc0"
- "\xf3\xdf\x85\x30\x91\xf0\x45\xc6\x50\x4b\x28\x84\x7c\x6e\x21\x2a"
- "\xb7\x34\x3c\x75\xc6\x44\xdd\x18\xa3\xb5\xca\x2d\xd0\xe3\x5b\x5a"
- "\xbb\xd1\x0e\x8c\x5f\xff\xbb\x7b\x29\xae\xab\xb6\xfc\x2f\xf9\x5c"
- "\xb1\x25\x20\x2c\x5b\x5a\x6f\xc6\xa4\x85\xdb\xe0\x8b\xb4\x51\x01"
- "\xcc\xee\xa9\x8b\x83\x82\xf1\x1f\xb8\x9c\xe7\x2c\x63\x08\x7a\xd1"
- "\x3a\x75\xb1\x5b\xe0\x9d\x45\xa4\x6d\x69\xf5\x45\xda\x09\x75\x04"
- "\x00\xef\x6b\x09\xaf\x62\xab\x05\x79\x83\x9c\x2f\x16\x0e\xc3\xe0"
- "\xbc\x53\xa3\x64\x15\x95\x5b\x2d\xdd\x69\x5b\xc2\xdd\x69\x5b\xed"
- "\xf8\x4d\x14\xe9\x5b\x1f\x17\x9e\xcc\xdf\x09\x8c\xa7\x28\xef\xc4"
- "\xb3\x2b\x8c\x39\x82\xa4\x65\x94\xfa\x23\xbf\x13\xfc\x32\x1e\x7c"
- "\x07\x7c\xb7\x56\x4b\x7c\x57\x6d\x7d\x2b\x2c\xdb\xb1\xf5\x4d\xd5"
- "\x8e\xad\x6f\x70\x7a\x07\x6c\x09\xdc\x37\x74\xa8\x77\x9f\xa0\xdc"
- "\x34\x59\xae\x62\x6b\x83\xb0\x6c\x3d\x10\x86\x3c\x81\xae\xe5\x4c"
- "\x47\xd0\xb5\x9c\x69\x09\xf8\x0d\x3e\xd7\x6a\x12\x69\x5b\x0f\x00"
- "\x9f\x56\x94\x3f\xde\x2d\xc7\xf8\xad\xe1\xb0\x82\xdd\x09\x38\xd3"
- "\xc1\xaf\xa9\x80\x11\x16\x15\xdb\x2c\xdd\x1e\x07\x4d\x5d\x2c\xc2"
- "\x53\x23\xcb\x23\x05\x8b\x29\x75\x04\x95\x03\xdf\x7d\xa0\x51\x21"
- "\xda\xd9\x84\xeb\x78\xbc\xa7\x4b\x51\xd7\x17\x80\x1b\xe6\xfa\x44"
- "\xe5\x36\x8b\x48\xdf\x06\x5b\x87\x0a\x19\xa7\xef\x3c\x64\xc3\xb3"
- "\xfd\x3b\x89\xdf\xb6\x1c\xad\x62\x5b\xbe\x66\xd9\x36\xd1\xe0\x21"
- "\xe6\x1f\x45\xb7\x2a\x9a\x12\x12\x11\x5f\x64\x13\x81\xc7\x6c\x2d"
- "\xa1\x23\xfc\x1e\xf3\x8a\x9d\xe8\x67\xe6\xa9\x12\x5c\xeb\x89\xf9"
- "\xa7\xa5\xf8\x65\xce\xfb\x05\xf3\xd0\x94\xe2\xd0\xf2\x91\x54\x9c"
- "\x82\x67\x77\x41\xc4\x42\x4f\x15\x9b\xcb\xa3\x15\xdb\xb2\x5a\x8a"
- "\xb9\x5f\x0e\xa3\x0c\x97\x2b\x22\x6b\x0a\x6c\xeb\x14\x11\xb1\xba"
- "\x82\xe6\x01\x4e\xb7\x68\x09\x4d\x42\xde\x62\xe2\xf6\x30\x1f\x71"
- "\xfe\xc9\xed\xc2\x1f\xb5\x6c\x6b\xe5\xb6\x89\x81\xe5\xd4\xdc\x7e"
- "\x3b\xf1\xfc\xa6\xb9\xbd\x9e\xf9\x54\x13\x96\x6d\x3b\xc0\xa3\xdd"
- "\x93\xdb\xcb\xfb\x3d\x75\x86\x52\x90\x16\x6d\x76\xee\xc4\xfb\x26"
- "\xe4\x3b\x28\xf9\x76\xca\x99\x88\x35\x62\xd9\x66\x8f\x54\x6c\x6b"
- "\x98\x72\xa6\x5b\x34\x3b\xab\xe8\xc9\xf6\x72\xd0\x6a\x27\x4d\x3e"
- "\x11\x49\x6d\x29\x2e\x44\x9e\x4e\xa4\xd7\x4b\xfe\x9f\x7c\xa2\x43"
- "\x4c\x79\x49\x9c\x9a\x72\xe6\xef\x62\xb2\x53\x7c\x51\xe0\xa2\x81"
- "\x17\x2f\x17\x1a\xcb\xc5\xc1\xb6\x9d\x74\xf1\x11\x3f\xb1\x4c\x4c"
- "\x9a\xa9\x89\xc9\x27\x4e\x89\xa7\x5e\x62\xda\x8c\xa1\x66\x27\xe4"
- "\xc7\x55\xc5\xf4\xce\x69\x76\xee\x45\xfd\xe3\x01\xd7\x2d\x7c\xae"
- "\x4d\xc8\xeb\xb5\x3e\x79\xc2\x46\x07\xdb\xaa\x28\x92\xb6\xcd\x1e"
- "\xad\xdc\x96\xa5\xa5\x6d\x9b\xa8\x55\x6e\xcb\x17\x69\xdb\x76\x44"
- "\x2a\xb7\x35\x44\xd3\xb6\x81\x07\xea\xb3\xd0\x4f\x69\xdc\xe7\x5d"
- "\x98\xef\xe3\xf9\xfa\x2e\xee\xff\x8a\xfa\x1c\x61\xa9\xcf\x87\x2e"
- "\x14\x8a\xf7\xeb\x73\x78\xce\x2e\xd2\xea\xf3\xbb\xd3\xea\x27\x22"
- "\x5f\xbe\x92\xaf\x7a\x27\xf3\xa5\x1c\x8b\x56\xd5\x3f\x8b\xb1\x23"
- "\x15\xef\x5d\xf8\x55\xe0\x57\x8d\xb4\x00\xe0\x5f\xd2\xa9\x60\x06"
- "\xc4\x5d\xeb\x61\xa3\x62\x8e\x9e\xb6\xdd\x32\x35\x7a\xb7\x00\x0d"
- "\x21\x27\xf5\x01\xad\xb2\x3e\x2c\xd2\xb7\x67\x85\x25\xef\x6f\xbf"
- "\x81\x61\x77\x2f\xcd\xe2\xb9\xbc\x59\x54\x6e\xcf\x41\xda\x6f\xc2"
- "\xcc\xab\x96\xed\x3b\x34\xcb\x3b\xd0\x45\xdb\x1b\x1e\x7c\x59\x04"
- "\xa3\x15\xdb\x5b\xb5\x8a\xed\x07\x22\x17\xc1\xf6\x75\xed\x25\xd6"
- "\x4f\x91\xfd\x02\x34\xf8\x03\xe8\x51\x2f\xfb\xdf\xe7\x82\x0c\x2c"
- "\x1e\x52\xde\xdc\x0e\x5e\x28\x7e\x4f\xea\xa6\x96\xd0\x61\x49\x53"
- "\xe0\xb1\x83\x79\x8a\xfb\xf7\xa9\x62\x2a\x47\x5d\x0d\x5a\xe5\xf6"
- "\x03\xd1\x4a\xc0\x4d\x43\x3d\xe9\x3b\x1e\x08\x4b\x79\xdd\x01\x7e"
- "\xdd\x8b\x32\x7f\x20\xc5\xe3\x3b\x26\xf6\xa5\x23\x59\x57\xb1\x7e"
- "\x9a\x1a\x09\x33\xcf\xfc\x83\xf5\x9a\xd2\x53\x54\x60\xe8\x29\xd6"
- "\x51\x3c\x9f\x60\x3d\xa5\xe9\x7a\x4a\xd3\xf5\x94\x7c\xb6\x40\xd7"
- "\x54\x6c\x69\x65\x7d\x34\xd5\xa5\xf4\xcc\xd4\x68\xb6\x00\x6f\x64"
- "\x00\x46\xab\xea\x0b\xe4\x59\xb5\xe5\x6b\x99\x5f\xd2\x69\xab\x45"
- "\x83\xbe\xd1\xa0\x6f\x34\xa5\x6f\xf2\x75\x7d\x63\x32\xf4\x4d\x14"
- "\xe3\x1a\x64\x4a\x4b\xa6\x6f\x34\x5d\xdf\x44\x85\xd2\x37\x9a\xae"
- "\x6f\x38\x3d\xaa\xeb\x9b\x68\x12\x7d\xa3\x55\x6c\xe5\xf6\xa6\xea"
- "\x7a\xa6\x9c\xf5\x0c\xb7\x57\xab\xdc\x7a\x40\x53\x7a\x26\x80\xb9"
- "\x84\x89\xf5\x4c\x14\x65\x34\x43\xcf\x74\x4a\x7d\x60\x61\x5d\xd3"
- "\xfd\x2b\x82\xfe\x74\x10\xeb\x18\xa9\x4f\x22\xc3\x22\xac\x4f\x40"
- "\xbf\xbb\x13\xf5\x89\x58\xb5\xcd\x8e\x7b\x9b\xd2\x53\xdb\x26\x5a"
- "\x97\x8b\x08\xf4\x49\xd6\x54\x57\x08\x7d\xfd\x37\xcc\xa9\xa1\xb7"
- "\x5d\x25\xe5\x3e\x57\x84\xa0\x07\xf2\x45\x4b\x39\x41\xe7\x80\x7f"
- "\xa3\xd0\x15\x44\x90\xcb\x1d\x90\xcf\x56\xd4\xdd\xd0\x52\xfc\x67"
- "\x82\xbc\xdb\x27\xb7\x77\xf8\x9e\x0a\x65\xd9\x26\x9f\x10\x41\xd0"
- "\xc7\xff\x54\x71\x39\xf4\x4b\x56\xb0\xb9\x7d\x1f\x4d\x6a\x13\xda"
- "\xa4\x19\x7e\x07\xf0\x68\x98\x3c\xc7\x6b\x7d\xea\x25\x1b\xe4\x4c"
- "\x78\xa1\x17\xff\x73\xf2\x09\x9b\x75\x7a\x1b\xfd\x68\xd2\x4c\xa1"
- "\x41\x9e\x40\x77\xc8\x19\xe4\x11\x32\x36\x11\x32\x97\x0f\x39\xdb"
- "\x11\x49\x90\x33\xc8\xcc\xf5\xb8\x77\x28\xfa\xd5\xe7\x43\xce\x72"
- "\x34\x39\x9e\xb5\xc9\x39\x1c\xe4\x21\x9f\xd7\xb8\x20\x6b\x39\x90"
- "\x0b\x29\x6b\x9a\x2a\xe7\xd4\x98\x7e\x26\x5d\xd6\xd0\x17\x78\xef"
- "\xc2\xaf\x02\xbf\xe4\xb2\x56\x1c\x23\x6b\x2f\xe9\xb2\x96\xa6\x64"
- "\x0d\x7d\x9a\x1a\x5d\xaa\xe4\x8d\xe1\xf3\x3c\xaf\x47\xde\xd2\xb7"
- "\xef\x10\x6c\x4f\x4a\xde\x61\x99\xdb\x8e\x71\x65\x7b\x2b\xe4\xed"
- "\x80\x56\xf1\x0e\xe0\x89\x20\xeb\x4d\xf0\xe6\x7f\xf1\x58\x37\xa5"
- "\x58\xfc\x57\x41\x74\x48\x39\xea\x6a\x85\x2e\xfb\x3b\xf4\xe8\x7f"
- "\x3d\x15\xa2\x3a\xc0\xda\xa1\xa5\x6d\x6f\x80\x3c\x1d\xd0\x2a\xa5"
- "\x3c\x4d\x8c\x2e\x65\x98\x3b\x26\xf6\xc0\x90\x63\x65\xbc\x3c\xf5"
- "\xb5\xbe\xd8\xe9\xb9\x7a\x8c\x9f\x3e\x29\x61\x7b\x05\xf7\x13\xfd"
- "\xd4\x30\x51\xbf\x87\xfd\x53\x23\xd7\xa6\x59\x06\x8b\xcb\xe8\xb2"
- "\xe3\xe4\xb0\x80\xdf\x09\xf7\x19\xb8\xcf\x98\x7a\xe3\x17\xb0\x23"
- "\x02\xcc\x53\x9d\x2c\x87\xc2\x33\x9a\xe7\x5c\xb9\xe0\x43\x8b\xe8"
- "\xcc\xca\x10\xe9\xbb\xcb\x44\xb7\x9d\xd7\xb0\xac\x78\x1e\x88\xf6"
- "\x0f\xc7\x75\xd0\xa6\xb3\x94\x89\x9f\x7d\x93\x47\x2b\x67\xdb\x09"
- "\xf7\xd9\x62\x91\x3d\x7d\xed\x42\x1a\x61\x0d\x91\xa5\xd6\xa3\xe5"
- "\x5b\x97\xdb\x78\x2d\x27\x93\xef\x85\xa7\xce\x59\x7b\x96\xcc\x6c"
- "\x57\x6a\x69\xa8\xcf\x65\x15\x62\x7e\x16\xd5\xce\x83\x7e\xf0\x90"
- "\xbd\xd6\x23\x76\x45\x3b\x99\x06\x5b\x1a\x0c\x5c\x18\x37\xe0\x79"
- "\x15\xf0\x1c\xfa\xc8\xe2\x5c\xfa\x83\x8b\x92\xae\x81\x76\x7a\x1c"
- "\x3d\xed\xef\xe3\xfd\x74\x83\x26\x7d\xbc\x2f\x35\xe8\xd4\xc7\x7a"
- "\x99\x99\xc7\xe8\xe8\x42\x11\x5c\xf7\x1c\x31\x2d\xec\xee\x88\xf8"
- "\x0a\x74\x2c\x2f\x8b\xd2\x55\x53\x17\x5f\x2d\x7c\xed\xc2\xeb\x73"
- "\x9d\xa0\x5a\xbc\x2f\x2b\x15\x9a\x96\xb6\x7b\x86\xa8\xdc\x3d\xbd"
- "\x63\xa1\x88\xf0\x5a\x09\xea\xf0\xfb\xe9\xce\x72\xd5\x17\xdb\x72"
- "\xe4\x3c\xcf\xb2\x7b\x3a\x60\x5d\xc2\xb0\x9a\x51\x3e\x5a\xb9\xbb"
- "\xb0\xd3\x33\xcc\xe2\xa7\x3f\x4c\x97\xf9\x2c\xdb\x72\x8a\x97\xd0"
- "\x95\xc7\x69\x58\xae\xb4\xf5\x2b\x76\x97\xb0\x3e\x40\x9a\x0d\x69"
- "\x93\x00\xdf\x85\xfc\x39\x7e\xfa\xb0\x5a\xd9\xb1\xc3\x26\x19\xf9"
- "\x70\xef\xe0\xfb\x38\xfe\x49\x91\xdb\x2b\xe8\x2f\x47\xef\x66\x0b"
- "\xa7\x99\x63\x36\x5f\x6c\xf8\xe5\x26\x7f\xdd\xab\xcf\xb7\x35\xc0"
- "\xd6\x22\xf7\x32\x1a\x8a\xfe\x61\xfc\x7e\xe7\x76\x89\x63\xc2\x33"
- "\x2c\x7f\xdb\x92\x30\xe6\x09\xc3\x0e\xfa\xa9\xa2\xa6\x2f\x7a\x0a"
- "\xb6\x75\xce\x8a\xc0\xba\x85\x3d\xb4\xfc\x72\xea\x62\x4d\xf0\x3d"
- "\xeb\xa3\x5a\xa4\x33\xdd\x3a\x3d\xd7\x64\x1a\x34\xeb\xbb\x5f\x76"
- "\x17\xab\x79\xe1\x35\x25\xc2\x23\xc8\xfb\x23\xde\x9f\xb8\x66\x81"
- "\xa2\x43\xfd\xc4\x0e\xe8\x11\x5e\x7f\xad\x05\xbd\xe7\xdb\x45\x18"
- "\x30\x9d\x7e\xba\x29\xa8\xaf\xf3\x84\x7c\x91\x09\xac\x5b\x92\x8e"
- "\x5b\xbc\xff\xd3\x0b\xff\xda\xaa\x96\xa1\xd0\x43\x52\x37\xed\xab"
- "\x2a\x53\x78\x87\x19\xae\xb7\xec\x34\xb5\xe1\xfd\xfc\x90\xc0\xf8"
- "\xb4\xaf\x82\xe7\x11\xde\x85\x5d\x9c\xf6\x06\x78\x5b\x78\xe7\x31"
- "\x4e\xd7\xbe\xe1\xfd\x51\x17\x1d\xc3\xbc\xaf\xb6\x67\x4d\xe6\xda"
- "\x72\x5e\x83\x51\xeb\x48\xd7\x62\x3e\x34\xa2\xc1\xc0\x8b\x6d\x0c"
- "\xd0\xd7\xc2\x36\x07\xdb\x1a\xbc\xa6\x3f\xbf\x54\x84\xd9\xe6\x40"
- "\xde\x11\x46\x1b\xb8\x7d\xaa\x5d\xd7\xe6\xc6\xb6\x0b\x38\x04\x31"
- "\x87\x96\x34\x98\xbf\x98\x2c\x0e\x45\x6b\x0b\xb7\x97\xdb\xc2\x6d"
- "\x96\x6d\x91\x3a\x16\x63\x44\xe4\x76\xd4\x2f\xd3\xf3\x01\x0b\xf3"
- "\x9f\x1f\x4f\x53\x3c\x75\x2d\x25\xf2\x51\x4f\x3f\x5a\xb6\x59\xdc"
- "\xdf\xd1\x8f\xdc\x9a\x38\x7a\x8c\x86\xf3\x7c\x37\x95\xaf\x1a\xdb"
- "\xd9\x61\xe6\xdf\x86\x7c\x1e\x93\x7d\xa5\xac\x6f\x65\xde\x4b\x91"
- "\xb7\x0d\x79\xd2\xf4\xbc\x69\x6a\x3f\x47\x5e\xfb\xf3\x15\xe3\x58"
- "\x3f\x3f\x0d\x77\x04\xe5\x78\xbf\x2f\xcf\x78\x16\x78\x06\x2e\xad"
- "\xa2\xb2\x21\x3f\x39\x2e\xef\x58\x78\x3c\x8b\x9e\x15\xed\xa8\xe7"
- "\x72\xe6\x29\xf7\x62\xba\x02\x7c\xf9\x65\xd9\x32\xba\x94\xf9\x49"
- "\xa4\xed\x2e\x55\x74\x1f\x5e\x24\x3c\xb0\x3d\xa1\x51\x8b\x17\xd2"
- "\x95\x90\xa3\x92\xe3\x34\x7c\x79\x41\xa9\x03\xb8\x12\xad\x3b\x49"
- "\x24\x75\x50\xda\x6e\x97\x2f\xf2\x35\xd5\x9e\xe4\xf5\x97\xe1\x75"
- "\x06\x2f\xe2\x7e\xe7\xf9\xf4\x05\xe8\x5a\xa1\xd6\x0f\xae\xbb\x82"
- "\xd7\xef\x8f\xd2\x75\x66\x6e\x2f\x7e\x29\xa8\xfb\x8c\x38\x2b\xa6"
- "\x0b\x35\xa6\xb9\xfc\x74\x5d\x36\xae\x15\xf2\xe7\xa1\x19\xfa\xb3"
- "\x0b\xf9\xda\xc4\x59\x8d\xf3\x54\xa0\xfd\x11\xe1\x49\x61\x99\xd8"
- "\xdb\xe9\xb9\x2e\xcb\x4f\x63\x75\x79\x1f\x1e\x62\x58\x7d\xe0\xe0"
- "\x42\xdf\x12\xf3\x26\xf0\x78\xd5\x51\x96\xc2\x78\xcc\x92\x72\x01"
- "\x58\xb5\x26\xa5\xb7\x35\xe0\xba\xd9\xa3\x39\xa1\xa3\x9d\xda\xaa"
- "\xcf\x1a\xe4\xbd\xfe\x4e\xe8\xe3\x68\x72\xf8\xfb\xaa\xbc\x43\x98"
- "\xc7\xaf\x6b\x57\x70\xf6\x55\x78\x87\x1c\xe7\xe7\x13\xfc\x1c\xb2"
- "\x7c\xde\xe0\xab\xce\x45\xfd\xc7\xb9\xde\x76\x35\x9f\xbf\xee\x44"
- "\x07\xea\x40\x1b\xda\xfd\x34\xb2\x49\xed\x65\x7c\xde\xd0\x87\xec"
- "\xd9\x58\x76\x58\xe6\x94\x4c\xdf\xf0\x5e\x73\x9d\x94\x3f\x27\x78"
- "\xbe\x42\xd7\x1b\xbc\xd6\x92\x71\x94\x6e\xd8\xd9\x6c\x97\xfc\x6d"
- "\x12\xa6\xeb\x27\xbd\xaf\x05\x4d\xbc\xdf\xa4\xd4\xd7\x0d\x3b\xcf"
- "\xfd\x5d\x8f\xf6\x5d\xbf\x1e\xbf\x1a\xfd\x19\xf3\xff\xeb\xf7\xe2"
- "\x3e\x03\xbf\x1a\x49\xbb\x8d\x85\x29\x7e\xbc\xeb\x80\xcd\xce\xcf"
- "\x7e\xba\xbe\x42\x6c\x1c\x6e\x82\x5d\x22\xef\x6b\xaf\xe0\x75\x82"
- "\xeb\xf7\xa0\xbf\xc6\xa8\xbe\xb8\x41\xee\x29\x02\x37\xa6\xbb\x70"
- "\x57\x8b\x70\x53\x59\x08\x78\x5f\xdf\xd6\x54\x1d\x22\xc7\xf5\xdc"
- "\xfe\xeb\x03\xdc\xa6\x10\xe8\xcf\xd7\xf9\xd5\x22\xd8\x58\x13\x21"
- "\xde\xf7\xea\xf4\xdc\x00\xf9\x73\x92\x5a\x73\xd8\xb7\x8b\xe1\xe9"
- "\x3c\x21\x8c\xf6\x2b\x9d\xf6\x79\x03\xf7\x25\x9e\x6f\x47\xdb\xad"
- "\x27\xe9\x86\x05\x22\xfd\xb3\x86\x46\x27\xd1\x26\xe8\x11\x8c\x35"
- "\x72\x2d\x1e\x7a\x89\x61\x62\xfc\xbf\xae\xc6\xd8\xa7\x59\x83\xf7"
- "\x6b\xf1\x0e\x63\x4f\xb0\xd9\x19\x26\x86\x15\xe5\xf6\xa1\xfc\x3e"
- "\x2d\x68\xc6\x58\x8d\x3e\xff\xbc\xa1\xac\x18\x7a\xa6\x47\x6f\xdd"
- "\x30\x74\xd9\x09\x11\x36\xda\xc7\x7b\xa1\x80\x0b\xfe\x7f\xce\xde"
- "\x27\xff\xf7\xe0\x9c\xf5\x6f\x8d\xc3\x55\x9f\x69\xa0\x4b\x7c\x9f"
- "\x65\x1d\x50\xfd\x75\x43\x24\xbe\xbf\xb2\x0e\xe0\x37\x1e\xbf\xe9"
- "\xf8\x15\xe9\xcf\xb1\xbf\xec\x98\x7b\x48\x6b\xd6\x9e\x4e\x4f\x16"
- "\xc6\xff\xe1\x0d\xaa\x1f\x38\x1d\xed\x60\x1e\xf9\x96\x2c\xbc\x5e"
- "\xc7\xfb\xa0\x9c\xce\xfc\xcc\xe9\x1a\xec\x19\x3c\xe7\xe1\xbd\x8d"
- "\x65\x75\x9d\x46\x71\xef\x7d\x2b\xc1\x73\x4b\xba\x18\xff\x2d\x72"
- "\x8d\x71\x79\x45\x05\xf3\x29\xf2\x4c\xb3\x46\x2a\x2a\x50\xdf\x4e"
- "\x83\xae\x48\xab\xe2\xf7\xcc\x93\x48\x6f\x02\x5d\xe4\x1a\x7a\x08"
- "\xf3\xbd\xe4\xb6\x46\x56\xa0\xc7\x26\xb3\xd4\x07\x58\x1f\xb5\xd3"
- "\x8d\x21\xe8\x2c\xf4\xed\x67\xbb\xd4\x58\x73\xe3\x19\x7e\x86\xae"
- "\xfc\x12\xf7\xc1\x66\xb4\xb2\x6b\xd5\x87\xfe\x6e\x13\xf5\xef\x32"
- "\x51\x6e\x64\xd5\x37\x43\x23\xe9\xef\xb6\xfb\x02\x7b\xa8\x25\xb2"
- "\x9b\x1c\xcf\x49\x18\xdf\xf8\xc0\x03\xee\xc5\x22\xfa\x41\xd7\x0e"
- "\xb3\x2f\x72\xca\x8b\xb1\xf9\xea\xe3\x74\xa3\xa4\xc7\x2b\x47\x31"
- "\xea\x3f\x25\x61\xeb\xf4\x09\x84\xd7\xce\x16\x91\xb5\xc7\x44\x08"
- "\xf6\x5d\xfa\x9a\x2e\x1a\xb1\x61\x09\x65\xd7\x74\xd1\xf0\xcd\x5d"
- "\x94\x25\xfe\x91\x65\xaa\x81\xdd\xf6\xd4\x19\x1b\x41\x27\xe4\x0f"
- "\x2c\x26\xcb\xe6\x25\x24\x79\x24\x5a\x09\xfb\x2d\x02\xfb\xed\x54"
- "\x16\xeb\xc6\x1e\xfb\xad\x5b\xda\xc5\xbb\xdb\x14\x1f\xed\x6e\x1b"
- "\xe0\xa4\x94\x8c\x19\x64\x03\x7e\xee\x93\x74\xe3\x8d\x19\x6d\xb0"
- "\x1d\xd1\x66\xbf\xde\x5e\x5c\xc7\x58\x9d\xd4\x5f\xb6\x15\xfa\x5a"
- "\x54\x7e\xb6\xab\xcf\x71\xd8\xc4\x3c\x15\x62\xb9\x41\x1b\x6e\xba"
- "\x87\xf7\x62\xf7\x0c\x09\x9b\xe7\xd7\x88\x30\xa7\x97\x0c\x13\x61"
- "\xa4\x67\x71\xdd\xbb\x90\xde\xe9\xb9\x29\xcf\x6f\xda\xb4\xb3\x2f"
- "\x1e\xc5\xfc\x48\xd7\x2b\x37\xfd\x51\x98\xca\xc1\xa3\xdb\xb3\x96"
- "\x45\x60\x7b\x9f\x64\x99\xbd\xe9\xd0\xd4\x22\x11\x71\xcc\xe5\x7d"
- "\xf1\x9b\xbc\xbc\x67\xcf\x7b\x75\xef\xc3\xb6\xf9\xbe\x7d\x7a\x1e"
- "\x2f\x78\xae\x60\x2d\x02\xcc\x55\xdb\xb3\x04\xe6\xe7\xf1\x36\x3c"
- "\x51\x5f\x76\x3c\xfb\x8a\xbc\x2e\xfd\x52\x7e\x9c\xe1\xa7\x07\x0b"
- "\x19\x77\xde\x93\x65\xdd\x09\x7b\xeb\xd2\x63\xf4\xe3\x89\x21\xd0"
- "\x01\xef\x31\xfe\x4f\xcc\xd1\xf7\x55\xa5\xbf\x0b\xd2\x30\xfe\xdf"
- "\x5f\xca\x69\x25\xc3\xc8\x5e\xe2\x10\x81\xbe\x6c\x26\xe9\x83\x62"
- "\xa2\xcb\x51\xa6\xc4\x80\x83\x71\xea\x37\x1d\xa6\x47\x1e\x41\x5a"
- "\x85\x01\x07\x79\x2e\xc3\x73\x75\x4f\x1e\x55\x66\x47\x4c\x99\x47"
- "\x3a\x4c\x37\xfd\x06\x69\x7b\x13\xca\x1c\x4c\x28\x73\x24\xa6\x4c"
- "\xb9\x5e\x4f\x30\xbe\xcc\x08\x8a\x2f\x33\xc2\x76\x2e\x6e\x23\x86"
- "\x27\x94\x19\x9d\x50\x66\xfc\xb9\xb8\x8d\xc8\x4f\x28\xe3\x4c\x28"
- "\xe3\x8a\xa1\x25\xfb\x83\x64\x23\x6d\x75\x42\x99\x9a\x84\x32\x3b"
- "\x8d\xe7\xbe\x7c\x7e\xe6\x6f\x22\x3b\x78\x33\xc0\xfd\xf9\x3a\xfa"
- "\xa7\xe3\xad\xe7\x3b\xf5\xb2\x81\x24\xed\x8a\xc4\xd7\x37\x32\x23"
- "\xbe\xbe\x91\x43\xcf\x6d\xd7\xc8\xec\x84\x32\xb9\x09\x65\xf2\x62"
- "\xca\xd4\xa9\x7a\x46\x16\x26\x94\x29\x49\x28\xb3\xf2\x5c\xbe\x1a"
- "\x59\x9d\x50\x66\x47\x42\x99\x86\xef\xa1\x05\x8f\xe3\xca\x37\x6b"
- "\x30\xdb\xca\xf7\xc2\x46\xb8\x79\x18\xfb\x1c\xf0\xde\xe4\xb6\xae"
- "\x70\x3f\xde\x0f\xe1\xf1\xaa\xd1\x15\xc6\xd8\x72\x33\xe6\x3f\xb7"
- "\x95\x1b\x63\x16\xfb\x63\xb0\x4c\x2b\x1b\x7b\x64\xa0\x2f\x5b\x94"
- "\xeb\x31\x7c\xb5\xb8\xae\xc6\xa1\x3c\x4e\xdd\x3c\xad\xc7\x26\x56"
- "\xfe\x4b\xa4\xe0\xdc\xfc\xae\xb1\x37\x5a\xab\xfc\x3c\x52\xd8\x26"
- "\x6f\x74\xc9\x32\x15\x31\x76\x34\xd7\x1f\xda\xb3\x24\x6c\x8e\xc7"
- "\xe3\x66\xe7\x79\xf0\xc8\x80\x6d\xe4\x6a\x81\x65\xc1\xfb\xd7\xcd"
- "\x35\xb0\x81\x60\xf7\x33\x6e\x47\xe9\xe6\xa0\xb4\xc9\xe6\x76\x11"
- "\xdf\xfb\x4a\xef\x94\xfb\xdb\xca\x26\x1d\x95\xd5\x84\xfa\xd9\x76"
- "\x6f\x2a\x3e\x4d\x1d\x72\xfc\x65\xdb\x6d\xd4\x23\x8d\xa5\x41\xe0"
- "\x35\xaa\xc7\xff\xc3\x4f\xa3\xa6\x49\x5b\xa3\x62\x5f\x31\xef\xbd"
- "\xf3\x1e\x52\x63\x28\x87\xf3\x80\xff\x6f\x1e\x61\xb4\x17\x63\x3d"
- "\x64\xec\xe6\xc8\xf9\x68\xa6\xfa\x70\x54\x69\x3c\x4f\xf6\x03\xaf"
- "\x8c\x5a\x1f\xdf\xef\xa3\xea\xe2\xfb\x7d\xd4\xae\x78\x9e\x34\x81"
- "\x27\x47\x35\x25\x94\x39\x9c\x50\xa6\x2d\xa6\xcc\x7a\xbd\x9e\x70"
- "\x7c\x99\x6c\x4b\x7c\x99\x6c\x7b\xcc\x33\xda\x98\x9d\xd5\x33\xf7"
- "\x91\xbe\x45\xd9\x39\x31\xcf\xa6\x2a\xa9\x3f\xb3\x27\x19\x69\xbc"
- "\x76\xb4\xf9\x4d\xe5\xdb\xa2\xc3\x73\x26\xc8\x3b\xe7\x2f\x4d\xc0"
- "\x61\x75\x02\x0e\x3d\xf2\xaf\xef\xa7\xff\xfe\x18\xdd\x52\xa2\xef"
- "\xa7\xb7\x63\xcc\x9e\xca\xcf\x80\x55\x8d\xfc\xa0\x43\xf6\xc1\x04"
- "\x78\x47\x12\xe0\xb5\xc7\x3c\xdb\xf0\x1c\x89\x69\x83\x2d\xd5\x2e"
- "\xfd\x04\x61\xbf\xdd\x92\x69\xa4\xf3\x9c\x12\xf8\x06\xdc\x72\xac"
- "\xc9\x65\x9f\xad\x41\x47\xe9\x16\xf6\x69\xd2\x75\xf9\x2d\xb1\xf2"
- "\x4f\xaa\x5d\xb7\x4c\x8b\xc7\xe3\x96\xc2\x78\x3c\x6e\x29\x89\x69"
- "\x57\xc8\xba\x9c\x7e\x61\x8d\x3c\xf4\x18\xdb\x3e\xec\x6b\x27\x7d"
- "\xa7\x96\xc1\x66\x3b\x43\x36\xf6\x59\x3b\x56\x42\xa9\x3e\x57\x00"
- "\x73\xb9\xdd\xfe\x3e\xf9\x29\x7d\x5f\xb9\xee\xf7\xe7\x00\xfc\xc3"
- "\x06\x3f\x6a\xab\xf6\x95\x6b\x95\x9f\xd6\x23\x0d\xfa\x6f\xd4\x0c"
- "\x65\xe7\x36\x04\x85\x3b\xbf\x1a\xf4\xc4\xbc\xe8\xd6\x3f\xeb\xf3"
- "\x88\x2a\xf6\xbd\x82\xee\x09\x60\x8c\xcf\x50\x7b\xe5\xb7\x0e\x8d"
- "\xe1\xeb\x90\x63\xc9\xdd\xe2\x28\xdd\xfa\x25\xdb\x00\x2c\xa3\xec"
- "\xc3\xd5\x18\x09\x12\xcf\xbd\x7d\x91\xe3\xd2\x76\xc3\x7b\xbf\x5e"
- "\x36\x3f\xa6\x6c\x50\x9f\x1b\x07\xf8\xdd\xa8\x08\x99\x1b\x43\x41"
- "\x02\x9c\x4c\x65\xef\xdd\xfa\x65\x23\xe4\x15\x65\x56\x1b\x65\x78"
- "\x1e\xcd\x65\xac\x25\x64\xbe\xb9\x94\xcc\xde\x25\x47\x25\x6c\xc3"
- "\x97\x02\xb6\x74\xbb\xaf\x34\x40\xbe\x50\x2b\xaf\x75\x99\x95\x0f"
- "\xcc\xad\xfe\xd4\x30\x59\x3a\x2a\xf7\x15\xfb\x71\x1f\xad\xdc\xe7"
- "\x02\x6e\x90\xa7\x5b\xcd\xac\x6f\x62\x69\x37\x61\x42\xde\x43\x53"
- "\x27\x8f\xfc\xe5\x43\xf7\x4f\x9b\x70\xa7\x63\xda\x9c\x17\x66\x15"
- "\x8e\x7c\x71\x41\x89\x63\xd1\xbc\x39\x25\x73\xe6\x3e\xeb\xc8\x76"
- "\x5d\xe7\x72\xcc\x2c\x51\xd7\xac\xa2\x99\xf3\x4b\xc6\xf2\xed\x08"
- "\x47\xf1\xbc\x59\x0b\xe5\xed\x8d\xe9\x14\x0f\x64\x4e\xc9\xac\x79"
- "\x8e\xeb\x0a\x47\x38\xee\x9b\x39\xa7\x68\xc1\xbc\x59\x49\x61\xdd"
- "\xe9\x98\x37\x6b\xde\xac\x99\x85\x8e\xb1\x8e\x6c\x86\x1c\x0b\x2e"
- "\xa6\x3f\xb3\x8d\x71\x8c\xc7\xaf\x75\x1e\x71\x48\x1f\xcf\xfc\x8a"
- "\x7f\x6e\xdb\x73\xee\x58\x76\xdb\x81\x78\x9e\xbb\xad\x35\x9e\xe7"
- "\x6e\x0b\x9c\x3b\x96\xdd\x96\x30\xfe\x8d\x4e\x18\xff\x46\x0f\x3d"
- "\x77\x2c\x1b\x9d\x30\xfe\x8d\x4e\x18\xff\x46\xf7\x8c\x7f\xe0\x25"
- "\xff\x0a\xa9\x17\x46\x27\x8c\x7f\xa3\x13\xc6\xbf\xd1\x2b\x13\x9e"
- "\xab\x62\x9e\x2f\xc5\x73\x7d\xec\xf8\x88\xe7\x3d\x86\x7c\xf6\xea"
- "\x97\xd1\x07\x8c\x3c\xac\xeb\xa1\x9b\xdb\xf4\xbc\xfe\x98\xbc\x01"
- "\x3d\x6f\xa8\x47\xfe\xc0\x47\xec\xeb\xa6\xe6\xeb\xb7\x3f\xc6\x3a"
- "\x9d\xfd\xdc\x78\x6c\x82\x7c\x5c\x7d\x92\x46\xff\x91\x61\x31\x0f"
- "\xb3\xdf\xa3\x78\xeb\x89\xce\xda\x41\x64\xe1\x32\xb5\xaf\x91\x59"
- "\x78\x6e\x6d\xc7\x95\x90\x96\x81\x1f\x74\xca\xed\xb0\x7f\x37\x97"
- "\xaa\xf1\xe2\xf6\x3a\x69\xf3\xa3\x8c\x0e\x5f\xce\x6b\x00\xc7\x8e"
- "\x32\x96\x75\x6a\x2c\x6e\xc3\x7d\x06\xf3\x34\xca\x9b\x85\xe9\xb6"
- "\x5b\x70\x25\xa4\xd9\xf0\xcb\x04\xbc\x3a\x03\xde\xca\xc1\xc9\x6d"
- "\xcb\x44\x3b\xb7\x67\x3e\x68\x22\xeb\x3a\x8f\xd6\xea\xd3\xd8\xb6"
- "\xbe\xfd\xb0\x5a\x5b\xd8\x0d\x5b\xfe\x8b\xfc\x5a\xa4\x27\x9f\x27"
- "\xfd\x04\xf6\xdf\xed\x07\xd4\x7a\xcb\x4f\xd0\xff\x0f\x86\xd4\xda"
- "\xe9\x6e\xf6\xbf\xe8\x3a\x46\x3f\xf9\x18\xd7\x6e\x5c\xdf\x36\xe0"
- "\x7b\xe5\x7c\xfb\x27\xa3\x85\x27\xe5\x61\x86\x9b\x90\x3e\x09\xfa"
- "\xad\xcb\x1a\x29\xcf\x4f\xf2\xce\x29\x3c\xa9\x0f\x25\x49\x2f\x87"
- "\xcd\xd0\xe5\xa7\x9f\xec\x61\x7c\x63\xd2\xab\x85\x67\xe0\x34\xce"
- "\xef\xe7\xfa\x50\xa6\x2f\x5b\xdb\xf0\x6b\x55\x7e\xe8\x3f\x69\x4b"
- "\x68\xc7\x77\xc7\xe8\xa7\x33\x55\x3b\x7e\xba\x2f\xa1\xee\x48\xf2"
- "\x76\xfc\x34\x13\xed\xf8\x2e\x79\x3b\x7e\x9a\x2d\x69\x6b\x42\x5b"
- "\x4c\xe7\xbc\x9b\x84\xb6\x7c\x27\xe9\x1e\x9f\x5e\xa8\xdb\x42\x3c"
- "\x27\xb3\xe1\x9d\x2c\xfb\x70\x69\x6f\xbf\xe9\xf9\x56\x5b\xab\x29"
- "\x2f\x49\x9d\xf5\xc2\xd3\xff\x61\x3f\xfd\xf4\x88\x84\xd3\x9b\xbe"
- "\x57\xe1\x02\x3a\x99\x24\x9d\x58\x1e\xac\x7d\xf5\xb7\x31\x2f\x51"
- "\x6b\x21\x39\x90\xff\x9f\x78\x8d\xb5\xcc\xf9\xa5\x22\x68\xd0\x11"
- "\xef\xb2\x12\xde\x85\x63\xde\x8d\x8f\x7b\xb7\xac\x27\x7d\xba\x91"
- "\xfe\xc3\xfa\x29\x67\x75\x42\x3f\xa1\x7f\xee\xb8\x2a\xbe\xdd\x39"
- "\x35\xaa\x7d\xe8\xa3\x73\x68\x9d\xd3\x80\x3e\xea\x4e\xde\x47\x39"
- "\x87\x93\xf3\x5a\x8e\x5c\x47\x13\x83\x28\x09\xbc\x3b\x78\x8e\xdd"
- "\x2d\x79\x50\xef\xa7\x73\xfb\xe7\x8e\x11\x46\xff\xfc\xb0\x36\xde"
- "\x51\x9c\xd0\xc6\x28\x60\x9c\x50\x6d\xbd\x73\x6c\x02\xec\x8a\xe4"
- "\xbc\x78\x47\x1d\xda\x19\x4d\xde\xce\x3b\xf6\xf6\xcd\x8b\x77\xb4"
- "\xa2\x3d\xd1\x73\x79\xf1\x8e\xa0\x2a\x43\x49\xca\xdc\x99\x21\x3c"
- "\xc9\xea\xb9\x73\xb8\x3b\xc2\x76\xee\x9d\xbc\x97\x62\x8f\x49\x1f"
- "\x13\xcf\x7f\x68\x03\x97\x63\xfa\x45\x94\x9e\xe5\x7e\x38\xe6\x20"
- "\xd3\xf7\xf1\x64\xa7\xe7\xce\x9a\x04\x5a\x9d\x3a\x46\x3f\xbb\xaa"
- "\xc3\x94\x52\xaf\xe8\xf5\xb3\x2f\x13\x70\x6a\x48\x4e\xaf\x3b\x0f"
- "\x81\x5e\xa7\x92\xd3\xeb\xce\xf6\xbe\xe9\xf5\x33\xee\xff\x53\xe7"
- "\xd2\xeb\x67\x8e\x58\x7a\xc1\xd6\x95\xed\xbb\xd6\x0e\xde\xe8\x2e"
- "\x10\xb5\xdc\xd6\x28\xd9\xac\xe0\x15\x55\xa6\x9d\xcb\x4c\xb3\x86"
- "\x15\x9f\xc0\x86\xb4\x9c\xa4\x9f\x8d\x31\xe4\x7f\x60\x35\xf5\x17"
- "\xdd\x4f\xb0\x1f\x51\x0a\x97\xf3\xb9\x4e\x79\x7d\x91\x6c\xe2\xf9"
- "\x47\x42\xbd\xd5\xc9\x75\xc1\xcf\x76\x81\xa6\xaf\x25\x49\x3f\xa0"
- "\xfc\xcb\xc6\x50\xbc\x8e\xf8\x99\x3f\xbe\x8f\x40\x37\x94\xd3\xb7"
- "\x9d\xbe\xf7\x77\xfe\x3e\x1b\x93\x77\x6e\x9f\x8d\xf9\x56\xf5\xd7"
- "\x98\x3f\xc6\xe3\x37\xc6\x99\xbc\xbf\xc6\x94\xf7\xdd\x5f\x63\x6a"
- "\xfa\xee\xaf\x31\x0d\xdc\x5f\x68\x6f\x30\x7e\xdc\x18\x73\x28\xbe"
- "\xbd\xa8\x17\xe5\x84\xe9\xa2\x4b\xf9\xf9\x87\xb6\xdb\xf8\xb1\x8e"
- "\xe3\xbe\xaa\x2d\x23\xf0\x72\xca\x30\xc6\xf1\x42\x61\xf4\x09\x1b"
- "\x34\x5c\xbf\x24\xf9\x7e\x2b\xcf\x71\x5b\xaa\x89\x78\x1f\xd9\xf1"
- "\x23\xb6\xdd\xc7\xfe\x41\x33\x51\x2b\xee\x4d\xc7\xe8\xee\x57\x35"
- "\x93\xa9\x94\xf7\x3c\xa5\x5f\xb8\x5c\x43\x18\x7b\x24\xb6\x2f\x78"
- "\xef\x93\xe7\xa6\x6b\xd5\xdc\xe9\xef\xc7\xe8\xae\x59\xaa\x5f\xee"
- "\x7e\x29\x9e\x8e\x77\x51\xf2\x7e\xb9\xcb\x8e\x7e\xf9\x7b\xf2\x7e"
- "\xb9\x6b\x74\xdf\xfd\x72\x57\x1e\xfa\xe5\xef\xe7\xca\xd1\x5d\x4e"
- "\x5d\x8e\x56\x70\x19\xc7\x5c\x9e\x8f\xdf\xf5\x17\xce\x83\x7b\xc8"
- "\xc8\x5d\x7c\xa4\x3c\x65\x64\xbb\x21\x47\xb2\x4c\x0d\x60\xc9\xfa"
- "\xf5\x3c\xd5\x3a\x8c\x58\xb8\x5e\x6b\x7b\x32\x39\xb9\x4b\xf6\xd3"
- "\xcd\xc5\xc4\x7b\xf1\xf9\x9b\x18\xc6\x3c\xa2\x93\x74\xf7\x48\xce"
- "\xc7\xe9\x37\x87\x62\xe5\xe4\xee\x9e\x7c\xac\xeb\xf4\xbc\x24\x3a"
- "\x9d\xc4\xf9\xe2\x61\xdf\xad\xb7\xbf\xbf\x1c\x47\x38\x3f\xe7\x4b"
- "\xc8\x93\xaf\xe4\xf1\xee\x9a\x78\x79\xbc\xbb\x38\x9e\x3f\xef\x92"
- "\xe5\x34\xe8\x39\x3f\x8d\x6d\x02\x0e\x3f\x98\xbf\xce\x2f\x9b\x77"
- "\xb7\x27\xc8\x26\x78\x20\x77\x8d\xe2\x81\xdc\x17\xe2\x71\xcd\x35"
- "\x27\xe7\x81\xdc\xa1\x7d\xf3\x40\x6e\x4e\xdf\x3c\x90\x3b\x8d\x79"
- "\xc0\x4f\xb9\xab\xe3\x65\x33\xb7\x28\xbe\xed\xa8\x57\xca\x26\x5d"
- "\x72\x21\xb2\x09\x5b\xe8\xd2\xbe\xe4\x90\x65\x8a\xfd\x47\x6a\xbb"
- "\x8c\xbd\x8e\x1f\x44\x33\x0b\xe4\x0a\xf8\xdd\xe3\xe0\x35\x25\xe8"
- "\xf8\x1c\xa6\xe1\x66\x79\xf6\xf0\x9e\xd1\xb1\x74\x5c\xab\xce\xc7"
- "\xb9\x91\xf7\x53\xde\x57\x56\xf4\xbc\x77\x79\x7c\xfb\xef\x99\x96"
- "\x9c\x9e\xf7\x14\x81\x9e\xee\xe4\xf4\xbc\xa7\xa2\x6f\x7a\xde\x53"
- "\xcf\x67\x8f\xce\x95\xa9\x7b\xf6\x3a\x16\x4a\x1b\x45\x96\x39\x49"
- "\xf7\x5e\xf6\xc3\xc6\xa7\x7b\x42\xf1\xe3\xd3\x3d\x47\x2e\x7c\x7c"
- "\xba\x37\x27\xf9\xf8\x74\x6f\x5e\xf2\xf1\xe9\x5e\xa7\x92\x87\x7b"
- "\xeb\xe2\xe5\xe1\xde\xf2\x78\x9e\x00\xed\xfe\xc7\xc6\xa7\x7b\x83"
- "\x09\x32\xb0\xee\x18\x8d\x7b\x09\x36\x45\xb9\xea\xb7\xf1\xb7\xc7"
- "\xe3\x38\x2e\x23\x79\xbf\x8d\x1b\x8e\x7e\x5b\x97\xbc\xdf\xc6\xe5"
- "\xf6\xdd\x6f\xe3\x78\x0f\x7a\xdd\xb9\xfd\x36\xae\xe4\xc2\x6d\x8a"
- "\x71\x3b\xe2\xfb\x6c\xdc\xfa\x0b\xef\xb3\x71\xed\xc9\xfb\x6c\xbc"
- "\x39\x79\x9f\x8d\x1f\xaa\xfa\x6c\xfc\xb4\xf8\x3e\x1b\x3f\x3a\xbe"
- "\xcf\x40\xb7\xff\x66\x9f\xa1\x7f\xcc\xca\x3f\x61\xfc\xc7\x98\xb7"
- "\xf7\xef\xf4\x8c\xdf\xe9\xa7\x09\x25\x6a\x6e\x3d\x41\x8d\x1d\xaa"
- "\x0f\x3f\x40\x9e\xba\x73\xc7\x81\xf1\x07\xf4\xb4\x5f\x9e\xdb\x0f"
- "\xe3\xdb\xa0\xa3\xdb\x9b\x4a\xe5\xde\x96\xea\x43\xa6\x39\xf2\x79"
- "\x97\xf0\xfe\xd4\x04\xde\x2c\x4a\x41\x1f\x0b\x5f\x38\x42\xac\xd7"
- "\x91\x3f\xc4\x70\xf8\xcc\x65\x3c\xac\x09\xd9\x17\x32\xc6\x9f\xc7"
- "\xa7\xc6\xec\x2d\xbb\x15\xf0\xee\x9b\xa0\x78\x75\x42\xa2\xfd\x5b"
- "\x8b\x77\x57\x28\x3e\xfd\xf9\xd7\x09\x38\xec\x49\xce\xa7\x13\x0e"
- "\xa2\x0d\xb5\xc9\xf9\x74\x42\xa0\x6f\x3e\xbd\x0f\xfd\x4f\xb5\x31"
- "\x73\x9f\x41\x4f\x45\xfc\x09\x73\x9f\xfb\xb2\xac\x21\xc5\x3b\xd2"
- "\x26\xaa\xdc\x6d\xee\xf4\xdc\x97\x68\xff\xa1\x6f\xee\x6b\xd6\x71"
- "\xfe\x43\x42\xf9\x3e\xec\xbf\xfb\xd8\xfe\xfb\x20\x39\xce\xf7\x9d"
- "\xc7\xfe\xbb\x8f\xed\xbf\x0f\xce\x95\xad\xfb\x74\xfb\x2f\xd9\x1c"
- "\xef\xbe\xf6\xe4\xfd\xff\xf3\x84\xfe\xa7\xfc\x12\xcc\x87\x65\xf9"
- "\xf8\x7c\x23\x62\xf3\xb1\x6f\x12\xe7\x65\x1e\x49\x92\x37\x3f\x11"
- "\x66\x1f\xf9\xca\xcf\xe1\x3d\xf6\xa5\x4a\xca\x7b\x3f\xdf\xa9\xe4"
- "\x71\xa2\x39\x5e\x1e\x7f\xde\x14\x2f\x8f\xf7\x39\x13\xca\xb5\xc5"
- "\xbf\x07\xff\xfc\x8f\xe9\xd8\x89\xd3\x12\x78\xe0\x8b\x63\x34\xf1"
- "\x8f\x8a\x07\xee\xbf\x31\x1e\x8f\x89\x45\xc9\x79\x60\xe2\x4a\xb4"
- "\xff\x8b\xe4\x3c\x30\xb1\xae\x6f\x1e\x98\xb8\x17\xb4\xfc\x22\x96"
- "\x6f\x1f\x2e\xcd\xed\x9f\x90\xc7\x9f\x5c\xe7\x4d\x0c\x27\x5f\x23"
- "\xb8\xdf\xa6\x68\x7c\xff\xc4\x78\x1a\xdf\x9f\x15\x4f\x43\xb4\xe5"
- "\xbf\x4f\xc3\x9e\xd8\x07\x9d\x9e\xfb\x13\xe5\xdf\x77\x8c\x1e\xd0"
- "\xe5\xff\xc1\x4b\x12\x70\xdc\xa3\x70\x49\xb6\x2e\x72\x3f\xcf\x7f"
- "\x7d\xc9\x69\x79\x7f\x7b\xf2\x36\x3f\x60\xc6\x18\xe4\xd3\xce\x91"
- "\xa5\x07\x86\x22\xfd\x61\x5e\x0f\xe5\xf5\x90\xcd\x48\x7f\x38\x42"
- "\x16\x39\x5e\xf5\x8c\x4b\x0f\xe4\xb2\x2f\x0a\xd3\x9f\xf9\xd7\x3a"
- "\x94\xf2\x78\x0c\x62\xbc\x0a\x4a\xa5\xdf\x82\x75\x25\xf3\xfa\x35"
- "\xcc\xeb\x0f\x48\xfb\x8f\xf7\x59\xd8\x8f\xd0\xea\xa2\x3c\x5f\x28"
- "\x42\x06\xbf\x73\xfe\x04\xd8\x35\x2c\x17\x9c\xdf\xc8\xab\xd6\xcd"
- "\xca\x13\x74\xd3\x03\x4d\xc9\xfb\xf8\x81\x23\x7d\xf3\xce\x03\x61"
- "\xd5\xcf\x0f\x8e\x88\xef\xe7\x07\x6d\x9a\x67\xe0\x34\x6e\x2b\x78"
- "\xe0\x82\xe4\xa4\xc4\x21\x82\x7d\xea\xfb\x15\x4f\xb4\x16\x97\xd1"
- "\x8f\x8e\xd3\x83\x55\xb2\x3e\x93\x08\x5b\x97\xa7\x50\x93\xd4\x01"
- "\x0f\x7e\x23\xf1\x44\x9e\x82\x08\x99\xc4\x8a\xe7\x5b\xf9\x5d\xad"
- "\x47\x84\x91\xef\x10\xef\x09\xf0\x99\x65\xf0\xc2\xa5\x47\xe9\xc1"
- "\xf7\xe2\xca\x43\x13\xf8\x14\x8c\x40\xad\x94\xc7\x07\xdb\x8c\x35"
- "\xdd\x95\x78\x4e\xbe\xee\x3b\xc9\x62\xf8\x3e\x28\x9f\xb1\x07\xfb"
- "\xdc\xbf\x64\x9c\xf8\xac\x0c\xe3\x74\x7e\x3d\x30\x69\xba\xc1\xbf"
- "\xca\xd7\x72\x52\x51\xaf\x2f\xdf\x24\x97\x9f\x26\x39\xce\xb3\x36"
- "\x18\x23\x07\x93\xea\x63\xe1\xa8\xf8\x1f\x93\x1a\x0c\x7f\x3c\xdc"
- "\x37\x7d\x0f\x2c\x03\x9f\xf6\x04\x7c\x60\x47\xdc\x7b\x58\xc1\x98"
- "\x6c\x39\x1f\x0c\xee\x73\xc5\xb3\xcc\x0f\x93\x1d\xe7\x5b\xf3\x4b"
- "\xb5\x53\xde\xeb\xe7\xf0\xd6\x64\x69\x2f\x31\x8c\xf3\xe3\x38\x79"
- "\x7d\xdc\xdc\x42\xee\xdd\xf3\xde\xd6\x94\x27\x95\xdc\x4f\x49\x58"
- "\x23\x9c\xbc\x53\xfa\x53\xe9\x72\xff\x54\x24\x51\x0e\x26\x1f\x34"
- "\xc6\xe8\x84\xf4\x36\x43\xee\x31\xaf\x65\xb8\x09\xeb\xac\x53\xcc"
- "\x4a\x16\xa6\x4c\xd7\xd2\x62\xe7\x6b\x53\xa4\xfd\x67\xac\x97\xe2"
- "\xbd\x39\xa1\x5c\xc2\xfa\xdf\xe4\x9d\xa2\xef\x75\xfa\x0c\xf4\x6f"
- "\x88\xf7\xb6\x54\x0c\x84\x29\xab\x13\xd6\x2b\x82\x6b\xe5\xf9\xf6"
- "\xbf\x02\xee\x54\x5d\xef\xe5\x25\xd8\x78\x53\x76\xba\x4f\x9c\xaf"
- "\xfd\x53\xfa\x68\xff\x94\xde\xf6\xcf\x65\xb8\x53\x13\xd6\x12\xa7"
- "\xca\xf6\x47\xcf\xd1\x7f\x53\x87\x42\x7f\x19\x74\x83\xcd\x3d\x75"
- "\x81\x61\xab\xf3\xfa\x41\xdf\xb6\xfa\xd4\xde\xf5\x3f\x55\xae\x77"
- "\xfd\x2f\x98\xcc\x56\xf7\x93\xdc\x5b\x8d\xaf\xbb\xda\x5a\x93\xac"
- "\x2d\x53\xfb\x58\xff\x9b\xaa\xaf\xff\xe5\x39\xe2\xf5\xd9\x54\x7f"
- "\x7c\x1f\x4e\x4d\xe8\xc3\x3c\x8a\xef\xc3\x29\x3b\xff\x6f\xc7\x35"
- "\x06\x94\x9a\x9a\x6a\x4a\x4d\x31\xa5\xa4\xe2\x35\x9a\x48\xfd\x53"
- "\xcd\xa9\xfd\xf0\xbb\x48\xbf\xf6\x37\xa5\x9a\xcc\xf8\xf5\xd3\xaf"
- "\x17\x25\x3c\xf7\xe7\xb2\xf8\x99\xf5\x6b\xbf\x84\xe7\x8b\xbe\xe7"
- "\x7d\x7f\xbd\x5e\xa3\x7e\x73\xc2\x73\xbf\xef\x79\x7f\xd1\x7f\xb3"
- "\x3c\x9d\xf3\x1c\xef\x87\x76\xff\xdc\x85\x33\x8b\xe6\x14\xca\xfd"
- "\xe2\x59\x8e\x99\xcf\x3c\x33\x6b\xfe\x7c\x47\xc9\x8b\x8e\x7b\xef"
- "\x79\xe8\xd6\x3b\x1d\x6a\xdb\xb9\x68\xec\x75\x85\xe9\x34\x79\xd1"
- "\x3c\x7e\x31\xf9\xe1\xfb\xf3\x1d\x79\xf7\xde\x13\xff\xd2\x00\x23"
- "\xb7\x97\xcf\x07\x25\x46\xfe\x72\x2b\x07\x13\xad\x7e\x53\xea\x9e"
- "\x36\xf6\xf3\x55\x6b\x1e\x8f\x2e\x3f\xc8\xfe\xa3\x5d\x6e\xe1\xbd"
- "\x86\xf7\xf4\x1f\xba\x8e\x1b\x31\xb2\xae\x9c\x8a\x9f\xe6\xf3\x2b"
- "\x0f\xdd\x23\xf6\x07\xc9\xf1\x00\x99\x8e\xd2\x13\xaf\x36\xc1\x2a"
- "\xe2\x67\x9f\x3f\x42\x0e\x37\x59\x50\xfe\x16\xbc\x4b\x11\x77\x69"
- "\x48\x0b\xe9\xbe\xd0\x8f\xdc\x23\xd3\xf6\x97\x1b\xf9\xac\xc7\xe8"
- "\xa1\xaf\xc5\x7e\x21\x9f\xf9\x7c\x90\xca\xf7\xd0\xa7\xc2\xf4\x0b"
- "\x17\xeb\x86\x9a\x41\x64\xe6\xbd\xd0\xb7\x07\x91\xe5\xed\xc1\x1c"
- "\x0b\xe4\xa1\x9d\xc6\x5e\x68\x25\x9e\xfd\xf4\xc4\x7a\xae\x9b\xf3"
- "\x6a\xa6\x5f\x6c\xe5\xfc\x9b\xe3\xf3\x1f\xe9\xdd\x8b\x7d\x68\xa7"
- "\x09\xf9\xa6\x7e\x49\x56\x6b\x54\x7c\x1b\x4e\x7f\xd7\x7f\xf3\x44"
- "\x4a\xf1\xa1\x2b\x0e\x46\xca\x49\xf9\xfc\x3c\x7c\xdd\xe2\xa8\x88"
- "\xb0\x7f\xfa\xe4\x76\xb7\x58\xf7\x02\x99\x21\xd3\x29\xde\x79\xec"
- "\xa3\xf0\x70\x46\xed\x2c\x32\xa3\xfd\x43\x8f\xd3\xb4\x31\x8e\x29"
- "\x44\xee\xc9\x64\xfe\x77\x17\xfb\x1b\xee\x2e\x5b\xfb\x27\x32\xff"
- "\xb6\xab\xdc\xd4\x25\xec\x54\x5a\x22\x02\x82\xe3\x03\x85\x44\x98"
- "\x7d\xfc\x0f\xce\x88\x72\x9e\xb9\x9d\x6e\x3b\xb5\x94\x84\x68\xd9"
- "\x11\x11\xae\xf8\x93\x3a\x1b\xd0\xdc\x1e\x62\xff\x45\xcb\xb2\xc9"
- "\x94\x7a\x2c\x9f\x4c\xcd\xce\x6a\xf2\x4d\x0f\x51\xe9\x11\x11\x38"
- "\x38\xe3\x6b\x6a\x71\xee\xa2\x82\x56\x32\x1d\x6c\xfb\x1b\xc9\x18"
- "\x37\xab\xbe\xb1\x95\x9d\x21\xfb\xb2\x39\x9c\x76\x86\x96\x2c\xa3"
- "\x01\x4b\xfe\x4c\x56\x5f\xa0\x15\xf5\x9c\xa0\xc7\x0f\x53\x0a\xe0"
- "\x99\x96\xfe\x8d\xec\x4b\x1f\x63\x3f\xdf\x5c\xaa\x29\x23\xbb\x70"
- "\x67\x65\x74\xb9\xb3\x6c\x5d\x22\x6b\x50\xa7\x3b\x2b\xb3\xa5\x18"
- "\xf9\xdb\xf6\xd1\xc0\x56\xca\xdc\x7f\xbc\xd5\x54\x7d\x9a\x86\x72"
- "\x9b\x8e\xa1\x6d\x35\xa7\x91\x7f\xd5\x7e\xaf\x86\xb2\xb1\x65\x22"
- "\x69\xfb\x5b\x7d\xf9\x61\xd2\x00\xab\xba\x8b\x86\xd6\x74\x91\x5d"
- "\xab\xdc\xef\xe5\x72\xed\xf4\xc8\x1d\xbe\x83\x44\xa5\xcb\x44\xb4"
- "\x7b\xd5\x87\x7e\xe8\xc4\xfe\x1f\x3c\xdd\x60\xf6\x1d\x6c\xa7\xe6"
- "\x50\x17\xb5\xd0\x5f\xc9\xe7\xfa\x87\xf7\xb7\x4f\x37\xf4\xd3\x20"
- "\x04\xde\x25\x6d\xa8\x4b\xf1\x8e\xbb\x99\xcf\x2a\x97\xd3\xba\x32"
- "\xca\x28\x5e\x42\xfd\x8f\x23\x5d\xcd\xed\xeb\x03\xbe\xc8\x3f\xbc"
- "\x4b\xa4\x3f\xee\x13\xeb\xcb\x9a\x29\xb5\x25\x54\xcd\x7e\x9f\xa6"
- "\x68\xfa\x37\x36\x5f\xe8\x10\xf9\x8a\xff\xee\xd5\x2c\x81\xf0\x6a"
- "\x8d\x2c\xef\x9d\x3d\x64\xf2\x99\xcf\x92\x2f\x3f\x44\x5f\xa0\x6e"
- "\xb1\xea\x9b\xa1\xd0\x5b\xb9\x2d\xa1\x30\x9f\x77\xca\x16\x1d\xf6"
- "\xf4\x75\xf3\x68\xc4\xe6\xd3\x34\x7c\xd3\x69\xca\x12\x9d\x59\x26"
- "\xf6\xb1\xe5\xb3\xa9\x9b\x70\xcd\x68\x23\x0b\xda\xae\xfc\xb1\xd3"
- "\x74\x5f\xdb\xee\x2c\xaa\xed\xea\xf5\xb5\xed\xea\xe8\xf5\xb5\x05"
- "\x4f\xed\x62\x7f\x5b\x3f\x4d\x1b\x6f\x3d\x48\xfd\x21\x27\x4e\xe6"
- "\xef\x75\x27\xc9\xbc\xe2\x24\xd1\xcd\xe5\x26\x72\xcc\xe6\x73\x16"
- "\x8f\x5e\xe7\x43\xdf\xf0\xfd\x51\x7a\xe4\x08\xae\x19\xf8\xa5\x40"
- "\x26\xfe\xc8\xed\x6c\xd3\xf9\x18\x69\x26\xa4\xfd\x01\xd7\x54\x5c"
- "\xf7\xb9\x6b\x44\x50\x54\x7c\x94\xd3\x61\xa2\x74\xe6\x67\xe5\xdf"
- "\xfb\x51\x4e\xa7\xe7\x91\x3d\x7e\x7a\x7e\xb8\xc1\xd7\x4a\xc7\x3f"
- "\xb4\xeb\x8b\xa3\x27\x38\x0e\x55\x50\xe2\xd5\xed\x4c\xe1\x98\x54"
- "\x7a\x3a\xe3\x70\x15\xd7\x7b\x94\x1e\xe5\x7a\xac\xf8\x41\x4e\x1f"
- "\xa9\x32\xca\x76\x74\x3b\x51\xe7\xa3\x97\x21\x5d\x18\xe9\x68\xb7"
- "\x99\xdf\x7d\x74\xf4\x84\x49\xe5\xc9\x32\x01\x66\x58\x87\x0f\xd9"
- "\x7f\x68\x1a\xcb\x78\x87\xc9\x2a\x1a\x67\x8c\xa6\x9a\x37\xc5\xc1"
- "\x4d\x6f\x8a\x26\x25\x7b\x8f\xe6\xfb\xa9\xc8\xc9\x38\x62\x1c\x6f"
- "\x5a\x8d\x77\x8d\x18\x85\x98\x2e\x4d\x85\xec\x4f\xf6\x28\xec\xbf"
- "\x8b\xe3\xda\x20\x3c\x79\x7c\xc6\xd7\xfa\x7e\xd9\x81\x7e\xd0\x01"
- "\xf9\x2d\x6d\xed\xf4\xdb\xae\x40\x3f\xf7\xbf\x91\xc9\x17\x39\x4a"
- "\xa3\x32\xc9\xce\xf6\x60\xed\x9b\xc2\x8f\x6b\x80\xfd\x3b\xc1\x2f"
- "\x57\x1d\xa7\x47\xff\xf0\xe3\x4c\xca\xfc\x0f\x17\xe9\xfa\xe9\xd1"
- "\xbf\xc5\xe8\xa7\x59\xcd\xfe\x86\x18\xdd\xf4\xc4\x65\xe7\xea\xa6"
- "\xc7\x2f\x51\xba\x09\xb2\x2f\x75\x51\xd4\xaf\xd2\x1f\x8b\x26\xa4"
- "\xeb\x7e\x22\x8f\x7d\x99\x90\x1e\xd6\xd3\x9b\x13\xd2\x83\x7a\xfa"
- "\x00\x43\xf7\xb5\x30\x1e\x8b\x58\xf7\xe5\x7f\xcb\xba\xaf\x65\x86"
- "\xae\xfb\xa4\xfe\xc9\xff\xb3\xd8\x0a\x5d\xb4\x90\xf5\x4d\xfe\x7b"
- "\x8c\xbf\xd8\x4f\x06\xee\x69\x48\x7b\x81\xd3\xd6\xff\x95\xcc\xf8"
- "\x19\x7a\xef\x0b\xd6\x7b\xac\xf3\x58\xf7\x6d\x1c\x2c\x5a\x37\xbe"
- "\x29\x0e\xd7\xc8\xd8\x3a\xbf\xec\xd1\x7f\xaf\x20\x6d\x35\xd2\x5e"
- "\xc1\x7b\xd6\x83\x4c\x93\xe6\xfc\x06\x9e\x23\xb7\x81\x9f\x4b\x35"
- "\x53\x36\xad\x45\x7f\xf3\x79\xc3\x95\xa0\xaf\x35\x85\x8a\x7d\x25"
- "\x7c\x86\x35\xca\x3e\x69\x6d\x2d\x25\x6d\x2c\x77\x83\x57\x40\xce"
- "\x7c\xae\xaf\xa9\x2c\x24\x8e\xf3\xb9\x3b\xc6\xa1\x60\xf1\x03\x1c"
- "\x8f\x28\xa5\xc9\x49\xc4\x7e\xe1\xac\xb3\x81\x8b\x79\x3d\x70\x52"
- "\x31\x54\xf2\x0b\xfd\x54\xb7\x53\xf5\xf5\x13\xeb\x39\xde\xd9\x51"
- "\xfa\xe5\x0e\xcc\xf7\xc2\xdc\x36\x6b\xb4\x9c\xf8\x1c\x0c\x64\x8c"
- "\xcf\x2f\x3a\x37\x9a\x34\xe7\x7a\xe3\x2c\x0c\xc7\xbe\x43\x1e\x5f"
- "\x6b\x98\x18\x67\x3f\xfd\x32\xd4\x5c\xda\xc0\xe5\xab\x99\x36\xc2"
- "\xe3\x36\x60\xa4\x48\x18\x26\x39\x6f\x74\xfa\x29\x5f\xad\x9d\xa7"
- "\x7f\xe8\x6f\x9e\x1e\x24\xd6\xfb\xbe\x00\x60\x94\x1e\x55\x30\x00"
- "\x4b\x60\x0c\x88\x7b\xa7\xc3\x1f\xb0\x4c\x7c\x0b\xf8\x85\xdc\x5f"
- "\x7c\x2e\x92\xf7\xdb\x40\x97\x0c\xf6\x95\x57\xb6\xe8\x2f\x4f\xd4"
- "\xfe\x95\x48\x3f\xdb\x09\x7e\xfb\x65\x3b\x9f\x5b\xe2\xf3\x9c\xe7"
- "\x3b\xcb\x09\x1a\x0d\x37\xce\x73\x6a\x8b\xfe\x67\xcf\x72\x02\xb6"
- "\x7d\xb3\x49\xec\x02\xfe\xed\x7c\x9e\x13\xf8\x4f\x62\x3e\xd4\xdb"
- "\x14\x7c\xe3\x71\x49\xf3\xd1\x9c\x86\xb9\xe3\x01\xa3\xff\xb9\xbd"
- "\xdc\x16\xbc\xb3\x2b\x1b\x51\x1c\xf2\xd3\x63\x41\x7e\x8f\x34\x33"
- "\xe7\x1f\x05\x3d\xe6\xc3\x18\xf6\xc1\xd1\xa8\x69\xdd\x12\x32\x2b"
- "\x9d\xf6\x44\x1a\x97\x57\x3a\xed\x71\x6f\xaf\x4e\x7b\xfc\x63\xa5"
- "\xd3\x14\x8d\x95\x4e\x7b\xfc\x5d\xa5\xd3\x1e\xdf\x22\xf7\xc5\xa0"
- "\xd3\xf8\x1d\xeb\x35\x43\xa7\x6d\x1a\x2c\x0e\xb0\xee\xe8\xf4\x3c"
- "\xbe\xde\xd0\x6d\x6b\x90\xc6\xba\x83\x71\x54\x7a\x2a\x3f\x20\xfe"
- "\xdf\x2c\x52\x7e\x07\x7c\xef\xe4\xf3\x0b\x01\xfd\x9e\xc7\x93\x14"
- "\xa5\xe3\x1e\x6f\xeb\xd5\x71\x8f\x3b\x7b\xcb\xb2\x8e\x7b\xfc\x3b"
- "\xa5\xe3\x54\x7a\xed\xe3\xac\xe3\xf2\x03\x4c\x03\x1d\xbe\x89\xd7"
- "\xf0\xf4\xfc\xa0\xe3\xa3\xc1\x58\x1d\x17\x2f\x5f\x4f\x8c\x31\x74"
- "\x1c\xeb\x36\x3c\x4f\xf2\x53\xba\x9c\x67\xb3\x9c\x55\x81\xe6\x86"
- "\xdc\x71\x1f\x70\x9b\x39\xae\x19\xd3\x6d\xdc\x09\xea\xaf\x9f\x1d"
- "\xd2\xdb\xfd\x44\x85\xe1\xfb\xe8\xa7\xc7\xd7\x27\xb3\xa3\x7b\x63"
- "\x0f\xd2\xd5\x7c\x76\xde\x57\x7e\x94\x7c\xd5\xa2\xbc\x25\x72\x84"
- "\x0a\x4a\xa0\x2b\x52\x9f\xff\x92\xfb\x16\xf3\x8e\x9f\xf1\x95\x75"
- "\x0f\xc6\xd2\xe6\x82\x10\x5d\x84\xb9\xfa\x97\xeb\x4c\x78\xe7\x8a"
- "\x7b\x27\xd7\x18\x6e\x9e\xc7\x71\xeb\x9e\xd8\xd5\xd7\x7c\xff\xc2"
- "\xea\x9b\x3e\xb6\xef\xfa\xa6\x3f\x26\xeb\x83\x4d\x85\x39\xd0\x25"
- "\x27\x69\xba\x9c\x97\xc8\xf8\x36\x2b\x92\xc2\xaa\xd4\xdf\xf7\xeb"
- "\xe3\xfd\xbb\xdf\x53\xfe\xdf\xbe\xa7\xfc\x37\xac\x8b\xd0\x3e\x6b"
- "\xd4\x13\x0f\x67\x60\xc4\xc8\x77\x1c\xf9\x9e\xbc\x44\x5f\x8b\xf9"
- "\xd2\x3d\x4c\xce\xd1\xec\x06\x4c\xe6\xbf\xb5\xc8\x27\x63\x86\x40"
- "\x57\x8e\x5f\x4c\x1c\xaf\x25\xb6\xec\xe4\x5e\x1a\x3f\x49\xe7\x59"
- "\xf7\xcb\xf0\x55\x93\x8c\xa1\xd9\x08\x9b\x14\x63\x1c\xc7\xed\xd3"
- "\xd7\x3f\x9e\xac\x87\xde\xac\x8b\xf1\x8b\x6d\x87\x9e\xbb\x9a\xe3"
- "\x1a\xb0\x7d\xb9\x4e\xcd\x37\x2f\x87\x7e\x1e\xc4\xe7\x61\xf8\x6c"
- "\x4c\x41\x34\xcf\xd4\x28\xe3\x8b\x3d\xe9\x37\xca\xf6\xb5\xce\xc2"
- "\xf5\xea\x75\xb2\x8f\x69\xa8\xd3\xf3\x54\xa6\x51\x86\x61\xb3\x9f"
- "\x22\xc6\xe5\xab\xe5\x99\xd2\x48\x3b\xeb\xc2\xcb\x61\x8b\x0e\x52"
- "\xf5\xcc\x20\x55\xcf\x53\x13\xfd\x34\xdd\x76\xbe\xb3\x19\x7d\xb7"
- "\xef\xa9\x95\x17\xde\x3e\xd2\xdb\xf7\x94\xf7\x7b\xda\x77\xbe\x7a"
- "\x23\x17\x5e\xaf\x4d\xaf\xb7\x20\xe7\xc2\xe9\x5a\x50\xf4\xc3\xe9"
- "\x9a\xad\xd3\xb5\xa0\xee\x7b\xe8\x9a\xac\x9e\xc3\x3f\xbc\x1e\x87"
- "\x5e\xcf\x0c\x4b\xb2\x7a\x48\xfe\xf5\x79\x6e\xca\x62\xc4\xb0\xe4"
- "\x78\xae\x2a\xbe\xdc\x8c\xbc\xd8\x58\xbd\x2a\xce\xeb\x8c\x42\x23"
- "\x56\xaf\x1e\x4b\x16\xba\x7a\xc6\xf2\x82\x3a\x1e\xdf\x85\xe6\xa7"
- "\x19\x2b\x39\x3e\xea\xf8\x65\xea\x4c\xb6\x5e\xa6\xfa\x7c\x31\x82"
- "\x39\xa6\x95\x10\xf9\xd4\x58\x2d\xf7\xdb\xa1\xd7\x67\xfc\x91\xfd"
- "\xef\xd5\x7e\xe1\x8c\x23\x4a\xee\x67\x60\x8e\x38\x23\xab\x6f\x18"
- "\xfb\x76\xd5\x97\x65\xf7\xeb\xcb\xa7\xbe\xd3\x33\x73\xa8\x9f\xe6"
- "\x66\x48\x3f\xfa\xf4\xcf\x0f\x60\xfe\xa0\xc7\xd5\x7b\xe6\xed\x98"
- "\x18\x82\x18\x0b\x9f\xfe\x9d\xee\xfb\x0f\x1a\x94\x83\x96\x33\xa7"
- "\x19\x34\x30\xd2\x91\xe6\x34\x68\x00\x9b\x26\xc3\x57\x17\xe1\xb3"
- "\x39\x21\x75\x0e\x7b\xe6\x1a\x51\xb9\xaf\x4e\xc1\x9e\xd9\xaa\xec"
- "\x16\xd4\xd7\x9d\x6f\x96\x73\xa5\x32\x9e\x2b\x3d\x5d\x1c\x4c\xdb"
- "\x57\x67\xe0\x21\xe6\xdb\x4d\x7c\xde\x7b\x54\x44\xc5\xe9\x62\x9b"
- "\x80\xcf\xc6\xc9\xf7\xf3\xb3\x4c\x98\x5b\x82\x26\x33\xbf\x15\x1d"
- "\x1c\x2f\x46\xc2\xce\x00\xde\xd5\x0c\xd7\x8f\x6b\x70\x69\x16\xc7"
- "\xba\xd0\xdb\x33\xf3\x2f\xda\xaa\xcf\x0f\x68\x9d\x76\x93\x81\xef"
- "\x66\x79\x8e\xf5\x69\xb4\xbf\x40\xda\x6d\x0a\x1f\xbb\x89\x7d\xf8"
- "\xb5\xf4\x7d\xbb\xc4\x52\x3b\xed\x99\x17\x90\x73\x25\xae\x73\x14"
- "\xc7\x83\xe3\xb9\x11\xec\x11\x94\x9b\xd6\x43\x37\xc0\x15\x9d\x06"
- "\xdd\x9e\x26\x35\x16\xab\x36\x86\x96\xda\x4d\x8d\x41\x79\xc6\x8e"
- "\x86\x3b\xdc\xdf\xa9\x58\xcf\x4f\xaf\x37\x68\xd7\x83\x13\xf0\xe1"
- "\x3c\xca\xa7\xe9\xe9\x5d\x06\x4e\x52\x5e\xd3\xf9\xcc\xee\xcc\x7a"
- "\x3e\x2b\xa4\xe8\xdf\x98\x81\x3c\x87\xcf\xa5\xff\xd3\x81\x18\xfa"
- "\xa7\x32\xbf\x31\xfd\x79\x7d\x03\x74\xb9\x04\xb4\xb4\xa8\x33\x0e"
- "\x6c\xc3\x3c\xc3\x67\xe9\x33\x18\x4f\xad\xd2\xa0\x79\xbe\x59\xad"
- "\x8d\x3d\x33\x29\xa6\x1f\xd0\x5e\x3b\xdb\x67\x29\x46\xfb\xb9\x0c"
- "\xd3\x80\xe3\x3b\x72\xdd\xc0\xe7\xe2\x4e\xcf\x33\x85\x89\x6d\x5a"
- "\xa1\xce\x8f\x90\xf2\x27\x79\x66\x65\x8f\x7c\x0c\x16\xc1\x12\x87"
- "\x08\xab\xb3\xc8\xcf\x8c\xd8\x53\x16\x34\xf7\x25\xf7\xcc\x83\x32"
- "\x56\xa4\x49\xae\x25\xc0\xce\x9a\xb5\x58\x00\x37\xd5\xf7\xb3\x7e"
- "\xa1\xd2\x0a\x37\xe1\x0a\x1e\x7b\xe6\x8c\x40\xdd\x41\xb7\x8c\xab"
- "\x82\xb6\xcd\xaa\x62\x9e\x33\xf8\x8c\xd7\x1e\x95\x9f\x78\xe1\x63"
- "\xac\x47\x0c\x9a\x03\xff\xf4\x4e\x4f\xe1\x70\x03\x7f\x23\x3f\xf7"
- "\x1d\xe7\xe1\x7d\x9a\x26\x47\x58\xea\x57\x75\x4e\xa8\x30\xcf\x90"
- "\x5b\xae\x83\xfb\x99\xf5\x0b\xd3\x43\xd1\xa2\xb0\x38\x1e\x96\xdd"
- "\xa4\xe2\x53\x32\xcf\x43\x1e\x97\x84\xfb\x21\x4f\x55\x2f\x8c\x42"
- "\x9b\x7a\xd7\x83\x27\xfb\xf6\x4b\xff\x3b\xd5\x1f\x85\x51\x6e\x57"
- "\x2f\xbe\x2c\x7f\x85\x3d\xfd\xcf\xef\x42\x6e\x3b\xc7\xb3\x95\x7a"
- "\xa5\x64\x18\xe3\x1b\xe4\x38\xb1\x92\xd7\x01\x7f\x3c\xe3\xce\x79"
- "\x8c\x3e\xeb\xe5\xc5\x59\x43\x63\xe1\x08\xb7\xdd\x64\xe8\x27\xa5"
- "\x3b\x82\x98\xa7\x92\x43\xed\xb1\xcc\x9a\x18\x83\xb3\xd7\xc0\xa7"
- "\x57\x27\xcc\x72\x26\xf2\x24\xd7\xcd\xf1\xf7\x74\xd8\xac\x4b\x6c"
- "\x47\x69\xd6\x34\x85\xd7\x33\x07\xb9\x1f\xfb\x1a\xd3\x8c\x38\x9f"
- "\xaf\x2b\x1d\x82\x7e\x9e\xfd\xe7\xd7\xd5\xd9\xa1\x90\x8a\xe5\x38"
- "\xeb\x2f\xc2\xb4\x85\x69\xc5\x6b\xe8\x41\x19\xa3\x43\x9e\x2b\x9f"
- "\x25\xcf\x98\x0f\x2c\xde\x22\xe3\xc7\xea\xfe\x80\xc1\xa6\xe2\x88"
- "\xdc\x6b\x70\x97\xf0\x39\xdb\x08\xcf\xef\xa4\xbf\x5b\x63\x49\x84"
- "\x1e\x0e\xb3\x4c\xcc\xce\xe2\xf3\xf3\x21\x29\x4b\xb3\x47\x1b\x67"
- "\xe6\x39\xa6\xa5\xe8\xcc\x27\xe8\xa1\x54\xb6\x8b\x1c\x6e\x8e\x77"
- "\xf0\x2c\x9f\x1f\x22\xbd\x7f\x69\xad\x49\x1c\x52\xf2\x3f\x7b\x99"
- "\x8c\x23\x28\xf7\xae\x8e\x42\x27\xa4\xfe\xe3\x28\xcd\x7e\x43\xad"
- "\xf5\x18\x3a\xea\xd9\x01\xbc\x7f\xe5\xd7\x61\xa0\x2e\x8c\x7f\x33"
- "\xcd\xe7\xea\x92\xd9\xcb\x8c\xf9\x0a\x9f\xb9\x53\x7b\x61\xbd\xf0"
- "\xfc\x34\xbb\x94\xaf\xbd\x7d\xf0\x7b\x86\xd5\x7e\xae\x5e\x78\x96"
- "\x0c\xd9\x2b\xbe\x86\xcf\x6d\xcf\x6a\xe2\xfa\xfb\x1a\x2f\x84\xfb"
- "\x31\xee\x27\xcb\x31\x47\xf2\xbe\x49\xbe\xb7\xf6\x6c\xa1\xd1\x06"
- "\x83\x26\xaa\x0d\xcf\xee\xeb\x48\xdf\x6d\x89\x69\xfb\x3e\x49\x8b"
- "\xde\xf7\x67\x62\x68\xc3\xcf\x21\x35\xae\x3d\xbb\x07\xfc\x51\xaf"
- "\x78\x4d\xa5\x41\x76\xb6\x89\xa5\xd0\x05\x12\xc7\x39\x64\xc8\x3a"
- "\xf2\xc2\xfe\xfb\x76\xa8\xda\xe3\x7a\x16\xed\x7f\x56\x8f\x9b\xf0"
- "\x6c\x05\xe3\x92\xb4\x9d\x71\x38\x3a\x8b\xd8\xbe\x50\x71\x14\x9c"
- "\x2f\x30\xbe\x8e\xeb\xb9\x8f\x9d\x77\x48\x1d\xce\x31\x15\xba\x9d"
- "\xfd\x42\xdd\x59\xd4\xd1\xed\x84\x5e\xc8\x32\x75\x7a\x9c\xd0\xff"
- "\xa7\xc2\xaa\x4e\xe7\x0c\x03\x57\xc6\x0d\x76\xb3\xa5\x53\xcc\x49"
- "\x4e\x5f\xae\x57\xc6\x79\x72\xf6\xc7\xcf\x82\xdf\x45\x3f\x24\x0e"
- "\x13\xec\xf2\x40\xb0\xb2\x61\xbd\xb6\x50\x1c\xe0\x78\x62\x98\x7b"
- "\x04\xd6\x81\x77\x07\x2e\xf7\xc2\x16\x7f\xd2\x54\xb0\x98\x72\x31"
- "\x47\x26\x71\x56\xe4\x6c\xd6\x70\x5d\x28\x46\x73\xbc\x6e\x3c\x67"
- "\xeb\xcf\x23\xf8\xb9\x63\xa1\x98\xde\xe9\x99\x63\x33\xf6\x04\x55"
- "\x2c\x9c\x39\x8e\x9e\xf8\x41\xa9\x4f\xf0\xf9\x21\x8e\x33\xa5\x61"
- "\xee\x13\xe0\x7a\x0b\x78\xfe\x8a\xfa\x90\x0f\xf2\x3f\x43\xb6\x33"
- "\x98\x7a\xd3\x20\xfc\xb2\xfa\xd8\x3b\x0d\x30\x5e\x1d\x69\x0d\xeb"
- "\x0d\x5c\x07\x86\x72\x4d\x3f\x10\xb7\x9d\x06\x6e\x48\x3f\xb0\x4e"
- "\xa5\x47\x38\xde\x21\xfb\x36\xe2\xfd\x41\x03\x57\x03\x07\xae\x8f"
- "\xcf\x6b\x8a\xf4\xdd\x76\x8e\x35\xc3\xf5\x05\x97\x72\x7c\xdf\x39"
- "\x61\x03\xdf\x1f\xca\xc7\x65\x35\x42\xf0\xd8\xc9\xba\xd7\x31\x84"
- "\xa8\x25\xc4\xfa\xe4\xb9\x49\x8d\x35\x21\x5e\xdf\x1e\x82\x3a\xae"
- "\xe8\x10\x4e\xd2\xba\x9d\x49\xfb\x97\xcb\x20\x7f\x85\xd4\x0d\xab"
- "\x76\x5f\xa1\x89\x89\xd0\x11\x28\xd7\x3d\x91\xd7\x96\x20\xb3\xcf"
- "\xed\x69\x2a\x0d\xf0\x19\x4b\xe8\x9b\xe7\xf6\x20\x8f\x9d\x6d\x2c"
- "\xcc\xaf\x58\x67\xa5\xb2\x5e\xf2\x2e\x1c\xcd\x30\x3e\x36\xbb\xc8"
- "\xdc\xe4\xfa\x61\xdf\x01\x00\xdc\x76\x25\x37\xcf\xb5\x1b\x76\x09"
- "\xee\xc3\xf1\xfb\xdd\xcf\xf9\x13\xe7\x66\x4f\xbf\xf8\x62\x49\xc1"
- "\xbc\x59\x7c\xc9\xba\x6e\xc1\x8d\xe9\xb1\x73\x70\xd6\xc1\x2a\x3e"
- "\xc2\xf3\x36\x5e\xef\x7a\x7d\x90\xb1\x7f\xfb\x7c\xcf\xf9\x2f\xdd"
- "\x4f\xfc\x6e\x9e\x4b\xb0\xcd\x8d\x77\x45\xbf\x2b\x5d\x26\x6d\xa0"
- "\x2f\x2d\x64\x4a\xac\x6f\xf6\xcc\x92\x99\x45\x77\xf2\x4e\x4d\x7a"
- "\xb2\x7a\xca\x13\xea\x69\xe8\xa9\x47\xe9\xc0\x90\x89\xf3\x55\x76"
- "\xef\x12\x69\x6d\x79\xea\x8c\xee\xf3\x47\x8c\xb5\x94\x3e\xfc\xeb"
- "\xf2\xa3\xab\xbe\x60\x7a\x73\x4c\x29\xd3\x47\x4b\x5a\x4d\x6c\xcb"
- "\x94\xe1\x9e\xe7\xb4\x72\x6d\x46\x8f\x53\xb4\xff\x74\x2b\xc6\x98"
- "\xa2\x6c\x51\xb9\x9b\xd7\x75\xb3\xfa\x9a\xc7\xc6\xfa\x26\xb0\x2f"
- "\x5b\x1b\x15\x4d\xec\xd3\x8f\xa0\xe2\xf3\x56\xa5\x63\x8a\x36\x35"
- "\xd9\x89\xf1\xf8\xf5\x51\x2a\x7a\xdb\x6c\xc7\x38\x32\x84\xfe\x05"
- "\xf7\x9b\xb8\x2c\xbf\x8b\xeb\xe7\xab\x4e\xd4\x99\xc1\x85\xe0\xc6"
- "\x14\xa1\xfe\xc8\xac\xdf\xa4\xe2\x67\x12\x29\x72\x97\x2d\x15\x14"
- "\xee\x7f\x91\x99\xac\x03\x33\x2c\x57\xff\x68\xa8\xfd\xee\xbb\xc6"
- "\xe4\xb8\xcb\x4a\x21\xbd\x91\xb0\x55\xc4\xc6\xd5\xfa\x2a\xfc\xc8"
- "\x8d\xe5\x24\xfd\x2c\x2a\xbf\x0a\x27\xc3\x75\x8d\x47\x14\xf3\x99"
- "\x66\x2d\xbd\xdb\xe1\x5e\x40\xa6\x0f\xba\xfc\x26\x8e\x1d\xcf\x36"
- "\x16\x7f\x5b\xe0\x28\xbd\x70\xe3\x17\x48\x43\xfb\x5d\xa2\xa2\xdb"
- "\xa1\x6c\x93\x17\xe6\x68\xab\xba\x1d\xbd\xf0\xcd\xc4\xf0\xdd\x6f"
- "\x93\xa9\xbe\x2c\x60\xf2\x99\xef\x22\x9f\x23\x44\x5f\xe0\x3e\x29"
- "\x2d\x51\x27\xdb\x3b\x0c\xa3\xd6\xa3\x55\xb8\xbf\x23\x93\x7e\x2e"
- "\xd1\x74\x92\x5e\xd8\xb2\xab\x8f\x72\x7c\x0e\xb8\x23\xbd\xe1\xd1"
- "\x4e\xcf\x0b\xe8\xff\x7b\xcc\xfa\x78\x07\xbd\xfc\x02\xf8\xbf\x48"
- "\xea\x7f\xbc\x7f\xa4\x43\xc6\x16\x9e\x4b\x46\x9e\xe4\x63\x1e\xaf"
- "\xcd\x0a\x2f\xf7\xab\x38\xfb\x4d\x80\xcf\x3c\xf4\xe1\x1f\xd1\xdf"
- "\xe7\xba\x95\xf7\xa8\xfa\x0d\x0c\x53\x86\xfb\x8c\xe8\x8e\x7a\x28"
- "\x13\xec\x6e\x8a\x62\x4e\x1d\x39\x2b\xf2\x9b\xdb\x4f\xcb\x58\x97"
- "\xac\x3f\xde\x9f\xfd\x7b\x93\x2f\x7c\xca\xeb\x5b\xa9\x51\x0b\x6c"
- "\x0f\x5f\xcd\x29\xaf\x8a\x89\x19\xa5\x66\xfa\x2b\x35\xbb\xfe\x77"
- "\xb9\xaf\xfc\xaf\x48\x17\xe5\x4c\xe7\xee\xb3\x62\x9a\xcf\xfc\xbf"
- "\x88\xbf\x7d\xc2\xba\x10\x74\x77\x9c\xa4\xb9\xff\xb6\x1f\x70\x3e"
- "\xf8\x2f\xc0\x92\xb1\xb4\xc6\xd2\x17\xb8\x47\x9b\x0e\x1b\x7a\x32"
- "\x69\x0c\x92\x14\xef\x1a\xab\xeb\x49\x93\x06\x9d\xcb\x31\xcf\xa0"
- "\x6b\x47\x73\xbb\xf0\x9c\xcd\xcf\xb8\x8e\xe0\xab\x75\xb9\x77\x93"
- "\x35\xf2\x24\xeb\xe0\x7c\xd6\xaf\x48\x9f\x56\x7b\x56\xea\xe4\x3c"
- "\xfd\x79\x92\xfe\x3c\x51\x7f\x1e\xaf\x3f\xe7\xea\xcf\x63\xf8\x59"
- "\xe9\xee\x17\x9d\x3d\xe3\x8a\xa9\xff\x21\x3c\xbb\x8c\xbe\x00\x3e"
- "\x03\xac\xae\x65\x72\x0c\xd0\xf1\x18\xad\xe3\x95\xad\x3f\x1b\xf8"
- "\x5c\x65\x8d\x2c\xfb\x9f\xc2\x27\x1c\x8f\x4f\xb1\x25\x06\x1f\xb2"
- "\xba\x72\x7f\x08\x3e\x36\x2b\xc7\xe7\xff\x6f\xe0\xc3\xb8\x70\x1a"
- "\xea\xaf\x48\xc0\xa7\xda\xc0\x27\x29\xbf\x2d\x14\x01\x1e\xff\xe6"
- "\x5f\x21\xe3\xfd\xf6\xe7\xb1\xad\xb6\xcb\x88\x5f\x57\x7c\xf8\x7c"
- "\xf1\xeb\x20\x0b\x76\xe4\x41\xfb\x8b\xeb\xf5\x71\x7e\xaf\xb2\x05"
- "\x5f\xca\x30\x7c\x8a\xd0\xd6\x1d\xeb\x54\x5b\x77\xae\xe4\x18\x6e"
- "\x8b\xe9\x4a\xb7\x4b\x04\x30\x37\xfb\x8a\xe7\x0f\xb1\x70\x8b\x4a"
- "\xe6\xcf\x7f\xe1\x4e\x47\xd1\xcc\xb9\xb3\x1c\xd7\x15\x3a\xe6\x3b"
- "\xe7\xcc\x2e\x99\x15\xbf\xcf\x6e\xd3\xbf\x97\x22\xcf\x0f\xb0\xbd"
- "\x2d\xe7\x5b\xe0\x7f\xd6\xdb\xca\xe7\xf3\xa5\x66\xe1\x79\x29\x87"
- "\x75\xfd\xe6\xd7\xc8\xcc\x67\x8a\x81\x4f\x8d\xa1\xe3\x8d\x39\x12"
- "\xeb\x78\xa4\xc3\xfe\x9b\x3b\x3a\x26\x9d\xf3\x1e\x30\xd2\x18\xbe"
- "\xae\x9b\xfa\x1f\xa5\x97\xe6\x70\x9d\x49\x69\x78\x56\xd4\x61\x7c"
- "\xe5\xef\x0d\x98\xa0\x53\x04\xc7\x63\xe2\x73\x79\x28\x27\x8e\xd1"
- "\xbc\x2b\x58\xf7\xf2\x37\x79\x94\x5d\x2f\x80\xe3\xbc\x91\x28\x53"
- "\x8f\x34\xf3\x5a\xe4\xc5\x5c\x81\xe3\x28\x71\xde\x09\x1c\x1f\x01"
- "\xe9\x16\x3d\xce\x14\xa7\x3d\xc6\xf1\x0b\x90\x66\x8b\x49\x7b\x81"
- "\x63\xa5\x23\xcd\xa1\xc3\x5b\xc6\x74\xc6\x73\xae\xbe\x96\xc2\x79"
- "\x5e\xd5\xeb\x2d\x8f\xc5\x99\x3f\x9e\x71\xeb\xcd\xd9\x8e\x69\x0f"
- "\xff\x64\xec\x5d\xcf\xbc\x38\x77\x76\x3a\x49\xb2\x67\x61\xb8\xcc"
- "\xbe\xd5\x75\xe3\x9d\x8e\xe2\x59\xb3\xe6\x39\x16\xcd\x9a\x5b\xe2"
- "\x98\xb9\x68\xe6\xe2\x74\x9a\xfd\xe2\xbc\x67\xf8\xf4\x3d\x77\xcb"
- "\xfc\x82\x67\x66\x3f\xcb\xce\x10\x2a\x77\x7a\xdc\x38\x3e\x8d\x75"
- "\x9b\x1e\xaf\xe2\xc0\x3a\xb6\x35\xd2\xf6\xd6\xe1\x9e\xe3\x38\xd9"
- "\x71\x6d\xc2\x6f\x2f\x7e\x0d\xf8\x1d\xc6\xef\xd0\x71\x72\x4d\xc7"
- "\x75\x4f\xa7\x67\xfe\x18\xc3\x9e\xe8\xe5\xa1\xf9\x79\x06\x0f\x61"
- "\xfc\xdf\xa3\xc6\xb7\xf9\xe5\x2d\x11\x29\x3f\x3d\x3c\xb5\xee\x6c"
- "\x2f\x4f\x71\x1c\xca\x16\xf6\xf5\x59\x88\xf7\xe0\x61\xd0\x9f\xe7"
- "\xd5\x69\x4c\xb7\x63\xb4\x70\x01\xe6\xe3\x07\x39\x86\x0a\xae\x4d"
- "\xe0\x97\x83\x2a\x6e\xc9\xfc\x08\xf2\x0d\x43\x1d\x7b\xf5\x3a\xd4"
- "\xf3\x60\x71\x80\xbf\x9d\x71\x54\x7f\x66\x58\x80\x31\x80\xef\xf9"
- "\xaa\xef\xa9\x59\xd9\x6f\x52\xcd\x1b\x8d\x77\x25\xdb\xf5\x3a\xbc"
- "\xa0\x45\xf9\x66\x8f\x5c\xfb\x93\xf3\x2b\x5e\x3b\xb4\xa6\xdc\x2d"
- "\x80\xcf\x29\x2d\xf5\x09\x19\x7f\xdc\x57\xde\x05\x1d\x71\xdb\x6d"
- "\x3e\x97\xcc\x9f\xc2\x6b\x8b\x53\x8a\x85\xc6\xf1\xa9\xb5\xd4\xe7"
- "\x5b\xb9\x9c\xb0\xec\xad\xd3\xd6\x0e\xc8\x55\xb6\x00\xc7\xa3\x2b"
- "\x29\xd7\x61\x86\x99\xb6\xc7\x69\xfe\x2d\x6a\xae\xe6\x9a\xae\xec"
- "\xb3\x92\xd5\x86\x0f\x1e\x64\x34\x0b\xcf\x35\x86\x0e\xf0\x53\x89"
- "\x53\xf7\x97\xf2\xaa\xf6\x97\x1c\xd6\x9f\x1b\x74\x1c\x53\x38\x46"
- "\x06\xf0\x3f\xc4\x7d\x87\x79\x6f\x03\xee\x0f\x83\x3e\x07\x15\x7d"
- "\x4a\xa4\x0d\x08\xbb\x86\xdf\x1f\xe6\xef\x8c\xe0\xdd\x61\x15\x7f"
- "\xa2\x24\x83\xdb\xdc\xeb\x53\x59\x93\x0b\x5c\x07\xf0\xde\x23\x64"
- "\xa9\xc1\x77\x96\xe5\xb3\x84\x63\x59\xee\x32\xf4\x0e\xeb\x99\x82"
- "\x28\xe4\x54\xda\xdd\x0b\xc6\x1b\xfa\xa6\x97\x0f\x16\xe4\x27\xd3"
- "\x25\xc9\xfa\x5d\xd1\x7f\xc1\xef\x84\x67\x5e\x0d\x70\xda\x25\xfb"
- "\x80\xe3\x74\x9e\xed\xb1\xef\xbb\x95\x8e\x5c\xb0\xb3\x67\x2e\xa2"
- "\xe3\xc1\x31\xbf\xfd\x8c\x5b\x97\xdc\x0f\xd6\xf5\xc6\x82\xc3\x86"
- "\xde\x30\xe0\x58\x53\x84\x66\x75\xe1\x5f\xc5\xee\x30\xaf\x9d\xf3"
- "\x78\x29\xed\x11\xc0\x19\x78\x46\x9d\x8d\xd2\x2a\x77\x43\x27\x2e"
- "\x58\x0d\x1d\x63\x96\x36\xa7\x67\xde\x07\xbd\xba\x68\x61\x56\x2c"
- "\x4c\x61\xd9\x1d\x66\xb8\xac\x8f\xd8\x26\x29\x88\x9a\x39\x3e\x49"
- "\x58\x1f\x5f\xa0\x83\x17\xe6\x1b\xb8\x82\x86\x07\x0c\x7c\xf5\x6f"
- "\x3c\x41\x57\x2d\x68\x98\x1a\xed\x66\x1f\xe1\x26\xd5\x9f\x2e\xa9"
- "\x6f\xf0\x6e\x27\xca\x56\xf9\xe9\xa5\x80\x2e\x43\x07\x51\x7e\x67"
- "\x63\xd9\x78\xe4\x59\xb8\x4b\xf7\x73\x3d\x84\xfe\x3d\x1c\xc3\xfb"
- "\xdb\x63\xd6\x02\x0e\xab\x3e\xbc\xab\xfc\x28\x2d\x0c\xc6\xa4\xeb"
- "\x7d\xdb\x98\x77\x94\x16\x6d\x57\xf3\xea\xdd\x0d\xaa\xfc\x22\x75"
- "\x76\x45\xc7\x91\x75\x01\x9f\xe3\x62\x19\x97\xb4\x97\x7d\xbc\x28"
- "\xcb\x18\x2f\x00\x6b\x8f\xa4\xf9\x60\xb1\x97\xe9\xa4\xe2\x40\xcc"
- "\x6b\x51\x74\x5a\x94\x17\x47\x7b\x1e\x37\x51\x0f\xd3\x69\xe0\x72"
- "\xa1\x0d\x0c\xa5\x88\x82\xc5\x66\x62\x79\x61\x19\xe7\x3d\x23\xf0"
- "\x87\xb4\xab\x14\xdd\x16\xad\x37\xe8\x66\xf4\x1d\xd3\xc9\x4f\x8b"
- "\x88\x69\x1b\xdf\xc6\xfe\x87\x8e\x1a\x6d\x07\x4d\x79\x1d\x1c\xcf"
- "\xf5\xba\x5c\x1c\xf4\x0e\x61\x9f\x82\xf9\xef\x36\x9a\x7f\x42\x8d"
- "\xae\xd1\xa4\x68\xbb\x28\x08\xda\xe6\xc5\xcc\x1b\x0e\x30\x7d\x59"
- "\x56\x80\x67\x48\x8f\xc9\x74\x40\xf9\xb7\xcc\xaf\x87\xbd\x1f\x92"
- "\xb2\xbc\x50\xc6\xce\x60\x19\x38\xc4\x34\x62\xbd\xc8\xb2\xc4\x32"
- "\xc0\xf2\xa4\x68\xe4\x9a\x14\x43\xa3\x26\xa6\x8f\x4e\xa7\x3d\x09"
- "\xba\x7c\x96\xa3\x68\xac\xd2\xc5\x8e\xac\xeb\x0a\x47\xc9\x00\x28"
- "\x8e\xfb\xc6\xdd\xe9\xc8\x1b\x7b\x9d\xcb\x39\x62\x8a\xba\x8c\xcb"
- "\x9b\xc4\xd7\xf4\xf8\x79\x97\x03\xf5\xec\x89\x9f\xbb\x95\xe5\x2a"
- "\xfd\xe1\x3a\xe8\x4f\xe9\xbf\x83\xd3\x39\x1e\xe9\xba\xb9\x44\x51"
- "\xe0\xbd\xf6\x38\xfa\xd4\xb2\xbb\x8a\xe3\xdf\x4e\xc5\x9c\x71\xca"
- "\x19\xf1\x5d\x2d\xde\x6d\x46\xfa\xc0\x62\x8e\x9b\xff\x77\xa1\xa5"
- "\xed\xae\xe2\xb9\xbd\xa8\xdc\x96\x1f\x4c\xfb\x2a\x8c\x9f\x37\x98"
- "\xd6\xe0\x9c\x70\xa3\x5b\x74\x7a\x16\x0f\x37\xda\xc5\x6b\x00\xa0"
- "\x53\xd5\x54\x97\x88\x32\x8d\x0a\x5c\x1c\xa3\x1a\xb0\x53\x79\x0d"
- "\x60\x31\xda\xff\x42\x85\x9a\x5f\x2e\x06\xff\xcf\x6b\xd7\x75\x59"
- "\x1e\x9e\x61\xff\xdd\xbe\x4b\xf6\xab\xc7\x2e\x63\x5b\x6b\x2b\x6e"
- "\x7a\x08\xf3\x01\xaf\x01\x13\xb0\x2e\xd2\x63\xf8\x49\x78\x3f\xd4"
- "\xdf\x52\x5b\xf5\x51\xbd\x35\x45\xc5\x0b\x84\x8c\x97\xd7\x9a\xb4"
- "\xfc\x1e\xff\x09\xbc\x1b\xb8\xdc\xc6\xfe\x15\xf9\xe0\xbd\x72\xce"
- "\x63\xbc\x5b\xe7\xd1\xfc\xeb\x4c\x5a\x18\xfd\x68\x53\xf6\x73\x3b"
- "\xeb\x4f\xcc\x2d\x97\x64\x1a\xe3\x9a\x1c\x0f\x4d\x54\xae\xe6\x33"
- "\x4b\x6e\xe7\x72\xa7\x3d\x66\xcc\x19\x5c\xf5\xd7\x64\xca\x39\x4a"
- "\x58\xf3\xa4\x90\xf2\x71\x5d\x92\x66\xe8\x58\xde\x47\xb3\x2e\x17"
- "\x41\x5e\x47\xb4\x46\x44\x50\xc6\x60\xe7\xb1\x83\x8e\x93\xaf\xb4"
- "\xb3\x9c\x7d\xec\xa4\x0d\x84\x7a\xd5\xb8\x11\x55\xe3\x06\xea\x0f"
- "\xa6\xde\x34\x03\xe3\x43\xca\x71\x5a\xdc\xca\xf8\x33\x6d\x78\x3d"
- "\x5e\x03\xad\x7c\x3c\x4e\x32\x7d\xd2\x3f\x1e\xce\xbe\x11\xdc\x56"
- "\x6b\x04\x6d\x8e\x6d\x97\x49\xf3\xaf\xf5\xa0\x5d\x26\xb4\xcb\x75"
- "\x82\x65\x26\xcc\x3e\x2b\x90\xb7\xc1\x32\xce\xb1\x9c\x3f\x2f\x09"
- "\xc7\xb6\x91\xf5\xbf\x6a\xc3\xd2\x2b\x92\xb5\x51\x98\xb8\x8d\x92"
- "\x06\x27\x74\x79\x93\x78\xb2\xfe\x68\xa7\x25\x3b\x07\x2e\x67\x5f"
- "\x91\xdd\x55\xd0\x6f\xe3\xb8\x0f\x31\x7e\xae\x67\x3c\x93\xf5\x17"
- "\xc3\x53\xb0\x96\x36\x58\x97\x97\xcf\xe8\xf4\x2c\x5d\x99\x9c\xde"
- "\x4b\xb7\x9f\x9f\xde\x4b\x17\x73\x79\xc6\x83\xf7\x00\xac\x11\x4c"
- "\xd6\xc1\xb7\x98\xaf\x55\x24\xab\x77\xe0\xf2\x3a\xc6\x2b\xe9\x3b"
- "\xc1\xf2\xa2\xeb\x20\xf0\xa1\x80\x9c\x08\xd6\x49\x9d\x9e\xd2\x9e"
- "\xf5\x2f\x6b\x8a\x23\x55\xea\x07\x93\x58\x9f\x0c\x86\x75\xf9\x7a"
- "\xde\x0b\x19\x87\xfa\x93\xbe\xd7\xf8\x9b\x0e\x15\xbb\xcb\xb5\x15"
- "\x3f\xbe\xc6\x9a\x42\x77\x07\x53\x7f\x9c\x6e\x75\x45\x86\x33\x0d"
- "\x01\xd3\x05\x39\x1e\xc9\xf3\x54\xb5\x76\x51\x0a\xfb\x7f\x8d\x8c"
- "\xc7\x1d\x4c\xdb\x5d\xae\xf6\x16\x4a\x31\xfe\x55\x4d\x32\xd6\x6f"
- "\xf1\x0c\xfd\xf2\x75\x91\x92\xcb\x2b\x37\x88\x55\x0d\xa3\x35\x8f"
- "\x55\x38\x96\x58\x61\x47\x2e\x7b\x44\x13\x1c\xe7\xbf\x61\x74\x2f"
- "\x9f\x28\x3f\x1a\x83\x4f\x50\x3e\x92\x9c\x07\x96\x5d\x75\x7e\x1e"
- "\x28\xfd\x96\xdf\x33\xdd\xd5\x5c\x65\xd9\x78\xc3\x4e\x11\x2b\xae"
- "\xdc\xe0\x28\xe3\xfa\x4b\x5b\x55\xdd\x4c\x93\x5c\xde\x57\x98\x04"
- "\xba\x94\x23\x6f\xb1\xa1\x07\x98\x5f\xac\x51\xfe\x06\x02\x49\x9e"
- "\xc6\x3b\xd8\x3f\xc5\x7e\xb5\x56\xda\x10\x94\xdf\x0b\xf4\xb8\x9c"
- "\x41\xb7\x73\x23\xc6\x61\x0a\xa5\xed\x86\x5e\x59\xb6\xcb\x4f\x5e"
- "\x19\xcf\x08\x63\x70\x08\x30\xc2\x55\xca\x4f\xd6\x22\xe3\x08\x41"
- "\xa6\x39\x76\x10\xcb\x35\xd2\x32\x81\x37\xc7\x11\xc2\x7c\x67\x59"
- "\xa0\x67\x5c\xf2\xe4\x42\x57\x08\xf9\xed\x1d\x8c\x4b\x43\x3b\x40"
- "\xbb\x37\x4c\xda\x8e\xb3\xa3\xec\xc4\x6d\x3e\xbb\x62\xc8\x8e\x5f"
- "\xdf\x4c\xe6\xff\xc7\xfe\x34\x15\xdf\x4a\x99\xcb\x7f\x62\xa6\xff"
- "\x93\x43\x26\xa6\x83\x9f\x96\x85\x15\xed\xca\x72\x8c\xfe\xf1\x53"
- "\x69\x9d\xd4\x9d\x2b\x9e\x08\x4c\x8d\x88\xef\xd4\x7a\x68\x19\xf4"
- "\xdf\x73\x87\xd4\x7b\x97\x37\x71\x0d\x88\xed\x79\xc7\x9c\xf9\x8e"
- "\xc2\x17\x17\xcd\x1d\x36\x2c\x6e\xae\x64\x96\x67\x63\x3c\x65\x45"
- "\x6a\x3c\x2d\xeb\x89\x7f\xc4\x76\x09\x9e\xd1\x7e\xd7\x39\x31\xce"
- "\x27\x15\xe8\xee\xcf\x05\xd9\xd4\x7b\x7f\x0b\x4d\xba\x25\xe6\xf1"
- "\x36\x9a\x74\xeb\x6d\x05\x0f\xcd\x9a\x59\xb8\x38\x26\xf5\xf6\xd8"
- "\x75\xbd\x75\x1b\x50\x77\xea\x90\x7b\xa1\x2b\x52\xa6\x2c\xe5\xb1"
- "\xc5\xfd\x46\x59\x44\xfc\x03\xfa\x3a\x07\x32\x56\xd0\x5c\x12\xa1"
- "\x66\xe8\x32\x71\x25\xeb\xf0\xfe\xea\xcc\x1f\xec\x29\xf0\x96\x15"
- "\x6d\x0f\xc2\xae\x3b\xc3\xeb\x33\x28\xf7\x69\x4b\x35\xc7\xfa\x6d"
- "\xd0\xe3\x98\xbb\x4b\x90\x7e\x09\xae\x9b\x70\xbd\x08\xd7\x2d\x8e"
- "\xb9\x98\xf7\xb0\x8f\xf5\x42\xf6\xb1\x76\x4b\x5f\x97\x9b\x43\xe5"
- "\xc4\xbe\x22\x78\x3f\x82\x6d\x10\x3f\xb9\xf9\xfb\x60\xfc\x4d\xba"
- "\x5c\xa4\x2d\x70\x3c\x47\xd9\x7c\x15\x72\xff\x08\x33\xb0\xca\x86"
- "\x62\xb1\x31\x9f\xbf\xa5\x35\x1c\xe9\x7f\x49\x4d\xf9\x92\x52\xed"
- "\xfd\xa3\x9d\x1e\x77\xab\x9f\x9e\x5f\xcd\x74\xea\xeb\xdb\x9f\x4c"
- "\xe7\x44\xfb\xb0\xd7\x36\x5c\x45\xd2\xbe\xd5\xed\xb9\xcd\x72\x5c"
- "\x28\x1f\x11\x63\xd3\xf1\xfe\x65\xba\xb2\x4f\x44\x54\xd9\xa7\xe5"
- "\x93\x0c\x39\xc0\x7d\xbe\xc1\xa7\x71\x71\xd7\xe6\x96\xcc\x9a\x37"
- "\xab\xd0\x71\xdd\xfc\x74\x8a\x89\xba\xe6\x9c\x35\xd7\x31\x6f\xd6"
- "\x4b\x0b\x66\xcd\x97\x11\xd3\xf8\x6d\xdc\x98\x9f\x29\xd2\xff\xb5"
- "\xde\x38\x0f\xe4\x18\xc2\xf4\x2d\xdf\xc7\xb1\xba\xc4\xaa\x4f\x86"
- "\xb3\x4f\x87\x9a\x6f\x74\xe7\xc4\xcf\x37\x3c\x79\xca\xce\x6b\x98"
- "\xa1\xe6\x3a\xcb\xbf\xe6\xe7\xa3\xb4\xdc\xd9\x1b\x17\x7c\xf9\x15"
- "\xa0\xa5\x49\xd1\xcd\x72\xac\xd3\xb3\xdc\x66\xd0\xcd\x4f\x9e\x6a"
- "\xdd\x96\x6a\x97\xfa\x03\x63\x2c\xf4\x5f\xdc\xf8\xaa\xbe\xf9\xb9"
- "\xdc\x0e\xde\x48\x95\xeb\xbd\x69\x0d\x85\x5c\x17\xc3\x3c\x86\xf2"
- "\xe8\x9f\x19\xd0\x9b\xac\xdf\x2a\x0c\x78\xa8\x93\xb8\x3e\x7d\x1e"
- "\x74\x39\xca\xcb\xfd\x70\xad\xa2\xa1\x90\x75\x0a\xc7\x96\xd0\x2a"
- "\x01\x47\xee\xe3\x79\xaa\xd9\xc6\x94\xb1\xe9\x01\x8b\xd7\x69\xa1"
- "\x1b\x4a\xf8\xfb\xb0\x9c\xa6\x62\x86\x95\x17\xf2\xda\x30\xea\x9a"
- "\x0e\xfc\x0f\xf5\xfa\xbc\x7b\xaa\xd9\xee\x64\xb8\x7e\x5a\x5e\xc5"
- "\xf0\x54\x4c\xb4\xe5\x21\x3f\x95\x45\x7a\xed\x27\x4f\x4e\xcc\xbc"
- "\x0c\xf8\x28\x3c\x43\xc0\x45\xc6\xdf\x54\x3e\x88\xb2\xdd\xac\x3f"
- "\xab\xf4\xb6\x1b\xed\xe9\xf4\x78\xa0\xff\xdc\x01\x63\x6f\xdd\xaf"
- "\xb7\x9b\xf1\x63\xdc\x63\x71\xd6\xf1\x2d\x66\x7c\x51\xae\x34\x46"
- "\xb6\x79\x5d\xa6\x1f\xd2\xd6\xf7\xfa\x36\x97\xb7\x26\xea\x8d\x17"
- "\xe7\x3a\x8a\xe6\xcc\x7d\xbe\x60\xd1\xcc\xe7\x67\x15\x2c\x28\x1e"
- "\xe1\x58\x30\xf7\xe9\xa2\x17\x9f\x79\x9e\xb9\x66\x7e\xc9\x82\x67"
- "\x9e\x77\xb0\x66\x29\x18\x3f\x69\x52\xc1\xbd\x8f\x3c\xfc\x58\x3a"
- "\xdd\x3b\x13\x69\x98\xf9\x4f\xca\x1e\xa1\x5e\x3d\x34\x61\xdc\xa3"
- "\x05\xe3\xa6\x3e\x32\x65\x9a\x3c\x0c\xd1\xf3\x7e\xfc\xdc\xe4\x19"
- "\xe2\xf8\xd0\x06\x5e\x9a\x8e\xfe\xed\x77\x94\x7e\x95\xa9\xe2\x68"
- "\xaf\x18\x1f\x1f\x47\x7b\x05\xe6\xb2\x2b\x60\x65\xae\xc0\xd8\xbf"
- "\xf2\x00\x7e\x98\xa7\xfe\xca\xa2\xf8\x2b\x6d\x6a\xa7\x67\x45\x71"
- "\x2f\x7f\xfd\x2a\x53\xee\x8f\x57\xcb\x7d\x67\x13\xde\x41\xff\x97"
- "\xaf\x8f\x7d\xd7\x3b\x9f\x5c\xb1\xa3\x67\x3e\xd9\xa3\x53\x56\x1c"
- "\x36\xe6\x96\x48\x73\x62\x5e\x99\xc6\xf3\x4a\xb5\x9e\xf4\xab\xcb"
- "\x24\x4f\xf5\x29\xdf\x16\x32\xe6\x95\x2c\xdb\xbc\x4f\xac\xe6\x1f"
- "\x2b\x6d\xb1\x32\x2e\x63\x37\xea\x32\xce\xe5\xe4\xfa\x9d\xa5\x7b"
- "\x38\xaf\x69\xc3\x3e\x9e\x0e\x5b\x01\xe3\x57\xa7\x10\x69\xdd\xc3"
- "\x15\x4e\x2b\xf3\x78\x8d\x9b\xed\x66\x9d\x9f\x06\x1e\xa7\x95\x6b"
- "\x84\xc7\x53\xaf\xe6\x94\x9e\x3f\xb3\x5e\x17\x2b\x86\xdc\xcb\xfe"
- "\x27\x3c\x77\x42\x9d\x2b\x7b\x79\xf6\x57\x99\xcc\x0b\xbd\x73\xd9"
- "\x95\x71\xfa\xbf\x43\x7e\xaf\x6e\xe5\x1e\x23\x0e\x40\xc9\x30\x32"
- "\x99\x87\xad\xa7\x2a\x93\x28\xf7\xd3\xca\x42\xae\x83\xe9\xe9\xa7"
- "\x15\x6c\x33\x98\x7b\xe9\xb7\x32\xd0\x43\x3f\x7d\x9d\xc5\x58\x63"
- "\x51\x78\xff\xea\xb2\xbe\x68\x95\x9c\x4e\x2f\xe7\x7c\x2f\x9d\x3c"
- "\xd4\x8f\x65\xd2\xa0\xd7\xb9\xb4\x7a\xb9\xf4\x5c\x5a\xbd\xdc\x1c"
- "\x43\xab\x33\xe7\xd2\xea\xe5\x5d\x31\xfb\x3e\xfa\x3a\xca\xaf\x2e"
- "\x63\x9a\x31\x8f\xa1\xdd\x85\xe0\xb3\xca\x5e\xfa\xbd\xec\x3f\x97"
- "\x7e\x2f\x87\x92\xd3\xef\xe5\xf5\xd7\xc4\xc3\x59\x97\x6c\xdc\x18"
- "\xb8\xdc\xa4\x9f\x13\xfa\xd5\x9c\xa6\xa1\x72\x4e\x1a\x7e\xdd\xa4"
- "\x39\x5f\xf7\xe0\x87\x2b\xcf\x23\x7a\x6d\x71\x11\xd6\xe9\xeb\x6c"
- "\xc2\x9c\x97\xd7\x95\xce\x33\x16\x1d\x31\xd6\x3c\x70\xdf\xca\x73"
- "\x67\xfe\x56\x10\xa7\x33\x3d\xf9\xdb\x53\xe0\xf7\x56\x65\x97\xfe"
- "\xaa\xa1\x67\xcd\xe5\xfa\x07\x8a\x53\x97\x93\xa3\xb1\xe6\x56\x4e"
- "\x3f\x04\x1e\x92\x6b\x48\xec\xdf\xd3\x17\xcc\x82\x68\x2e\x25\x87"
- "\xfb\xeb\x1e\xfe\xef\xeb\xac\x6c\x82\x3e\x72\xce\x9c\x5b\xf8\xe2"
- "\xec\xd9\xdf\xaf\x8a\x62\x7d\x77\xd6\x7b\xb4\x8a\x4e\xfe\x1e\xe3"
- "\x8a\xe7\x96\xa0\x4e\xd8\xff\x2f\x78\xd5\xb8\xf9\x6b\xe8\x3f\xa7"
- "\x4b\xd9\x92\x4f\x04\xd4\xf9\xe0\x5f\xb7\xc7\xe8\x67\xf0\xc8\xaf"
- "\xc3\xc2\xf3\xeb\xd1\xbd\x7d\xfc\xeb\xa6\x73\xfb\xf8\xd7\xad\xc9"
- "\xfb\xf8\xd7\x11\x6d\x21\x9f\xcf\xf8\x35\xcf\x7f\xa4\xad\xc9\xcf"
- "\xbc\x5f\x8e\x39\x73\x00\xf3\xe5\xf6\xa9\x8b\xbd\x77\x17\x2c\x4e"
- "\x61\xbf\x72\xf9\x4d\x8e\xc8\x59\xd1\xc6\x7b\xd6\xbc\x3f\xc6\xdf"
- "\xe4\xe0\x6f\xf1\xf0\xb7\x5a\x65\x1e\xdc\xaf\x3b\x46\x72\xee\x88"
- "\xf7\x8e\xda\x63\xf2\xbb\xc4\xb0\x15\x2a\xf2\x0d\xdb\xda\xba\xdc"
- "\x21\xcf\x2d\xaf\x55\xfd\xd1\xca\x7d\xc1\xf5\x15\x2c\xf6\xaa\x3a"
- "\xce\xf2\xf7\xb6\xc8\xaa\x6c\x88\x8a\xf5\xe7\x5d\xbb\x4f\xfb\xaa"
- "\xaf\x18\xb8\x90\x97\xf2\xfe\xaf\xab\x98\xd6\xec\xcb\x19\x34\x7c"
- "\x75\xd8\xaf\x10\x70\x03\x89\x7e\x89\xca\xbf\xa4\x92\x0c\xbf\x1d"
- "\xdc\x67\xf4\xcc\x07\xf8\x3b\x2e\x98\xc7\x39\xca\x96\x5f\x74\x92"
- "\x2a\x9a\x6b\xfb\x58\x43\x37\xce\x29\xeb\x7e\x3e\xfd\x01\xa3\xc7"
- "\xff\x11\xe3\x5c\x7f\xd6\x17\xbd\x3e\x8d\x95\x45\x31\xbe\x6b\x41"
- "\x1e\x7b\xf9\x5b\x31\xc7\xa8\x72\x8d\xfc\x36\xcd\x35\xbc\xfe\x5d"
- "\xb9\x53\x7d\x17\xb8\xb2\x3a\x16\x17\x85\x47\xe5\x63\xbc\x46\xcb"
- "\xef\x63\x71\x71\xcd\x5c\x30\x67\x94\x6b\xf6\x1c\xc7\x33\xce\x39"
- "\xc5\x05\x73\x64\x6c\x59\x19\xb6\xb6\x64\x71\x31\xef\x48\xdc\x98"
- "\x9e\x30\x86\xe9\xbe\x93\x86\x0f\x8c\xf2\x9f\x5c\x75\x09\xe8\x61"
- "\x52\xfe\x93\xaf\x98\xd5\xb8\xbe\x6a\xe8\xb9\xfe\x32\xab\xb2\x0d"
- "\x7f\x19\xf0\x95\xad\x4a\xc5\xb4\xd7\x7d\x6c\x98\xef\x56\xe5\x25"
- "\x29\xd3\xe3\xff\xc9\xdf\xb3\xe5\x6f\xcf\xf2\xbe\xb6\x8c\x3f\xfe"
- "\x1a\xf7\x5b\x65\x83\xcf\x35\x81\x63\xa8\xea\xfc\xbc\xaa\xca\xe0"
- "\x67\xc3\xcf\x92\x61\xf1\xb9\x95\x51\xe1\x58\x3f\xa3\x55\xdf\x61"
- "\xcc\xb3\xf7\xb4\x63\xa9\x89\x18\xf7\x90\xc9\xcb\x78\xb4\x26\xe2"
- "\x01\xfc\x86\x21\x3d\xd8\xeb\xa7\x65\xb4\xf3\x15\x33\xee\xf3\x13"
- "\x79\xee\x9e\x09\x93\x60\x94\xce\x9f\x55\x92\x4e\xe3\x66\x16\x15"
- "\xb1\x5c\xcf\x9c\x55\xb4\x60\xde\x8b\xf3\x0b\xe6\xcc\x9d\x83\xd4"
- "\x7b\x66\x73\xc8\x5f\x99\xe5\x4e\xfd\x8d\x63\xee\xac\x59\x85\x2a"
- "\x49\xef\x86\xf8\x7d\x20\xb5\x77\xff\x4a\x89\x9f\x2a\x47\xf4\xda"
- "\x5f\xaf\x1c\x14\xa6\x57\x6c\xf8\x5d\x29\x65\x5a\xda\x46\xaf\x54"
- "\xc7\xcf\x7b\x5e\xd9\x61\xf0\x83\xec\x3f\x37\xfb\xfa\x7c\xf8\x6d"
- "\x87\x90\xfb\x26\xe8\xb3\xd5\x51\xfe\xa6\xb7\x9f\x56\x4b\x7b\x3f"
- "\x06\x4e\x8f\xfe\xe7\x73\xfb\x2b\x94\x9f\x80\x99\xbf\x0f\xca\xe7"
- "\xf7\x3b\x3d\xab\xc1\xff\x15\x7b\x14\xff\xaf\xee\xe1\xff\x0e\x53"
- "\x2a\xe6\x70\xab\x87\x1a\xf6\x7c\xbc\xcc\xac\x1e\x7d\xae\x2c\xb1"
- "\x8f\xdb\xea\x49\x06\x6d\x8d\x7e\x56\xbc\xb5\xfa\x1b\x63\x1d\xb6"
- "\x56\x8f\x3f\xcf\xf7\x5c\x96\x6d\x75\x31\x70\xc0\xdd\xec\x8f\x7f"
- "\x94\x56\x37\x28\x7e\x59\x5d\x15\xe3\x93\x65\x3b\x4e\xab\xf7\xa8"
- "\x7e\x5a\xbd\xd3\xc0\x0f\xed\x94\xfb\x01\x0c\x43\xc9\xfe\x2b\xb7"
- "\x28\xde\x59\x7d\xc8\xa0\x2d\xcf\x8b\xf1\xec\xef\xb5\x2d\x5e\x29"
- "\x97\x3e\x12\x2a\x7e\x41\x37\xb7\x1f\x70\x66\x18\x70\x3a\x3d\x6b"
- "\xd0\x7e\x4b\x93\x41\x2b\x23\x4f\x2c\x4f\x8c\x9b\x59\x8c\x49\xeb"
- "\x9c\xd9\xb3\x67\xcd\x9b\x6f\xc4\x74\xce\x7a\xb1\xa8\x50\xc5\x70"
- "\xbe\x13\xdd\xbf\x08\x12\x38\x96\xc3\x40\x23\x55\xdd\x26\xd8\x90"
- "\x23\x78\x9d\x41\xfa\xed\xc9\x79\xcc\xab\xdf\x6c\xd6\xe7\x34\x47"
- "\x69\x6d\xa9\xf2\x7d\x59\x3b\x56\xd9\x8b\x17\x2f\x02\x4e\x75\x86"
- "\xbd\xc8\xeb\x97\x1d\x34\x2c\x9f\xcf\x23\xb1\xdf\xf6\xa6\x37\x45"
- "\x1b\xaf\x57\x22\x4f\x93\xf1\xdd\x2f\xb6\x45\xd6\xa8\xef\xb1\x07"
- "\xbd\x73\x39\x66\xfe\x6b\x69\x5a\xe5\xee\x62\x91\xbe\xa5\x0e\x36"
- "\x4f\x06\xcb\xc2\x80\x76\xf6\x9d\xe4\x38\x43\x6b\x6d\x6c\x2b\xb1"
- "\x7e\xe1\xd8\xf8\x6d\xb4\xc6\x8f\xf9\x0d\xc6\xbf\xd7\x32\x82\x69"
- "\xbb\x8b\x57\x2e\x21\x0b\xd7\x01\xdd\xe4\x6f\xaa\x63\xda\xae\x1d"
- "\xf1\x3b\xe8\x1e\x7d\x7d\xd7\xcf\xf5\xf8\x69\x4d\x58\x5f\x4b\x5f"
- "\xa9\xaf\x5d\xae\x44\xbe\x69\x7e\x1a\xa0\x7f\x53\x67\xdb\xe5\x37"
- "\x94\x93\x8b\xbf\x03\xa8\x62\x04\x7d\xce\xdf\x3a\xb4\xf3\xf7\xf6"
- "\x60\x5f\x61\x0e\xb1\xa6\x0e\x6d\xb0\xeb\xbe\xb7\xe0\x95\xb5\xdf"
- "\x29\x9f\xea\x35\xeb\x99\x06\x80\xbb\x5e\x87\xbb\x1e\x70\xd1\xff"
- "\x57\xea\xb1\x89\xd7\x36\x18\x75\x60\x4c\x09\xc2\x16\xcd\x67\x7b"
- "\x14\x78\x3b\xf1\x2b\x5a\x27\xf7\xa7\xfd\x98\xb7\x58\x05\xfb\x0d"
- "\xf5\x7e\xdb\x6c\x6d\xd0\x18\x5f\xb8\x6e\x1d\xf7\xd5\xbc\x7e\xc6"
- "\x6b\x67\x7a\x5d\xab\x79\x7e\x6d\xc0\xc4\xb3\x53\x3b\x7b\xa2\x0e"
- "\x30\x2d\x18\x2b\x83\xfa\x37\xad\x8a\xd6\x9d\x66\x1f\x33\x3f\xc6"
- "\xc2\xab\x45\x41\xc4\xc6\xfb\x3a\x03\x8c\x6f\x86\xd5\x9e\x66\x7a"
- "\xad\x9b\xde\xbb\x5f\x73\x42\xd2\x1f\xf2\x50\xde\x46\xeb\xe4\x77"
- "\xd2\x58\x16\xb8\x2f\xbb\xd0\x37\xfc\x6d\x7b\x71\xf6\xc4\x2e\xcc"
- "\xf3\x07\x1c\xa3\x75\x6f\x73\x1f\xf1\x1e\x2b\xfb\x7e\x21\xcd\xca"
- "\x31\xce\x8f\xd2\xba\x97\xb9\x7f\x18\x17\x51\xb1\xd5\x15\xe9\xcc"
- "\xff\x39\x9f\x6f\x65\x7d\xb8\xac\x14\x76\xec\x6c\xd6\x25\xaf\xa6"
- "\xf1\xbc\x98\xbf\x4d\xc3\xf7\xee\x42\xa1\xc9\xfe\x5d\xc2\xfd\xfb"
- "\x6a\xda\xb2\x80\xd0\xbe\xf3\x90\x38\x10\x22\xfa\xce\x44\x91\xb0"
- "\x29\x85\xf1\x36\xb9\x4f\xf0\x19\xdc\x3a\xf2\xb9\x2a\x08\xf5\x5a"
- "\xd6\x2e\x21\x1b\x9f\x5f\xe6\xef\xae\xb4\x84\x6a\xa8\xa5\xb8\x86"
- "\xfe\x3d\x52\x45\xde\x85\x1c\x8b\xe2\xd5\x5d\xff\xe1\xaa\xe2\x7d"
- "\xab\x34\xdc\xbf\xe4\x78\x94\xeb\x5a\x3f\xf1\x3f\x0e\xff\x89\xfe"
- "\xc3\xfb\x27\x72\x3c\x2e\x9f\xf3\x0f\xe6\xff\x3b\x1d\xcc\xfd\x77"
- "\x72\xb7\x09\x8d\xe7\x4a\x65\x2f\x70\x1d\x15\x80\x55\xc7\x67\x7d"
- "\x6d\x5a\x87\x3d\x1d\xed\x37\xf3\x9a\x7c\x4b\x28\x48\xde\xb9\x9f"
- "\x01\xc7\xf5\x7f\xd9\x7c\x9a\x2c\xde\xb9\xbf\x97\xf7\x6a\x0e\x73"
- "\xa2\xce\x57\xd8\xca\x76\x5a\x84\xcf\x39\xf3\x3e\x1f\xec\x76\x6d"
- "\x1d\xe3\x18\x55\x78\xf3\x37\xdb\x8d\xf2\xb0\xe3\x8c\xf2\x32\x56"
- "\xd4\x26\xa6\x07\x70\x6a\x9e\xa6\x68\x72\x10\xb3\x4a\x85\x33\xe8"
- "\x93\x1f\x4b\x9f\x75\x61\xa6\x0f\xc7\xc7\xd4\xd0\x5f\xc0\x2d\x17"
- "\x34\xd0\x8c\x3a\x80\xb3\x45\x5f\x17\xb5\xac\x3d\x4d\x19\xde\xb9"
- "\xfc\xdd\xad\x57\x9f\xb4\xe6\x99\x2d\xda\xd9\x93\xbb\xd6\x9d\x21"
- "\x33\xf7\x1b\xef\x85\xac\x93\xef\x25\xcd\x73\xb9\xcf\x82\x69\x1f"
- "\xfa\xf1\x6b\xc3\x2f\xc0\x7c\x87\x6b\x3b\xfa\xab\x02\x74\x6a\x45"
- "\x5f\xd5\xf1\x55\xf1\xe2\x36\x3b\xc7\x80\xd0\xe7\x25\xbd\xe9\x90"
- "\xa3\x88\x90\xdf\xb6\x85\xcc\xac\x6f\xd5\x20\x47\xbc\x2e\xb2\xf9"
- "\x35\xca\xd0\x3c\x6b\x86\x6f\x82\xae\xab\x79\x4d\x9e\x01\xb5\xf1"
- "\x5a\xe1\x06\xf9\x1d\x83\x57\x7b\xce\x7f\xae\x1a\xcc\xe7\xe4\x5e"
- "\xb5\x98\x78\x2d\xa5\x62\x77\x85\xce\xe7\xb0\x41\x5f\x83\xfe\x1f"
- "\xac\xfb\x92\xae\x95\xe7\x70\x59\xf6\xfb\xb2\xd1\x61\x1f\x1e\x14"
- "\x1b\xf3\x89\xf7\x54\x32\x96\x8b\x60\x46\x9b\x55\xb4\x84\x0e\xca"
- "\xf3\x91\x2d\xa1\xa8\xdc\x53\xc1\xfb\x94\x29\xa1\xa0\x15\xf6\xe4"
- "\x21\xa6\x9d\x91\xce\xfb\x31\xbc\x56\x35\x25\x24\x82\x53\x17\x5b"
- "\xf9\xbb\x83\x43\xe5\x7a\xbc\x9e\xde\x62\x87\x2d\xbe\x38\x68\x45"
- "\xdb\x23\x3d\xb0\x3a\xf2\x53\x59\xde\x90\x37\xb3\x27\x6f\x47\xbe"
- "\x99\xbf\xa3\xcb\x75\xc6\xa4\xf5\x9b\xea\x42\x59\xee\x2b\x3d\x4d"
- "\xd9\xa1\xaf\xf5\x7c\xff\x91\xed\x4f\xf6\x99\x16\xf3\xf3\x53\xb4"
- "\x8e\x7c\x53\x14\xb0\xc1\xfb\x36\xf9\xfd\xc3\x48\x50\xff\x9e\x50"
- "\x00\xf2\xdb\x4a\xa2\xb2\x3b\x17\xf9\xcc\x0c\x97\xcf\xdd\xf3\x77"
- "\x18\x44\x5a\x34\xb9\xbf\x6c\x45\x20\xec\x2d\x7b\x1c\xfc\xf4\x7a"
- "\x80\xe5\x39\x6a\xf9\xa8\xca\xf1\x1c\xdb\x27\xaf\xcf\x64\x7a\x46"
- "\x21\x63\xd1\xb4\x8f\xaa\x46\x05\x28\xa5\x0c\x7c\xab\xd6\x75\x5e"
- "\x5f\xee\x83\x0c\xba\x35\x01\x9b\xef\xf5\x12\xe6\x1b\x6b\x3b\xfb"
- "\x9f\x7d\x54\x2d\x7d\xbe\xd2\xdb\x82\xbe\x70\x80\x0e\x96\xff\x95"
- "\x0e\x46\x7c\xe5\x7b\x4f\x07\xcd\xca\xf7\xcb\xcc\x70\xdf\xe0\x77"
- "\x6e\xf0\x6a\x41\xb4\x8e\xfa\x5a\x6f\xe7\x39\x27\xc6\xb0\xbf\xab"
- "\xf9\xd7\xeb\x01\x63\xae\x79\xfe\x36\x54\xe5\x72\xac\x02\x21\xec"
- "\xa4\xad\x6a\x74\x00\x17\xb7\xe8\xcc\xa2\x51\x4b\x78\x9d\xab\xca"
- "\x0e\xbb\x3f\x57\x87\x7b\x4a\xc1\x45\xfe\xf3\xc0\x65\x9e\x39\x58"
- "\x2d\xf7\x7a\xd0\xa6\x46\x5b\x14\xb0\xa3\xe9\x8d\x79\xd0\xf1\x6e"
- "\xf7\x77\xbc\x0e\xfa\xc6\xcb\xa8\xc7\xd6\x12\x39\x44\x1c\xf3\x64"
- "\xb3\x86\xf1\xf1\x94\x9d\x74\x3f\x37\xf7\x49\xaa\x7a\x49\x13\x59"
- "\x36\xcc\x81\x79\x8f\xc3\xcd\x3a\x8e\xe7\xd7\x65\x51\xba\xc8\x07"
- "\x2b\x8a\xcf\xe9\x03\xc6\xe2\x3f\xf0\x7e\x12\xf4\x44\x54\xd8\x4d"
- "\xfb\xce\xfa\x89\x7d\x59\xe4\xb9\xfd\x15\x57\x6e\x18\xb8\x9c\xee"
- "\x16\x26\xab\xf4\x63\xd4\x2a\xbf\xca\x42\xdf\x4e\x54\x7e\x75\xbb"
- "\xab\x63\x7c\xea\x52\x51\xd7\x19\xf6\xa9\x13\x96\xdd\xd3\x6b\xe4"
- "\x5a\xde\x47\x55\x9d\x9e\x37\x1c\x7e\x7a\x3d\x9b\xf9\x67\x35\xfb"
- "\xd6\x4b\x1d\xfb\xc6\x9a\x60\xda\x7e\xf9\x4d\x19\x3e\x37\xa8\x2d"
- "\x8c\xee\x5a\xf7\x2d\x99\x15\x3d\xde\x78\xa1\xa5\xbd\xd3\x2b\x2a"
- "\xf6\x07\xf9\xcc\x98\x0e\xdb\x7a\x92\xde\x18\x2b\x2a\xf7\x63\xec"
- "\x79\x63\xb5\xea\x1b\x79\x9f\xcf\xef\x23\xdd\x59\x90\xc1\xaa\xc3"
- "\x35\x5d\xbc\xbe\x5e\x55\x2e\x3c\x57\x7b\x3b\x2c\xfb\x83\x0f\xdb"
- "\xd9\xa6\x7a\xa3\xce\x9f\xd2\xe0\xd5\xd7\xd6\x64\x0c\x82\xc4\x35"
- "\xb1\x9e\x3e\xdc\x68\x4f\xf7\x01\x08\xe6\x88\x99\xc7\xa9\xfa\x92"
- "\x2e\x0f\x99\xba\x61\x0b\x76\x99\x60\xf3\x6f\xcc\xcf\x58\x3b\x84"
- "\xb2\xf1\x6e\xc8\x71\x7a\xe3\x4c\xc4\x44\x99\xf8\xd9\x82\x57\x3a"
- "\xd3\x00\x37\x97\xd7\x1d\x9b\x4f\xf3\xba\xd1\x9b\x8f\x48\x5b\x6d"
- "\x03\x0d\xd7\x00\x8f\xf7\x50\xd6\x0d\xa1\xe1\xbc\xf6\x87\xb4\xac"
- "\x82\xa8\xda\x4b\x34\xe6\xf7\x2b\x86\xd0\x88\xf8\x7a\xdf\x38\xa2"
- "\xd6\x06\xab\x65\xcc\xb4\x45\x41\xfa\x51\xf1\x5d\xfc\x9d\xca\x37"
- "\x0f\x09\x4f\xaa\x10\x57\xda\x4d\x6a\xbf\xff\xcd\x4f\xad\xd5\x8a"
- "\xef\xe4\xde\x19\xf8\x8d\xf7\x26\xf5\x7d\x9a\x14\x19\x7b\x21\xbd"
- "\x61\x38\x7f\xf3\x37\x66\xed\xd5\x26\xf1\xd0\xcf\x4b\x47\x57\xdc"
- "\x34\x83\x61\x30\x3e\x05\x33\xd5\x1e\x0f\x9f\xa5\xf6\xd3\x9b\x32"
- "\x1e\xe3\xea\x0d\x94\xf1\xca\x06\xb2\x35\xcf\x96\xed\x0a\x28\x59"
- "\x34\x13\xe3\xab\x55\xb0\x9c\x81\x27\x80\x37\xd7\xc7\xbc\xd1\x12"
- "\x39\xe5\x75\x97\x08\xcd\xfb\x1c\xdb\xa2\x6f\xdd\xe8\x9d\xb7\x93"
- "\xa6\xb6\x45\xd4\xb9\xbf\xe9\x14\xac\x05\xbc\xda\x21\x64\x3b\x46"
- "\x6f\xdd\xee\x2b\x22\xde\x03\xb8\xc6\x3b\x6f\x0f\x60\xbf\x75\x3f"
- "\x8f\x05\x6b\x40\x1f\x35\x26\xbc\x15\xf1\x85\x5b\xa9\x19\xf2\x3d"
- "\xa5\x58\x44\x19\x0e\xf2\x2c\x97\xed\xdd\x68\x77\x14\xa8\xf3\xee"
- "\xb2\xad\x3d\x7b\x67\x7a\x3b\x7c\xa7\x25\xbc\x2a\x1f\xac\x52\xa3"
- "\x4d\x06\xad\x15\x7f\xbd\xf5\x47\xef\xbc\x7a\xe2\xfe\xe1\xfc\x78"
- "\xf6\xfa\xda\x91\xf7\x44\x7c\xbf\x70\x1e\xbc\xfb\x16\x70\x7f\xda"
- "\xbb\xff\xcb\xfb\x92\xbd\x79\x6a\x36\xf0\x39\xa0\x37\x47\x6f\x04"
- "\x8d\xd4\x7a\xf9\x5b\x4f\x32\xae\x7e\x7a\x6b\xba\xaf\xe4\xaf\xc9"
- "\xfd\x3c\x21\xfb\xe0\xfb\xe5\x2d\x72\x1f\xac\x7a\xf2\x94\x88\x26"
- "\x94\x3e\x7b\x9b\x65\x2b\xec\xc7\x95\x75\x81\xd4\x27\x37\xb3\x6f"
- "\xcd\xdb\x29\xd6\x14\xd5\xbf\xdc\x16\xb6\x57\x92\xf5\x71\xcc\x1e"
- "\x9d\x8d\x71\x35\xfa\x98\xbf\x97\xa7\xf1\x3e\xeb\x10\xd0\xbb\xdb"
- "\x4e\x8a\xff\xc4\x7a\xd4\xfd\xad\x6e\xbb\xb5\xea\x63\x59\x6b\x47"
- "\xda\x47\x75\x7c\x2e\xcd\xf0\xb7\x85\xfc\xd6\x14\x28\x1f\x66\x3b"
- "\xeb\xa8\x5a\x93\x92\x1d\xc6\x51\x2f\x7b\x58\xf9\x39\x54\x7b\x51"
- "\xfe\x70\xd2\xf6\xa6\x42\xef\x78\xa0\xa6\xd1\x1e\xb6\x23\x05\x74"
- "\x15\xc6\x83\x8b\x7c\xa1\x2e\xfd\x5b\x85\x6f\x2f\x83\x4d\x7d\x11"
- "\x9f\x4b\x31\x70\xbb\xb0\xfd\xb4\xb7\x27\xaa\xb9\xcd\xdb\x15\xc6"
- "\x7a\x8d\xb0\x80\xc6\x1e\xab\xe0\x33\x6a\x7c\xd6\x20\x94\xf6\x0d"
- "\x05\xd3\xba\xb3\x95\xdc\xbc\xbd\x0b\x76\xaa\xd4\xb7\x05\x61\xfe"
- "\x46\xfc\x57\x61\xde\x2f\xc5\xbc\xe9\x22\x6e\x33\xe0\x60\xfe\xf3"
- "\x42\xa6\x1a\xcf\xdf\xee\xd3\xf7\x5a\xce\x99\x8c\xb6\xa1\x4d\xb2"
- "\x6d\x68\xa3\x6c\x9b\xfe\x2d\x9f\x63\xb4\x41\x9e\x5d\xbe\xb0\xf6"
- "\x6c\xb0\x2b\xda\x7e\x43\xfc\x9d\xd2\x63\xb4\xf1\x6b\x79\xfe\x00"
- "\x7d\xa2\xf6\x16\x36\xc0\xd6\x7d\x25\xfd\x02\x61\xaa\x18\xd1\x15"
- "\xdd\xd9\x6f\x70\xdc\x3f\xfd\x7b\x60\x80\xdd\x0c\x5d\x9e\x2d\xcf"
- "\x76\xa1\x3e\xfe\x9e\x62\xaf\x1e\xda\x98\xc7\x7d\x75\xf3\x4e\xca"
- "\x55\x7c\xb8\x71\x02\xaf\xdf\xaa\x79\xde\x86\x10\x74\x6f\x83\x9a"
- "\x53\x19\xbe\xd9\x29\xd2\x37\x3b\x56\xc7\x5e\x18\x8e\x1b\xa5\xbe"
- "\x13\xe9\x47\x41\xff\x0d\x6d\xf2\x8c\x1a\xf0\x5d\x14\x31\xf4\xdf"
- "\x86\x36\xf6\xf3\xe9\xd9\x63\x5f\x0c\x5e\x29\x53\x67\x76\x3b\x3d"
- "\x1b\x57\x1a\x36\x8a\xfc\xfe\x93\x47\x1c\xe0\x7c\x53\x17\x9f\x92"
- "\x7b\xf0\xeb\xe4\xf9\xf2\xe3\xfa\xf9\xa6\x8d\x6f\xeb\xeb\x19\x59"
- "\xec\x17\x8f\xb2\x5e\x3f\xed\x93\xfe\x3c\x4c\x03\xae\x5b\xe2\x2e"
- "\xbf\xc1\xb4\xf1\x48\xef\x5e\xca\x86\x06\x99\x2e\x7d\x45\x37\x86"
- "\x0c\x1e\x41\x7b\x2f\x52\x71\x18\x37\x3c\xd9\x38\x82\x24\x0f\x74"
- "\x08\x7b\xfa\xb5\x35\xcc\x93\x35\x43\x63\xe9\x34\x35\xa2\xb9\x95"
- "\x0e\xda\x68\x16\x52\xd6\x37\x9a\xbf\xdf\x9e\xa8\x79\xc9\xb0\x45"
- "\x14\x9d\x6d\xc0\xb1\x76\x8c\xa4\x75\xc5\xd6\x06\x8e\x87\xb1\xb4"
- "\x8c\xe3\xfb\x6c\xba\x85\xe3\x28\x45\x2a\xb6\xb6\x46\xf9\x2c\x1c"
- "\xc6\x59\xad\x62\x6b\xe0\x58\x31\x99\x0a\x8a\x79\xff\x68\xbf\x97"
- "\xe7\x57\xc2\x0d\x5b\x20\x1d\xf6\x09\xe4\x7c\xd9\x1c\xb2\x3e\xe9"
- "\x04\x6c\x77\x56\x26\xc7\x39\xe2\x18\x47\x1c\xa7\x2c\xea\xce\x1a"
- "\x84\xfb\xc1\xb0\xe7\x6c\xc2\xb2\xf5\x00\xfb\xa0\x44\x3d\x02\xfa"
- "\xf8\x08\xc7\x5a\x32\xf9\x82\x61\x5a\x76\x82\x2c\x1c\x47\x29\x52"
- "\xb9\xbf\xb5\x25\xf4\x37\x39\xb7\x18\x58\x0c\x7b\x5a\xa3\xa1\xa0"
- "\xb9\x5d\x4b\xdb\xef\xc5\x18\xdf\xa4\xda\x7d\x4a\xa8\x76\x2b\xbc"
- "\x19\x7f\xa5\xe3\xea\x03\x65\x12\xf7\xcd\x7f\x8e\x00\xbe\x56\xf1"
- "\x6e\x5b\xb4\xe2\x5d\xbf\x3a\x43\x77\x90\xca\x4a\x44\xc0\x07\xdb"
- "\x98\x7d\x22\xf9\x9c\x24\xfb\xb8\x70\x1b\xb9\x7d\x5c\xf7\x7f\x9c"
- "\x3e\x21\xe3\x42\x45\xf0\xec\x2e\xd2\xcb\xb4\xa3\x4c\xfb\x41\xea"
- "\xaa\x78\x57\xb6\xbd\x25\xa4\xca\x16\xc8\x7b\x2e\x1f\x43\x07\xbd"
- "\xcd\x3d\x74\x40\xdb\xb9\x7d\xdc\xfe\x08\xd3\x04\x34\xd0\xdb\x6a"
- "\xef\xd6\xdb\xc9\x6d\xfc\x77\x8c\x3a\x1b\xd0\x4e\xb4\x55\xb6\xb3"
- "\x1b\xed\x3c\xe0\x24\x0a\xaf\xfa\xc6\xf6\x5d\xfa\xbb\x7e\x9e\x1f"
- "\xba\xff\x08\x3b\xba\x74\x3d\x61\x1e\x68\x7e\xaf\x6c\xbd\x69\x15"
- "\x6c\x93\xb2\x20\xe6\x83\x41\x11\x60\x7b\xdf\x57\x8c\x5f\xa4\x46"
- "\x7e\xe3\x55\xda\xc7\xfc\x3d\xce\x97\xd0\x26\xed\x6b\x2a\x0b\x88"
- "\x00\x6c\xd3\xb0\x2f\x82\x3c\x4e\xb4\x1f\xf3\xc7\x63\x3a\xfe\x9c"
- "\x77\xd9\xb7\xaa\x5d\xd6\x22\xca\xfc\xe2\xf1\x0a\x93\xaf\xb5\x82"
- "\x8c\xb6\x3c\x85\x7c\x68\x8f\x1d\xb0\x06\xc8\x18\xf8\x68\xe7\x46"
- "\xe0\x19\x8e\x69\x53\x73\x7b\x18\x30\xff\x4c\xe9\x79\x94\xb2\xe1"
- "\x24\xda\x71\x92\xec\xeb\xcb\x60\x7f\x3d\xc4\xf6\xe2\xe6\x01\x17"
- "\xe7\xd3\x70\x3f\x6d\xca\x54\x7c\x27\x63\xb4\x5c\x76\x9c\x6a\x6f"
- "\xef\x89\xc3\xc2\xb1\xad\xd2\xf6\x1f\x61\x3e\x92\xf1\x58\x78\xcc"
- "\xe8\x04\xcf\xb0\x7f\xca\x22\xd4\xd1\x99\x35\x58\xe2\xe3\x19\x4d"
- "\x78\xce\xc0\x33\x7f\x9f\x27\x93\xd7\x04\x50\xae\x55\x80\x66\x0c"
- "\x1f\xf6\x5c\x13\x5f\x99\x86\x49\xcf\x6f\xbc\x4f\x39\xa8\xa3\x9a"
- "\xe7\xbe\xbb\xca\x82\xa6\x97\xdf\xa7\x11\x17\xa6\x53\x6a\x0b\xfb"
- "\xd2\xdf\xbc\x17\xc0\xf0\xd0\xb6\x41\xc7\xa9\xee\xfe\x78\x19\x73"
- "\x48\x5d\xa6\xf4\x60\x9d\x8d\xd7\xdf\x2f\xb0\x5e\x69\xc3\xb1\x1f"
- "\xd1\x85\x95\xab\xcb\x34\xf0\x00\x8c\x43\x7d\xe1\x7e\xe1\x74\xa8"
- "\x2b\xea\x0b\xd6\x9a\x37\x65\x6c\x2e\xf7\xda\x37\xd9\xc7\x2f\x10"
- "\x6e\xb4\x73\xbc\x64\x8c\x9d\xf5\x21\x9a\xbf\x89\x2c\xee\x13\xbc"
- "\x26\x33\x99\x1a\x6b\xb2\x69\x33\xe6\xe4\xa2\x23\x6b\xd0\xeb\xa7"
- "\xd9\x9f\x40\xe9\x10\xb6\x49\xf9\x1c\x9b\x98\x9f\x65\x5b\xf7\xa6"
- "\x61\xc3\x6f\xb9\xbd\xf4\x0c\x99\xd4\xf7\x28\xb6\x8c\x1e\xef\x10"
- "\x91\x2a\x93\xe6\xac\xe1\xf8\x42\xe9\x5f\xb1\xfd\xe2\x34\x62\xf6"
- "\x48\xdb\xc7\x05\x99\xeb\xb0\xa7\xaf\x99\x47\x23\x38\xce\x98\x35"
- "\xa8\x6c\x39\x35\x5e\x6f\x29\x04\x7e\x36\x7d\x0f\xdd\xa6\xe2\xf8"
- "\xd4\xee\xac\x3d\x8d\xba\xd4\xfb\x37\xa2\x98\xc3\x48\xb8\xf3\x68"
- "\x78\xcd\x69\xca\x62\x3b\xa8\xe0\x6b\x65\xb3\xf1\xbc\x70\x72\xbb"
- "\x55\x44\xff\x4f\x16\x6d\x3a\xde\x1b\x87\x2c\x38\x9f\x63\x97\x09"
- "\x7b\x5f\xe7\x83\xd7\x0d\x96\x7e\x34\x32\xf6\x85\xfa\x5e\x19\x51"
- "\xd5\x6b\x64\xe6\xef\x73\xf2\x5a\x1e\xaf\x0d\xf3\x59\x1a\x35\x86"
- "\x6c\x35\x1b\xf1\x99\xfa\xdc\x9b\xab\x50\xf3\x1d\xed\x22\xcc\xbf"
- "\x82\x9d\x5e\xef\x42\x1e\x33\xb6\x4e\xe2\xf3\x3b\xbd\x73\x9c\xad"
- "\x23\xf9\x1d\xa7\xb1\x7f\x79\xae\xa4\xe5\xd6\x12\x9e\xf7\xe8\x73"
- "\xc6\x2f\x1c\x3d\x69\xca\x86\xe1\xb1\x8c\x71\xa8\x55\xeb\xc8\x03"
- "\x81\xcb\x7a\x63\x3c\xe3\x71\x5d\x7d\x1b\x74\x6b\xbd\x3f\xe5\xb3"
- "\xf0\x79\xf0\xb3\xe9\xdf\xd6\xe5\x33\xe9\xb9\xc8\x7f\xd8\x18\xdf"
- "\xe4\xb7\x1f\x56\x0c\xb9\x77\xfe\x62\x1a\xfa\xf0\x15\x16\x19\xf3"
- "\x80\xbf\xf1\xa8\xc6\xdd\xad\x91\xde\x3d\xaa\x5c\x49\x6f\xf9\x5d"
- "\x37\x9e\x63\x98\x30\x06\xab\x58\x63\xed\x6a\xfc\x35\xce\x17\x6f"
- "\xbb\xa2\xb7\x9e\x6d\x63\x7a\xc6\x51\xd4\xc1\xbe\x12\x0c\x5f\xd9"
- "\x26\x5b\xb9\x6c\x90\xe7\x56\x6a\x7c\xdd\x1a\x3c\x8f\x2d\x96\xc5"
- "\xf4\xd5\xf4\xf9\xa4\xaf\xfd\x1f\x8a\xbe\x2e\x4a\x1d\x55\x45\xf6"
- "\x2f\xca\xfc\xe6\x81\x2a\x66\x8e\x15\xf5\xaf\xe1\xf7\xcc\xeb\xde"
- "\x9b\x79\x2d\x6e\xdb\x37\x3e\x1e\xb7\xbb\xf3\x33\xa6\xf0\x5c\x5f"
- "\xda\xe2\xdb\x5a\x47\xa2\x1c\xd2\x06\xed\x3f\x19\x36\xaf\x5b\x42"
- "\x23\xf8\xfb\x89\x48\x97\xdf\x86\x0a\x5e\xfe\x7c\xe7\xb5\x99\x64"
- "\xbf\xb6\x8a\x7d\xec\xeb\xc9\x9f\xf2\xa9\x3c\x37\x22\xeb\x5f\xd5"
- "\x3d\x83\xe3\xac\x7d\xd0\xe5\xef\xa7\xfa\xaa\x7e\x13\x9e\xb3\x62"
- "\x9e\xef\x30\xd6\xf2\xfd\x54\x5f\x23\xf7\x03\xd9\x8f\x78\x2e\x8f"
- "\xd7\x5f\xf9\x7b\x7d\x6f\xea\x37\x29\x5c\xea\x37\x35\x16\x13\xaf"
- "\x55\x1f\xde\x2c\x63\x26\xd5\x17\xfb\x69\xeb\x2e\x7d\x3d\xe6\x90"
- "\xe4\x2b\xb6\x77\x7f\xc5\x73\xb0\x7f\x78\xd7\x20\x1f\x8f\x13\x05"
- "\x2e\xca\x55\x36\xfc\x57\x61\x0d\xfc\xd3\xdb\xfe\xfa\x34\x5e\xeb"
- "\x4b\xaa\x13\x37\x10\xc9\x32\x95\x5f\xe5\x48\x3f\xae\xca\xa8\x17"
- "\x57\x8b\xa8\x6c\xf3\xe3\x9a\x81\xf4\x20\xae\x36\x5c\x03\xb8\x42"
- "\x7f\x77\xd7\x31\x5f\x62\x0e\x6b\xc7\x3c\x81\xf7\x16\xb3\xfb\x3a"
- "\xff\xc7\xb4\xf1\xad\x7c\x94\x94\x5f\xea\xf6\xf2\x66\xf4\xe6\xd4"
- "\x4d\x44\xf3\x23\xa2\xcb\xf1\x23\x3e\x67\xb3\xbd\xdc\xbd\x89\xfd"
- "\x41\xb6\x4f\x8b\xf7\x07\xd9\x8e\xbb\xed\x7b\x88\xde\xb1\xe0\x97"
- "\x83\xfb\xf2\xde\xdf\x3b\x25\x9d\x9e\xed\x98\xaf\xd6\x4b\x1b\xeb"
- "\xc2\x74\xe2\x76\xb5\xbf\xce\xf3\xa2\xb4\x46\x52\xed\xed\xb6\xe1"
- "\xd9\x22\xd2\xba\xf3\x54\x7b\xdb\x08\xcf\x36\x87\x1b\xe3\x5a\x1a"
- "\x68\x32\x04\x6d\x4e\x8b\x7a\xb9\xbd\x8c\x6f\x47\x5a\x9b\x3f\xf6"
- "\xec\x23\xc3\xe4\xf6\x07\xd3\xda\x18\x1e\x89\xeb\x1f\x28\x36\xe8"
- "\xa9\xd3\x89\xf7\x8d\x4c\x1d\x80\xa1\xec\x20\xe4\x07\x0c\x23\x7f"
- "\x0f\xed\x87\xf0\xb7\x0c\xd0\xa7\xc8\x87\x39\xb1\xc5\x38\x57\xd9"
- "\xe9\x79\xa7\xe8\x77\x45\x6a\xff\x80\xcb\x86\x62\xca\x72\xac\x81"
- "\x64\xe5\x51\xa7\x45\xd5\xd9\xe6\x3f\x46\xdb\x97\xab\x7a\xdf\x99"
- "\xd1\x97\x2c\x95\x0d\x83\x7d\x57\xe3\xe7\x78\x04\x6c\x0f\x8d\xf1"
- "\x0d\x0d\x91\xaf\x46\xc3\x98\xdf\x66\xcb\x2d\x13\xde\x63\xf4\x2f"
- "\xc3\x5a\xc2\x81\x0b\x1c\x0f\xdf\x51\xdf\x08\xeb\x2a\x27\x5f\xe9"
- "\xad\xf2\xbb\xc1\x27\x69\xc7\x2f\x7c\x41\x19\x7f\x9b\xef\xc7\xf2"
- "\x7b\xf6\x7d\xe0\xb1\x01\x73\xec\x9e\xf8\x75\x1a\xf2\x6e\xe6\x74"
- "\xa4\xf9\x42\x41\x19\xe7\xae\xd7\x37\xfb\x2b\xbb\x92\xa9\x1d\x69"
- "\xf2\xdc\x3b\xe3\x1b\xf9\xb9\x97\x71\x86\x2c\xd9\xb9\x0d\x6e\xcc"
- "\xff\x7c\x91\x4e\x2f\xcb\x84\x63\x21\xaf\x15\xfe\xcb\xd7\xe0\x3b"
- "\x81\xb9\xb6\xfd\xc2\xda\xf0\x2f\x72\x4e\xe3\x8e\x88\x93\xc1\xb4"
- "\xaf\x78\x8d\xd9\xb4\xae\xac\x9f\x65\x5c\x8d\xf0\x76\xa4\xb7\xd9"
- "\x3a\x3d\x3b\x2c\xbf\x73\xa9\xbe\xb9\x30\xb8\x3b\x2c\x46\xdb\x37"
- "\xeb\x6d\x47\x5d\x72\x6f\x6e\x54\xb5\x8a\xeb\x87\x3c\xb9\x7d\xae"
- "\x59\xa1\x9f\xd9\x1e\x60\xbf\x51\x9d\x16\xeb\x7b\xc6\x86\x0b\xc3"
- "\xe3\x9c\x98\x69\x49\xea\xe8\xd6\xeb\x08\xfd\x5f\xd6\x11\x3a\x5f"
- "\x1d\xd0\x0d\x57\x1d\xa7\x77\xcb\x2f\x7c\xee\xf8\xee\x24\xc9\x2b"
- "\x15\x6d\xa4\x74\xe6\x6f\xbe\x8d\x62\xfe\x16\xb1\x74\xdb\xe4\x37"
- "\x7e\x4c\x54\xce\x31\x0e\x23\x15\x8d\xd4\xec\xea\x22\xef\xc2\x3f"
- "\x51\x1b\xbd\xfb\x29\x97\x69\x2e\xe1\x39\x5b\x77\x5e\xf7\xaa\xb6"
- "\x19\xdd\xa6\x1d\x87\x98\xde\x9b\xd0\x0f\x1b\x63\xf8\xac\x25\xf4"
- "\x27\xf2\xcd\xe0\xf5\xd5\x43\xbc\xae\x9d\x07\xfd\x60\xd3\xa0\x1b"
- "\x60\xa3\x47\x25\x3d\x60\xbf\xa8\xf9\x56\x20\x2c\xe7\x5b\x41\x79"
- "\xe6\x6f\x80\x8c\x5d\xe8\x29\x3a\xc8\x6b\xdf\xd1\xee\x7c\x47\xa7"
- "\x87\xf2\x38\xa6\x21\xaf\x3b\x0b\xcb\xee\x92\xa9\x91\x54\x21\xe7"
- "\x53\xb0\xfd\x39\xa6\xa1\x0f\xb3\xca\x28\xec\xe8\x9a\xb3\x94\x59"
- "\x03\xdb\x13\x3a\xdb\xc6\x7a\xbd\x56\x8f\x6b\xb8\xe6\x6c\x6f\x5c"
- "\xc3\xcd\xbc\xd6\xd3\x8a\xfb\xb3\x64\x8e\x56\x06\xc2\x1b\xcf\xd2"
- "\xf0\x4d\x0b\x29\x6b\x23\xaf\xe5\x7d\xa3\x6c\x1f\xb6\x2b\x64\x8c"
- "\xc3\x17\xb3\x78\x3d\xbf\xd7\xf6\x59\xc4\x31\x58\x7b\xf4\x96\x9c"
- "\x8b\x5e\x18\xbd\x7f\x23\xc7\xc1\x48\xc5\x57\x39\x11\x4b\xd4\x0b"
- "\xda\xf9\xd1\x07\x41\xd0\xaf\x28\x59\xdf\x1a\xbe\x4d\x55\x31\x71"
- "\x29\x7f\x37\x5c\xe9\x77\x3f\xfd\x76\x74\x5f\x3c\x11\xdd\x98\x4f"
- "\xa3\xda\x29\x5b\xf9\x2b\xa4\x61\x4c\xfc\x6d\x35\xef\x9f\x97\xbd"
- "\x40\xf6\xe8\xc6\xe9\x29\xee\x2d\x94\xca\xdf\x94\xe6\x5f\xd9\xb7"
- "\x22\x30\xaa\x88\xb2\x79\xff\x81\x7d\x1a\x1c\x4b\x65\xfe\x39\xc3"
- "\x4b\x29\x3b\x16\xf6\x44\xe5\x6c\x74\xa7\xe3\xfe\xb9\xcf\xbc\xf8"
- "\x42\xf1\xcc\x92\x39\x4f\xcf\x29\x9a\x53\xb2\x58\x86\x0d\x18\x21"
- "\xff\xdd\x77\x5d\xe1\x34\xb9\xe9\x1c\x63\x5f\x0c\xef\x5d\x8f\xdb"
- "\x39\x2c\xca\xeb\x07\x17\x44\xaf\xdf\xb6\xeb\xfb\x68\xc1\x4d\x72"
- "\x5f\x69\xe7\x68\xd8\x63\x16\xd6\x15\x6b\x54\x0c\x99\x80\xf2\x63"
- "\x50\xf9\xb4\x8a\x6e\x8e\x41\x34\xe6\x28\x7d\x60\xe3\xfd\x10\xf4"
- "\x55\xd0\x57\x7a\x9c\x60\x87\x8c\xe1\x7d\x96\x66\x5e\xcb\x90\xb6"
- "\xef\xce\x2d\x72\x0c\x3b\x29\xe3\x50\xd5\x1f\xc5\x33\xfb\xbd\x6b"
- "\x22\x7f\x63\xf4\x45\x7b\xbd\xf6\xa2\xfd\x1d\x21\xf2\x37\x68\xa7"
- "\x9c\x1b\xc5\x29\xe7\x06\x51\xb1\xcd\x02\x19\x1b\x7a\x9c\x76\x7e"
- "\x1c\xf1\xd0\xe5\xf8\xf5\xef\x8d\x21\xb0\xf3\xdf\x26\xb5\x89\x6e"
- "\xfc\x34\xcc\xcb\xb3\x62\xf6\xd0\xf8\x9d\x3c\xb3\x51\x3c\x8f\x7d"
- "\xa9\x76\x46\xb9\x6e\xb1\xaa\xfe\x86\xa0\xdb\x99\x8a\xfc\x51\x85"
- "\xcb\x7b\x57\xf8\x56\x1e\x23\xb5\x6f\xfa\x9e\xdd\x2b\xd7\x8c\xdf"
- "\xfb\x90\xcb\xf1\x3e\x1b\xdb\xd0\xbe\x36\x9e\x5b\xfc\xb6\x9e\xfd"
- "\xf0\xd8\x7e\xde\x34\x88\x6c\xeb\x07\x51\x46\xa7\xe7\xbd\xf1\x3d"
- "\x3e\x16\x16\x35\xa6\xf2\xb8\xc6\xb1\x88\xa1\x73\x3a\x79\x8c\x64"
- "\x3c\x98\x4f\x01\xb3\x98\xf7\xe0\xd4\xb9\xa2\xf7\x4a\xfd\x54\x14"
- "\xbc\x70\x9d\xfb\x9e\x8c\x6d\x23\x4c\x6e\x31\x6a\x35\xcd\x90\xfb"
- "\xa3\xca\xe7\xd0\x0c\xb9\x74\xaa\xf6\xbc\xff\x8d\xdc\x3f\x5f\x78"
- "\xa2\x0e\x72\x53\x5e\xdb\x45\x19\x5a\xc5\xee\x22\xb6\x63\x9a\x4b"
- "\xe5\xbe\xb2\x05\xe5\x76\xf1\xbe\xb3\x3c\x97\x27\xe3\x5c\xff\x89"
- "\x6a\xcf\x90\xb9\x8d\xde\x0b\xf3\x5a\x7b\x2f\x6d\xdf\x9f\xcc\x7b"
- "\x2b\x62\xd5\x96\x3a\x6b\xa9\xa9\x82\x61\x68\x67\x4f\xe6\x18\xe5"
- "\x30\x76\xf7\xe7\x72\x47\xe9\xfd\x5b\x64\x39\xce\x2b\xbf\x8f\x68"
- "\x9b\x8e\x71\x2c\x87\xf3\x47\xf0\xbc\x59\xb3\xe5\x09\xc8\x5b\x74"
- "\x61\x74\x17\xde\x4d\x83\xbe\xf3\x23\x2d\x5f\xae\xf1\x62\x5e\x2e"
- "\xe3\x9d\x58\xf6\x07\x7d\xfe\x7f\x78\x25\x3e\xec\xc7\x5a\x02\xdd"
- "\x24\xed\xbe\xf7\x5f\xde\xfc\x0d\x99\x8b\x67\x73\x1f\x7e\x60\xd7"
- "\xf9\x66\x87\xc2\xef\x83\x2b\x3a\x56\xbd\xeb\xef\xb0\x7c\x15\x0c"
- "\x99\x2c\xd4\x68\x67\xbf\xfb\xee\xba\x46\x7b\x17\xe6\x0e\xef\xfb"
- "\xfd\xa6\x2d\x36\x65\x73\xa8\x72\xbc\xb7\x03\x7b\xb4\x3d\xd5\x6e"
- "\x9b\xd2\xe9\xf9\x80\x0c\xff\x0a\xfe\xa6\x38\xef\xf1\x80\xbe\xad"
- "\x4c\x37\x3f\xed\x2c\x92\xeb\xfc\x2b\x9e\x08\xa0\x3d\x17\xb1\x0f"
- "\x1c\xd3\x99\xcf\x37\x58\x71\x2f\x16\x8a\x1c\x6b\x24\xd7\x54\x2b"
- "\xcf\x35\xca\xf3\xf2\xa3\xf5\x98\x2d\xd9\x7a\x0c\x97\x11\xfc\xac"
- "\xce\xdb\x7f\xd0\x73\xfe\x9f\xe3\xd4\xb0\xef\x40\x54\xf7\xab\x93"
- "\xf1\x5b\x4e\xab\xfd\x51\xf6\xab\xe3\xf5\x41\x3e\x1f\xc8\x7b\x98"
- "\x28\x57\xd7\xe3\xe7\x28\xcf\xc5\x7c\xb0\xcb\x88\xdb\x82\xfb\xbd"
- "\x3d\xfe\x3a\x68\x7b\x47\xc5\x57\x81\x90\xa5\xbb\x2e\x54\xf1\x55"
- "\x36\xde\xb5\x42\x6e\xcf\x17\x37\x90\xbf\xef\x42\x1c\xcb\x42\x4b"
- "\xdf\x5d\xcd\xf1\x2c\x1a\x43\xa4\x9f\x09\xde\x75\x87\x7e\x7e\x3c"
- "\xf5\x24\x7d\x70\xa6\x77\x2f\x31\xaa\xaf\x83\xed\x9a\xa1\xec\xb0"
- "\x5d\x33\xe4\x3a\xd8\xaa\xaf\x0e\x6d\x5b\x12\x36\xed\x5a\x02\x29"
- "\x90\xe7\x04\x76\x4d\xf3\x53\x43\x85\xe1\x8f\x82\x7c\x99\x7d\xc5"
- "\xb2\x12\x15\x0d\x45\x0a\xe6\x87\x72\x0d\xa3\x77\x5e\xf3\xa1\xda"
- "\x27\x5b\x31\x64\x86\xc6\x63\x60\x7a\xa3\x4d\xfa\x56\x14\x9f\xe6"
- "\xf5\xb0\x8b\xd4\x1c\x4b\xe5\xd1\xfd\x22\x2f\x3d\x1e\xff\x3c\x88"
- "\x9f\x15\xcd\x76\xb5\x19\x6b\xeb\x6b\x4d\x1a\xc7\x36\x16\xee\x3a"
- "\x11\xf2\x15\x87\x08\xf6\x55\xd0\x87\x31\x15\x75\x08\xe8\x87\xfe"
- "\x28\x73\x05\xd3\x5e\xc9\xd0\x87\x6b\x24\x4e\x9e\xbb\x85\x9b\xed"
- "\xca\x20\xfb\x76\x9c\x26\xe4\xbb\x04\xf9\x26\x34\x95\xb6\xb3\x7f"
- "\xca\x0c\x8e\x21\xd7\xa6\xd7\x1d\x4c\x6b\x28\xba\x36\x83\x66\x74"
- "\x7a\x3e\xcc\xf7\xd3\x0a\xfb\x85\xcb\xf6\x87\xf9\xe7\xb3\x31\xd4"
- "\x98\x97\x4b\x7d\xcd\x53\x78\x1e\x7a\x33\xea\x9f\x2c\x18\xff\xdd"
- "\x13\x22\xa6\x30\x75\x9b\xfa\x8b\x1f\x97\xbb\x28\xe2\xe9\x2f\xa2"
- "\x4b\xd0\x5f\x1d\x76\xd8\xb1\x07\xa9\x25\xd2\x24\x7d\x3f\x20\xb3"
- "\xd6\xb2\x90\x38\xed\x8b\xec\x91\xbe\xb0\xea\xcc\xf8\xee\xb1\xbe"
- "\xc8\x3e\x6a\x29\x0e\x12\xeb\x85\xa3\xb4\xfb\x46\xc6\xeb\xe6\xe2"
- "\x72\x1a\x79\x92\xdf\x7f\x18\x50\xe3\xdf\xee\xf1\xfa\x35\x93\x63"
- "\x0d\xc6\xe2\x74\xdf\x82\xb9\xcf\x94\xcc\x79\x71\xee\xc8\x49\xb3"
- "\x16\xce\x2a\x72\x3c\xa4\x5c\xe9\xe2\xc6\x25\x4b\x6f\x0c\xe5\x8f"
- "\xe4\x58\xc1\x36\x08\xc7\x52\x3e\x5f\x1c\x65\x23\x86\x32\xf4\xda"
- "\x70\x5e\xb7\xfb\x9f\x8c\xa3\x6c\xd8\x18\x1c\x43\xb9\x77\x0d\xfb"
- "\xa3\x43\x3d\x32\xa0\x7d\xd1\xc9\xcf\x7c\x4e\x52\xf3\xec\xce\x63"
- "\x39\xda\x2c\xfd\xce\x3e\x9a\x18\x1b\xf7\x87\x7d\xec\x78\xdd\x03"
- "\xe9\x33\x8c\x33\xa9\xe0\x45\x8c\x15\x1f\x15\xf7\x9e\x91\xf9\x08"
- "\xfa\xff\xc3\xbd\x4a\x7e\x65\xde\xd5\xc6\x5e\xaf\xfe\xed\x2a\xb9"
- "\x37\xad\x79\x3a\xc7\xab\xf5\x95\x8f\x5e\xdd\xac\xf5\xb7\xa8\xb5"
- "\xfd\x8f\x1a\x8c\xf3\x57\x4a\x36\xbf\xd0\x65\xf3\xa3\x43\xe7\xdb"
- "\x8f\xef\x95\x8d\x3d\x19\xbd\x72\xfd\x77\xbd\xec\x9e\x8c\xef\xdb"
- "\xcb\xd7\xed\xdc\xcb\x8e\xd3\xbf\x0e\xe3\x35\x17\xdc\x5f\x8d\x7b"
- "\x79\xee\x53\xf9\xa2\x7f\xfc\xb5\x7e\x8f\x3a\x3e\x6e\xd6\xef\xaf"
- "\xc4\xfd\xc7\xfa\xfd\x10\xdc\x6f\xd2\xef\x21\xb3\x1f\xbf\xac\xdf"
- "\x67\xe2\xfe\x05\xfd\x1e\x3a\xfe\xe3\x47\xf4\xfb\xc1\xb8\x1f\xab"
- "\xdf\x5f\x81\xfb\xeb\xf4\x7b\xc8\xe0\xc7\x03\xf4\x7d\x51\x0b\x70"
- "\xff\xee\xc2\xed\xee\x3d\x4d\x6a\xef\xed\x63\x33\x74\xa5\x7e\x56"
- "\xad\x27\xcd\x0e\x9e\x76\x1a\xf4\x45\x3a\x9f\x35\xb7\x20\x3d\xdb"
- "\x4f\x5b\x6d\x31\xe9\x3b\xf5\xfc\x13\x31\xbe\xb4\xc5\xa4\xd7\xe9"
- "\xe9\x33\x60\x5b\x8e\x8e\x49\xaf\xd2\xd3\x5d\xd0\x8b\x45\x31\xe9"
- "\x15\x7a\xfa\x7a\x3f\xd5\x8c\x8f\x49\x2f\xd5\xd3\x77\x18\x7e\x08"
- "\x7a\x7a\xb1\x9e\xee\x45\x7a\x28\x26\xbd\x50\x4f\x87\xfe\xff\xe8"
- "\x48\x4c\xba\xd4\x2b\xeb\xe4\xb9\x2d\xab\x68\x2c\x65\xd9\xfa\x98"
- "\xf7\x08\x63\x71\x9e\xa4\xca\xfe\x6b\x26\xd2\x33\x62\xd2\x73\xf5"
- "\xf4\x11\x7e\xfa\xba\x3e\x26\xbd\x4f\xdb\x37\xa5\x9a\x66\xf4\xb5"
- "\x36\xc9\xdf\xfa\x91\xfe\x8f\xd2\x66\xfc\x64\x0e\x9f\xe9\xb2\x6e"
- "\x12\x47\x1d\x65\x42\x1c\xa5\x4f\xf2\x74\xbf\xbf\xe9\xec\x87\xa5"
- "\xce\xc6\x7d\x92\x23\xcf\x4b\x71\x1c\x43\x3e\x2f\xb7\x84\xd3\xfe"
- "\x55\xc6\xca\x1b\xe5\x2a\x57\x31\x0e\x95\x5f\x69\xbb\x9c\xa3\xeb"
- "\xfb\x97\xc8\xc3\xdf\x48\xe4\xef\xb3\xb6\xf3\x3a\x9e\xaf\xa4\x4b"
- "\xfa\x3a\xf2\x1c\x89\xd3\x78\xae\x2a\xcf\x50\xc5\xcc\x95\x94\xde"
- "\xff\x64\x8e\xc6\x67\xdc\x3d\x6a\x3e\xcf\xb2\xc8\xf9\xd9\xe7\x26"
- "\x36\xaf\x9f\x3e\x91\xf3\xdc\x54\xfb\x25\xdb\x3b\x3d\x9f\x4c\xec"
- "\x3d\xd7\xf3\xaf\x75\x7a\x7a\x3d\xd2\x67\xc4\xa4\xaf\xee\x5b\xb7"
- "\x43\xdf\x59\xb6\x04\xba\xcf\x8a\x50\xe4\xac\x08\xaf\xfd\x2f\xe0"
- "\x3d\x5b\x9e\x51\xf9\x51\xb4\x62\x4b\x58\x8f\x17\xf1\x65\x64\xa1"
- "\x08\x42\x67\x73\x9c\xfe\x8b\xa7\x84\x82\x34\xa5\xb8\x53\xac\x79"
- "\x9a\xfd\xe7\xce\xc8\xd8\x49\xee\x76\x8e\x61\xcc\x3e\x59\x21\xde"
- "\xf7\xc9\x68\xc1\x18\xb7\x79\x36\xbf\xff\x1b\x4d\x76\xc2\xf6\x76"
- "\x46\x69\x33\x60\x6f\x7a\xda\xf0\x87\xe4\x18\xf0\xba\x8f\x22\x70"
- "\xe0\xfa\xdc\xf2\x7b\x1b\x0d\x32\x36\x07\x7f\x4f\x4c\x54\x46\x0f"
- "\x89\xdf\x4b\xfb\xd5\x61\x5d\x4e\x0e\x8c\xed\xbc\x0f\x66\x53\xbf"
- "\x28\xeb\x1b\x47\x5f\x6d\x52\xb2\xdc\xe0\x52\xba\x66\xab\x53\xe9"
- "\x8b\x06\x97\xd8\xca\x67\x74\x1a\xf8\xfc\xcb\x81\x60\xda\x57\x49"
- "\xfd\xaa\x96\x6d\x22\x53\xf7\x2a\xd8\x26\x27\x1b\x4c\x4a\x3f\x7d"
- "\xea\xd4\x4c\x96\xe5\xbc\x5e\x28\x63\xed\xaf\xda\xbd\x63\xe7\xdc"
- "\xb0\xa9\x79\x49\x1b\x9f\xda\xb6\x4f\x0f\xb3\xff\x77\xc3\x37\x03"
- "\x4b\x38\x6e\xd5\x57\x87\x60\x77\x9a\x3e\xc2\xfb\xfd\x73\x1b\x4c"
- "\x11\x69\xaf\x7c\xea\x94\x6b\x4c\x15\xbb\x4b\x79\x0c\xf1\xb5\x46"
- "\xd9\x66\xce\x80\xcd\x5c\x04\xfd\x6f\x89\x2e\x72\x0e\x8a\xcc\x77"
- "\x5e\xbc\x69\x1e\x65\x44\xe7\x67\x65\xbe\x7e\x96\x72\x8c\xf1\x07"
- "\x73\xd3\x6c\xd1\x69\x4f\x5f\x87\x31\x85\xe7\xae\x03\x53\x6c\x72"
- "\x2f\x8d\xef\x35\x53\x6d\xde\xe6\x85\xe7\xff\x6e\x48\x14\x73\x56"
- "\x8e\xe5\xcb\xb8\x24\x6b\xeb\xea\x0d\x98\x07\xeb\x67\x4a\xcb\xbe"
- "\xa6\xc1\xb0\x73\x4d\x03\xcf\x08\xef\xf1\x22\x32\xf1\xb7\x16\xca"
- "\x66\xc9\xf5\xa1\x7e\xcd\xce\x08\xf9\x5c\x7f\xa5\xb2\x79\xdc\x47"
- "\x9f\xee\x63\x3b\x8d\xfd\x21\x91\xdf\x76\x9c\x3e\x6d\xb6\x86\x31"
- "\x66\x84\x61\x3b\x3f\xc7\x73\xbd\x4f\xbf\x0c\xc9\x58\xa2\x9f\x0d"
- "\x67\x9f\x70\xef\xbc\x7b\x39\x2d\xea\xfe\x5a\xfa\x3e\xcc\x50\xb2"
- "\xf5\x69\x2b\x3f\xbb\xf9\x8c\x6b\xfa\x27\xf5\xef\x77\x85\xfb\xa9"
- "\x35\x88\x4f\xff\xa2\x8f\x0f\x5e\x35\xe7\xfa\xf4\x9c\xb3\x78\x3d"
- "\x6b\xa3\x15\xef\x70\x3b\xaf\xf6\xd5\x44\x68\x4a\x48\xf8\xe5\x3e"
- "\x25\x9f\xed\x77\xdd\xed\x15\x67\xd7\x93\x3a\x8f\xf6\xd9\x26\xad"
- "\xf2\x1d\x3d\x06\xe0\x67\x32\x46\xa7\x5a\xb3\x7c\xc7\xae\xd6\x68"
- "\xdf\xc9\x52\x6b\x96\xef\xe4\xac\x18\xc2\x3e\xc8\x9f\xd5\x74\xa4"
- "\xbd\x03\x99\xfa\xac\xb8\x23\xfd\xf3\xbe\xce\x7c\x60\x3c\xda\x96"
- "\xe3\xf8\x11\x65\xf2\x5a\x39\xfb\x13\xd7\x2a\x3f\x62\xd4\xf1\x39"
- "\xfb\x15\xf3\xbb\xab\x8f\x16\x53\x2a\xaf\x2f\xa2\xde\x13\xa3\x6a"
- "\xc8\x01\x5c\x07\x08\xcb\xf6\x80\xf4\xdd\xaa\xd8\x1e\xf6\xb5\x0b"
- "\x2f\xfb\x0c\xaa\x3d\x8d\xcf\x77\x8a\xb4\xed\x01\x95\xff\xf3\xb1"
- "\x2d\xed\x68\x83\x65\x7b\x83\x2f\x7c\x42\xb7\x09\x3f\x07\xef\x6f"
- "\x6f\x10\x15\xdb\x0f\xa8\xb3\xe2\x9f\xaf\x31\xf4\xaa\xe2\xd1\xcf"
- "\x97\x2b\xba\x6d\xcb\x51\x74\xfb\x7c\xa7\x3e\x5e\x5d\xcd\xf7\x18"
- "\xbb\xb3\xd5\x1e\xfc\xe7\x2e\xc3\x46\xf6\xeb\x79\xb8\x0c\xee\xf5"
- "\x58\x38\x9f\x57\xa3\xed\xd9\xfa\x7b\xf9\xad\x30\xb4\x0f\x63\xd6"
- "\x67\x87\xb9\x5d\x7d\xe9\x56\x49\x8b\x52\x4a\x05\xce\xfc\x0d\x61"
- "\xf6\x31\x0e\xf9\x42\x77\x7b\xd5\xf7\x00\xf7\xdd\x2e\xcf\xcc\xa2"
- "\x1e\xf4\x8f\x89\xf5\x26\x9f\xf1\x65\x78\xbd\xf8\xef\xbd\xc2\xc0"
- "\x85\xeb\xe3\x77\x68\x6b\x03\xf7\x27\x68\xc5\x31\x46\x88\xfb\xf5"
- "\x58\x31\xaf\x5d\x9c\x01\xcd\xd8\x0f\x68\xdf\x78\xa6\x89\xa2\xd9"
- "\x3e\x87\xa4\x47\x4f\x3f\xec\xbb\x2c\x9e\x1e\xea\x59\xb3\x40\x37"
- "\xcc\x63\x7f\x90\x7d\xe3\x75\xfa\xb5\xeb\xf5\x7f\xab\xcf\xd5\xf1"
- "\x6e\xef\xbb\x31\x65\xaf\xea\xc9\xab\xbe\x3d\x69\xe2\xbd\x55\x5e"
- "\x6b\x57\xfc\xba\xf7\x70\x4c\xb9\xc3\x05\xdf\xb2\x8d\xbc\xa5\x81"
- "\xbf\x15\xc8\x34\xef\xf4\xec\x0d\xf4\xd2\x5b\xc1\x49\x52\xc7\x8f"
- "\x8c\x3a\xfc\xb4\x77\x87\x81\x27\xee\xf5\x31\x78\xdf\x88\xde\x3e"
- "\xd9\x3b\xc9\x28\xc7\xfe\xfb\xe8\x23\x19\x57\x27\xa9\x1e\xe4\x3d"
- "\x9d\xa1\xd0\xc1\x91\xbb\xbd\x92\x1f\x69\x5f\x3d\xfb\xba\x82\xae"
- "\xfa\xb7\xe1\xf6\x55\xa8\xb1\x70\x9f\x8c\xdd\xc2\xfb\x25\x1c\x8b"
- "\x18\xf5\xd5\x00\x6e\x83\x8e\xf3\x2e\x1d\x07\xcc\xff\x3e\xdb\x91"
- "\x38\xaf\xbb\x77\x66\xa1\x3c\x18\x3b\x72\x41\x71\x62\x9c\x4a\x4b"
- "\xef\x19\xc8\x7d\xed\x31\x67\x48\xd7\x2b\x7a\xef\xcf\xc1\x3c\x75"
- "\xcf\xda\xff\x8f\xbd\xef\x81\x8b\xb2\xca\xfe\xbe\x33\x0c\x3a\xe8"
- "\x00\xa3\x91\x8d\x46\x3a\x95\xee\xa2\xa1\xb1\xbf\x9f\xf5\xb2\xad"
- "\x6d\x54\xda\xaa\xab\x40\xad\xee\xb2\x9b\x25\x26\x14\x16\xea\x84"
- "\x48\x64\x38\x33\x0c\x86\xc0\x02\xd2\xae\xdb\x4b\x8a\x7f\xea\xb5"
- "\xfd\xb1\xfb\xea\xe6\xaa\xbd\x8b\xfb\xa3\x76\x5c\xb5\xa5\x02\x06"
- "\x4b\x0b\x0d\x6b\x44\x34\x32\xb4\x11\x51\x46\x98\x79\xee\x7b\xce"
- "\xbd\xcf\xc3\xcc\x00\x03\xc3\x88\x7f\xda\x9f\x7c\x3e\xcf\x67\x78"
- "\xee\x73\x9f\xfb\xdc\x7b\xce\xf7\x9e\x73\xee\xbf\x73\xf8\xb8\xb5"
- "\xa2\x18\x78\x66\xb8\x48\xc6\x60\x8c\x0d\xbd\x8e\x9e\xa9\xd5\xc1"
- "\x58\x5a\xb9\xeb\x00\xc8\x8b\x2a\xfd\x45\x32\x0c\xf7\x52\xa0\xbc"
- "\xc1\xbd\x9a\x34\x08\xd2\xf3\x77\x55\xb9\xce\xa9\x99\x9b\x60\x6c"
- "\x5b\x5e\x04\x63\x59\xc3\x59\x32\x86\xef\x8d\x78\x7f\x25\xce\xe9"
- "\x50\x43\xc2\x06\x21\x6f\x57\x35\x9e\x81\xac\x85\x11\x21\x35\xa4"
- "\x6c\x10\xf2\x77\x55\x43\xb9\x0d\x86\xa5\x64\x24\xea\x37\x9c\x1b"
- "\xe2\x98\x31\x63\xb9\x0d\xe8\x9f\x4c\xa0\x09\x32\xaa\xdc\xad\x15"
- "\x94\x15\x29\x45\x02\x61\x7b\xbf\x01\x67\xf2\x46\xf2\xfe\x41\x1a"
- "\xb4\x5b\x8b\xb1\xff\x70\x9e\xc7\x62\x87\x7a\xe6\xef\xd6\xc2\xb3"
- "\x10\x78\x76\x1e\x7e\x05\xf4\x55\x86\xfe\xb1\xa1\x7c\x0d\x96\x4f"
- "\xf3\x76\x6b\x79\xdd\x6d\x2c\x6f\x23\xf9\xc7\x04\xcc\x23\xf9\x40"
- "\x13\x0c\x09\x01\xf8\x1c\xcf\xd4\x3a\xe1\x3d\x0b\xf4\x50\xfe\x4e"
- "\x7d\xd7\x3b\xa2\xfd\x0c\x7d\xd9\xfc\x1e\x2d\xf8\x6f\x3b\xe4\xad"
- "\xc0\xbd\xa6\xdc\x96\x35\x57\x88\x7d\x1d\xec\x63\xf3\x5e\xf1\x7f"
- "\x55\x57\x5e\x43\x02\xd1\x5f\x26\x1a\xb6\x5e\xfa\x52\x00\xc8\x5e"
- "\xb3\x1a\xe8\x40\xdc\xca\x3c\x85\xe5\x15\xa2\x6f\xb5\x64\xa2\x02"
- "\xb9\x3c\x1c\xea\x8d\x31\x26\x4e\xe0\x1c\xac\x48\x9b\x26\xe0\xd3"
- "\xce\x75\xdc\x7f\xde\x9e\x22\xc0\xbe\x7e\x35\xd8\x03\xab\x89\x6a"
- "\xb5\x93\x84\x63\x3b\x81\x6f\xcd\xb8\x5f\x1a\xc7\x6e\x48\x1b\xce"
- "\xc3\xdd\xd3\xa0\x2d\xd3\x57\xa7\xd0\xa6\xd5\x2d\xb4\xb9\x26\xa5"
- "\x9e\x80\x9e\x19\x59\xab\xab\x43\x5f\xcf\x27\xb0\xad\x38\xf7\x08"
- "\x34\x9d\x66\xc5\x6f\xe4\xef\x9e\x8e\x67\x60\xd8\x3c\x81\xfc\xbd"
- "\x4a\xe9\xbc\xd0\x66\x76\xa6\xc8\x3c\xb5\x6b\xbe\x2b\x83\x1e\x10"
- "\xeb\x52\x25\xe0\xff\x19\xec\x2c\xdf\x30\x1c\xff\xe0\x9c\xc6\xc2"
- "\x97\xb7\x76\x9d\xbd\xe0\x73\x03\x66\x9d\x9b\x0f\x2b\xf6\x2e\xce"
- "\x11\xe0\xbb\x71\x0e\x7a\x71\x9d\x98\x17\xdf\x8d\x7b\x79\x21\xc5"
- "\x77\xe1\x9d\x6d\x5d\xef\x78\x9c\xdd\xf9\x07\xb7\x2b\x80\xb6\xf8"
- "\xbf\x0d\x68\x29\xee\x8d\xd2\xf2\x75\x6d\x73\x83\xb4\x96\x6c\x25"
- "\xef\xaf\x47\x3c\xf5\xee\x9f\x79\x9f\xc2\xd3\x9f\xd0\xbe\xc3\xe8"
- "\xeb\x08\xd2\xc3\x25\xbf\x3f\xf0\x7f\x04\x94\xc5\xcf\x36\xb9\xf9"
- "\xf3\x2a\x76\xf3\x0d\x68\xb0\xd1\x93\x88\x13\x90\x2b\x01\x67\xc8"
- "\x3e\xf4\xcd\x90\xc2\xcf\x3f\xed\x3b\x88\xf5\x6c\x24\xfb\xd6\xc3"
- "\x7d\x28\xf7\x3b\xb0\xef\x55\x51\x7e\x24\xc4\x39\x1d\xa1\x56\xf8"
- "\x26\x9e\xe5\x71\xbb\xcf\x02\x79\xa2\x86\x7c\xef\x72\xdf\x79\x6c"
- "\x45\x51\xd6\xed\xb9\xb1\xdb\x7d\x4c\xb7\x7b\x6d\x1b\xf4\x1b\x6f"
- "\x6b\xe6\x45\x63\xd8\x7c\x61\x56\x48\x36\xd1\x19\xbe\x21\x01\x80"
- "\x95\x53\x58\xb7\xda\xe6\x16\x6c\x53\x28\x35\x45\x11\x4b\xb3\x83"
- "\xdb\x96\xa0\xd3\x1b\xc7\x43\x9e\x6f\xc8\x28\xdc\xcf\x8d\x71\x26"
- "\x20\xff\x19\xee\x17\x7a\xff\x53\x0b\x56\x0e\x23\xc2\x73\x09\xc3"
- "\xa9\x3c\x3e\x01\xd7\xec\x76\x74\x58\x03\x71\xfd\x4a\xff\x06\x60"
- "\xd2\x49\x46\x01\xc6\x9a\x30\xa6\x17\xc6\x5c\xff\x3f\x1d\xcd\x81"
- "\x16\xc7\x31\xa2\x7b\x9e\xc8\xcf\x90\xfd\xf1\x8a\x2c\xa2\x58\x77"
- "\x9a\xa8\x81\xaf\x8e\xfd\x8e\x68\x22\xf9\x0d\x28\x1b\xc9\xcf\x3c"
- "\x97\x81\x7c\x5d\xa1\xa1\xf6\x76\xd3\x3f\xb7\x5b\xc9\x9b\x66\x69"
- "\x8c\x5d\xc8\x63\x49\x28\xe0\xfb\xa3\xe5\xa2\x8f\x04\x4e\xdb\x7f"
- "\x7e\xc3\xcf\x4f\x85\xdd\x0f\xef\x58\x5d\xf6\xf7\x7e\x71\x1f\x61"
- "\x45\x21\x97\x7d\xfb\x53\xf7\xc3\x68\x69\x0d\xdf\x7b\x10\xd6\x6e"
- "\xda\xaf\xea\xda\x7b\xc0\xe6\xad\xf6\xa7\x02\x0f\x0b\xb9\x6d\x5e"
- "\x51\xb8\xd0\xa9\x14\xfb\x20\xa6\xbf\x59\x81\xef\xc2\x7b\xa1\x6d"
- "\x6c\x8e\x69\xff\x4c\x17\xd6\xf6\xe3\xba\x8d\x0c\xda\x04\xe5\xfd"
- "\x73\x0d\xb6\x0b\x69\x02\xf9\x00\x67\xff\xcc\xdb\xbf\xcd\x8b\x0f"
- "\x55\xe5\x5b\x29\x0e\x36\x07\x72\xb2\x0a\xf0\x74\x16\x78\x70\x0b"
- "\xfa\x49\xb2\xc0\x77\x6a\x36\x77\x90\x1a\xcd\x05\x52\x0b\xff\xe3"
- "\x1e\x63\xf3\xf3\x27\x49\x93\xb6\x77\x7d\x03\x3a\x0b\x64\xdd\x9b"
- "\x76\x2c\x0b\x65\x01\xee\xcb\xb2\x80\x06\xab\xb5\x41\x59\x4d\x84"
- "\x95\x51\x23\x34\x93\x9a\x4c\x1c\x67\x39\xeb\x6a\x37\x1f\x23\xb5"
- "\x9a\x4f\xd9\x77\xd0\x26\x34\xa7\x5d\xe8\xa3\xec\xb7\xc0\xae\x7f"
- "\x4b\x23\x96\xdd\x02\x65\x87\x79\x2f\xfb\xa4\x76\x60\x65\x0f\xa4"
- "\xde\x27\xd5\x03\x29\x1b\xf4\x4c\xaa\x45\xc3\xcf\x6b\xe9\x47\x93"
- "\x60\xe7\x25\xf4\x91\x39\x8e\xf2\x7d\xae\x07\x1f\x66\x67\xba\x4c"
- "\x6c\x1f\x71\x0a\x3b\xdb\x75\x8e\xb0\xbd\x8a\xfc\x3c\xd7\x29\x82"
- "\xfb\x1c\xda\x4d\x07\x23\x5d\x63\xa5\xae\xf5\x27\xb0\x55\x0f\xc6"
- "\xf3\xfd\x8c\xbb\x52\x38\xae\x0e\x06\x62\x59\xbd\xd7\x63\xf7\x7a"
- "\xbe\x2f\xf6\x60\xbe\x34\xff\x72\x21\x68\xf7\x7a\xb1\x2c\x6d\xf7"
- "\x79\x3d\x29\xa8\x67\x72\x66\xba\x14\x1f\x34\x5d\x3c\x56\xfa\x44"
- "\xf2\xe2\xe4\x25\x19\xc9\x49\xda\x79\x2b\xd3\x96\x4d\x5e\xfe\xec"
- "\xb3\xda\xb9\xc9\x2b\x56\x2c\x7a\x2e\x79\x18\x99\x97\xb6\x68\xd9"
- "\x8a\x25\x38\xf7\xa6\xd5\x4e\xff\xcf\x85\x29\xcb\xd3\x27\xff\x74"
- "\x7a\x54\xb7\xb9\x37\x3c\x83\xd8\x80\x36\x38\xe8\x8e\x51\x7a\x27"
- "\x19\x81\x3e\x6f\x42\x5f\xa6\xe6\x57\x60\xfc\x07\xf8\x3b\x83\x7a"
- "\x0a\x75\x03\x8e\x0d\xd0\xdf\x1e\xc8\xef\xea\x8d\xaf\xd3\xba\xd3"
- "\xa4\x1e\xed\xca\xfa\x2d\xdc\x77\x5c\x03\x8c\xc9\x6d\x3c\x66\xdd"
- "\xe7\xc7\xd1\x2f\xdc\x6f\x21\xcd\x16\x54\x51\xb8\xee\x4b\xa2\x00"
- "\xbd\x06\xe3\x92\x0f\xca\xa8\x7c\x28\x2d\x1c\x45\x0f\xd0\x93\x1a"
- "\x22\xfa\xc3\x96\x5b\xac\x76\x5c\xa7\x57\xc6\x39\x0c\x14\xe5\x29"
- "\xef\x5b\x1f\x6c\xe2\x74\xf9\xa3\x92\xef\x17\xfe\xfc\x3d\x1c\xc3"
- "\xe4\xb0\x98\x82\x1f\x40\xff\xdf\x9b\xee\x92\xd3\x96\x2a\xd1\x76"
- "\xc4\x75\x8a\x97\x1a\xe1\x9e\xfb\xe4\xf8\xa0\xde\x73\x0f\x46\x15"
- "\xe8\xe5\x4f\x5b\xf8\x85\xef\x1c\x56\xf1\x0b\xff\x77\xbf\x3e\xdf"
- "\xca\xaf\xee\xe9\x57\x7a\x49\xdf\xf7\xf7\xfd\x3a\x63\xdf\x97\x2f"
- "\xdf\xc7\xdf\xeb\xd9\xfe\x2b\x79\xbf\x2e\xaf\xaf\x0b\xf1\x06\xd8"
- "\x6a\xf8\xed\x97\x44\x09\xf8\x5c\x5f\xf4\x0c\x60\xfa\x38\xd1\x64"
- "\x39\x68\x93\xe1\x29\x12\xae\xff\x86\x60\x4c\xb7\xe6\xf4\x4c\xda"
- "\xa4\xbf\x84\x36\x69\x1d\xc6\x38\xa9\x28\x6e\x24\xaa\xa2\x46\xa2"
- "\xae\x4d\xc7\x78\xaf\xe8\x17\x0b\xbe\x86\x14\x82\xfb\xea\x0c\x3b"
- "\xf9\xd8\x76\x1e\xf7\x2d\x99\x6b\x13\x41\xee\x34\x10\x82\xf8\x55"
- "\x25\x92\xb0\xb2\x51\xb4\x92\x9a\x52\x2b\xa9\x3c\x75\x3b\xa4\x1d"
- "\x7e\x47\x88\x09\x7c\x67\x55\x55\xa0\xf6\x19\xd4\xf1\x1f\x3e\x25"
- "\x62\xf3\x43\x7e\x56\xc8\xc2\x62\x90\x41\x3f\x39\xcc\xe7\xd5\xeb"
- "\x66\x70\x7d\x5e\x77\xab\x38\xdf\x04\xff\x5b\x98\xad\x08\xed\xa8"
- "\xc0\x18\x98\x58\xe6\x5f\x84\x0a\x16\x03\xf3\x9d\x55\x31\x81\x59"
- "\x8b\x88\xbc\xd6\x0a\x9a\x12\xe4\x20\x6a\x30\xe8\x77\xdb\xa1\x9f"
- "\xed\xdc\x34\x8a\x96\x40\xfd\x0a\x37\x8f\xa2\x79\x50\xa7\xf2\x76"
- "\xd3\x87\xd5\xa0\x7b\xcc\xe2\xba\x8b\x19\xfa\xc5\xf6\x22\xc8\x13"
- "\xb7\x92\x8c\x2b\x82\x7c\xc5\x90\x0f\xed\x64\x5e\xbf\x9a\xd7\x80"
- "\x06\x7b\xe0\x9b\x75\xda\xa7\xf1\xfe\x63\xe6\x03\x08\xbf\x0d\xed"
- "\x00\xdb\xf8\xe3\x70\xd0\x6d\x0a\xfc\x86\xf4\xdd\x76\xd3\x47\x20"
- "\xff\x0e\x64\x8a\xeb\xbe\x25\xbc\x9c\x8f\x12\x78\x7f\xdd\xd5\xb2"
- "\xae\x2b\x46\xe9\xae\x96\xa2\x55\xa0\xd3\x3b\x98\xbf\xc8\xf5\x38"
- "\xdf\x82\x36\x06\xb3\x2b\x9c\x24\x94\xcf\x0f\x80\x6d\x91\x02\x72"
- "\x00\xec\x09\xb6\xc7\x19\x6c\x09\xa8\xcb\x7a\x8c\x95\x87\xcf\x61"
- "\xdc\xb6\x07\xf4\xf2\x4e\xb4\x03\x9e\xbe\x38\x9b\xe0\x1c\x3b\xc6"
- "\xb9\x5c\xb1\x80\xda\x79\x0c\x92\x8f\x2a\x24\x5b\x00\x65\x10\xea"
- "\x7f\xb0\x85\x15\x9d\xc0\x43\xc0\x40\x15\xd8\x16\x23\xce\x90\x8f"
- "\xda\x44\xda\x57\x31\x9d\x9f\xc1\xfc\x1b\x07\x70\x19\xfd\x31\xee"
- "\x85\x57\xc1\x37\xaa\xac\xa4\x9e\xcd\x85\x73\x19\xf3\xb1\x5a\xd2"
- "\xe3\x38\xe6\xb5\x42\x19\x14\x64\x99\xf8\x0c\xda\xbf\xaf\x49\xfa"
- "\x26\x3c\x33\x8b\x34\xab\x06\x9a\x61\x99\x6c\xec\x0f\x36\x57\xa1"
- "\x48\x9b\x6a\xb4\x2b\xc4\x77\x53\xa4\x72\x71\x5c\x2e\x80\x5d\x81"
- "\xf4\x42\x3a\x41\x39\xd5\xa2\x1c\x3b\xcc\xed\x97\x9a\x97\x09\x5f"
- "\x6f\x2f\x01\x5e\xaf\x71\xd1\xff\xe3\xed\xee\xf4\x87\xf7\xd7\x88"
- "\xbc\x9c\xe0\xc6\x3b\x18\x1b\x55\x3b\x70\x9e\x14\xea\x58\xc9\xe7"
- "\x78\x3e\x3e\x85\x7e\xc5\xd0\x8f\x31\xd0\xb8\xb2\x10\x7d\xe6\x82"
- "\x6c\xce\xf9\x12\x64\xee\x33\x68\x3f\x55\x8b\x7e\xb1\xaa\xd7\x20"
- "\x86\xe1\x9e\xcd\xc3\x37\x41\xbd\xb0\x3c\xb8\x9f\x0f\xbf\x60\xc7"
- "\x56\xcf\x75\x8f\x49\xeb\x8a\x47\x5b\x3d\xdd\x75\xce\xe0\x63\x1d"
- "\x1f\x3f\x7f\xac\xc3\x39\x30\x96\xbf\x33\x05\xeb\xd6\x80\xfd\x52"
- "\x6a\x2b\xc6\xa6\x85\x74\xb4\xfd\x1b\x90\x6f\x52\x3a\xfa\xdb\x05"
- "\x3e\xa9\xe0\x5b\xc7\xc5\x3a\xe1\xbd\x12\xee\x59\xcc\x01\x8c\x53"
- "\xbb\x0e\xdf\xd1\xbb\xde\xc1\x7e\x03\x18\x0e\x85\x3c\x47\xe0\x97"
- "\x4a\x79\x79\xfc\xda\xea\x05\xbf\xef\xc0\x39\xb0\xea\x74\x29\x7e"
- "\x2d\xc6\xae\x45\x99\x51\xf4\xb4\x07\xed\x91\x36\xdb\x81\x57\x0c"
- "\x77\xfb\x1d\x15\x40\xef\x1a\xb0\xff\xff\x9f\xe8\xe3\xae\x7a\x81"
- "\x58\x3f\x33\x8f\xc7\x70\x70\xfd\xe6\xdf\x49\x3e\x16\x6a\x5c\xeb"
- "\xff\x5d\xb6\x65\xf5\x02\xc4\x24\x94\x55\x8d\xfc\x47\x3b\x11\xf2"
- "\xa5\x76\x61\x8b\x9d\xe3\xad\x6e\x41\xfb\x52\xac\x3f\xe2\xa5\x46"
- "\xa4\xdd\x7a\xf7\x7e\xe7\xde\xcf\xa1\x0c\x18\xff\xef\xef\xc2\x80"
- "\xd4\xaf\x39\x0e\x6a\x4f\x89\x36\x45\x15\xfa\xbb\x85\x72\xcd\x68"
- "\x83\x73\xbd\x5a\x5b\xb1\xbf\xc1\x81\x73\xe8\x87\xe1\x1e\xfa\x77"
- "\xed\xfa\x0b\xc3\x2a\xd1\xf6\x05\xb9\x51\x0b\x74\x98\xc2\x7c\x40"
- "\x20\x5d\xa4\xfe\xba\xee\x69\x1c\xfb\x45\xf1\x3e\x9b\xd9\x44\x6a"
- "\xed\x2d\x44\xdc\xc3\x0f\x7d\xf6\x14\xae\x9d\x9e\x01\x0c\x29\xb1"
- "\xff\x02\x7f\xb7\xa3\x6f\x66\xa0\x63\xdd\x9a\xd7\x59\xbf\x55\x61"
- "\xbf\xed\x44\xdf\x10\xf0\x9d\x03\x89\x31\x50\x6b\x33\xeb\xc7\xe8"
- "\xf3\x63\x23\xd0\x0e\x63\xc5\xc2\xb7\x8d\xd2\xde\x63\xc4\x08\xfa"
- "\xf8\x10\x71\x52\x85\x7d\x59\xa4\x9d\x02\xf2\x95\x4b\x7d\xcf\x8d"
- "\xff\x2c\x4f\xb7\xfe\x16\xca\xfb\x5b\x6d\xbd\x44\x6b\x07\xeb\xc7"
- "\xd5\xe9\x0e\xe8\xc7\xee\x34\x45\x7a\x22\x5d\xdb\x4d\x16\x28\xeb"
- "\x40\xb8\x44\x53\x17\x3d\x2d\x2b\x45\x9e\xd7\xf1\x39\x26\x4b\xb4"
- "\x38\xff\xd4\x45\x43\x11\x7f\x18\xe3\x13\xe7\x9a\xea\x80\x9e\x95"
- "\xf8\x7d\xc4\xc8\x46\x51\x66\x1d\xb0\x21\x46\x2c\xd0\xff\x1f\x6f"
- "\x76\xc9\x8e\xea\x4c\x36\x66\x01\x3e\x71\xfe\x58\xde\x64\x7e\x34"
- "\x7a\x91\x1d\x56\x52\x93\xe8\x92\x4f\x96\x9d\x12\x1d\x24\x4c\x4a"
- "\xfd\x1e\xca\x70\x7a\xca\x1f\xcb\x09\x28\x63\x24\xca\x37\x97\x0d"
- "\x65\xb1\x79\xca\x37\x4b\x3d\xca\x37\xc4\xb5\x2e\x03\xe7\xd8\xb8"
- "\xbe\xb2\x92\x0f\x8d\x9e\x32\xe9\xc3\x95\x7c\x6f\x00\xb7\xb9\x10"
- "\x5b\xba\xa7\x79\x7e\xd4\x61\x90\x9f\x8d\xc5\x45\x9d\x87\xf3\x84"
- "\x98\x96\x2a\xd2\xab\x01\xf2\x1f\xc0\xf3\x90\xe8\x03\x61\x78\x03"
- "\x1f\xeb\x81\x9c\xae\x44\x5f\xd7\x90\x2f\xb2\x16\xec\xfc\xce\x5c"
- "\x2e\xbb\x25\x59\x41\x17\x27\x0c\x7f\xa9\x99\x04\xe9\x7e\x4a\x4f"
- "\x9e\x26\x87\xd0\x1f\xb7\x1d\xfd\x2d\x42\xd9\xda\xd3\xe4\xd3\x23"
- "\xf0\xdd\x30\xf1\x57\x03\xbf\xef\xc1\xef\x68\xf8\x7d\x1b\x7e\x6f"
- "\x87\xdf\x22\xc8\x2f\x88\xf9\xa3\xe0\x7e\x25\xa4\xff\xa7\xf8\x0b"
- "\x75\x3c\x84\xfb\xef\xe3\x45\xdb\x11\xd3\x67\xe1\x3d\xfc\xfe\x58"
- "\xe4\x79\x35\xe7\xf9\xa1\x1f\x41\x39\x99\x50\xff\x7a\x4b\x03\x2b"
- "\x4b\x77\x9a\x7c\x72\x19\xcb\xc6\xf3\xc9\xf0\xff\x0e\x37\x1b\x14"
- "\xca\x39\x74\x14\x7e\xa7\xc2\xef\x26\xf8\x4d\x87\xdf\x17\x45\x1a"
- "\xd4\xa1\x6c\x48\xca\x64\x34\x67\x32\x82\x7f\x8f\xf7\x79\xd4\xc3"
- "\x2e\xd9\xf1\x51\x75\xd2\x02\xce\x6f\x2b\xa9\x65\x38\x80\xbc\x0f"
- "\x63\x5e\xf8\x7d\x54\xfc\x8d\x11\x7f\x67\x88\xbf\x3f\x13\x7f\xa7"
- "\x8b\xbf\x30\x1e\x3d\x94\x2e\xda\x18\x40\x97\x43\xe9\x6c\xdf\x53"
- "\xde\xae\x6d\xfc\x1b\x9f\xac\xc7\x31\x32\xc8\xf1\xfb\xa0\xfc\x80"
- "\x76\xd3\x27\x4a\x69\x7e\x14\xe7\x7c\x3a\x4d\x07\xdf\xd9\xc8\xd6"
- "\xb5\x3f\xd1\xba\xc9\xb6\x05\x2a\x59\x0c\x01\x1b\xe8\xd6\x32\x39"
- "\x15\xe7\x0f\x3f\xc9\x94\x8b\xeb\xc2\xa2\x1f\xfd\x00\xf4\x2d\xc7"
- "\xc6\x43\x41\x9d\x38\xaf\xdc\xc0\xe6\x8e\xd1\x0f\x5a\x50\x45\x22"
- "\x5c\xa9\x30\x36\xd0\x49\xf2\x1b\xc7\x3d\xa2\xcf\xca\x03\xf0\xad"
- "\x42\xd7\x58\xfd\x93\x69\x7c\x0d\xed\xb6\x18\x48\xdf\xe6\x4a\x3f"
- "\x84\xe7\x1d\xef\x03\x7a\xd6\x43\x7b\xa6\x36\x92\x4f\xd0\x1f\xfe"
- "\x7f\x34\xf1\x36\x47\x49\x6d\x16\xf9\xa1\x93\xe8\xdb\x44\x0e\x65"
- "\x81\x2c\x4c\x43\x0c\x37\x76\xc9\xd9\x43\x6c\x5e\x57\xc4\x08\xf0"
- "\xf2\xd0\x7d\xc8\x53\xb7\x3e\xe8\x2e\x83\xc2\xda\x4d\x9f\x46\x7a"
- "\xca\x94\x8f\x23\x51\xa6\x20\x36\x40\x7e\x23\xaf\x55\xdd\xfa\x5f"
- "\x3d\xf6\x3f\xde\xef\x3e\x4d\xf1\x7c\xd7\x52\xef\xe0\xfd\xae\x1e"
- "\x70\x06\xf8\xac\x6b\x41\xfe\x58\xc9\xa7\x33\xc5\x3e\x5d\x0f\x7d"
- "\xfa\x3e\x48\x3f\xcc\xeb\xca\xd3\xc5\x6f\x01\xce\xea\xb0\xdd\xb7"
- "\x4b\xe9\x62\x7b\xb1\x1c\xf4\xa7\x3e\x5a\x4a\x17\xcb\x07\x3c\xd6"
- "\x55\x62\x3f\x91\xd2\xc5\x36\x81\x1d\x75\x98\x48\xf2\xa4\x90\xe3"
- "\x2d\x4f\x7a\x0f\xf9\x86\xfe\xa6\xf8\x1c\xff\xa7\xb8\x86\xba\x15"
- "\xf5\x43\xce\xd3\x44\xf5\x52\x29\x09\xe6\xfd\xf2\xd3\x16\x4f\x19"
- "\xf9\x59\x0d\x35\x85\x3a\xa8\xb2\x22\xa1\xc6\x31\x55\xb2\x57\xcb"
- "\xe0\x3b\x29\x52\xac\x64\x97\x4f\xfe\xc3\x9b\x6a\xb6\x76\xd1\x17"
- "\xeb\x52\x28\xd5\xc5\x4d\x3f\x33\x1e\x60\xdd\xb0\xac\x1c\xb0\xd7"
- "\xdb\x40\x2e\x70\xb9\x7d\xb8\x52\x8a\x21\x5f\x2c\xea\x2d\x8c\x5b"
- "\x5e\x9c\xc1\xe3\x98\xa3\x6e\xc4\x3d\x3e\x02\xce\x63\x65\x3a\x49"
- "\xad\x0e\xc6\xf2\x99\xa7\xc8\xc2\x97\x87\xa1\x4f\x95\x04\xa8\xeb"
- "\x5f\xa1\x6e\xdb\x9c\x38\xf7\xbf\x0c\xc7\xa9\x9f\x25\x3b\x33\xa8"
- "\x5d\xa4\x19\xf4\xa3\xcf\x66\x89\xb4\x45\xf9\xc5\x7c\xf2\xe5\xe8"
- "\x79\x7c\x1d\x9c\xcb\xc1\xfe\xf1\x7b\xd4\x63\x1a\x6a\x3f\x50\x86"
- "\x7d\xe5\xc8\x1c\xc9\x26\x85\xfa\x6e\xe5\x36\x61\xed\x9f\x98\xcf"
- "\xa1\xbc\x8a\x04\x3e\x17\x78\xe4\x28\x6f\xfb\x11\x33\x5f\xe7\x66"
- "\xfe\x24\xf1\x7e\x7b\x80\x66\xd4\x1f\xf9\xbe\xac\x83\x1f\xf1\x3d"
- "\x25\x47\xba\xe2\x7f\xb8\xd9\x8a\x07\xb8\x3f\xa8\x23\x15\xae\x3e"
- "\x71\x24\x0f\xdf\x83\xf7\xf7\x42\x7a\x9d\x2b\xbd\xb6\x5c\x9c\xef"
- "\x5a\x10\x92\x1d\x83\x7b\xcb\x6e\x45\xbf\xd4\xfc\x7b\x9f\x45\xb1"
- "\xef\xb3\x39\x0f\xe8\x9b\x62\xff\x45\x3a\xa3\xce\x66\x7d\x18\xfa"
- "\x2f\xf6\xe3\xce\xfc\x8a\x44\xb8\x78\xbf\xe5\xba\xf9\x00\xeb\xb7"
- "\xac\xcf\x7e\x16\xe3\x56\x0f\x3b\x9b\xf7\x42\x7e\xbe\xa2\x51\xc1"
- "\xb3\x05\xa0\x57\x0f\x8b\xcf\xd8\xde\x3b\xf4\x1b\xe2\xb8\x44\x6d"
- "\xb8\xb6\x8d\x6b\x9d\x78\xf6\x2a\x14\xd0\x8d\xbe\x3e\xa4\xb5\xea"
- "\xb9\x2d\x06\xea\xc4\x75\xa7\x4b\xb4\xad\xa4\xcb\x2f\xfe\x67\xe5"
- "\x2e\xbf\x3d\x47\x94\x62\xbb\xf0\xbc\x4e\x19\xdf\x0b\x76\xf8\x32"
- "\xb7\xa9\x0e\xdb\x11\xa7\x16\xc0\x1e\xfc\x96\xf2\xd8\xb6\x9f\x35"
- "\x49\xd8\x83\x7e\x99\x74\x9a\x7c\xbe\x72\xfd\x28\x5a\x0a\x3c\x2d"
- "\x85\xbe\x94\x0a\xf7\x8b\xe0\x37\x89\xff\xca\xd4\xf8\x2b\xf6\x91"
- "\xd2\x76\xd3\xe7\x5a\x29\xa6\x37\xd2\xa6\x2d\xe8\x64\x0c\xe2\xac"
- "\x18\xe8\x80\x58\x63\xeb\xc8\x50\x6f\xc4\x17\xe2\x0c\x31\x16\x9a"
- "\x3d\x9b\xe1\x8c\xf9\x15\x80\x74\xac\x2f\xe2\x0c\xca\x4a\x95\x7c"
- "\xe2\x5a\xc9\xe7\x6a\xbe\x9e\xf3\xb9\x51\xda\x4b\x8b\x6b\x49\xe9"
- "\x77\x92\x5b\xa1\x5c\xed\x01\x2d\xf3\x3b\xf9\x95\xc5\x31\x83\x60"
- "\x5e\x5c\x87\xe3\x72\xf2\xb6\xdf\xc3\x3b\x7b\x5c\x34\xff\x38\x92"
- "\xad\x19\x2d\x60\x73\x91\xb7\xc0\xb3\x3a\xf7\x71\x86\x95\x7c\x50"
- "\x86\x63\x0d\xdc\xdb\x77\x77\x18\xd1\x02\x6e\x41\x8e\x7d\xde\x26"
- "\xd9\xb5\xf7\x86\xe1\x7a\xfe\x07\x33\xa1\x7e\x0d\x3c\x4e\xf9\x07"
- "\x53\x61\x2c\xd9\xeb\x7a\x3c\x60\x6c\x2a\xce\xf5\x88\xb1\x6c\x1a"
- "\x70\x1e\x0b\x7d\xff\x9f\x26\x5f\xac\xac\x41\x1f\x1f\xcb\x7b\xfa"
- "\x44\xd6\x67\xd2\x8b\xe8\x17\x59\x9b\x46\x6e\x69\x24\x5f\x24\xe0"
- "\xbc\x91\xe1\x3c\xce\xd1\xd4\x67\x79\xce\xd1\xd4\x57\x8b\x97\x95"
- "\x90\xa3\xd3\xdd\xae\xc3\xe2\x6f\x7c\x3f\x57\x8b\x98\xd7\x4e\xc8"
- "\x31\x85\x48\xab\x4f\xdb\x4d\xf5\x5d\xf3\xbf\x88\x4b\xec\xdb\xb8"
- "\x8f\x03\xe7\x9c\x64\x0e\x82\x3e\x45\x80\x4f\x50\xef\x9c\x49\x4f"
- "\x98\x57\x21\x8e\x8e\xb2\x58\xdf\xe8\xaf\x77\x60\x7b\x89\x8e\x32"
- "\x7e\x72\xdf\x99\xf5\x87\xe1\xdb\x27\xd7\x9d\x23\x0a\x5d\x1a\xb9"
- "\x03\xe7\xbf\x43\x9d\xd4\x8c\x63\x5c\xc4\xc4\x16\x16\x43\xe6\xe8"
- "\x91\xf4\xd5\x44\x0e\xcf\xc7\xc1\xff\x07\x24\x3b\x09\xde\x51\x07"
- "\xd8\x49\x18\xda\x47\x8f\xae\x26\xe3\xda\x4d\x47\xb7\x4a\xbc\x42"
- "\x1b\x02\xe7\xe1\xc4\xb9\x04\xa8\x6b\xfd\x09\x7c\x0f\x7d\xba\x5b"
- "\x19\xdd\x98\x1c\xc6\x32\x54\x50\x9f\xc2\x80\x36\xa2\xe6\xba\xe7"
- "\x28\xe0\xff\xa0\x68\x33\x1e\x2d\x07\xec\x1f\x76\xd5\x53\x73\xab"
- "\xdb\xff\xf3\xf1\xfd\xd0\x36\xb4\xcf\xbc\xd1\xe7\xd8\x8f\x24\xfa"
- "\xe0\x7e\xd5\x50\x18\x27\x30\x7e\x3b\x68\x0b\xd4\xad\x5a\xb7\x8a"
- "\x28\xcf\x90\x2f\xee\xdc\xf2\x3a\x3b\x3f\x57\xc5\xe7\xe7\xbf\xb8"
- "\x55\x1a\x87\xf3\x7a\x1f\x3b\x11\x9a\x1d\x40\x70\x5e\x1d\xfd\x98"
- "\xb1\xbd\x7e\xdf\x69\xd8\x5c\xba\xc5\x31\x8d\x98\xf5\x0f\x60\x1e"
- "\xc9\xae\x6a\xb8\x60\xd0\x90\xfd\x9a\x69\xd0\x8f\x8f\x6d\x87\xbe"
- "\xa2\x1b\xf8\x9e\xca\x63\xdb\x45\xfa\x56\xf3\xbd\x08\xc7\x56\xa3"
- "\x2e\xc1\xb1\x3f\xe8\x91\x03\xa8\xa3\xdb\x4d\x5f\x28\xa5\x7e\x03"
- "\x7a\xe3\x00\xbc\xc3\xf7\x58\xe7\xe1\xfa\xef\xb1\x4c\xf4\xed\xc0"
- "\xc6\x0d\x3c\xbf\x8a\xcf\xf9\x7f\x31\xad\xcb\x96\x86\x7c\xf8\x1e"
- "\xdf\xa3\x76\x2c\x7e\xa1\x53\x06\x34\x3d\x16\x8f\x6d\xe3\x58\xd4"
- "\x3c\x09\xf9\x53\x5d\xfd\xf6\x28\x93\xcd\xfb\x5b\xdc\xfb\xe5\x17"
- "\x85\xae\xf1\x66\x7d\xcc\xe4\xf5\xa4\xd7\x7d\x35\xba\x10\xd4\x55"
- "\x5f\x38\xd7\xad\xa3\x5b\x4b\xe4\xc2\x23\x39\xc5\x44\x25\x2b\x04"
- "\xb2\x61\x3f\xcb\x48\xbc\xf5\x34\x69\x08\x0e\x55\xdd\x16\xff\x68"
- "\xfa\x50\xaa\xd7\x10\x79\x51\xeb\x50\xe5\x9d\xf6\xdb\xb6\xd2\x80"
- "\x49\x4f\xcc\x4d\xb7\x13\xed\xf3\x25\xe4\xeb\x54\x12\xf0\x28\x8c"
- "\x16\xee\x56\x11\x9d\x95\x7c\xa9\xc1\xb3\xa0\xfb\x55\x68\x7f\x7c"
- "\xa9\xc1\x32\xb3\xca\x88\x32\xab\x89\x36\x17\x3e\x1b\xa8\x04\x7d"
- "\xa0\xde\x08\x18\x1b\xae\xba\x6d\x6b\x27\x94\xb1\x2f\x91\xbd\xb7"
- "\xd3\x7b\xdd\x1a\xde\xe8\xbd\x6e\xba\x51\x50\xb7\x3f\x0d\xac\x6e"
- "\x5f\x55\xb8\xea\xf6\x55\xc5\x95\xd7\xed\xf8\x7d\x6e\x75\x53\xbb"
- "\xea\x96\x02\x75\x3b\x3e\x63\x60\x75\x3b\x91\xe0\xaa\xdb\x89\x04"
- "\x1f\xeb\xb6\xbd\x8f\xba\x1d\xea\xbd\x6e\x99\xb7\x41\xdd\x4e\x0c"
- "\xac\x6e\x8d\x76\x57\xdd\x1a\xed\x57\x52\x37\x1c\xcb\xeb\xc3\xe9"
- "\x29\xe6\x7b\x3d\x8d\xa8\x70\xef\xde\x69\xf2\xd5\xc3\xfa\x32\x76"
- "\x3f\xf2\x34\xf9\xd2\x29\xf6\x6f\x9b\xa1\x8d\x9e\xe4\x76\xce\x97"
- "\x4b\xa6\xe8\x70\xbf\xeb\x97\x89\x80\x65\x0d\xc7\xf4\x57\x6c\x7f"
- "\x83\xc1\x46\xc5\xfd\xa6\x5f\xe6\x6f\x66\xfb\x51\x2a\xc5\x7d\xfc"
- "\x5f\x56\x5f\x18\x56\xb1\x1e\xf7\x82\x08\xd0\x9f\xe9\xb0\x8a\xad"
- "\x18\x8b\xf2\x9d\x34\x9b\x9c\x9a\xd0\x27\x18\xfa\xf1\x53\x10\x5a"
- "\x50\xb1\xf3\x9d\x34\x3b\x8b\xc5\x9c\xc3\xce\xf1\x7e\x79\x40\x3a"
- "\xbb\x26\x7d\xc3\x16\x54\x59\x0e\xe9\x0d\x52\xec\x5b\x2a\x47\x7b"
- "\xa6\xa2\x14\xcb\x87\xf4\x36\x29\x3e\x2d\xe0\x3d\x4f\x94\x0d\x6d"
- "\xa1\xf6\xbe\xe4\xde\x57\x13\x25\xb9\xf7\x68\x3a\x09\xc5\x18\x8e"
- "\xeb\xf4\x43\x71\xcd\x11\xc6\xd3\x5f\x56\x20\xdd\xe3\xda\x86\xd2"
- "\xd0\x2c\x12\x80\x67\xf6\x70\x8f\x9e\x45\x63\x23\xe3\xb3\x48\x60"
- "\x5c\x26\x94\x69\x27\x89\xa1\x99\x50\x1e\xd0\x9a\x8f\x0d\xbe\x62"
- "\x73\x7c\xeb\xa1\x3c\x5c\xff\x0e\x48\x27\xaa\x47\x35\x06\x9a\xf3"
- "\x06\x51\xe0\xf9\x3e\x3c\xa7\xc7\xcf\xe8\x0d\x51\xb6\x9b\xbe\xda"
- "\x26\xb5\xcf\x07\xfe\x84\x70\xfe\x58\x4f\xb8\xf8\x63\xdd\xd4\x93"
- "\x3f\xd6\x20\xce\x1f\x2b\x71\xf1\xe7\xc4\x74\x4f\xfe\x58\x27\x7a"
- "\xf2\xc7\x9a\xea\x1f\x7f\xac\x49\x2e\xfe\xf0\x6f\x70\xfe\x58\xb3"
- "\x7a\xe7\x8f\x75\xbd\x8b\x3f\xd6\x08\xdf\xf8\x63\xfd\xd0\x3b\x7f"
- "\xac\x09\x7d\xf0\x67\x48\xef\xfc\x39\x31\xda\x77\xfe\x9c\x98\x3e"
- "\x00\xfe\x04\x73\xfe\x34\x66\xbb\xf8\xd3\xf8\x60\x4f\xfe\x9c\xf8"
- "\x13\xe7\xcf\x89\xad\x2e\xfe\x34\x36\x79\xf2\xe7\xc4\x87\x9e\xfc"
- "\x69\x54\xf9\xc7\x9f\x46\x85\x8b\x3f\xfc\x1b\x9c\x3f\x8d\xe1\xbd"
- "\xf3\xa7\x71\xaa\x8b\x3f\x27\xaa\x7c\xe3\x4f\xe3\x12\xef\xfc\x39"
- "\x61\x1f\x38\x7f\x1a\xf7\x76\xe3\x8f\xda\x3b\x7f\x1a\x9b\x06\xc0"
- "\x9f\x50\xce\x9f\xa6\x3b\x5d\xfc\x39\x79\xbc\x27\x7f\x4e\xce\xe2"
- "\xfc\x39\x19\xe3\xe2\x4f\xd3\x1a\x4f\xfe\x9c\x5c\xe2\xc9\x9f\x93"
- "\xdb\xfd\xe3\xcf\xc9\x6d\x2e\xfe\xf0\x6f\x70\xfe\x9c\xac\xec\x9d"
- "\x3f\x27\x0f\xbb\xf8\x73\x32\xc5\x37\xfe\x34\x05\x79\xe7\xcf\xc9"
- "\xd2\x3e\xf8\x33\xb4\x77\xfe\x34\xfd\xda\x77\xfe\x34\xad\xe9\x8b"
- "\x3f\x03\xb3\xf5\x9a\x58\x4c\x8a\x41\x28\xc7\xea\xad\x1c\xa4\x1d"
- "\xee\x3f\x14\x4c\x78\x7e\x6d\x88\x92\x9f\xd1\x68\x2a\xd5\xae\x22"
- "\x0f\x35\x92\x53\x93\x37\x0b\x81\x4a\x6a\x7a\x3b\x5c\x30\xfd\xf1"
- "\x00\xcd\x1e\xa2\x10\xb2\x87\x2a\xf0\xcc\xb5\xf7\x98\xd8\xa7\x8a"
- "\x02\x46\x93\xb1\x78\x6e\x2e\x07\xec\x65\xfc\xbf\xdd\x74\xaa\x14"
- "\x6c\xc1\xe9\x7d\x9d\xdf\xc2\xbd\x4e\xfb\xd7\xe0\xf8\xf6\xd4\x81"
- "\x2e\x7f\x17\x26\x9a\x89\x7e\xc3\x74\x77\xe1\x39\x8b\x53\x2d\xeb"
- "\x99\x1f\xaa\xdd\xe3\x63\xee\xa2\x5f\xe1\xd8\xe3\x34\x39\xfd\x0d"
- "\xcd\xdf\x3d\x1e\xf1\x00\xb6\xfa\x2d\x67\xc8\xe9\xa9\x5d\xfb\xf3"
- "\x68\xc2\x06\x71\x8e\xb0\x8e\xe7\x6d\xfe\x35\xcd\xdf\x55\x87\x31"
- "\x3b\x57\xe8\x31\x16\x65\xf3\xc3\x60\xfb\xfe\x00\xbf\x81\x3e\x91"
- "\xb6\xc0\x2f\xee\x93\xe1\x7b\x33\x4f\xcf\x63\xf6\x72\xce\xed\x1b"
- "\xf8\x5e\xb8\xe6\x89\x12\xee\xe0\x3b\xc3\xe0\x7e\x84\x68\xcf\x63"
- "\xfe\xe1\x67\xc8\xd7\x97\xdd\x9e\xab\xe0\xfe\x38\x94\x3d\x42\x7c"
- "\x1e\x0c\xf7\xfb\xd0\xce\x66\xfe\x3b\x8a\x8d\xe2\x1e\xe2\xaf\xb7"
- "\x41\x9a\x5a\xcc\x33\x02\xf2\xe4\xa3\xed\x2e\x96\x31\x12\xee\x97"
- "\xe2\x18\x58\x7c\x1e\x06\xf7\x8f\xe3\xda\x81\xf8\xfc\x56\xb8\xc7"
- "\xb9\xce\x1f\xf2\x33\x2f\x9d\x62\x1f\xfd\x9a\xf8\x77\x16\xfc\x6b"
- "\x36\x6e\x45\x1e\xf0\xb1\xc0\xd7\x6e\xfb\x7f\x4e\x37\x77\x7b\x96"
- "\xe4\xf6\xac\x5e\x7a\xc6\xf7\xa8\x7d\x6d\x74\x7b\x56\xd5\xed\x59"
- "\x99\xdb\xb3\x8a\x6e\x65\x56\xb8\x3d\x2b\xef\xf6\xde\x61\xb7\x67"
- "\xeb\xbb\x3d\xb3\xb9\x3d\x5b\x23\x3e\x0b\x68\x37\x35\x2b\x5d\x6b"
- "\x78\xa7\xd3\xc5\x74\x39\xa4\x6b\xdd\xd2\x93\xc4\x74\xf8\x7e\x73"
- "\xb4\x95\x94\x86\x8b\xe9\x8c\xf7\xbc\xfc\xe6\x78\xb7\xf2\xa7\xf2"
- "\x39\x8e\xe6\xa4\xae\xbd\x73\xc3\x2a\x6c\x42\x67\xc2\x06\x78\x16"
- "\x8e\xb8\x72\xc7\xf6\xb2\x0c\xed\x33\x2b\x9f\xd3\xa6\x25\xa7\xe3"
- "\xf6\x95\xa5\x4b\xd2\xb5\x4b\x97\x27\x25\x7b\xf8\x4f\x0f\x43\x5f"
- "\x82\x18\x7f\x0c\x7d\xb2\x88\xbe\xfe\x9b\xbb\xe2\x63\x80\x5c\x85"
- "\x6f\xd5\x59\xc9\x74\x36\x8f\xbd\x9e\xfb\x19\xc7\xb5\xb0\x66\xee"
- "\xbf\x85\xcc\x6e\x24\xcd\x47\x44\xff\x2d\x66\xc8\xeb\xf0\xee\xbf"
- "\xe5\x4c\x3d\xf3\x5b\x08\xf9\xb8\xff\x96\x33\x0d\xd0\xcf\x1f\xa5"
- "\xc3\x78\xbc\x0b\x1e\x07\xec\x1b\xc9\x36\xb1\x2d\xbc\xcc\x7c\xff"
- "\x19\xf9\x5c\x46\x77\x3f\xac\xbb\x15\xf8\x9e\xb8\x5e\xaa\x70\x7b"
- "\x3f\x85\x3f\x97\xf4\x83\xf8\xcd\xbc\xdd\x4a\xb8\x1f\xd6\x08\xf7"
- "\x6c\xfe\x9e\x3d\xfb\x86\xcf\xe5\xe5\xef\x56\x61\x9b\xb0\xdd\x9e"
- "\x6d\x93\xff\xaa\x91\x7c\xf3\x57\x57\xdb\xbe\xa9\x77\xf3\xf1\x26"
- "\xb5\x81\xf0\x3e\xda\xa3\xad\x6c\x7f\x22\x55\xee\x56\xe1\xb7\x51"
- "\x9e\xf1\xb3\x0c\x70\x9f\xbf\x5b\x29\xd5\xc7\xad\x7e\xe8\xc7\x5a"
- "\x01\xf5\x3b\xce\x69\x02\xf2\x03\x78\x2a\xb6\x61\x13\x35\x35\x1b"
- "\xd9\xde\x7c\x3c\x03\x8c\xf1\x4b\x98\xae\x3a\x93\x22\xcd\x65\xa2"
- "\x8e\xe2\x73\x98\x67\x5c\xf6\x1f\xfa\xde\xca\x97\xf4\xd7\x19\x37"
- "\xfb\x8f\x7f\x13\xd2\xca\xdd\x31\xe4\xf6\xbd\x23\xf8\x3d\xc8\x17"
- "\xcf\xcf\x03\xec\xc6\x35\x35\xb0\xef\xcf\x84\xe1\x5e\x4c\x7c\x17"
- "\xeb\xe8\x2d\x66\x9d\x37\xdf\x88\x2e\x3a\x7e\xab\x95\xe8\xb8\x9e"
- "\xc5\x4e\xfa\x36\x4a\x9a\xaf\x63\xe7\x91\x20\xcf\xfa\xae\x18\xce"
- "\xdf\x2e\x60\x71\xd0\xf2\x3a\xcb\xef\x55\x91\x44\x4e\xdb\x6f\x93"
- "\x51\xc6\x63\x9f\xe1\xb2\xfe\xdb\x03\x22\xcf\x8d\xbc\xfe\xdf\x16"
- "\x61\xba\x6b\xff\xfd\xb7\x4d\x52\x3e\x49\x2e\xf3\xf5\xaa\x6f\xdf"
- "\x63\xf9\x78\x5c\xdd\x3c\xce\xf3\x1f\xaa\x1b\xc9\xb7\x75\x62\x7e"
- "\x1e\x97\x90\xf9\xe5\xf9\xb6\x85\xe6\x57\xe6\x41\x5d\x61\xfc\xd3"
- "\x5c\xca\xe9\xc8\xbf\x0b\xbf\x75\x58\x17\xa4\x11\x9e\x1d\xa7\xf9"
- "\x9d\xe5\xc0\x1f\x63\xaf\x7a\x8e\xef\xeb\x1e\x77\x86\x9c\xe5\x36"
- "\x84\x9c\xb2\xf9\x5d\xde\xd6\xb3\x4b\xdc\xf6\x3e\xab\xa4\x3c\x5c"
- "\x76\xb3\x67\x6c\x4f\xb9\x2e\x03\xe7\x83\xc4\x67\x19\x78\xbe\xb6"
- "\xeb\xff\x21\x6e\xff\x07\xe2\xff\x6c\x5f\xf3\x2a\xa6\x5b\x15\xae"
- "\xb3\xfb\x67\x53\xe0\x5e\xd5\xed\x3e\xcc\xe3\xfe\x65\xbe\xef\x19"
- "\x6c\xb3\x26\xb6\x87\x5c\x4c\x17\xcb\x0e\x62\xf5\xc9\xa0\xd1\x80"
- "\x0d\x0d\x9e\xc5\x16\xfb\xa1\x06\xcf\x70\x87\x3a\x9e\x62\xe7\xb7"
- "\xe1\xf9\x54\xf1\x37\x4a\xfc\x8d\xe4\x31\x4d\xcf\x6a\x5d\x71\xc9"
- "\x71\x8e\xe6\x6c\x94\xb7\x38\xe9\x52\x1c\x79\x29\x4e\x3a\x9e\xff"
- "\x16\xe3\xba\x2e\x80\xf7\x52\xfa\x8a\x49\x0f\xcf\xf3\xa4\xb3\xdc"
- "\xce\xbc\x5d\x95\x42\x5e\x13\xda\x19\xe3\xd0\xff\x97\xa1\x05\x7d"
- "\xc0\xb4\x11\x0b\xe9\x20\x96\xf4\x76\x23\xc6\xd1\xac\xe5\xf1\x33"
- "\xf1\x0c\xac\x0c\xe7\xcd\xd1\x76\xac\xd5\x9d\x65\x31\x34\x5f\x6a"
- "\x21\xe1\xba\x9f\xd2\x26\xa0\x41\x8b\x33\x7f\x57\xa5\x88\xa3\x37"
- "\x40\x07\x8e\x3d\x43\xce\xb1\xf9\x62\x16\x03\xba\x85\xad\x7b\x29"
- "\x4f\x93\x73\x59\x2c\x0f\x4d\x78\x83\xd3\xee\x1c\x9b\xfb\xda\x62"
- "\x92\xe2\x24\x9e\x1b\x2f\xc5\x65\xb6\x92\x73\xc6\x8b\x41\xef\x37"
- "\x43\x5a\xb4\xe7\x9e\xe9\x73\x8f\x63\x99\x58\x77\x2b\x39\xdb\x86"
- "\x65\x43\x9e\x05\x5d\x7d\x16\xd2\x5f\x72\x90\x31\x50\xaf\xd3\x52"
- "\xf9\xf0\x1c\xfa\x7f\x0b\xeb\x4b\x58\xe6\xc5\xfc\x26\x2c\xb7\xc4"
- "\x2a\xcf\x8d\xe0\x7b\xae\xcf\x81\xfe\xfb\x3f\xba\xbe\x6c\x20\xe8"
- "\x0b\x15\xd0\x97\xcc\x42\x5e\xe5\x4e\xee\xa3\xbb\xb2\x82\xcf\x31"
- "\x9e\xfb\x06\xf7\x75\xad\xbb\x44\x14\xb8\x07\x82\x63\xf6\xbb\xc9"
- "\x0c\xc7\x90\x06\xb2\xba\x1c\xfa\x88\x99\xe9\xb3\x01\xe9\xfd\x73"
- "\x3c\x2e\x76\x2b\x51\x16\xa7\x49\x3e\xc6\xbf\x9b\xee\x16\x17\x41"
- "\x3c\xf7\xf2\xdd\xd2\xda\x4c\xb6\xde\xcd\xea\xd8\xbd\x0e\x58\x5f"
- "\x28\xab\xd9\xab\x8d\xa9\xac\xdc\xc9\xd6\x67\x0a\x2a\xcc\x7c\x8f"
- "\xea\x77\xef\x06\x68\x6e\xaf\x80\x6f\xed\xec\x8a\x07\x01\x79\x8a"
- "\x71\xef\x3d\x94\xdf\xd5\xce\x34\xf6\x8d\x7a\xde\xd7\xbf\x6b\x11"
- "\xf2\x2b\xf1\xac\x80\x42\x4c\x6f\xa9\x75\xd8\xd1\xf7\x43\xaf\xfe"
- "\xb3\x58\x9c\x39\xdc\x13\x5e\x50\x89\x31\xa8\xdb\xee\xb5\x4b\x75"
- "\xb6\xb5\xe0\x79\x15\xac\x33\xa7\xad\xed\x84\x44\xc7\xa2\x56\x28"
- "\x5b\x7f\x8c\x34\x11\xdb\x12\xdc\x37\x87\xe7\xaf\xb0\x0f\x73\x1a"
- "\xd8\xd8\x98\x8f\x7d\x9f\xe7\x61\x63\x7f\x16\xf3\x07\xca\xdf\xcc"
- "\xe2\x96\x41\x1b\x80\x17\x66\x3d\x9e\xf9\xb7\x31\x7f\x1b\x39\x69"
- "\x84\xb7\x9b\xed\x93\x3d\x2f\xae\x93\xd8\xca\x25\x5d\x61\x15\xd3"
- "\xd6\xe1\xb7\x33\x3a\xc8\x39\x62\xcb\xc7\x78\xe4\x40\x0f\x33\xfa"
- "\x9d\xab\x6d\x83\x7e\x92\xd9\x81\x58\x30\x63\x9c\x4b\x2b\xb1\xe5"
- "\x71\xfd\x86\x34\xb7\xa5\xe2\xf7\x91\xb6\xc0\x3b\x1b\xd0\xf4\x83"
- "\x76\xd3\x79\x85\x44\xd3\xe2\x51\x38\xde\xb1\x69\xfb\xd2\x0d\x4e"
- "\xa8\x73\x2d\x8c\x32\xcc\x63\x8e\x61\xfd\x6a\x84\x61\x95\x3b\x71"
- "\x4f\x36\xfc\x2f\xfa\x3a\xe5\xbc\xe3\x7d\xe9\xfc\xdb\xf0\x8d\xf3"
- "\xb8\xbf\x01\x65\x25\xfa\x46\x83\xb4\x39\x22\xfd\x58\x9c\x88\x92"
- "\x0c\x4e\x07\x9e\xbf\x55\x5c\x0f\xbf\xbd\x1d\xea\x55\xe6\x9a\x2f"
- "\x6e\x65\xba\x1b\xf1\xb6\x99\x8d\x09\xcf\x57\xb8\xd5\xb9\x8d\x9d"
- "\x7f\x6d\xc5\xb9\xbe\xf3\x89\xf8\xad\x22\xf4\x0b\x86\xb8\x38\xe3"
- "\x8e\xff\xf3\x0f\x63\x3d\x71\xcf\xaf\x33\xa8\xc2\x0c\xfa\x16\x75"
- "\x8c\x19\xde\xc9\x84\xbe\xd0\xeb\x9c\xa9\xa8\x0b\x59\x8c\xba\x76"
- "\x53\x6b\xa4\xa4\x0b\x61\x7c\x01\x7a\xe1\xc2\x04\x36\xee\x04\x7b"
- "\xda\x22\xa0\x3d\x73\x01\x63\x31\xe2\x78\x43\xb2\x75\xf0\x9d\x44"
- "\x69\xcd\xcb\x89\xe7\x26\xce\xb1\xf5\xde\x36\x29\xf6\x1a\xf7\xc3"
- "\xd7\xba\xc6\x75\xce\xa2\xb5\xa4\xc7\x39\x0b\x3c\xfb\xf3\x3a\x8b"
- "\xd1\xb5\x1d\x75\x4a\x4d\x4b\x13\xea\x08\xf6\x3e\x9e\xbd\xd0\xc3"
- "\x98\x9c\x9f\x1f\x6a\xc2\xf9\x79\x16\xcb\x04\xeb\xc2\x63\x4a\x34"
- "\xb2\xff\x01\xb7\x0a\xfc\xe5\x58\x6a\x6d\xeb\x8a\x2f\x0e\xfc\xc6"
- "\xb5\xb6\xfd\x8a\xc7\x88\xf9\x2e\xd4\xd7\x17\x26\x60\xac\xec\x76"
- "\xd3\x05\x8d\x14\x27\x9b\xc5\xc5\xe6\xfb\x1a\x7b\x8d\x07\xc6\xfc"
- "\x2d\x4e\x21\x51\xe8\x2f\x00\xcf\xd7\x31\x1a\x28\x3b\x67\xa2\x0f"
- "\x67\xf4\x47\x69\x5e\x85\xb1\x56\x2e\x1c\xf9\xfd\x28\x76\x46\xb9"
- "\xcd\x3c\xa5\x15\xf7\x61\xb5\x9c\xce\x62\x7e\x96\x94\x71\x99\x0e"
- "\x8a\xef\x31\x7b\x22\xa8\x73\x26\x3e\x63\x31\x0c\xb0\x4c\xbf\xfd"
- "\x11\x5f\xd8\x2a\xda\xa6\x2d\x20\xf7\x6f\x03\x5e\x31\xdb\x1d\xfe"
- "\x1f\x75\x86\xb4\x39\x79\xbc\x56\xee\x53\x5f\xdc\x8f\x3d\x84\xfb"
- "\xd8\x00\x9a\x31\x9f\x07\x6d\x2f\x6a\x27\x61\x6c\xe3\xb6\x95\xcc"
- "\xbf\x75\xde\x6e\xb5\xc8\x53\xf5\x3a\x5e\xaf\xd0\x85\x99\x72\x56"
- "\x47\xac\xdf\xc0\xea\xd6\x36\x4d\x1c\x47\x0c\x69\x37\xb5\x19\x25"
- "\xdf\x1c\xdc\x9e\xe2\x7e\xaf\x39\x2f\xda\xce\x8a\xf6\x73\x98\xf8"
- "\xed\xb0\x41\xf8\x76\x05\x2f\x73\x57\x33\xf7\xfd\x7d\x21\x09\xf8"
- "\x0a\x7a\xe7\xa2\x52\x1a\xcf\x88\x67\x88\x22\xf9\x38\xeb\xa2\xd6"
- "\x35\x9e\xb9\xd0\xc3\x1f\xeb\x23\xcb\x97\xa7\x6b\x93\x96\xac\xd0"
- "\x2d\x4a\x5f\x9c\xa2\x4d\x4e\x4b\x5b\x9e\xa6\x45\xe7\x4b\xee\xfd"
- "\x87\xc7\x27\xba\x38\x55\x8c\xe5\x57\xee\x8a\xe5\x77\xd1\x23\xfe"
- "\xa5\x95\x5c\x34\x0e\xce\xdc\xc5\xc5\x32\x6f\xe5\x94\xc8\x85\x9d"
- "\x70\xe1\x3a\x8a\x19\xae\x2a\x9c\xcb\x58\x68\x27\x31\xa0\xeb\x99"
- "\x8f\x0b\x97\xcf\x89\x8b\xf3\x70\x8f\x51\x23\xb9\x78\x79\xb3\xa0"
- "\x20\xcc\x87\x90\x49\xd8\x89\xf9\xb7\xc0\xfb\x70\x99\xe1\xaa\x82"
- "\x8b\xbd\x27\xfc\x93\x9d\x97\xdf\xe9\xfe\x8c\xef\x1f\xd1\xaf\xc1"
- "\x3c\x34\x5b\xc1\xe4\x97\xf0\x3b\x9e\xaf\x5b\x1d\xe4\xd4\x74\x6e"
- "\xa7\x98\x8f\xc5\xe4\x0a\xc9\x26\xda\x5e\xf2\x05\x50\xd3\xa9\xed"
- "\x62\x3e\xb6\x07\x40\x6a\x0f\xc6\x10\x80\xfc\x52\x3e\x05\x35\x5d"
- "\x88\x16\xf3\xb1\x3d\x39\x82\x49\xde\xdb\x77\x03\xa9\x69\x8f\x56"
- "\xcc\xa7\x76\x2f\xcf\x2d\xcf\x10\xc1\xf4\x45\x39\xe6\x11\xb2\x15"
- "\xdc\xbf\xad\xe9\x62\x19\xe4\xef\x75\x3e\x67\x60\x7c\x6a\x9f\xde"
- "\x9d\x4f\xba\xc5\x4b\x92\x1f\x58\xb2\x2c\x03\x23\x48\xa5\x2f\x5f"
- "\x99\x8e\xbf\xcb\x16\xbd\xc0\x7e\x96\x2f\x7c\x76\x31\xff\x27\x3d"
- "\x35\x0a\xff\x49\x05\xbc\xe1\x6f\xd2\x4a\x1d\xfe\x2c\x5e\x8e\xb7"
- "\x99\x29\x91\x2b\x17\xe3\x4f\xf7\x73\xa0\x11\xed\xa6\xf6\x16\xc0"
- "\x46\x03\x97\xb3\xed\x76\x2b\x39\xc5\x6c\x3a\x8c\x93\x74\x30\xc2"
- "\x41\xa4\x79\x2d\x4f\x9f\x23\xf6\x40\xf4\x39\x12\x9a\xad\x5b\x1c"
- "\xea\x58\x92\x0c\x3a\x03\xec\x1d\xfb\x54\x2b\x49\x11\x63\x58\xef"
- "\xd6\x32\xff\xa5\xa6\xf6\x35\xe2\xde\x4e\x85\x90\xb7\xeb\x30\xfa"
- "\xe5\x87\x7b\x16\x93\x5a\x00\x7d\x00\xf9\xc2\xe1\x1e\x63\x51\x87"
- "\xc1\xf3\x06\x9c\x93\x82\x7b\x0d\xdc\x87\x0b\x79\x6f\x37\xe3\x19"
- "\x63\xb8\xd7\xc2\xfd\x78\x28\xbf\x2b\xfe\x5b\xef\xb6\xb2\x7d\x8f"
- "\x14\x27\x9b\xc7\xc4\xb6\x1f\xe8\x8a\x89\x8d\x71\x9a\xf4\xea\x05"
- "\x4c\xff\x32\x1b\xc4\xde\x1c\xa0\xb9\xe3\x31\xc8\xd3\x2c\xe9\x4b"
- "\x3e\xdf\x61\xb7\x4b\xfe\x53\xf8\x7c\xc6\x65\xa5\x5b\x6c\x71\xbc"
- "\xd7\x48\xb1\xc5\x71\xbe\x8b\xc5\x36\x84\x5f\x6a\x42\x3f\xb1\xb4"
- "\xbc\xd7\xb9\x3c\x16\x13\xf3\xf2\x6a\xf4\xb9\x6b\x33\x24\xc9\xee"
- "\xde\x8c\x73\x68\x70\xcf\x7d\x46\xd2\x73\xe4\x32\xf3\xa7\x2f\xf9"
- "\x93\x73\xf7\x25\xd1\xeb\x79\xa8\x4f\xc0\x66\x60\x71\xac\x52\x97"
- "\x87\x3a\x16\x25\x73\x3b\xf0\xf2\x71\x2e\xbf\x2a\x9a\xb8\xbd\x70"
- "\xb9\x8a\x3e\xc1\x63\x9d\x58\x49\xc7\x1c\x1c\xb3\x84\xca\x52\x97"
- "\x53\x78\x37\x34\x73\x51\x32\x4b\x83\x7c\x39\x60\xab\x89\xf5\xdb"
- "\x61\x09\xc7\x33\xae\x82\xe8\x23\xe3\xf2\xf6\xa7\xef\x30\xe2\x77"
- "\x94\xcc\x0e\xf9\x84\xa8\x30\x36\x25\xd6\x6d\xb3\x9b\xbf\xbb\x75"
- "\x90\x86\x7b\x48\x2f\x3c\x41\x54\xe8\xdf\x57\xac\xcb\x76\x1e\x17"
- "\xac\x63\xba\xe4\x6b\xca\x0a\x69\xdd\xdb\xf3\xc4\x2f\x18\x2a\x27"
- "\x2c\x8e\x8c\x9f\x01\xff\x45\x8a\xe1\x9d\xdd\xb1\x19\x7e\x61\xd8"
- "\xdf\x77\x5e\xf8\xe3\xec\x97\x78\x0c\xcf\x0e\x18\xff\x5f\x8e\x66"
- "\x7b\x58\x70\x5c\xd2\x9e\x50\xca\xf7\xa0\x76\xd4\xa0\x3f\x5d\xc1"
- "\x84\xf6\x24\x9e\x9b\xee\xa8\x44\xcc\x52\x65\x45\xf3\x96\xd5\xe8"
- "\xbb\x59\x06\x34\xee\xf8\x2b\x3e\x13\x7d\x76\xc9\x99\x8f\x2b\x27"
- "\xd1\xb0\x33\xc2\x60\xa3\xe0\x19\xd4\xd3\xc4\xf9\x1e\xda\x1d\x38"
- "\x9f\x24\x98\x3a\x12\x10\xb7\xc0\x63\xf4\x21\xd2\x46\x87\xed\x32"
- "\xd3\xa0\xbd\x85\x88\x63\xb4\x75\x2d\x6a\xa4\x59\xe7\x78\xf8\xee"
- "\xa3\x70\xfd\x8a\xc7\x94\x79\xb2\x59\x2a\x13\xfd\xaa\x81\x0d\xd5"
- "\x06\xbf\xea\x76\x53\xe7\x1c\xb7\x58\x7b\xe2\x99\xe8\xce\xa5\xe8"
- "\xef\x0d\xcb\xe6\xb6\xb3\xf3\x4f\xdc\x06\xe9\xcc\xb4\x92\xd0\xf5"
- "\xbc\x2f\x76\x82\xfd\xb3\x36\x51\xfc\x1f\xec\x9f\x1f\xed\xec\x56"
- "\xc6\x51\x69\xae\x94\x63\xba\x73\x0f\x60\xf4\x51\xb8\x7e\x05\xf9"
- "\xcd\x52\x3c\xf9\x1c\x39\x3b\x27\x79\x3a\x40\x83\xe7\xdd\x3b\xeb"
- "\xa5\xf4\x40\x59\x0c\xd0\xb4\xb3\x59\xea\xfb\x17\x86\x55\x54\xc3"
- "\xbd\x5d\x9a\x63\xe1\x73\x2e\x0e\xa5\xdb\x7d\x3d\xdc\x6b\xa4\x7b"
- "\xf8\x7f\xbc\x24\x2b\x70\x9c\x78\x01\xc6\x92\x38\xee\x5c\xac\x01"
- "\xbb\x50\x83\xe3\x3c\x07\xf0\x7f\xad\x56\xcc\x1b\x6f\x25\xf9\xa2"
- "\x8c\x71\x2c\xb0\xca\xd7\xce\x91\xda\x22\x98\x02\x42\x79\x7b\x9c"
- "\xeb\x85\xfc\x26\xa5\x2d\x68\x97\x11\xf2\x80\xfe\xb7\x6f\x65\x79"
- "\x32\xce\x6e\x2d\xec\x50\xcf\xb3\xac\x01\x3b\xf9\x59\xc4\x97\x93"
- "\xed\xc3\x2a\x5a\xa5\x8e\x47\x1b\x13\x7d\x7e\x30\xff\x7c\xe8\xa3"
- "\xd2\x41\x86\xb0\xb8\x00\xf9\x27\xed\xcc\x1f\xfe\x4b\x11\x2a\xc9"
- "\x3f\x25\xc8\x9e\x74\x2a\x4f\xad\x46\x9f\x95\x2c\xfe\x47\x7b\x44"
- "\x08\xf3\x53\x29\xfa\xa7\xdc\x94\x41\xc2\xca\x04\xee\x9f\x92\xf9"
- "\x03\x19\x02\x63\x92\x8c\xde\x7d\x54\x52\x53\x79\xba\xe4\xa3\x92"
- "\x5e\x72\xda\xe1\x7f\xc4\x02\xc6\x45\x8f\x60\xf7\x2e\xdf\x52\x8a"
- "\x5e\x7d\x56\xca\x41\xc6\xc9\xb9\xcf\xca\x81\xe9\x06\x67\x22\xc7"
- "\x89\x73\xab\x14\xef\xde\x2d\x0d\xe4\xdf\x65\xd1\x97\x41\x67\xaa"
- "\x98\x56\x65\x25\xb9\xe9\xe2\xfe\x4a\x1b\xce\x91\xad\x67\xf3\x60"
- "\x1d\x78\xfe\xe2\x8d\xde\xe4\x4b\xeb\x30\xa7\xb9\x95\xf9\xa2\x10"
- "\xe0\x7b\x02\x93\x75\x7c\xdc\x28\x28\xbb\xf7\xe1\x67\x16\x2f\x4f"
- "\x4a\x5e\xf8\xfc\x52\x9d\xf6\x89\x79\x8f\xb2\x60\x87\x91\xda\x25"
- "\xe9\xc9\x4c\xfd\x68\x9f\x98\xf1\x48\x5c\xdc\xbc\x85\xbf\x98\xf7"
- "\xf0\xbc\xf9\xbf\x78\x90\x9f\x4e\x9c\x97\xf6\x32\x06\xcc\x4c\x5f"
- "\xae\xc5\x97\x9e\x11\xa3\x6c\xaf\x4a\x4e\x5b\xde\xbd\xef\x87\xb1"
- "\x39\x2d\x39\x9b\xbf\x6d\xc3\xff\xf9\xbc\x99\xb0\x4d\x9a\xcf\xe2"
- "\x72\x4e\xf8\x03\xd2\x96\xc5\x2f\x35\x09\xe1\x68\x4b\x89\xf1\xcf"
- "\x51\xc7\xe0\x9c\xaa\x0d\x75\x0d\xb4\xa5\xce\xdd\x0f\x97\xf8\x2e"
- "\xfa\xe3\x52\x4b\xfd\x96\xa7\xd1\x20\x3a\x66\x8c\x81\xfb\xd2\xa2"
- "\x0a\x69\x8e\x1b\xd3\xa4\x3a\x34\x62\x1e\x93\x30\xd7\x15\x67\x97"
- "\x46\xba\x62\x49\xb2\x3f\x0f\x1a\x11\x82\xa6\x4b\x20\xd0\x6e\x08"
- "\x5c\x43\xf1\x9a\xd9\x25\xcb\x33\x68\x3d\x8e\xcf\x42\x65\xa0\x6f"
- "\x33\x03\x78\x2c\xaa\xdc\xc3\x2c\x7e\x42\x9c\xd3\x11\xb0\xd0\x29"
- "\x87\xdf\x00\xba\xd0\xa9\x60\x63\x42\x9a\x41\x0f\xb3\x73\xf5\x19"
- "\xb4\x0e\x63\xae\x01\x8e\xf3\xe2\x1c\xfa\xbc\x38\x27\x75\x2c\x04"
- "\x5b\x1d\x7e\xbf\xc6\xf3\xe1\x71\xce\xaf\x29\x8b\x3b\x83\xe7\xe8"
- "\xb9\x4f\xc1\x2a\xdc\x2f\xf9\x34\x60\x78\x73\x2b\x8f\xd5\x1b\xf7"
- "\xf2\x77\x5f\x2d\x7c\xd9\xca\x63\xf5\x9e\xe3\xf1\xad\x79\x0c\x70"
- "\xa2\x87\x72\x3e\x5c\xe8\x0c\xd0\xc6\x39\x3b\x29\x3b\xe3\x9a\x4b"
- "\xd4\x7d\xc5\xdf\xed\x75\xae\x22\xf7\xd3\x0a\x5a\xa4\x5f\x4f\x73"
- "\x3f\xcb\xa3\x45\x86\x30\x9a\xb7\x17\xc7\xb2\x32\x9a\x7b\x34\x01"
- "\xee\x21\xbd\x21\x82\x16\x19\xc3\x68\xee\x97\x76\xf8\x85\xfb\x13"
- "\x55\xb4\x28\x1b\xee\x2b\x4b\xe0\xbd\x12\x9a\xfb\x1e\xbe\xa7\xa6"
- "\xb9\xef\x1b\xe1\x17\xee\xff\x91\x09\xf9\xe0\xde\xac\x83\x5f\xb8"
- "\xdf\x97\x72\x5a\x46\x0e\xc3\x3b\x90\xd6\x54\xca\xbf\xf5\x75\x29"
- "\xfb\x56\xee\x99\x52\xfe\x8d\xb3\xa5\xfc\x1b\xb6\x52\xfe\x8d\x0b"
- "\xa5\xfc\x1b\xff\x4c\x84\xfc\xa5\x34\x77\x7f\x1d\xe4\xd3\xd0\xdc"
- "\x83\x31\xf0\x0b\xf7\x1f\xec\x84\x7c\x70\x5f\xa5\x85\x5f\xb8\xff"
- "\x10\xea\x92\x0d\xf7\x1f\x13\xc8\x5f\x46\x73\xab\xd3\x21\x5f\x38"
- "\xcd\xad\x69\x86\x5f\xb8\xb7\x2c\x80\x7c\x70\x5f\x07\xe5\x18\xe1"
- "\xfe\x93\xe9\x90\x1f\xee\x2f\x61\x7d\xb6\xd2\x5c\x3b\x96\xab\xa5"
- "\xb9\x97\x31\x3f\xdc\x77\x42\x79\x46\xb8\x77\x46\xc3\x2f\xdc\x0b"
- "\x56\xc8\xaf\xa5\x05\x04\xda\xaa\xdf\x46\x0b\xe4\x53\x21\xdf\x78"
- "\x5a\x10\x00\xe9\x06\xb8\x0f\x2c\x84\x7c\x70\x3f\x14\xf3\xc3\xbd"
- "\xb2\x09\xf2\xc3\xfd\x30\xa4\x51\x39\x2d\x50\xd9\x20\x5f\x04\x2d"
- "\x08\x8d\x87\x5f\xb8\x1f\x81\xf5\x87\xfb\x30\x35\xfc\xc2\xfd\x28"
- "\xa0\x55\x36\xdc\x6b\xa0\x7e\xfa\xed\xb4\xe0\x76\x2c\x3f\x92\x16"
- "\xdc\x81\xf4\x81\xfb\x71\x0e\xc8\x07\xf7\x77\x01\x3d\x8c\x70\x3f"
- "\xfe\x00\xe4\x8f\xec\x95\x9f\x05\x3f\x04\xfb\x76\x08\xa1\x05\x51"
- "\x6a\x9a\x3d\x14\x7e\x7f\x64\xa6\xd9\x81\x50\xf6\x7d\x5a\x48\x87"
- "\xdf\xff\x28\x85\xfb\x48\xf1\x1e\x7e\xff\x53\x07\xf7\x51\xe2\x3d"
- "\xfc\x4e\x9d\x09\xf7\x53\xc5\x7b\xf8\xbd\x1f\xec\xeb\xc0\x68\x5a"
- "\xf0\xbf\xca\xe1\x1e\x7f\xa7\xc1\xfd\x34\xf1\x1e\x7e\x7f\x9c\x0a"
- "\xbf\x0e\xdb\x1d\xb3\x12\x6c\xc1\xb1\x6a\x5b\xb0\xc9\x88\x7a\xdb"
- "\x59\xac\x2f\x11\x42\x0c\x6a\xd0\x9b\x43\x0c\x17\xc9\xd0\xd3\xb2"
- "\x80\x7c\x94\x13\x96\x2c\x2b\x8b\xd1\x27\xfa\xa8\x1c\xd2\x28\x93"
- "\x6f\x02\x1b\x27\x1a\xe4\xb2\x1c\xda\x5e\x4d\x4d\x81\xad\xd0\xe6"
- "\x39\xd4\x34\xbc\x11\x7e\xe1\x7e\xc4\x27\xd0\x66\xb8\xbf\xbf\x00"
- "\x7e\xe1\xfe\xc9\x47\xa0\xed\x73\xda\x73\xe5\x0e\xab\x8c\x70\x9f"
- "\x6a\x7f\x9c\xad\x0b\x75\x18\x68\x9c\x03\xf4\xc1\x1b\xf9\x31\xa1"
- "\x8e\x44\xc0\x41\x8e\x36\x14\x63\x69\x6c\x9a\x55\x4a\x43\x62\x59"
- "\x9d\x30\x5e\x0e\xed\x1c\x2f\xe7\xdf\x1e\x4e\x1b\x65\x01\x13\x31"
- "\xae\x03\x0d\x79\xd6\xdb\xf3\x59\xec\xf9\x98\xfc\x78\xfe\x5c\x4d"
- "\x5c\xcf\x7f\x85\xcf\x97\x84\xa2\x7f\xf4\xb1\x3f\x8e\xb7\xca\x02"
- "\x4a\x30\x8f\x55\x26\xdf\x4e\x4d\x01\xc4\xd2\xd6\x2c\xb6\x71\x28"
- "\xe6\x7b\x0d\xdf\xf3\x36\x47\x23\x14\xae\xcd\x2c\x02\xb9\x85\x63"
- "\x56\xd0\x5f\x72\xad\x7e\x7c\x45\xa3\x2c\x30\x71\x13\xda\x34\xaa"
- "\x7c\x0d\x93\x67\x32\xc5\x84\xce\x82\xbd\x87\xb5\xab\x42\xa1\xbc"
- "\xc0\x45\x06\x3b\x6d\x33\xeb\x1f\x21\xa7\x59\xfa\xdf\xd5\xec\x7c"
- "\x0f\xcf\xe3\x60\xfb\x36\xf9\xff\xcd\x6c\x8e\x18\xca\xc2\x77\xdd"
- "\xc7\x08\xce\xdc\xc8\x16\x21\x24\x5f\xcb\xd6\xbd\x65\x8a\x89\xef"
- "\x09\x56\x79\x68\x3a\x09\xd4\xae\xfa\x07\x94\xaf\xd0\x79\x8c\x27"
- "\xbb\xf2\xb2\x67\xf3\xdf\x87\xbc\x1b\x71\xee\x27\x57\x61\xec\x8a"
- "\x6b\x0c\x6d\xf8\x2d\xea\x2e\x39\x89\x41\x7d\xca\xec\x53\x59\x20"
- "\xf3\x57\xeb\x50\xe5\x10\x47\x61\x2c\x71\x16\xe6\x6b\x68\x71\xbe"
- "\x36\xc4\x21\x23\x6c\x7f\xbd\x2c\xf0\xbe\x7b\xed\x68\x0f\x7e\x84"
- "\xed\x3b\x2b\x0c\xb9\x5f\x3b\x25\x93\xc8\xcd\x69\xc7\xf0\xdd\xc9"
- "\x34\xf7\x27\xa5\x96\x96\x7a\x62\x4e\x63\x65\x45\xd2\xdc\x9f\x85"
- "\x0b\x43\x1e\x1e\xbf\x19\xed\xea\x4c\x9c\x17\xfb\x04\xdf\xfb\x2b"
- "\xd0\x59\xd1\x9e\x1b\xe8\x8a\xff\x0d\xb4\x2c\x02\xda\xa1\xcd\x8b"
- "\xbe\x2a\x16\x3a\x9d\xe8\xfb\x2d\xcf\x0a\x74\x60\x3a\x52\xa6\xb0"
- "\x61\xbc\x72\xfe\xdd\xc0\x19\xc2\xb0\xbd\xe6\xda\x05\xb8\xc6\xa7"
- "\x46\x5f\x5a\x6d\xec\x7c\xbb\x03\xe3\x10\x82\xae\x10\xf3\xba\xf3"
- "\x6e\xe9\x62\xdd\xc2\x55\xba\xe5\x69\xe9\x0b\x57\xea\x1e\xd0\xc2"
- "\x40\x4f\xbb\xfc\x59\xed\xd2\xe4\xa5\xcb\xd3\x5e\xee\xe1\xbf\x07"
- "\xea\xb5\x0d\xb0\xc1\x6c\xb9\x0f\xc1\xde\x66\xf3\xed\xb2\xa1\xe9"
- "\xc8\xeb\x37\x5e\xe7\x71\x2f\x20\x0f\xe8\xff\x25\x6c\x3c\x23\x94"
- "\xe6\x47\xd3\xb2\x59\xa5\xf9\xe8\xa3\x63\x25\xc6\x55\xb0\x11\x0b"
- "\x69\xe5\xb1\x70\x59\x9c\x3b\xb0\xff\x33\x56\x53\x73\x46\x2b\x62"
- "\x5c\x43\x8b\x4c\x11\x80\x71\xeb\xe5\xa2\xd8\xcc\x46\xd9\xd0\x84"
- "\xcb\x45\x26\x8d\x14\xa7\xc8\x59\x68\xca\x14\x54\x6b\x4b\x30\x4e"
- "\x51\x27\xd5\x90\x1a\xa0\x65\x47\xde\xde\xed\x20\xe3\xcb\x37\x99"
- "\x68\x85\x13\xc6\x43\xcc\xbf\xcc\x1f\x67\xc7\x3b\x69\x84\xc2\x69"
- "\x22\x4a\xf8\x0d\xa1\x21\x79\xe6\x4e\x55\x8e\x1a\x9f\x63\x7c\x22"
- "\x67\x67\x04\xd1\x1f\xa6\xc2\x6f\x52\x00\x37\x26\x42\x59\x3c\xd6"
- "\x94\xb3\x04\xd2\x87\x09\xc5\xa6\xad\xa7\x67\x12\x39\xe6\x05\xfb"
- "\x8c\x2c\x80\xff\xb3\x16\x91\x60\xc8\x17\x9a\xf5\x21\xa4\xb7\x47"
- "\x0c\x73\x18\x22\x94\x1d\x86\x88\x61\x9d\x34\x42\x65\x69\xb2\x93"
- "\xce\x09\xb3\x13\x27\xdb\x88\xe2\x0d\xb0\xe3\x36\x09\xd0\xbf\xca"
- "\x66\x19\x9d\xaf\x44\x0c\x71\xbc\x12\xa1\xe8\xec\x8c\x50\x3a\x5e"
- "\x8a\x50\x74\xbc\x14\x31\xa4\xb3\x3d\x42\x69\x49\xb2\x91\x8f\x6c"
- "\x7f\x26\xb5\x4d\xcd\x6c\x4e\xb6\x33\x38\xaf\xba\x33\xd8\xb4\x5d"
- "\xd5\x44\xc2\xa6\xe8\xc0\x8e\x03\x5b\x76\x03\xd8\xf1\x80\x09\x95"
- "\xe3\xed\xd9\x20\x5f\xf3\x74\x40\xdf\x07\x67\x4c\xa4\xdf\x39\x73"
- "\x55\x0a\xed\x6c\x90\x45\x30\xde\x87\x34\xc0\x8f\x26\x9d\xe6\x86"
- "\x55\xc2\xf8\x3f\x1c\x2e\xad\x95\xf3\x81\xd0\xdc\x61\x15\x38\x27"
- "\x80\x79\x79\xbe\x11\x4a\x2b\xfb\x0d\x4e\x60\x71\x53\x73\x03\x53"
- "\x37\xa1\x0d\x91\x3b\x54\x27\xd9\x10\x07\x14\xbd\xfb\x01\x81\x3c"
- "\xeb\xbb\xc6\xd7\x02\xc8\x93\x22\x7d\xaf\xeb\x73\xdc\x37\x0f\x7c"
- "\xbb\x58\xbf\xb3\x44\xe8\xf2\xc5\x0c\xf2\x70\xe8\x7b\xd0\x7f\x8c"
- "\xec\x59\x61\x8e\x56\x7f\x9e\x04\xe0\xb3\x9d\x97\xec\x72\xbc\xd7"
- "\xa6\xc9\xa8\xa5\xcd\x4e\xe0\x1d\x05\x0d\x9f\x55\xba\xf3\x92\x4d"
- "\x8e\x78\xa9\x85\x34\x78\xf7\x48\xc9\x25\xb1\xdc\xd2\xfc\x18\xc3"
- "\x8b\x84\xc5\x1e\xc1\xf8\x45\x88\xa3\x12\x3d\x8c\x0f\x31\xd6\x52"
- "\x5a\x00\xf4\x63\xe5\x08\xf8\x5f\x89\xf9\xa8\x2a\x47\x2b\x40\x19"
- "\x80\xa5\x3c\x1a\x9c\xa3\x14\x8a\x4c\x25\x80\xa9\x78\x7a\xc7\x2c"
- "\xbb\xf0\x46\x7e\x44\x7b\xae\x32\x05\xe8\x61\x94\xe6\x1b\x6a\xcb"
- "\x1d\x04\x7d\x6b\xd1\x47\x1c\xe4\x60\xfa\x45\xf4\xbf\x1b\x60\x0b"
- "\xda\xbb\xd3\x16\xbc\x36\xd3\x16\x9c\xa7\x13\x8a\xd6\x56\xc0\x55"
- "\xa9\x4b\x23\xaa\x33\xb2\xa0\xc8\x2e\xdf\xb0\xe7\x6f\x10\xdf\xb0"
- "\x60\x97\x31\xfb\x0c\xb0\x83\xf6\x16\xb4\xd7\x8e\x31\x44\xd0\x0e"
- "\x43\x99\xdb\x9e\x1b\x94\x20\xd9\x51\x28\x47\x9c\xf9\x7b\x2b\xe1"
- "\xaa\x80\x74\x9d\x55\x16\xbe\x5e\x92\x31\xa0\x57\xa2\x84\x82\x47"
- "\x60\xac\x04\x36\x7c\x67\xca\x43\x98\x17\xe8\x86\x71\xf9\x02\x9c"
- "\x9d\x29\xd3\xe0\x7a\x10\xae\x9f\x3a\x8b\x72\x88\xb3\xc8\xa4\x75"
- "\x16\xe5\xc5\x3b\x8b\x62\xa7\xc2\x15\x0d\xd7\x34\xb8\x62\xe0\x9a"
- "\x0e\xd7\x4c\x5a\x14\x3b\x07\x7e\xf1\xf9\x3c\xb8\x12\xe0\x5a\x00"
- "\x57\x22\x5c\x49\xce\x37\xf2\xa3\x04\xc0\x27\x5c\x5a\xb8\xc2\x9d"
- "\x45\x6b\xf3\xbc\xf8\x18\x8e\x60\xb1\x12\x02\xbf\xa2\xa1\x18\x4b"
- "\x37\xeb\x22\xee\x8f\x89\x38\x18\xd1\x36\x30\x9f\xf1\xb2\x61\x5e"
- "\xd7\x50\xb0\x7c\xe8\x5b\x9d\x03\x2c\x4f\xe7\x75\x9e\x44\x93\x1f"
- "\xed\x08\x9f\x65\x75\x98\x88\x11\xfa\xb3\xac\x36\xb1\x89\xc4\xd9"
- "\x88\xa1\xba\xa9\x83\x18\x92\x44\xff\xee\x59\x78\xe6\x24\xb5\x1a"
- "\x31\xec\xa4\x09\xda\xce\x42\x53\x84\x53\xb5\x36\x9e\xaa\xd6\xe6"
- "\x31\x5f\x92\x20\x7b\x30\x36\x59\xd7\x18\x12\x31\x05\xe3\xc8\x9a"
- "\x96\x8b\xe4\x95\x24\x2a\xd4\xa4\xe0\x89\x3d\x00\x97\x8c\xbc\x89"
- "\xf8\x92\xc6\x91\x3f\x6f\xa0\x46\xc0\x4a\x90\x13\xe8\x26\xe0\xf8"
- "\x11\x70\x85\x63\x49\x09\x5b\xa0\xcb\xd4\x52\x3c\x27\x3a\x64\x98"
- "\x02\x9e\x29\x30\xde\x53\x19\x8c\x1f\xcb\x32\xc8\xf8\x32\x78\xc6"
- "\x62\x73\x42\xbd\x63\x75\xa1\x54\x78\x21\x82\x6c\x7e\x9e\x28\x83"
- "\xcf\xf2\x78\xaf\x4e\xa0\x7d\x57\xcc\x83\xc2\xd8\xcc\xb9\x67\xb5"
- "\xe4\x60\xc4\x71\xd0\x49\x3b\x41\x76\xc7\x66\x76\x82\xdc\x06\x5a"
- "\x3a\x07\x46\xcb\xe1\x95\x57\x8b\x96\x9d\xe1\xb3\x8c\x9c\x9e\x89"
- "\x04\x69\xd6\x9d\x9e\x48\xe3\x55\x4d\x40\x4f\xa0\xab\xe5\xb0\x93"
- "\x84\xc8\xc8\x22\x89\x9e\x1b\x81\x9e\x40\x53\x0d\xd2\x14\xe8\xc1"
- "\x68\x4a\x45\x9a\x6e\x76\xa3\x29\xc8\x26\xe6\x77\x13\x69\x2a\x00"
- "\x4d\x37\x7b\xa1\x69\xd7\x58\x1c\x68\xba\xc5\x27\x9a\x96\x5f\x01"
- "\x4d\x83\xd5\xde\x68\xea\x40\x7d\x59\x1c\xab\xa3\x20\xef\x2c\x8e"
- "\x8f\x98\x0f\x59\xb0\x75\x2a\xc1\x66\xab\x10\x54\xa6\x4c\xa0\x89"
- "\x0a\xd7\xef\x31\xbe\x18\xf3\xf7\x56\x4e\x2f\x3b\x8b\xf3\xea\x30"
- "\x0d\xe4\x56\xca\xbd\xe8\x33\x4f\x67\x25\x9b\xe5\xb4\xa2\xf6\x52"
- "\x1b\xe8\x17\xf5\xac\x0e\xb4\x25\x8b\xf3\x43\x05\x9a\x42\x50\x86"
- "\x3c\x3d\x91\x28\x3a\x40\x4e\xe8\x32\xc8\xb8\x12\x90\x75\x1d\x20"
- "\x3b\xcf\xc8\x82\x9b\x66\xe8\x04\x0a\x97\x01\x7d\xa1\x0a\xc1\x6b"
- "\x2b\x40\x56\x33\xfe\x22\xcf\x70\x5d\xb0\xe6\xe9\x7f\x42\x79\x21"
- "\x47\x3e\x4e\x74\x10\x43\x4a\x4f\xfe\x0a\x86\x04\xad\xb3\xb0\xff"
- "\x7e\x82\x31\x0e\xb3\x9a\x91\xaf\x3b\x89\xa5\xc9\xd5\x4f\x84\x97"
- "\xb8\x0c\x46\x5e\x60\xbf\xc0\x3e\xb2\xce\x4d\xf6\x82\x5c\x57\x6f"
- "\x12\x63\x7e\x38\x41\xf6\x6e\xc2\x18\x06\xc0\x4b\x8c\x05\xd2\x6b"
- "\xff\x78\x05\xfa\xc7\x2a\x16\x8f\x49\x03\xf4\xd8\xd9\xd1\xce\x79"
- "\x88\x3c\xb3\x38\xaa\x18\xff\x4a\x44\x59\xcf\xe9\xbe\xf6\xb7\x94"
- "\x26\x10\x27\xd4\x5d\x28\xce\x33\xd3\xf6\x94\x61\x38\x87\x08\x63"
- "\xdd\xa8\xd0\x24\xb0\x1b\xbe\x03\x5d\xb0\x0c\xf0\x75\x8e\x8c\xdf"
- "\xb2\x0c\x6c\x81\x76\x8c\xab\x06\xf5\x79\x99\xc7\xa3\x15\x72\x87"
- "\xa5\xc0\x33\xe6\xdb\x55\x90\x7c\xbb\x5e\x88\xc0\x31\xba\x6b\x6e"
- "\x67\x79\x84\xdc\xf5\xcd\xf7\xcd\x4e\x65\xb3\x9d\x9d\x83\x97\x85"
- "\x72\x5f\x46\xca\x6d\xcd\x48\xd7\x16\x59\xa8\xe8\x47\xfc\x4f\x2d"
- "\x3a\x3d\x19\x7a\x46\x16\xfa\x2a\x2d\xf8\xab\x55\x87\xb1\xb5\xa5"
- "\x67\x86\x04\xa4\x43\xe2\x14\x23\x31\x3a\xf3\xbf\xd1\x58\x32\xcf"
- "\xa2\xaf\xc4\x01\xca\xde\x50\xb6\xfe\xe3\xcc\x7b\xff\x00\xd0\x29"
- "\x46\x28\x78\xbf\x1a\x64\x4a\x14\x7d\x01\xda\xfa\x3c\xb4\xf5\x0c"
- "\xd0\xf5\x0c\xb4\xf5\x25\xb1\xad\x62\xac\x39\x01\xe8\x0f\xcf\x7a"
- "\xd7\x7d\x52\x5b\x5f\x40\xbf\xe8\x6f\x56\xac\x3e\x4b\x6e\xa1\x77"
- "\xe1\x5a\x2c\x3b\xa7\xd8\x6e\x71\x1c\x27\xf8\x5d\xa6\x9b\x0b\x63"
- "\x67\xce\x07\x3c\x22\xcd\xc1\x1e\xd8\x49\x43\x4c\x5b\x25\x3e\x60"
- "\x7d\x68\x67\xca\xb0\xcd\xcb\xa0\x3e\x48\xfb\x73\x24\x12\xfb\x33"
- "\xd0\x7e\xfc\x66\xa4\xbf\x67\xbc\xe7\x30\xc6\x83\x21\xc0\x83\x65"
- "\x22\x0f\xf2\x45\x1e\x80\x9d\x08\x7a\x5a\x09\xfa\x57\xb3\xd9\xc4"
- "\x79\x30\x30\x1a\xa9\xcd\x83\xdc\x5f\x0f\x7b\xef\xaf\xb7\x38\x3b"
- "\xf8\xd8\x50\x86\x3e\x66\x69\x48\xfe\x2d\x42\x27\xf4\xdb\x62\xb1"
- "\xdf\xd2\x94\x9f\x4a\x7d\xf6\xb4\x6c\xc4\x1b\xbe\xf5\xd9\x91\xf9"
- "\xff\x43\xfb\x6c\xd8\xd5\xed\xb3\xb7\x3c\xee\xd9\x67\x6f\x59\xe3"
- "\xd9\x67\x6f\xf9\xb1\xab\xcf\x8a\xcf\x06\xa5\xcf\xde\x12\x7f\x7d"
- "\xfa\xec\x2d\xf1\xbd\xf4\xd9\x3d\x3e\xf4\x59\x8d\x97\x3e\xab\xb9"
- "\x7a\x7d\x36\x2c\xfd\xda\xe9\xd8\xdb\xde\xed\x90\xf7\xa2\x63\x5f"
- "\x71\xd3\xb1\xc1\xa8\x63\x6f\x9d\xd9\x5b\x7f\xed\x2c\x83\xfe\xaa"
- "\x12\xfb\xeb\x6f\xfe\x0e\xe5\x8d\x7a\xf8\xa3\x86\xfe\xfb\xab\xa3"
- "\xcc\x65\x3f\x79\xed\xb3\x29\xd8\x67\xcb\x89\xc5\xca\xfa\xec\x22"
- "\xa9\xcf\x96\x89\x63\x9d\x3e\xfa\x6d\x98\xb7\x7e\x8b\xf1\xb7\x30"
- "\xf6\x56\x9f\xfd\x56\xb4\x97\x3a\xef\xc0\x7e\x6b\xbe\xc1\x74\xed"
- "\x6d\x41\x9e\xfd\xf6\xb6\x69\x9e\xfd\x76\xd4\x79\x57\xbf\x15\x9f"
- "\x0d\x4a\xbf\xbd\x4d\x79\x7d\xfa\xed\x6d\xca\xef\x8f\xae\xd5\x44"
- "\x5e\x3b\x5d\x7b\xfb\x8b\xac\xdf\x7a\xd3\xb5\x06\x51\xd7\x06\xa3"
- "\xae\x1d\x1d\xe8\x5b\xdf\x1d\xed\xfc\x1f\xde\x77\xaf\xb2\xce\x1d"
- "\x73\xd0\xb3\xef\x8e\xb1\x7b\xf6\xdd\x31\x3b\x5c\x7d\x57\x7c\x36"
- "\x28\x7d\x77\xcc\x81\xeb\xd3\x77\xc7\x1c\xf8\xfe\xe8\xdc\xdb\xbd"
- "\xee\x51\xd6\x8e\x25\xc6\x46\x59\xf8\xc3\x96\x32\xb6\x5f\xce\x68"
- "\x71\x3c\x40\xd8\x1e\x13\x59\xf8\x12\x8b\x26\x9a\x08\x05\x7f\x8f"
- "\xc0\x18\x2a\xb8\xd7\xe5\xf7\x6e\x7b\x49\xd8\xfa\xab\x2c\x3c\x5f"
- "\xda\x0b\xb3\x45\x8c\xb3\xd2\xd7\x5e\x18\x9a\xb7\xb7\x42\x7c\x4f"
- "\x3c\x3f\xb1\xb7\x52\xba\x67\x7e\x5f\x64\xe1\x55\x34\x7f\xef\x1e"
- "\x5b\xd0\xde\x3d\xde\xd6\x48\x42\xb2\x29\xc5\xfd\x1f\x17\xc6\xce"
- "\x26\x17\x0a\x08\x29\x61\xeb\x0f\x77\x00\x3f\xc2\x23\xf8\xbe\x07"
- "\xa7\xed\x82\x29\x9e\x40\x5a\x98\x94\xc6\x62\x5e\x9b\x02\xa8\x00"
- "\xcf\x68\xf1\xdc\x86\x2d\x7a\xa2\x44\x9f\xc4\x53\x2e\x21\x16\xef"
- "\x18\x0f\x32\x82\xed\xed\x60\x6b\xee\xb7\xdd\xde\xb6\xb9\x95\x28"
- "\x6a\xd7\xb0\x3d\x6e\xb8\x87\x66\x6b\x31\xe2\x3f\x60\x52\x29\x95"
- "\x2b\x88\xb0\x69\x56\x33\x0d\x5e\x6b\x66\x7b\x7e\x01\x2b\xd2\xbe"
- "\x1a\x8c\xe3\x27\xdc\x31\x2b\x4f\xf2\x8b\x4b\xa1\x7e\xef\xeb\xf1"
- "\x4c\x68\x00\xdd\x9c\x46\xd4\x70\xa9\x68\xd1\x5a\x33\xd4\x6b\xbb"
- "\x34\x77\xe8\x75\xff\x36\xc6\xed\xbd\x5d\xa3\x10\xf7\xf0\xa0\x7f"
- "\x00\x76\x1e\x72\x9d\x5c\xc8\x73\x42\x3a\x35\x19\xa8\x25\xd3\x41"
- "\x42\x81\x16\xb8\xde\x8e\xf1\xbf\x84\xcd\xb3\x49\xce\x18\x42\xfe"
- "\xb2\xaa\x59\x8e\x7b\x2f\x9c\xff\xfb\xf6\x36\xb3\xfe\x3f\x70\x3d"
- "\x9e\xf9\xfa\x3f\x2d\x1b\xfb\xa7\xb8\x6f\x78\x8c\x5e\xf8\xff\x5d"
- "\x5c\x77\x98\x0b\xf7\xb8\x9e\x2d\x5c\xd0\x28\x30\x2f\xa4\x2f\x32"
- "\x67\x1c\x23\xa1\x3a\xb6\x2f\x5e\x29\xe6\x8d\xc2\xbc\x56\xd9\xd8"
- "\x3d\x58\x07\xb8\x9f\x8e\x73\xe5\xb8\x77\x9e\x9d\xb1\x28\x9b\xd5"
- "\xcc\xe4\x43\xe1\x5a\x33\xb4\x9f\xed\xc7\xc4\x76\xae\x83\x36\x43"
- "\x1e\x15\xee\xad\x61\xbf\x7a\xa2\x5e\x0f\x69\x58\x0e\xfc\xaa\xd8"
- "\xfe\x5e\xd9\x58\xf4\x99\xe1\x6d\x8f\xb6\x02\xe4\xb1\x99\x02\xb6"
- "\xf9\x39\x19\xd9\xa1\x46\xd9\xb8\x79\xa1\x32\x4a\xe1\x9b\x79\x39"
- "\x38\x87\x8d\x7b\xb1\x71\x7f\xb9\x6c\xdc\x64\x28\x5f\xb1\x85\xcd"
- "\xd9\x8e\x53\x59\x65\x77\x54\x74\xed\x1d\x60\xeb\x2c\xe3\x92\xf0"
- "\x3b\xf8\x0e\xcf\x3f\x96\xed\x91\xc0\x3a\x6b\xf5\x01\x14\x9e\xcf"
- "\xe5\xfb\xb5\x95\x89\xf0\xfe\x9c\xae\xfd\xda\xfc\x3d\xc0\xd2\xb8"
- "\x44\xe0\x19\x3b\xf7\x81\xf7\x5e\xf7\x0f\x8b\x7c\xab\xd1\x00\x36"
- "\xba\xf3\x4e\xc2\x08\xe0\x42\xc2\x08\xd6\xf7\x1d\xbd\x55\xce\xf4"
- "\x91\x6c\x1c\xdb\x27\x5b\x0c\x3c\x74\x6e\xd4\x28\xd8\xbc\x74\x27"
- "\xf2\xa5\x11\x9e\x69\xdf\x46\xbe\xac\x03\x5d\x20\xe6\xad\x72\xd5"
- "\x1f\xef\xb5\x8c\x9f\x02\xf0\x82\xed\x4f\x92\x69\x5f\x66\xb1\x96"
- "\x40\x66\xe0\xbe\xf2\x03\x99\x04\xd7\x3f\x9b\x29\x60\xe4\x2f\x69"
- "\x76\xf9\xe6\x0c\x9e\xfe\x7e\xab\x5d\xbe\xee\x0c\x41\xd9\x42\x8a"
- "\x9e\x27\x0a\xd0\x43\x0a\x2c\x93\x86\xcf\xca\xbb\x57\xe2\xe3\x2a"
- "\xe0\x5d\x06\x60\x17\x68\xbe\x0e\xe8\xb7\xb9\x83\xad\xd3\xe4\x6d"
- "\x16\x88\x4a\x80\x7c\x56\x99\x76\x0f\x94\xa7\xc6\xb8\xa2\xb8\xff"
- "\x19\x68\x98\xde\x9e\xab\x2d\x91\x68\x88\x75\xc2\xfd\xcb\x18\x63"
- "\x14\xf2\xaa\x38\x86\xc6\x35\x48\x6d\xf6\x46\xcf\xa2\xbf\x90\xf0"
- "\xa2\x29\x24\x5a\x50\x9e\x8c\xa0\x01\xb7\x6f\xc5\xf9\xe6\xd8\x16"
- "\xf4\x2f\xd5\x4c\xe2\x5e\xfd\x8a\x5a\x6c\x4e\x22\x04\x9d\x8c\xc0"
- "\x35\x08\x67\xce\xa4\x91\x71\x2f\x03\xbd\x40\xdf\x1b\xec\x44\x6d"
- "\xd1\xdb\x78\x4c\x40\x72\x9e\x38\x57\x80\x0c\x07\xb9\x0e\x3a\x55"
- "\x61\x38\x4f\x46\x23\xbd\x84\x60\x53\xc4\x69\xd9\x9d\xc9\xf3\xd3"
- "\x89\x71\x60\x72\xf4\xce\x28\x46\x77\xb0\x2f\x40\xe6\xcb\x71\x0f"
- "\x9d\xc5\x06\xf6\x49\x91\x29\x62\x80\xe5\x64\x7a\x93\x91\xd8\x6e"
- "\x01\xe7\xa1\xc5\x36\xc7\x61\x9b\xdb\xec\x04\xe7\xf2\x63\x5f\x44"
- "\xbf\xc6\x17\x89\x90\x7f\x32\x02\xdb\x0c\xb6\x4e\xf9\xc0\xe7\xf4"
- "\xef\x6c\xeb\xeb\xdb\x14\xe8\x2d\xe4\xdc\xbe\x55\x50\xad\x2d\xc7"
- "\x6f\x63\x1d\xf0\x4c\x4e\xec\x45\xc2\xe8\x8e\xf4\xb7\xd8\x9d\x18"
- "\xd3\xdd\xad\x0e\x8e\x01\xd6\xe1\x2e\xef\xed\x9f\x42\xc2\x0b\xff"
- "\xc2\xf9\xee\xcc\x11\x69\x90\x82\x6b\x60\x6b\xcb\x31\x16\x46\x2c"
- "\xd6\xc1\x76\x96\xcc\x85\xde\x82\xfc\xb7\x44\xb4\x10\x67\xc0\xa4"
- "\x91\xb8\x97\x00\xf9\xaf\x77\x00\xff\x2f\xd9\xd1\x97\x91\xcd\x62"
- "\xbc\x4c\xd0\x7e\x71\x5c\x88\x90\xf7\xe4\xff\xdd\xc9\xf3\x33\x07"
- "\xca\xff\xbb\x07\x89\xff\x77\xdf\x00\xed\x1f\xef\x47\xfb\xc7\x0f"
- "\x52\xfb\xc7\xdf\x00\xed\x9f\xe0\x47\xfb\x27\x0c\x52\xfb\x27\x78"
- "\x6d\xff\xa3\xa3\x05\xca\xf6\x98\x84\xe8\x4b\x50\x07\x70\x7d\xf5"
- "\x83\xa7\x70\x0f\x09\x3b\x83\x25\xde\x13\x7e\x26\x4b\xd9\xed\x5e"
- "\xd5\xed\x5e\xdd\xed\x3e\xac\xdb\xbd\xa6\xdb\x7d\xb8\x74\x0f\x7a"
- "\x24\xf0\x9c\x6c\x42\x0d\xd8\xa5\x46\xab\xec\x07\x29\xe2\xf3\xf1"
- "\xe8\xeb\x0b\x74\xfa\xf8\x3e\xe2\x52\xde\x7e\x46\xf6\x03\xe6\xef"
- "\x92\xe6\x8c\x89\xa0\xab\x8c\x44\x28\x8c\x9d\x17\xbb\x1a\x64\x17"
- "\xf0\x8f\x76\x6a\x86\x80\x8d\x70\x1b\xfa\x93\xc3\x3d\x07\xda\x34"
- "\xdc\x4b\xf2\x83\x7d\xd8\xbe\x29\x3a\x33\x11\x02\x26\xb1\xb5\x7c"
- "\xa1\x28\x76\x9e\x2d\x60\xd2\x18\xfa\x46\x7e\x54\xb1\x5c\x50\x16"
- "\x9b\x04\xed\x6a\x1b\xb5\xcd\x39\x0f\x72\xe8\x22\xfa\x78\x07\x1e"
- "\xa7\x53\x9b\x39\xed\x2c\xd4\xf7\x87\x13\x6b\xb2\xa0\x6c\xf8\x0e"
- "\x7c\x0b\xc6\x71\xb1\x53\x59\x9c\x74\x28\xa3\xb6\xad\x8a\x60\xec"
- "\x1f\xb1\xcc\x78\x1a\x1c\x3b\x15\xcb\xec\xd5\x3e\x2d\xd4\x1f\x80"
- "\x6f\x3e\x30\x3f\x42\x41\x68\xb6\x22\x6c\x60\x3c\xfd\xe1\x1c\xaf"
- "\x76\x6f\xa1\x61\x3a\x2f\x57\xe9\x4f\xb9\xdb\xfa\x28\x57\xac\xaf"
- "\xda\x9f\x72\x1d\xde\xcb\x35\x8a\xf5\xd5\xfa\x51\x6e\xc4\xbc\x3e"
- "\xca\x15\xeb\x1b\xe3\x4f\xb9\x3d\xf6\xa4\xbb\xca\xcd\x16\xeb\x6b"
- "\xf4\xa3\xdc\x89\x0a\xef\xe5\xea\x0f\xf8\x87\x85\x89\xde\xe3\xff"
- "\x02\x16\xfc\xc3\xc1\xc4\x3e\xda\x6f\x38\xe0\x1f\x06\x26\xf5\xd8"
- "\xff\xea\x8e\x01\xff\xf8\x3f\xa9\x4f\xfe\xfb\xc7\xfb\x49\xe5\x7d"
- "\xf1\xde\x3f\xbe\x4f\xf2\x8a\x7f\xb4\xe5\x81\xf7\x46\x1a\x92\xaf"
- "\x15\x8a\x63\x8d\x42\x88\xde\x94\x23\xc4\x90\x47\x41\x86\x85\x96"
- "\x92\x11\x31\x6c\x7c\x7c\x4f\xc9\xea\x32\x22\x87\xf1\xae\x7c\xc7"
- "\xaa\x7a\xb9\xc5\x11\x8d\x3a\xc7\xb9\x2d\xc3\x2e\xbb\x1b\xd2\xf7"
- "\x81\xc4\x6c\x03\xbb\x93\x97\x13\x6b\x2c\xd6\xc7\x10\xd1\xbf\x45"
- "\x1b\xfa\x33\x8d\x03\x39\x66\x29\xb5\xe3\x9e\x95\x11\xf0\x9e\x03"
- "\xf0\x0b\x65\xd8\xc9\x3b\x82\x4d\x16\x93\xc6\xf2\xd9\xd8\x59\xba"
- "\x62\xbd\x89\x1a\x22\xd0\xcf\xa1\x0d\xbe\x79\x39\xc0\x46\xe4\xe8"
- "\x8f\xa8\x3d\xf7\x9e\x36\xab\x2c\xb2\x49\x3c\x3b\xda\xc2\xfc\x71"
- "\x42\x7d\xf1\x5c\x26\xe6\x45\xbf\x9c\x53\x74\x44\x8e\xbe\xd2\xdb"
- "\x73\x23\xb5\xe8\xa3\xb3\xaf\x33\xd8\xce\xc2\xb5\x49\xf8\x3e\x2d"
- "\x04\x1d\x7a\x96\xc8\xf1\xdc\x25\x8c\x03\xac\xc5\x30\x86\x98\x31"
- "\x11\xe7\x3c\x5a\x89\x7e\x35\x15\x70\xfe\x89\xaa\x4c\x1a\xdc\x17"
- "\xc7\xf6\x78\xcb\x22\x2b\x37\xf3\x3d\xdf\x76\x16\x17\x18\xee\xd9"
- "\x38\x06\xf7\xc5\xa8\x62\x95\xb4\x38\x38\xa6\xb6\xad\x95\xc5\xf6"
- "\x69\x94\x45\xbe\x87\xbe\x12\x2f\xa8\xd6\x26\xb6\xa9\xd6\xa6\x40"
- "\xbd\x2a\xa4\x36\xe0\xf7\xa5\x74\x1c\xb7\x61\x3e\x78\x5e\x2f\x9d"
- "\xc9\xf6\x12\x27\x7b\x64\x9c\x86\xda\xba\x7c\x60\xc8\xa6\x3c\x88"
- "\xb4\x07\x5b\x21\xa1\xcd\x10\x31\x96\xcf\x63\x4c\x4e\xc2\xf1\x30"
- "\xd4\x7b\x3a\x1f\x9b\xc6\x4e\x67\xfe\x72\x41\x07\xcc\x8f\x90\x0f"
- "\xd0\x6e\x9d\xcc\xf4\xbf\x79\x2c\xea\xc8\x29\x13\xa0\xfc\x9f\x34"
- "\xca\x26\xf3\x73\xc9\x85\xb1\x09\xec\x2c\xa2\x6c\xf2\x78\xf8\x46"
- "\x02\xdc\x13\xcc\x07\xcf\xcb\xc5\xe7\x89\x6e\xcf\x13\x71\x9f\xa4"
- "\xf8\x5c\x1c\xcb\xc5\x26\xb9\x3d\x4f\xd2\x8d\xc5\xb9\x89\xc9\x36"
- "\x6c\x03\xd0\x31\x06\x75\x5b\x97\x4f\x8f\xe0\xd8\x18\x31\xdf\xbc"
- "\x16\xd9\x94\xa0\x0b\x80\x2d\x78\xbe\xc0\xed\xfd\x05\xfb\x33\xa3"
- "\xc8\xa3\x9b\x90\x86\x53\xc2\xad\xf2\xb5\xdb\xf8\x78\x76\x32\xd3"
- "\xad\x50\x5e\xb4\x7b\x79\x90\xde\x0c\x65\x46\xb7\x81\x1d\x05\xff"
- "\xab\xf1\x9b\xee\xf4\x96\x4e\x44\x6a\x93\x96\x2e\xd2\x2e\x5e\xbe"
- "\x72\x19\x9e\x68\x1b\xe6\xb1\xbf\x51\x8d\x67\x3e\x85\xc2\x9c\x99"
- "\x96\x52\x3c\x83\xa6\x66\x67\xb7\xd7\x03\x1f\x1d\xc5\x79\x46\x67"
- "\x48\x9e\xda\x59\x6c\x8a\x32\x5c\x24\x72\xbd\x86\x9e\x30\xaf\x7a"
- "\x84\x9c\x93\x4d\x79\x97\xc5\x3d\xd5\x32\xbf\xd0\x6d\xe6\x55\xff"
- "\xc4\x34\xe6\xd3\xdb\x92\xc8\xd3\x76\xeb\xab\xe4\xff\xd0\xd7\xcb"
- "\xab\x13\x5b\xc9\x7e\x8d\x8d\x1c\xd0\xb6\x92\x32\x4c\x17\xea\xe4"
- "\xb8\x6f\xf4\x9c\xec\xde\x3b\xf0\x5b\x38\xc6\xc7\xff\xf9\x7c\xc5"
- "\x94\x37\xf1\x3b\xe8\x4f\x03\x68\xf3\x36\x7e\xcf\x2a\x9b\xb2\x2d"
- "\xa0\x8c\xed\x33\x56\x41\xbe\x45\x42\x51\xce\x4c\xd6\xc7\x73\xa7"
- "\xcc\x73\xc8\x55\xdb\xc4\x33\x6e\xcc\xcf\x7f\x7b\xee\xbd\x73\xdc"
- "\xce\x73\xaa\x2e\xc8\xc9\x43\x90\x96\x28\x9d\x2d\xc0\x38\x63\xde"
- "\x64\xc6\x65\x18\xcb\x5e\x2e\x9b\x95\x22\xa8\x72\x80\xbe\x39\x33"
- "\xab\x80\xb3\xa1\x3a\xdc\x9f\xda\x01\x75\xf9\x51\x0c\x0d\xce\x89"
- "\xd6\x63\x3f\x05\x5a\xfc\x5f\xdc\xc7\x17\x92\x67\xdc\x8e\xfb\xf6"
- "\x8a\xf3\xd4\x7f\xce\xb0\xcb\x3f\xaa\xae\x20\xda\x5f\xa2\x3d\x74"
- "\xef\xa1\x9f\x27\x51\xc7\xa4\xc3\x66\x52\xdd\xb4\x8b\x7c\xdc\x50"
- "\x45\x54\x0b\x48\x80\xc1\x4a\x9d\x6c\xbc\x9f\x4e\xe4\x71\x56\x12"
- "\xa0\xbf\x88\xfd\xd4\x49\x0c\x2b\xe1\xd7\x5e\x03\x36\x4e\x6a\xf5"
- "\x0e\x7d\x73\xa0\xf6\x09\x42\xa0\x3f\xb1\x75\x63\x76\xce\xc6\xc6"
- "\xce\x28\x07\xe3\x1c\xb6\xdb\xf9\x9a\xcc\xd5\x67\x89\xb2\x26\xe5"
- "\x38\xc9\x4a\xa4\x82\xf3\xa5\x88\x91\x71\x89\x01\x94\x9d\xb1\xc9"
- "\x84\xcc\x3a\xe0\xe9\x4b\x11\x21\x1b\x32\x48\x58\x6d\xba\x95\x58"
- "\x9a\xab\xc8\xc6\x34\x12\x46\xdb\x53\x82\xaa\xab\x3f\x22\xb4\xa0"
- "\xc9\xf6\x8e\xde\x1c\x28\xed\x99\x0a\xcd\x96\xe1\x9c\x65\x48\x21"
- "\xee\x9d\xba\x44\xa2\x16\x9e\x32\xb2\x79\x56\x9c\xd3\x76\xb4\x47"
- "\x68\x3b\xdb\x23\xee\xea\x68\x8f\x18\x2b\xcd\x85\x3f\xb5\x44\x4d"
- "\x36\xe1\xd9\x9c\xdc\xbb\xa6\xe1\x5e\x3d\xb4\xed\x1d\x41\xcd\x76"
- "\x9c\xf7\x46\x5c\xc2\xb7\xc3\x85\xc5\x11\xe4\x5e\x1b\x3b\xfb\x83"
- "\x73\xf1\xea\xcd\xcf\x40\x7d\x5b\x5a\x89\xfb\xfe\x9f\xcb\x2f\x45"
- "\xc8\x71\xef\x0f\xcd\xbd\x37\xb3\x63\xd3\xac\x14\xdc\x03\x04\xba"
- "\x60\xea\xc0\xfb\xf6\x8f\xd8\xdc\x04\xb6\x1f\xf8\x61\xdc\xde\x8a"
- "\xfc\x01\x3e\xb5\xda\xe4\xc8\x8b\x9a\x24\xe4\x43\x9d\x07\x1f\x18"
- "\xdf\xd2\xec\x72\xe4\x07\xf2\x02\x79\xe2\xe2\xc7\x11\xc6\x8f\xed"
- "\x02\xe7\x47\x07\xe8\x01\x89\x27\x97\xc3\x67\x65\xf6\xc5\x17\xe4"
- "\x07\xf2\xa6\xba\xe9\x38\xf1\xe0\x89\x8d\xf3\x04\xe8\x39\x52\xe2"
- "\x0b\xf2\xc4\xd2\x02\xb6\x2e\xf0\x65\xf6\x11\x42\x7e\x3e\x91\x0a"
- "\x35\x73\x3e\xe9\xe2\x8f\xc3\x1b\x7f\xbe\x71\xf1\x07\x78\xdf\x93"
- "\x3f\x67\xd5\xb8\x36\x83\xfc\x31\x0f\x84\x3f\xd5\x4d\x9c\x3f\x0e"
- "\x91\x3f\x13\x67\x12\xb9\xbd\x3d\x42\xfe\x46\x06\x89\x9e\x73\x4a"
- "\x4b\x0e\x26\xd4\x10\xa0\xb5\x52\x28\x5a\x9b\xe0\x5f\x3f\x9a\x9a"
- "\xe7\x7b\x3f\xfa\xcf\xd1\x37\xfb\xd1\x40\xfb\xd1\x7f\x98\xaf\xac"
- "\x1f\x4d\x9d\x77\xb3\x1f\x5d\xab\x7e\x34\x35\xbe\x7b\x3f\xea\xd2"
- "\xd5\x69\xc9\x4b\x17\x2d\x59\x86\xc7\xf7\x9e\x79\x39\x3d\x79\x05"
- "\xd7\xd8\x1e\x3a\x5b\xe3\xd4\xc7\xc8\xd1\xff\x5a\x75\x69\x1d\x79"
- "\x67\x4c\x9d\xdc\xf9\xb5\x46\x41\xf3\x3a\x63\x84\x3c\x67\x15\xfa"
- "\xd1\xc4\xfe\xb6\x1e\x7d\x5c\xc8\x1e\x38\x50\x1b\xce\x63\x56\xe2"
- "\xff\xcc\x5e\x09\x9f\x65\xc7\x35\x92\x9c\x0e\xb8\x56\x11\x45\xa8"
- "\x9d\x28\xcd\x63\xd9\xf3\x3b\xd1\xaf\x20\xdd\x34\xcb\xbe\x19\x9e"
- "\xa1\x9f\x9a\x36\x55\x2c\x59\x03\xe5\xd9\x82\x73\x66\x2a\xb4\x78"
- "\xce\xe1\xfe\x9d\xa0\x93\x53\xbb\xfc\x0e\xc9\x7e\xdc\x44\x87\xdc"
- "\x8f\xfb\xdc\x67\xe2\x99\xb3\x73\xb2\xfb\x4f\x5d\x36\x11\xf4\xaf"
- "\x61\x9b\x3f\x11\xbe\x75\xc7\xac\x4c\xe6\x87\x00\xfa\x3d\x7f\x1e"
- "\xcd\xd6\x9d\x3a\x55\xa6\x28\xb4\x15\x2f\xa8\xf2\x8c\x17\x0a\xf3"
- "\xd4\x1f\x65\xed\x24\xda\x27\xb0\xdf\xff\xaf\x11\xb3\x4b\xa1\xdf"
- "\xc7\x9b\x49\x8d\xe6\xcf\xe4\xe3\x04\xc0\x5b\x42\x7f\xfd\xde\x0d"
- "\x67\x63\x7d\xeb\xf7\x12\xbe\x10\x57\x88\x2f\xc4\xd6\x70\xc0\x16"
- "\xe2\x4d\xc2\xd7\xef\x2f\x71\x7c\x85\x36\x10\xf5\x86\x56\xc0\x98"
- "\x83\x63\x0c\xcf\x01\xd7\x64\x7e\xe2\xbd\xff\x5f\xea\x86\x2f\xb9"
- "\x88\xaf\x97\x00\x5f\x2f\xb9\xf0\xf5\xe4\x71\x35\xd9\xc8\xf0\x75"
- "\xa7\x0b\x5f\xf9\xcd\x76\x09\x5b\x88\x33\xc4\x94\xf0\x5c\x04\xc1"
- "\x3e\x2f\xe1\x6c\xf3\xb3\x7c\x9d\x93\xf5\x7f\x39\xf4\xff\x76\x37"
- "\x3d\x7a\xc7\x95\xf4\xff\x68\xd6\xff\x91\x27\xc8\x1f\xe4\x0b\xf2"
- "\xe2\xdf\x91\x0f\xe8\x03\x96\xb6\xf7\xc6\x0b\x6d\x55\x7f\xbc\x40"
- "\x3e\x20\x3f\x18\x1f\x80\x1f\xd2\x9a\x33\xae\x41\x22\x4f\x90\x17"
- "\x53\xb2\x88\x1c\xf9\xb2\x19\xfa\x3c\xf6\x73\xa0\x6d\x3c\xf2\x85"
- "\xd9\xae\xa6\xe0\xd4\xf5\x78\x6e\x56\x8c\xaf\xdb\x9e\xfb\x80\xa2"
- "\xa7\xdd\xfa\x80\xa6\xcb\xef\xa3\xec\x7e\x36\x2e\x33\x8f\x79\x00"
- "\xfa\xdb\xfd\xe2\x98\xc5\x64\xe7\xeb\x47\x3f\x59\x29\xf6\x69\x2b"
- "\x8e\xff\xd8\x58\xcf\x09\x63\x3d\x15\x8c\xf5\x0a\x61\xac\x97\xd9"
- "\xcc\x7d\x05\xc8\x1e\xe0\x71\x90\x70\x6c\x17\x6c\xd2\xc0\x38\x83"
- "\xf9\xe9\x63\xeb\xa6\xc1\x6b\x13\x71\x9d\x87\x16\xc1\x38\xf2\x2d"
- "\x39\x81\x7b\xc0\x90\x73\x80\xd8\x79\xa0\x44\x5c\x17\xde\xa3\x5b"
- "\x85\x7b\x06\x7e\x92\xc8\xeb\x77\x3f\xf3\x41\xc5\xd6\xd4\xe4\xc2"
- "\x56\x67\x8e\xe7\x9a\x9a\xfb\x9a\xeb\x3b\x7a\x9b\xb8\x9e\xf6\x93"
- "\x87\x59\x1e\x3c\xb7\x01\x72\x6d\x87\xbe\x4e\xee\x5a\x53\xfb\x04"
- "\x9f\xcf\xf2\x5c\x53\xfb\x49\x38\x3f\x13\xf6\x93\x74\xdc\x47\x02"
- "\xf7\x51\x3c\xfd\xfe\x14\xf7\x74\xd7\x9a\x35\x4f\x17\xe4\x2c\xc6"
- "\x08\x8e\xb9\x5b\xf8\x58\xfb\x27\x85\xd2\x98\xd6\x8b\x7d\x33\x00"
- "\xb9\x1b\x13\xef\x92\xbb\x31\x6c\x6f\x21\xd5\xe4\x47\xd4\xf4\x90"
- "\xbb\xc7\xe0\xf9\x43\x3b\x62\x51\xee\x16\x9a\xb4\xbc\x7e\xd3\x46"
- "\x03\x4d\x02\x30\x56\x24\xa6\xe3\xf9\x1d\x94\xbf\x9b\xf0\x6c\x0b"
- "\x93\xc9\xf9\x9a\x35\x6c\xed\x7c\xda\x34\x4f\x59\xfc\x90\xce\x53"
- "\x16\x4f\x7b\xb1\x6f\x59\xfc\xd3\x5b\xfb\x96\xc5\xd3\x36\xdd\x94"
- "\xc5\xfe\xca\x62\xb0\xc5\xae\x48\x16\x3f\x68\xbd\x29\x8b\xaf\x96"
- "\x2c\x7e\xb0\xc1\x4d\x16\xff\xca\x53\x16\x3f\x54\xd2\x53\x16\x3f"
- "\xb4\xcd\x25\x8b\xa7\xcd\x74\xc9\xe2\x69\xc4\x53\x16\x3f\x2c\xf3"
- "\x4d\x16\x3f\xe4\xbc\xba\xb2\x38\x26\xdc\x53\x16\xc7\xb4\x88\xba"
- "\xe2\xc4\xc0\x65\x71\x4c\x4d\xdf\xb2\x38\xe6\x88\xa7\x2c\x8e\x29"
- "\xe7\x32\xf7\x61\xc2\x65\x71\x4c\xa5\x28\xa3\xad\xee\xe9\x2e\x59"
- "\xcc\xd3\x7b\xca\xe2\x87\x35\xfd\xc8\xe2\x08\xa7\x20\xc9\xe2\x7a"
- "\x90\xc5\xf5\x72\xe1\x39\x6f\xb2\xf8\xb1\x99\x35\x28\x8b\xd3\x50"
- "\x16\x3f\x36\xb3\x6f\x59\xfc\xd8\x7d\x28\x73\x01\xaf\xa4\x0c\x7d"
- "\xfc\x02\xfe\xcc\xcf\x1e\xc3\x39\xdd\x26\xc4\xe7\x69\xd9\x8c\xa2"
- "\xd8\x2c\x77\x59\xfd\xf0\xc1\x2e\x59\x0d\xe9\xc2\x68\x4f\x59\x8d"
- "\x72\x1a\xe5\xf5\xa6\xd7\xa9\x75\xf3\xeb\xb4\x01\xda\x65\x93\x64"
- "\x76\x11\xa4\x61\xbc\x1f\xf4\xe1\xb3\xe9\x12\xbb\x14\x40\x83\xa6"
- "\x1c\xf8\x2e\xbe\xd3\x9e\xfb\x48\xb8\xa7\x7c\x9f\x11\xef\xc8\x75"
- "\x97\xef\x8f\x3c\x8e\xf2\xbd\x90\x9f\xd9\x66\x72\xdd\xb1\x69\x56"
- "\x26\xca\x7a\xfe\xfc\xd1\x8b\x7d\xcb\xf7\x47\x56\x5f\x2f\xf9\x8e"
- "\x32\x65\xb8\xdb\x58\xce\x9b\x5c\x81\xb6\xb5\xd5\x24\x5d\x1b\xf9"
- "\x8e\xf2\x04\xe5\x08\xca\x16\x49\xbe\xa3\x6c\x71\x88\x63\xed\x32"
- "\x93\x9b\x7c\x1f\xe2\x26\xdf\x65\xfe\xc8\xf7\x47\xcd\xdf\x2b\xf9"
- "\x8e\x7c\xc8\xba\xba\xf2\x5d\x1a\x57\x23\x1f\x90\x27\xc8\x0b\xf7"
- "\xb1\x35\xf2\x01\xf9\x81\x7c\x40\x9b\x46\x92\xef\x93\x33\xb9\x7c"
- "\xdf\xd4\x25\xdf\x1f\xad\xec\x92\xef\x72\x2e\xdf\xcb\xd0\x37\x1a"
- "\x9b\x23\x9e\xa1\xeb\x29\xdf\x67\xac\x71\xc9\xf7\x47\x22\x44\x79"
- "\xd7\x84\xbe\x05\xa0\x7f\x6f\xf7\x94\xf1\x8f\x5d\xf6\x4d\xc6\xcf"
- "\x38\xd1\x43\xc6\x03\x0d\x0b\xf9\xda\x10\xca\xf7\x44\x94\xef\x0e"
- "\x94\xf3\x7e\xc9\xf8\xc7\x88\x4b\x0f\x3d\x5c\xc8\x65\xeb\x8c\x32"
- "\x4f\xb9\xff\x58\x93\x28\xa3\x96\xba\xcb\x7d\x21\xc0\x17\xb9\xff"
- "\xd8\x41\x49\xee\xa3\x5c\xdd\x21\xd4\xbb\xc9\x7d\x26\x27\x6b\xcc"
- "\x19\x8d\x6e\x72\xff\xb1\xad\xbc\x0e\x8f\xd9\x9d\x4c\xee\x3f\xb6"
- "\x87\xa7\x3f\x9c\xea\x9e\xee\x92\xfb\x3c\xdd\xe9\x2e\xf7\x9b\x51"
- "\xee\xff\x4c\xdd\x8f\xdc\x9f\xea\xbb\xdc\x9f\x53\xe1\x92\xfb\x73"
- "\x2a\xfa\x96\xfb\x73\xde\x46\xb9\xcf\x7c\xc2\x02\xef\x01\xcf\x8a"
- "\xe2\x51\x5c\xe6\xe3\x9c\x08\xe8\x02\x2b\xfa\xb4\x80\x7c\xaf\x31"
- "\xdf\xef\x70\xc1\xf3\xe6\x42\xfc\x5f\x60\xef\x34\x84\xda\x88\x12"
- "\x75\x40\xe1\x69\xa2\xc0\xb8\x69\x9c\x4e\x3f\x3f\x5b\x86\xb1\x3c"
- "\xbb\xf4\xc5\xcf\x2e\xfa\xa8\x2f\x0e\x83\xbe\xa8\x6b\xcf\x9d\xa9"
- "\x75\xd3\x17\x18\x7b\xae\xae\x9b\xbe\xb0\x82\xbe\x68\x92\xde\x81"
- "\xfc\xf1\xee\xf9\xb1\x7e\x2c\xff\x69\x76\x61\xfe\x7a\xc8\xdf\xc0"
- "\xf5\xcb\xcc\x2c\x4f\xfd\xf2\xf3\x9d\x82\xc7\xf8\x61\xe6\x5f\x25"
- "\xfd\x82\xfa\x59\xe8\xa1\x5f\x66\xcf\xef\xd2\x2f\xa3\xdc\xf4\x4b"
- "\xa6\xa4\x5f\x66\x1e\xbf\xe1\xc7\x0f\x57\x20\xd7\xfc\xd5\x2f\x28"
- "\xd3\x50\x9e\xf5\xa5\x5f\x04\x37\xfd\x22\xf8\xa5\x5f\x66\x6b\xbf"
- "\x57\xfa\xe5\x1a\x8c\x1f\xdc\x79\x80\x7c\x61\xba\x05\x78\x83\x7c"
- "\x40\x1e\x20\xfd\xd1\xff\x34\xf2\x06\xf9\x82\x3c\x99\xac\x73\xe9"
- "\x16\xc6\x17\xa6\x5f\x66\x87\x77\xd7\x2f\x9b\x47\x4a\xfa\xe5\xe7"
- "\x75\x3d\xf5\xcb\xcf\x9b\x5c\xfa\x65\x26\x9b\xbf\x61\xfe\xf5\x64"
- "\x3f\x6b\xf0\xd4\x2d\x73\x97\xf8\xa6\x5b\xe6\x3c\xd8\x8b\x6e\x61"
- "\xbe\x8d\x0b\x5f\xf7\x18\x3b\x24\x82\x7e\xf1\x43\xb7\xcc\x59\xc0"
- "\xeb\x88\xfb\x97\x7f\xb6\x9d\xcb\xef\x9f\xdb\x5d\xfa\xe6\x67\x6b"
- "\xdc\xd3\x5c\xfa\x66\xee\x3c\x51\xc6\x25\x0f\x5c\xdf\xcc\xbd\x8f"
- "\xed\x3d\x80\x36\xec\x68\xe5\x32\xdd\x53\xdf\xcc\x7d\xd0\x53\xdf"
- "\xcc\x55\xf3\x3a\xcc\x4d\xe1\xfa\x66\xee\x78\x9e\xfe\xb3\x24\xf7"
- "\x74\x97\xbe\xe1\xe9\x3d\xf5\xcd\x5c\x63\x3f\xfa\x46\xd5\x19\x3e"
- "\x2b\xb3\xb3\x30\x2f\xd1\xb1\x6d\x36\x89\x4c\x78\xc8\xd9\xbd\xdf"
- "\xf0\xfe\xe2\x24\xd8\x7f\xba\xd6\x9f\x9e\xe6\xeb\x1d\x82\x78\x06"
- "\xb8\x23\x7c\x56\xca\xe9\x54\xe8\x3b\x2d\xde\xfb\x0e\xf4\x1b\xa5"
- "\xd4\x6f\x6a\x52\x4e\x11\xe8\x4b\x72\x5c\x93\xda\x08\x7d\xc6\xd2"
- "\x56\xcf\xfa\x90\xaa\x29\x86\xa0\xef\xc4\xe0\x16\xa2\x0e\x96\xc9"
- "\x86\xe0\x7a\x87\x13\xfa\xcf\x8c\x89\x54\xb8\xa7\x3e\x86\x04\xa7"
- "\x90\x10\xec\x43\x7f\x11\xd7\x3d\xd0\x7f\x03\xae\x77\x00\x7e\xa3"
- "\x16\x1e\x72\xad\x77\x74\xf8\xb0\xde\x61\xc9\xb4\xb2\xf5\x0e\x3c"
- "\xd3\x24\x40\x3f\x61\xe7\x6c\x70\xbd\xc3\xce\xd6\x88\x98\xfc\xda"
- "\xc2\xd6\x3b\x1a\x09\xae\x75\x48\xfe\x59\x70\x8d\xe3\x9e\x04\x22"
- "\x47\xff\x0e\x1b\xa1\xdf\x1c\x8c\xa8\x61\xfd\x66\xe0\x32\x2c\xb6"
- "\xa9\xaf\x7d\x3e\x0e\xa0\xa9\x53\x95\x97\x48\x37\xe4\xc7\xff\xdf"
- "\x46\xbb\x0c\x7d\x53\x3a\x81\x47\x02\xc8\x2a\xaa\xec\x26\xab\x3a"
- "\x45\x7a\x77\x72\x7a\x03\xaf\x94\x4f\xb7\x11\x0a\xe9\xdc\x37\xa5"
- "\xdd\x0a\x58\x8b\x18\xb9\x69\x15\xd2\x36\x8a\x6c\x12\xfd\x53\x0a"
- "\xaf\xa4\x04\x09\x40\x4f\x3c\xcb\xb0\xe3\x92\x3d\xd0\xa9\x3c\x19"
- "\x51\xd8\x41\x22\x41\x2e\x05\xa3\x5c\x02\x7c\x0e\xdb\xd2\x01\xb4"
- "\x3d\xc1\x69\x8b\xfe\xc5\xf0\xd7\xf1\x4a\x84\x16\xca\xbe\xab\xb3"
- "\x13\xe8\x6b\xe7\xf4\x7d\xfa\x45\x35\xd9\x2c\xad\xf7\x81\xae\xaf"
- "\x05\x9e\x32\xb9\xd4\x16\x4a\x31\xce\x84\xb3\x33\x22\x5c\xf8\x1a"
- "\xe8\xdb\x06\x7d\xaa\x33\x02\xf9\xaf\xde\x7c\x1a\xd7\x27\x8f\xf1"
- "\xf5\xbe\x20\xd1\x6f\xc6\x2b\xa0\x23\x96\x68\x89\xa5\x1c\x64\xf4"
- "\x90\xb9\xeb\x3b\x37\xcd\x4a\x61\x63\x90\xac\x81\xd2\x37\xbe\x87"
- "\xff\xe3\x6b\x43\x5f\xed\xf7\x88\xbe\x71\x91\xfe\xd3\xf7\x71\xaf"
- "\xfb\x3f\xaf\x2e\x7d\xd5\xdf\x23\xfa\xc6\x17\xfa\x4f\xdf\x5f\x78"
- "\xdd\xff\x89\xf4\xc5\x71\x82\x34\x46\x90\xc6\x07\xa8\x57\xb8\x0e"
- "\x9d\x9f\xe5\x1a\x1b\xcc\xcf\x92\xd6\x45\x81\x36\x8a\x22\xf4\xe1"
- "\x0c\x6d\xd6\x3d\x4b\xc6\x9d\x91\xcd\x3b\x2f\xad\x89\x96\x60\x2c"
- "\x11\xe4\xd5\x06\xe0\xd5\x32\x3c\xb3\x22\xf2\x09\xf4\xc0\xc2\x36"
- "\x90\xd5\x77\xcc\xca\x74\x16\x81\x9e\x78\x7b\x36\xf1\xc2\x33\x39"
- "\xca\xf8\xe0\x74\xa2\x7e\x5a\xc7\x79\x27\xbc\x02\x3c\xeb\x00\x9b"
- "\xc8\xde\x4c\xf0\x0c\x6a\x68\x33\xc8\xd5\xce\x94\xa0\x05\x60\x63"
- "\x4b\x7c\xfb\x4b\x86\x9d\xd9\x43\xbd\xf2\xed\x0d\x4f\xbe\x5d\xe8"
- "\x85\x6f\xae\x7d\x06\x60\x9b\x32\xbe\x59\x19\xdf\x98\x5c\x7f\x05"
- "\x6c\x53\xe0\x9f\xc4\x37\x26\xd7\x81\x77\x8c\x6f\x2d\x8d\xcc\x06"
- "\x92\xe4\x3a\xda\x3f\xc8\xbb\xea\x44\xb0\xe7\x72\x1f\x6f\x61\x7c"
- "\xc3\xb9\xed\xc4\x81\xf2\x6d\x5e\xa5\xa7\xdd\xf3\xcb\x89\xbe\xd9"
- "\x3d\xf3\x7f\x8c\x76\x8d\xbb\xdd\x83\xf7\x17\xc0\xce\x71\x06\xaf"
- "\x4d\x6a\xf3\x6b\x1c\x3d\x7f\xa6\xa7\x0d\xf3\xcb\x30\x5e\xa7\x5f"
- "\x64\x0f\xdc\x86\x99\xcf\xe6\xdb\x76\x6c\xe8\xcd\x7e\x99\xef\xf4"
- "\xb4\x5f\xe6\xd7\x71\x3b\xe5\x97\x11\x17\x4c\x68\xbf\xcc\x6f\xe2"
- "\xe9\xbf\x30\xba\xa7\xbb\xec\x17\x9e\x7e\x01\xfd\x94\xe5\xfe\x72"
- "\xea\xc0\x6c\x96\x7b\xaf\xb3\xcd\x12\xd5\x87\xcd\x12\xf5\x6f\x66"
- "\xb3\xfc\xca\x6b\xfc\xcb\x9b\x3a\x55\x92\xf9\xbf\x9c\xe9\xbf\xcc"
- "\x4f\xb0\xdf\xd4\xa9\xfd\xd1\xf7\x57\x56\xff\xe9\xfb\x1b\xaf\xe7"
- "\x1f\xfa\xd7\xa9\x0b\xea\x5c\x3a\x75\x41\x9d\x77\x9d\xba\x60\xc6"
- "\x4d\x9d\xda\x9b\x4e\xfd\x75\x8c\xff\x3a\x75\x81\xda\x53\xa7\x3e"
- "\xb5\xda\x37\x9d\xba\xa0\x68\xf0\x75\xea\x82\x6e\xf3\xd0\x4f\xa5"
- "\xf0\x3a\xfd\xe6\xc8\xc0\x75\xea\x53\xb3\xbc\xeb\xd4\xa7\x1e\xf7"
- "\xd4\xa9\x4f\x8d\xe7\xba\xf3\xa9\x2c\xae\x53\x9f\x8a\xe6\xe9\xbf"
- "\x39\xec\x9e\xee\xd2\xa9\x3c\x9d\xeb\xd4\xa7\xf2\x06\xa6\x53\xc7"
- "\x5d\x67\x9d\xaa\xed\x43\xa7\x6a\xff\xcd\x74\xea\xd3\x2d\x37\x65"
- "\x7e\x7f\x32\xff\xa9\x32\xff\x65\x7e\xa2\xd7\xf3\x8f\xfd\xcb\xfc"
- "\x67\x0e\xb8\x64\xfe\x33\x07\xbc\xcb\xfc\x67\x7e\x7c\x53\xe6\xf7"
- "\x26\xf3\x17\x4e\xf5\x5f\xe6\x3f\xa3\xf0\x94\xf9\x8b\x5f\xf4\x4d"
- "\xe6\x3f\x93\x3d\xf8\x32\xff\x99\x6e\xfb\xff\x16\x2f\xe0\x75\x4a"
- "\xfc\x70\xe0\x32\x7f\xf1\x83\xde\x65\xfe\xe2\x19\x9e\x32\x7f\xb1"
- "\x86\xcb\xf6\xc5\x3a\x2e\xf3\x17\x47\xf2\xf4\xc4\x2a\xf7\x74\x97"
- "\xcc\xe7\xe9\x5c\xe6\x2f\xce\x1a\x98\xcc\x0f\xbd\xce\x32\x5f\xdd"
- "\x87\xcc\x57\xff\x9b\xc9\xfc\x24\xab\xff\x32\xe9\xb9\x04\x97\x4c"
- "\x7a\x2e\xc1\xbb\x4c\x7a\xb6\xe6\xa6\x4c\xea\x4d\x26\x2d\x2e\xf1"
- "\x5f\x26\x3d\x5b\xea\x29\x93\x52\x02\x7d\x93\x49\xcf\xdd\x3a\xf8"
- "\x32\xe9\xb9\xf1\x9e\x32\xe9\x39\x1b\xaf\x53\xf2\x53\x03\x97\x49"
- "\xcf\x1d\xf2\x2e\x93\x9e\x3b\xea\x29\x93\x9e\x13\xd7\xcc\x52\x14"
- "\x5c\x26\x3d\x67\xe6\xe9\xc9\x0b\xdc\xd3\x5d\x32\x89\xa7\x73\x99"
- "\x94\xd2\xdf\xfe\x07\x86\xfd\x1a\x4d\x37\xec\xbf\x20\x61\xff\xf9"
- "\x94\x8f\xcb\x24\xec\x3f\xcf\xf7\x39\x97\xcd\xb2\xff\x36\x83\x28"
- "\x0a\x31\xe6\x06\xf4\x77\xdd\x6f\x10\xfb\x4b\x8e\xe3\xfe\x03\x55"
- "\x03\xc8\xb0\x26\x51\xa6\x65\x82\x4c\x6b\x82\x7b\xf4\x49\x75\xc7"
- "\x2c\x3b\xca\x22\x8c\x45\x80\xf7\x5c\xb6\xd9\x02\xf1\xec\xe6\x80"
- "\xce\x55\x35\x89\xe7\xaa\x92\x7a\x9e\xab\x2a\x73\x3b\xbf\x83\x7d"
- "\x23\x38\x5b\x16\x82\x6b\xc1\x20\xdf\x44\x39\x56\x15\xe8\x50\x8a"
- "\x72\xec\x12\xc8\xb1\x4b\xae\x3e\x81\x72\xec\x02\xc8\xb1\xb6\x97"
- "\x22\xc6\xa2\x2c\xeb\x79\xa6\x8a\xaf\xfd\x32\x39\x96\xdf\x4d\x8e"
- "\x3d\xd7\x4d\x8e\x3d\x0b\x72\x2c\x11\xe4\x58\x90\xab\x3f\xdc\xdd"
- "\x40\xe4\x73\x16\x41\x9f\x00\x39\xf6\xfb\x4b\x28\xc7\x0e\xfa\x29"
- "\xc7\x96\x94\x7b\xf6\x87\x17\x6e\xf5\xad\x3f\x3c\x3f\xc1\x5b\x7f"
- "\xe8\x2c\xf2\xb7\x3f\x3c\x3f\xd5\xb3\x3f\xbc\x40\xc4\x3e\xfa\xeb"
- "\x81\xf7\x87\xe7\x4f\x74\xf5\x87\x17\xba\xf7\x87\xe7\xbf\xf1\xec"
- "\x0f\xcf\x57\x72\xdc\xbf\x10\xc6\xfb\xc3\xf3\x75\x3c\x3d\x25\xc1"
- "\x3d\xdd\xd5\x1f\x78\x3a\xef\x0f\x2f\x68\x6f\xae\xcf\xde\xa8\x3a"
- "\x3a\x75\xcd\xcd\xf5\xd9\xfe\xc6\x65\x2f\x4c\xf5\x7f\x5c\xb6\xf4"
- "\x3a\xad\x7f\x7f\x9f\xe6\x92\x53\xab\xfd\xa7\xef\xf2\xeb\xb4\xfe"
- "\xfd\x7d\x9a\x57\x58\x76\x05\xeb\xdf\xba\x3e\xd7\xbf\xfb\xb6\x63"
- "\x56\x4c\xad\xee\xb2\xe1\x57\x4c\x95\xf6\x6e\xf6\xb4\xe1\xd3\xfe"
- "\xe4\x79\x76\xea\xc5\xf9\xdd\xcf\x4e\xf5\x67\xdb\x3b\xfe\x47\xd9"
- "\xf6\xcb\x0b\xfd\xb7\xed\xd3\xd2\x3d\x6d\x99\x15\x27\x7c\xb3\x65"
- "\xd2\xce\x7b\xb3\x65\x1c\x7e\xdb\xf6\x2b\x88\xa7\x2d\xb3\xa2\x5a"
- "\xe4\xff\x9d\x03\xb7\x65\x56\xec\xf0\x6e\xcb\xac\x78\xd7\xd3\x96"
- "\x59\x91\xc7\x6d\x96\x15\x56\x6e\xcb\xac\x28\xe3\xe9\x2f\x6a\xdd"
- "\xd3\x5d\xb6\x0c\x4f\xe7\xb6\xcc\x8a\x96\x9b\xeb\xb6\x37\xaa\x2d"
- "\xb3\x32\xfe\xa6\xae\xed\x4f\x17\xa4\x13\xff\x75\x41\xc6\xce\x9b"
- "\xba\xb6\x3f\xfa\xae\x2c\xf5\x9f\xbe\x99\x5e\xe3\x5f\xf5\xaf\x6b"
- "\x57\x6d\x75\xe9\xda\x55\x5b\xbd\xeb\xda\x55\xb7\x7a\xea\xda\xcc"
- "\x7d\x37\x75\x6d\x5f\xba\x36\xc3\xee\xbf\xae\x7d\xd9\xea\xa9\x6b"
- "\x5f\x99\xeb\x9b\xae\x5d\xf5\xd4\xe0\xeb\xda\x55\xa9\x9e\xba\xf6"
- "\x95\x68\x91\xff\x45\x03\xd7\xb5\xaf\x8c\xf6\xae\x6b\x5f\xb9\xd3"
- "\x53\xd7\xae\x6a\xe3\x3a\xf5\x95\x39\x5c\xd7\xbe\x22\xa6\x67\x16"
- "\xba\xa7\xbb\x74\x2d\x4f\xe7\xba\xf6\x95\x84\x9b\xeb\xb9\x37\xaa"
- "\xae\xcd\xf2\x1a\xff\xf0\xa6\x2e\x90\x74\xc1\x2b\xa9\xfe\xeb\x02"
- "\x7d\xb8\xff\xba\xc0\xb8\xdd\xa5\x0b\x8c\xdb\xbd\xeb\x02\xe3\x9d"
- "\x9e\xba\x40\x5f\x73\x53\x17\xf4\xa5\x0b\x56\x2b\xfc\xd7\x05\x86"
- "\x16\x4f\x5d\x90\xfd\x6b\xdf\x74\x81\x71\xc9\xe0\xeb\x02\x63\xa6"
- "\xa7\x2e\xc8\x9e\x2e\xf2\xff\x8d\x81\xeb\x82\xec\x09\xde\x75\x41"
- "\xf6\x64\x4f\x5d\x90\x4d\xb8\xcc\xcf\x4e\xe0\xba\x20\x3b\x8c\xa7"
- "\xeb\x4b\xdd\xd3\x5d\xba\x80\xa7\x73\x5d\x90\x9d\x74\x73\x9d\xf7"
- "\x46\xd5\x05\xa6\x2a\xff\x65\xd5\xab\x09\x2e\x59\xf5\x6a\x82\x77"
- "\x59\xb5\xa6\xc6\x53\x56\xe5\xbc\x7c\x53\x56\xf5\x25\xab\xb2\x33"
- "\xfd\x97\x55\x6b\xba\xad\xff\xe6\xfa\xb8\xfe\xfb\xaa\xd7\xf5\x5f"
- "\xff\x65\xd5\xab\xdd\xd6\x7f\x5f\x15\xd7\x7f\x73\x66\x0c\x5c\x56"
- "\xbd\x7a\xc8\xbb\xac\x7a\xb5\xdb\xfa\xef\xab\xe2\xfa\x6f\xae\xb8"
- "\xfe\xfb\xaa\xb8\xfe\x9b\x33\xdd\x3d\xdd\x25\xab\x78\x3a\x97\x55"
- "\xb9\x57\xb8\xfe\x9b\x67\x74\xad\xff\xe6\xb1\x33\x03\x42\x69\x7e"
- "\x44\xcf\xf5\xdf\xb5\x17\x3d\xfd\x98\xe4\xbe\xc6\xd6\x82\xb1\x5f"
- "\xb4\xf1\xb3\xe9\xbd\xae\x0b\x8f\xce\x8f\xb8\xb9\x2e\x3c\x18\xeb"
- "\xc2\x6b\xcd\x9e\xfd\x24\x7f\xb2\x6f\xfd\x24\xef\xc1\xc1\x5f\x17"
- "\xce\x9b\xe3\xd9\x4f\xf2\x35\x22\x26\xfc\x58\x17\xce\xbb\xec\xbd"
- "\x9f\xe4\xcb\x3c\xfb\x49\x9e\xb8\x2f\x37\x3f\x92\xf7\x93\xbc\x66"
- "\x9e\x9e\x9b\xe0\x9e\xee\xea\x27\xb9\x6e\xeb\xc2\xf9\xd1\xbe\xe8"
- "\x74\x87\x2a\x2f\x09\x75\x74\x64\xfd\x43\xce\x2e\x3c\xa7\x8b\x78"
- "\xee\x4d\xa7\x3f\xc3\x65\x3f\xe2\xb8\x73\xdb\x6c\x45\xbf\x3a\xbd"
- "\x49\xd4\xe9\x49\x3d\x75\xba\xa4\xcf\x11\xcf\x1b\x7d\x5a\x13\xee"
- "\x86\xeb\x01\xe9\xf3\xbb\xcd\x57\x82\x6b\xc4\xb4\xa7\x3e\xf7\x17"
- "\xd7\x05\xd7\xe9\xfc\xcb\xf7\x69\x4d\x38\x7f\x8e\xff\x63\xbb\xdf"
- "\x5e\xa7\xf3\x2f\xdf\xa7\x79\xea\x82\x2b\x38\xff\x52\xd4\xe7\xf9"
- "\x97\x9b\x73\x13\x48\xdf\xc2\x18\xff\xe9\x5b\x5c\xe1\xbf\xbd\xff"
- "\x5a\x8a\xcb\xde\x7f\x2d\x45\xb2\x6d\x50\x16\x32\xbf\x3b\x20\xff"
- "\x8a\xd2\xe0\xba\x44\xc8\x6f\xd3\x98\xdf\x71\xa5\xa5\xe9\x08\xd1"
- "\xe9\xd1\xde\x29\x39\x1e\x97\xe9\x6e\xef\xac\x5b\x2d\xd9\x3a\x71"
- "\x68\x07\x81\x5d\x83\x36\x8d\x64\xe3\x97\xb4\xf6\xb3\x1f\x74\xc2"
- "\x6c\x05\x8e\x09\x3a\x83\xf3\x92\xfe\xfd\xc7\x03\x45\x5b\xfd\x1f"
- "\x0f\x94\x74\xdb\xff\xf6\x3b\x1f\xf7\xbf\xbd\xe6\x75\xff\x9b\xff"
- "\xe3\x81\xd7\xba\xed\x7f\xfb\x9d\xb8\xff\x6d\xdd\x7d\x03\xb7\x73"
- "\x5e\xeb\x63\xff\xdb\x6b\xdd\xf6\xbf\xbd\x26\xee\x7f\xfb\x9d\xb8"
- "\xff\xed\x35\x71\xff\xdb\xba\xa9\xee\xe9\x2e\x3b\x87\xa7\x73\x3b"
- "\xe7\x77\x3e\xed\x7f\x03\x3b\x27\xe5\x0a\xec\x1c\xe5\xf7\xc7\xce"
- "\x19\x7f\x83\xd8\x39\xbf\x37\xfa\xa0\x27\x92\xba\xe9\x09\xc5\xff"
- "\x2c\x3d\xf1\xbb\x2b\xd8\xfb\xb6\xbe\xcf\xfd\xff\x8c\xbe\x85\x6e"
- "\xf4\x45\x19\x2d\xd2\xd6\x39\x7e\xb6\xc2\x2f\xfa\x82\x6c\xde\xa4"
- "\xff\xbe\xd0\xf6\xf7\x55\xfe\xd3\xf6\xf5\x69\x37\x6d\x9c\xfe\xe8"
- "\xfb\x87\x08\xff\xe9\xfb\xbf\xcb\xfc\xb7\x71\x36\xa4\x7e\xdc\x65"
- "\xe3\x6c\x48\xed\x6e\xe3\xa0\x4d\x33\xd7\xce\x6d\x9d\xdf\x82\x8d"
- "\x52\xb0\x0c\xec\x9d\x0c\x42\x2c\x4d\xef\x91\x42\xb0\x79\x0a\xce"
- "\x81\xdd\x93\x0a\x76\x8f\xe3\x6d\xd1\xee\x79\xe3\x84\xa7\xdd\x53"
- "\xba\xb2\x57\xbb\x27\xd8\x65\xf7\x38\xc0\xa6\xe9\x7c\x7b\xb6\xa2"
- "\xe4\x9c\x9b\x0d\xf4\x7c\x4f\x1b\xa8\xa3\x08\x74\xce\x84\xd9\xca"
- "\x4e\xb0\x83\xfa\xb2\x81\x18\xef\xbb\xd9\x41\xdf\x3f\x1b\xe8\xf5"
- "\x35\xfe\xdb\x40\x6f\x74\xf3\x21\xba\x71\xb4\x6f\x36\xd0\x86\x89"
- "\x5e\xe7\x7a\xfc\xb6\x81\x36\x44\x7b\xda\x40\x1b\x15\x22\x2e\x46"
- "\x0f\xdc\x06\xda\x70\xca\xbb\x0d\xb4\xe1\xac\xa7\x0d\xb4\xc1\xcc"
- "\x6d\x9d\x8d\x1a\x6e\x03\x6d\x38\xcc\xd3\x4b\x35\xee\xe9\x2e\x1b"
- "\x88\xa7\x73\x1b\x68\xe3\x78\x1f\xd7\x6f\x92\x1c\xa0\x63\xaf\xff"
- "\xbe\xb9\xbe\xd6\x6f\x06\x6b\xdf\xdc\xdd\x37\xc8\xfa\x4d\x59\xde"
- "\x4d\x3d\xdd\x97\x1e\xd9\x18\xed\xbf\x1e\xd9\x74\x9d\xf6\xff\x7f"
- "\x9f\xf4\x74\x59\x9d\xff\xf4\xdd\xd2\xe7\xfe\xff\xbe\xf5\xf4\x9b"
- "\x6d\xae\xb9\x88\x37\xdb\x06\x36\x17\xf1\xe6\x12\x4f\x9d\xbc\x35"
- "\xe8\xe6\x5c\x84\xaf\x7a\x78\x73\xa4\xff\x7a\xf8\xcd\xa9\x9e\x7a"
- "\xf8\xad\x37\x7d\xd3\xc3\x6f\xfe\x75\xf0\xe7\x22\xde\x34\x7b\xea"
- "\xe1\xb7\x0a\x79\x9d\xb6\xec\x1b\xb8\x1e\x7e\x6b\xa9\x77\x3d\xfc"
- "\xd6\x4a\x4f\x3d\xfc\xd6\x4c\xae\x6f\xdf\xda\xca\xf5\xf0\x5b\x0b"
- "\x78\xfa\x16\xb3\x7b\xba\x4b\x0f\xf3\x74\xae\x87\xdf\xda\x3e\xb0"
- "\x35\x97\x71\x37\xe8\x9a\x8b\xf6\xdf\x6c\xcd\x65\x9b\xea\xa6\x9e"
- "\xe8\x4f\x4f\xbc\x65\xf6\x5f\x4f\xbc\x9d\xea\xbf\x9e\x28\x0f\x77"
- "\xe9\x89\xf2\xf0\x81\xe9\x89\xff\x7a\xcd\x53\x4f\xfc\xf1\x47\x37"
- "\xf5\x84\xaf\x7a\x62\xdb\x3c\xff\xf5\xc4\x7f\x2d\xf0\xd4\x13\xe5"
- "\x1f\xfa\xa6\x27\xfe\xeb\xe8\xe0\xeb\x89\xff\x6a\xf6\xd4\x13\xe5"
- "\x7b\x78\x9d\xde\xfe\x66\xe0\x7a\xa2\xfc\x0f\xde\xf5\x44\xf9\x26"
- "\x4f\x3d\x51\xae\xe3\xfa\xa0\xbc\x8a\xeb\x89\xf2\x35\x3c\xfd\xed"
- "\x66\xf7\x74\x97\x9e\xe0\xe9\x5c\x4f\x94\x1f\xbe\xb9\xdf\xee\x46"
- "\xdd\x6f\xf7\xe7\x68\xff\x65\xd9\xf6\x2a\x97\x2c\xdb\x5e\xe5\x7d"
- "\xbf\xdd\xf6\x07\x3d\xf7\xdb\xfd\xf9\x9b\x9b\xfb\xed\xfa\x92\x55"
- "\xe5\xcd\xfe\xcb\xaa\xed\x4a\x4f\x59\xb5\xc3\xc7\x78\x90\xdb\x5f"
- "\x1d\x7c\x59\xb5\x7d\xbd\xa7\xac\xda\x21\xc6\x80\xfc\xf3\xbb\x03"
- "\x97\x55\x3b\x1e\xf6\x2e\xab\x76\xcc\xf2\x94\x55\x3b\xc4\xf8\x8f"
- "\x3b\xd2\xb9\xac\xda\x21\xc6\x7f\xfc\xf3\x1e\xf7\x74\x97\xac\xe2"
- "\xe9\x5c\x56\xed\xf0\xc9\xff\xbf\x6b\x7d\xcd\x2f\x9b\xf6\x1a\xac"
- "\xaf\x0d\x96\x4d\x7b\xa3\xac\xaf\xfd\xe5\xe6\xfa\x4f\x9f\xf6\xec"
- "\x8e\x2b\xf0\xfb\xbf\xb3\xcf\xf5\x9f\xbe\x75\xc0\x6e\x85\x4b\x07"
- "\xec\x56\x78\x5b\x9f\x28\x00\x0c\x15\x82\x3d\x9a\x7f\x8e\x28\x7e"
- "\x8b\xeb\x13\x87\x6b\x48\x11\xae\x4f\x2c\x93\xd6\x27\x36\x89\x36"
- "\xee\xae\x97\x3d\x6d\xdc\xbf\xde\xda\x9b\x8d\x8b\xb6\xad\x13\xec"
- "\x56\x47\xf7\x75\x89\xdf\xf4\xae\x3b\x3a\x82\xf3\x52\x2e\xbf\x3d"
- "\x5b\x39\x10\xdd\xb1\x71\x15\xd7\x1d\x1b\xbe\x57\xba\xe3\x9d\x08"
- "\xff\x75\xc7\xae\xe9\x9e\xba\x63\xf7\x5f\x7d\xd3\x1d\xbb\xf6\x0d"
- "\xbe\xee\xd8\x55\xe7\xa9\x3b\x76\x97\xf1\x3a\xed\xdc\x3b\x70\xdd"
- "\xb1\x7b\xb5\x77\xdd\xb1\xfb\x55\x4f\xdd\xb1\x5b\xdc\x6b\xba\x7b"
- "\x27\xd7\x1d\xbb\x53\x79\xfa\xce\x0a\xf7\x74\x97\xee\xe0\xe9\x5c"
- "\x77\xec\xae\x1c\xd8\x7c\x48\xe8\x0d\x3a\x1f\xa2\xfe\x37\x9b\x0f"
- "\x79\xf7\x0a\xce\xbf\xfd\xed\x40\x75\xd7\xfe\xf9\xbf\x1d\xe8\x31"
- "\x5e\xcf\x00\x5b\xb7\x95\xaf\xb9\x76\x8d\xd7\xad\xc7\x45\x59\xf6"
- "\xb7\x1f\x7b\xca\xb2\x77\x4f\x78\x93\x65\x7d\xad\xab\xe2\xf8\xdc"
- "\x09\x72\x0e\x63\xad\xf9\xb5\xae\x9a\xf1\x7d\x92\x5f\xbb\xeb\xfc"
- "\x97\x5f\x7f\xeb\xe6\xff\xb4\xc2\x47\xff\xa7\x7f\xf3\xea\xff\xd4"
- "\xe1\xf7\x1e\xfa\xbf\x75\xf3\x7f\x5a\x21\xfa\x3f\x7d\xd7\x8f\x73"
- "\x71\x15\x0f\x7a\x97\x5f\x15\xdd\xfc\x9f\x56\x88\xeb\xa7\x15\xa2"
- "\xff\xd3\x0a\xd1\xff\xe9\xbb\xa5\xee\xe9\x2e\xf9\xf5\xae\xdb\xb9"
- "\xb8\x8a\x3e\xfd\x9f\xd2\xc2\xd8\x94\x12\xb9\xb0\x13\xae\x0a\xa8"
- "\xe3\x68\xc0\x80\x19\xfe\xaf\x02\x3e\x8e\x80\xff\xeb\xbc\xf5\x31"
- "\x5b\x70\x6c\x8a\x60\x22\x18\xe7\x57\x66\xb1\x7d\x67\x36\x8f\x71"
- "\x60\x3d\x1d\x9c\x57\xb1\x29\xa1\x8e\xa1\x33\x05\x9a\x42\x80\x2f"
- "\x29\x2c\x3e\x1e\xe4\x0f\x01\xcc\x68\x33\x48\xc8\x39\xd9\xde\x70"
- "\x29\x1f\xd4\x37\xa4\x51\x56\x71\x14\xcb\x68\xcf\xdd\x1b\x01\x6d"
- "\xc9\xf3\x5a\x57\x28\x2b\xee\x4f\x63\xc9\x6a\x07\xfd\xda\xbc\xac"
- "\x95\x34\xc9\xf6\xbe\x18\xda\x32\x74\x26\x35\x24\x10\xb4\xb1\x76"
- "\x8e\xb1\x29\xb0\x4c\xf3\xb2\x0e\x7c\x36\x0f\x9f\x39\xa1\x8e\xfa"
- "\xa5\x44\x5e\xdc\x3a\x54\x09\xb2\x20\xd0\xd0\x46\x9b\x97\x3b\xa0"
- "\xce\x99\x0e\xf2\x8f\xb1\xf5\x8a\x77\x36\x40\x9a\x93\x68\x30\x26"
- "\x1e\x96\x01\x36\x26\xd4\x67\xef\xca\xcd\x90\xbf\xb7\x3a\xbc\xfa"
- "\x17\x12\x19\x38\x91\x5a\x07\x86\x9b\xbd\x5e\xcf\xbf\x85\x66\x8f"
- "\x25\xe6\x49\x40\x3b\x2d\x91\xf7\xf6\x7c\x60\xdf\xf9\x7b\x54\x1f"
- "\x32\x51\x89\xf1\x34\x0d\x6f\x10\xf9\x3a\x61\xa8\x72\x7f\x16\x8b"
- "\x67\x69\x6b\xcf\xfd\x7b\x99\x55\x36\xa1\x02\x69\x8e\x31\xd3\x30"
- "\xe6\x2a\xe0\x86\x40\xfa\x9e\x7d\x99\x84\x74\xe7\x45\x5a\xd2\xd2"
- "\x45\xda\xf4\x25\x4b\x93\x97\xaf\x4c\xd7\x4e\x48\x1a\x46\xe6\x2d"
- "\x5f\xae\x5d\xba\x68\xd9\xcb\x5a\xf7\x27\x0f\x68\x93\x96\xac\x58"
- "\xf4\x4c\x6a\xf2\xe4\xa5\x8b\x75\xc3\xa0\x4e\xc4\xad\x1e\x61\x58"
- "\x17\x21\xf7\xef\xe6\xcd\xbf\x23\xe4\xf7\x23\x89\x02\xeb\xd5\x9e"
- "\xfb\xdf\xe3\xa5\x98\x7a\xc5\xaf\xd3\x36\x39\xe4\x31\x80\x0c\x5c"
- "\xa7\x1f\x8a\x79\xa3\xb6\x40\xbd\x36\x43\xbd\xa1\x8e\x50\xe7\xff"
- "\x8e\x97\xea\x2c\x61\xc2\x80\x98\xd0\xb7\x02\x06\xff\xfb\xc5\x50"
- "\xfb\xd0\x9f\x51\x9a\x80\xed\x6b\x83\x7e\x22\x83\xb4\x7d\xa8\x97"
- "\x40\x06\xa4\xc0\xbb\x85\x12\xc6\xf0\x5d\x5a\x1c\x1b\xd5\x8e\xfd"
- "\x84\xa6\xfc\x94\xf7\xa9\xca\xa4\xf9\x11\x32\xc2\x63\xfa\xfd\x77"
- "\x85\x2b\xa6\x5f\x25\x8b\x2d\x07\xf5\x68\x81\xf4\x3a\x2b\x69\x3f"
- "\x8c\xe9\x18\x5b\x12\x63\xbd\x62\x9d\xa1\x5d\xa0\x17\xa9\x99\x9a"
- "\x44\xec\xe7\xbd\x59\x21\xe4\xbd\x6f\xb3\x28\x2e\x91\x38\x07\xed"
- "\xa4\xf9\x6f\x56\xd4\xb6\xb5\x91\xd0\x6c\xdd\x62\x3a\xe4\xef\x87"
- "\x42\x1d\x4b\x92\x31\x26\xb9\x90\xff\xbe\x8d\xe6\x57\xb4\xcd\x9f"
- "\x48\xd4\xed\xb9\x95\x91\x6e\xb1\x05\x15\x03\xe3\x7f\x25\xe3\x3f"
- "\xf2\x11\xea\x23\xf2\xb1\x32\x6b\x5f\x7a\x4f\x3e\x76\xe1\xef\x4f"
- "\x02\x39\x08\x58\xa0\x2a\xfd\xce\x38\x27\xa7\x23\xf6\xdd\x0b\x86"
- "\x14\x72\x2f\xa3\xdd\x7b\x53\x85\x62\x7d\x89\x50\xa8\xaf\xa2\x85"
- "\xfa\x3d\x40\xb3\x99\xc5\x19\x44\xbb\xd0\xa9\x26\x45\x97\x48\x94"
- "\xad\x48\xbf\x33\x58\x66\x94\x81\x6d\x21\x07\xbd\x11\x05\x32\x23"
- "\x4a\xec\xef\x33\x91\x8e\xff\x6a\x21\x24\x76\x05\x21\x5f\x4f\x23"
- "\x01\x9b\xe1\xbd\x81\xb5\xe7\x3d\xc2\xe4\x44\x6e\x65\xc5\x16\x78"
- "\x17\x63\x43\x0e\xf0\xfd\x18\xaf\xfd\xae\xab\xdd\x86\xa8\xde\xdb"
- "\xfd\x7e\xa4\x50\x6c\x50\x0b\x85\x86\x99\xb4\xd0\x30\xb5\x67\xbb"
- "\x0d\x51\xbc\xdd\x81\xad\x57\xa1\xdd\x3c\xe6\x62\xee\x7b\x3b\xfd"
- "\x6b\xf7\xfb\x5e\xe7\xff\xdc\xda\xed\x85\xdf\xff\x18\x0f\xed\x06"
- "\x7e\x1b\x80\xdf\x86\x5e\xf8\x6d\x10\xf9\x3d\xbc\x71\xf0\xdb\xfd"
- "\xbe\x8d\xb7\xfb\xfd\x72\xff\xda\xfd\x0f\xaf\xf2\xcf\xd5\x6e\xa3"
- "\x17\x7e\x9b\xc3\x85\x62\x23\xf0\xdb\x08\xfc\x36\xf6\xc2\x6f\xa3"
- "\xc8\xef\x11\x9f\x0c\x7e\xbb\xff\xc1\xe7\xff\x73\xff\xb1\xd5\xbf"
- "\x76\x9b\x23\x7c\x68\xb7\x17\x7e\xef\x0b\x83\x76\x03\xbf\x8d\xc0"
- "\x6f\x63\x2f\xfc\x36\x8a\xfc\xbe\xbf\x60\xf0\xdb\x6d\xb6\xf2\x76"
- "\x9b\x4b\xfd\x6b\xf7\x3e\x6d\xff\xed\xce\xf6\xc2\xef\x7f\xaa\x84"
- "\xe2\x6c\xe0\x77\x36\xf0\x3b\xbb\x17\x7e\x67\x8b\xfc\x7e\xf2\x91"
- "\xc1\x6f\xf7\xbe\x7a\xde\xee\x7d\x25\xfe\xb5\xfb\x9f\x9a\xfe\xdb"
- "\xad\xaf\x00\x99\xdd\x83\xe7\x96\xcc\x68\x32\xe5\x12\xb6\x7f\x7f"
- "\x16\x0d\xd6\x57\x0c\xcf\x36\xca\x1c\x2a\x7d\xe5\xf0\x06\x22\x87"
- "\xb1\x5f\x4a\xa8\x95\x04\x41\x5b\x41\x2f\xe6\xc4\xe3\xaf\x00\xe5"
- "\x38\x40\xf6\x3b\x55\xfa\x3d\x1d\x85\xb1\x33\x7f\xfb\x2c\xd1\x1a"
- "\x6c\x44\x5d\xab\xb7\x12\xbd\x8e\xda\x6a\xc9\x09\x12\x6c\x25\x72"
- "\x9c\xc7\xfa\xb8\xa5\x82\x2c\x4b\xa3\x14\xca\x4e\xc6\xf1\x62\xf1"
- "\x69\x12\x05\x36\xb1\x91\x82\xfe\x28\x11\x88\x16\xca\x8f\x42\x5a"
- "\x42\xd9\x4f\x84\xce\x23\xb2\xf7\x9f\xb1\x13\xa4\x27\xd2\x16\xc6"
- "\x96\x51\x8c\xae\x6d\x84\xfc\xfc\x49\x4e\xd7\x8d\xcf\x0e\x94\xae"
- "\xfb\xa3\xb8\x5d\xa9\xaf\xb3\x58\x3b\xf0\xdc\x87\x1a\xcf\x35\x03"
- "\xbd\x5a\x6a\x75\xad\x30\x0e\xf9\x67\x09\x2d\xd2\x9b\x05\xd0\x59"
- "\x03\x2c\xd7\xeb\xfe\x37\x37\x79\x1a\x0d\x32\xb3\x07\xd6\x5c\xf4"
- "\x3e\xd0\x42\x83\x0d\xd1\x9c\xde\x86\x69\xc3\x1b\x02\x5b\x7b\xa7"
- "\xb7\x21\xda\x01\x3a\xc7\xa9\x32\x4c\xf5\x9d\xde\x07\x8e\x78\xd2"
- "\xdb\xa0\xbe\x36\xf4\xc6\xa8\xe3\x48\x6f\x43\xbc\x27\xbd\x0f\x2c"
- "\xe0\xf4\x3e\x40\x68\x91\x21\x46\x00\x5d\x39\xc0\x72\xbd\x9e\x7f"
- "\x74\xa3\x37\xe0\xbb\xa7\x0e\x73\xd1\xfb\x83\x05\x40\x6f\x11\xdf"
- "\x06\xc0\xf7\xf0\x46\x2f\xf4\x06\x7c\x1b\x00\xdf\x86\x01\xe0\xfb"
- "\x83\x19\xdd\xe8\x7d\x8d\xf0\xfd\x81\x18\xff\xc9\xd0\x0d\xdf\x07"
- "\xab\x39\xbd\x0f\xea\x80\xde\x80\x6f\xc3\x00\xf1\xfd\x41\x8a\x0f"
- "\xfa\x03\xf0\xdd\x53\x77\xba\xe8\xfd\xaf\x6a\x1a\x6c\x14\xf1\x6d"
- "\x04\x7c\x8f\xf8\xa4\x77\x7a\x1b\x01\xdf\x46\xc0\xb7\x71\x00\xf8"
- "\xfe\xd7\xbb\x9e\xf4\x36\x5e\x23\x7c\xff\xcb\xc8\xe9\x6d\xec\x86"
- "\xef\x7f\x4d\xe3\xf4\xfe\xc0\x4a\x8b\x8c\x80\x6f\xe3\x00\xf1\xfd"
- "\xaf\x7a\x1f\xe8\x0d\xf8\xee\xa9\xb3\x5d\xf4\xfe\x70\x1a\xd0\x5b"
- "\xc4\xb7\x11\xf0\x7d\x7f\x81\x17\x7a\x03\xbe\x8d\x80\x6f\xe3\x00"
- "\xf0\xfd\xe1\x84\x6e\xf4\xbe\x46\xf8\xae\xb2\x89\xf4\xee\x86\xef"
- "\xaa\xed\x9c\xde\x55\xf1\x40\x6f\xc0\xb7\x71\x80\xf8\xfe\x70\xa6"
- "\x0f\x76\x02\xe0\xbb\xa7\xad\xe0\xa2\xf7\x47\xdb\x69\x70\xb6\x88"
- "\xef\x6c\xc0\xf7\x93\x8f\xf4\x4e\xef\x6c\xc0\x77\x36\xe0\x3b\x7b"
- "\x00\xf8\xfe\xe8\x0f\x9e\xf4\xce\xbe\x46\xf8\xfe\x28\x91\xd3\x3b"
- "\xbb\x1b\xbe\x3f\x0a\xe7\xf4\xfe\xd0\x4c\x8b\xb2\x01\xdf\xd9\x03"
- "\xc4\xf7\x47\x5e\xcf\xff\xf6\x65\x9f\xac\xd8\x44\x94\x9e\x34\xaf"
- "\xd6\x5e\x3d\x1b\xa5\x3a\xe8\xfa\xd8\x28\x1f\x1f\xee\xdd\x46\xf9"
- "\xb8\x84\xd3\xfc\xe3\xa9\xfe\xd9\x28\xd5\x91\xfe\xd8\x28\x3d\x69"
- "\x5e\xb3\xfe\xea\xd9\x29\x35\xab\xaf\x8f\x9d\x52\x33\xb3\x77\x3b"
- "\xa5\x46\xc1\x69\x5e\x5d\xee\x9f\x9d\x52\xb3\xd5\x1f\x3b\xa5\x27"
- "\xcd\x2d\xca\xab\x67\xab\xd4\x9e\xbf\x3e\xb6\x4a\x6d\x65\xef\xb6"
- "\x4a\x6d\x26\xa7\x79\x6d\xb8\x7f\xb6\x8a\x25\xcc\x1f\x5b\xa5\x27"
- "\xcd\xeb\xb2\xae\x9e\xbd\x52\x97\x7c\x7d\xec\x95\xba\xa8\xde\xed"
- "\x15\x8b\x38\xfe\xb1\x94\xf8\x67\xaf\xd4\xf9\x30\xfe\xe9\x69\xaf"
- "\xf4\xa4\xf9\x21\xdb\xd5\xb3\x59\x0e\x1d\xbd\x3e\x36\xcb\xa1\x6d"
- "\xbd\xdb\x2c\x87\x12\x39\xcd\x0f\x29\xfc\xb3\x59\x0e\x39\xfc\xb1"
- "\x59\x7a\xd2\xfc\xd3\xa4\xab\x67\xb7\x7c\x3a\xf7\xfa\xd8\x2d\x9f"
- "\x6a\x7a\xb7\x5b\x3e\x39\xcc\x69\xfe\x49\xa6\x7f\x76\xcb\xa7\x3a"
- "\x7f\xec\x16\xa4\x35\xd2\x1c\x6d\x15\x4e\xf3\xcf\xa6\xd2\x10\x7d"
- "\x49\x27\xd8\x23\xc1\x40\xf7\xe0\x16\x22\xdf\x84\x34\xaf\xe7\x34"
- "\x77\x86\xe4\xc4\x03\x7d\x52\x90\x66\xac\x1d\xdf\x6a\x42\x9c\x85"
- "\xfa\x4a\x2a\x27\xd0\x16\x25\x39\x2d\x3b\xfc\xb0\xc3\x44\x42\xb4"
- "\xfa\x6c\xf8\xff\x33\xe6\x3f\x53\xab\xcf\x3d\x0e\x6d\x0c\xc0\x35"
- "\x0a\x47\xd1\x5c\x9b\x33\xd8\xa4\x3b\x2d\x3b\x92\x4d\xef\x98\x65"
- "\xeb\x04\x5b\x82\xbe\xa0\x09\xb3\xb4\xec\x24\x16\xc7\x47\xa4\xb6"
- "\xfe\xef\x44\x08\xc9\x79\xe2\x5e\x07\x89\xa0\xdf\x46\x84\x55\xa7"
- "\x5b\x89\x73\xb1\x46\x65\xc9\xac\x02\x5c\xec\x22\x71\xcd\xf4\x12"
- "\x3d\x19\xa1\xea\x0c\x5e\xbb\xd3\x19\x9c\x13\xe5\x2c\xca\xcb\x74"
- "\x04\xaf\xdd\xba\x23\xc3\x2a\x57\xd9\x49\x44\x6a\x13\xa5\xc5\xcf"
- "\x10\x45\x71\x23\x51\xae\x7b\x86\xa8\xd6\x35\x12\x75\x75\x53\x3d"
- "\xa9\x39\x53\x45\x6a\x5a\x8f\x92\x9a\x4b\x70\x75\xc0\x25\xc0\x65"
- "\x3c\x4a\xaa\x5b\x08\x99\x7b\x96\x10\x43\x13\xb5\xdd\xd3\x40\xc2"
- "\xaa\x1d\xf5\x04\xf7\xf1\x9e\x93\x1d\xb9\x55\x95\x48\xc2\xe8\x49"
- "\x0d\xa1\x8b\x35\x72\x78\xa6\xc0\x74\x8b\xc3\x46\xaa\x9b\xec\xf0"
- "\xfc\x70\x1b\x3c\x57\x18\x9a\xa0\x7c\xa1\x0a\xfd\xc5\xd9\xaa\x8d"
- "\x1f\x12\x47\xbe\xd3\x0a\x74\xae\x92\x6c\xb2\xe2\x0e\x12\xb5\x0e"
- "\xd8\x8c\x98\x89\xa3\x1c\x33\x5b\x3a\x06\x8a\x99\x23\xdc\xff\xd9"
- "\x0b\x9a\x91\x40\xef\x31\xc2\x0b\x09\xea\xd8\xa3\x5f\x51\xdc\xa7"
- "\x85\xeb\x33\xb5\x6d\x1f\x11\xcb\x1a\x81\xc4\xbd\x4c\xc8\x1c\x27"
- "\x21\x48\x13\x5c\x4b\x8e\xd5\x91\x50\xdc\x3f\x26\x7c\x1b\x31\xd2"
- "\xd2\x64\x23\xab\x1d\x50\xd7\x73\xf6\xae\xba\xd6\xae\xa9\x25\xf0"
- "\x6c\x4c\x6d\x8a\x95\xa8\x74\x44\x8d\x74\x06\x5b\xb4\x22\xb6\x99"
- "\x04\x2d\x6b\xa3\x14\x69\x8c\xb4\x45\x3a\x63\x79\x12\xed\x2d\x49"
- "\x36\x62\xb0\x13\xb5\x45\x0f\xbf\x99\xd4\x66\x21\xe7\x09\xd4\x31"
- "\x82\x06\x39\xad\x80\x8f\x79\x88\x09\xab\xec\x70\x34\xe0\x60\x24"
- "\xcd\xfd\xb4\x65\x33\xb4\x17\xd7\xf0\x07\xd6\xe6\xcf\x7c\x59\xff"
- "\xe8\x61\x13\xba\xf0\x6c\x88\xe6\x78\x3e\xaa\xa0\x21\x06\x75\x27"
- "\xd8\x7a\x1c\xcf\x81\xad\xfd\xe3\xd9\x30\xcd\x85\xe7\xcf\x47\xb8"
- "\xf0\x5c\x7f\xd1\x3b\x9e\xeb\x1f\xe7\x78\x36\xc4\xdf\x98\x78\xfe"
- "\xfc\x54\xdf\x78\xfe\xfc\x80\x77\x3c\x1b\x66\x4a\xf6\xee\xe0\xe0"
- "\xb9\x3e\xfc\xda\xe1\xd9\x10\xed\x1f\x9e\x3f\xb7\x7b\xe2\xf9\x73"
- "\x25\xc7\xf3\x67\x95\xfe\xe1\xf9\xa8\xd7\xf8\x07\x7d\xd9\xdb\x6e"
- "\x78\x16\xe5\xf3\x17\x87\x01\xcf\x20\x9f\x0d\xa2\x7c\x1e\xde\xe8"
- "\x03\x9e\xdd\xe4\xf3\xd1\x13\x2e\x3c\x7f\x71\xd0\x3b\x9e\xbf\xb8"
- "\x53\xc4\xf3\x0d\x2a\x9f\x8f\xbd\xdb\x37\x9e\x8f\xad\xef\x03\xcf"
- "\x55\xd2\x58\x62\x70\xf0\x7c\xac\xe5\x1a\xe2\xd9\x4f\xf9\x7c\xac"
- "\xca\x13\xcf\x47\xeb\x39\x9e\x8f\x16\xfa\x87\xe7\x2f\xbc\xee\x7f"
- "\xee\x6b\x2c\xe3\xc2\xb3\x51\x94\xcf\x5f\x6e\xa3\x21\x46\x90\xcf"
- "\x46\x51\x3e\x8f\xf8\xa4\x7f\x3c\x1b\xdd\xe4\x73\xc3\x5f\x5d\x78"
- "\xfe\xf2\x0f\xde\xf1\x7c\xfc\x3c\xc7\xb3\xf1\x06\x95\xcf\xc7\x5f"
- "\xed\x1b\xcf\xc7\x93\xbc\xe3\xd9\x38\x53\x1a\xa7\x0d\x0e\x9e\x8f"
- "\x57\x5e\x3b\x3c\x1b\xfd\x94\xcf\xc7\x4b\x3d\xf1\xdc\x50\xce\xf1"
- "\xdc\xb0\xc0\x3f\x3c\x7f\xe9\x35\xfe\x4f\x5f\xe3\x44\x37\x3c\x8b"
- "\xf2\xf9\x44\x3a\xe0\x19\xe4\xb3\x51\x94\xcf\xf7\x17\xf8\x80\x67"
- "\x37\xf9\xfc\x55\xb6\x0b\xcf\x27\x92\xbd\xe3\xd9\xba\x4f\xc4\xf3"
- "\x0d\x2a\x9f\xad\xf3\xfb\xc6\xb3\x75\x6a\x1f\x78\xae\x92\xc6\xc0"
- "\x83\x83\x67\x6b\xe1\x35\xc4\xb3\x9f\xf2\xd9\x9a\xe2\x89\xe7\xaf"
- "\x32\x39\x9e\xbf\x8a\xf4\x0f\xcf\x27\x8c\xfe\x8c\xc1\x5d\x78\xce"
- "\x16\xe5\x73\xd3\x74\x1a\x92\x0d\xf2\x39\x5b\x94\xcf\x4f\x3e\xd2"
- "\x3f\x9e\xb3\xdd\xe4\x73\xe3\xe3\x2e\x3c\x37\xdd\xe7\x1d\xcf\x27"
- "\x5f\xe3\x78\xce\xbe\x41\xe5\xf3\xc9\x09\x7d\xe3\xf9\xa4\xc2\x3b"
- "\x9e\xb3\x67\x4a\xf3\x0b\x83\x83\xe7\x93\x0b\xae\x1d\x9e\xb3\xfd"
- "\x94\xcf\x27\xa3\x3d\xf1\xdc\x38\x93\xe3\xf9\x84\xc3\x3f\x3c\x37"
- "\x79\x8d\x7f\x37\xb0\xf9\x8d\xaf\xa7\xe3\xfc\x46\x07\xce\x6f\xb8"
- "\xf6\xfe\xa5\x84\xd6\x71\x3c\x77\x02\x9e\x37\xba\xe3\xf9\x8b\xee"
- "\xf3\x1b\xa7\xee\x14\xba\xf0\xfc\x75\x0f\x3c\x0b\x80\xe7\x4e\x86"
- "\xe7\xd3\x73\xa5\xf9\x0d\x4b\xcb\x56\xc0\xc9\x19\x62\x89\x07\x2c"
- "\x17\x8b\x58\xfe\x02\xb0\x0c\x34\x14\x80\xc6\xd5\x0d\xf5\x24\xce"
- "\xc6\x69\xd9\x01\x34\x16\xdc\x71\xdc\xd1\x2c\x47\xfc\x22\x6e\x25"
- "\x0c\xd7\x2c\x03\xec\xa6\x1d\x22\x35\x19\x70\xad\x82\x4b\x0f\x17"
- "\x39\x44\xaa\x9b\x01\xbb\x4b\xdc\xb1\x5b\x27\x62\xf7\xd4\x89\xbe"
- "\xb1\x7b\xca\x7c\xed\xe6\x32\x4e\xf3\xf9\xaf\x2f\x12\xd4\x71\x8f"
- "\x7f\x45\x2d\x99\xf5\x22\x3e\xcf\x90\x38\x07\x09\xa5\x4f\x46\x8c"
- "\x54\x25\x10\xf5\x2b\x4e\x22\x2f\x7a\x86\xa8\x8b\x8e\x41\xbb\xa5"
- "\xfe\xdb\x48\x54\x1f\xd9\xff\x4e\xaa\x5b\xeb\x49\xf5\xa5\x0f\x49"
- "\xb5\x00\xd7\x19\xb8\xa0\xae\x71\xc9\xee\xed\xb6\x89\xed\x3e\x7d"
- "\x14\xca\x1a\xef\xbd\xdd\xa7\x2b\x58\xbb\x93\xa0\xdd\x1d\xae\x76"
- "\x5b\xa0\x1f\x00\x7f\xc6\x08\xe2\x7c\x48\x9c\x8d\x04\x2d\x77\x50"
- "\xda\x21\xe2\x1f\xf9\xf3\xd1\x61\x3b\x89\xd3\x01\xcf\x16\x03\xfe"
- "\x9b\xca\x89\x21\x0b\xf0\xdf\x61\x47\xdc\xd9\x2c\xc6\xcb\x80\xff"
- "\x53\x6d\x14\xe8\xd7\x89\xf8\xff\x02\xf1\x7f\x4a\x23\x30\xfc\x37"
- "\x55\xfb\x87\xff\xaf\x7d\xc0\xbf\x2f\xf3\x21\x67\xa6\xe3\x7c\x48"
- "\x07\xce\x87\xb8\xf6\x80\xf6\x83\x7f\xf7\xf9\x90\x66\x37\xfc\x9f"
- "\xe9\x03\xff\xdf\xcc\x95\xe6\x43\xae\x3f\xfe\x9b\xfb\xc1\x7f\x73"
- "\x1f\xf8\x1f\xec\xb9\x8f\x6f\xae\x21\xfe\xbf\xe9\x07\xff\xdf\xf8"
- "\x80\x7f\x43\xb4\x7f\xf8\x6f\xee\x86\xff\x66\x11\xff\x5f\xfb\x89"
- "\xff\x33\xbe\xe0\xdf\x87\xf9\x93\xb3\x88\x7f\x90\xff\x86\x3d\x6e"
- "\x7b\x81\xfb\xc3\xbf\x9b\xfc\xff\xd6\x0d\xff\x67\xfb\xc0\x7f\x8b"
- "\x84\xff\x1b\x40\xfe\x7f\xdb\x0f\xfe\xbf\xed\x0b\xff\x83\x3c\x57"
- "\xd2\x72\x0d\xf1\xdf\xd2\x0f\xfe\x5b\x7c\xc1\xbf\x9f\xf2\xff\xdb"
- "\x6e\xf8\xff\x56\xc4\xff\x19\x3f\xf1\x7f\xd6\x07\xfc\xfb\x32\xdf"
- "\x62\x9b\x8e\xf3\x2d\x1d\x38\xdf\xe2\xda\x13\xde\x0f\xfe\xdd\xe7"
- "\x5b\xce\xb9\xe1\xdf\xd6\x07\xfe\xbf\x9b\x2b\xcd\xb7\x5c\x7f\xfc"
- "\x9f\xeb\x07\xff\xe7\xfa\xc0\xff\x60\xcf\xad\x7c\x77\x0d\xf1\xff"
- "\x5d\x3f\xf8\xff\xce\x07\xfc\x1b\xfd\x94\xff\xe7\xba\xe1\xff\x9c"
- "\x88\xff\xb3\x7e\xe2\xdf\xe6\x0b\xfe\x7d\x98\x9f\xb9\x80\xf8\x07"
- "\xf9\x6f\xdc\xe3\x76\x36\xa0\x3f\xfc\xbb\xc9\xff\xf3\x6e\xf8\xbf"
- "\xd0\x07\xfe\x5b\x25\xfc\xdf\x00\xf2\xff\x7c\x3f\xf8\x3f\xdf\x17"
- "\xfe\x07\x79\x2e\xa6\xf5\x1a\xe2\xbf\xb5\x1f\xfc\xb7\xfa\x82\x7f"
- "\x3f\xe5\xff\xf9\x6e\xf8\x3f\x2f\xe2\xdf\xe6\x27\xfe\x2f\xf8\x80"
- "\x7f\x5f\xe6\x73\x2e\xb1\xf9\x9c\x0e\x9c\xcf\x71\x9d\x11\xe9\x07"
- "\xff\xee\xf3\x39\x6d\x6e\xf8\xbf\xd4\x07\xfe\x2f\xce\x95\xe6\x73"
- "\xae\x3f\xfe\xdb\xfa\xc1\x7f\x5b\x1f\xf8\x1f\xec\xb9\x9b\x8b\xd7"
- "\x10\xff\x17\xfb\xc1\xff\x45\x1f\xf0\x9f\xed\xa7\xfc\x6f\xeb\x86"
- "\xff\x36\x11\xff\x17\xfc\xc4\xff\xa5\x41\x9a\xff\x69\x6f\xc1\xf9"
- "\x1f\x41\xa5\xdf\xd3\x59\x36\xcb\x26\x14\xae\xdd\x19\x2a\xd3\x12"
- "\x87\xca\xa4\xb3\xa4\xb7\x91\xd8\x8b\xc0\x13\xdd\x45\xf2\xf4\x45"
- "\x35\xc6\x0b\xdc\x4a\x61\xfc\xef\x71\x46\x14\x2e\x47\x9e\xd3\xba"
- "\x6e\x19\x51\x38\x43\x72\x9e\xc0\x34\xcb\x69\x3b\xc1\x36\xaf\x46"
- "\x1a\x9c\x71\xd1\x00\xe7\xe0\xe8\x77\x11\xea\xcd\x26\xc8\xd3\x61"
- "\x25\x4d\x80\x97\xea\x26\x2b\xd0\x7e\x15\xc3\x16\xf2\x02\xea\x53"
- "\xb8\xe5\x1c\x51\x38\x4e\x6a\xc6\x00\x8f\xc3\x82\x5f\x22\xb2\xf0"
- "\x26\x2a\x20\x2f\x91\x47\xc8\x57\xed\x2a\xdc\xaf\xd4\x7e\xaa\x16"
- "\xf0\xed\x38\x19\x31\x66\x33\xe4\x1b\xfc\x79\x99\x76\xb6\xfe\x01"
- "\xbf\x6b\xaa\x1b\x80\x96\xb9\x97\xfc\xe4\x53\xbb\x2f\xe7\x5f\x7c"
- "\x98\xa7\xb8\xbc\x1e\xe7\x29\x04\x95\x61\xaa\x6f\x7c\x32\x44\x7b"
- "\x9c\x69\x1d\x74\x3e\x5d\x9e\xea\x1b\x9f\x2e\x17\x79\xf2\x69\xb0"
- "\xe7\x0f\x2e\x8b\xfe\x60\x2e\x47\x72\x3e\xd9\xd3\xfd\xe3\xd3\x65"
- "\xbf\xf6\xff\xf6\x1c\x4f\x77\x4e\xc3\xf1\x34\xf0\xc9\xc7\xfe\x64"
- "\xa8\xf0\x38\x83\x3b\xe8\x7c\xea\x68\xf0\x8d\x4f\x9d\xf7\x75\xe3"
- "\xd3\x20\x8f\x73\x3b\x09\xe7\x53\xc7\x61\xce\xa7\x8e\x70\xff\xf8"
- "\xd4\xe9\xc3\xf9\x0f\x5f\xc6\x7d\x8e\x26\x1c\xf7\x09\x30\xee\xf3"
- "\x8d\x4f\xc6\x68\x8f\x33\xc3\x83\xce\x27\xc7\x1a\xdf\xf8\xe4\x38"
- "\xee\xc9\xa7\xc1\x1e\x8f\x39\xca\x39\x9f\x1c\x59\x9c\x4f\x9d\x07"
- "\xfc\xe3\x93\xc3\x36\x38\xe3\x13\xa1\x10\xc7\x27\xc0\x27\x1f\xfb"
- "\x93\xb1\xc2\xe3\x8c\xf3\xa0\xf3\x49\x88\xf4\x8d\x4f\xc2\xab\xdd"
- "\xf8\x34\xc8\xe3\x06\x21\x9e\xf3\x49\x18\xcf\xf9\xe4\x4c\xf5\x8f"
- "\x4f\x82\xd7\xf8\x9f\x03\xb2\xa3\xe5\x64\x2a\xda\xd1\x02\xd8\xd1"
- "\xbe\xf1\x29\x3b\xda\xe3\x4c\xf6\xa0\xf3\x89\x1e\xf6\x89\x4f\x72"
- "\x32\xd9\x93\x4f\x83\x6d\xdf\x52\x3b\xe7\x13\xad\xe6\x7c\xa2\x61"
- "\x7e\xf1\x49\x4e\x7c\xd8\xff\xd9\xfb\x39\xac\x1e\x36\x9f\x5c\x66"
- "\xbd\xa1\x6c\x3e\xb9\xcc\xe8\x1b\xaf\x64\x47\xaf\xaa\xcd\x27\x97"
- "\xb1\xfd\xff\xf0\x9b\xc9\x78\x55\x40\xcc\xfe\xf1\x4a\xd6\xe2\xef"
- "\xf9\xad\x1e\x76\x9f\x3c\xa0\xf0\x86\xb2\xfb\xe4\x01\xbe\xc9\x3f"
- "\x79\xc0\xab\x57\xd5\xee\x93\x07\x70\xf9\x27\x0f\xe0\xf2\xaf\x40"
- "\xee\x9f\xfc\x93\x07\xf8\x20\xff\x7a\x3f\xf7\xd5\xc3\xf6\x93\x07"
- "\x46\xdf\x50\xb6\x9f\x5c\x51\xef\x1b\xaf\x02\x7f\x74\x55\x6d\x3f"
- "\xb9\xc2\xc1\x79\xa5\xa8\xe3\xbc\x52\x68\xfc\xe3\x55\xa0\xd7\xf8"
- "\x2f\xfd\x9d\x17\xeb\x61\xff\xc9\x87\xdc\x58\xf6\x9f\x7c\x88\x6f"
- "\xf6\x9f\x7c\xc8\xd5\xb5\xff\xe4\x43\xb8\xfd\x27\x1f\xc2\xed\xbf"
- "\x82\x40\xff\xec\x3f\xf9\x10\xbf\xec\xbf\x6e\xbc\x12\xfb\x95\xb2"
- "\xe4\x86\xb2\x01\xe5\xca\x28\xdf\x78\xa5\xcc\xbf\xaa\x36\xa0\x5c"
- "\x39\x8f\xf3\x4a\x19\xc1\x79\x35\x54\xe7\x1f\xaf\x94\x5e\xe3\x1f"
- "\xf6\x77\x3e\xad\xa7\x1d\x38\x6c\xda\x0d\x65\x07\xca\x83\x7c\x1b"
- "\xff\xca\x87\xdd\x77\x55\xed\x40\xf9\x30\x3e\xfe\x95\x07\xf1\xf1"
- "\x6f\x41\x90\x7f\xe3\x5f\xf9\x30\x1f\xc6\xbf\x3e\xcc\xfb\xc9\x55"
- "\x65\x68\x03\x3a\x0b\xf5\x7b\x42\x81\xfe\xa1\x99\x44\xde\x11\x0e"
- "\xfc\x52\x01\xbf\xb2\xb5\xa4\xb3\x10\xf8\x65\x73\x90\xd8\x17\xbf"
- "\xa2\xb5\x2d\x4e\xd2\x01\xbc\xba\x0c\x76\xa0\xc5\xd6\x8c\x67\xf4"
- "\x7e\xd2\x28\x57\xdd\xf7\xe4\x8b\x6a\x82\xfc\x42\xfa\x3b\x95\x4e"
- "\xb0\x29\x73\x9e\x60\xfc\x53\xe5\x65\x3a\x0a\x73\xa2\xe6\x9e\xfd"
- "\x8a\x2e\xb7\x52\x5a\x93\x62\x87\x3a\xcd\xb5\xd5\xa4\xd4\x93\xb8"
- "\x26\x12\xa4\x7d\x02\xf9\x32\xfc\x14\xa6\x5b\x6c\xf5\x04\xfd\x7e"
- "\xb2\x39\xf0\xaf\x22\xc2\x1c\x9f\x47\xa8\xd0\x7f\x13\x9e\x2b\x94"
- "\x7c\x34\x59\xce\x94\x32\xfe\x77\x9f\x53\x65\xfc\xff\x3c\x42\xbd"
- "\x11\xcf\x27\x0e\xba\x2d\x38\x9c\xcd\xff\x09\x5f\x69\xc6\x48\x75"
- "\x5c\x9e\x4a\x29\xd4\x71\x64\x6d\x9b\x8d\x60\x3d\x6b\xdb\xcc\xc4"
- "\x90\x4e\xd4\xb5\x1d\xcd\x44\xdf\x46\x6d\xb5\xc6\x6f\x48\xdc\x45"
- "\x5c\x17\x40\x3c\xa9\x26\x73\x7e\x0f\x4f\x10\xbe\x8a\x18\x63\x95"
- "\xab\xc6\xd7\xd6\x11\x12\x9a\x0d\xb4\x76\x10\x39\x3b\xaf\x29\x27"
- "\x4a\xa0\x57\x8a\xc5\xd8\x48\x80\x76\x3b\x2d\x8e\x63\x48\xcf\x14"
- "\x78\x3e\xad\x6b\xbd\x21\x24\x67\x17\xa6\x21\x6d\x71\x9f\xa9\x45"
- "\x67\x63\x79\xa4\xe7\x9c\x77\x46\x62\xc9\xec\x20\xb5\xa0\x65\xe1"
- "\x7b\x8a\x8f\x13\xea\x01\x5f\xc3\xfc\x94\xdb\xaa\xf2\x41\x99\xaf"
- "\x94\x87\x38\xd0\x6e\x75\x16\x1a\xa6\xf2\x3a\x06\xb6\xf6\x8f\x2f"
- "\x43\xb4\x0b\x5f\x21\x7f\xb8\x32\x7c\x85\xcc\x18\x5c\x7c\x0d\xb6"
- "\xfd\x1a\xa2\xbe\x32\x7c\x85\x14\x71\x7c\x05\x57\x70\x7c\x85\xac"
- "\x71\xe1\x2b\xb0\xf5\xea\xe1\x2b\x38\x89\xe3\x2b\x78\xbc\x7f\xf8"
- "\x0a\x55\x0e\xca\x3c\xab\x7c\xc4\x02\xb4\xb5\x01\x5f\xa2\xfc\x1a"
- "\xde\xe8\x03\xbe\xdc\xe4\x97\xfa\xe2\x95\xe1\x4b\xfd\xf6\x20\xe3"
- "\x6b\x90\x6d\x6e\xb5\xee\xca\xf0\xa5\x3e\xcb\xf1\xa5\xd6\x70\x7c"
- "\xa9\x9b\x5c\xf8\x1a\xde\x78\xf5\xf0\x15\x7a\x80\xe3\x2b\x74\x8d"
- "\x7f\xf8\x1a\xe1\x97\xff\xab\x9e\xe3\x83\x5b\x2a\x71\x7c\xe0\x2c"
- "\x34\x8a\xf2\x6b\xc4\x27\xfd\xe3\xcb\xe8\x26\xbf\x6e\x99\x7f\x65"
- "\xf8\xba\x25\x70\x70\xf1\x35\xd8\xe3\x84\x91\x75\x57\x86\xaf\x5b"
- "\xe6\x72\x7c\x8d\xcc\xe4\xf8\xba\x65\xba\x0b\x5f\x23\x3e\xb9\x7a"
- "\xf8\x1a\x39\x9e\xe3\x6b\x44\x93\x7f\xf8\xba\xc5\xbb\xff\xe7\x81"
- "\xcc\x6b\xcb\x47\x85\xe3\x98\x06\xf0\x25\xca\xaf\xfb\x0b\x7c\xc0"
- "\x97\x9b\xfc\xba\xf5\xdd\x2b\xc3\xd7\xad\xc9\x83\x8c\xaf\x41\x1e"
- "\xdb\xdc\x1a\x75\x65\xf8\xba\x75\x07\xc7\x57\x58\x3d\xc7\xd7\xad"
- "\xdb\x5c\xf8\xba\xbf\xe0\xea\xe1\x2b\x6c\x0d\xc7\x57\xd8\x74\xff"
- "\xf0\x35\xca\x07\xff\xaf\xbe\xcc\xc7\x6b\xb2\x70\x1c\xe6\x2c\xcc"
- "\x16\xe5\xd7\x93\x8f\xf4\x8f\xaf\x6c\x37\xf9\xa5\xb9\xf5\xca\xf0"
- "\x75\xdb\xc1\xc1\xc5\xd7\x60\x8f\xc7\x6e\x2b\xb9\x32\x7c\x69\x82"
- "\x39\xbe\x6e\x8b\xe6\xf8\xd2\x28\x5c\xf8\x7a\xf2\x91\xab\x87\xaf"
- "\x51\x4d\x1c\x5f\xa3\xb6\xf9\x87\x2f\x8d\x0f\xfe\x7f\x7c\x5d\x47"
- "\x18\x63\xbd\xb2\x31\xe4\x98\x97\xaf\x0c\x63\x63\x26\xde\xd8\x63"
- "\xc8\xd1\x6d\x57\x86\xb1\x31\x2f\x72\x8c\x8d\x2e\xe3\x18\x1b\x93"
- "\x72\x6d\xc6\x90\xa3\x67\x72\x8c\x8d\x56\xfa\x87\xb1\x31\x83\xb8"
- "\xfe\x71\xc7\xf4\x2b\x1b\x47\x86\x1f\xbf\x32\x8c\x85\x17\xdd\xd8"
- "\xe3\xc8\xf0\x84\x2b\xc3\x58\xf8\x11\x8e\xb1\x70\xc2\x31\x16\x5e"
- "\x7d\x6d\xc6\x91\xb7\x6f\xe7\x18\xbb\xdd\xcf\x75\x9b\x3b\xfc\x3a"
- "\xff\xd2\xfb\xba\xcd\xb8\xf2\x2b\x1b\x4b\x8e\x7b\xf8\xca\x30\x36"
- "\xf6\xfc\x8d\x3d\x96\x1c\x5b\x79\x65\x18\x1b\xf7\x63\x8e\xb1\xb1"
- "\x49\x1c\x63\xe3\xa2\xae\xcd\x58\x72\xac\x9a\x63\xec\x8e\x3a\xff"
- "\x30\x36\x6e\xcf\xe0\xad\x37\xdd\xa5\xba\xb2\xf1\xe4\x9d\x6f\x5f"
- "\x19\xc6\xee\x9c\x7f\x63\x8f\x27\xef\xd4\x5e\x19\xc6\xee\xdc\xc4"
- "\x31\xa6\xad\xe2\x18\xbb\x73\xfd\xb5\x19\x4f\x6a\xd3\x39\xc6\xb4"
- "\x53\xfd\xc3\xd8\x5d\x3e\xf8\xff\xf7\x75\x9d\x6c\xbc\xee\xca\xc6"
- "\x94\xe3\x83\xae\x0c\x63\x77\xef\xbd\xb1\xc7\x94\x77\xaf\xb9\x32"
- "\x8c\x8d\x97\x71\x8c\xdd\x1d\xc9\x31\x76\xb7\xfd\xda\x8c\x29\xef"
- "\xaa\xe7\x18\xbb\xab\xd4\x3f\x8c\x8d\xcf\x1a\xbc\xf5\xbd\x1f\x1c"
- "\xbe\xb2\x71\xe5\x0f\x96\x5e\x19\xc6\x7e\x70\xc7\x8d\x3d\xae\x9c"
- "\xd0\x7c\x65\x18\xfb\x41\x32\xc7\xd8\x84\x12\x8e\xb1\x1f\x2c\xb8"
- "\x36\xe3\xca\x09\xd3\x38\xc6\xc6\xfb\xe7\x8f\x42\xfe\x03\x6b\x77"
- "\x8c\x2d\x59\x96\xb1\x28\x75\x49\x92\x76\xc9\xb2\xf4\xb4\x17\xb5"
- "\x2b\x96\xac\x4a\x7e\x70\xc2\xca\x48\x6d\x5a\xa6\x36\x6d\xc9\xb2"
- "\xe7\xc4\x84\xa4\x61\xe4\x89\xe4\xd4\x45\x99\x98\x02\xb9\x9f\x5b"
- "\xb6\x34\x79\x59\xba\x36\x2d\xf9\xc5\x95\x4b\xd2\x92\xf1\xff\x15"
- "\xda\x67\x97\xa7\x41\xc2\xe2\xe4\x25\x19\xc9\xda\x67\x56\x3e\xfb"
- "\x6c\x72\xda\x8a\x61\x64\xee\xca\xd4\xf4\x25\xba\xd4\x64\xed\xf4"
- "\xb9\x0f\x4f\x9e\x37\xe3\x17\xf3\x1e\x7a\x08\x57\x58\xdd\x62\x93"
- "\x85\xd3\xc2\x3c\x1d\x60\x4e\x71\x5a\x7e\xef\xbe\x5a\x90\xb2\x18"
- "\xcf\x76\x5d\x2b\x51\x17\xa4\x11\x45\x7e\x2b\x51\x16\xb5\x12\x95"
- "\xf6\x79\x12\x43\xf3\xf7\x93\xe2\x56\x12\x46\x8b\xe7\xda\x85\xfc"
- "\x4e\x35\xcd\xef\x8c\xb7\x05\x35\x61\x9a\x5a\xc8\x3f\x19\x0d\xef"
- "\x84\x01\x6d\x15\x34\xdf\x69\x6e\x94\xdf\x6b\x84\x67\x56\xc3\x37"
- "\x44\x4e\x87\x45\xa8\xff\x22\xd8\xe4\xfb\xd2\x09\x5b\xdb\x25\xf2"
- "\x89\x11\x70\x85\xc1\x75\x00\xae\xc3\x70\x59\x89\x7c\x92\x12\x2e"
- "\x35\x5c\xe3\xe1\x8a\x82\x6b\x1a\x5c\xd3\xe1\x9a\x03\xd7\x3c\xb8"
- "\x16\xc0\x55\x0f\x97\x9d\xc8\xef\x81\xbc\xf7\x68\x79\x39\xf7\x44"
- "\xc2\x95\x00\x97\x11\xae\x52\x22\x8f\x84\xfc\x91\xa9\x70\xb5\xc0"
- "\xb5\x06\xae\x12\xb8\x30\xbd\x12\x2e\x78\xff\x9e\x28\xfe\x6c\xf2"
- "\x7a\xb8\xea\x08\xd4\xb3\xff\x6b\xb2\x0d\x2e\xf8\xee\x94\x70\xb8"
- "\xb2\xe0\x82\xfa\xde\x1b\xd5\xc7\x3b\x99\xfd\x94\x59\x1a\x9a\x3d"
- "\xce\xca\x62\xe0\xc9\x27\xbe\x4a\x4d\x24\x80\xe6\x37\x59\x75\x93"
- "\x88\xec\x8c\x7c\xe2\xe3\x16\x90\xbe\x54\xd9\xa9\x66\x31\x1d\xe1"
- "\x1e\x69\xd6\x5e\x30\x31\xde\x4a\x52\x6d\x18\xd3\x6c\x60\x78\x9b"
- "\x18\x2f\xbe\x5f\x62\x95\x0d\x2d\x67\x31\xe0\x0a\x2a\x6c\xd4\x90"
- "\xb0\x91\xc5\x7e\x03\x1a\xe2\xb9\x2c\x9a\x57\x91\x42\x95\xbb\x1c"
- "\xd8\xe7\xcd\xab\x58\xbd\x26\xf2\xfe\x05\xcf\xa1\x6e\xb6\xe0\xb9"
- "\x76\xa8\xa7\x02\xef\xa1\xae\xa4\x23\x78\x6d\x3c\xfe\x7f\x79\xd3"
- "\x2c\x23\x2d\x5c\x9b\x89\xe3\x6c\xb3\xfe\x2d\xd2\x08\xef\x75\x04"
- "\xe7\x6b\xb4\x4f\x84\xd2\x46\x5e\xb6\x1c\xf2\x55\x4a\x65\x75\x04"
- "\xc7\x12\x5a\x9a\x1f\x43\x8b\x00\x43\x62\x79\x50\x3e\xa1\x85\x39"
- "\x5a\xab\x7c\x92\x06\xd3\x69\xd9\xac\x52\xe9\x7f\xf8\x05\xbc\xad"
- "\xad\xc0\xdf\xd0\x6c\xd2\xc6\xee\x4d\x31\x84\xff\xaa\x09\xca\xba"
- "\x16\xf9\xa4\xf7\xee\xad\x23\x32\xf3\x13\x58\xef\x49\x79\x86\x3a"
- "\x2a\x68\xf5\x01\xf0\xfd\x49\xf9\x5d\xdf\x1d\x9d\x1f\x8d\x31\x52"
- "\x85\x82\x1f\x6a\x31\x06\x1f\xbe\x8b\x75\xdb\x30\x92\x28\xb6\xfc"
- "\x8e\x28\xb1\x8d\xed\x05\x93\xf6\x48\x71\xe8\xf0\x1d\x39\xe4\x9f"
- "\xfd\xb8\x81\xba\x95\x9d\x4d\x79\x7b\xc6\x73\x9a\x4e\x6a\xb2\xca"
- "\x02\x0b\x31\xbf\xf6\x2e\x46\xcb\x89\xe2\x73\xa4\x91\x15\xcb\x17"
- "\x8a\xf2\x74\x78\x8f\x71\xee\x42\x01\x6d\x5a\xfd\xf8\x0a\x4e\xa3"
- "\xb5\x99\x58\x0e\xe6\x17\x8a\x4d\xf8\x7f\x95\x00\xed\x75\x9a\x48"
- "\x84\x76\x19\x89\x69\x94\xdf\xf3\xb8\x33\x7f\x6f\x39\x3c\x87\x7e"
- "\xb7\x77\x3b\xe4\x2f\x61\xf4\x2e\xca\x51\x5b\xe5\xf7\x4c\x87\x67"
- "\xdb\xbb\x62\x5f\x72\x3a\xcb\x84\xfc\xbd\x95\xed\x05\xf7\x64\x5a"
- "\x65\xe1\xeb\xa5\x36\x30\x19\xe7\xca\x27\xf2\xf4\x9e\x54\x5b\xd0"
- "\xde\xca\xce\x0c\x5a\xb7\xee\x18\x21\xf0\x4d\xda\x71\x89\x56\x67"
- "\xc5\x53\x7b\xf1\x2f\x09\xa9\x4e\x6c\x20\x86\x45\x24\x7c\x78\x36"
- "\xb5\xc5\x39\x49\xe8\xf0\x86\x50\x5a\x13\xdf\x00\x32\xfa\x22\xc9"
- "\xaa\xa3\xcd\xb5\xba\x4a\x92\x75\x8a\xa8\x56\x2f\x21\x61\x86\x78"
- "\x6a\xd3\x57\x53\xbb\x25\xb3\x81\xd4\xb6\xc1\xa5\xab\x81\x7c\x47"
- "\xe0\xaa\x24\x86\x97\x89\x22\x16\xe4\xa9\xfe\x22\x51\xd5\xea\x2e"
- "\x42\xda\x59\x92\x95\x48\x1d\x35\xd5\x98\xef\x20\x89\x73\xd8\x42"
- "\x57\x9f\x25\x8a\xcd\xbf\xc4\xb3\x65\xc7\xc9\x16\xa8\x4b\x47\x50"
- "\x67\xcc\xe5\x7c\x67\xd5\x85\x0c\xea\x68\x2f\x88\x9c\x6e\x25\x0f"
- "\x18\x3d\xda\x82\x75\xc6\xb8\xa1\xd0\x5e\xcc\x23\x14\x99\xec\x0b"
- "\x1d\x88\xf3\xc8\x68\x90\xc5\x44\x7a\x8e\xcf\x6c\xc1\x26\xc0\x4f"
- "\x64\x52\x9c\x83\xb6\x63\x7e\x6c\x37\xd0\xa8\x42\x6c\x7f\x45\x80"
- "\x8e\x28\xe0\x1b\xe5\x56\xd9\x38\x9d\x1b\x0f\x91\x27\x43\xa4\xef"
- "\x89\x79\xaa\xad\xb2\x3b\x58\xec\x45\x81\x3f\xdb\x83\x79\x21\x1d"
- "\xf8\x3f\xd6\xcc\xeb\x17\xb9\x1d\xd3\x44\x59\x8a\xe5\x54\x0a\xd8"
- "\xaf\xf3\x76\xd5\x39\x83\xd7\x1a\xa9\x9c\xda\x69\x51\xac\x86\x5e"
- "\xd0\xa8\x62\x1d\xd4\x0e\xf5\x56\x83\xbc\x54\x61\x9c\x54\x9e\x7f"
- "\xf2\x6a\x78\xae\xd5\x66\xb0\xff\x93\xf1\x3b\xc2\xa6\x59\x3a\x94"
- "\xad\x71\x75\x98\x3f\x56\x57\x9c\x06\xb2\xb7\x68\xad\x0e\xfb\xa1"
- "\x10\x9c\x13\x71\xf9\x8d\x7c\x2d\xf6\x6f\x0a\x18\xa3\x85\xb1\xda"
- "\xae\x72\x4c\x24\xd0\x2a\x9f\x3c\x8d\xc2\xfb\xb4\xd0\xa4\x16\xeb"
- "\x33\x81\x63\x73\x72\x34\xf6\x3b\xa8\xd7\x61\x48\x0f\x6c\x94\x4f"
- "\x3e\x80\x67\x34\x69\xde\x6e\x15\x8b\x25\x29\x9f\xfc\x21\xc7\xcc"
- "\xae\x3a\x8f\x7b\x39\xd2\x0f\xfa\x24\xc8\x01\x6e\x5f\x4c\xfe\xc6"
- "\xd5\x2f\x38\x8e\x79\xff\x36\x41\x9d\xee\x19\x2f\x98\x02\x04\xc8"
- "\x27\x6b\xe4\x74\x90\x77\x04\xed\xdd\xd9\x5e\x30\x25\xcc\x2a\x23"
- "\x51\x1e\xfc\x2c\xf8\xab\x0d\xe3\x56\x42\x5d\x02\x4e\xcb\xa7\x3c"
- "\x0c\xbf\x43\xe1\x77\xc6\xfe\x3a\xd4\xb5\xac\xdc\xe1\xf8\xff\x86"
- "\x51\xd4\x36\x7d\x2e\xc1\x18\x95\x40\xf7\x29\x0b\xac\xe4\xe9\x79"
- "\x58\x4e\x01\xc6\xee\x84\x34\xcc\x03\xe9\xe9\x56\xb2\x70\x3a\x2f"
- "\x7f\x92\xa6\x0d\x65\x96\x67\xf9\x6f\xf0\xf2\x79\xb9\x58\x9e\x54"
- "\xf6\xa6\xd7\x69\x8b\x58\x76\x85\x54\x76\x11\xa4\x49\xe5\x4f\x5f"
- "\xda\xf5\x8d\x7a\x78\x5e\xed\xde\x86\x37\x5e\xa7\x6d\x58\x06\x3c"
- "\x6b\xb3\x92\xe7\x34\xf8\x2c\x1f\xd2\xf0\x5d\x37\x4c\x05\xec\x07"
- "\x49\xbc\xbf\x1a\xcb\xb8\x37\xdc\x4a\x92\xb7\xba\xcb\x0d\xa0\x51"
- "\xb0\x24\x6b\x79\x59\xf7\xc6\x48\x65\xb9\x95\x23\x62\xea\xbd\xad"
- "\x22\x4f\xb1\x5c\x15\x96\x0b\xf9\x75\x56\x92\xd8\xec\xde\x76\x51"
- "\x76\xe6\x41\x1e\x99\x98\xff\x71\x94\x4b\x52\xbd\x31\x76\x27\x2d"
- "\xf8\xe1\x4c\xec\x1b\x20\x03\x89\x50\x94\x83\xe5\x54\x74\x93\x81"
- "\x0a\xcc\x07\x72\x73\x35\x8b\x5d\x3a\x8a\x36\x43\x9e\x06\x8f\x78"
- "\x9d\x72\xf2\x53\x48\xb3\x49\x71\x43\x8b\x21\x8f\x55\xfe\x43\xaf"
- "\x7e\x11\xf5\x77\x92\xff\xcf\xde\xfb\xc0\x37\x55\x65\x8b\xc2\x2b"
- "\xa7\x29\xa4\xb5\x90\x88\x88\xd5\x5b\x35\x68\xd1\xa8\xfc\x29\x50"
- "\x11\xb1\x48\x91\xa2\x45\x0b\xad\x82\x5a\x05\xa1\x60\x71\x82\x16"
- "\x88\xa5\x40\x81\xd2\xa4\x01\xc7\xd2\x29\x50\xb5\x62\x91\x42\xeb"
- "\x1d\xe6\xfb\x31\x73\x99\x91\x3b\x8f\xf9\x1e\x73\x7f\x38\x66\x86"
- "\xa2\x75\xa4\x0d\x73\x3f\xf8\x4d\x67\x1e\x8e\xb1\x53\x99\x0e\x13"
- "\x20\x63\x83\x0d\x6d\x92\xfd\xad\xb5\xf7\x39\xcd\x49\x9a\x40\xcb"
- "\x78\xdf\xbb\xe3\xb3\x1a\xce\x39\x7b\xaf\xbd\xf6\xde\xeb\xdf\x5e"
- "\x6b\x9f\xbd\xf7\x91\x9c\xf5\x2e\xf2\x49\x49\xae\x32\x9c\x29\x5e"
- "\x70\xd6\x07\x21\xb8\x6f\x4e\x63\x66\x39\x73\x9c\x95\xd2\x56\xd2"
- "\xf7\x9e\x07\x37\xce\xa5\xf1\xef\x3f\xb2\x1e\xf4\xd5\xca\x26\x01"
- "\x8d\x6d\x17\xa4\x89\x7b\x9d\x9e\xaf\xb8\x7e\xe1\x3d\x1f\x0b\xde"
- "\x42\xdf\x8e\xfc\x3b\xf4\xa9\xe9\x1b\xc0\xdc\xc7\x0b\x22\xec\x3e"
- "\x4a\x27\xff\x0f\x7d\xcf\x06\x55\x1e\xdb\x37\x27\x5f\xd0\x6e\xe2"
- "\xd3\x44\x47\xde\x5e\xff\x63\x0e\x6a\x73\xb0\x7e\x4e\x3e\xf5\xc1"
- "\x5a\xca\x82\x4e\x7f\xb7\x83\xbe\xa7\x6b\x5c\x47\xbe\xe9\xc4\x89"
- "\xb9\x7b\x81\xa1\xfe\xe6\x0f\xb2\x0f\x7c\xfd\x2f\xfa\xdf\x17\x3c"
- "\xb7\xce\xc9\xa7\xef\x27\xef\x2c\x8f\xd7\xcd\xaa\x67\x8e\xae\xdb"
- "\xe6\x34\x76\x57\x4d\x5c\xa0\x7c\x9f\x76\x70\x78\x27\x2e\x50\xfa"
- "\xbe\x4f\xee\x3b\xd6\xc5\xe7\x6c\x26\xd4\xf1\xef\x63\xe3\xf3\xc4"
- "\xea\x58\xfc\x42\x1b\x52\x49\x65\xb1\xef\x99\x0d\x0a\x9d\xfc\x1e"
- "\xfa\x36\xf8\xf5\xe7\xa4\x49\xa3\x73\xcb\x1c\xc0\xcf\xc2\xdf\x6e"
- "\xaf\x1c\x64\xbb\xf8\xfc\x77\x2b\xfa\xfe\xb9\xfe\x0f\x99\xb0\x7d"
- "\x93\xe6\xcc\x93\xf1\x51\x9e\xc2\xab\x7d\xb2\x4f\x3e\xf8\x3a\x26"
- "\xc5\x9c\xff\x54\xf5\xcb\x10\xa5\x5f\x97\xaf\xbd\x5f\x93\x9a\xfa"
- "\xf7\x6b\xf2\xe8\x6f\xb6\x5f\x93\x63\xbe\xff\x54\xf5\xcb\xd8\xbf"
- "\x5f\x93\x7f\x77\xed\xfd\x9a\x5c\x1f\xa5\x5f\x97\xbf\xd9\x7e\xa5"
- "\xc3\x00\xfa\x95\xd6\xbf\x5f\xe9\x3f\xbe\xf6\x7e\xa5\x97\xf4\xef"
- "\x57\xfa\xef\xbe\xe1\x7e\xc5\xfc\xfe\x59\x4c\x7b\xb8\xe3\xf5\x93"
- "\xc2\x1e\xde\xbf\x79\xf0\xf6\xf0\xfe\xec\xfe\xf6\x70\xca\x4f\x43"
- "\xf6\x70\xca\xee\x6b\xb2\x87\x3b\xe6\xc9\xfe\xc4\x94\xe5\xfd\xec"
- "\x61\xf5\x3c\x43\x74\x7b\x38\x65\x26\xb7\x87\xdb\xe7\x19\x06\xd7"
- "\x87\x29\x49\x7d\xf6\x70\xd8\x3c\x43\x98\x3d\x1c\xfe\xfa\xc9\xee"
- "\xaa\x29\x85\xd7\x66\x0f\xa7\x14\xf6\xb7\x87\xf7\x37\x85\xdb\xc3"
- "\x29\x31\xd7\x7a\x63\xac\xa2\x8b\x66\x0f\x73\xfd\x17\x99\x90\x8d"
- "\x2d\x83\xfb\x86\xb9\x34\xc5\x7b\x05\x99\xaf\xb9\x72\x5d\xf6\x9a"
- "\xc1\xd5\xf5\x40\x41\xcc\xba\x74\x3f\x27\x3f\xc3\xb0\xf9\x3d\x90"
- "\xce\x62\x94\xdb\x9a\xd2\x06\xce\x52\x1f\x8c\xb7\xa0\x4c\xd8\x21"
- "\xa3\xb5\xde\x0d\xad\x29\x67\x81\x25\xfc\xdc\xc3\xfe\x9f\xc7\x0d"
- "\x99\xc5\x24\x9b\x53\x6f\x76\x96\xf8\x06\x29\x9b\x0f\x74\x28\xb2"
- "\xd9\xea\x47\xd9\x5c\x47\xf2\xf8\xe0\x1c\xa7\xfb\x9c\x2c\x9b\x0f"
- "\xde\xdf\xc7\x1f\xbb\x90\xcf\xa8\xb2\x89\x3a\x11\x2e\x9b\x76\x9b"
- "\x90\xcd\x07\x35\xfd\x65\xd3\x6e\x8b\x2e\x9b\x53\x3f\x13\xb2\x69"
- "\xb7\x0d\xae\x0f\x53\x0f\x84\x64\xd3\x6e\x0b\x93\xcd\xbb\x1e\x37"
- "\x74\x57\x3d\x08\xd7\x26\x9b\x0f\x82\xd2\xf7\xbd\x72\xdf\xb1\xae"
- "\x82\x70\xd9\x7c\x30\xe6\xb7\xae\xe9\xfb\xeb\x68\x0f\x93\xce\x49"
- "\xd3\x74\x01\xf4\x5b\x83\x95\x9d\xbe\xdc\x00\xeb\xa6\xef\xb0\x33"
- "\xb4\xad\x6c\xbd\x29\xa9\x1b\x63\xca\xee\x6e\xb3\x8e\x25\xfe\xbc"
- "\x9c\xf5\x26\x03\xb6\x5d\xcf\xba\x4d\xc3\x91\x66\xa9\x78\x1d\xb1"
- "\x77\x1d\x8c\xc4\x5f\xf2\x5e\x99\xae\x78\x9f\xc6\xd6\x27\x27\xee"
- "\x58\x07\x63\xf5\x5e\xd0\x61\x1b\xf2\xf5\x15\x06\xc0\x98\x7f\x24"
- "\xdd\x33\x7b\xa3\xb9\xe1\x6b\xd0\xd2\x7c\x62\x30\x01\xeb\x2b\xd5"
- "\x33\xb6\xc6\x04\x0d\xc5\xd8\x1e\x09\x92\x1b\x24\x76\x28\xb0\xde"
- "\x24\xb1\xe1\xaf\xff\x80\x6d\xca\xe7\x6d\x0a\xa6\x3e\x9e\x87\x32"
- "\x94\xc7\xac\x66\xaa\x37\x93\xbe\x07\xcc\xee\x7a\x7c\x01\xeb\x4e"
- "\x4e\xdc\xfe\x35\x8c\x6d\x58\x07\xa9\xfb\xd6\x81\x89\xf5\x9a\x24"
- "\xa4\x41\xfe\xe2\x57\x0d\xc4\xf7\x7c\x26\x61\x5d\xeb\xb0\x2e\xe4"
- "\x65\x60\x1b\xd6\xe5\xc7\xba\x2e\x62\x5d\x17\xb0\x2e\x3b\xd6\x65"
- "\x17\x75\x0d\x8e\xe6\xd3\x4a\xae\x34\xef\x9b\xbb\xf9\x36\x3a\x9f"
- "\xf6\x2f\xfa\xd2\xa1\xd9\x34\x07\xdc\xb5\xc9\x3c\x48\x79\x9f\x76"
- "\x2a\x16\xfe\x9d\x3f\x83\x14\xa6\xfb\xb3\x69\xde\x6b\x9f\xb3\x5c"
- "\xf4\xfe\x5e\xfb\x19\x8c\x25\x9d\x6b\xf5\x9d\x47\x3d\xfb\xb3\xe9"
- "\xb8\xc9\x3d\xc8\xba\x1e\xca\x8c\x55\x57\x95\x9d\x9d\x0c\x26\x61"
- "\x2c\x9a\xf4\x7a\xdd\x4e\x3b\x2b\xed\x4d\x99\x63\xe9\x49\x99\x53"
- "\xb3\xc4\x6f\x40\xb9\x62\xa5\xc6\x62\x30\x9e\x95\x66\xbe\xf6\xdb"
- "\x53\x38\x46\x3c\x0f\xba\x76\x69\xe6\x51\xeb\x1f\x68\xfe\xee\xa1"
- "\x93\xe1\xf3\x77\x0f\x79\x41\x9a\x5e\x08\xd2\xc3\x25\x20\xcd\xa8"
- "\x03\x84\x0b\xff\x65\x1e\x16\xb8\xa6\xcf\xcc\xfd\xf1\x6d\x50\xee"
- "\x67\x7f\xc1\xf8\xd4\xbc\x03\x63\xe0\xdc\x7b\x34\x2e\xc7\x3a\x9a"
- "\xd7\x9a\xfe\x20\xd2\xf4\x6f\x38\x2e\xe9\xf1\x3e\x1e\x79\x07\x96"
- "\x62\xb8\xe1\x9c\x34\x5d\xeb\xc7\x7b\xbd\x77\x68\x76\xc0\x9a\x0f"
- "\xfe\xe4\x6d\xc6\xde\xea\xd7\x2d\x01\x8c\x63\x83\xba\x4e\x9f\xf5"
- "\xaf\x90\xe2\x74\x07\xa0\x1e\xe5\x6e\x49\x40\x47\xfa\x90\xef\x58"
- "\xf6\x5b\x38\x8b\x2d\xb1\x5e\x82\x61\xac\xcb\x94\xa4\xc8\xf5\x5c"
- "\xb7\xde\xb7\xd9\xcd\x82\x24\xdf\x34\xbf\x80\x79\xc3\xcb\x2f\xe1"
- "\x58\xeb\xe9\x84\x7a\x8c\xa5\x03\x6b\xcc\x23\x3c\x5d\xe6\x1b\xf6"
- "\x04\x61\xe4\x70\x2f\x18\xea\xbf\x42\x19\x5c\x83\xf2\xf7\x15\xca"
- "\xb9\x47\xc8\x39\xed\xbf\xd9\x47\x32\xfe\xfd\x5f\x3a\x1a\xbe\x12"
- "\x32\xce\xe5\x8e\x64\x7c\x35\xca\xdd\xaa\x90\xdc\xf9\xbb\x50\xc6"
- "\xab\xa6\x1d\xae\xb7\x33\xd8\xbc\x02\xa4\x86\x73\x43\x29\x4f\x13"
- "\x7f\x8f\x64\xfc\x6d\x9e\x0f\x42\x71\xd8\xcc\x0f\x7a\x6e\x9d\x53"
- "\x63\x7c\x8a\x5d\x6c\x97\xa6\xa7\x61\xba\xce\xf8\xcc\xdd\x06\xa4"
- "\xf7\x07\x62\x7e\x66\xe6\x51\x8a\xdd\x5d\x48\x0b\xa2\x0b\xc6\xd1"
- "\x77\xb7\x4b\x19\xf1\x44\xc7\xf5\x07\x20\xce\xf2\x30\xeb\x40\x9a"
- "\x25\x31\x3e\xa7\x91\xa1\xe5\xf3\xd4\x15\x46\xf8\x94\xcf\x27\x8a"
- "\x32\x01\xa4\x9b\x3f\x69\x9e\x11\xf9\x5d\xe9\x78\xb9\x87\xeb\x1c"
- "\xd1\xf1\x6c\x11\x48\x4b\xdc\x48\xab\x00\xd2\xaa\x9b\xdb\x82\x3c"
- "\x6e\x0b\x2a\x7f\x5e\x5a\xe6\x62\xc1\xdc\xc2\x38\x56\xfe\x2a\xbd"
- "\xcf\x08\xc0\x62\x0b\xb0\xcd\xe7\x91\x5e\xde\x36\xb2\x1b\xc3\x83"
- "\xeb\x85\x6d\x20\x7a\x0d\x73\x83\x81\x55\x75\x78\x7e\x56\xde\x1c"
- "\x1f\x40\xf9\x25\xfb\xa0\xaf\xd0\x24\xa0\x5e\x0e\xaf\x26\xfd\x45"
- "\x7d\xd6\x57\x70\x7b\x95\x5f\x8f\x7a\xeb\x5f\x6f\xba\xa3\x77\xbd"
- "\xc9\x88\xbf\xdb\x14\x1b\x42\xdf\xd1\xda\x4b\xb4\xad\x7a\x28\x85"
- "\xec\x87\xb3\xd4\x05\x7e\xa4\xed\x70\x1a\x6f\xd6\x9b\x52\x38\x8d"
- "\xbf\x67\x82\x09\x3e\xd0\x60\x9b\x0c\xd8\x5e\x68\x78\x09\x74\x2d"
- "\xe6\x76\x08\xa0\x6e\x28\x74\x9f\xbb\xc2\x08\x88\x57\x3a\x6e\x3a"
- "\x0d\x32\xcd\x34\xb1\xe5\x6e\xc6\x1b\x21\xb9\x9b\xf1\x06\xd1\x4e"
- "\xc8\xdd\x8c\x9a\x6f\xa3\xdc\x7d\x9a\xcf\xe5\x2e\xae\xf7\x56\x2e"
- "\x4f\x49\x4e\xff\xcf\x91\x46\x33\xca\x48\x46\x48\x66\x3e\xf9\x09"
- "\xc9\x4c\xe6\xfe\xff\xae\x32\x73\xb9\xdb\x64\xc4\xdf\x7f\x89\xcc"
- "\x20\x5e\x2e\x33\x44\xab\x4f\xf3\x7b\x40\xa1\x11\xd7\xd5\xca\x3f"
- "\x9b\x8c\x56\x98\x81\xba\x7a\x54\x5f\x71\x1b\xb4\x70\x3a\xcd\x3c"
- "\x6a\x7c\x86\x05\xdb\xa5\xcc\xcf\xac\xbf\x03\x43\x8f\x9d\x31\xa7"
- "\xff\xa7\x10\x4c\xda\x62\xe2\xf3\xd9\xd5\xf3\x2c\xf4\x6e\x84\xde"
- "\x8b\xd0\x1c\x9d\xde\x42\xef\x42\x3a\xe8\x9c\x2e\x0b\xbd\x1f\x61"
- "\x09\x01\x47\x00\xf5\x3a\xb8\xed\x18\x04\x13\x7a\xd1\x47\x98\x99"
- "\xea\x82\x0f\xf8\x5c\x12\xab\x7e\x9d\x7c\x17\xb2\xbf\x7c\xbd\x37"
- "\xbd\x3b\xc1\xfc\x2c\x65\xce\x9f\x6c\x82\x3c\x2f\x27\xcf\xdb\xcd"
- "\x24\x1e\x26\xd2\xbc\x9d\x6c\x53\xee\x57\xe6\xed\x94\x67\xca\xc7"
- "\x72\x53\x69\xce\x47\x55\xee\xb0\x80\x53\xca\x3d\xf4\x4b\xb2\xf5"
- "\xa1\x72\xe2\x19\xc7\x91\xc3\xbd\x12\xe8\xa2\xfa\x18\x49\x95\x16"
- "\xd4\x1f\xed\x59\xe9\x91\x5f\xe2\x55\xc2\xeb\xd3\x78\x8d\xc3\x2b"
- "\xff\x6e\xdb\xe0\xc6\xab\x99\xf2\xf7\x8f\x5f\x97\xe7\xa8\x67\xfe"
- "\x9d\xeb\xe4\xbd\x30\xec\x9c\x7c\xdf\x5d\xf5\x48\x8e\xf2\xee\xa2"
- "\x0f\x3e\xc4\x9f\x4e\xaa\x1b\x79\xa4\x15\xef\x53\xc4\xb3\x0a\xdf"
- "\x5f\xf9\x33\x68\x53\x30\x76\xe1\xdf\xe1\x43\xf9\xd5\x74\x33\xf3"
- "\xc3\xf2\x75\x3a\x7f\xff\x82\x3c\x22\x7f\x4d\xb6\xbf\x1e\xb9\xde"
- "\x26\xa4\x83\x4d\x5d\x6f\x34\x7a\xb8\xa4\x47\xfa\xbd\xd3\x53\xf2"
- "\x06\x47\x8b\x47\x62\x7e\xff\x70\xb6\x29\xc0\x06\x87\x6b\x56\xcc"
- "\xfd\x8f\x2c\x65\x4e\x5e\xee\x81\x80\x23\xd8\x9b\xaf\x3f\x5e\x76"
- "\x7e\x90\xfe\xc5\xac\xc6\x58\x78\x03\x49\x5b\x32\xfd\xf5\x73\x48"
- "\xf6\x93\x5a\x0f\xf8\xe1\xc7\xe7\x3a\xa5\xdc\x7b\x6e\x83\x61\x1d"
- "\x60\x20\xff\x69\xae\xfb\x43\x46\x3e\xd4\x8e\x73\x90\xda\x73\x31"
- "\x5f\xdf\x8b\xbe\xe0\x0f\xce\x41\x46\xf0\x7b\xc9\x89\xd5\x2f\x81"
- "\xb6\x07\xfd\xd5\x9e\xef\x99\xf5\x9f\x9e\xe9\x04\xd4\x93\xbc\x56"
- "\xaf\x0b\xf6\x21\x2c\xfb\x4b\xfe\xf0\x39\x05\xcc\x77\xa2\xe0\x4d"
- "\xc8\x35\x05\x1c\xe5\x5f\xc0\x30\xb4\x45\x06\x67\xe9\x4f\xf9\x3b"
- "\x85\xf8\x0d\x92\xd1\xe9\xff\x12\xb6\xbf\x84\x36\x0c\x6d\x96\xf5"
- "\x39\xb4\xd5\xfe\x4b\xb0\x47\x6d\xab\x5f\xfe\xd7\x90\xad\xbe\x88"
- "\xb6\xba\x0a\x6d\xb5\x35\x19\x5a\x2d\x0e\x40\xdb\x31\x74\x9e\x45"
- "\xef\x2b\xb7\xa0\xcd\xde\x80\x36\xbb\xf4\x4b\xe0\xf6\xda\xdd\x09"
- "\x68\x6b\x87\xef\x5d\x05\x23\x7b\x57\xa3\xcd\xbe\x68\xbe\x61\x77"
- "\xb9\xb0\xd9\xef\xae\x42\x9b\xbd\x1a\x7d\xe2\x55\x68\xb3\xdd\x51"
- "\x6c\xf6\x85\x18\xfe\xb0\x6c\x7f\x7a\x56\x9b\xa4\x77\x25\x06\x9b"
- "\x9e\x03\x69\xf7\x1f\x87\x0e\x52\x4e\x66\xa7\xc6\xe2\x01\xd1\x9b"
- "\xe8\x1f\x44\x3e\xb4\x20\x0f\xb8\xdf\xea\x1b\x9a\xdd\x8b\x63\x5a"
- "\x60\x78\x79\xcd\x4f\xce\xb5\x49\xc3\x4b\xc0\x30\xcf\xf2\x21\xeb"
- "\x59\x93\x8f\x7e\x7f\xfe\x30\x7f\xf5\x96\xcc\x6a\xf4\xa9\x03\xe8"
- "\x7b\xf7\x76\x27\xeb\x90\x06\x06\xcf\x7a\xb3\x9e\x68\x18\xbc\x15"
- "\xf9\x39\xe4\xee\x0c\xb4\xa1\xe9\x7b\x5f\x82\xa9\xbd\xdb\xcb\x8f"
- "\xb2\xed\xe5\x87\x02\xdb\xcb\x0f\x63\xd9\xe1\x4f\xb8\x88\x2f\xff"
- "\x01\x98\x76\x92\xed\xa8\xa8\x09\x0c\xdb\x92\xe9\x19\x56\x7e\x04"
- "\x9f\x9b\x29\xbf\x7c\x29\x0c\xcb\x35\x5d\x76\x08\x7e\xfd\x08\x88"
- "\x4f\x82\x5f\x9f\xc1\x76\x8c\xfb\x68\xcc\xe5\xe3\xab\xcc\x33\x8c"
- "\x17\xb8\xbf\x1f\xe2\x5b\xc4\x18\x2b\xf3\xad\xc5\xed\x00\x1c\x4f"
- "\x86\xf6\x8d\xb5\x9c\x6f\x9f\x81\x32\xce\x22\xbd\x87\xef\xc5\xb1"
- "\xb6\xf7\x9b\x1a\x6b\xe5\x38\x86\xc6\x5a\x1a\x67\x89\x6f\xef\x0e"
- "\x9a\x6f\x8f\x9e\xb9\x36\xbe\x59\x0d\xd7\xc8\xb7\xda\x10\xdf\xac"
- "\x19\x6c\xbb\x35\x2d\xb0\xdd\x9a\x1e\xce\x37\x6b\x5e\x88\x6f\xd6"
- "\xa9\xf8\x9c\x1d\xe2\xdb\xa5\x41\xf0\x2d\xfe\xab\x6f\x2f\xdf\xb2"
- "\x6b\xaf\x91\x6f\xd7\xaa\x6f\x6e\x15\xdf\x50\xdf\xac\xa8\x6f\xd6"
- "\x08\x7d\xb3\xaa\xf4\xcd\x8a\xfa\x66\x55\xe9\xdb\xf9\x41\xf0\xed"
- "\xba\xf6\x6f\x2f\xdf\x1e\xcf\xb9\x36\xbe\xd9\xae\x51\xdf\x4c\x59"
- "\x21\xbe\xd9\x50\xdf\x6c\xa8\x6f\xb6\x08\x7d\xb3\xa9\xf4\xcd\x86"
- "\xfa\x66\x53\xe9\xdb\x67\x83\xe0\xdb\xf5\xff\xf9\xed\xe5\x5b\x8e"
- "\xf6\x1a\xf9\x76\x8d\xfa\x66\xaa\x57\xf1\x0d\xf5\xcd\x86\xfa\x66"
- "\x8b\xd0\x37\x9b\x4a\xdf\x6c\xa8\x6f\x36\x95\xbe\x7d\x30\x08\xbe"
- "\x4d\xa9\xfa\xf6\xf2\x6d\xee\xd1\x6b\xe3\x5b\xc5\xb5\xea\x9b\x37"
- "\xc4\xb7\x0a\xd4\xb7\x0a\xd4\xb7\x8a\x08\x7d\xab\x50\xe9\x5b\x05"
- "\xea\x5b\x85\x4a\xdf\x36\x0f\x82\x6f\x0b\x1f\xf9\xf6\xf2\x2d\x37"
- "\xe6\xfc\xa7\xc2\x37\x85\x67\xc4\x3f\xce\x37\x96\x0f\x7e\xf4\x27"
- "\xff\x6d\x99\xe0\x1b\xf1\x8b\xf3\xae\x2b\x5f\xbf\x5d\xe6\x99\x5f"
- "\xe6\x19\xd1\x8f\xf8\x46\x7e\x24\xe7\x9b\x46\x3b\x92\x7c\x48\x3f"
- "\xfa\x92\x8a\x1f\xf9\xb8\x99\xf9\x5a\xcc\xff\xda\xe7\x47\xfa\x23"
- "\xfd\xc8\x15\x6a\x3f\xf2\xa7\x61\xfc\xaa\xfe\x1a\xf9\x25\xc9\xfc"
- "\x7a\x21\x86\x1f\xf9\xd2\x6f\x62\xf0\xeb\xe4\x55\xf9\x85\xbc\x19"
- "\xd9\xdb\x25\xf8\xf5\xae\xec\xff\xd7\x17\xff\x83\xfc\x5a\x83\xfc"
- "\x22\xff\xff\x33\x90\xf6\x2c\x1e\x2c\xbf\x9e\xbc\xaa\xff\x1f\x9d"
- "\x5f\x36\xc3\xe0\xf8\x65\xca\x0a\xf1\xcb\x96\xe6\xc7\x31\x4d\x19"
- "\xcf\x42\xfc\x12\xe3\x99\x3f\x72\x3c\x5b\xa1\x1e\xcf\x06\xc2\xaf"
- "\x88\xf1\xec\x5b\xc5\xaf\xa7\x62\xce\xff\x07\x30\x16\x0f\xa0\x9d"
- "\xa3\xf9\xca\xe1\x9d\x18\x27\xfb\xd9\x5f\xe6\x79\x31\x4e\xf6\x0f"
- "\xcd\xde\xb9\x0a\x52\x7b\xd7\x63\x9c\x8c\xbc\xab\x5e\x05\x19\x55"
- "\xab\x40\x1b\x7c\x05\x63\xe5\x73\x18\x2b\xa3\x7d\xea\xf9\x9b\x59"
- "\x7f\xa2\xc0\x03\x41\x8c\x95\x69\x1e\x0c\xdb\x9b\xca\xfe\x86\xb1"
- "\x72\x07\xda\xbe\x8e\x77\x45\xac\xfc\xa5\x12\x2b\xff\x22\x2c\x56"
- "\xfe\xc1\xcb\x72\xac\x2c\xd3\xbf\x5e\x4d\xfb\xe7\x7f\x12\x23\x56"
- "\x6e\xbe\x6a\xac\x4c\x31\xf2\x1e\x8a\x97\x2f\x9a\x47\xec\x96\x6d"
- "\xdb\xbb\x17\xfe\xc1\x58\xf9\x22\xc6\xca\x76\x41\xfb\x77\x07\x4d"
- "\xfb\x05\x31\xd7\x7f\x90\x6e\x90\xbe\xf4\x8d\x45\x48\x67\x65\x0c"
- "\xea\xc5\x31\x88\xe6\x33\x7a\xaa\xcb\x6b\x51\x5e\xb9\x7e\xf0\x31"
- "\x69\x7d\xb2\x8e\x74\x83\xf4\x84\x74\x83\x8f\x45\x68\x07\xd9\x90"
- "\x7b\x72\xf6\xbd\x0c\x53\x1b\x5e\x86\x74\xff\xb0\xf0\x18\xf9\xf1"
- "\x42\xe2\x47\xc8\xb6\x05\x23\x6d\xdb\x72\xb5\x6d\xfb\x45\xff\xb1"
- "\xe8\x6a\xb6\xed\xe5\x58\xba\xd2\x7c\x55\x5d\x21\x1d\xe1\xe3\x11"
- "\xea\xcb\x7f\x85\xae\xbc\xfb\xa7\xc1\xf2\xeb\x99\x98\xeb\x3f\x06"
- "\xc6\x2f\xeb\xc8\xab\xf3\xcb\x6a\x40\x7e\x35\x86\xf8\x15\x1e\x1b"
- "\x87\xf8\x25\x62\xe3\x60\x64\x6c\xbc\x5c\x1d\x1b\x0f\x84\x5f\x91"
- "\xb1\xf1\xb7\x89\x5f\xcf\xc6\x5c\xe7\x37\x40\x7e\x0d\x40\xbf\xac"
- "\xa4\x5f\x5e\x15\xbf\xc2\x62\x62\x15\xbf\x54\xfa\xa5\x8a\x89\x97"
- "\xab\x63\xe2\x81\xf0\x2b\x32\x26\xfe\x36\xf1\xeb\xb9\x98\xeb\x3f"
- "\x06\xc6\x2f\xdb\x00\xf4\xcb\x86\xfa\x75\x6f\x76\x88\x5f\xe1\xb1"
- "\x70\x88\x5f\x36\x95\x7e\xa9\x7c\x87\xe5\x6a\xdf\x61\x20\xfc\x8a"
- "\x8c\x85\xbf\x4d\xfc\x5a\x68\xf8\x07\xf9\x35\x00\xfd\xb2\xa1\x7e"
- "\xdd\x5b\xaf\xe2\x57\x58\x0c\xac\xe2\x97\x4a\xbf\x54\x31\xf0\x72"
- "\x75\x0c\x3c\x10\x7e\x45\xc6\xc0\xdf\x26\x7e\x2d\x72\xfc\x63\xfc"
- "\xaa\x18\x80\x7e\x55\x90\x7e\x79\x42\xfc\x0a\x8f\x7d\x43\xfc\xaa"
- "\x50\xe9\x97\x2a\xf6\x5d\xae\x8e\x7d\x07\xc2\xaf\xc8\xd8\xf7\xdb"
- "\xc4\xaf\xc5\x96\x2b\xc5\x52\xea\x18\xca\x6f\x0d\xf1\x8b\x78\xd3"
- "\x8b\xb1\x53\x6f\x52\x79\x6d\xec\xf8\xe9\x9e\x9c\x58\xf1\x2e\x9d"
- "\x07\xf3\x78\x27\xed\x09\x11\x3e\x21\x8b\xf0\x09\x5b\xcc\x3f\x81"
- "\xf0\x98\xf7\x83\x7e\x31\x54\xaf\x32\x47\xb1\x34\x56\xcc\xfb\x1f"
- "\xd7\x1c\x43\x11\x9f\x28\x8e\xf2\xaf\x41\x3e\xc9\x7e\xfc\x9e\x7f"
- "\x70\x8e\xa2\xb7\xcb\x24\xed\x41\x3f\xbe\x6c\x29\xc6\x50\xcb\x06"
- "\xcb\xa7\x82\x98\xfb\xbf\x69\x9e\x88\x62\x5e\x8a\xa5\xe8\xbd\x63"
- "\x6b\x47\x27\x54\xad\x03\x03\x7f\xf7\xd8\x19\xfe\xee\x71\xe7\x59"
- "\x8c\xa9\x56\x23\xdf\x7a\xf3\x61\xc7\x59\xc8\xa8\x7e\x59\xc4\x54"
- "\x4a\x3c\xd5\xea\xf5\xf1\x77\x8f\x4e\xbf\x0b\xe6\xb8\x98\xaf\x01"
- "\xe1\x29\x8e\x3a\x51\xf0\x2e\x90\xae\x58\xbf\x80\x61\xc4\x03\x8c"
- "\xc1\x38\x3f\xd4\x31\xd4\x3e\xf5\xfb\xc6\x97\x62\xc5\x50\x57\x7f"
- "\xdf\x58\x7f\x41\xc4\x4f\xfc\x7d\xe3\x7f\x8b\x18\x6a\x69\xcc\xf7"
- "\x1f\x73\x7f\x2c\xe6\x1b\x88\xf6\x4e\x93\x1f\x50\x9e\xfe\xa2\x77"
- "\x8b\x79\x3d\xff\x8e\xf2\x1a\x8a\x69\x29\x9e\x75\x96\x36\x43\xd5"
- "\x46\x30\xf4\x74\xe7\xeb\x31\x46\x1d\xe6\x47\x5b\xf7\x83\x73\x82"
- "\xf6\x9b\xcf\x83\xc1\xf3\x8a\x99\xaf\x95\xa1\x58\x96\x74\x85\xbf"
- "\x73\x5c\x06\xe9\xf5\xed\x30\x95\xeb\x07\xea\x85\x7f\xfb\x96\xcc"
- "\xe0\xb0\xf2\xc3\xa4\x27\x73\xce\x30\x1f\xf1\x80\xf4\xe3\xd3\x33"
- "\xc4\x9b\x9f\x82\xf5\x33\xc1\x1b\xce\x17\x29\xfc\x5d\x70\x7f\xdd"
- "\xf8\xcf\x18\xfc\x39\x32\x30\xfe\xac\x0e\xe7\xcf\xde\x6b\x7d\x1f"
- "\xac\xac\x8f\x5c\x6d\x92\xf6\xca\xef\x83\xdf\x7d\x7e\xb0\xfc\x79"
- "\x31\xfd\xda\xf8\x63\x35\x5c\x1b\x7f\xac\x69\xfc\xdd\x62\x18\x7f"
- "\xac\xd9\x82\x3f\xd6\x74\x8a\x95\x42\xfc\xb9\x34\x40\xfe\x44\xc4"
- "\x48\xdf\x2a\xfe\x14\xc6\x9c\xff\xb9\x0a\x7f\xae\x51\x7f\xac\x87"
- "\xf8\x3b\xc4\x70\xfe\xc8\xfa\x63\x3d\x4c\xb1\x51\x88\x3f\xe7\x07"
- "\xc8\x9f\x88\x98\xe8\x5b\xc5\x9f\x97\x62\xce\x7f\x5f\x99\x3f\xb6"
- "\x6b\xd4\x1f\x5b\x1a\x7f\x57\x18\xc6\x1f\x9b\xac\x3f\xb6\x74\x8a"
- "\x85\x42\xfc\xf9\x6c\x80\xfc\x89\x9c\x3f\xfd\x36\xf1\xc7\x3c\xf2"
- "\x1a\xf9\x73\x8d\xfa\x63\x3b\xc4\xdf\x09\x86\xf3\x47\xd6\x1f\xdb"
- "\x61\x8a\x7d\x42\xfc\xf9\x60\x80\xfc\x89\x88\x79\xbe\x55\xfc\x59"
- "\x11\xf3\xfc\xa7\x2b\xf3\xa7\xe2\x1a\xf5\xa7\x22\x8d\xbf\xfb\x0b"
- "\xe3\x4f\x85\xac\x3f\x15\xe9\x14\xeb\x84\xf8\xb3\x79\x80\xfc\x89"
- "\x88\x71\xbe\x55\xfc\x79\x65\xc1\xd5\xde\x17\x29\xbe\xb3\xfa\xbd"
- "\x6c\x2f\xfa\x6f\xe4\x3f\x93\xef\xdc\xea\x3d\x02\xfe\xd5\x82\x37"
- "\x55\x5f\x83\xa1\x5a\xe6\x0d\x7f\x27\xfb\x8a\x78\x27\xcb\xfd\xb6"
- "\xef\xdf\x9d\xc1\x2a\xb4\x23\xc9\x2f\xe3\xef\x5d\xf9\xbb\x89\xe3"
- "\x94\xd7\xdc\xab\xf2\xdf\x28\x46\x45\xdf\x1b\x28\x4e\xb5\x7e\x39"
- "\x08\xbf\x6d\x59\x2c\xbe\x5c\xfd\xdd\x44\xbd\x6a\x1d\x9f\x12\x7b"
- "\x7e\xa3\x7c\x19\xf4\x7b\xd7\xa2\x98\xe7\x3f\x5e\x99\x2f\x36\xc3"
- "\xe0\xf8\x82\xe3\xcd\xf7\x4d\x59\x82\x2f\x9f\x45\xf0\xc5\x96\xdd"
- "\xab\x1a\x77\x06\xce\x97\x88\xf1\xe6\x5b\xc5\x97\x55\x5b\x63\xc6"
- "\x9a\x68\x97\x88\x27\xb4\xbe\x7b\xe7\x32\x48\xad\x6a\x87\x8c\xde"
- "\xbf\x25\x27\xce\x43\x3b\xd7\xfb\x4a\xb2\xae\x15\x6d\x5c\xb9\x97"
- "\xfd\x65\xb8\x77\x68\xf6\x6f\x4f\x79\xa0\xb5\xc0\x05\x3d\xeb\xf3"
- "\x61\xfb\x39\x5a\xab\x7e\x04\xb6\x15\x53\x2c\xff\x73\xf8\xf4\xcc"
- "\x57\x30\xef\x00\xeb\x75\xba\x8f\x80\x63\xe3\xcf\x81\xbd\x62\x4a"
- "\x6c\x40\x98\x25\x48\xc3\x0b\xd2\xea\x8c\xcb\x18\x8f\x4e\x28\x05"
- "\x43\x8e\x9b\xf9\x5a\xdd\xbf\x85\x3d\x58\xd7\xf1\x52\x00\xa2\x2f"
- "\xf1\x64\xfb\xcb\x14\x7f\x7e\x20\x78\xf2\xa4\xe0\xc9\xbb\xaa\xf8"
- "\xd3\x88\xf9\x67\x2d\xc8\x8f\xbf\x47\xf0\xe3\x4c\x27\x20\x7d\x87"
- "\xce\xf3\x22\x3f\xbc\x0a\x3f\xce\x43\xf9\xab\xc4\x0f\x57\xdf\x7a"
- "\xd7\x1e\x99\x1f\xf5\x64\xbf\x2c\x60\xd8\xad\xc4\x9f\x17\x54\xfc"
- "\x50\xf6\x64\xa9\xf9\xa1\xc4\xfe\xeb\x91\x1f\xeb\x42\xf1\xe7\x65"
- "\x8c\x3f\x77\x63\xfc\x69\xfd\x1d\x48\xbb\xcb\x07\xcb\x0f\x4b\xcc"
- "\xf1\x5f\xe1\x05\x8d\x2d\xbd\xc3\xcb\x6b\x88\x0f\xce\xd2\x43\x40"
- "\x3c\xa1\xf1\x24\xf0\xb7\x64\x5d\x59\x09\xea\x8e\x6b\x68\x76\x0f"
- "\xc3\x98\x1f\xe3\x7d\xe7\xa2\x3f\x02\xcd\x19\x08\x1e\xf4\xf6\x3a"
- "\x3d\x47\x80\x68\xef\xd8\xf8\x47\xce\x87\x0b\x92\xe5\xe8\x62\x2f"
- "\x48\xe3\x51\x0e\x31\xde\x37\x2c\xa1\x7d\xb9\x68\xdb\xf6\xbc\x04"
- "\x53\x73\x2c\xcc\x47\xb1\x29\xe9\x10\xad\x3d\x21\xbb\xd6\x6a\xf9"
- "\x0d\xd0\xbc\x4e\xef\xb0\x2d\x99\xc7\xd1\x93\x24\xfb\x46\x74\x8f"
- "\x5f\x1b\xe2\x13\xad\x27\xe1\xbc\x7a\x7a\x00\xeb\x5c\xd5\xfc\x5a"
- "\xe4\x1a\xd0\xfa\xe4\x1e\x79\xbe\xa0\x5e\x99\x53\xbb\xd6\xf9\x02"
- "\x65\x4e\xed\xa2\x58\x4f\x62\x3d\x8d\xfa\x33\x68\x7e\xbd\xda\x34"
- "\x30\x7e\x59\x0d\x83\xe7\x57\x77\x14\x7e\x15\x17\xf5\xe7\x97\x35"
- "\x4d\xc5\xaf\xda\x10\xbf\xac\xd9\x82\x5f\xd6\xf4\x10\xbf\xac\x53"
- "\xaf\xce\xaf\x2b\xac\x6f\xfd\xa7\xe7\xd7\x9a\x98\xf1\x4f\x04\xbf"
- "\xae\x41\xbf\x2e\x46\xe1\x57\x49\x4a\x14\x7e\xa9\xf5\xcb\xad\xe2"
- "\x97\xac\x5f\x56\x95\x7e\x59\x07\xa0\x5f\x57\x58\xd7\xfa\x4f\xcf"
- "\xaf\xb5\x31\xd7\xff\x84\xf3\xcb\x76\x0d\xfa\xf5\x79\x14\x7e\xad"
- "\x3d\xd1\x9f\x5f\x36\x95\x7e\xa1\x6f\xd1\xc7\x2f\x9b\xac\x5f\x36"
- "\x95\x7e\xd9\x06\xa0\x5f\x57\x58\xcf\xfa\x4f\xcf\xaf\x75\x57\x5c"
- "\xff\xa3\xe2\xd7\x35\xe8\xd7\x87\x51\xf8\xb5\xbe\x2c\x0a\xbf\x54"
- "\xfa\x65\xaa\x57\xf1\x4b\xd6\x2f\x9b\x4a\xbf\x6c\x03\xd0\xaf\x2b"
- "\xac\x63\xfd\xa7\xe7\x57\x69\x4c\xff\x2f\x9c\x5f\x15\xd7\xa0\x5f"
- "\xd6\x28\xfc\xda\x30\xb6\x3f\xbf\x2a\xd4\xfa\xe5\x0d\xf1\xab\x42"
- "\xd6\xaf\x0a\x95\x7e\x55\x0c\x40\xbf\xae\xb0\x7e\xf5\x9f\x9e\x5f"
- "\x1b\x63\xce\x7f\xab\xf9\xd5\xb3\x43\xf1\x0f\x0f\x84\xf3\x0b\xfd"
- "\x75\x7d\x87\x88\xad\x14\x7e\xc5\xf6\x0d\x37\xb6\xf5\xf1\xea\xcb"
- "\x90\x6f\xc8\xf9\x24\xbf\xa7\x20\xfe\x90\x8f\x48\x3e\x61\xcf\x76"
- "\xc1\x23\x7a\x07\x78\x45\xbf\x70\x20\xfb\x9f\xae\x81\x4f\x4a\x5c"
- "\xf5\x8d\xf3\xe9\x0f\xd7\xc2\xa7\x4d\x31\xf7\x3f\x85\xf3\x49\x19"
- "\xb7\x06\xca\xa7\x68\x63\x56\x99\xad\x3f\x9f\x6c\x69\x21\x3e\x89"
- "\x71\x8a\xc6\x2e\x1a\xab\xc2\xf9\x74\x85\xf1\x6a\x20\xfb\x2f\xfe"
- "\xe9\xf9\xb4\x39\xb6\xfd\x93\xf8\xb7\xcd\x0f\xd5\x48\xc1\x23\xf8"
- "\x73\xe0\xaf\x19\xd3\xe2\x31\x8d\x7f\xe7\xaa\x46\xce\x0b\x54\x01"
- "\xed\xd3\x76\xe8\x35\x05\x74\x9e\x2e\xc1\x0c\x51\x60\xf4\x15\x90"
- "\x89\xfd\x11\x70\x12\xd8\x30\xdd\x31\xac\x22\x73\x08\xc2\x37\xb3"
- "\xaa\x47\xfc\x98\x36\x94\x60\x59\x85\x96\xbf\xf3\xd5\x6b\xf8\xd9"
- "\x37\x32\xbc\x06\x08\x9e\x60\x11\x4e\x27\xc3\xa5\xf0\x3d\xc1\x92"
- "\x04\x0d\xfd\xdb\x96\x20\xc3\x18\x83\x76\x30\xaa\xdb\x38\x4c\x93"
- "\xc9\x71\xc9\x70\x89\x01\xfb\xff\x3a\x40\xb0\x81\x0a\x6d\xaa\x1a"
- "\x8e\x3d\x02\x84\x57\x81\xbb\x4e\xc6\x67\x0a\xeb\xef\x1d\x00\xc3"
- "\x2a\x8c\x1c\xdf\x30\xb7\x04\x72\xfb\x92\x58\xe2\xcc\x93\x1c\x5e"
- "\xa3\x1d\x1b\x06\x3f\x04\xd4\xfd\x18\xc6\x86\x8c\x4d\x97\xe1\xd2"
- "\x82\x12\xf0\x6f\x3a\x61\xba\x56\x4d\x6b\x19\x76\xb8\x42\x47\xe4"
- "\xb5\x56\xdd\xdf\x00\xf6\x7f\xaf\x68\xa3\x3e\xf0\xfd\xfb\xb2\xe4"
- "\xbe\x4c\x55\xd7\x4b\x70\x58\x6e\xa2\xcc\x13\x03\xf6\x23\xa3\x0f"
- "\x5f\xf5\x3c\xb3\x02\x67\x0d\xc0\xcd\xc8\x23\x87\xd3\x0c\x20\xf7"
- "\xfb\x7a\x56\x35\xab\x46\xee\x7b\x66\x38\x1d\x35\x2e\x85\x8e\x08"
- "\x93\x85\xb0\x23\x10\x26\x4b\xc1\x1b\xb0\xf3\x3d\xfb\xa2\xdf\x76"
- "\xff\x0d\x24\x17\x2d\x9d\x40\xb2\x4c\x78\x6f\x90\x71\x66\x8b\x3e"
- "\x1b\x60\x6f\x1f\xaf\xb5\x94\xe7\x90\xe1\x46\xf2\xfe\x24\xe6\x1e"
- "\x0d\x68\xb4\x39\xfd\x61\x75\x6a\xd8\x1b\x05\xec\xec\x22\x84\xcd"
- "\xeb\x0f\x6b\x50\xc3\x8e\x12\xb0\x8f\xa5\x22\xec\x82\xfe\xb0\xfe"
- "\x11\x2a\xd8\x9b\x04\x6c\xf6\x19\x84\xcd\xef\x0f\x6b\x54\xc3\x26"
- "\x0b\xd8\x27\xa9\x0d\x8b\xfa\xc3\x66\xaa\x61\x6f\x16\xb0\x8f\xd7"
- "\x22\x6c\x41\x7f\x58\x9b\x1a\xf6\x16\x01\x9b\x93\x83\xb0\x85\x91"
- "\xb0\x0d\x5c\x0e\xe0\x0e\x59\x0e\xfe\x45\xc0\xce\xd3\x22\xac\x39"
- "\x4a\xdf\xe2\x38\x5e\x01\x9b\x22\x60\x67\x75\x22\x6c\x51\x14\x5e"
- "\xa8\x61\x6f\x15\xb0\x8b\x8f\x20\xac\x25\x0a\x2f\xd4\xb0\xb7\x09"
- "\xd8\x05\x75\x08\x5b\x12\x85\x17\x6a\xd8\xdb\x05\xec\x33\xd9\x08"
- "\x5b\x1a\x85\xbe\x21\xd8\xc4\x67\x7d\x08\x53\x86\x34\x39\x19\x85"
- "\xb6\x6a\x9c\xa3\x05\xce\xe7\x0e\x20\xbc\x2d\x0a\x6d\xd5\xb0\x77"
- "\x08\xd8\x85\xf9\x08\xbb\xb5\x3f\x2c\x68\xf6\x0a\xfa\x4e\x92\xe9"
- "\x7b\xa7\x80\x7f\x41\x87\xf0\x95\x51\xe8\x4b\xf9\x0e\x59\xd7\x52"
- "\x05\xec\xfc\x14\x84\xad\x8e\x42\x5f\x35\xec\x18\x01\xfb\x4a\x3d"
- "\xc2\xd6\x44\xa1\xaf\x1a\xf6\x2e\x01\xbb\x94\x64\xb2\x36\x0a\x7d"
- "\xd5\xb0\x77\x0b\xd8\x17\xcb\x10\xb6\x2e\x4a\x7b\xef\x50\xc1\x9a"
- "\x04\xec\x72\x6a\x6f\x7d\x14\x5e\xa8\x61\xef\x11\xb0\x2b\xd3\x11"
- "\xb6\x31\x0a\x3f\xd4\xb0\xf7\x0a\xd8\x97\x48\x8f\xf7\x47\xe1\x87"
- "\x1a\xf6\x3e\x96\x68\x5e\x24\xdb\xc5\x03\x91\xb0\xc8\x7b\x61\x13"
- "\xed\x30\x96\x25\xae\xf0\xe3\x3d\xc1\x1d\xe4\x67\x56\x49\x7d\xf6"
- "\x66\x32\xd9\x1b\xd9\x86\x8d\x63\x89\x05\x05\x32\xbe\x43\xfd\xea"
- "\xb6\x6b\xd5\xb0\xe3\x59\xe2\xc6\x32\x19\xf6\x70\x7f\x58\x9d\x1a"
- "\x76\x02\x4b\xb4\x28\xed\x3c\xd2\x1f\xd6\xd0\x07\xcb\x12\x8b\x93"
- "\x10\xe6\xe8\x3e\xd9\x36\xaa\xda\x39\x49\x85\x6f\x22\x4b\x5c\x73"
- "\x54\xc6\xe7\xe8\x8f\xcf\xa8\x86\x9d\xc4\x12\xcb\x52\x65\xd8\xa6"
- "\xfe\xb0\x99\x6a\xd8\xc9\x2c\x71\x6d\x91\x0c\xdb\xdc\x1f\xd6\xa6"
- "\x86\x4d\x67\x89\xeb\x53\x64\xd8\x13\xfd\x68\x4f\x7a\x60\x47\x5f"
- "\x40\xd8\xa4\xfb\x59\x62\xe9\x09\x19\x36\xcc\x0f\x50\x8d\xc3\x53"
- "\x04\xdf\x57\x9d\x40\xbe\xf3\x78\x18\x6d\x7e\x5b\x34\x1f\xc3\x72"
- "\x2f\x5c\x77\x4e\xfa\x7e\xa9\x18\x93\x94\xb3\xe9\x5f\xe7\x63\x4e"
- "\xb0\x7e\x8e\x25\xd7\xcb\xfc\xea\xb4\x9d\x12\x3b\x39\xc1\x0b\x5a"
- "\x7e\xde\xf1\xb0\xd7\xeb\x5c\x98\xee\xb9\x75\x4e\x4d\x77\xd5\xf7"
- "\xb7\xba\x34\x77\x95\xd0\xf9\x1d\x78\x5f\xe3\x82\x97\xb5\x74\xbf"
- "\xd3\xce\xe8\xec\x71\x4d\x60\xc7\xbc\x34\x67\xd0\x4d\x67\x5f\xf9"
- "\x10\x87\xef\xac\x05\xe2\x8c\xc5\x40\xef\x5a\x7a\x9c\xa5\x6e\x38"
- "\x2b\x7d\xff\x34\x5b\x6d\xce\xc0\x36\xe4\x61\x7d\x85\xed\xf8\xcc"
- "\xdb\x80\x3e\x10\x8e\x95\x39\x8e\x62\x3a\x4f\xe8\xf5\x78\xcf\xb0"
- "\xca\x3c\xb6\x65\x61\xa7\xa5\x1c\x6e\x3f\x27\xbd\xce\xf7\xae\xf2"
- "\xb3\x45\x2e\x9a\x1f\x0e\x0e\x9b\x97\x43\x67\x8e\xb0\xba\x6d\x69"
- "\xe2\x3c\x92\xd7\x67\xf2\x36\xdb\xd9\x49\x96\x32\xa7\x20\xd8\xb3"
- "\xd5\x46\xdf\x3e\x70\x94\x9f\x83\x76\x55\x9e\xe7\xe6\x6d\xfc\xac"
- "\x12\xec\x53\x41\xd4\x33\x3c\xec\xa0\x67\xdb\xe7\x99\xbb\xab\x5e"
- "\x37\xa3\xbf\xd6\x24\xfa\xf8\x7a\x89\x0b\xd8\x02\xf9\xde\xe6\xd2"
- "\x48\x20\xdf\x57\xbb\x34\x29\xa7\xe4\xfb\x3a\xe5\x2c\x95\xe8\x67"
- "\xbb\xcc\xc3\xfe\xce\x5b\x10\xdc\x93\xaf\x23\xff\x92\xce\x59\x63"
- "\xc3\xe6\x65\x18\x6f\xa3\x6f\x5a\x54\xa6\x61\x9d\x0b\xc4\xf9\x98"
- "\xaf\x5f\xc2\xab\x5e\xbe\x7a\xe4\x2b\x23\x18\xce\xb7\x94\x39\x2e"
- "\x56\x6d\x37\x51\xdf\xca\x03\x2c\x88\x78\x4b\x59\xe5\xd1\x66\x67"
- "\x69\x27\x88\x73\xa5\x2b\x47\xf3\x73\x6e\x88\x76\x48\x5f\x96\x70"
- "\xb4\x99\xd7\xb5\xbd\x32\x4f\xdd\x2e\xda\x0c\x92\x36\x71\xd2\xe4"
- "\xf4\xfb\xa7\x3c\x30\xf5\xc1\xa5\xcb\x5e\x2c\x5c\xfe\xd2\xf7\xcc"
- "\x2b\x5e\x7e\xa5\x68\xe5\xaa\xd5\x96\x57\x8b\xd7\x94\xac\x5d\xb7"
- "\xbe\x74\xc3\x46\x82\xeb\xeb\xc3\x9e\x2c\x8d\x57\x02\xac\xe7\x11"
- "\xaa\xe7\x6d\xde\x1e\x4c\x13\xf4\xaf\xdc\xaa\x35\x46\xf7\x6d\x9d"
- "\xe8\x6d\xd2\x39\xcb\x6e\xa9\xf2\x0b\x3a\xf3\x19\xf9\xac\x71\xd6"
- "\x3f\xe6\xa0\x73\xf8\x3b\xa4\xca\x53\xad\x9e\xc7\x1c\xf4\x1d\x88"
- "\x63\xc9\x9d\x90\x7a\x07\x9d\xd5\x5f\xe9\xa0\xfc\x86\xbb\x00\x9a"
- "\xb0\x6c\x34\x9c\x77\x18\x20\xf9\xad\x51\xcc\x53\x3b\x8a\xb9\x09"
- "\x7f\xed\x2e\xd6\xe9\xd9\x64\x86\x1d\xf8\x8c\xb2\x66\x38\x2b\x6d"
- "\x7b\xfb\x58\x0a\x3f\xcf\x3c\x65\xdf\x2e\xd6\xb1\x75\x14\xeb\xd8"
- "\xb2\x8b\xb9\x1b\x46\x31\x57\x6a\x2d\x24\x75\x57\x6d\xcb\x76\x49"
- "\x95\xfc\xac\xe8\x9d\x98\x1f\x4c\xac\xcc\xdc\x89\x79\x13\xfc\x10"
- "\xd7\x80\xcf\x98\xe6\x3d\x66\x14\xed\x7e\xff\x2b\x5f\x3c\xe2\x1b"
- "\xcb\x7a\x8b\x34\x3b\xb0\x1e\xc1\xa7\x6d\xbf\x6c\x42\x4d\xc2\xfa"
- "\x3c\x4e\x5f\x3b\xb8\xa4\x6d\x47\x1a\xbe\xe6\xf5\xe9\x9d\x75\x6e"
- "\x20\x7c\x3f\x2b\xf6\xc5\xaf\xb9\x85\xf9\x11\xb6\x2e\xb8\xa9\x48"
- "\x83\x30\x25\x88\xdb\xab\xee\x8f\xe9\xa5\x95\x25\xc6\x55\x6b\x8b"
- "\x8a\xee\x49\x04\x13\xbf\x86\x7d\x43\xa2\x04\xf1\xc1\x5b\xbb\x58"
- "\x13\xf6\xd3\x81\xfd\x6d\x6e\x41\x0f\x1a\x65\x06\xb0\x4f\x35\x67"
- "\xa5\xaa\x61\x98\x7e\x14\xef\x8f\x62\xdb\x9b\xc5\x77\x07\xf6\x3c"
- "\xc8\xaa\xb6\x35\x61\x3b\x9b\xe9\x9c\x5a\x3a\x7f\xaa\x6b\xfd\x02"
- "\x0d\xf6\xbb\x16\xe1\x9a\x8d\xb7\xc0\x18\x2c\xf7\x36\xb6\x63\x3f"
- "\xde\x13\x3c\xd7\x0d\x84\x6f\x12\xfd\xda\xc3\xcf\xb2\x47\x5a\x39"
- "\xf6\x8e\x62\xd5\xdd\x55\x55\x16\x3a\x9f\x8e\x9f\xdb\x8d\xcf\x48"
- "\x97\x66\x84\xad\xe9\xb2\x2e\xd0\x60\x3c\xa5\x69\x08\xe1\xcc\xa4"
- "\x36\x51\x3b\x28\xa6\xfb\x14\x3d\xa8\x60\x6f\x3e\x8c\xf3\x81\xe6"
- "\xd3\x0e\x80\xfa\x5d\xac\x11\x7f\xf5\xf8\xab\xfb\x2d\xe6\x7d\x82"
- "\xbf\x66\x4c\x3f\x81\xd7\xdf\xe2\xf5\x93\x0e\xfe\x0e\x2e\x99\xda"
- "\xbd\xa6\x8c\x75\x4e\xa8\x83\x3b\x09\x3f\xca\xd6\xb3\xed\xd2\xbb"
- "\x35\xd4\x76\x3a\x0b\x92\x25\xfe\x40\x1b\x7e\x66\x5e\x75\x29\x46"
- "\x62\x35\x78\xad\x16\x57\xf5\xaf\xfa\x14\xfe\xbc\xe2\x7e\x7b\x06"
- "\xde\x17\xca\xf7\x79\xf8\x5b\x74\xf5\x5f\x24\xbe\x58\xbf\xed\xcd"
- "\x03\x87\x1d\xc8\x6f\x8f\x76\x60\x70\x3b\x6d\x20\xbd\xd1\x06\xd2"
- "\x9b\x86\xf0\xf4\x37\x3a\x45\xda\xae\xc3\xe2\x79\x97\x43\xbe\xba"
- "\x41\x7a\x07\xe9\x54\x87\xf8\xeb\x4c\x22\xad\x2e\x1d\xaf\x65\xf8"
- "\xab\x0c\xaf\x7f\x0f\x96\xdf\x93\x42\xfc\xec\xa5\x6f\x20\x20\x2f"
- "\x5d\x52\xd5\x29\xe2\xd1\x4e\x21\x5b\x9a\x20\xe3\x69\x27\x51\xb6"
- "\xea\x43\xf2\x53\x7d\x3c\x5c\x7e\xaa\x0f\x45\xc8\x4f\x0d\xd9\x23"
- "\x2c\x97\xd2\x20\xe4\xe5\x68\xd7\xa6\x42\x7c\xae\x3e\x8c\x78\x8e"
- "\x1a\x17\x13\x8e\xed\x3c\x06\xdc\x79\x0e\x63\x3f\x33\x68\xc9\xbe"
- "\xb8\xa5\xed\xf1\x24\xb3\x54\xb7\x5c\xaf\x68\x0b\xb6\x0f\xd3\x1a"
- "\xa9\x7d\xab\x11\x2f\x3e\xef\x47\xb8\x46\x27\x7c\xa5\xb4\x8d\x97"
- "\xa9\x7a\x19\xe5\x51\x6e\x2f\xe1\xa4\x72\x2c\xd4\xaf\x93\x54\x46"
- "\xae\xfb\x97\x98\x4e\xb1\x22\x58\xff\x0e\x71\xb4\x5e\x99\x64\x92"
- "\xae\x4e\x7f\x1a\xea\x52\x36\x04\xbb\xf3\x01\xc3\xfd\x34\xd4\xb7"
- "\x84\x76\x69\x7b\xfd\xf8\x32\x48\x23\x7c\x64\xd7\x5d\xd2\xf6\x82"
- "\x06\xd2\x45\x81\xeb\xdf\x81\x9f\x7b\x55\x75\xf2\xb7\x16\xe0\xf5"
- "\xec\xa3\xf6\x60\xbe\xaa\xde\x5a\x8a\x05\x77\x6e\x14\x7d\xc5\xba"
- "\xf6\x63\xf9\x43\xd4\x77\xa2\x27\xe6\x1f\x41\x3c\x3e\xca\xe3\xe7"
- "\x69\x8b\xfe\xec\xa7\x33\x57\x89\x1e\x04\x4f\xdf\x35\x11\x67\xf0"
- "\x55\xdd\xca\xe9\x86\xe5\x89\x1f\x0c\xeb\x20\x1c\x56\x3f\xf3\x33"
- "\xb4\x47\x3f\xdc\xe8\xc3\xb1\x7d\xe7\xab\xe1\xfc\xd9\x91\xa7\xe6"
- "\x0f\x96\x3b\x84\xe5\x9b\x18\xf6\x91\xec\x09\xd6\xa9\xa7\x6f\x29"
- "\x60\x5a\x4d\xb0\x0a\x71\xac\xf3\xf1\xf9\x11\xc4\xb3\x14\xdb\x52"
- "\x43\x78\xb0\x3d\x4d\x32\xae\xfa\x5f\x97\x85\xf3\x5a\xc6\xb7\x9f"
- "\x78\xce\xf5\x79\x23\xef\x13\xda\xae\x9d\x13\xf7\x89\xbc\x23\x08"
- "\x73\x84\xf5\x66\x03\x9d\x61\x2a\xc6\x12\x9e\x77\xd8\x7a\x99\xf3"
- "\xb7\x49\xd8\xb5\x9d\x4f\xae\xd9\xcc\x3a\x43\xed\xde\xa9\x53\xce"
- "\x81\x95\xdb\x7d\x98\xea\x63\xeb\x17\xf1\xb1\x95\xea\xa0\xf2\x02"
- "\xdf\x8e\x0e\xc2\xa7\xd0\x6a\x3c\xb6\x43\xd0\x6b\x47\x32\xa6\xef"
- "\x27\x59\xe4\x74\x43\x3b\xda\x65\x25\x59\xdc\x99\x84\xe5\x8f\xee"
- "\xa0\xe7\xf5\xf4\xbc\xa3\x91\xdb\xd8\xbe\xfc\x1d\x0b\x28\xdf\x89"
- "\xb1\xf6\xce\x57\x50\x96\x82\x00\x77\x8e\x84\x34\xaf\x9d\xf7\xed"
- "\xa0\x77\x53\x96\xe6\x98\x1f\x80\xda\x89\x34\x3a\x82\x6d\x3d\x8c"
- "\x63\x8d\x97\xda\x8a\xf6\xfa\x30\xfb\x61\x3e\x50\x9b\xd1\x9e\xc9"
- "\xed\xab\x19\x23\xf3\xfe\x30\xf5\x91\xe8\x39\x5e\xd8\x3e\xcc\x7b"
- "\xe3\x13\x6a\x7b\xa8\xdf\x35\xa0\xa6\x31\xef\x37\xf2\x81\xf8\x45"
- "\x7c\x09\xe1\xdc\x49\xb2\x5f\x83\xb8\x0e\x8a\x67\x21\x1b\x44\xeb"
- "\x9a\x51\xec\x04\xc1\x87\x60\xdf\xe0\xdf\x47\x2c\xc7\xba\x27\x58"
- "\x80\x9f\xf1\x4b\x67\xf9\x22\xde\x83\xf4\xcd\x1a\xc4\x71\x84\x68"
- "\x8a\x70\xdb\x49\x1e\xf1\xf9\x84\xdc\xee\x6a\x1c\xcf\xc7\xe2\x2f"
- "\x23\xa4\xff\x6f\x6c\x0e\x97\xaf\x9a\x48\xfd\x27\x7e\xd7\x04\xad"
- "\xd9\xc0\xe5\xa1\x18\x8c\x17\xa4\x37\x6e\x96\xc7\x0e\x99\xd7\x6f"
- "\xac\x3c\x86\xfa\xa2\xc2\xe1\x8d\xe0\xf5\x11\x2e\x8f\xeb\x73\xe8"
- "\x9b\xbf\x1a\x2c\x7b\x44\xe0\xa9\xe1\x7d\xe6\xf2\x64\xe7\x32\x70"
- "\x82\xad\xc7\x7e\xf6\xc9\x41\x4d\x9e\xcc\xe7\x13\x11\x34\x51\x6c"
- "\x57\x3d\x7d\x73\x81\x6c\x12\xfa\x99\x0f\x77\xf7\x86\xec\x12\xf1"
- "\x3e\xc8\x79\x5f\xe3\x6b\x10\xe3\xad\x6c\xb7\x6a\x44\xfe\xa8\x30"
- "\x19\xa6\x3e\x8d\xe3\xf2\x4b\x6d\xb1\x2e\xa2\xb6\x1c\xe1\xed\xb0"
- "\x1a\x01\xf3\xf6\x53\xfd\x2e\xe9\x8d\x34\x59\x5f\x15\x5c\x5a\xc2"
- "\xb5\x05\x6d\x15\xb5\x09\xeb\xae\xe1\xf6\xef\x51\x6a\xdb\x9b\xf1"
- "\x72\xdb\x9b\x7d\x76\x2a\x5b\xed\xbb\x2c\xf1\xb2\xcd\x78\x5f\xe4"
- "\x13\xe7\x32\x27\x62\xf9\x03\xc6\x65\x04\xbf\xab\x90\x6c\xb4\xf1"
- "\x79\x7e\x3f\xd7\xf8\x0c\xca\xea\x39\xd0\x22\x3e\x1d\xc9\xa8\x22"
- "\x17\x6e\x69\xd7\x74\xf2\xd9\x91\xd6\x07\xd1\x47\x3a\x40\xf4\x26"
- "\x59\x46\x1f\x29\xbd\xbb\xea\xcd\x22\x45\x6e\xb1\x9e\x7a\xa2\xbd"
- "\xe0\xcf\x9b\xff\x8e\x72\x7c\x24\x24\x5b\x6f\xfe\xbb\x4c\xc7\x03"
- "\x48\x47\x1d\xd6\x37\x51\xee\xd7\x01\x84\x47\x5f\x6c\xd7\x68\xb9"
- "\xed\x75\x32\x7c\x8b\xc2\x07\x59\x57\x4f\xec\x20\xfb\xcb\x79\xf0"
- "\x56\xa1\x5c\x76\xbf\xa8\xeb\xad\xe5\x0a\x2c\xf9\x88\xe2\xbc\xf5"
- "\xb7\x96\x93\x1d\x9c\x80\xbc\xe7\xb6\x8f\x7f\xcf\x49\xa4\x91\xee"
- "\x88\x3a\x76\xf1\xef\x63\x6f\x41\xbf\x27\x24\x47\x6f\x65\x44\xd8"
- "\x27\xb2\xc5\x35\xad\x88\x83\xec\x29\xc9\x12\xd9\x54\x8a\x19\x10"
- "\xdf\x48\x59\x7f\xe4\x36\xbf\xf5\xe3\x70\x59\x79\xfb\x32\xca\xca"
- "\x38\x15\xee\xba\x68\xe3\x5c\x83\xb0\x81\xf5\x72\xdf\xfe\x2a\xf7"
- "\xed\xa0\xdc\xb7\xbf\xca\x7d\x3b\x80\x75\x20\xdd\xde\xfe\xa9\x8a"
- "\x8e\x48\xb7\xb7\x6f\x96\xe1\x8f\x90\x2d\x0f\xe9\x6b\xed\xd3\x8a"
- "\x2e\xf7\xb7\x17\x6f\x27\x90\x3e\x84\xda\x55\x9b\x16\x61\x2f\x8e"
- "\x44\xb7\x17\xb5\x20\xf7\xb7\x31\x42\x37\xf6\x8b\xb6\xcb\x63\x0b"
- "\xf2\xa1\xd5\xdb\x23\x9f\x2d\x5e\x75\x2b\xd9\x4f\xaa\x5b\x3d\x06"
- "\xed\x13\x74\x95\x75\xb9\xf6\x52\x7f\x3e\xd4\x36\xa9\xf5\x99\x78"
- "\x4d\x36\x81\x70\x10\x4f\xb9\x5f\x89\x69\x82\xaf\xb5\xf5\x64\x1b"
- "\xd4\x36\x1a\x61\x6b\x83\x8c\xf4\xa5\xb6\x39\x5c\x17\x6b\xd3\x65"
- "\x5d\x94\xeb\x7e\x7b\x37\xf2\x28\x2d\x54\xef\xdb\x19\x11\xf5\x12"
- "\x6f\x9a\x88\x0e\x32\x4f\x5f\x53\xc6\x34\x82\xc7\xb2\xa5\x58\xc6"
- "\x12\x31\x3e\xd6\x50\xfb\x5c\xd2\x5b\x9d\xdc\x66\xed\xe2\xb6\xa2"
- "\xb4\x9b\xb7\xe7\xed\x92\x06\x79\x9c\xc0\xb4\x34\x39\x2d\x53\x1e"
- "\x4b\x14\xb9\xf9\x32\xa2\x4d\x27\xa3\xfb\x47\x6f\x75\x2a\xfe\x11"
- "\xc7\xc5\x6d\xd1\xdb\xa7\xe4\xfe\x51\xda\x38\x91\xf6\x56\x3d\xa5"
- "\xed\x10\x74\xa8\x65\x7c\xbc\x7a\x2b\x53\x1e\xaf\x48\xbf\x24\x97"
- "\xf4\xe6\x21\xd2\x31\x7a\x76\x49\xbb\x4c\x84\xdf\x69\xeb\xa1\x18"
- "\x02\x63\xfa\x37\x73\xc8\x1e\x90\xbd\x30\xbe\x24\xec\x86\x71\x1e"
- "\xbf\xae\x25\xbb\x43\x7e\x08\xe5\x23\x5c\x06\xd9\x22\x4c\xdf\x66"
- "\x7c\x1c\xfd\x82\xbf\xe9\x10\xef\xae\x22\xb9\xec\x5e\xee\x2b\xfc"
- "\x2d\x3b\x4e\x49\x53\xca\xa1\xae\xcf\xa5\x72\x54\x5e\xb1\x5f\x64"
- "\xbb\xfc\x64\x9b\x44\x7d\x5f\xc8\x32\xce\xe3\x06\xc5\x2f\xea\x95"
- "\x54\xb0\x74\xbe\x33\xb7\x69\xef\x8c\x15\xf6\xec\x9d\x5b\xa9\x2c"
- "\xe7\x1f\xda\xca\xf2\xcb\xec\x8b\x86\x62\xd0\xee\xfb\x8a\xfb\x58"
- "\x29\xa2\x9d\xef\x94\x8a\x7e\xbc\x33\x93\xf7\x43\xd8\xd4\x1a\xd1"
- "\x96\xaa\x94\x7d\x3d\x3c\xef\x05\xea\x0b\xe5\xed\x54\xe5\xb1\x5e"
- "\x13\xe5\x6d\xe0\xed\x8a\x28\x17\xec\x35\xf7\x83\x6f\x10\xdf\xcd"
- "\xd2\xed\xdb\xa5\xd8\xde\x77\x7c\x72\x3b\x7f\xa1\xd8\x5d\xa4\x4b"
- "\x16\xd9\x5e\x9e\xf7\x92\x0c\x33\x4f\xbe\x72\xfb\xfe\xce\x97\x82"
- "\xae\xc9\x92\x4c\xef\x1c\xb9\x1f\x97\x79\x9c\xfd\xb7\x7c\xa4\xed"
- "\x3b\x67\x14\xda\xaa\xef\x49\x7f\xb0\x7e\x03\x3d\x73\xb9\x2f\xe3"
- "\x31\x6c\x3d\xc1\x50\x9b\xc4\x18\xb1\xeb\x54\xa4\x4f\x7d\x56\x7a"
- "\xf7\x55\x1a\x97\x84\xaf\xfa\xee\x93\xf2\x1c\x0c\x38\x8a\xff\x15"
- "\xc7\x85\xba\x7a\xc5\xc6\xb0\xee\x6c\x8c\xf9\xdb\x11\xa6\x8e\x7f"
- "\xe3\x96\xce\x04\x56\xc3\x90\x7d\x7a\xbf\xc7\x25\xe3\xac\x2b\x55"
- "\xec\x06\xd9\x92\x56\x6f\xbb\xec\xd3\xed\x36\xed\x93\x6d\xc9\x05"
- "\x69\xf7\x3d\xe1\x7e\xd8\xee\x7b\xc2\x6d\xc6\xbb\xd3\x23\x6d\x06"
- "\xfa\xcd\x5b\xbb\xab\xea\xfc\x61\x7e\x00\xa6\x5d\xd9\x76\xd4\x9d"
- "\x24\x1d\xa5\xef\x2c\x70\xfb\xc4\xe7\x95\x76\xbf\xa1\xb4\x99\xec"
- "\x66\xd7\x26\x65\xfe\xe2\xdd\x71\xe4\xab\x85\xd7\xb7\xbb\x28\xcc"
- "\x76\x52\x7d\x0a\x3e\x2d\xd0\x39\xfd\x48\x07\x9a\x73\xd9\x9d\x21"
- "\xdb\xf9\xc6\x30\x5b\x29\x8f\x61\x64\x27\xc3\xc7\xaa\xaa\x5b\xc3"
- "\xc7\xaa\x77\x6f\xee\x6f\x23\x77\x77\x0e\x7c\xac\xda\xed\x20\xbb"
- "\xa5\xd8\xc8\x70\x5b\xb0\xdb\xbd\x2f\xcc\x97\xdd\x5d\xa2\xf8\xb2"
- "\x21\x3b\xba\x5b\x4b\x36\x0a\xeb\x3f\x22\xea\x7e\xb7\x10\xc7\x7d"
- "\xb3\x52\xb7\x0b\xf9\xdc\x6a\x44\xd9\xac\xda\x76\x12\xef\xb3\x65"
- "\x1f\x90\xeb\x66\x0f\x3f\x2b\xfd\x9d\x1a\x94\xbf\x44\x92\x33\xc7"
- "\xaa\xaf\xa0\x23\x34\x56\x34\x75\xad\xee\xa3\xef\x25\xb5\x5f\xb8"
- "\x77\x17\xab\xc4\x7a\x4e\xa8\xfb\xb8\x1d\xd3\x76\xca\x73\x08\x9c"
- "\xb6\x1c\xd7\xbb\x8d\x0d\xbb\xc2\xfb\x26\xfa\xf1\xee\x29\xea\x07"
- "\xc5\x44\x58\x7f\x2d\xf9\x3d\xe8\xf3\xe1\xfd\x9b\xc9\x0d\x7d\x32"
- "\x5f\x5d\x74\xd9\xae\xf6\xaf\xaa\x4a\xc8\x56\xca\xb1\x67\x33\xfa"
- "\x3b\x35\xea\xb9\x98\xb9\xb3\xf2\x8c\x96\xe2\x15\xab\x4a\x5e\x9a"
- "\x64\x5c\xb1\x6a\x45\xc9\x8a\xa5\x45\x2b\x36\x2e\x2d\x59\xb1\x7a"
- "\xd5\xd8\x95\x4b\xbf\xb7\xe2\x45\xe3\xfa\xa5\x6b\x8c\x69\xa5\x63"
- "\x4a\x13\x21\x04\x3a\xcd\xb8\x74\xcd\x9a\xb5\x2b\x97\x17\x1a\x57"
- "\xad\x78\x71\x5c\xf1\xf2\x35\xcb\x4b\x8c\x4b\x8b\x57\xaf\x5d\x55"
- "\x68\x1c\x53\x38\x7e\x4c\xda\x94\xc2\x44\xf5\x1c\xda\x1d\x06\x70"
- "\x07\xbf\xfe\x6b\xe7\xce\xaf\x41\xa7\xd7\x58\x8a\xf5\xa5\x2b\x56"
- "\x89\x79\xbb\xfa\xe9\x13\x6a\xc1\x42\xdf\x52\xa4\x6f\x86\xb1\xaa"
- "\x3d\x79\x78\xd5\x12\x1c\xf6\xd3\x48\xdf\x52\xc4\xb6\xa7\x74\x57"
- "\xd5\xa3\xee\x37\xf0\xef\x91\x21\x2d\x8c\xd8\xb7\x14\xf6\xf5\x27"
- "\x9d\xe8\xb3\x59\x68\x5d\x70\xc3\xd7\x30\xb2\x66\x1d\x68\xf1\x97"
- "\x84\x3f\x03\x7d\x6b\x11\xcb\xa4\xbb\xa4\xbd\x79\xe2\xbc\xe5\xfa"
- "\x53\x9e\x84\xff\x38\xc0\x2a\xff\xe3\x80\xe0\x4b\xfd\xef\x94\xb9"
- "\xde\xdc\xd7\x20\x97\xe4\xb3\x5d\xaa\xe7\x73\xcd\x5b\x50\x96\x69"
- "\xce\xb4\xeb\x57\x8f\x64\xa2\x3f\x78\xc6\x71\x0b\xcf\xfb\x9d\x57"
- "\x82\x24\x6c\x97\xf6\x58\x59\x1a\xbc\x85\x75\xad\x49\x66\x0c\xeb"
- "\xa8\x53\xe6\xd3\xb0\x0f\x06\xec\x4b\x9b\xdc\x8f\x4d\xbc\x1f\xbb"
- "\x58\x6a\xed\x08\x6c\xdf\x9b\xbc\x3d\x4d\x4a\x1f\xb0\xdd\x6d\xd8"
- "\x26\xfa\x1e\x9a\x81\xda\x15\x6d\xae\x8f\xe6\xbb\xce\x4a\x7b\x87"
- "\x05\xd7\x21\xdd\x6e\x13\xdf\x89\xd8\xb9\x4f\xe8\x1f\xf6\x2b\xab"
- "\x01\xef\x77\x7c\x05\x49\xdb\xe9\x3b\x7e\xf6\xdb\x59\x8b\xd7\x0f"
- "\x4e\x73\x1b\xe8\x37\x30\x0f\xfb\x7f\xff\xda\x29\xfa\xb4\x77\x2a"
- "\xd9\x86\xff\xf1\x72\x9b\x96\xfa\x84\x63\x45\x52\xc3\x57\x31\xe7"
- "\x16\xb5\x6f\x8d\x62\x5e\xb6\x47\xed\x73\xed\x7d\x8f\x68\x42\xfe"
- "\x56\x97\x9d\xbe\x0b\xb7\xb7\x12\xdb\xed\x92\x7d\x63\x2f\xeb\x5d"
- "\xa4\xf2\xa5\xf6\x92\x9c\x79\x63\xe0\xd6\x29\xb8\xe9\xfb\x80\x54"
- "\x46\xf0\x7f\xdf\x30\x2c\xe3\x51\xe1\xef\x8c\xc4\x4f\x38\xf1\xde"
- "\xa3\xd4\x23\xe2\xf0\xbd\xe4\x13\x78\x50\x96\x3d\x31\xea\x4b\x7d"
- "\x73\x17\x3b\xe5\xc4\xf4\x9d\x97\x81\xe2\x8b\x53\x0d\xbb\x08\xff"
- "\xbe\x6c\x97\xb4\xe7\x20\xe1\xdf\x32\x0a\x60\x2b\xc2\x74\x55\xd5"
- "\xbb\xbc\xfc\x5b\x7d\xfb\x50\xff\xb7\xb5\x45\xce\x65\xcb\xf2\x3c"
- "\x2d\x42\x9e\x33\xdf\x24\x9f\xb0\x16\xf1\xa3\x0c\xed\xbc\x84\xe3"
- "\x30\x3e\x8f\xaf\x05\x13\xd5\x83\xf7\x14\x93\x35\x23\xce\x23\x4a"
- "\x7d\x0c\xe5\x7f\x47\x50\xcc\xc1\xc8\xb2\x35\x96\xe6\xaf\xad\xa5"
- "\x8c\x1d\x43\xfb\x4e\x6d\x24\x19\xc3\x32\x6e\x45\xa6\x50\xd6\x4f"
- "\x71\xb9\x1a\x09\x26\x56\xb5\xcf\xd2\x30\x02\xe1\x50\xae\xf6\xa1"
- "\x3c\x91\x5c\x75\x57\x35\x24\x2b\x32\x85\xb2\x76\x92\xe0\xb0\x0d"
- "\x89\x87\x36\x66\x6a\xc9\x46\x76\x48\x0d\xdb\x49\xc6\xd8\x3b\x4f"
- "\xb4\xb1\x9b\x16\xb6\x09\x3e\x35\x6c\x77\xfa\x04\x0f\x42\x74\x6f"
- "\x28\x50\xd1\xfd\x24\xca\x71\x22\xd1\x59\xcc\x55\x37\x6c\xc7\xb6"
- "\x9d\xe4\xbe\xf8\x66\xe4\x01\x1f\xab\x1a\x72\xa8\xbc\x4c\xc3\x13"
- "\x21\x1a\x36\x1c\x88\x46\xc3\x08\xda\x69\xc5\xb7\x02\x1b\x0e\x93"
- "\xae\x60\x99\xbe\xef\xff\x45\xe3\x25\xd6\xa1\xd5\xd6\x82\x8e\xea"
- "\x68\x1a\x49\xf0\x8d\x49\x4a\x1d\x3b\x91\xd6\x1e\xab\xf9\x8a\xf2"
- "\xdc\xd4\x08\x40\x73\xe2\x54\x3e\x75\x24\xd1\xb7\x31\x27\x54\x9e"
- "\x79\x23\xcb\x8f\x79\x31\xac\xad\xfc\xc7\xaa\x1a\x0b\xde\x12\xdf"
- "\x76\xa5\xfa\xab\xaf\xd4\xde\x54\xa3\x18\x27\x1d\x77\x90\x7c\x37"
- "\x1e\x77\xd6\x01\x50\x9a\xfc\x7c\xb8\x0b\xc7\x9e\xc8\xf9\xfd\xd8"
- "\xef\x1b\xde\x8b\x0f\x7f\xdf\xd0\xe8\x8d\xf5\xbe\x21\xbc\xde\xf7"
- "\x66\x52\xbd\xc1\x86\x05\x9a\x50\xdd\xef\x8d\x0d\x46\xa9\x5b\x29"
- "\x3f\xbe\x51\x1d\xcf\xbc\xf7\x06\xb5\xa1\x95\xbe\x51\xfe\x2f\x0b"
- "\x34\x0c\xf1\x34\xf1\x31\xfc\xbd\x1a\xe1\xbf\x90\x5f\xf4\x9e\x85"
- "\x60\x22\xfb\xd1\xf7\xa7\x1b\xf9\x6b\xba\x5c\xe6\x0f\xf1\x8f\x02"
- "\x9d\x3c\x03\xb7\x9b\x94\x6c\x29\x0c\x18\x58\x94\x87\x24\x00\x23"
- "\x87\x67\xf8\x27\x92\xe4\x67\x0f\x7f\xd0\xf6\xc1\xf7\xe5\xff\x03"
- "\x7f\x09\xa2\xbd\x1c\x9f\x0f\x34\x72\x7d\xd9\x2a\x88\xac\x2b\x94"
- "\x66\xa0\x14\x89\xf6\x47\xb3\x8f\xb6\x05\xc8\x4b\xa3\x99\x03\x33"
- "\xe6\x97\xf1\x2b\xcf\x4c\xfd\x4c\x29\xe1\xcf\xf8\x17\xb7\x48\x55"
- "\xc1\xed\x71\x85\x7c\xf9\xd1\x9d\x8d\x7d\x49\x52\xa3\x41\x5d\xa5"
- "\x01\x6c\xf1\xfc\x46\x4f\xff\xf8\x10\x9f\x09\xf3\x8d\x95\x7d\x00"
- "\x37\x78\x2b\x54\xe0\x9f\x8a\xe6\x8f\x6e\xbb\x42\x1f\x07\xfb\x77"
- "\x9b\xea\xfe\x76\x71\x19\x5d\xf7\x0d\xe2\xbf\xf2\x9f\xf1\x64\x82"
- "\x72\x1b\x12\x8f\x3b\x8c\xd1\x40\x43\xf4\xbf\xc3\xa6\x24\xa9\x25"
- "\x34\x94\x3f\xc6\x1f\xfe\x7c\xf7\x91\xf0\xe7\x7b\x75\xdf\x40\xcb"
- "\xc1\x41\xff\x58\x5d\xd7\x23\xcf\x4e\xf5\x25\xea\x23\x54\x46\x5f"
- "\x13\xa1\x42\xa1\x3f\xb9\x35\x71\xd8\x9e\x45\xaa\x64\x6d\x74\xe8"
- "\xff\x9a\xbf\x5b\x2a\x64\x85\xb8\xdd\x63\xe8\x97\x39\x23\x22\x8d"
- "\x9e\x87\x18\xe5\xb4\x89\xbf\xee\x07\xcf\xd3\x8c\xaa\x67\x4d\x26"
- "\xfe\xd3\x88\x96\x75\xec\x37\xd1\xd6\xef\xfe\xfe\x2f\xfc\xd3\x90"
- "\x7e\x7c\xf7\xf7\x5f\xf4\xc7\xc4\x28\x8e\x96\x88\x5f\xe8\x3f\xd6"
- "\x67\x28\x99\x9c\xc1\xe4\x04\x26\xdf\x7c\x23\xe3\xf8\x77\x7f\xdf"
- "\xfd\x7d\xf7\xf7\xdd\xdf\x77\x7f\xdf\xfd\x7d\xf7\xf7\x2d\xf8\xd3"
- "\xf0\x38\x82\xc9\x7f\xca\xbd\xc8\xa3\x10\xe8\x7b\x79\x3c\x4d\xd2"
- "\x40\x08\x02\xc3\xed\xfb\x41\xa3\x83\x21\xda\x6f\xce\xcb\x33\xf6"
- "\x35\x68\x80\x05\x68\x9d\x03\xad\x09\x98\x8c\xbf\x7f\x51\xa5\xdf"
- "\xf1\x4d\xb5\xe8\x1f\xfe\xd3\x20\x01\xe3\x30\x2e\x8c\x87\x21\x30"
- "\x14\x74\x90\x00\x89\x70\x1d\x24\xc1\x30\x18\x8e\xf1\xa6\x01\xae"
- "\x87\x11\x70\x03\x8c\x84\x1b\x61\x14\xdc\x04\xc9\x70\x33\xdc\x82"
- "\x3d\x49\x81\x5b\x31\xb6\xbf\x1d\x09\x32\x3a\x7a\x5f\x6c\x90\x99"
- "\x8c\xff\xe0\xff\x79\x90\xc9\x9f\x0b\xbe\x4b\xff\xdf\x9a\xee\x90"
- "\xd3\x4f\xca\xe9\xae\xef\xd2\xff\xb7\xa6\x1b\xff\x0f\x5f\x47\xff"
- "\x1f\xbd\x6a\xd0\x64\x0b\xab\xad\x89\x6a\x2b\x23\x53\x35\xf2\x5f"
- "\xdf\x33\x5c\xa5\x7c\x3f\x7c\xe1\xe5\x23\xff\x32\xf1\x97\x2e\x6e"
- "\xad\x00\x62\x9e\x97\xa9\xff\xfc\xb1\x4a\x2a\x7f\xe5\x47\xf1\xd7"
- "\x8c\xbf\x53\xf8\xfb\x3d\xfe\xfe\x8c\xbf\xf3\x0a\x1e\x01\x43\x53"
- "\x7f\x7f\xc3\xdf\xff\x3a\x00\x70\xc6\x85\xbf\x2c\x80\xcf\xca\x00"
- "\xfe\x64\x00\xf8\x02\xc7\xa8\xcf\x0f\x01\xb4\x7b\x42\x38\x2f\x6e"
- "\x0d\xb5\xee\xbc\x58\xd9\xcd\xf9\xf7\x55\x12\xdd\xb9\x20\xa0\xc0"
- "\x1e\x99\xbd\x20\xdb\x38\x71\x7c\xfa\xf8\xfb\xd3\x8c\xe3\xc6\x19"
- "\x27\xa5\x4d\x4c\x9b\x90\x96\x3e\x61\xe2\x14\xe3\xc4\xc9\xd3\x26"
- "\xa7\x4d\x4b\x7b\xc0\xb8\x72\x43\xf1\x8a\x89\x69\xdf\x5b\x6e\x7c"
- "\x69\x45\xf1\xca\xf5\x4b\x8b\x97\x5f\xad\x43\xd7\xf6\x47\xcd\xbb"
- "\x35\x08\x9c\x03\xe1\xd4\xbe\x1d\xa4\x1f\xbb\x40\xfa\x8f\x43\x10"
- "\xca\x31\xc9\xbf\xf0\x3f\x8d\x39\x15\x34\xcb\x4d\xa0\x29\xa8\x05"
- "\xcd\xf3\x8d\xa0\x99\x9f\x03\x9a\xef\x63\xda\x16\x03\x68\xca\x0b"
- "\x41\x53\x9a\x0f\x1a\x8b\xbb\x7f\xda\x4e\x10\x69\x3f\xb1\x81\xe6"
- "\x47\x87\x41\xd3\x50\x0d\x9a\x77\x3a\x44\xda\x2f\x10\xe6\xd0\xd6"
- "\xff\x9a\x4e\x5f\xf3\xdf\x40\xfd\x84\x7e\x7f\x2e\x2e\x4b\x34\x3a"
- "\x7f\x3e\x36\xca\x64\xe8\x77\x7f\xdf\xfd\x7d\xf7\xf7\xdd\xdf\x77"
- "\x7f\xdf\xfd\x7d\xf7\xf7\xdf\xfc\xcf\xa3\x81\xf4\xaf\x24\x2d\xfc"
- "\xa6\x06\xa0\xdb\xae\x4b\x71\x69\x52\x4e\xd0\xda\x11\xa0\x3d\x52"
- "\xa0\xe3\xeb\xfb\xe8\xa7\x5a\x73\x92\x34\x6b\x2f\x00\xed\xf1\x7c"
- "\x6b\x17\xf3\xd0\xfe\xcd\xac\x1f\x01\x34\xa5\x02\xd0\x7a\x16\xc4"
- "\xb1\xc8\x05\xaf\x26\x89\x35\x4c\xcc\x4b\xf9\xb4\x0e\x0a\xd3\x4b"
- "\x30\x7d\x6b\xac\x75\x29\xca\x1a\x2c\xc2\x99\x35\x9a\xb7\x65\x7f"
- "\x04\x1e\xc2\x71\x04\xd3\xfc\x57\xc0\x91\xa4\xb4\xcb\x2b\x81\x86"
- "\xf0\x75\xd9\x21\xd9\x6b\x77\xdc\x88\x65\xbd\xd8\x1f\x93\xbc\x86"
- "\xc8\xcd\xec\x10\xd7\x54\xea\xa7\xbd\xa4\x9a\xb3\x90\xf8\x1e\x5e"
- "\x25\xbc\xf2\xfd\xb3\x5b\x44\xb9\x54\xc2\x81\x65\x35\xdd\xf6\x84"
- "\xb4\xbe\xb2\x88\x9b\xef\xc7\x86\xc4\x15\x5e\xc9\x21\x09\x58\x43"
- "\x82\x0c\x2b\x21\xec\x22\x05\x56\xe4\x49\x73\xe4\xbc\xeb\x30\xaf"
- "\x34\x3c\x4f\xfb\xa6\x9c\x97\x84\x79\xb5\x11\xed\xd3\x3a\x7b\xfc"
- "\x70\x16\x12\x0e\x62\x5b\x8c\xb4\x77\x89\xca\xc8\xf0\xd7\x23\x7c"
- "\x53\x38\x2e\x00\x39\x6f\x04\xe6\xb9\xc2\xf3\x7e\x95\x26\xe7\xdd"
- "\x84\x79\xfe\xf0\x3c\x8d\x52\x2e\xb9\xdb\x9e\x98\x1c\xa5\x9f\x54"
- "\xbf\x46\xd4\x4d\x7d\x48\xcc\x40\x18\x1b\xc1\x2c\x30\xda\x80\x78"
- "\x45\x79\xc7\x1a\xfb\xea\x27\x98\x02\x05\x8f\x0b\xcb\xab\x68\x8a"
- "\xb4\x4c\x2c\x53\xca\x67\x19\x09\x07\x70\x1a\x12\x1e\x17\x24\x64"
- "\x13\x1e\x7a\xc6\xfb\x14\xea\xb7\x7c\x6f\xa4\xfe\x85\xaf\xe5\xd1"
- "\x22\xda\x78\x74\x44\x87\xe0\x6f\xa8\x4e\x91\x81\x35\xc9\x2c\x68"
- "\xbd\x99\xd6\x6f\x1d\x37\x05\xed\x0c\x9c\xa5\x3e\x30\xde\x02\xd6"
- "\x76\xb8\x2e\x99\xd6\x03\xed\xd8\x08\x3a\xab\x85\xf9\x68\xcf\x7b"
- "\xab\xc7\x0d\x56\x0f\xeb\xa4\x33\x8e\xca\x2f\x81\x8e\xbe\x19\x59"
- "\xfe\x2a\x24\x37\x95\x7d\x19\x75\x0d\x52\x50\x62\x60\x4d\xa1\xb2"
- "\x1d\xd0\x5a\xdf\x01\xd6\xfa\xf0\xb2\xd6\x5b\x21\xb9\x85\xce\x4b"
- "\xb2\x83\x9e\xda\xd1\x64\xf4\x83\x3f\xf1\xb8\xa9\x6c\x37\x68\xad"
- "\xa3\x41\x6a\x29\x74\x28\x6d\xe1\xeb\xd1\xb6\x9e\x03\xdd\x0f\x5f"
- "\x42\x19\x3a\x47\xed\x6d\x31\xbd\xbf\xd1\x27\x1d\x4b\xce\x81\x63"
- "\xc9\x67\xa0\x29\x79\x3a\x34\x95\x66\xc1\x8e\x73\x90\x74\xcc\x97"
- "\x01\x4d\xda\x47\x51\xc7\xb2\xc0\xe9\xc6\x7b\x63\x00\x61\xbc\x7c"
- "\xbf\xc7\x59\xb8\xee\x64\xed\xcb\xa0\x73\x09\x9c\x48\xdf\xeb\xce"
- "\x28\x7b\x17\xe8\x39\x5a\x3f\xd6\xdc\x0c\xc9\xd8\xbe\x4e\x6c\xcb"
- "\x83\xed\x90\x74\x63\x6a\x32\xa4\x61\x9b\x87\x3a\xeb\xfc\xa0\x2d"
- "\x83\x84\x18\xba\x35\x92\xef\x7b\x46\xd9\xdc\xb7\x8b\x75\x92\x8c"
- "\x76\x6d\xca\x47\x3d\x4d\xca\xc1\xba\xdd\xf2\x7a\x40\xb7\xf5\x3d"
- "\xd0\x76\xad\xcf\xa7\x75\xd0\x1d\x98\x67\x56\xf2\x68\x3f\x37\xed"
- "\xd3\x9e\x30\x92\xbe\x19\x94\x09\x1f\xf6\x74\xd2\x5a\x43\x37\xad"
- "\xff\x24\x7c\xfa\x52\x88\xc3\xfe\xc4\x63\x7b\x1e\x6c\xc0\xf4\x3b"
- "\x11\x0e\xcb\x1f\x70\xc1\xe1\x34\xbe\x3e\xf1\xa6\x85\xde\xe0\x4d"
- "\x0b\x2f\x05\xdf\x59\xd8\xc5\xde\x59\xf8\x55\xe0\x9d\x85\x7f\xb7"
- "\x6e\x00\x5d\xe0\xa6\x85\x9e\x56\x0b\xe7\x81\xa1\xd5\x72\x9e\xd6"
- "\x0d\xea\xe8\x0c\xf5\xc5\xaf\x22\xef\xfd\x9f\xc1\xe6\x15\x90\x1c"
- "\x4c\xf8\xd4\xe5\xf4\x9f\x86\xc5\x65\xc0\xf0\x3e\xea\x9a\xcc\xae"
- "\xc4\x16\xb3\xd0\x21\x1d\xf6\x69\x98\xd1\x25\x35\x19\xa9\x5e\x4f"
- "\xc2\x69\x33\xfe\x8a\xf0\x67\xc1\x5f\x09\x4b\x6c\x29\x41\x5a\x59"
- "\x87\x57\x68\x80\xf6\x2b\x4c\x08\x82\xe6\x1c\x0c\xcb\xc0\xf6\x1b"
- "\x62\xd0\x2d\x25\x58\xf5\xe7\x9a\xbb\x6d\x50\xde\xdd\x6d\xa6\x7d"
- "\xe3\x1e\xb2\x4b\x64\xa7\xb0\x9e\x4a\xac\xa7\x80\xeb\xe2\x2e\xe6"
- "\x65\x89\x7f\xae\xc1\xf4\x4e\xef\x26\xb3\xc6\xb3\xc9\x2c\x75\x25"
- "\xfe\xf9\x2d\x84\x39\x88\x30\x75\x32\x0d\x3b\x09\x17\xea\x84\x67"
- "\x98\x1f\xe2\x10\xa7\xe5\x7f\x7e\xdd\xa6\xdd\xbb\x8b\x9d\x41\xb8"
- "\x53\x7d\xb8\x10\x37\xe2\x41\xfa\x0f\xeb\x54\xd2\x90\xd6\x1d\xdb"
- "\x11\x8e\xca\x3b\x7d\x99\x64\xbf\x5d\xce\xa2\x4e\x5a\xaf\x9b\xc8"
- "\x7a\x45\x7d\x08\x43\x7b\x39\x3d\xc3\x7c\x30\xa4\xdb\x0e\x79\x84"
- "\x9b\xca\xd1\xd9\x5d\x58\xee\x2d\x66\x35\xa3\x7d\x83\x79\xdd\xcc"
- "\xac\xa1\xbd\xfb\xc7\xb0\xbc\xa8\x7b\x78\x9e\xd2\x46\xaa\x83\xef"
- "\xdd\xa7\x76\xa2\x3c\x1c\x2b\xf2\xc1\xb0\x3a\x88\xc3\x72\xf3\x09"
- "\x1f\xe1\x42\x39\x70\x61\x5f\xdf\x3a\x56\xe4\x81\x20\x0b\xc3\xe9"
- "\x92\xf1\x35\x86\xe1\xc3\x74\x86\xf8\x48\xfe\x9a\xb0\xcc\xb0\x46"
- "\x8e\xef\xa9\xff\x19\x24\x7c\x3e\xd0\x1a\x79\x7b\x9f\x21\x1c\xfc"
- "\x2c\x0a\xc4\xe9\x58\xf7\x08\xb8\x41\xaf\xf3\x58\xcd\x71\x7c\x9d"
- "\x20\x96\x7f\xbf\xbc\x33\x9e\x75\xe5\xc7\x0d\xe7\x6b\x04\x1f\x01"
- "\x3a\xaf\xc1\x0d\xc3\xff\xca\xba\xcc\x71\xc3\xdc\xa0\xa5\x36\xd3"
- "\xbe\x21\x6a\xa7\x9a\x97\x4f\xcd\x7e\x66\x3a\x3c\x93\x35\x27\x6b"
- "\x3a\xcc\x9d\x39\x6b\x3a\xa4\x3d\x38\x2e\x6d\xf2\x03\x53\x27\x43"
- "\xde\xb3\x4f\x4d\x87\xbc\x79\xd3\x61\x3e\xfe\xf2\xe6\xcf\x7e\x2a"
- "\x6b\xf6\xfc\xe9\x90\xff\xe8\x1c\x7c\x9a\x35\x7d\x62\xda\x63\xe3"
- "\xf2\x66\xcd\x99\x0d\x4f\x2e\x98\x94\x36\x69\x12\xcc\x9c\x9d\x33"
- "\x31\x2d\x4d\xbe\x4e\x4c\x23\x90\xe7\xa7\xce\x9e\x3f\x2e\xaf\x78"
- "\x75\xc9\xea\x71\xf3\xe6\xcc\xa2\x14\x98\x3d\x7b\x3a\xbd\x30\x50"
- "\xc9\x8f\x29\xf0\x75\x80\xe8\xec\x65\x17\xb3\xe9\x9c\x06\xd8\x87"
- "\xfc\xc7\x9f\x9b\xef\xff\x00\xc3\x1f\xf6\x11\xdf\xb8\x7d\xd5\xd3"
- "\x98\xa5\xed\xb6\xeb\x5d\x48\x3f\xbe\x86\x94\xce\x4a\x38\x0b\xa3"
- "\x7e\x84\x79\xf7\xc8\xe3\x47\x7c\xb7\xdd\x00\xe1\xf9\x23\xd0\xbe"
- "\xea\x27\xd0\x7e\x02\x27\xfe\x90\xe6\x5e\xb4\x83\x48\x5b\x0f\x74"
- "\x59\xf3\xe3\xf9\x7e\x4e\xe4\x37\xad\xb3\xc5\xb2\x19\x2a\x7d\xef"
- "\xa0\xf5\xb8\xc6\x8d\x10\x77\x01\x0c\x37\xb6\x96\x64\xd2\x9e\x1b"
- "\x70\x96\xc8\x38\x2e\xf5\xe1\x48\x94\xf7\x84\xba\xf6\xd1\x5a\x67"
- "\x81\x67\xab\xca\x36\xb8\x08\xcf\x0e\xcc\x93\x71\x3d\xd7\x8a\x36"
- "\x02\x6d\xf8\xa4\xa0\xd5\x04\x2c\xf1\x78\x5a\xb0\xd7\xc4\xc7\x05"
- "\x2c\x77\x54\x91\x69\xac\xdf\xdb\x84\x75\xb2\x1f\x66\x6b\x68\xdd"
- "\x29\x5f\x83\x0a\xfa\xe6\x5a\x5a\x9b\x9d\x78\xba\x94\xef\xb5\xe6"
- "\x69\xd7\xeb\x02\x55\xf8\x5c\x75\x7a\x03\xb3\x8a\x3d\xd4\x98\x96"
- "\x80\xcf\xa5\xc8\xef\x38\x94\x17\x08\x5c\xc4\xf4\x55\x10\x87\xe9"
- "\x9f\x20\xad\xdb\x38\xfc\x45\x5e\x7e\x28\xa6\xfd\x18\xf1\x6d\x08"
- "\x26\x9e\xde\x88\xf2\x43\x69\xe8\x2b\x5c\xbf\x1d\xcb\x6f\x22\x9b"
- "\x27\xec\xf0\x28\xbe\xc7\x9e\xd6\x82\x0b\xfc\xf2\x33\x9d\x4d\x51"
- "\x2e\x9e\x8f\x21\x5d\x8e\xe1\xc8\xd5\x54\x46\xfe\xcd\xf5\xd8\xff"
- "\x61\xf9\x62\x8c\x1c\xd5\x44\xb0\xb4\x17\x9e\x25\xdd\x51\x83\x78"
- "\xcb\x1c\x1b\xdd\xfc\x4c\x73\x17\x5c\x9f\x19\xb4\x9a\x41\xd5\x97"
- "\xb1\xd4\x0e\x6c\xb7\xb6\xbb\xd7\x8c\x63\xe6\xf5\x7c\xbf\x2a\xa6"
- "\x6d\x90\xdb\x46\x30\x29\xd4\x7e\xb2\x13\xc8\xd7\x74\xe4\x79\x02"
- "\xd6\xe7\x8d\xe0\xb9\x81\xe8\x81\xed\x6d\x0b\xe2\x15\xf1\x24\xb3"
- "\xf5\x66\x6c\x17\x48\x44\x0f\x57\x08\x87\x57\xc8\xd4\x88\xf4\x08"
- "\x99\xda\x86\xb8\xa7\xab\xf2\x17\x44\xe4\xaf\xc4\xfc\x47\xe4\x7c"
- "\xd4\xd7\x11\x25\x11\xf5\xd7\x60\xfe\xa3\xc4\x43\xd4\xc7\x38\x17"
- "\x18\x0e\xee\x23\x7f\x32\x04\xbf\x3f\x02\xde\x81\xf0\x8f\xd3\xba"
- "\x7b\x1a\x2b\x08\xbe\x41\x96\x7b\x84\xd7\x21\xfc\xa9\x88\xfa\xe7"
- "\x22\xfc\x7c\x55\xfb\x22\xfa\x7f\xc3\x51\xcc\xcf\x27\x39\xc5\x6b"
- "\x21\xc2\x0c\x25\x1b\x40\xf6\xe7\x58\x11\xf1\xe7\x86\xd4\x08\xf8"
- "\x2c\x84\x7b\x85\xe8\xcc\x69\xd4\x45\x34\x32\x28\xbe\xcd\x19\xd1"
- "\x86\x1b\xf2\x23\xca\x94\x62\x99\x35\x44\x5f\x2e\x67\xdd\x51\xcb"
- "\x54\x47\x94\x39\xc8\xe5\x54\xd4\x23\xf3\x58\x94\x91\x6d\x9b\x1a"
- "\x07\xf5\x0d\xfd\xad\x1b\x4e\x86\xe3\xb8\x11\x7d\x36\xfd\xa6\xed"
- "\xc2\x66\x5c\x87\x32\x31\x09\xd3\xf6\x22\xce\xcd\x24\x47\xa8\x67"
- "\x5e\xa7\xc7\x87\xb6\x37\x3b\x49\xc8\xee\xc8\x89\xfa\x32\xa0\xfb"
- "\x71\x74\x4f\xb8\x59\x6f\x8e\xac\x4f\x23\x27\xe2\x95\xd2\xc5\xf9"
- "\x84\xa5\x94\xf7\x44\x50\xe0\x1c\xf9\x34\xea\xbb\x84\xcf\x01\xb9"
- "\x8e\xb7\x69\xdf\x32\xb6\x7f\x23\xda\x75\xa0\xbd\xd7\x98\x9e\x8e"
- "\xe9\xdb\xe5\xfc\xd7\x08\x1e\xef\x27\xca\xf7\x1a\x94\xb1\x8d\xb2"
- "\x9e\xa1\x4e\xdd\xc8\xf7\xa9\x93\x5e\x29\xe5\x83\x42\xee\x67\x61"
- "\xde\x0a\xbc\xce\xc1\xeb\xd3\x78\x7d\x12\xaf\x13\xe9\xac\x09\x6b"
- "\x80\xeb\x17\x3d\xdf\x8a\xd7\xa7\xf0\x9a\x80\xd7\xf9\xd8\xb6\x4b"
- "\x48\xf7\x52\x0f\xca\x74\x84\xcc\xb8\x91\x87\xa4\xf7\x43\x05\x0f"
- "\x47\x76\x50\x9d\x01\xc5\x16\x5c\x0c\xa5\xc9\xf6\x41\xd6\x07\x39"
- "\xad\x37\x9b\xe8\x92\x87\xf8\x1d\x54\x3f\x13\xb8\xe2\x05\x9f\x04"
- "\x4c\x50\x94\xd3\x0a\x7e\xcb\x69\x02\x4e\xa3\xae\x13\xaf\xb5\xe5"
- "\x5e\xc6\xf0\x6a\xe3\xe7\x54\xc0\x8d\x5b\x91\x26\x5a\x7c\x5e\x40"
- "\x74\xe2\xf0\x1c\xef\x0d\x1e\x15\xbf\xd1\xbf\xbf\xd1\x11\xc1\x6f"
- "\x92\xe1\xed\x9c\xdf\x48\x3b\xa5\xcd\xd4\x7e\x94\x69\x1a\x2b\x87"
- "\x28\x72\x83\xf2\xed\x0e\xe9\xd8\x28\x5d\x84\xce\xa4\x22\x9e\x37"
- "\x48\x3e\x86\x5b\x64\x9d\x1c\xd5\x07\x8f\xe3\xc6\xa8\xa9\xe1\xf0"
- "\x06\x92\x55\x37\xb6\xef\xa0\x6c\xeb\xbc\x71\x65\x24\xd3\xa3\xd0"
- "\xff\x6f\xe9\xe0\x7e\x5b\xd5\xe9\x72\xc2\xe3\xb5\xf2\x73\x80\xbc"
- "\x71\x16\xd2\xc5\x51\x36\x25\x9f\xe7\x25\x74\x18\xa8\xed\x71\x45"
- "\x3c\xaf\xde\x85\xa2\xa8\xe4\x81\xd8\x5f\xe6\x8d\x2b\xe1\x79\x47"
- "\x42\x78\x8f\xe7\xc9\x78\xe3\xa2\x9e\xed\x54\x79\x3c\x73\x1c\x80"
- "\x74\xaf\x0d\xe2\x9d\xfe\x53\x90\xeb\x67\x81\x71\x36\x48\x70\xfa"
- "\x0f\xc2\x3d\x00\xd7\x3b\xfd\x67\xe0\x5e\x80\xd1\x4e\x7f\x2d\xfa"
- "\x01\xfb\x29\xff\xc3\xbb\x41\xa3\xc1\xab\xf5\x2e\x9b\xa4\x71\xfa"
- "\x4b\x20\xd5\xa6\xc5\x6b\x11\x3c\x1a\xcf\xba\x9d\xfe\x1c\x84\x2b"
- "\x84\xdc\x00\xbb\x98\x15\xcf\x3e\x5f\x12\x00\x43\xce\x6b\xcc\xea"
- "\xf4\xa3\x4f\xee\x3f\x81\xe9\x41\x96\x1b\xb8\x8c\xbf\x6e\x16\xac"
- "\x3c\x9e\x97\x1b\xb8\xc8\x66\xbd\xf6\x21\x3e\x7f\xce\x98\x04\xcc"
- "\xe9\xcf\x80\x56\xaf\x17\xe1\xac\x8c\x6d\x3b\x9e\xb9\xf8\x92\x04"
- "\xbd\x74\xee\xd2\xb6\xe3\x79\xd8\x97\x82\x5e\xec\x07\x8e\x73\x4b"
- "\x7a\x37\xe1\xb5\xea\xf8\x62\xfe\x5c\x79\xdc\xc2\x74\xc7\x0b\xc6"
- "\x63\x80\x43\x7d\x70\xfa\x3b\x60\x09\xba\xe8\xb9\x1b\x3c\x8c\xda"
- "\x3f\xbc\x82\xe2\x9b\x0c\x3a\xb3\x41\x9f\xbb\xc1\xca\x30\x4f\xc7"
- "\x12\x8e\x17\x38\xfd\x6e\xc0\x3a\x2c\x88\x6f\x25\xc7\x57\x79\xbc"
- "\x06\x61\x3d\x04\xa7\xc6\x43\x38\x08\x36\x37\x00\x7a\x84\xaf\xe9"
- "\x4d\x38\x6e\xc3\x5f\x23\xfe\x4e\x62\xd9\x76\x66\x1f\xf9\x6b\xda"
- "\x77\x8b\xe5\x3d\x2c\xf1\x23\xf0\xd1\x19\x51\x44\xcb\x00\x0c\x45"
- "\x78\x8c\xc7\x21\x0b\xe5\x13\xdb\xfb\x91\x91\xb7\xb7\xea\xa3\xdb"
- "\x7d\xbc\x1f\x1f\xdd\x26\xfa\xf1\xd1\xad\x94\xde\x85\xb2\x83\xf7"
- "\x99\x5d\x22\x6f\x06\x96\x5b\xc0\xcb\x55\x7e\x94\xc9\x74\x1f\xe5"
- "\xf9\x50\xef\x90\xae\x36\xa2\x23\xd2\xd5\x46\xb4\x64\xdb\x3e\xca"
- "\x74\x96\x56\x03\x4b\xf8\x28\xaf\x37\xe1\xa3\x02\x2c\x5f\xdc\xcb"
- "\x7d\x81\x8f\x6c\x3e\x81\xdb\x8a\x78\x16\xa1\x5c\xc7\x21\x0e\x1b"
- "\xe2\xaa\xe9\xb5\x1b\x21\x77\x03\xf3\xe5\xfa\x2b\xfc\x4b\x36\x40"
- "\xdc\x58\xb0\x69\xe8\x3c\x5b\x67\x69\x21\xf6\xb3\x09\xaf\x59\x98"
- "\x0f\x37\x60\x5d\x1f\x22\x5e\x5e\x1f\xd6\x53\x83\x38\xb7\x23\xae"
- "\x42\x6a\xd3\x65\x3b\x18\xf0\xb9\xf1\xb2\x68\x9f\x23\x58\xf9\x91"
- "\x2b\xa8\xfb\xe8\xa4\x22\x43\x24\x3f\x82\x6e\xb5\x30\xcf\xcb\xfc"
- "\x4e\xff\x5e\x40\x19\x33\xb4\x7a\xcf\x50\x3e\xc6\x20\x07\x91\xcf"
- "\x24\x53\x25\x78\xdd\x0f\x24\x3f\xad\x96\xd7\x08\xf6\x43\x92\xa1"
- "\x79\x16\x6f\xc5\x38\xb0\x68\xf0\xd9\xba\xc4\xaf\x83\xc5\x16\xad"
- "\x2d\x50\xf9\xd1\xa1\x56\x0b\xf1\xe5\x14\x96\xa1\x72\x45\xa0\xd7"
- "\xa0\x1f\xae\x61\x7e\x7d\xa9\x47\x3b\xcc\x6c\x65\xad\xde\x1c\x84"
- "\xb5\xf0\xf3\x79\x49\x8e\x08\x7e\xae\x9b\xb9\x02\xba\x8f\x0b\xa8"
- "\x6f\x6c\xb8\x0d\x5a\xdc\xf7\x03\xc5\x42\x2d\xee\xfd\x24\xa7\x41"
- "\xa6\xfb\x38\x0d\x65\xb4\x77\xae\xdb\x16\xbf\xf8\x12\x68\x30\x2d"
- "\xd0\x62\x3e\x88\xf9\x4d\x08\x77\x82\xcb\xed\xbc\x4b\x7e\xbd\x5f"
- "\xf7\x51\xa3\xbf\xf2\xe3\xcc\x79\x97\x7a\x59\x8b\xb9\x16\x5e\x70"
- "\xdb\x90\x56\x07\x61\xee\x79\x7f\x5c\xab\xa5\x10\x61\xba\x31\x7d"
- "\x3f\x97\xff\xb9\xe7\xbb\xd8\xbc\x57\xd9\xc5\x79\x97\x3e\x67\x73"
- "\xcd\xec\xc3\x25\xa5\x30\xfc\xba\x0a\x16\x24\xbd\x38\xd1\x71\x10"
- "\xae\x3b\x43\x67\xf2\x64\x41\xce\xd2\x20\x9b\x7b\xfe\x22\x5b\xfc"
- "\x2a\xd1\x26\x03\x5a\xcc\xa8\x3f\xa5\xb5\x44\x6f\x47\x8b\xf9\x28"
- "\xd6\x9f\x85\x78\xad\xcc\x59\xba\x17\x61\x1d\xfa\x17\xce\x1b\xe0"
- "\x44\x47\x2d\xf8\x13\x3e\x6a\x0c\x6c\xfb\xe8\x50\x30\xe1\xa3\x93"
- "\xc1\x6d\x1f\xb9\x58\xc2\xc7\x69\xfe\x6d\x1f\x67\x06\x12\x3e\x46"
- "\x19\xf8\xf8\x10\xf2\x29\x81\x78\xde\x63\x07\x23\x3e\xff\xac\x87"
- "\xf8\x5f\xf9\xb1\x03\xfb\xea\x42\x9b\xc9\x84\xec\x7f\xec\xa0\xf8"
- "\x1e\xcb\xba\x7a\x13\x3e\x3e\x89\x70\x2e\xa1\x5f\x1f\x7b\x48\x2e"
- "\xf9\x98\x55\xf5\xf1\x45\x1c\x63\xe2\x7a\x13\x9a\x01\x7f\x06\xfc"
- "\x21\xbe\x66\x0b\xe2\xbf\x9e\xcb\x54\x65\xb3\x85\x3d\x5c\x83\xbe"
- "\x2c\xc6\xf3\x09\xcd\x35\xb9\x81\x19\x0c\x69\x88\x7a\xd2\x6c\x09"
- "\x6e\x6b\xb6\xb1\xc4\xe6\x43\x3e\x2e\xfb\xcd\xef\x13\xee\xde\x4d"
- "\x26\x8a\xfb\xb5\x98\xef\x60\x55\x9f\x4c\xf2\x91\xac\xea\x3e\x49"
- "\x0b\xea\x3e\xa9\x61\x95\x9f\x64\x3e\xf1\x1a\xf3\x04\x2a\x3f\x29"
- "\x08\x56\x7e\x92\xe7\x1f\x82\x3e\x72\xe9\x51\x20\xfb\xe4\xff\x15"
- "\x63\xf4\x6d\xa2\x56\xcb\x7e\xce\x7f\x67\x29\xea\xc0\x86\x5b\x6c"
- "\x2d\x6e\x94\x05\xcb\x4f\xb9\x6d\x6a\xf5\x9e\xe2\x34\x65\x09\x9f"
- "\xa4\x91\x4c\x11\x7f\x17\x5b\xc0\xc6\xb6\x7d\x92\x19\xdc\xf6\x49"
- "\x5e\x60\x1b\xe2\x4d\xc0\x7a\x12\x3f\xfd\x4f\x1f\xd7\xd7\x4f\x51"
- "\x5e\x8f\x62\x99\xe3\x20\x64\xfc\xd3\x93\xb1\x6c\x24\xd9\x2a\xb2"
- "\x4f\xb9\x7e\x1f\xc9\xcc\x5f\xc8\xae\x09\x3b\x05\x4b\x14\x3b\x45"
- "\x36\x8a\xe2\x0e\xb2\x53\x41\xd9\x4e\x05\x65\x3b\xc5\x9f\x75\x68"
- "\x6b\x2a\x8f\x17\x90\x3d\xca\x2d\x15\x76\x26\x37\x90\xc6\x50\x36"
- "\x92\x10\x47\x81\xe0\x05\xc2\x54\x1d\x5f\xc9\xe1\x39\x9d\x8e\xd7"
- "\x04\xd1\xde\xe0\xaf\x31\x28\xec\x8d\x4b\xb6\x37\x92\x62\x6f\x02"
- "\x38\xfe\xa1\x4e\x05\xa3\xd9\x9b\xa0\x6c\x6f\x02\x4c\xd8\x9b\xa0"
- "\x6c\x6f\x28\x3d\x20\xdb\x9b\x40\x14\x7b\x83\xfa\x4c\xfd\x8d\x93"
- "\xed\x8c\x8d\xec\x0c\xf5\x17\x65\x2d\x2f\x28\xec\x8c\x05\x63\x0e"
- "\x89\xec\x4c\x00\xcb\x04\x15\x3b\xd3\xcd\xcb\xd7\x90\xad\xe9\xfd"
- "\x3e\xa0\xfd\x34\x02\xd9\x18\x6e\x4f\xfc\xa3\xfd\x64\x4f\x90\x7e"
- "\x33\x22\xed\x09\xe2\x6b\xc4\x7b\x83\x6c\xa7\x4e\xea\x2b\x98\x1f"
- "\xed\xc9\xa1\xdc\x52\x2f\xd0\x77\x88\xf5\x7e\xb4\xdb\xa5\x25\x36"
- "\x67\xa9\x1f\xd0\x0e\xb8\x58\xab\x0d\xb0\x8d\x28\xbf\x01\xb4\x15"
- "\x00\xa8\x97\x69\x7e\xd4\x71\x94\xf1\xcc\x56\xcb\x69\x08\xa0\xae"
- "\xce\x75\x77\x39\x17\x7b\x4d\x86\xb9\xe7\x99\x07\xe9\xe3\x5a\x6c"
- "\xb1\xa1\x7d\x31\x79\x5a\xdc\x1f\x40\x4e\x07\x0b\xe6\x14\xb8\x8c"
- "\xa8\x03\x99\x73\x57\x38\xf4\xf4\xdd\xa2\x79\x97\x98\x03\xed\xe2"
- "\xff\x37\xf7\xbc\x41\xbf\xa8\x03\x6e\xcb\x59\xca\x82\x01\xd4\x33"
- "\xec\xef\x21\xec\xb7\x03\xdb\x7e\x12\x75\xce\x85\x7a\x96\xe6\x8f"
- "\xd0\x33\xd4\x99\x9f\xe1\xbd\x51\xd0\xef\x63\x17\xea\x99\x23\xc8"
- "\xc7\xb3\x0e\x1e\xeb\x61\x3d\x2e\x9a\x0f\x43\x5d\x73\x04\xb7\x09"
- "\x5d\x0b\x8a\x72\x9e\x20\xd1\x4f\x92\x75\x0d\x79\x81\x7a\x83\x74"
- "\x6e\x36\xe0\x2f\xba\xae\x59\x54\xba\xf6\xaa\xac\x6b\x09\x42\xd7"
- "\x90\xa7\x71\x81\x4d\x42\xdf\x08\x3f\xc5\x83\x7d\xfa\x96\xf8\x09"
- "\xcd\x5f\x69\x84\xec\x70\x9d\xc3\x71\xe5\x93\x02\xd4\xb7\x3c\xd4"
- "\x37\xc4\xc7\x3c\x64\x37\x51\x36\xff\x44\x63\xdd\x3c\x0b\xfb\xd3"
- "\x92\xc0\x2d\x36\xd4\xa7\x02\xb4\x65\x9f\xa3\x1d\xfd\xd3\x62\x2f"
- "\x34\xa2\x3e\xa5\xa1\x1e\x65\xa2\x3e\xe5\xa1\x5e\x91\x3e\x9d\x0c"
- "\x6c\x22\x9c\x9f\x9e\xec\xc3\xc1\xc7\xca\x70\x7d\x12\x33\xe9\xd1"
- "\xe7\x23\xbb\xed\xb7\x17\xb9\xe0\x33\x1d\x3f\x8f\xd2\x7e\x7b\x29"
- "\xde\x9f\x91\xef\x31\xfe\xfb\x15\xdf\xd3\x4a\x7a\x68\x29\x87\x1b"
- "\xcf\x81\x71\x2a\xca\x3c\xe0\x7d\x12\xde\x67\xe4\xde\xf3\x21\x0b"
- "\x56\xeb\x9b\xb1\xee\x6e\xd2\x45\x66\x4f\xa7\xf8\x2c\x13\x65\x51"
- "\xc7\xba\x4d\x49\x2c\xb1\xcd\xce\x7a\x93\x69\xce\x4b\x8f\xcf\xc3"
- "\x91\x06\xa9\x78\x1d\xb1\xf7\x6b\x18\x89\xbf\xe4\xbd\xf6\xa0\x8d"
- "\xfc\x27\xbc\x4f\x63\xeb\x93\x13\x77\xac\x83\xb1\x7a\xaf\x38\x5f"
- "\x5d\x5f\x61\xa0\xb9\x9f\x91\x74\xcf\xec\xc7\xb4\x0d\x5f\xcb\x67"
- "\xac\x0f\xc3\xfa\xa2\x7c\x53\x39\xd0\xcd\xf5\x32\x53\x69\x0b\xb5"
- "\x0d\xdb\x79\x2b\xb6\x33\xe7\xe9\x0d\x99\x40\xdf\xeb\x8a\x66\x63"
- "\xba\xed\xc6\xbe\xfe\xc7\xc8\xaf\x56\x68\x12\x23\xff\xa0\x42\xa7"
- "\x58\xfb\x68\x69\x9c\x0e\xac\x63\x6e\x3a\x03\x84\xf6\xfd\x5a\xfd"
- "\xec\xcf\x48\x47\x5b\x79\x00\x74\xb9\xa5\x3e\xe6\x74\x33\x07\x7d"
- "\xf7\xab\x81\xce\x25\x29\x63\xc1\x60\x42\x5b\x21\xdb\xd6\x56\xd0"
- "\xb5\x8e\xf9\x69\x5e\xa5\xdb\x3e\xda\xe0\x82\x2c\x9d\xe0\xc5\x47"
- "\x0e\x1e\x13\xea\xda\x0a\x10\xd7\xf5\x84\xab\x05\xcb\x07\xb6\xb5"
- "\x99\x11\x6e\xaa\x0b\xdc\x7c\xcf\x3e\xea\xb2\xc3\xb2\x11\xfe\xe5"
- "\x1c\x8c\xe6\x67\x42\xb3\xca\xb6\x52\xb2\x09\x98\x66\xc0\xb4\x32"
- "\xc4\x5f\x86\xf0\x66\x17\xfc\x7e\xac\xf0\x65\x47\x97\x29\x70\x78"
- "\xcf\xcf\xbc\x0a\x93\x21\xb1\x1a\xc3\x16\xb6\x8f\x4c\x03\xe1\xbb"
- "\xe2\x68\x07\x5a\x66\xf4\xec\x90\x4d\xff\x38\x93\xce\xf3\xb4\x6e"
- "\x86\x14\xe4\x0f\xb5\xef\xef\xd6\x52\x76\x96\xd9\x47\x57\xfe\x70"
- "\xa3\x0f\x63\x8a\xd1\xd8\x96\x9f\xc5\xdc\x1f\x1c\xfc\x9a\x75\x20"
- "\x0d\x5c\x3b\x31\x2e\x24\xfa\x10\x3d\x51\x6f\x82\x48\x87\x2f\xc8"
- "\x26\x35\xac\xa3\xd8\xf8\x8e\x4c\x85\x5e\xb1\x79\xd2\x56\x22\xe2"
- "\xc7\x3b\x1a\x99\x9d\x81\xe3\x36\x7a\x97\x71\xc7\x7b\x82\x06\x1f"
- "\x9f\xec\x42\x3b\x42\x73\xb5\x74\xf6\xe6\x9a\x64\xe6\x43\x9c\xb5"
- "\x2e\xb8\x2f\x4d\xd9\xf7\xec\xf4\xcf\x26\xdb\x12\x75\xdc\xe2\x7b"
- "\x9e\xfb\xf0\xdf\xe9\x68\x4d\x41\x3b\xc4\x6d\x53\xc7\x82\x72\xc1"
- "\x7f\x3a\x0f\xcc\x4b\x7b\xf8\x3b\x30\x7f\x8d\x97\x75\xb2\xca\x8e"
- "\x6c\x8a\x23\x68\xff\x30\xa6\xfd\x1a\xe5\x9a\x39\x8a\xa9\x4d\x77"
- "\xfe\xda\x71\x5b\x0f\x9c\xc5\xf8\xb0\xa1\x6f\xee\xe6\xce\x83\x34"
- "\x57\x23\xe6\x9b\xee\x1c\xeb\x82\x71\x27\x94\x76\x91\x8f\x81\xb4"
- "\x25\x3a\x3b\xc8\xd7\xa0\xf9\xff\x35\x65\xcc\x47\x3e\x07\xc2\xe6"
- "\x2b\x7d\xa0\xfe\x89\x7e\xdd\x59\xa4\xee\x17\xb6\xc1\x83\xb1\x36"
- "\xa7\xc1\x9a\x0d\xa0\xe3\x67\x01\x06\xe8\xfd\xc1\x6c\xde\x17\xea"
- "\x33\xef\x0b\xb7\xb1\x38\x46\xf8\xef\xc7\xb8\x8d\xa7\xbb\x10\x17"
- "\xc6\x3f\x63\xa7\x0a\x79\xba\x73\x6c\xa4\x0c\xf5\xc9\x80\xee\x23"
- "\x3a\x67\xef\x36\x6b\x90\xb5\x9f\x85\xd4\xd9\x48\xa7\x38\xba\x06"
- "\xc9\xcf\xf6\x91\xec\xfe\xa9\x84\xc6\x64\x67\x19\xd9\x5b\x0e\x7b"
- "\x03\xc2\x76\x20\xcc\xfd\x32\xec\xfd\xe2\xdd\x0f\xbf\x0e\xa5\x2b"
- "\x8e\x63\xdb\x5d\x90\x9a\xe3\xe1\xe3\x7d\x87\x41\x79\x66\xf8\x8c"
- "\x57\xb4\xc3\x7f\x2a\x89\xde\x96\x4f\x6a\x68\x3c\x0b\x7c\xcd\xdc"
- "\x58\xcf\x4d\x24\x47\xd6\x0d\x70\x33\xca\xe4\x17\xe5\x9b\xe1\x46"
- "\x92\x31\x96\xd0\x66\x13\x74\x4f\xad\x63\x76\xf4\x3d\xd1\xa2\x5a"
- "\xd6\xc1\xbf\xa0\x0e\x95\x9e\x83\xd4\x9f\x2e\x29\x33\x62\x5b\x01"
- "\x76\x5e\x00\xf2\x51\x3e\x47\xf8\x32\xfa\x4e\x63\xc3\x05\x92\xc5"
- "\xd4\x13\x8a\x2c\xe2\x7d\xdb\x95\x6c\x05\x8e\x33\x06\x31\xcf\x30"
- "\x66\x36\xcd\xf5\xb7\xc3\x18\x3a\xa7\x38\x0e\x7f\x1a\x4c\x1b\xcd"
- "\xbe\x66\x29\x8c\x8f\x69\xcd\x48\xf3\x31\x8b\xf0\x6a\xe0\x3f\xb4"
- "\x25\xf2\x33\xb6\x71\x8c\x81\x7d\x1d\x20\x18\xb4\x19\x63\x4c\xcc"
- "\xae\x21\x3d\xa9\xef\xb6\x8f\x59\xe0\x82\xc7\xe4\xb8\x75\x8c\x91"
- "\x70\xc5\x68\x03\x3f\x63\x82\x9f\x2f\x01\x63\x3e\x30\x96\x6b\xa8"
- "\x1d\xfc\xfc\x1b\xc2\xd5\x20\x09\x9b\x1d\xc4\xb6\xee\xb3\x07\xcd"
- "\x68\x9f\xcd\xc1\xaa\x2f\x8c\xfc\x5e\xce\x63\xf2\x38\x1a\x1d\x7f"
- "\xc7\x02\x3a\x13\xa4\x03\xee\x4a\x16\x78\x3a\xb2\x1d\xb7\x9c\xa3"
- "\x67\x7e\x9e\x8d\x57\xd7\x6e\x74\xd6\x65\x8a\x33\x98\x11\x46\xc4"
- "\xf1\x77\xdd\xdc\x85\x75\x74\xdb\xef\x4a\x76\xc1\x04\x9d\x78\xef"
- "\xd1\x6e\x8c\xa1\x7b\x44\x0f\x46\x3a\x27\x74\xfa\xee\xf3\x2d\x8d"
- "\x5c\xff\x3c\x5d\xba\x66\x83\x6c\x7f\x69\x4e\x26\xa9\x1d\xee\x76"
- "\xb7\x24\x73\xf9\x96\x98\x74\x57\x69\xd8\x19\xb1\x98\xd7\xff\x77"
- "\x17\xc6\xfb\x77\x1d\xc5\x5f\xb3\xfc\x7c\x0a\x7f\x9d\x78\x3f\x15"
- "\x7f\x67\x38\xed\xf6\x14\x6a\x5c\x98\xd7\x85\x3e\x3b\x3d\xbb\xe0"
- "\xae\xc3\x6c\x4f\xaa\xa4\xdc\x37\xec\xa6\x79\x82\xbb\x5c\xc8\x03"
- "\xb3\xe0\xc5\xdd\xfc\xbb\xa3\xd8\x36\xa2\x3b\xb3\xd6\x31\x5f\x53"
- "\xb9\x97\xda\x6d\x68\xaa\xf3\x82\xf1\x2e\xea\xff\xdd\x23\xa9\x4f"
- "\x5e\xa4\x3f\x5d\xd7\xd4\x31\xcf\xb1\x7a\x3f\xd0\x3b\xb2\x6e\xfb"
- "\xdd\xa8\xff\xaf\xe7\x88\x39\x87\x0e\x1b\xe1\x93\x65\x82\x29\xfd"
- "\x17\x74\x6e\x37\x1a\xd7\x69\xe8\x79\xc3\x3e\x31\x0f\xe3\x0e\xcd"
- "\x35\xdf\xfd\x2a\xea\xf9\x0c\x3a\x43\xfa\x02\xdc\xfd\x0b\x86\xb4"
- "\x3e\x66\xe6\x67\x51\x7a\x68\x3e\x86\xe6\xef\xb1\x1e\xb4\x7f\x63"
- "\x9a\xe5\x73\x77\x3c\xdc\xd6\x20\xce\x1d\x98\x87\xe3\x91\xbb\xc5"
- "\xec\x83\x00\xf5\x19\xcb\x7e\xf0\xb5\x4f\xab\x2f\x01\x4d\x39\x7d"
- "\xdf\x05\xdb\xc1\x90\x57\xc2\x96\xdd\x9d\xbd\xf9\x3c\xf3\x29\x7d"
- "\xa6\x77\xa9\x88\xd7\xed\x82\x9a\xfc\x98\x3a\xd1\xd7\x8f\x7b\x12"
- "\x8e\xa5\x0a\x3e\x06\x91\x56\xe1\x7c\xbc\x47\x27\x78\x68\xca\x08"
- "\xe7\xe1\x3d\xe8\xeb\x98\xb6\xe2\xaf\x1e\x7f\x07\xc5\xb3\xfa\x67"
- "\xb2\xa8\xee\x91\xaf\x26\xb4\xa7\xa6\x32\xb4\x17\xf2\xdc\x0f\xa5"
- "\xa3\x3c\x93\xdc\xfc\x1d\xc7\x9e\xde\x7c\xa0\xf7\xa8\x94\x4e\x32"
- "\x4e\xe9\x41\xf4\x6f\x5c\x60\xaa\xc1\x7c\xe2\xb7\x81\xce\xf5\x54"
- "\xe7\xf7\x9d\xdf\x04\x26\x7e\x66\x99\xbe\xa2\xb2\x92\x64\x17\xcb"
- "\xd4\xea\xfd\x95\x95\x58\x9f\x5b\xa1\x2b\xa6\x9d\xa2\x7c\x92\xd3"
- "\x6e\xfb\x3d\x5a\xa4\x0b\x7f\xc7\xe4\xc5\x18\x30\xba\xef\x71\x8f"
- "\xa9\xcf\x47\xd3\x35\x5b\x88\x97\x6e\xb8\x37\x1d\xed\x18\xda\xef"
- "\x2f\xc4\xb9\x32\x70\xef\xfd\xf4\x8c\xf6\xf3\x0b\xbc\x4f\x6b\x41"
- "\x3b\xd5\x53\x75\xda\xdc\x2b\xc1\xd0\x1e\x09\x32\xfd\x3b\xf4\x6e"
- "\x7f\x62\x4b\x89\xb3\xf3\x30\xb4\xfa\x7f\x0e\xf4\xad\x52\xc4\x71"
- "\x0f\x9d\x2f\x6b\xdd\xc0\x02\xef\xf7\x1c\xd0\x3a\xfd\x17\x1d\xfc"
- "\x3c\x75\xb1\x3f\x5f\xf3\x83\x76\xf4\x02\x16\x73\xdc\x82\x3e\x49"
- "\xfa\xe6\x1d\x2f\x31\xff\x8e\xb3\x74\xe6\x4c\x72\xe2\xf6\x1e\x18"
- "\xfb\xee\x46\x48\xab\xef\x81\xd4\x7d\x3d\x60\x62\x7f\xa1\xef\xdf"
- "\x84\xbe\x99\x33\xdc\x02\xba\x7d\x1b\xd1\x9f\xf3\x83\x26\xb0\x1d"
- "\xfd\x39\x3f\xfa\x73\x17\x4d\x64\x2f\xfb\xfc\xb9\x5e\xee\x2b\xb7"
- "\xb9\xf9\x39\xe4\xdb\xda\xdc\xc3\xcc\xa0\x49\x2a\x00\x03\xb6\xcf"
- "\x7a\x01\xee\x59\x91\xd4\x81\xbe\x24\xf6\xd9\x25\xf7\x17\x69\x5e"
- "\xa6\x37\xc3\x50\xde\x57\xb4\xe1\x6c\xdb\x17\xc9\x31\xc7\x66\x89"
- "\x64\xca\x4b\xba\x44\x7d\xa8\xa0\x77\xb9\x87\x6f\xf1\x69\xd7\xd4"
- "\x33\x1f\xa5\x97\x8c\x66\x3e\x4c\x37\x53\xdd\x87\x30\xbd\xdb\x7e"
- "\x6f\x8d\x4b\xfa\x75\x7a\x2c\x19\xc5\x98\x49\xb6\x35\xf7\x5d\xcf"
- "\x24\x1b\xca\x68\xf3\xa1\xcd\x7e\xf4\xc7\x2f\x90\x1e\xdf\x67\xc8"
- "\x2d\x62\x7e\xe3\x2a\x7a\xaf\x7e\x1f\xd0\x3b\x7f\x7a\xd7\xf7\x33"
- "\xf4\x75\xae\xf6\x9e\x9f\xc6\x10\x8a\x1f\xf4\x45\x88\xb3\xaa\xf9"
- "\x10\xc3\x98\x7d\xa0\x7e\x3d\xad\x35\x79\x8b\xaf\x6b\xb9\x2f\xc7"
- "\x05\xcf\x34\xca\xe7\xc8\xba\x85\x3d\x1d\x3b\xd6\x8b\x34\x08\xb7"
- "\x01\x63\x81\xce\x3f\xe9\xaa\x3c\xed\x75\xdc\x46\xb6\xff\x3e\x71"
- "\x86\x5c\xe5\x69\x8f\x18\x0b\xee\xfb\x83\x98\xe3\xbf\xaf\xde\x05"
- "\x0f\xf1\x31\xde\x72\x07\xc9\xc4\x7d\xa7\x58\xe2\xe9\x2e\x82\x1b"
- "\x6f\x03\xdb\x6a\x3f\x14\xb0\x6d\xa7\x3d\x8c\xeb\xca\x05\x60\xef"
- "\xbc\xd2\x4d\x6b\x35\xbc\x37\x2d\xec\x46\xdf\x60\x2c\xe6\x79\xa9"
- "\x0e\x0f\xc2\x20\xdd\x13\xc4\x9a\x80\xfb\x3c\x2e\x78\x50\xb6\x87"
- "\xf7\x35\x89\xb9\xe7\xfb\x9a\xba\xb0\x2c\xfa\x8a\x37\x74\xdb\xc7"
- "\xe2\x58\x36\xbf\x44\x7e\x77\xcc\xd7\xf4\x60\x5a\xaa\x0b\x16\x1c"
- "\xa1\xb4\x92\xd1\x90\x5c\x62\x64\x9d\x31\x7d\xbd\xb0\x7e\x8e\xfb"
- "\x31\x5f\x77\x23\xc1\x4d\x88\xc3\xac\xe0\xc5\xf1\xf6\x27\x5d\xd2"
- "\xd3\x4f\x63\x5a\x99\x82\x17\x61\x6e\xc4\xe7\xea\x3e\x18\x51\xa6"
- "\x5e\x55\xe6\xe9\x2e\xe9\xde\x9f\x60\xda\xa1\x88\x32\x8e\x88\x32"
- "\x27\x55\x65\x6c\x72\x3d\x1d\x11\x65\xbc\xe1\x65\xc6\x69\xfb\xb7"
- "\x6d\x5c\x72\x78\x99\x71\xa6\x88\x32\x53\xfb\xb7\x6d\x5c\x4e\x44"
- "\x99\x45\x11\x65\x8a\x54\xb4\xa5\x35\x30\x69\x98\x66\x8b\x28\x53"
- "\x13\x51\xa6\x51\x79\x46\xdf\xd3\x21\x7c\x03\x94\x27\xe4\x29\xf2"
- "\x15\x6d\xe8\x38\xec\xff\xf4\x53\x57\x5a\x07\x85\x32\xe3\xb6\xee"
- "\x15\xe7\xf1\x93\x5d\xa5\xf7\xfa\x64\xcf\xd1\x2f\x76\x93\x4c\x90"
- "\xdf\x49\x75\x9d\x85\xf1\xe7\x49\x86\xba\xed\xe3\x47\xf6\xa7\xc7"
- "\x78\x53\x78\x3b\xc7\x4f\x0d\x6f\xe7\xf8\xec\xfe\xf4\x18\xbf\x28"
- "\xa2\x4c\x51\x44\x99\x32\x55\x99\x46\xb9\x9e\x9a\x88\x32\x8d\x11"
- "\x65\x0e\xf5\x97\xcf\xf1\x4d\x11\x65\x4e\x45\x94\xe9\x08\xd1\x70"
- "\x3c\x5f\xcf\x46\xfa\x80\xe9\xf8\x9c\x91\x7a\x05\xda\x19\x14\x79"
- "\x56\xd6\xa3\x09\xb9\x9e\x50\x51\x2b\xd6\x65\xf1\xb3\x8f\x3a\x60"
- "\xc2\xdb\xca\xfb\xde\x1f\xf6\xf8\xe2\xe9\x1d\x13\xd2\xb6\xf3\x58"
- "\xa9\x0f\xc7\xdc\x09\x05\x2e\xb8\xbf\x6f\xcd\x06\xad\x73\xe1\x67"
- "\xe7\xf1\x78\x64\x42\xa6\xd0\xbf\x09\xb5\xf2\x3b\x1d\xea\x0f\xf2"
- "\x74\x42\xed\xb5\xb5\x2b\xed\x7e\x6a\x17\x9d\x21\x85\x38\xda\xfa"
- "\x62\x8d\xbe\xb6\x52\x9d\x69\x33\x95\xb6\x36\x88\xb5\x36\x74\x6e"
- "\x99\x87\xce\xf5\xea\xb6\xa7\x25\xa9\xe2\x13\x6a\xab\xf7\xf0\x46"
- "\x9f\x36\xa2\xcd\x6e\xd1\xe6\xb4\x4c\x61\xa3\xd2\x32\x15\x7b\x12"
- "\x53\xfe\x2a\x3b\xa6\xb6\xa2\x57\x40\x6b\x0a\x5a\xea\xd1\xdf\xc4"
- "\x18\x8b\xda\xdd\x0e\x69\x95\xdc\xff\x5d\xd5\x03\x74\xef\x2c\x9b"
- "\xc6\xd7\x1c\xc8\x7d\x71\xd0\xf7\x1b\xc8\xf7\x69\xb2\x7c\x05\x5d"
- "\x3c\x46\x23\xdb\x98\x76\xfe\x58\x99\x87\xda\x7a\x44\x59\x97\x83"
- "\x6d\x11\x7e\x5d\x65\x47\x1a\xad\x87\xa0\xf7\x7a\xc7\xbc\x53\x09"
- "\xe6\x0c\xd2\xb6\x51\xa1\x01\x7d\x0b\x02\x61\x6b\x63\xc5\x4a\x6a"
- "\xba\x8a\x36\x4c\x7e\x4e\xc8\xcf\xc4\xd4\x70\x7d\x88\x47\x39\x9d"
- "\x38\x35\x5c\xe6\x26\x66\x87\xcb\xdc\xc4\xfc\x70\x7d\x90\x50\x1f"
- "\x26\x16\x45\x94\x29\x8b\x28\x53\xad\x2a\x53\x23\xd7\xd3\x18\x51"
- "\xe6\x50\x44\x19\xb5\xfd\xc3\x3e\x4f\x3c\xd9\x17\x77\x72\x7b\x3f"
- "\xd1\xa5\x7a\x96\x6a\xf9\x38\x35\xd1\xab\xa4\xd1\xbc\x1d\xf9\xa8"
- "\x24\x37\x02\xdf\x24\x43\x84\x8d\x42\xf8\x49\xa9\xe1\x6d\x98\x94"
- "\x1e\xde\x86\x49\x59\xca\xb3\xbc\xe6\xe1\x37\x67\x61\xd2\x36\x59"
- "\xce\xbc\xfa\x0a\x78\x52\xef\x7f\xea\x39\xf2\xcd\x68\x7c\xe2\x6b"
- "\xc3\x36\xa3\x4f\x79\x89\xbe\x09\xef\xa3\xef\x07\xc6\xd1\xf9\x72"
- "\x2e\x98\x7c\x14\xe3\x39\x3a\x2f\xd9\x8d\xfe\x54\x2e\xe2\x58\x80"
- "\xf5\xd7\x61\x1d\x48\xbb\x49\x07\x22\xda\x70\x24\xa2\x0d\xcd\xaa"
- "\x67\xf4\xe9\x26\xb5\xa9\xfa\x6d\x88\x4b\xe6\x6b\x40\xd1\xb7\x9e"
- "\xe4\x51\xd2\x69\x0e\x00\xfb\xd8\x69\xe5\x7e\x40\x26\xad\xc7\x1b"
- "\xd1\x0e\x93\x3e\xa3\xf9\x02\x81\x73\x72\x8a\x9a\xb6\x82\x16\x93"
- "\xd3\xc2\xdb\x31\x39\x33\xbc\x1d\x93\xf3\x42\xb6\x66\xd2\x02\xa1"
- "\x23\x93\x0b\x5d\xf0\x70\x0d\xa5\x21\x2d\x8c\x7a\xbf\xf1\x06\xc7"
- "\x1d\xe4\xa7\x4e\xfe\x77\x2f\xf6\x97\x7d\x5f\x1a\x21\x3f\xff\x82"
- "\xdd\x41\x7e\x77\x5b\x27\xda\x67\x5a\x73\x79\x3b\xa6\x1d\x15\x7c"
- "\x9d\x8c\xfd\x7f\xe8\x80\xc0\x3b\xf9\x28\x1f\x07\xee\x20\xff\x77"
- "\x72\x25\x4b\xe8\xc8\x8e\x25\xcf\x5d\x89\x1d\x99\xf2\x7a\x50\x8c"
- "\xe9\x26\xbb\x15\x7d\x08\x56\x75\x64\x06\xb7\x7d\xee\xea\xb6\xa7"
- "\x23\x8e\x34\x9f\x88\x69\x3e\x1f\x8b\xb2\x5f\x87\xfc\xc3\x18\x38"
- "\x5d\x8e\x65\x3a\x16\xd0\x9a\x3c\xb4\x4b\x74\x86\x65\x92\x58\x3f"
- "\x91\x9e\xae\xd2\x2b\xaf\x71\xe3\x0c\xd6\x0e\xe9\x97\xc9\xb7\x23"
- "\xbb\x41\x6b\xfb\x8e\xf9\x3d\x40\xf3\x2c\x4e\xff\x39\xee\x93\x63"
- "\xbe\x4f\x2e\x6b\x51\x95\xf5\xc8\xf3\x20\x9d\x94\x37\xc1\x0f\xda"
- "\x63\x5e\x0f\x9d\xd5\x3f\x52\xf8\xf1\xe9\x97\x8f\xa1\xbd\xc0\x32"
- "\xfb\x95\x32\x34\x67\x42\x65\x30\xe6\xd1\x8e\x2f\xa3\xef\x5e\xb6"
- "\x73\xdc\xca\xfa\x1a\x8a\x8f\x9c\x65\x9d\xe0\xf4\xb6\xd1\x9c\xa6"
- "\x56\xac\x8b\x4a\xf7\xc5\xf9\x40\xd7\xb5\xad\x03\x79\x97\xee\x0b"
- "\x6c\xeb\x98\x8a\x6d\x43\x3e\xa5\xd3\x39\xa3\x61\xbe\xcc\xec\xd9"
- "\x79\x4f\xe5\xce\x1d\xf7\xec\x53\x73\x16\xcc\x9e\x66\x5c\xb0\x62"
- "\xe5\xf2\xc2\x71\xab\xd7\x96\x18\xd7\x17\xaf\x28\x59\xb1\xea\x7b"
- "\xfc\x78\x51\xe3\xd2\x12\x71\x35\x15\x2d\x5d\x53\x32\x9d\x6e\xc7"
- "\x1a\x2d\xc5\xcb\xd7\xf1\xdb\x7b\x12\x21\x1c\xc9\x8a\x92\xe5\xc5"
- "\xc6\x31\x85\x63\x8d\x8f\x2e\x5d\x51\xb4\xb6\x78\x79\x54\x5c\xd3"
- "\x8c\xc5\xcb\x8b\x97\x2f\x2d\x34\x4e\x37\xa6\x11\x66\x35\x3a\x15"
- "\x3f\xd3\x14\xfb\xb4\x06\xc7\x73\xf4\xa1\x3b\xc9\x4e\xd1\xb8\x7e"
- "\x16\x1e\xf8\x8c\x7c\x38\x7e\x1e\x28\xca\x21\x8e\x09\xc8\xdb\xfb"
- "\xcf\xf4\x1f\xc7\xef\xf7\x84\xcb\xef\x14\x08\x97\xdf\x29\x86\xfe"
- "\xe3\xf8\x94\x08\xfd\x9f\x12\xa1\xff\x53\xb2\xfa\x8f\xe3\x53\xf2"
- "\x23\xca\x98\x23\xca\x94\xf6\xd9\x19\x6c\xeb\x16\x6e\x97\xa6\x54"
- "\x47\x94\xa9\x8f\x28\x73\x30\xe2\xf9\xa8\xea\x19\x7d\xd7\x29\x27"
- "\xd4\xbe\x01\x3e\x9f\x51\x74\x3d\x64\xdf\xa6\x78\x14\x18\x1a\x7b"
- "\x1a\xe8\xbb\x43\x1c\xf6\x01\x9d\x0a\xb6\x53\xc0\x3e\xd0\xa7\xff"
- "\x64\x93\x68\x4d\xa4\xf0\xcf\x1f\xd8\x2e\xdb\x36\xfa\x0e\x91\x32"
- "\x86\x76\x20\x2f\x6e\xbf\x00\x53\x2e\x37\x08\x58\x0f\xad\x93\x65"
- "\xef\x2c\xec\x6e\x18\x01\x3a\x2a\x4b\xe7\x61\x32\xfb\xfd\xfc\x6c"
- "\x46\x4c\x4b\xc2\x1f\xda\xa9\x07\x6c\x2e\xe9\x37\xfc\xfb\x5c\x5b"
- "\x11\xc6\x05\x0f\x70\x59\xa6\x72\x5b\xf9\xba\x3e\x5e\xdf\x65\xfa"
- "\x9e\x12\x9d\x31\x4b\xf6\x93\xea\xa5\x73\x5a\xa9\x6e\xc4\xa1\x65"
- "\xd2\xfd\x73\xe4\xf3\x36\x0d\xf8\x1b\x89\x38\x4f\x29\x38\x11\x1f"
- "\x9f\x27\xda\x22\xaf\x83\x17\x7e\xcf\x03\x5e\xc5\xbf\xa0\x58\x21"
- "\x9a\xed\x88\xbe\xe6\x19\xf4\x3b\xed\xc1\x36\x47\x79\x07\xb6\x69"
- "\x6a\x2a\xf9\xa1\xce\x64\x3f\xb4\xd6\xfb\x31\x7e\x05\x03\x8f\xa7"
- "\x4a\xcf\x83\xb3\xd1\x0f\x34\x3f\xbc\xa4\x14\x6c\x0d\x52\xb0\x8d"
- "\xf5\x95\xa3\x18\x6d\x2a\xff\x26\xe4\x56\x4a\xc7\xf2\x18\x4b\x78"
- "\x68\x6d\x74\xac\x6f\x7d\x11\x9c\xe3\x0e\x8a\xf7\xa6\xd6\xca\xbe"
- "\x6f\x65\x03\xe2\x8a\xba\x6e\x57\x02\x67\xb7\x7d\x2a\x8e\x7f\x05"
- "\x53\x15\x9b\x7d\xac\x8e\xdb\x3e\x09\xd3\x91\xb6\x53\x93\x63\xf9"
- "\x29\xb2\x7d\xa7\x73\x22\x87\x76\xdb\x1f\x1c\x79\x25\x58\x6a\xf7"
- "\x31\xec\x37\xea\xa2\xef\x87\xe5\x69\xf1\xb2\x7d\xd5\x61\xb9\x1c"
- "\xa5\xdc\x40\xfa\x27\xef\x51\xf0\xa0\xae\x7a\x45\xac\x38\xed\xd7"
- "\x6f\xf1\xb5\xc0\x0f\xa2\xff\x37\x55\xd1\x83\xeb\xf0\x19\xed\xdf"
- "\x83\xdc\xd7\xa1\x75\x33\x14\x53\xaf\xb1\xa0\xcf\x96\xec\x45\xdb"
- "\xf8\xa0\x43\xc9\xe3\xf3\x44\x94\x57\xc6\x7c\xc7\x92\x3b\x28\xef"
- "\x4c\x5f\x1e\x95\xa3\x76\x97\xfa\x29\xdd\xab\xa4\x8b\xb1\x65\x9a"
- "\x36\xe2\x79\xa4\xf2\x8c\xf7\x46\x6c\x4b\xa5\x8c\xdf\x83\x36\x97"
- "\xd6\x3c\x69\xda\x61\x5a\xc5\x3e\xae\x37\xd3\x32\x95\x7c\x3e\xa7"
- "\xf6\x1e\xbd\x1b\xf3\x42\x30\xf1\xb4\x8f\xfb\x5c\x58\x86\xbe\xcf"
- "\x85\x31\x86\x86\xf5\xf2\xf5\x57\x6e\xc2\x43\x3a\xc3\xbf\x91\x83"
- "\xcf\x88\x2b\xbd\x81\xe4\x1a\xf9\xba\xde\x0f\x29\x96\x87\x69\xfe"
- "\x79\x1a\x97\x5b\x4a\x23\xbc\x84\x8f\xc6\x44\xc2\x4d\xf8\xe8\x3b"
- "\x62\xac\x8b\xd6\x28\x4e\xc3\xfe\x4f\xf5\xc6\xe2\x15\xe6\xbb\x54"
- "\xb4\x8c\xc7\x67\x4f\x78\x5f\x1f\x82\x88\x67\x83\xf2\x4c\x73\xbd"
- "\x42\xf6\x1e\xd2\xca\x79\x63\xaf\x54\x17\xc5\xbf\x08\x93\x17\x5e"
- "\xdf\x43\x05\x11\xf8\x2d\x11\xcf\x36\xe5\xb9\x96\xbf\x63\x78\xa8"
- "\x46\xa9\x83\xf3\x0c\x65\x6c\x7f\xb9\x27\xfe\x4a\xe7\xc6\x62\x99"
- "\x26\x55\x9d\x43\xf0\xf9\x54\x88\x7f\x0f\xb9\x14\x7c\x78\xef\x56"
- "\xc1\xa1\x5f\xf2\x90\x5f\x81\x13\xef\x37\x32\x92\x42\xe5\x32\x92"
- "\xaf\xd2\xd7\x08\xd9\x9d\xbe\x5c\xc8\x6e\x46\x5e\x78\x5b\x32\x0a"
- "\x54\x38\x8b\x42\x6d\xc9\x28\x55\xc1\xa1\x7e\x66\x54\x46\xca\xea"
- "\x9a\x52\x92\x71\x92\xd7\x8c\xfd\x51\xf2\x7c\x72\x9e\x23\xba\x8c"
- "\x67\xb4\xa9\xd2\xe5\xf8\x68\xfa\x74\xd9\x4f\x20\xfb\xec\xa5\x6f"
- "\xa4\xc9\xe7\xb4\x73\x99\xa4\xf3\x9b\xe5\xef\x36\xa1\x5c\x4f\x4f"
- "\x8e\xc4\x4b\xdf\xda\xe9\xc3\xd1\x87\x33\xa3\x53\xf8\x78\xd3\xb3"
- "\x43\x7d\x9b\xbe\xc0\x05\xd3\x94\xf7\x44\x1e\x31\x37\x98\x91\x15"
- "\x2b\xee\x40\xf8\xad\xe1\x34\x9b\x5e\x1b\xa2\xd9\xf4\x46\x15\xde"
- "\x83\x2a\xb8\x8f\xf1\xf9\xa8\x0a\xae\xf9\x6a\xb2\x29\x64\x65\xba"
- "\x27\xbc\xae\x87\x21\x84\xe3\xe1\xa4\x50\x5d\x0f\x27\xab\xe0\xda"
- "\xf0\xd9\x14\x9b\x3f\x0f\x67\xc5\xe6\xcf\xc3\x05\xd1\xf9\xf3\x70"
- "\xa9\xaa\xde\xad\x57\xd7\xab\x87\x0f\xa8\xda\xd3\x80\xcf\x47\xc2"
- "\xf5\xe8\xe1\xe6\x88\xe7\x3e\xfe\x33\xb4\x1d\xfb\x37\x66\xc6\x53"
- "\x7a\xc9\x68\x30\x08\x3d\x7b\xd8\xa7\xce\x7f\xbf\x47\xe4\x53\x1b"
- "\xf9\x3b\x38\x7a\xbf\xc9\xe1\x66\x18\x23\xe1\x08\x46\x95\x9f\xa9"
- "\xb4\x7d\x6b\x8c\x33\xc5\x95\xf1\xcf\x19\xa4\xf1\x6f\xc6\x22\xf1"
- "\xde\xe6\xf7\x63\x99\xfd\xc3\xfc\x58\x63\x19\xe2\xad\x73\xc1\x8c"
- "\x3c\x41\x9f\x19\x28\xff\xcf\x8a\xbd\x2f\x95\xbf\x1f\x8b\xf2\xd4"
- "\x73\x16\x32\xa7\xe3\xb5\x17\xaf\xa3\xc3\xc7\xd7\x19\x47\x99\x5d"
- "\x33\xbf\xc1\x1e\x39\xee\xce\x38\x85\xb1\x47\x8f\xde\x6f\xcb\x8f"
- "\x92\xe7\x61\xf6\xb8\xa7\xfa\xa7\x67\xd2\x58\xd7\xe3\x82\xcc\x0c"
- "\x6a\xaf\x2a\xdd\xc8\xec\xc3\x17\x10\xbc\x8b\xea\xc3\x32\xb1\xf8"
- "\xa6\xec\x2f\x12\xb2\x97\x59\x14\xd1\x8f\xcb\x88\xeb\xaf\xa2\x1f"
- "\x33\x67\x47\xd4\xbd\x35\x7a\x3f\x32\xeb\xb1\x1f\x97\xa3\xf7\x23"
- "\x93\x7f\x83\x96\x49\xd8\x97\x7e\x7e\x47\xe6\x29\xec\xcb\x65\x4e"
- "\xf7\xf0\x74\xb7\x12\xa7\x5a\x2f\x63\xfc\x2f\x01\x2f\x3b\xbf\x2c"
- "\xc4\x37\x01\x37\x73\xa4\xbe\x0e\xf2\xfa\xd7\x39\x13\xf9\x38\x74"
- "\xbe\x0b\x66\x16\x2a\xe3\x95\x9c\x9e\x25\xda\x82\x74\x92\x88\x4e"
- "\xd8\x1f\x2c\x17\x8b\xdf\x8a\x7e\x8a\xf7\x4c\x33\x51\xff\x33\xb3"
- "\x95\x31\x1d\xc7\x73\x8f\x42\x47\xcc\x3b\x14\x91\xe7\x53\xe5\x9d"
- "\x08\xcb\xdb\xdc\x97\xde\xa1\xa4\x0f\x8c\x4f\x8f\x8c\x8c\xe0\x13"
- "\xf2\xe7\x91\x1f\x85\xf7\xfb\x91\x54\xd1\x3f\xe4\x51\x3f\x5a\x3f"
- "\x92\x89\x3c\xea\x8d\xce\xa3\x47\x16\x45\x97\xb5\x47\xf8\x37\xb2"
- "\xd9\x08\x88\x86\xaf\x06\x79\xd7\xcb\x65\x50\xe6\x53\x7f\xfe\x3c"
- "\x72\x58\xe1\xcf\x00\xfb\xe8\x8b\xe8\x63\xe0\x2c\xcc\x5a\x2b\xfa"
- "\x3a\xeb\x78\x38\xee\x59\x86\xe8\xb2\x38\xcb\x84\xfd\x0c\x44\xef"
- "\xe7\xac\xac\xd8\xb2\x38\xab\x00\xfb\x13\xe8\x2f\x8b\xb3\xc4\xb7"
- "\x7f\x65\x19\x8c\xc8\xab\x65\xf6\xa8\xf5\x1c\x24\xbf\xc8\x05\xb3"
- "\x3a\xe8\x3d\x9d\x2a\xbd\x29\x5c\xfe\x66\x19\x78\x39\xa2\x9f\x5f"
- "\xc4\x31\xc4\x87\xb3\x46\x90\xae\x26\x93\xdd\xf6\xac\xd4\x08\x5a"
- "\x5d\x3c\x0b\x59\x3f\xea\x92\xa4\x47\x05\xbd\x66\xaf\x08\x6f\x53"
- "\x56\x66\x74\x7a\x65\xe5\x23\xbd\x2e\x46\xa7\x57\x56\x49\x6c\x7a"
- "\x65\x11\xff\x2f\xf6\xa7\x57\xd6\x01\x35\xbd\xe8\xdb\xae\xd4\xbf"
- "\x3b\x93\x51\x36\x7a\x97\xb0\x06\x61\xcb\x0d\x7a\x94\x15\x51\xc6"
- "\x4d\x65\xce\xe8\x7d\x42\x4e\x8c\xb7\x80\xee\x02\x64\x35\x29\xfa"
- "\x3f\xbc\x0e\x86\xb2\xde\x85\xb4\x46\x9b\xbe\x15\x61\x70\x96\x5e"
- "\x74\xd0\x37\x25\x69\xbe\x31\xbc\xde\xd9\xc6\xe8\xb6\x60\xf6\x54"
- "\xa4\xe9\x9b\x51\xd2\xf3\xc4\x9c\xe9\xec\xca\x70\x1b\x31\xdb\x1c"
- "\xce\x23\xa4\x9b\xc4\x4f\x41\xd7\x0c\xe4\x77\x65\x9e\xcd\x6e\xeb"
- "\xcf\xb3\x47\x37\x08\x7e\x3d\xfa\x5c\x44\xfb\x3c\xd1\xf9\xf5\xa8"
- "\x2e\x36\xbf\x1e\x4d\x8d\xcd\xaf\x47\x33\x89\x5f\x2e\x78\xb4\x34"
- "\x7c\xdc\x78\x34\x3f\xbc\xbf\x58\x2f\x96\x63\xd2\x90\x1b\xe8\x79"
- "\xa0\xfd\x56\x7e\x64\xe3\x88\x57\x0d\xe8\x5f\x61\xfb\x47\x53\x1b"
- "\x07\x8b\x23\x26\x6e\xa4\x61\xcd\xc6\x98\xdf\x1f\x49\x6a\xc5\xb8"
- "\x92\xd6\xe7\xf1\xef\x43\xc3\x63\x73\x83\x92\x66\x1a\xde\x4b\x67"
- "\x61\xce\xcd\x41\x29\xce\x46\x6b\xc9\xf8\xde\x3c\xfe\x7e\xe2\xb1"
- "\x42\x35\x2f\x68\x4d\x19\xcd\x45\xef\x10\xf3\x9c\x9f\x63\xf9\xf3"
- "\x82\x2f\xd9\x97\xc3\xe9\xf8\x58\x65\x74\xbe\x3c\xd6\x88\x7c\xf9"
- "\x3c\x3a\x5f\x1e\x3b\x1a\x9b\x2f\x8f\x51\x4c\xfa\x79\x7f\x3d\x7a"
- "\xcc\x23\xeb\xd1\x16\x2a\x63\x5c\x45\xfe\x6a\xf6\x52\x82\xc1\x7b"
- "\xd4\x91\xec\x39\x94\x3f\xce\xad\xe8\x11\x95\xc9\xa6\xf8\x9f\xd7"
- "\x2f\xc3\x18\x65\x1c\x2a\xbc\xd9\xd9\x7a\x77\x34\x3d\xc9\x2e\x20"
- "\xd8\xf1\x16\xd0\x21\x0d\xf3\xf7\x12\x8e\x62\x00\xc4\xf1\x0b\x82"
- "\xa3\x74\xfa\x76\x83\x0a\xbe\x46\x81\xe3\xf3\xa2\x02\xb6\x92\x75"
- "\x9b\xf9\x37\xaa\x22\x70\xcb\xfd\x1f\xca\xc7\x11\x82\x27\xb8\x08"
- "\x18\x97\xd0\xc7\x39\xa9\xe1\xfa\x98\xed\x0b\x97\xcf\xc7\xe8\xfd"
- "\x84\x3e\x88\x76\x0e\xef\x73\x02\x76\xcd\xb4\x6f\x46\x37\xe7\x94"
- "\x44\xe8\x26\xca\xc0\xe3\x37\x0a\x19\x98\x73\x29\xbc\xad\x73\xaa"
- "\xa3\xcb\xc0\x9c\xfd\xb1\x65\x60\x8e\x23\xb6\x0c\xcc\x39\x43\x32"
- "\xe0\x82\xc7\x47\x86\xeb\xe6\x1c\x6f\x78\xdf\xb1\x5e\xae\x9b\x70"
- "\xfd\x60\x74\x13\x7d\xa1\x1b\x62\xe9\xa1\xec\xff\x6b\xe8\x7b\x6c"
- "\x83\xa0\x99\xf8\xbe\x10\x3c\x7e\x80\xde\x21\xa1\x8d\x37\x13\x0d"
- "\xf7\xf1\x18\xed\xf1\xa3\x6a\x3a\xee\x10\xb1\x96\xf5\x2c\x3c\x31"
- "\x93\xd6\xec\x09\x7a\xe6\x24\x84\xf7\xff\xf1\x33\xd1\xe9\xf9\x38"
- "\xbd\xa7\xb0\x46\xa7\xe7\x13\x86\xd8\xf4\x7c\x62\x2c\xed\x01\xef"
- "\xaf\x53\x4f\x64\xd1\xb7\x36\x95\xb1\xe9\x02\x3c\xb1\x77\x60\xe3"
- "\xd3\x13\x65\xe1\xe3\xd3\x13\x85\x83\x1f\x9f\x9e\x70\x44\x1f\x9f"
- "\x9e\x68\x8b\x3e\x3e\x3d\xe1\x11\xfa\x90\x63\x0a\xd7\x87\x1c\x5d"
- "\xb8\x4c\x20\xed\xbe\xb1\xf1\x29\xa7\x34\x42\x07\x76\x62\x7d\x97"
- "\xd1\xa7\x78\x4d\xf0\x6d\xee\x07\xe1\x6d\xcc\xa9\x8d\xce\xb7\x9c"
- "\x83\xc8\xb7\x9d\xd1\xf9\x96\xd3\x1c\x9b\x6f\x39\x1d\xc8\xb7\x9d"
- "\xfd\xf9\x96\xe3\x1f\xbc\x4f\x31\x37\x2d\x9c\x67\x73\x93\x07\xcf"
- "\xb3\xb9\x25\xd1\x79\x36\xb7\x3a\x3a\xcf\xe6\xee\x17\x3c\x9b\x7b"
- "\x26\x9c\x67\x73\x8f\x86\xf3\x0c\xe9\xf6\x8d\xf1\x6c\xde\xd8\x08"
- "\x9e\xad\x3e\x0b\xf3\x7e\x8a\x3c\x3b\x29\x78\x96\xfb\x6a\x78\x1b"
- "\xe7\x65\x47\xe7\xd9\xbc\x02\xe4\xd9\xea\xe8\x3c\x9b\x57\x16\x9b"
- "\x67\xf3\xea\x90\x67\xab\xfb\xf3\x6c\xde\xa1\xc1\xf3\x6c\x5e\x47"
- "\x38\xcf\xe6\x9d\x18\x3c\xcf\x72\x4d\xd1\x79\x96\x9b\x19\x9d\x67"
- "\xb9\xf9\x82\x67\xb9\x35\xe1\x3c\xcb\xb5\x84\xf3\x0c\xe9\xf6\x0f"
- "\xf2\x0c\xf9\x93\x26\xd6\xeb\xe6\xfe\xbd\x8b\xcf\x69\xe7\x76\xba"
- "\x20\xef\x90\x78\x27\x90\xc7\x65\x47\xe6\xe1\xfb\x08\x73\xa6\xff"
- "\xd8\x9d\xa7\x95\xd3\x9e\xed\xcf\x87\x3c\x23\x8e\xab\xee\xa6\x32"
- "\xbe\xae\x4b\xf0\x90\x68\x8e\x70\x62\x8e\x2c\x2f\x93\xca\x22\x8f"
- "\x99\xd3\xe7\x07\x1a\x8b\x11\xde\x4b\x78\xe8\xbc\x92\x08\x5c\x45"
- "\x83\xf1\xcb\x62\xaf\x31\xff\x7d\x9a\xa3\x7c\x12\xe2\x7b\xb2\x42"
- "\xc8\x6a\x5e\xa4\xff\xdb\x80\x79\x4f\x0b\x39\x9d\x1f\x31\x67\x92"
- "\x17\xc3\xff\x7d\x92\xfc\xdf\x86\xe8\x72\xfa\xe4\x15\xfc\xdf\x27"
- "\xc9\xff\x6d\x50\xc5\xab\x23\x16\xfb\x5d\x11\xf1\xea\x93\x85\x7a"
- "\xaf\x90\x1d\xee\xc7\x6e\xfb\x7d\x5a\xb7\xfd\xc9\xea\x88\x36\x23"
- "\x6f\x9e\x4a\x90\xdb\x1c\xc1\x9f\x27\xf7\xc7\x68\xf3\x51\x6c\xf3"
- "\xfb\x31\xda\xdc\x76\x85\x36\xd3\xd8\xfc\x7e\x7f\xdd\x7a\x2a\x49"
- "\x96\x83\x28\x71\xf9\x53\xa6\xe8\xfc\x7f\x2a\x82\xff\x90\x5f\x52"
- "\xc6\x3c\xbc\x7c\x38\x9c\x59\x0d\x47\x6b\xf5\x09\x96\x64\x24\x0a"
- "\x6c\x6d\x24\xce\x18\x70\x47\xfb\xc9\x1e\xed\x2d\x88\x2a\x7b\x4f"
- "\x75\x0a\x7d\x9c\x9f\x19\xae\x8f\xf3\x21\x5c\x1f\x91\xd6\x61\xe5"
- "\xe6\x1b\xc3\xf3\xf3\x3c\xdf\x9c\x8d\x9d\x5f\x13\x21\x03\x1f\x9e"
- "\x85\x05\xc3\x84\x0c\x2c\x58\x1e\xd1\x8e\x03\xd1\x65\x60\xbe\x03"
- "\xfb\xff\x61\x74\x19\x98\x7f\x26\xb6\x0c\xcc\xa7\x35\xc4\x1f\xaa"
- "\xe5\x76\x7e\x59\xe6\xd0\x70\x98\x05\x29\xd1\x6d\xde\x82\xf4\xe8"
- "\xf3\x3a\x0b\x72\x04\x8d\x17\x6c\x0d\xa7\xf1\x82\xc2\x70\x1a\x62"
- "\x5f\xfe\x71\x1a\xf6\x9d\x1b\xd6\x6d\x5f\x10\xa9\xff\xce\xb3\xf0"
- "\xb4\xac\xff\xcf\xcc\x8d\x68\xa3\x1c\xff\x44\x9b\xcb\x7a\x3a\x09"
- "\x69\xe9\x8c\x4e\xcb\xa7\x4d\xd1\xfb\xfc\x74\x26\x8e\x41\xce\x60"
- "\x3f\x5d\x7a\x3a\x1f\xd3\xe7\xf3\x6f\x44\x5e\x06\x5a\xd3\xdf\x36"
- "\xdf\x0f\x3a\x3e\x5e\xf5\x8d\x4b\x4f\x97\xd1\x1c\x39\x9f\x63\x46"
- "\xf9\xd5\xa7\x40\x1e\x8d\x41\xd4\xae\x25\x65\x91\xef\x44\x9f\xe6"
- "\xf3\x1f\xb4\x8e\x85\xf6\xd5\xe8\x4b\x21\xcf\xe9\xf5\x83\x22\xef"
- "\x04\x1f\x81\xbb\x8d\xf4\x82\xe0\x15\x58\x31\xd7\x69\x8b\xb0\x4d"
- "\xcf\x40\x74\x1e\x3f\x93\x1c\x5b\x76\x9e\x49\x17\x7c\x7e\xc6\x1c"
- "\xce\xe7\x67\x72\x82\xf6\xe1\x0b\xa8\xaf\x28\x03\x83\xd2\x13\x7a"
- "\x77\x1a\xd3\xde\x6f\x59\xd8\x66\x29\x87\xdb\xce\xc1\x33\xfc\x5b"
- "\xa8\x3b\x25\xe6\xd3\x57\x68\xa0\x89\xdb\x80\x67\xc7\xf0\x76\x22"
- "\xcc\x12\x3f\x48\x6c\xcb\x2b\x6d\x94\xd7\x60\x67\x3e\xfe\x0d\x4c"
- "\x3b\x3b\x49\xe7\xfd\xa0\x2c\xdc\xd0\x0e\xcf\xfc\x35\xac\x3c\x8e"
- "\x7a\x4e\x81\x23\x55\xcc\xef\x3f\x6b\x54\xe6\xe1\x63\xcd\xef\x23"
- "\x4c\x96\xb2\xee\x57\xbc\x0b\x7b\x76\x6a\xcc\x71\x19\xdb\x44\x7b"
- "\xc7\xa9\x4d\x57\xb6\x03\xcf\xd6\x29\xf2\x2b\xde\xcd\x3d\x7b\x20"
- "\xb4\xb7\xe5\xd9\xc3\x98\xb7\xe8\x0a\xf3\xb9\x2a\x3d\x78\xd6\xa5"
- "\xc6\x23\xce\xce\x7b\xd6\xab\xec\x4f\xe9\xb6\xe7\xc3\x55\x70\xc9"
- "\xed\xc9\x37\x85\xb7\x27\x7f\x2a\xfa\x96\x8b\x64\x1c\x59\x57\xc1"
- "\x31\xd2\xb9\x7f\x1a\x8c\x0f\x42\xdc\x39\x78\xfe\x8d\x5a\x5a\xa3"
- "\x53\xdf\x09\x49\x7e\xd0\x8a\xd8\x2e\x7f\x37\xed\x0d\xa1\xd8\xd0"
- "\xe9\x9f\xe1\xa0\x77\x70\x7c\x0d\x41\xf2\x0c\x47\x4b\x69\x40\x3e"
- "\xdb\x2c\xff\xc7\x44\xd3\x16\xf3\x45\x47\xfd\x2e\xd6\xb9\x97\x9f"
- "\x69\x95\x1f\x16\xff\x55\xd3\xfa\x1f\x5a\x87\x51\x0e\x33\xce\xc2"
- "\x73\x33\x85\xae\x3f\x1f\xe1\x93\xe6\xc7\x88\xff\xf2\x29\xfe\x9b"
- "\x11\x5d\xcf\x9f\xbb\x42\xfc\xf7\x1c\xc5\x7f\x33\xd4\xe3\xa6\x78"
- "\xcf\xf3\x5c\x96\xda\x27\xa5\x73\xa7\x8c\x2f\x91\x9f\xf9\xdc\x2f"
- "\xef\xab\x05\x83\x9f\xde\x69\xa3\x6e\x3a\x3b\x9b\x48\x5f\x0d\x2d"
- "\x9e\x23\x74\x0e\x83\x8e\xbe\xdd\x2d\xc6\x32\xd2\xd7\xe7\xf8\x7c"
- "\xa1\xde\x2f\x74\xd1\x5a\xca\x3c\x63\x3b\x50\x86\x56\x9b\x15\x5c"
- "\x25\x9b\xcd\x62\xdf\xc7\xf0\x0e\x18\xea\xec\xe4\xe3\xa2\x86\xfc"
- "\x55\xee\xb7\xfa\x2f\x01\xe1\x3d\x56\xd6\x02\x84\x37\xd8\x37\x4e"
- "\x72\xdc\x1d\xa4\xe3\x84\x93\x70\xb7\x22\x1c\xe1\x25\x38\xa5\x1f"
- "\x62\x6f\xcc\xf3\x49\xea\xbe\xf3\xf9\x17\xac\x1b\xd3\xe7\xd0\xbc"
- "\x8a\x93\xca\x59\x17\xb2\xf1\x1d\xf4\xce\xec\xa2\x83\x59\x5f\x61"
- "\xe3\x8b\x69\x4e\xec\xf9\xdd\x54\xee\xfd\x3f\xb9\xe2\x4b\x46\x83"
- "\x4e\x4e\x5b\xd0\x64\xf4\xa1\xbc\x3d\x5f\x17\x6e\x23\x9e\x8f\xf0"
- "\x7f\xf3\x79\x9c\x89\xd7\x22\x5a\x9f\x28\xaf\x5f\x25\x7b\xc0\x9c"
- "\xfe\x6e\x2e\x1f\x57\x5a\x53\x41\xef\xa4\x69\x4d\x94\x38\x57\xed"
- "\x79\x57\xc4\xdc\x9b\x67\x07\x5f\x57\xf3\x47\xac\x77\xe1\x4a\x21"
- "\x23\x8b\x56\x86\xf3\x74\x21\x58\xcf\xd3\xbb\x20\x31\x1e\x2c\xf6"
- "\x47\xda\xc7\x85\x46\xc5\x77\x8b\x48\x9f\xaa\x8c\x07\xc6\x55\x1c"
- "\x6f\xc4\x38\xb3\x90\xfb\xff\x81\x7e\xe3\xc2\x42\x0b\xf6\x2f\x4c"
- "\x26\x5b\xb9\x0c\x2d\xac\x6c\xf1\xa2\xdc\x14\x93\xfc\x2f\xa2\xb5"
- "\x2f\x15\xb4\xe7\x10\x9f\x87\x5e\x80\x85\x47\x02\x76\xd0\xb5\x78"
- "\xf8\x9e\x2a\x03\xca\x08\x97\x5b\x1a\x37\x26\x88\xf5\x48\xde\x88"
- "\x3a\x4e\x29\x34\x27\x98\xd6\xe2\x3f\x82\x58\x4f\x41\xb2\xb0\xf0"
- "\x00\xad\xcd\x18\xee\x86\xa1\x84\x4b\x91\x21\xa7\xbf\x0d\x5a\xfd"
- "\x91\x31\xcf\xa2\x94\xe8\x7d\x5f\x44\xe3\xff\x9b\x2e\x58\x54\x1d"
- "\xce\xdb\x45\x7c\xfc\x57\xde\xeb\xb8\x90\x06\x11\xe5\x8a\xc2\x79"
- "\xbf\x90\xd7\x17\x73\x8d\x4f\xe5\xef\xd3\x31\x9e\x59\xe2\xe5\xeb"
- "\xbd\x16\xa1\xfe\x3f\x7f\xf4\x4a\x76\x90\xe9\x7e\x9f\x1e\x44\x58"
- "\x79\x5d\x30\xda\xad\x45\x9e\xb0\x39\xa3\x51\x7c\xce\x68\xc9\x59"
- "\x78\x41\x7e\xf7\xb3\xf8\xfe\xf0\xf6\xbd\x90\x14\xdb\x37\x78\x81"
- "\xde\xff\x2c\x89\x6e\x33\x5e\xc8\x8a\xee\x1b\xbc\xb0\x48\xb6\x0b"
- "\x4b\x58\x42\xa4\x1c\xbc\x50\x8a\x3c\xe6\x65\x94\x18\x96\xe6\x42"
- "\x63\xc7\xb0\x2f\x1c\xe8\x8b\x61\x8b\xc9\x1e\xbc\x50\xd3\x17\xc3"
- "\x7a\xa2\xc5\xb0\xae\x28\xfc\x7c\xc1\x1d\x9d\x9f\x8b\xb5\xd1\x63"
- "\xd8\xc5\x29\x62\x9c\x5f\x9c\x17\xce\xe7\xc5\xe9\xa1\x77\xc2\x2f"
- "\x24\x7d\x73\xfe\xf0\xe2\xc6\xfe\xfe\xf0\x92\x5b\x05\xaf\x96\xbc"
- "\x10\xd1\xb6\x23\xd1\x6d\xfb\xe2\x93\xb1\xfd\xe1\xc5\xee\xd8\xb6"
- "\x7d\x89\xae\xbf\x3f\x6c\x1c\x12\x01\x33\xb6\xcf\x57\x0a\xf3\xcd"
- "\x96\x64\x09\x3a\x2d\x21\x7f\x2e\x4e\x05\xbf\x28\x5c\xde\xb1\xcd"
- "\x88\x0f\x6d\xdb\x39\xb2\x69\x8a\xcc\xc4\xa2\x09\x9d\xbd\x74\x67"
- "\x2d\x24\xa0\x0e\x7c\xd8\x6d\x5f\xd2\x27\xff\xb4\x8e\x8f\xea\x21"
- "\x1b\x19\x73\x3d\x9d\xa4\xb4\x8f\xb7\xa3\xe3\x4a\xef\x4b\xe3\x92"
- "\x21\xef\xad\x7e\xf4\x28\xe0\xfe\x1f\xe1\xb8\x32\xcf\x0a\x16\x44"
- "\xe8\x98\x57\xac\xc3\x5d\x3a\x5a\xf0\x6d\x69\x44\x2c\x5b\x60\xe1"
- "\x7b\xfa\x62\xda\xdb\x82\x9a\xe8\x32\x5a\x70\xa0\xcf\xde\x16\x13"
- "\xde\x82\x2f\x22\xf2\x9b\x05\x0f\x96\x1a\x83\x09\xea\xb9\xee\x02"
- "\x57\xb8\x4d\x2a\x68\x0e\x2f\xb7\x34\x22\xfe\x2b\xb0\x50\xfe\xc0"
- "\xc6\x9b\xa5\x79\xb1\xc7\x9b\xa5\x9f\x89\xfe\x2f\x8b\x78\xbf\xbc"
- "\xd4\x72\xe5\xf1\x66\x69\x8c\xfe\x2f\x3d\x10\x3e\xde\x2c\x8b\x78"
- "\x47\xbf\xb4\x39\xfa\x78\xb3\xd4\xa5\xd8\x19\x61\x37\x96\x3d\x38"
- "\x30\x7b\xb3\x2c\x39\xdc\xde\x2c\x83\xab\xd9\x9b\x63\xfd\xec\xcd"
- "\xb2\x45\xfa\xfa\x68\x7d\x59\x56\x12\xdd\xde\x2c\xab\x16\x3c\x5c"
- "\xd6\x11\x6e\x6f\x96\xed\x0f\xe7\xe1\xd2\x08\x1e\x2e\x8b\x78\xff"
- "\xbd\xd4\x72\xad\x36\x29\x2e\x2e\x4e\x8a\xd3\x48\x9a\x38\xa0\x8f"
- "\x50\x69\x60\x68\x9c\x36\x2e\x1e\x7f\x43\xe4\xeb\x50\x29\x4e\xd2"
- "\xe2\x2f\x5e\xbe\x0e\x89\x78\x1e\x4a\x65\xf1\xa7\x95\xaf\xf1\x11"
- "\xcf\x43\xae\x92\x3f\x54\xae\x57\xa9\x5f\x1b\xf1\x1c\x7f\x95\xfc"
- "\x21\xff\x60\x79\xe8\xf7\x1c\xbe\x0f\x72\xce\xaa\x75\x4b\x8b\x56"
- "\x14\xf2\x75\xed\xcb\x8d\x4b\x5f\x7c\x71\xf9\x9a\x35\xc6\x92\xd5"
- "\xc6\x47\x66\x3e\x35\x69\x9a\x51\x2c\x8f\x2f\x9a\x3e\xa6\x30\x11"
- "\xe6\xae\x2f\xa6\x8c\xb9\xf3\xe7\xe4\x1b\xf3\x1e\x99\x19\x9e\xa9"
- "\xa0\xe1\xcb\xe0\xaf\x84\x45\xa5\x7b\x99\xdb\x46\x01\x54\xef\xe2"
- "\x76\xa7\x83\xf6\x9e\x8b\x78\x62\xc5\xcc\x13\xb4\x7f\xb9\xc7\xca"
- "\x68\x5f\x45\x3b\x14\x7e\x49\x9d\x18\xd7\x68\x03\xcb\x32\x3a\x4f"
- "\x65\xb9\x86\xfd\xca\x03\xc6\xc7\x41\x6a\x87\x55\x4f\x36\x65\x23"
- "\x2c\x3e\x3b\x5d\x7e\x30\x5a\xc9\xb7\x35\xff\x1d\xf3\x34\xec\xe1"
- "\x20\xa6\x79\xe5\xfd\xf9\x66\x0d\x4f\xfb\x95\x4d\x81\xd3\x9f\x85"
- "\xe5\x3f\x62\xbf\x62\xfc\x99\xce\xac\x11\x70\xcb\x37\x30\xa9\x70"
- "\x2a\xd9\x85\xfa\x11\xa0\xa5\x75\xd9\xbb\x47\x80\x6e\xf7\x28\x3a"
- "\xcb\x76\x79\x91\xb2\x2e\x7b\x1b\x3e\xbb\x60\x55\x1e\xd5\x4d\xb0"
- "\x41\xa9\x70\x19\xc1\xef\x0b\x87\xaf\x0f\xad\xe3\x5e\x5e\x24\x21"
- "\x5c\xee\x17\xa0\xd7\x07\xd8\xdf\x7d\x89\x2d\xe6\xf1\xd9\xe8\xa7"
- "\x21\x2b\x4e\xf8\x6d\x20\xf6\x46\x2d\xff\x72\x43\x80\xf9\xe9\xcc"
- "\x84\xb9\x6e\x2b\xdb\xb9\x12\xb4\xa8\xcf\x1a\x47\x31\xed\xa5\x58"
- "\x7e\xa2\x61\x39\x68\xb1\xff\x29\xe7\xe0\x25\xbf\x71\x1e\xfa\x8d"
- "\x73\x41\xfb\xdb\x52\xda\xef\xda\x66\xdf\xf1\x9f\xa0\xfd\xb7\x1e"
- "\x9b\xd4\xc3\x92\xa1\xac\x84\x75\x32\x3a\xdf\xda\xcb\x7c\xb4\xde"
- "\xf6\x44\x41\x80\x60\x8a\xbb\xad\xc9\xd0\x5a\xe2\x85\xcd\x67\x98"
- "\xaf\xf2\x3f\xc5\x79\x15\x2d\x6e\x2f\xed\x9f\xd5\x6d\x9e\x0b\x71"
- "\x67\xf3\x41\x6a\x31\xd7\x81\x73\x91\x17\xca\xce\xb0\xce\x13\x05"
- "\x5f\x42\xab\xf9\x10\x2c\x69\x03\xe9\x44\xc7\x67\xc0\xcf\x68\xde"
- "\xa1\x77\x95\x5f\x82\xe4\xcd\x2b\x28\xed\x12\x6c\xdc\x0c\xc3\x36"
- "\x9e\xa6\x38\xa8\x0d\xeb\x39\x0f\xcf\x9f\x02\x0d\xe2\x93\x36\x7d"
- "\x06\xc9\x9b\x9e\xa3\x7d\xe6\x99\x50\x5f\x0e\xc9\xcc\x6a\x4a\xea"
- "\xb1\x9a\x0c\x3d\xcc\x34\xa2\xdb\x6a\x1a\xd9\x6a\x41\xf8\x8e\x0f"
- "\x60\x78\x1b\x8c\xfc\xd5\xb9\x36\xa9\xee\x2b\x48\xa1\x3e\x9d\xc5"
- "\xbe\xd5\x7f\x85\xf0\x55\x5f\xd6\x04\xb1\xac\xba\x8c\x3f\xe1\xcb"
- "\x03\xce\x7c\x1f\x04\x11\x57\x5d\x0f\xa4\xd4\xf7\x40\x72\x70\xdb"
- "\x97\x35\x54\xce\x0d\xdf\xbb\xec\x3c\x01\x50\xb6\x99\x05\x7a\xab"
- "\x4e\x9b\xd1\x1e\x0e\x7d\x7f\xd9\x11\xad\xf3\x84\x1b\x5a\xbc\x3d"
- "\xd0\x0a\x7f\x04\x67\xe9\x5f\x1c\xff\xb6\xec\x48\x3c\xfa\x93\x1a"
- "\xc7\x46\x5a\x03\x2f\x64\xc7\xda\x42\xe7\xe7\xd9\x60\x67\x39\x24"
- "\x59\x36\xc2\xd0\x73\x98\xce\x6d\x4f\x65\xb3\xc5\xe9\xff\x8b\x63"
- "\x23\xdf\x0f\xbe\x2a\xaf\xbc\x05\xe2\x5a\xbd\x75\xb4\xef\x58\x0a"
- "\x0c\xd7\xbb\x9c\xde\x93\xe0\xb4\x7c\xee\x08\x26\xe9\x9b\xab\x83"
- "\xa0\xfb\xe9\xd7\x27\x25\xa7\xf6\x6b\x70\xe6\x7b\xe1\x43\xac\x9b"
- "\xed\xd0\xbb\xd1\x66\x65\xb6\x7a\x7d\x74\xfe\x4e\x1a\xeb\x4a\x4e"
- "\xdc\x59\x0c\x63\xf7\x7d\x05\xa9\x7b\xbf\x02\x13\xeb\x36\x49\xb4"
- "\xc7\x9b\xce\x4b\xdb\x8b\xd7\x24\x8c\xc1\xb0\xef\x7c\xaf\x37\x1b"
- "\x26\xef\xf5\xee\x35\x41\x43\x4f\x68\xaf\x77\x4f\x57\x68\xaf\x37"
- "\xca\x94\x85\xf6\x7b\xbb\xe0\x7b\x5a\xfd\x09\x18\xda\x0e\xcb\x4d"
- "\x24\xdf\x3b\x2f\x80\x76\xcb\x05\x80\xf1\x36\x89\xe2\x4c\x2d\xca"
- "\xfe\x97\x4e\xe4\x0d\xdd\xb7\x83\xb9\x1e\xaf\x49\xf8\xc3\x78\xce"
- "\xcc\xcf\xaa\xe8\x90\xe5\x18\xd3\x24\x4c\x7b\x0d\xaf\x71\x78\xdd"
- "\x6c\xad\x67\x1e\x56\xf9\x07\x3a\x83\x26\x91\xe4\x59\xec\x2f\xff"
- "\x43\x66\xb7\xdd\x5c\xe2\x82\x37\xca\x14\xb9\x16\xf6\x7d\xb9\xe5"
- "\xc3\xf6\xf3\x74\x8e\xba\x87\xb7\xab\xd7\xac\xa1\x33\xd5\xe5\x74"
- "\x6a\xc3\x67\x54\x2f\xd6\xef\xc0\xab\x5e\xc4\xa0\xe6\x05\x4a\xd9"
- "\xae\x5e\x33\xd5\x79\x1a\xd3\x99\x92\x8e\xfd\xd6\x52\xde\xff\x68"
- "\x3f\x2f\x09\x18\x93\x84\x38\x7d\x32\x7e\xd4\xfd\xe5\x23\x49\xc7"
- "\xbb\x24\x3d\x3b\x56\x90\x0e\xf5\xbb\xd8\x89\xbd\xbb\x58\x93\xd0"
- "\xbd\x15\xc9\x2e\x78\xd3\x41\x6d\xc4\x31\xbc\xa9\x1a\xf3\x8e\x19"
- "\x01\x88\x2e\x4d\x85\xb4\xbe\x74\xc5\x54\x17\x5c\x97\xaa\xee\x03"
- "\xb3\xbf\x98\x4c\xe3\xe8\xcf\xca\x9b\xe3\xd1\x06\x24\xb7\x76\xb8"
- "\xe1\xdf\x7a\x3a\xe3\xad\x9f\x80\xe4\xf4\xb7\xc3\x84\x91\x90\x4c"
- "\x73\x32\x0d\xbb\x98\x0b\xaf\x9d\xf8\x73\xa3\xbc\xdc\x7a\x0e\x56"
- "\xbc\x76\xdf\x48\x18\xf9\x69\x29\xc8\xf6\x69\xc5\x5e\x95\x7d\x1a"
- "\xd3\xe2\x3a\xa2\xb2\x4d\x2b\x4f\xf7\xb7\x4d\x45\xbf\x13\xb6\x09"
- "\x75\x9f\xdb\xa2\x80\x4b\x4e\xff\x20\x22\x5d\xde\xbf\x52\xf4\x5e"
- "\x44\xba\x4f\x4e\xdf\x1e\x91\x2e\xef\x47\x7f\xa5\x45\xb1\x7d\xad"
- "\xd4\x8e\xf5\x64\xfb\x5e\xf9\x77\xb2\x7d\xad\x05\xb2\xed\xe3\xf6"
- "\xe7\x95\xb7\xd9\xbf\xa2\x2d\x5a\x47\xf6\xe6\x95\x95\xd4\x7e\xf6"
- "\x2b\x50\xda\x9e\x80\x69\xe3\x28\xad\xe6\x8f\xa0\xc5\x9f\x62\xf7"
- "\xac\x64\xf7\xc8\xe6\x91\xed\xdb\x33\x8a\xb5\xed\xd9\xc5\x4e\xd5"
- "\xf3\x73\xa1\x5f\xee\xb3\x7f\x3f\xc0\xb4\x6a\x4c\xfb\x01\xe6\x93"
- "\x1d\x24\x9a\xb4\xe4\x1f\xa1\xb9\x81\x0e\x94\x67\x5b\x50\x4a\x83"
- "\x1d\xc8\x6f\x3a\xff\x6a\x2b\xd2\x57\xaf\x01\x8b\xb3\xc4\xcb\xf7"
- "\xa1\xd0\x19\xe4\xad\x25\x1d\xa4\x77\xa3\xb6\x04\x69\x9e\xe2\x4b"
- "\x28\xf7\xb2\x73\xb4\x57\x85\xda\xb0\x64\xc3\xe3\x74\x96\xb6\xa6"
- "\xc9\x0c\x40\xe7\x12\x90\xcd\xc6\xb6\x68\x6b\xb0\x4d\xe2\xfc\xdf"
- "\x57\x52\xd1\x93\xc9\x16\xbc\x5e\x95\x47\xe7\xf5\xb7\xc3\xcb\x66"
- "\x66\x47\xfb\x88\x7d\xd3\x07\x6c\x40\x67\xb3\xa0\x8e\xd1\x79\x5a"
- "\xe6\x3d\x52\xd0\x5c\xa3\x9c\xcf\x42\xdf\x6e\x40\x18\x67\x9b\x0f"
- "\xa8\xcd\x2e\x78\xf9\x70\x4b\xd9\x11\x2a\x9f\x4f\xb4\x61\x76\xab"
- "\x82\x43\xc3\x71\x48\x7c\xee\xd6\xec\x82\x57\xb2\x79\xf9\xc4\xd3"
- "\xe6\x96\x45\x1e\x20\xbb\xef\xec\x44\x1c\x65\xed\x02\x07\xe2\x62"
- "\x38\x06\x84\xe5\xc9\xf8\x87\x6d\x66\x7f\x47\xfc\xa9\xc4\x2f\x3a"
- "\xa7\x8b\xd6\x29\x21\x5d\x92\xe8\xac\x06\xe1\x87\xbe\xfc\xd3\x86"
- "\x3f\x02\xc8\x67\x8d\xa1\xbc\xbd\x7c\x90\xce\xf2\xa2\xf3\xc5\xae"
- "\x74\xb6\x18\xd2\x28\x55\x39\x5f\x2c\xb8\xfe\x9b\x3d\x5b\x0c\x71"
- "\x27\xef\x93\xd8\x21\x6c\xff\x41\x3a\x5f\x0c\xdb\x9f\x44\x72\x28"
- "\xf7\xe9\xd0\xdb\xcf\x13\xcd\x57\x78\x29\x6d\xa7\x9d\x35\x2b\xfc"
- "\xa7\xfe\x52\x5f\x30\xaf\x4d\xf8\x87\xec\xa4\x0b\x8a\x0e\x51\x3e"
- "\xa6\x35\x11\xfc\x04\xb4\x63\x4e\x1c\xc3\xde\x6f\x0f\x48\x3b\x37"
- "\x82\x56\xd8\xb4\x95\x9f\x50\x79\x61\xd3\x56\xda\x42\x36\x6d\xe5"
- "\x5a\x61\xd3\x04\x8d\x85\x4d\x5b\xb9\x42\xd8\xb4\x95\x4b\xf9\x7a"
- "\x22\xb4\x69\x94\x47\x76\x4d\xb1\x69\x7b\x47\xb1\x66\xb2\x1d\xdd"
- "\xf6\x95\x79\x8a\x6d\xdb\x8e\x69\x64\x3b\xa8\x8d\xc2\x4e\xbd\x72"
- "\x80\xfd\x2f\x13\x88\xf5\x9a\x74\x6f\xa6\xf3\x33\x3a\xe5\x7b\xe4"
- "\xcb\xca\x5f\x0b\x1b\xb7\x72\x7f\xc8\xc6\xad\x34\x85\xca\x92\x8d"
- "\x5b\xf9\x4b\x61\xe3\x44\x7a\xc3\xf3\x64\xe3\x5e\x39\x40\x34\x90"
- "\xf1\x4b\xf4\x1e\x4d\x86\x47\x3a\xae\x38\xa4\xb6\x71\xe1\xfa\xb5"
- "\xd2\xaf\xd8\x38\xb2\x6d\xdd\xf6\x55\x49\x2e\x48\xe4\xe7\xa3\x90"
- "\x9e\xd5\x22\xcd\x15\xbd\x23\x1e\x50\x9f\xe9\x5c\x7e\xa2\xdb\xac"
- "\xf3\x30\x54\x3e\xb7\x46\xee\xf7\xaa\x6c\x65\x8f\xa6\x0b\x56\xf6"
- "\x3f\xd3\x0c\x42\xe7\x92\x21\xaf\x6f\xa7\xf3\x1c\x9d\xb6\x76\x70"
- "\xd6\x31\x5b\xab\xff\x0c\x04\xb7\xbc\xf2\x05\xf1\x15\xe3\x8d\x87"
- "\xe8\x4a\x76\x07\xc7\xd1\x6d\x4b\xbc\x7c\xfe\xfe\x8b\x9d\x12\xe6"
- "\x95\x86\xe5\xfd\x88\xea\xa0\x79\x45\xbc\xb7\xc4\x9a\x47\x18\x44"
- "\x5d\x97\x62\xd7\xb5\xfa\x7a\x5e\x17\xfa\x52\x18\xf7\x5c\x7f\x01"
- "\x56\xf1\x77\x68\xfc\x4c\xe6\xa8\xb8\x56\xcf\x94\xf3\xe3\x62\xe4"
- "\x2f\xbd\x4a\xf9\x8a\xab\x94\x7f\x8f\x6c\x10\xed\xc7\x0b\xd8\xc3"
- "\xf1\x0c\xf7\x2b\x70\xe7\x08\xee\x13\xf9\x3d\xc8\x17\xd6\xd1\x3c"
- "\x2e\x4b\x56\x70\x92\xdc\xed\x40\x38\x7e\x7e\x2d\xda\xc8\xac\x0d"
- "\x40\x67\x07\xab\xca\x5a\xe2\x43\xf4\x5d\x7d\xe4\x0a\xf3\x34\x49"
- "\xce\x3a\xe0\xdf\x7e\x39\x86\xbe\x28\xed\xa5\xa9\xed\x7b\xf7\x60"
- "\x59\x84\xf6\x52\x39\x9f\x9f\xf6\xed\x92\x3f\x73\x3b\x9d\xb1\x49"
- "\x7e\xa5\xbc\xd7\xe2\x26\xb4\xcb\x23\xe8\x1c\x16\x9a\xaf\x5e\x12"
- "\xc8\x93\x8e\xf1\x33\xf1\x2d\x75\x4a\xd9\x58\x73\x7b\x54\xaf\x5c"
- "\x27\xdf\x87\x84\x65\x4e\x28\x65\x08\x37\xed\xbd\xc1\xf1\xf8\x76"
- "\x7e\xbe\x99\xdf\x4d\x36\xf0\x26\xf4\x41\x47\x88\x7a\x0a\x40\xd4"
- "\xf3\x2a\xea\xcd\xaa\x13\x57\xda\xe7\x14\xbb\x7f\xaf\x66\x0c\xbe"
- "\x7f\x20\xf7\xef\xd5\xd2\xab\xf4\xef\x4a\xf5\x1e\x1e\x7c\xbd\x06"
- "\xa5\x5e\xcf\xe0\xe9\x5a\x9c\x3a\x70\xba\xa6\xc9\x74\x2d\xce\xbf"
- "\x0a\x5d\xa3\xd5\x53\x3d\xf0\x7a\x8c\x4a\x3d\x8e\x68\xf5\x00\xff"
- "\x8b\x79\x5e\x8f\x4e\xf9\xf6\x0a\x7d\x87\x48\x7c\x13\x61\x8d\x4e"
- "\xfd\x8d\x29\xf1\x7d\xa2\x35\x29\xca\x37\xa6\x42\xfb\xb8\xd6\x3c"
- "\xb8\xa4\x91\xc6\x75\x16\x74\xc1\x9a\x0c\x9a\x6b\xcb\xda\x2c\xce"
- "\x07\x94\xcb\xe4\x5d\xe5\xdb\x56\x74\x46\x4e\x29\xd5\xcd\x18\x3f"
- "\x8b\xc5\x2b\xce\xd9\x5b\xf3\x06\xed\xc9\x13\x6b\x76\xd6\x38\x84"
- "\xfe\xaf\xa9\x77\x41\xb1\x38\x73\xaa\xea\xf4\xa6\x2e\xab\x0c\x7f"
- "\x0b\x8d\x49\x7d\x30\x0e\x05\x26\xea\x9c\x5f\x55\x87\x6d\x7f\x79"
- "\x5a\xd8\xfe\xc1\xd9\xc5\xc5\xab\x8b\xa7\x19\xd7\xac\x5c\x36\x6e"
- "\x4d\xc9\xd2\x92\xb5\x6b\xf8\x46\xf3\x44\xc0\x04\x63\xc9\x8a\x95"
- "\xcb\x57\xaf\x2d\x31\xad\x5f\xba\x42\x6c\x4c\xbf\x07\x01\xd5\x40"
- "\x10\xf6\x3d\x92\x64\xb4\x21\x27\x99\xc4\xcf\x90\x70\x53\x9f\xe8"
- "\x2c\x11\x65\xdf\x6d\x53\x32\x80\xd7\x4e\x36\xa7\xa4\xd0\x05\xf9"
- "\x79\x0a\x1d\xe9\x7c\x43\xf4\x3b\x92\xcf\x41\x49\x05\xf1\x3e\x17"
- "\x5d\xc8\x06\x71\x2e\x04\xdf\xdb\xef\x2c\xc1\x84\x56\xd0\x39\xd6"
- "\xd1\x3c\x6a\x89\x2f\x68\x5f\xd3\xc9\xcf\x6b\xdc\x78\x0e\x9f\xd7"
- "\xde\xaa\x8c\xf3\xf4\x5e\x48\xbc\xc7\xbd\x7d\x46\x3b\x94\xcc\xa5"
- "\x7a\x49\x6f\xf6\xbd\x09\x5a\xc2\xc5\xec\x25\xb4\x27\x1a\xf0\x59"
- "\x87\x6d\xe8\x54\x7c\x49\x6c\x6f\x12\x4b\xe8\xb0\xb8\x60\x6d\xca"
- "\x6f\x0c\x1e\x90\xf7\x6a\xeb\xf6\x89\x7d\xd9\xda\x6e\xfb\xda\x91"
- "\x7d\xb0\x76\x3a\xb7\xb8\xc3\x42\xdf\x2d\x8b\x4a\xdf\xc4\xf6\xcc"
- "\x60\x6f\x7e\xbc\xba\xcf\x18\x17\x23\x7f\xd6\xb6\x60\xdf\x47\x12"
- "\xaf\xe5\xf3\x44\x86\x60\xda\x2f\xc4\xd9\xc9\xed\x99\x98\x36\x04"
- "\xaf\xf9\xc4\x53\x3a\xc3\x00\xf3\x2a\xe9\x1d\x57\x6b\xd9\x45\xc7"
- "\xb1\xe4\x76\x94\xeb\xb5\x68\xff\x16\x6f\x15\xfb\xce\x10\x1e\xeb"
- "\x70\xda\x7a\xa0\xc9\xc8\x1c\x34\xc7\x86\x6d\xef\x68\x32\x7a\x81"
- "\xc5\x2d\xfc\x82\xca\xa1\x5e\x24\x5b\x4b\xc9\x97\xc0\x74\xbe\xbf"
- "\x6e\x6d\x9b\x42\xf3\x12\x23\x3b\x4f\x30\xb1\xe6\x85\x69\xbc\xdb"
- "\xc9\xc7\x82\xaf\x80\xd6\x50\x75\xc0\x5a\x7f\xa4\xbd\x1f\x53\x38"
- "\xcd\x58\xb8\xb4\xc4\x58\xb4\x62\xd5\x72\x63\xe1\x8a\x42\xe3\xaa"
- "\xd5\x25\xc6\xef\xad\xa6\x09\x1a\x9a\x92\x09\x93\x89\x20\xf5\x6f"
- "\x7d\x7e\xbc\xf2\x0e\xba\x6b\xbd\x79\x08\xf6\x1f\x69\xb2\xfe\xe9"
- "\xae\x6e\xf3\xd0\x70\x9a\xac\x7f\x50\xc8\xf1\xba\x4a\x6c\xfb\x58"
- "\xb1\x7f\x2f\xae\x13\x9f\xb1\xff\x6b\x3d\xe1\xba\xb7\xfe\x35\x19"
- "\xf6\xb0\x02\xcb\xe5\xe2\x8e\x73\x7d\x79\x3b\x65\x79\x6c\x10\xfb"
- "\x8c\x79\x9c\xdb\xc0\xd7\xe0\xaf\xeb\x8c\x59\x86\xce\xea\xda\x08"
- "\x2f\x5e\x80\x75\xbf\x63\xf6\x75\x29\xb2\x0c\xe9\x82\x95\xed\x79"
- "\xb2\xfc\xa0\x4c\xac\x37\xf5\x97\x9f\xf5\x5b\x49\x7e\x58\x77\xbe"
- "\x8e\xaf\xd7\xf0\xfb\xd0\x4e\xe1\x33\x8e\xaf\x2e\x58\x57\x4d\xfd"
- "\xf0\xae\xcf\xd7\x59\x77\xf3\xf3\xf3\xfe\x4a\xef\x3e\xe9\x9b\x2f"
- "\x28\x2b\x09\x28\x1b\xc8\xa3\xf5\x65\x0a\x8f\x14\xf8\xe8\x3a\xcc"
- "\xe5\x25\x5c\xc6\x04\x3d\x4f\x73\x19\xc3\xf1\x1d\xdb\x24\x29\xe7"
- "\xf4\xd1\x18\x80\x6d\x73\x97\x6c\x66\x0c\xeb\x70\xa9\xe4\xe0\x42"
- "\x34\x39\x40\xde\xbe\x58\xb4\xfa\xc5\x57\x50\xd1\x8b\x97\x97\xbc"
- "\x68\xa6\xb3\x29\xc8\x0e\xf0\x83\x2f\xc6\x14\x1a\xd7\xae\x59\xfe"
- "\x62\x22\x44\x83\xea\xcb\x54\xf3\xdf\x10\x44\x79\xed\xea\xca\x8f"
- "\xa7\x3d\x12\x62\x4f\xc4\x86\x1f\x75\xad\xc1\x58\x22\x8c\xef\x1b"
- "\x76\x3b\x93\xd3\xd0\x27\x4b\x03\xee\x43\x23\xcd\xc4\x7b\xfe\x0d"
- "\x9f\x11\x1d\xba\x24\x0d\x8e\x07\xa5\xf5\x8a\x0c\xe0\xfd\x01\xec"
- "\x53\x4d\x68\x8d\xc5\x86\x33\x5d\x52\xfc\x19\xb2\x3f\x62\x3d\xc7"
- "\x39\xb4\x03\xfa\x86\x76\xd8\xc0\xe7\xa4\xf7\xf1\xf1\xa4\xf4\x8c"
- "\x52\x66\x47\xdf\x3e\xe5\x0d\x59\x8a\x9c\x84\xca\x94\xb6\x50\x1a"
- "\x3f\xab\xc8\xbe\xde\x47\x3c\x67\x82\xf7\x5a\x05\x0e\xe9\xca\x1a"
- "\xb8\x1d\xd9\x90\x16\x69\x1b\x7e\x63\xa0\x77\xda\xa2\x3d\x5c\xfe"
- "\x74\xed\x26\x7e\xee\x09\xfa\x6a\xd8\x9e\xe9\xf2\xfa\x92\x93\x7c"
- "\x4c\x2f\x45\x5c\x3e\x81\x8b\xd9\x4b\x6f\x53\xea\x62\x09\xed\xa6"
- "\x06\x2e\x67\x1b\x6a\x42\x73\x7e\x1b\x32\x28\xd6\x65\x5d\xf9\x43"
- "\x5c\x50\x5a\xc6\x65\x0b\xef\x4b\x6e\x16\x67\xb0\x91\xbc\x51\x3f"
- "\x49\xae\x42\x32\xb5\xe1\xa4\xc2\x6f\xea\x33\x96\xdb\x6a\xe4\xe7"
- "\xf4\x6e\xe8\x54\x68\x19\xeb\xac\x18\xae\xb7\x3a\x6c\x4b\xb7\xd0"
- "\x5d\x1e\xa7\x89\xf3\x81\x68\x9f\x4a\x1c\xb6\x31\xef\x2c\x6c\xbc"
- "\x4c\x6b\xef\xf5\x3e\x8a\x7b\xda\xf3\xe8\xec\x03\xb1\x97\x7c\x23"
- "\xfa\xff\xeb\x32\x42\x7b\xcb\x37\xe2\xf8\x5f\x9a\x21\x78\xb7\xb1"
- "\x50\xa5\x7b\x1e\xf9\x7d\xfe\x50\xa2\x11\xd9\x33\x67\xe9\x6c\xae"
- "\xaf\x62\xdf\xee\xc6\x1a\xa5\x1c\x3f\x27\xc0\x2f\xc6\xc4\x0b\xb0"
- "\xf1\x10\x8d\x11\xd4\x3e\x17\x6c\xa4\xf5\xd6\x7c\xdd\x13\x8d\xb9"
- "\x5c\x6e\x92\xe9\x1b\x26\x1b\x4f\x44\xb4\xe1\x8c\x82\x4b\xc6\xed"
- "\x56\x9e\xe9\xdc\x30\x17\x94\x95\x36\xa5\xa0\x4e\x79\x79\x1f\xae"
- "\x6b\x2a\x41\xdd\xf2\x12\xdc\xa6\x91\x0a\x0d\x31\xdd\x86\xcf\xe8"
- "\xff\x94\x98\xc4\x3b\x9d\x0e\x8b\xb0\x45\x65\x25\x74\x26\x95\xd5"
- "\x48\xe7\x0a\x66\x08\x7b\xc3\xcf\xc2\xe1\x79\x13\x65\x9d\x4d\xa0"
- "\x3d\x3e\x7c\x5d\x8b\xd7\xcf\x6d\x83\x38\x3b\x01\xf3\x51\x47\xba"
- "\xe9\xdb\x2c\xbd\xe6\x04\xd1\xb6\x4d\x95\x7d\x75\xa0\x4c\x34\xf1"
- "\x77\x88\x9b\x4a\xc5\x59\x24\x43\x31\x56\xdb\x74\x40\xe1\xdf\xd6"
- "\x5d\x98\x86\x38\xb1\x9c\xae\x89\x9f\xf5\xb5\xa9\x49\x69\xaf\x9c"
- "\x27\x71\x79\xe0\x34\xd8\xd4\xa7\xff\x5d\x23\x38\xac\x47\xa9\x87"
- "\xc3\x22\x1c\xc1\xd3\x37\x3b\xbb\xed\x65\x49\x7d\x78\xc4\x19\x28"
- "\x3a\xaa\xa7\xa9\x91\xe7\x99\x42\xb6\x6a\x23\x7f\x67\xca\xd7\x9d"
- "\x61\x3f\x3c\x9b\xcc\x09\x9c\x07\x46\xa0\xef\x7b\x68\x09\x9f\x90"
- "\xc5\xb2\x45\x4a\x99\x38\x0d\xd1\xb1\xac\x48\xa9\x5b\xc1\x41\xed"
- "\xbf\xa2\xcd\x13\x7d\xd1\x92\x8e\x10\x2c\xe1\xe5\x32\xb1\x91\x7c"
- "\xa6\xb2\x4b\x5c\x06\x79\x3f\xcb\x9a\xd5\xbc\x16\xbe\x58\xd9\x19"
- "\x95\x3c\x50\x7b\xfa\xf8\xef\x82\xcd\x29\x62\x2c\xd9\x0c\xaa\x36"
- "\x22\x4f\x36\x1b\xfa\xf8\x50\xc5\x79\x44\xdf\x59\x8a\xfa\x1d\x44"
- "\xae\x2b\x08\x13\xfc\xff\x89\x7b\x1f\xf8\x28\xab\x2b\x7f\xf8\xce"
- "\x64\x80\xc9\x30\xc9\x04\x8d\x38\x62\x94\x81\x46\x7f\xd1\x46\x8d"
- "\x7f\xba\x4b\xfb\x6a\x8d\x8a\xbb\xb8\x2f\x0a\x6b\xb1\x9b\xb6\xac"
- "\x01\x49\x68\xa8\x08\x63\x12\xc2\x80\x21\x93\x0c\x98\x86\x98\x7f"
- "\x2a\xda\x00\x21\xc4\x15\x35\xb6\x41\xe3\x96\xb6\xb1\x45\x1d\x4b"
- "\xb0\x41\x21\x13\x2d\xae\x89\x8d\x30\x84\x10\x02\x1b\x70\x20\x43"
- "\x32\x90\x99\xe7\xfe\xbe\xe7\xde\xe7\x99\x99\x60\x42\x4b\x77\xdf"
- "\xcf\x9b\xcf\x67\xf2\x3c\xcf\x7d\xee\x73\xff\x9c\x7b\xee\xb9\xe7"
- "\x9c\x7b\xee\x39\x5c\xb4\x93\xc6\x03\xb2\xd4\x2c\xd6\x0a\xba\x47"
- "\x73\x05\x30\x41\x1b\xd7\xbd\x44\x78\x85\x72\x73\x46\xe3\xe6\x3a"
- "\x47\x54\x7b\x75\x44\xd7\x91\x56\xa1\xe5\x41\xfb\x84\xcc\xa5\xc1"
- "\x13\xef\x1a\xc3\xe3\x78\x87\xc8\xdb\xa2\xb5\xf3\xaf\xac\x19\x2a"
- "\xac\xd6\x9d\x51\xeb\xf0\x69\x75\xe0\x1e\xf5\x14\x7e\x83\x57\x7d"
- "\x62\x4d\x7e\xb6\x74\x4e\x44\x8b\xfc\xe2\x25\x4f\x66\x67\xa5\xda"
- "\x16\x2f\x25\x37\x46\x79\xcb\xb3\xb3\xed\x62\x13\x66\x34\x1f\x98"
- "\x28\xea\x03\x1c\x24\x2f\xeb\x5c\xf3\xa2\xb4\x3f\xa1\x79\x41\xf3"
- "\xdd\x47\xf3\x7d\x4f\xe1\x59\x21\x9b\x78\x8a\xef\x60\x9e\x00\x2f"
- "\x26\xfe\x5d\xd0\x3e\xea\xbf\xd5\x2f\xd7\x01\x8c\x27\xad\x91\xc3"
- "\xae\xa2\xda\xd1\xf0\x2a\x6a\x1c\x3d\x97\x8b\x5a\xc6\xa6\x13\x45"
- "\x3f\x12\x74\xa2\x4c\xe2\x05\xd1\x27\xb2\xdd\xa7\x72\xf1\xcd\xc0"
- "\x45\x65\x06\x23\x34\xca\x69\xd4\x68\x94\x5c\x27\x9c\xa9\x58\x83"
- "\x6a\x64\x5d\xce\xe4\x08\xde\x38\x77\x48\xbc\x71\xce\xf2\xb2\x17"
- "\x36\x69\xb2\x8a\x5c\x3b\x8a\x8c\xc4\x3f\x12\x4d\xc7\xfb\x0c\xad"
- "\xbc\x4d\x57\xd0\xba\xe1\xcc\xf9\x26\xff\xe0\x4c\x24\xfe\x81\xec"
- "\x0a\x09\x16\x68\xab\x51\xce\x1b\xe7\xa6\x28\xfa\x93\x80\xe7\x1d"
- "\x63\x8d\xf5\x13\xb4\x1c\xdf\x42\xdb\x65\xb7\x2c\x59\x91\x7f\x0f"
- "\xb9\x98\xca\x76\xd8\xb3\x97\xe4\x67\x67\x5d\xbc\x4f\x96\xa2\xf1"
- "\x62\xb4\x47\xbd\x09\xf3\xde\x17\x4b\xf0\x70\xa2\x3f\xae\x64\xad"
- "\x0f\x82\x4e\x81\x77\x54\x69\x9c\xb9\x8f\x95\x9c\xd9\x2e\xec\xec"
- "\x8a\x93\x35\x3c\xa1\x7c\x0f\x38\xb8\x82\x34\xf4\xbf\x48\xb3\x07"
- "\x84\x4c\x5a\x3c\x47\x7b\x8e\x7c\x5f\x2c\xfd\x24\xbd\x2c\x6c\xf2"
- "\x00\xd3\x12\x73\x14\xbf\x85\xe7\xe2\x5e\xf5\x59\xf8\x51\x22\x9f"
- "\x5f\x03\xac\xf8\x15\x09\xdf\x62\x8c\xff\x3a\x95\x56\x94\xf8\x64"
- "\x39\x8c\xbd\x5a\xe4\x9b\xb0\x5d\xe8\xe7\x8b\x5b\xb4\xfa\xf0\x7d"
- "\x77\x74\x9d\xb4\x6e\x5d\x5c\x9e\x97\x15\x8b\x7d\xe4\xf5\xc2\x07"
- "\x5c\xb1\x7f\x8c\xb6\x3a\xa2\xf3\x0d\xbb\x4a\xac\xa8\xbf\x55\xeb"
- "\xf3\x0f\x1c\x22\x2d\xf5\x12\x7d\x1c\x50\xfb\xd8\x48\xb8\x45\xf5"
- "\x13\xfe\xab\x6d\xa8\x50\xfd\x8a\x78\x29\xbe\x21\xb5\x5f\xf8\x37"
- "\xb3\xd2\xbc\x2e\x29\xc6\x3a\xaf\xf9\x7b\xe9\xa6\x3e\xee\x2a\xf2"
- "\x19\x34\xbf\x52\xf2\xfb\x92\xec\x8b\xda\xb6\x2b\xea\x9b\x7e\xf7"
- "\x4c\xd2\xbd\x97\x3c\xcc\x5d\xce\x66\xc2\x43\xf2\x37\xb5\x29\x8c"
- "\x87\x25\xde\x6f\xe2\x5d\xc9\x5c\xc2\xbb\x68\x5c\x5a\x76\xc7\x12"
- "\x60\x52\x5e\x76\xfe\xf7\x04\x77\x0f\xc6\x8e\xdc\x96\x2d\xce\x5f"
- "\xb6\x72\x45\x5e\xaa\x2d\x2f\x6b\xb1\x3a\xe9\x47\xcd\x79\x97\x90"
- "\xdd\xfd\xda\x3c\x1b\x76\xb9\xe6\x46\x68\x8b\x2b\x82\xff\x64\x63"
- "\x25\x62\x2b\xbb\x5e\x91\xf3\xc9\x95\x1f\x35\x77\xc5\xf7\x34\x47"
- "\xb7\x0b\x9e\xcd\x15\xbd\xfe\x93\x6c\x1c\x7b\x9a\xb9\xee\x51\x61"
- "\xea\x97\x30\x76\x9d\x10\xfd\x14\xfe\xb4\x4a\x82\xd4\x4f\xe1\xbf"
- "\x45\xf0\x67\xae\x0e\xad\xbf\x11\xb9\xc1\xd5\x2f\xf8\x28\x95\x5f"
- "\xbb\x94\x5c\x1e\xe1\x4f\xd7\x6f\x50\x75\x67\x9d\x9a\x8c\xa7\xf1"
- "\xd7\x68\x4b\x96\xe4\x55\xd7\xdf\x33\xaf\x90\x8f\x64\x3a\xc8\xcf"
- "\x1c\x8d\xc1\xfa\x65\x1a\x6f\x29\xec\xef\x36\xf6\xa4\x0d\xbb\xd6"
- "\x2f\x8a\xa6\x13\x3c\xe6\xc9\x4e\x95\x47\x4c\x93\xb2\xeb\xe4\xdf"
- "\xf5\xa0\x2e\xda\x3b\xb8\x44\xdb\xd0\xaf\xf5\xa0\x7f\x9b\xb2\xa8"
- "\x1c\xe2\xaf\xf9\xa0\x55\x8d\xef\xb8\x41\xec\x35\xd6\xa3\x6c\x1f"
- "\xc6\x16\xf9\xc0\xff\xb9\x04\x6e\x28\xc0\x51\xb2\xbd\xf1\x6b\x3c"
- "\x12\x5b\x1f\xa2\xb5\x08\xf7\xc0\xdb\x0d\xea\x99\xf4\x0d\xf3\x7d"
- "\x79\x29\x6c\x70\xd0\xaa\x1f\xcc\xcb\x30\x90\xbe\x80\x60\xe1\xa9"
- "\x0b\x30\x89\x3f\x1b\x6c\xa0\x53\x1d\xd1\xe5\xa9\x65\x11\x4c\x0d"
- "\xd4\x0e\x9e\x67\xd5\x13\x7e\x8b\x78\x80\x83\x29\x58\x4f\xd7\xf7"
- "\xf3\xbc\x14\xfd\x38\xbe\xb3\x2e\xd5\x4f\xb3\x16\xbb\x92\xe8\x95"
- "\xf4\xcf\xff\xec\xce\x17\xa5\x6e\x40\xad\x77\xc3\x3b\x5c\xff\x8a"
- "\x58\x57\xaa\xc4\xba\xc2\x99\xf4\x77\xbe\xa1\x43\xd8\xc1\xda\x5f"
- "\x11\x31\x51\xd5\xf3\xd5\xbe\x56\x7b\x50\xc4\x9a\x73\xe6\x13\x9f"
- "\x16\xa4\x7d\x1f\x71\x7e\x78\x4f\x7e\x90\xfd\x20\x40\x38\xf9\x2c"
- "\x23\x5f\xef\x7e\xc1\x2f\x3c\x6b\xd6\xfc\xbb\x53\x9c\x46\xf0\xc1"
- "\x0c\xfd\x8a\xa1\x71\xb7\x39\xc9\x37\xff\xb3\xbd\xa4\x77\x95\xf2"
- "\xb8\x95\x55\x81\xa7\x97\x63\xf0\xec\x63\x14\x1b\x4f\xca\x0a\x3d"
- "\x18\x97\x98\xe3\xc8\xfb\x94\xdc\x03\xd6\xe8\xc4\xb3\xc7\xc8\xb6"
- "\xdc\xab\x96\x81\xba\xb0\xfe\xaf\xaf\x91\x75\xa1\xbc\x61\x6d\x3c"
- "\x9f\x7d\xec\x9b\xfa\x8d\x48\x79\xf8\x7e\x81\xca\x17\x30\xa9\xbb"
- "\xfa\x23\x95\xd5\xaa\xe9\xae\x22\xbc\xcf\xb3\x9d\x9a\xee\x4a\xfa"
- "\x8e\xde\x50\x47\xf5\x8f\xa7\x23\xe2\xce\x1f\x11\xde\x1b\x89\x87"
- "\x1b\x97\x9f\xc0\xfa\x4e\x6d\xd7\xf8\x42\x39\x3e\xa5\x4f\x13\x7f"
- "\x48\x71\x4c\x35\x5e\x52\xf2\x00\xa5\x85\x72\x2d\x2b\x5d\xa4\xad"
- "\x65\xf8\x76\x97\x4a\x2b\xd4\x75\xae\x34\x2c\xff\x8e\x6d\x57\x5f"
- "\x5a\xa7\xc1\x48\x83\xb9\x84\x51\xe9\xb9\x41\xd3\x17\x3b\x22\xb0"
- "\x2d\x3d\x27\x60\x1d\x7e\xff\xf3\x5b\xa2\x60\x4f\xcf\xa9\x92\x6e"
- "\x96\x62\xfd\xdf\xb0\x50\xae\x29\x32\x8d\x9b\x7a\xf3\xf8\x33\x19"
- "\x4c\xc2\x60\x99\xd0\xcd\xf8\x9c\x29\x68\xdb\xcf\xad\x5e\xdd\x95"
- "\x2d\x92\x96\xfd\x1c\xeb\x5f\x69\xa2\xfc\xae\xd4\x4d\x6d\x89\x6e"
- "\xef\x63\x2b\x9e\x5c\xb1\x72\xf5\x0a\x52\xa8\xad\xca\xb3\x2d\x59"
- "\x99\x95\x6d\x1a\x43\x1f\x62\xa5\x78\xcf\xfe\x4d\x61\xbf\x51\xe5"
- "\x69\x64\x07\x2f\x63\x0e\x94\xdf\x6e\xbb\x91\xf0\xeb\xe7\x2f\x91"
- "\xae\x40\xc4\x7e\x20\x1f\xa9\x52\x6f\xd0\x4f\xdf\x4b\x58\x97\x5f"
- "\x37\xb8\x3a\x47\xe5\xb1\x36\x76\x11\x1c\x55\x99\x83\xf7\xb1\xb2"
- "\x29\xda\x3a\x44\xed\x13\xbc\xf9\x48\x8a\xa0\x8b\xca\x48\x8e\x41"
- "\xc0\x6b\x24\x05\xeb\xcd\xcf\x7d\x5e\xdd\x15\x9b\xd4\x7e\x05\x35"
- "\x78\x50\xff\xc1\xeb\x1a\x87\xf9\x32\xe0\x68\x79\x9a\x5a\x16\xd1"
- "\x4f\x94\xfd\xf3\x56\xcd\x0e\x9b\x7c\x81\xba\x0b\xc8\x0f\x70\x59"
- "\x48\xd9\x48\xf4\xa6\x2c\x5d\xa3\x4b\xb4\x16\x29\x28\xe7\xed\x21"
- "\xdf\x04\xcc\x1b\xb2\xbf\x9f\xda\xc3\x36\x56\xc8\x78\x01\x65\xcb"
- "\x47\xc7\x0b\xd8\x38\x07\xbf\x0a\xf5\xd7\x14\x75\x7f\xa9\x9f\xf6"
- "\x8d\x23\x92\x56\xd6\x76\x51\x9e\x26\xb4\xe9\x60\x98\x5f\x91\xfe"
- "\x48\x55\xff\xc5\x14\xfb\x62\xe3\x14\xf2\xf9\x19\xc1\x8d\xb2\xef"
- "\xa8\x3c\x88\xf0\x3b\x4b\xeb\x2d\xf2\x88\xb3\x2c\x80\x49\x1e\xe9"
- "\x68\xa9\x4f\x7c\x78\x19\x70\x62\x63\x6a\x04\x0f\x24\x8c\x90\x96"
- "\x1e\xe1\x53\x36\x26\xd2\x37\xd1\x70\x40\x1d\xf7\x49\xd9\x74\x63"
- "\x8e\xb6\x66\x93\xbf\x53\x19\x3f\xa2\xec\xe0\xae\xa2\x7e\xc8\xfc"
- "\x1b\x37\x44\xca\x28\x3b\xa8\xea\x22\x0c\x5c\xff\xf3\x59\xdb\x85"
- "\xcc\xb6\x71\x47\x44\x27\x50\x76\x90\xe8\xae\x28\xc3\xd4\x5b\xec"
- "\xf1\x8b\x98\xca\x3a\x2d\x76\x3a\xf2\x76\x68\x3c\x8a\x56\x56\xab"
- "\xd4\x39\x09\x1f\x95\x98\x83\x35\xc8\xe3\x0f\xeb\x63\x91\x16\x96"
- "\x01\x01\xd5\x56\xc1\x7b\x97\x27\x46\x64\xbd\x9f\x8b\xbd\x4b\x21"
- "\x07\xca\x72\xc0\x27\x97\x1b\x2f\x96\xdb\xc0\x3f\xd8\x96\xad\x58"
- "\x06\xf6\xe1\xa7\xf6\x95\xf7\x40\x74\xf8\xa9\x7d\xd9\x3d\x64\xb2"
- "\xf5\xf0\xec\x87\xc4\x15\x93\xe3\x9e\x31\xf4\xc7\x32\xbe\x6b\x86"
- "\xa0\xa9\x24\xe7\x92\xee\x74\x58\xc6\x3a\x9d\xa4\x5e\x8d\xea\x75"
- "\x22\xd6\xbd\x0c\xcc\x81\xdf\x50\xec\x1a\xb4\xa1\x4d\x8d\x2f\xab"
- "\xad\xd9\xa0\xe5\xe5\x3b\xb5\xfd\x2e\x61\xc3\x4e\x7e\x08\x07\x73"
- "\x84\x3e\x0e\x7d\x0a\xeb\x3f\xa4\x7e\x51\xee\x99\x0d\xbb\x9e\x63"
- "\x5a\xba\xa6\x8f\x45\x5a\xa2\xa6\x7b\x95\x79\x9f\x4b\x8e\x7c\x3b"
- "\x4a\xb7\x9d\xa8\xed\xa7\x21\xcf\x1c\x0d\x66\x5a\x39\x4e\x1b\x3f"
- "\xad\xf2\x49\x31\x82\xaf\x76\x95\xdf\x2d\x7c\x7f\x12\x2f\x2e\xf4"
- "\xcc\xcf\x15\x6a\xf5\x90\x8c\x40\xed\x56\xf7\x6e\xc4\xbc\x27\x1f"
- "\x9f\xd2\x47\xe8\x73\xe1\xf1\x1f\xbd\xc7\x31\xf6\xfe\xc6\x48\x01"
- "\x6f\x0d\x0e\xf1\x96\xaa\x2f\x31\x67\x97\x32\x16\x2c\xe0\xcd\x23"
- "\x43\x7c\x97\x88\x51\xfd\x04\x63\x95\x87\x18\x0b\xc5\xfc\xe4\xc4"
- "\x05\xc0\xfd\x91\x73\xca\x69\x8a\x5d\xb7\x1d\xf9\x1e\xf1\x7f\xcd"
- "\xeb\xf1\xcd\x23\x76\x7e\xba\x1e\xf9\x1e\x3e\x75\x9a\x6f\x43\xde"
- "\x87\x73\xd0\xef\x02\x1e\x0c\xc5\x3c\x79\xc2\xf6\x43\xa2\x43\x15"
- "\xb3\x7c\x1b\x0f\x35\x71\x97\xbe\x9a\xaf\xff\xf6\xcd\xc3\xae\x8a"
- "\xd9\xe1\x98\x59\x28\x97\x60\x34\xcf\x41\xf7\x4f\x9e\x40\x9f\x4e"
- "\x64\x62\x0d\xc5\x18\x9c\x40\x3e\xc8\xff\x79\x82\xde\xf8\x62\x6e"
- "\xbe\x02\xbf\x94\xb1\xe8\x3e\xda\xda\x1a\x2a\xe0\x2d\xd5\x8f\xa3"
- "\xfd\x27\xd1\xfe\x21\xde\x8c\x3e\xec\xaa\xea\x63\x8c\xda\x1f\xa2"
- "\x32\x43\x2c\x26\x73\x8d\x6e\xca\x76\xbc\xcf\x74\x24\xb0\xed\xc8"
- "\xfb\xb8\x9f\x4d\xa9\x47\x9e\xc7\x9f\x9e\xc2\x44\xfb\x07\xd0\xee"
- "\xd8\x43\x4d\x21\xd4\x4d\xed\x47\xfd\x03\x5a\x3b\xb5\xfa\xa9\xbd"
- "\x1a\x0e\x66\x92\xbe\xcb\xf4\x45\x2f\xb5\x5b\xea\xf0\x2b\x6f\xf0"
- "\xe5\xe5\x30\x5f\xcc\xb7\x6f\xf6\xb2\x4a\xb2\x63\x22\xdc\x3a\xe1"
- "\x03\x4e\xa9\xe7\xca\x4e\x68\x30\x90\xf2\x64\xe5\x5c\xad\x7f\xd1"
- "\xfd\x9a\xbf\x32\x57\xe8\x51\x17\x2f\xc9\x5f\x56\xb0\x18\xd2\x99"
- "\x89\xd9\x29\x49\xc8\x6f\xd9\x59\xb6\x95\x2b\x6c\x4b\x17\x2f\x5b"
- "\xbe\xb2\x20\x3b\x37\x55\x88\xdc\x79\xd9\x2b\xb2\x48\xbd\x9a\xbb"
- "\x38\xd7\x6e\xba\x88\xe7\x2e\x3b\xd4\xd4\x4e\x71\x4e\x8a\x48\x7f"
- "\x5d\xf3\xb0\xaa\x5b\x0c\x70\x57\xba\x90\xdd\xe4\x3c\xa8\x82\xcc"
- "\x9f\x4e\xef\xef\x93\x6b\x4d\xcd\x5c\x5e\xfe\xc5\x31\xce\x45\x0c"
- "\x66\xdd\x69\x56\xf3\x5d\xd1\xcf\xc1\x39\x5a\x39\xe2\x8c\x86\xe0"
- "\x59\x29\x7d\x64\x0e\x8b\xd8\x6c\xd7\x3c\xcc\xf5\xe8\x23\x60\xa0"
- "\xf2\xad\x8b\xd4\xb3\x73\x7f\xea\x61\x35\x37\xa0\xdf\xb4\x77\xd0"
- "\x21\xf8\x42\x71\xc6\xa7\xe6\x2a\xf0\xbd\x8b\xb8\x6b\xa2\x99\xe0"
- "\x52\x25\xe5\x4a\xbd\x45\x47\xf1\x57\x7b\xe8\xbc\x61\x1a\xed\x11"
- "\x6e\x77\x29\x69\x11\x1b\x99\xca\x0c\xe2\x71\x85\xae\x5d\xcc\x8b"
- "\xaa\x4d\x1a\xbe\xeb\xe9\x0c\xc7\xfa\x69\xdf\x93\xb4\xba\x4a\x9c"
- "\x29\xc2\xb8\x7d\x4f\xb6\x5f\xc4\x83\xc6\xfa\x54\xfd\x0e\xfa\xd7"
- "\xc7\x9d\x73\x54\xbf\xed\xd5\xef\x28\xf1\x33\x13\x42\x79\x56\x35"
- "\x86\xfa\x17\x8a\x52\xfe\xc5\xe9\x10\xd6\x75\x05\xbc\x2a\xaf\x9a"
- "\xf9\x62\xa8\xfc\x8b\x7e\x65\x75\x8a\x9e\xe8\xbb\xd3\x01\xf8\xad"
- "\xcc\x31\xf1\xaf\x73\x26\x87\x56\xa7\x80\x07\xf8\xc2\xc7\x39\xbe"
- "\x35\x75\x32\x11\xf3\xb6\xfc\x8b\xb3\xea\xb3\x9e\x9e\x15\xf0\x6a"
- "\xbc\xbc\xd3\x88\x67\x93\xc2\xa3\xf2\x8f\xce\x6b\xa6\x67\x8b\x4e"
- "\xd8\xe6\xa5\x81\x37\xbe\x9b\xfa\xae\xf5\x59\xc8\x08\xa4\xa7\x08"
- "\xf7\xad\xba\x49\x4b\x27\xde\x55\xf2\x91\x6c\x49\x0f\xab\x76\x4b"
- "\x9a\x16\xce\xf7\xac\x06\x03\x01\xdb\xf2\x2f\x7a\xbd\x18\x3f\x11"
- "\x17\x7e\xfd\xb5\x37\x73\x7d\xe5\x93\xb4\x76\xcc\x0b\x89\xbd\x2c"
- "\x26\xf7\x3e\xaa\x7b\x35\x78\x92\x2d\x3a\xad\x1f\x18\xb7\x94\x4c"
- "\x1f\x33\xc9\xf9\x5b\x63\x88\x92\x51\x06\xb8\xc0\xf7\xea\x3a\x51"
- "\xaf\xde\xb8\x5e\x3e\x57\xa9\xbe\xcc\x6b\xd2\xb4\xbc\x48\x9b\x25"
- "\x79\xd2\x2a\x03\xc9\x6e\xb4\xb7\x45\xf7\xf5\xe3\x9c\x93\x2c\xaa"
- "\xe3\x9c\x68\x21\xd1\x66\xdb\x34\xc6\xda\xfd\xc4\xb7\xd7\x54\xec"
- "\xa9\xf3\x33\x31\x7e\xa6\x2f\x8e\x0d\xf2\x1c\x06\x7e\x65\x4c\x3e"
- "\x95\xbe\x41\xfe\x36\xc1\x83\x03\x9f\x15\xe0\x33\xbe\xe9\x23\x7c"
- "\x2d\x3a\x47\xed\x78\xde\xd8\x5a\xd8\x4f\x7e\xdc\x81\x87\xcf\x1b"
- "\x09\x36\xb4\x36\x54\xb9\xc4\x19\x39\x41\x83\xdd\x05\x77\x51\x19"
- "\xe7\xe2\x03\xcc\xd0\x0e\x0a\x0a\x78\x07\xec\x45\x6c\xca\x49\xe4"
- "\x37\xe4\x33\x23\xc9\x47\x7f\xeb\x3e\x32\xea\x9b\x2d\x61\xf2\xfc"
- "\x6c\x8d\x07\xc2\xfd\xfc\xd1\x67\x41\x9f\xff\xc6\x59\xd0\x27\x56"
- "\xae\xcc\xcf\xcc\xcd\xa6\x4b\xca\x0d\xab\x6e\xba\x78\x4d\x34\xcb"
- "\xb8\x39\xcf\xe7\xd0\xf8\xd1\x3a\x21\xcf\x54\x3c\xdf\x18\x25\xd7"
- "\x92\x6e\xed\x5e\x5a\xdf\x68\x4f\x1c\xef\x5a\x3f\x2c\x5c\x27\xf8"
- "\xaa\x23\x46\xa6\xbf\xb8\xbe\xa5\x8b\xf3\x17\x2f\xff\x9e\xdc\xbe"
- "\x1d\xa3\x9e\xce\xd1\xf5\xbc\x90\x10\xae\x47\xca\x20\x7e\x31\x07"
- "\x2b\x67\x16\xf3\xb8\xc9\x36\x49\xe7\x5e\xb8\x4b\xb3\x71\x1a\xdb"
- "\xf7\x44\xe7\xc2\x50\xf9\xb1\x0e\x1a\x2f\xe7\x3a\xa6\xff\xf5\xda"
- "\x4e\x3d\xf1\x5f\x45\xb8\x27\x9b\x13\xa1\xe7\x53\x63\xda\xbd\x7f"
- "\xb6\x13\x74\xf6\x85\x32\xbe\xb1\x73\x21\xf0\xaa\x78\x3c\x3b\x93"
- "\xe8\x73\xbb\x72\x8f\xf2\x85\x86\xf1\xf2\xf2\xb2\x9e\x1c\x39\x57"
- "\x5e\x38\x27\xf6\xca\xa6\xb1\x9f\xf7\xb0\x17\xce\x18\xac\x90\xe3"
- "\xa6\xb1\x37\x70\x2f\xe4\x05\x7a\x37\x6a\xac\xaf\x1b\x68\x30\x00"
- "\x3b\x81\xa5\x3a\x2e\xff\xc0\x84\xc9\xbf\x18\xfc\xf4\x5c\x27\xac"
- "\xdf\x63\x00\xe1\x49\x13\x0d\xcc\x12\x6f\x36\x4e\xbf\x3e\xc9\x7a"
- "\xef\xf7\xef\x9e\xe5\x2c\x2a\x74\x70\x25\x18\xb0\xf0\xa8\xf8\x8b"
- "\x15\xa6\xb6\xc7\x6e\x2a\x96\x6b\x45\xa5\xa9\x6d\xac\xb6\x56\xba"
- "\xb8\x9d\x78\x6b\x25\x7e\x86\xcf\xb9\x8a\xe9\xdf\xbe\xe0\xd5\x13"
- "\x2f\x47\xeb\x8f\x27\xf8\x15\x64\x82\x17\x4b\x3e\x40\x1a\xfa\xef"
- "\xe0\x15\x33\x7c\xf2\x6c\xc3\x8b\x1f\x2a\x55\x33\x7c\x91\xf2\x0d"
- "\x8c\xca\x87\xbc\xa0\xdf\x51\xd4\xaf\xf7\x18\xbe\xcf\x3c\x36\x3f"
- "\xfb\x00\xf7\x63\xc2\x12\x75\x92\x6e\x8a\xca\x00\x1d\x2e\x73\x9e"
- "\x07\x7d\x76\x08\x3d\xb1\xfe\x34\x7b\xf1\x7c\xf3\x38\xdf\x89\xbd"
- "\x1e\xd3\xa1\xc7\x87\x5d\x9b\x30\xfe\xff\x52\xa1\xf2\x43\xe0\xd7"
- "\x36\xcd\xd6\x68\x02\xde\xff\xbb\xd4\x57\x6f\xca\xd0\xf2\x8c\x2d"
- "\x4f\x92\xcd\x24\x77\xd3\xb8\xf2\xa1\xfe\x7e\xf2\xe1\x36\x8e\x4e"
- "\x60\x36\xd6\xe7\x75\x34\x8f\xe3\x4a\x12\x26\xc6\x97\xa4\x3d\xb5"
- "\x1f\xeb\x5f\xdc\xc0\x55\x2c\xde\xff\xef\xd4\x66\xb2\xdb\xed\xd8"
- "\x06\xde\x97\xf6\xa9\x2c\xba\xb4\x65\x96\x92\xb4\xc5\x21\xd7\xdd"
- "\x77\xd2\x3a\x69\x71\x3c\xa4\xb3\x04\xef\xd3\x05\x5d\x77\xdd\xb9"
- "\x5d\xc6\x3c\xf1\xd7\x4c\xe5\x9d\xf8\xa6\x1b\xdf\x78\xf1\xeb\xc5"
- "\x77\xfb\xfb\xd8\x4b\xd7\xe0\xda\x66\xd1\xf1\xed\x16\x8c\xe4\x6d"
- "\xc5\x22\x06\x24\xd1\xe8\xfd\xdc\x04\x1e\x73\x44\xe8\x02\x26\x44"
- "\x74\x01\x2f\xdd\x8d\x71\x9b\x38\xf7\x59\xfe\x01\xca\x6a\x0b\x0d"
- "\x29\x6d\xf5\xa7\x19\x53\x75\xde\x07\x31\x47\x0f\xa6\x6e\x62\x56"
- "\xd5\xf6\x52\xbf\x3f\xd8\x46\xb4\x98\xce\x2e\xb7\xa2\xce\xdd\xf8"
- "\xb5\xd8\x56\xb0\x98\xd3\xec\xa5\x4a\xe2\x3f\x22\x3c\xec\x2f\x26"
- "\xa8\xf2\x88\xfb\x56\x7c\xbf\xee\x29\xc2\x89\x7e\x7d\x10\xe5\x83"
- "\xe7\x6f\xf3\xe4\xb4\x09\x5b\x18\xb2\x6d\xa6\x3c\xa8\x23\xc5\x13"
- "\x68\x63\x0a\xb7\xea\xf1\xdc\x42\x76\xca\x1c\x79\xdb\x1d\x9d\xac"
- "\xdd\x1e\x00\x8d\xdd\x0f\x1e\x38\x25\x19\xed\x11\xe5\xe1\xfd\xc1"
- "\xb7\x31\xbe\x36\xf0\x7b\x28\xaf\x83\x6c\x6b\xe8\x0c\x30\xcf\x4b"
- "\xb9\x11\xdf\xb7\x42\x86\xd6\x53\xf9\xa7\xd9\xcb\x2f\xf1\xc1\x94"
- "\x94\xdb\x06\x64\x4c\xc4\x1e\xf6\xf2\x72\xb4\xb3\x28\xd2\xce\x97"
- "\xcf\xa1\xfd\x06\xd0\x55\x37\xca\xdc\xcd\x0b\x50\x67\x2f\xea\x84"
- "\x3c\x02\xfc\x4d\x86\xbc\x6b\xa0\x36\xb7\x53\x7b\x1d\x21\xc6\x57"
- "\xa7\x18\xaa\xcf\x32\x03\xe6\x82\x7b\x3b\xae\xe8\xff\x2e\xf0\x64"
- "\x49\xc3\xae\x97\x8b\xb5\x73\xe4\xc4\x4b\xe0\xb9\x46\xc3\xa5\x4a"
- "\xe4\x41\x1b\x5b\xd0\xae\xdd\x71\x03\x8c\x64\x9c\x09\xc0\xd3\x09"
- "\xa8\x77\x12\xc6\xaa\x05\xb0\x7b\x1a\xb0\xde\x4d\x7d\x52\x86\x94"
- "\x7e\x05\xe5\x55\x0f\xa1\x4d\x79\x56\x83\xb9\x97\xe2\x45\x0f\x73"
- "\xc0\xfb\xe0\x3c\xc7\x30\x27\xbb\x53\xb2\xe1\xc4\x37\x0f\xa3\xaf"
- "\x58\xef\x7e\x91\x4a\xf2\x06\xfa\x71\x97\x8c\xe9\xf8\xf2\x2c\x75"
- "\x4f\xeb\xa0\xd4\x33\xbd\x54\x49\xb0\xa7\x7e\x99\x4b\x12\x4a\x3d"
- "\xfd\x3e\x66\xee\xbd\x0a\xeb\xdb\x4b\xcd\x75\x0a\xf1\x28\xbf\x08"
- "\xeb\xff\xc7\x99\x63\x01\x0f\xe8\x8b\x32\xc4\xfb\x89\xf7\x94\xf6"
- "\x2e\xbf\x58\x9e\xe9\x88\x49\x07\x9f\xa9\x47\x3b\xe9\x3c\xc4\x54"
- "\xac\xd3\xf7\x92\x3d\x13\xda\x07\xb9\xe3\x17\x15\x97\x8a\xa5\x0a"
- "\xf8\x58\x91\xa7\x19\x6d\x9f\x2d\xe0\x55\xc0\xeb\xa4\xae\xe7\x17"
- "\xad\xda\x79\x7e\x3e\xc4\x0b\xab\x8b\x44\xbd\xc5\x1b\x0a\x44\x1d"
- "\x14\x5f\xb3\x3f\xdf\xc6\x8f\xb4\xda\x7c\xe3\x9e\x99\x8e\xb2\xe3"
- "\xf1\xa9\x31\xbb\xc4\x9e\xe6\x68\x3b\x9e\xda\xd4\x28\xb9\x91\xf6"
- "\x35\x8b\x69\xef\x56\xfa\x5d\xa9\x15\xf6\xca\xf3\x1c\xd2\xbf\x84"
- "\x27\x30\xa0\xf2\x96\xb5\x6b\x44\x1c\x1f\xe2\x6b\x84\xed\xcf\x49"
- "\xd5\x5e\xa7\x76\x0a\xd5\xd1\x7a\x51\xac\xe0\xec\x15\x8b\x9f\x58"
- "\x9e\x2d\x55\x29\xb7\xfc\x2c\x7f\xf1\x4f\x47\xf3\xbf\x06\x21\x17"
- "\xbb\x6a\x37\x48\xdd\x64\xed\xee\x28\x3e\xd1\x10\xd6\x2d\xe9\xd9"
- "\x2e\xa9\x5f\xaa\xed\x1e\x4b\xbf\xf4\xd0\x4f\x57\xac\xcc\x15\x75"
- "\x08\xd3\xa6\x6c\x79\xba\xc8\xc4\x1e\x9b\xfd\xd0\xec\x5b\xf2\xb2"
- "\xf3\x45\x70\x0e\xa9\xcc\x59\x9c\x95\x95\xab\x1a\x3e\x2d\xa3\xaf"
- "\xe8\xcd\xd2\xd5\xe2\x53\xfb\x93\xf9\xd2\x64\x2a\x6f\xf9\xe2\x82"
- "\x6c\xb5\x88\xe8\xb6\x26\x11\xbd\x6c\xad\x13\x32\xb3\x49\xee\xd3"
- "\x6e\x5e\x1e\xb5\xaf\x13\x2d\x47\x5e\x83\x77\x65\xda\x3b\xfb\x4c"
- "\xc2\x95\x2d\xd7\xb4\x37\x08\x9f\x08\x86\x3d\xff\x41\xf0\xdd\x7c"
- "\x8e\xfc\xc9\x63\x6d\x2b\xa3\xf8\xa7\xea\x1e\x28\xe8\xf5\xe6\x4f"
- "\xc1\x6f\x97\x01\xbe\x8e\x79\x21\x85\x83\xa6\x3a\xbc\x6c\x5b\xab"
- "\xaa\x43\x30\x2a\xfa\xda\x7e\xb2\x5f\xa9\x17\x7a\x84\xcd\x03\x11"
- "\x3d\xc2\xb6\x56\x5a\xd7\x31\xde\xbd\xd4\x36\x6a\xe7\xb0\x6b\x8b"
- "\x39\xca\x76\x00\x7c\xe5\x66\xb1\xd7\x45\x7b\xdc\x22\xd6\x03\xf8"
- "\x27\xf5\x5c\xb9\xbe\xfd\x3f\x68\x1d\xaa\xbb\x8b\x68\xae\x52\xd6"
- "\x53\x2c\xe7\xcc\xd6\x87\x79\xf9\xa1\xcc\xdb\xfc\x2c\x51\xd2\x8c"
- "\x2d\x9b\x91\x7e\xe5\x69\xb6\x25\x1f\xe9\x8b\x40\x77\x26\x10\xef"
- "\x22\x75\xe5\x5b\x36\xab\x7a\x05\x82\xcf\x84\xa8\x36\xd4\x44\x74"
- "\x0f\xdb\x5a\x7d\xb1\x3d\xc5\x1b\xa4\x6d\x80\xd8\x07\x95\x7b\xd1"
- "\x5b\x76\x85\x65\x6d\xd4\xad\xee\xfd\x25\xf6\x21\x3f\x60\x51\xac"
- "\xee\xc7\xa1\xef\x9b\x49\x9e\x50\x6d\xba\xb6\xf4\x47\xf3\xc0\xd2"
- "\xb7\xfe\xa1\x4c\xe2\x9b\xa5\xcc\xb0\xf5\x2a\xc1\xe7\x90\x9e\xe3"
- "\x02\xc1\x7b\xeb\x4d\x78\x8f\xb5\x6e\xab\xcd\xcb\x6a\x6b\xb5\xf6"
- "\x50\x9b\xf3\x1d\x60\x06\xf0\x1d\xad\x7d\x68\xd3\x24\xe4\x99\x1d"
- "\x69\xf3\xd6\x44\xc1\x37\xf3\x0c\x55\x17\xb9\xb5\x45\xea\x9b\x7a"
- "\x6a\xa2\xc6\xcd\x70\x9a\x6d\xdd\x8c\xb6\xd6\xac\x97\x7b\xf0\x13"
- "\xb4\xbd\x6d\x94\x35\xaa\xff\x11\x5d\xd0\xe6\xeb\xa5\x2e\x68\x6b"
- "\x73\x64\x0c\xb7\xe6\x13\xde\x93\xfd\x82\x66\xbb\x40\xe3\x29\xe3"
- "\x0e\x6c\x0d\xdb\x7f\x29\xa6\x1e\x3b\xc9\x4a\x55\x72\x1f\x0e\xe3"
- "\x52\x77\x4d\x8c\xee\x88\xd8\x8b\xbd\x2d\xc0\x1a\x90\x36\x11\x69"
- "\x71\x94\x8f\xea\x14\x3a\x13\xc0\x86\xfa\xa2\x80\x1f\x8f\xb1\x4e"
- "\xbc\x6f\xd8\x55\x97\x02\x9e\xaf\x37\x82\x1b\x5b\xc5\x9e\x5c\x95"
- "\x0a\x6b\xee\xda\x7c\x67\x44\x7e\xab\x5b\x10\xde\x73\x42\x39\x91"
- "\x35\xa3\x6e\x0d\xc1\x98\xea\xb5\xaf\x25\x9d\xf4\xb6\x26\xd1\x0e"
- "\xb9\xaf\xf3\x47\x8c\xdf\x36\x0e\xfe\x82\xd6\x5a\x92\x25\x68\xec"
- "\x29\xaf\x8c\x05\xb4\x8d\x74\xec\xa4\x3b\x7d\x19\xf7\x3f\x52\xf4"
- "\x63\xe1\x4e\xdd\xfe\x68\x3b\x43\x09\xff\x6d\x89\x0a\x95\x89\xfe"
- "\x53\x59\x58\x7f\x74\x9a\x7e\x45\x2d\x77\x02\xca\xfc\x45\x9f\x0a"
- "\x6b\xb1\xa7\x50\xae\xc2\x81\xc6\x58\xc0\x7c\x5b\x32\x68\xae\xd0"
- "\xff\x38\x1b\xf8\xa9\x95\x28\x43\xc6\xe8\xdc\x36\x9b\x13\x6c\xd5"
- "\xfc\x3e\x92\xc1\xd0\x76\x79\xb6\x0a\xb8\x08\x39\x86\xda\xa9\x94"
- "\xf7\x38\xa8\xed\xb4\x9f\x10\x91\xab\xb7\xad\xa1\x6f\x7d\xcf\xc8"
- "\x6f\xaa\xe5\x7e\x07\x8d\xcd\x3b\x7c\x75\x0e\x53\xf5\xec\x58\xa7"
- "\xb6\x16\x13\xde\x53\x39\x7e\x21\x5f\x6d\xab\x51\x00\x17\x8c\x09"
- "\xe0\xbc\x6d\xb7\x36\x26\x5e\x56\xe7\x18\x8f\x1f\x96\xfe\xf3\xb7"
- "\xf5\x6b\x3e\x5a\x68\x6d\xc2\x1c\x2e\x96\xbc\x64\xfd\x9b\x96\x92"
- "\x7b\xb9\x25\x78\xe7\x9d\xc4\x1b\x6d\xd7\xf3\x40\x94\x1d\xdd\x74"
- "\xc0\xe9\x6b\xcd\xa6\x58\x59\xff\x93\x4e\xb2\x41\xf4\x04\xa4\x0d"
- "\x22\xa5\x3f\xe2\xe7\x4a\xbb\x3f\x44\x36\xf5\x9d\xc3\xae\xfa\xb9"
- "\x9a\x1c\x44\xf4\x2d\xa6\x44\x07\xd8\xd5\x2f\xf2\xb2\x17\x97\xab"
- "\x74\x6d\xd2\x49\x56\xbf\x51\x2d\x3f\xba\x0d\x06\x29\x47\xd6\x37"
- "\x4a\x79\xaa\x7e\x13\x68\xcf\x6c\x29\x4f\xd5\x37\x68\xed\xc6\xfb"
- "\xe5\x17\xf7\x71\xfe\x03\x0f\x65\xdb\x96\x13\x89\x4e\xbb\xc3\x61"
- "\x4b\xb9\x21\xeb\x36\x61\xb4\x6a\xfb\xa7\x07\xbe\x67\x9b\x7f\xcf"
- "\x0d\x8e\x9c\xd4\x47\xe4\xe5\x81\xf9\x73\xe9\x7a\xd1\x1e\xa6\x6d"
- "\xd8\xb5\x9d\x8d\x96\xd7\x76\xa8\x6d\xd8\x6e\xf5\xea\x6e\xea\x14"
- "\x38\x6c\xec\xac\xa5\x38\xe8\x58\x53\x07\x88\x4f\x9e\x17\x3a\xcc"
- "\xf9\xc6\x8f\xbc\x3c\xb6\xb3\xd6\x17\x67\x6a\xc3\xaf\xc6\x17\x7b"
- "\x68\x03\xc5\x49\xb7\x94\xf0\x80\x25\x38\x49\xd2\x4a\x3c\x83\x27"
- "\xe9\x07\xdf\x43\x63\xc9\x1e\xbc\xc9\xc9\xe7\x85\xb8\x07\xfc\x0f"
- "\xe0\xb2\xdd\xa1\xad\xe3\x42\x07\x55\xd6\x59\x3b\x0f\x5c\x26\xe1"
- "\x0e\xf8\x03\x23\xe4\xa1\x5a\xd2\x43\x21\x1f\xfa\xff\xa2\x57\xc2"
- "\x62\x7b\x13\xc6\xbf\x43\x85\xef\x7c\x3c\x63\xfc\x67\x89\x79\xa6"
- "\xb8\xac\x62\xad\x50\xd6\xdf\xfc\x28\x64\x81\x1a\xad\x4c\x94\x65"
- "\x56\xe3\xba\x8a\xf2\xd8\xdf\x78\xfe\x59\x29\xef\x6a\x22\xdd\x05"
- "\x9d\x2f\xb4\x38\x74\x14\xc7\x27\x23\xac\xaf\xc1\xbb\xf8\x92\x04"
- "\xd2\xe1\x64\xc4\xfb\x75\xc5\x94\x27\xa2\xd7\x50\xbc\xd5\x7a\x25"
- "\x00\x7e\x22\x41\xc6\x2c\x1f\x50\xf7\x75\x1b\x72\xc2\xfb\x04\xa3"
- "\xc6\xbe\x41\xe0\xc3\x59\x97\x01\xe3\x50\xef\x9b\x99\x28\x79\x27"
- "\xc5\xa5\x63\xf2\xcc\x79\xc3\xbf\x8b\x79\xa9\xe2\x23\xe0\xeb\xa3"
- "\x3d\x3c\x4b\x90\xfb\xc8\xde\x5d\x89\x01\x4e\xb2\x93\xcc\x53\x38"
- "\x5c\x4c\xe7\x5e\xc3\x78\x69\x07\x5e\xda\x81\x97\xb4\xdf\x8a\xfa"
- "\x7d\x31\x37\x2f\xc2\x9c\xd5\x9d\x64\x0d\xa9\xd4\x7e\x82\x0d\xf8"
- "\x77\xb3\x02\x58\x09\xbb\x3a\x82\x8f\xe9\x2f\xa9\x74\x5e\x89\xfa"
- "\x6a\x09\xa2\xcf\xd1\xfd\xd2\x2b\xde\x2a\x17\xfa\xa5\x47\xbf\x1c"
- "\xa7\x84\xde\x80\xce\x91\x81\x96\x4c\x8d\xc4\x82\x78\x65\x6e\x74"
- "\x1f\x15\x8a\x1f\x23\xfa\xf0\xca\x53\x63\xf5\x91\xeb\xa9\x8f\x04"
- "\x83\x57\xee\x53\xf7\x5b\x44\x3b\x89\x6e\x0d\xb0\x57\x58\x7c\x09"
- "\x9d\xdf\xea\xac\x05\xdf\xfb\x00\x8d\x61\xbd\x8b\xd7\x50\x3b\xc7"
- "\x1a\x2f\x2a\x4f\x96\xf5\x1f\x66\x4b\x49\xf1\x22\xb4\xa5\x73\x6c"
- "\x78\xbf\x72\xfe\xd2\xf0\x7e\xe5\x00\x7d\x4f\xed\xa0\xb3\x68\x16"
- "\x72\x54\x04\xfc\x06\x5f\x51\x36\x56\xbd\xf1\x25\x0d\xd4\xae\x31"
- "\xdf\x01\xf7\x07\xaa\x73\x47\xcf\x09\xa5\x3e\xc0\x08\x7e\xdb\x91"
- "\x2e\x75\xb2\xff\x51\x1c\xd6\x1d\x97\x75\xba\x2d\x3a\x5b\x0c\xcd"
- "\x31\xc1\x13\xa3\xbf\x63\x95\x6b\xd1\xd5\x90\xaf\xb3\x07\x40\xab"
- "\xc6\x7c\x8f\x79\x60\xe3\xeb\xbf\x3d\x13\xe5\x6d\x88\x2f\xd1\x71"
- "\x5f\xcc\xb7\x4d\xf1\xfe\x60\x32\xc1\x15\x6d\x75\x60\x8e\xbf\x24"
- "\xd6\x6e\xa1\xcb\x78\x15\x70\x78\x5b\xc4\xaf\xf4\xc5\x76\x6e\x90"
- "\xf6\x09\xaf\x26\x7a\xd9\x6f\xfb\x23\xb6\x46\xaf\x26\x7b\x75\x93"
- "\x25\x7f\x1d\x73\xed\x16\xac\x69\x90\xfd\x2c\xdc\xb6\xd6\xc2\xfb"
- "\xd8\xab\xef\x29\x3c\x45\x8f\x75\xeb\xee\x08\xee\xc8\xf3\x6e\x1a"
- "\xee\xe0\xfb\xac\xb1\xf1\xe2\xd5\x67\x2f\x8d\x17\xaf\xfe\x48\xd5"
- "\xf5\x2d\x92\x36\x80\xaf\x36\x69\x32\x07\x5f\x7f\xed\x16\x5b\x91"
- "\xa8\x3f\x5d\xd6\x0d\x98\x04\xd3\x89\xce\xcc\x05\xdc\x8a\x91\xb7"
- "\x53\xa3\x0d\x84\x43\x96\x10\xc9\x43\x4c\xe0\x39\xde\xf9\x41\x7b"
- "\x6a\xe5\xfa\x7c\x38\x95\x78\x55\xc5\x55\xbf\x0b\xeb\xd7\x56\xb2"
- "\x81\xf7\xc7\x76\x61\xbd\xd8\x61\xf5\xb2\xe3\x6a\xbc\xeb\x4e\x94"
- "\xd1\xc5\x36\xc9\xf3\xec\x46\x11\x7b\x0c\xf3\x9c\xe2\x8d\xd1\x5c"
- "\x47\x5a\x22\xda\x4d\xb1\xc7\x20\x23\xec\x98\xaf\xad\xfd\x8a\x2b"
- "\x9d\xe0\x2d\xe8\xa9\x9e\xf8\x61\xc0\xee\x25\xbd\xd2\x38\x74\x9b"
- "\x95\x51\x9f\x87\xd6\x4f\x6b\xfc\xf9\xad\xcc\xf0\x91\xf5\x09\x66"
- "\xbf\x83\x25\x96\xfc\x83\x81\xfd\xf7\x2c\xa6\x27\x38\x78\xd9\x8e"
- "\x45\x12\x76\x3b\x1a\xb4\xf1\xf1\xb2\x57\x45\x9c\x2e\xd2\xc1\xcf"
- "\x0b\xf2\x41\xb9\xa7\xb0\xc3\x8d\x35\x50\xdd\x3b\xdb\x6e\x1e\x63"
- "\x7d\x78\xd0\xb6\x2c\xcf\x96\xb5\x72\xf5\x8a\x19\x33\x4c\x63\xc8"
- "\x12\x3b\x0e\x4a\x59\xe2\x35\x63\xb4\x2c\x81\x67\xf4\xbf\xbe\xff"
- "\x62\xd9\x61\x6e\xa6\xea\xa6\x20\x33\x8d\x45\xee\x6f\x67\x73\x6f"
- "\x8f\x7a\xbc\x93\xcd\xbd\xe3\xce\xcc\x47\xb3\x17\x67\xad\x89\x4a"
- "\xfd\x4e\xb4\x9e\xaf\x7a\x0b\xea\x8e\x99\x76\x3f\xe8\x87\xee\x91"
- "\x67\x68\xdd\x79\x2d\x54\x14\xe4\xc7\x81\xbb\xb3\xc8\x37\xd0\x81"
- "\xfc\x20\x3b\x00\xfa\xc6\xaf\x25\xba\x3e\x49\xfa\xc7\x0c\x31\xd2"
- "\xa3\x59\xd0\x77\x1f\x64\xba\x73\xd2\x06\xfc\xf5\x19\xed\xb5\x01"
- "\xd0\x89\x43\x15\x92\xdf\x79\xad\x1b\xe9\x53\x90\x3e\x41\xda\xb1"
- "\xbc\x1e\x0b\x79\x39\x5d\xf8\x42\x28\x20\x5f\x08\xaf\x9d\x21\x18"
- "\xdd\xea\x2f\x66\xd2\x27\xd7\x6b\x9b\xc8\x57\xb6\x97\xbd\x3e\x9b"
- "\xf8\x0b\xca\x8b\xb4\xaf\x6c\x3f\x63\x69\x74\x25\x7e\xd8\x8b\x32"
- "\xf9\xc6\x43\x15\x7c\x6b\x06\xed\xed\x27\xa3\xcc\xfb\x88\x6f\x8b"
- "\xb1\x4e\x0a\x0d\xbb\x5e\x4f\xd7\x78\x10\xb2\x37\x1d\x8f\xff\xd0"
- "\xd6\xc1\x78\xd0\xef\x78\xbf\x85\x67\x92\x6f\x11\x1d\x4b\xa6\xf5"
- "\xc1\xe2\x98\x2f\xce\x28\xd1\xba\x48\x34\xa1\x5e\xd0\xd2\xd7\x6b"
- "\x35\xba\x50\x25\xe5\x51\x13\x7d\x8f\xf5\xf3\x6b\xb9\x7e\xbe\xde"
- "\xa2\xcd\x05\xdc\xb7\x6a\xb8\x3a\xea\x9c\xcb\x8a\xfc\xec\xdc\xec"
- "\x2c\xdb\x0d\x79\x26\x16\x15\xc9\x31\x27\x7b\x85\x2d\x37\xfb\xe9"
- "\x55\xd9\x79\x42\xd0\xa3\xb7\xa3\xf7\x58\x40\x83\x22\x71\x75\xc5"
- "\x59\x9b\x37\x6e\x22\x59\xd8\x52\x32\x43\xe8\xd3\x05\x6f\x64\x9e"
- "\x69\x54\xaa\xe2\xd2\xa5\x3e\xf2\x24\xe0\xda\xa8\xfa\xd4\x3d\x54"
- "\x48\x7c\x5c\x1f\x6b\xbc\x47\xee\xd9\xbf\xb1\x4a\xc2\xca\xf8\xec"
- "\xb0\xeb\x8d\xe5\x11\x7e\xad\x51\xd8\xbf\x4a\xdb\xb9\x37\x36\x00"
- "\xc6\x59\x11\x1e\xa4\xf1\x14\xd1\x41\x41\x0f\xff\x0a\x2d\x54\x79"
- "\x67\xd4\xd3\x78\x3b\x2f\xe0\xbd\xd5\x17\x98\xd0\x07\x92\x8f\x75"
- "\x49\x5f\xdf\xf0\x6a\x70\x04\xff\xd2\x4b\x7a\x07\x4d\x3e\x9a\x17"
- "\x3c\xcf\x8b\xd6\x30\x3d\xe9\x1e\x40\x43\x6a\xde\xca\xf5\xe9\xb9"
- "\xeb\xf5\x0e\xf0\x32\x85\x94\xa7\x5e\xb5\x21\xe3\xb1\x87\x1c\xc3"
- "\xae\xc6\x94\x88\xdc\xd1\x38\x20\xf8\xf8\x0b\x84\x37\x6f\xec\xcf"
- "\xa4\x35\x42\xd2\xee\xc9\x7f\xad\xbd\xdc\x24\x75\xee\x92\xbe\x35"
- "\xe6\xa8\x7d\x18\x20\x9a\xa5\xda\x20\xea\x25\x5e\x37\x0e\x00\xe7"
- "\x0a\x69\x2c\x40\xe7\xcb\x34\x78\x51\x7f\xa9\xed\xa4\x57\x06\x1d"
- "\xae\x79\x7b\x6d\x40\x2f\x63\x20\xbe\xde\x2d\xe5\xa3\xc6\x8e\xa8"
- "\x79\x6c\x94\xb2\x50\x63\x6f\xc4\xdf\xc0\x1b\xdf\x88\xc3\xb5\x72"
- "\x05\x1d\x6b\x79\x32\x73\xf5\xe2\x27\xb3\x33\x57\xd9\x53\x6d\xab"
- "\x56\x88\xad\x39\xa1\x06\xc8\x5f\xb5\xe4\x49\x1b\x51\x91\xcc\xd9"
- "\x73\xe7\x66\xde\xff\xd8\x0f\x7e\x64\x62\xf7\x2f\x46\x5a\xfe\x4a"
- "\xdb\xdc\xb4\x54\xf9\xea\xd1\x07\x1f\xf8\x61\xe6\x03\xf3\x1e\x7b"
- "\x64\xc1\x18\xb6\xb1\x66\xe0\x84\x03\x63\x34\xa1\x87\xfd\xea\x6e"
- "\x69\x0b\xf1\xa6\x63\xb4\x2d\xc4\x9b\x80\xd5\x9b\x4d\xf8\xb5\x31"
- "\xf6\xab\x64\xfc\xee\xc6\x2f\x4d\xe2\x4d\x2c\x68\xe0\x9b\x3b\x22"
- "\x78\x43\xef\xa4\xbd\xb0\xd4\xbd\xbe\x09\xfa\xf7\x7a\x30\xfa\x5d"
- "\x84\x16\xfc\x72\xa7\xa0\x97\x2a\x5e\x10\x3e\x64\x06\x8d\x02\x37"
- "\x24\xbf\xf2\x66\x50\xc3\x0d\x71\xde\x0e\xe9\xa4\x33\xa3\xf7\xdc"
- "\x3c\xc3\x4f\xfa\x65\xe0\x82\x83\xf6\x45\x29\x9d\xc7\xcd\x50\xed"
- "\xef\x7e\x79\x17\xe9\x9b\x89\x9f\x55\xf7\x4f\xe2\x4f\xb2\x5f\x3e"
- "\xcd\x5d\x8d\x01\x29\x0b\xbe\x79\x93\xc0\x9b\xf5\xd3\xee\x17\xfb"
- "\x50\xe2\x5c\xc3\x2f\x73\x22\xf8\xf3\x2b\x3a\xd7\x20\xe8\x82\xa4"
- "\xbd\xbf\xdc\x70\x91\x1e\x27\x06\x69\xb5\x9a\xbf\xea\xfc\x19\x4c"
- "\x6f\x98\x51\xc3\x36\xe9\x39\x78\x85\x5f\xce\x91\xf6\x70\xbf\x6c"
- "\xd1\xf8\x67\xdc\x63\xfe\x1f\xb5\x5f\xac\xff\xaa\x8a\xd2\x7f\x15"
- "\xd9\xf9\x91\x76\xbb\x8f\x78\x64\xb7\xc7\x27\xfc\x24\xde\xdb\x6e"
- "\xf7\x93\x6f\x3d\x53\x1f\xfb\x55\x9c\x33\xc4\x2f\xe0\x7e\x1a\xfa"
- "\x26\xd6\x90\xdb\xa4\x4e\x01\xf2\xd8\xaf\xee\x91\xb2\x89\x4c\x27"
- "\xb8\x7b\xd9\x9b\x64\xc7\x64\xa0\xf1\xc1\x7d\x2d\xc6\x28\x7d\x2c"
- "\xba\x17\x5f\xa2\x57\xfd\xd1\xfc\xea\x79\x92\x51\x09\x56\x2f\xea"
- "\x95\x9c\x17\x5d\xf8\xe1\x4a\xb4\x2f\xc2\x5f\xf2\x80\x84\xed\xaf"
- "\x6a\x5a\x1d\x03\xb4\x6e\x06\xc6\xb5\x53\x2c\xe0\xdd\xda\x78\xce"
- "\x0b\xf9\xee\xa5\xf1\x1a\x76\xfd\xaa\x4d\x1b\xcb\xc1\x1b\x57\xa6"
- "\xc5\x94\x30\xdb\x9e\xba\x3b\x28\x1d\xf3\xff\x57\x73\x54\x3b\x4c"
- "\xff\xc5\xdf\x82\x0e\xa7\xcb\xef\x9b\x8c\xda\xf7\x17\xfb\x39\x15"
- "\x07\x05\x49\xc9\xf5\x3d\xa1\x0a\x4b\x51\xc3\xd2\x8e\x3a\xf3\x43"
- "\x67\x39\x5b\x25\x4e\x6a\x3a\xb8\x04\xd9\x9f\x9d\x90\x25\x20\x7f"
- "\x97\x7f\xbe\x56\xd5\x03\x60\x6e\x37\xbd\x76\x2b\x63\xcb\xfd\xab"
- "\x33\xc2\x3a\x14\xd2\x7d\x90\xef\x32\xb4\xa3\x26\x4a\x47\x16\xb6"
- "\x15\xf3\xb2\x9d\x24\x13\xd7\xa0\x9c\x42\x2a\x87\xe6\x95\xd4\xdb"
- "\x34\xb9\x3d\x7e\xc6\x50\xde\x0a\xb1\x07\xea\x6a\xb2\x0a\xdc\x83"
- "\xac\x2d\xe4\xfc\x42\x7e\x5c\xb5\xa5\x10\xbc\x8b\x3c\x17\xd4\xe4"
- "\x0f\xeb\x82\xc4\x19\x99\x26\x3b\xd9\x87\x0e\xbb\x76\x9a\xc7\xd2"
- "\x17\x82\x3e\xe4\x2c\x5e\x91\xb5\x72\xe9\xd2\xbf\x4e\x1a\xa2\x6d"
- "\x36\x6b\x5c\x4a\x19\xca\x84\xfc\xbb\xc9\x2a\xf1\x74\x27\xe8\x7f"
- "\x79\x8e\xe4\xdf\x7e\x72\x02\xf3\xe6\xba\x93\x6c\x67\x9b\xc6\xbf"
- "\xcb\x79\xb4\xf3\x20\x77\xed\xb4\x46\xe6\xc6\xce\x86\x6f\xce\x8d"
- "\x9d\xbb\xc6\x9e\x1b\x3b\x3b\xb1\xce\x76\xe3\xfd\x41\xd4\x29\xf6"
- "\x5e\xe8\x59\xe5\xc1\xdd\x96\xe0\xbd\x82\x07\xcf\x5c\xc3\x74\xc4"
- "\x7f\x93\x6e\x9a\xd6\x83\x10\xe4\xda\x10\x68\x44\x66\x90\x25\xd0"
- "\x5a\x50\xbd\x82\xf4\x8e\xd3\x79\x70\x88\x7b\x33\xd7\x80\x5e\xe0"
- "\xb9\xea\xa4\xdc\xaf\x7d\xfc\x1c\xe4\x10\xdc\x57\xf7\x11\xad\x50"
- "\xc8\xa9\x3a\x93\xeb\xf5\x5b\x73\x34\x1e\xd7\x52\x62\x13\xbe\x76"
- "\xc5\xba\x0d\x3c\xa3\x75\x3b\x33\x64\x71\xcb\x75\xfb\x2d\xfb\x25"
- "\x75\xdc\x71\xa6\xe6\xb1\xd2\xd1\xc6\x56\x6a\x17\xda\xd9\x8c\x76"
- "\xed\xa2\xf6\x54\x2d\xa5\x7e\xc5\xdc\x69\x09\xa6\x89\x3d\x06\x6a"
- "\xe7\xe3\x7e\x76\x27\xb5\xef\xf1\xa7\xef\x64\xf5\x4b\x69\x9f\x58"
- "\xda\x07\xa9\xb8\x64\x00\xce\x4c\xea\x63\x6f\x27\xfb\x45\xec\xc3"
- "\xb7\x40\x8b\x8c\xad\x92\x0f\x96\x7b\x30\x94\x87\xde\x49\x3c\x7d"
- "\x3b\x79\x8f\x83\xda\xfc\x76\xb2\x96\x2f\xba\x6d\x0f\x2c\xb6\x83"
- "\xb1\x5c\xb6\x74\x69\x76\x6e\x9e\x16\xc7\x39\x65\xe5\xf2\xac\x7b"
- "\xd4\x73\xb3\x2b\xb2\x57\x67\x2e\xcb\x12\x76\xf9\x48\x95\xb7\x17"
- "\xf1\x1a\xa9\x24\x0b\x08\x5b\x57\xc1\x67\xec\x22\x1b\x2e\xc1\x73"
- "\xf4\xb0\xe6\x1a\xb9\x8f\xdd\xfc\x90\x5c\x07\x26\xaf\x46\x3b\x9a"
- "\xb4\x75\x80\xf4\x11\x83\x6c\x46\x19\xed\x2f\xd1\x59\x68\xda\xc7"
- "\x22\x9d\x04\xf2\x74\x78\xd9\x5b\x85\x1a\x6e\x57\x22\x9d\xce\x5f"
- "\xb8\x57\x90\xcd\xde\xae\x19\xca\xc6\xce\x7c\x6e\xda\x9b\x02\x1a"
- "\x60\xa6\xb5\x81\xf6\x55\xa4\xdf\xfc\xe6\x24\xa2\x6d\xa4\x37\x73"
- "\xaf\x20\x1b\xb8\xb7\x49\xd7\x91\xe0\x65\xbb\x92\x21\x17\xe5\x6f"
- "\x58\xcb\x8c\x54\x07\xd6\x0d\xaf\xd4\xc1\x36\xcf\xfa\xb0\x90\x31"
- "\x75\xed\xf0\x56\x0a\x9d\x60\xb3\x8c\x19\x50\xd6\x59\xa6\xea\x1c"
- "\x80\xff\xcd\xc0\xff\x38\x26\xdb\xbc\x77\xbe\xd8\x3f\x13\x74\xa1"
- "\x79\x03\x2f\xdf\xeb\x15\x76\x8a\xe5\x7b\xe7\x2b\x3c\x27\x86\x9e"
- "\x41\x97\x4d\xe0\xf7\x9b\xb8\x33\x85\xa9\xb6\x8d\x31\x7d\xec\x9d"
- "\x38\xd2\x99\x62\x3c\xea\x08\x16\x28\x7f\x93\x5a\xfe\x26\x94\x8f"
- "\xf5\xef\x5a\x35\x66\x65\xf3\x7e\xad\x2e\xe0\xb6\x0f\x6b\x57\x3e"
- "\xad\x5f\x68\xff\x72\xfc\xec\x52\x3f\x13\x80\x9c\x34\x3d\xac\x9f"
- "\x91\x3c\xd2\x3b\x06\x0d\x27\xa9\x6e\xb5\x0f\x35\x8a\x4b\xf8\x4c"
- "\xd4\xa9\x75\xd5\x90\xae\x40\x2b\x93\xa3\x4c\x3e\x34\xd0\x80\xb5"
- "\xc6\x88\x39\xe6\x8b\x2f\xc1\x9a\x42\x75\x10\x8f\xeb\x9f\xce\xb1"
- "\xe6\x84\x32\x43\x06\x79\x6e\x7d\x0d\x8b\x8b\xe6\x6f\x51\x5f\x7e"
- "\x84\x27\x43\x19\x43\xa0\x65\x45\x74\x18\xe2\x1d\x71\x96\x80\xec"
- "\x42\x68\x5c\x2f\x60\x9c\x30\x56\x69\xa8\xa7\x19\x7c\x79\x1c\xe0"
- "\xf0\x0e\x8d\x57\x95\x82\x39\x77\x41\xf0\xea\x16\x8a\x71\xde\xc3"
- "\xde\xd9\x46\x63\x45\x65\x01\x2f\x58\x70\x38\xe3\x9f\xc9\x6f\x14"
- "\xc1\x7a\x5d\x21\xef\xa7\xbd\xbe\x3e\xf6\xeb\x19\xc4\xc3\x82\xaf"
- "\x17\xf7\xce\x2c\xae\x88\xb1\x16\xf6\x8e\xbf\x9e\xb1\xae\x9f\x2b"
- "\xe7\x5d\x8c\xb7\x81\x96\x9e\xd7\xb3\x60\x00\x32\x28\xda\xad\x77"
- "\x9e\x22\xdf\x56\x0d\x98\x5f\x65\x0c\xf5\x1a\xab\xd6\xb2\x04\xf2"
- "\x0b\xe6\xb4\xf3\x40\xbb\xbf\x8e\xb5\xdb\xeb\xd8\xc7\xc1\x4d\xcc"
- "\x5d\x40\x3a\xcd\x5f\xb7\x7d\xe2\xd8\x44\xf6\xe5\xb1\xb8\xdf\x68"
- "\xfb\x21\xd5\xf5\x9f\x8b\x3e\x39\xf8\x19\xfb\xc4\xfd\x19\xb3\xfd"
- "\x58\x3c\xdb\xf7\x67\x7c\xcc\xf6\xa7\x7f\xcc\x9c\xbd\x5c\x21\x7e"
- "\xa8\xe8\x29\xaa\xa3\x0c\x65\x35\x90\x0f\xad\x04\x65\xd0\x6a\x42"
- "\xff\x0d\xf3\x1c\x4c\xec\x27\xba\x57\xfc\x1e\x6d\xfc\xcf\x33\xf5"
- "\x67\x99\xd1\xbd\xe2\x8f\xe2\x5e\xe8\x17\xd0\x5f\x4f\x56\xa7\xb0"
- "\x35\x23\xff\x61\x1e\x47\x3f\x9d\xd3\x54\xaa\xa9\x8d\x21\xd9\x6e"
- "\xc0\xcb\xa0\x7d\xbf\xbd\x28\xfc\xbd\xb0\x69\xdc\x46\xf0\x40\x9b"
- "\x0e\x2c\x90\x30\xd9\xdf\x09\x98\xfe\x50\x85\x4f\x46\x34\x7c\xfe"
- "\x33\x81\xe0\x43\x76\xa4\x4a\xc1\x40\x03\xda\x96\x0e\x18\x28\x5a"
- "\x1d\x84\x03\xb4\xef\x45\xe5\x57\x9d\x65\x66\xf7\x0a\xb2\x33\xfd"
- "\xf5\x2a\xcb\x7c\x83\x51\x19\x3a\xd5\x5c\x7d\x8e\x19\x68\xdc\x68"
- "\x9d\xad\x16\xef\x05\xcc\x33\x68\xcc\x7c\xb1\x9f\xe7\xe0\x07\xfc"
- "\xfc\xdc\x4e\xb8\x87\x6b\x3e\xc6\xab\x0c\x70\xf2\x61\xac\x1a\xe8"
- "\x2a\xf1\xf1\xa3\x06\xf2\xab\x48\x6b\x19\x70\x25\x92\x5e\xfe\xd1"
- "\xf6\x20\xe6\x8e\x22\xe4\xb4\xff\xf4\x29\x1b\x7b\x72\xa4\xcd\xe1"
- "\xdb\x69\xdb\xc0\x17\xd7\xbd\x20\xce\xb5\x9b\xc1\xcb\x93\x7c\xce"
- "\xb6\x88\xf3\x2f\xbf\x0e\xaf\x7f\xe5\x22\xe6\xf8\xaf\x6d\x7a\x61"
- "\x5b\xd6\x59\xa1\xe2\x7a\xc5\xb0\x6b\x17\xe4\xdf\xa9\x1d\x72\x4e"
- "\x34\xbb\x85\x1e\x02\x74\x60\x3c\x9e\x04\x74\x79\x3f\xd9\xea\xf1"
- "\x6b\x33\x98\x59\xc7\x7d\xe6\x45\x16\xee\x09\xb6\x12\x0e\x99\x05"
- "\xee\xcb\x77\xe0\x23\x7d\x16\xd0\xf2\x0e\xa4\x1b\xb4\x74\xa2\xeb"
- "\x0a\x64\x4b\x92\x6b\xe7\xad\xb1\xf0\xa2\x73\x2c\x49\xe8\x88\xb4"
- "\xf4\x35\x3e\x4b\xbb\x95\x91\xed\x7e\x90\xfc\x59\xd0\x37\x48\x8f"
- "\xc1\x3a\xb0\x1b\xf5\xba\x91\x3f\x51\xcb\xcf\x07\x33\x0c\x1e\x47"
- "\xab\x98\x67\xe4\xf3\x48\x5b\x17\x90\x3e\x61\x9e\xc3\x67\x11\x63"
- "\xa6\xa5\xe5\x65\x88\x75\x8c\xce\xce\x83\x4f\xe5\xa2\x3d\x7d\x22"
- "\x5d\x07\x39\x53\xc4\x34\x8f\x4a\xd3\x93\x9f\x02\xf2\x61\x17\x95"
- "\x16\x83\x36\xb3\xf0\x33\xea\xae\xfe\x99\xd8\xef\xb7\xce\x5b\x43"
- "\xfb\x65\xa8\xe7\x67\x6a\xdd\x6b\x38\x93\x7e\x31\x65\x9a\x5c\x33"
- "\x7f\x53\x18\x2d\xe3\xd2\x1e\x05\xd5\xad\x0c\x66\xe8\x43\x83\x19"
- "\x31\x54\x3f\x95\x45\xfa\x49\x11\x5b\x3d\xd8\xcf\xc8\x27\x33\xaf"
- "\x9c\x99\xc0\xe9\xac\x06\xca\x15\xed\x71\x40\xfe\x8f\x9b\x59\x33"
- "\xa6\x9d\x45\x85\xa5\xcd\x5d\xf4\x63\xe0\xf4\x6f\x37\x10\x4d\x09"
- "\x19\xbb\xea\x6c\x3f\x23\xfb\x85\xdf\x84\x68\x4c\x43\x98\xe7\xa1"
- "\xd8\xae\xba\xdb\xfa\x99\xae\x08\x73\x47\xee\xe3\xfd\xf6\x3a\xe2"
- "\xa9\x9c\x0a\xe7\xb8\x4f\x20\xdc\xb5\x0c\x40\x6e\xd9\xd8\xd5\x20"
- "\xec\x46\xe2\x27\xbb\x3d\x81\x7e\xb6\xbf\xf8\x4b\xb6\x3f\xe8\x29"
- "\xde\x7d\xd6\x67\x90\xf6\x23\x06\x94\xfb\xdb\xdb\xe9\x9d\x13\xf3"
- "\x25\x33\xd4\x30\xbe\x1c\x08\xd9\x02\xb0\x3b\x2c\xd7\x82\xdf\x6e"
- "\xd0\xe4\x89\xbf\xd2\x87\x6e\xf2\x43\x48\xf6\x75\x4a\xf9\x09\x8a"
- "\x25\xe0\xe4\xc3\x29\xec\xb6\xb5\xa4\xd7\xfd\xed\xae\x78\x3f\x4b"
- "\x57\xcb\xfd\x5a\x2d\xb7\xfb\x52\xe5\x12\xde\xee\xaf\x95\x36\x1b"
- "\x8a\xe9\x84\x37\x84\xb2\x43\xa6\x93\x36\xac\x35\x4e\xe7\x79\xd2"
- "\x9d\xb4\xcc\x40\x3d\xde\xf6\x60\x07\x23\x5f\xa6\xf5\x0a\xd6\xeb"
- "\xaf\xad\x4c\xb5\x95\x71\x9e\x66\xbf\x8b\x53\x78\x4a\x02\xe4\x1c"
- "\xd2\x95\x3a\x89\xce\x92\xee\xb9\x28\xc4\x26\x7a\x40\xe1\xc9\x07"
- "\x1f\xca\xb8\x6a\x2f\xe9\xa5\x41\xab\x42\xdc\xaa\x7f\x6f\xc8\xcb"
- "\xaa\x41\xbf\x85\x4f\xbe\xf5\xd7\x6e\x89\x2f\x61\xf7\x72\xbd\x45"
- "\xd8\x42\x29\x95\xb1\x01\x8c\xad\x55\xb4\xa7\xbc\xb3\x2e\xca\x2e"
- "\x27\x06\x75\x3d\x4f\x76\x39\xdc\xd8\xb9\xa8\x8e\xd6\x4c\x8c\xd9"
- "\xb0\xeb\x77\xbb\xbd\xec\x37\xc2\xf7\x49\x05\xe9\x01\x04\x9d\x6f"
- "\xb9\xc9\x17\x7b\x8c\xf6\x67\x28\x3e\xa1\x4e\x29\x08\x36\x57\x9f"
- "\x01\xdf\x23\xe0\xd1\x12\xdb\x3e\x30\xec\xe6\x65\xc7\xdc\x34\x8f"
- "\xd4\xb2\x2d\x28\xbb\x8b\x6f\x3c\x86\x75\xb4\x25\x45\xd2\x1a\xba"
- "\xff\x9d\x38\xff\x1d\x1c\xa1\xf3\x3c\xbf\xb3\xd7\x5d\x20\x9d\xdc"
- "\xef\x92\xc0\x17\xba\x07\x8d\xc7\xdc\x3f\xb0\x16\x83\x07\x68\xb9"
- "\xdb\xab\xfb\x8b\xd8\xdb\xd1\xfc\x0b\x8e\xb7\x07\xc5\xb7\x5a\x4d"
- "\x1e\x14\x02\x1e\x37\xf1\x24\xfb\xfd\xce\x0b\x90\xf3\x47\xb0\xb6"
- "\x5e\x80\x9c\xc0\xb7\x66\x98\xab\xa6\xb1\x34\xbc\x9b\x76\x92\xb5"
- "\x3c\x1f\xd4\xb3\x44\xfc\x12\x7c\xd7\xe6\xc4\xa2\xdc\x74\xd2\x7f"
- "\x1e\x38\x4b\x7b\xb2\x2d\x82\xee\x57\x6f\x61\xc9\x0a\xca\x23\xbd"
- "\x6b\xf5\x34\x96\x4c\x3a\x57\xa4\xa5\x64\x86\xe4\x9e\x84\x26\x53"
- "\xad\x9f\xc6\x52\x47\xd7\xdb\xa2\x9e\xf1\xfb\xbd\x58\xe3\x57\xfb"
- "\xd8\xf5\xf6\xef\xf3\x9e\x3e\xf6\xee\x72\xee\x8a\xe1\xfc\x5a\xab"
- "\x5e\xca\x14\xef\x3e\x66\xa9\x95\x78\x27\x74\xf0\xc0\x37\xda\xe3"
- "\x50\x75\xbb\x3a\xe1\x57\xd1\x74\x28\x95\xce\x53\x88\x34\x5d\x02"
- "\xc1\x32\x41\xb4\x43\xf5\x85\x16\x5a\x7f\xf3\x22\x2a\x83\xda\x93"
- "\xb9\x58\xea\x85\xc9\x4f\x1a\x60\x2c\xe2\x4c\x55\x6c\x61\xe6\xe7"
- "\xb6\xb0\x84\x03\x4b\xa9\x5f\xef\x6e\x90\x73\xd1\xc0\xa8\xbd\x4a"
- "\x19\xcd\x33\xe0\x04\xda\x4d\xf5\x11\x6e\xb4\x07\xbf\x76\x3b\xf3"
- "\xb9\xe2\xfe\x19\xf9\x14\x78\x77\xaf\x3b\xb7\x89\xcd\xeb\x0d\x4a"
- "\xdf\x3e\x0b\x99\x6f\x3b\xca\xdb\x3e\x8d\x25\xa0\xac\x4f\x3d\xcb"
- "\x89\xd6\x5a\x67\xba\x73\x77\x51\xd9\xc7\x68\x3d\xaa\x04\x7c\xe4"
- "\xba\xf4\xfb\x5a\x4f\xa0\x93\x91\x5f\xf9\x47\xec\x3c\x44\xe5\xf4"
- "\xb1\xdf\x5f\x27\xfa\xbb\xd5\x6a\xcb\x94\xbe\xec\x44\x5f\xc3\xfa"
- "\x76\xb5\x1f\x9e\xb3\x54\xde\xef\xd3\x3c\x8b\xc0\x73\xaa\x7d\xd2"
- "\x60\x2d\xf1\xeb\xf7\x4f\xb9\x73\x77\x30\x1a\x1f\xca\x8f\xe7\x85"
- "\x9e\x01\xe4\x3d\x35\x7a\x5c\x28\x0f\xde\x55\xa2\xdc\x7f\x8c\xec"
- "\x23\xd1\xfe\x46\x24\x4f\x1d\xfa\x03\x58\x75\x6c\x05\x8c\xa4\x7e"
- "\xed\xdd\xf3\xd4\x56\x2f\x7b\x37\xe0\xc9\xff\x72\xec\x73\x4c\x98"
- "\xfb\xc0\xfb\x92\x76\xa1\x5b\xfa\xfd\x89\x47\x82\x0a\x97\xf4\xec"
- "\x0f\x75\xe0\xdd\x20\x1f\xff\xa1\x8e\x68\x81\xa0\x27\xb7\xd2\xde"
- "\xef\x1f\xb6\x59\x74\x72\x7c\xa9\x2f\xc4\x33\x8d\x35\xc6\x51\x7a"
- "\xfd\x04\x6a\xab\x36\xc6\xdc\x6c\x69\x53\x68\xbf\x66\x1a\xe0\x3d"
- "\x62\x65\x12\xff\x78\x0d\xca\xad\x54\x79\x48\xaf\xba\x9e\x7a\x07"
- "\x63\xbb\x1a\xf9\x33\x56\xa6\xd9\xec\x61\xfe\xee\xc8\x94\x76\x90"
- "\x56\xa2\x51\xdb\xf5\x72\xee\x50\x1b\xd5\x6f\xbb\xe5\x3e\xf2\x1f"
- "\x16\xe2\xfb\xee\x31\xfb\x1b\x33\x8d\xe2\x08\x3b\xc9\x6f\x9f\x38"
- "\x5f\x00\x5a\x85\xf5\x60\xa2\xc7\x7f\x81\xc9\xbd\xed\xdd\xd7\x50"
- "\x8c\x77\x3a\x5b\xa6\xb5\xed\xf2\x74\xf0\x7f\xe8\x95\x3a\xf8\xdd"
- "\xc9\x9a\xbc\xc9\xcd\x80\xb1\xcb\x22\x7c\x8c\x83\xef\x52\xfc\x71"
- "\x96\x0e\x5f\xdc\x4c\xd5\x86\x62\xf7\x5c\x1e\x27\xe9\x6d\x66\x80"
- "\x15\x53\xbf\x54\xb9\x6b\x22\xf5\x19\xe5\x2c\xd7\xf6\x82\xb5\xb2"
- "\xc7\xf5\xdb\xaf\xf5\x0d\x7d\x12\x7d\x43\x1f\x45\xdf\xc8\xaf\x86"
- "\xec\x9b\xd8\xcb\xbc\xbc\xfe\xec\xde\x25\xd7\x1e\x4b\x87\x7b\x1a"
- "\x95\xf1\x7e\x89\xb0\xe9\xc7\x98\x80\x3e\x5c\x7d\x92\xbd\x77\x37"
- "\x37\x3d\x67\xba\xbc\x32\xdf\x93\x31\x12\x2b\x66\xb2\x97\x40\x83"
- "\xe5\x39\x23\xb2\x6f\x79\x7f\x19\x68\xb9\x90\x61\x06\x51\x1f\xf0"
- "\x23\x8a\x0e\xbd\x37\x40\x63\x75\x6b\x13\x4b\x97\x78\xf8\xde\x11"
- "\xd2\x4b\xc8\xb8\x2a\xef\xd5\x00\xef\x17\x08\x58\x87\xed\x3b\x75"
- "\xc2\xbe\x33\x9a\xc6\x5e\x66\x1b\xa5\x4c\x13\x1f\xdb\x80\xfb\x62"
- "\x61\xc3\x83\xf6\xae\x0e\x6a\xf4\xef\xbd\x62\x4e\xba\xe1\x22\x55"
- "\x47\x48\xb4\xac\x48\xfa\xe5\x1a\x76\xbd\x6f\x0b\xeb\x08\xe9\x1c"
- "\xa6\x8b\xb7\x51\x3e\x8c\xfd\xd7\x94\x47\xfa\x0d\x3a\xa9\x9e\x51"
- "\x7c\xff\x3b\xea\xf9\xc3\x14\xb2\x6b\xc2\xb7\x0b\xbd\xac\x47\xc8"
- "\xab\x04\x03\xaa\x5b\xb4\x5d\x4f\xfa\xc0\xf7\x1d\x11\x9d\xec\x7b"
- "\xf2\x4c\xa3\xb0\x7f\x79\xbf\x46\xc3\x11\xf4\x77\xa2\xf4\xa5\xbf"
- "\xfb\xfc\x9e\x54\x26\x70\x60\x90\x5b\x4d\xdf\xaa\x23\x9c\x7c\xbf"
- "\x25\x1a\x4e\xf3\x82\x8a\x53\xd2\xa0\xf7\x1a\xb8\x98\xeb\xef\x35"
- "\xfc\x75\x7e\xe2\x83\x38\x8d\x17\x91\x70\x4e\x00\x7d\xf9\xb0\x53"
- "\xc0\xba\xec\x23\x92\x9f\x2c\xcf\x14\x91\xef\xde\x0f\x0e\x90\x8f"
- "\xe4\x60\xd9\x47\x8b\x42\x4e\x2b\xf9\x84\x64\x4a\xd9\x47\xf6\x3e"
- "\x3b\xd3\x67\xda\x49\x0f\x7d\xac\x86\x64\x3c\xc8\xac\x09\xdc\x04"
- "\xfe\x04\xf3\x7c\xdd\x32\x66\xf9\xf7\x1c\x94\xed\x4c\x49\x24\x1f"
- "\xc6\xe4\xbf\x98\xfc\x8f\x87\x9c\x29\x57\xe0\x7e\x2a\xf8\xb9\x04"
- "\x6e\xfc\x68\x3e\xed\x65\x87\x5c\x1c\xf4\xb8\x9b\xfc\x28\xeb\x3d"
- "\xbe\x00\x5b\x77\x8a\x19\xc9\x47\x72\x70\xe3\xb1\xc6\x76\xff\x57"
- "\x42\xbe\x89\xb7\xb3\x44\xf0\x1f\x49\x80\xb9\x55\x89\x3d\x06\x39"
- "\xf4\xd8\x26\xd9\xef\xaf\xb9\xec\xb7\x6c\x37\xb5\x5f\xd0\xb8\x32"
- "\xa0\xb4\x68\xfb\x87\x4f\x07\x51\xbe\x52\x76\x60\x79\xa8\xec\x40"
- "\x8e\x3c\x07\xbb\x9f\x15\xe5\xf3\x7e\x8f\x7f\x3f\x64\xae\x73\x22"
- "\x5e\x14\xed\x95\x53\x1f\xa9\x7f\x54\xf7\x27\x67\x4f\x09\x9f\xcf"
- "\x41\x3c\x3b\x97\xab\xdf\x0c\xe0\x9b\x81\xfd\xec\x42\xd9\x01\xd1"
- "\xf7\x76\xbf\xfc\x36\x53\xdc\xd3\xf7\x51\x70\x50\xfb\x1c\x86\x03"
- "\xfa\x4e\xfd\xa3\xfe\x07\x09\x26\x80\x81\xda\x57\xeb\x88\xda\x4f"
- "\xea\xe3\xc7\x58\x75\xb6\xa0\x9f\xe8\xab\xe8\xe7\x08\xfa\xd9\x96"
- "\xc3\x58\xa0\xca\xe2\x3d\x6f\x3a\x90\x43\x32\xaa\xf3\x53\xf0\xf0"
- "\x85\x35\x0c\xb2\xa8\x61\x67\x51\x8d\xbe\x1c\xbc\x49\x91\x0f\x32"
- "\xa9\x8f\xf7\x93\xbd\xab\xc7\x8e\x5f\xb0\x8e\x11\x8f\xa3\xf1\xeb"
- "\xa8\xdb\xfa\x89\x72\x8c\x15\xf5\xf3\x7e\xf0\xa6\x01\x4f\x10\x79"
- "\x72\xd0\x7f\xc8\xb0\x7d\x6a\xfb\x29\xef\xba\x33\xb2\x5f\x96\xe5"
- "\x2c\xf1\x83\x1f\x97\xe9\x3d\x9d\x65\x4c\xeb\xcb\xe3\xc8\x87\xfe"
- "\x58\x51\x56\x1c\xf5\x47\x41\x3f\xb7\xa2\x9d\x81\xa8\x3e\x1d\x18"
- "\x20\x9b\xdb\xcf\x99\x69\x3e\xd3\x6d\x39\x8d\x7e\x9c\x66\xd6\x9a"
- "\x22\xf0\x5f\x8f\x12\xbf\xe8\x7e\x73\x72\x06\x03\x2d\xfd\x40\xc6"
- "\xab\x94\xfe\x57\xaf\x3a\xc9\x3e\xfc\x34\xec\x63\x95\xfc\x56\xc7"
- "\x1e\x6b\x22\x3c\x12\xbe\x56\x69\xcd\x18\x06\xce\xd0\x9e\xf6\x6a"
- "\xd4\x31\x9c\x32\x55\xb4\xc7\x75\x17\xd9\xd4\x9a\xf1\x4c\xf1\x5a"
- "\xe8\x8c\x99\x0e\xdf\x35\x72\xc0\x8c\xca\x07\x3f\xb7\x89\xae\x04"
- "\xc3\x31\xed\x53\xdf\x62\xb3\x50\x47\x1d\xc9\xdf\xcd\x45\x3e\xfd"
- "\xb3\x6f\xb1\xd4\xcb\xa3\x29\x7f\x64\xe3\xd1\x6f\xd2\x65\x52\x79"
- "\xe8\xdb\x15\x27\xd9\x1f\x8f\x8d\x9e\x63\x36\x41\xcb\x24\x1d\xfc"
- "\x63\x13\xe9\x0a\x2f\xb3\x5e\xc1\xc3\x91\x3d\xc2\x65\x7e\xd7\xac"
- "\xb5\x03\xf7\xdf\xb0\x23\xd2\xda\x7e\xf9\x70\xd8\x63\x1c\xaf\xac"
- "\xca\x97\x85\x3d\xa1\xb3\xea\x65\xd0\x0b\xf0\x0a\x7b\xac\xb4\xef"
- "\x80\xb5\x73\x87\x9f\xe5\x6d\x63\x46\xe7\x29\xd2\x0b\x3d\xcc\xf6"
- "\xd4\xa5\xb1\xfa\xb3\xe4\xe7\x29\xe5\x8a\x17\xcf\x62\x2c\x55\x1a"
- "\x42\x3c\x29\xe9\x5c\x79\x5e\x4a\x42\xf5\xcb\x1a\x0f\xbf\xe7\xd3"
- "\xc2\x73\x4c\x2f\x63\x74\xef\xe9\x98\x6d\xe3\xc1\x4d\x7a\x25\xa7"
- "\x8e\x7c\x07\xc7\x9b\x88\x07\xcd\xd1\xfc\xf1\x0a\xde\xc7\x81\x39"
- "\x37\x68\x35\x55\xe6\xb2\x54\xf2\x21\x6e\xf1\x49\x5e\x4e\xae\xd7"
- "\xad\xb4\x1f\x92\xa0\xfa\xe8\x4d\x90\x3e\x7a\xff\x38\x87\xec\xb3"
- "\xd5\xf7\xb7\x87\x20\xc3\x88\x72\x73\x59\x72\xdd\x59\x96\x42\x7c"
- "\x50\xe6\x31\xc9\xb3\x91\x5c\xf8\xf0\x80\x85\x87\xfe\x3b\x85\x6d"
- "\x3b\x19\xf1\x31\xee\xcb\x23\xbf\xe4\xdc\x3a\x9e\xad\x71\xf5\x54"
- "\xb1\xf7\x2e\xfc\x5b\x92\x4e\x1e\xcf\x6c\xd3\x0b\xcc\xb0\x87\xec"
- "\xf8\x1a\xe4\xb9\xa5\x3d\x41\x69\x1b\x3b\xec\x6a\x6d\xd0\x7c\x2f"
- "\x8f\xbb\xb7\x5c\x26\xe5\x1d\x65\x22\xe4\x2f\xdf\xb0\x5b\xfa\x0d"
- "\x6c\xed\xf7\x6c\x50\xa2\x64\x9c\xd6\x7d\xf4\x8e\xd2\xc8\x17\x53"
- "\xba\x80\xe5\xde\x04\x92\x7b\x54\x99\xf1\x03\x9b\x96\xa6\xca\x8c"
- "\xc2\x3e\xd9\x2a\xf7\xca\xb0\x36\xc5\x0f\xbb\xf6\xa6\x6a\xeb\x19"
- "\xad\xeb\x52\x37\xbc\x37\xdd\xab\xfb\x6a\xc7\x25\xda\x97\xa0\xda"
- "\x53\xd3\x3e\x47\x3a\xf2\xdb\xb5\xf5\x4d\xec\x77\xae\x9f\x76\x7f"
- "\xde\x1a\x96\xf4\x83\x6b\x8c\x8c\xf6\xca\x90\xb7\x5f\xae\xbb\x7b"
- "\x6b\x23\xfa\xf4\x74\x01\x6f\x3a\x57\x2c\x64\x0c\xf2\xd7\x27\xfd"
- "\x88\x0f\x68\x7e\xfb\xe4\xfa\xbb\xf7\x37\x51\xf5\x74\x86\xd7\x51"
- "\xd4\x41\xf6\xda\x54\xbe\xe4\x4d\xf6\x56\x88\xb3\x67\xc8\x27\xd7"
- "\xd7\xbd\x15\x97\xe0\xc5\x52\x08\xbe\x8a\x2a\x4f\x7a\x06\x8e\x4b"
- "\xf8\x3a\x58\xcc\x6d\x9b\x98\xf5\x83\x22\xaf\x21\x5e\xfa\xc5\xb5"
- "\xf4\xb0\x8f\x6e\xa2\xf7\x84\xeb\xee\x5b\x49\x1f\xf8\xd1\xb3\x1e"
- "\x5a\xb7\x47\x32\xcc\x8f\x90\xac\x2f\x78\xf1\x8f\xf2\x6f\xc1\x77"
- "\x48\xbb\xe2\xfd\xd3\x01\x43\xf5\x5a\x96\x2a\xfd\x1f\x7e\x24\xe4"
- "\x0d\xdf\xd5\x4f\x0e\x7f\x2b\x91\x59\xbf\xb5\x89\xa5\x0c\xbb\x3e"
- "\xaa\x83\x7c\x29\xf6\xf5\x45\xfd\x55\x33\xd3\xc8\x87\xfa\xdb\x17"
- "\xbc\x13\xe4\x58\xfd\xe9\xbb\x78\x4e\x89\x3c\x7f\xf4\xb9\xba\x97"
- "\x02\x5e\xe3\x4f\xb3\xb6\x9f\x96\x76\xe7\x42\xbf\x54\x61\x6a\x8e"
- "\xec\xd5\xff\xe9\xbb\xb2\x2d\x7f\xfa\xee\x1e\x3b\x23\xdd\xf9\xc1"
- "\x7a\xe1\x0f\xf9\x4f\x90\x39\xf6\xce\x55\xf5\x31\x1d\x02\xaf\x88"
- "\xdf\x2d\x25\x19\xec\xb8\xbb\x12\xf9\x68\x9d\x00\x7f\x94\x2e\x78"
- "\x78\xf0\xba\x0a\xf0\x27\xaa\xff\xaf\x91\xbe\x71\x4c\x9a\xb8\x85"
- "\x31\xf1\x4d\xa5\x49\xda\x7e\x54\xce\x2c\xc3\xd5\xc8\x2b\x27\x37"
- "\xe3\x6a\x46\xba\x1b\x57\xc2\xbd\x16\x5c\x13\xf1\xde\x4e\x78\x09"
- "\x19\xd6\x4a\x71\xe1\x06\xe3\x4c\x6c\xbc\x33\x44\x04\x1b\xcf\x86"
- "\x1f\x32\x69\xdf\xd6\x96\x44\x31\xc1\xe6\x6d\x63\x2c\x2f\xc8\x2f"
- "\xd8\xae\x27\xbf\xfe\x6d\x49\xce\x6d\xb4\xef\xfc\x27\xdf\xe8\x7d"
- "\xe7\xb6\x04\xfc\xe6\xe3\xb7\x03\xbf\x83\xf8\x25\x45\x7e\xfb\x12"
- "\x86\x5d\x6d\x49\x80\xa3\xe0\xb1\x2e\x8f\x26\xb6\x09\xdf\x5a\xd5"
- "\x24\x17\xc5\x9e\xe8\x90\xfd\x9d\xe1\xc5\xb3\x91\xc7\xcd\xb4\xa9"
- "\xfd\xed\xc0\x73\x82\xcd\x89\x75\x2d\x0e\x30\x99\x86\x3e\xc7\xcd"
- "\x2c\xa3\xfe\x52\x7b\x07\xe3\x26\x37\x47\x9f\x9f\xa2\x32\xa9\xff"
- "\xbe\x38\x13\x95\xc7\xf8\x8d\x2b\xd3\x34\x78\xaa\x70\xa2\xb3\x25"
- "\xfa\x41\x94\x21\xf9\x20\xe4\x47\x19\x5a\xfe\x30\xec\x91\x4f\xc8"
- "\x89\xc8\x07\x99\xd8\xa8\x9d\xcd\x1a\x76\xed\x33\x7e\xb8\x5c\xee"
- "\x67\xd0\xb7\xfe\xa8\x6f\xc9\x5f\xc8\x58\xdf\xa3\x4e\xa3\xac\x73"
- "\x72\x73\x1f\x6b\xbb\x4e\xad\xf7\x1b\xbe\x33\xc3\xe7\x1f\x67\x80"
- "\xbf\xab\xf3\xd2\x39\x22\xe2\x87\xee\xf6\x24\xf9\x99\xa7\x4e\x61"
- "\x4a\x95\xc9\x9b\x5e\xc4\xdd\x7d\x6c\xdf\x7b\xed\x81\xfe\xcb\x5c"
- "\x0f\xf7\x09\xdb\x3b\x7e\xa1\x98\x79\x0a\xef\x10\x72\xd8\x69\xf6"
- "\xf1\x29\x8f\x4f\x9c\xd1\xa5\xfb\x2e\x7a\x4f\xfb\xcd\xb4\x36\x40"
- "\xc6\x0e\xfb\xa6\x57\x90\xb7\x9e\xd2\x91\x46\x7e\x04\xb6\x47\xbd"
- "\xe3\x55\xb1\xfd\x72\x4e\x7d\xfc\x1a\xf1\x16\xa2\xbd\xc1\x7f\x76"
- "\x53\x9b\x95\x8a\xd8\x7e\xea\x83\x13\xf2\x1f\xc5\xe3\xa3\x39\x61"
- "\x2b\x20\x5d\xe1\xc7\x25\xc0\x3b\xae\x54\xc6\xf6\x5f\x5e\x1f\x3e"
- "\x16\xe7\x8f\x9d\x41\x7e\xda\x17\x17\xdb\x4f\x3c\x49\x75\xd1\x04"
- "\xe3\x03\x75\xdc\x3d\x18\x6f\xf2\x0e\xbb\x3e\xde\xf1\xa1\x43\x8e"
- "\xcd\x65\x96\xbb\x43\xeb\x7b\xbd\xda\x77\xa4\x89\x3d\xaa\xdb\x6a"
- "\xa5\xcf\x7e\x3c\x77\x8f\xab\xb3\xc2\x38\x13\x3f\x80\xb5\xe1\xbc"
- "\x84\xc5\x27\xa9\xe1\xb5\xe1\xb2\xda\xf1\x49\xea\xdf\x50\xc7\x88"
- "\x5a\x47\xcd\xdf\x59\x47\xcd\xa5\xea\x90\x7b\xcd\xfb\x93\x2e\x5f"
- "\x76\xfc\x44\xc4\x48\x06\xfd\xec\x90\x34\xf3\x40\x65\x08\xf2\x5b"
- "\xd0\x3c\x83\x62\x48\x39\xc9\xae\x94\xe2\x17\x04\xcb\x4e\x74\x1c"
- "\x70\x5c\x60\xee\x82\xcf\x58\x2f\xdb\x2f\x7c\xd8\x1c\xc8\x27\x99"
- "\x6d\xa6\x6d\xa4\x6a\x72\xda\x88\xfe\x93\xe5\x04\xef\x6d\x18\x87"
- "\xad\x51\x78\xd6\xee\xff\x8c\x79\x16\x91\x7e\xb5\x83\xf4\xda\xa0"
- "\x05\x33\xbc\x0a\x68\x03\x78\xf4\x90\x80\x07\xf8\x17\x21\x6f\x41"
- "\x66\x13\xf2\x96\x4f\xf8\x39\x8d\x13\x71\x09\x5c\x2f\x26\x93\xee"
- "\x3b\x34\x92\x61\x1b\x76\xb1\xf9\x14\xaf\x80\xf4\xce\xdc\xd8\xe9"
- "\x98\x17\x8c\xe1\x42\x9e\x02\xef\x4f\xf1\x0a\x3c\x7e\x2f\x0b\x81"
- "\x8f\xae\x1b\x62\x89\x75\xe0\x3d\x41\xb3\x13\x88\xae\x6f\x57\x63"
- "\x16\x54\x0e\x45\x62\x16\xd4\x93\xae\xa7\x13\xf7\x43\xcc\x10\xaa"
- "\xb4\xb4\x6d\x1d\x62\xc9\xdb\x0a\x58\xca\x56\xd2\xe5\x9d\x90\xbc"
- "\x8f\xb0\x03\xa7\xf8\x05\x2b\x53\x68\x2f\x21\xc2\xfb\xd0\x99\xf2"
- "\x08\xdd\x32\x08\x1d\xc8\x65\xc1\xfb\x80\x58\x07\x83\x15\x26\x63"
- "\xd0\x3c\xb3\x0c\xb0\x6b\xf6\xb2\xfd\x15\x80\x9f\x71\xac\xb1\xd5"
- "\xec\x49\x36\x45\xc5\x9c\xf8\x30\x59\xd2\x77\x94\xd5\x31\x1e\x4e"
- "\x84\xb6\x66\xb0\xdb\x06\x58\x9a\x3c\xcf\x18\x8b\x35\xb1\xfd\x2e"
- "\xb2\xff\x2b\x7a\x8a\x59\x43\x5b\x17\xea\x9c\xaf\xb0\x18\x4f\x30"
- "\x9d\xd1\xaf\xe8\x0c\xef\xbf\x6d\x39\x4b\xa3\xfd\x07\xda\x2b\xb1"
- "\x3d\x23\xf2\x4f\x48\x2e\x64\x69\xd1\x65\x3f\xb5\x26\x77\xd9\xed"
- "\x69\x3f\xcd\xb6\x2d\x5d\x96\xfb\xd4\xea\xc5\xb9\xd9\x6c\x8e\x34"
- "\x9b\x10\x2e\xa4\xd7\x90\xcd\xc4\xea\x65\xf9\x39\xb6\x25\xab\x72"
- "\x73\xb3\x57\xe4\xdb\x1e\x7e\x60\xfe\x37\xfd\x08\x6e\xb5\xee\x10"
- "\x7e\x63\x85\x0d\x9d\xe7\x18\xff\xc5\xb7\x87\xaa\x0a\x98\xc1\x52"
- "\xf2\xe0\x02\x4b\x70\x8e\x4d\xc6\x32\xea\x30\x92\xdd\x2a\x77\x66"
- "\xd4\x4a\x3e\xb5\x23\x56\xca\x53\x87\xd3\xe4\xd9\x8a\x0e\xa9\x93"
- "\x19\x9e\x93\x24\xe7\x94\xe7\x9a\x98\x7c\x46\xf7\x4f\xd1\xbd\x25"
- "\x9f\x95\xb9\xa7\xd1\x7e\xb8\xe7\x1a\x91\x6f\xeb\x5c\x9d\x96\x4f"
- "\xcb\x23\xdf\xb7\x8b\xb3\x10\xf5\xc2\xa7\x66\x7b\x3a\xe0\x73\xc5"
- "\xb0\xcb\x93\xe6\xd5\xb7\x76\xaa\xfb\xeb\xfd\xd2\x5e\xaf\xc3\x48"
- "\x7e\xf5\xf8\x2f\xae\x1d\x52\xcb\xc9\x41\x7d\x93\x91\x77\x21\xc6"
- "\xa0\x57\xb5\xeb\x9b\xde\xa3\xb6\x4b\xda\x9d\xb6\x3f\x2a\xed\x3b"
- "\x3c\xc5\x51\xe7\xba\xc5\xd9\x7c\x5a\x1b\x55\x9e\x74\x58\x2d\x6f"
- "\x87\x46\x13\x90\x1f\xf8\xf0\xe2\x9c\xcb\xa7\x85\x1e\x29\xff\x8c"
- "\xf2\x97\xa2\xc2\x69\xab\xf5\x75\xd0\x87\xa4\x93\xac\xbd\xf6\x62"
- "\x7c\x09\x8f\xe0\x43\x2b\x96\xac\x7c\xca\xbe\x38\x7f\xd9\x13\xcb"
- "\x96\x2f\xcb\x5f\x23\x8e\x93\xa7\x8a\x7f\xff\x74\x43\xd6\x82\x8b"
- "\x7d\x40\xa7\x92\x8e\x45\xf5\x1d\xeb\x27\x9b\x06\xa9\xe7\xea\xd8"
- "\x16\x74\xb1\xe9\x97\xd7\xee\x0e\x61\x23\x58\x27\xfc\x18\x74\x34"
- "\x79\x75\xdd\xbb\xd4\xfd\x8e\x01\x15\xf6\xe2\xfd\xa0\x79\xa6\xdd"
- "\x36\x8d\xdd\xdd\xc3\x0e\xce\xa5\x7d\x2e\xc0\xcf\x4d\xeb\x61\xd5"
- "\x5a\x5a\xb7\x30\x0a\xc1\x3b\xd4\x38\xaa\x9f\xbe\x4b\x30\x20\x9e"
- "\x10\x30\xd8\xd1\xc3\x3e\x9d\x21\x60\xf0\xb5\x75\x87\xf0\x61\xf0"
- "\xb5\xf5\x75\xc2\x2d\x6a\xb3\xc2\x33\xb6\x72\x9e\xb1\x45\xf9\x3a"
- "\x67\x2b\xff\x3a\x67\x4b\xc4\xff\xdc\xa7\x15\xf8\xb6\x09\xdf\x3e"
- "\x4f\xf1\x61\xaa\x4e\xb3\x26\xda\xff\xa6\x67\x4b\x7e\x02\x0b\x99"
- "\x4d\x2d\xd4\x1e\x4f\x7f\x9a\xe0\xb7\x7b\x91\xdf\xe3\xbf\x83\x81"
- "\x97\x74\x8b\xb3\x91\x62\xbf\x0e\xfc\x1e\xbe\xf3\xa0\x5d\x9e\xfe"
- "\x0b\xc4\x5b\xb4\x28\xe0\xf9\xd0\xdf\xdd\xa0\x7f\x8c\xca\xa5\x3e"
- "\x8b\xf3\xc9\x53\x39\xd6\xc0\x4f\x1b\xbd\xac\xdd\xa1\xf2\xa6\xc2"
- "\xde\x82\x60\x30\x7a\x3c\x3f\x15\x7e\x8c\x01\xe3\xab\x79\xd9\x47"
- "\x35\x72\x4c\x3f\x3d\x42\x69\x73\x7b\xf9\xd7\x91\x73\xf1\x9f\x9e"
- "\xc3\xf3\x08\x7e\x0a\x2f\xfb\x53\x73\xd4\xbe\x32\xde\x7d\x26\xfd"
- "\xab\x4f\xe5\x3e\xfb\x5a\x8a\xaf\xfd\xd9\x4d\x12\x6f\xfe\xf4\xb6"
- "\xcf\x99\x13\x83\x6f\x42\x74\x8e\x53\xc2\xf2\xb3\x87\x3c\x1b\x4e"
- "\x6b\x76\x1a\xa8\xff\xb3\x13\xee\xa5\x41\x26\xe2\x3d\xf7\x06\x85"
- "\xdd\x9f\xea\xab\x40\xa7\xb8\x3a\x12\xc9\x5e\x1c\xb2\x1d\xed\x45"
- "\x0b\x5f\xeb\xc3\xae\xcf\x0a\xc3\xe7\xc4\xcc\x92\xdf\x23\x9e\x8b"
- "\x62\x60\x11\xee\x13\xff\x46\x6d\x22\xdc\x47\xd9\x8d\xb4\x47\x2d"
- "\xe7\xc0\x67\xbb\xfe\xbe\x39\xf0\x99\xd0\xff\xa2\xac\x39\x5c\xef"
- "\xe4\xb7\x55\xb0\x45\xc2\x86\x20\xe8\xa7\xf3\xb7\x06\xac\x1b\xcb"
- "\x25\x3d\x39\x78\x83\xb0\x33\x29\x18\x68\xa0\x33\xae\xdb\x2f\x30"
- "\xb3\x52\xd6\x69\x27\x3e\xfb\x40\xa1\xb0\xbd\x30\xe2\xbb\x66\xb2"
- "\xcd\x20\x5b\xba\x78\x11\x63\xed\x33\xb6\xfd\x1c\x33\xf4\xb2\x3f"
- "\xdf\x45\x7b\x41\x11\x58\xff\x79\x23\xed\xfd\xf1\xf2\xbd\x29\x96"
- "\x42\x7d\x19\x95\xa1\x0c\x9d\x9a\xa5\x7d\x47\xb1\x7c\xe9\xbb\x1e"
- "\xf6\xe7\xa7\xc4\x77\x94\x97\x7c\x35\x15\x25\x2c\xc4\x9a\x2b\x78"
- "\xfb\x20\x9e\xeb\x95\x84\xf9\x1c\xeb\x41\xa8\x20\xd8\x8c\x77\x0b"
- "\x94\x8a\xc9\xcd\x48\xcb\x10\x7b\x10\x23\x56\xda\x9b\x64\xdc\x78"
- "\xcc\xed\xf1\x1e\x17\xf2\x88\x38\x93\x9b\x8f\xb5\x53\xc8\x25\x7f"
- "\xfe\xb0\xfe\x04\x33\xd8\x97\xd2\x78\x1e\x14\xba\x56\xe0\x5e\xa3"
- "\x6c\xdf\xc1\xc7\x06\xcb\x0f\xe4\x0c\x02\x37\xfd\x7a\x23\xdb\x63"
- "\x0d\xd0\x9a\x6d\xdf\x63\xbd\x80\xf1\x39\x98\x04\x5a\xa7\x9e\x7d"
- "\x94\xdf\x69\x38\x19\x63\x4d\x78\x04\xef\xef\xd6\xec\x91\x34\x7c"
- "\xf4\xb2\x3f\x27\x12\xdc\x80\xc7\xde\xf6\xe5\x11\x9f\xa6\x83\xf2"
- "\xfc\x1a\x64\x8a\x83\x76\xcd\xc6\x2e\x34\xa4\xec\x47\x3b\xc8\x3f"
- "\x87\x23\x54\xa0\x74\xd3\xde\xf9\x23\xe7\x14\x4e\xb6\xfd\x74\x4e"
- "\x83\xe4\x9e\x79\x0e\x3e\x48\x72\x1c\x9d\x89\xa2\x7d\x73\x3a\x33"
- "\xbe\x0d\x72\x30\xb5\x01\x65\xed\xd6\xce\x8e\x57\x22\x8d\xda\x40"
- "\xe7\x9e\xaa\x7e\x26\xe6\x24\xe9\x36\xcc\x62\xef\x20\xe6\xc9\x13"
- "\x8f\xf8\x51\xe6\x69\xb1\xe7\x35\x58\xaf\x96\x43\x7e\x7d\x86\x5d"
- "\x9f\x33\xad\x0c\x85\xec\x64\x73\x85\x3d\x9c\x57\x7e\x2f\xed\x84"
- "\x1e\xf1\x2b\xe2\xbc\x0a\x7d\x2f\xed\x77\x3e\xbf\x2b\x6c\x6b\x29"
- "\xce\x90\x7c\x3e\x5b\xf3\xfb\x83\xfb\xf9\xe1\x33\x70\x80\xe9\x60"
- "\x85\xa9\xc5\x0f\x5a\xe0\xaf\x30\x01\x9e\x9f\x2f\x07\x25\x6a\xba"
- "\xa4\x2e\x83\xfc\x05\xac\x62\x7a\xc5\xd4\x59\x47\xbe\x20\xe8\x6c"
- "\xa7\xb4\xef\xfe\xfc\x80\xea\x17\x22\xe6\x34\xfb\x7c\x63\x64\x0f"
- "\x3d\xa4\xea\x7f\x3f\xf7\x4b\xf9\xe3\x73\xbf\xd0\xff\x56\x99\x1a"
- "\x5e\x5d\x1b\xd0\x37\xaf\xf5\xea\xa5\xcd\xe3\xe7\xfd\x5e\x76\x28"
- "\x29\x62\xf3\xf8\x79\x23\x95\x35\xb6\xff\x8c\x43\x65\xb2\xcc\xff"
- "\xfa\x4a\xf0\x7e\x61\x79\xfe\x0b\x9b\xa8\x77\xfd\xb4\x45\x0a\xf1"
- "\x7e\xa6\x13\x5e\xb2\x6f\xf2\xd8\xcf\x92\x1e\x78\xa2\xd4\x2d\xc8"
- "\x3c\xaa\x3d\xe3\x95\x27\x47\x3f\x5f\x41\xcf\x12\x66\xff\xe5\xd0"
- "\xf6\x94\xaa\xf4\x0a\xc5\xeb\xe2\xce\x06\xd0\x46\xbb\x5f\xf8\x23"
- "\xf0\x80\x97\xa4\x58\xd7\xf6\x5c\x3a\x33\xf8\x5f\x3b\xc9\x4f\x81"
- "\x9c\x9b\x5f\x08\x7a\xad\xb8\xee\xe5\x4e\x92\xa7\x7c\x14\x1b\xe4"
- "\x2c\x43\xbe\x29\xc8\xd7\xd5\x5a\x38\x40\xf6\x61\x59\x14\xf7\xb1"
- "\x57\xad\xdb\x17\x7b\xa8\xec\x5b\x66\xb6\x08\x75\x02\x3f\xdf\x9c"
- "\x7b\xf9\x74\xe3\xbf\x06\x2e\xc5\x5b\x4b\x5e\x2f\x7d\x5c\xf9\x9c"
- "\xf4\x2f\xb7\xa2\xfe\x87\xb9\x68\x7f\x57\x50\x1f\x60\x23\xfa\x49"
- "\xfc\xdb\xc5\x0e\x16\x74\x4d\xe2\xa1\xb5\x18\xaf\x41\x2b\xe4\xb7"
- "\xfd\xac\x5d\xda\xcc\xd0\xbe\xbf\xa5\xc8\xcf\xcf\x7a\x82\xbb\x48"
- "\xff\xef\xc3\x58\x81\x6e\x7d\xf1\xa9\x27\xf8\x1e\x23\x3b\x66\xa2"
- "\x37\x3d\xec\x8b\xf7\xa8\x5d\xb7\xda\x8b\xd9\x2d\xa7\xc5\xfb\x42"
- "\xc9\xf7\x7d\xd1\xa9\x5e\x1b\xc9\x1f\x67\x74\x9b\xfe\x69\xd5\x8a"
- "\x25\xe4\xd4\xf5\x96\xb9\xd9\x05\xd9\xcb\x6d\x8f\x92\xcb\xd7\x8b"
- "\x6c\x12\x8d\x91\xb8\x60\x9d\x3b\x68\x2d\x25\xde\x9b\xe2\x83\x5d"
- "\x2a\x36\x98\x16\x17\x0c\x73\x2e\x99\xf4\xd5\xff\x9b\xb1\xc1\x34"
- "\xde\x9a\xe2\x82\x45\xf6\x6e\xba\xb2\xc2\x73\x40\xf9\x60\x98\x9e"
- "\xc5\xfa\xed\xfa\xa2\x97\xe6\x91\x5c\x5f\x3a\xbb\xa3\x7d\xe6\x08"
- "\xde\x6a\xe3\x31\x37\xd2\xfd\xda\xd9\x4e\xe0\xa2\x79\xd8\xd5\x65"
- "\x88\x9c\x25\xe9\x4a\x00\xdc\xa4\xfd\xb1\x91\xf2\x76\xd9\x34\x1b"
- "\x07\x35\x06\xb4\xb0\xc9\x50\x4a\xaf\x49\x94\x7a\xc5\xae\x1b\xea"
- "\x95\x49\x46\xb9\xa7\xd5\x35\x57\x3b\xab\x24\xe7\xe6\x07\xea\xdc"
- "\xec\xca\xba\x94\x1d\x4a\x64\x6e\x74\x35\x44\xe6\xf5\x61\xed\xdb"
- "\x86\xbf\x66\xc3\xa2\xca\x77\x57\x9d\x64\x7f\xf9\x0d\xe9\x1a\xe5"
- "\xd9\xe4\xbf\x6c\xa3\xb2\xa4\xdf\x89\xbf\xac\x51\xef\x51\xc7\x5f"
- "\x16\xab\xf7\xd7\xe2\xfe\x21\xf5\x7e\x1a\xee\x6f\x57\xef\x31\x67"
- "\xff\x72\x8d\x7a\x9f\x88\x7b\x9d\x7a\x8f\xb5\xe3\xcb\x13\xea\xfd"
- "\x54\xdc\x7f\xaa\xde\x5f\x83\xfb\x77\xd5\x7b\xcc\xc1\x2f\x85\xbf"
- "\x65\xb4\xdd\xd8\xc7\xbe\xac\xbc\x7c\x79\xf3\xcb\x0c\xb9\xe7\xfc"
- "\x65\x2d\xd6\x90\x74\xb9\xf6\x84\xd3\x9a\x30\x36\x41\x0d\xbe\x48"
- "\x9f\x4f\xf5\x20\xbd\xd5\xcb\x5a\x9b\xa2\xd2\xd3\xd5\xfc\xdd\xa0"
- "\x73\x8e\xa8\xf4\xbb\xd4\x74\xd0\xbf\x4f\x3a\xa2\xd2\x53\x64\xfa"
- "\x5f\xcc\x98\xeb\x2c\x2a\x5d\xf5\x11\xff\x97\x64\x2f\x7b\xdf\x1b"
- "\x95\x9e\xa0\xa6\xdf\xad\xd9\xdf\xa8\xe9\x06\x35\x7d\x81\x97\xfd"
- "\xb6\x26\x92\xde\x15\x50\xd3\x41\xff\xbb\xec\x51\xe9\xe1\x33\x2d"
- "\x22\x3e\x5b\x21\xcd\xad\xbf\xd4\x78\xd9\xee\xe2\xa8\x3c\x5e\xf5"
- "\x5b\xf0\x7f\x7f\x68\x8c\x4a\x3f\xa8\xa6\xbb\xbd\xba\xc9\xd1\x65"
- "\xb6\x8d\x47\xab\x74\xb5\x6c\xd1\x78\x3a\x79\x92\x5f\x84\x1d\xb2"
- "\xe0\xa9\xbb\x43\x74\xf6\xc9\xb2\x8d\xf7\xd8\x8a\x38\xef\x61\xdd"
- "\xbd\xaa\xdd\xed\x22\xb2\x81\x94\xe7\xc8\xba\xf7\xab\x3e\x04\x7c"
- "\xe2\x6c\xd9\x5a\x91\x26\x7c\x11\xdf\xe6\x28\x96\xfe\x79\xb5\x58"
- "\x0f\xa4\x9b\x52\xf7\xed\x91\x67\x0d\xe9\xea\xa9\x1c\xd2\x5f\x7b"
- "\xf2\x2f\x48\xdf\xcd\x90\x61\x29\x8d\x74\x34\x04\x8f\x68\x5d\x94"
- "\xa4\xfb\xdd\x21\xe5\x02\x9d\xdf\x94\x7a\x2c\x9a\x8b\x94\x9f\x6c"
- "\xcd\xa2\xf3\x7a\x59\xb7\xd0\xbf\xc5\x58\xa7\xbc\x36\xec\xea\xee"
- "\x8e\x9c\x9b\xe9\xbe\x4b\x4d\xdf\x81\x74\x7f\x54\xba\x6d\x5c\xda"
- "\x0e\x3a\xc8\x8d\x7b\xed\x23\x43\xdc\x1f\x1c\xe2\x81\xaa\x43\xd2"
- "\xe6\x1c\xb4\xee\xfa\x50\xd9\xde\x62\x3a\x57\x42\x31\x15\x83\x05"
- "\xdc\x47\xf6\x8c\x48\x9f\xfc\x88\xdf\x07\x1e\x63\x98\x57\x3e\x41"
- "\xb6\xab\xe7\x18\xed\xab\x3a\x07\x28\x3e\x97\x85\xd3\x79\xe5\x75"
- "\xa7\x98\x99\xce\x9d\x90\x6d\x3a\xed\x79\x3e\x9c\xe3\x63\x07\x72"
- "\x42\xac\x1e\x65\x6f\x7b\x42\xe3\x2f\xbe\xda\x14\x39\x13\xbb\x97"
- "\xf6\xa1\xaf\x77\x8a\x18\xb2\x5f\xed\xa5\xb6\x5a\x4a\xc8\x1e\x60"
- "\x66\x2d\xff\x23\xf1\xc6\xb1\x3e\x4b\x09\xb3\x79\xd9\x57\x1d\xb8"
- "\xf7\xca\x1f\xde\x21\x7d\xbc\x3e\xc9\xb9\x7c\xc8\x2c\x65\xe6\xbd"
- "\x3e\x49\x2f\x0e\x99\xf9\x7f\xd0\x39\x8b\x43\xa4\x83\xa6\x73\xed"
- "\xb5\x63\x7d\xbf\x6e\x1b\xd3\x8f\x94\x83\x37\x39\xdd\xa2\x97\xf4"
- "\xe9\x50\x50\xd1\x1b\x4b\x48\x4f\x2e\xe2\x47\x96\x77\x36\x35\xad"
- "\x08\xe8\x0f\xac\xed\x65\xcf\x5c\xc3\xac\x0b\x03\x7a\xca\xb3\x2e"
- "\x3e\x1f\x75\x83\x27\x01\x3f\xab\xff\x35\xde\xbf\xbf\xa2\x45\x1f"
- "\x14\xfc\xca\xa1\xa0\xd0\xad\x96\x75\x16\xd3\x1a\xe2\xe9\x0c\x11"
- "\x2f\x6e\x06\x2f\x6e\x07\xfd\x37\x86\x56\xe7\x5c\x11\xcc\xcb\x99"
- "\xbc\x2d\x97\x99\x43\x79\x29\x89\x2f\x0e\xb1\x59\xda\xfa\xb3\xad"
- "\x00\x6b\xca\xb0\xd5\x54\x8d\x35\x85\x74\x36\xf1\xba\x04\xb1\x87"
- "\x4c\xf7\x8a\xfe\xc3\x81\xfa\x82\x4b\xc7\xc2\x0d\xad\x4e\x11\x7e"
- "\x15\xa8\x2d\x63\xf5\xb5\x62\x0b\x33\x84\xd4\xf3\x97\x45\xc7\xd8"
- "\x54\xf0\xcf\xfa\xf8\x73\xdc\x7d\x72\x39\xd3\x53\xfc\xd0\xa2\x6c"
- "\xa1\x17\x9d\x70\x20\x27\xc8\x3c\x8e\x2f\x59\x51\x2e\x8d\xd1\xe1"
- "\x7f\x25\x3e\x8d\x6c\x91\x91\x3f\xe1\x24\x3b\xbc\xd8\x12\xc0\x9a"
- "\x11\x00\x4f\xfe\x33\x92\x81\x0f\xaf\x92\x7e\x1c\x0e\xb7\xd0\x79"
- "\x49\x77\xee\xfd\x94\xf6\xbc\xf3\x98\xb0\xf9\xc9\x92\x73\xeb\xf0"
- "\x72\x7a\x76\xd2\x79\x50\xd3\x57\x4d\x6f\x5d\x08\x4c\x90\xba\xb7"
- "\xc3\x4f\xa9\xeb\x83\x2a\xdb\x1d\x1e\x77\x1f\x53\x29\xdb\x57\xc3"
- "\x29\x76\x5a\x1d\xf1\xaf\xdc\x2b\xf6\xe7\xe9\x6c\xbc\xe3\x5e\x37"
- "\x1f\xaa\x51\x7d\xf6\x78\x6f\x57\x36\xee\xab\x91\x7e\xf5\xbc\x42"
- "\xce\x13\xba\xfa\x8d\xfb\x1a\xc4\xde\xc4\xc6\x7d\x72\x6f\x62\xe3"
- "\x3e\xf7\xfa\x69\x74\x16\xc0\x9b\x36\x18\xbb\xaf\x03\x57\xc3\xa0"
- "\xa9\x67\x4c\xfc\x10\xeb\x51\xd9\x47\x6e\xdb\xf5\x2c\x91\xf6\x88"
- "\x32\x43\xd2\xaf\xa4\x9c\xc3\x47\xee\xe2\x1b\xc5\xbb\xe9\x3d\x76"
- "\x16\x23\x65\x48\x6f\xc9\x6d\x75\xcc\x86\xb6\xc6\x71\xe3\x3e\xbb"
- "\xb0\x59\x2c\xdb\x57\xec\x19\xa0\xb8\x30\x21\x26\xf7\xf2\x8e\xa4"
- "\xf3\xd8\x7d\x76\x35\xff\xa7\xed\x03\xe8\x83\x71\x5f\xba\x27\x70"
- "\x4a\xe5\x09\xbd\x1d\x68\x63\x3a\x2f\xdb\x37\x5f\x9e\xab\x3e\x32"
- "\x43\xa3\xab\x12\x47\x8f\x5c\x25\x71\xfd\x23\xb7\x84\xdb\x91\x74"
- "\x75\xbd\x9a\x4e\xf7\x58\xbb\xd3\xa4\xed\xc9\x11\xb3\xc6\x23\x7b"
- "\xd5\x3c\xf4\x0d\xfa\xeb\x93\xb4\xf6\x48\x2a\xc6\xad\x55\xbe\xf7"
- "\x0a\xdd\x1a\xfa\x87\x35\xcb\x9b\x43\xfd\x1a\x8f\xb6\x0a\x58\x14"
- "\xb2\x18\xb4\x99\xf8\x66\xb2\xef\xf7\x7b\xfc\xf7\xba\x3d\x62\x0c"
- "\x7a\xf6\x91\x5d\x3e\xd5\x43\x7e\x75\x88\x6e\xa2\x4c\x03\x95\x17"
- "\xd5\xfe\x9d\x5a\x5b\xa8\x3e\x7a\x87\xbe\xa6\x0b\xb9\x1a\x7d\xa6"
- "\x3c\x34\xae\x7d\x76\xd2\xd9\x9d\x03\xcc\xc8\xfe\xad\xa7\x93\x60"
- "\x22\x61\xd6\xb3\x4b\x95\xe9\xd5\x71\xe8\x79\x73\x34\x3c\xe4\xb3"
- "\x62\x04\x6d\xc8\x25\x3b\xa8\x9e\x4e\x15\x7e\x6a\x4c\x83\x1e\x71"
- "\x4e\x5d\x7d\x77\x4f\xd4\xb7\xd7\x85\xf3\xa2\xdd\xc4\x1b\x91\x4d"
- "\x01\xed\x31\x49\x7c\xed\xc9\x89\xfa\x2e\x27\xf3\x0c\x78\x64\xf0"
- "\x90\xeb\x5f\x16\x31\xe2\xd2\x86\x5d\x3d\x85\x11\x78\xcb\x72\xc6"
- "\xa8\xe3\x7a\xad\x0e\xe4\xb9\x5b\x6b\x27\xee\xd5\x35\xb8\xc7\x1d"
- "\x19\x93\x23\x5e\xed\x3b\xd2\xdf\xe0\xb9\x82\xe2\x2d\x8e\xe3\x87"
- "\x5e\xe7\xc1\xea\xde\x1e\xbc\x57\xe2\x23\x3b\x3a\x8b\x6c\xcc\x01"
- "\xd7\x45\x12\x87\x8e\x26\xc9\xb5\xf0\xa8\xf0\x0b\x46\xfb\x84\x32"
- "\x2e\xc9\xd1\x34\x94\x3b\x57\xd6\x77\x54\xf5\xff\x78\x14\xf2\x9f"
- "\xf7\xee\x8b\xe5\xba\xfb\x17\x67\xd9\xe6\xdf\x2e\xce\x96\xde\xb2"
- "\xca\x4e\xc7\x46\xb3\x22\x0f\xa3\x79\xee\x84\x88\x2f\xaf\xa3\x35"
- "\x61\x5f\x5e\x65\x87\x9a\x24\xfc\x8f\x76\xf3\x21\xbe\x89\xce\x7d"
- "\xf0\x02\x5e\x5b\x85\x31\x74\x9e\x63\x57\x53\x1c\xd9\x22\x3b\x3f"
- "\x4e\x7e\xde\x40\x2f\xf7\x83\x7e\x74\x14\x9d\x63\x93\xc8\xa6\x88"
- "\xe8\x0f\xe9\xbd\x78\x2c\xd2\x37\x76\x76\x44\xce\x9b\x1d\x3f\x48"
- "\x67\x24\xb9\x33\x83\xe2\x80\xf7\x12\x3e\x90\x7d\x79\x1f\x3b\xbe"
- "\x0b\xf9\x7a\xf1\x2e\xbf\x52\xe8\x12\xba\x52\x42\xc6\x43\x1b\x9c"
- "\xa7\xd8\x44\x11\x53\xcc\x11\x60\xb6\x9f\xd1\xb9\xa4\xde\x7b\x78"
- "\x6c\x57\x0a\xd2\xe3\x45\x7a\x00\x75\x6f\xec\x4a\xc1\xbb\x78\xbc"
- "\x5b\x83\xab\x82\x32\x1c\x55\x68\x77\xd1\x29\x76\x3d\xda\xd2\xcf"
- "\xcb\xba\x52\xd0\xce\x3e\xe7\x53\x6c\x6a\xbb\xbd\x9f\xe4\x3b\x94"
- "\xe7\x95\xb1\xd2\xf0\x2d\xbe\x3b\x80\x7e\x39\x48\x27\x82\x6b\x61"
- "\x25\xae\x45\x21\x16\x5f\xb4\x0e\xeb\xde\x3a\xd4\x4f\xe7\x37\x51"
- "\x0e\xf9\xda\x90\x6d\x41\xdf\x48\x87\x86\x72\xd7\x0d\xf0\x3e\x94"
- "\xdd\x7f\x00\x92\x9d\xc7\xd1\x19\x2e\x53\xe5\xa9\x31\xbf\x8f\xef"
- "\xe4\xe5\x3d\xcd\x68\x53\x2d\xd9\x5d\x23\x0d\x34\xf9\x78\x63\x84"
- "\x1f\x3e\xfe\xa6\x7a\x1f\x1b\xce\xeb\xcc\x60\x45\xe7\x99\x55\xd8"
- "\x0e\xac\x8e\x01\x3d\x3e\x3e\x8b\xfc\x3d\x45\xca\x3c\xf6\x1b\x2a"
- "\xaf\x02\xe5\x39\xb3\x59\x2c\x68\xb5\x11\x6d\xa4\x98\xaa\x47\x04"
- "\x9c\xc4\x1c\x3b\xb6\x0b\x7d\xa9\xa1\x3e\x29\x18\xbb\x4a\xcc\x07"
- "\xf4\x47\x87\xfe\xc4\xae\x0b\x85\xcf\xa4\x52\x9f\xa6\x90\x3c\x47"
- "\xfd\x92\xe3\xd8\x35\x1b\xfd\x9a\xbb\x2e\x87\x1f\x41\xdf\xfa\x0f"
- "\xe4\x74\x32\xac\x3d\x96\x76\x7b\x07\x9d\x7f\x38\x22\xe1\xd6\x4f"
- "\xf6\xa3\xb3\xd1\xcf\xb9\x11\xff\xa5\xc7\x29\xe6\x54\x0b\xda\x55"
- "\xa1\xf6\x93\xd2\x52\x23\x3c\xfd\xf1\x5b\xd4\x7b\x53\x38\xef\x37"
- "\xfa\xd9\xd7\x10\xd5\x4f\xfa\xfe\x73\x2a\x4f\xed\xa7\x09\xfd\x8c"
- "\xfd\x66\x3f\x81\x4f\x05\x7c\x83\xda\xcf\x32\xb5\x9f\x7a\xf4\xd3"
- "\x84\x7e\x4e\x8b\xea\xe7\x15\x17\xf5\x73\x0e\xfa\x39\x1f\xfd\xec"
- "\x89\xea\x67\xc2\x18\xfd\x9c\xe3\xa5\x3a\x36\x76\xcd\x97\x7e\xb0"
- "\x8e\xce\x97\xe7\xbc\xfb\x5a\xc2\x7e\x26\x86\x78\x33\x9d\x63\x54"
- "\x0a\xf8\x2e\xd2\xdf\x90\xde\x88\x64\x3d\x3a\xcb\x98\xb9\xa6\xac"
- "\x58\xe8\x6e\xa6\x4a\x3d\xb4\xe4\xaf\xfa\xfc\xe1\x73\x17\x2f\x8b"
- "\x58\x11\xf2\x9c\x22\x9d\x7d\xcc\x65\x42\xf7\x38\x6f\xcd\x6a\x27"
- "\x7d\x4f\xdf\x0e\xbb\x8e\x27\x47\xce\x87\xf5\x49\x9d\x39\xe0\x47"
- "\xf7\xe4\xf3\x49\xea\xf3\x8f\x2e\x92\xfa\xfc\xe3\x61\xff\x17\x80"
- "\x4b\x2b\xc1\x45\x9c\xdb\x24\xbb\xca\x10\x2b\xcb\x0c\x96\x69\xe7"
- "\xaf\x07\x90\xb7\x30\xea\xfc\xf5\x80\x68\xc3\x05\xe1\xe3\x60\xf5"
- "\xbc\xe0\x6a\x2e\xcf\xe5\x1e\x6f\x88\xd4\x7d\xcc\xa6\xd6\xdd\x4c"
- "\xf7\x3e\xe9\x83\x8c\x74\x6c\x36\x69\x2b\x73\x7c\xbf\x66\x9f\xe2"
- "\x65\xbd\x46\x9a\xcb\x63\xc7\x55\x38\xee\x1f\xed\xf3\xa8\xbf\x95"
- "\xfc\xba\x0f\xbb\xfa\xcd\x91\x33\xd5\xfd\xd6\xbf\x76\xa6\xda\xe9"
- "\xc3\x38\x61\xbe\xd9\x45\x8c\xe0\xfe\x2c\xbe\xf1\xd0\x06\x19\x9b"
- "\xa0\xff\x37\xd4\xce\x1e\xd6\x4f\xcf\x16\xb9\x97\xd3\xbf\x4a\xa5"
- "\xcd\xde\x79\xa1\xa0\xc5\x8b\x3a\x85\x0f\xa5\xc8\xf3\x72\xf2\x09"
- "\x81\x7c\xaf\x49\x9f\xce\xfd\x59\x17\xe5\xa7\xf7\xc5\x17\x3d\xa7"
- "\x5f\xf4\x6c\xf3\x83\x66\x8d\x67\x87\x53\x39\x4d\xe8\x78\x8b\xe3"
- "\x4b\x98\xdd\x79\x82\xc5\x00\x17\x8f\x51\xdb\xda\xfb\xc5\x19\x3d"
- "\x0b\x77\xa5\x31\x4f\x7f\x50\xf2\xed\xe0\x97\x7a\x92\x91\xe7\x04"
- "\x9b\x4a\x67\x44\x28\x76\x03\xf2\x9f\x94\xf1\x1a\x4e\x3e\xbc\x70"
- "\x95\x89\x29\x3f\xcd\x98\xcc\xf5\x4b\xac\x64\x07\xb0\xf3\x82\x97"
- "\x62\x1e\xe8\x8a\x36\xb3\x24\xa2\x53\xc0\xe1\x5e\xae\xcf\x22\x3f"
- "\x63\x03\xaf\x5e\xe8\x9f\xe0\x09\x7e\xc9\xec\xa0\x9f\x27\xd9\xc9"
- "\x74\x43\x21\x33\x54\xf7\xb1\x04\xe0\x59\x70\x4f\x70\x16\xd3\x7c"
- "\x1a\xd4\x5d\x21\xcf\xca\xd7\x01\x27\xf3\xac\x3c\x30\xec\x3a\x51"
- "\x07\xb9\x76\xa1\xa6\xbf\xa8\x90\x3e\xcd\x0c\xa8\x3f\x56\xf8\x5f"
- "\x90\xfc\x01\x60\x7b\xa2\x4b\x9e\x11\x4d\xfc\x07\x7c\xd3\x11\x91"
- "\x6d\x4e\x2e\x94\x30\x3c\xa4\xea\x7a\x4f\x2e\xdc\x03\xa8\x6e\x90"
- "\xf6\x4c\x89\xc8\x1b\x0c\xdb\x33\x09\x9d\xe0\xc9\x85\x18\xc3\x46"
- "\x29\xf7\x1c\x6a\xcc\x0c\x19\xd5\x39\x4e\xe9\x7b\xd3\xe9\x5b\x7c"
- "\x67\x91\x71\xe5\x4e\xce\x8a\xe0\xda\x49\xd2\xb5\xea\xd0\x27\xe0"
- "\xcf\x89\x7c\xea\x17\xc1\xc4\x2f\xfc\x97\x9d\x70\xec\xd9\x31\x4e"
- "\xdc\x11\xe3\x5e\x5f\x50\xe8\x97\x4c\xb5\xc0\xa7\x53\x18\x83\x2b"
- "\xc9\x87\x93\x07\xf5\x1c\xa8\xbf\xc0\x0e\x58\x07\x59\x3b\xee\xe9"
- "\xdc\x82\xfb\x67\x47\x59\xaf\x6d\xec\xb5\x1c\xfc\x80\x1d\x6d\x2e"
- "\xa6\xb2\x88\xd6\x90\xad\x27\xf9\xda\x6b\x07\xd7\xe6\xe9\x65\xa2"
- "\x8c\x03\x4a\x3f\x3b\xe0\x38\x42\xba\xed\xda\xf6\xfa\x2f\x59\xbb"
- "\xf5\xcf\xa2\x1e\xe2\xb7\xdd\xb9\x83\x97\x2a\xbb\x06\x65\x37\xa8"
- "\x65\x0f\xa0\xec\xc4\xf1\xcb\x8e\xf5\x5d\x66\xd9\x97\xd1\xee\x58"
- "\xef\xe5\x94\xed\xac\xe5\x21\xd0\xe1\x38\xac\xf1\x76\xf2\x43\x4a"
- "\xe7\x53\x43\x43\xe4\x7b\x65\x3a\x97\xf6\xf3\x03\xdf\x21\x7a\x23"
- "\x6c\x3b\x36\x76\x2e\x17\x67\x57\x49\xcf\xae\x9e\x59\xf5\x04\x8f"
- "\x31\xd2\xbb\x0f\xbb\x06\xc2\xf6\xdf\x51\xfb\xda\x90\x05\x06\x66"
- "\x4b\x3b\xe9\xce\xe5\x12\xb7\xfe\xfb\x3c\x95\x35\xb6\xcc\xd9\x55"
- "\x27\xed\xed\x07\xd6\x69\xfa\xad\xc1\xd8\xae\x3a\xb5\x2c\xdb\xc5"
- "\x7a\x53\xd5\x61\x8e\x2d\xdb\x91\x6f\x5b\x9d\xbb\x2c\x3f\x5b\x3b"
- "\x5c\x6d\x62\x8f\x66\x2f\xc9\x5e\x56\x90\x9d\x65\x5b\xb0\x2a\x77"
- "\xc5\x2d\x2b\x97\x2e\xb5\x3d\x9c\x9d\x97\xb7\xf8\xa7\xd9\x26\xb6"
- "\x20\x77\xf1\x8a\xbc\x65\xa4\xdb\xb4\xd9\x66\xdf\x99\x99\xb3\x32"
- "\xff\x96\xef\xcf\x4e\xbb\x48\xb7\x49\x67\xad\xbb\x49\xc6\xc1\xfa"
- "\x34\x15\x3c\xc6\x14\xf2\xbf\x63\x59\xc3\xdd\xcf\x40\xbe\x06\x0e"
- "\x9e\xa4\xb5\x90\xd6\x1f\x92\xbd\xc8\x8f\x2f\xf9\x06\xde\xfa\x32"
- "\xef\xe8\x63\xfc\x3b\xe0\xdb\x3b\x91\x46\x7e\x78\xbb\xf9\x05\xa7"
- "\x8f\xc6\x00\xe9\x53\x90\xa7\xf5\x39\xa4\xf9\x62\x0f\x35\x56\x1f"
- "\x62\x06\xc9\x63\x9c\xaa\xe1\xfa\x49\xbc\x82\x7c\xea\x1e\xb5\x32"
- "\xd5\x57\xb7\xde\xe3\x0d\x90\xfd\x8f\x71\x5e\xd0\xc9\x89\xa6\xca"
- "\xf9\x75\xea\x79\x39\x4f\xf7\xd5\xc8\x73\x08\xca\x19\x92\x11\xd7"
- "\x8b\x38\x67\xa7\x40\xff\x0f\x1b\x23\xb4\x7a\x48\xe3\xcd\x3b\x01"
- "\xf7\xd5\x3d\x78\x96\x3e\x45\x4e\xed\x1f\x6d\xdb\xf5\x75\x13\x63"
- "\x23\x89\xf2\x47\xdf\x8c\xd8\xe4\x8f\xee\xa3\x7f\xca\x41\xf9\xbb"
- "\x38\xfd\x7f\xfa\xd3\xea\xff\x7b\xbf\x1f\xae\xb9\xf4\xef\x6f\xa9"
- "\x5f\xf4\xfb\xff\xc7\xfe\xff\x4f\xbe\x1f\xae\xbd\xd4\x8f\xf0\x0d"
- "\xb8\xd5\xfd\xdc\x21\x66\x04\x7e\x6e\xaa\x7c\x02\x38\xfd\x15\xb3"
- "\x16\x06\x79\xaf\xf3\xdf\x59\x52\xd1\x09\xf0\x60\xe0\xb5\xf2\x1d"
- "\xbc\xb7\x68\x88\xf4\x12\xc3\xcb\x80\xbf\x2d\x55\x3d\xcc\x5c\xd9"
- "\x03\x3e\x2b\x5f\xc6\xc7\xa0\xfd\x26\x3a\xa3\xe5\xc1\xf3\xfe\x82"
- "\x00\xfb\xc4\x77\x86\xec\x21\xdd\xed\x8b\x40\x7b\xba\x19\x23\xfc"
- "\x35\x2f\x62\x89\x75\x53\xf9\x6e\xee\x7a\x31\x91\xeb\x5f\x34\x20"
- "\xed\xe0\xdb\x4a\xfa\x84\xb7\xd7\xb6\x4d\xb0\x3d\x41\xeb\xbc\xef"
- "\x5f\x55\xdc\xec\x92\x67\x10\x87\x84\xcd\x99\xea\x4b\x19\xeb\xd3"
- "\xf0\x63\x72\x4d\x1f\xbe\x41\xd5\xe7\xe1\x7e\x68\x1f\xdd\xa3\x1f"
- "\x2d\xdc\xb5\xc4\x4a\x65\xbe\xa5\xb4\x4c\xa0\x35\xf3\xed\xb5\xe9"
- "\x13\x0a\x17\x33\x7d\xbb\xf7\x24\xdb\x03\x5a\x48\x7b\xe1\x98\x77"
- "\x4d\x98\x67\xcd\xdb\xa6\xf2\x1a\xb4\xaf\x02\xfc\x5c\x19\xda\xd4"
- "\x38\xec\xf2\x41\xfe\x3b\xd9\xac\xf2\x72\x24\x33\x37\x55\x22\xcf"
- "\xbc\x55\x6c\x7a\x25\xf2\x81\xb7\x2b\x23\x19\x45\xb6\xcf\xff\x2e"
- "\x60\xb0\x0b\x75\x76\xd8\x1e\xa7\xe7\xb3\x82\xc7\xa0\xba\xd1\x0f"
- "\x5b\x0f\x3b\x2b\x64\x7e\xaa\x43\xab\x77\xd8\x75\x06\xf4\xef\xbf"
- "\x73\xd4\x3d\xc6\x1a\x59\xce\x99\xb9\x72\xbe\x76\xfa\x29\x66\x9f"
- "\x7a\xc6\xcb\x5f\xb9\x16\xeb\xfa\x05\x66\x44\x1d\x9b\x50\x87\xdb"
- "\x52\xc2\xb8\x85\xce\x07\x77\x07\x21\xd7\x28\xaa\xed\xed\xd9\xdb"
- "\xd5\x6f\x05\x1f\x22\x78\x8f\x10\xf8\x7b\xa1\x9f\x01\xff\x91\x03"
- "\x3a\x01\x9e\x43\x9c\xad\x00\xbf\x41\xe9\xa8\x63\x13\xfa\xd5\x01"
- "\xb9\x79\x17\xd6\x6e\x8a\xf1\x67\x7c\xfc\xdc\xbf\x30\x11\xaf\x1c"
- "\xfc\x42\x9e\x83\x07\x64\xfc\xb2\x33\xfb\x35\x7e\x81\xf0\x83\x78"
- "\x84\xca\xc7\x99\x61\x04\x63\x0c\x1c\x69\x03\xff\x01\x9e\xfe\xac"
- "\x51\x1d\x9b\x36\xc1\x17\xa8\x71\x5b\x25\x0d\x3f\x7b\x15\xd6\x77"
- "\x33\xea\x68\x83\xe4\x28\x60\x21\x69\xd0\xd9\x64\x6d\xad\x97\xb1"
- "\xc7\xcf\x1a\x39\x68\x1d\xe0\xb6\x2b\x75\x91\x8e\x79\xd9\x99\xe5"
- "\x18\x8b\x5d\x94\x97\xfc\x67\x20\xff\x02\xf0\x63\x07\xd5\x31\xe9"
- "\x86\x4c\x00\x3e\xe0\x4c\x37\xb5\x03\xdf\xec\x07\xac\x69\x2c\x2a"
- "\x54\x3a\x76\x50\xf2\x30\xfe\x55\x1a\xec\x31\xd6\x1b\x22\xf0\x3f"
- "\xdb\x10\x0d\x7f\xc0\x62\x83\x3a\x96\x33\xa2\xc6\x0e\x72\xe9\x60"
- "\x80\xf4\xd0\xa8\x6f\xb7\xd4\xa1\x9d\xed\x22\x1f\x67\xc0\x99\xdd"
- "\x80\xc5\x6e\xe4\x6b\x21\xda\xbc\xfe\x10\x68\xee\x13\xc4\x43\x0d"
- "\x1e\x91\x3c\xea\x60\x31\xe1\x30\x9e\x45\xec\xbe\x5e\x76\xc6\x4b"
- "\xe5\xe1\xf9\x5f\x71\x05\x2f\x3b\xf8\x90\xb3\x8e\xe2\x89\x76\x91"
- "\x9e\xc8\x24\xc7\xba\x2b\x7d\xd8\x35\x38\x4b\x3b\xbf\x44\x38\x40"
- "\x63\x8f\x3e\x7a\xa5\x9e\x62\x70\x16\xe9\x1a\xc5\x77\x23\x39\xd4"
- "\xc6\x6e\x9a\x9f\xda\x7b\xa4\xf7\x93\x6f\xd8\x28\xd8\x78\xd5\x31"
- "\x69\x91\xb1\xf9\x06\xbb\xd4\xb6\xed\xc2\xb3\x11\xcf\xd2\x6e\x6f"
- "\x24\x27\xa6\x9a\xbe\x29\x8a\x7c\x43\xf3\x07\xb8\x6c\x41\x9e\x4f"
- "\x71\xe5\x5a\x5e\xf2\x0f\x8f\x76\x64\xbc\x28\x7c\x74\x0d\xda\x07"
- "\x47\x52\xf4\xa8\x37\x80\x7a\xf5\x84\x1b\x84\x17\x5a\x19\xd5\x12"
- "\x46\x4d\x18\x3f\x81\x5f\x7b\x82\x2d\x80\xbb\x1f\xfc\xff\x5f\x7c"
- "\x92\xbf\x1b\xcc\x50\xdb\xe7\x96\x31\x23\x06\xca\xea\xa5\x3f\x1d"
- "\xca\x97\x1e\x96\x77\xc2\x7c\xe6\x60\x06\xe1\x1e\xca\xda\xaf\xe2"
- "\x84\x05\xf9\x72\xc2\x38\x24\x7c\x15\x0c\xf6\x13\xaf\xa9\xb6\x9f"
- "\xe6\xd4\x11\x09\xbb\xb3\x65\x84\x03\xe0\xe3\x1b\xd5\xb9\xe6\x25"
- "\x5e\x55\xe2\xa1\xbf\x49\x2b\x43\xfa\x3b\x18\x9c\xa5\xa0\x0c\x0d"
- "\x57\xa2\x69\x03\xf2\x76\x82\x2e\x84\xf1\x46\xa3\x05\x2a\x9d\x9a"
- "\xa2\xf2\x21\xb5\x18\x1b\xf2\x4b\xee\x16\xfe\x9e\x04\x5e\x9e\xeb"
- "\xdd\xe3\x0f\xb2\xe7\x08\x2f\x1f\x27\x9a\x70\xee\xbe\x41\x53\x8f"
- "\x3b\x82\xdb\xe7\xd2\x34\xdc\x8e\x1a\x57\x81\xdb\x1b\x04\x3d\x3a"
- "\x37\xdf\xcb\xd2\xe6\x6a\xb8\x4f\xf3\x5c\xc1\xbc\xae\x2e\x10\xfb"
- "\x03\x16\xd2\x07\x8a\x79\x1f\x18\x10\x32\x06\x8d\x67\xbb\xa3\x57"
- "\xf8\x82\x5f\xaf\x30\x63\xbb\xff\x18\xe9\x47\x4e\xd2\xfc\xd7\xe6"
- "\x38\x8d\x0d\xea\x22\xdb\xa1\x8e\x0d\xa0\x81\x34\x07\xfd\x68\x13"
- "\xc5\xa8\x27\xdf\x67\xad\x0b\xd3\x59\x1e\xc6\x76\xcf\x22\x1a\xb7"
- "\x73\x1d\xda\x79\x89\x6a\x49\x03\xcc\x2a\xbe\x88\x36\x5e\x04\x57"
- "\x8b\x84\xeb\x90\x61\xf4\xfc\x1e\xdc\x41\xf3\x3b\x1a\xae\x04\x53"
- "\x82\x2d\xf2\xa2\xff\xff\x6d\xd6\xe0\x1a\x05\xd3\x57\x54\x7c\x54"
- "\x69\xeb\xd0\x98\xb4\xb5\x5a\xc6\x46\x68\x59\x4f\x7d\xc1\x9a\x42"
- "\xf5\x8b\xd8\x3f\xaa\xec\xd3\xea\x23\x9c\x1a\xda\xe4\x65\x59\x8d"
- "\x1a\x1d\x43\x7b\x84\xbf\x39\x1a\x2b\x8d\x76\x90\xae\x4c\x6d\xbb"
- "\x5b\x1b\x0f\x6a\x77\x34\x4d\xc0\x7a\x23\xce\xf7\x45\xfa\x3c\x74"
- "\x06\xdf\x5d\x41\xb4\x2d\xc2\x5f\x0d\xb3\xd1\x7d\x1f\xea\xa7\xbe"
- "\x13\x4e\xd8\x0b\x48\x5f\x26\xd7\x32\x2f\xf3\xe5\x8f\xa6\x57\xbe"
- "\x65\xd2\x2e\x43\xf2\x63\x44\xef\xed\x8f\xcb\xfc\xb4\xbe\x21\xbf"
- "\xd0\xcd\xab\xeb\x21\xf1\x6a\x94\xb6\x48\x85\x41\x37\xf2\xb7\xd2"
- "\x19\x6c\xf2\xc3\x33\xb9\x5b\xca\x82\xa0\xd1\xbb\x29\x46\x04\xf2"
- "\xd9\xda\x21\x07\x04\x27\x32\x56\xa7\xf2\x9b\x44\x27\xf8\xea\x8c"
- "\xc9\xab\xfb\x59\xac\xfd\xfb\xfc\x68\x1f\x0b\x5c\x87\x79\x14\x20"
- "\xbf\x90\x28\xdb\xd6\xc7\x2e\x84\x50\x6f\xa2\x7a\xb5\xe2\x7a\x0c"
- "\xd7\x6b\x70\x3d\x80\xeb\xb5\xb8\xfe\x06\xf9\x15\x35\x7f\x1a\x9e"
- "\xb7\x21\xfd\x4e\xf5\x8a\x36\x06\x68\x3f\x7b\xfe\x73\xc4\x57\x3e"
- "\x2e\xd2\x9f\xa6\x67\x5c\x17\xab\xfd\xde\x2f\xe7\x76\xe0\x3e\x94"
- "\xe3\xa0\x7c\xb4\xae\x21\xcd\x8e\x3c\x37\x50\xd9\xe4\x13\xa1\x8f"
- "\x9d\xef\x8a\xe2\x4f\x51\xce\x79\x3a\x9b\x71\x17\xbe\xdb\x87\x6b"
- "\x3e\xae\x95\x54\x2e\x60\xd0\x11\xa1\x17\x67\xbc\x59\x0e\x39\x9e"
- "\x5e\xe6\x5f\x48\xf3\x5d\xa3\x07\x84\x4f\xa3\xf2\x2d\x94\xf9\xa4"
- "\xfc\x1a\xd8\xad\x8d\x5d\x50\xe2\xad\x3d\x88\xb1\x43\xf9\xf7\xd1"
- "\xf7\xb8\x3e\xa0\x5e\xd3\xd5\xeb\x83\xea\xf5\x9f\xd5\xeb\x6c\xf5"
- "\x3a\xc7\xcb\x02\x15\x2a\x6f\x02\x98\x05\xc8\xbe\x8f\xf6\xa4\xd4"
- "\x7a\xcf\xbb\x49\xbe\x06\xfd\xff\xce\x20\xc5\x7b\x73\x9d\xbf\x4b"
- "\xd3\x5b\x93\xee\x67\xc4\x35\xf0\xea\x56\xa1\xfb\x39\x3f\x37\x8a"
- "\x16\x3a\xcc\xba\x74\x06\xde\x69\x62\x9d\x1e\x7c\x83\x2c\x67\x87"
- "\x5e\xdd\xaf\xa7\xb8\x27\x14\xc7\x8e\xfc\xf1\x09\x39\x2a\x6e\x26"
- "\xc9\xf3\xdd\x42\xa7\xbf\x91\xfc\x0b\x1d\x2a\xc4\xaf\x0c\x32\x45"
- "\x85\x46\xef\x49\x5e\x52\xfd\x6e\xb6\xa2\xae\x96\x88\x9c\x7f\x3e"
- "\x47\xee\x6d\x5e\x8d\x75\xe9\x7c\x94\xfc\x7f\x3e\x99\xda\x0c\x58"
- "\x77\xa2\x3f\x77\xf5\xb0\xf3\x01\x5c\xef\xe8\x95\x7d\x4e\xd3\xfa"
- "\xac\x8e\x95\x5d\x83\x79\x2f\x0b\x6c\x02\x3d\xcc\x25\xfc\xee\x09"
- "\xd3\xe5\xc0\x26\xba\xaa\xf8\x83\x71\x0e\x3c\x48\xe3\x1d\x45\x4f"
- "\x3a\x23\x74\xfa\xc2\x82\xd1\xe3\x72\x76\x41\x50\xf2\x0b\x9d\x98"
- "\x97\x84\x03\x49\x17\xcd\x4b\x8a\x59\x7f\x85\xfa\x6d\xcd\x68\x1a"
- "\x3f\xd4\x4f\x34\x5e\x6d\x23\xf0\x76\x38\x48\x63\xe3\x65\x17\xec"
- "\xea\x9a\xd4\x89\x35\xf2\x3b\x48\xef\x95\xed\x94\xe9\x6a\x5d\xc0"
- "\xbf\x61\xf2\x87\x7a\xad\x96\xae\xe2\x37\x95\x73\x90\xc6\x5a\x4b"
- "\x57\xcb\x07\x9e\x0e\xef\xa7\xf9\xa3\xa5\x4b\x9c\x3c\x97\x4c\xf4"
- "\x86\xbe\x0d\x0a\x5b\x46\xc8\xdf\x8f\xb7\xa2\xdd\x23\xf3\xc1\x5f"
- "\x34\xd0\x7c\x5e\xbf\x96\x99\x57\xd7\xb2\x38\x39\x37\x47\x9e\xd6"
- "\xbe\x95\x3a\xfd\x91\x2c\x8d\x46\x55\x0b\x7a\x76\xae\x73\x34\xad"
- "\x54\x74\xdc\x65\x09\x06\x8d\x87\xf2\x0f\x04\xef\x92\xb6\x9f\x53"
- "\x79\x1d\xbe\xab\xf3\xb2\x17\xdc\xea\x5a\xb2\x5f\xee\xa9\x8c\x7c"
- "\x7a\xa0\x41\xd2\x2e\xb5\xec\x30\xfd\x8b\xe2\x43\x04\xad\xa7\xba"
- "\xa8\x2c\xac\x2b\x09\x7e\x67\xc6\x64\x49\xbf\x47\x7c\x5e\x36\x39"
- "\x59\xa3\xad\xb4\x3e\x59\x74\xcc\x5e\xf5\xb8\x5c\x9f\x14\xd2\x81"
- "\xd9\xfd\xc2\x9f\x5a\xbb\x7d\x80\xd1\xba\x49\x7e\xae\x33\xd7\x98"
- "\xc8\xdf\x54\x46\x1f\x0b\x1d\x03\x7f\xb6\x43\xdd\x9b\x81\x9c\x1b"
- "\x7a\x89\x64\x59\x15\xae\x98\x4f\xa1\x35\xea\xb8\x74\xa3\x3d\x3b"
- "\x88\xb6\xaf\x2f\x90\xb1\x83\x48\x1f\x24\x62\x4d\x11\xcf\x6a\xe5"
- "\x01\xe9\xb3\x3f\x58\x1c\xa5\xe3\x6a\x90\xf3\x64\x24\x5b\xc4\x62"
- "\x28\x3b\x94\x2f\xf5\x89\xa1\x38\x99\x1e\xf4\x49\x3b\x04\xe1\x4f"
- "\x93\x9e\xbb\x63\xac\x53\x5f\x97\x7a\xe1\x81\xf7\x25\x3f\x12\x8c"
- "\x8e\xff\x2c\x60\x2d\xfd\xf9\x06\xfb\x23\xf3\x22\xb8\x9b\xbe\xc1"
- "\xb7\xef\x0e\xbb\x42\x4c\x4b\x97\x6b\xcd\x99\x83\xaa\xce\xcc\x31"
- "\xb9\x24\x9d\x81\x36\x4f\xdc\xea\xd2\xe6\x6f\x68\x91\xa8\x5f\x9d"
- "\xbf\xd4\x47\xc2\x07\x9a\xc3\x41\xf2\x09\x86\x39\x4c\x73\x19\xf7"
- "\x85\x41\x6d\xee\x4a\xfe\xae\x53\xcc\x5d\x31\x6f\x43\xf6\x48\x3b"
- "\x42\x29\x2a\xae\x76\x0f\x2e\xb1\x9a\xf1\xae\x02\x6b\xab\xba\x97"
- "\x15\x94\x32\xc6\xc6\x8f\xdc\xca\x10\x0f\x90\x6e\x9a\xf4\x09\xa4"
- "\xb3\x51\xed\x55\x69\xaf\xc4\x4f\x7e\xce\x6a\x30\x1f\x22\xbe\xcd"
- "\x12\x98\xe6\xdb\x0c\xe5\x75\x47\x74\xc7\x41\xcd\x37\x68\x3e\xea"
- "\xab\x73\x17\xfd\x91\xe0\x77\x8b\x9c\x63\x41\xb2\x77\x6e\xf0\x00"
- "\xf7\xb0\xfe\xd4\x52\x2c\xfa\x61\x97\x62\xd5\x70\x0f\x73\x34\x0b"
- "\x38\xfa\xe6\xa6\xa9\xbc\x16\x63\x4a\x36\xf7\xcb\xf1\xfc\x12\xae"
- "\x59\xf2\xaa\x4b\xa0\xab\x8a\xf3\xb5\xf8\x16\xf3\xdf\xd4\xa6\x8d"
- "\x81\x3f\xce\x94\x20\x70\xac\x88\xec\x1b\xd3\xc4\x5e\x3f\xe1\x18"
- "\xe1\x97\xd8\xf3\x07\xae\x59\x4a\xfe\x85\x11\x9e\x09\x7f\x27\x0e"
- "\x1a\x93\xe0\xdd\x84\x67\x28\xab\x41\xf3\xed\xeb\x65\x8a\xba\xdf"
- "\xa6\xec\xd2\xec\xc0\x09\x0f\xf3\x67\xb0\xab\x50\xbe\xad\xd5\xe6"
- "\x27\xdd\xf9\x61\x4f\xf0\x41\x46\x79\x09\x76\x92\x5e\x5e\xfd\x22"
- "\xbe\x89\x1a\xff\xb3\xc2\x96\x75\xcf\x42\xa1\xcf\xbc\x72\xd8\xc5"
- "\x0d\xa3\x69\xce\xa9\x1a\xc1\x57\x62\x7d\xfe\x56\x22\xb3\x01\x6f"
- "\xb1\xd6\xf0\x14\x8d\x1f\xbe\x2d\x91\xec\x2d\x4e\x51\xfb\x48\x06"
- "\x07\xbd\x3d\x95\x42\xeb\xf4\x38\x7a\xe7\xbb\x48\x57\x44\x34\x83"
- "\x74\x4f\xa4\x07\x03\xac\x0f\xf6\xe9\xf4\x6f\x1e\x80\x24\xcf\x57"
- "\x7e\xd3\xbf\x73\x91\x83\x9f\x23\x5f\x58\xb6\x5c\x76\x65\x8f\x4e"
- "\x4f\x67\x35\x3b\x9d\x67\x48\xc7\xc3\x9b\x47\xe9\x78\x22\x1e\x95"
- "\x12\xf1\x73\x44\x7e\x3a\xa3\x7a\xbf\xe1\xd2\x3f\x9d\x4d\xe6\xd5"
- "\xa5\xe2\x37\x4b\x85\xd5\x9f\x87\x4b\x59\xa2\x06\x2b\xa2\x29\x44"
- "\x63\xc9\xce\x86\xe6\xb9\x2e\xc8\xc8\xd7\x11\xc6\x09\xed\x5e\x7f"
- "\xf3\xa3\xee\xb5\x90\x69\x75\xec\x41\x21\x73\xe8\x2f\xf3\x4c\xb6"
- "\x8e\x89\xf1\x14\x7e\x54\x75\xcc\x88\xba\x8f\x56\x9f\x66\x06\x7b"
- "\x2e\xbb\x8e\x74\xe8\x96\x10\x77\x93\x0c\x4c\x38\x01\x18\x74\x9c"
- "\xd4\xe9\x62\xf3\xd7\x31\x3d\xde\x4f\x3f\xa9\x63\x01\x8d\x97\xc2"
- "\x37\x09\x31\x01\x96\x48\x3c\xd4\x03\xeb\xd8\x74\xb4\xff\xa0\x36"
- "\x56\xc4\x67\x90\x1e\x2f\x1c\xd7\x49\xc7\x84\x2d\x00\xf9\xac\xf7"
- "\x12\xdc\x34\x5a\x75\x9a\x99\xf1\xec\x8e\xf1\xb3\x04\xb1\x0e\x95"
- "\xea\x80\xff\x03\xc2\x46\x10\xe9\xdd\xc0\xfd\x83\x91\x76\x5a\xaf"
- "\x8a\xba\x7f\x8c\xbe\xb7\xf8\x89\x87\x1b\x0f\x3e\xba\x6c\x0d\x3e"
- "\x74\xee\xc0\x02\xfe\x5f\x8c\x77\x90\x0f\xa0\x6d\xfb\xed\x6b\x99"
- "\xf1\xa4\x4e\xff\x18\xfa\x48\xe7\x7a\xdb\x84\x8e\x5f\xa7\x7f\x48"
- "\x93\xd3\x65\xbb\xf5\x57\x59\x4a\x62\x18\xe9\xe6\xc9\xdf\xa3\xb0"
- "\xc5\xfc\xda\x2a\xf4\xf1\x1e\x4c\x6d\x77\xd1\xf7\xa8\x9e\x23\xea"
- "\x5a\xd6\x3d\xe8\xb4\xb2\x3d\xd6\xbb\x19\xfa\xe1\xf5\xea\xbe\x4a"
- "\xba\x6c\x9b\x57\x9d\xce\xab\xc2\x77\xbf\xb0\x15\xd1\xe9\xde\xa1"
- "\xb5\x84\x74\x03\x58\x47\x5a\x69\xbd\x1e\x2e\xd5\xdf\xad\xcd\x1b"
- "\xac\x13\xad\xf8\x26\xec\xd7\x00\xf7\x4d\xe4\x73\x46\xc8\x0f\x32"
- "\xbf\x59\xec\x1b\x94\xea\xed\x61\x7e\x1b\xf9\xe8\x3b\x61\x43\xa8"
- "\xd3\x6d\xc8\x0c\xe9\x00\x53\xdd\x06\xea\x9b\xc4\x45\xeb\x4f\x90"
- "\xbf\x21\x3c\x6f\x31\x0e\x62\xde\x0e\x44\xcd\xcb\x52\xbd\x3b\x22"
- "\xa7\x72\x3a\x5b\x6c\x1b\x6b\x1e\xda\xe3\xb1\x56\xe9\x62\x6e\xaf"
- "\xae\xe6\x0d\x35\x7a\xe5\xfe\xf5\x55\xcc\xac\xab\x00\xd8\x68\x9e"
- "\x15\x2c\xba\xaa\x4f\x17\x73\x9f\xc5\x7c\xf5\xfc\x07\xf2\x27\xf1"
- "\x22\x2b\xd3\x57\x9e\x9d\x64\x9c\x11\xb8\xba\x81\xc7\xdc\xfc\xe8"
- "\xc3\xf9\xb4\xf7\x5d\xc3\x8e\x2f\x67\x31\x0f\x84\x50\xb7\x99\xd9"
- "\xbd\xba\x09\x73\xe9\x8c\xfa\x1e\x33\x78\x11\xdc\x53\x99\x85\x75"
- "\xcc\x58\xd8\xcb\xfb\x2b\x96\x4e\x30\x62\xfd\x4d\xc0\xba\x51\x36"
- "\xd9\x7c\x75\xc3\x08\xca\xf8\x70\x91\xf8\x6e\x4c\xdf\xa6\x6a\xdb"
- "\x0e\x8c\xdd\x36\xfb\x54\xb4\xed\xab\xcb\x6b\xdb\xc4\x8a\x48\xdb"
- "\x26\x56\xfc\xcf\xdb\x66\x58\x16\xd5\xb6\x84\x48\xdb\x72\xd0\x36"
- "\xc3\x9a\xcb\x6b\xdb\xa4\xfd\x91\xb6\x4d\xda\xff\x37\xb6\xad\x69"
- "\xfc\xb6\x4d\x98\x30\x76\xdb\x1c\x57\xf7\xe9\x26\x5c\x75\x79\x6d"
- "\x8b\x35\x47\xda\x16\x6b\xfe\x9f\xb4\xad\xa8\x8e\x1f\x6b\x07\x97"
- "\x4b\xfa\x1c\xa2\xf3\x7d\xba\x89\xd7\xac\x4b\x12\x76\xdc\x57\xa0"
- "\x5d\x07\x9c\x75\xfc\xa8\xe0\x6d\x74\x13\x84\xee\x7f\xb8\x74\x42"
- "\x19\xf0\x57\xda\x95\xe8\x26\x3a\x28\x4d\x89\x99\xd6\xc8\x5d\x3c"
- "\x78\xab\x9f\x6c\x06\x83\xe4\x97\x85\x7c\x9e\x37\xbf\x3d\x14\xa0"
- "\x78\x13\xee\xed\x67\x0d\xec\xed\x21\x9f\x1e\xdf\xb6\x6a\xbe\x58"
- "\xb5\x6f\x2d\xb5\x97\xa2\x47\x13\xce\x3f\x90\xc3\x2c\x44\x8f\xe8"
- "\x4a\x71\x23\xab\x8b\x26\x19\x1f\x38\x83\x75\xbf\x74\x62\x82\x76"
- "\xd6\x56\x2b\x6b\x5e\xff\x24\x6e\x29\x64\x31\x74\xde\x57\xf8\x6d"
- "\xb4\xfa\x58\x72\x21\x9b\x30\xcf\x81\xf2\x03\x6c\x91\xc5\x81\xb2"
- "\x01\x0f\xc1\xcb\xeb\x26\x3e\x16\xb3\x9c\x99\x37\xa1\x6c\xba\x3e"
- "\x60\x75\xf2\xf5\x9b\x99\x81\xce\x05\xd3\xf9\x5e\x79\xb6\x77\xa2"
- "\x11\xf5\x38\xb4\x7a\xfe\x0a\xfc\xe2\x25\xfc\x26\xfd\x28\x02\xbf"
- "\x49\x71\x11\xf8\x4d\xfc\x54\xc2\x6f\x62\x5b\x04\x7e\x93\x5a\x2e"
- "\x0f\x7e\x93\x0c\x11\xf8\xc9\x6f\x2f\x0d\xbf\x49\xdf\x1d\x1f\x7e"
- "\x93\xe6\x47\xe0\x27\xcb\x1a\x07\x7e\x13\xc7\x86\xdf\xa4\x97\xfe"
- "\x36\xf8\x4d\x6a\xf9\x1b\xe1\x17\x27\xe1\x67\xdc\x1c\x81\x9f\xf1"
- "\xe1\x08\xfc\x8c\x53\x24\xfc\x8c\xc6\x08\xfc\x8c\x81\xcb\x83\x9f"
- "\x71\x76\x04\x7e\xf2\xdb\x4b\xc3\xcf\xb8\x66\x7c\xf8\x19\x6b\x22"
- "\xf0\x93\x65\x5d\x1e\xfc\x8c\x9f\x03\x6e\x09\x2a\xfc\x12\xc6\x87"
- "\x9f\x31\xf0\x37\xc2\xcf\x22\xe1\x17\xdb\x15\x81\x5f\x6c\x65\x04"
- "\x7e\xb1\xff\x2a\xe1\x17\x3b\x27\x02\x3f\xd3\xac\xcb\x83\x5f\xec"
- "\x86\x08\xfc\xe4\xb7\x97\x86\x5f\xec\xbb\xe3\xc3\x2f\xb6\x23\x02"
- "\x3f\x59\xd6\x38\xf0\x9b\x34\x36\xfc\x4c\x57\xfd\x6d\xf0\x33\xcd"
- "\xba\x14\xfc\x2e\x8f\xd7\x30\x09\x59\xe7\x7f\xa1\x9c\x4d\xe3\x95"
- "\x43\x30\x24\xfb\x44\xa5\xd4\xb4\xa9\x5e\x99\x68\x94\x67\x38\x4c"
- "\x73\x21\xc3\xdc\xdb\xa3\x33\x1d\xa9\x57\x26\x18\xb9\xeb\x4f\x2d"
- "\x8a\x6b\xdf\x22\x5e\x32\xd1\xa0\x94\x4c\x32\x90\x2f\x82\x71\xe3"
- "\x50\xeb\x26\xdf\x17\x73\x0d\xbb\x9e\xce\xeb\xad\x07\xbf\x46\xf7"
- "\xc3\xa5\x93\xe7\x82\x17\xe9\xbc\x18\x26\x59\xcb\xf2\x44\x50\xcb"
- "\xdc\xec\xac\x55\x2b\xb2\x16\xaf\xc8\xb7\x2d\x5e\xf2\x64\xde\x68"
- "\x5f\xf1\x22\x1e\xe4\x06\x1a\xbf\xc9\x61\xff\x67\x14\xd3\x91\xfc"
- "\xec\xd9\x67\xb2\xd8\x93\xba\xc9\x1d\xc2\x7f\xbf\xe9\x70\x2a\x1f"
- "\xc9\xd8\x92\xfe\x2d\xfe\x81\xf0\x1f\x38\x92\xb3\x05\xf2\xd4\x41"
- "\xf2\x09\xa3\xee\x43\x41\xb6\x88\x3b\xc1\x63\x8f\x2e\x22\x9b\x0e"
- "\x71\xb6\x43\x67\xb6\x09\x5e\xce\xc5\xdb\xb8\xb1\x2b\x55\x29\x3b"
- "\xba\x88\x6f\x3c\x2a\xce\xb0\xb7\x93\xef\xb6\x82\x98\xe9\x3d\x3a"
- "\x4b\x13\x8f\xed\x4a\xe5\x65\x5d\x69\xea\x1e\x47\x1a\xd9\x8b\xa6"
- "\xaf\xe5\x87\xa9\x3c\x95\x17\xa4\xf8\x1c\x6e\xc9\x0f\x9a\xb3\x2d"
- "\x25\xb6\x18\xca\x4b\x3e\x14\xc9\xb7\xa0\x16\x93\x89\xda\x4d\x79"
- "\xc1\x8f\xdf\x8b\xef\xef\xa5\x98\x94\xe1\x32\x64\x9b\xae\x44\x9b"
- "\xea\x44\x5f\xca\x3a\x3b\x07\x9f\xc9\xd8\x22\xe2\x22\x0a\xb8\x5a"
- "\x9e\x47\x1f\x3a\x45\x3c\xcb\xe0\xd7\x22\x9e\xa5\xfa\xcd\x75\xf8"
- "\x46\xd0\x53\xf2\x9b\x2a\xcb\xb0\xac\xd1\xda\x05\x1e\xda\x84\xe7"
- "\xc5\x51\x75\x4c\xc6\xf3\x43\x51\xef\xcd\x78\xbe\x05\x7c\xe8\x14"
- "\xf5\x7d\x1c\x9e\xa7\x10\x5f\x2a\xfa\x55\x55\x2c\x6d\xa2\x75\xf1"
- "\x64\x1b\x93\xa0\xe6\x99\x72\x52\x17\xdf\x45\xbc\xae\x5a\xc6\x15"
- "\x78\x7e\x8f\x64\x46\xf5\x7d\x22\x9e\x5f\xa1\x7d\x01\xf5\xfd\x55"
- "\x78\x7e\x16\xcf\xff\x47\x7d\x0f\xbe\x3e\x6e\xb7\x68\xb3\xb1\x2b"
- "\x99\xfa\x04\xd8\xa7\x13\xdc\x01\xeb\x64\x6e\xec\x3c\x08\x79\xd5"
- "\x49\xe3\x48\xfd\x74\xaf\x3d\xc9\x7a\x74\x71\xef\xd0\xb9\x3c\x39"
- "\x56\x47\x17\x49\xdf\x3e\xfa\x0c\xa4\x37\x53\x3a\xd9\x96\x2b\x1b"
- "\x8f\xa6\xd3\x3d\xda\xfa\x10\xc1\x50\xad\x0b\x32\x51\x5c\xa7\x3a"
- "\xce\x80\x1d\xf9\xdf\x65\xc5\xdb\xd5\xb1\x40\xdb\x26\xa1\x6d\xdf"
- "\x51\xf7\x3d\xda\xe6\x05\x47\xe4\xf9\x22\x5d\x3c\xfb\xbb\xfc\x4d"
- "\xe0\x3b\x49\xf7\xe2\xd3\xb5\x58\x7d\x5e\x5d\x9c\xf0\x15\x41\xf8"
- "\x49\xfa\x15\x5f\x6c\xa7\x5b\xf8\x57\x01\x8e\x6a\xb8\x42\x78\xc2"
- "\x27\x4e\xce\x10\xba\x9a\xd2\xf8\xf0\xf9\x5f\x7c\xdb\xa2\xc6\x37"
- "\x60\x52\x4e\x88\xaf\x0d\xdb\x17\xe9\xe2\x04\x7d\x88\x7a\xb7\x2b"
- "\xea\xdd\xdd\xda\x3b\x61\x03\x57\x1a\xdf\x11\xf5\x2e\xf5\xa2\x77"
- "\x03\x51\xef\x92\x46\x97\x69\x31\x46\xbd\x33\x8f\xfe\xce\x92\x1c"
- "\x79\x67\x0e\x5c\xf4\x2e\x3d\xea\x5d\xbf\xfa\x2e\x06\xe9\x19\x61"
- "\xff\x86\x3a\x73\xa7\x9a\x0e\x5a\x6f\xb1\x47\xa5\xb7\xa9\xe9\x54"
- "\x3f\xf8\xbf\xdf\xb7\xa8\xe9\x02\xcf\x81\x47\x37\xaa\x75\xec\x88"
- "\xaa\xa3\x56\xca\x58\x9d\x6e\x39\x7e\xe6\x04\x8b\xce\x36\x89\x70"
- "\xca\x52\x52\x4c\xb1\x72\x6a\xa4\x2f\x2f\x39\x0f\x45\xbc\x65\x8a"
- "\x09\x8b\x7c\xe3\xd1\xc6\x31\x6d\x04\x4b\x13\xac\xda\x39\xd6\x50"
- "\x59\x67\xab\x52\x61\xea\xa4\xf8\x7b\xe4\xf3\xcb\x39\x40\x7e\x5f"
- "\xb4\xd8\x7b\x17\x98\x27\x7f\xb8\x98\x3c\x25\xa8\x7e\x62\xe2\xc9"
- "\x67\x59\xbb\xd0\xef\x9c\x92\xf1\xf7\xe8\x7c\xef\xc6\xce\xd6\xd5"
- "\x03\x2c\xc9\xfe\x7d\xde\x4b\x72\x9e\xa4\x09\x09\x15\xf8\xc6\xa2"
- "\xfa\x72\xd8\x2c\xce\x9b\xeb\x12\xc8\xcf\xa5\xc5\x33\x20\xf4\xcc"
- "\xc6\x3e\xdd\x14\xab\x78\xcf\x33\x36\xcb\xfe\x4e\xb1\x0a\x59\x5a"
- "\x3d\x57\x88\x76\xba\xc3\xf1\x21\x75\x53\x92\xce\xc5\x1e\x6b\x41"
- "\xda\xc1\x51\xf6\x8d\xba\x84\x53\x54\x26\xf5\xc3\xab\x4b\xa8\xa1"
- "\xb2\x91\x27\x10\xb6\x6f\x44\xfa\xea\x20\x9b\x86\xb6\xf5\x69\xe5"
- "\x0f\x97\x4e\xb1\x7a\x75\x16\x21\x57\x52\x99\xe7\x2a\x27\xa3\xdc"
- "\x29\xa9\x5e\xfd\x9b\x22\xae\x06\xee\x67\x79\xd9\x47\xe6\xf1\xd6"
- "\x3f\xa1\x93\x34\x1e\x75\xf0\xb2\xa3\xc5\x98\xf3\x76\x61\xaf\x1c"
- "\x7b\xd4\x21\x65\xf9\x29\xcf\x92\xfd\x05\xc5\xaa\xa6\x7d\x47\x49"
- "\x77\xa6\x08\x7b\x08\x4a\x03\x6c\x1a\x41\x9f\x45\xff\x2e\x6f\x4e"
- "\x4e\x11\xeb\x5f\xf5\x59\x66\xac\x52\x6d\x5e\xd1\x4e\x6f\x54\x9c"
- "\x06\x69\xff\xaf\xbb\x22\xb6\xdd\x21\xf6\x9e\x44\x1b\x2f\x6e\x03"
- "\xb5\x17\x65\x6d\x18\x77\x2d\x35\x1e\xb5\x0b\x3d\x68\xf9\xa1\x0e"
- "\x61\x4b\xa6\xbb\xe2\x5f\x63\xac\xd7\x02\x3e\x57\xcc\x0d\xc7\xa7"
- "\x40\x9e\x2a\xb2\x09\x46\xf9\xe1\x7e\xe6\x52\x1d\x57\x88\x7d\x34"
- "\xaf\xee\x8a\x32\xd0\x31\x3b\xb5\x41\x4d\x2f\x6b\x0f\x06\xe8\x6c"
- "\xfd\x98\xfe\xb3\x68\x8d\x14\xbe\x97\xca\x8f\xda\xe9\xfc\xc4\x6d"
- "\x01\xad\xcd\x57\x96\x91\xdd\x3e\xb5\x59\xc2\xf6\xca\x75\x1a\x1c"
- "\x2b\xcf\xa2\xec\xa2\x2f\x59\xaf\xee\xca\x09\x64\xdf\x42\xe7\x50"
- "\xaa\xd7\xaa\x36\x57\x48\x13\xf9\x2e\x68\x79\xae\x10\xfa\x0e\xb2"
- "\xf7\x25\x7a\x5a\x4f\x7e\x07\x50\x66\x15\xc6\x42\xf8\x14\xd1\x5d"
- "\xf9\xb0\xd0\x6f\xe6\x32\xd9\x6f\xb2\x67\xd3\x5d\xd9\x24\x71\xe5"
- "\xca\xd9\x5e\xdd\x95\xea\xdc\x95\x69\x14\xeb\x9c\xec\x10\x4e\xeb"
- "\xae\xbc\x81\x62\xa6\x02\x1e\xc5\xe4\x77\xae\xdd\x8f\xf9\xe2\xb8"
- "\x40\xb8\x50\x4c\xb1\xf1\x90\x3f\x59\xae\x0f\x04\xf3\x2b\x8d\x54"
- "\x3f\xc1\x96\xe2\xc5\x02\xa6\x1f\xa1\xec\xb0\xfe\x83\x62\xd3\x02"
- "\x6e\xbb\xc7\x1b\x17\x82\x51\x08\x6d\x26\x2f\x1e\xee\x69\x5f\xa2"
- "\x7d\x89\xcb\x14\xd3\x51\x3b\xd9\x4f\xe2\x5e\xfa\x3a\x2d\x93\x63"
- "\x27\xe7\x52\xe2\x7d\xa8\xe3\x0c\xed\x35\x92\xcd\xb8\x88\xd7\xad"
- "\xbb\xb2\x5f\x85\x9f\x88\x57\x51\x53\x20\xe1\xa0\xe6\xaf\x93\x7a"
- "\x99\x6b\x87\x87\x4b\x13\x67\x45\xf4\x32\x89\xc2\x67\xb1\x66\x63"
- "\x8d\x77\x0b\xa2\xda\xec\x17\xe7\x00\xcf\x92\x4c\x7d\x65\x90\xea"
- "\xaa\x24\xbf\x60\x84\x17\x27\xa3\xf1\xff\xca\xaf\xa8\x9d\x64\x9b"
- "\x17\x8a\x3d\xd4\xc1\x37\x1e\x3a\x48\x70\x46\xd9\x89\x98\x0b\xf6"
- "\x71\xe2\xa1\x8b\x78\x4c\xa8\xaf\x35\x2a\xc6\x2c\xd6\xc1\xc4\x73"
- "\xda\x3a\x47\x6b\x34\xf9\x79\x08\xa7\x55\xce\xc4\x9c\xec\x32\xaa"
- "\x3c\xce\x98\xb4\x4f\xf8\x28\xbc\x95\xa5\xd1\x59\x63\xb2\xd3\x26"
- "\x7c\xe3\xe6\x99\x56\xf2\x7b\x4c\x3e\x1c\xdd\x6b\xef\x40\x7b\xaf"
- "\x7a\xed\xc5\xa9\xe2\x7c\xa3\xdf\x7d\xeb\x59\xb2\xd1\x19\xe8\x2b"
- "\x14\xbe\x89\x8c\xf3\x1c\x41\xbe\x5d\xc6\x98\xf6\xf1\xb8\x99\x56"
- "\x7a\x27\xfc\xfe\x53\x99\x7f\xaf\x0f\x5f\xdd\x55\x76\x95\x97\x19"
- "\x00\x9d\xbc\xfa\xa4\xee\x2a\x71\x9e\x11\xf7\x53\x4f\xea\xa6\x1e"
- "\x90\x71\x11\xa5\x1f\x7a\xd5\xd6\x70\xa2\x3c\x9f\xef\x63\xe2\xbc"
- "\xb4\x6e\xea\x7d\xb6\x9b\x19\x1b\xd0\x4d\x7d\x50\xf8\x84\x2e\xeb"
- "\xb2\xaa\x30\xb0\x56\xcb\x76\x59\x32\x1d\x7a\xd1\x46\x6a\xdf\xe5"
- "\xb5\x6d\xaa\xb6\x5e\x4e\x1c\x2e\x9d\x3a\x5f\x3b\xd7\x2f\xfa\xaf"
- "\xfa\x8a\x76\xcf\x24\xb9\x65\xea\x7b\x12\x07\xbb\x92\xd4\xba\x93"
- "\xfe\x17\xea\x2e\x53\xd7\x43\x9f\xf0\x97\x0d\xb8\x80\x7f\x04\x0e"
- "\x4e\xed\xd4\xd6\x53\xd5\x46\x3e\x55\xae\xf3\x53\x7d\x91\xb5\x54"
- "\xc2\x70\xd4\x99\x9d\x95\x2b\xf3\x6d\x60\xd8\xed\x8b\xf3\x97\xe4"
- "\xd8\xb2\x73\x73\x57\xe6\xda\xc8\xb9\x4d\xf4\x1c\x13\x36\x30\xa5"
- "\x57\x1b\xd4\x18\x67\x8d\xe1\x18\x67\xa5\x57\x87\xf7\x7f\x69\xff"
- "\xca\xab\xbb\x7a\xfe\xff\x8e\x5c\x73\xf5\xb8\xe7\xfc\x6a\xf4\x4a"
- "\x33\x7e\x2d\xf8\xb9\xf1\x23\xff\xe7\x2c\x33\xc0\xd2\xb1\x3e\x8a"
- "\xf3\x69\x91\xf3\xea\x57\x27\xd3\x3e\x78\x8f\xee\xea\x7d\xf5\x8a"
- "\x81\x09\xbf\x26\x2e\x85\x6c\x49\xc8\xb7\x79\x0b\x7e\x6e\xfc\xda"
- "\xf0\x13\xdf\x29\x7f\x14\x67\x6d\x9b\xa3\xdf\xd1\xde\x34\x77\xed"
- "\x18\xa0\x3c\xbc\xc4\x20\xf8\x3f\xe5\x05\x99\xef\xa2\x36\xe8\x79"
- "\xe9\x94\xb9\x6a\x3e\x71\x26\x3a\xbe\x84\xd9\xc6\xc8\x17\xc3\x4b"
- "\x27\x3b\xd4\x7c\xc2\x2e\x4d\xeb\x0f\xf9\xdd\x47\x7e\x2d\x9f\x81"
- "\x97\x5e\x65\x54\xf3\x09\x5c\x53\x5c\xfa\xb1\xea\x9d\xc0\x5d\x5d"
- "\xbb\xd4\x7c\x09\xd1\xe5\x45\xe5\x99\xa8\x94\xea\xbb\x29\x8f\x52"
- "\x62\x10\xfa\x7f\x8c\xe5\x72\xe4\x1f\xd3\x5f\xe9\xe5\x8d\xd3\x35"
- "\x89\x17\x8f\x93\x7d\xc9\xb2\xec\xef\x2d\x5b\x51\x40\x51\xa0\xf2"
- "\x57\xae\xca\xa7\xeb\x8a\xc5\x4f\x8a\xcb\xca\xcc\xa5\x4b\xe4\x4d"
- "\xfe\xf2\x34\xba\x59\x0e\x7c\xa3\x6b\xd6\x2a\x3b\x5d\x96\xac\xa4"
- "\x47\x47\x4e\xea\xaa\x25\x5a\xe8\xea\x68\x3c\x4c\x19\x2e\xbd\x66"
- "\x37\x70\xa3\x49\xf2\x23\xd7\xb4\x41\xfe\x15\xfb\xc0\x96\x12\x2f"
- "\xdb\x9b\x22\x62\xdc\xb1\x6f\xf8\x2b\xd0\x5d\xf3\x39\xf9\x2b\xb0"
- "\x94\xd8\x97\x58\x82\xcb\xb2\xf9\xc6\xc3\x69\xc3\xa5\xd3\x0c\x5e"
- "\xf6\x9c\x5b\xf2\x42\x5d\x29\xc2\xe7\x67\xe9\x35\x0b\x34\xfb\x42"
- "\xa5\xac\x93\xf6\x89\xbd\xc2\xde\xe8\x05\xf2\x85\xd3\x45\x36\xdd"
- "\xc9\xf5\x2f\x88\x98\x32\x89\x78\xdf\x8b\xe7\x54\x3c\x53\xec\xb5"
- "\x24\xa5\x6c\x9f\x9d\xce\x27\xe2\xd9\x86\xe7\x64\x94\x9f\xa5\xcd"
- "\x8b\x68\xd8\xa8\x41\xd5\xbe\x37\xa6\x7c\x3c\xda\x9f\x14\xe6\xd6"
- "\xb4\x46\x2d\x66\xad\x88\x4f\x5b\x3a\xad\x25\x1c\x9f\x56\xc4\x61"
- "\x4a\x58\x28\xd6\x35\xb1\xb6\x5f\xfb\x9d\x18\xeb\x75\xff\x24\xf9"
- "\xf0\x69\x5e\xcd\x27\x83\xe4\xb3\xa7\xf9\xa2\x62\xfb\xe2\xf9\x5a"
- "\x16\x8e\xed\x2b\xf9\xd0\x2d\x92\x0f\xbd\x76\x0e\x2f\x9d\x66\x0f"
- "\xc7\x61\x2b\xbd\x36\x25\x6a\x6e\x1b\xbc\x78\x4f\xf2\x0d\xd2\xd3"
- "\x23\xeb\xe0\xb4\x83\x54\xe7\x58\x71\x8c\x21\x9f\x3b\x32\xd7\x80"
- "\x17\xc7\x55\xf0\xe5\x2a\x0f\x4c\xe9\xdc\x95\x4e\xfe\x6d\x6c\xf4"
- "\x8e\x78\xbf\x31\x75\x0e\xd7\x8b\x7e\x75\x91\xcf\x5c\x9f\x33\x4b"
- "\xf7\xad\x7a\xa6\x13\xcf\xd2\xe7\x23\x3f\xad\xbb\x56\x9c\x63\xd3"
- "\xfc\xc1\x45\x9f\x89\x1f\xf3\xec\xc1\x67\xda\x9e\xf1\xf2\x95\x96"
- "\xe0\xe2\x6c\xc9\xc7\x25\x7d\x57\xdd\x23\x96\xe7\x4e\x75\x49\xc9"
- "\xfc\x51\x19\xab\xc4\xab\x4b\x6a\xa4\xf3\x48\x16\xdd\xf2\x95\x1c"
- "\xdf\x5a\x1c\x8b\xb3\x45\x1a\xf2\xad\x07\xaf\x25\xdb\x97\x14\xeb"
- "\x49\xea\x67\x7c\x28\x24\xcf\xfa\xeb\x92\x8c\x8f\x5f\x57\x4c\xf5"
- "\x18\x05\x1f\xf1\x19\x33\x53\x4c\x3c\x6a\x5b\x7d\x94\xbf\xba\x6a"
- "\xa4\x89\x78\xf7\x8f\x32\x33\xf9\xe7\x55\xdb\x62\x14\x71\xc6\x4a"
- "\x93\x1a\x34\x9f\x39\xa8\xef\x1b\xbe\x96\x1f\xfd\x81\x98\x21\x37"
- "\x2c\x49\x9d\xff\x20\xee\x52\xd5\x70\xae\xd1\xb8\x93\x34\x68\x3a"
- "\x62\x1d\x7c\x7d\xe5\x3f\x8a\x78\x88\xa5\x49\xe0\xa1\xae\x55\x63"
- "\x28\xff\xe4\x04\xd1\x16\x11\x27\x90\xce\x15\x2a\x7e\xd4\x3b\xfd"
- "\x80\xf0\x8d\xab\x97\xfc\xa2\xf0\x49\x57\x9a\xb4\x8b\x9b\x3a\xdb"
- "\x64\x2c\xd4\xc3\x6d\x18\x3f\xb1\xee\xd3\xdc\x10\xe7\x27\x13\xa8"
- "\xef\xd7\xcd\x01\x4d\x7d\x00\xbf\x7f\x93\xb1\x5d\x7e\x72\x42\x2b"
- "\x97\xfc\x47\x01\xb7\xd2\x70\x4d\x18\x2e\xbd\xce\x1e\xb6\x11\xd2"
- "\xce\x64\xea\xae\x7b\x9e\x7c\x5b\x45\xf8\xf3\xe9\xef\x4a\xbe\xf2"
- "\xba\x3a\x2f\xb3\xd4\xca\xf9\x7d\x1d\xf0\x7f\xe7\x6c\xf5\x1e\xf2"
- "\xef\x9d\x6d\x17\x95\x11\xd2\x74\x1f\x72\xec\xae\xeb\x04\x2e\x3e"
- "\x80\xdf\xbf\x21\x7f\xaf\x16\x0b\x7a\xbd\x5e\x9c\x2d\xea\x8b\xb1"
- "\x32\xcc\xfb\xeb\x82\x5a\xfa\x04\x5d\x3a\x60\x73\xbd\x59\xa3\x27"
- "\x83\xa6\x43\xdd\x78\x4e\x02\xbf\xb9\x49\x7d\xee\xc7\x73\xaa\xf6"
- "\x8c\xfb\x59\x1a\xbd\x21\x1d\xc4\xe0\x33\x19\x9b\x49\xfe\x5b\x62"
- "\x05\x4f\x66\x25\xf9\xea\x7a\xc8\xbf\x4d\x69\x6a\xde\x2c\x2f\x7b"
- "\x4b\xfb\x0e\xfd\xff\xe5\xc1\x08\xfc\x63\x2c\xb2\xfd\xd3\x77\xf0"
- "\x38\x53\x27\xc5\xe0\x46\x9e\x4d\x98\x4b\xd2\x7f\x46\xc1\x40\x43"
- "\xc5\x85\x84\x05\x1e\x48\x23\xee\xa5\x84\x17\xd3\x85\x6d\x4d\xe5"
- "\xda\x84\xf9\xc4\xdf\x91\xcf\x01\x11\xd3\x8c\x7c\x43\x06\xd9\x44"
- "\xe1\x8f\xbf\xd2\xd4\x26\xfc\xd0\xaf\x4e\x31\x6b\x7e\x21\x31\x27"
- "\x1d\x5c\xff\x62\x32\xf9\x8a\x14\x7a\xb3\xe1\x94\x78\xe1\x1f\x52"
- "\xf5\x0b\xb9\xad\x80\x25\xd6\x29\xd2\x2f\xa4\xf0\x47\x70\x09\xdf"
- "\x90\xdc\xf5\x49\x82\xe6\x1b\x12\x7d\xa6\x73\x86\x29\x7c\x28\x18"
- "\xc0\x35\x39\xca\xaf\x8d\x61\x4c\x3f\x91\x7a\xd0\x48\xbd\xf4\x13"
- "\x79\x79\x6b\xcb\x74\xbb\xc4\x89\xe9\xcd\x5a\x5c\xea\xa8\x34\xc8"
- "\xb5\xd7\xaa\x34\xe8\xba\x1a\x35\x0d\xfc\xcf\xaf\xea\xc2\x7c\x18"
- "\x68\x1b\xe9\x0f\xf1\x3e\x91\x3b\x73\x36\x47\xcf\x21\xc6\x68\x89"
- "\x9e\x80\xb9\x35\x11\xbf\x49\xf4\x9b\x13\xa6\x13\x43\xbc\x93\x64"
- "\x01\x8b\x0e\xeb\x8a\x23\x86\xcf\x0b\x06\x63\x32\x83\xba\x83\xc4"
- "\x63\xd2\xd9\xea\x79\xa1\x20\x9d\xf1\x37\xcc\x0b\x0d\x52\xbc\xc8"
- "\x83\x74\x66\xac\x7a\x29\x9d\x61\x9c\xce\x29\x96\xcc\xbc\xd0\xd7"
- "\x7c\xbb\x3c\x9b\xd9\x41\x32\x40\x68\x88\xef\x0f\x15\xf0\x36\x8c"
- "\x81\x99\xe4\x0b\xf2\xb3\x15\xaf\x0b\xb0\x78\x7b\xcc\x07\x8f\x9c"
- "\xfb\x80\x93\x8f\x2d\x8a\x23\xa6\x94\x06\x40\x13\x6d\xba\xcc\x60"
- "\x4c\xb1\x27\xd8\x2b\x7c\xf9\xcf\x0b\x4d\xe2\xf3\x1c\xf7\x70\x11"
- "\xff\xab\x80\xb7\x82\x9e\xc6\x88\x98\xd0\x6b\xf8\x20\xee\x8d\xf3"
- "\xd6\x0c\x72\x8a\x57\x89\xb2\x29\x1e\xc4\x85\x79\x0e\xc5\x99\xe9"
- "\xd0\xe1\xbb\xa3\xf8\xee\x28\xda\x93\x86\x32\x13\xf0\x7c\x2f\xdf"
- "\xbe\x94\xce\x3a\x15\x0b\x19\x07\x7d\x74\xab\xe7\x47\x5b\xd0\xbe"
- "\x5d\xe4\x0b\x3c\x33\xe8\x2e\xde\xae\x9e\x07\x15\xb1\x52\x1d\x23"
- "\x5c\xad\x67\xd6\xbc\x35\xec\xde\xcc\x35\xd3\xc5\xb9\x52\x3a\x33"
- "\x35\x2f\x68\x43\x9d\xc5\x04\x0f\xb3\x88\x4f\x4d\xe7\xa6\x4a\x67"
- "\x64\x5c\x2a\xce\xe5\x98\x72\x75\xe9\x50\x16\xaf\x7c\x75\x01\x2f"
- "\x3d\x7f\x17\xae\x07\x79\xd9\x61\x3a\x7f\x0f\xfe\x24\x68\xe0\x95"
- "\x3b\x90\xae\x1c\xc4\x15\x72\x91\x6e\x07\xaf\x7c\x6d\x01\x2f\x37"
- "\xe4\xe3\x7a\x90\x97\x1e\xbe\x1b\xf9\xe7\xf3\x52\x2f\x7d\xd7\xc1"
- "\x4b\x8f\xa4\x22\x1f\x9e\x7b\x92\x71\xc5\xf3\xd1\x24\xe4\xc3\x73"
- "\x6f\x62\x9f\x6e\x26\xdd\x77\xf0\xf2\x49\xb3\x45\x5d\xe5\xa6\xd9"
- "\xa2\xae\xf2\xb8\xd9\xa2\x8e\xf2\x84\xd9\xb2\x8e\x2b\x67\xcb\x3a"
- "\xa6\xce\x96\x75\x1c\x33\x23\x5f\x06\x2f\xed\x2b\xc4\xb5\x93\x97"
- "\x1e\x1f\x40\x3e\x3c\x9f\x58\x88\x2b\x9e\x4f\xee\x47\x3e\x3c\x0f"
- "\xa0\x2d\xaf\xe1\xf9\x54\x13\xf2\x2d\xe4\xa5\x5f\xdb\x70\xed\xe6"
- "\xa5\xbe\x4d\xc8\x87\xe7\xb3\x46\x5c\xf1\x3c\x88\x72\x5e\xc3\xb3"
- "\xdf\x87\x6b\x37\x2f\xbf\x86\xda\xb1\x88\x97\x4f\x43\xb9\xaf\x7a"
- "\x79\x79\x12\xe5\xc7\xf3\xf5\x28\x6f\x07\x9e\xa7\xf7\x22\x1f\x9e"
- "\x67\x54\xe0\x8a\xe7\x6f\x51\x5f\xb3\x78\x79\xb2\x17\xd7\x5e\x5e"
- "\x7e\x23\xd2\x77\xe0\x39\x65\x16\xae\x78\xbe\x89\xf2\xe3\xf9\xdb"
- "\x35\xb8\xe2\xf9\x16\x82\x51\x0e\x2f\xbf\xad\x0e\xd7\x7e\x5e\x7e"
- "\x7b\x10\xf9\xf0\x7c\x17\xb5\x1f\xcf\xff\xb0\x1b\xf9\xf0\xfc\x5d"
- "\x82\x0f\x9e\xff\x1f\xea\xe7\x72\x5e\x7e\x0f\x95\x3f\xc0\xcb\xd3"
- "\x09\x2e\x78\xbe\xbf\x11\x57\x3c\x3f\x08\x78\xbc\x86\xe7\x7f\xb6"
- "\xe3\x3a\x30\xe6\x78\x96\xff\xcb\x1c\x5e\x32\x91\xf1\xf2\x1f\xe4"
- "\xf0\x92\x49\xb8\x3e\x66\xe5\x25\x13\x52\x78\x79\x86\x03\xe9\xb8"
- "\x3e\xe6\xc3\x73\xaa\xfa\x8c\xeb\x0f\xdb\xf0\x9c\xa6\x3e\xe3\xfa"
- "\x6f\x0d\x78\xbe\x4b\x7d\xc6\xf5\xc7\x29\x78\x9e\xc5\xcb\x7f\xc2"
- "\xf0\x8c\xeb\x8f\x37\xe1\xf9\x6e\xf5\x19\xd7\x85\xad\xb8\x06\x7d"
- "\xd7\xad\xb0\xfa\xe2\x72\x3b\x7c\x71\x6f\xa4\x93\xdd\x51\xa8\xea"
- "\xd5\xf9\x4a\xfc\xab\xe4\xbf\x77\xa2\xf3\x1c\x9b\xd4\xa7\x4b\xfe"
- "\x94\xd6\x37\x4f\xa1\x57\xc4\x93\x53\xfd\xca\x4d\xec\xd1\x7d\xeb"
- "\x18\xd6\xf3\x59\x14\x83\x1b\x7d\xae\xe0\xae\x09\x67\xd1\x57\x33"
- "\x77\x4d\xee\xc1\x15\xcf\x53\x3e\x43\x5f\xf1\xfc\x0f\xe5\xb8\xe2"
- "\xf9\x27\xf7\xf3\xca\xd7\xcd\xc3\xa5\xc9\xb3\xbd\xba\x19\xd2\xcf"
- "\xd2\xeb\x2b\xd3\x2c\x41\x27\xe8\x04\x68\xe8\xe6\xb7\x40\x07\x17"
- "\x31\x5e\xf9\x86\xd7\x42\x71\x1f\xb6\xad\xc8\xe0\xf1\x79\xa2\x4d"
- "\x14\xdb\x85\x8f\x24\xeb\x65\xdd\x93\x79\x8f\x2e\xf9\x69\xd2\x5b"
- "\xf2\xf8\xe7\xc6\x7b\xff\xbc\x78\x3f\xed\xad\x04\xf9\x3e\x81\x45"
- "\xde\xff\x1b\xbd\x7f\xc7\x42\xba\xe6\xeb\x1f\x4f\xf0\xea\x92\x3b"
- "\x29\x8f\x57\xf7\x2d\x3f\x77\xc5\x30\x8f\xbf\x5f\xed\xe3\x24\xca"
- "\xd7\x45\xdf\x8d\xa7\x3f\x51\x2a\x9a\x66\x55\xba\x78\x07\xc9\x8a"
- "\xa0\xf9\x7a\x5b\x51\x72\x4b\x8f\xee\xc6\xc6\x6d\x42\x07\xb0\xb3"
- "\x93\xce\xf0\xf4\xe8\x6e\x78\x6a\xa4\xdc\x9b\x60\x5b\x6b\x41\x79"
- "\x37\xbe\xe9\x0c\x70\xbf\xbb\xe8\x7e\xac\x4d\x22\x7d\xae\xb0\x0b"
- "\x97\xf7\xb3\xa4\x2d\x8f\xb8\x4f\x96\xfa\xcc\x1b\x1b\xe9\xdb\x68"
- "\xde\x3c\x54\x3a\xaf\x56\x89\xdf\xe9\x95\x7b\x51\x37\x3c\xfd\x9e"
- "\xe2\xd5\x5b\xf2\xd9\x04\xdb\xda\x0f\x50\xfe\x0d\x2d\xa3\xe5\x38"
- "\x2d\xaf\x78\xb7\xed\x7d\xe4\xdd\x2a\x74\x2e\x37\xb4\x69\xfa\x5a"
- "\x8e\x3e\x3c\x27\x79\x98\x74\x5a\x87\x24\x2f\x76\xe3\x1c\xf2\x5d"
- "\x19\x34\xbf\xe1\x0e\x56\xe4\xba\x43\x15\x3b\x3b\x79\xd5\x4e\x6f"
- "\x7c\x50\xc7\x84\x4d\xbd\xee\xc6\x75\xb7\x05\x48\x17\xf6\x31\xe5"
- "\xfd\x8e\x32\x31\x63\xff\xad\x0e\xa6\x77\xe7\x7e\x49\xcf\xab\x78"
- "\xe9\xe3\xb3\x3d\x03\x9d\x8c\xfc\xef\xe2\x39\x9f\x97\x2e\x6b\x53"
- "\x26\x2e\xe9\xa8\x27\x1e\xd2\x41\x3a\x9c\xcf\x08\x2e\xe7\x01\x67"
- "\xf0\xe6\x37\x2e\xd0\xda\x42\xfe\xf7\x2b\x01\x3b\xe2\xef\xe8\x0c"
- "\x74\x66\x28\x44\xfe\x9a\xca\xbc\x80\x83\xd4\x03\xde\x38\x8b\xe8"
- "\xac\x5a\x6f\xa5\x62\x3a\x1c\x6c\x5f\x48\xfb\x9d\x09\xe4\xff\xc6"
- "\x2f\xce\x4c\x06\x29\x66\x1e\xad\x6d\x32\xef\x28\x9f\xc3\x4b\xec"
- "\x99\x6b\xed\x2b\x73\xf3\x33\x57\xd9\xbf\x67\x83\x80\x65\x5b\xb9"
- "\xd4\xf6\x54\xf6\x53\x2b\x73\xd7\x5c\xcc\x07\x1a\xd1\xae\x01\xe0"
- "\x46\x80\xda\xb5\x0f\xbc\xa5\xd4\x0d\xa7\xec\xa6\xb1\xde\xfc\xb2"
- "\x8c\xd1\x30\x5c\xfa\x7f\x12\xbc\xac\x42\xf8\xdf\x52\x6a\x77\x06"
- "\x78\xdd\x8a\x8c\x8d\x74\xf6\x7b\x15\xf1\xf2\x3e\xe6\x61\x67\xd1"
- "\x36\x19\xaf\xaf\x9d\xfc\x13\x14\x14\x72\x77\xc1\x59\xc2\xf1\x4e"
- "\xcc\x85\x7e\xe0\x78\xc3\xf9\xca\xbc\x59\x3d\xba\x14\x5c\x5f\xef"
- "\xd4\x62\xea\x84\x2a\xde\x98\xa5\x98\x9b\xe6\x53\x4c\x9d\x11\x6e"
- "\x65\x07\x00\xcb\x0b\x65\x87\xfb\x41\xe3\x7b\xb7\xb9\xb0\xee\x40"
- "\x06\x10\x7e\x11\x5e\x5f\x99\x10\xe2\x29\x86\x90\x8b\x19\x71\x8d"
- "\xe7\xf1\x3b\x8b\x47\xcc\x6f\x74\xd0\x7b\x8a\xa5\x13\x1a\x49\x61"
- "\x45\x07\xb9\xf2\xe3\x1c\xe0\x8d\x8b\x71\x11\xbf\x34\xe7\x14\x43"
- "\xba\x49\xa9\x7a\x63\x51\xdf\x1c\xa6\xa7\xbc\xe0\x69\xd8\x42\xdc"
- "\x17\x2e\x66\x71\xc8\x67\x29\xdc\x87\xf4\xe1\x14\x53\xd0\x99\x62"
- "\xbc\xe0\x4c\x31\x8d\xf0\x14\xb3\xa7\x37\xc0\x46\x6e\x58\x69\xbb"
- "\xc5\xc7\x0c\x9b\xc1\xfb\x6c\x53\x30\xbf\xea\x56\xa4\x87\x9e\x49"
- "\x99\x18\x7c\x26\xc5\x30\x32\x92\x62\x0c\xae\x4e\x31\x5c\x58\x9d"
- "\x32\x71\x64\x38\xc5\xe8\xc9\xf2\xb1\x8f\x7d\xbf\x64\xed\xbd\xfd"
- "\x42\x7f\x38\x12\xb7\xb3\x62\x24\xee\x8d\xe5\xe6\x5e\x96\x78\xab"
- "\x1d\x3c\x10\xf8\xbf\x2d\xe0\x75\x81\x13\xe6\xe0\x6b\x2b\x13\x78"
- "\xe5\xce\x34\xc0\xf7\xd9\x07\x6f\xe2\x5f\x87\x4a\x6f\x5d\x60\xfb"
- "\x17\xd0\xa2\x12\x43\x12\xd2\x80\x3f\xdf\x6b\xe5\xa5\xff\x68\x86"
- "\xdc\x6d\xc3\x2f\xd9\x2b\xc7\x01\x7c\xd7\x2d\x46\x3c\x27\x51\x5e"
- "\x99\xef\xce\x0c\xaf\xb8\xde\xd6\x28\xe2\x8c\x96\xde\xb8\x6b\x9b"
- "\x90\xc7\x52\xc2\xfe\x1f\x5a\x0d\x63\x9f\x2f\x47\x9e\xee\xb0\x5c"
- "\xab\x80\x9e\x54\xbe\x3a\x66\x9c\x76\x5e\xfe\x45\x2f\xed\x3d\x2a"
- "\x80\x5b\x9f\xee\xa6\x87\xc9\x27\x14\x77\xce\x51\x65\xc9\x9b\xc4"
- "\xde\x29\x9d\xc9\x26\x7d\x83\x9a\x26\xf4\x46\x8a\x3e\x9d\xfc\xe7"
- "\xb7\x90\x1f\x2e\xd2\x2f\x00\xaf\x21\x83\xdf\x44\x71\xcb\x26\x40"
- "\x0e\x6b\xc6\xaf\x05\x3f\xf7\x8b\xa4\x77\x70\xb1\x07\x35\x9d\xcc"
- "\xd8\x6d\xbd\xa9\xcc\xcb\x2a\x6b\x23\x72\xe9\x4d\xb5\xe8\xb7\xef"
- "\xf2\xed\xf6\x6e\xaa\xbd\x84\x7e\xd8\x40\xfe\x64\x79\xd5\xab\xf6"
- "\x1a\x25\xec\x7f\x16\x74\xff\xa6\x53\xa0\x13\xc5\xe2\x5d\xc5\x1b"
- "\xde\xa2\x33\x2c\x86\xde\x35\x93\x9d\x02\x9e\x6d\xb9\x3a\xee\xf1"
- "\x07\x18\xbe\x31\xf0\xa4\x15\x19\xcd\x43\x3e\x3d\xcd\x8b\x76\xa4"
- "\xf5\xe8\x6e\x9e\x50\x33\xa4\x96\x5b\xfb\x16\x73\x3e\xcd\x44\x3c"
- "\x10\x8a\x29\x44\xf3\xa5\xa6\x08\x32\x1f\xc5\x3f\xca\x8d\x01\xbd"
- "\xba\xf9\x3e\xdc\x1b\x29\x1f\x37\xbf\xe1\x55\x50\x06\xe6\xcd\x1c"
- "\x1e\xf7\x46\x9b\x52\xf9\xc6\x7c\xcc\x9d\x04\x7e\xdd\x8a\x16\x65"
- "\xf3\x4e\xc8\x1a\x37\x53\xff\x85\x8c\x43\xfe\x7e\x48\xa7\x11\x82"
- "\x6c\xdd\xde\x18\x64\xfc\xfe\x20\xdb\x9b\x7f\x8e\xf9\x62\x0f\x0f"
- "\xf8\xe2\x9a\x66\xf9\xe2\x76\xa6\x85\xe2\x9a\x1c\xf8\x15\xda\x73"
- "\x69\x9f\xf7\xdb\x0b\xc3\x7e\x2b\xcf\x5c\xda\x6f\x25\xca\x4c\xd6"
- "\x7c\x57\x86\x56\x5f\xbe\xdf\xca\x90\x7e\x8f\x61\x5b\xc1\x5f\xf7"
- "\x5b\x09\x1e\xb3\x03\xfc\xa5\x5b\xf3\x31\x12\x12\x76\xe3\xcc\x1c"
- "\x8a\x7b\xa3\x45\xf8\x29\x71\xb8\x85\xaf\x11\xe2\x35\x69\xad\x19"
- "\x2e\xfd\x76\xad\xc6\x3f\x12\xfd\x0c\x6d\x3c\x1c\xc0\x8f\xd2\x9b"
- "\xbd\xba\xef\xf7\x6a\xb4\x95\xc7\xe7\xfa\x42\xa6\xa5\x0b\x86\xe9"
- "\x2c\xc0\x48\xce\xbd\x94\x17\x70\x24\x7f\x5a\x31\xa1\x91\x9c\xbb"
- "\xf1\xbb\x07\xbf\xef\x87\x2a\x5f\xf7\x86\x2a\x77\x26\x84\x2a\x73"
- "\xfd\xf8\x05\xf0\x0b\x86\x2a\xf3\x18\x7e\x90\x63\xf2\xc0\x93\xe5"
- "\x99\x71\xc5\xfb\xbc\x44\xfc\xac\xf8\x25\xe1\x67\xc3\x2f\x39\xb4"
- "\x79\xa7\x2f\xa4\x33\x24\xe1\x97\x8c\x1f\xd2\x9a\xe6\x84\x2a\xdf"
- "\x70\x8b\xf3\x99\xa5\xa9\xe9\x1a\x9e\x8e\xed\x1f\x35\x56\xc4\x82"
- "\x9a\x37\xe1\x30\xb7\x50\xec\xdd\xc2\x73\xe4\xb3\x2e\xb0\x37\xc5"
- "\x7f\x79\x71\x2e\x74\xa9\xf6\xf1\xf0\x9a\xca\x07\x8d\x19\xb9\xcc"
- "\xf2\xdc\xe3\xea\x46\xac\x3b\x03\xc1\xa4\x15\xe4\xf3\xa1\x18\x74"
- "\x4d\xd7\xbe\xa8\x97\xcd\xf3\x31\xe7\xfe\xde\x0b\xcc\x99\xc5\x43"
- "\x82\x06\x14\x92\x3d\xf6\x8b\xc9\x84\xe3\x21\x9e\x61\x1b\xa9\x78"
- "\xbd\x3f\x64\x6e\x4a\xe0\xe6\xa6\x39\xc2\x0f\x1e\x68\x09\xc5\x13"
- "\x0b\xcb\x9f\x84\x73\x90\x41\x0f\x0c\x9c\x63\xcf\x64\x71\xe5\x40"
- "\x0e\x78\xaf\x4e\x20\x9e\x8e\xbd\x22\x70\x4f\x95\x41\xff\xdf\x6e"
- "\x5e\x0c\x5c\x8a\x0d\x01\x6e\x0a\xc9\x9e\xc0\xbb\xed\x05\x2c\x4d"
- "\xc3\x3d\xac\xe9\x09\x5a\x0c\x26\x3e\x31\x75\x01\xde\x19\x28\x46"
- "\x53\x1d\x64\xd0\xba\x02\x96\x5c\x87\x77\x22\x9e\x26\xda\xfd\x88"
- "\xdd\xc2\x95\x27\x53\x58\xfd\xcf\x98\x31\xee\x94\x8c\xd1\x1a\x02"
- "\xec\x23\x71\x0a\xf2\x66\x3d\x7c\xca\xc6\xf6\xa6\x7c\x85\xb5\xb9"
- "\x19\xe3\x92\x37\x6b\x04\xeb\x17\x60\x19\xba\x3c\x58\xde\x6a\xfe"
- "\xff\x0a\x96\x23\x49\x2b\xd2\x25\x3c\x17\x31\x82\xd9\xc5\xf0\x24"
- "\x18\xaf\xed\x05\x3c\x01\x57\xcf\xc1\x10\x64\x49\xb6\x58\x83\xe7"
- "\x56\xc0\x13\x30\xb5\x12\x4c\x01\x0f\x01\x53\xae\xc2\xb4\x3e\x0a"
- "\xa6\xa0\x5d\xc2\x67\x20\xc1\x54\x01\x4c\xeb\xc7\x81\x69\x58\x96"
- "\x07\x4c\xb7\xff\x4d\x30\x6d\xfc\x1f\xc0\xf4\xb6\x45\xe3\xc1\x34"
- "\x48\x7c\x43\x55\x5e\x1a\x07\x5d\xf4\x04\x3f\x16\xfe\x2f\xc1\xf3"
- "\x15\x82\x77\x75\x28\xe6\x37\x66\x51\xcc\x6d\xda\x83\xa7\x98\x60"
- "\xc2\x5f\x53\x23\x3f\x1f\xaa\xfa\xbf\xec\x7d\x0d\x40\x54\x55\xda"
- "\xff\x99\xeb\xa8\xa3\x0e\x30\xba\xd4\x92\xa1\x4d\x2e\xed\x8e\xad"
- "\x15\x95\xb5\xd6\x5a\x61\x59\x51\xa9\x60\x6b\xbb\xb8\x99\xa9\xa1"
- "\xa1\xe9\x48\x40\x4a\x8a\x80\x64\xbe\x4a\x0c\x52\x99\xeb\x07\x1f"
- "\xb6\x0e\x4a\x05\x45\x65\xbb\x54\x5a\x63\xe1\xff\xa5\x04\x86\x7a"
- "\x75\x5f\x6a\x6d\x9d\x8c\x8c\x0c\x6d\xd2\x49\x46\x98\x99\xf3\x7f"
- "\x9e\x73\xee\x65\xee\x0c\x0c\xcc\x0c\xf8\x91\xaf\xee\x4e\xcc\x9c"
- "\x7b\xee\xb9\xe7\x3c\xbf\xdf\xf3\x71\x3e\xee\x39\x15\x05\x98\x06"
- "\x76\x2d\xe9\x3a\x5c\xf7\x93\x6c\x01\xdf\x45\xab\xea\x4f\xe1\x98"
- "\xd7\x0d\x9b\xda\x30\xa6\xce\xaf\x30\xbb\x68\x12\x41\x9b\x32\x73"
- "\x34\x51\xb6\x81\xdd\x48\x5e\x42\xae\x28\x00\x5b\xd8\x66\x28\xcf"
- "\x38\xaa\x88\x1e\x7b\x77\xb2\x8b\xc2\x27\x0b\xf7\x71\x74\x81\xcd"
- "\xa5\x1b\x39\xbe\x88\x19\xce\xe5\xd5\xcd\xfc\x08\xca\xbb\xfe\xaa"
- "\x7d\xb3\x1c\x24\x2b\xa9\x33\xbe\xae\xac\x04\xad\x33\xaf\x67\x3d"
- "\xc1\x73\x09\x33\x9a\x11\xd7\x4a\x62\x6e\x72\xeb\x89\x4b\xb4\xd1"
- "\x88\x05\xea\x05\xea\xc8\x3a\x99\x6d\x06\xbb\xaf\x29\x12\xcf\xe9"
- "\x70\xe6\x80\x6d\xc6\x7d\xdd\x01\x4b\x3c\xbf\xa3\x4b\xfd\x58\x0e"
- "\xfa\xb1\x8c\x9d\xa1\x14\x01\xf2\xa8\x6c\x6b\xe5\x18\x22\x66\x66"
- "\x47\x0d\xc3\xaf\x40\xf4\x05\x5c\xee\xe5\x0f\x50\x9a\x00\xf1\x5c"
- "\x58\x8d\x2b\xbf\x22\x9b\xb6\x26\x0d\xc6\x73\xb4\xa0\xcf\x1f\x1d"
- "\x96\x08\xf1\xd3\x8f\xe0\x2b\xf4\xc0\xaf\xe3\x24\xaa\x44\x0f\x31"
- "\x51\x2b\x9e\x85\x06\xf5\x79\x9a\x9f\x21\xeb\x5a\x3d\xa6\x0a\xae"
- "\xb1\x7d\x29\x5d\xd2\xbe\x94\x27\x75\x38\x0e\xe1\x1e\x1b\x5a\xac"
- "\x13\xdc\xcf\xfc\xb6\xc0\xa9\x0e\xab\x61\xef\x91\x2a\xae\x3f\xc6"
- "\xe7\x8a\x6b\x92\x51\xae\x2d\x8a\x1b\xb4\x7c\xbc\xb6\x2e\x2d\x39"
- "\x13\xd7\xf7\x5c\x7f\x80\xe6\x1e\x48\x4a\xc6\xf3\xb0\xa5\x6b\x59"
- "\x50\xd7\x9c\x8f\x1c\xd7\x66\x93\x6c\xa7\x21\xac\x19\xcf\x49\xc7"
- "\x3d\xbe\x02\xe3\xe2\xf5\x6c\x9f\x5a\xe7\x9a\x6f\xd7\x83\x9c\x62"
- "\x5c\xb9\xdf\x16\x82\x4d\x89\xa6\x4f\x40\x5b\x17\x40\x5b\x8f\x82"
- "\x5c\x8f\x42\x5b\x97\x8a\x6d\x15\xcf\x87\x73\x81\xfc\xe1\x5a\xd7"
- "\xbe\x51\x6a\xeb\x13\x20\xef\x35\x7b\x63\x56\x1c\x23\xbf\xa2\x10"
- "\x8f\xd7\xb5\xb0\x77\x78\x5a\xcd\x8e\xaf\x08\x3e\x97\xf9\xee\xbc"
- "\x54\xd5\x43\xc0\x47\x94\x39\xc4\x0b\xc9\x34\x74\xc7\x2c\x09\x07"
- "\xac\x0f\x6d\x4f\x1a\x5c\xac\x87\xfa\xa0\xec\x8f\x93\x31\xa8\xcf"
- "\x20\xfb\xa8\x62\x94\xbf\xe7\x19\xcd\xe1\x0c\x83\x01\x80\x81\x5e"
- "\xc4\xc0\x20\x62\x00\xf1\x32\xf8\x61\x15\xf4\x1b\x23\x8a\x73\x38"
- "\x06\x81\xc9\xe8\x46\x9f\xeb\x6b\x82\xd4\xd7\xf5\xbe\xf5\xf5\xe6"
- "\xc9\x6d\xbc\x8f\xac\xc0\xfd\x31\xa1\x8f\xf0\x3f\xae\x76\xd0\xdb"
- "\x7c\x51\x6f\x69\xd2\xed\x92\xce\x1e\x51\xdc\xf8\xbd\x7f\x3a\x3b"
- "\xf6\x8b\xff\xa3\x3a\x1b\x7e\x66\x75\xf6\xa6\x97\x3d\x75\xf6\xa6"
- "\xfd\x9e\x3a\x7b\xd3\x5a\xb7\xce\x8a\xd7\xfa\x44\x67\x6f\xda\x7a"
- "\x6e\x74\xf6\xa6\xad\x5d\xe8\x6c\x9a\x1f\x3a\x1b\xe1\x43\x67\x23"
- "\xce\x9c\xce\xde\x5c\x7d\xf6\x7c\xec\xad\xfd\xdb\x84\x2e\x7c\xec"
- "\x72\x99\x8f\x0d\x41\x1f\xfb\x87\x8d\x5d\xe9\x6b\x7b\x21\xe8\xab"
- "\x5a\xd4\xd7\xbf\xbe\x07\xe5\x8d\x7b\xfe\xd3\x83\x3d\xeb\xab\xa3"
- "\xd0\x1d\x3f\xf9\xd4\xd9\x24\xd4\xd9\x32\x62\xb6\x30\x9d\x9d\x2d"
- "\xe9\x6c\xa1\xd8\x17\xea\x46\x6f\xc3\x7d\xe9\x2d\x9e\x99\x85\xe7"
- "\x65\x75\xab\xb7\x62\xbc\xd4\x3e\x02\xf5\xd6\x74\x9e\xf9\xda\x5b"
- "\xa6\x7b\xea\xed\x2d\x79\x9e\x7a\x7b\xcb\x04\xb7\xde\x8a\xd7\xfa"
- "\x44\x6f\x6f\x49\x38\x37\x7a\x7b\x4b\xc2\x2f\xc7\xd7\xde\x9a\x71"
- "\xf6\x7c\xed\x6d\x7b\x98\xde\xfa\xf2\xb5\x59\xa2\xaf\x0d\x41\x5f"
- "\xfb\xc7\x87\xfc\xd3\xdd\xf1\x93\xff\x8f\xeb\xee\x19\xf6\xb9\xb7"
- "\x5d\xe2\xa9\xbb\xb7\xc5\x7a\xea\xee\x78\xa7\x5b\x77\xc5\x6b\x7d"
- "\xa2\xbb\xb7\x85\x9f\x1b\xdd\xbd\x2d\xfc\x97\xe3\x73\x6f\x1f\xe7"
- "\x4b\x77\xb5\x23\x49\xf6\x61\xc5\xed\xcf\x9b\x0b\xd9\x7a\xbd\x6c"
- "\xb3\xe3\x56\xc2\xd7\x95\xdc\xfe\xae\x39\x62\x1c\x71\xe5\x5a\x66"
- "\xe1\xf9\x0f\xb8\xbe\xe5\x45\xd9\xfa\x11\xbe\xde\xe1\x76\xf7\x39"
- "\xa7\xe2\x19\x11\xdd\xad\x7f\xa1\x6b\x0e\x89\xeb\x24\xee\xe0\x6b"
- "\xc0\xd6\x1c\xb2\x4b\xbf\xd9\xfe\x54\x8a\x3b\x22\xe8\xda\x43\x56"
- "\xeb\xa0\x43\x5d\x9e\xa3\x80\xf3\x09\xa1\x2b\x29\xc5\xb3\x95\x4e"
- "\x8e\xd4\x9b\x4e\xe6\x12\x52\xc0\xe6\x61\xee\x88\x87\x36\xb2\xb9"
- "\xb0\x93\xa1\xa3\x2a\x4f\xe6\xc4\x13\x48\x4b\x94\xd2\xd8\x39\xd5"
- "\x39\xfd\xa8\x0b\xae\x81\x0d\x29\x2c\xc9\x24\x2a\xdc\xf3\xf3\xda"
- "\x53\xc8\xc5\x3b\xd2\xc0\x46\x84\xe3\xf9\x4c\x78\x26\x06\xfd\xf5"
- "\xe5\xb6\xe2\x13\x44\x59\xbf\x8a\x8d\x3d\xe3\xba\x99\xad\xf9\xc8"
- "\xff\x7e\x57\x6f\xa4\x82\x92\xb8\x8a\xf4\x65\x34\xa4\x3c\x9b\xad"
- "\xd3\x05\xae\x48\x6b\x69\xf0\x6c\x33\xd7\x08\x7d\xac\xb4\xe7\x24"
- "\x85\xfa\x7d\x90\x69\x15\xf0\x3c\xf1\xe2\x14\xa2\x81\x8f\x9a\x1a"
- "\xca\xb3\xa1\x5e\x0e\x69\x2c\xd1\xe7\x9a\x6b\x3c\x6b\xf7\xf2\x08"
- "\xa5\xb8\x6e\x07\xdf\x9d\x65\xe3\xcb\xeb\x04\xd7\x1a\x27\xa4\xd3"
- "\x9c\x2c\x76\x46\x56\x18\xc8\x02\xd7\xc9\xe2\xd9\x45\xae\x62\x3d"
- "\x9e\x17\x40\x5e\x5f\xd6\x2c\xe0\xba\x0d\xe7\xdf\x2e\xb7\x99\x32"
- "\x6f\xc0\xbd\x25\xd8\xbe\xe4\x47\x14\x31\xa7\xe3\xbe\xe7\xe7\xea"
- "\x1e\x51\x4c\xe8\x8f\xf3\x2f\x93\xe1\x37\xce\xe5\xbb\x4e\x46\x28"
- "\x31\x2f\xe4\x79\xd3\xb4\xe4\x4b\x12\x96\xcc\xd6\xb2\xab\x78\xde"
- "\x98\x6c\xcc\x6b\x51\x4c\x60\x6b\x0a\xe1\xf7\x7a\x9c\x33\xc0\xf5"
- "\xee\xb8\x36\x89\x16\xea\xcb\x98\x7d\xc8\x2b\xcf\x86\xf6\x97\xb1"
- "\x35\xa6\xd0\xce\x75\xd0\x66\xc8\xa3\xc6\x75\x38\xec\x6f\x26\xd1"
- "\xac\x87\x34\x2c\x07\xfe\xaa\x4d\x7a\x5c\x57\x12\x93\x8c\x65\xfb"
- "\x5c\xcb\xaf\x2e\xcf\xa6\x39\x4a\xc2\xdf\xc7\x51\x7c\x76\x58\x31"
- "\xc1\x18\xa6\xa0\x14\x9e\x19\xfb\x0c\x8e\x71\xe3\xfa\x69\xb6\x26"
- "\x7c\xc2\x0a\x28\x5f\x59\xc2\xc6\x70\x27\xcc\xb0\x28\x62\x54\xe2"
- "\x3e\x18\xfc\x6c\x15\xc5\x84\x9d\xf8\x1c\xbc\x47\xcc\xcf\xf7\xf9"
- "\x80\x3a\x6b\x33\xfb\x51\xf8\x5d\xc4\xd7\x58\xab\x66\xc1\xfd\x85"
- "\xee\xb5\x65\xec\x3e\xe0\xd2\x84\x4a\xe0\x26\xdb\xbf\x05\x7f\xfb"
- "\x5c\xbf\x2c\xe2\x56\x17\x01\xdc\xf0\xc6\x4e\xe2\x08\xf0\x42\xe2"
- "\x08\xd6\xf7\x8d\x4c\x8b\xc0\xe7\x37\xee\x64\xfb\xef\xe7\x03\x86"
- "\xce\x2d\x11\x4a\xb6\xb7\x77\x3b\xe2\x82\xeb\xe0\xef\xfc\x19\x71"
- "\x59\x07\xbe\x40\xcc\x1b\xe1\xae\x3f\xfe\xbe\x8b\xe1\xe9\x02\x2c"
- "\xf8\x7a\xfc\x3b\x3f\x61\xe7\xc4\x80\xcd\xc0\xb5\xe0\xd5\xe9\x04"
- "\xe7\x81\xcb\x28\x70\xe4\xf5\x14\xbb\x50\xbc\x84\xa7\x7f\x70\xc2"
- "\x2e\xe0\xba\x0f\x1c\x0b\x37\x2c\x20\x6c\x4c\x1d\xcb\xa4\x91\xfa"
- "\xd8\xeb\x24\x1c\x97\x01\x76\x4b\x80\xbb\x20\xf3\x75\x20\xbf\xe2"
- "\x36\x36\x5f\x15\x5b\xec\x22\x6a\x17\xe4\xb3\x28\xee\x52\x42\x79"
- "\x9a\xa2\x4b\xa9\x15\xd7\x5f\x83\x0c\xd3\x5a\x57\xdf\x69\x91\x64"
- "\x88\x75\xc2\xf5\xd3\x06\xb6\x8e\xfe\xce\x19\x9c\x43\x77\x8e\x91"
- "\xda\xec\x4b\x9e\x86\xd7\x49\xa4\xe1\x5a\x32\xce\xa5\x1e\x64\xa7"
- "\xfd\x2e\xdf\x8a\xe3\xcd\x53\x5a\x08\xc1\xbd\xec\xe3\x9e\x3d\x44"
- "\xcd\x56\x27\x71\x85\x0c\xb2\xe3\xdc\x84\xf3\x99\xab\x87\xc5\x3d"
- "\x0d\xf2\x02\x7f\x9f\x65\x27\x1a\x73\xa6\x95\x9f\x67\x46\x7e\x22"
- "\xce\x54\xb0\xe1\x60\xd7\xc1\xa7\x2a\xb3\x7e\x22\x78\xd6\x28\xdc"
- "\xb7\xbd\x19\x64\xf6\xce\x43\x69\x24\x3b\x30\x3b\x7a\x17\xb3\x6d"
- "\x18\x5f\x80\xcd\x17\xd8\xb9\xf6\x56\x88\x4f\x0c\xdb\x03\x3b\x7b"
- "\x59\x71\x97\xcf\xf3\x82\xb0\xdd\x2e\x1c\x87\x16\xdb\x1c\x87\x6d"
- "\xb6\xd9\x09\x8e\xe5\x4f\x79\x12\xf7\x0c\xfd\x99\xb8\x0c\x83\xec"
- "\xd8\x66\x88\x75\x92\x02\x1f\xd3\x9f\x38\xb1\xbb\x67\x53\x90\xb7"
- "\xeb\x99\xcb\xb7\xba\xd4\xe5\x49\xf8\x6c\xac\x03\xbe\x47\x33\xe5"
- "\x67\xc2\xe4\x8e\xf2\x37\xdb\x9d\x84\x86\xc8\xeb\xe0\x08\xb4\x0e"
- "\xbe\xdb\x7f\x2d\x89\xcc\x7b\x9d\xe3\xee\x7c\x46\x94\x41\x12\xce"
- "\x91\x95\x27\xe1\x5e\xf6\x53\xb0\x0e\xd6\x63\x64\xf2\x31\xc2\xf0"
- "\x37\xeb\x5a\x88\xb3\xdf\xd5\xc3\x70\x4d\x05\xe2\x9f\xe9\x00\xfc"
- "\x4f\xd9\x71\x9f\x0f\xab\x39\xfb\x34\xc1\xf8\xc5\x71\x52\x27\x74"
- "\xc6\xff\xee\x77\x1e\x4a\x0f\x14\xff\xbb\xfb\x08\xff\xbb\xcf\x83"
- "\xf6\xdf\x13\x44\xfb\xef\xe9\xa3\xf6\xdf\x73\x1e\xb4\xff\xde\x20"
- "\xda\x7f\x6f\x1f\xb5\xff\x5e\x9f\xed\xbf\xeb\x32\x17\x65\x6b\x6d"
- "\x42\xb7\xc5\xa3\x0f\xe0\xfe\x2a\xb6\x02\xd7\xd2\xb0\xf7\xa6\xc4"
- "\xdf\x84\xbf\x47\xa5\xf2\xfa\xad\xf6\xfa\xad\xf1\xfa\x1d\xee\xf5"
- "\x3b\xc2\xeb\x77\xa4\xf4\x1b\xfc\x48\xff\xe3\x8a\xd8\x11\x10\x97"
- "\x66\x5b\x14\xb1\x55\xe2\xf5\x28\xdc\x07\x07\x7c\x7a\x94\xaf\x33"
- "\xf5\x42\x14\x84\xb6\x0b\x94\xb0\xb3\xee\x14\xf7\x8d\x69\xcb\x21"
- "\x94\xf6\x1b\xae\xc3\xf3\xc8\x5c\x79\xa9\xe1\x53\xc0\x4e\x9b\xad"
- "\x76\x88\xf3\x23\x06\x40\xd9\xbf\xc6\x73\x16\x11\x57\x6d\x0a\xae"
- "\xad\xb9\xef\x32\x6c\xe7\xb5\xc9\x26\xe2\xea\x77\x35\x5b\xdb\xe0"
- "\x32\xa4\x86\x5b\xfb\x5d\x3d\x9c\x6e\xaa\xb0\x1a\x72\x5c\x2a\x73"
- "\xcb\x7e\x92\x2f\xb8\xb4\x19\x19\x80\x6f\xcb\x4e\xb2\xbc\x85\x36"
- "\x67\x38\xa8\xdd\x3c\xc3\x44\xb2\xac\x78\x4e\x49\x0d\xa9\xb7\xee"
- "\x67\x67\x95\xb0\x33\x59\xac\x3b\x09\xc6\x3f\x59\x98\x07\xd2\xea"
- "\xad\xe5\xa4\x0e\x7e\x9b\xf4\xdf\x42\x3b\xef\xfb\xc4\xdc\x52\x0e"
- "\xfd\xa5\x54\x8d\x4b\x9d\x62\xa3\xea\x14\x7b\x5d\x0b\x9e\xc5\x9a"
- "\xe2\xc0\xba\xd6\x43\x3d\xcc\x8e\x2a\xc0\x37\xc5\xc1\xca\xb5\x35"
- "\xb0\x3e\x29\xce\xd9\xba\x42\x20\x7f\x48\x8a\x1d\xeb\x87\x75\xeb"
- "\x7a\x1e\x76\xdb\x2a\xa8\xfb\xad\x0f\xe9\x94\x04\xdf\x75\x08\x8c"
- "\x23\xf7\x75\x73\xfe\xa5\x51\xc9\xcb\x55\x05\x51\xee\xfd\x3e\xed"
- "\x3f\x94\x2b\xd6\x57\x13\x4c\xb9\x85\xbe\xcb\x2d\x15\xeb\xab\x0d"
- "\xa6\x5c\x5b\x37\xe5\x8a\xf5\x8d\x09\xa2\xdc\x07\x7c\xee\x7f\x40"
- "\xf3\xb6\x8b\xf5\xcd\x0e\xa6\x5c\xa3\xef\x72\xb7\xad\x0a\x8e\x0b"
- "\x0f\xd8\xbb\xe3\x42\x70\x3c\x98\xd4\x4d\xfb\x8d\xab\x82\xe3\xc0"
- "\xa4\xad\xdd\x71\x20\x38\xfc\x27\x75\x8b\x7f\x70\xd8\x4f\x8e\xed"
- "\x0e\xfb\xe0\x70\x9f\xec\x93\xff\xd8\x37\x00\xec\x63\x68\x68\x85"
- "\xc5\x95\x9f\x1a\xe3\x0a\xdd\x76\xe7\x33\xae\x18\x72\xd7\x0a\x42"
- "\xc2\x36\x92\xa1\x77\x15\x1d\xa2\x31\xac\xcf\x3d\x65\xec\x8a\x42"
- "\x22\x40\x1f\x5a\xa8\x58\xd6\x28\x98\x1d\xe3\xd0\x6e\x39\x8d\x4b"
- "\xec\x8a\xdf\x40\xfa\x1e\xf0\x83\x36\x88\x65\x79\x59\xa9\x31\xf9"
- "\x99\x31\x84\xbd\x07\x07\xfd\x88\x29\x4f\x1e\xa2\xb8\x87\x60\xdc"
- "\x4f\x60\x5f\x37\xe2\x9e\x84\x64\x28\xdc\xeb\x00\x1e\x43\x39\x76"
- "\xf2\x86\xcb\xaa\x98\x62\x65\x79\xad\x6c\x6d\x7a\xfe\xb6\x3b\xb1"
- "\xaf\x40\xb3\x74\xb8\xbf\x98\x15\x9e\x5d\xda\xcf\x4a\x84\x62\x3c"
- "\x23\x67\xf5\x94\xad\x16\x45\x5c\x81\xf8\x2e\x69\x0b\xdb\x07\x0f"
- "\xea\x8e\xfb\xe0\x3d\x03\xfd\x06\xcc\x7f\x6d\x32\x11\x70\xaf\x62"
- "\xc8\x5b\x8b\x7b\xe3\x75\xf7\x4e\xb6\x33\xaf\x3c\x0a\xef\x07\xd9"
- "\x36\x67\x1e\x23\x42\xbd\xcd\x4a\xa0\x8f\xb1\x35\x1f\xfa\x27\x77"
- "\x8f\xc6\xf1\x94\x13\x24\x73\x05\x75\xe1\xd8\x16\x55\x6f\x6f\xc4"
- "\xb5\x87\x6c\xdf\x76\x45\x5c\x12\xf6\xf5\xc5\xb3\x91\x86\x1f\x55"
- "\xc4\xb1\x3d\x57\xf3\x71\x0d\x8e\x3a\xa5\x86\xe6\x87\xc4\xd4\xdb"
- "\x4e\xb0\x73\x39\x0e\x2b\xe2\xe6\xe3\x1e\x65\x27\xd5\xe5\x5a\x9b"
- "\xba\x5c\xd7\xba\x3a\x2e\x51\x6a\x03\x3e\x5f\x4a\xc7\x3e\x21\xe6"
- "\x83\xeb\x1d\xfb\xbf\xf8\x38\x3f\x78\x58\x5c\x04\xb5\xa2\x7c\x79"
- "\x5d\xe2\xbf\x47\x0c\x20\x0e\x89\xb0\x65\xe9\x46\xf2\x31\x92\x78"
- "\x0d\xf6\xb5\xa1\xde\xfc\xcc\x43\x43\xaa\x92\xbd\x8f\x0f\xfe\xe0"
- "\x21\x9d\x10\x60\x4c\x1c\xc7\xf6\x59\x33\x8d\x44\xff\x1b\xff\x19"
- "\x94\xff\xc7\xc3\x8a\xf8\xb1\xbc\x9f\x97\x1a\xc1\xdf\xb3\x8c\x6b"
- "\x80\x67\x44\x80\x7f\x32\x61\x3e\xb8\x3e\x4d\xbc\xae\x95\x5d\xd7"
- "\xe2\x5a\x54\xf1\x7a\x9a\x78\x3d\x4a\x76\x3d\x2a\x79\x24\x8e\x7b"
- "\xc4\x17\x62\x1b\xa8\x3a\x15\xeb\xcf\xe6\x09\xf9\xb9\x8d\xa9\x44"
- "\xcc\x17\xde\xa2\x88\x7f\xe7\x24\x70\x0c\xae\x47\xca\xee\x8f\xfc"
- "\x38\x3d\x9a\xdc\x55\x84\x32\x8c\xaf\xb1\x08\xaf\x8d\xe1\x7d\xe5"
- "\xb8\xfd\xac\xed\xe0\x43\xe5\xe5\x59\x14\xf1\xeb\xd1\x4f\xda\x20"
- "\x46\x83\x3c\xbb\xf0\x99\x72\x79\x4b\x6f\x7b\x6a\x13\x17\xcd\xd6"
- "\x3e\xb6\xf8\x29\x3d\xbe\xad\xe7\xf9\x1e\x9a\x06\xdf\x67\x75\xe5"
- "\x95\xa9\xcc\x1b\xf1\xfd\x3a\x0d\x7b\x97\x7b\x3d\xe0\xe8\xc8\xaf"
- "\x88\x71\x86\x96\x37\x38\xf3\xb7\x5b\xb3\x7e\x26\x42\x66\x04\xfd"
- "\xda\xb4\xec\x4e\x72\x5c\x31\x75\x36\x3b\x0f\x52\xcb\xf6\xbe\xb7"
- "\x99\x96\x7d\x84\x69\x6c\xdf\x12\xf3\x2c\x9e\xf6\x76\x66\x8d\xf0"
- "\x61\x66\xa3\x50\x3b\xeb\x04\xf9\x38\xc2\x4a\xaa\xb5\x27\x70\xff"
- "\x57\xdb\xdb\xae\x06\x01\xd7\xe6\x42\xfe\x4f\xf0\x59\x38\x7e\x80"
- "\xdf\xf9\x58\xc8\xd4\xc9\xf8\x1c\x5c\xb7\xd8\xa2\x98\x3a\x15\x9f"
- "\x67\x51\x4c\x8d\xef\x57\xc8\xd6\x72\xab\x8f\x2b\x1e\x0c\x71\x19"
- "\xca\xb8\xbe\xaf\x9e\x4a\x1c\x82\xda\x28\xbe\xbf\x47\x0a\x87\xe1"
- "\x1a\xdd\xa9\x76\xd9\xfb\x6c\xea\x93\x02\xb9\xa3\x75\xf5\x83\x6a"
- "\x69\x6f\x0a\x3c\x23\xc8\x97\xfd\x38\x0d\xfd\xe4\xd3\x85\x7a\x9d"
- "\x4b\xbd\x03\xe4\x5b\xa6\xaa\x81\x08\x32\x8c\x9d\x39\xdf\x06\x75"
- "\xf9\x53\x0b\x0d\xd9\x61\xcf\x44\x3d\x05\x59\xbc\x86\x6b\x08\x43"
- "\x2b\x62\xca\x71\xcd\x60\x7e\x79\xc3\xab\x4b\xec\xc2\xa7\xb5\x55"
- "\x44\xfb\x67\x8c\xb1\x1e\x5c\xf1\x40\x22\x75\x5c\xbd\xdf\x44\x6a"
- "\x9b\xde\x22\xfb\x0e\xd6\x10\xf5\x0c\xd2\x2f\xcb\x42\x9d\x6c\x2c"
- "\x21\x8d\x08\x71\x16\xd2\x0f\xf7\x4d\xc2\xbd\xd2\xf1\x5c\xf4\x7a"
- "\x7b\x1d\xc4\x3d\x2f\x46\x55\x64\x36\xf7\xd7\x3e\x48\x20\x5e\xe2"
- "\x73\xd2\xec\xfd\x1f\x2b\x7b\xff\x3a\x04\xc7\xc7\x65\xef\xfd\x64"
- "\xac\x38\x46\x54\x75\x49\x5f\x91\x8c\x59\xd4\x85\x6b\xfc\xe2\x66"
- "\xf5\xa3\xec\xdd\x9f\x74\xc8\x9c\x0c\x98\x2e\xd5\x85\x6e\x5e\x42"
- "\xc2\xeb\xd3\x2c\xc4\xdc\x5c\x43\xb6\xa4\x90\x70\xda\x9a\x34\xa8"
- "\xb6\xf6\x53\x42\xf3\x87\x98\xde\xc8\x34\xf5\x97\xd6\x63\x85\xad"
- "\x54\xa0\x7e\x85\xe6\xe1\xba\xac\x53\x24\xfa\xd1\x6f\xb3\xd9\x18"
- "\x2e\x8e\x97\x3b\x5a\x75\xda\xf6\x56\xdd\xa8\xb6\x56\xdd\x48\x69"
- "\x9c\xfd\x91\xf9\x1a\x52\x84\xef\x0c\xad\x9e\x98\x87\xef\x0c\x61"
- "\x7c\xe9\x08\x09\xab\xc1\x31\x75\xb6\x0f\xcc\x52\x5d\xa4\xeb\x31"
- "\x1d\xb9\xce\xca\xde\x49\xc2\x71\x7e\x4d\xf1\x1c\xa8\x6f\xcb\x09"
- "\x22\x5f\x5b\x74\x7a\xa9\x4e\xc0\x75\x45\x74\xf5\x83\x51\x6d\x45"
- "\x7a\x1d\xae\x2f\x02\xbf\x30\x2e\x70\xdd\xfe\x13\x8b\x9f\xb1\xfd"
- "\x14\x38\x5b\x7e\x02\xf1\x01\x9c\x4e\x58\x05\xc4\xa2\x2e\x11\x71"
- "\x68\xf0\xc0\x81\xe1\x96\x62\x17\x10\x0f\xc4\x02\x31\x71\xe3\x71"
- "\x80\xe1\x51\xee\xe2\x78\xb4\x81\x3f\x90\x30\x39\x1d\xa9\x1f\xd7"
- "\x1d\x2e\x88\x07\x62\x53\xdb\xf4\x15\xf1\xc0\xc4\xca\x31\x01\x79"
- "\x0e\x93\x70\x41\x4c\xcc\x2d\x10\xf3\x02\x2e\xf7\x1f\x20\xe4\x81"
- "\xd1\xd4\x55\x37\xe9\xf3\x0e\x7c\x1c\xbe\xf0\xf9\xde\x8d\x0f\x60"
- "\xdf\x19\x9f\x63\x1a\x9c\xf7\x01\x7c\xee\xd6\x04\x82\x4f\x6d\x13"
- "\xc7\xc7\x21\xe2\x33\x3a\x96\x08\xf6\x56\x9d\xb0\x69\x09\x19\x37"
- "\xe9\x5b\x2d\xd9\x9b\x50\x07\xb6\xeb\x4f\x3b\x5d\x86\xf2\x2e\xdf"
- "\x2b\xee\x59\x8f\xfe\x32\xd6\x7f\x3d\x7a\x68\xef\x45\x3d\x0a\x54"
- "\x8f\x1e\x5a\xd8\x3b\x3d\xfa\x0b\xb9\xa8\x47\x67\x4b\x8f\xfe\xec"
- "\xf0\xd6\xa3\x0e\x5f\x9d\x32\x77\xd1\xec\xf9\xfa\xf9\xfa\xc7\xb5"
- "\x73\x9e\x4e\x9b\x9b\xca\x3d\xb6\x87\xcf\x8e\x70\x66\xc6\x08\x78"
- "\xb6\x79\xed\xc6\x06\xf2\xc6\xf0\x06\xc1\xf9\x5d\x84\x92\xe6\x8d"
- "\xd2\xb8\xf2\x46\x15\xe0\x39\xe7\xa8\x6f\x78\xfe\xf9\x11\xc5\x23"
- "\xc9\xb8\xe7\x1f\xdf\x2f\xe5\x11\xb6\xde\x18\x62\xc3\x2a\x9c\x7f"
- "\x79\xa6\x0d\x3e\xcb\x88\x32\xcc\x4e\x54\xa6\x91\x78\x7d\x46\x1d"
- "\xee\x4f\x46\x8b\xf4\x55\xc5\x78\x2e\x79\x1b\x51\xda\xd4\x29\xa6"
- "\x55\x50\x9e\x35\xa4\x4c\xa5\xd4\xe2\xbb\x24\xd3\x67\x80\x4f\x8e"
- "\x70\xef\x43\x34\xa3\x80\x0e\x48\x28\x47\x5d\xc7\xf7\xfa\x8e\x2b"
- "\xa6\x3f\x7f\x1a\xf7\x69\x87\x18\xf6\xa1\xd1\xf0\xac\x11\xfa\x71"
- "\x6c\x8f\x05\xd0\x7b\x7e\xfd\x61\xb6\x5f\x57\xbb\x7a\xbb\x95\x9d"
- "\x11\xaf\xae\x88\x39\x99\x57\xde\xf0\x69\x46\x25\xd1\x3e\x88\x7a"
- "\x3f\x7d\xf7\xfd\x1b\x41\xef\xe3\x4d\xa4\x2e\xe2\x55\xb2\x2f\x01"
- "\xf8\x96\xd0\x93\xde\xcb\x78\x36\xd2\x3f\xbd\x97\xf8\x85\xbc\x42"
- "\x7e\x21\xb7\x86\x00\xb7\x90\x6f\x12\xbf\x5e\x3c\xc5\xf9\x15\x76"
- "\x90\x68\x36\x9f\x00\x8e\x39\x38\xc7\xf0\x9d\xe6\xba\xf4\xcf\x7d"
- "\xeb\xff\x29\x2f\x7e\x09\x22\xbf\x96\x02\xbf\x96\xba\xf9\xf5\xf0"
- "\x57\x1a\xb2\x85\xf1\x6b\xa2\x9b\x5f\x86\xb0\x1a\x89\x5b\xc8\x33"
- "\xe4\x94\xeb\x71\x1d\x41\x9d\x97\x78\x56\x3c\x8f\xcf\xa1\x32\xfd"
- "\x17\x40\xff\x5b\x65\x7e\x74\x44\x6f\xf4\xff\x61\xa6\xff\x88\x09"
- "\xe2\x83\xb8\x20\x16\x17\x22\x0e\x78\x0e\x34\x6d\xed\x0a\x8b\xbb"
- "\x22\x7a\xc2\x02\x71\x40\x3c\x18\x0e\x80\x87\x34\x9f\x8d\xf3\x9b"
- "\x88\x09\x62\x71\x6d\x06\x11\x10\x97\x62\xd0\x79\xd4\x73\x8b\xe2"
- "\xaf\x0e\xc4\x85\xc5\xae\x39\x21\x0b\xd7\x0f\x73\x9f\x0f\xd3\xba"
- "\x7a\x46\x65\xe7\xb8\x75\x46\xb5\x7b\x4f\xb5\xe9\xac\x5f\x66\x1a"
- "\x8e\xfb\x61\x4f\x17\xfb\x2c\x3b\xaa\xf8\xdc\xd4\xcc\x2b\x45\x9d"
- "\xde\x8a\xfd\x3f\xd6\xd7\x73\x42\x5f\x4f\x0d\x7d\xbd\x3c\xe8\xeb"
- "\xe1\x58\x1c\xdb\x7b\xe0\x91\x11\x7c\x9e\x0c\xfa\x76\x21\xdb\x1b"
- "\xa9\x21\xa5\x06\xe5\xc7\xe6\x64\x43\xca\xb5\x38\x87\x44\x0d\xd0"
- "\x8f\xfc\xbb\x40\xe0\x37\x70\xc8\x19\x20\x77\x1e\x11\xf7\xe2\x3f"
- "\x64\xe5\xfb\xf2\xcd\x54\xf3\xfa\x4d\x67\xeb\x16\xd8\x7c\x9d\xe0"
- "\xda\xea\x7c\xc6\x73\xbe\x4e\x3e\x9f\xfb\x46\xa6\x55\x9c\xab\x7b"
- "\x84\xad\x09\x46\xfb\x80\x76\xad\x22\xb3\x41\x70\xcf\xd7\x7d\x8e"
- "\xd7\xbd\xe6\xeb\x1e\x61\xe3\xbd\x16\xc5\x4c\x2d\xae\x51\x81\xdf"
- "\x07\x79\xfa\xf4\x70\x79\xba\x7b\x3e\x9c\xa7\xe3\x3b\x51\x62\x7f"
- "\xbb\x85\xf7\xb5\x67\x8e\x93\xfa\xb4\x3e\xe2\x9b\x00\xec\xee\x1c"
- "\x87\xdb\xee\xce\x71\x30\xd9\x44\x54\x34\xd7\x75\xb2\xbb\xb8\xa7"
- "\xd5\x9c\xe9\x53\xd0\xee\xe6\x6d\xb7\x88\x98\xee\x05\x99\xf4\xc3"
- "\x33\xde\x30\x1d\xdf\x1d\x42\xfb\x5b\x04\xf7\x15\x31\x9b\x5c\xd1"
- "\xb8\x8a\xcd\xcb\xcf\x6c\xf6\xb4\xc5\x73\x22\x3d\x6d\xf1\xa3\x23"
- "\xba\xb7\xc5\xb3\xf6\x74\x6f\x8b\x1f\xbd\xef\xa2\x2d\x0e\xd6\x16"
- "\x43\x2c\xd6\x2b\x5b\x3c\x2b\xef\xa2\x2d\x3e\x53\xb6\x78\xd6\x1a"
- "\x99\x2d\xfe\x8b\xa7\x2d\x9e\x33\xbe\xb3\x2d\x9e\x13\xef\xb6\xc5"
- "\x33\x6d\x6e\x5b\x3c\xb3\xdc\xd3\x16\x3f\x56\xe1\x9f\x2d\x9e\xf3"
- "\xca\x99\xb5\xc5\x73\x6a\x3c\x6d\xf1\x63\x1b\x45\xbb\x62\x08\xdc"
- "\x16\x3f\xf6\x74\xf7\xb6\xf8\xb1\x95\x9e\xb6\xf8\xb1\x69\xdc\xe6"
- "\x3e\x56\xce\x6d\xf1\x63\x49\x3c\x7d\x66\x9e\x3c\xdd\x6d\x8b\x79"
- "\x7a\x67\x5b\xfc\x58\x75\x0f\xb6\x58\xe7\x74\x49\xb6\xb8\x11\x6c"
- "\x71\xa3\xe0\x7a\xdc\x97\x2d\x4e\xb2\xd5\xa1\x2d\x4e\x41\x5b\x9c"
- "\x64\xeb\xde\x16\x27\x7d\x8d\x36\x17\xf8\x4a\x0a\x37\xd0\x66\xdc"
- "\x73\xd1\x34\xef\x4b\x1c\xd7\x6d\x42\x7e\xc2\xf5\x5b\xa6\x64\xc8"
- "\x6d\x75\xe2\x93\x1d\xb6\x1a\xd2\x5d\x97\x79\xda\x6a\xb4\xd3\x68"
- "\xaf\x8b\x36\x50\x4b\xf1\x06\x3c\x83\x23\xb1\x50\xb2\xd9\x06\x48"
- "\xc3\x73\x36\x70\x4f\xa0\xa2\x53\xec\xa3\x04\x19\x34\x3d\x03\xcf"
- "\xc5\x7b\x20\x6f\x8d\xa7\x7d\x7f\xdc\xe1\x58\x2d\xb7\xef\x89\x4e"
- "\xb4\xef\x79\xfc\xbd\x78\x66\xd7\x1d\x45\xfa\x71\x68\xeb\xf9\xf5"
- "\x79\x2f\x77\x6f\xdf\xe7\x8e\x3e\x57\xf6\x1d\x6d\xca\x10\x59\x5f"
- "\xce\x97\x5d\x81\xb6\xd9\xea\x12\xcf\x8e\x7d\x47\x7b\x82\x76\x04"
- "\x6d\x8b\x64\xdf\xd1\xb6\x38\xc4\xbe\x76\x61\x8e\xcc\xbe\x0f\x90"
- "\xd9\x77\x45\x30\xf6\x7d\xde\xc2\x5f\x94\x7d\x47\x1c\x32\xce\xac"
- "\x7d\x97\xfa\xd5\x88\x03\x62\x82\x58\xc8\xfb\xd6\x88\x03\xe2\x81"
- "\x38\x60\x4c\x23\xd9\xf7\x6b\xd2\xb9\x7d\x2f\xea\xb0\xef\xf3\x92"
- "\x3a\xec\xbb\xc0\xed\x7b\x21\xee\xfb\xc6\xc6\x88\x93\x22\x3b\xdb"
- "\xf7\xa4\x68\xb7\x7d\x4f\xdc\x2f\xda\xbb\x26\xdc\xbf\x01\xf4\x3b"
- "\xc1\xd3\xc6\xcf\x2f\xf5\xcf\xc6\x27\x19\x3a\xd9\x78\xf1\xbc\x7b"
- "\xd1\xbe\x6b\xd1\xbe\x3b\xd0\xce\x07\x65\xe3\x93\xca\xdd\x7e\x28"
- "\x71\x1c\xb7\xad\x49\xb1\x9e\x76\x7f\x7e\x81\x68\xa3\x2e\x93\xdb"
- "\x7d\x57\x3f\x7f\xec\xfe\xfc\x27\x25\xbb\x8f\x76\xb5\xc2\xd5\x28"
- "\xb3\xfb\x68\x27\xe7\x3f\x6d\x5a\x72\x58\x66\xf7\xe7\x4f\xe2\x75"
- "\x98\x6f\x74\x32\xbb\x3f\x7f\x16\x4f\x4f\x8c\x90\xa7\xbb\xed\x3e"
- "\x4f\x77\xca\xed\x7e\x33\xda\xfd\xf9\xbb\x7a\xb0\xfb\x63\xfd\xb7"
- "\xfb\x8b\x13\xdd\x76\x7f\x71\x62\xf7\x76\x7f\xf1\x54\xb4\xfb\x6c"
- "\x8f\x58\xc0\x1e\xf8\xac\xcc\xbf\x94\xdb\x7c\x1c\x13\x01\x5f\x60"
- "\xc1\x7d\x43\x20\xdf\x6d\x25\xe8\x17\xe0\x03\xd7\x9b\xf3\xf0\xbb"
- "\x8b\xdd\x73\x30\xcc\x4a\x54\xe8\x03\xf2\x8e\x10\x25\x9e\x57\xc4"
- "\xe5\xa4\xdf\x04\xf7\x36\xba\xfd\xc5\x82\x97\xfd\xf4\x17\x78\x4e"
- "\x7b\x43\xeb\xea\x05\xb5\x32\x7f\x81\x67\x3e\x35\x78\xf9\x0b\x0b"
- "\xf8\x8b\x26\xe9\x1e\xc8\xef\x90\xe7\xc7\xfa\xb1\xfc\x47\xd8\x07"
- "\xf3\x37\x3e\x83\xe7\x97\x31\xff\xf2\x84\xce\xd3\xbf\xe8\x67\xb8"
- "\x3c\xfa\x0f\x4f\x3c\x22\xf9\x17\xf4\xcf\xae\x4e\xfe\x65\x91\xa2"
- "\xc3\xbf\x5c\x2a\xf3\x2f\xe9\x92\x7f\x79\x62\xed\x79\xdf\x7f\xe8"
- "\x85\x5d\x0b\xd6\xbf\xa0\x4d\x43\x7b\xd6\x9d\x7f\x71\xc9\xfc\x8b"
- "\x2b\x28\xff\xb2\xb0\xf6\x17\xe5\x5f\xce\x42\xff\x41\x8e\x01\xe2"
- "\xc2\x7c\x0b\x60\x83\x38\x20\x06\x28\x7f\xdc\x8f\x1a\xb1\x41\x5c"
- "\x10\x93\x6b\x92\xdd\xbe\x85\xe1\xc2\xfc\xcb\xc2\x1a\x6f\xff\x52"
- "\x3c\x4c\xf2\x2f\xfa\x8c\xce\xfe\x45\x5f\xe0\xf6\x2f\x4f\xb0\xf1"
- "\x1b\xbe\xef\xdf\x82\x35\x9e\xbe\x25\xf9\x12\xff\x7c\x8b\xfe\xfb"
- "\x2e\x7c\x0b\xd3\xc1\xbc\x0d\x1e\x7d\x07\x2d\xf8\x97\x20\x7c\xcb"
- "\x62\x15\xaf\x23\xae\x8d\x5e\x90\xc0\xed\xb7\xde\xe8\xf6\x37\x0b"
- "\xa2\xe5\x69\x6e\x7f\x93\x2c\xee\xc1\xbd\x60\x68\xe0\xfe\x66\x31"
- "\x3b\xe7\x0d\xd7\x4d\x57\x9c\xe0\x36\xdd\xd3\xdf\x2c\xfe\xde\xd3"
- "\xdf\x2c\xde\xc5\xeb\x90\x1c\xce\xfd\xcd\xe2\x06\x9e\xbe\x40\x23"
- "\x4f\x77\xfb\x1b\x9e\xde\xd9\xdf\x24\x8f\xe9\xc1\xdf\xa8\xdb\x23"
- "\xf5\xe3\xda\xf3\x2a\xb4\x0e\xa3\xde\x34\x26\xe1\x0e\xa7\xb7\xde"
- "\x70\x7d\x71\xf2\xb3\x70\xa4\xf9\xa7\x99\x7c\xbe\xc3\x25\xbe\x5f"
- "\xdc\x16\xa9\xd7\x1d\x59\x08\xba\xd3\xe2\x5b\x77\x40\x6f\x54\x92"
- "\xde\xd4\x25\x7d\x4b\x40\x97\x04\x9c\x93\xda\x02\x3a\x63\xb6\x35"
- "\x32\x1d\x52\x37\xc5\x10\xdc\xd3\x31\xa4\x85\x68\x42\x14\x8a\x01"
- "\x38\xdf\xe1\x04\xfd\xb9\x7b\x34\x75\xfd\xbe\x31\x86\x84\x24\x91"
- "\x50\xd4\xa1\xd7\xc5\x79\x0f\xdc\x1b\x02\xe7\x3b\x80\xbf\xd1\x8f"
- "\x7e\xe6\x9e\xef\x68\xf3\x63\xbe\xc3\x9c\x6e\x61\xf3\x1d\xf8\xbe"
- "\x94\x0b\xf4\x84\xbd\xc3\x83\xf3\x1d\x76\x36\x47\xc4\xec\x57\x09"
- "\x9b\xef\x38\x4c\x70\xae\x43\xda\x1b\x06\xe7\x38\x7e\x9f\x40\x04"
- "\xdc\x3b\x62\x0b\xe8\xcd\x5e\x5d\x1d\xd3\x9b\xc0\x6d\xd8\x93\x05"
- "\xdd\xad\xf9\x71\x80\x4c\x9d\xea\x0a\x2d\xdd\xfc\xba\xe6\xb5\xc3"
- "\x76\x05\xee\x99\xe9\x04\x8c\x5c\x60\xab\xa8\xda\xcb\x56\xb5\x8b"
- "\xf2\x6e\xe7\xf2\x06\xac\x54\xd0\x93\xa7\x90\xce\xf7\xcc\xb4\x5b"
- "\x80\x6b\xba\x61\x45\xcb\x50\xb6\xd1\xa4\x48\xdc\x37\xd3\xb5\x3c"
- "\x69\x90\x0b\xe4\x89\xef\x49\x54\x9c\xb2\xf7\x77\xaa\x07\xd9\xf3"
- "\xda\xc8\x18\xb0\x4b\x21\x68\x97\x80\x9f\x83\x4b\xda\x40\xb6\x5f"
- "\x73\xd9\xe2\x1e\x6e\xf8\xd7\xb1\x5c\xa7\x85\xb2\x47\xb5\xb7\x83"
- "\x7c\xed\x5c\xbe\x33\x9f\xd4\x90\x62\x69\xbe\x0f\x7c\x7d\x3d\x60"
- "\xca\xec\x92\x2d\x8c\xe2\x19\x14\xce\x76\x5d\xa4\xeb\x3b\x90\xaf"
- "\x0d\xcf\x1b\xd1\x21\xfe\x9a\xe2\x23\x38\x3f\xf9\x25\x9f\xef\x0b"
- "\x11\xf7\xe4\x58\x0e\x3e\x62\xbe\x96\x98\xcb\xc0\x46\x0f\x48\x8e"
- "\x69\x2f\xd2\xeb\x58\x1f\x24\x23\x50\xf9\xa6\x58\xcf\x8d\x7c\xb5"
- "\xbf\x20\xf9\x3e\xd9\x18\xbc\x7c\xd3\x7c\xee\x95\x7e\x66\xe5\xab"
- "\xf9\x05\xc9\x97\xed\x71\x10\xa4\x7c\x9f\xaa\xec\x4e\xbe\xd8\x4f"
- "\x90\xfa\x08\x52\xff\x00\xfd\x0a\xf7\xa1\xe9\x3a\x77\xdf\x20\x5d"
- "\x27\xcd\x8b\x82\x6c\x94\x06\xdc\x13\x1a\xda\x9c\x3c\x0f\xcf\x5d"
- "\x58\x5a\x24\xcd\x89\x16\xe0\xd9\x22\x88\xd5\x66\xc0\x4a\x8f\xef"
- "\xc3\x88\x38\x81\x1f\x78\xd4\x06\xb6\x7a\x84\x7e\x9c\xd3\x00\x7e"
- "\xa2\x54\x6f\xf2\x81\x99\x80\x36\x3e\x24\x8d\x68\x66\x26\x73\xec"
- "\x5c\xcb\x01\xb3\x36\x88\x89\xec\xcd\x04\xdf\x6f\x0d\x6b\x06\xbb"
- "\xda\x9e\x34\x68\x06\xc4\xd8\x12\x6e\xaf\x2f\xb1\xb3\x78\xa8\x4b"
- "\xdc\x36\x79\xe2\x76\xb2\x0b\xdc\x64\xeb\x0c\x34\x1c\x37\x0b\xc3"
- "\x8d\xd9\xf5\xe5\x10\x9b\x02\x7e\x12\x6e\xcc\xae\x03\x76\x0c\xb7"
- "\x96\xc3\x2c\x06\x92\xec\x3a\xc6\x3f\x88\x5d\xed\x2c\x88\xe7\x56"
- "\xa7\x6d\x64\xb8\xe1\xd8\xf6\xac\x40\x71\x5b\x9a\xe4\x19\xf7\xa4"
- "\x1f\xf0\x2f\xee\x59\xfa\x2d\xc6\x35\xf2\xb8\x07\x7f\x9f\x84\x38"
- "\xc7\x19\x52\x1e\x65\x0b\xaa\x1f\xbd\xd4\xe6\x19\xc3\xa4\x8b\x67"
- "\x10\x2d\xb9\x26\xf0\x18\x26\x9d\x8d\xb7\x55\x6c\xee\x2a\x7e\x49"
- "\x7f\xc5\x33\x7e\x49\xcf\xe0\x71\x4a\xfa\xfe\x93\x39\x18\xbf\xa4"
- "\x17\xf0\xf4\x25\x63\xe4\xe9\xee\xf8\x85\xa7\xb3\xf3\xd1\x57\xa7"
- "\x5b\x02\x8b\x59\xae\x3b\xc7\x31\x4b\x74\x37\x31\x4b\xf4\x05\x16"
- "\xb3\x2c\xf3\xb9\xfe\xff\xa2\x4f\x95\x6c\x7e\xba\x2d\x78\x9b\xbf"
- "\xdc\xe7\xfa\xff\x8b\x3e\x55\x92\xef\xb2\xbc\xe0\xe5\xbb\x42\x19"
- "\xbc\x4f\xcd\xca\x70\xfb\xd4\xac\x0c\xdf\x3e\x35\xf3\xa7\x8b\x3e"
- "\xb5\x2b\x9f\xba\xbc\x25\x78\x9f\x9a\xb9\xcb\xd3\xa7\x66\x8f\xf6"
- "\xcf\xa7\x66\xdd\xd2\xf7\x3e\x35\xcb\x6b\x1c\x3a\x3b\x9c\xd7\x69"
- "\xc5\xca\xc0\x7d\x6a\xd6\xcf\xbe\x7d\x6a\x96\xd3\xd3\xa7\x66\x35"
- "\x70\xdf\x99\xad\xe3\x3e\x35\xab\x89\xa7\xaf\xc8\x96\xa7\xbb\x7d"
- "\x2a\x4f\xe7\x3e\x35\x7b\x6c\x60\x3e\xf5\x8a\x73\xec\x53\xb5\xdd"
- "\xf8\x54\xed\x05\xe6\x53\x57\x76\xb7\xff\xef\x45\x9b\xcf\x6c\x7e"
- "\x76\x6c\xf0\x36\x3f\xc7\xe7\xfb\x6f\x3d\xdb\xfc\x67\x93\xdd\x36"
- "\xff\xd9\x64\xdf\x36\x7f\xd5\xb7\x17\x6d\x7e\x57\x36\x7f\xa5\x25"
- "\x78\x9b\xbf\xaa\xd2\xd3\xe6\xaf\x1e\xe1\x9f\xcd\x7f\xf6\x9a\xbe"
- "\xb7\xf9\xcf\x7a\xad\xff\x5b\xad\xe2\x75\x7a\xe6\xa9\xc0\x6d\xfe"
- "\xb3\xdf\xfb\xb6\xf9\xcf\xfe\xe4\x69\xf3\x9f\xad\xe6\xb6\x7d\x75"
- "\x24\xb7\xf9\xcf\x36\xf2\xf4\x67\xd2\xe4\xe9\x6e\x9b\xcf\xd3\xb9"
- "\xcd\x5f\xad\x0b\xcc\xe6\x87\x9d\x63\x9b\xaf\xe9\xc6\xe6\x6b\x2e"
- "\x30\x9b\xff\x5f\x79\xc1\xdb\xa4\x5c\xa5\xdb\x26\xe5\x2a\x7d\xdb"
- "\xa4\xb5\x4f\x5f\xb4\x49\x5d\xd9\xa4\xd5\xe3\x83\xb7\x49\x6b\x27"
- "\x7a\xda\xa4\xdc\x37\xfd\xb3\x49\x6b\xf7\xf4\xbd\x4d\x5a\xdb\xe0"
- "\x69\x93\x72\x0b\x79\x9d\xd6\x0c\x0a\xdc\x26\xe5\xae\xf0\x6d\x93"
- "\x72\x9f\xf5\xb4\x49\xb9\xe2\x9c\x59\x6e\x25\xb7\x49\xb9\x0b\x79"
- "\xfa\x1a\x95\x3c\xdd\x6d\x93\x78\x3a\xb7\x49\xb9\x3d\xad\x7f\x60"
- "\xdc\xaf\x8b\xf0\xe2\xfe\x13\x12\xf7\x0d\xe1\xfb\x0a\x25\xee\x1b"
- "\xf8\x3a\xe7\x42\x7d\xd5\x73\x4b\x88\x32\x0f\xcf\x35\x01\x7d\x4f"
- "\xfe\x2b\x72\x3f\x6f\x2d\xae\x3f\x50\x1f\x04\x1b\xd6\x24\xda\xb4"
- "\x74\xb0\x69\x4d\xf0\x1b\xf7\xbb\x1a\xa1\xaf\x42\x5b\x84\xe7\x20"
- "\xe0\x6f\x6e\xdb\xac\xfd\xf1\xdd\xcd\x80\xde\xab\x6a\x12\xdf\xab"
- "\x4a\xec\xfc\x5e\x55\xa1\xec\xfd\x1d\xd4\x8d\x90\x95\x8a\x50\x9c"
- "\x0b\x06\xfb\x26\xda\xb1\x9a\xfe\x0e\xb5\x68\xc7\x4e\x81\x1d\x3b"
- "\xe5\xd6\x09\xb4\x63\x27\xc1\x8e\xd9\x96\xea\x46\xa2\x2d\xeb\xfc"
- "\x4e\x15\x9f\xfb\x65\x76\xcc\xe0\x65\xc7\x1e\xf7\xb2\x63\xf3\xc0"
- "\x8e\xcd\x02\x3b\x16\xe2\xd6\x87\xdf\x1c\x24\xc2\xa4\xd9\xa0\x13"
- "\x60\xc7\x5e\x3c\x85\x76\x6c\x6f\x90\x76\x2c\x6f\x9a\xa7\x3e\x18"
- "\xf6\xf8\xa7\x0f\x79\x9f\xf9\xd2\x87\x76\x43\xb0\xfa\x90\x67\xf1"
- "\xd4\x07\x43\x39\xaf\xd3\x73\xfd\x03\xd7\x07\x83\xa1\x43\x1f\x9e"
- "\xf0\xd6\x07\xc3\x4b\x9e\xfa\x60\x48\xe2\xbc\x37\x98\xb8\x3e\x18"
- "\x32\x78\xfa\x73\x4a\x79\xba\x5b\x1f\x78\x3a\xd7\x07\x43\xed\xc5"
- "\xf9\xd9\xf3\xd5\x47\xaf\x8b\xbe\x38\x3f\xdb\x53\xbf\xcc\x60\x09"
- "\xbe\x5f\x56\x70\x8e\xe6\xbf\x7f\x49\x63\xc9\xeb\xd2\x83\x97\xef"
- "\xf3\xe7\x68\xfe\xfb\x97\x34\xae\x50\xd0\x8b\xf9\xef\x17\xbb\x9d"
- "\xff\xee\x3e\x8e\x79\xc9\x52\xdb\x11\xc3\xbf\x64\x91\xd6\x6e\x76"
- "\x8e\xe1\x5f\x7a\xc8\xf3\xdd\xa9\xf5\x0a\xef\x77\xa7\x7a\x8a\xed"
- "\x1d\xff\xa7\x62\xfb\x17\xc6\x05\x1f\xdb\xbf\xa4\xf5\x8c\x65\x36"
- "\x18\xfc\x8b\x65\x5e\x2a\xf2\x15\xcb\x38\x82\x8e\xed\x5f\x2a\xf7"
- "\x8c\x65\x36\xa4\xf3\x3a\xbd\x58\x17\x78\x2c\xb3\x61\xba\xef\x58"
- "\x66\xc3\x6c\xcf\x58\x66\xc3\x58\x1e\xb3\x6c\xc8\xe3\xb1\xcc\x86"
- "\x58\x9e\xfe\x62\xad\x3c\xdd\x1d\xcb\xf0\x74\x1e\xcb\x6c\xd8\x78"
- "\x71\xde\xf6\x7c\x8d\x65\xfe\xe6\xb8\xe8\x6b\x7b\xf2\x05\x1b\xca"
- "\x83\xf7\x05\x9b\x66\x5c\xf4\xb5\x3d\xc9\x77\xe3\xc4\xe0\xe5\xbb"
- "\x79\x57\xf0\xbe\xb6\x68\x92\xdb\xd7\x16\x4d\xf2\xed\x6b\x0b\xf7"
- "\x78\xfa\xda\x2d\x8b\x2e\xfa\xda\xee\x7c\xed\x26\x63\xf0\xbe\xb6"
- "\x30\xcf\xd3\xd7\x16\x9d\xf6\xcf\xd7\x16\x0d\xea\x7b\x5f\x5b\x14"
- "\xe1\xe9\x6b\x8b\x9a\x44\xfc\x6f\x09\xdc\xd7\x16\xed\xf5\xed\x6b"
- "\x8b\xea\x3c\x7d\x6d\xd1\x56\xee\x53\x8b\xec\xdc\xd7\x16\xed\xe4"
- "\xe9\x5b\xc6\xc9\xd3\xdd\xbe\x96\xa7\x73\x5f\x5b\xac\xbc\x38\x9f"
- "\x7b\xbe\xfa\xda\x92\xa4\x8b\xbe\xa0\x27\x5f\x50\x1c\x11\xbc\x2f"
- "\xd8\xea\x73\xff\xe3\x9e\x7d\xc1\xb6\x04\xb7\x2f\xd8\x96\xe0\xdb"
- "\x17\xfc\xbd\xce\xd3\x17\xbc\xfc\xf4\x45\x5f\xd0\x9d\x2f\x28\xa9"
- "\x0c\xde\x17\xfc\x7d\xa3\xa7\x2f\x30\xf6\xf7\xcf\x17\x6c\xbb\xa4"
- "\xef\x7d\xc1\xb6\x28\x4f\x5f\xb0\xcd\x2a\xe2\x7f\x77\xe0\xbe\x60"
- "\xdb\x67\xbe\x7d\xc1\xb6\x2f\x3c\x7d\xc1\xb6\x72\x6e\xf3\x8d\x4a"
- "\xee\x0b\xb6\x99\x78\xfa\xcb\x13\xe5\xe9\x6e\x5f\xc0\xd3\xb9\x2f"
- "\x30\x6a\x2e\xce\xf3\x9e\xaf\xbe\xa0\x34\x2d\x78\x5b\x55\xa6\x74"
- "\xdb\xaa\x32\xa5\x6f\x5b\xb5\xe3\x69\x4f\x5b\xb5\xfd\xaa\x8b\xb6"
- "\xaa\x3b\x5b\x65\x8c\x0a\xde\x56\xed\xf0\x9a\xff\x2d\xf3\x73\xfe"
- "\x77\x87\xcf\xf9\xdf\xe0\x6d\xd5\x0e\xaf\xf9\xdf\x32\x71\xfe\xb7"
- "\xf4\xa7\xc0\x6d\x55\xd9\x0a\xdf\xb6\xaa\xcc\x6b\xfe\xb7\x4c\x9c"
- "\xff\x2d\x13\xe7\x7f\xcb\xc4\xf9\xdf\x52\xab\x3c\xdd\x6d\xab\x78"
- "\x3a\xb7\x55\x65\xbd\x9c\xff\x7d\x6d\x8c\x7b\xfe\xf7\x35\xf6\xce"
- "\x80\x6b\x63\x45\x73\xe7\xf9\xdf\x57\x5f\xf6\xdc\xc7\xe4\x95\xdb"
- "\xd8\x5c\x30\xea\x85\x8d\xbf\x9b\xde\xe5\xbc\xf0\x65\x15\xcd\x17"
- "\xe7\x85\xfb\x62\x5e\xf8\xd5\x85\x9e\x7a\xf2\xda\x17\xfe\xe9\xc9"
- "\xab\xdf\xf7\xfd\xbc\xf0\xab\x76\x4f\x3d\x79\xad\x5a\xe4\x44\x10"
- "\xf3\xc2\xaf\x95\xfa\xd6\x93\xd7\x2a\x3c\xf5\xe4\x35\x71\x5d\xee"
- "\x6b\x8d\x5c\x4f\x5e\x5b\xcf\xd3\x5f\x51\xca\xd3\xdd\x7a\xf2\x8a"
- "\x6c\x5e\xf8\xb5\x26\x7f\x7c\xba\x43\x5d\x11\x85\x3e\x7a\x4c\xe3"
- "\x1d\xce\x0e\x3e\xa7\x89\x7c\xee\xca\xa7\xcf\xe1\xb6\x1f\x79\xdc"
- "\x6e\xd4\x57\xf7\xe8\xd3\x9b\x44\x9f\x9e\xd8\xd9\xa7\x4b\xfe\x1c"
- "\xf9\xbc\xc5\xaf\x39\x61\x2f\x5e\x07\xe4\xcf\xef\xd1\xf4\x86\xd7"
- "\xc8\x69\x4f\x7f\x1e\x2c\xaf\x2b\xce\xd1\xfb\x2f\xbf\xa4\x39\xe1"
- "\xd7\xec\xc1\xf7\xed\x5e\x3f\x47\xef\xbf\xfc\x92\xc6\xa9\x2b\x7a"
- "\xf1\xfe\x4b\x65\xb7\xef\xbf\x5c\x1c\x9b\x40\xf9\xbe\xde\x12\xbc"
- "\x7c\xdf\x4c\x0c\x3e\xde\xdf\x19\xee\x8e\xf7\x77\x86\x4b\xb1\x0d"
- "\xda\x42\xb6\xef\x0e\xd8\x3f\x43\x0a\x7c\x4e\x11\xf2\x5c\x0a\xdb"
- "\x77\x5c\x65\x6e\x3a\x80\x67\x25\x41\xbc\xf3\xf6\xda\xb8\x74\x79"
- "\xbc\xf3\xd6\x68\x29\xd6\x89\xc3\x38\x08\xe2\x1a\x8c\x69\xa4\x18"
- "\xbf\xe0\x44\x0f\xeb\x41\xaf\xd2\x57\x63\x9f\xa0\x3d\xa4\x22\xea"
- "\xc2\xef\x0f\x54\x4e\x0a\xbe\x3f\xf0\xb6\xd7\xfa\xb7\x9d\x7e\xae"
- "\x7f\x7b\xdb\xe7\xfa\xb7\xe0\xfb\x03\x6f\x7b\xad\x7f\xdb\x29\xae"
- "\x7f\x7b\xf3\xeb\xc0\xe3\x9c\x9d\xdd\xac\x7f\xdb\xe9\xb5\xfe\x6d"
- "\xa7\xb8\xfe\x6d\xa7\xb8\xfe\x6d\xa7\xb8\xfe\xed\x4d\x8b\x3c\xdd"
- "\x1d\xe7\xf0\x74\x1e\xe7\xec\xf4\x6b\xfd\x1b\xc4\x39\xba\x5e\xc4"
- "\x39\x3d\x8f\x5d\x9c\x37\x71\xce\xbd\xe7\x49\x9c\xf3\x8f\x31\x7e"
- "\xf8\x89\x28\x2f\x3f\x51\xfd\x7f\xcb\x4f\xec\xec\xc5\xda\xb7\x7f"
- "\x76\xbb\xfe\x9f\xc9\x37\x4f\x26\x5f\xb4\xd1\xa2\x6c\x9d\x51\xfa"
- "\xea\xa0\xe4\x0b\xb6\xb9\x28\xf3\x97\x22\xdb\x7f\xa4\x05\x2f\xdb"
- "\xaa\xe6\x8b\x31\x4e\x4f\xf2\xfd\xe7\xfe\xe0\xe5\xfb\x9e\xcf\xf3"
- "\xcf\x7a\x8e\x71\x76\x47\xec\xeb\x88\x71\x76\x47\x78\xc7\x38\x18"
- "\xd3\x4c\xb6\xf3\x58\xe7\x39\x88\x51\x72\xf5\x10\xef\x2c\x21\xc4"
- "\xdc\xb4\x9b\xe4\x41\xcc\x93\x7b\x1c\xe2\x9e\x85\x10\xf7\x38\x4a"
- "\xc5\xb8\x67\x97\xc1\x33\xee\x79\xff\xca\x2e\xe3\x9e\x10\x77\xdc"
- "\xe3\x80\x98\xa6\xbd\x54\x5f\x5d\x70\x5c\x16\x03\x2d\xe8\x1c\x03"
- "\xb5\x19\xc0\xe7\x5c\xa5\xaf\x69\x87\x38\xa8\xbb\x18\x88\x61\xef"
- "\x15\x07\xfd\xf2\x62\xa0\x77\xa3\x83\x8f\x81\x76\x79\xed\x21\xba"
- "\x7b\xaf\x7f\x31\xd0\xae\x03\x3e\xc7\x7a\x82\x8e\x81\x76\x35\x79"
- "\xc6\x40\xbb\x2b\x79\x9d\xde\xdb\x1b\x78\x0c\xb4\xfb\x79\xdf\x31"
- "\xd0\xee\x4d\x9e\x31\xd0\xee\x85\x3c\xd6\xd9\x5d\xcd\x63\xa0\xdd"
- "\xd9\x3c\xfd\xbd\x6a\x79\xba\x3b\x06\xe2\xe9\x3c\x06\xda\xdd\xe0"
- "\xe7\xfc\x4d\x94\x03\x7c\xec\xb9\x5f\x37\xd7\xdd\xfc\x4d\x5f\xad"
- "\x9b\xbb\xe7\x3c\x99\xbf\xf9\x70\xec\x45\x3f\xdd\x9d\x1f\xd9\xdd"
- "\x14\xbc\x1f\x31\x9d\xa3\xf5\xff\xbf\x24\x3f\xfd\x61\x46\xf0\xf2"
- "\xdd\xd3\xed\xfa\xff\xee\xfd\x74\xf5\x56\xf7\x58\x44\xf5\xd6\xc0"
- "\xc6\x22\xaa\x2f\xf1\xf4\xc9\x1f\xbd\x73\x71\x2c\xc2\x5f\x3f\x6c"
- "\x6a\x0c\xde\x0f\x7f\x6c\xf1\xf4\xc3\x7b\x27\xfb\xe7\x87\xab\x1f"
- "\xe9\xfb\xb1\x88\xea\x85\x9e\x7e\x78\xef\x38\x91\x0b\x8b\x02\xf7"
- "\xc3\x7b\x2f\xf3\xed\x87\xf7\x5e\xe9\xe9\x87\xab\x6d\xdc\xdf\xee"
- "\x9d\xc4\xfd\xf0\x5e\x31\xfd\xa3\x85\xf2\x74\xb7\x1f\xe6\xe9\xdc"
- "\x0f\xef\x4d\x08\x6c\xce\xe5\x8a\xf3\x74\xce\x45\x7b\x81\xcd\xb9"
- "\xfc\xbf\xaa\x8b\x7e\xa2\x27\x3f\xb1\x77\x61\xf0\x7e\xa2\x26\x22"
- "\x78\x3f\xf1\x69\x8d\xdb\x4f\x7c\x5a\x13\x98\x9f\xf8\xf4\x36\x4f"
- "\x3f\x51\xf3\xd5\x45\x3f\xe1\xaf\x9f\xf8\x6f\x12\xbc\x9f\xf8\x54"
- "\xe5\xe9\x27\xf6\x3d\xe5\x9f\x9f\xf8\xf4\xd9\xbe\xf7\x13\x9f\xae"
- "\xf7\xf4\x13\xfb\x66\x89\x5c\x78\x29\x70\x3f\xb1\x6f\x82\x6f\x3f"
- "\xb1\xef\x3e\x4f\x3f\x81\xa3\x10\xe8\x0f\xf6\xa5\x71\x3f\xb1\x2f"
- "\x9a\xa7\xd7\xac\x97\xa7\xbb\xfd\x04\x4f\xe7\x7e\x62\x5f\xf6\xc5"
- "\xf5\x76\xe7\xeb\x7a\xbb\xda\xa6\xe0\x6d\x99\x39\xcd\x6d\xcb\xcc"
- "\x69\xbe\xd7\xdb\xd5\x7f\xef\xb9\xde\xae\xee\xa5\x8b\xeb\xed\xba"
- "\xb3\x55\xfb\xd6\x07\x6f\xab\xea\x77\x7a\xda\xaa\x06\x3f\xcf\x83"
- "\x34\x5f\xdf\xf7\xb6\xca\x1c\xe3\x69\xab\x1a\xc4\x33\x20\xeb\x66"
- "\x07\x6e\xab\xcc\xc7\x7c\xdb\x2a\xf3\xcf\x9e\xb6\xca\x2c\x9e\xff"
- "\xd8\xa0\xe5\xb6\xca\x2c\x9e\xff\x58\x37\x4b\x9e\xee\xb6\x55\x3c"
- "\x9d\xdb\xaa\x06\xbf\xf6\xff\x77\xcf\xaf\x05\x15\xd3\x9e\x85\xf9"
- "\xb5\xbe\x8a\x69\xcf\x97\xf9\xb5\xcf\x2e\xce\xff\x74\x1b\xcf\x36"
- "\xf4\x62\xdf\xff\xcf\xbb\x9d\xff\xe9\xde\x07\x1c\xa8\x74\xfb\x80"
- "\x03\x95\xbe\xe6\x27\x72\x81\x43\x79\x10\x8f\xae\x3d\x4e\x94\xcf"
- "\xe1\xfc\xc4\xfe\x3a\x62\xc0\xf9\x09\xbd\x34\x3f\x51\x24\xc6\xb8"
- "\x07\xae\xf2\x8c\x71\xff\x67\x4f\x57\x31\x2e\xc6\xb6\x4e\x88\x5b"
- "\x1d\xde\xf3\x12\x7f\xed\xda\x77\xb4\x85\x54\xe8\x4e\x97\xea\x6b"
- "\x02\xf1\x1d\x5b\x96\x71\xdf\xb1\xf9\x17\xe5\x3b\x3e\xdb\x1f\xbc"
- "\xef\xd8\x6f\xf5\xf4\x1d\xff\x7a\xc4\x3f\xdf\x71\x60\x51\xdf\xfb"
- "\x8e\x03\x19\x9e\xbe\xe3\x5f\xb1\x22\x1f\xe6\x06\xee\x3b\xfe\x35"
- "\xda\xb7\xef\xf8\xd7\xf5\x9e\xbe\xe3\x5f\xe2\x5a\xd3\x7f\xcd\xe0"
- "\xbe\xe3\x5f\x11\x3c\xfd\x7f\x12\xe5\xe9\x6e\xdf\xc1\xd3\xb9\xef"
- "\xf8\x57\x52\x60\xe3\x21\x61\xe7\xe9\x78\x88\xe6\x02\x1b\x0f\xf9"
- "\xdf\x5e\xbc\xff\xf6\x65\x72\x6d\xc7\xfa\xf9\x2f\x93\x3b\xf5\xd7"
- "\x97\x40\xac\x7b\x82\xcf\xb9\x76\xf4\xd7\x2d\x5f\x89\xb6\xec\x8b"
- "\x6f\x3d\x6d\x59\xa3\xc1\x97\x2d\xeb\x6e\x5e\x15\xfb\xe7\x4e\xb0"
- "\x73\x78\xd6\x5a\x50\xf3\xaa\x4b\x7e\x49\xf6\xeb\x5f\x19\xc1\xdb"
- "\xaf\x2f\xbc\xf6\x3f\xfd\xb7\x9f\xfb\x9f\x7e\xe9\x73\xff\x53\x47"
- "\xd0\x6b\xe8\xbf\xf4\xda\xff\xf4\xdf\xe2\xfe\xa7\x8d\x41\xbc\x17"
- "\xf7\xe5\xf7\xbe\xed\xd7\x97\x5e\xfb\x9f\x7e\x29\xce\x9f\xfe\x5b"
- "\xdc\xff\xf4\x4b\x71\xff\xd3\xc6\x89\xf2\x74\xb7\xfd\x6a\x94\xbd"
- "\x17\xf7\xef\x6e\xf7\x3f\xa5\x79\xa9\xba\x02\xc1\x55\x09\x9f\x2a"
- "\xa8\xe3\x65\xc0\x01\x13\x7c\xaf\x01\x1c\x87\xc1\xf7\x06\x5f\x3a"
- "\x66\x0d\x49\xd5\xb9\x72\xa0\xce\x02\x51\x98\xad\x3f\x9a\x4c\xc3"
- "\x1d\x88\x4d\x19\xc7\x2a\x55\x17\xe6\x18\x18\xeb\xa2\x49\x04\x70"
- "\xd1\xb1\xf3\xf1\x20\x7f\x28\x70\x46\xbb\x84\x84\x1e\x57\xfc\xbb"
- "\x46\xca\x07\xf5\x0d\x3d\xac\xf8\xf7\xb3\x58\x06\xd4\x75\x3f\xb4"
- "\x65\xac\xcf\xba\x42\x59\x71\xaf\x8c\x24\x2b\x1c\xf4\x3b\x93\xfe"
- "\x04\x69\x52\x1c\x1c\x11\xd6\x32\x30\x96\x66\x25\x10\x8c\xb1\x2a"
- "\x87\x5b\x95\x58\xa6\x49\xdf\x86\xd7\x08\x5e\x73\x42\x1d\x33\x17"
- "\x11\x21\xff\xc4\x40\x15\xd8\x82\xfe\x59\x36\xda\xbc\xd8\x01\x75"
- "\x4e\x77\x90\x0f\x47\x36\x2a\xdf\xd8\x0c\x69\x4e\x12\x81\x67\xe2"
- "\x61\x19\x10\x63\x42\x7d\x0e\x5e\x59\x0c\xf9\xbb\xaa\xc3\xb3\xaf"
- "\x93\x31\xfd\x47\x53\x4b\x60\xbc\x39\xe8\xf3\xfd\xb7\xb0\x95\x23"
- "\x89\xe9\x6a\x90\x9d\x96\x08\x5d\x5d\x0f\xf0\x39\x07\xbb\xb1\x89"
- "\x2a\x3c\x4f\x33\x6b\x13\x11\xd6\xb9\x06\xaa\x3e\xce\x60\xe7\x59"
- "\x5a\x5b\x57\x7f\x15\x6b\x51\xc4\xaa\x50\xe6\x78\x66\x1a\x9e\xb9"
- "\x0a\xbc\x21\x90\x3e\x6b\x4f\x3a\x21\xde\x58\xa4\x24\x2e\x9a\xad"
- "\x4d\x9b\xbf\x68\xee\xe2\xa7\xd2\xb4\x57\x25\x0e\x26\xd3\x16\x2f"
- "\xd6\x2e\x9a\xad\x7f\x5a\x2b\xbf\x72\xab\x36\x71\x7e\xea\xec\x39"
- "\x0b\xe7\x5e\xb3\xe8\xb1\xe4\xc1\x50\x27\x22\xab\x47\x38\xd6\xc5"
- "\xb5\xfa\xab\x85\xc5\x2f\x10\xf2\xe2\x30\xa2\xc4\x7a\xc1\xf3\x1a"
- "\xa4\x33\xf5\xf2\x37\x50\x9b\x00\x79\xb2\xc0\x06\xae\xcb\x1c\x08"
- "\x79\x0f\x1e\x2c\x81\x7a\x15\x43\xbd\xa1\x8e\x58\x67\x87\x54\x67"
- "\x89\x13\x59\xc8\x89\xcc\x13\xc0\xc1\xff\x8c\x08\xb3\x0f\xbc\x97"
- "\xd2\x04\x6c\x9f\x0d\xf4\x44\x01\x69\x8b\xd0\x2f\x51\x43\xaa\xae"
- "\x75\xf5\x7f\xc6\x49\x1c\xc3\x7b\x69\x7e\x8a\xb5\x15\xf5\x84\x26"
- "\xdd\xce\x75\xea\x90\xe6\x21\x9d\x82\xf0\x33\xfd\xfe\x93\xe8\x3e"
- "\xd3\xef\x10\x3b\x5b\x0e\xea\xd1\x02\xe9\x19\x16\xc5\x65\x46\x4c"
- "\xc7\xb3\x25\xf1\xac\x57\xac\x33\xb4\x0b\xfc\x22\x05\x3b\x2c\x72"
- "\x7f\xcd\xde\x18\xd7\x9a\x6f\x4d\x66\xe5\x29\x12\xe7\xa0\xed\x74"
- "\xed\xde\x98\x7a\x9b\x8d\x84\xad\x4c\x7e\x8c\x0e\xf8\x6a\x45\x98"
- "\x63\xfe\x5c\x3c\x93\xdc\xb5\xf6\x5b\x13\x5d\x7b\x28\xfa\xa1\xd1"
- "\x44\x03\x65\x37\xca\xce\x16\x54\x06\x86\xff\x7f\x18\xfe\x88\x23"
- "\xd4\x47\xc4\xf1\x90\x6e\x4f\x5a\x67\x1c\x3b\xf8\xf7\x8a\x8b\xec"
- "\x05\x2e\x50\xf5\xb6\xe4\x38\x27\x97\x23\xea\xee\xc9\xac\x24\x72"
- "\x1d\x93\xdd\x21\x8b\x2b\x7f\x5b\xbc\x2b\x6f\xdb\x1a\x9a\xb7\x2d"
- "\x0d\x64\xa6\xca\x5f\x42\xb4\x8f\x3a\x35\xc4\x70\x8a\x44\x5b\x0d"
- "\xdb\x92\x43\x14\xd9\x0a\x88\x2d\x04\xf0\x1b\xd1\x60\x33\xa2\x45"
- "\x7d\x57\xa1\x1c\xff\xbb\x85\x90\x29\xa9\x84\x7c\x37\x9e\xf4\x2b"
- "\x86\xfb\x02\x6b\xcf\x21\xbe\xff\xd3\xea\x43\x89\x25\x70\x2f\x9e"
- "\x0d\x19\xe0\xfd\x2d\x3e\xf5\xce\xdd\x6e\x6b\xd7\xed\xb6\x34\x42"
- "\xbb\x1b\x5c\x79\x46\xb0\x91\xdb\x6c\x5d\xb4\xdb\xca\xdb\xdd\xff"
- "\x44\xdf\xb7\xdb\xc2\xcf\x5c\x5c\x6d\x99\x11\x5c\xbb\x2d\x3e\xc7"
- "\xff\xdc\xed\x36\xfa\xc0\xfb\xeb\x06\x57\xbe\x11\xf0\x36\x02\xde"
- "\xc6\x2e\xf0\x36\x8a\x78\x0f\x39\xdc\xf7\xed\xfe\xba\x90\xb7\xfb"
- "\xeb\x69\xc1\xb5\xfb\x6b\x9f\xf6\x4f\xd6\x6e\x1f\x78\x1f\xae\x81"
- "\x76\x03\xde\xa5\x80\xb7\xb1\x0b\xbc\x8d\x22\xde\x43\x3f\xef\xfb"
- "\x76\x1f\xe6\xe3\xff\xab\x0f\x4f\x0a\xae\xdd\x87\xf7\xf7\xdc\xee"
- "\x52\x1f\x78\x7f\x63\x72\xe5\x97\x02\xde\xa5\x80\x77\x69\x17\x78"
- "\x97\x8a\x78\xdf\x9c\xdb\xf7\xed\xfe\x86\xef\x7f\xb3\xfa\x9b\x89"
- "\xc1\xb5\xfb\x9b\x5a\x3f\xda\xed\x03\xef\xa6\x2a\x68\x37\xe0\xbd"
- "\x1d\xf0\x2e\xed\x02\xef\x52\x11\xef\x87\xef\xec\xfb\x76\x37\xad"
- "\xe2\xed\x6e\x1a\x1f\x5c\xbb\x9b\xaa\xfd\xb0\x6b\xe9\x60\xb3\x3b"
- "\x61\x6e\x4e\x1f\x47\xae\x3d\x85\xed\x3f\xa2\xa3\x21\xdb\xd2\x87"
- "\xac\xcc\x56\x38\xd4\xdb\x32\x86\x1c\x24\x02\xf4\xfd\x92\xc2\x2c"
- "\x64\x10\xb4\x35\x89\xe6\x97\x69\xf0\xaf\x0b\xca\x71\x80\xed\x77"
- "\xaa\xb7\xa5\xb5\xe5\xa5\xaa\x9e\x9b\x47\xb4\x59\x56\xa2\xa9\xcf"
- "\xb4\x90\xcc\x64\x6a\xad\x27\x5f\x93\x10\x0b\x11\x70\x1c\x6b\x5f"
- "\x4b\x15\xd1\xa7\x50\x0a\x65\x0f\xc5\xfe\x62\xfe\x11\x12\x0d\x31"
- "\x71\x36\x05\xff\x51\xe0\x22\x5a\x28\x3f\x1a\x65\x09\x65\x0f\x0b"
- "\x9b\x46\x14\x1f\xcc\xb1\x13\x94\x27\xca\x16\xfa\x96\xd1\x4c\xae"
- "\x36\x42\x1e\x78\x98\xcb\x75\xcb\xbc\x40\xe5\xfa\xed\x41\x1e\x57"
- "\x6e\x2b\x30\x5b\xda\xf0\x9c\x5a\x0d\xbe\xd7\x0c\xe9\x1b\xeb\x93"
- "\x4f\x40\x3f\xe4\xdb\xf1\xd4\xb0\x2d\xdb\x05\x3e\x2b\xb0\x72\x8f"
- "\xf8\x5c\xff\x26\x93\xb7\x1d\xe4\xdd\x89\x6b\x6e\x79\x7f\xb7\x11"
- "\xe4\x6d\x17\xe5\xed\x18\x72\xb0\xff\x09\x1f\xf2\xb6\x3b\xc0\xe7"
- "\x80\xbc\x6d\xfe\xcb\xfb\xbb\x95\x5e\xf2\x6e\x38\x3b\xf2\xfe\x8e"
- "\xef\x23\x96\x67\xd4\x78\xca\xfb\x3b\x15\x97\xf7\x91\x72\x6a\x30"
- "\x42\xff\x7e\x9b\x35\xc0\x72\x7d\xbe\xff\x28\xb3\xe3\xc0\xef\xce"
- "\x3e\xcc\x2d\xef\xef\x55\x34\xc4\x28\xf2\xdb\x08\xfc\x1e\x72\xb8"
- "\x6b\x79\x1b\x81\xdf\x46\xe0\xb7\x31\x00\x7e\x37\xff\xe4\x29\x6f"
- "\xe3\x59\xe2\x77\xb3\x78\xfe\x93\xd1\x8b\xdf\xcd\xe9\x5c\xde\xcd"
- "\x91\x20\x6f\xe0\xb7\x31\x40\x7e\x7f\x1f\xee\x87\xbc\x81\xdf\x9d"
- "\x7d\xa7\x5b\xde\x47\xd3\x41\xde\x22\xbf\x8d\xc0\xef\xa1\x9f\xfb"
- "\x90\x37\xf0\xbb\x14\xf8\x6d\x0c\x80\xdf\x47\x67\x7b\xc9\xfb\x2c"
- "\xf1\xfb\xe8\x18\x2e\xef\x52\x2f\x7e\x7f\xdf\xcc\xe5\xfd\x7d\x1e"
- "\x35\x94\x02\xbf\x8d\x01\xf2\xfb\xe8\x2a\x3f\xfc\x16\xf0\xbb\xb3"
- "\xcf\x76\xcb\xfb\x87\x66\x1a\x52\x2a\xf2\xbb\x14\xf8\x7d\x73\x6e"
- "\xd7\xf2\x2e\x05\x7e\x97\x02\xbf\x4b\x03\xe0\xf7\x0f\x9f\x79\xca"
- "\xbb\xf4\x2c\xf1\xfb\x87\x42\x51\xde\x5e\xfc\xfe\x21\x81\xcb\xfb"
- "\xa8\x03\xe4\x0d\xfc\x2e\x0d\x90\xdf\x3f\xd8\xfc\x90\x37\xf0\xbb"
- "\x73\xac\xe0\x96\xf7\xb1\x04\x90\xb7\xc8\xef\x52\xe0\xf7\xc3\x77"
- "\xfa\x90\x37\xf0\x7b\x3b\xf0\xbb\x34\x00\x7e\x1f\x9b\xe0\x25\xef"
- "\xb3\xc4\xef\x63\x6a\x2e\xef\xed\x5e\xfc\x6e\xa9\xe1\xf2\x6e\x59"
- "\x48\x0d\xdb\x81\xdf\xa5\x01\xf2\xfb\x98\xcf\xf7\x7f\xbb\x8b\x4f"
- "\x52\x8b\x88\xca\x53\xe6\xc7\x6b\xcf\x5c\x8c\x72\xfc\x9d\x73\x13"
- "\xa3\x1c\xcf\xee\x3a\x46\x39\x3e\x9e\xcb\xfc\x98\x25\xb8\x18\xe5"
- "\x78\x63\x30\x31\x4a\x67\x99\x5b\x63\xce\x5c\x9c\x62\x1d\x7d\x6e"
- "\xe2\x94\x1f\x6d\x5d\xc7\x29\x3f\x56\x72\x99\xff\x38\x2d\xb8\x38"
- "\xc5\x3a\x29\x98\x38\xa5\xb3\xcc\x7f\xda\x79\xe6\x62\x95\x9f\x8a"
- "\xce\x4d\xac\xf2\x53\x52\xd7\xb1\xca\x4f\x51\x5c\xe6\xd6\x9a\xe0"
- "\x62\x95\x9f\x4c\xc1\xc4\x2a\x9d\x65\x7e\x52\x77\xe6\xe2\x95\x93"
- "\x43\xcf\x4d\xbc\x72\xe2\x60\xd7\xf1\xca\x09\xb1\xff\x73\x62\x7c"
- "\x70\xf1\xca\x49\x3f\xfa\x3f\x9d\xe3\x95\xce\x32\xb7\x15\x9e\xb9"
- "\x98\xc5\xf6\xec\xb9\x89\x59\x6c\xf1\x5d\xc7\x2c\x36\x35\x97\xf9"
- "\xc9\xca\xe0\x62\x16\x5b\x59\x30\x31\x4b\x67\x99\x9f\xd2\x9c\xb9"
- "\xb8\xe5\xe7\xd3\xe7\x26\x6e\xf9\xb9\xba\xeb\xb8\xe5\xe7\x6c\x2e"
- "\xf3\x9f\xa3\x82\x8b\x5b\x4e\x45\x06\x13\xb7\xa0\xac\x51\xe6\x18"
- "\xab\x70\x99\xdb\x2d\x34\x74\x5b\x7c\x3b\xc4\x23\x21\x20\xf7\x90"
- "\x16\x22\x14\xa1\xcc\x1b\xb9\xcc\x9d\xa1\x65\x1a\x90\x4f\x12\xca"
- "\x8c\xb5\xe3\x87\x88\x50\x67\xde\xb6\x0c\x2a\x10\x68\x8b\x8a\x00"
- "\x66\xc7\x1c\x39\x24\x54\x9b\xb9\x12\xbe\xdb\xd9\xfe\x99\xda\xcc"
- "\xd5\x5f\x41\x1b\xfb\xe1\x1c\x85\xc3\x90\x52\xe9\x0c\xd9\x11\x0d"
- "\xd7\xae\xa1\x23\xf4\x95\xed\x10\x4b\xd0\x27\x22\xc2\xcd\x2d\x95"
- "\xc4\xec\xf8\x94\xd4\x37\xbe\x47\x5c\xa1\x65\xc3\xae\x73\x10\x1d"
- "\xfd\x41\x17\x5e\x9b\x66\x21\xce\xc7\x22\xd4\xe6\xf4\x1a\xe0\xc5"
- "\x5b\x24\xae\x99\x9e\xa2\xdf\xe8\xd4\xed\x21\xe5\xc9\x50\x8e\xd5"
- "\x69\xa8\x18\xe7\x08\x29\x9f\x55\xb1\xc4\x22\xa8\xed\x44\xb7\xb0"
- "\x89\xd2\xfc\x39\x44\x99\x7f\x98\xa8\xd6\xcd\x21\xea\x75\x87\x89"
- "\xa6\xb6\xa9\x91\xd4\x1d\xad\x21\x75\x27\xbe\x20\x75\xa7\xe0\xd3"
- "\x06\x1f\x17\x7c\xb2\xbf\x20\xb5\x2d\x84\x4c\x3e\x46\x48\x56\x13"
- "\xb5\xfe\xfe\x20\x09\xaf\x75\x34\x12\x5c\xc7\x7b\x5c\xd1\xba\x47"
- "\x3d\x8b\x84\xd3\x6f\x22\x08\x7d\x2c\x42\x80\x6b\x4a\x4c\x37\x3b"
- "\xac\xa4\xb6\xc9\x8e\xd7\xb7\xc2\x75\x65\x56\x13\x94\xef\xaa\xc1"
- "\xfd\xe2\xac\xb5\xd9\x9f\x40\xfb\x46\x6d\x05\x39\xaf\x91\x62\xb2"
- "\xfc\x36\x12\xbd\x0e\x60\x46\xce\xc4\x51\xce\x99\x92\xb6\x40\x39"
- "\xd3\xca\xf7\x3f\x7b\x22\x62\x18\xc8\x7b\xb8\xeb\x89\x04\xcd\x94"
- "\x2f\x0e\x51\x5c\xa7\x85\xf3\x33\xf5\xb6\x4f\x89\x79\x95\x8b\xc4"
- "\x3d\x4d\xc8\x24\x27\x21\x28\x13\x9c\x4b\x9e\x92\x4c\xc2\x70\xfd"
- "\x98\xeb\x07\xdd\x30\x73\x93\x95\xac\x70\x40\x5d\x8f\xdb\x3b\xea"
- "\x5a\xbf\xaa\x9e\xc0\xb5\xe1\xf5\x49\x16\xa2\x4e\x26\x1a\x94\x33"
- "\xc4\xa2\xe9\x53\x9a\xc9\x20\xbd\x8d\x52\x94\x31\xca\x16\xe5\x8c"
- "\xe5\x49\xb2\x37\x27\x5a\x49\x96\x9d\x68\xcc\x99\xf0\x37\x9d\x5a"
- "\xcd\xe4\x27\x02\x75\xdc\x4f\x43\x46\x6d\x05\x7e\x84\x23\x27\x80"
- "\x8f\x4d\xc0\x83\x61\x74\xf5\xa9\x8d\xc5\xd0\x5e\x9c\xc3\x0f\xac"
- "\xcd\x76\x7f\xe6\x3f\x3a\xc5\x84\x32\x3e\xdb\x39\x9f\xdb\x2b\x81"
- "\xcf\x0d\xc0\x67\x1b\xe7\x73\xff\x13\x7e\xf0\xd9\xe1\xe6\xf3\xe9"
- "\xdd\x6e\x3e\xb7\xbf\xec\x9b\xcf\x6d\x4e\xce\x67\xa3\xe6\xfc\xe4"
- "\x73\xdb\xf3\xdd\xf3\xb9\x2d\xd9\x37\x9f\x8d\x2a\x29\xde\xed\x1b"
- "\x3e\xb7\xd5\x9c\x45\x3e\xdb\x83\xe3\x73\x9b\xd1\x93\xcf\xa7\x77"
- "\x72\x3e\x9f\x4e\x0a\x8e\xcf\xed\x3e\xcf\x3f\xe8\x2e\xde\x76\xf3"
- "\xd9\x28\xda\x67\xf0\x55\xa1\x46\xb0\xcf\x46\xd1\x3e\x0f\x39\xdc"
- "\x33\x9f\x8d\x32\xfb\xec\x30\xb8\xf9\xec\x7a\xd2\x37\x9f\x9d\x75"
- "\x22\x9f\xcf\x53\xfb\xec\x9c\xdd\x3d\x9f\x9d\x31\xdd\xf0\x79\x8d"
- "\xd4\x97\xe8\x1b\x3e\x3b\x37\x9e\x3d\x3e\x1b\x83\xb4\xcf\xce\x34"
- "\x4f\x3e\x3b\x56\x71\x3e\x3b\xc6\x05\xc7\x67\x97\xcf\xf5\xcf\xdd"
- "\xf5\x65\x64\x7c\xe6\xf6\x59\x50\xc4\x03\x9f\xc1\x3e\x1b\x45\xfb"
- "\x3c\xf4\x73\x3f\xf8\x2c\xb3\xcf\xf4\x91\x0e\x3e\x0b\x8a\x09\x3e"
- "\xf9\x2c\x90\x22\xce\xe7\xd2\xf3\xd3\x3e\x0b\xe4\xfa\x6e\xf9\x2c"
- "\x10\x8d\x6f\x3e\x97\xaa\xa4\x7e\x5a\x9f\xf0\x59\x20\x49\x67\x91"
- "\xcf\xc1\xd9\x67\x81\x4c\xf4\xe4\x33\x9d\xc6\xf9\x4c\x55\x41\xf1"
- "\x59\x50\xf8\x3c\xff\xa7\xbb\x7e\xa2\x9b\xcf\xa5\xdc\x3e\x0b\x4a"
- "\x2d\x0d\x2d\x05\xfb\x5c\x2a\xda\xe7\x9b\x73\x7b\xe6\x73\xa9\xdb"
- "\x3e\x0b\xc2\x35\x6e\x3e\x2b\x87\xfa\xe6\x73\xbf\x45\x22\x9f\xcf"
- "\x4f\xfb\x2c\xf4\x53\x74\xcf\x67\xc1\xd2\x0d\x9f\xd7\x48\x7d\xe0"
- "\xbe\xe1\x73\xbf\x71\x67\x8f\xcf\xa5\xc1\xd9\x67\xa1\x5f\xb8\x07"
- "\x9f\x05\x21\x8a\xf1\x39\x57\xd1\x18\x1c\x9f\x95\x3e\xf7\x7f\xeb"
- "\xae\x0f\x2e\xe3\xb3\x68\x9f\x07\x58\x81\xcf\x60\x9f\x4b\x45\xfb"
- "\xfc\xf0\x9d\x7e\xf0\xd9\x6d\x9f\x05\xa5\xd3\xcd\xe7\x01\x5f\xfb"
- "\xe6\xf3\x80\xdb\x38\x9f\xb7\x9f\xa7\xf6\xb9\xff\x67\xdd\xf3\xb9"
- "\x7f\xa5\x6f\x3e\x6f\x57\x49\xe3\x0b\x7d\xc3\xe7\x01\xaa\xb3\xc8"
- "\xe7\x20\xed\x73\xff\x26\x4f\x3e\x2b\x6d\x9c\xcf\xca\xb2\xe0\xf8"
- "\x3c\xc0\xe7\xf9\x77\x01\x8d\x6f\x08\x83\xac\x38\xbe\xd1\x86\xe3"
- "\x1b\xee\xb5\x7f\x49\x61\x0d\x9c\xcf\xed\xc0\xe7\x2d\x72\x3e\xff"
- "\xdb\x6b\x7c\x43\x18\x58\xe7\xea\xe0\xf3\xa0\x4e\x7c\x76\x01\x9f"
- "\xdb\x19\x9f\x55\xa7\xa5\xf1\x0d\x73\xcb\x56\xe0\xc9\x51\x62\x8e"
- "\x07\x2e\xe7\x8b\x5c\xfe\x37\x70\x19\x64\xe8\x02\x19\xd7\x1e\x6c"
- "\x24\x71\x56\x2e\xcb\x36\x90\xb1\x4b\xce\xe3\xb6\x66\x01\xf9\x8b"
- "\xbc\x95\x38\x5c\xa7\x07\xee\xa6\x7c\x46\xea\x96\xc0\x67\x19\x7c"
- "\x32\xe1\x43\x3e\x23\xb5\xcd\xc0\xdd\xf9\x72\xee\x36\x88\xdc\x55"
- "\x19\xba\xe7\xae\x6a\xe1\x59\x1b\xcb\x10\x54\x7c\xfc\xeb\xdf\x09"
- "\x9a\xb8\xa9\x87\xa8\x39\xbd\x51\xe4\xe7\x51\x12\xe7\x20\x61\xf4"
- "\x61\xdd\x30\x75\x02\xd1\x2c\x77\x12\xc1\x30\x87\x68\x0c\x5f\x42"
- "\xbb\x25\xfd\x3d\x4c\xd4\x9f\xda\xdf\x23\xb5\x27\x1a\x49\xed\xa9"
- "\x4f\x48\xad\x0b\x3e\x47\xe1\x03\x75\x8d\x9b\x2b\x6f\xb7\x55\x6c"
- "\xf7\xa0\x67\xa1\xac\x28\xdf\xed\x1e\x94\xc8\xda\x9d\x08\xed\x6e"
- "\x73\xb7\xdb\x0c\x7a\x00\xf8\x0c\x77\x89\xe3\x21\x71\x56\x32\x68"
- "\xb1\x83\xd2\x36\x91\xff\x88\xcf\xa7\xfb\xed\x24\x2e\x19\x30\x7b"
- "\x0c\xf8\xdf\x54\x46\xb2\x32\x80\xff\x6d\x76\xe4\x9d\xd5\x9c\x7d"
- "\x1a\xf8\xaf\xda\x4a\x41\x7e\xed\xc8\xff\x7f\x23\xff\x07\x56\xbb"
- "\x18\xff\x07\xa6\x07\xc7\xff\x41\xfe\xf0\xbf\xe7\xf1\x10\x41\x8d"
- "\xfc\x6f\x68\xc3\xf1\x10\xf7\x1a\xd0\x9e\xf8\x2f\xb3\xe7\x83\x65"
- "\xfc\x57\x77\xc3\xff\x21\xa7\xa5\xf1\x90\x73\xcf\xff\x21\x3d\xf0"
- "\x7f\x48\x37\xfc\xef\xe3\xb1\x0f\x61\xc8\x59\xe4\xbf\xba\x07\xfe"
- "\xab\xfd\xe1\xbf\x3d\x38\xfe\x0f\xf1\xe2\xff\x60\x91\xff\x83\x83"
- "\xe4\xbf\xda\x0f\xfe\xfb\x31\x7e\x22\x84\x59\x71\xfc\xa4\x0d\xc7"
- "\x4f\xdc\x6b\x81\x7b\xe0\xbf\x6c\xfc\x44\x08\x91\xf1\x3f\xac\x1b"
- "\xfe\x87\x4a\xfc\x3f\x0f\xec\x7f\x68\x0f\xfc\x0f\xed\x8e\xff\x7d"
- "\x3b\x56\x22\x84\x9e\x45\xfe\x87\xf5\xc0\xff\x30\x3f\xf8\x6f\x0c"
- "\xd2\xfe\x87\x7a\xf1\x3f\x44\xe4\x7f\x48\x90\xfc\x0f\xf3\x87\xff"
- "\x7e\x8c\xb7\x0c\x43\xfe\x83\xfd\x37\xda\x64\x6b\xc2\x7b\xe2\xbf"
- "\xcc\xfe\x6b\x64\xfc\x1f\xd6\x0d\xff\x87\x9e\x96\xc6\x5b\xce\x3d"
- "\xff\x87\xf6\xc0\xff\xa1\xdd\xf0\xbf\xaf\xc7\x56\x86\x9e\x45\xfe"
- "\x0f\xeb\x81\xff\xc3\xfc\xe1\x7f\x90\xf6\x7f\xa8\x17\xff\x35\x22"
- "\xff\x35\x41\xf2\x7f\x98\x1f\xfc\xf7\x67\x7c\xe6\x12\xec\xcf\x82"
- "\xfd\x2f\x4d\x93\xbd\x1b\xd0\x03\xff\xe5\xe3\x33\xbf\x92\xf1\xff"
- "\x92\x6e\xf8\x1f\x2e\xf1\xff\x3c\xb0\xff\xe1\x3d\xf0\x3f\xbc\x3b"
- "\xfe\xf7\xf1\x58\x4c\xf8\x59\xe4\xff\x25\x3d\xf0\xff\x12\x3f\xf8"
- "\x5f\x1a\xa4\xfd\x0f\xf7\xe2\xff\xaf\x44\xfe\xff\x2a\x48\xfe\x5f"
- "\xe2\x0f\xff\xfd\x18\xcf\x89\x60\xe3\x39\x6d\x38\x9e\xe3\x7e\x47"
- "\xa4\x27\xfe\xcb\xec\xff\xa5\x32\xfe\x47\x74\xc3\xff\x5f\x9f\x96"
- "\xc6\x73\xce\x3d\xff\x7f\xdd\x03\xff\x7f\xdd\x0d\xff\xfb\x7a\xec"
- "\xe6\xd7\x67\x91\xff\x11\x3d\xf0\x3f\xc2\x1f\xfe\x07\x69\xff\x7f"
- "\xed\xc5\xff\x4b\x45\xfe\x5f\x1a\x24\xff\x23\xfa\x68\xfc\x67\xf8"
- "\x46\x1c\xff\x71\xa9\xb7\xa5\xb5\x17\xea\x2b\x5d\x79\xe5\xc9\x61"
- "\x0a\x2d\x71\xa8\x77\x44\x9b\xd3\x6c\x64\xca\xcf\x80\x49\xf2\xcf"
- "\x64\xe6\xcf\x1a\x3c\x2f\x70\x16\x85\xfe\xbf\xc7\x3b\xa2\xf0\x71"
- "\xe4\x8d\xda\xba\x4e\x4f\x94\xce\xd0\xb2\x61\x98\x66\x3e\x62\x27"
- "\xd8\xe6\x15\x28\x83\xa3\x6e\x19\xe0\x18\x1c\xfd\x51\xa7\x29\xce"
- "\x81\x3c\x6d\x16\xd2\x04\x7c\xa9\x6d\xb2\x80\xec\x97\x31\x6e\x21"
- "\x16\x50\x9f\x71\x25\xc7\x89\xd2\xf1\x4d\xc4\x70\xc0\x38\x3c\x64"
- "\x29\x51\x44\x36\x51\x17\x62\x89\x18\x21\xae\xda\x65\x94\x42\xbe"
- "\xe7\xeb\x81\xdf\x8e\x6f\x74\xc3\x8b\x21\x5f\xdf\x8f\xcb\x0c\x67"
- "\xf3\x1f\xf0\x37\xba\xf6\x20\xc8\x32\xf7\xb2\x20\x71\x1a\xee\xc7"
- "\xfb\x2f\xfe\x8c\x53\x44\xc6\xe0\x38\x05\xe0\x64\xf3\x13\x27\xbb"
- "\xc7\x3b\xad\x7d\x8e\xd3\xe5\x16\xff\x70\x8a\xbc\xc5\x13\xa7\xbe"
- "\x1e\x3f\x88\xe4\xfb\xc1\x08\x97\x37\x72\x9c\x2e\xd7\x06\x87\x53"
- "\x64\x50\xeb\x7f\x3b\xf7\xa7\x47\x34\x63\x7f\xda\x05\xfd\x69\xff"
- "\x70\x32\xa6\x7b\xbc\x83\xdb\xe7\x38\x8d\x58\xe3\x1f\x4e\x23\xbe"
- "\xf6\xc2\xa9\x8f\xfb\xb9\x23\xf8\x79\xd0\xc2\x88\x6c\x8e\x53\x64"
- "\x4d\x70\x38\x8d\xf0\xe3\xfd\x0f\x7f\xfa\x7d\x57\x14\x60\xbf\x0f"
- "\x70\xf2\x53\x9f\x8c\x76\x8f\x77\x86\xfb\x1c\xa7\x2b\xa2\xfd\xc3"
- "\xe9\x8a\xb5\x9e\x38\xf5\x75\x7f\xec\x8a\x69\x1c\xa7\x2b\x74\x1c"
- "\xa7\x91\xc9\xc1\xe1\x74\x45\x61\xdf\xf4\x4f\xae\x1c\x87\xfd\x13"
- "\x17\xf4\x4f\xfc\xc3\xa9\x34\xdd\xe3\x1d\xe7\x3e\xc7\x49\xdb\xe8"
- "\x1f\x4e\x57\x5e\xef\x85\x53\x1f\xf7\x1b\xb4\x0e\x8e\x93\xb6\x81"
- "\xe3\xa4\x8d\x08\x0e\xa7\x2b\x7d\x9e\xff\x19\x58\x1c\x3d\xca\x82"
- "\x71\x34\xe0\xe4\xa7\x3e\x95\xda\x3d\xde\xc9\xee\x73\x9c\x46\x65"
- "\xfb\x87\xd3\xa8\x2f\x3c\x71\xea\xeb\xf8\x76\x94\x91\xe3\x34\x2a"
- "\x9d\xe3\x74\xa5\x29\x38\x9c\x46\xf9\xb3\xfe\xb3\xcb\xf7\xb0\x3a"
- "\xc7\x7c\x51\x79\xe7\x57\xcc\x17\x35\xc6\x3f\xac\xa2\x9e\x3d\xb3"
- "\x31\x5f\x54\x3c\xc7\x2a\x2a\x8a\x63\xf5\x9b\x85\xc1\x61\x15\xb5"
- "\x31\xd8\xf7\xb7\x3a\xc7\x7d\xbf\x1d\x77\x7e\xc5\x7d\x57\xf9\x69"
- "\xff\x7e\x7b\xfd\x99\x8d\xfb\xae\x12\xed\xdf\x55\xa2\xfd\xbb\x2a"
- "\x48\xfb\xf7\x5b\x3f\xec\x5f\xd7\xef\x7d\x75\x8e\xfd\x7e\xd7\x74"
- "\x7e\xc5\x7e\xbf\x5b\xe5\x1f\x56\xbf\xfb\xea\xcc\xc6\x7e\xbf\x2b"
- "\xe3\x58\xfd\x2e\x83\x63\xf5\xdb\xea\xe0\xb0\xfa\x9d\xcf\xf3\x5f"
- "\x7a\x7a\x5f\xac\x73\xfc\x37\xfa\x3c\x8b\xff\x46\xfb\x19\xff\x8d"
- "\x3e\xc3\xf1\xdf\x68\x31\xfe\x1b\x2d\xc6\x7f\xba\x20\xe3\xbf\xd1"
- "\x41\xc5\x7f\x9e\x58\x49\x31\xe0\xef\xc7\x9f\x5f\x31\xe0\xd5\x07"
- "\xfd\xc3\xea\xf7\x37\x9d\xd9\x18\xf0\xf7\x84\x63\x75\xf5\x7e\x8e"
- "\xd5\xd5\x91\xc1\x61\xf5\x7b\x9f\xe7\x1f\xf6\xf4\x7e\x5a\xe7\x38"
- "\x70\x4c\xf3\xf9\x15\x07\x8e\xf1\xb3\xff\x3b\xe6\xeb\x33\x1b\x07"
- "\x8e\x11\xfb\xbf\x63\xc4\xfe\xef\xef\x83\xec\xff\x8e\xf1\xa3\xff"
- "\xeb\xcf\xb8\xdf\x75\xb1\x18\x03\x3a\xf3\xb6\xa5\x85\x81\xfc\xc3"
- "\xd2\x89\xd0\x16\x09\x78\xa9\x01\xaf\x95\x5a\xd2\x9e\x07\x78\x59"
- "\x1d\x64\xca\x93\x87\x68\x7d\x8b\x93\xb4\x01\x56\xa7\x21\x0e\x34"
- "\x5b\x9b\xf1\x1d\xbd\x3f\x1e\x16\xae\xfd\xfa\xe1\x27\x35\x04\xf1"
- "\x42\xf9\x3b\xd5\xa3\xb6\x52\xc0\x8b\xe1\xa7\xae\x18\xe7\xc8\xdb"
- "\x61\x9d\x7c\xec\x10\x5d\x6c\xa1\xb4\x2e\xc9\x0e\x75\x4a\xa9\xac"
- "\x4b\x6a\x24\x71\x4d\x64\x90\xf6\x41\xc4\xe5\xda\xe7\x31\xdd\x6c"
- "\x6d\x24\xb8\xef\x27\x1b\x03\x3f\xa4\x0b\x77\xfc\xaf\x4e\x8d\xfb"
- "\x37\xe1\x7b\x85\xd2\x1e\x4d\xe6\xa3\x1b\x19\xfe\xde\x63\xaa\x0c"
- "\xff\xff\xd5\xe1\xf8\x7c\x74\xdf\xc7\x82\xd7\xb2\xf1\x3f\xd7\xa1"
- "\x88\xe1\x52\x1d\x17\x2f\xa4\x14\xea\x38\xac\xde\x66\x25\x58\xcf"
- "\x7a\x9b\x89\x64\xa5\x11\x4d\x7d\x5b\x33\xc9\xb4\x51\x6b\x7d\xf6"
- "\xf7\x24\xee\x67\x9c\x17\x40\x3e\x5d\xfb\x05\xc7\xfb\x5a\xa5\xeb"
- "\x90\x6e\x38\xfc\x6d\xa8\x6f\x20\x24\x6c\x25\xc8\xda\x41\x04\xf6"
- "\xbe\xa6\x40\x54\x20\xaf\x24\x73\xf6\x61\x02\xb2\x4b\x36\x3b\xbe"
- "\x44\x79\x26\xc1\xf5\xf1\x1d\xf3\x0d\xa1\x65\x29\x98\x86\xb2\xc5"
- "\x75\xa6\xe6\x64\x2b\xcb\x23\x5d\xe7\xd8\x65\x13\x73\x7a\x1b\xa9"
- "\x87\x88\xc8\x22\x5c\x53\xb9\x2f\xa1\x11\xf8\x75\x4d\x90\x76\xfb"
- "\xba\x69\x7d\x33\x5e\x79\x7d\x19\xc6\xad\xc0\x2f\x1b\xaf\x63\xff"
- "\x13\x7e\xf0\xcb\xee\xe6\xd7\xf5\x13\x7a\xc7\xaf\xe8\x9f\xfa\x96"
- "\x5f\x7d\x1d\xbf\x46\xef\xea\x1d\xbf\xae\xbf\x85\xf3\x2b\x3a\x91"
- "\xf3\xeb\xfa\x68\x37\xbf\xfa\x9f\x38\x73\xfc\x8a\xd6\x70\x7e\x5d"
- "\xd7\x10\x1c\xbf\xae\xdf\xd9\x37\xe3\xac\x63\x55\x18\x6b\x3b\xf3"
- "\x8c\xa2\xfd\x1a\x72\xb8\x67\x7e\x19\x65\xf6\xeb\xc6\x97\x7b\xc7"
- "\xaf\x1b\xa7\xf6\x31\xbf\xfa\x38\xe6\xbe\x31\xb2\x77\xfc\xba\x71"
- "\x13\xe7\xd7\x0d\xd5\x9c\x5f\x37\x16\xb8\xf9\x35\xe4\xf0\x99\xe3"
- "\xd7\x0d\xc9\x9c\x5f\x37\x44\x07\xc7\xaf\xb1\x41\xed\x7f\xd5\xb9"
- "\x7f\x70\x73\x12\xf6\x0f\x80\x5f\xa2\xfd\x1a\xfa\xb9\x1f\xfc\x92"
- "\xd9\xaf\x9b\x15\xbd\xe3\xd7\x4d\x6f\xf6\x2d\xbf\xfa\xba\x9f\x70"
- "\x53\x46\xef\xf8\x75\xd3\x69\xce\xaf\x9b\xa2\x38\xbf\x6e\xb2\xba"
- "\xf9\x35\xf4\xf3\x33\xc7\xaf\xb1\x0d\x9c\x5f\x63\x0b\x82\xe3\xd7"
- "\xcd\xbe\xf7\x7f\x0e\x68\x5c\x7b\x5c\x0d\xf6\x69\x9c\x79\xa5\xa2"
- "\xfd\xba\x39\xb7\x67\x7e\x95\xca\xec\xd7\xb8\xd9\xbd\xe3\xd7\xb8"
- "\xa1\x7d\xcc\xaf\x3e\xee\xdb\xfc\xe1\x60\xef\xf8\x35\x6e\x3a\xe7"
- "\xd7\x1f\x56\x71\x7e\x8d\x8b\x77\xf3\xeb\xe6\xdc\x33\xc7\xaf\x3f"
- "\x44\x73\x7e\xdd\x6c\x0d\x8e\x5f\xe3\xfc\xd9\xff\xd5\x8f\xf1\xf8"
- "\x3f\xea\xb0\x1f\x06\xfc\x12\xed\xd7\xc3\x77\xfa\xc1\x2f\x99\xfd"
- "\xba\x75\x4f\xef\xf8\x75\xeb\x93\x7d\xcb\xaf\xbe\xee\x8f\xdd\x3a"
- "\xbe\x77\xfc\xba\xf5\x5d\xce\xaf\x5b\x9a\x38\xbf\x6e\xad\x74\xf3"
- "\xeb\xe1\x3b\xcf\x1c\xbf\x6e\x29\xe0\xfc\xba\x25\x3e\x38\x7e\xfd"
- "\xd1\x9f\xfd\x4f\xfd\x9c\x47\xb8\x2d\xaf\x77\x7d\xc8\xdb\xae\xea"
- "\x1d\xc7\xc6\x1f\x38\xbf\xfb\x90\xe3\xb7\xf6\x8e\x63\xb7\x8d\xe0"
- "\x1c\x1b\x1f\xcb\x39\x76\x5b\xf8\xd9\xe9\x43\xfe\xd1\xc6\x39\xf6"
- "\xc7\x9d\xc1\x71\xec\xb6\x3e\x9c\xff\xb8\xc3\xda\xbb\x7e\xe4\x1d"
- "\x6b\x7b\xc7\xb1\x3b\x6e\x39\xbf\xfb\x91\x77\x28\x7b\xc7\xb1\x3b"
- "\x56\x72\x8e\xdd\x5e\xce\x39\x76\x47\xfa\xd9\xe9\x47\xde\x9e\xc0"
- "\x39\x76\x7b\x90\xf3\x36\x77\x04\xf5\xfe\x4b\xd7\xf3\x36\x77\x4e"
- "\xeb\x5d\x5f\x72\xc2\xb1\xde\x71\x6c\x42\xd1\xf9\xdd\x97\x9c\x90"
- "\xd4\x3b\x8e\x4d\xf8\x96\x73\x6c\x82\x86\x73\x6c\xc2\xc1\xb3\xd3"
- "\x97\x8c\xd9\xc5\x39\x16\x93\x11\x1c\xc7\xee\x9c\xd5\x77\xf3\x4d"
- "\x13\xab\x7a\xd7\x9f\x9c\x38\xb5\x77\x1c\x9b\xa8\x38\xbf\xfb\x93"
- "\x77\xd5\xf6\x8e\x63\x13\xef\xe3\x1c\xbb\x2b\x8d\x73\x6c\x62\xcc"
- "\xd9\xe9\x4f\xde\xa5\xe5\x1c\xbb\xd3\x12\x1c\xc7\x26\xfa\xb1\xff"
- "\xbf\xbf\xf3\x64\xf7\x46\xf6\xae\x4f\x79\xcf\x3b\xbd\xe3\xd8\x3d"
- "\x73\xcf\xef\x3e\xe5\x3d\xd1\xbd\xe3\xd8\x3d\x15\x9c\x63\x77\x37"
- "\x72\x8e\xdd\x63\x3c\x3b\x7d\xca\xbb\x57\x71\x8e\xdd\x3d\x31\x38"
- "\x8e\xdd\xab\xeb\xbb\xf9\xbd\xfb\xb2\x7b\xd7\xaf\xbc\xef\xb2\xde"
- "\x71\x2c\xf6\x93\xf3\xbb\x5f\x19\xbb\xbe\x77\x1c\xbb\x6f\x28\xe7"
- "\x58\xec\x78\xce\xb1\xfb\x54\x67\xa7\x5f\x79\x6f\x33\xe7\xd8\xbd"
- "\x41\xee\x47\x71\x5f\xa7\xfd\xaf\xe6\xeb\x97\xcc\x5e\x38\x3f\x51"
- "\x3b\x5f\x9f\x96\xf2\xa4\x36\x75\xfe\xb2\xb9\xb7\x5d\xf5\xd4\x18"
- "\x6d\x4a\xba\x36\x65\xbe\xfe\x71\x31\x21\x71\x30\x79\x70\xee\xc2"
- "\xd9\xe9\x98\x02\xb9\x1f\xd7\x2f\x9a\xab\x4f\xd3\xa6\xcc\x7d\xf2"
- "\xa9\xf9\x29\x73\xf1\x7b\xaa\x76\xde\xe2\x14\x48\x78\x6c\xee\xfc"
- "\x25\x73\xb5\x73\x9e\x9a\x37\x6f\x6e\x4a\xea\x60\x32\xf9\xa9\x85"
- "\x69\xf3\x93\x17\xce\xd5\x4e\x9c\x3c\xe1\x9a\x69\x77\xff\x69\xda"
- "\x1d\x77\xe0\xe1\x64\xb2\xb3\xc9\x22\x69\x5e\x45\x34\x70\x4e\x79"
- "\x44\xf8\xd3\x65\xf5\x11\x84\x9d\x67\xbb\xee\x04\xd1\xac\x4d\x21"
- "\xca\x35\x27\x88\xca\x70\x82\xa8\xb5\x0b\x48\x0c\x5d\xfb\x7d\x03"
- "\xa4\x87\x53\xc3\x95\x16\x9a\x9f\x52\x45\x0d\xa3\xb4\xd6\x90\xc1"
- "\x98\xa6\xa1\x86\xc1\x2a\xbc\x06\xb2\x55\x42\xfa\x9a\xc3\xc2\x83"
- "\x8d\xd6\x90\x21\x95\x59\xdf\x13\x81\x0e\xbe\x7f\xd7\xeb\x2e\xab"
- "\xb0\x07\x47\x04\xa1\xed\x44\x78\x60\x3f\x7c\x4c\x44\x98\x94\x0c"
- "\x9f\x6c\xf8\xe4\xc1\x67\x27\x7c\x76\xc1\xa7\x01\x3e\x07\xe1\xd3"
- "\x0c\x1f\x2b\x7c\xec\x44\x98\x4c\xe0\xa3\x82\xcf\x2a\xf8\x18\xe1"
- "\x03\x79\x27\xd7\xf2\x72\x26\x37\x12\x61\x8a\x12\x3e\x93\xe0\x03"
- "\x65\xc5\x65\xc0\xa7\x8c\x08\xf1\xb1\xf0\xb7\x86\x9d\x46\x2a\xc4"
- "\xb5\xc0\x6f\x0d\x7c\xc6\x42\xfe\x83\xfc\x5a\x3c\xa4\x4d\xd5\x11"
- "\xa8\x67\xcf\x9f\xa9\x90\x7f\x6a\x3c\x7c\xd2\xe0\x03\xcf\x7c\x10"
- "\xd0\x7c\x70\x4d\x37\xf7\x34\xf4\x50\xa6\x35\x6c\xe5\x15\x16\x76"
- "\x06\x9e\x30\xe9\x7a\x67\x0e\xe9\xe7\x34\x0c\xa9\x4c\xbe\x9a\x28"
- "\x8e\x0a\x0f\x38\xcd\xab\xd0\xce\x5c\x69\x61\x67\x3a\xc2\x6f\x94"
- "\x59\x6b\xee\x03\x0e\x0b\x79\x31\x16\xcf\x34\x0b\x8c\x6f\x0f\x38"
- "\xf8\xfd\x93\xc6\x5b\x14\xa3\x1b\xd9\x19\x70\xb9\x87\xc6\xd0\xac"
- "\x84\x2d\xec\xec\x37\x94\x21\xea\xc1\x9a\xff\xac\xa2\xaa\x2f\x94"
- "\xa8\xf3\xa6\x65\x58\xaf\x07\x0e\xd0\x1c\x12\x0a\xf7\xef\xa7\x50"
- "\x37\x6b\x48\x4a\x15\xd4\x53\x89\xbf\x9d\x86\xc1\x0d\xa7\x43\xca"
- "\x35\xf8\xdd\x5e\xa4\x8f\xa1\x79\xe5\xe3\xb0\x9f\x6d\xca\x7c\x81"
- "\x1c\x86\xfb\x4e\x87\x54\x34\x6a\xef\x0f\xa3\x87\xf1\xde\x1c\x22"
- "\x58\x84\x49\x49\x5c\x57\x1f\xd8\x7f\x3a\x24\xc5\xe4\xdc\xf8\x3a"
- "\x9e\xff\xac\x74\x1a\x52\xaa\x78\xf9\x83\xc1\x4e\xee\xb0\x40\xbe"
- "\x6a\x96\x5e\xa8\x4f\x90\xbe\xc3\x5f\x93\x33\xbf\x3c\x1d\xff\x86"
- "\xac\x24\x36\xf6\x3b\x27\x86\xf0\xbf\x1a\xa2\xbd\x9f\x90\x16\x61"
- "\xf2\xfc\xeb\x6a\x88\xc2\x74\x3f\xd6\x7b\xf2\xd8\xac\x1a\xea\xd2"
- "\x66\xf6\x83\xe7\x4f\xbe\xa9\xe3\xb9\x97\x55\xd8\xf1\x8c\x54\x9a"
- "\x7b\x5f\x6d\xc9\x0b\x84\xe0\xbd\x58\xb7\x4d\xc3\x88\xb2\xe8\x05"
- "\xa2\xc2\x36\xb6\xe6\x4e\x9e\x25\x9d\x43\x87\xf7\x08\x90\xff\xbe"
- "\xfb\xb2\xa8\xac\xec\x6b\x9c\xac\x3d\x0f\x34\x70\x99\x4e\x2e\xb0"
- "\x28\x7e\xbb\x1f\xf3\x6b\x47\x31\x59\x1e\x10\xaf\xef\x47\x3c\xb1"
- "\x7c\x6a\xa8\x88\xc6\xdf\x78\xce\x5d\x18\xb0\x51\x9b\x19\x55\xc5"
- "\x65\x54\x3e\x0e\xcb\xc1\xfc\x34\x7f\x07\x7c\x9f\x94\x46\x0d\x4c"
- "\xc6\x3a\xad\x9e\xc4\x40\xdd\x9d\xce\xb5\x87\x9a\xa0\x0c\xd0\xbb"
- "\x43\xcd\x90\x3f\x9e\xc9\xdb\xb0\xa3\xc1\x22\x4c\xb6\xc2\xb5\xe6"
- "\x8e\xb3\x2f\xb9\x9c\x15\x90\xcf\xde\x9a\x3b\x25\xca\xa2\xb8\xbd"
- "\x89\xe1\xbc\x84\xee\xc7\x33\x36\x4f\x2e\xa1\x8e\x38\xc7\x21\x17"
- "\xd8\x2a\x02\xd7\x27\x5a\xc8\x44\x95\xd4\x46\x8e\x7d\x47\x39\x07"
- "\xf0\xb7\x75\x10\x2b\x67\x61\x57\xe5\x58\x84\x29\x63\x1f\x75\x68"
- "\x15\x6d\xa7\x68\xc3\xba\x3f\xa3\x1c\x09\x6d\x5b\x42\x6b\x57\xc4"
- "\x52\x7b\xfe\xe7\x84\xd4\x25\x1d\x24\xa0\xf3\x91\xa1\x0a\x6a\x8d"
- "\x7b\x9a\x84\x85\x26\x87\xd1\x4f\x6a\x0e\x92\xe5\xb1\xb4\x19\xcf"
- "\xf0\xad\xb7\x35\x91\x8c\x2f\x88\x3a\xab\x8e\x84\x67\xc4\x52\x6b"
- "\xed\xac\x83\x84\xa7\xd7\x91\xac\xaf\x89\x72\x79\x35\xb5\x4f\x01"
- "\xfb\xbf\xef\x20\xa6\x37\x11\x3c\xa3\x32\xab\x99\x3a\x32\x1f\x21"
- "\x6a\xfc\x5e\x57\x8d\xe9\xdf\x92\xac\x63\x44\x19\x97\x6e\x0d\x2b"
- "\x86\x67\xe2\xfd\x25\x50\x17\xd7\x29\xba\x6b\xdd\x29\x42\x96\x4f"
- "\x27\x11\x19\xb3\x89\x26\xce\x49\xa8\xd9\xf1\x0e\x89\x73\x52\xf0"
- "\x2f\x7b\xc9\x8a\xf9\x44\x15\xe7\xc0\xf7\xd8\x0e\x10\x3c\xa7\xbb"
- "\x04\xf2\x42\xdb\x4c\xd8\xb6\xe5\x5f\x91\x08\x3c\x9f\x9c\xdf\xb3"
- "\x5b\xbc\xe7\x2b\x82\x32\x3b\x1d\x32\x4a\x63\x37\x8c\x2a\x80\xb6"
- "\x8f\x43\x19\xc0\x73\x1a\x5c\x78\x1f\xdc\xbf\x2e\x85\xc9\x40\xf1"
- "\xa8\x83\xa8\x9d\x86\x1d\x55\x8f\xa6\x9b\x58\xb9\x16\x21\x2e\xad"
- "\x24\x85\xd5\xc9\x23\x6f\x9c\x83\x9e\xb4\x86\xec\x00\xde\xc7\x15"
- "\xc6\xa5\xdf\x41\xf1\x5e\xc0\xd2\xd6\x9a\x1b\x77\x50\x92\xb7\x84"
- "\x0b\xe4\x69\x00\x2c\x6c\xfd\x92\x89\x12\xae\x3b\x2c\x8a\x09\x26"
- "\x37\xd7\x26\x25\x01\xe6\x03\xa4\xbc\x3c\x4f\xbc\xd6\xa2\x88\x51"
- "\xc9\xf8\x88\xfc\xea\xc8\x03\xd7\x63\xa0\x0c\x0d\x7f\x46\x3c\xc1"
- "\x3c\xa2\xed\x97\xf2\xf6\xa3\x6b\x1a\x1b\x9d\x21\xe5\x31\x54\xa0"
- "\x76\xe0\x63\x23\x3d\x19\xa1\x9e\xe2\xa0\x76\x97\x61\x3b\xda\x79"
- "\x35\x9e\xeb\xca\xf3\xc7\x7f\x06\xd7\x2d\xda\x25\xec\x7b\x13\x3e"
- "\x87\xe6\xa5\x58\x3a\xae\xe5\x90\xfe\xb4\x48\x1f\x0d\xbe\x43\x13"
- "\x57\x43\xed\x4e\x43\x6a\x74\x7e\x0a\xfa\x8e\xf2\x68\xd4\x6b\x57"
- "\xc8\x8e\x66\xfb\xa6\x0a\x0b\xda\x27\xd4\x11\x9a\xb7\xbd\x81\xdf"
- "\x3b\x69\x3e\xea\x0d\xb7\x35\xf1\x65\x4e\x28\x03\xea\x74\x10\xae"
- "\xf5\x3f\x2c\x4c\x8d\xc4\xf7\x49\xe9\x9a\x2f\xc2\xd9\xb9\x97\xc2"
- "\xd4\x2b\x39\x7f\x1b\x1b\x3d\x7e\x0b\x28\x3b\xd0\x27\xb0\x59\x68"
- "\x1f\x20\x7d\x82\x5b\x87\x99\xdc\x04\x6e\x8b\xb6\x5b\xb8\x1d\xe9"
- "\xe7\x82\x7c\x8a\xc3\xa2\x3e\x9e\x1e\x74\xa8\xa5\x35\x77\x2a\xf0"
- "\xff\xca\x74\x0f\x3d\xc9\x3d\x90\x8e\x67\x6c\x42\x5d\xfa\x41\x99"
- "\x9b\xe0\xef\x40\xf8\x5b\xf4\x71\x0d\xe2\xcd\xca\x1d\x82\xdf\x37"
- "\x5d\x4a\xad\x13\xef\x26\x78\x9e\x26\xe8\xdb\xd4\x9d\x16\xf2\xa4"
- "\x1a\xcb\x59\x8b\xe7\x8c\x42\x1a\xe6\x81\xf4\x5a\x48\x77\xf0\xf2"
- "\x27\xa5\xd9\xa0\xae\x5e\xe5\xff\xc4\xcb\xe7\xe5\x62\x79\x52\xd9"
- "\x45\x1b\x68\x0b\x2f\xfb\x41\x8d\x54\xb6\x01\xd2\xa4\xf2\x27\x2e"
- "\x92\x9e\xf1\x60\x34\x5c\x5f\x25\x6f\xc3\xc6\x0d\xd4\x86\x65\xc0"
- "\xb5\x49\x16\xf2\xac\x15\xaf\xad\x81\x34\xbc\x57\xc6\xab\x7e\x1f"
- "\xc7\x42\x19\xd5\xac\x8c\x34\x0b\x59\x95\xee\x65\xe3\x42\x24\x1b"
- "\x27\x96\xb5\x51\x2a\xcb\x5d\x8e\xc4\xa7\xa6\x64\x11\x57\x2c\x57"
- "\x8d\xe5\x42\xfe\x1a\x0b\x49\xad\x95\xb7\x1d\x6c\x5a\x03\xcd\x2f"
- "\x8f\x45\x3b\x26\xf2\xd1\x89\x36\x59\xaa\x37\x9e\x33\x0a\xb6\xdb"
- "\x86\xfa\xc2\xec\xb7\x61\x87\xa9\x35\xf7\x4f\x1a\x2f\x7b\xad\xc4"
- "\x7c\xce\xdc\xfb\x47\x17\xe1\x39\xab\x97\xd2\x66\xc8\x33\xd6\xe3"
- "\x6c\x51\x81\xdc\x0e\x69\xb1\xd2\x19\xa7\xf9\x90\xc7\x22\xdc\xef"
- "\x73\x0f\xc7\xcc\x2b\x89\x60\x2e\xb4\x60\xfc\x8c\xbc\x1a\x6f\x8e"
- "\xb4\x11\x73\xa1\x8b\xb8\x8a\xf5\xb3\x62\x32\xa9\x09\x62\xa6\xbd"
- "\x78\x36\x75\x60\x3e\xf9\x4f\x05\x8c\x4f\x6d\x10\x57\x66\xdc\x40"
- "\xd0\x0f\x1f\x17\xa6\xfd\x6c\xb6\x9e\x60\xba\x05\xdf\xd9\xfb\xd1"
- "\x2f\x42\x1c\x8a\xb1\x28\xc4\xff\x49\x05\x02\x8f\x47\x5d\x90\xb7"
- "\x18\xd3\x31\x56\x05\x3b\x59\x22\xbb\x46\x8b\xf5\x11\x5c\x76\xd3"
- "\x2a\x98\x3f\xc0\xfa\x3a\xee\x35\x61\x9d\x5d\x85\xfa\x08\x6c\x43"
- "\x56\x3a\x75\x99\x1d\xad\x26\xb4\xa5\xda\x25\x18\x47\x4f\x5b\x1b"
- "\x57\x44\xa8\xab\x48\x1f\x11\x58\x1b\xa6\xb1\xf5\x4f\xd0\x57\x38"
- "\x6e\x1d\xa1\x8f\xc0\xb3\x9e\xd7\x65\xf6\x57\xdd\x55\x48\x4d\x27"
- "\x47\xea\x67\xb5\xe6\x4e\x2b\x97\xce\xd2\x0d\xb0\xdc\x72\xa9\xed"
- "\xc5\x62\xdb\x21\x8d\x9d\xd9\x73\xdd\x46\x76\x96\x37\xfe\xf6\x79"
- "\xd6\x27\xcd\xdb\x11\x8b\xf7\x42\xdb\x63\x4a\x24\x39\x39\xac\x78"
- "\x8e\xf9\xd0\xa3\xc2\x43\x4f\xc7\x65\x98\x08\xdb\xb7\xdf\xb0\x23"
- "\x36\xb0\x7a\x3d\xc4\xd6\xbf\xd7\x43\x3f\x25\xce\xf1\x21\xe5\x76"
- "\xef\xa1\x97\xa7\x88\xe5\xe1\x35\x09\xab\x62\xb1\xff\x10\xc4\x33"
- "\x7c\x9e\x7f\x20\x6b\x97\xa6\x73\xbb\xfe\x3c\x35\xf8\x76\xfd\x39"
- "\xb2\x73\xbb\xfe\xfc\x74\xdf\xb6\xeb\xcf\xd9\x7e\xb4\x4b\xdb\xb9"
- "\x5d\x7f\x19\xdd\x8b\x76\xd9\x3a\xb7\xeb\x2f\x53\xfb\xb6\x5d\x7f"
- "\x49\xf0\xa3\x5d\xd1\x9d\xdb\x95\xa0\x08\xbe\x5d\x7f\xa9\xed\xdc"
- "\xae\x84\xd1\x7d\xdb\xae\x84\xe8\x80\xed\x61\x7e\x79\x01\xb7\x87"
- "\x09\x07\x02\xb7\x87\x09\x5b\x3b\xdb\xc3\xbf\xf6\x77\xdb\xc3\xe9"
- "\x3f\x05\x65\x0f\xf3\x53\xc4\x98\x62\xfa\xee\x4e\xf6\x30\x2f\xa5"
- "\xa1\x6b\x7b\x38\x7d\x13\xb3\x87\x86\x94\x86\xc0\xda\x30\x3d\xb1"
- "\xc3\x1e\x86\xa4\x34\x78\xd8\xc3\xd0\xf2\x82\xd6\xdc\xe9\xbb\x82"
- "\xb3\x87\xd3\x77\x75\xb6\x87\xd3\x23\x3d\xed\xe1\x74\x9f\x6b\x9d"
- "\x81\x87\x35\x5d\xd9\xc3\x38\xc7\x8f\x54\xe4\x46\x4d\x60\xf5\xf9"
- "\xab\xcf\xf7\xbf\xe1\x59\xf1\x3d\x3c\x2b\x3e\xc0\x67\x55\xf9\x7c"
- "\x96\xaa\xd1\x0e\x71\x86\x66\xc5\xcb\x44\x38\x02\x3d\xfe\xfa\xc8"
- "\x46\xe8\x07\xd8\xc9\xb5\xc9\xc0\x89\x1c\x32\xbe\xbe\xb0\x85\xd4"
- "\x47\x1e\x21\x74\x50\xa3\x9d\x6e\xd7\x37\xc4\xa4\x20\x37\x1f\x7e"
- "\xd2\x9c\x66\x0f\x90\x9b\x0f\x8f\x97\xb8\x59\xef\x00\x6e\x2e\x41"
- "\x3e\xce\x78\xd9\xdc\x72\x54\xe4\xe6\x0c\x43\x07\x3e\x39\x9c\x9f"
- "\x5d\x72\x13\x74\xc2\x93\x9b\x3b\x62\x38\x37\x67\x4c\xef\xcc\xcd"
- "\x1d\x31\x5d\x73\x73\xc6\x4d\x9c\x9b\x3b\x62\x02\x6b\xc3\x0c\xe2"
- "\xe6\xe6\x8e\x18\x0f\x6e\xfe\x56\xdf\xd0\x9a\x3b\x23\x21\x38\x6e"
- "\xce\x48\x90\xda\x5e\x24\xb6\x1d\xe4\x55\xe5\xc9\xcd\x19\x05\x3e"
- "\x31\x5c\xb3\x37\x06\xec\xa1\xfa\xa8\xf0\xc8\x2c\x27\xc4\xad\xae"
- "\xbc\xb0\x1a\xe8\x77\xb5\xe2\x99\xf1\x54\x18\x4b\xe8\x52\x9d\xba"
- "\x15\xfa\xbf\xad\xad\x49\x2a\x3a\xb8\x31\x87\xb6\x47\x10\xa8\x7b"
- "\x18\x6d\xd5\x85\x82\xcc\xa2\xe0\xef\xb0\xa2\x25\x24\x1c\x3e\x11"
- "\x45\xa2\x5c\xe1\x7b\x34\x5d\x1a\x31\x38\x7f\x09\x19\x13\x66\x23"
- "\x78\xfe\x4e\x42\xd8\x4a\x0d\x09\x73\x90\x70\xfc\x4e\x73\x3e\x56"
- "\x42\xff\x4c\x89\x63\x9f\xae\x10\x78\x5e\x7a\x18\xa5\xa9\x3a\x02"
- "\x7d\x35\x15\x60\x10\x51\x22\xd0\x4a\xe7\x52\x9d\x40\x43\xcb\x1f"
- "\xa0\xcb\x13\x58\x9d\x5c\x51\x8b\x35\x74\x3b\x7c\xb2\x92\xf0\xb9"
- "\x31\x78\x76\x31\xfd\xed\xe2\x70\xda\x1a\x31\xd8\x70\x8a\x8c\x29"
- "\x59\x42\xa2\x8a\x97\x10\x1d\x6d\xd7\x09\x20\x83\x84\x99\x4f\x6a"
- "\x10\xf7\x04\x2a\xc0\xb3\x96\xc0\xb3\x00\x4b\xa7\x01\x9e\xe5\x80"
- "\x67\xfd\x08\xcf\x3a\x0e\xcf\xca\x81\x67\xe5\xf0\x67\x05\x26\xf3"
- "\x47\xba\x3d\xff\x39\x6e\xc5\x48\xdc\x4b\xf7\xbb\xb0\xf4\x81\xb1"
- "\x38\x5e\x7d\x72\x79\x52\x80\x7c\x9f\xe9\x73\xff\xe7\x75\xaf\x93"
- "\x48\xaa\x1e\x64\x9f\xf2\xec\x21\x8a\xfd\xe8\x67\x5f\x27\x63\x50"
- "\xe7\xea\xed\xc7\x08\x0d\x19\x64\xdf\xab\x6b\x09\xf4\x59\x3e\xd7"
- "\x3f\xe4\xe6\x40\xbf\x59\x0d\xfd\x50\x75\x79\xc2\xba\x1c\x9a\xde"
- "\x1e\xa9\x8f\x6e\x8b\xd4\xc7\x3f\xea\xd0\x00\xaf\x68\xba\x36\x85"
- "\x68\x8f\x08\x89\x5f\x7d\xba\x1f\x7c\xc4\x5f\x89\xea\xb0\x30\x37"
- "\x3c\xeb\x0b\x1c\x6b\x7c\x54\xe7\x39\xd6\xf8\xe8\x24\x22\xcc\xda"
- "\x45\x84\xd9\xb5\x44\x98\x63\x25\x90\xcf\xf3\x93\xa8\xe6\x65\xcd"
- "\xda\x14\xf7\xca\x48\x92\xe9\xa0\xdf\xd1\xbc\x54\x5d\x3e\xf4\x7f"
- "\xe3\x46\x2b\x2c\xa6\x25\x38\x06\x37\xeb\x79\x90\xe9\x0f\xe0\x97"
- "\xc2\xe0\xfb\x23\x80\x1d\x49\x4e\x21\xbf\x3a\x2a\xcc\x9a\xe1\x80"
- "\xef\x61\xb6\x81\xb1\xce\xac\x04\xe2\x88\xa8\xb0\xb4\xe7\x95\x47"
- "\x3b\xa1\x2f\xeb\x52\x87\xd5\xe0\x38\x88\xb9\xc5\x49\x0a\x81\x77"
- "\x8f\x3a\x55\xa8\x0f\x09\xa6\x39\x9f\x92\x23\x69\x44\xc8\xfa\x99"
- "\x84\xd0\x93\x3a\xb5\xc4\xeb\xc9\x2d\x61\xf6\x15\x2d\xd4\x85\xfc"
- "\xc6\x71\x07\xb8\x16\x9a\xf9\x33\xf8\x5a\x6b\x33\x29\x84\x7e\xb3"
- "\x33\x35\x69\x98\xf5\x64\xd2\xaf\xb6\xb8\x48\x78\xa8\x8d\x68\x0a"
- "\x4f\x00\x07\x53\x81\x7f\x27\x80\xe7\x56\xce\x73\x7c\x57\xa8\x18"
- "\x39\xbe\xfa\xe0\xc2\x92\x13\x9c\xe3\x8c\x77\xc8\xf1\xc5\xc0\x3b"
- "\xbd\x9b\x77\x8e\x93\xc0\xf1\xdc\x99\xea\xc2\x1c\x8a\xe3\x22\x42"
- "\xc9\xd1\x81\x78\x4d\xd1\x7f\xb4\xa0\xfd\x34\xde\x4e\xdc\xfd\xb0"
- "\xb9\x97\xb4\x8d\xd0\xc7\x6b\x1f\xa4\x3f\x1e\x16\x66\xad\x81\x74"
- "\x95\xf6\xcf\xbf\xd3\x80\xbc\x2f\xe1\x63\x14\x73\xc3\xb1\x9f\x6f"
- "\x01\x59\xa0\x5c\xb4\x0f\x92\xdf\x1d\x16\x1e\x7d\x04\xe5\xb8\xb4"
- "\x8c\xf4\x4b\xbe\x9d\x36\x81\xcc\x12\xb1\x3c\x8b\xf0\x28\xeb\x67"
- "\xe1\xfc\xc7\x3e\x36\xf6\xc9\xef\x71\x82\xdc\x1c\xea\x14\x0b\xe0"
- "\x1d\x6b\x5a\xd0\xc6\x74\x0e\xe5\x78\x64\x21\xa0\xd7\x02\xb2\x72"
- "\x82\xac\x5a\x99\x2d\x88\x67\xb6\x60\x4d\x63\x46\x86\x85\xba\xe2"
- "\x12\xfb\xd1\xcc\x27\x71\xee\xc5\x49\x66\x26\x13\xba\xe2\x18\xc8"
- "\xcb\xd6\x88\x76\x23\xd4\xb5\x94\xdb\x06\x94\x57\x48\x0b\xd1\xd0"
- "\xfc\x21\xa6\xd7\x33\x6b\xfa\x3b\x81\xbf\x68\x1f\xc2\x56\x2a\x06"
- "\x81\x5e\x86\xe6\xa1\xfe\x82\x3e\x87\xad\x64\xf6\x2a\xa1\x10\xf4"
- "\xd6\xb1\x54\x37\xaa\x7d\xa9\x4e\x0b\x9f\x91\x92\x0d\xc1\x33\xbf"
- "\x8a\x50\xb6\xb9\x33\xd3\xd0\x7e\x98\xd3\x2d\xc4\x01\xb2\x0d\x45"
- "\x7f\xb3\x54\x17\xc9\x64\xfc\xb8\x8e\x5c\x67\x27\x0a\xa8\x93\x06"
- "\xea\x4b\x4a\xe6\x11\x55\x5d\xd2\x61\xe2\x04\xdd\x90\xe4\x3e\x79"
- "\xbe\x96\x40\xb9\xc2\x5e\xdd\x01\x22\xca\x4c\xe1\x9b\x77\x73\xbe"
- "\x77\xf3\x6e\xce\xf7\x28\x3b\xce\xbb\x39\xcd\x17\x22\xef\xf6\x25"
- "\x30\xde\xf5\x6b\x1f\xc1\xf8\x94\x68\x76\xbc\x05\x32\x9a\x83\x63"
- "\x9b\x04\x39\xf3\xc9\xab\xc8\x99\xc7\x1c\xe7\x2b\x67\x4e\xb7\xea"
- "\xb4\xf0\x39\x23\x9c\x81\x72\x19\x67\x50\x56\xfb\x12\xda\x88\x24"
- "\x23\xa6\xab\x79\x83\xec\xda\x2c\x72\x07\xe8\x6a\x78\xd8\xca\x91"
- "\xa4\x8e\xc9\x69\x6e\xb8\xf6\xcf\xd4\x75\x58\x48\xbc\x29\xeb\x33"
- "\xa2\x69\xcb\xa1\xd4\xec\xa8\x20\x2e\xf5\x8e\x66\x1c\x67\x76\xe5"
- "\xa5\x46\x4b\x73\x38\x38\x1e\x17\x96\x8c\xf3\x36\x83\x1b\x9c\x86"
- "\x8a\x68\x97\x61\xb0\x8a\x86\x8c\x5a\x83\x63\x6f\xae\xb5\xdf\x37"
- "\xb8\x42\xae\xb4\xb4\xe6\x26\x66\x58\xc8\x37\xc9\x6c\x3c\x38\xaf"
- "\x1c\x63\x17\xb4\xbf\xa5\x6c\xbc\x38\x04\xc7\xce\x13\x0b\xa5\xf9"
- "\x09\xb4\x09\xe2\xb8\x9c\x38\x6e\x97\x88\x18\x0e\xc6\x71\x3b\x6e"
- "\x53\x12\x0d\xd2\xb8\x9d\xf4\x1b\xaf\x5b\x84\xc4\x02\x1c\xf3\x71"
- "\xdf\x37\x97\x9f\xd5\xdb\x71\xdf\xa3\x43\xd1\xd6\xbb\xef\xe3\xbf"
- "\xc1\xae\xa8\xdb\x05\xa2\xea\x32\xc6\x50\x57\x44\x83\xfe\x28\x8f"
- "\x08\xf3\x86\xc2\x5f\x01\xe4\x52\x01\x7f\xfb\xc1\xdf\x15\x58\x76"
- "\x60\xfe\x6a\x2e\x7b\xff\x13\xda\x9f\x21\xda\x46\xb6\x96\x22\xf9"
- "\x6a\x12\x72\x54\xfc\xde\x9a\x3b\xd7\x28\xcd\xb3\xb8\xf3\x77\xe0"
- "\x13\x83\xcf\x06\x8c\x94\x7c\xee\x87\xff\x96\x95\x37\x81\xfd\x26"
- "\x4a\x2d\x60\x63\xc5\x39\x5a\xe0\xaf\xa2\x95\x26\xdd\x2e\xfe\xbd"
- "\x0d\xf5\x03\xc7\x4b\x31\x5e\x13\xed\x6f\x2c\x7f\xee\xbc\x48\xf0"
- "\xa7\x1e\xcf\xed\x4a\x1e\x16\x61\xde\x38\x5f\xd7\x02\x93\xc5\x3c"
- "\x9f\xef\xbf\xdd\xad\x73\xd2\x00\xcb\xda\xea\x33\x46\x8c\xd4\x6b"
- "\xe2\xca\x9c\x26\x57\x7b\x42\xd8\xde\x8c\x63\x01\xc6\x17\xf3\xec"
- "\xbe\xca\x75\xaa\xcb\x88\xa3\x50\xaf\xc1\x31\xc9\xfa\x32\x07\x79"
- "\xe5\x68\xb3\x10\x37\x7a\x24\x09\x69\x22\x1a\x8c\x9f\x26\xb7\x7c"
- "\x48\x31\x86\xca\x3f\x4a\xa2\xda\x7e\x4c\x08\x6b\x87\x58\xf0\xb9"
- "\xa3\x64\xbc\xeb\xf1\x88\xc1\x79\xf3\x88\xb2\x0d\xe2\xd5\xb6\xc7"
- "\x93\xc2\xf6\x1d\x6c\x26\xa0\x27\x9a\x7a\x9b\x85\x14\x43\x5e\xfa"
- "\x5d\x42\xe8\x7d\xb3\xa8\xbd\x76\xd6\x0b\x24\x4e\xe7\x34\x65\x7e"
- "\x4d\x42\xc0\x16\x69\xcc\xe9\x15\xc4\xec\x38\x46\xfa\x3f\x2d\x68"
- "\xcd\x8e\x6f\x89\x61\x1e\xd8\x30\xb0\x59\x59\xd3\xc1\x56\x3b\x7e"
- "\x26\x5b\xe4\xb6\x7a\xc1\xdf\xdd\xb6\xfa\x47\xb0\xd5\xb9\x60\xab"
- "\xb3\x22\x48\x7d\xb2\x89\x80\xed\x18\x38\x25\x39\xcc\x9e\x99\x0c"
- "\x36\xfb\x69\xb0\xd9\xe9\xdf\x12\x66\xaf\x5b\x9a\x09\xd8\xda\xd0"
- "\x22\x3d\x09\x6f\x5f\x0c\x36\xfb\xc7\xa4\x5f\x6d\xca\xe4\x36\x7b"
- "\xb3\x1e\x6c\xf6\x62\x88\x89\xf5\x60\xb3\x5b\xba\xb0\xd9\xc7\x7d"
- "\xc4\xc3\xa2\xfd\x69\x5b\xac\x13\x36\x0b\x14\xe7\x55\x84\x4d\x5f"
- "\x0e\x0c\x90\x27\x49\x19\xbe\x30\x40\x79\xa3\xfc\x5d\x80\x43\x1d"
- "\x60\xc0\xe2\x56\xfb\xc0\xd8\x76\xf0\x69\xce\xd0\x6d\xf1\xaf\x1e"
- "\x6d\x14\x42\xd3\x88\x66\x4a\xf2\x87\xb4\x2d\x35\x01\xe2\xfe\x84"
- "\x10\x47\x5e\x19\xc9\x83\x98\xda\x09\xb1\x77\x7b\x6b\x84\x0a\x64"
- "\xa0\xb1\x2e\x4d\x0a\x43\x19\xba\x46\x00\x9e\x03\xee\x3b\x08\x36"
- "\x74\x6c\xd1\x3c\x32\xae\xdd\xb0\x2d\x83\x1a\xb6\x25\x3b\x0d\xdb"
- "\xd2\xe0\xde\xd0\x07\x2c\x88\xcb\x7b\x04\xd2\x0a\x68\xfe\xf6\x78"
- "\x67\x48\x19\xb1\x86\x6c\x4b\x87\xdf\x6b\xf0\x7a\xe6\x6c\x12\x12"
- "\xa7\x3b\x6d\xe2\x78\x95\x12\xc4\x89\xe3\xf5\x15\x31\x40\xbf\x0f"
- "\x7d\x2e\xf3\xaf\x22\x66\xd0\x5f\x60\xf1\xbe\x1b\x37\x2f\x1f\x2b"
- "\xe2\x56\xd7\x62\x22\xe0\x4f\x06\x76\xf8\x5a\x86\xdb\x57\x44\xf2"
- "\xb3\x20\xef\xd0\x22\xf0\xb5\xed\x7d\xe5\x6b\xc5\x7e\x0c\xfa\x5a"
- "\xf4\xb3\x88\xdb\xe6\x80\x71\x5b\xe0\x73\xfd\x7b\x0f\xb8\x35\x04"
- "\x87\xdb\xfd\x63\x65\xb8\x39\x00\x13\x2b\xe0\x66\xf3\xc4\xcd\xa8"
- "\x91\xe1\x66\x87\xdf\x2a\x37\x6e\x3f\x07\x80\x5b\xff\x13\x17\x2e"
- "\x6e\x4f\xf8\xdc\xff\xa8\x7b\xdc\x8c\x41\xea\xdb\xfd\x79\x6e\xdc"
- "\x8c\xa0\x6f\x46\xd0\x37\xa3\x97\xbe\x19\x65\xfa\x66\x04\x7d\x33"
- "\xca\xf4\xed\x58\x00\xb8\x0d\x39\x7c\xe1\xe2\xb6\xc8\xe7\xfe\x97"
- "\x3d\xe0\x16\xac\xbe\x35\xc9\x70\x03\x7d\x33\x82\xbe\x19\xbd\xf4"
- "\xad\x54\xa6\x6f\x46\xd0\xb7\x52\x99\xbe\x7d\x15\x00\x6e\x43\x3f"
- "\xbf\x70\x71\x5b\xec\x73\xee\xb0\x7b\xdc\x4a\x83\xd4\xb7\x07\xc6"
- "\xbb\x71\x2b\x05\x7d\x2b\x05\x7d\x2b\xf5\xd2\xb7\x52\x99\xbe\x95"
- "\x82\xbe\x95\xca\xf4\x6d\x77\x00\xb8\xdd\x9c\x7b\xe1\xe2\xf6\xa4"
- "\xcf\xf7\x9f\x7b\xc0\x2d\x48\x7d\x7b\x60\xbd\x0c\x37\xd0\xb7\x52"
- "\xd0\xb7\x52\x2f\x7d\xdb\x2e\xd3\xb7\x52\xd0\xb7\xed\x32\x7d\x5b"
- "\x11\x00\x6e\x0f\xdf\x79\xe1\xe2\x96\xe2\x73\xfc\x53\xc2\x4d\xc2"
- "\x0c\xf1\x63\xb8\xd1\x04\xe2\x80\x78\xf2\xb5\x39\x1c\x37\xc4\x8b"
- "\x61\x77\x32\x21\xcc\x20\x62\xe6\x10\x31\x43\xf9\x21\x6e\x18\x47"
- "\x32\xdc\x14\xca\x08\x8c\x21\x1d\x10\x4b\x4a\x71\xe4\xfd\x49\xd4"
- "\x5e\x97\xf4\xf7\x8e\x38\xd2\xe1\x1d\x47\xce\x97\xc7\x91\x15\x1e"
- "\x78\xe5\x9d\x02\xbc\x04\x11\xaf\x47\x7c\xc4\x91\xf3\x3e\xf2\x81"
- "\x57\x43\x8f\x78\x01\x36\xe1\xed\x27\x39\x5e\x9b\xc5\xf8\xbf\x30"
- "\xa5\x97\x78\xa5\x02\x5e\x18\xff\x7f\x45\x84\x2d\x33\x03\xc5\x2b"
- "\xad\xc7\xf8\xbf\x6b\xbc\x8c\x0d\x81\xe1\x75\x7f\x93\x1b\x2f\xa3"
- "\xd5\x01\x3e\x4d\xf2\x67\x6e\xbc\xb8\x3f\x73\x78\xfb\xb3\xf9\x72"
- "\x7f\xe6\x0f\x5e\x5e\xfe\xec\x82\xc2\x6b\x89\xcf\xf1\x7f\x27\xf4"
- "\xc5\x9d\x60\xe7\x70\xbc\x32\xb4\x19\xfa\xc9\x0e\xfa\xdd\x14\x1b"
- "\xf4\x93\x1d\x03\x63\xd7\xe9\x49\x54\xfb\x52\xe8\x27\x03\x76\x79"
- "\x7a\x32\x3e\x57\x4f\x94\xae\x27\xa0\xaf\x7c\x14\xfa\xca\x60\x9f"
- "\xda\x7e\x48\x0a\xab\x9d\x65\x25\x2e\xe8\x2b\xe3\x38\x18\xd4\x37"
- "\x8a\xfe\x00\x7d\xe5\x26\xb0\x7d\x4d\x9b\x79\x5f\xf9\x5b\xa9\xaf"
- "\xfc\x8e\x47\x5f\xf9\xb9\x05\x62\x5f\x59\x94\x7f\xa1\x5c\xf6\x7f"
- "\x7d\xd5\x47\x5f\xb9\xa6\xc7\xbe\x32\xf6\x91\xb7\x60\x7f\xf9\xc7"
- "\xa4\x61\x9b\x44\xdb\xb6\xf9\x78\x2f\xfb\xca\x3f\x42\x5f\x39\x87"
- "\xcb\x7e\x73\xc0\xb2\x5f\xea\x73\xfd\x07\xea\x06\xea\x4b\x87\x2f"
- "\x02\x39\x4b\x3e\xa8\x1d\x7c\x10\x8e\x67\xb4\xe5\x6d\x9b\x06\x7c"
- "\x65\xfa\xc1\x7c\xd2\xd2\x08\x15\xea\x06\xea\x09\xea\x06\xf3\x45"
- "\x60\x07\xc1\x17\xb5\x14\x2f\x20\xe3\x4a\x16\x90\xb1\x8e\x10\xcf"
- "\x3e\xf2\xfd\x89\x88\x87\xdb\xb6\xb9\xbc\x6d\xdb\x5c\xb9\x6d\x7b"
- "\xa7\xb3\x2f\xea\xc9\xb6\x2d\xf0\xa5\x2b\x35\x3d\xea\x0a\xea\x08"
- "\xf3\x47\xa0\x2f\x67\x42\x57\x36\xff\x27\x50\xbc\x9e\xf6\xb9\xfe"
- "\xc3\x4f\xbc\xf6\xfb\x81\x57\x03\x1d\x30\x29\x46\x86\x97\x47\xdf"
- "\xd8\x8d\x17\xef\x1b\xbb\xbc\xfb\xc6\x73\xe5\x7d\x63\x7f\xf0\xf2"
- "\xee\x1b\x5f\x48\x78\x2d\x57\xf5\x0e\x2f\xa3\x1f\xfa\x65\x04\xfd"
- "\x9a\xb4\xde\x8d\x97\x67\x9f\x58\x86\x97\x4c\xbf\x64\x7d\xe2\xb9"
- "\xf2\x3e\xb1\x3f\x78\x79\xf7\x89\x2f\x24\xbc\x32\x7c\xae\xff\xf0"
- "\x13\x2f\x3f\xf4\xcb\x88\xfa\xd5\x2c\xc3\xcb\xa3\x2f\xec\xc6\xab"
- "\x54\xa6\x5f\xb2\xd8\x61\xae\x3c\x76\xf0\x07\x2f\xef\xbe\xf0\x85"
- "\x84\x57\x66\x52\xef\xf0\x2a\xf5\x43\xbf\x4a\x41\xbf\x26\x8f\x77"
- "\xe3\xe5\xd9\x07\x96\xe1\x25\xd3\x2f\x59\x1f\x78\xae\xbc\x0f\xec"
- "\x0f\x5e\xde\x7d\xe0\x0b\x09\xaf\xec\x88\x5e\xe2\xe5\x87\x7e\x95"
- "\x82\x7e\x4d\x2e\x90\xe1\xe5\xd1\xf7\x75\xe3\xb5\x5d\xa6\x5f\xb2"
- "\xbe\xef\x5c\x79\xdf\xd7\x1f\xbc\xbc\xfb\xbe\x17\x12\x5e\x2b\x6b"
- "\xba\xeb\x4b\xc9\xfb\x50\x8e\x2c\x37\x5e\x88\x4d\x3b\xf4\x9d\xda"
- "\xd5\xdb\xa6\xf9\xee\x3f\x3d\xd0\xe2\xab\xbf\x8b\x7b\xd7\xdc\xdf"
- "\x8c\xef\x83\xf0\x98\x90\x7a\xc5\x84\x75\x49\xaf\x12\xcf\x3e\xef"
- "\xee\x4e\x7d\xa8\x76\x69\x8c\x62\xb6\xaf\x3e\xef\x7b\x41\xf7\xa1"
- "\x10\x27\xec\x47\x39\x52\x01\x27\x31\x8e\xdf\xd2\xcb\x31\x8a\xf6"
- "\x93\x3a\x61\x0b\xc4\xf1\x19\xb3\xa1\x0f\x35\x27\x50\x9c\x9e\x49"
- "\xf6\x85\x13\x8e\x13\x61\x9f\x17\xfb\x52\x38\xef\x58\xdf\xd4\x4c"
- "\x72\x97\x10\xa6\x6b\x21\xcd\x9e\x73\x8f\xeb\x8e\x40\x9f\x6a\x31"
- "\xe0\xd6\x9e\x40\xf2\x8f\x90\xf1\x79\x0b\x78\x9f\x4a\xea\x4f\xd5"
- "\xdb\xec\x6c\xee\xd1\xec\xb0\x90\xfb\x2c\xd4\x5e\x02\xf9\xb1\x1f"
- "\x55\x3b\x6b\x33\x41\x5d\xc9\xfa\x9a\x84\x20\x06\xd0\x07\x63\x78"
- "\xc8\xfb\x50\xc5\xf2\xf9\xc6\x79\xbe\xfa\x50\x3d\xcf\x37\x16\x1e"
- "\xe7\xfd\x27\x36\xdf\x78\x5e\xf4\xa1\x56\xf9\x9c\xff\x98\xfc\xca"
- "\xc8\x0e\xd9\x9b\x75\x0e\x02\x7c\xfa\x2e\xac\x85\x8f\xeb\x39\xf2"
- "\xb7\xc5\x63\x9f\x16\xfb\xb3\xe6\xf4\x1a\x92\xbb\x8c\x68\xda\x5a"
- "\x13\xc2\xa0\x8f\x1a\xe2\x00\x5b\xf7\xdc\x51\x2e\x7b\x7c\x47\xcc"
- "\xfa\x44\x12\x5b\x2b\x83\x7d\x59\xd4\x15\x36\xe7\x38\x87\x8c\x2d"
- "\x3c\x4c\xc6\x31\xfd\x00\xbd\x70\x18\xca\x88\x2b\x64\x5b\x1a\xea"
- "\xc9\x7d\x07\xa9\x1d\x31\x40\xfd\xd8\x77\x10\xb1\xa9\x20\x59\x5f"
- "\x71\x6c\x18\x2e\x82\xe7\x5c\x70\x67\xdd\xf8\xdc\x07\x3e\x55\xfe"
- "\xe1\xb3\xd8\x13\x9f\xa2\x60\xe7\x83\xa5\xf5\x91\x8b\x75\x42\x91"
- "\x38\x1f\xbc\xf9\xaf\x81\xe2\xb3\xba\xd3\xfb\xcf\x7e\xe2\xd3\x10"
- "\x24\x3e\x56\x36\xb7\xe8\x81\x8f\x51\x25\xe2\x63\xc3\xbe\x92\x1b"
- "\x9f\x9f\xfd\xc4\xc7\xab\x8f\x74\x41\xe1\xb3\xc6\xe7\xf8\x4f\xf7"
- "\xf8\x18\x83\xd4\x1f\x63\x32\x9b\x43\xf4\xc4\x47\xd4\x1f\x63\x1a"
- "\xf6\x8d\xdc\xf8\x1c\xf3\x13\x1f\xaf\x3e\xd1\x05\x85\xcf\x5a\x9f"
- "\xe3\xdf\x3d\xe0\x13\xa4\xfe\x18\xad\x6c\xae\xd0\x03\x9f\x52\x51"
- "\x7f\x8c\x36\xec\x0b\xb9\xf1\xf9\xca\x4f\x7c\xbc\xc7\x4f\x2f\x24"
- "\x7c\x9e\x5b\x18\x1c\x3e\xa5\x41\xea\x4f\x69\x32\x9b\x13\xf4\xc4"
- "\x47\xd4\x9f\xd2\x34\xec\xfb\xb8\xf1\xd9\xed\x27\x3e\x5e\x7d\x9e"
- "\x0b\x0a\x1f\x83\x3a\x48\x7c\x82\xd4\x9f\x52\x2b\x9b\xfb\xf3\xc0"
- "\x67\xbb\xa8\x3f\xa5\x36\xec\xeb\xb8\xf1\x59\xe1\x27\x3e\x5e\x7d"
- "\x9c\x0b\x0a\x9f\xfc\xf2\x9e\xe6\x8b\xa4\xd8\x59\x3e\x2f\xdb\x0e"
- "\xf1\x1b\xc6\xcf\x18\x3b\xd7\xdb\xaa\x88\x63\x31\xc7\x26\xf7\x14"
- "\xd1\xe4\x89\xd8\xb0\x39\xd9\x27\xf8\x9c\x2c\x8b\xdb\x56\x83\xe4"
- "\x57\x2a\x23\x30\x2e\x63\xf3\xae\x6c\x6e\x62\x2f\x5e\x5b\xd3\x2e"
- "\x8b\xdf\xb0\x8f\x0a\xb1\x37\xc1\x7e\x6a\xd6\xb7\x01\xc4\x6d\x73"
- "\x7c\xe1\xd2\xf3\xdc\x44\xa1\x6c\x1d\x9f\xd4\xf7\xec\x53\x5c\x02"
- "\x9e\x77\x2d\xf0\x79\xfe\x53\xf7\xb8\x18\x1b\x02\xc3\x05\xfc\xcd"
- "\xea\xfb\x9b\x38\x2e\x5f\x79\xe1\x52\xaa\x6a\x97\xf9\x1d\xff\x71"
- "\xf1\xf2\x37\x17\x14\x2e\xcf\x1f\xf4\xd9\xd7\x04\xbb\x84\x98\xe0"
- "\xfa\xee\x75\x73\x48\x54\xee\x61\x32\xbe\xfd\x87\x88\xc1\x53\xc0"
- "\xce\xb5\x3f\x11\xa1\xaa\x07\x1b\x97\x69\xa3\xdf\x85\xda\x06\xc6"
- "\x7e\xba\xdf\x4a\xea\x67\x59\x48\xdb\xd2\x04\x62\x38\x8a\x6b\xd5"
- "\xab\xc8\xda\x14\xec\xcb\xbf\x45\xf6\x1d\x3c\x41\xa6\x94\xd1\x76"
- "\x73\x4b\x15\x31\x2d\x7b\x8b\xd0\x27\x74\x83\x4b\x20\xcf\xa3\x20"
- "\xc3\xe3\xc2\x0b\xeb\x4f\x43\x7f\xf4\xba\x74\xa2\x99\xd4\x42\xed"
- "\xf5\x2d\x9f\x92\x2d\xf0\xac\xbd\xe9\x84\xa0\x7c\x11\x13\xc3\x02"
- "\xec\x7f\xee\xe6\x98\x4c\xe5\x98\x6c\x96\xf5\x3f\xb5\x70\xfd\x48"
- "\x32\xe0\xf1\x93\x17\x1e\x07\x9b\x09\xc8\x77\xe0\x14\x1b\xe0\x61"
- "\x93\xf0\x38\x46\x32\x9f\x44\x3c\x2c\x1d\xeb\x5d\xdb\x44\x3c\x0a"
- "\xd1\x7e\x25\x13\xcd\x26\xa9\xff\x79\x5c\x86\x87\xf4\x4e\x96\x1c"
- "\x0f\xa9\xef\xbf\x14\xf0\x58\xe2\xee\x7f\x9e\x86\xfe\xe7\x26\xe8"
- "\x7f\x66\x7d\x46\x84\x4d\x99\x81\xe2\xf1\xa2\x4f\xff\x2f\x61\x81"
- "\xbe\xa5\x3d\x74\x5b\x3c\xe2\x60\x4e\xaf\x24\x88\x09\xfa\x13\xe7"
- "\x0f\x11\xaa\x8c\x34\xd0\x1d\xcb\xc0\xd8\x36\x0a\x7d\x7e\xe8\xef"
- "\x9b\x67\x7c\x49\x70\xcc\x80\x63\xd0\xde\x6e\xb6\x56\x11\x94\xbd"
- "\x69\xd9\x97\x0c\x87\xe3\xc2\xfa\xf0\x99\x36\x22\x5c\x0b\x3c\x84"
- "\xfe\xbe\xe6\x51\x7c\x2f\x17\x6c\xdb\x96\x79\x64\xdc\xa4\x64\x6a"
- "\xc7\xbe\x29\xea\x10\xae\x3d\x41\xbb\x56\x9f\xfc\x11\xc1\x71\x9d"
- "\xf6\x90\x32\xb2\x37\x8d\xb0\x71\x1c\x94\x7b\xff\xa7\xdc\x38\xe1"
- "\x7a\x12\x86\xd5\x43\x7e\xac\x73\x95\xe3\x35\xc3\xe2\xd7\xfa\xe4"
- "\x36\x71\xbc\xa0\x50\x1a\x53\x0b\x76\xbc\x40\x1a\x53\xfb\x91\xaf"
- "\x27\xc9\x3a\x00\xfa\x13\x30\x5e\x2f\x45\xfa\x89\x57\x43\xe0\x78"
- "\xb5\x76\x81\xd7\x4b\xd5\x5d\xe0\x65\x75\xe3\x75\xff\x58\x37\x5e"
- "\x46\x95\x88\x97\x4d\x86\x97\xbd\x67\xbc\xba\x59\xdf\xfa\x8b\xc7"
- "\x6b\x83\xcf\xfe\x8f\x27\x5e\xc6\x20\xf4\xeb\xc7\x2e\xf0\xfa\x5b"
- "\x5a\x67\xbc\x8c\x32\xfd\xba\x3f\x4f\x86\x97\xa8\x5f\x46\x99\x7e"
- "\x19\xfd\xd0\xaf\x6e\xd6\xb5\xfe\xe2\xf1\xda\xe8\x73\xfd\x8f\x17"
- "\x5e\x41\xe8\xd7\xa1\x2e\xf0\xda\x14\xd5\x05\x5e\x72\xfd\x6a\x72"
- "\xe3\x55\x2a\xea\x97\x51\xa6\x5f\x46\x3f\xf4\xab\x9b\xf5\xac\xbf"
- "\x78\xbc\x36\x77\xbb\xfe\xc7\x8d\x57\x69\x10\xfa\xf5\x61\x17\x78"
- "\x6d\xde\xdf\x19\xaf\x52\x99\x7e\x3d\x30\x5e\x86\x97\xa8\x5f\xa5"
- "\x32\xfd\x2a\xf5\x43\xbf\xba\x59\xc7\xfa\x8b\xc7\x6b\x8b\xcf\xf8"
- "\xcf\x0b\xaf\x20\xf4\x2b\xab\x0b\xbc\x0a\x57\x75\x81\x97\x4c\xbf"
- "\x1e\x58\xef\xc6\x6b\xbb\xa8\x5f\xa5\x32\xfd\x2a\xf5\x43\xbf\xba"
- "\x59\xbf\xfa\x8b\xc7\xab\xc8\xe7\xf8\xb7\x1c\xaf\xb6\x7c\x29\x3e"
- "\x2c\xf3\xc4\x0b\xe2\xf5\xb0\x26\xde\xb7\x92\xf0\xf2\x1d\x1b\x16"
- "\x47\x77\x60\xf5\xad\x3b\x36\x64\x38\x89\xf3\x14\x88\x0f\xc6\x88"
- "\x18\x13\xb6\x19\x38\x46\x38\x07\xd8\x6d\x5c\xe8\xcf\xfb\x4f\x41"
- "\xe0\x24\xf5\xab\xfa\x1c\xa7\x2f\x82\xc1\xa9\xc4\xe7\xfb\x4f\x9e"
- "\x38\x49\x7e\xcb\x5f\x9c\xba\xf2\x59\x25\x8d\x9d\x71\x32\x5a\xdd"
- "\x38\x71\x3f\x85\xbe\x0b\x7d\x95\x27\x4e\xdd\xf8\x2b\x7f\xde\xbf"
- "\xf8\xc5\xe3\xb4\xd5\xa7\xfd\x2b\x10\x5c\x95\xf0\xa9\x82\x8f\x09"
- "\x3e\x35\x4e\x81\xdc\x5d\x24\xb8\xd8\xde\x9d\xb8\xcf\x5f\x51\x4e"
- "\xa7\xeb\x03\xe8\x80\xd1\x19\x98\x07\x64\xcb\xde\x0f\x90\xca\xa0"
- "\xb9\x04\x65\x67\x0a\x51\xcc\x22\x45\x3c\xef\x40\xa9\xac\x90\x95"
- "\x24\x46\x2a\x0b\xda\x94\x0d\xb2\x36\x85\xad\x8c\x19\x00\xf9\x6b"
- "\x68\xee\xbc\x69\x90\x57\xc5\xca\x5c\xa9\x64\x7d\x0d\x29\xaf\x33"
- "\x47\x81\xef\x87\x9b\xc2\x14\x90\x97\x97\x39\x48\xcc\xa7\x75\xe5"
- "\x10\x2d\xab\xa7\x20\xe0\xf3\xbc\xeb\x39\x58\xcc\x17\x25\xaf\x63"
- "\xc8\xca\x18\x56\x9e\x98\x67\x08\x1d\x20\x1c\x14\xdb\xa2\x93\xe7"
- "\x73\xde\x49\xb0\x4c\x29\x9f\x5a\x2c\x6b\x8c\x47\x9e\xbf\x13\x82"
- "\xe7\xd1\xb2\xfa\xa5\x0b\x44\xac\x5f\x08\xe6\x75\x0e\x9e\xab\x73"
- "\x2a\x94\xd1\x2e\x81\x44\x7b\xdc\xb3\x9a\xb0\xfc\x62\xde\x50\x96"
- "\x77\xc0\x14\x0b\xe4\x1d\x2b\xca\x5c\x29\x97\xb9\x98\x2f\x4c\x92"
- "\xa3\xfc\x9a\x33\x47\xc0\xb2\xf0\xba\x86\x0e\x98\xdc\x04\x6d\x18"
- "\x2f\xe5\x93\x9e\x67\x4e\x22\x84\xe5\x15\xc8\xf5\x22\x26\x43\xa1"
- "\x1d\x31\x52\x3e\xdc\x4f\x41\xca\x9b\xe5\x24\x97\x95\xb8\x65\x33"
- "\xcc\x99\x3b\xaf\xd9\xb9\x52\x39\xd1\xbb\xcc\xb0\x95\x0a\x0b\xe6"
- "\xab\x6b\x66\x65\x23\x7e\x85\x90\xff\x57\xa2\x8c\x62\x39\x26\x9a"
- "\x0e\x4c\x9c\x82\x03\xaf\x99\x8a\x79\x5d\xc3\xc5\x7c\x93\x3a\xe7"
- "\x53\xca\xf3\x5d\xc2\xe5\x98\x1a\x0e\xb2\x89\xef\x9c\x57\x25\xcf"
- "\x7b\x29\xcf\x9b\x54\x0d\x79\xa7\x75\xce\xab\x91\xe7\xfd\x35\xcf"
- "\xbb\x20\x03\xf2\x26\x74\x51\xd7\x61\xb2\xbc\x11\x3c\xef\xc2\xb1"
- "\x90\x77\x46\xe7\xbc\x5a\x79\xde\xcb\x78\xde\x34\xac\xc3\xac\xce"
- "\x79\x63\xe4\x79\x87\xf3\xbc\x8b\x5a\x20\x6f\x62\xe7\xbc\xd9\xf2"
- "\xbc\x97\xf3\xbc\x8b\x8d\x90\x37\xc9\x3b\x6f\x09\xc7\x76\x94\x88"
- "\x6d\x24\xcf\xfb\xe4\x0c\xc8\xbb\xb0\x8b\xb6\xf5\x63\xe5\xf2\xbc"
- "\x23\x78\xde\xc7\x63\x20\x6f\x72\x17\x58\xc8\xf3\x8e\xe4\x79\x73"
- "\x34\x90\x37\xad\x0b\x2c\xe4\x79\xaf\xe0\x79\x97\x5a\x21\x6f\x7a"
- "\x17\x58\xb8\xf3\x0e\x7e\x7a\x2b\xe4\xc9\x80\x76\x36\x74\x21\x5b"
- "\x79\x99\x57\xf2\x32\x97\xc7\x43\xfe\xec\x2e\x64\x2b\xcf\x3b\x8a"
- "\xe7\x5d\x41\x20\xef\xaa\x2e\x64\x2b\xcf\xfb\x1b\x9e\x37\xb3\x12"
- "\xf2\xae\xe9\x9c\x17\xf4\x8d\xcb\xf7\x06\x51\xbe\x51\x3c\x7f\xf6"
- "\x2c\xc8\x9f\xd7\x85\x7c\xb1\x3c\x49\x67\xaf\xe2\x79\x97\xa4\x41"
- "\xde\x82\x2e\xe4\x2b\xcf\xfb\x5b\x9e\x37\xdf\x06\x79\xd7\x77\x21"
- "\x5f\x79\xde\xdf\xf1\xbc\xcf\x22\x27\x37\x76\x21\x5f\x79\x5e\x1d"
- "\xcf\xbb\x7a\x3f\xe4\x2d\xec\xa2\xbe\xa3\x64\x79\x47\xf3\xbc\x6b"
- "\xb0\xbe\x5b\xbb\xc0\x43\x9e\xf7\x6a\x9e\xb7\x20\x0f\xf2\x1a\xbb"
- "\xc0\x43\x9e\xf7\xf7\x3c\x6f\x2e\xea\x71\x59\x17\x78\x74\xe4\x05"
- "\xbf\x30\xc6\x39\xf8\xb9\x9d\x25\x98\x5f\xa1\x64\x73\x1c\x54\x60"
- "\xfb\xfb\xb3\xbc\xc0\x13\x93\x68\xef\xae\xe1\x65\x1a\xa6\x41\xbe"
- "\x4a\xc2\xf7\xf3\xab\xac\xb3\x33\x7b\x04\xfe\xc5\x71\x63\x89\xdb"
- "\x76\x5f\xcb\xf3\x3e\x53\x05\x79\x77\xca\x6d\x28\x15\x94\xf2\x7c"
- "\xd7\xf1\x7c\x45\x28\xab\x2a\xcf\x7c\x2a\x77\xbe\xc1\x2f\xee\x84"
- "\xeb\xbb\x8a\xbd\xec\x31\xd4\x53\x5e\xd6\xf5\xbc\xac\x97\x12\x21"
- "\xaf\xc9\x33\x9f\xe3\x06\x59\xbe\x1b\x78\xbe\xbf\xa1\x6c\xaa\x3d"
- "\xf3\x69\xe5\xf9\x6e\xe4\xf9\x4a\xd0\x66\xd5\x78\xe6\x8b\x91\xe7"
- "\x1b\xeb\xcc\xdd\x58\xcd\xf2\xae\x54\xd6\x7a\xcb\x0f\x64\x7d\x83"
- "\xcc\xa7\xdd\xe4\xcc\xdd\x9c\x26\xe6\x6d\x90\x64\xc8\xe4\xcc\x39"
- "\x2f\x88\x9c\xbf\xd9\x99\x5b\x18\x25\xe6\xdb\x2f\xf7\x03\x32\x5f"
- "\xfb\x07\x3a\xf8\x85\x28\xd1\x8f\x36\xb2\xe7\xae\x54\x1e\xec\x2a"
- "\xde\x48\xbe\x9a\x0c\x39\x2a\xbc\x72\x90\xfb\x1e\x69\x4f\xfd\x57"
- "\x59\x9b\x5c\x85\xfa\xe8\x38\x1b\x75\xc8\xd3\xd6\x09\xb4\xe1\x3a"
- "\x1b\x51\xe2\xfe\x49\x34\xa4\x3c\xc1\x02\xe9\xd6\x11\xfa\xf8\xd6"
- "\xdc\x57\x9a\x2d\x8a\xd8\x6a\xdc\xcb\x03\xbe\xdb\x2c\xc4\xb0\x11"
- "\xbf\xaf\xcb\x81\x78\x50\x88\x51\xe0\x1e\xcc\x25\xf0\x3d\x1f\x3e"
- "\x6c\xdf\xe3\x64\x22\xd0\xd5\x24\xc6\xb4\xc4\x41\x8e\xa4\x13\xc1"
- "\x95\x9f\x62\xd5\xa6\xe0\x7e\x22\xaf\x4e\xa0\x4b\x93\xc6\x43\x5d"
- "\x34\xf0\xdc\xc4\xc3\xf0\x9b\xd5\x05\xda\x0f\xbe\x51\x6d\x4a\xc1"
- "\x3d\x86\x5e\x7d\xca\x1a\x52\xa1\xa1\xcf\x3c\xfc\x7d\x72\x26\xb9"
- "\xe2\xa8\xf0\x6a\xda\x49\xb0\x0d\x27\x97\x26\xdd\x8e\x65\xb8\x42"
- "\x52\xd5\x90\x67\x27\xee\x45\x42\x37\x56\x58\xf9\x3e\x25\xaf\x7e"
- "\xc2\xea\x9f\x43\x1b\x68\xa4\x5e\xeb\x6a\x5b\x95\x8d\xe7\x37\x98"
- "\x32\x8f\x92\xc3\xb2\x6b\xd6\xcb\x2a\xd8\x1e\x26\xd8\x2e\x68\xa3"
- "\xb6\x35\xf7\x55\x93\x45\xa1\xb3\xf2\x3d\x4a\x5e\xf5\x79\x3e\x28"
- "\xc4\xd6\x61\xd4\x90\xaa\x83\xfc\x56\x8b\xf0\x72\x24\x97\xc3\xab"
- "\x0e\x8b\x42\xab\xe6\xdf\x5f\x53\x59\x14\xbf\x89\x15\xbf\x87\x5b"
- "\x14\x77\x44\x89\xdf\xb5\xd2\xde\x2b\x5d\xef\x05\x93\xe2\x80\x76"
- "\x87\xbb\xb6\x24\xa8\x30\x1e\xc5\x7d\xd9\x68\x48\x8a\x43\x3b\x12"
- "\xcf\xeb\x78\xad\x0a\x9e\x19\xce\xf7\xd3\x7c\x6d\x05\xfc\x0d\x13"
- "\xff\x5a\xc5\xbf\x14\xf3\x30\x6c\x23\xf5\x5b\x69\xde\xf6\x66\x6c"
- "\x73\xa6\x93\xba\xa8\x3a\x75\x1c\x5d\xf3\xcd\x1a\x73\x7a\x33\xe1"
- "\xfb\x50\xbf\xf6\x0a\xdf\x17\x07\xe4\x0a\xb2\xa7\x83\xbe\x59\xc3"
- "\x9e\x65\xa8\xd0\xc8\xeb\x85\x1b\xb8\x44\x5f\x7f\xc3\x8d\x63\x6f"
- "\xba\xf9\x0f\xe3\x6e\x99\x3d\xe7\xb1\xc4\xb9\xf3\x1e\x4f\x9a\xbf"
- "\xe0\x89\x85\x8b\xf4\x8b\x93\x9f\x4c\x49\x4d\x7b\x6a\xc9\xd2\xf4"
- "\xa7\x97\x61\xbe\x8e\x36\x6c\x99\xa8\xb0\x09\x04\x9e\x73\x27\x3c"
- "\xa7\x9c\x9d\x7b\x87\x69\x1c\x97\x72\xb5\x52\xdb\xb5\x4c\xcd\x11"
- "\x84\xed\xf7\xdd\x22\x94\xcf\xc7\x3d\xa2\x81\x03\x0a\x73\xe1\xbd"
- "\x26\x3c\x63\xa0\x49\x28\x9f\x51\x6f\xbd\xd7\x84\x67\x5c\x7c\x1c"
- "\xd1\x4c\xa2\x46\xe1\x39\x04\xe5\xb1\x78\xbd\xe4\xb7\x84\x54\xc3"
- "\xbd\x5d\x95\x39\x4a\x43\x22\x5e\xbc\x94\x5a\xd7\x5f\x4a\x5b\xb0"
- "\xfc\xf5\x1b\x68\xb3\x75\x79\x12\xc9\x87\xdf\xc0\x1d\xcd\x11\xa1"
- "\x62\xc4\xc7\x10\xf1\x42\x2c\x1b\x59\xbc\x81\x36\xad\xba\x94\x36"
- "\x3d\xb3\x81\xb6\x94\x5c\x4a\x2d\x51\xeb\x89\xba\x35\xb7\xbc\xc1"
- "\x22\x94\xeb\x18\xb7\xe1\xba\x6b\xf0\x6b\x35\xeb\xe0\xda\x75\x0e"
- "\xd2\xaf\x04\x7e\x43\x9a\xed\x63\x2d\xaf\xf7\x1b\x27\xec\xfd\xa1"
- "\x7d\x3b\x69\xfb\x42\x45\x3e\x3c\x87\xe3\x54\x31\xa1\x1a\xbc\x30"
- "\x3c\xcf\x6a\xb6\x1f\x06\x9e\x55\xe0\xde\x7c\xf8\xbc\x30\xf3\xc6"
- "\x16\x82\xe5\xbd\x9e\x62\xef\x9f\x3a\x9c\x3a\x20\xaf\xd6\xb5\x7c"
- "\xa1\x02\x9e\xe7\x80\xb2\x6d\xf2\xf6\xe8\xe6\x2d\x4a\xd3\xea\x9f"
- "\x5a\xb8\x70\xf4\x60\xa2\x63\x7f\x3d\xce\xc7\x48\x83\xf2\xc8\x8b"
- "\x1b\x68\x35\xb4\xd3\x04\xed\xad\xa9\x83\xa8\x1b\x38\x43\xa0\x4d"
- "\x05\x50\xee\x4b\x90\xbe\x0b\xbe\xef\x82\xba\xd7\xf0\x33\x15\x3e"
- "\xd8\x43\x73\x2b\x26\x41\x3d\xd1\xee\xe3\xfe\x4a\xe4\xe4\xd2\x69"
- "\x0a\x68\xf7\x7a\xc8\x57\xa3\x1d\x4e\xae\x3a\x22\xbc\x3e\x02\xea"
- "\x61\x84\xef\x98\x9f\xe9\x0c\xe4\xaf\xe6\xed\xfa\xe0\x4d\xfc\x0d"
- "\xb2\x32\x15\x5d\x4a\xf3\x5a\x73\x2b\xec\xb8\x9f\x1d\xdb\xe7\x1b"
- "\x7e\x83\x5c\x6a\x20\x6f\xc1\xc9\xac\x69\x0a\xe8\x7f\x29\x4a\x3a"
- "\xca\xac\xa8\xc1\x3a\x61\x3d\xb0\x0f\xb8\x0f\xa2\x2f\x57\x7b\x02"
- "\xb9\xc6\x4e\x14\xfb\x9a\x08\x29\xdc\x40\xb7\xc2\xa7\x10\x3e\x1b"
- "\x3f\x85\x6b\x9f\xc0\xa7\x06\xd2\x6b\xe1\xef\xa7\xf0\xf7\x93\x26"
- "\x36\x67\x17\x81\xf5\x4e\xcd\xa0\xcd\xd7\x6d\x24\xbf\xc1\xf2\x81"
- "\x5b\x7f\x39\x2c\x7c\x10\x81\x75\xc7\xbd\x23\xe9\xe0\xd7\xf3\x3c"
- "\xf7\xd8\x03\x37\x05\xd7\xe1\x6f\x38\xff\x2b\xff\x54\xce\x80\x4f"
- "\x86\xf8\xbd\x9a\x08\x6f\xb4\x88\xdf\x1b\xe1\xd3\xd4\xf3\xc7\xbb"
- "\x3c\x5f\x9f\x37\xe3\xfd\xcf\xeb\xd7\x27\xcf\xbf\x7c\x6f\xab\x88"
- "\xf0\xce\x2c\xf8\x6c\xf4\x4c\x7f\x27\x99\xa7\xbd\x37\x9e\xff\x7e"
- "\x2f\x56\xfc\x0b\x3d\xef\xf7\x41\x4e\xef\x43\xf9\xef\x57\xf2\xb4"
- "\xf7\x77\xc1\x5f\x25\x7c\x34\x5e\xcf\xc7\x32\x8d\x88\x67\x7b\x0e"
- "\xd8\x6d\xc0\xd2\x22\xbc\x3e\x03\x31\x5a\xc7\xb9\xa5\x70\x51\x96"
- "\x96\x00\xdc\x2a\x74\xf3\xa7\x72\xb2\x27\x7f\x2a\xc7\x79\xf1\xa7"
- "\x00\xed\x11\xe8\x8b\xb1\x84\xf3\x65\xd7\xc9\xe5\x89\xf0\xbb\x72"
- "\x3c\x94\xb3\x4b\x3b\x93\x95\xc1\x62\x8f\x75\x47\x09\x09\x49\x22"
- "\x4a\xb4\x2f\x2d\x42\xa5\x01\x39\x8b\xcf\x16\x9f\xcb\xeb\x02\xf5"
- "\x83\xb4\xad\x58\xbf\xc5\x50\x2e\xfc\xc6\x72\xb7\x9a\xc9\x09\xa9"
- "\x6e\xec\x9e\xdc\x05\xc0\x47\xb1\xbe\x58\x26\xde\x47\xdd\xed\x4a"
- "\xc0\x7b\xf8\xb3\xdf\x9c\x00\xe9\xd8\xbf\x24\x59\x3f\x91\x7e\xb8"
- "\xbe\x19\x39\x89\x7f\xcd\x8e\x68\xd0\xa5\x58\xe2\x6a\x4d\x20\xd7"
- "\x45\x10\xdc\xdb\x6b\xd0\x61\xe1\xcd\xa8\x6b\x33\x48\x34\x96\x87"
- "\x76\x1d\xda\xd1\x5c\x82\xba\xc8\xcb\xba\x85\xef\x93\xf5\x7a\xc2"
- "\xa7\xc9\x84\x3d\xa7\x18\xeb\x03\xd7\x65\xcf\x5d\x8f\x7d\xc9\x75"
- "\xcb\x78\x5b\xe1\x59\x46\xb8\xbf\x12\xdb\x8e\xf2\x84\xeb\x55\x50"
- "\x4e\x36\x5e\x63\xfb\x6f\xf3\xf6\x18\x71\x8f\x56\x94\x07\xe6\xc7"
- "\x33\x5b\xf8\x9e\x7d\x15\x6c\x4f\x34\x28\xbf\x12\xf1\xa0\xf0\x0c"
- "\x2c\x23\xcb\x41\x1d\x14\xec\xd1\xb6\x65\x76\xf0\xff\x6f\x9d\xf6"
- "\xc4\xe7\xcd\x46\x39\x3e\x70\x5f\x25\xdc\x5f\x4d\xa1\x8d\x68\x4f"
- "\xe0\x99\x61\xe8\xf3\x21\xad\xc0\x95\x0b\x65\x2c\xb1\xb3\xf1\x14"
- "\x28\xe7\x7b\xa8\x4b\x01\x96\x03\xf5\xa9\xe6\x65\xbd\x15\xb5\x27"
- "\xc3\x13\x6b\xb1\x3c\x23\x62\xce\xf4\x79\x19\x6b\x13\xd8\xae\xb7"
- "\xde\x2d\xe6\xd7\xaa\x20\x4f\x15\x6d\x8f\x25\xb8\xe7\x29\xf7\x25"
- "\xec\xda\xce\xac\xd3\x0c\xdf\x6a\x6e\xd7\xde\xfa\x22\x75\x05\x6d"
- "\x76\xd7\xfb\xad\x02\x69\xdf\x58\xb1\xde\x3b\xf1\x79\x74\xe9\x0c"
- "\xe6\x5b\xf1\x19\x78\xbf\x58\xde\x42\x2c\x4f\x92\xd5\xb5\x50\x0f"
- "\x2e\xaf\x37\xb7\x42\xba\x11\xb9\xc8\xe4\x06\x76\xf4\x64\x16\x72"
- "\xf1\xad\xf5\x70\xff\xae\x7c\xfc\xbd\x94\xfd\xd6\x31\x1b\xdb\x71"
- "\xfd\xcd\x83\x78\xdd\x0c\xfd\xf4\x75\x4f\x00\x97\x5c\x84\xfc\x26"
- "\x9c\x44\xdb\x72\x58\xdb\xca\x6d\xcb\x27\x2a\x3e\x76\x10\x82\xf5"
- "\x04\x19\x55\xb5\xe6\xbe\x3d\x1e\x6c\x3f\xdb\xf3\x1f\xec\xf5\x4e"
- "\xba\x2d\x81\x60\x9d\xc1\x9e\x89\xf5\x7b\xbb\x42\xc4\x7e\x27\xb6"
- "\x11\xe5\x79\x2d\xb7\x7d\x70\xed\x9d\xa9\x58\x77\x77\xbb\xdf\x5e"
- "\x23\x97\x31\x6b\x37\xe0\x80\x78\x21\x2e\xb2\x32\x91\xfb\x05\x50"
- "\x56\x39\xff\xcd\xb9\x81\xb2\x2e\xb8\x94\xd6\x62\x7e\x77\xde\x9d"
- "\x7b\xf0\x5a\x26\x3c\xfb\xba\x64\xf0\xe9\xa0\x17\xb8\xf7\x2f\x94"
- "\x5b\x8e\xe7\xf1\x40\x19\x55\x28\x53\xa8\xcb\x25\xc8\x47\xf8\x5d"
- "\x2b\xde\x17\x0e\xfe\x7c\x0c\x7c\xc6\xbb\xf5\xff\x9d\xfe\x9e\xfc"
- "\xda\xe9\xad\xff\x88\x77\x81\x2b\x2b\x96\x30\x3e\xa4\x10\xed\x71"
- "\x61\xe7\xcb\xa2\xef\x10\xb1\xde\xf9\xf3\xc7\xa0\x2f\xb2\x32\x32"
- "\xbc\xb0\xae\x62\x7c\x5c\x3a\x09\xcf\x33\x56\xc0\xbd\x55\x62\x39"
- "\xac\xcd\x8c\x4f\x39\x8c\x03\xb5\x74\x29\xb4\xb3\x83\x07\x6f\x37"
- "\x8a\x38\xd7\x7a\xc9\x44\xb2\x5d\x51\x78\x46\x03\xda\xa4\xd6\x1c"
- "\x72\x7b\x6b\xbb\xdb\x2e\x21\xf6\x2e\x86\xfd\xce\xec\x12\xee\x6f"
- "\x45\xbb\xb5\x93\x5f\xbf\xd4\x83\xc3\x58\x97\x77\x18\x7f\xb1\x2e"
- "\x59\x33\xb0\x2e\x55\xac\x1e\x59\x5a\x72\x5c\x78\x67\x0c\x3e\x1f"
- "\xee\xad\x12\xf5\x55\x2c\xeb\x6d\xe4\xcb\xae\x67\xc0\x56\x61\x9d"
- "\xe0\xd9\x11\xcc\xfe\xdd\xc3\xe4\x6a\x10\xeb\x5e\x63\xcf\xc1\x7b"
- "\x2b\xb3\x4f\x0b\xec\xde\x1a\x8b\xf0\x86\xcd\xce\xf7\x71\x1e\x0c"
- "\xf7\x97\x69\xe7\x60\xfe\x77\x5b\xd0\x46\x6b\xff\xca\xbe\x1f\xd0"
- "\xfe\x19\xb8\x7a\x94\x28\xa1\x3c\x15\x72\x54\xe2\x45\x8b\xf0\xee"
- "\x5e\x88\x31\x10\xaf\x72\x88\x91\xca\x50\xde\xc8\x65\x88\x91\xc6"
- "\xb6\xe6\xbe\x63\x93\x78\x0b\xcf\x29\x44\xd9\x73\x7c\xfe\x71\x0b"
- "\xf0\xb8\xca\xcd\xad\x7f\xdc\x22\xca\xb1\x0c\xe4\xa8\x82\xe7\xbd"
- "\x2b\xb6\xab\x0c\xf2\x43\x2c\xf6\xee\x2b\x62\xdd\x37\x8a\xf9\x1f"
- "\x92\x70\x10\x75\xb5\x36\x1f\xed\x2f\xc3\xe0\x1f\x2d\xe2\xbd\x46"
- "\xf1\x59\xc7\xa4\xbc\x18\x23\xf2\xfd\xd9\xff\x71\x0c\xed\xe0\x75"
- "\x80\x3d\xb3\x7d\xec\xac\x2a\x9e\x86\xba\xc3\x9f\xf1\xee\x4b\x8c"
- "\x87\x10\xf7\xb8\x79\xf4\x8f\x6a\x2f\xfb\x84\xb6\xb8\xa0\x1e\xca"
- "\x40\x7b\x8a\x5c\x42\x9b\x8a\x7d\x09\x28\xaf\x50\xd4\x1f\xb1\xce"
- "\xff\xbc\xde\x93\x2b\xef\xae\x04\xae\x5c\xe3\x2e\xfb\x9f\xda\xae"
- "\xfc\x5c\x09\xb7\x81\x85\xfc\x9e\x7f\x3e\x29\xb6\xad\x9c\xb7\x4d"
- "\xfc\x8d\x72\xcb\x64\x72\xbb\x49\x26\x47\x90\x5b\xd5\xcb\x62\xfe"
- "\x2a\xb4\xe5\x6e\x7d\xfd\xe7\x57\x92\x2e\x77\xb6\x17\x55\xcf\xa3"
- "\x3e\xc8\xea\x55\xe5\x65\x2f\xaa\xba\xb6\x17\xff\x5c\x23\xb6\x77"
- "\xab\x97\x6e\x18\xc5\x78\xb7\x54\xc2\xa1\xde\xd6\x26\xee\x45\x5e"
- "\x51\x8a\xf6\x13\x9f\x2d\xf7\x41\xc5\x5c\xae\xa2\x2e\x57\xad\xe8"
- "\x8c\x43\xd5\x24\xb9\x3e\x23\xd6\x68\x13\xb0\x0c\xc4\x94\xc5\x95"
- "\x90\xc6\x71\xad\x8a\x42\xdb\x20\xb7\xd1\x90\x77\xbd\x8b\xa2\xbe"
- "\x54\xc5\x7b\xea\xe2\x3f\x77\x89\xba\x28\x3e\xfb\xdd\x2b\x01\xa3"
- "\x68\xd9\x73\xab\xbd\x9e\x8b\xd8\x54\xa3\x1c\x44\x4c\x43\x24\x9f"
- "\x86\xf9\xe1\xde\x74\xb8\xc7\xee\xe5\x1f\x0b\xb0\x7e\xf0\xac\x64"
- "\x66\xb3\x36\x30\x5b\x91\xde\xca\xeb\xe3\x28\x11\xfd\x04\xa4\x45"
- "\x8b\x69\x35\xa2\x2f\x91\x78\xb3\xc8\xb3\x4e\xef\x26\x74\x1d\x1f"
- "\xfd\x33\x59\x8a\x8f\x58\x59\xcc\x16\xbd\x3b\x43\x6c\x1f\xa6\x5d"
- "\xc3\xd3\xfe\x19\x85\x69\xf9\x5c\x0e\xeb\x29\xf3\x57\xff\xa8\x11"
- "\xfd\x15\xea\x97\x00\xbf\xc7\xa1\x8e\xe1\x6f\x28\xa3\x12\xcb\x37"
- "\x67\xb7\x61\x1f\x62\xa3\x45\x78\x67\x3f\xda\x03\xb4\x17\xda\x79"
- "\xdc\x6e\x68\xa7\xb0\xbf\x4e\xb4\x3b\x18\x87\xe0\x75\xc8\x57\x8d"
- "\xb6\xe8\x88\xf0\xde\x50\x3c\xd7\x88\xfe\xa0\x82\x72\xdf\xb5\xf1"
- "\x7b\xdf\xbb\x8a\xc5\x0a\x3f\xc4\xf6\x93\xd2\xa4\xfb\xc0\x6e\x1d"
- "\xc0\xfb\xf0\x7e\xc9\x7e\xa1\xed\x72\xa0\x6d\x62\xcf\x7b\x6f\xbe"
- "\xc8\x71\xd6\x6f\x90\xe2\xa2\x76\x41\x96\x17\xf7\x83\x66\x36\xed"
- "\xbd\x9d\xdc\x9e\xbd\x57\x8a\xf7\x32\xfc\xc0\x56\x66\x9e\xa6\x5f"
- "\x97\xa4\x10\x65\xf1\x09\xb4\x8b\x15\x46\x5e\xcf\xf7\x09\x6f\xc7"
- "\x7b\x9f\xb0\x76\x70\x9b\x5a\xc0\xeb\x52\x61\x2c\x6e\x63\xd7\xbe"
- "\xc5\xb6\xe0\xb5\x75\xb2\x6b\xb4\x5d\x07\xd7\xde\x57\xb0\x7a\x79"
- "\xdd\xe7\x6a\x4f\xea\x94\x1f\xcf\xe9\x02\x1b\xaa\x2a\xde\x20\xd9"
- "\xde\xf7\xb3\x79\x3d\xdf\xbf\x4d\xb2\xbb\x20\x97\x5a\xb4\xbd\xec"
- "\xda\x3c\x31\xcf\x14\xf1\x2f\xb3\xef\xef\x2f\xe2\x72\x8d\x10\x44"
- "\x79\xef\x17\xdb\xc1\xce\xfe\xa6\x3f\x24\x80\x6c\xdf\x4f\x94\x64"
- "\x2b\xff\x8e\xfa\x03\xcf\xd7\xe0\x6f\xc6\xfb\x0c\xd6\x87\x2d\xc4"
- "\x3c\x58\x27\xee\x23\xde\x9b\xe1\x1d\x53\x1f\x11\x76\x9f\x46\xbf"
- "\xc4\x63\xd5\xdd\x5f\x88\xe3\x33\xc4\x94\xf2\x77\xf0\x0b\xbb\xa2"
- "\x24\x1b\x43\x5b\x63\xa1\xcf\x7f\x18\xf2\xec\xba\x0a\xd3\x70\x0f"
- "\x61\x79\x1e\xb4\x4f\x6f\xb4\x59\xc4\x32\x77\x11\xc9\x6e\xa0\x2d"
- "\xa9\xb7\x1d\x16\x63\xba\x5d\x95\xc5\xa2\x2d\x39\x2e\xec\x7a\xd3"
- "\x33\x0e\xdb\xf5\xa6\xa7\xcd\xd8\xbd\xd7\xdb\x66\x40\xdc\xbc\xaa"
- "\x35\x77\xd7\x2a\x8f\x38\x00\xd2\xba\xb7\x1d\xbb\x12\x50\x47\xf1"
- "\x5c\x06\x66\x9f\xd8\x98\xd3\xee\xcb\xa4\x3a\xa3\xdd\x3c\xb9\x5c"
- "\x1a\xbf\xd8\xfd\x0e\xc6\x6a\x5e\xcf\xb3\x79\xd8\x4e\x7c\x9e\x54"
- "\x9e\x92\xe0\xbe\xfe\x20\x07\x1c\x73\xd9\x55\x2d\xda\xf9\xad\x1e"
- "\xb6\x52\xf4\x61\x68\x27\x3d\x7d\x55\x45\xa9\xa7\xaf\xda\xfd\x72"
- "\x67\x1b\xb9\x3b\xd9\x7f\x5f\xb5\x3b\x16\xed\x96\x64\x23\x3d\x6d"
- "\xc1\xee\xb4\x62\x8f\x58\x76\x97\x43\x8a\x65\xdd\x76\x74\x57\x1e"
- "\xda\x28\x78\x7e\x95\xf8\xec\x16\x8b\xf0\x9a\x55\x7a\x36\x5c\x8f"
- "\xaa\xd7\x02\x37\x73\x2b\x12\x80\x53\x0d\x62\x0c\xc8\x74\xb3\x8d"
- "\xed\xad\xfe\x7e\x04\xf0\x6f\x30\xf2\xcc\xa4\x3f\x41\x9a\xdc\xbe"
- "\xa2\xfa\xe4\x62\x49\xbe\x1f\xac\x90\xc7\x85\x45\x1b\xe8\x9a\xd6"
- "\xdc\x0f\xa6\xc9\xdb\x68\x80\xb4\x75\xe2\x18\x02\x93\x2d\x2b\xeb"
- "\x03\x5d\xc9\x06\xcf\xb6\xf1\x76\x7c\x30\x03\xdb\x81\x7d\x22\x78"
- "\x7e\x24\xc6\x3d\x10\xf3\xc1\xf7\x77\xb6\x96\x74\x70\xfe\x0d\xdb"
- "\xe9\x1c\x79\x7c\x55\xe1\x40\x5b\x29\xf6\x3d\x6b\x20\xde\x29\x90"
- "\x8f\xc5\x4c\xbe\x2b\x5e\x9b\x9c\x32\x5f\x9f\x36\xef\x06\xed\x7c"
- "\xfd\xfc\xb4\xf9\xb3\x17\xce\x5f\x36\x3b\x6d\xfe\x62\xfd\x98\x45"
- "\xb3\x1f\x9f\xff\x98\x76\xe9\xec\x54\x6d\x74\xfa\x55\xe9\x83\x89"
- "\x3b\xeb\xad\xda\xd9\xa9\xa9\x4f\x2d\x9a\x9b\xa8\xd5\xcf\x7f\xec"
- "\x9a\x94\xb9\xa9\x73\xd3\xb4\xb3\x53\x16\x3f\xa5\x4f\xd4\x5e\x95"
- "\x78\xed\x55\xd1\x37\x27\x0e\x96\x8f\xa1\x8d\xd2\x90\x16\xd7\xa9"
- "\xe6\xe6\x75\xa7\x88\x2a\x4c\x91\x9c\x12\x96\x3e\x5f\xcf\xc7\xed"
- "\x3e\xdc\x7b\xdd\x7a\x92\x8c\xe7\x44\xe2\x19\x63\x34\xf7\x83\x46"
- "\xf8\xab\xc4\x7c\xd0\x4e\x2d\x7c\x57\x41\xdd\x23\x5b\x73\x3f\x5c"
- "\x63\x11\x3e\x66\x7b\x61\x83\x2c\xb4\xd0\xb6\x48\x7a\xaa\xa6\x19"
- "\x62\xb6\x64\x5c\x47\x5c\x72\x8a\x84\x17\x2c\x21\x4a\xf8\xa8\xe1"
- "\xa3\xc1\x73\x24\xe1\x1e\x68\xb3\x49\xdc\x9f\xd9\x34\xc3\x3a\xe8"
- "\xeb\x70\xba\xe6\x6b\x71\x5f\x6b\xd3\x74\x69\x3c\x38\xee\x59\x12"
- "\x87\xfc\x3c\x2c\x98\xd8\xfc\xdd\x33\xc0\x65\x1c\x4b\x3d\xf9\xc1"
- "\x9d\x31\x10\x0f\x1e\x34\x0d\x67\xd7\xa6\xdb\x04\xa2\x86\x7a\x29"
- "\x3f\xce\x88\x26\x2f\xc2\xb3\x52\x23\x28\x6d\xcd\x35\x69\xa5\xf1"
- "\x34\x68\x83\x06\xda\xd2\xc8\xdb\xf1\x61\x3f\xd6\x8e\x0d\x34\x6a"
- "\xfd\x30\xa8\xdf\x0b\x58\x1f\xd3\x24\xa9\x0d\x50\xef\x46\x8b\xf0"
- "\x61\x25\xd4\x53\x83\xf5\xea\x6a\xac\x0f\xc7\xbb\xa0\x9e\x2f\xb9"
- "\x96\x80\xdc\x46\xf2\x73\x25\xd6\x15\x73\xfd\x83\xf6\xd4\x96\xc0"
- "\xf7\xfc\x13\x44\x6d\xc0\x33\xfe\x72\xae\xa0\x75\x36\x07\x31\x27"
- "\x35\x92\xb0\xa7\xa9\x95\xfe\xa3\xb9\x59\x6c\x93\x09\x6d\xc3\xdb"
- "\x0b\x1a\x95\xd8\x26\xf0\x15\xea\x92\x13\x3e\xc7\x16\x95\x2f\x5e"
- "\x4a\x6d\x74\x8b\x3c\xe6\xda\x33\x1a\x65\x82\xf1\xd6\xc9\x1c\x3c"
- "\x47\x6e\x0f\x70\xcd\x94\x24\xc6\xc6\x36\xda\x3e\x43\x16\x4b\x99"
- "\x90\x67\x36\x1f\x65\xab\xa4\xb2\xf1\x3c\x41\xbc\x87\xe3\xbf\xe7"
- "\x25\xb8\xc7\x2a\x2b\x3f\xd9\xbb\x7c\x2c\x13\xbe\x5b\xa5\xe7\xf0"
- "\x7e\xf8\x1e\x8c\x09\xac\xc0\x65\xab\x8f\xe7\x45\xbd\xb0\x81\xee"
- "\x37\x43\xfa\xba\xd3\x44\x09\x79\xc1\xdf\xb3\xf2\x1b\x40\xee\x63"
- "\xb1\xfc\x67\x2e\x25\x64\x15\xe4\x39\x99\x6b\x4a\xb2\xb1\xb3\xfd"
- "\xf6\x80\xfe\x57\xcc\xf2\x1e\xcb\x16\xf9\x7c\xab\x17\x9f\x63\x5e"
- "\xc0\x98\x70\x3d\x94\x0f\x1c\x5a\xf7\x33\xf8\x61\xf8\x7d\xed\x7a"
- "\xa2\xc3\xe7\xc0\xf7\x06\x1c\x0f\x69\xcd\xfd\x28\x46\x7a\x1e\x05"
- "\xfe\xe7\xbb\xf8\x18\x8c\xc8\xad\x31\x38\x7e\x9d\x95\x4e\xe9\xc7"
- "\x60\xdf\xb1\x8e\xc8\x31\xb8\x27\x4d\xe2\x14\x70\x7d\x3f\xe3\x55"
- "\x38\xd1\xd1\xdc\x3d\xf6\x92\x61\x90\x0f\x78\x55\x0c\x7c\x42\x5e"
- "\x41\xde\xad\x12\xa7\x80\x6b\x0d\x98\x0f\xea\x30\xb8\x72\x59\x8c"
- "\x12\x6d\x64\x93\xf0\xf1\x25\xc8\x31\xfa\xb7\x07\x1a\xe9\xaf\x1f"
- "\x16\xf7\x70\xff\xf8\x12\xb3\x9d\x63\xe0\x96\xfb\x47\xcd\x32\xb9"
- "\x37\x00\x8f\x07\xa3\x9c\xf9\x58\xf5\xc7\x97\x40\xdd\x1a\x58\x2c"
- "\xbe\x02\x30\x60\xbe\xea\xa3\xfd\x78\xbf\x28\xc3\x5a\xb7\x0c\x3f"
- "\x8e\xee\x4a\x86\x5e\xb2\x53\xf2\xb3\x05\x3f\x1e\x8f\xba\x02\xf7"
- "\x24\x4a\xe7\x05\x76\x85\x25\x3c\x43\xa9\x5c\x4f\x54\xf8\x8c\xea"
- "\x70\x96\x7f\xbd\xf4\x8c\x75\x20\x6b\x6b\x56\x52\xb7\x7c\xae\xde"
- "\x4a\x08\x8e\x89\xe3\xfd\x51\xe1\x28\xdf\x8f\xf7\xbb\xef\xa7\x36"
- "\xef\xfb\xaf\x7a\xcc\xa3\xae\xec\x03\x75\x6d\x7e\x71\x18\xf0\x88"
- "\xd5\xb7\x3a\xbc\xbb\xfa\x46\x69\xb9\x9f\x34\x8d\x42\x7e\x57\x4f"
- "\x36\x6f\x24\x04\xd3\xc4\xdf\xe3\x4f\x82\xef\xf1\x1e\xdf\xf7\x3d"
- "\xdf\x50\x6d\xf0\x9c\x6f\xa8\xce\xf0\x35\xdf\xe0\xf5\xdc\x4f\xf0"
- "\xb9\xae\x92\x69\x0a\xd9\xb3\x77\xba\xba\x78\xb6\x74\xff\xb5\x5b"
- "\xe5\xfd\x99\xbd\x97\x61\x1d\xea\xf1\xfc\xf5\xcb\xa7\x29\x28\x94"
- "\x53\xcd\x7c\xf8\xde\x08\x1e\xbf\x60\x5c\x54\x6d\xc7\x3c\xde\xed"
- "\xe8\xf8\xa7\x0a\xc7\xf1\x15\x72\x9a\xfd\xe8\x7f\x0f\xd1\xe0\xdf"
- "\x2b\x12\xa4\xcb\x82\x47\x66\x42\xbb\xf8\xa1\x26\x44\xcb\xf2\x53"
- "\xf8\xc7\x93\xc4\xdf\x56\xf6\x43\xd9\x91\xbf\xe3\x7a\x2f\xfe\x0d"
- "\xe2\xf5\x65\xe5\xd9\x89\x42\x7c\x5e\xba\x2c\xc7\xc4\x6e\xee\xa6"
- "\x44\xba\xa5\xab\x7f\xd8\xe3\xcd\x9e\xd6\x1f\xca\xdb\xc8\x32\x53"
- "\xea\x10\xcb\x97\x7e\x53\xf9\x6f\x4c\xf1\xfc\x0d\xff\xfa\xcd\x90"
- "\x3d\xe0\x8a\x7e\x89\x6c\xb9\xd2\x6f\x6a\x3b\x92\x84\xad\x1a\xf9"
- "\x23\x35\x24\xbb\x3f\xfb\x12\x86\xff\xb1\x43\x79\x3a\xb8\xae\xad"
- "\xea\xc8\xf0\x2b\xdb\x4a\x59\xf6\x7d\xbc\xfa\xa3\x54\xdd\xb4\x31"
- "\xd0\x7f\x23\x65\xdf\xaf\xe0\x7f\xae\xac\xe9\xc3\xf2\xbb\xff\xa7"
- "\x6d\x18\x24\x7d\x75\xd3\x63\xd4\xa4\xae\xb2\xba\xe5\x3f\xaa\x5c"
- "\x4a\x92\x33\xd4\x7d\xfd\xb7\x3a\xcf\xdf\xbf\xb3\x7b\xfe\xbe\x3a"
- "\xb6\x2f\xaa\x6e\xc2\xff\x64\x59\x86\x12\x32\x3a\xbc\x23\x31\xcc"
- "\x4b\x65\xc2\x0a\xbc\x54\xc8\xfd\x4f\xac\x4d\x3f\xa8\x4f\xa1\x2c"
- "\x59\xd9\x75\xee\x33\xf3\x6f\xf8\x4a\x51\x21\xae\xb0\x6a\x3a\x5d"
- "\xbc\xc3\x2b\x0d\x7f\x0f\xd0\x8a\x69\xd7\xef\xe9\x94\x9f\xa5\x69"
- "\x65\xbf\x15\x31\xf0\x9f\xad\x60\x59\x13\x3a\xe7\xbd\xf8\xef\xe2"
- "\x3f\x3f\xfe\x29\x50\x3f\x2e\xfe\x3b\x43\xff\x28\xf7\xe2\x60\x89"
- "\xd8\x1f\xfc\x1f\xed\x30\x94\x54\xbc\x40\xc5\x04\x2a\x7e\xe9\x13"
- "\x3f\x7e\xf1\xdf\xc5\x7f\x17\xff\x5d\xfc\x77\xf1\xdf\xc5\x7f\x17"
- "\xff\x5d\x00\xff\x14\xf2\x8e\x35\xf6\x4f\x07\x8a\x7f\xe5\xfd\x1f"
- "\x85\xf8\x91\xa7\x09\xbd\xb9\x8f\x8a\xff\x48\x76\x8c\x49\xbb\x75"
- "\x96\x45\x53\x10\xdf\x10\x5d\x99\x6c\x55\xad\x89\xad\xd1\x95\x25"
- "\x35\x47\x6c\x4c\x68\x1c\x57\x95\x6e\x57\xae\x9a\x58\x1d\x65\x4c"
- "\x6c\x0a\x5f\x3f\x6d\xff\xd8\x9d\x69\x36\x75\xde\xa4\xda\x31\xe5"
- "\x0b\x5b\x22\x0b\x67\x1c\x1c\xbf\x2b\xc3\x21\xe4\xdc\xf9\xd1\xa8"
- "\xbf\xcf\x39\x3c\xec\x85\x07\x3f\xbf\xe1\xad\x94\x13\x83\x73\xef"
- "\xff\xf4\xea\x57\x17\x1c\x1d\xbe\xf9\xaf\x5f\xde\xfa\xde\xb2\xb6"
- "\x01\xab\xef\xf9\x7f\xbf\xdd\x3e\xef\xc8\xa5\x1b\xfe\xfc\xaf\x9b"
- "\xff\xb1\xe4\x54\x68\xfe\x94\xfa\x6b\x5f\xd7\x1f\x1f\x59\x3c\xf3"
- "\x3f\xb7\x7f\x90\xe9\x52\xac\x9c\xb0\xe7\xca\x97\x67\x7f\x3d\xf4"
- "\xf9\xa9\x9f\x5d\xff\xe6\x93\x3f\x0d\x5a\x7b\xdf\x27\xa3\x5f\x99"
- "\xff\xfd\x65\x9b\xa6\x7f\x71\xcb\xbb\x4f\x9f\xee\xff\xec\xdd\x7b"
- "\xaf\x2a\x9d\xfb\xed\x25\x2f\x3d\x74\xe0\xa6\x77\x9e\xfa\x39\xc4"
- "\x30\xb9\xee\x9a\x8a\x45\xc7\x46\x14\x3d\xf2\xd5\x6d\xbb\x57\x38"
- "\xfb\x3d\x73\xd7\xc7\xbf\xd9\xf6\xd8\x37\xbf\x7a\xf1\x4f\xff\x73"
- "\xe3\xdb\xa9\x27\x87\x3c\xf7\xc0\xbe\xdf\xbf\xf6\xc4\x0f\x97\x6f"
- "\x79\xf8\xdf\x7f\x7c\x7f\x79\xfb\xc0\xff\xba\xf7\xbf\x7f\xb7\xe3"
- "\xf1\xef\x7e\xfd\xb7\xbf\xfc\xef\x1f\xfe\xb9\xb4\x35\x6c\x5d\x9c"
- "\xf9\xba\x37\x16\xff\x78\x45\xc9\xa3\x87\xee\xf8\x30\x8b\xf6\x46"
- "\x7e\x44\x68\x7a\xec\x6c\xe3\xc6\xff\xac\x5e\x13\xcc\xfd\x54\x50"
- "\x88\xb8\xf3\x84\xec\x9b\x88\x42\x45\x06\x28\x83\xe8\x29\x04\xdb"
- "\x5e\x1f\xff\xb4\xf2\xfb\xfd\xf9\x87\xef\x89\xe1\xda\x8d\x1b\xe1"
- "\x73\x39\x4b\x71\xf7\xfe\x47\xf9\x59\xc6\x99\xff\xa7\x80\xb6\xf7"
- "\x83\x9a\xf5\x27\x03\x40\x5a\x2a\x32\x88\x0c\x26\x43\x88\x9a\x84"
- "\x90\x50\x12\x46\x34\x64\x28\x19\x46\x7e\x45\xc2\xc9\x25\xe4\x52"
- "\xf2\x6b\x12\x41\x2e\x23\xc3\xa1\x35\x91\x64\x04\x19\x49\xae\x00"
- "\xa1\x5c\xd9\x75\x5b\xb2\x49\x4c\x04\xfc\x07\xfe\x1f\x4f\x62\xd8"
- "\xef\x59\x17\xd3\xcf\x6a\xba\x49\x4c\x6f\x10\xd3\x2d\x17\xd3\xcf"
- "\x6a\xba\xf6\x1c\xff\xbd\xf2\x9c\xfe\x55\x40\xc8\xc0\xa3\x06\x8f"
- "\xd8\xa1\xe3\x9f\x77\xaa\x42\xfc\xd7\xf1\x9b\xf4\x70\x7f\xa7\xf2"
- "\x3c\xef\xf7\xfe\x17\x03\x9f\xb1\xfc\x6b\x16\x21\x7c\x9e\x81\xca"
- "\xff\x39\x36\x28\x3e\x52\x0e\xcd\xc6\x29\x13\x15\x09\x67\xff\xed"
- "\xf9\x5f\x69\xd4\xff\x1f\x10\x03\xcb\xf9\xa5\x36\x40\x6c\x0f\xc4"
- "\xde\x40\x1c\x0a\x33\x9b\x81\x91\xe9\x0e\x03\x68\x4f\x35\x23\x73"
- "\x05\x03\x68\x5f\x1b\x23\xab\x0b\x03\x23\xfb\x11\x06\x46\xb6\x16"
- "\x06\x46\x4e\x16\x84\xe3\x85\x14\xe0\xae\x64\x14\x80\x8a\x03\x85"
- "\x18\x45\x56\x20\x59\x46\x6a\x7d\xb6\xc3\x35\xc4\x43\xc1\x50\xcf"
- "\x44\xcf\xd4\x40\x41\x57\x57\xc1\xc8\xc0\xd0\x40\xdf\xc0\x44\xdf"
- "\xd0\x4c\xc1\xd0\xd8\xca\xd8\xc0\xca\xc0\x5c\x21\xb7\xb2\x28\xd3"
- "\xd0\x20\x3d\x55\x21\x2d\xb3\x28\xb7\x3c\xb1\x28\x95\x08\x3f\x93"
- "\x01\x40\xbe\x93\xfd\x0b\x71\x26\x72\x0c\x31\x02\x6b\x10\xa6\xb3"
- "\x19\x0c\x4c\x0f\x25\x18\x10\x32\x1a\x50\x8c\x0a\x18\xbb\x2e\x30"
- "\x30\xb6\x5f\x61\x60\x6c\x76\x60\x60\xac\xf5\x61\x60\x2c\xfd\xc1"
- "\xc0\xb8\x02\x28\xb6\x74\x0f\x03\xe3\x42\x01\x06\xc6\xd9\x2c\x0c"
- "\x8c\x93\x67\x60\x8a\x6d\x5c\x03\x11\x3b\xab\xc3\xc0\x78\x22\x81"
- "\x81\xf1\x90\x05\x03\xe3\xae\x09\x10\xb1\x1b\x40\x35\x97\x0d\x68"
- "\xe3\x69\xb2\x01\xa9\xf1\xcc\x08\x00\x88\x5b\xe8\x95"
+ "\xbf\xff\x7f\xff\xfc\x09\x34\xe6\xbc\xc9\x4c\x1f\x57\x13\x75\xb9"
+ "\x2d\xc3\x7c\xa4\x15\xbd\xba\x51\x84\xf0\x2a\x01\xe3\xfc\x30\xbe"
+ "\xf2\xef\x25\xa4\x99\xaa\xc9\x72\x63\x1a\xa5\x89\x57\x6d\xa6\x09"
+ "\x5b\x88\x36\x0d\x11\x1d\x1b\x5f\x11\xfe\xc6\x52\xa2\xc3\xdb\xf0"
+ "\xfc\x8a\x68\xdf\x38\x44\x04\x00\xa7\xc0\x47\xf9\x9b\x18\xce\x6a"
+ "\x3c\xaf\x46\x3a\xd2\x4a\x7c\x54\xb0\x86\xd3\xaa\x50\xce\x48\xf7"
+ "\xae\xb9\x48\x8d\xf6\x10\x55\x31\x1c\x7b\x98\x26\x0e\x97\x78\x6c"
+ "\x45\xde\x54\xce\xbb\x6a\x08\xea\x4d\x27\x72\xbf\x22\x82\x11\x38"
+ "\x58\xb8\x1e\xae\x5b\xcf\x7f\x34\xa6\x3e\x3f\xd2\xda\x8c\xfa\xfa"
+ "\x81\x91\xc6\xe5\xb9\x0d\xf6\x6f\x51\xe2\x49\xba\xfa\x3a\x86\xc9"
+ "\xb8\x09\x37\x59\xbc\xdd\x21\x3a\x49\xc9\x99\x9d\x6e\x4a\x3c\x0c"
+ "\x6a\x6c\x78\x45\xa6\x27\x7a\x03\x21\xb2\x97\x51\x02\xde\x4d\xc5"
+ "\xd5\x84\x72\x03\x99\x3e\x33\x6b\x29\x83\xeb\x06\x5c\xb3\x30\x79"
+ "\x12\xea\x07\x13\x31\x8d\x02\x26\xba\x39\xe0\xa6\x84\x2e\x77\x32"
+ "\xda\x6f\xc9\x94\xed\x47\xbd\x28\x6b\x3e\x49\x29\xff\x30\x21\x3f"
+ "\xea\xf4\xdb\x97\x33\x0e\x29\x9f\x08\xb7\xc7\x64\xc0\xd1\xdc\x9e"
+ "\xab\xeb\x5e\x22\xea\x74\x9b\x26\x07\x4c\x56\xa1\xc3\x39\x60\xc0"
+ "\xe1\x7c\xa8\x2b\x95\xeb\xea\x74\x9b\x5f\x8a\xc8\xe3\x33\xf2\x00"
+ "\x6f\xff\xe8\x00\x25\x32\xce\x27\x28\x25\x9b\xeb\xd3\xdb\x62\xe6"
+ "\x3a\xbc\x4b\x42\xe4\x45\xdf\xa3\xee\x74\xb4\xd5\x7e\x38\x48\x04"
+ "\x98\xd7\xd4\x97\x11\x31\x7c\xe0\x6f\x57\x30\x53\xc6\x18\x30\x19"
+ "\x46\x6f\x5b\xdd\x9e\xc1\xf5\x12\x47\x6e\xab\x85\xf4\xbc\x05\x91"
+ "\x38\x32\x5c\xb4\xe5\x7a\x6e\x4b\x23\x38\x4a\xcf\xb3\xa6\x97\x1e"
+ "\xbd\xed\xbf\x3a\x27\x06\xb6\x4d\xc1\x4e\x00\xec\x04\x8f\x5e\xae"
+ "\xb7\xfd\xbe\x98\xfc\x2a\x6f\x5a\x72\xc0\x24\x74\x3a\xa4\xb4\xf7"
+ "\xe5\x4d\xde\x14\x99\x17\xf8\x98\x14\x6d\xc9\xe4\xa3\x94\x56\xb4"
+ "\x33\x11\x79\xa6\xa0\x1f\xed\xfa\xfb\xeb\xf4\xf7\x36\xbc\xbb\x5b"
+ "\xc1\xbb\x3a\x3b\x02\x5e\x1a\xc3\x8b\xe4\x2d\x25\x51\x66\xfc\x92"
+ "\x60\x20\x5f\x85\xdf\x00\x8b\xc1\x6f\x8b\x6d\x42\x73\x7d\x03\x6d"
+ "\x5a\xbb\x1d\xb4\x10\xe4\x75\x06\xc9\x3e\x94\x5c\x27\xe8\xea\xdd"
+ "\x80\x4f\x1b\x96\x93\xc5\x55\x2c\x82\x5e\x67\x07\xb5\xf8\x3b\xc8"
+ "\xe5\x87\x6c\x84\x2e\x50\xd9\x05\xf0\x62\xe8\x0c\x95\x3d\x4b\xb6"
+ "\xc6\xd2\x2f\x28\x1e\x2f\x6b\x26\x41\xae\x61\x5c\xb6\x8d\x5a\x6a"
+ "\xdb\xc8\x55\x1b\x5d\xd6\x75\x03\xd9\x9a\xf1\x8c\x3e\xb7\x32\x1e"
+ "\x2c\x6f\xa1\x94\xed\xf6\xd2\xd7\xc8\xec\x1a\x4e\xa6\xe6\x42\x8f"
+ "\x8e\x4b\xaa\x93\x71\x59\x73\x9a\x2c\x6f\xcc\x03\x1f\x9e\x66\x7c"
+ "\xdf\xb6\xbf\xb3\x3c\x68\x3a\x6c\x9b\x42\x87\x6d\xc7\xa9\xd1\x36"
+ "\x8e\x1a\x9d\x13\x69\xc3\x69\x4a\x3d\x1c\x1c\x4b\x8d\xe6\x7b\xa9"
+ "\x31\x63\x22\x79\x3b\x70\x0f\xf9\x3d\x6c\x0b\x90\x7d\x09\xf3\x53"
+ "\xaa\x63\xd3\x53\x64\xf1\x29\x98\xa0\x5d\x6a\xc9\xa1\x12\x22\xa6"
+ "\x1d\x3f\xc7\x6b\xc7\xe2\x6f\x90\x0d\xf8\xb5\x03\x97\x1f\x02\x97"
+ "\xb7\x33\x6c\x94\x05\x9c\x07\x78\x6b\x42\x64\x2e\xa5\xe4\x7e\xe4"
+ "\x38\x5d\x03\xef\x41\x76\x3b\xea\xa0\x4f\x58\x7e\x3b\x57\xe4\x41"
+ "\x27\xa4\x42\xfe\x53\xd7\xe8\x32\xd0\xe1\xfa\x15\x99\x3b\x97\xe6"
+ "\x25\xd4\xbf\x22\xda\xba\xdc\x03\xc9\x78\x07\x59\x6c\xc3\xfb\xf6"
+ "\xd1\xe9\x94\xe6\x0d\xe5\xd0\xc1\xee\x76\x96\xc7\x8e\x41\x01\x4a"
+ "\x60\x78\x56\x27\x64\x67\x09\x25\x01\x9f\x3f\xd7\x23\xfd\x3b\xc8"
+ "\x87\xf2\x39\x3e\x7a\xb9\x83\xcb\x8b\xeb\x1f\x0d\x68\xd7\x3f\x7a"
+ "\x41\x7b\xf5\xd1\x4e\xf1\xea\xa3\xe7\xc3\xaf\x3e\xfa\x0f\xd7\x32"
+ "\xb2\x84\xaf\x7f\xd4\xdf\x52\x2c\xfb\x20\xad\xa5\x18\x7d\x10\x26"
+ "\xcb\xca\x33\x94\xf6\xf8\xb3\xe8\xfb\xd0\x67\xb4\x72\x3e\xd9\xb4"
+ "\xe4\xb7\x5a\xbd\xa1\x4f\xe9\xf1\x52\x12\xb8\x6f\x8f\xd7\xbe\xce"
+ "\x94\xb7\x0b\x0c\xd9\x42\xbd\xfb\x7d\xa6\x6d\x36\xae\xd7\x9f\xbc"
+ "\xb7\x00\xbf\x42\xfc\x1c\xf8\x15\x89\x94\xb7\x8b\x40\x2b\xd7\xa0"
+ "\x55\x09\x54\xd7\x4d\x34\x5a\xa3\x84\xd3\x34\xf0\x18\xf0\x4f\xeb"
+ "\x87\x6e\xc3\xb4\xb5\x9e\xea\x9b\xcb\xa9\xac\xab\xcb\x41\xac\x0b"
+ "\x59\xff\xb1\x3e\xec\x72\x0f\xb2\xa3\x9e\x3c\x29\xbf\xaf\x40\xc7"
+ "\xa4\x78\xaa\x91\xde\x1e\x58\xe1\x48\xf0\xaf\x70\x98\x3a\x53\x3c"
+ "\x1b\x91\x67\x22\xf2\x54\xeb\x34\x6c\x67\x58\x90\x2d\xff\xc0\x10"
+ "\x25\x02\x66\xf1\x7b\x17\x5b\xcd\x5b\x5e\x11\xc7\x91\xaf\xa8\x17"
+ "\x16\x60\x03\x0e\xe8\x3f\xa8\xdc\x48\x03\xad\xdb\xd6\x23\x1f\x97"
+ "\xf7\x06\x73\x78\x4c\xf1\x79\x8b\xda\xc9\x1a\xa2\x14\xd1\xa3\xea"
+ "\x43\x9e\x76\xd6\xe9\x03\x83\x74\x55\x97\x9b\x66\x30\x6c\x2e\xe7"
+ "\xed\x68\x27\x94\xdb\x28\x5c\x0e\x13\xd2\xa7\x75\x09\x47\xc2\x1a"
+ "\xa4\x1f\x46\x79\xbd\xee\x76\x03\x47\xae\x83\xfb\x5a\xe2\x09\x7e"
+ "\x38\x5c\x14\xa4\x81\x35\x94\x88\x72\x33\x19\x1e\xc3\x02\x1f\xf8"
+ "\xd0\xd6\x8d\x87\x8b\xfc\xa4\x89\x28\x98\x3e\x05\xcf\x9a\x1d\x05"
+ "\x0f\xe9\x02\xf0\x98\xff\x1a\x51\x66\xe0\x56\x09\xef\xc1\xf7\x34"
+ "\x86\x17\x24\xb3\x5d\xe2\xfb\x53\x86\xd1\xc5\xfa\x03\x30\x3d\x4b"
+ "\xee\xa1\x0e\xb2\x6e\xf5\xbb\x1c\x89\x2d\x18\x37\xb9\xfc\x3b\x65"
+ "\xed\x49\xa2\x33\x2f\x91\x79\x8e\xdf\x7b\x43\xe7\x39\xcf\x2a\xd1"
+ "\xe9\x48\x1c\xd8\x01\x5d\x84\x3c\x28\xef\x64\x3c\x23\xfb\xf2\xc1"
+ "\x49\x3f\x1d\x47\x3f\x9d\x38\x79\xe2\x38\x9a\x3a\x7e\xc2\x38\xca"
+ "\xfa\xe1\xa8\xac\x31\xdf\xfb\xc1\xf7\xe4\xcd\xf7\x7e\x90\xfd\x3d"
+ "\x9a\xf1\xb3\x07\xc7\xd1\x8c\x69\xe3\x68\x26\x7e\x33\x66\x4e\x7a"
+ "\x70\xe2\xa4\x99\xe3\x28\xef\xde\xc9\x78\x9a\x30\xee\xf6\xac\xfb"
+ "\x46\xcd\x98\x30\x79\x12\x3d\x30\xeb\x8e\xac\x3b\xee\xa0\xf1\x93"
+ "\xa6\xdc\x9e\x95\xa5\x5f\x6f\xcf\xe2\x2c\x8f\x64\x4f\x9a\x39\x6a"
+ "\xc6\xa2\x85\x25\x0b\x47\x4d\x9b\x3c\x81\x53\xa0\xdd\x22\x78\x28"
+ "\x33\x7c\x51\x63\x5a\x07\xc4\xb9\x5c\xd2\xa0\x3b\xea\xc0\x03\xf8"
+ "\x75\x78\xca\x4e\x40\x07\x5c\xf3\x5c\x1d\xf7\x9d\x1c\x03\xac\x07"
+ "\x20\xf7\xe6\x2e\x77\x5a\x29\x68\x78\x94\x69\x68\xbf\x91\xf5\xc4"
+ "\xf5\xef\xe3\xdd\x21\x7d\xac\x49\xc2\xfb\xda\xe8\xf7\xd7\x42\x07"
+ "\x5b\xff\x4f\x8b\x9d\xc8\x8b\x1f\xe8\x1e\x80\x2e\x04\x7d\xfd\xd4"
+ "\xe9\xca\x4b\x02\x7f\x27\xa0\x8e\x36\xc8\xe6\x51\x94\x6d\x8d\x90"
+ "\xf9\x36\xf4\xcf\x51\x1e\x57\xce\x52\xda\xbb\x2d\x25\x39\xc4\xfd"
+ "\xe4\x2d\xd1\x61\x5c\xe8\x85\x91\x22\x61\xa0\xef\x01\xe7\x98\x82"
+ "\x73\x8d\x3d\x42\x3f\xf8\x18\xce\x06\xbc\xd3\x61\x5d\x68\x81\x9e"
+ "\x80\x1e\xbf\x55\x73\x65\x92\x48\xd9\x9e\xa9\xf5\x64\xca\xb1\x12"
+ "\xe5\xf2\x22\xf8\x3a\xd0\xe8\x44\xbe\x37\x72\x13\xc0\x07\x09\x18"
+ "\x7f\xd1\x96\xb4\x42\xf0\x77\x20\xbc\x76\xef\xb3\xe2\x5c\x1e\xdb"
+ "\x11\x57\x9d\xa4\xc1\x7f\x46\xfb\x9a\xb4\xb5\x7b\x8b\x45\x97\x4c"
+ "\x63\xba\xed\x17\xfc\x9c\x82\x7c\x3d\xbd\x69\xef\x73\x1a\xf8\x20"
+ "\x91\xe5\x55\x08\x99\x8e\x31\x73\xf0\x32\xe8\xb4\x56\xe4\x2d\xe6"
+ "\xbc\xa3\x43\x34\x00\xba\xc6\x66\x77\x25\xd0\x09\x1a\x4c\x5a\xca"
+ "\xde\x45\x11\xf5\x01\xce\x60\x1e\xa4\x98\x1f\xcd\x5d\xe7\x00\xa7"
+ "\x53\xa6\xc3\x8e\x19\xfc\x18\xe0\x2f\x66\x5d\xa9\xf4\xf7\xf5\xff"
+ "\xce\xf9\xf4\xb1\xb9\xef\x19\xb2\xae\xe0\x5c\xff\xef\x87\x41\x4b"
+ "\xb6\x17\xd8\xfe\xeb\x72\x0f\x9e\xe5\xa3\x81\x7e\x35\x36\x5e\xdf"
+ "\xca\x79\x35\xe0\x28\x52\x93\xb8\x2d\x25\x9e\xe5\x1d\x74\xb2\x98"
+ "\xc7\xda\xc1\x69\x9a\xcb\x41\xd1\x38\x5d\xd3\xc4\xf8\xb3\xfe\x00"
+ "\x2d\x3e\x05\x1f\x24\x03\xde\xb6\x68\x3e\x18\xec\x01\x9c\x67\x81"
+ "\x5f\x2b\xda\xf4\xac\x8f\xae\x39\xa2\x75\x3a\x50\x2f\x99\x20\x57"
+ "\xd0\xe7\x7d\x30\xf4\xf2\x6d\xd1\xe5\xaf\xa9\xe0\x72\xc8\x9f\xd4"
+ "\xd5\x29\xf3\xaf\x63\x9a\xeb\x7c\x07\xbe\xbc\x36\x3d\x86\x2f\xb7"
+ "\x00\x97\xff\x88\x78\x3f\x26\xe6\xfd\x2a\xbc\xff\x4f\xfd\x3d\xe4"
+ "\xfe\xda\x59\x31\x7c\x5b\x8c\xf7\xa7\x80\x6f\x00\x72\x0d\xdb\xe2"
+ "\x9a\x5c\xf0\x98\x3f\x22\xff\x9a\x98\xfc\x5b\x91\xff\xbf\x98\x6f"
+ "\x78\xcc\xe1\xfc\xf5\xba\xec\x20\xbf\x05\xf9\xf7\xc4\xd4\x3f\x07"
+ "\xf9\x03\x11\xf8\x1d\x8b\x7e\x9f\x5e\x8b\xf7\x5f\x32\xaf\xc3\x26"
+ "\x4a\x42\x9e\x01\xac\x4b\x58\x8f\x1d\x2e\xe2\xfe\x4a\x37\xc7\xe4"
+ "\xcf\x40\xbe\x54\x9d\x46\x26\x9d\x46\xb9\xdc\x8f\xa8\xe3\xb8\xc2"
+ "\x21\x3d\x3b\xa6\x4c\x1e\xca\xa4\x83\x8e\xcf\x1a\x7c\x19\xa7\x4c"
+ "\x51\x4c\x99\x75\xdc\x8f\x42\xd5\x63\xee\xea\xe9\x2b\xa3\xeb\xc8"
+ "\x48\x18\xdc\xb6\xab\x01\x63\x77\x34\x8c\x21\xed\xa8\x77\xd8\x7a"
+ "\xa5\x77\xae\x06\x0f\xdd\x81\xb4\x7f\x07\xcc\xe7\x58\x06\x20\xab"
+ "\x01\xaf\x3f\x48\xc2\x95\x9b\xaa\x78\xf7\xba\x6b\x06\x85\x88\xef"
+ "\x47\xf1\x3d\xc3\x16\x5d\x53\x74\x99\xbc\xee\x1a\x5c\x91\x9e\xce"
+ "\xf6\x5b\x02\xeb\x60\xd1\xf5\x13\x4d\xc1\xbc\xee\x4e\x61\x22\x13"
+ "\x9e\xc3\x7a\x1d\x7f\xc6\x73\x02\xf0\x5f\x84\x31\x87\xc4\x52\xe4"
+ "\x5b\x4e\x13\x90\x7e\x48\xca\xaa\xca\x27\x9f\x55\x1d\xb9\xcc\xdf"
+ "\x63\xf0\xfc\xbe\x5e\xfe\x5d\x86\x87\xfb\xdb\xf5\xfb\x84\x30\xc3"
+ "\x3a\x67\xc8\xe0\x90\x37\x65\x39\xc8\xa1\x84\x8f\xf2\x62\xa9\x7c"
+ "\xc7\x30\x5f\xc6\x75\x32\xae\xab\x70\x7d\x00\xd7\xc7\x5c\x5f\x92"
+ "\xcd\x15\x96\xf2\xc8\xcf\x93\x71\x7d\x10\xd7\x3b\x71\x9d\x89\xeb"
+ "\x70\x5c\xef\x41\x1b\xc2\x2c\x17\x18\x47\x79\x8e\x15\xc0\xb8\xaa"
+ "\x78\x8b\xe7\x00\x5d\xb9\x4c\x83\x49\xc8\xd3\x2e\xe5\x55\xe9\x17"
+ "\x8b\xea\xc7\xeb\x3a\x64\x5a\x8a\x4c\x1b\xa0\xf8\x41\xa5\x85\x0d"
+ "\x3d\x74\xae\x2f\x4d\xd7\x4d\xba\x2c\xea\x69\x0a\xfe\x0c\xc0\xf7"
+ "\x30\xae\x42\xc1\x4a\x52\x7d\xae\xc3\x57\xe5\xcc\x71\xea\x4c\x88"
+ "\xac\x13\xd7\x4d\x2e\xa7\x10\xb8\x96\x73\x1f\xf9\x68\xc8\x6e\x21"
+ "\xf9\x1e\x63\xac\x82\x37\x5b\xcf\x37\x86\x69\x2c\xcb\xcb\xf4\xf4"
+ "\xa3\x11\xbc\x34\xb8\xcb\x3d\x24\x14\x23\x47\x59\xe0\xa5\xdb\x98"
+ "\x67\x98\xee\xdc\xb6\x41\xc5\x72\x1c\x97\x6d\x91\xf0\xcf\x29\x9e"
+ "\xac\xd3\xe7\xad\x4a\x7e\xaf\x9f\x18\xa3\x5f\x24\xcf\xc6\xc8\x7b"
+ "\x07\xd3\x3c\xb1\x94\xe5\xe0\x7a\xcc\xff\xde\x19\x26\x6d\xc6\xb5"
+ "\x7b\x97\xf0\xfb\x00\xfa\x98\xeb\x4d\x2c\xe6\x76\x5c\xbf\xc9\x78"
+ "\x2f\xdf\x25\x1f\x4a\x63\xfe\x4e\x2c\x92\xef\x76\x63\x3c\xda\x6f"
+ "\xbc\x33\xea\x49\x2c\x91\xef\x9a\xfa\xe0\x6e\xcf\xd5\xe1\x26\xc6"
+ "\xb3\xf9\x44\xc5\xf6\xec\x51\x44\xa6\x5b\xcb\x29\xc9\x1b\x3a\x46"
+ "\xd3\x43\x22\x3c\xaa\x9c\x92\xbd\xa1\x5d\x74\x0b\xd1\x35\xde\xd0"
+ "\x71\xba\x95\x68\xb8\x37\xb4\x09\x36\xc8\x36\x7e\x7f\xf0\x66\x4a"
+ "\x48\xc0\xd5\x75\x53\xb9\x29\xc1\x1b\x2a\xa1\x8c\x72\x33\xae\x45"
+ "\x74\x6f\x92\xe8\xf2\x86\xa6\x20\x5f\x21\x4d\x0f\x8b\x73\x13\x93"
+ "\xc4\xdf\xf2\xc3\x94\x36\xe5\x79\xe1\xf2\x86\x30\x1f\x08\x35\x21"
+ "\x5d\x13\xd3\xc3\x5f\xe2\xd7\x25\xb4\x8a\xed\xb9\xd3\xc3\xe7\xc4"
+ "\x84\xe7\x0f\xe2\xf9\x6f\x02\x7d\x24\xbc\xa1\xb1\xd4\x12\x08\x20"
+ "\x9f\x4b\x88\xca\xed\xd9\x8f\x5f\x30\x51\x0f\x6c\x08\xad\x72\x7b"
+ "\x2e\xda\x92\xd7\x83\x76\x60\x7c\xfd\x59\xcf\x0a\x5c\xd7\x6e\xff"
+ "\xa9\x7c\xae\xd8\xee\x10\x96\xed\x79\xb7\x61\x72\xc5\x6d\xf0\x86"
+ "\xda\x28\x1f\xd3\x83\xe9\xcb\xfc\x82\xf1\x1f\xb4\x8a\xe7\x56\x63"
+ "\x09\x7d\x60\x9d\xbe\xcc\x25\xf0\xce\x22\x92\xb7\xe7\x79\x43\x1d"
+ "\x84\x3a\x1c\x80\x37\x57\xc2\xab\xd8\x5e\x81\xbc\x7e\xce\x17\x09"
+ "\x87\x61\x70\xde\xe9\x61\xb2\x22\x7f\x45\x4f\xf2\x76\x27\x7e\x35"
+ "\xf8\x1d\x41\xd9\xbf\x0a\x77\xfa\x21\x81\xf1\x1e\xe5\xdb\xf1\x1c"
+ "\x0c\x42\x86\x25\x2d\xc3\x34\x00\xf9\xdb\xc1\x2f\x13\xc1\x77\xc0"
+ "\x77\x87\x4d\xe2\xbb\x76\xc7\xf5\x41\xd9\x8e\x1d\x43\x54\x3b\x76"
+ "\x5c\xc7\xe9\x9d\xb0\x75\x70\x9f\xdd\xa9\xde\xfd\x00\xe5\x66\xc9"
+ "\x72\x15\x3b\xb2\x85\x65\x47\x6e\x10\xf2\x05\xba\x96\x33\x1d\x41"
+ "\xd7\x72\xa6\xa5\xa8\xdc\x91\xed\x75\xae\x23\x91\xbc\x23\xb7\x27"
+ "\x79\x47\x1e\xca\x3f\xd5\x23\x6d\x90\x1d\xce\xa0\x82\xbd\x14\x70"
+ "\x66\x83\x6f\x13\x01\xc3\x09\x58\x15\x3d\x6e\x3b\x4d\x5f\x26\x82"
+ "\xd3\x43\xab\x42\xf9\xcb\x28\x71\x24\x95\x03\xdf\x0f\x41\xa3\x42"
+ "\xb4\xb3\x11\xd7\x89\x78\x4f\xd7\xa2\xae\x83\x80\xeb\xe4\xfa\x50"
+ "\x4f\x05\x60\x3e\x0f\x58\x85\x8c\xd3\x97\x6e\x4a\xc3\x73\xcd\x97"
+ "\x0a\xbf\xfd\x5a\xc5\x8e\x56\xcd\xb2\xe3\x88\xc1\x43\xcc\x3f\x8a"
+ "\x6e\x9b\x68\x5a\x40\x84\xbc\xa1\x2d\x04\x1e\x4b\x6b\x09\x1c\xe7"
+ "\xf7\x98\xff\xec\x42\x3f\x33\x4f\x95\xe0\xba\x8d\x98\x7f\x5a\x8a"
+ "\x9f\xe7\xbc\x07\x99\x87\xa6\x15\x07\x56\x8d\xa2\xe2\x04\x3c\xbb"
+ "\xf2\x43\x16\x7a\xbc\xd8\x5c\x1e\xae\xd8\xd1\xd0\x52\xcc\xfd\x72"
+ "\x0c\x65\xb8\x5c\x11\x59\x13\x30\x07\x48\x10\x21\xab\xd3\x6f\x1e"
+ "\xe8\x70\x89\x96\xc0\x14\xe4\x2d\x26\x6e\x0f\xf3\x11\xe7\x9f\xda"
+ "\x21\x7c\x61\xcb\xce\x3c\x6e\x9b\x18\x54\x4e\xcd\x1d\x77\x12\xcf"
+ "\xc3\x9a\x3b\xb6\x31\x9f\x6a\xc2\xb2\x33\x13\x3c\xda\x33\xb5\xa3"
+ "\x3c\xe9\xf1\x0b\x94\x80\xb4\x70\xb3\x63\x17\xde\x37\x22\x5f\x93"
+ "\xe4\xdb\x69\x17\x42\xd6\x90\x65\x47\x4d\xa8\x62\x67\xf6\xb4\x0b"
+ "\x3d\xa2\xd9\xb1\x89\x1e\xeb\x28\x07\xad\x76\xd1\xd4\x33\xa1\xc4"
+ "\x96\xe2\x42\xe4\xe9\x42\xfa\x36\xc9\xff\x53\xcf\x74\x8a\x69\xb0"
+ "\x66\xa6\x5d\xf8\x9b\x98\xea\x10\x07\xf3\x9d\x34\xe8\xea\x55\x42"
+ "\x63\xb9\x68\x6a\xdb\x45\x57\x1f\xf7\x11\xcb\xc4\x94\x39\x9a\x98"
+ "\x7a\xe6\x9c\x78\xfc\x59\xa6\xcd\x58\x6a\x76\x40\x7e\x9c\x9b\x98"
+ "\xde\xfb\x9b\x1d\x07\x50\xff\x44\xc0\x75\x09\xaf\x73\x0b\xf2\x7a"
+ "\xac\x8f\x9d\x49\xa3\xa6\xb6\x4d\x14\x4a\xde\x51\x13\xae\xdc\xd1"
+ "\xa0\x25\xef\x38\xa2\x55\xee\x68\x15\xc9\x3b\x33\x43\x95\x3b\xb3"
+ "\xc3\xc9\x3b\xc1\x03\x3b\x1b\xd0\x4f\xc9\xdc\xe7\xdd\x6e\xb2\xe3"
+ "\x79\x47\x37\xf7\x7f\xc5\xce\xfd\x68\x6b\x2b\x6c\x5e\xa1\x78\x7f"
+ "\xe7\x7e\x5e\x5b\x40\xd9\xd6\x9e\xe4\x9d\x47\x90\xaf\x55\xc9\xd7"
+ "\xce\x76\xe6\x4b\xe4\x33\x21\xed\x14\xe6\x3d\x89\x78\x1f\xec\x49"
+ "\x6e\xb0\xe0\x67\x13\x6b\x1b\x1c\x80\x7f\x8d\xe4\xa9\x8a\x06\x87"
+ "\xf8\x71\x35\x6c\xe8\x0b\x80\xd3\x50\x31\x3d\x7c\xb7\x00\x0d\x21"
+ "\x27\x0d\x0e\xad\xb2\xc1\x29\x52\x1a\x1a\x82\x92\xf7\x1b\x76\x32"
+ "\xec\x9e\x15\x99\xbc\xe6\x60\xc6\x7b\xd8\x80\x6f\xde\x1a\x64\x5e"
+ "\xb5\xbc\x99\xa9\x59\xde\xac\x10\x15\x6f\x66\xff\xe4\x79\xe1\x0f"
+ "\x57\xbc\x99\xa7\x55\xbc\x99\x1b\xba\x0a\xb6\xb9\xf3\x00\xb1\x7e"
+ "\x0a\x7d\x24\x40\x83\x4f\x40\x8f\x6d\xb2\xff\xbd\x4e\xc8\xc0\xb2"
+ "\xa1\xe5\xcd\x1d\xe0\x85\xe2\xb7\xa5\x6e\x6a\x09\x1c\x93\x34\x15"
+ "\xc9\x6f\x66\x32\x4f\x71\xff\x3e\x5e\x4c\xe5\xa2\xf2\xcd\x6c\xad"
+ "\xf2\xcd\xdc\x70\x25\xe0\x26\xa3\x9e\x94\xb7\xfe\x14\x94\xf2\xfa"
+ "\x16\xf8\xf5\x00\xca\x7c\x42\x8a\xc7\xdf\x3a\xd2\x9f\x8e\x64\x5d"
+ "\xc5\xfa\x69\x7a\x28\xc8\x3c\x73\x8a\xf5\x9a\xd2\x53\x94\x6f\xe8"
+ "\x29\xd6\x51\x3c\xdf\x61\x3d\xa5\xe9\x7a\x4a\xd3\xf5\x94\x7c\xb6"
+ "\x40\xd7\x54\x6c\xcf\x63\x7d\x34\xdd\xa9\xf4\xcc\xf4\x70\x96\x00"
+ "\x6f\xa4\x02\x46\x9e\xea\x0b\xe4\x59\xbb\x7d\xae\xcc\x2f\xe9\xb4"
+ "\xbd\x42\x83\xbe\xc1\xaf\x46\x53\xfa\xa6\x55\xd7\x37\x26\x43\xdf"
+ "\x84\x31\xae\x41\xa6\xb4\x78\xfa\x46\xd3\xf5\x4d\x58\x28\x7d\xa3"
+ "\xe9\xfa\x86\xd3\xc3\xba\xbe\x09\xc7\xd1\x37\x90\x67\x6e\x6f\xa2"
+ "\xae\x67\xca\x59\xcf\x70\x7b\xc1\x6b\xb9\x9a\xd2\x33\x0e\xcc\x75"
+ "\x4c\xac\x67\xc2\x28\xa3\x19\x7a\xa6\x4b\x96\xaf\x60\x5d\xd3\xf3"
+ "\x02\x41\x7f\xda\x89\x75\x8c\xd4\x27\xa1\xe1\x21\xd6\x27\xa0\xdf"
+ "\xdd\xb1\xfa\x04\xf0\x6a\x70\x9f\xa6\xeb\xa9\x23\x98\xe9\x86\xa0"
+ "\x4f\x1a\xa6\x3b\x03\xe8\xeb\xcf\x30\xf7\x87\xde\x76\x96\x94\x7b"
+ "\x9d\x21\x82\x1e\x68\x15\x2d\xe5\x04\x1c\xc1\xbf\x61\xe8\x0a\x22"
+ "\xc8\x65\x66\x08\x32\x0e\x1e\xcf\x6e\x29\xfe\x94\xc2\x90\xd5\xa9"
+ "\x1d\x9d\xde\xc7\x03\x99\x69\x53\xcf\x08\x3f\xe8\xe3\x7b\xbc\xb8"
+ "\x1c\xfa\x25\xd3\xdf\xdc\xf1\x21\x4d\x69\x13\xda\x94\x02\x9f\x1d"
+ "\x32\x90\x3d\x75\xbe\xc7\xfa\xf8\xb3\x69\x90\x33\xe1\x81\x5e\xfc"
+ "\x7f\xa6\x9e\x49\xb3\xce\x6e\xa3\x6f\x4d\x99\x23\xb4\x30\xe4\x0c"
+ "\xed\x6d\x40\xbb\xf7\x03\xf7\x23\x90\xb9\x56\xc8\x59\x66\x28\x46"
+ "\xce\x20\x33\x3b\x70\x6f\x57\xf4\xdb\xd9\x0a\x39\xdb\xaf\xc9\xf1"
+ "\xac\x4d\xce\x31\x51\x4f\x2b\xaf\xc5\x41\xd6\xf6\x6b\x95\x4a\xd6"
+ "\x34\x55\xae\x5d\x63\xfa\x99\x74\x59\x43\x5f\xe0\x7d\x10\xb2\x63"
+ "\xc1\x2f\xbe\xac\x15\x47\xc8\xda\xb3\xba\xac\x25\x2b\x59\x43\x9f"
+ "\x26\x86\x57\x28\x79\x63\xf8\x3c\x0f\xed\x95\xb7\x94\x37\x33\x71"
+ "\x9f\xa0\x78\x47\xca\x1c\xc6\x95\x37\xf3\x20\x6f\xb9\x90\x37\xc0"
+ "\x13\x7e\xd6\x9b\xe0\xcd\xff\xe0\xb1\x6e\x5a\xb1\xf8\x8f\xfc\xf0"
+ "\xd0\x72\xc8\x53\x1e\x74\xd9\xdf\xa0\x47\xff\xe3\xf1\x00\x6d\x85"
+ "\x3c\x65\x42\x8e\xb2\x21\x4f\xb9\x90\x2b\x96\xa7\x23\xe1\x15\x0c"
+ "\xf3\xad\x23\xbd\x30\xe4\x58\x19\x2d\x4f\xfd\xad\x83\x76\xb9\xed"
+ "\xa5\x3e\xfa\xa0\x98\xed\x15\xdc\x57\xf8\xe8\xc0\x44\xfd\x1e\xf6"
+ "\xcf\x56\xb9\xb6\xc5\x32\x58\x5c\x46\xd7\x9d\xa6\xe1\xb9\xe0\x77"
+ "\xc2\x7d\x2a\xee\xa7\x4c\xbf\xe5\x20\xec\x88\x8e\x76\xd4\xdb\xc5"
+ "\x72\x28\xdc\x63\xd8\x3e\xcb\x01\x1f\x5a\x44\x57\x66\x2a\xec\x4b"
+ "\x4d\xf4\xd8\x78\xad\xcd\x8a\xe7\x41\x68\x7f\x06\xae\x83\xb7\x5c"
+ "\xa4\x74\xfc\x6c\x5b\xdc\x5a\x39\xdb\x4e\xb8\xcf\x12\x4b\x6d\x29"
+ "\x1b\x96\xd0\x48\x6b\x80\x2c\xf5\x6e\x2d\xcf\xba\x2a\x8d\xd7\x9c"
+ "\xd2\xf9\x5e\xb8\xb7\x8d\xad\xbf\x48\x66\x5e\x17\xd0\x92\x51\x9f"
+ "\xd3\x2a\xc4\xe2\x4c\xaa\x5f\x04\xfd\xe0\x26\x5b\xbd\x5b\xec\x0e"
+ "\x77\x49\x99\xcc\x36\x70\x61\xdc\x80\xe7\x0d\xc0\x73\xf6\x43\xcb"
+ "\x72\xe8\x13\x27\xc5\x5d\xab\xed\x72\x0f\xef\x6d\x7f\x3f\xef\x6b"
+ "\x0d\x9a\xf4\xf3\xfe\x80\x41\xa7\x7e\xd6\xf5\xcc\x3c\x46\x87\x97"
+ "\x08\x7f\xd5\x53\xc4\xb4\xb0\xb9\x42\xe2\x3f\x41\xc7\xf2\xb2\x30"
+ "\xdd\x30\x7d\xd9\xb7\x85\xb7\x43\x78\xbc\xce\x33\x54\x8f\xf7\x65"
+ "\xa5\x42\xd3\x92\xf7\xfa\x44\xe5\xde\xe3\x9d\x4b\x44\x88\xd7\x72"
+ "\xba\xdc\x37\xda\x7d\xf4\x23\x8f\xea\x8b\x1d\xfb\xe5\x1c\xd2\xb2"
+ "\xf7\x38\x60\x5d\xc3\xb0\x9a\x51\x3e\x5c\xb9\xb7\x0d\xf9\x60\x6f"
+ "\xfe\x51\xae\x77\x40\x8e\xf7\x17\x2f\xa7\x6f\x9e\xa6\x1b\x25\x8d"
+ "\x45\xc5\xde\x00\xeb\x03\xa4\xa5\x21\x6d\x1d\xe0\x07\x91\xdf\xe9"
+ "\xa3\xbd\x9b\x94\x1d\x7b\xe3\x3a\x23\x1f\xee\x0b\xf8\x3e\x8a\x7f"
+ "\x12\xe4\x62\x3a\x60\xd9\xfb\x36\xab\x12\xf4\xe5\x75\xe3\x2f\x0d"
+ "\xbf\x9c\xf8\xaf\xfb\xf4\xf9\xce\x6c\xd8\x5a\xe4\x5a\x49\xc3\xd0"
+ "\x3f\xc0\xef\x3b\x09\x98\x47\x9c\x14\xee\x1b\x6b\xde\x58\x1e\xc4"
+ "\x3c\xe1\x3b\xa9\x3e\x7a\xb1\xb1\x3f\x7a\x0a\xb6\x75\x2e\x8a\xf6"
+ "\xaa\x25\xbd\xb4\xfc\x7c\xfa\x32\x4d\xf0\x3d\xeb\xa3\x7a\xa4\x33"
+ "\xdd\x00\x67\x96\x41\xb3\xfe\xfb\x65\xaf\x5f\xcd\x39\xbf\xb3\x47"
+ "\xb8\x05\x79\xbe\xc5\x7b\x4c\xdf\xd9\xab\xe8\xb0\xf3\x48\x27\xf4"
+ "\x08\xaf\x13\x63\x6e\x16\x58\x6c\x13\xa0\xd7\x77\x1a\x7c\x34\x32"
+ "\x4b\x5f\x87\x0a\x78\x43\x93\x58\xb7\xc4\x1d\xb7\x78\x4f\xac\x0f"
+ "\x7e\xc6\xb1\x96\x61\xd0\x43\x52\x37\x1d\x9a\x55\xa6\xf0\x0e\x32"
+ "\x5c\x4f\xd9\x79\x6a\xc3\xfb\xc5\x01\xd1\x2e\x2a\x0e\xe5\xf2\x3c"
+ "\xc2\xb3\xa4\x9b\xd3\x3e\x05\x6f\x0b\xcf\x22\xc6\x29\xe3\x53\xcf"
+ "\xb7\xba\xe9\xa4\x93\x12\xeb\x7b\xd7\x7f\x32\x3c\xbc\xde\xa3\xd6"
+ "\xb9\x32\x72\x7c\x34\x2a\x68\xe0\xc5\x36\x06\xe8\xcb\xb4\xde\xcf"
+ "\xb6\x06\xef\x3d\x2c\x2e\x15\x41\xb6\x39\x90\xb7\xc8\x68\x03\xb7"
+ "\x4f\xb5\x2b\xa3\x3c\xb2\x5d\xbc\x47\x65\x2d\x55\x34\x58\xbc\x8c"
+ "\x2c\x76\x45\x6b\x0b\xb7\x97\xdb\xc2\x6d\x96\x6d\x91\x3a\x16\x63"
+ "\x44\xe8\x4e\xcc\xc7\x64\x7a\x2b\x60\x61\xfe\x33\x52\xe7\xa9\x8c"
+ "\x9c\x58\x3e\xea\xed\x47\xcb\x8e\x0a\xcc\x41\xbf\xe5\xd2\xc4\x89"
+ "\x93\x34\xe2\x61\xb5\x76\x36\xe2\x61\x8d\xed\xec\x20\xf3\xef\x07"
+ "\xad\x3c\x26\x7b\x4b\x59\xdf\xca\xbc\xd7\x22\x6f\x1b\xf2\x4c\xd6"
+ "\xf3\x4e\x56\x7b\x76\xf2\x3a\x80\xaf\x18\xc7\x9e\xf7\xd1\x88\x02"
+ "\xbf\x1c\xef\x0f\xa5\x19\xcf\x98\xbb\x63\xfe\x37\xc2\x26\x2a\x3f"
+ "\x68\x8d\x8f\xcb\x9b\x15\x3c\x9e\x85\x2f\x8a\x0e\xd4\x73\x3d\xf3"
+ "\x94\x6b\x19\x7d\x03\x7c\xf9\x79\xd9\x4a\xba\x96\xf9\x49\x24\xef"
+ "\x0d\x29\xba\x8f\xd8\x25\xdc\xb0\x3d\xa1\x51\x8b\x97\xd0\x37\x21"
+ "\x47\x81\xd3\x34\xe2\x50\x7e\xa9\x1d\xb8\x12\x55\x9d\x25\x92\x3a"
+ "\x28\x79\x6f\xd0\x1b\xfa\x82\xea\xcf\xf2\xda\xce\x08\x9f\xc1\x8b"
+ "\xb8\xef\xb8\x9c\xbe\xc0\x38\x63\x51\x6b\x0f\x37\x3d\xcc\xfb\x0c"
+ "\x27\xe8\xa6\x89\xdc\x5e\xb5\xc7\x79\xd3\x9d\xe2\xa2\x98\x2d\xd4"
+ "\x98\x16\xf4\xd1\x4d\xc5\x18\x5b\x2c\xf2\xe7\xa6\x02\xf5\xbc\x33"
+ "\x88\x7c\x19\xe2\xa2\x46\x9c\x8e\xb4\xb1\xc2\x9d\xc0\x32\x71\xa0"
+ "\xcb\x7d\x93\xc3\x47\x3f\x6e\x55\x7d\x73\xd3\x18\x86\x15\x1f\x87"
+ "\x9d\x41\xf4\x2d\x31\x6f\x02\xd6\x9f\xed\x65\xbc\x76\x79\xd3\x76"
+ "\x29\x17\x80\x55\x6f\x52\x7a\x5b\x03\xae\x75\x6e\xcd\x01\x1d\xed"
+ "\xd0\xd6\x7e\x94\x23\xef\xf5\x77\x42\x1f\x47\xe3\xc3\x3f\x34\xcb"
+ "\x33\x94\x79\xfc\xe6\x91\x0a\xce\xa1\x5c\xcf\xd0\xd3\xfc\x3c\x8a"
+ "\x9f\x03\x96\x83\x39\xde\x9a\x1c\xd4\x7f\x1a\xf5\xde\x3c\x52\xcd"
+ "\xe7\x6f\x1e\xd5\x89\x3a\xba\xdc\x37\x8f\xf4\xd1\x68\xb3\xda\x73"
+ "\x39\x98\xd3\xdf\x5e\x32\xcb\x0e\xcb\x9c\x92\xe9\xcc\x33\xcd\x5b"
+ "\xa5\xfc\xb5\x77\x5a\x1a\x2c\xba\xde\xe0\x75\x9a\xd4\x13\x94\xd9"
+ "\xd1\x6c\x93\xfc\x6d\x12\xa6\x9b\xd7\xfd\x46\xf3\x9b\x78\x5f\x4c"
+ "\xa9\xaf\xcc\x8e\x4b\x7f\x37\x7b\xf0\x3b\x8a\xdf\x71\xfd\xb9\x1d"
+ "\xbf\x10\xee\xa7\xe0\x77\x5c\xd2\x6e\x73\x61\x82\x0f\xef\x3a\x61"
+ "\xb3\xf3\xb3\x8f\x6e\x3e\x22\x36\x67\x98\x60\x97\xc8\xfb\xfa\x6f"
+ "\xf0\x3a\xc1\xcd\xd0\xb3\x37\x95\xaa\xbe\xc8\x94\x6b\x2a\x90\x47"
+ "\xa6\xbb\x70\xd5\x88\x60\x63\x59\x80\xf1\xce\x68\xac\x09\x90\xfd"
+ "\x26\x6e\x7f\x26\xdb\x0f\x22\x00\xfa\xf3\x75\x71\x8d\xf0\x1f\xae"
+ "\x0d\x11\xef\xcf\x75\xb9\x33\x21\xff\xf3\xa7\xa8\x35\x87\x43\xc5"
+ "\x0c\x4f\xe7\x09\x61\xb4\x5f\xe9\xb4\x83\x39\xdc\x97\x78\x7e\x0e"
+ "\x6d\xb7\x9e\xa5\xcc\xbd\x22\xe5\xa3\x9c\xc3\x0e\xa2\x2d\xd0\x23"
+ "\x18\x6b\xe4\x5e\x41\xbd\xf4\x0f\xc8\xc4\xf8\x7f\xd3\x71\x63\x3f"
+ "\x69\x3d\xde\x6f\xc0\x3b\x8c\x3d\xfe\x66\x47\x90\x18\x56\x98\xdb"
+ "\x87\xf2\x1f\x6a\x7e\x33\xc6\x6a\xf4\xf9\xc1\x9c\xb2\x62\xe8\x99"
+ "\x5e\xbd\x95\x39\x7b\xe5\x19\x11\x34\xda\x77\x78\x2b\xcb\x42\x26"
+ "\xf8\xff\x69\x47\xbf\xfc\xdf\x8b\xf3\xad\xc9\x87\x33\x54\x9f\x69"
+ "\xa0\x4b\x74\x9f\xdd\x6a\x51\xfd\x75\xcb\xd8\xe8\xfe\xba\x15\xb6"
+ "\xcd\x2d\x6b\xf0\xab\xc5\x6f\x97\x7a\x8e\xfc\xdd\x52\x1c\x71\x7f"
+ "\x00\x3f\xe8\xce\x5b\x30\xfe\x8f\x08\xaa\x7e\xe0\x74\xb4\x83\x79"
+ "\xe4\x1f\x64\xd1\x7a\xf2\x88\xf7\x6b\x39\x9d\xf9\x99\xd3\x35\xd8"
+ "\x33\x3e\xba\xa5\x1a\xef\xd3\x58\x56\xab\x34\x8a\x7a\xef\x45\xed"
+ "\x9e\xe5\xd0\xd5\x74\xcb\xe7\x0c\xcb\xba\xaa\xa2\x82\xf9\x14\x65"
+ "\x36\x59\x43\x15\x15\xa8\xaf\xc3\xa0\x2b\xd2\x8e\xf1\x7b\xe6\xc9"
+ "\x2e\xf7\xad\x66\xd0\xa5\x41\xee\xc7\x62\xbe\x17\xdf\xd6\xb8\x35"
+ "\xb3\xd7\x26\xb3\x34\x38\x58\x1f\x75\xd0\x77\xc7\x40\x67\xa1\x6f"
+ "\x3f\xca\x56\x63\xcd\x77\xef\xe4\x67\xe8\xca\xcf\x71\x9f\xd5\x0c"
+ "\x9d\xd4\xbd\x76\x6f\x41\x8f\x89\x06\x74\x9b\x28\x27\xb4\xf6\x4c"
+ "\x6a\x28\xe5\xed\x22\x6f\xfb\x1e\x6a\x09\xfd\x96\xec\x4f\x49\x18"
+ "\xb7\x78\xc1\x03\xae\x65\x22\xfc\x4e\x77\x83\xd9\x1b\x3a\xe7\xc1"
+ "\xd8\xfc\xed\xd3\xf4\x5d\x49\x8f\x17\x4f\x60\xd4\x7f\x5c\xc2\xd6"
+ "\xe9\xd3\xd1\xbe\x61\x9e\x08\x6d\x38\x29\x02\xb0\xef\x52\xd6\x77"
+ "\xd3\xc8\xd7\x97\x53\x56\x6d\x37\x65\xd4\x75\x53\xa6\x38\x95\x69"
+ "\xaa\x85\xdd\xf6\xf8\x85\x34\x82\x4e\xc8\x1b\x54\x4c\x96\xba\xe5"
+ "\x24\x79\x24\x5c\x09\xfb\x2d\x04\xfb\xed\x5c\x26\xeb\xc6\x5e\xfb"
+ "\xad\x47\xda\xc5\xfb\x0a\x15\x1f\xed\x2b\x1c\xe8\xa0\x84\xd4\x02"
+ "\x4a\x03\x7e\xae\xb3\x74\xeb\xfc\x54\x0c\x88\xdc\x66\x9f\xde\x5e"
+ "\xd0\xbc\xd4\xea\xa0\x01\xb2\xad\xd0\xd7\xa2\xf2\xa3\xec\x7e\xc7"
+ "\x61\x13\xf3\x54\x80\xe5\x86\xdb\xb0\x8a\xf7\x8c\xf7\x0c\x0d\x9a"
+ "\x17\xd7\x8a\x20\xa7\x97\x0c\x17\xd0\x99\xdf\x75\x70\xdd\xbb\x91"
+ "\xde\xe5\xfe\x6e\xb5\xcf\xf4\xab\x91\xfd\xf1\x28\xe6\x47\xba\x5e"
+ "\x19\x79\x8d\x30\x95\x83\x47\x1b\x1a\x56\x86\x60\x7b\x9f\x65\x99"
+ "\x1d\x99\x36\xbd\x48\x84\xec\x0b\x78\xff\x7e\x24\xb1\x6f\x01\xef"
+ "\x29\xfe\x06\xb6\xcd\x57\xf9\x13\xf0\x78\xc1\x73\x05\x6b\x11\x60"
+ "\xae\x6d\x68\x10\x98\x9f\x7f\x5d\x7f\x06\xb4\x33\x75\xe3\x10\xf6"
+ "\xb3\x19\x39\xc5\x47\x53\xb6\x31\xee\xd2\x97\x06\xba\x13\xf6\xd6"
+ "\xb5\xc0\xab\x22\x00\x3a\xe0\x3d\xc6\xff\xc9\x4e\x7d\xff\xd7\xcf"
+ "\x7b\xaf\x48\xc3\xf8\x7f\xff\x01\x4e\x2b\x19\x4e\xb6\x12\xbb\x88"
+ "\xbb\xf7\xcd\x36\x13\xef\x49\x03\xde\xf5\x28\xb3\xc7\x80\x83\x71"
+ "\xea\xd7\x9d\xa6\x87\x1e\x42\xda\x11\x03\x0e\xf2\x5c\x87\xe7\xd6"
+ "\xde\x3c\xaa\x4c\x7b\x44\x99\x87\x3a\x4d\xb7\xfe\x1a\x69\xa1\xe8"
+ "\x32\xa3\x52\xa3\xcb\x8c\x1a\x16\x51\xa6\x5c\xd5\x33\x2a\x2b\xa6"
+ "\x4c\x4e\x4c\x99\x19\x97\xe2\x36\xaa\x30\xa6\x4c\x49\x4c\x99\x35"
+ "\x97\xe2\x36\xaa\x26\xa6\x4c\x43\x4c\x99\xfd\x11\xb4\x64\xbf\x9a"
+ "\x2c\xa4\x35\xc5\x94\x39\x1e\x53\xa6\xc3\x78\xee\x87\xc6\xa9\x8b"
+ "\xb7\x90\x0d\xbc\xc9\xbe\x5b\xfe\x8d\xe8\x9f\xce\x57\x9f\xee\x52"
+ "\x65\x6f\xcb\xbc\xb4\x5d\xb7\x8d\x8d\xae\xef\xb6\x29\xd1\xf5\xdd"
+ "\x36\xfb\xd2\x76\xdd\x56\x1c\x53\xa6\x3c\xa6\x4c\x75\x44\x99\xad"
+ "\x7a\x3d\xdb\x62\xca\xec\x89\x29\xd3\x78\x29\x5f\xdd\xd6\x1a\x53"
+ "\xa6\x3d\xa6\x4c\xf0\x2b\x68\xc1\xe3\xb8\xf2\x6b\x1b\xc2\xb6\xf2"
+ "\x3d\xb0\x11\x46\xcf\x61\xdf\x08\xde\x07\x7d\xa3\x3b\x98\xc4\xfb"
+ "\x73\x3c\x5e\x1d\x76\x06\x31\xb6\x8c\xc6\xfc\x67\x8c\xc7\x18\xb3"
+ "\xd8\x6f\x84\x65\x5a\xd9\xd8\xa3\x33\xfb\xb3\x45\xa5\xef\x99\xee"
+ "\xbf\xc6\x75\x1d\x1e\xc6\xe3\xd4\xe8\x4d\xbd\x36\xb1\xf2\x41\x23"
+ "\x1d\xce\xdf\x8d\x7d\xd8\x7a\xe5\x8f\x92\xc0\x36\xf9\x61\xa7\x2c"
+ "\x73\x24\xc2\x8e\xe6\xfa\x03\x7b\x96\x07\xcd\x31\x78\x34\x5c\x06"
+ "\x8f\x54\xd8\x46\xd9\x2d\x18\xbd\x78\x7f\xbd\xb9\x16\x36\x10\xec"
+ "\x7e\xc6\xed\x04\x65\x65\x49\x9b\x6c\x41\x37\xf1\xbd\xb7\xf4\x2e"
+ "\xb9\xff\xae\x6c\xd2\x2c\x47\x23\xea\x67\xdb\xbd\xb1\xf8\x3c\xfb"
+ "\x48\x61\xfc\x65\xdb\x2d\xeb\xe5\xc3\xa5\x7e\xe0\x95\x55\x60\xf8"
+ "\xa9\xf8\x28\x6b\x93\xb4\x35\x2a\x0e\x65\xb1\x6f\x00\xfb\xd0\x1c"
+ "\x0e\x64\x73\x1e\xf0\xff\xe8\x22\xa3\xbd\x18\xeb\xfd\xc8\x3b\xf6"
+ "\x72\x34\x53\x7d\x98\x75\x20\x9a\x27\x93\xc0\x2b\x59\x47\xa3\xfb"
+ "\x3d\xcb\x17\xdd\xef\x59\xfe\x68\x9e\x34\x81\x27\x6f\x37\x47\x97"
+ "\xb9\x3d\x3d\xba\xcc\xed\x19\x11\x65\xaa\x55\x3d\xb7\x67\xc7\x94"
+ "\xc9\x8d\x29\x93\x17\xf1\x8c\x36\xde\xee\xe8\x9d\xfb\x48\x1f\xa8"
+ "\xdb\x9d\x11\xcf\xa6\x4d\x52\x7f\xde\xbe\xce\x48\xe3\xb5\xa3\xba"
+ "\x57\x94\x0f\x8e\x0e\xaf\x21\x46\xde\x39\xff\x81\x18\x1c\x9a\x62"
+ "\x70\xe8\x95\x7f\x7d\xef\xfe\xe3\x93\x74\xc7\x1e\x7d\xef\xbe\x03"
+ "\x63\xf6\x74\x7e\x06\xac\x1a\xe4\x07\x1d\xee\x48\x8d\x86\x77\xc7"
+ "\xb0\x68\x78\x77\x8c\x8c\x78\x4e\xc3\xf3\xd8\x88\x36\xa4\x25\xda"
+ "\x28\x01\xfc\x02\xfb\xed\x8e\x59\x46\x3a\xcf\x29\x81\x6f\xbb\x4b"
+ "\x8e\x35\x39\xec\x5b\x36\xf8\x04\xdd\x31\x9e\xe7\x9f\x3a\xcc\x48"
+ "\xf9\x27\xd5\xae\x3b\x36\xc5\xe0\xb1\x2d\x06\x8f\x3d\x11\xed\x0a"
+ "\x58\x57\xd1\x03\xd6\xd0\x83\x0f\xb3\xed\xc3\xfe\x94\xd2\xc7\x6b"
+ "\x25\x6c\xb6\x0b\x94\xc6\xbe\x75\x27\x4b\x28\xd1\xeb\x6c\xc7\x5c"
+ "\x6e\x5f\x41\xbf\xfc\x94\x72\x28\x47\xf9\x56\x91\xbd\xcb\xfd\xbd"
+ "\x74\x83\x1f\xb5\xb5\x87\x72\xb4\xca\x0f\x33\x90\x06\xfd\x97\xb5"
+ "\x55\xd9\xb9\x07\x8a\x85\x2b\xaf\x06\xf4\xc4\xbc\x68\xcc\x75\xfa"
+ "\x3c\x62\x16\xfb\x88\xb1\x1f\x2b\xc6\xf8\x54\xb5\x0f\xff\xbd\xd9"
+ "\x11\x7c\x1d\xb0\x2f\xbf\x5b\x9c\xa0\x31\xc3\xd9\x06\x60\x19\x65"
+ "\x5f\xb3\xc3\x21\x3f\xf1\xdc\xdb\x1b\x3a\x2d\x6d\x37\xbc\xb7\xeb"
+ "\x65\x6b\x22\xca\xfa\xf5\xb9\x71\x3b\xbf\x1b\x1d\x22\xf3\xe1\x80"
+ "\x9f\x00\x27\x5d\xd9\x7b\x63\x86\x1f\x86\xbc\xa2\x4c\x93\x51\x86"
+ "\xe7\xd1\x72\x8f\xb7\x84\xcc\xb7\x95\x92\xd9\xb3\xfc\x84\x84\x6d"
+ "\xf8\x6d\xc0\x96\xee\xf0\x96\xb6\x93\x37\xd0\xca\x6b\x5d\x66\xe5"
+ "\xa3\x33\xc6\x9e\x18\x24\x4b\x67\xe5\x21\x8c\x71\x63\xec\xe1\xca"
+ "\x43\xd9\xc0\x0d\xe3\xd9\xf7\x26\xb2\xbe\x89\xa4\xdd\xa4\x49\x33"
+ "\x1e\x9c\x3e\x75\xd4\xcf\x1e\x9c\x3c\x6b\xd2\x5d\xf6\x59\xf3\x9f"
+ "\x99\x5b\x38\x6a\xe1\x73\x25\xf6\xa5\x8b\xe6\x97\xcc\x5f\xf0\x73"
+ "\x7b\x96\x73\x84\xd3\x3e\xa7\x44\x5d\x33\x8b\xe6\x2c\x2e\x19\xc7"
+ "\xb7\x23\xed\xc5\x8b\xe6\x2e\x91\xb7\xb7\xa4\x50\x34\x90\xf9\x25"
+ "\x73\x17\xd9\x47\x14\x8e\xb4\xdf\x3b\x67\x7e\xd1\x73\x8b\xe6\xc6"
+ "\x85\x75\x97\x7d\xd1\xdc\x45\x73\xe7\x14\xda\xc7\xd9\xb3\x18\x72"
+ "\x24\xb8\x88\xfe\xcc\x32\xc6\x31\x1e\xbf\xaa\xdc\xe2\xa8\x3e\x9e"
+ "\xf9\x14\xff\x8c\x09\x5c\x3a\x96\xdd\x69\x89\xe6\xb9\x3b\x6d\xd1"
+ "\x3c\x77\x67\xe6\xa5\x63\xd9\x9d\x31\xe3\xdf\x9d\x31\xe3\xdf\x9d"
+ "\xb3\x2f\x1d\xcb\xee\x8c\x19\xff\xee\x8c\x19\xff\xee\xec\x1d\xff"
+ "\xc0\x4b\xbe\xd5\x52\x2f\xdc\x19\x33\xfe\xdd\x19\x33\xfe\xdd\xd9"
+ "\x18\xf3\x7c\x2c\xe2\xf9\x5a\x3c\xb7\x45\x8e\x8f\x78\x0e\x18\xf2"
+ "\xd9\xa7\x5f\xbe\x6f\x31\xf2\xb0\xae\x87\x6e\x6e\x53\x79\xbf\x6f"
+ "\x8f\xc8\xdb\xae\xe7\x1d\xd3\x2b\x7f\xbc\xaf\x8d\x74\x35\x5f\xff"
+ "\xfe\x6b\xac\xd3\xd9\x1f\x8f\xc7\x26\xc8\xc7\xb7\xcf\xd2\xf7\xaf"
+ "\x61\x58\xcc\xc3\xec\x9f\x29\x5e\x7d\xb4\xab\x7e\x30\x59\xb8\x4c"
+ "\xfd\x4b\xec\xd7\x3b\x66\x24\xfb\xea\x22\x8d\x7d\x97\xa1\x53\xbe"
+ "\xcf\xf6\x6f\x48\x8d\x17\xdf\xf7\x49\x9b\x1f\x65\x74\xf8\x72\x5e"
+ "\x03\x38\xec\x0b\x6c\xa9\x52\x63\x71\x1b\xee\x53\x99\xa7\x51\xde"
+ "\x2c\x4c\x63\x9e\x65\x1f\x68\xa4\xa5\xe1\x97\x0e\x78\x3e\x03\xde"
+ "\x9a\x21\xf1\x6d\xcb\x58\x3b\xb7\x77\x3e\x68\x22\x6b\x95\x5b\x6b"
+ "\xf5\x6a\x6c\x5b\xff\x20\x5d\xad\x2d\xec\x2d\x17\xee\x83\x79\xf5"
+ "\x48\x8f\x3f\x4f\xfa\x01\xe4\xe5\x07\x16\xb5\xde\xf2\x03\xf4\xff"
+ "\xd4\x31\x6a\xed\x74\x6f\x39\xf4\x6d\x37\xe0\x5c\xc0\xb5\x07\xd7"
+ "\x7f\x37\xe0\x7b\xe4\x7c\xfb\x07\x25\xc2\x9d\x30\x93\xe1\xc6\xa4"
+ "\xaf\x83\x7e\xeb\xb6\x86\xca\xf3\xe2\xbc\x6b\x10\xee\xc4\x07\xe3"
+ "\xa4\x7b\x60\x33\x74\x03\x8f\x00\xe3\x1b\x91\xde\x2a\xdc\x83\x66"
+ "\x71\x7e\x1f\xd7\x87\x32\xfd\xd9\xda\x86\xff\xad\xf2\xe1\xcf\xce"
+ "\x88\x69\xc7\x97\x27\x29\xfb\x57\xaa\x1d\xd9\xe1\xe8\xba\xb3\xc7"
+ "\xc6\x6f\x47\xf6\x2c\xb4\xe3\xcb\xf8\xed\xc8\x2e\x96\xb4\x35\xa1"
+ "\x2d\xa6\x4b\xde\xad\x43\x5b\xbe\x94\x74\x8f\x4e\xdf\xa6\xdb\x42"
+ "\x01\xcc\xc3\xd2\xf0\x4e\x96\x9d\x59\xda\xd7\x6f\x7a\xbe\x26\x6b"
+ "\x0d\xcd\x88\x53\x67\x9b\x70\x0f\x98\xe9\xa3\x1f\xca\x73\x0d\x11"
+ "\xe9\x21\x85\x0b\xe8\x64\x62\x3a\xa1\x3d\x28\xd7\x5f\x7f\x1b\xf3"
+ "\x12\xb5\x16\xf2\x43\xc8\x7f\x36\x19\x6b\x99\x8b\x4b\x85\xdf\xa0"
+ "\x23\xde\x39\x62\xde\x05\x23\xde\xad\x89\x7a\xb7\xb2\x37\xbd\xd6"
+ "\x48\xff\x7a\xfd\xf4\xc3\xa6\x98\x7e\x42\xff\xdc\xf5\x58\x74\xbb"
+ "\x7f\x78\x5c\xb5\x0f\x7d\x74\x09\xad\x7f\x18\x44\x1f\xf5\xc4\xef"
+ "\xa3\xbb\xd2\xe3\xf3\xda\x5d\x72\x1d\x4d\x0c\xa6\x38\xf0\xee\xca"
+ "\x45\xdf\xf5\x48\x1e\xd4\xfb\xe9\xd2\xfe\xb9\xab\xc8\xe8\x9f\xaf"
+ "\xd7\xc6\xbb\x76\xc7\xb4\x31\x7c\x92\x7e\x34\x4a\xb5\xf5\x47\x2b"
+ "\x63\x60\x1f\x89\xcf\x8b\x77\xf9\xd0\xce\x70\x3f\xed\x0c\xf5\xcf"
+ "\x8b\x3f\xb2\xa1\x3d\xe1\x4b\x79\xf1\x47\x59\xaa\x0c\xc5\x2b\x33"
+ "\x45\xb8\xe3\xd5\xf3\xa3\x42\x57\x88\xed\xdc\x1f\xd5\xf2\xfa\x52"
+ "\x44\x7a\x69\x34\xff\xa1\x0d\x5c\x8e\xe9\x17\x52\x7a\x96\xfb\xe1"
+ "\xa4\x9d\x4c\x5f\xc5\x93\x5d\xee\x1f\x1d\x8f\xa1\xd5\xb9\x93\x34"
+ "\xf6\xb1\x4e\x53\xc2\x36\x45\xaf\x71\xc3\x63\x70\x0a\xc6\xa7\xd7"
+ "\xd8\x34\xd0\xeb\x5c\x7c\x7a\x8d\x1d\xd9\x3f\xbd\xc6\x72\xff\x9f"
+ "\xbb\x94\x5e\x63\x0b\x22\xe9\x05\x5b\x57\xb6\xef\x3b\x36\xf0\x46"
+ "\x4f\xbe\xa8\xe7\xb6\x86\x29\xcd\x0a\x5e\x51\x65\x3a\xb8\xcc\x26"
+ "\x6b\x50\xf1\x09\x6c\x48\xcb\x59\x1a\x5b\x6a\xc8\xff\xa0\x1a\x1a"
+ "\x20\x7a\x1e\x65\x3f\xa2\x04\x2e\xe7\x75\x9e\xf3\x78\x43\x59\xc4"
+ "\xf3\x8f\x98\x7a\x5b\xe3\xeb\x82\xb1\x7e\xd0\xf4\xa5\x4b\xd3\xc7"
+ "\x59\x94\x1f\xd9\xb8\x9c\x68\x1d\x31\xce\x1e\xdd\x47\x3f\xe2\xb5"
+ "\x53\xab\xbe\xed\xf4\x95\xbf\xcb\xf7\xd9\xb8\xea\x4b\xfb\xec\xc7"
+ "\xb7\xab\xfe\xfa\xf1\x35\x31\xf8\x35\xc4\xef\xaf\x71\x9e\xfe\xfb"
+ "\x6b\xdc\xf1\xfe\xfb\x6b\x1c\xaf\x9f\x9e\xf3\xd1\x8f\xb3\xa2\xc7"
+ "\x8d\x1f\xa7\x45\xb7\x17\xf5\xa2\x9c\x30\x5d\x75\x2d\x3f\x7f\xdd"
+ "\x76\x1b\x3f\xd6\x71\xdc\x57\x7c\xae\x08\xf8\x0f\x67\x1c\xaf\x14"
+ "\x46\xbf\xb0\x41\xc3\xea\xe5\xf1\xf7\x5b\x79\x8e\xdb\x52\x43\xc4"
+ "\xfb\xc8\xf6\x6f\xb1\xed\x7e\x77\x92\x66\xa2\x56\xdc\x9b\x4e\x52"
+ "\xce\x9f\x35\x93\xa9\x94\xf7\x3c\xa5\xdf\xba\x5c\x43\xb8\x7b\x58"
+ "\x64\x5f\xf0\xde\x27\xcf\x4d\x37\xa8\xb9\xd3\xdf\x50\x7e\xbb\xea"
+ "\x97\x9c\x77\xa3\xe9\x78\x77\x4e\xfc\x7e\xb9\x3b\x0f\xfd\xf2\xb7"
+ "\xf8\xfd\x72\x77\x49\xff\xfd\x72\x77\x35\xfa\xe5\x6f\x97\xca\xd1"
+ "\xdd\x0d\xba\x1c\xad\xe6\x32\xf6\x05\x3c\x1f\xcf\xf9\x06\xe7\xc1"
+ "\x3d\x64\x24\x47\xd2\x64\x54\x87\x21\x47\xb2\xcc\x71\xc0\x92\xf5"
+ "\xab\x3c\x77\xb7\xea\x30\x22\xe0\xe6\x90\xb5\x23\x9e\x9c\xe4\xd8"
+ "\x38\xef\x6d\xc5\x64\x01\x0d\xf3\xb6\x30\x8c\x45\x44\xa8\xe7\x19"
+ "\xce\xc7\xe9\xb7\x05\x22\xe5\x24\x27\xd7\xc8\xc7\xba\x4e\xcf\x9b"
+ "\x23\xba\x1c\xc4\xf9\x62\x60\xeb\xed\x1f\x20\xc7\x11\xce\xcf\xf9"
+ "\x62\xf2\xd4\x28\x79\xcc\x39\x1e\x2d\x8f\x39\xbb\xa3\xf9\x13\xf4"
+ "\x47\x39\x0d\x7a\x0e\xf7\x66\xe0\xf0\xb5\xf9\xeb\xf2\xb2\x39\x7e"
+ "\x64\x8c\x6c\x82\x07\xc6\x37\x2b\x1e\x18\xff\x76\x34\xae\xe3\x27"
+ "\xc6\xe7\x81\xf1\xb3\xfb\xe7\x81\xf1\xce\xfe\x79\x60\xfc\x26\xe6"
+ "\x01\x1f\x8d\x6f\x8a\x96\xcd\xf1\xbb\xa2\xdb\x8e\x7a\xa5\x6c\xd2"
+ "\x35\x57\x22\x9b\xb0\x85\xae\xed\x4f\x0e\x59\xa6\xd8\x7f\xa4\xbe"
+ "\xdb\xd8\xeb\xf8\x5a\x34\xb3\x40\xae\x80\xdf\x3d\x05\xbc\xa6\x04"
+ "\x1d\x9f\xcd\x34\xac\x93\xe7\x31\xef\x29\x89\xa4\xe3\x06\x75\x06"
+ "\xd2\x85\xbc\x5f\xf2\xbe\xb2\xa2\xe7\x84\x43\xd1\xed\xbf\x67\x53"
+ "\x7c\x7a\xde\xb3\x0b\xf4\x74\xc5\xa7\xe7\x3d\x47\xfa\xa7\xe7\x3d"
+ "\x6d\x7c\x46\xea\x52\x99\xba\x27\x64\x5f\x22\x6d\x14\x59\xe6\x2c"
+ "\x4d\x78\xe8\xeb\x8d\x4f\x13\xc6\x44\x8f\x4f\x13\x86\x5d\xf9\xf8"
+ "\x34\xc1\x19\x7f\x7c\x9a\x50\x1d\x7f\x7c\x9a\xd0\xa0\xe4\x61\x82"
+ "\x2f\x5a\x1e\x26\x78\xa2\x79\x02\xb4\xfb\x5f\x1b\x9f\x26\x66\xc5"
+ "\xc8\x40\xd5\x49\x9a\xf8\x2e\x6c\x0a\xdd\xde\x9c\xf4\x5c\x34\x8e"
+ "\x13\xa7\xc4\xef\xb7\x89\x85\xe8\xb7\xaa\xf8\xfd\x36\xb1\xbc\xff"
+ "\x7e\x9b\x58\x8b\x7e\xab\xba\xb4\xdf\x26\xee\xb9\x72\x9b\x62\x62"
+ "\x7b\x74\x9f\x4d\x3c\x7a\xe5\x7d\x36\x69\x64\xfc\x3e\x9b\x34\x31"
+ "\x7e\x9f\x4d\xd2\x7d\xd3\x27\x6d\x8a\xee\xb3\x49\x25\xd1\x7d\x06"
+ "\xba\xfd\x0f\xfb\x0c\xfd\xb3\x46\xf9\x27\x4c\xba\x80\x79\xfb\x80"
+ "\x2e\xf7\xa4\x0e\x1f\xdd\xbb\x47\xcd\xad\xef\x55\x63\x87\xea\xc3"
+ "\x77\x90\xc7\x77\xe9\x38\x70\xaf\x45\x4f\xfb\xd9\xa5\xfd\x70\x6f"
+ "\x06\x74\x74\x47\x63\xa9\xdc\xdb\x52\x7d\xc8\x34\x47\x3e\xcf\x72"
+ "\xde\x9f\xba\x77\x22\x97\x45\x1f\x0b\x6f\x30\x44\xac\xd7\x91\x3f"
+ "\xc0\x70\xf8\x6c\x68\x0c\xac\xe2\x2b\x19\xe3\x2f\xe3\x53\xb3\xc6"
+ "\x53\x76\x07\xe0\xdd\xf7\xbc\xe2\xd5\x7b\x63\xed\xdf\x7a\xbc\x7b"
+ "\x58\xf1\xe9\xe4\x11\x31\x38\x04\xe2\xf3\xe9\x7d\xa9\x68\x43\x7d"
+ "\x7c\x3e\xbd\x2f\xb3\x7f\x3e\xbd\x0f\xfd\x4f\xf5\x11\x73\x9f\xc1"
+ "\x8f\x87\x7c\x31\x73\x9f\xfb\x1c\xd6\x80\xe2\x1d\x69\x13\x55\xee"
+ "\x5d\xd3\xe5\xbe\x2f\xd6\xfe\x43\xdf\xe4\x0e\xd4\x71\x4e\x8a\x29"
+ "\xdf\x8f\xfd\x77\x1f\xdb\x7f\xef\xf4\x83\xf3\x65\xec\xbf\xfb\xd8"
+ "\xfe\x7b\xe7\x52\xd9\xca\xd5\xed\xbf\x78\x73\xbc\xdc\x91\xf1\xfb"
+ "\x3f\x37\xa6\xff\x29\xaf\x04\xf3\x61\x59\x3e\x3a\x5f\x51\x64\x3e"
+ "\xf6\x4d\xe2\xbc\xcc\x23\x71\xf2\xd6\xc4\xc2\xec\x27\x9f\xe7\x12"
+ "\xde\x63\x5f\xaa\xb8\xbc\x97\xab\x9f\x29\x99\x3c\x31\x5a\x1e\x27"
+ "\x9b\xa3\xe5\xf1\xbe\x86\xe8\x72\x93\x33\xa2\xdf\xdf\x1b\xf8\xdf"
+ "\xd3\xb1\x93\x37\xc5\xf0\xc0\xc1\x93\x74\xff\x35\x8a\x07\xee\x9f"
+ "\x1f\x83\xc7\xae\xf8\x3c\x30\xb9\x11\xed\x3f\x18\x9f\x07\x26\xfb"
+ "\xfa\xe7\x81\xc9\x21\xd0\xf2\x60\x24\xdf\xce\x2c\xcd\x19\x10\x9d"
+ "\xe7\x7e\x7b\x7c\x9d\x77\x7f\x76\xfc\x35\x82\xfb\x67\x28\x1a\xdf"
+ "\x5f\x11\x4d\xe3\xfb\x1d\xd1\x34\x44\x5b\xfe\xe7\x34\xec\x8d\x07"
+ "\xd1\xe5\xbe\x3f\x56\xfe\xbd\x27\xe9\x27\xba\xfc\x4f\x79\x20\x06"
+ "\xc7\x80\xc2\x25\xde\xba\xc8\x4f\x78\xfe\xeb\x8d\x4f\xcb\x9f\x8c"
+ "\x8c\xdf\xe6\x9f\x4c\xc4\x18\xe4\xd5\x2e\x91\xa5\x9f\xcc\x46\xfa"
+ "\x4c\x5e\x0f\xe5\xf5\x90\x3a\xa4\xcf\x0c\x91\x45\x8e\x57\xbd\xe3"
+ "\xd2\x4f\xca\xd9\x17\x85\xe9\xcf\xfc\x6b\x1d\x46\x33\x78\x0c\x62"
+ "\xbc\xf2\x4b\xa5\xdf\x82\x75\x0d\xf3\xfa\x8d\xcc\xeb\x3f\x91\xf6"
+ "\x1f\xef\xb3\xb0\x1f\xa1\xd5\x49\x33\x38\x2e\x85\xc1\xef\x9c\x3f"
+ "\x06\xf6\x71\x96\x0b\xce\x6f\xe4\x55\xeb\x66\xe5\x31\xba\x69\x8a"
+ "\x39\x7e\x1f\x4f\x19\xd6\x3f\xef\x4c\xc9\x56\xfd\x3c\xa5\x28\xba"
+ "\x9f\xa7\xcc\xd0\xdc\x83\x66\x71\x5b\xc1\x03\x57\x24\x27\x25\x76"
+ "\xe1\xef\x57\xdf\xaf\x7e\xb4\xb5\xb8\x8c\xbe\x75\x9a\xa6\x1c\x93"
+ "\xf5\x99\x44\xd0\xba\x2a\x81\x1a\xa5\x0e\x98\x7a\x8b\xc4\x13\x79"
+ "\xf2\x43\x64\x12\xab\x9f\x6e\xe5\x77\xf5\x6e\x11\x44\xbe\xa3\xbc"
+ "\x27\xc0\x67\xab\xc1\x0b\xd7\x9e\xa0\x29\x67\xa2\xca\x43\xf2\xbd"
+ "\x0a\x46\x66\xbd\x94\xc7\xa9\x19\xc6\x9a\xee\x1a\x3c\xc7\x5f\xf7"
+ "\x9d\x9a\x6b\xf8\x3e\x28\x9f\xb1\xa9\xfd\xee\x5f\x32\x4e\x7c\x56"
+ "\x86\x71\xba\xbc\x1e\x98\x5a\x6b\xf0\xaf\xf2\xb5\x9c\xba\xab\xcf"
+ "\x97\x6f\xea\x7e\xbc\x2b\xb8\xcc\xda\x60\x84\x1c\x4c\x6d\x8b\x84"
+ "\xa3\x62\xa2\x4c\x0d\x1a\xfe\x78\x5d\xee\x69\xe6\xaf\x80\xa5\xe3"
+ "\x33\x6d\x64\x34\x3e\xd3\xc6\xc2\x4e\x49\xd7\x61\xe4\x5e\x0e\x06"
+ "\xf7\xb9\xe2\x59\xe6\x87\x69\x05\x97\x5b\xf3\x4b\xb4\xd1\x8c\x8d"
+ "\x97\xf0\xd6\x34\x69\x2f\x31\x8c\xaf\xc0\xf1\x68\xd4\xdc\x42\xee"
+ "\xdd\xf3\xde\xd6\xf4\x2d\x4a\xee\xa7\xc7\xac\x11\x4e\xeb\x90\xfe"
+ "\x54\xba\xdc\x3f\x1e\x8a\x95\x83\xe9\xa9\xc6\x18\x1d\x93\x9e\x61"
+ "\xc8\x3d\xe6\xb5\x0c\x37\x66\x9d\x75\xfa\x44\x25\x0b\xd3\x6b\xb5"
+ "\xe4\xc8\xf9\xda\x74\x69\xff\x19\xeb\xa5\x78\x3f\x31\xa6\x5c\xcc"
+ "\xfa\xdf\xb4\x0e\xd1\xff\x3a\x7d\x2a\xfa\x37\xc0\x7b\x5b\x2a\x56"
+ "\xc3\xf4\xa6\x98\xf5\x0a\xff\x06\x79\xfe\xfe\xaf\x80\x3b\x43\xd7"
+ "\x7b\x0f\x8c\x8f\xa9\xaf\xc3\x75\xe6\x72\xed\x9f\xd1\x4f\xfb\x67"
+ "\xf4\xb5\x7f\x81\x84\x1b\xb3\x96\x38\x43\xb6\x3f\x7c\x89\xfe\x9b"
+ "\xc1\x3e\xa4\x06\xdd\x60\x73\xcf\xd8\x6b\xd8\xea\xbc\x7e\xd0\xbf"
+ "\xad\x3e\xa3\x6f\xfd\x4f\x95\xeb\x5b\xff\xf3\xc7\xb3\xd5\x7d\x24"
+ "\xf7\x56\xa3\xeb\x6e\xb5\xd6\xc6\x6d\x4b\x3f\xeb\x7f\x0f\xe8\xeb"
+ "\x7f\x0f\x14\x44\xeb\xb3\x07\xec\xd1\x7d\x38\x23\xa6\x0f\x1f\xc8"
+ "\x89\xee\xc3\xe9\x1d\xff\xdd\x71\x0d\xcf\x94\x98\x98\x68\x4a\x4c"
+ "\x30\x25\x24\xe2\x35\x9a\x48\x03\x12\xcd\x89\x49\xf8\x5d\xa5\x5f"
+ "\x07\x98\x12\x4d\x66\xfc\x92\xf4\xeb\x55\x31\xcf\x03\xb8\x2c\x7e"
+ "\x66\xfd\x9a\x14\xf3\x7c\xd5\x57\xbc\x1f\xa0\xd7\x6b\xd4\x6f\x8e"
+ "\x79\x4e\xfa\x8a\xf7\x57\xfd\x0f\xcb\xd3\x25\xcf\xd1\x7e\x68\x93"
+ "\x17\x2c\x99\x53\x34\xbf\x50\xee\x17\xcf\xb5\xcf\x79\xf2\xc9\xb9"
+ "\x8b\x17\xdb\x4b\x16\xda\xef\x19\xff\xe0\x1d\x77\xd9\xd5\xb6\x73"
+ "\xd1\xb8\x11\x85\x29\x34\x75\xe9\x22\x7e\x31\x75\xe6\xe4\x3c\xfb"
+ "\x8c\x7b\xc6\x47\xbf\x34\xc0\xc8\xed\xe5\xcb\x41\x89\x90\xbf\x9c"
+ "\xca\x21\x44\xeb\x5e\x91\xba\xa7\x8d\xfd\x7c\xd5\x9a\xc7\xcf\x0e"
+ "\x35\xb1\xff\x68\xb7\x4b\x78\x6e\xe4\x3d\xfd\x99\x73\xb9\x11\xa3"
+ "\xb6\x96\x53\xf1\x13\x7c\x7e\x65\xe6\x2a\xf1\x91\x9f\xec\xf7\x93"
+ "\xe9\x04\xcd\xfe\x73\x63\x2e\xf2\xe2\xd9\xeb\x0b\x91\xdd\x45\x16"
+ "\x94\x7f\x16\xef\x12\xc4\x8f\x35\xa4\x05\x74\x5f\xe8\x9f\xae\x92"
+ "\x69\x1f\x95\x1b\xf9\xac\x27\x69\xd6\x08\xf1\x91\x90\xcf\x7c\x3e"
+ "\x48\xe5\x9b\xf9\xa5\x30\x3d\xb8\x9f\x75\x43\xed\x60\x32\xf3\x5e"
+ "\xe8\x6b\x83\xc9\xf2\xda\x10\x8e\x59\x32\xb3\xc3\xd8\x0b\xad\xc4"
+ "\xb3\x8f\x66\x1f\xe5\xba\x39\xaf\x66\x7a\xf0\x04\xe7\xaf\x8b\xca"
+ "\x3f\x6b\x58\xdf\x5e\xec\xcc\x0e\x13\xf2\x4d\xff\x9c\xac\xd6\xb0"
+ "\xf8\x47\x30\xe5\xed\x82\xdb\x72\x29\xc1\x8b\xae\x68\x0a\x95\x93"
+ "\xf2\xf9\x99\x35\x77\x59\x58\x84\xd8\x3f\x7d\x6a\x87\x4b\x54\x3d"
+ "\x43\x66\xc8\x74\x82\x67\x11\xfb\x28\xcc\x9a\x52\x3f\x97\xcc\x68"
+ "\xff\xb0\xd3\xf4\x50\xa9\x7d\x1a\x91\x6b\x2a\x99\xff\xe4\x64\x7f"
+ "\xc3\xbd\xda\x86\xbf\x90\xf9\xad\xee\x72\x53\xb7\xb0\x51\x69\x89"
+ "\x68\x17\x1c\xc7\x28\x20\x82\xec\xe3\xdf\x54\x10\xe6\x3c\x67\xbb"
+ "\x5c\x36\x6a\x29\x09\xd0\xca\xe3\x22\x58\xf1\x17\x75\x36\xa0\xb9"
+ "\x23\xc0\xfe\x8b\x96\x95\x53\x29\xf1\x64\x1e\x99\x9a\x1d\x35\xe4"
+ "\x9d\x1d\xa0\xd2\xe3\xa2\xbd\xa9\xe0\x0b\x6a\x71\xec\xa6\xfc\x56"
+ "\x32\x35\xb5\x7d\x46\x32\x16\xcf\xda\x33\xec\xf7\x68\x5b\x39\x9f"
+ "\xd3\x2e\xd0\xf2\x95\x34\x70\xf9\xa7\x64\xf5\xb6\xb7\xa2\x9e\x33"
+ "\xf4\xc8\x31\x4a\x00\x3c\xd3\x8a\xcf\xc8\xb6\xe2\x61\xf6\xf3\xcd"
+ "\xa1\xda\x32\xb2\x09\x57\x66\x6a\xb7\x2b\x33\xad\x5b\x64\x0e\xee"
+ "\x72\x65\xa6\xb7\x14\x23\x7f\xdb\x87\x34\xa8\x95\xd2\x3f\x3a\xdd"
+ "\x6a\xaa\x39\x4f\xc3\xb8\x4d\x27\xd1\xb6\xda\xf3\xc8\xbf\xf6\xe3"
+ "\x72\x0d\x65\x23\xcb\x84\x92\x3f\xae\xf1\xe6\x05\x49\x03\xac\x9a"
+ "\x6e\x1a\x56\xdb\x4d\x36\xad\xf2\xe3\x72\x2e\xd7\x41\x3f\x5d\xe6"
+ "\x6d\x22\x2a\x5d\x29\xc2\x3d\x6b\xf7\x16\x40\x27\x0e\x78\xe7\x89"
+ "\xfd\x66\x6f\x53\x07\x35\x07\xba\xa9\x85\xfe\x4a\x5e\xe7\x29\xcf"
+ "\x5b\x4f\xec\xe7\x35\xeb\x04\xcf\xf2\x36\xd4\xa5\x78\xc7\xd5\xcc"
+ "\x67\x95\xcb\xa9\xaa\x8c\x52\x8b\x97\xd3\x80\xd3\x48\x57\x73\xfb"
+ "\x06\x87\x37\x74\xca\xb3\x5c\xfa\xe3\xce\x3e\x5a\xd6\x4c\x89\x2d"
+ "\x81\x1a\x6e\xbf\x29\x9c\x72\x86\xbc\x81\xa3\xe4\x2d\xfe\x9b\x47"
+ "\xb3\x74\xb4\xaf\xd3\xc8\xf2\xf6\xc5\xa3\x26\xaf\xf9\x22\x79\xf3"
+ "\x02\x74\x10\x75\x8b\xb5\x67\x52\xa1\xb7\x72\x5a\x02\x41\x3e\xef"
+ "\x94\x25\x3a\x6d\x29\x55\x8b\x68\x64\xdd\x79\xca\xd8\x72\x9e\x32"
+ "\x45\x57\xa6\x89\x7d\x6c\xf9\x6c\xea\x16\x5c\x53\xdb\xc8\x82\xb6"
+ "\x2b\x7f\xec\x64\xdd\xd7\xb6\x27\x93\xea\xbb\xfb\x7c\x6d\xbb\x3b"
+ "\xfb\x7c\x6d\xc1\x53\x7e\xf6\xb7\xf5\xd1\x43\x6b\xac\x4d\x34\x00"
+ "\x72\xd2\xc0\xfc\x5d\x75\x96\xcc\xab\xcf\x12\xdd\x56\x6e\x22\xfb"
+ "\x3c\x3e\x67\xf1\xb3\xb9\x5e\xf4\x0d\xdf\x9f\xa0\x9f\x0d\xc3\x35"
+ "\x15\xbf\x04\xa4\xcb\xf8\x0d\x6d\x3a\x1f\x23\xcd\x84\xb4\x24\x5c"
+ "\x13\x21\x2f\x61\x57\xad\xf0\xa3\xae\xfd\x9d\x26\x4a\x61\x7e\xd6"
+ "\xfd\x7b\xf7\x77\xb9\x7f\x1a\xf0\xd1\x33\x1d\x06\x5f\x2b\x1d\x3f"
+ "\xd3\x7f\xf0\xc4\x19\x8e\x97\xe5\x97\x78\xf5\x38\x12\x38\x76\x96"
+ "\x9e\xce\x38\x3c\xc6\xf5\xa2\xfe\x1c\x5c\xad\xf8\x41\x4e\x7f\x7a"
+ "\xcc\x28\xdb\xd9\xe3\x40\x9d\x3f\x7b\x08\xe9\xc2\x48\x47\xbb\xcd"
+ "\xfc\xee\x77\x27\xce\x98\x54\x9e\x4c\x13\x60\x06\x75\xf8\x90\xfd"
+ "\x99\x9b\x58\xc6\x3b\x4d\x56\x71\xb8\x60\x0c\xd5\xbe\x22\x9a\xb6"
+ "\xbc\x22\x1a\x95\xec\xfd\xac\xc6\x47\x0b\x8d\xf8\x42\x8d\xeb\xf0"
+ "\xee\x30\x46\x1d\xa6\x4b\x63\x21\xfb\x93\xfd\x0c\xf6\xdf\xd5\x07"
+ "\x22\xdb\x20\xdc\x0f\xd4\xf0\x58\xfa\x9b\xb2\x23\x49\xd0\x01\x35"
+ "\x2d\x6d\x1d\xf4\x56\x77\x7b\x92\xeb\x8f\x64\xf2\x86\x4e\xd0\xe8"
+ "\x74\xb2\xb1\x3d\x58\xff\x8a\xf0\x6d\xe4\xf8\x7c\xaf\x88\x0e\xf0"
+ "\xcb\x0d\xa7\x29\x2f\xe9\xbb\xe9\x94\xfe\xaf\x4e\xd2\xf5\x53\xde"
+ "\x0d\x11\xfa\x69\x7b\xb3\x6f\x7f\x84\x6e\x9a\xfd\xd0\xa5\xba\xe9"
+ "\xd1\x07\x94\x6e\x82\xec\x4b\x5d\x14\xf6\xe9\xe9\xe3\x62\xd2\x75"
+ "\x3f\x91\x47\x87\xc7\xa4\x07\xf5\xf4\x81\x31\xe9\x7e\x95\xfe\xc8"
+ "\x54\x43\xf7\xb5\x30\x1e\x4b\x59\xf7\x3d\x72\x3b\xeb\xbe\x96\x02"
+ "\x5d\xf7\x49\xfd\xf3\xc8\x75\xe2\x5f\xa0\x8b\x96\xb0\xbe\x79\xf8"
+ "\x0c\xe3\x2f\x3e\x22\x03\xf7\x64\xa4\xbd\xcd\x69\xd5\x7f\x25\x33"
+ "\x7e\x86\xde\x13\xac\xf7\x58\xe7\xb1\xee\xdb\x3c\x44\xb4\x6e\x7e"
+ "\x45\x1c\xab\x95\xb1\x7f\x1e\xee\xd5\x7f\x2f\x22\x6d\x1d\xd2\x5e"
+ "\xc4\x7b\xd6\x83\x4c\x93\xe6\xbc\xfd\xc4\xfe\x27\xb0\xb5\x42\x9a"
+ "\x29\x8b\x36\xa0\xbf\xf9\xbc\xe1\x1a\xd0\xd7\x9a\x40\xc5\xde\x12"
+ "\x3e\xc3\x1a\x66\x9f\xb4\xb6\x96\x92\x36\x96\xbb\x21\xab\x21\x67"
+ "\x5e\xe7\x17\x54\x16\x10\xa7\xf9\xdc\x1d\xe3\x90\xbf\xec\x7e\x8e"
+ "\x97\x94\xd0\x88\xd9\x30\xfb\x85\xb3\xce\x06\x2e\xe6\x6a\xe0\xa4"
+ "\xe2\xb3\x3c\xbc\xcd\x47\xdb\xca\x55\x5f\xcf\x3e\xca\x71\xd9\x4e"
+ "\x50\x5e\x3b\xe6\x7b\x41\x6e\x9b\x35\x5c\x4e\x7c\x0e\x86\x63\x15"
+ "\xf2\x75\xb3\x49\x73\x54\x1b\x67\x61\xdc\xd0\x0d\xc8\xe3\x6d\x0d"
+ "\x12\xe3\xec\xa3\x87\xc7\x34\x97\xee\xe7\xf2\xad\x4c\x1b\xe1\x76"
+ "\x19\x30\x12\x24\x0c\x93\x9c\x37\x3a\x90\x4f\xad\x9d\xa7\xec\x2d"
+ "\x68\x9e\xed\x27\xd6\xfb\xde\x76\xc0\x28\x3d\xa1\x60\x00\x96\xc0"
+ "\x18\x10\xf5\x4e\x87\x3f\x70\xa5\xf8\x07\xe0\x6f\xe3\xfe\xe2\x73"
+ "\x91\xbc\xdf\x06\xba\xa4\xb2\xaf\xbc\xb2\x45\x1f\x1e\x55\xff\x57"
+ "\x22\xfd\x6c\x27\xf8\xed\xe1\x91\x7c\x6e\x89\xcf\x73\x5e\xee\x2c"
+ "\x27\x68\x94\x61\x9c\xe7\xd4\x96\xfe\xef\x9e\xe5\x04\x6c\x5b\x9d"
+ "\x49\xec\x06\xfe\x23\xf9\x3c\x27\xf0\x5f\xc7\x7c\xa8\xb7\x29\xeb"
+ "\xe5\x47\x24\xcd\x4b\x38\x0d\x73\xc7\x23\x46\xff\x73\x7b\xb9\x2d"
+ "\x78\x97\xa7\x6c\x44\x81\xf9\xc7\xa3\x59\xfc\x1e\x69\x13\x39\xff"
+ "\x68\xe8\x31\x2f\xc6\xb0\x77\x4e\x84\x4d\x55\xcb\xc9\xac\x74\xda"
+ "\xec\xc9\x5c\x5e\xe9\xb4\xd9\xd4\xa7\xd3\x1e\xbd\xa0\x74\x9a\xa2"
+ "\xb1\xd2\x69\x8f\xfe\x5d\xe9\xb4\x47\x3f\x97\xfb\x62\xd0\x69\xfc"
+ "\x8e\xf5\x9a\xa1\xd3\xb6\x0c\x11\x47\x58\x77\x74\xb9\x1f\x3d\x6a"
+ "\xe8\xb6\xf5\x48\x63\xdd\xc1\x38\x2a\x3d\xf5\x48\xa6\xf8\x7f\x33"
+ "\x49\xf9\x1d\xf0\xbd\x83\xcf\x2f\xb4\xeb\xf7\x3c\x9e\x8c\x57\x3a"
+ "\x6e\x76\x46\x9f\x8e\x7b\xb4\xa1\xaf\x2c\xeb\xb8\xd9\x3f\x54\x3a"
+ "\x4e\xa5\xd7\x3f\xc2\x3a\xee\x91\x4c\xa6\x81\x0e\xdf\xc4\x6b\x78"
+ "\x7a\x7e\xa6\x63\x56\xa4\x8e\x8b\x96\xaf\xd9\xa5\x86\x8e\x63\xdd"
+ "\x86\xe7\x75\xd0\x69\x72\x0e\xc9\x72\xb6\x09\x34\x37\xe4\x8e\xfb"
+ "\x80\xdb\xcc\xf1\xd7\x98\x6e\x13\xce\xd0\x00\xfd\xec\x90\xde\xee"
+ "\xd9\x47\x0c\xdf\x47\xd0\xff\x68\x3c\x3b\xba\x2f\x46\x22\x7d\x9b"
+ "\xcf\xce\x7b\xcb\x4f\x90\xb7\x46\x94\xb7\x84\x8e\x53\x7e\x09\x74"
+ "\x45\xe2\xd3\x9f\x73\xdf\x62\xde\xf1\x23\xbe\xb2\xee\x39\x4d\x8f"
+ "\x0d\xcc\x0f\xd0\x55\x98\xab\x7f\x5e\x65\xc2\x3b\x67\xd4\x3b\xb9"
+ "\xc6\x70\xdb\x22\x8e\xaf\x07\x41\xe8\x67\xbe\x7f\x85\xf5\xad\xbc"
+ "\x4c\x7d\xaf\xc9\xfa\x60\x53\x61\x0e\x74\xcd\x59\x7a\x4c\xce\x4b"
+ "\x64\x7c\x9b\xd5\x71\x61\xfd\x51\x7f\x9f\xd4\xcf\xfb\xbf\x5f\xbe"
+ "\xfc\xe3\xc9\x97\x2f\xff\xf8\x2d\xac\x8b\xd0\x3e\x6b\xd8\x1d\x0d"
+ "\x67\x50\xc8\xc8\x77\x9a\xf3\x3d\xa0\xaf\xc5\x7c\xee\x1a\x2e\xe7"
+ "\x68\x36\x03\x26\xf3\xdf\x06\xe4\x93\x31\x43\xa0\x2b\x27\x2e\x23"
+ "\x8e\xd7\x12\x59\x76\x7d\x1f\x8d\x1f\xcf\xb9\xcc\xba\x5f\xaa\xb7"
+ "\x86\x64\xcc\xd8\xc3\xb0\x49\x39\xa6\xd1\xa6\xde\xf5\x8f\xc7\xdb"
+ "\xa0\x37\x7d\x11\x7e\xb1\x3c\x1f\xfb\x36\xc7\x35\x60\xfb\xb2\x4a"
+ "\xcd\x37\xaf\x87\x7e\x1e\xcc\xe7\x61\xf8\x6c\x4c\x7e\x78\x86\xe9"
+ "\xb0\x8c\x65\x96\x6f\x37\xca\xf6\xb7\xce\xc2\xf5\xea\x75\xb2\x8f"
+ "\x69\x00\x65\x66\x19\x65\x18\x36\xfb\x29\x62\x5c\xfe\xb6\x3c\x53"
+ "\x1a\xea\x60\x5d\x78\x3d\x6c\xd1\xc1\xaa\x9e\x02\xd2\xeb\xa9\xf0"
+ "\xd1\x63\x33\x2e\x77\x36\xa3\xff\xf6\xe5\x37\x5e\x79\xfb\x48\x6f"
+ "\x5f\x01\x7d\x45\xfb\x2e\x53\x6f\xc1\xd8\x2b\xaf\x37\xcd\xa8\xd7"
+ "\x79\xe5\x74\x2d\xd8\xf5\xf5\xe9\x9a\xa5\xd3\xb5\xc0\xf7\x15\x74"
+ "\x8d\x53\xcf\x9c\xf4\xaf\x5f\x8f\x5d\xaf\x67\x4e\x6e\xbc\x7a\x48"
+ "\xfe\xf5\x7b\x6e\xca\x62\xc4\xda\xec\x84\xec\xa8\x58\x75\x73\xaa"
+ "\x23\xe3\x17\x77\x4a\xb9\x9a\xb3\xad\x37\x5e\xb2\xda\x2b\x87\xae"
+ "\x9e\x73\x28\x7f\x2b\x8f\xef\x42\xf3\xd1\x9c\x46\x8e\xe3\x3a\x71"
+ "\xa5\x3a\x93\xad\x97\x69\xbd\x5c\xdc\x64\x8e\xd1\xc5\x31\xf9\xbc"
+ "\x36\xb4\xbd\x86\x63\x97\x1c\x2a\x60\xff\x7b\xcc\xa9\xa0\xe3\x9f"
+ "\xb8\x81\x63\x8e\xe1\x7e\x00\xee\x33\x95\x0e\x78\x22\x13\xf5\xf4"
+ "\x7f\x76\x72\xed\xa1\xe2\x6d\x65\x59\x49\xfd\xf9\xd7\xa3\x3c\x6c"
+ "\x8a\x67\xe5\xda\x94\x96\x72\x70\x06\xe6\x12\x7a\xbc\xbf\xc2\x2f"
+ "\x64\x0c\x38\x57\x1e\x9f\x27\xc1\xb8\x58\x38\x50\x3f\x07\x00\x7a"
+ "\x94\x83\xae\x4f\x6c\x35\xe8\x61\xa4\x23\x6d\x8f\x41\x0f\xd8\x37"
+ "\xa9\xde\xad\x21\x3e\xa7\x13\x50\x67\xb2\x9f\xf8\x77\x51\x79\xc8"
+ "\xa1\x60\x3f\xa9\xf6\x68\xb8\xbe\x9e\x3c\xb3\x9c\x37\x95\xf1\xbc"
+ "\xe9\xc9\x03\xfe\xe4\x43\x0e\x03\x0f\xb1\xd8\x66\xe2\xb3\xdf\xa3"
+ "\x31\x96\x6e\x50\x31\xf7\x12\xf8\x9c\x9c\x7c\xbf\x38\xd3\xa4\x68"
+ "\xf2\xe4\x38\xd1\xc9\xb1\x63\x24\xec\x54\xe0\xd9\xc6\x70\x7d\xb8"
+ "\xfa\x57\x64\x72\xdc\x0b\xbd\x3d\x4f\x8e\xd0\xd6\x1e\x9c\xa1\x75"
+ "\xd9\x4c\x06\xbe\x75\xf2\x4c\xeb\x93\x68\x7f\x81\x8a\x13\x2b\xf1"
+ "\xb1\x99\xd8\x9f\x5f\x4b\x39\x54\x2c\x56\xd8\x68\xcf\xa2\x76\x39"
+ "\x6f\xe2\x3a\x47\xa3\x7e\xc1\xf3\x24\xd8\x26\x28\xb7\xb5\x97\x6e"
+ "\x80\x2b\xba\x0c\xba\x3d\x39\x45\x8d\xcb\xaa\x8d\x81\x15\x36\xd3"
+ "\x61\xbf\x3c\x6f\x47\x19\x76\xd7\x97\x2a\x16\xf6\x93\xc7\x0d\xda"
+ "\xf5\xe2\x04\x7c\x38\x8f\xf2\x6f\x7a\x32\x64\xe0\x24\x65\x37\x85"
+ "\xcf\xef\x3e\xe1\xe7\x73\x43\x8a\xfe\x87\x53\xbb\xdc\x85\xf6\x4b"
+ "\xe9\x5f\x38\x26\x82\xfe\x89\xcc\x7b\x4c\x7f\x5e\xeb\x00\x5d\x1e"
+ "\x03\x2d\x2d\xea\xbc\x03\xdb\x33\x85\x73\xf1\x9c\xca\x78\x6a\x95"
+ "\x06\xcd\xf3\xcc\x6a\x9d\xac\xb0\x26\xa2\x1f\xd0\x5e\x1b\xdb\x6a"
+ "\x09\x46\xfb\xb9\x0c\xd3\x80\xe3\x4a\x72\xdd\xc0\xe7\x6a\xd4\xbd"
+ "\x3b\xb6\x4d\xab\xd5\x59\x12\x52\xbe\x25\x85\x47\x23\x62\x8b\xfb"
+ "\x4b\xec\x22\xa8\xce\x25\x17\x3a\xf7\x94\xf9\xcd\xfd\xe9\x00\xe6"
+ "\x41\x19\xa3\xd2\x24\xd7\x15\x60\x73\xcd\xfb\x44\x00\x37\xd5\xf7"
+ "\xf3\xb6\xa8\xb4\xb9\x7f\xc7\x15\x3c\x36\x77\xbc\x40\xdd\x7e\x97"
+ "\x8c\xb1\x82\xb6\xcd\xf3\x31\xcf\x19\x7c\xc6\xeb\x90\xca\x67\x7c"
+ "\xee\x76\xd6\x29\x06\xcd\x81\x7f\x4a\x97\x7b\x6e\xb1\x81\xbf\x91"
+ "\x9f\xfb\x8e\xf3\xf0\x9e\x4d\xa3\x3d\x28\x75\xad\x3a\x33\x34\xb7"
+ "\xd6\x90\x61\xae\x83\xfb\x99\x75\x0d\xd3\x43\xd1\x62\xee\x81\x68"
+ "\x58\x36\x93\x8a\x9b\xc9\x3c\x0f\x79\x5c\x1e\x4c\x42\x1e\x5f\x1f"
+ "\x8c\xb9\xb3\xd5\xbb\x5e\x3c\xd9\xcf\x5f\xfa\xe2\xa9\xfe\x98\x37"
+ "\x99\xdb\xd5\x87\x2f\xcb\xdf\xbc\xde\xfe\xe7\x77\x01\x97\x8d\x63"
+ "\xf0\x4a\x1d\x53\x32\x9c\xf1\xf5\x73\x6c\x5b\xc9\xeb\x80\x5f\xcd"
+ "\xb8\x73\x1e\xa3\xcf\xfa\x78\x71\x9e\x23\x12\x8e\x70\x49\x5c\x25"
+ "\x1c\xa5\x3b\xfc\xbc\xb7\x6d\x57\xfb\x2d\xf3\x36\x45\xb4\x3b\xd5"
+ "\xc0\xa7\x4f\x27\xcc\xdb\x13\xcb\x93\x5c\x37\xc7\xe2\xd3\x61\xb3"
+ "\x2e\x49\x3b\x41\xf3\xb6\xea\x78\xd9\xb8\x1f\xfb\x1b\xdf\x38\xce"
+ "\x25\xc7\x3e\xdd\xa8\x74\x08\xfa\xd9\x31\x7c\xa3\x3a\x47\x14\x50"
+ "\xf1\x4f\x7f\x3e\x42\x98\x7e\xc5\xb4\xe2\xf5\x74\xbf\x8c\xd7\x21"
+ "\xcf\x98\xff\x9c\xf7\xf8\xc5\xa0\xe2\x5f\xc9\x58\xb7\xba\x6f\xa0"
+ "\xbf\xb1\x38\x24\x63\xf9\xb9\x4a\xf8\xcc\x6d\x88\xe7\x7a\xd2\xf7"
+ "\xed\x70\x49\x88\x66\x06\x59\x26\x7e\x5e\xc2\x67\xe9\x55\x1c\xf1"
+ "\x9f\x97\x1b\xe7\xe7\x39\x76\x26\xc7\x7d\x85\x1e\x4a\xec\x8b\xdb"
+ "\xea\xc8\x63\x1b\x4b\xef\x5f\xda\x60\x12\x47\x95\xfc\xff\xfc\x8f"
+ "\x7c\x5e\x5e\xed\x63\x9d\x80\x4e\x48\x3c\x75\x82\x7e\xfe\xb9\x5a"
+ "\xf7\x31\x74\x94\xe3\x61\xde\xcb\xf2\xe9\x30\x50\x57\x07\xe4\x7b"
+ "\xc6\xa5\xba\xe4\xe7\x7f\x34\xe6\x2e\x7c\xfe\x4e\xed\x8b\xf5\xc1"
+ "\xf3\xd1\xcf\xe5\x5c\xb0\xaf\x0f\x3e\x06\x2c\x47\xf6\xa5\x7a\xc1"
+ "\x31\xc5\x90\xbd\xe2\x1b\xf9\x0c\xf7\xcf\xd3\xb8\xfe\xfe\xc6\x0b"
+ "\xe1\x7a\x98\xfb\xc9\x72\xd2\x1e\xbf\x6f\xe2\xef\xb3\x39\x76\x1b"
+ "\x6d\x30\x68\xa2\xda\x30\x3f\xb9\x33\x65\xef\xba\xbe\xb6\xcf\x97"
+ "\xb6\x6b\xc4\xfb\xf1\x11\xb4\xe1\xe7\x1c\x35\xae\xcd\x07\x7d\x0a"
+ "\xf5\x58\xb5\x2a\x0d\xb2\xf3\xb4\x58\x91\x47\x0a\xc7\xf9\x64\xc8"
+ "\x3a\xf2\x8e\xf4\xd1\x05\x9b\xda\xef\x9a\x8f\xf6\x3b\x2a\x54\x39"
+ "\xc7\x31\xc6\x25\x6e\x3b\xa3\x71\xdc\xcf\xb6\x86\x8a\xa9\x30\xff"
+ "\x7d\xc6\xd7\x7e\x13\xf7\xf1\xfc\xe7\xa5\x0e\xe7\xf8\x0a\x3d\x8e"
+ "\xa4\x40\x4f\x26\x75\xf6\x38\xa0\x17\x32\x4d\xa8\x07\xfa\xbf\x33"
+ "\xa0\xd7\xb9\xcb\xc0\x95\x71\x93\xf1\x39\xc5\xfc\xf8\xf4\xe5\x7a"
+ "\x65\xcc\x27\xc7\x00\xfc\x2c\xf8\x5d\xf5\x75\xed\x12\xd8\xe9\xed"
+ "\xfe\xca\x03\x69\xda\x12\x71\x84\xe3\x8b\x61\x2e\xd2\x5e\x05\xfe"
+ "\x1d\xb4\xca\x03\xdb\xfc\x31\x53\xfe\x32\xca\xc1\x9c\x99\xc4\x45"
+ "\x91\x5d\xa7\xe1\xba\x44\x8c\xe1\x38\xe3\x78\xce\xd2\x9f\x47\xf2"
+ "\x73\xe7\x12\x31\xbb\xcb\xfd\x54\x81\xb1\x47\xa8\x62\xe3\x3c\x55"
+ "\xdc\x1b\x4f\x28\xf1\x51\x3e\x4f\xc4\x71\xa7\x34\xcc\x85\xda\xb9"
+ "\xde\x7c\x9e\xcf\xa2\x3e\xe4\xab\x81\xbd\xd1\xc6\xf9\xfc\x89\xb7"
+ "\x0e\xc6\x2f\xb3\x9f\xbd\xd4\x76\xc6\xab\x33\xf9\x40\x9a\x81\xeb"
+ "\xa0\x40\x8e\xe9\x6b\xe2\x16\x32\x70\x43\xfa\x91\x2a\x95\x1e\xe2"
+ "\xf8\x87\xec\xeb\xd8\xe5\x7e\x7a\x98\x81\xab\x81\x03\xd7\xc7\xe7"
+ "\x37\x45\xca\xde\x1a\x8e\x3d\xc3\xf5\x71\x3c\x55\xe4\xcd\x35\xf0"
+ "\xfd\xba\xbc\x5c\x56\x2b\x04\x8f\x9f\xac\x7f\xed\x43\x89\x5a\x02"
+ "\xac\x53\x9e\xae\x3d\x5c\x1b\xe0\xf5\xee\xd7\x51\xc7\x6b\x9d\xc2"
+ "\x41\x5a\x8f\x23\x6e\x1f\x73\x19\xe4\x6f\x95\xfa\x61\xed\xde\xd7"
+ "\x34\x91\x0b\x3d\x81\x72\x3d\xb9\xbc\xd6\x04\xb9\x2d\x32\x37\x96"
+ "\xb6\xf3\x99\x4b\xe8\x9c\x22\x33\xf2\xd4\xb0\x9d\x85\xf9\x56\x50"
+ "\x7e\xbf\x02\xba\xc9\xb3\x64\x0c\x60\x14\x25\x99\x9d\x64\x6e\x8c"
+ "\x89\x53\xd5\x1f\x7f\x74\x5a\x0e\x56\x74\xae\x3d\x58\xd0\xe5\x2e"
+ "\x82\xfd\xff\x4c\xbf\x7b\xbe\xab\x87\x80\x9e\xc8\x57\x3d\x94\xe7"
+ "\x7b\x45\x8e\xcb\xe5\x35\xf6\xab\x59\x07\x8d\xb6\x51\xaa\x48\x3e"
+ "\x58\xc1\xfa\xb6\x33\xe5\x60\x01\x8f\x25\x28\xdf\x60\x94\xe7\x71"
+ "\x9d\xc7\x0e\xf4\x97\xad\xaa\x57\x1f\x16\x1d\x55\xf2\x5c\x74\xd4"
+ "\x90\xd1\x78\xf5\x94\x6c\x13\x9a\x6b\x04\x99\xbc\x18\xb7\x6e\x0b"
+ "\x52\x6a\xdd\xeb\x44\xd5\xcb\x45\x70\xe3\x72\xcc\x61\x86\xf2\xf7"
+ "\x2e\x8a\x72\x59\x46\x99\xbf\x37\x80\x5f\x12\x81\xcb\xc6\x8b\xa8"
+ "\xb3\x4c\xe5\xd3\xfd\xd6\x6d\xc8\x57\x82\x6b\xba\x30\x99\x68\x53"
+ "\x19\x59\x36\x69\x64\xae\x2e\xa3\x61\x48\x83\xad\xfb\xcc\x2c\x43"
+ "\x66\xe3\xe1\x50\x55\x47\xf4\x12\xea\x5d\x55\x26\x42\x1f\x63\x3c"
+ "\x77\x6b\x22\xf8\x75\xe8\x8e\xf6\xef\x51\x6d\x7c\x66\x8f\x61\x13"
+ "\xe2\xde\x13\xed\x77\xf0\xcc\x25\x67\xbc\x9f\x58\xb8\xb0\x24\x7f"
+ "\xd1\x5c\xbe\x64\x8e\x78\xee\x96\x94\xc8\xb5\x10\x1e\xff\x54\x9c"
+ "\x8a\x67\x5a\x79\xdd\x71\xe3\x60\x63\x1f\x7d\x81\xcd\x58\xfb\xd4"
+ "\xfd\xf5\xef\xe6\x39\x1d\xcf\x7d\xf0\x6e\xcc\xa1\xd2\x95\x0c\x26"
+ "\xe1\x73\x0b\x99\x62\xeb\x9b\x37\xa7\x64\x4e\xd1\x5d\xbc\x63\x96"
+ "\x12\xa7\x9e\x05\xb9\x31\xf5\x94\xf7\xd6\xa3\xc6\x9f\x80\x89\xf3"
+ "\xad\x4f\xdc\x2a\x92\xdb\x73\xd4\x59\xe9\x05\xdb\x8c\x35\xad\x7e"
+ "\xfc\x1c\x5b\xc3\x6b\x3f\xf6\xb0\x3c\xb8\x56\x92\xe9\x77\xcb\x5b"
+ "\x4d\x6c\x47\x96\xe1\x9e\xd7\x16\xe4\x1a\x99\x1e\x2f\xea\xa3\xf3"
+ "\xad\x18\xdf\x17\x04\x45\xe5\x5e\xcc\x8f\x16\xf4\xbb\x66\x13\xe9"
+ "\x23\xc2\x3e\x85\x6d\xb4\x30\xed\x72\x3e\x47\x9c\x9f\xdb\xc3\x3c"
+ "\x1b\x53\xee\x79\xd5\x67\x0b\xc1\xff\x45\xf6\xde\xf3\xbc\x7a\x9e"
+ "\xaa\x21\x46\x1c\xae\x85\xb3\xfb\xf5\x17\xa9\x38\x58\xad\x78\x7c"
+ "\xe1\x27\x8d\x98\xaf\xa1\x9d\xbf\x38\x41\x0b\x0f\x99\x6d\xb0\x11"
+ "\x86\xd2\x4e\xdc\x7f\xc2\x65\xf9\x5d\x14\x1f\xdd\x70\x66\xab\x19"
+ "\xda\x05\x5a\x26\x41\xa8\x3f\x32\xeb\x37\x89\xf8\x99\x44\x82\xdc"
+ "\x4d\x4d\x44\x0f\x0e\xb8\xca\x4c\xd6\x41\xa9\x96\x6f\x7f\x6b\x98"
+ "\xed\xee\x1f\x8f\xcd\x76\x95\x95\x42\x2b\x87\x82\x56\x11\x19\x3f"
+ "\xed\x54\xfb\x43\xb7\x94\x93\xf4\xa7\xa9\x3c\x15\xf7\x2c\xe5\x7a"
+ "\xb7\x28\xe6\xb3\xeb\x5a\x8a\x48\x73\x3d\x47\xa6\x77\xba\x7d\x26"
+ "\x8e\xd1\xcc\xf6\x33\x7f\xeb\xe2\x04\x15\x3f\x70\x10\x69\xa0\x97"
+ "\x53\x54\x88\x34\x65\x77\x16\xff\x52\x5b\x2b\xd2\xfa\xe0\x9b\x89"
+ "\xe1\xbb\x5e\x23\xd3\xb6\xb2\x76\x93\xd7\xfc\x63\xf2\xda\x03\x74"
+ "\x10\xf7\x71\xfb\x0a\x75\xb2\x2d\xcb\x30\xea\xdd\x1a\xc7\xeb\x32"
+ "\xe9\xe7\x4f\x4d\x67\xa9\xf8\x8f\xbb\xfb\x29\xc7\xe7\xbd\x3b\x53"
+ "\x3e\xf8\xb7\x2e\xf7\xb3\x66\x1f\xdd\x33\x51\xb7\x65\x30\xe6\x3e"
+ "\x8b\xf9\xff\x42\x19\xe7\x09\xef\x3f\xe5\xef\xc2\x20\x2d\xd3\xc8"
+ "\x13\xdf\x9e\xe1\x35\x78\xe1\x61\x3e\x10\x17\xff\xde\xce\x67\x5b"
+ "\xfa\xf1\x83\x19\xe0\x75\xde\xc1\x7b\x91\x49\x83\xa0\x7f\x5c\x17"
+ "\x44\x4f\xd8\x4d\xe9\x10\x27\x53\xd8\x44\xdf\x0e\x5d\x14\x79\xcd"
+ "\x1d\xe7\x65\x4c\x53\xd6\x35\xbf\x99\xf7\xb1\xc9\x1b\x3c\xe7\xf1"
+ "\xae\xd1\xa8\x05\x76\xa5\xb7\xf6\x9c\x47\xc5\x3e\x0d\x53\x33\xfd"
+ "\x95\x9a\x9d\xff\xb7\xdc\x5b\xfe\x57\xa4\x0b\x19\x0b\xbb\xe7\xa2"
+ "\x98\xe5\x35\xff\x1b\xf1\x77\x8a\x78\x8c\x03\xdd\xed\x67\xe9\xd9"
+ "\x7f\x7c\x04\x38\xef\xfc\x07\x60\xc9\x98\x69\xe3\xe8\x20\xee\xd1"
+ "\xa6\xde\xf1\x2f\x6e\xac\x99\x04\xcf\x7a\xab\xf3\x31\x93\x86\xb1"
+ "\x94\x63\xdb\x61\x0c\x1d\xc3\xed\xc2\x73\x16\x3f\xe3\x3a\x92\xaf"
+ "\xd6\x55\x9e\x2d\xd6\xd0\x63\x3c\xb6\xe6\xf1\xb8\x89\xf4\x59\xf5"
+ "\x17\xe5\x58\x3b\x43\x7f\x9e\xa2\x3f\xe7\xea\xcf\x13\xf5\xe7\x1c"
+ "\xfd\x99\xd7\xe5\xf5\x31\x79\x51\x75\xaf\xbd\x60\x1a\x70\x14\xcf"
+ "\x5b\x8d\xbe\x00\x3e\x03\xad\xce\x95\x72\x6c\xd7\xf1\x18\xa3\xe3"
+ "\x95\xa5\x3f\x1b\xf8\xdc\x60\x0d\xad\xfc\x5f\xc2\x67\xb1\x3d\x1a"
+ "\x9f\xc5\x59\x11\xf8\x90\xd5\x99\xf3\x75\xf0\x49\xb3\xf2\x77\x22"
+ "\xfe\x07\xf8\x30\x2e\x9c\x86\xfa\x77\xc7\xe0\xe3\x31\xf0\x89\xcb"
+ "\x6f\x4b\x44\x3b\xdb\x35\x8b\xbf\x21\xe3\x3a\x0f\x60\x9b\xa5\xbe"
+ "\xdb\x88\x53\xb8\x38\x74\xb9\x38\x85\x90\x05\x8c\xdb\x25\x68\xff"
+ "\xe2\x26\xdd\x7e\x3b\xa0\xec\xfc\x92\x31\x86\xef\x18\xda\xda\x50"
+ "\xa5\xda\xba\x6b\x0d\xc7\xea\x5b\x46\xdf\x74\x39\x45\x3b\xe6\xdd"
+ "\xff\xc9\x73\xc3\x48\xb8\x45\x25\x8b\x17\x3f\x73\x97\xbd\x68\xce"
+ "\x82\xb9\xf6\x11\x85\xf6\xc5\x8e\xf9\xf3\x4a\xe6\x46\xfb\x53\xa4"
+ "\xe9\xdf\xef\x91\xe7\x44\x78\x2e\x25\xe7\xd2\xe0\x7f\xa9\x27\xa5"
+ "\x4f\x5e\xc9\x05\xe1\x2e\x29\x60\x9d\x5b\xf7\x92\xfa\xce\x13\xf0"
+ "\x69\x34\xc6\x10\x63\xfe\xcb\x63\x08\xd2\x8f\x63\x9c\x9c\x1d\x91"
+ "\xce\x79\xfd\x46\x1a\xc3\xd7\x75\xd3\x80\x13\x54\xf2\x4b\xae\x33"
+ "\x2e\x0d\x2f\x8a\xad\xb0\x9b\xf8\x1b\x16\x26\xe8\x14\xc1\x71\xb7"
+ "\xf8\xfc\x25\xca\x89\x93\xf4\x9c\x9c\x57\xcc\xc2\xb3\x9a\xb3\x09"
+ "\xe0\xf8\xdc\x43\x28\xb3\x0d\x69\x66\xb6\x21\x30\x0f\x6c\xe7\x72"
+ "\x48\x7f\x86\xe3\x60\x20\xdd\xa2\xc7\x13\xe3\xb4\x55\x1c\xa7\x02"
+ "\x69\x69\x11\x69\x2f\x23\xcd\x86\x34\xbb\x0e\x6f\x3b\xd3\x19\xcf"
+ "\x39\xfa\x3a\x19\xe7\x79\x5f\xaf\xb7\x3c\x12\x67\xfe\x86\xcb\x1d"
+ "\xb7\x65\xd9\x67\xcd\xfc\xfe\xb8\x1f\x3f\xb9\x70\xc1\xbc\x14\x92"
+ "\x64\xcf\xc4\x70\x9c\x75\x87\xf3\x96\xbb\xec\xc5\x73\xe7\x2e\xb2"
+ "\x2f\x9d\xbb\xa0\xc4\x3e\x67\xe9\x9c\x65\x29\x34\x6f\xe1\xa2\x27"
+ "\x39\xca\x02\x77\xcb\xe2\xfc\x27\xe7\xfd\x9c\x9d\x5e\x54\xee\x94"
+ "\x28\x3b\x61\x16\xeb\x36\x3d\x2e\xc9\x91\x2a\xb6\x21\x93\x3d\x79"
+ "\xb8\xe7\x78\x5d\x36\x5c\x1b\xf1\x3b\x80\xdf\x7e\xfc\x8e\xe1\x77"
+ "\xf4\x34\xad\x58\x83\xeb\x9e\x2e\xf7\x92\x42\xc3\x5e\xe9\xe3\xa1"
+ "\x25\x4e\x83\x87\x60\x5f\xec\x51\xe3\xdb\x92\x86\x96\x90\x94\x9f"
+ "\x5e\x9e\xaa\xba\xd8\xc7\x53\x1c\x6f\xb4\x85\x7d\xba\x96\xe0\x7d"
+ "\xb7\x5c\xab\xe4\x35\x93\x64\xa6\xdb\x49\x5a\xb6\xa5\xfe\x15\xd1"
+ "\xc4\xb1\x72\x70\x6d\x04\xbf\x34\xa9\xf8\x34\x4b\x33\x90\x6f\x38"
+ "\xea\x38\xa0\xea\xd0\x9f\x87\x88\x23\xfc\x0d\x97\x13\xfa\x33\xc3"
+ "\x02\x8c\x3b\xf9\x9e\xaf\xfa\xde\xa9\x55\xff\xc6\x9b\xa9\xef\xdd"
+ "\xd2\x66\xbd\x0e\x0f\x68\x51\x5e\xe7\x96\x73\x29\x39\x77\xe6\x35"
+ "\x62\x6b\xc2\xdd\x02\xf8\x9c\xd3\x12\x1f\x6d\x95\xf1\x2f\xcb\xbb"
+ "\xa1\x23\xbe\xf7\x3d\xaf\x53\xe6\x4f\xe0\x35\xe4\x69\xc5\x42\xe3"
+ "\x38\xe4\x5a\xe2\xd3\xad\x5c\x4e\x58\x3c\x79\xda\x86\x81\x39\xca"
+ "\x66\xe0\xb8\x83\x4b\x1b\x74\x98\x41\xa6\xed\x69\x5a\xf2\xb0\x9a"
+ "\x87\xaf\x58\xa3\x6c\x89\xa5\x7b\x0c\x5f\x4b\xc8\x68\x26\x9e\x1b"
+ "\x0d\x1d\xe0\xa3\xa5\xd5\xba\x5f\x9c\x47\x6f\x7f\x48\x7f\xde\xaf"
+ "\xe3\x98\xc0\xb1\x50\x80\xff\x51\xee\x3b\xd8\x2b\xfb\x71\x7f\x0c"
+ "\xf4\x69\x52\xf4\x71\xca\x38\x07\xb0\x9b\xf8\xfd\x31\xfe\xde\x0d"
+ "\xde\x1d\x53\x71\x46\x96\x8e\xe1\x36\xf7\xf9\xce\xd6\xe6\x00\xd7"
+ "\x3b\x79\x8f\x19\xb2\xb4\xdf\x7b\x91\xe5\x73\x69\x16\xe0\xed\x36"
+ "\xf4\x0e\xeb\x99\xfc\x30\xe4\x54\xce\xa7\x9c\x45\x86\xbe\xe9\xe3"
+ "\x03\x67\x79\x3c\x5d\x12\xaf\xdf\x15\xfd\x9d\x7f\x17\xee\xe7\x1a"
+ "\x81\xd3\x6e\xd9\x07\x1c\x8f\xf5\x62\xef\xbc\xad\x47\xe9\x48\xe7"
+ "\xb1\xde\x39\xa6\x8e\x07\xc7\x76\xf7\x31\x6e\xdd\x72\xdf\x5f\xd7"
+ "\x1b\xce\x90\xa1\x37\x0c\x38\xd6\x04\xa1\x59\x9d\xf8\x57\xb1\xcf"
+ "\xc9\x7b\x24\x3c\x5e\x4a\x7b\x04\x70\x06\x5d\x50\x67\xe0\xb4\xca"
+ "\x7d\xe0\x5d\xe7\x1e\xfe\xe6\x9b\xb4\x69\xdd\xcf\xfd\xdf\x3e\x5d"
+ "\xb4\x6c\x46\x24\x4c\x61\xd9\xe7\x64\xb8\xac\x8f\xd8\x26\xc9\x0f"
+ "\x9b\x39\x0e\x8d\x53\x1f\x5f\xa0\x83\x97\x95\x1b\xb8\x82\x86\x47"
+ "\x0c\x7c\xf5\x6f\x8e\x1d\x41\x3d\xbe\xe9\xe1\x1e\xf6\x05\x6f\x54"
+ "\xfd\xb9\x42\xea\x1b\xbc\xdb\x85\xb2\x07\x7c\xf4\x5c\x9a\x2e\x43"
+ "\x4d\x28\xbf\xeb\x70\xd9\x44\xe4\x59\xd6\xaa\xfb\x33\x1f\x45\xff"
+ "\x1e\xeb\xe3\xfd\x25\xcd\x11\xeb\x3c\xc7\x54\x1f\xfe\xb8\xfc\x04"
+ "\x2d\xb7\x45\xa4\xeb\x7d\x7b\x78\x06\xd2\x9b\xd5\x9a\xc9\x3e\x3d"
+ "\xbe\xdf\x72\xe5\xbb\xaa\xe3\xc8\xba\x80\xcf\xeb\xb1\x8c\x4b\xda"
+ "\xcb\x3e\x5e\x3e\xc3\x18\x2f\x00\x6b\x8f\xa4\xf9\x10\x71\x80\xe9"
+ "\xa4\xe2\x7d\x3c\x77\x51\xd1\x69\xb9\x33\x8a\xf6\x3c\x6e\xa2\x1e"
+ "\xa6\xd3\xa0\x55\x42\x1b\x14\x48\x10\xf9\xcb\xcc\xc4\xf2\xc2\x32"
+ "\xce\x7b\x83\xe0\x0f\x69\x57\x29\xba\x2d\xdf\x6f\xd0\xcd\xe8\x3b"
+ "\xa6\x93\x8f\x96\x67\x32\x6d\xa3\xdb\x38\xe0\xe8\x09\xa3\xed\xa0"
+ "\x29\xc7\x34\xc5\x73\x93\x2e\x17\x4d\x9e\xa1\xec\x3b\xb2\xe4\xcf"
+ "\x87\xcd\xdf\xa7\xc3\xce\x31\xa4\x68\xbb\xc2\xe6\xa3\x12\x67\xc4"
+ "\xbc\xe4\x08\xd3\x97\x65\x05\x78\x96\xe8\xb1\xb7\x8e\x28\x3f\xa6"
+ "\x25\x4d\xa2\x72\x5f\x89\x94\xe5\x25\x32\x46\x0a\xc7\xed\x3d\xca"
+ "\x34\x62\xbd\xc8\xb2\xc4\x32\xc0\xf2\xa4\x68\xb4\xa2\x24\x82\x46"
+ "\x8d\x4c\x1f\x9d\x4e\x7b\x62\x74\xf9\x5c\x7b\xd1\x38\xa5\x8b\xed"
+ "\x99\x23\x0a\x47\xcb\x40\x37\xf6\x7b\x27\xdc\x65\x9f\x31\x6e\x84"
+ "\xd3\x31\x72\x9a\xba\x4c\x98\x31\x85\xaf\x29\xd1\xf3\x3a\x3b\xea"
+ "\x39\x1e\x3d\x37\x5c\xe5\x50\xfa\x63\x45\xc0\x97\x70\xb5\xfc\x86"
+ "\x08\xc7\x9d\xad\x5a\x40\x14\x06\xde\x1b\x4e\xa3\x4f\x2d\xfb\xd2"
+ "\x39\xce\xf1\x74\x27\x71\x5c\xf4\x2f\xeb\xf1\xae\x0e\xe9\x83\x8a"
+ "\xf9\xfb\x08\x7f\x13\x5a\xf2\xbe\x74\x5e\xb3\x11\x95\x3b\x5a\xfd"
+ "\xc9\xa7\xda\xf1\xdb\xed\x4f\xfe\xa0\x7d\xd2\x2d\x2e\xd1\xe5\x2e"
+ "\x9d\x62\xb4\x8b\xd7\x76\x40\xa7\xf4\xe9\x4e\x11\x66\x1a\xe5\x3b"
+ "\x39\x16\x39\x60\x27\xf2\xda\x4e\x29\xda\x5f\xbc\x5b\xcd\x5f\x4b"
+ "\xc1\xff\x4b\x74\x7b\x86\x66\xe0\x19\xf6\xdf\xf7\xe5\x1a\x97\xe6"
+ "\xb6\xc9\x18\xe6\xda\xea\x5b\x1f\xc4\x7c\x60\xb7\x01\x13\xb0\xae"
+ "\xd2\xfd\x1e\x24\xbc\xaf\xeb\x57\xab\xad\x7d\x2f\xc3\x9a\xa0\xe2"
+ "\x42\x42\xc6\xcb\xeb\x4d\x5a\x5e\xaf\x9f\x0c\xde\x0d\x5a\x95\xc6"
+ "\x7e\x34\x79\xe0\xbd\x72\xce\x63\xbc\xab\x72\x6b\xbe\x2a\x93\x16"
+ "\x44\x3f\xa6\x29\xfb\xb9\x83\xf5\x27\xe6\xae\x2b\xc7\x1a\xe3\x9a"
+ "\x1c\x0f\x4d\x54\xae\xe6\x33\x2b\x1f\xe3\x72\xe7\xdd\x66\x82\xce"
+ "\x6e\xba\x31\x5d\xce\x51\x82\x9a\x3b\x81\x94\x2f\xf3\xca\xdb\x0d"
+ "\x1d\xcb\xfb\xa5\xd6\x55\xc2\xcf\x6b\xc4\xd6\x90\xf0\xcb\x58\xfb"
+ "\x3c\x76\xd0\x69\xf2\x96\x76\x95\x7b\xe5\x37\x38\xf9\xbb\x22\x01"
+ "\x7d\xdc\x08\xab\x71\x03\xf5\xfb\x13\x6f\x2d\xc0\xf8\x90\x70\x9a"
+ "\x60\xeb\x02\x7f\xa6\x0d\xef\xb5\x68\xa0\x95\x97\xc7\x49\xa6\x4f"
+ "\xca\xfe\x6d\xec\x03\xc3\x6d\xb5\x86\xd0\xe6\xc8\x76\x99\x34\xdf"
+ "\x06\x37\xda\x65\x42\xbb\x9c\x67\x58\x66\x82\xec\x9b\x04\x79\x1b"
+ "\x22\xe3\x59\xcb\xf9\x79\x99\x3d\xb2\x8d\xac\xff\x55\x1b\xca\xc6"
+ "\xc7\x6b\xa3\x30\x71\x1b\x99\x06\x65\xd7\xe9\xf2\x26\xf1\x64\xfd"
+ "\xd1\x41\x2b\x8f\x0d\x5a\xc5\x3e\x41\xfb\xd2\xa1\xdf\x26\x70\x1f"
+ "\x62\xfc\xac\x66\x3c\xe3\xf5\x17\xc3\xd3\x61\xf9\xac\xab\xca\x0b"
+ "\x80\xcb\xae\xf8\xf4\x2e\x6b\xbe\x3c\xbd\xcb\x7e\xc5\xe5\x19\x0f"
+ "\xde\xdf\xb1\x86\x4c\xd0\xc1\xa7\x76\x63\xbe\x56\x11\xaf\xde\x41"
+ "\xab\xb6\x32\x5e\x71\xdf\x09\x96\x17\x5d\x07\x81\x0f\x05\xe4\x44"
+ "\xb0\x4e\xea\x72\xbb\x72\x0d\x7d\x64\x4d\xb0\x27\x4a\xfd\x60\x12"
+ "\xd5\xf1\x60\x58\x57\x55\xf3\x3e\xd7\x04\xd4\x1f\xf7\xbd\xc6\xdf"
+ "\xee\xa8\xd8\x47\xda\xea\xef\xde\x68\x4d\xa0\xbb\xfd\x89\xdf\x4d"
+ "\xb1\x3a\x43\x19\x4c\x43\xc0\x74\x42\x8e\x1f\xe2\x79\xaa\x5a\x1b"
+ "\x71\xc1\xfe\xff\xa5\x8c\xcf\xe4\x4f\xde\xa7\xef\x1b\xb9\x30\xfe"
+ "\xd5\xd8\x8d\xb5\x79\x3c\xb7\xf9\xe8\xef\x0e\x25\x97\xdf\x7c\x5d"
+ "\xac\xfd\x60\x8f\xe6\xb6\x0a\xfb\x72\x2b\xec\xc8\xf2\x95\x9a\xe0"
+ "\xef\x39\x7c\xb0\xa7\x8f\x4f\x94\xbf\x94\xc1\x27\x5d\xee\xf2\x8c"
+ "\xf8\x3c\x50\x3e\xe9\xf2\x3c\x50\xfe\x0d\x7e\xcf\x74\x57\x73\x95"
+ "\xf2\x22\xc3\x4e\x11\xab\xbf\xf9\xba\xbd\x4c\xd6\x4f\xaa\x6e\xa6"
+ "\x49\x0e\xe3\x3f\x05\x74\x29\x47\xde\x1a\x43\x0f\x30\xbf\x58\xc3"
+ "\xfc\xad\x0b\x92\x3c\x8d\x77\x18\x57\x4a\x2c\x6a\x1d\xfc\x40\xb1"
+ "\xfc\x7e\xa5\x7b\x45\xb5\xdf\xe5\xd8\xcc\xdf\x69\x0d\x24\xef\x2b"
+ "\x45\x9e\x56\x1f\x35\xaa\xfd\x56\xcb\xbe\x12\xc0\x70\x6e\x52\xfe"
+ "\xd0\x16\x19\x2f\x0a\x32\xcd\x31\xa2\x58\xae\x91\x96\x0e\xbc\x39"
+ "\x5e\x14\xe6\x3b\xab\xd2\x7a\xc7\x25\x77\x0e\x74\x85\x90\xb6\x18"
+ "\xc6\xa5\x61\x9d\xa0\xdd\xcb\x26\xad\xe1\xe2\x68\x1b\x71\x9b\x2f"
+ "\xae\x1e\xda\xf0\x8b\xdb\xc8\xfc\x07\xdb\x13\x54\x7c\x07\xa5\xaf"
+ "\xfa\xbe\x99\xfe\x2b\x9b\x4c\x4c\x07\x1f\xad\xb2\x2b\xda\xad\x2a"
+ "\x30\xfa\xc7\x47\xae\x23\x52\x77\xae\x7e\xb4\x7d\x7a\x48\x7c\xa9"
+ "\xd6\xb9\x57\x41\xff\x3d\x53\xa3\xde\xaf\x68\x8f\x5d\x03\x62\x7b"
+ "\xde\x3e\x7f\xb1\xbd\x70\xe1\xd2\x05\xc3\x87\x47\xcd\x95\xcc\xea"
+ "\xbb\xb8\xab\x36\xa9\xf1\x74\xd5\x11\x03\x6f\xb6\x4b\xf0\x8c\xf6"
+ "\xaf\xb8\x24\x96\xfd\x94\x7c\xdd\xcd\x3d\x3f\x8b\xfa\xee\x6f\xa7"
+ "\x29\xb7\x47\x3c\x7e\x8f\xa6\xdc\xf1\xbd\xfc\x07\xe7\xce\x29\x5c"
+ "\x16\x91\x7a\x67\xe4\xba\x61\xd5\xeb\xa8\x3b\x71\xe8\x3d\xd0\x15"
+ "\x09\xd3\x56\xf0\xd8\xe2\xfe\xb0\x2c\x24\x4e\x41\x5f\x67\x43\xc6"
+ "\xf2\x9b\x4b\x42\xd4\x0c\x5d\x26\xbe\xc9\x3a\x7c\x80\x3a\xdb\x09"
+ "\x7b\x0a\xbc\x65\x45\xdb\xfd\xb0\xeb\x2e\xf0\xfa\x0c\xca\x7d\xde"
+ "\x52\xc3\x31\x9d\x3f\xd0\xfd\x1a\xdc\xb5\x48\xbf\x06\xd7\x4f\x70"
+ "\xbd\x0a\xd7\x3f\xda\x17\x60\xde\xc3\xbe\xf4\x4b\xd8\x97\xde\xfd"
+ "\xae\xf4\x07\x0a\x94\x13\xfb\x04\xe1\xfd\x2c\xb6\x41\x7c\xb4\xda"
+ "\xcc\xeb\xe0\x9c\x17\x69\x5b\xec\x4f\x51\x16\x5f\x85\xdc\x1b\x74"
+ "\xd7\x8a\xca\x0f\xfc\x62\x73\x1e\x7f\x6f\x2d\xe3\x24\xad\x4e\x48"
+ "\x4c\xf8\x9c\x12\x6d\x96\xd4\x2e\xf7\x6a\x94\x5d\x30\x8b\xe9\xd4"
+ "\xdf\xb7\x68\xe5\x37\x80\x63\xec\xc3\x3e\xdb\x70\x2d\x49\xfb\x56"
+ "\xb7\xe7\xea\xe4\xb8\xb0\x7a\x56\x84\x4d\xc7\x7b\xd3\x29\xca\x3e"
+ "\x11\x61\x65\x9f\xae\x2e\x31\xe4\x00\xf7\xe5\x06\x9f\x46\xc5\xd7"
+ "\x5b\x50\x32\x77\xd1\xdc\x42\xfb\x88\xc5\x29\x14\x11\x5d\xcf\x31"
+ "\x77\x81\x7d\xd1\xdc\x67\x9f\x9b\xbb\x58\x46\xc6\xe3\xb7\x51\x63"
+ "\x3e\xf4\xfd\xef\x33\x8c\x73\x5f\xf6\xa1\x4c\xdf\xd5\x5f\x70\x4c"
+ "\x36\xb1\xf6\xf7\xdb\xd8\x77\x47\xcd\x37\x44\x66\xf4\x7c\xe3\x79"
+ "\x15\x77\xa2\xe2\x03\x9f\x9a\xeb\x3c\x2f\xbf\x63\x7d\x82\xd6\x54"
+ "\xf7\xc5\x7f\x5f\x33\x1e\xb4\x34\xe9\x74\xbb\xd0\xe5\x5e\x93\x6d"
+ "\xd0\xcd\x47\xcf\x7b\x74\x5b\xaa\x43\xea\x0f\x8c\xb1\xd0\x7f\x51"
+ "\xe3\xab\xfa\x06\xed\x1a\x8e\xcb\x91\x28\xd7\x93\x93\x3f\x68\xe3"
+ "\xba\x18\x26\xea\xf3\xa0\x7f\x7c\xd0\x9b\xac\xdf\x2a\x0c\x78\xa8"
+ "\x33\x93\xeb\xd3\xe7\x41\xd7\x9f\xa6\xe7\xe5\x9a\xb3\x56\xf1\x41"
+ "\x1b\xeb\x14\x8e\x21\xa2\x55\x02\x8e\xdc\xa3\x7d\xde\x23\xd7\x61"
+ "\xf9\x1b\x04\x80\xc5\xeb\xc0\xd0\x73\x01\xfe\x5e\x31\xa7\xa9\xd8"
+ "\x70\xab\xd7\xf1\xda\x33\xea\x3a\x0e\xfc\x83\x7d\x67\x1b\x9e\xf7"
+ "\xb0\xdd\xc9\x70\x7d\xb4\xe6\x00\xc3\x53\xb1\xef\x9e\x1f\x06\xde"
+ "\xc9\xe8\xb3\x9f\x9e\x2f\x88\x98\x97\x31\x3e\x12\xcf\x00\x70\x91"
+ "\x71\x56\x95\xaf\xa9\x6c\x37\xeb\xcf\x4d\x7a\xdb\x8d\xf6\x00\x1e"
+ "\xf4\xdf\xea\x34\xc3\x6f\xc2\xa7\xb7\x9b\xf1\x63\xdc\x23\x71\xd6"
+ "\xf1\xad\x61\x7c\x51\x6e\x5b\x84\x6c\xf3\xba\x4c\x12\xd2\xf6\xf7"
+ "\xf9\xb0\xaf\xa1\x58\xbd\xb1\x70\x81\xbd\x68\xfe\x82\xa7\xf3\x97"
+ "\xce\x79\x7a\x6e\xfe\x73\xc5\x23\xed\xcf\x2d\x78\xa2\x68\xe1\x93"
+ "\x4f\x33\xd7\x2c\x2e\x79\xee\xc9\xa7\xed\xac\x59\xf2\x27\x4e\x99"
+ "\x92\x7f\xcf\x43\x33\x1f\x4e\xa1\x7b\xe6\x20\x0d\x33\xff\x29\x59"
+ "\x23\xd5\xab\x07\x27\x4d\xf8\x69\xfe\x84\xe9\x0f\x4d\x9b\x25\x0f"
+ "\xbd\xf4\xbe\x9f\xb8\x20\x7e\x86\x28\x3e\x4c\x03\x2f\x1d\x47\xff"
+ "\x26\x9d\xa0\xca\xb1\x2a\x5e\xfa\x0b\x45\xd1\xf1\xd2\x5f\x00\xd2"
+ "\x2f\x6c\xc5\xef\x00\xd1\x2f\xfc\xf8\x41\xbb\x57\x66\x29\xfe\x4a"
+ "\x7e\xbc\xcb\xfd\x42\x4d\x1f\x7f\x55\xca\xb3\x94\xec\xa7\xa4\xd6"
+ "\x67\x5f\x80\xfe\x5f\xbd\x3f\xf2\x5d\xdf\x7c\xf2\x85\xa3\xbd\xf3"
+ "\xc9\x5e\x9d\xf2\x42\xef\xdc\x12\x69\xed\x98\x57\x26\xf3\xbc\x52"
+ "\xad\x27\x55\x8e\x93\x3c\xd5\xaf\x7c\x5b\xc8\x98\x57\xb2\x6c\xcb"
+ "\x3d\x29\x39\xff\xf8\x45\x76\xa4\x8c\xcb\x35\x7d\x5d\xc6\xb9\x9c"
+ "\x5c\xbf\xb3\x88\x74\x5e\xd3\x86\x7d\x7c\x1c\xb6\x02\xc6\xaf\x2e"
+ "\x21\x92\x45\xba\xc2\xe9\x17\x4e\x5e\xe3\x66\xbb\x59\xe7\xa7\x41"
+ "\xa7\xe9\x17\x7b\x85\xfb\xf9\x26\x35\xa7\x7c\x3e\xcc\x7a\x5d\xac"
+ "\x1e\x7a\x0f\xfb\x16\xf1\xdc\x09\x75\xee\xea\xe3\xd9\xca\xb1\xcc"
+ "\x0b\x7d\x73\xd9\x5f\x44\xe9\xff\x4e\xf9\x5d\xc2\x5f\x1c\x37\xe2"
+ "\x3d\x94\x0c\x27\x93\x79\x78\x35\x6d\x32\x09\xe8\x9b\x5f\xac\xe3"
+ "\x3a\x98\x9e\x3e\x7a\xa1\x01\x79\xcd\x7d\xf4\xab\x48\xeb\xa5\x9f"
+ "\xbe\xce\x62\xac\xb1\x28\xbc\x2b\xc7\xf5\x47\xab\xf8\x74\xaa\x28"
+ "\xf8\x4a\x3a\xb9\x29\x89\x65\xd2\xa0\xd7\xa5\xb4\xaa\xd8\x76\x29"
+ "\xad\x2a\x2e\xf4\xd1\xea\x85\x1b\x2e\xa5\x55\x45\x6b\xc4\xbe\x92"
+ "\xbe\x8e\x52\x39\x8e\x69\xc6\x3c\x86\x76\xaf\x03\x9f\xd5\xf4\xd1"
+ "\xaf\xd2\x72\x29\xfd\x2a\x87\xc5\xa7\x5f\x05\x9f\xaf\x8a\x84\x53"
+ "\x17\x6f\xdc\x18\xb4\xca\xa4\x9f\x07\xab\xfc\x25\x7f\xeb\x9e\xf1"
+ "\xd8\x68\xd2\x1c\x1b\xdd\xf8\xe1\xca\xf3\x88\x3e\x5b\x5c\x04\x75"
+ "\xfa\x56\x37\x62\xce\xcb\xeb\x4a\x97\x19\x8b\x8e\x1b\x6b\x1e\xb8"
+ "\x6f\xe5\xb9\x33\x7f\x13\x8a\xd3\x99\x9e\xfc\x8d\x31\xf0\x7b\xab"
+ "\xb2\x4b\x2b\x7b\xbf\xff\xd1\x79\xd3\x83\x05\x89\xab\xc8\x7e\xb8"
+ "\xf6\x0e\x4e\x0f\x82\x87\x72\x39\x9d\x7d\xb7\xfa\x83\x99\x1f\xce"
+ "\xa1\xf8\x70\xd7\xf6\xf2\x7f\x7f\x67\xa2\x63\xf4\x91\x63\xce\x82"
+ "\xc2\x85\xf3\xe6\x7d\xb5\x2a\x8a\xdc\x57\xab\x76\x6b\x15\x5d\xfc"
+ "\xdd\xcd\xd5\x4f\x2d\x47\x9d\xb0\xff\x8b\xdb\xd5\xb8\xb9\x16\xfa"
+ "\x6f\x7e\xa3\xb2\x25\x1f\x6d\x57\xe7\xc0\x5f\x4c\x8f\xd0\xcf\xe0"
+ "\x91\x17\xed\xc2\xbd\x76\x76\x5f\x1f\xaf\xed\xb8\xb4\x8f\x5f\xa4"
+ "\xf8\x7d\xfc\x62\x86\xb6\x84\xcf\xe1\xbc\x88\xf9\xcf\x22\x69\x6b"
+ "\xf2\x33\xfb\x41\x60\xce\xdc\x8e\xf9\x72\xc7\xf4\x65\x9e\xbb\xf3"
+ "\x97\x25\xc8\xbd\x62\xfe\xf6\x4a\xe8\xa2\x68\x63\x5f\x04\xde\x1f"
+ "\xe3\x6f\xaf\xf0\x37\x97\xf8\xfb\x9f\x32\x0f\xee\xab\x4e\x92\x9c"
+ "\x3b\xe2\xbd\xbd\xfe\xa4\xfc\x3e\x36\x6c\x85\x17\xcb\x0d\xdb\xda"
+ "\x0a\x93\x91\xcf\xa7\x6f\x50\xfd\xd1\xca\x7d\xc1\xf5\xe5\x2f\xf3"
+ "\xa8\x3a\x2e\xf2\x77\xd5\xc8\xaa\x6c\x88\x17\xf7\x5f\x76\xed\x3e"
+ "\xf9\xd4\xd1\xfe\xbf\x49\x50\x3e\xa0\x77\xaf\x52\xff\x0e\x31\xcb"
+ "\x3e\xfb\x8f\x76\xb9\xd7\xa5\xc5\xfa\x9f\x2a\xdf\xa1\x75\x99\x86"
+ "\x4f\x56\x95\xf4\x81\x22\x2b\xeb\x4f\x9e\xe7\x9c\xa4\x75\x53\xea"
+ "\xe5\x78\xb9\x6e\x4a\xe4\x1e\xa7\x7d\xf9\xaa\xab\xce\xd2\x8b\x17"
+ "\x2e\xb3\x6f\x9a\xda\xe7\xfb\x5a\x3e\x00\xe5\xd7\xf5\xfa\x88\xb9"
+ "\xcb\x07\xd4\x47\xe0\x86\x77\x0d\x11\xbe\x8a\x7e\x1e\x8f\x79\xfe"
+ "\x58\xaf\xbe\xab\xea\x07\x0e\xcd\x48\xc3\x7c\x62\xbd\x8c\x47\xb8"
+ "\x34\x44\xc3\x8a\x7f\xcc\xdf\xec\x59\x77\x41\x9f\x87\x76\xd8\xcb"
+ "\x18\x9f\x75\x2f\x33\x5c\x1f\xf2\x09\xb9\x1f\xb0\x9e\x7a\x71\x8e"
+ "\xa8\xcf\x80\xad\x68\xb2\x3e\xc3\xc0\xcb\x47\xeb\x64\xfc\x14\xfe"
+ "\xce\x75\x64\x9b\x9c\xf3\xe6\xe7\x17\x3b\x96\xe5\xcf\x5f\x30\xbf"
+ "\x24\x85\x9c\x73\x9e\x9b\x3f\x1a\x49\xf6\x27\x1d\xf3\x8b\xf3\xe7"
+ "\xcb\x68\xc5\x32\x10\x72\xc9\xb2\x62\xde\xfb\xb8\x64\x0f\x3e\x4d"
+ "\xda\xf2\xa6\xf5\x63\xd5\x78\xbf\x7e\x93\xc1\xa7\xf2\xdb\xdf\x22"
+ "\x8f\xfa\x7c\xaf\xe4\x37\x83\x13\xd1\xce\x43\xcc\xc3\x2a\xbe\xcf"
+ "\x86\x56\x65\x5f\xac\x6f\xba\xd4\x27\x6b\xbd\xcf\xf0\xc9\x02\x7f"
+ "\xa7\xb1\xac\x47\xc0\x02\xff\x6f\xa0\x4b\xcb\x6c\x48\xef\xf5\xef"
+ "\xd4\xbf\x3b\xce\x7d\x25\xe3\xdd\xbf\xc4\xfa\x76\xfd\xfd\x5e\xe7"
+ "\x24\x8e\xd9\xab\xcb\xd5\x86\x89\x11\xf8\x4a\x5f\x5e\x86\xc5\xe7"
+ "\xa4\x46\x07\x23\x7d\xd9\x36\x7c\x82\xb1\xd7\x66\xd4\x63\x5f\x61"
+ "\x82\xbe\xdb\xf0\x5a\xc0\xe4\x49\x94\xfe\xc7\x28\x07\x58\xd5\x86"
+ "\x1f\x8d\xaf\xb7\x5d\x1b\xb6\xc5\xe2\x08\xdc\x87\x23\xfd\x40\x9f"
+ "\x9f\xe0\x86\x72\x86\x81\x34\x8c\xff\x55\x23\x23\xd3\x22\xfb\x69"
+ "\xfc\xa4\x29\x30\xa0\x17\xcf\x45\x27\x4d\x98\x53\x54\xc4\x3a\x68"
+ "\xce\xdc\xa2\xe7\x16\x2d\x5c\xac\x77\xdd\xf8\x79\x1c\x86\x5a\x66"
+ "\xb9\x4b\x7f\x63\x5f\x30\x77\x6e\xa1\x4a\xd2\x3b\x32\x7a\xcf\x4a"
+ "\xf9\x31\x54\x61\xfe\xbf\xce\xd1\x67\x2b\x56\x6d\x15\xa6\x0d\x6d"
+ "\xf8\x9d\x93\xfa\x47\xf6\x6b\x55\x51\xf4\x1c\xad\xaa\xd4\x90\x7d"
+ "\xd9\xcf\x2e\xf6\x39\xdb\xfb\x6c\xa7\x90\x7b\x3c\xe8\xd7\xea\x3f"
+ "\xa3\x9d\x49\x3e\xaa\xe6\x33\x5f\x09\x11\x70\xf6\xf4\xd2\x7b\xf5"
+ "\xa3\xad\xab\x95\xcf\x84\x99\xbf\x59\xcb\x31\x25\xf0\x1e\xf3\xff"
+ "\x17\x8f\x2b\x3d\x59\xe5\xeb\xdd\x7b\x31\x25\x62\xbe\x59\x05\xde"
+ "\x5f\x98\x75\xa9\x7c\x57\x5b\x2e\x95\x7b\xf6\xb5\xac\xb6\x1b\x34"
+ "\x8e\xf8\x06\x3d\xf8\xaf\xfa\x43\x63\xcd\xb8\x5e\xff\x26\x02\xdf"
+ "\x73\x59\x9e\x57\x88\x41\x03\xef\x66\xbf\x86\x13\x54\xbd\x4e\xf1"
+ "\x54\xb5\x23\xc2\x37\x30\xed\x34\x55\x57\xa8\xbe\xad\x2e\x37\xe4"
+ "\x0f\xed\x94\xb6\x1c\xc3\x50\xe3\x7a\x55\x92\xe2\xaf\xea\x6d\x06"
+ "\x6d\x79\x0e\x8f\xe7\x3d\x7d\x76\x50\xd5\x2c\xe9\x2f\xa2\x62\x6a"
+ "\xf4\x70\xfb\x01\x67\x8c\x01\x07\x79\xd1\x7e\x8b\xdf\xa0\x95\x91"
+ "\x27\x92\x27\x26\xcc\x29\xc6\x04\x7b\xfe\xbc\x79\x73\x17\x2d\x36"
+ "\xe2\x8c\x67\x2e\x2c\x2a\x54\x71\xc5\xef\x42\xf7\x2f\x85\x0c\x8f"
+ "\xe3\xd0\xe4\x48\x55\xb7\x31\xf6\xee\x48\x5e\x13\x91\xfe\xa3\x72"
+ "\xce\xf5\xf2\x87\x75\xfa\xfc\xeb\x04\xbd\x34\x43\xf9\x5f\xbd\x74"
+ "\x8d\xb2\x6d\xaf\x7e\xa3\xcb\xfd\xcb\x12\xc3\xb6\xe5\xb5\xd6\x4e"
+ "\xba\xb1\x86\xcf\xc8\xf1\x59\x82\x2d\xaf\x88\x36\x5e\x5b\x45\x9e"
+ "\x1a\xe3\x5b\x74\x6c\x37\xad\x7f\x45\xc5\xd0\xf6\x2c\x60\x5f\x91"
+ "\x97\x3f\xd3\x2a\xf7\xfa\x45\xca\x76\x3b\xec\xb3\x54\x96\x89\x81"
+ "\x1d\xec\xc3\xcb\xb1\xaf\x7e\xd9\xc6\x76\x1d\xeb\x32\xfe\x5e\x43"
+ "\x1b\xfd\x72\x0f\x74\x34\x74\xfa\xcb\x3e\x7f\xf2\x5e\xff\x9a\xe5"
+ "\x64\xe1\x3a\xa0\xaf\x7d\x8d\x5b\x99\xb6\x2f\xd1\x21\xe8\x32\x5d"
+ "\x67\xfb\xb8\x1e\x1f\xfd\xb2\x49\x5f\xf7\xd7\xbf\xad\xb4\x0f\x34"
+ "\x7f\x09\xfa\x7f\x60\x8d\xe2\xd5\x1d\xaf\xde\x5c\x4e\x4e\xfe\x36"
+ "\xa5\x8a\x5b\x75\xb0\x1a\xed\xa8\xe1\x6f\x40\xc2\x16\xc4\x7c\xe7"
+ "\x97\x25\x68\x43\x8d\xee\x03\x0e\x5e\x79\xa9\x59\xf9\xf6\xff\xb2"
+ "\x90\x69\x00\xb8\x69\x3a\xdc\x34\xc0\x45\xff\xdf\xa0\xc7\xcb\x7e"
+ "\x69\x9d\x51\x07\xc6\x3f\x3f\xec\xe6\x56\xb6\x9d\x81\x37\x6c\xe8"
+ "\xbd\x1d\x55\x72\x2f\xdd\x07\xbd\x6f\x15\xec\xbb\xd6\xf7\xbd\xbd"
+ "\x97\x1a\x8d\xb1\x90\xeb\xd6\x71\xe7\xb3\xcb\x16\x5e\xe7\xd3\xeb"
+ "\x4a\xe5\xb5\x00\x03\xa6\xa8\xdc\xdb\xae\x5d\x3c\xb3\x15\x30\x2d"
+ "\x18\xd7\xfd\xfa\x77\xd6\x3a\xaa\xce\xb3\x9f\xa3\x0f\xe3\xf6\xb7"
+ "\x45\x7e\x28\x8d\xf7\xa0\x06\x1a\xdf\xb1\xab\x3f\xcf\xf4\xda\x98"
+ "\xd5\xb7\xb7\x84\xf2\xa0\x3f\xe4\xa1\xbc\x8d\x36\x4e\xe6\x7a\x59"
+ "\x16\xb8\x2f\xbb\xd1\x37\xe8\x9f\x4c\x71\xf1\xcc\x6e\xfb\x02\x1a"
+ "\x78\x92\x36\x3e\xc3\x7d\xc4\xfb\xc1\xec\x7f\x88\x34\x2b\xc7\xdd"
+ "\x3f\x41\x1b\x1f\xe6\xfe\x61\x5c\x44\xc5\xf6\x60\xa8\x2b\xef\x3e"
+ "\x3e\x73\xcd\x3a\x73\x65\x29\x6c\xee\x79\xac\x4b\x36\x7d\xc6\x73"
+ "\x78\xfe\x5e\x12\xdf\xbb\x0a\x85\x26\xfb\x77\x39\xf7\xef\xa6\xcf"
+ "\x56\xb6\x0b\xed\x4b\x37\x89\x23\x01\xa2\x2f\x4d\x14\x0a\x9a\x12"
+ "\x18\x6f\x93\xeb\x0c\x9f\x0b\xdf\x4a\x5e\x67\x05\xfb\xb2\x59\x36"
+ "\x2c\xa7\x34\x3e\x53\xcf\xdf\x02\x6a\x09\xd4\x52\x4b\x71\x2d\xfd"
+ "\x29\xb4\x89\x3c\x4b\x38\x3e\xca\xcb\x6b\xfe\xd5\xb9\x89\xf7\xd8"
+ "\x92\x71\x3f\xc9\xfe\x53\x59\xd7\xb0\x7f\x3d\xf6\x17\xfa\x57\xcf"
+ "\x5f\xc8\xfe\x88\x7c\x1e\xd9\x94\xf7\x27\x6a\xca\xf9\x13\xb9\xda"
+ "\x84\xc6\xf3\xba\xb2\x67\xb8\x8e\x0a\xc0\xda\xca\xe7\xcf\xd3\xb4"
+ "\x4e\x5b\x0a\xda\x6f\xe6\xfd\x83\x96\x80\x9f\x3c\x0b\x7e\xcf\x38"
+ "\xbe\x5d\x77\x9e\x2c\x9e\x05\x1f\xcb\x7b\x35\xdf\x3a\xb3\xd5\x5b"
+ "\xd8\xca\x36\x65\x88\xcf\xde\xf3\x9e\x24\xe6\x18\x5a\x15\xe3\x18"
+ "\x56\x78\x83\x5e\x66\xa3\x3c\x6c\x4e\xa3\xbc\x8c\x15\xb7\x85\xe9"
+ "\x01\x9c\x9a\x67\x29\x9a\x34\x61\xa4\xd0\x71\xfe\xcc\x95\x17\x49"
+ "\x9f\x8d\x4d\x4c\x1f\x8e\xd9\xaa\xa1\xbf\x80\x5b\x0e\x68\xa0\x19"
+ "\x75\x00\x67\x8b\xbe\x86\x6b\xd9\x70\x9e\x52\x3d\x0b\xf8\x5b\x70"
+ "\x2f\xdf\x6e\x9d\x61\xb6\x68\x17\xcf\xee\xae\xba\x40\x66\xee\x37"
+ "\xde\xb7\xa9\x92\xef\x19\xe6\xcb\xe9\xdc\x67\xe0\xc9\x02\xfc\x0a"
+ "\xf1\x73\x30\xdf\xe1\x5a\x84\xfe\xaa\x00\x0e\xbb\xd0\x57\x5b\xf9"
+ "\xaa\x78\x71\x47\x0d\xc7\x25\xd1\xe7\x50\x7d\xe9\x90\xa3\x90\x90"
+ "\xdf\x5b\x86\xcc\x6c\xda\xa5\x41\x8e\x78\x0d\xa7\xee\x25\x4a\xd5"
+ "\xdc\xd5\xc1\x2d\xd0\x75\xb5\x2f\xc9\x73\xc9\x69\xbc\xae\xf9\xba"
+ "\xfc\xb6\xc6\xcb\xbb\x0d\xdd\xb7\x76\x08\x9f\xdd\xdc\x74\xdc\xc4"
+ "\xeb\x3e\x15\xfb\x2c\x3a\x9f\x5b\x90\x07\xfa\xff\x7a\x7d\x0c\x7d"
+ "\x49\xce\x2f\x58\xf6\xfb\x9b\x4f\xc0\x96\x6d\x12\x9b\xf3\x88\xf7"
+ "\x7f\x52\x57\x09\x7f\x6a\x9b\x55\xb4\x04\x9a\xe4\x99\xdd\x96\x40"
+ "\x58\xee\xff\xe0\x7d\xc2\xb4\x80\xdf\x0a\xdb\xf7\x28\xd3\xce\x48"
+ "\xe7\xbd\x23\x5e\x57\x9b\x16\x10\xfe\xe9\xcb\xac\xfc\x2d\xcc\x61"
+ "\x72\xef\x40\x4f\x6f\xb1\x61\xde\xb0\xcc\x6f\x45\xdb\x43\xbd\xb0"
+ "\x3a\xf3\x12\x59\xde\x90\x37\xbd\x37\x6f\x67\x9e\x99\xbf\xed\xcc"
+ "\x75\x46\xa4\x25\x4d\x77\xa2\x2c\xf7\x95\x9e\xa6\x6c\xe6\x57\xf6"
+ "\xf4\xce\x29\xf9\xfc\x42\x27\xc6\xcd\xc5\x79\x09\x5a\x67\x9e\x29"
+ "\x0c\xd8\xe0\xfd\x34\xf9\x4d\xce\x90\x5f\xff\xc6\x55\x3b\xe4\xb7"
+ "\x95\xc4\xfa\xc4\x2c\xe4\x33\x33\x5c\x8e\x05\xc1\xdf\x06\x11\x03"
+ "\x93\xf6\xc7\xf7\xb9\xeb\x68\xf7\x94\x3d\x02\x7e\x7a\xf5\x00\xcb"
+ "\x73\xd8\xf2\x5e\xba\xfd\x29\xb6\x61\x5e\x95\xbe\x01\x61\xc8\x58"
+ "\x38\xf9\xbd\xf4\xd1\xed\x94\x50\x06\xbe\x55\x6b\x50\xaf\x3e\xe4"
+ "\x85\x0c\xba\x34\x01\x3b\xf4\xd5\x5c\xe6\x1b\x6b\x07\xfb\xca\xbd"
+ "\x67\x93\xfe\x69\x29\xed\x3e\x6f\xb0\x9d\x9a\xca\xff\x4a\x4d\x21"
+ "\x6f\xf9\x81\xf3\x7e\xb3\xf2\x53\x33\x33\xdc\xf9\xfc\xce\x05\x5e"
+ "\xcd\x0f\x6f\xa5\xfe\xf6\x06\x78\x7e\x8c\x31\xec\x6f\x6a\xae\xf8"
+ "\xea\x01\x63\x5e\x7c\xf9\x36\xd4\xa4\x73\xfc\x0c\x21\x6c\xa4\xad"
+ "\xfd\x83\x0f\xb8\xb8\x44\x57\x26\x8d\x5e\xce\x6b\x72\xaf\x76\x60"
+ "\x8e\x92\xa3\xc3\x3d\xa7\xe0\x22\xff\x65\xe0\x32\xcf\x34\xd5\xc8"
+ "\x7d\x29\xb4\xe9\x0f\x47\xc3\x80\x1d\x4e\xf9\x3f\x69\xd0\xf1\x2e"
+ "\xd7\x97\xbc\x66\xfb\xda\xc3\xa8\xe7\x68\x4b\xe8\x28\x71\x1c\x9e"
+ "\x3a\x0d\xe3\xe3\x39\x1b\xe9\x3e\x79\xae\xb3\x54\x33\x49\x13\x99"
+ "\x69\x98\xaf\xf3\x7e\x8c\x8b\x75\x1c\xaf\x05\x94\x85\xe9\x2a\x2f"
+ "\x46\x46\x8e\x1d\x01\x18\x53\x3f\xe1\xbd\x2f\xe8\x89\xb0\xb0\x99"
+ "\x3e\xbc\x88\x91\x1e\xba\x53\xc6\x92\x58\xfd\xcd\xd7\x07\xad\xa2"
+ "\xbb\x85\xc9\x2a\x7d\x3a\xb5\xca\x93\xed\xe8\xdb\x6c\xe5\x03\xb8"
+ "\xcf\x16\xe1\xff\x97\x88\xba\xa4\xff\x9f\xb0\xec\x3d\x5e\x2b\xd7"
+ "\x1d\xdf\x4b\xef\x72\xd7\x04\x7c\xf4\xaa\x5c\x7f\x5d\xc7\x67\x3c"
+ "\xa4\x8e\x7d\x6d\x8e\x3f\xf9\xe3\xdd\x0c\x83\xcf\xb2\x6a\x4b\xc2"
+ "\xbb\xab\xfe\x21\xed\x6b\x7e\x37\xbe\xa5\xa3\xcb\x23\x2a\x3e\xde"
+ "\xcd\xe7\x18\x75\xd8\xd6\xb3\xf4\xda\x35\xa2\xf2\xe3\xdd\x3e\x7a"
+ "\xad\x40\xf5\x8d\xbc\x1f\xc9\xef\x43\x3d\x99\xb0\xab\x6b\x1a\x6a"
+ "\xbb\x79\x2f\xa0\x66\x96\x70\x7f\xdb\xd3\x69\xf9\x78\xf7\x4c\x1b"
+ "\xdb\x54\xaf\x95\xf8\x12\xd4\x77\x7d\x8d\xb8\x18\xfd\xcd\x91\xc4"
+ "\x66\x5b\x8a\x17\x40\x30\x9f\x4d\x3f\x4d\x9b\xbf\xe8\x76\x93\xa9"
+ "\x07\xb6\x60\xb7\x89\xd2\x20\x5f\xa9\x1b\x86\x52\x16\xde\x0d\x3d"
+ "\x4d\xaf\xfd\x31\x64\xa2\x74\xfc\xd2\xfc\xdf\x74\x24\x03\x6e\x0e"
+ "\xaf\x91\x36\x9f\xe7\x35\xae\xd7\xe5\x39\xe5\xaa\xd7\x29\x43\x03"
+ "\x3c\xde\xef\xa9\x1a\x4a\x19\xbc\x4e\x89\xb4\xcc\xfc\xb0\xda\xf7"
+ "\x34\xd6\x22\x56\x0f\xa5\x91\xd1\xf5\xbe\xb6\x5b\xad\x63\x6e\x6e"
+ "\x93\x73\x2b\x3f\x7d\x0b\x73\xab\x13\x80\xbb\x4d\xb8\x13\x85\xf8"
+ "\xa6\xcd\xa4\x7c\x13\x5e\x5f\x6f\xad\x51\x7c\x27\xf7\xf9\xc0\x6f"
+ "\xbc\x8f\xaa\xef\x29\x25\xc8\x78\x20\x29\x1f\x6c\xe3\xef\x50\x47"
+ "\xac\x13\xa7\x49\x3c\xf4\x33\xfc\xe1\xd5\xb7\x72\x6c\x30\x79\x76"
+ "\x3f\x7f\x8e\xda\x8f\xe2\xf3\xfd\x3e\x7a\x5d\xc6\x63\x5c\xf7\x3a"
+ "\xa5\xbe\xf8\x3a\xa5\x35\xcf\x93\xed\x3a\xa0\x64\xd1\x4c\x8c\xaf"
+ "\x56\xc1\x72\x06\x9e\x00\xde\x5c\x1f\xf3\x46\x4b\xe8\x9c\xc7\x55"
+ "\x22\x34\xcf\x53\x6c\x8b\xbe\x1e\xf6\x2c\xda\x45\xd3\xdb\x42\xea"
+ "\x2c\xea\x6c\xf2\xd7\x03\x5e\xfd\x50\x4a\x3b\x49\x9b\x93\xbd\x45"
+ "\xc4\xfb\x15\x37\x7a\x16\xed\x01\xec\xcd\x37\xf0\x58\xb0\x1e\xf4"
+ "\x51\x63\xc2\xe6\xa3\xde\x60\x2b\x35\x43\xbe\xa7\x15\x0b\x09\x07"
+ "\x79\x1e\x92\xed\xdd\x6c\xb3\xe7\xab\x18\x0c\xb2\xad\xbd\xfb\x7c"
+ "\x7a\x3b\xbc\xe7\x25\x3c\x87\x17\x5c\x62\xb4\xc9\xa0\xb5\xe2\xaf"
+ "\xcd\xdb\x3d\x8b\xb6\x11\xf7\x0f\xe7\xc7\xf3\x26\x6f\x07\xf2\x9e"
+ "\x89\xee\x17\xce\x83\x77\x9f\x00\xee\x0f\xfa\xf6\xaa\x79\x0f\xb5"
+ "\x2f\x4f\xed\xeb\x7c\x1e\xed\x75\xcb\x66\xd0\x48\xad\xed\x6f\xbe"
+ "\x9d\x71\x45\xdf\x65\x79\x4b\xfe\x1a\xdf\x27\x15\xb2\x0f\xbe\x5f"
+ "\xd5\x22\xf7\xec\x6a\x87\x4f\x0b\x69\x42\xe9\xb3\xda\x63\x1a\xf4"
+ "\x80\x0f\x57\xd6\x05\x52\x9f\xdc\xc6\x7e\x40\xb5\x9f\x5a\x13\x54"
+ "\xff\x72\x5b\xd8\x5e\x89\xd7\xc7\x11\xfb\x89\xec\x97\xdb\xdb\xc7"
+ "\xfc\x0d\x47\x8d\xf7\x84\xd9\xdf\xbe\xc7\x46\x8a\xff\x44\x35\xe0"
+ "\x7e\xa2\xdb\x6e\x79\xfa\x58\x96\xd7\x99\xfc\x9e\x9d\xcf\x47\x1a"
+ "\xbe\xc1\x90\xdf\x61\xf9\xca\x9f\xdb\xc6\x3a\xaa\xde\x24\x74\xde"
+ "\xac\x3d\xa6\x97\x9d\xa5\x7c\x32\x6a\x37\xa1\xfc\xac\xb8\xed\x4d"
+ "\x84\xde\x71\x43\x4d\xa3\x3d\x6c\x47\x0a\xe8\x2a\x8c\x07\x57\x79"
+ "\x03\xdd\xfa\xf7\x33\xb7\x3c\x00\x9b\xfa\x2a\x3e\x1f\x65\xe0\x76"
+ "\x65\x7b\x7f\x5b\x86\xa9\xb9\xcd\x96\xd9\xc6\xda\x92\xb0\x80\xc6"
+ "\x6e\xab\xe0\xb3\x92\x7c\xde\x25\x90\xdc\x01\xfb\x56\xd8\x95\xdc"
+ "\x6c\x59\x03\x3b\x55\xea\xdb\xfc\x20\x95\x73\xbb\x78\x6f\x17\xf3"
+ "\xa6\xab\xb8\xcd\x80\x83\xf9\x4f\xf1\x58\x35\x9e\x2b\xd8\xfd\xae"
+ "\xed\x18\x6d\x43\x9b\x64\xdb\xd0\x46\xd9\x36\xfd\xfb\x52\x27\xa9"
+ "\x6e\xb8\x5c\x2f\xbf\xb2\xf6\xa8\xf8\x32\x15\x1d\x7e\xfe\x76\xee"
+ "\x49\xaa\x7f\x5f\x9e\x81\x41\x9f\xa8\x7d\x90\xba\x12\x91\xf2\x62"
+ "\xca\x95\xc1\xac\xcb\x51\x30\x85\xfd\x65\x8e\x45\xa9\x7f\xa3\x0e"
+ "\xb0\x7f\x25\x2a\x85\x5d\x9e\x31\x44\x7d\xfc\x8d\xcf\x3e\x3d\x54"
+ "\x9f\xc1\x7d\x75\xdb\x2e\xca\x51\x7c\x58\xff\x0d\x5e\x6b\x56\xf3"
+ "\xbc\xba\x23\xd0\xbd\xeb\xd4\x9c\xca\xf0\x23\x4f\x90\x7e\xe4\x91"
+ "\x3a\xf6\x0a\x71\x94\xfa\x4e\xa4\x9c\xac\xc6\xfd\x7e\x79\x56\x12"
+ "\xf8\x2e\x0d\x19\xfa\xaf\x6e\x3f\xfb\x24\xf5\xfa\x03\x2c\x03\xaf"
+ "\x94\xa9\x73\xe4\x5d\xee\xfa\x3c\xc3\x46\x91\xdf\x24\x73\x8b\x23"
+ "\x9c\x6f\xfa\xb2\x73\xd2\x5f\xa0\x4a\xc6\x3c\x38\xad\x9f\xb3\xab"
+ "\x7f\x46\x5f\xd7\xc8\x64\x1f\x7e\x94\xdd\xe4\xa3\x43\xf2\x4c\x20"
+ "\xd3\x80\xeb\x96\xb8\xcb\xef\x82\xd5\xef\xee\xdb\xf7\xa9\x93\xdf"
+ "\x4d\x57\x7e\xad\xf5\x47\x0c\x1e\x41\x7b\xaf\x52\xb1\x41\xeb\x6e"
+ "\x3f\x3c\x92\x24\x0f\x74\x0a\x5b\xca\x77\x6a\x99\x27\xeb\xfd\x91"
+ "\x74\x9a\x1e\xd2\x5c\x4a\x07\xd5\xb5\x0a\x29\xeb\x75\xad\x5f\x6d"
+ "\x4f\x6c\x9d\x64\xd8\x22\x8a\xce\x69\xd0\x2f\x6f\xa4\x49\x5a\x57"
+ "\xec\xc8\xe6\x18\x2d\x2b\xca\x38\xe6\xd4\xaf\x92\x38\xb6\x57\xa8"
+ "\x62\x47\x5e\x98\xcf\x64\x62\x9c\xd5\x2a\x76\x38\x4e\x16\x93\x29"
+ "\xbf\x98\xf7\xba\x3e\x2e\xe7\xf9\x95\x70\xc1\x16\x48\x81\x7d\x02"
+ "\x39\x5f\x39\x9f\xac\x8f\x39\x00\xdb\x95\x99\xce\xb1\xb7\x38\xee"
+ "\x16\xc7\xce\x0b\xbb\x32\x07\xe3\x7e\x08\xec\xb9\x34\x61\xd9\x91"
+ "\xcb\xfe\x32\x61\xb7\x80\x3e\x3e\xce\xf1\xbf\x4c\x5e\x7f\x90\x56"
+ "\x9e\x21\x0b\xc7\xf6\x0a\x55\x7e\x5c\xd3\x12\xf8\x4c\xce\x2d\x06"
+ "\x15\xc3\x9e\xd6\xe4\xb9\x1c\x9b\x96\xfc\x71\x39\xc6\xf8\x35\xaa"
+ "\xdd\xe7\x84\x6a\xb7\xc2\x9b\xf1\x57\x3a\xae\xc1\x51\x26\x71\xff"
+ "\x97\x37\x43\x80\xaf\x55\xbc\x5d\x18\xae\x78\xbb\x40\x9d\xe5\x6c"
+ "\xa2\xb2\x12\xd1\xee\x85\x6d\xcc\xfe\x9b\x7c\x5e\x97\xfd\x71\xb8"
+ "\x8d\xdc\x3e\xae\xfb\x5f\xcf\x9f\x91\xb1\xca\x42\x78\x76\x15\xe9"
+ "\x65\x3a\x50\xa6\xa3\x89\xba\x2b\xde\x96\x6d\x6f\x09\xa8\xb2\xf9"
+ "\xf2\x9e\xcb\x47\xd0\x41\x6f\x73\x2f\x1d\xd0\x76\x6e\x1f\xb7\x3f"
+ "\xc4\x34\x01\x0d\xf4\xb6\xda\x7a\xf4\x76\x72\x1b\xff\x84\x51\xe7"
+ "\x75\xb4\x13\x6d\x95\xed\xec\x41\x3b\x8f\x38\x88\x82\x6b\xcf\xd0"
+ "\x97\x29\x6f\x17\xf0\xfc\xd0\xf5\x67\xd8\xd1\xa5\xd5\x84\x79\xa0"
+ "\xf9\xed\xb2\x6a\xd3\x5a\xd8\x26\x65\x7e\xcc\x07\xfd\xa2\x9d\xed"
+ "\x7d\x6f\x31\x7e\xa1\x5a\xf9\xdd\x61\x69\x1f\xf3\x37\x62\x9f\x45"
+ "\x9b\xb4\x2f\xa8\xac\x5d\xb4\xc3\x36\x0d\x7a\x43\xc8\xe3\x40\xfb"
+ "\x31\x7f\x3c\xa9\xe3\xcf\x79\x57\xfe\x43\xb5\xcb\x5a\x44\xe9\x07"
+ "\x1f\xa9\x30\x79\x5b\x2b\xc8\x68\xcb\xe3\xc8\x87\xf6\xd8\x00\x6b"
+ "\xa0\xfc\x2e\x03\xda\xb9\x19\x78\x06\x23\xda\xd4\xdc\x11\x04\xcc"
+ "\x4f\x29\x65\x06\x25\xbc\x7e\x16\xed\x38\x4b\xb6\xea\x32\xd8\x5f"
+ "\x0f\xb2\xbd\xf8\xab\xcf\xaf\xce\xa3\x0c\x1f\x6d\x6d\x57\x7c\x27"
+ "\xe3\x06\x5d\x77\x9a\xde\x48\xee\x8d\x0d\xc4\xf1\xd6\x92\x3f\xae"
+ "\x65\x3e\x92\x31\x82\x78\xcc\xe8\x02\xcf\xb0\x2f\xcd\x52\xd4\xd1"
+ "\x95\x39\x44\xe2\xe3\x1e\x43\x78\x4e\xc5\x33\x7f\x33\x2a\x9d\xd7"
+ "\x04\x50\xae\x46\x80\x66\x0c\x1f\xf6\xdc\x1a\xbe\x32\x0d\xe3\x9e"
+ "\x35\xf9\x0d\x65\x8b\x14\xd8\x98\x98\xfb\xee\x2e\xf3\x9b\x9e\xff"
+ "\x0d\x8d\xbc\x32\x9d\xf2\x46\x76\x7f\xfa\x9b\xf7\x2d\x18\x1e\xda"
+ "\x36\xf8\x34\x6d\xbb\x21\x5a\xc6\xec\x52\x97\x29\x3d\xf8\x46\x1b"
+ "\xef\x15\x5c\x61\xbd\x52\xff\xb1\xcf\xd3\x15\x96\x6b\x37\xf0\xc0"
+ "\xfd\xb6\xfe\x70\xbf\x72\x3a\x6c\xcb\xe9\x0f\xd6\xfa\x57\x64\xbc"
+ "\x38\xd7\x86\x57\xd8\x1f\xb1\xa3\xfd\xb0\x8d\x63\x78\x63\xec\xdc"
+ "\x16\xa0\xc5\x5b\xc8\xe2\x3a\xc3\x6b\x32\x53\xe9\x70\x6d\x16\xd5"
+ "\x61\x4e\x2e\x3a\x33\x07\x6f\x3c\xcf\xbe\x0f\x4a\x87\xb0\x4d\xca"
+ "\x67\x29\xc5\xe2\xcc\xb4\xaa\x57\x0c\x1b\x7e\x7b\x72\xe9\x05\x32"
+ "\xa9\x6f\xa4\x6c\xb7\x4c\xb4\x8b\xd0\x26\x93\xe6\xa8\xe5\x98\x57"
+ "\x29\xa7\xb2\x38\xe6\x95\x11\x47\x4a\xda\x3e\x4e\xc8\x5c\xa7\x2d"
+ "\x65\xfd\x22\x1a\xc9\xb1\xef\xac\x7e\x65\xcb\xa9\xf1\x9a\x63\x54"
+ "\x51\x9a\xbe\xdf\x9f\xa6\x62\x4b\xbd\x51\x5e\x7f\x1e\x75\xa9\xf7"
+ "\xf3\xc3\x98\xc3\x48\xb8\x8b\x28\xa3\xf6\x3c\x65\xb2\x1d\x94\xff"
+ "\x85\xb2\xd9\x78\x5e\x38\xb5\xc3\x2a\xc2\xff\x95\x49\x5b\x4e\xf7"
+ "\xc5\xc6\xf3\x2f\xe6\x78\x7a\xc2\xd6\xdf\x5e\x49\xd5\x10\xe9\xf3"
+ "\x23\xe3\xb1\xa8\x6f\xe8\x11\x6d\x7a\x89\xcc\xfc\xcd\x58\x5e\xcb"
+ "\xe3\xb5\x61\x3e\xf7\xa3\xc6\x90\xed\xad\x46\xcc\xb0\x7e\xf7\x11"
+ "\x2b\xd4\x7c\x47\xbb\x0a\xf3\x2f\x7f\x97\xc7\xb3\x84\xc7\x8c\x1d"
+ "\x76\x3e\x6b\xd4\x37\xc7\xd9\x91\xc0\xef\x38\x8d\x7d\xe1\x73\x24"
+ "\x2d\x77\xe4\xf2\xbc\x47\x9f\x33\x1e\xb4\xf7\xa6\x29\x1b\x86\xc7"
+ "\x32\xc6\xa1\x5e\xad\x23\x0f\xea\x72\xef\x28\x34\xc6\x33\x1e\xd7"
+ "\xd5\xf7\x6a\x77\x38\x7d\x09\x1f\x95\x5e\x06\xbf\x34\xfd\x7b\xcf"
+ "\x1c\x1b\x21\x07\xf9\x1b\x8c\xf1\x4d\x7e\x8f\x64\xf5\xd0\x7b\x16"
+ "\x2f\xa3\x61\x33\xbf\x61\x91\xb1\x37\xf8\xbb\xa3\x6a\xdc\xdd\x71"
+ "\xb4\x6f\x3f\x2d\x47\xd2\x5b\x7e\x6b\x90\xe7\x18\x26\x8c\xc1\x2a"
+ "\xfe\x5d\x87\x1a\x7f\x8d\x73\xee\x3b\xce\xf4\xd5\xb3\x33\xad\x77"
+ "\x1c\x45\x1d\xec\xd7\xc1\xf0\x95\x6d\xb2\xa3\x91\xeb\xe0\xb9\x95"
+ "\x1a\x5f\x77\x34\x5e\xc6\x16\xcb\x64\xfa\x6a\xfa\x7c\xd2\xdb\x71"
+ "\x4a\xd1\xd7\x49\x89\xa3\x37\x91\xed\x60\x99\xcf\x3c\x48\xc5\x71"
+ "\xb2\x9e\xa0\x9d\x73\xf8\x3d\xf3\xba\xe7\x36\x5e\x8b\xdb\xf9\xa1"
+ "\x97\xc7\xed\x9e\xbc\xd4\x69\x3c\xd7\x97\xb6\xf8\xce\x5d\xa3\x50"
+ "\x0e\x69\x83\x3f\x3a\x1b\x34\x57\x2d\xa7\x91\xfc\x4d\x4f\xa4\xcb"
+ "\x75\x02\xff\xf5\x4f\x77\x7d\x27\x9d\x6c\xdf\xd9\xc4\xe7\x01\x76"
+ "\x1e\xc3\xfc\x52\xfa\x47\xc8\xfa\x37\x24\xce\xe0\xd8\x7f\xef\x74"
+ "\xfb\x92\x54\x5f\x35\x3c\x8b\xe7\xcc\x88\xe7\x81\xc6\x5a\xbe\x8f"
+ "\x1a\x8a\xe5\xde\x25\xfb\x3c\x2f\xe0\xf1\xfa\xd4\xd1\x3e\x3f\xa1"
+ "\x86\x67\x15\x2e\x0d\xcf\x1e\x2e\x26\x5e\xab\x3e\x56\x27\xe3\x78"
+ "\x35\x4c\xf4\xd1\x8e\x35\xfa\x7a\xcc\x51\xc9\x57\x6c\xef\xbe\xc0"
+ "\x73\xb0\x53\x9e\xf5\xc8\xc7\xe3\x44\xbe\x93\x72\x94\x0d\x7f\xaa"
+ "\x5d\x03\xff\x44\xb4\xff\x33\x5e\xeb\x8b\xab\x13\x5f\x27\x92\x65"
+ "\x2a\x4f\xd9\xa5\xcf\xd9\xfa\xa4\xdd\xb8\x5a\x44\x65\xfb\x51\x5c"
+ "\x53\x91\xee\xc3\x95\xc7\xf0\x56\x5c\xd3\xc5\xfa\xc4\x6a\xe6\x4b"
+ "\xcc\x61\x6d\x98\x27\xf0\x3e\xa8\xad\xbf\xb3\x8a\x4c\x1b\xef\x9a"
+ "\x9f\x92\xf2\xa1\x7d\x73\x56\xb3\x1f\xf6\xd9\x16\xa2\xc5\x21\xd1"
+ "\x6d\xff\x16\x9f\x09\x7a\x73\x96\x6b\x0b\xfb\xae\xbc\x99\x19\xed"
+ "\xbb\xf2\x66\x2e\x7e\x15\xf8\x1d\x27\xfa\x75\x2a\xae\xb3\xfa\x7e"
+ "\xbf\xce\xed\x72\xbf\x39\x0b\x74\x94\x36\xd6\x95\xe9\x44\x2e\x8f"
+ "\x7e\xe0\x79\x51\xf2\x1f\x3c\xb2\xbd\x95\x82\xf0\x6c\x11\x03\x13"
+ "\x73\xf4\xf6\xfa\xf1\x9c\x66\x77\x61\x5c\x4b\x06\x4d\x86\xa2\xcd"
+ "\x03\x93\x76\x73\x7b\x19\xdf\xce\xe4\xf6\xa3\x91\xe7\x34\x19\x26"
+ "\xb7\xdf\x9f\x8c\x72\xa0\xa5\xb8\xe9\xc1\x02\x83\x9e\x3a\x9d\x78"
+ "\xdf\xc8\xd4\x09\x18\xca\x0e\x42\x7e\xc0\x30\xf2\xf7\xd2\x7e\x28"
+ "\x7f\x5f\x03\x7d\x8a\x7c\x98\x13\x5b\x8c\x33\xa0\x5d\xee\x5f\xe7"
+ "\x1c\x2a\x52\xfb\x07\x5c\x36\x10\x51\x96\x63\x5e\xc4\x2b\x8f\x3a"
+ "\x65\x79\xc6\xf5\x24\xbd\xf9\x90\xaa\xf7\xd7\x63\xfa\x93\xa5\xb2"
+ "\xe1\xb0\xef\x6a\x7d\x1c\x17\x83\xed\xa1\xb1\xde\x61\x01\xf2\xd6"
+ "\x6a\x18\xf3\xdb\xa1\x8f\x84\xe7\x24\xfd\xfa\x42\x4b\xb0\xfd\x0a"
+ "\xc7\xc3\x5f\x4b\x9f\x2c\xd1\x5d\x4e\xde\xd2\x3b\xe4\xb7\xac\xcf"
+ "\xd2\xae\x11\x5e\xbf\x8c\x09\xcf\xf7\x32\xb6\x28\xfb\x69\xf0\xd8"
+ "\x80\x39\x76\x6f\x4c\x45\x0d\x79\xeb\x38\x1d\x69\xde\x80\x5f\xc6"
+ "\x5e\xec\xf3\x23\x3f\xd9\xaa\x64\xea\xad\xcf\x64\xfc\x05\xc6\x37"
+ "\x74\x9f\x87\x71\xd6\x2a\x4e\xb6\x72\x1b\x5c\x98\xff\x79\x43\x5d"
+ "\x1e\x96\x09\xfb\x12\x5e\x2b\x7c\xeb\x7d\xf0\x9d\xd0\x2a\x4f\xb6"
+ "\x5e\x59\x1b\xde\x92\xe7\x81\x5c\x21\x71\xd6\x9f\x7c\xb2\x95\x6d"
+ "\x92\xaa\xb2\x24\xcb\x84\x5a\xe1\xe9\x4c\x69\x87\x8e\x7d\xeb\xf8"
+ "\x21\xa7\xea\x9b\x2b\x84\x7b\xdc\x68\x7b\x9d\xde\x76\xa4\xc9\xbd"
+ "\xb9\xd1\x35\x2a\xd6\xa4\x8f\x76\xa5\xf7\xbb\x66\x85\x7e\x66\x7b"
+ "\x80\x7d\x5c\x15\x2d\x76\x15\xf6\x8e\x0d\x57\x84\xc7\xae\xc2\xaf"
+ "\x51\x47\x8f\x5e\xc7\x91\xff\x66\x1d\x47\x2e\x57\x07\x74\xc3\x0d"
+ "\xa7\xe9\xed\x59\x57\x3e\x77\x7c\xdb\x2e\x79\xa5\xe2\x94\x5f\xe9"
+ "\xcc\xdf\x7c\x12\xc6\xfc\x2d\x64\x11\x24\xbf\x3b\x65\xa2\x72\x8e"
+ "\xbb\x19\xaa\xf8\x83\xa7\xd9\xd9\x4d\x9e\x25\x7f\xa1\x36\x7a\x5b"
+ "\xc6\xba\x6b\x86\x9e\x11\xeb\x12\x73\x7a\xd6\xb6\xcf\xe8\x31\xed"
+ "\xda\xc6\xf4\xde\x82\x7e\xd8\x1c\xc1\x67\x2d\x81\xbf\x90\xb7\x80"
+ "\xd7\x57\x8f\xf2\xba\x76\x8e\x48\xc6\x5c\x05\xba\x01\x36\x7a\x58"
+ "\xd2\x03\xf6\x8b\x9a\x6f\x75\xb4\xcb\xf9\x96\x5f\x9e\x4f\x1c\x28"
+ "\xe3\x69\xba\x17\x06\x78\xed\x3b\xdc\x93\x67\xef\x72\xd3\x0c\x8e"
+ "\xb3\xc9\xeb\xce\xc2\xb2\x37\x30\x3d\x94\x28\xe4\x7c\x0a\xb6\x3f"
+ "\xc7\xd9\xf4\x06\x7c\x14\x86\x1d\x5d\x7b\x91\xd2\x6b\x61\x7b\x42"
+ "\x67\xa7\xb1\x5e\xaf\xd7\x63\x6d\xae\xbf\xd8\x17\x6b\xb3\x8e\xd7"
+ "\x7a\x5a\x71\x7f\x91\xcc\xe1\xca\x8e\xf6\xcd\x17\x29\x63\xcb\x12"
+ "\xca\xdc\xcc\x6b\x79\x7f\x57\xb6\x0f\xdb\x15\x32\xee\xe6\xc2\x4c"
+ "\x5e\xcf\xef\xb3\x7d\x96\x72\x5c\xe0\x5e\xbd\x65\x96\x6b\x20\x57"
+ "\x44\xef\xdf\xc8\x71\x30\x54\x71\xca\x1e\x4a\x4d\xda\x0d\xda\x61"
+ "\x2c\x7b\xbb\x11\xf4\xcb\x89\xd7\xb7\x86\x1f\xd6\xa6\x88\x58\xa9"
+ "\x87\x32\x94\x7e\xf7\xd1\x3b\x96\xfe\x78\x22\xbc\x39\x8f\x46\x77"
+ "\x50\x96\xf2\x69\x48\xc6\x98\xf8\x4e\x11\xef\x9f\x97\x3d\x43\xb6"
+ "\xf0\xe6\xd9\x09\xae\x5f\x51\x22\x7f\xe7\x9c\x7f\x65\xff\x10\xed"
+ "\xa3\x8b\x28\x8b\xf7\x1f\xd8\xef\xc1\xbe\x42\xe6\x1f\x97\x51\x4a"
+ "\x59\x91\xb0\x73\x95\x63\xd4\x5d\xf6\xc9\x0b\x9e\x5c\xf8\x4c\xf1"
+ "\x9c\x92\xf9\x4f\xcc\x2f\x9a\x5f\xb2\x4c\x86\x50\x18\x29\xff\xdd"
+ "\x3b\xa2\x70\x96\xdc\x74\x8e\xb0\x2f\x32\xfa\xd6\xe3\xde\xb9\x10"
+ "\xe2\xf5\x83\x2b\xa2\xd7\x3b\x52\xff\xd5\xc2\x96\xaa\x95\xbe\x3b"
+ "\xbb\x2d\xbe\x84\x0f\xe5\x98\xb5\x0e\x69\xeb\x74\x1f\x9b\x93\x7a"
+ "\x3e\x6d\x5d\x62\x35\xf8\x78\xec\x09\xfa\x6d\x88\xf7\x43\xd0\x57"
+ "\x3e\x6f\xe9\x69\x9e\x4b\x8e\xe5\x35\xfe\x66\x5e\xcb\x58\xc4\xf9"
+ "\x77\xaf\x64\x1f\x06\xf6\x87\x02\x1f\x6e\x3b\xa1\x3f\xeb\xdf\x4c"
+ "\xdf\x1c\x5a\x68\xdb\x16\x3a\x67\xdb\x21\x44\xde\xeb\x62\xa1\x63"
+ "\xb3\x38\xe7\x78\x3d\x22\xfe\xdb\x55\x28\xff\x4b\xc8\xc9\x0f\xf0"
+ "\xbb\x5e\x54\xec\xa8\x80\xfc\x0d\x3b\x4d\xbb\xb7\x33\x0e\x53\x1d"
+ "\xe2\x5c\x5f\x2c\x84\xdd\xef\xe3\xb9\x07\x3f\x4d\x54\xec\x6c\x88"
+ "\xd8\x5f\xe3\x77\x9f\x71\xfe\xe2\x79\xec\x13\xb6\xfb\x0c\xe3\x25"
+ "\xd6\xee\xdc\xe9\x77\x39\x12\x91\x3f\xac\xf0\x7c\x37\xd9\xbb\xa6"
+ "\x85\xec\x4f\xc8\x7b\x8b\xe7\x29\xb6\xe7\xde\xfd\x95\x30\xb9\x04"
+ "\xef\xc1\x79\xdb\x43\xa4\xce\xab\xbd\xe3\x64\x1f\x84\x3a\xd8\xdb"
+ "\xb5\x83\x29\xad\x7a\x30\xa5\x76\xb9\xdf\x1d\xd3\xeb\x7f\x61\x51"
+ "\xe3\x2d\x8f\x79\x1c\x3b\x1b\xfa\xa8\x8b\xc7\x4f\xc6\x83\x79\x18"
+ "\x30\x0b\x78\x7f\x4e\x9d\x8f\x7a\xb7\x08\xb6\xa5\xed\xca\xf5\xf1"
+ "\xbb\xf2\x7b\x2a\xa3\xd7\x51\x01\xaf\x69\xf3\xbe\x33\xc7\x96\x86"
+ "\xbc\xb6\xab\xf9\xc6\x6f\x3f\x95\xfb\xea\xd0\x29\xbc\x5f\x52\x5f"
+ "\x06\x3b\xc1\xb2\xb7\x83\xed\x9b\x90\x9b\xca\x79\x6f\x53\xbb\x78"
+ "\x66\x37\xef\x47\xcb\xb3\x85\x32\x26\xfb\x9f\xa8\xfe\x02\x99\xdb"
+ "\xe8\x5d\xfe\x56\x77\x5a\x1f\x5d\x7f\xfb\x43\x86\x21\xd6\x6e\xb7"
+ "\x5b\x4b\x4d\x15\x0c\x43\xbb\x78\x36\xdb\x28\x07\xda\x0d\xe0\x72"
+ "\xe0\x83\x1b\x64\x39\xce\x2b\x63\xa2\xa4\xcd\x86\xcd\x67\x97\x75"
+ "\xaa\xe7\x19\x02\x72\x18\xba\x18\xde\x8d\xfb\x59\x4c\x27\x5c\xf3"
+ "\xe4\xda\x2f\xe6\xeb\x32\x16\x8f\xe5\xe3\xdd\x5e\xdf\x29\x8f\xc4"
+ "\x87\x7d\x71\x4b\xa0\xb3\xa4\x3d\xf8\xdb\x67\xeb\xbe\x20\x73\xf1"
+ "\x53\xdc\x7f\xbf\x93\xeb\xfe\xe0\xa7\x06\x85\xdf\xef\x92\x3a\xd7"
+ "\xbe\x5d\xd0\x69\x39\xe5\x0b\x98\x2c\x74\xd8\x16\x64\x5d\x59\x7d"
+ "\xd8\xd6\x8d\xf1\xee\xb7\x4d\x3e\xd3\xb6\x6a\x65\x8b\xa8\x72\xbc"
+ "\x4f\x0c\x3b\xb5\x3d\xd1\x96\xe6\xc2\xfb\x0e\xc3\xef\x02\x36\x69"
+ "\xfb\x7a\xbc\x03\x6d\x1b\x99\x6e\x3e\xda\x9d\xd3\x52\xa4\xce\x66"
+ "\xe0\xf9\x2a\x3e\x6f\x2f\x69\xbd\xfa\xe9\x76\xeb\x2a\x0f\x9f\xff"
+ "\xcc\xb6\x86\x72\x4c\xbc\x0f\xcc\xe7\xfe\x39\x16\x02\x9f\xfd\xe7"
+ "\xb5\x3c\xfd\x7d\x56\xcc\xfb\x91\xc6\xfb\x2e\xf7\xef\x0a\x8d\x33"
+ "\xfb\x1c\x53\x89\x7d\x0c\xc2\xba\xaf\xa0\x8c\x35\x74\x5e\xed\xa3"
+ "\xb2\xaf\x20\xaf\x23\xf2\x99\x47\xde\xeb\x44\xb9\xda\x5e\xdf\x4d"
+ "\x79\xd6\xe7\x77\xbb\x0c\xdf\x28\xdc\xef\xef\xf5\xeb\x01\x2d\x3a"
+ "\x2b\x4e\xb5\x06\x52\x13\xab\x03\x15\xa7\x6c\x78\x77\x0c\xfa\xb0"
+ "\xdf\x58\x44\x72\xee\xc7\x31\x99\x9f\x23\x93\x96\xb2\x8f\xe7\x05"
+ "\xa6\xc3\x01\xd2\xcf\x39\xef\xb9\x53\x3f\x13\x9f\x78\x96\x7e\xf7"
+ "\x8f\xbe\x3d\xc7\xb0\xbe\x5e\xb6\x67\xb6\xb2\xd7\xf6\xcc\x96\xeb"
+ "\x65\x6b\x4f\x79\xde\x58\x1e\x34\xed\x5e\xee\x33\xa9\xb3\x0f\x7b"
+ "\x66\xf8\xe8\xc0\x1a\xc3\x6f\x05\xf9\xd2\xfa\x8b\xbd\x26\x2a\x3e"
+ "\xe8\x50\x30\xf7\xca\xf5\xc4\xbe\xf9\xcf\x5e\xe9\x1b\xc4\xfb\x83"
+ "\x1a\x8f\x95\x29\x7f\x38\x2a\x7d\x30\x8a\xcf\xf3\xba\xd9\x55\x6a"
+ "\x2e\xb6\x57\xff\x96\x94\xf4\xf5\xbc\xf6\x74\xf4\xf3\x60\x7e\x56"
+ "\x34\xdb\xe3\x33\xd6\xe0\x37\x98\x34\x8e\xcb\x2d\x5c\x5b\x45\xc0"
+ "\x5b\x1c\x20\xd8\x61\x7e\x2f\xc6\x5e\xd4\x21\x8a\x17\x71\xdc\xfc"
+ "\xbd\xd7\x31\xed\x95\x4c\xed\xad\x94\x38\xb9\xef\x16\x2e\xb6\x3f"
+ "\xfd\xec\x03\x72\x9e\x90\xef\x1a\xe4\x1b\xdf\x58\xda\x01\x1d\xb8"
+ "\xd7\xc7\x31\x0f\xdb\xf4\xba\xfd\xc9\x1f\x74\x7c\x27\x95\x0a\xba"
+ "\xdc\x7b\x61\xff\xbf\x90\x73\xe5\x72\xbe\x77\xd6\xe5\x6c\x11\x35"
+ "\x36\xe6\x50\x7f\xf3\x19\x9e\xaf\xde\x86\xfa\xa7\x0a\xc6\x7f\xdf"
+ "\xf8\x90\x29\x48\x3d\xa6\x01\xe2\xbb\xe5\x4e\xe8\x81\x01\x22\xbc"
+ "\x1c\xfd\xd5\x69\x83\xbd\xdb\x44\x2d\xa1\x46\xe9\x23\x02\x19\xb6"
+ "\x96\x05\xc4\x79\x6f\x68\x8f\xf4\xef\x55\xe7\xe0\xf7\xfd\xd0\x1b"
+ "\xfa\x90\x5a\x8a\xfd\xe4\x59\xf4\x17\x8c\x59\xfb\x46\x30\x5e\xb7"
+ "\x15\x97\xd3\xa8\xb3\xfc\x7e\x6f\x9b\x1a\x27\xf7\xe5\xe8\xd7\x34"
+ "\x8e\x8d\x19\x89\xd3\xbd\xcf\x2d\x78\xb2\x64\xfe\xc2\x05\xa3\xa6"
+ "\xcc\x5d\x32\xb7\xc8\xfe\xa0\x72\xb9\x8b\x1a\xbf\x2c\x7d\xf1\xbf"
+ "\xdf\x4b\xe5\x31\x85\x6d\x15\x8e\x03\x7e\xb9\x18\xe0\x46\xfc\x6f"
+ "\xd8\x0d\x19\xbc\xbe\xf7\xbf\x19\x03\xdc\xb0\x45\x38\xfe\x77\xdf"
+ "\x5a\xf7\x7b\x4d\xbd\x32\xa0\x1d\xec\xe2\x67\x3e\xfb\xa9\xb9\xf7"
+ "\x4d\x61\x39\xaa\x93\xfe\x69\xef\x4d\x8c\x8c\x95\xc4\xbe\x78\xbc"
+ "\x3e\x82\xf4\xd9\xc6\x39\x5b\xf0\x22\xc6\x8d\xf7\x8a\xfa\xce\xfd"
+ "\xbc\xe7\x44\x7f\xab\x77\x16\x99\xb7\xc2\xd8\x13\xd6\xbf\xbb\x26"
+ "\xf7\xb0\x35\x77\x4f\x8e\x5a\x87\x79\x6f\x7d\x9d\x36\xc0\xa2\xf6"
+ "\x00\xde\xdb\x63\x9c\x29\x53\xb2\x79\x50\x97\xcd\xf7\x9a\x2e\xb7"
+ "\x6f\xdf\x27\x1b\xfb\x2d\x7d\x72\xfd\x37\xbd\xec\x7e\xcb\x57\xed"
+ "\xf9\xeb\xf6\xf0\x75\xa7\xe9\xf7\x37\xf0\xda\x0c\xee\xbf\x8d\xfb"
+ "\x24\x39\xd6\x4a\xff\xfa\xf7\x3f\xd7\xef\x51\xc7\xfb\x7f\xd4\xef"
+ "\xbf\x89\xfb\x77\xf5\xfb\xa1\xb8\x7f\x4d\xbf\x87\xcc\xbe\xbf\x4a"
+ "\xbf\x4f\xc7\xfd\x7c\xfd\x1e\x3a\xff\xfd\x07\xf4\xfb\x21\xb8\xff"
+ "\xa1\x7e\xff\x0d\xdc\x0f\xd7\xef\x21\x83\xef\x27\xeb\xfb\xa7\x16"
+ "\xe0\x7e\xe1\xca\xed\xf3\xfd\x1e\xb5\x47\xf7\x3e\xc1\x16\xda\xa6"
+ "\xc6\x8c\xde\xb4\x74\xf0\x74\xa1\x41\x5f\xa4\xef\xe7\x7a\x90\x3e"
+ "\xd2\x47\xdb\xdb\x22\xd2\x1b\xf4\xfc\x13\x31\xde\xf8\x22\xd2\x6b"
+ "\xf5\xf4\xd9\xb0\x41\x2d\x11\xe9\xd5\x7a\x7a\x09\xf4\xa2\x23\x22"
+ "\x5d\x8f\xeb\xf0\xfe\x3a\x1f\x6d\xb5\x45\xa4\x3b\xf5\xf4\x6d\x86"
+ "\xbf\x82\x9e\x5e\xa4\xa7\x1f\x40\xfa\x91\x88\xf4\x02\x3d\x1d\xfa"
+ "\xff\xbd\xd6\x88\x74\xb5\xae\x20\xcf\xa2\x59\xc5\xe1\x52\x96\xad"
+ "\xf7\x83\x3e\xda\xb2\x3f\x22\x4f\xae\x2a\xfb\xfb\x34\x1f\xd5\x46"
+ "\xb6\x65\xac\x9e\x9e\xe9\xa3\xbf\x6f\x8d\x48\xcf\xea\x4f\x57\x25"
+ "\xd4\x50\x41\x7f\x6b\x98\xfc\x9d\x2a\xe9\x27\x29\x6d\xcb\x0f\xe6"
+ "\xf2\x39\x35\xeb\x16\x71\xc2\x5e\x26\xc4\x09\xfa\x60\x8a\xf2\x0f"
+ "\xdc\x7b\x9c\xfd\xb5\xd4\x79\xbf\x0f\xc6\xc8\x33\x60\xec\x73\xce"
+ "\x67\x00\x97\x73\xda\xef\x65\xec\x93\xd1\xce\x72\x15\x93\x53\xf9"
+ "\x9f\x76\xc8\xb9\xbc\xbe\xcf\x89\x3c\x9f\xf3\xda\x26\xc3\xe1\xf5"
+ "\x3e\x6f\x49\xb7\xf4\x89\xe4\xb9\x14\xa7\xf1\x9c\x56\x9e\x0b\x8b"
+ "\x98\x53\x29\xbd\xff\xc1\x5c\x8d\xcf\xed\xbb\xd5\xbc\x9f\x65\x91"
+ "\xf3\xb3\x6f\x4e\x64\x5e\x1f\x7d\x20\xe7\xa6\x89\xb6\x6b\xfe\xad"
+ "\xcb\xfd\xc1\xc4\xbe\xb3\x4a\xbf\xaf\xd5\xd3\x3f\x45\xfa\xec\x88"
+ "\xf4\x8a\xfe\x75\x3b\xf4\x9d\x65\xbb\xa3\xe7\xa2\x08\x84\x2e\x8a"
+ "\xe0\x86\xff\x00\xde\xf3\xe4\xb9\x9b\x6f\x85\x2b\xb6\x3b\xf5\x18"
+ "\x18\x9f\x87\x96\x08\x3f\x74\x36\x7f\x63\xe2\xea\x69\x01\x3f\x4d"
+ "\x2b\xee\x12\xeb\x9f\x60\x3f\xbb\x0b\x32\x1e\x94\xab\x83\xe3\x6f"
+ "\xb3\xef\x56\x80\xf7\x87\x52\x5b\x30\xc6\xd5\xcd\xe3\xf7\x9f\xd1"
+ "\x54\x87\x9f\x9a\x1d\x61\xaa\x03\xec\x2d\x4f\x18\x7e\x93\x1f\xf4"
+ "\xc6\xff\x61\x1c\xb8\x3e\x97\xfc\x56\xcc\x81\x51\x8c\x2b\x7f\x0b"
+ "\x4f\xac\x4f\xf2\x88\x8f\xd9\x96\x3d\xe9\xb3\xae\x22\x3b\xc6\xf6"
+ "\x6c\xdc\x1f\x95\x3f\x7e\x87\xf4\xfe\xda\xa4\x64\xf9\x80\xee\x8f"
+ "\xb9\xbd\x5d\xe9\x8b\x03\x25\xe2\x5f\xf8\xdc\xd1\x01\x3e\xff\xb4"
+ "\x1f\x76\x73\x5c\xff\xab\x95\x5b\xc8\xd4\xb3\x16\xb6\xc9\xd9\xfd"
+ "\x26\xa5\x9f\x3e\x2c\xd4\x4c\x96\x55\xbc\xae\x28\xbf\x13\xb1\x76"
+ "\x5f\xe6\xae\x05\x41\x53\xf3\xf2\x36\x5a\xf1\x0d\xb2\xcd\x0e\xb2"
+ "\x2f\xf9\x81\x2f\x06\x95\x70\x2c\xae\x53\x1e\xd8\xa1\xa6\xdf\xe1"
+ "\xfd\x47\x0b\xf6\x9b\x42\xd2\x5e\xf9\xb0\x50\xae\x45\x55\xec\x65"
+ "\xbf\x33\xab\xb7\x35\xcc\x67\x8f\xa4\x9d\x0c\xfd\x6f\x09\x2f\x75"
+ "\x0c\x0e\x2d\x76\x5c\xbd\x65\x11\xa5\x86\x17\x67\xa6\x6f\xbc\x48"
+ "\xd9\xc6\xf8\x83\x39\x6c\x96\xe8\xb2\xa5\x54\x61\x4c\xe1\x39\xee"
+ "\xa0\x84\x34\xb9\xe7\xc6\xf7\x9a\xe9\x8d\x8c\xba\x25\x97\xff\xe6"
+ "\x4d\x18\x73\x5b\x8e\x3d\xcd\xb8\xc4\x6b\xeb\xba\xd7\x31\x5f\xd6"
+ "\xcf\xc9\x96\x7d\x41\x43\x30\x6f\x31\x0d\xba\x20\x3c\xa7\x8b\xc8"
+ "\xc4\xdf\x09\x29\x9b\x2b\xd7\x91\x92\x9a\x1d\x21\xf2\x3a\xff\x4a"
+ "\x65\x8b\xb8\x8f\x3e\x7c\x9f\xed\x34\xf6\x9b\x44\xfe\xb4\xd3\xf4"
+ "\xe1\x1f\xad\x41\x8c\x19\x41\xd8\xd2\x4f\xf1\x9c\xf0\xc3\xcf\x02"
+ "\x32\xf6\xed\x47\x76\xf6\x1d\xf7\x2c\xba\x87\xd3\xbe\x74\x7d\x21"
+ "\xbf\xf9\xeb\x53\xb2\xf5\xe1\x31\x7e\x76\xf1\xb9\xdd\x94\x0f\x32"
+ "\x7e\xd3\x1d\x4c\x52\x6b\x15\x1f\x7e\xaa\x8f\x0f\xbb\xd5\xfc\xeb"
+ "\xc3\x63\xfd\xf1\xae\x56\xf1\x66\x85\xf8\xff\xd8\xfb\x1e\xb8\x28"
+ "\xab\xac\xff\x3b\xc3\xa0\x83\x0e\x30\x1a\xd5\x68\x68\x53\xd9\x36"
+ "\xb6\x66\xd4\xda\xfe\xd8\x5e\xdb\xa8\x74\x5f\xb7\xb5\x90\x56\x5d"
+ "\x7a\xb3\xc4\x02\x1b\xcb\x3f\x13\x21\xa2\x21\x20\xba\x38\x20\xff"
+ "\xdc\xb5\x7d\xb1\x90\xd8\xf7\xd5\xfd\xe1\xae\x6d\xec\xfb\x33\x97"
+ "\x36\x4c\x2c\xdd\xb0\x80\x41\xc3\xc2\xc2\x9c\x08\x71\x34\xb4\x11"
+ "\x47\x19\x61\xe6\xb9\xbf\x73\xee\x7d\x1e\x66\x06\x18\x18\x46\xfc"
+ "\xd3\xbe\xf2\xf9\x3c\x9f\xe1\xb9\xcf\x7d\xee\x73\xef\x39\xdf\x7b"
+ "\xce\xb9\xff\xce\x41\xdf\xe8\xc5\x0e\xf2\xa4\x8d\x9a\xd9\x7a\x26"
+ "\xfa\x2b\x48\x79\xb8\x8a\x5e\x28\x24\xfc\x8c\xdd\x07\x9b\x85\xec"
+ "\xed\x46\xee\xaf\xf2\x83\x8d\x84\xef\x45\x02\x1d\xb9\xbd\x88\xcf"
+ "\xe5\x6e\x2f\xe3\x73\x9b\xdb\x2b\xd6\x8e\xc5\xbd\xca\x1f\x14\x9d"
+ "\x0b\xda\x5e\x0d\xbf\x8b\xcf\x8d\xd8\x53\xe4\x5d\x1f\xfd\xa9\x42"
+ "\x3b\x9e\x84\xe1\x9c\x3a\xee\x3b\x7e\x8b\xef\x37\x86\x6f\xec\x29"
+ "\xa6\xd9\xec\xd9\xad\xcd\x06\x12\xc0\xc7\x7b\x1f\x9c\xbc\xb7\x98"
+ "\x68\xa1\xae\xc1\x54\xb9\x5d\xcf\xf6\x78\x19\xb7\xa7\x98\xda\x68"
+ "\x15\xee\x2d\xe4\x6b\x1f\x7b\xca\x68\xd0\x76\x3d\xcf\xbf\xe7\x67"
+ "\x75\x6d\xd0\x06\xe5\xf6\x48\x93\xfd\xb4\x68\x13\xee\x01\xec\x6f"
+ "\x8f\xa4\xc6\xed\x33\xf8\xf9\xf7\x3d\xd9\x92\x5c\xe5\x18\xdd\xb3"
+ "\x9a\xd3\xed\x4f\x15\x9c\x6e\x7b\xca\x44\x7d\x75\x2b\xfe\x0f\xba"
+ "\x3b\x82\xaf\xd5\xef\x49\x92\x6c\x64\xb3\x98\x07\xdf\x81\xff\x63"
+ "\xb9\xac\xdd\xb3\x09\xda\x2e\x9e\x61\xd8\xc3\xd6\x0b\xa1\x7d\xa0"
+ "\xb3\x3e\xa8\xc7\x76\x79\x93\xad\x8c\x16\xa9\x24\x00\xea\x1c\x8b"
+ "\x7b\x4a\xd1\x4e\x31\xd9\x1e\xae\xe2\xb1\x2c\xf7\xde\xc7\xce\x01"
+ "\xc3\x77\x80\x3f\x72\x94\x9b\x78\x6e\x19\xcb\x73\xd5\xbf\xea\x46"
+ "\xa9\x2e\xf8\x3d\x7c\x06\x6d\xc5\x7d\x75\x48\xab\x19\x98\x07\xf9"
+ "\xda\x6a\xc0\x39\x8e\xf3\x40\x33\xdc\x2f\xb4\x37\x0a\x69\xc2\x69"
+ "\xb6\xb7\x3b\xe6\x39\xa7\xd7\xde\x51\x9e\xf4\xe0\xf7\x82\x12\x64"
+ "\x43\x22\xee\x1b\xd9\x1b\x25\xd2\x4f\x1c\x07\x54\xb1\x38\x9c\xfc"
+ "\x59\xd5\x36\xb7\x77\xc7\x75\xe7\xe5\x71\x53\xe5\xb8\x06\x8b\x73"
+ "\xf2\x1c\xaf\x55\xf5\x6e\xef\xd5\xcf\x3f\x8b\x36\xf2\xb6\x48\x8c"
+ "\x73\x89\x34\xef\xc8\xac\x6a\x71\xd1\x9b\x97\xd3\xc7\x37\xc6\x4b"
+ "\xdf\x30\x93\xaa\xad\x52\x3d\xe1\x7f\x51\x07\xef\xd5\xb9\x78\x52"
+ "\x35\x43\x7a\xaf\x84\x9d\x25\xda\x63\xc3\x33\x90\x7d\xca\x41\x5c"
+ "\xfb\x01\xaa\xd4\x39\x1e\xae\x62\x78\x24\x7b\x4b\x71\x4f\x2c\xd0"
+ "\x35\x96\x63\x68\xef\x3a\xae\x0b\xf7\x96\x62\x99\xb8\xae\xc2\xfd"
+ "\x9d\xee\x2d\x82\x72\xc5\x58\xdd\x7b\x77\x88\x75\x80\xf1\xdf\x07"
+ "\x5b\x7b\x8e\xeb\x1e\x5d\x10\xcf\x0e\xfb\xde\xb3\xdc\xd0\xf3\x5c"
+ "\x91\xd2\x75\xae\x73\xaf\xc5\x75\x2e\xb6\x52\xcd\xe9\xfd\xe1\x14"
+ "\x18\xa7\xee\xcc\xe7\x7e\x71\x2b\xf2\x81\x67\xe9\xe7\xc9\x58\x8c"
+ "\x0f\x93\x66\xa0\xa7\xea\x0c\x30\xb6\x56\xee\x9a\x46\x8d\xbb\x66"
+ "\xa4\x9d\x27\x23\x70\xcf\x05\xca\x1b\x9c\xef\xa1\x41\x90\x9e\xbd"
+ "\x6b\x86\xeb\xec\xdd\x3e\x33\x8c\x6d\xcb\xf2\x60\x2c\x9b\x7e\x9a"
+ "\x8c\xe5\x7b\x28\x3e\x94\xe6\x7d\xde\x10\x8c\xbb\x66\xe2\xb9\xce"
+ "\x3a\x18\x11\xd2\x74\xfd\x1b\x42\xf6\xae\x99\x50\xee\xbc\xf4\x25"
+ "\x64\x34\xea\x37\xdc\xab\xcb\x31\xb3\x0f\x74\xca\xae\x79\xe8\x73"
+ "\x4d\xa0\xb1\x32\xf8\x7e\xa9\xa0\x7c\xdf\x92\x27\x10\xb6\x47\x1c"
+ "\x70\x26\x6f\x26\x1f\xee\x85\xef\x97\x62\xdc\x4a\x9c\xf3\x31\xd9"
+ "\xed\xe8\x17\xa2\x14\x9e\x85\xc0\x33\x9c\xef\x11\xd0\xff\x1a\xfa"
+ "\x73\x87\xf2\x35\x58\x3e\x7c\xab\x94\xd7\x9d\xf9\x45\x29\x6d\x26"
+ "\x1f\xdd\x86\x79\x24\xbf\x6e\x42\x7a\x6c\x00\x3e\xc7\x73\xc2\x4e"
+ "\x8c\x8b\x00\xd6\x39\x7f\xa7\xb1\xfb\x1d\xd1\x7e\x86\xbe\xbc\xef"
+ "\x3d\x9a\xb3\xa7\x1c\xf2\x56\xe0\x9e\x54\x6e\xcb\xee\xdb\x29\xf6"
+ "\x75\xb0\x8f\xf7\xbd\x2b\xfe\xaf\xea\xce\x9b\x1e\x4b\xd2\x2e\x12"
+ "\x0d\x5b\x57\x5d\x11\x00\xb2\x77\x9f\x0a\x63\x2c\xb8\x95\xf9\x0d"
+ "\x96\x97\x8b\xfe\xe2\x12\x88\x0a\xe4\xf2\x48\xa8\x37\xc6\x47\xf9"
+ "\x06\xe7\x6a\x45\xda\x98\x81\x4f\xe5\x05\xdc\x27\xe0\xce\x3c\xc0"
+ "\x7e\xda\x6a\xb0\x07\x56\x13\xd5\x6a\x27\x09\xc7\x76\x02\xdf\x2c"
+ "\xb8\xaf\x1a\xc7\x6e\x48\x1b\x91\x87\x95\xd0\x96\x7d\xab\xf5\xb4"
+ "\x65\x75\x1b\xb5\xd4\xea\x1b\x09\xe8\x99\xd1\x75\x86\x7a\xf4\x4d"
+ "\xfe\x0d\xb6\x15\xe7\x28\x81\xa6\x60\x4f\xc2\x37\xb2\x77\xed\xc3"
+ "\xb3\x32\x6c\x9e\x40\xbe\xb7\x42\x3a\x57\x54\xc2\xce\x1e\xed\x8b"
+ "\xe8\x9e\xfb\x4a\xa6\xfb\xc4\xba\x54\x0b\xf8\x7f\x32\x3b\x9f\x38"
+ "\x02\xc7\x3f\x38\xa7\x31\x7f\x65\x69\xf7\x19\x0d\x3e\x37\xb0\x6f"
+ "\xb1\x9b\x5f\x2e\xf6\x2e\xce\x11\xe0\xbb\xd1\x0e\x7a\xbe\x40\xcc"
+ "\x8b\xef\x46\xaf\x9c\x4f\xf1\x5d\x78\xa7\xb4\xfb\x1d\x8f\x33\x3e"
+ "\x1f\x71\xbb\x02\x68\x8b\xff\x5b\x81\x96\xe2\x1e\x2a\x2d\x5f\xff"
+ "\xde\xd7\x28\xad\x39\x9b\xc9\x87\x85\x88\xa7\xbe\xfd\x89\xef\x27"
+ "\x9e\x3e\x92\xf6\xd7\xa3\xff\x26\x48\xd7\x48\xbe\x8c\xe0\xff\x09"
+ "\x50\x16\xb7\xb3\xdd\x7c\x94\xe5\xbb\xf9\x3b\x4c\xb7\xd2\x6f\x11"
+ "\x27\x20\x57\x02\x4e\x91\xfd\x06\x9a\xfd\xbe\x85\x9f\x93\xda\xbf"
+ "\x17\xeb\xd9\x4c\xf6\xe3\xfc\x5a\x28\xf7\xa5\xb0\x7f\x8d\x28\x3f"
+ "\x1a\xa3\x9d\x8e\x50\x33\x7c\x13\xcf\xfc\xb8\xdd\xa3\xef\x31\x35"
+ "\xe4\xfb\x1b\xf7\x07\xb8\xdf\xd0\x23\x3f\x3e\xcf\xe8\x71\x1f\xd5"
+ "\xe3\x5e\x6b\x83\x7e\xe3\x6d\x6d\x3d\x6f\x2c\x9b\x3f\x74\x84\xac"
+ "\x21\x86\xf4\x93\x24\x00\xb0\x72\x1c\xeb\x56\x67\x69\xc3\x36\x85"
+ "\xd2\xcc\x08\x82\x73\xa0\xcc\xb6\x04\x9d\xde\x3c\x01\xf2\x9c\x24"
+ "\x37\xe1\xbe\x6f\x8c\x91\x02\xf9\x4f\x71\x3f\xe6\x1f\x3f\x3d\x6f"
+ "\xf9\x08\x22\xbc\x18\x3b\x92\xca\x63\x8a\x70\x6d\xef\xed\x4e\x73"
+ "\x20\xae\x73\xa5\x6d\x06\x4c\x3a\xc9\x4d\x80\xb1\x16\x8c\x47\x07"
+ "\xef\xb4\xfd\x77\xa7\x25\xd0\xe4\xf8\x92\x18\x5e\x22\xf2\x53\xe4"
+ "\xe3\x99\x8a\x54\xa2\x28\x68\x25\xe8\xbb\xdb\xf1\x91\x23\x92\x48"
+ "\xbe\x10\x8a\x47\xf3\x73\xdc\xc5\x20\x5f\x5f\xd5\x50\x7b\x47\xe6"
+ "\x3f\xcb\x60\xec\xb5\x49\x1a\x63\xe7\xf2\x38\x28\x0a\xf8\xfe\x8d"
+ "\x72\xd1\xef\x03\xa7\xed\x3f\x8f\xf3\x73\x56\x61\x2f\xc2\x3b\x4d"
+ "\x2e\xfb\xfb\x63\x1e\x6b\xdc\x58\xa9\xe2\xb2\xef\x63\xfd\x47\x60"
+ "\xc1\xaf\xe3\x7b\x14\xc2\x3a\x32\x3f\x56\x76\xef\x51\x60\xf3\x56"
+ "\x1f\xeb\x69\x76\xa5\x8a\xdb\xe6\x95\xaa\xf9\x4e\xa5\xd8\x07\x31"
+ "\x7d\x5b\x24\xbe\x0b\xef\x85\xda\xd8\x1c\xd3\xc7\xd3\x5c\x58\xfb"
+ "\x98\x9d\x33\x82\x36\xa9\xcc\xe4\x9f\x19\xd8\x2e\xa4\x09\xe4\x53"
+ "\xc0\xfd\xba\x8f\xb6\x7a\xf1\x0b\xab\xdc\x66\x71\xb0\x39\x90\x13"
+ "\x15\x80\xa7\xd3\xc0\x83\x1b\xd0\xf7\x93\x09\xbe\x53\x5b\xd2\x49"
+ "\x6a\x35\xe7\x48\x1d\xfc\x8f\x7b\x91\xab\x5e\xfa\x96\xb4\x68\xfb"
+ "\xd6\x37\xa0\xb3\xf4\x50\xe7\x14\x2c\x0b\x65\x01\xee\xdf\x32\xa5"
+ "\x82\xfe\xb1\x42\x59\x2d\x84\x95\x51\x2b\x58\x48\x6d\x0a\x8c\xb3"
+ "\x72\x03\xab\xea\x4a\xbe\x24\x75\x9a\xcf\xd8\x77\xd0\x26\xac\x4a"
+ "\x3c\xd7\x5f\xd9\x46\x28\xbb\x48\x2c\xbb\x0d\xca\x0e\xf3\x5a\xb6"
+ "\xb1\xd5\x3c\xc8\xb2\x7d\xaf\xb7\xb1\xb5\x7e\x30\x65\x83\xbd\xdb"
+ "\x86\x71\x6e\xf0\x5c\x57\xda\x18\x12\xec\xbc\x80\x7e\x3f\x6f\xa5"
+ "\x7c\x3f\xec\x81\x87\xd8\xd9\x2f\x5c\xab\xcd\x7e\xd7\xc2\xce\x80"
+ "\x9d\x21\x6c\x4f\x23\x3f\xf7\x75\x9c\xe0\x7e\x88\x8e\xcc\x03\x3a"
+ "\xd7\x58\xa9\x7b\x9d\x0a\x6c\xd5\x03\x33\xf9\xbe\xc7\x77\xc5\xb5"
+ "\x87\x03\xe8\x37\xd2\xcb\x38\xef\xef\x61\x7c\xff\xec\x81\xdf\x4a"
+ "\xf3\x2f\xe7\x82\xfe\x1e\x26\x96\xa5\xed\x39\xaf\x27\x05\xa4\x4d"
+ "\x48\x49\x92\x62\xdb\x26\x89\xc7\x4f\x9f\x4a\x78\x21\x61\x51\x72"
+ "\x42\xbc\x76\xf6\xf2\xc4\xa5\xf7\x2c\x5b\xb8\x50\xfb\x44\xc2\xab"
+ "\xaf\x2e\x78\x31\x61\x04\x99\x9d\xb8\x60\xe9\xab\x8b\x70\xee\x4d"
+ "\xab\x9d\xf6\x93\xf9\xfa\x65\x49\xf7\xfc\x7c\x5a\x44\x8f\xb9\x37"
+ "\x3c\xab\xd8\x84\x36\x38\xe8\x8e\x9b\xd2\x9c\x64\x14\xfa\xf1\x09"
+ "\x5d\x49\xab\x5e\x83\xf1\x1f\xe0\xef\x14\xea\x29\xd4\x0d\x38\x36"
+ "\x40\x1f\x82\x20\xbf\x6b\xde\xfc\x03\xad\x6f\x25\x5f\x39\xc1\xae"
+ "\x6c\x7c\x8b\xfb\xc3\x6b\x82\x31\xb9\x95\xc7\x5b\xfc\xea\x08\xfa"
+ "\xba\xdb\x00\x69\xd6\xa0\x4a\x55\xc1\xd7\x44\x01\x7a\x0d\xc6\x25"
+ "\x9f\x14\x51\xf9\x70\x9a\x7b\x13\xdd\x47\xbf\xd5\x10\xd1\x87\xb8"
+ "\xdc\x64\xb6\xe3\x7a\xbe\x32\xda\x91\x4e\x51\x9e\xf2\xbe\xf5\xc9"
+ "\x66\x4e\x97\xed\x46\xbe\xaf\xf8\xab\xf7\x70\x0c\xb3\x96\xc5\xc3"
+ "\xfc\x04\xfa\xff\x6e\x83\x4b\x4e\x7f\xb6\x4f\xb4\x1d\x71\xbd\x7d"
+ "\x45\x33\xdc\x73\x3f\x23\x9f\x34\x78\xee\xd5\xa8\x01\xbd\xfc\x85"
+ "\x85\x5f\xf8\x4e\xa3\x92\x5f\xf8\xbf\xfb\xf5\x55\x31\xbf\x7a\xa6"
+ "\x5f\xea\x25\x7d\xdf\xdf\xf7\x1b\x52\xfb\xbf\x7c\xf9\x3e\xfe\x5e"
+ "\xcd\xf6\x5f\xca\xfb\x0d\xeb\xfa\xbb\x10\x6f\x80\xad\xa6\x0d\x5f"
+ "\x13\x25\xe0\x73\x53\xde\xf3\x80\xe9\xa3\x44\x93\xea\xa0\x2d\xe9"
+ "\xcf\x92\xf0\xb4\x93\x04\xe3\x11\x5a\x92\x52\x68\x4b\xda\x05\xb4"
+ "\x49\x1b\xe6\x00\x7e\x2b\xf2\x9b\x89\x2a\xaf\x99\xa8\xeb\x92\x30"
+ "\x56\x31\xfa\xfa\x02\x39\xd3\x06\x17\xdc\xd7\x24\xdb\xc9\xa7\xd6"
+ "\xb3\xb8\xbf\xa9\xaa\x2e\x0e\xe4\x4e\x13\x21\x88\x5f\x55\x1c\x09"
+ "\x2b\xbe\x89\x56\xd2\xcc\x65\xa0\xcf\x96\x61\x5c\xc2\x86\x77\x84"
+ "\xa8\xc0\x77\x56\x55\x07\x6a\x9f\x47\x1d\x5f\xfb\xb4\x88\xcd\xfd"
+ "\xfc\x4c\xd1\x67\xec\x3c\x03\xf4\x93\x06\x3e\xaf\xde\xf0\x08\xd7"
+ "\xe7\x0d\xa3\xc4\xf9\x26\xf8\xff\x33\x66\x2b\x42\x3b\x2a\x30\x7e"
+ "\x2b\x96\xf9\x57\xa1\x82\xc5\x6f\x7d\x67\x55\x54\x60\xea\x02\x22"
+ "\xaf\x33\x9f\x22\x18\xdb\x09\x63\x81\x42\xbf\xdb\x01\xfd\xac\x7c"
+ "\xcb\x4d\xb4\x10\xea\x97\x5b\x72\x13\x35\x42\x9d\xca\x3a\x32\x6b"
+ "\x61\xbc\xfc\x71\xa5\xb8\xee\x52\x05\xfd\x62\x47\x1e\xe4\x89\x5e"
+ "\x4e\x6e\xcd\x83\x7c\xf9\x90\x0f\xed\x64\x5e\xbf\x83\x79\x40\x83"
+ "\x9d\xf0\xcd\x7a\xed\x73\x78\x6f\x62\x7b\x6f\xf0\xdb\xd0\x0e\x6d"
+ "\x33\x31\x69\x40\xb7\x29\xf0\x1b\xd2\x77\x3b\x32\xeb\x40\xfe\x55"
+ "\x27\xb1\xb5\x33\x48\xe7\xe5\xd4\xcd\xe6\xfd\x75\xd7\xe2\x02\x57"
+ "\x7c\xdd\xc5\x79\xab\x40\xa7\x77\x32\x1f\x98\x9b\x70\xbe\x05\x6d"
+ "\x0c\x66\x57\x38\x49\x28\x9f\x1f\x00\xdb\x42\x0f\x72\x00\xec\x09"
+ "\xb6\x17\x1a\x6c\x09\xa8\xcb\x26\x8c\xf3\x88\xcf\x61\xdc\xb6\x13"
+ "\xf4\x72\x39\xda\x01\xcf\x9d\x7f\x9c\xe0\x1c\x3b\xc6\x68\x7d\x75"
+ "\x1e\xb5\xf3\x98\x39\x75\x3b\x25\x5b\x00\x65\x10\xea\x7f\xb0\x85"
+ "\x15\x5d\xc0\x43\xc0\x40\x35\xd8\x16\xa3\x4e\x31\xcd\xc1\x68\x5f"
+ "\xcd\x74\x7e\x32\xf3\xd9\x1c\xc0\x65\x74\x9d\x13\xda\xa7\x82\x6f"
+ "\x00\xcd\x9a\xd8\x5c\x38\x97\x31\x26\x95\xa4\xc7\x71\xcc\x6b\x86"
+ "\x32\x28\xc8\x32\xf1\x19\xb4\x7f\xbf\x14\xeb\x0e\xec\x8a\xba\x4a"
+ "\x91\x66\x35\x7c\x0d\xd9\xc4\xc6\xfe\x36\xb0\x15\x44\xda\x54\xa3"
+ "\x5d\x21\xbe\xdb\xbd\xff\x11\xc7\xe5\x02\xd8\x15\x48\x2f\xa4\x13"
+ "\x94\x53\x2d\xca\xb1\x06\x6e\xbf\x1c\x5c\x2e\xae\x5b\x16\x02\xaf"
+ "\xd7\xb9\xe8\x6f\x2a\x73\xa7\x3f\xbc\x2f\x8e\x1b\x0f\xde\xe6\xc6"
+ "\x3b\x18\x1b\xd5\xdb\x71\x9e\x14\xea\x58\xc9\xe7\x78\x4c\xdf\xa0"
+ "\xaf\x34\xf4\xcd\x0c\x34\xae\xcc\x45\x3f\xc0\x20\x9b\xd7\x7e\x4d"
+ "\x70\xed\x1b\xec\xa7\xfa\x6f\xb8\x7d\x5a\x9f\x81\x18\x86\x7b\x36"
+ "\x0f\xdf\x02\xf5\xc2\xf2\xe0\x3e\x06\x7e\xc1\x8e\xad\xff\xa5\x7b"
+ "\x3c\x65\x57\x2c\xe5\xfa\x28\xd7\x79\x04\xd3\x62\x3e\x7e\x36\x2d"
+ "\xc6\x39\x30\x96\xbf\x4b\x8f\x75\x6b\xc2\x7e\x29\xb5\x15\xe3\x2a"
+ "\x43\x3a\xda\xfe\x4d\xc8\x37\x29\x1d\x7d\x08\x03\x9f\x54\xf0\xad"
+ "\x23\x62\x9d\x76\xc2\xbd\x12\xee\x27\xb0\xf9\xfd\x2e\x76\xde\xbc"
+ "\x29\x2f\xcd\xf5\x0e\xf6\x1b\xc0\x70\x28\xe4\x39\x08\xbf\x54\xca"
+ "\xcb\x63\x2f\xd7\xc7\xfe\xbe\x13\xe7\xc0\xea\x0d\x52\xec\x65\x8c"
+ "\xbb\x8c\x32\x23\xef\x39\x0f\xda\x23\x6d\x76\x00\xaf\x18\xee\x3e"
+ "\x72\x54\x00\xbd\x0f\x82\xfd\xff\x8f\x58\xde\xae\xfa\x58\xb1\x7e"
+ "\x55\xdc\x7f\xca\x81\x42\xe6\xef\x97\x8d\x87\x0e\x46\x75\x8f\x87"
+ "\xba\x6d\xcb\xfa\x58\xc4\x24\x94\x55\x83\xfc\x47\x3b\x11\xf2\xe9"
+ "\xbb\xb1\xc5\xce\xfb\xd6\x5b\xd0\xbe\x14\xeb\x8f\x78\x39\x20\xd2"
+ "\xae\xd0\xbd\xdf\xb9\xf7\x73\x28\x03\xc6\xff\x1f\x77\x63\x40\xea"
+ "\xd7\x1c\x07\x87\xc4\xd8\x4f\x27\x2a\xd0\x87\x2f\x94\x5b\x85\x36"
+ "\x38\xd7\xab\x87\x76\x7e\xd4\xe4\xc0\x39\xf4\x06\xb8\x87\xfe\x7d"
+ "\xa8\xf0\xdc\x88\x3d\x15\xeb\x98\xdc\x38\x04\xf4\xb9\x97\xc5\x2a"
+ "\x41\xba\x48\xfd\xb5\xe0\x39\x1c\xfb\x45\xf0\x3e\x9b\x02\x68\xb0"
+ "\xb7\x11\x71\xaf\x3f\xf4\xd9\xe3\xb8\x76\x7a\x0a\x30\xa4\xc4\xfe"
+ "\x0b\xfc\xdd\x81\xfe\xa6\x81\x8e\xf5\xeb\xfe\xc0\xfa\xad\x0a\xfb"
+ "\x6d\x17\xfa\x90\x80\xef\xec\x8b\x8b\x22\x1f\xa5\x54\xb1\x7e\x8c"
+ "\xfe\x43\xde\x04\xda\x61\x9c\x63\xf8\x76\xaa\xb4\x47\x19\x31\x82"
+ "\xfe\x42\x44\x9c\xec\xc3\xbe\x2c\xd2\x4e\x01\xf9\xb6\x4a\x7d\xcf"
+ "\x8d\xff\x2c\x4f\x8f\xfe\x16\xca\xfb\xdb\xa1\x06\x89\xd6\x0e\xd6"
+ "\x8f\xeb\x0d\x0e\xe8\xc7\xee\x34\x45\x7a\x22\x5d\x3b\x32\x3f\x83"
+ "\xf6\x57\x6b\x24\x9a\xba\xe8\xf9\xd9\x2b\x22\xcf\xeb\xf9\x1c\xd3"
+ "\x67\x53\xc4\xf9\xa7\x6e\x1a\x8a\xf8\x43\x3d\x50\xb1\x16\xdb\x0e"
+ "\xba\x01\xbf\x8f\x18\x79\x53\x94\x59\xfb\xac\x88\x91\xcf\xa0\xff"
+ "\xff\x5a\xe7\x92\x1d\xf5\x49\x6c\xcc\x02\x7c\xe2\xfc\xf9\x6c\x0b"
+ "\xf3\xb7\xd1\x87\xec\x30\x93\x83\xf3\x5c\xf2\xe9\xb3\x1d\x12\x1d"
+ "\x24\x4c\x4a\xfd\x1e\xca\xb8\xe8\x29\x7f\x3e\x3b\x0a\x65\x8c\x46"
+ "\xf9\xe6\xb2\xa1\x3e\x6b\xf3\x94\x6f\x9f\x35\xa0\x7c\x43\x5c\x1b"
+ "\x92\x71\x8e\x8d\xeb\x2b\x33\xa9\x4d\xf5\x94\x49\xb5\xaf\xf0\xbd"
+ "\x01\xdc\xe6\x42\x6c\x19\x9e\xe3\xf9\x51\x87\x41\x7e\x36\x16\x17"
+ "\x75\xde\x3e\xd4\x71\x90\xa6\x17\xe9\xd5\x04\xf9\xf7\xe1\xb9\x49"
+ "\xf4\x95\x30\xb2\x89\x8f\xf5\x40\x4e\x57\xa2\xff\x6e\xc8\xa7\xab"
+ "\x83\xaf\x75\x65\x71\xd9\x2d\xc9\x0a\xfa\x42\xec\xc8\x15\x16\x12"
+ "\x64\xf8\x39\xfd\xb6\x95\x1c\xc6\xf3\xac\x76\xf4\x21\x09\x65\x6b"
+ "\x5b\xc9\x17\x07\xe1\xbb\x61\xe2\xaf\x06\x7e\xdf\x83\xdf\x31\xf0"
+ "\xfb\x47\xf8\xbd\x05\x7e\xb3\x21\xbf\x20\xe6\x8f\x80\xfb\x57\x20"
+ "\xfd\x27\xe2\x2f\xd4\xf1\x30\xda\x9b\xb3\x44\xdb\x11\xd3\xa7\xe3"
+ "\x3d\xfc\x3e\x20\xf2\xbc\x86\xf3\xfc\xf0\x3d\x50\x4e\x0a\xd4\xbf"
+ "\xd1\xd4\xc4\xca\x32\xb4\x92\xcf\xcf\x63\xd9\x78\x8e\x19\xfe\xdf"
+ "\xee\x66\x83\x42\x39\x87\x0f\xc3\xef\x14\xf8\xdd\x0c\xbf\x49\xf0"
+ "\xbb\x44\xa4\x41\x3d\xca\x86\xf8\x14\x46\x73\xa3\x96\xdb\xbb\xb3"
+ "\xa4\x3e\x8f\x7a\xd8\x25\x3b\xea\xaa\xe3\xe7\x71\x7e\x9b\xc9\x21"
+ "\x86\x03\xc8\xfb\x08\xe6\x85\xdf\xc7\xc4\xdf\x28\xf1\x77\xba\xf8"
+ "\xfb\xef\xe2\xef\x34\xf1\x77\x86\x99\x1c\x36\x88\x36\x06\xd0\xe5"
+ "\xb0\x01\xdb\x0d\xb2\x7b\x02\xff\xc6\xe7\x85\x38\x46\x06\x39\xfe"
+ "\x00\x94\x1f\xd0\x91\xf9\xb9\x42\x9a\x1f\xc5\x39\x9f\xae\xcc\x03"
+ "\x7f\x79\x93\xad\x6b\x7f\x1e\xee\x92\x6d\xef\x37\xa9\x64\x51\x04"
+ "\x6c\xa0\x1b\x8b\xe5\x54\xdc\x2b\xf4\x79\x92\x5c\x5c\x17\x16\x63"
+ "\x03\x04\xa0\xbf\x3c\x36\x1e\x0a\xa2\x3a\xec\xab\x6c\xee\x18\x7d"
+ "\xbb\x05\xbd\x6f\x86\xab\xcd\x1a\xf4\xbe\x55\x92\xdf\x38\xee\xe1"
+ "\x63\xf5\xe1\x9f\xc1\xb7\x8c\xae\xb1\xfa\xe7\x91\x7c\x0d\xed\xe6"
+ "\x57\x20\xbd\xd4\x95\x7e\x18\xcf\x03\x3c\x00\xf4\x6c\x84\xf6\x4c"
+ "\x69\x26\x9f\xa3\x0f\xff\xfb\x5b\x78\x9b\x23\xa4\x36\x8b\xfc\x30"
+ "\x48\xf4\x6d\x21\x87\x53\x40\x16\x26\x22\x86\x9b\xbb\xe5\xec\x61"
+ "\x36\xaf\x2b\x62\x04\x78\x79\xf8\x3e\xe4\xa9\x5b\x1f\x74\x97\x41"
+ "\x61\x1d\x99\x5f\xe8\x3c\x65\x8a\x49\x87\x32\x05\xb1\x01\xf2\x1b"
+ "\x79\xad\xec\xd1\xff\x1a\xb0\xff\xf1\x7e\xf7\x45\xbc\xe7\xbb\x9f"
+ "\x35\x38\x78\xbf\x6b\x04\x9c\x01\x3e\x1b\xd8\x3e\x2e\x33\xf9\x62"
+ "\x9a\xd8\xa7\x1b\xa1\x4f\x3f\x00\xe9\xf5\xbc\xae\x3c\x5d\xfc\x16"
+ "\xe0\xac\x01\xdb\x7d\x8b\x94\x2e\xb6\x17\xcb\x41\x9f\xff\x63\xa4"
+ "\x74\xb1\x7c\xc0\x63\x43\x05\xf6\x13\x29\x5d\x6c\x13\xd8\x51\x5f"
+ "\x38\x24\x79\x92\xcb\xf1\xb6\x4e\x7a\x0f\xf9\x86\xfe\xb1\xf8\x1c"
+ "\xff\x17\x78\xb6\xa2\x14\xf5\xc3\xda\xe7\x88\x6a\x45\x11\x09\xe6"
+ "\xfd\xf2\x0b\x8b\xa7\x8c\xfc\xf2\x00\xcd\x0c\x75\x50\xe5\xfb\x8d"
+ "\xb5\x8e\x29\x92\xbd\x5a\xdc\x91\xd9\x18\x2f\xc5\xf9\x76\xc5\x19"
+ "\x68\xdc\x5c\x5b\xda\x4d\x5f\xa8\x4b\xa3\x51\xaa\x8b\x9b\x7e\x66"
+ "\x3c\xc0\xba\x61\x59\x6b\xc1\x5e\xb7\x81\x5c\xe0\x72\xbb\xb1\xc2"
+ "\x4c\x46\x4a\xf6\x2e\xd3\x5b\xa1\x32\x62\xc8\x4f\x66\xeb\xa3\xa1"
+ "\xa8\x1b\x71\x8f\x8f\x80\xf3\x58\x29\x4e\x52\x67\x80\xb1\x7c\xca"
+ "\x71\x32\x7f\xe5\x08\xf4\xbd\x12\x0b\x75\x7d\x1b\xea\xb6\xd5\x89"
+ "\x73\xff\x4b\x71\x9c\xfa\xe5\x02\x67\x32\xb5\x8b\x34\x83\x7e\xf4"
+ "\xe5\x74\x91\xb6\x28\xbf\xb6\xa2\x4c\x5f\x9b\xc6\x63\x06\xe1\x5c"
+ "\x0e\xf6\x8f\xdf\xa3\x1e\xd3\x50\xfb\xbe\x62\xec\x2b\x47\x66\x48"
+ "\x36\x29\xd4\xb7\x94\xdb\x84\x87\xb6\x31\xdf\x44\xc6\xf7\x1b\xf9"
+ "\x5c\xe0\x91\xc3\xbc\xed\x47\x2a\xf9\x3a\x37\xf3\x91\x89\xf7\x65"
+ "\x01\x9a\x9b\xbe\xe0\xfb\xb2\x0e\xfc\x93\xef\x29\x39\x52\xd4\xbd"
+ "\xa7\xc4\x65\x2b\x56\x71\xbf\x51\x47\x76\xba\xfa\xc4\x91\x75\xf8"
+ "\x1e\xbc\x7f\x0a\xd2\x6b\x5c\xe9\x87\xb6\x72\x7b\xe0\xfd\xa6\x90"
+ "\x35\x51\xb8\xb7\xec\x46\xf4\xb5\xcd\xbf\xf7\xe5\x24\xf6\x7d\x36"
+ "\xe7\x01\x7d\x53\xec\xbf\x48\x67\xd4\xd9\xac\x0f\x43\xff\xc5\x7e"
+ "\xdc\x95\xfd\xbe\x19\x2e\xde\x6f\xb9\x6e\xae\x62\xfd\x96\xf5\xd9"
+ "\x2f\xa7\xba\xd5\xc3\xc6\xe6\xbd\x90\x9f\xaf\x69\x54\xf0\x2c\x16"
+ "\xf4\x6a\xbd\xf8\x8c\xc7\x94\x38\xc5\x7c\xe4\x59\x71\x6d\x1b\xd7"
+ "\x3a\xf1\x8c\x56\x28\xa0\x1b\x7d\x82\x48\x6b\xd5\x4f\xb4\xa5\x53"
+ "\x27\xae\x3b\x5d\xa0\xb6\xc2\x6e\x5f\xff\x5f\x6e\x75\xf9\xf7\x39"
+ "\xa2\x10\xdb\xd5\x08\xdf\x2a\xe6\x7b\xc1\x1a\xcf\x73\x9b\xaa\xd1"
+ "\x86\x38\x35\x01\xf6\xe0\xb7\x88\xc7\x65\xfe\xd2\x2c\x61\x0f\xfa"
+ "\x65\x7c\x2b\xf9\xea\x95\x4d\x37\xd1\x22\xe0\x69\x11\xf4\xa5\xc5"
+ "\x70\xff\x2c\xfc\xc6\xf3\x5f\x99\x1a\x7f\xc5\x3e\x52\xd4\x91\xf9"
+ "\x55\xb8\x14\x8f\x1e\x69\x63\x0b\x3a\x11\x81\x38\xcb\x07\x3a\x20"
+ "\xd6\xd8\x3a\x32\xd4\x1b\xf1\x85\x38\x43\x8c\x85\xae\x79\x9c\xe1"
+ "\x8c\xf9\x1f\x80\x74\xac\x2f\xe2\x0c\xca\xd2\x4b\x7e\x7e\xcd\xe4"
+ "\x2b\x15\x5f\xcf\xf9\x2a\x55\xda\x73\x8b\x6b\x49\x49\xb7\x91\x1b"
+ "\xa1\x5c\xed\x3e\x2d\xf3\xa5\x79\xcc\xe4\x98\x4e\x30\x2f\xae\xc3"
+ "\x71\x39\x79\xf3\x3e\x78\xa7\xdc\x45\x73\x13\x8b\xcd\xfc\xd1\x3c"
+ "\x36\x17\x79\x03\x3c\xab\x71\x1f\x67\x98\xc9\x27\x45\x38\xd6\xc0"
+ "\xbd\x7d\x77\x84\x11\x5c\x07\x06\x39\xf6\x95\x55\xb2\x6b\xef\x0d"
+ "\xc3\xf5\xfc\x4f\xa6\x41\xfd\x70\x0c\x5d\x0f\xff\x47\xc0\x58\xb2"
+ "\xda\xcb\x9c\xf1\x14\x9c\xeb\x11\xe3\xf3\x34\xe1\x3c\x16\xc6\x33"
+ "\x68\x25\xc7\x5e\xa9\x45\x5f\x20\xcb\x7a\xfb\x79\x4e\x4b\xa1\xe7"
+ "\xd1\xd7\xb3\x36\x91\xdc\xd0\x4c\x8e\xcd\xc6\x79\xa3\xf4\xb3\x38"
+ "\x47\xd3\x94\xe2\x39\x47\xd3\x54\x2d\x5e\x30\xd2\x3e\x1a\xe5\x76"
+ "\xd5\x8b\xbf\x33\x07\xb8\x2c\x62\x5e\x68\xe9\xd7\xa2\x4e\xd1\x40"
+ "\x3f\x69\xea\x9e\xff\x45\x5c\x62\xdf\xc6\x7d\x1c\x38\xe7\x24\x73"
+ "\x10\xf4\x3d\x02\x7c\x82\x7a\xaf\xbd\xfb\xa9\xaa\x55\x88\xa3\xa3"
+ "\xec\x1c\x14\xfa\x20\x1e\xdc\x5e\xa2\xa3\x8c\x9f\xdc\x1f\x68\x53"
+ "\x3d\x7c\x3b\xac\xe0\x0c\x51\x18\x12\xc9\x38\x9c\xff\x0e\x75\xd2"
+ "\x2a\x1c\xe3\x8a\x3e\x05\xeb\x4f\x91\xa3\x07\x93\x56\x13\x39\x3c"
+ "\xbf\x15\xfe\xaf\x92\xec\x24\x78\x47\x1d\x60\x27\x61\x68\x1f\x3d"
+ "\xb6\x9a\xdc\xda\x91\x79\xb4\x58\xe2\x15\xda\x10\x38\x0f\x27\xce"
+ "\x25\x40\x5d\x9b\xd8\x1e\x67\xf4\x53\x6f\x66\x74\x63\x72\x18\xcb"
+ "\x80\x31\xec\x51\x63\x80\x8d\xa8\xb9\xee\x39\x0a\xf8\x3f\x20\xda"
+ "\x8c\x47\xb7\x02\xf6\x1b\xdc\xea\xf9\x0b\xb7\xff\xb3\xf0\xfd\x50"
+ "\x1b\xda\x67\xde\xe8\xf3\xf5\x3d\x12\x7d\x70\xbf\x6a\x28\x8c\x13"
+ "\x18\xbf\x1d\xb4\x0d\xea\x56\x63\x58\x45\x94\xa7\xc8\xb1\x71\x6f"
+ "\xfd\x81\x9d\xb3\xab\xe6\xf3\xf3\xc7\x46\x49\xe3\x70\x5e\xef\xaf"
+ "\x8f\x86\xae\x09\x20\x38\xaf\x8e\xfe\xce\xd8\x5e\xbf\xef\x35\x6c"
+ "\x2e\xdd\xe4\x98\x4a\xaa\xd2\x1e\xc4\x3c\x92\x5d\xd5\x74\x2e\x5d"
+ "\x43\x3e\xd2\x4c\x85\x7e\xfc\x75\x19\xf4\x15\xdb\xe0\xf7\x54\x7e"
+ "\x5d\x26\xd2\xb7\x86\xef\x45\xf8\x7a\x25\xea\x12\x1c\xfb\x83\x1e"
+ "\xd9\x87\x3a\xba\x23\xf3\x98\x42\xea\x37\xa0\x37\xf6\xc1\x3b\xa2"
+ "\x3f\x6c\x5c\xff\xfd\x3a\x09\x7d\x40\xb0\x71\x03\xcf\xaf\xe2\x73"
+ "\xfe\xc7\x22\xbb\x6d\x69\xc8\x87\xef\xf1\x3d\x6a\x5f\xcf\x9c\xef"
+ "\x94\x01\x4d\xbf\x9e\x89\x6d\x13\xb1\x08\xfa\xea\x98\xde\xd5\x6f"
+ "\x8f\x32\xd9\xfc\x51\x9b\x7b\xbf\x3c\x66\x74\x8d\x37\x9b\xa6\xde"
+ "\xb3\x89\x68\xfb\xea\x87\x86\x10\xd4\x55\xc7\x2e\x16\x14\xd0\xd2"
+ "\x42\xb9\xf0\xe8\xda\x7c\xa2\x92\xe5\x02\xd9\xb0\x9f\x25\xc7\xdd"
+ "\xd8\x4a\xcc\x41\xa1\xaa\x9b\x67\x3d\x96\x34\x9c\xa6\x69\x88\x3c"
+ "\xaf\x7d\xb8\xf2\x36\xfb\xcd\xa5\x34\xe0\xee\xa7\x9e\x48\xb2\x13"
+ "\xed\x4b\x85\xe4\xc4\x62\x12\xf0\x98\x13\xbe\xad\x22\x06\x33\x69"
+ "\x0e\xc3\x33\xa3\x1f\xa9\xd0\xfe\x68\x0e\xc3\x32\x53\x8b\x89\x32"
+ "\xb5\x85\x5a\x72\x17\x06\x2a\x41\x1f\xa8\xdf\x04\x8c\x8d\x54\xdd"
+ "\x5c\xda\x05\x65\xec\x8d\x63\xef\x95\x7b\xaf\x9b\xf9\xf5\xbe\xeb"
+ "\x66\xb8\x09\xea\xb6\x6d\x70\x75\xfb\x76\xa7\xab\x6e\xdf\xee\xbc"
+ "\xf4\xba\x7d\x73\x9f\x5b\xdd\xd4\xae\xba\xe9\xa1\x6e\xdf\x3c\x32"
+ "\xb8\xba\x1d\x9f\xed\xaa\xdb\xf1\xd9\x3e\xd6\x6d\x47\x3f\x75\xab"
+ "\xed\xbb\x6e\x29\x37\x43\xdd\x8e\x0e\xae\x6e\xad\x36\x57\xdd\x5a"
+ "\x6d\x97\x52\x37\x1c\xcb\xa7\x85\xd3\xe3\xcc\x9f\x7c\x22\xf7\xd7"
+ "\xda\x4a\xbe\x7d\x28\xad\x98\xdd\x8f\x6e\x25\xcd\x17\xc5\xfe\x6d"
+ "\x4d\xb7\xd1\x6f\xb9\x9d\xd3\x9c\x30\xd9\x80\xfb\x5d\x9b\xe7\x01"
+ "\x96\xc3\x38\xa6\xbf\x65\xfb\x1b\xd2\xad\x54\xdc\x6f\xda\xfc\xdb"
+ "\x12\xb6\x1f\xa5\x2a\x4e\xbc\xaf\x3e\x37\xa2\x32\x0c\xf7\x82\x08"
+ "\xd0\x9f\xe9\x88\x4a\x2d\xc6\xef\x7c\x27\xd1\x2a\xa7\x99\xe8\x3b"
+ "\x0c\xfd\xfd\x29\x08\xcd\xa9\x8c\x78\x27\xd1\xce\x62\x87\xaf\x65"
+ "\xe7\x7d\x9b\xab\xa4\x33\x6e\xd2\x37\xac\x41\x55\x71\x90\xde\x28"
+ "\xc5\x81\xa5\x72\xb4\x67\x2a\x35\x58\x3e\xa4\x5b\xa5\xd8\xac\x80"
+ "\xf7\x75\xa2\x6c\xb0\x85\xda\xfb\x93\x7b\xdf\xde\x29\xc9\xbd\xc7"
+ "\x92\x48\x28\xc6\xa5\x2c\x48\x1b\x8e\x6b\x8e\x50\x56\xf3\x4e\xa4"
+ "\x7b\xb4\x6d\x38\x0d\x4d\x25\x01\x78\xb6\x0f\xf7\xe8\x99\x34\x56"
+ "\x32\x21\x95\x04\x46\xa7\x40\x99\x76\x12\x17\x9a\x02\xe5\x01\xad"
+ "\xf9\xd8\xe0\x5b\x36\xc7\xb7\x09\xca\xc3\xf5\xef\x80\x24\xa2\x7a"
+ "\x4c\x93\x4e\xd7\x6e\x26\x0a\x3c\x07\x88\xe7\xf9\xf8\x59\xbe\x61"
+ "\xca\x8e\xcc\x6f\x4b\xa5\xf6\xf9\xc0\x9f\x10\xce\x9f\x96\xa3\x2e"
+ "\xfe\xb4\x6c\xee\xcd\x9f\x96\x40\xce\x9f\x6f\x1d\x2e\xfe\x1c\x8f"
+ "\xf2\xe4\x4f\xcb\x9d\x9e\xfc\x69\xd1\xfb\xc7\x9f\x96\x38\x17\x7f"
+ "\xf8\x37\x38\x7f\x5a\x52\xfa\xe6\x4f\x4b\xa1\x8b\x3f\x2d\x13\x7c"
+ "\xe3\x4f\xcb\x7e\xef\xfc\x69\x99\xdd\x0f\x7f\x86\xf5\xcd\x9f\xe3"
+ "\x37\xfa\xce\x9f\xe3\x51\x83\xe0\x4f\x30\xe7\x4f\xeb\x6a\x17\x7f"
+ "\x5a\x7f\xd6\x9b\x3f\xc7\xb7\x71\xfe\x1c\x2f\x76\xf1\xa7\xd5\xec"
+ "\xc9\x9f\xe3\xfb\x3d\xf9\xd3\xaa\xf4\x8f\x3f\xad\xc4\xc5\x1f\xfe"
+ "\x0d\xce\x9f\x56\x4d\xdf\xfc\x69\x8d\x70\xf1\xe7\xf8\x3e\xdf\xf8"
+ "\xd3\x9a\xe0\x9d\x3f\xc7\x6d\x83\xe7\x4f\xeb\xbb\x3d\xf8\xa3\xf6"
+ "\xce\x9f\x56\xf3\x20\xf8\x13\xca\xf9\x63\x19\xe7\xe2\xcf\x89\x23"
+ "\xbd\xf9\x73\x62\x3a\xe7\xcf\x89\xa9\x2e\xfe\x58\x32\x3c\xf9\x73"
+ "\x22\xc1\x93\x3f\x27\xca\xfc\xe3\xcf\x89\x52\x17\x7f\xf8\x37\x38"
+ "\x7f\x4e\x54\xf4\xcd\x9f\x13\xf5\x2e\xfe\x9c\x88\xf7\x8d\x3f\x96"
+ "\x40\xef\xfc\x39\xb1\xa9\x1f\xfe\x0c\xef\x9b\x3f\x96\x39\xbe\xf3"
+ "\xc7\x92\xd1\x1f\x7f\x06\x67\xeb\x59\x36\xe1\x77\x87\xa0\x9c\x26"
+ "\x6f\xe5\x20\xed\x70\xff\xa1\x90\x69\x69\x2a\x11\x86\x29\xf9\x19"
+ "\x0d\xcb\x26\xed\x2a\xf2\x70\x33\x39\x39\xb1\x44\x08\x54\xd2\xcc"
+ "\x32\x18\x27\xfd\xb9\x88\xae\x19\xa6\x10\xd6\x0c\x57\xe0\xd9\x6c"
+ "\xef\xf1\xdb\x4f\x66\x07\x8c\x21\xe3\xf1\x1c\xdd\x5a\xb0\x97\xf1"
+ "\xff\x8e\xcc\x93\x9b\xc0\x16\x8c\xea\xef\xfc\x16\xee\x75\xfa\x68"
+ "\x1d\x8e\x6f\x4f\x56\x75\xfb\xc5\xc8\xa4\x29\xe8\x5f\xcc\x70\x3b"
+ "\x9e\xb3\x38\x69\xd9\xc4\xfc\x55\xed\xda\x1a\x75\x3b\x3d\x86\x63"
+ "\x8f\x56\x72\xea\x38\xcd\xde\xb5\x15\xf1\x00\xb6\xfa\x0d\xa7\xc8"
+ "\xa9\x88\xee\xfd\x79\x34\xf6\x0d\x71\x8e\x70\x16\xcf\xdb\x36\x07"
+ "\xf2\xce\xc2\x38\xa4\xaf\xa6\x61\x7c\xcd\xb6\x87\xc0\xf6\xfd\x11"
+ "\x7e\x03\x7d\x27\xbd\x05\xbf\xb8\x4f\x86\xef\xcd\x3c\x35\x8b\xd9"
+ "\xcb\x6b\x6f\x79\x83\xef\x85\x6b\xbb\x53\xc2\x1d\x7c\x67\x04\xdc"
+ "\x07\x8b\xf6\x3c\xe6\x1f\x79\x8a\x7c\x77\xde\xed\xb9\x0a\xee\x8f"
+ "\x40\xd9\xa3\xc4\xe7\xc1\x70\xbf\x1b\xed\x6c\xe6\xe7\x23\x3f\x43"
+ "\xdc\x43\xfc\x5d\x29\xa4\xa9\xc5\x3c\xa3\x20\xcf\x6f\xd1\x76\x17"
+ "\xcb\x18\x0d\xf7\x8b\x70\x0c\x2c\x3e\x0f\x83\xfb\x27\x70\xed\x40"
+ "\x7c\x7e\x23\xdc\xdf\x07\xf7\x77\xf1\x33\x2f\x5d\x62\x1f\x3d\xe5"
+ "\xf0\xef\xcc\xf8\x29\x16\x53\x13\x79\xc0\xc7\x02\xdf\xb9\xed\xff"
+ "\x39\xd5\xd2\xe3\x59\x9c\xdb\xb3\x06\xe9\x19\xdf\xa3\xf6\x5d\xaa"
+ "\xdb\xb3\x7d\x3d\x9e\x15\xb9\x3d\xdb\xd9\xa3\xcc\x9d\x6e\xcf\xb6"
+ "\xf6\x78\xaf\xde\xed\x59\x61\x8f\x67\x6d\x6e\xcf\x32\xc4\x67\x01"
+ "\x1d\x99\x6d\x0a\xd7\x1a\xde\x29\x83\x98\x2e\x87\xf4\x70\xb7\xf4"
+ "\x38\x31\x1d\xbe\xdf\x36\xc5\x4c\xde\xb4\x8a\xe9\x8c\xf7\xbc\xfc"
+ "\xb6\x99\x6e\xe5\x47\xf0\x39\x8e\xb6\xb8\xee\xbd\x73\x23\x2a\x0d"
+ "\x42\x57\xec\x1b\xf0\x4c\x83\xb8\x72\xc7\xf6\xd2\x64\xed\xf3\xcb"
+ "\x5f\xd4\x26\x26\x24\xe1\xf6\x95\x25\x8b\x92\xb4\x4b\x96\xc5\x27"
+ "\x78\xf8\x59\x0f\x43\x9f\x83\x18\x53\x0d\x7d\xb7\xb0\xf8\x05\x7f"
+ "\xa0\x96\xee\x98\x1f\x20\x57\xe1\x5b\x35\x66\x32\x9d\x7d\x6b\x13"
+ "\xf7\x47\x5e\x8d\xbe\x5f\xb8\x9f\x17\xf2\x78\x33\x69\x3b\x28\xfa"
+ "\x79\xa9\x82\xbc\x76\xef\x7e\x5e\xce\x34\x30\xff\x86\x90\x8f\xfb"
+ "\x79\x39\xd3\x08\xfd\xfc\x31\x3a\x82\xc7\xf0\xe0\xb1\xcd\x4e\x4b"
+ "\xb6\x89\x75\xfe\x45\xe6\x23\x30\x83\xcf\x65\xf4\xf4\xd7\xba\x6b"
+ "\x1d\xbe\x27\xae\x97\xae\x73\x7b\x3f\x9e\x3f\x97\xf4\x83\xf8\x4d"
+ "\xe3\x2e\x5c\x1f\x18\xd1\x0c\xf7\x6c\xfe\x9e\x3d\x3b\xcd\xe7\xf2"
+ "\xb2\x77\xe5\x62\x9b\xb0\xdd\x9e\x6d\x93\xff\xa6\x99\x9c\x7e\xdb"
+ "\xd5\xb6\xd3\x0d\x6e\xbe\xe0\xc4\x36\x9c\x76\xf0\x3e\xda\xab\xad"
+ "\x6c\x7f\x22\x55\xee\xca\xc5\x6f\xa3\x3c\xe3\x67\x19\xe0\x3e\x7b"
+ "\x97\x51\xaa\x8f\x5b\xfd\x72\x71\x5c\x0f\xf5\x3b\xc2\x69\x02\xf2"
+ "\x03\x78\x2a\xb6\x61\x33\xcd\x6c\x4b\xe5\xb1\x0c\x40\x9f\x60\x4c"
+ "\x16\xa6\xab\xce\xc4\x4b\x73\x99\xa8\xa3\xf8\x1c\xe6\x19\x97\xfd"
+ "\x87\x3e\xba\xb2\x25\xfd\x75\xc6\xcd\xfe\xe3\xdf\x84\xb4\xad\xee"
+ "\x18\x72\xfb\xde\x41\xfc\x1e\xe4\x9b\xc9\xcf\x03\xec\x32\x62\x7f"
+ "\x87\x7b\x35\xee\xc5\xc4\x77\xb1\x8e\xde\xe2\xf0\x79\xf3\xa1\xe8"
+ "\xa2\xe3\xf7\xe1\x12\x1d\x37\xb1\x33\xf2\xdf\x4f\x92\xe6\xeb\xc4"
+ "\x18\x18\x55\x9b\xba\xe3\x52\x7f\x1f\xcb\x62\xbb\xe5\x06\x14\xdd"
+ "\xab\x22\x71\x9c\xb6\xdf\x2f\x40\x19\x8f\x7d\x86\xcb\xfa\xef\xab"
+ "\x44\x9e\x8b\xf1\x54\xbf\xcf\xc6\x74\xd7\xfe\xfb\xef\xcd\x52\x3e"
+ "\x49\x2e\xf3\xf5\xaa\xef\xdf\x63\xf9\x78\xac\xe0\x28\xce\xf3\xbb"
+ "\xd4\xcd\xe4\xfb\x1a\x31\xff\x49\x86\x45\xe6\xbf\xe7\x7b\x0b\xcd"
+ "\xae\x8a\x82\xba\xc2\xf8\xa7\x4d\x8c\x59\xc1\xbf\x0b\xbf\x35\x58"
+ "\x17\xa4\x11\x9e\x25\xa7\x79\x01\x45\xc0\x9f\xc8\xbe\xcf\x92\x3e"
+ "\x23\x9e\xd7\x39\xcb\x6d\x08\x39\xb5\xe3\x1c\x2b\x6f\xeb\xd9\x04"
+ "\xb7\xbd\xcf\x2a\x29\x0f\x97\xdd\xec\x19\xdb\x53\x6e\x48\xc6\xf9"
+ "\x20\xf1\x59\x32\x9e\xaf\xed\xfe\x7f\x98\xdb\xff\x81\xf8\x3f\xdb"
+ "\xd7\xbc\x8a\xe9\x56\x85\xeb\x1c\xff\xd9\x78\xb8\x57\xf5\xb8\x0f"
+ "\xf3\xb8\x5f\xc9\xf7\x3d\x83\x6d\xd6\xc2\xf6\x90\x8b\xe9\x62\xd9"
+ "\x41\xac\x3e\xc9\x34\x12\xb0\x51\x84\x67\xba\xc5\x7e\x58\x84\x67"
+ "\xb6\x43\x1d\xcf\xb2\xf3\xda\xf0\x7c\x8a\xf8\x1b\x21\xfe\x4e\xe2"
+ "\x71\x5a\xcf\x86\xbb\x62\xad\xe3\x1c\xcd\xd9\x49\xde\x62\xbf\xe3"
+ "\x79\x70\xf1\x37\x42\xfc\x9d\x24\xc6\xaa\x9d\x07\xef\x75\x9f\xff"
+ "\xee\x7b\x0f\xf2\xd9\x75\xd2\x59\x6e\xa7\x71\xd7\x54\xc1\xb8\x5b"
+ "\x87\x71\x41\xd1\x4f\x58\x7a\x1b\xfa\x8a\xb1\x11\x13\xe9\x24\xa6"
+ "\xa4\x8e\x0c\x8c\x0d\x5a\xc7\x63\x82\xe2\x19\x58\x19\xce\x9b\xa3"
+ "\xed\x58\x67\x38\xcd\xe2\x82\xae\x68\x93\xe2\x9e\x9c\xb5\x38\xb3"
+ "\x77\x4d\x15\xfb\xcb\x66\xbe\x47\xbf\x9d\xcd\x17\xb3\xb8\xd6\x6d"
+ "\x6c\xdd\x4b\xd9\x4a\xda\x53\xa4\x3c\x9c\x76\xed\x6c\xee\xeb\xad"
+ "\x4c\x29\xf6\x63\xbb\x56\x8a\x35\x6d\x26\xed\xa9\xe7\x83\x3e\x2c"
+ "\x83\xb4\x29\x9e\x7b\xa6\xdb\x9f\xc0\x32\xb1\xee\x66\x72\xd6\x8a"
+ "\x65\x43\x9e\xd8\xee\x3e\x0b\xe9\x2b\x1c\x64\x2c\xd4\xab\x55\x2a"
+ "\x1f\x9e\x43\xff\xb7\x32\x5a\x62\x99\xe7\xb3\x2d\x8d\x90\x96\x6b"
+ "\x96\x67\xef\xe0\x7b\xae\xdb\x41\xff\xfd\xdf\x69\xfd\xd9\x40\xd0"
+ "\x17\x0c\xd0\x97\x52\x04\x63\x95\x9e\xf9\xf2\x0e\xaa\x32\xf0\x39"
+ "\xc6\xf6\xe3\xb8\x3b\xbc\xe0\x02\x51\xe0\x1e\x08\x8e\xd9\x73\xdc"
+ "\x07\x32\xa4\x81\xac\x2e\x83\x3e\xc2\xea\x31\x38\xbd\xdf\x6e\x63"
+ "\x65\x8c\xe5\xbe\xcd\xf0\xec\x52\x47\xe6\xb9\xa8\xee\xf8\x09\xdd"
+ "\xfd\xf8\xdc\x22\x5c\x7b\x80\xfe\xc1\xea\xd8\xb3\x0e\x58\x5f\x28"
+ "\xab\xc5\xab\x8d\xa9\xac\xd2\xb3\xf5\x99\x9c\xca\x28\xbe\x47\xf5"
+ "\xdc\xdf\x02\x34\xb7\x58\xe0\x5b\x3b\xba\xe3\x46\x40\x9e\x7c\xdc"
+ "\x7b\x0f\xe5\x77\xb7\x33\x91\x7d\xa3\x81\xf7\xf5\x73\x16\x21\xbb"
+ "\x4a\x5f\xd0\x49\x14\x62\xba\xa5\xce\x61\xc7\xd8\x03\x7d\xfa\xd9"
+ "\x62\xb1\xf3\x70\x4f\x78\x4e\x95\x1e\xcf\x0d\xdd\x6b\x97\xea\x6c"
+ "\xb3\xe0\x79\x15\xac\x33\xa7\xad\xed\xa8\x44\xc7\xbc\x76\x28\x3b"
+ "\xed\x4b\xd2\x42\x6c\x09\xb8\x6f\x8e\xd1\x64\x95\xb4\x97\xd3\xc6"
+ "\xc6\x7c\xec\xfb\x3c\x0f\x1b\xfb\xb3\x38\x46\x50\x7e\x09\x8b\xc5"
+ "\x06\x6d\x00\x5e\x54\xa5\xe1\x99\x7f\x1b\x8b\x0b\xb0\x96\xf9\xea"
+ "\x80\x76\xb3\x7d\xb2\xe7\xc5\x75\x12\xdb\x56\x49\x57\x98\xc5\xb4"
+ "\x02\xfc\x76\x72\x27\x39\x43\x6c\xbf\xc5\x18\xeb\x40\x8f\x14\xf4"
+ "\x4f\x57\x67\x83\x7e\x92\xd2\x89\x58\x48\xc1\xd8\x9d\x66\x62\x5b"
+ "\xc7\xf5\x1b\xd2\xdc\xa6\xc7\xef\x23\x6d\x61\x6c\x66\x05\x9a\x5e"
+ "\xe8\xc8\x3c\xdf\x1d\xff\x31\xff\x26\x1c\xef\xd8\xfa\xf5\xaf\xeb"
+ "\x84\x3a\xd7\x15\x81\xee\x1c\xfb\x25\xd6\xef\x80\x30\xa2\x4a\x8f"
+ "\x7b\xb2\xe1\xff\x25\xa2\x6c\x67\xbc\xe3\x38\x38\xff\xc7\x00\x4d"
+ "\xf8\x6d\x75\x1c\x0b\xcc\x87\x1a\xa4\xcd\x10\xe9\xc7\xe2\x49\x14"
+ "\x26\x73\x3a\x88\xf9\x1d\x7c\xbe\x38\xfc\x2e\xa8\x97\x5b\xfc\xbb"
+ "\xf3\x4c\x77\xa3\xef\xfb\x12\x36\x26\x3c\xbf\xd3\xad\xce\x36\x76"
+ "\xfe\xb5\x1d\xe7\xfa\xce\xcf\xc3\x6f\xe5\xa1\xff\x30\xc4\xc5\x29"
+ "\x77\xfc\x9f\x7f\x08\xeb\x89\x7b\x7e\x9d\x41\x95\x51\xa0\x6f\xa7"
+ "\x21\x9d\xe1\x9d\x24\xe8\x0b\xfa\x7e\x74\x21\x8b\xbb\xd7\x91\x79"
+ "\x41\x27\xe9\x42\x18\x5f\x80\x5e\xe8\xb8\x8d\x8d\x3b\xc1\x9e\x36"
+ "\x09\x68\xcf\x74\x68\x11\x37\xd0\xd7\x33\x44\x19\x9b\x01\xef\xcc"
+ "\x93\xd6\xbc\x9c\x78\x6e\xe2\x0c\x5b\xef\xb5\x49\xf1\xe4\xb8\xbf"
+ "\xbe\x0b\x19\xae\x73\x16\x17\x72\x7b\x9d\xb3\xc0\xb3\x3f\x7f\x60"
+ "\x71\xc7\x76\xa0\x4e\xa9\x6d\x6b\x41\x1d\xc1\xde\xc7\xb3\x17\x69"
+ "\x30\x26\xe7\xe7\x87\x5a\x70\x7e\x9e\xc5\x3c\xc1\xba\xf0\xd8\x13"
+ "\xcd\xec\x7f\xc0\xad\x02\x7f\x39\x96\x2e\x58\xbb\x63\xa6\x03\xbf"
+ "\x71\xad\xed\x23\xc5\x2f\x48\xd5\xed\xa8\xaf\x3b\x6e\xc3\xf8\xdf"
+ "\x1d\x99\x1d\x61\x52\xec\x6f\x16\xeb\x9b\xb7\x27\xc9\xab\x5f\xc6"
+ "\xc9\x24\x02\xfd\x05\xe0\xf9\x3a\x46\x03\x55\x40\x24\xfa\x7a\x46"
+ "\xbf\x95\x55\xab\x30\x26\x4b\xc7\xc1\xdf\xdf\xc4\xce\x28\xdb\xaa"
+ "\x26\xb7\xe3\x3e\xac\xb6\xd6\x54\xe6\x8f\x49\x19\x9d\xe2\xa0\xf8"
+ "\x1e\xb3\x27\x82\x03\x22\xf1\x19\x8b\x75\x80\x65\xfa\xed\xb7\xb8"
+ "\xa3\x58\xb4\x4d\xdb\x60\xec\x73\x33\xf0\x8a\xd9\xee\xf0\xff\x4d"
+ "\xa7\x88\xfd\x22\x8f\x41\xcb\x7d\xef\x8b\xfb\xb1\x87\x71\x1f\x1b"
+ "\x40\x33\xe6\xf3\xc0\xbe\x44\x7b\x37\xc6\x6b\xb6\xbf\xc2\xfc\x60"
+ "\x1b\x77\x15\x8a\x34\x28\x2c\xe0\xf5\x0a\x9d\x9f\x22\x67\x75\xc4"
+ "\xfa\x0d\xae\x6e\xf6\x48\x71\x1c\x31\xac\x23\xd3\x9e\x2a\xf9\xe6"
+ "\xe0\xf6\x14\xf7\x8f\xcd\x79\x61\x3f\x29\xda\xcf\x9b\xc4\x6f\x6f"
+ "\x1a\x82\x6f\xef\x14\xcb\xd4\x73\x1f\xe1\x1d\x71\x50\xae\xbe\x23"
+ "\xf3\xa2\x42\x1a\xcf\x88\x67\x88\x26\xf1\x71\xd6\xc5\x70\xd7\x78"
+ "\x86\xd3\xd0\xe3\xdc\xdd\xb2\x65\x49\xda\xf8\x45\xaf\x1a\x16\x24"
+ "\xbd\xa0\xd7\x26\x24\x26\x2e\x4b\xd4\xa2\x93\x26\xf7\xfe\xc3\xe3"
+ "\x18\x5d\x8c\x10\xe3\x13\x96\xb9\xe2\x13\x5e\x4c\x71\x8f\xe9\x69"
+ "\x26\x17\x53\x87\x66\xee\xe2\x62\x91\xb7\x72\x0a\xe5\x42\x39\x5c"
+ "\x15\x70\x55\xc1\x55\x8d\x73\x19\xf3\xed\x24\x0a\x74\x3d\xdb\x67"
+ "\xe2\xf2\x39\x71\x71\x16\xee\x31\x6a\x26\x17\xcf\x97\x08\x0a\x1c"
+ "\x07\x61\xdc\x70\xe6\x2b\xf4\x2d\x78\x1f\xae\x2a\xb8\xaa\xe1\x62"
+ "\xef\x09\x1f\xb2\xf3\xf2\xe5\xee\xcf\xf8\xfe\x91\x35\x3b\x30\x0f"
+ "\x5d\x83\x4b\xf6\x90\xef\x77\x3c\x5f\x8f\x3a\xc8\x69\x66\xbb\x94"
+ "\x8f\xad\xed\x87\xac\x21\xda\x3e\xf2\x05\xd0\xcc\x93\x65\x62\x3e"
+ "\xb6\xd7\x46\x6a\x0f\xc6\x1a\x80\xfc\x52\x3e\x05\xcd\xec\x98\x22"
+ "\xe6\x63\xba\x42\xc8\x94\xf7\xf5\xdd\x40\x9a\x59\x11\x2e\xe6\x53"
+ "\xbb\x97\xe7\x96\x67\x98\x90\x79\x6c\x2b\xe6\x11\xd6\x28\xc2\xb8"
+ "\xed\x74\xb1\x08\xf2\xf7\xe9\xa3\x75\x70\x7c\xea\x8a\xea\xc9\x27"
+ "\xc3\x0b\x8b\x12\x1e\x5c\xb4\x34\x19\x23\x4d\x25\x2d\x5b\x9e\x84"
+ "\xbf\x4b\x17\xbc\xcc\x7e\x96\xcd\x5f\xf8\x02\xff\x27\x69\x71\x04"
+ "\xfe\xb3\x18\xf0\x86\xbf\xf1\xcb\x0d\xf8\xf3\xc2\x32\xbc\x4d\xd1"
+ "\x4f\x5a\xfe\x02\xfe\xf4\x3c\x07\xaa\xeb\xc8\xec\xb2\x00\x36\x1a"
+ "\xb9\x9c\xed\x82\x31\xd2\xc9\x70\x66\xc7\xae\x31\x93\xfd\x3a\x07"
+ "\x91\xe6\xb5\x3c\x7d\x8e\x38\x64\xe8\x73\x24\x74\x8d\xe1\x85\x50"
+ "\xc7\xa2\x04\xd0\x19\x49\x1d\x99\x8e\x08\x33\x79\x89\x88\xb2\xb1"
+ "\x94\xf9\x39\xcd\xec\xca\x10\xf7\x76\x2a\x04\xe3\xae\xd9\xe8\xbf"
+ "\x1f\xee\x59\x9c\x6d\xb8\xcf\x80\xfb\x62\xb8\xc7\xf8\xda\x61\x70"
+ "\x3f\x0f\xe7\xa4\xe0\x5e\x03\xf7\xe1\x82\x71\xbb\x1e\xcf\x18\xc3"
+ "\xbd\x16\xee\x27\x40\xf9\x85\x52\xbf\xe8\xdb\x56\x76\x94\x4b\xb1"
+ "\xbf\x79\x9c\x6f\x47\x55\x77\x9c\x6f\x8c\xe7\x94\xa6\x9e\xc7\xf4"
+ "\x2f\xb3\x41\x1c\x2d\x01\x9a\x71\xc9\x90\xa7\x45\xd2\x97\x7c\xbe"
+ "\xc3\x61\x93\xfc\xa7\xf0\xf9\x0c\xa7\xc2\x2d\x5e\x3a\xde\x87\x49"
+ "\xf1\xd2\x71\xbe\x8b\xc5\x6b\x84\x5f\x9a\x89\xfe\x64\x69\x59\x9f"
+ "\x73\x79\x2c\xce\xa7\x73\x25\xfa\xe6\xb5\xa6\xc7\xcb\xee\x28\xc1"
+ "\x39\x34\xb8\xe7\xbe\x25\xe9\x19\xe2\x64\xf1\xa1\x24\xbf\x73\xee"
+ "\xbe\x24\xfa\x3c\x0f\x75\x08\x6c\x06\x16\xef\x6a\xf1\xb2\x50\xc7"
+ "\x82\x04\x6e\x07\x3a\x8f\x70\xf9\x55\x19\xcf\xed\x05\xe7\x3e\xfa"
+ "\x14\x8f\x89\x62\x26\xc2\x0c\xee\x7b\x6a\xf1\x32\x0a\xef\x86\xa6"
+ "\x2c\x48\x60\x69\x90\x6f\x2d\xd8\x6a\x62\xfd\xb6\x9b\xc2\xf1\x8c"
+ "\xab\x20\xfa\xc8\x70\x96\x3d\x37\x2e\x03\xbf\xa3\x64\x76\xc8\x21"
+ "\xa2\xc2\x78\x9b\x58\xb7\x12\x37\xbf\x78\x05\x90\x86\x7b\x48\xcf"
+ "\x3d\x45\x54\xe8\x07\x58\xac\x4b\x19\x8f\x1f\x26\x44\x49\xbe\xa6"
+ "\xcc\x90\xd6\xb3\x3d\x4f\xfd\x9a\xa1\xf2\xce\x17\x26\xcd\x9a\x0e"
+ "\xff\x4d\x12\x43\x56\xbb\x63\x33\xfc\xdc\x88\x0f\x22\xcf\xfd\xe9"
+ "\xa9\x17\x79\x5c\x52\x01\xc6\xff\x4e\x36\x16\x12\x70\x0c\xdc\x11"
+ "\x5b\xc4\xf7\xa0\x0a\x07\xd0\xef\xae\x90\x89\xf6\x24\x9e\x9b\x16"
+ "\xf0\x1c\x3b\xd8\x39\x95\xfa\xb7\x56\xa3\x8f\x67\x19\xd0\x58\x78"
+ "\x1b\x9f\x89\x3e\xbc\xe4\xcc\xc7\x95\x93\x68\xd8\x19\x61\xb0\x51"
+ "\xf0\x0c\x6a\xab\x4c\x56\x8b\x76\x07\xce\x27\x09\x99\xc2\x6c\xc4"
+ "\x2d\xf0\x18\x7d\x88\xd8\xe8\x88\x5d\x51\x34\x68\xb7\x0a\x71\x8c"
+ "\xb6\xae\x49\x8d\x34\xa3\xe8\x33\xe0\x31\xb8\x7e\xc3\x63\xcf\x3c"
+ "\x63\x91\xca\x84\x7b\x15\xd8\x50\x49\xf0\xab\xee\xc8\xa4\x33\xdc"
+ "\x62\xf2\x89\x67\xa2\xe9\x22\xf4\xfd\x86\x65\x33\xdb\x59\x26\x7b"
+ "\x8f\xdb\x20\x34\xc9\x4c\xd4\x53\x78\x5f\xc4\x58\xa3\x39\x46\xf1"
+ "\x7f\xb0\x7f\xee\xb7\xf6\x28\xe3\xb0\x34\x57\xca\x31\x0d\x3a\x4f"
+ "\x4e\x1e\x83\xeb\x37\x90\xbf\xd2\x4c\x7e\xca\xf2\xaf\x95\xb3\x73"
+ "\x92\xad\x01\x1a\x3c\xef\x4e\x1b\xa4\xf4\x40\x59\x14\xd0\x14\x63"
+ "\xba\xf1\xbe\x7f\x6e\x44\xe5\x4c\xb8\xb7\x49\x73\x2c\x6c\xce\x25"
+ "\x0b\xf7\x75\x75\xdf\xc7\xc2\x7d\x98\x74\x0f\xff\x6b\x25\x59\x81"
+ "\x73\x12\xe7\xd2\x63\x37\xe3\xb8\xf3\x05\x0d\xd8\x85\x60\xdf\xc0"
+ "\x73\xe0\x7f\xce\x0c\xfe\x6e\xab\xf5\x5c\x66\x9e\xc1\x36\x82\x46"
+ "\xd8\x40\xfe\xc1\x33\xb0\xff\x16\x37\x89\xe5\xe8\xcd\xf2\x9c\x7a"
+ "\xa9\x6d\x42\x66\x40\xa8\x90\xbd\x5b\xc7\xda\x28\x93\x6d\x85\xff"
+ "\x27\x59\x83\x76\xe1\x3b\xc0\x7f\x47\x31\xcb\x97\x7c\xba\x34\xb7"
+ "\x53\x3d\xdb\x04\x16\x7c\xd5\xc2\x4e\xa4\x1f\xdb\x93\x9d\xb7\x4a"
+ "\x3d\x0b\xed\x4e\xf4\x03\xc2\x62\xa2\xa1\x7f\x4b\x07\x19\xc6\x62"
+ "\x0a\x64\x9f\xb0\x30\x5f\xfa\x2b\x74\x2a\xc9\xb7\x25\x35\xbe\x6b"
+ "\xa3\xf2\x65\x36\xf4\x77\xc9\x62\x87\x74\xe8\x42\x98\x8f\x4b\xd1"
+ "\xb7\xe5\x96\x64\x12\x56\x2c\x70\xdf\x96\xcc\x47\xc8\x30\x18\xa7"
+ "\x24\xf7\xed\xdf\x92\x66\xee\x98\x21\xf9\xb7\xa4\x17\x9c\x76\xf8"
+ "\x7f\x02\xd0\x03\xe3\xbf\xeb\xd8\xbd\xcb\xdf\x94\xa2\x4f\x7f\x97"
+ "\x72\x90\x7b\x72\xee\xef\x72\x50\xfa\x42\x26\x63\xf3\xb2\x1d\x59"
+ "\x32\x90\x7f\xaf\xb1\xb8\x80\x6e\x69\xfb\xa0\x25\xa2\x7f\x03\xaa"
+ "\x17\xd3\x1a\xcd\x24\xbb\x58\x1c\x97\x5a\x71\x8c\xbf\x89\xcd\x8d"
+ "\x09\x6d\xb4\x4b\xbf\xb9\x2f\x99\xd3\x1e\x12\x58\xde\x8e\xfe\x29"
+ "\xb2\xe4\x1a\xb3\x4c\xce\x7c\x73\xb3\xb1\xa4\x4c\xae\xe9\xd9\xaf"
+ "\x9f\x7f\x61\x59\x7c\xc2\xfc\x97\x96\x18\xb4\x4f\xcd\x7e\x8c\x05"
+ "\x4a\x9c\xa4\x5d\x94\x94\xc0\x54\x92\xf6\xa9\xe9\x8f\x46\x47\xcf"
+ "\x9e\xff\xeb\xd9\x8f\xcc\x9e\xf3\xeb\x87\xf8\x89\xc5\xd9\x89\x2b"
+ "\x31\xd8\x66\xd2\x32\x2d\xbe\xf4\xbc\x18\x4d\x7c\x55\x42\xe2\xb2"
+ "\x9e\xf2\x20\x8c\xcd\x73\xc9\xd9\x9c\xae\x0d\xff\x67\x73\x69\x32"
+ "\xf9\x4e\x69\x8e\x8b\xc9\x3e\x99\x7c\x1b\xd2\x96\xc5\x1a\xcf\x92"
+ "\x4f\x42\xfb\x4a\x8c\xf3\x8e\x7a\x47\x81\x7d\x1a\xf5\x0f\xb4\xc5"
+ "\xec\xee\x9b\x8b\xbf\x1b\xa0\x90\xe3\x7b\x62\x5f\x16\xd3\xc6\xd0"
+ "\xb1\x63\xd3\x99\x7f\xad\xac\x80\x30\x69\xde\x1b\xd3\xa4\x3a\x34"
+ "\x63\x9e\x2c\xf9\xb3\xdd\xf1\x84\xb3\x02\xa6\xba\xe2\x50\xb2\x3f"
+ "\x0f\x1a\x11\x82\xe6\x4c\x20\xd8\x2a\xc3\xe0\x1a\x8e\xd7\x8c\x6e"
+ "\xf9\x9e\x4c\x1b\x71\xcc\x16\x2a\x03\x1d\x9c\x12\xc0\xe3\x58\x65"
+ "\x35\xb0\xd8\x0b\xd1\x4e\x47\xc0\x7c\xa7\x1c\x7e\x03\xe8\x7c\xa7"
+ "\x82\x8d\x13\x69\x32\x6d\x60\x67\xed\x93\x69\x3d\xc6\x6b\x03\x1c"
+ "\x1b\xa3\x1d\x69\xc6\x68\x27\x75\xcc\x07\xfb\x1d\x7e\x4f\xe0\x99"
+ "\xf1\x68\xe7\x09\xca\x62\xd6\xe0\xd9\x7a\xee\x67\xb0\x1a\xf7\x50"
+ "\x3e\x07\x18\x2e\x69\xe7\x31\x89\xa3\x57\x7e\x7f\x6c\xfe\x4a\x33"
+ "\x8f\x49\x7c\x86\xc7\xf1\xe6\xb1\xce\x49\x1a\x94\x73\x60\xbe\x33"
+ "\x40\x1b\xed\xec\xa2\xec\xdc\x6b\x96\x42\xdb\x5f\x9c\xe1\x3e\xe7"
+ "\x2f\xb2\xbe\x98\x4a\xf3\xb2\xd6\xd1\xac\x2f\x55\x34\x6f\xbd\x82"
+ "\x1a\x77\xe3\x7c\xa7\x8c\x66\x35\x35\xc1\x3d\xa4\x1f\xdb\x41\xf3"
+ "\x8c\x0a\x9a\xd5\x9c\x0a\xbf\x70\x7f\x7c\x26\xcd\xcb\x86\xfb\xaa"
+ "\x30\x78\x2f\x83\x66\xed\xc5\xf7\x08\xcd\xfa\x50\x01\xbf\x70\xff"
+ "\xa1\x03\xf2\xc1\xfd\x47\x36\xf8\x85\xfb\x7d\x6d\xad\x32\x45\x0b"
+ "\xbc\x03\x69\x96\x70\xfe\xad\xef\xc2\xd9\xb7\xb2\xce\x84\xf3\x6f"
+ "\x9c\x0d\xe7\xdf\xb0\x85\xf3\x6f\x74\x84\xf3\x6f\xec\x87\xf7\xb2"
+ "\x8c\x34\xeb\xe3\xd9\x90\x0f\xea\x5a\xbd\x0f\x7e\xe1\xfe\x93\x29"
+ "\x90\x0f\xee\x3f\xdd\x0a\xbf\x70\x5f\x0b\x75\xc9\x86\xfb\xba\x75"
+ "\x90\x3f\x97\x66\x99\xec\x90\x4f\x45\xb3\x0e\x2e\x86\x5f\xb8\x3f"
+ "\x64\x86\x7c\x70\xdf\x00\xe5\x18\xe1\xfe\x70\x35\xe4\x87\xfb\x4e"
+ "\xac\x4f\x21\xcd\xea\xc2\x72\x01\x9b\x4e\xcc\x0f\xf7\x14\xca\x33"
+ "\xaa\x69\x0e\xa9\x84\xdf\x42\x9a\x23\x8f\x87\xfc\x70\xaf\x80\xb6"
+ "\x66\x6d\xa2\x39\x81\x15\x90\x2f\x8c\xe6\x0c\x87\xf4\xf5\x70\x1f"
+ "\xa4\x86\x7c\x70\x3f\x02\xf3\xc3\xbd\x4a\x0f\xf9\xe1\x3e\x04\x69"
+ "\x54\x44\x73\xd4\x49\x90\x4f\x43\x73\x46\x37\xc0\x2f\xdc\xdf\x88"
+ "\xf5\x87\xfb\x9b\x37\xc1\x2f\xdc\x8f\x01\x5a\x65\xc3\x7d\x38\xd4"
+ "\x2f\xab\x98\xe6\x8c\xc7\xf2\xc3\x69\xce\x6d\x48\x1f\xb8\xbf\x23"
+ "\x03\xf2\xc1\xfd\x9d\x40\x0f\x23\xdc\xeb\x66\x40\xfe\xf0\x3e\xf9"
+ "\x99\xf3\x63\x2d\x5d\x33\x8c\xd0\x9c\x9f\x6c\xa2\x6b\x86\xc3\xef"
+ "\x03\xd3\xe8\x9a\x40\x1d\xcd\x89\xdc\x0a\xe9\xf0\xfb\xd3\x70\xb8"
+ "\x9f\x24\xde\xc3\xef\x4f\x6d\x70\x1f\x21\xde\xc3\xef\xff\xa9\x81"
+ "\xfb\x29\xe2\x3d\xfc\x3e\x38\x1b\xee\x23\x69\xce\xbf\x4d\x82\x7b"
+ "\xf8\x7d\xb0\x0a\xee\xa7\x8a\xf7\xf0\x3b\xd5\x0a\xbf\x0e\xeb\xb8"
+ "\x98\x19\xd6\xe0\xb9\xc4\x1a\x9c\x63\x40\x5d\xee\xcc\xcf\xca\x10"
+ "\x42\xd6\x63\x8c\xca\x61\xe9\xe7\xc9\xf0\x56\xd9\xf0\xcd\x28\x27"
+ "\x4c\xa9\x66\x16\xdf\x4f\xf4\x5b\x39\xac\x59\x36\x0c\xe3\x45\x62"
+ "\x8c\x06\x39\xb4\xbd\x92\x66\x06\xb6\x43\x9b\xa7\xd2\xcc\x91\xcd"
+ "\xf0\x0b\xf7\xa3\x0e\x41\x9b\xe1\xfe\xa7\x39\xf0\x0b\xf7\xcf\x3c"
+ "\x0a\x6d\x9f\xda\x91\x35\x5c\x65\x96\x29\xd8\xba\x2b\xfd\xd3\x53"
+ "\x71\xa1\x8e\x74\x1a\xed\x00\x7d\xb0\x79\x63\x44\xa8\x23\x8e\xd0"
+ "\xbc\x0d\xea\x50\x8c\xc3\xb1\x25\xc6\x48\x43\xe6\xb2\x3a\x61\xac"
+ "\x1d\xda\x35\x41\xce\xbf\x3d\x92\x36\xcb\x86\xff\x0c\x63\x42\xd0"
+ "\x90\xa5\xde\x9e\x3f\xcd\x9e\x8f\xdd\x18\xc5\x9f\xab\x89\xeb\xf9"
+ "\x6f\xf0\xf9\xca\x50\xf4\xad\x3e\xfe\x91\x28\xb3\x6c\x78\x29\xe6"
+ "\x31\xcb\x86\x41\x1d\x03\x88\xc9\x66\x11\xdb\x38\x1c\xf3\xfd\x11"
+ "\xdf\xf3\x36\x6f\x23\xe4\x16\xe8\xf3\x40\x6e\xe1\x38\x16\xf4\x97"
+ "\x5c\x9b\x36\xa1\xa2\x59\x16\x64\xd8\xc2\xe6\x27\x36\x2a\xb9\x3c"
+ "\x53\x3e\xd0\x95\xb3\x7b\x9e\x76\x55\x28\x94\x17\xf4\x4a\xba\x9d"
+ "\xda\xaa\xd2\x1e\x05\x59\xc8\xd2\x8b\xd8\x99\x1f\xfe\xff\x3a\xb6"
+ "\x97\x93\xff\x6f\x60\xf3\xc6\x50\x16\xbe\xeb\x3e\x6e\x70\x66\x45"
+ "\x38\x84\x90\x8d\x6a\xb6\x16\x2e\x53\xfe\x6c\xb7\x60\x96\x87\x26"
+ "\x91\x40\xed\xaa\x3d\x50\xbe\x32\xc3\x63\x8c\xd9\x9d\x97\x3d\x4b"
+ "\xf8\x00\xf2\xbe\x89\xf3\x41\x59\xca\xc2\xee\x98\xc8\xd0\x86\x0d"
+ "\xa8\xbb\xe4\x24\x0a\xf5\x29\xb3\x59\x65\x41\x6a\x3c\x9d\xe4\x50"
+ "\xe5\x58\x1d\xb9\x73\xac\xce\xdc\x8d\x4a\x9a\xbf\x51\x1d\xe2\x90"
+ "\x71\x5f\xbe\xb2\xa0\xe9\xf7\xda\xd1\x46\xfc\x04\xdb\xe7\x14\x86"
+ "\x3d\x18\x31\x39\x85\xc8\xab\x12\xbf\xc4\x77\x1f\xa2\x59\x0f\x17"
+ "\x99\xda\x1a\x49\x55\x22\x2b\x6b\x2a\xcd\x7a\xdc\x22\x0c\x9b\x1e"
+ "\x56\x82\xb6\x76\x0a\xce\x95\x1d\xc2\xf7\xf6\x02\x9d\x41\x0f\x04"
+ "\x85\x4b\x75\x41\x1d\x90\x07\xb4\x43\x3b\x18\xfd\x57\xcc\x77\x3a"
+ "\xd1\x1f\x9c\xd1\x0c\x74\xe0\x3a\x32\x08\xfd\x89\x11\xfe\xdd\xa0"
+ "\x39\xc2\x88\xdd\x33\xea\xe6\xe1\xba\x9f\x1a\xfd\x6b\xd9\xd8\x99"
+ "\x77\x8c\x56\x2c\xa0\xde\xe6\x79\xdd\x79\xb7\xe4\x05\xc3\xfc\x55"
+ "\x86\x65\x89\x49\xf3\x97\x1b\x1e\xd4\xc2\xe0\x4f\xbb\x6c\xa1\x76"
+ "\x49\xc2\x92\x65\x89\x2b\x7b\xf9\xf4\x81\x7a\xed\x04\x6c\x30\x99"
+ "\x7c\x00\x6c\x70\x36\x07\x2f\x1b\xb9\x0e\x79\xbd\xf9\x0f\x3c\x66"
+ "\x06\xe4\x01\xfd\xff\x12\x9b\x4b\x17\x8a\x36\xea\x68\x71\x8c\x31"
+ "\x1b\xfd\x76\x2c\xc7\x98\x0c\x56\x62\x22\xed\x3c\x8e\x2e\x8b\x91"
+ "\x07\x63\x82\xe4\xd5\xb4\x2a\xb9\x1d\x31\xae\xa4\x79\x39\x1a\xc0"
+ "\x78\xfd\xc5\xbc\xb9\xfa\x66\xd9\x48\xfd\xc5\xbc\x1c\xa5\x14\xe3"
+ "\xc8\x99\x9b\xa3\x17\x54\x05\x19\x18\xe3\xa8\x8b\x6a\x48\x2d\xd0"
+ "\xb2\xd3\xb8\x7b\x0a\xc8\xf8\x88\x2d\x99\xb4\xc2\x09\x63\x24\xe6"
+ "\x73\xe6\x4f\x4f\x45\x39\xa9\x4e\xe1\xcc\x24\x4a\xf8\x0d\xa1\x21"
+ "\x85\xe5\x5d\xaa\x0d\x04\x9f\x63\x6c\x23\x67\x97\x8e\xa4\x35\x50"
+ "\xe1\x3f\xf4\x80\x9b\x4c\x30\xb2\x31\x96\xab\xfe\x34\x81\xf4\x11"
+ "\x42\x7e\x4e\x61\xeb\x0c\x22\xc7\xbc\x60\x9f\x91\x79\xf0\x7f\xea"
+ "\x02\x12\x0c\xf9\x42\x53\x0f\x40\x7a\x87\x6e\x84\x23\x5d\xa7\xec"
+ "\x4c\xd7\x8d\xe8\xa2\x3a\x95\xa9\xc5\x4e\xba\xee\x7c\x6a\xd6\x3d"
+ "\x56\xa2\xd8\x0c\x76\xdc\x16\x01\xfa\x57\x71\x8c\xc1\xf9\x9a\x6e"
+ "\x98\xe3\x35\x9d\xa2\xab\x4b\xa7\x74\xac\xd0\x29\x3a\x57\xe8\x86"
+ "\x75\x75\xe8\x94\xa6\x78\x2b\xf9\xc4\xfa\x67\x52\xd7\x62\x61\xf3"
+ "\xb4\x5d\xc1\x85\x95\x5d\xc1\x39\xc5\xaa\x16\x12\x36\xd9\x00\x76"
+ "\x1c\xd8\xb7\x6f\x80\x6d\x0f\x98\x50\x39\xb6\x3d\x15\x45\xf3\x0a"
+ "\xe3\x80\xbe\x4f\x4c\x9f\x48\xbf\x77\x66\xa9\xc3\xb4\x8f\x83\x2c"
+ "\x5a\xa3\xd0\x40\x1a\xe0\x27\x1c\x74\x8b\x06\xe4\x9b\x02\x64\x20"
+ "\xe8\x4a\xce\x07\xd0\x4b\x21\xd5\x38\x4f\x80\x79\x79\xbe\x1b\xc1"
+ "\xa6\xc2\xdf\x51\x7a\x16\x73\x35\x2b\x28\x75\x0b\xb3\x21\x46\x66"
+ "\x48\x36\xc4\x3e\x45\xdf\xbe\x41\x20\xcf\xd6\xee\x31\xb7\x00\xf2"
+ "\x24\x2f\xcb\xe0\xd5\xaf\x2f\x7e\x3b\x3f\xab\xb4\x50\xe8\xf6\xd7"
+ "\x0c\xf2\x70\x64\x2d\xf4\x9f\x0c\xf6\x2c\x77\x83\x3a\xed\x2c\x09"
+ "\xc0\x67\xe5\x17\xec\x72\xbc\xd7\x26\xca\xa8\xc9\x66\x27\x85\xb8"
+ "\x5e\x11\x1e\x63\x2c\xbf\x60\x95\x23\x5e\xea\x20\x0d\xde\x3d\x5e"
+ "\x78\x41\x2c\xb7\x68\x63\x44\xfa\x2b\x84\xc5\x2d\xc1\xd8\x47\x88"
+ "\xa3\xc2\x34\x18\x33\x62\x9c\xa6\xc4\x00\xe8\xc7\xaa\xdb\xe0\x7f"
+ "\x25\xe6\xa3\xaa\x0d\x6a\x01\xca\x00\x2c\xa5\xd0\xe0\x1c\xbb\x90"
+ "\x97\x93\x01\x98\x8a\xa2\xe3\x62\x2c\xc2\xe6\x8d\x9a\x8e\x2c\x55"
+ "\x0a\xd0\xa3\x50\x9a\x83\xa8\x2b\x73\x10\xf4\xb7\x45\x1f\x75\x90"
+ "\xfd\x49\xe7\xd1\x27\x6f\x80\x35\x68\x77\xa4\x35\xb8\x40\x6f\x0d"
+ "\x2e\x8c\x13\xf2\x0a\xca\xe0\xda\x61\x48\x24\xaa\x53\xb2\xe0\xa9"
+ "\xdd\xfe\x62\xcf\x5e\x23\xfe\x62\xc1\x2e\x63\xf6\x19\x60\x07\xed"
+ "\x2d\x68\xaf\x05\xe3\x8f\xa0\x1d\x86\x32\xb7\x23\x2b\x58\x2f\xd9"
+ "\x51\x28\x47\x9c\xd9\xbb\xa7\xc1\x15\x05\xe9\x19\x66\x99\x76\xab"
+ "\x24\x63\x40\xaf\x68\x85\x9c\x5f\x64\x74\xe0\x99\xa8\x2e\xfd\xc3"
+ "\x98\x17\xe8\x36\x0b\xbe\x15\xe0\xec\xd2\x4f\x85\xeb\x21\xb8\x7e"
+ "\xee\xcc\xcb\xb1\xc2\xa5\x76\xe6\x15\x46\x39\xf3\xe6\x4e\x80\x4b"
+ "\x07\xd7\x24\xb8\x22\xe0\x9a\x02\x57\x24\xcd\x9b\x3b\x15\x7e\xf1"
+ "\xf9\x34\xb8\x66\xc0\x35\x13\xae\x59\x70\xcd\x76\x6e\xde\xa8\x15"
+ "\x00\x9f\x70\xe1\x6f\xb8\x33\xaf\x20\xa5\x6f\x9f\x25\xad\x3c\xce"
+ "\x42\xe0\x31\x1a\x8a\x71\x78\x53\xcf\xa3\x2f\x48\xcb\x7e\x9d\x6d"
+ "\x70\xfe\xe6\x65\x21\x5e\xfd\x85\x62\xf9\xd0\xb7\xba\x06\x59\x9e"
+ "\xf7\xb9\x13\xcd\x46\x9d\x23\x3c\xa6\x1e\x7d\x9f\x43\x7f\x96\xd5"
+ "\xc5\xb5\x90\x68\x2b\x49\xaf\x69\xe9\x24\xe9\xf1\xd4\xc9\xc6\xd1"
+ "\xa9\x78\x0e\x65\x99\x0d\x31\xec\xa4\xb1\xda\xae\xdc\x1c\x8d\x53"
+ "\x55\x10\x45\x55\x05\x29\xcc\xbf\x24\xc8\x1e\x8c\x6b\xd6\x3d\x86"
+ "\x44\x4c\xc1\x38\xb2\xb6\xed\x3c\x79\x2d\x9e\x0a\xb5\xc0\x4d\xf4"
+ "\x21\x19\x2a\x23\x7f\x44\x7c\x49\xe3\xc8\x5f\x35\xd1\x0c\xc0\x4a"
+ "\x90\x13\xe8\x26\xe0\xf8\x11\x70\x85\x63\x49\x09\x5b\xa0\xcb\xd4"
+ "\x52\x2c\x28\x3a\x2c\x24\x0c\x9e\x29\x30\x56\x54\x31\x8c\x1f\x8b"
+ "\x93\xc9\x84\x62\x78\xc6\xe2\x7a\x42\xbd\x9f\x34\x84\x52\xe1\x65"
+ "\x1d\x29\x79\x89\x28\x83\x4f\xf3\x58\xb1\x4e\xa0\x7d\x77\xbc\x84"
+ "\xdc\xb9\xfa\x27\x4e\x6b\xc9\x7e\xdd\x51\xd0\x49\xe5\x20\xbb\xe7"
+ "\xea\xbb\x40\x6e\x03\x2d\x9d\x83\xa3\x65\x68\xcd\xe5\xa2\x65\x57"
+ "\x78\x8c\x81\xd3\x33\x8e\x20\xcd\x7a\xd2\x13\x69\xbc\xaa\x05\xe8"
+ "\x09\x74\x35\x35\x38\x49\x88\x8c\x2c\x90\xe8\xf9\x26\xd0\x13\x68"
+ "\xaa\x41\x9a\x02\x3d\x18\x4d\xa9\x48\xd3\x12\x37\x9a\x82\x6c\x62"
+ "\xbe\x38\x91\xa6\x02\xd0\xb4\xc4\x0b\x4d\xbb\xc7\xe2\x40\xd3\xb7"
+ "\x7c\xa2\x69\xd9\x25\xd0\x74\x94\xd6\x1b\x4d\x1d\xa8\x2f\xf3\xe7"
+ "\xc6\x51\x90\x77\x26\xc7\x27\xcc\xaf\x2c\xd8\x3a\x3b\xc0\x66\x2b"
+ "\x13\x54\x39\x7a\xa0\x89\x0a\xd7\xf4\x31\x36\x19\xf3\x01\x57\x46"
+ "\x2f\x3a\xf3\x0b\xab\x30\x0d\xe4\x96\xfe\x5e\xf4\xa3\x67\x30\x93"
+ "\x12\x39\xad\xa8\xbb\x60\x03\xfd\x12\xf6\x74\x27\xda\x92\xf9\x85"
+ "\x54\x80\xe1\x3f\xca\x90\xe7\x26\x12\x45\x27\xc8\x09\x43\x32\xb9"
+ "\xb5\x10\x64\x5d\x27\xc8\xce\x53\xb2\x51\xb6\xe9\x06\x81\xc2\x95"
+ "\x8e\xfe\x51\x85\xe0\x82\x32\x90\xd5\x8c\xbf\xc8\x33\x5c\x2b\xac"
+ "\x7d\xee\x43\x28\x6f\xf4\xf1\x4f\xe3\x1c\x24\x5d\xdf\x9b\xbf\x42"
+ "\x7a\xac\xd6\x99\x3b\x70\x3f\xc1\xf8\x88\xa9\x16\xe4\x6b\x39\x31"
+ "\xb5\xb8\xfa\x89\xb0\x82\xcb\x60\xe4\x05\xf6\x0b\xec\x23\x05\x6e"
+ "\xb2\x17\xe4\xba\x7a\x8b\x18\x2f\xc4\x09\xb2\x17\xf2\x2a\xd0\xaf"
+ "\x2a\xc6\x11\xe9\xb3\x7f\xbc\x06\xfd\x63\x15\x8b\xe5\xa4\x01\x7a"
+ "\x94\x77\x76\x70\x1e\x22\xcf\x4c\x8e\x6a\xc6\xbf\x42\x51\xd6\x73"
+ "\xba\x17\xbc\x46\x69\x2c\x71\x42\xdd\x85\xfc\xc2\x72\xda\xa1\x1f"
+ "\x81\xf3\x8a\x30\xd6\x8d\x08\x8d\x07\xbb\xe1\x7b\xd0\x05\x4b\x01"
+ "\x5f\x67\xc8\x84\xb7\x96\x82\x2d\xd0\x81\x31\xd9\xa0\x3e\x2b\x79"
+ "\x2c\x5b\x21\x2b\x24\x05\x9e\x31\x7f\xaf\x82\xe4\xef\xf5\x9c\x0e"
+ "\xc7\xe8\xae\xb9\x9d\x65\x3a\xb9\xeb\x9b\x1f\x66\x38\x95\x6d\x16"
+ "\x76\x36\x5e\x76\xc3\xdb\x7c\x2d\xba\x4c\x8f\x74\x6d\x93\xdd\x60"
+ "\xe6\xf3\xb9\x6f\x2f\x36\xa4\x91\xe1\xa7\x64\x37\xbc\x0e\x76\x55"
+ "\x9c\x01\xe3\x72\x4b\xcf\xd2\x63\x91\x0e\x53\x26\x67\x90\x0c\x67"
+ "\xf6\x69\xa5\x29\xe5\x34\xfa\x4f\x1c\xa4\xec\xbd\x81\xf9\x8f\x74"
+ "\x1a\x3f\x5c\x07\x74\x8a\x12\x72\x3e\xcc\x05\x99\x12\x41\x5f\x86"
+ "\xb6\xbe\x04\x6d\x3d\x05\x74\x3d\x05\x6d\x5d\x21\xb6\x55\x8c\x53"
+ "\x27\x00\xfd\xe1\x59\xdf\xba\x4f\x6a\xeb\xcb\xe8\x2b\x7d\x5b\xe4"
+ "\xea\xd3\xe4\x06\x7a\x3b\xae\xcf\xb2\xb3\x8b\x1d\x26\xc7\x51\x82"
+ "\xdf\x65\xba\x39\x77\x6e\xe4\x1c\xc0\x23\xd2\x1c\xec\x81\x52\x1a"
+ "\x92\x53\x28\xf1\x01\xeb\x43\xbb\xf4\x23\x4a\x96\x42\x7d\x90\xf6"
+ "\x67\xc8\x24\xec\xcf\x40\xfb\x09\x25\x48\x7f\xcf\x58\xd1\x61\x8c"
+ "\x07\xc3\x80\x07\x4b\x45\x1e\x64\x8b\x3c\x00\x3b\x11\xf4\xb4\x12"
+ "\xf4\xaf\xa6\x24\x93\xf3\x60\x70\x34\x0a\xab\x1f\xe2\xfe\xba\xcf"
+ "\x7b\x7f\xd5\x04\x77\xf2\xb1\xa1\x0c\xfd\xce\xd2\x90\x8d\x01\x42"
+ "\x17\xf4\xdb\x7c\xb1\xdf\x52\xfd\xcf\xa5\x3e\xdb\x2a\xbb\x71\xbb"
+ "\x6f\x7d\xf6\xa6\xcd\xff\x4b\xfb\x6c\xd8\xe5\xed\xb3\x37\x2f\xf0"
+ "\xec\xb3\x37\x6f\xf2\xec\xb3\x37\xff\xd2\xd5\x67\xc5\x67\x43\xd2"
+ "\x67\x6f\x8e\xbb\x3a\x7d\xf6\xe6\xb8\x3e\xfa\xec\x56\x1f\xfa\xac"
+ "\xc6\x4b\x9f\xd5\x5c\xbe\x3e\xab\x59\x77\xe5\x74\xec\x2d\xfb\x3b"
+ "\xe5\x7d\xe8\xd8\xd7\xdc\x74\x6c\x30\xea\xd8\x31\xb1\x7d\xf5\xd7"
+ "\xae\x62\xe8\xaf\x2a\xb1\xbf\xfe\xc7\x3f\xa0\xbc\xb1\x31\x9f\x34"
+ "\x0d\xdc\x5f\x1d\xc5\x2e\xfb\xc9\x6b\x9f\xd5\x63\x9f\x2d\x23\x26"
+ "\x33\xeb\xb3\x0b\xa4\x3e\x5b\x2c\x8e\x75\xfa\xe9\xb7\x61\xde\xfa"
+ "\x2d\xc6\xee\xc2\xb8\x5d\xfd\xf6\x5b\xd1\x5e\xea\x1a\x87\xfd\xb6"
+ "\xea\x1a\xd3\xb5\xb7\x8c\xf1\xec\xb7\xb7\xcc\xf4\xec\xb7\xb7\xc8"
+ "\x5c\xfd\x56\x7c\x36\x24\xfd\xf6\x16\xcd\xd5\xe9\xb7\xb7\x68\x7e"
+ "\x38\xba\x36\x7c\xea\x95\xd3\xb5\xb7\xae\x61\xfd\xd6\x9b\xae\x4d"
+ "\x17\x75\x6d\x30\xea\xda\x71\x37\xfa\xd6\x77\xc7\x07\xff\x2f\xef"
+ "\xbb\x97\x59\xe7\x8e\x3f\xec\xd9\x77\x6f\x55\x7a\xf6\xdd\xf1\xbb"
+ "\x5d\x7d\x57\x7c\x36\x24\x7d\x77\x7c\xc3\xd5\xe9\xbb\xe3\x1b\x7e"
+ "\x38\x3a\xf7\x56\xbb\xb7\xbe\xab\x1d\x4f\x32\x9a\x65\xda\x18\x53"
+ "\x31\xdb\x43\x97\x61\x72\x3c\x48\xd8\xbe\x13\x99\x76\xa5\x49\x13"
+ "\x49\x84\x9c\xdd\xe5\x18\x57\x05\xf7\xbf\xfc\xde\x6d\x7f\x09\x5f"
+ "\x7f\xd5\x6e\x96\xf6\xc7\xbc\x25\xc6\x5e\xe9\x6f\x7f\x0c\x35\xee"
+ "\x8e\x12\xdf\x6b\xe0\xd8\xd8\x3d\x4d\xba\x67\xbe\x60\x64\xda\x46"
+ "\x9a\xbd\x7b\xaa\x35\x68\xf7\x54\x6f\x6b\x24\x21\x6b\x28\xc5\x3d"
+ "\x21\xe7\xc6\xc7\x58\xcf\xe5\x10\x52\xc8\xd6\x1f\x6e\x53\xc3\xbb"
+ "\x91\x6c\x3f\x43\x48\xa0\xf9\x5c\xe6\x2c\x02\x69\x13\xa4\x34\x16"
+ "\x2f\x3b\x33\x80\x0a\xf0\x8c\xe6\xcf\xa9\xc1\xd8\x7a\xe8\xa7\x78"
+ "\xf2\x05\xc4\xe2\x6d\x53\x40\x46\xb0\xfd\x1e\x6c\xcd\xfd\xe6\x5b"
+ "\x6c\x25\xed\x44\x51\xb7\x8e\xed\x7b\xc3\x7d\x35\xa5\xf9\x88\xff"
+ "\x80\xbb\x8b\xa8\x5c\x41\x84\x2d\x31\x8d\x34\xb8\xa0\x9c\xed\x03"
+ "\x06\xac\x48\x7b\x6d\x30\x06\xa1\x30\x2e\x26\x45\xf2\x95\x4b\xa1"
+ "\x7e\x1f\xa4\xe1\x39\xd1\x00\x5a\x92\x48\xd4\x70\xa9\x68\x5e\x41"
+ "\x39\xd4\xab\x52\x9a\x3b\xf4\xba\xa7\x1b\x63\xfe\xde\xa2\x51\x88"
+ "\xfb\x7a\xd0\x67\x00\xdb\x1f\x58\x20\x17\x8c\x4e\x48\xa7\x99\xe9"
+ "\xd4\x94\xe2\x20\xa1\x40\x0b\x5c\x6f\xc7\x98\x60\x42\x49\x8c\x75"
+ "\xed\x58\x42\xfe\xba\xca\x22\xc7\xbd\x17\xce\xff\xbc\xc5\x56\x95"
+ "\x76\x3f\xae\xc7\x33\xff\xff\xad\xb2\xdb\xdf\x8b\x3e\xc9\xe3\xfb"
+ "\xc2\xff\xfb\x71\xdd\xe1\x09\xb8\xc7\xf5\x6c\xe1\x9c\x46\x81\x79"
+ "\x21\xfd\x95\xaa\xe4\x2f\x49\xa8\x81\x28\xf3\xa1\x6d\x62\xde\x28"
+ "\xcc\x6b\x96\xdd\xce\xce\xba\xc1\xfd\x6c\x9c\x2b\x87\xf7\xd8\x3c"
+ "\x29\x2d\x8e\x69\x64\xf2\x21\xb7\xa0\x1c\xda\xdf\xc8\xf6\x7d\x42"
+ "\x3b\x0b\xa0\xcd\x90\x47\x85\xfb\x6d\xd8\x6f\x1a\x51\x6f\x82\x34"
+ "\x2c\x07\x7e\x55\x6c\xcf\xaf\xec\xf6\x08\x2c\xdb\xeb\x59\x01\x55"
+ "\x41\x39\x05\x6c\xf3\xb3\x33\xb2\x83\xcd\xb2\x3b\xe2\x43\x65\x94"
+ "\xc2\x37\x53\xd6\xe2\x1c\x36\xee\xcf\xc6\x3d\xe7\xb2\x3b\x1e\x82"
+ "\xf2\x15\x6f\xb1\x39\xdb\x3b\xc2\xcd\xb2\xdb\xaa\xbb\xf7\x0e\xb0"
+ "\x75\x96\x3b\x92\xf0\x3b\xf8\x8e\x98\x9f\xed\x31\xc4\x3a\x6b\xd3"
+ "\x02\x28\xdc\x3f\xcb\xf7\x70\x2b\x17\xc2\xfb\xae\xf8\x3f\xfc\x3d"
+ "\xc0\xd2\x1d\x06\xe0\x19\xdb\x2f\x85\xf7\x5e\xf7\x14\x8b\x7c\xab"
+ "\x05\x6b\xa2\x17\xef\x24\x8c\x00\x2e\x24\x8c\x60\x7d\xdf\x49\x33"
+ "\xcb\x99\x3e\x92\xdd\xe1\xc4\x7c\xf9\xc0\x43\xe7\x9b\x1a\x05\x9b"
+ "\x97\xee\x42\xbe\x34\xc3\xb3\x09\xef\x22\x5f\x0a\x40\x17\x88\x79"
+ "\x1b\x5d\xf5\xc7\xfb\x09\x8c\x9f\x02\xf0\x82\xef\x59\x9a\x90\xcd"
+ "\xe2\x2f\x81\xcc\xc0\xbd\xe6\xfb\x52\x08\xae\x7f\x36\x52\xc0\xc8"
+ "\x5f\x13\xed\xf2\x92\x64\x9e\xfe\x41\xbb\x5d\x5e\x70\x8a\xb0\x75"
+ "\xad\xbc\x97\x88\x02\xf4\x90\x02\xcb\xa4\xe1\x31\x29\xf7\x4a\x7c"
+ "\x5c\x05\xbc\x4b\x06\xec\x02\xcd\x0b\x80\x7e\x25\x9d\x6c\x9d\x26"
+ "\xa5\x44\x20\x2a\x01\xf2\x99\x65\x13\xf6\x41\x79\xea\x2d\x37\x51"
+ "\x2b\xee\x89\x06\x1a\xae\xea\xc8\x9a\xd0\xed\xff\x0d\xeb\x84\x7b"
+ "\x9a\xf3\x70\x9f\xbe\x6c\x42\x38\xc7\xd0\x1d\x6d\x52\x9b\xbd\xd1"
+ "\x33\xef\xaf\x24\x3c\x6f\x32\x89\x14\x94\xad\x16\x1a\x70\x4b\x29"
+ "\xce\x37\x3f\xd9\x86\x3e\xa7\x2c\x24\xfa\xb7\xc7\xa8\xc9\xea\x24"
+ "\x42\x50\xab\x05\xd7\x20\x9c\x6b\xef\x1e\x1d\xbd\x12\xe8\x05\xfa"
+ "\x3e\xdd\x4e\xd4\xa6\x34\x2b\x8f\x13\x48\xce\x12\xe7\xab\x20\xc3"
+ "\x41\xae\x83\x4e\x55\xa4\x9f\x25\x63\x90\x5e\x42\x70\x8e\xa6\x55"
+ "\x76\xe7\xf2\x39\x49\x24\x63\x70\x72\xf4\x4e\xb6\xff\x13\xed\x0b"
+ "\x90\xf9\x72\xdc\x57\x67\xb2\x82\x7d\x92\x97\xa3\x19\x64\x39\x5e"
+ "\xe3\x4a\x61\xbb\x05\x9c\x87\x16\xdb\x1c\x8d\x6d\xb6\xd9\x09\xce"
+ "\xe5\x3f\xf9\x0a\xfa\x3a\x3e\x4f\x84\xec\x56\x0b\xb6\x19\x6c\x9d"
+ "\xa2\xc1\xcf\xe9\xff\x48\xd1\xdf\xb7\x29\xd0\x5b\x58\x7b\x4b\xa9"
+ "\xa0\x2a\x28\xc2\x6f\x63\x1d\xf0\x9c\xce\x93\xe7\x09\xa3\x3b\xd2"
+ "\xdf\x64\x77\x12\x1a\xe4\x5e\x07\xc7\x60\xeb\xe0\xbd\xfd\x93\x49"
+ "\x78\xee\x5f\x39\xdf\x9d\x6b\x45\x1a\xe8\x71\x0d\xac\xa0\x08\xe3"
+ "\x63\x3c\x89\x75\xb0\x9e\x26\x4f\x9c\x26\x8c\xff\x26\x5d\x1b\x71"
+ "\x06\xdc\x3d\x1a\xf7\x12\x20\xff\xd3\x1c\xc0\xff\x0b\x76\xf4\x6f"
+ "\x64\x35\x65\x5c\x24\x68\xbf\x38\xce\xe9\xe4\xbd\xf9\x7f\xd7\xf2"
+ "\x39\x29\x83\xe5\xff\x5d\x43\xc4\xff\xbb\xae\x81\xf6\xeb\xfc\x68"
+ "\xbf\x6e\x88\xda\xaf\xbb\x06\xda\x3f\xd1\x8f\xf6\x4f\x1c\xa2\xf6"
+ "\x4f\xf4\xda\xfe\xc7\xc6\x08\x94\xed\x31\x09\xc9\xca\x40\x1d\xc0"
+ "\xf5\xd5\xdd\x4b\x70\x0f\x09\x3b\x97\x25\xde\x13\x7e\x4e\x4b\xd9"
+ "\xe3\x5e\xd5\xe3\x5e\xdd\xe3\x3e\xac\xc7\xbd\xa6\xc7\x7d\xb8\x74"
+ "\x0f\x7a\x24\xf0\x8c\x6c\xe2\x51\xb0\x4b\x33\xcc\xb2\xbb\x53\xc4"
+ "\xe7\x13\xd0\xff\x17\xe8\xf4\x09\xfd\xc4\xaa\xbc\xe5\x94\xec\x6e"
+ "\x76\x4e\x8e\xae\x1d\xab\xa3\xab\x32\x88\x90\x3b\x77\xda\x93\xab"
+ "\x41\x76\x01\xff\x68\x97\x66\x18\xd8\x08\x37\xa3\x8f\x39\xdc\x73"
+ "\xa0\x4d\xc4\xbd\x24\x77\x1f\xc4\xf6\x4d\x36\x54\x11\x21\xe0\x6e"
+ "\xb6\x96\x2f\xe4\xcd\x9d\x66\x0d\xb8\x7b\x2c\xdd\xbc\x51\x9b\x2f"
+ "\x17\x94\xf9\x99\x82\x76\xb5\x95\x5a\x67\x9e\x05\x39\x74\x1e\xfd"
+ "\xbe\x03\x8f\x93\xa8\xb5\x2a\xf1\x34\xd4\xf7\xc7\x3f\xab\x4d\x85"
+ "\xb2\xe1\x3b\xf0\x2d\x18\xc7\xcd\x9d\xc0\x63\xac\xcf\x9d\x56\x67"
+ "\xab\x26\x18\x0f\x48\x2c\x33\x8a\x06\xcf\x9d\x80\x65\xf6\x69\x9f"
+ "\xe6\x66\xed\x84\x6f\x3e\x38\x47\xa7\x20\x74\x8d\x22\x6c\x70\x3c"
+ "\xfd\xf1\x3c\xaf\x76\x6f\xee\xfa\x29\xbc\x5c\xa5\x3f\xe5\xee\xec"
+ "\xa7\x5c\xb1\xbe\x6a\x3f\xca\x9d\xa4\xf2\x5e\xae\x51\xac\xaf\xd6"
+ "\x9f\x72\xe3\xfb\x29\x57\xac\x6f\x94\x3f\xe5\x56\x7a\x2f\x37\x5b"
+ "\xac\x6f\x86\x1f\xe5\xde\x13\xe6\xbd\xdc\xac\x9d\xfe\x61\xe1\x1e"
+ "\x7d\x7f\x58\xf0\x0f\x07\xf7\xf4\xd3\xfe\xf5\x3b\xfd\xc3\xc0\x64"
+ "\x75\x7f\x18\xf0\x8f\xff\x93\xfb\xe5\xbf\x7f\xbc\x9f\x5c\xd1\x1f"
+ "\xef\xfd\xe3\xfb\xbd\x5e\xf1\x8f\xb6\x3c\xf0\xde\x40\x43\x36\xaa"
+ "\x85\xfc\xb9\x06\x21\x24\x2b\x71\xad\x10\x45\x1e\x03\x19\x16\x5a"
+ "\x44\x46\x45\xb1\xf1\xf1\xbd\xa5\xab\x8b\x89\x1c\xc6\xbb\xf2\xb7"
+ "\x57\x35\xca\x4d\x8e\x48\xd4\x39\xce\xad\xc9\x76\xd9\x1d\x90\xbe"
+ "\x17\x10\x60\x03\xbb\x93\x97\x33\xd7\x90\x9f\x16\x45\x44\x9f\x17"
+ "\x36\x3c\x67\x1c\x0d\x72\xcc\x54\x64\xc7\x3d\x2b\xa3\xe0\x3d\x07"
+ "\xe0\x17\xca\xb0\x93\x77\x04\xab\x2c\x2a\x91\xe5\xb3\xb2\xf3\x75"
+ "\xf9\x59\x89\x34\x5d\x87\xbe\x0f\xad\xad\xb2\x88\xa0\x00\x2b\x91"
+ "\xa3\x8f\xa2\x8e\xac\x08\x85\x59\x16\x61\x13\xcf\x93\xb6\x31\x1f"
+ "\x9d\x50\x5f\x3c\xab\x89\x79\xd1\x57\xe7\x64\x03\x91\xa3\xff\x74"
+ "\xc8\x1b\x81\x7e\x3b\xfb\x3b\x97\xed\xcc\x2d\x98\x8d\xef\xd3\x5c"
+ "\xd0\xa1\xa7\x89\x1c\xcf\x62\xc2\x38\xa0\x3e\x1f\xc6\x10\xd3\x27"
+ "\xe2\x9c\x47\x3b\x49\x5b\x4d\x05\x9c\x7f\xa2\xaa\x1c\x25\xee\x8b"
+ "\xe3\x7b\xbc\x23\x6a\x4a\xf8\x9e\x6f\x3b\x8b\x15\x0c\xf7\x6c\x1c"
+ "\x83\xfb\x62\x54\x73\xec\x34\x3f\x38\xaa\xce\xd6\xce\xe2\xfd\x34"
+ "\xcb\x22\x6a\xd1\x7f\xe2\x39\x55\xc1\x2c\x9b\xaa\x20\x16\xea\x55"
+ "\x2d\xb5\x01\xbf\x2f\xa5\xe3\xb8\x0d\xf3\xc1\x73\x8b\x74\x4e\xdb"
+ "\x4b\xec\xec\xd1\xd1\x1a\x6a\xed\xf6\x8b\x21\xbb\xff\x09\xa4\x3d"
+ "\xd8\x0a\x33\x6c\xe9\xba\xf1\x7c\x1e\xe3\xbe\x24\x1c\x0f\x43\xbd"
+ "\xa7\xf0\xb1\xe9\xdc\x29\xcc\x87\x2e\xe8\x80\x39\x3a\xf9\x20\xed"
+ "\xd6\xfb\x98\xfe\xaf\x1a\x8f\x3a\xf2\xfe\x07\xa0\xfc\x7f\x6b\x96"
+ "\xdd\x57\xc4\xc7\x62\x73\x67\xb0\xf3\x89\xb2\xfb\xa6\xc0\x37\x66"
+ "\xd0\xdc\x39\x56\xcc\x07\xcf\x2b\xc4\xe7\xb3\xdc\x9e\xcf\xc2\x7d"
+ "\x92\xe2\x73\x71\x2c\x37\x77\xb6\xdb\xf3\xd9\x86\xf1\x38\x37\x71"
+ "\x3f\x9b\x8b\x01\x7d\x16\x81\xba\xad\xdb\xcf\x47\xf0\xdc\x08\x31"
+ "\xdf\xb4\x36\xd9\xfd\x63\xce\x01\xb6\xe0\xf9\x4c\xb7\xf7\x67\x7e"
+ "\x94\x12\x41\x1e\xdb\x82\x34\xbc\x7f\x92\x59\xbe\x41\xc7\xc7\xb3"
+ "\xf7\x45\xb2\xb6\xab\xe6\xea\xdc\xcb\x83\x74\x3b\x94\xa9\xb3\x81"
+ "\x1d\x05\xff\x6b\xf1\x9b\xee\xf4\x96\x4e\x49\x6a\xe3\x97\x2c\xd0"
+ "\xbe\xb0\x6c\xf9\x52\x3c\xe5\x36\xc2\x63\x7f\xa3\x1a\xcf\x81\x0a"
+ "\xb9\x1b\x22\x4d\x45\x78\x2e\x4d\xcd\xce\x73\x6f\x02\x3e\x3a\xf2"
+ "\x0b\x0d\xce\x90\x42\xe2\xcc\xcf\xd1\xa6\x9f\x27\xf2\x34\x0d\xfd"
+ "\xa6\x6a\xd5\xa3\xe4\x8c\xec\xfe\xfd\x2c\x16\xaa\x96\xf9\x8a\xb6"
+ "\x55\xad\xfa\x10\xd3\xd8\x39\x75\x53\x1c\x4f\xfb\x7f\x69\xd5\xf2"
+ "\x3d\x69\x8d\xf2\x9a\xb8\x76\xf2\x91\xc6\x4a\xf6\x69\xdb\x49\x31"
+ "\xa6\x0b\xf5\x72\xdc\x37\x7a\x46\xf6\x93\x7b\xf0\x5b\x38\xc6\xc7"
+ "\xff\xf9\x7c\xc5\xfd\x7f\xc3\xef\xa0\x8f\x0d\xa0\xcd\xbb\xf8\x3d"
+ "\xb3\xec\xfe\x9d\x01\xc5\xb8\x07\x97\xa8\x20\xdf\x2b\x42\xde\x86"
+ "\x48\xd6\xc7\xb3\xee\x8f\x77\xc8\x55\x7f\x16\xcf\xbd\x31\xdf\xff"
+ "\x1d\x59\x3f\x99\xe7\x76\xc6\x53\x75\x4e\x4e\x1e\x86\x34\x83\x74"
+ "\xb6\x00\x63\x8f\x79\x93\x19\x17\x61\x2c\x7b\xb1\x38\x26\x56\x50"
+ "\x6d\x00\xfa\x6e\x88\xac\xae\x26\x38\x97\x22\xc3\x3d\xb0\x6d\xb2"
+ "\x07\x66\xd1\xe0\x0d\xba\x34\xec\xa7\x40\x8b\xbf\xe0\x3e\xbe\x90"
+ "\x42\xc3\x0e\xdc\xb7\x97\x5f\x48\xfe\x9c\x6c\x97\x7f\x52\x53\x41"
+ "\xb4\x73\xd1\x1e\xfa\xc9\x37\xbf\x8a\xa7\x8e\xbb\x1b\xaa\x48\x4d"
+ "\xcb\xff\x90\x4f\x9b\xaa\x89\x6a\x1e\x09\x48\x37\x53\x27\x1b\xef"
+ "\x27\x11\x79\xb4\x99\x04\xa4\x9d\xc7\x7e\xea\x24\xe9\xcb\xe1\xd7"
+ "\x5e\x0b\x36\xce\x32\xdb\xdb\x69\x96\x40\xed\x53\x84\x40\x7f\x62"
+ "\xeb\xc6\xec\x9c\x8d\x95\x9d\x5b\x0e\xc6\x39\x6c\xb7\xf3\x35\xf6"
+ "\xd5\xa7\x89\xb2\x56\x7f\x94\xa4\xc6\x51\xc1\xb9\x42\x37\x3a\x3a"
+ "\x2e\x80\xb2\x33\x36\x29\x90\xd9\x00\x3c\x5d\xa1\x0b\x79\x23\x99"
+ "\x84\xd5\x25\x99\x89\xc9\x52\x4d\xde\x4c\x24\x61\xb4\x43\x1f\x54"
+ "\x53\xf3\x09\xa1\x39\x16\xf3\x3b\x69\x55\x81\xd2\x9e\xa9\xd0\x35"
+ "\x32\x9c\xb3\x0c\xc9\xc5\xbd\x53\x17\x48\xc4\xfc\xe3\x19\x6c\x9e"
+ "\x15\xe7\xb4\x1d\x1d\x3a\x6d\x57\x87\xee\xf6\xce\x0e\xdd\x78\x69"
+ "\x2e\xfc\xd9\x45\x6a\xb2\x05\xcf\xe6\x64\xfd\x68\x26\xee\xd5\x43"
+ "\xdb\xde\x11\xd4\x66\xc1\x79\x6f\xc4\x25\x7c\x3b\x5c\x78\x41\x47"
+ "\xee\xb5\xb2\xb3\x3f\x38\x17\xaf\x2e\x79\x1e\xea\xdb\xd6\x4e\xdc"
+ "\xf7\xff\x5c\x5c\xa1\x93\xe3\xde\x1f\x9a\xf5\x13\x63\xe7\x96\x98"
+ "\x58\xdc\x03\x04\xba\x60\xca\xe0\xfb\xf6\x03\x6c\x6e\x02\xdb\x0f"
+ "\xfc\x30\xec\x68\x47\xfe\x00\x9f\xda\xad\x72\xe4\x45\x6d\x3c\xf2"
+ "\xa1\xde\x83\x0f\x8c\x6f\x89\x76\x39\xf2\x03\x79\x81\x3c\x71\xf1"
+ "\xe3\x30\xe3\xc7\x0e\x81\xf3\xa3\x13\xf4\x80\xc4\x93\x8b\xe1\x31"
+ "\xfa\xfe\xf8\x82\xfc\x40\xde\xd4\xb4\x1c\x25\x1e\x3c\xb1\x72\x9e"
+ "\x00\x3d\x47\x4b\x7c\x41\x9e\x98\xda\xc0\xd6\x05\xbe\x3c\x7e\x98"
+ "\x90\x5f\x4d\xa4\x42\xed\xcc\x43\xdd\xfc\x71\x78\xe3\xcf\x49\x17"
+ "\x7f\x80\xf7\xbd\xf9\x73\x5a\x8d\x6b\x33\xc8\x9f\xfa\xc1\xf0\xa7"
+ "\xa6\x85\xf3\xc7\x21\xf2\x67\xe2\x0c\x22\xb7\x77\xe8\xe4\x9b\x93"
+ "\x49\xe4\xcc\xe3\x5a\xb2\x3f\xb6\x96\x00\xad\x35\x42\x5e\xc1\x0c"
+ "\xff\xfa\x51\x64\x91\xef\xfd\xe8\xff\x4c\xbc\xde\x8f\x06\xdb\x8f"
+ "\x7e\x5a\x7f\x69\xfd\x28\x32\xfe\x7a\x3f\xba\x52\xfd\x28\x32\xae"
+ "\x67\x3f\xea\xd6\xd5\x89\x09\x4b\x16\x2c\x5a\x8a\xc7\xf7\x9e\x5f"
+ "\x99\x94\xf0\x2a\xd7\xd8\x1e\x3a\x5b\xe3\x4c\x8b\x92\xa3\x4f\xb6"
+ "\x9a\xa2\x7a\xf2\xce\xd8\x7a\xb9\xf3\x84\x46\x41\x73\x03\x22\x84"
+ "\xdc\xc0\x0a\xf4\xad\x89\xfd\x6d\x13\xfa\xbd\x90\xfd\x7c\x5f\x5d"
+ "\x38\x8f\x63\x89\xff\x33\x7b\x25\x3c\xc6\x82\x6b\x24\x6b\x57\x11"
+ "\xc5\x5a\x3c\xc3\x6c\xc7\xb9\x08\xf6\xfc\x1e\xf4\x35\x48\xb7\xc4"
+ "\x58\xd0\x6f\x8d\x4d\x35\xc7\xba\x0e\xca\xb2\x06\x6f\x88\x54\x68"
+ "\xf1\x8c\xc3\x83\x95\xa0\x8f\x53\xbb\xfd\x10\xc9\x1e\xb2\xd2\x61"
+ "\x0f\xaa\xb1\x9f\xe3\x79\xb3\x33\xb2\x07\xcf\x5e\xcc\x24\xe8\x6f"
+ "\xc3\x3a\x67\x22\x7c\x67\x5c\x8c\x9e\xf9\x25\x80\x3e\xcf\x9f\x4f"
+ "\x7d\x1d\xbf\xdf\xa5\xca\xd1\xa2\x9d\x78\x4e\x55\x68\x38\x97\x5b"
+ "\x48\x3e\x49\x2d\x27\xda\xa7\xb0\xcf\xff\xdb\xb8\xc7\x8b\xa0\xcf"
+ "\xcf\xaa\x22\xb5\x9a\x3f\x93\x4f\x63\x01\x6b\xb1\x03\xf5\x79\x37"
+ "\x8c\x8d\xf7\xad\xcf\x4b\xd8\x42\x4c\x21\xb6\x10\x57\x23\x01\x57"
+ "\x88\x35\x09\x5b\xbf\xbf\xc0\xb1\x15\xda\x44\xd4\x6f\xb4\x03\xbe"
+ "\x1c\x1c\x5f\x78\x2e\xb8\x36\xe5\x90\xf7\xbe\x7f\xa1\x07\xb6\xe4"
+ "\x22\xb6\x56\x00\xb6\x56\xb8\xb0\xf5\xcc\x51\x35\x79\x93\x61\xeb"
+ "\x4e\x17\xb6\xb2\xdb\x2c\x12\xae\x10\x63\x88\x27\xe1\x45\x1d\xc1"
+ "\xfe\x2e\x61\xac\x64\x21\x5f\xe3\x64\x7d\x5f\x0e\x7d\xbf\xc3\x4d"
+ "\x87\x8e\xbb\x94\xbe\x3f\x95\xed\x7f\x42\x9e\x20\x7f\x90\x2f\xc8"
+ "\x8b\x7f\x45\x3e\xa0\x4f\x58\xda\xd1\x17\x2f\x26\x34\x0e\xc4\x0b"
+ "\xe4\x03\xf2\x83\xf1\x01\xf8\x21\xad\x37\xe3\xfa\x23\xf2\x04\x79"
+ "\x31\x39\x95\xc8\x91\x2f\x25\xd0\xdf\xb1\x8f\x03\x6d\xe7\x21\x5f"
+ "\x98\xdd\x9a\x19\xfc\xe2\x26\x3c\x33\x2b\xc6\xdb\xed\xc8\xfa\xb9"
+ "\xba\xb7\xcd\xfa\xf3\x09\xdd\x7e\x20\x65\x0f\x56\xf3\x31\x46\x0e"
+ "\xf7\xc1\x26\x7b\x78\xb9\xd8\x87\xeb\x71\xbc\xc7\xc6\x76\x4e\x18"
+ "\xdb\xa9\x60\x6c\x97\x0b\x63\xbb\x14\x0b\xf7\x17\x20\xfb\xf9\x2b"
+ "\x44\x3c\xbf\x4b\x83\x73\x94\x34\x6f\x8e\x1d\x69\xc6\xd6\x49\x83"
+ "\x0b\x66\xe1\xba\x0e\xcd\x83\x71\xe3\x7f\xc9\x09\xdc\x03\x6e\x9c"
+ "\x83\xc4\xcb\xcf\x0b\xc5\x75\xe0\xa9\x86\x55\xb8\x47\xe0\x61\xee"
+ "\x57\x51\xf6\xe0\x4a\x4c\x67\x6b\x68\x72\xa1\xd4\xb9\xd6\x73\x0d"
+ "\xcd\x7d\x8d\xf5\x9d\x34\xab\xb8\x7e\xf6\xf0\x23\x2c\x0f\x9e\xd3"
+ "\x00\x39\xf6\x76\x5a\xbd\xdc\xb5\x86\x76\x08\x9f\xff\xd2\x73\x0d"
+ "\xed\x61\x66\xef\x99\x65\x0f\x27\xe1\xbe\x11\xb8\x8f\xe0\xe9\x0f"
+ "\xa6\xb8\xa7\xbb\xd6\xa8\x79\xba\x20\x67\x71\x46\x70\x8c\xdd\xc6"
+ "\xc7\xd6\x0f\xe7\x4a\x63\x58\x2f\xf6\xcc\x20\xe4\xec\xb4\x28\x97"
+ "\x9c\x9d\xc6\xe7\x9a\x35\x1b\x35\xb5\xbd\xe4\xec\x97\xf0\xfc\xb1"
+ "\xed\x4f\xa2\x9c\xcd\xcd\xe1\x71\xe1\x65\x51\x63\x80\x26\x01\x18"
+ "\x2f\x12\xd3\xf1\xbc\x0e\xca\xdc\x2d\x4c\x06\x6f\x54\xae\x63\xeb"
+ "\xe4\x51\x91\x9e\xb2\xf7\xb1\xc5\x9e\xb2\x37\x6a\x49\xff\xb2\xf7"
+ "\xd1\x51\xfd\xcb\xde\xa8\xcd\xd7\x65\xaf\xbf\xb2\x17\xec\xae\x4b"
+ "\x92\xbd\x8f\x34\x5d\x97\xbd\x97\x4b\xf6\x3e\xd2\xe8\x26\x7b\x67"
+ "\x7b\xca\xde\xc7\x72\x7b\xcb\xde\xc7\x4a\x5d\xb2\x37\x6a\x9a\xa7"
+ "\xec\x9d\x76\xd6\x37\xd9\xfb\xd8\xe9\xcb\x2b\x7b\xa7\xa9\x3c\x65"
+ "\xef\xb4\x26\x51\x37\x7c\x33\x78\xd9\x3b\x6d\x77\xff\xb2\x77\xda"
+ "\x7e\x4f\xd9\x3b\xad\x88\xcb\xd8\x69\x56\x2e\x7b\xa7\xed\x10\x65"
+ "\xb2\xd9\x3d\xdd\x25\x7b\x79\x7a\x6f\xd9\x3b\x5d\x39\x80\xec\xd5"
+ "\x39\x05\x49\xf6\x36\x82\xec\x6d\x94\x0b\x2f\x7a\x93\xbd\x8f\x87"
+ "\xd5\xa2\xec\x4d\x44\xd9\xfb\x78\x58\xff\xb2\xf7\x97\xab\x51\xc6"
+ "\x32\xbf\x94\x7f\xa0\x2d\xcc\x2f\xe0\x1f\xa8\x05\xf1\xf8\x64\x2a"
+ "\xa4\x43\x1a\xfa\x4f\xc4\x7c\x22\xef\x45\x19\x3d\x7d\x77\xb7\x8c"
+ "\x86\x7c\xc2\x18\x97\x8c\x46\xf9\x8c\x72\x7a\xcb\x1f\xa8\xb9\xe4"
+ "\x0f\xb4\x09\xda\xd6\x22\xc9\xea\x3c\x48\xc3\x38\x3f\xe8\xbb\x07"
+ "\xf7\x0c\x02\x0d\x5a\xd6\xc2\xf7\x30\x7f\x47\xd6\x2f\x54\x9e\x32"
+ "\xfd\x97\x51\x9e\x32\xfd\x17\x8f\xf4\x2f\xd3\xff\xfd\x78\xff\x32"
+ "\xfd\x17\x4b\xae\xcb\xf4\xab\x25\xd3\xff\xbd\xfc\xba\x4c\x1f\x58"
+ "\xa6\xf7\xc5\x8b\x9e\x32\xfd\x1e\x51\xa6\x6f\xe9\x96\xe9\xff\xbe"
+ "\xc3\xbb\x4c\xff\x65\x5c\x6f\x99\xfe\xcb\x24\x97\x4c\xff\x85\xc6"
+ "\x53\xa6\x3f\xbe\xdf\x37\x99\xfe\xcb\xbd\x97\x57\xa6\xff\xd2\xec"
+ "\x29\xd3\x1f\x17\xf7\x87\x4d\x7f\xd6\x5d\xa6\x0b\x01\xbe\xc8\xf4"
+ "\xc7\x37\x4a\x32\x1d\x65\xe6\xdb\x42\xa3\x9b\x4c\x47\xd9\xf6\xf8"
+ "\xe6\xaa\xe4\x66\x37\x99\xfe\x38\x8f\x23\x2d\x7b\x7c\x9f\x93\xc9"
+ "\xf4\xc7\x33\x78\xfa\xf4\x79\xee\xe9\x2e\x99\xce\xd3\x9d\xee\x32"
+ "\xdd\x82\x32\xfd\xf1\xa6\x01\x64\x7a\x84\xef\x32\x7d\xd6\x54\x97"
+ "\x4c\x9f\x35\x55\x92\xe9\x28\xc7\x51\xa6\xa3\x0c\x46\xb9\xce\x7c"
+ "\x55\xb1\x7d\x0f\xd1\xdb\x42\xad\x44\x89\x3e\x72\x71\x0e\x03\x65"
+ "\x31\xfa\xe3\x41\xd9\xce\xf2\x2c\xe5\x79\x40\x3e\xb7\x80\x4c\xb6"
+ "\x80\x4c\xb6\xe4\x9d\x21\x0a\xc8\xd7\x98\x8f\x7b\xe8\xe0\x1e\x65"
+ "\x77\x68\x1b\xe8\x01\x07\xd3\x03\x8d\xa8\x3f\x38\xbd\xa2\xb7\x79"
+ "\xea\x82\x5f\x1d\xe8\xcb\x5e\x2f\x74\xd3\x05\x25\x37\xd1\x86\x8e"
+ "\xac\x5f\xb5\x49\xf2\x3d\x1f\xee\x51\x07\x14\xb6\x33\x1d\x60\x06"
+ "\x1d\xd0\xc2\x75\xc0\x4c\x75\x77\x1e\xa8\x03\xcb\xc3\xf5\x44\x23"
+ "\xe4\x69\x12\xf3\x4c\xf1\xd4\x13\xd1\x7a\x4f\x3d\x31\x73\x11\xea"
+ "\x09\xf4\xdb\xca\xe2\x9d\xe7\x6d\xd0\x39\xb7\xc4\xe8\x51\x67\xf0"
+ "\xe7\x4f\x06\x77\xeb\x89\x9b\xdc\xf4\x44\x8a\xa4\x27\x66\xbe\x7e"
+ "\xcd\xeb\x09\xc0\x72\x6d\xea\xbf\xa2\x9e\x78\xa2\xf1\x5a\xd0\x13"
+ "\xc8\x83\x91\x6e\x73\xab\xde\xf8\x80\xfe\x11\x6a\x17\xff\x50\xf4"
+ "\xc4\x13\x0d\xde\xf5\x44\xb4\xb1\xb7\x9e\x88\x2e\x76\xe9\x89\x99"
+ "\x51\x9e\x7a\x62\xd6\x69\xdf\xf4\x44\xf4\xc9\x9e\x7a\x02\x69\x96"
+ "\xcf\xf7\x04\xb4\xa1\x7e\x70\xe6\x15\xcc\x12\x50\x57\xf8\xa5\x27"
+ "\x66\x29\x3d\xf5\xc4\xac\x46\x51\x26\xdd\x37\x78\x3d\x31\x8b\xf9"
+ "\x47\xcc\x97\xf4\xc4\x85\x9e\x7a\x62\xd6\x5e\x4f\x3d\x31\x6b\x13"
+ "\xd7\x07\xb3\xda\xb8\x9e\x98\x55\xc6\xd3\x7f\x15\xe1\x9e\xee\xd2"
+ "\x13\x3c\xbd\xb7\x9e\x88\x51\x0c\xa0\x27\x54\x5d\xe1\x31\xfa\xae"
+ "\xdc\xc2\x59\x8e\xad\x31\xd6\x49\xb1\x0f\x3b\x7b\xf6\x01\x8e\x7d"
+ "\x27\xc1\xbe\xd0\xbd\xe6\xf3\x1c\x5f\x63\x10\xc4\x73\xb7\x9d\xe1"
+ "\x31\xb1\xad\x8b\xa1\x1f\xb4\x79\xef\x07\xd0\x07\x94\x52\x1f\xa8"
+ "\xd5\x1f\x27\xd0\x2f\xe4\xb8\x0e\xf4\x26\xe0\xdf\x64\x6b\x64\x72"
+ "\x49\xd5\x12\x45\xd0\x5f\x61\x70\x1b\x51\x07\xcb\x64\xc3\x70\x8d"
+ "\xc1\x09\x7d\x61\xfa\x44\x2a\xfc\xb8\x31\x8a\x04\xeb\x49\x08\xf6"
+ "\x87\xbf\x8a\x6b\x0d\xe8\x33\x01\xd7\x18\x00\x87\x11\xf3\x0f\xba"
+ "\xd6\x18\x3a\x7d\x58\x63\x30\xa5\x98\xd9\x1a\x03\x9e\x23\x12\xa0"
+ "\x0f\xb0\xb3\x2d\xb8\xc6\x60\x67\xeb\x32\x6a\x76\x9e\x84\xad\x31"
+ "\x34\x13\x5c\x5f\x90\x7c\xa2\xe0\xba\xc2\x8f\x63\x89\x1c\x7d\x2a"
+ "\xbc\x09\xf8\xdf\xaf\xab\x25\xd8\x07\x06\x2f\x8f\x9e\xf2\xba\xff"
+ "\x09\xf9\xe2\x00\x9a\x3a\x55\x85\xb3\xe8\x1b\x1b\xa3\xfe\xd2\x6c"
+ "\x97\xa1\x3f\x48\x27\xf0\x48\x00\xb9\x43\x95\x3d\xe4\x4e\x97\x48"
+ "\xef\x2e\x4e\x6f\xe0\x95\xf2\x39\x1b\xa1\x90\xce\xfd\x41\xda\xcd"
+ "\x80\x35\xdd\xe8\x2d\xab\x90\xb6\x11\x64\x8b\xe8\x13\x52\x78\x4d"
+ "\x1f\x24\x00\x3d\xf1\xfc\xc0\xdb\x17\xec\x81\x4e\x65\xab\x25\xb7"
+ "\x93\x4c\x02\x19\x13\x8c\x32\x06\xf0\x39\xe2\xad\x4e\xa0\xed\x37"
+ "\x9c\xb6\xe8\xd3\x0b\x7f\x1d\xaf\xe9\xb4\x50\xf6\xed\x5d\x5d\x40"
+ "\x5f\x3b\xa7\xef\x73\xaf\xa8\x49\x89\xb4\xc6\x06\xfa\xb9\x0e\x78"
+ "\x8a\x32\xe6\x49\x5b\x28\xc5\x78\x0f\xce\x2e\x5d\xb8\x70\x02\xe8"
+ "\x6b\x83\x3e\xd5\xa5\x43\xfe\xab\x4b\x5a\x71\x4d\xf0\x4b\xbe\xc6"
+ "\x16\x24\xfa\xaa\x78\x0d\xe4\xfd\x22\x2d\x31\x95\x81\xbc\x1d\x16"
+ "\xa3\xe9\xda\x12\x13\x4b\x65\x20\xef\x53\x07\x4b\xdf\x5f\x57\x5f"
+ "\x1d\xfa\x6a\x7f\x40\xf4\x7d\xaa\xdc\x7f\xfa\xce\xd1\x5d\x1d\xfa"
+ "\xaa\x7f\x40\xf4\x9d\xad\xf6\x9f\xbe\x73\xbd\xee\x7f\x46\xfa\xa2"
+ "\x7d\x2f\xd9\xf6\x92\x5d\x8f\xba\x85\xeb\xc6\xa7\x89\xcb\xa6\x7f"
+ "\x9a\x48\x6b\x91\x40\x1b\x45\x9e\x38\x47\x63\x58\x48\x6e\x3d\x25"
+ "\x8b\x5d\x2e\xad\x43\xa2\x4d\xcd\x78\xf5\x06\xf0\x6a\x29\x9e\x13"
+ "\x11\xf9\x04\x7a\x60\xbe\x0d\x64\xf5\xb8\x18\xbd\x33\x0f\xf4\xc4"
+ "\xb6\x18\xab\x17\x9e\xc9\x51\xc6\x07\x27\x11\xf5\x73\x06\xce\x3b"
+ "\xe1\x35\xe0\x59\x27\xd8\x37\x76\x0b\xc1\x73\x9f\xa1\x16\x90\xab"
+ "\x5d\xfa\xa0\x79\x60\x2f\x4b\x7c\xfb\x6b\xb2\x9d\xd9\x36\x7d\xf2"
+ "\x6d\xb3\x27\xdf\xce\xf5\xc1\x37\xd7\xda\x3e\xd8\x99\x8c\x6f\x66"
+ "\xc6\x37\x26\xd7\x5f\x03\xdb\x06\xf8\x27\xf1\x8d\xc9\x75\xe0\x1d"
+ "\xe3\x5b\x5b\x33\x71\xba\xc9\x75\xb4\x6b\x90\x77\x35\x71\x60\x5f"
+ "\x66\xcd\x31\x30\xbe\xa1\x9d\x19\x37\x58\xbe\xc5\xf6\xb0\x67\x9e"
+ "\x7e\xdb\x37\x7b\x26\x76\x37\xda\x2c\xee\xf6\x0c\xde\x9f\x83\x31"
+ "\xaf\x33\xb8\x60\xb6\xcd\x2f\x1b\x26\xb6\xc6\xd3\x86\x79\xba\x88"
+ "\xd7\xe9\x37\x81\x83\xb7\x61\x9e\x66\xeb\x4d\x6f\xbf\xc1\xc7\x92"
+ "\x9e\xf6\xcb\xd3\x6b\x3c\xed\x97\xa7\x67\x73\x3b\xe5\xe9\x1d\xe7"
+ "\x32\xd1\x7e\x79\x5a\xcf\xd3\x7f\xa3\x70\x4f\x77\xd9\x2f\x3c\xfd"
+ "\x1c\xfa\x06\xcb\x7a\xba\x62\x70\x36\xcb\xbd\x57\xd9\x66\x89\xe8"
+ "\xc7\x66\x89\xf8\x17\xb3\x59\x9e\xe9\x2f\x86\xcc\x75\x9d\xca\x64"
+ "\xfe\xd3\x35\xfe\xcb\xfc\x79\x5e\x63\x65\x5c\xd7\xa9\x12\x7d\x9f"
+ "\x89\xf7\x9f\xbe\xcf\x7a\x8d\x7f\x3a\xb0\x4e\x8d\x9b\xed\xd2\xa9"
+ "\x71\xb3\xbd\xeb\xd4\xf9\x07\xae\xeb\xd4\xbe\x74\xea\xbc\x7d\xfe"
+ "\xeb\xd4\xf9\x9b\x3c\x75\xea\x02\x99\x6f\x3a\x35\x6e\xd4\xd0\xeb"
+ "\xd4\x38\xad\xa7\x4e\x8d\x6b\xe3\x75\x7a\xee\xe9\xc1\xeb\xd4\xb8"
+ "\x5a\xef\x3a\x35\xee\xb0\xa7\x4e\x8d\x2b\xe3\xba\x73\x01\xe1\x3a"
+ "\x35\xae\x92\xa7\x3f\x17\xeb\x9e\xee\xd2\xa9\x3c\x9d\xeb\xd4\x05"
+ "\xaa\xc1\xe9\xd4\x5b\xaf\xb2\x4e\xd5\xf6\xa3\x53\xb5\xff\x62\x3a"
+ "\xf5\x79\xc3\x75\x99\x3f\x90\xcc\x5f\xa0\xf5\x5f\xe6\xbf\xe0\xd5"
+ "\xff\xdd\xc0\x32\x7f\xe1\x0c\x97\xcc\x5f\x38\xc3\xbb\xcc\x4f\xd8"
+ "\x7d\x5d\xe6\xf7\x25\xf3\x9f\xaf\xf0\x5f\xe6\x27\x18\x3d\x65\xfe"
+ "\xc2\xf3\xbe\xc9\xfc\x85\x81\x43\x2f\xf3\x17\x86\x79\xca\xfc\x85"
+ "\x66\x5e\xa7\xf8\x27\x06\x2f\xf3\x17\xee\xf5\x2e\xf3\x17\x1e\xf0"
+ "\x94\xf9\x0b\x8b\xb9\x6c\x5f\x68\xe3\x32\x7f\x61\x39\x4f\x8f\x9f"
+ "\xe9\x9e\xee\x92\xf9\x3c\x9d\xcb\xfc\x17\xc9\xe0\x64\x7e\xe8\x55"
+ "\x96\xf9\xea\x7e\x64\xbe\xfa\x5f\x4c\xe6\xeb\xbd\x9e\xff\x1c\x58"
+ "\x26\xbd\xd4\xe4\x92\x49\x2f\x35\x79\x97\x49\x2f\xc5\x5c\x97\x49"
+ "\x7d\xc9\xa4\x17\xc3\xfc\x97\x49\x2f\x85\x7b\xca\xa4\x97\xb3\x7d"
+ "\x93\x49\x2f\x6d\x1e\x7a\x99\xf4\x52\x99\xa7\x4c\x7a\x39\x89\xd7"
+ "\x49\xff\xcd\xe0\x65\xd2\xcb\x73\xbc\xcb\xa4\x97\x9f\xf5\x94\x49"
+ "\x2f\x8b\x6b\x50\x2f\x1b\xb9\x4c\x7a\x79\x1a\x4f\xd7\x9b\xdd\xd3"
+ "\x5d\x32\x89\xa7\x73\x99\xf4\xf2\xa6\x81\x64\x12\x62\xbf\x56\xd3"
+ "\x03\xfb\x2f\x4b\xd8\x5f\xd2\xf6\x69\xb1\x84\xfd\x25\x6d\x6c\xbf"
+ "\x5b\x71\x8c\x65\x43\x32\x51\xe4\x62\x9c\x0b\xe8\xef\x86\xff\x40"
+ "\xec\x2f\x59\x80\xfb\x16\x54\x4d\x20\xc3\x5a\x44\x99\x96\x02\x32"
+ "\xad\x05\xee\xd1\x0f\xd4\xb8\x18\x0b\xca\x22\x5c\xff\xc7\x7b\x2e"
+ "\xdb\xac\x81\x78\x5e\x72\x50\x67\x99\x5a\xc4\xb3\x4c\xf1\xbd\xcf"
+ "\x32\x15\xbb\x9d\x99\xc1\xbe\x11\xbc\x46\x16\x82\xeb\xba\x20\xdf"
+ "\x44\x39\x56\x1d\xe8\x50\x8a\x72\xec\x02\xc8\xb1\x0b\xae\x3e\x81"
+ "\x72\xec\x1c\xc8\x31\xdb\x0a\xdd\x78\x94\x65\xbd\xcf\x31\xf1\x75"
+ "\x5c\x26\xc7\xb2\x7b\xc8\xb1\x17\x7b\xc8\xb1\x85\x20\xc7\xe2\x40"
+ "\x8e\x05\xb9\xfa\xc3\x1d\x4d\x44\x3e\x73\x01\xf4\x09\x90\x63\xbf"
+ "\xbf\x80\x72\x6c\xbf\x9f\x72\x6c\xc9\x24\xcf\xfe\xb0\x74\xb3\x6f"
+ "\xfd\x61\xc9\x76\x6f\xfd\xa1\x2b\xcf\xdf\xfe\xb0\xa4\xc2\xb3\x3f"
+ "\x2c\x5d\x27\xf6\xd1\xa3\x83\xef\x0f\x4b\x13\xba\xfb\xc3\xcb\x3d"
+ "\xfb\xc3\xd2\x25\x9e\xfd\x61\x69\x14\xc7\xfd\xd2\x22\xde\x1f\x96"
+ "\xce\x16\xfb\x49\x93\x7b\xba\xab\x3f\xf0\x74\xde\x1f\x96\x6e\xbd"
+ "\xbe\x3e\x7b\xad\xea\x68\x83\xf2\xfa\xfa\xec\x40\xe3\xb2\xa5\x15"
+ "\xfe\x8f\xcb\x5e\xb9\x4a\xeb\xdf\x3f\xa4\xb9\x64\xc3\x2c\xff\xe9"
+ "\x9b\x78\x95\xd6\xbf\x7f\x48\xf3\x0a\xaf\x5c\xc2\xfa\x77\x52\xbf"
+ "\xeb\xdf\xfd\xdb\x31\xc9\x15\x35\xdd\x36\x7c\x72\x85\xb4\xe7\xb2"
+ "\xb7\x0d\x9f\x7c\x8f\xe7\xf9\xa5\xa4\x23\x3d\xf7\x43\x0e\x64\xdb"
+ "\x3b\xfe\x57\xd9\xf6\xaf\xaa\xfd\xb7\xed\x97\xdb\x3d\x6d\x99\x15"
+ "\x09\xbe\xd9\x32\xc9\xcb\xbd\xd9\x32\x0e\xbf\x6d\xfb\xe4\x75\x9e"
+ "\xb6\xcc\x8a\x59\x22\xff\xb7\x0d\xde\x96\x59\x71\x9f\x77\x5b\x66"
+ "\xc5\xcf\x3c\x6d\x99\x15\x2a\x6e\xb3\xac\x88\xe7\xb6\xcc\x0a\x2d"
+ "\x4f\x4f\xda\xea\x9e\xee\xb2\x65\x78\x3a\xb7\x65\x56\x18\xae\xaf"
+ "\xdb\x5e\xab\xb6\x4c\x4a\xc3\x75\x5d\x3b\x90\x2e\x58\xb1\xce\x7f"
+ "\x5d\xb0\x6a\xca\x75\x5d\x3b\x10\x7d\x57\x86\xfb\x4f\xdf\xd7\x36"
+ "\xf9\xaf\x6b\xd3\x26\xb8\x74\x6d\xda\x04\xef\xba\x76\xf5\x66\x4f"
+ "\x5d\x9b\x3a\xfd\xba\xae\xed\x4f\xd7\xae\x4a\xf5\x5f\xd7\xae\x8e"
+ "\xf7\xd4\xb5\x69\x07\x7d\xd3\xb5\xab\xbf\x19\x7a\x5d\xbb\xda\xea"
+ "\xa9\x6b\xd3\x2a\x45\xfe\x8f\x1a\xbc\xae\x4d\xdb\xe2\x5d\xd7\xa6"
+ "\x6d\xf3\xd4\xb5\x69\xe2\x19\xfa\xb4\x7a\xae\x6b\xd3\x72\x79\x7a"
+ "\xaa\xda\x3d\xdd\xa5\x6b\x79\x3a\xd7\xb5\x69\x03\x9d\xff\xb9\xbe"
+ "\x9e\x7b\xd5\x74\x6d\x46\xd4\x75\x5d\x30\x90\x2e\x48\xb3\xfa\xaf"
+ "\x0b\xd6\x94\xfa\xaf\x0b\xd6\x45\xb8\x74\xc1\xba\x08\xef\xba\x60"
+ "\xed\x36\x4f\x5d\x90\x19\x73\x5d\x17\xf4\xa7\x0b\x32\x8c\xfe\xeb"
+ "\x82\xb5\x06\x4f\x5d\xb0\xee\xa8\x6f\xba\x60\xed\xe9\xa1\xd7\x05"
+ "\x6b\x1d\x9e\xba\x60\x5d\xb5\xc8\xff\x71\x83\xd7\x05\xeb\xb6\x7b"
+ "\xd7\x05\xeb\xfe\xe6\xa9\x0b\xd6\xad\xe3\x32\x7f\x5d\x13\xd7\x05"
+ "\xeb\x8a\x78\x7a\x66\xb8\x7b\xba\x4b\x17\xf0\x74\xae\x0b\xd6\x59"
+ "\xae\xaf\xf3\x5e\xab\xba\x20\x6b\xa6\xff\xb2\xca\xd8\xe4\x92\x55"
+ "\xc6\x26\xef\xb2\xca\x18\xe3\x29\xab\xb2\x9c\xd7\x65\x55\x7f\xb2"
+ "\x6a\x9d\xc3\x7f\x59\x65\xec\xb1\xfe\x9b\xed\xe3\xfa\xaf\xd1\xeb"
+ "\xfa\xaf\xff\xb2\xca\xd8\x63\xfd\x37\x5b\x5c\xff\xcd\x3a\x30\x78"
+ "\x59\x95\x3d\xc7\xbb\xac\xca\xee\xb1\xfe\x9b\x2d\xae\xff\x66\x8b"
+ "\xeb\xbf\xd9\xe2\xfa\x6f\x56\xb5\x7b\xba\x4b\x56\xf1\x74\x2e\xab"
+ "\xb2\x2f\x71\xfd\x37\x57\xe1\x5a\xff\xcd\x65\x67\x06\x84\xa2\x8d"
+ "\x9a\xde\xeb\xbf\x1b\x56\xe2\xfa\xaf\xab\x4f\xe4\xdc\xc8\xd6\x82"
+ "\xb1\x5f\xd8\xb8\x5f\x91\x3e\xd7\x85\xc7\x6c\xd4\x5c\x5f\x17\x1e"
+ "\x8a\x75\xe1\x0d\x3d\xfc\xf9\xe4\xfe\xcd\xb7\x7e\xb2\x61\xef\xd0"
+ "\xaf\x0b\x6f\xa8\xf7\xec\x27\xb9\xc5\x62\xdf\xf5\x63\x5d\x38\x77"
+ "\xb5\xf7\x7e\x92\xfb\x5b\xcf\x7e\x92\x2b\xee\xcb\xcd\x2d\xe7\xfd"
+ "\x24\x77\xb1\xd8\x7f\x9a\xdc\xd3\x5d\xfd\x24\xdb\x6d\x5d\x38\xb7"
+ "\xd2\x17\x9d\xee\x50\x15\xce\x46\x1d\x3d\xa9\xf1\x61\x67\x37\x9e"
+ "\x93\x44\x3c\xf7\xa5\xd3\x9f\xe7\xb2\x1f\x71\xdc\xb5\x35\xc6\x36"
+ "\xa0\x4e\x6f\x11\x75\x7a\x7c\x6f\x9d\x2e\xe9\x73\xc4\xf3\x9b\x3e"
+ "\xad\x09\xf7\xc0\xf5\xa0\xf4\xf9\x5d\xf5\x97\x82\x6b\xc4\xb4\xa7"
+ "\x3e\xf7\x17\xd7\xf9\x57\xe9\xfc\xcb\x0f\x69\x4d\x38\xb7\xde\xff"
+ "\xb1\x5d\xc1\x55\x3a\xff\xf2\x43\x9a\xa7\xce\xbf\x84\xf3\x2f\x85"
+ "\xfd\x9e\x7f\xb9\x3e\x37\x81\xf4\x2d\xd8\xe7\x3f\x7d\x7f\xe7\x35"
+ "\xfe\xeb\xc0\xb6\xcd\xa6\x36\x97\xbd\xbf\xa9\x4d\xb2\x6d\x24\x7f"
+ "\x69\x20\x33\x15\x79\x89\x70\x5d\x20\x64\x43\x22\xf3\xf5\xad\x34"
+ "\xb5\x1c\x26\x86\x34\xb4\x77\x36\x2d\x88\x4e\x71\xb7\x77\x7e\x2f"
+ "\x93\x6c\x9d\x68\xb4\x83\xc0\xae\x41\x9b\x46\xb2\xf1\xd1\x37\x4e"
+ "\xbf\xfb\x41\xef\x8c\xb1\xe1\x98\xa0\x2b\xb8\x70\xf6\xbf\xfe\x78"
+ "\x60\xe3\x04\xff\xc7\x03\x9b\x7a\xec\x7f\x7b\xdd\xc7\xfd\x6f\x9b"
+ "\xbc\xee\x7f\xf3\x7f\x3c\xb0\xa9\xc7\xfe\xb7\xd7\xc5\xfd\x6f\xbf"
+ "\x7b\x6f\xf0\x76\xce\xeb\xfd\xec\x7f\x7b\xbd\xc7\xfe\xb7\xd7\xc5"
+ "\xfd\x6f\xaf\x8b\xfb\xdf\x5e\x17\xf7\xbf\xfd\xae\xc2\x3d\xdd\x65"
+ "\xe7\xf0\x74\x6e\xe7\xbc\xee\xd3\xfe\x37\xb0\x73\x62\x2f\xc1\xce"
+ "\xb1\xff\x70\xec\x1c\xdd\x35\x62\xe7\xfc\xa7\xd7\xf8\x87\x6e\x7a"
+ "\x62\x76\x0f\x3d\x61\xfb\xdf\xa5\x27\x5e\xbf\x84\xbd\x6f\x45\xfd"
+ "\xee\xff\x67\xf4\xcd\x75\xa3\x2f\xca\x68\x91\xb6\xce\x09\x31\x36"
+ "\xbf\xe8\x0b\xb2\x79\x4b\xda\x0f\x85\xb6\xff\x39\xd3\x7f\xda\x6e"
+ "\xae\xba\x6e\xe3\x0c\x44\xdf\xa2\x1d\xfe\xd3\xf7\x4d\xad\xff\x36"
+ "\xce\x16\xeb\xa7\xdd\x36\xce\x16\x6b\x4f\x1b\x07\x6d\x9a\x27\xec"
+ "\xdc\xd6\xd9\x00\x36\x4a\xce\x52\xb0\x77\x92\x09\x31\xb5\xec\x26"
+ "\xb9\x60\xf3\xe4\x9c\x01\xbb\x67\x31\xd8\x3d\x8e\x6d\xa2\xdd\xb3"
+ "\x25\xc1\xd3\xee\x79\xf3\x62\x9f\x76\x4f\xb0\xcb\xee\x71\x80\x4d"
+ "\xd3\xb5\x2d\xc6\x56\x78\xc6\xcd\x06\x7a\xa9\xb7\x0d\xd4\x99\x07"
+ "\x3a\xe7\xce\x18\x7b\x17\xd8\x41\xfd\xd9\x40\x8c\xf7\x3d\xec\xa0"
+ "\x1f\x9e\x0d\xf4\x86\xd2\x7f\x1b\x68\x4b\x84\xa7\x0d\x54\xb2\xc5"
+ "\x37\x1b\x68\xcb\xdb\x5e\xe7\x7a\xfc\xb6\x81\xb6\x54\x7a\xda\x40"
+ "\x25\x46\x11\x17\x5b\x06\x6f\x03\x95\x2c\xf2\x6e\x03\x95\xbc\xe2"
+ "\x69\x03\x95\x4c\xe3\xb6\x4e\x49\x31\xb7\x81\x4a\x62\x79\xfa\x9b"
+ "\xc5\xee\xe9\x2e\x1b\x88\xa7\x73\x1b\xa8\xa4\xcc\xc7\xf5\x9b\xd9"
+ "\x0e\xd0\xb1\x57\x7f\xdf\x5c\x7f\xeb\x37\x43\xb5\x6f\xee\xae\x6b"
+ "\x64\xfd\xa6\xb4\xdf\xf8\x87\xd7\xf5\x74\x49\xa5\xff\x7a\xe4\x8f"
+ "\x57\x69\xff\xff\x0f\x49\x4f\x97\xce\xf6\x9f\xbe\xff\xd5\xef\xfe"
+ "\xff\xfe\xf5\xf4\xb6\x14\xd7\x5c\xc4\xb6\x94\xc1\xcd\x45\x6c\x3d"
+ "\xed\xa9\x93\xff\x3b\xef\xfa\x5c\x84\xaf\x7a\xf8\x8f\xe5\xfe\xeb"
+ "\xe1\xad\x15\x9e\x7a\xf8\x4f\x77\xfa\xa6\x87\xb7\x3d\x30\xf4\x73"
+ "\x11\xdb\xa6\x79\xea\xe1\x3f\x49\x58\x98\x3e\x78\x3d\xbc\xed\xac"
+ "\x77\x3d\xbc\xed\xa2\xa7\x1e\xde\x56\xc3\xf5\xed\x9f\x26\x70\x3d"
+ "\xbc\xcd\xcc\xd3\xff\x7b\x9a\x7b\xba\x4b\x0f\xf3\x74\xae\x87\xff"
+ "\x14\x31\xb8\x35\x97\x5b\xaf\xd1\x35\x17\xed\xbf\xd8\x9a\xcb\xff"
+ "\x2d\xbc\xae\x27\x06\xd2\x13\x7f\x9a\xe6\xbf\x9e\x28\xb3\xfa\xaf"
+ "\x27\xfe\x52\xea\xd2\x13\x7f\x29\x1d\x9c\x9e\xf8\xcb\x8d\x9e\x7a"
+ "\x62\xfb\xbb\xd7\xf5\x84\xaf\x7a\xe2\xff\x36\xfa\xaf\x27\xfe\x6c"
+ "\xf6\xd4\x13\x3b\x9e\xf0\x4d\x4f\xfc\xe5\xd9\xa1\xd7\x13\x7f\x59"
+ "\xec\xa9\x27\x76\x44\x8a\x58\x58\x32\x78\x3d\xb1\x63\x8c\x77\x3d"
+ "\xb1\xe3\x36\x4f\x3d\xf1\x17\x1b\xd7\x07\x3b\x66\x72\x3d\xb1\x43"
+ "\x4c\xdf\xbe\xd8\x3d\xdd\xa5\x27\x78\x3a\xd7\x13\x3b\x62\xaf\xef"
+ "\xb7\xbb\x56\xf7\xdb\xbd\x5d\xe9\xbf\x2c\x2b\x9f\xe9\x92\x65\xe5"
+ "\x33\xbd\xef\xb7\x7b\x67\xaf\xe7\x7e\xbb\xbf\x2e\xb9\xbe\xdf\xae"
+ "\x3f\x59\xb5\x63\xb1\xff\xb2\xea\x9d\x5c\x4f\x59\x55\x7e\xd1\x37"
+ "\x59\x55\x1e\x34\xf4\xb2\xaa\x5c\xe3\x29\xab\xca\x5b\x44\xfe\xff"
+ "\x6c\xf0\xb2\xaa\x7c\xbf\x77\x59\x55\x5e\xeb\x29\xab\xca\x4b\xb9"
+ "\x4c\x2a\xb7\x73\x59\x55\xbe\x93\xa7\xff\x35\xd2\x3d\xdd\x25\xab"
+ "\x78\x3a\x97\x55\x7f\xf3\xc9\xff\xbf\x6b\x7d\xcd\x2f\x9b\xf6\x0a"
+ "\xac\xaf\x0d\x95\x4d\x7b\xad\xac\xaf\xfd\xcf\xf5\xf5\x9f\x7e\xed"
+ "\xd9\xbf\x5d\x82\xdf\xff\xff\xd7\xef\xfa\x4f\xff\x3a\x60\x97\xd1"
+ "\xa5\x03\x76\x19\xbd\xad\x4f\xe4\x00\x86\x72\xc1\x1e\xcd\x3e\x43"
+ "\x14\x1b\x70\x7d\xa2\xa1\x96\xe4\xe1\xfa\xc4\x52\x69\x7d\x62\x8b"
+ "\x68\xe3\xbe\xeb\xf4\xb4\x71\x77\x6e\xee\xcb\xc6\x45\xdb\xd6\x09"
+ "\x76\xab\xa3\xe7\xba\xc4\x7f\xf4\xad\x3b\x3a\x83\x0b\x63\x2f\x6e"
+ "\x8b\xb1\x0f\x46\x77\xbc\xb9\x8a\xeb\x8e\x37\x7e\x50\xba\xe3\x7f"
+ "\x76\xf8\xaf\x3b\xde\xed\x11\xcf\xf7\xef\x0f\xf8\xa6\x3b\x76\x4d"
+ "\x1f\x7a\xdd\xb1\x6b\xb6\xa7\xee\xf8\xbb\x56\xc4\xc3\x43\x83\xd7"
+ "\x1d\x7f\x97\x79\xd7\x1d\x7f\x0f\xf2\xd4\x1d\xbb\xc4\xbd\xa6\x7f"
+ "\x9f\xc2\x75\xc7\x2e\x2b\x4f\xdf\x39\xd5\x3d\xdd\xa5\x3b\x78\x3a"
+ "\xd7\x1d\x7f\x8f\x1a\xdc\x7c\x48\xe8\x35\x3a\x1f\xa2\xfe\x17\x9b"
+ "\x0f\xa9\xb8\x84\xf3\x6f\xef\xcf\xa8\xe9\xde\x3f\xff\xfe\x8c\x5e"
+ "\xe3\xf5\x64\xb0\x75\xdb\xf9\x9a\x6b\xf7\x78\xdd\x7c\x54\x94\x65"
+ "\xff\xd8\xed\x29\xcb\xde\x4b\xf0\x26\xcb\xfa\x5b\x57\xc5\xf1\xb9"
+ "\x13\xe4\x9c\x63\x8b\x9f\xeb\xaa\xc9\x3f\x24\xf9\xf5\xf7\xd9\xfe"
+ "\xcb\xaf\x7f\xf4\xf0\x7f\xfa\xbe\x8f\xfe\x4f\xdf\xf7\xea\xff\xd4"
+ "\xe1\xf7\x1e\xfa\xf7\x7b\xf8\x3f\x7d\x5f\xf4\x7f\xfa\x9e\x1f\xe7"
+ "\xe2\xde\xdf\xeb\x5d\x7e\xbd\xdf\xc3\xff\xe9\xfb\xe2\xfa\xe9\xfb"
+ "\xa2\xff\xd3\xf7\x45\xff\xa7\xef\x85\xbb\xa7\xbb\xe4\xd7\x7b\x6e"
+ "\xe7\xe2\x2a\xfb\xf5\x7f\x4a\x73\xe7\xc6\x16\xca\x85\x72\xb8\x2a"
+ "\xa0\x8e\x63\x00\x03\x55\xf0\x7f\x35\xf0\x71\x14\xfc\xef\xd5\x67"
+ "\xb0\x35\x78\x6e\xac\x90\x09\x75\x96\x13\x99\xc9\xfa\x7d\x55\xd5"
+ "\x58\x07\x7c\xb7\x32\x83\xf3\x6a\x6e\x6c\xa8\x63\xf8\x0c\x81\xea"
+ "\x09\xf0\x25\x96\xc5\x57\x83\xfc\x21\x80\x19\x6d\x32\x09\x39\x23"
+ "\xab\x2c\x95\xf2\x41\x7d\x43\x9a\x65\x95\xcf\x62\x19\x50\xd7\x1d"
+ "\x66\x59\xa5\xca\x6b\x5d\xa1\xac\xe8\xed\xe3\xc9\x6a\x07\x3d\x51"
+ "\xb5\xb4\x9d\xb4\xc8\x2a\xcf\x87\xb6\x0d\x9f\x41\xd3\x63\x09\xda"
+ "\x58\xe5\x63\xad\x0a\x2c\x13\x63\x2f\xc2\xb3\x46\x7c\xe6\x84\x3a"
+ "\xa6\x2d\x21\xf2\xfc\xf6\xe1\x4a\x90\x05\x81\xe9\x36\x6a\x59\xe6"
+ "\x80\x3a\xa7\x38\xc8\x9e\xf1\x8d\x8a\x77\xde\x80\x34\x27\xd1\x60"
+ "\x7c\x3b\x2c\x03\x6c\x4c\xac\xcf\xc5\x12\xc8\xdf\x57\x1d\x7e\xfb"
+ "\x57\x32\x29\x70\x22\x35\x0f\x0e\x37\xbb\xbd\x9e\x7f\x0b\x5d\x33"
+ "\x9e\x54\xdd\x0d\xb4\xd3\x12\x79\x5f\xcf\x07\xf9\x9d\x9d\xfd\xc8"
+ "\x44\x25\xc6\xc1\x4c\xdf\x4c\xe4\x05\xc2\x70\xe5\x47\xa9\x2c\x56"
+ "\xa5\xb5\x23\xeb\x03\xad\x59\x36\xb1\x1a\x69\x8e\x31\xd3\x30\xf6"
+ "\x2f\xe0\x86\x40\x7a\xe4\xde\x14\x42\x7a\xf2\x22\x31\x7e\xc9\x02"
+ "\x6d\xd2\xa2\x25\x09\xcb\x96\x27\x69\xef\x8c\x1f\x41\x66\x2f\x5b"
+ "\xa6\x5d\xb2\x60\xe9\x4a\xad\xfb\x93\x07\xb5\xf1\x8b\x5e\x5d\xf0"
+ "\xfc\xe2\x84\x7b\x96\xbc\x60\x18\x01\x75\x22\x6e\xf5\x08\xc3\xba"
+ "\x08\x59\x1f\x4c\x2b\xf9\x1d\x21\xbf\x1f\x4d\x14\x58\x2f\xf8\x5e"
+ "\x99\x14\x1f\x0f\xe3\xc3\xc9\x21\x4f\x3a\xc8\xc0\x82\xb4\xe1\x90"
+ "\x77\xf7\xce\xb7\xa0\x5e\x25\x50\x6f\xa8\x23\xd6\xb9\x41\xaa\xb3"
+ "\x84\x89\x74\xc4\x44\x5a\x3b\x60\xf0\x83\xf3\xa1\xf6\xe1\xff\x4e"
+ "\x69\x2c\xb6\xcf\x06\xfd\x44\xd6\x2a\xdb\x33\x1d\xf5\x12\xcd\x9b"
+ "\x1b\xdb\x91\xb5\x47\x2d\x61\x0c\xdf\xa5\xf9\x73\xb5\x1d\xd8\x4f"
+ "\xa8\xfe\xe7\xbc\x4f\xed\xb1\xcc\xd1\xc9\x08\x8f\xcf\xb7\x67\xaa"
+ "\x2b\x3e\xdf\x1e\x0b\xd2\x16\xea\xd1\x06\xe9\xb3\xcd\xa4\xab\x1e"
+ "\xd3\x31\x4e\x24\xc6\xd9\xc3\x3a\x43\xbb\x40\x2f\xd2\x2a\x9a\x29"
+ "\x62\xdf\xb8\x2d\x52\x30\x7e\x58\x6e\x52\x5c\x20\xd1\x0e\xda\x45"
+ "\xb3\xb7\x45\xd6\xd9\x6c\x24\x74\x8d\xe1\x05\x3a\xec\x83\x39\xa1"
+ "\x8e\x45\x09\x18\x1f\x50\xc8\xfe\xb0\x9c\x66\x57\x26\xcd\x99\x48"
+ "\xd4\x50\x76\xb9\x5b\x9c\x40\xc5\xe0\xf8\xbf\x87\xf1\x1f\xf9\x88"
+ "\xf1\xff\x38\x1f\xab\xc8\xde\xa4\xde\x7c\xec\xc6\xdf\x76\x81\xec"
+ "\x07\x2c\x50\x55\x56\x69\xb4\x93\xd3\x11\xfb\xee\xb9\x74\x3d\xb9"
+ "\x97\xd1\xae\xaa\x42\xc8\xcf\xca\x10\x72\xb3\x2a\x68\x6e\xd6\x56"
+ "\xa0\x59\x64\x7e\x32\xd1\xce\x77\xaa\x49\xde\x05\x12\x61\xcd\xcb"
+ "\x2a\x0d\x96\x65\xc8\xc0\xb6\x90\x83\xde\x88\x00\x99\x11\x21\xf6"
+ "\xf7\x48\xa4\xe3\xc7\x6d\x84\x3c\xf9\x2a\x21\x27\xa6\x92\x80\x12"
+ "\x78\x6f\x70\xed\xa9\xe2\xfe\x9f\xb2\xaa\xa6\xbe\x05\xef\x62\x9c"
+ "\xc7\x41\xbe\xbf\xcf\x6b\xbf\xeb\x6e\xf7\x7a\x6d\xdf\xed\xde\x5b"
+ "\x2e\xe4\xaf\x87\xf1\xe6\xfa\x48\x9a\xbb\x7e\x42\xef\x76\xaf\xd7"
+ "\xf2\x76\x07\xb6\x0f\x7d\xbb\xf7\xa6\xf2\x76\xef\x9d\xe2\x5f\xbb"
+ "\xf7\x7a\x9d\xff\x73\x6b\xb7\x17\x7e\x7f\x58\x06\xed\x06\x7e\xaf"
+ "\x07\x7e\xaf\xef\x83\xdf\xeb\x45\x7e\x8f\x6c\x1e\xfa\x76\x7f\x98"
+ "\xc4\xdb\xfd\xe1\x24\xff\xda\xfd\xa1\x57\xf9\xe7\x6a\xb7\xd1\x0b"
+ "\xbf\x3f\x2a\x15\xf2\x8d\xc0\x6f\x23\xf0\xdb\xd8\x07\xbf\x8d\x22"
+ "\xbf\x47\x1d\x1a\xfa\x76\x7f\xc4\xe7\xff\xb3\x3e\x9a\xe0\x5f\xbb"
+ "\x3f\xda\xe1\x43\xbb\xbd\xf0\x7b\x5f\x11\xb4\x1b\xf8\x6d\x04\x7e"
+ "\x1b\xfb\xe0\xb7\x51\xe4\xf7\x4f\x73\x86\xbe\xdd\xfb\xb8\xff\x9b"
+ "\xac\x7d\xe1\xfe\xb5\x7b\xdf\xd6\x81\xdb\x9d\xed\x85\xdf\xfb\x0b"
+ "\x85\xfc\x6c\xe0\x77\x36\xf0\x3b\xbb\x0f\x7e\x67\x8b\xfc\x7e\xe6"
+ "\xd1\xa1\x6f\xf7\xfe\x79\xbc\xdd\xfb\xc3\xfc\x6b\xf7\xfe\xe2\x81"
+ "\xdb\x9d\x55\x06\x32\xbb\x17\xcf\x4d\x29\x91\x64\xf2\x05\x6c\xff"
+ "\xc7\x84\x06\x67\x95\x8d\x5c\x93\x21\x73\xa8\xb2\x76\x8c\x6c\x22"
+ "\x72\x18\xfb\xe9\x43\xcd\x24\x08\xda\xaa\xa7\xf9\x1b\xa2\xf0\x57"
+ "\x80\x72\x1c\x20\xfb\x9d\xaa\xac\xad\x9d\xb9\x73\x23\x37\x2c\x24"
+ "\xda\x74\x2b\x51\xd7\xa5\x99\x49\x9a\x81\x5a\xeb\xc8\x37\x24\xd8"
+ "\x4c\xe4\x38\x8f\xf5\x69\x5b\x05\x59\x9a\x48\x69\xab\xec\x9f\x27"
+ "\x71\xbc\x98\xdf\x4a\x22\xc0\x26\xce\xa0\xa0\x3f\x0a\x05\xa2\x85"
+ "\xf2\x23\x90\x96\x50\xf6\xa3\xa1\xb3\x89\xec\x83\xe7\xed\x04\xe9"
+ "\x89\xb4\x85\xb1\x65\x04\xa3\xab\x8d\x90\x5f\x3d\xc3\xe9\xfa\xe6"
+ "\xc2\xc1\xd2\xf5\x9f\x3b\xb9\x5d\x99\x55\x65\x32\x77\x12\xb0\x2d"
+ "\xd5\x78\xae\x19\xd2\x0d\x75\x86\x76\x18\x87\xfc\x33\x8c\xe6\x65"
+ "\x95\x0b\xa0\xb3\x06\x57\xee\xc7\x5e\xf7\xbf\xb9\xc9\x53\x1d\xc8"
+ "\xcc\x5e\x58\x73\xd1\xbb\xda\x40\x83\xd7\xeb\x38\xbd\xd7\x4f\x1a"
+ "\xd9\x14\xd8\xde\x37\xbd\xd7\xeb\x1c\xa0\x73\x9c\xaa\xf5\x13\x7c"
+ "\xa7\x77\xf5\xd3\x9e\xf4\x5e\x4f\xae\x0c\xbd\xab\xb9\x1f\xb1\xdc"
+ "\xf5\x51\x9e\xf4\xfe\xd8\xcc\xe9\xfd\xf1\x3a\x9a\xb7\x3e\x42\x00"
+ "\x5d\x39\xc8\x72\xbd\x9e\x7f\x74\xa3\x37\xe0\xbb\xb7\x0e\x73\xd1"
+ "\xfb\x80\x19\xe8\x2d\xe2\x7b\x3d\xe0\x7b\x64\xb3\x17\x7a\x03\xbe"
+ "\xd7\x03\xbe\xd7\x0f\x02\xdf\x07\x0e\xf4\xa0\xf7\x15\xc2\xf7\x01"
+ "\x31\xfe\xd3\xfa\x1e\xf8\x3e\x30\x8b\xd3\xbb\xda\x06\xf4\x06\x7c"
+ "\xaf\x1f\x24\xbe\x0f\xb4\xf9\xa0\x3f\x00\xdf\xbd\x75\xa7\x8b\xde"
+ "\x9f\xce\xa2\xc1\x46\x11\xdf\x46\xc0\xf7\xa8\x43\x7d\xd3\xdb\x08"
+ "\xf8\x36\x02\xbe\x8d\x83\xc0\xf7\xa7\x3f\xf3\xa4\xb7\xf1\x0a\xe1"
+ "\xfb\x53\x05\xa7\xb7\xb1\x07\xbe\x3f\xa9\xe2\xf4\xfe\x24\x9e\xe6"
+ "\x19\x01\xdf\xc6\xc1\x96\x3b\xcf\x07\x7a\x03\xbe\x7b\xeb\x6c\x17"
+ "\xbd\x6b\xaa\x80\xde\x22\xbe\x8d\x80\xef\x9f\xe6\x78\xa1\x37\xe0"
+ "\xdb\x08\xf8\x36\x0e\x02\xdf\x35\xdb\x7b\xd0\xfb\x0a\xe1\xbb\x26"
+ "\x49\xa4\x77\x0f\x7c\xd7\x44\x70\x7a\x7f\xda\x00\xf4\x06\x7c\x1b"
+ "\x07\x89\xef\x9a\x1a\x1f\xec\x04\xc0\x77\x6f\x5b\xc1\x45\xef\xba"
+ "\x08\x1a\x9c\x2d\xe2\x3b\x1b\xf0\xfd\xcc\xa3\x7d\xd3\x3b\x1b\xf0"
+ "\x9d\x0d\xf8\xce\x1e\x04\xbe\xeb\xc6\x78\xd2\x3b\xfb\x0a\xe1\xbb"
+ "\xb6\x85\xd3\x3b\xbb\x07\xbe\x6b\x4b\x39\xbd\x6b\xa7\xd1\xbc\x6c"
+ "\xc0\x77\xf6\x20\xcb\xad\xf3\x7a\xfe\xb7\x3f\xfb\xe4\xd5\x2d\x44"
+ "\xe9\x49\x73\xd3\xd6\xcb\x67\xa3\x98\xf2\xae\x8e\x8d\x62\x8a\xed"
+ "\xdb\x46\x31\x85\x71\x9a\xd7\x55\xf8\x67\xa3\x98\xca\xfd\xb1\x51"
+ "\x7a\xd3\xfc\xa0\xe6\xf2\xd9\x29\x07\x65\x57\xc7\x4e\xa9\xaf\xe9"
+ "\xdb\x4e\xa9\x37\x72\x9a\xd7\x4f\xf2\xcf\x4e\x39\x38\xc1\x1f\x3b"
+ "\xa5\x37\xcd\x0f\xe5\x5e\x3e\x5b\xe5\xd0\xf2\xab\x63\xab\x1c\x8a"
+ "\xea\xdb\x56\x39\xe8\xe0\x34\x3f\x58\xea\x9f\xad\x72\xa8\xc8\x1f"
+ "\x5b\xa5\x37\xcd\x1b\xc8\xe5\xb3\x57\x3e\x3b\x79\x75\xec\x95\xcf"
+ "\x76\xf6\x6d\xaf\x7c\x26\x8e\x7f\x3e\x0b\xf3\xcf\x5e\x69\xf0\x61"
+ "\xfc\xd3\xdb\x5e\xe9\x4d\xf3\xc3\x49\x97\xcf\x66\x39\xfc\xec\xd5"
+ "\xb1\x59\x0e\xeb\xfa\xb6\x59\x1a\x5a\x38\xcd\x1b\x8c\xfe\xd9\x2c"
+ "\x87\x33\xfc\xb1\x59\x7a\xd3\xfc\x73\xcb\xe5\xb3\x5b\x3e\x3f\x78"
+ "\x75\xec\x96\xcf\x8b\xfb\xb6\x5b\x3e\x8f\xe5\x34\x3f\xec\xf0\xcf"
+ "\x6e\xf9\xdc\xe6\x8f\xdd\x82\xb4\x46\x9a\xa3\xad\xc2\x69\x7e\xa4"
+ "\x82\x86\x64\x65\x74\x81\x3d\x12\x0c\x74\x0f\x6e\x23\xf2\x2d\x48"
+ "\xf3\x46\x4e\x73\x67\xc8\x86\x28\xa0\x8f\x1e\x69\xc6\xda\xf1\x9d"
+ "\x26\xc4\x99\x9b\xb5\x83\xca\x09\xb4\x45\x49\x5a\x65\x5f\xec\x77"
+ "\x64\x92\x10\x6d\xda\x1a\xf8\xff\x08\xf3\x9f\xa9\x4d\xcb\x3a\x0a"
+ "\x6d\x0c\xc0\x35\x0a\x47\xde\x1c\xb3\x33\x38\x27\x0e\x9e\x05\xd2"
+ "\x71\x31\xe6\x2e\xb0\x25\xe8\xcb\x9a\x30\x53\x5b\x39\x31\x39\x3e"
+ "\x21\x75\x8d\xff\x20\x42\xc8\x86\x47\xef\x75\x10\x1d\xfd\x4e\x17"
+ "\x56\x93\x64\x26\xce\x17\x34\x2a\x53\x4a\x35\xe0\xe2\x7f\x48\xb4"
+ "\x85\x5e\xa0\xdf\xea\x54\x5d\xc1\x05\xa5\xce\xe0\x0d\x5a\x67\x5e"
+ "\xa1\xde\x11\x5c\x50\xf8\x76\xb2\x59\xae\xb2\x13\xdd\xe2\x16\x4a"
+ "\xf3\x9f\x27\x8a\xfc\x66\xa2\x2c\x78\x9e\xa8\x0a\x9a\x89\xba\xa6"
+ "\xa5\x91\xd4\x9e\xaa\x26\xb5\xed\x47\x48\xed\x05\xb8\x3a\xe1\x12"
+ "\xe0\xca\x38\x42\x6a\x60\xf4\xf8\xc4\x69\x42\xd2\x5b\xa8\xf5\xc7"
+ "\x4d\x24\xac\xc6\xd1\x48\x70\x1f\xef\x19\x59\xe3\x66\x55\x1c\x09"
+ "\xa3\xdf\x6a\x08\x7d\x41\x23\x87\x67\x0a\x4c\x37\x39\xac\xa4\xa6"
+ "\xc5\x8e\xcf\x53\xe0\xb9\x22\xbd\x05\xca\x17\xaa\xd1\x5f\x9c\xb5"
+ "\x26\xe3\x00\xb4\x2f\xb0\x1e\xe8\x5c\x21\xd9\x64\xf9\x9d\x24\xa2"
+ "\x00\xd8\x8c\x98\x89\xa6\x1c\x33\x6f\x75\x0e\x16\x33\x8d\xdc\xff"
+ "\xd9\xcb\x9a\xd1\x40\xef\xb1\xc2\xcb\xb1\xea\x27\x8f\x1c\xa3\xb8"
+ "\x4f\x0b\xd7\x67\xea\x6c\x9f\x10\xd3\x3a\x81\x44\xaf\x24\x64\xa6"
+ "\x93\x10\xa4\x09\xae\x25\x3f\x69\x20\xa1\xb8\x7f\x4c\xf8\x4e\x37"
+ "\xda\xd4\x62\x25\xab\x1d\x50\xd7\x33\xf6\xee\xba\xd6\xad\xab\x23"
+ "\xf0\x6c\x6c\x9d\xde\x4c\x54\x06\xa2\x46\x3a\x83\x2d\x5a\xf6\xa4"
+ "\x85\x04\x2d\xb5\x51\x8a\x34\x46\xda\x22\x9d\xb1\x3c\x89\xf6\xa6"
+ "\x78\x2b\x49\xb7\x13\xb5\x29\x0d\x7e\x53\xa8\xd5\x44\xce\x12\xa8"
+ "\xe3\x0e\x1a\x1c\x58\x0f\xf8\x98\x86\x98\x30\xcb\xbe\xa8\x04\x1c"
+ "\x8c\xa6\x59\x5f\x18\x4a\xa0\xbd\xb8\x86\x3f\xb8\x36\x1f\xf1\x65"
+ "\xfd\xa3\x97\x4d\xe8\xc2\xf3\x7a\x1d\xc7\x73\x93\x91\x86\xac\x27"
+ "\x5d\x60\xeb\x71\x3c\x07\xb6\x0f\x8c\xe7\xf5\x93\x5c\x78\xfe\xf2"
+ "\x75\x17\x9e\x9b\x56\x7a\xc7\xf3\x57\x87\x39\x9e\xd7\x47\x5d\x9b"
+ "\x78\xfe\x6a\x51\xff\x78\xfe\x6a\x86\x77\x3c\xaf\x8f\x94\xec\xdd"
+ "\xa1\xc1\xf3\x57\xa5\x57\x0e\xcf\xeb\x75\xfe\xe1\xf9\xab\x54\x4f"
+ "\x3c\x7f\x99\xcb\xf1\xfc\x65\x94\x7f\x78\x6e\xf2\x1a\xff\xa0\x3f"
+ "\x7b\xdb\x0d\xcf\xa2\x7c\x3e\x16\x0b\x78\x06\xf9\xbc\x5e\x94\xcf"
+ "\x23\x9b\x7d\xc0\xb3\x9b\x7c\x3e\x9a\xe0\xc2\xf3\xb1\x5f\x7a\xc7"
+ "\xf3\xd7\xdb\x44\x3c\x5f\xa3\xf2\xf9\xeb\x9f\xf5\x8f\xe7\xaf\x35"
+ "\xfd\xe0\xb9\x42\x1a\x4b\x0c\x0d\x9e\xbf\x36\x5c\x41\x3c\xfb\x29"
+ "\x9f\xbf\x9e\xe9\x89\xe7\xa3\xf3\x38\x9e\x8f\xaa\xfd\xc3\xf3\x31"
+ "\xaf\xfb\x9f\xfb\x1b\xcb\xb8\xf0\x6c\x14\xe5\x73\xb3\x8e\x86\x18"
+ "\x41\x3e\x1b\x45\xf9\x3c\xea\xd0\xc0\x78\x36\xba\xc9\x67\xf3\x03"
+ "\x2e\x3c\x37\x8f\xf1\x8e\xe7\x6f\x96\x73\x3c\x1b\xaf\x51\xf9\xfc"
+ "\x4d\x50\xff\x78\x36\x5b\xbc\xe3\xd9\x18\x29\x8d\xd3\x86\x06\xcf"
+ "\xdf\x44\x5d\x39\x3c\x1b\xfd\x94\xcf\xdf\x84\x7b\xe2\xd9\x3c\x89"
+ "\xe3\xf9\x98\xd9\x3f\x3c\x37\x7b\x8d\xff\xd3\xdf\x38\xd1\x0d\xcf"
+ "\xa2\x7c\x6e\xb1\x03\x9e\x41\x3e\x1b\x45\xf9\xfc\xd3\x1c\x1f\xf0"
+ "\xec\x26\x9f\xbf\x0d\x74\xe1\xb9\xe5\xa4\x77\x3c\xb7\x4c\x17\xf1"
+ "\x7c\x8d\xca\xe7\x6f\x8f\xf4\x8f\xe7\x6f\x2b\xfa\xc1\x73\x85\x34"
+ "\x06\x1e\x1a\x3c\xb7\xa8\xaf\x20\x9e\xfd\x94\xcf\xdf\xb6\x79\xe2"
+ "\xb9\xd9\xc1\xf1\xdc\x5c\xee\x1f\x9e\x8f\x7b\xf5\xff\xd6\xdf\x18"
+ "\xdc\x85\xe7\x6c\x51\x3e\x9f\xa8\xa6\x21\xd9\x20\x9f\xb3\x45\xf9"
+ "\xfc\xcc\xa3\x03\xe3\x39\xdb\x4d\x3e\x1f\x3f\xec\xc2\xf3\x89\xf7"
+ "\xbc\xe3\xf9\xc4\x8d\x1c\xcf\xd9\xd7\xa8\x7c\x6e\xdd\xde\x3f\x9e"
+ "\x5b\x8d\xde\xf1\x9c\x1d\x29\xcd\x2f\x0c\x0d\x9e\x5b\xcd\x57\x0e"
+ "\xcf\xd9\x7e\xca\xe7\xd6\x4a\x4f\x3c\x1f\xaf\xe1\x78\x3e\x9e\xe1"
+ "\x1f\x9e\x4f\x78\x8d\x7f\x37\xb8\xf9\x8d\x53\xd5\x38\xbf\xd1\x89"
+ "\xf3\x1b\xae\xbd\x7f\xfa\xd0\x7a\x8e\xe7\x2e\xc0\xf3\x9b\xee\x78"
+ "\xfe\xaa\xe7\xfc\x86\x65\x9b\xd0\x8d\xe7\x53\xbd\xf0\x2c\x00\x9e"
+ "\xbb\x18\x9e\x4f\x1e\x94\xe6\x37\x4c\x6d\xa5\x80\x93\x53\xc4\x34"
+ "\x0b\xb0\x9c\x2f\x62\xf9\x2b\xc0\x32\xd0\x50\x00\x1a\xd7\x34\x35"
+ "\x92\x68\x2b\xa7\x65\x27\xd0\x58\x70\xc7\x71\xa7\x45\x8e\xf8\x45"
+ "\xdc\x4a\x18\xae\x5d\x0a\xd8\x4d\x3c\x48\x6a\x93\xe1\x5a\x05\x57"
+ "\x1a\x5c\xe4\x20\xa9\xb1\x00\x76\x17\xb9\x63\xb7\x5e\xc4\xee\xc9"
+ "\x84\xfe\xb1\x7b\x72\xda\x95\x9b\xcb\x38\xc9\xe7\xbf\xbe\x8a\x55"
+ "\x47\xc7\x1c\xa3\xa6\x94\x46\x11\x9f\xa7\x48\xb4\x83\x84\xd2\x67"
+ "\x74\xa3\x55\xb1\x44\xfd\x9a\x93\xc8\xf3\x9e\x27\xea\xbc\x2f\xa1"
+ "\xdd\x52\xff\x6d\x26\xaa\x4f\xec\xff\x20\x35\xed\x8d\xa4\xe6\xc2"
+ "\x01\x52\x23\xc0\x75\x0a\x2e\xa8\x6b\x74\x82\x7b\xbb\xad\x62\xbb"
+ "\x4f\x3d\x0b\x65\x4d\xf0\xde\xee\x53\x53\x59\xbb\xe3\xa1\xdd\x9d"
+ "\xae\x76\x9b\xa0\x1f\x00\x7f\xc6\x0a\xe2\x7c\x48\xb4\x95\x04\x2d"
+ "\x73\x50\xda\x29\xe2\x1f\xf9\xf3\x49\x83\x9d\x44\x1b\x80\x67\x2f"
+ "\x00\xfe\x5b\xca\x48\x7a\x2a\xe0\xbf\xd3\x8e\xb8\xb3\x9a\x32\x2e"
+ "\x02\xfe\x4f\xa6\x50\xa0\x5f\x17\xe2\xff\x2b\xc4\xbf\xa5\x58\x60"
+ "\xf8\xb7\xcc\xf2\x0f\xff\xa7\x7c\xc0\xbf\x2f\xf3\x21\xa7\xab\x71"
+ "\x3e\xa4\x13\xe7\x43\x5c\x7b\x40\x07\xc0\xbf\xfb\x7c\xc8\x77\x6e"
+ "\xf8\x3f\xdd\x0f\xfe\xdb\x0e\x4a\xf3\x21\x57\x1f\xff\x6d\x03\xe0"
+ "\xbf\xad\x1f\xfc\x0f\xf5\xdc\x47\xdb\x15\xc4\xff\xe9\x01\xf0\x7f"
+ "\xda\x07\xfc\xaf\xd7\xf9\x87\xff\xb6\x1e\xf8\xff\x4e\xc4\xff\x77"
+ "\x7e\xe2\xff\xb4\x2f\xf8\xf7\x61\xfe\xc4\x8a\xf8\x07\xf9\xbf\x7e"
+ "\xab\xdb\x5e\xe0\x81\xf0\xef\x26\xff\xcf\xb8\xe1\xdf\xda\x0f\xfe"
+ "\xbf\x97\xf0\x7f\x0d\xc8\xff\xef\x07\xc0\xff\xf7\xfd\xe1\x7f\x88"
+ "\xe7\x4a\xbe\xbf\x82\xf8\xb7\x0e\x80\x7f\xab\x2f\xf8\xf7\x53\xfe"
+ "\x7f\xdf\x03\xff\x67\x44\xfc\x9f\xf1\x13\xff\x56\x1f\xf0\xef\xcb"
+ "\x7c\xcb\xb9\x6a\x9c\x6f\xe9\xc4\xf9\x16\xd7\x9e\xf0\x01\xf0\xef"
+ "\x3e\xdf\x72\xd6\x0d\xff\xe7\xfa\xc1\x7f\xfb\x41\x69\xbe\xe5\xea"
+ "\xe3\xbf\x7d\x00\xfc\xb7\xf7\x83\xff\xa1\x9e\x5b\x69\xbf\x82\xf8"
+ "\x3f\x37\x00\xfe\xcf\xf9\x80\x7f\xa3\x9f\xf2\xbf\xbd\x07\xfe\xcf"
+ "\x8a\xf8\x3f\xeb\x27\xfe\xcf\xf9\x82\x7f\x1f\xe6\x67\x2e\x20\xfe"
+ "\x41\xfe\x1b\xb7\xba\x9d\x0d\x18\x08\xff\x6e\xf2\xdf\xe6\x86\xff"
+ "\x0b\xfd\xe0\xff\xbc\x84\xff\x6b\x40\xfe\x9f\x1f\x00\xff\xe7\xfb"
+ "\xc3\xff\x10\xcf\xc5\x9c\xbf\x82\xf8\xbf\x30\x00\xfe\x2f\xf8\x82"
+ "\x7f\x3f\xe5\xff\xf9\x1e\xf8\xb7\x89\xf8\xb7\xf9\x89\xff\x0b\x3e"
+ "\xe0\xdf\x97\xf9\x9c\x8b\x6c\x3e\xa7\x13\xe7\x73\x5c\x67\x44\x06"
+ "\xc0\xbf\xfb\x7c\x4e\x87\x1b\xfe\x2f\xf6\x83\x7f\xfb\x41\x69\x3e"
+ "\xe7\xea\xe3\xdf\x3e\x00\xfe\xed\xfd\xe0\x7f\xa8\xe7\x6e\xec\x57"
+ "\x10\xff\x17\x07\xc0\xff\x45\x1f\xf0\x9f\xed\xa7\xfc\xb7\xf7\xc0"
+ "\x7f\x87\x88\xff\x0e\x3f\xf1\x7f\x71\x88\xe6\x7f\xba\x0c\x38\xff"
+ "\x23\xa8\xb2\xb6\x76\x15\xc7\x98\x85\xdc\x82\xd2\x50\x99\x96\x38"
+ "\x54\x39\x71\xa6\x24\x1b\x79\xf2\x3c\xf0\xc4\x70\x9e\x3c\x77\x5e"
+ "\x8d\xf1\x02\x0b\x29\x8c\xff\x3d\xce\x88\xc2\xe5\xc8\x0d\xac\x2f"
+ "\x58\x4a\x14\xce\x90\x0d\xec\x7c\x95\xa9\xd5\x4e\xb0\xcd\xab\x91"
+ "\x06\xa7\x5c\x34\xc0\x39\x38\xfa\xbd\x4e\x5d\x92\x09\x79\x3a\xcd"
+ "\xa4\x05\xf0\x52\xd3\x62\x06\xda\xaf\x62\xd8\x42\x5e\x40\x7d\xd4"
+ "\x6f\x9d\x21\x0a\xc7\xb7\x9a\xb1\xc0\xe3\xb0\xe0\x15\x44\x16\xde"
+ "\x42\x05\xe4\x25\xf2\x08\xf9\xaa\x5d\x85\xfb\x95\xba\x16\xd5\x01"
+ "\xbe\x1d\xdf\xea\xc6\x96\x40\xbe\xa1\x9f\x97\xe9\x62\xeb\x1f\xf0"
+ "\xab\xac\x69\x02\x5a\x66\x75\xfa\xc9\xa7\x2e\x5f\xce\xbf\xf8\x30"
+ "\x4f\xe1\xd4\xe0\x3c\x85\xa0\x5a\x3f\xc1\x37\x3e\xad\xd7\x79\x9c"
+ "\x69\x1d\x72\x3e\x39\x2a\x7c\xe3\x93\x73\x94\x27\x9f\x86\x7a\xfe"
+ "\xc0\x21\xfa\x83\x71\x94\x73\x3e\x75\xd9\xfd\xe3\x93\xd3\xaf\xfd"
+ "\xbf\xbd\xc7\xd3\x42\x15\x8e\xa7\x81\x4f\x3e\xf6\xa7\xf5\x65\x1e"
+ "\x67\x70\x87\x9c\x4f\x42\x9c\x6f\x7c\x12\xde\xeb\xc1\xa7\x21\x1e"
+ "\xe7\x0a\x62\x3c\x68\x21\x96\xf3\xc9\x59\xea\x1f\x9f\x04\x1f\xce"
+ "\x7f\xf8\x30\xee\x93\x13\x3d\x8e\xfb\x04\x18\xf7\xf9\xc6\x27\xa3"
+ "\xce\xe3\xcc\xf0\x50\xf3\x49\x4e\x94\x3e\xf1\x49\x4e\x16\x78\xf2"
+ "\x69\x88\xc7\x63\x72\xc2\xe2\x7f\xc1\x2f\xe1\x7c\xa2\x33\xfc\xe2"
+ "\x93\x9c\x24\x0d\xc9\xf8\x44\x2e\x57\xe3\xf8\x04\xf8\xe4\x63\x7f"
+ "\x32\x96\x79\x9c\x71\x1e\x72\x3e\xc9\xca\x7d\xe3\x93\x3c\xa8\x07"
+ "\x9f\x86\x76\xdc\x20\x97\x35\x70\x3e\xc9\xca\x18\x9f\x72\x88\xd5"
+ "\x3f\x3e\xc9\xbd\xc6\xff\x1c\x94\x1d\x2d\x0f\xa8\x40\x3b\x5a\x00"
+ "\x3b\xda\x37\x3e\x65\xeb\x3c\xce\x64\x0f\x39\x9f\x02\x62\x7d\xe3"
+ "\x53\xc0\xdf\x3c\xf9\x34\xc4\xf6\xad\x3c\x20\x95\xf3\x29\x60\x16"
+ "\xe7\x93\xbc\xc8\x3f\x3e\x05\xf8\xb0\xff\xb3\xef\x73\x58\xbd\x6c"
+ "\x3e\x79\x60\xfc\x35\x65\xf3\xc9\x03\x15\xbe\xf1\x2a\xf0\xd9\xcb"
+ "\x6a\xf3\xc9\x03\x75\x9c\x57\x0a\x07\xe7\x95\x62\x9a\x7f\xbc\x0a"
+ "\x34\xf8\x7b\x7e\xab\x97\xdd\x27\x1f\xae\xbe\xa6\xec\x3e\xf9\x30"
+ "\x1f\xe5\xdf\xf0\xa0\xcb\x6a\xf7\xc9\x87\x89\xf2\x6f\x98\x28\xff"
+ "\x02\xfd\x94\x7f\xc3\x7d\x90\x7f\x7d\x9f\xfb\xea\x65\xfb\xc9\x95"
+ "\x95\xd7\x94\xed\x27\x57\xce\xf3\x8d\x57\xca\x77\x2f\xab\xed\x27"
+ "\x57\x66\x70\x5e\x29\x67\x73\x5e\x0d\x2f\xf6\x8f\x57\x4a\xaf\xf1"
+ "\x5f\x06\x3a\x2f\xd6\xdb\xfe\x1b\x71\x8d\xd9\x7f\x23\x7c\xb4\xff"
+ "\x46\x5c\x66\xfb\x6f\x84\x68\xff\x8d\xe0\xf6\x5f\x4e\x90\x9f\xf6"
+ "\xdf\x08\xbf\xec\xbf\x1e\xbc\x12\xfb\x95\x2a\xec\xda\xb2\x01\x47"
+ "\xee\xf4\x8d\x57\xaa\xe0\xcb\x6b\x03\x8e\x6c\xe4\xbc\x1a\xb9\x83"
+ "\xf3\x6a\x84\xcd\x3f\x5e\xa9\xb4\xfe\x9e\x4f\xeb\x6d\x07\x06\x57"
+ "\x5d\x5b\x76\x60\xb0\x6f\xe3\x5f\x79\xf0\x7b\x97\xd7\x0e\x0c\xe6"
+ "\xe3\x5f\x79\x30\x1f\xff\xe6\xa8\xfc\x1b\xff\xca\x83\x7d\x18\xff"
+ "\xfa\x30\xef\x27\x57\x6b\xd1\x06\x74\xe6\x66\x6d\x0d\x05\xfa\x87"
+ "\xa6\x10\x79\x67\x38\xf0\x4b\x05\xfc\x5a\xa3\x25\x5d\xb9\xc0\x2f"
+ "\xab\x83\x3c\xf9\xca\x31\x5a\xd7\xe6\x24\x9d\xc0\xab\x8b\x60\x07"
+ "\x9a\xac\x16\x3c\xa3\xf7\x6f\xcd\xf2\xd0\xf7\x9e\x79\x45\x4d\x90"
+ "\x5f\x48\x7f\xa7\x2a\xb0\x9e\x02\xbf\x18\xff\x54\x85\x7a\x47\xee"
+ "\x06\xed\x13\xa7\x8f\xd1\x65\x66\x4a\x6b\xf5\x76\xa8\xd3\x1c\x73"
+ "\xad\xbe\x91\x44\xb7\x90\x20\xed\x53\xc8\x97\xd0\x45\x98\x6e\xb2"
+ "\x36\x12\xf4\xfb\xc9\xe6\xc0\x8f\xe9\xc2\x1c\x5f\xe8\x54\xe8\xbf"
+ "\x09\xcf\x15\x4a\x3e\x9a\x4c\xa7\x8a\x18\xff\x7b\xce\xa9\x32\xfe"
+ "\x7f\xa1\x53\xbf\x89\xe7\x13\x87\xdc\x16\x0c\x65\xf3\x7f\xc2\x31"
+ "\xcd\x58\xa9\x8e\xcb\x16\x53\x0a\x75\x1c\x5d\x67\xb3\x12\xac\x67"
+ "\x9d\xad\x8a\xa4\x27\x11\x75\x5d\xa7\x85\xa4\xd9\xa8\xb5\x2e\xe3"
+ "\x24\x89\x3e\x8f\xeb\x02\x88\xa7\xd0\xbf\x71\x7e\x87\x34\x09\xc7"
+ "\x74\x63\xa1\xbc\xb2\xba\x7a\x42\x42\xd7\x00\xad\x1d\x44\xce\xce"
+ "\x6b\xe2\x98\x5f\x2e\xe8\x4d\x19\xcd\x04\x68\x57\x6a\x72\x7c\x89"
+ "\xf4\xd4\xc3\xf3\xa9\xdd\xeb\x0d\x21\x1b\xfe\x0b\xd3\x90\xb6\xb8"
+ "\xcf\xd4\x64\xb0\xb2\x3c\xd2\x73\xce\xbb\x0c\x62\x4a\xe9\x24\x75"
+ "\x0e\x42\xe0\x7b\xc6\x4f\x63\x1b\x01\x5f\x21\x7e\xca\x6d\xf5\xa4"
+ "\x21\x99\xaf\x94\x8f\xce\x40\xbb\xd5\x99\xbb\x7e\x02\xaf\x63\x60"
+ "\xfb\xc0\xf8\x5a\xaf\x73\xe1\x6b\xf4\x98\x4b\xc3\xd7\xa8\x03\x43"
+ "\x8b\xaf\xa1\xb6\x5f\x47\x6d\xba\x34\x7c\x8d\x1e\xc5\xf1\x35\x6a"
+ "\x2a\xc7\xd7\x68\xa5\x0b\x5f\x81\xed\x97\x0f\x5f\x6a\x0b\xc7\x97"
+ "\xba\xcc\x3f\x7c\x8d\xce\x1d\x92\x79\x56\x79\x98\x19\x6d\x6d\xc0"
+ "\x97\x28\xbf\x46\x36\xfb\x80\x2f\x37\xf9\x15\xb6\xf2\xd2\xf0\x15"
+ "\x36\x71\x88\xf1\x35\xc4\x36\xf7\x0d\xb6\x4b\xc3\x57\xd8\x2b\x1c"
+ "\x5f\x37\x14\x73\x7c\x85\xe9\x5d\xf8\x1a\xd9\x7c\xf9\xf0\x75\xc3"
+ "\x0c\x8e\xaf\x1b\x94\xfe\xe1\x2b\xcc\x2f\xff\x57\xbd\xc7\x07\x37"
+ "\x47\xe1\xf8\xc0\x99\x6b\x14\xe5\xd7\xa8\x43\x03\xe3\xcb\xe8\x26"
+ "\xbf\x6e\x3a\x72\x69\xf8\xba\x29\x7b\x68\xf1\x35\xd4\xe3\x84\x9b"
+ "\x66\x5f\x1a\xbe\x6e\x3a\xc8\xf1\x75\xa3\x83\xe3\xeb\xa6\x6a\x17"
+ "\xbe\x46\x1d\xba\x7c\xf8\xba\xb1\x8c\xe3\xeb\x46\xbd\x7f\xf8\xba"
+ "\xd9\xbb\xff\xe7\x41\xcd\x6b\x8f\x29\xc5\x31\x0d\xe0\x4b\x94\x5f"
+ "\x3f\xcd\xf1\x01\x5f\x6e\xf2\x6b\xcc\xcf\x2e\x0d\x5f\x9a\x93\x43"
+ "\x8c\xaf\x21\x1e\xdb\x68\x76\x5e\x1a\xbe\xc6\xdc\xc7\xf1\xa5\x99"
+ "\xc7\xf1\x35\x46\xe7\xc2\xd7\x4f\x73\x2e\x1f\xbe\x34\x4a\x8e\xaf"
+ "\x9b\xab\xfd\xc3\xd7\x18\x1f\xfc\xbf\xfa\x32\x1f\x1f\x4e\x70\x1c"
+ "\xe6\xcc\xcd\x16\xe5\xd7\x33\x8f\x0e\x8c\xaf\x6c\x37\xf9\x75\xcb"
+ "\xe6\x4b\xc3\xd7\x2d\xbf\x1c\x5a\x7c\x0d\xf5\x78\xec\x96\xb0\x4b"
+ "\xc3\xd7\x2d\x1b\x39\xbe\xc6\x56\x72\x7c\xdd\x62\x74\xe1\xeb\x99"
+ "\x47\x2f\x1f\xbe\xc6\xea\x39\xbe\xc6\xea\xfc\xc3\x57\xb8\x0f\xfe"
+ "\x7f\x7c\x5d\x47\x18\x1f\x7f\x69\x63\xc8\x71\xce\x4b\xc3\xd8\xb8"
+ "\xb7\xaf\xed\x31\xe4\xb8\x94\x4b\xc3\xd8\xb8\xf3\x1c\x63\xe3\xb4"
+ "\x1c\x63\xe3\xda\xae\xcc\x18\x32\xbc\x86\x63\x2c\x3c\xd7\x3f\x8c"
+ "\x8d\x1f\xc2\xf5\x0f\x6d\xf5\xa5\x8d\x23\xb5\x0b\x2e\x0d\x63\xda"
+ "\x51\xd7\xf6\x38\xf2\xd6\xa6\x4b\xc3\x98\xf6\x69\x8e\xb1\x5b\xd7"
+ "\x71\x8c\x69\x67\x5d\x99\x71\xe4\xad\x11\x1c\x63\xe3\xfd\x5c\xb7"
+ "\xd1\xfa\x75\xfe\xa5\xef\x75\x9b\x3b\x26\x5d\xda\x58\xf2\xf6\xfd"
+ "\x97\x86\xb1\xdb\x97\x5f\xdb\x63\xc9\xdb\xa3\x2e\x0d\x63\xb7\xef"
+ "\xe6\x18\xbb\xcd\xc2\x31\x76\xfb\xce\x2b\x33\x96\xbc\x6d\x13\xc7"
+ "\xd8\x6d\xb3\xfd\xc3\xd8\x1d\x91\x43\xb7\xde\x74\x67\xe1\xa5\x8d"
+ "\x27\xef\x9c\x78\x69\x18\x9b\x70\xe4\xda\x1e\x4f\x4e\xd8\x7a\x69"
+ "\x18\xbb\xf3\x36\x8e\xb1\x09\x33\x39\xc6\xee\xd4\x5c\x99\xf1\xe4"
+ "\x1d\x76\x8e\xb1\x3b\x2a\xfc\xc3\xd8\x9d\x3e\xf8\xff\xf7\x75\x9d"
+ "\xec\x2e\xdb\xa5\x8d\x29\xef\xca\xbb\x34\x8c\xdd\xf5\xd0\xb5\x3d"
+ "\xa6\xbc\x4b\x79\x69\x18\xbb\xeb\xb7\x1c\x63\x3f\x2a\xe7\x18\xbb"
+ "\x2b\xf5\xca\x8c\x29\x7f\x34\x8f\x63\xec\x47\xe1\xfe\x61\x0c\xb7"
+ "\xb5\x0c\xd5\xfa\xde\xdd\xb1\x97\x36\xae\x9c\x78\xf6\xd2\x30\x36"
+ "\xf1\x8f\xd7\xf6\xb8\x72\xe2\xe2\x4b\xc3\xd8\xc4\x93\x1c\x63\x13"
+ "\xc3\x38\xc6\x26\x9a\xaf\xcc\xb8\x52\x57\xc5\x31\xa6\xf3\xcf\x1f"
+ "\x85\xfc\xee\x5e\xfe\xaf\x16\x2d\x4d\x5e\xb0\x78\x51\xbc\x76\xd1"
+ "\xd2\xa4\xc4\x57\xb4\xaf\x2e\x5a\x95\xf0\xd0\x9d\xcb\x27\x69\x13"
+ "\x53\xb4\x89\x8b\x96\xbe\x28\x26\xc4\x8f\x20\x4f\x25\x2c\x5e\x90"
+ "\x82\x29\x90\xfb\xc5\xa5\x4b\x12\x96\x26\x69\x13\x13\x5e\x59\xbe"
+ "\x28\x31\x01\xff\x7f\x55\xbb\x70\x59\x22\x24\xbc\x90\xb0\x28\x39"
+ "\x41\xfb\xfc\xf2\x85\x0b\x13\x12\x5f\x1d\x41\x9e\x58\xbe\x38\x69"
+ "\x91\x61\x71\x82\x76\xda\x13\x8f\xdc\x33\x7b\xfa\xaf\x67\x3f\xfc"
+ "\x30\x06\x27\x73\x8b\x4d\x16\x4e\x73\x0b\xe3\x00\x73\x8a\x56\xf9"
+ "\x4f\xa6\xd7\x69\x08\x8b\x67\x5b\xd0\x4e\xd4\x39\x89\x44\x91\xdd"
+ "\x4e\x94\x79\xed\x44\xa5\x7d\x89\x44\xd1\xec\x7f\x56\xe5\xb7\x93"
+ "\x30\x9a\x3f\xc7\x22\x64\x53\x42\xf3\x02\xa2\xac\x41\x27\xac\x90"
+ "\xa6\x16\xb2\x4f\x68\xe1\x9d\x30\xa0\xad\x82\xe6\x05\x96\x37\xcb"
+ "\x7f\xa2\xb0\x06\x59\xea\xd3\x4f\x12\x39\x1d\xf1\xe3\x4d\x7f\x15"
+ "\xac\xf2\xbd\xb8\xd3\x01\xda\x4e\xe4\x93\x76\xc0\x55\x44\xe4\xf7"
+ "\xcc\x80\x2b\x16\xae\x78\xb8\x72\xe1\xda\x04\x57\x19\x5c\x3b\xe1"
+ "\xaa\x82\xab\x1a\xae\x7a\xb8\x1a\xe1\x32\x13\xf9\xe4\x79\x70\xa5"
+ "\xc2\x05\x79\x27\x6f\xe5\xe5\x4c\x2e\x87\xab\x89\xc8\xef\x55\xc0"
+ "\x15\x0e\x17\xe4\xbf\xd7\x4a\xe4\x11\x06\xb8\x94\x70\x85\xc1\x05"
+ "\xe9\x11\x51\x70\xe1\xfb\x3b\xf9\xb3\xfb\x34\x70\xcd\x26\x50\xcf"
+ "\x81\xaf\xfb\x92\xe0\x82\xef\xde\x57\x4a\xe4\xf7\x13\xb8\xa0\xbe"
+ "\xf7\xef\xf4\x9e\xff\x7e\xc7\x00\x65\x86\x87\xae\xb9\xd5\xcc\x62"
+ "\xe0\xc9\xef\x09\xa2\x99\x24\x80\x66\x5b\xea\x0d\x77\x13\xd9\x29"
+ "\xf9\xa4\xc3\xa6\x75\x20\x67\x94\x94\xc7\x74\x84\x7b\xa4\x59\x47"
+ "\xce\xa4\x06\x33\x31\x68\x30\xa6\xd9\xe0\xf0\x36\xa9\x81\xbf\x7f"
+ "\x4f\x98\x59\x36\xb2\x82\xc5\x80\xcb\xa9\x34\xd0\xf4\xd8\x37\x59"
+ "\xec\x37\xa0\x21\x9e\xcb\xa2\xc6\xf7\x2d\x54\xb9\x2b\x15\xfb\x7c"
+ "\xd5\x2a\xac\xd7\xa4\xb7\x79\xff\x82\xe7\x50\x37\x6b\xf0\x1c\x8c"
+ "\x73\xa9\xc0\x7b\x9a\x7d\xc2\xda\x19\x5c\x10\x85\xff\x5f\xdc\x12"
+ "\x63\xa0\xb9\x05\xd8\xa7\xe4\x55\x69\xff\x45\x9a\xe1\xbd\xce\xe0"
+ "\x8d\x4a\xed\x53\xa1\xb4\x99\x97\x2d\x37\xcb\xef\x89\x92\xca\xea"
+ "\x0c\x9e\x63\xa5\x45\x1b\x23\x68\x1e\x60\x48\x2c\x0f\xb0\x63\xa5"
+ "\xb9\x1b\xd4\x90\xaf\x18\xd3\x69\x71\x8c\x51\xfa\x1f\x7e\x8b\x68"
+ "\x7e\x41\x19\xfe\x86\xae\x21\x36\x76\x9f\x19\x45\xf8\xaf\x9a\xa0"
+ "\xac\x6b\x93\x4f\x7e\x04\xb8\x2e\xab\x7a\x0a\xeb\x3d\x59\x95\x5e"
+ "\x4f\x05\x6d\x5a\x00\x7c\x7f\x72\x70\xf7\x77\xc7\x6c\xd4\x61\x8c"
+ "\x54\x21\xe7\xee\xad\x18\x83\x0f\xdf\xc5\xba\xbd\x31\x9a\x28\xde"
+ "\xfa\x1d\x51\x62\x1b\x3b\x72\x26\x47\x4a\x71\xe8\xf0\x1d\x39\xe4"
+ "\x7f\x3c\x26\x9d\xba\x95\x1d\x48\x59\x7b\x26\x95\x71\x9a\x4e\xd6"
+ "\x9b\x65\x41\xc5\x98\x5f\x7b\x3b\xa3\xe5\xdb\xe2\xf3\x1d\xc8\x4f"
+ "\x2c\x5f\xc8\x2b\x8c\xc3\x7b\x8c\x73\x17\x0a\xc8\xd4\xa6\x4d\xa8"
+ "\xe0\x34\x2a\xd0\x63\x39\x98\x5f\xc8\xcf\x81\xff\xef\x99\x29\x40"
+ "\x7b\x9d\x99\x44\xa7\x5d\x4a\xa2\xa0\xee\x87\x9d\xd9\xbb\x23\xe0"
+ "\x39\xf4\xbb\xdd\x53\x20\x7f\x06\xa3\x77\xde\x06\x68\xfb\xe4\x6a"
+ "\x78\x36\xa5\x3b\xf6\x25\xa7\xb3\x4c\xc8\xde\x3d\x0d\xea\xe4\x30"
+ "\xcb\xb4\x5b\xa5\x36\x30\x19\xe7\xca\x27\xf2\x74\xb2\xd5\x1a\xb4"
+ "\x7b\x5a\x57\x32\xad\x2f\xf8\x92\x10\xf8\x26\xed\xbc\x40\x6b\x52"
+ "\x67\x51\x7b\xfe\x5c\x42\x6a\xe2\x9a\x48\xfa\x02\x12\x3e\x72\x0d"
+ "\xb5\x46\x3b\x49\xe8\xc8\xa6\x50\x5a\x3b\xab\x09\x64\xf4\x79\x92"
+ "\x5a\x4f\x2d\x75\x86\x4a\x92\x7a\x9c\xa8\x56\x2f\x22\x61\xe9\xb3"
+ "\xa8\x35\xad\x86\xda\x4d\x29\x4d\xa4\xce\x06\x97\xa1\x16\xf2\x1d"
+ "\x86\xab\x92\xa4\xaf\x24\x8a\x27\x41\x9e\xa6\x9d\x27\xaa\x3a\xc3"
+ "\x79\x48\x3b\x4d\x52\xe3\xa8\xa3\xb6\x06\xf3\xed\x27\xd1\x0e\x6b"
+ "\xe8\xea\xd3\x44\x51\x32\x17\xcf\x96\x1d\x25\x6f\x41\x5d\x3a\x83"
+ "\x03\x22\x2e\xe6\x05\x56\x9c\x4b\xa6\x8e\x8e\x9c\x7b\xab\xcd\xe4"
+ "\xdf\xaa\x3c\xda\x82\x75\xc6\xb8\xa1\xd0\x5e\xcc\x23\xe4\xe5\x58"
+ "\xe6\x3b\x10\xe7\xf7\x56\x82\x2c\x26\xd2\x73\x7c\x66\x0d\xce\x01"
+ "\xfc\xdc\x6b\x89\x76\xd0\x0e\xcc\x8f\xed\x06\x1a\x45\x89\xed\x8f"
+ "\x0a\x30\x10\x45\x47\x4e\xc4\x24\xb3\xec\x8e\x0c\x37\x1e\x22\x4f"
+ "\x86\x49\xdf\x13\xf3\xcc\x32\xcb\x6e\x63\xb1\x17\x05\xf6\xec\x9e"
+ "\x48\xcc\x0b\xe9\xc0\xff\xdb\xeb\x79\xfd\x22\x22\x30\x4d\x94\xa5"
+ "\xd8\xaf\xa3\x04\xec\xd7\xc6\x5d\xb3\x9c\xc1\x05\x06\x2a\xa7\x76"
+ "\x9a\x37\x57\x49\xcf\x69\x54\x4f\x3a\xa8\x1d\xea\x8d\x32\x56\x85"
+ "\x71\x52\x79\xfe\xfb\x30\x56\xa3\x5a\x9b\x8c\xff\x47\x9c\xc4\xef"
+ "\x08\x5b\x62\xe2\x50\xb6\x46\xd7\x63\xfe\xb9\x71\xf9\x89\x20\x7b"
+ "\xf3\x0a\xe2\xb0\x1f\x0a\xc1\x1b\x34\x17\x37\x6f\x54\x63\xff\xa6"
+ "\x80\x31\x9a\x3b\x57\xdd\x5d\x4e\x26\x09\x84\xfa\xfc\x7f\xf6\xde"
+ "\x07\x2e\xca\x2a\x5d\x1c\x7f\xe6\x65\xd0\x81\xf8\x33\x1a\x15\x15"
+ "\xd9\x68\x54\x54\xa8\x58\xd6\x5a\x8b\x39\x25\x1a\xb6\x2a\xa8\x64"
+ "\x94\xa6\x58\x68\x63\xa2\x4e\x88\x8a\x86\x82\x93\x29\x10\x28\x95"
+ "\x6b\x98\x08\xb4\xb1\xbf\xeb\xee\xcf\xdd\x75\xf7\xeb\xde\xeb\xde"
+ "\x8f\x6d\x53\x50\x97\x2d\x65\xd8\xbd\xed\xe7\xeb\xde\x9f\xdd\x46"
+ "\x42\x62\x5d\xd2\x31\xa6\x98\x60\x66\xce\xef\x79\xce\x79\x5f\xe6"
+ "\x9d\x97\x19\x15\xb7\xfb\xbd\x77\xfb\x46\xbd\xce\xfb\x9e\xf3\x9c"
+ "\xe7\x9c\xf3\xfc\x3b\xcf\x73\xde\xf3\x9e\x63\x67\x58\x9e\x55\x55"
+ "\xca\xf8\x53\x7f\x26\x64\x33\xed\x18\xe9\x1d\xb6\x2b\x07\xd3\x23"
+ "\x3b\xa4\x49\x99\xf4\x8d\x26\x3e\x57\xf1\xb3\x24\xa5\x49\x73\x84"
+ "\xcc\xfc\x73\x76\xd0\xb3\x44\xf4\x43\x9d\x44\x3b\x20\xfc\x8b\x49"
+ "\xab\x03\x7a\x21\xe4\x58\xe8\x77\x25\xb6\x69\xc2\x41\xbf\x2d\xc2"
+ "\x8f\x70\xba\x0e\x41\x07\xa9\x3f\xea\xed\x29\x7d\x95\x93\x6a\x9d"
+ "\x3a\xbd\x39\x88\x9f\x95\xbf\xb5\xd2\xb9\x95\xd8\x96\x08\xc4\xf9"
+ "\x3e\xfe\x8e\xc4\xdf\x3f\x34\xb7\xd3\x58\xcb\xf1\x5e\x45\xf7\x6f"
+ "\x5c\xcb\x5c\x19\xd8\x92\x5e\x89\xe8\x3e\xc9\xe9\x84\xa5\x7b\x08"
+ "\x4f\x25\x9d\xdd\x89\x69\x04\x83\xe9\x1e\x27\xe4\x6d\x17\xf8\xc7"
+ "\xd7\xb9\xc9\x66\x05\xe1\xbf\xfb\x26\x81\x5f\xe0\x25\x7c\x0a\xee"
+ "\x03\x7b\x59\x8f\xc0\x7d\x77\xba\x82\xbb\x1a\xd3\x14\xfc\x19\xab"
+ "\x95\x3a\xee\x5e\x8c\x75\xc4\xa8\xfb\xb0\x6f\x2f\x73\x13\x0e\xcc"
+ "\x2b\x76\x82\x25\x9f\xf2\x2a\x30\x8d\xca\xaa\x64\x2a\xa2\x39\x1b"
+ "\x71\x1c\xe7\x38\x1a\x9d\xb0\xa2\x47\x6d\x37\x90\x46\xb1\x8a\xad"
+ "\x95\x71\xb5\x28\xb8\x02\x78\x14\x99\x7a\xd7\x22\xf3\x94\xf0\xc6"
+ "\x10\x5e\x84\x77\x3b\xe1\xe9\xc9\xea\xbe\xcb\xb6\xb3\x18\x61\x74"
+ "\x32\xfc\x9f\xc9\x2e\x29\xed\xa6\xb3\x3b\x59\xe5\x9d\xc7\x49\x37"
+ "\xd0\x06\x02\xca\x24\xd6\x7b\x4f\xba\xc6\x06\xea\x09\xce\x5f\x79"
+ "\x97\x8e\x9f\x5d\x7a\x2d\xeb\x46\x98\xbc\xa0\xf3\x3a\x25\x78\x10"
+ "\xd3\x8a\x94\x73\x43\x77\x21\x8c\x53\xba\x2b\xec\xbe\x88\x5b\xc7"
+ "\x82\xe4\xa8\x73\x92\x4f\x4a\x72\x95\xee\x48\x72\x83\xa3\xce\x0f"
+ "\xfe\xfa\x79\x35\xe6\xad\xcc\x8e\x7e\xc8\x05\x3a\xef\x79\x78\xe3"
+ "\xdc\x3d\xfc\xfc\x47\xd6\x8f\xbe\x5a\xc9\xdd\x40\x63\xdb\x39\xe9"
+ "\xde\xb1\x0e\xd7\x97\x5c\xfe\xf1\x9e\x8f\x05\xaf\xa1\x6f\x47\xfe"
+ "\x1d\xfa\xd4\x96\x1a\x49\xf8\x78\x7e\x84\xad\xa7\x74\xf2\xff\xd0"
+ "\xf7\x6c\x50\xe5\xb1\xfa\x79\x99\x82\x76\x93\xff\x42\x74\xe4\xed"
+ "\xf5\x3e\x62\xa7\x36\xfb\xeb\xe6\x65\x52\x1f\x4a\x8b\x99\xdf\xe1"
+ "\xed\xb3\xd3\x79\xba\xa6\x0d\xe4\x9b\x4e\xfe\x6d\xd6\x01\x60\xa8"
+ "\xbf\x99\xc3\xeb\xc3\x64\x5e\x27\xfa\xdf\xe7\x5c\x37\xcd\xcb\xa4"
+ "\xf3\x93\x77\x6f\x8d\x34\x4c\xaf\x63\xf6\xde\x31\xf3\x6a\xfa\x2a"
+ "\x27\x9f\x54\xce\xa7\x1d\x26\xde\x93\x4a\xdf\xeb\xe5\xbe\x63\x1a"
+ "\x9f\xb3\x99\x58\xcb\xcf\xc7\xc6\xe7\x7b\x8d\xe1\xf8\x85\x36\xa4"
+ "\x98\xca\x62\xdf\xcd\x0d\x0a\x9d\xbc\x2e\x3a\x1b\x7c\xd4\x59\xe9"
+ "\xde\x9f\x66\x95\xd8\x81\xef\x85\x5f\x5d\x59\x3c\xbc\x76\xdd\xcb"
+ "\xe7\xbf\xdb\xd0\xf7\xcf\xf2\xbe\xc3\x84\xed\xbb\xf7\xc4\x5c\x19"
+ "\x1f\xe5\x29\xbc\xaa\x97\x7d\xf2\x2b\xa8\x23\xec\xfc\xa7\xaa\x5f"
+ "\xc6\xa1\xfd\xba\x6f\xcb\x95\xf7\xeb\xbe\xcc\xa1\xfd\xba\xef\xa7"
+ "\xdf\x6e\xbf\xee\x0b\xfb\xfe\x53\xd5\x2f\xd3\xd0\x7e\xfd\xe0\xb1"
+ "\x2b\xef\xd7\x0f\x4c\x43\xfb\xf5\x83\x2d\xdf\x6e\xbf\x7e\xb0\xfd"
+ "\x32\xfa\x95\x36\xb4\x5f\x53\xc6\xff\x1d\xfd\xf2\x0c\xed\xd7\x94"
+ "\xc7\xbe\xdd\x7e\x4d\x09\x7b\xfe\x59\x58\x7b\xb8\x6b\xb7\x5d\xd8"
+ "\xc3\xfb\x75\xc3\xb7\x87\x53\x8e\x0f\xb5\x87\x0f\x4c\x0a\xd8\xc3"
+ "\x07\x6e\xba\x22\x7b\x88\x0e\xa2\xb0\x87\xf7\xff\x75\x88\x3d\xac"
+ "\x5a\x08\xa1\xed\xe1\xfd\xef\x73\x7b\x58\xbd\x70\x98\x7d\xb8\xbf"
+ "\x66\xd0\x1e\xc6\x2e\x84\x20\x7b\x18\xb7\xdb\xde\x57\x79\x7f\xf7"
+ "\x95\xd9\xc3\xfb\xbb\x87\xda\xc3\xfb\x33\x83\xed\xe1\x03\xa6\x8b"
+ "\xc8\xa1\x27\x94\x3d\xcc\xf2\x9e\x67\xb2\x6c\x78\x86\xd7\x9e\x07"
+ "\x8a\x2f\x52\x57\xd9\x25\xea\x2a\x1b\x66\x5d\x9d\x61\xeb\x32\xfc"
+ "\xb3\x15\xfd\x0c\xe3\x96\x37\x41\xea\xc2\x68\xb7\x2d\xe9\x24\x38"
+ "\x8a\x3d\x30\xc1\x8a\x32\x61\x83\xf4\xb6\xba\x1e\x68\x4b\xea\x02"
+ "\x16\xf5\xcf\x56\xf6\xff\xcc\x07\x73\x21\xc9\xe6\x0f\x0f\x38\x8a"
+ "\x3c\xc3\xe4\xeb\x0f\x2d\x8a\x6c\xb6\x79\x51\x36\x37\x90\x3c\xa6"
+ "\x9f\x70\xf4\x9c\x95\x65\x33\xfd\x77\x83\xfc\xb1\x09\xf9\x0c\x29"
+ "\x9b\xa8\x13\xc1\xb2\x59\x69\x15\xb2\x99\xfe\xd2\x50\xd9\xac\xb4"
+ "\x86\x96\xcd\xf4\x65\x42\x36\x2b\xad\xc3\xeb\x43\x7a\x6a\x40\x36"
+ "\x2b\xad\x41\xb2\x79\xdb\x7c\xf4\xc7\xd2\xb7\x5f\x99\x6c\xa6\x6f"
+ "\x57\xfa\x7e\x40\xee\x3b\xd2\xab\x33\x58\x36\xd3\xc3\x9e\x75\x4d"
+ "\xe7\xaf\xa3\x3d\x8c\x39\x2b\x4d\xad\xf2\xa1\xdf\xea\x2f\xef\xe9"
+ "\xce\xf2\xb1\x3e\x3a\x87\x9d\x49\x93\x81\x6d\x4c\x89\xe9\xc3\x98"
+ "\xb2\xaf\xcf\x62\x60\xd1\xbf\xf5\xb3\x81\x44\xd2\xab\x78\xd6\x97"
+ "\x12\x87\x34\x4b\xc6\xdf\xd1\x07\x36\x40\x02\x5e\x89\x07\x64\xba"
+ "\xe2\x7d\x1a\xdb\x98\x18\xbd\x6b\x03\xa4\xc6\xbb\xc1\x80\x6d\xc8"
+ "\x8d\xdf\x66\x04\x8c\xf9\x13\xe8\x9e\xd9\x9a\xd2\x1b\xbe\x06\x3d"
+ "\xcd\x27\xfa\xa3\xb0\xbe\xe2\x78\xc6\xd6\xa5\x40\x43\x21\xb6\x47"
+ "\x82\xc4\x06\x89\x1d\xf6\x6d\x4c\x91\x58\xdc\xee\x17\xd8\x0b\xb9"
+ "\xbc\x4d\xfe\xe4\xf9\x66\x94\x21\x33\x2b\xb5\x50\xbd\x66\x3a\x0f"
+ "\x98\xdd\x36\x3f\x83\xf5\x25\x46\x57\x7f\x0d\x74\x16\x76\x72\xfd"
+ "\x06\x48\x61\x03\x29\x12\xd2\x20\x77\xc9\xf3\x46\xe2\x7b\x2e\x93"
+ "\x9a\xe8\x5c\x74\x3d\xd6\xad\xf3\x55\x60\x5d\x5e\xac\xeb\x3c\xd6"
+ "\x75\x0e\xeb\xb2\x61\x5d\x36\x51\xd7\xf0\x68\x3e\xd5\x73\xb1\x79"
+ "\xdf\xac\x2d\x63\x68\x7f\xda\xcf\xe3\x8b\x47\x66\xd2\x1c\x70\xef"
+ "\x0b\x96\x61\xca\xfb\x83\xb9\xe1\xf0\xef\xfe\x25\x24\x31\x43\x57"
+ "\xf7\xdc\x97\x3e\x65\x59\x5e\x80\x97\x7e\x09\xa9\xa4\x73\x6d\x9e"
+ "\x2f\x50\xcf\xba\xba\xdf\x4f\xe9\x19\x6e\x5d\x61\xbf\x7f\xad\xb4"
+ "\xb1\x76\x7f\x0c\xc6\xa2\x31\xbb\xcb\x77\xdb\x58\xf1\x40\xd2\xbc"
+ "\xbc\xfe\xa4\x79\x65\x4b\xbd\x46\x94\x2b\x56\x6c\x2a\x04\x53\x97"
+ "\x34\x23\xea\xc3\x8f\x71\x8c\x78\x12\x0c\x1d\xd2\x0c\x73\xe9\x5f"
+ "\x68\xfe\x6e\x5a\x4e\xf0\xfc\xdd\xb4\x62\x90\xcc\xdd\x20\x3d\xe4"
+ "\x01\x69\x7a\x12\x20\x5c\xf0\x95\x31\x45\xe0\x32\xbf\x9f\xf5\xb3"
+ "\x31\xb0\xd5\xcb\x3e\xc7\xf8\x34\x77\x17\xc6\xc0\x59\x77\xe8\x9c"
+ "\xf6\x0d\x34\xaf\x65\x7e\x1b\x69\xfa\x37\x1c\x97\xe2\xf1\xbe\x02"
+ "\x79\x07\xd6\x42\xb8\xfa\xac\x64\x2e\xf7\xe2\x7d\xbc\x7b\x64\xa6"
+ "\xaf\x34\x17\xbc\x89\xaf\x18\x07\xaa\x76\xe7\xf9\x30\x8e\xf5\x1b"
+ "\x7a\xba\x4b\xff\x0a\x49\x8e\x1e\x1f\xd4\xa1\xdc\x2d\xf5\x19\x48"
+ "\x1f\x72\xed\x4f\x7f\x08\x5d\x45\x20\x95\x7e\x05\xb1\xac\x37\x25"
+ "\x46\x91\xeb\x39\x3d\xf1\x9e\x2d\x3d\xcc\x4f\xf2\x4d\xf3\x0b\x98"
+ "\x17\xb7\xf5\x2b\x1c\x6b\x5d\xdd\x50\x87\xb1\xb4\x6f\x9d\x65\xb4"
+ "\xab\xd7\x72\xf5\x7e\x3f\x24\xc4\xb9\xc1\x58\xf7\x25\xca\xe0\x3a"
+ "\x94\xbf\x2f\x51\xce\x5d\x42\xce\xe9\xfb\x9b\x7a\x92\xf1\x1d\x6f"
+ "\x67\x34\x7c\x29\x64\x9c\xcb\x1d\xc9\xf8\x5a\x94\xbb\x35\x01\xb9"
+ "\xf3\xf6\xa2\x8c\x57\x3e\x38\xa5\xce\xc6\x60\xcb\x4a\x90\x1a\xce"
+ "\x8e\xa4\x3c\x5d\xe4\x1d\x92\xe9\xc3\x6c\x0f\x04\xe2\xb0\x19\x0f"
+ "\xf5\xdf\x34\xaf\xcc\x34\x9f\x9d\xef\x90\xcc\x47\x30\xdd\x60\x5a"
+ "\x78\xbb\x11\xe9\xfd\x90\x98\x9f\x99\x61\xa6\xd8\xdd\x89\xb4\x20"
+ "\xba\x60\x1c\x7d\x7b\x87\x34\xad\x82\xe8\xb8\xf1\x20\x44\x58\x1f"
+ "\x64\x9d\x48\xb3\x1a\xc6\xe7\x34\xa6\x95\xf3\x79\xea\x6d\x26\xf8"
+ "\x88\xcf\x27\x8a\x32\x3e\xa4\x9b\x37\x66\xa1\x11\xf9\x5d\x6c\x7f"
+ "\xae\x9f\xeb\x1c\xd1\xb1\xab\x00\xa4\xa5\x3d\x48\x2b\x1f\xd2\xaa"
+ "\x8f\xdb\x82\x6c\x6e\x0b\xca\x7f\xeb\x29\x71\x32\x7f\x56\x7e\x04"
+ "\xdb\xfa\x3c\xbd\xcf\xf0\xc1\x12\x2b\xb0\x2d\x5f\x20\xbd\xdc\x27"
+ "\xc9\x6e\xc4\xf9\x37\x0a\xdb\x40\xf4\x8a\xed\x01\x23\xab\xec\x76"
+ "\xfe\x72\x6b\x6b\xa4\x0f\xe5\x97\xec\x43\xfc\x36\x5d\x14\xea\x65"
+ "\x5c\x15\xe9\x2f\xea\x73\xfc\x36\x6e\xaf\x72\xeb\x50\x6f\xbd\x1b"
+ "\x53\xc6\x0d\x6c\x4c\x31\xe1\x35\x46\xb1\x21\x74\x8e\xd6\x01\xa2"
+ "\x6d\xe5\x83\x8d\x64\x3f\x1c\x18\x3d\x7b\x91\xb6\x71\x34\xde\x6c"
+ "\x4c\x49\xe2\x34\x7e\x36\x05\x26\x7a\x40\x87\x6d\x32\x62\x7b\xa1"
+ "\x61\x05\x18\x4e\x58\x3a\xc0\x87\xba\xa1\xd0\x7d\xce\x4a\x13\x20"
+ "\x5e\xe9\xfd\x94\x3f\x83\x4c\x33\x5d\x78\xb9\x9b\x7e\x4d\x40\xee"
+ "\xa6\x5f\x43\xb4\x13\x72\x37\x3d\xe1\xbb\x28\x77\x1f\xe5\x72\xb9"
+ "\x8b\x18\xb8\x89\xcb\x53\x8d\xc3\xfb\x1b\xa4\xd1\x74\x4a\x03\x92"
+ "\x99\x3f\xfc\x9c\x64\x26\x23\xe5\x7f\xaa\xcc\x7c\xd3\x97\x62\xc2"
+ "\xeb\xbf\x44\x66\x10\x2f\x97\x19\xa2\xd5\x47\xb9\xfd\xa0\xd0\x88"
+ "\xeb\x6a\x79\x57\xb7\xa9\x14\xa6\xa1\xae\x9a\xe3\xb7\x8d\x81\x13"
+ "\x9c\x4e\x33\xcc\xa6\x85\xcc\xdf\x21\x65\x2c\x2b\xfd\x23\x18\xfb"
+ "\x6d\x8c\x39\xbc\xbf\x00\x7f\xcc\xcb\x89\x7c\x3e\xbb\x6a\x61\x1e"
+ "\xbd\x1b\xa1\xf7\x22\x34\x47\x17\x6f\x05\x3d\xcd\x95\xfb\xaa\x6b"
+ "\xf2\xe8\xfd\x08\x8b\x8d\x3c\xec\x43\xbd\xf6\x57\x7c\x60\xf7\x47"
+ "\x31\xf4\x11\x32\x0e\x3a\xe1\x5d\x3e\xaf\xc8\xaa\x76\x93\xef\x82"
+ "\x36\x33\x83\xaf\xf7\xa6\x77\x27\x98\xdf\xaa\xcc\xf9\x93\x4d\x90"
+ "\xe7\xe5\xe4\x79\xbb\x19\xd4\xee\x68\x9a\xb7\x13\x36\x25\xe3\x77"
+ "\xca\xbc\x9d\xf2\x4c\xf9\x4e\x29\xe3\x18\xcd\xf9\xa8\xca\x4d\x91"
+ "\xe1\xe4\x72\xd3\xa6\x92\xad\x0f\x94\x13\xcf\x68\x57\xa6\x0c\x48"
+ "\x60\x08\xe9\x63\xc4\xd4\xe4\xa1\xfe\xe8\xbb\xa4\x99\x53\xf1\x57"
+ "\x42\xba\xfc\x05\x7f\x23\xf0\x97\x9f\xdb\x36\xbc\xf1\x6a\x06\xff"
+ "\xfe\x15\xfb\x7f\x48\xb6\x8d\xeb\xb9\x4e\xde\x09\xb1\x67\xe5\xfb"
+ "\xbe\xca\x19\xed\xca\xbb\x8b\x41\xf8\x00\x7f\x0a\xa8\x6e\xe4\x91"
+ "\x5e\xbc\x4f\x11\xcf\x2a\x7c\xab\xf9\x33\xe8\x93\x30\x76\x31\xd1"
+ "\x7b\x4f\x94\x5f\x5d\x1f\xb3\x3c\x28\xff\x4e\xe5\xef\x5f\x90\x47"
+ "\xe4\xaf\xc9\xf6\xb7\x48\xd4\x3b\x33\x13\xe9\xa0\x57\xd7\x1b\x8a"
+ "\x1e\x4e\x69\x66\xd8\x33\x6d\x86\x47\x8b\x99\x65\xe1\xf0\xcc\x48"
+ "\xf1\xb1\x61\xe2\x0a\xfb\xfd\x23\x4b\x9a\x67\xce\x3a\xe8\xb3\xfb"
+ "\x07\x72\xe3\xdf\x2f\xf9\x62\x98\xfe\xc5\x23\x61\xf7\x7f\xf2\xc5"
+ "\xbc\x9c\xe6\xad\x9b\x47\xb2\x1f\xd3\x76\xd0\x0b\x3f\x3b\xdb\x2d"
+ "\x65\xdd\x31\x06\x62\x3b\xc1\x48\xfe\xd3\x9c\x9e\x77\x18\xf9\x50"
+ "\xbb\xce\x42\x72\xff\xf9\xdc\xf8\x01\xf4\x05\x5f\x3e\x0b\xe9\xfe"
+ "\x67\x13\xa3\xab\x56\x80\xbe\x1f\xfd\xd5\xfe\x67\x2d\xf1\x1f\x9d"
+ "\xea\x06\xd4\x13\x73\x9b\xdb\x09\xf5\x08\xcb\x3e\xcf\x8d\x9b\x95"
+ "\xc7\x3c\xc7\xf3\x5e\x85\xac\x14\x9f\x7d\xeb\x69\x88\x45\x5b\x64"
+ "\x74\x14\xff\x82\xbf\x53\x88\xdc\x24\x99\x1c\xde\x33\x50\xbd\x02"
+ "\x6d\x18\xda\xac\xd2\x27\xd0\x56\x7b\xbf\x82\xfd\x6a\x5b\xfd\xdc"
+ "\x4f\x02\xb6\xfa\x3c\xda\xea\x4a\xb4\xd5\xa5\x89\xd0\x66\xb5\x03"
+ "\xda\x8e\x91\x73\xad\xf1\x9e\xad\x56\xb4\xd9\x9b\xd0\x66\x17\x9f"
+ "\x01\x6e\xaf\x7b\xba\x01\x6d\x6d\xdc\x81\x35\x90\x30\xb0\x16\x6d"
+ "\xf6\x79\xcb\xd5\xfb\xb6\x0a\x9b\xfd\xc6\x1a\xb4\xd9\x6b\xd1\x27"
+ "\x5e\x83\x36\xbb\x27\x84\xcd\x3e\x17\xc6\x1f\x96\xed\x4f\xff\xda"
+ "\x14\xe9\x0d\x89\xc1\x0b\x4f\x80\xb4\xef\x3f\x46\x0e\x53\x4e\x32"
+ "\x0f\x86\xe3\x01\xd1\x9b\xe8\xef\x47\x3e\x9c\x40\x1e\x70\xbf\xd5"
+ "\x33\x32\x73\x00\xc7\x34\x5f\xdc\x8e\xb2\x9f\x9f\x3d\x29\xc5\x15"
+ "\x81\x71\xae\xf5\x1d\xd6\xbf\x2e\x17\xfd\xfe\xdc\x58\x6f\xd5\xcb"
+ "\x69\x55\xe8\x53\xfb\xd0\xf7\x1e\xe8\x4b\x34\x20\x0d\x8c\xae\x8d"
+ "\x96\x78\xa2\xa1\xff\x26\xe4\xe7\x88\xbb\x66\xa3\x0d\x9d\x7c\x60"
+ "\x05\x4c\x19\xa8\xde\x71\x88\x55\xef\x68\xf4\x55\xef\x68\xc2\xb2"
+ "\x71\x3f\x72\x12\x5f\xfe\x15\x30\xcd\xce\x76\x55\x94\xf9\x62\x5f"
+ "\x4e\x73\xc5\xee\x38\x88\xcf\x47\x29\x7f\xeb\x32\x88\xcd\x4a\xf9"
+ "\xc6\x2e\xf8\xf5\x53\x20\x3e\x09\x7e\x7d\x02\xd5\x18\xf7\xd1\x98"
+ "\xcb\xc7\x57\x99\x67\x18\x2f\x70\x7f\x3f\xc0\x37\xcd\x18\x2b\xf3"
+ "\xed\x44\x8f\x1d\x70\x3c\x19\x39\x38\xd6\x72\xbe\x7d\x02\xca\x38"
+ "\x8b\xf4\x8e\x3b\x80\x63\xed\xc0\xb7\x35\xd6\xca\x71\x0c\x8d\xb5"
+ "\x34\xce\x12\xdf\xde\x18\x36\xdf\x1e\xcd\xbb\x32\xbe\xed\x84\x2b"
+ "\xe4\x5b\x53\x80\x6f\x3b\xe9\xbc\x67\x93\xaf\x7a\x67\x72\x30\xdf"
+ "\x76\x9a\x03\x7c\xdb\x99\x82\xcf\x53\x02\x7c\xfb\x6a\x18\x7c\x8b"
+ "\xfc\xf2\xbb\xcb\xb7\xd9\x89\x57\xc8\xb7\x2b\xd5\x37\xaf\x8a\x6f"
+ "\xa8\x6f\x3b\x51\xdf\x76\x6a\xf4\x6d\xa7\x4a\xdf\x76\xa2\xbe\xed"
+ "\x54\xe9\xdb\x17\xc3\xe0\xdb\x55\x1d\xdf\x5d\xbe\xcd\x69\xbf\x32"
+ "\xbe\x95\x5f\xa1\xbe\xa5\xe6\x04\xf8\x56\x8e\xfa\x56\x8e\xfa\x56"
+ "\xae\xd1\xb7\x72\x95\xbe\x95\xa3\xbe\x95\xab\xf4\xed\x93\x61\xf0"
+ "\x6d\xd4\x9f\xbe\xbb\x7c\xcb\x2a\xbf\x42\xbe\x5d\xa1\xbe\xa5\x1e"
+ "\x52\xf1\x0d\xf5\xad\x1c\xf5\xad\x5c\xa3\x6f\xe5\x2a\x7d\x2b\x47"
+ "\x7d\x2b\x57\xe9\xdb\xdb\xc3\xe0\xdb\x7d\x95\xdf\x5d\xbe\xcd\x33"
+ "\x5f\x19\xdf\x2a\xae\x50\xdf\xc6\xeb\x03\x7c\xab\x40\x7d\xab\x40"
+ "\x7d\xab\xd0\xe8\x5b\x85\x4a\xdf\x2a\x50\xdf\x2a\x54\xfa\xb6\x65"
+ "\x18\x7c\x5b\xf4\xf0\x77\x97\x6f\xf3\xc3\xce\x7f\x2a\x7c\x53\x78"
+ "\x46\xfc\xe3\x7c\x63\xb9\xe0\x45\x7f\xf2\xff\x7d\x5a\xf0\x8d\xf8"
+ "\xc5\x79\xd7\x9b\x1b\x5f\x2d\xf3\xcc\x2b\xf3\x8c\xe8\x47\x7c\x23"
+ "\x3f\x92\xf3\x4d\xa7\x4f\x20\x1f\xd2\x8b\xbe\xa4\xe2\x47\x3e\x6a"
+ "\x61\x9e\x13\x96\x9f\x0c\xfa\x91\x5e\xad\x1f\xb9\x52\xed\x47\xfe"
+ "\x22\x88\x5f\x55\x5f\x23\xbf\x24\x99\x5f\x4f\x85\xf1\x23\x57\xbc"
+ "\x17\x86\x5f\xed\x97\xe4\x17\xf2\x26\x61\xa0\x57\xf0\xeb\x0d\xd9"
+ "\xff\xaf\x2b\xfc\x3b\xf9\xb5\x0e\xf9\x45\xfe\xff\x27\x20\xed\x5f"
+ "\x32\x5c\x7e\xe5\x5c\xd2\xff\x0f\xcd\xaf\x72\x18\x1e\xbf\x52\x73"
+ "\x02\xfc\x2a\x37\x79\x71\x4c\x53\xc6\xb3\x00\xbf\xc4\x78\xe6\xd5"
+ "\x8e\x67\x2b\xd5\xe3\xd9\xe5\xf0\x4b\x33\x9e\x7d\xa7\xf8\xb5\x30"
+ "\xec\xfc\xbf\x0f\x63\x71\x1f\xda\x39\x9a\xaf\x8c\xeb\xc6\x38\xd9"
+ "\xcb\x3e\x9f\xeb\xc6\x38\xd9\x3b\x32\x73\xf7\x1a\x48\x1e\xd8\x88"
+ "\x71\x32\xf2\xae\x6a\x0d\xa4\x57\xae\x01\xbd\x7f\x15\xc6\xca\x67"
+ "\x31\x56\x46\xfb\xd4\xff\x37\x4b\xfc\xf1\x3c\x17\xf8\x31\x56\xa6"
+ "\x79\x30\x6c\x6f\x32\xfb\x1b\xc6\xca\x9d\x68\xfb\x3a\xdf\x10\xb1"
+ "\xf2\x19\x25\x56\xfe\x6d\x50\xac\xfc\xf2\x73\x72\xac\x2c\xd3\xbf"
+ "\x4e\x4d\xfb\x27\x7f\x1e\x26\x56\x6e\xbd\x64\xac\x4c\x31\xf2\x7e"
+ "\x8a\x97\xcf\x5b\x46\xef\x93\x6d\xdb\x1b\xe7\xfe\xce\x58\xf9\x3c"
+ "\xc6\xca\x36\x41\xfb\x37\x86\x4d\xfb\xc7\xc3\xae\xff\x20\xdd\x20"
+ "\x7d\x19\x1c\x8b\x90\xce\xca\x18\x34\x80\x63\x10\xcd\x67\xf4\x57"
+ "\xed\xd8\x8e\xf2\xca\xf5\x83\x8f\x49\x1b\x13\x0d\xa4\x1b\xa4\x27"
+ "\xa4\x1b\x7c\x2c\x42\x3b\x88\x63\xd1\xe2\xfa\xe7\x60\x4a\xc3\x73"
+ "\x30\xd9\x1b\x1b\x1c\x23\x3f\x9a\x4f\xfc\x08\xd8\x36\xbf\xd6\xb6"
+ "\x2d\x57\xdb\xb6\xdf\x0e\x1d\x8b\x2e\x65\xdb\x9e\x0b\xa7\x2b\xad"
+ "\x97\xd4\x15\xd2\x11\x3e\x1e\xa1\xbe\xfc\x57\xe8\xca\x1b\xff\x39"
+ "\x5c\x7e\x3d\x11\x76\xfd\xc7\xe5\xf1\x6b\xa7\xfe\xd2\xfc\xda\x09"
+ "\xc8\xaf\xc3\x01\x7e\x05\xc7\xc6\x01\x7e\x89\xd8\xd8\xaf\x8d\x8d"
+ "\x97\xab\x63\xe3\xcb\xe1\x97\x36\x36\xfe\x2e\xf1\x6b\x51\xd8\x75"
+ "\x7e\x97\xc9\xaf\xcb\xd0\xaf\x9d\xa8\x5f\x13\xf4\x2a\x7e\x05\xc5"
+ "\xc4\x2a\x7e\xa9\xf4\x4b\x15\x13\x2f\x57\xc7\xc4\x97\xc3\x2f\x6d"
+ "\x4c\xfc\x5d\xe2\xd7\xe2\xb0\xeb\x3f\x2e\x8f\x5f\xe5\x97\xa1\x5f"
+ "\xe5\xa8\x5f\x13\x72\x03\xfc\x0a\x8e\x85\x03\xfc\x2a\x57\xe9\x97"
+ "\xca\x77\x58\xae\xf6\x1d\x2e\x87\x5f\xda\x58\xf8\xbb\xc4\xaf\x25"
+ "\x7b\xfe\x4e\x7e\x5d\x86\x7e\x95\x93\x7e\x1d\x52\xf1\x2b\x28\x06"
+ "\x56\xf1\x4b\xa5\x5f\xaa\x18\x78\xb9\x3a\x06\xbe\x1c\x7e\x69\x63"
+ "\xe0\xef\x12\xbf\xf2\x32\xfe\x3e\x7e\x55\x5c\x86\x7e\x55\xa0\x7e"
+ "\x4d\x84\x00\xbf\x82\x63\xdf\x00\xbf\x2a\x54\xfa\xa5\x8a\x7d\x97"
+ "\xab\x63\xdf\xcb\xe1\x97\x36\xf6\xfd\x2e\xf1\x6b\x99\xfb\x62\xb1"
+ "\x94\x3a\x86\xf2\x96\x06\xf8\x45\xbc\x19\xc0\xd8\x69\x20\x66\xc7"
+ "\xf6\xf0\xf1\xd3\xf8\xc5\xe1\xe2\x5d\xda\x0f\xe6\xd1\x6e\xfa\x26"
+ "\x44\xf8\x84\x4c\xe3\x13\x9e\xb0\xfc\x1c\x82\x63\xde\xb7\x87\xc4"
+ "\x50\x03\xca\x1c\xc5\xb2\x70\x31\xef\xbf\x5e\x71\x0c\x45\x7c\xa2"
+ "\x38\xca\xbb\x0e\xf9\x24\xfb\xf1\xfb\xff\xce\x39\x8a\x81\xde\x14"
+ "\x69\x3f\xfa\xf1\x25\xcb\x30\x86\x7a\x7a\xb8\x7c\x7a\x26\xec\xf7"
+ "\xdf\x34\x4f\x44\x31\x2f\xc5\x52\xf4\xde\xb1\xad\xb3\x1b\x2a\x37"
+ "\x80\x91\xbf\x7b\xec\x0e\x7e\xf7\xb8\xbb\x0b\x63\xaa\xb5\xc8\xb7"
+ "\x81\x5c\xd8\xd5\x05\xe9\x55\xcf\x89\x98\x4a\x89\xa7\xda\xdc\x1e"
+ "\xfe\xee\xd1\xe1\x75\xc2\x2c\x27\xf3\x34\x20\x3c\xc5\x51\xc7\xf3"
+ "\xde\x00\xd2\x95\xd2\xd3\x10\x4b\x3c\xc0\x18\x8c\xf3\x43\x1d\x43"
+ "\xd5\xab\xdf\x37\xae\x08\x17\x43\x5d\xfa\x7d\x63\xdd\x39\x11\x3f"
+ "\xf1\xf7\x8d\xff\x23\x62\xa8\xe5\x61\xdf\x7f\xcc\xf9\x99\x98\x6f"
+ "\x20\xda\x3b\x52\xbc\x80\xf2\xf4\x79\x7c\x8f\x98\xd7\xf3\xee\xda"
+ "\x51\x46\x31\x2d\xc5\xb3\x8e\xe2\x56\xa8\xdc\x0c\xc6\xfe\xbe\xdc"
+ "\x78\x8c\x51\x63\xbd\x68\xeb\x5e\x3e\x2b\x68\xbf\xe5\x0b\x30\xba"
+ "\x56\x59\xf8\x5a\x19\x8a\x65\x49\x57\xf8\x3b\xc7\xa7\x61\x72\x5d"
+ "\x07\x4c\xe1\xfa\x81\x7a\xe1\xad\x7e\x39\xcd\x1f\xbb\xa3\x89\xf4"
+ "\x64\xd6\x29\xe6\x21\x1e\x90\x7e\x7c\x74\x8a\x78\xf3\x0b\x28\xfd"
+ "\x44\xf0\x86\xf3\x45\x0a\x7e\x17\x3c\x54\x37\xfe\x14\x86\x3f\x47"
+ "\x2f\x8f\x3f\x6b\x83\xf9\x73\xe0\x4a\xdf\x07\x2b\xeb\x23\xd7\xa6"
+ "\x48\x07\xe4\xf7\xc1\x6f\x3c\x39\x5c\xfe\xac\x38\x7a\x65\xfc\xd9"
+ "\x09\x57\xc6\x9f\x9d\x26\xfe\x6e\x31\x88\x3f\x3b\xa7\x08\xfe\xec"
+ "\x4c\xa6\x58\x29\xc0\x9f\xaf\x2e\x93\x3f\x9a\x18\xe9\x3b\xc5\x1f"
+ "\x4b\xd8\xf9\x9f\x4b\xf0\xe7\x0a\xf5\x67\x67\x23\x7f\x87\x18\xcc"
+ "\x1f\x59\x7f\x76\x36\x51\x6c\x14\xe0\xcf\x17\x97\xc9\x1f\x4d\x4c"
+ "\xf4\x9d\xe2\xcf\xca\xb0\xf3\xdf\x17\xe7\x4f\xf9\x15\xea\x4f\xb9"
+ "\x89\xbf\x2b\x0c\xe2\x4f\xb9\xac\x3f\xe5\xc9\x14\x0b\x05\xf8\xf3"
+ "\xc9\x65\xf2\x47\x3b\x7f\xfa\x5d\xe2\xcf\xaa\xda\x2b\xe4\xcf\x15"
+ "\xea\x4f\x79\x23\x7f\x27\x18\xcc\x1f\x59\x7f\xca\x9b\x28\xf6\x09"
+ "\xf0\xe7\xed\xcb\xe4\x8f\x26\xe6\xf9\x4e\xf1\x67\x75\xd8\xfd\x9f"
+ "\x2e\xce\x9f\x8a\x2b\xd4\x9f\x0a\x13\x7f\xf7\x17\xc4\x9f\x0a\x59"
+ "\x7f\x2a\x92\x29\xd6\x09\xf0\x67\xcb\x65\xf2\x47\x13\xe3\x7c\xa7"
+ "\xf8\xb3\xe6\xe4\xa5\xde\x17\x29\xbe\xb3\xfa\xbd\xec\x00\xfa\x6f"
+ "\xe4\x3f\x93\xef\xdc\xe6\x3e\x0a\xde\xb5\x82\x37\x95\x5f\x83\xb1"
+ "\x4a\xe6\x0d\x7f\x27\xbb\x4a\xbc\x93\xe5\x7e\xdb\x8e\xbb\x66\xb3"
+ "\x6d\xfa\x04\xf2\xcb\xf8\x7b\x57\xfe\x6e\xe2\x7d\xca\x3b\x3a\xa0"
+ "\xf2\xdf\x28\x46\x45\xdf\x1b\x28\x4e\x2d\x3d\x33\x0c\xbf\xed\xe9"
+ "\x70\x7c\xb9\xf4\xbb\x89\x3a\xd5\x3a\x3e\x25\xf6\xfc\x56\xf9\x32"
+ "\xec\xf7\xae\xd6\xb0\xfb\x3f\x5e\x9c\x2f\xe5\x30\x3c\xbe\xe0\x78"
+ "\xb3\x23\x35\x47\xf0\xe5\x13\x0d\x5f\xca\xa7\x0c\xa8\xc6\x9d\xcb"
+ "\xe7\x8b\x66\xbc\xf9\x4e\xf1\xa5\xd0\x10\x36\xd6\x44\xbb\x44\x3c"
+ "\xa1\xf5\xdd\xbb\x9f\x86\xe4\xca\x0e\x48\x1f\xf8\x5b\x62\xf4\x5c"
+ "\xb4\x73\x03\xab\x12\x0d\x6d\x68\xe3\xb6\xba\xd9\xe7\x71\xee\x91"
+ "\x99\x1f\x7e\xec\x82\xb6\x3c\x27\xf4\x6f\xcc\x85\xea\xb3\xb4\x56"
+ "\xfd\x28\x54\x14\x52\x2c\xff\x1b\xf8\xe8\xd4\x97\x30\xf7\x20\x1b"
+ "\x70\xf4\x1c\x05\xfb\xe6\xdf\x00\x5b\x95\x12\xdd\x80\x30\x4b\x91"
+ "\x86\xe7\xa4\x42\xfb\x37\x18\x8f\x4e\x2c\x06\xe3\xec\x1e\xe6\x69"
+ "\xeb\xf9\x10\xf6\x63\x5d\xef\x17\x03\x10\x7d\x89\x27\xd5\xcf\x51"
+ "\xfc\xf9\xb6\xe0\xc9\x3c\xc1\x93\x37\x54\xf1\xa7\x09\xf3\xbb\xac"
+ "\xc8\x8f\x0b\x1a\x7e\x9c\xea\x06\xa4\xef\xc8\xb9\x6e\xe4\x87\x5b"
+ "\xe1\xc7\x17\xb0\xf5\x79\xe2\x87\x73\x70\xbd\x6b\xbf\xcc\x8f\x3a"
+ "\xb2\x5f\x56\x30\xee\x53\xe2\xcf\x73\x2a\x7e\x28\xdf\x64\xa9\xf9"
+ "\xa1\xc4\xfe\x1b\x91\x1f\x1b\x02\xf1\xe7\x37\x18\x7f\xee\xc3\xf8"
+ "\xb3\xf4\x8f\x20\xed\xdb\x3a\x5c\x7e\xac\x0b\x3b\xfe\x2b\xbc\xa0"
+ "\xb1\x65\x20\x6e\x47\x19\xf1\xc1\x51\x7c\x18\x88\x27\x34\x9e\xf8"
+ "\xfe\x96\x68\x28\x29\x42\xdd\x71\x8e\xcc\xec\x67\x18\xf3\x63\xbc"
+ "\xef\x58\xfc\x1f\x40\x73\x06\x82\x07\x03\x03\x0e\xd7\x51\x20\xda"
+ "\xdb\x37\xff\x07\xe7\xc3\x39\xa9\xc8\xbc\xc4\x0d\xd2\x04\x94\x43"
+ "\x8c\xf7\x8d\x4b\xe9\xbb\x5c\xb4\x6d\xfb\x57\xc0\x94\xd9\x56\xe6"
+ "\xa1\xd8\x94\x74\x88\xd6\x9e\x90\x5d\x6b\xb3\xbe\x07\x34\xaf\x33"
+ "\x10\xfb\x72\xda\xfb\x45\x00\x64\xdf\x88\xee\x91\xeb\x03\x7c\xa2"
+ "\xf5\x24\x9c\x57\x8f\x5d\xc6\x3a\x57\x35\xbf\x16\x3b\x2f\x6b\x7d"
+ "\x72\xbf\x3c\x5f\x50\xa7\xcc\xa9\x5d\xe9\x7c\x81\x32\xa7\x76\x5e"
+ "\xac\x27\x29\xfd\x33\xea\xcf\xb0\xf9\xb5\x3e\xf3\xf2\xf8\xb5\x13"
+ "\x86\xcf\xaf\xbe\x10\xfc\x5a\xef\x1a\xca\xaf\x9d\x26\x15\xbf\x9a"
+ "\x02\xfc\xda\x39\x45\xf0\x6b\x67\x72\x80\x5f\x3b\x53\x2e\xcd\xaf"
+ "\x8b\xac\x6f\xfd\x87\xe7\xd7\x86\xb0\xf1\x8f\x86\x5f\x57\xa0\x5f"
+ "\xe7\x43\xf0\x6b\x63\x63\x08\x7e\xa9\xf5\xcb\xab\xe2\x97\xac\x5f"
+ "\x3b\x55\xfa\xb5\xf3\x32\xf4\xeb\x22\xeb\x5a\xff\xe1\xf9\x55\x1c"
+ "\x76\xfd\x4f\x30\xbf\xca\xaf\x40\xbf\x3e\x0d\xc1\xaf\x4d\xd9\x43"
+ "\xf9\x55\xae\xd2\x2f\xf4\x2d\x06\xf9\x55\x2e\xeb\x57\xb9\x4a\xbf"
+ "\xca\x2f\x43\xbf\x2e\xb2\x9e\xf5\x1f\x9e\x5f\x9b\x2f\xba\xfe\x47"
+ "\xc5\xaf\x2b\xd0\xaf\x77\x42\xf0\xeb\x05\x08\xc1\x2f\x95\x7e\xa5"
+ "\x1e\x52\xf1\x4b\xd6\xaf\x72\x95\x7e\x95\x5f\x86\x7e\x5d\x64\x1d"
+ "\xeb\x3f\x3c\xbf\x4a\xc2\xfa\x7f\xc1\xfc\xaa\xb8\x02\xfd\x2a\x0d"
+ "\xc1\xaf\x92\xc3\x43\xf9\x55\xa1\xd2\xaf\xf1\xfa\x00\xbf\x2a\x64"
+ "\xfd\xaa\x50\xe9\x57\xc5\x65\xe8\xd7\x45\xd6\xaf\xfe\xc3\xf3\x6b"
+ "\x4b\xd8\xf9\x6f\x35\xbf\xfa\x77\x29\xfe\xe1\xc1\x60\x7e\xa1\xbf"
+ "\x1e\xdf\x29\x62\x2b\x85\x5f\xe1\x7d\xc3\xad\x8b\x07\x79\x75\x26"
+ "\xe0\x1b\x72\x3e\xc9\xef\x29\x88\x3f\xe4\x23\x92\x4f\xd8\x5f\x2d"
+ "\x78\x44\xef\x00\x2f\xea\x17\x5e\xce\xf7\x4f\x57\xc0\x27\x25\xae"
+ "\xfa\xd6\xf9\xf4\x97\x2b\xe1\x53\x69\xd8\xef\x9f\x82\xf9\xa4\x8c"
+ "\x5b\x97\xcb\xa7\x50\x63\x56\x99\x7e\x28\x9f\xca\x4d\x01\x3e\x89"
+ "\x71\x8a\xc6\x2e\x1a\xab\x82\xf9\x74\x91\xf1\xea\x72\xbe\xbf\xf8"
+ "\x87\xe7\xd3\xb6\xf0\xf6\x4f\xe2\x67\x9b\x1f\xae\x91\xfc\x47\xf1"
+ "\xb2\xe3\xd5\x8a\x69\x91\x98\xc6\xbf\xb5\xa9\x91\xf3\x7c\x95\x40"
+ "\xdf\x69\xdb\xe3\x75\x79\xb4\x9f\x2e\xc1\x8c\x50\x60\xe2\xb7\x81"
+ "\x19\xfb\x23\xe0\x24\x28\xc3\x74\x7b\xec\x36\xf3\x08\x84\x6f\x65"
+ "\x95\x33\xcb\x30\x6d\x24\xc1\xb2\x6d\x7a\xfe\xde\x31\x5e\xc7\xf7"
+ "\xbe\x91\xe1\x75\x40\xf0\x04\x8b\x70\x06\x19\x8e\x9f\x4d\xcd\x24"
+ "\x09\x1a\x86\xb6\x2d\x4a\x86\x31\xf9\x6d\x60\x52\xb7\x31\x56\x67"
+ "\xe6\xb8\x64\xb8\x68\x9f\xed\xd3\x26\x82\xf5\x6d\xd3\x27\xab\xe1"
+ "\xd8\xc3\x40\x78\x15\xb8\xab\x64\x7c\x29\x41\xfd\x1d\x07\x10\xbb"
+ "\xcd\xc4\xf1\xc5\xf6\x48\x20\xb7\x2f\x86\x45\xcf\xc8\xe1\xf0\x3a"
+ "\x7d\x6a\x10\xfc\x08\x50\xf7\x23\x96\x8d\x48\xcb\x90\xe1\xd2\xfc"
+ "\x12\xa4\x11\x2c\xa6\xeb\xd5\xb4\x96\x61\xe3\x14\x3a\x22\xaf\xf5"
+ "\xea\xfe\xfa\xb0\xff\x07\x44\x1b\xe3\x7d\x3b\x26\xe6\xc8\x7d\x99"
+ "\xa2\xae\x97\xe0\xb0\xdc\x24\x99\x27\x46\xec\x47\xfa\x20\xbe\xaa"
+ "\x85\xb9\x0a\x5c\xa9\x0f\xae\x47\x1e\xd9\x1d\x16\x00\xb9\xdf\xa3"
+ "\x58\xe5\x23\x09\x72\xdf\xcd\xc1\x74\xd4\x39\x15\x3a\x22\xff\x08"
+ "\x76\x34\xc2\x64\x28\x78\x7d\x36\xfe\xcd\xbe\xe8\xb7\xcd\x7b\x35"
+ "\xc9\xc5\x89\x6e\x20\x59\x26\xd8\xab\x65\x9c\x99\xa2\xcf\x46\x38"
+ "\x30\xc8\x6b\x3d\xe5\xd9\x65\x38\x5e\xb7\x2f\x7a\x81\xd9\xa7\xd3"
+ "\xcf\x1e\x0a\x6b\x50\xc3\x5e\x23\x60\x33\x5d\x08\x9b\x3d\x14\xd6"
+ "\xa8\x86\xbd\x56\xc0\x3e\x7a\x10\x61\x73\x86\xc2\x7a\x47\xab\x60"
+ "\xaf\x13\xb0\xb3\xf3\x10\x36\x77\x28\xac\x49\x0d\x9b\x28\x60\x73"
+ "\xa8\x0d\x8b\x87\xc2\x9a\xd5\xb0\xd7\x0b\xd8\xb9\x89\x08\x9b\x37"
+ "\x14\xb6\x4c\x0d\x7b\x83\x80\xcd\x6a\x47\xd8\x7c\x2d\x6c\x03\x97"
+ "\x03\x18\x27\xcb\xc1\x8d\x02\x76\x5e\x39\xc2\x5a\x42\xf4\x2d\x82"
+ "\xe3\x15\xb0\x49\x02\xf6\x91\x02\x84\x2d\x08\xc1\x0b\x35\xec\x4d"
+ "\x02\xf6\xe9\x74\x84\xb5\x86\xe0\x85\x1a\x76\x8c\x80\xcd\x4d\x42"
+ "\xd8\xa2\x10\xbc\x50\xc3\xde\x2c\x60\x9f\x38\x8e\xb0\xc5\x21\xe8"
+ "\x1b\x80\x8d\x5e\x54\x82\x30\x25\x48\x93\xf6\x10\xb4\x55\xe3\x1c"
+ "\x2b\x70\x3e\x95\x8a\xf0\x65\x21\x68\xab\x86\x1d\x27\x60\x97\x9c"
+ "\x42\xd8\xed\x43\x61\x41\x77\x40\xd0\xf7\x6e\x99\xbe\xb7\x08\xf8"
+ "\xbc\x2a\x84\x2f\x0f\x41\x5f\xca\xb7\xcb\xba\x96\x2c\x60\x17\x36"
+ "\x22\x6c\x55\x08\xfa\xaa\x61\x6f\x15\xb0\x6b\x4d\x08\x5b\x13\x82"
+ "\xbe\x6a\xd8\xdb\x04\xec\x72\x92\xc9\x3d\x21\xe8\xab\x86\xbd\x5d"
+ "\xc0\x3e\x0b\x08\x5b\x1b\xa2\xbd\xe3\x54\xb0\x29\x02\xd6\x42\xed"
+ "\xad\x0b\xc1\x0b\x35\xec\x1d\x02\xd6\x7a\x14\x61\x1b\x43\xf0\x43"
+ "\x0d\x7b\xa7\x80\x7d\x8e\xf4\xb8\x29\x04\x3f\xd4\xb0\x77\xb1\xe8"
+ "\x55\x4e\xd9\x2e\x1e\xd4\xc2\x22\xef\x85\x4d\xb4\x41\x2a\x8b\x5e"
+ "\x5d\x86\xf7\x04\xc7\xf7\x45\x1c\xc4\x67\xf3\xde\x43\xf6\x46\xb6"
+ "\x61\xe3\x59\xf4\x33\x9d\x32\xbe\xc3\x43\xea\xb6\xe9\xd5\xb0\x13"
+ "\x58\xf4\x56\x90\x61\x8f\x0c\x85\x35\xa8\x61\x27\xb2\xe8\x75\x4a"
+ "\x3b\x8f\x0e\x85\x35\x0e\xc2\xb2\xe8\xf5\x35\x08\x73\xac\x5e\xb6"
+ "\x8d\xaa\x76\xde\xad\xc2\x37\x89\x45\x6f\x34\xcb\xf8\xec\x43\xf1"
+ "\x99\xd4\xb0\x77\xb3\xe8\xd2\x83\x32\x6c\xcb\x50\x58\xb3\x1a\xf6"
+ "\x1e\x16\x5d\xec\x92\x61\x5b\x87\xc2\x96\xa9\x61\x27\xb3\xe8\xcd"
+ "\x8d\x32\xec\xf1\x21\xb4\x27\x3d\xb0\xa1\x2f\x20\x6c\xd2\xbd\x2c"
+ "\xba\x24\x5b\x86\x0d\xf2\x03\x54\xe3\xf0\x7d\x82\xef\x85\xd9\xc8"
+ "\x77\xfe\x4d\x06\xda\xfc\x93\xa1\x7c\x0c\xeb\x9d\x70\xd5\x59\xa9"
+ "\xc2\x2b\xc6\x24\x65\x6f\xfa\x4a\xde\x37\x7f\xdd\xbc\xbc\x2c\x37"
+ "\xf3\xaa\xd3\x76\x4b\xac\x7d\xa2\x1b\xf4\x7c\xbf\xe3\xd8\xdd\xe5"
+ "\x4e\x4c\x77\xdd\x34\xaf\xac\xaf\xb2\xd2\xe0\xd4\xdd\xc9\xf7\x03"
+ "\xc6\xfb\x04\x27\xac\xca\xa1\xfb\xdd\x36\xe6\xa1\x3d\x6f\x7d\xbb"
+ "\x16\x9a\x1c\xfe\x1e\xda\xfb\xca\x83\x38\x3c\x5d\x56\x88\x30\x15"
+ "\x02\xbd\x6b\xe9\x77\x14\xf7\x00\xe2\x7f\x82\xad\xb5\xa4\x63\x1b"
+ "\xcc\x58\x5f\x7e\x07\x3e\xf3\x36\xa0\x0f\x84\x63\x65\xba\xbd\x90"
+ "\xf6\x13\xaa\xac\x70\xc5\xd6\x98\xd9\x8b\x8b\xba\xad\x5b\xe1\xe6"
+ "\xb3\x52\x25\xb7\x03\x7c\x6f\x91\xf3\x96\x07\xfd\xb1\x0b\xd3\x69"
+ "\xcf\x11\x56\xfb\x8a\x49\xec\x47\x52\xf9\x3e\x6f\xb3\x8d\xb5\xb3"
+ "\xa4\x79\xd9\xfe\xfe\xed\x65\x74\xf6\x81\x7d\xeb\x59\xe8\x50\xe5"
+ "\xb9\xae\x7f\x85\xef\x55\x82\x7d\xca\x0e\xb9\x87\x87\x0d\xe2\x59"
+ "\xf5\xc2\x5c\xec\x57\x0f\xfa\x6b\x99\x72\x1f\x3d\x4e\x5d\x44\xbe"
+ "\xb8\x7f\x59\xef\xd4\x8d\x30\xca\xf7\x46\xa7\xce\xd4\x29\xdf\x27"
+ "\x29\x7b\xa9\x84\xde\xdb\x65\x61\x2a\xf6\x2d\xc3\xbf\x3f\xd7\x40"
+ "\xfe\x25\xed\xb3\xc6\x62\x17\xa6\x9a\xc6\xd0\x99\x16\x2f\x1f\xc1"
+ "\x3a\x33\xc4\xfe\x98\x2f\x6f\xc2\xdf\x78\xf9\xd7\x25\xff\x32\x82"
+ "\xe1\x7c\x4b\x9a\xd7\xce\xaa\x2a\x13\xa9\x6f\x5b\x7d\xcc\x8f\x78"
+ "\x2d\xac\xdc\x5e\xe6\x28\xee\x06\xb1\xaf\xf4\xcb\x3f\xe5\xfb\xdc"
+ "\x10\xed\x90\xbe\x2c\xca\x5e\xc6\xeb\xaa\xae\x31\xab\xdb\x95\x36"
+ "\xe9\xee\x7b\x26\xdf\x7b\xdf\x0f\xa6\xdc\xbf\xec\xe9\x67\xf2\x97"
+ "\xaf\x78\xd6\xb2\xf2\xb9\x55\x05\xab\xd7\xac\xb5\x3e\x5f\xb8\xae"
+ "\x68\xfd\x86\x8d\xc5\x9b\x36\xd3\xa6\x2d\x83\xed\xdf\x9f\xa1\x73"
+ "\x4b\x80\x75\x3c\x8c\x75\x54\xf1\xfd\x9d\x28\x4d\xd0\xbe\x4a\xaf"
+ "\x37\x85\xf6\x6b\x1d\xe8\x69\xd2\x1e\xcb\x3d\x52\xd5\x32\xda\xef"
+ "\x19\x79\xac\x73\xd4\x3d\x62\xa7\x3d\xf8\x3b\xa5\xaa\x9c\x36\xd7"
+ "\x23\x76\x3a\x03\xa2\x39\xb1\x1b\x92\xc7\xd1\x3e\xfd\x55\x66\xca"
+ "\x6f\xb8\x0d\xa0\x05\xcb\x86\xc2\x39\xce\x08\x89\xaf\x5d\xcb\x5c"
+ "\x7b\xae\x65\x3d\x84\x7f\xcf\x5e\xd6\xed\x7a\xc1\x02\xbb\xf0\x19"
+ "\xe5\xcc\xd8\x25\x55\x5f\xd3\x9c\xc4\xf7\x32\x4f\xaa\xdf\xcb\x3a"
+ "\xb7\x5f\xcb\x3a\x5f\xdc\xcb\x7a\x1a\xae\x65\xce\xe4\x3d\x10\xd3"
+ "\x57\x59\xd5\xea\x94\xaa\x4c\x5c\x66\x31\xdf\x1f\xfd\xb2\x7d\x37"
+ "\xe6\x4d\xf4\x42\x44\x03\x3e\x63\x9a\xbb\xd9\x24\xda\xfd\xab\x2f"
+ "\x3d\x91\xd8\xbf\x43\x6c\xa0\x40\xb7\x0b\xeb\x11\x3c\xaa\xbe\xbf"
+ "\x05\x47\x51\xac\xcf\xe5\xf0\x74\x80\x53\xaa\x9e\xd2\xf0\x35\xaf"
+ "\x2f\xde\x51\xdb\x03\x84\xef\x97\x85\x9e\xc8\x75\x37\x30\x2f\xc2"
+ "\x26\xfa\x5f\x28\xd0\x61\x7d\x6e\xc4\xed\x56\xf7\x27\x65\xc5\xea"
+ "\x22\xd3\x9a\xf5\x05\x05\x77\x44\x43\x0a\xff\x0d\x3a\x3f\xa2\x08"
+ "\xf1\xc1\x6b\x7b\x59\x0b\xf6\xd3\x8e\xfd\x6d\x3d\x81\xde\x33\xca"
+ "\x0b\x60\x9f\x6a\x10\x6f\x35\xa6\x1f\xc3\xfb\x63\xd8\xf6\x56\x71"
+ "\xe6\x40\xfd\xef\x58\x65\x75\x06\xb6\xb3\x95\xf6\xa8\xa5\xbd\xa7"
+ "\x7a\x37\xe6\xe8\xb0\xdf\x7b\x10\xae\xd5\x74\x03\xdc\xda\x25\xed"
+ "\xba\x06\xdb\xd1\x84\xf7\x04\xff\x2e\xf1\x11\xe1\x5b\x44\xbf\xea"
+ "\xf9\x3e\x43\x48\x2b\xfb\x81\x6b\x59\x55\x5f\x65\xb5\x8b\xf6\xa6"
+ "\xe3\x7b\x76\xe3\x33\xd2\xa5\x15\x61\x6b\x7a\x4b\x73\x74\x18\x4b"
+ "\xe9\x1a\x06\x71\x56\xdb\xa9\x4d\xd4\x0e\x8a\xe7\x3e\x42\xef\xc9"
+ "\x3f\x90\x0b\xe3\x3d\xa0\xfb\xa8\x13\xa0\x6e\x2f\x6b\xc4\xab\x0e"
+ "\xaf\xda\x0f\x31\xef\x0f\x78\xb5\x62\xfa\x71\xfc\xfd\x10\x7f\xff"
+ "\xd0\xc9\xdf\xbf\x25\x52\xbb\xd7\x95\xb0\xee\x89\xb5\x70\x0b\xe1"
+ "\x47\xd9\x7a\xbc\x43\xaa\x37\x52\xdb\x69\x1f\x48\x16\xbd\x6b\x7b"
+ "\xf0\x7e\x79\xbb\x3d\x80\xf9\x20\xd5\xc4\x88\x5f\xf5\x55\x93\x83"
+ "\x57\x91\x7c\x7f\x0c\x61\x3b\xe5\xfb\x76\xbc\x4e\x5d\xfa\xd2\xe2"
+ "\x0b\x77\xbd\x92\x79\xf9\xb0\x97\x75\x6d\xbf\x3c\xb8\xd7\x00\xa4"
+ "\x1f\xe7\xe2\x55\x13\x9c\xfe\x63\x8b\x48\x7b\x63\xb2\x78\x7e\xc3"
+ "\x2c\xff\x16\x80\xb4\x1f\xe9\xb4\x1f\xf1\xef\x3f\x28\xd2\xf6\x1f"
+ "\xc1\x91\xc6\x8b\xf7\x06\x4d\xfd\x84\xb3\x8e\xf8\x39\x40\xe7\x1f"
+ "\x20\x2f\x9d\xd2\xae\x1c\xe2\xd1\x6e\x21\x5b\x3a\x3f\xe3\x69\xd9"
+ "\x28\x5b\x75\x01\xf9\xa9\x99\x11\x2c\x3f\x35\x69\x1a\xf9\xa9\x21"
+ "\x5b\x84\xfa\x52\xd7\x20\xe4\xe5\x58\xef\x0b\xf9\xf8\x5c\x33\x19"
+ "\xf1\x1c\x33\x2d\xe1\x38\xb8\x3f\xb2\xfb\x2c\xc6\x7d\x16\xd0\x93"
+ "\x7d\xe9\x91\x6a\x5e\x22\x99\xa5\xba\xe5\x7a\x45\x5b\xb0\x7d\x98"
+ "\xd6\x48\xed\x5b\x8b\x78\xf1\xb9\x09\xe1\x1a\x1d\xf0\xa5\xd2\x36"
+ "\x5e\xa6\xf2\x39\x94\x47\xb9\xbd\x84\x93\xca\xb1\x40\xbf\xb2\xa9"
+ "\x8c\xa8\xfb\x95\xfb\x31\x9d\xe2\x44\x28\xbd\x00\x11\xb4\x56\x99"
+ "\x64\x92\x7e\x1d\xde\x34\xd4\xa5\x4c\xf0\xf7\xe5\x02\x86\xfa\x69"
+ "\xa8\x6f\x51\x1d\xd2\x2b\x49\x13\x4a\x20\x8d\xf0\x91\x4d\xc7\x7e"
+ "\x38\x1b\x48\x17\x05\x2e\xf9\xfc\xdf\x5d\xd9\x1f\x5a\x81\xd7\x53"
+ "\x4f\xed\xc1\x7c\x55\xbd\x7b\x28\x0e\xdc\xbd\x59\xf4\x15\xeb\x6a"
+ "\xc2\xf2\x87\xa9\xef\x44\x4f\xcc\x3f\x8a\x78\x8a\x29\x8f\xef\xa5"
+ "\x2d\xfa\xd3\x44\xfb\xad\x12\x3d\x08\x9e\xce\x34\x11\xfb\xef\x55"
+ "\x1f\xe0\x74\xc3\xf2\xc4\x0f\x86\x75\x10\x8e\x52\x2f\xf3\x32\xb4"
+ "\x47\x6f\x6d\xf6\xe0\xb8\xfe\xea\x85\x60\xfe\xbc\xd2\xae\xe6\x0f"
+ "\x96\x3b\x8c\xe5\x5b\x18\xf6\x91\xec\x09\xd6\x19\x4f\xe7\x28\x60"
+ "\x5a\x8d\xbf\x12\x71\x6c\xf0\xf0\xb9\x11\xc4\x73\x1a\xdb\x52\x43"
+ "\x78\xb0\x3d\x2d\x02\xd7\xab\x49\xef\x96\x04\xf3\x5a\xc6\xd7\x44"
+ "\x3c\xe7\xfa\xbc\x99\xf7\x09\x6d\xd7\xab\xbf\xae\x17\x79\x47\x11"
+ "\xe6\x28\x1b\xc8\x04\xda\xbf\x54\x8c\x25\x3c\xef\x48\xe9\x37\x9c"
+ "\xbf\x2d\xc2\xae\xbd\xfa\xc7\x75\x5b\x58\x77\xa0\xdd\xaf\x96\x2b"
+ "\x7b\xc0\xca\xed\x3e\x42\xf5\xb1\x8d\x8b\xf9\xb8\x4a\x75\x50\x79"
+ "\x19\x5f\x3e\xe1\x53\x68\x35\x01\xdb\x21\xe8\xf5\x4a\x2d\xa6\x37"
+ "\x91\x2c\x72\xba\xa1\x1d\xed\x2d\x25\x59\x7c\xb5\x0a\xcb\x1f\xdb"
+ "\x45\xcf\x1b\xf9\xb3\x89\xdb\xd8\xc1\xfc\x57\x3e\xa6\x7c\x07\xc6"
+ "\xd9\xbb\x57\xa1\x2c\xf9\x01\x6e\x49\x80\x34\xb7\x8d\xf7\xed\x90"
+ "\xfb\x85\x0c\x5d\x33\x7a\x58\xd4\x4e\xa4\xd1\xd1\xbe\xca\xd7\x26"
+ "\xa3\xed\x2f\xa2\xb6\xa2\xbd\x3e\xc2\xde\xca\x05\x6a\x33\xda\x33"
+ "\xb9\x7d\xaf\xfd\x54\xe6\xfd\x11\xea\x23\xd1\x73\x82\xb0\x7d\x98"
+ "\xf7\xe3\x59\xd4\xf6\x40\xbf\x5f\x2b\x53\xd3\x98\xf7\x1b\xf9\x40"
+ "\xfc\x22\xbe\xa8\x70\x92\xec\xd7\x20\x2e\x79\xaf\x36\x21\x1b\x44"
+ "\xeb\x9a\x6b\xd9\x71\x82\x0f\xc0\xee\xe1\xfb\xdb\x6d\xc5\xba\x27"
+ "\x5a\x81\xce\xb8\xd0\xd1\x3e\xbe\x88\xf7\x10\x9d\x57\x83\x38\x8e"
+ "\x12\x4d\xb1\x2d\xb1\x24\x8f\xf8\x7c\x5c\x2e\x17\x83\xe3\x79\x2a"
+ "\x5e\xe9\x01\xfd\xdf\xe3\x0b\x96\xaf\x3d\x5a\xfd\x27\x7e\xd7\xf8"
+ "\x4b\x33\x81\xcb\x43\x21\x98\xce\x49\x7b\xf6\xc9\x63\x87\xcc\xeb"
+ "\x3d\x5f\x34\xa3\xbe\xa8\x70\x14\x69\x78\x7d\x94\xcb\xe3\xc6\xd9"
+ "\x74\xde\xaf\x0e\xcb\x1e\x95\xf1\xf0\x3e\x73\x79\xb2\x71\x19\x38"
+ "\xce\x36\x62\x3f\x07\xe5\xe0\xb5\x76\x99\xcf\xc7\x35\x34\x51\x6c"
+ "\x57\x12\x9d\xb7\x40\x36\x09\x7d\xcc\x07\xfb\x06\x02\x76\x89\x78"
+ "\xef\xe7\xbc\xdf\x53\xdc\x20\xc6\x5b\xd9\x6e\xed\x11\xf9\xd7\x06"
+ "\xc9\x30\xb5\xe5\x17\x5c\x7e\xa9\x2d\xa5\x8b\xa9\x2d\x47\x79\x3b"
+ "\x4a\x4d\x70\x4e\xfa\x71\x32\xd5\x8f\x65\x0f\xcb\xfa\x2a\xe3\x7a"
+ "\x6d\x3b\xe1\x7a\x11\x6d\x15\xb5\x09\xeb\x36\x72\xfb\x37\x93\xcb"
+ "\xc1\x4b\x72\xdb\x5b\x3d\x36\x2a\x5b\x53\xfc\x8d\xc4\xcb\xa2\x1f"
+ "\xb3\xbb\xc7\x23\xf6\x64\x8e\xc6\xf2\x07\x4d\x4f\x13\xfc\xbe\x4e"
+ "\xb2\xd1\xa6\x27\xf9\xfd\x09\xd3\x42\x94\xd5\xb3\xa0\x47\x7c\x06"
+ "\x92\x51\x45\x2e\x7a\xa4\x7d\x6f\x93\xbf\x8e\xb4\x3e\x84\x3e\xd2"
+ "\x41\xa2\x37\xc9\x32\xfa\x48\x93\xfb\x2a\x7f\xdc\xa3\xc8\x2d\xd6"
+ "\x53\x47\xb4\x17\xfc\xd9\x3b\x09\xe5\xf8\x68\x40\xb6\xf6\x4e\x92"
+ "\xe9\x78\x10\xe9\x68\xc0\xfa\x7e\x2d\xf7\xeb\x20\xc2\xa3\x2f\xb6"
+ "\xef\x4d\xb9\xed\xb5\x32\xfc\x1c\x85\x0f\xb2\xae\x1e\xdf\x45\xf6"
+ "\x97\xf3\x60\x6f\xa7\x5c\xb6\x49\xae\xeb\x8c\x02\x4b\x3e\xa2\xd8"
+ "\x6b\x7d\xef\x19\xb2\x83\x13\x91\xf7\xdc\xf6\xf1\xb3\x9c\x44\x1a"
+ "\xe9\x8e\xa8\x63\x5f\x35\x97\x43\xf4\x7b\x02\x72\xb4\xf7\x98\xc6"
+ "\x3e\x91\x2d\xae\x69\x43\x1c\x64\x4f\x49\x96\xc8\xa6\x52\xbc\x80"
+ "\xf8\xf6\xc8\xfa\x23\xb7\xf9\xf5\x3b\x82\x65\x65\xdf\x26\x94\x95"
+ "\xf1\x01\xdc\xaf\x27\x86\x1a\xe7\x1a\x84\x0d\xac\x13\x65\x5e\x5f"
+ "\x29\xf7\xed\x90\xe8\x9b\xfc\x4c\x74\xdb\xca\xe9\x36\x5e\x45\x47"
+ "\xa4\x5b\xed\x3e\x19\xfe\x28\xd9\xf2\x80\xbe\xbe\xfe\x67\x45\x97"
+ "\x87\xda\x8b\xda\x0a\xd2\x07\x55\xbb\x0e\x6b\xec\xc5\xd1\xd0\xf6"
+ "\xe2\xf5\x32\xb9\xbf\x8d\x1a\xdd\x68\x92\xfd\xdd\x03\x0a\x1f\xda"
+ "\xdc\xfd\xf2\xbe\xe2\xd5\x07\xc8\x7e\x52\xdd\xea\x31\xa8\x5e\xd0"
+ "\x55\xd6\xe5\xda\xf5\x43\xf9\x50\x9b\xa1\xd6\x67\xe2\x35\xd9\x04"
+ "\xc2\x41\x3c\xe5\x7e\x25\xa6\x09\xbe\xd6\x92\xff\x5e\xa3\xb6\xd1"
+ "\x08\xbb\xc7\xcf\x48\x5f\x6a\x33\x83\x75\xf1\xf5\x23\xb2\x2e\xca"
+ "\x75\xef\xbb\x1e\x79\x94\xa6\xaa\xf7\x98\xa6\x5e\xe2\x4d\x0b\xd1"
+ "\x41\xe6\x69\xa4\x32\xa6\x11\x3c\x96\x2d\xc6\x32\x2e\xcd\xf8\x58"
+ "\x43\xed\xc3\xba\x2c\xdc\x66\xed\xe5\xb6\xa2\xb8\x4f\xb4\xc7\xdd"
+ "\x20\x8f\x13\x98\x96\x26\xa7\xd9\xe5\xb1\x44\x91\x9b\xe5\xc1\x6d"
+ "\xda\x97\x1d\xda\x3f\x7a\xdd\xa2\xf8\x47\x1c\x17\xb7\x45\xfb\x72"
+ "\xe4\xfe\x51\xda\x78\x91\xf6\x7a\x12\xa5\xed\x12\x74\xd8\xc3\xf8"
+ "\x78\xb5\xd7\x2e\x8f\x57\xa4\x5f\x12\x3e\xa7\x91\x8e\xd1\x33\xe2"
+ "\x38\x48\xf8\x1d\x65\xfd\x14\x43\xd4\x3a\xa5\x1f\x1f\x27\x7b\x40"
+ "\xf6\xc2\xb4\x42\xd8\x0d\xd3\x5c\xfe\xfb\x15\xd9\x1d\xf2\x43\x28"
+ "\x1f\xe1\x8e\x91\x2d\xea\x92\xde\x88\x32\x3d\x8a\x7e\xc1\xdf\x0c"
+ "\x88\x77\x5f\x8f\x28\xfb\xc6\x4d\xdc\x57\xf8\x5b\x66\x84\x92\xa6"
+ "\x94\x43\xbb\x75\x82\xca\x51\x79\xc5\x7e\x91\xed\xf2\x92\x6d\xe2"
+ "\xf5\xbd\xb1\x4c\x96\x71\x1e\x37\x28\x7e\xd1\x80\xa4\x82\xa5\xbd"
+ "\x9d\xb9\x4d\x7b\xe3\x90\xb0\x67\x6f\x1c\xa0\xb2\x9c\x7f\x68\x2b"
+ "\xb7\x7e\xc3\x4e\x37\x14\x82\xbe\xfe\x4b\xb2\x8b\xd5\x75\x72\x3b"
+ "\x3d\xa2\x1f\x6f\xbc\xcb\xfb\x21\x6c\x6a\x8d\x68\x4b\x75\x5d\x7d"
+ "\x3f\xcf\xfb\x84\xfa\x42\x79\xbb\x55\x79\x6c\x20\x85\xf2\xbe\xe1"
+ "\xed\xd2\x94\xf3\x0f\x58\x86\xc0\x37\x88\x33\xb3\x0c\xf5\x7b\x15"
+ "\xdb\xbb\xbf\x58\xb4\x73\xff\xbd\x8a\xdd\x45\xba\xb4\x90\xed\xe5"
+ "\x79\x2b\x64\x98\xb9\xf2\x2f\xb7\xef\xfb\x97\x0b\xba\x26\x4a\x32"
+ "\xbd\x8f\x8b\x7e\xec\xdf\xc4\xe3\xec\xbf\xe5\x22\x6d\xf7\x2f\x56"
+ "\x68\xab\xbe\x27\xfd\xc1\xfa\x8d\xf4\xcc\xe5\xbe\x84\xc7\xb0\x75"
+ "\x04\x43\x6d\x12\x63\xc4\x1b\x39\x5a\x9f\xba\x4b\x3a\x70\x81\xc6"
+ "\x25\xe1\xab\x1e\xf8\xa3\x3c\xff\x02\xf6\xc2\x9f\xe0\xb8\x50\x97"
+ "\xa4\xd8\x18\xd6\x97\x89\x31\x7f\x07\xc2\xd4\xf1\x73\x2d\x68\x3f"
+ "\x60\x35\x0c\xd9\xa7\x5f\xf5\x3b\x65\x9c\xfb\x3d\x8a\xdd\x20\x5b"
+ "\xd2\xe6\xee\x90\x7d\xba\xba\x83\xf5\xb2\x2d\x39\x27\xd5\xfd\x2c"
+ "\xd8\x0f\xab\xfb\x59\xb0\xcd\x38\xf0\xb6\xd6\x66\xa0\xdf\xbc\xbd"
+ "\xaf\xb2\xae\x24\xc8\x0f\xc0\xb4\x8b\xdb\x8e\xba\x6c\xd2\x51\x3a"
+ "\x63\x81\xdb\x27\x3e\xa7\x74\x60\x94\xd2\x66\xb2\x9b\xbd\x2f\x28"
+ "\xf3\x17\x07\x7e\x41\xbe\x9a\xa6\xbe\x9e\x20\xdb\x49\xf5\x29\xf8"
+ "\xf4\x40\x7b\xf4\x23\x1d\x68\xbe\xa5\xee\x98\x6c\xe7\x1b\x83\x6c"
+ "\xa5\x3c\x86\x91\x9d\x0c\x1e\xab\xaa\x0f\x04\x8f\x55\x07\xf6\x0d"
+ "\xb5\x91\x07\x2c\x97\x3f\x56\x1d\x30\x93\xdd\x52\x6c\x64\xb0\x2d"
+ "\x38\x50\x50\x1f\xe4\xcb\xd6\xb9\x15\x5f\x36\x60\x47\xeb\xb6\x93"
+ "\x8d\xc2\xfa\x8f\xca\x75\x77\x3a\xa5\x97\xbb\x95\xba\x31\x3f\xa9"
+ "\xcd\x84\xb2\x59\x59\x9d\x8d\x32\xd5\x2a\xfb\x80\x5c\x37\xfb\xf9"
+ "\x3e\xe9\xfb\x8d\x28\x7f\xd1\x24\x67\xf6\x35\x5f\x42\x67\x60\xac"
+ "\x68\xe9\x5d\xab\xd0\xb7\x7e\xbd\xda\x2f\x3c\xb0\x97\x95\xf7\x55"
+ "\xd6\xcf\x56\xf7\xb1\x1a\xd3\x76\xcb\x73\x08\x9c\xb6\x1c\x57\xbd"
+ "\xa9\x61\x6f\x70\xdf\x44\x3f\xea\x73\xa8\x1f\x14\x13\x61\xfd\x09"
+ "\xe4\xf7\xa0\xcf\x87\xf7\x3f\xae\x6d\x18\x94\xf9\xdd\x3d\xdf\xd8"
+ "\xd4\xfe\x55\xb5\x9b\x6c\xa5\x1c\x7b\xb6\xa2\xbf\x53\xa3\x9e\x8b"
+ "\x99\x33\x3d\xdb\x64\x2d\x5c\xb9\xa6\x68\xc5\xdd\xa6\x95\x6b\x56"
+ "\x16\xad\x5c\x56\xb0\x72\xf3\xb2\xa2\x95\x6b\xd7\xa4\xae\x5e\xf6"
+ "\xec\xca\x67\x4c\x1b\x97\xad\x33\xa5\x15\xdf\x5a\x1c\x0d\x01\xd0"
+ "\x07\x4c\xcb\xd6\xad\x5b\xbf\x7a\x79\xbe\x69\xcd\xca\x67\xc6\x17"
+ "\x2e\x5f\xb7\xbc\xc8\xb4\xac\x70\xed\xfa\x35\xf9\xa6\x5b\xf3\x27"
+ "\xdc\x9a\x76\x5f\x7e\xb4\x7a\x0e\x6d\x9c\x11\x7a\xfc\x5f\xff\xb5"
+ "\x7b\xf7\xd7\x60\x88\xd7\x59\x0b\xe3\x8b\x57\xae\x11\x73\x76\x0d"
+ "\x6f\x4f\xdc\x03\x56\x3a\x47\x91\xce\x0b\x63\x95\xf5\xed\xf8\xab"
+ "\x27\x38\xec\xa7\x89\xce\x51\xc4\xb6\x27\xf5\x55\x36\x94\x39\xa5"
+ "\xb7\x2c\xfc\x2c\x30\x4c\xc7\xbe\x25\xb1\xaf\xff\xd0\x8d\x3e\x9b"
+ "\x95\xd6\x04\x37\x7c\x0d\x09\x35\x1b\x40\x8f\x57\x0c\x5e\x46\x3a"
+ "\x67\x11\xcb\x1c\x71\x4a\x8d\xf2\x59\x7a\x8d\x39\xae\xa8\xdf\xa7"
+ "\xb1\xf2\xdf\xa7\x09\xbe\x34\xce\x53\xe6\x79\xb3\x5e\x82\x2c\x92"
+ "\xcf\x0e\xa9\x91\xbf\xd7\x7b\x11\x65\x99\xe6\x4b\x7b\x7f\xff\xb0"
+ "\x19\xfd\xc1\x53\xf6\x1b\x78\xde\x3c\xb7\x04\x31\xd8\x2e\x7d\x73"
+ "\x49\x1a\xbc\x86\x75\xad\x4b\x64\xac\xaf\xb2\x31\x51\x99\x4f\xc3"
+ "\x3e\x18\xb1\x2f\x27\xe5\x7e\x0c\xf0\x7e\xec\x65\xc9\x7b\x46\x63"
+ "\xfb\x5e\xa5\xf6\x34\x66\x28\x7d\xc0\x76\x9f\x74\x4a\x0d\x07\xb1"
+ "\x9d\x46\x6a\x57\xa8\xb9\x3e\x9a\xef\xc2\x76\x56\xfb\x37\x20\xdd"
+ "\xc6\x88\x33\x22\x76\xd7\x0b\xfd\xc3\xfe\xb4\x34\xe0\xfd\xae\x2f"
+ "\x21\xa6\x9a\xce\xf0\xb3\xdd\xcc\x4e\xb8\xbd\xe0\xb0\x9c\x84\xf8"
+ "\x4d\xcc\xc5\xfe\xf9\xaf\xdd\x72\x9f\x8e\x92\x6d\xf8\x5f\xcf\x9d"
+ "\xd4\x53\x9f\x70\xac\x88\x69\xf8\x32\xec\xdc\xa2\xfe\xb5\x6b\x99"
+ "\x9b\xed\x57\xfb\x5c\x6f\xf2\xb3\xbd\xc9\xdf\xea\xb5\xd1\x99\x70"
+ "\x6f\x1a\xb0\xee\x3c\xd9\x37\x76\xb3\x81\xc5\x2a\x5f\xaa\x91\xe4"
+ "\xcc\x1d\x06\xb7\x41\xc1\x4d\x67\x03\x52\x19\xc1\xff\x37\xab\xb1"
+ "\x8c\x4b\x85\xdf\xa2\xc5\x4f\x38\xf1\xde\xa5\xd4\x23\xe2\xf0\x37"
+ "\xc9\x27\x70\xa1\x2c\xbb\xc2\xd4\x97\xfc\xea\x5e\xf6\xb1\x03\xd3"
+ "\x77\x7f\x03\x7a\x84\xc5\xd8\x95\xe3\x47\xfd\x68\x48\x25\xfc\x2f"
+ "\x5e\x0b\xb0\x1d\x61\x7a\x2b\x1b\xf3\xdc\xfc\x9c\xbe\x37\x51\xff"
+ "\xab\x73\xb5\xf3\xd8\xb2\x3c\x3f\xa0\x91\x67\xf3\xab\xe4\x13\xee"
+ "\x41\xfc\x28\x43\xbb\xbf\xc2\x71\x18\x9f\x27\xec\x81\x14\xaa\x07"
+ "\xef\xdb\x69\x3e\xa4\xaf\xf2\x27\x53\x94\xfa\x18\xca\xff\x2e\xbf"
+ "\x98\x83\x91\x65\x2b\x95\xe6\xae\x4b\x8b\x19\x6b\x46\xfb\x4e\x6d"
+ "\x24\x19\xc3\x32\x05\x8a\x4c\xa1\xac\x7f\xcc\xe5\x2a\x01\x52\x58"
+ "\xe5\x9b\xae\x86\xd1\x08\x87\x72\x55\x8f\xf2\x44\x72\x85\xb0\xb5"
+ "\x8a\x4c\xa1\xac\xb5\x13\x1c\xb6\x21\xfa\xf0\x66\xb3\x9e\x6c\x64"
+ "\xa7\xf4\x56\x2c\xc9\x18\x7b\xfd\x47\x27\xd9\x75\x8b\x4e\x0a\x3e"
+ "\xbd\x15\xeb\xf0\x08\x1e\x04\xe8\xfe\x13\xa7\x8a\xee\xed\x28\xc7"
+ "\xd1\x44\x67\x31\x57\xfd\x56\x2c\xb6\xad\x9d\xfb\xe2\x5b\x90\x07"
+ "\x7c\xac\xfa\xc9\x71\x2a\x2f\xd3\xf0\x78\x80\x86\x6f\xa5\x84\xa2"
+ "\xa1\x86\x76\x7a\x71\x4e\xe0\x5b\x93\x49\x57\xb0\xcc\x62\xe5\xec"
+ "\xbf\x50\xbc\xc4\x3a\xf4\xfa\x3d\x60\xa0\x3a\x5a\x12\x38\x7c\x95"
+ "\x52\xc7\x6e\xa4\xb5\xab\xd4\x72\x51\x79\x6e\x69\x04\xa0\x39\x71"
+ "\x2a\x9f\x9c\x40\xf4\x7d\xeb\x78\xa0\x3c\x73\x6b\xcb\xdf\xfa\x4c"
+ "\x50\x5b\xf9\x85\x6d\x75\xbe\x26\xce\x75\xc5\xfa\x9b\x62\x2e\xd6"
+ "\xde\x64\x93\x18\x27\xed\xe3\x48\xbe\x9b\x66\x38\x6a\x01\x28\x4d"
+ "\x7e\x9e\xdc\x8b\x63\x8f\x76\x7e\x3f\xfc\xfb\x86\xa6\x97\x82\xdf"
+ "\x37\x34\x15\x85\x7b\xdf\xa0\xa9\xf7\x5d\xaa\xd7\xdf\x90\xa3\x53"
+ "\xd5\x7d\xc8\x1f\xa2\x6e\xa5\xfc\x84\x46\x75\x3c\xf3\xd3\x51\xd4"
+ "\x86\x36\x3a\x9f\xfc\xc6\x1c\x1d\x43\x3c\x2d\x7c\x0c\xff\xa9\x51"
+ "\xf8\x2f\xe4\x17\x35\xb9\x08\x46\xdb\x8f\xc1\x3f\x43\x02\xcd\xb1"
+ "\xc3\x37\xfc\x21\x72\x26\xd0\x69\x80\x60\xb2\x28\xd9\x52\x10\x30"
+ "\xb0\x10\x0f\x31\x00\x63\x39\x3c\xc3\x3f\x91\x24\x3f\xbb\xf8\x83"
+ "\x7e\x10\x7e\x30\xff\xef\xf8\x8b\x12\xed\xe5\xf8\x3c\xa0\x93\xeb"
+ "\x2b\x57\x41\x64\x5c\xa4\x34\x03\xa5\x48\xa8\xbf\xe7\xf1\x2a\xcb"
+ "\x89\x44\x7c\x07\x39\x30\x63\x5e\x19\xbf\xf2\xcc\xd4\xcf\x94\x12"
+ "\xfc\x8c\x7f\x11\x8b\x55\x15\xdc\x1c\x91\xcf\x97\x1e\x25\x3b\x07"
+ "\x93\xa4\x46\xa3\xba\x4a\x23\x94\x45\xf2\x9b\x78\xfa\xc7\x83\xf8"
+ "\x52\x30\x7f\x6c\xeb\x20\xc0\xd5\xee\x6d\x2a\xf0\x8f\x44\xf3\x6f"
+ "\x49\xbc\x48\x1f\x87\xfb\x37\x46\x75\x7f\xb3\xf8\x19\x77\xf2\x5b"
+ "\xc4\x7f\xf1\x3f\x53\x7b\x94\x72\x1b\x10\x8f\x5b\xf2\x42\x81\x06"
+ "\xe8\x7f\x8b\x5d\x49\x52\x4b\x68\x20\xff\xf6\xf4\xe0\xe7\x14\x4f"
+ "\xf0\xf3\x5d\x99\x7f\x7f\xc3\x51\x07\xe9\x9f\x52\x27\xfa\xec\x77"
+ "\x26\x0c\x26\xc6\x6b\x54\x26\xbe\x46\xa3\x42\x81\x3f\xb9\x35\x11"
+ "\xd8\x9e\x3a\x55\xb2\x3e\x34\xf4\x7f\xcd\xdf\x0d\xdb\x64\x85\xb8"
+ "\xd9\x65\x1c\x92\x39\x4d\x93\x46\xcf\x23\x4c\x72\xda\xa4\x77\x87"
+ "\xc0\xf3\x34\x93\xea\x59\x67\xc6\x7f\x1a\x01\x6e\x2d\xf8\x36\xda"
+ "\xfa\xfd\xdf\xff\x85\x7f\x3a\xd2\x8f\xef\xff\xfe\x8b\xfe\x98\x18"
+ "\xc5\xd1\x12\xf1\x1f\xfa\x8f\x0d\x1a\x4a\x26\x67\x30\x39\x81\xc9"
+ "\x37\xdf\xca\x38\xfe\xfd\xdf\xf7\x7f\xdf\xff\x7d\xff\xf7\xfd\xdf"
+ "\xf7\x7f\xdf\xff\x7d\x07\xfe\x74\x3c\x8e\x60\xf2\xdf\xe0\xfd\x60"
+ "\x3e\x85\x41\x96\x3a\x26\xe9\x80\xa9\x32\xca\xee\x05\x9d\x01\x46"
+ "\xe8\xbf\x3d\x2f\xcf\x34\xd8\xa0\xcb\x2c\x40\xdf\xdc\xd0\x1a\x81"
+ "\x7b\xf0\xba\x51\x95\x3e\xee\xdb\x6a\xd1\xdf\xfd\xa7\x43\xe2\x45"
+ "\x60\x5c\x18\x09\x23\x60\x24\x18\x20\x0a\xa2\xe1\x2a\x88\x81\x58"
+ "\x88\xc3\x78\xd3\x08\xa3\x60\x34\x5c\x0d\x09\x70\x0d\x5c\x0b\xd7"
+ "\x41\x22\x5c\x0f\x37\x60\x4f\x92\xe0\x26\x8c\xed\x6f\x46\x82\x8c"
+ "\x0d\xdd\x97\x32\x30\x27\xe2\x3f\xf8\x7f\x36\x98\xf9\x73\xde\xf7"
+ "\xe9\xff\x47\xd3\xed\x72\x7a\xbb\x9c\xee\xfc\x3e\xfd\xff\x68\xba"
+ "\xe9\xbf\xf9\x77\xec\x7f\xeb\xaf\x0e\x4d\xb6\xb0\xda\xba\x90\xb6"
+ "\x52\x9b\xaa\x93\xff\x06\x9f\xe1\x12\xe5\x87\xe0\x0b\x2e\xaf\xfd"
+ "\x33\xe3\x35\x59\xdc\x96\x02\x88\x79\x5e\xa6\xfe\xf3\x86\x2b\xa9"
+ "\xfc\x6d\xeb\xc4\xcb\x85\x17\x42\x6e\xc3\x11\xc6\x76\x15\x5e\xd7"
+ "\x28\x78\x04\x0c\x7d\xe2\x7a\x0e\xf3\x3f\x6d\x02\x70\x9e\xc2\x0b"
+ "\xab\x3d\x5d\x0c\xd0\x11\x03\x70\x66\x36\xc0\x67\x87\x00\xba\x7a"
+ "\x02\x38\x7b\xcb\x02\xad\xbb\x60\x15\xf7\x26\xbc\xbe\x26\x44\xe0"
+ "\xd4\x0d\x4e\xef\xd9\x67\xe4\x64\x9a\x26\x4d\x98\x3c\xe1\xde\x7b"
+ "\x96\x99\xc6\x8f\x37\xdd\x9d\x36\x69\xd2\xc4\xb4\xfb\x26\x4e\xfa"
+ "\x81\xe9\xee\xbb\x1f\x98\x94\xf6\x40\x5a\x9a\x69\xf5\xa6\xc2\x95"
+ "\x93\xd2\x9e\x5d\x6e\x5a\xb1\xb2\x70\xf5\xc6\x65\x85\xcb\x2f\xd5"
+ "\xa3\x2b\xfa\xa3\xe6\xdd\xe4\x07\xce\x81\x60\x6a\x4f\x03\xe9\x17"
+ "\x79\x20\xfd\x7e\x0a\x0c\x65\x4f\x8a\x7c\x05\xff\xe9\x56\x1d\x04"
+ "\x9d\xe5\x10\xe8\xf2\x13\x41\xb7\x24\x19\x74\x0b\xdb\x41\x57\x81"
+ "\x69\x3b\xf6\x80\x6e\x5b\x37\xe8\x5e\x38\x05\xba\x22\xeb\xd0\xb4"
+ "\x57\xb7\x8b\xb4\x5f\xea\x41\xf7\xb3\x29\xa0\x7b\xcb\x08\xba\xfd"
+ "\x16\x91\x76\x14\x61\x8e\x18\xfe\x4b\xfa\x7e\xe5\x7f\x97\xeb\x2f"
+ "\x0c\xf9\x73\x72\x99\xa2\x51\x7a\x20\x39\xc4\xa4\xe8\xf7\x7f\xdf"
+ "\xff\x7d\xff\xf7\xfd\xdf\xf7\x7f\xdf\xff\x7d\xff\xf7\x3f\xfc\xcf"
+ "\xa5\x83\xc9\x5f\x4a\x7a\x78\xaf\x06\xa0\xcf\x66\x48\x72\xea\xee"
+ "\x9f\x4c\x6b\x48\x80\xbe\x95\x02\x03\x5f\x53\x2a\x2e\x3d\xfe\x44"
+ "\xe2\xc0\x3f\x02\xaf\x91\x06\xf5\x5a\x14\x5a\x6b\xd4\x9c\x98\x06"
+ "\x11\x89\x20\xd6\x45\xd9\x58\xbb\xf8\xd6\xf7\x6e\xe8\x01\x03\xff"
+ "\x56\x9f\xbe\x0f\x45\xfc\xc5\x4e\xf8\x79\xa3\xb2\x8e\x4a\x81\xa3"
+ "\x75\x54\xb4\xee\x0a\x61\x57\x13\x6c\x98\x75\x33\x46\xf6\x7a\xa2"
+ "\x34\xfd\x00\x00\x7d\x67\xfa\xda\x5e\xe6\x6a\x29\x01\x68\x6e\x12"
+ "\xdf\x9b\xd2\x9a\x1a\xc4\x7f\xd2\x09\xe5\x4d\x62\x1d\x15\x73\xbf"
+ "\x88\xe9\x98\xd6\xe3\x84\x8a\x3d\x72\x9d\x3d\x4a\xba\x63\xfb\xd7"
+ "\xd0\x62\xe2\xdf\xd3\xb8\x5a\x4c\x3e\xc8\x18\x4b\xfd\x8f\x4a\x44"
+ "\xd8\xa4\x70\x6b\x68\x94\xf5\x62\x54\xb7\x0c\x9f\xa9\xa9\x0f\xfb"
+ "\x18\xb5\x58\xa9\x2f\x0c\x8e\x18\x2a\xab\xe0\xc1\xb6\xf7\x60\x99"
+ "\x1a\x05\x0f\xb6\x47\x69\xa3\x2b\x63\x0b\xaf\xe3\x50\xa8\x36\x99"
+ "\xde\x4f\x8f\x5c\x7e\xdf\xc4\xce\xf4\x8f\x57\x24\x9b\xae\x99\x34"
+ "\x63\x79\xf2\xed\x2c\x2d\x3e\xf5\xe5\xb4\xab\xcc\x51\xe6\xb8\x89"
+ "\xf3\xd3\x24\xa3\x34\x4e\x4a\x1b\x6d\x94\x6e\x7b\x9a\xfe\x6d\x1f"
+ "\x93\xc2\x7f\x4d\xfa\xf4\xed\xf9\xf7\x99\x46\x4e\xdb\xb9\x63\x83"
+ "\xf9\x5f\xfe\x69\xa6\xf9\x91\x85\xeb\xee\x78\x2f\x4d\xba\xfa\x4f"
+ "\x2f\xbf\x9d\xf2\x25\x41\x8c\x1d\x47\xff\x2e\x6e\x8e\x48\xb8\xc3"
+ "\x46\x58\xda\xaf\x37\xbd\x47\x29\x77\xea\xd3\x8b\xf2\xef\x9d\xd8"
+ "\x44\x35\x3e\xf6\xcc\x78\x1b\x95\x99\x39\x47\x94\x11\x10\x13\x8f"
+ "\xa8\xf3\x26\xfc\x86\x4a\x9b\x78\x1b\x40\x2f\x70\x0d\xe2\xbe\x4e"
+ "\xb4\x50\xa4\x8e\x3b\x91\x76\x93\x5c\xf7\x4f\xe8\xdf\x27\xdf\x9a"
+ "\x20\x21\x86\xd1\xe3\x1f\xa6\xdc\x89\x7d\x69\x7d\xa6\x96\x74\xfd"
+ "\xb3\xc9\x29\x23\x27\xfd\x13\xde\x25\x3f\x9b\x6c\x94\xf0\x7e\xa7"
+ "\xb8\x27\x1a\xe4\xff\x40\x40\x18\xa5\x5b\x13\xd2\xf3\xf3\xef\xfb"
+ "\xd4\x9d\x7f\x9f\x51\x32\x37\xe5\xa7\x9b\xaf\xad\x2a\xb8\x2b\x39"
+ "\x3d\x39\xff\x5e\xa3\xc4\x7f\x1f\x30\xdf\x5a\xf9\xa4\x51\xba\xfd"
+ "\xdd\xb4\x51\x46\xdd\xbf\x35\xea\xe0\x7d\x69\xc1\xa1\xf7\x23\xfe"
+ "\xfc\xe7\x0f\xe0\xce\xd5\x1f\xe8\xee\x9c\xfd\x81\xa4\x1b\xf5\x41"
+ "\xcc\x13\xf0\x6f\xc6\x91\xf0\x6f\x89\x78\x99\x1e\x81\x56\x5d\x69"
+ "\x76\xab\xb4\x31\xaf\x35\xa2\xb4\xad\x55\xff\x38\xb4\x46\x2e\x1d"
+ "\xd5\x3a\xe2\x91\x79\xad\x23\x1f\x3f\xdd\x6a\xb8\x1d\x5a\xa3\x00"
+ "\x5a\xc7\x82\xd4\x3a\x0e\x12\x5a\xef\x1e\xb5\xa3\xf5\x91\x31\x92"
+ "\xfd\xea\xde\x87\xec\x37\xe8\x67\xda\x93\x8d\x60\xbf\x35\x1a\xec"
+ "\xb7\xc5\xc4\xd8\x6f\xc7\xeb\x0e\x68\xb4\xa7\xe1\x73\x3a\x24\xd9"
+ "\x23\x37\x8f\x00\x10\x6d\xf9\xc0\x04\xf0\xc1\x58\x98\xf6\xc1\x38"
+ "\xfc\xbd\x05\xaf\x64\xbc\x6e\xc5\xeb\x76\xbc\x30\x4e\xf9\x80\xf6"
+ "\xd5\x81\x94\x11\xe9\xff\xfc\xee\xb2\x65\x93\x97\xdd\x9b\x33\x3d"
+ "\x22\x62\x79\x32\x5c\x85\x54\xd3\xa7\x27\x8f\x8d\x9c\x12\xb9\x3c"
+ "\xf9\x53\xb7\x19\xff\x35\x4a\x4f\xfd\x7b\xc4\x88\x89\x7d\x53\xfa"
+ "\xf2\xfe\xe5\x53\x1f\x44\x23\xfd\x41\x2b\xc3\xbd\x36\xd0\xb9\xb1"
+ "\x8d\x6e\x5b\xef\x43\x7d\xb6\x18\xa3\x13\xa2\x2c\x8a\x1c\x8b\xbc"
+ "\xf7\x8c\x6e\x5b\x19\xca\x5f\x4c\x6a\xe8\xbc\x6d\x94\x97\x79\x91"
+ "\x72\xf9\xa1\xf3\x48\xa6\x63\xca\x94\xbc\x5e\xa9\x39\x1b\x9f\x51"
+ "\xfe\x0d\x53\x82\x61\xed\x11\x6e\x9b\x6e\x1b\xe6\x1d\x1a\x8a\xc7"
+ "\x8e\x78\x32\x2a\x31\xaf\x35\x44\xde\xa3\x6e\xdb\x7c\xaa\xa3\x53"
+ "\x53\x87\x5b\xa9\x83\xbe\xe3\xae\x47\xfd\x22\xbb\xe3\xb7\x45\x1d"
+ "\xa5\xb2\x0e\x8f\x0b\x9a\xfc\xdd\x3a\x7d\xf1\x71\x20\x3c\x7d\xb6"
+ "\xd8\x64\xa5\x3c\xc1\xd1\x3e\x04\xf4\xfd\x1d\x5f\xe7\x09\xb1\x8f"
+ "\xd1\x3a\xcf\x5d\x88\xc3\xb4\x41\x77\x5d\x07\xc4\xf8\xa8\x8c\x13"
+ "\x62\x2d\x6e\xe9\x43\xac\x3b\x36\x4f\xb1\x73\x98\x46\x6b\x73\x68"
+ "\x3d\xb9\x1b\xfb\x5e\x86\x79\x25\x43\xdb\xfc\xe1\x68\x41\x97\xd8"
+ "\x5a\x25\xef\x62\x6b\x07\x45\x19\xc6\xdc\xb6\x0f\xfd\x58\xe6\xf8"
+ "\x50\x7c\xac\xcc\x6d\x93\x76\x60\x5e\x77\x88\xbc\x6d\xa2\xae\x38"
+ "\x7d\x88\x3c\x1b\xe6\x49\x98\x67\x0a\x93\x17\x81\x79\xe9\xa1\xf2"
+ "\x5a\xea\x38\xce\xdc\x41\x9a\xc7\xc5\x9a\xf1\xd9\xa2\xd0\xfc\xd2"
+ "\xfd\x21\x7e\x4f\x42\xba\xc7\xd5\x69\xf1\x13\x6e\xb7\x74\x82\xf0"
+ "\x1d\x1d\x5a\xf7\x71\x9d\xdb\x96\x89\xb2\x10\xf7\xf1\xd0\xbc\x8f"
+ "\x6e\x44\x3a\x50\xbb\x5c\x21\xf2\x92\xb0\x3f\x68\xaf\xe3\x63\x42"
+ "\xe0\x1c\x81\x79\x4e\xcc\x4b\xb9\x04\x3f\x8c\xdc\x86\xd3\x3e\x07"
+ "\x63\x20\xb2\x0b\x46\x4f\xa5\xfe\x08\xb9\x80\x11\x5d\x30\xea\x44"
+ "\xaf\x58\xf3\xee\x32\x6d\x86\x08\x7c\x7e\x93\xd9\xec\xd7\x60\x7e"
+ "\x0f\xca\x93\xc1\xf1\xb5\x17\xba\x20\xbe\x0a\x61\x22\xe8\x1b\x55"
+ "\x1a\x9f\x30\x3d\xc2\xe1\xf1\xd2\x77\x1a\x28\x67\xf1\xbf\xc6\x5f"
+ "\x09\xcb\xf1\x6f\x12\x16\xd4\x41\x32\xb5\x91\xaf\x53\xb5\xd9\x75"
+ "\xb4\xee\x93\xc6\x43\xb7\x04\xb7\xbb\xb9\xcc\xc6\xe3\xf8\x67\x68"
+ "\x94\xd7\xe8\x52\x1b\xf4\x58\x76\x8b\x64\xe4\x6b\xbe\x5d\x88\x8b"
+ "\xda\x30\xcf\x6f\xb3\x4b\x83\x78\x24\xfb\x55\xb4\x7e\xb7\xd7\x26"
+ "\xcd\x72\x4b\xf1\x4c\xe0\x31\x9a\x14\x3c\x04\x87\x75\xf1\x75\xf0"
+ "\xbd\x36\xfd\xab\x2a\x98\x0c\x75\x5d\x13\xdd\x10\x41\x6d\xee\x00"
+ "\x63\x1d\xd5\x27\xf7\x91\xaf\xa9\x75\x6c\xf0\x82\x03\xfd\x8b\x2e"
+ "\x30\x16\x63\x5f\x4d\xcd\x1e\xfa\x96\xd9\x3e\xaa\x61\x2b\x00\xd7"
+ "\x0b\x09\x4c\x32\xce\x5a\x05\x27\xe1\x50\xf5\x75\xb4\xa8\x9f\xfa"
+ "\x6a\x00\x19\xb6\x45\xdd\x46\xc2\x8b\xfd\xba\xae\x1e\xe1\x5a\xd0"
+ "\x6b\x91\x61\xba\x15\x18\x15\x0f\xc6\xca\xed\x23\xfa\x10\xcf\x16"
+ "\x2b\xfa\xd9\x67\x1b\x85\xe3\xff\x55\xdd\x42\x6f\x03\xe9\x72\x1b"
+ "\x12\x45\x1b\x74\xd8\x06\x9d\x5d\xe0\x1f\x95\xa9\xe0\x77\x82\xd1"
+ "\xa3\x6e\x73\x3d\x87\x35\x46\x09\x3d\xe5\xb0\x45\x01\xd8\xf8\x20"
+ "\x58\xa4\x85\x24\x78\x00\x92\x13\x46\xe5\x23\x3d\x22\x10\xe6\x30"
+ "\xf2\xdb\xa4\xc0\xc8\xfd\x4f\xc4\xbc\x69\x32\xbe\x16\x15\xbe\x22"
+ "\xc2\x47\xeb\x5e\x85\xed\x1d\xe5\x0c\xd8\x3e\x68\xc5\x67\xd7\x50"
+ "\xfb\x4a\xfa\x3a\xda\x80\x70\xc9\x94\x6e\x1d\x07\xc6\xb3\x30\xea"
+ "\x4c\xaf\x14\xd1\x2d\x68\x31\x1a\xed\x5f\xec\xa0\x6f\x83\xcf\x93"
+ "\x9d\x60\xf2\xc8\xf5\xe5\x13\x6d\x02\xf6\x96\xea\x1c\x9d\xa3\xd4"
+ "\xa9\xe4\xab\x75\xc6\x1c\x35\x11\xfd\x13\xf3\xcf\xcd\x49\xe6\x31"
+ "\x8a\xef\x32\xb5\x65\x45\xf2\x44\xf7\xd4\x16\xd3\xbd\x69\x3f\x5d"
+ "\x9e\x9c\xca\xc7\xfe\xdb\x3b\xd2\xc6\xe1\xe8\xfe\x27\xfe\xef\xab"
+ "\x94\x92\xcc\x53\x30\x9d\xee\xc7\xd1\xbd\xec\x2f\xe0\xdd\x63\x0b"
+ "\x22\x46\xde\x5a\x48\x77\xc2\x73\x30\x5f\xbb\xe4\x99\x88\x0c\xf9"
+ "\x3e\x4e\xe4\xdc\xc5\x7d\x8e\x94\x87\xe9\xfe\x36\x8e\x6b\x62\x13"
+ "\xd5\x3c\xe1\xe5\xb4\x1f\x2e\xfc\x5f\x11\x1f\xec\x58\x65\x8e\xb9"
+ "\xdd\x46\x30\xa9\x3f\x4a\xdb\x8f\x29\xcd\x94\x32\xee\x27\xbc\x05"
+ "\xea\x52\x47\xa8\x94\x9c\x9f\x94\x3a\x23\xed\xc7\x8b\x16\xdc\xf2"
+ "\xa7\xb4\xd1\x57\xbf\xb7\xb8\x99\xca\x5f\x3d\x3a\xa8\xa6\x71\x81"
+ "\x56\x3d\xbd\xfb\x8e\x97\xee\xf9\xa9\xc0\xb2\x70\x41\xc4\x9f\xcc"
+ "\x63\xd6\x16\x52\xea\x2d\xdc\x17\x23\x5f\x65\xe2\x57\x69\x91\x3b"
+ "\x16\x7e\xfa\xaf\x0b\xdf\x6a\x7f\xf2\x0e\xec\xe9\xd5\xaf\xb6\x3f"
+ "\xb9\xf0\xad\x4f\xff\x35\xe2\x45\x82\xbc\x33\x3f\x2d\xc1\x14\x39"
+ "\x75\x7d\xcb\xbc\x3b\x78\xab\xae\xab\x4a\xac\xbd\xbe\xe9\x86\xc3"
+ "\x37\x1e\x4b\x6a\xbd\xe9\xdf\xc7\xfc\xe7\xcd\x7f\x35\xb9\xc7\x32"
+ "\xf4\x23\x1e\x4a\x1b\x3b\xe8\x47\x00\xfa\x11\x1d\xe8\x47\x94\xa2"
+ "\x1f\xd1\xa6\xf6\x23\xfe\x10\xfd\x40\x89\xf0\x25\x04\xbc\xf0\x7f"
+ "\x52\xff\x1d\xfd\x9f\x35\xe8\xff\xa4\x7e\x10\xf9\xd8\xe3\x1f\xc4"
+ "\xe4\x08\xff\x67\x54\xfc\x08\xee\x03\x5d\x8f\xbf\xe8\x07\xfd\xdb"
+ "\x58\xfc\x4d\xc1\xe7\x3b\x46\x8f\x0c\xf6\x89\xe6\xc7\xb5\x46\x2e"
+ "\x46\x9f\x28\x1d\x7d\x22\xf3\xb2\x56\xc3\xac\x77\x5b\xa3\xa6\x98"
+ "\x5b\xa3\x07\xfd\xa2\x99\xad\x19\x89\x13\x5b\x67\xe9\xa1\xf5\x51"
+ "\x10\xbe\xd1\x76\x48\xfb\x83\x3e\x41\xf7\x51\x0c\xe8\x3f\x8a\x6b"
+ "\x8c\xfe\x28\xde\x6e\xff\xc8\x88\xd7\x28\x68\xfc\x68\x34\x8c\x7c"
+ "\xef\xa1\x46\x78\x6f\x7a\xa9\xf3\x03\x3d\xc4\x7d\x10\x05\x5f\x7d"
+ "\x30\x0a\x7f\xf3\xf6\xc2\x07\x3b\x41\xff\x41\xb4\xfe\xab\x40\x7f"
+ "\x13\xce\x7c\x30\xf6\xfd\xa9\x1f\x8c\x4b\xff\xfd\x07\xb7\x64\xcc"
+ "\xff\x20\xf9\xfd\xf7\x3f\xb8\xd5\x39\x46\xed\x37\x51\x9f\x01\xee"
+ "\xda\x4e\x1e\x2c\xd2\xfb\xde\x94\x11\x69\x23\x5e\x5a\xce\xfd\xc1"
+ "\xfb\x64\xbf\xf0\x3e\xf3\x8c\x1d\x0b\x17\x3e\x13\x21\x99\xc7\x70"
+ "\xef\x52\xf6\x34\x03\xde\x67\xb0\xcf\x39\xb5\x25\xe0\x73\x26\xbb"
+ "\x03\x3e\xa7\x69\xc4\xd4\x0d\x41\xfe\xd9\x00\xa6\x7d\x9c\x9e\x6c"
+ "\xba\x35\x8d\x7b\x66\xed\xd7\x6b\xbd\xb5\x09\xd5\x69\x53\x93\x0d"
+ "\xf7\x9e\x44\x9f\x6d\x64\xf9\xce\x67\xfe\x89\x2e\xf4\xda\xbe\x31"
+ "\x4a\x3b\x9e\x5b\x36\x25\xf7\xc5\x3b\x91\xe7\x57\x93\x17\x3c\x72"
+ "\xe7\x4b\x47\x77\xee\xdc\x71\xf4\x83\x27\x17\xdc\xf1\x1b\x4c\x7b"
+ "\x2f\xb9\x08\xe5\xe7\x7f\xe7\xff\xef\x89\x5f\xa5\x47\xee\x7c\xfc"
+ "\xe8\x8e\xd7\x9f\x7d\xb6\x85\xe4\x85\x78\xab\x8c\x51\xbd\xb6\xd1"
+ "\xe8\x93\xe8\xfe\xa5\xcf\x76\x0d\xfa\x3f\xd7\xb7\x6a\xc7\xb2\xef"
+ "\xf5\xf2\x7b\xbd\xfc\x5e\x2f\xff\x3b\xf4\xf2\x5a\x10\x7a\x79\x7d"
+ "\x55\x28\xbd\x9c\x35\x77\x66\xd6\x03\xa6\xf5\xcf\x98\xac\x85\x6b"
+ "\x9f\x2d\x5c\xb6\xda\x54\xb0\x76\x59\xfe\xf2\xfc\x68\x18\xcc\x58"
+ "\xf6\x4c\xd1\xca\x0d\xcb\x8a\x96\x0f\xf9\xa6\x31\x51\xf1\x49\x87"
+ "\xfa\xd6\xd7\x7b\xc2\xfb\xd6\x37\x24\x84\x8e\x4b\x74\x38\xb6\xdf"
+ "\x90\x16\x22\x6f\x9c\x9c\x37\x3b\x44\xde\xc3\x72\x9e\x25\x44\x0c"
+ "\x18\x2b\x62\x8c\x1b\xb6\x87\xca\xc3\xf4\x3a\xc5\x27\xc1\x38\x4d"
+ "\x6a\x19\xd7\x03\xe4\x93\x74\xc1\x0d\xef\x63\x9f\xba\x31\xff\x98"
+ "\xe2\xcb\x38\xe1\x86\xed\x8a\x8f\x26\xc7\x21\x29\x6e\x9b\x19\xfb"
+ "\x79\x83\x33\x44\x8c\x72\xa7\x5c\xaf\x37\xe0\x1b\xcd\x35\xf5\xd9"
+ "\x6e\x8c\x19\xea\x1b\xb5\x83\x88\x21\x6f\x4c\xd1\xc0\x4e\x51\x60"
+ "\xd1\x9f\xa4\xbd\x1e\x7a\xe8\x5b\xb4\x1e\xb8\xf1\x18\xb3\x5d\x5f"
+ "\x4b\x3e\x25\xc5\x91\x84\x47\xc4\x92\x27\x79\x2c\x89\xb1\x62\x27"
+ "\x96\x2d\x52\xc5\x93\x9d\xe8\x1b\x8f\xa4\x78\xb2\x0b\x6e\x7c\x93"
+ "\x62\xca\x5d\x1c\xd7\x59\xc2\x35\x87\x70\x39\xe1\x46\x3b\xf7\xfb"
+ "\x44\xd9\xc3\xaa\x79\x33\x8c\x6b\x6f\xe4\x7b\xef\x29\x7e\x21\xe6"
+ "\xb7\x3b\xa5\x4f\xdc\x4a\x1f\xc8\x17\x94\xfb\x51\x26\xf8\x70\x63"
+ "\x88\xf8\xa7\xfd\x55\x11\x07\x26\x0d\xc6\x3f\x84\xcf\x6f\xbb\xfe"
+ "\xd7\xf5\x1c\x67\x52\xb2\x82\x53\x2d\x97\xcf\xac\x5d\xb3\x62\xe5"
+ "\xb3\xeb\x0b\x97\x9b\xd6\xcd\x9e\x6d\x5a\xbd\x36\x7f\xf9\x84\x09"
+ "\x13\xa2\x83\xe4\x2f\x46\xf8\xb4\x1f\x9a\x49\x0e\xc9\xaf\x95\xe5"
+ "\xd0\x8c\x3e\xa7\xec\x37\x27\x95\x05\xc7\x17\x1f\x9a\x65\xff\xd6"
+ "\x88\x30\x69\x32\x4c\x53\x10\x0c\xe2\x93\x7d\x64\xf2\x73\xe3\x64"
+ "\x98\x56\x2d\x1e\xcc\xe3\x71\x11\x7d\x5f\xd7\x2b\xfa\xd7\xa3\xc1"
+ "\xf3\x90\x1c\xef\xa0\xdc\x8f\x90\xe3\x84\x9b\x8c\x1a\x3c\x0f\x05"
+ "\xe2\x0d\x9d\x02\x33\x59\x1d\x9b\xe0\x73\x86\xc2\x93\x80\x1f\xdf"
+ "\xdc\x2d\x70\xeb\x8c\x01\xbf\xff\xa6\x02\x4d\x2c\x75\x6d\x00\x37"
+ "\x18\x65\x98\x9a\xe0\x36\x36\x9f\x95\xfb\x6a\x50\xe1\x39\x12\x8c"
+ "\xa7\xf9\x6f\x32\x9e\x08\x15\xcc\x49\x4d\x1b\xbb\x87\xb6\xd1\x1e"
+ "\x27\x70\x37\x62\xfd\x4e\xb9\x6f\x63\x34\xfd\x47\x18\x8e\x3b\x01"
+ "\x61\x92\x14\x98\xc9\xea\x58\x8a\xe2\x39\xfe\xcd\x25\x8c\x99\x4d"
+ "\xf2\x84\xd7\x08\x6c\xf7\xe7\xaa\x98\x6e\xa4\x5c\x4e\xdb\xff\xd8"
+ "\x5e\x8c\x17\x1a\x82\xe2\xb4\x31\x9a\xfe\x63\x6c\x38\x5a\xa1\x91"
+ "\x5e\x81\xd1\xf6\xdf\x29\xda\x38\x6a\x54\xa0\xff\x63\x4e\x6a\xf0"
+ "\x5c\x4b\x32\x45\xb8\x54\x75\x79\x35\x78\x3a\x64\x3a\xaa\x68\x7d"
+ "\xb3\x49\xc3\x8f\xcf\xe4\xf6\xa8\x68\x7d\x73\x86\x06\xcf\x79\xca"
+ "\x0f\xee\xd7\xcd\x16\x0d\x9e\xf3\x81\x7e\xa1\x1c\x0b\x98\x2a\x4d"
+ "\x1c\x2b\x31\xdb\x7b\xb1\x1a\x3c\x87\x15\x98\xde\x11\x3b\x1a\x05"
+ "\x6f\x6f\x6e\x51\x6c\x91\xe0\x6b\x52\x1a\xe1\xc6\xf4\x53\x6a\x5b"
+ "\x80\xed\xea\x1e\x4a\x27\x13\x68\xe9\xa4\x6a\x97\x1c\x8b\x9b\x92"
+ "\x35\xfd\x3b\x2b\xd3\x29\x5a\x85\x27\x53\xd3\xbf\xbf\xc9\x78\x22"
+ "\x55\x30\x1a\xfe\x37\xf7\xc8\x78\xf4\x2a\x18\xad\xfc\x7f\x21\xe3"
+ "\x51\xd7\x75\xe4\xd2\x74\x32\x05\xc9\x3f\xd1\x0a\xd3\x7a\x2e\x31"
+ "\x07\x65\x10\xef\x0e\xc6\xe2\xf8\xf7\x56\x1d\xff\x26\x3a\xba\x77"
+ "\x0f\xed\x1d\x85\x36\xda\xcc\xe7\x06\xfb\xc9\x4e\x8f\xa5\xbd\xa6"
+ "\x5c\xa2\x0f\x90\x26\x6c\xf7\x58\xbe\x5f\x0a\x96\xcd\x76\x42\x5c"
+ "\x91\xfa\x3d\x80\x13\xc6\x56\xc9\x79\xd8\xff\x6b\x4e\x2a\x79\x94"
+ "\x2e\xe6\x17\xc7\xe2\xf8\x77\xbd\x55\x8c\x63\x63\x0b\x64\x58\xb4"
+ "\xfb\x49\x99\xa1\xbe\x53\x0e\xf7\xfe\x65\x5d\x22\xf3\x97\x5e\x4f"
+ "\xdf\x2d\x9f\x4e\xf4\xdb\x18\x38\x8a\x3d\x60\xba\x01\x4a\x3b\x60"
+ "\x9c\x81\x62\xfc\x5d\x9b\xc1\x50\x6a\x65\x1e\xda\xe7\xb5\xcd\xd5"
+ "\x03\xa5\x2e\xd6\x4d\xfb\xfa\x6f\xfd\x0a\x0c\x0e\x2f\x3f\x0f\x2d"
+ "\xb1\xa5\xe4\x4c\xc8\x6f\x6f\xfd\x12\x83\xd2\x24\x2a\xdb\x09\x6d"
+ "\x75\x9d\x50\x5a\x17\x5c\xb6\xf4\x26\x48\x3c\x41\x67\x04\xd8\x20"
+ "\x9e\xda\x41\xef\x53\xbc\xd1\xa7\x13\x4b\xf6\x81\xbe\x14\xbd\xcb"
+ "\x13\xf9\x76\xa5\x2d\xed\xd4\x96\xed\x67\xc1\xf0\xd6\x0a\xbb\xf4"
+ "\xe2\x59\x6a\xef\x5f\x13\x7f\xb5\xd9\x23\x35\x27\xce\x86\xe6\xc4"
+ "\x53\xd0\x92\x38\x15\x5a\x8a\x33\x60\xd7\x59\x88\x69\xf6\xa4\x43"
+ "\x8b\x7e\x26\xb4\x24\x67\x80\xa3\x07\xef\x4d\x3e\x84\x71\xf3\x7d"
+ "\x8e\xba\x60\x9c\x7d\xcf\x73\x60\x70\x0a\x9c\x48\xb3\x71\xc7\x95"
+ "\x3d\x7b\xe8\x39\x54\x3f\xd6\x5d\x0f\x89\xd8\xbe\x6e\x6c\xcb\xfd"
+ "\x1d\x70\x4b\x64\x72\x22\xd0\x39\xea\x23\x1d\xb5\x5e\xd0\x97\x40"
+ "\x54\x18\xb9\x48\xe0\xfb\x7d\xa2\x1f\x55\xbf\x17\xc7\x7a\xfc\xed"
+ "\x45\x99\xe8\xb3\xdd\x92\x8e\x75\x9f\x92\xe7\xbd\x7a\x4a\xdf\x44"
+ "\x39\xdb\x98\x4b\xfb\x7f\xe0\x38\x7d\x4b\xae\x92\x47\xfb\x98\xd2"
+ "\xfe\xa4\x13\x13\xc0\xe8\xf0\x9a\xe1\x9d\xfe\x6e\xfa\xc6\xbe\x87"
+ "\xf6\x3d\x20\x7c\x38\xe6\x47\xd0\xfc\x13\xb6\xe7\x0e\x1c\xe3\x7b"
+ "\x6e\x41\x38\x2c\x8f\xfc\x6f\xe7\x7b\xf7\xb2\xeb\x16\xb9\xfd\xd7"
+ "\x2d\xfa\xca\xff\xfa\xa2\x5e\xf6\xfa\xa2\x2f\x7d\xaf\x2f\xba\x50"
+ "\xba\x09\x0c\xbe\xeb\x16\xb9\xda\xac\x9c\x07\xc6\x36\xeb\x17\xf4"
+ "\xbd\xbc\x81\xce\x0d\x5d\xf2\x3c\xf2\xde\xfb\x09\x6c\x59\x09\x89"
+ "\xfe\xa8\xcf\xdb\x1d\xde\x3f\xc3\x92\x12\x60\x78\xef\x0c\xd5\xbf"
+ "\xde\xe8\xbf\xe6\x2a\xf3\x69\x7d\xb6\x64\xa3\x53\x72\xf2\x3d\x74"
+ "\x5d\x51\x17\x72\xf1\x5a\x8c\x57\x1e\x5e\xf9\x2c\xfa\xaf\xf9\x48"
+ "\xab\xd2\xb8\x6d\x3a\xa0\x7d\x7a\x26\xfa\x41\x77\x16\x92\x53\xb1"
+ "\xfd\xc6\x30\x74\x4b\xf2\x57\x32\xfb\xed\x65\xb0\xb5\xaf\xcf\x42"
+ "\xfb\xa5\xba\x48\xbf\xc8\x1f\xc5\x7a\x8a\xb1\x9e\x6c\xae\x0b\x7b"
+ "\x51\x8f\xa2\x99\x9d\x7c\x3a\xf7\x0b\x16\x9d\xeb\x05\x8b\xd4\x1b"
+ "\xcd\x9a\x11\xa6\x0e\x61\xca\x65\x1a\x76\x13\x2e\xd4\x1b\x57\xac"
+ "\x17\x22\x10\xa7\xf5\x5f\xbe\x3e\xa9\x3f\xb0\x97\x9d\x42\xb8\x96"
+ "\x41\x5c\x88\x7b\x0f\xf7\x93\x92\x4f\x2a\x69\xe4\x27\x55\x23\x1c"
+ "\x95\x77\x78\xcc\xf4\xce\xd0\xe9\x28\xe8\xa6\x7d\x2a\xa2\xd9\x80"
+ "\xa8\x8f\x7c\x38\xd2\xd5\x58\x0f\x8c\xe8\xb3\x41\x36\xe1\xa6\x72"
+ "\x74\x5e\x05\x96\x6b\x66\xa5\x16\xf4\x17\x61\x6e\x1f\xb3\xe8\x68"
+ "\xcf\xda\x66\x2c\x2f\xea\xbe\xd5\xac\xb4\x91\xea\xe0\x7b\xd6\x52"
+ "\x3b\x51\x1e\x9a\x0b\x3c\x10\x5b\x4b\xf3\xe4\xb0\x80\xf0\x11\x2e"
+ "\x94\x03\x27\xf6\xb5\xb9\xb9\xc0\x05\x7e\x16\x84\xd3\x29\xe3\xab"
+ "\x09\xc2\x87\xe9\x0c\xf1\x91\xfc\xb5\x60\x99\xd8\x46\x8e\x6f\xfe"
+ "\xbf\xf8\x09\x9f\x07\xf4\x26\xde\xde\x85\x84\x83\xef\xbf\x8c\x38"
+ "\xed\x1b\x1e\x46\xdf\xf1\x56\x8f\xab\xd4\x12\xc1\xbf\x8f\xc7\xf2"
+ "\xbf\xda\xda\x1d\xc9\x7a\x73\x23\xe2\xf8\xb7\xf1\x0f\x03\xbd\x6b"
+ "\x45\x98\xbf\xb0\x5e\x4b\x44\x6c\x0f\xfa\x7a\x08\x43\xfb\x65\x51"
+ "\x3b\xd5\xbc\x9c\x3f\x63\xe1\x54\x58\x98\x31\x2b\x63\x2a\xcc\x79"
+ "\x68\xfa\x54\x48\xbb\x7f\x7c\xda\xe4\x7b\x7e\x70\x0f\xbf\xb9\xe7"
+ "\x07\x53\xee\x81\xec\xc7\xe7\x4f\x85\xec\xb9\x53\x61\x01\x5e\xd9"
+ "\x0b\x66\xcc\xcf\x98\xb1\x60\x2a\xe4\xce\x9c\x85\x4f\xd3\xa7\x4e"
+ "\x4a\x7b\x64\x7c\xf6\xf4\x59\x33\x60\x5e\xce\xdd\x69\x77\xdf\x0d"
+ "\x0f\xcd\x98\x3d\x29\x2d\x4d\xfe\x9d\x94\x46\x20\x4f\x4e\x99\xb1"
+ "\x60\x7c\x76\xe1\xda\xa2\xb5\xe3\xe7\xce\x9a\x4e\x29\x30\x63\xc6"
+ "\xd4\xec\x20\x3f\x32\xc5\xf7\xb5\x8f\xe8\xed\x66\xe7\x33\x69\x9f"
+ "\x62\xa8\x47\x39\xc0\xab\x87\xef\x7f\x04\xb7\xff\xb1\x9e\xf8\xc7"
+ "\xc7\x82\xdb\x12\x68\x3c\xed\xb3\xdd\x46\xfc\xe7\xb1\x14\xed\x15"
+ "\xdc\x05\x13\xa6\x62\xde\xf5\xb2\x3f\x12\x89\xf9\x9e\xe0\xfc\x3b"
+ "\x16\x63\xfe\xcd\xb4\x9f\x8e\x03\x2f\xa4\xbd\x1b\xed\x21\xd2\xd8"
+ "\x05\xbd\xa5\xb9\x91\x7c\x3f\x43\xe4\x3b\xed\x33\xd1\x67\xbb\x7d"
+ "\xb2\x4a\xef\x3b\x69\x3f\x0a\x9a\x4f\x3e\x07\xb7\xc7\xb6\x15\x99"
+ "\x69\xcf\x29\x70\x14\xc9\x38\xbe\x1a\xc4\x11\x2d\xef\x89\xe8\xac"
+ "\xa7\xbd\x3e\x04\x9e\x12\x95\x8d\x70\x12\x9e\x5d\x98\x27\xe3\x9a"
+ "\xd7\x86\xb6\x02\x6d\xf9\x38\x7f\x69\x0a\xb0\xe8\xd3\x26\xff\x40"
+ "\x0a\x88\xf9\xd7\xdb\x8f\xa8\x64\xdb\xdd\x52\x8c\x70\x6f\x65\xea"
+ "\x68\xdf\x05\xbe\x07\x03\xdc\x46\xba\xe4\xf6\x55\x5e\x58\xc9\xce"
+ "\xf3\x7d\x0f\x47\x60\xff\xc6\x63\xff\x92\xfd\x95\x17\x2c\x7c\x0f"
+ "\x51\x0e\x97\x92\xc0\xe8\x39\x1a\xe1\x06\x06\xd3\xae\xa1\xb4\x3e"
+ "\x7a\xbf\x83\x3a\xcb\x18\x4f\x8f\xc0\xf4\x3f\xa3\x5d\x3b\x89\xb0"
+ "\x16\x82\x9d\xe8\x85\x91\x7c\xbf\x93\x52\x1d\x74\x40\xca\x62\x7f"
+ "\xf4\x85\xe7\x54\xf5\x11\x9e\xc5\x62\x1c\x43\x5e\x9c\x47\x3c\xbd"
+ "\x3c\x5d\xc2\xf4\xdf\x21\xfe\x55\x64\x2f\x85\x0d\x9f\xf0\x14\xc0"
+ "\xe0\x7b\x91\xc0\x33\xed\xe7\xbc\x55\x3c\x37\x23\x2d\xe9\x3d\x01"
+ "\xbd\xe3\xef\xb3\xa5\xa0\xff\x93\x9c\x29\xc6\xca\x09\xbc\x0e\xda"
+ "\x3f\x96\xc5\x3c\xec\x42\xbc\x05\xf6\xcd\x3d\xfc\x0c\x50\x27\xa4"
+ "\x14\xf8\x4b\x2d\xa0\x69\x53\x0a\xb5\x9f\x6c\x08\xd2\x62\x3c\xca"
+ "\x41\x54\x9f\xed\x0e\xd0\xc8\x41\x12\xe2\x59\x89\xed\x3b\x89\x7d"
+ "\x5a\x89\x78\x92\xfd\xbd\x16\xac\x17\xe3\x45\x66\x41\x5f\x29\x80"
+ "\x43\x2e\x6f\x0e\x2e\x7f\x7b\x27\x95\x43\xf8\xc8\xbe\x5e\x82\xbf"
+ "\xbd\x9b\x68\x2e\xcb\x1d\xca\xe5\x1d\x56\x8d\x5c\x8e\xc5\xb6\xdc"
+ "\xa7\xca\xaf\xd1\xe4\x47\x62\xfe\x0f\xe5\x7c\xd4\xfd\x3b\x0e\x6b"
+ "\xda\x7b\x1c\xf3\xa7\x61\x7b\xdd\xa8\xdb\x11\x58\x5f\x53\xbd\xec"
+ "\x9b\xc8\xf0\x4e\x0d\xbc\x17\xe1\xa7\x93\xdc\xd0\xb8\x43\xf0\x0d"
+ "\xb2\xee\x20\xbc\xa1\xcf\x76\xa7\x31\x18\x7e\xfc\x19\x84\x9f\x1d"
+ "\x68\xdf\x9d\x69\xc1\xf9\x77\x7a\x30\x7f\x1e\xc9\x3a\xfe\x3e\x45"
+ "\xbe\x3e\xd9\x13\xb2\x65\xcd\x05\xc4\xaf\x3b\xf3\x34\xf0\x65\x08"
+ "\x97\x2f\xd3\x48\x92\x69\xd4\x24\xc7\xee\xa7\xe4\x36\xec\xd1\x94"
+ "\x39\x82\x65\x0a\x90\x8e\x2b\x15\xb9\x0c\x51\xa6\x55\x53\xa6\x9b"
+ "\xf8\xc8\x44\x3d\xfa\xbe\x81\x40\x19\xd9\x4e\xaa\x71\x50\xdf\xae"
+ "\xea\xb3\xdd\x15\xa3\xe9\x7b\x06\xd6\x5b\x54\x2d\xec\xce\x55\x28"
+ "\x43\x77\x63\xda\xbd\x88\x73\x35\xe9\xc0\x2e\xf2\x07\x5d\x1e\x60"
+ "\xa5\x99\x31\x42\x76\xef\x5a\x1d\xe7\x05\xba\x1f\x4f\xf7\x84\x9b"
+ "\xf5\xcd\x96\x75\xf2\xae\xd5\xf8\x4b\xe9\x7c\xbf\x37\xb2\xc3\xac"
+ "\xef\x47\x7e\x81\xf3\xae\x57\xe8\x0c\x2c\x7c\xf6\xc9\x75\x8c\xa7"
+ "\x3d\x42\xb1\xfd\xcf\xe1\xb8\x03\x6c\x23\xc2\x6d\x86\xe9\x98\x7e"
+ "\x13\xd7\x55\x01\xc7\x9f\x45\x1d\x99\x24\xdf\x93\xf1\xf9\x1a\xb9"
+ "\x7c\x2c\xe1\xc3\xfb\x49\xf2\xbd\xce\x47\xb8\xce\x2b\x3a\x38\x3e"
+ "\x92\x97\x43\x3d\xe4\xf8\xb1\x3c\xed\xc7\x2a\x70\xa6\x5e\xc0\xdf"
+ "\x59\xf8\xfb\x09\xfe\xce\xc3\xdf\xdf\xd1\xfe\xa8\xa5\x3e\xae\x8f"
+ "\xf4\xfc\x53\xfc\x9d\x8f\xbf\xaf\xe0\xef\x02\xfc\xdd\x82\xbf\x0f"
+ "\xe3\xef\x13\xa4\x17\xb4\xd7\x3b\xed\x59\x83\x63\xab\x90\x2d\x7a"
+ "\xf7\xd7\x97\x49\x34\x98\x81\x30\x19\x5c\x5f\x85\x7d\x31\x08\x3e"
+ "\xa6\xf2\x33\x70\x50\x1e\x28\x6d\xa4\x90\x07\x91\xe6\x53\xec\xd0"
+ "\xf9\x40\x9a\x6c\x9b\x64\x5d\x94\xd3\x04\xfe\x6c\xc4\x9f\x44\x6d"
+ "\x65\x02\x57\xa4\xe0\xb9\x8c\x5f\x94\xd3\x87\xa8\x53\xa7\xae\xd3"
+ "\x09\x77\xb9\x68\xbf\x23\xfc\x3d\xc5\xf7\x93\x84\xf1\x31\x8c\xcb"
+ "\x3d\x8e\xb3\x1c\xdf\x5d\x47\x65\xb8\x1a\xa2\x31\x2f\x2f\xd2\x53"
+ "\x55\xb2\x34\xba\xcf\x36\x3e\x57\x23\x4b\xe8\xeb\xdf\xb6\x83\x64"
+ "\x86\xe8\x4e\x7d\x8b\xb3\xf2\xb1\x9c\xf7\x85\xe3\x3f\x2f\x64\xb2"
+ "\x5e\x5e\x9b\x24\xf4\x77\x7c\xa3\x06\xcf\x31\xc4\x53\xa9\xd1\xf7"
+ "\x9e\xc0\xb8\x36\xbe\x5d\x63\x8f\x9a\xb0\xbe\x53\x4e\xd4\x07\xd9"
+ "\xae\xba\x23\x4a\x48\x5f\xc6\x7b\x9c\x70\xd6\xc0\xfd\xcb\xca\x0b"
+ "\x6b\x08\x8f\xbb\x94\xef\xd3\xef\x8e\xb0\x52\x7f\x27\x24\x2a\xf9"
+ "\x3c\x2f\x16\xcc\xa4\x07\x11\x05\x3c\x0f\xc7\xbf\x5b\x8c\x4a\x1e"
+ "\x88\xfd\xdf\xdc\x11\x45\x3c\x2f\x3b\x80\xf7\xb4\x59\xc6\x1b\x11"
+ "\xf2\xdc\x85\xf2\xd3\x69\xe3\x01\xa4\x3b\xcb\x20\xd2\xe1\xfd\x18"
+ "\xb2\xbc\xcc\x37\xbe\x0c\xa2\x1c\xde\x43\x70\x07\xc0\x28\x87\xf7"
+ "\x14\xdc\x09\x30\xd6\xe1\xdd\x83\xfe\x4a\x13\xe5\xbf\x73\x3b\xe8"
+ "\x74\xf8\x5b\x7a\x5b\x99\xa4\x73\x78\x8b\x20\xb9\x4c\x8f\xbf\x05"
+ "\x30\x33\x92\xf5\x39\xbc\xb3\x11\x2e\x1f\xb2\x7c\xec\x7c\x46\x24"
+ "\xfb\x74\xa9\x0f\x8c\xb3\x5f\x62\xa5\x0e\x2f\xc6\x0e\xde\xe3\x98"
+ "\xee\x67\x59\xbe\x6f\xf0\xea\x63\xfe\xf2\xd3\xe6\x2c\xdf\x79\x36"
+ "\xfd\xa5\x77\xf0\xf9\x53\x86\xbc\x64\x0e\x6f\x3a\xb4\xb9\xdd\x08"
+ "\x57\xca\x58\xc5\xe9\xb4\x25\x5f\x49\x30\x40\xe7\x22\x54\x9c\x36"
+ "\x63\x5f\xb2\x07\xb0\x1f\x38\x0e\x67\x0d\xbc\x80\xbf\x95\xa7\xe7"
+ "\xf2\xe7\xf2\xd3\x79\xcc\x70\x3a\x7b\x02\x06\x62\xd4\x07\x87\xb7"
+ "\x13\x96\x62\x28\x91\xb5\xc9\xc5\xa8\xfd\x71\xdb\x28\x0e\x4b\xa7"
+ "\x3d\x95\xe3\xb3\x36\x95\x32\xcc\x33\xb0\xa8\xd3\xd9\x0e\x6f\x0f"
+ "\x60\x1d\x79\x88\xef\x29\x8e\xaf\xfc\x74\x19\xc2\xba\x08\x4e\x8d"
+ "\x87\x70\x10\x6c\x96\x0f\xe2\x11\xbe\x6c\x20\xea\xb4\x15\xaf\x1a"
+ "\xbc\xec\x58\xf6\x4f\xcc\x96\xf0\x2e\xed\x8b\x89\xe5\xd1\xaf\x3c"
+ "\xed\xf2\xd0\x19\x0e\x44\x4b\x1f\x8c\x44\x78\x27\xca\x55\x06\xca"
+ "\x27\xb6\xb7\xc3\xc8\xdb\x5b\xd9\x11\xef\xe1\xfd\xe8\x88\x13\xfd"
+ "\xe8\x88\xa5\xf4\x5e\x94\x1d\xbc\x4f\xeb\x15\x79\x13\xb1\x5c\x0e"
+ "\x2f\x57\xde\x91\xc6\x0c\x1d\x66\x0f\xea\x21\xd2\xb5\x8c\xe8\x88"
+ "\x74\x2d\x23\x5a\xb2\x8a\x8e\x34\x47\x71\x15\xb0\xa8\x0e\xf3\x40"
+ "\x54\x47\x36\x96\x7f\x7a\x80\xfb\x2a\x1d\x56\x8f\xc0\xbd\x16\xf1"
+ "\x2c\x46\xf9\x8e\x40\x1c\x56\xc4\x55\x36\x60\x33\x41\xd6\x26\xe6"
+ "\xc9\xf2\x6e\xf3\x2e\xdd\x04\x11\xa9\x50\xa6\xa3\xb3\xe6\x1c\xc5"
+ "\xf9\xd8\xcf\x16\xfc\xcd\xc0\x7c\xb8\x1a\xeb\x7a\x07\xf1\x5a\xa9"
+ "\x3e\xac\xa7\x0c\x71\x6e\x41\x5c\xf9\xd4\xa6\x6f\x6c\x60\xc4\xe7"
+ "\x9a\x6f\x44\xfb\x0e\xfb\xcb\x3b\xda\xfd\x86\x0e\xbb\x22\x43\x24"
+ "\x3f\x82\x6e\x7b\x60\xae\x9b\x79\x1d\xde\x03\x38\xea\x60\x8c\xe4"
+ "\x3e\x45\xf9\x18\x2b\x1d\x42\x3e\x93\x4c\x15\xe1\x6f\x13\x90\xfc"
+ "\xb4\x59\x5f\x22\xd8\x77\x48\x86\xe6\x5a\xdd\xdb\xc6\x83\x55\x87"
+ "\xcf\xa5\x4b\xbd\x06\x58\x62\xd5\x97\xf9\xca\x3b\x1a\xdb\xac\xc4"
+ "\x97\x8f\xb1\x0c\x95\x2b\x80\x78\x1d\xc6\x0b\x3a\xe6\x8d\x2f\x76"
+ "\xe9\x63\x2d\xa5\xac\xcd\x3d\x1b\x61\xad\xfc\xec\x3c\x92\x23\x82"
+ "\x9f\xd3\xc3\x9c\x3e\xc3\x67\xd9\xd4\x37\x16\x57\x06\x27\x7a\xee"
+ "\x05\x8a\xd9\x4e\xf4\x34\x91\x9c\xfa\x99\xe1\x33\x13\xca\xe8\xc0"
+ "\x9c\x9e\xb2\xc8\x25\x5f\x81\x0e\xd3\x7c\x27\x2c\x87\x30\xbf\x05"
+ "\xe1\x8e\x73\xb9\x9d\xfb\x95\x37\xde\x6b\xe8\xa8\xf1\x96\x7f\x96"
+ "\x36\xf7\xab\x01\x76\xc2\xb2\x07\x9e\xea\x29\x43\x5a\x1d\x82\x39"
+ "\x5f\x78\x23\xda\xac\xf9\x08\xd3\x87\xe9\x4d\x5c\xfe\xe7\x7c\xd1"
+ "\xcb\xe6\x3e\xcf\xce\xcf\xfd\xea\x53\x36\xc7\xc2\xde\x59\x5a\x0c"
+ "\x71\x57\x6d\x63\x7e\xd2\x8b\xe3\x9d\x87\xe0\xaa\x53\xb4\x67\x7e"
+ "\x06\xcc\x5e\xe6\x67\x73\xbe\x38\xcf\x96\x3c\x4f\xb4\x49\x87\x13"
+ "\x16\xd4\x9f\xe2\x3d\x44\xef\xc3\x27\x2c\xc7\xb0\xfe\x0c\xc4\x5b"
+ "\xca\x1c\xc5\x07\x10\xd6\x1e\xff\xd4\x17\x46\x38\xde\xb9\x07\xbc"
+ "\x51\x1d\x35\xbe\x8a\x8e\x46\x7f\x54\x87\xdd\x5f\xd1\xd1\xce\xa2"
+ "\x3e\x33\x79\x2b\x3e\x4b\xf3\x45\x7d\x86\x32\xf0\x59\x23\xf2\x29"
+ "\x8a\x78\xde\x6f\x03\x13\x3e\xd7\xf7\x13\xff\xcb\x3f\x3b\x8c\x7d"
+ "\x6d\x47\xdf\x98\x09\xd9\xff\xec\x30\xcd\x43\x60\xd9\xf6\x81\xa8"
+ "\xcf\xec\x08\xd7\x2e\xf4\xeb\x33\x27\xc9\x25\xcd\xf7\x63\xda\xa7"
+ "\x18\x23\x45\x60\xbe\x6b\x20\xaa\x13\xf0\x32\xb2\xca\xce\x3c\xc4"
+ "\x3f\x8a\xcb\x54\x79\x67\x1e\x7b\xb0\x06\x7d\xed\xaf\x10\x4f\x27"
+ "\xca\xe4\x34\x86\x34\x44\x3d\xe9\xcc\xf3\x57\x74\x5a\x59\x74\x67"
+ "\xa3\x87\xcb\x7e\x67\x03\xe1\x1e\x78\x21\x85\xe6\x27\xf4\x98\x7f"
+ "\x98\x55\x9e\x19\xe7\x21\x59\x35\x9c\x31\xf9\x0d\x67\xca\x58\xf9"
+ "\x99\xb4\x1f\xbd\xc4\x5c\xbe\xf2\x33\xd9\xfe\xf2\x33\x66\xef\x08"
+ "\xf4\xe1\x8b\x8f\x01\xd9\x27\xef\xef\x19\xd2\xe0\x7d\xa4\x47\x13"
+ "\xe7\xbf\xa3\x18\x75\x60\xd3\x0d\x65\x27\x7a\x50\x16\xac\xbf\xe0"
+ "\xb6\xa9\xcd\xfd\x31\xa7\x29\x8b\x3a\x63\x22\x99\x22\xfe\x2e\xb1"
+ "\x42\x19\xab\x38\x93\xe6\xaf\x38\x63\xf6\x55\x20\xde\x28\xac\x27"
+ "\xfa\xf3\xf7\x3c\x5c\x5f\x3f\x47\x79\x3d\x86\x65\xde\x07\x21\xe3"
+ "\x9f\xdb\xc3\xd9\x48\xb2\x55\x64\x9f\xb2\xbc\x1e\x92\x99\xcf\xc9"
+ "\xae\x09\x3b\x05\x4b\x15\x3b\x45\x36\x8a\xe2\x22\xb2\x53\x7e\xd9"
+ "\x4e\xf9\x65\x3b\xc5\x9f\x0d\x68\x6b\xca\x4f\x67\x93\x3d\xca\x2a"
+ "\x16\x76\x26\xcb\x97\xc6\x50\x36\x62\x10\x47\xb6\xe0\x05\xc2\x54"
+ "\x9e\x7e\x8a\xc3\x73\x3a\x9d\x2e\xf3\xa3\xbd\xc1\xab\xc6\x2f\xec"
+ "\x4d\xbb\x6c\x6f\x24\xc5\xde\xf8\x70\xfc\x43\x9d\xf2\x87\xb2\x37"
+ "\x7e\xd9\xde\xf8\x98\xb0\x37\x7e\xd9\xde\x50\xba\x4f\xb6\x37\xbe"
+ "\x10\xf6\x06\xf5\x99\xfa\x1b\x21\xdb\x99\x32\xb2\x33\xd4\x5f\x94"
+ "\x35\xb3\x5f\xd8\x99\x3c\x8c\x89\x24\xb2\x33\x3e\x2c\xe3\x57\xec"
+ "\x4c\x1f\x2f\x5f\x46\xb6\x66\x60\x07\xa0\xfd\x34\x01\xd9\x18\x6e"
+ "\x4f\xbc\x63\xbd\x64\x4f\x90\x7e\xd3\xb4\xf6\x04\xf1\xd5\xe0\xbd"
+ "\x51\xb6\x53\xf6\xf8\x6d\xcc\x8b\xf6\xa4\x31\xab\xd8\x8d\xbc\xfe"
+ "\x04\xe2\xbd\x68\xb7\x8b\x8b\xca\x1c\xc5\x5e\x40\x3b\xd0\xce\xda"
+ "\xca\x00\xdb\x88\xf2\xeb\x43\x5b\x01\x80\x7a\x69\xf2\xa2\x8e\xa3"
+ "\x8c\xa7\xb5\x59\xff\x0c\x3e\xd4\xd5\x39\x3d\xbd\x8e\x25\xee\x14"
+ "\xe3\x9c\x2f\x98\x0b\xe9\xe3\x5c\x62\x2d\x43\xfb\x92\xe2\x3a\xd1"
+ "\xf3\x36\xcc\xee\x64\xfe\xd9\x79\x4e\x13\xea\x40\xda\x9c\x95\xf6"
+ "\xf8\x25\xcf\x1b\x51\xcf\x98\x1d\xed\xe2\xbf\xcf\xf9\xc2\x18\xbf"
+ "\xb8\x13\xc6\xcc\x5e\xc6\xfc\x3e\xd4\x33\xec\x6f\x23\xf6\xfb\x30"
+ "\xb6\xdd\x8e\x3a\xd7\x8e\x7a\x66\xf2\x6a\xf4\x0c\x75\xa6\x1e\xef"
+ "\x4d\x82\x7e\x9f\xb5\xa3\x9e\x1d\xf6\xf3\xf1\xac\x93\xc7\xa2\x58"
+ "\x4f\x3b\xcd\xdb\xa1\xae\x1d\xf6\x57\x08\x5d\xf3\x8b\x72\x4e\x3f"
+ "\xd1\x4f\x92\x75\x0d\x79\x81\xf9\x2e\xd4\x1d\xa4\x75\x18\x5d\xb3"
+ "\xaa\x74\xed\x79\x59\xd7\xa2\x84\xae\x21\x4f\x23\x7c\x2f\x08\x7d"
+ "\x23\xfc\x14\xaf\x0e\xea\x5b\xf4\x19\x3a\xf3\x46\x27\x64\x87\xeb"
+ "\x1c\x8e\x2b\x67\xb2\x51\xdf\xcc\xa8\x6f\x88\x8f\xb9\xc8\x6e\xa2"
+ "\x6c\xfe\x27\x8d\x75\x73\xad\xec\x3f\x97\xfa\x6e\x28\x43\x7d\xca"
+ "\x46\x5b\xf6\x29\xda\xd1\xff\x5c\xe2\x86\x46\xd4\x27\x13\xea\x51"
+ "\x1a\xea\x93\x19\xf5\x8a\xf4\xc9\xee\x7b\x81\x70\x7e\x6e\x1f\xc4"
+ "\xc1\xc7\xca\x60\x7d\xba\xd8\xbc\x69\x9f\xed\x07\x7a\x27\x7c\xc3"
+ "\xe7\x5f\xf1\xde\xe8\x84\xfe\x0c\xf9\x3e\xc9\x09\xff\x9f\x9e\xfb"
+ "\x32\xa8\x87\xd6\xad\x70\xcd\x59\xf8\x41\x3b\xca\x3c\xe0\x7d\x0c"
+ "\xde\x7f\x9c\x75\xc7\x3b\xcc\x5f\x95\x9a\x82\x75\xf7\x91\x2e\x32"
+ "\xdb\x64\xf2\xe5\xcc\x28\x8b\x06\xd6\x97\x12\xc3\xa2\xdd\x9b\xd9"
+ "\x40\x22\xcd\xcd\xc5\xe3\x73\x1c\xd2\x20\x19\x7f\x47\x1f\xf8\x1a"
+ "\x12\xf0\x4a\x3c\x60\xf3\x97\x91\xff\x84\xf7\x69\x6c\x63\x62\xf4"
+ "\xae\x0d\x90\x1a\xef\x16\x67\x9f\xc6\x6f\x33\xd2\x1c\x55\x02\xdd"
+ "\x33\xdb\xa7\x29\x0d\x5f\xcb\xe7\x9f\xc6\x62\x7d\xea\xf3\x4f\x6d"
+ "\x90\xd8\x60\x63\x87\x7d\x7d\x5c\x2f\xd3\x94\xb6\x50\xdb\xb0\x9d"
+ "\x37\x61\x3b\x3b\x1f\xdb\x64\x86\xf7\x8b\x43\xef\xab\xd8\x67\x9b"
+ "\x32\xd8\xff\x30\xf9\xc9\x0a\x4d\xc2\xe4\x67\x28\x74\x0a\xb7\xb6"
+ "\x93\xc6\x69\xdf\x06\xd6\x43\x7b\x74\xd3\xbc\x41\xa9\x97\x7d\x86"
+ "\x74\x2c\xdb\xea\x03\x43\x56\xb1\x87\x39\x7a\x98\xdd\x51\xfc\x05"
+ "\x34\xd0\xbe\xe1\x25\xcc\xef\x8f\x72\x2f\x66\x15\xee\xdc\xde\x0d"
+ "\xcc\x4b\xf3\x3e\x58\xc7\x41\x27\x2c\x6a\x14\xbc\xe8\x38\xcc\xe3"
+ "\x4d\x83\x3b\x17\x71\x8d\x22\x5c\x27\xb0\xbc\xaf\xc2\x8d\xf2\x3a"
+ "\xa5\xdd\xa9\x33\xf0\xb3\xbe\x50\x97\x0f\x5b\x37\xc3\x8d\x67\xe1"
+ "\x7e\x7e\xb6\x2b\x2b\x77\x5b\xc9\x26\x60\x9a\x11\xd3\x12\x10\x7f"
+ "\x51\x9f\xed\x7e\xf4\xb9\x7b\xf7\x08\x5f\xf6\xfe\x04\x05\xce\x09"
+ "\x53\xba\xb5\xeb\xd6\xe4\xaf\x24\xcb\x82\xf6\x79\xd3\x41\xf0\xae"
+ "\x75\xb4\x43\x9c\x39\x74\x76\xc0\xa6\x7f\x96\x46\xe7\x6d\x95\x6e"
+ "\x81\x24\xe4\x0f\xb5\xaf\x02\x63\x8e\x2e\x66\xbb\xdf\xf4\xd6\x66"
+ "\x0f\xc6\x14\xf7\xef\x71\xc2\x87\x61\xe9\xe9\xff\x9a\x75\x22\x0d"
+ "\xda\x77\x6f\x00\x20\xfa\x10\x3d\x51\x6f\xfc\x48\x87\xd3\x64\x93"
+ "\x1a\x36\x50\xdc\x7d\xff\x49\x85\x5e\xe1\x79\xe2\x2e\x10\xb1\xe9"
+ "\x03\x53\x98\x8d\x81\x7d\x0c\xbd\xc7\x78\xe0\x7e\x41\x83\xcf\xec"
+ "\xbd\x68\x47\x68\x4e\x99\xce\xc6\x5a\x97\xc8\x3c\x7d\xb6\x07\x52"
+ "\x9d\xf0\x70\xab\x3c\x5f\xe5\x76\x78\x67\x90\x6d\x09\x39\x6e\xf1"
+ "\x3d\x49\x07\xf1\xff\x30\xb7\x2d\x09\xed\x10\xd9\xa6\x18\xd8\xbe"
+ "\x55\xf0\xdf\x43\x78\xe9\x5b\x8f\x4e\xcc\x5f\xe7\x66\xdd\xac\x0a"
+ "\x8a\x29\x8e\xa0\xfd\x3d\x31\xed\x09\x94\x6b\x66\x2f\xa4\x36\xfd"
+ "\xf0\x09\xfb\x98\x7e\xe8\x2a\x86\x88\x86\xc1\x79\xa2\x1f\x66\xd0"
+ "\xbc\x90\x98\x0f\x7b\xa0\xc5\x09\x33\xf2\x95\x76\x91\x8f\x81\xb4"
+ "\x25\x3a\x1f\x26\x5f\x83\xde\x53\xac\x2b\x61\x1e\xf2\x39\x10\xd6"
+ "\xa5\xf4\x81\xfa\x27\xfa\xf5\x43\xbd\xba\x5f\xf4\xee\x3e\xbe\x44"
+ "\xd0\x60\xdd\x26\x30\xf0\xb3\x7a\x7c\xf4\x9e\x63\x06\xef\x0b\xf5"
+ "\x99\xf7\x85\xdb\x58\x1c\x23\xbc\xf7\xa2\x0c\xf1\xf4\x76\xc4\x85"
+ "\xf1\xcf\x74\xb1\xa7\x33\x3c\xd0\x12\xee\x1b\x16\x94\xcd\x32\x8c"
+ "\x55\xc7\x94\xfa\x59\x07\xe2\xfc\x44\xcc\xb1\xfd\xf0\x13\x3f\xf9"
+ "\xd9\x1e\x92\xdd\xfe\x02\x1a\x93\x1d\x25\x64\x6f\x39\xec\xd5\x08"
+ "\xdb\x89\x30\x27\x64\xd8\x13\xfc\x3c\x40\xf1\x3b\x92\x7e\x71\x1c"
+ "\xdb\x82\xed\xe8\xa4\x79\x5f\xa4\xb3\x59\x79\xc6\x18\x1f\xe3\xc4"
+ "\x1f\xd6\xb1\x8a\xfe\x82\xd0\x6d\x39\x53\x46\xe3\x99\xef\x6b\xd6"
+ "\x83\xf5\x5c\x47\x72\x54\xba\x09\xae\x47\x99\x3c\xbd\x75\x0b\x5c"
+ "\x43\x32\xc6\xa2\xdc\xc5\x82\xee\xe9\x68\xe3\xd0\xf7\x44\x8b\x6a"
+ "\xdd\x00\x37\xa2\x0e\x59\xcf\x42\xfa\x8c\xa5\x25\x26\x6c\x2b\xc0"
+ "\xee\x73\x40\x3e\xca\xa7\x08\x5f\xe4\xf0\x9e\x81\x86\x73\x24\x8b"
+ "\xe9\xf9\x8a\x2c\xe2\xbd\xf5\x62\xb6\x02\xc7\x19\x79\x8e\x22\xfd"
+ "\x13\x7a\x27\xd1\x01\xe9\xad\xd4\x5f\xb1\x06\x3a\xfd\x77\xec\x6b"
+ "\x96\xc4\xc4\x98\x86\x7c\x4c\x77\xe3\xd8\x02\xfc\x42\x5b\x22\x9e"
+ "\x3f\x73\x21\xdc\x41\xf6\xb5\x8f\xa7\x63\x9a\x9d\xd9\x74\xa4\x27"
+ "\x75\x58\x77\x8f\x13\x96\x1c\x15\xbc\x49\x3f\x4a\xb8\x42\xb7\xe1"
+ "\x33\x17\xe3\xfb\xdb\x7e\x89\xfd\x9d\xfa\x98\x69\x2b\xcd\x71\x4e"
+ "\xe5\xe7\x8c\x10\xae\x06\x49\xd8\x6c\x3f\xb6\xb5\xde\xe6\xb7\xa0"
+ "\x7d\xb6\xf8\x2b\x7d\x26\x7e\x2f\xe7\x31\x79\x1c\x0d\x89\xbf\x0a"
+ "\xb6\xd3\x9e\xdd\x9d\x30\x95\x9f\x33\xe3\x47\xb9\xb7\xdf\x70\x96"
+ "\x9e\xf9\xf9\x2c\x6e\x83\xdf\xe4\xa8\x35\x8b\xf3\x11\x11\x46\xc4"
+ "\xf1\x53\x7f\xdd\x8b\x75\xf4\xd9\xa6\x1e\x76\xc2\xcc\x46\xf1\x7e"
+ "\xc6\x6f\x0a\xfb\x7d\x14\xea\x00\xe9\x9c\xd0\xe9\x69\x2f\x9d\x68"
+ "\xe4\xfa\xe7\xec\x35\x74\x2a\xf6\x97\xe6\x73\x62\x3a\x60\xda\xf6"
+ "\x13\x89\x5c\xbe\x25\x26\x3d\x68\x0c\x3a\xc3\x0d\xf3\x86\x5e\x0f"
+ "\x66\xe0\x95\x83\x57\x9e\xfc\x5c\x80\x17\xf6\xf9\xc1\x76\x7c\x2e"
+ "\xe2\xb4\xdb\x9f\xaf\x73\x62\x5e\x2f\xfa\xec\xf4\xec\x84\x07\x67"
+ "\xb3\xfd\xc9\x92\x72\xdf\xb0\x8f\xe6\x09\x1e\x2c\x76\xc2\x54\x10"
+ "\xbc\x98\xc6\xd7\xee\xa0\x3e\x12\xdd\x59\x69\x2d\xf3\xb4\x6c\x75"
+ "\x63\xbb\x1f\x3c\xd8\x52\xeb\x06\xd3\x6d\xd4\xff\x07\x0f\x51\x9f"
+ "\x68\x0d\x0b\xfd\xae\xab\x65\xae\xe6\x3a\x2f\xd0\xbb\x3c\xc4\x85"
+ "\xfa\xdf\xc0\xd7\x09\xb1\x5d\x70\x98\xf0\xc9\x32\xc1\x94\xfe\x0b"
+ "\x7e\xf9\x4d\xa6\x0d\x3a\x7a\x1e\x55\xbf\x97\xcf\xc3\x9c\x62\xa5"
+ "\xb9\xf2\xda\x85\x69\x51\xa8\xe7\xd3\xe8\x7c\xc7\x73\x30\x6d\x0e"
+ "\x43\x5a\x37\x5b\xf8\x59\x51\x2e\x1c\x7f\x7a\xea\xf9\x7a\xa3\x69"
+ "\x68\xff\xa6\xf2\x3d\xa8\xab\x31\x9d\xdb\x1a\xc4\xb9\x0b\xf3\x70"
+ "\x3c\xea\x39\x61\xf1\x80\x8f\xfa\x8c\x65\xdf\xfe\xda\xa3\x8f\x2f"
+ "\x02\xdd\x56\x3a\x7b\x1d\xdb\xc1\x90\x57\xc2\x96\x3d\xe8\xdc\xf2"
+ "\x05\xf3\x28\x7d\x6e\x6e\x24\xfd\x98\xb6\xdd\x09\x3f\xfb\x38\xac"
+ "\x4e\x0c\xf6\xc3\xfc\x66\x73\xb2\xe0\xa3\x1f\x69\x15\xcc\x47\x73"
+ "\xa3\xe0\xe1\xb4\x8f\x83\x79\x68\xc6\x1a\xcc\x28\x09\xe6\xc9\x78"
+ "\x65\xc8\xcf\xea\xcb\xa0\xba\x47\xbe\x9a\xab\xfa\x6c\xe6\x04\xd4"
+ "\x8f\x12\xc1\x1b\x4a\x47\x79\x26\xb9\xb9\x80\x63\xcf\x40\x2e\xd0"
+ "\xfb\x5e\x4a\x27\x19\xa7\x74\x3f\xfa\x37\xf8\x4c\xe7\xc7\x1b\x49"
+ "\x7f\xe9\xdc\x2d\x75\xfe\xe0\xf9\x0a\x60\xe6\x67\x66\xc4\x6f\x2b"
+ "\x2f\x27\xd9\x45\x98\xd4\x78\x6f\x79\x39\xd6\xb7\x5d\xa1\x2b\xa6"
+ "\x15\x50\x3e\xc9\x29\xa6\xd7\x39\xe1\xe7\x09\xfc\x7d\x2e\xc6\x80"
+ "\xa1\x7d\x0f\xb3\x7d\xd0\x47\x33\x74\xe6\x11\x2f\x7b\xe0\xa1\xe3"
+ "\x68\xc7\xd0\x7e\xfb\xc4\xbe\xef\xf0\xd0\x09\x7a\x46\xfb\x79\x1a"
+ "\xef\x5b\x4f\xa0\x9d\xea\xaf\xbc\x90\x3b\x20\xc1\xc8\x7e\x09\xcc"
+ "\xde\x5d\xa9\xb3\xbd\xd1\x7f\xcd\x77\x74\x1f\x81\x36\xef\x6f\xc0"
+ "\xf4\x1c\xc7\xf1\x2e\x9d\xff\x56\xba\x89\xf9\x7e\xd5\x7f\x50\xef"
+ "\xf0\x9e\xb7\xf3\xb3\x4e\xe1\x21\x4e\x8f\x97\x3b\xd0\x0b\x58\xc2"
+ "\x71\x0b\xfa\xc4\xa4\xa6\xec\x5a\xc1\xbc\xbb\xba\x68\x4f\xf8\xc4"
+ "\xe8\xea\x7e\x48\x7d\x63\x33\xa4\xd5\xf5\x43\x72\x7d\x3f\xa4\xb0"
+ "\xcf\xe9\x6c\xfa\xc0\x79\xf6\x71\x56\x30\xd4\x6f\x46\x7f\xce\x0b"
+ "\x3a\x5f\x35\xfa\x73\x5e\xf4\xe7\xce\xa7\x90\xbd\x1c\xf4\xe7\x06"
+ "\xb8\xaf\xec\xee\xe4\x67\x84\x56\xb8\x3b\x63\x2d\xa0\x8b\xc9\x03"
+ "\x23\xb6\xaf\xf4\x1c\x3c\xa4\x8b\xe9\x44\x5f\x12\xfb\xec\x94\xfb"
+ "\x8b\xbf\x09\xf1\x16\x18\xc9\xfb\x8a\x36\x9c\x55\xf8\x12\xc3\x8e"
+ "\xcd\x12\xc9\x94\x9b\x74\x04\xfb\xf0\xf0\xf5\xf4\xce\xf9\xc8\x0d"
+ "\x1e\xfd\xba\x3a\xe6\xa1\xf4\xa2\xb1\xcc\x83\xe9\x7c\x2f\xff\xc3"
+ "\x98\xde\x67\x7b\x38\xc5\x29\x7d\x92\x1c\x4e\x46\x31\x66\x92\x6d"
+ "\xcd\xc3\x3f\x63\x52\x19\xca\x68\x67\xe3\x16\x2f\xfa\xe3\xe7\x48"
+ "\x8f\x1f\x3e\x98\x55\xc0\xbc\xa6\x35\xf4\xfe\xff\xe1\x5a\x5a\x9b"
+ "\x40\xef\x24\x7f\x89\xbe\xce\xa5\xd6\x23\xd0\x18\x42\xf1\x43\x7c"
+ "\x01\xe2\xac\xec\x6c\x64\x18\xb3\x5f\xae\x5f\x4f\xeb\xcf\xc4\xb7"
+ "\xa6\x0f\x77\x3a\x61\x0d\x5f\xf7\xc1\xbf\xcf\xe1\xf6\x74\x7a\x8b"
+ "\x1b\x69\x10\x6c\x03\xa6\xd7\xd2\xfe\xe4\xbd\xe5\x17\x3a\xed\x63"
+ "\xc8\xf6\x4f\x7f\x45\xf8\x42\x17\x9c\x62\x2c\x98\xfe\xbc\x78\x7f"
+ "\x30\x7d\xb2\x13\xe6\xf3\x31\xde\x3a\x8e\x64\x62\x7a\x01\x8b\xbe"
+ "\xf0\x19\xc1\x4d\x28\x83\xb2\xb5\x5e\xc8\x63\x15\x17\x9c\x8c\xeb"
+ "\xca\x39\x60\xaf\xaf\xea\xa3\x6f\x6e\xdc\xd7\x2d\xea\x43\xdf\xa0"
+ "\x05\xf3\x3a\xa9\x0e\x17\xc2\x20\xdd\xa3\xc4\xda\x85\xe9\xe5\x4e"
+ "\x98\x27\xdb\xc3\xe9\x8b\xc5\x1c\xf3\xf4\xc5\xbd\x58\x16\x7d\xc5"
+ "\xab\x31\x1f\xfd\xdf\x55\x31\xf2\x3b\x6e\xd7\x8b\xfc\x5b\xd1\xe9"
+ "\xc7\x9c\x50\xc0\xdf\x03\x16\x8d\x85\xc4\x22\x13\xeb\x0e\xeb\xeb"
+ "\x05\xf5\x73\xc6\x43\x7c\x1d\x9e\x04\xd7\xf5\xd9\x32\x40\xc1\x8b"
+ "\xe3\xed\xcf\x7b\xa5\xc7\x1e\xc3\xb4\x04\x05\x2f\xc2\x5c\x83\xcf"
+ "\xc9\x83\x30\xa2\xcc\x64\x55\x99\xc7\x7a\xa5\x3b\x7f\x8e\x69\x99"
+ "\x9a\x32\xb9\x9a\x32\x16\x55\x99\x32\xb9\x9e\x12\x4d\x99\x2a\x4d"
+ "\x99\xba\x10\x6d\x3b\xac\x29\x63\xd7\x94\x69\x0f\xd1\xb6\x4e\x4d"
+ "\x19\x77\x70\x99\x19\x7a\x15\x6d\x69\x3d\x51\x1a\xa6\x25\x06\x97"
+ "\x99\x91\xa2\x29\x33\x45\x79\x46\xdf\x33\x57\xf8\x06\x28\x4f\xc8"
+ "\x53\xe4\x6b\x27\xe6\x63\xff\x1f\x2b\xb8\x88\xff\x8d\xb1\xe1\x85"
+ "\x53\xa5\x07\xc4\x79\xb9\x64\x57\x69\xfd\x01\xd9\x73\x7a\x67\x42"
+ "\x32\x41\x7e\x27\xd5\xd5\x05\x33\x5f\x22\x19\x42\x9c\x87\x86\xd2"
+ "\x63\x86\x5d\xd3\xce\x76\x4d\x3b\x9d\x43\xe9\x31\xc3\x1d\x5c\x66"
+ "\xa6\x3e\xb8\xcc\xcc\x04\x55\x99\x46\x51\xcf\xcc\x14\x4d\x99\x29"
+ "\x9a\x32\x99\x43\xe5\x73\xe6\x62\x4d\x99\x02\x4d\x99\x92\x00\x0d"
+ "\x67\xf2\x6f\xc3\x49\x1f\x30\x1d\xe3\x9f\x05\xc7\x2e\x42\x3b\xa3"
+ "\x22\xcf\xca\xb7\xd3\x42\xae\x1f\xb9\x7e\x8f\xf8\x6e\x8e\x9f\x4d"
+ "\xd0\x09\x8f\x8c\x57\xde\x2d\xbf\xd5\xef\x89\xa4\x77\x9e\x48\xdb"
+ "\xee\xe6\x62\x0f\x8e\x2d\x33\x71\x0c\x9e\x93\xa6\xac\x2d\xa1\xf5"
+ "\x38\xfc\x6c\x1b\x1e\x8f\xcc\x3c\x29\xf4\xef\x11\xe5\x9d\x0e\xf5"
+ "\x07\xe3\x8c\x47\x52\xaf\xb0\x5d\x27\xa8\x5d\x74\xc6\x03\xe2\xb0"
+ "\x0e\xc6\x1a\x83\x6d\xa5\x3a\x1f\xf9\x8b\xd2\xd6\x06\xb1\x26\x88"
+ "\xd6\x0a\xbb\xe8\xdc\x0d\x2c\xd3\xa4\x8a\x4f\xa8\xad\xee\x23\x9b"
+ "\x3d\xfa\xe0\x36\x3f\xb2\x5d\x6e\xf3\x49\x61\xa3\x1e\x39\xa9\xd8"
+ "\x93\xb0\xf2\x57\x05\x96\xb6\x3a\x00\x5a\xf3\x70\xa2\x0e\xfd\x4d"
+ "\x8c\xb1\xa8\xdd\x1d\x90\x69\xe2\xfe\xef\x9a\x7e\xa0\x7b\x47\xc9"
+ "\x03\x7c\x4d\x84\xe8\x4b\x66\x2e\x9d\xaf\x4c\xbe\x4f\x8b\xf5\x4b"
+ "\x5a\x97\xc7\xf8\x59\x4b\x90\xf9\x52\x73\x89\x0b\xdb\x9a\x99\xad"
+ "\xac\x1f\x72\x42\xa6\xf0\xeb\xaa\x20\x8f\xd6\x6b\xd0\xda\xa6\x66"
+ "\xf7\x14\x82\x29\xc2\x76\x2a\x6b\xa7\x7b\xe8\xac\x66\x84\x4d\x0d"
+ "\x17\x2b\xa9\xe9\x2a\xda\xf0\xe8\x05\x21\x3f\x99\xc7\x82\xf5\x21"
+ "\x12\xe5\x34\xb3\x3d\x58\xe6\x32\x9d\xc1\x32\x97\xe9\x0a\xd6\x07"
+ "\x09\xf5\x61\x96\x3e\xb8\xcc\xac\x84\xe0\x32\xb3\x92\x55\x65\x6a"
+ "\x44\x3d\xb3\xa6\x68\xca\x64\x6a\xca\xa8\xed\x1f\xf6\x79\x96\x65"
+ "\x30\xee\xe4\xf6\x7e\x56\xb1\xea\x59\xda\xc3\xc7\xa9\x59\x55\x4a"
+ "\x9a\xfc\x5d\x32\x5f\x2b\x25\xe3\x3b\xa8\xb1\x51\x04\x7f\x4c\xd3"
+ "\x86\xe3\x9a\x36\x9c\x52\x9e\xe5\xf5\x15\xef\x21\xed\xc6\xca\x72"
+ "\xe6\x8e\xdf\x06\xf3\xe2\xbd\xf3\x9f\x20\xdf\x8c\xc6\x27\xbe\x86"
+ "\x6d\x0b\xfa\x94\x5f\x81\x91\xd6\x0e\x76\x15\x41\x04\x9d\xff\xe2"
+ "\x84\x1f\xe5\x60\x3c\xe7\xa4\x35\xee\xe8\x4f\x65\x75\xc1\xac\x1e"
+ "\xac\xbf\x16\xeb\x40\xda\x3d\x6a\x0e\x6e\xc3\xa3\xd9\xc1\x6d\x78"
+ "\x34\x4f\xf5\x6c\xc4\x67\xab\xaa\xdf\x46\xda\x27\xe2\x35\xee\x5b"
+ "\x3f\x5a\xae\xa4\xd3\x1c\x00\xf6\xb1\xbb\x94\xfb\x01\x66\x5a\x37"
+ "\x38\xba\x03\x1e\x5d\x4f\xf3\x05\x32\xce\x23\x6a\xda\x0a\x5a\x3c"
+ "\xda\xaa\x69\xc7\x49\x4d\x3b\xba\x03\xb6\x66\x56\x8f\xd0\x91\x47"
+ "\xf1\x7e\x61\x0a\xa5\x21\x2d\x4c\xf1\x5e\xd3\xd5\xf6\x71\xe4\xa7"
+ "\xfe\x68\x96\x1b\xfb\xcb\x76\x48\xa3\xe5\xe7\x39\x6c\x1c\xf9\xdd"
+ "\x6e\x27\xda\x67\xfa\x76\xf6\x66\x4c\xcb\x11\x7c\xfd\x11\xf6\x7f"
+ "\x81\x59\xe0\xfd\x11\x7f\xb7\x4f\xb0\x78\x6f\x62\xb1\x50\x1c\x4e"
+ "\x9e\x7b\xe3\xc0\xaa\xac\xb1\x45\x1c\xdb\x15\x7d\xf0\xef\x02\xab"
+ "\xbf\x62\xe0\x24\xa6\xd5\xa2\x4e\xd4\x88\xf7\xa8\x03\xc9\x28\xfb"
+ "\xb5\xc8\x3f\x8c\x81\x67\xbf\x24\xc7\x8c\xdb\x69\xed\x20\xed\x5f"
+ "\x81\x36\x33\x46\xac\xcd\xf8\xd1\x71\x95\x5e\xb9\x4d\x9b\xa7\xb1"
+ "\x0e\x98\xfd\x0a\xf9\x76\x64\x37\x68\x0d\x62\xb3\xd7\x05\x34\xcf"
+ "\xe2\xf0\x9e\xe5\x3e\x39\xe6\xd7\x88\xb2\xb3\x0d\xaa\xb2\x2e\x79"
+ "\x1e\xa4\x9b\xf2\x26\x7a\x41\xdf\xec\x76\xd1\x59\xba\x09\xc2\x8f"
+ "\x9f\xfd\x4a\x33\xda\x0b\x2c\x93\xae\x94\xa1\x39\x13\xfe\xde\xbf"
+ "\x08\xf4\x13\x4a\x40\x6f\xdf\xdc\xc1\x71\xcb\xef\x9c\x79\x7c\xe4"
+ "\x28\xe9\x06\x87\xfb\x24\xf9\x94\x7a\xb1\x6e\x6b\x76\x4d\x84\x07"
+ "\x0c\xbd\xd5\x80\x32\x32\xbb\xc6\x57\x0d\x16\x6c\x1b\xc6\xf1\x3f"
+ "\x3a\x42\x36\x50\x4d\xbb\x19\x33\xb2\xe7\x67\xcd\x19\xff\xf8\xfc"
+ "\x59\x39\x33\x1e\x30\xe5\xac\x5c\xbd\x3c\x7f\xfc\xda\xf5\x45\xa6"
+ "\x8d\x85\x2b\x8b\x56\xae\x79\x96\x1f\xff\x65\x5a\x56\x24\x7e\x53"
+ "\x0a\x96\xad\x2b\x9a\x4a\xb7\xa9\x26\x6b\xe1\xf2\x0d\xfc\xf6\x8e"
+ "\x68\x08\x46\xb2\xb2\x68\x79\xa1\xe9\xd6\xfc\x54\xd3\xcc\x65\x2b"
+ "\x0b\xe8\x2b\x86\x50\xb8\x1e\x30\x15\x2e\x2f\x5c\xbe\x2c\xdf\x34"
+ "\xd5\x94\x46\x98\xd5\xe8\x54\xfc\x4c\x53\xec\xd3\x3a\x1c\xcf\xd1"
+ "\x87\xee\x26\x3b\x45\xe3\x7a\x17\x64\xad\x27\x1f\x8e\x9f\xd7\x85"
+ "\x72\x88\x63\x82\xb3\xcf\x36\xa7\x68\xe8\x38\x3e\xa7\x3c\x58\x7e"
+ "\xe7\xd4\x06\xcb\xef\x9c\x83\x43\xc7\xf1\x39\x1a\xfd\x9f\xa3\xd1"
+ "\xff\x39\xa7\x86\x8e\xe3\x73\x5c\xc1\x65\xe6\x42\x70\x99\xb9\xc6"
+ "\x41\x3b\x83\x6d\x7d\x91\xdb\xa5\xb9\xc9\x9a\x32\x93\x35\x65\x32"
+ "\x34\xcf\x39\xaa\x67\xf4\x5d\xe7\xe6\xab\x7d\x03\x7c\x2e\x52\x74"
+ "\x3d\x60\xdf\xe6\x96\x2b\x30\x34\xf6\xd0\xb7\x2e\x32\x6c\xa3\x0a"
+ "\xb6\x5b\x86\x1d\xd4\x7f\xb2\x49\xb4\x76\x53\xf8\xe7\x59\xb7\xca"
+ "\xb6\xad\x73\x77\x60\x0c\xed\x44\x5e\xdc\x7c\x0e\xe6\xbe\xd2\x20"
+ "\x60\x5d\xb4\x9e\x97\xbd\xbe\xa8\xaf\x61\x34\x18\xa8\x2c\x9d\x57"
+ "\xc5\x6c\xb3\xeb\x68\xfd\x38\xa6\xc5\xe0\x85\x76\x2a\x2b\x51\x59"
+ "\x3b\xbf\x1d\x61\x9c\x90\xc5\x65\x99\xca\x6d\xe7\xeb\x0e\x79\x7d"
+ "\xaf\xd0\x37\x56\x74\x06\xdc\x6e\xb1\x87\x44\x27\x9d\xa3\x46\x75"
+ "\x23\x0e\x3d\x93\x66\x9f\x96\xcf\xc3\x32\xe2\x95\x80\x38\x0b\x14"
+ "\x9c\x88\x2f\x11\xc4\xb9\x7b\xb4\x8e\x4c\xf6\x7b\xb2\xaa\x14\xff"
+ "\x82\x62\x85\x50\xb6\x23\xf4\xda\x6c\x88\xdf\x6d\xf3\x9f\xb4\x6f"
+ "\xed\xa4\x36\x1d\x23\x3f\xd4\x91\xe8\x85\xb6\x3a\x2f\xc6\xaf\x60"
+ "\xe4\xf1\x54\xf1\x17\xe0\x68\xf4\x02\xcd\x0f\x2f\x2d\x86\xb2\x06"
+ "\xc9\x7f\x92\x0d\x96\xa3\x18\x2d\xcb\x4d\xed\xd9\x4e\xe9\x58\x1e"
+ "\x63\x09\x17\xad\xe1\x0e\x33\x1f\x11\x4f\x70\xf6\x71\x14\xef\x65"
+ "\xa7\xca\xbe\x6f\x79\x03\xe2\x0a\xb9\xbe\x58\x02\x47\x9f\x2d\x1b"
+ "\xc7\xbf\x8d\xed\x8a\xcd\x6e\xae\xe5\xb6\x4f\xc2\x74\xd4\xf7\xac"
+ "\xc3\xe1\xfc\x14\xd9\xbe\x5b\x69\x5d\x19\xc2\x1e\xba\x18\x2c\xb5"
+ "\xbb\x19\xfb\x8d\xba\xd8\xfd\xd6\xd6\xb4\x48\xd9\xbe\x1a\xb0\x5c"
+ "\xa7\x52\xee\x72\xfa\x47\xbe\x11\x8d\xc7\xa8\xab\x6e\x11\x2b\xce"
+ "\x7f\xe2\x35\xbe\x66\x79\x1e\xfa\x7f\xd9\x8a\x1e\x5c\x85\xcf\x68"
+ "\xff\xb2\xf9\x7c\x22\x5f\xd7\x83\xf1\xe4\x3a\x2b\xfa\x6c\x89\x6e"
+ "\xb4\x8d\xf3\x72\x95\x3c\x3e\x4f\x44\x79\x25\xcc\xd3\x9c\x48\xf3"
+ "\x1a\xf3\x8a\x06\xf3\xc4\x37\x04\xac\xb9\xd8\x4b\xe9\x55\x4a\xba"
+ "\x18\x5b\xe6\xd5\x69\x9e\x0f\x29\xcf\x78\x7f\x14\xef\x4d\x32\x7e"
+ "\x17\xda\x5c\x9d\xd8\x73\x61\xfe\xf5\xf5\x5c\x6f\xe6\x9d\x54\xf2"
+ "\xf9\x9c\xda\x9b\xf4\x6e\xcc\x0d\xfe\xe8\x0b\xdc\xd7\x25\x7b\xfd"
+ "\xab\x2f\x3d\x91\x18\x63\xe8\x18\x9d\x9d\x8a\x69\x84\x87\x74\x86"
+ "\x9f\x61\x8f\xcf\x1d\x30\x8f\xce\xa0\x75\x91\x8c\x6c\xf4\x42\x92"
+ "\xf5\x41\x9a\x7f\x9e\xcf\xe5\x96\xd2\x08\x2f\xe1\xa3\x31\x91\x70"
+ "\x13\xbe\x5d\xe4\xd3\xf2\xf5\x92\xf3\xa9\xff\x55\xe1\x78\x85\xf9"
+ "\xc5\x2a\x5a\x46\xe2\x73\x79\x70\x5f\xe7\xd7\x6a\x9e\x0f\x2a\xcf"
+ "\x34\xd7\x2b\x64\x6f\x7e\x9d\x9c\xd7\x72\xb1\xba\xc6\xf1\x6f\x64"
+ "\xe6\x77\x6b\xea\xf3\x04\xe3\x5f\x60\xd0\x3c\x27\x2a\xcf\x7b\xf8"
+ "\x3b\x86\x05\x29\x4a\x1d\xbb\xc5\x1a\xae\xee\xa6\xad\xae\xc8\x8b"
+ "\xed\x65\x82\x65\x16\xab\xea\x1c\x81\xcf\x05\x01\xfe\x2d\x28\x56"
+ "\xf0\xe1\xfd\x76\x15\x1c\xfa\x25\x0b\xf6\x28\x70\xe2\xfd\xc6\x82"
+ "\x26\x55\xb9\xc3\x97\xe8\xab\x46\x76\x73\x7c\x42\x76\x17\x74\x6b"
+ "\xda\xe2\x09\xe0\xcc\xd1\x07\xda\x92\x63\x54\xc1\xa1\x7e\xe6\x98"
+ "\xb4\xb2\xba\xae\x98\x64\x9c\xe4\x35\x27\x3d\x44\x9e\x47\xce\xcb"
+ "\x0d\x2d\xe3\x39\x56\x55\xba\x1c\x1f\xe5\xfc\x59\xf6\x13\xc8\x3e"
+ "\xbb\x7b\x4b\x73\x94\x73\x54\xb9\x4c\xd2\x3e\x62\x13\xc5\x99\xdd"
+ "\x28\xd7\x39\x87\xb5\x78\xc5\xf7\x37\x32\x8e\x00\xce\x32\xe1\xe3"
+ "\xe5\x38\x55\x7d\xeb\x71\xc2\x7c\xe5\x3d\x91\x4b\xcc\x0d\x2e\x38"
+ "\x15\x2e\xee\xe8\xb3\x3d\x96\x14\x4c\xb3\xc7\x52\x03\x34\x7b\x6c"
+ "\x4a\x00\xef\x63\x19\x2a\xb8\x7f\xc3\xe7\x1c\x15\x5c\xde\xa5\x64"
+ "\x53\xc8\xca\x63\xe5\x9a\xba\x6a\x55\x38\x9a\x54\x75\x1d\x56\xc1"
+ "\xa1\x9f\xf8\x98\x3d\x3c\x7f\x1e\x3b\x15\x9e\x3f\x8f\x79\x42\xf3"
+ "\x67\xa1\x31\x50\xef\xc2\xa4\x4b\xeb\xd5\x42\xb3\xaa\x3d\x0d\xf8"
+ "\x9c\x1d\xac\x47\x0b\xf3\x34\xcf\x83\xfc\x67\x68\x3b\x9a\x36\x9b"
+ "\x23\x29\xbd\x68\x2c\x18\x85\x9e\x2d\xac\x51\xe7\xff\xaa\x5f\xe4"
+ "\x53\x1b\xf9\x3b\x38\x7a\xbf\x29\xe0\x8e\x6a\xe1\x08\x46\x95\x7f"
+ "\x52\x69\x3b\x8e\xd7\x21\xcf\xfc\x54\xc6\x3f\x87\x9f\xc6\xbf\x85"
+ "\x6e\xf1\xde\xa6\x37\x89\xd9\xde\xc9\x0d\x37\x96\xf5\xd9\x1e\x4f"
+ "\xc3\x98\xa1\x5b\xd0\xe7\x71\x94\xff\x35\xdc\x37\x61\xe5\xbd\x49"
+ "\x28\x4f\xfd\x5d\xf0\xf8\x9f\xf1\x77\x00\x7f\x7f\x17\x3c\xbe\x3e"
+ "\x9e\xc3\x6c\xba\x05\x0d\x36\xed\xb8\xfb\x78\x01\xc6\x1e\xfd\xf1"
+ "\xde\xb2\xdc\x10\x79\xe5\xcc\x16\x31\x3f\x44\x7a\x23\xf2\xab\xdf"
+ "\x09\x8f\x7f\x4c\xed\x55\xa5\x1f\x65\xb6\xb8\x1c\x82\x77\x52\x7d"
+ "\x58\x26\x1c\xdf\x94\xef\xa0\x84\xec\xe5\xea\x35\xfd\xf8\xa6\x0b"
+ "\x72\xb7\x89\x7e\xe4\x7e\x12\x5c\x77\x6e\x52\xe8\x7e\xe4\x4e\xc6"
+ "\x7e\x7c\x13\xba\x1f\xb9\xfc\xdc\x5a\x26\x61\x5f\x86\xf8\x1d\xb9"
+ "\x05\xd8\x97\x6f\x38\xdd\x83\xd3\xb7\x2b\x71\x6a\xe9\x37\x18\xff"
+ "\x4b\xc0\xcb\x2e\x28\x09\xf0\x4d\x86\x3b\x14\x5f\x0b\xd9\x21\xea"
+ "\x6c\x61\xb6\x91\x0b\x9c\x90\xeb\x55\xc6\x2b\x39\xfd\x94\x68\x0b"
+ "\xd2\x49\x22\x3a\xe5\xf2\x7a\xc3\xf1\x5b\xd1\x4f\xf1\x9e\xe9\x09"
+ "\xd4\xff\xc7\x9d\xca\x98\x8e\xe3\xb9\x4b\xa1\x23\xe6\x65\x6a\xf2"
+ "\x3c\xaa\xbc\xfc\xa0\xbc\x2d\x83\xe9\x25\x4a\xfa\xe5\xf1\xe9\x89"
+ "\x43\x1a\x3e\x21\x7f\x9e\x9c\x1a\xdc\xef\x27\x8e\x89\xfe\x21\x8f"
+ "\x86\xd0\xfa\x89\x93\xc8\xa3\x81\xd0\x3c\x7a\xc2\x1d\x5a\xd6\x9e"
+ "\x8c\xe1\xf8\x46\x43\x08\x7c\x4f\xa6\x20\xef\x06\xb8\x0c\xca\x7c"
+ "\x1a\xca\x9f\x27\x67\x2b\xfc\xb9\xbc\x3e\x3e\x59\xa3\xe9\xa3\xaf"
+ "\x0b\x16\xc5\x8a\xbe\x2e\x7a\x4a\x83\xfb\x60\x68\x59\x7c\xd2\x8e"
+ "\xfd\xf4\x85\xee\xe7\x93\xa7\xc2\xcb\xe2\x93\xf4\xae\xce\x37\x54"
+ "\x16\x17\x19\x45\x19\x08\x51\x66\x51\x2a\xb3\x85\xaa\x67\x51\x06"
+ "\xf9\x45\x4e\x58\x54\x42\xef\xe9\x54\xe9\x8b\x83\xe5\x0f\xfb\x40"
+ "\xe5\x88\x7e\x5e\x11\xc7\x10\x1f\xba\x4c\x20\x5d\x4a\x26\xfb\x6c"
+ "\x8b\x8e\x69\x68\x75\xbe\x0b\x16\x4f\xed\x95\xa4\x99\x82\x5e\x4f"
+ "\xe9\x34\x6d\x3a\x19\x9a\x5e\x8b\x5c\x48\xaf\xf3\xa1\xe9\xb5\x38"
+ "\x26\x3c\xbd\x16\x13\xff\xcf\x0f\xa5\xd7\x62\xb3\x9a\x5e\x7e\x9b"
+ "\xe8\xdf\x2d\x89\x28\x1b\x03\x4b\x59\x83\xb0\xe5\xc6\x78\x94\x15"
+ "\x51\xa6\x87\xca\x14\xc5\x7b\x84\x9c\x98\x6e\x00\xc3\x39\x58\xbc"
+ "\x58\xd1\xff\xb8\x5a\x18\xc9\x06\x16\xd1\x1a\x6d\x3a\xcb\xd9\xe8"
+ "\x28\x3e\x6f\x77\x78\xd3\x80\xe6\x1b\x35\xf5\x1e\x0d\x6d\x0b\x16"
+ "\xb7\x23\x4d\x5f\x0d\x91\xde\x2d\xe6\x4c\x9f\x32\x05\xdb\x88\xa7"
+ "\x20\x98\x47\x8b\x78\x39\x18\xdc\xff\xf4\xe2\xd7\xc5\x79\xf6\x94"
+ "\x75\x28\xcf\x96\x8c\x92\xf9\x75\x21\xb8\x7d\x4f\x95\x87\xe6\xd7"
+ "\x53\x8d\xe1\xf9\xf5\xd4\xb1\xf0\xfc\x7a\x8a\x62\x9f\xf3\x4e\x58"
+ "\x62\x0c\x1e\x37\x9e\x72\x05\xf7\x17\xeb\xc5\x72\x4c\x1a\x71\x35"
+ "\x3d\x5f\x6e\xbf\x95\x8b\x6c\x1c\xf1\x8a\xbe\xff\xc7\xf6\x8f\xa5"
+ "\x36\x0e\x17\x47\x58\xdc\x48\xc3\x9a\xcd\x61\xcf\x07\x8f\x69\xc3"
+ "\xb8\x92\xd6\xe7\x99\xc6\xd0\x5c\xd9\x92\x33\x7e\x49\xf7\x00\xde"
+ "\x4b\x5d\x90\xf7\x6b\xbf\x14\x51\x46\x6b\xc9\xf8\xb7\x83\xfc\xfd"
+ "\xc4\x12\xaf\x9a\x17\xb4\xa6\x6c\x97\xd8\xcb\x91\xe6\x39\x3f\xed"
+ "\x82\xa5\x2f\x09\xbe\xe4\xbd\x12\x4c\xc7\xa5\xa6\xd0\x7c\x59\x3a"
+ "\x05\xf9\xf2\x69\x68\xbe\x2c\xcd\x09\xcf\x97\xa5\x56\xe4\xcb\xa7"
+ "\x43\xf5\x68\x69\xb9\xac\x47\x2f\x52\x19\xd3\x1a\xf2\x57\x97\x7e"
+ "\x43\x30\x78\x8f\x3a\xb2\xf4\x34\xe5\x8f\xef\x51\xf4\x88\x97\xa1"
+ "\xf8\x9f\xd7\x2f\xc3\x1c\x95\x71\xa8\xf1\x3a\xe3\x7b\x42\xe9\xc9"
+ "\x52\x7a\x9f\xaa\x9b\x60\x05\x03\xd2\x30\xf7\x00\xe1\x28\x04\x38"
+ "\x07\x79\x73\x08\x8e\xd2\xe9\x6c\xe5\x00\x7c\x5e\x8a\x02\xc7\xe7"
+ "\x45\x05\xac\x89\xf5\x59\x80\xe0\x82\x71\xe7\xc9\xfd\x1f\xc9\xc7"
+ "\x11\x82\x27\x38\x0d\x4c\xb1\xd0\xc7\xbc\x63\xc1\xfa\x98\x57\x13"
+ "\x2c\x9f\x4b\xe9\xfd\x44\xbc\x1f\xed\x1c\xca\x72\xa7\xcf\xa6\x7b"
+ "\xe0\xdb\xd1\xcd\x65\x31\x1a\xdd\x44\x19\x58\xf6\x0b\x21\x03\xcb"
+ "\xaa\x83\xdb\xba\x2c\x39\xb4\x0c\x2c\x4b\x0f\x2f\x03\xcb\x72\xc3"
+ "\xcb\xc0\xb2\x22\x92\x01\x27\x2c\x3b\x14\xac\x9b\xcb\xaa\x82\xfb"
+ "\x8e\xf5\x72\xdd\x84\x51\xc3\xd1\x4d\xf4\x85\xae\x0e\xa7\x87\xb2"
+ "\xff\xaf\x6b\xe8\x07\x18\x06\xcd\x0c\xa8\x57\xd8\xbe\xa7\xcd\xf4"
+ "\x0e\x09\x6d\xbc\x85\x68\x58\xcf\x63\xb4\xa7\x73\xd4\x74\xdc\x25"
+ "\x62\xad\x52\x84\xfd\x0b\xad\xd9\x13\xf4\x7c\xe6\xcd\xe0\xfe\x3f"
+ "\x5d\x14\x9a\x9e\x4f\x57\x21\x3d\x4b\x43\xd3\xf3\xe9\x83\xe1\xe9"
+ "\xf9\x74\x0b\x7d\xab\x3e\x54\xa7\x9e\x3e\x65\xda\xc0\x7d\x14\x5e"
+ "\xe6\x1c\x3c\x73\xef\xe5\x8d\x4f\xcf\x24\x04\x8f\x4f\x4f\x7b\x87"
+ "\x3f\x3e\x3d\x93\x1b\x7a\x7c\x7a\xc6\x1a\x7a\x7c\x7a\xa6\x5c\xe8"
+ "\xc3\x33\xf6\x60\x7d\x78\xa6\x31\x58\x26\x90\x76\xdf\xda\xf8\x94"
+ "\x6f\xd4\xe8\xc0\xee\x2e\xc8\x7f\x05\x7d\x0a\xd9\x16\x2e\x7f\x2c"
+ "\xb8\x8d\xf9\xa9\xa1\xf9\x96\x9f\x81\x7c\xdb\x1d\x9a\x6f\xf9\x79"
+ "\xe1\xf9\x96\x5f\x82\x7c\xdb\x3d\x94\x6f\xf9\x7b\x86\xef\x53\xe4"
+ "\xb7\x06\xf3\x2c\xff\xf0\xf0\x79\xb6\x3c\x26\x34\xcf\x96\x27\x87"
+ "\xe6\xd9\xf2\x74\xc1\xb3\xe5\x45\xc1\x3c\x5b\x9e\x13\xcc\x33\xa4"
+ "\xdb\xb7\xc6\xb3\xe5\x2d\x1a\x9e\xad\xed\x82\x15\x33\x90\x67\xed"
+ "\x82\x67\xcf\x46\x69\xda\xe8\x0c\xcd\xb3\xe5\x1e\xe4\xd9\xda\xd0"
+ "\x3c\x5b\x91\x10\x9e\x67\x2b\x68\x0f\x8d\xb5\x43\x79\xb6\x22\x73"
+ "\xf8\x3c\x5b\x51\x12\xcc\xb3\x15\xf9\xc3\xe7\xd9\x0a\x7b\x68\x9e"
+ "\xad\x38\x19\x9a\x67\x2b\x5c\x82\x67\xcf\xa6\x04\xf3\xec\x59\x43"
+ "\x30\xcf\x90\x6e\x7f\x27\xcf\x90\x3f\x26\xb1\x5e\xf7\xd9\x8a\x5e"
+ "\x3e\xa7\xfd\x6c\x99\x13\x2c\xf2\xf7\xec\x16\x2e\x3b\x32\x0f\x7f"
+ "\x85\x30\x45\x43\xc7\xee\x67\xeb\xe4\xb4\xc7\x87\xf2\xe1\xd9\xa3"
+ "\x38\xae\xf6\xb4\x94\xf0\x75\x5d\x82\x87\x44\x73\x84\x13\x73\x64"
+ "\xcf\x72\xfb\x8f\x3c\x66\xb4\xaf\x30\x8d\xc5\x08\xef\x26\x3c\xb4"
+ "\xaf\x4a\x30\x2e\x8b\x7e\x38\x7e\x59\xf8\x35\xe6\xbd\x26\xda\xfb"
+ "\xbf\x0b\x56\x5e\x2f\x64\xd5\xa2\xf5\x7f\x1b\xb0\xae\x2f\x84\x9c"
+ "\x3e\xa7\x99\x33\xb1\x84\xf1\x7f\x2d\xe4\xff\x36\x84\x96\x53\xcb"
+ "\x45\xfc\x5f\x0b\xd1\xa3\x41\x15\xaf\x8e\x46\x0f\x50\x13\xaf\x5a"
+ "\xbc\xf1\x6e\x21\x3b\xdc\x8f\xad\xe8\x35\xf5\xd9\x56\x26\x6b\xda"
+ "\x8c\xbc\x59\xf9\xa6\xdc\xe6\x7d\xc1\xe5\x57\xa6\x87\x6e\xf3\xca"
+ "\x1c\x6c\xf3\xaf\x42\xb7\x79\xa5\x35\x7c\x9b\x57\x56\x61\x9b\x7f"
+ "\x35\x54\xb7\x56\x36\xc9\x72\x10\x22\x2e\x5f\x69\x0f\xcd\xff\x95"
+ "\x1a\xfe\x43\x6e\x51\x09\x73\xf1\xf2\x41\x70\xcf\x81\x1a\x8e\xd6"
+ "\xea\x13\x2c\xc9\x48\x08\xd8\x54\x2d\xce\x30\x70\x39\x43\x64\x8f"
+ "\xbe\x2d\x08\x29\x7b\xcf\x95\x09\x7d\x7c\xee\x64\xb0\x3e\x3e\x57"
+ "\x1b\xac\x8f\x48\xeb\xe0\x72\x47\x83\xf3\x2d\xe5\xdf\x9e\x8d\x5d"
+ "\x95\xa2\x91\x81\x77\xba\x60\xd5\x4f\x85\x0c\xac\xf2\x05\xb7\x63"
+ "\x95\x39\xb4\x0c\xac\xca\xc5\xfe\xbf\x13\x5a\x06\x56\x15\x85\x97"
+ "\x81\x55\x35\x48\xcb\x77\xd4\x72\xbb\xa0\xc4\x3c\x52\x03\x73\x24"
+ "\xb4\xcd\x5b\x75\x3c\xf4\xbc\xce\xaa\x4e\x41\xe3\x82\xa4\x60\x1a"
+ "\xaf\xf2\x06\xd3\x70\x95\xf9\x5b\xa0\xe1\xe0\x59\x19\x7d\xb6\x02"
+ "\xad\xfe\x3b\xba\xa0\x40\xd6\xff\xd5\x67\x82\xdb\x58\x20\xc7\x3f"
+ "\xa1\xe6\xb2\x0a\x9a\x90\x96\x8e\xd0\xb4\x2c\xb0\x87\xee\x73\x01"
+ "\x8d\x41\x0e\xff\x10\x5d\x2a\x70\x61\xfa\x02\x7a\x77\x40\x73\x58"
+ "\xf5\x98\xbe\xc0\x0b\x06\x3e\x5e\x0d\x8e\x4b\xab\x13\x68\x8e\x9c"
+ "\xcf\x31\xa3\xfc\xc6\x27\x41\x36\x8d\x41\xd4\xae\xa5\x25\xda\x77"
+ "\xa2\xab\xcd\xd4\x6e\x5a\xc7\x42\xdf\xd5\xc4\x17\x43\xb6\xc3\xed"
+ "\x05\x45\xde\x09\x5e\x83\xdb\x4a\x7a\x41\xf0\x0a\xac\x98\xeb\x2c"
+ "\xd3\xd8\xa6\xd5\xb5\xa1\x79\xbc\xfa\x70\x78\xd9\x59\x7d\x5c\xf0"
+ "\x79\x0d\x04\xf3\x79\x75\xa7\xdf\x16\x97\x43\x7d\x45\x19\x18\x96"
+ "\x9e\xd0\xbb\xd3\xb0\xf6\xfe\xc5\x45\x27\xad\x5b\x61\xcc\x59\x58"
+ "\x63\xe1\xf5\x49\x0c\x7d\x0a\x1d\xb4\x70\x1b\xb0\xe6\x6d\xde\x4e"
+ "\x84\x59\xea\x05\x89\xbd\xb8\xea\x24\xe5\x35\xd8\x98\x87\xce\x8d"
+ "\x51\xce\x80\x41\x59\xb8\xba\x03\xd6\x6c\x0b\x2a\x8f\xa3\x91\x43"
+ "\xe0\x38\x26\xe6\xf7\xd7\x1c\x55\xe6\xe1\xc3\xcd\xef\x23\xcc\x29"
+ "\x65\xdd\xaf\x78\x17\xb6\xa6\x3d\xec\xb8\x8c\x6d\xa2\x6f\xc7\xa9"
+ "\x4d\x17\xb7\x03\x6b\xd3\x14\xf9\x15\xef\xe6\xd6\x9a\x03\xdf\xb6"
+ "\xac\x9d\x8d\x79\x43\xf6\xc9\x0c\xad\x07\x6b\x8b\xd5\x78\xc4\x79"
+ "\x31\x6b\xab\x94\xef\x53\xf0\xbe\xf6\x12\xb8\x94\xf6\xd8\x35\xed"
+ "\x69\xc7\x78\xc1\x2d\xe3\x38\x75\x09\x1c\x09\x8e\xa6\x07\x60\x82"
+ "\x1f\x22\xce\x42\xe1\x1d\x74\xfe\x8c\xa3\xae\x1b\x62\xbc\xa0\x17"
+ "\xb1\x9d\x75\x12\x7d\x1b\x42\xb1\xa1\xc3\x3b\xcd\x4e\xef\xe0\xf8"
+ "\x1a\x82\xc4\x69\xf6\x13\xc5\x3e\x79\x0f\x36\xeb\x43\x44\xd3\x13"
+ "\x96\xf3\xf6\xba\xbd\xac\xfb\x00\xdf\x7b\xcb\x1a\x14\xff\x55\xd1"
+ "\xfa\x1f\x5a\x87\xb1\x15\xa6\x21\xfc\x5f\x84\xae\x17\x6a\x7c\x52"
+ "\x6b\x98\xf8\xcf\x4a\xf1\xdf\xb4\xd0\x7a\x6e\xbd\x48\xfc\x67\xa5"
+ "\xf8\x6f\x9a\x7a\xdc\x14\xef\x79\xac\xa7\xd4\x3e\x29\xed\x8f\x65"
+ "\x5a\x41\x7e\xe6\xf3\xf3\xee\xda\x03\x46\x2f\xbd\xd3\x46\xdd\x74"
+ "\x74\xb7\x90\xbe\x1a\x4f\xb8\x8e\xd2\x3e\x0c\x86\x38\x2b\xc9\x22"
+ "\x8d\x65\xa4\xaf\xcf\x9b\xf8\x58\xe6\x15\xba\x58\x5a\xcc\x5c\xa9"
+ "\x9d\x28\x43\x6b\x2d\x0a\xae\x98\x2d\x16\xf1\xdd\x47\x5c\x27\x8c"
+ "\x74\x74\xf3\x71\x51\x47\xfe\x2a\xf7\x5b\xbd\x5f\x01\xe1\x6d\x2e"
+ "\x39\x01\x84\xd7\x3f\x38\x4e\x72\xdc\x25\xa4\xe3\x84\x93\x70\xb7"
+ "\x21\x1c\xe1\x25\x38\xa5\x1f\xe2\xdb\x98\xe7\x9b\xd4\x7d\xe7\xf3"
+ "\x2f\x58\x37\xa6\x9f\xa6\x79\x15\x07\x95\x2b\x5d\xc4\x26\x74\xd2"
+ "\x3b\xb3\xf3\x76\x56\xba\x8a\x4d\x28\xa4\x39\xb1\x42\x3a\xef\x59"
+ "\xf7\xab\xff\x74\x46\x16\x8d\x05\x83\x48\x7b\xbe\xa7\xc5\xe4\x01"
+ "\x27\x14\xa6\x05\xdb\x88\x42\x8d\xff\x6b\xe5\x71\x26\xfe\xea\x69"
+ "\x7d\xa2\xbc\x7e\x95\xec\x01\x73\x78\xfb\xb8\x7c\x5c\x6c\x4d\x05"
+ "\xbd\x93\xa6\x35\x51\x62\xff\xb7\xc2\x62\xcd\xdc\x9b\x6b\x17\x5f"
+ "\x57\xf3\x1f\x58\xef\xba\x48\x21\x23\x45\x91\xc1\x3c\x2d\xac\x2d"
+ "\xfd\x82\xde\x05\x89\xf1\x60\x89\x57\x6b\x1f\x0b\x8f\x2a\xbe\x9b"
+ "\x26\xbd\x5d\x19\x0f\x4c\x6b\x08\xef\x3a\xcd\x38\x53\xc8\xfd\x7f"
+ "\xdf\x90\x71\x61\x1d\xd9\xf5\x20\x99\x6c\xe3\x32\xb4\xce\x74\xc2"
+ "\x8d\x72\x53\x48\xf2\xbf\x6e\x1f\xc2\x6c\xa3\x6f\x0e\xf1\x79\xe4"
+ "\x39\x58\x97\xed\xb3\x81\xe1\x84\x8b\x7f\x53\x65\x44\x19\xe1\x72"
+ "\x4b\xe3\xc6\x44\xb1\x1e\xc9\xad\xa9\xa3\x40\xa1\x39\xc1\xb4\x15"
+ "\xfe\x07\x88\xf5\x14\x24\x0b\xeb\xcc\xb4\x36\x23\xae\x87\xef\xb5"
+ "\x65\x54\x64\xc8\xe1\x3d\x09\x6d\x5e\x6d\xcc\xb3\xee\x48\xe8\xbe"
+ "\xaf\xa3\xf1\xff\x55\x27\x14\x25\x07\xf3\x76\x1d\x1f\xff\x95\xf7"
+ "\x3a\xc8\x7b\x57\x70\xb9\x22\x7d\x30\xef\x0b\x6b\x29\x3f\xec\x1a"
+ "\x9f\xf2\xde\x64\x8c\x67\x96\xba\xf9\x7a\xaf\x22\xd4\xff\xc2\x9c"
+ "\x8b\xd9\x41\x66\xe8\x4d\xf6\x23\xac\xbc\x2e\x18\xed\x56\x51\x79"
+ "\xd0\x9c\xd1\xb5\x7c\xce\x68\x69\x17\xac\x97\xdf\xfd\xac\x3f\xa1"
+ "\x69\x5f\x53\x78\xdf\xa0\x88\xde\xff\x2c\x0d\x6d\x33\x8a\x4e\x85"
+ "\xf6\x0d\x8a\xdc\xb2\x5d\x58\xca\xa2\xb4\x72\xb0\x9e\xbe\xa7\xe3"
+ "\x65\x94\x18\x96\xe6\x42\xc3\xc7\xb0\xeb\xcd\x83\x31\x6c\x21\xd9"
+ "\x83\xf5\x29\x83\x31\xac\x2b\x54\x0c\xeb\x0c\xc1\xcf\xf5\xdb\x43"
+ "\xf3\x73\x7d\x5d\xe8\x18\x76\xfd\x11\x31\xce\xaf\xef\x0e\xe6\xf3"
+ "\xfa\xe3\x81\x77\xc2\x45\x4d\xdf\x9e\x3f\xbc\x61\xca\x50\x7f\x78"
+ "\xc3\x6f\x05\xaf\x36\x7c\x15\xdc\xb6\x0d\xd9\xa1\x6d\xfb\x06\x4b"
+ "\x78\x7f\x78\xc3\xf6\xf0\xb6\x7d\x43\xe3\x50\x7f\xd8\x34\x42\x03"
+ "\xd3\x32\xe8\x2b\x05\xf9\x66\x1b\x4e\x09\x3a\x6d\x24\x7f\x2e\x42"
+ "\x05\xef\x0e\x96\x77\x6c\x33\xe2\x43\xdb\x76\x96\x6c\x9a\x22\x33"
+ "\xe1\x68\x42\x7b\x2f\xdd\xb2\x07\xa2\x50\x07\xde\xe9\xb3\x6d\x1c"
+ "\x94\x7f\x5a\xc7\x47\xf5\x90\x8d\x0c\xbb\x9e\x4e\x52\xda\x47\xed"
+ "\xd8\x58\x72\xb1\xf7\xa5\x11\x89\x90\xfd\xda\x10\x7a\x6c\xe4\xfe"
+ "\x1f\xe1\xb8\x38\xcf\x36\xf6\x68\x74\xcc\x2d\xd6\xe1\x16\xff\x4e"
+ "\xf0\xad\x58\x13\xcb\x16\x1b\xf8\x37\x7d\x61\xed\x6d\x71\x4a\x68"
+ "\x19\x2d\x36\x0f\xda\xdb\x42\x8e\x77\x93\x26\x3f\x4f\xf0\xa0\xf8"
+ "\xa8\x3f\x4a\x3d\xd7\x5d\x5c\x1c\x6c\x93\x8a\xf3\x34\xe5\x34\xf1"
+ "\x5f\x31\x6f\xcf\xe5\x8d\x37\xc5\xdd\xe1\xc7\x9b\x4d\xeb\x45\xff"
+ "\x37\x6b\xde\x2f\x6f\x32\x5c\x7c\xbc\xd9\x14\xa6\xff\x9b\xcc\xc1"
+ "\xe3\xcd\x66\xcd\x3b\xfa\x4d\x79\xa1\xc7\x9b\x4d\xc5\x8a\x9d\x11"
+ "\x76\x63\xd3\x1f\x2f\xcf\xde\x6c\x3a\x1c\x6c\x6f\x36\xd5\x5e\xca"
+ "\xde\x34\x0f\xb1\x37\x9b\xdc\xf1\x75\xa1\xfa\xb2\x39\x26\xb4\xbd"
+ "\xd9\x9c\x2c\x78\xb8\xb9\x24\xd8\xde\x6c\x4e\x0f\xe6\xe1\x26\x0d"
+ "\x0f\x37\x6b\xde\x7f\x6f\x32\x5c\xa9\x4d\x8a\x88\x88\x90\x22\x74"
+ "\x92\x2e\x02\xb3\xb0\x7b\x30\x32\x42\x1f\x11\x89\xd7\x08\xf9\x77"
+ "\xa4\x14\x21\xe9\xf1\x8a\x94\x7f\x47\x68\x9e\x47\x52\x59\xbc\xf4"
+ "\xf2\x6f\xa4\xe6\x79\xc4\x25\xf2\x47\xca\xf5\x2a\xf5\xeb\x35\xcf"
+ "\x91\x97\xc8\x1f\xf1\x77\x96\x87\x21\xcf\xc1\xdf\x41\xce\x5a\xb3"
+ "\x61\x59\xc1\xca\x7c\xbe\xae\x7d\xb9\x69\xd9\x33\xcf\x2c\x5f\xb7"
+ "\xce\x54\xb4\xd6\xf4\xf0\x43\xf3\xef\x7e\xc0\x24\x96\xc7\x17\x4c"
+ "\xbd\x35\x3f\x1a\xe6\x6c\x2c\xa4\x8c\x39\x0b\x66\xe5\x9a\xb2\x1f"
+ "\x7e\x28\x38\x53\x41\xc3\x97\xc1\x5f\x0c\x8b\x4a\xf7\xcc\x15\xd7"
+ "\x02\x54\xed\xe5\x76\xa7\x93\xbe\x3d\x17\xf1\x44\xd9\x5f\x8e\xd3"
+ "\xf7\xcb\xfd\xa5\x8c\xbe\xab\xe8\x80\x92\x2d\xd4\x89\xf1\x8d\x65"
+ "\x60\x7d\x9a\xf6\x53\x29\xd9\xc7\x7e\xef\x02\xd3\xa3\x20\x75\xc0"
+ "\x4b\x7f\x6d\xc9\x44\x58\x7c\x76\x38\xbd\x60\x2a\x25\xdf\xb6\xac"
+ "\x02\xf3\x74\xec\x41\x3f\xa6\xb9\xe5\xef\xf3\x4b\xf7\xf1\xb4\xdf"
+ "\x97\x29\x70\xf1\x5d\xb0\x65\x2a\xfb\x3d\xe3\xcf\xb4\x67\x8d\x80"
+ "\xdb\x32\x8a\x49\x2f\xb4\x93\x5d\xa8\x1b\x0d\x7a\x5a\x97\xbd\x6f"
+ "\x34\x18\xf6\x5d\x4b\x7b\xee\x6e\xd1\x2b\xeb\xb2\x2b\xf0\xd9\x09"
+ "\x2f\x75\x53\xdd\x04\xeb\x97\x5e\xe8\x27\xf8\xfa\x60\xf8\xc9\x81"
+ "\x75\xdc\x5b\xf4\x12\xc2\x65\x9d\x86\xf8\x78\x1f\xbb\xe0\x89\xfe"
+ "\x6b\xee\x84\x4c\xf4\xd3\x90\x15\xc7\xbd\x65\x20\xbe\x8d\xda\xb2"
+ "\x65\x93\xef\xff\x27\xee\x7d\xe0\xa2\xae\xd2\xfd\xf1\xf3\x19\x46"
+ "\x1c\x08\x98\xd1\xc8\x26\xd3\x1c\x0b\x75\x2a\x4c\x2a\xfb\x7d\xdd"
+ "\xfd\x59\x91\xd9\xbd\x76\x5f\x96\xec\x5e\xbb\x5f\x76\xaf\x05\x16"
+ "\xb4\x58\xa6\xb3\x48\x8a\x86\x80\xa3\xb9\x68\xfc\xab\xa8\x48\x11"
+ "\xa8\xdc\x5d\xdd\xb5\xb2\x8d\x76\x69\xaf\xd5\x94\xd4\xa5\x42\x86"
+ "\x5a\xdb\xa5\xae\xd5\x48\x48\xc8\xa2\x4e\x32\xc0\x08\x33\x9f\xf3"
+ "\x7b\xde\xe7\x7c\x3e\x33\x03\x81\xad\xf7\xde\xd7\xeb\xe7\xeb\x85"
+ "\xf3\xf9\x9c\xcf\xf9\xfb\x9c\xe7\x3c\xe7\x79\x9e\xf3\x9c\xe7\xe1"
+ "\x01\xf8\x4c\xb8\xab\xb7\x88\x57\x3c\xc2\x8c\xb4\x9e\x15\x57\x2e"
+ "\xee\x52\x6c\xce\xaa\xcb\x66\x46\x1a\xff\xb4\x1e\x56\x58\x65\xbb"
+ "\x9b\xf8\xc6\xbb\x98\xf1\xa3\x7c\xdc\x77\xf5\x6d\x2a\xff\x94\x19"
+ "\x7f\x3f\x54\x6c\x18\xe2\x56\x56\x90\xc7\xbb\x39\xfc\x70\xfb\xb8"
+ "\x1f\xf6\xb6\x2d\x99\x41\xe4\x79\x68\xb0\xc8\xca\x5a\x89\x7d\xd9"
+ "\x7c\x8c\xfb\x4b\x3e\x95\xfe\x2a\x8e\xf4\xfa\x70\x7f\xd6\xb4\xf9"
+ "\x2e\x16\xd5\x95\xce\x0c\x47\x72\xaa\x99\x7b\x85\x8f\x15\x1c\xe3"
+ "\xdd\x2d\x99\x27\x58\x6b\xce\x41\x96\xd1\xce\x0c\x2d\x9d\x5f\x32"
+ "\xe1\x4b\xba\x3c\x39\xb5\xb0\x9f\x59\x37\xaf\x42\x5a\x3f\xdb\xb4"
+ "\x99\xc5\x6f\xfa\x0c\x72\x50\x3b\xb5\x73\x8a\xfd\xfc\x28\x53\xa8"
+ "\x3e\xc3\x63\x5f\x32\xeb\x63\x3f\xc3\x3d\xf3\x54\x56\x53\xc8\xac"
+ "\xbc\xc8\x1e\x37\x54\x64\xb7\x0c\x71\xfb\xe4\xc1\x22\x7b\x62\xab"
+ "\x83\xf2\x77\xbe\xc5\x12\xda\x59\xe2\xdb\x3d\xed\x86\xea\xb3\x6c"
+ "\x1a\xc6\xd4\x45\x63\xab\x39\x4b\xf9\xcb\x15\x97\x4a\x65\x23\xcb"
+ "\x04\xe2\x95\x76\x77\xba\x9f\xa9\x54\x57\xf5\x10\x9b\x56\x33\xc4"
+ "\xac\x6a\x99\xe2\x42\xb9\x5e\x56\xf4\xa4\xbb\x85\x11\xa6\xf0\xe0"
+ "\xf0\xce\xef\xd2\x89\x1e\x4e\x7c\xf5\xfe\x46\xa3\xbb\xa5\x97\x1d"
+ "\xf1\x0d\xb1\x56\xf6\x05\x73\xe7\x7f\xeb\xfa\xfd\xfd\x8d\x13\x88"
+ "\x9f\x54\x5c\x9b\x60\x03\x2f\x71\xa7\xe8\x08\xfc\xe7\x15\xb3\x8a"
+ "\x42\x16\xe7\xd8\xc4\x26\xf6\x50\xba\xa0\x3d\x25\x9d\x99\xee\xc0"
+ "\xb7\xae\x4d\xe2\x3e\xf8\xe3\xdd\x85\x47\x58\x54\xab\xaf\x1a\xf7"
+ "\x8e\x0d\xc1\x84\xe4\x54\xb7\xaf\x8d\xb9\x1d\x5f\xbb\xd4\xb8\x64"
+ "\x7b\xa9\xca\x4c\x2f\x0f\xb4\x19\xdc\xc6\x01\xe6\x4e\xf7\xb1\x77"
+ "\xa8\x6d\x5e\x9e\xbc\x94\x68\x56\x6a\xab\xcf\x0f\xff\x3b\x29\xbc"
+ "\xcf\x1a\x5b\x91\xcb\x92\x6b\xcf\xb2\xa4\x3d\x67\x99\x9d\x0f\xda"
+ "\x0d\xb8\xe3\x0d\x7f\x69\x7b\xe8\x37\x8e\x64\x30\x1a\xbb\xb8\xeb"
+ "\xcd\xe3\xb5\xbb\xde\xc3\x76\x56\x37\x14\xbe\xeb\x3d\xd4\x17\xbe"
+ "\xeb\x4d\x38\x65\xc2\x7d\x6f\x0f\x2b\xac\x31\xb7\xb0\x89\xb4\x4e"
+ "\x5c\xc0\xef\x8a\xd3\xcc\xb8\xf5\x34\x63\xd7\x15\x1b\x20\x67\x1a"
+ "\x69\x3d\x6c\x76\xd3\xdc\xe0\xb9\x83\x15\xcf\xa7\xdf\x38\xfa\x23"
+ "\x79\xae\x58\xf8\xaa\xe8\xd4\xf0\x98\xd2\x0c\x94\x36\x9d\x7e\xa3"
+ "\xe8\xf7\x92\xa2\x1a\xee\xe5\x25\xfd\x0b\x88\x57\x89\x05\x3e\xcb"
+ "\xfb\xe5\xfd\x0b\x06\x9d\xc5\x71\x1e\x76\x60\xb5\x8e\xd7\x92\xbe"
+ "\x6f\x36\xbd\xd3\x71\x0a\xfe\xde\xbd\xa2\x5f\xc3\x39\x0a\x7c\xbf"
+ "\x6b\xe9\xe8\xc3\xa3\x68\x97\xda\x4f\xa7\x5f\xb3\x94\x41\x8b\x7a"
+ "\xf5\xb2\x7d\xc3\x39\x68\xf3\x11\x4a\xe7\x7a\x3a\x8d\xdb\x88\x6f"
+ "\xaf\x77\x9c\x32\xc8\x3c\x76\x03\xd5\xe9\xd7\xea\xa7\xb5\x5f\x70"
+ "\x00\x6b\xbc\xcf\x60\xe6\x87\x33\xe7\xb3\x9a\x67\x79\xcb\x9e\x67"
+ "\x79\x93\x5c\x7b\xc5\x07\x3d\xec\x15\x71\xbf\x90\xf6\xf0\xa6\x52"
+ "\xfa\x76\x98\xa4\x71\xc0\xa5\x29\x0b\xf6\xa5\xc5\x6d\x1e\x76\x65"
+ "\x62\xe4\x18\xb8\x73\xd3\x41\xec\xa3\xaf\x14\x36\x93\x3c\xf9\xd8"
+ "\xc1\xd6\xce\x5e\xf6\xfb\xa1\xee\x09\x45\x1f\x32\x83\x3b\xd0\xc1"
+ "\xe6\x25\xca\x38\x39\x75\xcf\x72\xcf\xd3\x88\x1f\xfc\x2c\xef\x25"
+ "\x7c\x99\xde\xc3\xb6\x4c\xbf\x36\x91\x25\x7e\x4c\x5c\x89\xa4\x4f"
+ "\x5b\x6e\x8a\xa0\x4f\x6f\x1d\xf1\x34\x46\xd0\xa6\xc7\x1f\xf9\x3e"
+ "\x6d\xda\xb6\x4a\xd2\x26\x5a\xfb\x82\x16\x05\xb5\x7b\xe4\xdb\xee"
+ "\x19\x95\xae\xdd\x5f\xd9\xf6\xa3\x51\xe9\x7e\x2d\x7d\xd6\xa8\x74"
+ "\xaf\x4c\xdf\x9a\xad\xd3\xbe\x56\xf4\x63\x03\x68\xdf\xd6\x3b\x41"
+ "\xfb\x5a\x33\x35\xda\x27\xe8\xcf\xd6\xb9\xfc\x45\xa2\x45\xeb\x41"
+ "\x6f\xb6\x4e\x40\xff\xf9\xdb\x4c\xef\x7b\x4c\x17\x73\xbe\x8f\xb4"
+ "\xca\x2f\x98\x91\xfe\x34\xba\x57\x70\x29\xe8\x1e\x68\x1e\x68\xdf"
+ "\xee\x29\xbc\x7d\xf7\xb3\xfc\x68\x8d\xf0\x5b\xed\x0c\xd1\xbf\x27"
+ "\x28\xad\x94\xd2\x9e\xa0\xef\xa0\x83\x80\xc9\x91\xf4\x46\x26\xe2"
+ "\xda\x94\xf8\xf2\x55\x43\x0a\x2b\xa7\xf9\x86\xff\xab\x6d\x04\x5f"
+ "\xb3\xc2\x1c\xee\x3c\x9f\xb8\x87\x02\x5f\xe9\xad\x79\x9d\x58\x77"
+ "\x53\xb6\xaa\xd0\x53\x9c\x60\x85\x3e\xde\x83\xbb\x2a\xe8\x43\xc6"
+ "\xc6\x7f\x81\xaf\x6f\xa5\x29\x87\x31\xf8\x25\x00\xcd\xa6\xbe\x18"
+ "\x2b\xa9\x4f\xd2\xb7\xb0\xf3\x90\x87\x7d\xad\xe1\xeb\xe3\xb8\xab"
+ "\x46\x7b\x0a\x09\xe2\x4e\xa2\x8f\x34\x36\x73\xb0\x98\xc1\x37\x0b"
+ "\xe2\x6b\xe2\x77\xb7\x41\xcd\xa9\xd4\xfd\xb3\x38\x89\x36\x50\x1e"
+ "\x77\xbb\x9f\xa1\xcf\x1e\xe6\x5c\x7a\xa4\xa0\x91\xca\x6f\xf1\x02"
+ "\x36\xdc\x59\xa4\xd7\xa1\x88\x3a\x0c\x42\x77\x9b\x43\xf9\x3c\xa2"
+ "\x7c\xec\x77\xe9\x47\x56\x78\x19\xe8\xbe\xbb\x9b\xea\x28\xe8\x90"
+ "\x75\x50\x5d\x9c\xf6\x80\x11\xdf\xb4\xfa\xe3\x37\xf3\xef\xa8\xfe"
+ "\x43\x98\x2f\xf8\xe9\x82\x9d\x12\xc1\x25\x0e\xbe\x1a\x24\x1f\xea"
+ "\xbc\xa3\xee\x0b\xc6\x34\x5f\x63\x84\x6f\xce\xc5\xf0\xe5\x05\xff"
+ "\x62\xe7\xf3\x2d\x46\x30\x4a\xd2\xfd\x8b\xa9\x1b\xfe\x77\x7d\x8b"
+ "\x51\xdd\xd6\x5a\x03\xa7\x35\xe7\x5c\x0c\xff\x62\xd4\xff\xbd\xc0"
+ "\x43\x6d\x4c\x4b\x9e\xf9\x39\x60\xbe\xa5\x14\x69\x15\x4e\xde\xac"
+ "\xcf\x3f\xc6\x8b\xb1\xd0\x37\x87\xe4\x0f\x39\xad\xcb\x6d\x4b\xf0"
+ "\x9d\xd2\x56\x20\xff\x3c\xa2\x63\x6e\xda\xc3\x5e\xed\x08\x1a\x2a"
+ "\x36\x31\xa3\xa4\x69\x8f\xaf\x44\x79\x49\xd3\x1e\xb7\x86\x69\xda"
+ "\xe3\xf1\x92\xa6\x49\x18\x4b\x9a\xf6\xb8\x22\x69\xda\xb6\x73\xc2"
+ "\x9e\x88\x68\x1a\xbe\x81\xae\xe9\x34\x6d\xcf\x14\xde\x0c\xda\x31"
+ "\xe8\xdc\xd6\xad\xd3\xb6\x32\x4a\x03\xed\x40\x1f\x25\x9d\xda\x9a"
+ "\xca\xff\xcb\xce\xa4\xbd\x26\x9e\x73\xe0\x3f\xa3\x5b\x7b\xc6\x7e"
+ "\xf2\x33\x49\xe3\x1e\x5f\x18\xa6\x71\xdb\x5c\xe1\xb2\xa0\x71\x8f"
+ "\xff\x44\xd2\x38\x99\x5e\xf7\x73\xd0\xb8\xad\xa9\x80\x81\x56\xbf"
+ "\x01\xe7\x68\x5a\x7e\xc0\x71\x49\x24\x8d\x1b\xb9\xbe\x1e\xaf\xd2"
+ "\x69\x1c\x68\x1b\xbd\xef\xf5\xb0\x99\x42\x2f\x8c\x75\x56\x45\x30"
+ "\xd7\xd7\x1d\xe6\x00\x63\x46\xfc\x00\xc0\xed\xf6\x53\x6c\xa2\xe6"
+ "\xb7\x46\x1b\xf7\xe3\x1e\xfd\x8e\x26\xc1\xff\xfb\x3e\xcd\x58\xd8"
+ "\x2f\x19\xcd\xf5\x0c\xf8\x73\x74\x17\x77\x30\x77\x35\x2f\x6e\x0d"
+ "\x1c\x63\xea\xd6\x87\x8f\x63\x5e\x49\xde\xf8\x7f\xf1\x0b\xba\xd3"
+ "\xc3\xb6\xcf\xcc\xf0\x09\xfd\xfd\xf1\x0a\x03\x7d\xcb\x1f\xf1\xed"
+ "\x66\xb4\x01\xbd\x22\x3d\x9b\xc6\xd3\x23\x5c\x40\x5b\x65\xe7\x69"
+ "\x6b\xbf\x68\x8b\x78\x29\x92\x7b\x26\x9d\x66\xdb\xc5\x19\x9a\xf0"
+ "\xc9\x3c\x76\x5d\x9f\x6b\xdf\xa3\xc6\xf9\x7e\xee\xfc\xe5\x7f\x75"
+ "\xd9\xf9\xcb\xff\xea\x47\xa0\x41\xb8\x8f\x17\x74\x8e\xac\x27\x21"
+ "\xa0\xe7\xeb\x41\xbe\x95\xda\x39\xc8\xf1\xa2\x99\x42\x2e\xb3\xea"
+ "\x75\x02\xef\xca\x29\x9f\xf0\x5f\x4b\x34\x72\xf1\x46\x06\xdf\xc1"
+ "\x91\x65\xf7\x84\xe1\xfb\xab\xb4\xf3\xe8\x69\xe2\xdc\x24\x05\x22"
+ "\xbe\xfc\x61\xda\x05\x71\x97\xa6\x2a\x74\xf6\xf0\x2b\x1f\xd1\x4b"
+ "\x11\xbf\x55\xbb\xb7\xdb\x4b\xf4\x6d\x06\x7c\x6c\x82\xaf\xd4\xee"
+ "\x5a\x5c\x4a\x74\x79\x32\xfc\xb0\x40\x5f\x9d\x11\x4c\x33\x1c\x16"
+ "\xfe\xf7\x4b\x52\xf4\xb2\xe3\xe9\xf6\xd0\xae\xd6\xa6\xb8\x87\x44"
+ "\x65\xb2\xf4\x32\xa8\x1b\x77\x6f\x68\x3f\x9e\x21\xfc\x9b\x05\x7a"
+ "\x41\x03\x2f\x25\x1e\x74\xb2\x6c\x27\x93\x69\xed\x54\x7b\xd8\xf6"
+ "\xac\xf3\xdd\x73\x1a\x7f\x7c\x25\x47\x2f\x7c\x7c\x4c\x1b\xdf\x0e"
+ "\xcb\x0f\x8c\xef\x3c\xed\xee\x58\x7a\xe1\xed\x5a\xf4\x76\x4b\x2e"
+ "\x1c\xae\x3b\x0e\xfd\xe3\x70\x4d\xd1\xe0\xba\xc3\xfb\x03\x70\x1d"
+ "\xa3\x9d\x9d\x49\xff\x78\x3b\x36\xad\x9d\x9d\xe9\x63\xb5\xc3\xc4"
+ "\xbf\x71\xfd\xf5\x98\xf4\x18\x31\x5a\x5c\xe2\x18\xaa\xa7\xde\xc3"
+ "\x4a\x42\xb1\x87\x65\xbc\xa4\x9d\x0d\x1e\xb6\xa3\x6a\xe4\x3d\xae"
+ "\x9d\x9f\x64\xd4\x63\x5f\xe7\xaa\x87\xed\x3c\x0a\x5d\xdb\xe2\xcd"
+ "\xd2\x3f\xa0\x56\x86\xe8\xf9\x8e\x69\xe7\x3b\x4f\x13\xb1\x30\x34"
+ "\xdf\x1d\xb8\x9f\xca\xcb\x59\x7d\x5f\x51\x0e\x93\xb1\xa2\x9f\xb8"
+ "\x1e\xf7\x90\xe8\x79\x22\x3d\x4b\x3d\x14\xe2\x0b\x48\x9f\x14\xd1"
+ "\x94\xb6\x05\xf1\x27\xe4\xfd\xbd\x27\x96\x53\x1f\xf2\x85\xae\x49"
+ "\xf8\xd8\x17\xbe\x5d\x7c\x94\xcf\x80\xb2\xd2\xa7\xc7\x13\xf9\x7a"
+ "\x1e\x8f\x5e\x5f\xc8\xbf\xc5\x13\x77\xca\xbd\xe5\x89\x25\x7d\xe3"
+ "\xc4\x31\x82\x9f\xb3\xbd\x85\x29\x23\xee\x1f\xde\x91\x9b\xbb\x36"
+ "\xf7\xc7\xb6\x75\x8f\xdc\x3f\x77\x5d\xde\xca\xbc\x47\xd7\x89\x8b"
+ "\xea\xb1\x8c\x12\x6c\x79\xab\x1e\xc9\x5e\xfb\x68\x9e\x7d\xc3\xca"
+ "\x55\xf2\x62\xfb\xd5\x94\x31\x32\x13\x1b\x19\x37\x92\x68\x10\xfc"
+ "\x1b\xc2\x07\x85\x88\x1d\x09\x5f\x24\xfa\xbd\xdd\x26\xab\x88\xb1"
+ "\x45\x34\xab\x74\xa1\x87\xad\xed\xd6\xe7\x01\xfe\x11\x89\x6f\xb1"
+ "\xf6\xb0\xd2\x9f\x01\x77\x96\x11\x0b\x5a\x27\xfd\x4a\x08\xdf\x00"
+ "\xee\x3c\x4a\x68\x65\x26\xd7\x7a\xe8\x61\x4b\xdb\x54\xe7\x13\x2e"
+ "\xe1\xef\x71\x53\x0f\xde\xfb\x75\x3e\x01\xe7\x4a\xf2\x1c\x78\xc6"
+ "\xad\x1d\xac\x74\x16\xda\xc5\xba\xab\x7d\x4a\xc6\xea\xe6\xce\x27"
+ "\xda\x71\x57\x9b\xde\x4d\xd4\x07\x97\xce\x8b\x52\x7f\xe3\x78\x3c"
+ "\xdb\xe7\x61\xa5\xbe\xf7\x2c\x5e\xa6\xdd\xf5\x36\xd5\xca\x7b\xdd"
+ "\x46\xca\xdb\x1b\xca\xeb\xa4\xbc\x65\x6c\x1f\xed\x9b\x63\x9e\x65"
+ "\xf3\x58\x35\x55\x1d\x4e\x9f\x10\x39\x66\x92\xab\x69\xfe\xca\x7e"
+ "\x4d\x63\x4f\xd4\x71\x45\xce\x7d\x59\x99\xf4\xbd\xac\xa6\x52\x5a"
+ "\x34\xfd\xa6\xf7\xd1\x37\xf8\x40\xa0\x6f\x99\x38\x23\x6b\x2d\x38"
+ "\xe3\x3a\x6c\xed\xa0\x79\x2f\x73\x78\xd8\xfa\x69\xf2\xde\x1a\xe5"
+ "\xa7\x36\xdc\xc5\x43\xac\xc9\xc6\x5d\xd0\xd1\x79\x58\xd9\xa1\x26"
+ "\x9b\x8f\xf1\xa8\x7f\x3f\x8e\x72\xb4\xae\xac\x45\xf9\xe0\x45\x28"
+ "\x5d\xdc\xcf\x2b\x3b\xa8\xc3\x3c\xcf\xc6\x4f\x21\xcf\x78\x7a\x65"
+ "\xec\x97\x15\x62\x2f\x39\xcb\x60\x83\xd5\xc9\xca\x8e\x8e\xde\x2f"
+ "\x66\x65\xfd\xd8\x96\xb5\x32\xcf\xb6\x7a\xd5\x9a\x6c\x5b\xd6\xaa"
+ "\x2c\xdb\x9a\xb5\x79\xb6\x5f\xac\x85\x82\x07\x2a\x9d\x11\x38\xa1"
+ "\x62\x7c\x1b\xd2\x27\xe8\x67\xd8\x7d\x1b\x72\xa2\x25\x4e\x57\xcc"
+ "\xed\x1b\xcc\x99\x38\x12\x26\x15\x93\xe4\x5e\x59\x9e\x49\x7d\x37"
+ "\xca\xfb\x7f\x51\xdd\xf4\x4e\xe3\x2f\x6b\x1e\xb9\x76\x2b\xee\xd5"
+ "\xf2\x96\xea\x79\x05\x5e\x5c\xd9\x13\xfa\x56\xa1\xe1\x63\x9d\xbc"
+ "\xa7\x2c\xfc\xde\xd4\x09\x1b\xfe\x72\xd7\xb8\x65\xe0\xeb\x6b\x13"
+ "\x7b\xe0\x34\x2b\xdf\xcf\x9d\x65\x3e\x0d\x87\x4c\x6a\x89\x9a\xa6"
+ "\xe1\x0f\xe1\x44\x05\xfb\x3e\xfe\x54\xac\x00\xfe\xf0\xc1\x74\x93"
+ "\xb0\xf7\x08\xf8\x89\xce\xd1\x3b\xed\xcf\x1e\x56\x9e\x85\x71\xf8"
+ "\x36\xa4\x9b\x8a\x9e\x17\xfe\xf7\x4e\xe2\xec\x14\xf1\x69\x08\x57"
+ "\x62\x64\x1c\xcd\x8a\xe5\xfa\x1c\xe9\xf9\xc7\xc4\x31\x89\x2f\x23"
+ "\x71\x4c\xc2\xf3\x65\x81\x63\xc4\x1f\x50\x9f\x0c\xba\x9f\x3f\xec"
+ "\x21\xd4\xb7\xa6\xbc\xcd\x9c\x53\x1b\x8d\x11\x78\x70\x7a\x2c\x3c"
+ "\xa0\xb9\x7d\x60\xf5\xda\x07\x1e\xa6\x85\x9e\x9b\x9d\xf7\x40\x0e"
+ "\x7c\x5b\x80\x0e\x08\xc7\x19\xb3\xb2\x6c\x8f\xae\xcb\x7e\x20\x96"
+ "\x8d\x95\x2b\xf4\x31\x72\xfe\x2d\x2a\xe1\x6b\x5f\x5f\xfa\x04\xdc"
+ "\xb1\x90\x77\x2a\x9e\xdc\xdc\xb7\x8e\x64\x91\x11\xf3\xfe\xe4\x2f"
+ "\xdd\xd6\x14\xe2\xe9\x52\x84\xef\x38\xc0\x4c\xda\x09\x3c\xf9\x06"
+ "\xe0\xd0\x67\x50\x68\x3f\xa9\xcc\xd3\x71\x80\x9e\x8b\x69\x4c\x39"
+ "\x61\x1b\x8d\x27\x1b\xfa\x0c\x13\x8e\x81\xfe\x48\x7b\x90\x1e\xa2"
+ "\x03\xe6\xba\x0e\x56\x29\x6c\xc1\x6a\xc5\x7e\x54\xd9\xa0\x97\x29"
+ "\x0f\xdd\x73\x7e\x72\x9a\x8e\x27\x11\x65\x7e\x8d\x34\xe1\xeb\xc8"
+ "\x59\xd1\x86\x39\xe7\x72\xee\x8d\x7a\x3e\x82\x2b\xaf\x13\x74\xe4"
+ "\x49\xd3\x68\xda\xf0\x9e\x05\x67\xe2\xb2\x3f\x02\xff\x4c\xaa\x5d"
+ "\xf8\x4d\x21\x5e\xaf\x83\x3d\x79\x89\x66\x9f\x22\x74\x8a\xee\x7c"
+ "\xaa\xcb\x2f\xeb\xa2\xb6\x06\xf4\xb6\x78\x8c\x6a\xaf\x13\x78\xf6"
+ "\x64\x4e\x58\x67\xf8\x64\x22\x64\x65\xde\x97\x1e\xed\x61\x95\xcb"
+ "\x05\x6e\xd1\x73\xde\x65\xd2\x87\x1b\xf0\x0d\xe3\x04\x5e\x85\x71"
+ "\xea\xc9\x7d\xfa\x7c\x63\xcc\x54\x6e\x85\x4d\xf8\xf9\x7d\xd2\xa5"
+ "\xc3\x72\x3c\x5f\x33\x62\xdd\x9a\xa8\x2f\x83\x72\xed\x0a\x39\x4f"
+ "\xfa\x17\xc2\x3d\x97\x28\xea\x63\x5a\x17\x7b\xea\x13\xd8\xee\x9b"
+ "\xfd\x90\x9b\xd4\x34\xf8\x4e\x90\x7b\xd9\x53\x36\xc2\xe1\xc4\xf0"
+ "\xdd\xf4\xa7\x88\xff\xab\x4c\x94\x73\xf7\xd4\xc2\x88\xb5\xe7\xd5"
+ "\xec\x01\x26\x02\x46\xa0\x67\xee\xfc\x3b\xc4\x7a\x95\xf7\x7e\x9f"
+ "\xca\xd1\xcb\x09\x3f\x03\x84\x1b\xb0\x83\x3d\xcd\x9e\x2a\xc1\x1e"
+ "\x81\xfe\x79\xd8\x53\x26\xb4\x8f\xf1\x61\xcf\x16\x78\x63\x45\x0c"
+ "\x94\xa7\xf6\x8e\xea\x43\x83\x5e\x97\x56\x77\x93\xfe\x0e\xbf\x63"
+ "\x1e\x56\x95\x86\x38\x90\x87\x7d\x62\x0c\x17\x35\x91\x54\xd0\xe4"
+ "\x13\xf9\x7a\x75\x18\x52\x7a\x31\xbd\xd3\x5c\x94\x0a\x1f\x59\xbc"
+ "\x94\xed\x93\xb4\xa8\x0a\x31\x4c\x79\x91\x0d\x7e\x09\x17\x4a\x7a"
+ "\x23\x7c\xe9\x88\x6f\x31\xda\x9a\x8d\xc1\x1d\x21\x61\x17\xe3\x0b"
+ "\x08\xda\x20\x7d\x2f\xd0\x77\x5a\x23\x83\x88\xe9\x32\x9c\x13\x23"
+ "\xfb\xf6\x74\x66\xa8\x0d\xc4\xa7\x14\x67\x90\x4f\xa7\x49\x5f\x26"
+ "\x13\x49\xd6\x7b\xba\x58\x9f\xbf\x6d\xcf\x52\x1a\xe2\xa7\x1a\x98"
+ "\xa9\x49\xf8\x0a\x7b\xba\x46\xef\xaf\xf6\xcd\x20\xf0\x41\xc0\xe0"
+ "\xe9\xd0\xfa\xef\x13\xb1\x3e\x9f\x6e\xd6\xdb\x11\x79\x29\x1f\xf2"
+ "\x37\x25\x89\x6f\x9d\xa1\x7a\xa4\x0f\x15\x93\x88\xf7\x5c\x8f\x6f"
+ "\x55\x2c\x4c\xab\x9e\x12\xfe\x8a\x85\xdd\x1a\x8d\xc3\xfb\x58\x4e"
+ "\x8c\x98\x03\x1b\x43\x7c\x10\xc4\x11\x36\x48\x5c\xac\x9a\xaf\x97"
+ "\x89\x52\x00\xc7\xaa\xc5\x7a\xdb\x7a\x1d\xe8\xff\x79\x69\x9e\x1c"
+ "\x8b\x11\x6b\x44\x8b\xd9\x29\xe8\x85\xe4\xb5\xaa\x8e\x08\x1c\x14"
+ "\xe3\xac\xaa\x8f\x9c\x6b\xc9\xcb\x55\x35\x44\xe0\x03\xfa\x13\x9a"
+ "\x7f\x9a\x7b\x9f\xdc\x4b\xaa\xda\x23\xfa\x48\x73\x52\xd5\x1d\x9a"
+ "\x87\x9d\x62\x8e\x10\x03\x6a\xcc\x78\x8f\x62\xad\x50\x1e\x95\x8b"
+ "\x7e\x62\x3e\x48\x16\x5b\xc0\x9a\xc0\x13\xd2\x5a\x21\x98\x50\x1f"
+ "\x9f\x79\x04\x78\x35\xe8\x7c\x26\x75\x24\x6e\x3e\x93\x16\xd1\x5f"
+ "\x05\x74\x9d\xd2\xb2\xf4\x3c\x1e\xf6\x8c\xb8\xcb\xa4\xc3\x93\xbe"
+ "\x15\x87\xe6\xf1\x06\x91\xb7\x52\xef\xe7\x0f\xec\x19\x1a\xac\x9e"
+ "\xf9\x50\x6b\xa3\x59\x6f\x83\x9e\x49\xfe\xa9\x5a\x31\xba\x8e\xfb"
+ "\x37\xe6\x65\x4b\xe7\x46\xd8\xe4\x57\x3e\xf0\x70\x76\x56\xb2\x6d"
+ "\xe5\x83\x70\x83\xb4\x6e\x75\x76\xb6\x43\x1c\xe2\x8c\xe4\x03\x13"
+ "\x45\x7b\x04\x07\xe9\x73\xfa\xb9\x9f\x3c\x2d\xed\x57\xb0\x2e\xb0"
+ "\xde\xbd\x58\xef\x87\x0b\xce\x0a\xd9\xc6\x5d\x7c\x03\x73\xfb\x79"
+ "\x31\xf8\x7f\x41\xfb\x30\x7e\xab\x4f\xee\x03\x34\x9f\xd8\x23\x07"
+ "\x9d\xcf\x3a\x46\xc2\xeb\xd9\xe2\x91\x6b\xf9\xd9\xca\xb1\xe9\xc4"
+ "\xb3\xd7\x0b\x3a\x51\x22\xf1\x02\xf4\x09\xb6\xff\xa8\x97\xca\x34"
+ "\x8d\xaa\xf3\x68\x98\x46\x3d\xeb\xd1\x69\x94\xdc\x27\x9e\x33\xd2"
+ "\x1e\x54\xa9\xb5\x15\x08\xe3\xcd\x73\x05\x12\x6f\x9e\x23\xf9\xef"
+ "\xe5\x6d\xba\xac\x23\xf7\x8e\x67\x3c\xe0\x1f\x65\x7c\xed\xe7\x52"
+ "\xf4\xfa\xaa\x26\x63\xdf\x78\x2e\xf5\xfb\xfc\xc3\xb3\xbd\xe0\x1f"
+ "\x60\x97\x08\x58\x88\x78\xc2\x62\xdd\x3c\xb7\x3a\x82\xfe\x58\xe8"
+ "\xbd\x60\xac\xb9\xbe\x1f\xdb\xf1\x5c\x1c\xb7\xcd\x7d\x60\x4d\xde"
+ "\xcd\x70\x51\x95\x9d\xef\xc8\x7e\x20\x2f\x3b\x6b\xf4\x39\x9b\x5d"
+ "\xe7\xc5\x70\xc6\x5d\x45\xeb\xde\x1b\x03\x78\x3c\x47\xe3\x7f\x3e"
+ "\xa0\x8f\x41\xd0\x29\xe2\x1d\x35\x1a\x17\xd7\xc5\x9e\xff\x50\xc6"
+ "\x12\x7f\x2e\xa0\xe3\x09\xf2\xdd\x9e\xcf\xd5\x41\x67\x35\x8d\xff"
+ "\x59\x93\x26\x6f\x91\x4c\x5b\x6d\xd3\xdf\xc3\xe5\xab\xb3\xc5\xde"
+ "\xf7\xac\xb0\xe9\x23\x98\x56\x77\x46\xf0\x5b\x78\x3f\xa4\xbd\x0b"
+ "\x3f\x4c\x32\x2e\x7a\xf5\x46\x09\xdf\x6a\x9a\xff\x67\x34\x5a\xf1"
+ "\x7c\xb3\xac\x87\xb1\x97\x0a\xbd\x13\xea\x84\x7e\xbf\xba\x52\x6f"
+ "\x8f\xca\x1f\x8b\x6c\x13\xfb\xd6\xe8\xfa\x3c\xac\x5a\xdc\x0f\xd9"
+ "\x2a\x7c\xc8\x55\xb7\x8c\xd1\xd7\xb4\xc8\x7c\x94\x87\xe4\xdf\x67"
+ "\x6a\xf4\x31\xff\x6b\x3e\xd2\x9e\x37\x9e\x67\x8c\xbd\x72\x8c\xcf"
+ "\x17\x03\xb7\xd0\x3e\xf0\x5f\xeb\x43\x96\xe6\x97\x04\xbe\xf1\x3c"
+ "\xe8\xbf\xf0\x8f\x66\xc5\xba\x7e\x9e\xe4\xdf\x27\x5b\xf4\x71\x60"
+ "\x8c\x0d\x85\x5e\xa3\xee\x97\x4a\x96\x7f\xfe\xe6\x91\x7d\x7b\xbe"
+ "\x34\xa2\x4c\xb7\xeb\x4a\xe8\xee\x9f\x9f\xc5\x9d\xcf\x95\x00\x0f"
+ "\xe1\xaf\xaa\x2a\x84\x87\xcf\x37\x7e\x1f\xef\x9e\x4f\x02\xde\x45"
+ "\xe2\xd2\xaa\x1b\x1e\x20\x4c\x5a\x97\x9d\xf7\x63\xc1\xdd\x13\x63"
+ "\x07\xb7\x67\x2b\xf3\x56\xad\x5d\xb3\x2e\xd9\xb6\x2e\x6b\xa5\xb6"
+ "\xe8\x47\xac\x79\xa7\x90\xfd\x7d\xfa\x3a\x1b\x74\xee\x4a\x0a\xd3"
+ "\x96\x5d\x61\xfc\x87\x8d\xd6\x95\xd0\xcd\xee\xda\x28\xd7\xd3\xae"
+ "\xa5\x11\x6b\x57\x94\xc7\x1a\xad\x13\x3c\xdb\xae\xc8\xfd\xdf\x47"
+ "\x30\x8d\x39\xcd\x76\x5d\xa2\xc1\xd4\x27\x61\xbc\xeb\x5d\x31\x4e"
+ "\xe1\x8f\xeb\xf9\xa3\x18\xa7\xf0\xff\x22\xf8\xb3\x5d\xfb\xf4\xf1"
+ "\x86\xe5\x86\x5d\x2e\xc1\x47\x69\xfc\xda\x0f\xc9\xf5\x92\x3f\xdd"
+ "\xbd\x42\xd3\xbd\xb5\xeb\x32\x9e\xce\x5f\x53\x5f\xb2\x24\xaf\xba"
+ "\xfb\x92\x65\x05\x7c\x38\x23\x1f\x7e\xea\x30\x07\xbb\x6f\xd3\x79"
+ "\x4b\x61\xbf\xb7\x43\x4d\x19\x74\xee\x5e\x10\x49\x27\x78\xd4\xc3"
+ "\xed\x1a\x8f\x98\x22\x65\xd7\x8b\xfe\xd4\x41\x6d\xe1\xec\xe1\x3c"
+ "\x7d\xa3\x71\xed\x26\xfa\xf7\x6a\x03\xea\x01\x7f\xcd\xfb\xac\x5a"
+ "\xac\xca\x1a\x71\x86\x57\x4b\x75\x7b\x69\x6e\x29\x1f\xcd\xef\x2e"
+ "\x81\x1b\x2a\xe1\x28\x6c\x77\x7c\x3a\x8f\xc4\x76\x7f\x86\xbd\x88"
+ "\x9e\x09\x6f\x6b\xec\x12\xa7\x6a\xec\xde\x75\x76\xd6\xd7\x67\x35"
+ "\xf4\xad\x4b\x37\x42\x5f\x00\x58\xb8\x6b\xfc\x4c\xe2\xcf\x6e\x3f"
+ "\xd1\xbc\x7d\x91\xf5\x69\x75\x01\xa6\x46\xf4\x83\xaf\xb3\x1a\x80"
+ "\xdf\xc0\x57\xde\x67\x27\x3e\x61\xb7\x8b\xaf\xb3\x1b\xc6\xf1\xbd"
+ "\x75\xbe\x71\xc6\x21\xde\x23\x62\x80\x82\x5e\x49\xff\xfe\x7b\x1e"
+ "\x7f\x5a\xea\x06\xb4\x76\x6b\x76\x70\xc3\x0b\x62\x5f\x29\x17\xfb"
+ "\x0a\x67\xd2\x5f\x7a\xcd\x3e\x61\x47\xeb\x78\x41\xc4\x7c\xd5\xee"
+ "\x67\x7b\x9b\x1c\x01\x11\xab\xae\x28\x0f\x7c\x5a\x00\xe7\x46\xe2"
+ "\xfe\xf1\xe1\xbc\x00\xfb\x57\x3f\x70\xb2\xa6\x1d\xbe\xe2\x65\x2c"
+ "\xf0\x9a\x4e\xdd\x3f\x3c\x62\x48\x22\xfe\x29\x8d\x2b\x2a\x1c\xbf"
+ "\x74\xcf\x21\xe8\x6d\xa5\x3c\x6e\x65\xe5\xc4\xd3\xcb\x39\xd8\x33"
+ "\x17\xb1\xf8\xa4\xac\xd0\x41\xf3\x12\xf5\x2d\xe5\xbd\x43\xe0\x4f"
+ "\x88\x4e\xec\x79\x0b\xb6\xe9\x1e\xad\x8e\x41\xe7\x1e\xda\xff\x77"
+ "\xe7\xc8\xb6\xa8\xbe\x41\x7d\x3e\xf7\xcc\xfd\xbe\x7e\x23\x5c\x1f"
+ "\x95\x4f\xd6\xf8\x02\x26\x75\x5f\xef\xa1\xae\x1a\x5d\xf7\x15\xe6"
+ "\x7d\xf6\x1c\xd4\x75\x5f\xd2\xf7\x74\x4d\x1e\xda\x1f\x4f\x47\xc4"
+ "\x8b\x7e\x06\xbc\x37\x81\x87\x1b\x97\x9f\xa0\xfd\x1d\x7d\xd7\xf9"
+ "\x42\x39\x3f\xb5\x77\x82\x3f\x44\xcc\x55\x9d\x97\x94\x3c\x40\xed"
+ "\x72\xb9\x97\xd5\x2e\xd0\xf7\x32\x2a\xdb\xa0\xd1\x0a\x6d\x9f\xab"
+ "\x0d\xc9\xbf\x63\xdb\xe5\xd7\xe6\xe9\x30\xd2\x61\x2e\x61\x54\x7b"
+ "\xa4\x2f\xb6\xaf\x3a\x0c\xdb\xda\x23\x02\xd6\xa1\xef\x75\x13\x22"
+ "\x60\x8f\x77\xa3\xa4\x9b\xb5\xb4\xff\xd7\xcc\x97\x7b\x8a\x4c\xe3"
+ "\x09\xec\xf7\x22\x6e\xbb\x80\xc1\x2a\xa1\x9b\xf1\x16\xd9\xd1\x37"
+ "\xaf\x47\x49\xb1\x49\x5a\x56\x4b\xf9\xf7\xf4\xca\x72\xb5\xd5\xe8"
+ "\x4b\x64\x7f\xef\x59\xf3\xf0\x9a\xb5\x1b\xd6\x40\xa1\xf6\xe8\x3a"
+ "\xdb\x03\x6b\xb3\xb2\x63\xc7\xd0\x87\x58\x11\xd7\xda\x57\x15\xf2"
+ "\x3b\xf5\xa2\x09\x76\xf4\x32\x66\xc1\x8b\x31\xb6\xd9\xc0\xaf\xba"
+ "\x47\xa0\x2b\x10\xb1\x23\xe0\x63\x55\xea\x0d\xba\x51\x5e\xc2\xfa"
+ "\x85\xfe\xbe\x0d\x39\x1a\x8f\xf5\xc2\x6b\x80\xa3\x26\x73\x70\x1a"
+ "\xe3\x49\x7d\x1f\x42\xff\x04\x6f\x3e\x6c\x17\x74\x51\x1d\xce\x31"
+ "\x0a\x78\x0d\xdb\x69\xbf\xa9\x6b\xf6\x28\xd7\x05\xe4\xb8\xea\x8e"
+ "\xea\xf0\xc0\xf8\x07\x11\x6b\x93\xaf\x22\x1c\x7d\xd1\xa4\xd5\x05"
+ "\xfa\x89\xba\x6b\x74\x3b\x6e\xf8\x12\x75\xad\x87\x1f\xe1\xfa\xcf"
+ "\xd4\x32\xd0\x9b\x7a\xab\x4e\x97\xb0\x17\xa9\x54\xcf\xab\x03\xde"
+ "\x09\xb4\x6e\x6e\xa3\xb2\x53\x3a\xd8\x0b\x59\x32\xde\x40\xfd\xe2"
+ "\x91\xf1\x06\x5e\xb0\xd1\x5f\x96\xf6\xb7\x2d\xe2\xf9\x7c\x7f\x7a"
+ "\x99\xb4\x70\x5a\x7d\xfd\xa8\x3c\xdb\xa8\x4f\x07\x42\xfc\x8a\xf4"
+ "\x67\xaa\xf9\x3f\x46\xec\x8c\xfa\x93\xf0\x19\x1a\xc6\x8d\xfa\x78"
+ "\x8d\x07\xe9\x06\xec\xb0\xdf\x76\xb2\x17\xa4\x2f\x93\x72\xc2\x0d"
+ "\x9e\xce\x30\x26\x3e\xb8\x8a\x70\xe2\x05\x63\x18\x0f\x24\x8c\x28"
+ "\xcd\x1a\xe6\x53\xea\x7b\x51\x26\x12\x0e\xd4\xc6\x6d\x52\x36\x7d"
+ "\x21\x55\xdf\xb3\xe1\x2f\x55\xc6\x9f\xa8\x3f\xd0\x50\xd8\x4d\x32"
+ "\xff\x0b\x2b\x22\xea\x38\xa0\xe9\x22\x8c\xdc\x50\x67\xa9\x13\x32"
+ "\xdb\x0b\x05\x61\x9d\x40\xfd\x01\xd0\x5d\x51\x47\x02\x3b\xe8\xf6"
+ "\x89\x98\xd1\x8a\x1e\x23\x9e\xf2\xee\xd3\x79\x14\xbd\xae\x26\xa9"
+ "\x73\x12\x3e\x2e\x69\x0d\x56\x52\x9e\x96\x90\x3e\x96\xd2\x42\x32"
+ "\x60\x3e\xad\x63\xc1\x7b\xbf\xd0\x1b\x96\xf5\xea\x84\x5f\x01\x21"
+ "\x07\xca\x7a\x4c\x1e\xf6\x82\x67\xb4\xdc\x46\xfc\x83\x6d\xd5\x9a"
+ "\x55\xc4\x3e\xfc\xc2\xb1\xf6\x66\x12\x1d\x7e\xe1\x58\x75\x33\x4c"
+ "\xbe\xee\x5a\x7c\xa7\xf8\xa5\xc5\x71\xf3\x18\xfa\x63\xe8\xbd\x45"
+ "\x5c\x66\xe8\x8c\x48\xce\x85\xee\x74\x50\xc6\x4a\x9d\xa8\xfd\x9a"
+ "\xb4\xdf\x68\xda\xf7\xd2\x69\xad\x94\x21\xf6\x0d\xc1\xbf\x5e\x75"
+ "\xca\x38\xaf\xda\x9e\x4d\xb4\xfc\xc5\xc7\xf5\xf3\x32\x61\x03\x0f"
+ "\x3f\x86\x7d\x39\x42\x1f\x37\xe8\x7c\x31\xa4\xff\x90\xfa\x45\x79"
+ "\xe6\x46\xe9\xed\x7a\xba\xae\x8f\xa5\xb4\x5e\x5d\xf7\x2a\xf3\xbe"
+ "\x18\x08\x97\x1d\xa1\xdb\x4e\xd4\xcf\xe3\x06\x9d\x2f\xd9\x74\x98"
+ "\xe9\xf5\x14\xd9\xf8\x69\x8d\x4f\x8a\x12\x7c\xb5\xf3\xc5\x44\xe1"
+ "\x3b\x14\xbc\xb8\xd0\x33\xbf\xb4\x5c\x6f\x07\x32\x02\xfa\xad\x9d"
+ "\xfd\x88\x75\x0f\x1f\xa1\xd2\xc7\xe8\x4b\xa1\xf9\x1f\x05\x73\xfb"
+ "\x8d\x57\x0b\xbd\xbc\x7d\x1d\xf1\x67\x57\x8f\xd2\xc3\x01\x87\xe6"
+ "\x55\xb1\x18\xa1\x63\x92\x72\xfa\x04\xf0\x08\x34\x86\x17\x68\x3e"
+ "\xa3\x40\xcb\xe5\xbe\xf7\xd2\xb1\xd0\x1e\x1f\xc7\xf6\xf1\xd8\xbe"
+ "\x2a\xf8\x99\x97\xf7\x16\x5e\x3a\x07\x7c\xf3\x5e\xfa\xf0\x20\x87"
+ "\x8d\xf2\x73\xff\x3e\x28\xf5\xf0\x7b\x6f\x0a\xeb\xcc\x5e\x2a\xd1"
+ "\x7c\xa2\xc2\xfe\x8d\xe6\x6b\x6f\x72\x88\xe7\xa4\xfc\x82\xf7\xa2"
+ "\x3a\x71\x47\x01\xed\x5f\xc0\x39\x8f\x91\x97\xce\x5e\x22\xd7\xe9"
+ "\x5e\x97\xa8\x83\x68\xb5\xbc\x07\xb0\x97\xf8\xff\x97\x6a\xe4\xde"
+ "\x80\xba\xd3\x59\x5f\xc2\xec\x94\x3e\xe7\x47\xc9\x80\xa1\x2f\xe1"
+ "\x16\x87\xf4\x41\xbc\xf7\x5d\x9f\xd3\x48\x73\xba\x97\xe6\xff\xf7"
+ "\xdf\x93\x75\xf5\xb6\x86\xd7\xf3\xa6\xc0\x00\x6f\x2c\xff\x82\xe8"
+ "\xdc\x83\x8c\x05\xd6\xf3\x83\xc3\x03\xbc\x41\xc4\x20\xbf\x9f\xb1"
+ "\xb2\xaf\x18\x0b\x46\xfd\xfb\xc9\x21\xc2\xd5\xbb\xfb\xd5\xd3\x88"
+ "\x17\x58\x47\xf9\xee\xf6\x9d\xe1\xb5\x54\xe6\x6e\x07\x3f\x5d\x4b"
+ "\xf9\xee\x3a\x75\x9a\xef\xa1\xbc\x77\xe5\x10\xae\xac\xe7\x81\x60"
+ "\xd4\xc3\x27\x6d\xff\x06\xda\xfd\xeb\xc5\xde\x1d\x43\x7b\xb9\xd3"
+ "\x50\xc1\xb7\x5e\x7b\xcd\xa0\xf3\xd7\x69\xa1\x38\x65\x54\x2f\xf0"
+ "\x6a\x59\x3e\x9e\x1f\x3e\x49\x78\x70\x32\x83\xf8\x0e\xc2\xdb\x93"
+ "\x94\x0f\xe7\x3f\x02\x96\xde\xa8\x6b\x26\xd3\x9f\x7d\xcc\xfe\x0f"
+ "\xf0\xa6\xe0\x7a\xde\x58\x71\x1f\xf5\xbf\x87\xfa\x3f\xc0\x0f\xd2"
+ "\x18\x1a\xca\xbb\x18\x43\xff\x83\xa8\x33\xc8\xa2\x32\x36\x2a\x93"
+ "\xea\xe8\x7b\x46\xbe\x85\xd5\x51\xde\xfb\x7c\x6c\x52\x2d\xe5\xb9"
+ "\xef\x97\x93\x98\xe8\x7f\x2f\xf5\x3b\x66\x68\x6f\x90\xda\x46\xff"
+ "\xa9\x7d\xbf\xde\x4f\xbd\x7d\xf4\x57\x5f\xb7\x19\xd0\x11\xc6\xf6"
+ "\x1d\x43\xbf\xe5\xb9\xc7\x6f\x56\x7a\xd7\xd1\x3c\x47\x5d\x7b\x8d"
+ "\x94\xb1\x7f\xb3\x40\xef\xff\xc8\x73\xb0\xdf\x14\x4b\xfa\xf9\x1b"
+ "\x92\x7f\xf6\x6a\x31\x5d\x64\x1a\xc6\xef\xa5\x75\xab\xdd\xfd\x3b"
+ "\xa9\xc3\x8c\xbe\x27\x8f\x3e\xe7\x4a\x5b\x9b\x2b\x74\xd4\x2b\x1f"
+ "\xc8\x5b\xb5\x7e\x25\x49\xbe\xb1\xcc\x81\x24\x21\x1b\x67\x67\xd9"
+ "\xd6\xae\xb1\x3d\xb8\x72\xd5\xea\xb5\xeb\xb3\x73\x93\x85\x3a\x63"
+ "\x5d\xf6\x9a\x2c\xa8\xae\x73\x57\xe6\x3a\x62\x47\xc9\x33\x25\x43"
+ "\x7b\x5b\x11\x83\xa6\x10\xf8\xbd\xff\x43\x4d\x6f\xeb\xe7\xce\x54"
+ "\x21\x17\x4b\x1a\xf3\xdb\x9b\x6c\x9b\x52\xf1\xfd\x2d\xb9\x8f\xef"
+ "\x6f\xe6\x3b\xfb\xbe\xe4\x5c\xc4\xd6\x56\x4e\xb3\xfd\x6f\x08\x78"
+ "\xf4\x2d\xd1\xeb\x11\xb2\x2b\x70\xd6\xb1\x09\x7c\xd8\x6f\x57\x70"
+ "\x7c\x1f\x01\x8b\xfd\x65\xd2\x56\x88\xd2\x87\x97\xb0\xb0\xbd\xfd"
+ "\xfe\x0f\xb9\x81\xc6\x4e\xb0\xd4\x64\x86\x4c\xed\xde\xe3\x7f\x76"
+ "\xb0\xfd\x90\xa5\x70\x6e\xd3\x26\x78\x72\x71\x3f\x6b\xff\x2a\x92"
+ "\x39\x32\xb9\x33\x3a\x0e\xf0\x2a\x97\x32\xbd\xc1\xac\x20\x76\x6e"
+ "\x07\xee\x8a\xa6\xe0\x7c\xb7\xce\xa9\xa6\x84\xed\x9b\x7e\x53\x0a"
+ "\xf9\x42\x9c\x73\x08\x9a\xf4\xdb\x6e\x7d\xed\x1a\x70\xff\x66\xeb"
+ "\xd4\x1f\xcb\xf5\xf7\xdb\x53\xc8\x4f\xf3\xff\x63\x39\x3e\x11\x07"
+ "\x9c\x78\x83\xfd\x13\x68\xfc\x5f\xf1\xa2\x25\xda\x99\xe4\xfe\x09"
+ "\x6a\xc2\x22\x47\x70\x1d\xc9\x05\x71\x8b\xbc\xf4\x6d\x40\xdd\xd9"
+ "\xd7\x15\x24\x9e\x4a\x25\x39\x81\x97\x2f\xea\x0b\xee\xec\xf3\xa8"
+ "\x1b\xec\x06\xec\xad\x45\xf9\x04\xdf\xb5\x39\xb1\xfc\x4c\xce\x45"
+ "\xc1\x0d\x76\xe2\xbf\xfa\xba\x39\xa7\xb2\xb1\x7d\x7e\x11\xaf\x78"
+ "\x67\x5f\x8f\xf6\x3e\x84\x77\x95\xf8\x64\xbe\xd3\x47\xef\x3e\x83"
+ "\xca\x23\xf2\x8f\xc8\xeb\x33\xe2\xdd\xac\x08\xbb\xca\x14\x92\x4b"
+ "\x16\x62\xec\xfa\x98\x85\x7c\x06\x1d\x51\x68\x6c\xfb\x99\x9e\x0e"
+ "\xb9\x41\xf2\xf0\xec\x01\x82\xb1\xf4\x65\x11\xca\xb7\xef\x73\x1d"
+ "\x06\x32\x3e\x77\x1f\xd1\xcd\xfd\xcd\x2a\x62\xa3\x6f\xbd\xfc\x1a"
+ "\x6e\xf8\x4d\x1d\x68\xd6\xb2\xa0\xa0\x85\x4c\x9e\x3b\xed\x5f\xa0"
+ "\xc3\x13\xf7\x08\x40\x4b\x69\xde\xec\x19\x5e\x16\x2b\xe9\xc0\xfe"
+ "\xf4\x08\xf9\xb0\x17\x73\xed\x61\xfb\x34\x3f\x5b\xa6\xad\xf2\xfd"
+ "\xb7\xfb\xe4\x5a\xd9\xbf\x4d\xcf\x4b\x69\xd2\xdf\x4f\x89\xef\xd0"
+ "\x86\x00\x9b\xea\xb8\x85\x77\xd1\x1c\xa5\x6b\xf9\x0e\x84\xd7\x94"
+ "\xc4\x37\xfa\x5d\x00\xf9\x1a\xe7\x8f\x78\xae\x1d\xe7\x2e\x6c\x61"
+ "\x0d\xe7\xd8\xaf\xb0\x7f\xda\xa6\x32\xd6\xea\x83\x6c\xf5\x3b\xd3"
+ "\xe1\x1a\x1f\x13\xf3\x1c\xdb\xf7\x65\x1f\xcf\x61\xc4\x53\x8e\x29"
+ "\x4b\xa0\x0c\xe5\x5f\x2c\xe4\x24\x5a\x17\x2a\xad\x0b\x2a\xf3\x15"
+ "\xf0\xba\xb0\x1f\xf2\xcb\xef\xb6\x35\x15\x74\xc3\x57\x3f\xe1\xeb"
+ "\xef\xb6\x01\x86\x58\x07\xe5\x4e\x71\x0f\x52\xec\x93\xae\xf5\xf3"
+ "\x51\xc7\x2f\x13\xfc\xcc\xd8\x4a\x3b\x04\xcd\x8b\xdf\x51\xc8\x26"
+ "\xf5\x50\x7e\x63\x1e\x33\x41\x86\x1d\xb9\x87\x8c\xbd\x7f\xf4\x99"
+ "\xd4\xca\xbe\x9d\x6a\xce\xa0\xf3\x77\x87\x88\xf6\x8f\xeb\x3f\x71"
+ "\xeb\x14\xe2\x6b\x28\x5f\xe5\x54\x9c\x55\xff\xae\xfb\x7c\x79\xf5"
+ "\xbb\xb9\xc0\x95\x79\x56\xda\xd7\x62\xd4\x4a\x71\xe6\x1d\xab\xe6"
+ "\x48\xbd\xe5\xef\xed\x7a\x79\xe8\x3d\x61\x57\x50\x31\xc4\xac\x15"
+ "\x21\x59\xf1\xf7\x69\x72\x8e\x7e\x9f\xa6\xcb\x17\x63\xb5\x93\xb7"
+ "\x97\xab\x45\xb3\x98\xc1\x6d\xf3\xb2\xeb\xfc\x2c\xae\x76\x17\x63"
+ "\x95\x9b\xb8\xff\xe9\x4d\x84\x47\x04\x63\x6e\xf8\x5d\x33\xec\x2f"
+ "\xea\x68\x8f\x2e\x57\x19\x8b\xa2\xbe\x3c\x3d\x40\x6d\x16\xca\x7c"
+ "\x5c\xfa\x55\xb3\x52\x3e\x1f\xfd\x26\x12\x1d\x61\x55\x85\xcc\x54"
+ "\xa5\x32\x63\x65\x21\x9b\x46\x69\xc4\x57\xfc\xfe\xa8\x2e\x0b\x8c"
+ "\x79\x2e\x5c\x4b\xf4\x91\xda\xdd\x52\xc8\x03\xef\x91\x7c\xe7\x54"
+ "\xb9\xff\x1f\x81\xbb\x87\x1d\x98\x2f\xc7\x78\x60\xbe\x2e\x1b\xd0"
+ "\x73\xea\xc8\x3b\xd6\x07\xec\xa3\xcf\x98\xef\x5f\xbb\x36\x2f\x23"
+ "\x37\x1b\x3f\xf6\x59\x8f\x5e\x3d\x9a\x57\x8c\x93\xf1\xa8\x0e\xa4"
+ "\x63\x6d\x81\x7f\x92\x77\x95\x0e\x54\x47\xe8\x7b\xa0\x73\xbe\x15"
+ "\x7c\x1f\x6c\x4d\xe8\x5b\xc3\xbb\xe2\xea\x00\x53\x8e\x9b\x98\x61"
+ "\x74\x7b\x0f\xae\xcc\x5b\xb9\xfa\xc7\xd2\xac\x61\x8c\x76\x9a\x47"
+ "\xb6\xf3\x72\xe8\xfc\x57\x93\xcd\x7d\x82\x3e\x96\x2d\xf2\xf0\xf8"
+ "\x39\xc5\x72\xaf\x7b\x39\x49\xb7\x1d\x1c\xdb\xa7\x8b\x6f\x79\xb0"
+ "\xdc\x00\xdc\x47\x4c\x4f\xc3\xeb\x9b\xda\x0d\x90\x4b\x0a\xe9\x19"
+ "\xb6\x5c\x42\xff\xad\xc5\x8a\x7c\xfb\x6c\x3b\xed\xa5\x2f\xe7\xf3"
+ "\x1d\x3e\xe2\x11\x5f\x76\x8c\x67\xbf\x15\x79\x1f\x5e\x9e\xdd\xbf"
+ "\x5c\x79\x1e\x5b\x2f\x91\x5f\xb7\xd3\x18\x59\xee\x95\x09\x72\xce"
+ "\x5e\x26\xfc\xff\x5d\xbd\x8e\xbf\x7a\x9e\x8a\x29\x7a\x0c\xce\x97"
+ "\xc7\xf5\x83\xcc\x4b\xd4\x6a\x89\xe3\xaf\xdc\x21\xce\xa8\xa7\xb2"
+ "\x5f\x75\xb0\x57\x6e\x33\x5a\x99\x95\x9e\x7f\x4b\xcf\x42\x87\x81"
+ "\x6f\x23\xf0\x68\x7a\x6f\xbd\x91\x28\x0e\x51\x1e\x85\xcb\x7f\xc4"
+ "\xf8\xc9\x7f\x51\xf4\x67\xe0\x8a\xb8\xb5\x12\x45\x33\x38\x31\xda"
+ "\xc8\xcc\x09\x71\xa6\x19\x57\x4c\xb3\xde\x7a\xcb\xc2\x05\x45\x85"
+ "\x05\xf9\x5c\x0d\xf8\xcd\x3c\x22\x6e\x6a\xe9\x1c\xfb\x3d\x57\x17"
+ "\x4b\xfe\xa1\x6c\xce\x98\xfc\x52\x99\x93\x3b\x20\xd3\xaa\x09\xb7"
+ "\xa4\x15\x3d\xca\x0c\xaf\x0e\x79\x0c\x90\xa1\xc0\xc3\xb8\x03\x5f"
+ "\x92\x2c\xfe\xca\x27\xef\x50\x1a\xc1\x2b\x9f\x97\xde\x92\x26\xef"
+ "\x24\xbd\x3a\x49\x2d\xbf\x25\x2d\x5c\xbf\x91\xa1\x7e\x92\xd3\x0d"
+ "\x7b\x0b\xbb\x0d\x6e\xe3\x2d\xcc\x6d\xf3\xb1\x77\xe8\x79\xcc\xb9"
+ "\xa2\x36\xa1\x13\x46\x1d\xb4\x07\x97\x14\x9d\xa3\xbd\x39\x5f\x9c"
+ "\xcf\x18\x4e\xb3\x57\xef\x3c\x38\x4e\x39\x71\xc6\x1a\x3b\xf4\x6f"
+ "\x83\xce\x57\x89\xfe\xdf\x9f\xa4\xc9\x21\x24\x27\xbd\x5a\xa5\xef"
+ "\x07\xf4\xfd\x1e\x79\x4e\xf4\xea\x3e\x3d\xcf\xd8\x7a\x1c\xd8\x3a"
+ "\x73\x17\xf0\x80\x0f\x74\x77\xc3\xf7\xe2\x38\xb8\xb2\x98\x78\x94"
+ "\x47\x40\x9b\xe3\xb7\x58\xa2\x13\xb6\xa4\x3c\xd2\x42\xbc\x51\x7c"
+ "\xef\x25\x2c\xc1\x77\x2f\xfa\x0c\x7b\xfb\xb6\x3d\x24\x73\xe2\x7c"
+ "\xd8\xac\xa4\xac\x32\x6f\x49\x59\x19\x74\x2e\xbc\x11\x3c\x94\x39"
+ "\xff\x4e\xc5\x1c\xb8\x4d\x09\x38\xe7\xdf\x58\x27\x63\x15\xf9\x2a"
+ "\xa7\xf0\x76\x2a\x73\x8c\xca\x78\xe8\xaf\x93\xca\xb5\x74\xb1\x83"
+ "\xab\xe8\xb7\xd9\xac\xf0\x3a\x33\xcd\xe4\xbc\x62\x11\xbb\x15\xfb"
+ "\x73\x0b\x8f\x25\xd9\x6e\x58\xe8\xe0\x26\x84\x75\x70\x07\x4b\x69"
+ "\xde\xa2\x97\x3e\xce\xdf\xa1\xba\x9a\x83\x03\x6a\x73\xed\x69\xd0"
+ "\x43\x21\x57\x1d\x25\x1a\x70\x34\xb9\x8a\x59\x35\x9b\x69\x43\x4b"
+ "\xa0\x19\xfb\x30\x7c\x0e\x34\x51\x9b\x87\xe8\xaf\xd1\xb6\x86\x45"
+ "\x9d\x66\x07\xbf\xd4\x6d\xae\x24\x5f\xf7\x87\x7b\x34\x3d\x80\xeb"
+ "\x3a\x2a\xbf\xf9\x11\xe0\x44\xb7\x21\x40\xf5\x93\xac\xdd\xec\xce"
+ "\x69\x16\x36\x6c\xb8\x93\x80\x3c\xd4\x86\xdd\xed\x6f\x66\x2a\xb7"
+ "\x1a\xe8\xbd\x11\xf7\x0b\x38\xe5\x6d\xcd\x6f\x67\xad\x0e\x3f\xed"
+ "\x9b\x2d\x24\x7b\xda\x93\xa8\x3f\xa2\x3e\xfa\x7e\xf4\x55\x9a\x5f"
+ "\x1b\xc9\x0c\x54\x5f\x1b\x6c\xe2\x70\x77\x9f\xaf\xb3\xcf\xa6\xf2"
+ "\x4d\x7c\xd8\x6a\x40\xfd\xa7\xd9\x6b\x27\x78\x9f\xdd\x3e\xaf\x57"
+ "\xc6\x32\xed\x60\xaf\x1d\xa2\x7e\xae\x89\xe8\xe7\x1d\xd4\x7f\x23"
+ "\xed\x95\x2e\xaa\xf3\x10\x5f\x4f\x6d\x76\x52\x9b\x3e\x2f\xec\x3f"
+ "\x93\xf8\x06\xab\x11\x7d\x6e\x45\x7f\xf3\x83\x8c\x6f\xb0\x1b\x2b"
+ "\xce\x32\x23\xad\x05\x57\x1d\xfd\xd2\xf8\x1b\x88\xaf\x9f\x36\xe8"
+ "\x7c\x2d\xe4\xff\x01\x7c\x24\xbd\x7b\x74\x5c\x2a\xa3\x3c\xd4\xc7"
+ "\x46\xea\xd7\xa1\xf8\x5e\x06\xdd\xc2\x04\xc2\xd3\x09\xd4\xee\x44"
+ "\x9a\xab\x46\x82\xdd\xbb\x04\xeb\x43\x18\x93\x3a\xa0\x76\xab\x54"
+ "\x5f\xc5\x00\xf5\x69\x9d\xd5\x18\xd7\x89\x38\xef\x83\x9c\xe0\x7d"
+ "\x74\x59\xfe\x20\x87\xbd\x38\x6c\xaf\xa9\xcc\x1e\x1a\xab\xd1\xc3"
+ "\xfe\x50\x00\x39\xbf\x8b\xbd\xb6\x4d\xc6\x62\x7d\xad\x44\x3b\x4b"
+ "\x3e\x2a\xf5\xbb\x07\xbf\x04\xec\x31\xae\xb8\x2d\x96\xed\xee\x6e"
+ "\x2f\x8b\xeb\xbc\x84\x78\x96\xd7\x58\x8d\x0a\xfe\xf4\x0f\x25\x7a"
+ "\x3f\xc7\x59\x63\x7e\x37\xd1\x17\x75\x80\x77\x43\x7e\x91\x76\x66"
+ "\x7f\x38\x94\x91\x1f\x95\x4a\xb2\x8a\x81\xfa\x89\x7b\x4c\x53\x88"
+ "\x47\xbb\x15\x76\x88\xd4\x3f\xda\xb3\xff\x70\xec\x7c\x31\x90\x09"
+ "\x3e\xc4\x17\xbc\x4e\x7d\xf8\x83\xd0\xa7\x22\x46\xac\xd4\xb1\xbe"
+ "\x9e\xa8\xfb\xe1\xe0\x03\xbc\x00\x7b\x2f\xb5\x5b\xbc\x6d\xbd\x68"
+ "\x03\x71\x71\xbb\xf3\x6c\xfc\x78\x93\xcd\x3b\xae\xaf\x83\x08\xfb"
+ "\x39\xaf\x16\x6b\x4f\xd8\x12\x8c\xb4\x9f\x7b\xbd\x20\x42\x5f\x03"
+ "\x7b\x82\x62\xd8\x4c\x48\x7f\x49\xaf\x0b\x9b\xc0\x65\xf9\xd2\x2f"
+ "\x8c\xdb\xdf\xab\xc9\x1d\xaf\x7f\x28\xe2\x6f\x81\xa7\x15\x36\x77"
+ "\x3d\x9a\x9d\xdc\xeb\x2b\xd1\x46\xd3\xa8\x18\xdf\xd9\x6b\x56\xde"
+ "\xbf\x3a\x5b\xaa\x30\xe7\x3e\x94\xb7\xf2\x17\x23\x65\x23\xa3\x90"
+ "\xc5\x9d\xaf\x1f\x95\x67\x02\x0d\x71\x11\x32\x82\x31\xa4\xd3\x35"
+ "\xb0\x06\xa9\xd7\x6d\x48\x1e\x4b\xaf\x7b\xe7\x2f\xd6\xac\xcd\x15"
+ "\x6d\x08\x93\xc2\x6c\x79\x2b\x30\x96\xdd\xb3\xf8\xce\xc5\x73\xd7"
+ "\x65\xe7\x89\xa0\x3a\x52\x89\xba\x32\x2b\x2b\x57\x33\x38\x5c\x85"
+ "\x52\xf8\xf2\xe0\x06\x51\xd4\xf1\x70\x9e\x34\x55\x5c\xb7\x7a\xe5"
+ "\xfa\x6c\xad\x8a\xc8\xbe\x4e\x03\xbd\x6c\xaa\x11\xba\xaa\x58\x69"
+ "\x1f\xd1\x70\x28\xe2\x3c\x35\x52\x7f\x73\x19\x7d\x0b\x9d\xff\x3b"
+ "\xae\x04\xae\xbc\xb1\xaa\xb5\x5e\xf8\x32\x31\x1e\x7e\x11\xf0\x7d"
+ "\xe3\x0e\xc4\x81\xa0\xbd\xad\x11\x71\x8b\x35\xdb\x03\xa2\xd7\x6f"
+ "\xcc\x24\x59\xab\x91\xe0\x9b\xbf\x2c\xa8\x72\xa2\xa9\x24\xa7\xbf"
+ "\x99\xa8\xe9\x44\x4c\xaa\xa1\x61\x01\xec\xc6\x6a\x85\xfe\xee\x8d"
+ "\x85\x61\xfd\xdd\x9b\xb0\xe9\x31\xd1\x7c\x77\xa2\x6f\xe8\x27\x7d"
+ "\x5f\x11\x61\xb3\xd3\xe9\x21\x30\xa2\x1e\xd8\x96\x88\x18\x2d\xc4"
+ "\x13\x6b\xfe\x20\x0c\xad\x2f\x62\x1f\xfa\x13\x62\x3a\xf5\xaa\x25"
+ "\xea\x41\xb9\x66\xfe\xb8\x87\xef\x1c\xfa\xbf\xf3\x7c\x2c\x51\xd2"
+ "\x8c\x37\x20\x8b\x5f\x4c\x7d\x6c\xa2\xf4\x74\xa2\x3b\x13\xc0\x1b"
+ "\xc9\x33\xaa\x37\x4e\x6a\xfa\x3c\xc0\x67\x42\x44\x1f\x3c\x61\x9d"
+ "\xdf\x9b\x89\xde\x18\xf5\xe0\x36\x69\x93\x23\xec\x0f\xa4\x0d\xc8"
+ "\x1f\x8d\x21\x1d\x17\xb5\xad\x9d\xb9\x27\x76\x51\x7e\x82\xc5\x41"
+ "\xed\x1c\x1c\x63\x4f\xc3\xb8\xa5\x2d\xe5\x1f\x47\xc8\x3f\x32\x26"
+ "\xc6\xd0\xff\x55\xa5\xbd\x2c\xfa\x9e\x2d\xf8\x28\xe8\x17\x87\x00"
+ "\xef\x3f\x6e\xa4\xef\xb4\xd7\xfd\xd1\xe1\x61\xaf\x87\xfa\x83\x3e"
+ "\xe7\xe5\x13\x33\x40\xe5\xb0\xf7\x51\x9f\x26\x52\x9e\xaa\x70\x9f"
+ "\xff\x28\xce\x46\x21\x53\x4a\x1e\xe4\x4f\x26\xa1\xe7\x2d\x51\x5d"
+ "\x11\xf3\x66\x3c\xcd\xfe\x78\x92\xfa\xea\xda\x2a\x6d\x5f\x26\xe8"
+ "\x36\x25\x54\xd7\x88\xf1\x87\x75\xb0\x0d\x6b\xa4\x0e\xf6\x4f\x2c"
+ "\x3c\x87\x7f\x6c\x02\xde\xc3\x6e\x48\xb7\x19\xc2\x7c\xca\x78\x21"
+ "\x7f\xb2\xeb\xf5\xa8\xb1\x6a\x3d\xe4\xe4\x72\x79\xfe\x4d\xf3\xf2"
+ "\xa7\x55\x51\xca\x71\xc1\x4b\xcd\xf3\xb3\x7a\x4a\x8b\xa6\xb4\x7b"
+ "\x91\x0f\x6d\x0a\x5d\x25\xc1\x06\x63\x51\x49\xc6\x8a\xb2\x46\x2f"
+ "\xa3\xfa\x08\xaf\x0e\x1c\x0d\xe3\xc6\x9f\x52\x05\xbd\xd4\x60\xcd"
+ "\x9d\x0d\x5b\xc3\xb2\xfb\x9f\xf6\x86\xf4\x6e\x54\x4f\x78\xcf\xf8"
+ "\xd3\x87\x80\x71\x45\x48\x07\xd1\x18\x10\xfd\x90\xe7\xa9\xef\x75"
+ "\xb1\xc6\x53\x9c\xf8\x0b\xec\xb5\x90\x0f\x31\xf7\x82\xdf\x13\xfa"
+ "\xb3\xc6\x5f\xd7\xca\x33\x8b\x67\xe9\x79\xbf\x6a\x18\x0b\x77\x1a"
+ "\xa7\x45\xda\xf7\x4a\xf8\x37\x66\xa9\xa8\x93\xc6\x8f\xba\x68\xff"
+ "\x51\x74\xbd\xa6\x56\xef\x3d\x54\xe7\x73\x5d\x1a\xac\xc5\x59\xde"
+ "\x4e\x0d\x0e\x98\x63\x01\xf3\xc6\x3c\xc2\x01\x11\x33\xad\xa8\x9e"
+ "\x9f\x5a\x4b\x75\xc8\xd8\xba\x8d\x55\x1c\xb0\xd5\xf2\x7b\x21\x7f"
+ "\x53\xdf\xe5\x9d\x48\xc2\x45\x92\x4d\xd1\x4f\x75\xa7\xba\x0f\x7d"
+ "\xc7\x39\x5e\x58\xa7\xd2\xf8\x21\xca\x7a\x1f\x93\x65\x2a\xe4\x39"
+ "\x23\xcd\x4d\xa3\xc2\x37\xe4\x30\xed\x7c\x8b\xf0\xfc\x8f\x6d\xc0"
+ "\x7b\xd4\xe3\x13\x32\x73\xa3\x47\x25\xb8\xd0\x9c\x4c\x1e\x74\xbe"
+ "\x19\xa7\xcf\x09\xcd\x47\xf3\x79\xf8\x6d\x9a\x93\x37\x17\xe8\xbe"
+ "\x95\xb0\x37\xd1\x1a\x2e\x96\xbc\xe4\x9b\xe7\xcc\x5b\x6e\xe5\xe6"
+ "\xc0\x8d\x37\x82\x37\xaa\x33\x08\x5d\xa8\x6e\xbf\x3a\x83\xe0\x74"
+ "\x46\xbf\x0b\xa0\x6e\xfd\xf7\x76\xd8\xfe\xba\xfd\xd2\xf6\x17\xe9"
+ "\x77\xfb\xb8\xda\xea\x0b\xe2\x2e\x4c\x3b\xb5\x51\xa3\xcb\x59\xa0"
+ "\x6f\x51\x5b\x14\x82\xdd\x9b\xb8\xff\x78\x48\xa3\x6b\x13\x7b\xd8"
+ "\x9b\x9f\x6b\xf5\x47\xf6\x61\xb9\x3c\x53\x7c\xd3\x2f\x79\xff\x37"
+ "\x41\x7b\xaa\xa4\xbc\xf6\xa6\x57\xef\x37\x7d\x3f\x34\x7a\x8c\x69"
+ "\xb7\xdf\x99\x6d\x5b\x0d\x12\x9d\x72\x43\xbe\xcd\x3e\x2b\x6b\x9e"
+ "\x30\x16\xb7\xfd\xd3\xed\x3f\xb6\xa5\xdd\x3c\x2b\x3f\x27\xf9\x6e"
+ "\xf9\x73\x7b\xda\x52\xfc\x8e\xb2\x1d\xb0\x0d\x3a\xff\x9c\x36\x52"
+ "\x1e\x7c\x47\xeb\xc3\x9f\x73\x3c\xca\x3f\xa5\x0b\x1c\x36\xf9\x2a"
+ "\x79\x49\x47\x1b\xed\xa9\xbd\xe0\x93\x97\x05\xbf\xe6\x7c\x47\x47"
+ "\x1b\x8f\xf1\x55\x7a\xe3\xe7\xd8\xbd\xf1\xb3\xbd\xde\x98\xa1\x82"
+ "\x0a\xa2\x81\xe6\x2d\xdc\x6f\x0e\x4c\x94\xb4\x92\xde\x89\x27\xe9"
+ "\x26\xbe\x07\x73\xc9\xee\xb8\xba\x88\x2f\x0b\x72\x37\xf1\x3f\x04"
+ "\x97\x3f\x37\xeb\xfb\xb8\xd0\x63\x96\xf8\x2a\x97\xe5\xf3\x61\xe0"
+ "\x0e\xf1\x07\xb8\x4f\x5b\x09\x5d\x26\xe5\xa3\xf1\xbf\x9a\x22\x61"
+ "\xf1\x67\xc0\xc0\xa6\xc1\x37\x6d\xd0\xf9\x1f\x34\xff\xcb\x84\xee"
+ "\x59\x75\x5a\xc5\x5e\xa1\x6e\xbd\xe6\xa7\xbc\x6c\xb6\x57\xaf\x93"
+ "\xea\x8a\xd3\xe2\x31\x8b\xfa\x58\x84\x6f\x82\xf3\xfd\xa9\x3b\xfb"
+ "\xf7\x42\x6f\x85\x7b\xc1\xe6\x7c\x05\xf1\xb7\xd2\x43\xba\x3a\xfa"
+ "\x96\xb0\xc5\x02\xfd\x5d\x7a\x82\x4f\x29\x46\x9e\xb0\x4e\x4b\xf5"
+ "\x54\x18\x54\x3f\xf1\x13\x16\xe0\x87\xe0\x55\x85\x3d\xc5\x7f\x34"
+ "\x86\xce\xe7\x46\xcc\xfd\x7f\x08\x7c\x38\xeb\x34\x12\x6e\xff\x39"
+ "\xf5\xca\x44\xc9\x3b\xa9\x4e\x85\x49\x5f\x11\xff\xf1\xb2\x58\x97"
+ "\x1a\x3e\x12\x7c\xbd\x38\x3b\x37\x07\xb8\x17\xf7\x54\xd4\x28\xc2"
+ "\x49\xd6\xc3\xdc\x05\x83\xc5\xb8\xaf\x1e\xc2\x4b\x07\xe1\xa5\x83"
+ "\xf0\x12\x76\x0e\xd4\xbe\x37\xea\x9a\x4c\x5a\xb3\x4a\x0f\xfb\x8f"
+ "\x02\xf4\x1f\xb0\x21\xfe\x3d\x4e\x25\x58\x09\x7b\x56\xc0\x27\x76"
+ "\x30\x09\xf7\x0c\x31\x56\x73\x80\xc6\x1c\x39\x2e\x83\xea\x29\x77"
+ "\xd2\xb8\x0c\x34\xae\xfc\x53\x42\x17\x84\xfb\x9f\x44\x4b\xa6\x84"
+ "\x63\xb8\x1c\xaa\x89\x1c\xa3\x8a\xb8\x4f\x62\x0c\x87\xde\x1a\x6b"
+ "\x8c\xdc\x80\x31\x02\x06\x87\x9e\xd4\xce\x39\x45\x3f\x41\xb7\x7a"
+ "\xd9\xa1\xb4\x84\x2d\xb8\x77\xe9\xab\x24\xbe\xf7\x76\xcc\x61\xad"
+ "\x93\x57\xa2\x9f\x63\xcd\x17\xea\x93\x75\xbd\xb5\xc2\xbc\xa5\x38"
+ "\x73\xd0\xf9\x96\x7d\x6c\x78\xbf\x75\xe7\xf9\xe1\xfd\xd6\x74\x94"
+ "\x47\x3f\x70\x87\xd4\x0c\x07\x63\x84\xdf\xc4\x57\x94\x8c\xd5\x6e"
+ "\xc2\x96\x7a\xf4\x6b\xcc\x6f\x84\xfb\xbd\x15\xb9\x23\xd7\x84\x5a"
+ "\xeb\x67\x80\x1f\xf4\x45\x52\xaf\xff\x56\x5b\xe8\xfc\xa1\xc4\xd7"
+ "\x68\x56\x6c\x51\x58\x63\x82\x27\xa6\xf1\x8e\x55\xaf\x59\xa9\x84"
+ "\x8f\xc2\xdb\x89\x56\x8d\xf9\x9d\xd6\x81\x8d\x6f\xbd\xf6\x4a\xaa"
+ "\xaf\x20\x61\x8b\xc2\xbd\x51\xd7\xc6\x26\xf8\x02\x49\x80\x2b\xf5"
+ "\x35\x9f\xd6\xf8\x09\xb1\x77\x0b\x5d\xc9\xdb\xb4\xfe\x3f\x16\x71"
+ "\x77\xbc\x31\xbe\x02\x69\x17\xf4\x76\x96\x87\xfd\x25\x22\x16\xea"
+ "\xdb\x79\x1e\x65\x4e\x89\x5c\xab\x97\xef\xa2\x3d\x6d\xbe\xea\x34"
+ "\x73\xdb\x26\x33\xa7\xba\xe2\x55\x6e\x37\xd0\xbe\x35\x3f\x8c\x3b"
+ "\xf2\x9e\xaa\x8e\x3b\x54\xbe\x61\x6c\xbc\x78\xfb\xb3\xf3\xe3\xc5"
+ "\xdb\xfb\x35\x3d\x6f\xa6\xb4\xbd\x7d\x3b\xa0\xcb\x1c\x7c\xeb\xe5"
+ "\xbb\x6c\x85\x68\xff\xed\x4a\xd9\x36\xc1\x24\x90\x0a\x3a\xb3\x94"
+ "\xe0\x56\x3c\xe8\x7c\xc7\xae\xd3\x06\xe0\x90\x39\x08\x79\x88\x09"
+ "\x3c\xa7\x6f\x8b\x89\xf6\x68\x67\x84\xc3\x49\xe0\x55\x55\xe7\x9f"
+ "\x8d\xb4\x7f\xed\xc6\xdd\x13\x5f\x8c\x8f\xe6\xe5\x1d\xa2\x7f\xc6"
+ "\x25\x1a\xfd\xf3\x51\x1d\xfe\x2a\xe9\x87\xc2\x24\x62\x06\xd2\x3a"
+ "\x47\x9c\x40\xac\x75\x4a\x4b\xa4\x7e\x23\x66\x20\xc9\x08\xef\xd4"
+ "\xeb\x7b\xbf\xea\x4c\x05\xbc\x85\xce\xd8\x00\x7e\x98\x60\xf7\x8c"
+ "\x41\xdd\x37\x30\xcf\xca\x30\xe6\x81\xad\x53\xf7\xfd\xea\x3a\x66"
+ "\xfc\xc0\x7a\x3f\x73\xdc\xc0\x12\xb7\xfc\x3f\x46\xf6\xf7\x05\xcc"
+ "\x00\x38\x78\xd8\x3b\x07\x25\xec\xde\xf1\xea\xf3\xe3\x61\x6f\xa7"
+ "\x63\x3e\x70\x2e\xb3\x2c\xc0\xfb\xe4\xb9\x94\xcb\x42\x7b\xa0\x55"
+ "\x7e\xff\xf3\x8a\x31\xf6\x87\x3b\x6c\xab\xd6\xd9\xb2\xd6\x6e\x58"
+ "\x33\x73\x66\xec\x18\xb2\x84\x2b\x49\xca\x12\xae\xf4\x48\x59\x82"
+ "\xde\x73\xa8\xbe\x05\xa3\x65\x87\xa5\x19\x9a\x7b\x91\x8c\x14\x16"
+ "\x7e\xbe\x9e\x2d\xbd\x3e\xe2\xf5\x46\xb6\xf4\x86\x1b\x33\x7e\x9a"
+ "\xbd\x32\x6b\x63\x44\xea\x4d\x91\x7a\xc4\x8a\x5d\xd4\x76\xd4\xd4"
+ "\x45\x44\x3f\x94\xbb\x1f\xc3\xbe\xf3\xee\x5d\x85\x01\xfe\x2d\xe1"
+ "\xee\x02\xf8\xf4\x3a\x92\x17\x60\x47\x88\xbe\xf1\xcb\x41\xd7\x27"
+ "\x4a\xbf\xb6\x41\x06\x3d\x9d\x99\xc6\xee\x25\x99\xae\x5f\xde\xbd"
+ "\x78\xf7\x97\xad\xd5\x7e\xa2\x13\x43\xdb\x24\xbf\xf3\x6e\x32\xa5"
+ "\x4f\xa2\xdf\x7b\xe4\x99\xce\xbb\x3f\x23\x79\x39\x55\xf8\x30\x59"
+ "\x0f\x1f\x26\xef\x0a\xdb\xb0\xeb\x7c\xc5\x4c\xfa\xd2\x73\x75\xc2"
+ "\xc7\xbd\x87\xbd\x5b\x05\xfe\x02\x79\xa9\xcc\x5c\xdb\x43\x2c\x05"
+ "\xbf\xe0\x87\xe9\x5b\x32\xdf\x31\xb4\x8d\xef\x4e\x87\x4d\x4d\x12"
+ "\xa5\x3f\x09\xbe\x2d\xca\x6a\x8a\x1b\x74\xbe\x5b\xa9\xf3\x20\xbe"
+ "\x71\xee\x7e\x01\xce\xfa\x3e\x98\x40\xf4\x3b\xc1\x67\xe6\x19\xf0"
+ "\x09\xa4\xb0\x24\xec\x0f\xe6\xfc\x34\x71\xb7\x10\xfb\x22\x68\x42"
+ "\xad\xa0\xa5\xef\x76\xeb\x74\xa1\x5c\xca\xa3\xb1\x28\x4f\xfb\xe7"
+ "\x19\xb9\x7f\xbe\x67\xd2\xd7\x02\x3d\x27\xea\xb8\x3a\xe2\x7e\xd9"
+ "\x9a\xbc\xec\xdc\xec\x2c\xdb\xac\x75\xb1\x2c\x22\x02\x6b\x4e\xf6"
+ "\x1a\x5b\x6e\xf6\x2f\x1f\xcd\x5e\x27\x04\x3d\x7c\x1d\x79\xfe\x46"
+ "\x34\x28\x1c\x0f\x7b\x2a\x60\xfc\xde\x46\xc8\xc2\xe6\x2d\x33\xc5"
+ "\x59\x8a\xe0\x8d\xe2\x6e\xc9\x51\xcb\xe3\x53\xa5\xde\xb2\x87\xe0"
+ "\x7a\x58\xfa\xe3\x2a\x19\xca\x03\x1f\xd7\xc5\x0e\x97\x49\x5b\x99"
+ "\xf7\xde\xd7\x60\x55\x45\xfd\x3c\x14\xe6\xd7\x9a\x84\xdf\x21\x69"
+ "\xb3\xfa\xde\x51\x0f\x73\x35\x84\x79\x90\xa6\x9b\x41\x07\x05\x3d"
+ "\xfc\x01\x5a\xa8\xf1\xce\xd4\xce\xe1\x2d\x7c\x3d\xef\xac\x18\x62"
+ "\x42\x1f\x88\xd8\x08\x92\xbe\x1e\x4e\xd1\xe1\x48\xfc\x4b\x27\xf4"
+ "\x0e\xba\x7c\xb4\x2c\x70\x8e\x17\x6e\x64\x06\xe8\x1e\x88\x86\x94"
+ "\xbc\x92\xeb\x35\x70\xe7\x7b\x36\xe2\x65\xf2\x90\xa7\x56\xb3\xdd"
+ "\xe4\x31\x43\x0e\xaa\x27\x3f\x2c\x77\x34\x2d\x14\x7c\xfc\x10\xf0"
+ "\xe6\xf0\xb4\x0c\xec\x11\x92\x76\x5f\xf4\x43\xfd\xe5\xb1\xf2\x1c"
+ "\x45\xd2\xb7\xc3\x8d\xda\x18\x7a\x41\xb3\x34\xdb\x5f\x83\xc4\xeb"
+ "\xa6\x85\x84\x73\x79\x98\x0b\xa2\xf3\x25\x3a\xbc\x30\x5e\xf4\x1d"
+ "\x7a\x6b\xa2\xc3\x25\xaf\x6e\xf2\x1b\x64\xec\xd2\xf7\x92\xa5\x7c"
+ "\xd4\x64\x8b\x3c\x37\x94\xb2\x50\xd3\xfc\xb0\x9f\x90\xf7\xaa\x46"
+ "\xd3\x88\xb5\x6b\x70\x9d\xec\xe1\x8c\x0d\x2b\x1f\xce\xce\x78\xd4"
+ "\x91\x6c\x7b\x74\x8d\x38\xb6\x15\x6a\x80\xbc\x47\x1f\x78\xd8\x06"
+ "\x2a\x92\xb1\x78\xe9\xd2\x8c\x45\xf7\xfc\xeb\xcf\x62\xd9\xa2\x95"
+ "\x94\x96\xb7\xd6\xb6\x34\x25\x59\x7e\xfa\xe9\x1d\xb7\xff\x5b\xc6"
+ "\xed\xcb\xee\xb9\x7b\xf9\x18\x36\xe9\x71\x84\x13\x0e\x9a\xa3\x09"
+ "\x1d\xec\x83\x52\x69\x83\xd4\xd4\x3c\xd2\x06\xa9\xc9\x43\x7f\x44"
+ "\x9d\xdf\xb7\x32\xf6\x01\xa5\x7e\x50\x4a\x7f\xc5\x12\x6f\x62\x2c"
+ "\xd4\x7f\x5f\x18\x6f\x3e\x10\xe7\x6d\xd0\x1d\x48\xdd\xeb\xfb\x44"
+ "\xff\xde\x5b\x1a\xf9\x2d\x4c\x0b\xde\x0f\x0a\x7a\xa9\xe1\x05\xf0"
+ "\x21\x23\x60\x12\xb8\x21\xf9\x95\xf7\x97\xea\xb8\x51\x21\xcf\x87"
+ "\x18\x74\x66\xf8\x4e\xf8\xbd\x1c\xfa\x65\xc2\x05\x07\xce\xd6\x91"
+ "\xce\xe3\x6f\x59\xae\xd5\xbb\x0d\xfa\x66\xf0\xb3\xda\x99\x58\x42"
+ "\x0f\x7b\xff\x5d\xee\x6c\x5a\x22\x65\xc1\xa6\x8d\x02\x6f\xb6\x4e"
+ "\x5d\x24\xce\x20\xc5\x7d\xa2\xf7\x1b\xc3\xf8\xf3\x41\x29\xe6\x06"
+ "\x74\x41\xd2\xde\xf7\x8f\x8e\xd2\xe3\x44\x51\x5a\xb7\xee\x67\x3e"
+ "\x6f\x26\x33\x18\x67\x56\xb2\x2a\x03\x2f\xf6\xb0\xf7\xab\xa5\x1d"
+ "\xea\x07\x26\x9d\x7f\xa6\xe7\x44\x0f\xe3\xed\xa3\xf5\x5f\xe5\x11"
+ "\xfa\xaf\x42\x07\x3f\xde\xea\xf0\x82\x47\x76\xb9\xbd\xc2\xbf\xe9"
+ "\xad\xad\x0e\x1f\x6c\x4b\x62\xbb\xd8\x07\xf7\x16\x05\xf9\x10\x3d"
+ "\x4f\xa5\xb1\x89\x3d\x64\x9e\xd4\x29\x90\x3c\xf6\x41\x99\x94\x4d"
+ "\x64\x3a\xe0\x4e\xcf\xe8\xa3\x11\xf3\x43\x78\xd9\x4d\x73\xb4\x6c"
+ "\x2c\xba\x97\xb0\xc5\xa0\xf9\x91\xfa\xe0\x38\x64\x54\xc0\xea\x69"
+ "\x83\x9a\xf3\xb4\x93\xfe\xe8\x17\xb4\x2f\xcc\x5f\x72\xbf\x84\xed"
+ "\x07\x9e\xa6\xfc\x5e\xec\x9b\xfe\xf1\x68\x29\xcd\xe7\x31\x7d\x3e"
+ "\x97\x05\xbd\xb7\x62\xbe\x06\x9d\xff\x69\xd5\xe7\xb2\x6f\x76\x45"
+ "\x65\xd4\x16\x66\x3b\x5c\x73\x03\xd2\x69\xfd\x7f\x50\x2d\x6c\x7b"
+ "\xb0\xbe\x46\x95\x25\x3a\x9c\xaa\x95\x4f\xd7\xcb\x8f\xf6\x4f\x2c"
+ "\x2e\xe8\x42\xc9\xf5\x63\x69\xe3\xa3\x85\x93\x1e\x61\xe3\x83\x33"
+ "\xc0\x26\x89\x93\xba\x0e\xce\x22\xc7\xd3\xfc\x13\x75\x27\xc9\xdf"
+ "\x3b\xbf\x7b\x48\xd3\x03\xd0\xda\xfe\xcf\xfe\xeb\x18\x5b\xed\xdb"
+ "\x90\x1e\xd2\xa1\x40\xf7\x01\x9f\x83\xd4\x0f\x4f\x84\x8e\x2c\x64"
+ "\xa3\xe9\x61\xcd\x69\xb0\x19\xc3\x9d\x65\xd4\x83\x75\x25\xf5\x36"
+ "\xcd\x16\x37\x51\x5e\xaa\x6f\x8d\x38\xff\x76\xfe\x67\x8e\xc0\x3d"
+ "\x92\xb5\x85\x9c\x5f\xc0\xbf\xd5\x6c\x98\x04\xef\x22\xef\xe3\x35"
+ "\x2f\x0e\xe9\x82\xc4\xdd\xb4\xff\x14\x76\xd9\x94\xbe\x62\x2c\x7d"
+ "\x21\xd1\x87\x9c\x95\x6b\xb2\xd6\x3e\xf8\xe0\x0f\x93\x86\xc8\x33"
+ "\xae\x4a\xa7\x5a\x42\x75\x92\xfc\xfb\x6a\x8e\xc4\xd3\x66\xa2\xff"
+ "\x2f\xa6\x4a\xfe\xed\xdf\x4f\xd2\xba\x99\xde\xc3\x3e\xb4\xea\xfc"
+ "\xbb\x5c\x47\x1f\x26\x71\x67\x73\x4e\x78\x6d\x34\x7b\xbf\xbf\x36"
+ "\x3e\x34\x8e\xbd\x36\x3e\xb4\xd3\x3e\x7b\x8c\xbe\x27\x51\x9b\xc7"
+ "\x04\xcd\xc7\x7c\x4b\x1e\xdc\x65\x0e\xdc\x2a\x78\xf0\x8c\x8d\x4c"
+ "\x01\xff\x0d\xdd\x34\xf6\x83\x20\xc9\xb5\x41\xa2\x11\x19\x01\x66"
+ "\xc1\x5e\x50\xb1\x06\x7a\xc7\x19\x3c\x30\xc0\x3d\x19\x1b\x89\x5e"
+ "\xd0\x7b\x79\x8f\x3c\x83\xbf\xaf\x9f\xe4\x10\x7a\xae\xe8\x02\xad"
+ "\x50\x11\x0c\x81\xc9\xfd\xfa\xc3\x6a\x9d\xc7\x35\x6f\xb1\x09\x1f"
+ "\xd9\xd8\xb7\x83\xd2\x9e\xe9\x20\xf6\x6e\x6a\xa7\x41\xd0\xa0\xa0"
+ "\x19\x67\x00\xac\xe2\x21\xaa\x17\x76\x41\x6b\xd0\xbf\xa8\x1b\xcd"
+ "\x81\x14\x71\x56\x50\xf7\x90\xb0\x07\xba\x51\xda\x03\xdd\xc8\x6a"
+ "\xd7\x00\x0e\x1f\xfa\xcf\xab\x1b\x8f\x9f\x63\x89\x4c\xcf\x7f\x70"
+ "\x55\x86\x23\x67\x63\x06\x6c\x01\x47\xed\xef\x72\x0d\x39\x3f\x9a"
+ "\x26\xe1\xfb\x51\x5a\x58\x57\x25\x6d\xf8\x40\x33\xe7\xf9\x85\x0f"
+ "\x5b\xed\xac\xe7\xe3\xf9\x80\x7d\xd1\x39\xbc\x9b\x08\xe7\x3e\x9e"
+ "\x8b\xb3\x9f\x3e\xd8\xce\xd4\xa5\xb3\x4a\x27\x77\x41\x87\x46\xe9"
+ "\x97\xe8\x77\xea\xfb\x28\x9d\xd6\x3e\xd2\x62\xc4\x59\x63\x9e\xd0"
+ "\xcd\x11\x9c\x3e\x72\x79\x98\x79\xbe\xd6\xde\xc3\xb0\xcf\x13\x36"
+ "\xe5\x82\xcf\xf8\xe8\x94\xbc\xa3\xf5\x51\xa7\x0e\x4b\xe2\x7d\x17"
+ "\xe0\x5e\x3f\xec\x74\xfa\x38\x6c\x02\x3f\x66\x7a\x79\x0f\xfb\x48"
+ "\xdc\x31\xbd\xdb\x27\x9e\x0f\xdc\xe7\x8b\xbc\x93\xff\x51\xb5\xa4"
+ "\x5b\x1f\xd5\x50\x3a\xd1\xca\x8f\x8a\xa9\xcf\x09\xd2\x47\x80\xa8"
+ "\x67\x89\x6e\x0f\x15\x09\xb7\xdb\x57\x3a\x88\x59\x5e\xf5\xe0\x83"
+ "\xd9\xb9\xeb\xf4\x98\xf2\xf6\xb5\xab\xb3\x6e\xd6\xee\xe0\xaf\xc9"
+ "\xde\x90\xb1\x2a\x4b\xdc\xf1\xa1\x54\xf9\x38\x0a\xbe\xc9\x90\x6f"
+ "\x84\xdd\xbc\x18\x53\xdb\xac\x5a\x8d\x8f\xea\x60\x2d\x0d\xd2\xde"
+ "\xa2\xe5\x11\xb9\xb7\x5d\xf4\x12\xf5\xa3\x4d\xdf\xdb\xa0\x63\xe9"
+ "\x63\x3f\xb2\xe1\xcc\x0c\x7e\x19\x70\x36\x07\x3d\x0b\xe5\xa1\x35"
+ "\xfa\x51\xe8\xce\x74\x19\xa5\xe3\x4c\xd8\xb5\x06\xe7\xc0\x6d\x77"
+ "\xa8\x3b\x7c\xab\x79\xec\x71\x2b\xd1\xb5\x38\xcc\x1d\xce\x8a\x64"
+ "\x0c\x8f\x96\x54\xd0\x6b\xe8\x02\x5d\x6b\x60\x4f\xdb\x62\x21\xfe"
+ "\x84\xf6\xcb\xb6\x25\x24\xeb\xad\xde\xb6\x89\x99\xd0\x06\xed\x85"
+ "\x1e\xa9\x57\x6e\x59\xf1\x6e\x01\x63\xda\x7e\xe8\x29\x13\x7a\xce"
+ "\x16\xbb\xdc\x53\x7d\xc5\x9a\x1e\x85\x64\xab\x96\x6d\x1e\x76\x95"
+ "\x57\xf6\xf9\x78\xaa\xc0\x13\x41\xeb\x5a\xf6\xf1\x9d\xc7\xdb\x84"
+ "\xcd\xf3\xce\xe3\xa9\x2a\xcf\x89\xc2\x3b\xed\x35\xb1\x34\x8f\x6d"
+ "\xbc\xc8\xce\x34\x3b\xe9\xa8\x2e\x76\xe4\x7a\xe8\x81\x09\x3f\x5c"
+ "\x80\x05\xd5\x5f\xaa\xd5\x5f\x4a\xf5\x53\xbb\x37\x6a\xf1\x73\x5b"
+ "\xbc\x7a\x5b\xb4\x5e\xa1\x67\x5a\x8d\x3d\x99\xfa\x9f\x45\x7f\x39"
+ "\x52\xe7\xe4\x27\xd9\x6f\x46\x48\xe7\x24\xf9\xbe\x23\x76\x7d\xbd"
+ "\xa0\x6d\x6d\x0c\x25\xaa\x53\xf8\x6f\x55\xb4\xb6\x4a\xa0\xff\xd0"
+ "\xeb\xe4\x54\x27\x1f\xe8\xad\xa7\xfd\xd3\x44\x74\xc3\x9b\xb0\x85"
+ "\xf6\x49\xb4\x01\xbe\xdd\x37\x83\xd3\x3e\x1a\xcc\x08\x1a\xa5\x0f"
+ "\x8d\x8d\x2c\x3e\x92\x67\xa7\xf6\xaa\xc3\x7c\x26\xd5\x31\x40\xf4"
+ "\xb9\x90\x15\x77\xb2\x23\xaf\xa1\x6d\xd8\x39\x61\x5e\x87\x68\x9e"
+ "\x68\xae\x6c\xd4\xce\x41\x92\x35\xe2\x09\x0e\x9f\x61\xbe\x60\x3b"
+ "\x52\x3b\x24\xe4\x0f\x33\xf5\xcd\xd8\xc1\x8e\xbc\x8b\xb9\x42\x5d"
+ "\x04\x63\x6f\x60\x30\xfd\x9f\xe1\xc3\x0e\xb0\xde\x5c\xc0\xbb\x71"
+ "\x7e\xd9\xc5\xdc\x77\x80\x2f\x27\x59\x45\x3c\x17\x65\x71\x55\xcc"
+ "\xb5\xb0\x9d\x76\xdf\xb1\xb9\x9b\xab\xe7\x9c\x8c\x37\xd3\xfe\x70"
+ "\xce\xc0\x02\x7e\x92\xab\xa9\xdf\x86\xa2\x53\xf0\xb3\x57\x4f\xb4"
+ "\xa6\x04\x36\x2b\xa6\xf2\x4d\xcc\x02\x1f\x85\x45\x0e\xee\x6f\xf5"
+ "\xd5\xb0\x56\x47\x0d\xfb\x28\x50\xc5\x5c\xeb\xa1\xa7\x75\xf7\x7e"
+ "\x9c\x5f\x85\xbb\x2a\x31\xf4\xfc\xb2\xed\xdf\xd0\x56\xeb\xb6\x8f"
+ "\x8f\x7e\x4a\x33\xf7\x29\xb3\xfd\x5c\xbc\x57\xb5\xa4\x7f\x44\xd8"
+ "\xf6\x11\x2b\xea\xe4\x2a\x78\xbc\xc2\x47\xd0\x46\x09\xd5\x55\x0f"
+ "\x7f\x7e\x16\xb5\xcf\x1a\x4b\xe3\x37\x2e\xcb\x67\xe2\x8c\xd4\xb5"
+ "\xe6\xcf\xe8\xe3\x25\xb5\x67\x99\xc9\xb5\xe6\x3d\xf1\x2c\x74\x26"
+ "\x34\x5e\x77\x56\xbb\xb0\xc1\x84\x2f\x43\x77\x7e\x37\xee\x7c\xab"
+ "\x15\xe8\x63\x50\xf6\x9b\xe0\x65\xd4\xcb\xd7\x15\xea\xe5\x5b\x05"
+ "\x2d\xd8\x03\x78\x50\x9f\x8e\x2c\x97\x30\x69\xa1\x54\xd9\x67\x82"
+ "\x4f\x7a\x24\x7c\x5a\xe7\x03\x3e\xb0\x49\x57\xd7\xf7\xd6\x53\xdf"
+ "\x52\x09\x06\xaa\xde\x06\x70\x00\x67\x79\xa8\xbf\xfc\x2c\x8b\x73"
+ "\xad\x81\xcd\xba\xfb\x79\x73\x9a\xd1\xa4\x0e\x9c\x3a\x58\xd1\xcf"
+ "\x8c\x98\x37\xf0\x0e\x15\xe2\xbb\x80\x79\x01\xe6\xcc\x1b\xf3\x5d"
+ "\x3a\xfd\xad\xa0\xbf\x4c\xe0\x1e\xfd\x66\xd1\x7c\x95\x50\x1f\x12"
+ "\x69\xae\xea\xf1\x2b\xf1\xb1\xa3\x12\x3e\x5e\xb1\x3f\x13\xae\x84"
+ "\xd3\x77\x76\x54\x04\x68\xed\xa8\x42\xf6\x74\x27\xaa\x3b\xd4\x6a"
+ "\x69\xbf\xfc\xf1\xf2\x3d\xc4\xeb\xd7\x3c\x25\x7c\x64\xc4\x91\x7c"
+ "\x02\x9d\x03\xdb\x25\xee\xd2\xb5\x59\x75\x3a\xbe\x73\x0a\xfc\x4f"
+ "\xb8\x17\x1b\x84\x2d\xa5\x6f\x9b\x86\xeb\xdb\x28\xcf\x42\x0f\xbb"
+ "\x2e\x47\xae\x89\x16\x71\x07\x10\x74\x60\x3c\x3e\x8b\xf6\xae\x16"
+ "\xd8\xb0\xf2\xcb\xd3\x59\x9c\xc2\xbd\x71\x99\x66\xee\x0e\x34\x01"
+ "\x87\xe2\x04\xee\xcb\x6f\xc4\x1b\x7b\xcd\xb4\xb7\xb5\x51\xba\x51"
+ "\x4f\xc7\x1e\xaa\x92\xbc\x0c\x59\x7d\xd9\x46\x33\x2f\xec\x67\xd3"
+ "\x84\xde\x4b\x4f\xdf\xe8\x35\xb7\xd2\xce\x5f\x48\xb4\x1b\xbe\x75"
+ "\x50\x86\xd2\xa3\x68\xaf\x3c\x44\xed\xba\x28\x7f\xa2\x9e\x9f\xf7"
+ "\xa5\x1b\xdd\xf9\x4d\x62\x9d\xc1\xff\x9a\xd8\x23\x65\xfa\x84\x65"
+ "\xf9\x5e\xb3\x98\x33\x3d\x6d\x5d\xba\xd8\x9b\xe1\x87\x83\x78\x6f"
+ "\x2e\xfa\xd3\x25\xd2\x15\x92\x9d\x91\x6e\x89\x48\x33\xc0\xe7\x09"
+ "\xfc\x69\x46\xa4\x45\x51\x9f\x59\xe8\x9d\xda\xc6\x3e\x8d\x75\xb7"
+ "\x6c\x23\xce\x00\xe5\xfe\x2c\xda\xde\xc8\x99\xf4\xd1\x2b\xd3\x24"
+ "\x1f\xf0\x49\x7d\xa4\xdc\x8e\x73\x17\xb4\xad\xf6\xa5\x1b\x82\x7d"
+ "\xe9\x51\x68\x1f\x75\x41\xe7\x4a\x63\xa4\x76\xbb\x19\xfc\xc3\xf3"
+ "\xb2\x45\x0e\x8e\x7b\x5f\x54\xaf\xe8\x4f\xbe\x9f\xf1\xf8\x45\x63"
+ "\xfb\x3a\x29\x4d\xb6\xbb\x0a\x7f\x4e\x38\xfd\xe9\x3e\xd0\x94\xa0"
+ "\xa9\xbf\xca\xf6\x10\xf6\xe9\x4f\x67\x62\x4e\x83\xb4\xce\x83\x31"
+ "\xfd\x55\xf3\xba\x99\x52\x48\x6b\x47\x9e\x4d\x7e\x7a\x1b\xf8\xc4"
+ "\x22\x95\x73\x7a\x9e\x0f\xdc\x35\xf7\x92\x2c\xb6\xa3\xbf\x5a\xd8"
+ "\xc2\x24\xd8\x6d\x6e\x7f\x37\x6b\x29\xfe\x82\xb5\x04\xdc\xc5\x87"
+ "\xce\x7a\x8d\xd2\x26\xc6\x88\x7a\xef\xc1\xb7\x22\x5a\x2f\x19\xc1"
+ "\xfa\xf1\x65\x5b\x92\x97\x08\x76\x5f\xcb\xbd\xe0\xd3\x7d\xba\x8c"
+ "\x74\xfe\x31\xfc\x45\xf8\x44\x85\xbd\xa8\x5a\x1e\x8d\x38\x91\x45"
+ "\x7c\xd0\xce\xe6\x6d\x82\xae\xfa\xd3\xf6\x04\x1f\x4b\xd5\xea\x3d"
+ "\x23\xeb\xfd\x0b\x3b\x5f\xbd\xc0\xdb\x96\x6a\x69\x87\xa2\x26\x44"
+ "\x5b\x82\x54\x77\x30\x21\x3a\x8d\xf6\x9a\x22\xe2\x5f\x88\x1f\x39"
+ "\x7a\x07\xb5\x63\x69\x0d\xb4\x31\xf8\x55\xae\x55\x69\xbf\x3e\x63"
+ "\x65\x9a\xfd\x4f\xd1\x69\xf6\x97\xeb\x55\x6e\xb7\x90\xec\x06\xfd"
+ "\x6f\x11\xe8\x2c\xf4\xe9\x85\x41\x16\xed\xce\x23\x29\x2b\x3e\xd9"
+ "\x4e\x75\xfc\xe8\x7d\xe8\xda\x89\x56\x05\xb9\xd5\xf0\xd6\x80\x87"
+ "\x55\x10\xfd\x16\xfe\x41\xb7\x5e\xbe\x2b\x61\x0b\xbb\x95\x1b\xcc"
+ "\xc2\x7e\x8c\xf6\x17\x3b\xcd\x6d\xbe\xe8\xcf\x4e\x5f\x55\x84\xad"
+ "\x51\x14\xb5\xf5\x06\x6c\x8d\xb8\xc9\x97\x5e\x83\x3d\x93\xe6\x6c"
+ "\xd0\xf9\x17\xe2\xff\x3f\x11\xfb\x5d\x29\xf8\x22\x41\xe7\x8f\xde"
+ "\xe5\x8d\x57\xe0\xef\x1f\xb1\x52\x15\x75\x7d\xe0\x60\xc5\x77\xcc"
+ "\x28\xe1\x71\x74\x6e\x6b\xef\xa0\x8b\x97\x2a\x5e\xac\x23\xad\x6e"
+ "\x33\xd5\x1d\xe4\x65\x0a\xed\x9d\x47\x97\xca\xb9\x11\xcf\x56\x7c"
+ "\x0f\x0c\xe3\x6e\xe0\x5f\xaa\x6a\x86\xc0\x17\xfd\x25\x95\x78\x5d"
+ "\x57\x5f\x9c\xe2\xfd\x57\x6b\x31\xf1\x00\x47\x33\x3d\xca\xa0\xb0"
+ "\x59\xd5\x7d\x9d\x8e\x77\xae\xc6\x77\x5b\x63\xdd\x54\x09\xf1\xed"
+ "\x89\x3d\xec\xaf\x9f\x0c\x39\x99\x61\x98\xf6\xd6\x21\x92\x7d\xf8"
+ "\xee\xf4\xb8\xf2\xa9\x0c\x7e\x11\xa7\xf6\xb0\xa3\x6f\x04\x0c\x2c"
+ "\x91\xfe\x2c\xde\xcb\x73\x62\xa8\xde\x54\xe8\x74\x8f\x9c\xc5\x39"
+ "\xf3\x67\xd2\x2f\xc7\x2e\x96\xa4\x52\x7d\xd0\x25\x57\x4c\x65\x49"
+ "\xd0\x23\x53\x9a\x3d\x23\x28\xcf\x59\x74\x39\x71\xeb\x54\x96\x3c"
+ "\xb2\xdd\xa3\x35\x92\xcf\xfb\xab\xd8\xe3\x37\x78\xd9\x15\x8e\x5b"
+ "\x78\x07\xd5\x5b\xc9\x9d\x51\x9c\x5f\x6e\x35\x48\x7e\xf0\xb3\x8d"
+ "\xe6\x6a\x89\x77\xe2\x5c\x81\xf0\x0d\xe7\x36\x9a\xbe\x5a\x11\x3e"
+ "\x5e\x63\x87\x92\x70\x37\x4b\xa4\x29\x16\xc0\xd2\x22\xfa\xa1\xf9"
+ "\x65\x0c\x6e\xbd\x26\x13\x75\xa0\x3f\x19\x2b\xa5\xae\x1b\x3e\x1b"
+ "\x09\xae\xc2\x4e\xb8\x74\x17\x8b\x7b\x62\x17\xb3\x1c\x79\x50\x8c"
+ "\x6b\x9f\x5c\x8b\x46\x86\xfe\xaa\x25\x58\x67\x84\x13\xd4\x6f\xb4"
+ "\x07\xdc\x68\x0d\x9c\x71\x15\xe5\x71\xd5\xf5\x10\xfc\x93\x7c\x76"
+ "\xd2\x95\x7b\x80\x2d\xeb\x0c\x48\x3f\x63\x2b\x98\xb7\x8e\xea\xab"
+ "\x9b\xca\x2c\x54\x57\xbf\x7b\x35\x68\xad\xf5\x4a\x57\x6e\x03\xd5"
+ "\xfd\xd7\x18\xec\x47\x65\x04\x1f\xb9\x2f\xfd\xf5\x90\xdb\xdf\xce"
+ "\x10\xe3\xe2\x6e\x07\x0f\xa2\x1e\xca\x73\x9b\x18\xef\x6e\xab\x2d"
+ "\x43\xfa\xd5\x14\x63\x0d\x9d\x21\x68\xe3\x70\x9f\x15\xf5\x2d\x77"
+ "\x67\x12\xcf\xa9\x8d\x49\x87\xb5\xc4\xaf\xbf\x3e\xe9\xca\xdd\xcb"
+ "\x30\x3f\xc8\x4f\xef\xc5\xee\x5e\xca\x7b\x6a\xe4\xbc\x20\x0f\x7d"
+ "\x7b\x8d\xea\xfd\x3f\xe1\xb3\x31\x9c\xd9\x84\xf3\xd4\xd0\x78\x08"
+ "\x56\xbe\xdd\x04\x23\xa9\x33\xfc\xeb\x74\xf4\x95\xe6\x6e\x9a\x3b"
+ "\xef\x8b\xb1\xef\x44\xd2\xda\x27\xbc\xdf\xd2\x2a\xf4\x65\x7f\x8b"
+ "\xbf\x3b\xa0\x72\x49\xcf\xfe\xe6\x52\x89\x0e\x78\xe8\x17\xb4\x40"
+ "\xd0\x93\xeb\x70\x9e\xfd\xb7\x77\xcd\x8a\x9c\x5f\x8c\x05\x3c\xd3"
+ "\x58\x73\x1c\x71\x56\x61\x41\x5f\xf5\x39\xe6\x71\xc9\x76\x15\x67"
+ "\x50\xb0\xed\x1d\xb6\x32\x89\x7f\xbc\x92\xea\x7d\x4d\xe3\x21\xdb"
+ "\xb5\xfd\xb4\xbd\x2f\xa6\xbf\x9e\x3f\x66\x65\xba\x1d\x22\xad\xdf"
+ "\x9a\x0c\x69\x3b\x6a\x05\x8d\xaa\x33\xc8\xb5\x83\x3e\x6a\x65\x8f"
+ "\xca\xb3\xf1\xbf\x15\x53\xf9\xa3\x63\x8e\x37\x6a\x2a\xfc\x4f\x15"
+ "\xc1\x87\xa8\xb8\xab\x44\xb4\x8a\xf6\x83\x68\xb7\x6f\x88\xc9\xf3"
+ "\xfa\xf6\x9b\x89\xc7\x8f\xc6\x3d\x55\xbd\x6f\x17\x76\xae\xd0\xae"
+ "\xdd\x97\x6b\x5f\xa2\xcb\xd0\x3c\x8e\x60\xec\x34\x8b\x78\x07\xc4"
+ "\x77\xa9\xbe\xf8\xe4\x14\x6f\xfc\x2d\x99\x72\xdd\xb4\x3b\x78\xbc"
+ "\xa4\xb7\x19\x7e\x56\x8c\x71\x69\x7a\x89\x68\x8c\x99\xea\xa9\xd4"
+ "\xcf\xb7\xf5\xba\xc7\x8d\x21\xa2\x8f\x8d\xc6\x24\xfd\x1b\x24\xdb"
+ "\xc5\xd8\xe0\xa3\x47\x8c\xed\x73\x71\x07\xf0\x02\xc7\xd3\x2e\xe9"
+ "\x5b\x72\x8a\x6b\x2a\xea\xf8\xe2\xd7\xe8\x1f\xe6\x84\xe8\xc3\xa5"
+ "\x3d\xec\xf3\x4c\x1e\xfb\x44\xec\x85\xd5\xf9\x79\xb2\xac\xf3\x96"
+ "\xcc\x67\x88\x06\xcb\x3b\x8b\xb0\xd9\xf9\xa2\x8c\x97\xdd\x92\x09"
+ "\x19\xa6\x8f\xda\x23\xfc\x88\xa0\x43\x5f\x58\x30\x57\xd7\x1d\x60"
+ "\xa9\x12\x0f\xbf\x98\x00\x79\x57\xc6\x78\xfa\xbc\x81\xf0\x5e\xfa"
+ "\x97\x0b\xd9\xac\x2a\x62\x1f\x8b\xa4\xb1\x17\xd8\x47\x29\xd3\x24"
+ "\xcc\x22\xf9\xf1\xf3\xbd\xc2\x2e\x89\xfa\xbb\x21\xa0\xd3\xbf\xcf"
+ "\xf7\x72\xe8\xbb\x0b\x35\xbd\x27\x68\x59\xa1\xf4\x11\x38\xe8\xfc"
+ "\x62\x71\x48\xef\x89\x3b\xdd\x4e\xde\x8c\x7c\x34\xf7\x67\x90\x47"
+ "\xfa\x20\xeb\xd1\xee\x3b\x7f\xf1\x33\xed\x2e\xb3\x1d\xb6\x5a\x54"
+ "\x96\xe8\x1d\x17\xfa\x56\xc0\x00\x6d\x8b\xbe\x1b\xa0\xe3\xfc\xa2"
+ "\x26\xac\x67\xfe\x5c\xc4\x86\x90\xfe\x08\xbe\x68\xd0\x71\x84\xc6"
+ "\x1b\x2d\xe3\x7a\x7c\x3e\xfd\x30\x41\x19\x38\xd0\xc7\xad\xb1\x57"
+ "\xd5\x00\x27\xbf\x38\x16\x09\xa7\x65\x01\xb5\x48\xd2\xa0\xcf\x9b"
+ "\xb8\x58\xeb\x9f\x37\xfd\x30\x3f\xf1\x5f\xd7\xeb\xbc\x88\x84\xb3"
+ "\x85\xe8\xcb\x97\x01\x01\xeb\x92\x8e\x14\xf8\xdd\x7d\xac\x10\x7e"
+ "\xc4\xff\xeb\x3b\xf8\x6b\x0f\x94\x74\xa4\x05\x8b\xac\xf0\x4f\xcb"
+ "\xd4\x92\x8e\xcc\x2e\x07\x33\x64\xd0\x1f\xfc\x9e\x43\xc6\x23\x99"
+ "\xd5\xc2\x63\x89\x3f\xa1\x75\xbe\x79\x15\x33\xdf\x9b\x03\x1d\x83"
+ "\x3d\x11\xfe\xd4\xe1\x4b\x1d\xb1\x10\x82\x45\xf6\xc9\xf4\x3c\x85"
+ "\xf8\x39\x0b\x37\x75\xa4\xe2\x7c\x3e\xe8\xe4\x44\x8f\x8f\xc1\xa7"
+ "\xbb\xc1\xed\xf5\xb3\xcd\xa7\x98\x09\xfe\xda\x03\x65\x4a\x7b\xab"
+ "\xef\x4b\x21\xdf\x24\x38\x58\x22\xf1\x1f\xb8\x03\x60\x55\xe3\x15"
+ "\x17\xed\xf1\x4d\x72\xdc\x67\xb8\x1c\xb7\xec\x37\xfa\x2f\x68\x5c"
+ "\x49\x67\x66\xa1\xe8\xfb\x97\xcf\x04\xa8\x7e\xb5\xe4\xe4\x8a\x60"
+ "\xc9\xc9\x74\x79\xa7\xbe\x85\x15\xe6\xf1\x6e\xb7\xaf\x85\x64\xae"
+ "\x7e\x11\xbb\x0e\xe7\xff\x18\x23\xc6\x87\xb6\x3f\x3e\x7b\x4a\xf0"
+ "\x5a\x01\x7a\x2f\x5a\xad\x95\xe9\xa5\x32\xbd\x2d\x6c\xa8\xe4\xa4"
+ "\x18\x7b\xab\x4f\x96\xcd\x10\xcf\x54\x3e\x12\x0e\xda\x98\x43\x70"
+ "\xa0\xb1\x63\x7c\x18\x7f\x00\x30\x21\x18\x68\x63\xb5\x0e\x6b\xe3"
+ "\xc4\x18\x3f\xa2\x5d\x67\x17\x8d\x93\xc6\x2a\xc6\x39\x4c\xe3\x6c"
+ "\xce\x61\xcc\x5f\x9e\x9c\x7a\x2e\xf6\x64\x3a\x64\xd4\xa2\x4f\x88"
+ "\x87\x2f\xa8\x64\x24\x8b\x1a\x5f\x2e\xac\x34\xec\x24\xde\xa4\xd0"
+ "\x4b\x32\xa9\x97\x77\xc3\x86\xd7\xed\xa0\xbf\x40\x0d\x03\x8f\xa3"
+ "\xf3\xeb\xd4\xb6\xf5\x63\xf5\x04\x2b\xec\xe6\xdd\xc4\x9b\xfa\xdd"
+ "\x01\xca\x93\x43\xe3\x27\x19\xb6\x4b\xeb\x3f\xf2\x6e\xfe\x4e\x8e"
+ "\xcb\xbc\x9a\x25\xbe\xf3\xf3\x12\x83\xbb\xbd\x84\xe9\x63\xb9\x8f"
+ "\xf2\xd1\x78\xac\x54\x57\x3c\xc6\xa3\xd2\x38\x77\x53\x3f\xfd\x11"
+ "\x63\x3a\xd2\x0b\x3b\xe2\xcf\x58\x6c\x1a\x53\x76\x9d\xa6\x71\x9c"
+ "\x66\xd6\xca\x42\xe2\xbf\x7e\x0a\x7e\xf1\xd8\x91\x8b\xd2\x59\x92"
+ "\x87\xfd\xd7\x51\x49\xe3\x85\x2f\xe8\x4b\x7a\xd8\x97\xfd\x21\x7f"
+ "\xcf\xf0\xa1\x1f\xaf\x1c\x03\x1e\x09\xbf\xcf\xd8\x33\x06\x09\x67"
+ "\x70\x4e\xbf\x81\xda\x18\xb4\x4f\x11\xfd\x71\xce\x87\x9d\x70\x1c"
+ "\xbd\x23\x76\x14\xee\xab\x2a\x54\xae\x9d\x13\xcc\x50\x3f\xf1\x73"
+ "\x4d\xf8\x05\x0c\xc7\xb4\xb9\x7d\x85\x2d\xa0\x36\xaa\x20\x7f\x1f"
+ "\x2c\xf4\x1a\x1e\x7f\x85\x25\x5f\x18\x4d\xf9\x2a\x69\x3c\xfa\x0d"
+ "\xfd\x2c\xea\xa3\xb1\x4d\xee\x61\x5f\xc7\x8c\x5c\x63\x36\x41\xcb"
+ "\x24\x1d\xfc\xaa\x0d\xfa\xcf\x0b\x6c\x57\xf0\x70\xb0\xb1\xb8\xc0"
+ "\x72\x47\xf5\x7e\xd0\xf3\xb8\xf7\x2d\x2e\x1c\x0e\x5f\x27\x8f\x57"
+ "\x57\xd9\xb3\xc2\x46\xb2\xa8\xfc\x59\xa2\x17\xc4\x2b\x1c\xb6\xe2"
+ "\x2c\x85\xf6\xce\xbd\x3e\xb6\x6e\x0f\x43\xfc\x99\x78\x77\xe0\x2e"
+ "\x76\xb8\x26\x85\xd5\x9e\x85\xcf\x38\xfb\xe4\xa7\xcf\xd2\x5c\x6a"
+ "\x34\x04\x3c\x29\xf4\xc8\x7c\x9d\xdd\x52\xf1\xac\xce\xc3\x7f\xdd"
+ "\x5f\xd0\xcf\x0c\xb6\x35\xe2\xd9\xb7\xd8\xc6\x03\x55\x06\x35\xa7"
+ "\x06\x7e\xcc\x13\x66\x3b\xe0\xc7\x5c\xf7\x0d\x2e\x78\x9f\x7c\x5a"
+ "\x73\x7d\xd6\xd8\xb2\x5c\x96\x8c\x78\x06\x66\xaf\xe4\xe5\xe4\x7e"
+ "\xed\x49\xa2\xfe\x59\x34\x7f\xe1\x16\xe9\x2f\xfc\xab\xd5\xb0\x39"
+ "\xd7\xbe\xdf\x13\x24\x19\x46\xd4\x9b\xcb\x92\x6a\xce\x32\x3b\xf8"
+ "\xa0\x8c\x13\x92\x67\x83\x5c\x78\x57\xaf\x99\x07\xff\x6e\x67\x7b"
+ "\x7a\xc2\xf1\x0e\xbc\xeb\x10\x23\x81\x5b\xc7\xb3\x9f\xae\x98\x22"
+ "\xec\x09\x84\xaf\x5d\x9c\x33\xd0\x3b\xab\x7a\x8a\x19\x0f\xc3\x36"
+ "\xb1\x5e\xde\xc3\x3b\x1c\x90\xf6\xbe\x83\x4e\x4f\x93\xee\x07\x7e"
+ "\xdc\xf3\xf2\x52\x29\xef\xa8\xd1\x24\x7f\x79\x07\x5d\xd2\x07\xe9"
+ "\xf1\x38\xf7\x36\x35\x42\xc6\xf1\x9c\xc2\x37\xa4\xc1\xaf\x5b\xaa"
+ "\x80\xe5\xf1\xf9\x90\x7b\x34\x99\xf1\x1d\x5b\x28\x4d\xf2\x30\xc2"
+ "\xe6\xda\x2a\xcf\xff\x68\x6f\x4a\x18\x74\x1e\x4f\xd3\xf7\x33\xec"
+ "\xeb\xd2\xd7\xeb\xf1\x2c\x8f\x72\xae\xfa\x3c\xfd\xb3\x68\x36\xe2"
+ "\x38\xbb\x49\xa5\xfc\x55\xfa\xfe\x26\xce\x70\xb7\x4e\x5d\xb4\x6e"
+ "\x23\x9b\xf6\xaf\x97\x99\x18\xce\xff\x28\x6f\xb7\xdc\x77\x8f\x1f"
+ "\x0a\x9f\x11\xa4\x0a\x78\xc3\x47\x81\x90\x31\xe0\xfb\x53\xc6\x34"
+ "\xe8\xd5\x7d\x80\xca\xfd\xf7\xf8\xe7\x11\xed\x04\x42\xfb\x28\xb5"
+ "\x01\x1b\x74\xd4\x2f\x79\x93\xe3\x07\xc5\x5d\x4a\xca\x27\xf7\xd7"
+ "\xe3\xe3\xca\x6d\xf0\x43\x05\xf8\xaa\x9a\x3c\xe9\xee\xfd\x56\xc2"
+ "\x37\x9f\x45\xcd\xab\x62\xd6\x77\x0a\x3d\xc6\x04\xe9\xa3\xdb\xdc"
+ "\xc1\x3a\xee\xc2\x77\xe0\xba\xeb\x3a\xe8\x03\x3b\xf6\xbb\xb1\x6f"
+ "\x0f\xa7\xc7\xdd\x0d\x59\x5f\xf0\xe2\x1d\xd5\x73\xa9\x1c\xa5\x4d"
+ "\x7e\xfb\xb4\xdf\x58\xb1\x89\x25\x4b\x5f\xaa\x1d\xc2\x47\x17\xee"
+ "\xac\x5f\x95\xc8\xac\x57\x55\x31\xfb\xa0\xb3\xc3\x45\xf2\xa5\xd0"
+ "\x77\x8b\xf6\xcb\x17\x55\x22\x9e\xc3\xab\x43\x9e\x09\x72\xae\xbe"
+ "\xb9\x97\xde\xed\xe1\xf7\x8e\x73\xda\xf9\x10\xf1\x39\xdf\xac\xa8"
+ "\x3b\x2d\x6d\xe9\x85\x7e\xa9\x74\x8e\x25\x6c\x7f\xf0\xcd\xbd\xb2"
+ "\x2f\xdf\xdc\x7b\xd8\xc1\xa0\x3b\x3f\x5a\x2b\x7c\xb3\x7f\x43\x3c"
+ "\xca\x71\x87\xa6\x8f\x69\x13\x78\x05\x7e\x77\x3b\x64\xb0\x6f\x5d"
+ "\x65\x94\x0f\xfb\x04\xf1\x47\xa9\x82\x87\x27\x5e\x57\x25\xfc\x89"
+ "\x18\xff\x87\xd0\x37\x8e\x49\x13\x77\x31\x26\xca\x94\xcd\xce\x14"
+ "\xf6\x2c\x65\x8b\xba\xe9\xd7\xc4\xcb\x68\x6d\xef\x82\x8f\xa3\x39"
+ "\x36\xfa\xb5\xd0\xaf\x95\x7e\x13\xe9\x7b\x1b\xf0\x92\x64\x58\x2b"
+ "\x62\x54\xf6\xc5\xcf\x4e\x1f\xef\x5e\x14\x60\xe3\xde\xf6\x6f\x4c"
+ "\xda\xec\x75\xa6\x22\x3e\xe1\xb2\x3d\x8c\xad\x0b\xf0\x21\xdb\x15"
+ "\x88\x31\xd2\x99\x5a\xb4\x07\x67\xe9\x9d\x89\x23\xcf\xd2\x3b\xe7"
+ "\xd3\x1f\xbd\x75\x36\xd3\x9f\x9f\xfe\x52\xc3\x7f\x27\xe6\x0f\x3a"
+ "\x3b\x53\x09\x8e\x82\xc7\xba\x30\x9a\x88\xf2\x34\x0f\x90\x8b\xe2"
+ "\xa3\x99\x1c\xef\x2d\xa9\xf4\x6e\xe2\xf1\x8b\x8a\xb5\xf1\xa6\xd0"
+ "\xbb\xc5\x56\x44\xfb\x5a\x3c\xc1\x64\x2a\x8d\x39\x7e\x51\x37\xc6"
+ "\x8b\xfe\xf6\xc5\xd3\xbe\x16\x71\x27\x0c\x75\x62\xfc\xde\x78\x2a"
+ "\x47\xb0\xe4\xb3\x2b\x2a\x75\x78\x6a\x70\xc2\x7d\x19\x43\x1f\xd5"
+ "\x21\xf9\x20\xca\x4f\x75\xe8\xf9\x43\xb0\x9f\x0a\xff\x04\x34\xa7"
+ "\x94\x8f\x64\x62\x93\x7e\xdf\x6c\xd0\x79\x22\xf9\xdd\xd5\x4c\xf3"
+ "\xe7\xd1\x99\xea\x8b\x28\x0b\x9f\x0a\x63\x95\xa7\x36\x4d\xb2\x4d"
+ "\x3b\xc9\xdd\x9d\xb7\xc9\x76\x4f\xd8\xc6\x5b\x4b\x85\x33\x89\xbf"
+ "\x23\xae\x77\x9e\x94\xfb\x16\xba\xa7\xf9\x98\xbb\x46\xa5\x3d\x7f"
+ "\x4e\x6a\x6a\x21\x77\x75\xb1\x13\xc7\x5b\xfd\xdd\x17\xb8\x1f\x9e"
+ "\x10\xfe\x42\xf8\x50\x31\x73\x17\xdc\x20\xce\xb3\x4e\xb3\x6f\x27"
+ "\xb9\xbd\xe2\xce\x39\x3d\x77\x05\xf1\x1d\x67\xe8\xd8\x1b\x48\xc6"
+ "\x0e\xc5\xc9\x50\x29\x6f\x2d\xd2\x29\x0d\x3e\x49\xea\x22\xbe\xf1"
+ "\xf2\xd9\xda\x39\x4d\xd7\x87\xe0\x2d\x44\x7f\x03\xff\xec\x42\x9f"
+ "\xd5\xd2\xd9\x56\x8c\xa1\x88\xe4\x3f\xc4\x06\xc5\x9a\xb0\xad\x87"
+ "\xae\xb0\xeb\xd7\x84\x77\x5c\x2d\x9b\x6d\xbd\xb0\x31\x74\x89\xbb"
+ "\x92\x45\x01\x7e\xda\x1b\x3f\xdb\x0a\x9e\xa4\xa2\x70\x82\xe9\xf6"
+ "\x1a\xee\xea\x4b\x98\x43\xb4\xac\xab\xf9\xdd\x7c\x39\x37\x17\x58"
+ "\x6f\xb3\x3e\xf6\x5a\x6d\xec\x94\x26\xce\xa8\xe6\x55\xcb\xf8\x21"
+ "\x1e\xf6\x2d\x1b\x57\x67\x45\xf3\x0c\x7e\x80\xf6\x86\x73\x12\x16"
+ "\xdf\xa6\x85\xf6\x86\x0b\xea\xc7\xb7\xe3\xfa\xf2\x8f\x68\x63\x58"
+ "\x6b\xa3\xe1\xbf\xd9\x46\xc3\xf9\xda\x90\xe7\xe7\xdd\xa9\x17\x2e"
+ "\x3b\x76\x0b\xbf\x3a\x44\x3f\x53\x24\xcd\x3c\xf9\x5a\x90\xe4\xb7"
+ "\x40\xdc\x2d\xa9\xe0\x6d\x60\x2b\x8b\x58\x2a\x81\xd2\x68\x76\x24"
+ "\x7f\x88\xb9\xd6\x7f\xca\x3a\x59\xb7\xf0\xdf\x77\x24\x0f\x32\xdb"
+ "\xa2\xe2\xe1\xf2\x39\x95\xc3\x86\x6f\x2b\x01\xef\x3d\x34\x0f\xbb"
+ "\x23\xf0\xac\xd5\xf7\x29\x73\x67\x42\xbf\xda\x06\xbd\x76\x31\x8f"
+ "\xbf\x25\x55\x25\xda\x40\x3c\x7a\x50\xc0\x83\xf8\x17\x21\x6f\x91"
+ "\xcc\x26\xe4\x2d\xaf\xf0\x99\x1c\x2f\x62\xa4\x38\x5f\xc9\x83\xee"
+ "\x3b\x38\x9c\x6e\x1b\x74\xb2\x34\xc4\x4e\x81\xde\x99\x9b\x7c\x8e"
+ "\x65\x81\x28\x2e\xe4\x29\xe2\xfd\x11\x3b\xc5\xed\xf3\xb0\x20\xf1"
+ "\xd1\x35\x03\x2c\xb1\x86\x78\x4f\xa2\xd9\x16\xd0\xf5\x3a\x2d\x7e"
+ "\x4a\xd9\x40\x38\x7e\x4a\x2d\x74\x3d\xed\xf4\x3c\xc0\x8c\xc1\xb2"
+ "\x64\xfb\xee\x01\x96\xb4\x67\x3d\xb3\xef\x86\x2e\xef\xa4\xe4\x7d"
+ "\x84\x6d\x3b\x62\xa9\xac\xb5\xe3\x2c\x21\xcc\xfb\xc0\x47\x42\x98"
+ "\x6e\x19\x85\x0e\xe4\x82\xe0\x7d\x52\xec\x83\x81\xd2\xd9\x99\x81"
+ "\xb8\x45\xdd\xc3\xe5\x76\x0b\xcd\xc1\x41\x82\x5f\xf2\x58\x73\xab"
+ "\xdb\xc8\x54\x45\xc4\xbf\x79\x37\x49\xd2\x77\xaa\xcb\x37\x1e\x4e"
+ "\x04\x77\xa7\xb3\x79\xbd\x2c\x45\x9e\xdb\xc7\xd0\x9e\xd8\x93\x0e"
+ "\x9b\xc6\xc2\x47\x98\x35\xb8\x7b\x85\x52\xf4\x02\x8b\x72\x07\x52"
+ "\x19\xfe\x0a\xbf\xe3\xdd\xf3\x56\xb3\x14\x9c\x3f\xe0\xac\xc4\xf6"
+ "\x98\xc8\x7f\x75\x52\x01\x4b\x89\xac\xfb\x91\x8d\xb9\xab\xae\x4f"
+ "\xf9\x45\xb6\xed\xc1\x55\xb9\x8f\x6c\x58\x99\x9b\xcd\x96\x48\x53"
+ "\x10\xe1\x8e\x7e\x23\xec\x40\x36\xac\xca\xcb\xb1\x3d\xf0\x68\x6e"
+ "\x6e\xf6\x9a\x3c\xdb\x5d\xb7\xa7\x7d\xdf\x27\xe9\x6e\xeb\x5e\x9c"
+ "\xf5\x48\xbb\xc0\xde\x18\xfe\xdc\xb5\x03\xe5\x88\xaf\xb5\xe5\x8e"
+ "\xe5\xe6\xc0\x12\x9b\x8c\x73\xd4\xbb\x02\xb6\xb8\xbc\x28\xbd\x5a"
+ "\xf2\xa9\xbd\xf7\x4a\x79\x6a\xd8\x2e\xef\xd1\xf5\x4a\x3f\x80\x7d"
+ "\x4b\xa6\xc9\x35\xf5\xf7\x9b\xa3\x1c\x0c\xcf\x8f\xe0\xd9\xec\x60"
+ "\x25\xae\xa9\x38\x0f\xff\xbb\xf0\xd1\xc8\x77\x2f\x55\xf4\x7c\x7a"
+ "\x1e\xed\xbb\xf0\x3b\x5d\x0b\xbf\xba\xce\x9e\x2c\x82\xcf\xe4\x41"
+ "\xe7\xdf\x97\x7b\x0c\x9e\x66\x8d\x47\xe8\x96\x36\x88\xbd\x2b\xe0"
+ "\xa3\x93\x3f\x77\xf9\x80\x56\x4f\x29\xb5\x77\x11\xe5\x2d\xf6\xb0"
+ "\x1e\x93\x66\xab\x38\xa3\x43\xeb\x97\xb4\xa9\xe8\x59\x2f\x6d\x2a"
+ "\xfe\xbe\x37\xe2\x2e\xbc\xf0\x35\x81\xbd\x51\xe3\x49\x07\xb5\xfa"
+ "\x9a\x75\x9a\x40\xf9\x8f\x12\x5f\x57\x7d\xe1\xb4\xf0\xef\x52\xfe"
+ "\x19\xe1\x7b\xa9\xf7\x8e\x91\x3e\x4d\x74\xb8\x59\x7f\x23\x75\xf1"
+ "\x12\xae\x34\x86\x43\x12\x4e\x22\x7d\x5a\x0f\xbd\xa3\x9c\x87\xf5"
+ "\x4e\x1b\x8d\x5f\xa1\x19\xbf\x73\xcd\x03\x6b\x1f\x71\xac\xcc\x5b"
+ "\x75\xff\xaa\xd5\xab\xf2\x36\x8a\x2b\xfb\xc9\xe2\xbf\x7f\x9a\x95"
+ "\xb5\x7c\xb4\xff\x79\x3b\x74\x32\x9a\xdf\x6a\x1f\x6c\x20\xa4\x5e"
+ "\xac\xf7\xbb\x80\x93\xdd\x7a\x61\xe3\xec\x15\x7d\xad\x11\x7e\x3c"
+ "\x4e\x31\x8f\xe2\xdf\xa7\x9d\x8f\xf4\x6a\x73\x25\xbe\xf7\xc5\x2d"
+ "\x6a\xb3\x4d\x65\x0b\x3b\x98\xb7\x01\xe7\x62\x04\x6f\x1b\xf6\xcf"
+ "\xb2\x4d\xd8\xe7\xda\xd8\x91\x00\xed\xa5\xe2\xac\xfc\x74\x3c\x60"
+ "\x06\x1e\x92\x60\xb4\xb7\x83\x9d\x7a\x54\xc0\xe2\x8c\x75\xaf\xf0"
+ "\xcd\x71\xc6\xfa\x1b\xe0\x22\xfa\xac\xf2\xf4\xdd\x9c\xa7\xef\x52"
+ "\xcf\xe4\xec\xe6\x67\x72\x76\x85\x7d\x5f\x9e\xf2\x50\xd9\x03\x54"
+ "\xf6\x04\x62\x5b\x95\x9f\x66\x07\x40\x27\xf1\x6e\xce\xb3\x90\x6c"
+ "\x38\xc7\x8a\xfe\xb8\xbd\x29\x4c\xde\xd7\x3f\xe5\x71\xfb\x6e\x60"
+ "\xc4\x7b\xda\xc4\xfd\x50\x71\xbe\x47\xfc\x21\x95\x73\x53\xbf\xdc"
+ "\xde\x21\xc8\xd0\x56\x95\x78\x44\x0f\x3b\x65\xa1\xfd\x36\x1d\xf5"
+ "\x62\xcc\x7b\x08\x27\x61\xa7\x41\x63\x27\x3e\xa6\xa7\x46\xbb\x1b"
+ "\xdc\x59\x46\xe9\x80\xc1\xc8\xf9\x3f\x3d\x13\xf3\x48\x30\xfe\x3f"
+ "\x61\x1c\x38\x2d\x7c\x44\x2d\xed\xe4\x5f\xf3\x92\x8e\x62\x39\xdf"
+ "\xa7\xef\xd4\xd2\xce\x84\xfd\x05\x9c\xbe\x97\xde\x87\xe9\x4f\xe5"
+ "\x25\xdf\xd4\x47\x9c\x4d\xe3\x9b\xf0\xe9\x05\xbb\x13\xc7\x26\x76"
+ "\x05\x95\x7f\x52\xe2\xde\x37\x75\xde\xa2\x9c\x28\x2a\x13\xc4\xfd"
+ "\x56\x0d\xbe\xaf\xb9\xb7\x9d\xd6\x6d\x3d\xa8\x4f\x67\x7e\xe2\x7a"
+ "\x30\xc0\x44\xfc\xfa\xce\x80\xb0\x87\xd4\x7c\x44\x28\xaa\xb3\x17"
+ "\xf6\x6a\xf0\xaf\x16\xb7\x67\xb2\x8c\xfd\x30\xe8\x3c\xdd\x19\xb2"
+ "\x49\x8a\x93\x3c\x23\xf8\x36\xc4\xf4\xc3\xfa\x01\x0f\x88\x3e\x61"
+ "\xfd\x50\xdd\x16\x9c\x73\xcb\x75\x74\x66\xda\x7f\x6f\x1d\x9d\x11"
+ "\x38\x4f\xfd\x3e\xc8\x0d\x45\x7c\x5e\x29\xcb\x14\x76\x08\x01\x1f"
+ "\xee\x25\x1b\x69\xef\xc9\x92\x34\xc9\x5b\x26\x6c\x55\xd6\xf7\x22"
+ "\x9e\x71\x71\xdd\x10\x8b\x53\x4b\x7c\x39\xe0\xd5\x8f\x14\x08\xfb"
+ "\x0d\x13\x95\x3b\x08\xfb\x0e\xd8\x18\x26\x88\x98\x91\x9f\xb2\xba"
+ "\x7e\x66\xec\x64\x67\x6a\x70\x9e\x14\x86\xf5\x99\xef\x70\x7e\xc8"
+ "\x77\x1e\xb7\x9a\x0b\x0c\x25\xa8\x43\x1d\x38\xb5\x40\x2f\x87\xd8"
+ "\xe4\x28\xd7\xc1\xce\x7c\x26\xca\x21\xaf\xf0\x25\x62\x59\x41\xbc"
+ "\x5a\x26\xf2\x07\xe8\xbd\x56\xb5\xa4\x71\xda\x53\x82\xeb\x03\x07"
+ "\xe9\xdb\x72\xb5\xd4\x6e\xa1\xb4\x74\x71\x8e\x31\x6c\xc5\xf9\x26"
+ "\xe1\x9c\xe2\x75\x7b\xbe\x75\x89\xfe\xe0\xae\x72\x1e\xed\xbf\x42"
+ "\xb6\xf1\x5e\x5d\x7b\x92\x19\x1d\x0f\x62\x3e\xbd\xd2\x07\xf0\x69"
+ "\xdd\x1f\x9f\xf7\xad\xbe\x9d\x27\xd3\xfb\x08\x5f\x7d\x06\x13\x3b"
+ "\x6c\xf5\x63\xdf\x6f\x3b\x6c\x1d\xa2\xf9\xf1\x6e\x23\x7a\x59\x22"
+ "\xf9\x6a\x6f\x68\x6d\x02\x47\xa3\xac\x96\x22\xfa\xbe\x57\xb7\x69"
+ "\x02\x9e\x96\x0a\x1f\xef\x67\x0a\x00\x37\xc2\xed\xf9\x47\x56\x87"
+ "\x7d\x2c\xf7\xc9\x7b\x7d\x16\x2a\x13\xba\xff\x1b\x1c\x50\x5b\xa8"
+ "\x1f\xf0\x45\x93\x1f\x5c\xaf\x1e\xc3\xf9\xfb\xdd\xfd\x2a\xc7\x9d"
+ "\x07\xdc\x5f\x81\xec\xb4\x2c\x9f\xf7\x41\x16\xc4\x5d\x31\x9c\xbd"
+ "\xe3\x2e\x7d\x78\x9d\x7c\x97\xa4\xdf\xa9\xc7\x1a\x41\x1f\x70\x1f"
+ "\xac\xfc\x21\xb1\x4e\x61\x03\x1b\x27\xce\x1f\xa2\x1e\x3e\x79\xb7"
+ "\x8f\xea\x3c\x2d\xce\xcd\xfa\x6a\xb5\x7a\xe0\x33\x8b\xea\xc8\xd1"
+ "\xeb\x50\x61\x3f\x9c\x2b\xec\xf7\x3c\xb2\xbc\xb4\x35\xba\xdb\xa7"
+ "\x8a\x7b\x3c\x28\x2f\x6d\x80\xbe\xab\x09\xd9\xa0\x8a\xbb\x35\xdf"
+ "\x1d\xd0\x6d\xcc\xe8\x39\x74\xff\x0b\x30\xed\x2b\x9d\x63\xf5\x11"
+ "\x7d\xf0\x95\xce\x4e\xa7\x6f\x44\xff\x4f\xb6\x9d\x57\x1f\x02\x3f"
+ "\x0a\x8f\x32\x83\x1a\xeb\xab\x82\x8f\x0c\x58\xdb\x4b\xbb\xf7\xb3"
+ "\x37\x69\xfe\x32\xa2\x4e\xb3\xef\xbe\x0b\x9f\xc3\x07\x35\x1d\xf2"
+ "\xd9\x15\x52\x86\x39\xbb\x42\xe8\x90\xcb\xe7\xb0\x97\x36\xf9\x0d"
+ "\x07\x37\x79\x0c\xd2\x1e\xef\x6c\x9a\x87\x0d\x6d\x0b\xdb\x82\x9e"
+ "\xb5\xa0\xae\xb1\xfd\x8a\x0c\x15\xcb\x3a\xfb\x84\xff\x90\xb0\x4e"
+ "\xa0\x4f\xdc\x7f\xc2\x99\xb9\x0a\xfe\x31\x21\xda\x02\x1b\x29\xb7"
+ "\xe3\x2c\x74\xc9\xd1\x52\x3f\x21\xf3\x68\x76\x9e\x17\xf7\x8c\x7c"
+ "\x9f\x8c\x77\x09\xb3\xb3\x1e\xfd\x5c\xaa\xdc\xa0\x22\xfe\x20\x2f"
+ "\xaa\x27\x7a\xe9\xf0\x09\x3f\x0d\x6e\xe2\x47\xa9\x0d\xee\xc8\xc5"
+ "\x5d\xca\xbe\x4b\xe0\xbf\x41\xae\xcd\xbe\x1d\xa2\x4f\xce\x5b\x79"
+ "\x11\x64\x32\x2f\x62\x1d\x9d\x65\x94\x6f\x12\xe5\xbb\xad\xa9\xa0"
+ "\x17\x36\x66\x2b\x10\xc7\xb6\x53\x6b\xdb\x1b\x33\x54\x7c\x55\x1c"
+ "\xcb\x1c\x74\xf6\x2d\xf7\xb0\xa6\x9a\x0b\xa7\x1b\x7d\xcb\xcf\xc7"
+ "\x9f\x4b\x7e\x31\x95\x8d\x27\xe3\x43\x87\x73\x1d\xb5\x7f\x17\x47"
+ "\xff\x7d\xb7\x05\x0c\x7e\x36\x6c\x98\xc8\xaf\x2d\xce\x67\x01\xe7"
+ "\x44\x1e\xdc\x44\xf3\xd5\x67\x25\x19\xb0\x85\xb5\x4a\xbb\x1b\xd8"
+ "\x0e\x98\x0b\x7d\xfc\xac\x3b\xd0\x80\x33\x04\x2f\xcd\x15\xd1\x2d"
+ "\xdf\x8f\xdc\x81\xb7\x18\xec\xbb\x41\x6f\x3a\x98\x6f\x16\xfa\x75"
+ "\x9d\xa3\x98\xcd\x3d\x8d\xef\x7d\x9d\x72\xcf\xf7\xa5\x6a\xbf\x16"
+ "\xf8\x07\x8e\xec\xd3\x3f\x3d\xba\xe6\x01\x38\x99\x9e\xbb\x34\x7b"
+ "\x7d\xf6\x6a\xdb\x4f\xe1\x82\x7a\xb4\xdd\x68\x38\xce\x61\x7f\x1c"
+ "\xf6\x57\xf0\xef\x88\x77\x78\xbe\x58\x87\x7a\x9c\x43\x5a\x73\x49"
+ "\xd0\x79\xff\x6f\xc6\x3a\xd4\xf9\x73\xc4\x39\x0c\x9f\xff\xf4\xb7"
+ "\x84\xd6\x80\xfa\xce\x20\xde\xc5\x9e\xee\xf4\x2d\xc5\x3a\x92\xfb"
+ "\x4b\xff\xe2\x48\x5f\x45\x92\x3f\x53\xbc\x94\xbe\x42\xbf\xf3\x4a"
+ "\xb8\x18\x47\xef\xab\xc3\x77\x6c\xfa\xf3\x69\xbe\x1b\xe5\xfa\x15"
+ "\x79\x4b\x74\x3b\x09\x2d\xa6\xbd\xb0\xeb\x50\xb7\xdf\x54\x20\x75"
+ "\x93\xfd\x65\xb5\xea\x44\x93\x3c\x17\xeb\x6f\xd0\xef\x70\xc9\xb5"
+ "\xf9\x8e\xb6\x36\xfb\x5b\xce\x67\xcb\x12\x5e\x1b\x03\xa6\xf0\xba"
+ "\xfe\x5a\x2b\x3b\x60\xfa\x21\x3b\x18\x4d\x46\xbc\xa4\x87\xf9\xa7"
+ "\x43\x5f\x29\xef\x6c\xfb\x85\x7f\x21\xe9\x8f\x63\xf0\xb8\xf6\x4c"
+ "\x6d\x0c\x7e\xa8\x3d\x5f\x4e\xcf\xaf\x69\xcf\xc4\x2f\x0e\x3e\xaf"
+ "\x3d\xd3\x9a\x1d\xdc\xa2\x3d\x27\xd2\xf3\x2a\xed\x99\xf6\x8e\xc1"
+ "\x9f\x68\xcf\x53\xe8\xf9\x47\xda\xf3\x65\xf4\x3c\x53\x7b\xa6\x35"
+ "\x38\x28\xce\x0c\xa8\xef\x26\xea\x7b\xff\x85\xcb\xac\x03\x2e\x79"
+ "\x6e\x3d\xc8\x88\x1f\xac\x92\x7b\x4f\x28\x2d\x91\x70\x3a\x4b\x87"
+ "\x2f\xa5\x37\xa2\x1d\x4a\x4f\xf6\x30\x4f\x5b\x44\xba\xe6\xbf\x6d"
+ "\x70\xb1\x87\x7d\xe7\x89\x48\xaf\xd1\xd2\x57\x90\xcc\xed\x8b\x48"
+ "\xaf\xd4\xd2\xf3\x88\x2e\xe6\x44\xa4\x6f\xd3\xd2\x4b\x3d\xec\xbf"
+ "\x8c\x11\xe9\xf9\x5a\xfa\x5e\xdd\x86\x47\x4b\x5f\xad\xa5\x1f\xf2"
+ "\xb0\x4f\x1b\x22\xd2\x33\xb5\x74\xa2\xff\xfd\xed\x11\xe9\x82\xae"
+ "\x48\x9f\xec\x66\x7e\xb8\x00\x6b\x6b\xd0\xef\x61\xed\x7b\x23\xf2"
+ "\x2c\x91\x65\xfd\x24\x4b\xfe\xad\x25\x22\x7d\xa1\x96\x6e\xf7\x28"
+ "\x73\x22\xeb\x4c\x19\x8f\x56\x29\xd5\x2c\x73\x3c\xbd\x3e\x64\x20"
+ "\x61\xcb\x2c\xf8\xec\x73\xd9\xb8\x13\x66\xde\xc3\x3b\x6c\x85\x9c"
+ "\x77\xb0\x73\x4b\x35\xdb\xdd\x74\xd8\x51\xca\xfb\x75\xe7\xe6\x6b"
+ "\xbe\x15\xbc\xe2\xce\xdd\x26\xa4\xf9\xdf\x14\xfa\x99\xfc\x62\xe9"
+ "\x2f\x5c\x8f\x3d\x03\xfd\x96\x76\xf6\x4f\x79\xe0\x2b\x16\xb6\xe0"
+ "\xbd\xd0\x81\xbb\xf3\x86\xa4\x2f\x79\x92\x83\x91\x06\x3d\x0f\xe0"
+ "\x11\xa9\xcf\x92\x74\xff\x5c\xb6\x3a\x84\x7b\xad\x52\x17\x86\xb5"
+ "\x88\xfc\xb0\x57\x8b\xcc\xeb\x61\xe7\x84\x5f\x8a\x28\xeb\xa4\xbf"
+ "\x0e\x3a\xcf\x2d\x0e\xdf\x27\xf2\xd7\x68\xe9\x9f\x51\xfa\x8a\x88"
+ "\xf4\x92\x71\x69\x3b\xd1\x41\x6e\x3a\x9e\x39\x3c\xc0\x7d\x81\x01"
+ "\xee\x2f\xff\x8a\xfa\xfd\xa0\xb0\x11\xbc\x22\x58\x72\xdc\x81\xfb"
+ "\x36\x88\x11\x1b\x58\xcf\xbd\xb0\x89\xa4\xf4\x8b\xee\xf6\x79\x89"
+ "\xc7\x18\xe4\x65\xf7\xc3\xfe\xb5\x9f\xe1\x6c\xb6\xa8\x17\xf1\x06"
+ "\xcd\x1c\xf7\xb8\x37\x9f\x62\x71\xb8\x8f\x53\xfb\x20\xbe\x7f\xc9"
+ "\xee\xca\xf1\xb2\x23\x39\x41\x56\x4b\x75\xef\xb9\x5f\xe7\x2f\xce"
+ "\x05\xc2\x77\x85\x8f\x43\xce\xbf\xa2\x48\xc4\xc4\x1e\x12\xbe\xca"
+ "\xcd\x5b\x60\x53\xb0\xc8\xcf\xdf\x03\x6f\x3c\xdb\x66\xde\xc2\x6c"
+ "\xb4\xb7\x2f\xa0\x67\x8b\xfc\xa3\x6f\x94\x3e\xde\x98\xe4\x5a\x1e"
+ "\xca\x93\x72\xf7\x71\x8f\xa4\x17\x43\x79\xfc\x45\xdc\x3f\x19\xca"
+ "\xa7\xb2\x7e\x6f\xfc\xec\x31\xef\xe5\x6c\xde\xc3\x0c\xc3\x3b\x89"
+ "\x37\x39\xdd\x68\x90\xf4\x69\x38\x4b\x35\x98\xb6\x40\xd7\x2e\xe2"
+ "\xe1\xee\xf4\xed\x3d\xb0\xc6\x6f\x38\xb2\xa9\x93\x3d\x76\x19\xb3"
+ "\xae\xf0\x1b\x28\xcf\xd0\x89\x84\x3c\xf8\x3d\x9f\x03\x3f\x11\x86"
+ "\xd7\xe9\xfb\xdb\x6b\x1a\x0d\x01\xc1\xaf\x0c\x67\x09\xfd\x6c\x89"
+ "\x2f\x1f\x7b\x88\xbb\x3d\x08\x5e\x3c\x8e\x78\xf1\x1c\xa2\xff\xa6"
+ "\xe0\x86\x9c\xc9\x81\x75\x39\x17\xed\xc9\x65\x71\xc1\x75\xf6\xc4"
+ "\xa7\x07\xd8\x02\x7d\xff\xd9\xb3\x9e\xf6\x94\x41\x6b\x6c\x05\xed"
+ "\x29\xd0\xfb\x24\x28\x16\x71\x0e\x8d\x67\xd5\xf0\x95\xa5\x76\xfd"
+ "\xf9\x63\x7b\x07\x37\xd8\x85\xbf\x09\xf4\x65\xac\xb1\x96\xee\x62"
+ "\xc6\xa0\x76\x2f\xb5\xf0\x04\x9b\x42\xfc\xb3\x21\xa1\x9f\xbb\x7a"
+ "\x56\x33\x03\xe2\x21\x17\x66\x0b\xdd\xea\x84\x23\x39\x01\xe6\xce"
+ "\xff\x82\x15\xe6\x62\x8e\x86\xdf\x04\x9f\x06\x7b\x66\xca\x6f\xe9"
+ "\x61\xc3\x1f\x9a\xfd\xb4\x67\xf8\x89\x27\x7f\x08\x72\xf1\xf0\x97"
+ "\xd2\xbf\x45\xc0\x86\x7b\xa4\xae\xdc\x45\x48\x3b\x57\x74\x42\xd8"
+ "\x0d\xad\x90\x6b\x6b\xf8\x28\xde\x8b\x70\x4f\x36\xf6\xdc\xde\x57"
+ "\x86\xfc\x13\xa4\xfe\x6e\xf8\x33\xb9\x3f\xcc\xf6\x4a\xd9\x6e\xf8"
+ "\xe8\x78\xb8\xab\x96\x9c\x28\xe6\x88\x05\x59\x03\xfe\x95\x7b\xc4"
+ "\x19\x3f\x7c\x06\xe4\xdf\xea\xe2\x44\xee\xa4\x2f\xa3\xc0\xf3\xea"
+ "\x8e\x13\xc5\xd2\x87\x64\x40\xde\xcd\x87\xbe\x7f\xc7\x89\x4a\x71"
+ "\xbe\xb1\xe3\x44\xbd\xd0\xf7\xef\x38\x71\x70\xeb\x54\xdc\x27\x08"
+ "\x54\xf7\xc5\x9c\x70\xd1\xef\xea\xbe\x58\xb5\x79\xdc\xfd\xa8\xa4"
+ "\xe3\xa0\xed\x0a\x96\x88\x73\xa6\x8c\xa0\xf4\xc5\x2a\xd7\x70\xb0"
+ "\x86\xef\x10\xdf\x66\x74\x38\x58\x94\xf4\x77\x1c\x38\x39\xaf\x86"
+ "\xd9\xa8\xaf\xf1\xdc\x74\x22\x53\xd8\x3d\x96\x9c\x70\xb8\x7b\x11"
+ "\xa7\x2a\xc8\xe4\x79\x60\x70\x1f\x8f\x39\x91\x29\xf3\x07\x7f\xd4"
+ "\xda\x4b\x63\x30\x9d\x48\x71\xfb\x4f\x69\x3c\x61\x70\x01\xf5\x31"
+ "\x85\x97\x9c\x48\x95\xf7\xcd\x83\x3b\x74\xba\x2a\x71\x34\xb8\x59"
+ "\xe2\x7a\xc7\x41\x09\xb7\xe0\x3e\x6d\xbf\x9a\x81\x67\xda\xbb\x53"
+ "\xa4\xfd\x4a\x30\x4f\xe7\x91\x3d\x5a\x1e\x94\xa1\x67\xcd\xcf\x67"
+ "\xb0\x8a\xc6\x9e\xac\x7d\x5f\x80\x34\x1a\x1f\xed\x59\x81\x36\x8c"
+ "\x6b\x3c\xda\x2a\x60\x51\xc0\xa2\xa8\xcf\x69\xb0\xf5\x06\x9f\xe2"
+ "\xf6\xdd\xea\x72\x8b\x39\xe0\xd7\xc3\xb6\x1f\xed\xc0\xdf\x10\xe8"
+ "\x26\xd5\x69\x44\x7d\xe1\xfe\xab\x97\xe8\x7d\x41\x7b\xf8\x46\x63"
+ "\x4d\x11\x72\x35\x8d\x19\x79\x30\xaf\x5d\x0e\xe8\xfd\xfa\x09\x66"
+ "\xb0\xa1\xe3\xa9\x80\x89\x84\x19\x9f\xa6\xc9\xf4\xda\x3c\xf0\x49"
+ "\x23\xe1\x21\xdf\x55\x13\xd1\x86\x5c\xd8\x52\xf1\x54\x0d\x7e\x5a"
+ "\x8c\x15\x55\xf8\xa2\x95\xdf\xd4\x5f\x47\x94\x9d\x1e\xca\x4b\xfd"
+ "\x06\x6f\x04\xbb\x04\x9c\x53\x49\x7c\x55\xdb\x22\xca\xb5\x65\x7c"
+ "\x47\x3c\x32\xf1\x90\x5b\x9f\x15\x31\x2b\x53\x06\x9d\x6a\x67\x18"
+ "\xde\xb2\x9e\x31\xda\xb8\x42\x6f\xc3\xc3\xd4\xbd\x7a\x3f\xe9\x59"
+ "\xdb\x83\xb9\x3d\x3c\x27\xea\x12\xbd\x1c\x74\x3a\x34\x47\x3e\xc4"
+ "\x8f\x1d\x27\x2e\x86\xe2\x26\xa8\xb4\x06\x6e\x75\x09\x7c\x64\xbc"
+ "\x1e\xba\x4b\x82\x6b\x9a\xc4\x21\xbe\x4d\xee\x85\xbc\x1e\x75\xe2"
+ "\xac\x51\xfa\x1b\xe5\xd5\x54\xaf\x76\x67\x89\x1f\xd0\xfa\x40\xf2"
+ "\x5f\x60\xef\x68\xb9\x6e\xd1\xca\x2c\x5b\xda\xf5\xe2\xce\xed\xdc"
+ "\x47\x1d\xb8\x4e\x9b\x15\x7e\x19\xc9\x73\x5b\xc2\x3e\xce\x10\x8b"
+ "\x5a\xf3\x71\x56\x32\xb4\x57\xc0\x5f\x61\x8b\xf9\x00\xaf\xc2\xdd"
+ "\x11\xbe\x9e\x57\x97\xd3\x1c\x16\xf5\xb3\x4b\x11\x17\xbb\xd0\xc1"
+ "\xbf\x85\xff\x3b\xa2\x97\x4d\x44\x3f\x9a\x0b\xfb\xd9\x44\xd8\x25"
+ "\x81\xfe\xc0\xee\x99\xc7\x50\xfa\x0e\x5f\x73\xe8\x1e\x9e\x62\x5c"
+ "\x88\xbb\xa3\xbc\x28\xdd\x40\xf9\x8f\x01\x1f\x60\xa3\xde\xa5\x18"
+ "\xa7\x51\xbe\x63\xf4\x2d\xaf\x0c\xed\x98\xfa\x6d\x41\xd3\x50\x41"
+ "\xd1\x29\x16\x2d\x62\x1c\xe6\xfb\xa1\x53\x33\x74\x28\xec\xd7\x3c"
+ "\xa6\xdf\x46\xe9\x09\x22\xdd\x4f\x6d\xef\xe8\xb7\xd1\xb7\x04\xfa"
+ "\x76\x9c\x7e\x55\xaa\x23\xbf\x9c\xfa\x5d\x78\x8a\x5d\x41\x7d\xe9"
+ "\xe6\x25\xfd\x36\xea\x67\x57\xd1\x23\x6c\x4a\xab\xa3\x1b\xf2\x1d"
+ "\xd5\xe7\x91\xb1\x1b\xa9\x6c\x87\xa2\xdc\x44\xe3\xca\x87\x4e\x84"
+ "\x7e\x0b\xca\xe8\xb7\x30\xc8\x12\x0a\x37\xd3\xbe\xb7\x99\xda\xc7"
+ "\xbd\x56\xaa\x07\x3e\x48\x64\x5f\x68\x6c\xd0\xab\x51\xbd\x9b\x7b"
+ "\x79\x17\xd5\xdd\x7d\xa4\x97\xea\xcb\x6f\x0f\xd5\xa9\xf1\xd4\x33"
+ "\x68\xbc\x97\xf0\x9d\xaa\x87\xfa\x54\x0d\xdb\x6d\x4a\xb3\x50\x9a"
+ "\x25\xc4\x0f\x2b\xc6\x49\xda\x73\x4c\x28\x6f\x51\x3a\x2b\x3c\xc7"
+ "\x84\x0d\xb5\x6d\x43\x14\xeb\x50\xa2\xea\xe1\x07\x2b\x5c\xa7\x61"
+ "\x3a\xea\x2b\xa5\xfa\x8a\xb2\x59\x0c\xd1\x6a\x13\xf5\x11\x31\xa2"
+ "\x8f\x0b\x38\x61\x8d\x29\x86\x69\x34\x96\x4a\x8c\x49\xa5\xb9\x2b"
+ "\xa3\xf5\x40\xe3\x51\x68\x3c\x31\x9b\x83\xa1\xbb\xba\x18\xd3\x24"
+ "\xc8\x73\x18\x97\x9c\xc7\xfe\x85\x34\xae\xc5\x9b\x73\xf8\x71\x1a"
+ "\x5b\xf7\x91\x9c\x76\x46\x7b\x8f\xb9\xd5\xd1\x86\x3b\x14\xc7\x25"
+ "\xdc\xba\x61\x83\xba\x90\xc6\xb9\x38\xe4\xab\x57\x89\x7a\x9e\xfa"
+ "\xde\x4d\xfd\x2a\xd5\xc6\x89\xb4\xaa\x10\x4f\xaf\x44\x3d\xa3\x3d"
+ "\xc7\x86\xf2\x7e\x7f\x9c\xa6\x88\x71\x52\x79\xe3\xcd\xa8\x4f\x1b"
+ "\x67\x2c\x8d\x33\xe6\xfb\xe3\x24\x7c\x5a\xcf\xb7\x69\xe3\x2c\xd1"
+ "\xc6\x69\xa0\x71\xc6\xd2\x38\xa7\x46\x8c\x73\xf2\xa8\x71\xa6\xd2"
+ "\x38\x97\xd0\x38\x3b\x22\xc6\x69\x19\x63\x9c\xa9\x1e\xb4\xb1\xa3"
+ "\x7f\x89\xf4\x0f\xc6\x1b\xc5\xfd\xf7\xed\x51\xa1\xfb\xef\x2a\xee"
+ "\x5d\x0e\x08\x1f\x44\x0d\xd0\xdf\x40\x6f\x04\x59\x0f\x77\x3c\x33"
+ "\x36\x96\x14\x0b\xdd\xcd\x14\xa9\x9b\x16\xfc\xd5\xf6\xa8\x15\xa1"
+ "\xbb\x1b\xcf\x8a\xd8\x35\x3e\xa4\x0b\x9f\x01\xb9\x4c\xe8\x1e\x97"
+ "\x6d\xdc\x50\x84\xf2\x28\x4b\xf9\x4b\x43\x77\xcc\x14\x83\x43\xea"
+ "\x43\xd5\x6e\x3c\xc3\x17\x96\x3c\x13\xe0\xcd\xe2\x4c\x60\x7b\x54"
+ "\x38\xfe\xd3\x7a\xde\x04\xb8\x88\xfb\xac\xe2\x3e\x28\x2b\xc9\x08"
+ "\x94\xe8\xf7\xd2\x7b\x29\x6f\x67\xc4\xbd\xf4\x5e\xd1\x87\x21\xe1"
+ "\xfb\x61\xc3\xb2\xc0\x06\x71\x3f\x7d\x70\xbb\xd1\x14\x6e\x5b\x29"
+ "\xd1\xda\xf6\xe0\xd9\x2b\x7d\xb3\x41\xc7\x66\x13\xf6\x36\xdb\x8d"
+ "\xf3\x75\x1b\x17\x8f\xc2\x1c\x58\xcb\x63\xc6\x79\xd9\x6e\x5c\x31"
+ "\xc2\x17\x94\x32\x01\x7e\xde\x91\x9e\x17\xba\x6b\xbe\xdd\x58\xfc"
+ "\x43\x77\xcd\x8b\xbc\x34\x4f\xb4\xde\x1c\x88\x79\xae\x18\x5b\xf8"
+ "\x8e\xa1\x02\x11\x2b\x45\x99\x30\x1d\xfd\xec\x50\x8c\xd8\x3f\xcc"
+ "\xe2\x3c\x48\x31\x7e\xa9\xd1\xe6\xb6\x65\xc1\x80\xd9\x43\x6d\x0a"
+ "\xdf\x52\xa1\x77\xe3\x51\xf8\xca\xa0\xb2\xf1\xc2\xcf\x39\xd5\x37"
+ "\x32\xbf\xf8\x5e\x3c\xea\x3d\x75\xd4\xbb\xcd\x47\x34\x6b\x3c\x5b"
+ "\x9e\xb2\xa9\x42\xc7\x9b\x9f\xb0\x85\x39\x8a\x4e\xb2\x28\xc2\xc5"
+ "\x13\xe8\x5b\x6b\xb7\xb8\xe7\x67\xe6\xce\x14\xe6\xee\x0e\x48\xbe"
+ "\x9d\xf8\xa5\x8e\x24\xca\x73\x92\x4d\xc1\x3d\x13\xc4\x92\xa1\xfc"
+ "\x3d\x22\x7e\x8c\x12\xfd\xc6\x8a\x47\x63\x99\xfa\x8b\xf4\x8b\xb8"
+ "\x61\x13\x78\x23\xd3\xcb\x43\x1e\xc4\x60\x51\x0a\x9f\x67\xd3\x40"
+ "\xa7\x08\x87\x3b\xb9\xe1\xb1\x83\x54\xa6\xf7\xa5\xa1\xee\x09\xee"
+ "\xc0\x17\xcc\x41\xf4\xb3\x47\x89\xde\x67\x2c\x60\xc6\x8a\x2e\x66"
+ "\x21\x3c\x0b\x1c\x0e\x2c\x60\xba\xaf\x87\x9a\xc9\xd2\x87\x40\x0d"
+ "\xe1\xe4\x3a\x2b\xf7\x0f\x6e\x8f\x36\x92\x5c\x5b\xac\xeb\x2f\x4a"
+ "\xa5\xaf\x37\x23\xb5\xff\x4b\xe1\x97\x42\xf2\x07\x04\xdb\xe8\xdb"
+ "\xe4\x3d\xd3\xc4\x5f\x50\x99\x05\x21\xd9\x46\x89\x6e\x92\x30\x1c"
+ "\xaa\x97\xfb\x48\x74\xd3\x61\x92\x8e\xb6\x49\x9b\xa8\x44\xca\x9b"
+ "\x15\xb2\x89\x82\x4e\x90\xbe\xd3\x1c\xd6\x4b\xb9\x67\xa8\x3e\x23"
+ "\x68\xd2\xd6\x38\xd2\x8f\xa7\xa0\x2c\x95\x33\x8b\x38\x97\xdb\xa3"
+ "\xeb\xc3\xb8\x16\x9d\x83\xfd\x94\xc6\x14\x47\xf3\x7a\x0c\xe3\x02"
+ "\x4c\x7c\xf0\xeb\xa6\x4c\xf0\x1c\xde\x3b\x4e\x1c\x24\xd3\x71\x4f"
+ "\x40\xe8\x97\x66\xfb\x09\x9f\x4e\xd1\x1c\x5c\x0c\xdf\x56\x6e\x6a"
+ "\xe7\x48\xed\x10\x3b\x62\xed\x63\xad\xf4\x8c\xbb\x0f\xae\x87\xbe"
+ "\x61\x9d\xb6\xb1\xf7\x72\xe2\x07\x32\xa9\xcf\x0e\xd4\x05\x5a\x03"
+ "\x7b\x51\xf8\x20\x6c\xf5\x52\x5d\x9d\x4c\xd4\x71\x44\xed\x66\x47"
+ "\xf2\x8f\x43\xb7\xed\x6f\xad\xfd\x82\xb5\x5a\xff\x22\xda\x01\xbf"
+ "\xed\xca\xed\x3b\x5f\xdd\x84\x73\xc7\x2b\xb5\xba\x7b\xa9\xee\xc4"
+ "\xf1\xeb\x9e\x6d\xbb\xc0\xba\x2f\xa0\xdf\xb3\x2d\x17\x52\x77\x51"
+ "\x35\x0f\x12\x1d\x8e\xa7\x3d\x3e\x07\xfe\x59\x71\xc7\x35\x38\x00"
+ "\x9f\x34\x33\x84\xac\xde\xa5\x98\xf6\x80\xde\x08\xfb\x90\x1d\xbe"
+ "\x2c\x71\xff\x15\x7a\x76\xed\xde\xab\x3b\x70\x82\x41\xef\x3e\xb8"
+ "\xdd\x54\x12\x92\x45\xc3\x67\xe3\x16\x8f\x62\x3a\x20\x6d\xad\x7d"
+ "\x59\x12\xb7\x4c\x2b\x51\xd7\xd8\x32\x67\x7f\x95\xb0\xd9\x57\x4c"
+ "\x27\x74\xfd\x56\x5f\x4c\x7f\x95\x56\x97\x6d\xb4\xde\x54\x73\x24"
+ "\x64\xcb\xce\xcf\xb3\x6d\xc8\x5d\x95\x97\xad\x5f\xd0\x8e\x65\x3f"
+ "\xcd\x7e\x20\x7b\xd5\xfa\xec\x2c\xdb\xf2\x47\x73\xd7\xcc\x5d\xfb"
+ "\xe0\x83\xb6\xbb\xb2\xd7\xad\x5b\xf9\x8b\xec\x58\xb6\x3c\x77\xe5"
+ "\x9a\x75\xab\xa0\xdb\xb4\xd9\x16\xdf\x98\x91\xb3\x36\x6f\xee\x2d"
+ "\x8b\x53\x46\xe9\x36\x71\x5f\xfb\x18\x64\x1c\xda\x9f\xa6\x10\x8f"
+ "\x31\x09\x7e\x89\xcc\x1b\xb9\xeb\x31\x92\xaf\x09\x07\x7b\xb0\x17"
+ "\x62\xff\x81\xec\x05\xff\xc6\xf0\x99\xbc\xfb\x59\xde\xd6\xa5\x5c"
+ "\xbe\x87\xf8\xf6\x76\x4a\x83\x7f\xe2\x63\x7c\xa8\xc8\x2b\xce\xb3"
+ "\x95\xcb\x37\x52\x9e\xa6\x27\x28\xcd\x1b\x33\x54\x5f\xf1\x15\x33"
+ "\x4a\x1e\x23\xc6\xcf\x0d\x13\x79\x29\x7c\x0d\x7f\x63\x65\x9a\x8f"
+ "\x74\x83\xdb\xe3\x87\x0d\x91\x69\x59\xa0\x88\x83\xa6\xca\xf5\x15"
+ "\x73\x4e\xae\xd3\x13\xc5\xe2\x2e\x83\x72\xf9\xcf\x20\x23\x6e\x45"
+ "\xdc\xc5\xed\xb1\x44\xff\x87\x1d\x61\x5a\x7d\xb1\xce\x9b\xb7\x13"
+ "\xdc\x37\x74\xd0\xbb\xf0\xb5\x12\x1d\x3b\x7f\x84\x7d\x98\x12\x97"
+ "\xc8\x94\x4b\x0b\xe4\x1f\x95\x51\x2e\x2d\x91\x7f\x78\x8e\xfc\xbb"
+ "\x7c\xa1\xfc\x1b\x9d\xfe\x3f\xfd\xd3\xdb\xff\x6f\xd7\xe1\xff\x81"
+ "\xbf\x7f\xa0\x7d\x31\xee\xff\x1f\xc7\xff\x3f\x29\x4f\x8b\xe1\x3c"
+ "\x7f\xc0\x37\xc2\xad\x63\x4f\x7c\xc5\x4c\x84\x9f\x55\x65\xf7\x13"
+ "\x4e\x7f\xc9\xac\x05\x01\xde\x59\x74\x2f\x9b\x56\x78\x92\x78\x30"
+ "\xe2\xb5\xf2\xf2\x79\x67\xe1\x00\x3f\x4e\x78\xf3\x09\xe1\x6f\x63"
+ "\x79\x07\x8b\x2b\xeb\x20\x3e\x2b\x4f\xc6\x9e\xc1\x79\x13\xee\x79"
+ "\xb9\xe9\xbd\x65\xbd\x9f\x7d\xec\xfd\x0e\x36\x95\xae\xd6\x4c\xa2"
+ "\x3d\xc7\x18\x03\xfe\xc6\x65\xb2\xc4\x9a\x29\xfc\x10\x77\xbe\x92"
+ "\xc5\x0d\xaf\x2c\xa7\xb4\xa3\xaf\xaa\xa9\x13\x5e\xdd\xd4\x3c\xc1"
+ "\x76\x3f\xf6\xf9\xb8\x37\x35\xdc\xbc\x4d\xdc\x63\xa4\x5f\xe0\xa0"
+ "\xe6\x63\x9a\xf6\xa7\x8b\xdf\x92\x7b\xfa\xc5\x65\x9a\x3e\x0f\xcf"
+ "\xe2\xfe\x06\x8d\xa3\x91\x3b\x37\x1d\x44\x9d\xaf\xa8\x8d\x13\xb0"
+ "\x67\xbe\xba\x29\x75\x42\xc1\x4a\x66\x68\xf5\xf4\xb0\xc3\x44\x0b"
+ "\x71\x3e\x4e\xeb\xee\x00\xad\xb3\x83\x7b\xa6\xf0\x4a\xea\x5f\x29"
+ "\xf1\x73\x25\xd4\xa7\x7d\x83\xdb\xe3\xed\x1e\x65\xa2\x55\xe3\xe5"
+ "\x5c\xb4\x2e\x0e\x94\x51\x9e\x65\x8f\xb2\x19\x65\x94\x8f\x78\xbb"
+ "\x12\xc8\x28\xb2\x7f\x93\x66\x12\x0c\x1a\xa8\xcd\x36\xdb\x7d\x78"
+ "\x4f\x10\x3c\x06\xda\xa6\x71\x90\x1c\x92\x20\x64\x7e\xb4\xa1\xb7"
+ "\x4b\xf5\x97\x50\xfd\x6d\xda\x19\x63\xa5\xac\x27\xbe\x41\xae\x57"
+ "\x1f\xfc\xeb\x1e\xd3\xee\x89\xf5\x96\x6d\xa2\x7d\x7d\x88\xc1\x0f"
+ "\x6e\x15\xb5\xe1\x32\x6f\x61\xdc\x8c\x3b\xc6\xc7\x02\x24\xd7\xa8"
+ "\xd2\x7e\x57\x49\x78\x5e\x2b\x2b\xf8\x10\xc1\x7b\x04\x89\xbf\x17"
+ "\xfa\x19\xe2\x3f\x72\x88\x4e\x10\xcf\x21\xee\x67\x10\xbf\x81\x74"
+ "\x6a\xa3\x8a\xc6\xd5\x46\x72\x73\x03\xed\xdd\x88\x17\x69\xba\xaf"
+ "\xff\x5f\x18\xce\x38\xc0\x2f\xac\xcb\xe7\x7e\x11\x57\x6a\x7b\xc2"
+ "\x7c\x9d\x5f\x00\x7e\x80\x47\x28\xbb\x8f\x19\x87\x69\x8e\x09\x47"
+ "\x9a\x89\xff\x20\x9e\x3e\xc1\xa1\xcd\x4d\xb3\xe0\x0b\xb4\x38\xd2"
+ "\x92\x86\x27\x6c\xa6\xfd\x3d\x8e\xda\x68\xf6\x28\x97\x0b\x58\x48"
+ "\x1a\x94\x50\xaa\xef\xf5\xd0\x39\x78\xa8\x0e\x4e\xb4\x8e\xe0\xd6"
+ "\x90\x9c\xa9\x30\x8f\x12\x7f\x94\xe6\xa2\x01\x79\xa9\xbc\x91\xf2"
+ "\x1f\xa2\x7d\x7f\xa1\x36\x27\xc7\x48\x26\x20\x3e\x20\x61\x31\xfa"
+ "\x41\x65\x5a\x08\xd6\xd4\x96\xc5\xa7\xd1\xb1\xa3\x92\x87\xb1\x7c"
+ "\xa9\xc3\x9e\xe6\x7a\x5b\x18\xfe\x66\x53\x24\xfc\x09\x16\x52\x2e"
+ "\x57\x2c\x3b\x22\xe6\x8e\xe4\x52\x4b\x26\xf4\xd0\xd4\xde\x21\xa1"
+ "\x43\x53\xcc\xb7\xc1\xf7\x1b\xe1\xcc\x21\x82\xc5\x21\xca\xd7\x08"
+ "\xda\xbc\xf5\x2b\xa2\xb9\xf7\x83\x87\xb2\xdc\x29\x79\x54\x73\x37"
+ "\x70\xb8\x4b\x31\x7f\x82\xf7\x4e\x25\x61\x09\xea\xa3\xf7\x37\xe9"
+ "\x97\x78\x59\xf3\x6b\x45\x35\x88\x6f\xdc\xbf\x00\xbe\xd9\xe4\x5c"
+ "\xf7\x2f\xa0\x7e\xd5\xeb\x77\xa0\x80\x03\x98\x7b\x1a\xa3\xd0\x3f"
+ "\x78\x14\x73\x3d\x74\x8d\xa2\xdc\x70\x0e\xfa\x78\x0c\xeb\x53\xff"
+ "\x4e\xe9\xdd\xf0\x99\x1b\x01\x9b\x25\xda\x9c\x34\x8a\x58\xa1\x8a"
+ "\xe5\x36\xd9\x37\xcb\x34\x7a\x37\x51\x1f\xc4\x39\x44\xdf\x70\x4e"
+ "\x54\x05\xca\x14\x86\xcb\x60\xfd\x10\x2e\x9b\xa9\xcc\x8f\xe8\x97"
+ "\xeb\x79\xe1\x37\x9f\xfa\xe1\x7a\x1a\xbe\xcb\x14\x73\x7b\xdf\xb0"
+ "\xdd\x40\xed\xfa\xa9\x5d\x03\x70\x03\x78\xa1\xd7\x51\x21\x61\x74"
+ "\x80\xe6\x4f\xe0\xd7\xe1\x40\x23\xc1\xdd\x42\xfc\xbf\x3f\x5d\xf2"
+ "\x77\x66\x97\xd6\x3f\x97\x38\x1f\x8c\x36\x79\x6b\xa5\x9f\x21\xe4"
+ "\x0b\xc5\x7f\x0d\xf3\x99\x66\xf8\x19\x32\x51\x5d\x2d\x1a\x4e\x98"
+ "\x29\x5f\x5b\x08\x87\xe0\xef\x40\xb1\xa4\x81\xd7\xd4\xfa\x0f\xdc"
+ "\xbb\x53\xc2\x2e\xc1\x0b\x1c\x20\x3e\xbe\x5e\xce\x73\xc2\x12\xf0"
+ "\xaa\x12\x0f\x27\x25\xea\x75\x08\x9f\x09\x04\x67\x95\xea\xd0\x71"
+ "\x25\x92\x36\x50\x5e\x92\x1b\xa3\x43\x78\xa3\xd3\x02\x59\xe7\xe4"
+ "\x8d\x9a\x1e\xd5\x4f\x73\x03\x3f\x26\x2e\xe1\x07\x4b\xe0\xe5\xe4"
+ "\xa5\x87\x7d\x01\xd0\xd7\xa3\xd4\x2f\xa2\x09\x93\xf6\xf7\xc5\xaa"
+ "\xde\x30\x6e\x4f\xaa\xd6\x71\x3b\x62\x5e\x05\x6e\x6f\x13\xf4\x68"
+ "\x52\xa3\x87\xfd\x73\xa7\x8e\xfb\x58\xe7\x2a\xad\xeb\x8a\xf5\xe2"
+ "\x7c\xc0\x0c\x7d\xa0\x58\xf7\xfe\x5e\x21\x63\x60\x3e\x5b\xf3\x3b"
+ "\x85\x8f\xfc\xad\x2a\x33\xb5\xfa\x4e\x40\x3f\xd2\x83\xf5\xaf\xaf"
+ "\x71\xcc\x0d\xb5\xe5\x42\x1c\x83\x6d\x44\x03\xb1\x06\x7d\xd4\x27"
+ "\xfa\x66\x82\x4f\xb8\xa6\x15\xa9\x6c\x1d\xcd\xed\xe1\x4c\xcc\xdb"
+ "\xe4\x05\xfa\x9d\x8b\x0a\x49\x03\xe2\x34\x7c\x11\x7d\x1c\x05\x57"
+ "\xb3\x84\xeb\xe4\xd5\x23\xd7\xb7\x25\x0e\xeb\x3b\x12\xae\x80\x29"
+ "\x60\x4b\x79\x69\xfc\x13\xf3\x74\xb8\x86\x61\x7a\x71\x8c\x86\x8f"
+ "\x1a\x6d\x9d\x3c\x26\x6d\xad\x90\x31\x23\x1a\xb7\x62\x2c\xb4\xa7"
+ "\xa0\x7d\x11\x0f\x4b\x93\x7d\x9a\xbc\xc0\xa9\xc9\x01\x0f\x2b\x48"
+ "\xd5\xe9\x18\xf5\x67\x39\xf0\x09\x73\xa5\xd3\x0e\xe8\xca\x64\xdf"
+ "\x2f\xb6\xeb\xf3\x81\x7e\x47\xd2\x04\xea\x93\xb0\xf7\x0a\x8f\xf9"
+ "\xe2\x9f\x51\xb9\xc9\xa0\x6d\x61\xfe\xea\xe2\x9c\x91\x63\xbf\x38"
+ "\x0d\x63\x07\x4e\x38\xd6\x43\x5f\x26\xf7\x32\x8f\x12\x77\x6c\x24"
+ "\xbd\x8a\xfb\x44\xd8\x65\x68\xfc\x18\xe8\xbd\xe3\x3e\x99\x1f\xfb"
+ "\x1b\xe5\x17\xba\x79\x6d\x3f\x84\x8e\x16\x69\xcd\x1a\x0c\x8e\x51"
+ "\xfe\x26\xdc\xe3\x86\x2f\x9f\x8b\x8e\x49\x59\x90\x68\xf4\x21\xc4"
+ "\xce\xa0\x7c\x25\xad\x24\x07\x04\xa2\x19\xab\xd1\xf8\x4d\xd0\x09"
+ "\xbe\x21\xfd\xa2\x0d\xdd\x2c\xc6\x71\x0b\xff\xa6\x4b\x49\x7c\x9c"
+ "\xd6\x91\x1f\xfe\x32\xa9\x6e\x5b\x97\x72\x69\x36\xb5\x9b\xa8\xfd"
+ "\x5a\xe9\xf7\x2e\xfa\xbd\x8c\x7e\x6f\xa2\xdf\xcb\xe9\x77\x3a\xe5"
+ "\x57\xb5\xfc\x29\xf4\x3e\x81\xd2\x6f\xd4\x7e\xa9\x8f\x89\x38\xcf"
+ "\x4e\x7b\x02\x7c\xe5\x7d\x48\x9f\xf2\x39\xde\xe9\xf7\x43\x6d\xdc"
+ "\x2d\x72\x6d\x27\xee\xa7\x7a\xf2\x91\x0f\xfb\x1a\xa5\x39\x28\x4f"
+ "\x19\xea\x86\x5f\x05\x7a\xbe\x2d\x82\x3f\xa5\x7a\x2e\x79\x84\x7e"
+ "\xe7\xd3\xef\xf5\xf4\x9b\x47\xe5\xe1\xcf\x33\x8d\x60\xd0\x16\xa6"
+ "\x17\x09\x4b\xb2\xf2\xe5\x7c\xd2\x1c\x36\x61\xbd\xeb\xf4\x00\xf8"
+ "\x34\x22\xdf\x0a\x99\x4f\xca\xaf\x97\x24\xe9\x73\x17\x10\x73\x67"
+ "\x6e\x0f\xd0\xdc\x51\xfd\xb7\xa1\x3c\xfd\xde\xae\xfd\xa6\x6a\xbf"
+ "\x77\x68\xbf\xff\xac\xfd\x2e\xd6\x7e\x97\x78\x94\x44\x9f\xc6\x9b"
+ "\x10\xcc\x12\x85\x9e\x9c\xd6\xae\xd6\xee\x14\x3b\xe4\x6b\xa2\xff"
+ "\x37\x21\x8e\x23\xb5\x5b\xa3\xeb\xad\xa1\xfb\x19\xde\x1e\x73\xd1"
+ "\x6e\xa1\xfb\xb9\xa4\x21\x82\x16\x3a\xe2\x94\x54\x46\xbc\x53\x74"
+ "\x8d\x81\xf8\x06\x59\x4f\x9c\x41\x3b\xaf\x47\x3c\x18\xc4\xd5\x84"
+ "\x9f\x42\x21\x47\xc5\xdf\x82\x73\xcf\x63\x42\xa7\xbf\x03\x3e\x8a"
+ "\x86\xf2\xe8\xaf\x98\x64\x8a\x6d\x3a\xbd\x87\xbc\x24\xe5\xfc\x89"
+ "\x7f\x19\xdc\x3e\xc5\x16\x96\xf3\x2f\x69\x93\x67\x9b\x97\xfe\x92"
+ "\xd2\x23\xe4\xff\x4b\x4a\xd1\x67\x82\x75\x3b\x8d\x67\x7e\x87\x32"
+ "\x05\x77\xbd\x6f\xe8\x94\x63\x4e\xd1\xc7\xac\xcd\x95\x43\x87\x79"
+ "\xa7\x92\x18\x20\x7a\x98\x0b\xfc\xee\x08\xd1\xe5\xc4\x00\x7e\x35"
+ "\xfc\xa1\x79\x4e\x7c\x19\xf3\x1d\x41\x4f\x52\xc3\x74\x7a\xca\xa1"
+ "\x91\xf3\x92\x70\x28\x20\xf9\x85\x76\x5a\x97\xc0\x81\x6d\xa3\xd6"
+ "\x65\x1a\xd6\xa5\x56\xd6\x3f\x92\xc6\x5f\x9c\x06\x1a\xaf\xf5\x91"
+ "\xf0\x36\x51\xd8\xe8\x79\x94\x29\xed\xda\x9e\xd4\x4e\x7b\xe4\x4d"
+ "\x94\xbe\x54\xf6\x53\xa6\x6b\x6d\x11\xfe\x25\x2e\x06\xfe\xeb\xe9"
+ "\x1a\x7e\xa3\x9e\x85\x98\x6b\x3d\x5d\xab\x9f\xf0\x34\x71\x3e\xd6"
+ "\x8f\x9e\x2e\x71\x72\x52\x29\xe8\x0d\xca\x06\x84\x2d\x23\xc9\xdf"
+ "\xf7\x35\x51\xbf\x2f\x6d\x24\xfe\xa2\x1e\xeb\x79\xeb\x26\x16\xb7"
+ "\xa1\x9a\xc5\xcb\xb5\x79\xe9\xe7\x7a\x59\xa1\xd3\xdf\x7e\x69\x8b"
+ "\x4e\xa3\x2a\x04\x3d\x9b\x9c\x3a\x92\x56\x4e\x5d\xc5\x9d\xe6\x40"
+ "\xc0\x34\xb4\xfa\x48\x60\xbe\xa0\xb9\xb4\xee\x6b\x06\xb7\x5b\x8d"
+ "\x1e\xf6\x8a\x45\xdb\x4b\x5a\x04\xaf\xa6\x58\x7f\x74\xa4\x5e\xd2"
+ "\x2e\x59\xb7\x35\x44\xff\x22\xf8\x10\x41\xeb\xd1\x16\xea\xa2\x7d"
+ "\xc5\xe2\x2b\x4a\xbf\x48\xd2\x6f\x6b\xba\x87\x5d\x99\xa8\xd3\x56"
+ "\xec\x4f\x66\x85\x39\xca\xef\x93\xfb\x93\x0a\x1d\x98\xc3\x27\xfc"
+ "\xd3\xb5\x3a\x7a\x19\xf6\x4d\xf8\xff\xce\xd8\x18\x0b\x9f\x55\xe9"
+ "\xd4\xd7\xbb\x88\x3f\xdb\xab\x9d\xcd\x90\x9c\x7b\x59\x10\xb2\xac"
+ "\x06\x57\x5a\x4f\x97\x1d\xd7\xe6\xe5\x18\xf5\x67\x2f\x68\xfb\xd6"
+ "\xf5\x32\xa6\x12\xf4\x41\x22\xc6\x17\x78\x56\x2b\xf7\x8b\x58\x06"
+ "\xdb\xad\xdd\x11\x3a\x2e\x6d\xbd\x5d\x7a\x44\xc4\xa8\x28\x19\x5a"
+ "\x2d\xf5\x89\x97\x3d\x2a\xd3\x2f\x4b\x97\x76\x08\xc2\xcf\x28\xde"
+ "\x17\x47\x59\xa7\xfc\x4d\xe8\x5f\xa3\x63\x66\x4b\x7e\xe4\xb2\x05"
+ "\x11\x36\x3f\x02\xd6\xc2\xcf\xf1\xf6\xcb\xd2\xc2\xeb\xe2\x32\xf8"
+ "\x82\x36\x52\xd9\x1e\x4a\xcf\xd1\xd3\xe5\x5e\x93\xb0\x50\xd3\x99"
+ "\x39\x2e\xda\x92\xca\x88\x36\x47\xef\x76\xea\xeb\xf7\xb2\x66\xd1"
+ "\xbe\xb6\x7e\x31\x46\xe0\x03\xd6\x70\x00\x7e\xc5\x68\x0d\x63\x2d"
+ "\xd3\x73\x5e\x40\x5f\xbb\x92\xbf\x13\x77\xce\xe4\xba\xbd\xac\x3d"
+ "\xa2\x1f\x95\x1a\xae\x1e\xeb\x7b\xc0\x1a\x47\xdf\x7c\x1e\xc5\x24"
+ "\xcf\xb2\x14\xab\x94\x31\x76\x74\x1c\x54\x07\xb8\x1f\xba\x69\xe8"
+ "\x13\xa0\xb3\xd1\xec\x55\x71\x56\xe2\x83\xaf\xb4\x4a\x5a\x0f\x61"
+ "\xff\x68\x16\xa6\xfb\x47\x1b\xdc\x3e\x75\x71\x58\x77\x6c\xdd\xab"
+ "\x8d\x6b\x35\xb5\x57\xe3\x2a\x7c\x0f\xb8\xf4\x8c\x5c\x63\xd6\x2a"
+ "\xe0\xb1\x9b\x70\x8f\xf6\x9f\xea\xc3\x05\xa2\x6c\xb1\x8e\x7b\xb4"
+ "\x46\xb3\xba\x94\xcb\x27\x55\x4d\xe1\xd5\x34\xa7\xb0\xdb\x5f\x4d"
+ "\x78\x10\xa4\xdf\x2c\xf9\xab\x58\xf0\xab\xe1\x7c\x35\x95\xa5\xf5"
+ "\x3f\xb3\x51\x9f\x03\x5f\xfc\x6c\x87\xc0\xb1\x42\xd8\x37\xa6\x88"
+ "\xb3\x7e\xe0\x18\xf0\x4b\x9c\xf9\x13\xae\x99\xb7\xfc\x0b\x03\x9e"
+ "\x09\x9f\x29\xf4\x8e\xfe\x02\xcf\x06\xb7\x5f\x6e\xd2\x7d\x1e\x7b"
+ "\x94\xa9\xf2\xbc\x6d\xfb\xe5\xd3\x74\xdb\x70\xe0\x61\xde\x4c\x76"
+ "\x09\xd5\x6f\x6b\xb2\xf9\xa0\x3b\xff\xda\x1d\xb8\x83\x21\x2f\x60"
+ "\x27\xe9\xe5\xa5\x4d\x54\x26\x62\xfe\x13\x84\x2d\xeb\xe1\x15\x42"
+ "\x9f\x79\x31\x7d\x5b\x3d\x92\xe6\xc4\xf8\x05\x5f\x49\xd4\xf1\xaa"
+ "\x44\x86\x73\x7a\xda\x6b\x2e\xaf\xd4\xf9\xe1\x79\x94\x46\x79\xd0"
+ "\x3f\xc8\xe0\x6d\xf4\x5c\x89\x7d\x7a\x1c\xbd\xf3\x7c\xe8\x8a\x40"
+ "\x33\xa0\x7b\x82\x1e\x8c\x60\x7d\xb4\x4b\x99\x31\xe9\x08\xfc\x17"
+ "\xad\xfd\xbe\xdf\xeb\xc2\x7c\xde\x0f\x7f\x5a\xb6\x5c\x76\x71\x87"
+ "\x72\x85\x0f\x7a\xa7\xa2\xef\xa0\xe3\x99\x66\x1d\xa9\xe3\x99\x96"
+ "\xa3\xfd\x15\xd0\x9f\x27\xfc\x37\xdd\xa1\x3d\xf7\x9e\xff\x6f\x7a"
+ "\x89\xcc\x3b\xbd\x8a\xfe\xea\x25\xac\xac\xb4\x56\xa6\x15\xe8\xb0"
+ "\x02\x4d\x01\x8d\x85\x9d\x0d\xd6\xb9\x12\x60\xf0\x97\x44\xf3\x44"
+ "\xfd\xde\x7a\xcd\x4f\x5d\x9b\x20\xd3\x4e\x13\xb1\x0b\xe0\xbf\xf8"
+ "\x82\x6c\xbd\x94\x69\x62\x3e\x85\x7f\x59\x65\x9a\x83\xda\x4e\xac"
+ "\x38\xcd\x8c\x8e\x5c\x36\x1d\x3a\x74\x73\x90\xbb\x20\x03\x03\x27"
+ "\x08\x06\x6d\x3d\xca\xf4\x5f\xe6\x6d\x66\x06\xfa\x3e\x83\x9e\x33"
+ "\x75\x5e\x8a\xca\x58\xa2\xfc\x2c\x11\x3c\xd4\xed\x9b\xd9\x8c\xc1"
+ "\xed\xd3\x17\xea\x73\x05\x3e\x03\x7a\xbc\x50\xbc\x2b\x65\x9a\xb0"
+ "\x05\x80\x2f\x7f\x0f\xe0\xa6\xd3\xaa\xd3\xd0\x5d\x4f\xb7\x47\xf9"
+ "\x98\x45\xee\x43\xd3\x8b\x69\x5e\x53\x25\xbe\x4c\x5f\x4c\xb8\x7f"
+ "\x34\xa2\x9f\xff\x14\xf1\xbc\x1d\xe5\xcd\x3e\xf0\x70\xe3\xc1\x67"
+ "\xfa\x11\x1d\x3e\x15\xc2\x07\x28\x73\x88\xf9\x0e\xf0\x5e\xea\x5b"
+ "\x8b\x63\x13\x33\xf5\x28\x57\xbc\x45\x63\xc4\xdd\xe0\x66\xa9\xe3"
+ "\xbf\xe2\x35\x5d\x4e\x97\xfd\xbe\x62\xb3\x79\x4b\x14\x83\x6e\x1e"
+ "\x3e\x23\x85\x2d\xe6\x19\xab\xd0\xc7\xbb\x03\x0b\x99\xab\xf0\xc7"
+ "\xc8\x73\xa7\xb6\x97\x1d\xeb\x2b\xb2\xb2\xc3\xd6\x85\xb4\x8e\xaf"
+ "\x20\xde\xe6\x9c\xe5\x82\x6d\x5e\x95\x2b\x96\x68\xf0\x6d\x11\xb6"
+ "\x22\xca\x15\x97\x61\x2f\x81\x6e\x80\xf6\x11\xf0\x68\x93\xa9\xee"
+ "\xbd\xfa\xba\xa1\x7d\xa2\x89\xca\x58\x25\x8d\x39\x4e\xbc\xc5\x15"
+ "\x89\xf0\x5b\x23\xe4\x07\x99\x3f\x4e\x9e\x1b\x5c\xd1\x1e\xe2\xb7"
+ "\x29\x1f\xca\x09\x1b\x42\x65\x7a\x6f\x46\x10\xba\x84\xe9\xbd\x18"
+ "\x9b\x86\x8b\xb4\x5f\xcd\x30\x85\xd7\xed\xf4\xc5\x62\xdd\xf6\x46"
+ "\xae\xcb\x19\xf6\xb0\x9c\x7a\xf9\xb1\xb9\x55\x6c\x4c\xbb\x27\x47"
+ "\x02\xf6\xaa\x19\xcf\x57\x54\xf0\xfa\x4a\x83\xba\x68\x6b\x39\x8b"
+ "\x53\x4a\x09\x6c\x58\x67\xeb\x33\x2f\xa1\xf5\xb8\xdf\x1c\x77\x69"
+ "\xda\xed\x79\x13\x79\xa1\x95\x19\xca\xce\x4e\x34\xcd\xf4\x5f\x5a"
+ "\xcf\xa3\xae\xf9\xe9\x5d\x79\x38\xfb\xae\x64\xdf\xae\x66\x51\xb7"
+ "\x13\x95\xbb\x2a\x8e\x39\x3c\xca\xcc\x06\xdc\x73\x3f\x1c\x07\x5e"
+ "\x64\x66\x03\xea\x2c\xa8\x61\xa6\x82\x4e\xde\x5d\xfa\xe0\x04\x13"
+ "\xed\xbf\x16\xda\x37\x4a\x2e\x8a\xbb\xb4\x7e\x98\xea\x78\x37\x53"
+ "\x94\x1b\xd3\x46\x44\xf6\xcd\x76\xd3\xd8\x7d\x73\x4c\xe9\x52\x6c"
+ "\x77\x5c\x58\xdf\xae\xf4\x85\xfb\x76\xa5\xef\x7f\xa1\x6f\x9f\x44"
+ "\xf4\xcd\x12\xee\x5b\x0e\xfa\x76\xfc\xc2\xfa\x96\x34\x3f\xdc\xb7"
+ "\xa4\xf9\xff\x60\xdf\x0e\x8c\xdf\xb7\x99\x8f\x8c\xdd\xb7\xfc\x4b"
+ "\xbb\x94\x99\x9b\x2f\xac\x6f\xb3\xf2\xc2\x7d\x9b\x95\xf7\x3f\xe9"
+ "\x5b\x61\x0d\x3f\xd1\x3a\x8d\xc1\x9f\x66\x1c\xe8\x7c\x97\x72\xe5"
+ "\x96\xcd\xd3\x84\x1d\xf7\x64\x7a\xbe\xa9\xa8\x86\x7f\x23\x79\x9b"
+ "\x99\xe7\xe4\x9e\x36\xd3\x4b\xf8\x2b\xed\x4a\x94\x2b\x3d\xc2\xce"
+ "\x25\x6a\xea\x3e\xee\xe4\x81\xeb\x7c\xb0\x19\x0c\xc0\xb7\x0b\x7c"
+ "\xc1\xef\x7b\x75\xc0\x8f\x38\x1c\x8d\x75\x67\x8d\xec\xd5\x01\xaf"
+ "\x61\x70\xfb\x95\xc9\xba\x3f\x57\xbd\xac\xb9\xfa\x7c\xf4\xe8\xca"
+ "\x95\xb7\xe7\x30\x33\xe8\x11\x7e\x11\x4f\xb3\xa2\x70\xa2\xe9\xf6"
+ "\xef\xb0\xef\x5f\x99\xaf\xdf\xd7\xd5\xeb\x5a\xd6\x3d\x91\x9b\x0b"
+ "\x58\x14\xee\x0c\x0b\xdf\x8f\x56\x2f\x4b\x2a\x60\x13\x96\xe5\x53"
+ "\xfd\x7e\x96\x69\xce\xa7\xba\x09\x1e\x92\x97\xbf\xf2\xad\xa8\xd5"
+ "\x2c\xae\x8a\xea\xc6\xef\xed\xd6\x22\xbe\xf5\x79\x66\xc4\xdd\x62"
+ "\xdc\x11\x96\xf7\x83\xa3\x4d\xd4\x8e\x47\x6f\xe7\x07\xe0\x97\x20"
+ "\xe1\x77\xd5\xbb\x61\xf8\x5d\xf5\x68\x18\x7e\x57\xfd\x48\xc2\xef"
+ "\xaa\x94\x30\xfc\x92\x6c\x17\x06\xbf\xab\x56\x87\xe1\x27\xcb\x9e"
+ "\x1f\x7e\x57\xbd\x30\x3e\xfc\xae\x6a\x0c\xc3\x4f\xd6\x35\x0e\xfc"
+ "\xa2\xc7\x86\xdf\x55\xc1\x7f\x0c\x7e\x49\xb6\x7f\x10\x7e\xf1\x12"
+ "\x7e\xb3\x94\x30\xfc\x92\xde\x08\xc3\x2f\x69\xa3\x84\x5f\x92\x23"
+ "\x0c\xbf\x59\x99\x17\x06\xbf\xa4\x03\x61\xf8\xc9\xb2\xe7\x87\x5f"
+ "\xd2\xf1\xf1\xe1\x97\xe4\x0f\xc3\x4f\xd6\x75\x61\xf0\x9b\x75\x33"
+ "\xc1\xcd\xa2\xc1\xcf\x32\x3e\xfc\x66\x65\xfe\x83\xf0\x33\x4b\xf8"
+ "\xcd\xbe\x2d\x0c\xbf\x59\xfd\x61\xf8\xcd\x7a\x53\xc2\x6f\xd6\xc1"
+ "\x30\xfc\x66\xd7\x5f\x18\xfc\x66\xf5\x86\xe1\x27\xcb\x9e\x1f\x7e"
+ "\xb3\x67\x8e\x0f\xbf\xd9\x0b\xc2\xf0\x93\x75\x8d\x03\xbf\x89\x63"
+ "\xc3\x6f\xf6\xe6\x7f\x0c\x7e\xb3\xeb\xcf\x07\xbf\x0b\xe3\x35\x66"
+ "\x8f\x7b\xff\xfd\x02\xeb\x09\x8c\x57\x0f\x60\x08\xfb\x44\x75\xfb"
+ "\xec\x40\xad\x1a\x6d\x92\x77\x38\x66\x37\x90\x0c\x73\x6b\x87\x32"
+ "\xe7\xce\x5a\x75\x82\x89\x3b\xbf\x39\xa6\x3a\x4f\x6c\xe3\x5b\xa2"
+ "\x8d\xea\x96\x89\x46\xf8\x33\x18\x37\xe6\xba\x32\x67\x7f\xd4\x65"
+ "\xec\x0a\xdc\xd7\xdb\x4a\xfc\x1a\x9e\x07\xb7\xcf\x69\x20\x5e\x24"
+ "\x75\x34\x4c\xb2\x56\xad\x13\xc1\x3e\x73\xb3\xb3\x1e\x5d\x93\xb5"
+ "\x72\x4d\x9e\x6d\xe5\x03\x0f\xaf\x1b\xe9\x43\x5f\xc4\xc9\xdc\x86"
+ "\xf9\x9b\xe3\x0f\xf9\x98\x71\xf2\x7c\xf8\xea\x73\x5c\x09\xdb\x34"
+ "\xfb\x02\x11\xd7\x20\x76\x38\x89\x0f\xa7\xef\x4a\xbd\x8a\xbf\x23"
+ "\x7c\x10\x0e\xe7\xec\x22\x79\xaa\x05\x7e\x65\xb4\x73\xa8\x96\x2e"
+ "\xe5\x9a\x9f\xf0\x18\x5e\x09\x9b\x0e\x71\xb7\x43\xb1\xeb\x77\xb0"
+ "\x9a\xb9\xa9\x3f\x49\x2d\x41\x7c\x2d\x5e\x02\x18\xb4\xc2\xff\xdb"
+ "\xfa\xa8\x19\x1d\x4a\x72\x22\x8f\xe9\x4f\xe2\x25\xfd\x76\xed\x8c"
+ "\xc3\x0e\x7b\xd1\xd4\x4d\xfc\x6b\xd4\xa7\xf1\x82\x88\x5b\xe2\x92"
+ "\xfc\xa0\xfd\x88\x79\x8b\x2d\x0a\x79\xe1\x87\x11\xfe\x09\xf5\x58"
+ "\x55\xe8\x37\xf2\x12\x3f\x7e\x2b\x95\xbf\x15\xb1\x3a\x43\x75\xc8"
+ "\x3e\x5d\xdc\xa3\x5c\x6d\x14\x63\x29\xf1\xb5\xf5\x3d\x96\xbe\x4b"
+ "\xc4\x8b\x14\x70\xbd\xf6\x1c\x8d\xa1\x4d\xc4\xf9\x0c\x9c\x11\x71"
+ "\x3e\xb5\x32\xd3\xa9\x8c\xa0\xa7\xf0\xbd\x2a\xeb\xb8\xf6\xb8\xde"
+ "\x2f\xe2\xa1\x63\xe9\xfd\xc3\x88\x36\x2e\xa2\xf7\xd7\x22\xbe\xc7"
+ "\xd1\xfb\x33\xc4\x87\x4e\xd2\xbe\xc7\xd3\xfb\x46\xf0\xa5\x62\x5c"
+ "\xe5\xc5\xd2\x26\x5a\xb9\x76\x05\xa5\x59\xb4\x3c\x93\x28\xcf\x6d"
+ "\xe0\x75\xb5\x3a\x26\xd3\xfb\x2c\xc8\x8c\xda\xf7\x44\x7a\x8f\xc1"
+ "\xb9\x80\xf6\xfd\x92\x1e\xe5\x9a\x53\xf4\x3e\x47\xfb\x4e\x7c\xfd"
+ "\x35\xc2\xd7\x16\xc1\x7d\x1a\xc6\x44\xb0\x77\x00\xee\x04\xeb\x69"
+ "\xdc\xe4\x6b\x21\x79\xb5\x08\xf3\x88\x71\xba\x36\xf5\xb0\x0e\xe5"
+ "\x9a\xcb\x70\x2f\x4f\xce\x15\xaf\x94\xfe\x81\x0c\xe9\x94\x6e\x45"
+ "\x3a\x6c\xcb\xd5\x1d\xdc\x81\x67\x82\xe9\x6b\x80\xa1\xd6\x16\xc9"
+ "\x44\xd7\xa4\x6a\xf3\x4c\xb0\x83\x0f\x5f\x56\x5c\xa7\xcd\x05\xf5"
+ "\x6d\x22\x7d\xdf\x23\xcf\x3d\x70\xbf\x68\x58\xde\x2f\x52\xae\xc9"
+ "\xf9\x6f\xf9\xac\xa0\x72\x92\xee\x5d\xb3\x4f\x8f\x61\x48\x69\xc2"
+ "\x57\x06\xf0\x13\xfa\x15\x6f\x8c\xaf\x51\xf8\x68\x21\x1c\xd5\x71"
+ "\x05\x78\xc2\xa3\xe7\xb8\xa4\xae\xe6\x9a\xd0\xfd\x5f\x2a\x6b\xd3"
+ "\xe2\x3e\x30\x29\x27\x5c\xcb\xc2\xf6\x45\x57\x0b\xfa\x10\xf1\x6d"
+ "\x5a\xc4\x37\xdd\x2f\xa1\xf4\x39\xb5\xfd\xda\x05\x11\xdf\xaa\x46"
+ "\x7d\x5b\x1e\xf1\x6d\xdb\xa8\x3a\x1d\x11\xdf\xf2\x46\x95\x2b\x8d"
+ "\xf8\x96\x39\xea\xdb\xbe\x88\x6f\x69\xda\xb7\x28\x4a\x77\x85\x7c"
+ "\x24\x2a\x57\xa7\x6a\xe9\x44\xeb\xaf\x6d\x8f\x48\x4f\xd1\xd2\xd1"
+ "\xbe\xd7\xc3\xfe\x7a\x4c\x4b\x17\x78\x4e\x78\x34\x5b\xb6\x91\x1c"
+ "\x17\xd1\x06\x93\x32\x96\xaf\x51\xce\x9f\x3d\xdf\xac\xd8\x26\x02"
+ "\xa7\xcc\x5b\x8a\x11\x43\xa8\x52\xfa\x03\x93\xeb\x50\xc4\xa1\x46"
+ "\xac\x5c\xca\x37\x1e\x6d\x1c\xdb\x46\x30\xb9\x58\xbf\xc7\x1a\x2c"
+ "\xf1\x1d\x52\x4b\x86\xa1\x9b\x9e\x01\xbf\x61\x45\xbd\xf0\x1d\xa3"
+ "\xc7\x24\x1c\x62\xee\xbc\xc1\xe2\x56\xbf\xb8\x6f\x8b\xfb\x10\x09"
+ "\xf0\x7b\xd6\x2a\xf4\x3b\xa7\x64\x5c\x42\xdc\xef\xdd\xe1\x3b\xb4"
+ "\xa1\x97\x4d\x73\xdc\xc2\x3b\x21\xe7\x49\x9a\x90\x0c\x7a\x62\xd6"
+ "\x68\xda\xf3\xc2\xd6\x5b\x99\x9b\x82\x34\x77\xaf\xd0\x33\x9b\xba"
+ "\x94\xb9\xc5\xfa\x77\x39\xde\xb9\xc5\x42\x96\xd6\xee\x15\x0e\x6e"
+ "\x9f\x6b\x0f\xc5\xcd\x54\xe6\x6e\xeb\x8f\x57\xba\x29\x6d\xe1\x48"
+ "\xfb\xc6\xb9\xf7\xa0\x4e\x8c\xc3\xa3\x24\xfb\x51\x37\xe5\xc9\x0c"
+ "\xd9\x37\x52\xfa\x86\x00\x9b\x4a\x7d\xeb\xd2\xeb\xa7\xef\x24\xff"
+ "\x27\x0b\xb9\x12\x75\xf6\x97\xd9\xad\x94\x56\xe5\x31\xbc\x5f\x2c"
+ "\xed\x23\xe7\xd6\x7b\x58\x47\xca\x78\xfb\x9f\xd0\x49\x9a\xf8\x3e"
+ "\x5e\xc2\x0f\xd2\x9a\xaf\x17\xf6\xca\x31\x7c\x9f\x94\xe5\xe7\x9e"
+ "\x42\x2c\x32\xc4\xf0\xc6\xb9\xa3\xa4\x3b\xd7\x09\x7b\x08\xa4\x11"
+ "\x6c\xf6\x11\x7d\xbe\x70\x5f\xa1\xca\x5c\xb1\xff\xc1\x77\x13\xee"
+ "\x5c\xe0\x0e\xc7\xe0\xf6\xeb\x96\x84\x62\x3d\xe8\xf7\x09\x94\xeb"
+ "\x7e\x09\x1d\x5f\x85\x2a\xfb\x38\xba\x0f\xe8\x2f\xd5\xd5\x3b\xee"
+ "\x5e\x6a\xe2\x42\x57\x44\xbc\x4c\xb3\xb4\x25\xbb\xee\xcd\x28\xeb"
+ "\xe5\x04\xf7\xeb\x1a\x42\x31\x2e\x28\x4f\x39\x6c\x82\xa9\xfe\xd0"
+ "\x38\x73\x45\x1b\xc7\xa4\x9e\xfe\x3a\x2f\xd1\xb1\xfa\x8a\x21\x66"
+ "\xd4\xd2\xbd\xad\x01\x3f\xee\xd6\x8f\xe9\x83\x0b\x7b\xa4\xf0\xdf"
+ "\xb4\x93\xd7\xe3\xfe\xc4\x3c\xbf\xde\xe7\x79\x5e\xd8\xed\xa3\xcf"
+ "\x12\xb6\xf3\x4e\xe8\x70\x2c\x3b\x4b\x75\x17\x7e\xc1\x3a\x95\x79"
+ "\x8f\xc0\xbe\x45\xc0\x64\x93\x6e\x73\x35\xef\x11\x91\x6f\x28\x94"
+ "\x47\xe8\x3b\x60\xef\x0b\x38\xd5\xc2\xef\x00\xd5\x59\x4e\x73\x21"
+ "\xe2\xd8\x2a\xf3\xde\x10\xfa\x4d\xfa\x2e\xc6\x2d\xec\xd9\x52\x12"
+ "\x25\xae\xcc\x3b\xe0\x51\x52\x6c\x12\x07\x65\x1a\x62\xc0\xc3\x0e"
+ "\xe1\xb4\x32\xaf\x0c\xb1\x64\x09\x1e\x07\xe1\xbb\xae\xd5\x47\xeb"
+ "\x25\x7f\x08\xb8\x70\x10\x31\x03\x3d\xca\x3c\x19\xcb\xca\x04\x98"
+ "\xcf\x83\xaf\x3e\x71\xc6\x83\x38\xba\x04\xd3\x81\xc1\xed\x29\x21"
+ "\xfd\x07\x62\xf6\x52\x9e\x71\x7d\x37\x02\x46\x41\xea\x73\x2b\xf1"
+ "\xab\xae\xa9\x5f\xa0\x7f\x9f\xa8\xb1\xbc\x1e\xf6\x93\xf4\x2c\x7d"
+ "\x5f\x94\xc8\xb9\x93\x78\x90\xb2\x3f\xca\x3a\x6d\x66\xab\xc4\x05"
+ "\x19\xc7\x5c\x49\x49\xd3\xe0\x27\x62\x5e\x54\xae\x97\x70\x90\xf9"
+ "\xaf\x37\x4a\xbd\xcc\xb4\x39\xd4\xaf\xfa\xb0\x5e\xe6\x7a\xa3\xd0"
+ "\xa9\x69\x36\xd6\xf4\xed\x50\x44\x9f\x7d\xe2\x1e\xe0\x59\xc8\xd4"
+ "\x29\x59\x68\xab\x0c\xbe\xc5\x80\x17\x3d\x91\xf8\x9f\x72\x07\xfa"
+ "\x09\xdb\xbc\x60\xcc\x50\x33\xdf\x31\xd4\x02\x38\x53\x99\x02\x5a"
+ "\x0b\xf5\xe3\xc4\x89\x17\x71\xaa\x06\xb7\x5f\x9f\x1c\x11\x7b\x97"
+ "\xf6\xc1\xeb\xef\xd5\xf7\x39\xec\xd1\xf0\xf3\x10\x4a\x2b\x5b\xd4"
+ "\x4e\x3c\x0e\xd3\x78\x9c\x71\xe3\xc4\x57\x5c\xc7\x52\x70\xd7\x18"
+ "\x76\xda\xc0\x37\x1e\xb7\x28\x1f\xbe\x93\xe1\x07\xd2\xb5\xe9\x06"
+ "\xea\xef\x0d\xf1\x4f\x4f\x11\xf7\x1b\x7d\xae\xeb\xce\xc2\x46\xa7"
+ "\xb7\xab\x40\xf8\x37\x32\x2d\xcb\x0f\xf0\x3a\x19\x7b\xdb\xcb\xe3"
+ "\x17\x61\xff\xed\x15\xb1\x03\x50\xe7\x7f\xd7\x0f\xb0\x72\x7d\xbb"
+ "\xc6\xcb\xf4\xd2\x5e\x7e\x29\x8d\x47\xdc\x67\xa4\xe7\x29\x3d\xca"
+ "\x8d\x37\xc9\x78\x91\xd2\x97\xbd\x66\x6b\x18\x2d\xef\xe7\x7b\x99"
+ "\xb8\x2f\xad\xdc\xb0\xdf\x76\x0d\x63\xbd\xca\x0d\x2f\x0b\xbf\xd2"
+ "\x25\xfd\x16\x0d\x06\x96\x0a\xd9\x2f\x73\x46\xbe\x41\xf4\x11\xfd"
+ "\xbb\xb0\xbe\xdd\xa0\xef\x97\xd1\x83\xdb\x6f\x68\xd4\xef\xf5\x8b"
+ "\xf1\x6b\xfe\xa6\x5d\x57\x42\x6e\xb9\x71\x96\xc4\xc1\xfe\x44\xad"
+ "\xed\xc4\xff\x85\xb6\xbd\xda\x7e\xd8\x2d\x7c\x6e\x13\x5c\x88\x7f"
+ "\x24\x5a\x74\x63\xaa\xbe\x9f\x6a\x36\xf2\xc9\x72\x9f\xbf\x31\x3d"
+ "\xbc\x97\x4a\x18\x8e\xb8\xb3\xb3\x76\x6d\x9e\x8d\x18\x76\xc7\xca"
+ "\xbc\x07\x72\x6c\xd9\xb9\xff\x1f\x7b\x5f\x03\x17\x55\x99\xef\xff"
+ "\xcc\x01\x15\x6d\x06\x26\xd7\x6d\xa9\x45\x9b\x5a\xaa\xb1\xb5\xa2"
+ "\xcd\x8a\xca\x8a\x34\x77\xa9\x55\xb1\x56\x77\x29\x4d\x51\x51\xc7"
+ "\x44\x1d\x11\x11\x15\x79\x4b\x59\x22\x66\x60\xc3\xed\xa2\x02\x5a"
+ "\xd7\xfa\xdb\x6e\x2f\xd4\xb5\x7b\x69\xaf\x6d\xd3\x65\x06\x46\x1b"
+ "\x18\xb6\x3f\xdd\x8b\xbb\xfa\x6f\x72\xc9\xc8\xd0\x26\x45\x19\x99"
+ "\x99\xf3\xfc\x7f\xbf\xf3\x9c\x61\xce\x00\x03\x33\x03\xbe\xe4\x95"
+ "\xcf\xe7\x7c\x0e\xe7\x39\xcf\x3c\xe7\x79\x7e\xbf\xef\xef\xed\x79"
+ "\x4d\x5f\x93\xae\xc2\x0d\x6f\x7a\x9d\xab\x14\x41\x0b\xef\x49\x13"
+ "\xcf\x7e\xdb\xd7\x73\xf6\x5b\xe1\x3d\xfb\xa5\x67\xf2\xd9\x64\xf7"
+ "\xd4\x0e\x4f\x5c\x73\x8f\xdf\x75\x7e\x65\x1c\x5f\x03\x57\x2d\x5c"
+ "\x06\xb8\xcc\x18\xe7\x2c\x74\x90\x04\xb0\x8f\xc2\x98\xb0\x77\xbd"
+ "\xfa\x3d\x25\x38\x0e\x7e\x4c\x36\xf9\xee\x6a\x3e\x9c\x08\xfb\x9a"
+ "\x14\xf0\x38\x97\x04\xf7\x47\xaf\x85\xcb\x00\x97\x19\x2e\xe1\x77"
+ "\xfc\x7f\x09\x6b\x6d\x6b\xa4\xef\x70\x6c\x9a\x16\x18\xa6\x60\x1e"
+ "\x9a\x1f\x2e\xf8\x21\xfc\xcb\x2c\x5f\xaf\x3a\x70\xb4\xf0\x8e\xfd"
+ "\x62\x3e\x41\x37\x44\xe6\x13\x55\x3f\xf9\xc2\x68\xe1\x6d\x36\x31"
+ "\x9f\xb0\xf6\xdd\xd3\x1e\xdc\xbb\x1f\xf2\x7b\xf2\x85\xd3\xc2\xbb"
+ "\xb5\x62\x3e\xb6\xa7\x59\x01\xd7\xdf\x77\x47\xd0\x82\x73\x31\x62"
+ "\x3e\xa5\xb4\x3c\x49\x9e\x91\x7c\xe1\x8d\x8f\x63\x1e\x3e\x3f\x9c"
+ "\x9d\xc3\x52\x78\x4f\x0b\xe4\xef\x37\xd6\x0b\x8e\x4f\xf7\x66\xf7"
+ "\xe6\x93\x76\xc9\x8a\xa5\x0f\xae\x58\x9d\x89\x27\x49\x65\xac\x59"
+ "\x9f\x81\xf7\xd5\x8b\x56\x0a\xb7\x35\x0b\x97\x2d\x61\xff\x64\xa4"
+ "\xc5\xe1\x3f\x69\x80\x37\xbc\xa7\xae\xd7\xe2\x6d\xc9\x1a\x7c\xcc"
+ "\xd2\x4c\x5a\xbf\xc4\x73\xa4\xb7\xcf\xbe\x4b\x5d\x85\xf7\xc5\xda"
+ "\x64\x93\xc7\x31\x7f\xe4\xbe\x38\x9b\xec\x36\x61\x1c\x38\x2a\xdf"
+ "\x46\x4c\x6a\xe1\xec\x3f\xd2\x67\xbf\x02\xd9\x7d\x0f\xe3\x7e\x05"
+ "\x51\xf9\xda\x25\x51\xae\x15\x4b\xe9\x8b\x4e\x2c\x27\xcd\x46\xf6"
+ "\xb2\xb5\xe5\x45\x67\x55\xc2\xbe\xa1\x85\xf7\x1e\xf0\xcc\x2f\xe4"
+ "\x8b\x3a\x5b\x70\x3f\x7c\x61\xbe\xd1\xcb\xb8\x17\xce\x59\x5c\x7b"
+ "\x15\x53\xfd\xb2\x70\x2e\xcd\x38\x78\x7f\x04\x9e\x63\xe1\x39\x1a"
+ "\x9e\x63\xf8\xa2\xaf\x52\x70\x7d\x22\x3c\xab\xe0\x39\x16\xca\xb7"
+ "\x78\xe4\x42\x4a\x1b\xf1\xb0\xb9\x07\xfb\x8d\x8f\x7d\xf7\x98\x02"
+ "\xd9\xba\x5f\xe9\x39\xcb\x57\x38\xb7\xb7\xf0\x7e\x55\xcf\xb9\xbd"
+ "\xc2\x59\x4e\xca\xf9\x82\x5d\x13\x6c\xfb\xfd\x55\x61\xd1\xe3\x33"
+ "\x99\x1f\x7e\x7f\xa2\x67\x4f\x06\xe6\x67\xdf\x9f\x2c\x39\xf3\x18"
+ "\x9f\x35\x3d\x67\x1e\xb3\x7d\xc9\x76\x0a\xfb\x1e\xc9\xee\xaf\xa1"
+ "\x85\xf7\xb5\xf6\x9c\x4f\x57\x78\x7f\x99\xf4\x7c\x3a\x1b\xbc\xc7"
+ "\xf8\x06\xd2\xf7\x79\xed\xe0\xfd\x53\xf0\x9b\xfd\x9d\xef\x0c\xf1"
+ "\x79\xd6\xc2\x8d\xe0\x8b\xc3\x5d\xf0\xcb\x45\x1f\x18\xd3\x69\x41"
+ "\x02\xee\x6f\xa3\xc2\x77\xe8\xfb\xf5\xdb\xe7\x80\xe7\x2b\xca\xe2"
+ "\x1f\xc3\x7d\x77\xed\xb9\xa9\xb2\x9f\x55\xe3\x1c\x24\x78\x66\xfb"
+ "\x46\xd2\x53\xb2\x78\x61\x1d\x9b\x67\x4f\x39\xe9\x9a\xf8\x7e\xd7"
+ "\x1e\x7c\xe6\x19\x33\x4e\x5b\x13\xe5\x5a\xb4\x94\xf9\x71\xf1\xaf"
+ "\x32\x5d\xda\xcd\xd6\x7d\xca\xe2\x4b\xe8\xd3\xec\xbc\x13\x9b\xec"
+ "\x01\x25\xae\x47\x8a\x92\xa5\xad\xa1\xf0\xdb\xa8\xac\x45\x4b\x85"
+ "\x34\xc8\xf7\x02\xf8\x5a\x62\xfd\xd6\x5a\x63\xda\x09\x3d\xe7\x66"
+ "\x6b\xfd\x65\xf1\xda\x05\xe3\xf3\xf0\x3b\x11\x82\x1f\xf1\x19\x91"
+ "\xe3\x59\x81\x58\xb7\x6a\xc9\x9e\x77\xa5\x90\x86\xf3\xb1\xce\x3c"
+ "\x4d\x84\x7d\x7f\xc5\xba\x68\x85\xb3\xca\x0a\x1f\x88\xf0\xec\x99"
+ "\x63\x83\xb4\xde\xed\x79\xfa\x37\x82\x84\xdc\xb2\x64\xd2\xec\xe9"
+ "\xf0\xdf\x24\xf1\x98\x5b\x29\x76\x62\xce\x8c\x71\x47\x9f\x79\xa3"
+ "\xf4\x5f\x84\x73\x22\x0b\x1f\x48\x06\x3e\xb9\x04\x7e\xbf\x30\xef"
+ "\x1b\xd4\x2d\xc2\xf9\x89\xb8\xae\x90\xef\x84\xef\x4e\x79\x42\xd8"
+ "\x5f\x97\x63\xfe\xa2\xb0\xaf\x5d\xe1\x03\x31\x74\x4c\xa7\x81\x9d"
+ "\x11\xeb\x34\x00\xff\x04\xbb\x8f\xb2\x21\xac\x9f\x54\x62\xdb\x1f"
+ "\xa8\x01\x9d\x3a\x0d\xae\xdf\xb1\xf3\x61\xe6\x7d\xe3\x29\x17\xf7"
+ "\x8f\x02\x6c\xa9\xe1\xae\x84\xef\xb7\xf6\xcc\x11\xea\x59\x93\xf9"
+ "\xc0\x79\xdc\xdb\xaa\x67\x7d\xae\x6c\xca\xbd\xcc\xaf\x7c\x30\xdc"
+ "\x46\x6e\x2d\x63\xf2\xfd\x20\xe0\xdf\x2c\xae\xcd\x7a\x10\xe2\xdf"
+ "\x5f\xa7\xf8\x96\xf1\xe0\x52\x4f\xdf\x07\xe3\xdd\x83\x09\x80\xc5"
+ "\x69\x70\xfd\x0e\xf2\xcf\xf0\x9c\x91\xfd\x02\x27\xac\x2d\x3a\x1e"
+ "\x16\x4d\xe2\x20\x3d\xd5\x93\x3e\x42\x96\x00\xb4\x79\x30\xc3\xa3"
+ "\x4f\xce\x8c\xe9\x6e\x81\xe7\xad\xe0\xa7\xbb\xc4\x67\x1b\x3c\x6f"
+ "\xf7\x3c\xc3\xff\x7b\x3c\xfa\x06\xe3\xb3\x33\x9b\x93\x77\x60\xfc"
+ "\xb7\x24\x1a\x7c\xb2\x68\x8c\xaf\x1e\x84\xf8\xb7\x41\x88\x95\xce"
+ "\x44\xde\x1a\x77\xa6\xe0\xd0\xa4\xce\xc8\x47\xb4\x9d\xa0\x43\xe1"
+ "\xdd\x11\x1b\xf9\xf3\x7c\xb1\x9c\x76\x1b\x57\x6f\xf6\xf2\x23\x2c"
+ "\x0a\x68\x7c\x84\xb5\x69\x8a\x0a\xfe\xb7\xe1\x79\xe5\x5d\x85\x0f"
+ "\x29\x6d\xb2\xfb\x1c\x42\xbe\xcc\x8e\x3d\x25\xdd\xca\x39\x56\x88"
+ "\xe0\x0d\xcb\x10\x2b\x0f\x09\xeb\x93\x75\x9b\x94\xb3\xd1\xe7\xc3"
+ "\x7d\x08\x84\xfd\xc9\x70\xcf\x49\x17\x19\x29\xec\xf3\xaf\xbb\x4d"
+ "\x2d\xec\x6f\xbf\x41\x2d\xf7\xec\x37\x09\x72\xaa\xa5\xdc\x3b\x19"
+ "\xb8\x07\xa5\xd0\x97\xd6\xa5\x8e\x14\xf6\x9d\x14\xf7\x9b\xac\xca"
+ "\x24\xe3\x2a\x79\xb6\xdf\xa4\xb0\x47\xc1\x00\x7b\x4e\xd2\x82\xaf"
+ "\x27\x7b\xf6\x9c\x04\x3a\xe0\xda\x43\x35\x3d\xe7\x72\xc0\x3d\x56"
+ "\xb2\xd7\x4d\x78\xbf\xfb\x4f\x72\xa0\x37\x39\xb6\xff\x64\x70\xf6"
+ "\xe6\xa1\x0e\x86\x93\x29\x93\x3c\x67\x78\x4b\xd2\x12\x40\x5e\x44"
+ "\x3f\xe7\x01\x87\x98\x36\xc7\x46\xea\x3b\x7a\x7c\x33\xd0\x77\xd8"
+ "\xa7\x08\xef\xb3\x69\xae\x66\x87\x54\xae\x88\xf0\x87\xa6\x7b\x04"
+ "\xd8\xe5\x91\x70\x8d\xc2\x2b\xb1\x47\x7f\x9c\xa3\xad\x18\x23\x44"
+ "\xc9\xc0\xde\x64\x85\xd1\x24\x97\x2b\x6c\xa1\x4b\xd6\x82\xbe\x27"
+ "\xae\xb9\x4e\x72\xbb\x70\xed\x7f\x78\x92\xfb\x0c\x9e\xaf\xd9\x82"
+ "\x6b\xc9\x4a\x97\xe1\xda\xc6\x1b\x29\x9e\x53\x93\xe4\xfe\x8e\xee"
+ "\x66\x6b\x36\x9b\xc5\x33\x33\x2d\xee\x4c\x6a\x06\x3e\xc8\x31\xee"
+ "\xc0\xfd\xb7\x22\x65\x0e\x12\xa9\x0d\xfb\x78\xd6\xd9\x8f\x29\xee"
+ "\xbd\x85\x67\x94\xf1\x85\x0e\xd0\x95\x2a\xd9\x42\x57\x58\x9e\xd5"
+ "\xd5\x26\x9c\x13\x90\xe4\x1e\x45\x93\xb2\x1e\xa6\xc2\xd9\x62\x99"
+ "\xd4\x08\x7a\x36\x4c\x38\x43\x7b\x23\x3d\x03\xff\x47\x24\x6d\x3c"
+ "\x43\xf1\x7c\x4f\x28\xdb\x9c\xe4\xe2\xbb\x93\xb2\xf8\xdc\x85\x59"
+ "\x32\xf8\xdd\x3f\xe1\x77\xff\x84\xfa\xc4\x41\x99\x4a\x78\x7e\x94"
+ "\xee\x5e\x86\x6b\xa0\xf2\x84\xd8\x07\xda\x68\x10\xd7\x95\xd6\xe2"
+ "\x99\x9e\xb8\xcf\xf8\x42\x97\x21\x6f\xb7\xb8\x4e\x54\x38\x5b\x36"
+ "\xcb\x49\xc5\xef\xc4\x27\x6d\x24\x8f\x2e\xdc\x78\xa3\xb0\xde\x14"
+ "\xd7\x52\x25\xb9\x54\xf0\xcd\x3c\xa4\x87\x5c\x38\xcf\x5b\x58\x4f"
+ "\xf5\x70\xeb\x40\xe7\x7b\xf6\x1b\x6f\x17\x8f\x4d\xa6\xba\xba\xfd"
+ "\xb4\xf8\xc7\x6a\xaa\x33\x4e\xa6\x45\x4e\xd4\xcf\x32\x5a\xfc\x13"
+ "\x07\x3c\x43\xfa\x0d\x66\xaa\x33\x4d\xa6\xc5\xe3\x2b\xe0\x0e\xcf"
+ "\x2a\x0d\xd5\xd5\x4f\xa6\x85\xce\x38\xf8\x1d\xd8\x31\x17\xfe\x2e"
+ "\x8e\x16\xba\x55\x70\x87\x67\x3e\x1a\xf2\xc1\x33\x55\xc2\xbd\x86"
+ "\x16\x63\x3f\xcb\x23\x95\xf0\x9b\x38\x5a\xfc\xb3\x78\xf6\xad\x5b"
+ "\xe3\x85\x6f\x15\x4f\x8c\x67\xdf\x98\x14\xcf\xbe\x71\x57\x3c\xfb"
+ "\xc6\x2f\xe2\x85\x6f\x14\xe3\x5e\x24\x75\xb5\xb4\x98\xd3\x42\xbe"
+ "\x78\x5a\x1c\x66\x83\x3b\x3c\x8f\x98\x0d\xf9\xe0\x79\xa4\x01\xee"
+ "\xf0\x1c\x01\x75\xa9\x87\xe7\xd1\x7b\x20\xff\x01\x5a\x7c\xcd\x38"
+ "\xc8\x37\x85\x16\xcb\x8b\xe0\x0e\xcf\x0a\x17\xe4\x83\xe7\x28\x28"
+ "\xc7\x04\xcf\xca\x36\xc8\x0f\xcf\xf7\x62\x7d\x0c\xb4\xf8\x3e\x2c"
+ "\x37\x81\x16\xc7\x63\x7e\x78\x7e\x10\xca\x33\xc1\xf3\x43\xad\x70"
+ "\x87\xe7\x87\xf3\x20\x3f\x3c\x3f\x0a\x6d\xad\x33\xd2\xe2\x84\x16"
+ "\xc8\xf7\x38\x2d\x9e\x0a\xe9\x46\x78\x7e\x7c\x12\xe4\x83\xe7\xe9"
+ "\x98\x1f\x9e\x7f\xb5\x15\xf2\xc3\xf3\x13\x48\x23\x33\x2d\xfe\x75"
+ "\x19\xe4\x4b\xa4\xc5\x33\xed\x70\x87\xe7\xd9\x58\x7f\x78\x7e\xba"
+ "\x06\xee\xf0\x3c\x17\x68\x55\x0f\xcf\xbf\x83\xfa\xd5\x41\x6c\xfa"
+ "\x0c\x96\x3f\x83\x16\xcf\x47\xfa\xc0\xf3\x02\xa0\x9f\x09\x9e\x17"
+ "\x01\x3d\x4c\xf0\xbc\x24\x15\xf2\xcf\xe8\x9f\x9f\xcb\xa6\xd0\xfc"
+ "\x91\x84\x16\xaf\x99\x4f\xf3\x47\xc1\x7d\xad\x9c\xe6\x8f\x50\xd3"
+ "\xe2\x8c\x34\x48\x87\xfb\xda\x36\x78\x9e\x24\x3e\xc3\x3d\xfd\x00"
+ "\x3c\xc7\x89\xcf\x70\x5f\xb7\x1d\x9e\x27\x8b\xcf\x70\xcf\x8c\x81"
+ "\x67\xa0\x6d\x66\x27\x3c\xe3\xbd\x08\x9e\xa7\x88\xcf\x70\xcf\xaa"
+ "\x85\xbb\xcb\x3e\x5e\x9f\x65\x57\x94\xc7\xd9\x15\x0d\x7b\x70\x3e"
+ "\x92\x5b\x5f\x57\xc3\x47\x1a\x71\x6f\xe0\x91\xb9\x67\xc9\xa8\xe3"
+ "\xb2\xc7\x9e\x42\xbb\x67\xcd\xb6\x09\x67\xd5\x89\xfb\xcd\x8d\x3c"
+ "\x26\x4b\x58\x0a\x76\x3e\x1e\xcf\x2c\x87\xb6\x77\xd0\x82\x11\xa7"
+ "\xa1\xcd\x69\xb4\xe0\x9a\x63\x70\x87\xe7\x6b\x3f\x83\x36\xc3\xf3"
+ "\x7d\xc5\x70\x87\xe7\x79\x53\xa1\xed\x69\x5d\x85\x09\x46\x9b\xec"
+ "\x61\xa6\xb3\xdf\x28\x2d\x8b\x72\xe5\x82\x9e\x00\x3d\xba\xa3\x29"
+ "\x25\xca\x95\x02\x74\x32\x27\x44\xe1\x99\x12\x55\xfa\x5a\x1a\x59"
+ "\x2e\xd4\x09\xcf\x8d\xa1\xce\x58\x8e\x7d\xfb\x1a\x0a\xdf\xfe\x1e"
+ "\xfb\x33\x69\xe4\x9f\xfd\xbc\x7f\xec\x5a\xe1\xfd\x0d\x4d\x5a\xf6"
+ "\x5e\x49\xbc\xef\x7f\x87\xef\xef\x8e\xc2\x3e\xe8\x09\x39\x5a\x9b"
+ "\xec\xb1\x64\xcc\x63\x93\x25\x64\xd0\x82\x30\x62\xed\x6c\x17\xdb"
+ "\x38\x0a\xf3\x3d\x83\xbf\xf3\xd7\xaf\xc2\x97\x58\x2a\x74\x05\xb4"
+ "\x19\x63\x48\xd0\xfb\x9c\x2a\x27\xb6\xf6\x98\x6c\x9a\xba\x4a\xe8"
+ "\x1b\x68\x8a\xc7\xb5\x3d\x50\xc6\x49\x67\xb1\x4b\xa9\xda\x14\x05"
+ "\xe5\x4d\x9b\x98\xeb\xa0\x9d\x86\x9c\xa9\x60\x9f\x84\xf4\x19\x6c"
+ "\xbe\xb8\xf0\x7f\x3c\x9b\xe3\x23\xfc\x1f\xcb\xfa\x39\xa7\xa9\xf1"
+ "\xb7\x52\x9f\xdd\x5d\x98\x16\xcd\x47\x36\x25\xb0\x31\xaa\xc7\xbe"
+ "\xff\x88\xb7\x71\x51\x19\x64\x84\x6a\xd3\xc7\x50\xfe\xd4\x78\xdf"
+ "\xf8\xce\x93\x57\x78\x37\xfe\xaf\x90\x77\x97\xd0\x17\x33\x35\xd1"
+ "\xd3\x8f\x4b\xa1\x0d\x2f\x31\xdf\x26\x01\x6d\x11\xf3\xd1\xa6\x9a"
+ "\x71\x4f\x4b\x97\xdc\xac\x72\x95\x94\xab\xdc\x25\x4d\xf1\x54\xdf"
+ "\x94\x10\xe9\x92\x11\x36\xd7\x7e\xaa\xfb\x2e\x07\xf6\x91\x1d\xc2"
+ "\xbc\x1f\xf0\x23\xd7\xcf\xb8\x33\x8b\x70\x86\xf4\xbf\xe3\xf3\x59"
+ "\x5a\xb8\x69\xbf\xb5\xa3\x95\x18\xd2\x85\xb2\x3a\x69\x61\x61\x38"
+ "\x3f\x32\x2f\xae\x1a\x7d\xcb\x2c\xec\xdb\xf9\x0c\xd3\x37\x02\x9d"
+ "\xc1\x87\x9f\xda\xe2\xa9\x0b\xee\xed\xaf\x03\xda\xa1\xdf\x87\x6b"
+ "\xa3\x17\xba\xdd\xb8\x8f\x53\x91\x0d\xe8\xc0\xfa\x07\xa7\xd6\xa2"
+ "\x9e\x65\xdf\x9d\xa6\xe0\xc7\x38\x5d\x4d\xf3\x71\x1c\x54\x89\xfb"
+ "\xe2\x74\x0a\x6b\x29\x5d\x78\x1e\x1f\xda\x37\x96\xd7\x67\x3f\xe3"
+ "\x25\xda\x85\x9b\xb4\x6b\xd2\x33\x16\xae\xd7\x3e\xa8\x82\xc0\x4b"
+ "\xb5\x66\x99\x6a\xd5\xd2\x55\x6b\xd2\x37\xf6\xf6\x0f\x23\xba\x0a"
+ "\xa7\xa5\x01\x36\x84\xbd\xf2\x0f\x82\xcf\xc9\xfa\x8c\xa7\x4f\x41"
+ "\x5e\xef\x78\x85\x9d\xff\x00\x79\xca\x6c\xe4\x75\x21\x8e\xe0\x2b"
+ "\x9a\x92\x69\xa5\xbe\xf6\x45\x5c\x13\xbe\x1e\x7d\x7c\x3b\xb1\x92"
+ "\xd3\x50\x37\x76\x16\x60\x13\xee\x5b\x90\x99\x4d\x0d\x99\xa7\x11"
+ "\xe3\xa0\x1f\x1a\x12\x69\x55\x29\x39\xaf\x2b\xaf\x38\x26\x9b\xae"
+ "\x3a\xaf\x6b\x88\xf7\x9c\xd7\xe3\x2e\x69\xa8\xe0\xe5\x96\x1a\x3c"
+ "\xaf\xc7\x49\xa3\x49\x23\xd0\xb2\xbb\xc8\xd9\x0e\x3a\xbe\xad\xaa"
+ "\x00\xec\x0e\xc4\x06\xc2\x7e\x09\x6f\x94\x6a\xdd\x54\x1d\xee\x2e"
+ "\x20\x11\x70\x8f\xa4\x91\x8d\x36\xa7\xdc\x1c\x87\xef\xf1\x9c\x1e"
+ "\xb7\x53\x4d\x72\x5a\x28\xff\xac\x06\x70\x53\x40\xa8\x70\x36\xaa"
+ "\xe6\x24\x81\xf4\x31\xbc\xbe\xc1\x70\x3c\x91\x70\x98\x17\xfc\x1a"
+ "\x32\x1f\xfe\xcf\x5e\x44\x14\x90\x2f\x2a\xfb\x20\xa4\x77\xa9\xc7"
+ "\xb8\x72\xd5\x11\xdd\xb9\xea\x31\x4e\xaa\x96\x5b\xdb\x1c\xc4\x79"
+ "\x4b\x69\xde\x1d\x76\x12\xbe\x03\xfc\x9f\x2a\x1e\xe4\xab\x52\xbf"
+ "\xc7\xbd\x59\x3d\xd2\xb5\x59\x1d\xee\x74\xaa\x23\x5c\x1b\xd4\xe1"
+ "\xdd\x1b\xd4\x23\x9d\x5d\xea\x08\x6b\xaa\x9d\x1c\xb2\xff\x89\x34"
+ "\xb5\xb5\x0b\xfd\x8a\x4e\x45\x63\x87\x53\xd1\x60\x91\xb7\x91\x71"
+ "\x77\x6a\x09\xfa\x43\xb2\x9d\xe0\x03\x03\x26\xe4\xae\xd7\x4b\x41"
+ "\x7f\x36\x96\x01\x7d\x47\x4c\x9f\x48\xbf\x73\x17\x3e\xd9\xa2\x7a"
+ "\x12\x74\x51\x7e\x78\xcc\x71\xd9\xe3\x80\x9f\xdf\x3d\x4e\x0b\x7f"
+ "\x53\x02\xf1\xb8\x0a\x2e\x88\x6f\x05\x3e\x80\xef\xf5\x04\xe8\xb4"
+ "\xf0\x18\xcc\xcb\xf2\x25\xb5\xda\x84\xfb\x0c\xb5\x70\x86\x69\xe1"
+ "\xb4\xc9\x55\x42\x9c\x36\xbd\x67\xfe\xaf\x31\xbc\xff\x75\xe7\x90"
+ "\x67\x7e\x4f\xbc\xcb\x83\x3e\xd1\xd5\xf5\xdb\xbf\x48\x8b\xcf\x1c"
+ "\xc1\x31\x49\x1e\xe8\x06\xf5\x6d\xc4\xbd\xa2\x68\x6e\xa2\x18\x63"
+ "\x4e\x17\xc6\xd6\x71\xad\x36\xf6\x43\x88\x69\xc2\x38\x15\xcf\x25"
+ "\xe0\xde\xfc\xb5\xb8\x3f\x17\xf6\x3b\x00\xae\xcd\xd0\x0e\x1b\xd0"
+ "\x61\x04\xc4\x67\x35\x70\xd5\xc2\x65\x28\xc7\xfe\x88\x02\x32\xdd"
+ "\xd3\x57\xd3\x7f\x5d\x7f\x09\xf1\xcf\x1b\x16\x6f\xbc\xfa\xcb\x68"
+ "\x28\x4b\x1b\xfc\x7c\xbe\x5f\x46\x0f\xd0\x6f\x1c\x8e\xfb\xcc\x52"
+ "\x7d\x5d\x73\x19\xdf\xb3\x2f\x2d\xe8\xfd\x5f\xae\x02\x3d\x91\x27"
+ "\xbc\x2b\x31\x27\xe4\x7c\x4f\xc2\xf0\x5d\x0d\xce\x5f\x80\x67\x55"
+ "\xba\x8c\x5a\x3b\x1d\xa4\x0c\xc7\x11\x62\xf4\xb5\x35\xe7\xec\x1c"
+ "\xca\x45\x13\xa4\xc1\x6f\xb7\x95\x9d\x13\xcb\xad\x68\x4a\xc9\x5d"
+ "\x4b\x84\xb3\x46\xf0\xbc\x22\x94\x97\xb2\x1c\x88\x05\xf1\x6c\xa5"
+ "\xf4\x30\xd0\x57\xbf\xfc\x04\xfe\x8f\xc0\x7c\x54\x6e\x4e\xe0\xa1"
+ "\x0c\x90\x99\x7d\x54\x61\x56\xf3\xba\x86\x1a\xb0\x0f\x5a\x3a\xbe"
+ "\x34\x9a\xdf\xd1\x94\xd8\x55\xf8\x2b\x6c\xbf\x10\xf7\xe3\x3e\x40"
+ "\xd8\xd7\xe1\x86\x98\xbb\x69\x9f\x8b\xd0\xa9\x2e\x62\xca\x38\x4b"
+ "\xec\xa3\x9d\x1d\x76\x85\xa5\xc2\xae\x68\x2c\x73\x2b\x2c\xad\x70"
+ "\x1d\xd1\xa6\xe3\xf8\xef\xaf\x8e\xf4\xec\x67\xf9\xfd\xc0\xfb\x59"
+ "\x42\x99\xb1\x9e\x3d\x2d\xdd\x1b\x82\xdf\xcf\xd2\xcd\x7d\xa1\xae"
+ "\xca\x1c\x7c\x3f\x4b\xf0\x31\x9b\xc1\xbf\x34\x78\xf6\x1e\x71\x0b"
+ "\xf3\xc9\x89\xdc\xad\x30\x47\x0b\xfb\x97\x64\x19\x84\x3d\x48\xd0"
+ "\xd7\x44\x5b\xd3\x55\x98\x18\xed\xf1\x1f\x51\x7f\xba\x5f\x74\x3a"
+ "\xe0\xc2\xf4\x38\x9b\x6c\x5e\xaa\x47\xb7\x82\x3d\x9d\xed\x1e\x53"
+ "\x90\xd8\x85\x6b\x04\x9c\x9a\x47\x31\x2f\xd0\x11\xf7\x04\x0b\x73"
+ "\x3b\x35\x53\xe0\x7a\x18\xae\x47\xdc\xba\x86\x04\xb7\xae\x51\xeb"
+ "\xd6\x95\xcf\x81\x2b\x19\xae\xf9\x70\xa5\xc0\x95\x0a\x17\xf8\x91"
+ "\xe5\x69\x70\xc7\xf7\x19\x70\x65\xc1\x95\x0d\x57\x1e\x5c\x5b\xdd"
+ "\x3b\x9a\x66\xbb\x65\xe1\x31\x70\xc5\xc2\xa5\x72\xeb\x2c\xfb\xdc"
+ "\x3a\xb3\x8a\xad\xdb\x4c\x34\x78\x70\xda\xff\xbe\xa9\xb7\xb2\xb3"
+ "\x13\x46\x7c\x41\xa3\xf0\x5c\xdf\xec\xb3\xb8\x97\x9d\xda\xa4\xee"
+ "\x0c\xee\x0c\x0d\x59\xa2\xdd\x1f\xae\xb1\x7c\xd0\x31\xce\xe0\xca"
+ "\x7b\x22\xc1\x6f\x9f\x49\x74\x53\xb2\x2b\xa6\x94\xb8\x0a\x48\x1e"
+ "\xe8\x35\x59\x53\x4a\x1b\x49\xb2\x93\x5c\x4b\x5b\x37\xc9\x4d\xa5"
+ "\x6e\x41\x07\x64\xe3\x59\x2d\xef\x64\x20\xc6\xdd\x34\x59\xe5\x2c"
+ "\x69\x48\x74\xcb\x2d\x5a\x2a\xb7\xec\x13\xf6\xc7\x03\x5d\x82\x67"
+ "\x95\xf5\xc4\xa0\x88\x39\x88\x43\x1b\x3b\xce\x92\xcd\xa9\x94\x6f"
+ "\xd4\x80\xef\xd5\x0a\xc0\x93\x91\x57\x05\xec\x89\x71\xe8\xaf\x8f"
+ "\xd0\x3c\xc0\xd2\x68\x37\xd0\x8d\xc7\xf8\x13\x70\xb7\x3b\x93\xc4"
+ "\x79\xb0\x07\x36\x5d\xe9\x39\xdf\x89\x8e\x4c\x6c\x81\x77\xe1\x78"
+ "\xfe\x53\x25\xc4\xa1\x95\x99\x24\xb6\x12\xde\x09\x67\x75\x42\xbd"
+ "\x67\x69\xa3\x28\xbf\x52\x4d\xaa\x9f\x27\x11\x8a\x93\xec\xfc\x57"
+ "\x37\xd0\xde\x7b\x06\x42\x79\xc5\xcc\x93\x2a\x62\x52\x1f\x05\xdb"
+ "\x5c\x03\x7c\x29\xaf\x70\x82\xfd\x02\x5a\xba\x83\xa3\xe5\x93\x25"
+ "\x17\x8a\x96\xce\x18\xfd\x1e\x46\xcf\x14\x82\x34\xeb\x4d\x4f\xa4"
+ "\xf1\xa6\x36\xa0\x27\xd0\xd5\xda\xe2\x86\x58\x92\x2c\xf2\xd0\x73"
+ "\x17\xd0\x13\x68\x1a\x8d\x34\x05\x7a\x08\x34\xa5\x22\x4d\xab\x25"
+ "\x34\x05\xdd\x25\xec\x25\x88\x34\xe5\x81\xa6\xd5\x7e\x68\xda\x13"
+ "\xcf\x03\x4d\x77\x07\x44\xd3\x7d\x43\xa0\xe9\xaf\x6d\xfe\x68\xea"
+ "\x42\xbf\x41\x5f\x5e\x46\x41\x2f\x5a\x5d\x87\x84\x7d\x31\xc1\xe7"
+ "\x3b\x02\xbe\x6b\x2b\x2f\x6f\xa8\xc0\xf3\xbc\x71\x6c\x1e\xcf\x1b"
+ "\x13\xf6\x71\xda\x47\xcf\xbb\xf5\x8d\x76\x4c\x03\xbd\xa6\xb9\x0b"
+ "\xe7\x03\x69\x6d\x60\xbb\x68\x6d\xd3\x39\xec\x0b\x4b\xba\xbe\x1b"
+ "\x7d\x6a\x7d\xd3\x5d\x3c\xd5\x10\xd4\x29\x0b\x26\x92\xf0\x6e\xd0"
+ "\x1b\xda\x4c\x72\x63\x19\xe8\xc2\x6e\x9d\xe5\xc8\x09\xd9\x8c\xfd"
+ "\xd3\xb5\x3c\x85\x2b\x17\xf7\x77\xe4\x41\xe7\x82\x2e\x17\xf8\x8b"
+ "\x3c\xc3\x31\xbe\xc6\x05\xb8\xde\x64\xe6\xeb\x9f\xa6\xb8\x48\xae"
+ "\xa6\x2f\x7f\xf9\xdc\x64\xf0\x3d\x07\x97\x13\x3c\xf3\x30\xbb\x1d"
+ "\xf9\x5a\x43\xac\x6d\x5e\x39\xe1\x45\x1d\x8d\xbc\x40\xb9\x40\x19"
+ "\x29\x95\xe8\x66\xd0\xfb\xca\x2a\xf1\x0c\x10\x77\x01\xe8\x66\xdc"
+ "\xef\x1d\x78\x89\x67\x83\xf4\x2b\x1f\x9b\x41\x3e\x36\x09\xe7\x33"
+ "\x45\x03\x3d\x6a\xba\xbb\x18\x0f\x91\x67\x56\x97\x59\xe0\x5f\x99"
+ "\x68\x0b\x18\xdd\x2d\x7f\xa6\x34\x19\xfc\xb9\x49\x6a\x5e\xdf\x68"
+ "\xa3\x5d\x9a\x31\x78\x46\x17\xc4\xfc\x71\x51\xa9\xe0\x3f\x7d\x07"
+ "\xb6\x62\x35\xe0\xeb\x14\x89\xdd\xbd\x1a\x7c\xa2\x2e\x3c\x67\x0d"
+ "\xea\xb3\x91\x9d\x4f\xcb\x17\x3e\x11\x0f\xef\x84\xfd\x2a\x79\xcf"
+ "\x7e\x95\x67\xd4\xd8\x0f\xe1\xed\x1f\x5a\xa3\xe6\x7a\xbe\x59\x22"
+ "\x33\xb8\xe5\x93\xd4\x6c\x7d\xe9\xac\x55\x6c\x0c\xb9\x4d\x38\xcb"
+ "\xb5\x43\x36\x6b\x0f\xeb\xc7\xfd\x26\x55\x9b\x83\xf3\x7e\x66\xcd"
+ "\xa5\xc5\xdf\x27\x6b\xf1\xac\x6d\xcf\xbb\xdc\x64\xa4\x83\xea\xce"
+ "\x3c\x02\xba\x7c\x52\x22\x9e\xc1\x8e\x7b\x7f\x05\x87\xc5\x59\xc2"
+ "\x7e\xb7\xee\x12\x99\x11\xe8\x94\xc0\xeb\x65\x16\xd0\x29\x71\x74"
+ "\x25\xb4\xf5\x79\x68\xeb\x09\xa0\xeb\x09\x68\xeb\x06\xb1\xad\xe2"
+ "\xd9\x73\x3c\xd0\x1f\xde\xf5\x6f\x1b\x3d\x6d\x5d\x09\xf4\x2e\xfa"
+ "\x32\x6e\xcb\x49\xf2\x23\x0a\xfe\x78\x63\x87\xb0\xb6\xa7\xcb\xea"
+ "\x3a\x4a\xf0\xbb\x82\xed\x2e\x29\xd7\xcc\x05\x3c\x22\xcd\xc1\x5f"
+ "\x00\x9b\xd7\x60\xf0\xf0\x01\xeb\x43\x9d\x9a\x31\xd5\xab\x49\x9c"
+ "\x40\xfb\x53\x64\x12\xca\x33\xd0\x3e\xb6\x1a\xe9\xef\x7b\xfe\xf3"
+ "\x38\x81\x07\x23\x81\x07\xab\x45\x1e\xe8\x44\x1e\x80\xbf\x0c\x76"
+ "\x38\x02\xe2\xc6\xe8\xea\x02\xc6\x83\xe0\x68\x94\xe4\xf7\xbc\xc2"
+ "\x10\xe5\xb5\xd3\xbf\xbc\x3e\xdd\xd8\xcd\x62\x64\x19\xee\x9b\x49"
+ "\x23\x9b\xee\xe1\x9d\x20\xb7\x7a\x51\x6e\xa9\xe6\x11\x8f\xcc\x1e"
+ "\x97\xcd\x5e\x11\x98\xcc\x3e\xf5\xcc\xff\x52\x99\x1d\x77\x61\x65"
+ "\xf6\xe9\x9b\x7c\x65\xf6\xe9\x39\xbe\x32\xfb\xf4\x68\xaf\xcc\x8a"
+ "\xef\x86\x45\x66\x9f\x56\x5d\x1a\x99\x7d\x5a\xd5\x8f\xcc\xb6\x04"
+ "\x20\xb3\xd1\x7e\x64\x36\xfa\xc2\xc9\xec\x6f\x1e\xbf\x78\x36\xf6"
+ "\xb7\xdb\xba\xb9\x7e\x6c\xec\x66\x89\x8d\x55\xa0\x8d\x9d\x13\xdd"
+ "\x9f\xbc\x3a\x2b\x41\x5e\xe5\xa2\xbc\x3e\xfb\x17\x28\x6f\xee\xb5"
+ "\x87\x8e\x0c\x2e\xaf\xae\x4a\xaf\xff\xe4\x57\x66\x35\x28\xb3\xfb"
+ "\x88\xd5\x26\xc8\xec\x22\x8f\xcc\x56\x8a\xb1\xd0\x00\x72\x3b\xce"
+ "\x9f\xdc\xe2\x79\x5c\x78\x16\xd7\x80\x72\x2b\xfa\x4b\xce\xf1\x28"
+ "\xb7\x86\xcb\xcc\xd6\xce\x3d\xec\x2b\xb7\xbf\x95\xfb\xca\xed\xdc"
+ "\x4f\xbc\x72\x2b\xbe\x1b\x16\xb9\x9d\xdb\x7a\x69\xe4\x76\x6e\xeb"
+ "\x0f\xc7\xd6\xfe\xd6\xef\xfc\xff\xe1\xb7\xb5\xcf\x3e\x26\xc8\xad"
+ "\x3f\x5b\x9b\x2b\xda\x5a\x05\xda\xda\xdf\x7d\x1e\x98\xec\x26\x37"
+ "\xfe\x2f\x97\xdd\x0b\x6c\x73\x9f\xf9\xa3\xaf\xec\x3e\x63\xf6\x95"
+ "\xdd\x67\xb6\x78\x65\x57\x7c\x37\x2c\xb2\xfb\xcc\xf6\x4b\x23\xbb"
+ "\xcf\x6c\xff\xe1\xd8\xdc\x67\xfd\xce\x95\x53\x4d\x20\x79\xc7\x64"
+ "\xf3\xae\xb5\x56\x0a\xf3\xf8\xf2\xac\xae\x07\x09\x9b\x6f\x32\xef"
+ "\x01\x6b\x74\x3c\xe1\x8b\x5d\x29\x78\x2e\x04\xce\x7b\x29\x97\xcc"
+ "\x2b\x61\xf3\x20\xe6\x3d\xe3\x99\x17\xb3\x5b\x3c\x3b\x62\xa0\x79"
+ "\x31\xb4\xc8\x29\xce\x9f\x98\xb7\x9d\x61\xc3\xe9\xf0\x3c\xb3\x7d"
+ "\xab\xe6\x55\xd0\x17\x9d\x76\xfb\x68\xa7\xdd\xdf\x58\x51\x64\x3e"
+ "\xa5\x78\xe6\xd2\x99\x09\xa5\xaa\x33\xc5\x84\x94\x09\xe3\x30\xf3"
+ "\x9a\xa1\x8d\x0e\x36\x1f\x62\x9a\xf2\x4c\xc1\x6c\x02\x69\x6d\x9e"
+ "\x34\xe1\x0c\xec\x82\x30\xca\xc3\x3b\xaa\x7f\xd9\xb5\x3b\x87\x44"
+ "\xe0\x5e\xa0\x77\x9e\x43\x2c\xce\xeb\x04\x1d\x31\x0e\xcf\x6d\xc2"
+ "\xb3\x32\xe8\x4f\x7e\xda\x59\x7d\x9a\x84\x37\x6d\x15\xfa\x9e\x71"
+ "\x3e\xcd\x1e\x3d\xe2\x3f\xec\xf6\x0a\xca\x85\x13\xbe\xaa\x34\x82"
+ "\x2a\x2c\x36\x61\xfe\x2e\x60\xc5\x33\xc7\x06\xcf\x3c\xe3\xc7\xeb"
+ "\xf7\x79\xf6\xa2\xa4\x50\xbf\xbf\xe6\xd8\x39\x3c\xab\xbc\x3a\x9d"
+ "\x28\xe1\x92\x53\x9d\xc5\xd6\x55\x38\x3f\xdb\xd3\x97\xe8\x77\x2e"
+ "\x36\x9e\xe3\xfb\xd3\xe8\x70\x71\x3e\x0f\xae\xa9\xad\x10\xbe\xc3"
+ "\xf1\x45\x6e\x48\xa7\x05\xb9\xc2\xd9\x59\x51\x40\x0b\x9c\x3f\x8b"
+ "\x67\x1a\xf1\xd5\xa5\xaa\x17\x6e\x20\xe4\x9d\x4d\xed\x1c\xce\xdd"
+ "\x70\xff\xcb\x4f\x3b\x0d\x39\xbf\xc0\x3d\x27\x84\xfd\xca\x8f\xcb"
+ "\x9e\xdb\x98\xf4\x0d\x3b\xb3\x17\xfe\xdf\x86\xe3\x2f\x33\xe1\x19"
+ "\xc7\xf2\xf9\x33\xd1\xe1\x98\x17\xd2\xef\x36\x64\xfe\x9d\x44\x69"
+ "\x49\x84\x1e\xda\x26\xe6\x15\xd6\x70\xd8\x64\xcf\x09\x6b\x3a\xe0"
+ "\x79\x1c\x8e\x19\xc0\xef\x22\x70\xce\x12\xad\x2c\x8d\x10\xf4\x43"
+ "\x89\xc5\xc6\x8f\x2f\x8d\x10\xe6\x9e\x42\x3b\x4b\xa1\xcd\x90\x47"
+ "\x8e\xf3\x73\x84\x7b\x0e\x51\x6e\x4f\xc7\xbd\x4d\x9f\xdb\x0a\x77"
+ "\xb9\x61\x35\xce\x2d\x99\x6f\xc7\xb2\xfd\xce\xf1\x97\x5b\x6c\xb4"
+ "\x20\x9c\xb0\x75\x3a\xb2\xbf\x1d\x93\x2d\x88\x8d\x92\x51\x4a\x2b"
+ "\xf5\xfb\x5e\xc0\x3e\x6e\x9c\x57\x2d\xcc\x15\x7f\xce\x0d\xe5\x87"
+ "\xef\x16\xfa\x70\x9f\x3b\x62\x93\xcd\x2f\xea\x99\x93\x2f\x8c\x37"
+ "\x2d\x98\x8c\xdf\xc1\xdf\x88\xf9\xc5\xf3\x8d\x2c\x36\x55\x4e\x18"
+ "\x85\xf7\xe3\xd9\xdc\xeb\x88\x65\x5d\x85\x0b\x62\xbc\x73\xce\x84"
+ "\xdf\x01\x96\x16\x60\xff\xaf\xb0\x07\x3d\x3e\xfb\x9d\xd7\x2c\xf2"
+ "\xad\x31\x1a\xb0\xd1\x9b\x77\x1e\x8c\x00\x2e\x3c\x18\xc1\xfa\xbe"
+ "\x9b\x63\xe3\xd8\xf8\xc6\x82\x8f\x30\x9f\x1e\x78\xe8\xde\x15\x1d"
+ "\x2e\xec\xf9\xed\x44\xbe\xe0\xfc\xf8\x85\xeb\x91\x2f\xa5\x60\x0b"
+ "\xc4\xbc\x15\xde\xfa\xe3\xf3\x42\x81\x9f\x3c\xf0\x82\xcd\xd3\x5f"
+ "\xf8\x84\x70\x7e\x0c\xe8\x0c\x9c\x23\x6e\xcc\x82\x7a\x21\x6e\x01"
+ "\x23\xef\xa4\x3b\xb8\xea\x4c\x96\xfe\xd7\xd3\x0e\x0e\xe7\x7d\x60"
+ "\x5f\xb8\xee\x79\x12\x8e\x7d\xea\x58\x26\x8d\xd1\x0b\xeb\x16\x04"
+ "\x3e\x6e\x02\xde\x65\x02\x76\x81\xe6\xa5\x40\xbf\xea\x6e\x61\xbc"
+ "\x6a\x5f\x35\x4f\xe4\x3c\xe4\xb3\xc9\x16\x6e\x85\xf2\x94\x55\xd7"
+ "\x51\x3b\xce\xcb\x06\x1a\x6e\xea\x2a\x5c\x98\xe2\xa1\x21\xd6\x09"
+ "\xe7\x55\xeb\x84\xf9\xf5\x0b\x8e\x30\x0c\x2d\x78\xcb\xd3\x66\x7f"
+ "\xf4\xd4\xbd\x43\x62\x74\x77\x92\x78\x5e\x7e\xab\x9a\x86\xfd\x74"
+ "\x0f\xf6\x37\xcf\xea\x20\x04\xf7\xb8\x4f\xda\xf6\x05\xb5\xda\xdd"
+ "\x84\x57\xdc\xaa\xc6\xb1\x09\xf7\x0b\xb7\x8f\x4d\xda\x08\xf4\x02"
+ "\x7b\x9f\xeb\x20\x4a\x6b\x8e\x9d\x9d\x73\x46\xbe\x27\xee\x75\xa0"
+ "\xc3\x41\xaf\x83\x4d\x0d\xcf\xfd\x9e\x5c\x8f\xf4\xe2\x15\x0d\x89"
+ "\xc7\x65\x29\xf7\xce\xcd\x20\x79\xc1\xe9\xd1\x14\x61\x5e\x2e\xfa"
+ "\x17\xa0\xf3\x39\x9c\x4f\x67\xb5\x83\x7f\xa2\x6b\x48\x0c\xb2\x9c"
+ "\x44\x7f\x3a\x12\xdb\xcd\x63\x3f\xb4\xd8\xe6\x24\x6c\x73\xa7\x83"
+ "\x60\x5f\xfe\xac\xb5\xb8\x97\xe8\x59\xc2\xeb\x6e\x55\x63\x9b\xc1"
+ "\xd7\x31\x07\xdf\xa7\x9f\x62\x1c\xe8\xdb\x14\xe8\xcd\xbf\xf0\xd3"
+ "\x3d\xbc\xdc\x62\xc6\x6f\x63\x1d\x70\x7d\xcd\xac\xb3\x44\xa0\x3b"
+ "\xd2\xdf\xea\x70\x13\xaa\x90\xd6\xc1\x15\x64\x1d\x16\xf9\x6f\xff"
+ "\x9d\x24\xa6\xe4\x1d\xc6\x77\xf7\x0b\x22\x0d\x34\x38\x46\x66\x31"
+ "\xe3\x1e\xf7\xb3\xb0\x0e\xf6\x93\x64\xe6\x49\x22\xf0\xdf\xaa\xee"
+ "\x20\xee\xb0\xdb\xc7\xe2\x9c\x0a\xe4\x7f\x8e\x0b\xf8\x7f\xce\x81"
+ "\xfb\x7f\xd8\xad\x79\xe7\x09\xfa\x2f\xae\x33\x6a\xae\x2f\xff\x17"
+ "\xdf\x3b\x37\x2b\x58\xfe\x2f\x1e\x26\xfe\x2f\xbe\x0c\xda\xbf\x24"
+ "\x84\xf6\x2f\x19\xa6\xf6\x2f\xb9\x0c\xda\x9f\x1a\x42\xfb\x53\x87"
+ "\xa9\xfd\xa9\x7e\xdb\x3f\xed\x7a\x9e\x0a\x73\x6d\x22\xeb\x6a\xd0"
+ "\x06\x30\x7b\xb5\xf4\x0e\x9c\x4b\x23\xac\xa7\x12\x9f\x09\x5b\x5f"
+ "\x15\xd1\xeb\x59\xde\xeb\x59\xd9\xeb\x79\x5c\xaf\xe7\xe8\x5e\xcf"
+ "\x31\x9e\x67\xb0\x23\x23\x4e\xc9\x52\xab\xc0\x2f\xcd\xb3\xc9\x96"
+ "\xc6\x8b\xef\x63\x71\x7f\x1c\xb0\xe9\xb1\xfe\xce\xda\x53\xc8\x08"
+ "\x75\x72\x94\x08\x67\xe0\xc9\x96\xbe\xd5\x5d\x40\x28\x0d\xbb\x41"
+ "\x8d\xe7\x94\xf1\x25\xe5\x19\xb3\x40\x4f\x5b\xed\x0e\xf0\xf3\xa3"
+ "\x47\x42\xd9\x3f\xc1\xf3\x17\x91\xaf\xaa\x74\x9c\x5b\xb3\x74\x07"
+ "\xb6\xf3\x4e\xad\x81\xf0\x61\xb7\x0b\x73\x1b\x78\x5d\x79\x86\x3d"
+ "\xec\xf6\x1b\xe8\x8e\xa6\xd9\xba\x02\x3e\xc2\xda\xd1\x42\xf4\x1c"
+ "\xaf\xca\xce\x06\xfe\x76\xec\x27\x9b\x3b\x68\x7b\xb6\x8b\x3a\xac"
+ "\xf3\x0d\x24\xd7\x8e\xe7\x97\x98\x49\x93\xbd\x45\x38\xc3\x44\x38"
+ "\xab\xc5\xbe\x9f\xa0\xff\x93\x8b\x79\x20\xad\xc9\xfe\x16\x69\x84"
+ "\x67\xc3\xea\xaf\xa0\x9d\xcb\x9e\xb0\x76\xbc\x05\xf1\x52\xb9\x96"
+ "\x97\x97\xcf\xa1\xf2\xf2\xe4\xc6\x0e\x3c\xa3\xb5\x7c\x3e\xd6\xb5"
+ "\x09\xea\x61\x75\xd5\x62\x9c\x35\x5f\x28\xb7\xb3\x59\x88\x49\x71"
+ "\xcc\x96\x57\x40\x7e\x45\x79\x32\xd6\x0f\xeb\xd6\xff\x38\x6c\x5d"
+ "\x1b\xd4\xfd\xc1\xb9\xea\x70\x82\x6b\x20\x82\xc3\xc8\xb2\x34\xbf"
+ "\x7e\x74\x89\x31\x95\x95\x1b\x11\x4a\xb9\x7e\xf5\x3f\x94\x2b\xd6"
+ "\x57\x19\x42\xb9\xcb\xfb\x9c\x79\xed\x2d\xd7\x24\xd6\x57\x15\x4a"
+ "\xb9\x19\x03\x94\x2b\xd6\x37\x21\x94\x72\x2d\xfe\xcb\xad\x17\xeb"
+ "\x9b\x17\x42\xb9\x1a\xbf\x6b\x08\x11\x0f\xa1\x61\x41\xe3\x77\x7d"
+ "\x31\x62\x21\x34\x1c\x68\x06\x68\xbf\xb1\x2d\x34\x0c\xac\x50\x0d"
+ "\x84\x81\xd0\xf8\xbf\x62\x40\xfe\x87\xc6\xfb\x15\xe6\x81\x78\x1f"
+ "\x1a\xdf\x9f\xf7\x8b\x7f\x8c\x0d\x80\xf7\x7b\x68\x64\x53\x02\xaf"
+ "\x2f\xdf\xc3\x47\xd6\xbd\xf6\x02\x9f\x40\xa6\x6d\x21\x24\xaa\x82"
+ "\x5c\x3b\xad\xea\x0b\x9a\x20\xc4\xdc\xcf\xef\xdf\x52\x49\x38\x88"
+ "\xa1\xb9\xb7\x37\xb5\x72\x56\x57\x3c\xea\x2d\xf7\xde\x4c\x87\xec"
+ "\x67\x90\xfe\x09\xd8\xc1\x4e\xf0\x65\x59\x59\xe5\x7b\xf4\x39\x09"
+ "\x44\x58\x1f\x07\x71\xc4\xac\xb5\x5f\x50\x5c\x77\x9c\xf4\x3d\xe8"
+ "\xd7\x0a\xdc\xab\x90\x5c\x0b\xbf\x75\x01\x8e\xa1\x1c\x07\x79\x97"
+ "\xb7\xcb\x66\xd9\x85\xbc\x76\x61\x7e\xba\xbe\xee\x35\x8c\x15\x68"
+ "\xae\x1a\xf7\x1d\xb3\x1f\x97\xad\xbc\x25\xcc\x4e\xb8\x6a\xe1\xec"
+ "\x9c\x95\x2a\x9b\x2c\x4d\x29\xae\x31\xed\x10\xf6\xc7\x83\xba\xe3"
+ "\xfe\x78\x2f\x40\xdc\x80\xf9\xef\xd4\x12\xae\x4e\xd8\x4f\x78\xe5"
+ "\x0c\xdc\x33\x6f\xa0\xb5\xda\xee\x12\xcb\x56\xfc\x3d\x2d\x01\xfb"
+ "\x7c\x92\x70\x4d\x9d\x76\x42\x63\x4a\x89\x1e\xe2\x93\xe9\x13\xb1"
+ "\x3f\xe5\x34\xc9\xd9\x42\x79\xec\xdb\xa2\xf2\x86\x78\x9c\x7b\xc8"
+ "\xf6\x73\x5f\xd9\x8e\xb1\xbe\x78\x66\xd2\x0d\x27\xe0\x59\x88\x91"
+ "\x70\x0e\x8e\xbc\x5c\x4d\xf5\x8a\x84\xa6\xce\xd3\x84\xed\x49\xbe"
+ "\xf2\x1b\xdc\xbb\xec\x8c\xdc\x92\xd7\x29\xb7\x14\x41\xbd\xda\x3c"
+ "\x6d\xc0\xef\x7b\xd2\x31\x26\xc4\x7c\x5d\x85\x69\xe1\x9e\xb5\xdb"
+ "\x7e\xce\x15\x1e\x9b\x14\x4d\xed\x48\x5f\x56\x97\x55\x2b\x90\x07"
+ "\xe0\x87\x64\x75\xe6\xaa\x27\xb0\x3e\x92\xb4\x32\x8c\xb5\xa1\xde"
+ "\xa9\x2c\xee\x2d\x4f\x15\xd6\xe9\x83\x3d\x98\xab\xe6\x82\xf4\x89"
+ "\xd3\xe6\x63\xdb\x0c\x13\xd0\xfe\xae\x7a\x0a\xca\x7f\xe8\x98\x2c"
+ "\x8d\xed\x53\x59\x52\x9e\xc5\xd6\x5f\xa6\xcd\x86\x6f\x64\xc1\xb3"
+ "\x0a\xf3\xc1\xfb\x16\xf1\x7d\x9e\xe4\x7d\x1e\xce\x45\x15\xdf\x77"
+ "\x8a\xef\xb7\x4a\xde\x6f\xd5\x4e\xc0\x7e\x8f\x55\x31\xd8\x06\xa0"
+ "\x63\x0a\xbc\xcf\x10\xf6\x38\x10\xce\x73\x2c\x4f\x11\xf3\x65\x74"
+ "\xc8\x56\xdd\x7b\x06\x30\x06\xef\xb3\x25\xbf\xcf\xae\xcb\x8a\x23"
+ "\xd3\xaa\x90\x86\xab\x12\x6d\x5c\x83\xb8\x36\x3b\x6d\x8e\xd0\x76"
+ "\xb0\xa1\xd2\xf2\x6c\xb2\x55\xe3\xd0\x4e\x76\x82\x8f\x06\x79\xa6"
+ "\xe0\x37\xa5\xf4\xf6\xac\x02\x55\xa5\xae\x5a\xa4\x5a\xb2\x66\xfd"
+ "\x6a\x5c\xc5\xe7\xbb\x3e\x4d\x89\xeb\x5c\xf9\x12\xb3\xc6\x5a\x81"
+ "\xeb\xee\x94\xc2\x1a\xef\xed\xc0\x47\x97\xbe\x71\x8f\x3b\xb2\x31"
+ "\xce\xad\x6f\x98\x9d\x7b\x96\x70\x39\xd1\xf4\x4b\xc3\xa6\xa9\xe4"
+ "\x94\x6c\xd5\x97\xc2\x39\x91\x2a\x61\x4f\xfc\x4e\xc3\xa6\xff\xc2"
+ "\x34\x61\x2f\x30\x6b\x0a\x4b\xfb\xb7\x1c\x33\xf7\x71\x4e\x2b\x67"
+ "\x49\x39\x4d\xea\xa2\xed\xc4\xa8\x3a\x8d\xfb\xc2\x76\xfe\x1b\xdf"
+ "\xcc\xe1\xdc\xdc\x53\xb2\xd5\x4f\xe0\xb7\xb0\xff\x00\xff\x67\x7d"
+ "\x21\xab\x1a\xf1\x3b\x38\x6f\x11\x68\xf3\x37\xfc\x1e\xb4\xaf\x39"
+ "\xac\x12\xe7\x39\x13\x39\xe4\xd3\xf1\x3a\xb3\x46\x90\xf7\xc2\x55"
+ "\x79\x2e\x4e\xfe\x27\x71\x5d\x1f\xa9\x1c\x8b\x73\x74\x57\x67\x49"
+ "\xd6\xb9\xc9\xcf\x70\xe4\x51\x48\x2b\xf1\xec\x59\x81\x67\x07\xf9"
+ "\xd3\x1f\xe7\x21\x4e\x3e\x5f\xa9\x2f\xe2\xe5\x66\xa0\xaf\x59\x63"
+ "\x06\x0d\x16\x25\x9c\x45\xdf\x0d\x75\xd1\xa6\x51\x85\x39\x39\x07"
+ "\xe5\x14\x68\xf1\x67\x9c\x43\x18\xd9\xb8\xe7\x2d\x9c\x33\xa8\x6f"
+ "\x8c\xfb\x53\xa6\x83\x3b\x64\xa9\x25\xaa\xdf\xa2\x8f\xb5\xda\xfd"
+ "\xeb\x54\xea\xba\xbd\xc5\x40\x2c\x6d\xef\x93\x4f\x8f\x98\x89\x7c"
+ "\x3e\x09\xcb\xb5\x51\xb7\xd0\x97\x90\x41\xb8\x24\x1b\x09\xc3\xfd"
+ "\x94\x70\x0f\x75\x3c\x2f\xbd\xc9\xd1\x08\x7e\xcf\x3b\x19\x6f\xe7"
+ "\xb4\x8f\x50\x3d\x4d\xc0\x5f\x62\x63\xd2\xc2\x1a\x20\xbb\xb0\x2e"
+ "\x5b\x81\xfd\xe3\x92\xb5\x3f\x19\x5b\x4e\x92\x88\x46\xcd\x51\x92"
+ "\x9d\x42\x79\x9c\xe3\x97\x94\x12\x46\x85\xf5\x3f\x59\x90\x59\x0b"
+ "\x3c\xdd\xa0\x8e\xdc\x99\x49\xc6\x35\x65\xd8\x88\xb5\xdd\x4c\x76"
+ "\xa5\x93\x71\xb4\x4b\x33\xda\x62\x39\x44\xa8\x5e\xad\x7a\x37\xc7"
+ "\x30\xc2\x33\x1f\x2b\x2a\x5f\x86\xfd\xa1\x91\x25\x38\x2f\xeb\x1c"
+ "\x89\x5b\xf8\x55\x9e\xd0\x87\x8b\xfd\xe5\xae\x2e\xb5\xca\xd9\xa5"
+ "\xbe\xb9\xbb\x4b\x3d\xc1\xd3\xcf\xfe\xdc\x0a\x25\xa9\xc2\x75\x43"
+ "\x85\x8b\xe4\xb8\x6e\x08\xfd\x4b\x97\x62\x92\x1a\xfb\xd4\x85\xfd"
+ "\x61\x36\xa8\x63\xf8\x25\x6a\x72\x97\x5d\x58\x97\x84\xfd\xfc\xca"
+ "\xea\xc5\x50\xdf\x8e\xd3\x44\x3a\xb7\xe8\xfc\x06\x35\x87\xf3\x8a"
+ "\x68\xe1\xea\xbd\xdd\x55\xfa\x22\x9c\x5f\x04\x76\x21\x3e\x78\xd9"
+ "\xd6\x0a\xfe\x33\xb6\x1f\xf8\xb1\xe7\xad\xd3\xc8\x1f\xe0\xd3\x69"
+ "\x3b\x87\xbc\x68\x4c\x45\x3e\x34\xfb\xf0\x41\xe0\x5b\xba\x83\x43"
+ "\x7e\x20\x2f\x90\x27\x5e\x7e\x7c\x2e\xf0\xe3\x2d\x9e\xf1\xa3\x1b"
+ "\xec\x81\x87\x27\xe7\x63\xf4\x15\x03\xf1\x05\xf9\x81\xbc\xb1\xb4"
+ "\x1d\x25\x3e\x3c\xb1\x33\x9e\x00\x3d\xc7\x7a\xf8\x82\x3c\xb1\x76"
+ "\x80\xcf\x0b\x7c\x79\xf2\x73\x42\x7e\x3d\x91\xf2\x8d\x33\x3e\xeb"
+ "\xe1\x8f\xcb\x1f\x7f\xbe\xf1\xf2\x07\x78\xdf\x97\x3f\x27\x95\x38"
+ "\xee\x83\xfc\x29\x0b\x86\x3f\x96\x36\xc6\x1f\x97\xc8\x9f\x89\x89"
+ "\x84\x73\x74\xa9\xb9\x1d\x99\x24\x7e\xc6\x57\x2a\x62\x4a\x6e\x24"
+ "\x40\xeb\xc9\xbc\xce\x92\x15\x9a\x1c\xad\xdb\x1f\xb8\x1c\xa5\x4f"
+ "\xbf\x2a\x47\xc1\xca\xd1\xda\x8e\xa1\xc9\xd1\xba\xbc\xab\x72\x74"
+ "\xb1\xe4\x68\x5d\x76\x6f\x39\xea\xb1\xd5\xe9\x4b\x57\x2d\x5a\xb1"
+ "\x7a\xc5\xea\xe5\xaa\xc5\x1b\x33\x96\xae\x63\x16\xdb\xc7\x66\x47"
+ "\xbb\x73\x12\x38\x3c\xf3\xdc\x52\xd1\x4c\xde\xbd\xa1\x99\x73\x7f"
+ "\x1d\x1d\x4e\x4b\xa6\x6a\xf9\x92\xa9\x76\x3c\xff\x1c\xe5\x0d\xcf"
+ "\x45\x3f\x2e\xdb\x68\xc3\xbd\x00\xd9\x3e\x2a\x1b\x85\xf9\x97\xe0"
+ "\x1b\x46\xe3\xf8\xcb\x0b\x9b\x48\xf8\x0b\xb8\x2e\xda\x81\xfd\x1c"
+ "\xc2\xfb\x27\x70\xdf\x32\x5a\x55\x1a\x8d\x7b\xd9\x74\xca\xcb\x55"
+ "\x5b\xa1\x2c\xbb\xc2\xac\x09\x57\xe1\x3a\x92\xf5\xad\x60\x8f\x2b"
+ "\xbc\x7b\x13\x6d\x94\xd3\x91\xeb\x27\xa1\x9c\xe3\x9a\xbe\x53\xb2"
+ "\x4c\xc5\x79\xdc\xbb\x1d\xfc\xd7\xb9\x13\xe1\x3b\xe3\xf5\x15\xc2"
+ "\xbe\x0b\x20\xf3\xec\xfd\x06\x61\x4f\x33\xa7\xbc\x61\xb6\x70\x6e"
+ "\xbc\xbc\x71\xcf\x99\x92\xc6\xb8\x43\xd9\x35\x44\xf5\x34\xca\x7c"
+ "\xe6\x03\x4f\x56\x80\xcc\xcf\x36\x90\xc6\xe8\x3f\x91\x4f\x93\x01"
+ "\x6b\xc9\x83\xc9\xbc\x04\x63\x13\x02\x93\x79\x0f\xb6\x10\x53\x88"
+ "\x2d\xc4\xd5\x35\x80\x2b\xc4\x9a\x07\x5b\xe5\xe7\x18\xb6\xa2\x8e"
+ "\x10\xe5\xce\xd3\x80\x2f\x17\xc3\x17\xae\x73\x6e\xcc\xfa\xcc\xbf"
+ "\xec\x9f\xeb\x85\x2d\x4e\xc4\xd6\x06\xc0\xd6\x06\x2f\xb6\xe6\x1d"
+ "\x55\x92\x5d\x02\xb6\x52\xbc\xd8\xd2\x4d\x52\x7b\x70\x85\x18\x43"
+ "\x3c\xf1\xcb\xd5\x04\xe5\xdd\x83\xb1\xea\x65\x6c\xfc\x54\x90\x7d"
+ "\x0e\x64\xbf\x4b\x62\x43\xc7\x0f\x45\xf6\x37\x08\xfb\x3f\x20\x4f"
+ "\x90\x3f\xc8\x17\xe4\xc5\x95\xc8\x07\x3c\x1b\x9a\x76\xf5\xc7\x8b"
+ "\x85\x15\x83\xf1\x02\xf9\x80\xfc\x10\xf8\x00\xfc\xf0\x8c\x65\xe3"
+ "\xd8\x26\xf2\x04\x79\x71\x67\x36\xe1\x90\x2f\xd5\x20\xef\x28\xe3"
+ "\x40\xdb\x2c\xe4\x8b\xe0\xb7\x16\x28\x96\x6f\x1f\xeb\x3d\x33\xa6"
+ "\xab\x70\xe3\xa4\xbe\x3e\xeb\xc6\x04\xef\x3e\x6b\xeb\xdb\x58\x8c"
+ "\x61\x8e\x66\x63\x51\x9b\xfe\x20\xca\x30\xc1\x78\x4f\x88\xed\xdc"
+ "\x10\xdb\xc9\x21\xb6\x2b\x81\xd8\x0e\xfb\xde\x84\x3d\x08\x36\xea"
+ "\xd8\xb8\x18\xc4\x72\x8a\x86\x78\x88\x2b\x84\x3d\x11\x85\x31\x58"
+ "\x85\x25\x0f\xc7\x8c\xa8\x0e\xe2\xc6\xd7\x38\x02\xcf\x80\x1b\x77"
+ "\x90\x78\xd9\xf8\x96\x38\xc6\x6c\x67\xfb\xf3\x6d\xca\x66\xf5\x5b"
+ "\x2f\xcc\x53\x10\xc6\xe7\x38\x7e\x8f\xfb\x05\xdf\xf1\x39\xe9\xf8"
+ "\xed\xbb\x39\x76\x71\x6c\x6e\x93\xb0\xbf\x11\xea\x04\xd4\x63\x6f"
+ "\xe7\x34\x73\xde\xf1\xb9\xcf\xf0\xfd\x52\xdf\xf1\xb9\x4d\x82\xbf"
+ "\x67\x93\x6d\x2a\xc3\x39\x29\xf0\x3c\x83\xa5\xaf\xdf\x2e\x4d\xf7"
+ "\x8e\x7f\xb3\x74\x5c\x03\x25\xc6\xd7\x1d\x2c\xb6\xde\xb4\xcf\x13"
+ "\xc3\xfa\xf1\x67\x82\xd0\xb3\xb9\xf3\xbd\x7a\x36\x57\x88\x35\x69"
+ "\x74\x53\x62\x63\x1f\x3d\x8b\x7b\x5b\xe5\x98\x66\xa1\x9e\x2d\x69"
+ "\x48\x60\xf5\xdb\x7c\x2f\xd0\x24\x0c\xcf\x7a\xc3\x74\x5c\x2b\x84"
+ "\x3a\xb7\x4a\xd0\xc1\x4d\xf1\x5b\x85\x31\xf8\xcd\x73\x7c\x75\x6f"
+ "\x4e\x91\xaf\xee\xdd\xfc\xe2\xc0\xba\x77\xcb\x1d\x03\xeb\xde\xcd"
+ "\x1f\x5c\xd5\xbd\xa1\xea\x5e\xf0\xbb\x86\xa4\x7b\xb3\x1d\x57\x75"
+ "\xef\x85\xd2\xbd\xd9\x9d\x12\xdd\x3b\xc7\x57\xf7\xe6\xec\xeb\xab"
+ "\x7b\x73\x0e\x78\x75\xef\xe6\x14\x5f\xdd\x9b\xa7\x08\x4c\xf7\xe6"
+ "\x8e\xbe\xb0\xba\x37\x57\xed\xab\x7b\x73\x45\x3d\xb7\xc9\x1d\xbc"
+ "\xee\xcd\x3d\x3c\xb0\xee\xcd\xfd\xd2\x57\xf7\xe6\xee\x67\x3a\x36"
+ "\x4f\xce\x74\x6f\xae\x59\xd4\xc9\x2e\x69\xba\x57\xf7\xb2\xf4\xbe"
+ "\xba\x37\x2f\x76\x10\xdd\xab\x76\xf3\x1e\xdd\xdb\x0a\xba\xb7\x95"
+ "\xe3\x97\xfb\xd3\xbd\xdb\xe2\x1a\x51\xf7\xa6\xa3\xee\xdd\x16\x37"
+ "\xb0\xee\xdd\xba\x03\x75\xac\xb0\x57\xe5\x2b\xb4\x4d\xd8\x2b\xf0"
+ "\x15\xda\x8e\x78\x9c\x95\x0d\xe9\x90\x86\x7b\x2a\x62\x3e\xc6\x7b"
+ "\x8f\x8e\xce\x3b\xdc\xa3\xa3\x21\x1f\x7f\xbd\x57\x47\xa3\x7e\x46"
+ "\x3d\x5d\xf5\x0a\xb5\x55\xbf\x82\xe7\x6f\xe4\x13\x8f\xae\xd6\x41"
+ "\x1a\x9e\xb1\x81\xfb\x01\xe1\x7c\x44\xa0\x41\xdb\x0b\xf0\x3d\xcc"
+ "\x0f\xf9\xd4\xbe\x3a\x7d\xeb\x7c\x5f\x9d\x9e\xff\xdc\xc0\x3a\xfd"
+ "\x05\xd9\xc0\x3a\x3d\xff\xc5\xab\x3a\xfd\x52\xe9\xf4\x02\xcb\x55"
+ "\x9d\x3e\xb8\x4e\xef\x8f\x17\xbd\x75\xfa\x1d\xa2\x4e\xaf\xea\xd1"
+ "\xe9\x05\x66\xff\x3a\x7d\x6b\x76\x5f\x9d\xbe\xb5\xcc\xab\xd3\xf3"
+ "\x27\xfb\xea\xf4\x6d\x5f\x06\xa6\xd3\xb7\x1e\xbd\xb0\x3a\x7d\xab"
+ "\xcb\x57\xa7\x6f\x13\xcf\x2c\xcc\xdb\x28\xd5\xe9\x7c\x58\x20\x3a"
+ "\x7d\xdb\xdb\x1e\x9d\x8e\x3a\xf3\x6d\xbe\x55\xa2\xd3\x51\xb7\x6d"
+ "\xfb\xc0\x90\x79\x4c\xa2\xd3\xb7\x15\x31\xdd\xbd\xcd\xe6\x16\x74"
+ "\xfa\xb6\x4a\x96\x9e\x97\x25\x4d\xf7\xea\x74\x96\xee\x96\xea\xf4"
+ "\x76\xd4\xe9\xdb\x1c\x83\xe8\xf4\xb8\xc0\x75\xfa\x4b\xc9\x5e\x9d"
+ "\xfe\x52\xb2\x47\xa7\xa3\x1e\x47\x9d\x8e\x3a\x18\xf5\xba\xb0\x8f"
+ "\x96\x30\xa7\xa2\xf8\x93\x28\x3b\x89\xc0\x7d\x73\xb1\x0f\x03\x75"
+ "\xb1\xfe\x34\xd3\xed\x42\x9e\xd5\x2c\x0f\xe8\xe7\x36\xd0\xc9\xed"
+ "\xa0\x93\xdb\x75\xa7\x48\x38\xe4\x6b\xd5\xe3\xfc\x3c\x78\x46\xdd"
+ "\x1d\xd5\x01\x76\xc0\x25\xd8\x81\x56\xb4\x1f\x8c\x5e\xc5\x9f\xf8"
+ "\xda\x82\xc2\xaf\xfa\xf3\xd7\xcb\x24\xb6\xa0\xfa\x3a\xda\xd2\x55"
+ "\xf8\xfb\x08\x8f\x7e\xd7\xc3\x33\xda\x80\xb2\xd3\x82\x0d\xb0\x81"
+ "\x0d\x68\x63\x36\xe0\xf7\x93\x7a\xf2\x40\x1d\x84\x3c\xcc\x4e\xb4"
+ "\xbe\x80\xe7\x8f\xb1\x3c\xb3\x7d\xed\x44\xf1\x56\x5f\x3b\xf1\xfb"
+ "\x6d\x68\x27\xa0\x0d\x78\x56\x97\x8c\xd7\x99\x93\xdd\x55\xfa\x0a"
+ "\xb4\x19\xec\xfd\x8b\x13\x7b\xec\xc4\x75\x12\x3b\x91\xe5\xb1\x13"
+ "\xbf\x7f\xef\xb2\xb7\x13\x80\xe5\xc6\xec\x2b\xd1\x4e\x14\x75\x5e"
+ "\x0e\x76\x02\x79\x70\x8d\xa4\x6f\xd5\x1f\x1f\x70\x2f\x86\xc6\xb4"
+ "\x1f\x8a\x9d\x28\xb2\xfb\xb7\x13\xc5\x7b\xfb\xda\x89\xe2\x5a\xaf"
+ "\x9d\xf8\xfd\x7c\x5f\x3b\x51\x32\x3a\x30\x3b\xf1\xd2\x88\xde\x76"
+ "\x02\x69\xa6\x67\xf3\x02\x3a\xd0\x3e\xb8\x75\x96\x3c\x1e\x6d\x45"
+ "\x48\x76\xe2\xa5\x58\x5f\x3b\xf1\x92\x38\xe7\xbf\x70\x66\xf0\x76"
+ "\xe2\xa5\xcf\x85\xf1\x7e\x8f\x9d\x38\xd7\xdb\x4e\xbc\x74\xd4\xd7"
+ "\x4e\xbc\x54\xc3\xec\x41\x49\x04\xb3\x13\x2f\x19\x59\x7a\xe1\x0c"
+ "\x69\xba\xd7\x4e\xb0\xf4\xbe\x76\xa2\x44\x35\x88\x9d\x90\x3b\x63"
+ "\xf4\x15\xce\x92\xc6\x3c\xd7\xde\x52\xd5\xa4\xe4\x47\xdd\xbd\x65"
+ "\x80\x61\xdf\xcd\xce\xa5\xf1\x8c\xf9\x2c\x60\x63\x0c\xbc\xb8\xa6"
+ "\xb7\x3b\x46\x5f\x74\x3c\x0d\xe4\xa0\xc3\xbf\x1c\x80\x0c\x44\x78"
+ "\x64\xa0\x51\xf3\x15\x01\xb9\xe0\x70\x1c\x68\x17\xe0\xdf\xda\xd9"
+ "\x2a\xe8\x25\x79\x5b\x02\xc1\xbd\x14\x15\x1d\x44\xa9\x90\xc9\x46"
+ "\xe2\x18\x83\x1b\x64\x61\xfa\x44\xca\xff\xbc\x35\x81\x28\x34\x24"
+ "\x12\xe5\xe1\x1d\x71\xac\x01\xf7\x63\xc0\x31\x06\xc0\x61\xdc\xc2"
+ "\xbf\x79\xc7\x18\xba\x03\x18\x63\xb0\x66\xd9\x84\x31\x06\x5c\xa3"
+ "\xc4\x83\x0c\x08\xeb\x66\x70\x8c\xc1\x21\x8c\xcb\x28\x85\xb5\x2a"
+ "\xc2\x18\xc3\x31\x82\xe3\x0b\x9e\xfd\x58\x70\x5c\xe1\xe7\xc9\x84"
+ "\xc3\xfd\x1a\x76\x01\xfe\x4d\xea\x46\x82\x32\x10\xbc\x3e\xd2\x6d"
+ "\x1d\x68\x9e\x8d\x0b\x68\xea\x96\x37\xe6\xd1\x9d\x4d\xda\x3f\x1f"
+ "\x73\xc8\x70\xaf\x4a\x37\xf0\x88\x07\xbd\x43\xe5\xbd\xf4\x8e\x53"
+ "\xa4\xb7\x93\xd1\x1b\x78\x15\xb1\xa0\x93\x50\x48\x67\x7b\x55\x3a"
+ "\x6c\x80\x35\xf5\xd8\xaa\x4d\x48\xdb\x38\x52\x25\xee\x57\xc9\x6f"
+ "\xd6\x8c\xe6\x81\x9e\xb8\x36\xe1\xed\x73\x8e\x11\x6e\xf9\xad\xea"
+ "\x92\x6e\x32\x09\x74\x8c\x02\x75\x0c\xe0\x73\xcc\xee\x6e\xa0\xed"
+ "\x97\x8c\xb6\xb8\x6f\x1a\xde\x5d\x9b\xe1\x37\x4e\xf5\xcd\x4e\x27"
+ "\xd0\xd7\xc1\xe8\xbb\x60\xad\x92\x54\x7b\xc6\xd8\xc0\x3e\x37\x01"
+ "\x4f\x51\xc7\xcc\xea\x8c\xa2\x78\x1e\x84\xdb\xa9\x8e\xe1\xbf\x06"
+ "\xfa\x76\xe2\xd9\x1f\x6a\xe4\xbf\xb2\xfa\x38\x8e\x09\xfe\x9d\x8d"
+ "\xb1\x29\xc4\x7d\x30\x36\x83\xbe\x5f\xa1\x22\xd6\x7d\xa0\x6f\x47"
+ "\x96\x4c\x76\x56\xe9\x8b\xa8\x0c\xf4\x7d\x76\xb0\xf4\xd5\xb7\x5d"
+ "\x1a\xfa\xaa\x7e\x40\xf4\xd5\x59\x42\xa7\x6f\x99\xdf\xf5\xcf\x17"
+ "\x96\xbe\xca\x1f\x10\x7d\x4b\x27\x85\x4e\xdf\x3f\xec\x1d\x88\xbe"
+ "\xe8\xdf\x7b\x7c\x7b\x8f\x5f\x8f\xb6\x85\xd9\xc6\xed\x31\x5e\x9f"
+ "\x7e\x7b\x8c\x67\x2c\x12\x68\x13\xae\x13\xfb\x68\xb4\xcb\xf0\x0c"
+ "\x84\xf2\x3f\x78\xc6\x21\xd1\xa7\x16\x78\xb5\x13\x78\xb5\x1a\xd7"
+ "\xa0\x88\x7c\x02\x3b\xb0\xb0\x13\x74\xf5\x78\x7d\x85\x5b\x07\x76"
+ "\xe2\xf5\x52\x95\x1f\x9e\x71\xa8\xe3\x15\x19\x44\xb9\x40\xcb\x78"
+ "\xc7\x6f\x06\x9e\x75\x83\x7f\xe3\x68\x27\xb8\xa6\x34\xaa\x1d\xf4"
+ "\xaa\x53\x33\x7a\x3e\xf8\xcb\x1e\xbe\xbd\x93\xe9\x10\x7c\x9b\x7e"
+ "\xf9\xb6\xc3\x97\x6f\x67\xfa\xe1\x9b\x77\x6c\x1f\xfc\x4c\x81\x6f"
+ "\x36\x81\x6f\x82\x5e\xdf\x0c\xbe\x0d\xf0\xcf\xc3\x37\x41\xaf\x03"
+ "\xef\x04\xbe\x75\x1c\x23\x6e\x89\x5e\x47\xbf\x06\x79\x67\x49\x01"
+ "\xff\xb2\xb0\xac\x44\xe0\x1b\xfa\x99\x29\xc1\xf2\xad\xbc\x97\x3f"
+ "\xb3\xfd\x60\x60\xfe\x4c\xf9\x61\xf4\x59\xa4\xfe\x0c\x3e\x9f\x81"
+ "\x98\xd7\xad\xb0\x6c\xed\x0c\xc9\x87\x29\x6f\xf7\xf5\x61\xb6\xef"
+ "\x67\x75\x7a\xf9\xa6\xe0\x7d\x98\xed\xc2\x78\xd3\xdb\x3b\x59\x2c"
+ "\xe9\xeb\xbf\x6c\xaf\xf2\xf5\x5f\xb6\x6b\x99\x9f\xb2\xdd\x7c\xa6"
+ "\x00\xfd\x97\xed\x5b\x59\xfa\xcb\x2a\x69\xba\xd7\x7f\x61\xe9\xec"
+ "\xac\xf2\xed\x2d\xc1\xf9\x2c\x77\x5d\x62\x9f\x25\x6e\x00\x9f\x25"
+ "\xee\x0a\xf3\x59\x5e\x89\xbf\x6a\x53\x07\xd3\xf9\xdb\xdb\x43\xd7"
+ "\xf9\xff\x52\x71\xd5\xa6\x0e\x46\xdf\x57\xf2\x42\xa7\x6f\x85\x23"
+ "\x74\x9b\xba\x4b\xeb\xb5\xa9\xbb\xb4\xfe\x6d\xea\xce\xaf\xae\xda"
+ "\xd4\xfe\x6c\xea\xbf\xd8\x42\xb7\xa9\x3b\x6b\x7c\x6d\x6a\xe5\xf8"
+ "\xc0\x6c\xea\xae\x3b\x86\xdf\xa6\xee\x9a\xe2\x6b\x53\x2b\x23\x58"
+ "\x9d\x76\xac\x0f\xde\xa6\xee\xfa\xc6\xbf\x4d\xdd\xf5\xbd\xaf\x4d"
+ "\xdd\x65\x64\xb6\xb3\x32\x86\xd9\xd4\x5d\xad\x2c\x7d\x47\x86\x34"
+ "\xdd\x6b\x53\x59\x3a\xb3\xa9\x95\xea\xe0\x6c\xea\x8d\x97\xd8\xa6"
+ "\xaa\x06\xb0\xa9\xaa\x2b\xcc\xa6\x56\xf9\xdd\xff\xf2\xaa\xce\xf7"
+ "\xe8\xfc\xca\x29\xa1\xeb\xfc\x6a\xbf\x67\x14\x0e\xae\xf3\x5f\x4d"
+ "\xf5\xea\xfc\x57\x53\xfd\xeb\xfc\x3d\x87\xaf\xea\xfc\xfe\x74\x7e"
+ "\x55\x4b\xe8\x3a\x7f\xcf\x5e\x5f\x9d\xff\xda\xb5\x81\xe9\xfc\x57"
+ "\x6f\x1a\x7e\x9d\xff\x6a\x9c\xaf\xce\x7f\xd5\xc5\xea\xb4\x7b\x45"
+ "\xf0\x3a\xff\xd5\xa3\xfe\x75\xfe\xab\x5f\xf9\xea\xfc\x57\x6b\x99"
+ "\x6e\x7f\x4d\xc9\x74\xfe\xab\x16\x96\xbe\x5b\x23\x4d\xf7\xea\x7c"
+ "\x96\xce\x74\xfe\x6b\x31\xc1\xe9\xfc\xa8\x4b\xac\xf3\x95\x03\xe8"
+ "\x7c\xe5\x15\xa6\xf3\xff\x35\x2f\x74\x9d\xf4\xba\xc3\xab\x93\x5e"
+ "\x77\xf8\xd7\x49\xaf\xaf\xba\xaa\x93\xfa\xd3\x49\xaf\xc5\x85\xae"
+ "\x93\x5e\x8f\xf7\xd5\x49\x6f\xbc\x1e\x98\x4e\x7a\xfd\x83\xe1\xd7"
+ "\x49\xaf\x1b\x7d\x75\xd2\x1b\x65\xac\x4e\xff\xea\x0e\x5e\x27\xbd"
+ "\xb1\xd6\xbf\x4e\x7a\x63\xa3\xaf\x4e\x7a\x43\x1c\x83\x7a\x63\x2f"
+ "\xd3\x49\x6f\xa4\xb0\xf4\x7f\x75\x49\xd3\xbd\x3a\x89\xa5\x33\x9d"
+ "\xf4\x46\xcd\x60\x3a\x09\xb1\xdf\x18\xdd\x0b\xfb\x2b\x3d\xd8\x7f"
+ "\x33\xe2\xd3\x4a\x0f\xf6\xdf\x14\xf6\xac\xe2\x2b\x4b\xa3\x5f\xca"
+ "\x24\xe1\x25\x78\x96\x08\xc8\xbb\xf6\x59\xc4\xfe\xbe\x2d\x38\x6f"
+ "\x41\x7e\x04\x74\x58\x9b\xa8\xd3\xb2\x40\xa7\xb5\xc1\x33\xee\x31"
+ "\x35\xbe\x34\x1a\x75\x11\x8e\xff\xe3\x33\xd3\x6d\xf6\x11\xb8\x5e"
+ "\x32\xa8\xb5\x4c\x6d\xe2\x5a\xa6\xd4\xbe\x6b\x99\x2a\x25\x6b\x66"
+ "\x50\x36\x14\xf9\xb2\x48\x1c\xd7\x05\xfd\x26\xea\x31\xf3\x08\x97"
+ "\x5c\xd4\x63\xe7\x40\x8f\x9d\xf3\xca\x04\xea\xb1\x33\xa0\xc7\x3a"
+ "\x37\xa8\x27\xa0\x2e\xeb\xbb\x8e\x89\x8d\xe3\x0a\x7a\x4c\xd7\x4b"
+ "\x8f\x2d\xef\xa5\xc7\x96\x81\x1e\x4b\x01\x3d\xa6\xf0\xca\xc3\xcf"
+ "\x8e\x10\x6e\xc6\x22\x90\x09\xd0\x63\xe5\xe7\x50\x8f\x99\x42\xd4"
+ "\x63\xfb\x12\x7d\xe5\xe1\xcd\x0f\x02\x93\x87\x7d\x26\x7f\xf2\xe0"
+ "\xd4\x85\x2a\x0f\xfb\x5a\x7c\xe5\xe1\x4d\xf1\x3c\xe2\x37\xce\x07"
+ "\x2f\x0f\x6f\xe6\xf7\xc8\xc3\xca\xde\xf2\xf0\xe6\x8b\xbe\xf2\xf0"
+ "\xe6\x7c\x86\xfb\x37\xf7\x33\x79\x78\x53\x2b\xca\x89\x43\x9a\xee"
+ "\x95\x07\x96\xce\xe4\xe1\x4d\xc3\xd5\xf1\xd9\xcb\xd5\x46\xff\x79"
+ "\xa0\x33\xb4\xaf\x8e\xcf\x0a\x71\xd9\x9b\x2d\xa1\xc7\x65\x6f\x5d"
+ "\xa2\xf1\xef\x1f\x52\x5f\xf2\x9f\xd3\x42\xa7\xef\xdb\x97\x68\xfc"
+ "\xfb\x87\xd4\xaf\xf0\xd6\x10\xc6\xbf\xdf\x1d\x70\xfc\x7b\x60\x3f"
+ "\xe6\xbd\x16\x4b\x8f\x0f\xff\x5e\x8b\x67\xce\x65\x5f\x1f\xfe\xbd"
+ "\x27\x7c\xd7\x2f\xbd\x7b\xb6\xf7\x7c\xc8\xc1\x7c\x7b\xd7\xff\x2a"
+ "\xdf\xfe\x9d\x49\xa1\xfb\xf6\xef\x8d\xf3\xf5\x65\xde\xcf\x0f\xcc"
+ "\x97\x79\xef\x0f\xfe\x7c\x19\x57\xc8\xbe\xfd\x7b\x7b\x7c\x7d\x99"
+ "\xf7\xd3\x44\xfe\x7f\x12\xbc\x2f\xf3\xfe\x4c\xff\xbe\xcc\xfb\x73"
+ "\x7d\x7d\x99\xf7\xc5\x73\xf5\xde\xcf\x63\xbe\xcc\xfb\x53\x58\xfa"
+ "\xbb\x06\x69\xba\xd7\x97\x61\xe9\xcc\x97\x79\xbf\xe4\xea\xb8\xed"
+ "\xe5\xea\xcb\xfc\x9b\xdf\xf3\xaf\xae\xda\x5a\x8f\x2d\x78\x7f\x4f"
+ "\xe8\xb6\xe0\x83\xd9\x57\x6d\xed\x60\xf4\xdd\x1f\x1f\x3a\x7d\xff"
+ "\xbd\x26\x74\x5b\xfb\x61\x82\xd7\xd6\x7e\x98\xe0\xdf\xd6\xd6\x7e"
+ "\xe0\x6b\x6b\xff\x63\xd1\x55\x5b\x3b\x90\xad\xfd\xa0\x22\x74\x5b"
+ "\x5b\x9b\xe7\x6b\x6b\x3f\x3c\x19\x98\xad\xad\x75\x0f\xbf\xad\xfd"
+ "\x50\xee\x6b\x6b\x3f\x6c\x15\xf9\x7f\x47\xf0\xb6\xf6\xc3\x0f\xfd"
+ "\xdb\xda\x0f\x3f\xf1\xb5\xb5\x1f\x8a\x6b\xe8\x3f\xec\x60\xb6\xf6"
+ "\xc3\x7d\x2c\xfd\x3f\x26\x49\xd3\xbd\xb6\x96\xa5\x33\x5b\xfb\xe1"
+ "\x60\xeb\x7f\xae\x8e\xe7\x5e\x32\x5b\xfb\x9f\xf3\xaf\xda\x82\xc1"
+ "\x6c\xc1\x5f\xe4\xa1\xdb\x82\x03\x07\x42\xb7\x05\x1f\xcf\xf0\xda"
+ "\x82\x8f\x67\xf8\xb7\x05\x7f\xfd\xc4\xd7\x16\x7c\xb4\xea\xaa\x2d"
+ "\x18\xc8\x16\xfc\xe7\xde\xd0\x6d\xc1\x5f\x4b\x7c\x6d\xc1\xc7\xe7"
+ "\x03\xb3\x05\x1f\x8f\x1e\x7e\x5b\xf0\x71\xb4\xaf\x2d\xf8\xb8\x4d"
+ "\xe4\xff\x03\xc1\xdb\x82\x8f\x4d\xfe\x6d\xc1\xc7\x8d\xbe\xb6\xe0"
+ "\xe3\x3d\x4c\xe7\x7f\xec\x60\xb6\xe0\xe3\xfd\x2c\xfd\xa3\x78\x69"
+ "\xba\xd7\x16\xb0\x74\x66\x0b\x0c\xe1\x57\xc7\x79\x2f\x57\x5b\xf0"
+ "\x89\x26\x74\x5d\x55\xe7\xf0\xea\xaa\x3a\x87\x7f\x5d\x55\xb7\xca"
+ "\x57\x57\xfd\xd7\xf5\x57\x75\xd5\x40\xba\xca\x10\x1d\xba\xae\xaa"
+ "\xeb\x35\xfe\x6b\x0c\x70\xfc\xb7\xce\xef\xf8\x6f\xe8\xba\xaa\xae"
+ "\xd7\xf8\xaf\x51\x1c\xff\xfd\xe4\xab\xe0\x75\x95\x71\xad\x7f\x5d"
+ "\x65\xec\x35\xfe\x6b\x14\xc7\x7f\x8d\xe2\xf8\xaf\x51\x1c\xff\xfd"
+ "\xa4\x4d\x9a\xee\xd5\x55\x2c\x9d\xe9\x2a\xe3\x10\xc7\x7f\x1b\x54"
+ "\xde\xf1\xdf\x06\x61\xcd\x00\x5f\xd1\x94\xd8\x77\xfc\xb7\xfe\x8f"
+ "\x38\xfe\xeb\x95\x09\xd3\xdd\xc2\x58\x30\xca\x45\x27\xdb\x57\xa4"
+ "\xdf\x71\xe1\xeb\x9b\x12\xaf\x8e\x0b\x0f\xc7\xb8\x70\x7d\x8a\xaf"
+ "\x9c\x34\x34\x06\x26\x27\xf5\x47\x87\x7f\x5c\xb8\xbe\xc3\x57\x4e"
+ "\x1a\x6a\x45\xd9\x0d\x61\x5c\xb8\x61\x87\x7f\x39\x69\x78\xd5\x57"
+ "\x4e\x1a\xc4\x79\xb9\x0d\x16\x26\x27\x0d\x45\xa2\xfc\x38\xa4\xe9"
+ "\x5e\x39\x31\x4a\xc6\x85\x1b\x5a\x03\xb1\xe9\x2e\x79\xe3\x56\xb4"
+ "\xd1\x93\x5a\x1f\x75\xf7\xe0\x39\x43\xc4\x73\x7f\x36\x7d\x31\xd3"
+ "\xfd\x88\x63\xe7\xde\xd2\xd8\x41\x6d\x7a\x9b\x68\xd3\x53\xfb\xda"
+ "\x74\x8f\x3d\x47\x3c\xef\x0a\x68\x4c\xb8\x17\xae\x83\xb2\xe7\x8b"
+ "\xcb\x86\x82\x6b\xc4\xb4\xaf\x3d\x0f\x15\xd7\x07\x2f\xd1\xfa\x97"
+ "\x1f\xd2\x98\x70\x43\x47\xe8\xb1\xdd\xa1\x4b\xb4\xfe\xe5\x87\xd4"
+ "\x4f\x7d\x70\x08\xeb\x5f\x3e\x1d\x70\xfd\xcb\xd5\xbe\x09\xa4\xef"
+ "\x21\x5b\xe8\xf4\x6d\x4c\x0e\xdd\xdf\x6f\x8e\xf0\xfa\xfb\xcd\x11"
+ "\x1e\xdf\xc6\xb3\x5f\x1a\xe8\xcc\x70\x5d\x3a\x5c\xe7\x08\x79\x29"
+ "\x5d\xd8\xeb\x3b\xc2\xda\xf6\x39\x9e\x4f\x04\xfe\x8e\x75\x4b\x52"
+ "\x96\xd4\xdf\x69\x1a\xef\xf1\x75\x92\xd0\x0f\x02\xbf\x06\x7d\x1a"
+ "\x8f\x8f\x8f\x7b\xe3\x0c\x38\x1f\xf4\x96\xd2\x58\x8c\x09\x9c\x8a"
+ "\xc6\xad\x57\x7e\x3c\x60\x49\x08\x3d\x1e\xb0\xf6\x9a\xff\xd6\x1c"
+ "\xe0\xfc\x37\xab\xdf\xf9\x6f\xa1\xc7\x03\xd6\x5e\xf3\xdf\x9a\xc5"
+ "\xf9\x6f\x8d\x9f\x07\xef\xe7\x34\x0f\x30\xff\xad\xb9\xd7\xfc\xb7"
+ "\x66\x71\xfe\x5b\xb3\x38\xff\xad\x59\x9c\xff\xd6\xd8\x22\x4d\xf7"
+ "\xfa\x39\x2c\x9d\xf9\x39\xcd\x01\xcd\x7f\x03\x3f\xa7\x68\x08\x7e"
+ "\xce\xe0\x7d\x17\x97\x8d\x9f\xb3\xe4\x32\xf1\x73\x3e\x53\x05\x60"
+ "\x27\xb6\xf6\xb2\x13\xb1\xff\xbb\xec\x44\xf3\x10\xe6\xbe\xfd\xdf"
+ "\x01\xe7\xff\x0b\xf4\x2d\x91\xd0\x17\x75\xb4\x48\x5b\x77\x6c\x69"
+ "\x6c\x48\xf4\x05\xdd\x5c\x95\xf3\x43\xa1\xed\x67\x9a\xd0\x69\xdb"
+ "\x72\xe4\xaa\x8f\x33\x18\x7d\xff\xaf\x39\x74\xfa\xfe\xf7\x94\xd0"
+ "\x7d\x9c\xc3\xf2\x4f\x7b\x7c\x9c\xc3\xf2\xde\x3e\x0e\xfa\x34\x33"
+ "\x1d\xcc\xd7\x79\x09\x7c\x94\xe2\xd5\xe0\xef\x64\x12\x62\x6d\xfb"
+ "\x88\x94\x80\xcf\x53\x7c\x0a\xfc\x9e\x34\xf0\x7b\x5c\xaf\x8b\x7e"
+ "\x4f\x6b\xbe\xaf\xdf\xf3\x3f\x3f\xee\xd7\xef\x51\x78\xfd\x1e\x17"
+ "\xf8\x34\xce\xd7\x4b\x63\xcb\x4e\x49\x7c\xa0\xe7\xfb\xfa\x40\xdd"
+ "\x3a\xb0\x39\xb7\x94\xaa\x9d\xe0\x07\x0d\xe4\x03\x09\xbc\xef\xe5"
+ "\x07\xfd\xf0\x7c\xa0\xcf\x63\x43\xf7\x81\x5a\x67\xf8\xfa\x40\x87"
+ "\x3f\x0c\xcc\x07\x6a\x3d\xe8\xb7\xaf\x27\x64\x1f\xa8\xb5\xd5\xd7"
+ "\x07\x3a\xbc\x97\xd5\xe9\xbf\x3f\x0c\xde\x07\x3a\xbc\xcd\xbf\x0f"
+ "\x74\x58\xe7\xeb\x03\x1d\x4e\x61\xbe\xce\xe1\x5a\xe6\x03\x1d\xce"
+ "\x60\xe9\xff\x5d\x2b\x4d\xf7\xfa\x40\x2c\x9d\xf9\x40\x87\x8d\x01"
+ "\x8e\xdf\x6c\x75\x81\x8d\xbd\xf4\xf3\xe6\x06\x1a\xbf\x19\xae\x79"
+ "\x73\x8b\x2f\x93\xf1\x9b\x7f\xa8\xaf\xda\xe9\x81\xec\xc8\xe1\xd6"
+ "\xd0\xed\xc8\x91\x4b\x34\xff\xff\x87\x64\xa7\xff\xa1\x0d\x9d\xbe"
+ "\x47\x07\x9c\xff\x3f\xb0\x9d\xb6\x6d\xf7\xf6\x45\xd8\xb6\x07\xd7"
+ "\x17\x61\x1b\xed\x6b\x93\xff\xdf\x9b\x57\xfb\x22\x02\xb5\xc3\x47"
+ "\x2c\xa1\xdb\xe1\x2f\x5a\x7c\xed\xf0\x97\x8f\x05\x66\x87\x6d\x4f"
+ "\x0d\x7f\x5f\x84\x2d\xc5\xd7\x0e\x7f\x39\x49\xc4\xc2\xa2\xe0\xed"
+ "\xf0\x97\x0a\xff\x76\xf8\xcb\x1f\xfb\xda\x61\x5b\x3b\xb3\xb7\x5f"
+ "\x26\x30\x3b\x6c\x73\xb1\xf4\xff\x97\x22\x4d\xf7\xda\x61\x96\xce"
+ "\xec\xf0\x97\x33\x82\x1b\x73\xb9\xf1\x32\x1d\x73\x51\x5d\x61\x63"
+ "\x2e\xc7\xde\xba\x6a\x27\x06\xb3\x13\x5f\xa6\x84\x6e\x27\xda\xe4"
+ "\xa1\xdb\x89\xe3\x07\xbc\x76\xe2\xf8\x81\xe0\xec\xc4\xf1\xbb\x7d"
+ "\xed\x44\xdb\xdf\xae\xda\x89\x40\xed\xc4\xb1\xce\xd0\xed\xc4\x57"
+ "\x2e\x5f\x3b\xf1\xf5\x8a\xc0\xec\xc4\xf1\x8d\xc3\x6f\x27\x8e\x17"
+ "\xf9\xda\x89\xaf\xe7\x88\x58\x78\x31\x78\x3b\xf1\xf5\xbd\xfe\xed"
+ "\xc4\xd7\x0f\xfb\xda\x89\xaf\x95\xcc\x1e\x7c\xad\x61\x76\xe2\xeb"
+ "\x58\x96\xde\x56\x24\x4d\xf7\xda\x09\x96\xce\xec\xc4\xd7\x19\x57"
+ "\xe7\xdb\x5d\xae\xf3\xed\xda\x5b\x43\xd7\x65\xdf\x6a\xbc\xba\xec"
+ "\x5b\x8d\xff\xf9\x76\x27\x8e\xfa\xce\xb7\xfb\xe6\xc5\xab\xf3\xed"
+ "\x06\xd2\x55\x5f\x17\x85\xae\xab\x4e\xec\xf3\xd5\x55\x1d\x3f\x0e"
+ "\x4c\x57\x7d\x7b\xcb\xf0\xeb\xaa\x6f\x27\xfb\xea\xaa\x0e\x22\xf2"
+ "\x7f\x6e\xf0\xba\xea\xdb\x2f\xfd\xeb\xaa\x6f\xbf\xf1\xd5\x55\xdf"
+ "\x1e\x60\x3a\xa9\x63\x1c\xd3\x55\xdf\x36\xb3\xf4\x6f\xe6\x48\xd3"
+ "\xbd\xba\x8a\xa5\x33\x5d\xd5\x11\xd0\xfe\xff\xde\xf1\xb5\x90\x7c"
+ "\xda\x8b\x30\xbe\x36\x5c\x3e\xed\xe5\x32\xbe\x76\xf2\xea\xf8\xcf"
+ "\x80\xfe\x6c\xc7\x10\xf6\xfd\x3f\x35\xe0\xf8\xcf\xc0\x36\xe0\xfb"
+ "\xbd\x5e\x1b\xf0\xfd\x5e\x7f\xe3\x13\xc5\x80\xa1\x12\xf0\x47\x5f"
+ "\x3c\x45\xc2\x5f\xc2\xf1\x89\x96\x46\xa2\xc3\xf1\x89\xd5\x9e\xf1"
+ "\x89\x2a\xd1\xc7\xfd\xfe\x7a\x5f\x1f\xf7\xbb\x0f\xfa\xf3\x71\xd1"
+ "\xb7\x75\x83\xdf\xea\xea\x3d\x2e\xf1\x6c\xff\xb6\xa3\x5b\xd1\x58"
+ "\x74\xfe\xf5\x52\x75\x30\xb6\x63\xd7\x26\x66\x3b\x76\xfe\xa0\x6c"
+ "\xc7\x49\x73\xe8\xb6\xc3\xde\xeb\x3c\xdf\xd3\x4f\x05\x66\x3b\xbe"
+ "\x5f\x34\xfc\xb6\xe3\x7b\xad\xaf\xed\x38\x3d\x45\xc4\xc3\x33\xc1"
+ "\xdb\x8e\xd3\xe3\xfd\xdb\x8e\xd3\xb7\xf8\xda\x8e\xef\xc5\xb9\xa6"
+ "\xa7\x67\x33\xdb\x71\x5a\xce\xd2\xbf\x4b\x96\xa6\x7b\x6d\x07\x4b"
+ "\x67\xb6\xe3\xf4\xfc\xe0\xfa\x43\xa2\x2e\xd3\xfe\x10\xe5\x15\xd6"
+ "\x1f\x72\x66\x08\xeb\xdf\xce\xa5\x5a\x7a\xe6\xcf\x9f\x4b\xed\x13"
+ "\xaf\x67\x82\xaf\x7b\x9a\x8d\xb9\xf6\xc4\xeb\xb6\xa3\xa2\x2e\x3b"
+ "\x7b\xd8\x57\x97\x75\xe6\xfb\xd3\x65\x03\x8d\xab\x62\x7c\xee\x06"
+ "\x3d\xe7\xaa\x0a\x71\x5c\x35\xf3\x87\xa4\xbf\x4e\x6b\x43\xd7\x5f"
+ "\x67\x7b\xed\x7f\xda\x15\xe0\xfe\xa7\xe7\xfc\xee\x7f\xea\x0a\x79"
+ "\x0e\xfd\xb9\x5e\xfb\x9f\x9e\x13\xf7\x3f\xed\x0c\x61\x5d\xdc\xb9"
+ "\xa3\xfe\xf5\xd7\xb9\x5e\xfb\x9f\x9e\x13\xc7\x4f\xbb\xc4\xfd\x4f"
+ "\xcf\x89\xfb\x9f\x76\xc6\x4b\xd3\xbd\xfa\xab\x53\xb2\x2e\xae\x6b"
+ "\xc0\xfd\x4f\x69\x49\x79\x51\x19\xc7\xd7\xc0\x55\x0b\x75\xbc\x1e"
+ "\x30\x60\x80\xff\xcd\xc0\xc7\xb1\xf0\x7f\xb3\x3f\x19\xb3\x2b\xca"
+ "\x8b\xf8\x02\xa8\x33\x47\x64\x56\xfb\x77\x06\xc3\x0d\x2e\xe4\x4d"
+ "\x25\xe3\x55\x79\x51\x94\x6b\x54\x22\x4f\x35\x04\xf8\x52\x24\x9c"
+ "\xaf\x06\xf9\x23\x01\x33\xaa\x4c\x12\x79\x4a\xd6\x75\xc0\x93\x0f"
+ "\xea\x1b\x79\x4c\xd6\xb5\x11\xcb\x80\xba\x9a\xa1\x2d\x6a\xbf\x75"
+ "\x85\xb2\x92\xde\x9c\x40\xb6\xb8\xe8\xd7\x86\xd5\xa7\x49\x9b\xcc"
+ "\x71\x6d\x54\xc7\xa8\x44\x9a\x9b\x4c\xd0\xc7\xaa\xb9\xc1\x1e\x8e"
+ "\x65\xe2\xd9\x8b\x6d\xb2\xae\x4e\x7c\xe7\x86\x3a\xe6\xac\x22\x9c"
+ "\xfe\xf4\xa8\x08\xd0\x05\x23\x72\x3b\x69\xfb\x1a\x17\xd4\x39\xcb"
+ "\x45\x3e\x9e\xd0\x1a\xfe\xee\x4e\x48\x73\x93\x68\x3c\xdf\x0e\xcb"
+ "\x00\x1f\x13\xea\xe3\xf8\x71\x35\xe4\xef\xaf\x0e\xdb\xde\x21\x93"
+ "\x46\x4c\xa4\xb6\xe0\x70\xe3\xf0\xbb\xfe\x2d\x2a\x7f\x02\x31\xdc"
+ "\x0e\xb4\x53\x11\xae\xbf\xf7\x41\x7e\xc7\x2f\xbf\x40\x27\x46\xe0"
+ "\x39\x98\xb9\x3b\x08\x57\xca\x8f\x8a\xa8\xcb\x16\xce\xaa\xb4\x77"
+ "\x15\x9e\x9f\x62\x93\xa5\x16\x21\xcd\xf1\xcc\x34\x3c\xfb\x17\x70"
+ "\x43\x20\x7d\xce\x27\x59\x84\xf4\xe6\x45\x7a\xea\xaa\x45\xaa\x8c"
+ "\x15\xab\x96\xae\x59\x9f\xa1\xba\x25\x75\x0c\x99\xb3\x66\x8d\x6a"
+ "\xd5\xa2\xd5\x1b\x55\xd2\x37\x0f\xaa\x52\x57\xac\x5b\xb4\x38\x6d"
+ "\xe9\x1d\xab\x96\x68\xc7\x40\x9d\x88\xa4\x1e\xe3\xb0\x2e\x7c\xe1"
+ "\xf9\x94\xea\x97\x09\x29\x1f\x4b\xc2\xb1\x5e\xf0\x3d\xa3\xe7\x7c"
+ "\x3c\x3c\x1f\x8e\x83\x3c\xb9\xa0\x03\x4b\x73\x46\x41\x5e\x47\xf3"
+ "\x6e\xa8\x57\x35\xd4\x1b\xea\x88\x75\xb6\x7b\xea\xec\xc1\x44\x2e"
+ "\x62\x22\xe7\x34\x60\xb0\xfb\xda\x28\xc7\xa8\x5f\x51\x9a\x8c\xed"
+ "\xeb\x04\x39\x91\x41\xda\x22\xb4\x4b\xa0\x03\x8a\xba\x0a\xbb\x27"
+ "\x79\x30\x86\xbf\xa5\xfa\xf2\xd9\x5d\x28\x27\x54\xf3\x08\x93\x29"
+ "\x67\xf8\x5c\xb5\x8c\xb0\xf3\xf9\xba\x93\xbd\xe7\xf3\x39\xc3\x91"
+ "\xb6\x50\x8f\x0e\x48\xd7\xda\x64\xf7\xc9\x31\x1d\xcf\x89\xc4\x73"
+ "\xf6\xb0\xce\xd0\x2e\xb0\x8b\xd4\x40\x0b\x44\xec\x17\x7d\x19\xc7"
+ "\x97\xc8\xec\xd6\xf0\x73\x24\xc9\x45\x9d\xf4\xc5\x2f\xe3\x9a\x3a"
+ "\x3b\x49\x54\xbe\x76\x09\x1d\x79\x7e\x6d\x94\x6b\xc5\x52\x3c\x1f"
+ "\x90\xd7\xc9\xec\xf4\x45\xa7\x7a\xee\x44\xa2\x84\xb2\x2d\x92\x73"
+ "\x02\xc3\x83\xe3\x7f\xb7\xc0\x7f\xe4\x23\x9e\xff\xc7\xf8\xe8\x8c"
+ "\xf9\x24\xa3\x2f\x1f\x7b\xf0\xf7\x26\x4f\x4c\x80\x05\x2a\xaf\x6b"
+ "\x4e\x72\x33\x3a\xa2\xec\x9e\xc9\xd5\x90\xbb\x04\xda\x39\x5b\x78"
+ "\x7d\x5d\x0d\x5f\x52\xd7\x4e\x4b\xea\x5a\x80\x66\x1a\x7d\x26\x51"
+ "\x2d\x74\x2b\x89\xee\x1c\x89\xb3\xeb\xea\x9a\x15\xb2\x3c\x19\xf8"
+ "\x16\x1c\xd8\x8d\x38\xd0\x19\x71\xa2\xbc\x6b\x90\x8e\x0d\x1d\x84"
+ "\xcc\x5a\x47\xc8\xd7\x53\x48\x58\x35\xfc\x2e\xb8\xf6\x38\xf7\x08"
+ "\x7a\xa2\xd0\x99\xbc\x1b\x7e\x8b\xe7\x3c\x06\xf9\x7b\x9b\x5f\xb9"
+ "\xeb\x69\xb7\x71\x76\xff\xed\x76\x59\x78\xbd\x11\xf8\x67\xd4\xd0"
+ "\x12\xe3\x9c\xbe\xed\x36\xce\x66\xed\x1e\x71\x7a\xf8\xdb\xed\xaa"
+ "\x60\xed\x76\xcd\x0e\xad\xdd\x2e\xbf\xfd\x7f\x92\x76\xfb\xe1\xb7"
+ "\xdb\x08\xed\x06\x7e\x1b\x81\xdf\xc6\x7e\xf8\x6d\x14\xf9\x7d\xcd"
+ "\xb1\xe1\x6f\xb7\xbb\x8c\xb5\xdb\x9d\x18\x5a\xbb\xdd\x7e\xf5\x9f"
+ "\xb7\xdd\x26\x3f\xfc\xe6\x0f\xf0\x7a\x13\xf0\xdb\x04\xfc\x36\xf5"
+ "\xc3\x6f\x93\xc8\xef\x6b\x3f\x1b\xfe\x76\xf3\xac\xff\xbf\x90\x4f"
+ "\x08\xad\xdd\xbc\x39\x80\x76\xfb\xe1\x37\xdd\x0f\xed\x06\x7e\x9b"
+ "\x80\xdf\xa6\x7e\xf8\x6d\x12\xf9\x7d\x5f\xf1\xf0\xb7\x9b\xe6\xb1"
+ "\x76\xd3\xf8\xd0\xda\x4d\x0d\x83\xb7\xbb\xbe\x7f\x7e\x73\xe4\x2d"
+ "\x5e\x5f\x0f\xfc\xae\x07\x7e\xd7\xf7\xc3\xef\x7a\x91\xdf\xf3\xa6"
+ "\x0e\x7b\xbb\x39\x22\x9c\x67\x4d\x8b\x49\x5c\x48\xed\xe6\x48\xed"
+ "\xe0\xed\xae\x6b\x05\x9d\xdd\x87\xe7\xd6\xac\x78\x72\xe7\x39\x6c"
+ "\x3f\x17\x43\x15\x75\xad\xd7\xe4\xe7\xc9\x5c\xf2\xba\x23\xd7\x1c"
+ "\x21\x1c\xc4\x7e\x9a\x28\x1b\x19\x0d\x6d\xd5\x50\xbd\x59\x8b\x77"
+ "\x1e\xca\x71\x81\xee\x77\xcb\xeb\x5a\xba\x4b\xca\x35\x2f\x2d\x23"
+ "\xaa\x5c\x3b\x51\x36\xe5\xd8\x48\x8e\x96\xda\x9b\xc8\x97\x44\x61"
+ "\x23\x1c\xf6\x63\x7d\xda\x51\x4b\x56\xa7\x53\x0a\x65\x8f\xc0\x78"
+ "\x51\x7f\x9c\xc4\x81\x4f\x9c\x47\xc1\x7e\x94\xf1\x44\x05\xe5\xc7"
+ "\x21\x2d\xa1\xec\xf4\xa8\x39\x44\xf6\xd7\xc5\x0e\x82\xf4\x44\xda"
+ "\x42\x6c\x19\x27\xd0\xb5\x93\x90\x5f\xcf\x63\x74\xdd\xb5\x2c\x58"
+ "\xba\xca\x9a\x99\x5f\x59\x67\xb7\xda\xba\xb1\x5f\x5a\x89\xeb\x9a"
+ "\x21\xbd\xa4\x49\x7b\x9a\xd0\x62\x59\x1c\xd5\xd5\xd9\x78\xb0\x59"
+ "\xc1\x95\xcb\xf9\x9d\xff\x26\xd1\xa7\xc9\xa0\x33\xfb\x60\xcd\x4b"
+ "\xef\xb0\x12\xaa\x30\x26\x33\x7a\x1b\xe7\x5f\x73\x64\xc4\xe9\xfe"
+ "\xe9\x6d\x4c\x76\x81\xcd\x71\xcb\x8d\x73\x02\xa7\x77\xd8\x7a\x5f"
+ "\x7a\x1b\xe3\x2e\x0e\xbd\xc3\x12\x18\xbd\x8d\x5a\x5f\x7a\x73\x2e"
+ "\x46\x6f\x6e\x0f\xd5\x19\x53\x78\xb0\x95\x41\x96\xeb\x77\xfd\xa3"
+ "\x84\xde\x80\xef\xbe\x36\xcc\x4b\xef\x70\x17\xd0\x5b\xc4\xb7\x11"
+ "\xf0\x7d\xcd\x31\x3f\xf4\x06\x7c\x1b\x01\xdf\xc6\x20\xf0\x1d\xfe"
+ "\x55\x2f\x7a\x5f\x24\x7c\x87\x8b\xe7\x3f\x19\x7b\xe1\x3b\x3c\x8d"
+ "\xd1\x3b\x5c\x09\xf4\x06\x7c\x1b\x83\xc4\xf7\x88\x88\x00\xec\x07"
+ "\xe0\xbb\xaf\xed\xf4\xd2\x7b\x64\x1a\x55\x98\x44\x7c\x9b\x00\xdf"
+ "\xd7\x7e\xd6\x3f\xbd\x4d\x80\x6f\x13\xe0\xdb\x14\x04\xbe\x47\xce"
+ "\xf5\xa5\xb7\xe9\x22\xe1\x7b\xa4\x8a\xd1\xdb\xd4\x0b\xdf\x23\x8e"
+ "\x30\x7a\x8f\xc8\xa3\x3a\x13\xe0\xdb\x14\x24\xbe\x47\x66\x05\x40"
+ "\x6f\xc0\x77\x5f\x9b\xed\xa5\xf7\xa8\x23\x40\x6f\x11\xdf\x26\xc0"
+ "\xf7\x7d\xc5\x7e\xe8\x0d\xf8\x36\x01\xbe\x4d\x41\xe0\x7b\x94\xa9"
+ "\x17\xbd\x2f\x12\xbe\x47\x95\x89\xf4\xee\x85\xef\x51\x33\x18\xbd"
+ "\x47\xda\x81\xde\x80\x6f\x53\x90\xf8\x1e\xd5\x1e\x80\x9f\x00\xf8"
+ "\xee\xeb\x2b\x78\xe9\x3d\x7a\x06\x55\xd4\x8b\xf8\xae\x07\x7c\xcf"
+ "\x9b\xda\x3f\xbd\xeb\x01\xdf\xf5\x80\xef\xfa\x20\xf0\x3d\xfa\x5e"
+ "\x5f\x7a\xd7\x5f\x24\x7c\xe3\x11\xf3\x48\xef\xfa\x5e\xf8\x8e\x38"
+ "\xc0\xe8\x1d\x91\x42\x75\xf5\x80\xef\xfa\x20\xf1\x3d\xda\xef\xfa"
+ "\xdf\x81\xfc\x93\x75\x55\x24\xc2\x97\xe6\x63\x0c\x17\xce\x47\x19"
+ "\xf3\xe6\xa5\xf1\x51\xc6\x64\xf4\xef\xa3\x8c\x89\x63\x34\x1f\xdd"
+ "\x12\x9a\x8f\x32\xc6\x12\x8a\x8f\xd2\x97\xe6\xf2\xc9\x17\xce\x4f"
+ "\x91\x8f\xbf\x34\x7e\xca\x35\xed\xfd\xfb\x29\xd7\xec\x65\x34\xbf"
+ "\x26\x31\x34\x3f\x45\x9e\x10\x8a\x9f\xd2\x97\xe6\x8a\x7d\x17\xce"
+ "\x57\x51\xfc\xe1\xd2\xf8\x2a\x8a\xf9\xfd\xfb\x2a\x8a\x68\x46\x73"
+ "\xf9\x81\xd0\x7c\x15\xc5\xfe\x50\x7c\x95\xbe\x34\x8f\x8a\xb9\x70"
+ "\xfe\x4a\xd4\x88\x4b\xe3\xaf\x44\x36\xf7\xef\xaf\x44\x8a\xf1\x4f"
+ "\x64\x5c\x68\xfe\x4a\x54\x00\xf1\x4f\x5f\x7f\xa5\x2f\xcd\x95\x65"
+ "\x17\xce\x67\x51\x6e\xbc\x34\x3e\x8b\xf2\xf1\xfe\x7d\x16\x25\x61"
+ "\x34\x8f\xda\x1b\x9a\xcf\xa2\xac\x0c\xc5\x67\xe9\x4b\xf3\xb1\xe1"
+ "\x17\xce\x6f\xb9\xf6\xe4\xa5\xf1\x5b\xae\xad\xed\xdf\x6f\xb9\x36"
+ "\x83\xd1\xfc\xda\xe8\xd0\xfc\x96\xb1\xca\x50\xfc\x16\xa4\x35\xd2"
+ "\x1c\x7d\x15\x46\xf3\x71\x2d\x34\xb2\xae\xc6\x09\xfe\x88\x02\xe8"
+ "\xae\xe8\x20\x5c\x15\xd2\xbc\x95\xd1\xdc\x1d\x69\xd6\x02\x7d\x34"
+ "\x48\x33\xa1\x1d\xdf\x46\x47\xba\x4b\xea\x8e\x50\x8e\x40\x5b\x22"
+ "\x08\xf0\xec\x4b\x57\x01\x89\x54\xe5\xe4\xc3\xff\xe3\x84\xfd\x33"
+ "\x55\x39\x85\x47\xa1\x8d\x61\x38\x46\xe1\xd2\x95\x2b\xdd\x8a\x86"
+ "\x32\x78\x77\x13\x1d\x5f\xaa\x74\x82\x2f\x41\x57\x46\x8f\xb3\x76"
+ "\xd4\x10\xab\xeb\x10\x69\x6a\xfd\x0b\xe1\x23\xcd\xe9\x77\xb9\x88"
+ "\x9a\x7e\xab\x1e\x67\xc9\xb0\x11\xf7\x92\x68\xb9\x35\xcb\x0c\xb8"
+ "\x78\x9f\x24\xb5\xd3\x73\xf4\x9f\x6a\xb9\x53\x61\x69\x76\x2b\xcc"
+ "\xb3\xdd\xba\xc6\x0a\x97\xc2\x62\x78\x3b\x13\x2c\x9a\x83\xa8\xd3"
+ "\xda\x28\xd5\x2f\x26\xe1\xfa\x63\x24\xa2\x74\x31\x91\x97\x1e\x23"
+ "\x4a\x4b\x5b\x2b\x69\x3c\x61\x26\x8d\xa7\x0f\x93\xc6\x73\x70\x75"
+ "\xc3\xc5\xc3\x95\x77\x98\x58\x3a\x08\x99\x79\x92\x90\xdc\x36\x6a"
+ "\xff\xf9\x11\x32\xce\xe2\x6a\x25\x38\x8f\xf7\x14\xf7\xa3\x0f\xe4"
+ "\x29\x64\x1c\xfd\x67\x34\xa1\x4b\xa2\x39\x78\x17\x8e\xe9\x56\x97"
+ "\x9d\x58\xda\x1c\xf8\x7e\x3b\xbc\x0f\xcf\x6d\x83\xf2\x79\x33\xee"
+ "\x17\x67\xb7\xe4\x1d\x84\xf6\x4d\x43\x3a\xb7\x7b\x7c\x32\x7d\x37"
+ "\x89\x2b\x05\x36\x23\x66\x92\x28\xc3\xcc\xee\xee\x60\x31\xf3\x23"
+ "\xb6\xff\xd9\xca\xe8\xb1\x40\xef\x1b\xf8\x95\xc9\xca\x59\x87\xbf"
+ "\xa0\x38\x4f\x0b\xc7\x67\x9a\x3a\x0f\x11\xeb\x56\x9e\x24\x6d\x24"
+ "\x64\x86\x9b\x10\xa4\x09\x8e\x25\xcf\xd2\x92\x28\x9c\x3f\xc6\x7f"
+ "\xab\x1e\x6b\x6d\xb3\x93\x2d\x2e\xa8\xeb\x29\x47\x4f\x5d\x9b\xb6"
+ "\x36\x11\x78\x77\x43\x93\xc6\x46\xe4\x5a\xa2\x44\x3a\x83\x2f\xda"
+ "\x3a\xab\x9d\x8c\x5e\xdd\x49\x29\xd2\x18\x69\x8b\x74\xc6\xf2\x3c"
+ "\xb4\xb7\xa6\xda\x49\xae\x83\x28\xad\x39\x70\xcf\xa2\x76\x2b\xf9"
+ "\x9e\x40\x1d\xcd\x54\x31\x8d\x00\x3e\x32\x10\x13\x80\xc7\x56\xc0"
+ "\xc1\x58\x5a\x3c\xb6\xa4\x1a\xda\x8b\x63\xf8\xc1\xb5\x79\x5c\x20"
+ "\xe3\x1f\x7d\x7c\x42\x2f\x9e\x8d\xc9\x0c\xcf\x3f\xd9\x4b\x23\x8d"
+ "\x71\x4e\xf0\xf5\x18\x9e\x47\x9c\x1e\x1c\xcf\xc6\xf9\x5e\x3c\xff"
+ "\xf8\x3d\x2f\x9e\x7f\xf2\x47\xff\x78\xbe\xee\x7b\x86\x67\xa3\xf6"
+ "\xf2\xc4\xf3\x75\xdb\x06\xc6\xf3\x75\xa9\xfe\xf1\x6c\xd4\x78\xfc"
+ "\xdd\xe1\xc1\xf3\x75\x07\x2e\x1e\x9e\x8d\xc9\xa1\xe1\xf9\xba\x0a"
+ "\x5f\x3c\xff\x78\x1f\xc3\xf3\x8f\xe7\x87\x86\xe7\x9f\xf8\x3d\xff"
+ "\x60\x20\x7f\x5b\x82\x67\x51\x3f\xdf\x90\x01\x78\x06\xfd\x6c\x14"
+ "\xf5\xf3\x35\xc7\x02\xc0\xb3\x44\x3f\x47\xe7\x7b\xf1\x7c\xc3\x52"
+ "\xff\x78\xbe\xfe\x13\x11\xcf\x97\xa9\x7e\xbe\x7e\xee\xc0\x78\xbe"
+ "\x7e\xf2\x00\x78\x6e\xf7\xc4\x12\xc3\x83\xe7\xeb\x4b\x2e\x22\x9e"
+ "\x43\xd4\xcf\xd7\x6b\x7c\xf1\x1c\x9d\xc5\xf0\x1c\x3d\x29\x34\x3c"
+ "\xdf\xe0\x77\xfe\xf3\x40\xb1\x8c\x17\xcf\x26\x51\x3f\x8f\x7f\x9c"
+ "\x46\x9a\x40\x3f\x9b\x44\xfd\x7c\xed\x67\x83\xe3\xd9\x24\xd1\xcf"
+ "\x3f\x7d\xca\x8b\xe7\xf1\xf7\xfa\xc7\x73\xcc\x1f\x18\x9e\x4d\x97"
+ "\xa9\x7e\x8e\xb9\x65\x60\x3c\xc7\x84\xfb\xc7\xb3\x49\xe3\x89\xd3"
+ "\x86\x07\xcf\x31\xf3\x2f\x1e\x9e\x4d\x21\xea\xe7\x98\x78\x5f\x3c"
+ "\xff\x34\x91\xe1\xf9\x06\x57\x68\x78\x1e\xef\xf7\xfc\x9f\x81\xe2"
+ "\x44\x09\x9e\x45\xfd\xac\x1a\x07\x78\x06\xfd\x6c\x12\xf5\xf3\x7d"
+ "\xc5\x01\xe0\x59\xa2\x9f\x27\xdc\xe4\xc5\xb3\x6a\x84\x7f\x3c\xdf"
+ "\xb8\x48\xc4\xf3\x65\xaa\x9f\x27\x9c\x1d\x18\xcf\x13\x5a\x06\xc0"
+ "\x73\xbb\x27\x06\x1e\x1e\x3c\xdf\x38\xe9\x22\xe2\x39\x44\xfd\x7c"
+ "\x63\x84\x2f\x9e\x27\x44\x33\x3c\x8f\xb7\x84\x86\x67\x95\x2a\x94"
+ "\x18\xdc\x8b\xe7\x7a\x51\x3f\xdf\xdc\x46\x23\xeb\x41\x3f\xd7\x8b"
+ "\xfa\x79\xde\xd4\xc1\xf1\x5c\x2f\xd1\xcf\xaa\xef\xbd\x78\xbe\xf9"
+ "\x73\xff\x78\xbe\xf9\x6e\x86\xe7\xfa\xcb\x54\x3f\xdf\x64\x1a\x18"
+ "\xcf\x37\xed\xf5\x8f\xe7\x7a\x8d\xa7\x7f\x61\x78\xf0\x7c\x93\xeb"
+ "\xe2\xe1\xb9\x3e\x44\xfd\x7c\x53\xab\x2f\x9e\x55\xed\x0c\xcf\xaa"
+ "\xca\xd0\xf0\x7c\xb3\xdf\xf3\xef\x82\xeb\xdf\xb8\xa5\x0d\xfb\x37"
+ "\xba\xb1\x7f\xc3\x3b\xf7\x4f\x13\xd5\xcc\xf0\xec\x04\x3c\xef\x92"
+ "\xe2\xf9\x1f\xbd\xfb\x37\x7e\xf6\x09\xdf\x83\xe7\x5b\xfa\xe0\x99"
+ "\x07\x3c\x3b\x05\x3c\xc7\x9e\xf4\xf4\x6f\x58\x3b\xf6\x00\x4e\x4e"
+ "\x10\xeb\x6c\xc0\xb2\x5e\xc4\xf2\x3f\x00\xcb\x40\x43\x1e\x68\x6c"
+ "\x39\xd2\x4a\x92\xec\x8c\x96\xdd\x40\x63\x5e\x8a\xe3\xee\x76\x0e"
+ "\xf1\x8b\xb8\xf5\x60\xb8\x71\x35\x60\x37\xfd\x6f\xa4\x31\x13\xae"
+ "\x4d\x70\xe5\xc0\x45\xfe\x46\x2c\xed\x80\xdd\x15\x52\xec\x36\x8b"
+ "\xd8\x8d\xcd\x1f\x18\xbb\xb1\x29\x17\xaf\x2f\x23\x96\xf5\x7f\xfd"
+ "\x23\x59\x99\xf4\xd4\x17\xd4\x9a\xd5\x2a\xe2\xf3\x04\x49\x72\x91"
+ "\x28\x3a\x4f\x3d\x56\x9e\x4c\x94\x9b\xdd\x84\xd3\x2d\x26\x4a\xdd"
+ "\xdf\xa1\xdd\x1e\xf9\x3d\x46\xe4\x87\x1c\x7f\x21\x96\xd3\xad\xc4"
+ "\x72\xee\x20\xb1\xf0\x70\x9d\x80\x0b\xea\x9a\xb4\x54\xda\x6e\xbb"
+ "\xd8\xee\x5b\x36\x42\x59\xb1\xfe\xdb\x7d\x4b\xb2\xd0\xee\x54\x68"
+ "\x77\xb7\xb7\xdd\x56\x90\x03\xe0\xcf\x0d\xbc\xd8\x1f\x92\x64\x27"
+ "\xa3\xd7\xb8\x28\xed\x16\xf1\x8f\xfc\x39\xd4\xe2\x20\x49\x5a\xe0"
+ "\xd9\x12\xc0\x7f\xdb\x3e\x92\x9b\x0d\xf8\xef\x76\x20\xee\xec\xd6"
+ "\xbc\xf3\x80\xff\xd8\xed\x14\xe8\xe7\x44\xfc\xff\x03\xf1\xff\xb3"
+ "\x5a\x5e\xc0\xff\xcf\xd2\x42\xc3\xff\x2d\x01\xe0\x3f\x90\xfe\x10"
+ "\x75\x1b\xf6\x87\x74\x63\x7f\x88\x77\x0e\xe8\x20\xf8\x97\xf6\x87"
+ "\xdc\x2a\xc1\xbf\x7a\x00\xfc\xdf\x76\xd2\xd3\x1f\x72\xe9\xf1\x7f"
+ "\xdb\x20\xf8\xbf\x6d\x00\xfc\x0f\x77\xdf\xc7\x6d\x17\x11\xff\xea"
+ "\x41\xf0\xaf\x0e\x00\xff\xc6\xe4\xd0\xf0\x7f\x5b\x2f\xfc\xdf\x2a"
+ "\xe2\xff\xd6\x10\xf1\xaf\x0e\x04\xff\x01\xf4\x9f\xfc\x1c\xf1\x0f"
+ "\xfa\xdf\xd8\x22\x99\x0b\x3c\x18\xfe\x25\xfa\x7f\xa2\x04\xff\x3f"
+ "\x1f\x00\xff\xb7\x7b\xf0\x7f\x19\xe8\xff\xdb\x07\xc1\xff\xed\x03"
+ "\xe1\x7f\x98\xfb\x4a\x6e\xbf\x88\xf8\xff\xf9\x20\xf8\xff\x79\x20"
+ "\xf8\x0f\x51\xff\xdf\xde\x0b\xff\x13\x45\xfc\x4f\x0c\x11\xff\x3f"
+ "\x0f\x00\xff\x81\xf4\xb7\xdc\xd9\x86\xfd\x2d\xdd\xd8\xdf\xe2\x9d"
+ "\x13\x3e\x08\xfe\xa5\xfd\x2d\x93\x24\xf8\xbf\x73\x00\xfc\xdf\x71"
+ "\xd2\xd3\xdf\x72\xe9\xf1\x7f\xc7\x20\xf8\xbf\x63\x00\xfc\x0f\x77"
+ "\xdf\xca\x1d\x17\x11\xff\x77\x0e\x82\xff\x3b\x03\xc0\xbf\x29\x44"
+ "\xfd\x7f\x47\x2f\xfc\x4f\x12\xf1\x3f\x29\x44\xfc\xdf\x19\x08\xfe"
+ "\x03\xe8\x9f\xb9\x1b\xf1\x0f\xfa\xdf\xd4\x22\x59\x1b\x30\x18\xfe"
+ "\x25\xfa\xff\x2e\x09\xfe\xef\x1e\x00\xff\x71\x1e\xfc\x5f\x06\xfa"
+ "\x3f\x6e\x10\xfc\xc7\x0d\x84\xff\x61\xee\x8b\x89\xbb\x88\xf8\xbf"
+ "\x7b\x10\xfc\xdf\x1d\x08\xfe\x43\xd4\xff\x71\xbd\xf0\x7f\x97\x88"
+ "\xff\xbb\x42\xc4\xff\xdd\x01\xe0\x3f\x90\xfe\x9c\xc9\x42\x7f\x4e"
+ "\x37\xf6\xe7\x78\xd7\x88\x0c\x82\x7f\x69\x7f\xce\x2f\x24\xf8\x9f"
+ "\x3c\x00\xfe\xef\x39\xe9\xe9\xcf\xb9\xf4\xf8\xbf\x67\x10\xfc\xdf"
+ "\x33\x00\xfe\x87\xbb\xef\xe6\x9e\x8b\x88\xff\xc9\x83\xe0\x7f\x72"
+ "\x00\xf8\xaf\x0f\x51\xff\xdf\xd3\x0b\xff\xbf\x10\xf1\xff\x8b\x10"
+ "\xf1\x3f\x79\x98\xfa\x7f\xee\x2b\xc1\xfe\x1f\x5e\x5e\xd7\xe2\xac"
+ "\x2c\x55\xf2\x25\x96\xe6\x28\x99\x8a\xb8\xe4\x0d\x65\xd6\x8c\x4e"
+ "\x32\xeb\x2c\xf0\x44\x7b\x96\x2c\x38\xab\xc4\xf3\x02\x0d\x14\xe2"
+ "\x7f\x9f\x35\xa2\x70\xb9\x4a\xa6\x91\xd2\xd5\x24\xdc\x1d\x69\x4e"
+ "\xc7\x34\xeb\x71\x07\xc1\x36\x6f\x41\x1a\x9c\xf0\xd2\x00\xfb\xe0"
+ "\xe8\x77\x6a\x65\x75\x01\xe4\xe9\xb6\x91\x36\xc0\x8b\xa5\xcd\x06"
+ "\xb4\xdf\x24\x60\x0b\x79\x01\xf5\x99\xb4\xfb\x14\x09\x77\xfd\x33"
+ "\xfa\x06\xe0\xf1\x38\xc5\x06\x22\x8b\x69\xa3\x3c\xf2\x12\x79\x84"
+ "\x7c\x55\x6d\xc2\xf9\x4a\xf7\x6d\x6b\x02\x7c\xbb\xfe\xa9\xbe\xa1"
+ "\x1a\xf2\x0d\x7f\xbf\xcc\x7d\xc2\xf8\x07\xdc\x63\x2d\x47\x80\x96"
+ "\xc5\xf7\x86\xc8\xa7\xfb\x02\x59\xff\x12\x40\x3f\x45\xfc\x64\xec"
+ "\xa7\xe0\xe5\xc6\x39\x81\xf1\xc9\x98\xec\xb3\xa6\x75\xd8\xf9\x74"
+ "\x7f\x4b\x60\x7c\x8a\xbf\xc3\x97\x4f\xc3\xdd\x7f\x70\x3f\xdb\x0f"
+ "\x86\xbb\xdf\xc2\xf8\x74\xff\xb8\xd0\xf8\x14\x1f\xd2\xfc\xdf\xbe"
+ "\xf1\xf4\x03\x47\x30\x9e\x06\x3e\x05\x28\x4f\xc6\x56\x9f\x35\xb8"
+ "\xc3\xce\xa7\x07\xb2\x03\xe3\xd3\x03\x9f\xf7\xe2\xd3\x30\xc7\xb9"
+ "\x0f\xec\x61\x7c\x7a\x20\x83\xf1\x29\xfe\x40\x68\x7c\x7a\x20\x80"
+ "\xf5\x1f\x81\xc4\x7d\x0f\x6d\xc5\xb8\x8f\x87\xb8\x2f\x30\x3e\x99"
+ "\x92\x7d\xd6\x0c\x0f\x3b\x9f\x1e\x8a\x0d\x8c\x4f\x0f\x6d\xf1\xe5"
+ "\xd3\x70\xc7\x63\x0f\x25\x32\x3e\x3d\x14\xc3\xf8\xf4\x60\x6a\x68"
+ "\x7c\x7a\xa8\x6c\x78\xe2\x93\x87\x27\x61\x7c\x02\x7c\x0a\x50\x9e"
+ "\x4c\xad\x3e\x6b\x9c\x87\x9d\x4f\x53\x2c\x81\xf1\xe9\xe1\x5b\x7a"
+ "\xf1\x69\x98\xe3\x86\x29\x76\xc6\xa7\x29\x46\xc6\xa7\x29\xf2\xd0"
+ "\xf8\xf4\xb0\xdf\xf3\x3f\x83\xf3\xa3\x1f\x69\x41\x3f\x9a\x07\x3f"
+ "\x3a\x30\x3e\xd5\x27\xfb\xac\xc9\x1e\x76\x3e\x3d\x92\x11\x18\x9f"
+ "\x1e\x69\xf4\xe5\xd3\x70\xfb\xb7\x8f\x54\x30\x3e\x3d\x92\xc6\xf8"
+ "\xf4\xf0\xfe\xd0\xf8\xf4\x48\x00\xf3\x3f\xfb\x5f\x87\xd5\xd7\xe7"
+ "\x4b\xc8\xbb\xbc\x7c\xbe\x04\x55\x60\xbc\x4a\xd8\x78\x61\x7d\xbe"
+ "\x84\xc7\x19\xaf\x12\xa2\x19\xaf\x1e\x4d\x09\x8d\x57\x09\x25\xa1"
+ "\xae\xdf\xea\xeb\xf7\x4d\x9d\x74\x79\xf9\x7d\x8f\x05\xa8\xff\xa6"
+ "\xde\x72\x61\xfd\xbe\xc7\x44\xfd\xf7\x98\xa8\xff\x1e\x0b\x51\xff"
+ "\x4d\x0d\x40\xff\xf5\xbf\xee\xab\xaf\xef\x37\xad\xf5\xf2\xf2\xfd"
+ "\xa6\x65\x05\xc6\xab\x69\x7f\xbb\xb0\xbe\xdf\xb4\x4a\xc6\xab\x69"
+ "\x5a\xc6\xab\xa9\xb5\xa1\xf1\x6a\x9a\xdf\xf3\x5f\x06\x5b\x2f\xd6"
+ "\xd7\xff\x9b\x7e\x99\xf9\x7f\xd3\x03\xf4\xff\xa6\x5f\x60\xff\x6f"
+ "\xba\xe8\xff\x4d\x17\xfd\xbf\xc7\x43\xf4\xff\xa6\x87\xe4\xff\xf5"
+ "\xe2\x95\x28\x57\xbf\x8a\xbb\xbc\x7c\xc0\x5f\x36\x07\xc6\xab\x5f"
+ "\x4d\xbc\xb0\x3e\xe0\x2f\x3b\x19\xaf\x7e\x69\x66\xbc\xfa\xa5\x32"
+ "\x34\x5e\xfd\xca\xef\xf9\x87\x83\xad\x4f\xeb\xeb\x07\x26\x1e\xb9"
+ "\xbc\xfc\xc0\xc4\x00\xe3\xdf\xc4\xcf\x2f\xac\x1f\x98\x28\xc6\xbf"
+ "\x89\x62\xfc\xfb\xab\x10\xe3\xdf\xc4\x00\xe2\xdf\x40\xfa\xfd\x7e"
+ "\x3d\x05\x7d\x40\x77\x49\x5d\x4b\x14\xd0\x3f\x2a\x8b\x70\xdd\x31"
+ "\xc0\x2f\x39\xf0\x2b\x5f\x45\x9c\x25\xc0\x2f\xbb\x8b\xcc\x5a\xfb"
+ "\x05\x6d\xea\x70\x93\x6e\xe0\xd5\x79\xf0\x03\xad\xf6\x76\x5c\xa3"
+ "\xf7\xd0\x31\xee\xc9\xcf\xe7\xad\x55\x12\xe4\x17\xd2\xdf\x2d\x9f"
+ "\x46\x28\xf0\x4b\xe0\x9f\xbc\xb1\xc2\x55\x62\x9e\x3d\xf3\xe4\x17"
+ "\x74\x8d\x8d\xd2\x46\x8d\x03\xf7\x8e\x54\x36\x6a\x5a\x49\x52\x1b"
+ "\x19\xad\x7a\x1a\xf9\xf2\xe4\x36\x4c\xb7\xda\x5b\x09\xee\xfb\x29"
+ "\xf4\x81\x7f\xa1\x1e\xe7\xfa\x1f\xb5\x1c\xf7\x6f\xc2\x75\x85\x9e"
+ "\x3d\x9a\xac\x27\x2a\x04\xfe\xf7\xee\x53\x15\xf8\xff\x3f\x6a\xe5"
+ "\x2e\x5c\x9f\x38\xec\xbe\xe0\x93\x42\xff\x1f\xff\x45\xf4\x0d\x9e"
+ "\x3a\xae\x49\xa3\x14\xea\x38\xb6\xa9\xd3\x4e\xb0\x9e\x4d\x9d\x06"
+ "\x92\x9b\x41\x94\x4d\xdd\xed\x24\xa7\x93\xda\x9b\xf2\xbe\x21\x49"
+ "\x67\x71\x5c\x00\xf1\xf4\x64\x23\xe3\xf7\x13\x0e\xfe\x0b\xf5\x0d"
+ "\x50\x9e\xb1\xa9\x99\x90\xa8\x7c\xa0\xb5\x8b\x70\xc2\x7a\x4d\x8e"
+ "\x44\x00\xbd\x34\xd6\xbc\x63\x48\xbb\x66\xab\xeb\xef\x48\x4f\x0d"
+ "\xbc\x9f\xd2\x33\xde\x10\x69\xfe\x0c\xd3\x90\xb6\x38\xcf\xd4\xaa"
+ "\xb5\x0b\x79\x3c\xef\x19\xef\xf2\x88\x35\xab\x9b\x34\xb9\x08\x81"
+ "\xef\xed\xfd\x34\xb9\x15\xf0\xf5\x44\x88\x7a\xfb\xd7\x89\xc3\xd3"
+ "\x5f\x39\xb3\x12\xfd\x56\x77\x89\x71\x0e\xab\xe3\x88\xd3\x83\xe3"
+ "\xcb\x98\xec\xc5\xd7\xcc\x7b\x87\x86\xaf\x19\x5f\x0d\x2f\xbe\x86"
+ "\xdb\x7f\x9d\x51\x33\x34\x7c\xcd\xbc\x83\xe1\x6b\x46\x32\xc3\xd7"
+ "\xcc\x58\x2f\xbe\x46\x9c\xbe\x70\xf8\x9a\x11\xce\xf0\xf5\x6b\x63"
+ "\x68\xf8\x9a\xb9\x6f\x78\xfa\x59\x93\x5c\xe8\x6b\x03\xbe\x44\xfd"
+ "\x75\xcd\xb1\x00\xf0\x25\xd1\x5f\x49\x7f\x1c\x1a\xbe\x92\xa6\x0f"
+ "\x33\xbe\x86\xd9\xe7\x4e\x52\x0e\x0d\x5f\x49\x3a\x86\xaf\x59\xb5"
+ "\x0c\x5f\x49\x5b\xbd\xf8\xba\xe6\xd8\x85\xc3\xd7\xac\x54\x86\xaf"
+ "\x59\xb1\xa1\xe1\x6b\x76\x48\xfb\x5f\xf5\x8d\x0f\x9e\x9e\x8f\xf1"
+ "\x81\xbb\xc4\x24\xea\xaf\x6b\x3f\x1b\x1c\x5f\x26\x89\xfe\x7a\xea"
+ "\xec\xd0\xf0\xf5\xd4\xeb\xc3\x8b\xaf\xe1\x8e\x13\x9e\xd2\x0e\x0d"
+ "\x5f\x4f\x9d\x64\xf8\x7a\x2a\x9a\xe1\xeb\xa9\x36\x2f\xbe\xae\xfd"
+ "\xec\xc2\xe1\x6b\xb6\x91\xe1\x6b\xf6\xd6\xd0\xf0\xf5\xb4\xff\xfd"
+ "\x9f\x83\xea\xd7\x9e\x73\x00\x63\x1a\xc0\x97\xa8\xbf\xee\x2b\x0e"
+ "\x00\x5f\x12\xfd\x35\x67\xee\xd0\xf0\x35\x67\xc4\x30\xe3\x6b\x98"
+ "\x63\x9b\xdf\x34\x0f\x0d\x5f\x73\x66\x32\x7c\xfd\x26\x8b\xe1\x6b"
+ "\xce\xe3\x5e\x7c\xdd\x57\x7c\xe1\xf0\xf5\x9b\x58\x86\xaf\xa7\xdb"
+ "\x42\xc3\xd7\x9c\x00\xf6\x7f\x0d\xa4\x3f\xfe\x77\x31\x18\x87\xb9"
+ "\x4b\xea\x45\xfd\x35\x6f\xea\xe0\xf8\xaa\x97\xe8\xaf\xdf\x7e\x30"
+ "\x34\x7c\xfd\x76\xe9\xf0\xe2\x6b\xb8\xe3\xb1\xdf\xc6\x0d\x0d\x5f"
+ "\xbf\x7d\x9b\xe1\x6b\x6e\x2b\xc3\xd7\x6f\xf7\x7a\xf1\x35\x6f\xea"
+ "\x85\xc3\xd7\xdc\xad\x0c\x5f\x73\x1f\x0f\x0d\x5f\xbf\x0b\x60\xff"
+ "\x9f\x40\xc7\x11\x9e\xc9\x1b\x5a\x0c\xf9\xcc\xf5\x43\xc3\x58\xf2"
+ "\xc1\xcb\x3b\x86\x4c\xde\x3e\x34\x8c\x3d\x73\x2d\xc3\x58\xf2\x14"
+ "\x86\xb1\x67\x22\x2e\x4e\x0c\xf9\xbb\x76\x86\xb1\xdf\xed\x0b\x0d"
+ "\x63\xcf\x0c\xe3\xf8\xc7\xbc\xb6\xa1\xc5\x91\xf3\xb6\x0c\x0d\x63"
+ "\xf3\xee\xb8\xbc\xe3\xc8\x67\x1d\x43\xc3\xd8\xbc\xf5\x0c\x63\xcf"
+ "\xee\x61\x18\x9b\x97\x76\x71\xe2\xc8\x67\x67\x30\x8c\x3d\x1b\xe2"
+ "\xb8\xcd\xbc\x90\xd6\xbf\xf4\x3f\x6e\xb3\x20\x71\x68\xb1\xe4\x73"
+ "\x5f\x0e\x0d\x63\xcf\xfd\xe1\xf2\x8e\x25\x9f\x9b\x3f\x34\x8c\x3d"
+ "\x77\x98\x61\xec\xb9\x70\x86\xb1\xe7\x9a\x2f\x4e\x2c\x39\xbf\x86"
+ "\x61\x6c\xbe\x36\x34\x8c\x2d\x98\x33\x7c\xe3\x4d\x29\x6f\x0d\x2d"
+ "\x9e\x4c\x99\x3e\x34\x8c\x2d\x3c\x7b\x79\xc7\x93\x0b\x0d\x43\xc3"
+ "\x58\xca\xc3\x0c\x63\x0b\x35\x0c\x63\x29\x93\x2f\x4e\x3c\xb9\x70"
+ "\x1c\xc3\xd8\x82\x96\xd0\x30\x96\x12\xc0\xfe\xff\x81\x8e\x93\x2d"
+ "\x51\x0e\x2d\xa6\x5c\xfc\xe6\xd0\x30\xb6\xf8\x99\xcb\x3b\xa6\x5c"
+ "\x1c\x3b\x34\x8c\x2d\x7e\x95\x61\x6c\x91\x85\x61\x6c\x71\xc5\xc5"
+ "\x89\x29\x17\x65\x31\x8c\x2d\x8a\x0f\x0d\x63\x4b\x62\x86\x6f\x7c"
+ "\x6f\x69\xc6\xd0\xe2\xca\xa5\x8a\xa1\x61\x2c\xf5\xa3\xcb\x3b\xae"
+ "\x4c\x2d\x1a\x1a\xc6\x96\x8e\x60\x18\x4b\x8d\x63\x18\x4b\x75\x5d"
+ "\x9c\xb8\x72\xc9\x11\x86\xb1\x25\x21\xee\x47\xb1\x34\xaf\x37\xc6"
+ "\x56\xac\xce\x5c\x94\xb6\x22\x55\xb5\x62\x75\x46\xfa\x5a\xd5\xba"
+ "\x15\x9b\x96\x3e\x7c\xcb\xfa\x49\xaa\xf4\x2c\x55\xfa\x8a\xd5\xcb"
+ "\xc5\x84\xd4\x31\xe4\xe9\xa5\x69\x8b\xb2\x30\x05\x72\x2f\x5f\xbd"
+ "\x6a\xe9\xea\x0c\x55\xfa\xd2\xb5\xeb\x57\xa4\x2f\xc5\xff\xd7\xa9"
+ "\x96\xad\x49\x87\x84\x25\x4b\x57\x64\x2e\x55\x2d\x5e\xbf\x6c\xd9"
+ "\xd2\xf4\x75\x63\xc8\xcc\xf5\x69\x19\x2b\xb4\x69\x4b\x55\x8f\xcf"
+ "\x7c\xec\x8e\x39\xd3\x7f\x33\xe7\xd1\x47\xf1\x70\x32\xc9\xd9\x64"
+ "\x31\xb4\xa4\xb1\x0c\x30\x17\x7e\x9c\x5b\xa3\x68\x8a\x26\xc2\x79"
+ "\xb6\xa5\xa7\x89\xf2\xc5\x74\x12\x5e\x74\x9a\x44\xe8\x4e\x13\xb9"
+ "\xea\x79\x92\x40\x75\x23\x31\x7d\x1c\xd5\x3d\x92\x40\xf5\xe5\xd1"
+ "\x54\x37\x35\xcf\xae\xb8\x2d\x0e\xf3\x52\xdd\xad\x29\xf8\x0e\x68"
+ "\x1b\x0e\xe9\xed\xc7\xb8\xd5\x16\xbb\x42\xad\xcc\xfd\x86\x70\x74"
+ "\xcc\xb2\x9a\x77\x78\x3b\xf7\x09\xee\x02\x0e\x6d\x27\xdc\x72\x33"
+ "\x5c\xfb\x09\xa7\x49\x85\x2b\x03\xae\x3c\xb8\xf6\xc1\x55\x03\x97"
+ "\x11\xae\x66\xb8\x8e\xc0\xd5\x06\x57\x07\x5c\x9d\x70\x41\x24\xb7"
+ "\x02\x22\xe7\x15\x15\x70\x41\xde\x15\x06\x56\xce\x0a\x0b\x5c\x0e"
+ "\xc2\x3d\x9f\x00\x17\x94\xb5\x52\x0b\x57\x25\xe1\xd2\xa6\xc0\xfd"
+ "\x00\x5c\xad\x70\xd9\xe0\x39\x1c\x2e\x35\xe4\x6d\x66\xef\xd2\x20"
+ "\x6d\x55\x0c\x81\x7a\x0e\x7e\xad\x82\xfc\xab\x1e\x87\x4b\x03\x17"
+ "\x7c\x73\xf5\x24\xb8\xb2\x07\xf8\x8d\x71\x90\x32\xdb\xa2\xf2\x6f"
+ "\xb4\x09\x67\xe0\x71\x9a\x5b\xdc\x05\x24\xcc\xad\x53\x2b\xb5\xb7"
+ "\x13\xd9\x09\x6e\xf9\xf7\xd6\xad\xa8\x67\x1e\x49\x10\xce\x74\x84"
+ "\x67\xa4\x59\x57\xf1\x72\xbb\x8d\xbc\x53\x81\x67\x9a\x05\x87\xb7"
+ "\xe5\x76\xf6\x7b\x4d\x9c\x4d\xf6\xcb\x64\xe1\x0c\xb8\x62\x67\x2c"
+ "\xcd\x4d\xde\x25\x9c\xfd\x86\x34\x44\x39\x28\xea\xce\xa6\x11\x9d"
+ "\x2e\x94\x79\xc3\x26\xac\xd7\xf2\x83\xb4\x80\x44\xc2\xef\xcd\x14"
+ "\xea\x66\x57\x94\x47\x43\x3d\xc3\xf1\xd9\xad\xbb\x2d\xee\xbc\xc2"
+ "\xa2\xc5\xff\x1d\x55\xfa\x3d\xb4\xc4\x52\x81\x71\xb6\x21\xe7\x65"
+ "\x72\x0c\x7e\x77\x5e\xd1\x14\xaf\x7a\x32\x8a\x1e\xc3\xdf\x16\xe0"
+ "\x1e\xb5\x9a\xf9\x4c\x56\x97\x9b\xcf\x2b\xca\x55\xee\x8a\xa6\x14"
+ "\x48\x0f\x77\xeb\xca\xa3\x59\xf9\xb7\x81\x9e\x34\x27\x40\xbe\x5a"
+ "\x21\xbd\x52\x5f\xeb\xf9\x1f\xee\xfb\xdd\x7a\x4b\x2b\xde\x15\xf9"
+ "\xa4\x53\x78\x2e\x48\x20\xec\xae\x24\xaa\x27\x09\xe9\xe0\x56\x3c"
+ "\x77\x97\x99\xc8\x0c\x4f\x62\xbd\x57\xa8\x73\xcd\x94\x57\xe5\x84"
+ "\xc1\xf7\x57\x4c\xec\xf9\xee\xf5\x4d\xc9\x78\x46\x2a\x2d\x5e\x6a"
+ "\xd8\xfd\x32\x21\xf8\x5b\xac\xdb\x8e\xb1\x24\xbc\xea\x65\x12\x81"
+ "\x6d\xec\x2a\x5e\x31\xc7\x73\x0e\x1d\xfe\x86\x83\xfc\x4f\x3c\x91"
+ "\x4b\x25\x65\xdf\xe4\x16\xda\xb3\xdc\xc8\x68\xba\x62\xab\x4d\x36"
+ "\x6d\x0e\xe6\x57\xdd\x2c\xd0\xf2\xa0\xf8\xde\x8c\xfc\xc4\xf2\xa9"
+ "\xae\xb1\x0c\x9f\xf1\x9c\xbb\x28\x40\x8e\x2a\x27\xb6\x96\xd1\xc8"
+ "\x52\x81\xe5\x60\x7e\xaa\x6f\x80\xff\x35\x1a\xaa\x13\x68\xac\x56"
+ "\xad\x26\x09\x50\xf7\xef\xdd\x2f\x3a\xdb\xa0\x8c\x04\xfa\xa2\xb3"
+ "\x1d\xf2\xd7\x08\xf4\xd6\x99\xe3\x6c\xdc\x8a\x36\x78\xd7\xde\x73"
+ "\xf6\x25\xa3\xb3\x0c\xf2\x39\xba\x8a\x9f\x8f\xb6\xc9\xe6\xa5\x0a"
+ "\x7c\xce\xa4\x2d\x78\xc6\xe6\x99\x4c\xea\x4a\x72\x7d\xc1\x83\xae"
+ "\x22\xf0\x3e\xde\x46\xe6\xed\xf1\xb4\x91\xf1\xbe\xa7\x9c\x83\xf8"
+ "\x6c\x1f\x2d\x94\x93\xd2\x5f\x39\x36\xee\x79\xf5\x42\x97\x4a\xd6"
+ "\x7d\x8e\x36\x97\xfe\x16\xe9\x48\x68\x77\x26\xb5\x6c\x49\xa4\x0e"
+ "\xfd\x67\x84\x34\x82\xd8\x82\xcc\xc7\x44\xca\xa8\x3d\x69\x23\x89"
+ "\x8a\xd4\x46\xd1\x83\xe6\x23\x64\x73\x22\x6d\xc7\x33\x7c\x9b\x3a"
+ "\xdb\x48\xf6\x61\x22\xcf\x6d\x24\xe3\xb2\x13\xa9\xdd\x92\x72\x84"
+ "\xb0\xf4\x46\x92\xfb\x25\x09\xdf\x6c\xa4\x8e\x59\xa0\xff\x3f\x3d"
+ "\x82\xe9\x6d\x04\xcf\xa8\xcc\x6d\xa7\xae\x9c\xe7\x88\x1c\xff\x6f"
+ "\x34\x62\xfa\x57\x24\xf7\x24\x09\x4f\xca\xb2\x47\x55\xc3\x37\xf1"
+ "\xf7\xbb\xa1\x2e\xfc\x39\x7a\xa0\xf4\x1c\x21\x9b\x9f\x21\xd1\xd9"
+ "\x8b\x88\x32\xc9\x4d\xa8\xd5\xf5\x01\x49\x72\x53\xb0\x2f\x26\xb2"
+ "\x65\x05\x89\x48\x72\xe1\x3a\xb6\xcf\x09\x9e\xd3\xbd\x1b\xf2\x42"
+ "\xdb\x0c\xd8\xb6\xcd\x47\x49\x34\x9e\x4f\xce\x7e\xf3\x91\xf8\x9b"
+ "\xa3\x04\x69\x76\x5e\x31\x55\xeb\xd0\x4d\xb5\x43\xdb\x27\x21\x0d"
+ "\xe0\x3b\xcd\x3c\xfe\x0e\x7e\x5f\x9a\x2e\xd0\x40\xb6\xd0\x45\xe4"
+ "\x6e\x9d\x39\x7a\x61\x96\x41\x28\xd7\xc6\xad\xd4\xec\x4e\x17\xea"
+ "\xe4\x93\x37\xc9\x45\xcf\xd8\x15\x66\xc0\xfd\xca\xb2\xa4\xac\x47"
+ "\x29\xfe\x16\x78\xd9\xd9\x55\xbc\xb2\xd9\x43\x6f\x0f\x5f\x20\x8f"
+ "\x11\x78\xd1\x19\xa6\x25\xe1\xf0\xde\x6e\x93\x2d\x48\xf0\x62\x4d"
+ "\x33\x1f\x78\x3e\xd2\x93\x97\xe5\x49\x1b\x67\x93\xcd\x2f\x92\xe0"
+ "\x11\xf1\xd5\x93\x07\xde\x4f\xb6\xc9\x9e\x2b\x63\xdf\x58\xd9\x89"
+ "\x79\x44\xdd\xef\xc9\x1b\x46\x8b\x3a\x9b\xdd\x0a\xcb\x1e\xca\x51"
+ "\x07\xe0\x31\x9e\x9e\x89\x96\xcf\x72\x51\x07\xaf\x6b\x40\x3d\x2f"
+ "\xc7\x73\x5d\x59\xfe\x34\x13\xbc\x4f\x50\x65\x0a\xff\xb7\xe2\x77"
+ "\x68\x49\x79\x42\xcf\xbb\x02\x32\x82\x56\xe9\xcb\xc0\x76\x28\x93"
+ "\xcc\xd4\x01\xb2\x5e\xa6\x4f\x47\xdb\x61\x29\x43\xb9\xe6\x15\xe6"
+ "\x44\xc7\x8e\xa6\x04\xd4\x4f\x28\x23\xb4\xa4\x21\x8e\xfd\x56\xf3"
+ "\x1c\xca\x0d\xd3\x35\x69\x95\x6e\x28\x03\xea\xd4\x02\xef\x46\x1c"
+ "\xe3\x56\x29\x71\x3d\x29\x2d\x3a\x2b\x17\xce\xbd\xe4\x56\xfd\x98"
+ "\xe1\xb7\xb3\xd9\xe7\x99\x43\xda\x81\x3c\x81\xce\x42\xfd\x00\xe9"
+ "\xf7\x7a\x65\x58\xa0\x1b\xc7\x74\x51\x43\x02\xd3\x23\x61\x3c\xe4"
+ "\x93\x1d\x13\xe5\xf1\xfc\x68\x67\x47\x57\xf1\x2a\xc0\xff\xc3\x0e"
+ "\x1f\x39\x29\xfe\x5e\x83\x67\x6c\x42\x5d\xc2\xa0\x4c\x1d\xdc\x47"
+ "\xc1\xfd\x0f\x75\x66\xe4\xb7\x50\xee\x35\xf8\xff\x8e\xeb\xa8\xfd"
+ "\xf1\xe9\x04\xcf\xd3\x04\x79\x5b\xb5\xcf\x46\x8a\xf6\x62\x39\x2f"
+ "\xe2\x39\xa3\x90\x86\x79\x20\xdd\x60\x23\x2f\x6e\x67\xe5\x6b\x34"
+ "\x9d\x50\xd7\x5e\xe5\x7f\xc5\xca\x67\xe5\x62\x79\x9e\xb2\xab\x5e"
+ "\xa1\x1d\xac\xec\xd5\xe1\x9e\xb2\x75\x90\xe6\x29\xff\xf1\x55\x9e"
+ "\x6f\xac\x8e\x85\x6f\xc4\x48\xdb\x50\xf1\x0a\xed\xc4\x32\xe0\x5d"
+ "\x82\x8d\x54\x99\xf1\x5d\x11\xa4\xe1\x6f\x25\xb8\x0a\xab\x4b\x84"
+ "\x32\x8c\x42\x19\x1a\x1b\xa9\x9c\xdd\x4b\xc7\x29\x3c\x3a\x4e\x2c"
+ "\xab\xc4\x53\x96\xb7\x1c\x11\x4f\x25\x64\x9f\xc8\x57\x2c\x57\x8e"
+ "\xe5\x42\xfe\x03\x36\xf2\xd2\x5e\x69\xdb\x41\xa7\x19\xa9\xde\xb2"
+ "\x0f\xf5\x98\x88\xc7\xef\x51\x27\x7b\xea\x8d\xe7\x8c\x82\xee\x6e"
+ "\x47\x79\x11\xf4\xb7\xce\xac\xea\x2a\x5e\x13\xde\x4b\x5f\x87\x63"
+ "\x3e\x77\xf1\xb2\xf1\x55\x78\xce\xea\x75\xb4\x1d\xf2\xa8\x7d\xce"
+ "\x16\xe5\xc8\x23\x90\x36\xc5\x73\xc6\xa9\x1e\xf2\xd8\xb8\x65\x7e"
+ "\xf7\x70\xcc\xb9\x89\x70\xd6\x4a\x1b\xfa\xcf\x88\xab\x29\xd6\x98"
+ "\x4e\x62\xad\xe4\x09\x5f\xad\x37\x24\xe4\x50\x03\xf8\x4c\x1f\xe2"
+ "\xd9\xd4\xc1\xd9\xe4\x35\x5b\x05\x3c\x75\x83\x5f\x99\xfd\x0b\x82"
+ "\x76\xf8\x14\xa7\xfd\xc6\x6a\x3f\x2d\xc8\x16\xfc\x2f\xac\x8f\x2e"
+ "\x07\x3f\x14\x7d\x51\xf0\xff\x35\x65\x1c\xf3\x47\x79\xc8\x5b\x8d"
+ "\xe9\xe8\xab\x82\x9e\xdc\x2d\x79\x47\xab\xf5\x59\x8c\x76\xda\x57"
+ "\x05\x7b\x80\xf5\x75\xfd\xca\x80\x75\xe6\x2b\xf5\x59\xd8\x86\xdc"
+ "\x2c\xca\x5b\x5d\x5d\x06\xd4\xa5\xaa\x4c\xf4\xa3\xb5\x5b\x92\xaa"
+ "\x08\xe5\xab\xf4\x59\xc1\xb5\x41\x2b\xcc\x7f\x82\x58\xe1\x94\x7d"
+ "\xbc\x3e\x0b\xcf\x7a\x2e\xcd\x19\x11\x31\xad\x92\x1a\xce\x4c\xd0"
+ "\x1b\xba\x8a\xb5\x7b\x3c\x67\xe9\x06\x59\xee\x1e\x4f\xdb\xab\xc5"
+ "\xb6\x43\x9a\xe0\x37\xde\x55\x21\x9c\xe5\x8d\xcf\x7e\xcf\xfa\x04"
+ "\x3d\xb2\x0f\x7f\x0b\x6d\x4f\xd8\xed\xa1\x93\xcb\x8e\xe7\x98\x5f"
+ "\x7b\x82\x5b\xbb\x2a\x29\xdb\x40\x84\x7d\xfb\x75\x0d\xfb\x82\xab"
+ "\xd7\x5a\x61\xfe\x7b\x13\xc4\x29\x49\xae\x8f\x29\xd3\x7b\x6b\xff"
+ "\x38\x4b\x2c\x0f\xdf\x79\x78\x55\x2d\xc6\x0f\x21\x7c\xc3\xef\xf9"
+ "\x07\x92\x76\x29\xfb\xb6\x2b\x7d\x7a\xe8\xed\x4a\x57\xf6\x6d\x57"
+ "\xfa\xaa\xe1\x6d\x57\x7a\x46\x00\xed\x52\xf5\x6d\xd7\xba\xf1\x43"
+ "\x68\x57\x7b\xdf\x76\xad\x9b\x3e\xbc\xed\x5a\x37\x23\x80\x76\xc5"
+ "\xf5\xd3\xae\xb3\xa1\xb7\x6b\x9d\xa1\x6f\xbb\x32\xc6\x0f\x6f\xbb"
+ "\x32\x62\x83\xd6\x87\x7a\x8b\x9d\xe9\xc3\x8c\x83\xc1\xeb\xc3\x8c"
+ "\xed\x7d\xf5\xe1\xfa\xf3\x5e\x7d\xb8\xfe\xab\x90\xf4\xa1\xbe\x5c"
+ "\xf4\x29\xd6\xbf\xd7\x47\x1f\x96\x94\xc7\xf5\xaf\x0f\xd7\xeb\x04"
+ "\x7d\xa8\x2b\x0f\x32\xae\x5f\x9f\xdc\xa3\x0f\x15\xe5\x71\x3e\xfa"
+ "\x30\xd2\x02\x36\x72\x7d\x4d\x68\xfa\x70\x7d\x4d\x5f\x7d\xb8\x5e"
+ "\xe9\xab\x0f\xd7\xfb\x9d\xeb\x4c\x4b\xcc\xea\xfe\xf4\x61\x92\xeb"
+ "\x3b\xca\xb0\x61\x56\x07\x57\x9f\xcc\x84\x01\x30\x5f\x33\xf0\xb7"
+ "\x1a\x6a\x82\xfc\xd6\x5b\x7e\xbf\x15\xd1\x89\x7e\x86\x72\xcb\xab"
+ "\x84\x3b\x0e\x91\x78\x53\x4c\x2b\xc4\x01\x0e\x72\xa7\x16\x30\x51"
+ "\x40\xa6\x34\x55\x76\x90\xa6\x98\xe3\x84\x8e\xee\xb4\xd3\x37\x4a"
+ "\xe3\x12\xd2\x11\x9b\x1b\x96\x5a\x33\x1c\x41\x62\x73\x43\x9c\x07"
+ "\x9b\x4d\x2e\xc0\x66\x26\xe2\x31\xeb\x8f\xd6\x8e\x13\x22\x36\xb3"
+ "\xf2\x7b\xf8\x53\xc0\xf0\xd9\x2f\x36\x41\x26\x7c\xb1\xd9\xb0\x87"
+ "\x61\x33\x6b\x66\x5f\x6c\x36\xec\xe9\x1f\x9b\x59\x13\x19\x36\x1b"
+ "\xf6\x04\xd9\x86\x4e\x2f\x36\x1b\xf6\xf8\x60\xf3\xd6\xd2\xb8\xae"
+ "\xe2\xac\x19\xa1\x61\x33\x6b\x86\xa7\xed\x55\x62\xdb\xe1\x5b\x6f"
+ "\xf9\x62\x33\x6b\xab\x5f\x1e\x16\x7d\x19\x07\xfa\x50\x7e\x82\xdb"
+ "\x38\xc7\x0d\x7e\x2b\x5f\x32\x49\x0d\x71\x57\x17\x9e\x19\x4f\xb9"
+ "\xc9\x84\x6e\x50\xcb\xbb\x20\xfe\xed\xea\xd2\x44\xd0\x31\x9d\x9b"
+ "\xa8\x33\x9a\x40\xdd\xa3\x68\x97\x3a\x12\x68\x16\x0b\xf7\xb1\x55"
+ "\x99\x64\x1c\x5c\xd1\x55\x22\x5d\xe1\xff\x38\xba\x21\x7a\x8c\x3e"
+ "\x93\x4c\x8a\xea\x24\x11\x50\x87\xe4\xa8\x7c\x25\x89\x72\x91\x71"
+ "\xf8\x3f\x2d\xf8\x42\x0d\xf1\x59\x38\xf6\x7d\xf2\x0a\xf8\x5e\x56"
+ "\x14\xa5\xeb\xd4\x04\x62\xb5\x08\xe0\x41\xf4\x6e\x8e\xd6\xb8\x37"
+ "\xa8\x39\x1a\x69\xf9\x33\xdd\x9c\x2c\xd4\x89\x8f\x2d\xd5\x02\x86"
+ "\xb4\x34\x57\x83\xdf\x4d\xc0\xb3\x8b\xe9\xad\xa5\x19\xb4\x2b\x7a"
+ "\x8c\xee\x1c\x99\xb4\x3b\x93\xc4\x56\x67\x12\x35\x75\xaa\x39\xa0"
+ "\x41\xf2\x82\xb5\x4a\xe4\x7b\x32\xe5\xe0\x5b\x99\xf0\x2d\xe0\xa5"
+ "\x5b\x07\xdf\x72\xc1\xb7\xbe\x83\x6f\x9d\x82\x6f\x15\xc0\xb7\x0a"
+ "\xd8\xb7\x82\xa3\xf9\x46\xc3\x40\x7d\xd4\x49\x5b\x26\xe0\x5e\xba"
+ "\x5f\x47\x65\x8d\x4a\xc4\xfe\xea\x33\x9b\x35\x41\xe2\x7d\x93\xca"
+ "\x5f\xf9\xa5\xef\x90\x18\x2a\xbf\x55\x3d\x6b\xdb\x17\x14\xe3\xe8"
+ "\x6d\xef\x90\x49\x28\x73\x4d\x8e\x93\x84\x2a\x6e\x55\x9b\xd4\x1d"
+ "\xc1\x7e\xcb\xef\xfc\x87\xe2\x02\x88\x9b\xe5\x10\x87\xca\x2d\xb5"
+ "\xa5\x05\x34\xcb\x19\xa3\x2f\xeb\x8e\xd1\xd7\x2c\x74\x29\x01\x57"
+ "\x34\x4b\x95\x4e\x54\xc7\xb9\xbc\xbf\x1d\x6a\x01\x1b\xf1\x2c\x89"
+ "\x38\xc6\xe5\x47\xe4\x1e\xc6\xbe\xc6\xcd\x31\xbe\x7d\x8d\x9b\x13"
+ "\x08\x97\x5d\x43\xb8\x2d\x06\xc2\xe5\xb4\x11\xc8\xe7\x7b\xe5\x11"
+ "\x56\x56\xb6\x2e\xe9\xcd\x09\x24\xc7\x45\xbf\x86\x38\xb6\x48\x0f"
+ "\xf1\x6f\xd2\x44\x99\xcd\x90\x89\x7d\x70\xd9\xdb\x80\xa6\xdf\x82"
+ "\x5d\x8a\x82\xff\x9f\x02\xde\x11\x6d\x3a\xf9\xd1\x09\x2e\x7b\xb6"
+ "\x0b\xfe\x8f\xea\x1c\x95\xe8\xce\x4d\x26\xae\xe8\xa6\x04\x67\x89"
+ "\xa5\xcc\x0d\xb1\x2c\x2f\x9f\xa4\xc6\x7e\x10\x6b\x87\x9b\x54\x02"
+ "\xee\x16\xba\x23\x50\x1e\x92\x0d\x8b\x0f\x91\xe3\x19\x84\xcb\x3d"
+ "\x4b\x14\xf4\x8c\x5a\xee\xc1\xf5\xcc\x8e\x28\xc7\x96\x0e\xca\x23"
+ "\xbe\xb1\xdf\x01\xde\x45\xe6\x9c\x05\x5b\x6b\x6f\x27\x95\x10\x37"
+ "\xbb\xd7\x69\xc6\xda\xcf\x68\x7e\xb4\x8b\x27\xe3\x22\x3b\x89\xb2"
+ "\xf2\x34\x60\x70\x1d\xe0\xef\x34\xe0\xdc\xce\x70\x8e\x6b\x85\xaa"
+ "\x11\xe3\x85\x8e\x94\xdd\xa7\x19\xc6\x05\xdc\x21\xc6\xd7\x00\xee"
+ "\x56\x7b\x71\xe7\x3a\x03\x18\x2f\xde\x04\x75\xa3\xd8\x2f\xc2\xed"
+ "\x3e\x31\x0a\xdf\xc9\x46\x4c\xe4\x54\x87\x66\x3b\x88\x37\x0e\xcb"
+ "\x1f\xdd\x3d\x5e\x5f\xa3\x7a\x9a\x7e\x77\x8c\xcb\xce\x86\xf4\x08"
+ "\xd5\x6f\x6f\x53\x02\xbd\x47\xb3\x3e\x8a\xfc\x08\x8c\xf3\x6d\x40"
+ "\x0b\xa4\x8b\xea\x69\x72\xdb\x31\x6e\xf3\x53\x48\xc7\x0d\xfb\x48"
+ "\x98\xf6\x11\xda\x06\x34\x4b\xc6\xf2\x6c\xdc\x66\x21\xce\xc2\xf1"
+ "\x8f\x4f\x85\xbe\x4f\xf6\x1b\x37\xd0\xcd\x25\x2f\x4f\x00\x7e\xef"
+ "\x33\x3c\xdf\x2d\xc8\x1c\xd2\xf1\x78\x1a\xe1\x16\x76\x00\xad\xdc"
+ "\x40\xab\x2e\x41\x17\xcc\x16\x74\x41\x51\x67\x46\xb6\x8d\xf2\x49"
+ "\xa9\x61\x34\x67\x2d\x8e\xbd\xb8\xc9\x02\x2d\xa1\x5b\x4e\x02\xbd"
+ "\x3a\x5b\x51\x6f\x44\xf2\x1b\x98\x6e\x40\x7a\x29\x3a\x88\x92\xea"
+ "\xd5\xaa\x77\x72\xcc\x23\xdc\x80\x5f\xd4\x0f\x51\xf9\xb2\xd1\x20"
+ "\x97\x91\x25\x28\xbf\x20\xcf\x51\xf9\x82\xbe\x4a\xae\x04\xb9\x75"
+ "\x6d\x50\xdf\xec\xdc\xa0\x56\xc1\x35\xc1\xa3\x43\xf0\xcc\xaf\x2a"
+ "\xa4\x6d\xf1\x26\x0d\xea\x0f\x6b\x96\x8d\xb8\x80\xb6\x91\x68\x6f"
+ "\x36\xa8\x63\x04\x1a\x2f\x57\x93\xbb\x1c\x44\x06\x75\x52\x42\x7d"
+ "\xc9\xee\x65\x24\xa2\x51\x73\x8c\xb8\x41\x36\x3c\x74\x9f\xb9\x42"
+ "\x45\xa0\x5c\xce\xa4\xfe\x9c\x88\x34\x93\xf9\xc7\x5d\xce\x51\x2f"
+ "\xee\x72\x8e\x22\xed\x18\xee\x72\x8e\x5c\x89\xb8\xfb\x34\x59\xc0"
+ "\x5d\x98\x73\xbc\x80\xa7\x64\xab\xeb\x7d\xa0\x51\x0e\xf6\x6d\x12"
+ "\xc4\xcc\xc1\x3f\x21\x66\x72\xed\x97\x2b\x66\xce\x77\xa9\x55\x70"
+ "\x5d\x10\xcc\x40\xb9\x02\x66\x90\x56\x9f\x26\x77\x13\x0f\x8d\x04"
+ "\x59\x2d\xb9\x55\xad\xca\x25\x8f\x82\xac\x46\x44\xe5\x4f\x20\x8d"
+ "\x02\x9d\xf2\x41\x4e\x29\x7f\x8c\xcb\x9b\x98\xfb\x37\xa2\xec\x2e"
+ "\xa0\xd4\xea\x7a\x9b\xf0\x72\x73\x22\xf6\x33\x83\xff\x5b\xe6\x19"
+ "\xc3\xc1\xfe\xb8\x28\x2d\x8e\xdb\xdc\x16\xe7\xd6\x35\x96\xf1\xba"
+ "\x5b\x53\xa8\x62\x6a\x3b\xf6\xbd\xf1\xba\x91\x84\x57\x3c\x92\xd0"
+ "\x55\x9c\xa7\xb5\x11\xda\x2a\xf4\x07\x97\x58\xd0\x77\x41\xfd\xbb"
+ "\x43\xe8\x2f\x56\x60\xdf\x79\x5e\x99\x67\x7c\x02\x75\x82\xd8\x2f"
+ "\x27\xf6\xdb\xe5\x21\x0f\xc7\x60\xbf\x1d\xd3\x29\x79\xf9\x9e\x7e"
+ "\x3b\xcf\x33\xbe\xb7\x71\x79\x5b\xb1\xcf\xc7\xfb\xbb\x7c\xc2\xf2"
+ "\x79\x7e\xb7\x79\x04\xea\x7a\xef\xef\xd8\x33\xe8\x15\xe2\xe4\x48"
+ "\x44\xbf\x3e\x86\xbc\xb1\x0c\xe4\x27\xfc\x38\x57\x30\x02\xee\x1c"
+ "\xd0\xe5\x55\xb8\x87\xc1\x7d\x2d\x96\x1d\x9c\xbd\xca\x17\xd6\x7f"
+ "\x42\xfb\x8f\x88\xba\x51\x98\x4b\xa1\xbd\x9d\x28\x4e\x88\xff\x77"
+ "\x15\xe7\x57\x78\xc6\x59\xbc\xf9\x7b\xf8\x33\x19\xbf\x0d\x3c\x0a"
+ "\x67\x63\x3f\xec\x59\x52\xde\xbd\xc2\x33\x09\x57\x01\x6f\x66\xe3"
+ "\x18\x2d\xe0\x57\xd6\x45\x35\x8f\x88\xf7\x87\x51\x3e\xb0\xbf\x14"
+ "\xfd\x35\x51\xff\x4e\x61\xdf\x2d\x50\x82\x3d\xb5\x48\xbf\xdb\x1f"
+ "\x3d\x6c\x5c\xc1\x24\x7f\xef\x82\xa3\x45\x81\xdf\xf5\x6f\xd3\xd5"
+ "\x6e\x1a\x64\x59\xdb\xfd\xfa\x88\x31\x7a\x6d\xd2\x3e\xb7\x81\x77"
+ "\x26\x47\x99\xb2\x4f\x06\xe9\x5f\x14\x74\xf8\x2b\xd7\x2d\x37\xa7"
+ "\xb8\x2a\xf5\x5a\xec\x93\x6c\xda\xe7\x22\x6f\x9e\x68\xe7\x92\x26"
+ "\x4e\x20\x8a\x36\xa2\x44\xff\x69\x66\xc7\xc7\x14\x7d\x28\xfd\x09"
+ "\x12\xdb\xfd\x5d\x72\x94\x13\x7c\xc1\x97\x4e\x90\x29\xfc\xf2\xe8"
+ "\x31\x25\xcb\x48\x78\x37\xf8\xab\xdd\xcb\x35\x51\x9f\x1e\x69\x27"
+ "\x20\x27\xda\xa6\x4e\x1b\xa9\x86\xbc\xf4\xeb\xe4\xc8\x27\x52\xa8"
+ "\xc3\x92\xf2\x32\x49\x52\xbb\x0d\x39\x5f\x12\x05\xe8\x22\xa5\x35"
+ "\xeb\x6d\x62\x75\x9d\x24\x23\x36\x72\x2a\xab\xeb\x2b\xa2\x5b\x06"
+ "\x3a\x0c\x74\x56\xee\x33\xa0\xab\x5d\x67\xc9\x2e\xa9\xae\x7e\xfe"
+ "\x35\xaf\xae\xfe\x0e\x74\x75\x31\xe8\xea\xdc\x68\xd2\xa4\x35\x10"
+ "\xd0\x1d\xa3\x66\x69\xa3\x1c\x39\x5a\xd0\xd9\x1b\x41\x67\x67\x7d"
+ "\x45\x04\x7d\xdd\xd1\x4e\x40\xd7\x46\x56\xad\x26\xe3\x9c\x6b\x40"
+ "\x67\x7f\xa7\xf9\xd1\x8e\x1c\xa6\xb3\x77\xae\x06\x9d\xbd\x06\x7c"
+ "\xe2\xd5\xa0\xb3\x3b\xfa\xd1\xd9\xa7\xfc\xf8\xc3\xa2\xfe\xe9\x5e"
+ "\xa3\xe6\x76\x72\x14\xc7\x55\xb8\x1d\x7f\x1f\x15\x24\x4e\xb6\x6a"
+ "\xfd\xf1\x00\xe9\x8d\xf4\xe7\x81\x0f\x8d\xc0\x03\xc1\x6f\x75\x8c"
+ "\x4a\x74\x82\x4d\x73\x47\xd6\xd5\xfc\xe9\x44\x2b\x17\x99\x41\x94"
+ "\xb3\xb4\x1f\xd3\xee\x75\xc9\xe0\xf7\x27\x2b\x5c\x25\xe6\x94\x12"
+ "\xf0\xa9\xdd\xe0\x7b\x3b\xbb\xa2\x23\x80\x06\x4a\xfb\x06\x4d\x14"
+ "\xd2\x90\x1f\x0f\xfc\x1c\xb9\x6c\x3e\xe8\xd0\xc9\x55\xcb\x48\xbc"
+ "\x53\x57\x77\x84\xea\xea\x9a\xdd\xba\xba\x16\xf8\x6d\xe4\xaf\x6d"
+ "\xc8\x97\xbf\x10\x48\xb3\x53\x7d\x7d\x8d\x5b\x61\x4e\xb1\x2b\xea"
+ "\x5a\xe1\xb9\x1d\xdf\xe7\x2c\x22\x8a\x24\xf5\x79\x03\xe3\xd7\xeb"
+ "\x04\xf9\xc4\xf8\x75\x94\xe8\x20\xee\x43\x9b\x2b\xd8\x57\x91\x67"
+ "\x10\x2f\x08\xfe\xbe\x97\x6f\xbd\x6c\xac\xc8\xb7\xc6\x0e\x03\x01"
+ "\x7b\x32\xaa\xc7\xd6\x0a\x7c\x3b\x4a\x3c\x76\x16\xe8\x1d\x59\x05"
+ "\xb6\xd6\x39\x5c\xb6\x56\x8c\x63\xd0\xd6\xa2\x9d\x45\xbe\xed\x0c"
+ "\x9a\x6f\x85\x7e\xe7\xbf\x0f\xcc\x37\x63\x5c\x88\x7c\xdb\xef\xe5"
+ "\x9b\x71\x3e\xd5\x19\x67\xbb\x75\xc6\x39\xbe\x7c\x33\x6a\xbd\x7c"
+ "\x33\x26\xc3\xb3\xc6\xcb\xb7\xb3\x41\xf0\x6d\xc4\xe9\x2b\x97\x6f"
+ "\xbf\xb7\x85\xc8\xb7\x10\xe5\x6d\xb9\x5c\xc2\x37\x90\x37\x23\xc8"
+ "\x9b\xb1\x97\xbc\x19\x25\xf2\x66\x04\x79\x33\x4a\xe4\xed\x64\x10"
+ "\x7c\xbb\xe6\xd8\x95\xcb\xb7\x17\xfd\xee\x7f\x39\x30\xdf\x4c\x21"
+ "\xca\xdb\xf2\x54\x2f\xdf\x4c\x20\x6f\x26\x90\x37\x53\x2f\x79\x33"
+ "\x49\xe4\xcd\x04\xf2\x66\x92\xc8\xdb\xd1\x20\xf8\x76\xed\x67\x57"
+ "\x2e\xdf\x5e\xf2\x3b\x76\x38\x08\xdf\x42\x95\xb7\x03\x12\xbe\x81"
+ "\xbc\x99\x40\xde\x4c\xbd\xe4\xcd\x24\x91\x37\x13\xc8\x9b\x49\x22"
+ "\x6f\x1f\x05\xc1\xb7\xfb\x8a\xaf\x5c\xbe\xe9\xfc\xae\x7f\x1e\x98"
+ "\x6f\xf5\x21\xca\x9b\x66\x9c\x97\x6f\xf5\x20\x6f\xf5\x20\x6f\xf5"
+ "\xbd\xe4\xad\x5e\x22\x6f\xf5\x20\x6f\xf5\x12\x79\xdb\x12\x04\xdf"
+ "\xe6\x4d\xbd\x72\xf9\xa6\xf7\xdb\xff\xe9\xe1\x9b\x87\x67\xc8\x3f"
+ "\x81\x6f\x34\x99\xb8\xc0\x9f\xfc\xf3\x62\xc6\x37\xe4\x97\xc0\xbb"
+ "\x33\xc9\x51\x3a\x91\x67\x2e\x91\x67\x48\x3f\xe4\x1b\xfa\x91\x02"
+ "\xdf\x64\xe1\xd1\xe8\x43\xba\xc0\x97\xf4\xf8\x91\x4f\x6a\xa8\xa3"
+ "\x51\xf3\x5a\x8f\x1f\xe9\xea\xed\x47\xae\x90\xfa\x91\x6f\xfb\xf0"
+ "\xab\xe4\x1c\xf0\x8b\x13\xf9\xf5\x9c\x1f\x3f\x72\xd9\x7f\xf9\xe1"
+ "\x57\xf3\xa0\xfc\x02\xde\x8c\x73\x9e\x61\xfc\xda\x29\xfa\xff\x95"
+ "\xe9\x43\xe4\xd7\x3a\xe0\x17\xfa\xff\x47\x09\xb7\x6b\x41\xb0\xfc"
+ "\x2a\x1b\xd4\xff\xef\x9f\x5f\xa6\xb8\xe0\xf8\xb5\x3c\xd5\xcb\x2f"
+ "\xd3\x6c\x17\xd8\x34\x8f\x3d\xf3\xf2\x8b\xd9\x33\x57\x6f\x7b\xb6"
+ "\x42\x6a\xcf\x02\xe1\x57\x2f\x7b\x76\x45\xf1\xeb\x65\xbf\xfd\xff"
+ "\x6e\x88\xc5\xdd\xa0\xe7\xb0\xbf\x32\xb2\x1d\xe2\x64\x17\xfd\x7a"
+ "\x56\x27\xc4\xc9\xae\x51\x89\xa5\xab\x49\xac\x73\x03\xc4\xc9\xc0"
+ "\xbb\x92\xd5\x64\x4a\xf1\x6a\x12\xce\xaf\x84\x58\xf9\x04\xc4\xca"
+ "\xa0\x9f\xba\xbf\xd5\x44\x59\x52\xec\x84\x87\x58\x19\xfb\xc1\xa0"
+ "\xbe\xb1\xf4\x5b\x88\x95\xdb\x40\xf7\xb5\xed\x64\xb1\xf2\x57\x9e"
+ "\x58\xf9\x03\x9f\x58\xf9\xa5\xe7\xc5\x58\x59\xa4\x7f\xa5\x94\xf6"
+ "\xcf\xfe\xc9\x4f\xac\x6c\x1e\x34\x56\xc6\x18\x79\x17\xc6\xcb\xdf"
+ "\x69\xc6\xee\x10\x75\xdb\xce\x53\x43\x8c\x95\xbf\x83\x58\xb9\x80"
+ "\xd1\x7e\x67\xd0\xb4\x2f\xf7\x3b\xff\x03\x65\x03\xe5\xa5\xc7\x16"
+ "\x01\x9d\x3d\x36\xc8\x09\x36\x08\xfb\x33\xba\x4b\xea\xf6\x03\x5e"
+ "\x05\xf9\x10\x6c\xd2\x86\xe8\x08\x94\x0d\x94\x13\x94\x0d\xc1\x16"
+ "\x81\x1e\x04\x5b\x94\x56\xfd\x3c\x89\xdf\xfd\x3c\x99\xec\x52\xf8"
+ "\xc6\xc8\x4f\xa6\x22\x3f\xbc\xba\x8d\xef\xad\xdb\x96\x4a\x75\xdb"
+ "\x07\x7d\x6d\xd1\x60\xba\xed\x79\x7f\xb2\x62\x1e\x54\x56\x50\x46"
+ "\x04\x7b\x04\xf2\x72\x21\x64\x65\xe7\xff\x0b\x96\x5f\x7f\xf4\x3b"
+ "\xff\x23\x30\x7e\x19\x27\x0f\xce\x2f\x63\x1c\xf0\xcb\xe0\xe5\x97"
+ "\x6f\x6c\xec\xe5\x17\x8b\x8d\xf9\xde\xb1\xf1\x52\x69\x6c\x1c\x08"
+ "\xbf\x7a\xc7\xc6\x57\x12\xbf\x5e\x71\x0d\x91\x5f\x01\xc8\x97\x11"
+ "\xe4\x6b\xc5\x38\x09\xbf\x7c\x62\x62\x09\xbf\x24\xf2\x25\x89\x89"
+ "\x97\x4a\x63\xe2\x40\xf8\xd5\x3b\x26\xbe\x92\xf8\x55\xe1\x77\xfe"
+ "\x47\x60\xfc\x32\x05\x20\x5f\x26\x90\xaf\x15\x1a\x2f\xbf\x7c\x63"
+ "\x61\x2f\xbf\x4c\x12\xf9\x92\xf8\x0e\x4b\xa5\xbe\x43\x20\xfc\xea"
+ "\x1d\x0b\x5f\x49\xfc\xda\x39\x7f\x88\xfc\x0a\x40\xbe\x4c\x28\x5f"
+ "\x07\x24\xfc\xf2\x89\x81\x25\xfc\x92\xc8\x97\x24\x06\x5e\x2a\x8d"
+ "\x81\x03\xe1\x57\xef\x18\xf8\x4a\xe2\x57\xa5\x7c\x68\xfc\xaa\x0f"
+ "\x40\xbe\xea\x41\xbe\x9e\x57\x7a\xf9\xe5\x1b\xfb\x7a\xf9\x55\x2f"
+ "\x91\x2f\x49\xec\xbb\x54\x1a\xfb\x06\xc2\xaf\xde\xb1\xef\x95\xc4"
+ "\xaf\xaa\x03\x03\xc5\x52\xd2\x18\xca\x95\xeb\xe5\x17\xf2\xc6\x09"
+ "\xb1\x93\x53\x5e\xb7\xdf\x7f\xfc\xa4\x49\xf3\x17\xef\xe2\xde\x35"
+ "\x4f\xb6\xe3\x7a\x10\xe6\x13\xd2\x5e\x3e\x61\xa3\xe6\x4f\xc4\x37"
+ "\xe6\xfd\xa8\x4f\x0c\xe5\xf4\xf4\x51\x2c\xf2\x17\xf3\xfe\x25\xe4"
+ "\x18\x0a\xf9\x84\x71\x94\x6b\x1d\xf0\x49\xf4\xe3\x77\x0d\xb1\x8f"
+ "\xc2\x79\x46\xcd\xed\x02\x3f\x3e\x7b\x11\xc4\x50\x8b\x83\xe5\xd3"
+ "\xee\x54\x7f\x7c\xc2\x7e\x22\x8c\x79\x31\x96\xc2\x71\xc7\xa6\xb6"
+ "\x76\x52\x9c\x49\x94\xc2\xd8\x63\xbb\xef\xd8\x63\xe9\x71\x88\xa9"
+ "\xd6\x00\xdf\x9c\xc9\x44\x7f\x9c\x4c\x29\x79\x9e\xc5\x54\x9e\x78"
+ "\xaa\xa9\xd3\x21\x8c\x3d\x5a\x5d\x36\xf2\x84\x8d\x3a\x76\x43\x7e"
+ "\x8c\xa3\x2c\x29\x3b\x09\xca\x4a\xee\x97\x44\x81\x3c\x80\x18\x4c"
+ "\xe0\x87\x34\x86\xaa\x96\x8e\x37\x2e\xf3\x17\x43\x0d\x3e\xde\x58"
+ "\x79\x8a\xc5\x4f\xc2\x78\xe3\x65\x11\x43\xed\xf1\x3b\xfe\x31\xf3"
+ "\x4d\xd6\xdf\x80\xb4\xb7\xaa\x5d\x04\xf0\xf4\x75\x54\x07\xeb\xd7"
+ "\x73\xe9\xeb\x6a\x30\xa6\xc5\x78\xd6\x9a\x65\x26\xc5\x9b\x88\xb2"
+ "\xbb\x2b\x39\x0a\x62\x54\x85\x0b\x74\xdd\x4b\x27\x18\xed\x71\x8d"
+ "\x98\x7d\xa5\x46\x98\x2b\x83\xb1\x2c\xca\x8a\x30\xe6\xb8\x98\x4c"
+ "\xae\x3c\x46\xe2\x05\xf9\x00\xb9\x70\xe9\xcc\x29\xbc\xa2\xae\x05"
+ "\xe5\xe4\x89\x23\xd4\x81\x3c\x40\xf9\xf8\xf4\x08\xf2\xe6\x6d\x92"
+ "\x7b\x94\xf1\x46\xe0\x0b\xe7\x3b\x16\xdc\x57\x36\x3e\xf3\xc3\x9f"
+ "\xda\xc0\xf8\xb3\xc6\x97\x3f\x55\xa1\x8e\x07\x7b\xe6\x47\xae\x51"
+ "\x73\x55\xe2\x78\xf0\xce\x67\x83\xe5\xcf\x6b\x79\xa1\xf1\xc7\x18"
+ "\x17\x1a\x7f\x8c\xb3\x85\xb1\x45\x1f\xfe\x18\x35\x8c\x3f\xc6\x39"
+ "\x18\x2b\x79\xf9\x73\x36\x40\xfe\xf4\x8a\x91\xae\x28\xfe\xec\xf5"
+ "\xdb\xff\x33\x08\x7f\x42\x94\x1f\x63\xb3\x30\x86\xe8\xcb\x1f\x51"
+ "\x7e\x8c\x2d\x18\x1b\x79\xf9\x73\x32\x40\xfe\xf4\x8a\x89\xae\x28"
+ "\xfe\xbc\xee\xb7\xff\x7b\x60\xfe\x98\x42\x94\x1f\xd3\x6c\x61\xac"
+ "\xd0\x87\x3f\x26\x51\x7e\x4c\x73\x30\x16\xf2\xf2\xe7\x68\x80\xfc"
+ "\xe9\xdd\x7f\x7a\x25\xf1\xe7\xff\xa4\x84\xc8\x9f\x10\xe5\xc7\xd4"
+ "\x2c\x8c\x09\xfa\xf2\x47\x94\x1f\x53\x0b\xc6\x3e\x5e\xfe\x7c\x14"
+ "\x20\x7f\x7a\xc5\x3c\x57\x14\x7f\xde\x24\xa1\xf1\xa7\x3e\x44\xf9"
+ "\xa9\x9f\x2d\x8c\xfd\xf9\xf0\xa7\x5e\x94\x9f\xfa\x39\x18\xeb\x78"
+ "\xf9\xb3\x25\x40\xfe\xf4\x8a\x71\xae\x28\xfe\xfc\x69\xcf\x60\xe3"
+ "\x45\x1e\xdf\x59\x3a\x2e\xeb\x04\xff\x0d\xfd\x67\xf4\x9d\x9b\x3a"
+ "\x6b\x89\x6b\x0d\xe3\x4d\xf1\x39\xa2\x2c\x11\x79\x23\x8c\xc9\xae"
+ "\x64\x63\xb2\x82\xdf\x56\xb8\x6c\x3e\xcd\x0f\x8f\x46\xbf\x4c\x18"
+ "\x77\x15\xc6\x26\x4c\xf8\xae\xdd\x29\xf1\xdf\x30\x46\x05\xdf\x9b"
+ "\x60\x9c\x9a\xfb\x55\x10\x7e\xdb\x62\x7f\x7c\x19\x7c\x6c\xa2\x52"
+ "\x32\x8f\xcf\x13\x7b\x0e\x2b\x5f\x82\x1e\x77\x7d\xcb\xef\xf9\x4f"
+ "\x03\xf3\xc5\x14\x17\x1c\x5f\xc0\xde\x14\x2e\x4f\x65\x7c\x39\xda"
+ "\x8b\x2f\x26\x8d\x53\x62\x77\x02\xe7\x4b\x2f\x7b\x73\x45\xf1\xe5"
+ "\xed\x66\xbf\xb1\x26\xe8\x25\xe4\x09\xce\xef\x2e\x5d\x4c\x62\x8b"
+ "\x8f\x91\x29\xce\x6f\xa3\xc7\xcc\x02\x3d\xe7\x5c\x19\x1d\xd1\x04"
+ "\x3a\x2e\xa7\x93\x7e\x1d\xd9\x39\x2a\xf1\x50\x8b\x9d\x34\xa5\xd8"
+ "\x48\xf7\x86\x64\xa2\x3b\x81\x73\xd5\x6b\xc9\x8b\xe9\x18\xcb\xbf"
+ "\x4f\x3e\x3d\x72\x9a\xcc\xda\x47\x9d\xd6\x8e\x5a\x62\xd8\xf4\x3e"
+ "\xa1\x2b\xd5\x63\x76\x43\x9e\x85\x40\xc3\x53\xdc\x3b\x45\xe7\x21"
+ "\x1e\xbd\x2b\x8b\x28\x67\x74\x50\x47\x53\xc7\x21\xb2\x0b\xbe\x65"
+ "\xca\x22\x04\xe9\x8b\x3c\xd1\x3d\x8f\xf1\xe7\x47\x8c\x27\x4f\x31"
+ "\x9e\xec\x94\xc4\x9f\x2a\x78\x7f\x5c\x0b\xfc\xf8\xbe\x17\x3f\x8e"
+ "\xb4\x13\xa0\xef\xa8\x59\x9d\xc0\x8f\x4e\x0f\x3f\x4e\x92\x9c\xb5"
+ "\xc8\x0f\x5b\xcf\x7c\xd7\x6e\x91\x1f\x95\xa8\xbf\xb4\x44\xb9\xc3"
+ "\x13\x7f\x9e\x92\xf0\xc3\xb3\x26\x4b\xca\x0f\x4f\xec\xbf\x01\xf8"
+ "\x91\xe9\x8d\x3f\xcf\x43\xfc\xb9\x03\xe2\xcf\xdc\xbf\x11\x6e\x47"
+ "\x4e\xb0\xfc\x78\xd7\xaf\xfd\xf7\xf0\x02\x6d\x8b\x33\xb2\xae\x06"
+ "\xf9\x60\xcd\xaa\x21\xc8\x13\xb4\x27\xee\x6f\xa3\x23\xb2\x33\x40"
+ "\x76\x6c\xa3\x12\xbb\x29\xc4\xfc\x10\xef\x5b\xe7\xff\x9d\x60\x9f"
+ "\x01\xe3\x81\xd3\x69\xb5\xd7\x12\xa4\xbd\x61\xd3\xdf\x05\x3e\x9c"
+ "\xe2\x6a\x22\x16\x74\x12\xee\x4e\xc0\x21\xc4\xfb\xca\x85\xb8\x2e"
+ "\x17\x74\xdb\xae\x65\x24\x7e\x86\x96\x3a\x30\x36\x45\x19\xc2\xb9"
+ "\x27\xa8\xd7\x9a\xb4\xff\x45\xb0\x5f\xc7\xa9\x30\xa7\x98\x32\x08"
+ "\x41\xfd\x86\x74\x1f\xb1\xde\xcb\x27\x9c\x4f\x22\xf0\x6a\x6e\x00"
+ "\xf3\x5c\xa5\xfc\x9a\x6f\x0b\x68\x7e\x72\xb7\xd8\x5f\x50\xe9\xe9"
+ "\x53\x0b\xb5\xbf\xc0\xd3\xa7\xf6\x1d\x9b\x4f\x92\xfb\x39\xc8\x4f"
+ "\xd0\xfc\x7a\x4f\x19\x18\xbf\x8c\x71\xc1\xf3\xab\xab\x1f\x7e\xbd"
+ "\x57\xdb\x97\x5f\xc6\xd9\x12\x7e\xed\xf7\xf2\xcb\xa8\x61\xfc\x32"
+ "\xce\xf1\xf2\xcb\x98\x3c\x38\xbf\x06\x98\xdf\xfa\x83\xe7\xd7\xfb"
+ "\x7e\xe3\x9f\x5e\xfc\x0a\x41\xbe\xbe\xeb\x87\x5f\xff\xa6\xe9\x87"
+ "\x5f\x12\xf9\x5a\x2e\x97\xf0\x4b\x94\x2f\xa3\x44\xbe\x8c\x01\xc8"
+ "\xd7\x00\xf3\x5a\x7f\xf0\xfc\xda\xef\x77\xfe\x8f\x2f\xbf\x4c\x21"
+ "\xc8\xd7\x17\xfd\xf0\xeb\x83\xe8\xbe\xfc\x32\x49\xe4\x0b\x7c\x8b"
+ "\x1e\x7e\x99\x44\xf9\x32\x49\xe4\xcb\x14\x80\x7c\x0d\x30\x9f\xf5"
+ "\x07\xcf\xaf\x7f\x1f\x70\xfe\x8f\x84\x5f\x21\xc8\xd7\xc7\xfd\xf0"
+ "\xeb\xdf\xcd\xfd\xf0\x4b\x2a\x5f\x07\x24\xfc\x12\xe5\xcb\x24\x91"
+ "\x2f\x53\x00\xf2\x35\xc0\x3c\xd6\x1f\x3c\xbf\xfe\xc3\xaf\xff\xe7"
+ "\xcb\xaf\xfa\x10\xe4\x2b\xb7\x1f\x7e\xd5\x66\xf5\xe5\x57\xbd\x44"
+ "\xbe\x34\xe3\xbc\xfc\xaa\x17\xe5\xab\x5e\x22\x5f\xf5\x01\xc8\xd7"
+ "\x00\xf3\x57\x7f\xf0\xfc\xfa\xd0\x6f\xff\xb7\x94\x5f\xdd\x7a\x8f"
+ "\x7f\xb8\xcf\x97\x5f\xe0\xaf\x47\xb5\xb1\xd8\xca\xc3\x2f\xff\xbe"
+ "\xe1\x5f\x62\x7b\x78\xf5\x95\xd7\x37\x14\xf8\x24\x8e\x53\x20\x7f"
+ "\xd0\x47\x44\x9f\xb0\x5b\xc7\x78\x84\x63\x80\x03\xfa\x85\x81\xac"
+ "\x7f\x0a\x81\x4f\x9e\xb8\x6a\xd8\xf9\x74\x38\x14\x3e\xfd\xa7\xdf"
+ "\xf5\x4f\xbe\x7c\xf2\xd8\xad\x40\xf9\xd4\x9f\xcd\xfa\x4f\x4b\x5f"
+ "\x3e\x99\x66\x7b\xf9\xc4\xec\x14\xda\x2e\xb4\x55\xbe\x7c\x1a\xc0"
+ "\x5e\x05\xb2\xfe\xe2\x07\xcf\xa7\x03\x7e\xf5\x5f\x19\xc7\xd7\xc0"
+ "\x55\x0b\x97\x01\x2e\xb3\x9b\x23\xd3\xab\x38\x5e\xc8\x8f\xfb\xfc"
+ "\x55\x15\xf4\x79\x3f\x92\x8e\x9c\xee\xc2\x3c\x40\xdb\x71\x98\xcf"
+ "\x53\x06\x2d\x26\x48\x3b\x83\x42\x96\x42\xaa\x58\xde\x51\x9e\xb2"
+ "\x14\xf9\x24\xc1\x53\x16\xb4\x29\x0f\x68\x6d\x88\xca\x4f\x18\x09"
+ "\xf9\xcd\xb4\xb8\x20\x11\xf2\x46\x08\x65\xe6\x87\x0b\xfb\x4b\x7b"
+ "\xf2\xba\x0b\x64\xb8\x3e\xdc\x10\x25\x83\xbc\xac\xcc\xd1\x62\x3e"
+ "\x15\x5f\x40\x04\x3b\xec\xe6\x38\xfc\x5e\xef\x7a\x8e\x11\xf3\xc5"
+ "\x4a\xeb\xa8\xc8\x4f\x10\xca\x13\xf3\x5c\x43\x47\xde\xf8\xb8\xd8"
+ "\x16\xb5\x34\x9f\x7b\x2a\xc1\x32\x3d\xf9\xe4\x62\x59\x93\x7c\xf2"
+ "\xbc\x46\x08\x9e\x47\x2b\xd4\x2f\x8b\x23\x62\xfd\x14\x98\xd7\x3d"
+ "\x26\x3f\xc6\x2d\x0b\x8f\xe3\x39\x12\xe7\xf3\x9b\x42\x22\xe4\x17"
+ "\xf3\x46\x0a\x79\x47\xae\x4c\x81\xbc\x93\x45\x9a\x87\x4b\x69\x2e"
+ "\xe6\x8b\xf2\xd0\x51\xfa\xce\x5d\xc0\x61\x59\xf8\x5e\x49\x47\x3e"
+ "\x9f\x0a\x6d\x98\xe2\xc9\xe7\xf9\x9e\x55\x43\x88\x90\x97\x23\x77"
+ "\x8b\x3c\xb9\x16\xda\x91\xe0\xc9\x87\xfb\x29\x78\xf2\xe6\xba\xc9"
+ "\xf5\xbb\xbd\xb4\x19\xeb\x2e\x2e\x38\xe2\xce\x0f\x7f\xbc\x77\x99"
+ "\x51\xf9\x32\x1b\xe6\x6b\x6c\x17\xca\x46\xfe\x95\x41\xfe\x1f\x89"
+ "\x34\x4a\x64\x3c\x51\xf6\xf0\xc4\xcd\xb9\xf0\x9d\xa1\x9a\xd5\x75"
+ "\x9c\x98\x6f\x46\xdf\x7c\xe1\xd2\x7c\x3f\x66\x74\x2c\x8d\x00\xda"
+ "\xcc\xee\x9b\x37\x42\x9a\xf7\x3a\x96\x77\x6b\x2d\xe4\x9d\xd3\x37"
+ "\xaf\x52\x9a\xf7\x27\x2c\x6f\xa1\x16\xf2\x26\xf7\x53\xd7\xb1\x92"
+ "\xbc\xd1\x2c\x6f\x91\x1a\xf2\xce\xef\x9b\x57\x25\xcd\x7b\x3d\xcb"
+ "\x5b\x86\x75\x48\xe9\x9b\x37\x41\x9a\xf7\x06\x96\xf7\x45\x1b\xe4"
+ "\x4d\xed\x9b\x37\x4f\x9a\xf7\xa7\x2c\xef\x4b\x15\x90\x57\xd3\x3b"
+ "\xef\x6e\xc6\xdb\x9b\x45\xde\xc6\xb0\xbc\xba\xd9\x90\x37\xad\x9f"
+ "\xb6\x85\x09\xe5\xb2\xbc\xe3\x59\xde\x17\x26\x43\x5e\x6d\x3f\xbc"
+ "\x90\xe6\x9d\xc0\xf2\x56\x87\x43\xde\x8c\x7e\x78\x21\xcd\x7b\x23"
+ "\xcb\x5b\xde\x06\x79\xb3\xfa\xe1\x85\x37\xef\x98\x3f\x6e\x87\x3c"
+ "\xd9\xd0\xce\xe6\x7e\x68\x2b\x2d\xf3\x26\x56\xe6\xbf\x3c\x0e\xf9"
+ "\xf3\xfa\xa1\xad\x34\xef\xcd\x2c\x6f\x45\x27\xe4\xdd\xda\x0f\x6d"
+ "\xa5\x79\x7f\xc6\xf2\xee\xdc\x0b\x79\x8b\xfa\xe6\x05\x79\x63\xf4"
+ "\xfd\x85\x48\xdf\x58\x96\xbf\x72\x0e\xe4\x2f\xe9\x87\xbe\x58\x9e"
+ "\x47\x66\x6f\x61\x79\x5f\xd6\x40\xde\xb2\x7e\xe8\x2b\xcd\x7b\x2b"
+ "\xcb\xfb\xa7\x76\xc8\xbb\xbd\x1f\xfa\x4a\xf3\xde\xc6\xf2\xbe\x8a"
+ "\x98\xac\xe8\x87\xbe\xd2\xbc\x6a\x96\xf7\x35\x33\xe4\xad\xec\xa7"
+ "\xbe\x37\x4b\xf2\x4e\x64\x79\xf7\x62\x7d\xf7\xf4\xc3\x0f\x69\xde"
+ "\xdb\x59\xde\xb7\xf2\x20\xef\xde\x7e\xf8\x21\xcd\xfb\x73\x96\xf7"
+ "\x0d\x94\xe3\x7d\xfd\xf0\xa3\x27\x2f\xd8\x85\x49\xee\x31\xff\x67"
+ "\xdf\x6e\xcc\x2f\x0b\x17\xe6\xb5\x52\x4e\xd8\xdf\x5f\xc8\x0b\x38"
+ "\x31\x88\xfa\xee\x0e\x56\xe6\x9b\x89\x90\x4f\xd8\xfb\x0d\xf3\x34"
+ "\x3a\x04\x7d\x04\xf6\xc5\x75\xcf\x6e\xaf\xee\xbe\x93\xe5\xdd\xfd"
+ "\x16\xe4\xdd\x2f\xd5\xa1\x94\x0b\x97\xe6\xbb\x8b\xe5\xfb\x10\x69"
+ "\x55\xeb\x9b\x2f\xc2\x9b\x6f\xcc\xbb\xfb\xe0\xfd\x81\xea\x5e\xfa"
+ "\x18\xea\x29\x2d\xeb\x6e\x56\xd6\x7b\xc9\x90\xd7\xe0\x9b\xcf\xf5"
+ "\x0b\x49\xbe\x5f\xb0\x7c\xff\x86\xb4\x31\xfa\xe6\x53\x49\xf3\xdd"
+ "\xc3\xf2\xfd\x27\xea\x2c\xb3\x6f\xbe\x04\x69\xbe\xc9\xee\xe2\xfd"
+ "\xb5\x42\xde\xfc\x70\x4b\x6f\xfa\x01\xad\x7f\x21\xb1\x69\xf7\xba"
+ "\x8b\xff\x5d\x23\xe6\x6d\xf6\xd0\x50\xa0\x33\xc3\x3c\x27\x62\xfe"
+ "\x3e\x77\x71\x6d\xb4\x98\xaf\x45\x6a\x07\x24\xb6\xf6\x7e\x3a\xe6"
+ "\x9d\x68\xd1\x8e\x0a\xfb\x8e\x82\x7e\x3f\xd2\x9f\xbf\xa1\xbd\x9d"
+ "\x5c\x73\x82\x33\x89\xb6\xc7\xb3\xa7\x7e\xbd\x30\x67\x8f\xaf\xd4"
+ "\x97\x25\x75\x52\x97\x34\xad\x94\xa3\xcd\x77\x75\x92\x70\xdc\x3f"
+ "\x89\x2a\x2c\xb5\x36\x48\xb7\x8f\xd7\xd7\x74\x15\x9b\x8e\xd8\x64"
+ "\x4b\x1f\xc7\xbd\x3c\xe0\xff\x76\x1b\x79\x43\xd8\xd7\xa3\xb4\x00"
+ "\xfc\x41\x2e\x41\x86\x7b\x30\xef\x86\xff\xf5\x70\x09\xfb\x1e\x6b"
+ "\x09\x47\x0b\x49\x82\x21\xd3\x45\x8e\x67\x11\x8e\xd7\x97\xcf\x56"
+ "\xa5\xe3\x7e\x22\xf5\xf7\xd2\x0d\x9a\x29\x50\x17\x2d\x7c\x37\xf5"
+ "\x18\x3c\x0b\x75\x81\xf6\x83\x6d\x4c\x33\xa4\xe3\x1e\x43\xf5\x2b"
+ "\xec\x8a\x46\x2d\x7d\x61\xde\x37\xda\x1c\x72\xe3\x09\xae\x5e\x73"
+ "\x06\x74\xc3\x99\x0d\x9a\x47\xb0\x0c\x5e\x51\x9e\x06\x79\xf6\xe1"
+ "\x5e\x24\xb4\xa2\x69\x36\xdb\xa7\xa4\xfe\x23\xa1\xfe\x05\xb4\x99"
+ "\xc6\xe8\xf3\xf8\xee\xad\x79\x78\x7e\x83\x21\xe7\x04\x39\x26\x79"
+ "\x67\xbf\xbe\x49\xd8\xc3\x04\xdb\x05\x6d\xcc\xeb\x2a\xae\xdf\x6f"
+ "\x93\x4d\xd7\xb2\x3d\x4a\xea\xfd\x9e\x0f\x0a\xbe\x75\x14\xd5\x95"
+ "\x17\x41\xfe\x36\x1b\xf7\x91\x92\xd1\xa1\xde\x6e\x93\x4d\x29\x11"
+ "\xff\x77\xd9\x64\x8f\x9a\xd9\xff\x0d\x11\x36\xd9\xbc\xbd\xe2\xff"
+ "\xe3\x3c\x7b\xaf\xf4\xbf\x17\x4c\xf9\x7c\x68\x77\x06\xbf\x2b\x39"
+ "\x02\xfd\x51\xdc\x97\x8d\x2a\xca\xe7\xab\x26\xe0\x79\x1d\x0d\x6f"
+ "\xc1\x37\x33\xd8\x7e\x9a\x0d\x6b\xe1\x1e\x25\xde\xed\xe2\x9d\x62"
+ "\x1e\x81\xb7\x31\xa5\x84\x96\x34\x24\x62\x9b\x73\xdc\x94\x87\x72"
+ "\x2b\x68\x11\xad\xb5\x66\xb5\x13\xb6\x0f\x75\x43\x15\x11\xf6\xc5"
+ "\x01\xba\x02\xed\xe9\x68\x5a\x2b\x7c\x4b\xd7\xa8\x95\xd6\x2b\xee"
+ "\xee\x5f\xdc\x33\xf9\xde\xfb\xee\x8f\x7f\x60\xd1\xe2\x25\xa9\x4b"
+ "\x97\x2d\xd7\xac\x78\x7e\x65\xda\xaa\xd5\x6b\xb4\x6b\xd3\xd7\x65"
+ "\xac\xcf\xdc\x90\xb5\x71\x13\x0e\x56\xf7\xd4\x7f\xd7\xe3\xb2\x4e"
+ "\x8e\xc0\x37\xa6\xc2\x37\xcc\x0a\xa1\x2e\x90\xc6\x78\xd2\xe0\x0a"
+ "\x57\xf5\x4f\x4f\x6b\x34\x21\xb8\x27\x73\x07\x67\x7e\x06\xf7\x87"
+ "\x06\xfe\xcb\xac\x95\xbf\x32\xe0\xf9\x02\x6d\x9c\x79\x46\x93\xfd"
+ "\x57\x06\x3c\xdf\xa2\x2e\xba\x9d\xc4\xde\x8c\x67\x10\x98\xe3\xf1"
+ "\xfd\xee\x5b\x09\x31\xc2\x6f\xfb\x2b\xf3\x66\x25\x89\x2e\xbf\x8e"
+ "\xda\xb7\x5f\x47\x3b\xb0\xfc\xed\xaf\xd0\x76\xfb\x66\x0d\xd1\xc3"
+ "\x33\xe0\x46\x79\x9c\x3b\xa8\xa8\x03\x6f\x17\xfc\xd8\x98\xea\x57"
+ "\x68\xdb\xd6\xeb\x68\xdb\x0b\xaf\xd0\x8e\xdd\xd7\x51\x5b\xec\x76"
+ "\x22\xef\x2a\x36\x1b\x6c\x9c\x39\x5a\xc0\x35\xbc\xe7\xc7\x34\xd4"
+ "\x96\xc2\xbb\xbb\x5c\x24\x6c\x37\x3c\x43\x5a\x67\x9d\x8a\xd5\xfb"
+ "\xdd\xd3\x8e\x11\xd0\xde\xbd\xd4\x99\x26\xd3\xc3\x77\x18\x8f\x0e"
+ "\xde\x6d\x04\x0b\x0c\xdf\xb3\x5b\x1d\xc7\x00\x63\x07\xe3\x70\xdf"
+ "\x75\xf8\x5e\x94\xb5\xa2\x83\x60\x79\xef\xa4\x3b\x46\xac\xbb\x81"
+ "\xba\x20\xaf\x92\xdf\x9c\x26\x83\xef\x75\x40\xd9\x9d\xd2\xf6\xa8"
+ "\x97\xad\xca\x50\xad\x5e\x9f\x96\x36\x71\x0c\x51\x0b\x77\x9f\xb3"
+ "\x31\x32\xa0\x3c\x52\xfe\x0a\x35\x42\x3b\x0d\xd0\x5e\x73\x23\x78"
+ "\xdc\x80\x17\x02\x6d\x2a\x83\x72\xb7\x41\xfa\x01\xf8\xff\x00\xd4"
+ "\xdd\xcc\xce\x53\xf8\xfb\x7b\xb4\xf8\xe0\x14\xa8\x27\xea\x7c\x15"
+ "\xee\x55\x75\x66\xc3\x1c\x19\xb4\x7b\x3b\xe4\x33\xab\x6e\x20\xb7"
+ "\x1c\xe7\x0e\x29\xa0\x1e\x7b\xe1\x7f\xcc\xff\x21\xf2\x11\xf2\x1b"
+ "\x59\xbb\xfe\x2e\x9c\x9d\x03\xb4\x32\x54\x5d\x47\x4b\xba\x8a\x0f"
+ "\xb6\xe3\x5e\x76\xc2\x1e\xdf\xf0\x0c\x74\x31\x43\xde\xb2\x33\xb9"
+ "\x73\x64\x10\x7b\xc9\x76\xf7\x94\x79\xb0\x16\xeb\x84\xf5\xc0\xf8"
+ "\xef\x53\xf0\xbc\x78\x67\x32\xb9\xc3\x41\x64\x9f\xb6\x11\x52\xf9"
+ "\x0a\xdd\x03\x57\x25\x5c\x15\x87\xe0\xdd\x41\xb8\xcc\x90\x6e\x81"
+ "\xfb\x21\xb8\x1f\x6c\x13\xc6\xeb\xa2\xb1\xde\xeb\xb2\x69\xfb\x5d"
+ "\x15\xe4\x67\x58\x3e\x60\xeb\x77\xc7\xb8\xbf\x47\x60\xdd\x71\xdf"
+ "\x48\x3a\xe6\x50\xb6\xef\xfe\x7a\x9f\xda\x09\xbc\xff\xff\xed\x1d"
+ "\x0f\x5c\x55\xd5\xf9\xbb\xd7\x87\x01\x51\xa0\xbd\x8c\xcc\xf4\x6a"
+ "\xb8\xd1\x86\xf8\x30\x33\x35\x4d\x2c\x6b\xb4\xa8\xdc\xe6\x9a\x95"
+ "\x35\x48\x34\x29\x45\x42\x53\x52\x14\x44\xdd\x1c\x33\x79\x2a\x92"
+ "\x2d\xe3\xbd\x12\x9b\x6d\x6c\xd9\xc2\x46\x9b\x35\xcc\xd7\x02\xe5"
+ "\xaf\xfc\x7b\xe8\x43\x9e\x8e\x1a\xa6\x19\x09\x09\x0a\x72\xf7\x7d"
+ "\xe7\x9c\xcb\xbb\xef\x81\x86\x96\xf5\xfb\xed\xc7\xd1\xcb\xbd\xe7"
+ "\x3b\xe7\x7c\xff\xcf\x77\xbe\x7b\xe0\x77\x0f\xc8\x45\x06\x7e\xd7"
+ "\x5f\x45\x91\x78\xcd\x17\xcf\xb9\xd8\xd7\x21\x9e\x0b\xf0\xaa\xfc"
+ "\xfa\xcb\x13\xdf\x85\xae\xe2\xf0\xde\xf7\xed\xd5\x95\xd4\xbb\x7e"
+ "\x25\x6d\x20\x97\x4f\xc7\x6b\x9d\x3b\xbc\x3c\x8a\xc3\xaa\x43\x78"
+ "\xbd\x7a\xbc\xb8\xc7\x80\x5c\x83\x7a\xaa\x41\xfc\x35\x56\x0e\xab"
+ "\xc9\x01\xb9\x16\xdf\xfe\x0f\x81\x07\x7d\xc2\x99\x41\xf6\x6c\x4f"
+ "\xc5\x98\x8d\xb6\x74\xca\xfb\x23\xc9\x46\xe9\xdc\xb7\xa4\x4e\x95"
+ "\xc1\x22\xd0\xb7\xb6\xb9\xfc\xa7\x68\xb2\xbb\xff\x14\x05\x7b\xf8"
+ "\x8f\x99\x62\x11\xce\x97\x0c\x0b\xf7\x97\x3d\xcd\xcb\x63\xb0\x5e"
+ "\x14\x82\x78\xf6\x28\x4f\x32\x1c\x2c\x47\x4a\xff\x0c\xe0\x9a\x79"
+ "\x60\xa0\xf8\x72\x52\x2e\x5a\x41\x3e\x4b\xb4\x05\x5d\xce\x0b\xf2"
+ "\x87\x30\x2b\xf1\xb7\x10\xf1\x62\x3d\x1b\xfb\x59\x4b\xe1\xb4\xc6"
+ "\x1b\x1b\x93\xf6\x0c\xfa\xa3\xe0\x97\x70\xd2\x38\xd5\x25\x57\x04"
+ "\x8d\xe1\xb4\x8b\xc3\x10\x4e\xef\x96\x90\xfc\x25\xf4\xa3\xbf\x6d"
+ "\x26\x9f\xa4\x7b\x69\x87\x09\xe7\x52\x04\x74\xb6\xce\x84\xd1\x81"
+ "\x60\xc2\xf9\xe6\x73\x4c\x2e\x36\x86\x26\x81\x89\xf0\x51\x4c\x47"
+ "\x39\xec\x16\x9a\x8b\x1c\x97\x38\xff\x63\x7f\xc4\xfe\x78\x60\x74"
+ "\xb2\x88\x1f\x6c\xd7\xd1\xcd\xa0\xf7\xc8\xf4\x65\x5c\x56\xa4\x95"
+ "\x8d\xe3\x77\x91\xec\xa4\x4f\x6c\xcf\x43\x3c\xf1\xd4\xc6\xbe\xbd"
+ "\xcd\xe5\xc9\xa6\xef\xb3\x92\x3e\xa8\x3f\x9d\xd7\xc2\xbf\xd7\x57"
+ "\xb8\x85\xe9\x0d\xc7\x93\x3d\x54\xa4\x41\x38\x92\x3b\xd4\x0e\x15"
+ "\xe3\xd1\xf6\x65\x6d\xb8\xf6\x97\x1c\x77\xb7\x4f\x71\x81\xde\x3e"
+ "\x38\x6e\x17\x8e\xb7\xa9\x28\x23\xc5\x13\xa4\xe9\x4f\xeb\x3d\xc2"
+ "\xcc\x9d\x69\x88\x63\x49\x1b\xdb\x4b\x41\x3c\xb5\xc8\x8b\x99\xf0"
+ "\x20\x3f\x36\x8e\xab\xc4\xb8\x37\xc9\xdd\xd6\x02\x5f\x36\xd9\x9c"
+ "\xcd\xe7\x65\x4c\x26\x8c\x5d\x25\x6f\x66\xf1\xb6\x3c\xec\x93\xa7"
+ "\xb6\x47\x00\x7d\xef\x94\xaf\x25\xac\x2d\x37\xf9\x2c\xb3\xaf\x8d"
+ "\xc7\xb5\x92\xc2\x45\x2b\xd4\x46\x17\xdf\x25\x29\xda\x37\x63\x05"
+ "\xdf\xb9\x44\x4f\x5d\x3a\x8b\xad\xab\x44\x83\xc6\x0b\x7c\xb3\x08"
+ "\x9f\xa6\xab\x50\xe4\x83\xeb\xab\xd8\x8c\xf0\x6c\xf2\x45\xa6\x37"
+ "\x8c\xa3\xcd\xc9\xe4\x8b\x25\x6b\x70\xfc\x9e\x0d\x54\x5f\xca\xea"
+ "\x81\x2c\xc6\x76\xb5\x17\x17\x51\x7b\x29\xbe\xa3\xa7\x3f\x8b\xbe"
+ "\xd4\x09\x70\x8b\x11\x4c\x2d\xa9\x4c\xb6\x9c\x96\xe5\xd3\xa4\x7d"
+ "\x1d\x00\xc4\x27\xea\x28\xaf\x35\xad\x34\x04\x63\x3f\xfb\xde\x3f"
+ "\xc6\xeb\x5c\x75\xfb\x4c\x20\x9e\x31\x9e\x09\xfe\x4a\x5f\x15\xb6"
+ "\xcf\x25\x19\x49\x9f\xa1\x3c\xf6\x61\x5b\xf9\x54\xe2\xdd\x25\x77"
+ "\x69\xa2\x5e\xc7\x4c\x6e\xb4\x03\xd9\x8b\xec\xa2\xc3\x49\xbe\x6f"
+ "\x46\x5c\x39\xbc\xce\x7d\x83\x74\x6d\x1e\xa4\x16\x51\x7f\x57\xdf"
+ "\xb2\xb7\xa9\x6d\x25\xd2\x1e\x1d\x8f\x6b\x3a\xce\x0b\xfa\xee\x2f"
+ "\xe2\xcd\xa1\xb3\x78\x10\x07\xcb\x1f\x90\x17\x2f\xf2\x47\xac\x17"
+ "\x89\x71\x74\x9e\x41\x08\x5e\x93\x5c\xf3\xbf\xec\x2b\x77\xff\x2a"
+ "\xf3\x9c\xff\x64\x6f\x73\x67\x72\x04\x30\x7f\x48\x00\xe5\x94\x5c"
+ "\xb6\x51\xac\x1d\xc2\xd6\x65\x9f\xec\xc3\xf9\xa2\xc3\x31\xdf\xc3"
+ "\xd6\x79\xcc\x1f\x97\x46\xd2\x59\xc6\x12\x8e\xcd\x13\x78\x98\xcc"
+ "\xcc\x9f\x52\x99\x0f\x14\xa9\x4b\x51\xce\x2e\x3f\x28\x2d\x10\x76"
+ "\x2e\xf2\xd0\x89\x16\xbb\x8c\x74\x3e\x03\xc5\xa4\xd6\x54\xb8\xab"
+ "\xb5\xdd\x15\x97\xc8\xf6\x9d\xcc\xf6\x65\xf1\x16\xbe\xde\x8a\xb8"
+ "\x55\xc6\xdb\x07\xb9\xf9\x30\xf1\xb2\x83\xf9\x2f\xf1\x92\x3c\x8b"
+ "\x78\xc9\x63\x7c\x24\x2b\x70\x4a\x2e\x1f\x42\xf4\x71\xec\x4e\x31"
+ "\x5f\x05\xae\xd2\x24\xc2\xb5\x1a\x63\x15\xf1\x84\xb4\xbd\x59\xfc"
+ "\xbb\x8f\xf9\xc1\x0a\xc1\x7b\x41\x5b\x2a\x8d\x2d\x8a\x3f\x2b\xb3"
+ "\xb1\x05\x4e\xf9\x40\x43\x1b\xff\x86\xb3\x2f\x8e\xdf\xa9\x3c\x45"
+ "\xfd\xab\x1c\x14\xa3\x95\xc7\xd8\xf3\x47\xca\x23\xe8\xab\x9f\x81"
+ "\x01\xf1\x79\x93\x8f\x6a\x7e\x71\x52\xae\xda\x8d\x39\x06\xd9\x2b"
+ "\x07\x73\xa4\x9d\xa4\x6f\xf2\x65\xcc\x91\xc6\xb6\xa6\x95\x37\x68"
+ "\x7e\x8b\x74\xb6\x91\xee\xb9\x7d\x0e\xde\x8a\x7e\x9c\xe7\xf2\xad"
+ "\x83\xb7\x0a\x3d\xee\x44\x3d\x7a\x23\xbd\x37\x85\x5c\x3b\xb1\x3f"
+ "\xe6\x62\x55\x2f\x0b\xde\xb7\x8a\xfe\xf7\x6a\x76\x10\x73\xb5\x68"
+ "\x03\xc5\x5f\x66\x83\x83\x0e\x31\x36\x5b\xd0\xaa\xd3\xfa\x52\x8e"
+ "\xc8\xbf\xcd\x7e\xb0\x8e\xe2\xe0\x68\xb4\x3d\x8b\x7d\xec\x9c\x2a"
+ "\x0e\xa3\xb9\xc3\x69\x54\xad\x65\x7e\x88\x79\x8f\xcb\x8f\x0e\xe6"
+ "\x7a\xc4\x27\x8a\xc5\xe6\x12\xc4\x41\xf1\x94\x7c\x89\x62\x2a\xbd"
+ "\x47\x20\xbe\xf5\x62\xfe\x08\x9e\x2b\x86\xbb\xfb\x4a\xd5\x73\xe8"
+ "\x2b\xa3\x5c\xb8\x2b\x02\x7a\x5a\xe7\x2c\x3c\x06\x6e\xe3\x63\x2a"
+ "\xa2\x85\x6c\x39\x5c\x36\x51\x27\xbd\xad\x64\x7a\x1b\xa9\xd3\x23"
+ "\xea\xad\x72\xa3\xe8\x9f\x47\xb1\xdc\x35\x5f\x2b\x8a\xb5\xb9\xdc"
+ "\x3d\x5e\x54\xae\xa2\xf9\xa0\xe3\x6b\xa7\x47\xbc\xc8\xeb\x39\x5e"
+ "\x54\x24\x0a\x79\xad\x1e\x73\x23\x5b\xe4\xbb\x5b\x34\x3b\x94\xb4"
+ "\x9c\x13\xdf\x21\x2f\xdc\x42\xf1\x93\x68\xeb\xd7\xa0\x2c\xae\x57"
+ "\x31\x97\x2b\x17\x74\xb7\x43\xe5\x24\xfd\x7c\x26\x5b\x53\x4c\x20"
+ "\x1c\x64\x53\x96\x57\x22\x8c\xdb\xb5\xd2\x48\xb1\x41\x1f\xa3\xb1"
+ "\x6f\x46\xa7\x4a\xf3\xa5\x32\xdc\x7d\x2e\x56\xe4\x88\xb9\x28\x68"
+ "\x57\x0d\x40\x1b\x99\x74\x74\x73\x3d\xe8\x92\x6d\x6c\xa4\x07\x2e"
+ "\x63\xe5\x79\x6d\x4d\xa3\xfe\x38\x36\x11\xc7\x34\x7a\xac\x8f\x66"
+ "\xe2\x0f\x69\x45\xb1\x98\x95\xc9\x62\x45\x62\x2b\xe7\xe7\xa4\x45"
+ "\xac\x13\x08\x33\x09\x58\x9e\x58\x4b\x34\xbf\x79\xc2\x9d\xa7\xaa"
+ "\x88\x9e\xf3\xa3\x8a\x28\x2d\x3f\x62\xb8\x58\x2c\xaa\x8a\x14\xf2"
+ "\x11\x6c\x14\x87\x55\x18\x09\xb6\x81\xeb\x21\x43\x65\xeb\xd5\xc1"
+ "\x3c\xb1\x5e\xd1\xfc\x92\xb1\x1e\x4c\x73\x8c\xea\x88\xc3\x4a\xf8"
+ "\x4b\x53\xce\xd1\x3b\xc4\x56\xa7\x5c\x6e\xa3\x78\x40\xf1\x42\x99"
+ "\xcb\xe3\x86\xf2\x10\xbb\x7f\x4e\x71\x87\xf2\x10\x6a\xc7\x7e\xb9"
+ "\x14\x8b\x3e\x95\xab\x25\x3a\xd3\x48\x3d\xe1\x8d\x78\xab\x1a\xf8"
+ "\xd8\xea\xeb\x59\xae\x70\x22\xa2\x9f\x06\xd3\xc6\x61\xdc\xfa\x88"
+ "\xc6\xd1\x78\x2d\x7e\x51\xec\xea\xa0\xd8\xc4\xe8\x55\x3f\x2a\x7c"
+ "\x9c\xbd\x37\x68\x79\x51\xbb\xac\xeb\x4b\xdf\x82\x66\x31\xad\x3a"
+ "\x9b\xc7\xb3\xea\x2d\x34\x96\xd9\x0f\x63\xe5\xca\xb3\xea\x51\x4b"
+ "\x02\x18\xb2\x4e\x53\x5c\x2c\xcc\x10\x7c\x36\x71\x39\xaa\xdf\x63"
+ "\x72\xf0\x98\x6a\xe6\xbc\x14\x66\x64\x9d\x63\x6d\x55\x24\x0b\xb5"
+ "\xa5\xeb\xda\xd4\xf6\x60\x6a\x63\xe7\xde\x79\x8e\xeb\x6c\x9f\xd7"
+ "\xad\x3f\x9d\xd1\x85\x31\x94\xde\x51\x44\xec\xad\x89\xe7\x7c\xd6"
+ "\x8c\xd2\xe2\x2e\xea\x65\x0f\xc5\x5e\xd6\x36\x57\xf4\x79\x48\xdc"
+ "\x59\x7c\xaf\x79\x82\xeb\x35\x50\x16\xfa\xb6\x71\x39\x6a\xd8\x77"
+ "\x62\xd5\x13\x33\x51\xb7\x35\x33\x34\xdd\xea\x9f\x69\xfe\x20\xfd"
+ "\x00\xaa\x33\xbf\x4f\x62\xef\xb0\xdb\xa8\x0f\xf1\xc4\xd7\x88\xea"
+ "\x48\xcf\x9c\xfa\x53\xb9\xf6\x38\xad\x4b\x3c\x57\xad\x2d\x14\x7b"
+ "\x33\x90\x9f\xf0\x3a\xae\x0b\x76\xa3\x16\x63\xd4\xd6\x08\x7c\xe7"
+ "\x3f\x86\x7d\xec\xec\x7c\x2b\xfa\x7e\xb0\xbe\x0f\xc5\xa7\xb7\xce"
+ "\x39\x05\xce\x9a\x26\x2d\x6e\x50\x2c\x29\x69\x39\x26\x72\x3a\xbb"
+ "\x35\x4b\xc4\x92\x53\xb2\xfd\x35\xf7\x3c\xcc\xfe\x9a\x7b\xcc\xa8"
+ "\xdd\xed\x19\x33\x30\x6f\x5e\xd3\x9a\x66\x5f\xec\x96\x07\x20\xec"
+ "\xe2\xb1\xc3\x1e\x41\x73\x94\xce\x64\x60\xf1\x89\xed\x37\xd5\xfa"
+ "\x68\x3c\x53\xdc\x6c\x5e\xae\xed\x5f\xd4\xee\xa0\x5c\xcd\x83\x5e"
+ "\x83\x5b\xec\x24\x7a\x1a\x3e\x03\xd0\x37\xfd\x51\x0f\xb4\xdf\x62"
+ "\xcf\x15\x71\xde\xea\x16\x2b\xc5\x1a\x46\x71\xd2\x7d\xad\x2a\xdc"
+ "\xe2\xbe\x56\xd5\x6e\xec\x1e\x23\x6b\xa3\x7a\xbf\x56\xd5\x8e\xa7"
+ "\xb8\xa5\xc5\x48\xf7\x58\x50\x1b\x93\xe5\x96\xcb\xda\x4f\x6a\xb9"
+ "\xac\x2b\x8e\xda\x93\x28\x46\x21\xfd\x3c\x41\xdb\xe1\x94\x3f\x76"
+ "\x6a\xb4\xb1\xdd\x58\xa2\xa0\x6f\xa6\x15\x46\xa0\x4f\xe5\x8b\x1c"
+ "\x90\xcd\xcd\x73\xec\xbb\xea\x35\xde\xe8\x7f\xbe\xe4\x67\xf9\x71"
+ "\xa7\xa1\xc1\xb5\x56\xd8\x9a\x17\x6a\xfa\x3d\xb4\x40\x9f\x17\xbe"
+ "\x9a\xa9\xae\x6b\x4d\x3b\x34\x4d\x2f\xe3\x8b\x08\x4b\x17\x7b\x08"
+ "\x4c\xb7\x0c\xd7\xa1\x40\x4b\xa6\xbb\x6c\x5c\x8e\x43\x91\x24\x07"
+ "\xbd\x13\x21\x7d\x3f\xca\x7b\x30\xe7\xc3\xe7\x72\xb3\xa5\xcb\xe7"
+ "\x0f\x34\x9c\x4d\xd5\xe7\x57\x85\xb4\xff\xb3\x47\xbc\x7b\x16\x60"
+ "\xbe\x63\xd6\xef\xc5\x3c\x78\xcf\x74\x25\x3e\x21\x36\x6e\xf1\xdc"
+ "\x31\x4a\x6c\x5c\xec\xe2\xd8\xe8\xf9\xb1\xcb\xa2\x17\xc7\x2e\x8c"
+ "\x0b\x59\x10\xfd\x74\xec\x6c\x65\x69\xf4\x22\xc5\x94\x38\x32\xd1"
+ "\x17\x5c\x5d\x27\x2a\xd1\x8b\x16\x3d\xbf\x60\x4e\x8c\x12\x17\x3b"
+ "\x7b\x54\xc2\x9c\x45\x73\x16\x2b\xd1\x09\x0b\x9f\x8f\x8b\x51\x46"
+ "\xc6\x84\x8e\x34\x8d\x8b\xf1\xd5\xef\xa1\x8d\x08\x80\x93\x9d\x67"
+ "\x1a\x1b\xd3\xcf\x80\xb7\xbf\x14\x9f\xe0\x9f\x18\x1b\xc7\xf7\xec"
+ "\x0e\xef\x1e\x9d\x01\xf1\x74\x46\x24\x9d\x2f\xa6\xa6\x1d\x2a\xc0"
+ "\xbb\x81\xfa\xa1\x9c\x0a\x3e\x7b\x23\xef\x43\x5a\xd3\x0e\x27\x3a"
+ "\xe5\xfa\x28\x76\x76\x18\xc2\x51\xb6\x21\xea\x99\x82\x46\xcc\xd9"
+ "\xe2\xe9\x6f\x88\x2d\x67\xc0\x68\x5e\x02\x06\xbc\xfc\xf0\x0a\xa0"
+ "\x33\x24\x71\x0c\xc6\x13\x47\x01\xdf\xf7\x74\x44\x36\xf9\x9c\x37"
+ "\xaa\xeb\xce\x1b\xb9\x5d\x1c\xf7\x6b\x7b\xc1\x0f\xaf\x85\x87\xc9"
+ "\x3f\x8f\xc9\x0e\xf6\x7b\xc6\xd5\xe8\xcb\xb4\x8f\xda\xfc\xc1\xdd"
+ "\xe1\x98\x0f\x3a\xf2\x07\xb3\xb6\xfb\x5b\x64\xf0\x43\xbe\x0c\xfb"
+ "\x92\x4c\xb0\x19\x69\x2d\x0a\x54\xd5\xd6\x34\x47\x80\xb6\x9f\x86"
+ "\x32\x04\xa0\x2c\x76\x21\x47\x33\x93\x23\x53\x0d\xca\x18\x88\xfc"
+ "\x6d\x22\x7e\x1c\x93\x34\x19\x90\x6f\xbb\x53\x3e\x6c\x45\x3e\x03"
+ "\x88\xaf\x9e\xf6\xfa\x68\xbf\x0b\xf9\x5c\xdb\xb9\x04\xf5\x36\x94"
+ "\x9f\x29\x91\x9e\xc5\xe7\x1f\xca\xb3\xc7\x82\xcf\x1b\x4e\x83\xdf"
+ "\x8b\x74\xbe\x5f\xea\x30\xb5\xb8\xa5\x03\x4a\xe7\xd9\xc1\xff\x05"
+ "\xb5\x49\x7d\xb7\xb1\x51\xc8\xb4\x8b\x62\xc3\x3b\xcf\xd8\x0d\x24"
+ "\x13\xae\x15\x7e\x96\xd3\x17\xdc\x5b\x34\x6c\x1e\xa4\xb6\xa8\xaf"
+ "\xe8\x73\xae\xba\x1b\x49\x27\x94\x6f\x35\xa7\xd2\x19\x72\x75\x18"
+ "\x83\x1d\x33\x45\x6e\xdc\xa2\xb6\xcf\xd2\xe5\x52\x0e\xf2\xb3\x96"
+ "\x0b\xe0\xf6\xd6\x70\xd3\x59\x82\x34\x86\xdb\xbf\x6e\x2d\x8e\x69"
+ "\xd2\xe1\x8f\xf2\xc4\x4f\x38\xf1\xb9\x49\xa3\xc3\xdf\xc3\xeb\x28"
+ "\x27\x68\x42\x5f\x6e\xba\x00\xbd\xa0\x4d\x99\x6a\x65\x29\xc2\xd3"
+ "\xcf\x82\x01\xfb\x56\x5a\x32\x19\xfe\x7c\xd4\x7b\x10\xe1\x5f\x3d"
+ "\x08\x60\x0d\xf6\x69\x4e\x73\xcc\x6c\x61\xe7\xfa\xd5\xe1\xfc\x2f"
+ "\x9c\xee\xb9\x8f\x2d\xfc\x79\xa2\x87\x3f\x87\x6f\xa2\x9c\x10\x67"
+ "\x27\xf9\x50\xfa\x57\xb8\x0e\x63\x3d\x34\x03\x82\x89\x0e\x3e\x97"
+ "\xd1\x7e\x48\x6b\xda\x11\x93\x46\x4f\x45\xff\xdf\xd0\xc9\xf7\x60"
+ "\x84\x6f\x85\xd0\xde\x75\x72\xa2\xaa\xee\xc3\xf8\x4e\x3c\x92\x8f"
+ "\xe1\x98\x18\xcd\xa7\xd0\xd7\x2b\x99\x5f\x19\x21\x58\x4d\xab\x6b"
+ "\xb4\x0c\xc4\x7e\xe8\x57\x59\xe8\x4f\xe4\x57\xd8\xd7\xac\xf9\x14"
+ "\xfa\x5a\x19\xf5\x43\x1e\x7c\x77\x2d\x0b\x37\x50\x8c\x6c\x90\xeb"
+ "\xbd\xc8\xc7\xd4\x97\x1e\xb0\xab\x37\x3c\x6e\xe7\x76\xaa\xf7\x2a"
+ "\x6d\xe3\x36\x70\xe9\xfd\x88\x5d\xa7\xf7\x32\xf4\x63\x5f\xd2\x33"
+ "\xdf\xab\xae\xf7\x42\xde\xca\x58\x2e\xbe\x02\x6d\xc0\xd6\xaa\x23"
+ "\x36\x1a\x2f\x74\x58\xe4\xd2\x61\xbd\xd2\x93\x0e\x3d\x74\x67\xe0"
+ "\xe7\x0a\xd6\x87\xd0\x5c\xc1\x31\x5d\xe7\xbf\xf6\x64\x4b\xa4\x61"
+ "\x30\x64\x80\x37\xd1\xb0\x19\x59\xff\x35\x1a\x8d\x74\xd4\x75\x53"
+ "\xf2\xbc\x8b\xfa\xb3\xcd\x0a\x40\x7b\xe2\x34\x3e\xc8\x48\xfa\xad"
+ "\xb7\xb9\xc6\xab\x2d\x9e\xe3\x47\xce\x76\xe3\x95\x5d\xc8\xab\x7d"
+ "\xf3\x40\xf4\x23\xc6\xaf\xd3\x70\x31\x7e\x83\x14\xbe\x4e\xe6\x8f"
+ "\x20\xff\x76\x4e\x2e\xdd\x0a\x40\x30\x51\x0f\x69\xc6\xb5\xc7\x73"
+ "\x7f\xff\xc2\xbf\x6f\x70\xae\x70\xff\x7d\x83\x73\xfe\x85\x7e\xdf"
+ "\xe0\x41\xf7\x3d\xa2\xdb\x69\x99\x21\xe9\x68\x67\x77\xf6\x40\x5b"
+ "\x1b\x1f\x6a\xd5\xbf\xcf\x1c\xf5\x21\x1e\x4a\xe8\xec\xf5\x9b\x66"
+ "\x48\x2a\xe2\xb1\xb1\x35\xfc\xa8\x37\xcf\x5f\x28\x2f\x72\x36\x52"
+ "\x1f\x4f\x39\xba\x8a\xb7\x71\x2f\xdd\xce\xb2\x8a\xd7\x7d\x40\x7f"
+ "\xf1\x0f\xe3\x9a\xb4\x66\xd9\xad\x33\xa8\x3d\x54\xfc\x00\xee\x60"
+ "\xfd\x55\x2c\x1c\x24\xea\x1c\x8b\xa1\xab\x7f\x57\xfb\x37\x28\x3e"
+ "\x9c\x5f\x86\xaf\x0d\x24\xfe\x34\x3e\x40\xd7\x63\xda\x45\x46\xab"
+ "\xa0\x0d\xe9\xa9\x50\x36\x9b\x32\xc3\x0b\xf1\x99\x58\x67\x55\xed"
+ "\x10\xf8\xb5\xba\xaa\xaf\x13\xc4\xbd\x8e\xa5\xdf\x2c\x1d\x81\x61"
+ "\xfd\x62\xd8\x9f\x2a\xdd\x19\xd3\x05\x92\xad\x7a\x5e\x51\xdd\x29"
+ "\x5e\xec\xc1\x9f\x7e\xb4\x21\xbe\x60\x6c\x1f\x3f\xbd\xab\xc3\x75"
+ "\x2d\xab\x74\xdd\x0f\x70\xf6\x27\x58\x2f\x22\xe3\xa5\x96\xa1\xba"
+ "\xe7\x61\xfc\x36\x21\xea\x5b\xc4\x7f\xf1\xa2\x94\xf9\x68\x8f\x2e"
+ "\xf7\x98\xd0\xd0\x53\x57\x97\xfe\x27\x6a\x36\x56\xf5\x1e\xea\x6a"
+ "\x9f\x9c\xef\x5e\x9f\x62\x76\xaf\x4f\x75\x7e\x0b\x9c\x03\x23\x92"
+ "\xec\x1c\x00\x10\x9e\xd3\x05\xf4\xf7\x98\x32\xfe\x66\x8f\x29\xe4"
+ "\x2a\x82\x9b\x7e\x00\x77\x8f\xd5\x81\x0d\x3d\xf7\xbe\x32\x65\xf0"
+ "\x2a\x31\x21\x86\x35\x05\x74\x6b\x9c\xe2\x01\xa3\x7a\x7f\x45\xc0"
+ "\xc2\xf6\x76\xeb\xcf\x60\x8a\xae\x2e\x85\xe3\x0f\x2b\xfa\x7f\x53"
+ "\xf7\xbe\x7d\xa5\xaf\xf4\xa2\x48\x34\x3f\xfa\xca\x15\x2a\x2a\x5f"
+ "\xc5\x31\x12\xb1\x1b\xfd\x53\xbb\x02\xa5\x2a\x1a\x54\x01\x50\xc5"
+ "\xc3\xb7\xb2\x8e\xf7\x95\xbe\xd2\x57\xfa\x4a\x5f\xe9\x2b\x7d\xe5"
+ "\xff\xa0\x48\xfa\x17\x6b\x3a\x3f\xe4\x2a\x71\xd7\xbf\xff\x48\xe2"
+ "\xd2\xc3\xe4\x6f\x32\x4e\x15\x05\x52\xc2\xf3\x15\x6b\x94\x33\xc0"
+ "\x3c\xbd\xcc\xb4\x2b\xbe\xc9\x7b\x5d\x44\x41\xf0\xce\x79\x8d\x81"
+ "\x5b\x67\xda\xc7\xe7\x25\xb6\x19\xd6\x4c\xb3\x05\x65\xc7\x34\x18"
+ "\x33\x66\x54\x8e\xcd\x5d\xdc\xe2\xb7\x3e\xb2\x28\x24\x67\xfe\xc9"
+ "\x21\xdb\x66\x39\x26\xed\x49\xea\x90\x53\xef\xfe\x70\xc4\xeb\x4f"
+ "\x1d\x1b\xb8\xe9\xe7\x07\xc7\xfc\x2d\xe1\xb4\x6f\xda\x4f\xf7\xff"
+ "\xe8\x4f\xcf\x7c\x36\xf8\x0f\x8f\x1d\x9a\xf8\x8f\x65\xe7\xfa\xff"
+ "\xe6\xbe\x7f\xff\xe0\x8d\xb9\x9f\x0e\xca\x7c\xa4\x7a\xdc\xbb\x4b"
+ "\xce\x5c\xbb\xe1\xa1\x92\xd0\xbf\xc6\x9d\x1a\x9a\xf5\xe4\x91\xbb"
+ "\x3e\x58\xd9\x29\xad\x9a\xba\x77\xf8\x6b\xd1\x47\x07\x6c\xfc\x59"
+ "\x79\xd8\xdb\xcf\x7d\xe9\xf3\xbb\xfb\x0b\x6f\x7d\x33\xf6\xf8\x8d"
+ "\x2f\x3f\x5a\x3b\xe1\xbd\x17\xce\x7a\xad\xbd\xf7\xa3\x91\x3b\xe6"
+ "\x7c\x72\xfd\x96\x5f\x56\xdd\xbe\xfb\xf9\xaf\xae\x79\xf1\xc1\xe2"
+ "\x51\x7f\x59\xf0\xf9\xcd\xaf\x3e\x51\x37\xf9\xfd\x15\xe7\xfb\xad"
+ "\xbe\x67\xdf\x2d\xdb\x67\xff\xe7\xba\xcd\xbf\xa8\xb8\xed\x9d\x45"
+ "\xcd\x57\xff\xfe\x81\x03\x3f\xfe\xf3\xb3\x27\x6e\x7a\xe5\xf1\xc3"
+ "\x77\xfe\x73\x79\xfb\x55\xbf\xfd\xc9\xc7\x3f\xfc\xe3\xd3\xff\xbd"
+ "\xe1\xa5\x5f\xd5\xdc\xf1\xf7\xa5\xad\xfe\xe9\x0f\x97\x8e\x7e\x6b"
+ "\xe1\x17\xc3\x2c\xbf\xae\x9f\xf2\xaf\x64\xf5\x9b\xe8\x0f\x33\xec"
+ "\xcd\xdf\xa5\xdd\x5c\xc9\x23\x81\xb3\xa2\x2e\x1b\x8f\x2c\x09\xfb"
+ "\x73\x40\xca\xed\x20\x79\x43\x7f\xc3\x65\xbc\x31\x5c\xae\xdc\x17"
+ "\x28\x8a\x7e\x7c\x6f\x0a\xed\x1f\x85\xe1\x75\x1b\x5e\x37\x31\x88"
+ "\x6b\x17\x60\x44\x2f\x71\x5c\xf9\x22\xa1\xec\xfd\x90\x33\x2f\xe8"
+ "\x8f\xda\xf2\x06\x1f\xf0\x85\xab\xc1\x0f\xae\x81\x6b\xc1\x1f\x02"
+ "\x60\x00\x0c\x84\xeb\xc0\x08\xd7\xc3\x20\xb8\x01\x02\xe1\x46\x18"
+ "\x8c\xd2\x0c\x81\x9b\x61\x28\x0c\x43\xa5\x0c\xef\x59\x96\x14\x08"
+ "\x0f\xc4\x1f\xf8\x7f\x3a\x84\xb3\x7a\x54\x1f\xfc\x3b\x85\xe7\x0b"
+ "\x78\x99\x80\x3b\xfb\xe0\xdf\x29\x5c\xf9\x9e\xef\xc3\xbf\xd7\xbb"
+ "\x84\xa9\x03\xcf\x1e\xdc\x72\x88\xae\xe2\x09\x95\x44\xe9\xaa\xc3"
+ "\xd7\x8c\xef\x86\xcf\x7d\xbc\x67\x09\xc7\x4b\x6c\xc8\x26\x03\xf0"
+ "\xdf\x37\xa8\xfa\xd2\x91\x29\x7d\x68\x18\x90\x42\xbf\x3a\xf1\x06"
+ "\x23\xfb\xf9\xf5\x25\x7f\x31\x5e\x29\x78\xad\xc7\x2b\x1d\xaf\x57"
+ "\xf0\xda\xa1\xe1\x06\x69\xd8\x34\x90\x94\x24\xbc\x3b\x41\x1a\x1e"
+ "\x88\x57\x0e\x48\x41\x21\x20\x8d\x38\x09\xd2\xc8\xf9\x2e\xe6\x43"
+ "\xd7\x75\x71\x29\x85\x08\xb8\x82\xcf\x61\xfa\xbd\xda\x4b\x5d\xcf"
+ "\xf2\xef\x9d\x11\xa1\x84\x85\x8e\x0d\xbd\xfd\xb6\x68\x65\xd4\x28"
+ "\x65\x8c\x29\x2c\x6c\xb4\x69\xdc\xe8\xb0\x3b\x94\x31\x63\x26\x86"
+ "\x99\x26\x9a\x4c\xca\x82\x17\x12\x62\xc3\x4c\x4f\xcf\x51\xe6\xc6"
+ "\x26\x2c\x58\x1a\x9d\x30\xa7\x17\x42\x5f\x7a\x41\x51\xe0\xe6\xf3"
+ "\x9c\x4d\xbd\x85\x24\x98\x02\xf2\xf1\x99\x20\x9f\x0f\x84\xee\x26"
+ "\x0d\x16\x97\x7b\x91\xde\xb0\x81\xb4\xbd\x00\x24\xcb\x58\x90\x5e"
+ "\x0e\x07\x69\x23\xea\xd2\x86\xb0\xbd\xbb\x40\x7a\xdf\x00\xd2\xbb"
+ "\x6d\x20\xbd\xb5\xbe\x3b\xac\xd8\xca\x61\xc7\x15\x90\x1a\x66\x80"
+ "\x74\x04\xed\x50\xbd\x86\xc3\x5a\xb0\xcf\x17\x41\x57\x44\xf6\xcb"
+ "\x2f\x97\x6a\x6f\xe9\x7f\xa8\x4a\x69\x9a"
;
diff --git a/sys/dev/mxge/ethp_z8e.h b/sys/dev/mxge/ethp_z8e.h
index a245a8a..de63bbe 100644
--- a/sys/dev/mxge/ethp_z8e.h
+++ b/sys/dev/mxge/ethp_z8e.h
@@ -1,6 +1,6 @@
/*******************************************************************************
-Copyright (c) 2006-2010, Myricom Inc.
+Copyright (c) 2006-2011, Myricom Inc.
All rights reserved.
Redistribution and use in source and binary forms, with or without
@@ -28,7326 +28,7535 @@ POSSIBILITY OF SUCH DAMAGE.
$FreeBSD$
***************************************************************************/
-static unsigned int ethp_z8e_uncompressed_length = 377876 ;
-static unsigned int ethp_z8e_length = 117102 ;
-static unsigned char ethp_z8e[117102 + 1] =
- "\x78\x9c\xec\xbd\x7f\x7c\x54\xc5\xd5\x3f\x7e\xb2\x59\x60\x13\x03"
- "\x1b\x30\xd2\x15\xb1\x2e\x8a\x36\x5a\x90\xa8\xd8\x46\x0b\x1a\x05"
- "\x2c\xd6\x00\xa9\xa2\x8d\x8a\x06\x34\xd0\x45\x23\x46\x08\xb0\x40"
- "\xc8\x86\x05\xeb\x06\x81\x44\x45\x8d\x10\x48\xb4\xd8\x87\x3e\x45"
- "\xa5\x95\x1f\xc1\x82\xc6\x92\x22\x6d\x93\x2c\x54\xfa\x6d\xda\x2f"
- "\x7d\xba\xf2\x89\x34\xf2\x09\xb0\x92\x85\x5d\x93\xdd\x3b\xdf\xf7"
- "\x99\xb9\x37\xd9\x5d\x36\x28\xcf\xf3\xbc\x5e\xdf\x7f\x9a\xd7\x6b"
- "\x73\xef\x9d\x3b\x73\xe6\xcc\x99\x73\xce\x9c\x99\x39\x73\x2e\xd1"
- "\xc5\xff\xf9\xc8\xc2\x97\x24\x32\x35\xa7\x7f\xfc\xdf\x28\xff\xef"
- "\xbf\x7f\xff\xfd\xfb\xef\xdf\x7f\xff\xfe\xfb\xf7\xdf\xbf\xff\xfe"
- "\xff\xfd\xf3\x27\xd1\xd8\x33\x26\x33\xfd\xae\x8a\x28\xe8\xb6\x0c"
- "\xf7\x51\x57\xf1\xeb\xaf\x88\x30\x5e\x25\x61\x9c\x1f\xce\x57\xfe"
- "\xbd\x8c\x34\x53\x15\x59\xae\x4e\xa7\xb4\x09\x9b\x88\xd6\x0f\x15"
- "\x1d\xaf\xbc\x26\xfc\x2b\x5f\x13\x1d\x13\xdf\x26\x6a\x1c\x49\xf4"
- "\xca\x50\x11\x00\x8c\x19\x3e\x7a\x7c\x3a\xc3\x58\x89\x67\x7e\xbf"
- "\x6a\xa8\xf0\x23\xbd\x04\xe9\x4d\x9c\xbe\x62\x28\x60\x65\x10\xb9"
- "\x5f\x13\xa1\x28\xb8\x16\x2e\xcf\x30\x27\x8e\x90\xb8\x6c\x89\x83"
- "\xc3\x30\xea\x7d\x54\x30\xf1\x02\x30\xd2\x0c\xbc\x02\x26\x4a\x62"
- "\x78\x9d\x6e\xb2\x05\xdc\x0d\x97\xa1\x6c\x00\xed\xc9\xe4\xb2\x95"
- "\xc8\x23\xdc\x94\xdc\xe8\x0c\x93\xfd\x6a\x4a\x3a\x4e\xa9\x6f\xe2"
- "\x6a\xc2\xf5\x55\x6e\xeb\x4a\x55\x6e\x24\xc3\x40\xd9\xa4\xa0\x3b"
- "\x25\xab\xa7\x2c\x60\xdb\xcb\xc8\x8c\xbc\x73\x03\xa6\x06\x93\xca"
- "\x9b\x9e\xa2\xe7\x35\x21\xef\x0c\x23\xaf\x7a\x67\xba\x57\x7f\x77"
- "\x09\xde\x39\x63\xdf\x99\x5f\xd6\xdf\xa5\xe1\xdd\xfa\x38\xfc\xcc"
- "\xde\xae\x30\x1d\xa7\x94\x6d\xc0\xc5\xbe\x1f\x3d\xc2\x65\xf4\xfc"
- "\x83\x91\xbf\x31\x16\x16\x91\xfe\x6e\x08\xde\xf9\x62\xdf\x7d\x98"
- "\xa5\xbf\xfb\x16\xde\x85\x63\xdf\x25\x19\xe5\x6c\x41\x77\xaa\x2d"
- "\x41\x3b\xb9\xfe\x24\x55\x37\xb7\x21\x75\x1c\xf2\x94\x73\x9e\xe9"
- "\xf6\x72\xe2\xbe\xe2\x77\xfb\xeb\x7a\xea\xe7\x3c\x33\x0d\x38\x3e"
- "\x94\x8f\xa2\x29\x68\x99\x5a\x6a\x94\x9f\x68\x67\x18\x24\x69\xc8"
- "\x70\x7c\x94\x32\x99\xe1\xf0\x33\xee\x87\x73\xbb\xf5\x7b\x3b\xb7"
- "\x2f\xba\xcf\x89\xcc\x00\xdb\x0f\x86\x68\x7f\xfc\x06\x58\x0c\x1e"
- "\x58\x60\x13\x9a\xeb\x72\x32\x8b\xd5\x3b\x1b\x34\xb7\x20\xaf\x33"
- "\x44\xf6\x61\xe4\x3a\x46\x97\xd8\x80\x1f\xad\x5b\x4a\x16\x57\xb1"
- "\x08\x79\x9d\x1d\xd4\xe2\xef\x20\x97\x5f\xb4\x7b\xc3\x67\xa9\xec"
- "\x2c\x59\xbc\xe1\x93\x54\xf6\x1c\xd9\x1a\x4b\x3f\xa7\x44\xfc\xa5"
- "\x99\x04\xb9\x86\x73\xd9\x36\x6a\xa9\x69\x23\x57\x4d\x6c\x59\xd7"
- "\x95\x64\x6b\xc6\x33\xfa\xce\xca\x78\x34\xda\xc3\x14\x4e\xdd\xd9"
- "\x50\xfa\x06\x99\x5d\x23\x60\x2d\x17\x36\x18\xb8\xf8\x18\x97\x55"
- "\x27\xc8\xf2\xf3\x39\xe0\xa1\x13\x8c\xef\xbe\x86\xf7\x96\x86\x4c"
- "\xfb\x6d\xb9\xb4\xdf\x76\x94\x1a\x6d\xe3\xa9\xd1\x39\x91\xd6\x9d"
- "\xa0\xb4\xfd\xa1\x71\xd4\x68\xbe\x07\x32\x36\x91\xbc\x1d\xb8\xb7"
- "\x47\x90\x27\x40\xf6\x45\x04\xfe\xb8\xe4\xd0\xfa\xa7\xc8\xe2\x53"
- "\x30\x41\xdf\x4b\x8e\x7e\x5c\x42\xc4\xf4\xe5\xe7\x44\xed\x58\x70"
- "\x39\xd9\x80\x5f\x3b\x70\xb9\xed\x18\xa5\x5d\x36\xd2\x46\x59\xc0"
- "\x79\x80\xb7\x3a\x4c\xe6\x52\x4a\xe9\x43\xb6\x32\x34\xb7\x94\xf1"
- "\x8e\xcd\xaf\x89\x76\xe6\xd1\xce\x65\xf9\x90\xd3\xb4\x5c\xd4\xdd"
- "\xc1\xf5\xad\x83\xac\xbb\xde\x24\x73\xe7\xe2\xfc\xa4\xda\xd7\x44"
- "\x1b\xde\x39\x8c\x77\xe0\xa7\x36\xbc\x6f\x1f\x93\x41\xe9\xde\x70"
- "\x0e\x7d\xd4\xd5\x6e\x66\x18\x83\x02\x94\xc4\xf0\xac\x4e\x4a\x46"
- "\x7b\xfa\x01\x9f\xdb\x6a\x91\x7e\x0d\xf2\xa1\xfc\x56\x1f\xbd\x6c"
- "\xe3\xf2\xe2\x5b\x8f\x06\xb4\x6f\x3d\x7a\x56\x7b\xfd\xd1\x4e\xf1"
- "\xfa\xa3\x67\x22\xaf\x3f\xfa\xa5\x6b\x09\x59\x22\xdf\x7a\xd4\xdf"
- "\x52\x2c\xfb\x20\xbd\xa5\x18\x7d\x10\x21\xcb\xf2\x93\x94\xfe\xf8"
- "\x73\xe8\xfb\xf0\x3f\x68\xf9\x5c\xb2\x69\x29\x7b\x9d\xde\xf0\x5f"
- "\xe8\xf1\x52\x12\xb8\xf7\x24\x6a\x5f\x67\xea\x87\xa4\x64\xc8\x82"
- "\x36\x0d\xb4\xfb\x4c\x3b\xea\xb9\x5e\x7f\xca\x01\xc2\xcf\x8c\x9f"
- "\x05\xbf\x34\x91\xfa\x61\x1a\x68\xe5\x1a\xb4\x22\x89\x36\x77\x11"
- "\x8d\xd1\x28\xe9\x04\x0d\x1c\x07\xfc\xd3\xfb\xa0\xdb\x70\x6d\xf5"
- "\xe1\xf4\xef\x94\x53\x59\x30\xe8\x20\xd6\x4d\xac\x97\x58\x4f\xa1"
- "\x1e\x0f\xea\x09\x49\x59\x7c\x4d\x04\x44\xea\xe1\x74\xa4\xb7\x07"
- "\x96\x39\x92\xfc\xcb\x1c\xa6\xce\xd4\xc3\x97\x22\xcf\x36\x9f\x69"
- "\x67\x96\x4e\xc3\x76\x86\x05\x99\xf0\x0f\x0c\x53\x32\x60\x16\xef"
- "\x3e\xd7\x6a\xde\xf4\x9a\x38\x8a\x7c\x47\x7a\x60\x01\x36\xe0\x80"
- "\xfe\x03\xdb\x8d\x34\xd0\xba\x6d\x2d\xf2\x71\x79\x6f\x28\x87\xf5"
- "\xb7\xcf\x5b\xd4\x4e\xd6\x30\xa5\x8a\x6e\x55\x1f\xf2\xb4\xb3\x9e"
- "\x1d\x18\xa2\xfe\x41\x37\xe5\x31\x6c\x2e\xe7\xed\x68\x27\x94\xbb"
- "\x54\xb8\x1c\xd0\x6f\x34\x35\x28\x1c\x49\xd0\xe9\x6d\xfb\x51\x5e"
- "\xd5\x3d\x28\xcf\xc0\x91\xeb\xe0\xbe\x96\x78\x82\x1f\xf6\x17\x85"
- "\x68\x60\x35\x25\xa3\xdc\x03\x0c\x8f\x61\x81\x0f\x7c\x68\xeb\xa5"
- "\xfb\x8b\xfc\xa4\x89\x18\x98\x3e\x1d\x5e\x5d\x0c\x3c\xa4\x0b\xc0"
- "\x63\xfe\x6b\x44\x99\x81\x75\x12\xde\xfd\xbb\x35\x86\x17\x22\xb3"
- "\x5d\xe2\xfb\x10\xc3\x08\xb2\x8e\x01\xcc\x86\x45\x77\x53\x07\x59"
- "\x2d\x7e\x97\x23\xb9\xa5\x94\x88\xcb\xbf\x57\xd6\xde\x4f\x74\xe6"
- "\x27\x33\xcf\xf1\x7b\x6f\xf8\x0c\xf2\x0c\xfa\x42\x74\x3a\x92\x07"
- "\x76\x90\x99\x71\x46\x79\x27\xe3\x19\xdd\x97\xf7\x4f\x7a\x68\x3c"
- "\x3d\x34\xf1\xde\x89\xe3\x69\xca\x5d\x13\xc6\x53\xd6\x6d\xa3\xb3"
- "\x6e\xf9\x7e\xf6\x2d\x94\xf7\x93\xfb\xc7\x53\xde\xd4\xf1\xf4\x00"
- "\x7e\x79\x0f\x4c\xba\x7f\xe2\xa4\x07\xc6\x53\xfe\x3d\xf7\xe2\x69"
- "\xc2\xf8\x9b\xb2\x7e\x38\x3a\x6f\xc2\xbd\x93\xe8\xc7\xd3\x6f\xce"
- "\xba\xf9\x66\xba\x6b\x52\xee\x4d\x59\x59\xfa\xf5\xa6\x2c\xce\xf2"
- "\x48\xf6\xa4\x07\x46\xe7\xcd\x7f\xb6\xe4\xd9\xd1\x53\xef\x9d\xc0"
- "\x29\x3c\x26\x47\xf1\x4e\x66\xe4\x9c\xc6\x34\x0e\x88\xd3\x93\x49"
- "\x83\xce\xd8\x8c\xbe\xc7\xaf\xa3\xa1\xec\x18\x64\x3f\xfd\x2f\x9b"
- "\xb9\xcf\xa4\x6e\xb5\xf2\x78\x65\x0e\xba\xad\x47\x41\x3b\x39\x86"
- "\x63\x4c\x43\x9e\xa1\x4b\xf0\xee\x7a\x7d\xec\xe8\x87\xf7\xe1\xd8"
- "\xf7\x43\xa0\x67\xad\x63\x5a\xec\x44\x5e\xfc\x40\xef\x00\x74\x20"
- "\xe8\xea\xa7\x4e\x57\x7e\x3f\xf0\x75\x12\xea\x68\x83\x4c\x1e\x0a"
- "\xba\xd3\xb3\xa3\x64\xbd\x0d\xfd\x72\xc8\xbe\x94\x92\x4f\x51\xfa"
- "\xe0\x96\x92\x1c\xe2\xfe\xf1\x96\xe8\x30\xce\xf6\xc0\x48\x95\x30"
- "\xd0\xe7\x80\x73\x44\x87\x53\x1e\xa5\x17\x7c\x0c\x67\x1d\xde\xe9"
- "\xb0\x1e\x6c\x81\x7e\x80\xfe\xfe\xa3\xe6\xca\x24\x91\xba\xf3\xa0"
- "\xd6\x9d\x29\xc7\x04\x94\xab\x37\xf8\x19\xf5\x07\x1a\x51\xa7\xf8"
- "\xf9\xe4\x24\xf4\x7f\x12\xc6\x2a\xb4\xc5\xda\x08\xbe\x86\x1c\x1d"
- "\x48\x17\xdd\xf9\xa4\xd2\x06\x9b\x23\xab\xf1\xbc\xfa\xc0\x60\xe1"
- "\x42\xda\x52\x99\xd6\x0f\xcf\xdc\xd7\xc9\xe0\x15\x8a\x9c\x46\xfa"
- "\x3c\x4a\x46\xfa\xef\x41\xeb\x56\x99\xff\xb4\x2c\x3f\x00\x69\x6f"
- "\x03\xde\x60\x2d\xf5\xc0\x10\xf0\x0e\xa7\xc1\x4e\x18\x5c\x81\xf2"
- "\x97\xb2\xbe\x53\x3a\x78\xe8\x1b\x3c\xc6\xa1\x1d\x7e\x05\x5f\x7f"
- "\x86\xbc\x2a\x1c\x86\xbe\xb1\x1f\x74\xd9\x8f\x51\xab\xb1\x94\x6d"
- "\x9b\xc1\x68\xff\xc0\x7c\x35\x3e\x0e\xad\xe6\xbc\x9a\xc8\x27\x91"
- "\x36\xc4\x02\xb8\x19\x0d\x4b\x3b\xe8\x78\x31\x99\x7c\x34\x78\x9c"
- "\xe6\x72\x50\x54\x5b\x32\x19\x0f\xe0\x6d\x0e\x76\x3b\x30\x5e\x0e"
- "\x1e\x25\xcb\x02\x3f\x1d\x37\xce\x63\x63\xfc\x59\x47\xa0\x5f\xc7"
- "\xa2\xcf\x53\x50\x9f\x3f\xae\xcf\xd3\x98\x1e\xc0\xb7\x55\xc3\x15"
- "\x70\x32\xc4\x62\x07\xf0\x22\x13\xd3\xc3\xd7\x0b\x23\xa0\x78\x6a"
- "\x48\x56\x1c\x4f\x3d\x06\xd8\xe3\xa3\xde\xe7\xc5\xbd\xbf\x0b\xef"
- "\xef\xd6\xdf\x43\x56\x87\x14\xc7\xd5\xbf\x06\xef\xef\xe1\x3e\x84"
- "\x2c\x26\xfb\x28\x7d\xeb\x66\xb6\x25\x7b\xf3\xd7\xc5\xe5\xdf\x8b"
- "\xfc\x3f\x02\xbe\x01\x1e\x27\x38\x7f\xad\xce\xf7\xc8\x6f\x41\xfe"
- "\x43\x71\xf5\x8f\x40\xfe\x07\xa2\xf0\x8b\x6b\xff\xa5\xf5\x78\x9f"
- "\xcf\x7c\x8a\x6b\x21\xf2\x0c\x60\xf9\x67\xdd\xb3\xbf\x88\xfb\xe7"
- "\x52\x7b\x5c\xfe\x1c\xe4\x7b\x9a\xe9\x2c\x69\xd4\xc9\x34\x4a\xdf"
- "\xaa\xdb\x35\x47\x15\x0e\x97\x4e\x8f\x2b\x53\x82\x32\x0b\x98\xbe"
- "\x92\xcf\x82\x09\xcb\x78\xe2\xca\x6c\x95\x7c\xaa\xea\xd1\xfb\x58"
- "\x95\xd1\xf5\x5a\x34\x0c\x6e\x1b\x6c\xad\x4b\x9b\x62\x61\x5c\xb6"
- "\x15\xf5\x2e\x5b\xab\x74\xc6\x25\xe0\x89\x9b\x91\xf6\x06\x60\x5e"
- "\xc6\x7c\x04\x39\x0b\x78\xfd\x21\xe8\xdd\xc9\x69\x8a\x77\x33\x46"
- "\x5b\x4b\x89\xef\x47\xf3\x3d\xc3\x16\xdd\xb9\xba\x3c\x65\x8c\xc6"
- "\x95\xd3\x33\x38\x9d\xe5\x58\x74\xdf\xa7\x29\x98\x19\x3f\x86\xbc"
- "\x9b\xf0\x1c\xd1\xeb\x78\x09\xcf\x49\xc0\x7f\x08\x74\x3a\x78\x76"
- "\x32\xf3\xe3\x58\xa4\x57\xe8\xef\x57\x70\x7e\xdc\xdf\xa4\xdf\x27"
- "\x81\xc7\x86\xe8\x72\x06\x99\xba\x6c\x89\xac\x1b\x72\x65\x94\xd7"
- "\x14\xdf\x4f\xc0\xbb\xd9\xb8\xde\x8b\xeb\x8f\x71\xfd\x31\xae\xa3"
- "\x5d\x67\xc9\xe6\x8a\x48\xf9\xe2\xe7\xcb\x71\xbd\x1f\xd7\x7e\xb8"
- "\x3e\x00\xdc\xbe\x04\xdd\xd3\xfd\xe0\xe9\x38\x9e\xe9\x40\x1f\xb2"
- "\xdc\x0f\x50\x7d\x98\xe1\xe3\x3a\x23\x86\x2e\x38\xdd\x9b\xa6\xeb"
- "\x07\x5d\x1e\xf4\xb4\xee\xc9\x4c\x97\x3c\xc0\xdf\xcb\xf5\x0b\x05"
- "\xab\x9f\xea\x27\x95\x47\x53\xe5\xcc\xaa\xbf\xf5\x34\x95\x2f\x29"
- "\xba\x4e\x5c\xab\xca\x02\x42\xe0\x5a\xca\x74\xf5\xd1\x65\xe5\xa0"
- "\x89\x19\xcf\x79\x4c\x27\x99\x5f\xc2\xbd\xb4\x23\xaa\xbf\x21\xfb"
- "\x97\xed\x8d\xeb\x6f\x96\xf3\xb5\xb2\xbf\x41\x3b\x03\x67\xc6\x1f"
- "\x3c\xcd\xe3\x64\x7f\x83\x6f\xc0\xdf\x1d\xbd\x32\x36\xd4\x1c\x0b"
- "\x47\xf1\x15\xf3\xc7\xa0\x62\x5d\x26\x41\x2f\xe8\xb0\x40\x72\x29"
- "\xf3\xea\xd0\xb1\x3e\xfa\xd5\x64\x69\x8b\xad\x3e\x30\x94\xdf\x07"
- "\xa0\x9b\x38\x7f\x72\x31\xcb\xd8\xd0\xe9\xc6\x7b\xf9\x2e\xe5\x70"
- "\x15\xe3\x94\x5c\x24\xdf\x15\xfb\xc0\x62\xc6\x3b\x59\x0f\xbf\x2b"
- "\x91\xef\xd6\xf4\xc2\xdd\xd9\xae\xc3\x4d\x4e\x64\x4b\x09\xcf\xce"
- "\x56\x30\xa8\xe9\x86\x72\xea\xe7\x0d\x1f\xa1\x69\x61\x11\x19\x5d"
- "\x4e\x29\xde\xf0\x36\xba\x9e\x68\xb0\x37\x7c\x94\x6e\x20\x1a\xe1"
- "\x0d\xaf\xc7\xd8\xbe\x85\xdf\x7f\xf4\x1d\x4a\x4a\xc2\xd5\x75\x5d"
- "\xb9\x29\xc9\x1b\x2e\xa1\x91\xe5\x66\x5c\x8b\xe8\x9e\x7e\x22\xe8"
- "\x0d\xe7\x22\x5f\x21\x4d\x8b\x88\xd3\x13\xfb\x89\x7f\x16\x44\x28"
- "\x3d\xf7\x79\xe1\xf2\x86\x61\x67\x87\x9b\x90\xae\x89\x69\x91\xaf"
- "\xf0\x0b\x0a\xcd\xb3\xb3\x7d\x5a\xe4\xb4\x98\xf0\xfc\x47\x78\xfe"
- "\xa7\x10\x26\x12\xde\xf0\x38\x6a\x09\x04\x90\xcf\x25\x44\xc5\xce"
- "\xd6\xc7\xcf\x9a\xa8\x1b\x63\xb4\x56\xb1\xb3\x1d\x6d\x09\x75\xa3"
- "\x1d\x18\xbf\x82\xdd\xcb\x70\x5d\xbd\xf3\x9c\x7c\xf6\xec\xb2\x08"
- "\xcb\xce\xd0\x8d\x98\xb4\x70\x1b\xbc\xe1\x36\x2a\x80\xd9\x3d\x6d"
- "\x89\x5f\x30\xfe\x83\x56\xf0\x9c\x65\x1c\x41\x2f\x5a\xa7\x2d\x71"
- "\x09\xbc\xb3\x88\x94\x9d\x21\x6f\xb8\x83\x44\x05\xca\xa6\xee\xea"
- "\x27\xe1\x79\x76\x65\x22\xaf\x9f\xf3\x45\xc3\x61\x18\x9c\x77\x5a"
- "\x84\xac\xc8\x9f\xd9\x9d\xb2\xcb\x86\x5f\x36\x7e\x0e\x94\x5d\x2a"
- "\xdc\x19\x1f\x0b\x8c\xa7\x28\xef\xc1\x73\x75\x08\x73\x04\x49\xcb"
- "\x08\x0d\x40\x7e\x0f\xf8\x65\x22\xf8\x0e\xf8\xee\xaa\x97\xf8\xae"
- "\xde\xb5\x3b\x24\xdb\xb1\x6b\x97\x6a\xc7\xae\x9d\x9c\xde\x09\x5b"
- "\x02\xf7\xad\x9d\xea\xdd\x5f\x51\x6e\xba\x2c\xe7\xd9\xd5\x2a\x2c"
- "\xbb\xda\x43\x90\x27\xd0\xb5\x9c\xe9\x08\xba\x96\x33\x2d\x01\xbf"
- "\xd5\xeb\x5c\x43\x22\x65\x57\x3b\xf0\x09\x89\xd5\xbb\x53\xbb\xe5"
- "\x18\xbf\xdb\x16\x92\xb0\x77\x63\x7e\x4a\x33\xc0\xaf\xc9\xc2\xb2"
- "\xdb\x26\x3c\xbb\x33\xbb\xdd\x76\x9a\xb6\x44\x84\xa6\x85\x57\x84"
- "\x0b\x96\x50\xf2\x28\x2a\x07\xbe\xfb\x40\xa3\x42\xb4\xb3\x11\xd7"
- "\x89\x78\x4f\x97\xa2\xae\x8f\x44\xca\x6e\x1b\xd7\x27\x2a\x76\x67"
- "\x02\xe6\xb5\x80\x55\xc8\x38\x7d\xe5\xa6\x74\x3c\x67\x7f\x25\xf1"
- "\xdb\x9d\xaf\x79\x76\x3b\x35\xcb\x6e\x87\xc1\x43\xcc\x3f\x8a\x6e"
- "\xeb\x69\x6a\x40\x84\xbd\xe1\x4d\x04\x1e\x4b\x6f\x09\x1c\xe5\xf7"
- "\x98\x57\x6c\x43\x3f\x33\x4f\x95\xe0\xba\x85\x98\x7f\x5a\x8a\x9f"
- "\xe7\xbc\x1f\x31\x0f\x4d\x2d\x0e\xac\x18\x4d\xc5\x49\x78\x76\x15"
- "\x84\x2d\xf4\x78\xb1\xb9\x3c\xe2\xd9\x3d\xb9\xa5\x98\xfb\xe5\x08"
- "\xca\x70\xb9\x22\xb2\x26\xc1\xb6\x4e\x12\x61\xab\xd3\x6f\x1e\xe8"
- "\x70\x89\x96\x40\x2e\xf2\x16\x13\xb7\x87\xf9\x88\xf3\x4f\xe9\x10"
- "\xbe\x88\x65\x77\x88\xdb\x26\x06\x95\x53\x73\xc7\xad\xc4\xf3\x9b"
- "\xe6\x8e\x2d\xcc\xa7\x1a\xe8\x72\x10\x3c\xda\x3d\xa5\xa3\xbc\xdf"
- "\xe3\x67\x29\x09\x69\x91\x66\xc7\x36\xbc\x6f\x44\xbe\x26\xc9\xb7"
- "\x53\xcf\x86\xad\x61\xcb\xee\xec\xb0\x67\x77\xeb\xd4\xb3\xdd\xa2"
- "\xd9\xb1\x9e\x1e\xeb\x28\x07\xad\xb6\xd1\x94\x93\xe1\xe4\x96\xe2"
- "\x42\xe4\x09\x22\x7d\x8b\xe4\xff\x29\x27\x3b\xc5\xd4\xe7\xc4\xe9"
- "\xa9\x67\xff\x29\xa6\x38\xc4\x47\x05\x4e\x1a\x74\xc9\x0a\xa1\xb1"
- "\x5c\x34\xb5\x6d\xa3\x4b\x8e\xfa\x88\x65\x22\x77\x96\x26\xa6\x9c"
- "\x3c\x2d\x1e\x7f\x8e\x69\x33\x8e\x9a\x1d\x90\x1f\xe7\x7a\xa6\x77"
- "\x7e\xb3\x63\x2f\xea\x9f\x08\xb8\x2e\xe1\x75\x6e\x42\xde\x06\xeb"
- "\x63\x27\xd3\xa9\xa9\x6d\x3d\x85\x53\x76\x67\x47\x2a\x76\x4f\xd6"
- "\x52\x76\x3b\xb4\x8a\xdd\x4e\xf4\xd3\xc1\x70\xc5\xee\xd6\x48\xca"
- "\x6e\xf0\x40\xfd\x64\xf4\x53\x0a\xf7\x79\x17\xe6\xfb\x78\xbe\xa7"
- "\x8b\xfb\xdf\x53\x9f\x2f\x2c\xf5\x4e\xe8\x42\xa1\x78\xbf\x3e\x9f"
- "\xe7\xec\x22\xa5\xde\xd9\x9d\x52\xef\x40\x3e\xa7\x92\xaf\x7a\x0f"
- "\xf3\xa5\x1c\x8b\x56\xd7\xbf\x80\xb1\x23\x19\xef\xab\xf1\xdb\x8a"
- "\x5f\xbd\x58\xbd\x07\xba\x8b\x06\x4b\x9e\xf2\xec\xb1\x88\x3b\xaa"
- "\x60\xa3\x62\x8e\x9e\xb2\x27\x73\x5a\xe4\x4e\x01\x1a\x42\x4e\xf6"
- "\x58\xb4\x8a\x3d\xd0\xe7\x7b\x26\x87\x24\xef\xef\xf9\x21\xc3\xee"
- "\x5e\x96\xc9\x73\x79\x33\xde\xe7\x23\xed\x8f\x21\xe6\x55\xcb\x9e"
- "\x83\x9a\xe5\x83\x4c\xc0\x6a\xbd\xef\x79\xe1\x8f\x78\xf6\x84\x34"
- "\xcf\x9e\xf6\x70\x7f\xd8\xbe\xce\xbd\xc4\xfa\x29\xfc\xa1\x00\x0d"
- "\x7e\x0f\x7a\x6c\x91\xfd\xef\x75\x42\x06\x96\x0c\x2b\x6f\xee\x00"
- "\x2f\x14\xbf\x23\x75\x53\x4b\xe0\x88\xa4\x29\xf0\x38\xc8\x3c\xc5"
- "\xfd\xfb\x78\x31\x95\xa3\xae\x56\xe0\xd2\x1e\xa9\x00\xdc\x14\xd4"
- "\x93\xba\xf7\xa9\x90\x94\xd7\xbd\xe0\xd7\xbd\x28\xf3\x7b\x52\x3c"
- "\xbe\xd7\xd1\x97\x8e\x64\x5d\xc5\xfa\x69\x5a\x38\xc4\x3c\xf3\x2f"
- "\xd6\x6b\x4a\x4f\x51\x81\xa1\xa7\x58\x47\xf1\x7c\x82\xf5\x94\xa6"
- "\xeb\x29\x4d\xd7\x53\xf2\xd9\xb2\x8b\x61\x85\x58\x1f\x4d\x73\x2a"
- "\x3d\x33\x2d\x92\x25\xc0\x1b\x69\x80\x11\x52\x7d\x81\x3c\xab\x77"
- "\xf5\x93\xf9\x25\x9d\x76\x65\x6a\xd0\x37\xf8\x65\x6b\x4a\xdf\x38"
- "\x75\x7d\x63\x32\xf4\x4d\x04\xe3\x1a\x64\x4a\x4b\xa4\x6f\x34\x5d"
- "\xdf\x44\x84\xd2\x37\x9a\xae\x6f\x38\x3d\xa2\xeb\x9b\x48\x02\x7d"
- "\xa3\x79\x76\x71\x7b\x93\x75\x3d\x53\xce\x7a\x86\xdb\xab\x55\xec"
- "\x6a\xd7\x94\x9e\xb1\x60\x2e\x61\x62\x3d\x13\x41\x19\xcd\xd0\x33"
- "\x41\xa9\x0f\x32\x59\xd7\x74\xff\x8c\xa0\x3f\xed\xc4\x3a\x46\xea"
- "\x93\xf0\x88\x30\xeb\x13\xd0\xef\xce\x78\x7d\x02\x78\xd9\xb8\x4f"
- "\xd7\xf5\x94\xc3\xba\x42\x84\xa1\x4f\x26\x4f\x73\x06\xd0\xd7\xff"
- "\xc0\x9c\x1a\x7a\xdb\x59\x52\xee\x75\x86\x09\x7a\xc0\x29\x5a\xca"
- "\x09\x3a\x07\xfc\x1b\x81\xae\x20\x82\x5c\x1e\x84\x7c\x86\x50\x77"
- "\x6b\x4b\xf1\x5f\x08\xf2\x9e\x3d\xa5\xa3\xd3\xfb\x78\x20\x33\x7d"
- "\xca\x49\xe1\x07\x7d\x7c\x8f\x17\x97\x43\xbf\x64\xfa\x9b\x3b\xf6"
- "\x51\x6e\x9b\xd0\x72\x67\xfa\xec\xc0\xa3\x75\xca\xdc\x06\xeb\xe3"
- "\xcf\xa5\x43\xce\x44\x03\xf4\xe2\xa7\x53\x4e\xa6\x5b\x67\xb4\xd1"
- "\xb7\x73\x67\x09\x0d\xf2\x04\xba\x43\xce\x20\x8f\xc0\xdd\x01\x99"
- "\x73\x42\xce\x0e\x86\xe3\xe4\x0c\x32\x73\x0f\xee\xed\x8a\x7e\xf5"
- "\x4e\xc8\x59\xbe\x26\xc7\xb3\x36\x39\x87\x83\xac\x39\x79\x8d\x0b"
- "\xb2\x96\xaf\x55\x28\x59\xd3\x54\x39\x8f\xc6\xf4\x33\xe9\xb2\x86"
- "\xbe\xc0\xfb\x6a\xfc\xb6\xe2\x97\x58\xd6\x8a\xa3\x64\xed\x39\x5d"
- "\xd6\x52\x94\xac\xa1\x4f\x93\x23\xcb\x94\xbc\x31\x7c\x9e\xe7\xf5"
- "\xc8\x5b\xea\x9e\x83\x82\xed\x49\xc9\x3b\x2c\x73\x7b\x30\xae\xec"
- "\x09\x41\xde\xda\x35\xcf\x07\x80\x27\xfc\xac\x37\xc1\x9b\xff\xc5"
- "\x63\xdd\xd4\x62\xf1\x5f\x05\x91\x61\xe5\xa8\x2b\x04\x5d\xf6\x4f"
- "\xe8\xd1\xff\x7a\x3c\x40\x75\x80\x75\x10\xf5\xb5\x42\x9e\xda\xb5"
- "\x0a\x29\x4f\x8e\xc8\x32\x86\xb9\xd7\xd1\x03\x43\x8e\x95\xb1\xf2"
- "\xd4\xd7\xfa\x62\xd0\x7d\xd5\x38\x1f\xed\x2e\x61\x7b\x05\xf7\x93"
- "\x7d\x54\x3f\x59\xbf\x87\xfd\x53\x23\xd7\xa6\x59\x06\x8b\xcb\xe8"
- "\xb2\x13\x64\xb7\x80\xdf\x09\xf7\x69\xb8\x4f\x9b\x76\xfd\x47\xb0"
- "\x23\x22\xd9\xa8\x37\xc8\x72\x28\xdc\x63\x79\xce\x95\x03\x3e\xb4"
- "\x88\x60\x66\x1a\xec\xc9\xcd\xa2\xdb\xc6\x6b\x58\x56\x3c\x0f\x42"
- "\xfb\x47\xe2\x3a\x64\xd3\x39\xca\xc0\xcf\xb6\xc9\xad\x95\xb3\xed"
- "\x84\xfb\x2c\xb1\xd8\x96\xba\x6e\x11\x8d\xb2\x06\xc8\x52\xeb\xd6"
- "\xf2\xad\x2b\xd2\x79\x2d\x27\x83\xef\x85\xbb\xce\x51\x7b\x8e\xcc"
- "\x6c\x57\x6a\x29\xa8\xcf\x69\x15\x62\x41\x26\xd5\xce\x87\x7e\x70"
- "\x93\xad\xd6\x2d\xb6\x47\x82\x4c\x83\x9d\xad\x06\x2e\x8c\x1b\xf0"
- "\xbc\x12\x78\x0e\x7f\x70\x49\x0e\xfd\xde\x49\x09\xd7\x40\x83\x6e"
- "\x7b\x4f\xfb\xfb\x78\x3f\xc3\xa0\x49\x1f\xef\x4b\x0d\x3a\xf5\xb1"
- "\x5e\x66\xe6\x31\x3a\xb2\x48\xf8\x2b\x9f\x22\xa6\x85\xcd\x15\x16"
- "\xff\x07\x74\x2c\x2f\x8b\xd0\x95\xd3\x96\x5c\x25\xbc\x1d\xa2\xc1"
- "\xeb\x3c\x49\xb5\x78\x5f\x56\x2a\x34\x2d\xe5\x00\x64\xfe\x40\x69"
- "\xe7\x22\x11\xe6\xb5\x12\xd4\xe1\xf3\xd1\xed\xe5\xaa\x2f\x76\xab"
- "\x79\x9e\xe5\x40\x29\x60\x0d\x66\x58\xcd\x28\x1f\xa9\x38\xb0\x2a"
- "\xe8\x1e\x61\xf1\xd1\xef\x67\xc8\x7c\x96\xdd\xf9\xc5\x4b\xe9\x8a"
- "\x13\x34\x22\x47\xda\xfa\x9e\x03\xeb\x59\x1f\x20\x2d\x1d\x69\xb9"
- "\x80\x5f\x8d\xfc\xd9\x3e\xfa\x75\xb5\xb2\x63\x47\xe4\x1a\xf9\x70"
- "\x6f\xe7\xfb\x18\xfe\x49\x92\xdb\x2b\xe8\x2f\x7b\xef\x66\x0b\xa7"
- "\x99\xa3\x36\x5f\xd2\xf1\xcb\x49\xfc\xba\x57\x9f\xef\x6e\x85\xad"
- "\x45\xae\xe5\x34\x1c\xfd\xc3\xf8\x7d\xec\x72\x8a\xe3\xc2\x3d\x22"
- "\xff\xe7\x4b\x43\x98\x27\x8c\x68\xf2\x91\xa7\xa6\x2f\x7a\x0a\xb6"
- "\x75\xce\x89\xf6\xca\x45\x3d\xb4\xfc\x6c\xda\x12\x4d\xf0\x3d\xeb"
- "\xa3\x5a\xa4\x33\xdd\x82\xee\xab\x33\x0c\x9a\xf5\xdd\x2f\x07\xaa"
- "\xd4\xbc\xf0\xea\x12\xe1\x16\xd4\xf0\x6d\xde\x9f\xb8\x7a\xa1\xa2"
- "\x43\xbd\xa3\x13\x7a\x84\xd7\x5f\x6b\x41\xef\x05\x36\x11\x02\x4c"
- "\x87\x8f\x6e\xf0\xeb\xeb\x3c\x01\x6f\x78\x12\xeb\x96\x84\xe3\x16"
- "\xef\xff\xf4\xc2\xbf\x66\x7d\xcb\x70\xe8\x21\xa9\x9b\x0e\x1f\x29"
- "\x53\x78\x87\x18\x6e\x43\xd9\x19\x6a\xc3\xfb\x05\x01\xd1\x2e\x3c"
- "\x87\x0f\xf2\x3c\xa2\x61\x51\x17\xa7\xbd\x0a\xde\x16\x0d\xf3\x19"
- "\xa7\x6b\x5e\x6d\xf8\x76\x17\x1d\xc7\xbc\xaf\xb6\x67\x4d\xe6\x9a"
- "\x72\x5e\x83\x51\xeb\x48\xd7\x60\x3e\x34\xaa\xde\xc0\x8b\x6d\x0c"
- "\xd0\xd7\xc2\x36\x07\xdb\x1a\xbc\xa6\xbf\xa0\x54\x84\xd8\xe6\x40"
- "\xde\x51\x46\x1b\xb8\x7d\xaa\x5d\xd7\xe4\x44\xb7\x0b\x38\xf8\x31"
- "\x87\x96\x34\x58\xb0\x84\x2c\x76\x45\x6b\x0b\xb7\x97\xdb\xc2\x6d"
- "\x96\x6d\x91\x3a\x16\x63\x44\xf8\x56\xd4\x2f\xd3\x9d\x80\x85\xf9"
- "\xcf\x77\xa7\x2b\x9e\xba\x86\xe2\xf9\xa8\xa7\x1f\x2d\xbb\x33\x5d"
- "\x5f\xd1\xb7\x5d\x9a\x38\x76\x9c\x46\xf2\x7c\x37\x99\xaf\x1a\xdb"
- "\xd9\x21\xe6\xdf\x26\x27\x8f\xc9\xde\x52\xd6\xb7\x32\xef\xa5\xc8"
- "\xdb\x86\x3c\x29\x7a\xde\x14\xb5\x9f\x23\xaf\x03\xf8\x8a\x71\xec"
- "\x5a\x1f\x8d\xb4\xfb\xe5\x78\x7f\xb8\xca\x78\x16\x78\x06\x2e\xad"
- "\xa2\xa2\xc9\x99\x18\x97\x0f\x32\x79\x3c\x8b\x9c\x13\x1d\xa8\xe7"
- "\x5b\xcc\x53\xae\x25\x74\x39\xf8\xf2\xb3\xb2\xe5\x74\x29\xf3\x93"
- "\x48\x39\x50\xa3\xe8\x3e\xb2\x48\xb8\x61\x7b\x42\xa3\x16\x2f\xa2"
- "\x2b\x20\x47\xeb\x4f\xd0\xc8\x15\x05\xa5\x76\xe0\x4a\x54\x79\x8a"
- "\x48\xea\xa0\x94\x03\xd5\xde\xf0\xe7\x54\x7b\x8a\xd7\x5f\x46\xd6"
- "\x19\xbc\x88\xfb\x6d\x17\xd2\x17\xa0\xeb\x56\xb5\x7e\x70\xed\xe5"
- "\xbc\x7e\x7f\x8c\xae\x35\x73\x7b\xf1\x4b\x42\xdd\x67\xc5\x39\x31"
- "\x43\xa8\x31\xad\xda\x47\xd7\x66\xe1\xba\x55\xfe\xdc\x34\x53\x7f"
- "\xae\x46\xbe\x36\x71\x4e\xe3\x3c\x5b\xd1\xfe\xb0\x70\x27\xb1\x4c"
- "\xec\x0d\xba\xaf\xcd\xf4\xd1\x78\x5d\xde\x47\x06\x18\x56\x1f\x38"
- "\x54\xa3\x6f\x89\x79\x13\x78\xbc\x64\x2f\x4b\x62\x3c\x66\x4b\xb9"
- "\x00\xac\x5a\x93\xd2\xdb\x1a\x70\xdd\xec\xd6\x1c\xd0\xd1\x0e\x6d"
- "\x75\x8b\x4f\xde\xeb\xef\x84\x3e\x8e\x26\x86\x7f\xf8\x48\xc3\x30"
- "\xe6\xf1\x6b\x3b\x14\x9c\xc3\x07\x1b\x86\x9d\xe0\xe7\x93\xfc\x1c"
- "\xb0\x78\x7d\xde\xea\x1c\xd4\x7f\x82\xeb\xed\x50\xf3\xf9\x6b\x4f"
- "\x76\xa2\x0e\xb4\xa1\xc3\x47\xa3\x1b\xd5\x5e\x86\xd7\xd7\x87\xec"
- "\xa5\xb3\xec\xb0\xcc\x29\x99\xfe\xce\x3b\xcd\x75\x52\xfe\x3c\xe0"
- "\xf9\xad\xba\xde\xe0\xb5\x96\xb4\x63\xf4\x9d\x6d\xcd\x36\xc9\xdf"
- "\x26\x61\xba\x2e\xf7\x5d\xcd\x6f\xe2\xfd\x26\xa5\xbe\xbe\xb3\xed"
- "\xfc\xdf\x75\x68\xdf\x75\x55\xf8\xd5\xe8\xcf\x98\xff\x5f\xb7\x17"
- "\xf7\x69\xf8\xd5\x48\xda\x6d\x2c\x4c\xf2\xe1\x5d\x27\x6c\x76\x7e"
- "\xf6\xd1\x75\x1e\xb1\x71\xa4\x09\x76\x89\xbc\xaf\xbd\x9c\xd7\x09"
- "\xae\xdb\x81\xfe\x1a\xa7\xfa\xe2\x3b\x72\x4f\x11\xb8\x31\xdd\x85"
- "\xab\x5a\x84\x1a\xcb\x02\xc0\xfb\xba\xb6\xc6\xea\x00\xd9\xaf\xe3"
- "\xf6\x5f\xd7\xce\x6d\x0a\x80\xfe\x7c\x5d\x50\x2d\xfc\xfb\x6b\xc2"
- "\xc4\xfb\x5e\x41\xf7\x77\x20\x7f\x0e\x52\x6b\x0e\x87\xfd\x0c\x4f"
- "\xe7\x09\x61\xb4\x5f\xe9\x34\xaf\x8f\xfb\x12\xcf\xb7\xa2\xed\xd6"
- "\x53\xf4\x9d\x85\x22\xb5\xc5\xb7\xdf\x41\xb4\x09\x7a\x04\x63\x8d"
- "\x5c\x8b\x87\x5e\x62\x98\x18\xff\xaf\xad\x31\xf6\x69\xd6\xe2\xfd"
- "\x3a\xbc\xc3\xd8\xe3\x6f\x76\x84\x88\x61\x45\xb8\x7d\x28\xbf\x4f"
- "\xf3\x9b\x31\x56\xa3\xcf\xbd\xbe\xb2\x62\xe8\x99\x1e\xbd\xf5\x9d"
- "\xe1\xcb\x4f\x8a\x90\xd1\x3e\xde\x0b\x05\x5c\xf0\xff\x53\xb6\x3e"
- "\xf9\xbf\x07\xe7\xcc\x3f\xec\x1f\xa9\xfa\x4c\x03\x5d\x62\xfb\x2c"
- "\xf3\xa0\xea\xaf\xef\x84\x63\xfb\x2b\xf3\x20\x7e\x13\xf1\x9b\x81"
- "\x5f\x91\xfe\x1c\xfd\xcb\x8a\xba\x87\xb4\x66\xee\x08\xba\x33\x31"
- "\xfe\x8f\xac\x57\xfd\xc0\xe9\x68\x07\xf3\xc8\x97\x64\xe1\xf5\x3a"
- "\xde\x07\xe5\x74\xe6\x67\x4e\xd7\x60\xcf\xe0\x39\x0f\xef\xd3\x59"
- "\x56\x2b\x35\x8a\x79\xef\x5d\x05\x9e\x5b\xda\xc5\xf8\xbf\x29\xd7"
- "\x18\x57\x78\x3c\xcc\xa7\xc8\x33\xdd\x1a\xf6\x60\x7e\x90\xb9\xcd"
- "\xa0\x2b\xd2\xd6\xf3\x7b\xe6\x49\xa4\x37\x82\x2e\x72\x0d\x3d\x80"
- "\xf9\x5e\x62\x5b\x23\xb3\xbd\xc7\x26\xb3\xec\xb1\xb0\x3e\xea\xa0"
- "\xeb\x03\xd0\x59\xe8\xdb\x96\x56\x35\xd6\x5c\x7f\x96\x9f\xa1\x2b"
- "\x3f\xc3\xbd\xbf\x19\xad\xec\x5a\x7d\x80\xd7\x71\x06\x74\x99\x28"
- "\x27\xbc\x3a\x32\x23\x9c\xfa\x61\x9a\xb7\x7d\x07\xb5\x84\x7f\x43"
- "\xf6\xa7\x24\x8c\x2f\xbc\xe0\x01\xd7\x12\x11\x79\xaf\x6b\xab\xd9"
- "\x1b\x3e\xdd\x80\xb1\xf9\xaa\x13\x74\xbd\xa4\xc7\x8b\xc7\x30\xea"
- "\x3f\x2e\x61\xeb\xf4\x89\x64\xaf\x9b\x23\xc2\xeb\x8e\x8b\x00\xec"
- "\xbb\xd4\xb5\x5d\x34\x6a\xc3\x52\xca\xaa\xe9\xa2\x91\x9b\xbb\x28"
- "\x53\xfc\x2b\xd3\x54\x03\xbb\xed\xf1\xb3\xe9\x04\x9d\x90\x3f\xa8"
- "\x98\x2c\x9b\x97\x92\xe4\x91\x48\x05\xec\xb7\x30\xec\xb7\xd3\x99"
- "\xac\x1b\x7b\xec\xb7\x6e\x69\x17\x7f\xa2\xf3\xd1\x27\xe6\x81\x0e"
- "\x4a\x4a\x9b\x49\xe9\xc0\xcf\x75\x8a\xae\xbf\x3e\xad\x0d\xb6\x23"
- "\xda\xec\xd3\xdb\x8b\xeb\x38\xab\x83\x06\xc8\xb6\x42\x5f\x8b\x8a"
- "\x96\xd6\x3e\xc7\x61\x13\xf3\x54\x80\xe5\x06\x6d\xb8\xe1\x2e\xde"
- "\x8b\xdd\x31\x2c\x64\x5e\x50\x23\x42\x9c\x5e\x32\x42\x84\x90\x9e"
- "\xc9\x75\x6f\x47\x7a\xd0\x7d\x43\x9e\xcf\xf4\xeb\x3e\x7d\x3b\x30"
- "\x3f\xd2\xf5\xca\x0d\x87\x85\xa9\x1c\x3c\xba\x67\xf2\xf2\x30\x6c"
- "\xef\x53\x2c\xb3\x37\x1c\x9a\x56\x24\xc2\xf6\x79\xbc\x2f\x7e\x83"
- "\xdc\xb3\xe7\xbd\xba\x77\x61\xdb\x7c\xdd\x3e\x3d\x8f\x17\x3c\x57"
- "\xb0\x16\x01\xe6\xea\x3d\x93\x05\xe6\xe7\xb1\x36\x3c\x51\x5f\x76"
- "\x3c\xfb\x8a\xbc\x22\xfd\x52\xbe\x9b\xe6\xa3\xfb\x0a\x19\x77\xde"
- "\x93\x65\xdd\x09\x7b\xeb\xd2\xe3\xf4\xdd\xc9\x01\xd0\x01\xef\x31"
- "\xfe\x4f\xce\xd6\xf7\x55\xa5\xbf\x0b\xd2\x30\xfe\xdf\x5b\xca\x69"
- "\x25\x23\xc8\x56\x62\x17\xed\x7d\xd9\x4c\xd2\x07\xc5\x44\x98\x6f"
- "\x7e\xb7\xc4\x80\x83\x71\xea\x3f\x3b\x4d\x0f\x3e\x88\x34\x8f\x01"
- "\x07\x79\x2e\xc3\x73\x75\x4f\x1e\x55\x66\x6b\x54\x99\x07\x3b\x4d"
- "\x37\xfc\x27\xd2\xf6\xc6\x95\x69\x8a\x2b\x73\x34\xaa\x4c\xb9\x5e"
- "\x8f\x3f\xb6\xcc\x28\x8a\x2d\x33\x2a\xfd\x7c\xdc\x46\x8d\x8c\x2b"
- "\x33\x36\xae\xcc\xc4\xf3\x71\x1b\x95\x1f\x57\xc6\x11\x57\xc6\x19"
- "\x45\x4b\xf6\x07\xc9\x42\xda\x9a\xb8\x32\x35\x71\x65\xb6\x19\xcf"
- "\x7d\xf9\xfc\x2c\xd8\x44\x36\xf0\x66\x3b\xf7\xe7\x2b\xe8\x9f\xce"
- "\xd7\x9f\x0e\xea\x65\xdb\x13\xb4\x2b\x1c\x5b\xdf\xe8\xb4\xd8\xfa"
- "\x46\x0f\x3f\xbf\x5d\xa3\xb3\xe2\xca\xe4\xc4\x95\xc9\x8b\x2a\x53"
- "\xa7\xea\x19\x5d\x18\x57\xa6\x24\xae\xcc\xaa\xf3\xf9\x6a\x74\x75"
- "\x5c\x99\xad\x71\x65\xea\xbf\x86\x16\x3c\x8e\x2b\xdf\xac\xa1\x6c"
- "\x2b\xdf\x0d\x1b\xe1\xc6\x11\xec\x73\xc0\x7b\x93\x3f\xef\x0a\xf5"
- "\xe3\xfd\x10\x1e\xaf\xf6\x3b\x43\x18\x5b\x6e\x84\x7e\xb8\xa5\xdc"
- "\x18\xb3\xd8\x1f\x83\x65\x5a\xd9\xd8\xa3\xdb\xfb\xb2\x45\xb9\x1e"
- "\xc3\x57\x8b\xeb\xda\x3f\x9c\xc7\xa9\x1b\xa7\xf7\xd8\xc4\xca\x7f"
- "\x89\x14\x9c\x1b\x7f\x69\xec\x8d\xd6\x2a\x3f\x8f\x24\xb6\xc9\xf7"
- "\x3b\x65\x19\x4f\x94\x1d\xcd\xf5\x07\x76\x2c\x0d\x99\x63\xf1\xb8"
- "\xd1\x71\x01\x3c\xd2\x60\x1b\xd5\xb7\xc0\xb2\xe0\xfd\xeb\xe6\x1a"
- "\xd8\x40\xb0\xfb\x19\xb7\x63\x74\xa3\x5f\xda\x64\xf3\xba\x88\xef"
- "\xbd\xa5\xb7\xcb\xfd\x6d\x65\x93\x8e\xc9\x6c\x44\xfd\x6c\xbb\x37"
- "\x16\x9f\x61\xbf\x0f\x8c\xbf\x6c\xbb\x8d\x79\x70\x7f\xa9\x1f\x78"
- "\x8d\xe9\xf1\xff\xf0\xd1\x98\xe9\xd2\xd6\xf0\x1c\xde\xce\x7b\xef"
- "\xbc\x87\xb4\x3f\x90\xcd\x79\xc0\xff\x37\x8e\x32\xda\x8b\xb1\x1e"
- "\x32\x76\x63\xf8\x42\x34\x53\x7d\x38\xa6\x34\x96\x27\xfb\x81\x57"
- "\xc6\x54\xc5\xf6\xfb\x98\xba\xd8\x7e\x1f\xb3\x3d\x96\x27\x4d\xe0"
- "\xc9\x31\x8d\x71\x65\x8e\xc4\x95\x69\x8b\x2a\x53\xa5\xd7\x13\x8a"
- "\x2d\x93\x65\x89\x2d\x93\x65\x8b\x7a\x46\x1b\xb3\x32\x7b\xe6\x3e"
- "\xd2\xb7\x28\x2b\x3b\xea\xd9\xb4\x5e\xea\xcf\xac\x5c\x23\x8d\xd7"
- "\x8e\x36\xbf\xa6\x7c\x5b\x74\x78\x8e\x38\x79\xe7\xfc\xa5\x71\x38"
- "\xac\x89\xc3\xa1\x47\xfe\xf5\xfd\xf4\xdf\x1d\xa7\x9b\x4a\xf4\xfd"
- "\xf4\x0e\x8c\xd9\xd3\xf8\x19\xb0\xaa\x91\x1f\x74\xc8\x6a\x8a\x83"
- "\x77\x34\x0e\x5e\x47\xd4\x73\x3a\x9e\xc3\x51\x6d\x48\x4f\xb6\x49"
- "\x3f\x41\xd8\x6f\x37\x65\x18\xe9\x3c\xa7\x04\xbe\xed\x2e\x39\xd6"
- "\xe4\xb0\xcf\xd6\x90\x63\x74\x13\xfb\x34\xe9\xba\xfc\xa6\x68\xf9"
- "\x27\xd5\xae\x9b\xa6\xc7\xe2\x71\x53\x61\x2c\x1e\x37\x95\x44\xb5"
- "\x2b\x60\x5d\x41\x3f\xb6\x86\xef\x7f\x98\x6d\x1f\xf6\xb5\x93\xbe"
- "\x53\xcb\x61\xb3\x9d\xa5\x74\xf6\x59\x3b\x5e\x42\xc9\x5e\x67\x3b"
- "\xe6\x72\x9f\x24\x5c\x87\x91\xfc\x94\x7a\xb8\x41\xf7\xfb\xb3\x03"
- "\xfe\x11\x83\x1f\xb5\xd5\x87\x1b\xb4\x8a\xe6\x46\xa4\x41\xff\x8d"
- "\x99\xa9\xec\xdc\xe6\x74\xe1\xca\xaf\x06\x3d\x31\x2f\xba\xf9\x2f"
- "\xfa\x3c\xe2\x08\xfb\x5e\x41\xf7\xb4\x63\x8c\x4f\x53\x7b\xe5\x37"
- "\x0f\x8f\xe2\xeb\x80\x7d\xe9\x9d\xe2\x18\xdd\xfc\x19\xdb\x00\x2c"
- "\xa3\xec\xc3\xb5\x3f\xec\x27\x9e\x7b\x7b\xc3\x27\xa4\xed\x86\xf7"
- "\x3e\xbd\x6c\x7e\x54\x59\xbf\x3e\x37\x6e\xe7\x77\x63\xc2\x64\xde"
- "\x1f\xf0\x13\xe0\x64\x28\x7b\xef\xe6\xcf\xf6\x43\x5e\x51\x66\x8d"
- "\x51\x86\xe7\xd1\x5c\xc6\x5a\x42\xe6\x1b\x4b\xc9\xdc\xb0\xf4\x98"
- "\x84\x6d\xf8\x52\xc0\x96\xee\xf0\x96\xb6\x93\x37\xd0\xca\x6b\x5d"
- "\x66\xe5\x03\x73\xb3\x2f\x39\x44\x96\xce\x8a\xc3\x90\x91\x9b\x7d"
- "\x91\x8a\xc3\xf5\xc0\xed\x10\xee\xcd\xac\x6f\xa2\x69\x37\x69\x52"
- "\xde\xfd\xd3\xa6\x8c\xfe\xc9\xfd\xf7\x4e\x9f\x74\xbb\x7d\xfa\xdc"
- "\x67\x66\x17\x8e\x7e\x76\x61\x89\x7d\xf1\xfc\xb9\x25\x73\xe7\xfd"
- "\xd4\x9e\xe5\xbc\xd6\x69\x9f\x55\xa2\xae\x99\x45\xb3\x16\x94\x8c"
- "\xe7\xdb\x51\xf6\xe2\xf9\xb3\x17\xc9\xdb\xeb\x53\x29\x16\xc8\xdc"
- "\x92\xd9\xf3\xed\xd7\x16\x8e\xb2\xdf\x33\x6b\x6e\xd1\xc2\xf9\xb3"
- "\x13\xc2\xba\xdd\x3e\x7f\xf6\xfc\xd9\xb3\x0a\xed\xe3\xed\x59\x0c"
- "\x39\x1a\x5c\x54\x7f\x66\x19\xe3\x18\x8f\x5f\x95\x6e\x71\x48\x1f"
- "\xcf\x7c\x8a\x7f\x6e\xd9\x71\xfe\x58\x76\xcb\xc1\x58\x9e\xbb\xa5"
- "\x35\x96\xe7\x6e\x69\x3f\x7f\x2c\xbb\x25\x6e\xfc\x1b\x1b\x37\xfe"
- "\x8d\x1d\x7e\xfe\x58\x36\x36\x6e\xfc\x1b\x1b\x37\xfe\x8d\xed\x19"
- "\xff\xc0\x4b\xbe\x95\x52\x2f\x8c\x8d\x1b\xff\xc6\xc6\x8d\x7f\x63"
- "\x57\xc5\x3d\xaf\x8f\x7a\xbe\x14\xcf\x5b\xa2\xc7\x47\x3c\xef\x30"
- "\xe4\xb3\x57\xbf\x8c\x3d\x68\xe4\x61\x5d\x0f\xdd\xdc\xa6\xe7\xf5"
- "\x45\xe5\x6d\xd7\xf3\x06\x7a\xe4\x0f\x7c\xc4\xbe\x6e\x6a\xbe\x7e"
- "\xeb\xc3\xac\xd3\xd9\xcf\x8d\xc7\x26\xc8\xc7\x55\xa7\x68\xec\x61"
- "\x86\xc5\x3c\xcc\x7e\x8f\xe2\xf5\x47\x83\xb5\x43\xc8\xc2\x65\x6a"
- "\x5f\x26\xb3\x70\xdf\xdc\x81\x2b\x21\x2d\x0d\x3f\xe8\x94\x5b\x61"
- "\xff\xfe\x46\x9f\xa3\xdc\x5a\x27\x6d\x7e\x94\xd1\xe1\xcb\x79\x0d"
- "\xe0\xd8\x50\xc6\x52\xa9\xc6\xe2\x36\xdc\xa7\x31\x4f\xa3\xbc\x59"
- "\x98\x6e\xb9\x09\x57\x42\x5a\x3a\x7e\x19\x80\x57\x67\xc0\x5b\x35"
- "\x34\xb1\x6d\x19\x6f\xe7\xf6\xcc\x07\x4d\x64\xad\x74\x6b\xad\x5e"
- "\x8d\x6d\xeb\x5b\x8f\xa8\xb5\x85\x03\x76\xe1\xfe\x28\xbf\x16\xe9"
- "\x89\xe7\x49\xdf\x83\xfd\x77\xeb\x41\xb5\xde\xf2\x3d\xf4\xff\x7d"
- "\x01\xb5\x76\x7a\xc0\x0e\x7d\xdb\x75\x9c\xbe\xb7\x13\xd7\x6e\x5c"
- "\xdf\x30\xe0\x37\xc8\xf9\xf6\xf7\xc6\x0a\x77\xd2\x03\x0c\x37\x2e"
- "\x3d\x17\xfa\xad\xcb\x1a\x2e\xcf\x4f\xf0\xce\x21\xdc\xc9\xf7\x27"
- "\x48\x2f\x87\xcd\xd0\xe5\xa3\xef\xed\x60\x7c\xa3\xd2\xab\x85\x7b"
- "\xd0\x74\xce\xef\xe3\xfa\x50\xa6\x2f\x5b\xdb\xf0\x6b\x55\x7e\xe8"
- "\xdf\x6b\x8b\x6b\xc7\x57\xc7\xe9\xfb\xb3\x54\x3b\xbe\xbf\x2f\xae"
- "\xee\x70\xe2\x76\x7c\x3f\x03\xed\xf8\x2a\x71\x3b\xbe\x9f\x25\x69"
- "\x6b\x42\x5b\x4c\xe7\xbd\xcb\x45\x5b\xbe\x92\x74\x8f\x4d\x2f\xd4"
- "\x6d\x21\x9e\x93\xa5\xe3\x9d\x2c\xfb\x40\x69\x6f\xbf\xe9\xf9\xd6"
- "\x58\xab\x29\x2f\x41\x9d\x5b\x84\x7b\xc0\x03\x3e\xfa\xfe\x51\x09"
- "\xa7\x37\x7d\xaf\xc2\x05\x74\x32\x49\x3a\xb1\x3c\x58\xfb\xea\x6f"
- "\x63\x5e\xa2\xd6\x42\xb2\x21\xff\xdf\x6b\x30\xd6\x32\x17\x94\x0a"
- "\xbf\x41\x47\xbc\xcb\x8c\x7b\x17\x8a\x7a\x37\x31\xe6\xdd\xf2\x9e"
- "\xf4\x19\x46\xfa\x37\xeb\xa7\xec\x35\x71\xfd\x84\xfe\xb9\xed\xca"
- "\xd8\x76\x67\xd7\xa8\xf6\xa1\x8f\xce\xa3\x75\x76\x3d\xfa\xa8\x3b"
- "\x71\x1f\x65\x1f\x49\xcc\x6b\xd9\x72\x1d\x4d\x0c\xa1\x04\xf0\x6e"
- "\xe3\x39\x76\xb7\xe4\x41\xbd\x9f\xce\xef\x9f\xdb\x46\x19\xfd\xf3"
- "\xcd\xda\x78\x5b\x71\x5c\x1b\x23\x80\x71\x52\xb5\xf5\xf6\xf1\x71"
- "\xb0\x3d\x89\x79\xf1\xb6\x3a\xb4\x33\x92\xb8\x9d\xb7\xed\xed\x9b"
- "\x17\x6f\x6b\x45\x7b\x22\xe7\xf3\xe2\x6d\x7e\x55\x86\x12\x94\xb9"
- "\x3d\x4d\xb8\x13\xd5\x73\xfb\x48\x57\x98\xed\xdc\xdb\x67\xf0\xfa"
- "\x52\x54\xfa\xb8\x58\xfe\x43\x1b\xb8\x1c\xd3\x2f\xac\xf4\x2c\xf7"
- "\xc3\x71\x3b\x99\xbe\x8e\x27\x83\xee\xdb\x6b\xe2\x68\x75\xfa\x38"
- "\xfd\xe0\xca\x4e\x53\xd2\x16\x45\xaf\x1f\x7c\x16\x87\x53\x7d\x62"
- "\x7a\xdd\x7e\x08\xf4\x3a\x9d\x98\x5e\xb7\x77\xf4\x4d\xaf\x1f\x70"
- "\xff\x9f\x3e\x9f\x5e\x3f\xb0\x47\xd3\x0b\xb6\xae\x6c\xdf\x35\x36"
- "\xf0\x46\x77\x81\xa8\xe5\xb6\x46\x28\xdd\x0a\x5e\x51\x65\x3a\xb8"
- "\xcc\x74\x6b\x48\xf1\x09\x6c\x48\xcb\x29\xfa\xc1\x38\x43\xfe\x07"
- "\x55\xd3\x00\xd1\xfd\x28\xfb\x11\x25\x71\x39\xaf\xf3\x74\x83\x37"
- "\x9c\x45\x3c\xff\x88\xab\xb7\x3a\xb1\x2e\xf8\xc1\x76\xd0\xf4\xe5"
- "\x04\xe9\x07\x95\x7f\xd9\x38\x8a\xd5\x11\x3f\xf0\xc5\xf6\x11\xe8"
- "\x86\x72\xfa\xb6\xd3\xd7\xfe\x2e\xdc\x67\xe3\xf2\xce\xef\xb3\x71"
- "\x5f\xaa\xfe\x1a\x77\x38\x16\xbf\x71\x8e\xc4\xfd\x35\xae\xbc\xef"
- "\xfe\x1a\x57\xd3\x77\x7f\x8d\xab\xe7\xfe\x42\x7b\xfd\xb1\xe3\xc6"
- "\xb8\x43\xb1\xed\x45\xbd\x28\x27\x4c\xfd\x2f\xe5\xe7\x6f\xda\x6e"
- "\xe3\xc7\x3a\x8e\xfb\xaa\xb6\x8c\xc0\xcb\x49\x23\x18\xc7\x8b\x85"
- "\xd1\x27\x6c\xd0\xb0\x6a\x69\xe2\xfd\x56\x9e\xe3\xb6\x54\x13\xf1"
- "\x3e\xb2\xfd\xdb\x6c\xbb\x8f\xff\xbd\x66\xa2\x56\xdc\x9b\x8e\xd3"
- "\x9d\x2f\x69\x26\x53\x29\xef\x79\x4a\xbf\x70\xb9\x86\x30\xfe\x68"
- "\x74\x5f\xf0\xde\x27\xcf\x4d\xd7\xa9\xb9\xd3\x3f\x8f\xd3\x1d\xb3"
- "\x55\xbf\xdc\xf9\x5c\x2c\x1d\xef\xa0\xc4\xfd\x72\x87\x0d\xfd\xf2"
- "\xcf\xc4\xfd\x72\xc7\xd8\xbe\xfb\xe5\x8e\x3c\xf4\xcb\x3f\xcf\x97"
- "\xa3\x3b\x1c\xba\x1c\xad\xe4\x32\xf6\x79\x3c\x1f\xbf\xe3\x6f\x9c"
- "\x07\xf7\x90\x91\x3b\xf8\x48\x79\xd2\xe8\x0e\x43\x8e\x64\x99\x1a"
- "\xc0\x92\xf5\xeb\x79\xaa\x75\x18\xd1\x70\x1b\xac\x1d\x89\xe4\xe4"
- "\x0e\xd9\x4f\x37\x16\x13\xef\xc5\xe7\x6f\x62\x18\xf3\x89\x4e\xd1"
- "\x9d\xa3\x39\x1f\xa7\xdf\x18\x88\x96\x93\x3b\x7b\xf2\xb1\xae\xd3"
- "\xf3\x92\x08\x3a\x88\xf3\xc5\xc2\xbe\x53\x6f\xff\x00\x39\x8e\x70"
- "\x7e\xce\x17\x97\x27\x5f\xc9\xe3\x9d\x35\xb1\xf2\x78\x67\x71\x2c"
- "\x7f\xde\x21\xcb\x69\xd0\x73\x3e\x1a\xdf\x08\x1c\xbe\x31\x7f\x5d"
- "\x58\x36\xef\xec\x88\x93\x4d\xf0\x40\xce\x5a\xc5\x03\x39\xcf\xc4"
- "\xe2\x9a\x63\x4e\xcc\x03\x39\xc3\xfb\xe6\x81\x9c\xec\xbe\x79\x20"
- "\x67\x3a\xf3\x80\x8f\x72\xd6\xc4\xca\x66\x4e\x51\x6c\xdb\x51\xaf"
- "\x94\x4d\x1a\x7c\x31\xb2\x09\x5b\xe8\xd2\xbe\xe4\x90\x65\x8a\xfd"
- "\x47\x6a\xbb\x8c\xbd\x8e\x6f\x44\x33\x0b\xe4\x0a\xf8\xdd\x65\xe7"
- "\x35\x25\xe8\xf8\x6c\xa6\xe1\x66\x79\xf6\xf0\xae\xb1\xd1\x74\x5c"
- "\xa7\xce\xc7\xb9\x90\x77\x0f\xef\x2b\x2b\x7a\xde\xbd\x22\xb6\xfd"
- "\x77\x4d\x4f\x4c\xcf\xbb\x8a\x40\x4f\x57\x62\x7a\xde\xe5\xe9\x9b"
- "\x9e\x77\x6d\xe1\xb3\x47\xe7\xcb\xd4\x5d\x7b\xed\x8b\xa4\x8d\x22"
- "\xcb\x9c\xa2\xbb\x2f\xfb\x66\xe3\xd3\x5d\x81\xd8\xf1\xe9\xae\xa3"
- "\x17\x3f\x3e\xdd\x9d\x9d\x78\x7c\xba\x3b\x2f\xf1\xf8\x74\xb7\x43"
- "\xc9\xc3\xdd\x75\xb1\xf2\x70\x77\x79\x2c\x4f\x80\x76\xff\x6b\xe3"
- "\xd3\xdd\xfe\x38\x19\xa8\x3c\x4e\x13\x9e\x83\x4d\x51\xae\xfa\x6d"
- "\xe2\xad\xb1\x38\x4e\x48\x4b\xdc\x6f\x13\x46\xa2\xdf\x2a\x13\xf7"
- "\xdb\x84\x9c\xbe\xfb\x6d\x02\xef\x41\x57\x9e\xdf\x6f\x13\x4a\x2e"
- "\xde\xa6\x98\xb0\x35\xb6\xcf\x26\x54\x5d\x7c\x9f\x4d\xe8\x48\xdc"
- "\x67\x13\xcd\x89\xfb\x6c\xe2\x70\xd5\x67\x13\xa7\xc7\xf6\xd9\xc4"
- "\xb1\xb1\x7d\x06\xba\xfd\x0f\xfb\x0c\xfd\x33\x52\xf9\x27\x4c\xdc"
- "\x89\x79\xfb\x80\xa0\x7b\xe2\x36\x1f\x4d\x2a\x51\x73\xeb\x49\x6a"
- "\xec\x50\x7d\xf8\x1e\xf2\xd4\x9d\x3f\x0e\x4c\x3c\xa8\xa7\xfd\xe4"
- "\xfc\x7e\x98\xd8\x06\x1d\xdd\xd1\x58\x2a\xf7\xb6\x54\x1f\x32\xcd"
- "\x91\xaf\x61\x29\xef\x4f\x4d\xe2\xcd\xa2\x24\xf4\xb1\xf0\x86\xc2"
- "\xc4\x7a\x1d\xf9\x03\x0c\x87\xcf\x5c\xc6\xc2\x9a\x94\x75\x31\x63"
- "\xfc\x05\x7c\x6a\x46\x36\x94\xdd\x0c\x78\xf7\x4c\x52\xbc\x3a\x29"
- "\xde\xfe\xad\xc5\xbb\xcb\x15\x9f\xfe\xf0\xf3\x38\x1c\x76\x24\xe6"
- "\xd3\x49\x4d\x68\x43\x6d\x62\x3e\x9d\xd4\xde\x37\x9f\xde\x83\xfe"
- "\xa7\xda\xa8\xb9\xcf\x90\xc7\xc3\xbe\xb8\xb9\xcf\x3d\x99\xd6\x80"
- "\xe2\x1d\x69\x13\x55\x1c\x18\x19\x74\xdf\x13\x6f\xff\xa1\x6f\xee"
- "\x69\xd6\x71\xfe\x7d\x5c\xf9\x3e\xec\xbf\x7b\xd8\xfe\x7b\x2f\x31"
- "\xce\xf7\x5c\xc0\xfe\xbb\x87\xed\xbf\xf7\xce\x97\xad\x7b\x74\xfb"
- "\x2f\xd1\x1c\xef\x9e\x8e\xc4\xfd\xff\xc3\xb8\xfe\xa7\xfc\x12\xcc"
- "\x87\x65\xf9\xd8\x7c\xa3\xa2\xf3\xb1\x6f\x12\xe7\x65\x1e\x49\x90"
- "\x37\x3f\x1e\x66\x1f\xf9\xca\xcf\xe3\x3d\xf6\xa5\x4a\xc8\x7b\x3f"
- "\xdc\xa6\xe4\x71\xb2\x39\x56\x1e\x7f\xd8\x18\x2b\x8f\xf7\x38\xe2"
- "\xca\xb5\xc5\xbe\x07\xff\xfc\xaf\xe9\xd8\xc9\xd3\xe3\x78\xe0\xa3"
- "\xe3\x34\xf9\xb0\xe2\x81\x7b\xaf\x8f\xc5\x63\x72\x51\x62\x1e\x98"
- "\xbc\x0a\xed\xff\x28\x31\x0f\x4c\xae\xeb\x9b\x07\x26\xef\x05\x2d"
- "\x3f\x8a\xe6\xdb\x07\x4a\x73\x06\xc4\xe5\xf1\x25\xd6\x79\x93\x43"
- "\x89\xd7\x08\xee\x4d\x57\x34\xbe\x77\x72\x2c\x8d\xef\xcd\x8c\xa5"
- "\x21\xda\xf2\x3f\xa7\x61\x4f\xec\x83\xa0\xfb\xde\x78\xf9\xf7\x1e"
- "\xa7\x1f\xe9\xf2\x7f\xdf\xe0\x38\x1c\x77\x28\x5c\x12\xad\x8b\xdc"
- "\xcb\xf3\x5f\x6f\x62\x5a\xde\xdb\x91\xb8\xcd\x3f\x32\x63\x0c\xf2"
- "\x6a\xe7\xc9\xd2\x8f\x86\x23\xfd\x01\x5e\x0f\xe5\xf5\x90\xcd\x48"
- "\x7f\x20\x4c\x16\x39\x5e\xf5\x8c\x4b\x3f\xca\x61\x5f\x14\xa6\x3f"
- "\xf3\xaf\x75\x38\xe5\xf1\x18\xc4\x78\x15\x94\x4a\xbf\x05\xeb\x2a"
- "\xe6\xf5\xab\x99\xd7\x7f\x24\xed\x3f\xde\x67\x61\x3f\x42\xab\x93"
- "\xf2\xbc\x81\x30\x19\xfc\xce\xf9\xe3\x60\xd7\xb0\x5c\x70\x7e\x23"
- "\xaf\x5a\x37\x2b\x8f\xd3\x4d\x3f\x6a\x4c\xdc\xc7\x3f\x3a\xda\x37"
- "\xef\xfc\x28\xa4\xfa\xf9\xbe\x51\xb1\xfd\x7c\x5f\xba\xe6\x1e\x34"
- "\x9d\xdb\x0a\x1e\xb8\x28\x39\x29\xb1\x0b\x7f\x9f\xfa\x7e\xe5\xa3"
- "\xec\x1b\xfc\xed\x13\x74\xdf\x7a\x59\x9f\x49\x84\xac\x2b\x92\xa8"
- "\x51\xea\x80\xfb\xbe\x90\x78\x22\x4f\x41\x98\x4c\x62\xe5\xd3\xad"
- "\xfc\xae\xd6\x2d\x42\xc8\x77\x88\xf7\x04\xf8\xcc\x32\x78\xe1\xd2"
- "\x63\x74\xdf\x3b\x31\xe5\xa1\x09\xbc\x0a\x46\x7b\xad\x94\xc7\xfb"
- "\xda\x8c\x35\xdd\x55\x78\x4e\xbc\xee\x9b\x6b\x31\x7c\x1f\x94\xcf"
- "\xd8\x7d\x7d\xee\x5f\x32\x4e\x7c\x56\x86\x71\xba\xb0\x1e\xc8\x9d"
- "\x61\xf0\xaf\xf2\xb5\xcc\x2d\xea\xf5\xe5\xcb\x75\xfa\x28\xd7\x7e"
- "\x81\xb5\xc1\x28\x39\xc8\xdd\x12\x0d\x47\xc5\xff\xc8\xad\x37\xfc"
- "\xf1\x70\xdf\xf8\x35\xb0\x0c\x7c\x3a\xe2\xf0\x81\x1d\x71\xf7\x11"
- "\x05\x63\x8a\xe5\x42\x30\xb8\xcf\x15\xcf\x32\x3f\x4c\xb1\x5f\x68"
- "\xcd\x2f\xd9\x46\x79\xaf\x9c\xc7\x5b\x53\xa4\xbd\xc4\x30\x2e\x8c"
- "\xe3\x94\xaa\x98\xb9\x85\xdc\xbb\xe7\xbd\xad\xa9\x8f\x29\xb9\x9f"
- "\x1a\xb7\x46\x38\x65\x9b\xf4\xa7\xd2\xe5\xfe\xf1\x70\xbc\x1c\x4c"
- "\x69\x32\xc6\xe8\xb8\xf4\x36\x43\xee\x31\xaf\x65\xb8\x71\xeb\xac"
- "\x53\xcd\x4a\x16\xa6\xce\xd0\x52\xa2\xe7\x6b\x53\xa5\xfd\x67\xac"
- "\x97\xe2\xbd\x39\xae\x5c\xdc\xfa\xdf\x94\x6d\xa2\xef\x75\xfa\x34"
- "\xf4\x6f\x80\xf7\xb6\x54\x0c\x84\xa9\x6b\xe2\xd6\x2b\xfc\xeb\xe4"
- "\xf9\xf6\xbf\x03\xee\x34\x5d\xef\xe5\xc5\xd9\x78\x53\xb7\xb9\x4e"
- "\x5e\xa8\xfd\x53\xfb\x68\xff\xd4\xde\xf6\xcf\x63\xb8\xd3\xe2\xd6"
- "\x12\xa7\xc9\xf6\x47\xce\xd3\x7f\xd3\x86\x43\x7f\x19\x74\x83\xcd"
- "\x3d\x6d\xa1\x61\xab\xf3\xfa\x41\xdf\xb6\xfa\xb4\xde\xf5\x3f\x55"
- "\xae\x77\xfd\xcf\x9f\xc8\x56\xf7\x91\xdc\x5b\x8d\xad\xbb\xda\x5a"
- "\x93\xa8\x2d\xd3\xfa\x58\xff\x9b\xa6\xaf\xff\xe5\xd9\x63\xf5\xd9"
- "\x34\x5f\x6c\x1f\x4e\x8b\xeb\xc3\x3c\x8a\xed\xc3\xa9\xdb\xfe\xbb"
- "\xe3\x1a\x03\x4a\x4e\x4e\x36\x25\x27\x99\x92\x92\xf1\x1a\x4d\xa4"
- "\x01\xc9\xe6\xe4\x7e\xf8\xf5\xd7\xaf\x03\x4c\xc9\x26\x33\x7e\xfd"
- "\xf4\x6b\xff\xb8\xe7\x01\x5c\x16\x3f\xb3\x7e\xed\x17\xf7\xdc\xff"
- "\x6b\xde\x0f\xd0\xeb\x35\xea\x37\xc7\x3d\xf7\xfb\x9a\xf7\xfd\xff"
- "\x87\xe5\xe9\xbc\xe7\x58\x3f\xb4\x7b\xe7\x2d\x9a\x55\x34\xb7\x50"
- "\xee\x17\xcf\xb6\xcf\x7a\xf2\xc9\xd9\x0b\x16\xd8\x4b\x9e\xb5\xdf"
- "\x7d\xd7\xfd\x37\xdf\x6e\x57\xdb\xce\x45\xe3\xaf\x2d\x4c\xa5\x29"
- "\x8b\xe7\xf3\x8b\x29\x0f\xdc\x9b\x6f\xcf\xbb\xfb\xae\xd8\x97\x06"
- "\x18\xb9\xbd\x7c\x21\x28\x51\xf2\x97\x53\x31\x94\x68\xcd\x6b\x52"
- "\xf7\xb4\xb1\x9f\xaf\x5a\xf3\x78\x68\x45\x13\xfb\x8f\x76\xb9\x44"
- "\xc3\xd5\xbc\xa7\x7f\xff\xb5\xdc\x88\xd1\x75\xe5\x54\xfc\x04\x9f"
- "\x5f\xb9\xff\x2e\xf1\xa1\x9f\xec\x3f\x22\xd3\x31\x7a\xf4\xa5\x46"
- "\x58\x45\xfc\xec\xf5\x85\xc9\xee\x22\x0b\xca\xdf\x84\x77\x49\xe2"
- "\x0e\x0d\x69\x01\xdd\x17\xfa\xc1\xbb\x64\xda\x87\xe5\x46\x3e\xeb"
- "\x71\xba\xff\x73\xf1\xa1\x90\xcf\x7c\x3e\x48\xe5\xbb\x7f\x8f\x30"
- "\xfd\xd8\xc9\xba\xa1\x66\x08\x99\x79\x2f\xf4\x8d\x21\x64\x79\x63"
- "\x28\xc7\x02\xb9\x7f\x9b\xb1\x17\x5a\x81\x67\x1f\x3d\x5a\xc5\x75"
- "\x73\x5e\xcd\xf4\xe3\xb7\x38\xff\xe6\xd8\xfc\x47\x7b\xf7\x62\xef"
- "\xdf\x66\x42\xbe\x69\x9f\x91\xd5\x1a\x11\x5f\x86\x52\x3f\xa4\x1b"
- "\x27\x53\x92\x17\x5d\xd1\x14\x2e\x27\xe5\xf3\xf3\xc0\xb5\x4b\x22"
- "\x22\xcc\xfe\xe9\x53\x3a\x5c\xa2\xf2\x19\x32\x43\xa6\x93\x1a\xe6"
- "\xb3\x8f\xc2\x03\x69\xb5\xb3\xc9\x8c\xf6\x0f\x3f\x41\xd3\xc7\xd9"
- "\xa7\x12\xb9\xa6\x90\xf9\x8f\x4e\xf6\x37\x3c\xb0\x79\xdd\x9f\xc9"
- "\xfc\xab\xae\x72\x53\x97\xb0\x51\x69\x89\x68\x17\x1c\x1f\x28\x20"
- "\x42\xec\xe3\xdf\x34\x33\xc2\x79\xd6\x05\x5d\x36\x6a\x29\x09\xd0"
- "\xf2\xa3\x22\xe4\xf9\xb3\x3a\x1b\xd0\xdc\x11\x60\xff\x45\xcb\xf2"
- "\x29\x94\x7c\x3c\x9f\x4c\xcd\x8e\x6a\xf2\xce\x08\x50\xe9\x51\xd1"
- "\xde\x34\xf3\x73\x6a\x71\x6c\xa7\x82\x56\x32\x35\xb5\xfd\x83\x64"
- "\x8c\x9b\xd5\x91\xbc\xb2\xb3\x64\x5b\x3e\x97\xd3\xce\xd2\xd2\xe5"
- "\x34\x70\xe9\x5f\xc8\xea\x6d\x6f\x45\x3d\x27\xe9\x91\x23\x94\x04"
- "\x78\xa6\x65\xff\x20\xdb\xb2\x87\xd9\xcf\x37\x87\x6a\xca\xc8\x26"
- "\x5c\x99\x69\x5d\xae\xcc\xf4\x2e\x91\x39\x24\xe8\xca\xcc\x68\x29"
- "\x46\xfe\xb6\x7d\x34\xa8\x95\x32\x3e\x3c\xd1\x6a\xaa\x3e\x43\xc3"
- "\xb9\x4d\xc7\xd1\xb6\x9a\x33\xc8\xbf\xfa\x53\xd2\x50\x36\xba\x4c"
- "\x38\xe5\x53\x9b\x37\x3f\x44\x1a\x60\x55\x77\xd1\xf0\x9a\x2e\xb2"
- "\x69\x15\x9f\x12\x97\xeb\xa0\x07\x6f\xf3\x36\x11\x95\x2e\x17\x91"
- "\xee\xd5\x07\x78\xbd\x6c\xc0\x7b\x4f\xd4\x9b\xbd\x4d\x1d\xd4\x1c"
- "\xe8\xa2\x16\xfa\x3b\x79\x9d\xff\x6a\xf8\xd5\x13\xf5\xfd\x34\x08"
- "\x41\xc3\xd2\x36\xd4\xa5\x78\xc7\xd5\xcc\x67\x95\xcb\xa9\xb2\x8c"
- "\xd2\x8a\x97\xd2\x80\x13\x48\x57\x73\xfb\x3d\x16\x6f\xf8\x5f\x0d"
- "\x4b\xa5\x3f\xee\xa3\x55\x65\xcd\x94\xdc\x12\xa8\x66\xbf\x4f\x53"
- "\x24\x35\x02\xdb\xef\x10\x79\x8b\xff\xd9\xa0\x59\x22\xd9\x6b\x34"
- "\xb2\xbc\x73\xee\x90\xc9\x6b\x3e\x47\xde\xfc\x00\x7d\x84\xba\xc5"
- "\xea\xc8\x0c\xe8\xad\x9c\x96\x40\x88\xcf\x3b\x65\x89\x4e\x5b\x6a"
- "\xe5\x7c\x1a\xb5\xf9\x0c\x8d\xdc\x74\x86\x32\x45\x30\xd3\xc4\x3e"
- "\xb6\x7c\x36\x75\x13\xae\x69\x6d\x64\x41\xdb\x95\x1f\x6d\x8a\xee"
- "\x6b\xdb\x9d\x49\xb5\x5d\xbd\xbe\xb6\x5d\x9d\xbd\xbe\xb6\xe0\xa9"
- "\xed\xec\x6f\xeb\xa3\xe9\x13\xad\x4d\x34\x00\x72\xe2\x60\xfe\xae"
- "\x3c\x45\xe6\x95\xa7\x88\x6e\x2c\x37\x91\x7d\x0e\x9f\xb3\x78\xe8"
- "\x5a\x2f\xfa\x86\xef\x8f\xd1\x83\x47\x71\x4d\xc3\x2f\x09\x32\x71"
- "\x98\xdb\xd9\xa6\xf3\x31\xd2\x4c\x48\xfb\x3d\xae\xc9\xb8\xee\x73"
- "\xd5\x08\x3f\xea\xca\xef\x34\x51\x2a\xf3\xb3\xee\xdf\x9b\x1f\x74"
- "\x3f\xb8\xc3\x47\x4f\x8f\x34\xf8\x5a\xe9\xf8\xfb\xb7\x7f\x74\xec"
- "\x24\xc7\xa1\xf2\x4b\xbc\xba\x1d\x49\x1c\x93\x4a\x4f\x67\x1c\xae"
- "\xe4\x7a\x8f\xd1\x43\x5c\x8f\x15\x3f\xc8\xe9\x83\xeb\x8d\xb2\x9d"
- "\xdd\x0e\xd4\xf9\xd0\x65\x48\x17\x46\x3a\xda\x6d\xe6\x77\xef\x1f"
- "\x3b\x69\x52\x79\x32\x4d\x80\x19\xd2\xe1\x43\xf6\xef\x9f\xce\x32"
- "\xde\x69\xb2\x8a\xfd\x33\xc7\x52\xcd\x6b\xa2\x69\xd3\x6b\xa2\x51"
- "\xc9\xde\x43\xf9\x3e\x2a\x72\x30\x8e\x18\xc7\x1b\xd7\xe0\xdd\x7e"
- "\x8c\x42\x4c\x97\xc6\x42\xf6\x27\x7b\x08\xf6\xdf\x25\x31\x6d\x10"
- "\xee\xbc\x7c\x1e\x4b\xdf\x2d\x3b\xd8\x0f\x3a\x20\xbf\xa5\xad\x83"
- "\x7e\xd5\xd5\xde\xcf\xf5\x07\x32\x79\xc3\xc7\x68\x4c\x06\xd9\xd8"
- "\x1e\xac\x7d\x4d\xf8\x70\x6d\x67\xff\x4e\xf0\xcb\x95\x27\xe8\xa1"
- "\xdf\x7f\x37\x83\x32\xfe\xe4\x24\x5d\x3f\x3d\xf4\x8f\x28\xfd\x34"
- "\xbb\xd9\x57\x1f\xa5\x9b\x1e\xbd\xec\x7c\xdd\xf4\xc8\x60\xa5\x9b"
- "\x20\xfb\x52\x17\x45\x7c\x2a\xfd\xe1\x48\x5c\xba\xee\x27\xf2\xf0"
- "\x67\x71\xe9\x21\x3d\xbd\x39\x2e\xdd\xaf\xa7\x0f\x34\x74\x5f\x0b"
- "\xe3\xb1\x98\x75\x5f\xfe\x97\xac\xfb\x5a\x66\xea\xba\x4f\xea\x9f"
- "\xfc\xbf\x88\xb7\xa0\x8b\x16\xb1\xbe\xc9\x7f\x87\xf1\x17\x1f\x92"
- "\x81\x7b\x0a\xd2\x9e\xe1\xb4\xaa\xbf\x93\x19\x3f\x43\xef\x7d\xc4"
- "\x7a\x8f\x75\x1e\xeb\xbe\x8d\x43\x45\xeb\xc6\xd7\xc4\x91\x1a\x19"
- "\x5b\xe7\x27\x3d\xfa\xef\x45\xa4\xad\x41\xda\x8b\x78\xcf\x7a\x90"
- "\x69\xd2\x9c\x5f\xcf\x31\x31\xda\x60\x6b\xd5\x68\xa6\x2c\x5a\x87"
- "\xfe\xe6\xf3\x86\xab\x40\x5f\x6b\x12\x15\x7b\x4b\xf8\x0c\x6b\x84"
- "\x7d\xd2\xda\x5a\x4a\xda\x58\xee\x86\xae\x84\x9c\x79\x9d\x9f\x53"
- "\x59\x40\x9c\xe0\x73\x77\x8c\x43\xc1\x92\x1f\x71\x3c\xa2\xa4\x46"
- "\x07\x11\xfb\x85\xb3\xce\x06\x2e\xe6\x2a\xe0\xa4\x62\xa8\xe4\x17"
- "\xfa\xa8\x6e\x9b\xea\xeb\x47\xab\x38\xde\xd9\x31\xfa\xc9\x56\xcc"
- "\xf7\x42\xdc\x36\x6b\xa4\x9c\xf8\x1c\x0c\x64\x8c\xcf\x2f\x3a\x36"
- "\x9a\x34\x47\x95\x71\x16\x86\x63\xdf\x21\x8f\xb7\x35\x44\x8c\xb3"
- "\x8f\x7e\x12\x68\x2e\xad\xe7\xf2\xd5\x4c\x1b\xe1\x76\x19\x30\x92"
- "\x24\x0c\x93\x9c\x37\x3a\x7c\x94\xaf\xd6\xce\x53\x0f\x50\xf3\x0c"
- "\x3f\xb1\xde\xf7\xb6\x03\x46\xe9\x31\x05\x03\xb0\x04\xc6\x80\x98"
- "\x77\x3a\xfc\x81\xcb\xc5\x97\x80\x5f\xc8\xfd\xc5\xe7\x22\x79\xbf"
- "\x0d\x74\x49\x63\x5f\x79\x65\x8b\xfe\xe4\x64\xed\xdf\x89\xf4\xb3"
- "\x9d\xe0\xb7\x9f\x74\xf0\xb9\x25\x3e\xcf\x79\xa1\xb3\x9c\xa0\xd1"
- "\x48\xe3\x3c\xa7\xb6\xf8\x7f\xf7\x2c\x27\x60\xdb\x36\x9b\xc4\x76"
- "\xe0\xdf\xc1\xe7\x39\x81\x7f\x2e\xf3\xa1\xde\x26\xff\xab\x8f\x48"
- "\x9a\x8f\xe5\x34\xcc\x1d\x0f\x1a\xfd\xcf\xed\xe5\xb6\xe0\x9d\x4d"
- "\xd9\x88\xe2\x90\x8f\x1e\xf6\xf3\x7b\xa4\x99\x39\xff\x18\xe8\x31"
- "\x2f\xc6\xb0\xf7\x8e\x45\x4c\x95\x4b\xc9\xac\x74\xda\xa3\x29\x5c"
- "\x5e\xe9\xb4\x47\x1a\x7a\x75\xda\x23\x3b\x95\x4e\x53\x34\x56\x3a"
- "\xed\x91\x5f\x2a\x9d\xf6\xc8\x9b\x72\x5f\x0c\x3a\x8d\xdf\xb1\x5e"
- "\x33\x74\xda\xa6\xa1\xe2\x20\xeb\x8e\xa0\xfb\x91\x2a\x43\xb7\xad"
- "\x45\x1a\xeb\x0e\xc6\x51\xe9\xa9\xfc\x76\xf1\xff\x66\x92\xf2\x3b"
- "\xe0\x7b\x07\x9f\x5f\x68\xd7\xef\x79\x3c\x49\x52\x3a\xee\x91\xb6"
- "\x5e\x1d\xf7\x88\xa3\xb7\x2c\xeb\xb8\x47\xbe\x52\x3a\x4e\xa5\xd7"
- "\x3e\xc2\x3a\x2e\xbf\x9d\x69\xa0\xc3\x37\xf1\x1a\x9e\x9e\x1f\x74"
- "\x7c\xc8\x1f\xad\xe3\x62\xe5\xeb\xd1\x71\x86\x8e\x63\xdd\x86\xe7"
- "\x5c\x1f\xa5\xca\x79\x36\xcb\xd9\x7a\xd0\xdc\x90\x3b\xee\x03\x6e"
- "\x33\xc7\x35\x63\xba\x4d\x38\x49\x03\xf4\xb3\x43\x7a\xbb\x1f\xf5"
- "\x18\xbe\x8f\x3e\x7a\xa4\x2a\x91\x1d\xdd\x1b\x7b\x90\xae\xe2\xb3"
- "\xf3\xde\xf2\x63\xe4\xad\x16\xe5\x2d\xe1\xa3\x54\x50\x02\x5d\x91"
- "\xfc\xf4\x67\xdc\xb7\x98\x77\xfc\x80\xaf\xac\x7b\x30\x96\x36\x17"
- "\x04\xa8\x3f\xe6\xea\x9f\x55\x9a\xf0\xce\x19\xf3\x4e\xae\x31\xdc"
- "\x38\x9f\xe3\xd6\x3d\xba\xbd\xaf\xf9\xfe\xc5\xd5\x37\x63\x7c\xdf"
- "\xf5\xcd\x78\x58\xd6\x07\x9b\x0a\x73\xa0\xc1\xa7\x68\x86\x9c\x97"
- "\xc8\xf8\x36\x2b\x13\xc2\xaa\xd0\xdf\xf7\xeb\xe3\xfd\x2f\xbf\xa6"
- "\xfc\x1f\xbe\xa6\xfc\x17\xac\x8b\xd0\x3e\x6b\xc4\x1d\x0b\x67\x50"
- "\xd8\xc8\x77\x02\xf9\x1e\x1b\xac\xaf\xc5\x7c\xe6\x1a\x21\xe7\x68"
- "\x36\x03\x26\xf3\xdf\x3a\xe4\x93\x31\x43\xa0\x2b\x27\x2e\x21\x8e"
- "\xd7\x12\x5d\x76\x4a\x2f\x8d\x1f\xa3\x0b\xac\xfb\xa5\x79\xab\x49"
- "\xc6\xd0\xdc\x0f\x9b\x14\x63\x1c\xc7\xed\xd3\xd7\x3f\x1e\xdb\x02"
- "\xbd\x59\x17\xe5\x17\xdb\x01\x3d\x77\x15\xc7\x35\x60\xfb\xb2\x52"
- "\xcd\x37\xbf\x05\xfd\x3c\x84\xcf\xc3\xf0\xd9\x98\x82\x48\x9e\x69"
- "\xbf\x8c\x2f\xf6\x98\xcf\x28\xdb\xd7\x3a\x0b\xd7\xab\xd7\xc9\x3e"
- "\xa6\x81\xa0\xfb\xf1\x0c\xa3\x0c\xc3\x66\x3f\x45\x8c\xcb\x57\xc9"
- "\x33\xa5\xe1\x0e\xd6\x85\xdf\x82\x2d\x3a\x44\xd5\x33\x93\x54\x3d"
- "\x8f\x4f\xf6\xd1\x8c\xf4\x0b\x9d\xcd\xe8\xbb\x7d\x8f\xaf\xba\xf8"
- "\xf6\x91\xde\xbe\xc7\x1b\xbe\xa6\x7d\x17\xaa\x37\x7c\xf1\xf5\xa6"
- "\xeb\xf5\x16\x64\x5f\x3c\x5d\x0b\x8a\xbe\x39\x5d\xb3\x74\xba\x16"
- "\xd4\x7d\x0d\x5d\x13\xd5\x73\xe4\x9b\xd7\x63\xd7\xeb\x99\x69\x49"
- "\x54\x0f\xc9\xbf\x3e\xcf\x4d\x59\x8c\x18\x96\x1c\xcf\x55\xc5\x97"
- "\x9b\x99\x17\x1d\xab\x57\xc5\x79\x9d\x59\x68\xc4\xea\xd5\x63\xc9"
- "\x42\x57\xcf\x5c\x51\x50\xc7\xe3\xbb\xd0\x7c\x34\x73\x15\xc7\x47"
- "\x9d\xb8\x5c\x9d\xc9\xd6\xcb\x54\x5f\x28\x46\x30\xc7\xb4\x12\x22"
- "\x9f\xf6\x57\xcb\xfd\x76\xe8\xf5\x99\x87\xd9\xff\x5e\xed\x17\xce"
- "\x3c\xaa\xe4\x7e\x26\xe6\x88\x33\x33\xfb\x86\x71\xd8\xbf\xa5\x2c"
- "\xab\x5f\x5f\x3e\xf5\x41\xf7\xac\xe1\x3e\x9a\x97\x26\xfd\xe8\x53"
- "\xbd\x7e\xcc\x1f\xf4\xb8\x7a\x4f\xbe\x11\x15\x43\x10\x63\xe1\x13"
- "\x1f\xeb\xbe\xff\xa0\x41\x39\x68\x39\x6b\xba\x41\x03\x23\x1d\x69"
- "\x0e\x83\x06\xb0\x69\xd2\xbc\x75\x61\x3e\x9b\x13\x50\xe7\xb0\x67"
- "\xad\x15\x15\x87\x7d\x0a\xf6\xac\x56\x65\xb7\xa0\xbe\xee\x7c\xb3"
- "\x9c\x2b\x95\xf1\x5c\xe9\x89\x62\x7f\xca\x61\x9f\x81\x87\x58\x60"
- "\x33\xf1\x79\xef\x31\x61\x15\xa7\x8b\x6d\x02\x3e\x1b\x27\xdf\x2f"
- "\xc8\x34\x61\x6e\x09\x9a\xcc\xfa\x52\x74\x72\xbc\x18\x09\x3b\x0d"
- "\x78\x57\x33\x5c\x1f\xae\xfe\x65\x99\x1c\xeb\x42\x6f\xcf\xac\xbf"
- "\x69\xab\xbd\x7e\x2d\x68\x33\x19\xf8\x6e\x96\xe7\x58\x9f\x40\xfb"
- "\x0b\xa4\xdd\xa6\xf0\xb1\x99\xd8\x87\x5f\x4b\x3d\xec\x17\xcb\x6c"
- "\xb4\x63\x7e\xbb\x9c\x07\x71\x9d\x63\x38\x1e\x1c\xcf\x8d\x60\x8f"
- "\xa0\xdc\xf4\x1e\xba\x01\xae\x08\x1a\x74\x7b\x82\xd4\x58\xac\xda"
- "\x18\x58\x66\x33\xed\xf7\xcb\x33\x76\x34\xd2\xee\xfa\x4a\xc5\x7a"
- "\x7e\xa2\xca\xa0\x5d\x0f\x4e\xc0\x87\xf3\x28\x9f\xa6\x27\xb6\x1b"
- "\x38\x49\x79\x4d\xe5\x33\xbb\xb3\xb6\xf0\x59\x21\x45\xff\xfd\x69"
- "\xc8\x73\xe4\x7c\xfa\x3f\xd1\x1e\x45\xff\x64\xe6\x37\xa6\x3f\xaf"
- "\x6f\x80\x2e\x83\x41\x4b\x8b\x3a\xe3\xc0\x36\xcc\x93\x7c\x96\x3e"
- "\x8d\xf1\xd4\x2a\x0c\x9a\xe7\x9b\xd5\xda\xd8\x93\xb9\x51\xfd\x80"
- "\xf6\xda\xd8\x3e\x4b\x32\xda\xcf\x65\x98\x06\x1c\xdf\x91\xeb\x06"
- "\x3e\x97\x04\xdd\x4f\x16\xc6\xb7\x69\xa5\x3a\x3f\x42\xca\x9f\xe4"
- "\xc9\x55\x3d\xf2\x31\x54\xf8\x4b\xec\x22\xa4\xce\x22\x3f\x39\x6a"
- "\x47\x99\xdf\xdc\x97\xdc\x33\x0f\xca\x58\x91\x26\xb9\x96\x00\x3b"
- "\x6b\xf6\x12\x01\xdc\x54\xdf\xcf\xfe\xb1\x4a\x2b\xdc\x84\x2b\x78"
- "\xec\xc9\xb3\x02\x75\xfb\x5d\x32\xae\x0a\xda\x36\x7b\x3d\xf3\x9c"
- "\xc1\x67\xbc\xf6\xa8\xfc\xc4\x0b\x1f\x66\x3d\x62\xd0\x1c\xf8\xa7"
- "\x06\xdd\x85\x23\x0d\xfc\x8d\xfc\xdc\x77\x9c\x87\xf7\x69\x1a\xed"
- "\x21\xa9\x5f\xd5\x39\xa1\xc2\x3c\x43\x6e\xb9\x0e\xee\x67\xd6\x2f"
- "\x4c\x0f\x45\x8b\xc2\xe2\x58\x58\x36\x93\x8a\x4f\xc9\x3c\x0f\x79"
- "\x5c\x1a\xea\x87\x3c\xeb\x7b\x61\x14\xa6\xab\x77\x3d\x78\xb2\x6f"
- "\xbf\xf4\xbf\x53\xfd\x51\x18\xe1\x76\xf5\xe2\xcb\xf2\x57\xd8\xd3"
- "\xff\xfc\x2e\xe0\xb2\x71\x3c\x5b\xa9\x57\x4a\x46\x30\xbe\x7e\x8e"
- "\x13\x2b\x79\x1d\xf0\x27\x32\xee\x9c\xc7\xe8\xb3\x5e\x5e\x9c\x3d"
- "\x3c\x1a\x8e\x70\xd9\x4c\x86\x7e\x52\xba\xc3\x8f\x79\x2a\xd9\xd5"
- "\x1e\xcb\xec\xc9\x51\x38\x37\x18\xf8\xf4\xea\x84\xd9\x8e\x78\x9e"
- "\xe4\xba\x39\xfe\x9e\x0e\x9b\x75\x49\xfa\x31\x9a\x3d\x5d\xe1\xf5"
- "\x64\x13\xf7\x63\x5f\x63\x9a\x11\xe7\xf3\x15\xa5\x43\xd0\xcf\x73"
- "\xfe\xf2\x8a\x3a\x3b\x14\x50\xb1\x1c\x67\xff\x4d\x98\xde\x64\x5a"
- "\xf1\x1a\xba\x5f\xc6\xe8\x90\xe7\xca\x67\xcb\x33\xe6\x83\x8a\xdf"
- "\x94\xf1\x63\x75\x7f\x40\x7f\x63\x71\x58\xc6\xef\x73\x95\xf0\x39"
- "\xdb\x30\xcf\xef\xa4\xbf\xdb\xfe\x92\x30\x3d\x10\x62\x99\x98\x93"
- "\xc9\xe7\xe7\x03\x52\x96\xe6\x8c\x35\xce\xcc\x73\x4c\x4b\x11\xcc"
- "\x27\xe8\xa1\x64\xb6\x8b\xec\x2e\x8e\x77\xf0\x53\x3e\x3f\x44\x7a"
- "\xff\xd2\x3a\x93\x38\xa4\xe4\x7f\xce\x72\x19\x47\x50\xee\x5d\x1d"
- "\x83\x4e\x48\xfe\xd7\x31\x9a\xf3\xaa\x5a\xeb\x31\x74\xd4\x4f\x07"
- "\xf2\xfe\x95\x4f\x87\x81\xba\x30\xfe\xcd\x32\x9f\xaf\x4b\xe6\x2c"
- "\x37\xe6\x2b\x7c\xe6\x4e\xed\x85\xf5\xc2\xf3\xd1\x9c\x52\xbe\xf6"
- "\xf6\xc1\xef\x18\x56\xc7\xf9\x7a\xe1\xa7\x64\xc8\x5e\xf1\xd5\x7c"
- "\x6e\x7b\x76\x23\xd7\xdf\xd7\x78\x21\x5c\x0f\x73\x3f\x59\x8e\xdb"
- "\x13\xf7\x4d\xe2\xbd\xb5\x9f\x16\x1a\x6d\x30\x68\xa2\xda\xf0\xd3"
- "\x7d\x9d\xa9\x07\x32\xa3\xda\xbe\x4f\xd2\xa2\xf7\xfd\xd9\x28\xda"
- "\xf0\x73\x40\x8d\x6b\x3f\xdd\x01\xfe\xd8\xa2\x78\x4d\xa5\x41\x76"
- "\xfe\x8f\x58\x96\x4f\x0a\xc7\xb9\x64\xc8\x3a\xf2\xc2\xfe\xfb\x72"
- "\xb8\xda\xe3\xfa\x29\xda\xff\x53\x3d\x6e\xc2\x4f\x3d\x8c\x4b\xc2"
- "\x76\xc6\xe0\xe8\x28\x62\xfb\x42\xc5\x51\x70\x3c\xc3\xf8\xda\xaf"
- "\xe3\x3e\x76\xdc\x26\x75\x38\xc7\x54\xe8\x76\xf4\x0b\x74\x67\x52"
- "\x67\xb7\x03\x7a\x21\xd3\x14\x74\x3b\xa0\xff\x4f\x87\x54\x9d\x8e"
- "\x99\x06\xae\x8c\x1b\xec\x66\x4b\x50\xcc\x4d\x4c\x5f\xae\x57\xc6"
- "\x79\x72\x0c\xc0\xcf\x82\x5f\xff\x6f\x12\x87\x09\x76\x79\xbb\xbf"
- "\xa2\x69\xbb\xb6\x48\x1c\xe4\x78\x62\x98\x7b\xb4\x57\x82\x77\x07"
- "\xad\x68\x80\x2d\xfe\x98\xa9\x60\x09\xe5\x60\x8e\x4c\xe2\x9c\xc8"
- "\xde\xac\xe1\xba\x48\x8c\xe5\x78\xdd\x78\xce\xd2\x9f\x47\xf1\x73"
- "\xe7\x22\x31\x23\xe8\x9e\x9b\x6e\xec\x09\xaa\x58\x38\x73\xed\x3d"
- "\xf1\x83\x92\x1f\xe5\xf3\x43\x1c\x67\x4a\xc3\xdc\xa7\x9d\xeb\x2d"
- "\xe0\xf9\x2b\xea\x43\x3e\xc8\xff\x4c\xd9\x4e\x7f\xf2\x0d\x43\xf0"
- "\xcb\xec\x63\xef\xb4\x9d\xf1\xea\x4c\x69\xda\x6e\xe0\x3a\x28\x90"
- "\x63\xfa\x86\xb8\x6d\x33\x70\x43\xfa\xc1\x4a\x95\x1e\xe6\x78\x87"
- "\xec\xdb\x88\xf7\x4d\x06\xae\x06\x0e\x5c\x1f\x9f\xd7\x14\xa9\x07"
- "\xb2\x39\xd6\x0c\xd7\xe7\x5f\xc6\xf1\x7d\xe7\x86\x0c\x7c\xbf\x29"
- "\x1f\x97\xd5\x08\xc1\x63\x27\xeb\x5e\xfb\x30\xa2\x96\x00\xeb\x93"
- "\xa7\x72\xf7\xd7\x04\x78\x7d\xfb\x76\xd4\x71\x5b\xa7\x70\x90\xd6"
- "\xed\x48\xd8\xbf\x5c\x06\xf9\x3d\x52\x37\xac\x3e\x70\x9b\x26\x26"
- "\x43\x47\xa0\x5c\xf7\x64\x5e\x5b\x82\xcc\x3e\xb5\xa3\xb1\xb4\x9d"
- "\xcf\x58\x42\xdf\x3c\xb5\x03\x79\xb2\xd9\xc6\xc2\xfc\x8a\x75\x56"
- "\x32\xeb\xa5\x86\x45\x63\x19\xc6\x4e\xb3\x93\xcc\x8d\xce\x6f\xf6"
- "\x1d\x00\xc0\xed\x50\x72\xf3\x54\x87\x61\x97\xe0\x3e\x14\xbb\xdf"
- "\xfd\x94\x2f\x7e\x6e\xf6\xc4\xb3\xcf\x96\x14\xcc\x9f\xcd\x97\xcc"
- "\x6b\x17\x5e\x9f\x1a\x3d\x07\x67\x1d\xac\xe2\x23\x3c\x9d\xce\xeb"
- "\x5d\xaf\x0c\x31\xf6\x6f\x9f\xee\x39\xff\xa5\xfb\x89\xdf\xc9\x73"
- "\x09\xb6\xb9\xf1\xae\xe8\xe3\xd2\xe5\xd2\x06\xfa\xcc\x42\xa6\xf8"
- "\xfa\xe6\xcc\x2a\x99\x55\x74\x3b\xef\xd4\xa4\x26\xaa\xa7\x3c\xae"
- "\x9e\xfa\x9e\x7a\x94\x0e\x0c\x98\x38\xdf\x5a\xab\x5f\xa4\x84\xaa"
- "\xd4\x19\xdd\xa7\x8f\x1a\x6b\x29\x7d\xf8\xd7\x39\x23\xab\x3f\xcd"
- "\xe1\x7e\x71\x2d\x27\xd3\xfb\x4b\x5b\x4d\x6c\xcb\x94\xe1\x9e\xe7"
- "\xb4\x72\x6d\x46\x8f\x53\xf4\xe1\x99\x56\x8c\x31\x45\x59\xa2\xe2"
- "\x80\xd3\x47\x45\x99\x7d\xcd\x63\xa3\x7d\x13\xd8\x97\xad\x8d\x8a"
- "\x26\xf7\xe9\x47\xe0\x39\xa4\xeb\x98\xa2\x4d\x8d\x36\xe2\x7e\x7f"
- "\xe1\x18\x15\xbd\x61\xb6\x61\x1c\x19\x46\xff\x81\xfb\x4d\x5c\x96"
- "\xdf\xc5\xf4\xf3\x95\x27\xeb\xcc\xe0\x42\x70\x63\x92\x50\x7f\x64"
- "\xd6\x6f\x92\xf1\x33\x89\x24\xb9\xcb\x96\x0c\x0a\x0f\xe8\x6f\x26"
- "\xeb\xa0\x34\xcb\x55\xdf\x1e\x6e\xbb\xf3\x8e\x71\xd9\xae\xb2\x52"
- "\x48\x6f\x38\x64\x15\xd1\x71\xb5\x42\xd9\x0f\x5e\x5f\x4e\xd2\xcf"
- "\xa2\x22\x94\x9d\x08\xd7\xb5\x6e\x51\xcc\x67\x9a\xb5\x41\xd6\x99"
- "\xae\x85\x64\x7a\xaf\xcb\x67\xe2\xd8\xf1\x6c\x63\xf1\xb7\x05\x8e"
- "\xd1\x33\xd7\x7f\x84\x34\xb4\xdf\x29\xd6\x58\x67\x2a\xdb\xe4\x99"
- "\xb9\xda\x3a\xeb\xcc\x5e\xf8\x66\x62\xf8\xae\x37\xc8\xb4\xa5\xac"
- "\xdd\xe4\x35\xdf\x41\x5e\x7b\x80\x3e\xc2\x7d\x42\x5a\xa2\x4e\xb6"
- "\x77\x18\x46\xad\x5b\xf3\xb8\xbe\x22\x93\x7e\x2e\xd1\x74\x8a\x9e"
- "\x79\x73\x7b\x1f\xe5\xf8\x1c\x70\x67\x6a\xd3\xa2\xa0\xfb\x19\xf4"
- "\xff\x5d\x66\x7d\xbc\x83\x5e\x7e\x06\xfc\x5f\x24\xf5\x3f\xde\x2f"
- "\xec\x94\xb1\x85\xe7\x91\x91\x27\xf1\x98\xc7\x6b\xb3\xa2\x81\xfb"
- "\x55\x9c\xfb\xa2\x9d\xcf\x3c\xf4\xe1\x1f\x31\xc0\xeb\xbc\x99\xf7"
- "\xa8\xfa\x0d\x0a\x51\x9a\xeb\xac\xe8\x8e\xb8\x29\x03\xec\x6e\x8a"
- "\x60\x4e\x1d\x3e\x27\xf2\x9b\x3b\xce\xc8\x58\x97\xac\x3f\xde\x9d"
- "\xf3\x3b\x93\x37\x74\xba\xc1\xbb\x4a\xa3\x16\xd8\x1e\xde\x9a\xd3"
- "\x0d\x2a\x26\x66\x84\x9a\xe9\xef\xd4\xec\xfc\x6b\xb9\xb7\xfc\xef"
- "\x48\x17\xe5\x4c\xe7\xee\x73\x62\xba\xd7\xfc\xff\x10\x7f\xfb\x84"
- "\x75\x21\xe8\x6e\x3f\x45\xf3\xfe\xf0\x21\xe0\xbc\xf7\x5f\x80\x25"
- "\x63\x69\x8d\xa7\x8f\x70\x8f\x36\x1d\x31\xf4\x64\xc2\x18\x24\x49"
- "\x0d\x6b\xad\xce\xc7\x4c\x1a\x74\x2e\xc7\x3c\x83\xae\x1d\xcb\xed"
- "\xc2\x73\x16\x3f\xe3\x3a\x8a\xaf\xd6\x15\x0d\x9b\xac\xe1\xc7\x58"
- "\x07\xe7\xb3\x7e\x45\xfa\xf4\xda\x73\x52\x27\xe7\xe9\xcf\xb9\xfa"
- "\xf3\x64\xfd\x79\xa2\xfe\x9c\xa3\x3f\x8f\xe3\x67\xa5\xbb\x9f\x75"
- "\xf4\x8c\x2b\xa6\x01\x87\xf0\xec\x34\xfa\x02\xf8\x0c\xb4\x3a\x97"
- "\xcb\x31\x40\xc7\x63\xac\x8e\x57\x96\xfe\x6c\xe0\x73\xa5\x35\xbc"
- "\xfc\x7f\x0b\x9f\x50\x2c\x3e\xc5\x96\x28\x7c\xc8\xea\xcc\xf9\x26"
- "\xf8\xa4\x5b\x39\x3e\xff\xff\x00\x1f\xc6\x85\xd3\x50\xbf\x27\x0e"
- "\x9f\x6a\x03\x9f\x84\xfc\xb6\x48\xb4\xf3\xf8\xb7\xe0\x72\x19\xef"
- "\x77\x00\x8f\x6d\xb5\x5d\x46\xfc\xba\xe2\x23\x17\x8a\x5f\x07\x59"
- "\xb0\x21\x0f\xda\x5f\xbc\x45\x1f\xe7\xf7\x2a\x5b\xf0\xb9\x34\xc3"
- "\xa7\x08\x6d\xdd\x5a\xa9\xda\xba\x6d\x15\xc7\x70\x5b\x42\x57\xb8"
- "\x9c\xa2\x1d\x73\xb3\xff\xc3\xf3\x87\x68\xb8\x45\x25\x0b\x16\x3c"
- "\x73\xbb\xbd\x68\xd6\xbc\xd9\xf6\x6b\x0b\xed\x0b\x1c\x73\xe7\x94"
- "\xcc\x8e\xdd\x67\x4f\xd7\xbf\x97\x22\xcf\x0f\xb0\xbd\x2d\xe7\x5b"
- "\xe0\x7f\xd6\xdb\xca\xe7\xf3\xb9\x66\xe1\x7e\x2e\x9b\x75\xfd\xe6"
- "\x97\xc9\xcc\x67\x8a\x81\x4f\x8d\xa1\xe3\x8d\x39\x12\xeb\x78\xa4"
- "\xc3\xfe\x9b\x37\x36\x2a\x9d\xf3\x1e\x34\xd2\x18\xbe\xae\x9b\x06"
- "\x1c\xa3\xe7\xe6\x72\x9d\x09\x69\x78\x4e\xd4\x61\x7c\xe5\xef\x0d"
- "\x98\xa0\x53\x04\xc7\x63\xe2\x73\x79\x28\x27\x8e\xd3\xfc\xcb\x59"
- "\xf7\xf2\x37\x79\x94\x5d\x2f\x80\xe3\xfc\xd1\x28\xb3\x05\x69\xe6"
- "\x75\xc8\x8b\xb9\x42\x3b\x97\x43\xfa\x24\x8e\x8f\x80\x74\x8b\x1e"
- "\x67\x8a\xd3\x1e\xe6\xf8\x05\x48\x4b\x8f\x4a\x7b\x86\x63\xa5\x23"
- "\xcd\xae\xc3\x5b\xce\x74\xc6\x73\x8e\xbe\x96\xc2\x79\x5e\xd2\xeb"
- "\x2d\x8f\xc6\x99\x3f\x9e\x71\xf3\x8d\x59\xf6\xe9\x0f\x7c\x6f\xfc"
- "\x1d\x4f\x3e\x3b\x6f\x4e\x2a\x49\xb2\x67\x62\xb8\xcc\xba\xd9\x79"
- "\xfd\xed\xf6\xe2\xd9\xb3\xe7\xdb\x17\xcf\x9e\x57\x62\x9f\xb5\x78"
- "\xd6\x92\x54\x9a\xf3\xec\xfc\x27\xf9\xf4\x3d\x77\xcb\x82\x82\x27"
- "\xe7\xfc\x94\x9d\x21\x54\xee\xd4\x98\x71\x7c\x3a\xeb\x36\x3d\x5e"
- "\xc5\xc1\x4a\xb6\x35\x52\x0e\x1d\xc4\x3d\xc7\x71\xb2\xe1\xda\x88"
- "\xdf\x5e\xfc\xea\xf1\xe3\x18\x09\x87\x4e\x90\x73\x06\xae\x3b\x82"
- "\xee\x05\xe3\x0c\x7b\xa2\x97\x87\x16\xe4\x19\x3c\x84\xf1\x7f\x87"
- "\x1a\xdf\x16\x94\xb7\x84\xa5\xfc\xf4\xf0\x54\xe5\xb9\x5e\x9e\xe2"
- "\x38\x94\x2d\xec\xeb\xb3\x08\xef\xc1\xc3\xa0\x3f\xcf\xab\x53\x98"
- "\x6e\xc7\x69\xd1\x42\xcc\xc7\x9b\x38\x86\x0a\xae\x8d\xe0\x97\x26"
- "\x15\xb7\x64\x41\x18\xf9\x46\xa0\x8e\xbd\x7a\x1d\xea\x79\xa8\x38"
- "\xc8\xdf\xce\x38\xa6\x3f\x33\x2c\xc0\x18\xc8\xf7\x7c\xd5\xf7\xd4"
- "\xac\xec\x37\xa9\xe6\x8d\xc6\xbb\x92\xb7\xf5\x3a\x1a\x40\x8b\xf2"
- "\xcd\x6e\xb9\xf6\x27\xe7\x57\xbc\x76\x68\x4d\xba\x53\x00\x9f\xd3"
- "\x5a\xf2\xa3\xad\x32\x2e\x62\x79\x17\x74\xc4\x2d\xb7\x78\x9d\x32"
- "\x7f\x12\xaf\x2d\x4e\x2d\x16\x1a\xc7\xa7\xd6\x92\x9f\x6e\xe5\x72"
- "\xc2\x72\xe8\xa0\xb6\x6e\x60\x8e\xb2\x05\x38\x1e\x5d\x49\xb9\x0e"
- "\x33\xc4\xb4\x3d\x41\x0b\x6e\x52\x73\x35\xe7\x0c\x65\x9f\x95\xac"
- "\x31\x7c\xf0\x20\xa3\x99\x78\xae\x31\x74\x80\x8f\x4a\x1c\xba\xbf"
- "\x54\x83\x6a\x7f\xc9\x11\xfd\xb9\x5e\xc7\x31\x89\x63\x64\x00\xff"
- "\x43\xdc\x77\x98\xf7\xd6\xe3\xfe\x08\xe8\xd3\xa4\xe8\x53\x22\x6d"
- "\x40\xd8\x35\xfc\xfe\x08\x7f\x67\x04\xef\x8e\xa8\xf8\x13\x25\x69"
- "\xdc\xe6\x5e\x9f\xca\x9a\x1c\xe0\x3a\x90\xf7\x1e\x21\x4b\xf5\xde"
- "\x73\x2c\x9f\x25\x1c\xcb\x72\xbb\xa1\x77\x58\xcf\x14\x44\x20\xa7"
- "\xd2\xee\x5e\x38\xd1\xd0\x37\xbd\x7c\xb0\x30\x3f\x91\x2e\x49\xd4"
- "\xef\x8a\xfe\x0b\x3f\x16\xee\xf9\x35\xc0\x69\xbb\xec\x03\x8e\xd3"
- "\x79\xae\xc7\xbe\xef\x56\x3a\x72\xe1\xb6\x9e\xb9\x88\x8e\x07\xc7"
- "\xfc\xf6\x31\x6e\x5d\x72\x3f\x58\xd7\x1b\x0b\x8f\x18\x7a\xc3\x80"
- "\x63\x4d\x12\x9a\xd5\x89\x7f\x9e\x4f\x6c\xbc\x76\xce\xe3\xa5\xb4"
- "\x47\x00\x67\xd0\x59\x75\x36\x4a\xab\xf8\xc4\xe6\xa3\x85\x6b\xa0"
- "\x63\xcc\xd2\xe6\x74\xcf\x7f\xaf\x57\x17\x2d\xca\x8c\x86\x29\x2c"
- "\x9f\xd8\x18\x2e\xeb\x23\xb6\x49\x0a\x22\x66\x8e\x4f\x62\xd3\xc7"
- "\x17\xe8\xe0\x45\xf9\x06\xae\xa0\xe1\x41\x03\x5f\xfd\x1b\x4f\xd0"
- "\x55\x0b\xeb\xa7\x45\xba\xd9\x47\xb8\x51\xf5\xa7\x53\xea\x1b\xbc"
- "\xdb\x86\xb2\xeb\x7d\xf4\x5c\xbb\x2e\x43\x4d\x28\xbf\x6d\x7f\xd9"
- "\x44\xe4\x59\xb4\x5d\xf7\x73\x3d\x84\xfe\x3d\x12\xc5\xfb\x6f\x47"
- "\xad\x05\x1c\x51\x7d\x78\x47\xf9\x31\x5a\xe4\x8f\x4a\xd7\xfb\x76"
- "\x7f\xde\x31\x5a\xfc\xb6\x9a\x57\x1f\xd0\xe3\xbe\x2d\x56\x67\x57"
- "\x74\x1c\x59\x17\xf0\x39\x2e\x96\x71\x49\x7b\xd9\xc7\x8b\x33\x8d"
- "\xf1\x02\xb0\x76\x48\x9a\x0f\x15\x7b\x99\x4e\x2a\x0e\xc4\xfc\x16"
- "\x45\xa7\xc5\x79\x31\xb4\xe7\x71\x13\xf5\x30\x9d\x06\xad\x10\xda"
- "\xa0\x40\x92\x28\x58\x62\x26\x96\x17\x96\x71\xde\x33\x02\x7f\x48"
- "\xbb\x4a\xd1\x6d\x71\x95\x41\x37\xa3\xef\x98\x4e\x3e\x5a\x4c\x4c"
- "\xdb\xd8\x36\x0e\x38\x74\xcc\x68\x3b\x68\xca\xeb\xe0\x78\xde\xa2"
- "\xcb\x45\x53\xc3\x30\xf6\x29\x58\xf0\xcb\xfd\xe6\xef\xd1\x7e\xe7"
- "\x58\x52\xb4\x5d\xec\x07\x6d\xf3\xa2\xe6\x0d\x1c\x37\x75\x1b\xcb"
- "\x8a\xf0\x7c\x92\xa1\xc7\x64\x3a\xa8\xfc\x5b\x16\x6c\x11\x15\x9f"
- "\x64\x48\x59\x5e\x24\x63\x67\xb0\x0c\x1c\x62\x1a\xb1\x5e\x64\x59"
- "\x62\x19\x60\x79\x52\x34\x72\xe6\x46\xd1\xa8\x91\xe9\xa3\xd3\x69"
- "\x47\x9c\x2e\x9f\x6d\x2f\x1a\xaf\x74\xb1\x3d\xf3\xda\xc2\x31\x32"
- "\x00\x8a\xfd\x9e\x09\xb7\xdb\xf3\xc6\x5f\xeb\x74\x8c\x9a\xaa\x2e"
- "\x13\xf2\x72\xf9\x9a\x1a\x3b\xef\xb2\xa3\x9e\x1d\xb1\x73\xb7\xb2"
- "\x1c\xa5\x3f\x9c\x4d\xbe\xa4\x01\x72\xdd\x81\xe3\x91\x56\xce\x23"
- "\x8a\x00\xef\x75\x27\xd0\xa7\x96\x03\x3b\x38\xfe\xed\x34\xcc\x19"
- "\xa7\x9e\x15\x5f\xd5\xe2\xdd\x66\xa4\x0f\x2a\xe6\xb8\xf9\xff\x14"
- "\x5a\xca\x81\x1d\x3c\xb7\x17\x15\xbb\x9d\xfe\x94\x50\x36\x7e\xe4"
- "\x4f\x69\xf2\x4c\xba\xde\x25\x82\xee\x25\x23\x8d\x76\xf1\x1a\x00"
- "\xfa\x73\xc7\x34\xa7\x88\x30\x8d\x0a\x9c\x1c\xa3\x1a\xb0\x93\x79"
- "\x0d\x60\x09\xda\xff\x8c\x47\xcd\x2f\x97\x80\xff\xe7\x77\xe8\xba"
- "\x2c\x0f\xcf\xb0\xff\x6e\xdd\x2e\xfb\xd5\x6d\x93\xb1\xad\xb5\x95"
- "\x37\xdc\x8f\xf9\x00\x19\x30\x01\xab\xbf\xda\x0f\x57\xf0\xbe\xa9"
- "\xbf\xa5\xb6\xfa\x93\x46\x6b\x92\x8a\x17\x08\x19\x2f\xaf\x35\x69"
- "\xf9\x3d\xfe\x13\x78\x37\x68\x45\x3a\xfb\x57\xe4\x83\xf7\xca\x39"
- "\x8f\xf1\xae\xd2\xad\xf9\x2a\x4d\x5a\x08\xfd\x98\xae\xec\xe7\x0e"
- "\xd6\x9f\x98\x5b\x2e\xcd\x30\xc6\x35\x39\x1e\x9a\xa8\x5c\xcd\x67"
- "\x96\xde\xca\xe5\xce\xb8\xcd\x98\x33\x38\xb7\x5c\x9d\x21\xe7\x28"
- "\x21\xcd\x9d\x44\xca\xc7\x75\x69\x8a\xa1\x63\x79\x1f\xcd\xba\x42"
- "\xf8\x79\x1d\xd1\x1a\x16\x7e\x19\x83\x9d\xc7\x0e\x3a\x41\xde\xd2"
- "\x60\x39\xfb\xd8\x49\x1b\x08\xf5\xaa\x71\x23\xa2\xc6\x0d\xd4\xef"
- "\x4f\xbe\x61\x26\xc6\x87\xa4\x13\xb4\xa4\x95\xf1\x67\xda\xf0\x7a"
- "\xbc\x06\x5a\x79\x79\x9c\x64\xfa\xa4\xfe\x61\x22\xfb\x46\x70\x5b"
- "\xad\x61\xb4\x39\xba\x5d\x26\xcd\xb7\xce\x8d\x76\x99\xd0\x2e\xe7"
- "\x49\x96\x99\x10\xfb\xac\x40\xde\x86\xca\x38\xc7\x72\xfe\xbc\x34"
- "\x14\xdd\x46\xd6\xff\xaa\x0d\xcb\x2e\x4f\xd4\x46\x61\xe2\x36\x4a"
- "\x1a\x9c\xd4\xe5\x4d\xe2\xc9\xfa\xa3\x83\x96\x6e\x1b\xb4\x82\x7d"
- "\x45\x0e\xec\x80\x7e\x9b\xc0\x7d\x88\xf1\xb3\x8a\xf1\x4c\xd4\x5f"
- "\x0c\x4f\xc1\x5a\x56\x6f\x5d\x51\x3e\x33\xe8\x5e\xb6\x2a\x31\xbd"
- "\x97\xbd\x7d\x61\x7a\x2f\x5b\xc2\xe5\x19\x0f\xde\x03\xb0\x86\x31"
- "\x59\x07\xdf\x62\xbe\xe6\x49\x54\xef\xa0\x15\x75\x8c\x57\xc2\x77"
- "\x82\xe5\x45\xd7\x41\xe0\x43\x01\x39\x11\xac\x93\x82\xee\xd2\x9e"
- "\xf5\x2f\x6b\x92\x3d\x59\xea\x07\x93\xa8\x4a\x04\xc3\xba\xa2\x8a"
- "\xf7\x42\x26\xa0\xfe\x84\xef\x35\xfe\xa6\x83\xe7\x40\x9d\xb6\xf2"
- "\xbb\x57\x5b\x93\xe8\x4e\x7f\xf2\x77\x53\xad\xce\x30\x9f\xf1\x43"
- "\x3f\x0a\x27\xe4\x78\x34\xcf\x53\xd5\xda\x45\x29\xec\xff\xb5\x32"
- "\x1e\xb7\x3f\xe5\x40\x9d\xda\x5b\x28\xc5\xf8\xb7\x3e\xd7\x58\xbf"
- "\xc5\x33\xf4\xcb\xe7\x45\x4a\x2e\xaf\xd8\x20\x56\x37\x4d\xd7\xdc"
- "\x56\x61\x5f\x6a\x85\x1d\xb9\xfc\x41\x4d\x70\x9c\xff\xa6\xe9\xbd"
- "\x7c\xa2\xfc\x68\x0c\x3e\x41\xf9\x70\x62\x1e\x58\x7e\xe5\x85\x79"
- "\xa0\xf4\x4b\x7e\xcf\x74\x57\x73\x95\xe5\x13\x0d\x3b\x45\xac\xbc"
- "\x62\x83\xbd\x8c\xeb\x2f\x6d\x55\x75\x33\x4d\x72\x78\x5f\x21\x17"
- "\x74\x29\x47\xde\x62\x43\x0f\x30\xbf\x58\x23\xfc\x0d\x04\x92\x3c"
- "\x8d\x77\xb0\x7f\x8a\x7d\x6a\xad\xb4\x39\x5d\x7e\x2f\xd0\xed\x74"
- "\xf8\x5d\x8e\x8d\x18\x87\x29\x90\xf2\xc9\x70\xe4\xd9\xee\xa3\x06"
- "\x19\xcf\x08\x63\x70\x06\x74\xb6\x6d\xbd\xf2\x93\xb5\xc8\x38\x42"
- "\x90\x69\x8e\x1d\xc4\x72\x8d\x34\xd6\xdd\x1c\x47\x08\xf3\x9d\xe5"
- "\xed\x3d\xe3\x92\x3b\x07\xba\x42\xc8\x6f\xef\x60\x5c\x1a\xde\x09"
- "\xda\xbd\x6a\xd2\xb6\x9e\x1b\x63\x23\x6e\xf3\xb9\x95\xc3\xb6\xbe"
- "\x70\x23\x99\x0f\xd8\x9e\xa0\xe2\x9b\x29\x63\xc5\xf7\xcc\xf4\x7f"
- "\xb3\xc9\xc4\x74\xf0\xd1\xf2\x90\xa2\x5d\x59\xb6\xd1\x3f\x3e\x2a"
- "\x95\xfd\xc3\x6b\x8d\xd3\xc2\xe2\x2b\xb5\x1e\x5a\x06\xfd\xf7\xd4"
- "\x21\xf5\xde\xd9\x10\xbf\x06\xc4\xf6\xbc\x7d\xee\x02\x7b\xe1\xb3"
- "\x8b\xe7\x8d\x18\x11\x33\x57\x32\xcb\xb3\x31\xee\xb2\x22\x35\x9e"
- "\x96\xf5\xc4\x3f\x62\xbb\x04\xcf\x68\xbf\xf3\xbc\x18\xe7\xb9\x05"
- "\xba\xfb\x73\x41\x16\xf5\xde\xdf\x44\xb9\x37\x45\x3d\xde\x42\xb9"
- "\x37\xdf\x52\x70\xff\xec\x59\x85\x4b\xa2\x52\x6f\x8d\x5e\xd7\xab"
- "\xdc\x80\xba\x93\x87\xdd\x0d\x5d\x91\x34\x75\x19\x8f\x2d\xae\x57"
- "\xcb\xc2\xe2\x5f\xd0\xd7\xd9\x90\xb1\x82\xe6\x92\x30\x35\x43\x97"
- "\x89\x2b\x58\x87\x0f\x50\x67\xfe\x60\x4f\x81\xb7\xac\x68\xbb\x1f"
- "\x76\xdd\x59\x5e\x9f\x41\xb9\x3d\x2d\xd5\x1c\xeb\xb7\x49\x8f\x63"
- "\xee\x2a\x41\xfa\x60\x5c\x37\xe1\xda\x1f\xd7\x37\xed\xf3\x30\xef"
- "\x61\x1f\xeb\x45\xec\x63\xed\x92\xbe\x2e\x37\x06\xca\x89\x7d\x45"
- "\xf0\x7e\x14\xdb\x20\x3e\x72\xf1\xf7\xc1\xf8\x9b\x74\x39\x48\x5b"
- "\x68\x7f\x8a\xb2\xf8\x2a\xe4\xfe\x11\x66\x60\x15\x4d\x55\x62\x63"
- "\x3e\x7f\x4b\x6b\x24\xd2\xff\x96\x9c\xf4\x19\x25\xdb\x06\x44\x82"
- "\x6e\x57\xab\x8f\x9e\x5e\xc3\x74\xea\xeb\xdb\x9f\x4c\xe7\x78\xfb"
- "\xb0\xd7\x36\x5c\x4d\xd2\xbe\xd5\xed\xb9\xcd\x72\x5c\x28\x1f\x15"
- "\x65\xd3\xf1\xfe\x65\xaa\xb2\x4f\x44\x44\xd9\xa7\xe5\xb9\x86\x1c"
- "\xe0\x3e\xdf\xe0\xd3\x98\xb8\x6b\xf3\x4a\x66\xcf\x9f\x5d\x68\xbf"
- "\x76\x41\x2a\x45\x45\x5d\x73\xcc\x9e\x67\x9f\x3f\xfb\xb9\x85\xb3"
- "\x17\xc8\x88\x69\xfc\x36\x66\xcc\xcf\x10\xa9\x7f\x6c\x34\xce\x03"
- "\xd9\x87\x31\x7d\xcb\xf7\x71\xac\x2e\xb1\xfa\x4f\x13\xd9\xa7\x43"
- "\xda\x28\x69\x56\x67\xec\x7c\xc3\x9d\xa7\xec\xbc\xa6\x72\x35\xd7"
- "\x59\xf1\x39\x3f\x1f\xa3\x15\x8e\xde\xb8\xe0\x2b\x2e\x07\x2d\x4d"
- "\x8a\x6e\x96\xe3\x41\xf7\x8a\x74\x83\x6e\x3e\x72\x57\xeb\xb6\x54"
- "\x87\xd4\x1f\x18\x63\xa1\xff\x62\xc6\x57\xf5\xcd\xcf\x15\x36\xf0"
- "\x46\xb2\x5c\xef\x4d\x69\x5a\xc5\x75\x31\xcc\xe3\x28\x8f\xfe\x29"
- "\x87\xde\x64\xfd\xe6\x31\xe0\xa1\x4e\xe2\xfa\xf4\x79\xd0\xb7\x50"
- "\x5e\xee\x87\x6b\x9e\xa6\x55\xac\x53\x38\xb6\x84\x56\x01\x38\x72"
- "\x1f\xcf\x5d\xcd\x36\xa6\x8c\x4d\x0f\x58\xbc\x4e\x0b\x3d\xb7\x9e"
- "\xbf\x0f\xcb\x69\x2a\x66\x58\x79\x21\xaf\x0d\xa3\xae\x52\xe0\x7f"
- "\xa8\xd7\xe7\xdd\x5d\xcd\x76\x27\xc3\xf5\xd1\x8a\xf5\x0c\x4f\xc5"
- "\x44\x5b\x11\xf0\x51\x59\xb8\xd7\x7e\x72\x67\x47\xcd\xcb\x80\x8f"
- "\xc2\x33\x00\x5c\x64\xfc\x4d\xe5\x83\x28\xdb\xcd\xfa\x73\xbd\xde"
- "\x76\xa3\x3d\x41\xb7\x1b\xfa\xcf\xd5\x6e\xec\xad\xfb\xf4\x76\x33"
- "\x7e\x8c\x7b\x34\xce\x3a\xbe\xc5\x8c\x2f\xca\x95\x46\xc9\x36\xaf"
- "\xcb\xf4\x43\x5a\x55\xaf\x6f\x73\x79\x6b\xbc\xde\x78\x76\x9e\xbd"
- "\x68\xee\xbc\xa7\x0b\x16\xcf\x7a\x7a\x76\xc1\xc2\xe2\x51\xf6\x85"
- "\xf3\x9e\x28\x7a\xf6\xc9\xa7\x99\x6b\x16\x94\x2c\x7c\xf2\x69\x3b"
- "\x6b\x96\x82\x89\xb9\xb9\x05\x77\x3f\xf8\xc0\xc3\xa9\x74\xf7\x2c"
- "\xa4\x61\xe6\x9f\x9b\x35\x4a\xbd\xba\x7f\xd2\x84\x87\x0a\x26\x4c"
- "\x7b\x70\xea\x74\x79\x18\xa2\xe7\xfd\xc4\x79\x89\x33\xc4\xf0\x61"
- "\x3a\x78\xa9\x14\xfd\xdb\xef\x18\xfd\x2c\x43\xc5\xd1\x5e\x39\x31"
- "\x36\x8e\xf6\x4a\xcc\x65\x57\xc2\xca\x5c\xb9\x9e\x68\xd5\x41\xfc"
- "\x30\x4f\xfd\x99\x45\xf1\x57\xca\xb4\xa0\x7b\x65\x71\x2f\x7f\xfd"
- "\x2c\x43\xee\x8f\x57\xcb\x7d\x67\x13\xde\x41\xff\x97\x57\x45\xbf"
- "\xeb\x9d\x4f\xae\xdc\xda\x33\x9f\xec\xd1\x29\x2b\x8f\x18\x73\x4b"
- "\xa4\x79\x30\xaf\x4c\xe1\x79\xa5\x5a\x4f\xfa\xd9\x65\x92\xa7\xfa"
- "\x94\x6f\x0b\x19\xf3\x4a\x96\x6d\xde\x27\x56\xf3\x8f\x55\xe9\xd1"
- "\x32\x2e\x63\x37\xea\x32\xce\xe5\xe4\xfa\x5d\x9a\xb5\x90\xd7\xb4"
- "\x61\x1f\x97\xc2\x56\xc0\xf8\x15\x14\x62\xa0\xb5\x50\xe1\xb4\x2a"
- "\x8f\xd7\xb8\xd9\x6e\xd6\xf9\x69\xd0\x09\x5a\xb5\x56\xb8\xdd\x5b"
- "\xd4\x9c\xd2\xfd\x17\xd6\xeb\x62\xe5\xb0\xbb\xd9\xff\x84\xe7\x4e"
- "\xa8\x73\x55\x2f\xcf\xfe\x2c\x83\x79\xa1\x77\x2e\xbb\x2a\x46\xff"
- "\x77\xca\xef\xd5\xad\xda\x61\xc4\x01\x28\x19\x41\x26\xf3\x88\x2a"
- "\x5a\x6f\x12\xe5\x3e\x5a\x55\xc8\x75\x30\x3d\x7d\xb4\xb2\x1c\x79"
- "\xcd\xbd\xf4\x5b\xd5\xde\x43\x3f\x7d\x9d\xc5\x58\x63\x51\x78\xff"
- "\xec\xb2\xbe\x68\x95\x98\x4e\xcf\x67\x7f\x2d\x9d\xdc\xd4\x8f\x65"
- "\xd2\xa0\xd7\xf9\xb4\x7a\xbe\xf4\x7c\x5a\x3d\xdf\x1c\x45\xab\xb3"
- "\xe7\xd3\xea\xf9\xed\x51\xfb\x3e\xfa\x3a\xca\xcf\x2e\x63\x9a\x31"
- "\x8f\xa1\xdd\x85\xe0\xb3\x8a\x5e\xfa\x3d\xef\x3b\x9f\x7e\xcf\x07"
- "\x12\xd3\xef\xf9\xaa\xab\x63\xe1\x54\x26\x1a\x37\x06\xad\x30\xe9"
- "\xe7\x84\x7e\x36\xb7\x71\xb8\x9c\x93\x86\x5e\x31\x69\x8e\x57\xdc"
- "\xf8\xe1\xca\xf3\x88\x5e\x5b\x5c\x84\x74\xfa\x3a\x1a\x31\xe7\xe5"
- "\x75\xa5\x0b\x8c\x45\x47\x8d\x35\x0f\xdc\xb7\xf2\xdc\x99\xbf\x15"
- "\xc4\xe9\x4c\x4f\xfe\xf6\x14\xf8\xbd\x55\xd9\xa5\x3f\xab\xef\x59"
- "\x73\xb9\x6e\x5e\x43\xf2\x0a\xb2\xef\xaf\xb9\x99\xd3\x0f\x81\x87"
- "\xe4\x1a\x12\xfb\xf7\xf4\x05\xb3\x20\x92\x43\x89\xe1\xbe\xd0\xc3"
- "\xff\x7d\x9d\x95\x8d\xd3\x47\x8e\x59\xf3\x0a\x9f\x9d\x33\xe7\xeb"
- "\x55\x51\xb4\xef\x4e\x95\x5b\xe3\xef\x5d\xf5\x0f\xae\x7c\x6a\x29"
- "\xea\x84\x7e\x7e\xa6\x41\x8d\x9b\x2f\x40\xff\x39\x9c\xca\x96\x7c"
- "\xb4\x5d\x9d\x0f\x7e\xa1\x23\x4a\x3f\x83\x47\x5e\x08\x09\xf7\x0b"
- "\x63\x7b\xfb\xf8\x85\xc6\xf3\xfb\xf8\x85\xd6\xc4\x7d\xfc\x42\x58"
- "\x5b\xc4\xe7\x33\x5e\xe0\xf9\x8f\xb4\x35\xf9\x99\xf7\xcb\x31\x67"
- "\x6e\xc7\x7c\xb9\x63\xda\x92\x86\x3b\x0b\x96\x24\xb1\x5f\xb9\xfc"
- "\x26\x47\xf8\x9c\x68\xe3\x3d\x6b\xde\x1f\xe3\x6f\x72\xf0\xb7\x78"
- "\xf8\x5b\xad\x32\x0f\xee\x2b\x8f\x93\x9c\x3b\xe2\xbd\xbd\xf6\xb8"
- "\xfc\x2e\x31\x6c\x05\x4f\xbe\x61\x5b\x5b\x57\xd8\xe5\xb9\xe5\x75"
- "\xaa\x3f\x5a\xb9\x2f\xb8\xbe\x82\x25\x0d\xaa\x8e\x73\xfc\xbd\x2d"
- "\xb2\x2a\x1b\xc2\x53\x75\xc1\xb5\xfb\x94\x90\xbd\x4f\x7f\x28\x77"
- "\xf9\x80\x57\x54\x4c\x6b\xf6\xe5\xf4\x1b\xbe\x3a\xec\x57\x08\xb8"
- "\xed\xf1\x7e\x89\xca\xbf\xa4\x82\x0c\xbf\x1d\xdc\xa7\xf5\xcc\x07"
- "\xf8\x3b\x2e\x98\xc7\xd9\xcb\x56\xf4\x3f\x45\x9e\xe6\xda\x3e\xd6"
- "\xd0\x8d\x73\xca\xba\x9f\xcf\x00\xc0\xe8\xf1\x7f\xc4\x38\x37\x80"
- "\xf5\x45\xaf\x4f\x63\x45\x51\x94\xef\x9a\x9f\xc7\x5e\xfe\x56\xcc"
- "\x71\xaa\x58\x2b\xbf\x4d\x73\x35\xaf\x7f\x57\x6c\x53\xdf\x05\xae"
- "\xa8\x8e\xc6\x45\xe1\x51\xf1\x30\xaf\xd1\xf2\xfb\x68\x5c\x9c\xb3"
- "\x16\xce\x1d\xe3\x9c\x33\xd7\xfe\xa4\x63\x6e\x71\xc1\x5c\x19\x5b"
- "\x56\x86\xad\x2d\x59\x52\xcc\x3b\x12\xd7\xa7\xc6\x8d\x61\xba\xef"
- "\xa4\xe1\x03\xa3\xfc\x27\x57\x0f\x06\x3d\x4c\xca\x7f\xf2\x45\xb3"
- "\x1a\xd7\x57\x0f\x3f\xdf\x5f\x66\x75\x96\xe1\x2f\x03\xbe\xe2\x6f"
- "\x94\x07\x7a\x7d\x6c\x98\xef\x56\xe7\x25\x28\xd3\xe3\xff\xc9\xdf"
- "\xb3\xe5\x6f\xcf\xf2\xbe\xb6\x8c\x3f\xfe\x32\xf7\x5b\x45\xbd\xd7"
- "\x39\x89\x63\xa8\xea\xfc\xbc\x7a\xbd\xc1\xcf\x86\x9f\x25\xc3\xe2"
- "\x73\x2b\x63\x42\xd1\x7e\x46\xab\xbf\xc2\x98\x67\xeb\x69\xc7\x32"
- "\x13\x31\xee\x01\x53\x03\xe3\xd1\x1a\x8f\x07\xf0\x1b\x81\x74\x7f"
- "\xaf\x9f\x96\xd1\xce\x17\xcd\xb8\xcf\x8f\xe7\xb9\xbb\x26\xe5\xc2"
- "\x28\x5d\x30\xbb\x24\x95\x26\xcc\x2a\x2a\x62\xb9\x9e\x35\xbb\x68"
- "\xe1\xfc\x67\x17\x14\xcc\x9d\x37\x17\xa9\x77\xcd\xe1\x90\xbf\x32"
- "\xcb\xed\xfa\x1b\xfb\xbc\xd9\xb3\x0b\x55\x92\xde\x0d\xb1\xfb\x40"
- "\x6a\xef\xfe\xc5\x12\x1f\x55\x8c\xea\xb5\xbf\x5e\x6c\x12\xa6\x17"
- "\xd3\xf1\xbb\x42\xca\xb4\xb4\x8d\x5e\xac\x8e\x9d\xf7\xbc\xb8\xd5"
- "\xe0\x07\xd9\x7f\x2e\xf6\xf5\x39\x30\xb8\x53\xc8\x7d\x13\xf4\xd9"
- "\x9a\x08\x7f\xd3\xdb\x47\x6b\xa4\xbd\x1f\x05\xa7\x47\xff\xf3\xb9"
- "\xfd\x95\xca\x4f\xc0\xcc\xdf\x07\xe5\xf3\xfb\x41\xf7\x1a\xf0\xbf"
- "\x67\x87\xe2\xff\x35\x3d\xfc\xdf\x69\x4a\xc6\x1c\x6e\xcd\x70\xc3"
- "\x9e\x8f\x95\x99\x35\x63\xcf\x97\x25\xf6\x71\x5b\x93\x6b\xd0\xd6"
- "\xe8\x67\xc5\x5b\x6b\xbe\x30\xd6\x61\x6b\xf5\xf8\xf3\x7c\xcf\x65"
- "\xd9\x56\x17\x83\x06\xde\xc9\xfe\xf8\xc7\x68\x4d\xbd\xe2\x97\x35"
- "\xeb\xa3\x7c\xb2\xd2\x4f\xd0\x9a\x1d\xaa\x9f\xd6\x6c\x33\xf0\x43"
- "\x3b\xe5\x7e\x00\xc3\x50\xb2\xff\xe2\x4d\x8a\x77\xd6\x1c\x32\x68"
- "\xcb\xf3\x62\x3c\xfb\x7a\x6d\x8b\x17\xcb\xa5\x8f\x84\x8a\x5f\xd0"
- "\xcd\xed\x07\x9c\x99\x06\x9c\xa0\x7b\x2d\xda\x6f\x69\x34\x68\x65"
- "\xe4\x89\xe6\x89\x09\xb3\x8a\x31\x69\x9d\x3b\x67\xce\xec\xf9\x0b"
- "\x8c\x98\xce\x99\xcf\x16\x15\xaa\x18\xce\xb7\xa3\xfb\x17\x43\x02"
- "\xc7\x73\x18\x68\xa4\xaa\xdb\x38\x1b\x72\x14\xaf\x33\x48\xbf\x3d"
- "\x39\x8f\x79\xe9\x8b\xcd\xfa\x9c\xe6\x18\xad\x2b\x55\xbe\x2f\xeb"
- "\xc6\x2b\x7b\xf1\x92\xc5\xc0\xa9\xce\xb0\x17\x79\xfd\xb2\x93\x46"
- "\xe4\xf3\x79\x24\xf6\xdb\xde\xf4\x9a\x68\xe3\xf5\x4a\xe4\x69\x34"
- "\xbe\xfb\xc5\xb6\xc8\x5a\xf5\x3d\x76\x7f\xc3\x3c\x8e\x99\xff\x72"
- "\x8a\x56\x71\xa0\x4a\xa4\xee\x6c\x80\xcd\x93\xc6\xb2\x30\xb0\x83"
- "\x7d\x27\x39\xce\xd0\xba\x74\xb6\x95\x58\xbf\x70\x6c\xfc\x36\x5a"
- "\xeb\xc3\xfc\x06\xe3\xdf\xcb\x69\xfe\x94\x03\x55\xab\x96\x92\x85"
- "\xeb\x80\x6e\xf2\x35\xd6\x31\x6d\xd7\x8d\xfa\x18\xba\x47\x5f\xdf"
- "\xf5\x71\x3d\x3e\x5a\x1b\xd2\xd7\xd2\xb7\xe8\x6b\x97\x5b\x90\x6f"
- "\xba\x8f\x06\xea\xdf\xd4\xd9\xfd\xfd\xef\x94\x93\x93\xbf\x03\xa8"
- "\x62\x04\x1d\x82\xad\xba\x9b\xbf\x7b\xe7\x87\x7d\x85\x39\xc4\xda"
- "\x3a\xb4\x21\x5b\xf7\xbd\x05\xaf\xac\xfb\x4a\xf9\x54\xaf\xad\x62"
- "\x1a\x00\xee\x76\x1d\xee\x76\xc0\x45\xff\x5f\xa1\xc7\x26\x5e\x57"
- "\x6f\xd4\x81\x31\xc5\x0f\x5b\xd4\xc9\xf6\x28\xf0\xf6\xe0\xb7\xa6"
- "\x52\xee\x4f\xfb\x30\x6f\xb1\x0a\xf6\x1b\xea\xfd\xb6\xd9\x3a\xbf"
- "\x31\xbe\x70\xdd\x3a\xee\x7c\xbe\xdd\xc2\x6b\x67\x7a\x5d\xdb\x78"
- "\x7e\x6d\xc0\xc4\xb3\x47\x3b\x77\xb2\x0e\x30\x2d\x18\x2b\xfd\xfa"
- "\x37\xad\xd6\x54\x9e\x61\x1f\x33\x1f\xc6\xc2\xab\x44\x41\x38\x9d"
- "\xf7\x75\x06\x1a\xdf\x0c\xab\x3d\xc3\xf4\xaa\x9c\xd1\xbb\x5f\x83"
- "\xf2\xa0\x3f\xe4\xa1\xbc\x8d\x2a\xe5\x77\xd2\x58\x16\xb8\x2f\xbb"
- "\xd0\x37\xfc\x6d\x7b\x71\xee\xe4\x76\xcc\xf3\x07\x1e\xa7\xca\x37"
- "\xb8\x8f\x78\x8f\x95\x7d\xbf\x90\x66\xe5\x18\xe7\xc7\xa8\xf2\x79"
- "\xee\x1f\xc6\x45\x78\x76\x55\x87\x83\xf9\x3f\xe4\xf3\xad\xac\x0f"
- "\x97\x97\xc2\x8e\x9d\xc3\xba\xe4\xa5\x14\x9e\x17\xf3\xb7\x69\xf8"
- "\xde\x55\x28\x34\xd9\xbf\x4b\xb9\x7f\x5f\x4a\x59\xde\x2e\xb4\xaf"
- "\xdc\x24\x0e\x06\x88\xbe\x32\x51\x38\x64\x4a\x62\xbc\x4d\xae\x93"
- "\x7c\x06\xb7\x8e\xbc\x4e\x0f\xa1\x5e\xcb\xba\xa5\x94\xce\xe7\x97"
- "\xf9\xbb\x2b\x2d\x81\x1a\x6a\x29\xae\xa1\x3f\x86\xd7\x53\xc3\x22"
- "\x8e\x45\xf1\xd2\xf6\x3f\x39\xd7\xf3\xbe\x55\x0a\xee\x9f\xb3\x3f"
- "\xc4\x75\x55\x4d\xfe\xd3\x91\x3f\xd3\x9f\x1a\xfe\x4c\xf6\x47\xe4"
- "\x73\x7e\x53\xfe\x1f\xa9\x29\xe7\x8f\xe4\x6a\x13\x1a\xcf\x95\xca"
- "\x9e\xe1\x3a\x3c\x80\x55\xc7\x67\x7d\xd3\xb5\x4e\x5b\x2a\xda\x6f"
- "\xe6\x35\xf9\x96\x80\x9f\x1a\xe6\x7d\x00\x1c\xab\xfe\xb6\xf9\x0c"
- "\x59\x1a\xe6\xfd\x4e\xde\xab\x39\xcc\xc9\x3a\x6f\x61\x2b\xdb\x69"
- "\x61\x3e\xe7\xcc\xfb\x7c\xb0\xdb\xb5\x4a\xc6\x31\xa2\xf0\xe6\x6f"
- "\xb6\x1b\xe5\x61\xc7\x19\xe5\x65\xac\xa8\x4d\x4c\x0f\xe0\xd4\x3c"
- "\x5d\xd1\xa4\x09\xb3\x4a\x85\x33\xe8\x93\x1f\x4d\x9f\xca\x10\xd3"
- "\x87\xe3\x63\x6a\xe8\x2f\xe0\x96\x03\x1a\x68\x46\x1d\xc0\xd9\xa2"
- "\xaf\x8b\x5a\xd6\x9d\xa1\xb4\x86\x79\xfc\xdd\xad\x97\x1e\xb3\xe6"
- "\x99\x2d\xda\xb9\x53\xdb\x2b\xcf\x92\x99\xfb\x8d\xf7\x42\x2a\xe5"
- "\x7b\x49\xf3\x1c\xee\x33\xf0\x24\xe1\x67\xc6\xcf\xc2\x7c\x87\x2b"
- "\x9f\x97\xf3\x80\x4e\xad\xe8\xab\x3a\xbe\x2a\x5e\xdc\x9d\xcd\x31"
- "\x20\xf4\x79\x49\x6f\x3a\xe4\x28\x2c\xe4\xb7\x6d\x21\x33\x55\xad"
- "\x1a\xe4\x88\xd7\x45\x36\xbf\x4c\x69\x9a\x7b\xed\xc8\x4d\xd0\x75"
- "\x35\x2f\xcb\x33\xa0\xe9\xbc\x56\xb8\x41\x7e\xc7\xe0\xa5\x9e\xf3"
- "\x9f\xab\x87\xf2\x39\xb9\x97\x2c\x26\x5e\x4b\xf1\x1c\xd8\xaa\xf3"
- "\xf9\xd6\xa0\xfb\x65\xe8\xff\xa1\xba\x2f\xe9\x3a\x79\x0e\x97\x65"
- "\xbf\x2f\x1b\x1d\xf6\x61\x93\xd8\x98\x4f\xbc\xa7\x92\xb6\x42\xf8"
- "\xd3\xda\xac\xa2\x25\xd0\x24\xcf\x47\xb6\x04\x22\x72\x4f\x05\xef"
- "\x93\xa6\x06\xfc\x56\xd8\x93\x87\x98\x76\x46\x3a\xef\xc7\xf0\x5a"
- "\xd5\xd4\x80\xf0\x4f\x5b\x62\xe5\xef\x0e\x0e\x97\xeb\xf1\x7a\x7a"
- "\x8b\x0d\xb6\xf8\x12\xbf\x15\x6d\x0f\xf7\xc0\xea\xcc\x4f\x66\x79"
- "\x43\xde\x8c\x9e\xbc\x9d\xf9\x66\xfe\x8e\x2e\xd7\x19\x95\xd6\x6f"
- "\x9a\x13\x65\xb9\xaf\xf4\x34\x65\x87\xbe\xdc\xf3\xfd\x47\xb6\x3f"
- "\xd9\x67\x5a\x2c\xc8\x4f\xd2\x3a\xf3\x4d\x11\xc0\x06\xef\xa7\xcb"
- "\xef\x1f\x86\xfd\xfa\xf7\x84\xda\x21\xbf\xad\x24\xd6\x5a\xcb\x91"
- "\xcf\xcc\x70\xf9\xdc\x3d\x7f\x87\x41\x0c\x1c\x92\xd0\x2f\x52\x78"
- "\x22\xd9\x0d\x65\x8f\x80\x9f\x5e\x69\x67\x79\x8e\x58\x3e\xd9\x61"
- "\x7f\x8a\xed\x93\x57\x66\x31\x3d\x23\x90\xb1\x48\xca\x27\x3b\xc6"
- "\xb4\x53\x52\x19\xf8\x56\xad\xeb\xbc\xb2\xc2\x0b\x19\x74\x69\x02"
- "\x36\xdf\x2b\x25\xcc\x37\xd6\x0e\xf6\x3f\xfb\xa4\x5e\xfa\x7c\xa5"
- "\x7e\x95\xe5\x0d\xb5\x53\x53\xf9\xdf\xa9\x29\xec\x2d\xdf\x7b\xc6"
- "\x6f\x56\xbe\x5f\x66\x86\xfb\x2a\xbf\x73\x81\x57\x0b\x22\x75\xd4"
- "\xd7\x7a\x3b\xcf\x39\x31\x86\xfd\x53\xcd\xbf\x5e\x69\x37\xe6\x9a"
- "\x17\x6e\xc3\xfa\x1c\x8e\x55\x20\x84\x8d\xb4\xd5\x7f\xe5\x7d\x05"
- "\x97\x08\x66\xd2\x98\xa5\xbc\xce\xb5\xde\x06\xbb\x3f\x47\x87\x7b"
- "\x5a\xc1\x45\xfe\x0b\xc0\x65\x9e\x69\xaa\x96\x7b\x3d\x68\xd3\x5f"
- "\xf3\x22\x80\x1d\x49\xfd\x6b\x15\x74\xbc\xcb\xf5\x15\xaf\x83\xbe"
- "\xfa\x3c\xea\xc9\x6b\x09\x1f\x22\x8e\x79\xb2\x59\xc3\xf8\x78\xda"
- "\x46\xba\x9f\x9b\xeb\x14\xad\x7f\x4e\x13\x99\xe9\x98\x03\x4b\x5c"
- "\x58\xc7\xf1\xfc\xba\x2c\x42\xfd\xbd\xb0\xa2\xf8\x9c\x3e\x60\x2c"
- "\xf9\x3d\xef\x27\x41\x4f\x44\x84\xcd\xb4\xef\x9c\x8f\xd8\x97\x45"
- "\x9e\xdb\x5f\x79\xc5\x86\x41\x2b\xe8\x4e\x61\xb2\x4a\x3f\x46\xad"
- "\x22\xe8\x40\xdf\x7a\x24\x3e\xab\x0f\xd4\x47\xf9\xd4\x25\xa3\xae"
- "\xb3\xec\x53\x27\x2c\x07\x4a\x6b\xe4\x5a\xde\x27\x3b\x82\xee\x57"
- "\xed\x3e\x7a\x25\x8b\xf9\x67\x0d\xfb\xd6\x4b\x1d\xfb\xea\x5a\x7f"
- "\xca\xa7\x59\x0c\x83\xcf\x0d\x6a\x8b\x22\xdb\x2b\xbf\x24\xb3\xa2"
- "\xc7\xab\xcf\xb4\x74\x04\x1b\x84\xe7\xd3\x2c\x3e\x33\xa6\xc3\xb6"
- "\x9e\xa2\x57\xc7\x8b\x8a\x4f\x61\x3b\xbf\xba\x46\xf5\x8d\xbc\xcf"
- "\xe7\xf7\xe1\xee\x4c\xc8\xe0\xfa\x23\x35\x5d\xbc\xbe\xbe\xbe\x5c"
- "\xb8\xaf\x6a\xe8\xb4\x7c\x9a\xf5\x80\x8d\x6d\xaa\x57\xeb\x7c\x49"
- "\x0d\x66\x7d\x6d\x4d\xc6\x20\x88\x5f\x13\xeb\xe9\xc3\x8d\xb6\x54"
- "\x2f\x80\x60\x8e\x98\x71\x82\xaa\x07\x77\xb9\xc9\xd4\x0d\x5b\xb0"
- "\xcb\x04\x9b\x7f\x63\x7e\xda\xba\x61\x94\x85\x77\xc3\x4e\xd0\xab"
- "\x67\xc3\x26\xca\xc0\x2f\xdd\x7f\x85\x23\x05\x70\x73\x78\xdd\xb1"
- "\xf9\x0c\xaf\x1b\xbd\xf6\xa0\xb4\xd5\x36\xd0\x48\x0d\xf0\x78\x0f"
- "\xa5\x72\x18\x8d\xe4\xb5\x3f\xa4\x65\x16\x44\xd4\x5e\xa2\x31\xbf"
- "\x5f\x39\x8c\x46\xc5\xd6\xfb\xea\x51\xb5\x36\x58\x2d\x63\xa6\x2d"
- "\xf6\xd3\xb7\x8b\xef\xe0\xef\x54\xbe\x76\x48\xb8\x93\x85\xb8\xc2"
- "\x66\x52\xfb\xfd\xaf\xed\xb1\x56\x2b\xbe\x93\x7b\x67\xe0\x37\xde"
- "\x9b\xd4\xf7\x69\x92\x64\xec\x85\xd4\xa6\x89\xfc\xcd\xdf\xa8\xb5"
- "\xd7\x74\x89\x87\x7e\x5e\x3a\xb2\xf2\x86\x99\x0c\x83\xf1\x29\x98"
- "\xa5\xf6\x78\xf8\x2c\xb5\x8f\x5e\x93\xf1\x18\xd7\x6c\xa0\xb4\x17"
- "\x37\x50\x7a\xf3\x1c\xd9\xae\x76\x25\x8b\x66\x62\x7c\x35\x0f\xcb"
- "\x19\x78\x02\x78\x73\x7d\xcc\x1b\x2d\xe1\xd3\x0d\xae\x12\xa1\x35"
- "\x3c\xc5\xb6\xe8\xeb\xd7\x37\xcc\xdf\x46\xd3\xda\xc2\xea\xdc\xdf"
- "\x0c\xf2\xd7\x02\x5e\xed\x30\x4a\x3f\x4e\xaf\xdf\xea\x2d\x22\xde"
- "\x03\xb8\xba\x61\xfe\x0e\xc0\x7e\xfd\x5e\x1e\x0b\xd6\x82\x3e\x6a"
- "\x4c\x78\x3d\xec\x0d\xb5\x52\x33\xe4\x7b\x6a\xb1\x88\x30\x1c\xe4"
- "\x59\x21\xdb\xbb\xd1\x66\x2f\x50\xe7\xdd\x65\x5b\x7b\xf6\xce\xf4"
- "\x76\x78\xcf\x48\x78\xeb\xbd\xb0\x4a\x8d\x36\x19\xb4\x56\xfc\xf5"
- "\xfa\xe1\x86\xf9\x5b\x88\xfb\x87\xf3\xe3\xb9\xc1\xdb\x81\xbc\x27"
- "\x63\xfb\x85\xf3\xe0\xdd\x97\x80\xfb\xfd\xde\xfd\x5f\xde\x97\xec"
- "\xcd\x53\xb3\x81\xcf\x01\xbd\x36\x76\x23\x68\xa4\xd6\xcb\x5f\x7f"
- "\x8c\x71\xf5\xd1\xeb\x33\xbc\x25\x7f\x4f\xec\xe7\x09\xd9\x07\xdf"
- "\xaf\x68\x91\xfb\x60\xd5\x53\xa6\x86\x35\xa1\xf4\xd9\x1b\x90\xad"
- "\x50\xb6\x0f\x57\xd6\x05\x52\x9f\xdc\xc8\xbe\x35\x6f\x24\x59\x93"
- "\x54\xff\x72\x5b\xd8\x5e\x49\xd4\xc7\x51\x7b\x74\xe9\x8c\xab\xd1"
- "\xc7\xfc\xbd\x3c\x8d\xf7\x59\x87\x81\xde\xdd\x36\x52\xfc\x27\xaa"
- "\x50\xf7\x97\xba\xed\x16\xd2\xc7\xb2\x50\x67\xca\x27\x0d\x7c\x2e"
- "\xcd\xf0\xb7\x85\xfc\xee\x2d\x50\x3e\xcc\x36\xd6\x51\xb5\x26\x25"
- "\x3b\x8c\xa3\x5e\x36\xa0\xfc\x1c\xaa\x1b\x50\x3e\xe1\x5a\x8f\x48"
- "\x86\xde\x71\x43\x4d\xa3\x3d\x6c\x47\x0a\xe8\x2a\x8c\x07\xfd\xbd"
- "\x81\x2e\xfd\x5b\x85\x6f\x2c\x87\x4d\xdd\x9f\xcf\xa5\x18\xb8\x5d"
- "\xdc\x7e\xda\x1b\x93\xd5\xdc\xe6\x0d\x8f\xb1\x5e\x23\x2c\xa0\xb1"
- "\xdb\x2a\xf8\x8c\x1a\x9f\x35\x08\xa4\x44\x72\xfc\x03\xad\xc5\x4a"
- "\x6e\xde\xd8\x0e\x3b\x55\xea\xdb\x82\x10\x7f\x23\x3e\x94\xcd\xfb"
- "\xa5\x98\x37\xf5\xe7\x36\x03\x0e\xe6\x3f\xcf\x64\xa8\xf1\xfc\x8d"
- "\x3e\x7d\xaf\xe5\x9c\xc9\x68\x1b\xda\x24\xdb\x86\x36\xca\xb6\xe9"
- "\xdf\xf2\x39\x4e\x1b\xe4\xd9\xe5\x8b\x6b\xcf\x06\x9b\xa2\x6d\x24"
- "\x87\xbf\x53\x7a\x9c\x36\x7e\x2e\xcf\x1f\xa0\x4f\xd4\xde\xc2\x86"
- "\x3a\x91\xfa\x62\xea\x45\xc2\x54\x31\xa2\xd7\x58\x8b\x5f\xe5\xb8"
- "\x7f\xfa\xf7\xc0\x00\xbb\x19\xba\xbc\x58\x9e\xed\x42\x7d\xfc\x3d"
- "\xc5\x5e\x3d\xb4\x31\x8f\xfb\xea\xc6\x6d\x94\xa3\xf8\x70\xe3\x24"
- "\x5e\xbf\x55\xf3\xbc\x0d\x01\xe8\xde\x7a\x35\xa7\x32\x7c\xb3\x93"
- "\xa4\x6f\x76\xb4\x8e\xbd\x38\x1c\x37\x4a\x7d\x27\x52\x83\x98\x3f"
- "\x6d\x68\x93\x67\xd4\x80\xef\xe2\xb0\xa1\xff\x36\xb4\xb1\x9f\x4f"
- "\xcf\x1e\xfb\x12\xf0\x4a\x99\x3a\xb3\x1b\x74\x6f\x5c\x65\xd8\x28"
- "\xf2\xfb\x4f\x6e\x71\x90\xf3\x4d\x5b\x72\x5a\xee\xc1\x57\xca\xf3"
- "\xe5\x27\xf4\xf3\x4d\x1b\xdf\xd0\xd7\x33\x32\xd9\x2f\x1e\x65\x1b"
- "\x7c\xb4\x4f\xfa\xf3\x30\x0d\xb8\x6e\x89\xbb\xfc\x06\xd3\xc6\xa3"
- "\xbd\x7b\x29\x1b\xea\x65\xba\xf4\x15\xdd\x18\x30\x78\x04\xed\xed"
- "\xaf\xe2\x30\x6e\x78\x6c\xff\x28\x92\x3c\xd0\x29\x6c\xa9\xd7\xd4"
- "\x30\x4f\xd6\x0c\x8f\xa6\xd3\xb4\xb0\xe6\x52\x3a\x68\xa3\x59\x48"
- "\x59\xdf\x68\xfe\x7a\x7b\xa2\xe6\x39\xc3\x16\x51\x74\x4e\x87\x7e"
- "\xa9\x1d\x27\x69\xed\xd9\xd5\xca\xf1\x30\x96\x95\x71\x7c\x9f\x4d"
- "\x37\x71\x1c\xa5\xb0\x67\x57\x28\xc2\x67\xe1\x30\xce\x6a\x9e\xdd"
- "\x96\xe3\xc5\x64\x2a\x28\xe6\xfd\xa3\x4f\xe5\xfc\x4a\xb8\x60\x0b"
- "\xa4\xc2\x3e\x81\x9c\x2f\x9f\x4b\xd6\xc7\x1c\x80\xed\xca\xcc\xe0"
- "\x38\x47\x1c\xe3\x88\xe3\x94\x45\x5c\x99\x43\x70\x3f\x14\xf6\x5c"
- "\xba\xb0\xec\x6a\x67\x1f\x94\x88\x5b\x40\x1f\x1f\xe5\x58\x4b\x26"
- "\xaf\x3f\x44\xcb\x4f\x92\x85\xe3\x28\x85\x2b\x3e\xb5\xb5\x04\xfe"
- "\x21\xe7\x16\x83\x8a\x61\x4f\x6b\x34\x1c\x34\xb7\x69\x29\x9f\xc2"
- "\x5e\xff\xd4\xac\xda\x7d\x5a\xa8\x76\x2b\xbc\x19\x7f\xa5\xe3\xf6"
- "\x58\xca\x24\xee\x9b\xff\x12\x06\x7c\xcd\xf3\xa1\x39\xe2\xf9\x90"
- "\xd4\x19\xba\x26\x2a\x2b\x11\xed\x5e\xd8\xc6\xec\x13\xc9\xe7\x24"
- "\xd9\xc7\x85\xdb\xc8\xed\xe3\xba\xff\x74\xe6\xa4\x8c\x0b\x15\xc6"
- "\xb3\xab\x48\x2f\xd3\x81\x32\x1d\x4d\xd4\xe5\xf9\x50\xb6\xbd\x25"
- "\xa0\xca\x16\xc8\x7b\x2e\x1f\x45\x07\xbd\xcd\x3d\x74\x40\xdb\xb9"
- "\x7d\xdc\xfe\x30\xd3\x04\x34\xd0\xdb\x6a\xeb\xd6\xdb\xc9\x6d\xfc"
- "\x23\x46\x9d\x0d\x68\x27\xda\x2a\xdb\xd9\x8d\x76\x1e\x74\x10\x85"
- "\x56\x47\xf2\xbe\x4a\xfd\x90\x78\x7e\xe8\x3a\x0c\x3b\xba\xb4\x8a"
- "\x30\x0f\x34\xbf\x53\x56\x65\x5a\x0d\xdb\xa4\xcc\x8f\xf9\xa0\x5f"
- "\xb4\xb3\xbd\xef\x2d\xc6\x2f\x5c\x23\xbf\xf1\x2a\xed\x63\xfe\x1e"
- "\xe7\x73\x68\x93\xf6\x39\x95\xb5\x8b\x76\xd8\xa6\x21\x6f\x18\x79"
- "\x1c\x68\x3f\xe6\x8f\xc7\x75\xfc\x39\xef\xf2\x2f\x55\xbb\xac\x45"
- "\x94\xf1\xd1\x23\x1e\x93\xb7\xd5\x43\x46\x5b\x1e\x47\x3e\xb4\xc7"
- "\x06\x58\x03\x65\x0c\x7c\xb4\x73\x23\xf0\x0c\x45\xb5\xa9\xb9\x23"
- "\x04\x98\x7f\xa1\xd4\x3c\x4a\xda\x70\x0a\xed\x38\x45\xb6\xaa\x32"
- "\xd8\x5f\xf7\xb3\xbd\xb8\x79\xe0\x25\xf9\x34\xd2\x47\x9b\x32\x14"
- "\xdf\xc9\x18\x2d\x97\x9d\xa0\xda\x5b\x7b\xe2\xb0\x70\x6c\xab\x94"
- "\x4f\x87\x33\x1f\xc9\x78\x2c\x3c\x66\x04\xc1\x33\xec\x9f\xb2\x18"
- "\x75\x04\x33\x87\x4a\x7c\xdc\x63\x09\xcf\x69\x78\xe6\xef\xf3\x64"
- "\xf0\x9a\x00\xca\xd9\x04\x68\xc6\xf0\x61\xcf\x99\xf9\xca\x34\x4c"
- "\x78\x7e\xe3\x5d\xca\x46\x1d\xf5\x3c\xf7\xdd\x5e\xe6\x37\x3d\xff"
- "\x2e\x8d\xba\x38\x9d\x52\x5b\xd8\x97\xfe\xe6\xbd\x00\x86\x87\xb6"
- "\x0d\x39\x41\x75\xf7\xc6\xca\x98\x5d\xea\x32\xa5\x07\xeb\xd2\x79"
- "\xfd\xfd\x22\xeb\x95\x36\x1c\xfb\x11\x5d\x5c\xb9\xba\x0c\x03\x0f"
- "\xc0\x38\xd4\x17\xee\x17\x4f\x87\xba\xa2\xbe\x60\xad\x7d\x4d\xc6"
- "\xe6\x72\xad\x7b\x8d\x7d\xfc\x22\xd9\xfb\x6d\x1c\x2f\x19\x63\xe7"
- "\x96\x00\x2d\xd8\x44\x16\xd7\x49\x5e\x93\x99\x42\xfb\x6b\xb2\x68"
- "\x33\xe6\xe4\xa2\x33\x73\xc8\x2b\x67\xd8\x9f\x40\xe9\x10\xb6\x49"
- "\xf9\x1c\x9b\x58\x90\x99\x5e\xf9\x9a\x61\xc3\xbf\x79\x6b\xe9\x59"
- "\x32\xa9\xef\x51\xbc\x39\x76\xa2\x5d\x84\xd7\x9b\x34\x47\x0d\xc7"
- "\x17\x4a\x0d\xf2\x3e\xb8\xc3\x88\xd9\x23\x6d\x1f\x27\x64\xae\xd3"
- "\x96\xba\x76\x3e\x8d\xe2\x38\x63\x56\xbf\xb2\xe5\xd4\x78\xfd\x66"
- "\x21\xf0\x4b\xd7\xf7\xd0\xd3\x55\x1c\x9f\xda\x6d\xb5\x67\x50\x97"
- "\x7a\xff\x6a\x04\x73\x18\x09\x77\x3e\x8d\xac\x39\x43\x99\x6c\x07"
- "\x15\x7c\xae\x6c\x36\x9e\x17\x4e\xe9\xb0\x8a\xc8\xff\xcd\xa4\x4d"
- "\x27\x7a\xe3\x90\xf9\x17\x70\xec\x32\x61\xeb\xeb\x7c\x70\xe5\x50"
- "\xe9\x47\x23\x63\x5f\xa8\xef\x95\x11\xad\x7f\x99\xcc\xfc\x7d\x4e"
- "\x5e\xcb\xe3\xb5\x61\x3e\x4b\xa3\xc6\x90\xb7\xcc\x46\x7c\xa6\x3e"
- "\xf7\xe6\x3c\x6a\xbe\xa3\xf5\xc7\xfc\xcb\x1f\x6c\x68\x58\xc4\x63"
- "\xc6\x5b\xb9\x7c\x7e\xa7\x77\x8e\xf3\xd6\x68\x7e\xc7\x69\xec\x5f"
- "\x9e\x23\x69\xf9\x56\x09\xcf\x7b\xf4\x39\xe3\x47\xf6\x9e\x34\x65"
- "\xc3\xf0\x58\xc6\x38\xd4\xaa\x75\xe4\x41\xc0\xa5\xca\x18\xcf\x78"
- "\x5c\x57\xdf\x06\x7d\x6b\x8b\x2f\xe9\x77\x7d\x9e\x05\x31\xd6\xd5"
- "\xa5\xef\x18\xc7\x5d\x72\xbf\x75\xc4\x18\xdf\xe4\xb7\x1f\x56\x0e"
- "\xbb\x7b\xc1\x12\x1a\xfe\xc0\xe5\x16\x19\xf3\x80\xbf\xf1\xa8\xc6"
- "\xdd\xb7\xc2\xbd\x7b\x54\x39\x92\xde\xf2\xbb\x6e\x3c\xc7\x30\x61"
- "\x0c\x56\xb1\xc6\x3a\xd4\xf8\x6b\x9c\x2f\xfe\xf9\xe5\xbd\xf5\xfc"
- "\x7c\x5c\xcf\x38\x8a\x3a\xd8\x57\x82\xe1\x2b\xdb\xe4\x2d\x2e\xcb"
- "\xe7\x59\x73\xd4\xf8\xfa\x96\xff\x02\xb6\x58\x26\xd3\x57\xd3\xe7"
- "\x93\xde\x8e\x7f\x29\xfa\x3a\x29\x79\xcc\x7a\xb2\x7d\x54\xe6\x33"
- "\x0f\x52\x31\x73\xac\xa8\x7f\x2d\xbf\x67\x5e\x6f\xb8\x91\xd7\xe2"
- "\x7e\xfe\x85\x97\xc7\xed\xee\xfc\xb4\xa9\x3c\xd7\x97\xb6\xf8\xcf"
- "\x5b\x47\xa3\x1c\xd2\x86\x7c\x78\x2a\x64\xae\x5c\x4a\xa3\xf8\xfb"
- "\x89\x48\x97\xdf\x86\xf2\x7f\xeb\xe9\xe0\x35\x19\x64\xbb\x66\x3d"
- "\xfb\xd8\x6f\x21\xcc\x2f\xe5\x7e\xa3\xac\x7f\x9d\xb5\x8e\xe3\xac"
- "\xbd\xd7\xe5\xeb\xa7\xfa\x6a\xcb\x26\x3c\x67\x46\x3d\xdf\x66\xac"
- "\xe5\xfb\x68\x4b\x8d\xdc\x0f\x64\x3f\xe2\x79\x3c\x5e\x87\xec\xbd"
- "\xbe\x37\x5b\x36\x29\x5c\xb6\x6c\xda\x5f\x4c\xbc\x56\x7d\x64\xb3"
- "\x8c\x99\xb4\xa5\xd8\x47\x6f\x6d\xd7\xd7\x63\x0e\x49\xbe\x62\x7b"
- "\xf7\x67\x3c\x07\xfb\x57\xc3\x5a\xe4\xe3\x71\xa2\xc0\x49\x39\xca"
- "\x86\x0f\x65\x6b\xe0\x9f\xde\xf6\x6f\x49\xe1\xb5\xbe\x84\x3a\x71"
- "\x03\x91\x2c\x53\x11\x74\x4a\x3f\xae\xb5\x43\x78\x9e\x64\x11\x15"
- "\x5f\xd9\x71\x4d\x03\xcf\x65\xe1\x9a\x8e\x6b\x26\xae\x19\xb0\x1d"
- "\x7d\xcc\x97\x98\xc3\xda\x30\x4f\xb0\x74\xa6\x04\x8b\xfb\x3a\xff"
- "\xc7\xb4\xf1\xae\x7a\x88\x94\x5f\xea\xdb\xe5\xcd\xe8\xcd\x69\x9b"
- "\x88\x16\x84\x45\x97\xfd\xdb\x7c\xce\xe6\xed\x72\xd7\x26\xf6\x07"
- "\x79\x7b\x7a\xac\x3f\xc8\xdb\xb8\x7b\x7b\x07\xd1\x2f\x2c\xf8\x65"
- "\xe3\xbe\xbc\xf7\xf7\x8b\x92\xa0\xfb\x6d\xcc\x57\xb7\x48\x1b\xeb"
- "\xe2\x74\xe2\xdb\x6a\x7f\x9d\xe7\x45\x29\x7f\xcd\x51\xed\xb5\xe6"
- "\xe1\xd9\x22\x06\x5a\xab\xf4\xf6\xe6\xe0\x39\xdd\xee\xc2\xb8\x96"
- "\x02\x9a\x0c\x43\x9b\x07\x0e\x21\x6e\x2f\xe3\xdb\x99\xf2\x95\x3d"
- "\xfa\xec\x23\xc3\xe4\xf6\xfb\x53\x42\x0c\x8f\xc4\x75\xf3\x1a\x0c"
- "\x7a\xea\x74\xe2\x7d\x23\x53\x27\x60\x28\x3b\x08\xf9\x01\xc3\xc8"
- "\xdf\x43\xfb\x61\x24\xed\x26\xae\x0b\x73\x62\x8b\x71\xae\x32\xe8"
- "\xfe\x45\xd1\xc7\x45\x6a\xff\x80\xcb\x06\xa2\xca\x72\xac\x81\x44"
- "\xe5\x51\xa7\x2c\xcf\xb8\x1e\xa7\xb7\x57\xa8\x7a\x7f\x31\xb3\x2f"
- "\x59\x2a\x1b\x01\xfb\xae\xc6\xc7\xf1\x08\xd8\x1e\x1a\xe7\x1d\x1e"
- "\x20\x6f\x8d\x86\x31\x3f\x94\x97\x53\x26\x1a\x8e\xd3\x7f\x8c\x68"
- "\x09\xb5\x5f\xe4\x78\xf8\x0b\xf5\x8d\xb0\xae\x72\xf2\x96\xde\x2c"
- "\xbf\x1b\x7c\x8a\xb6\xfe\xd8\xeb\x97\xf1\xb7\xf9\x7e\x3c\xbf\x67"
- "\xdf\x07\x1e\x1b\x30\xc7\xee\x89\x5f\xa7\x21\xef\x66\x4e\x47\x9a"
- "\x37\xe0\x97\x71\xee\x7a\x7d\xb3\x83\xf9\x4a\xa6\xb6\xa6\xc8\x73"
- "\xef\x8c\x6f\xf8\x87\x0d\x8c\xb3\xe6\x09\xe6\x73\x1b\x5c\x98\xff"
- "\x79\xc3\xc1\x06\x96\x09\xfb\x22\x5e\x2b\xfc\x8f\xcf\xc1\x77\x42"
- "\xab\x08\xe6\x5f\x5c\x1b\xfe\x43\xce\x69\x5c\x61\x71\xca\x9f\x12"
- "\xcc\x67\x9b\xa4\xb2\xac\x9f\x65\x42\x8d\x68\xe8\x4c\x0d\xe5\x05"
- "\xdd\x5b\x2d\x1f\x3b\x55\xdf\x5c\x1c\xdc\xad\x16\xa3\xed\x9b\xf5"
- "\xb6\xa3\x2e\xb9\x37\x37\xa6\x5a\xc5\xf5\x43\x9e\x9c\x3e\xd7\xac"
- "\xd0\xcf\x6c\x0f\xb0\xdf\xa8\x4e\x8b\xaa\x9e\xb1\xe1\xe2\xf0\x38"
- "\x2f\x66\x5a\x82\x3a\xba\xf5\x3a\x02\xff\xcd\x3a\x02\x17\xaa\x03"
- "\xba\xe1\xca\x13\xf4\xcb\xf2\x8b\x9f\x3b\xfe\x32\x57\xf2\x8a\x27"
- "\x94\xa3\x74\xe6\x7f\x7e\x19\xc1\xfc\x2d\x9c\x66\xcd\x93\xdf\xf8"
- "\x31\x51\x39\xc7\x38\x0c\x7b\xfe\x9a\xd3\xec\xec\xa2\x86\x45\x7f"
- "\xa6\x36\xfa\xe5\x1e\x2e\xd3\x0c\xed\x82\x79\x66\x55\xf7\xea\x50"
- "\x5d\xb7\x69\xeb\x21\xa6\xf7\x26\xf4\xc3\xc6\x28\x3e\x6b\x09\xfc"
- "\x99\xbc\x33\x79\x7d\xf5\x10\xaf\x6b\x57\x41\x3f\xe4\x69\xd0\x0d"
- "\xb0\xd1\x23\x92\x1e\xb0\x5f\xd4\x7c\x2b\x92\x2d\xe7\x5b\x7e\x79"
- "\xe6\x6f\xa0\x8c\x5d\xe8\x2e\x6a\xe2\xb5\xef\x48\x77\xbe\x3d\xe8"
- "\xa6\x3c\x8e\x69\xc8\xeb\xce\xc2\x72\x60\xfd\xb4\x70\xb2\x90\xf3"
- "\x29\xd8\xfe\x1c\xd3\xd0\x8b\x59\x65\x04\x76\x74\xcd\x39\xca\xa8"
- "\x81\xed\x09\x9d\x9d\xce\x7a\xbd\x56\x8f\x6b\xb8\xf6\x5c\x6f\x5c"
- "\xc3\xcd\xbc\xd6\xd3\x8a\xfb\x73\x64\x8e\x54\x44\xb2\x37\x9e\xa3"
- "\x91\x9b\x16\x51\xe6\x46\x5e\xcb\xfb\x42\xd9\x3e\x6c\x57\xc8\x18"
- "\x87\xcf\x66\xf2\x7a\x7e\xaf\xed\xb3\x98\x63\xb0\xf6\xe8\x2d\x39"
- "\x17\xbd\x38\x7a\xff\xa7\x1c\x07\xc3\x9e\xa0\x33\x9c\x36\x84\xba"
- "\x57\x7f\x65\x47\x1f\xf8\x41\xbf\xa2\x44\x7d\x6b\xf8\x36\xad\x8f"
- "\x8a\x4b\xf9\xf1\x48\xa5\xdf\x7d\xf4\xab\xb1\x7d\xf1\x44\x64\x63"
- "\x3e\x8d\xe9\xa0\x2c\xe5\xaf\x90\x82\x31\xf1\x57\xd5\xbc\x7f\x5e"
- "\xf6\x0c\xd9\x22\x1b\x67\x24\xb9\xde\xa4\x64\xfe\xa6\x34\xff\xca"
- "\xbe\x14\xed\x63\x8a\x28\x8b\xf7\x1f\xd8\xa7\xc1\xbe\x4c\xe6\x9f"
- "\x3b\xb2\x94\xb2\xa2\x61\x4f\x56\xce\x46\xb7\xdb\xef\x9d\xf7\xe4"
- "\xb3\xcf\x14\xcf\x2a\x99\xfb\xc4\xdc\xa2\xb9\x25\x4b\x64\xd8\x80"
- "\x51\xf2\xdf\x3d\xd7\x16\x4e\x97\x9b\xce\x51\xf6\xc5\xc8\xde\xf5"
- "\xb8\x6d\x23\x22\xbc\x7e\x70\x51\xf4\xfa\x55\x87\xbe\x8f\xe6\xdf"
- "\x24\xf7\x95\xb6\x8d\xf5\x25\x7d\x2c\xfd\xf0\xd7\xaa\x18\x32\xed"
- "\xca\x8f\x41\xe5\xd3\xd6\x58\x39\x06\xd1\xb8\x63\xf4\x5e\x3a\xef"
- "\x87\xa0\xaf\xb2\xbc\xa5\x27\x08\x76\xc8\x38\xde\x67\x69\xe6\xb5"
- "\x0c\x69\xfb\x6e\x7b\x53\x8e\x61\xa7\x64\x1c\xaa\x2d\xc7\xf0\xcc"
- "\x7e\xef\x9a\xc8\xdf\x18\x79\xd6\xb6\x45\x7b\xd6\xf6\x0b\x21\xf2"
- "\x37\x68\xa7\x1d\x1b\xc5\x69\xc7\x06\xe1\xd9\x9d\x09\x19\x1b\x7e"
- "\x82\xb6\xed\x0c\xbb\xe9\x5b\xf8\x0d\xe8\x8d\x21\xb0\xed\x0f\xb9"
- "\x6d\xa2\x1b\x3f\x4d\x78\xea\x27\x47\xed\xa1\xf1\x3b\x79\x66\xa3"
- "\x78\x3e\xfb\x52\x6d\x8b\x70\xdd\x62\x75\xfd\x0f\xfd\x2e\x47\x32"
- "\xf2\x47\x14\x2e\xef\x5c\xee\x5d\x75\x9c\xd4\xbe\xe9\x3b\xb6\x06"
- "\xb9\x66\xfc\xce\xaf\xb9\x1c\xef\xb3\xb1\x0d\xed\x6d\xe3\xb9\xc5"
- "\xaf\xb6\xb0\x1f\x1e\xdb\xcf\x9b\x86\x50\x7a\xd5\x10\x4a\x0b\xba"
- "\xdf\x99\xd8\xe3\x63\x61\x51\x63\x2a\x8f\x6b\x1c\x8b\x18\x3a\x27"
- "\xc8\x63\x24\xe3\xc1\x7c\x0a\x98\xc5\xbc\x07\xa7\xce\x15\xbd\x53"
- "\xea\xa3\x22\xff\xc5\xeb\xdc\x77\x64\x6c\x1b\x61\x72\x89\x31\x6b"
- "\x68\xa6\xdc\x1f\x55\x3e\x87\x66\xc8\xa5\x47\xb5\xe7\xdd\x2f\xe4"
- "\xfe\xf9\xa2\x93\x75\x90\x9b\xf2\xda\x2e\x4a\xd3\x3c\x07\xd6\xb0"
- "\x1d\xd3\x5c\x2a\xf7\x95\x2d\x28\xb7\x9d\xf7\x9d\xe5\xb9\x3c\x19"
- "\xe7\xfa\xcf\x54\x7b\x96\xcc\x6d\xf4\x4e\x88\xd7\xda\x7b\x69\xfb"
- "\xee\x14\xde\x5b\x11\xab\x77\x36\x58\x4b\x4d\x1e\x86\xa1\x9d\x3b"
- "\x95\x6d\x94\xc3\xd8\x3d\x80\xcb\x1d\xa3\x77\x6f\x92\xe5\x38\xaf"
- "\xfc\x3e\x62\xfa\x0c\x8c\x63\x4e\xce\x1f\xc6\xf3\x66\x2d\x3d\x4f"
- "\x40\xde\x22\x8b\x22\xdb\xf1\x6e\xba\xe6\xf9\xca\x8e\xb4\x7c\xb9"
- "\xc6\x8b\x79\xb9\x8c\x77\x62\xf9\x34\xcb\xeb\xfb\x57\x83\xc4\x87"
- "\xfd\x58\x4b\xa0\x9b\xa4\xdd\xf7\xee\xf3\x9b\xbf\x20\x73\xf1\x1c"
- "\xee\xc3\xf7\x6c\x3a\xdf\x6c\x55\xf8\xbd\x77\x79\xe7\xea\x0f\xa9"
- "\xd3\x12\xca\x0a\x98\x2c\xb4\xdf\x16\x62\x9d\xe8\xdb\x6f\xeb\xc2"
- "\xdc\xe1\x5d\x9f\xcf\xb4\x33\x4b\xd9\x1c\xaa\x1c\xef\xed\xc0\x1e"
- "\xed\x48\xb6\xa5\x4f\x0d\xba\xdf\x23\xc3\xbf\x82\xbf\x29\xce\x7b"
- "\x3c\xa0\x6f\x2b\xd3\xcd\x47\xdb\x8a\xe4\x3a\xff\xca\x47\xdb\xd1"
- "\x9e\xfe\xec\x03\xc7\x74\xe6\xf3\x0d\x56\xdc\x8b\x45\x22\xdb\x1a"
- "\xce\x31\xd5\xca\x73\x8d\xf2\xbc\xfc\x58\x3d\x66\x4b\x96\x1e\xc3"
- "\x65\x14\x3f\xab\xf3\xf6\xef\xf5\x9c\xff\xe7\x38\x35\xec\x3b\x10"
- "\xd1\xfd\xea\x64\xfc\x96\x33\x6a\x7f\x94\xfd\xea\x78\x7d\x90\xcf"
- "\x07\xf2\x1e\x26\xca\xd5\xf5\xf8\x39\xca\x73\x31\xef\x6d\x37\xe2"
- "\xb6\xe0\x7e\x6f\x8f\xbf\x0e\xda\xde\xe9\x09\x65\x06\xd2\xac\xbe"
- "\x80\x27\x58\x8c\x77\xad\x90\xdb\x0b\xc5\x0d\xe4\xef\xbb\x10\xc7"
- "\xb2\xd0\x52\x0f\xd4\x73\x3c\x8b\xfd\x01\xd2\xcf\x04\x6f\xbf\x4d"
- "\x3f\x3f\x9e\x7c\x8a\xde\x3b\xdb\xbb\x97\x18\xd1\xd7\xc1\xb6\xcf"
- "\x54\x76\xd8\xf6\x99\x72\x1d\x6c\x75\x28\xfd\xe7\x4b\x43\xa6\xed"
- "\x4b\x7d\x26\x75\x4e\x60\xfb\x74\x1f\xd5\x7b\x0c\x7f\x14\xe4\xcb"
- "\xe8\x2b\x96\x95\xf0\x34\xad\x51\x30\x7f\x2d\xd7\x30\x7a\xe7\x35"
- "\xbf\x56\xfb\x64\x2b\x87\xcd\xd4\x78\x0c\x4c\xfd\x6b\x9e\xf4\xad"
- "\x28\x3e\xc3\xeb\x61\xfd\xd5\x1c\x4b\xe5\xd1\xfd\x22\x2f\x3d\x11"
- "\xfb\x3c\x84\x9f\x15\xcd\xb6\xb7\x19\x6b\xeb\xeb\x4c\x1a\xc7\x36"
- "\x16\xae\x3a\x11\xf0\x16\x07\x08\xf6\x95\xdf\x8b\x31\x15\x75\x08"
- "\xe8\x87\x01\x28\x73\x39\xd3\x5e\xc9\xd0\xaf\xd7\x4a\x9c\xdc\x77"
- "\x0a\x17\xdb\x95\x7e\xf6\xed\x38\x43\xc8\x37\x18\xf9\x26\x35\x96"
- "\x76\xb0\x7f\x4a\x39\xc7\x90\x6b\xd3\xeb\xf6\xa7\x34\xad\xb9\x26"
- "\x8d\x66\x06\xdd\xbf\xce\xf7\xd1\x4a\xdb\xc5\xcb\xf6\xaf\xf3\x2f"
- "\x64\x63\xa8\x31\x2f\x87\xfa\x9a\xa7\xf0\x3c\xf4\x46\xd4\x3f\x45"
- "\x30\xfe\xbf\x99\x14\x36\x85\xa8\xdb\x34\x40\x7c\xb7\xdc\x49\x61"
- "\xf7\x00\x11\x59\x8a\xfe\xea\xb4\xc1\x8e\x6d\xa2\x96\x70\xa3\xf4"
- "\xfd\x80\xcc\x5a\xcb\x02\xe2\x8c\x37\xbc\x43\xfa\xc2\xaa\x33\xe3"
- "\xbf\x19\xef\x0d\xef\xa3\x96\x62\x3f\xb1\x5e\x38\x46\xbf\xb9\x9e"
- "\xf1\xba\xb1\xb8\x9c\x46\x9f\xe2\xf7\xbf\x6e\x57\xe3\xdf\x6f\x26"
- "\xea\xd7\x0c\x8e\x35\x18\x8d\xd3\x3d\x0b\xe7\x3d\x59\x32\xf7\xd9"
- "\x79\xa3\x73\x67\x2f\x9a\x5d\x64\xbf\x5f\xb9\xd2\xc5\x8c\x4b\x96"
- "\xde\x18\xca\xef\xcb\xb1\x82\x6d\x10\x8e\xa5\x7c\xa1\x38\xca\x46"
- "\x0c\x65\xe8\xb5\x91\xbc\x6e\xf7\xbf\x19\x47\xd9\xb0\x31\x38\x86"
- "\x72\xef\x1a\xf6\xfb\x87\x7a\x64\x40\xfb\x28\xc8\xcf\x7c\x4e\x52"
- "\x73\xff\x26\x8f\xe5\x68\xb3\xf4\x3b\x7b\x7f\x72\x74\xdc\x1f\xf6"
- "\xb1\xe3\x75\x0f\xa4\xcf\x34\xce\xa4\x82\x17\x31\x56\xbc\x5f\xdc"
- "\x7b\x46\xe6\x7d\xe8\xff\x5f\xef\x55\xf2\x2b\xf3\xae\x31\xf6\x7a"
- "\xf5\x6f\x57\xc9\xbd\x69\xcd\x1d\x9c\xa8\xd6\x57\xde\x7f\x69\xb3"
- "\x36\xc0\xa2\xd6\xf6\xdf\xaf\x37\xce\x5f\x29\xd9\xfc\x48\x97\xcd"
- "\xf7\x0f\x5d\x68\x3f\xbe\x57\x36\x76\xa4\xf5\xca\xf5\x3f\xf5\xb2"
- "\x3b\xd2\xbe\x6e\x2f\x5f\xb7\x73\x2f\x3b\x41\xbb\x46\xf0\x9a\x0b"
- "\xee\xaf\xc2\xbd\x3c\xf7\xa9\x7c\xd1\x77\x7e\xae\xdf\xa3\x8e\x9d"
- "\xcd\xfa\xfd\x15\xb8\xdf\xa9\xdf\x0f\xc3\xfd\x26\xfd\x1e\x32\xbb"
- "\xf3\x79\xfd\x3e\x03\xf7\xcf\xe8\xf7\xd0\xf1\x3b\x1f\xd4\xef\x87"
- "\xe2\x7e\xbc\x7e\x7f\x39\xee\xaf\xd5\xef\x21\x83\x3b\x07\xea\xfb"
- "\xa2\x16\xe0\xfe\xd5\xc5\xdb\xdd\x3b\x1a\xd5\xde\xdb\x4e\x33\x74"
- "\xa5\x7e\x56\xad\x27\xcd\x06\x9e\x76\x18\xf4\x45\x3a\x9f\x35\xb7"
- "\x20\x3d\xcb\x47\x6f\xa5\x47\xa5\x6f\xd3\xf3\x4f\xc6\xf8\xd2\x16"
- "\x95\x5e\xa7\xa7\xcf\x84\x6d\x39\x36\x2a\x7d\xbd\x9e\xee\x84\x5e"
- "\x2c\x8a\x4a\xf7\xe8\xe9\x55\x3e\xaa\x99\x18\x95\x5e\xaa\xa7\x6f"
- "\x35\xfc\x10\xf4\xf4\x62\x3d\xbd\x01\xe9\x81\xa8\xf4\x42\x3d\x1d"
- "\xfa\xff\xfd\xa3\x51\xe9\x52\xaf\x54\xca\x73\x5b\x56\xb1\xbf\x94"
- "\x65\x6b\x27\xef\x11\x46\xe3\x9c\xab\xca\xee\xca\x40\x7a\x5a\x54"
- "\x7a\x8e\x9e\x3e\xca\x47\x9f\x6f\x89\x4a\xef\xd3\xf6\x4d\xaa\xa6"
- "\x99\x7d\xad\x4d\xf2\xb7\x7e\xa4\xff\xa3\xb4\x19\x77\xcf\xe5\x33"
- "\x5d\xd6\x4d\xe2\x98\xbd\x4c\x88\x63\xb4\x3b\x4f\xf7\xfb\x2b\x65"
- "\x3f\x2c\x75\x36\x6e\x77\xb6\x3c\x2f\xc5\x71\x0c\xf9\xbc\xdc\x52"
- "\x4e\xdb\x25\x63\xe5\x8d\x71\x96\xab\x18\x87\xca\xaf\xb4\x43\xce"
- "\xd1\xf5\xfd\x4b\xe4\xe1\x6f\x24\x12\xc3\xe1\x75\x3c\x6f\x49\x97"
- "\xf4\x75\xe4\x39\x12\xa7\xf1\x5c\x55\x9e\xa1\x8a\x9a\x2b\x29\xbd"
- "\xbf\x7b\xae\xc6\x67\xdc\xdd\x6a\x3e\xcf\xb2\xc8\xf9\xd9\xe7\x26"
- "\x3a\xaf\x8f\x76\xcb\x79\x6e\xb2\x6d\xf0\xdb\x41\xf7\xee\xc9\xbd"
- "\xe7\x7a\x76\xd5\xe9\xe9\x5b\x90\x3e\x33\x2a\x7d\x4d\xdf\xba\x1d"
- "\xfa\xce\xb2\xcb\xd2\x7d\x4e\x04\xc2\xe7\x44\x68\xdd\x7f\x01\xef"
- "\x39\xf2\x8c\xca\xb7\x23\x9e\x5d\x36\x3d\x5e\xc4\x67\xe1\x45\xc2"
- "\x0f\x9d\xcd\x71\xfa\x2f\x99\x1a\xf0\xd3\xd4\xe2\xa0\x58\xfb\x04"
- "\xfb\xcf\x9d\x95\xb1\x93\x5c\x1d\x1c\xc3\x98\x7d\xb2\x02\xbc\xef"
- "\x93\xd6\x82\x31\x6e\xf3\x1c\x7e\xff\x0f\x9a\xe2\x80\xed\xed\x88"
- "\xd0\x66\xc0\xde\xf4\x84\xe1\x0f\xc9\x31\xe0\x75\x1f\x45\xe0\xc0"
- "\xf5\xb9\xe4\xf7\x36\xea\x65\x6c\x0e\xfe\x9e\x98\x58\x3b\x24\x5d"
- "\xfc\x8e\xed\xd7\xe0\x4c\xeb\x0a\xc2\x5c\xa9\x7e\x1c\xee\xf3\xe4"
- "\x8f\xdf\x21\xbd\xaf\x36\x29\x59\xae\x77\x2a\x5d\xb3\xcb\xa3\xf4"
- "\x45\xbd\x53\xbc\xc5\x67\x74\xea\xf9\xfc\x8b\x05\xb6\x72\x42\xbf"
- "\xaa\xe5\x9b\xc8\xd4\xbd\x1a\xb6\xc9\xa9\x7a\x93\xd2\x4f\x7b\x1c"
- "\x9a\xc9\xb2\x82\xd7\x0b\x65\xac\xfd\xd5\x07\x0e\x6e\x9b\x17\x32"
- "\x35\x2f\x6d\xe3\x53\xdb\xb6\x19\x21\xf6\xff\xae\xff\x62\x50\x09"
- "\xc7\xad\x0a\xa5\xc3\xee\x34\xbd\x8f\xf7\x1f\xce\xab\x37\x85\xa5"
- "\xbd\xb2\xc7\x21\xd7\x98\x3c\x07\x6a\x78\x0c\xf1\xb6\x46\xd8\x66"
- "\x4e\x83\xcd\xbc\x06\xfa\xdf\x12\x59\xec\x18\x12\x5e\xe0\xb8\x64"
- "\xd3\x7c\x4a\x8b\x2c\xc8\xcc\x78\xe5\x1c\x65\x1b\xe3\x0f\xe6\xa6"
- "\x59\x22\x68\x4b\xad\xc4\x98\xc2\x73\xd7\x41\x49\xe9\x72\x2f\x8d"
- "\xef\x35\x53\x6d\xde\xe6\x45\x17\xfe\x6e\x48\x04\x73\x56\x8e\xe5"
- "\xcb\xb8\x24\x6a\xeb\x9a\x0d\x98\x07\xeb\x67\x4a\xcb\x3e\xa7\xa1"
- "\xb0\x73\x4d\x83\xce\x8a\x86\x13\x45\x64\xe2\x6f\x2d\x94\xcd\x96"
- "\xeb\x43\xfd\x9a\x1d\x61\xf2\x3a\xff\x4e\x65\xf3\xb9\x8f\xf6\xec"
- "\x63\x3b\x8d\xfd\x21\x91\x3f\xfd\x04\xed\x69\xb6\x86\x30\x66\x84"
- "\x60\x3b\x3f\xc5\x73\xbd\x3d\x9f\x05\x64\x2c\xd1\x0f\x46\xb2\x4f"
- "\x78\xc3\xfc\xbb\x39\x2d\xe2\xfa\x5c\xfa\x3e\x94\x2b\xd9\xda\xd3"
- "\xca\xcf\x2e\x3e\xe3\x9a\xfa\xa7\xc6\x77\xbb\x42\xfd\xd4\x1a\xc4"
- "\x9e\xbf\xe9\xe3\x03\xa9\x39\xd7\x9e\xf3\xce\xe2\xf5\xac\x8d\x7a"
- "\x3e\xc8\x14\x1c\x5f\xba\x26\x4c\x53\x03\xc2\x27\xf7\x29\xf9\x6c"
- "\xbf\xf3\xce\x06\x71\xae\x8a\xd4\x79\xb4\x0f\x36\x69\x15\x1f\x64"
- "\xaa\x18\x80\x1f\xc8\x18\x9d\x72\xcd\xb2\xe2\x83\x6c\xb5\x46\xfb"
- "\xc1\x64\xb5\x66\xf9\x41\xfe\xca\x61\xec\x83\xfc\x41\x4d\x67\xca"
- "\x07\xb0\x99\x3f\x28\xee\x4c\x3d\x94\x90\x3f\xd4\x78\xb4\x3b\xdf"
- "\xfe\x6d\xca\xe0\xb5\x72\xf6\x27\xae\x55\x7e\xc4\xa8\xe3\xb7\xec"
- "\x57\xcc\xef\xae\x3a\x56\x4c\xc9\xbc\xbe\x88\x7a\x4f\x8e\xa9\x21"
- "\x3b\x70\x1d\x28\x2c\x1f\x58\xa4\xef\x96\xe7\x03\x9b\xb7\x43\x34"
- "\xb0\xcf\xa0\xda\xd3\xf8\xed\x36\x91\xf2\x81\x45\xe5\xff\xed\xf8"
- "\x96\x0e\xb4\xc1\xb2\xa7\xd5\x1b\x3a\xa9\xdb\x84\xbf\x05\xef\xef"
- "\x69\x15\x9e\x3d\xed\xea\xac\xf8\x6f\xd7\x1a\x7a\x55\xf1\xe8\x6f"
- "\x57\x28\xba\xed\xce\x57\x74\xfb\xed\x36\x7d\xbc\xba\x8a\xef\x31"
- "\x76\x67\xa9\x3d\xf8\xdf\x3a\x0d\x1b\xd9\xa7\xe7\xe1\x32\xb8\xd7"
- "\x63\xe1\xfc\xb6\x1a\x6d\xd7\xe7\x2d\xbf\x95\xdf\x0a\x43\xfb\x30"
- "\x66\x7d\x70\x84\xdb\xd5\x97\x6e\x95\xb4\x28\xa5\x64\xe0\xcc\xe7"
- "\xd9\xd9\xc7\x38\xe0\x0d\xdc\xd9\xa0\xbe\x07\xb8\xef\x56\x79\x66"
- "\x16\xf5\xa0\x7f\x4c\xac\x37\xf9\x8c\x2f\xc3\xeb\xc5\x7f\xef\xe5"
- "\x06\x2e\x5c\x1f\xbf\x43\x5b\xf9\xbb\x62\xa0\xd5\x1e\x39\x9f\xe6"
- "\x7e\x3d\x5e\xcc\x6b\x17\x67\x41\x33\xf6\x03\xda\x37\x91\x69\xa2"
- "\x68\xb6\xcf\x2e\xe9\xd1\xd3\x0f\xfb\x2e\x8b\xa5\x87\x7a\xd6\x2c"
- "\xd0\x0d\xf3\xd9\x1f\x64\xdf\x44\x9d\x7e\x1d\x7a\xfd\x5f\xea\x73"
- "\x75\xbc\xdb\xfb\xcb\xa8\xb2\x57\xf6\xe4\x55\xdf\x9e\x34\xf1\xde"
- "\x2a\xaf\xb5\x2b\x7e\xdd\x7b\x24\xaa\xdc\x91\x82\x2f\xd9\x46\xde"
- "\xd9\xca\xdf\x0a\x64\x9a\x07\xdd\x7b\xdb\x7b\xe9\xad\xe0\x24\xa8"
- "\xe3\xdb\x46\x1d\x3e\xda\xbb\xd5\xc0\x13\xf7\xfa\x18\xbc\x6f\x54"
- "\x6f\x9f\xec\xcd\x35\xca\xb1\xff\x3e\xfa\x28\xc4\xe7\x05\x13\xea"
- "\x41\xde\xd3\x19\x0e\x1d\x1c\xbe\xb3\x41\xf2\x23\xed\xdb\xc2\xbe"
- "\xae\xa0\x6b\x48\xf1\xd0\x3e\x8f\x1a\x0b\xf7\xc9\xd8\x2d\xbc\x5f"
- "\xc2\xb1\x88\x51\x5f\x0d\xe0\xd6\xeb\x38\x6f\xd7\x71\xc0\xfc\xef"
- "\x83\xad\xf1\xf3\xba\xbb\x67\x15\xca\x83\xb1\xa3\x17\x16\xc7\xc7"
- "\xa9\xb4\xf4\x9e\x81\xdc\xd7\x11\x75\x86\x74\xbb\xa2\xf7\x87\xd9"
- "\x98\xa7\xee\x58\xa7\xe6\xad\xf5\xeb\xd0\x67\xae\xb3\xff\x1f\x7b"
- "\xef\x03\x17\x75\x95\xee\x8f\x9f\x19\x06\x1d\x74\x60\xd0\xa8\x26"
- "\x43\x9d\x4a\xdb\xb1\x55\xa3\xcd\x76\xdd\x5d\xdb\xa5\xb2\x5d\xb7"
- "\x4d\xa1\xd6\xee\xb2\x37\xff\x20\x82\x8b\xa5\x38\x21\x22\x1a\x02"
- "\xa2\x71\x81\x1d\x90\x55\xf0\x4f\xfc\x91\xbd\xd7\xf6\xd2\x5e\x2b"
- "\xbb\x6b\xf7\x4b\xbd\xac\xa6\xfc\x87\x09\x0c\x16\x16\x1a\xe6\x88"
- "\x68\x64\x68\x23\xa0\x8c\x30\xf3\x39\xbf\xe7\x39\xe7\xf3\x61\x66"
- "\x80\x81\x61\x40\xb3\xdf\xca\xeb\xf5\x79\x7d\xf8\x9c\xcf\x99\xf3"
- "\x39\xe7\x79\xde\xe7\x79\x9e\xf3\xef\x79\xc8\x18\x8c\xb1\x91\xa2"
- "\xa7\x17\xaa\xf5\x30\x96\x56\x1e\xc2\x18\x31\x4d\x29\x57\xc8\x08"
- "\xdc\x4b\x81\xf2\x06\xf7\x6a\x52\x3f\x48\xcf\x3a\xd4\xe4\x38\xa7"
- "\x66\x6c\x84\xb1\x6d\x59\x0e\x8c\x65\x53\x2f\x92\x31\x7c\x6f\xc4"
- "\x07\xab\x70\x4e\x87\xa6\x46\xbc\x2a\x64\x1e\x6a\xc6\x33\x90\xd5"
- "\x30\x22\xa4\xa9\xb1\xaf\x0a\x59\x87\x00\x8b\x87\x6c\xa9\xcb\xc9"
- "\x68\xd4\x6f\x38\x37\xc4\x31\x63\x3c\x00\xe5\xa2\xdf\xa4\x52\x81"
- "\x46\xc8\xa8\xf2\x70\xa8\xa0\xac\xcc\xcc\x11\x08\xdb\xfb\x0d\x38"
- "\x93\x37\x90\x0f\x0e\x52\xbf\xc3\xa1\x18\xfb\x0f\xe7\x79\x4c\x56"
- "\xa8\x67\xd6\xe1\x50\x78\x17\x00\xef\x2e\xc3\x5d\x40\x5f\x65\xe8"
- "\x1f\x1b\xca\x67\xfa\x93\x66\x1e\x0e\xe5\x75\xb7\xb0\xbc\x0d\xe4"
- "\xc3\x89\x98\x47\xf2\x81\x26\xa4\x46\xf8\xe0\x7b\x3c\x53\x6b\x87"
- "\xdf\x99\xa0\x87\xf2\xdf\xd4\x75\xfd\x46\xb4\x9f\xa1\x2f\x1b\xdf"
- "\xa7\xd9\x35\x5a\xc8\x5b\x8e\x7b\x4d\xb9\x2d\x6b\x2c\x17\xfb\x3a"
- "\xd8\xc7\xc6\x77\xc5\xff\x55\x5d\x79\x53\x23\x48\xca\x35\xa2\x61"
- "\xeb\xa5\xab\x7d\x40\xf6\x1a\x81\x2e\xb1\xc4\xa9\xcc\x73\x58\x9e"
- "\x01\x7d\xab\xc5\x10\x15\xc8\xe5\x91\x50\x6f\x8c\x31\x71\x06\xe7"
- "\x60\x45\xda\x34\x02\x9f\xf6\x6c\xe2\xfe\xf3\xf6\xe6\x00\xf6\x53"
- "\xd6\x81\x3d\xb0\x8e\xa8\xd6\xd9\x49\x30\xb6\x13\xf8\xd6\x84\xfb"
- "\xa5\x71\xec\x86\xb4\xe1\x3c\x3c\x3c\x0f\xda\x12\xbd\x2e\x96\x36"
- "\xae\x6b\xa6\x4d\x55\xb1\x75\x04\xf4\xcc\xe8\x6a\x7d\x0d\xfa\x7a"
- "\x3e\x83\x6d\xc5\xb9\x47\xa0\xe9\x3c\x33\x7e\x23\xeb\x70\x34\x9e"
- "\x81\x61\xf3\x04\xf2\xf7\xf7\x49\xe7\x85\x4a\xd8\x99\x22\xe3\xb4"
- "\xae\xf9\xae\x44\x7a\x40\xac\x4b\x85\x80\xff\x27\xb2\xb3\x7c\x23"
- "\x70\xfc\x83\x73\x1a\x0b\xd7\x94\x76\x9d\xbd\xe0\x73\x03\x46\xbd"
- "\x93\x0f\x2b\xf6\x5b\x9c\x23\xc0\xdf\x86\xd9\xe8\x95\x4d\x62\x5e"
- "\xfc\x6d\xd8\x9a\x85\x14\x7f\x0b\xbf\xd9\xd5\xf5\x1b\x97\xb3\x3b"
- "\x1f\x72\xbb\x02\x68\x8b\xff\x5b\x80\x96\xe2\xde\x28\x2d\x5f\xd7"
- "\x36\xd6\x4b\x6b\xc9\x66\xf2\x41\x3e\xe2\xa9\x77\xff\xcc\x1f\x29"
- "\x5c\xfd\x09\x7d\x54\x8b\xbe\x8e\x20\x3d\x58\xf2\xfb\x03\xff\xeb"
- "\xa0\x2c\x7e\xb6\xc9\xc9\x9f\x57\xae\x93\x6f\xc0\x54\x0b\x3d\x8b"
- "\x38\x01\xb9\xe2\x73\x81\x7c\x84\xbe\x19\x32\xf9\xf9\xa7\x8f\x0e"
- "\x62\x3d\x1b\xc8\x47\xf9\xf0\xac\xe6\x7e\x07\x3e\x7a\x45\x94\x1f"
- "\x49\x61\x76\x9b\xda\x0c\xdf\xc4\xb3\x3c\x4e\xcf\xc9\x20\x4f\x02"
- "\x21\xdf\x3b\xdc\x77\x1e\x5b\x51\x94\x75\x7b\x9f\xd6\xed\x39\xb4"
- "\xdb\xb3\xb6\x0d\xfa\x8d\xbb\x35\xf3\x9c\x31\x6c\xbe\xb0\x28\x60"
- "\x3d\xd1\xa7\x7e\x43\x7c\x00\x2b\xe7\xb0\x6e\xd5\x4d\xcd\xd8\x26"
- "\x35\x4d\x0f\x21\xa6\x26\x1b\xb7\x2d\x41\xa7\x37\x4c\x80\x3c\xdf"
- "\x90\x3b\x70\x3f\x37\xc6\x99\x80\xfc\x17\xb8\x5f\xe8\xfd\xf3\xe7"
- "\xad\x1a\x41\x84\x3f\x47\x8c\xa4\xf2\x70\xd4\xdf\xca\x37\x3a\xcc"
- "\xbe\xb8\x7e\x95\xb2\x03\x30\x69\x27\x77\x00\xc6\x1a\x31\xa6\x17"
- "\xc6\x5c\xff\xaf\x8e\x26\x5f\x93\xed\x24\xd1\xbf\x40\xe4\x17\xc8"
- "\xfe\x70\x45\x32\x51\x6c\x3a\x4f\x02\x81\xaf\xb6\xfd\xb6\xe9\x44"
- "\xf2\x1b\x50\x34\x9a\x9f\x79\x2e\x02\xf9\xba\x52\x43\xad\xed\xe9"
- "\x1f\xef\x36\x93\xbf\x19\xa5\x31\xb6\x81\xc7\x92\x50\xc0\xf7\xef"
- "\x92\x8b\x3e\x12\x38\x6d\x3f\xfe\x86\x9f\x9f\x0a\xfa\x29\xfc\xc6"
- "\xec\xb0\xbf\xf7\xf3\x7d\x84\x99\x95\xbb\xb9\xec\xdb\xbf\x6c\x3f"
- "\x8c\x96\x36\xf2\xbd\x07\x41\xed\xe9\xfb\x55\x5d\x7b\x0f\xd8\xbc"
- "\xd5\xfe\x65\xc0\xc3\xdd\xdc\x36\xaf\xdc\xbd\xd0\xae\x14\xfb\x20"
- "\xa6\xbf\x53\x87\xbf\x85\xdf\xa9\xdb\xd8\x1c\xd3\xfe\x59\x0e\xac"
- "\xed\x0f\x44\x99\x0f\x6d\x82\xf2\x3e\xde\x88\xed\x42\x9a\x40\x3e"
- "\xc0\xd9\xc7\x99\xfb\x77\xb9\xf1\xa1\xaa\xfc\xbf\x4c\x1b\x9b\x03"
- "\xb1\x2a\x01\x4f\x17\x81\x07\xb7\xa1\x9f\x24\x13\x7c\xa7\xaa\xa4"
- "\x83\x54\x69\x5a\x49\x35\xfc\x8f\x7b\x8c\x8d\x2f\x9c\x25\x8d\xda"
- "\xde\xf5\x8d\x00\xe3\x08\xb0\xb5\x35\x58\x16\xca\x02\xdc\x97\x65"
- "\x02\x0d\x56\x6d\x81\xb2\x1a\x09\x2b\xa3\x4a\x68\x22\x55\x49\x30"
- "\xce\x32\x8c\x0e\xac\x2e\x39\x49\xaa\x35\x9f\xb1\xef\xa0\x4d\x68"
- "\x8c\x6f\xed\xab\x6c\x1d\x94\x3d\x5d\x2c\xbb\x19\xca\x0e\x72\x5b"
- "\x76\x66\x7b\xe4\x00\xcb\xf6\xbc\xde\x99\xed\xe1\x03\x29\x1b\xf4"
- "\x8c\xc1\xa4\xe1\xe7\xb5\x52\xee\x22\xfe\xf6\xab\xe8\x23\x73\x3c"
- "\xe5\xfb\x5c\x0f\x3e\xc6\xce\x74\xa5\xb3\x7d\xc4\x99\xec\x6c\xd7"
- "\x25\xc2\xf6\x2a\xf2\xf3\x5c\xe7\x08\xee\x73\x68\x4f\x3f\x38\xd9"
- "\x31\x56\xea\x5a\x7f\x02\x5b\xf5\x60\x38\xdf\xcf\x78\x28\x93\xe3"
- "\xea\xa0\x2f\x96\xd5\x7b\x3d\x0e\xef\xe5\xfb\x62\x0f\x66\x49\xf3"
- "\x2f\xad\x7e\x87\xf7\x8a\x65\x69\xbb\xcf\xeb\x49\x41\x3d\x63\x92"
- "\x12\xa4\xf8\xa0\x09\xe2\xb1\xd2\x67\x63\x16\xc7\x2c\x4d\x8c\x89"
- "\xd6\xce\x5d\x15\x1f\x37\x65\xc5\x92\x25\xda\xd9\x31\x2b\x57\x2e"
- "\xfa\x73\xcc\x08\x32\x37\x7e\x51\xdc\xca\xa5\x38\xf7\xa6\xd5\xce"
- "\x7c\x78\x61\xec\x8a\x84\x29\xbf\x9a\x19\xd2\x6d\xee\x0d\xcf\x20"
- "\xd6\xa3\x0d\x0e\xba\xe3\x8e\x14\x3b\x19\x85\x3e\x6f\xd4\x6b\xa8"
- "\xf1\x65\x18\xff\x01\xfe\x2e\xa0\x9e\x42\xdd\x80\x63\x03\xf4\xb7"
- "\x07\xf2\xbb\xb2\x70\x2b\xad\x39\x4f\xea\xd0\xae\xac\xdb\xc9\x7d"
- "\xc7\xd5\xc3\x98\xdc\xc2\x63\xd6\x7d\x71\x0a\xfd\xc2\xfd\x05\xd2"
- "\x2c\x7e\x95\xbb\x37\x7d\x45\x14\xa0\xd7\x60\x5c\x72\xa8\x88\xca"
- "\x87\x53\xc3\x1d\xf4\x00\x3d\xab\x21\xa2\x3f\x6c\xb9\xc9\x6c\xc5"
- "\x75\x7a\x65\x98\x2d\x95\xa2\x3c\xe5\x7d\xeb\x50\x31\xa7\xcb\x7b"
- "\x3a\xbe\x5f\xf8\x8b\xf7\x71\x0c\xb3\x81\xc5\x14\x3c\x04\xfd\xff"
- "\xdd\x04\x87\x9c\x36\x55\x88\xb6\x23\xfa\xf1\x5b\xdd\x00\xcf\xdc"
- "\x27\xc7\xa1\x3a\xd7\x3d\x18\x15\xa0\x97\x3f\x6b\xe6\x17\xfe\xa6"
- "\x56\xc5\x2f\xfc\xdf\xf9\xfa\xa2\x94\x5f\xdd\xd3\x07\x7b\x49\xdf"
- "\xf7\xf6\xf7\x35\x69\x7d\x5f\x9e\x7c\x1f\xef\xdf\x67\xfb\x07\xf3"
- "\xfb\x9a\xcc\xbe\x2e\xc4\x1b\x60\xab\xfe\x2f\x5f\x11\x25\xe0\x33"
- "\x3f\x27\x0a\x30\x7d\x8a\x68\x92\x6d\xb4\x31\x75\x3e\x09\x4e\xf9"
- "\x86\x60\x4c\xb7\xa6\x84\x24\xda\x98\x72\x15\x6d\xd2\x1a\x8c\x71"
- "\x52\x9e\xdb\x40\x54\x39\x0d\x24\xb0\x3a\x01\xe3\xbd\xa2\x5f\x2c"
- "\xf8\x1a\x52\x08\x9e\x2b\x13\xad\xe4\xa8\xe5\x32\xee\x5b\x32\x56"
- "\x47\x82\xdc\xa9\x27\x04\xf1\xab\x8a\x24\x41\x45\x77\xd0\x7d\x34"
- "\x7d\xd9\x3e\x2a\x5f\xb6\x1b\xd2\x6a\xdf\x12\x42\x7d\xdf\x5a\x5b"
- "\xe1\xab\x8d\x42\x1d\x7f\x64\xbe\x88\xcd\x23\xfc\xac\x90\x89\xc5"
- "\x20\x83\x7e\x52\xcb\xe7\xd5\x6b\x9e\xe4\xfa\xbc\xe6\x76\x71\xbe"
- "\x09\xfe\x37\x31\x5b\x11\xda\x51\x8e\x31\x30\xb1\xcc\x37\x85\x72"
- "\x16\x03\xf3\xad\xb5\xa1\xbe\xc9\x8b\x88\xbc\xda\x0c\x9a\x12\xe4"
- "\x20\x6a\x30\xe8\x77\xbb\xa1\x9f\xed\x29\xbe\x83\xe6\x41\xfd\x0c"
- "\x25\x77\xd0\x4c\xa8\x53\x59\x7b\xfa\x91\x4a\xd0\x3d\x46\x71\xdd"
- "\xc5\x08\xfd\x62\x77\x0e\xe4\x09\x5b\x45\xc6\xe7\x40\xbe\x5c\xc8"
- "\x87\x76\x32\xaf\x5f\xd5\x5f\x81\x06\x7b\xe1\x9b\x35\xda\x05\xf8"
- "\x7c\x94\xf9\x00\xc2\x6f\x43\x3b\xb4\x0d\xe4\x68\x30\xe8\x36\x05"
- "\x7e\x43\xfa\x6e\x7b\xfa\x27\x20\xff\x0e\x24\x89\xeb\xbe\x79\xbc"
- "\x9c\x4f\x22\x78\x7f\x3d\x8c\xe7\xf9\xa5\x18\xa5\xaa\x9c\xb5\xa0"
- "\xd3\x3b\x98\xbf\xc8\x7c\x9c\x6f\x41\x1b\x83\xd9\x15\x76\xa2\xe6"
- "\xf3\x03\x60\x5b\xc4\x82\x1c\x00\x7b\x82\xed\x71\x06\x5b\x02\xea"
- "\x92\x8f\xb1\xf2\xf0\x3d\x8c\xdb\xf6\x82\x5e\xde\x83\x76\xc0\x82"
- "\x2b\x4f\x11\x9c\x63\xc7\x38\x97\x2b\xe7\x51\x2b\x8f\x41\xf2\x49"
- "\xb9\x64\x0b\xa0\x0c\x42\xfd\x0f\xb6\xb0\xa2\x13\x78\x08\x18\xa8"
- "\x00\xdb\x62\xd4\x05\xf2\x49\x9b\x48\xfb\x0a\xa6\xf3\x13\x99\x7f"
- "\x63\x1f\x2e\xa3\x8f\xe2\x5e\x78\x15\x7c\xa3\xc2\x4c\xea\xd8\x5c"
- "\x38\x97\x31\x47\x03\x25\x3d\x8e\x63\x5e\x33\x94\x41\x41\x96\x89"
- "\xef\xa0\xfd\x1f\x35\x4a\xdf\x84\x77\x46\x91\x66\x95\x40\x33\x2c"
- "\x93\x8d\xfd\xc1\xe6\xda\x2d\xd2\xa6\x12\xed\x0a\xf1\xb7\xb1\x52"
- "\xb9\x38\x2e\x17\xc0\xae\x40\x7a\x21\x9d\xa0\x9c\x4a\x51\x8e\xd5"
- "\x72\xfb\xa5\x6a\x0d\xe1\xeb\xed\x79\xc0\xeb\x8d\x0e\xfa\x1f\xdd"
- "\xed\x4c\x7f\xf8\xfd\x46\x91\x97\x13\x9d\x78\x07\x63\xa3\x4a\x1b"
- "\xce\x93\x42\x1d\xf7\xf1\x39\x9e\xa3\xe7\xd0\xaf\x18\xfa\x31\x06"
- "\x1a\xef\x33\xa0\xcf\x5c\x90\xcd\x1b\xbe\x02\x99\x1b\x85\xf6\x53"
- "\xa5\xe8\x17\xab\x72\x23\x62\x18\x9e\xd9\x3c\x7c\x23\xd4\x0b\xcb"
- "\x83\xe7\xe7\xe0\x0e\x76\x6c\xe5\x6c\xe7\x98\xb4\x8e\x78\xb4\x95"
- "\x33\x1d\xe7\x0c\x8e\xea\xf9\xf8\xf9\xa8\x1e\xe7\xc0\x58\xfe\xce"
- "\x58\xac\x5b\x3d\xf6\x4b\xa9\xad\x18\x9b\x16\xd2\xd1\xf6\xaf\x47"
- "\xbe\x49\xe9\xe8\x6f\x17\xf8\xa4\x82\x6f\x9d\x12\xeb\x84\xcf\x4a"
- "\x78\x66\x31\x07\x30\x4e\xed\x26\xfc\x4d\x8a\xe3\x37\xd8\x6f\x00"
- "\xc3\x6a\xc8\x73\x1c\xee\x54\xca\xcb\xe3\xd7\x56\xce\xdb\xd2\x81"
- "\x73\x60\x95\x09\x52\xfc\x5a\x8c\x5d\x8b\x32\x23\x67\x81\x0b\xed"
- "\x91\x36\xc8\x67\x86\xbb\xfd\xb6\x72\xa0\x77\x15\xd8\xff\xff\x27"
- "\xfa\xb8\xab\x9c\x27\xd6\xcf\xc8\xe3\x31\x1c\xcc\x2f\xd9\x2c\xf9"
- "\x58\xa8\x72\xac\xff\x77\xd9\x96\x95\xf3\x10\x93\x50\x56\x25\xf2"
- "\x1f\xed\x44\xc8\xb7\xac\x0b\x5b\xec\x1c\x6f\x65\x33\xda\x97\x62"
- "\xfd\x11\x2f\x55\x22\xed\xf2\x9d\xfb\x9d\x73\x3f\x87\x32\x60\xfc"
- "\xbf\xbf\x0b\x03\x52\xbf\xe6\x38\xa8\x3e\x27\xda\x14\x18\xcb\xaa"
- "\x06\xca\x35\xa2\x0d\xce\xf5\x6a\x75\xf9\xfe\x7a\x1b\xce\xa1\xd7"
- "\xc2\x33\xf4\xef\xea\xfc\xd6\x11\x35\xba\x8d\x4c\x6e\x54\x03\x1d"
- "\xa6\x32\x1f\x10\x48\x17\xa9\xbf\x6e\x5a\x80\x63\xbf\x10\xde\x67"
- "\x93\x1a\x49\xb5\xb5\x99\x88\x7b\xf8\xa1\xcf\x9e\xc3\xb5\xd3\x0b"
- "\x80\x21\x25\xf6\x5f\xe0\x2f\xe2\x19\x65\x4e\xcd\xc6\xad\xac\xdf"
- "\xaa\xb0\xdf\x76\xa2\x6f\x08\xf8\xce\x81\xc8\x50\xa8\xb5\x91\xf5"
- "\x63\xf4\xf9\x51\x08\xb4\xc3\x58\xb1\xf0\xed\x34\x69\xef\x31\x62"
- "\x04\x7d\x7c\x88\x38\xa9\xc0\xbe\x2c\xd2\x4e\x01\xf9\xca\xa4\xbe"
- "\xe7\xc4\x7f\x96\xa7\x5b\x7f\x53\xf3\xfe\x56\x5d\x27\xd1\xda\xc6"
- "\xfa\x71\x65\x82\x0d\xfa\xb1\x33\x4d\x91\x9e\x48\xd7\xf6\x74\x13"
- "\x94\x75\x20\x58\xa2\xa9\x83\x9e\xa6\x55\x22\xcf\x6b\xf8\x1c\x93"
- "\x69\xba\x38\xff\xd4\x45\x43\x11\x7f\x18\xe3\xb3\x7c\x03\xb6\x1d"
- "\x74\x03\x7e\x1f\x31\x52\x28\xca\xac\x03\x16\xc4\x88\x09\xfa\xff"
- "\x33\x4d\x0e\xd9\x51\x99\xc4\xc6\x2c\xc0\x27\xce\x1f\xd3\xdf\x98"
- "\x1f\x8d\x5e\x64\x87\x99\x54\x45\x3a\xe4\x93\x69\x8f\x44\x07\x09"
- "\x93\x52\xbf\x87\x32\xec\xae\xf2\xc7\x74\x06\xca\x18\x8d\xf2\xcd"
- "\x61\x43\x61\xfc\x37\x67\xf9\x66\xaa\x43\xf9\x86\xb8\xd6\x27\xe2"
- "\x1c\x1b\xd7\x57\x66\x72\x24\xcd\x55\x26\x1d\x59\xc5\xf7\x06\x70"
- "\x9b\x0b\xb1\xa5\x5f\xc0\xf3\xa3\x0e\x83\xfc\x6c\x2c\x2e\xea\x3c"
- "\xf4\x45\x8c\x69\xcb\x44\x7a\xd5\x43\xfe\x03\x78\x1e\x12\x7d\x20"
- "\x8c\xac\xe7\x63\x3d\x90\xd3\xfb\xd0\xd7\x35\xe4\x9b\x5c\x0d\x76"
- "\x7e\x67\x06\x97\xdd\x92\xac\xa0\x8b\x23\x46\xae\x6e\x22\x7e\xfa"
- "\x5f\xd1\xb3\xe7\xc9\x31\xf4\xc7\x6d\x45\x7f\x8b\x50\xb6\xf6\x3c"
- "\xf9\xec\x38\x7c\x37\x48\xbc\x6b\xe0\xfe\x3e\xdc\xef\x82\xfb\x6b"
- "\x70\xbf\x1b\xee\x39\x90\x5f\x10\xf3\x87\xc0\xf3\x2a\x48\x7f\x58"
- "\xbc\x43\x1d\x8f\xe1\xfe\xfb\x70\xd1\x76\xc4\xf4\xdf\xe1\x33\xdc"
- "\x7f\x2e\xf2\xbc\x92\xf3\xfc\xd8\x43\x50\x4e\x12\xd4\xbf\xce\x54"
- "\xcf\xca\xd2\x9f\x27\x9f\x5e\xc3\xb2\xf1\x7c\x32\xfc\xff\x86\x93"
- "\x0d\x0a\xe5\x1c\x3b\x01\xf7\x69\x70\x2f\x86\x7b\x02\xdc\x5f\x12"
- "\x69\x50\x83\xb2\x21\x3a\x89\xd1\x9c\xed\x79\xe0\xdf\xe3\x7d\x1e"
- "\xf5\xb0\x43\x76\x7c\x52\x19\x3d\x8f\xf3\xdb\x4c\xaa\x19\x0e\x20"
- "\xef\x63\x98\x17\xee\x4f\x88\xf7\x50\xf1\xfe\xa4\x78\xff\xad\x78"
- "\x9f\x29\xde\x61\x3c\x7a\x2c\x41\xb4\x31\x80\x2e\xc7\x12\xd8\xbe"
- "\xa7\xcc\x43\x07\xf8\x37\x3e\xcd\xc7\x31\x32\xc8\xf1\x47\xa0\x7c"
- "\x9f\xf6\xf4\x4f\x95\xd2\xfc\x28\xce\xf9\x74\xa6\x1f\x7c\xab\x90"
- "\xad\x6b\x7f\xaa\x75\x92\x6d\xc9\x2a\x59\x28\x01\x1b\xe8\xf6\x22"
- "\x39\x15\x7d\xd0\x7d\x9a\x24\x17\xd7\x85\x45\x3f\xfa\x3e\xe8\x5b"
- "\x8e\x8d\x87\xfc\xd5\x49\xd8\x57\xd9\xdc\x31\xfa\x41\xf3\xab\x4c"
- "\x83\xcb\x00\x63\x83\x3c\x49\x7e\xe3\xb8\x47\xf4\x59\x79\x00\xbe"
- "\x65\x70\x8c\xd5\x3f\x9d\xc1\xd7\xd0\xee\x0c\x85\xf4\x5d\x8e\xf4"
- "\x63\x56\xac\x33\xd0\xb3\x0e\xda\x33\xad\x81\x7c\x8a\xfe\xf0\x7f"
- "\xd2\xc8\xdb\x1c\x22\xb5\x59\xe4\x87\x5e\xa2\x6f\x23\x39\x96\x0c"
- "\xb2\x30\x1e\x31\xdc\xd0\x25\x67\x8f\xb1\x79\x5d\x11\x23\xc0\xcb"
- "\x63\x8f\x20\x4f\x9d\xfa\xa0\xb3\x0c\x0a\x6a\x4f\xff\x6c\xb2\xab"
- "\x4c\x39\x3a\x19\x65\x0a\x62\x03\xe4\x37\xf2\x5a\xd5\xad\xff\xd5"
- "\x61\xff\xe3\xfd\xee\xb3\x58\xd7\xdf\x9a\xea\x6c\xbc\xdf\xd5\x01"
- "\xce\x00\x9f\x35\xcd\xc8\x1f\x33\xf9\x6c\x96\xd8\xa7\xeb\xa0\x4f"
- "\x3f\x02\xe9\xb5\xbc\xae\x3c\x5d\xfc\x16\xe0\xac\x06\xdb\x7d\xb7"
- "\x94\x2e\xb6\x17\xcb\x41\x7f\xea\x77\x49\xe9\x62\xf9\x80\xc7\x9a"
- "\x7d\xd8\x4f\xa4\x74\xb1\x4d\x60\x47\xd5\x12\x49\x9e\x18\x38\xde"
- "\x32\xa5\xdf\x21\xdf\xd0\xdf\x14\x9f\xe3\xff\x0c\xd7\x50\x4b\x51"
- "\x3f\x6c\x58\x40\x54\xab\xb7\x13\x7f\xde\x2f\x3f\x6b\x76\x95\x91"
- "\x9f\x57\xd1\x74\xb5\x8d\x2a\x2b\x93\xaa\x6c\xd3\x24\x7b\xb5\x08"
- "\xbe\x13\x2b\xc5\x4a\x76\xf8\xe4\xaf\x2d\xae\x2a\xed\xa2\x2f\xd6"
- "\xc5\x20\xd5\xc5\x49\x3f\x33\x1e\x60\xdd\xb0\xac\x0d\x60\xaf\xb7"
- "\x81\x5c\xe0\x72\xbb\x76\x9f\x14\x43\x3e\x57\xd4\x5b\x18\xb7\x3c"
- "\x37\x91\xc7\x31\x47\xdd\x88\x7b\x7c\x04\x9c\xc7\x4a\xb2\x93\x6a"
- "\x3d\x8c\xe5\x93\xce\x91\x85\x6b\x46\xa0\x4f\x95\x08\xa8\xeb\xdb"
- "\x50\xb7\x5d\x76\x9c\xfb\x8f\xc3\x71\xea\xe7\x31\xf6\x44\x6a\x15"
- "\x69\x06\xfd\xe8\xf3\xdf\x89\xb4\x45\xf9\xc5\x7c\xf2\x6d\x48\xe1"
- "\xf1\x75\x70\x2e\x07\xfb\xc7\x16\xd4\x63\x1a\x6a\x3d\x50\x84\x7d"
- "\xe5\xf8\xd3\x92\x4d\x0a\xf5\x2d\xe5\x36\x61\xf5\xeb\xcc\xe7\x50"
- "\x66\x65\x12\x9f\x0b\x3c\x7e\x82\xb7\xfd\xb8\x91\xaf\x73\x33\x7f"
- "\x92\xf8\xbc\xdb\x47\x73\xc7\xdf\xf9\xbe\xac\x83\x9f\xf0\x3d\x25"
- "\xc7\xbb\xe2\x7f\x38\xd9\x8a\x07\xb8\x3f\xa8\xe3\xe5\x8e\x3e\x71"
- "\x3c\x13\x7f\x07\xbf\x7f\x17\xd2\x6b\x1c\xe9\xd5\x65\xe2\x7c\x57"
- "\x72\xc0\xfa\x50\xdc\x5b\x76\x3b\xfa\xa5\xe6\xdf\xfb\x3c\x84\x7d"
- "\x9f\xcd\x79\x40\xdf\x14\xfb\x2f\xd2\x19\x75\x36\xeb\xc3\xd0\x7f"
- "\xb1\x1f\x77\x66\x55\xa6\xc1\xc5\xfb\x2d\xd7\xcd\x07\x58\xbf\x65"
- "\x7d\xf6\xf3\x50\xa7\x7a\x58\xd9\xbc\x17\xf2\xf3\x65\x8d\x0a\xde"
- "\xcd\x03\xbd\x5a\x2b\xbe\x63\x7b\xef\xd0\x6f\x88\xed\x2a\xb5\xe0"
- "\xda\x36\xae\x75\xe2\xd9\x2b\x35\xa0\x1b\x7d\x7d\x48\x6b\xd5\xb3"
- "\x9b\x53\xa9\x1d\xd7\x9d\xae\xd2\xb6\xbc\x2e\xbf\xf8\x9f\x97\x39"
- "\xfc\xf6\x1c\x57\x8a\xed\x4a\x82\x6f\x15\xf1\xbd\x60\xb5\xd7\xb8"
- "\x4d\x55\x6b\x45\x9c\x9a\x00\x7b\x70\xdf\xce\x63\xdb\x7e\xde\x28"
- "\x61\x0f\xfa\x65\xf4\x79\xf2\xc5\xaa\xfc\x3b\xe8\x76\xe0\xe9\x76"
- "\xe8\x4b\xcb\xe0\x79\x11\xdc\xa3\xf9\x5d\x16\x88\x77\xb1\x8f\x6c"
- "\x6f\x4f\xff\x42\x2b\xc5\xf4\x46\xda\xb4\xf9\xb5\xa7\x21\xce\x72"
- "\x81\x0e\x88\x35\xb6\x8e\x0c\xf5\x46\x7c\x21\xce\x10\x63\xea\xf5"
- "\x4f\x31\x9c\x31\xbf\x02\x90\x8e\xf5\x45\x9c\x41\x59\xcb\x24\x9f"
- "\xb8\x66\xf2\x45\x20\x5f\xcf\xf9\x22\x4d\xda\x4b\x8b\x6b\x49\x09"
- "\xf7\x90\xdb\xa1\x5c\xed\x01\x2d\xf3\x3b\x79\xda\x64\x7b\x92\x60"
- "\x5e\x5c\x87\xe3\x72\xf2\xce\x2d\xf0\x9b\xbd\x0e\x9a\x1f\x9d\xcc"
- "\xd6\x8c\xe6\xb1\xb9\xc8\xdb\xe0\x5d\x8d\xf3\x38\xc3\x4c\x0e\x15"
- "\xe1\x58\x03\xf7\xf6\xdd\x17\x44\xb4\x80\x5b\x90\x63\x5f\xb4\x49"
- "\x76\xed\x83\x41\xb8\x9e\x7f\x68\x16\xd4\xaf\x9e\xc7\x29\x3f\x34"
- "\x0d\xc6\x92\x15\x6e\xe6\x8c\xa7\xe1\x5c\x8f\x18\xcb\xa6\x1e\xe7"
- "\xb1\xd0\xf7\xff\x79\xf2\xe5\xaa\x2a\xf4\xf1\xb1\xa2\xa7\x4f\xe4"
- "\x94\x24\x7a\x05\xfd\x22\x6b\xe3\xc9\x6d\x0d\xe4\xcb\x08\x9c\x37"
- "\x4a\xbd\x8c\x73\x34\x75\xc9\xae\x73\x34\x75\x95\xe2\x65\x26\xe4"
- "\xc4\x4c\xa7\xab\x56\xbc\x87\xf7\x73\x35\x8b\x79\xad\x84\x9c\x54"
- "\x88\xb4\xfa\xac\x3d\xbd\xae\x6b\xfe\x17\x71\x89\x7d\x1b\xf7\x71"
- "\xe0\x9c\x93\xcc\x46\xd0\xa7\x08\xf0\x09\xea\xbd\xe1\x81\x67\x8d"
- "\x6b\x11\x47\x27\x58\xac\x6f\xf4\xd7\x3b\xb0\xbd\x44\x27\x18\x3f"
- "\xb9\xef\xcc\xba\x5a\xf8\xf6\xd9\x4d\x97\x88\x42\x1f\x4f\xc6\xe2"
- "\xfc\xb7\xda\x4e\x8d\x38\xc6\x45\x4c\xec\x64\x31\x64\x4e\x1c\x4f"
- "\x58\x47\xe4\xf0\x7e\x3c\xfc\x7f\x40\xb2\x93\xe0\x37\x81\x3e\x56"
- "\x12\x84\xf6\xd1\x13\xeb\xc8\xf8\xf6\xf4\x13\xa5\x12\xaf\xd0\x86"
- "\xc0\x79\x38\x71\x2e\x01\xea\x5a\x77\x06\x7f\x87\x3e\xdd\xcd\x8c"
- "\x6e\x4c\x0e\x63\x19\x2a\xa8\x8f\xc1\xa7\x8d\x04\x72\xdd\x73\x02"
- "\xf0\x7f\x50\xb4\x19\x4f\x94\x01\xf6\x6b\x1d\xf5\xd4\xdc\xee\xf4"
- "\xff\x73\xf8\x7b\x75\x1b\xda\x67\xee\xe8\x73\xf2\x21\x89\x3e\xb8"
- "\x5f\x55\x0d\xe3\x04\xc6\x6f\x1b\x6d\x86\xba\x55\xea\xd7\x12\xe5"
- "\x05\xf2\xe5\x3d\x3b\xb7\xb2\xf3\x73\x15\x7c\x7e\xfe\xcb\xdb\xa5"
- "\x71\x38\xaf\xf7\xc9\x33\xea\xf5\x3e\x04\xe7\xd5\xd1\x8f\x19\xdb"
- "\xeb\xf7\x9d\x86\xcd\xa5\x9b\x6c\x33\x88\x31\xe5\x17\x98\x47\xb2"
- "\xab\xea\x5b\x53\x35\x64\xbf\x66\x06\xf4\xe3\x93\xbb\xa1\xaf\xec"
- "\x1d\xf8\x9e\xca\x93\xbb\x45\xfa\x56\xf2\xbd\x08\x27\xd7\xa1\x2e"
- "\xc1\xb1\x3f\xe8\x91\x03\xa8\xa3\xdb\xd3\xbf\x54\x4a\xfd\x06\xf4"
- "\xc6\x01\xf8\x0d\xdf\x63\x9d\x89\xeb\xbf\x27\x93\xd0\xb7\x03\x1b"
- "\x37\xf0\xfc\x2a\x3e\xe7\xff\xe5\x8c\x2e\x5b\x1a\xf2\xe1\xef\xf8"
- "\x1e\xb5\x93\xe1\x0b\xed\x32\xa0\xe9\xc9\x70\x6c\x1b\xc7\xa2\xe6"
- "\x79\xc8\xbf\xcc\xd1\x6f\x4f\x30\xd9\xbc\xbf\xd9\xb9\x5f\x7e\x69"
- "\x70\x8c\x37\xeb\x42\xa7\xe4\x93\x5e\x7d\x5d\xea\x03\x50\x57\x7d"
- "\x69\xdf\xb4\x89\x96\xe6\xc9\x85\xc7\x37\xe4\x12\x95\xcc\x00\x64"
- "\xc3\x7e\x96\x18\x79\xfb\x79\x52\xef\xaf\x56\xdd\x19\xfe\x44\xc2"
- "\x70\x9a\xa2\x21\xf2\x9c\x96\xe1\xca\x7b\xac\x77\x96\x52\x9f\x07"
- "\x9e\x9d\x9d\x60\x25\xda\x17\xf2\xc8\xd7\xcb\x88\xcf\x13\x30\x5a"
- "\xb8\x4f\x45\xf4\x66\xf2\x95\x06\xcf\x82\xee\x57\xa1\xfd\xf1\x95"
- "\x06\xcb\x4c\x2e\x22\xca\xe4\x46\xda\x64\x58\xe2\xab\x04\x7d\x10"
- "\x58\x08\x18\x1b\xa9\xba\xb3\xb4\x13\xca\xf8\x28\x92\xfd\x6e\x8f"
- "\xfb\xba\xd5\xef\xe8\xbd\x6e\xfa\x3b\xa0\x6e\xaf\x0f\xac\x6e\xa7"
- "\xcb\x1d\x75\x3b\x5d\x3e\xf8\xba\x9d\x7a\xc4\xa9\x6e\x81\x8e\xba"
- "\xc5\x42\xdd\x4e\x3d\x39\xb0\xba\x9d\x89\x70\xd4\xed\x4c\x84\x87"
- "\x75\xdb\xdd\x47\xdd\x8e\xf5\x5e\xb7\xa4\x3b\xa1\x6e\x67\x06\x56"
- "\xb7\x06\xab\xa3\x6e\x0d\xd6\xc1\xd4\x0d\xc7\xf2\x29\xc1\xf4\x1c"
- "\xf3\xbd\x1e\x4f\x54\xb8\x77\xef\x3c\x39\xfd\x58\x4a\x11\x7b\x1e"
- "\x7d\x9e\x7c\x65\x17\xfb\xb7\x25\xb5\x8d\x9e\xe5\x76\xce\x57\x4b"
- "\xa7\xea\x71\xbf\xeb\x57\x91\x80\x65\x0d\xc7\xf4\x69\xb6\xbf\x21"
- "\xd5\x42\xc5\xfd\xa6\x5f\x65\x95\xb0\xfd\x28\x35\x62\x7c\xe0\xaf"
- "\x2a\x5b\x47\x54\xee\xc5\xbd\x20\x02\xf4\x67\x3a\xa2\xd2\x88\xb1"
- "\x28\xdf\x8a\xb7\xc8\x69\x3a\xfa\x04\x43\x3f\x7e\x0a\x42\xb3\x2b"
- "\x6b\xde\x8a\xb7\xb2\x58\xcc\x1b\xd8\x39\xde\xaf\x0e\x48\x67\xd7"
- "\xa4\x6f\x58\xfc\x6a\x6a\x20\xbd\x5e\x8a\x7d\x4b\xe5\x60\xcf\xf8"
- "\x55\x96\x63\xf9\x90\xde\x26\xc5\xa7\x05\xbc\x67\x8a\xb2\xa1\x4d"
- "\x6d\xed\x4b\xee\x9d\x9e\x24\xc9\xbd\x27\x12\x88\x1a\x63\x38\x6e"
- "\x4a\x19\x8e\x6b\x8e\x30\x9e\xfe\xaa\x1c\xe9\x1e\xd6\x36\x9c\xaa"
- "\x93\x89\x0f\x9e\xd9\xc3\x3d\x7a\x26\x8d\x85\x4c\x48\x26\xbe\x61"
- "\x49\x50\xa6\x95\x44\xaa\x93\xa0\x3c\xa0\x35\x1f\x1b\x9c\x66\x73"
- "\x7c\xf9\x50\x1e\xae\x7f\xfb\x24\x10\xd5\x13\x9a\x54\xba\x61\x07"
- "\x51\xe0\xf9\x3e\x3c\xa7\xc7\xcf\xe8\x0d\x53\xb6\xa7\x9f\xde\x25"
- "\xb5\xcf\x03\xfe\x04\x70\xfe\x98\xcf\x38\xf8\x63\x2e\xee\xc9\x1f"
- "\xb3\x1f\xe7\x8f\x99\x38\xf8\x73\x66\xa6\x2b\x7f\xcc\x93\x5c\xf9"
- "\x63\x5e\xe6\x1d\x7f\xcc\xd1\x0e\xfe\xf0\x6f\x70\xfe\x98\x93\x7b"
- "\xe7\x8f\x39\xdf\xc1\x1f\xb3\xce\x33\xfe\x98\x8f\xb8\xe7\x8f\x39"
- "\xa2\x0f\xfe\x0c\xeb\x9d\x3f\x67\xee\xf2\x9c\x3f\x67\x66\x0e\x80"
- "\x3f\xfe\x9c\x3f\x0d\xeb\x1d\xfc\x69\x78\xb4\x27\x7f\xce\xbc\xce"
- "\xf9\x73\xa6\xd4\xc1\x9f\x86\x46\x57\xfe\x9c\x39\xe2\xca\x9f\x06"
- "\x95\x77\xfc\x69\x50\x38\xf8\xc3\xbf\xc1\xf9\xd3\x10\xdc\x3b\x7f"
- "\x1a\xa6\x39\xf8\x73\xa6\xc2\x33\xfe\x34\x2c\x75\xcf\x9f\x33\xd6"
- "\x81\xf3\xa7\xe1\xdd\x6e\xfc\x09\x74\xcf\x9f\x86\xc6\x01\xf0\x47"
- "\xcd\xf9\xd3\x78\x8f\x83\x3f\x67\x4f\xf5\xe4\xcf\xd9\xdf\x71\xfe"
- "\x9c\x0d\x75\xf0\xa7\x71\xa3\x2b\x7f\xce\x2e\x75\xe5\xcf\xd9\xdd"
- "\xde\xf1\xe7\xec\x2e\x07\x7f\xf8\x37\x38\x7f\xce\xee\xeb\x9d\x3f"
- "\x67\x6b\x1d\xfc\x39\x1b\xeb\x19\x7f\x1a\xfd\xdc\xf3\xe7\xec\xf6"
- "\x3e\xf8\x33\xbc\x77\xfe\x34\xfe\xc9\x73\xfe\x34\x6e\xec\x8b\x3f"
- "\x03\xb3\xf5\x1a\x59\x4c\x8a\x21\x28\xc7\xec\xae\x1c\xa4\x1d\xee"
- "\x3f\x14\xd2\x1b\xcd\x25\xc2\x30\x25\x3f\xa3\xd1\xb8\x5d\xbb\x96"
- "\xfc\xba\x81\x9c\x9b\x52\x22\xf8\x2a\x69\xfa\x6b\xc1\x42\xfa\xdf"
- "\x0f\xd0\xf5\xc3\x14\xc2\xfa\xe1\x0a\x3c\x73\xed\x3e\x26\xf6\xb9"
- "\x1c\x9f\xbb\xc8\x38\x3c\x37\xb7\x01\xec\x65\xfc\xbf\x3d\xfd\xdc"
- "\x76\xb0\x05\x67\xf6\x75\x7e\x0b\xf7\x3a\xed\xdf\x88\xe3\xdb\x73"
- "\x07\xba\xfc\x5d\xa4\xd3\x24\xf4\x1b\xa6\xbf\x17\xcf\x59\x9c\x6b"
- "\x46\xff\xdc\x34\xf3\xf0\xcc\xd0\x7b\xe9\x69\x1c\x7b\x9c\x27\xe7"
- "\xbf\xa1\x59\x87\x67\x22\x1e\xc0\x56\xbf\xed\x02\x39\x3f\xad\x6b"
- "\x7f\x1e\x8d\x78\x55\x9c\x23\xb4\xf0\xbc\x4d\x7f\xa2\x59\x87\x2c"
- "\x18\xb3\x73\x65\x0a\xc6\xa2\x6c\x7a\x0c\x6c\xdf\xfb\xf1\x1b\xe8"
- "\x13\x69\x27\xdc\x71\x9f\x0c\xdf\x9b\x79\x7e\x2e\xb3\x97\x37\xdc"
- "\xfd\x2a\xdf\x0b\xd7\x34\x49\xc2\x1d\x7c\x67\x04\x3c\x8f\x12\xed"
- "\x79\xcc\x3f\xf2\x02\xf9\xfa\x9a\xd3\x7b\x15\x3c\x9f\x82\xb2\x47"
- "\x89\xef\xfd\xe1\xf9\x23\xb4\xb3\x99\xff\x8e\xdc\x34\x71\x0f\xf1"
- "\xd7\xbb\x20\x2d\x50\xcc\x33\x0a\xf2\x64\xa1\xed\x2e\x96\x31\x1a"
- "\x9e\x97\xe3\x18\x58\x7c\x1f\x04\xcf\xcf\xe0\xda\x81\xf8\xfe\x76"
- "\x78\xc6\xb9\xce\x1f\xf1\x33\x2f\x9d\x62\x1f\xfd\x9a\x78\x77\x16"
- "\xfc\x6b\x36\x6e\x45\x1e\xf0\xb1\xc0\xd7\x4e\xfb\x7f\xce\x37\x75"
- "\x7b\x17\xed\xf4\xae\x4e\x7a\xc7\xf7\xa8\x7d\x9d\xe6\xf4\xae\xa2"
- "\xdb\xbb\x22\xa7\x77\xe5\xdd\xca\x2c\x77\x7a\x57\xd6\xed\x77\xb5"
- "\x4e\xef\xf2\xbb\xbd\xb3\x38\xbd\xdb\x28\xbe\xf3\x69\x4f\x6f\x52"
- "\x3a\xd6\xf0\xce\x27\x88\xe9\x72\x48\xd7\x3a\xa5\x47\x8b\xe9\xf0"
- "\xfd\xa6\xe9\x66\xb2\x3d\x58\x4c\x67\xbc\xe7\xe5\x37\x85\x3b\x95"
- "\x3f\x8d\xcf\x71\x34\x45\x77\xed\x9d\x1b\x51\x15\x28\x74\x46\xbc"
- "\x0a\xef\x82\x11\x57\xce\xd8\x8e\x4b\xd4\x46\xad\xfa\xb3\x36\x3e"
- "\x26\x01\xb7\xaf\x2c\x5f\x9a\xa0\x5d\xbe\x22\x3a\xc6\xc5\x7f\x7a"
- "\x10\xfa\x12\xc4\xf8\x63\xe8\x93\x45\xf4\xf5\xdf\xd4\x15\x1f\x03"
- "\xe4\x2a\x7c\xab\xc6\x4c\x66\xb2\x79\xec\x7c\xee\x67\xbc\x02\x7d"
- "\xba\x70\xff\x2d\xe4\xa9\x06\xd2\x74\x5c\xf4\xdf\x62\x84\xbc\x36"
- "\xf7\xfe\x5b\x2e\xd4\x31\xbf\x85\x90\x8f\xfb\x6f\xb9\x50\x0f\xfd"
- "\xfc\x09\x3a\x82\xc7\xbb\xe0\x71\xc0\xbe\x91\x6c\x13\xcb\xc2\x6b"
- "\xcc\xf7\x5f\x1a\x9f\xcb\xe8\xee\x87\xf5\xf0\x04\xfc\x9d\xb8\x5e"
- "\x3a\xc1\xe9\xf7\xb1\xfc\xbd\xa4\x1f\xc4\x6f\x66\x1e\xd6\xc1\xf3"
- "\x88\x06\x78\x66\xf3\xf7\xec\xdd\x37\x7c\x2e\x2f\xeb\xf0\x64\x6c"
- "\x13\xb6\xdb\xb5\x6d\xf2\x3f\x36\x90\x6f\xde\x76\xb4\xed\x9b\x3a"
- "\x27\x1f\x6f\x52\x1b\x08\xef\xa3\x3d\xda\xca\xf6\x27\x52\xe5\xe1"
- "\xc9\xf8\x6d\x94\x67\xfc\x2c\x03\x3c\x67\x1d\xd6\x49\xf5\x71\xaa"
- "\xdf\x64\x1c\xd7\x43\xfd\x4e\x71\x9a\x80\xfc\x00\x9e\x8a\x6d\x28"
- "\xa6\xe9\x4d\x69\x6c\x6f\x3e\x9e\x01\xc6\xf8\x25\x4c\x57\x5d\x88"
- "\x95\xe6\x32\x51\x47\xf1\x39\xcc\x0b\x0e\xfb\x0f\x7d\x6f\x65\x49"
- "\xfa\xeb\x82\x93\xfd\xc7\xbf\x09\x69\x65\xce\x18\x72\xfa\xde\x71"
- "\xfc\x1e\xe4\x0b\xe7\xe7\x01\x0e\xeb\xb0\xbf\xc3\x73\x10\xee\xc5"
- "\xc4\xdf\x62\x1d\xdd\xc5\xac\x73\xe7\x1b\xd1\x41\xc7\x6f\xb5\x12"
- "\x1d\xf3\x59\xec\xa4\x6f\x43\xa4\xf9\x3a\x76\x1e\x09\xf2\xe4\x77"
- "\xc5\x70\xfe\x76\x1e\x8b\x83\x66\x50\x37\x3d\xa8\x22\x91\x9c\xb6"
- "\xdf\xc6\xa0\x8c\xc7\x3e\xc3\x65\xfd\xb7\x07\x44\x9e\x8b\x67\x97"
- "\xbf\xcd\xc1\x74\xc7\xfe\xfb\x6f\x1b\xa5\x7c\x92\x5c\xe6\xeb\x55"
- "\xdf\xbe\xcf\xf2\xf1\xb8\xba\x7b\x38\xcf\x7f\x14\xd8\x40\xbe\xad"
- "\x11\xf3\xf3\xb8\x84\xcc\x2f\xcf\xb7\xcd\x34\xab\x66\x0f\xd4\x15"
- "\xc6\x3f\x4d\xdb\x39\x1d\xf9\x77\xe1\x5e\x83\x75\x41\x1a\xe1\xd9"
- "\x71\x9a\xa3\x6e\x02\xfe\x94\xf5\x7e\x96\x94\xed\xeb\x1e\x7f\x81"
- "\x5c\xe4\x36\x84\x9c\xb2\xf9\x5d\xde\xd6\x8b\x4b\x9d\xf6\x3e\xab"
- "\xa4\x3c\x5c\x76\xb3\x77\x6c\x4f\xb9\x3e\x11\xe7\x83\xc4\x77\x89"
- "\x78\xbe\xb6\xeb\xff\x61\x4e\xff\xfb\xe2\xff\x6c\x5f\xf3\x5a\xa6"
- "\x5b\x15\x8e\xb3\xfb\x17\x63\xe1\x59\xd5\xed\x39\xc8\xe5\x79\x0d"
- "\xdf\xf7\x0c\xb6\x59\x23\xdb\x43\x2e\xa6\x8b\x65\xfb\xb1\xfa\x24"
- "\xd2\xe9\x80\x8d\xe9\x78\x16\x5b\xec\x87\xd3\xf1\x0c\xb7\xda\x36"
- "\x9f\x9d\xdf\x86\xf7\xd3\xc4\x7b\x88\x78\x9f\xcc\x63\x9a\x5e\xd4"
- "\x3a\xe2\x92\xe3\x1c\xcd\xc5\x10\x77\x71\xd2\xa5\x38\xf2\x52\x9c"
- "\x74\x3c\xff\x2d\xc6\x75\x9d\x07\xbf\x8b\xed\x2b\x26\x3d\xbc\xcf"
- "\x94\xce\x72\xdb\x33\x0f\xd5\x0b\x99\xd6\x59\x18\x43\x13\xfd\x7f"
- "\xa5\x36\xa3\x0f\x98\x36\x62\x22\x1d\xc4\x94\xd0\x9e\x86\x71\x34"
- "\xab\x79\xfc\x4c\x3c\x03\x2b\xc3\x79\x73\xb4\x1d\xab\xf5\x17\x59"
- "\x0c\xcd\xd5\xcd\x24\x58\xff\x2b\xda\x08\x34\x68\xb6\x67\x1d\xaa"
- "\x17\x71\xb4\x03\x74\xe0\xb8\x0b\xe4\x12\x9b\x2f\x66\x31\xa0\x9b"
- "\xd9\xba\x97\xf2\x3c\xb9\x94\xcc\xf2\xd0\x88\x1d\x9c\x76\x97\xd8"
- "\xdc\xd7\xce\x74\x29\x4e\xe2\xa5\x09\x52\x5c\x66\x33\xb9\x94\x76"
- "\xc5\xef\x33\x1d\xa4\x4d\x77\xdd\x33\x7d\xe9\x19\x2c\x13\xeb\x6e"
- "\x26\x17\xdb\xb0\x6c\xc8\x33\xaf\xab\xcf\x42\xfa\x6a\x1b\x19\x03"
- "\xf5\x3a\x2f\x95\x0f\xef\xa1\xff\x37\x2b\xf1\x3d\x96\x79\x25\xeb"
- "\x1a\x96\x9b\x67\x96\xef\x10\x7d\xfc\x5f\x02\xfd\xf7\x5f\xfa\xbe"
- "\x6c\x20\xe8\x0b\x66\xe8\x4b\x4d\x42\x66\x4d\x1d\xf3\xd1\xed\x57"
- "\x63\xe6\x73\x8c\x97\xbe\xc1\x7d\x5d\x9b\xae\x12\x05\xee\x81\xe0"
- "\x98\xfd\x6e\x0a\xc3\x31\xa4\x81\xac\x2e\x83\x3e\xc2\xf5\xf4\x80"
- "\xf4\xfe\x25\x1e\x17\xbb\x85\x28\x73\xe3\x25\x1f\xe3\xdf\xcd\x74"
- "\x8a\x8b\x20\x9e\x7b\xf9\x6e\x79\x75\x12\x5b\xef\x66\x75\xec\x5e"
- "\x07\xac\x2f\x94\xd5\xe4\xd6\xc6\x54\xd6\xb0\x79\x43\x18\x0b\x98"
- "\xf9\x1e\xd5\xef\xde\xf1\xd1\xdc\x5d\x0e\xdf\xda\xd3\x15\x0f\x02"
- "\xf2\xe4\xe2\xde\x7b\x28\xbf\xab\x9d\xf1\xec\x1b\x75\xbc\xaf\x7f"
- "\xd7\x2c\x64\xd5\xd4\x61\x1d\xc4\xf4\xe6\x6a\x9b\x15\x7d\x3f\xf4"
- "\xea\x3f\x8b\xc5\x99\xc3\x3d\xe1\xd9\x35\x75\x78\x6e\xe8\x41\xab"
- "\x54\x67\x4b\x33\x9e\x57\xc1\x3a\x73\xda\x5a\xce\x48\x74\xcc\x69"
- "\x81\xb2\x53\x4e\x92\x46\x62\x59\x8a\xfb\xe6\xf0\xfc\x15\xf6\x61"
- "\x4e\x03\x0b\x1b\xf3\xb1\xef\xf3\x3c\x6c\xec\xcf\x62\xfe\x40\xf9"
- "\x25\x2c\x6e\x19\xb4\x01\x78\x61\x4c\xc1\x33\xff\x16\xe6\x6f\x63"
- "\x43\x3c\xe1\xed\x66\xfb\x64\x2f\x8b\xeb\x24\x96\x32\x49\x57\x98"
- "\xc5\xb4\x4d\xf8\xed\xc4\x0e\x72\x89\x58\xb2\x30\x1e\x39\xd0\xa3"
- "\x09\xfd\xce\x55\xb7\x41\x3f\x49\xea\x40\x2c\x34\x61\x9c\x4b\x33"
- "\xb1\x64\x72\xfd\x86\x34\xb7\x2c\xc3\xef\x23\x6d\x81\x77\x16\xa0"
- "\xe9\xa1\xf6\xf4\xcb\x0a\x89\xa6\xb9\x77\xe0\x78\xc7\xa2\xed\x4b"
- "\x37\xd8\xa1\xce\xd5\x30\xca\x30\x8e\x39\x89\xf5\xab\x12\x46\xd4"
- "\xd4\xe1\x9e\x6c\xf8\x5f\xf4\x75\xca\x79\xc7\xfb\xd2\xe5\xd7\xe0"
- "\x1b\x97\x71\x7f\x03\xca\x4a\xf4\x8d\x06\x69\x4f\x8b\xf4\x63\x71"
- "\x22\xf2\x12\x39\x1d\x78\xfe\x16\x71\x3d\xfc\xee\x76\xa8\x57\x91"
- "\x63\xbe\xb8\x85\xe9\x6e\xc4\x5b\x09\x1b\x13\x5e\x2e\x77\xaa\x73"
- "\x1b\x3b\xff\xda\x82\x73\x7d\x97\x23\xf1\x5b\x39\xe8\x17\x0c\x71"
- "\x71\xc1\x19\xff\x97\x1f\xc3\x7a\xe2\x9e\x5f\xbb\x5f\xa5\x19\xf4"
- "\x6d\x23\xd2\x19\x7e\x93\x04\x7d\xa1\xae\x0f\x5d\xc8\x62\xd4\xb5"
- "\xa7\xb7\x4c\x96\x74\x21\x8c\x2f\x40\x2f\xb4\x4e\x64\xe3\x4e\xb0"
- "\xa7\x4d\x02\xda\x33\xad\x13\x10\x37\x20\x67\xb5\xa2\x8c\xd5\xc2"
- "\x6f\x22\xa5\x35\x2f\x3b\x9e\x9b\xb8\xc4\xd6\x7b\xdb\xa4\xd8\x6b"
- "\xdc\x0f\x5f\xcb\x46\xc7\x39\x8b\x96\xbc\x1e\xe7\x2c\xf0\xec\xcf"
- "\x56\x16\xa3\x6b\x37\xea\x94\xaa\xe6\x46\xd4\x11\xec\xf7\x78\xf6"
- "\x22\x05\xc6\xe4\xfc\xfc\x50\x23\xce\xcf\xb3\x58\x26\x58\x17\x1e"
- "\x53\xa2\x81\xfd\x0f\xb8\x55\xe0\x9d\x63\xa9\xa5\xad\x2b\xbe\x38"
- "\xf0\x1b\xd7\xda\xf6\x2b\x7e\x43\x8c\xf7\xa2\xbe\x6e\x9d\x88\xb1"
- "\xb2\xdb\xd3\x5b\x35\x52\x9c\x6c\x16\x17\x9b\xb7\x27\xc8\xad\xbf"
- "\xc5\xa9\x24\x04\xfd\x05\xe0\xf9\x3a\x46\x03\x95\x3a\x13\x7d\x38"
- "\xa3\x3f\x4a\xe3\x5a\x8c\xb5\xd2\x7a\x7c\xcb\x1d\xec\x8c\x72\x9b"
- "\x71\x6a\x0b\xee\xc3\x6a\x3e\x9f\xcc\xfc\x2c\x29\xc3\x92\x6c\x14"
- "\x7f\xc7\xec\x09\x7f\x75\x26\xbe\x63\x31\x0c\xb0\x4c\xaf\xfd\x11"
- "\xb7\x96\x8a\xb6\x69\x33\xc8\xfd\x3b\x81\x57\xcc\x76\x87\xff\xef"
- "\xb8\x40\xda\xec\x3c\x5e\x2b\xf7\xa9\x2f\xee\xc7\x1e\xc6\x7d\x6c"
- "\x00\xcd\x98\xcf\x83\xb6\x97\xb4\x0f\x60\x6c\xe3\xb6\x55\xcc\xbf"
- "\x75\xe6\xe1\x10\x91\x06\x21\x9b\x78\xbd\xd4\x0b\x93\xe4\xac\x8e"
- "\x58\xbf\x81\xd5\xad\x6d\x86\x38\x8e\x18\xd6\x9e\xde\x96\x26\xf9"
- "\xe6\xe0\xf6\x14\xf7\x7b\xcd\x79\xd1\x76\x51\xb4\x9f\xa7\x89\xdf"
- "\x9e\x36\x04\xdf\x2e\x17\xcb\x54\x72\xdf\xdf\xad\xd1\x50\x2e\xe8"
- "\xdf\x2b\x4a\x69\x3c\x23\x9e\x21\x9a\xcc\xc7\x59\x57\xb4\x8e\xf1"
- "\x4c\x6b\x0f\x7f\xac\x8f\xaf\x58\x91\xa0\x8d\x5e\xba\x52\xbf\x28"
- "\x61\x71\xac\x36\x26\x3e\x7e\x45\xbc\x16\x9d\x2f\x39\xf7\x1f\x1e"
- "\x9f\xe8\xca\x34\x31\x96\x5f\x99\x23\x96\xdf\x15\x97\xf8\x97\x66"
- "\x72\x25\x6d\x68\xe6\x2e\xae\x14\xb9\x2b\x27\x4f\x2e\xec\x81\x0b"
- "\xd7\x51\x8c\x70\x55\xe0\x5c\xc6\x42\x2b\x09\x05\x5d\xcf\x7c\x5c"
- "\x38\x7c\x4e\x5c\x99\x8b\x7b\x8c\x1a\xc8\x95\x6b\x25\x82\x82\x30"
- "\x1f\x42\xe9\xc2\x1e\xcc\xbf\x13\x7e\x0f\x97\x11\xae\x0a\xb8\xd8"
- "\xef\x84\x8f\xd9\x79\xf9\x3d\xce\xef\xf8\xfe\x91\x94\x8d\x98\x87"
- "\xae\x57\x30\xf9\x25\x6c\xe6\xf9\xba\xd5\x41\x4e\xd3\x2f\xed\x11"
- "\xf3\xb1\x98\x5c\x01\xeb\x89\xb6\x97\x7c\x3e\x34\xfd\xdc\x6e\x31"
- "\x1f\xdb\x03\x20\xb5\x07\x63\x08\x40\x7e\x29\x9f\x82\xa6\xb7\x4e"
- "\x17\xf3\xb1\x3d\x39\x42\xba\xbc\xb7\xef\xfa\xd2\xf4\xbd\x5a\x31"
- "\x5f\xa0\x73\x79\x4e\x79\x86\x09\xe9\x5f\x96\x61\x1e\x61\xbd\x82"
- "\xfb\xb7\x4d\xbf\x52\x04\xf9\x7b\xf5\xbd\x3a\x30\x3e\xb5\xcf\xec"
- "\xce\x27\xfd\xe2\xa5\x31\xbf\x58\x1a\x97\x88\x11\xa4\x12\x56\xac"
- "\x4a\xc0\x7b\xdc\xa2\x17\xd9\x6d\xc5\xc2\x25\x8b\xf9\x3f\x09\xcb"
- "\x42\xf0\x9f\x65\x80\x37\xbc\x47\xaf\xd2\xe3\x6d\xf1\x0a\x7c\x4c"
- "\x8a\x9d\xbc\x6a\x31\xde\xba\x9f\x03\x05\xdb\xaa\xbd\x19\xb0\x51"
- "\xcf\xe5\x6c\xbb\xd5\x4c\xce\x31\x9b\x0e\xe3\x24\x1d\xd4\xd9\x88"
- "\x34\xaf\xe5\xea\x73\xc4\xea\x8b\x3e\x47\xd4\xeb\xf5\x8b\xd5\xb6"
- "\xa5\x31\x34\xab\x0a\x6c\x60\xeb\x34\x33\x89\x15\x63\x58\x1f\x0e"
- "\x65\xfe\x4b\xd3\xdb\x37\x8a\x7b\x3b\x15\x42\xe6\xa1\x36\xf4\xcb"
- "\x0f\xcf\x2c\x26\xb5\x00\xfa\x00\xf2\xcd\x80\x67\x8c\x45\x1d\x04"
- "\xef\xf1\x77\x33\xe1\x59\x03\xcf\xc1\x42\xe6\x7b\x4a\x3c\x63\x0c"
- "\xcf\x5a\x78\x9e\x00\xe5\x77\xc5\x7f\xeb\xdd\x56\xb6\xee\x95\xe2"
- "\x64\xf3\x98\xd8\xd6\x03\x5d\x31\xb1\x31\x4e\x53\x4a\xe0\x3c\xa6"
- "\x7f\x99\x0d\x62\x6d\xf2\xd1\x8c\xfd\x0d\xe4\x69\x92\xf4\x25\x9f"
- "\xef\xb0\x5a\x25\xff\x29\x7c\x3e\xe3\x9a\xd2\x29\xb6\x38\x3e\x6b"
- "\xa4\xd8\xe2\x38\xdf\xc5\x62\x1b\xc2\x9d\xa6\xa3\x9f\x58\xda\xeb"
- "\x78\x89\xc7\xc4\xbc\xb6\x0e\x7d\xee\x5a\x52\xa3\x65\xf7\x95\xe0"
- "\x1c\x1a\x3c\x73\x9f\x91\xf4\x12\xb9\xc6\xfc\xe9\x4b\xfe\xe4\x9c"
- "\x7d\x49\xf4\x7a\x1e\xea\x53\xb0\x19\x58\x1c\xab\x65\x2b\xd4\xb6"
- "\x45\x31\xdc\x0e\xbc\x76\x8a\xcb\xaf\x2a\xd1\x57\xf1\xb5\x0a\xfa"
- "\x2c\x8f\x75\x62\x26\x1d\x4f\xe3\x98\x45\x2d\x5b\xb6\x82\xc2\x6f"
- "\xd5\x49\x8b\x62\x58\x1a\xe4\xdb\x00\xb6\x9a\x58\xbf\x37\x4c\xc1"
- "\x78\xc6\x55\x10\x7d\x64\x5c\xdb\xbd\x60\x6c\x1a\x7e\x47\xc9\xec"
- "\x90\x4f\x89\x0a\x63\x53\x62\xdd\x4a\x9c\xfc\xdd\x6d\x82\x34\xdc"
- "\x43\xda\xfa\x2c\x51\xa1\x7f\x5f\xb1\x2e\xbb\x79\x5c\xb0\x8e\x99"
- "\x92\xaf\x29\x33\xa4\x75\x6f\xcf\xb3\x7f\x60\xa8\x9c\xb8\x78\x72"
- "\xf8\x93\xf0\xdf\x64\x31\xbc\xb3\x33\x36\x83\x5b\x47\x54\xd7\xb5"
- "\xfe\x3d\xee\x30\x8f\xe1\xd9\x01\xe3\xff\x6b\xd3\xd9\x1e\x16\x1c"
- "\x97\xb4\x47\x6c\xe7\x7b\x50\x3b\xaa\xd0\x9f\xae\x90\x8e\xf6\x24"
- "\x9e\x9b\xee\xd8\x87\x98\xa5\xca\x2a\xe5\xce\x75\xe8\xbb\x59\x06"
- "\x34\xee\x78\x1b\xdf\x89\x3e\xbb\xe4\xcc\xc7\x95\x9d\x68\xd8\x19"
- "\x61\xb0\x51\xf0\x0c\xea\x79\x62\x7f\x1f\xed\x0e\x9c\x4f\x12\xd2"
- "\x3b\x22\x10\xb7\xc0\x63\xf4\x21\xd2\x46\x47\x1c\x32\x53\xbf\xaa"
- "\xdd\x88\x63\xb4\x75\x4d\x81\x48\xb3\xce\x09\xf0\xdd\x27\xe0\xfa"
- "\x23\x8f\x29\xf3\x7c\x93\x54\x26\xfa\x55\x83\xb1\x53\x10\xdc\x03"
- "\xdb\xd3\x3b\x9f\x76\x8a\xb5\x27\x9e\x89\xee\x5c\x8e\xfe\xde\xb0"
- "\x6c\x6e\x3b\xdb\x5f\xe7\x36\x48\x67\x92\x99\xa8\xf3\x79\x5f\xec"
- "\x04\xfb\xe7\x3f\x22\xc5\xff\xc1\xfe\x79\x68\x4f\xb7\x32\x4e\x48"
- "\x73\xa5\x1c\xd3\x9d\x7b\x01\xa3\x4f\xc0\xf5\x47\xc8\x6f\x94\xe2"
- "\xc9\x6f\x90\xb3\x73\x92\xe7\x7d\x34\x78\xde\xbd\xb3\x4e\x4a\xf7"
- "\x95\x85\x02\x4d\x3b\x9b\xa4\xbe\xdf\x3a\xa2\xb2\x19\x9e\xad\xd2"
- "\x1c\x0b\x9f\x73\xb1\x29\x9d\x9e\xad\xf0\xac\x91\x9e\xe1\xff\x09"
- "\x92\xac\xc0\x71\x62\x2b\x8c\x25\x71\xdc\xb9\x58\x03\x76\xa1\x06"
- "\xc7\x79\x36\xe0\xff\x7f\x68\xc5\xbc\xe1\x66\x92\x25\xca\x18\xdb"
- "\x3c\xb3\xbc\x70\x99\xd4\x16\x21\xdd\x47\xcd\xdb\x63\xcf\x17\xb2"
- "\xac\xb3\x2c\x7e\x87\x4a\x21\x0f\xe8\x7f\x6b\x29\xcb\x93\x78\xb1"
- "\xd4\xd0\x11\x38\xd7\xb4\x11\xec\xe4\x25\x88\x2f\x3b\xdb\x87\x95"
- "\xb3\x36\x30\x1c\x6d\x4c\xf4\xf9\xc1\xfc\xf3\xa1\x8f\x4a\x1b\x19"
- "\xc6\xe2\x02\x64\x59\xa7\x33\x7f\xf8\xab\x75\x2a\xc9\x3f\x25\xc8"
- "\x9e\x7c\x2a\x5f\x56\x89\x3e\x2b\x59\xfc\x8f\x76\x5d\x00\xf3\x53"
- "\x29\xfa\xa7\x2c\x4e\x24\x41\x45\x02\xf7\x4f\xc9\xfc\x81\x0c\x83"
- "\x31\x49\x62\xef\x3e\x2a\x69\x7a\x59\x82\xe4\xa3\x92\x5e\xb5\x5b"
- "\xe1\x7f\xc4\x02\xc6\x45\xd7\xb1\x67\x87\x6f\x29\x45\xaf\x3e\x2b"
- "\xe5\x20\xe3\xe4\xdc\x67\xe5\xc0\x74\x83\x3d\x92\xe3\xc4\x5e\x2a"
- "\xc5\xbb\x77\x4a\x03\xf9\x77\x4d\xf4\x65\xd0\xb9\x4c\x4c\xab\x30"
- "\x93\x8c\x04\x71\x7f\xa5\x05\xe7\xc8\xf2\xd9\x3c\x58\x07\x9e\xbf"
- "\xd8\xd1\x9b\x7c\x69\x09\x18\x0d\xf5\xc0\xfe\x2b\xc0\xf7\x04\xc6"
- "\x27\x3e\x6e\x14\x94\xdd\xfb\x70\xd4\xe2\x15\xd1\x31\x0b\x5f\x58"
- "\xae\xd7\x3e\x3b\xf7\x09\x16\xec\x70\xb2\x76\x69\x42\x0c\x53\x3f"
- "\xda\x67\x9f\x7c\x3c\x2c\x6c\xee\xc2\x3f\xcc\x7d\x6c\xee\x73\x7f"
- "\x78\x94\x9f\x4e\x9c\x1b\xbf\x06\x03\x66\x26\xac\xd0\xe2\x8f\xa2"
- "\xc4\x28\xdb\x6b\x63\xe2\x57\x74\xef\xfb\x41\x6c\x4e\x4b\xce\xe6"
- "\x6f\xdb\xf0\x7f\x3e\x6f\x26\xec\x92\xe6\xb3\xb8\x9c\x13\x0a\x90"
- "\xb6\x2c\x7e\x69\xba\x10\x8c\xb6\x94\x18\xff\x1c\x75\x8c\x02\xfb"
- "\x2f\xea\x1a\x68\x4b\x8d\xb3\x1f\x2e\xf1\xb7\xe8\x8f\x2b\x50\xea"
- "\xb7\x3c\x8d\xfa\xd1\x31\x63\x52\xb9\x2f\x2d\xaa\x90\xe6\xb8\x31"
- "\x4d\xaa\x43\x03\xe6\x49\x17\x66\x3b\xe2\xec\xd2\xc9\x8e\x58\x92"
- "\xec\xcf\x85\x46\x84\xa0\xe9\xe2\x0b\xb4\x1b\x06\xd7\x70\xbc\x66"
- "\x75\xc9\xf2\x44\x5a\x87\xe3\x33\xb5\x0c\xf4\x6d\x92\x0f\x8f\x45"
- "\x95\x51\xcb\xe2\x27\x84\xd9\x6d\x3e\x0b\xed\x72\xb8\xfb\xd0\x85"
- "\x76\x05\x1b\x13\xd2\x44\x5a\xcb\xce\xd5\x27\xd2\x1a\x8c\xb9\x06"
- "\x38\xce\x0c\xb3\xa5\x64\x86\xd9\xa9\x6d\x21\xd8\xea\x70\xff\x1a"
- "\xcf\x87\x87\xd9\xbf\xa6\x2c\xee\x0c\x9e\xa3\xe7\x3e\x05\x2b\x70"
- "\xbf\xe4\x02\xc0\x70\x49\x0b\x8f\xd5\x1b\xb6\xe6\xbb\xd3\x0b\xd7"
- "\x98\x79\xac\xde\x4b\x3c\xbe\x35\x8f\x01\x4e\x52\xa0\x9c\x23\x0b"
- "\xed\x3e\xda\x30\x7b\x27\x65\x67\x5c\x33\x48\x60\x5f\xf1\x77\x51"
- "\x9e\xae\xbc\x8b\xc8\x71\x6e\xc5\x5e\xb2\x20\x14\xfd\x07\xa6\x5a"
- "\xa8\x15\xfd\xd0\x7c\xd8\x51\x27\xd7\x26\x2a\x48\x83\x8c\x3c\x52"
- "\xad\x0f\xe9\xfd\x8c\x73\xc6\x49\x1b\xcd\xd9\x5c\x4b\x33\x4e\x55"
- "\xd2\x9c\x2d\x73\x41\x8f\xe1\xb8\x57\x46\x33\xcc\x45\xf0\x0c\xe9"
- "\x67\x97\xd1\x9c\xfc\xb9\x34\xe3\xfc\x0c\xb8\xc3\xf3\x37\x2a\x9a"
- "\x53\x00\xcf\xfb\x6b\xe1\x77\x35\x34\xe3\x00\xfe\x2e\x9c\x66\x1c"
- "\x3c\x00\x77\x78\x3e\xb4\x0f\xf2\xc1\xf3\xe1\xbd\x70\x87\xe7\x8a"
- "\xdd\xe7\x65\xe8\xb3\xa8\x00\xd2\xbe\xad\xe7\xdf\xba\x54\xcf\xbe"
- "\x95\x71\xb9\x9e\x7f\xa3\xad\x9e\x7f\xa3\xbd\x9e\x7f\xa3\xa3\x9e"
- "\x7f\xe3\xc8\x2e\xc8\x5f\x47\x33\x8e\x06\x41\xbe\x08\x9a\x51\xb9"
- "\x11\xee\xf0\x5c\xd5\x06\xf9\xe0\xd9\x14\x0d\x77\x78\xae\x81\xba"
- "\x14\xc0\xf3\xa7\x33\x21\x7f\x3d\xcd\xf8\xac\x1c\xf2\xcd\xa3\x19"
- "\xc7\x27\xc3\x1d\x9e\x3f\x2f\x85\x7c\xf0\x5c\x07\xe5\xe4\xc3\xf3"
- "\x89\x4c\xc8\x0f\xcf\x76\xac\x8f\x99\x66\x50\x2c\x37\x92\x66\xcb"
- "\x30\xbf\x99\x66\xcb\xa1\xbc\x7c\x78\x56\x24\xc3\x1d\x9e\x87\x4d"
- "\x80\xfc\xf0\x3c\x1c\xda\xba\x19\xc6\xe8\x7e\x49\x90\x2f\x9a\x66"
- "\x8f\x84\xf4\x2d\xf0\xac\xaa\x81\x7c\xf0\x1c\x80\xf9\xe1\x39\x50"
- "\x07\xf9\xe1\x79\x14\xd2\xa8\x89\x66\x07\x4d\x83\x7c\xb1\x34\xfb"
- "\x8e\x7c\xb8\xc3\xb3\x06\xeb\x0f\xcf\x77\xcf\x85\x3b\x3c\x8f\x05"
- "\x5a\x15\xc0\xb3\x16\xea\xb7\xb9\x99\x66\xdf\x8b\xe5\x2f\xa3\xd9"
- "\x13\x90\x3e\xf0\xfc\xa3\x50\xc8\x07\xcf\x93\x80\x1e\xf9\xf0\x3c"
- "\x59\x09\xf9\x7b\xf5\x8d\x4b\xb3\xa7\x9a\xe9\xfa\x61\x84\x66\xff"
- "\x4c\x4f\xd7\x0f\x87\xfb\xcf\xb5\x74\xbd\xaf\x8e\x66\xcf\x48\x83"
- "\x74\xb8\xff\xdc\x0a\xcf\x93\xc5\x67\xb8\xff\x02\x6c\x6d\xdf\x10"
- "\xf1\x19\xee\xbf\x2c\x83\xe7\x69\xe2\x33\xdc\x7f\x15\x02\xcf\xd3"
- "\x69\xf6\xaf\x95\xf0\x0c\xf7\x5f\x81\xad\xed\x3b\x43\x7c\x86\x7b"
- "\x68\x25\xdc\x6d\x96\xb1\xf3\xb7\x5b\xfc\xa3\xc2\x2d\xfe\x5b\x8d"
- "\x88\x49\x7b\xee\xe6\x1a\x21\x60\x4b\x38\xe8\xd8\x61\xa9\x57\xc8"
- "\xf0\xf3\x32\x9f\x2a\x94\x29\xa6\x64\x33\x8b\xe7\x27\xfa\xb3\x1c"
- "\xd6\x20\x93\x1f\x01\x7b\x08\xe3\xfc\xc8\xa1\xad\x2a\x9a\xee\xdb"
- "\x02\x77\x03\x4d\x1f\xd9\x00\x6d\x85\xe7\x51\x9f\xc2\x1d\x9e\x7f"
- "\x9a\x0d\x6d\x86\xe7\xe7\x1f\x87\xbb\xa1\x3d\xc3\x47\x67\x96\x11"
- "\xee\x6f\xef\xef\x71\x46\xb5\x2d\x95\x86\xd9\x40\x77\xec\x28\x4e"
- "\x53\xdb\x22\x01\x6f\xdb\x22\xd5\x18\x77\xa3\x78\x7e\x1d\x0d\x88"
- "\x62\x75\xc2\xd8\x3a\xb4\x73\x82\x9c\x7f\x7b\x24\x6d\x90\xf9\x3c"
- "\x87\x31\x20\x68\xc0\x5a\x77\xef\x57\xb1\xf7\x63\x8a\xf3\xf8\x7b"
- "\x25\x71\xbc\x7f\x1e\xdf\x17\xa8\xd1\x97\xfa\xb8\xe7\xd8\x7b\x53"
- "\x5b\x93\xd8\x2e\x1f\x7c\xf7\x36\xe6\x35\xcb\x7c\xf8\x79\x01\x99"
- "\xbc\x8e\xa6\xfb\x90\x56\x65\x55\x05\xd4\xbd\x11\xea\x1e\x2c\xce"
- "\xc3\xb6\x51\xe5\x21\x2b\xf7\x67\x72\xac\xd7\x3e\x8a\xe3\x55\xc1"
- "\x50\x58\x9e\x03\x72\x10\xc7\xc0\xa0\x0f\xe5\xda\x94\x09\xe5\x0d"
- "\x32\xdf\x3d\xc5\x6c\x6e\xa3\x38\x82\xc9\x47\x99\x62\x55\x67\x76"
- "\x95\x4d\xbb\x56\x0d\xdf\xf7\x7d\x3b\xd5\x4a\xaf\x18\x53\x1e\x27"
- "\xe7\x59\x7a\xf5\x74\x76\x5e\x88\xff\x3f\x81\xed\x03\xe5\xff\x07"
- "\xb2\x39\x67\x28\x0b\x7f\xeb\x3c\xe6\xb0\x67\x4c\x09\x15\x02\x8a"
- "\x23\xd9\x3a\xba\x4c\xb1\xe6\x7d\xc1\x2c\x57\x27\x10\x5f\xed\xda"
- "\x0f\xa1\x7c\x85\xd1\x65\x7c\xda\x95\x97\xbd\x7b\xed\x03\xc8\x5b"
- "\x88\x73\x49\x19\x8a\x9a\xae\x38\xc9\xd0\x86\xbf\xa0\x2e\x94\x93"
- "\x50\xd4\xcf\xcc\xde\x95\xf9\x86\xa3\xff\x5b\x9b\x6a\x5b\xa8\xcd"
- "\x10\x15\x6a\x37\x14\x47\xd0\xdc\xe2\xc8\x00\x9b\x8c\xb0\xfd\xfa"
- "\x32\xdf\x57\x1e\xb4\xa2\x7d\xf9\x09\xe6\x7d\x54\x18\xf6\x33\x32"
- "\x35\x89\xc8\x8d\xf1\x27\xf1\x79\x1d\xcd\x98\x51\x66\x6a\xae\x23"
- "\xc6\x78\x56\x56\x32\xcd\x98\x65\x10\x86\x3d\x1e\x5d\x82\x76\x7a"
- "\x12\xce\xb3\x7d\x8a\xe9\x32\xe0\x8b\xa2\x3d\xc3\x77\x5e\x57\x0c"
- "\x6f\xa0\x65\x0e\xd0\x0e\x6d\x68\xf4\x7d\xb1\xd0\x6e\x47\x5f\x72"
- "\x99\x66\xa0\x03\xe7\x97\x6f\x28\xc6\x3f\x17\xbf\x5b\x20\x8c\xa8"
- "\x6a\xaa\x9e\x87\x6b\x86\x4a\xf4\xcd\x75\x85\x9d\x97\xb7\x61\x5c"
- "\x43\xd0\x3d\x62\x5e\x67\xde\x2d\x5f\xac\x5f\xb8\x56\xbf\x22\x3e"
- "\x61\xe1\x2a\xfd\x2f\xb4\x30\x70\xd4\xae\x58\xa2\x5d\x1e\xb3\x7c"
- "\x45\xfc\x9a\x1e\xfe\x80\xa0\x5e\x6d\x66\x99\x82\xcd\x57\x1f\x01"
- "\xfb\x9d\xcd\xdf\xcb\x86\x1f\x40\x5e\xef\xd8\xca\xe3\x68\xb4\x67"
- "\x0c\x03\xfb\x6f\x29\xc3\xbb\xb0\xbd\x38\x89\x16\xcd\xaf\xcb\x42"
- "\x9f\x1f\xab\x30\x4e\x83\x85\x98\x48\x0b\x8f\xad\xcb\xe2\xe6\xc1"
- "\x78\x22\x71\x1d\x35\x26\xb6\x60\x3f\x88\xa0\x39\x5b\x63\x69\xf1"
- "\x02\xed\xb5\x9c\x28\xc0\xcc\xf0\xb2\x6b\x39\x5b\x23\xa4\xb8\x47"
- "\x76\xc3\xd6\x72\x41\x55\x58\x83\x71\x8f\x3a\xa9\x86\x54\x01\x2d"
- "\x3b\x32\xab\x6a\x41\x0f\xd4\x14\xa7\xd3\x72\x3b\x8c\xaf\x98\xbf"
- "\x9a\xbf\xc7\x95\xda\xa9\x4e\x61\x4f\x27\x4a\xb8\x07\xd0\x80\x62"
- "\xd2\xa9\xda\x16\x8e\xef\x31\xde\x91\xbd\x53\x47\x52\x6a\xa9\xf0"
- "\xef\xb1\x80\x9b\x74\x42\x59\x7c\xd7\xd8\x8b\x04\xd2\x47\x08\xb9"
- "\x5b\xcd\xe7\x67\x11\x39\xe6\x05\x7b\x8f\xcc\x83\xff\x93\x17\x11"
- "\x7f\xc8\xa7\x4e\x3e\x02\xe9\xed\xba\x11\xb6\x54\x9d\xb2\x23\x55"
- "\x37\xa2\x93\xea\x54\xa6\x46\x2b\xe9\x9c\x18\xb7\x67\x8a\x85\x28"
- "\x76\x80\x5d\x58\x2c\x40\x1f\x2c\x9a\x6f\xb4\xbf\xac\x1b\x66\x7b"
- "\x59\xa7\xe8\xec\xd4\x29\x6d\xab\x75\x8a\x8e\xd5\xba\x61\x9d\xed"
- "\x3a\xa5\x29\xda\x42\x3e\xb1\xfc\x83\x54\x37\x36\xb1\x39\xde\x4e"
- "\xff\x62\x55\xa7\xff\xd6\x66\x55\x23\x09\x9a\xaa\x27\xe8\x0b\x4d"
- "\xf6\x2a\x8c\x0b\x00\x13\x2a\xdb\x6b\x71\xa0\x0b\x8a\xf6\x00\x7d"
- "\x73\x9e\x9c\x44\xbf\xb3\x67\xa8\x22\xb4\x4f\x81\xbc\x5a\xaf\xd0"
- "\x40\x1a\xe0\x47\x53\x41\x33\x6e\x0f\xa4\xeb\x15\xc1\x70\x69\xcd"
- "\x9c\x0f\x84\x66\x8c\x54\xe1\x1c\x03\xe6\xe5\xf9\x46\xcd\x33\xb3"
- "\xbb\xff\x6e\x16\x87\x35\xc3\x77\x5f\x31\xda\x24\x19\xc3\x8d\x92"
- "\x4d\x72\x40\xd1\xbb\x5f\x11\xc8\xd3\xd8\x35\x5e\x17\x40\xe6\xe4"
- "\x6c\x36\xba\xf5\x09\x8c\xdf\xce\xdd\x6c\xc9\x13\xba\x7c\x3b\x83"
- "\xcc\x54\xfa\x43\xff\x49\x63\xef\x0c\xdb\x22\x53\x2e\x13\x1f\x7c"
- "\xb7\xe7\xaa\x55\x8e\xcf\xda\x78\x19\x35\xb5\x59\x09\xfc\x46\x41"
- "\x83\xe7\xd7\xed\xb9\x6a\x91\x23\x5e\xaa\x21\x0d\x7e\x3b\x31\xef"
- "\xaa\x58\xee\xf6\xe2\xb4\xd4\x97\x08\x8b\x65\x82\xf1\x90\x10\x47"
- "\x79\x29\x30\xde\xc4\xd8\x4d\xf1\x28\xc3\x94\x8b\xe0\x7f\x25\xe6"
- "\xa3\xaa\x6d\x91\x02\x94\x01\x58\xaa\xa0\xfe\xdb\x66\x09\x39\x5b"
- "\x6b\x40\xb6\xe6\xd1\xb1\x0b\xa6\x0b\x3b\x8a\x63\xdb\x33\x94\xe5"
- "\x40\x8f\x1a\x69\xfe\xa2\xba\xcc\x46\xd0\x57\x17\x7d\xdc\x46\x0e"
- "\x26\x5c\x41\x7f\xbe\x3e\x16\xbf\xaa\x3a\x8b\x7f\x61\xb9\xc5\xbf"
- "\x68\x8f\x90\x53\x44\xe0\xc2\xfd\xf8\xaa\x0b\x32\xbf\xe4\x2e\x5f"
- "\xb3\x97\x6f\x12\x5f\xb3\x60\xe7\x31\x7b\x0f\xb0\x83\xf6\x9b\x90"
- "\xb3\x6d\x3a\xc6\x24\x41\xbb\x0e\x65\x6e\x7b\x86\x5f\xd7\xf9\x17"
- "\x94\x23\xf6\xac\xaa\x46\xb8\xcc\x90\x6e\x34\xcb\x82\x9b\x24\x19"
- "\x03\xba\x47\x2f\x64\x3f\x95\xdf\x8e\xe7\xa9\x3a\x63\x7f\x8d\x79"
- "\x81\x6e\xe8\x03\xdc\xc7\xde\x19\x3b\x03\xae\x47\xe1\xfa\x95\x3d"
- "\x67\x5b\xa8\x3d\x67\x6b\xa4\x3d\xa7\x28\xcf\x9e\x13\x95\x00\x57"
- "\x12\x5c\xc9\x70\xa5\xc1\xb5\x11\x2e\xb0\x59\xa2\x0c\x70\xc7\xf7"
- "\xf9\x70\x6d\x87\xab\x08\xae\x52\xb8\x76\xd9\x77\x14\xeb\x05\xc0"
- "\x27\x5c\x5a\xb8\x82\xed\x39\x85\x56\xb8\x7a\x3d\x37\x42\x33\xdb"
- "\x63\x59\xfc\x05\xdf\xd3\x54\x8d\xf1\x79\x93\xaf\xa0\x2f\xc9\xd8"
- "\x83\xba\xb6\x81\xf9\xa1\x97\x8d\x48\x70\x37\x57\x82\xe5\x43\xff"
- "\xea\x1c\x60\x79\x07\xdc\xce\xbd\x68\x8a\x93\x6c\xc1\x0b\xb4\xb6"
- "\x74\x92\x06\x7d\x5a\x56\x1d\xd9\x48\xc2\x2c\x24\xb5\xb2\xb1\x83"
- "\xa4\x46\x8b\x3e\xe3\x93\xf1\x1c\xcb\xb2\x4a\xc4\xb1\x9d\x46\x68"
- "\x3b\x0d\x5b\x63\xed\xaa\xc2\x3c\xaa\x2a\xac\x60\xfe\x29\x41\xfe"
- "\x60\xbc\xb3\xae\x71\x29\xe2\x0a\xc6\xa6\x55\xcd\x57\xc8\xcb\xd1"
- "\x54\xa8\x8a\xc5\x53\x80\x00\x30\x19\xf9\x1b\x62\x4c\x1a\x9b\xfe"
- "\xbe\x9e\xa6\x01\x5e\xfc\xec\x40\x37\x01\xc7\xa4\x80\x2d\x1c\x9f"
- "\x4a\xf8\x02\x7d\x16\x28\xc5\x88\xa2\xc3\x46\x44\xc0\x3b\x05\xc6"
- "\x90\x2a\x82\x31\x69\x51\x22\x99\x50\x04\xef\x58\xbc\x4f\xa8\xf7"
- "\x1c\xbd\x9a\x0a\x2f\xea\x48\xc9\x0b\x44\xe9\x7f\x91\xc7\x90\xb5"
- "\x03\xed\xbb\xe2\x28\x18\xa2\xca\x67\x5f\xd4\x92\x83\xba\x53\xa0"
- "\x97\xf6\x80\xfc\x8e\x2a\xef\x04\xd9\x0d\xb4\xb4\x0f\x8c\x96\xaa"
- "\xc0\xeb\x45\xcb\xce\xe0\xf9\x46\x4e\xcf\x48\x82\x34\xeb\x4e\x4f"
- "\xa4\xf1\xda\x46\xa0\x27\xd0\xd5\x54\x6b\x27\x01\x32\xb2\x48\xa2"
- "\x67\x21\xd0\x13\x68\xaa\x41\x9a\x02\x3d\x18\x4d\xa9\x48\xd3\x12"
- "\x27\x9a\x82\x7c\x62\xbe\x3c\x91\xa6\x02\xd0\xb4\xc4\x0d\x4d\xbb"
- "\xc6\xf7\x40\xd3\x9d\x1e\xd1\xb4\x6c\x10\x34\xf5\x77\x1b\xff\xcd"
- "\x86\x3a\x33\x37\x6a\x0f\x05\x99\x67\xb2\x7d\xc2\xfc\xd2\x52\x43"
- "\x91\x42\x30\x80\x9c\x53\x6d\x2d\x07\x9a\xa8\x70\x4f\x00\xc6\x2c"
- "\x63\x3e\xe4\xca\xe8\x35\x7b\x6e\x71\x20\xa6\x81\xec\x8a\x7d\x10"
- "\xfd\xf0\xe9\xcd\xa4\x44\x4e\xcb\xab\xaf\xb6\x81\x8e\x09\x2c\xee"
- "\x40\x9b\x33\xb7\x38\x4c\xa0\xb1\x04\xe5\xc8\x82\x49\x44\xd1\x01"
- "\xb2\x42\x9f\x48\xc6\xe7\x81\xbc\xeb\x00\xf9\x79\x41\x16\x30\xfd"
- "\x49\xbd\x40\xe1\x4a\x45\xff\xaa\x82\x7f\x11\xca\x75\xc6\x5f\xe4"
- "\x19\xae\x35\x56\x2d\xf8\x18\xca\x53\x4f\x3a\x1a\x69\x23\xa9\xb1"
- "\x3d\xf9\x2b\xa4\x46\x68\xed\x86\xfe\xfb\x09\xc6\x4d\x4c\x6e\x42"
- "\xbe\xee\x21\xa6\x46\x47\x3f\x11\x56\x73\x39\x8c\xbc\xc0\x7e\x81"
- "\x7d\x64\x93\x93\xfc\x05\xd9\x1e\x58\x2c\xc6\x11\xb1\x83\xfc\x2d"
- "\xc6\xb8\x08\xc0\x4b\x8c\x2f\xd2\x6b\xff\x78\x19\xfa\xc7\x5a\x16"
- "\xe3\x49\x03\xf4\xd8\xd3\xd1\xce\x79\x88\x3c\x33\xd9\x2a\x18\xff"
- "\xf2\x44\x79\xcf\xe9\x5e\x78\x94\xd2\x08\x62\x87\xba\x0b\xb9\xc5"
- "\x84\xb6\xc7\x8e\xc0\x79\x49\x18\x3f\x87\xa8\xa3\xc1\x76\xf8\x0e"
- "\xf4\x41\x1c\xe0\xeb\x12\x99\xb0\x33\x0e\xec\x81\x76\x8c\xd5\x06"
- "\xf5\x59\xc3\x63\xdc\x0a\x19\x23\xf6\xc1\x3b\xe6\x2f\x56\x90\xfc"
- "\xc5\xb6\xea\x70\xdc\xef\x98\x2f\x5a\xa1\x93\x3b\xbe\xf9\x19\xb1"
- "\x2b\xed\xd3\xd9\xd9\x7a\x99\x9a\xc7\xbd\x55\xbe\xab\x44\xba\x36"
- "\xcb\x02\x27\xf0\xf9\xe0\x0f\x54\xfa\x14\x32\xfc\x82\x4c\x7d\x02"
- "\x6c\x2b\xa2\xc7\x78\xdd\xd2\xbb\xd4\x08\xa4\x43\xe4\xd4\x34\x92"
- "\x66\xcf\xb2\x47\x98\x92\x2e\xa2\xff\xc5\x01\xca\x5e\x35\x8b\x5f"
- "\x66\xcf\xfc\x0c\x75\x79\xa8\x90\xfd\x99\x0a\x64\x4a\x08\x7d\x11"
- "\xda\xfa\x02\xb4\xf5\x02\xd0\xf5\x02\xb4\x75\xb5\xd8\x56\x31\x7e"
- "\x9d\x00\xf4\x87\x77\xbd\xeb\x3f\xa9\xad\x2f\xa2\xaf\xf5\x77\xea"
- "\xd6\x5d\x24\xb7\xd1\x7b\x71\x7d\x97\x9d\x7d\x6c\x37\xd9\x4e\x11"
- "\xfc\x2e\xd3\xcf\x86\xa8\xcc\xe7\x00\x8f\x48\x73\xb0\x09\x2c\x34"
- "\x60\xab\x59\xe2\x03\xd6\x87\x76\xc6\x8e\x28\x89\x83\xfa\x20\xed"
- "\x2f\x91\xc9\xd8\x9f\x81\xf6\x13\x4a\x90\xfe\xae\x31\xa4\x83\x18"
- "\x0f\x86\x01\x0f\xe2\x44\x1e\x64\x89\x3c\x00\x5b\x11\x74\x35\xce"
- "\x71\x68\x4a\xd2\x39\x0f\x06\x46\xa3\x51\x41\x43\xdc\x5f\x83\xdc"
- "\xf7\xd7\xa0\x67\x3a\xf8\x18\x52\x86\x7e\x6b\xc1\x3e\xfe\x83\xd0"
- "\x09\xfd\x36\x57\xec\xb7\x34\xf6\x57\x52\x9f\x3d\x2f\x1b\x75\xd1"
- "\xb3\x3e\x3b\xfa\xd4\xbf\x68\x9f\x0d\xba\xbe\x7d\xf6\xb6\xd7\x5c"
- "\xfb\xec\x6d\x75\xae\x7d\xf6\xb6\x1c\x47\x9f\x15\xdf\x0d\x49\x9f"
- "\xbd\x6d\xd7\xf7\xd3\x67\x6f\xdb\xd5\x4b\x9f\x6d\xf3\xa0\xcf\x6a"
- "\xdc\xf4\x59\xcd\xf5\xeb\xb3\x41\x15\x37\x4e\xc7\x6a\xfc\x3a\xe4"
- "\xbd\xe8\xd8\x97\x9d\x74\xac\x3f\xea\xd8\xdb\x8b\x7a\xeb\xaf\x9d"
- "\x45\xd0\x5f\x55\x62\x7f\xfd\xf7\xf7\xa0\xbc\x3b\x0a\x3e\xa9\xef"
- "\xbf\xbf\xda\x8a\x1c\xf6\x93\xdb\x3e\x1b\x8b\x7d\xb6\x8c\x98\xcc"
- "\xac\xcf\x2e\x92\xfa\x6c\x91\x38\xde\xe9\xa3\xdf\x06\xb9\xeb\xb7"
- "\x18\xd3\x0b\xe3\x79\xf5\xd9\x6f\x45\x7b\xa9\x73\x2c\xf6\x5b\xe3"
- "\x4d\xa6\x6b\xef\x9c\xef\xda\x6f\xef\xcc\x73\xed\xb7\x77\x3e\xe9"
- "\xe8\xb7\xe2\xbb\x21\xe9\xb7\x77\xce\xfb\x7e\xfa\xed\x9d\xf3\x7e"
- "\x38\xba\x56\xe3\x76\xdd\x7c\xe8\x75\xed\xdd\x07\x59\xbf\x75\xa7"
- "\x6b\x53\x45\x5d\xeb\x8f\xba\xf6\xae\x3f\x79\xd6\x77\xc7\x3c\xf3"
- "\x2f\xde\x77\xaf\xb3\xce\xbd\xfb\x2e\xd7\xbe\x7b\xf7\xd3\xae\x7d"
- "\xf7\x6e\x99\xa3\xef\x8a\xef\x86\xa4\xef\xde\xad\xf9\x7e\xfa\xee"
- "\xdd\x9a\x1f\x8e\xce\x0d\x9e\xe1\xae\xef\x6a\xc7\x91\xb4\x06\x59"
- "\x70\x81\xa9\x88\xed\xc1\x4b\x33\xd9\x7e\x41\xd8\xbe\x15\x59\xf0"
- "\xfb\x26\xcd\x74\x22\x64\x57\x87\x63\x5c\x16\xdc\x3f\xb3\xc5\x69"
- "\x7f\x0a\x5b\xd3\x95\x05\x9f\x92\xf6\xd7\xec\x14\x63\xb7\xf4\xb5"
- "\xbf\x86\x66\x56\x99\xf9\xef\xc6\x6a\xc4\x3d\x35\x8d\xd2\x33\xf3"
- "\x25\x23\x1b\x1b\x4c\xb3\xaa\xea\x2d\x7e\x55\xf5\xee\xd6\x49\x02"
- "\xd6\x53\x8a\x7b\x4a\x5a\xc7\xc5\x85\xb7\x66\x13\x92\xc7\xd6\x20"
- "\xc6\xce\x85\x36\x26\xb3\xbd\x14\x01\xa3\x43\x5a\xd3\xc3\x09\xa4"
- "\xc5\x4a\x69\x2c\x8e\x76\xba\x0f\x15\xe0\x1d\xc8\x90\xe0\x9d\x29"
- "\x44\x89\x7e\x8e\xa7\x5e\x45\x2c\x8e\x4d\x02\x19\xc1\xf6\x8b\xb0"
- "\x75\xfc\x3b\xef\x6e\x2b\x69\x21\x8a\xea\x8d\x6c\xdf\x1c\xee\xcb"
- "\x29\xcd\x45\xfc\xfb\x3c\xb0\x9d\xca\x15\x44\x28\x5e\xa0\xa3\xfe"
- "\x45\x4a\xb6\x8f\x18\xb0\x22\xed\xd5\xc1\xd8\x80\xc2\xd8\xf9\x15"
- "\x92\xaf\x5d\x0a\xf5\xfb\x20\x05\xcf\x99\xfa\xd0\x92\x78\x12\x08"
- "\x97\x8a\xe6\x14\x29\xdb\x33\xc6\x11\x69\xfe\xd0\xed\x9e\x70\x8c"
- "\x05\x7c\xb7\x46\x21\xee\x0b\x42\x9f\x03\xec\x8c\xe5\x26\x39\x48"
- "\x26\x48\xa7\xe9\xa9\xd4\x94\x64\x23\x6a\xa0\x05\xae\xe1\x63\x4c"
- "\x31\xa1\x24\x2e\x7c\xc3\x18\x42\xde\x5c\xdb\x24\xc7\xfd\x1c\xf6"
- "\x6d\x77\xb7\x19\x53\x7e\x82\x6b\xfc\x2c\x7e\xc0\x79\xd9\x38\x7b"
- "\xd8\x37\x3c\xee\xef\x79\xd9\x78\x3f\x5c\x7b\x98\x0d\xcf\xb8\x46"
- "\x2e\xb4\x6a\x14\x98\x17\xf2\xbc\x63\x4c\x3c\x49\xd4\x7a\xb6\xd7"
- "\x9e\xc7\xe4\x90\x8d\xdb\x88\x79\xcd\xb2\xf1\xac\xad\xf0\xcc\x62"
- "\x6a\xe2\x7e\x7c\x76\x6e\xa3\x68\x81\x8e\xc9\x07\x43\x91\x52\x18"
- "\xbb\x40\xc7\xf6\x8d\x42\x3b\x37\x41\x9b\x21\x8f\x0a\xf7\xeb\xb0"
- "\x7b\x0a\x09\xcc\x87\x34\x2c\x07\xee\x2a\xb6\x67\x58\x36\x2e\x01"
- "\xcb\x76\x7b\xd6\x40\x55\xa4\xa4\x80\x6d\x7e\xf6\x46\x76\xac\x41"
- "\x36\xbe\x4c\x2d\xa3\x94\x16\xcd\xaf\xd8\x80\xf3\xd8\xb8\xbf\x1b"
- "\xf7\xac\xcb\xc6\xaf\x87\xf2\x15\x3b\xd9\xbc\xed\xf8\x48\xb3\x6c"
- "\x9c\xaa\x6b\x3f\x02\x5b\x6b\x19\x5f\x8e\xdf\xc1\xdf\x88\xf9\xc3"
- "\x19\xfe\xa0\xce\xda\x14\x1f\x0a\xcf\x7f\xe3\x7b\xc0\x95\x91\xf0"
- "\xfb\xd2\xae\x3d\xe0\xfc\x77\x80\xa5\xf1\x7b\x01\x9b\x3a\xb6\xff"
- "\x4d\xde\xfb\x9c\x3f\xdb\x93\x2c\xf2\xad\x0a\xd0\xdd\x83\x77\x12"
- "\x46\x00\x17\x12\x46\xb0\xbe\x6f\xa5\x98\xe5\x4c\x1f\xc9\xb4\x8f"
- "\x61\xbe\x5c\xe0\xa1\xbd\x50\xa3\x60\x73\xd3\x9d\xc8\x97\x06\x7c"
- "\x77\x0d\xf9\xb2\x09\x74\x81\x98\x37\xd8\x51\x7f\x7c\xbe\x87\xf1"
- "\x53\x00\x5e\xb0\x3d\x4f\x32\x6d\x15\x8b\xdf\x04\x32\x03\xf7\xaa"
- "\x1f\x48\x82\x7a\x21\x6e\x01\x23\x6f\xc6\x5b\xe5\x25\x89\x3c\xfd"
- "\x83\x16\xab\x7c\xd3\x05\x82\xb2\x85\xe4\xbc\x40\x14\xa0\x87\x14"
- "\x58\x26\x0d\x9e\x5f\xf1\xa0\xc4\xc7\xb5\xc0\xbb\x44\xc0\x2e\xd0"
- "\x7c\x13\xd0\xaf\xa4\x83\xad\xd5\x54\x94\x08\x44\x25\x40\x3e\xb3"
- "\xec\x1e\x25\x94\x17\x88\xb1\x4a\x71\x4f\x35\xd0\x30\xa1\x3d\x43"
- "\xdb\x28\xd1\x10\xeb\x84\x7b\xa2\x31\x6e\xa9\x59\xa6\x8d\xe4\x18"
- "\xd2\x86\x48\x6d\x76\x47\xcf\x9c\x37\x49\x70\xce\x54\x32\x5d\x50"
- "\xb6\xc7\x52\x9f\xbb\x4b\x71\xbe\x79\x4e\x33\xfa\xac\x6a\x22\x61"
- "\xaf\x9c\xa6\x26\x8b\x9d\x08\x7e\xed\xb1\xb8\x0e\x61\xdf\xf0\xc0"
- "\xe8\xb0\x35\x04\x6d\x8d\xd8\x54\x2b\x09\x34\xa5\x58\x78\x9c\x41"
- "\x72\x99\xd8\x57\x82\x0c\x07\xb9\x0e\x3a\x55\x91\x7a\x99\xdc\x85"
- "\xf4\x12\xfc\xb7\xc6\x02\xcd\xde\x7d\x2e\x81\xa4\x0d\x4c\x8e\xde"
- "\xc3\xce\x6f\xa2\x7d\x01\x32\x5f\x8e\xfb\xf2\x4c\x16\xb0\x4f\x72"
- "\xb6\xc6\x0e\xb0\x9c\x4a\x77\x32\x12\xdb\x2d\xe0\x3c\xb4\xd8\xe6"
- "\x30\x6c\x73\x9b\x95\xe0\x5c\xfe\x9c\x97\xd0\x57\xf2\x15\x22\x64"
- "\xb5\xc7\x62\x9b\x05\xff\xc2\xa6\x81\xcf\xe9\xdf\x3b\xab\xaf\x6f"
- "\x53\xa0\xb7\xb0\xe1\xee\x52\x41\x55\xd8\x84\xdf\xc6\x3a\xe0\x39"
- "\x9f\x39\x57\x08\xa3\x3b\xd2\xdf\x64\xb5\x13\xea\xe7\x5c\x07\xdb"
- "\x40\xeb\xe0\xbe\xfd\x53\x49\xb0\xe1\x4d\xce\x77\xfb\x06\x91\x06"
- "\xb1\xb8\x0e\x56\xd8\x84\xf1\x35\xe6\x60\x1d\x2c\x17\xc9\xec\x8b"
- "\x84\xf1\xdf\xa4\x6b\x26\x76\x9f\x07\x46\xe3\x9e\x03\xe4\x7f\x8a"
- "\x0d\xf8\x7f\xd5\x8a\xfe\x91\x2c\xa6\xb4\x6b\x04\xed\x17\x5b\xab"
- "\x4e\xde\x93\xff\xf7\xbd\xfb\x5c\xd2\x40\xf9\x7f\xdf\x10\xf1\xff"
- "\xbe\x9b\xa0\xfd\x13\xbc\x68\xff\x84\x21\x6a\xff\x84\x9b\xa0\xfd"
- "\x13\xbd\x68\xff\xc4\x21\x6a\xff\x44\xb7\xed\x7f\xe2\x2e\x81\xb2"
- "\xbd\x28\x01\x9b\xd9\xfa\x24\xd7\x57\xf7\xbf\x8d\xfb\x4e\xd8\xb9"
- "\x2e\xf1\x99\xf0\x73\x5e\xca\x6e\xcf\xaa\x6e\xcf\x81\xdd\x9e\x83"
- "\xba\x3d\x6b\xba\x3d\x07\x4b\xcf\xa0\x47\x7c\x2f\xc9\xee\xbf\x07"
- "\xec\xd2\x34\xb3\xec\xfe\x7d\xe2\xfb\x09\xe8\x3f\x0c\x74\xfa\x84"
- "\x3e\x62\x5d\xde\x7d\x41\xf6\x23\x76\x4e\x9b\x6e\x18\xa3\xa3\x6b"
- "\xd3\x88\x60\x88\xca\x9f\xb3\x0e\x64\x17\xf0\x8f\x76\x6a\x86\x81"
- "\x8d\x70\x27\xfa\xa8\xc3\x7d\x07\xda\x78\xdc\x4f\xf2\xa3\xdb\xb1"
- "\x7d\x53\xf5\x46\x22\xf8\x3c\xc0\xd6\xf3\x85\x9c\xa8\x7c\x8b\xcf"
- "\x03\x63\xe8\x8e\x62\x7d\xae\x5c\x50\xe6\xa6\x0b\xda\x75\x16\x6a"
- "\x79\xfa\x32\xc8\xa1\x2b\xe8\x37\x1e\x78\x9c\x40\x2d\xc6\xf8\x8b"
- "\x50\xdf\x1f\xad\xab\x4a\x86\xb2\xe1\x3b\xf0\x2d\x18\xc7\x45\x25"
- "\xf0\xd8\xeb\x51\xf9\xd5\x6d\x15\x04\xe3\x09\x89\x65\xe6\x51\xff"
- "\xa8\x04\x2c\xb3\x57\xfb\xd4\xb0\x45\x01\xdf\xfc\xc5\x73\x3a\x05"
- "\xa1\xeb\x15\x41\x03\xe3\xe9\x8f\x4a\xdd\xda\xbd\x86\x2d\x1b\x79"
- "\xb9\x4a\x6f\xca\xb5\xba\x2f\x37\x5f\xac\x6f\xa0\x17\xe5\xea\xc2"
- "\xfb\x28\x57\xac\xaf\xd6\x9b\x72\xcb\xdc\x97\x5b\x20\xd6\x37\xd4"
- "\x8b\x72\x27\xf5\xd8\xff\xe9\x54\xae\x58\xdf\x34\x6f\xca\x75\x1f"
- "\xff\x17\xf0\xe0\x1d\x16\x26\xf5\xd8\x93\xef\x8c\x05\xef\x70\xf0"
- "\x40\x1f\xed\xcf\x57\x78\x87\x81\x07\xe6\xf6\x85\x01\xef\xf8\xff"
- "\x40\x9f\xfc\xf7\x8e\xf7\x0f\xd8\xfa\xe2\xbd\x77\x7c\xff\xb1\x5b"
- "\xfc\xa3\x2d\x4f\x0d\x9b\x8d\x34\xa0\x38\x52\xc8\x8d\x32\x0a\x01"
- "\x9b\x3f\xde\x20\x84\x92\x27\x40\x86\xa9\xb7\x93\x51\xa1\x6c\x7c"
- "\xfc\xe3\xc6\x75\x45\x44\x0e\xe3\x5d\xf9\x1b\x6b\xeb\xe4\x26\xdb"
- "\x74\xd4\x39\xf6\x5d\x89\x56\xd9\x7d\x90\xfe\x11\xe8\xac\x36\xb0"
- "\x3b\x79\x39\x51\xc6\xdc\x94\x50\x22\xfa\xcc\x68\x43\x1f\xa9\x61"
- "\x20\xc7\x4c\xdb\xad\xb8\x6f\x65\x14\xfc\xce\x06\xf8\x85\x32\xac"
- "\xe4\x2d\xc1\x22\x0b\x8d\x67\xf9\x2c\xec\x7c\x5e\xee\xe6\x8f\x69"
- "\xaa\x0e\x7d\x27\x5a\xce\xcb\x26\xcf\xf6\xb1\x10\x39\xfa\x38\x6a"
- "\xcf\x98\x3c\xcb\x2c\x9b\x32\x5d\x3c\x8f\xda\xcc\x7c\x7c\x42\x7d"
- "\xf1\xac\x27\xe6\x45\x5f\x9f\x53\xf5\x44\x8e\xfe\xd7\x21\x6f\x02"
- "\xfa\xfd\xec\xeb\x5c\xb7\xdd\x50\xb8\x0b\x7f\x4f\x0d\xa0\x43\x2f"
- "\x12\x39\x9e\xe5\xa4\xc1\x0b\xb4\xb9\x30\x86\x78\x72\x12\xce\x79"
- "\xb4\x90\x94\x75\x54\xc0\xf9\x27\xaa\xda\x1a\x81\x7b\xe3\xd8\xbe"
- "\x71\xd9\x94\xc0\x12\xbe\x8f\xdc\xca\x62\x0d\xc3\x33\x1b\xc7\xe0"
- "\xde\x18\x55\xd4\x2c\x9a\xeb\x1f\x5a\xdd\xd6\xc2\xe2\x05\x35\xc8"
- "\xa6\x8c\x42\xff\x8b\xad\xaa\xc2\xd2\x36\x55\x61\x59\x7b\xc6\x14"
- "\x95\xd4\x06\xfc\xbe\x94\x8e\xe3\x36\xcc\x07\xef\x27\x4b\xe7\xbc"
- "\xdd\xc4\xde\x1e\x1d\xa6\xa1\x96\x2e\xbf\x1a\xb2\xa9\x7f\x45\xda"
- "\x83\xad\xb0\xbd\x2d\x55\x37\x8e\xcf\x63\x4c\x29\xc7\xf1\x30\xd4"
- "\x7b\x23\x1f\x9b\x46\x6d\x64\x3e\x78\x41\x07\x3c\xa7\x93\x0f\xd0"
- "\x6e\x9d\xc2\xf4\xbf\x71\x1c\xea\xc8\xa9\x6b\xa0\xfc\x5f\x42\x9b"
- "\xea\xf9\x58\x2c\x6a\x3b\x3b\xdf\x28\x9b\x92\x04\xdf\xd8\x0e\xcf"
- "\xa1\x98\x0f\xde\xdb\xc4\xf7\xa5\x4e\xef\x4b\x71\xaf\x24\x7f\x3f"
- "\x55\x1c\xcb\x45\xed\x72\x7a\xbf\x4b\x3f\x0e\xe7\x26\xa6\xce\xc4"
- "\x36\x00\x1d\xd3\x50\xb7\x75\xf9\x09\xf1\x8f\x4a\x13\xf3\xe5\x37"
- "\xcb\xa6\xce\x6f\x05\x6c\xc1\xfb\x22\xa7\xdf\x17\xed\x4f\x0a\x21"
- "\x4f\x14\x23\x0d\xa7\xea\xcd\xf2\xc2\x03\x7c\x3c\x3b\x25\x99\xb5"
- "\x5d\x15\x95\xe4\x5c\x9e\x59\x36\x75\x06\x94\x99\xd4\x06\x76\x14"
- "\xe4\x89\xc6\x6f\x3a\xd3\x5b\x3a\x65\xa9\x8d\x5e\xbe\x48\xbb\x78"
- "\xc5\xaa\x38\x3c\x25\x37\xc2\x65\x8f\x63\x20\x9e\x23\x15\x0c\xdb"
- "\x32\x4d\xdb\xf1\x5c\x5b\x20\x3b\x0f\x9e\x8f\xfb\xa6\x02\x8a\x8c"
- "\xf6\xdc\xa2\x70\x21\x60\xab\xde\xb8\xf6\x71\x72\x49\xf6\x20\xf3"
- "\x03\x62\xd2\x12\x62\xd8\x8a\x7e\x3c\x3e\xc1\x34\xe6\xaf\x14\xe3"
- "\x4a\xb1\x31\xfb\x5a\x25\x39\xa0\x6d\x61\xe3\x7e\x78\x37\x9b\xcd"
- "\x71\x5c\x21\x72\x5b\xba\x92\xfc\x33\xa5\x46\xbe\x4f\x30\xcb\xff"
- "\x29\xd4\xb1\x7d\xba\xfb\x35\x15\xe4\xc1\x24\x25\xc6\x50\x94\x7f"
- "\x08\x63\x69\x7c\x8f\xef\xa4\xb3\x08\xf0\xfb\x62\xb6\x67\xf7\x5e"
- "\xfe\x7f\xea\x76\x7a\x66\xbf\x46\xf4\x59\x21\x9b\x7a\x19\xeb\x8a"
- "\xfe\x3c\x80\x8e\x57\xb0\x7e\x40\x8b\x36\x9f\x22\xb6\x77\x59\x05"
- "\xf9\xcf\x08\x39\xdb\xd0\xd7\xb3\xca\x96\x31\xb5\x8c\xa6\xab\x76"
- "\xe1\x19\xbb\x22\xf1\xdc\x5d\x7b\xc6\x83\x95\x4e\xe7\x49\x55\xad"
- "\x72\xf2\x6b\x48\x33\x4b\x67\x1b\x30\xce\x99\x3b\xf9\x62\x05\x1b"
- "\xef\x5a\xf0\xfc\x32\x41\xb5\x0d\x78\xb1\x2d\xb3\x62\x26\xc1\x79"
- "\x17\x19\xee\x99\x6d\x96\x3d\x54\x47\xfd\xb7\x25\xa5\x60\x9f\xce"
- "\xdd\xaa\xff\x07\xee\xfb\x03\x3a\xee\xc6\x7d\x7e\x40\xcb\xd7\xe1"
- "\xf9\x93\x59\x65\x44\xfb\x2c\xda\x4e\x21\xcf\xfc\x3e\x9a\xda\x1e"
- "\x08\x37\x92\xca\xc6\xff\x25\x47\x6b\x2b\x88\x6a\x1e\xf1\x49\x35"
- "\x53\x3b\x6b\x63\x02\x91\x87\x99\x89\x4f\xca\x15\xec\xd3\x76\x82"
- "\xe7\x07\xaa\xad\x55\x60\x0f\x2d\xab\x7c\x23\xa5\xc9\x57\x3b\x87"
- "\x10\xe8\x7b\x6c\x8d\x99\x9d\xf3\xb1\xb0\x33\xd2\xfe\x38\xdf\xed"
- "\x74\xbe\x67\x7b\x72\x24\x15\xd6\x5d\x24\xca\xaa\xd8\x53\x24\x2c"
- "\xd2\x87\xb2\xf3\x3d\x49\x90\xd1\x02\xbc\x5f\xad\x0b\xb0\xaf\xd6"
- "\x8d\xde\x71\x95\x04\x55\x27\x98\xc1\x36\xab\x20\x85\xf1\x24\x88"
- "\xb6\xc7\xfa\x55\x56\x7c\x42\x68\xf6\xb5\x90\xb7\x52\x8c\xbe\x76"
- "\x25\xdf\x5f\xa5\x5e\x2f\xc3\xf9\xcd\x00\x03\xee\xb3\xba\x4a\x42"
- "\x16\x9e\x4b\x63\x73\xb2\x38\xff\x6d\x6b\xd7\x69\x3b\xdb\x75\xf7"
- "\x76\xac\xd6\x8d\x93\xe6\xcd\xe7\x5f\x0c\xc4\x75\x82\x08\x9a\x71"
- "\x6f\x1e\xee\xed\xc3\x71\x80\xcd\xcf\x3e\x1d\xe7\xc8\x11\xc3\xf0"
- "\xfd\x60\x61\xb1\x8e\x3c\x68\x61\x67\x8f\x70\xde\x3e\xb0\x24\x0a"
- "\xeb\xda\x42\xd8\x5e\x21\x3f\xbe\x57\xc8\x8a\x6b\xd6\xaa\x42\xeb"
- "\xec\xa5\x5a\xd2\x31\x76\x7e\x99\x29\xe9\x1f\x24\xf5\x1a\x3d\xc3"
- "\xec\xf8\x24\xc0\x6d\xc6\x83\x56\xea\x5f\x68\x3d\xa8\x3b\x8e\xfa"
- "\x64\xda\xc0\xe5\xc3\x43\x6c\xfd\x17\x69\x03\x7c\x32\xee\x6e\x41"
- "\xbe\x6d\xd5\xff\x4f\xbc\x45\xfe\x54\x23\xb5\x55\x45\xff\x83\x1c"
- "\xad\xab\x71\xe1\x0f\xe3\x27\xe4\x43\x3e\x21\x8f\x90\x57\x0e\x3e"
- "\x1d\x67\x7c\xda\x2d\x70\x3e\x75\xa8\x36\x1b\x25\x5e\x59\x8b\xe6"
- "\x97\x7b\xc2\xaf\xca\xc6\xde\xf9\x05\x74\xee\xe2\xd7\xab\x2d\x24"
- "\xc8\xd4\x5c\x83\xeb\x05\x7e\x4f\x3d\x43\xc8\x53\xaf\x53\xa1\x6a"
- "\xd6\xa7\x5d\x7c\xb3\x65\xba\xe1\xdb\x37\x0e\xbe\x01\xff\xfb\xe0"
- "\xdb\x7d\x41\x03\xe1\x5b\x65\x23\xe7\x9b\x4d\xdc\xe3\xa5\x3b\x40"
- "\xe4\xd6\xd5\x3a\xf9\xf6\xab\x64\x3a\xf2\xef\xe9\x73\x5a\x72\x70"
- "\x6e\x15\xf0\xec\x7f\x5d\xf8\x27\xe4\x14\x6e\x07\x1e\x94\x22\x0f"
- "\xbd\xeb\x77\x8f\x84\x7b\xde\xef\x1e\x3e\x72\xab\xdf\x0d\x55\xbf"
- "\x7b\x58\x3f\xb8\x7e\xf7\x48\xf0\xad\x7e\xf7\x7d\xf7\xbb\x47\x34"
- "\xdd\xfb\x5d\x97\xdd\x10\x1f\xb3\x7c\xd1\xd2\x38\x3c\x9e\x18\xb5"
- "\x26\x21\x66\x25\xb7\x1e\x5c\xec\x07\x8d\x3d\x25\x54\x8e\xfe\xe5"
- "\x2a\xb7\xd7\x90\xb7\xc6\xd4\xc8\xed\x5f\x6b\x14\xd4\xa0\x4e\x13"
- "\x0c\xa3\x95\xe8\x27\x14\xfb\x67\x3e\xfa\xf0\x90\xfd\xb2\xb6\x3a"
- "\x98\xc7\xe4\xc4\xff\x99\xed\x14\xbc\x60\x3a\xae\xd7\x6c\xe8\x80"
- "\x6b\x2d\x51\xa8\xad\x44\x69\x1c\xc7\xde\x3f\x84\x7e\x13\x69\xf1"
- "\x82\xe9\x25\xf0\x0e\xfd\xf0\xb4\xa9\xa2\x42\x37\x42\x79\x16\xff"
- "\x6d\x99\x0a\x2d\x9e\xbb\xf8\x59\x1e\xe8\x7c\x63\x97\x5f\x25\xd9"
- "\x2f\xda\xe8\xb0\x9f\x9a\x51\x36\xe0\x39\xb9\x4b\xb2\x9f\x1d\xbc"
- "\x86\xeb\x1d\x60\x53\x3f\x37\x09\xbe\x35\x76\x7e\x39\xf3\xb3\x00"
- "\x72\x82\xbf\xff\x39\x8b\x41\x76\xcd\xb0\x55\x8f\x36\x47\xab\xaa"
- "\xc8\xd8\x6a\x28\x0a\xff\x24\x79\xbb\x28\x27\x7e\x76\xf9\xa9\xed"
- "\x5c\x4e\x54\x69\x00\x87\x4f\x03\x0e\x23\xfa\x93\x13\x4e\xf8\x1b"
- "\x37\x30\x39\x81\x78\x43\xdc\x21\xe6\x46\x02\xe6\x10\x87\x12\xee"
- "\xb6\x88\xb8\x53\xd7\x93\x40\x86\x3d\x1b\xc7\x1e\x9e\x73\xae\x4a"
- "\x72\xe0\xce\xde\x1d\x77\x57\xbb\xe1\x4e\x2e\xe2\x6e\xb5\x2b\xee"
- "\x9e\x3f\x15\x48\x0a\xb9\xbc\x70\xe0\x2e\xcb\x3e\x5d\xc2\x1c\xe2"
- "\x0f\xb1\x26\xfc\x59\x47\xaa\x9a\x5b\xba\xf0\x57\xb2\x84\xaf\xb9"
- "\xb2\x3d\xbd\x72\xba\xe7\xda\x6a\x51\x5e\x5c\x94\xe4\xc5\xab\x6e"
- "\xf4\xf4\x29\x2f\xe5\xc5\xcf\xd9\xfa\x33\xf2\xaa\x03\xf8\x86\xfc"
- "\x7a\x4a\x03\x72\x42\xf3\x9f\xe4\xe8\xdc\x9b\x84\x3f\xf1\x43\xc3"
- "\x1f\xf4\x7d\x0b\x75\xe9\x85\x47\xf7\x04\xf7\xc7\x23\xe4\x0f\xf2"
- "\x89\xf1\x07\xf8\x24\xad\x8b\xe3\x3a\x29\xf2\x0a\xf9\x33\x35\x99"
- "\xc8\x91\x5f\x25\x89\x5c\x46\xa0\x2c\x60\xfb\xb0\xbb\xc9\x78\xa0"
- "\xf9\x2c\xe4\x19\x1b\x5b\xa7\xfb\x2f\xcb\xc7\x73\xc4\xa3\x25\x3b"
- "\xfa\x97\x41\x3d\xed\xe8\x5f\xea\xba\xfc\x60\xca\x7e\xc6\xfc\xab"
- "\x18\xc7\xfc\x02\xfa\xe7\xcf\xb8\x0f\x47\xc3\xb6\xe9\xdc\x86\x9f"
- "\xf1\x8a\x28\x03\xb4\x38\x76\x65\xe3\x54\x3b\x8c\x53\x55\x30\x4e"
- "\x35\xc0\x38\x35\xa9\x89\xfb\x4e\x90\xfd\x72\x3d\x11\xcf\x37\x53"
- "\xff\xad\x11\x30\x46\x9a\x85\x74\x65\x6b\xbe\xfe\x85\xa5\xb8\x46"
- "\x45\x73\x60\x0c\xfc\x9f\x72\x02\xcf\x65\x07\x75\xf6\x01\x62\xea"
- "\x97\xa5\xe2\x9a\x76\xbd\x7e\x2d\xee\x77\x98\xa1\xe7\xf5\xfb\x19"
- "\x8b\x69\xc3\xd6\x03\xe5\x42\xa9\x7d\x83\xeb\x7a\xa0\xf3\x7a\xf1"
- "\x5b\x29\x16\x71\x2d\x70\xc6\x33\x2c\x0f\x8e\x9f\x40\x0e\xbe\x01"
- "\x63\x1a\xc7\x7a\xe0\xa7\xf8\xfe\x4f\xae\xeb\x81\x33\x98\x8f\x39"
- "\xb3\x6c\xc6\x46\xdc\x03\x03\xcf\xa1\x3c\xfd\x67\xb3\x9c\xd3\x1d"
- "\xeb\xed\x3c\x5d\x90\xb3\x98\x2b\x38\x5f\xd0\xcc\xe7\x09\x66\x14"
- "\x49\xe3\x71\x37\xf6\xd3\x00\xe4\xf4\x63\x79\x0e\x39\xfd\x18\xdf"
- "\xab\xa5\x29\x8e\xad\xea\x21\xa7\x4f\xc2\xfb\xd0\x8b\x73\x50\x4e"
- "\x1b\xb6\x46\xf2\xfa\x3d\x3a\x09\x68\xe2\x83\xb1\x33\x31\x1d\xcf"
- "\x1f\xa1\xbc\x2e\xc6\xb3\x39\x4c\x86\x17\x47\x6c\x64\xeb\xfe\x8f"
- "\x3e\xed\x2a\xbb\x43\xf7\xb8\xca\xee\x47\xd7\xf7\x2d\xbb\x7f\xfd"
- "\x68\xdf\xb2\xfb\xd1\x37\x6e\xc9\xee\xa1\x96\xdd\x92\xad\xe7\xad"
- "\xec\xfe\xb5\xf2\x96\xec\xbe\xd1\xb2\xfb\xd7\x0a\x27\xd9\xfd\x47"
- "\x57\xd9\x1d\x5a\xd3\x53\x76\x87\x36\x3a\x64\xf7\xa3\x11\x0e\xd9"
- "\xfd\x68\xa0\xab\xec\x7e\xfc\x31\xcf\x64\xf7\x63\x8f\x5e\x5f\xd9"
- "\xfd\xd8\x3c\x57\xd9\xfd\xf8\x64\x51\xb7\x5c\x1e\xb8\xec\x7e\xdc"
- "\xbf\x6f\xd9\xfd\xf8\xed\xae\xb2\xfb\xb1\x26\x2e\xa3\x1f\x0f\xe5"
- "\xb2\xfb\x31\x9b\x28\xd3\x2d\xce\xe9\x0e\xd9\xcd\xd3\x7b\xca\xee"
- "\xc7\x23\xfa\x91\xdd\x3a\xbb\x20\xc9\xee\x3a\x90\xdd\x75\x72\xe1"
- "\xcf\xee\x64\xf7\x6f\xcb\xab\x50\x76\xc7\xa3\xec\xfe\x6d\x79\xdf"
- "\xb2\xfb\xb7\xaf\xa1\x8c\x06\x1c\x93\x22\xf4\x91\x0c\xb8\x34\x2e"
- "\x39\x89\xf3\xd7\x8d\x88\xdb\xf3\xb2\xdf\xd8\xe7\x24\x3b\xcb\xf6"
- "\x27\x7c\xbb\x64\x3b\xa4\x0b\x77\xb9\xca\x76\x94\xeb\x28\xdf\x8b"
- "\xb7\x52\x73\xc9\x56\x5a\xdf\x9e\xf1\x44\x88\x24\xe3\x73\x20\x0d"
- "\xe3\x25\xa1\x0f\xa4\xe2\xab\xec\x52\x00\x0d\x1a\x37\xc0\x77\xf1"
- "\x37\x90\x77\x9e\xab\x3e\xf8\x8d\xd1\x96\xe1\xac\x0f\x9e\xf8\x2b"
- "\xea\x03\x03\x3f\xa3\xce\xf4\x80\xad\x78\x7e\x39\xea\x06\xfe\xfe"
- "\xc9\xd9\x7d\xeb\x83\x27\xde\xff\xbe\xf4\x01\xca\x9a\x91\x4e\x63"
- "\x48\x77\xfa\x00\xe7\x54\xab\xa2\x6f\x8c\x3e\x40\x39\x83\xf2\x05"
- "\x65\x0d\xca\x1d\x94\x33\x28\x73\x6c\xe2\xf9\xbc\xa2\x74\x0f\xf4"
- "\x01\xc8\x15\x3a\xec\x61\x3d\xd3\x07\x32\x6f\xf4\xc1\x93\x9a\x1f"
- "\x94\x3e\x40\xfe\x24\x5f\x5f\x7d\x20\x8d\xf3\x91\x3f\xc8\x2b\x89"
- "\x47\xd2\x58\x1f\xf9\x83\x7c\x42\xfe\xa0\x6d\x24\xe9\x83\x29\x49"
- "\x5c\x1f\x14\xf7\xab\x0f\x9e\x0c\xea\xd2\x07\x72\xae\x0f\xd8\x9c"
- "\xf8\x68\xd4\x07\xbf\x31\xf7\xd4\x07\xbf\x69\x73\xe8\x83\x27\x62"
- "\x45\xf9\xd8\x88\xbe\x17\x40\x1e\x36\xbb\xea\x84\x59\x4b\x3d\xd3"
- "\x09\xbf\x7d\xa6\x87\x4e\x00\xda\x1a\xf8\xba\x19\xea\x83\x52\xd4"
- "\x07\x36\xd4\x0b\x5e\xe9\x84\xdf\xea\x1d\x7a\xeb\xf1\x4a\x2e\x8b"
- "\x7f\xab\x72\xd5\x13\xb3\xe6\x8a\x7a\xec\x0d\x67\x3d\x21\xf8\x78"
- "\xa2\x27\x66\x3d\x22\xe9\x09\x94\xc3\x6f\xe0\x9a\x45\x97\x9e\x40"
- "\xb9\x3a\xeb\x51\x63\x62\x83\x93\x9e\x98\x15\xc8\xeb\x30\x2b\xd6"
- "\xce\xf4\xc4\xac\x09\xa2\xbe\xd9\xed\x9c\xee\xd0\x13\x3c\xdd\xee"
- "\xac\x27\x9a\x50\x4f\xcc\x4a\xeb\x47\x4f\x4c\xf3\x5c\x4f\xcc\x89"
- "\x70\xe8\x89\x39\x11\x7d\xeb\x89\x39\x4f\xa2\x9e\x60\x3e\x78\x81"
- "\xf7\x80\x73\x45\xee\x1d\x5c\x47\xe0\x1c\x0d\xe8\x0e\x33\xfa\xfc"
- "\x80\x7c\x0f\x31\x5f\xfb\x70\xc1\xfb\x26\x03\xfe\x2f\xb0\xdf\xd4"
- "\xab\x2d\x44\x89\x3a\xc3\x70\x9e\x28\x30\x4e\x1d\xa7\xd3\xec\x9c"
- "\x22\x8c\x9d\xda\xa5\x5f\x7e\x17\xe3\xa1\x7e\xa9\x05\xfd\x52\xd3"
- "\x9e\xf1\xbb\x3c\x27\xfd\x82\xb1\xfe\x6a\xba\xe9\x17\x33\xe8\x97"
- "\x46\xe9\x37\x90\xdf\xe8\x9c\x1f\xeb\xc7\xf2\x9f\x67\x17\xe6\xaf"
- "\x83\xfc\xf5\x5c\x1f\xfd\xae\xd9\x55\x1f\xcd\x0e\x17\x5c\xc6\x27"
- "\x4f\xdd\x23\xe9\x23\xd4\xe7\x42\x0f\x7d\xf4\xfb\x53\x5d\xfa\xe8"
- "\x0e\x27\x7d\x94\x24\xe9\xa3\xa7\x66\xdf\xf4\xe3\x93\x41\xc8\xbb"
- "\xeb\xad\x8f\x04\xd0\x3b\xdd\xf5\x11\xea\x28\x69\x7c\x22\x78\xa5"
- "\x8f\x7e\x5f\xf6\x83\xd2\x47\x37\x60\x7c\xd2\x9d\x37\x12\xcf\x90"
- "\x3f\xc8\x1b\xe4\x0b\xfa\x01\x47\x9e\x21\xbf\x90\x57\x53\xf4\xae"
- "\xba\x88\xf1\x0b\xf4\x51\x8f\xb5\x03\xe0\x15\xd0\x7c\x17\xf2\xcb"
- "\x59\x1f\x95\x8c\x96\xf4\xd1\x6c\x7d\x4f\x7d\x34\x7b\xa3\x43\x1f"
- "\xfd\x8e\xed\xaf\x62\xfe\x0f\x65\xbf\x7b\xda\x55\x17\x85\xf9\x79"
- "\xa6\x8b\x66\x9f\xea\x45\x17\x31\xdf\xd3\x86\xad\x2e\x63\x93\x52"
- "\xd0\x47\x5e\xe8\xa2\xd9\x36\x5e\x47\xdc\x0b\xfe\xbb\x60\x2e\xef"
- "\x67\x6f\x77\xe8\xa7\x59\x6d\xce\x69\x0e\xfd\x34\xa7\x4d\xd4\xa9"
- "\xc7\x07\xae\x9f\xe6\xb0\xdf\xe0\x3e\xf1\x37\x5a\xb8\x0e\x70\xd5"
- "\x4f\x73\x4e\xb9\xea\xa7\x39\xa2\x5f\xa5\x30\x25\xd7\x4f\x73\x0e"
- "\x88\x7a\xab\xd6\x39\xdd\xa1\x9f\x78\x7a\x4f\xfd\x14\xa6\xed\x47"
- "\x3f\xa9\x3a\x8b\xe6\x97\x77\x18\x8a\x4a\x6d\xbb\xe2\xc2\x27\xcf"
- "\x1b\x6f\xef\xde\x9f\x78\x3f\xb2\x13\xec\x57\x5d\xeb\x6d\xff\x46"
- "\x48\xa7\x6a\xb3\x51\x10\xcf\x53\x77\x04\xcf\x2f\x3b\xbf\x0c\xfa"
- "\x54\xb3\xfb\x3e\x05\xfd\x49\x29\xf5\xa7\xaa\xd8\x73\x04\xfa\x98"
- "\x1c\xd7\xdb\x5e\x85\xbe\x64\x6a\xab\x63\x7d\x4b\xd5\xa8\x25\xe8"
- "\xdb\xd2\xbf\x99\x04\xfa\xcb\x64\xc3\x7e\xff\x27\xe8\xb3\xd0\xaf"
- "\x9e\x9c\x44\x85\x07\xea\xb5\xc4\x3f\x96\x04\x60\xdf\x7a\x53\x5c"
- "\xcf\x41\x5f\x18\xb8\x8e\x03\xb8\x0e\x59\x78\x8c\xf7\xa9\x57\xe1"
- "\xea\xe0\x7d\x6a\x5c\x47\xbb\xee\x5e\x77\xeb\x38\xa6\x24\x33\x5b"
- "\xc7\xc1\xb3\x4a\x78\x46\x4c\xc0\x3e\x84\xeb\x38\x56\x6e\xdb\x41"
- "\x7d\x03\x77\xb2\x75\x9c\x06\x97\x75\x9c\x1f\xd7\x13\x39\xfa\xc9"
- "\x28\x74\x5e\xc7\xd1\x55\xf5\xb0\xeb\xb0\x7f\x61\x7f\x1a\xb8\xcc"
- "\x0b\x77\xeb\xff\x9a\xed\x9d\x00\x5a\xdb\x55\x45\xa5\xf4\xd5\xe2"
- "\xbc\xff\x69\xb0\xca\xd0\xa7\xa8\x1d\x78\x27\x80\x6c\xa3\xca\x6e"
- "\xb2\xad\x53\xe4\x43\x27\xe7\x03\xf0\x50\xb9\xa0\x8d\xd0\x85\x36"
- "\xe8\x3f\x9d\xa2\x5f\x51\xab\x19\x70\xa8\x1b\x5d\xbc\x16\xe9\xae"
- "\x21\xc5\xa2\x6f\x51\xe1\xe5\x58\x3f\x01\x68\x4d\xd3\xe5\xe4\x8d"
- "\xab\x56\xb6\xee\x69\xe8\x20\x93\x41\x96\xa1\x3f\xa5\x00\xc0\xee"
- "\x88\x9d\x1d\x40\xf7\x33\x9c\xee\xe8\xef\x0d\xef\xb6\x97\x75\x5a"
- "\x28\xfb\xde\xce\x4e\x90\x65\x56\x4e\xfb\x05\x2f\x05\x12\xe6\x8f"
- "\x14\xd7\x3e\xc1\x6e\xa8\x06\x7e\x33\x59\xd6\xa6\xa6\x18\x23\x44"
- "\xf8\x5a\x87\xbe\xaf\x82\x1f\x6c\x03\xda\x77\xea\x10\x1b\x81\x25"
- "\xe7\x71\xed\xf3\xa4\xcb\xda\xa7\xe5\x65\xc7\xda\x67\x75\xd9\x71"
- "\xbe\x57\xc5\x65\x3e\x2c\x6c\x5a\x67\x31\xd7\x39\x6c\x3e\x2c\x61"
- "\xa0\xb4\x7f\x56\xf3\xfd\xd1\x3e\xf0\x07\x4e\xfb\xf0\xc6\xc1\xd1"
- "\xfe\x0f\xf9\xdf\x1f\xed\x95\x3f\x70\xda\x3f\x1b\x39\x38\xda\x3f"
- "\xe7\xd6\xff\x11\xd2\x1e\xc7\x30\xd2\xf8\x45\x1a\xbb\xa0\x0e\xe3"
- "\xfa\xfa\x8f\xbb\x1c\xe3\x96\x3f\xee\x92\xd6\x90\x81\x66\x8a\x1c"
- "\xf4\xe7\x0d\xb4\xd0\x2f\x21\xe3\x2f\xc8\xfe\x78\x97\xb4\x7e\x9c"
- "\x87\x71\x65\x90\x8f\xaf\x02\x1f\xe3\xf0\xac\x91\xc8\x43\xd0\x39"
- "\x0b\xdb\x40\x2f\x8c\x9d\x5f\x6e\xcf\x01\x9d\xf4\x5a\x5c\xb8\x1b"
- "\x7e\xca\x51\x9f\xf8\x27\x90\xc0\x05\x7a\x07\x5f\x85\x97\x81\x9f"
- "\x1d\x60\x9b\x59\x9b\x08\x9e\x1f\x56\x37\x81\xdd\xda\x19\xeb\x37"
- "\x0f\xc6\x00\x12\x4f\xdf\x4c\xb4\x32\xbb\xac\x57\x9e\xee\x70\xe5"
- "\x69\x6b\x2f\x3c\x9d\xbf\x14\xfa\xa9\x5c\xb4\x9d\x19\x4f\xcd\x5d"
- "\x3c\x65\x7a\xe4\x65\x5d\x30\xf2\x55\xe2\x29\xea\x11\xc6\xd3\x66"
- "\xae\x47\xba\x7c\x2d\xbd\xec\xb0\x9d\x2b\x23\x4f\xf5\xc2\xd3\x3f"
- "\xd4\xbb\xf0\x34\x72\xa0\x3c\xfd\xb7\x46\x57\xfb\x2b\xe2\x19\xcf"
- "\xec\xaf\x3f\x2e\x42\xfb\xca\xd9\xfe\xc2\xe7\x56\xb0\xb7\xec\xfe"
- "\x85\xbb\xda\xbc\x1a\xff\xff\x51\xef\x6a\x4b\x45\xcc\xe0\x75\x7a"
- "\x2e\x67\xe0\xb6\x54\xc4\x58\xcc\xf3\xc6\xab\xbd\xd9\x51\x11\x13"
- "\x5d\xed\xa8\x3f\x5a\xb9\xbd\x14\x11\xde\x9a\x8e\x76\x54\x84\x8a"
- "\xa7\x3f\x67\x70\x4e\x77\xd8\x51\x3c\xbd\x15\xfd\xcf\x65\x44\xcc"
- "\x1b\x98\xed\x74\xe7\xf7\x6c\x3b\x69\xfa\xb0\x9d\x34\xff\x22\xb6"
- "\xd3\x9f\xea\x6e\xe9\x6f\x6f\x75\x48\x84\x7e\x70\x3a\xe4\x79\xb7"
- "\xe7\x1f\x6e\xe9\xef\xfe\x68\xff\xef\xda\xc1\xd1\x7e\x5e\x8d\xf7"
- "\xfa\x7b\x61\xb4\x43\x7f\x2f\x8c\x76\xaf\xbf\x17\x9c\xb8\xa5\xbf"
- "\x07\xa2\xbf\x9f\x2f\x1a\x9c\xfe\x5e\xb0\xcb\x55\x7f\x47\x8e\xf2"
- "\x4c\x7f\x2f\xbc\x67\xe8\xf5\xf7\xc2\x10\x57\xfd\xbd\xd0\xc6\xeb"
- "\x34\x7f\xf6\xc0\xf5\xf7\xc2\x53\xee\xf5\xf7\xc2\x73\xae\xfa\x7b"
- "\x61\x39\xd7\xd3\x91\x81\x5c\x7f\x2f\xac\xe4\xe9\xf3\x9f\x76\x4e"
- "\x77\xe8\x6f\x9e\xce\xf5\x77\x64\xf0\xc0\xf4\xb7\xfa\x7b\xd6\xdf"
- "\x81\x7d\xe8\xef\xc0\x7f\x11\xfd\xbd\xc8\x6d\xfc\xf3\x5b\x3a\xa4"
- "\x3f\x1d\x12\x19\x32\x38\x1d\xb2\xd8\xad\xff\xc7\xfe\x75\x48\x4c"
- "\x99\x43\x87\xc4\x94\xb9\xd7\x21\x31\x63\x6f\xe9\x90\x81\xe8\x90"
- "\x45\xe6\xc1\xe9\x90\xe8\x26\x57\x1d\xb2\xe4\x39\xcf\x74\x48\x4c"
- "\xcc\xd0\xeb\x90\x98\x04\x57\x1d\xb2\x24\x94\xd7\x69\xf1\x5f\x07"
- "\xae\x43\x96\xdc\xe3\x5e\x87\x2c\x99\xe4\xaa\x43\x62\x78\x5c\x20"
- "\xd9\x92\xb9\x5c\x87\x2c\x09\xe4\xe9\x8b\xf3\x9c\xd3\x1d\x3a\x84"
- "\xa7\x73\x1d\xb2\x24\x72\x60\x3a\x64\xf8\xf7\xac\x43\x94\x7d\xe8"
- "\x10\xe5\xbf\x88\x0e\xf9\x73\xbd\xf7\x72\xec\x05\xbd\x43\x8e\xbd"
- "\xa0\x77\x2f\xc7\x96\x9e\xbb\x25\xc7\x06\x22\xc7\x96\x24\x0c\x4e"
- "\x8e\x2d\xdd\xe3\x2a\xc7\x5e\x1c\xeb\x99\x1c\x7b\x61\xca\xd0\xcb"
- "\xb1\x17\x66\xb8\xca\xb1\x17\x45\xbf\x51\xb1\x7f\x1a\xb8\x1c\x7b"
- "\xe1\x1b\xf7\x72\xec\x85\xcb\xae\x72\xec\x85\x03\x5c\x5e\xbd\x18"
- "\xcc\xe5\xd8\x0b\x75\x3c\x3d\x36\xc2\x39\xdd\x21\xc7\x78\x3a\x97"
- "\x63\x2f\xea\xfa\x93\x63\xd8\x2f\xaa\x34\xdd\xfa\xc5\x8b\x52\xbf"
- "\x58\xbe\xfd\x68\x91\xd4\x2f\x96\xb3\x76\x09\x45\x0b\xa6\xff\x25"
- "\x91\x28\x0c\x18\x3b\x06\x64\x84\xfe\xdf\xb1\x5f\x2c\xf7\xc7\x7d"
- "\x22\xaa\x7a\x90\x7b\x8d\xa2\x1c\x4c\x02\x39\xd8\x08\xcf\xe8\x57"
- "\x6d\xec\x82\xe9\x28\xbf\x30\xa6\x06\x3e\x73\x79\x68\xf1\xc5\xd8"
- "\x35\x6c\x6d\xde\xa9\xdf\xb0\xbe\xd2\x2a\xf6\x95\x56\xde\x57\xa4"
- "\xb3\x7b\xc9\x8d\x54\xb0\xaf\xd4\x8d\x0e\x8b\xf6\xa1\xd8\x7f\xd8"
- "\x99\x30\xe8\x3f\x74\xa5\x2e\xa0\x28\x1e\xfa\x8c\xa5\x89\xa0\xef"
- "\x7c\xec\x33\xfe\xeb\x65\x01\xb4\x35\xd6\x0f\x64\x22\x97\x7d\x42"
- "\x85\xaf\x0d\xfd\x60\xad\x04\xd9\xd7\x02\xb2\xaf\xc5\xd1\x57\x70"
- "\xbd\xbd\x75\xa5\x4e\xdb\xb6\x52\x37\xae\xb3\x15\x64\x9f\xa5\x7b"
- "\x3f\xb9\x27\x78\x67\x0b\xca\xbe\x26\xd6\x4f\x98\xec\x83\xbe\x21"
- "\xb4\x82\xec\xfb\xb3\x28\xfb\x5a\x75\x28\xeb\x03\x77\x2e\x01\xd9"
- "\x17\x79\x81\xcb\x3e\xd1\x86\xbb\x0f\x65\xdf\x4a\x9d\x7c\x4b\x8b"
- "\x28\xfb\x16\xa1\xec\x3b\x08\x7d\xe4\x3d\x57\xd9\xe7\xef\xad\xec"
- "\x5b\x56\xe7\xda\x4f\xe2\x9e\xf4\xac\x9f\x2c\x7f\xce\x5d\x3f\xe9"
- "\xcc\xf1\xb6\x9f\x2c\x8f\x76\xed\x27\x71\x21\x62\xdf\x7d\x69\xe0"
- "\xfd\x24\x6e\x54\x57\x3f\x79\xb1\x7b\x3f\x89\xbb\xcb\xb5\x9f\x2c"
- "\x6f\xe6\xfd\x21\x6e\x26\xef\x27\x71\x3c\x96\xaa\xec\x45\xbd\x73"
- "\xba\xa3\x9f\xf0\x74\xde\x4f\xe2\xc2\x6f\xad\x97\xff\xd0\xf4\xfd"
- "\x0a\xb7\xfe\x9f\x6e\xad\x97\xf7\x37\x66\x8c\x8b\x1e\xdc\x98\xf1"
- "\x25\xb7\xfe\xef\x6e\xcd\xb7\xf7\x47\x7b\x7d\xd0\xe0\x68\x1f\xef"
- "\x36\xfe\xcf\xad\xb9\x92\xfe\x68\xff\x52\xde\xe0\x68\x9f\x10\xda"
- "\xdf\x18\xc3\xbd\x2d\x95\xd8\x5c\xd9\x35\xc6\x48\x6c\x96\xf6\xf9"
- "\xf6\x1c\x63\x24\x2e\x72\x3d\xc7\x97\x70\xb9\xfb\x39\xbe\xfe\xc6"
- "\x1e\xb6\x5b\x63\x0f\xe0\xf5\x4a\xd5\xe0\xc6\x1e\x89\x93\x5d\x6d"
- "\xaa\xd5\x3b\x3c\xb3\xa9\x12\x5f\x77\x67\x53\xd9\xbc\x1e\x7b\x24"
- "\x96\xbb\xda\x54\xab\x37\x8a\xd8\x78\x7f\xe0\x36\xd5\xea\x18\xf7"
- "\x36\xd5\xea\xe5\xae\x36\xd5\xea\x50\x6e\x3b\xad\xde\xce\x6d\xaa"
- "\xd5\x73\x79\x7a\xc2\x3e\xe7\x74\x87\x4d\xc5\xd3\xb9\x4d\xb5\x7a"
- "\xd7\xad\x75\xf4\x1f\x9a\x4d\xb5\x46\x7b\x4b\xaf\x7b\xab\x5b\x56"
- "\x97\x0f\x4e\xb7\xac\xfd\x1e\xf7\x7f\xfe\xd0\xf5\xfa\x9a\xd8\xc1"
- "\xd1\x3e\xb9\xcf\xfd\x9f\x7d\xeb\xf5\x94\x03\x0e\xbd\x9e\x72\xc0"
- "\xbd\x5e\x4f\xf9\xb9\xab\x5e\x4f\x3e\x72\x4b\xaf\x7b\xa3\xd7\xd7"
- "\x36\x0e\x4e\xaf\xa7\x28\x5c\xf5\x7a\xea\x4b\x9e\xe9\xf5\x94\xf5"
- "\x43\xaf\xd7\x53\xf2\x5c\xf5\x7a\xea\x3c\x11\x1b\x05\x03\xd7\xeb"
- "\xa9\x8f\xba\xd7\xeb\xa9\x4f\xba\xea\xf5\x54\x0d\xd7\xdf\xa9\x7a"
- "\xae\xd7\x53\x27\xf3\xf4\xe4\x7c\xe7\x74\x87\x5e\xe7\xe9\x5c\xaf"
- "\xa7\x26\xdf\x5a\x5f\xff\xa1\xe9\xf5\x34\xb7\xfe\x8f\x6f\xe9\x96"
- "\xfe\x74\x4b\xea\x20\xc7\x8c\xe9\x6e\xe3\xff\xf6\xaf\x5b\x5e\xd1"
- "\x3a\x74\xcb\x2b\x5a\xf7\xba\x65\x63\x81\xab\x6e\xd9\x30\xf1\x96"
- "\x6e\xf1\x46\xb7\xac\x0f\x1d\x9c\x6e\xd9\x18\xe9\xaa\x5b\x5e\xa9"
- "\xf2\x4c\xb7\x6c\x3c\x35\xf4\xba\x65\x63\xb3\xab\x6e\x79\xa5\x9c"
- "\xd7\x29\xfd\xf2\xc0\x75\xcb\x2b\x3b\xdc\xeb\x96\x57\xfe\xe6\xaa"
- "\x5b\x5e\x49\xe0\x3a\xe4\x95\x4a\xae\x5b\x5e\xc9\xe4\xe9\xe9\x16"
- "\xe7\x74\x87\x6e\xe1\xe9\x5c\xb7\xbc\x52\x77\x6b\xdd\xfd\x87\xa6"
- "\x5b\xfe\xa3\xcf\xfd\xbf\x7d\xcb\xb7\x6c\xe2\x90\x6f\xd9\xc4\xbd"
- "\x7c\xcb\x5a\xe5\x2a\xdf\x32\x7d\x6f\xc9\x37\x6f\xe4\xdb\x2b\xcd"
- "\x83\x93\x6f\x59\xa1\xae\xf2\x2d\xfb\x0d\xcf\xe4\x5b\xd6\xfb\x43"
- "\x2f\xdf\xb2\x2a\x5d\xe5\x5b\xf6\x76\x5e\xa7\xff\x38\x36\x70\xf9"
- "\x96\xbd\xc6\xbd\x7c\xcb\x5e\xef\x2a\xdf\xb2\xe7\x72\x39\x96\xbd"
- "\x9b\xcb\xb7\xec\x58\x9e\xfe\x1f\x35\xce\xe9\x0e\xf9\xc6\xd3\xb9"
- "\x7c\xcb\x2e\x1f\xdc\x7a\x7c\x4e\xa8\x63\x3d\x3e\x87\xf1\x42\xd8"
- "\x5e\x1c\xdb\x73\x3d\xde\xf0\x8e\xab\xbf\xa0\xbf\xfc\x9c\xad\xcd"
- "\x63\x9f\x69\xe3\x3e\x1d\x7a\x5d\xa7\xbf\xab\x38\xf6\xd6\x3a\xfd"
- "\xf5\x5c\xa7\x37\xa4\xb9\xf6\x9f\x9c\x8b\x9e\xf5\x1f\x83\x7d\xe8"
- "\xd7\xe9\x73\xba\xf9\x61\xc9\xa9\x13\xb1\x22\x1b\x78\xff\xc9\x79"
- "\xd7\x7d\xff\xc9\xf9\xc8\xb5\xff\xe4\x88\x63\xcc\x9c\x66\xde\x7f"
- "\x72\xca\x78\xfa\x5f\x88\x73\xba\xa3\xff\xf0\x74\xde\x7f\x72\xac"
- "\x9e\xd8\x07\x36\x55\xd1\x2e\xd4\xf7\x93\xeb\xc7\xdb\xbb\x70\x9e"
- "\x20\xe2\xbc\x37\xfb\x20\x8a\xeb\x0b\x66\x1b\xec\x8a\x9b\xdb\xaf"
- "\x7d\xd0\x28\xda\x07\xd1\x3d\xed\x03\xc9\x36\x28\x02\x7c\xbf\xea"
- "\xd1\x1a\xbd\x88\x77\xb4\x0d\xae\x0e\xd4\x36\x98\xe0\xb0\x0d\xb2"
- "\xba\xd9\x06\x7f\xee\x66\x1b\x30\xbc\x37\xb8\xe0\xbd\x87\x6d\xd0"
- "\x85\xf7\xa1\xb2\x0d\x36\xe9\x6f\xad\xd1\x7b\x3b\xee\xcc\x55\x0d"
- "\x6e\xdc\x99\xd7\x7c\x6b\x2e\xdf\x5b\xda\x6f\x1a\xe4\x5c\xfe\xe6"
- "\xd8\x5b\xf3\x2d\xde\xd2\xfe\xaf\x83\xf4\xe5\xb0\xa5\xd1\xfb\xf1"
- "\xc8\xd6\x3d\x8e\xf1\xc8\xd6\x3d\x92\x7d\x85\x72\x97\xf9\xcc\x02"
- "\x59\x9b\x13\x0f\xd7\x55\x42\xfe\x12\xcf\x62\x1e\x28\x4d\x8d\xc7"
- "\x89\x3e\x05\x6d\xae\xad\x13\xc3\x92\x9c\x6d\xae\xfc\xd7\x25\x7b"
- "\x2b\x0c\x6d\x31\xb0\xad\xd0\xae\x92\xc6\x20\x79\x2d\xfd\xec\x1f"
- "\x9e\x18\x37\x17\xc7\x2c\x9d\xfe\x45\xbb\xfe\x75\xc7\x2b\x9b\xf7"
- "\x0c\x6e\xbc\x52\x60\x71\xb5\xb7\xb6\xcd\xf7\xcc\xde\xda\xba\x7c"
- "\xe8\xc7\x2b\x5b\x93\x5d\xed\xad\x6d\xb3\x44\x9c\x2c\x1a\xb8\xbd"
- "\xb5\x6d\x92\x7b\x7b\x6b\xdb\x43\xae\xf6\xd6\x36\x05\xb7\xab\xb6"
- "\xcd\xe3\xf6\xd6\x36\x0d\x4f\xcf\x8f\x74\x4e\x77\xd8\x5b\x3c\x9d"
- "\xdb\x5b\xdb\x62\x3d\xb4\xb7\xca\x06\x61\x6f\x45\xfc\x70\xec\xad"
- "\x89\x37\xb9\xbd\xb5\xdd\xec\x81\xde\xd9\xd5\x4d\xef\xcc\xbd\xa5"
- "\x77\x50\xd6\x6c\x4b\x1e\x9c\xde\x79\x75\x5e\xbf\xb4\x37\x38\xd1"
- "\x1e\x65\xbe\x48\x77\xfb\x84\xb8\xb9\x5e\xd3\x1e\x64\x7d\x71\xca"
- "\x0f\x99\xee\x3b\x74\x83\xa3\x7b\x61\xed\x2d\x5b\xcb\x5b\xda\xbf"
- "\xba\x6b\x70\xb4\x2f\xee\x33\xfe\x63\xdf\xb6\x56\xe9\x8c\xa3\x5d"
- "\xb6\x56\xe9\x8c\xee\xb6\x16\xda\x56\xb3\xad\xdc\xe6\xfa\x0b\xd8"
- "\x4a\xd9\x71\x60\x77\x25\x12\x62\x6a\x7c\x9f\x18\xc0\xf6\xca\xbe"
- "\x04\xf6\xd7\x32\xb0\xbf\x6c\xaf\x89\xf6\xd7\xce\xb7\x5d\xed\xaf"
- "\x92\x49\xbd\xda\x5f\xfe\x0e\xfb\xcb\x06\xb6\x55\xe7\x6b\x71\x73"
- "\xf3\x2e\x39\xd9\x62\x2f\xf4\xb4\xc5\x3a\x72\x8a\xca\x3a\x26\xc6"
- "\x45\x74\x82\x3d\xd6\x97\x2d\xc6\x30\xd1\x8b\x3d\xf6\xff\x0f\x5b"
- "\xac\x28\x78\x70\xb6\xd8\xce\x64\x57\x5b\xac\xf4\x1b\xcf\x6c\xb1"
- "\x9d\xd7\xdc\xce\x7d\x79\x6d\x8b\x95\x2a\x5d\x6d\xb1\xd2\x5a\x5e"
- "\xa7\xe2\xaa\x81\xdb\x62\xa5\xef\xb8\xb7\xc5\x4a\xdf\x77\xb5\xc5"
- "\x4a\xc5\xb3\xa7\xa5\x4d\xdc\x16\x2b\xdd\xc5\xd3\x8b\x2b\x9d\xd3"
- "\x1d\xb6\x18\x4f\xe7\xb6\x58\x69\x9b\x87\x6b\x63\xbb\x6c\xa0\xd3"
- "\xbf\xff\xfd\x94\x7d\xad\x8d\x0d\xd5\x7e\xca\x09\x37\xf9\xda\xd8"
- "\x7f\xf6\x3f\xff\x75\xcb\x26\xe8\x45\xd6\xfc\x4d\x39\x38\xbd\xf4"
- "\x5f\x4d\xb7\x6c\x02\x6f\x69\xff\x9f\x83\x9c\xfb\x7a\x2d\xda\x7b"
- "\x9b\xa0\x2c\xc4\x31\xff\x52\x16\x32\xb0\xf9\x97\xff\x7e\xcd\x55"
- "\xff\xff\xbd\x77\xfd\x7f\x6b\xfe\x65\x00\x3a\x7f\x57\xc8\xe0\x74"
- "\xfe\x7f\xeb\x5d\x75\x7e\xd9\x29\xcf\x74\xfe\x7f\x5f\x1c\xfa\xf9"
- "\x97\xff\xb6\xb9\xea\xfc\xb2\x0a\x5e\xa7\xd7\xce\x0c\x5c\xe7\x97"
- "\xbd\xee\x5e\xe7\x97\xbd\xed\xaa\xf3\xcb\x36\x72\xdd\x5e\x56\xcf"
- "\x75\x7e\xd9\x76\x9e\xfe\x9a\xd9\x39\xdd\xa1\xf3\x79\x3a\xd7\xf9"
- "\x65\x4d\x03\x5b\xef\x52\xdf\xa4\xeb\x5d\x81\xff\x22\xeb\x5d\xff"
- "\x88\xbc\xa5\x77\xbc\xd5\x3b\x65\xb6\xc1\xe9\x9d\xff\xe9\xd7\xff"
- "\x87\x7b\xbd\xf3\x66\x99\x43\xef\xbc\x59\x36\x30\xbd\xf3\xe6\x58"
- "\x57\xbd\xb3\xfb\x6f\xb7\xf4\xce\x60\xf5\xce\x3f\xca\x06\xa7\x77"
- "\xde\xe8\xe6\xff\xe8\x2d\x0f\xfd\x1f\xbd\xe9\xd6\xff\x91\xf7\x7a"
- "\xe7\xcd\x6e\xfe\x8f\xde\x12\xfd\x1f\xed\xf6\xc2\x6f\xc8\x5b\xf7"
- "\xb8\xd7\x3b\x6f\x75\xf3\x7f\xf4\xa6\xe8\xff\xe8\x2d\xd1\xff\xd1"
- "\x5b\xa2\xff\xa3\xdd\x11\xce\xe9\x0e\xbd\xb3\xdb\xc9\x6f\xc8\x5b"
- "\xb7\xfc\x1f\xfd\xe0\xf6\x61\xee\x19\x84\xfc\xfb\x67\xa6\x43\xfe"
- "\xfd\x33\xd3\xfd\x3e\xcc\xff\xb5\xbb\xee\xc3\x7c\x3b\xe7\xd6\x3e"
- "\x4c\x6f\xe4\xdb\x5b\x83\xf4\x8b\xf4\xbf\x15\xae\xf2\x6d\xef\x23"
- "\x9e\xc9\xb7\x7f\x3e\x39\xf4\xf2\xed\x9f\x73\x5d\xe5\xdb\x5e\xad"
- "\x88\x0d\x2f\xe4\xdb\x5e\x99\x7b\xf9\xb6\xd7\xcf\x55\xbe\xfd\xb3"
- "\x9e\xcb\xb1\xbd\xd3\xb8\x7c\xfb\xa7\x85\xa7\xbf\x1d\xe1\x9c\xee"
- "\x90\x6f\x6f\x3b\xc9\xb7\xbd\xa1\x03\x5b\xd7\xf4\xca\xae\xbe\x01"
- "\xeb\x9a\x43\x65\x57\xdf\xec\xeb\x9a\xef\x94\xdf\x9a\x47\xf3\xc6"
- "\xa6\xde\x3b\x77\x70\x36\xf5\xff\x0b\xf1\x5e\xa7\xbc\x17\xe4\xd0"
- "\x29\xef\x05\xb9\x5b\xdf\xc9\x06\xdc\x19\xc0\x26\xce\xba\x44\x14"
- "\x7f\xc1\xf5\x9d\xda\x2a\x92\x83\xeb\x3b\x71\xd2\xfa\x4e\xb1\x68"
- "\x67\xbf\x9b\xe5\x6a\x67\x97\xfb\xf5\x66\x67\xa3\x7d\x6d\x07\xdb"
- "\xd9\xd6\x7d\x5d\xe7\xdf\x7b\xd7\x45\x1d\xfe\x45\x65\xd7\x5e\x8b"
- "\x8b\x18\xa8\x2e\x2a\x5c\xcb\x75\xd1\xab\x3f\x78\x5d\xf4\x7f\x64"
- "\x70\xba\xe8\xdd\xb9\xae\xba\xe8\xbd\x8f\x3c\xd3\x45\xef\x1e\x1b"
- "\x7a\x5d\xf4\xae\xd9\x55\x17\xbd\xb7\x9b\xd7\xe9\xff\x79\x11\x5b"
- "\xf2\xbd\x1c\xf7\xba\xe8\xbd\x02\x57\x5d\xf4\x5e\x2c\xd7\x39\xef"
- "\x19\xb9\x2e\x7a\x2f\x99\xa7\xff\xbf\xdd\xce\xe9\x0e\x5d\xc4\xd3"
- "\xb9\x2e\x7a\xaf\x72\x60\x73\x3c\xc3\x6f\xd2\x39\x1e\xe5\xbf\xc8"
- "\x1c\xcf\xbe\x99\xde\xcb\xc4\x0f\x95\x95\x5d\xe7\x37\x3e\x54\xf6"
- "\x98\x67\x48\x04\x7b\xbb\x85\xaf\x73\x77\xcd\x33\x98\x4f\x89\xf2"
- "\xef\x83\x75\xae\xf2\xef\x7d\xb7\xf2\xaf\xaf\xb5\x6c\x9c\x57\xb0"
- "\x83\x6c\xc4\x18\x99\x5e\xaf\x65\x27\xfe\xd0\x65\xde\x7b\x83\xf4"
- "\xaf\xfc\xc1\x2c\x57\x99\xf7\xe1\x3b\x9e\xc9\xbc\x0f\x0e\xba\x95"
- "\x79\x5e\x9f\xe3\xf8\xa0\xd6\x55\xe6\x7d\x58\xca\xeb\xb4\xef\xa3"
- "\x81\xcb\xbc\x0f\xd7\xbb\x97\x79\x1f\x66\xb9\xca\xbc\x0f\xe7\x71"
- "\xd9\xf6\xe1\x5e\x2e\xf3\x3e\xd4\xf3\xf4\x7d\x46\xe7\x74\x87\xcc"
- "\xe3\xe9\x5c\xe6\x7d\x68\xec\x4b\xe6\x51\x43\x54\x59\x9e\x5c\xd8"
- "\x03\x17\x62\xf4\x2e\xc0\x86\x11\xfe\xaf\x00\x1e\x8f\x82\xff\xdd"
- "\xc6\xbc\xb0\xf8\x47\x95\x09\xe9\x50\x67\x39\x91\x99\x2c\xdf\x19"
- "\x8d\x63\x6c\xf0\x5d\xa3\x78\x66\x2d\xaa\x4c\x6d\x1b\x3e\x4b\xa0"
- "\xb1\x04\xf8\x52\xc6\xe2\x67\x42\x7e\x3c\x1f\xa4\x4d\x24\x01\x97"
- "\x64\xc6\x48\x29\x1f\xd4\x37\xa0\x41\x66\x1c\x8b\x65\xb4\x67\x18"
- "\x97\x41\x5b\x2a\xdd\xd6\x15\xca\x0a\x7b\x7d\x1c\x59\x67\xa3\x5f"
- "\x1b\xe3\x5a\x48\xa3\xcc\xf8\x8e\xba\x79\xf8\x2c\x9a\x1a\x41\xd0"
- "\x96\xdb\x33\xc6\xa2\xc0\x32\x8d\x71\x1d\xf8\x6e\x3b\xbe\xb3\x43"
- "\x1d\x53\x96\x13\x79\x6e\xcb\x70\x25\xc8\x09\xdf\xd4\x36\xda\xb4"
- "\xc2\x06\x75\x06\x6c\x7e\x38\xae\x4e\xf1\xd6\xab\x75\x78\xbe\x51"
- "\x83\xf1\x4c\xb1\x0c\xb0\x67\xb1\x3e\xef\x96\x40\xfe\xde\xea\xf0"
- "\xca\x9b\x64\xb2\xef\x24\x6a\x1e\x18\x6e\x3e\x52\xb9\xa3\xa3\x7a"
- "\xfd\x38\x62\x7c\x00\x68\xa7\x25\xf2\xde\xde\x0f\xf0\x3b\x7d\x9d"
- "\x7f\x57\x62\x8c\xe4\xd4\x1d\x44\xbe\x49\x18\xae\xdc\x9f\xcc\x62"
- "\x14\x5b\xda\x33\x3e\x32\x9b\x65\xf7\xab\x90\xe6\x18\xd7\x12\xe3"
- "\x6b\x03\x6e\x08\xa4\x5b\x3f\x4a\x22\xa4\x3b\x2f\xe2\xa3\x97\x2f"
- "\xd2\x26\x2c\x5d\x1e\xb3\x62\x55\x82\x76\x62\xf4\x08\x32\x77\xc5"
- "\x0a\xed\xf2\x45\x71\x6b\xb4\xce\x6f\x7e\xa1\x8d\x5e\xba\x72\x51"
- "\xd4\xb2\x98\x29\xcb\x17\xeb\x47\xe0\xa1\x22\xa7\x7a\x04\x61\x5d"
- "\x84\x8c\x8f\x15\x25\x9b\x09\xd9\x32\x9a\x28\xb0\x5e\xed\x19\x1f"
- "\xc7\x4a\x71\x4f\x73\xb7\xd2\x36\x39\xe4\x49\x05\xf9\xb8\x29\x65"
- "\x38\xe4\xfd\x28\x61\x27\xd4\xab\x04\xea\x0d\x75\x84\x3a\x7f\x9c"
- "\x2f\xd5\x59\xc2\x44\x2a\x62\x22\xa5\x05\x30\xf8\xf1\x3b\x6a\xeb"
- "\xf0\xdf\x52\x1a\x81\xed\x6b\x83\x7e\x22\x3b\x2f\xdb\xef\xcb\x74"
- "\x59\x4e\x54\x19\xfc\xb6\x46\xc2\x18\xfe\x96\xe6\x46\xe9\xdb\xb1"
- "\x9f\xd0\xd8\x5f\xf1\x3e\xb5\xbf\xec\x39\x9d\x8c\xf0\xb8\xab\x1f"
- "\xdb\x1c\x71\x57\xf7\xb3\xb9\x6a\xa8\x47\x73\x7b\xc6\xfe\x20\x33"
- "\x69\xaf\xc5\x74\x8c\x17\x8c\xf1\xbb\xb1\xce\xd0\x2e\xd0\xa5\xd4"
- "\x48\xd3\x45\xec\x67\xbe\x53\x27\x64\x7e\x16\x62\x52\x5c\x25\x61"
- "\x36\xda\x49\xb3\xde\xa9\xab\x6e\x6b\x23\xea\xf5\xfa\xc5\x74\xd8"
- "\xc7\xb7\xab\x6d\x4b\x63\x76\x8e\x86\x3e\x94\xf5\x59\x08\xcd\xaa"
- "\x0a\x7a\x6e\x12\x09\x84\xb2\x9d\xe3\xbf\x2a\x06\xc6\xff\xfd\x8c"
- "\xff\xc8\x47\xa8\x8f\xc8\xc7\xfd\x46\x44\x85\xbb\x3e\xa5\x7e\x5d"
- "\x20\x07\x01\x0b\x54\xb5\xd9\x12\x66\xe7\x74\xc4\xbe\xdb\x9a\x1a"
- "\x4b\x1e\x64\xb4\x3b\x90\x24\xe4\x6e\xae\x11\x0c\x5b\x40\x56\x6c"
- "\x6e\x03\x9a\x65\xe6\x26\x12\xed\x42\x7b\x20\xc9\xb9\x4a\x42\x2c"
- "\x39\x9b\x2d\xfe\xb2\x34\x19\xd8\x23\x72\xd0\x27\x21\x20\x33\x42"
- "\xc4\xfe\x9e\x89\x74\x3c\xdc\x4c\xc8\x9c\x95\x84\x7c\x3d\x83\xf8"
- "\x94\xc0\xef\x06\xd6\x9e\x03\x4c\xff\xd3\x8c\xfd\xb6\x9d\xf0\x5b"
- "\x8c\xeb\x3b\xc0\xdf\x6f\x74\xdb\xef\xba\xda\xbd\x45\xdf\x7b\xbb"
- "\x0f\xea\x85\xdc\x2d\xe1\xd0\xee\x4c\x6a\xd8\x92\xd0\xb3\xdd\x5b"
- "\xf4\xbc\xdd\xbe\x2d\x43\xdf\xee\x83\xdc\xff\x75\xc6\x81\x36\xef"
- "\xda\x7d\x30\xd9\x83\x76\xbb\xe1\xf7\xa1\x58\x68\x37\xf0\x3b\x1f"
- "\xf8\xbd\xa5\x17\x7e\x6f\x11\xf9\x3d\xb2\x61\xe8\xdb\x7d\x68\x1a"
- "\x6f\xf7\xc1\x66\xef\xda\x7d\xc8\xad\xfc\x73\xb4\x3b\xdf\x0d\xbf"
- "\x0f\x47\x0a\xb9\xf9\xc0\xef\x7c\xe0\x77\x7e\x2f\xfc\xce\x17\xf9"
- "\x3d\xea\xd3\xa1\x6f\xf7\x61\xee\xff\x30\xe3\x50\xa3\x77\xed\x3e"
- "\xbc\xcc\x83\x76\xbb\xe1\x77\x45\x04\xb4\x1b\xf8\x5d\x00\xfc\xce"
- "\xef\x85\xdf\xf9\x22\xbf\x7f\x9a\x3d\xf4\xed\xae\x98\xc0\xdb\x7d"
- "\xb8\xde\xbb\x76\x57\xb8\xdd\xff\xe2\x68\x77\x81\x1b\x7e\x1f\x09"
- "\x17\x72\x0b\x80\xdf\x05\xc0\xef\x82\x5e\xf8\x5d\x20\xf2\xfb\xf9"
- "\xc7\x87\xbe\xdd\x47\x82\x79\xbb\x2b\x6a\xbd\x6b\xf7\x11\xb7\xfb"
- "\xdf\x9d\xe4\xb9\x55\x30\xf4\x94\xe9\xa6\xa4\xe9\x64\xea\x55\x6c"
- "\xff\x27\x46\xea\xbf\xd9\x3a\x72\x7d\x9a\xcc\xa6\xda\x6c\x1b\x09"
- "\x63\xb9\xc2\x74\x21\x56\x6d\x26\x7e\xd0\xd6\x58\x9a\xbb\x2d\x0f"
- "\xef\x02\x94\x63\x03\xd9\x6f\x57\x6d\x6e\xeb\x30\x44\x65\xfe\x65"
- "\x09\xd1\xa6\x5a\x48\x60\x75\x8a\x99\xa4\xe8\xa9\xa5\x9a\x9c\x21"
- "\xfe\x66\x22\xc7\xf9\xb2\xa3\xcd\xe5\x24\x2e\x9e\x52\x28\xfb\x75"
- "\x1c\x63\xe6\x9e\x27\x21\x60\x13\xa7\x51\xd0\x1f\x79\x02\xd1\x42"
- "\xf9\x21\x48\x4b\x28\x7b\xb3\x7a\x2e\x91\x7d\x10\x65\x25\x48\x4f"
- "\xa4\x2d\x8c\x47\x43\x18\x5d\xdb\x08\xf9\xfd\xf3\x9c\xae\x85\x4b"
- "\x06\x4a\xd7\x4f\xf8\xfa\x9f\x61\x4b\xa0\xc9\xdc\x41\xc0\xb6\x0c"
- "\xc4\x33\xf7\x90\x1e\x52\xad\x6f\x81\xb1\xc8\x91\x5a\x9a\xb3\x05"
- "\xc6\xa3\x9b\x2d\x03\x2c\xd7\xad\xff\x6b\x27\x79\x9a\x04\xba\xa2"
- "\x07\xd6\x1c\xf4\xae\x0c\xa1\xfe\x5b\x92\x38\xbd\xb7\x24\x8f\xac"
- "\xf7\x6d\xe9\x9d\xde\x5b\x92\x80\xde\x99\x76\xd5\x96\x04\xcf\xe9"
- "\x5d\x79\x97\x2b\xbd\xb7\x84\xdf\x18\x7a\x1f\x15\xe3\x9f\x6e\xc9"
- "\x73\xa5\xf7\xd1\x52\x4e\xef\xa3\x33\x81\xde\x69\x02\xe8\xca\x81"
- "\x95\x5b\x39\xc3\x03\x7a\x03\xbe\x7b\xea\x30\x07\xbd\xab\x4a\x81"
- "\xde\x22\xbe\xb7\x00\xbe\x47\x36\xb8\xa1\x37\xe0\x3b\x1f\xf0\xbd"
- "\x65\x00\xf8\xae\xca\xea\x46\xef\x1b\x84\xef\x2a\x71\xfe\x2f\xbf"
- "\x1b\xbe\xab\x02\x39\xbd\x2b\xf7\xd2\x9c\x7c\xc0\xf7\x96\x01\xe2"
- "\xbb\x6a\xb7\x07\xfa\x03\xf0\xdd\x53\x77\x3a\xe8\x6d\x0a\xa4\xfe"
- "\xf9\x22\xbe\xf3\x01\xdf\xa3\x3e\xed\x9d\xde\xf9\x80\xef\x7c\xc0"
- "\x77\xfe\x00\xf0\x5d\x7d\xcd\x95\xde\xf9\x37\x08\xdf\xd5\x07\x44"
- "\x7a\x77\xc3\x77\x75\x1a\xa7\x77\xf5\x04\xa0\x37\xe0\x3b\x7f\x80"
- "\xf8\x36\x05\x7b\x40\x6f\xc0\x77\x4f\x9d\xed\xa0\x77\x4d\x1a\xd0"
- "\x5b\xc4\x77\x3e\xe0\xfb\xa7\xd9\x6e\xe8\x0d\xf8\x2e\x00\x7c\xe7"
- "\x0f\x00\xdf\x35\x4b\xbb\xd1\xfb\x06\xe1\xbb\x86\xdb\x7f\x86\x82"
- "\x6e\xf8\x36\x59\x38\xbd\x4d\xf9\x34\xa7\x00\xf0\x9d\x3f\x40\x7c"
- "\xd7\x18\x3c\xb0\x13\x00\xdf\x3d\x6d\x05\x07\xbd\x8f\x59\xa8\x7f"
- "\x81\x88\xef\x02\xc0\xf7\xf3\x8f\xf7\x4e\xef\x02\xc0\x77\x01\xe0"
- "\xbb\x60\x00\xf8\x3e\x76\xc2\x95\xde\x05\x37\x08\xdf\xc7\xc4\xf8"
- "\x97\x05\xdd\xf0\x7d\x2c\x92\xd3\xfb\x98\x02\xe8\x0d\xf8\x2e\x18"
- "\x20\xbe\x8f\xd9\xbc\xb1\x4f\x56\x16\x13\xa5\x2b\xcd\x3f\x8b\xbe"
- "\x7e\x36\xca\x67\xb3\xbf\x1f\x1b\xe5\x33\x4d\xef\x36\xca\xa7\xb5"
- "\x9c\xe6\x9f\x26\x79\x67\xa3\x7c\xe6\xf6\xfc\x43\x5f\x36\x4a\x4f"
- "\x9a\xd7\xd6\x5d\x3f\x3b\xa5\xf6\xa3\xef\xc7\x4e\xa9\x35\xf4\x6e"
- "\xa7\xd4\xce\xe2\x34\xff\xac\xd9\x3b\x3b\xa5\xd6\xad\xff\x83\xbe"
- "\xec\x94\x9e\x34\xff\xfc\xe9\xeb\x67\xab\x7c\xfe\xc8\xf7\x63\xab"
- "\x7c\x4e\x7a\xb7\x55\x8e\xef\xe3\x34\x3f\x1e\xe9\x9d\xad\xf2\x79"
- "\x84\x37\xb6\x4a\x4f\x9a\x7f\x61\xbc\x7e\xf6\xca\x17\xaf\x7f\x3f"
- "\xf6\xca\x17\x09\xbd\xdb\x2b\x5f\x88\xe3\x9f\xcf\x6b\xbd\xb3\x57"
- "\xbe\xf0\x60\xfc\xd3\xd3\x5e\xe9\x49\xf3\x13\xd3\xae\x9f\xcd\x72"
- "\x62\xec\xf7\x63\xb3\xd4\x35\xf5\x6e\xb3\xd4\xed\xe2\x34\xaf\x9b"
- "\xe5\x9d\xcd\x72\x22\xd4\x1b\x9b\xa5\x27\xcd\x4f\x96\x5d\x3f\xbb"
- "\xe5\xe4\x5f\xbf\x1f\xbb\xe5\xe4\xbc\xde\xed\x96\x93\x1a\x4e\xf3"
- "\x13\xfb\xbc\xb3\x5b\x4e\xee\xf5\xc6\x6e\x41\x5a\x23\xcd\xd1\x56"
- "\xe1\x34\x3f\x95\x44\x03\x36\xd7\x74\x82\x3d\xe2\x0f\x74\xf7\x6f"
- "\x26\xf2\x62\xa4\x79\x1d\xa7\xb9\x3d\x60\x5b\x1e\xd0\x27\x16\x69"
- "\xc6\xda\xf1\xad\x26\xc0\x6e\xd8\x6c\xa3\x72\x02\x6d\x51\x92\xf3"
- "\xb2\x2f\x5f\xb1\xa5\x93\x00\x6d\xca\x7a\xf8\xff\xd4\x52\xcc\xa3"
- "\x4d\xc9\x38\x05\x6d\xf4\xc1\x35\x0a\x5b\x4e\x54\x88\xdd\x7f\xeb"
- "\x9e\xf3\xb2\xfa\x83\x74\xec\x82\x90\x4e\xb0\x25\xe8\x8b\x9a\x20"
- "\x53\xf3\x1e\x62\xb2\x7d\x42\xaa\xeb\xde\x23\x42\xc0\xb6\xcd\x0f"
- "\xda\x88\x8e\x7e\xab\x0b\xaa\x4c\x30\x13\xfb\x62\x8d\xca\x94\x54"
- "\x01\xb8\xf8\x5f\x12\xd6\x44\xaf\xd2\xb3\x3a\x55\xa7\x7f\xa1\xc5"
- "\xee\xbf\x4d\x6f\xcf\x29\x2a\xb7\xf9\x17\x9a\xdf\x48\x34\xcb\x55"
- "\x56\xa2\x5b\xd6\x48\x69\x6e\x14\x51\xe4\x36\x10\xe5\xa6\x28\xa2"
- "\xda\xd4\x40\x02\x2b\x1b\xeb\x48\xd5\x85\x0a\x52\xd5\x72\x82\x54"
- "\x5d\x85\xab\x03\x2e\x01\xae\xb4\x13\xa4\xb2\x99\x90\xd9\x17\x09"
- "\x49\x6d\xa4\x96\x1f\xd7\x93\xa0\x4a\x5b\x1d\xd1\x2e\x20\xe4\x92"
- "\xac\xfe\x4f\xaa\x48\x12\x44\xcf\x6a\x08\x5d\xac\x91\xc3\x3b\x05"
- "\xa6\x9b\x6c\x16\x52\xd9\x68\xc5\xf7\xd3\xe1\xbd\x22\xb5\x11\xca"
- "\x17\x2a\xd0\x97\xa1\xa5\x32\xed\x08\xb4\x6f\xb4\x16\xf4\xa6\x52"
- "\xb2\xc9\x72\x3b\x48\xc8\x26\x60\x33\x62\x26\x8c\x72\xcc\xec\xec"
- "\x18\x28\x66\xea\xb9\xff\xf7\x17\x35\xa3\x81\xde\x63\x84\x17\x23"
- "\x02\xe7\x9c\x38\x4d\x71\x3f\x18\xae\xcf\x54\xb7\x7d\x42\x70\xcd"
- "\x3a\x6c\x0d\x21\x4f\xdb\x09\x41\x9a\xe0\x5a\xf2\x1c\x3d\x51\xe3"
- "\x3e\x35\xe1\x5b\xdd\x68\x53\xa3\x85\xac\xb3\x41\x5d\x2f\x59\xbb"
- "\xea\x5a\xbd\xb1\x9a\xc0\xbb\x31\xd5\xb1\x66\xa2\xd2\x93\x40\xa4"
- "\xb3\xcd\xb0\xd9\x3a\xa7\x89\xf8\xc5\xb5\x51\x8a\x34\x46\xda\x22"
- "\x9d\xb1\x3c\x89\xf6\xa6\x68\x0b\x49\xb5\x92\x40\x53\x0a\xdc\x93"
- "\xa8\xc5\x44\x2e\x13\xa8\xe3\x32\xea\x3f\x5a\x0b\xf8\xc8\x47\x4c"
- "\x98\x65\x5f\x26\x03\x0e\x46\xd3\x8c\x2f\x43\x4a\xa0\xbd\xb8\xb6"
- "\x3f\xb0\x36\x9f\xf2\x64\xfd\xa3\x87\x4d\xe8\xc0\xf3\x96\x24\x8e"
- "\x67\xf3\x2c\x1a\xb0\x25\xbc\x13\x6c\x3d\x8e\x67\xdf\x96\xfe\xf1"
- "\xbc\x25\xd9\x81\xe7\xaf\x9e\x73\xe0\xd9\xfc\x73\xf7\x78\x3e\x5d"
- "\x20\xe2\x39\xef\xe6\xc4\xf3\xe9\x49\x7d\xe3\xf9\xb4\xb2\x0f\x3c"
- "\x67\x4a\xf6\xee\xd0\xe0\xf9\x74\xe4\x8d\xc3\xf3\x96\x24\xef\xf0"
- "\x7c\x7a\x86\x2b\x9e\xbf\x7a\x9a\xe3\xf9\x2b\xe2\x1d\x9e\xcd\x6e"
- "\xfd\x1f\xf7\x65\x6f\x3b\xe1\x59\x94\xcf\x67\x35\x80\x67\x90\xcf"
- "\x5b\x44\xf9\x3c\xb2\xc1\x03\x3c\x3b\xc9\xe7\x33\x13\x1d\x78\x3e"
- "\xeb\xe7\x1e\xcf\x0d\x31\x1c\xcf\xf9\x37\xa9\x7c\x3e\x73\xad\x6f"
- "\x3c\x9f\xa9\x73\x8f\xe7\x7c\xa5\x34\x96\x18\x1a\x3c\x37\x84\xdc"
- "\x40\x3c\x7b\x29\x9f\x1b\x54\xae\x78\x3e\x13\xcc\xf1\x6c\xae\xf1"
- "\x0e\xcf\x67\x27\x78\x33\x96\x71\xe0\x39\x5f\x94\xcf\xe7\x9a\x68"
- "\x40\x3e\xc8\xe7\x7c\x51\x3e\x8f\xfa\xb4\x7f\x3c\xe7\x3b\xc9\xe7"
- "\xb3\x57\x1c\x78\x3e\x77\xc2\x3d\x9e\xcf\x3d\x22\xe2\xf9\x26\x95"
- "\xcf\x8d\x47\xfa\xc6\x73\x63\x59\x1f\x78\xce\x94\xc6\x69\x43\x83"
- "\xe7\x73\xe4\xc6\xe1\x39\xdf\x4b\xf9\xdc\x58\xef\x8a\xe7\xb3\xcd"
- "\x1c\xcf\x67\x4b\xbd\xc3\xf3\xb9\x36\x6f\xc6\x89\x4e\x78\x16\xe5"
- "\x73\x53\x39\xe0\x19\xe4\x73\xbe\x28\x9f\x7f\x9a\xed\x01\x9e\x9d"
- "\xe4\xf3\xf9\x83\x0e\x3c\x37\xbd\xee\x1e\xcf\x4d\xbe\x1c\xcf\x05"
- "\x37\xa9\x7c\xfe\x7a\x47\xdf\x78\xfe\x3a\xc9\x3d\x9e\x0b\x94\xd2"
- "\x18\x78\x68\xf0\xfc\x75\xcd\x0d\xc4\xb3\x97\xf2\xf9\xeb\xdd\xae"
- "\x78\x3e\xbf\x8f\xe3\xf9\xbc\xde\x3b\x3c\x37\xb9\x8d\xff\xda\xd7"
- "\x18\xdc\x81\xe7\x02\x51\x3e\x7f\x9b\x49\x03\x0a\x40\x3e\x17\x88"
- "\xf2\xf9\xf9\xc7\xfb\xc7\x73\x81\x93\x7c\xfe\xa6\xc0\x81\xe7\x6f"
- "\xd7\xb8\xc7\xf3\x85\xe3\x22\x9e\x6f\x52\xf9\x7c\x61\x69\xdf\x78"
- "\xbe\x30\xab\x0f\x3c\x67\x4a\xf3\x0b\x43\x83\xe7\x0b\xa5\x37\x0e"
- "\xcf\x05\x5e\xca\xe7\x0b\xc9\xae\x78\xfe\xc6\xc0\xf1\xfc\x4d\xa8"
- "\x77\x78\xfe\x36\x7f\x68\xe6\x37\x2e\x65\xe2\xfc\x46\x07\xce\x6f"
- "\x38\xf6\xfe\xc5\xaa\x6b\x38\x9e\x3b\x01\xcf\x85\xce\x78\xfe\xb2"
- "\xfb\xfc\x46\x73\x8c\xd0\x85\xe7\x4b\x3d\xf0\x2c\x00\x9e\x3b\x19"
- "\x9e\x2f\xfe\x55\x9a\xdf\x30\x35\x97\x02\x4e\x2e\x10\x53\x38\x60"
- "\x39\x57\xc4\xf2\x97\x80\x65\xa0\xa1\x00\x34\xae\xac\xaf\x23\x61"
- "\x16\x4e\xcb\x0e\xa0\xb1\xe0\x8c\xe3\x8e\x26\x39\xe2\x17\x71\x2b"
- "\x61\xb8\x2a\x0e\xb0\x1b\x7f\x8c\x54\x25\xc2\xb5\x16\xae\x14\xb8"
- "\xc8\x31\x52\xd9\x04\xd8\x5d\xea\x8c\xdd\x1a\x11\xbb\x17\x27\xf6"
- "\x8d\xdd\x8b\x8a\x1b\x37\x97\x71\x91\xcf\x7f\x7d\x19\x11\x18\xf6"
- "\xcc\x69\x6a\x4a\xaa\x13\xf1\x79\x81\x84\xd9\x88\x9a\x3e\xaf\x1b"
- "\xad\x8a\x20\x81\x2f\xdb\x89\x3c\x27\x8a\x04\xe6\x9c\x84\x76\x4b"
- "\xfd\xb7\x81\xa8\x3e\xb1\xbe\x47\x2a\x5b\xea\x48\xe5\xd5\x23\xa4"
- "\x52\x80\xeb\x02\x5c\x50\xd7\xb0\x18\xe7\x76\x5b\xc4\x76\x5f\x1a"
- "\x0b\x65\x4d\xe8\xa3\xdd\x36\xd6\xee\x68\x68\x77\x87\xa3\xdd\x26"
- "\xe8\x07\xc0\x9f\x31\x82\x38\x1f\x12\x66\x21\x7e\x2b\x6c\x94\x76"
- "\x88\xf8\x47\xfe\x7c\x52\x6b\x25\x61\x7a\xe0\xd9\x62\xc0\x7f\x63"
- "\x19\x49\x4d\x06\xfc\x77\x58\x11\x77\x16\x53\xda\x35\xc0\xff\xc5"
- "\xe9\x14\xe8\xd7\x89\xf8\xff\x12\xf1\xdf\x3c\x4f\x60\xf8\x6f\x0e"
- "\xf4\x0e\xff\x97\x3c\xc0\xbf\x27\xf3\x21\x97\x33\x71\x3e\xa4\x03"
- "\xe7\x43\x1c\x7b\x40\xfb\xc1\xbf\xf3\x7c\xc8\x77\x4e\xf8\xbf\xdc"
- "\x07\xfe\x2d\x12\xfe\xf3\xbe\x7f\xfc\x5b\xfa\xc1\xbf\xa5\x2f\xfc"
- "\x0f\xf1\xdc\x87\xe5\x06\xe2\xff\x72\x3f\xf8\xb7\x78\x80\xff\x2d"
- "\x49\xde\xe1\xdf\xd2\x0d\xff\xdf\x89\xf8\xff\xce\x4b\xfc\x5f\xf6"
- "\x04\xff\x1e\xcc\x9f\xb4\x21\xfe\x41\xfe\x6f\x69\x73\xda\x0b\xdc"
- "\x1f\xfe\x9d\xe4\x7f\x8b\x13\xfe\xdb\xfa\xc0\x7f\xeb\x5f\xa5\xf9"
- "\x93\xef\x1f\xff\xad\xfd\xe0\xbf\xb5\x0f\xfc\x0f\xf5\x5c\x49\xeb"
- "\x0d\xc4\x7f\x5b\x3f\xf8\x6f\xf5\x04\xff\x5e\xca\xff\xd6\x6e\xf8"
- "\x6f\x11\xf1\xdf\xe2\x25\xfe\xdb\x3c\xc0\xbf\x27\xf3\x2d\xed\x99"
- "\x38\xdf\xd2\x81\xf3\x2d\x8e\x3d\xe1\xfd\xe0\xdf\x79\xbe\xe5\x8a"
- "\x13\xfe\xdb\xfb\xc0\xff\x55\x09\xff\x37\x81\xfc\xbf\xda\x0f\xfe"
- "\xaf\xf6\x85\xff\x21\x9e\x5b\xb9\x7a\x03\xf1\xdf\xde\x0f\xfe\xaf"
- "\x7a\x80\xff\x7c\x2f\xe5\xff\xd5\x6e\xf8\xbf\x22\xe2\xff\x8a\x97"
- "\xf8\x6f\xf7\x04\xff\x1e\xcc\xcf\x74\x20\xfe\x41\xfe\xe7\xb7\x39"
- "\x9d\x0d\xe8\x0f\xff\x4e\xf2\xdf\xea\x84\xff\x8e\x3e\xf0\x7f\xed"
- "\xaf\xd2\xfc\xcc\xf7\x8f\xff\x6b\xfd\xe0\xff\x5a\x1f\xf8\x1f\xea"
- "\xb9\x98\x6b\x37\x10\xff\x1d\xfd\xe0\xff\x9a\x27\xf8\xf7\x52\xfe"
- "\x5f\xeb\x86\x7f\xab\x88\x7f\xab\x97\xf8\xef\xf0\x00\xff\x9e\xcc"
- "\xe7\xd8\xd9\x7c\x4e\x07\xce\xe7\x38\xce\x88\xf4\x83\x7f\xe7\xf9"
- "\x9c\x4e\x27\xfc\xdb\xfb\xc0\xbf\x4d\xc2\xff\x4d\x20\xff\x6d\xfd"
- "\xe0\xdf\xd6\x17\xfe\x87\x78\xee\xc6\x76\x03\xf1\x6f\xef\x07\xff"
- "\x36\x0f\xf0\x5f\xe0\xa5\xfc\xb7\x75\xc3\x7f\xa7\x88\xff\x4e\x2f"
- "\xf1\x6f\x1f\xa2\xf9\x1f\x1a\x82\xf3\x3f\x82\x6a\x73\x5b\x67\xd1"
- "\x82\x10\xc1\x50\x68\x51\xcb\xb4\xc4\xa6\xda\xba\xc7\x94\xd0\x46"
- "\xe6\x5c\x01\x9e\xe8\xaf\x90\x05\x57\x02\x31\x96\xa5\x99\xc2\xf8"
- "\xdf\xe5\x8c\x28\x5c\x36\xc3\x68\xed\xa6\x38\xa2\xb0\x07\x6c\xdb"
- "\x8c\x69\xa6\xf3\x56\x82\x6d\x5e\x87\x34\xb8\xe0\xa0\x01\xce\xc1"
- "\xd1\xef\x74\x81\x25\xe9\x90\xa7\xc3\x4c\x1a\x01\x2f\x95\x8d\x66"
- "\xa0\xfd\x5a\x86\x2d\xe4\xc5\x79\x99\x50\xb3\xf3\x12\x51\xd8\xce"
- "\x6a\xc6\x00\x8f\x83\xfc\x57\x13\x59\x70\x23\x15\x90\x97\xc8\x23"
- "\xe4\xab\x76\x2d\xee\x57\xa2\x93\xaa\x01\xdf\xb6\xb3\xba\x31\x25"
- "\x90\x6f\xe8\xe7\x65\x04\xb6\xfe\x01\xf7\x8a\xca\x7a\xa0\x65\x86"
- "\xe0\x25\x9f\xa8\x27\xe7\x5f\xfa\x9f\xa7\x90\x93\x3a\x9c\xa7\x10"
- "\x54\x5b\x12\x3c\xe3\xd3\x96\x24\x97\x33\xad\x43\xcd\x27\x39\x49"
- "\xf2\x88\x4f\x72\x72\xac\x1b\x9f\x86\x76\xfe\x40\x4e\x8a\x18\x9f"
- "\xe4\x44\xcf\xf9\x44\xcb\xbd\xe2\x93\x9c\x78\xb5\xff\xb7\xc7\x78"
- "\x5a\x2e\x4f\xc3\xf1\x34\xf0\xc9\xc3\xfe\xb4\xc5\xea\x72\x06\x77"
- "\xc8\xf9\x24\xd7\x7a\xc6\x27\xf9\x1a\x57\x3e\x0d\xf1\x38\x57\x2e"
- "\x9f\xc9\xf9\x24\xd7\x30\x3e\x65\xcb\x22\xbd\xe3\x93\xdc\x83\xf3"
- "\x1f\x1e\x8c\xfb\xe4\x0a\x1d\x8e\xfb\x04\x18\xf7\x79\xc6\xa7\xfc"
- "\x24\x97\x33\xc3\x43\xce\x27\x9f\x0a\xcf\xf8\xa4\xb8\xa7\x1b\x9f"
- "\x86\x76\x3c\x26\xf7\x69\xe6\x7c\xf2\x31\x72\x3e\xf9\x28\xbd\xe3"
- "\x93\x62\xda\x90\x8c\x4f\xe4\xbe\x35\x38\x3e\x01\x3e\x79\xd8\x9f"
- "\xf2\xad\x2e\x67\x9c\x87\x9c\x4f\xbe\x7a\xcf\xf8\xe4\x7b\xc4\x95"
- "\x4f\x43\x3c\x6e\x90\xfb\xf2\x78\xc0\x72\xdf\x58\xce\x27\xc5\x1e"
- "\xef\xf8\xe4\xeb\xd6\xff\xe9\x80\xec\x68\xf9\xf0\x24\xb4\xa3\x05"
- "\xb0\xa3\x3d\xe3\x53\x41\x92\xcb\x99\xec\x21\xe7\xd3\x70\x8d\x67"
- "\x7c\x1a\xfe\x52\x37\x3e\x0d\xad\x7d\x2b\x1f\x3e\x83\xf3\x69\x78"
- "\x20\xe7\xd3\xb0\x08\xef\xf8\x34\xdc\x83\xfd\x9f\xbd\x9f\xc3\xea"
- "\x61\xf3\xc9\xfd\x26\xdc\x54\x36\x9f\x5c\x79\xc0\x33\x5e\xf9\x8d"
- "\xbd\xae\x36\x9f\x5c\xd9\xc4\x79\xa5\xdc\xc7\x79\xa5\x54\x78\xc7"
- "\x2b\x3f\xb7\xfe\x1f\xfb\x3b\xbf\xd5\xd3\xee\x1b\x51\x73\x73\xd9"
- "\x7d\x23\x3c\x94\x7f\x23\x8e\x5c\x5f\xbb\x6f\x84\x28\xff\x46\x88"
- "\xf2\xcf\xcf\x4b\xf9\x37\xc2\x03\xf9\xd7\xfb\xb9\xaf\x9e\xb6\x9f"
- "\x2a\xf9\xe6\xb2\xfd\x54\xc1\x9e\xf1\x4a\xb5\xea\xfa\xda\x7e\xaa"
- "\x50\xce\x2b\x55\x10\xe7\xd5\xc8\x79\xde\xf1\x4a\x95\xe9\xed\x79"
- "\xb1\x9e\xf6\x5f\xc0\x4d\x66\xff\xf9\x7b\x68\xff\x05\x5c\x67\xfb"
- "\xcf\x5f\xb4\xff\xfc\x45\xfb\xcf\xdf\x4b\xfb\x2f\xc0\x2b\xfb\xaf"
- "\x1b\xaf\xc4\x7e\xa5\xae\xbd\xb9\x6c\x40\x75\x82\x67\xbc\x52\x57"
- "\x5d\x5f\x1b\x50\xbd\x9d\xf3\x4a\xbd\x8c\xf3\x2a\x60\xaf\x77\xbc"
- "\x52\x9b\xbd\x3d\x9f\xd6\xd3\x0e\x1c\x95\x76\x73\xd9\x81\xa3\x3c"
- "\x1c\xff\x8e\x5a\x73\x7d\xed\xc0\x51\xe2\xf8\x77\x94\x38\xfe\x0d"
- "\xf4\x72\xfc\x3b\xca\x83\xf1\xaf\x07\xf3\x7e\xf2\xdb\xcc\x68\x03"
- "\xda\x0d\x9b\xdb\xd4\x40\x7f\x75\x12\x91\x77\x04\x03\xbf\x54\xc0"
- "\xaf\xf5\x5a\xd2\x69\x00\x7e\x59\x6c\x64\xce\x4b\xa7\x69\x75\xb3"
- "\x9d\x74\x00\xaf\xae\x81\x1d\x68\xb2\x34\xe1\x19\xbd\x5f\x36\xc8"
- "\x6f\x5b\xf3\xfc\x4b\x81\x04\xf9\x85\xf4\xb7\xab\x46\x6b\x29\xf0"
- "\x8b\xf1\x4f\x55\x54\x6e\x33\x6c\xd3\xcf\xbe\x78\x9a\xae\x30\x53"
- "\x5a\x15\x6b\x45\xdf\x91\x21\x55\xb1\x75\x24\xac\x91\xf8\x69\x9f"
- "\x45\xbe\xdc\x36\x09\xd3\x4d\x96\x3a\x82\x7e\x3f\xd9\x1c\xf8\x69"
- "\x5d\x90\xed\x0b\x9d\x0a\xfd\x37\xe1\xb9\x42\xc9\x47\x93\xe9\xc2"
- "\x76\xc6\xff\xee\x73\xaa\x8c\xff\x5f\xe8\x02\x0b\xf1\x7c\xe2\x90"
- "\xdb\x82\xa3\xd9\xfc\x9f\x70\x5a\x33\x46\xaa\xe3\x8a\x65\x94\x42"
- "\x1d\x47\x57\xb7\x59\x08\xd6\xb3\xba\xcd\x48\x52\x13\x48\x60\x75"
- "\x47\x13\x49\x69\xa3\x96\xea\xb4\x6f\x48\xd8\x15\x5c\x17\x40\x3c"
- "\xdd\xf6\x12\xe7\xf7\xe8\x22\xe1\xb4\x6e\x8c\x59\x7e\x5b\x6c\x75"
- "\x0d\x21\xea\xf5\x40\x6b\x1b\x91\xb3\xf3\x9a\x72\xa2\x04\x7a\xc5"
- "\x9a\xd2\x1a\x08\xd0\xce\x62\xb2\x9d\x44\x7a\xc6\xc2\xfb\x19\x5d"
- "\xeb\x0d\x01\xdb\x5a\x30\x0d\x69\x8b\xfb\x4c\x4d\x7a\x0b\xcb\x23"
- "\xbd\xe7\xbc\x4b\x23\xa6\xa4\x0e\x52\x6d\x23\x04\xbe\x37\xeb\x68"
- "\x44\x1d\xe0\x6b\xb4\x97\x72\xfb\xb6\xe6\xa1\x99\xaf\xbc\x23\x14"
- "\xed\x56\xbb\x61\x4b\x02\xaf\xa3\x6f\x4b\xff\xf8\xda\x92\xe4\xc0"
- "\xd7\xed\x27\x06\x87\xaf\xdb\xb3\x86\x18\x5f\x43\x6c\xbf\xde\x3e"
- "\x77\x70\xf8\xba\xfd\x18\xc7\x57\x90\x8d\xe3\xeb\xf6\x0a\x07\xbe"
- "\x7c\x5b\xae\x1f\xbe\x82\xca\x38\xbe\x82\x62\xbd\xc3\xd7\x1d\x4f"
- "\x0f\xcd\x3c\xab\xa6\x14\x6d\x6d\xc0\x97\x28\xbf\x46\x36\x78\x80"
- "\x2f\x27\xf9\xa5\xf9\xf9\xe0\xf0\x75\xe7\x37\x43\x8b\xaf\xa1\xb6"
- "\xb9\xef\xdc\x3b\x38\x7c\x69\x1e\xe2\xf8\xba\x73\x1e\xc7\x97\x46"
- "\xe7\xc0\xd7\xc8\x86\xeb\x87\xaf\x3b\x95\x1c\x5f\x77\x54\x78\x87"
- "\x2f\x8d\x57\xfe\xaf\x7a\x8e\x0f\xee\x26\x38\x3e\xb0\x1b\xf2\x45"
- "\xf9\x35\xea\xd3\xfe\xf1\x95\xef\x24\xbf\xc6\xec\x18\x1c\xbe\xc6"
- "\xfc\x6e\x88\xf1\x35\xc4\xe3\x84\x31\x41\x83\xc3\xd7\x98\xbf\x72"
- "\x7c\xdd\xb5\x8f\xe3\x6b\x4c\xa6\x03\x5f\xa3\x3e\xbd\x7e\xf8\xba"
- "\x2b\x96\xe3\xeb\x2e\x9d\x77\xf8\xba\xdb\xbd\xff\xe7\x01\xcd\x6b"
- "\x8f\x8d\xc4\x31\x0d\xe0\x4b\x94\x5f\x3f\xcd\xf6\x00\x5f\x4e\xf2"
- "\x2b\xf8\xda\xe0\xf0\x15\xfc\xfa\xd0\xe2\x6b\xa8\xc7\x36\xc1\x09"
- "\x83\xc3\x57\xf0\x65\x8e\xaf\xe0\x60\x8e\xaf\xe0\x26\x07\xbe\x7e"
- "\x9a\x7d\xfd\xf0\x75\x77\x05\xc7\xd7\xdd\x99\xde\xe1\x6b\xac\x07"
- "\xfe\x5f\x3d\x99\x8f\x1f\x6f\xc4\x71\x98\xdd\x50\x20\xca\xaf\xe7"
- "\x1f\xef\x1f\x5f\x05\x4e\xf2\x6b\xfc\x9f\x06\x87\xaf\xf1\x7e\x43"
- "\x8c\xaf\x21\x1e\x8f\x8d\xab\x1d\x1c\xbe\xc6\x3f\xc3\xf1\x35\x2e"
- "\x99\xe3\x6b\xfc\x2c\x07\xbe\x9e\x7f\xfc\xfa\xe1\x6b\x9c\x8e\xe3"
- "\x6b\x6c\x93\x77\xf8\x1a\xef\x81\xff\x1f\x4f\xd7\x11\xee\x9d\x30"
- "\xb8\x31\xe4\x3d\xef\x0f\x0e\x63\xf7\x2c\xbf\xb9\xc7\x90\xf7\x4c"
- "\x1f\x1c\xc6\xee\x79\x87\x63\x4c\x6b\xe6\x18\xbb\x67\xf7\x8d\x19"
- "\x43\x6a\x0d\x1c\x63\xda\xa7\xbd\xc3\xd8\xbd\x43\xb8\xfe\x31\x21"
- "\x73\x70\xe3\xc8\x09\xf7\x0c\x0e\x63\xf7\x1d\xbb\xb9\xc7\x91\xf7"
- "\x15\x0d\x0e\x63\x13\xee\xe2\x18\xbb\x6f\x26\xc7\xd8\x84\xc0\x1b"
- "\x33\x8e\xbc\xd7\xc2\x31\x76\xaf\x97\xeb\x36\x13\xbc\x3a\xff\xd2"
- "\xfb\xba\xcd\xfd\xcd\x83\x1b\x4b\xde\xff\xca\xe0\x30\x76\xff\x23"
- "\x37\xf7\x58\xf2\x7e\x32\x38\x8c\xdd\xbf\x8e\x63\x6c\x62\x19\xc7"
- "\xd8\xfd\x09\x37\x66\x2c\x39\x71\x2e\xc7\xd8\xc4\x20\xef\x30\x76"
- "\xbf\x75\xe8\xd6\x9b\x26\x85\x0f\x6e\x3c\xa9\xfb\x66\x70\x18\xd3"
- "\xed\xb8\xb9\xc7\x93\xba\xe8\xc1\x61\x4c\x77\x86\x63\x4c\xa7\xe2"
- "\x18\xd3\xd5\xdd\x98\xf1\xe4\x8f\xca\x39\xc6\x7e\x94\xe4\x1d\xc6"
- "\x26\x79\xe0\xff\xdf\xd3\x75\xb2\x1f\xef\x1d\xdc\x98\xf2\xc7\xb3"
- "\x07\x87\xb1\x07\xec\x37\xf7\x98\xf2\x81\x8a\xc1\x61\xec\xc7\x4f"
- "\x72\x8c\x3d\xa0\xe7\x18\xfb\xf1\x8c\x1b\x33\xa6\x7c\x20\x98\x63"
- "\x6c\x52\xbd\x77\x18\xfb\xb1\x71\xe8\xd6\xf7\xa6\x6a\x06\x37\xae"
- "\x9c\xf2\xf6\xe0\x30\x36\x65\xd1\xcd\x3d\xae\x9c\x32\x79\x70\x18"
- "\x9b\xf2\x3a\xc7\xd8\xe4\x5a\x8e\xb1\x29\xa5\x37\x66\x5c\x39\x39"
- "\x8d\x63\x6c\xb2\x77\xfe\x28\xe4\x53\x7b\xf8\xbf\x5a\x1a\x97\xb8"
- "\x68\xd9\xd2\x68\xed\xd2\xb8\x84\xf8\x97\xb4\x2b\x97\xae\x8d\x79"
- "\x74\xe2\xaa\xc9\xda\xf8\x24\x6d\xfc\xd2\xb8\x3f\x8b\x09\xd1\x23"
- "\xc8\xb3\x31\xcb\x16\x25\x61\x0a\xe4\xfe\x73\xdc\xf2\x98\xb8\x04"
- "\x6d\x7c\xcc\x4b\xab\x96\xc6\xc7\xe0\xff\x2b\xb5\x4b\x56\xc4\x43"
- "\xc2\xe2\x98\xa5\x89\x31\xda\xa8\x55\x4b\x96\xc4\xc4\xaf\x1c\x41"
- "\x66\xaf\x5a\x96\xb0\x54\xbf\x2c\x46\x3b\x73\xf6\x63\x53\xe6\x3e"
- "\xf9\x87\xb9\xbf\xfe\x35\x06\x27\x73\x8a\x4d\x16\x4c\x0d\x45\x7b"
- "\x00\x73\x8a\xf3\xf2\x9f\xdd\x53\xad\x21\x2c\x3e\xee\xa6\x16\x12"
- "\x98\x1d\x4f\x14\x59\x2d\x44\x99\xd3\x42\x54\xda\x17\x48\x28\xcd"
- "\xfa\x22\x34\xb7\x85\x04\xd1\xdc\xa8\xe9\x42\x8e\x3a\x9c\xe6\xa8"
- "\xf3\x2c\x7e\x56\x4c\x0b\x14\xb2\xda\x93\xe0\x37\x41\x40\x5b\x05"
- "\xcd\x19\x4d\x1a\xe4\x3f\x35\x5b\xfc\xae\x69\x53\xbf\x21\x72\x3a"
- "\xe2\xc1\xb9\x6f\x0a\x16\xf9\x47\x38\x53\x05\x6d\x27\xf2\x90\x65"
- "\x70\x45\x10\xf9\x43\x4a\xb8\x34\x70\x4d\x80\xeb\x69\xb8\xe6\xc2"
- "\x15\x0b\x57\x02\x5c\x69\x70\x65\xc2\x95\x07\xd7\x76\xb8\x4a\x89"
- "\xfc\x27\xc1\x70\xcd\x80\x0b\xf2\xfe\x24\x9a\x97\xf3\x13\x3d\x5c"
- "\x45\x70\x1d\x80\xab\x9e\xc8\x1f\x86\xfc\x0f\xef\x21\xf2\x69\x21"
- "\x70\xaf\x80\xab\x16\x2e\x48\x9f\x46\xe0\xc2\xdf\x27\xf0\x77\xd3"
- "\xea\x88\xfc\x91\x20\x02\xf5\xec\xff\x7a\x64\x1a\x5c\xf0\xdd\x47"
- "\x22\xe1\x32\x42\x1a\xd4\xf7\xa7\x09\xdd\xf2\xed\x73\xfa\xbf\xae"
- "\x9f\x32\xad\xea\xf5\xe3\xcd\x2c\x06\x9e\x3c\xe4\x08\x4d\x27\x3e"
- "\x34\xeb\x9a\x56\xff\x00\x91\x5d\x90\x87\x14\x98\x36\xa2\x9c\x51"
- "\x87\xb3\x98\x8e\xf0\x8c\x34\x6b\xcf\x0e\xc9\x37\x93\x65\x16\x8c"
- "\x69\x36\x30\xbc\x85\xe4\x8b\xbf\xaf\x35\xcb\x86\x5b\x59\x0c\xb8"
- "\xec\xaa\x40\x9a\x1a\x51\xc8\x62\xbf\x01\x0d\xf1\x5c\x16\xcd\xac"
- "\xcc\xa4\xca\xc3\xc1\xd8\xe7\x8d\x6b\x59\xbd\x96\xf3\xfe\x05\xef"
- "\xa1\x6e\x16\xff\xa8\xe9\x50\x4f\x05\x3e\xd3\x2c\x6b\x68\x87\x7f"
- "\x61\x1e\xfe\x7f\xad\x78\xbe\x91\x1a\x0a\xcb\x71\x9c\x6d\x4c\xf9"
- "\x4f\xe0\x7b\xc8\xf2\x0e\xff\xe2\x08\xed\xb3\x6a\xda\xc0\xcb\x96"
- "\x9b\xe5\x0f\x11\xa9\xac\x0e\xff\xa8\x50\xba\xbd\x38\x8d\xe6\x00"
- "\x86\xc4\xf2\x04\x28\x8f\x1a\xb6\x45\x42\xbe\x79\x98\x4e\x8b\xe6"
- "\xd7\x49\xff\xc3\x3d\x82\xe6\x16\x11\xbc\xab\xd7\x93\x36\xf6\x9c"
- "\x1e\x4a\xf8\x3d\x90\xa0\xac\x6b\x96\xff\x44\xf6\x60\x0d\x91\x19"
- "\x9f\xc5\x7a\x3f\x54\x99\x5a\x43\x05\x6d\x8a\x0f\x7c\xff\xa1\xaa"
- "\xae\xef\xde\x55\x9c\x84\xf1\x53\x85\xec\xa9\xd1\x18\x83\x0f\x7f"
- "\x8b\x75\x7b\x75\x34\x51\xec\xdc\x4c\x94\xd8\xc6\xf6\xec\x87\xac"
- "\x52\x1c\x3a\xfc\x8d\x1c\xf2\x3f\xf5\x4c\x2a\x75\x2a\xfb\x20\x65"
- "\xed\x09\x89\xe5\x34\xfd\x89\xce\x2c\xf3\xad\xc7\xfc\xda\x7b\x19"
- "\x2d\x97\x8b\xef\x97\x21\x3f\xb1\x7c\x21\xa7\x68\x0f\x3e\x63\x9c"
- "\x3b\x75\x0d\x91\x6b\x53\x26\x94\x73\x1a\x15\x96\x63\x39\x98\x5f"
- "\xc8\xdd\x0a\xff\x3f\xa4\x12\xa0\xbd\xf6\x74\xa2\xd3\xc6\x91\xd0"
- "\x06\xf9\x4f\x0a\xec\x59\x55\x35\xf0\x1e\xfa\x5d\x55\x2d\xe4\xaf"
- "\x61\xf4\xce\xd9\x16\x6e\x96\xff\x24\x13\xde\xd5\x76\xc5\xbe\xe4"
- "\x74\x96\x09\x59\x55\x8d\x50\xa7\x7d\x66\x59\x70\x93\xd4\x06\x26"
- "\xe3\x1c\xf9\x44\x9e\xfe\x64\x8f\xc5\xaf\xaa\xb1\x33\x91\xd6\x6c"
- "\x3a\x49\x08\x7c\x93\x76\x5c\xa5\x95\xc9\xe1\xd4\x9a\xfb\x6f\x84"
- "\x54\x46\xd6\x93\xd4\x45\x24\x78\xe4\x7a\x0a\xb6\x14\x51\x8f\xac"
- "\x57\xd3\xaa\xf0\x7a\x90\xd1\x57\x48\x72\x0d\x6d\xaa\xd6\xef\x23"
- "\xc9\xe7\x88\x6a\xdd\x52\x12\x94\x1a\x4e\x2d\x29\x95\xd4\x6a\x4a"
- "\xaa\x27\xd5\x6d\x70\xe9\xab\x20\xdf\x71\xb8\xf6\x91\xd4\x35\x44"
- "\x31\x07\xe4\x69\xca\x15\xa2\xaa\xd6\x5f\x81\xb4\x8b\x24\x39\x92"
- "\xda\xaa\x2a\x31\xdf\x41\x12\x66\xb3\xa8\xd7\x5d\x24\x8a\x92\x7f"
- "\xc3\xb3\x65\xa7\xc8\x4e\xa8\x4b\x87\xbf\x3a\xed\x5a\xce\x68\x65"
- "\x6b\x22\xb5\xb5\x67\x3f\x9c\x69\x26\xbf\x48\x73\x69\x0b\xd6\x19"
- "\xe3\x86\x42\x7b\x31\x8f\x90\xb3\x6d\xfa\x42\x1b\xe2\xfc\xe1\x64"
- "\x90\xc5\x44\x7a\x8f\xef\x2c\xfe\xdb\x00\x3f\x0f\x97\x85\xd9\x68"
- "\x3b\xe6\xc7\x76\x03\x8d\xcc\x62\xfb\xcd\x3e\x7a\xa2\x80\x6f\x34"
- "\x9b\x65\xe3\x0f\x38\xf1\x10\x79\x32\x4c\xfa\x1e\xcf\x33\x2d\xd0"
- "\x2c\x1b\xc7\x62\x2f\x0a\xfc\x9d\x15\xf3\x42\x3a\xf0\x7f\x7c\x10"
- "\xaf\xdf\xc3\x16\x4c\x13\x65\x29\x62\x05\xeb\xe8\x43\x33\x0f\x59"
- "\xec\xfe\x85\x46\x2a\xa7\x56\xc0\x73\x04\x6d\xd5\xa8\xe6\xd8\xa8"
- "\x55\xc8\xd9\x1a\x0e\xf2\x52\x85\x71\x52\x79\xfe\x69\x1f\xc1\xfb"
- "\x48\x6d\x22\xfb\xff\x75\xfc\x8e\x50\x3c\x7f\x0f\xca\xd6\xb0\x1a"
- "\xcc\x1f\xb5\x27\x37\x1e\x64\x6f\x4e\xe1\x1e\xec\x87\x82\xff\xb6"
- "\xd8\x6b\x3b\x8a\x23\xb1\x7f\x53\xc0\x18\x35\x44\x45\x76\x95\x93"
- "\x4e\x7c\xcd\xf2\x69\x69\x14\x7e\x4f\x0d\x5b\xc3\x45\xde\x2f\xe5"
- "\xd8\x9c\x96\x8c\xfd\x0e\xea\xd5\x06\xe9\xbe\x0d\xf2\x47\x94\x78"
- "\x46\x93\x66\x1e\x9e\xcc\x62\x49\xca\x1f\xf1\xe7\x98\x39\x64\x71"
- "\x79\x96\x23\xfd\xa0\x4f\x82\x1c\xe0\xf6\xc5\x23\x53\xfe\x3f\xf6"
- "\xde\x07\x2e\xaa\x2a\xfd\x1f\x7f\xe6\x32\xea\x40\x20\x93\x91\x4d"
- "\x7d\xa8\xc6\xa2\xc2\xf2\x0f\x96\x15\x19\x16\x15\x16\x96\x0a\x25"
- "\xd5\x94\xff\xd0\xb0\xc6\x42\x25\x41\x1d\x15\x05\x27\xdb\x0f\xb2"
- "\xa8\x94\x68\x94\xfc\x6b\xb3\x5d\x2a\x2b\xdb\xb5\xdf\xc7\xcf\xeb"
- "\x65\xdb\xec\x47\xda\x0f\xbb\x2b\x0c\xbb\x3f\xf7\xf7\x45\xc3\x4f"
- "\x93\x5f\xd6\x25\x17\x75\x56\x26\x19\x61\x66\xce\xef\x79\xce\xb9"
- "\x17\xee\x1d\x66\x54\xd2\xed\xb3\x7f\xa2\xae\x77\xee\x39\xcf\x79"
- "\xce\x39\xcf\xf3\x7e\x9e\xf3\xe7\x9e\x7b\x4e\xbf\x5d\x08\x1c\x0b"
- "\xfb\xde\x8e\x65\xba\xdd\x1a\xb0\x47\x04\x90\x4e\x77\x54\xc8\x41"
- "\xea\x89\x6c\x6a\xed\x2e\xbd\xd3\xe2\xd2\xc1\x6c\x8d\x3e\x4b\x7f"
- "\x6d\xa4\x73\x2b\xb1\x2c\x11\xc8\xf3\x55\xbc\x0f\xc3\xfb\xc6\xfd"
- "\x2d\xd4\xd6\x72\xbe\x97\xd1\xef\xb7\x46\x32\x77\xda\x74\xa0\x33"
- "\x2a\x51\xee\x77\xd6\xb9\x60\x6e\x16\xf1\x29\xa5\xb3\x3b\x31\x8c"
- "\x68\x30\x7c\xaf\x0b\xe6\xa5\x09\xfe\x13\x66\x7b\xc8\x67\x69\xf9"
- "\x1f\x11\xfc\x05\x5f\xe2\xa7\xf0\xae\xde\xce\x3a\x65\xde\x3e\x85"
- "\xf7\x26\x0c\x53\xf8\xa7\x2d\x56\xf2\xb8\x2b\x1e\xe3\x0f\xa8\xeb"
- "\xf0\xe6\x76\xe6\x21\x1e\x18\x97\xec\x82\x17\x4c\x14\xb7\x11\xc3"
- "\x28\xad\x0a\x53\x11\xfb\x33\x91\xc7\x01\xce\x23\xdb\x05\x0b\xeb"
- "\xd4\x7e\x03\x65\x14\xa3\xf8\x5a\x99\xd7\x06\x85\x57\x3f\x1f\x05"
- "\x53\xbf\x77\xc9\x3a\x25\xbe\xd1\xc4\x17\xe9\xf7\xb8\x20\xbb\x43"
- "\x5d\x77\x94\x79\xa3\x1c\xd7\x82\x72\x8f\x57\x97\x59\xf8\xd5\x1d"
- "\x74\xe6\xad\x4e\xe6\xb5\x8d\x7c\x96\x12\x4f\xe7\x7a\xb2\xd2\x71"
- "\x65\x64\x37\xe8\x1f\x01\xed\x2c\xb5\xbb\xf4\x6e\x53\x90\x7f\xd4"
- "\x13\x1d\xfa\xd4\x5f\xf1\x73\x4d\x47\xb2\x0e\xa4\x49\xd1\x9c\xe5"
- "\x29\xc1\x7d\x18\x96\xa9\x9c\x29\xba\x19\x69\xb0\x0f\x14\x76\xcf"
- "\xc4\x75\xa3\x40\x72\x56\xb9\xa8\xbf\x4a\x98\x4b\x71\xc6\x7b\xc0"
- "\x59\x15\x80\x40\xcd\x1c\x57\xea\x3a\xe6\xc0\x3e\x4a\x13\x9d\x11"
- "\x3d\xb8\x36\xf0\x6e\xbe\xfe\x8f\xf5\x60\x3f\xae\xf0\x76\xa0\x76"
- "\xef\xa4\x94\xec\x77\xba\x4f\x73\xdb\xc3\xdf\xdf\x50\xfc\x56\xec"
- "\xf7\x51\xdf\x0f\xfb\xdb\xd6\x72\x49\xf4\xff\x02\x48\x5b\x43\xe1"
- "\xd4\x37\xc4\x7e\x69\xad\x2a\x8e\xd5\xcc\xa9\x14\xb2\x4b\xfe\x94"
- "\xe4\xc8\xcb\xeb\x7b\xc4\x41\x65\x0e\x54\xcd\xa9\xa4\x3a\x14\xd9"
- "\x58\xc0\xe9\xeb\x76\xd0\x59\xbb\xe6\x15\xd4\x6f\x4d\x7e\x2d\xa3"
- "\x1a\x18\xda\x76\xe5\xe0\xea\x90\xcc\xc7\xbf\xd8\x37\x3f\xe9\xbe"
- "\x76\x4e\x25\x9d\xad\xbc\x65\xdd\x10\xc3\x43\x55\xcc\xd1\x75\xdd"
- "\x1c\x57\x77\x69\xf2\x1e\xe5\xec\xda\x41\xf2\xdd\xa3\xd4\xbd\x46"
- "\xae\x3b\x86\xf1\x77\xd6\xe3\x2b\xf9\x99\xda\xf4\x1c\x76\xad\x13"
- "\xfa\x97\x46\x4a\x8b\x75\x4f\xad\x55\xe4\xe4\x73\xd3\x99\xe2\x97"
- "\x1f\x97\xee\x59\x9f\x51\xe8\x00\xbe\x4f\xfe\xa6\xed\x8d\x83\x2b"
- "\xd7\x3d\x7c\xfd\x4b\x33\x8e\x0b\x32\x7c\x9f\x33\xe1\x17\xef\x79"
- "\x6f\x86\xcc\x8f\xe2\x14\x5d\xd5\xc8\xfd\xf5\xef\x90\xc7\xee\x0b"
- "\xa8\x97\x71\x60\xbd\x26\x3d\xf3\xdd\xeb\x35\x29\x61\x60\xbd\x26"
- "\xad\xbf\xb4\xf5\x9a\x14\x76\xfd\xb7\xaa\x5e\xe6\x81\xf5\xba\x77"
- "\xc2\x45\xd4\xcb\x37\xb0\x5e\xf7\x3e\x73\x69\xeb\x75\x6f\xf6\x05"
- "\xd4\x2b\x69\x60\xbd\x52\x22\xbf\x7b\xbd\xee\x3d\x38\xb0\x5e\x29"
- "\x13\x2e\x6d\xbd\x52\x92\x07\xed\x0f\x37\x57\x19\x85\x3f\x4c\x39"
- "\x32\x78\x7f\x98\x52\x3f\xd0\x1f\xde\x17\xd3\xef\x0f\x27\x9f\xfd"
- "\x4e\xfe\x70\xf3\x02\xb9\xaf\x31\xf9\x8b\x01\xfe\xb0\x6c\x41\x66"
- "\x68\x7f\x38\xf9\x6d\xee\x0f\x37\x2d\xc8\x1c\x5c\x1d\x26\xe7\xf6"
- "\xf9\xc3\x98\x05\x99\x1a\x7f\x38\xbc\xca\xd8\x5d\x3a\xb9\xe1\xbb"
- "\xf9\xc3\xc9\x0d\x03\xfd\xe1\xe4\x04\xad\x3f\x9c\x1c\xf6\xac\x2f"
- "\x1c\xc7\xa4\x87\xf2\x87\x19\xbe\x53\x4c\x60\xe3\x8d\xf4\xc1\x95"
- "\xe7\xbe\xb0\xfb\xbf\x23\xe6\x5b\xce\x9d\xd7\xf6\x96\x41\xe6\x15"
- "\x76\xfe\x0b\xc7\x86\x46\xec\x83\x18\xd7\xbe\x0d\xd2\xb1\x42\x90"
- "\x9a\xe3\x5b\xc1\x69\xf3\xc2\xb8\x3c\xc4\x84\x1d\x52\x9a\xab\x3a"
- "\xa1\x39\xfe\x18\xb0\xc8\xff\x36\xb2\x9f\x2e\xc9\x4e\x5d\x46\xd8"
- "\xbc\x7f\x95\xb3\xc0\x3b\x48\x6c\xde\x9f\xa6\x60\xb3\xd9\x87\xd8"
- "\x5c\x41\x78\x4c\x7d\xcf\xd9\x79\x5c\xc6\x66\xea\xb6\x3e\xfd\xd8"
- "\x05\x3e\x43\x62\x13\x6d\x42\x8b\xcd\xed\x0e\x81\xcd\xd4\xf9\x03"
- "\xb1\xb9\xdd\x11\x1a\x9b\xa9\x93\x05\x36\xb7\x3b\x06\x57\x87\x54"
- "\x43\x3f\x36\xb7\x3b\x34\xd8\xbc\x79\x49\x76\x77\x69\x6a\xf6\x77"
- "\xc3\x66\x6a\xb6\x52\xf7\x6a\xb9\xee\x28\x2f\x87\x16\x9b\xa9\x95"
- "\x61\x75\x58\xf2\x69\x2b\xfa\xc3\xe8\xe3\xd2\x03\x56\x3f\xf6\x69"
- "\x03\x25\xfe\xe4\x0c\x3f\xeb\xa6\x33\xda\x99\x34\x11\xd8\xca\xc4"
- "\xe8\x6e\x1c\x6f\x76\x77\x5b\x0d\x2c\xea\xd7\x35\xac\xd7\x04\x58"
- "\xf6\x58\xd6\x9d\x38\x1c\x65\x96\x80\xf7\x11\xd5\x2b\x20\x0e\x2f"
- "\x53\xb5\x2c\x57\xfc\x9d\xc4\x56\x9a\xa2\x36\xaf\x80\x31\xb1\x1e"
- "\x30\x60\x19\x70\x9c\x6e\x84\x58\x1f\xc4\xd1\x6f\x66\xaf\xb3\xd6"
- "\x9e\x01\x3d\xcd\x35\x06\x22\x31\x3f\x5b\x2c\x63\xf9\x89\x50\xbb"
- "\x0c\x68\xdc\x61\xaa\x95\xd8\x6e\xff\xca\x44\x89\x0d\xdf\xf1\x3b"
- "\xb6\xc6\xc2\xcb\x14\x48\x58\x52\x87\x18\xaa\x63\x45\x56\xca\x37"
- "\x95\xce\x0a\x66\x37\x2f\xd9\xc9\xba\x4d\x51\x9b\xce\xc0\x98\xda"
- "\x15\x90\x50\xb3\x02\x12\x59\x6f\xa2\x84\x32\xb0\xcc\x7d\xd9\x48"
- "\x7a\xb7\x30\x09\xf3\x5a\x81\x79\xa1\x2e\xfd\x1b\x31\x2f\x1f\xe6"
- "\x75\x0a\xf3\x3a\x89\x79\xd9\x31\x2f\xbb\xc8\x6b\x70\x32\x7f\xe0"
- "\xe0\xb9\xe6\x84\x33\xd6\x5e\x47\x7b\xd7\xfe\x39\xd6\x36\x2c\x9d"
- "\xe6\x87\xbb\xd6\x58\x07\x89\xf7\x07\xc3\x7e\xff\xb3\xe5\x23\x88"
- "\x67\x86\x6e\xeb\x8c\x57\xbf\x62\x19\xe8\x71\x5e\xfd\x08\xc6\x90"
- "\xcd\x35\x7b\x4f\xa0\x9d\x75\x5b\xbf\x48\xec\x1c\x6c\x5e\x75\xe1"
- "\xf2\x2a\xb5\xb3\x96\xde\x78\x1a\x2f\xee\x68\xdd\x22\x31\x5b\x4f"
- "\xfc\x9c\x96\xdf\x1e\xec\x81\x79\x36\x9a\x83\x66\x36\xf3\xb3\x60"
- "\x38\x2a\x4d\xcd\x2a\x3a\x44\xf3\x79\x0f\x25\x68\xe7\xf3\x1e\x4a"
- "\x07\x29\xad\x13\xa4\x87\xe3\x41\x7a\x64\x27\x20\x9d\xf6\x4a\x6f"
- "\xcb\x78\xef\x3a\x58\xe7\x63\x7f\xc6\x71\x6a\xfd\x66\x1c\x0b\x67"
- "\x8c\xd6\xb9\x1c\x2b\x68\x7e\x2b\xed\x4f\x28\xbf\xbf\x60\x1b\x14"
- "\x4b\xbf\x89\x5f\xde\x32\xb8\xe2\xb8\x94\xd6\x1e\xeb\x19\x96\xee"
- "\x8b\xde\xe1\xf5\xe1\xf8\xad\xd7\x54\x9d\x7d\xb6\x6c\xc7\xee\x5e"
- "\x1a\xcf\x2e\x20\x3f\xf0\xd0\x91\x58\x5d\x31\x8e\x5b\xfd\xc9\x8c"
- "\x99\x68\xce\xd6\x52\x85\x17\xe9\x9e\xeb\x3d\xea\x40\x1a\xe1\x83"
- "\xb0\x58\x2b\xc2\x8d\x84\xc7\x2d\x72\x9b\xed\x8e\xb8\x35\x9b\x6c"
- "\xc0\x8f\xe9\x8b\xfe\x04\xf1\xce\x36\x3f\x20\xa6\x2d\xf3\xfc\x06"
- "\xb2\x23\x8b\xe3\xd9\x3f\xc0\xb1\x3c\x90\x8a\xfe\x0a\x31\x88\xa1"
- "\x68\xb2\x87\x00\xda\x43\x46\x5b\xac\x17\xed\x3a\xb0\xee\x5b\x88"
- "\x25\x3f\x41\xfb\x22\x3b\x3b\x5d\x10\x38\x95\x38\x7c\xc7\x12\x88"
- "\xf3\x9d\xb2\x8e\x70\x9f\xb2\x5e\xf1\x66\x00\xe2\x86\xe7\x81\xb1"
- "\x7a\x09\x62\x77\x29\xda\xc7\x49\xb4\x8f\x4e\x61\x1f\x7d\x78\xfd"
- "\xd1\xaf\xf4\xf4\xcd\x0d\xb7\x8d\x8d\xb2\x6d\xac\x44\xbc\xae\xe8"
- "\xb7\x0d\xdf\xd2\x44\xa9\x5a\x62\x80\x65\x44\xb9\x3f\x18\x57\xbb"
- "\x6e\x18\xf9\xfd\x4c\x76\xdd\xdc\x54\x1a\x9b\x65\xf8\x98\xef\x63"
- "\xd4\xc5\x90\xd1\x92\x99\x6d\xda\xe1\xfd\x6d\x66\x07\xf4\x8f\xe9"
- "\xa6\x3e\xd9\x73\xed\x9c\x16\xf3\x13\xec\xd4\x51\x29\xad\x0d\xc3"
- "\x0d\xe6\xa7\x6e\x31\xa2\x1e\x9f\x14\x63\xc0\xa9\x59\x34\x47\xe0"
- "\x92\xd2\x76\x23\x2f\xa0\xf7\x12\xbf\xe3\x73\x92\x0f\xc7\x21\x2d"
- "\xf8\x51\xe6\xbe\xe8\x05\xd9\x81\xe8\x1d\x8d\x8e\x17\x7b\xb8\x6d"
- "\xf6\xa2\x0e\x8e\xe5\x82\x34\x0f\xb5\x8d\xbe\x21\x06\x7d\x02\xf9"
- "\x8c\x4c\xee\x33\x4a\x7e\x5d\x59\xe8\x62\x81\x8c\x9c\x08\x86\x72"
- "\x31\x38\x6d\x7e\x98\x9b\x07\x6c\xed\x09\x94\x91\xa7\x95\xfc\xcb"
- "\xf0\xc0\x4a\xe1\x43\x76\xa0\x7c\x62\x3a\xc1\xc8\x4a\xcf\x26\x7d"
- "\xb4\xae\x71\x88\x1f\x71\x4e\x7e\x24\x76\xbd\x2e\x12\x75\x35\xbc"
- "\x8c\xec\x1c\xed\x3e\x76\x3d\xf7\x6b\x5c\xb7\xbe\x95\x89\x37\xf4"
- "\xae\x4c\x34\xe3\x75\x9d\xe2\x6b\xe8\x2c\xae\x6a\xf2\x33\xa5\x0f"
- "\x16\x92\x9f\x71\xda\x5c\xe0\x43\x59\x0e\xa7\x76\x69\x65\x62\x3c"
- "\x97\xe9\x0b\x28\xd3\xe7\xc1\x30\xde\x0b\x3a\x2c\x97\x11\xcb\x0c"
- "\x4d\xd6\xa3\x40\x32\xf6\xa3\x1d\x91\x9c\x7b\xc9\x07\x21\xd6\xb0"
- "\x9f\x92\x3d\x7d\x91\x19\xbe\x48\xfc\x23\xd0\xde\x4a\x45\x67\xd9"
- "\xd7\x34\x27\xea\xb4\xf9\x80\xc5\xec\xf0\x32\x3e\x8f\x94\xb6\xe7"
- "\xb7\x99\x5e\x08\x8f\xe9\x47\xaa\xfb\x31\xfd\x48\x75\x3f\xa6\x1f"
- "\xe1\x6b\x50\xd4\xb8\x3e\x5b\x89\xb8\x8e\x56\xe3\xfa\xe1\x4f\xff"
- "\xa6\xb8\x9e\x31\x78\x5c\xbf\x79\x52\x85\xeb\x75\xff\x3b\xb8\xfe"
- "\x9d\x85\xe3\x3a\xa2\xf7\x5a\x8e\xd7\xbd\x4e\xdf\xcf\xc1\x25\x3d"
- "\x52\xa2\xe0\xf6\x37\xef\x13\x6e\xd3\x0f\xfc\xbd\xe2\xf6\x6c\x77"
- "\xa2\x19\xaf\x4b\x8e\x5b\xe4\x79\xc1\xb8\xfd\x9d\xa5\x07\x14\xf9"
- "\x11\x7e\x59\x49\xb7\xd5\x5c\x04\xf7\xa3\x9f\xc8\x8a\x5d\x7f\x1d"
- "\x34\x71\x19\x4e\xcd\x32\x3f\xc5\x02\xe8\x23\x86\x10\x9e\x7a\xec"
- "\x8c\x05\xa2\xdf\xb0\x16\xfd\x1e\x8c\x98\xc7\x6e\xa7\xef\x43\x88"
- "\xcd\xa3\x77\x3c\x0b\x92\x59\xcc\x08\xa0\x77\x41\x58\x1e\x3d\xbd"
- "\xff\xf1\x6f\x3c\x6b\xf6\xa3\x3f\xf1\x6f\xaa\xda\x1d\xd8\xf8\x7f"
- "\x52\x03\x31\xe2\x1d\x11\x8b\xf4\xa6\x76\x97\x4e\xcd\x52\xde\x5f"
- "\x84\xec\x9b\x44\x57\xed\x46\x7b\xd1\x1f\x93\x1e\x7d\x1c\xef\x12"
- "\x96\xe3\x04\xde\x23\xf0\xfe\x19\x95\x63\x70\xed\xdc\x54\x3e\xfe"
- "\x65\x65\x55\x7a\xd9\x0f\x6e\xe4\x36\x78\x2b\xc4\x1c\x97\x7f\x63"
- "\x79\xda\x95\xf7\x21\x7d\xf4\xfd\xf2\x28\xa6\xbc\x51\x26\x7a\xf1"
- "\x8e\x46\x3c\xab\xf8\xad\xe7\xcf\xa0\x8f\xc7\xfa\xe7\xd1\xbb\x54"
- "\xc4\x92\xae\x9b\x59\xef\x93\xef\x93\xf9\x3b\x1d\x94\x03\xf5\xf3"
- "\x64\x5f\x5b\x22\xf2\x7d\x74\x36\xb6\xc3\x2e\x75\xbe\xa1\xe4\xe1"
- "\x92\x1e\xb5\x85\x8b\x1b\x9c\x2c\x1e\x0d\xbb\xfe\x6b\x4a\xa2\x9f"
- "\x0d\x92\x97\x2b\x6c\xdf\x32\x7e\x4e\x79\x46\xbd\xdf\x11\xe8\xb5"
- "\xc4\x7e\x51\x78\x62\x90\xfd\x92\xc7\xc2\x8e\x7f\xfd\xd1\x6f\x14"
- "\x67\x8c\xbe\x0e\xfc\x55\x73\xca\x69\xae\x93\xfa\x5a\xcd\x89\x3e"
- "\xa0\xfe\xd6\x7b\x2f\xba\xa4\x5e\xec\x33\x0e\x47\x7b\x9c\xe1\xf9"
- "\x9c\x6d\x39\x8e\x7d\xd4\x95\x96\xd8\xcd\x2f\x42\x8a\xef\x94\x29"
- "\xea\xc7\xe8\x83\x7a\xd0\x1f\xf4\x9c\xb2\xc6\x36\xe7\x79\x21\x50"
- "\x3d\xa7\xdc\xe9\x6b\x84\x5a\xa4\x23\xff\x4b\xe5\x3d\x7b\xca\x32"
- "\xbc\x74\x09\xf0\x77\x1b\x8e\x05\xef\xa3\xff\x9d\x76\xcf\x90\xb5"
- "\xe8\x73\xd0\x67\x70\x3f\xfc\x1d\x7c\x70\xcf\x2b\xb7\x66\x4f\x9f"
- "\xcd\xbc\xcd\x6d\x7f\x80\xa2\x26\x30\x16\x2d\x87\x18\xe2\xef\xf4"
- "\x35\x09\xbf\xfc\x0c\xfa\x65\x7c\xae\x51\xf9\x65\x3e\xa7\x1e\xe4"
- "\x97\xa9\xff\xdd\xdc\xde\x01\xc3\x3d\x30\x6c\x86\x27\xd6\xbb\xce"
- "\xc3\x02\xd4\x1f\xa7\xf7\x28\x48\x33\x5c\xf1\xd1\x6f\x61\xbf\xa3"
- "\x77\xa9\xf0\xcf\xd5\xb2\x7f\x7e\xeb\xe4\xc5\xfb\xe7\xb7\xec\xe8"
- "\x9f\xb1\xbf\xf7\x26\xf9\x66\xf4\xcb\xbb\x8e\xb9\x25\x1f\xfa\xe2"
- "\xc1\xe9\x76\x7a\x5c\x38\xdd\xce\xc0\xf6\x93\x74\x4a\xd8\x69\xaa"
- "\xf7\xd1\x3b\xfe\x3f\xfb\x87\xbf\xde\x42\xed\x63\x0f\xb6\x8d\xef"
- "\xbd\xd8\x2a\x0d\xb7\xa1\x6e\xf3\x3e\x67\xbe\x7c\x4b\x2c\xeb\xb5"
- "\xc4\xf8\xcb\xde\x28\xf6\xf5\x9a\x0c\xbd\xbd\xa8\x5f\xf4\x17\xd8"
- "\x5e\x19\xdd\x6b\xac\x5c\x26\x81\x6b\xe7\x94\x07\x7e\x74\x4b\x39"
- "\xb6\x4d\xc9\x35\x27\x61\x22\xdb\xf4\xba\xdb\xb7\xe9\x75\x5f\xef"
- "\xa6\xd7\x3d\x88\xcb\xe1\xd8\x7f\x44\x9d\x9f\x75\x04\x36\x6d\x35"
- "\x06\x36\x6f\x6b\xf1\xc7\xbc\x51\xec\x8e\x79\xdd\x8b\xcf\x86\xc0"
- "\x1a\xc4\xc1\x6a\xc2\xc1\x17\x60\x9e\x41\xed\xf0\x8c\x07\x42\xe1"
- "\xe0\x4d\xfb\xe0\xda\xe2\xe9\x16\xc4\x41\x2b\xe2\xe0\xaf\x6a\x1c"
- "\x7c\x06\x3e\xbb\xdc\x46\x3f\x29\xb0\x80\x72\xe7\x63\x99\xbe\x76"
- "\xfa\x89\xdf\x86\xc6\x43\xdb\x85\xe1\xa1\xe7\x94\x16\x0f\x55\xdf"
- "\x11\x0f\xd8\xbe\x9a\x6a\x70\xdc\x74\xf6\x54\xa2\x54\x45\x78\xf8"
- "\x63\x3f\x1e\x3e\xf8\x1f\xb7\xd4\x3b\x68\x3c\x64\x84\x3d\xff\x2b"
- "\x34\x1e\xb6\x66\x5e\x24\x1e\x3a\xfa\xf1\xb0\x35\xcf\xb7\x69\x6b"
- "\x61\xef\xa6\xad\x05\xfd\x78\xf8\x96\xf0\x50\xde\x8f\x87\xad\x36"
- "\x7c\x2e\x19\x88\x87\xcc\xc7\xbf\x5f\x3c\x0c\x39\xfd\xaf\x81\x87"
- "\xc7\xc3\x8e\x7f\xc3\xe0\xe1\x22\xfd\x43\x62\xaa\x0a\x0f\xe8\x1f"
- "\xb6\xa2\x7f\xd8\xaa\xf2\x0f\x27\x10\x0f\x15\x2a\xff\xb0\x15\xfd"
- "\x43\x45\x08\xff\xf0\xc4\xfc\xef\x17\x0f\x97\x1d\xfd\xd7\xc0\xc3"
- "\xcc\xb4\xc1\xe1\xa1\xe2\x22\xfd\x43\x62\x65\x3f\x1e\x2a\xd0\x3f"
- "\x54\xa0\x7f\xa8\x50\xf9\x87\x23\x84\x07\x95\x7f\xa8\x40\xff\x50"
- "\x11\xc2\x3f\x64\xbd\xfc\xfd\xe2\xe1\xf2\x3f\xfc\x6b\xe0\xe1\xc9"
- "\xb0\xf3\xdf\x61\xf0\x70\xb1\xfe\xc1\xad\xc2\x03\xfa\x87\x0a\xf4"
- "\x0f\x15\x2a\xff\xf0\x19\xe2\x61\x9b\xca\x3f\x54\xa0\x7f\xd8\x16"
- "\xc2\x3f\x3c\xb5\xfe\xfb\xc5\xc3\x5d\xa5\xff\x1a\x78\x78\x3a\x67"
- "\x70\x78\xd8\x76\x91\xfe\x61\x74\x7a\x3f\x1e\xb6\xa1\x7f\xd8\x86"
- "\xfe\x61\x9b\xca\x3f\xac\x25\x3c\xa8\xfc\xc3\x36\xf4\x0f\xdb\x42"
- "\xf8\x07\xcb\x6b\xdf\x2f\x1e\x66\x3d\xf8\xaf\x81\x87\x67\x0a\xce"
- "\x87\x07\x05\x0b\x84\x0b\xc2\x42\x6f\x91\x05\x68\x9c\xf1\xde\x71"
- "\x81\x07\xc2\x01\xc7\x44\x97\x25\xd6\x8f\x58\xf0\xad\x41\x2c\xf4"
- "\x08\x2c\x90\x2c\x08\x0f\x34\xae\xa0\xf1\x04\x61\xc2\x8f\x63\x0a"
- "\x5f\x0c\x8e\x29\xd6\xeb\xe3\x08\x07\x3d\xd1\xe7\x19\x57\xf4\x00"
- "\x1f\xfb\xd1\x18\xef\xa4\xf4\xec\x9b\xa1\x70\xf0\xd6\x20\xe7\xf8"
- "\xfa\xc6\x97\x1a\x1c\x7c\xd1\x8f\x83\x67\xc2\x8c\x2b\x9e\x0a\x83"
- "\x03\xd7\x05\xe0\xe0\xe4\xc0\x71\xe6\xc5\xe2\xa0\x67\xa9\x8c\x03"
- "\x1a\x67\x06\xe4\x71\xe6\x02\x1c\x67\xc6\x0c\x16\x07\xb3\x0a\xbf"
- "\x1b\x0e\x2a\x32\x07\x87\x83\xc4\x4a\xea\x27\x08\x1c\x54\x14\xfa"
- "\x62\xb0\xaf\xa0\xc1\xc1\x39\xfa\x0b\x1a\x1c\xcc\x7e\xfb\xfb\xc5"
- "\x41\x50\x7f\xe1\x9f\x16\x07\x73\xc2\xee\xff\x1a\x40\xbd\x93\xbf"
- "\xa7\x79\x7b\xfa\x76\x63\xb8\x5b\xcc\x1b\xd1\x37\x1c\x5b\x96\x40"
- "\x02\xb5\x11\xfe\x95\x96\xd8\xb2\x93\x90\xb2\x71\x09\xe8\x7d\xf9"
- "\xa8\xff\x65\xa0\xef\x91\x00\x7a\xf2\xad\xb1\x07\xda\xdd\x62\x0e"
- "\xc9\xe6\x80\x5a\xa4\xef\x2d\x13\x73\x48\xfe\x2e\xcb\xf0\x8d\xa7"
- "\x81\xaf\x7b\x75\xcc\xfd\x09\xea\x76\xee\xda\x50\xba\xdd\x31\x08"
- "\x5f\xdf\xa3\xf6\xf5\x27\xb4\xba\x55\xfb\xf9\x2a\xbb\x6a\x0e\x69"
- "\x46\x98\x39\xa4\x0b\xd0\x29\x9f\xdb\x3f\x29\xfc\x7c\xdf\x1c\xd2"
- "\x45\xce\xf1\xf7\xa2\x8f\x7f\x4b\xd2\xfa\xf8\xef\xa6\xd3\x79\x96"
- "\x73\xcd\x3b\x92\x7d\x93\x5d\x2b\x36\xdd\xd7\xc6\x93\x1d\xa3\xbe"
- "\xcf\x96\xbd\x7e\x90\xb7\xf5\x6b\xfa\x6d\x9a\x6c\x99\xec\x9a\xec"
- "\x98\xb7\xf5\xb4\xcf\xef\x8f\x46\xd7\xd5\xa8\xe6\x8e\xfc\x31\xb2"
- "\x9f\x0f\xe1\xe3\x03\xe7\xf4\xf1\xd9\x21\xf5\xff\x8f\xe0\xe3\x09"
- "\x07\x8a\x7d\xff\xfd\xd9\xf6\xfc\xf0\xeb\xbf\x2e\x08\x07\x5b\xb3"
- "\xce\x8f\x83\xad\x99\x88\x03\x4f\x8d\x6a\xce\xc8\x1f\xb3\x15\xfd"
- "\xbc\x98\x33\x12\x38\xe8\x9f\x33\x0a\x04\xcf\x19\x69\x70\xb0\xe0"
- "\xd5\xef\x17\x07\x41\x73\x46\xff\xb4\x38\x78\xce\x7a\x91\x38\xb8"
- "\x00\x7f\xb0\x15\xfd\xc1\xad\xe9\x2a\x1c\xa0\x3f\xd8\x8a\xfe\x60"
- "\xab\xca\x1f\xf4\xcf\x15\x05\x82\xe7\x8a\x34\x38\xc8\xd9\xf4\xfd"
- "\xe2\x20\x68\xae\xe8\x9f\x16\x07\x0b\xf3\x2e\x0e\x07\x15\x17\xe0"
- "\x0f\x2a\xd0\x1f\xdc\x5a\x55\xa3\x9a\x23\xf2\xc7\xc8\xfd\xbe\x10"
- "\x7d\xbe\xc0\x39\xfb\x7c\xcf\x6f\xfb\x47\xed\xf3\xfd\x7d\xe3\xe0"
- "\x85\xb0\xef\x4a\x2f\x10\x07\x17\xe0\x0f\x2a\xc8\x1f\xb8\x55\x38"
- "\x40\x7f\x50\x81\xfe\xa0\x42\xe5\x0f\xfa\xe7\x86\x02\xc1\x73\x43"
- "\x1a\x1c\x58\xab\xbf\x5f\x1c\x04\xcd\x0d\xfd\xd3\xe2\x60\x51\xf1"
- "\xc5\xe1\x60\xdb\x05\xf8\x83\x6d\xe8\x0f\x6e\x4b\xab\x51\xcd\x09"
- "\xf9\x63\xb6\xa1\x3f\xd8\xa6\xf2\x07\xfd\x73\x42\x81\xe0\x39\x21"
- "\x0d\x0e\x5e\x7c\xf7\xfb\xc5\x41\xd0\x9c\xd0\x3f\x2d\x0e\x5e\x0a"
- "\xbb\xae\x42\xc1\x40\xdf\x1c\x00\xeb\xc7\x01\xd7\x7d\xbe\x25\xb6"
- "\x27\xfa\xf5\x83\xca\xf8\xbf\x6c\xc0\xf8\x7f\x74\x5d\xd8\x79\xa0"
- "\xa0\xf7\xcb\x7c\x6c\xb0\xf9\xf5\x16\x31\x4e\x78\xa3\x98\xf4\xff"
- "\xe3\xd5\x62\x9c\x68\x7e\x8a\xf4\x9f\x1b\x5a\xff\x83\x9d\x13\xcc"
- "\x41\xfd\xb7\x9f\x43\xff\x73\xc2\x8c\x13\x9e\xbd\x38\xfd\xd3\x7a"
- "\xc7\xde\x53\x97\x50\xff\xca\x9c\xe0\x11\x90\xde\xba\xa8\xf1\xe2"
- "\xe2\xb0\xfa\x0f\xb9\x9e\xa4\x5e\xac\x27\xa1\xb5\x24\xcd\x1d\x1d"
- "\xb0\xf1\x0c\x18\x87\xe7\x0a\x4c\xf0\x35\x25\x88\x89\xb2\xe3\x90"
- "\xe2\x13\x75\xeb\x5b\x53\x42\xfb\xa2\x0b\xbf\xe0\xe0\x6b\x4a\x94"
- "\xf9\x80\xbe\xf5\x24\x73\x69\x3d\xc9\x92\x8d\x17\x3d\x17\x40\xeb"
- "\x49\x0a\x50\xc7\x1e\xd4\xf1\xb7\xa4\xdf\x2f\x34\x76\xad\x99\x03"
- "\x08\xb7\x8e\xe4\x42\xe6\x75\xfe\x06\xeb\x48\xf8\x1c\xc0\x25\xb1"
- "\xe9\xa5\x61\xf7\x7f\x21\x3d\x92\x3e\x9d\x89\x3e\x3e\xaf\xab\xd8"
- "\xb8\xd3\xd6\x02\x1b\x7b\xc0\xa8\xcc\xff\x2b\x3a\x25\x7f\xcf\x10"
- "\x07\xec\x94\x25\x86\x74\xfa\xe3\x25\xe8\xe7\x97\xf6\xfb\xf9\xc0"
- "\xd0\x5b\xca\xab\x57\xa3\x7f\x5f\x0d\x13\xb9\x8c\x86\x6f\x6b\x11"
- "\xf3\x01\x6f\x14\x93\xbd\x93\x3d\xb3\x98\xad\x86\x5e\xd9\xde\x85"
- "\xbe\x9b\x80\xf4\xcc\xcf\xcf\x94\xf2\xd6\x92\xed\x91\xce\x87\xcb"
- "\x3a\xaf\x09\xa3\x73\xae\x6f\x9d\x91\xf6\xe2\xa0\xef\xcc\xfa\x74"
- "\xee\x7b\x45\x35\xff\xa3\xd6\xb9\x3c\xef\x13\x40\x5b\xbe\xa0\xf5"
- "\x43\x17\xa8\xf7\x4b\x36\xbf\x8f\x7a\xaf\x91\xf5\xde\x37\xbf\x7f"
- "\x51\x7a\x7f\x39\xfc\xf7\x2f\x1a\xbd\x6f\xcd\xbc\x04\x7a\xef\x18"
- "\xa8\x77\x1a\xff\x93\xde\xb7\x16\xd0\x38\x1f\xf5\x5e\xd2\x2b\xaf"
- "\x1b\x19\xa8\xf7\x65\xcb\xff\xf6\x7a\x1f\x72\xfa\x5f\x43\xef\xf9"
- "\x61\xf7\x3f\x0f\xd2\xfb\x25\xb0\xf7\xc4\xd4\x10\x7a\x97\xed\x7d"
- "\xab\x87\xc6\xf5\x2c\xa6\x42\xb6\xf7\x13\x21\xf4\x5e\xb0\xf8\x6f"
- "\xaf\xf7\xcb\x8e\xfe\x6b\xe8\x7d\x79\xd8\xf5\x1f\x5a\xbd\x57\x5c"
- "\x02\x7b\x4f\xac\x1c\xa8\xf7\x0a\xd9\xde\x2b\x0a\x68\x1c\x8f\x7a"
- "\x97\xed\xfd\x48\x08\xbd\xaf\x58\xf8\xb7\xd7\xfb\xe5\x7f\xf8\xd7"
- "\xd0\xfb\xca\xb0\xe7\xff\x06\xe9\xfd\x52\xd8\xbb\x3b\x84\xde\x65"
- "\x7b\xaf\xf0\xd0\xb8\x9d\xc5\x6c\x93\xed\xfd\xb3\x10\x7a\xb7\xcd"
- "\xf9\xdb\xeb\xfd\xae\xd2\x7f\x0d\xbd\xaf\x0a\xbb\xfe\x4f\xab\xf7"
- "\x6d\x97\xc0\xde\x47\xa7\x0f\xd4\xfb\x36\xd9\xde\xb7\x15\xd0\x38"
- "\x1d\xf5\x2e\xdb\xfb\xda\x10\x7a\x5f\xfd\xe4\xdf\x5e\xef\xb3\x1e"
- "\xfc\xd7\xd0\xfb\x9a\x31\xe7\x7b\x5f\xaf\xe8\x5e\x99\xb3\xe1\xef"
- "\x67\xb1\x7f\xaf\xe8\x9b\x70\x40\x3a\x27\x2c\xa8\x75\xce\xd7\xf0"
- "\x2c\x15\x6b\x78\xa8\xdf\xce\x70\x2c\xce\x86\xd2\xfa\x0d\x1c\x8f"
- "\xd3\xb8\x5d\xee\xc7\x33\x9d\x3e\x8e\xfa\xf2\xe1\xfb\xf1\x85\x53"
- "\x14\x7d\x7f\xd7\xb1\xdb\xf9\xf4\x1d\x3c\x26\xff\x7b\xd1\xb7\x7a"
- "\xfc\x76\x69\xf4\xbd\x36\xfe\xbb\xe9\xbb\x22\x73\x70\xfa\xae\xc8"
- "\x13\xfa\xe6\xeb\x34\x4a\xfa\xf5\x5d\x51\x20\xf4\x5d\x61\x0b\xdf"
- "\x9e\xaf\xbb\xf3\x6f\xaf\x6f\xed\x9c\xfc\x3f\xaf\xbe\x8b\xc2\x9e"
- "\xff\x41\x73\x30\xa4\x6b\xd2\xfb\x96\x17\x21\xe1\xc7\x2f\x8a\xb9"
- "\x15\xdf\x29\x13\xf9\x7c\x3d\xe9\x9f\xbe\xf1\x19\x8e\x18\xf8\x9d"
- "\xc5\x0d\x3d\xdd\x16\xa0\x6f\x79\x68\xdd\x45\xb3\xd5\x05\x4e\xdb"
- "\x6f\x61\xe3\x32\x30\x1e\xc8\x3e\x0d\x33\xea\x59\xaf\xb3\xcd\x41"
- "\xdf\x78\xeb\x1d\xab\x7f\x0b\x6c\x69\x62\xd4\x5c\x0f\x48\x27\xa5"
- "\xa2\x06\x5a\xb7\x31\xce\x83\x32\xa1\xef\x7d\x50\xe7\x1b\x4f\x02"
- "\x7c\x51\x00\x60\x7e\x9e\x74\x5d\x3c\x6a\xc8\xf2\x10\xdf\xf9\x0c"
- "\x66\x5e\x46\x3d\xf7\x1a\x42\xd7\x3b\xa4\x4b\xb3\x36\x43\x59\x97"
- "\xa1\x99\x97\xb9\xd8\xef\x2f\x2f\xd9\xda\x8c\xe2\xb0\x7b\x39\xd1"
- "\x7a\x1b\xd2\x27\xd9\xb4\x6f\xb3\x98\x97\x71\xda\x1a\x81\xd6\xd5"
- "\x90\x0d\xfb\xbb\x4c\x86\x35\x05\x68\xeb\xad\xc2\xd6\x7f\x7c\x1a"
- "\x69\xb3\x0f\x03\xe1\x43\xe8\xb6\x57\xe8\xf6\x34\xe9\xf6\x30\xb0"
- "\xfc\xc4\xa8\x93\xd2\xfa\x2a\xd2\x2f\xe9\xb5\xe8\x10\x18\xe7\xd1"
- "\xbe\x28\xe4\xe3\xd1\xbf\xa3\x9e\x93\x6b\x5f\x84\x89\x64\xff\xfe"
- "\x4d\xaf\x7b\x7c\x9b\xc4\x1a\x0d\xf2\xfb\xbd\xd1\x3b\xbc\xa5\xcb"
- "\x64\xfd\x3f\x4b\xfa\xb7\x87\xd4\xff\x8e\xef\x3a\xf7\x2e\xeb\xff"
- "\x3b\x7f\xd7\xf3\xbf\x65\xef\x4b\x2f\x95\xbd\xdb\xc3\xee\x89\xa2"
- "\xc5\x81\x98\xa7\x19\x1c\x0e\xba\x43\xe0\xe0\x95\x9d\x03\x71\xb0"
- "\x35\x0f\x71\xd0\xa1\xc5\xc1\xd6\x02\x81\x83\xad\x36\x8c\x2f\x19"
- "\x88\x83\x0d\xa3\xbf\x1f\x1c\x5c\xe0\xf7\x3c\xff\xf0\x38\x78\x55"
- "\x7f\x81\x38\xf8\x0e\xfe\xe0\x54\x08\x1c\xbc\xba\x2b\x04\x0e\xd0"
- "\x1f\x24\xa6\x06\xe1\x40\xf6\x07\x5b\xd1\x1f\x54\x84\xf0\x07\x3f"
- "\x9a\xf0\xfd\xe0\xe0\x02\xbf\xe3\xf9\x87\xc7\xc1\xbf\x87\x6d\xff"
- "\xb5\x38\xa8\xf8\x0e\xfe\xe0\xab\x10\x38\xf8\xf7\x3d\x03\x71\x80"
- "\x7d\x41\xec\x07\x6a\x71\x50\x21\xfb\x83\x0a\x1b\xf5\x0f\x07\xe2"
- "\xa0\xe4\x9e\xef\x07\x07\x17\xf8\xfd\xce\x3f\x3c\x0e\x36\x86\xfd"
- "\xfe\x37\x08\x07\xdf\xc1\x1f\x7c\x1e\x02\x07\x1b\xf7\x85\xc0\x01"
- "\xf9\x03\x77\x10\x0e\x64\x7f\x50\x81\xfe\x60\x5b\x08\x7f\x50\xfa"
- "\xc0\xf7\x83\x83\x0b\xfc\x6e\xe7\x1f\x1e\x07\x3f\x0e\x3b\xfe\xd3"
- "\xe2\x60\xdb\x77\xf0\x07\x45\x21\x70\xf0\xe3\x86\x81\x38\xd8\x86"
- "\xfe\x60\x74\xba\x16\x07\xdb\x64\x7f\xb0\x0d\xfd\xc1\xb6\x10\xfe"
- "\xa0\x6c\xea\xf7\x83\x83\x0b\xfc\x5e\xe7\x1f\x1e\x07\x9b\xc2\x7e"
- "\xff\xad\xc6\x41\x6f\xdf\x78\x61\x2f\xc7\x41\xe9\x6a\x81\x83\xb5"
- "\x84\x83\x0e\xb1\x7e\xa7\x4c\xc6\x41\xdf\x58\xa1\x3d\x18\x03\x9b"
- "\x1a\xfb\x30\xf0\x4d\xff\x58\xa1\x17\xf5\xcd\xe7\x83\xe4\x71\x82"
- "\x32\x0f\xc4\xc7\x09\x38\x4e\x2c\x3d\x2d\xeb\x9f\xcf\x09\x6c\x0e"
- "\xad\xff\x41\x8c\x13\x35\x6b\x34\x82\xf5\xff\x77\xfe\x9d\xce\x80"
- "\x79\x81\x43\x17\xbb\x36\x63\xcb\x05\xea\x5f\xe9\x17\x5c\xa8\xfe"
- "\xbf\x0a\xa1\xff\x2d\x21\xf4\x5f\x91\x27\xf4\x9f\x58\xa9\xf4\x07"
- "\x94\x79\x21\xde\x1f\x18\xa0\xff\xf2\xef\x49\xff\x7f\x9f\xdf\xe7"
- "\x5c\x7a\xfd\xbf\x16\x56\xff\x7e\xb4\x81\x6a\x29\xb0\xbb\x5c\x0a"
- "\xec\xc5\xcb\x81\x57\x23\x86\x0d\xc1\xb0\x16\x4a\x53\x2e\xc7\xf9"
- "\x4b\x81\xf6\x4e\x72\xc4\xea\xb2\x49\xde\x44\x33\x54\xa1\x89\x5d"
- "\x0f\xa9\x58\x37\x41\x27\x41\x31\x86\x3b\x62\xd6\xa7\x0e\x45\xfa"
- "\x46\x56\xfa\x68\x05\x86\x0d\x23\x5a\xb6\x5e\x6f\xe2\xf4\x3a\xbe"
- "\x77\xa6\x4c\xaf\xa3\xbd\xb2\x1c\x44\x8b\x74\x06\x99\x8e\xb7\x5b"
- "\x4c\x92\xa0\x76\x60\xd9\x22\x65\x1a\xda\xeb\xdf\xac\x2e\x63\x8c"
- "\x2e\x95\xf3\x92\xe9\xa2\xfc\xf6\x2f\xeb\x89\xd6\xbf\x5e\x9f\xa0"
- "\xa6\x63\x0f\x02\xf1\x55\xe8\x2e\x93\xf9\x25\x6a\xea\x7b\x03\x40"
- "\xcc\x7a\x33\xe7\x17\xd3\x29\x81\x5c\x3e\xc4\xc4\x54\x2b\xa7\xd7"
- "\xe9\xc7\x68\xe8\x87\x82\xba\x1e\x31\x6c\xe8\x98\x12\x99\x2e\x29"
- "\x20\x01\x3f\x73\x10\xc3\xf5\x6a\x59\xcb\xb4\xc3\x15\x39\xd2\x9e"
- "\x4e\xea\xfa\xfa\xb1\xfe\xd5\xa2\x8c\xb1\xfe\x1f\xdd\x56\x29\xd7"
- "\x25\x59\x9d\x2f\xd1\x61\xba\x09\xb2\x4e\x8c\x58\x8f\x94\x3e\x7e"
- "\x65\x0b\xea\x15\x3a\xc4\xec\xd5\xa8\x23\x87\xd3\x0a\x20\xd7\xfb"
- "\x72\x56\xfa\x58\xa2\x5c\xf7\x54\xad\x1c\x75\x2e\x45\x8e\xa8\xbf"
- "\x36\xa4\x1d\x81\x34\x69\x0a\x5f\xbf\x9d\xef\xa3\x25\xea\x6d\xf7"
- "\x5d\x41\xb8\x68\xea\x00\xa8\x11\xf5\xb9\x42\xe6\x99\x2e\xea\x6c"
- "\x84\xea\x3e\x5d\xeb\x29\xce\x21\xd3\xc5\xf1\xfa\x44\x3d\xb3\xcf"
- "\xaf\xd3\x4f\x1b\x48\x6b\x50\xd3\x5e\x29\x68\xa7\xcf\x46\xda\xcc"
- "\x81\xb4\x46\x35\xed\x48\x41\x9b\x91\x8b\xb4\x59\x03\x69\x7d\x23"
- "\x54\xb4\x57\x09\xda\xc7\x0b\x91\xd6\x32\x90\xd6\xac\xa6\x35\x09"
- "\xda\x59\x0d\x48\x3b\x7b\x20\x6d\xaa\x9a\xf6\x6a\x41\x3b\xb3\x0c"
- "\x69\xb3\x07\xd2\x16\xab\x69\xaf\x11\xb4\x4f\x56\x21\x6d\x4e\x30"
- "\x6d\x2d\xc7\x01\xdc\x20\xe3\xe0\xdf\x04\xed\xd3\xbb\x90\xd6\x1a"
- "\xa2\x6e\x11\x9c\xaf\xa0\x8d\x17\xb4\x8f\x15\x23\x6d\x6e\x08\x5d"
- "\xa8\x69\xaf\x15\xb4\x2f\xb5\x20\x6d\x5e\x08\x5d\xa8\x69\xaf\x13"
- "\xb4\xf3\xea\x90\xb6\x20\x84\x2e\xd4\xb4\xd7\x0b\xda\xf9\xf5\x48"
- "\x6b\x0b\x21\xdf\x7e\xda\xa8\xe7\x76\x23\x4d\x21\xca\xa4\x25\x84"
- "\x6c\xd5\x3c\x47\x09\x9e\x0b\xf7\x22\x7d\x71\x08\xd9\xaa\x69\x6f"
- "\x10\xb4\x2f\x38\x90\x76\xc3\x40\x5a\xd0\x55\x0b\xf9\xde\x2e\xcb"
- "\xf7\x46\x41\xbf\xa8\x11\xe9\x4b\x42\xc8\x97\xe2\x1d\xb2\xad\x25"
- "\x08\xda\x39\x07\x90\xb6\x2c\x84\x7c\xd5\xb4\x37\x09\xda\x35\x05"
- "\x48\x5b\x1e\x42\xbe\x6a\xda\x9b\x05\xed\xd2\x9d\x48\x5b\x11\x42"
- "\xbe\x6a\xda\x5b\x04\xed\xcb\x84\x9d\xca\x10\xe5\xbd\x41\x45\x9b"
- "\x28\x68\xf3\x2b\x90\xb6\x2a\x84\x2e\xd4\xb4\xa3\x05\xed\xda\x1c"
- "\xa4\xad\x0b\xa1\x0f\x35\xed\xad\x82\x76\x39\x61\x7d\x67\x08\x7d"
- "\xa8\x69\x6f\x63\x51\x2b\x37\xc8\x7e\xb1\x3e\x98\x16\x75\x2f\x7c"
- "\xa2\x1d\xc6\xb0\xa8\x55\x85\xf8\x9b\xe8\x76\x11\x5d\x1f\x3f\xbb"
- "\xef\x0e\xf2\x37\xb2\x0f\x1b\xcb\xa2\x16\xb7\xc8\xfc\x76\x0f\xc8"
- "\xdb\xae\x57\xd3\x8e\x63\x51\x9b\x72\x65\xda\x3d\x03\x69\x0d\x6a"
- "\xda\xf1\x2c\x6a\x7d\x8a\x4c\xbb\x77\x20\xad\xb1\x8f\x96\x45\xbd"
- "\x92\x86\x34\xfb\x6a\x64\xdf\xa8\x2a\xe7\xed\x2a\x7e\x13\x58\xd4"
- "\xab\xd3\x64\x7e\x8e\x81\xfc\xcc\x6a\xda\xdb\x59\xd4\x16\xa5\x9c"
- "\x0d\x03\x69\x53\xd5\xb4\x77\xb0\xa8\x7f\xcf\x92\x69\x1b\x07\xd2"
- "\x16\xab\x69\x27\xb2\xa8\x8d\xb3\x65\xda\x03\x03\x64\x4f\x76\x60"
- "\xc7\xbe\x80\xf0\x49\x77\xb2\xa8\x1f\xe7\xc8\xb4\x9a\x7e\x80\xaa"
- "\x1d\xbe\x4b\xe8\xbd\x28\x0b\xf5\xce\xf7\xeb\x45\x9f\xdf\x1a\xaa"
- "\x8f\x91\x77\x2b\x5c\x76\x5c\x7a\xcb\x24\xda\x24\xe5\xdc\xab\x1d"
- "\xdc\x2f\x06\xaa\xe6\xec\xce\xf0\x30\x9f\x3a\x6c\x8b\xc4\x5a\xc6"
- "\x7b\x40\xcf\xcf\x52\x89\xd9\xd1\xea\xc2\x70\xf7\xb5\x73\x5a\xba"
- "\x4b\xdf\x4a\x70\xe9\x6e\x6e\xa4\x7d\xfc\xf0\x77\x92\x0b\x5e\xd4"
- "\xd3\xef\x2d\x76\xe6\xa5\xfd\x2b\xfd\x9b\x17\xe4\x39\x03\x9d\xd8"
- "\x97\x63\x5e\xe4\xe1\xc5\xbe\x5c\x84\x19\xc7\x95\x45\x36\xd6\xe3"
- "\xb4\x75\xc2\x31\xe9\xad\xe5\x6c\xa9\x35\x05\xcb\x50\x8e\xf9\xe5"
- "\x1c\xc5\x67\x5e\x06\xec\x03\x61\x5b\x59\xe6\x58\x46\xfb\x88\xbe"
- "\xf5\xae\x3b\xa6\xaa\x9c\xbd\x32\xab\x23\x6f\x1d\x5c\x8f\xe5\xe6"
- "\x98\xe6\x7b\x0c\x9e\xb2\xde\x17\x88\x59\x50\x46\x7b\x0f\xb2\xca"
- "\xea\x3c\xb1\x2f\xe1\x5b\xfc\x6c\x47\x2c\x43\x0b\x8b\x9f\x53\x17"
- "\xe8\xd9\x50\x4c\xe7\xaa\x39\xd6\x1d\x87\xa3\xaa\x38\xf7\xd5\xd5"
- "\x7c\xcf\x42\xac\x53\x9d\xbf\xe4\xd7\xde\x80\xe1\xd7\x1e\x56\xf2"
- "\x7b\x70\xe6\xba\x40\x9c\xf9\xb2\x63\x3e\x1b\xfe\x8c\x33\x50\xf2"
- "\xeb\x36\x56\xd2\xe2\x76\x7a\x7a\x78\xf8\x51\x69\xc7\x18\xea\x5f"
- "\x76\x19\x9a\x1a\x59\x49\xd3\x01\xc7\x35\x3d\xd0\x2e\xed\xe0\x7d"
- "\x00\x0a\x67\x1b\x7f\x0f\x24\x9f\xc0\xc6\x16\x77\x84\x09\xf4\x5d"
- "\x91\x4d\x8d\xdd\xa5\x3b\xa6\x29\x67\x8f\x28\x79\x11\x5f\x97\xcc"
- "\x2b\xcc\xba\x8f\x58\xb6\x69\x41\x3d\xa6\x2d\xc1\xfe\x62\x8e\x90"
- "\xf1\x8e\x0a\xcc\x21\x4b\xfe\x5d\xe7\xd2\x49\x63\xe4\xdf\xbb\x5c"
- "\xba\x6b\x13\xe5\xdf\x7b\x95\x3d\x1d\x43\xef\x31\xb9\xa0\x10\x65"
- "\x5b\x11\xd8\x61\x31\x50\x5f\x97\xfa\xef\x2c\x66\x41\xa1\xf9\x3a"
- "\x3a\xaf\xaf\x2a\x13\xf3\xac\x10\xfb\xfb\x57\x5d\x89\xf7\x58\xf9"
- "\xee\x96\xef\x8c\x68\x38\x6e\xe2\xe7\x9a\x59\xd9\x76\x2b\xc9\x76"
- "\x9d\x9f\x05\x90\xef\x5e\x94\x93\xd7\x69\xeb\x90\xe5\x57\xf5\x00"
- "\xef\xf7\x93\xee\x50\xbf\x2c\xb2\xc5\xcb\xf3\xda\x54\x55\xae\x2e"
- "\x17\xd2\x40\xd2\x84\xdb\xef\x98\x78\xe7\x5d\x77\x27\xdf\x33\x7f"
- "\xc1\x73\x39\x0b\x9f\x7f\xc1\xba\xe8\xc5\x97\x72\x17\x2f\x59\x9a"
- "\xf7\xf2\xb2\xfc\x82\xe5\x2b\x56\xda\x56\xad\x26\xba\xbe\x3a\xec"
- "\x48\xd3\x79\x24\xc0\x7c\x1e\xa4\x7c\xf8\xb9\xd7\x14\x26\xf4\x5f"
- "\xb5\x53\x6f\x0e\xdd\xb7\x76\x22\xe2\xe9\x0c\x99\x4e\xa9\x5a\x47"
- "\xe7\xd9\x20\xce\x74\xce\xaa\x47\x1c\x74\xc6\x58\xbb\x54\xe5\x69"
- "\x76\x3f\xe2\xa0\x33\xee\xf6\x9b\x3a\x20\xe1\x06\x3a\x87\xac\xca"
- "\x45\xf1\xb5\x37\x03\x34\x60\xda\x50\x3c\x6f\x30\x82\x69\xeb\x48"
- "\xe6\xae\x18\xc9\x3a\x89\x7f\xc5\x76\xd6\xe1\x5e\x63\x85\xcd\xf8"
- "\x8c\x58\x37\x1e\x93\xaa\x3f\xdd\x1f\xcf\xcf\x6a\x8a\xaf\xd9\xce"
- "\xda\x37\x8c\x64\xed\xaf\x6c\x67\x9d\xb5\x23\x99\x2b\xa1\x02\xa2"
- "\xbb\x4b\xab\xad\x2e\xa9\xca\xc1\xed\x06\xe3\x03\x51\x55\xd9\x5b"
- "\x30\x6e\xbc\x0f\x22\x6a\xf1\x19\xc3\x3c\xfb\xcd\xa2\xdc\x1f\x9f"
- "\xf6\x0e\x41\x7e\xd3\x58\x6f\xae\x6e\x33\xe6\x23\xf4\x54\x7d\xa8"
- "\x01\x5b\x72\xcc\xcf\xed\xf4\x1e\x45\xec\x55\xb7\xd6\x9e\xe1\xf9"
- "\xc5\x3a\x2b\x3b\x81\xf8\x7d\xb4\xcc\x3b\x24\xff\x1a\xe6\x43\xda"
- "\xbd\x81\x35\xb9\x3a\xa4\xa9\x40\xde\x1e\x75\x7d\x12\x9f\x5f\x5c"
- "\x60\x5e\xb2\x3c\x37\x77\x74\x14\x24\xf2\xbb\xe6\x7c\xbc\x02\xda"
- "\x63\x76\xeb\x76\xd6\x80\xf5\x74\x60\x7d\x1b\x9b\xb0\x07\x8f\x98"
- "\x01\xac\x53\xf9\x31\xa9\x66\x2c\x86\xef\xc3\xdf\xfb\xb0\xec\x8d"
- "\xe2\x4c\xb5\x8f\x9f\x61\xa5\xd5\xed\x58\xce\x46\x3a\x67\x83\xf6"
- "\xa4\xed\x5a\x99\xa5\xc3\x7a\x57\x20\x5d\xa3\xf9\x1a\xb8\x09\xd3"
- "\x7d\x8a\xe5\xd8\x89\xbf\x89\x7e\x3e\xe9\x11\xe9\x1b\x44\xbd\x3e"
- "\x9e\x4a\xcf\x28\x2b\x47\xf5\x48\x56\xd6\x5d\x5a\x53\x4e\x7b\x6d"
- "\xf3\x33\x89\xf0\x19\xe5\xd2\x88\xb4\xe5\x5d\x45\x59\x3a\x1c\x0b"
- "\xea\x6a\xfb\x79\x66\x53\x99\xa8\x1c\x34\xbe\xfc\x1d\xf6\xe0\x02"
- "\xbd\x16\x18\xeb\x05\xdd\xef\xda\x01\xaa\xb6\xb3\x3a\xbc\xaa\xf0"
- "\xaa\xfc\x2d\xc6\xfd\x06\xaf\x46\x0c\x3f\x80\xf7\xdf\xe2\xfd\x37"
- "\x78\xe1\xf8\xd4\x44\xe5\xce\x2f\x64\x1d\xe3\x2b\xe1\x46\xe2\x8f"
- "\xd8\x7a\xfa\xa8\xf4\xd1\x6e\x2a\x3b\xed\x65\xcf\xa2\x6a\x83\xf6"
- "\xff\xae\xab\x04\x8c\xc7\xfb\x2e\x71\x57\x5f\x75\x38\x02\x7f\x3b"
- "\x4e\xfc\x7e\x7b\x36\x3e\x6f\x90\x7f\xe3\xe8\xf6\xed\xc2\xf3\x5f"
- "\xc1\xfc\xc2\x5d\x6f\x77\x5c\x38\xed\x85\x5c\x1f\x27\x5c\x18\xdd"
- "\x3b\x75\x20\xbd\xeb\x05\xe9\xa7\x49\xda\xf0\x9f\x1a\x44\xd8\xfb"
- "\x07\xc5\xf3\xfb\x2e\x71\xff\x20\x1a\x2f\x94\xd3\x2e\xe4\xbf\x2b"
- "\x5d\x84\xed\xca\xc2\x7b\x15\x5e\xf5\xda\xfc\x3f\xc6\xf4\x1f\xa7"
- "\x90\x3e\x7b\xe9\x7c\x37\xd4\xa5\x4b\xaa\xf1\x90\x8e\xb6\x08\x6c"
- "\xe9\x02\x8c\x87\xb9\x11\x5b\x55\xfd\xf8\xa9\xfb\x93\x16\x3f\x75"
- "\x2d\x41\xf8\x29\x27\x7f\x84\xe9\x52\x6a\x05\x5e\xf6\x75\xad\xc9"
- "\xc1\xe7\xba\x83\xc8\x67\x1f\xcd\x7b\x1c\x93\xde\xe6\x63\xa6\x2d"
- "\xc7\x71\xec\x69\x05\xbe\xef\x6d\xa7\xf4\xf6\x4d\x84\x59\xca\x5b"
- "\xce\x57\x94\x05\xcb\x87\x61\x75\x54\xbe\xa5\xc8\x17\x9f\x77\x22"
- "\x5d\x9d\x13\x4e\x2b\x65\xe3\x69\x4a\x5f\x44\x3c\xca\xe5\x25\x9e"
- "\x94\x8e\xf5\xd7\xcb\x4d\x69\xe4\xbc\x0f\x61\x38\x8d\x55\xe9\x9b"
- "\xa6\x08\xa7\xcf\x05\x84\x49\xba\x3b\x7d\x49\x68\x4b\xe9\x10\xe8"
- "\xb6\xc0\x78\x13\x24\xa1\xbd\x45\x1e\x95\xde\xde\x37\xae\x10\x92"
- "\x88\x1f\xf9\x75\x97\xf4\x76\x71\x2d\xd9\xa2\xe0\xf5\x7b\xaa\x07"
- "\xf1\xff\x6d\x1e\xf0\x7c\x6a\xa8\x3c\x18\xaf\xca\xb7\x82\xc6\xa2"
- "\x5b\x56\x8b\xba\x62\x5e\x3b\x31\xfd\x6e\xaa\x3b\xc9\x13\xe3\xf7"
- "\x1e\x93\x7e\x62\xa2\x38\x7e\x1e\x90\xa8\xcf\x4e\x3a\x33\x82\xe4"
- "\x41\xf4\x74\x66\xa3\xd8\xfb\xbb\x66\x32\x97\x1b\xa6\x27\x7d\x30"
- "\xcc\x83\x78\x14\xf9\x98\x8f\xa1\x3f\x7a\x67\xb5\x17\xfb\x16\xef"
- "\xbc\xa6\xd5\xcf\x4f\xf2\xd4\xfa\xc1\x74\xbb\x31\x7d\x03\xc3\x3a"
- "\x92\x3f\xc1\x3c\x63\xe9\x9c\x38\x0c\x2b\x0f\x94\x22\x8f\x15\x5e"
- "\x3e\x57\x83\x7c\xd6\x63\x59\xca\x89\x0f\x96\xa7\x41\xe6\xb5\xef"
- "\x57\x85\x5a\x5d\xcb\xfc\x76\x92\xce\xb9\x3d\xaf\xe6\x75\x42\xdf"
- "\xf5\xce\xe3\x35\x22\x6e\x2f\xd2\xec\x65\xbd\xe9\x40\x67\x30\x88"
- "\xb6\x84\xc7\xed\x29\x3a\xcb\xf5\xdb\x20\xfc\xda\x3b\x2f\xe7\xaf"
- "\x65\x1d\xfd\xe5\x7e\x27\x51\x39\xc7\x42\x2e\xf7\x1e\xca\x8f\xad"
- "\x9c\xcd\xdb\x56\xca\x83\xd2\xcb\xfc\xf4\xc4\x4f\x91\xd5\x38\x2c"
- "\x87\x90\xd7\x4f\x92\x31\x7c\x27\x61\x91\xcb\x0d\xfd\x68\x57\x11"
- "\x61\xf1\x9d\x31\x98\x7e\xdf\x66\x7a\x5e\x49\xcf\x3f\x71\x70\x1f"
- "\xdb\x17\xff\x93\x02\x8a\x77\xe2\x58\x7f\xcb\x4b\x88\xa5\x00\xc0"
- "\x8d\x71\x90\xe4\xb1\xf3\xba\xed\xf2\xac\x49\xd3\xed\xf7\x01\x50"
- "\x39\x51\x46\x7b\xb1\xac\x07\xd1\xf7\xf3\xb3\xfa\xd0\x5f\xef\x61"
- "\xef\x58\x80\xca\x8c\xfe\x4c\x2e\xdf\xce\x29\xb2\xee\xf7\x50\x1d"
- "\x49\x9e\xe3\x84\xef\xc3\xb8\x77\xbf\xa1\xb2\xf7\xd7\x7b\xa7\x59"
- "\x2d\x63\x5e\x6f\xd4\x03\xe9\x8b\xf4\xd2\xcf\xf3\x1d\xc2\x7e\x39"
- "\xf2\xda\x25\x9e\x05\x36\x48\xd6\xe5\x23\xd9\x01\xa2\xef\xa7\x7d"
- "\xf7\x19\x8a\x5b\x87\x79\x8f\xcf\xc3\x36\x1d\xed\x82\xce\x22\x41"
- "\xbe\xbb\xe8\x3c\x4e\xe4\x41\x67\x6c\xa2\xce\xdf\xfd\x90\xf0\x88"
- "\xcf\x07\xe4\x72\xef\xc2\xf6\x7c\x0c\x5e\x29\xfd\xf6\xff\x6e\xb5"
- "\x16\x5f\x3b\x83\xed\x9f\xf4\x5d\x1e\x28\x4a\x07\x8e\x87\x65\x60"
- "\x3e\x29\xbd\x7b\x8f\xdc\x76\xc8\xba\x7e\x77\xd3\x7e\xb4\x97\x7e"
- "\x1e\xef\xc6\x05\xe9\x7a\x2f\xc7\xe3\xca\x69\x3a\xaa\x33\xa6\xdd"
- "\x2b\xf8\xec\xe4\x75\xe6\x78\xb2\x73\x0c\x1c\x60\x2b\xb1\x9e\x7d"
- "\x38\xd8\x99\x27\xeb\xf9\x40\x90\x4c\x14\xdf\xb5\x8f\xce\x8c\x23"
- "\x9f\x84\xfd\xdc\xfb\xba\x7b\xfb\xfd\x12\xe9\x3e\xc0\x75\xff\xae"
- "\xa9\x56\xb4\xb7\xb2\xdf\xda\x29\xe2\x47\x6a\x30\x4c\x75\x9a\xce"
- "\xf1\x4b\x65\x29\x9a\x4d\x65\xd9\xcb\xcb\x51\x64\x06\x8c\x6b\xa0"
- "\xfc\x91\x57\xa6\x6c\xaf\x0a\xaf\x04\xe2\xf5\x0a\xfa\x2a\x2a\x13"
- "\xe6\xbd\x9b\xfb\xbf\x87\xa9\x6c\x3f\xbd\x49\x2e\x7b\xa3\xd7\x4e"
- "\x69\xdf\x36\x9d\x95\x78\xda\x46\xa4\x2b\xf3\x8a\x73\x65\xa2\x30"
- "\x7d\x3d\xed\xe5\x7f\x4c\x7a\x7f\x03\xf9\x68\x7a\x8f\x84\xbf\x17"
- "\xd3\x37\x9f\xe8\x53\xf4\xc8\xcf\x40\x18\x55\x70\xd1\x29\xbd\x3f"
- "\x87\xc6\x0c\x28\xeb\x5d\xd8\x47\xaa\x27\x79\x13\x96\xb1\x8f\x34"
- "\xb1\xbb\xf4\xa7\x65\x0a\x6e\x31\x9f\x2a\x92\xbd\xd0\xcf\x4f\x7f"
- "\x8f\x38\xde\xdb\x8f\xad\x9f\xfe\x5e\x96\x63\x3d\xca\xd1\x80\xf9"
- "\x3d\x2e\xd7\xab\x1e\xe9\xb1\x2f\xf6\xfe\x03\x72\xd9\xe5\x33\xeb"
- "\x7e\x7a\x42\xd1\x83\x6c\xab\x07\x36\x93\xff\xe5\x3a\xf8\xd9\x06"
- "\x39\xed\x4e\x91\xd7\xcf\x5e\x55\x68\xa9\x8f\x28\xce\x8b\xfa\xd9"
- "\xab\xe4\x07\xc7\xa3\xee\xb9\xef\xe3\x67\xd5\x8a\x30\xb2\x1d\x91"
- "\xc7\xfb\x63\x39\x0e\xb1\xdf\xd3\x8f\xa3\x9f\xcd\x0e\xf2\x4f\xe4"
- "\x8b\xcb\x9b\x91\x07\xf9\x53\xc2\x12\xf9\x54\x1a\xb3\x20\xbf\x89"
- "\xb2\xfd\xc8\x65\xfe\xd9\x6f\xb4\x58\x79\xff\x6a\xc4\xca\x58\x15"
- "\xef\xbd\xa1\xda\xb9\x5a\xe1\x03\xab\x44\x9a\xfa\x48\xb9\x6e\xbb"
- "\x44\xdd\xe4\x67\x92\xdb\x3a\x92\xdb\x7b\x4d\x2a\x39\xa2\xdc\xde"
- "\xbb\x47\xa6\xdf\x4b\xbe\xbc\xdf\x5e\xeb\x97\x2b\xb6\x3c\xd0\x5f"
- "\xbc\x37\x9a\xec\xa1\xbf\x5c\xf5\x99\x41\xfe\x62\x6f\x68\x7f\x51"
- "\x6f\x96\xeb\x5b\x17\x64\x1b\x3b\x45\xd9\xe5\xb6\x05\xf5\xd0\x8c"
- "\x63\x32\x71\x36\x52\xcd\x64\xf2\x9f\x94\xb7\xba\x0d\xaa\x11\x72"
- "\x95\x6d\xf9\xbd\x2b\x07\xea\xa1\xbe\x5d\x6d\xcf\xa4\x6b\xf2\x09"
- "\xc4\x83\x74\xca\xfb\x95\x18\x26\xf4\x5a\x4f\xfd\xdb\x72\xb5\x8f"
- "\x46\xda\x8a\x00\x23\x7b\xa9\xef\xd0\xda\x62\x7d\x96\x6c\x8b\x4a"
- "\xde\xff\x89\x3a\x4a\xea\xcf\xf7\xbd\xd9\x41\xf9\x92\x6e\x1a\x48"
- "\x0e\xa2\x8e\xef\xbd\xab\xb4\x69\x44\x8f\x69\x6d\x98\xa6\x3c\xa8"
- "\x7d\x2c\xa7\xf2\x61\x5e\x06\xee\xb3\xb6\x73\x5f\x61\xeb\xe6\xe5"
- "\x79\xaf\xa2\x56\x6e\x27\x30\x2c\x49\x0e\xcb\x96\xdb\x12\x05\x37"
- "\x43\x82\xca\xe4\x0e\xdd\x3f\xaa\x37\x28\xfd\x23\xce\x8b\xfb\xa2"
- "\xf7\x3c\x72\xfd\x28\x6c\xac\x08\xfb\xd9\x3e\x0a\xdb\x2c\xe4\x50"
- "\xc1\x78\x7b\xf5\xb3\x6c\xb9\xbd\x22\xfb\x92\x5c\xd2\x4f\x5b\xc8"
- "\xc6\xe8\xd9\x25\xbd\x9f\x4e\xfc\x9d\xc5\x3d\x34\x86\xa8\xc4\xb8"
- "\x5c\xf2\x07\xe4\x2f\x68\x6d\x2a\xbf\xcf\xe0\xf7\x6d\xe4\x77\xa8"
- "\x1f\x42\xf1\x48\x37\x9b\x7c\x11\x86\xbf\x67\x7e\x14\xfb\x05\x7f"
- "\x31\x20\xdf\xf7\xcb\xe4\xb4\x9f\xf1\xbe\xc2\x5f\xd2\x23\x94\x30"
- "\x25\x1d\xda\xfa\x62\x4a\x47\xe9\x15\xff\x45\xbe\xcb\x47\xbe\x89"
- "\xe7\xf7\x81\x4e\xc6\x38\x1f\x37\x28\xfd\xa2\x5e\x49\x45\x4b\x67"
- "\xca\x70\x9f\xf6\xc1\x34\xe1\xcf\x3e\x98\x4c\x69\xb9\xfe\xd0\x57"
- "\xae\x3b\xcb\xbe\xae\x5d\x06\xfa\x9a\xd3\xbc\x8f\x95\x22\xca\xf9"
- "\x41\xa5\xa8\xc7\x07\xf3\x79\x3d\x84\x4f\x2d\x17\x65\xa9\x49\xa9"
- "\xe9\xe1\x71\x6b\xa9\x2e\x14\xb7\x45\x15\xc7\x7a\x13\x29\xee\x4d"
- "\x5e\xae\xa0\x74\x81\x5e\xeb\x00\xfa\x5a\x71\x26\x30\xe1\x41\xf6"
- "\xbd\xbb\x4c\x72\x39\xff\xa8\xf8\x5d\x94\x4b\x0e\xf9\x5e\x1e\xf7"
- "\xbc\x4c\x33\x43\xbe\x73\xff\xbe\x6b\x88\x90\xab\x49\x92\xe5\x9d"
- "\x2b\xea\xb1\xeb\x6a\x3e\xce\xfe\x8b\x05\x65\xfb\x81\x4f\x91\xad"
- "\xfa\x37\xd9\x0f\xe6\x6f\xa4\x67\x8e\xfb\x42\x3e\x86\xad\x22\x1a"
- "\x2a\x93\x68\x23\xde\xf7\x04\xf7\xa9\x8f\x49\x1f\xbd\x46\xed\x92"
- "\xe8\xab\x7e\xf4\xb2\x3c\x07\x04\x8e\x65\x3f\xc1\x76\x61\xd7\x3e"
- "\xc5\xc7\xb0\xee\x74\x1c\xf3\x1f\xa5\x32\xf2\xf3\x30\xe8\x9c\x10"
- "\x35\x0d\xf9\xa7\x8f\x7b\x5c\x32\xcf\x5d\x95\x8a\xdf\x20\x5f\xd2"
- "\xec\x39\x2a\xf7\xe9\x3e\x4c\xaf\x91\x7d\xc9\x49\xe9\xc3\xa9\xda"
- "\x7e\xd8\x87\x53\xb5\x3e\xe3\xa3\x39\xc1\x3e\x03\xfb\xcd\x1b\xba"
- "\x4b\x3f\x8c\xd7\xf4\x03\x30\xec\xdc\xbe\x63\x97\x9b\x6c\x94\xce"
- "\x89\xe3\xfe\x89\xcf\x6b\x7d\xf8\x89\x52\x66\xf2\x9b\x5d\x6b\x94"
- "\xf9\x8b\x8f\xa6\x53\x5f\x2d\x28\xbf\x32\x8d\xef\xa4\xfc\x14\x7e"
- "\x7a\xa0\x73\xc6\x50\x0e\x34\xe7\xf2\xe1\x6c\xd9\xcf\xd7\x69\x7c"
- "\xa5\xdc\x86\x91\x9f\xd4\xb6\x55\x35\x93\xb5\x6d\xd5\x47\xf7\x0c"
- "\xf4\x91\x1f\x19\x2e\xbc\xad\xfa\xd0\x45\x7e\x4b\xf1\x91\x5a\x5f"
- "\xf0\x51\x74\x8d\xa6\x2f\xfb\x61\x85\xd2\x97\xed\xf7\xa3\x1f\x26"
- "\x90\x8f\xc2\xfc\xf7\xca\x79\x6f\x70\x49\x55\x25\x4a\xde\x2e\xd4"
- "\x73\xb3\x19\xb1\x59\x5a\xed\xc6\xdf\x56\xb9\x0f\xc8\x6d\xb3\x87"
- "\x9f\x49\xf4\x01\x9d\xe1\x14\x45\x38\x73\x2c\x39\x0d\xed\xfd\x6d"
- "\x45\x43\xd7\x52\x45\xbe\x1f\x5f\xa9\xee\x17\x56\x6f\x67\x25\x98"
- "\x4f\xa7\xba\x8e\x9b\x30\x6c\x8b\x3c\x87\xc0\x65\xcb\x79\x7d\xe4"
- "\xa8\xdd\xae\xad\x9b\xa8\xc7\x47\x1e\xaa\x07\x8d\x89\x30\xff\x3d"
- "\xd4\xef\xc1\x3e\x1f\xfe\xfe\x69\x72\x6d\x1f\xe6\xeb\xca\xce\xda"
- "\xd5\xfd\xab\x9a\x0a\xf2\x95\xf2\xd8\xb3\x11\xfb\x3b\x9a\x39\xb1"
- "\xe9\x0f\x65\x9a\xf3\x96\x2d\x5a\x52\xf0\xfc\xed\xe6\x45\x4b\x16"
- "\x15\x2c\x9a\x9f\xbb\x68\xf5\xfc\x82\x45\x4b\x97\x8c\x59\x3c\xff"
- "\x85\x45\xcf\x99\x57\xce\xcf\x37\x27\xd9\x6e\xb2\x45\x41\x3f\xe9"
- "\x24\xf3\xfc\xfc\xfc\xe5\x8b\x17\xe6\x98\x97\x2c\x7a\x6e\xec\xb2"
- "\x85\xf9\x0b\x0b\xcc\xf3\x97\x2d\x5d\xbe\x24\xc7\x7c\x53\xce\xb8"
- "\x9b\x92\xee\xca\x89\x52\xcf\xa1\xdd\x60\x84\xce\xc0\x99\x6f\x3a"
- "\xb6\x9c\x01\x43\xac\x2e\x6f\x59\xac\x6d\xd1\x12\x31\x6f\xb7\x7b"
- "\xce\xf8\x0a\xc8\xa3\x73\xe2\xe9\xcc\x63\x56\xfa\x71\x1e\xde\xf5"
- "\x44\x87\xf5\x34\xd3\x39\xf1\x58\xf6\xf8\xee\xd2\xdd\x66\x97\xb4"
- "\xc7\xc0\xcf\x33\xc6\x70\xac\x5b\x3c\x3b\xf3\x9b\x0e\xec\xb3\xe5"
- "\xd1\x3b\xf3\xda\x33\x10\x57\xbe\x02\xf4\x78\x45\xe3\x65\xa4\x73"
- "\xe4\x31\x4d\x96\x4b\xfa\x24\x4f\x9c\xfb\xb2\xdb\xe3\x8e\x6c\x6e"
- "\x61\x25\xcd\x2d\x42\x2f\xbb\xff\xaa\xcc\x35\x67\xbc\x0a\x19\x84"
- "\xcf\xa3\xd2\x6e\x37\xd7\x15\x62\x99\xe6\x6c\xbb\x7e\xf9\x60\x2a"
- "\xf6\x07\xdb\x68\xce\x15\xe3\xfe\xea\x91\x20\x1a\xcb\xa5\xdf\x5f"
- "\x98\x04\x5b\x31\xaf\x7c\x13\x63\x98\xc7\x5e\x65\x3e\x0d\xeb\x60"
- "\xc4\xba\xb4\xca\xf5\xd8\xc1\xeb\xb1\x9d\x25\x54\x8c\xc0\xf2\xbd"
- "\xce\xcb\xd3\xae\xd4\x01\xcb\xdd\x8a\x65\x4a\xc7\x72\x1a\xa9\x5c"
- "\xa1\xe6\xfa\x68\xbe\xeb\x98\xf4\xc9\xd8\xc0\x0a\x94\xdb\x75\xe2"
- "\x9c\xbb\x2d\x35\xc2\xfe\xb0\x5e\x39\xb5\xf8\x7b\xf3\x69\x88\xde"
- "\x44\x67\x94\xdb\xaf\x67\x4d\x1e\x1f\x38\xad\xad\x10\xbb\x8a\xb9"
- "\xd9\xff\xf3\x4d\x87\xa8\xd3\x27\x16\xf2\x0d\xbf\x78\xb1\x55\x4f"
- "\x75\xc2\xb6\x22\xba\xf6\x74\xd8\xb9\x45\xfd\xd6\x91\xcc\xc3\x76"
- "\xa8\xfb\x5c\x9f\xfc\x8a\x64\x42\xfd\xad\x2e\x3b\x9d\x6b\xfd\x49"
- "\x3d\xe6\x0d\x72\xdf\xd8\xc3\x7a\x67\xab\xfa\x52\x9f\x10\xce\x3c"
- "\x61\x78\x1b\x14\xde\x74\xf6\x39\xa5\x11\xfa\xff\xf9\x58\x4c\xe3"
- "\xee\xe7\xff\x73\x43\x30\x7f\xe2\x89\xbf\xdd\x4a\x3e\x62\x1c\xfe"
- "\x09\xf5\x09\xdc\x88\x65\x77\x98\xfc\x12\x5e\xdf\xce\x0e\x3a\x31"
- "\x7c\xcb\x59\xd0\x23\xed\xc1\xda\xed\x9c\xbf\xd5\x25\x7d\xcc\xcf"
- "\x12\x7f\x65\x24\xc0\x06\xa4\xe9\x2a\xfd\x04\x3c\xfc\x1c\xf2\x9f"
- "\xa3\xfd\x57\x0f\x98\xcb\x96\xf1\x3c\x29\x08\xcf\xa9\xaf\x53\x9f"
- "\xb0\x02\xf9\x23\x86\xb6\x7c\x0b\x34\xd6\x3e\x30\xae\x02\x12\x29"
- "\x1f\xfc\xdd\x42\xf3\x21\xc8\xb3\x55\xc9\x8f\x21\xfe\x37\x07\xc4"
- "\x1c\x8c\x8c\xad\x31\x34\x7f\x5d\x64\x63\x6c\x3f\xfa\x77\x2a\x23"
- "\x61\xac\xbb\xf4\x17\xd1\x0a\xa6\x10\xeb\x07\x39\xae\xe2\x20\x91"
- "\x95\xfe\xbc\xbc\x76\x04\xd2\x21\xae\x6a\x10\x4f\x84\x2b\xa4\x4d"
- "\x56\x30\x85\x58\x6b\x21\x3a\x2c\x43\xd4\xee\xd5\xa9\x7a\xf2\x91"
- "\xed\xd2\x2f\x3e\x24\x8c\xb1\x37\x1e\x6b\x65\x57\xcd\x6a\x15\x7a"
- "\xfa\xc5\x87\x4e\xaf\xd0\x41\xbf\xdc\x7f\x51\xac\x92\x7b\x0b\xe2"
- "\x38\x8a\xe4\x2c\xe6\xaa\x7f\xf1\x21\x96\xad\x85\xf7\xc5\xd7\xa2"
- "\x0e\x78\x5b\xf5\x8b\x5c\x4a\x2f\xcb\xf0\x40\xbf\x0c\x7f\xd1\x18"
- "\x4a\x86\x41\xb2\xd3\x8b\xb3\xce\x7f\x71\x90\x6c\x05\xd3\xf8\x94"
- "\xf3\xcb\x43\xe9\x12\xf3\xd0\xeb\x2b\xc0\x40\x79\x34\xc4\x11\xfd"
- "\x9e\x31\x4a\x1e\x5b\x50\xd6\xee\x22\xeb\x39\xf1\xdc\x50\x07\x40"
- "\x73\xe2\x94\x3e\x21\x8e\xe4\xbb\x27\xb7\x3f\x3d\xf3\x04\xa7\xbf"
- "\xe9\x39\x4d\x59\xf9\xc5\x4a\xf7\x14\x6f\x1d\x81\x38\xe2\xe5\xdd"
- "\xb3\xeb\x5c\xe5\x4d\x30\x8b\x76\xd2\x71\x03\xe1\x7b\xcf\x9f\x9c"
- "\xd8\x33\xa0\x30\xf9\xf9\x60\x17\xb6\x3d\xc1\xf3\xfb\xe1\xdf\x37"
- "\x7c\x7a\x93\xf6\x7d\xc3\xa7\x71\xe1\xde\x37\x68\xf3\xfd\x74\x3e"
- "\xe5\x1b\xa8\xcd\xd2\xf5\xe7\xfd\xe9\xb4\x40\x88\xbc\x95\xf4\xe3"
- "\xea\xd4\xe3\x99\x4f\x3f\xa1\x32\x34\x63\x3b\xc5\xfe\x2d\x4b\xc7"
- "\x90\x4f\x03\x6f\xc3\x3f\xdd\x2d\xfa\x2f\xd4\x2f\xfa\xb4\x9c\x68"
- "\x82\xeb\xd1\xf7\x67\x88\x23\xdf\x01\x67\xf9\xc3\x90\x87\xc1\x48"
- "\xf7\xeb\x13\x95\x68\x49\x43\x0c\x2c\xc4\x43\x34\x80\x99\xd3\x33"
- "\xfc\x13\x41\xf2\xb3\x9b\x3f\xe8\xfb\xe8\xfb\xe2\x2f\xe2\x2f\x52"
- "\x94\x97\xf3\xf3\x82\x4e\xce\x2f\x5d\x45\x91\x76\x8e\xd4\x0c\x94"
- "\x24\xa1\xfe\xa8\x97\x59\x9c\x35\x04\xf9\x59\x39\x31\x63\x3e\x99"
- "\xbf\xf2\xcc\xd4\xcf\x14\xa2\x7d\xc6\xbf\x88\xd9\xaa\x0c\xae\x8f"
- "\xc8\xe1\xcb\x9f\x6e\xac\xeb\x0b\x92\xea\x8c\xea\x2c\x8d\x50\x3c"
- "\x84\xff\x88\xa5\x7f\xbc\xc8\x2f\x11\xe3\xcd\x25\x7d\x04\x57\x78"
- "\xd6\xab\xc8\x7f\x27\x8a\x3f\xaa\xf5\x1c\x75\x1c\xec\xdf\x75\xaa"
- "\xdf\xd7\x8b\xdb\xa8\xca\x4b\xc8\xff\xdc\x7f\xe6\x96\x48\xe5\x67"
- "\x3f\x3c\x6e\x30\x87\x22\xed\x97\xff\x0d\xc5\x4a\x90\x1a\xa1\xfd"
- "\xf1\x37\xf9\xb4\xcf\xb7\xec\xd5\x3e\xdf\x6a\xb8\x04\x25\x07\x07"
- "\xfd\x53\xe4\xba\x1c\x75\x76\xb0\x2f\x30\x36\xc8\x64\x62\xcb\x83"
- "\x4c\xa8\xff\x4f\x2e\x4d\x04\x96\x67\xb6\x2a\x58\x1f\x9a\xfa\x6f"
- "\xf3\x77\xcd\x7a\xd9\x20\xae\x77\x1b\x07\x44\xde\x1f\x14\x46\xcf"
- "\x43\xcd\x72\xd8\x84\x5f\x0d\xa0\xe7\x61\x66\xd5\xb3\x2e\x15\xff"
- "\xa9\x43\xcf\x3a\xe6\x52\x94\xf5\x87\xbf\x7f\xc1\x3f\x1d\xd9\xc7"
- "\x0f\x7f\x7f\xa3\x3f\x26\x5a\x71\xf4\x44\xfc\x46\xff\xb1\x3e\x47"
- "\xc9\xe4\x08\x26\x07\x30\xf9\xc7\x25\x69\xc7\x7f\xf8\xfb\xe1\xef"
- "\x87\xbf\x1f\xfe\x7e\xf8\xfb\xe1\xef\x87\xbf\x7f\x82\x3f\x1d\x1f"
- "\x47\x30\xf9\x4f\xf9\x2d\xe2\x68\x08\xf4\x42\x26\x0f\x93\x74\xd0"
- "\x4f\x81\xc3\xed\x3b\x41\x67\x80\xa1\xfa\x4b\xd7\xcb\x33\xf7\x15"
- "\xe8\x02\x13\xd0\x77\x3f\x13\xf0\xba\x03\xaf\x7f\x53\x85\xdf\x70"
- "\xa9\x4a\x74\xd1\x7f\x3a\x14\x60\x04\x8e\x0b\x87\xc0\x50\x18\x06"
- "\x06\x88\x84\x28\xb8\x0c\xa2\x21\x06\x86\xe3\x78\xd3\x08\x97\xc3"
- "\x08\xb8\x02\xe2\xe0\x4a\x18\x09\x57\x81\x09\xae\x86\x6b\xb0\x26"
- "\xf1\x70\x2d\x8e\xed\xaf\x47\x81\x8c\x0a\x5d\x97\x62\x48\x35\xe1"
- "\x3f\xf8\x7f\x26\xa4\xf2\xe7\xec\x1f\xc2\xbf\xd7\x70\x87\x1c\xde"
- "\x22\x87\xbb\x7e\x08\xff\x5e\xc3\xcd\xff\xcb\xf7\x51\xff\xab\x77"
- "\x1d\xba\x6c\xe1\xb5\x75\x21\x7d\x65\x70\xa8\x4e\xfe\xeb\x7b\x86"
- "\xf3\xa4\x1f\xc0\x4f\x9b\x3e\xf8\x2f\x15\xaf\x89\xe2\x67\x11\x80"
- "\x98\xe7\x65\xea\x3f\x5f\xb8\x94\xca\xdf\xba\x7d\x78\x35\xe2\x75"
- "\x10\xaf\xff\x83\xd7\xff\xc5\xeb\x84\xc2\x47\xd0\xd0\xd4\xdf\x5f"
- "\xf0\xfa\xb2\x1e\xa0\xcd\x85\x57\x1a\xc0\x91\x42\x80\xff\x31\x02"
- "\x7c\x8d\x6d\xd4\x57\xbb\x01\x8e\xba\xfb\x79\x9e\xda\xd0\x5f\xba"
- "\x13\x62\x65\x37\xd7\xdf\x69\xda\xc7\x05\x91\xe4\x57\x68\xf7\x4e"
- "\xc9\x4a\x37\x4f\x18\x37\x71\xdc\x9d\x49\xe6\xb1\x99\x63\xcd\xb7"
- "\x27\x4d\x48\x1a\x9f\x34\x71\xfc\x84\xbb\xcc\x13\xee\x98\x74\x47"
- "\xd2\xa4\xa4\xbb\xcd\x8b\x57\x2d\x5b\x34\x21\xe9\x85\x85\xe6\xe7"
- "\x17\x2d\x5b\xbc\x72\xfe\xb2\x85\xe7\xab\xd1\x77\xfa\xa3\xe2\x5d"
- "\x1b\x00\xae\x01\xad\xb4\xaf\x07\xe9\x97\xd8\x1c\x37\xb7\x42\x5f"
- "\x8c\xae\x5c\x9e\x43\x4d\x94\x2f\xed\x9f\xee\xa5\x14\xd0\x59\x13"
- "\x40\xf7\xdc\x6c\xd0\xcd\x31\x81\xee\x49\x0b\xe8\x4a\x0f\x80\xee"
- "\xdf\xab\x40\x67\xdf\x07\xba\xc2\x6c\xd0\x15\x94\x0c\x0c\xab\x18"
- "\x23\xc2\x3e\xc1\xb4\xbb\xf0\x7a\x77\x17\xe8\xaa\x2b\x45\xd8\xbe"
- "\x32\xd0\xfd\x87\xed\x6f\x52\xf7\xef\xfe\x77\xa1\xfd\x85\x01\x7f"
- "\x2e\x8e\x29\x6a\xa5\xbb\xd2\x42\x4c\x8a\xfe\xf0\xf7\xc3\xdf\x0f"
- "\x7f\x3f\xfc\xfd\xf0\xf7\xc3\xdf\x0f\x7f\x7f\xe7\x7f\x6e\x1d\x4c"
- "\x3c\x2d\xe9\xe1\xbf\xb0\x57\xd4\x6d\x37\xc4\xbb\x74\xf1\x7c\x5d"
- "\x10\xd0\xb7\x52\x60\xe0\x7b\x9e\xd0\xa5\x5a\x7b\x12\xfd\x50\x35"
- "\x00\x7d\xeb\xb9\x75\x3b\x73\xd3\x77\x9c\x69\xef\x02\x34\x24\x00"
- "\xd0\xba\x16\xe4\x31\xdb\x05\x2f\x47\x8b\xb5\x4c\xcc\x43\xf1\xb4"
- "\x1e\x0a\xc3\x0b\x30\x7c\x43\xb8\xf5\x29\xca\x5a\x2c\xe2\x99\x36"
- "\x8a\x97\x65\x67\x10\x1f\xe2\xb1\x17\xc3\x7c\xe7\xe0\x11\xad\x94"
- "\xcb\x23\x81\x8e\xf8\x75\xd9\xc1\xe4\xb1\x3b\xae\xc4\xb4\x1e\xac"
- "\x4f\xa2\xbc\x96\xa8\x93\xd9\x21\xa2\xc1\xe6\xa3\x6f\x4a\x75\xc7"
- "\x20\xea\x6d\xbc\x4b\x78\xdf\x06\x62\xed\x27\xa5\x4b\x20\x1e\x98"
- "\x56\xd7\x6d\x8f\x4c\xea\x4b\x8b\xbc\xf9\x77\xe1\x10\xb5\xc8\x23"
- "\x39\x24\x41\x6b\x8c\x94\x69\x25\xa4\x9d\xad\xd0\x8a\x38\x69\xaa"
- "\x1c\x77\x19\xc6\xd9\xb4\x71\xfa\xd7\xe5\xb8\x68\x8c\xab\x08\x2a"
- "\x9f\xde\xd9\xe3\x83\x63\x10\xb9\x0b\xcb\x62\xa6\x6f\x98\x28\x8d"
- "\x4c\x7f\x39\xd2\x37\x68\x79\x01\xc8\x71\x23\x30\xce\xa5\x8d\xfb"
- "\x65\x92\x1c\x77\x15\xc6\xf9\xb4\x71\x3a\x25\x9d\xa9\xdb\x1e\x65"
- "\x0a\x51\x4f\xca\x5f\x27\xf2\xa6\x3a\x44\xa5\x20\x4d\x31\xd1\x64"
- "\x99\x8b\x81\x74\x45\x71\xfb\xeb\xfa\xf2\x27\x9a\x6c\x85\x8f\x0b"
- "\xd3\xab\x64\x8a\xb2\x8c\x2a\x54\xd2\xa7\x99\x89\x07\x70\x19\x12"
- "\x1f\x17\x44\xa6\x13\x1f\x7a\xc6\xdf\xf1\x54\x6f\xf9\xb7\x99\xea"
- "\xa7\x5d\xd3\xa3\x47\xb6\x43\xb0\x23\x3a\x14\xaf\x61\x06\x05\x03"
- "\xf9\x26\x16\x28\xba\x9a\xd6\x71\x1d\x4a\x0d\xd8\x19\x38\x6d\x5e"
- "\x30\x5f\x03\x45\x47\xe1\x32\x13\xad\x0b\xda\xbc\x1a\x0c\x45\x79"
- "\xcc\x4b\xdf\xde\x37\xbb\x3b\xa1\xc8\xcd\x3a\x68\xdf\xa5\x75\xdf"
- "\x82\x81\xf6\x4f\x5a\xf7\x32\x98\x1a\x0a\xff\x14\x72\x2d\x52\x80"
- "\xf6\x49\x8e\xa7\xb4\xed\xd0\x5c\xd5\x0e\x45\x55\xda\xb4\x45\xd7"
- "\x82\xa9\x89\xf6\x70\xb2\x43\x2c\x95\xa3\xc1\xec\x03\x5f\xd4\xa1"
- "\xd4\xc2\x37\x41\x5f\x34\x0a\xa4\xa6\x1c\x87\x52\x16\x17\x95\x65"
- "\xc3\x71\x30\xbc\xf3\x3c\x62\xe8\x38\x95\xf7\xeb\xd4\x8f\x57\x7b"
- "\xa5\xfd\xa6\x69\xb0\xdf\xd4\x06\x0d\xa6\xc9\xd0\x60\x4b\x83\xcd"
- "\xc7\x21\x7a\xbf\x37\x05\x1a\xf4\x0f\xa3\x8d\xa5\x81\xb3\x13\x7f"
- "\x9b\xfd\x48\xe3\xe1\xdf\x7d\x1c\x83\xcb\x5a\x2a\x5e\x04\x83\x4b"
- "\xf0\x44\xf9\x5e\xd6\xa6\x7c\xc3\x40\xcf\xa1\xea\x91\x7f\x35\x98"
- "\xb0\x7c\x1d\x58\x96\x7b\x8e\x42\xf4\x95\x09\x26\x48\xc2\x32\x0f"
- "\x73\x56\xfa\x40\x5f\x08\x91\x61\x6c\x2b\x8e\x7f\xff\x8c\xd8\xac"
- "\xd9\xce\x3a\x08\xa3\x5d\x6b\x2c\x68\xa7\xd1\xd3\x30\xef\x4e\x79"
- "\x5d\x60\x67\xd1\xdb\xa0\xef\x5a\x69\xa1\xf5\xd0\xed\x18\x67\x55"
- "\xe2\xe8\xbb\x6e\xfa\x5e\x7b\x7c\x1c\x9d\xa1\x97\x0a\x9f\xf7\x74"
- "\xd0\x9a\xc3\x4e\x5a\x07\x4a\xfc\x62\x6d\x10\x81\xf5\x19\x82\xe5"
- "\xb9\xa7\x16\xc3\x6f\x44\x3a\x4c\x5f\xef\x82\x3d\x49\x7c\x9d\xe2"
- "\x55\xb3\x3c\x81\xab\x66\x7d\x1b\x78\x63\x56\x17\x7b\x63\xd6\x69"
- "\xff\x1b\xb3\xfe\x5a\xb4\x0a\x0c\xfe\xab\x66\xb9\x9b\xf3\xb8\x0e"
- "\x8c\xcd\x79\x27\x68\xfd\xa0\x61\xed\x09\x30\xce\x7d\x19\x75\xef"
- "\x3b\x02\x6b\x17\x81\x29\x10\xf9\x95\x97\xce\xda\x9b\x5b\x08\x2c"
- "\x10\xe9\x32\x84\xaa\x5f\x57\xd4\xd7\xc5\xc2\x86\x0c\x58\xa7\x18"
- "\xb3\x4b\x6a\x4d\xa6\x7c\xdd\x91\xdf\x14\xe3\xb5\x01\xaf\x12\xbc"
- "\xca\x58\xd4\xd7\x65\x28\xab\xa2\xe1\xeb\x75\x40\xdf\x2d\x8c\x0f"
- "\x80\xee\x38\xc4\xa4\xd0\xf9\x0e\x61\xe4\x16\x1f\x28\xed\x76\xdc"
- "\x52\x0c\xeb\xba\xbb\xad\xf4\xfd\xb8\x9b\xfc\x12\xf9\x29\xcc\xa7"
- "\x04\xf3\xb1\x71\x5b\xdc\xce\x3c\x2c\xaa\xdb\x81\xe1\x1d\x9e\x35"
- "\x56\x9d\x7b\x8d\x55\xea\x8a\xea\xde\x8f\x34\xbb\x90\x66\xb7\x2c"
- "\xc3\x0e\xe2\x85\x36\xe1\x8e\xf1\x41\x04\xf2\xcc\xfb\x8f\x33\xad"
- "\xfa\xea\xed\xac\x0d\xe9\x0e\xf6\xf1\x42\xde\xc8\x07\xe5\x1f\xd3"
- "\xa1\x84\xa1\xac\xdb\x37\x21\x1d\xa5\x77\x7a\x53\xc9\x7f\xbb\x9c"
- "\xb9\x1d\xb4\x6e\x37\x8a\xf5\x8a\xfc\x90\x86\xbe\xe9\x74\xc7\x78"
- "\x61\x68\xb7\x1d\x32\x89\x37\xa5\x73\x76\x76\x00\xa6\xdb\xcf\x8a"
- "\xac\xe8\xdf\x60\x46\x37\xb3\xea\xe8\x1b\xfe\xfd\x98\x5e\xe4\x3d"
- "\x3c\x53\x29\x23\xe5\xc1\xbf\xe1\xa7\x72\x22\x1e\xf6\xe7\x7a\x21"
- "\xa6\x12\x22\x30\xdd\x4c\xe2\x47\xbc\x10\x07\x2e\xac\xeb\xfe\xfd"
- "\xb9\x6e\x08\x30\x0d\x4f\x97\xcc\xaf\x4e\xc3\x0f\xc3\x19\xf2\x23"
- "\xfc\x35\x60\x9a\x98\x3a\xce\xef\x89\xff\x08\x10\x3f\x2f\xe8\xcd"
- "\xbc\xbc\x4f\x11\x0f\xbe\x27\x06\xf2\x74\xac\x78\x10\x3a\x21\xd6"
- "\xe0\x2e\xb2\x46\xf0\xf5\x82\x98\xfe\xe3\x75\x1d\x43\x58\x97\x25"
- "\x62\x38\x5f\x2b\xf8\x20\xd0\xbe\x0d\x9d\x30\xfc\x1b\xd6\x65\x8d"
- "\x88\xe9\x04\x3d\x95\x99\xbe\x1f\xa2\x72\xaa\x75\xf9\xc4\x94\xa7"
- "\x26\xc3\x53\x69\x53\xd3\x26\xc3\xf4\x07\x1e\x9a\x0c\x49\xf7\x8c"
- "\x4d\xba\xe3\xee\xe4\x3b\x20\xf3\xe9\x27\x26\x43\xe6\x8c\xc9\x30"
- "\x13\xaf\xcc\x99\x53\x9e\x48\x9b\x32\x73\x32\x58\x1e\x9e\x8a\x4f"
- "\x0f\x4d\x9e\x90\xf4\xc8\xd8\xcc\x87\xa6\x4e\x81\xc7\xb3\x6e\x4f"
- "\xba\xfd\x76\x78\x60\xca\xb4\x09\x49\x49\xf2\x7d\x42\x12\x91\x3c"
- "\x9b\x3c\x65\xe6\xd8\xcc\x65\x4b\x0b\x96\x8e\x9d\x31\xf5\x21\x0a"
- "\x81\x29\x53\x26\xd3\x8b\x03\x15\x7e\x12\xfd\x67\xfc\x24\x67\x0f"
- "\x3b\x95\x4e\xfb\x35\x40\x0d\xea\x1f\xaf\x4e\xfe\x1d\x08\x18\x0f"
- "\xd5\x90\xde\xb8\x7f\x8d\xa5\x36\x4b\xdf\x6d\x8f\x75\xa1\xfc\xdc"
- "\x24\x3f\xda\x33\xe1\x18\x8c\x7c\x17\xe3\x46\xcb\xed\xc7\x90\x6e"
- "\xbb\x11\xb4\xf1\x23\xd0\xbf\xc6\x8e\xa7\xef\x0a\x9c\x78\xa1\xcc"
- "\x3d\xe8\x07\x51\xb6\x6e\xe8\x2a\xb2\x0c\xe1\xdf\x75\xa2\xbe\x69"
- "\xbd\x2d\xa6\x4d\x51\xd9\x7b\x3b\xad\xcb\x35\xaf\x86\x88\x93\x60"
- "\xbc\xb2\xb9\x20\x95\xbe\xbd\x01\x67\x81\xcc\xe3\xdb\x3e\x1e\x51"
- "\xf2\xb7\xa1\xae\x1a\x5a\xf3\x2c\xf8\x6c\x50\xf9\x06\x17\xf1\xd9"
- "\x8c\x71\x32\xaf\x67\x9a\xd1\x47\xa0\x0f\x7f\x34\x50\x94\x08\x2c"
- "\xea\x50\x7a\xa0\x37\x91\xb7\x0b\x98\x6e\x9f\x82\x69\xcc\xdf\xd3"
- "\x80\x79\xb2\x77\xd2\x75\xb4\xfe\x94\xaf\x45\x85\xd8\xc6\x0a\x5a"
- "\xa3\x1d\xf5\x4d\x39\xff\xe6\x9a\x87\x5d\x6e\xf0\x97\xe2\x73\xe9"
- "\x37\xaf\xb1\x22\xf1\x2d\x35\x86\x45\xe2\x73\x39\xea\x3b\x02\xf1"
- "\x02\xfe\x53\x18\xbe\x04\x22\x30\xfc\x37\x28\xeb\x56\x4e\x7f\x8a"
- "\xa7\x1f\x86\x61\xef\x21\xbf\xd7\x02\x51\xdf\xbc\x8e\xf8\xa1\x30"
- "\xec\x2b\x5c\xbe\x09\xd3\x6f\x25\x9f\x27\xfc\xf0\xc8\x2f\x40\x7c"
- "\x67\xe2\x16\xfc\xe5\x67\xda\xa3\x62\x9d\x78\xde\x8f\x72\xd9\x8f"
- "\x2d\x57\x43\x21\xf5\x6f\x2e\xc7\xfa\xc7\x58\x44\x1b\x39\xb2\x81"
- "\x68\xe9\x9b\x78\x16\x7d\x97\x03\xf9\x56\x38\x56\x77\xf2\x7d\xff"
- "\x5c\x70\x79\x6a\xa0\xc8\x0a\xaa\xba\x8c\xa1\x72\x60\xb9\xf5\xdd"
- "\xbd\x56\x6c\x33\x2f\xe7\xfb\xb8\x61\xd8\x6b\x72\xd9\x88\x26\x9e"
- "\xca\x4f\x7e\x02\xf5\x3a\x11\x75\x1e\x89\xf9\x79\x82\x74\x6e\x24"
- "\x79\x60\x79\x5b\x03\x78\x47\x3e\x26\xb6\xd2\x8a\xe5\x02\x89\xe4"
- "\xe1\xea\xe7\xe1\x11\x98\x1a\x31\x31\x08\x53\x1b\x91\xf7\x64\x55"
- "\x7c\x56\x50\xfc\x62\x8c\x7f\x50\x8e\x47\x7b\x1d\x51\x10\x94\x7f"
- "\x39\xc6\x3f\x4c\x3a\x44\x7b\x8c\x70\x81\x71\x57\x0d\xf5\x27\xfb"
- "\xe9\x77\x06\xd1\x3b\x90\xfe\x51\x5a\x7f\x4f\x6d\x05\xd1\xd7\xca"
- "\xb8\x47\x7a\x03\xd2\x1f\x0c\xca\x7f\x3a\xd2\xcf\x54\x95\x2f\xa8"
- "\xfe\x57\xec\xc3\x78\x0b\xe1\x14\xef\x39\x48\x33\x8c\x7c\x00\xf9"
- "\x9f\xfd\xb9\xa4\x9f\x2b\x12\x82\xe8\xd3\x90\xee\x25\x92\x33\x97"
- "\x51\x17\xc9\xc8\xa8\xf4\x6d\xda\x44\x19\xae\xb0\x04\xa5\xb1\x61"
- "\x9a\x7c\x92\x2f\xc7\x59\x77\xc8\x34\x65\x41\x69\x76\x71\x9c\x8a"
- "\x7c\x64\x1d\x8b\x34\xb2\x6f\x53\xf3\xa0\xba\x61\x7f\xeb\x8a\x16"
- "\x2d\x8f\x2b\xb1\xcf\x16\xbb\x66\x93\xf0\x19\x97\x21\x26\x6e\xc7"
- "\xb0\x6a\xe4\xb9\x8d\x70\x84\x76\xe6\x71\xba\xbd\xe8\x7b\xd3\xa3"
- "\x05\x76\xe3\x26\xc4\x16\x02\xfd\x1e\x4b\xbf\x89\x37\xeb\x9d\x26"
- "\xdb\x53\xdc\x04\xbc\x53\xb8\xd8\x27\xd1\x46\x71\x8f\x05\x04\xcf"
- "\xb8\x27\xd1\xde\x25\x7c\xf6\xcb\x79\x6c\xa3\xef\x97\xb1\xfc\xaf"
- "\xa3\x5f\x07\xfa\x06\x1b\xc3\x27\x62\xf8\x26\x39\xfe\x55\xa2\xc7"
- "\xdf\x13\xe4\xdf\x3a\xc4\xd8\xeb\xb2\x9d\xa1\x4d\x5d\xb9\x96\xe7"
- "\x8d\x76\xa5\xa4\x0f\x08\xdc\x3f\x84\x71\x8b\xf0\x3e\x15\xef\x4f"
- "\xe2\xfd\x71\xbc\x4f\xa0\x3d\x27\x8a\xfc\xdc\xbe\xe8\xf9\x5a\xbc"
- "\x3f\x81\xf7\x48\xbc\xcf\xc4\xb2\x7d\x8b\x72\x2f\x77\x23\xa6\x83"
- "\x30\xd3\x89\x3a\x24\xbb\x1f\x26\x74\x18\xd7\x4e\x79\xfa\x15\x5f"
- "\x70\xaa\x3f\x4c\xf6\x0f\xb2\x3d\xc8\x61\xbd\xe9\x24\x97\x4c\xe4"
- "\xef\xa0\xfc\x99\xe0\x35\x44\xe8\x49\xd0\x04\x44\x3a\xbd\xd0\xb7"
- "\x1c\x26\xe8\x74\xea\x3c\xf1\x5e\xb1\xce\xc3\x18\xde\x8b\xf9\x7e"
- "\x15\x70\xe5\x06\x94\x89\x1e\x9f\xb3\x48\x4e\x9c\x9e\xf3\xbd\xc2"
- "\xad\xd2\x37\xf6\xef\xaf\x74\x04\xe9\x9b\x30\xbc\x89\xeb\x1b\x65"
- "\xa7\x94\x99\xca\x8f\x98\xa6\xb6\x72\xa8\x82\x1b\xc4\x77\x67\xbf"
- "\x8d\x8d\x34\x04\xd9\x4c\x02\xf2\x79\x8d\xf0\x31\x3c\x4f\xb6\xc9"
- "\x91\x7d\xf4\xd8\x6e\x8c\x4c\xd6\xd2\x1b\x11\xab\xc7\xb1\xbc\x57"
- "\xec\x92\x7d\x9d\x27\xa2\x90\x30\x3d\x12\xfb\xff\x4d\xed\xbc\xdf"
- "\x56\xfa\xcd\x76\xe2\xe3\x29\xe2\xfb\x01\x79\x22\xf2\xc8\x16\x47"
- "\x16\x2b\xf1\x3c\x2e\xd2\x9b\x4a\x65\x8f\xc8\xe5\x71\x55\x2e\x84"
- "\xa2\x12\x07\xe2\x3b\x33\x4f\x44\x01\x8f\xdb\xdb\xcf\xf7\x90\x55"
- "\xe6\x1b\x11\x72\x8f\xa7\x92\x43\x96\xb1\x00\xd2\xad\xc5\x30\xc4"
- "\xe9\x3b\x08\x19\x3e\xe6\x1f\x5b\x0c\x91\x4e\xdf\x2e\x18\x0d\x70"
- "\xb9\xd3\xd7\x06\xb7\x02\x8c\x72\xfa\x2a\xb0\x1f\xb0\x93\xe2\x3f"
- "\xbf\x05\x74\x3a\xbc\x17\xdd\x5c\x2c\xe9\x9c\xbe\x02\x48\x28\xd6"
- "\xe3\x3d\x17\x1e\x1e\xc2\xba\x9d\xbe\x69\x48\x97\x03\x19\x7e\x76"
- "\x2a\x6d\x08\xfb\x6a\x9e\x1f\x8c\xd3\x5e\x65\x45\x4e\x1f\xf6\xc9"
- "\x7d\x07\x30\x3c\xc0\x32\xfc\x67\xf1\xea\x66\x81\x92\x43\xd6\x0c"
- "\xff\x29\xf6\xd0\xab\x9f\xe3\xf3\x57\x8c\x49\xc0\x9c\xbe\x14\x68"
- "\xf6\x78\x90\xae\x88\xb1\x8d\x87\x2c\x73\xbf\x95\xa0\x97\xf6\x5f"
- "\xda\x78\xc8\x8a\x75\xb1\xf5\x62\x3d\xb0\x9d\x5b\xd9\xbb\x06\xef"
- "\xa5\x87\x56\xf0\xe7\x92\x43\x25\xcc\x70\xc8\x36\x0e\x07\x38\x54"
- "\x07\xa7\xaf\x1d\xe6\x61\x17\x3d\x63\x95\x9b\x51\xf9\x87\xaf\xa7"
- "\xf1\x4d\x0a\xed\xdd\x10\x9b\xb1\xaa\x88\x61\x9c\x81\x45\x1e\xb2"
- "\x39\x7d\x9d\x80\x79\x94\x20\xbf\x57\x39\xbf\x92\x43\xf5\x48\xeb"
- "\x26\x3a\x35\x1f\xe2\x41\xb4\x19\x7e\x88\x45\xfa\xfa\xde\xc8\x43"
- "\x95\x78\xed\xc5\xab\x03\xd3\xf6\x30\x7b\xdc\xaf\xe8\xfb\x5b\x56"
- "\x72\xd8\xc0\xa2\x0e\x9b\xbc\xb4\x57\x14\xc9\xd2\x0f\xc3\xd8\xc6"
- "\xc3\xa8\x67\x48\x43\x7c\x62\x79\x0f\x27\xf3\xf2\x96\x1e\xbe\xdb"
- "\xcb\xeb\x71\xf8\x2e\x51\x8f\xc3\x77\x52\x78\x17\x62\x07\x7f\x5b"
- "\xba\x44\xdc\xd3\x98\x2e\x8b\xa7\x2b\x39\x6c\x61\x86\xc3\x56\x2f"
- "\xda\x1d\xca\xb5\x98\xe4\x88\x72\x2d\x26\x59\x22\x7f\x8b\xd3\x56"
- "\x06\x2c\xf2\xb0\xb5\x37\xf2\xb0\x0d\xd3\x97\xf6\xf2\xbe\xc0\xe1"
- "\x4a\xaf\xe0\xfd\x06\xf2\x99\x8d\xb8\x8e\x40\x1e\x95\xc8\xab\xbe"
- "\xd7\x6e\x86\x8c\x55\xcc\x9b\xe1\x5b\xef\x9b\xb7\x0a\x22\xc6\x40"
- "\x31\x96\xf7\x33\x94\x51\x0e\xd6\xb3\x01\xef\x69\x18\x0f\x57\x60"
- "\x5e\x9f\x23\xdf\x4a\xca\x0f\xf3\xa9\x47\x9e\xef\x22\xaf\x1c\x2a"
- "\xd3\x59\x3b\x18\xf1\x79\xef\x59\x51\xbe\xd6\x40\xc9\x61\x6f\xc0"
- "\x70\xb8\x43\xc1\x10\xe1\x47\xc8\xad\x02\x66\x78\x98\xcf\xe9\xab"
- "\x06\xc4\x98\xb1\xd9\xd3\x46\xf1\x38\x06\xd9\x85\x7a\x26\x4c\x15"
- "\xe0\x7d\x27\x10\x7e\x9a\xf3\x5e\x25\xda\xcf\x09\x43\x33\xf2\x3c"
- "\xeb\xc7\x42\x9e\x0e\x9f\x8b\xe6\xf9\x0c\x30\x37\x4f\x5f\xec\x2f"
- "\x39\xdc\xd8\x9c\x47\x7a\x39\x88\x69\x28\x5d\x2e\xc4\xea\xb0\x1f"
- "\xae\x63\xbe\x58\x9b\x5b\x1f\x63\x2d\x62\xcd\x9e\x69\x48\x9b\x07"
- "\x54\x1f\xc2\x11\xd1\x4f\xef\x64\x2e\xbf\xe1\x4b\x1b\xd5\x8d\x0d"
- "\x2f\x86\xa6\xce\x3b\x81\xc6\x42\x4d\x9d\x3b\x09\xa7\x01\x66\xf8"
- "\x32\x1d\x31\xda\x3b\xbd\xb3\x78\xc8\xdc\x6f\x41\x87\x61\xfe\x26"
- "\xeb\x2e\x8c\x6f\x40\xba\x03\x1c\xb7\x33\xbe\xf5\xc5\xfa\x0c\x87"
- "\xf7\xfa\x4a\xbe\xb4\xcc\xf8\xb6\x97\x35\x59\x2b\x60\x4e\x67\x31"
- "\xca\x6a\x17\x4c\x3f\xe1\x8b\x68\xce\xcb\x41\x9a\x6e\x0c\xdf\xc9"
- "\xf1\x3f\xfd\x44\x17\x9b\xf1\x32\x3b\x35\xe3\xdb\xaf\xd8\x74\x2b"
- "\xfb\x7c\x9e\x0d\x86\x5f\xb6\x9e\x05\xc8\x2e\x0e\xb4\xef\x82\xcb"
- "\xda\x68\x6f\x9e\x34\x98\x36\x3f\xc0\xa6\x9f\x38\xc5\xe6\xbe\x4c"
- "\xb2\x49\x81\x26\x2b\xda\x8f\xad\x82\xe4\xdd\xda\x64\xdd\x87\xf9"
- "\xa7\x21\xdf\x22\xe6\xb4\x55\x23\xad\x23\x76\xce\x09\x23\x1c\x68"
- "\xaf\x00\x5f\xe4\xe1\xbd\xfe\x8d\x87\x1b\x03\x91\x87\x3b\x02\x1b"
- "\x0f\x7b\x59\xe4\x97\xe9\xbe\x8d\x5f\x5a\xfc\x91\x5f\x22\x06\xbe"
- "\x6c\x44\x3d\x45\x92\xce\x7b\xec\x60\xc6\xe7\x5f\xf7\x90\xfe\x4b"
- "\xbe\x6c\xc5\xba\xd2\x7e\x7b\x4c\x60\xff\xcb\x56\x1a\xdf\x63\x5a"
- "\x6f\x6f\xe4\x97\x1d\x48\xe7\x15\xf6\xd5\x66\x20\x5c\xf2\x36\xab"
- "\xb4\x6d\x18\xb6\x31\x11\xbd\x91\x6d\x26\xbc\x12\xf1\x4a\xc6\xb0"
- "\x12\xe4\x7f\x39\xc7\x54\x49\x5b\x09\xbb\xaf\x1c\xfb\xb2\x38\x9e"
- "\x8f\x6c\xab\xcf\xf0\xdf\xcf\x50\x86\x68\x27\x6d\x25\x81\x8d\x6d"
- "\x95\xc8\xab\xd1\xcb\xb1\xdf\xf6\xdf\xc4\xbb\x77\x4d\x22\x8d\xfb"
- "\xf5\x18\xdf\xca\x4a\x8f\x3c\xea\x25\xac\x1a\x8e\xa4\x07\x0c\x47"
- "\xea\x59\xc9\x11\xcb\x63\xaf\x32\xb7\xbf\xe4\x88\x2d\x50\x72\xc4"
- "\xea\x1b\x8a\x7d\x64\xdb\x3e\x20\xff\xe4\xfb\x25\x43\x19\x7c\x81"
- "\xf2\xd8\xc9\xf5\xef\xb4\xa1\x0d\xac\xba\xa6\xb8\xa9\x13\xb1\x90"
- "\xf7\x21\xf7\x4d\xcd\x9e\x83\x5c\xa6\x2c\xf2\x48\x3a\x61\x8a\xf4"
- "\x3b\x37\x0f\x8a\xd9\xc6\x23\x96\xc0\xc6\x23\x56\xff\x46\xe4\x1b"
- "\x89\xf9\x44\x7d\x75\xdc\xcb\xed\xf5\x2b\xc4\xeb\x3e\x7e\xf6\xbb"
- "\xc0\xf8\x57\x1d\xe1\x7c\x24\xf9\x2a\xf2\x4f\x19\x3e\x2f\x61\xe6"
- "\xcf\xe4\xd7\x84\x9f\x82\x79\x8a\x9f\x22\x1f\x45\xe3\x0e\xf2\x53"
- "\x01\xd9\x4f\x05\x64\x3f\xc5\x9f\x0d\xe8\x6b\x4a\x0e\xd9\xc8\x1f"
- "\x65\xd8\x84\x9f\xc9\xf0\x27\x31\xc4\x46\x34\xf2\xb0\x09\x5d\x20"
- "\x4d\xe9\xa1\x57\x39\x3d\x97\xd3\xa1\xfa\x00\xfa\x1b\xbc\xf6\x06"
- "\x84\xbf\xf1\xca\xfe\x46\x52\xfc\x8d\xdf\x4e\xfb\x6a\x13\xb6\x06"
- "\xfa\x9b\x80\xec\x6f\xfc\x4c\xf8\x9b\x80\xec\x6f\x28\xdc\x2f\xfb"
- "\x1b\x7f\x08\x7f\x83\xf6\x4c\xf5\x8d\x90\xfd\x4c\x31\xf9\x19\xaa"
- "\x2f\x62\xcd\x1a\x10\x7e\xa6\x04\xc7\x1c\x12\xf9\x19\x3f\xa6\x09"
- "\x28\x7e\xa6\x9b\xa7\xaf\x27\x5f\xd3\xfb\x23\x40\xff\x69\x06\xf2"
- "\x31\xdc\x9f\xf8\x46\xf9\xc8\x9f\xa0\xfc\xee\x0f\xf6\x27\xc8\x6f"
- "\x2f\xfe\x36\xca\x7e\xaa\x23\x76\x3d\xf3\xa1\x3f\x69\xcc\xb0\x79"
- "\x50\xd7\x47\x70\xfc\x8d\x7e\xdb\x56\x50\xec\xb4\xf9\x00\xfd\x80"
- "\x97\x35\x17\x03\x96\x11\xf1\xeb\x47\x5f\x01\x80\x76\x99\xee\x43"
- "\x1b\x47\x8c\x5b\x9a\xf3\xfe\x08\x7e\xb4\xd5\xe9\x9d\x5d\xce\xb9"
- "\x9e\x44\xe3\xf4\x13\xcc\x8d\xf2\x71\xcd\xcd\x2b\x46\xff\x92\xe8"
- "\x6e\xea\xfc\x0c\xa6\xb5\xb3\xc0\xb4\x6c\x97\x19\x6d\xc0\x32\x7d"
- "\x91\x23\x96\xf6\xf6\x9e\xf1\x2d\x73\xa0\x5f\xfc\x7f\xa7\x9f\x30"
- "\xc6\xce\x6e\x87\xeb\xa6\xcd\x67\x01\x3f\xda\x19\xd6\xb7\x11\xeb"
- "\xdd\x8a\x65\xef\x40\x9b\xf3\xa2\x9d\xa5\xfb\x82\xec\x8c\x45\x7d"
- "\xf9\x6b\xfc\x6d\x16\xf2\xfb\xd2\x8b\x76\xd6\x1a\xe0\xed\x59\x3b"
- "\x1f\xeb\x61\x3e\x7c\x3e\x0c\x6d\xad\x35\xb0\x51\xd8\x5a\x80\x09"
- "\x5b\x0b\x90\xfc\x24\xd9\xd6\x50\x17\x68\x37\x26\xbc\x12\xf1\x0a"
- "\x6d\x6b\x79\x2a\x5b\x7b\x59\xb6\xb5\x48\x61\x6b\xa8\xd3\x08\xff"
- "\x1a\x61\x6f\xc4\x9f\xc6\x83\x7d\xf6\x16\x75\x24\x9d\xf6\x18\x12"
- "\xd8\xe1\x36\x87\xed\xca\x11\x1b\xda\x9b\x15\xed\x0d\xf9\x31\x37"
- "\xf9\x4d\xc4\xe6\xff\x50\x5b\x37\x23\x8f\xfd\xcf\x3c\xff\x35\xc5"
- "\x68\x4f\x36\xf4\x65\x5f\xa1\x1f\xfd\x9f\xb9\x1e\xa8\x43\x7b\x4a"
- "\x47\x3b\xb2\xa0\x3d\x59\xd1\xae\xc8\x9e\x3a\xfc\x6b\x88\xe7\x57"
- "\x1d\x7d\x3c\x78\x5b\xa9\xb5\x27\x31\x93\x1e\x7a\x3e\xb2\xdb\x7e"
- "\x7d\xae\x0b\x8e\xf0\x6f\x61\xf1\xb7\x0d\x7f\xb7\xc9\xbf\x71\xfc"
- "\xf7\x4b\x17\xef\xcb\xa0\x1d\xe6\xad\x83\x2b\x8f\x83\x39\x19\x31"
- "\x0f\xf8\x3b\x1a\x7f\xa7\x64\x8c\xfe\x9c\x05\xca\x6e\xf4\x62\xde"
- "\xdd\x64\x8b\xcc\x3e\x91\xc6\x67\xa9\x88\x45\x03\xeb\xa6\xbd\xe0"
- "\x3b\xdf\xa2\xbd\xe0\x69\xef\x77\x7c\x1e\x8e\x32\x48\xc0\xfb\x88"
- "\xea\x33\x10\x87\x97\xa9\x5a\xde\x77\x1e\x7f\x27\xb1\x95\xa6\xa8"
- "\xcd\x2b\x60\x4c\xac\x47\xec\xf9\x4e\x7b\xd4\xc7\xfa\x20\x8e\x7e"
- "\x33\xfb\x7e\x7d\xed\x19\x79\xdf\xf7\x18\xcc\x8f\xf6\x7d\xcf\x4f"
- "\x84\xda\x65\x7c\x0f\x4e\x53\xad\x9d\xed\xf6\x77\x93\x1c\x0e\x59"
- "\x94\xb2\x50\xd9\xb0\x9c\xd7\x62\x39\xa7\x3d\xb9\x2a\x15\xbe\xb0"
- "\x85\xfe\x7e\xb3\xdb\x6e\xee\xab\x7f\x98\xf8\x32\x45\x26\x61\xe2"
- "\x77\x29\x72\x0a\xf7\x3d\x2d\xb5\xd3\xfe\x15\xac\x93\xf6\x02\xa1"
- "\xef\x7f\x8b\x7c\xec\xff\xa2\x1c\x8b\xd7\xf9\xc1\x90\x61\xf3\x32"
- "\x67\x27\x73\x38\x6d\x27\xa0\x96\xf6\x27\x29\x64\x81\x40\x64\x67"
- "\x21\xdb\xd8\x69\xeb\x5a\xc1\x7c\x34\xaf\xd2\x6d\x1f\x65\x74\x41"
- "\x9a\x41\xe8\xe2\x70\x2b\x1f\x13\x1a\x3a\x6d\xc8\xeb\x72\xe2\xd5"
- "\x84\xe9\xfd\x1b\x3b\x8b\x91\x2e\xd9\x05\x9d\x99\x9c\xce\x70\xb8"
- "\x35\x6f\x35\xfc\xdb\x71\x18\xc5\xf7\xb1\x62\x25\x9d\xe5\xe4\x13"
- "\x30\xcc\x88\x61\xc4\xbf\x02\xe9\xb1\x8f\xfa\x7f\xc6\x88\xbe\xec"
- "\xa8\x42\x85\x0e\x7f\xf3\xbd\xa6\x34\x18\x12\xab\x31\x8a\x35\xdf"
- "\x93\xe9\x40\xfb\x75\x1c\x7d\x89\x96\x1a\x3a\xba\xdf\xa7\x7f\x69"
- "\xa1\x7d\x3d\x8b\xd6\x42\x3c\xea\x87\xca\xf7\xd7\x22\x1b\x3b\xc6"
- "\xec\xa3\x4a\xde\x59\xed\xc5\x31\xc5\x28\x2c\xcb\x47\x85\xe1\xe4"
- "\x19\x38\xc3\xda\x51\x06\xde\x2d\x38\x2e\x24\xf9\x90\x3c\xd1\x6e"
- "\x02\x28\x87\xaf\xc9\x27\xd5\xae\xa0\xb1\xf1\x0d\xa9\x8a\xbc\xc2"
- "\xeb\xa4\xb3\x4c\x8c\x1f\x6f\xa8\x63\x76\x06\x8e\xeb\xe8\x5d\xc6"
- "\x0d\x6f\x0b\x19\x7c\xd9\xd1\x85\x7e\x84\xe6\x6a\x69\x0f\xce\x7c"
- "\x13\xf3\x22\xcf\x0a\x17\xdc\x96\xa4\x7c\xff\xec\xf4\x4d\x21\xdf"
- "\x12\xb2\xdd\xe2\xdf\x3e\xf7\xf1\xbf\xd1\xd1\x1c\x4f\x67\x75\x92"
- "\x6f\xf2\x6e\x58\x27\xf4\xef\x25\xbe\xf4\x2d\x7f\x3b\xc6\xe7\x7b"
- "\x58\x07\x2b\xf1\xda\x68\x1c\x41\xdf\x11\x63\xd8\xaf\x10\xd7\xcc"
- "\xb1\x8c\xca\x74\xe3\xaf\x1c\xd7\xf5\xc0\x31\x1c\x1f\xd6\xf6\xcd"
- "\xdd\xdc\xb8\x8b\xe6\x6a\xc4\x7c\xd3\x8d\x63\x5c\x30\xf6\x80\x52"
- "\x2e\xea\x63\xa0\x6c\x49\xce\xad\xd4\xd7\xa0\xf9\xff\xfc\x42\xe6"
- "\xa5\x3e\x07\xd2\x5a\x94\x3a\x50\xfd\x44\xbd\x6e\xcc\x55\xd7\x0b"
- "\xcb\xe0\xc6\xb1\x36\x97\x41\xfe\x2a\x30\xf0\x3d\x01\xfd\xf4\xfe"
- "\x60\x0a\xaf\x0b\xd5\x99\xd7\x85\xfb\x58\x6c\x23\x7c\x77\xe2\xb8"
- "\x8d\x87\x13\x2f\x1c\xff\x8c\x49\x16\x78\xba\x31\xec\xb9\xb9\x88"
- "\xcd\xfa\xa2\xb3\x70\x5d\x51\x80\x1d\x3d\x06\x09\x53\x50\x4e\x11"
- "\x74\x0f\x50\x3f\xdb\x4b\xd8\x3d\x5d\x46\x6d\xb2\xb3\x90\xfc\x2d"
- "\xa7\xbd\x02\x69\xdb\x91\xe6\x4e\x99\xf6\x4e\xf1\xee\x87\xdf\x87"
- "\xd1\x1d\xdb\xb1\x77\x5d\x90\x30\xcd\xcd\xdb\x7b\x6f\xaa\xf2\xcc"
- "\xf0\x19\xef\xe8\x87\x4f\x97\x85\x2e\xcb\x91\x7a\x6a\xcf\xfc\x67"
- "\x58\x27\xe6\x73\x15\xe1\xa8\x68\x15\x5c\x8d\x98\xfc\x7a\xdd\x5a"
- "\xb8\x92\x30\xc6\x22\x3b\x2b\x85\xdc\x13\x2a\x99\x1d\xfb\x9e\xe8"
- "\x51\xf3\x56\xc0\xbf\xa1\x0d\x95\x1f\x87\x84\x0f\xe7\x15\x9a\xb1"
- "\xac\x00\x5b\x4e\x02\xf5\x51\xbe\x42\xfa\x0a\xa7\xef\x4f\x74\xd6"
- "\x27\x62\x31\xe1\x80\x82\x45\xfc\xdd\x7a\x2e\x5f\x81\xed\x4c\xa2"
- "\x98\x67\xb8\x69\x0a\xcd\xf5\x1f\x85\x9b\x92\xa8\xbe\x78\xe9\x30"
- "\x6c\x14\x3b\xc3\xe2\x19\x6f\xd3\xda\x4c\x2e\xb8\x69\x36\xde\x13"
- "\xf9\x85\xbe\x44\x7e\x36\x21\x9d\x91\x9d\xf1\x13\x4d\x22\x86\x61"
- "\x9c\x8e\xec\xa4\xaa\xdb\x7e\x53\x96\x0b\x1e\x91\xc7\xad\x37\x99"
- "\x89\x57\x98\x32\x98\x18\xff\x8e\xfe\x34\xd6\xf7\xa6\xcf\xcc\xeb"
- "\x74\x54\x0e\xbe\x0f\x24\xf1\xaa\x95\x84\xcf\x0e\x60\x59\x6b\xec"
- "\x01\x2b\xfa\x67\x6b\xa0\xf4\xdb\x54\xfe\x5b\x8e\x63\x72\x3b\x1a"
- "\x9a\xbf\x77\x03\xdf\x8f\x19\x6e\x36\x09\x3e\x5e\x9b\xe3\x9a\xe3"
- "\xf4\xcc\xf7\x2e\xf2\x18\xce\xa4\x3a\x2b\x53\xc5\x5e\xd0\x48\x23"
- "\xc6\xf1\x37\x5f\xdd\x85\x79\x74\xdb\x6f\xc6\x7a\x8f\x37\x88\xf7"
- "\x1e\x67\x52\xc3\xd8\x9e\x91\x6c\x87\x6c\x4e\xd8\xf4\x2d\x27\x9a"
- "\xea\xc8\xfe\xda\x0c\x5d\x86\xb6\x44\xd9\xff\xd2\x9c\x4c\xf4\x51"
- "\xb8\xa5\xb3\xc9\xc4\xf1\x2d\x31\xe9\x66\x9b\x66\xaf\x58\x8c\x1b"
- "\x78\xdd\x8c\xe3\xfd\x9b\xf7\xe1\xd5\x28\x3f\x1f\xc4\xab\x03\x7f"
- "\x27\xe3\xd5\xc6\x65\xb7\x23\x47\xe7\xc2\xb8\x2e\xec\xb3\xd3\xb3"
- "\x0b\x6e\xde\xc3\x76\x24\x48\xca\xef\xda\x37\x69\x9e\xe0\x66\x17"
- "\xea\xc0\x2a\x74\x41\x7c\x40\x87\x65\x23\xb9\xb3\xa2\x4a\xe6\x6d"
- "\x58\xe7\xa1\x72\x1b\x1b\x2a\x3d\x60\xbe\x99\xea\x7f\x4b\x1c\xd5"
- "\xc9\x83\xf2\xa7\x7b\x7e\x25\x73\xef\xaf\xf2\x01\xbd\x23\xeb\xb6"
- "\xdf\x82\xf6\xff\xef\xd3\xc4\x9c\x83\x77\x37\xf1\x93\x31\xc1\x94"
- "\xfa\x0b\x39\x9f\x49\x35\xaf\xd0\xd1\xf3\xaa\x1a\x3e\x0f\x73\x5c"
- "\xdf\x3f\xd7\x7c\xcb\xcb\x68\xe7\xf7\xd3\x5e\xd2\x27\xe1\x96\x4f"
- "\x19\xca\x7a\xbf\x95\xef\x49\xe9\xa6\xf9\x18\x9a\xbf\xc7\x7c\xd0"
- "\xff\xdd\xd4\x28\xef\xbf\xe3\xe6\xbe\x06\x79\x6e\xc6\x38\x6c\x8f"
- "\x3a\x9b\xac\x5e\xf0\x53\x9d\x31\xed\x67\x67\xbc\xfa\xd8\x02\xd0"
- "\xad\xcb\x43\xbf\x83\xe5\x60\xa8\x2b\xe1\xcb\x6e\x49\x5f\x7b\x82"
- "\x79\x95\x3a\xd3\xbb\x54\xe4\xdb\xe9\x82\x72\x4b\x58\x9b\xe8\xab"
- "\xc7\xe8\xc8\xfd\x09\x42\x8f\x01\x94\x95\x56\x8f\xa3\x0d\x42\x87"
- "\x89\x29\x5a\x1d\x8e\xc6\xbe\x4e\xe2\x06\xbc\xaa\xf0\xda\x25\x9e"
- "\xd5\x57\x62\x9e\xea\x37\xea\x35\x11\xfd\x69\x62\x21\xfa\x0b\x79"
- "\xee\x87\xc2\x11\xcf\x84\x9b\xbf\x62\xdb\xd3\x6b\x01\x7a\x8f\x4a"
- "\xe1\x84\x71\x0a\x0f\x60\xff\xc6\x05\x89\xe5\x18\x6f\x24\xfb\xa5"
- "\xfd\x3d\xd5\xf1\x7d\xfb\x38\x41\x22\xdf\xd7\x3c\x76\x7d\x49\x09"
- "\x61\x17\xd3\x54\xc4\xfa\x4a\xb0\x8f\x99\xd8\xa9\xc8\x15\xc3\x0e"
- "\x52\x3c\xe1\xb4\xdb\x3e\x5a\x8f\x72\xa9\xe4\xef\x49\x71\x0c\x18"
- "\xba\xef\x31\x3a\xb1\xaf\x8f\x66\x68\x2b\x21\x5d\x76\xc2\xad\x13"
- "\xd1\x8f\xa1\xff\xfe\x36\x59\xb4\x3f\xb7\xde\x49\xcf\xe8\x3f\xbf"
- "\xc6\xdf\x49\x4d\xe8\xa7\x7a\x4a\xbf\x29\xee\x95\x60\x58\x8f\x04"
- "\xa9\xbe\xcd\x09\xf1\xbe\xa8\xaf\xcb\x9c\x1d\x7b\xa0\xd9\xf7\x73"
- "\x30\xbf\xc8\x79\x8c\xa6\x7d\x66\x8b\x56\x31\xff\xc7\x3d\xf5\x7a"
- "\xa7\xef\x94\x83\xef\xeb\x2e\xbe\xd3\xd7\xfd\xf8\xa8\x38\x73\xe8"
- "\x98\xfc\xcc\xa2\x6f\xf4\x6e\x7e\x9e\xf9\x36\x1f\xa3\xbd\x67\x4c"
- "\x51\x9b\x7a\x60\xcc\x5b\xab\x21\xa9\xaa\x07\x12\x6a\x7a\x20\x91"
- "\xfd\x99\xce\xe4\x09\xe0\x58\xcd\x48\xe7\x9d\x58\x86\xe7\x81\xa1"
- "\x66\x35\xf6\xe7\x7c\xa0\xf3\x6f\xc2\xfe\x1c\x9d\x4d\x74\x2a\x91"
- "\xfc\x65\x5f\x7f\xae\x97\xf7\x95\x4f\x70\x1a\xb6\xf1\x04\xed\x45"
- "\xa9\x8b\xce\x06\x23\x96\xaf\xe8\x24\x8c\x5e\x14\xdd\x8e\x7d\x49"
- "\xac\xb3\x4b\xae\x2f\xca\xbc\x30\xd6\x0a\xc3\x78\x5d\xd1\x87\xb3"
- "\x8d\xdf\x26\x87\x6d\x9b\x25\xc2\x94\x87\x6c\x89\xea\xb0\x9e\xde"
- "\xe5\xee\xb9\xc6\xab\xcf\xaf\x62\x5e\x0a\x2f\x18\xc5\xbc\x18\x6e"
- "\xa5\xbc\x77\x63\x78\xb7\xfd\xd6\x72\x97\xf4\xc7\x69\xe1\x30\x8a"
- "\x63\x26\xd9\xd7\xdc\x76\x39\x93\x8a\x09\xa3\x8d\x6b\x7d\xd8\x1f"
- "\x3f\x49\x76\x7c\x9b\x31\x23\x97\xf9\xcc\x4b\xe8\xbd\xfa\x6d\x40"
- "\xef\xfc\xe9\x5d\xdf\x47\xd8\xd7\x39\xdf\x7b\x7e\x6a\x43\x68\xfc"
- "\x10\x9b\x8b\x3c\x4b\xdb\x1a\x19\x8e\xd9\x2f\xb4\x5f\x4f\x6b\x4d"
- "\xb6\xf2\x75\x2d\xb7\x4d\x73\xc1\x53\x75\xf2\x7e\xb2\x9d\xc2\x9f"
- "\x8e\x19\xe3\x41\x19\x68\x7d\xc0\x18\xa0\x7d\x50\xba\x4a\x8e\x47"
- "\x3b\xae\x23\xdf\x7f\xdb\x59\xd1\x17\x3a\x6e\x10\x6d\xc1\x6d\x87"
- "\xc4\x1c\xff\x6d\x55\x2e\xb8\x97\xb7\xf1\x79\x37\x10\x26\x6e\x3b"
- "\xc8\xa2\x8e\x5f\x46\x74\xe3\x8a\xa1\x78\xa9\x0f\xb2\xd9\xc6\xe3"
- "\x06\xc6\x6d\xe5\x24\xb0\x37\x5e\xea\xa6\xb5\x1a\x9e\xab\x66\x75"
- "\x63\xdf\x60\x0c\xc6\x45\x53\x1e\x6e\xa4\x41\xb9\x47\x8a\x35\x01"
- "\xb7\xb9\x5d\x70\x8f\xec\x0f\x6f\x6b\x10\x73\xcf\xb7\x35\x74\x61"
- "\x5a\xec\x2b\x5e\xd1\x6d\x1f\x83\xfd\xdf\x99\x05\xf2\xbb\x63\xbe"
- "\xa6\x07\xc3\x12\x5c\x90\xb5\x97\xc2\x0a\x46\x81\xa9\xc0\xcc\xc2"
- "\xf5\xc5\xf4\xda\x7a\x8e\x7d\x8f\xaf\xbb\x91\xe0\x2a\xe4\x61\x55"
- "\xf8\x62\x7b\xfb\x7e\x97\xf4\xe4\x93\x18\x56\xa8\xf0\x45\x9a\x2b"
- "\xf1\xb9\xac\x8f\x46\xa4\xa9\x52\xa5\x79\xb2\x4b\xba\xf5\x7d\x0c"
- "\xdb\x1d\x94\xc6\x11\x94\xa6\x45\x95\xa6\x58\xce\xa7\x3d\x28\x8d"
- "\x47\x9b\x66\xac\x7e\x60\xd9\xc6\x9a\xb4\x69\xc6\x26\x06\xa5\x49"
- "\x1e\x58\xb6\xb1\xd3\x82\xd2\xcc\x0e\x4a\x93\xab\x92\x2d\xad\x81"
- "\x49\xc2\xb0\xe2\xa0\x34\xe5\x41\x69\xea\x94\x67\xec\x7b\x3a\x44"
- "\xdf\x00\xf1\x84\x3a\x45\xbd\x46\x63\x3c\xd6\x7f\xf2\xc1\x73\xad"
- "\x83\x42\xcc\xe8\x8b\xaa\xc5\xbe\xfc\xe4\x57\xe9\xbd\x3e\xf9\x73"
- "\xec\x17\x77\x12\x26\xa8\xdf\x49\x79\x1d\x83\x71\x27\x08\x43\xdd"
- "\xf6\x71\x71\x03\xe5\x31\x2e\x51\x5b\xce\x71\xc9\xda\x72\x8e\x4b"
- "\x1f\x28\x8f\x71\xb3\x83\xd2\xe4\x06\xa5\x29\x54\xa5\xa9\x93\xf3"
- "\x29\x0f\x4a\x53\x17\x94\x66\xf7\x40\x7c\x8e\x6b\x08\x4a\x73\x30"
- "\x28\x4d\x7b\xbf\x0c\xc7\xf1\xf5\x6c\x64\x0f\x18\x8e\xcf\x29\x09"
- "\xe7\x90\x9d\x51\xc1\xb3\xb2\x1e\x4d\xe0\x7a\xfc\xfa\x0a\xb1\x2e"
- "\x8b\xef\x81\xd4\x0e\xe3\xb7\x29\xef\x7b\xdf\xe9\xf1\x0e\xa1\x77"
- "\x4c\x28\xdb\x8e\xfd\x36\x2f\xb6\xb9\xe3\xb3\x5d\x70\x67\xa5\xb2"
- "\x66\x83\xd6\xb9\xf0\x3d\xf4\xf8\x78\x64\x7c\xaa\xb0\xbf\xf1\x15"
- "\xf2\x3b\x1d\xaa\x0f\xb6\x8b\xe3\x2b\xbe\x5b\xb9\x92\xee\xa4\x72"
- "\xd1\x5e\x52\xc8\xa3\xb5\x6f\xac\xd1\x57\x56\xca\x33\xe9\x01\xa5"
- "\xac\xb5\x62\xad\x0d\xed\x5f\xe6\xa6\xfd\xbd\xba\xed\x49\xd1\xaa"
- "\xf1\x09\x95\xd5\xb3\x67\xb5\x57\x1f\x54\xe6\x4e\x51\xe6\xa4\x54"
- "\xe1\xa3\x92\x52\x15\x7f\x12\x16\x7f\x25\x5e\x6b\x33\xf6\x0a\x68"
- "\x4d\x41\x53\x15\xf6\x37\x71\x8c\x45\xe5\x3e\x0a\x49\x25\xbc\xff"
- "\xbb\xa4\x07\xe8\xb7\xb3\x70\x12\x5f\x73\x20\xd7\xc5\x41\xe7\x38"
- "\x50\xdf\xa7\x21\xef\x34\x74\xf1\x31\x1a\xf9\xc6\xa4\x13\xfb\x0b"
- "\xdd\x54\xd6\xbd\xca\xba\x1c\x2c\x8b\xe8\xd7\x95\x78\xb3\x69\x3d"
- "\x04\xbd\xd7\xdb\xef\x49\x26\x9a\x36\x94\x6d\x9d\x22\x03\x3a\x13"
- "\x02\x69\x2b\xc2\x8d\x95\xd4\x72\x15\x65\xb8\xe3\x19\x81\x9f\x09"
- "\x09\x5a\x7b\x18\x82\x38\x9d\x90\xac\xc5\xdc\x84\x74\x2d\xe6\x26"
- "\x58\xb4\xf6\x20\xa1\x3d\x4c\xc8\x0d\x4a\x53\x18\x94\xa6\x4c\x95"
- "\xa6\x5c\xce\xa7\x2e\x28\xcd\xee\xa0\x34\x6a\xff\x87\x75\x9e\xd0"
- "\xd2\x37\xee\xe4\xfe\x7e\x82\x4b\xf5\x2c\x55\xf0\x76\x6a\x82\x47"
- "\x09\xa3\x79\x3b\xea\xa3\x12\x6e\x04\xbf\xdb\x8d\x41\x3e\x0a\xe9"
- "\x6f\x4f\xd0\x96\xe1\xf6\x89\xda\x32\xdc\x9e\xa6\x3c\xcb\x6b\x1e"
- "\xfe\xeb\x18\xdc\xbe\x51\xc6\x99\x27\x76\x3d\x3c\x1e\xeb\x7b\xe2"
- "\x19\xea\x9b\x51\xfb\xc4\xd7\x86\xad\xc5\x3e\xe5\xb7\x60\xa4\x35"
- "\x79\xc7\x0a\x20\x82\xf6\x99\x73\xc1\x1d\xfb\x58\xe4\x09\xa2\xe9"
- "\xc4\xfe\x54\x06\xf2\xc8\xc2\xfc\x2b\x31\x0f\x94\xdd\xed\xf5\x41"
- "\x65\xd8\x1b\x54\x86\x46\xd5\xb3\x11\x9f\x5b\x55\xf5\x36\x46\x98"
- "\xf8\x1a\x50\xec\x5b\xdf\xee\x56\xc2\x69\x0e\x00\xeb\xd8\x51\xc4"
- "\xfb\x01\xa9\xb4\x1e\x6f\xc4\x51\xb8\xfd\x08\xcd\x17\x08\x9e\x77"
- "\xc4\xab\x65\x2b\x64\x71\x47\x92\xb6\x1c\x77\xa4\x6a\xcb\x71\x47"
- "\x66\xbf\xaf\xb9\x3d\x4b\xd8\xc8\x1d\x39\x2e\xb8\xaf\x9c\xc2\x50"
- "\x16\xe6\x58\x9f\xf9\x0a\xc7\x0d\xd4\x4f\xbd\xe3\x13\x0f\xd6\x97"
- "\xfd\x48\x1a\x21\x3f\x7f\xca\x6e\xa0\x7e\xf7\x09\x3a\x1b\x80\xd6"
- "\x5c\x5e\x8f\x61\xfb\x84\x5e\xef\xc0\xfa\xdf\x5b\x2f\xf8\xde\xc1"
- "\xf7\x77\x25\x5a\xfc\x5d\xc2\x22\xbd\xb6\x70\x78\xee\x8a\xf2\xe6"
- "\xc9\xeb\x41\xcd\xc8\xa3\x53\xb1\x87\x40\xa9\x37\x2f\xb0\xb1\xcb"
- "\xdb\x6d\x9f\x88\x3c\x92\xbc\x62\x4c\xd3\x95\x86\xd8\xa7\xf1\x37"
- "\x8e\x81\x27\xca\x63\x19\xef\x06\x5a\x93\x87\x7e\x89\xf6\xb2\x8c"
- "\x16\xeb\x27\x26\x4e\x54\xd9\x95\xc7\xbc\xfa\x7e\x76\x14\x26\x9e"
- "\xa5\xbe\x1d\xf9\x0d\x5a\xdb\xb7\xdf\xe7\x06\x9a\x67\x71\xfa\x8e"
- "\xf3\x3e\x39\xc6\x7b\xe5\xb4\x79\xaa\xb4\x6e\x79\x1e\xa4\x83\xe2"
- "\xc6\xfb\x40\xbf\xdf\xe3\xa6\x3d\xfb\xe3\x44\x3f\x7e\xe2\xd9\xfd"
- "\xe8\x2f\x30\xcd\x4e\x25\x0d\xcd\x99\x50\x1a\x1c\xf3\xe8\xc7\x15"
- "\xd2\xb9\x9e\x47\x39\x6f\x65\x7d\x0d\x8d\x8f\x9c\x85\x1d\xe0\xf4"
- "\xb4\xd2\x9c\xa6\x5e\xac\x8b\x9a\xe8\x8d\xf0\x82\xa1\x6b\xa3\x17"
- "\x7d\xf1\x44\xaf\x7f\xa3\xd7\x8a\x65\xc3\x76\x77\x62\x3c\xf9\x40"
- "\xb5\xec\xa6\x4c\xc9\x7c\x22\x63\xfa\xd8\xa7\x9f\x98\x9a\x35\x65"
- "\x92\x39\x6b\xd1\xe2\x85\x39\x63\x97\x2e\x2f\x30\xaf\x5c\xb6\xa8"
- "\x60\xd1\x92\x17\xf8\x36\xa3\xe6\xf9\x05\xe2\x9e\x98\x3b\x3f\xbf"
- "\x60\x32\xfd\x1c\x63\xce\x5b\xb6\x70\x05\xff\x39\x3a\x0a\xb4\x4c"
- "\x16\x15\x2c\x5c\x66\xbe\x29\x67\x8c\xf9\xe1\xf9\x8b\x72\x97\x2f"
- "\x5b\x18\x92\xd7\x24\xf3\xb2\x85\xcb\x16\xce\xcf\x31\x4f\x36\x27"
- "\x11\x67\x35\x3b\x95\x3e\x93\x14\xff\x94\x8f\xed\x39\xf6\xa1\x3b"
- "\xc8\x4f\x51\xbb\x7e\x0c\xee\x3e\x42\x7d\x38\xbe\x2f\x28\xe2\x10"
- "\xdb\x04\x57\xb7\xfd\xce\xb6\x81\xed\xf8\x9d\x6e\x2d\x7e\xef\x02"
- "\x2d\x7e\xef\x32\x0e\x6c\xc7\xef\x0a\xb2\xff\xbb\x82\xec\xff\xae"
- "\xb4\x81\xed\xf8\x5d\x96\xa0\x34\xd6\xa0\x34\xb6\x3e\x3f\x83\x65"
- "\x7d\x85\xfb\xa5\xbb\xca\x82\xd2\x54\x05\xa5\xd9\x15\xf4\xbc\x4f"
- "\xf5\x8c\x7d\xd7\xbb\x0e\xa8\xfb\x06\xf8\xdc\xa6\xd8\x7a\xbf\x7f"
- "\xbb\xcb\xad\xd0\x50\xdb\x53\x4b\xe7\x0f\x71\xda\xbb\x0d\x2a\xda"
- "\x0e\x41\x7b\x77\x9f\xfd\x93\x4f\xa2\x35\x91\xa2\x7f\x7e\xf7\x26"
- "\xd9\xb7\xd1\x79\x44\x4a\x1b\xda\x8e\xba\xb8\xfe\x24\xdc\x75\xb6"
- "\x56\xd0\xba\x69\x9d\x2c\x7b\x63\x56\x77\xed\x08\x30\x50\x5a\xda"
- "\x17\x93\xd9\xef\xe4\x7b\x34\x62\x58\x34\x5e\xe8\xa7\xee\x2e\x76"
- "\x49\xff\x1f\x3f\x0b\x6b\x03\xd2\xb8\xe0\x6e\x8e\x65\x4a\xb7\x81"
- "\xaf\xeb\xe3\xf9\x9d\xa5\x73\x95\x68\xaf\x59\xf2\x9f\x94\x2f\xed"
- "\xd7\x4a\x79\x23\x0f\x3d\x93\xee\x9c\x2a\xef\xbb\x69\xc4\x2b\x0e"
- "\x79\x1e\x54\x78\x22\x3f\x3e\x4f\xf4\x8a\xbc\x0e\x5e\xf4\x7b\xee"
- "\xf6\x28\xfd\x0b\x1a\x2b\x84\xf2\x1d\xa1\xd7\x3c\x43\xec\x16\x7b"
- "\xa0\xd5\xb1\xae\x1d\xcb\x94\x9c\x40\xfd\x50\xa7\xc9\x07\xcd\x55"
- "\x3e\x1c\xbf\x82\x91\x8f\xa7\x6c\x27\xc0\x59\xe7\x03\x9a\x1f\x9e"
- "\x67\x83\xe2\x5a\x29\xd0\xca\xfa\xd2\xd1\x18\x2d\x99\xef\x37\xbe"
- "\x81\xc2\x31\x3d\x8e\x25\xdc\xb4\x36\x3a\xdc\x99\x5f\x44\xe7\xb8"
- "\x81\xc6\x7b\xc9\x15\x72\xdf\xb7\xa4\x16\x79\x85\x5c\xb7\x2b\x81"
- "\xb3\xdb\x9e\x8c\xed\x5f\x76\xb2\xe2\xb3\xf7\x57\x72\xdf\x27\x61"
- "\x38\xca\x36\xd9\x14\xae\x9f\x22\xfb\xf7\x3c\x5a\xfb\xd5\x6d\xbf"
- "\x27\xee\x5c\xb4\x54\xee\xfd\x58\x6f\xb4\x45\xe3\x3b\xeb\x92\x86"
- "\xc8\xfe\xd5\x80\xe9\xa6\x29\xe9\x2e\xa4\x7e\xf2\x37\x0a\x6e\xb4"
- "\x55\x8f\x18\x2b\x4e\xfa\xd5\x56\xbe\x16\xf8\x1e\xec\xff\x25\x2b"
- "\x76\x70\x19\x3e\xa3\xff\xbb\x87\xcf\x27\xd2\xba\x19\x1a\x53\xe7"
- "\xe7\x61\x9f\xcd\xe4\x41\xdf\x78\x8f\x43\x89\xe3\xf3\x44\x14\x57"
- "\xc8\xbc\xfb\x4d\xed\x14\xd7\xd6\x17\x47\xe9\xa8\xdc\x36\x1f\x85"
- "\x7b\x94\x70\xd1\xb6\x4c\xd2\x07\x3d\xc7\x29\xcf\xf8\xdb\x8c\x65"
- "\x29\x91\xf9\xbb\xd1\xe7\xd2\x9a\x27\xdd\x51\x98\xb4\xbe\x86\xdb"
- "\xcd\xa4\x54\x25\x9e\xcf\xa9\xbd\x4d\xef\xc6\x3c\x10\x88\x3a\x6e"
- "\xe4\x7d\x2e\x4c\x43\xe7\x74\xe1\x18\x43\xc7\x7a\xf9\xfa\xab\x4e"
- "\xe2\x43\x36\xc3\xcf\xca\xc1\x67\xe4\x35\xb1\x96\x70\x8d\x7a\x5d"
- "\xe9\x83\xf8\xbc\xfb\x68\xfe\x79\x12\xc7\x2d\x85\x11\x5f\xe2\x47"
- "\x6d\x22\xf1\x26\x7e\x74\x9e\x18\xeb\xa2\x35\x8a\x93\xb0\xfe\xc9"
- "\x9e\x70\xba\xc2\x78\x97\x4a\x96\x43\xf0\xd9\xad\xad\xeb\xbd\x10"
- "\xf4\x6c\x54\x9e\x69\xae\x57\x60\xef\x5e\xbd\x1c\x37\xe6\x5c\x79"
- "\xd1\xf8\x17\x69\x32\xb5\xf9\xdd\x9b\x1d\xc4\x3f\x2f\xe8\xb9\x58"
- "\x79\xae\xe0\xef\x18\xee\x2d\x57\xf2\xe0\x3a\x43\x8c\xed\x5c\xe7"
- "\x1e\x72\xae\xfd\x63\x31\x4d\x83\x2a\xcf\xa1\xf8\x7c\xb0\x5f\x7f"
- "\xf7\xba\x14\x7e\xf8\xbb\x53\x45\x87\xfd\x92\x7b\x7d\x0a\x9d\x78"
- "\xbf\x91\x12\xdd\x9f\x2e\xc5\x74\x9e\xba\x06\x61\x77\xf2\x42\x81"
- "\xdd\x94\x4c\x6d\x59\x52\xb2\x55\x3c\x73\xfb\xcb\x92\x62\x53\xd1"
- "\xa1\x7d\xa6\x94\x04\x63\x35\xdf\x46\x18\x27\xbc\xa6\xec\x0c\x11"
- "\xe7\x95\xe3\x1c\xa1\x31\x9e\xd2\xaa\x0a\x97\xc7\x47\x93\x95\xfd"
- "\xcf\xc9\x3f\x7b\xe8\xac\x34\x79\xbf\x76\x8e\x49\xda\xc7\x59\x3e"
- "\xbf\x09\x71\x3d\xd9\x14\xcc\x97\xce\xdc\xe9\xe3\xd1\xc7\x33\xa5"
- "\x43\xf4\xf1\x26\xa7\xf7\xd7\x6d\x72\x96\x0b\x26\x29\xef\x89\xdc"
- "\x62\x6e\x30\x25\x2d\xdc\xb8\x03\xe9\x37\x68\x65\x36\xb9\xa2\x5f"
- "\x66\x93\xeb\x54\x7c\x77\xa9\xe8\xfe\x1b\x9f\xf7\xa9\xe8\x1a\xcf"
- "\x87\x4d\x81\x95\xc9\x6e\x6d\x5e\xf7\x41\x3f\x8f\xfb\xa2\xfb\xf3"
- "\xba\xcf\xa4\xa2\x6b\xc5\xe7\xc4\xf0\xfa\xb9\x2f\x2d\xbc\x7e\xee"
- "\xcb\x0e\xad\x9f\xfb\x6c\xaa\x7c\x37\x9c\xdf\xae\xee\xab\x57\x95"
- "\xa7\x16\x9f\xf7\x6a\xed\xe8\xbe\xc6\xa0\xe7\x3e\xfd\x33\xf4\x1d"
- "\x3b\x57\xa7\xd2\xf9\x1e\x50\x30\x0a\x8c\xc2\xce\xee\xf3\xaa\xe3"
- "\x3f\xee\x11\xf1\x54\x46\xfe\x0e\x8e\xde\x6f\x72\xba\xfb\xcd\xc1"
- "\x74\x44\xa3\x8a\x4f\x55\xca\xbe\x21\xcc\xde\xe2\x4a\xfb\xe7\x0c"
- "\x50\xfb\x77\xff\x6c\xf1\xde\xe6\x2f\x69\xcc\xfe\xb9\x25\x5c\x5b"
- "\x86\x7c\x2b\x5d\x70\x7f\xa6\x90\xcf\xfd\x88\xff\xa7\xc5\xb7\x2f"
- "\x25\x7f\x49\x43\x3c\xf5\x1c\x83\xd4\xc9\x78\xef\xc5\xfb\x28\x6d"
- "\xfb\x7a\xff\x3e\x66\xd7\xcd\xac\xb5\x07\xb7\xbb\xf7\x1f\xc4\xb1"
- "\x47\x4f\xac\xaf\xd8\x12\x22\xce\xcd\xec\x11\x4f\x0c\x0c\x4f\xa5"
- "\xb6\xae\xc7\x05\xa9\x29\x54\x5e\x55\xb8\x99\xd9\x87\x67\x11\xbd"
- "\x8b\xf2\xc3\x34\xe1\xf4\xa6\x7c\x5f\x24\xb0\x97\x9a\x1b\x54\x8f"
- "\xb3\xc8\xeb\x1b\x51\x8f\x07\xa6\x04\xe5\xbd\x21\x74\x3d\x52\xab"
- "\xb0\x1e\x67\x43\xd7\x23\x95\x9f\x85\xcb\x24\xac\xcb\x80\x7e\x47"
- "\xea\x41\xac\xcb\x59\x2e\x77\x6d\x78\xa7\x32\x4e\x2d\x3a\x8b\xe3"
- "\x7f\x09\x78\xda\x99\x85\xfd\x7a\x13\x74\x0f\xc4\xc5\x56\x42\xe6"
- "\xc0\x3c\x1f\x18\xc3\xec\xc3\x66\xba\xe0\x81\x1c\xa5\xbd\x92\xc3"
- "\xd3\x44\x59\x50\x4e\x12\xc9\x29\x95\xce\x7d\x8a\x0d\xa7\x6f\xc5"
- "\x3e\xc5\x7b\xa6\x07\xd0\xfe\x53\xd3\x95\x36\x1d\xdb\x73\xb7\x22"
- "\x47\x8c\xdb\x1d\x14\xe7\x55\xc5\x1d\xd0\xc4\xad\xed\x0b\x6f\x57"
- "\xc2\x2f\x4c\x4f\x0f\xc6\x05\xe9\x09\xf5\xf3\xe0\xbb\xda\x7a\x3f"
- "\x98\x20\xea\x87\x3a\x1a\x20\xeb\x07\x53\x51\x47\xbd\xa1\x75\xf4"
- "\xe0\xec\xd0\x58\x7b\x90\x9f\xd5\xcd\x46\x40\x28\x7e\xe5\xa8\xbb"
- "\x5e\x8e\x41\x59\x4f\x03\xf5\xf3\xe0\x1e\x45\x3f\x17\x58\x47\x6f"
- "\x50\x1d\xfd\xc7\xe0\xa1\xe5\xa2\xae\x0f\x7d\xa1\xe5\xfd\x90\x31"
- "\x34\x16\x1f\x4a\xc4\x7a\xfa\x43\xd7\xf3\xa1\xb4\xf0\x58\x7c\x28"
- "\x1b\xeb\xe3\x1f\x88\xc5\x87\x6c\x22\x0d\x84\x4a\x53\xc1\xec\x21"
- "\xf3\xd9\x45\xfd\x22\x17\x3c\xd4\x4e\xef\xe9\x54\xe1\x0d\x5a\xfc"
- "\x3d\x64\xe4\xe9\x48\x7e\x3e\x31\x8e\x21\x3d\x1c\x33\x83\x74\x3e"
- "\x4c\x76\xdb\xd3\x12\x82\x64\x75\xea\x18\xa4\xbd\xdb\x25\x49\x0f"
- "\x0b\x79\x4d\x59\xa4\x2d\x53\x5a\x6a\x68\x79\xa5\x59\x50\x5e\xa7"
- "\x42\xcb\x2b\xad\x20\xbc\xbc\xd2\x48\xff\xa7\x06\xca\x2b\xad\x5e"
- "\x2d\x2f\x3a\xe3\x95\xea\x77\xa3\x09\xb1\xd1\x3b\x8f\xd5\x0a\x5f"
- "\x6e\x8c\x45\xac\x88\x34\x9d\x94\xa6\x2d\xd6\x2b\x70\x62\xbe\x06"
- "\x0c\x27\x21\xad\x41\xb1\xff\xe1\x95\x30\x8c\xf5\xce\xa2\x35\xda"
- "\x74\x66\x84\xd1\x69\x3b\xe5\xa0\xb3\x25\x69\xbe\x51\x9b\xef\x14"
- "\x73\x68\x5f\x30\x25\x19\x65\xfa\x7a\x88\xf0\x4c\x31\x67\x3a\xa5"
- "\x44\xeb\x23\xa6\x58\xb5\x3a\x42\xb9\x49\x7c\x37\x74\xdd\x85\x5c"
- "\xe7\xd6\xd9\x94\xd6\x81\x3a\x7b\x78\x95\xd0\xd7\xc3\xcf\x04\x95"
- "\xcf\x1d\x5a\x5f\x0f\x1b\xc2\xeb\xeb\xe1\x84\xf0\xfa\x7a\x38\x95"
- "\xf4\xe5\x82\x87\x6d\xda\x76\xe3\x61\x8b\xb6\xbe\x98\x2f\xa6\x63"
- "\xd2\xd0\x2b\xe8\xf9\x42\xeb\xad\x5c\xe4\xe3\x48\x57\xb5\xd8\xbf"
- "\xc2\xf2\x8f\xa2\x32\x0e\x96\x47\x58\xde\x28\xc3\xf2\xd5\x61\xcf"
- "\x21\x89\x6e\xc6\x71\x25\xad\xcf\xe3\xe7\x44\xc3\x23\xd3\x03\x92"
- "\x6e\x12\xfe\x96\x8e\xc1\xd4\xab\x03\x52\x44\x31\xad\x25\xe3\xdf"
- "\xe6\xf1\xf7\x13\x8f\xe4\xa8\x75\x41\x6b\xca\x68\x2e\x7a\xb3\x98"
- "\xe7\xfc\x0a\xd3\x9f\x10\x7a\x49\x3f\xab\x95\xe3\x23\x25\xa1\xf5"
- "\xf2\x48\x1d\xea\xe5\xab\xd0\x7a\x79\x64\x5f\x78\xbd\x3c\x42\x63"
- "\xd2\xaf\x06\xda\xd1\x23\x6e\xd9\x8e\x5e\xa1\x34\xe6\x25\xd4\x5f"
- "\x4d\x9f\x4f\x34\xf8\x1b\x6d\x24\x9d\x9f\x3d\x3c\xb6\x53\xb1\x23"
- "\x4a\x93\x4e\xe3\x7f\x9e\xbf\x4c\x63\x96\x79\xa8\xf8\xa6\xa7\xc7"
- "\x76\x86\xb2\x93\xf4\x6c\xa2\x1d\x97\x07\x06\x94\xa1\xa5\x9a\x78"
- "\x2c\x03\x40\x1e\x9f\x12\x1d\x85\xd3\x19\x0e\x2a\xfa\x72\x85\x8e"
- "\xcf\x8b\x0a\xda\x12\xd6\x6d\xe5\x67\x55\x05\xf1\x96\xeb\x3f\x8c"
- "\xb7\x23\x44\x4f\x74\x41\x34\x2e\x61\x8f\x53\x13\xb4\xf6\x98\xee"
- "\xd5\xe2\xf3\x11\x7a\x3f\x11\x1b\x40\x3f\x87\xbf\xa7\xf9\xed\xba"
- "\x49\x97\xc6\x36\xa7\x16\x04\xd9\x26\x62\xe0\xd1\x2b\x05\x06\xa6"
- "\x7e\xab\x2d\xeb\xd4\xb2\xd0\x18\x98\xba\x33\x3c\x06\xa6\x3a\xc2"
- "\x63\x60\x6a\x1b\x61\xc0\x05\x8f\xc6\x69\x6d\x73\xaa\x47\x5b\x77"
- "\xcc\x97\xdb\x26\x5c\x3e\x18\xdb\xc4\xbe\xd0\x15\xe1\xec\x50\xee"
- "\xff\xeb\xe8\x5c\xb6\x41\xc8\x4c\x9c\x33\x04\x8f\xd6\xd3\x3b\x24"
- "\xf4\xf1\x56\x92\x61\x0d\x1f\xa3\x3d\xba\x4f\x2d\xc7\xcd\x62\xac"
- "\x55\x74\x0c\x1e\x7b\x80\xd6\xec\x09\x79\x4e\x8b\xd4\xd6\xff\xd1"
- "\xb6\xd0\xf2\x7c\x94\xde\x53\x14\x85\x96\xe7\x63\xc6\xf0\xf2\x7c"
- "\x6c\x0c\x7d\x03\x3e\xd0\xa6\x1e\x4b\xa3\x33\x37\x95\xb6\xe9\x24"
- "\x3c\x56\x7d\x61\xed\xd3\x63\x85\xda\xf6\xe9\xb1\x9c\xc1\xb7\x4f"
- "\x8f\x39\x42\xb7\x4f\x8f\xb5\x86\x6e\x9f\x1e\x73\x0b\x7b\x98\x96"
- "\xa8\xb5\x87\x69\x06\x2d\x26\x50\x76\x97\xac\x7d\x9a\x66\x0b\xb2"
- "\x81\x2d\x98\xdf\x59\xec\x53\xbc\x2a\xf4\x36\xfd\x33\x6d\x19\xa7"
- "\x55\x84\xd6\xdb\xb4\x5d\xa8\xb7\x2d\xa1\xf5\x36\xad\x31\xbc\xde"
- "\xa6\xb5\xa3\xde\xb6\x0c\xd4\xdb\x34\xdf\xe0\xfb\x14\xd3\x93\xb4"
- "\x3a\x9b\x6e\x1a\xbc\xce\xa6\x17\x84\xd6\xd9\xf4\xb2\xd0\x3a\x9b"
- "\xbe\x53\xe8\x6c\x7a\x9b\x56\x67\xd3\xf7\x69\x75\x86\x72\xbb\x64"
- "\x3a\x9b\x31\x26\x48\x67\x4b\x8f\xc1\x8c\x0f\x51\x67\x2d\x42\x67"
- "\x19\x2f\x6b\xcb\x38\x23\x3d\xb4\xce\x66\x64\xa3\xce\x96\x86\xd6"
- "\xd9\x8c\xc2\xf0\x3a\x9b\x51\x89\x3a\x5b\x3a\x50\x67\x33\x76\x0f"
- "\x5e\x67\x33\xda\xb5\x3a\x9b\x71\x60\xf0\x3a\xcb\x48\x0c\xad\xb3"
- "\x8c\xd4\xd0\x3a\xcb\xb0\x08\x9d\x65\x94\x6b\x75\x96\x91\xa7\xd5"
- "\x19\xca\xed\x22\x75\x86\xfa\x49\x17\xeb\x75\x33\xfe\xda\xc5\xe7"
- "\xb4\x33\x3a\x5c\x90\xb9\x5b\xbc\x13\xc8\xe4\xd8\x91\x75\xf8\x31"
- "\xd2\xb4\x0d\x6c\xbb\x33\xf5\x72\xd8\xd3\x03\xf5\x90\x69\xc6\x76"
- "\xb5\xb3\xa1\x90\xaf\xeb\x12\x3a\x24\x99\x23\x9d\x98\x23\xcb\x4c"
- "\xa5\xb4\xa8\x63\xe6\xf4\xfa\x80\xda\x62\xa4\xf7\x10\x1f\xda\xaf"
- "\x24\x88\x57\xee\x60\xfa\x65\xe1\xd7\x98\xff\x25\xdd\xb1\xee\x76"
- "\xe4\xf7\xf8\x7a\x81\xd5\xcc\xe0\xfe\x6f\x2d\xc6\x3d\x29\x70\x3a"
- "\x33\x68\xce\x24\x33\x4c\xff\xf7\x71\xea\xff\xd6\x86\xc6\xe9\xe3"
- "\xe7\xe8\xff\x3e\x4e\xfd\xdf\x5a\xd5\x78\x75\xc4\x5c\x9f\x2b\x68"
- "\xbc\xfa\x78\x4e\xac\x47\x60\x87\xf7\x63\x37\xfe\x25\xbd\xdb\xfe"
- "\x78\x59\x50\x99\x51\x37\x4f\x44\xca\x65\x0e\xd2\xcf\xe3\x3b\xc3"
- "\x94\x79\x1f\x96\xf9\xe3\x30\x65\x6e\x3d\x47\x99\xa9\x6d\xfe\x78"
- "\xa0\x6d\x3d\x11\x2d\xe3\x20\xc4\xb8\xfc\x89\xc4\xd0\xfa\x7f\x22"
- "\x48\xff\x60\x29\x28\x64\x6e\x9e\x5e\x4b\x67\x55\xd3\xd1\x5a\x7d"
- "\xa2\x25\x8c\x84\xa0\xad\x08\xe6\x19\x86\x6e\xdf\x00\xec\xd1\xb7"
- "\x05\x21\xb1\xf7\x44\x87\xb0\xc7\x99\xa9\x5a\x7b\x9c\x09\x5a\x7b"
- "\x44\x59\x6b\xd2\xcd\x34\x6b\xe3\x33\xdd\x97\xce\xc7\xce\x2c\x0f"
- "\xc2\xc0\xe7\xc7\x20\x2b\x46\x60\x20\x6b\x61\x50\x39\xea\x43\x63"
- "\x60\xa6\x03\xeb\xff\x79\x68\x0c\xcc\x6c\x0b\x8f\x81\x99\xb4\x86"
- "\xf8\x73\x35\x6e\x67\x16\xa6\x0e\xd3\xd2\x64\xc5\x87\xf6\x79\x59"
- "\x13\x43\xcf\xeb\x64\x4d\x13\x32\xce\xda\xa0\x95\x71\x56\x8e\x56"
- "\x86\x58\x97\x8b\x97\x61\xdf\xbe\x61\xdd\xf6\xac\x60\xfb\x77\x1e"
- "\x83\x27\x65\xfb\x7f\x6a\x7a\x50\x19\xe5\xf1\x4f\xa8\xb9\xac\x27"
- "\xa3\x51\x96\xce\xd0\xb2\x7c\x32\x31\x74\x9d\x9f\x4c\xc5\x36\xc8"
- "\x19\x18\x60\x4b\x4f\x5a\x30\x7c\x26\x3f\x2b\xf2\x2c\x18\x6b\x30"
- "\x7c\xa6\x0f\x0c\xbc\xbd\xea\x6b\x97\x9e\x2c\xa4\x39\x72\x3e\xc7"
- "\x8c\xf8\x8d\x8d\x87\x4c\x6a\x83\xa8\x5c\xf3\x0a\x83\xdf\x89\x3e"
- "\xc9\xe7\x3f\x68\x1d\x0b\x7d\x57\x13\x6b\x83\x4c\xa7\xc7\x07\x0a"
- "\xde\x89\x3e\x88\x77\x2b\xd9\x05\xd1\x2b\xb4\x62\xae\xb3\x38\xc8"
- "\x37\x3d\x05\xa1\x75\xfc\x94\x29\x3c\x76\x9e\x9a\x28\xf4\xfc\x94"
- "\x55\xab\xe7\xa7\xa6\x05\xec\xc3\xb3\xa8\xae\x88\x81\x41\xd9\x09"
- "\xbd\x3b\x0d\xeb\xef\x5f\x99\xd5\x9a\xb7\x0e\xae\x3b\x0e\x4f\xb5"
- "\xf0\xfc\x24\xe6\x8d\x5d\xaf\x83\x06\xee\x03\x9e\x16\x67\x12\x22"
- "\xcd\x3c\x1f\x48\xec\x95\x97\x5a\x29\xae\xd6\xce\xbc\xfc\x2c\x4c"
- "\x3b\x6b\xa1\xfd\x7e\x10\x0b\x57\x1c\x85\xa7\xbe\xd1\xa4\xc7\x56"
- "\xcf\x29\x78\x24\x88\xf9\xfd\xa7\xcd\xca\x3c\x7c\xb8\xf9\x7d\xa4"
- "\x49\x53\xd6\xfd\x8a\x77\x61\x4f\x27\x87\x6d\x97\xb1\x4c\xf4\xed"
- "\x38\x95\xe9\xdc\x7e\xe0\xe9\x4a\x05\xbf\xe2\xdd\xdc\xd3\xf5\xfd"
- "\xdf\xb6\x3c\xbd\x07\xe3\x66\x9f\x63\x3e\x57\x65\x07\x4f\xbb\xd4"
- "\x7c\xc4\xde\x79\x4f\x7b\x94\xef\x53\xba\xed\x16\x38\x0f\x2f\xb9"
- "\x3c\x96\x44\x6d\x79\x2c\xc9\xd8\xb7\x9c\x2d\xf3\x48\x3b\x0f\x8f"
- "\x38\xe7\xce\x49\x30\x2e\x00\x11\xc7\xe1\xd9\xd7\x2a\x68\x8d\x4e"
- "\x55\x07\x44\xfb\x40\x2f\xc6\x76\x96\x37\xe9\xdb\x10\x1a\x1b\x3a"
- "\x7d\xf7\x3b\xe8\x1d\x1c\x5f\x43\x60\xba\xdf\xd1\x64\xf3\xcb\x7b"
- "\x9b\x59\xde\x23\x99\x36\x59\x4f\x39\xaa\xb6\xb3\x8e\x6a\xbe\xa7"
- "\x95\x45\x33\xfe\x2b\xa3\xf5\x3f\xb4\x0e\x63\x1d\xdc\x7f\x0c\x9e"
- "\x79\x40\xd8\xfa\xb3\x41\x7d\x52\x4b\x98\xf1\x9f\x85\xc6\x7f\xf7"
- "\x87\xb6\xf3\x67\xce\x31\xfe\x7b\x86\xc6\x7f\xf7\xab\xdb\x4d\xf1"
- "\x9e\xe7\x99\x34\x75\x9f\x94\xf6\x9d\x32\x3f\x4f\xfd\xcc\x67\xfe"
- "\xf3\xb6\x0a\x30\xfa\xe8\x9d\x36\xda\xa6\xb3\xa3\x81\xec\xd5\xd8"
- "\xe4\xde\x4b\xfb\x30\x18\xe8\x0c\x6f\xd1\x96\x91\xbd\x3e\xc3\xe7"
- "\x0b\x63\x7d\xc2\x16\x8b\x6c\xcc\x3d\xa6\x1d\x31\xb4\xd4\xaa\xf0"
- "\x2a\x58\x6b\x15\xdf\x7d\x0c\x6f\x87\x61\xce\x0e\xde\x2e\xea\xa8"
- "\xbf\xca\xfb\xad\xbe\x6f\x81\xf8\xee\x2f\x6c\x02\xe2\x1b\xe8\x6b"
- "\x27\x39\xef\x76\xb2\x71\xe2\x49\xbc\x9b\x91\x8e\xf8\x12\x9d\x52"
- "\x0f\xf1\x6d\xcc\xb3\xd1\xea\xba\xf3\xf9\x17\xcc\x1b\xc3\xa7\xd2"
- "\xbc\x8a\x93\xd2\x15\xcd\x62\xe3\xda\xe9\x9d\xd9\x29\x07\x2b\x7a"
- "\x89\x8d\x5b\x46\x73\x62\xcf\xf2\x73\xda\x3f\xfe\x1f\xd7\x90\x82"
- "\x51\x60\x90\xc3\xb2\x1a\xcc\x5e\xc4\xdb\xb3\x95\x5a\x1f\xf1\x6c"
- "\x50\xff\xd7\xc2\xc7\x99\x78\xcf\xa5\xf5\x89\xf2\xfa\x55\xf2\x07"
- "\xcc\xe9\xeb\xe6\xf8\x38\xd7\x9a\x0a\x7a\x27\x4d\x6b\xa2\xc4\xbe"
- "\x6a\xcf\xba\x82\xe6\xde\xdc\x9b\xf9\xba\x9a\xc3\x98\xef\xac\xc5"
- "\x02\x23\xb3\x17\x6b\x75\x3a\x0b\x8a\x4e\xd0\xbb\x20\xd1\x1e\xcc"
- "\xf5\x05\xfb\xc7\x59\x66\xa5\xef\x16\x14\x9e\xac\xb4\x07\xe6\x25"
- "\x9c\x6f\x50\x3b\x33\x8b\xf7\xff\xfd\x03\xda\x85\x59\x79\x58\x3f"
- "\x0d\x26\x9b\x39\x86\x66\x95\x34\x79\x10\x37\xcb\x08\xff\xb3\x69"
- "\xed\xcb\x7a\xfa\xe6\x10\x9f\x87\x9d\x84\x59\x7b\xfd\x76\x30\x34"
- "\xb9\xf9\x37\x55\x46\xc4\x08\xc7\x2d\xb5\x1b\xe3\xc5\x7a\x24\x4f"
- "\x50\x1e\x07\x15\x99\x13\x4d\xf3\xb2\xc3\x20\xd6\x53\x10\x16\x66"
- "\xd5\xd3\xda\x8c\xe1\x9d\x30\x8c\x78\x29\x18\x72\xfa\x5a\xa1\xd9"
- "\x17\x3c\xe6\x99\x1d\x1f\xba\xee\xb3\xa9\xfd\x7f\xdd\x05\xb3\xcb"
- "\xb4\xba\x9d\xcd\xdb\x7f\xe5\xbd\x8e\x0b\x65\x10\x94\x2e\x57\xab"
- "\xfb\x59\x3c\xbf\xb0\x6b\x7c\x4a\xfe\x32\x0d\xc7\x33\xf3\x3c\x7c"
- "\xbd\xd7\x6c\xb4\xff\x67\xf7\x9d\xcb\x0f\x32\xc3\x5f\xa6\x05\x90"
- "\x56\x5e\x17\x8c\x7e\x6b\xb6\x5b\x33\x67\x34\x92\xcf\x19\xcd\x3b"
- "\x06\x73\xe4\x77\x3f\x73\xef\xd4\x96\x6f\x4e\x74\xf8\xbe\xc1\x1c"
- "\x7a\xff\x33\x2f\xb4\xcf\x98\x93\x16\xba\x6f\x30\x67\xb6\xec\x17"
- "\xe6\xb1\xc8\x60\x1c\xcc\xb1\xa1\x8e\x79\x1a\x65\x0c\x4b\x73\xa1"
- "\xe1\xc7\xb0\x73\xea\xfb\xc6\xb0\xcb\xc8\x1f\xcc\x29\xef\x1b\xc3"
- "\xba\x43\x8d\x61\x5d\x21\xf4\x39\xa7\x33\xb4\x3e\xe7\xea\x43\x8f"
- "\x61\xe7\xc6\x8b\x76\x7e\x6e\xa6\x56\xcf\x73\x27\xf6\xbf\x13\x9e"
- "\x13\x7d\xe9\xfa\xc3\x73\xeb\x06\xf6\x87\xe7\x5d\x2b\x74\x35\x6f"
- "\x4e\x50\xd9\xf6\x86\xf6\xed\x73\x5b\xc2\xf7\x87\xe7\x76\x86\xf7"
- "\xed\xf3\x0c\x03\xfb\xc3\xe6\xa1\x41\x34\x63\xfa\xfa\x4a\x9a\xbe"
- "\xd9\xbc\x34\x21\xa7\x79\xd4\x9f\x8b\x50\xd1\xcf\xd6\xe2\x1d\xcb"
- "\x8c\xfc\xd0\xb7\x1d\x27\x9f\xa6\x60\x26\x9c\x4c\x68\xef\xa5\x1b"
- "\x2b\x20\x12\x6d\xe0\xf3\x6e\xfb\xbc\x3e\xfc\xd3\x3a\x3e\xca\x87"
- "\x7c\x64\xd8\xf5\x74\x92\x52\x3e\x5e\x8e\xf6\x73\xbd\x2f\x8d\x30"
- "\x41\xe6\xd6\x01\xf2\xc8\xe6\xfd\x3f\xe2\x71\x6e\x9d\x65\x67\x05"
- "\xd9\x98\x47\xac\xc3\x9d\x3f\x4a\xe8\x6d\x7e\xd0\x58\x36\x3b\x8f"
- "\x7f\xd3\x17\xd6\xdf\x66\x97\x87\xc6\x68\x76\x7d\x9f\xbf\x5d\x46"
- "\x7c\xb3\xbf\x0e\x8a\x6f\x14\x3a\x98\x6f\x0e\x44\xaa\xe7\xba\xb3"
- "\x5d\x5a\x9f\x94\xdd\xa8\x4d\x37\x3f\x68\xfc\x97\x9d\x47\xf1\x17"
- "\xd6\xde\xcc\xcf\x0c\xdf\xde\xcc\x3f\x22\xea\xbf\x20\xe8\xfd\xf2"
- "\xfc\xbc\x73\xb7\x37\xf3\xc3\xd4\x7f\x7e\xbd\xb6\xbd\x59\x10\xf4"
- "\x8e\x7e\x7e\x63\xe8\xf6\x66\xbe\x4b\xf1\x33\xc2\x6f\x2c\xb8\xe7"
- "\xc2\xfc\xcd\x02\x93\xd6\xdf\x2c\x80\xf3\xf9\x9b\xfd\x03\xfc\xcd"
- "\x82\xd9\xb1\x55\xa1\xea\xb2\xa0\x20\xb4\xbf\x59\x50\x26\x74\xb8"
- "\xa0\x5d\xeb\x6f\x16\xec\xd4\xea\x70\x7e\x90\x0e\x17\x04\xbd\xff"
- "\x9e\x9f\xf7\x5d\x7d\x52\x44\x44\x84\x14\xa1\x93\x74\x11\x40\x87"
- "\x51\xe9\x60\x58\x84\x3e\x62\x08\x5e\x43\xe5\xfb\x30\x29\x42\xd2"
- "\xe3\x35\x44\xbe\x0f\x0d\x7a\x1e\x46\x69\xf1\xd2\xcb\xf7\x21\x41"
- "\xcf\x43\xcf\x13\x3f\x4c\xce\x57\xc9\x5f\x1f\xf4\x3c\xe4\x3c\xf1"
- "\x43\x2f\x32\x3d\x0c\x78\xd6\x7e\x07\x39\x75\xc9\x8a\xf9\xb9\x8b"
- "\x72\xf8\xba\xf6\x85\xe6\xf9\xcf\x3d\xb7\x30\x3f\xdf\x5c\xb0\xd4"
- "\xfc\xe0\x03\x4f\xdc\x3e\xc9\x2c\x96\xc7\xe7\x4e\xbe\x29\x27\x0a"
- "\xa6\xaf\x5c\x46\x11\xd3\x67\x4e\xb5\x98\x33\x1f\x7c\x40\x1b\xa9"
- "\xb0\xe1\xcb\xe0\xcf\xc5\x45\x65\x7b\xa9\x1b\x47\x02\x94\x6d\xe7"
- "\x7e\xa7\x9d\xbe\x3d\x17\xe3\x89\x45\x0f\x1c\xa0\xef\x97\x7b\x8a"
- "\x18\x7d\x57\x71\x14\x72\xfe\x44\x95\x18\x5b\x57\x0c\x79\x0b\x68"
- "\x3f\x95\x85\x3a\xf6\x4b\x37\x98\x1f\x05\xe9\x28\x2c\x79\xbc\x21"
- "\x1d\x69\xf1\xd9\xe9\xf2\x81\xb9\x88\xfa\xb6\xd6\xbf\x62\x9c\x8e"
- "\xdd\x17\xc0\x30\x8f\xfc\x7d\xbe\x55\xc7\xc3\x7e\x59\xac\xd0\xc5"
- "\x1e\x83\x85\xef\xb2\x5f\x32\xfe\x4c\x7b\xd6\x08\xba\x85\xab\x98"
- "\x94\x93\x4c\x7e\xa1\x6a\x04\xe8\x69\x5d\xf6\x9b\x23\xc0\xf0\xe6"
- "\x48\xda\xcb\x76\x61\xae\xb2\x2e\x7b\x23\x3e\xbb\x60\x49\x26\xe5"
- "\x4d\xb4\x01\x29\x67\x01\xd1\xd7\x68\xe9\xab\xfa\xd7\x71\x2f\xcc"
- "\x95\x90\x2e\xe3\x6b\x88\x8d\xf5\xb3\xbf\x7a\xa3\xbe\x2e\x1e\x97"
- "\x8e\xfd\x34\x54\xc5\x01\x5f\x31\x88\x6f\xa3\x16\xfe\x69\x95\x9f"
- "\xf9\x68\xcf\x84\xe9\x9d\x45\x6c\xcb\x62\xd0\xa3\x3d\xeb\x1c\xcb"
- "\xe8\x5b\x8a\x85\x07\x6a\x17\x82\x1e\xeb\x1f\x7f\x1c\x9e\xf7\x99"
- "\x67\x60\xbf\x71\x3a\xe8\x7f\x6b\xa3\xef\x5d\x3b\xdf\xda\xfc\x07"
- "\xd0\x7f\xd0\x53\x2c\xf5\x30\x13\x14\x16\xb0\x0e\x46\xfb\x5b\x7b"
- "\x98\x97\xd6\xdb\x1e\xc8\xf6\x13\x4d\x69\x77\x91\x09\x9a\x0b\x3c"
- "\xb0\xb6\x8d\x79\x4b\xfe\x20\xf6\xab\x68\xea\xf4\xd0\xf7\xb3\x86"
- "\xb5\xd3\x21\xe2\x98\x05\xa4\x26\x6b\x25\x38\x67\x7b\xa0\xb0\x8d"
- "\x75\x1c\xc8\xfe\x13\x34\x5b\x77\xc3\xbc\x56\x90\x0e\xb4\x1f\x01"
- "\xbe\x47\xf3\xe6\x04\x5a\x27\x6e\x5a\xbb\x88\xc2\xbe\x85\xd5\x6b"
- "\x21\x66\xf5\x1f\x69\x1c\xd4\x8a\xf9\x9c\x80\x67\x0f\x82\x0e\xf9"
- "\x49\x6b\x8e\x80\x69\xcd\x33\xf4\x9d\x79\x2a\x54\xad\x03\x13\x2b"
- "\x4a\x8c\xee\x29\x4a\x34\xf6\xb0\xc4\x11\xdd\x45\x89\x71\xcd\x79"
- "\x48\xdf\xfe\x19\x0c\x6f\x85\xb8\x5f\x1e\x6f\x95\x2a\x4f\x43\x3c"
- "\xd5\xe9\x18\xd6\xad\xea\x34\xd2\x97\x9e\x75\x04\x30\xad\x3a\x8d"
- "\x2f\xf2\x6c\xab\xd3\xe2\x85\x00\xf2\xaa\xec\x81\xf8\xaa\x1e\x30"
- "\x05\x36\x9e\x75\x50\xba\x4e\x78\xe1\xac\xf3\x00\x40\xe1\x5a\xe6"
- "\xef\x2d\xfd\xa6\x18\xfd\xe1\xb0\x8f\x17\xec\xd5\x3b\x0f\x74\x42"
- "\x93\xa7\x07\x9a\xe1\x30\x38\x6d\x7f\x76\x7c\xb0\x60\xef\x10\xec"
- "\x4f\xea\x1c\xab\x69\x0d\xbc\xc0\x4e\x51\x13\xed\x9f\x57\x0c\x5b"
- "\xd6\x41\x74\xde\x6a\x18\x76\x1c\xc3\xb9\xef\x29\x69\x2b\x71\xfa"
- "\xfe\xec\x58\xcd\xbf\x07\x5f\x92\xb9\xae\x09\x22\x9a\x3d\x95\xf4"
- "\xdd\xb1\xe4\x1f\x9e\x60\x74\x7a\x5a\xc0\x99\xf7\x95\x23\x10\x7d"
- "\xa3\xb7\x2c\x00\x86\x0f\xcf\xb4\x48\x4e\xfd\x19\x70\x5a\x3c\xf0"
- "\x39\xe6\xcd\x36\x27\xc4\xa3\xcf\x4a\x6d\xf6\x78\x69\xff\x9d\x24"
- "\xd6\x65\x8a\xda\xb2\x0c\xc6\xd4\x9c\x86\x84\xea\xd3\x90\xc8\xba"
- "\x13\x25\xfa\xc6\x9b\xf6\x4b\xab\xc6\x7b\x34\x8e\xc1\xb0\xee\xe2"
- "\x3b\xee\x18\xf9\x5b\xef\xde\x44\xa8\xed\xe9\xff\xd6\xbb\xa7\xab"
- "\xff\x5b\x6f\xc4\x54\x1e\x7d\xef\xed\x82\x17\xf4\xb1\x07\x60\xd8"
- "\x51\x58\x98\x48\xf8\xde\x72\x12\xf4\xaf\x9c\x04\x18\x57\x2c\xd1"
- "\x38\x53\x8f\xd8\xff\x93\x13\x75\x43\xbf\x8f\x82\xb5\x0a\xef\xd1"
- "\x78\xe1\x78\xce\xca\xf7\xaa\x68\x97\x71\x8c\x61\x12\x86\xbd\x8a"
- "\xf7\x08\xbc\xaf\x2d\xaa\x62\x6e\xcc\x8b\xf6\xa0\x89\x22\x3c\xcb"
- "\xdf\x97\x5b\xba\xed\xd6\x02\x17\xbc\x56\xa8\xe0\x5a\xf8\xf7\x85"
- "\x79\x9f\x1f\x3d\x41\xfb\xa8\xbb\x79\xb9\x7a\xad\x3a\xda\x53\x5d"
- "\x0e\xa7\x32\x1c\xa1\x7c\x31\x7f\x07\xde\x63\xc5\x18\xd4\x9a\xa5"
- "\xa4\xed\xea\xb5\x52\x9e\x7f\xc4\x70\xa6\x84\x63\xbd\xf5\x14\xf7"
- "\x8b\xa3\x27\x24\x41\x93\x28\x21\x4f\xaf\xcc\x1f\x6d\x7f\x61\x1c"
- "\xd9\x78\x97\x14\xcb\xf6\x67\x4f\x84\xaa\xed\xec\x40\xf5\x76\xd6"
- "\x20\x6c\x6f\x91\xc9\x05\xaf\x3b\xa8\x8c\xd8\x86\x37\x94\x61\xdc"
- "\x7e\x33\x00\xc9\xa5\x21\x87\xd6\x97\x2e\x4a\x76\xc1\x65\x09\xea"
- "\x3a\x30\xfb\x73\x26\x6a\x47\x3f\x5a\xd7\x38\x04\x7d\x80\xa9\xb9"
- "\xbd\x13\x3e\xe8\xe9\x18\x52\xf4\x1b\x90\x9c\xbe\xa3\x30\x3e\x0e"
- "\x4c\x34\x27\x53\xbb\x9d\xb9\xf0\xde\x81\x57\x27\xe2\xe5\xda\xe3"
- "\xb0\xe8\xd5\xdb\xe2\x20\xee\x77\x36\x90\xfd\xd3\xa2\x6a\x95\x7f"
- "\xba\xa9\xc9\xb5\x57\xe5\x9b\x16\xff\x71\xa0\x6f\xca\xfd\xbd\xf0"
- "\x4d\x68\xfb\xdc\x17\xf9\x5d\x72\xf8\x67\x41\xe1\xf2\xf7\x2b\xb9"
- "\x6f\x07\x85\x7b\xe5\xf0\x4d\x41\xe1\x6e\x11\xfe\x52\x93\xe2\xfb"
- "\x9a\xa9\x1c\x2b\xc9\xf7\xbd\xf4\x09\xf9\xbe\xe6\x6c\xd9\xf7\x71"
- "\xff\xf3\xd2\x36\xf6\x13\xf4\x45\x2b\xc8\xdf\xbc\xb4\x98\xca\xcf"
- "\x7e\x09\x4a\xd9\x23\x31\x6c\x2c\x85\x95\x1f\x06\x3d\x5e\x8a\xdf"
- "\x2b\x22\xbf\x47\x3e\x8f\x7c\xdf\x8e\x91\xac\x75\xc7\x76\x76\xb0"
- "\x8a\xef\x0b\xfd\x62\x9f\xff\xfb\x31\x86\x95\x61\xd8\x8f\x31\x9e"
- "\xfc\x20\xc9\xa4\xc9\xb2\x97\xe6\x06\xda\x59\x49\x67\x65\x40\x4a"
- "\x82\xcd\xa8\x6f\xda\xff\x6a\x03\xca\x37\x56\x07\x79\xce\x02\x0f"
- "\xff\x0e\x85\xf6\x20\x6f\x2e\x68\x27\xbb\x1b\xf9\x4a\x80\xe6\x29"
- "\xfe\x04\xeb\x3c\xec\x38\x7d\xab\x42\x65\x98\xb7\xea\x51\xda\x4b"
- "\x5b\xd7\x60\x05\xa0\x7d\x09\xc8\x67\x63\x59\xf4\xe5\x58\x26\xb1"
- "\xff\xef\x4b\x09\xd8\x93\x49\x17\xba\x5e\x92\x49\xfb\xf5\x1f\x85"
- "\x17\xad\xcc\x8e\xfe\x11\xeb\x16\xeb\x2f\x06\xda\x9b\x05\x6d\x8c"
- "\xf6\xd3\xb2\xee\x90\x02\xd6\x72\x65\x7f\x16\x3a\xbb\x01\x69\x9c"
- "\xad\x5e\xa0\x32\xbb\xe0\xc5\x3d\x4d\x85\x7b\x29\xbd\x85\x64\xc3"
- "\xec\x45\x0a\x0f\x1d\xe7\x21\xf1\xb9\x5b\xab\x0b\x5e\x4a\xe7\xe9"
- "\xa3\xbe\x29\x6e\x9a\xed\x06\xf2\xfb\xce\x0e\xe4\x51\x78\x54\xf0"
- "\x40\x5e\x0c\xdb\x00\x4d\x9c\xcc\x3f\x66\x2d\xfb\x2b\xf2\x4f\x20"
- "\x7d\xd1\x3e\x5d\xb4\x4e\x09\xe5\x12\x4d\x7b\x35\x88\x7e\xe8\x8b"
- "\x1f\xd6\x1e\x06\x90\xf7\x1a\x43\xbc\xbd\xb8\x8b\xf6\xf2\xa2\xfd"
- "\xc5\xce\xb5\xb7\x18\xca\x28\x41\xd9\x5f\x2c\xb0\xf2\xd2\xee\x2d"
- "\x86\xbc\x4d\x35\x12\xdb\x8d\xe5\xdf\x45\xfb\x8b\x61\xf9\xa3\x09"
- "\x87\x72\x9d\x76\x6f\x7b\x96\x64\xbe\xc8\x43\x61\x5b\xec\xac\x51"
- "\xd1\x3f\xd5\x97\xea\x82\x71\xad\xa2\x7f\xc8\x5a\x5c\x90\xbb\x9b"
- "\xe2\x31\xac\x81\xe8\xc7\xa3\x1f\x73\x62\x1b\xf6\xf1\x51\xbf\xb4"
- "\x65\x35\xe8\x85\x4f\x5b\xfc\x1b\x4a\x2f\x7c\xda\xe2\xe2\x7e\x9f"
- "\xb6\x78\xb9\xf0\x69\x42\xc6\xc2\xa7\x2d\x5e\x24\x7c\xda\xe2\xf9"
- "\x7c\x3d\x11\xfa\x34\x8a\x23\xbf\xa6\xf8\xb4\xea\x91\xac\x91\x7c"
- "\x47\xb7\x7d\x71\xa6\xe2\xdb\x36\x61\x18\xf9\x0e\x2a\xa3\xf0\x53"
- "\x2f\xd5\xb3\x2f\x13\x41\xac\xd7\xa4\xdf\x56\xda\x3f\xa3\x43\xfe"
- "\x8d\x7a\x59\xfc\x2b\xe1\xe3\x16\xef\xec\xf7\x71\x8b\x13\xfb\xd3"
- "\x92\x8f\x5b\xfc\x9f\xc2\xc7\x89\xf0\xda\x67\xc9\xc7\xbd\x54\x4f"
- "\x32\x90\xf9\x4b\xf4\x1e\x4d\xa6\x47\x39\x2e\xda\xad\xf6\x71\x5a"
- "\xfb\x5a\xec\x53\x7c\x1c\xf9\xb6\x6e\xfb\x92\x68\x17\x44\xf1\xfd"
- "\x51\xc8\xce\x2a\x50\xe6\x8a\xdd\x91\x0e\xa8\xce\xb4\x2f\x3f\xc9"
- "\xed\xa1\x13\x30\x4c\xde\xb7\x46\xae\xf7\x92\x74\xe5\x1b\x4d\x17"
- "\x2c\x1e\xb8\xa7\x19\xf4\xef\x4b\x86\xba\xbe\x9e\xf6\x73\x74\x16"
- "\x1f\x05\x67\x25\x2b\x6e\xf6\xb5\x41\xe0\x95\x97\xbe\x26\xbd\xe2"
- "\x78\xe3\x5e\xba\x93\xdf\xc1\x76\x74\xe3\x3c\x0f\x9f\xbf\xff\x7a"
- "\x8b\x84\x71\x36\x4d\xdc\xbb\x94\x07\xcd\x2b\xe2\xef\xbc\x70\xf3"
- "\x08\x83\xc8\xeb\xdb\xf0\x79\x2d\xbd\x9c\xe7\x85\x7d\x29\x1c\xf7"
- "\x5c\x7e\x12\x96\xf0\x77\x68\x7c\x4f\xe6\x90\xbc\x96\x3e\x20\xc7"
- "\x47\x84\x89\x9f\x7f\x9e\xf4\xeb\xcf\x93\xfe\x6d\xf2\x41\xf4\x3d"
- "\x9e\xdf\xae\xe5\x33\xdc\xa7\xd0\x1d\x27\xba\xdf\xc8\xef\x41\xbe"
- "\x2e\x1a\xc5\xc7\x65\x26\x85\x27\xe1\x6e\x33\xd2\xf1\xfd\x6b\xd1"
- "\x47\xa6\xad\x02\xda\x3b\x58\x95\x36\x6f\x48\xbf\x7c\x97\xee\x3d"
- "\xc7\x3c\x4d\xb4\xb3\x12\xf8\xd9\x2f\xfb\xb1\x2f\x4a\xdf\xd2\x54"
- "\xf4\xbd\x7b\xc8\x9b\x8d\xfe\x32\x9b\x7f\xb7\x26\xbe\xdb\xed\x44"
- "\xff\x76\x3d\xed\xb1\x49\xfd\x4a\xf9\x5b\x8b\xab\xd0\x2f\x8f\xa0"
- "\x7d\x58\x68\xbe\x7a\x9e\x3f\x53\xda\xcf\xf7\xc4\xcf\xab\x54\xd2"
- "\x86\x9b\xdb\xa3\x7c\xe5\x3c\xf9\x77\x48\x98\xe6\x80\x92\x86\x78"
- "\xd3\xb7\x37\xd8\x1e\x5f\xcf\xf7\x37\xf3\x75\x92\x0f\xbc\x0a\xfb"
- "\xa0\x23\x44\x3e\xd9\x20\xf2\x79\x19\xed\x66\xc9\x81\x73\x7d\xe7"
- "\x14\xbe\x7e\x2f\xa7\x0c\xbe\x7e\x20\xd7\xef\x65\xdb\x79\xea\x77"
- "\xae\x7c\xf7\x0c\x3e\x5f\xa3\x92\xaf\x7b\xf0\x72\x5d\x96\x70\xe1"
- "\x72\x4d\x92\xe5\xba\xcc\x72\x1e\xb9\x86\xca\xa7\xec\xc2\xf3\x31"
- "\x2b\xf9\x38\x42\xe5\x03\xfc\x2f\xec\x7e\x3d\x06\xe5\xec\x15\x3a"
- "\x87\x48\x9c\x89\x90\x6f\x50\x9f\x31\x25\xce\x27\xca\x8f\x57\xce"
- "\x98\xea\xff\x8e\x2b\xff\x9e\x79\x75\xd4\xae\xb3\x80\x0b\xf2\x53"
- "\x68\xae\x2d\x6d\xad\xd8\x1f\x50\x4e\x93\x79\x9e\xb3\xad\xf4\xb4"
- "\x17\x3b\xe5\xcd\x18\xdf\x8b\xc5\x23\xf6\xd9\xcb\x7f\x8d\xbe\xc9"
- "\x13\x6b\x76\xf2\x1d\xc2\xfe\xf3\xab\x5c\xb0\x4c\xec\x39\x55\xfa"
- "\xcd\xd6\xae\x22\x99\xfe\x1a\x6a\x93\xfa\x68\x1c\x0a\x4d\xc8\x39"
- "\xbf\x52\xef\xee\x9d\xeb\x92\x34\xdf\x0f\x4e\x59\xb6\x6c\xe9\xb2"
- "\x49\xe6\xfc\xc5\x0b\xc6\xe6\x17\xcc\x2f\x58\x9e\xcf\x3f\x34\x8f"
- "\x02\x0c\x30\x17\x2c\x5a\xbc\x70\xe9\xf2\x82\xc4\x95\xf3\x17\x89"
- "\x0f\xd3\x47\x23\xa1\x9a\x08\x34\xe7\x91\x98\xd0\x87\xb4\x30\x89"
- "\xef\x21\xd1\x49\x75\xa2\xbd\x44\x94\xef\x6e\x1b\x4c\x00\x1e\x3b"
- "\xf9\x9c\x82\x1c\x17\x58\x32\x15\x39\xd2\xfe\x86\xd8\xef\x30\x1d"
- "\x87\x82\xf5\xa4\xfb\x0c\xec\x42\xd6\x8a\x7d\x21\xf8\xb7\xfd\xce"
- "\x02\x0c\x68\x06\x83\x63\x05\xcd\xa3\x16\x78\x03\xf6\xfc\x0e\xbe"
- "\x5f\xe3\xea\xe3\xf8\xbc\xfc\x5a\xa5\x9d\xa7\xf7\x42\xe2\x3d\xee"
- "\xf5\xf7\x1f\x85\x82\xe9\x94\x2f\xd9\x4d\xcd\xeb\xa0\x27\x5e\xcc"
- "\x5e\x40\xdf\x44\x03\x3e\x1b\xb0\x0c\x1d\x4a\x5f\x12\xcb\x1b\xcd"
- "\x22\xbd\x75\x2e\x58\x1e\xff\x5f\x46\x37\xc8\xdf\x6a\x1b\x6a\xc4"
- "\x77\xd9\xfa\x6e\xfb\xf2\xb8\x3e\x5a\x3b\xed\x5b\xec\xad\xa3\x73"
- "\xcb\x42\xca\x37\xea\x4c\x76\xa0\xd7\x32\x44\x5d\x67\x1c\x17\xa3"
- "\x7e\x96\x37\x61\xdd\xe3\x48\xd7\xf2\x7e\x22\x43\x31\xec\x53\xb1"
- "\x77\xf2\x99\x6c\x0c\x1b\x8a\x77\x1b\xe9\x94\xf6\x30\xc0\xb8\x12"
- "\x7a\xc7\xd5\x5c\x78\xca\xb1\xdf\x74\x14\x71\xbd\x1c\xfd\xdf\xdc"
- "\x0d\xe2\xbb\x33\xa4\xc7\x3c\x9c\xc5\x3d\xd0\x60\x66\x0e\x9a\x63"
- "\xc3\xb2\xb7\x37\x98\x3d\xc0\x22\x66\x7d\x4d\xe9\xd0\x2e\x4c\x45"
- "\x36\xea\x4b\x60\x38\xff\xbe\x6e\x79\xab\x22\xf3\x02\x33\x3b\x41"
- "\x34\xe1\xe6\x85\xa9\xbd\xdb\xc2\xdb\x82\xd3\x40\x6b\xa8\xda\x61"
- "\xb9\x2f\xd8\xdf\xdf\x94\x33\xc9\x9c\x33\xbf\xc0\x9c\xbb\x68\xc9"
- "\x42\x73\xce\xa2\x1c\xf3\x92\xa5\x05\xe6\x17\x96\xd2\x04\x0d\x4d"
- "\xc9\x68\x30\x11\xa0\xfa\xad\xb4\x0c\x51\xde\x41\x77\xad\xb4\x0e"
- "\xc5\xfa\xa3\x4c\x56\x3e\xd9\xd5\x6d\x1d\xa6\x95\xc9\xca\x7b\x04"
- "\x8e\x57\x94\x60\xd9\xc7\x88\xef\xf7\x22\x3a\xf0\x19\xeb\xbf\xdc"
- "\xad\xb5\xbd\x95\xaf\xca\xb4\x7b\x14\x5a\x8e\x8b\x1b\x8e\xf7\xc5"
- "\x6d\x91\xf1\x58\x2b\xbe\x33\xe6\xfb\xd6\xd4\xf2\x35\xf8\x2b\x3a"
- "\xc2\xa6\xa1\xbd\xba\x56\xc3\x73\x27\x61\xc5\xef\x99\x7d\x45\xbc"
- "\x8c\x21\x43\xa0\xe4\x4c\x9e\x8c\x1f\xc4\xc4\xca\xc4\x81\xf8\x59"
- "\xb9\x81\xf0\xc3\xba\x2d\x06\xbe\x5e\xc3\xe7\x45\x3f\x85\xcf\xd8"
- "\xbe\xba\x60\x45\x19\xd5\xc3\xb3\xd2\x62\x28\x7a\x93\xef\x9f\xf7"
- "\x0d\xbd\xfb\xa4\x33\x5f\x10\x2b\x91\x88\x0d\xd4\xd1\xca\x42\x45"
- "\x47\x0a\x7d\x68\x1b\xe6\x78\xd1\x62\x4c\xc8\xf3\x8f\x1c\x63\xd8"
- "\xbe\x63\x99\x24\x65\x9f\x3e\x6a\x03\xb0\x6c\x9d\x05\x6b\x19\xc3"
- "\x3c\x5c\x2a\x1c\x9c\x0c\x85\x03\xd4\xed\x73\xb9\x4b\x9f\x7b\x09"
- "\x0d\x7d\xd9\xc2\x82\xe7\xac\xb4\x37\x05\xf9\x01\xbe\xf1\xc5\x4d"
- "\x39\xe6\xe5\xf9\x0b\x9f\x8b\x82\x50\x54\x7d\x91\x6a\xfd\x1b\x03"
- "\x88\xd7\xae\x2e\xcb\x10\xfa\x46\x42\x7c\x13\xb1\xea\xdd\xae\x7c"
- "\x1c\x4b\x68\xf4\xbe\xea\x4d\xa7\x29\x09\xfb\x64\x49\xc0\xfb\xd0"
- "\x28\x33\xf1\x9e\x7f\xd5\x11\x92\x43\x97\xa4\xc3\xf6\xc0\x56\xa5"
- "\x60\x00\x7f\xd7\x63\x9d\xca\xfb\xd7\x58\xac\x6a\xeb\x92\x86\xb4"
- "\x91\xff\x11\xeb\x39\x8e\xa3\x1f\x88\xad\x3d\x0a\xab\xf8\x9c\x74"
- "\x0d\x6f\x4f\x6c\x6d\x4a\x9a\xcd\x7d\xdf\x29\xaf\x4a\x53\x70\xd2"
- "\x9f\xc6\xd6\x44\x61\x7c\xaf\x22\xfb\x4a\x2f\xe9\x9c\x09\xdd\xeb"
- "\x15\x3a\x94\x2b\xab\xe5\x7e\x64\x55\x52\xb0\x6f\xf8\x2f\x23\xbd"
- "\xd3\x16\xe5\xe1\xf8\x33\x9c\x49\xe7\xfb\x9e\x60\x5f\x0d\xcb\x33"
- "\x59\x5e\x5f\xd2\xc2\xdb\x74\x1b\xf2\xf2\x0a\x5e\xcc\x6e\xbb\x4e"
- "\xc9\x8b\x45\x9e\x49\xaf\xe5\x38\x5b\x55\xde\x3f\xe7\xb7\x2a\x85"
- "\xc6\xba\xac\xcb\x32\xd4\x05\xb6\x42\x8e\x2d\xfc\x5d\x70\xb5\xd8"
- "\x83\x8d\xf0\x46\xf5\x24\x5c\xf5\x63\x6a\x55\x8b\xa2\x6f\xaa\x33"
- "\xa6\xdb\x60\xe6\xfb\xf4\xae\xea\x50\x64\x19\x6e\xaf\x18\x6e\xb7"
- "\x06\x2c\x4b\xb7\xb0\x5d\x3e\x4e\x13\xfb\x03\xd1\x77\x2a\x11\x58"
- "\xc6\xbc\x63\xb0\xfa\x2c\xad\xbd\x8f\xf5\xd2\xb8\xe7\x0c\xdf\x5b"
- "\x46\x7c\x4b\xbe\x1a\xfb\xff\x2b\x52\xfa\xbf\x2d\x5f\x8d\xed\xbf"
- "\x2d\x45\xe8\x6e\xf5\xff\x4f\xdc\xfb\x80\x47\x55\x5d\x7b\xc3\x7b"
- "\x26\x03\x4c\xc2\x24\x13\x34\xe2\x88\x11\xc6\x36\x7a\xa3\x45\x8d"
- "\x4a\x79\x69\x5f\xac\x51\xf1\x5e\xbc\x0f\x0a\xb5\x7a\xdf\xf4\x96"
- "\x6b\x40\x12\x1b\x2a\xc2\x34\x84\x30\x60\xc8\x24\x03\xc6\x21\xe6"
- "\x9f\x12\x6d\x80\x10\xe2\x15\x6d\x6c\xb1\xa6\xb7\xb4\x46\x45\x1d"
- "\x25\xb6\xb1\x42\x26\x5a\xbc\x0d\x34\xd4\x21\xc6\x18\x70\x82\x43"
- "\x32\x64\x06\x32\x73\xf6\xf7\x5b\x7b\x9f\x33\x33\xc1\x84\x96\xde"
- "\xfb\x3c\x5f\x9e\x67\x72\xce\xd9\x67\x9f\xfd\x67\xed\xb5\xd7\x5e"
- "\x6b\xed\xb5\xd7\xca\x8b\x9b\x7b\x7e\x75\x3f\x7f\x0a\xc1\x88\xe8"
- "\x99\xc7\x7e\xb7\x98\xaf\xf2\xdc\xee\xc6\x3a\xed\x3b\xe1\x27\x20"
- "\x2c\xd7\xc4\x53\x6c\x63\x2b\xad\x11\xd4\x3e\x2f\xdb\x48\xf6\xd6"
- "\xc2\xee\x89\xd6\x5c\x81\x37\x16\x8a\x61\xb2\xf1\xe0\x79\x6d\xe8"
- "\xd1\xca\x52\xcb\xf6\x69\xcf\xe4\x37\xcc\xcb\x4a\xec\xed\xe9\x98"
- "\x53\x01\xd1\x87\xa9\xed\x45\x98\x5b\x01\xca\xf7\x78\x9a\x06\x43"
- "\xa4\x97\xe1\x19\xfc\x4f\x51\xa6\xdc\xd3\x09\x35\x4b\x5a\x54\x52"
- "\x44\x3e\xa9\x1c\x56\xf2\x2b\x38\x5f\xd2\x1b\xe1\x0b\x47\xbc\xbb"
- "\x59\x9d\xb3\x89\x74\xc6\x47\xd8\xb5\x04\xc2\x82\x36\x48\xdf\x09"
- "\x78\x8f\x39\x12\xa4\xd8\x2c\xa3\x05\x89\xb2\x6d\x8f\xbb\xa2\x75"
- "\x00\x27\xda\xc5\x1e\xe2\xe3\x76\xe9\x8b\x64\x0a\x64\xb5\xc7\x5b"
- "\xb4\xf1\xdb\xf2\x1c\xd2\x50\x26\xbe\x33\xb6\x0b\x5f\x5f\x8f\xb7"
- "\x6b\xed\x55\xdf\xe9\x05\x3e\x08\x18\x3c\x1e\x9d\xff\xc3\x97\x88"
- "\xbc\x7e\xad\x1e\x91\x17\xf9\x28\x3f\xc5\xec\x0c\x3a\x4b\x4c\xd1"
- "\x72\xa4\x0f\x14\x23\xd5\xd3\xde\x2c\xde\x65\xc6\x68\xd5\x46\xb1"
- "\x67\x2a\xec\xce\xd0\x0f\xff\xe3\x05\x89\x62\x0c\xac\x8c\xe2\x7b"
- "\x18\xa8\x3c\x89\x8b\x25\x4b\xb5\x6f\x12\x74\x04\xc7\x92\x55\x5a"
- "\xdd\x5a\x19\xd4\xfe\x0b\xd2\x3c\xd9\x17\x03\xcd\x11\xca\x4b\xe5"
- "\x0a\x9c\xd8\x48\x3c\x53\xc9\x19\x81\x83\xa2\x9f\x25\x1d\xf1\x63"
- "\x2d\x79\xb1\x92\x9e\x38\x7c\xa0\xf6\x44\xc7\xdf\xcb\x36\xa5\xcb"
- "\xb5\x64\x13\x8b\x6b\x63\x36\x9e\x53\xa3\xe3\x50\x29\xc6\x88\xe2"
- "\x2c\x8d\x1b\x07\x51\xcc\x15\xe4\x51\xb8\x68\x27\x8d\x07\x64\xa9"
- "\x79\xac\x1d\x74\x8f\xe6\x0a\x60\x82\x36\x6e\x7a\x96\xf0\x0a\xe5"
- "\x16\x8c\xc5\xcd\x4d\xf6\xb8\xf6\xea\x88\xae\x23\xad\x4a\xcb\x83"
- "\xf6\x09\x99\x4b\x83\x27\xde\xb5\x44\xc7\xf1\x16\x91\xb7\x4d\x6b"
- "\xe7\xdf\x58\x33\x54\x58\x6d\x3a\xad\xd6\xe1\xd7\xea\xc0\x3d\xea"
- "\x29\xf9\x1a\xaf\xfa\xf0\x86\xa2\x7c\xe9\x9c\x88\x16\xf9\xe5\x2b"
- "\x1e\xcd\xcf\x9b\x6d\x5d\xfe\x08\xb9\x31\x5a\xbb\x2a\x3f\xdf\x26"
- "\x36\x61\xc6\xf2\x81\x69\xa2\x3e\xc0\x41\xf2\xb2\x8e\x0d\xdb\xa4"
- "\xfd\x09\xcd\x0b\x9a\xef\x7e\x9a\xef\x07\x4a\x86\x84\x6c\xe2\x29"
- "\xbb\x85\x79\x42\xbc\x8c\xf8\x77\x41\xfb\xa8\xff\x96\x80\x5c\x07"
- "\x30\x9e\xb4\x46\x06\x9d\xa5\x0d\x63\xe1\x55\xda\x32\x76\x2e\x97"
- "\xb6\x8d\x4f\x27\x4a\x7f\x28\xe8\x84\x4b\xe2\x05\xd1\x27\xb2\xdd"
- "\xa7\x72\xf1\x8d\xef\xbc\x32\xc3\x31\x1a\xe5\x30\x6a\x34\x4a\xae"
- "\x13\x8e\xd9\x58\x83\xea\x64\x5d\x8e\x8c\x18\xde\x38\xf6\x48\xbc"
- "\x71\xcc\xf3\xb2\x67\xea\x35\x59\x45\xae\x1d\xa5\x46\xe2\x1f\x89"
- "\xa6\xe3\x7d\x8e\x56\x5e\xfd\x25\xb4\x6e\x38\x0a\xbe\xce\x3f\x38"
- "\xd2\x88\x7f\x20\xbb\x42\x82\x05\xda\x6a\x94\xf3\xc6\x51\x1f\x47"
- "\x7f\x52\xf1\xbc\x67\xbc\xb1\x7e\x98\x96\xe3\x1b\x68\xbb\xec\x86"
- "\x15\xab\x8b\x6e\x23\x17\x53\xf9\x76\x5b\xfe\x8a\xa2\xfc\xbc\xf3"
- "\xf7\xc9\x32\x35\x5e\x8c\xf6\xa8\xeb\x31\xef\xfd\x89\x04\x0f\x07"
- "\xfa\xe3\xcc\xd0\xfa\x20\xe8\x14\x78\x47\x95\xc6\x99\xfa\x59\xf9"
- "\xe9\xdd\xc2\xce\xae\x2c\x43\xc3\x13\xca\x77\x97\x9d\x2b\x48\x43"
- "\xff\x4b\x35\x7b\x40\xc8\xa4\x65\x0b\xb5\xe7\xd8\xf7\x65\xd2\x4f"
- "\xd2\x73\xc2\x26\x0f\x30\x2d\x37\xc5\xf1\x5b\x78\x2e\xeb\x53\x9f"
- "\x85\x1f\x25\xf2\xf9\xe5\x63\x65\xcf\x4b\xf8\x96\x61\xfc\x37\xa9"
- "\xb4\xa2\xdc\x2f\xcb\x61\xec\x85\x52\xff\xa4\xdd\x42\x3f\x5f\xd6"
- "\xa6\xd5\x87\xef\x7b\xe2\xeb\xa4\x75\xeb\xfc\xf2\xbc\xac\x4c\xec"
- "\x23\x6f\x16\x3e\xe0\xca\x02\xe3\xb4\xd5\x1e\x9f\x2f\xe8\x2c\xb7"
- "\xa0\xfe\x76\xad\xcf\x3f\xb0\x8b\xb4\xd9\x17\xe8\xa3\x4f\xed\x63"
- "\x0b\xe1\x16\xd5\x4f\xf8\xaf\xb6\xa1\x4a\xf5\x2b\xe2\xa5\xf8\x86"
- "\xd4\x7e\xe1\xdf\xcc\x42\xf3\xba\xbc\x0c\xeb\xbc\xe6\xef\xa5\x87"
- "\xfa\xb8\xaf\xd4\x6f\xd0\xfc\x4a\xc9\xef\xcb\xf3\xcf\x6b\xdb\xbe"
- "\xb8\x6f\x06\xdc\xdf\x20\xdd\x7b\xf9\xbd\xdc\xe9\x68\x25\x3c\x24"
- "\x7f\x53\xf5\x51\x3c\x2c\xf7\x7e\x1d\xef\xca\x17\x11\xde\xc5\xe3"
- "\xd2\xca\x5b\x56\x00\x93\xd6\xe6\x17\x7d\x57\x70\xf7\x60\xec\xc8"
- "\x6d\xd9\xf2\xa2\x95\x6b\x56\xaf\x9d\x6d\x5d\x9b\xb7\x5c\x9d\xf4"
- "\x63\xe6\xbc\x53\xc8\xee\x01\x6d\x9e\x05\x9d\xce\x45\x31\xda\xe2"
- "\x8c\xe1\x3f\xd9\x58\x89\xd8\xca\xce\xe7\xe5\x7c\x72\x16\xc5\xcd"
- "\x5d\xf1\x3d\xcd\xd1\xdd\x82\x67\x73\xc6\xaf\xff\x24\x1b\x27\x9e"
- "\x62\xce\xdb\x54\x98\x06\x24\x8c\x9d\x27\x44\x3f\x85\x3f\xad\xf2"
- "\x30\xf5\x53\xf8\x6f\x11\xfc\x99\xb3\x4b\xeb\x6f\x4c\x6e\x70\x0e"
- "\x08\x3e\x4a\xe5\xd7\x2e\x24\x97\xc7\xf8\xd3\xcd\x5b\x54\xdd\x59"
- "\xb7\x26\xe3\x69\xfc\x35\xda\x92\x27\x79\xd5\xcd\xb7\x2d\x2e\xe1"
- "\xa3\xb9\x76\xf2\x33\x47\x63\xb0\x79\xa5\xc6\x5b\x0a\xfb\xbb\xad"
- "\x23\x4b\x82\xce\xcd\xcb\xe2\xe9\x04\x4f\x78\xb4\x5b\xe5\x11\x97"
- "\x48\xd9\x75\xea\x6b\xbd\xa8\x8b\xf6\x0e\x2e\xd0\x36\xf4\x6b\x33"
- "\xe8\x5f\x7d\x1e\x95\x43\xfc\x35\x1f\xb6\xa8\xf1\x1d\xb7\x88\xbd"
- "\xc6\x26\x94\xed\xc7\xd8\x22\x1f\xf8\x3f\xa7\xc0\x0d\x05\x38\x4a"
- "\xb6\x37\x01\x8d\x47\x62\x9b\x23\xb4\x16\xe1\x1e\x78\xbb\x45\x3d"
- "\x93\xbe\x65\x89\x7f\x6d\x26\x1b\x1e\xb6\xe8\x87\xd7\xe6\x18\x48"
- "\x5f\x40\xb0\xf0\x34\x86\x98\xc4\x9f\x2d\x56\xd0\xa9\xae\xf8\xf2"
- "\xd4\xb2\x08\xa6\x06\x6a\x07\x5f\x6b\xd1\x13\x7e\x8b\x78\x80\xc3"
- "\x99\x58\x4f\x37\x0f\xf0\xb5\x99\xfa\x09\x7c\x67\x5d\xa8\x9f\x26"
- "\x2d\x76\x25\xd1\x2b\xe9\x9f\xff\x89\x57\xb6\x49\xdd\x80\x5a\xef"
- "\x96\x5f\x73\xfd\xf3\x62\x5d\xa9\x11\xeb\x0a\x67\xd2\xdf\xf9\x96"
- "\x2e\x61\x07\x6b\x7b\x5e\xc4\x44\x55\xcf\x57\xfb\xdb\x6d\x61\x11"
- "\x6b\xce\x51\x44\x7c\x5a\x98\xf6\x7d\xc4\xf9\xe1\x03\x45\x61\xf6"
- "\x83\x10\xe1\xe4\x13\x8c\x7c\xbd\x07\x04\xbf\xf0\x84\x49\xf3\xef"
- "\x4e\x71\x1a\xc1\x07\x33\xf4\x2b\x81\xc6\xdd\xea\x20\xdf\xfc\x4f"
- "\xf4\x91\xde\x55\xca\xe3\x16\x56\x03\x9e\x5e\x8e\xc1\x13\x0f\x52"
- "\x6c\x3c\x29\x2b\xf4\x62\x5c\x12\xbe\x40\xde\xc7\xe4\x1e\xb0\x46"
- "\x27\x9e\xf8\x9c\x6c\xcb\xbd\x6a\x19\xa8\x0b\xeb\xff\xe6\x3a\x59"
- "\x17\xca\x0b\x6a\xe3\xf9\xc4\x83\x5f\xd7\x6f\xc4\xca\xc3\xf7\x0f"
- "\xa8\x7c\x01\x93\xba\xab\xf7\xa8\xac\x76\x4d\x77\x15\xe3\x7d\x9e"
- "\xe8\xd6\x74\x57\xd2\x77\xf4\x96\x46\xaa\x7f\x22\x1d\x11\x77\xfc"
- "\x90\xf0\xde\x48\x3c\xdc\x84\xfc\x04\xd6\x77\x6a\xbb\xc6\x17\xca"
- "\xf1\xa9\xf8\x29\xf1\x87\x14\xc7\x54\xe3\x25\x25\x0f\x50\x51\x22"
- "\xd7\xb2\x8a\x65\xda\x5a\x86\x6f\xf7\xa9\xb4\x42\x5d\xe7\x2a\xa2"
- "\xf2\xef\xf8\x76\xf5\x15\x8d\x1a\x8c\x34\x98\x4b\x18\x55\x9c\x19"
- "\x4e\xfa\x72\x7f\x0c\xb6\x15\x67\x04\xac\xa3\xef\x9f\xbc\x21\x0e"
- "\xf6\xf4\x3c\x5b\xd2\xcd\x0a\xac\xff\x5b\x96\xca\x35\x45\xa6\xf1"
- "\xa4\xd0\x0b\xfc\xf1\x1c\x26\x61\xb0\x52\xe8\x66\xfc\x8e\x4c\xb4"
- "\xed\x49\x8b\x57\x77\x69\x9b\xa4\x65\x4f\x62\xfd\xab\x48\x93\xdf"
- "\x55\xb8\xa9\x2d\xf1\xed\x7d\x70\xf5\xa3\xab\xd7\xac\x5f\x4d\x0a"
- "\xb5\x75\x6b\xad\x2b\xd6\xe4\xe5\x27\x8d\xa3\x0f\xb1\x50\xbc\xe7"
- "\x40\x7d\xd4\x6f\x54\x65\x16\xd9\xc1\xcb\x98\x03\x95\x37\x5b\xaf"
- "\x25\xfc\x7a\xf2\x59\xd2\x15\x88\xd8\x0f\xe4\x23\x55\xea\x0d\x06"
- "\xe8\x7b\x09\xeb\xca\xab\x86\xd7\x17\xa8\x3c\xd6\xd6\x23\x04\x47"
- "\x55\xe6\xe0\xfd\xcc\x35\x4d\x5b\x87\xa8\x7d\x82\x37\x1f\xcd\x14"
- "\x74\x51\x19\x2d\x30\x08\x78\x8d\x66\x62\xbd\x79\xd2\xef\xd5\x5d"
- "\x52\xaf\xf6\x2b\xac\xc1\x83\xfa\x0f\x5e\xd7\x18\xe4\x2b\x81\xa3"
- "\x95\x59\x6a\x59\x44\x3f\x51\xf6\x93\xed\x9a\x1d\x36\xf9\x02\x75"
- "\x17\x93\x1f\x60\x57\x44\xd9\x4a\xf4\xc6\x95\xad\xd1\x25\x5a\x8b"
- "\x14\x94\xf3\xea\x88\x7f\x12\xe6\x0d\xd9\xdf\x4f\xef\x65\x5b\xab"
- "\x64\xbc\x00\xd7\xaa\xb1\xf1\x02\xb6\x2e\xc4\xaf\x4a\xfd\xed\x8d"
- "\xbb\xbf\xd0\x4f\xfb\xc6\x1e\x4b\x73\x75\x9c\x97\x67\x2f\xda\x74"
- "\x38\xca\xaf\x48\x7f\xa4\xaa\xff\x62\x8a\x7d\xb1\x75\x1a\xf9\xfc"
- "\x8c\xe1\x86\xeb\xdb\x2a\x0f\x32\x40\xb0\xa3\xf5\x16\x79\xc4\x59"
- "\x16\xc0\xe4\x05\xd2\xd1\x52\x9f\x78\x70\x25\x70\x62\xeb\xec\x18"
- "\x1e\x48\x18\x21\x2d\x3b\xc6\xa7\x6c\x4d\xa3\x6f\xe2\xe1\x80\x3a"
- "\xee\x90\xb2\xe9\xd6\x02\x6d\xcd\x26\x7f\xa7\x32\x7e\x84\xeb\xf0"
- "\xbe\xd2\x01\xc8\xfc\x5b\xb7\xc4\xca\x70\x1d\x56\x75\x11\x06\xae"
- "\x7f\x72\xde\x6e\x21\xb3\x6d\xdd\x13\xd3\x09\xb8\x0e\x13\xdd\x15"
- "\x65\x24\x85\x5a\x3d\x01\x11\x53\x59\xa7\xc5\x4e\x47\xde\x2e\x8d"
- "\x47\xd1\xca\x6a\x97\x3a\x27\xe1\xa3\x12\x73\xb0\x0e\x79\x02\x51"
- "\x7d\x2c\xd2\xa2\x32\x20\xa0\xda\x2e\x78\xef\xca\xb4\x98\xac\xf7"
- "\xa4\xd8\xbb\x14\x72\xa0\x2c\x07\x7c\x72\xa5\xf1\x7c\xb9\x0d\xfc"
- "\x83\x75\xe5\xea\x95\x60\x1f\x7e\x6c\x5b\x73\x1b\x44\x87\x1f\xdb"
- "\x56\xde\x46\x26\x5b\xf7\x2e\xb8\x47\x5c\x31\x39\x6e\x1b\x47\x7f"
- "\x2c\xe3\xbb\xe6\x08\x9a\x4a\x72\x2e\xe9\x4e\x83\x32\xd6\xe9\x14"
- "\xf5\x6a\x54\xaf\x93\xb1\xee\xd9\x31\x07\x7e\x4b\xb1\x6b\xd0\x86"
- "\x0e\x35\xbe\xac\xb6\x66\x83\x96\x57\xbe\xa2\xed\x77\x09\x1b\x76"
- "\xf2\x43\x38\x5c\x20\xf4\x71\xe8\x53\x54\xff\x21\xf5\x8b\x72\xcf"
- "\x2c\xe8\x7c\x8a\x69\xe9\x9a\x3e\x16\x69\x69\x9a\xee\x55\xe6\x7d"
- "\x2a\x23\xf6\xed\x18\xdd\x76\x9a\xb6\x9f\x86\x3c\x0b\x35\x98\x69"
- "\xe5\x38\xac\xfc\x94\xca\x27\x25\x08\xbe\xda\x59\x39\x5f\xf8\xfe"
- "\x24\x5e\x5c\xe8\x99\x9f\x2a\xd1\xea\x21\x19\x81\xda\xad\xee\xdd"
- "\x88\x79\x4f\x3e\x3e\xa5\x8f\xd0\xa7\xa2\xe3\x3f\x76\x8f\x63\xfc"
- "\xfd\x8d\xd1\x62\xde\x1e\x1e\xe1\x6d\x35\x47\x31\x67\x1f\x61\x2c"
- "\x5c\xcc\x5b\x47\x47\xf8\x3e\x11\xa3\xfa\x61\xc6\xaa\xff\xca\x58"
- "\x24\xe1\x47\x27\xce\x01\xee\xf7\x9d\x51\x4e\x51\xec\xba\xdd\xc8"
- "\x77\x5f\xe0\x2b\xde\x84\x6f\xee\xb3\xf1\x53\x4d\xc8\x77\xef\xe0"
- "\x29\xbe\x0b\x79\xef\x2d\x40\xbf\x8b\x79\x38\x92\xf0\xe8\x09\xeb"
- "\xbf\x11\x1d\xaa\x9a\xe7\xdf\x3a\xd4\xce\x9d\xfa\x5a\xbe\xf9\x5b"
- "\xd7\x07\x9d\x55\x0b\xa2\x31\xb3\x50\x2e\xc1\x68\xb1\x9d\xee\x1f"
- "\x3d\x81\x3e\x9d\xc8\xc5\x1a\x8a\x31\x38\x81\x7c\x90\xff\xd7\x0a"
- "\x7a\xe3\x4f\xb8\xfe\x12\xfc\xc6\x8d\x5b\x83\xb6\xb6\x47\x8a\x79"
- "\x5b\xed\x43\x68\xff\x49\xb4\x7f\x84\xb7\xa2\x0f\xfb\x6a\xfa\x19"
- "\xa3\xf6\x47\xa8\xcc\x08\x4b\xc8\xdd\xa0\x9b\xb6\x1b\xef\x73\xed"
- "\xa9\x6c\x37\xf2\x3e\x14\x60\xd3\x9a\x90\xe7\xa1\x9f\x4e\x63\xa2"
- "\xfd\x3e\xb4\x3b\x71\xa8\x3d\x82\xba\xa9\xfd\xa8\xdf\xa7\xb5\x53"
- "\xab\x9f\xda\xab\xe1\x60\x2e\xe9\xbb\x92\xbe\x14\xed\x96\x3a\xfc"
- "\xea\x6b\xfc\x6b\x0b\x98\x3f\xe1\x5b\xd7\x7b\x59\x75\x36\xcd\x21"
- "\xea\x8f\x1f\x38\xa5\x9e\x2b\x3b\xa1\xc1\x40\xca\x93\xd5\x8b\xb4"
- "\xfe\xc5\xf7\x6b\xc9\x9a\x42\xa1\x47\x5d\xbe\xa2\x68\x65\xf1\x72"
- "\x48\x67\x49\xcc\x46\x49\x42\x7e\xcb\xcf\xb3\xae\x59\x6d\x7d\x64"
- "\xf9\xca\x55\x6b\x8a\xf3\x0b\x67\x0b\x91\x7b\x6d\xfe\xea\x3c\x52"
- "\xaf\x16\x2e\x2f\xb4\x25\x9d\xc7\x73\xbb\x86\xda\x3b\x29\xce\x49"
- "\x29\xe9\xaf\xeb\xee\x55\x75\x8b\x21\xee\xcc\x16\xb2\x9b\x9c\x07"
- "\x35\x90\xf9\xb3\xe9\xfd\x1d\x72\xad\xa9\x5b\xc4\x2b\xbf\x8c\x70"
- "\x2e\x62\x30\xeb\x4e\xb1\xba\xef\x88\x7e\x0e\x2f\xd4\xca\x11\x67"
- "\x34\x04\xcf\x4a\xe9\xa3\x0b\x59\xcc\x66\xbb\xee\x5e\xae\x47\x1f"
- "\x01\x03\x95\x6f\x2d\x53\xcf\xce\xfd\xa1\x97\xd5\x5d\x83\x7e\xd3"
- "\xde\x41\x97\xe0\x0b\xc5\x19\x9f\xba\xcb\xc0\xf7\x96\x71\xe7\x64"
- "\x13\xc1\xa5\x46\xca\x95\x7a\xb3\x8e\xe2\xaf\xf6\xd2\x79\xc3\x2c"
- "\xda\x23\xdc\xed\x54\xb2\x62\x36\x32\xd5\x39\xc4\xe3\x0a\x5d\xbb"
- "\x98\x17\x35\xf5\x1a\xbe\xeb\xe9\x0c\xc7\xe6\x19\xdf\x95\xb4\xba"
- "\x46\x9c\x29\xc2\xb8\x7d\x57\xb6\x5f\xc4\x83\xc6\xfa\x54\xfb\x6b"
- "\xf4\x4f\xe1\x8e\x85\xaa\xdf\xf6\xda\x5f\x2b\x29\x73\xb3\x23\x6b"
- "\x2d\x6a\x0c\x75\xdf\x74\xa5\xd2\x37\x39\x82\x75\x5d\x01\xaf\xca"
- "\x6b\xe6\x1e\x88\x54\xfa\x98\xb2\x3e\x53\x4f\xf4\xdd\x61\x07\xfc"
- "\xd6\x14\x24\xf1\xaf\x0a\xa6\x46\xd6\x67\x92\xad\xa3\x91\x73\x7c"
- "\x9b\xe4\xb3\x88\x98\xb7\x95\xbe\x24\xf5\x79\x06\x3d\x2b\xe0\xd5"
- "\x90\x66\xc5\xf3\x37\x14\x1e\x97\x7f\x6c\xde\x0c\x7a\x36\xeb\x84"
- "\x6d\x5e\x16\x78\xe3\xf9\xd4\x77\xad\xcf\x42\x46\x20\x3d\x45\xb4"
- "\x6f\xb5\x7b\xb5\x74\xe2\x5d\x25\x1f\xc9\x56\xf4\xb2\x5a\xb7\xa4"
- "\x69\xd1\x7c\x4f\x68\x30\x10\xb0\xad\xfc\x12\x34\xba\x6e\x91\x88"
- "\x0b\xbf\xf9\xca\xeb\xb9\xbe\xfa\x51\x5a\x3b\x16\x47\xc4\x5e\x16"
- "\x93\x7b\x1f\xb5\x7d\x1a\x3c\xc9\x16\x9d\xd6\x0f\x8c\x5b\x66\xae"
- "\x9f\x25\xc9\xf9\x5b\x67\x88\x93\x51\x7c\x5c\xe0\x7b\x6d\xa3\xa8"
- "\x57\x6f\xdc\x2c\x9f\x6b\x54\x5f\xe6\x75\x59\x5a\x5e\xa4\xcd\x93"
- "\x3c\x69\x8d\x81\x64\x37\xda\xdb\xa2\xfb\xa6\x09\xce\x49\x96\x36"
- "\x72\x4e\xb4\x90\x68\xb3\x75\x06\x63\x9d\x01\xe2\xdb\xeb\xaa\x0e"
- "\x34\x06\x98\x18\xbf\xa4\x2f\x23\xc3\xbc\x80\x81\x5f\x19\x97\x4f"
- "\xa5\x6f\x90\xbf\x43\xf0\xe0\xc0\x67\x05\xf8\x8c\x6f\x14\xc2\xd7"
- "\xd2\x33\xd4\x8e\xa7\x8d\xed\x25\x03\xe4\xc7\x1d\x78\xf8\xb4\x91"
- "\x60\x43\x6b\x43\x8d\x53\x9c\x91\x13\x34\xd8\x5d\x3c\x87\xca\x38"
- "\x93\x12\x62\x86\x4e\x50\x50\xc0\x3b\x64\x2b\x65\xd3\x4e\x22\xbf"
- "\xa1\x88\x19\x49\x3e\xfa\x7b\xf7\x91\x51\xdf\x02\x09\x93\xa7\x17"
- "\x68\x3c\x10\xee\x97\x8c\x3d\x0b\xfa\xf4\xd7\xce\x82\x3e\xbc\x66"
- "\x4d\x51\x6e\x61\x3e\x5d\x32\xaf\x59\x77\xdd\xf9\x6b\xa2\x49\xc6"
- "\xcd\x79\xba\x80\xc6\x8f\xd6\x09\x79\xa6\xe2\xe9\x96\x38\xb9\x96"
- "\x74\x6b\xb7\xd3\xfa\x46\x7b\xe2\x78\xd7\xfe\x6e\xc9\x26\xc1\x57"
- "\x1d\x37\x32\xfd\xf9\xf5\x3d\xb2\xbc\x68\xf9\xaa\xef\xca\xed\xdb"
- "\x71\xea\xe9\x1e\x5b\xcf\x33\xa9\xd1\x7a\xa4\x0c\x12\x10\x73\xb0"
- "\x7a\x6e\x2b\x4f\x9e\xb5\x44\xd2\xb9\x67\xe6\x68\x36\x4e\xe3\xfb"
- "\x9e\xf0\x15\x45\x2a\xcf\xd1\x38\x50\xec\x41\xfd\x6f\x36\x76\xeb"
- "\x89\xff\x2a\xc5\x3d\xd9\x9c\x08\x3d\x9f\x1a\xd3\xee\xed\xa1\x6e"
- "\xd0\xd9\x67\x5c\x7c\xab\xaf\x08\x78\x55\x36\x91\x9d\x49\xfc\xb9"
- "\x5d\xb9\x47\xf9\x4c\xf3\x44\x79\xb9\x6b\xc4\x25\xe7\xca\x33\x67"
- "\xc4\x5e\xd9\x0c\xf6\x64\x2f\x7b\xe6\xb4\xc1\x02\x39\x6e\x06\xfb"
- "\x39\xee\x85\xbc\x40\xef\xc6\x8c\xf5\x55\xbe\x66\x03\xb0\x13\x58"
- "\xaa\xe3\xf2\x0f\x4c\x98\xfc\x4b\xc0\x4f\xcf\x75\xc2\xfa\x3d\x01"
- "\x10\x9e\x32\xd9\xc0\xcc\x29\x26\xe3\xac\x99\xe9\x96\xdb\xbf\x37"
- "\x7f\x9e\xa3\xb4\xc4\xce\x95\x70\xc8\xcc\xe3\xe2\x2f\x56\xcd\x0c"
- "\x3d\x78\x5d\x99\x5c\x2b\xaa\x67\x86\xc6\x6b\x6b\xb5\x93\xdb\x88"
- "\xb7\x06\xbd\xb2\x3a\xd6\x31\xfd\xab\xe7\xbc\x7a\xe2\xe5\x68\xfd"
- "\xf1\x84\x8f\x41\x26\xd8\x56\xfe\x0e\xd2\xd0\x7f\x3b\xaf\x9a\x6b"
- "\x95\x67\x1b\xb6\xbd\xab\xd4\xcc\xb5\xc6\xca\x37\x30\x2a\x1f\xf2"
- "\x82\x7e\x4f\xe9\x80\xde\x63\xf8\x1e\xf3\x58\x03\xec\x1d\xdc\x8f"
- "\x0b\x4b\xd4\x49\xba\x29\x2a\x03\x74\xd8\xe5\x38\x0b\xfa\x6c\x17"
- "\x7a\x62\xfd\x29\xb6\xed\x6c\xeb\x04\xdf\x89\xbd\x9e\xa4\xa1\xe2"
- "\xa0\xb3\x1e\xe3\xff\xaf\x55\x2a\x3f\x04\x7e\xad\x7e\x81\x46\x13"
- "\xf0\x7e\x9d\xd4\x57\xd7\xe7\x68\x79\xc6\x97\x27\xc9\x66\x92\xbb"
- "\x69\x5c\xf9\xc8\xc0\x00\xf9\x70\x9b\x40\x27\xb0\x00\xeb\xf3\xb3"
- "\x34\x8f\x93\xcb\x53\x27\xa7\x94\x67\x3d\x76\x10\xeb\x5f\xb2\xef"
- "\x32\x96\x12\xf8\x0f\x6a\x33\xd9\xed\x76\xed\x02\xef\x4b\xfb\x54"
- "\x66\x5d\xd6\x4a\x73\x79\xd6\xf2\x88\x73\xfe\xad\xb4\x4e\x9a\xed"
- "\xf7\xe8\xcc\xe1\x3b\x74\x61\xe7\x9c\x5b\x77\xcb\x98\x27\x81\xba"
- "\xe9\xbc\x1b\xdf\xf4\xe0\x1b\x2f\x7e\x7d\xf8\xee\x60\x3f\x7b\xf6"
- "\x0a\x5c\x3b\xcc\x3a\xbe\xdb\x8c\x91\xbc\xa9\x4c\xc4\x80\x24\x1a"
- "\x7d\x90\x27\x81\xc7\x1c\x15\xba\x80\x49\x31\x5d\xc0\xb3\xf3\x31"
- "\x6e\x93\x17\x3d\xc1\xdf\x41\x59\x1d\x91\x11\xa5\xa3\xe9\x14\x63"
- "\xaa\xce\xfb\x30\xe6\xe8\xe1\xd9\xf5\xcc\xa2\xda\x5e\xea\x0f\x86"
- "\x3b\x88\x16\xd3\xd9\xe5\x76\xd4\xb9\x1f\xbf\x36\xeb\x6a\x96\x70"
- "\x8a\x3d\x5b\x4d\xfc\x47\x8c\x87\xfd\xd9\x24\x55\x1e\x71\xdf\x88"
- "\xef\x37\x3d\x46\x38\x31\xa0\x0f\xa3\x7c\xf0\xfc\x1d\x9e\x82\x0e"
- "\x61\x0b\x43\xb6\xcd\x94\x07\x75\x64\x7a\x42\x1d\x4c\xe1\x16\x3d"
- "\x9e\xdb\xc8\x4e\x99\x23\x6f\xa7\xbd\x9b\x75\xda\x42\xa0\xb1\x07"
- "\xc1\x03\x67\x66\xa0\x3d\xa2\x3c\xbc\x3f\xfc\x2a\xc6\xd7\x0a\x7e"
- "\x0f\xe5\x75\x91\x6d\x0d\x9d\x01\xe6\x6b\x33\xaf\xc5\xf7\xed\x90"
- "\xa1\xf5\x54\xfe\x29\xf6\xdc\xb3\x7c\x38\x33\xf3\x26\x9f\x8c\x89"
- "\xd8\xcb\x9e\x5b\x85\x76\x3e\x17\x6b\xe7\x73\x67\xd0\x7e\x03\xe8"
- "\xaa\x1b\x65\xee\xe7\xc5\xa8\xb3\x0f\x75\x42\x1e\x01\xfe\x66\x40"
- "\xde\x35\x50\x9b\x3b\xa9\xbd\xf6\x08\xe3\xeb\x33\x0d\xb5\x43\xcc"
- "\x80\xb9\xe0\xde\x8d\x2b\xfa\xbf\x0f\x3c\x59\x7a\xd0\xf9\x5c\x99"
- "\x76\x8e\x9c\x78\x09\x3c\xd7\x69\xb8\x54\x8d\x3c\x68\x63\x1b\xda"
- "\xb5\x3f\xd9\xc7\x48\xc6\x99\x04\x3c\x9d\x84\x7a\xa7\x60\xac\xda"
- "\x00\xbb\x9f\x02\xd6\xfb\xa9\x4f\xca\x88\x32\xa0\xa0\xbc\xda\x11"
- "\xb4\x69\xad\xc5\x60\xea\xa3\x78\xd1\x41\x0e\x78\x1f\x5e\x6c\x0f"
- "\x72\xb2\x3b\x25\x1b\x4e\x7c\x73\x2f\xfa\x8a\xf5\xee\x67\xb3\x49"
- "\xde\x40\x3f\xe6\xc8\x98\x8e\xcf\xcd\x53\xf7\xb4\x0e\x4b\x3d\xd3"
- "\xb3\xd5\x04\x7b\xea\x97\xa9\x3c\xb5\xc2\x33\xe0\x67\xa6\xbe\xcb"
- "\xb0\xbe\x3d\xdb\xda\xa8\x10\x8f\xf2\xb3\xa8\xfe\x7f\x82\x39\x16"
- "\xf2\x80\xbe\x28\x23\x7c\x80\x78\x4f\x69\xef\xf2\xb3\x55\xb9\xf6"
- "\x84\x6c\xf0\x99\x7a\xb4\x93\xce\x43\x4c\xc7\x3a\x7d\x3b\xd9\x33"
- "\xa1\x7d\x90\x3b\x7e\x56\x75\xa1\x58\xaa\x80\x8f\x05\x79\x20\x37"
- "\xfe\x6c\x81\x80\x57\x31\x6f\x94\xba\x9e\x9f\xb5\x6b\xe7\xf9\xf9"
- "\x08\x2f\xa9\x2d\x15\xf5\x96\x6d\x29\x16\x75\x50\x7c\xcd\x81\x22"
- "\x2b\x3f\xde\x6e\xf5\x4f\x78\x66\x3a\xce\x8e\xc7\xaf\xc6\xec\x12"
- "\x7b\x9a\x63\xed\x78\x1a\x66\xc7\xc9\x8d\xb4\xaf\x59\x46\x7b\xb7"
- "\xd2\xef\x4a\x83\xb0\x57\x5e\x6c\x97\xfe\x25\x3c\x21\x9f\xca\x5b"
- "\x36\x6c\x10\x71\x7c\x88\xaf\x11\xb6\x3f\x27\x55\x7b\x9d\x86\x69"
- "\x54\x47\xfb\x79\xb1\x82\xf3\x57\x2f\x7f\x78\x55\xbe\x54\xa5\xdc"
- "\xf0\x93\xa2\xe5\x3f\x1e\xcb\xff\x1a\x84\x5c\xec\x6c\xd8\x22\x75"
- "\x93\x0d\xfb\xe3\xf8\x44\x43\x54\xb7\xa4\x67\xfb\xa4\x7e\xa9\xa1"
- "\x67\x3c\xfd\xd2\x3d\x3f\x5e\xbd\xa6\x50\xd4\x21\x4c\x9b\xf2\xe5"
- "\xe9\xa2\x24\xf6\xe0\x82\x7b\x16\xdc\xb0\x36\xbf\x48\x04\xe7\x90"
- "\xca\x9c\xe5\x79\x79\x85\xaa\xe1\xd3\x4a\xfa\x8a\xde\x3c\xb2\x5e"
- "\x7c\x6a\x7b\xb4\x48\x9a\x4c\xad\x5d\xb5\xbc\x38\x5f\x2d\x22\xbe"
- "\xad\xe9\x44\x2f\xdb\x1b\x85\xcc\x9c\x24\xf7\x69\xb7\xaf\x8a\xdb"
- "\xd7\x89\x97\x23\xaf\xc0\x3b\x97\xf6\xce\xf6\x0d\xc2\x95\x1d\x57"
- "\x74\x36\x0b\x9f\x08\x86\x03\xff\x49\xf0\xdd\x7e\x86\xfc\xc9\x63"
- "\x6d\x6b\xa1\xf8\xa7\xea\x1e\x28\xe8\xf5\xf6\x8f\xc0\x6f\xb7\x00"
- "\xbe\xf6\xc5\xe0\x88\x40\x53\xed\x5e\xb6\xab\x5d\xd5\x21\x18\x15"
- "\x7d\xc3\x00\xd9\xaf\x34\x09\x3d\xc2\x76\x5f\x4c\x8f\xb0\xab\x9d"
- "\xd6\x75\x8c\x77\x1f\xb5\x8d\xda\x19\x74\xee\x30\xc5\xd9\x0e\xf4"
- "\x79\xd9\x76\xb1\xd7\x45\x7b\xdc\x22\xd6\x03\xf8\x27\xf5\x5c\xb9"
- "\xbe\xf3\x3f\x69\x1d\x6a\x9c\x43\x34\x57\x71\x8d\x34\xcb\x39\xb3"
- "\xf3\x5e\x5e\x39\xb4\xfe\xa6\x00\x4b\x93\x34\x63\xc7\x76\xa4\x5f"
- "\x7a\x8a\xed\x28\x42\xba\x1d\x74\x67\x12\xf1\x2e\x52\x57\xbe\x63"
- "\xbb\xaa\x57\x20\xf8\x4c\x8a\x6b\x43\x5d\x4c\xf7\xb0\xab\xdd\x9f"
- "\x38\x42\xb6\x57\x3e\x6d\x1f\x54\xee\x45\xef\xd8\x17\x95\xb5\x51"
- "\xb7\xba\xf7\x97\xd6\x8f\xfc\x80\x45\xb3\xba\x1f\x87\xbe\x6f\x27"
- "\x79\x42\xb5\xe9\xda\x31\x10\xcf\x03\x4b\xdf\xfa\x43\xeb\x89\x6f"
- "\x96\x32\xc3\xce\xcb\x04\x9f\x43\x7a\x8e\x73\x04\xef\x9d\xd7\xe1"
- "\x3d\xd6\xba\x9d\x56\x2f\x6b\x68\xd0\xda\x43\x6d\x2e\xb2\x83\x19"
- "\xc0\x77\xb4\xf6\xa1\x4d\x53\x90\x67\x41\xac\xcd\x3b\xd3\x04\xdf"
- "\xcc\x73\x54\x5d\xe4\xce\x36\xa9\x6f\x1a\x69\x8d\x1b\x37\xc3\x29"
- "\xb6\x73\x3b\xda\xda\xba\x59\xee\xc1\x4f\xd2\xf6\xb6\x51\xd6\x98"
- "\xfe\xc7\x74\x41\xdb\x67\x4a\x5d\xd0\xce\xd6\xd8\x18\xee\x2c\x22"
- "\xbc\x27\xfb\x05\xcd\x76\x81\xc6\x53\xc6\x1d\xd8\x19\xb5\xff\x52"
- "\x92\x46\xea\x48\x56\xaa\x91\xfb\x70\x18\x97\xc6\x2b\x12\x74\xc7"
- "\xc5\x5e\xec\x4d\x21\x46\x7a\xb0\xc9\x48\x4b\xa6\x7c\x54\xa7\xd0"
- "\x99\x00\x36\xd4\x17\x05\xfc\x78\x82\x65\xf2\x1d\x41\x67\x63\x26"
- "\x78\xbe\xbe\x18\x6e\xec\x14\x7b\x72\x35\x2a\xac\xb9\x73\xfb\xad"
- "\x31\xf9\xad\xf1\x81\xe8\x9e\x13\xca\x89\xad\x19\x8d\x1b\x08\xc6"
- "\x54\xaf\x6d\x23\xe9\xa4\x77\xed\x15\xed\x90\xfb\x3a\xef\x61\xfc"
- "\x76\x71\xf0\x17\xb4\xd6\x92\x2c\x41\x63\x4f\x79\x65\x2c\xa0\x5d"
- "\xa4\x63\x27\xdd\xe9\x73\xb8\xff\xa1\xa2\x1f\x0f\x77\x1a\x0f\xc6"
- "\xdb\x19\x4a\xf8\xef\x4a\x53\xa8\x4c\xf4\x9f\xca\xc2\xfa\xa3\xd3"
- "\xf4\x2b\x6a\xb9\x93\x50\xe6\xcf\xfa\x55\x58\x8b\x3d\x85\x4a\x15"
- "\x0e\x34\xc6\x02\xe6\xbb\x32\x40\x73\x85\xfe\xc7\xd1\xcc\x07\xd7"
- "\xa0\x0c\x19\xa3\x73\xd7\x02\x4e\xb0\x55\xf3\xfb\x49\x06\x43\xdb"
- "\xe5\xd9\x2a\xe0\x22\xe4\x18\x6a\xa7\x52\x39\xd2\x40\x6d\xa7\xfd"
- "\x84\x98\x5c\xbd\x6b\x03\x7d\xeb\x7f\x5c\x7e\x53\x2b\xf7\x3b\x68"
- "\x6c\x7e\xcd\xd7\x17\x30\x55\xcf\x8e\x75\x6a\x67\x19\xe1\x3d\x95"
- "\x13\x10\xf2\xd5\xae\x3a\x05\x70\xc1\x98\x00\xce\xbb\xf6\x6b\x63"
- "\xe2\x65\x8d\xf6\x89\xf8\x61\xe9\x3f\x7f\xd7\x80\xe6\xa3\x85\xd6"
- "\x26\xcc\xe1\x32\xc9\x4b\x36\xbd\x6c\x2e\xbf\x9d\x9b\xc3\xb7\xde"
- "\x4a\xbc\xd1\x6e\x3d\x0f\xc5\xd9\xd1\xcd\x02\x9c\xbe\xd2\x6c\x8a"
- "\x95\xcd\x3f\xea\x26\x1b\x44\x4f\x48\xda\x20\x52\xfa\x7d\x01\xae"
- "\x74\x06\x22\x64\x53\xdf\x1d\x74\x36\x2d\xd2\xe4\x20\xa2\x6f\x09"
- "\xe5\x3a\xc0\xae\x69\x99\x97\x6d\x5b\xa5\xd2\xb5\x29\x27\x59\xd3"
- "\x56\xb5\xfc\xf8\x36\x18\xa4\x1c\xd9\xd4\x22\xe5\xa9\xa6\x7a\xd0"
- "\x9e\x05\x52\x9e\x6a\x6a\xd6\xda\x8d\xf7\xab\xce\xef\xe3\x92\xbb"
- "\xee\xc9\xb7\xae\x22\x12\x9d\x75\x8b\xdd\x9a\x79\x4d\xde\x4d\xc2"
- "\x68\xd5\xfa\xcf\x77\x7d\xd7\xba\xe4\xb6\x6b\xec\x05\xb3\xef\x93"
- "\x97\xbb\x96\x2c\xa2\xeb\x79\x7b\x98\xd6\xa0\x73\x37\x1b\x2b\xaf"
- "\xed\x51\xdb\xb0\xdb\xe2\xd5\x5d\x2f\xed\x40\x8c\xbe\x56\x8a\x83"
- "\x8e\x35\xd5\x47\x7c\xf2\xe2\xc8\xa7\x9c\x6f\x3d\x1a\xe2\x89\xbe"
- "\x56\x7f\xf2\xcc\x10\x7e\x6e\x7f\xe2\x50\x23\xc5\x49\x37\x97\xf3"
- "\x90\x39\x3c\x45\xd2\x4a\x3c\x83\x27\x19\x00\xdf\x43\x63\xc9\xee"
- "\xbe\xce\xc1\x17\x47\xb8\x07\xfc\x0f\xe0\xb2\xdb\xae\xad\xe3\x42"
- "\x07\xe5\xf2\xb5\x2e\xb6\xf3\x51\xc2\x1d\xf0\x07\x46\xc8\x43\xad"
- "\xa4\x87\x42\x3e\xf4\x7f\x9b\x57\xc2\x62\xf7\x5e\x8c\x7f\x97\x0a"
- "\xdf\x25\x78\xc6\xf8\xcf\x33\x88\x39\xee\xb4\x88\xb5\x42\xd9\x7c"
- "\xfd\xfd\x90\x05\xdc\x5a\x99\x28\xcb\x24\xed\x2a\x64\x79\xec\xef"
- "\x3c\xff\xac\x54\x0e\xb6\x93\xee\x82\xce\x17\x9a\xed\x3a\x8a\xe3"
- "\x93\x13\xd5\xd7\xe0\x5d\x4a\x79\x2a\xe9\x70\x72\x52\x02\xba\x32"
- "\xca\x13\xd3\x6b\x28\xde\x5a\xbd\x12\x02\x3f\x91\x2a\x63\x96\xfb"
- "\xd4\x7d\xdd\xe6\x82\xe8\x3e\xc1\x98\xb1\x6f\x16\xf8\x30\xe4\x34"
- "\x60\x1c\x9a\xfc\xdf\x48\x93\xbc\x93\xe2\xd4\x31\x79\xe6\xbc\xf9"
- "\x3f\xc4\xbc\x54\xf1\x11\xf0\xf5\xd3\x1e\x9e\x39\xcc\xfd\x64\xef"
- "\xae\x24\x00\x27\xd9\x49\xe6\x29\x09\x96\xd1\xb9\xd7\x28\x5e\xda"
- "\x80\x97\x36\xe0\x25\xed\xb7\xa2\x7e\x7f\xc2\xf5\xcb\x30\x67\x75"
- "\x27\x59\xf3\x6c\x6a\x3f\xc1\x06\xfc\xbb\x49\x01\xac\x84\x5d\x1d"
- "\xc1\x27\xe9\xab\x05\x74\x5e\x89\xfa\x6a\x0e\xa3\xcf\xf1\xfd\xd2"
- "\x2b\xde\x1a\x27\xfa\xa5\x47\xbf\xec\x83\x42\x6f\x40\xe7\xc8\x40"
- "\x4b\xa6\xc7\x62\x41\x3c\xbf\x28\xbe\x8f\x0a\xc5\x8f\x11\x7d\x78"
- "\xfe\xb1\xf1\xfa\xc8\xf5\xd4\x47\x82\xc1\xf3\x77\xa8\xfb\x2d\xa2"
- "\x9d\x44\xb7\x7c\xec\x79\x96\x52\x4e\xe7\xb7\x7c\xad\xe0\x7b\xef"
- "\xa2\x31\x6c\x72\xf2\x3a\x6a\xe7\x78\xe3\x45\xe5\xc9\xb2\xfe\xd3"
- "\x64\x2e\x2f\x5b\x86\xb6\x74\x8f\x0f\xef\xe7\xcf\x5e\x18\xde\xcf"
- "\x1f\xa2\xef\xa9\x1d\x74\x16\xcd\x4c\x8e\x8a\x80\xdf\xe0\x2b\x5c"
- "\xe3\xd5\x9b\x52\xde\x4c\xed\x1a\xf7\x1d\x70\xdf\x57\x5b\x38\x76"
- "\x4e\x28\x4d\x21\x46\xf0\xdb\x8d\x74\xa9\x93\xfd\xcf\xb2\xa8\xee"
- "\xd8\xe5\xeb\x36\xeb\xac\x09\x34\xc7\x04\x4f\x8c\xfe\x8e\x57\xae"
- "\x59\x57\x47\xbe\xce\xee\x02\xad\x1a\xf7\x3d\xe6\x81\x95\x6f\xfe"
- "\xd6\x37\x50\x5e\x63\x4a\xb9\x8e\xfb\x13\xbe\x95\x94\x12\x08\x67"
- "\x10\x5c\xd1\x56\x3b\xe6\xf8\xb3\x62\xed\x16\xba\x8c\x17\x00\x87"
- "\x57\x45\xfc\x4a\x7f\xa2\xaf\x51\xda\x27\xbc\x90\xe6\x65\xbf\x1b"
- "\x88\xd9\x1a\xbd\x90\xe1\xd5\x4d\x95\xfc\x75\xc2\x95\x3b\xb0\xa6"
- "\x3d\xa0\x38\xcd\xdc\xba\xd1\xcc\xfb\xd9\x0b\x6f\x29\x3c\x53\x8f"
- "\x75\xeb\x81\x18\xee\xc8\xf3\x6e\x1a\xee\xe0\xfb\xbc\xf1\xf1\xe2"
- "\x85\x27\x2e\x8c\x17\x2f\xfc\x50\xd5\xf5\x2d\x93\x36\x80\x2f\xec"
- "\xd5\x64\x0e\xbe\xf9\xca\x1d\xd6\x52\x51\x7f\xb6\xac\x1b\x30\x09"
- "\x67\x13\x9d\x59\x04\xb8\x95\x21\x6f\xb7\x46\x1b\x08\x87\xcc\x11"
- "\x92\x87\x98\xc0\x73\xbc\x0b\x80\xf6\x34\xc8\xf5\x79\x78\x01\xf1"
- "\xaa\x8a\xb3\x69\x1f\xd6\xaf\x9d\x64\x03\x1f\x48\x1c\x84\x5c\xb6"
- "\xc7\xe2\x65\x5f\xa8\xf1\xae\x07\xd3\xb8\x6b\xd0\x52\x2f\xcf\xb3"
- "\x1b\x45\xec\x31\xcc\x73\x8a\x37\x46\x73\x1d\x69\x69\x68\x37\xc5"
- "\x1e\x83\x8c\xb0\x67\x89\xb6\xf6\x2b\xce\x6c\x82\xb7\xa0\xa7\x7a"
- "\xe2\x87\x01\xbb\x67\xf5\x4a\xcb\xc8\x4d\x16\x46\x7d\x1e\xd9\x3c"
- "\xa3\xe5\xc9\x1b\x99\xe1\xf7\x96\x87\x99\xed\x16\x96\x56\x3e\xd7"
- "\xc0\xbe\x9c\xc7\xf4\x04\x07\x2f\xdb\xb3\x4c\xc2\x6e\x4f\xb3\x36"
- "\x3e\x5e\xf6\x82\x88\xd3\x45\x3a\xf8\xc5\x61\x3e\x2c\xf7\x14\xf6"
- "\xb8\xb1\x06\xaa\x7b\x67\xbb\x4d\xe3\xac\x0f\x77\x5b\x57\xae\xb5"
- "\xe6\xad\x59\xbf\xfa\xea\xab\x93\xc6\x91\x25\xf6\x1c\x96\xb2\xc4"
- "\x8b\xc6\x78\x59\x02\xcf\xe8\x7f\xd3\xc0\xf9\xb2\xc3\xa2\x5c\xd5"
- "\x4d\x41\x6e\x16\x8b\xdd\xdf\xcc\x16\xdd\x1c\xf7\x78\x2b\x5b\x74"
- "\xcb\xad\xb9\xf7\xe7\x2f\xcf\xdb\x10\x97\xfa\xed\x78\x3d\x5f\xed"
- "\x0e\xd4\x9d\x30\xe3\x4e\xd0\x0f\xdd\x7d\x8f\xd3\xba\xf3\x62\xa4"
- "\x34\xcc\xbf\x00\xee\xce\x23\xdf\x40\x87\x8a\xc2\xec\x10\xe8\x1b"
- "\xbf\x92\xe8\xfa\x14\xe9\x1f\x33\xc2\x48\x8f\x66\x46\xdf\xfd\x90"
- "\xe9\xce\x48\x1b\xf0\x97\xae\xee\x6c\x08\x81\x4e\x0c\xed\x91\xfc"
- "\xce\x8b\x3d\x48\x9f\x86\xf4\x49\xd2\x8e\xe5\xa5\x44\xc8\xcb\xd9"
- "\xc2\x17\x42\x31\xf9\x42\x78\xf1\x34\xc1\xe8\xc6\x40\x19\x93\x3e"
- "\xb9\x5e\xac\x27\x5f\xd9\x5e\xf6\xd2\x02\xe2\x2f\x28\x2f\xd2\x8e"
- "\x59\x7f\xc2\xb2\xe8\x4a\xfc\xb0\x17\x65\xf2\xad\x43\x7b\xf8\xce"
- "\x1c\xda\xdb\xcf\x40\x99\x77\x10\xdf\x96\x60\x99\x12\x09\x3a\x5f"
- "\xca\xd6\x78\x10\xb2\x37\x9d\x88\xff\xd0\xd6\xc1\x14\xd0\xef\x94"
- "\x80\x99\xe7\x92\x6f\x11\x1d\xcb\xa0\xf5\xc1\x6c\x5f\x22\xce\x28"
- "\xd1\xba\x48\x34\xa1\x49\xd0\xd2\x97\x1a\x34\xba\x50\x23\xe5\xd1"
- "\x24\xfa\x1e\xeb\xe7\x57\x72\xfd\x7c\xa9\x4d\x9b\x0b\xb8\x6f\xd7"
- "\x70\x75\xcc\x39\x97\xd5\x45\xf9\x85\xf9\x79\xd6\x6b\xd6\x26\xb1"
- "\xb8\x48\x8e\x05\xf9\xab\xad\x85\xf9\x3f\x5d\x97\xbf\x56\x08\x7a"
- "\xf4\x76\xec\x1e\x0b\x68\x50\x2c\xae\xae\x38\x6b\xf3\xf3\xeb\x48"
- "\x16\x36\x97\x5f\x2d\xf4\xe9\x82\x37\x32\xcd\x9d\xa7\xd4\x24\x67"
- "\x4b\x7d\xe4\x49\xc0\xb5\x45\xf5\xa9\x3b\x54\x4f\x7c\x5c\x3f\x6b"
- "\xb9\x4d\xee\xd9\xff\x7c\x9d\x84\x95\xf1\x89\xa0\xf3\xe7\xab\x62"
- "\xfc\x5a\x8b\xb0\x7f\x95\xb6\x73\x3f\xdf\x02\x18\xe7\xc5\x78\x90"
- "\x96\x41\xa2\x83\x82\x1e\xfe\x0d\x5a\xa8\xf2\xce\xa8\xa7\xe5\x66"
- "\x5e\xcc\xfb\x6a\xcf\x31\xa1\x0f\x24\x1f\xeb\x92\xbe\xfe\xdc\xab"
- "\xc1\x11\xfc\x4b\x1f\xe9\x1d\x34\xf9\x68\x71\xf8\x2c\x2f\xdd\xc0"
- "\xf4\xa4\x7b\x00\x0d\x69\xf9\x55\xa1\x5f\xcf\x9d\x2f\x75\x81\x97"
- "\xa9\xa7\x3c\x4d\xaa\x0d\x19\x4f\x1c\xaa\x0b\x3a\x5b\x32\x63\x72"
- "\x47\x8b\x4f\xf0\xf1\xe7\x08\x6f\x7e\x7e\x30\x97\xd6\x08\x49\xbb"
- "\xa7\xfe\xad\xf6\xf2\x24\xa9\x73\x97\xf4\xad\xa5\x40\xed\x83\x8f"
- "\x68\x96\x6a\x83\xa8\x97\x78\xdd\xe2\x03\xce\xd5\xd3\x58\x80\xce"
- "\xbb\x34\x78\x51\x7f\xa9\xed\xa4\x57\x06\x1d\x6e\x79\x75\x63\x48"
- "\x2f\x63\x20\xbe\xd4\x23\xe5\xa3\x96\xae\xf8\xbd\x23\x29\x0b\xb5"
- "\xf4\xc5\xfc\x0d\xfc\xfc\x6b\x71\xb8\xd6\xac\xa6\x63\x2d\x8f\xe6"
- "\xae\x5f\xfe\x68\x7e\xee\x3a\xdb\x6c\xeb\xba\xd5\x62\x6b\x4e\xa8"
- "\x01\x8a\xd6\xad\x78\xd4\x4a\x54\x24\x77\xc1\xa2\x45\xb9\x77\x3e"
- "\xf8\x83\x1f\x26\xb1\x3b\x97\x23\xad\x68\x8d\x75\x51\xd6\x6c\xf9"
- "\xea\xfe\xbb\xef\xfa\xb7\xdc\xbb\x16\x3f\x78\xdf\x03\xe3\xd8\xc6"
- "\x9a\x80\x13\x75\x18\xa3\x49\xbd\xec\x97\xf3\xa5\x2d\xc4\xcb\xf6"
- "\xb1\xb6\x10\x2f\x03\x56\x2f\xef\xc5\xaf\x83\xb1\x5f\x66\xe0\x37"
- "\x1f\xbf\x2c\x89\x37\x89\xa0\x81\x2f\xef\x89\xe1\x0d\xbd\x93\xf6"
- "\xc2\x52\xf7\xfa\x32\xe8\xdf\x4b\xe1\xf8\x77\x31\x5a\xf0\x8b\x57"
- "\x04\xbd\x54\xf1\x82\xf0\x21\x37\x6c\x14\xb8\x21\xf9\x95\x97\xc3"
- "\x1a\x6e\x88\xf3\x76\x48\x27\x9d\x19\xbd\x07\x7e\x67\x90\x7e\x19"
- "\xb8\x50\x47\xfb\xa2\x94\xce\x93\xe7\x66\xa8\xe5\xce\x21\x7d\x33"
- "\xf1\xb3\xea\xfe\x49\xca\x49\xf6\x8b\x9f\x72\x67\x4b\x48\xca\x82"
- "\x2f\x5f\x27\xf0\x66\xf3\x8c\x3b\xc5\x3e\x94\x38\xd7\xf0\x8b\x82"
- "\x18\xfe\xfc\x92\xce\x35\x08\xba\x20\x69\xef\x2f\xb6\x9c\xa7\xc7"
- "\x49\x40\x5a\x83\xe6\xaf\xba\xe8\x6a\xa6\x37\x5c\x5d\xc7\xea\xf5"
- "\x1c\xbc\xc2\x2f\x16\x4a\x7b\xb8\x5f\xb4\x69\xfc\x33\xee\x31\xff"
- "\x3f\xb3\x9d\xaf\xff\xaa\x89\xd3\x7f\x95\xda\xf8\xf1\x4e\x9b\x9f"
- "\x78\x64\xb7\xc7\x2f\xfc\x24\xde\xde\x69\x0b\x90\x6f\xbd\xa4\x7e"
- "\xf6\xcb\x64\x47\x84\x9f\xc3\xfd\x0c\xf4\x4d\xac\x21\x37\x49\x9d"
- "\x02\xe4\xb1\x5f\xde\x26\x65\x13\x99\x4e\x70\xf7\xb2\x97\xc9\x8e"
- "\xc9\x40\xe3\x83\xfb\x06\x8c\x51\xf6\x78\x74\x2f\xa5\x5c\xaf\xfa"
- "\xa3\xf9\xe5\xd3\x24\xa3\x12\xac\xb6\xe9\x95\x82\x6d\x4e\xfc\x70"
- "\x25\xda\x17\xe3\x2f\x79\x48\xc2\xf6\x97\x75\xed\x76\x1f\xad\x9b"
- "\xe3\xee\x17\x88\x35\xab\x98\xf7\x68\xe3\xb9\x38\xe2\xbf\x9d\xc6"
- "\x2b\xe8\xfc\x65\x87\x36\x96\xc3\xd7\x6e\xb3\x25\x94\x33\xeb\x81"
- "\xc6\x5b\x28\x1d\xf3\xff\x97\x0b\x55\x3b\xcc\xc0\xf9\xdf\x82\x0e"
- "\x67\xcb\xef\xf7\x1a\xb5\xef\xcf\xf7\x73\x2a\x0e\x0a\x92\x92\xeb"
- "\xbb\x42\x15\x96\xa9\x86\xa5\x1d\x73\xe6\x87\xce\x72\xb6\x4b\x9c"
- "\xd4\x74\x70\xa9\xb2\x3f\xaf\x40\x96\x80\xfc\x5d\x79\xe2\x19\x55"
- "\x0f\x80\xb9\xbd\xf7\xc5\x1b\x19\x5b\x15\x58\x9f\x13\xd5\xa1\x90"
- "\xee\x83\x7c\x97\xa1\x1d\x75\x71\x3a\xb2\xa8\xad\x98\x97\xbd\x42"
- "\x32\x31\x64\xed\x13\xf5\x54\x0e\xcd\x2b\xa9\xb7\xd9\xeb\xf6\x04"
- "\x18\x43\x79\xab\xc5\x1e\xa8\x73\xaf\x45\xe0\x1e\x64\x6d\x21\xe7"
- "\x97\xf0\x2f\x54\x5b\x0a\xc1\xbb\xc8\x73\x41\x7b\x03\x51\x5d\x90"
- "\x38\x23\xb3\xd7\x46\xf6\xa1\x41\xe7\x2b\xa6\xf1\xf4\x85\xa0\x0f"
- "\x05\xcb\x57\xe7\xad\x79\xe4\x91\xbf\x4d\x1a\xe2\x6d\x36\xeb\x9c"
- "\x8a\x0b\x65\x42\xfe\xad\xb7\x48\x3c\x7d\x05\xf4\xbf\xb2\x40\xf2"
- "\x6f\x3f\x3a\x81\x79\x73\xd5\x49\xf6\x4a\x87\xc6\xbf\xcb\x79\xf4"
- "\xca\x61\xee\x7c\xc5\x12\x9b\x1b\xaf\x34\x7f\x7d\x6e\xbc\xb2\x6f"
- "\xfc\xb9\xf1\x4a\x37\xd6\xd9\x1e\xbc\x3f\x8c\x3a\xc5\xde\x0b\x3d"
- "\xab\x3c\xb8\xdb\x1c\xbe\x5d\xf0\xe0\xb9\x1b\x98\x8e\xf8\x6f\xd2"
- "\x4d\xd3\x7a\x10\x81\x5c\x1b\x01\x8d\xc8\x0d\xb3\x54\x5a\x0b\x6a"
- "\x57\x93\xde\x71\x16\x0f\x8f\x70\x6f\xee\x06\xd0\x0b\x3c\xd7\x9c"
- "\x94\xfb\xb5\x0f\x9d\x81\x1c\x82\xfb\xda\x7e\xa2\x15\x0a\x39\x55"
- "\x67\x72\xbd\xfe\xd5\x42\x8d\xc7\x35\x97\x5b\x85\xaf\x5d\xb1\x6e"
- "\x03\xcf\x68\xdd\xce\x8d\x98\xdd\x72\xdd\xfe\x95\xed\x82\x3a\xee"
- "\xe4\x99\xde\xf1\xd2\xd1\xc6\x76\x6a\x17\xda\xd9\x8a\x76\xed\xa3"
- "\xf6\xd4\x3c\x42\xfd\x4a\xb8\xd5\x1c\xce\x12\x7b\x0c\xd4\xce\x87"
- "\x02\xec\x56\x6a\xdf\x43\x3f\xbd\x95\x35\x3d\x42\xfb\xc4\xd2\x3e"
- "\x48\xc5\x25\x03\x70\x66\x4a\x3f\x7b\x35\x23\x20\x62\x1f\xfe\x0a"
- "\xb4\xc8\xd8\x2e\xf9\x60\xb9\x07\x43\x79\xe8\x9d\xc4\xd3\x57\x33"
- "\x0e\xd8\xa9\xcd\xaf\x66\x68\xf9\xe2\xdb\x76\xd7\x72\x1b\x18\xcb"
- "\x95\x8f\x3c\x92\x5f\xb8\x56\x8b\xe3\x9c\xb9\x66\x55\xde\x6d\xea"
- "\xb9\xd9\xd5\xf9\xeb\x73\x57\xe6\x09\xbb\x7c\xa4\xca\xdb\xf3\x78"
- "\x8d\xd9\x24\x0b\x08\x5b\x57\xc1\x67\xec\x23\x1b\x2e\xc1\x73\xf4"
- "\xb2\xd6\x3a\xb9\x8f\xdd\x7a\x8f\x5c\x07\xa6\xae\x47\x3b\xf6\x6a"
- "\xeb\x00\xe9\x23\x86\xd9\xd5\x2e\xda\x5f\xa2\xb3\xd0\xb4\x8f\x45"
- "\x3a\x09\xe4\xe9\xf2\xb2\x5f\x95\x68\xb8\x5d\x8d\x74\x3a\x7f\xe1"
- "\x5e\x4d\x36\x7b\xfb\xae\x56\xb6\xfa\xaa\x78\xd2\x91\x6c\xd0\x00"
- "\x13\xad\x0d\xb4\xaf\x22\xfd\xe6\xb7\xa6\x13\x6d\x23\xbd\x99\x7b"
- "\x35\xd9\xc0\xbd\x4a\xba\x8e\x54\x2f\xdb\x97\x01\xb9\xa8\x6a\xcb"
- "\x46\x66\xa4\x3a\xb0\x6e\x78\xa5\x0e\xb6\x75\xde\xbb\x25\x8c\xa9"
- "\x6b\x87\xb7\x5a\xe8\x04\x5b\x65\xcc\x00\x97\xaf\x59\xd5\x39\x34"
- "\x23\x1f\xf0\x3f\x99\xc9\x36\x1f\x29\x10\xfb\x67\x82\x2e\xb4\x6e"
- "\xe1\x95\x47\x42\xc2\x4e\xb1\xf2\x48\x81\xc2\x0b\x12\xe8\x19\x74"
- "\x39\x09\xfc\xfe\x5e\xee\xc8\x64\xaa\x6d\x63\x42\x3f\xfb\x75\x32"
- "\xe9\x4c\x31\x1e\x8d\x04\x0b\x94\xbf\x57\x2d\x7f\x2f\xca\xc7\xfa"
- "\x77\xa5\x1a\xb3\xb2\xf5\xa0\x56\x17\x70\xdb\x8f\xb5\xab\x8a\xd6"
- "\x2f\xb4\x7f\x0b\x7e\x2e\xa9\x9f\x09\x41\x4e\x9a\x15\xd5\xcf\x48"
- "\x1e\xe9\xd7\x06\x0d\x27\xa9\x6e\xb5\x0f\x2d\x8a\x53\xf8\x4c\xd4"
- "\xa9\x75\xb5\x90\xae\x40\x2b\x93\xa3\x4c\x3e\xe2\x6b\xc6\x5a\x63"
- "\xc4\x1c\xf3\xa7\x94\x63\x4d\xa1\x3a\x88\xc7\x0d\xcc\xe2\x58\x73"
- "\x22\xb9\x11\x83\x3c\xb7\xbe\x81\x25\xc7\xf3\xb7\xa8\xaf\x28\xc6"
- "\x93\xa1\x8c\x11\xd0\xb2\x52\x3a\x0c\xf1\x6b\x71\x96\x80\xec\x42"
- "\x68\x5c\xcf\x61\x9c\x30\x56\x0b\x51\x4f\x2b\xf8\xf2\x64\xc0\xe1"
- "\xd7\x34\x5e\x35\x0a\xe6\xdc\x39\xc1\xab\x9b\x29\xc6\x79\x2f\xfb"
- "\xf5\x2e\x1a\x2b\x2a\x0b\x78\x61\x09\x07\x73\xfe\x85\xfc\x46\x11"
- "\xac\x37\x95\xf0\x01\xda\xeb\xeb\x67\xbf\xb9\x9a\x78\x58\xf0\xf5"
- "\xe2\xde\x91\xc7\x15\x31\xd6\xc2\xde\xf1\x37\x57\x6f\x1a\xe0\xca"
- "\x59\x27\xe3\x1d\xa0\xa5\x67\xf5\x2c\x1c\x82\x0c\x8a\x76\xeb\x1d"
- "\x83\xe4\xdb\xaa\x19\xf3\xcb\xc5\x50\xaf\xb1\x66\x23\x4b\x25\xbf"
- "\x60\x0e\x1b\x0f\x75\x06\x1a\x59\xa7\xad\x91\xfd\x31\x5c\xcf\xdc"
- "\xc5\xa4\xd3\xfc\x4d\xc7\x87\xf6\x7a\xb2\x2f\x4f\xc4\xfd\x56\xeb"
- "\xbf\x51\x5d\xff\xb5\xec\xc3\xc3\x1f\xb3\x0f\xdd\x1f\x33\xeb\xbf"
- "\x8b\x67\xdb\xc1\x9c\x3f\xb2\x83\xd9\x7f\x64\x8e\x3e\xae\x10\x3f"
- "\x54\xfa\x18\xd5\xe1\x42\x59\xcd\xe4\x43\x2b\x55\x19\xb6\x24\xa1"
- "\xff\x86\xc5\x76\x26\xf6\x13\xdd\xab\xdf\x40\x1b\xff\xeb\x74\xd3"
- "\x10\x33\xba\x57\xbf\x27\xee\x85\x7e\x01\xfd\xf5\xe4\x75\x0b\x5b"
- "\x33\xf2\x1f\xe6\xb1\x0f\xd0\x39\x4d\xa5\x96\xda\x18\x91\xed\x06"
- "\xbc\x0c\xda\xf7\xbb\x4b\xa3\xdf\x0b\x9b\xc6\x5d\x04\x0f\xb4\xe9"
- "\xd0\x03\x12\x26\x07\xbb\x01\xd3\x7f\x53\xe1\x93\x13\x0f\x9f\xff"
- "\x4a\x25\xf8\x90\x1d\xa9\x52\xec\x6b\x46\xdb\xb2\x01\x03\x45\xab"
- "\x83\x70\x80\xf6\xbd\xa8\xfc\x9a\x21\x66\x72\xaf\x26\x3b\xd3\xdf"
- "\xac\x33\x2f\x31\x18\x95\x91\xc1\xd6\xda\x33\xcc\x40\xe3\x46\xeb"
- "\x6c\xad\x78\x2f\x60\x9e\x43\x63\xe6\x4f\x3c\x51\x86\x1f\xf0\xf3"
- "\x84\x8b\x70\x0f\xd7\x2a\x8c\x97\x0b\x70\xf2\x63\xac\x9a\xe9\x2a"
- "\xf1\xf1\x68\x1b\xf9\x55\xa4\xb5\x0c\xb8\x12\x4b\xaf\x3c\xfa\x5a"
- "\x18\x73\x47\x11\x72\xda\x7f\xf9\x95\xad\x23\x2e\x69\x73\xf8\x6a"
- "\xd6\x2e\xf0\xc5\x8d\xcf\x88\x73\xed\x26\xf0\xf2\x24\x9f\xb3\x1d"
- "\xe2\xfc\xcb\x6f\xa2\xeb\x5f\xa5\x88\x39\xfe\x1b\xab\x5e\xd8\x96"
- "\xf9\xf6\xa8\xb8\xbe\x27\xe8\xdc\x07\xf9\x77\x7a\x97\x9c\x13\xad"
- "\x6e\xa1\x87\x00\x1d\x98\x88\x27\x01\x5d\x3e\x48\xb6\x7a\xfc\xca"
- "\x1c\x66\xd2\x71\xbf\x69\x99\x99\x7b\xc2\xed\x84\x43\x26\x81\xfb"
- "\xf2\x1d\xf8\x48\xbf\x19\xb4\xbc\x0b\xe9\x06\x2d\x9d\xe8\xba\x02"
- "\xd9\x92\xe4\xda\xc5\x1b\xcc\xbc\xf4\x0c\x4b\x17\x3a\x22\x2d\x7d"
- "\x83\xdf\xdc\x69\x61\x64\xbb\x1f\x26\x7f\x16\xf4\x0d\xd2\x13\xb0"
- "\x0e\xec\x47\xbd\x6e\xe4\x4f\xd3\xf2\xf3\xe1\x1c\x83\xc7\xde\x2e"
- "\xe6\x19\xf9\x3c\xd2\xd6\x05\xa4\x4f\x5a\x6c\xf7\x9b\xc5\x98\x69"
- "\x69\x6b\x73\xc4\x3a\x46\x67\xe7\xc1\xa7\x72\xd1\x9e\x7e\x91\xae"
- "\x83\x9c\x29\x62\x9a\xc7\xa5\xe9\xc9\x4f\x01\xf9\xb0\x8b\x4b\x4b"
- "\x40\x9b\x59\xf4\x19\x75\xd7\xfe\x44\xec\xf7\x5b\x16\x6f\xa0\xfd"
- "\x32\xd4\xf3\x13\xb5\xee\x0d\x9c\x49\xbf\x98\x32\x4d\xae\x99\xbf"
- "\x2d\x89\x97\x71\x69\x8f\x82\xea\x56\x86\x73\xf4\x91\xe1\x9c\x04"
- "\xaa\x9f\xca\x22\xfd\xa4\x88\xad\x1e\x1e\x60\xe4\x93\x99\x57\xcf"
- "\xcd\xe6\x74\x56\x03\xe5\x8a\xf6\xd8\x21\xff\x27\xcf\x75\x8f\x6b"
- "\x67\x51\xf5\x4d\xc8\x5a\xff\x0e\x9c\xfe\xdd\x16\xa2\x29\x11\xe3"
- "\xe0\x3e\xeb\x4f\xc8\x7e\xe1\xb7\x11\x1a\xd3\x08\xe6\x79\x24\x71"
- "\x70\xdf\x4d\x03\x4c\x57\x8a\xb9\x23\xf7\xf1\x7e\x77\x15\xf1\x54"
- "\x0e\x85\x73\xdc\xa7\x12\xee\x9a\x7d\x90\x5b\xb6\x0e\xb6\x09\xbb"
- "\x91\x94\x59\x7e\x4f\x68\x80\x1d\x2c\x3b\xca\x0e\x86\x3d\x65\xfb"
- "\x87\xfc\x06\x69\x3f\x62\x40\xb9\xbf\xbb\x99\xde\x39\x30\x5f\x72"
- "\x23\xcd\x13\xcb\x81\x90\x2d\x00\xbb\x4f\xe5\x5a\xf0\xbb\x2d\x9a"
- "\x3c\xf1\x37\xfa\xd0\x43\x7e\x08\xc9\xbe\x4e\xa9\x54\xac\x68\x8b"
- "\x83\x07\x33\xd9\x4d\x1b\x49\xaf\xfb\xbb\x7d\x29\x01\x96\xad\x96"
- "\xfb\x95\x5a\x6e\xcf\x85\xca\x25\xbc\x3d\xd8\x20\x6d\x36\x94\x24"
- "\x25\x35\x82\xb2\x23\x49\xca\x12\xac\x35\x0e\xc7\x59\xd2\x9d\xb4"
- "\x5d\x8d\x7a\x52\x3b\xc3\x5d\x8c\x7c\x99\x36\x29\x58\xaf\xbf\xb2"
- "\x30\xd5\x56\xc6\x71\x8a\xbd\x96\xac\xf0\xcc\x54\xc8\x39\xa4\x2b"
- "\x75\x10\x9d\x25\xdd\x73\x69\x84\x4d\xf6\x80\xc2\x93\x0f\x3e\x94"
- "\x71\xd9\xfb\xa4\x97\x06\xad\x8a\x70\x8b\xfe\xad\x11\x2f\xab\x05"
- "\xfd\x16\x3e\xf9\x36\x5f\xb9\x23\xa5\x9c\xdd\xce\xf5\x66\x61\x0b"
- "\x85\xf5\x25\x13\x63\xbb\x50\xb4\xa7\xd2\xb7\x2f\xce\x2e\x27\x01"
- "\x75\x3d\x4d\x76\x39\xdc\xe8\xb3\x37\xd2\x9a\x89\x31\x0b\x3a\x5f"
- "\xdb\xef\x65\xbf\x15\xbe\x4f\xaa\x48\x0f\x20\xe8\x7c\xdb\x75\xfe"
- "\xc4\xb3\x14\x67\x81\xe2\x13\xea\x94\xe2\x70\x6b\xed\x69\xf0\x3d"
- "\x02\x1e\x6d\x89\x9d\xbe\xa0\x9b\xbb\xce\xfa\x69\x1e\xa9\x65\x9b"
- "\x51\xf6\x11\xbe\xf5\xac\xdf\xcb\xda\x32\x25\xad\xa1\xfb\xd7\xc4"
- "\xf9\xef\xf0\x28\x9d\xe7\x79\xcd\xd6\x78\x8e\x74\x72\xaf\xa5\x83"
- "\x2f\x74\x0f\x1b\xcf\xfa\x7f\x60\x29\x03\x0f\xd0\x36\xdf\xab\xeb"
- "\x15\x7c\xa8\xe6\x5f\x70\xa2\x3d\x28\xbe\xd3\x92\xe4\x41\x21\xe0"
- "\x71\xd3\x4e\xb2\x37\x5e\x39\x07\x39\x7f\x14\x6b\xeb\x39\xc8\x09"
- "\x7c\x67\x8e\xa9\x66\x06\xcb\xc2\xbb\x19\x27\x59\xdb\xd3\x61\x3d"
- "\x4b\xc3\x2f\xd5\x7f\x65\x41\x22\xca\xcd\x26\xfd\xe7\xa1\x21\xda"
- "\x93\x6d\x13\x74\xbf\x76\x07\xcb\x50\x50\x1e\xe9\x5d\x6b\x67\xb0"
- "\x0c\xd2\xb9\x22\x2d\x33\x37\x22\xf7\x24\x34\x99\x6a\xf3\x0c\x36"
- "\x7b\x6c\xbd\x6d\xea\x19\xbf\x37\xc4\x1a\xbf\xde\xcf\x66\xda\xbe"
- "\xc7\x7b\xfb\xd9\xeb\xab\xb8\x33\x81\xf3\x2b\x2d\x7a\x29\x53\xbc"
- "\xfe\xa0\xb9\x41\xe2\x9d\xd0\xc1\x03\xdf\x68\x8f\x43\xd5\xed\xea"
- "\x84\x5f\xc5\xa4\xa1\x05\x74\x9e\x42\xa4\xe9\x52\x09\x96\xa9\xa2"
- "\x1d\xaa\x2f\xb4\xc8\xe6\xeb\x97\x51\x19\xd4\x9e\xdc\xe5\x52\x2f"
- "\x4c\x7e\xd2\x00\x63\x11\x67\xaa\x6a\x07\x33\x3d\xb5\x83\xa5\x1e"
- "\x7a\x84\xfa\xf5\xfa\x16\x39\x17\x0d\x8c\xda\xab\xb8\x68\x9e\x01"
- "\x27\xd0\x6e\xaa\x8f\x70\xa3\x33\xfc\x95\xdb\x51\xc4\x15\xf7\x4f"
- "\xc8\xa7\xc0\xeb\xef\xbb\x0b\xf7\xb2\xc5\x7d\x61\xe9\xdb\x67\x29"
- "\xf3\xef\x46\x79\xbb\x67\xb0\x54\x94\xf5\x91\x67\x15\xd1\x5a\xcb"
- "\x37\xdc\x85\xfb\xa8\xec\xcf\x69\x3d\xaa\x06\x7c\xe4\xba\xf4\x46"
- "\x83\x27\xd4\xcd\xc8\xaf\xfc\x7d\x36\x1e\xa1\x72\xfa\xd9\x1b\x57"
- "\x89\xfe\xee\xb4\x58\x73\xa5\x2f\x3b\xd1\xd7\xa8\xbe\x5d\xed\x87"
- "\x67\x88\xca\x7b\x23\xcb\xb3\x0c\x3c\xa7\xda\x27\x0d\xd6\x12\xbf"
- "\xde\x78\xcc\x5d\xb8\x87\xd1\xf8\x50\x7e\x3c\x2f\xf5\xf8\x90\x77"
- "\x70\xec\xb8\x50\x1e\xbc\xab\x46\xb9\xff\x27\xb6\x8f\x44\xfb\x1b"
- "\xb1\x3c\x8d\xe8\x0f\x60\xd5\xb5\x13\x30\x92\xfa\xb5\xd7\xcf\x52"
- "\x5b\xbd\xec\xf5\x90\xa7\xe8\xe8\xf8\xe7\x98\x30\xf7\x81\xf7\xe5"
- "\x9d\x42\xb7\xf4\xc6\x89\xfb\xc2\x0a\x97\xf4\xec\xcd\x46\xcc\xad"
- "\x90\x17\x57\xa2\x05\x82\x9e\xdc\x48\x7b\xbf\x6f\xee\x32\xeb\xe4"
- "\xf8\x52\x5f\x88\x67\x1a\x6f\x8c\xe3\xf4\xfa\xa9\xd4\x56\x6d\x8c"
- "\xb9\xe9\x9b\x21\x85\xf6\x6b\x66\x00\xde\xa3\x16\x26\xf1\x8f\xd7"
- "\xa1\xdc\x6a\x95\x87\x0c\xa9\xeb\x69\x68\x38\x71\xd0\xcd\x1f\xb7"
- "\x30\xcd\x66\x0f\xf3\x77\x7f\xae\xb4\x83\xb4\x10\x8d\xda\xad\x97"
- "\x73\x87\xda\xa8\x7e\x1b\x90\xfb\xc8\x6f\x2e\xc5\xf7\xe3\xc7\x15"
- "\x4f\x98\x41\x71\x84\x1d\xe4\xb7\x4f\x9c\x2f\x00\xad\xc2\x7a\x30"
- "\xd9\x13\x38\xc7\xe4\xde\xf6\xfe\x2b\x28\xc6\x3b\x9d\x2d\xd3\xda"
- "\x76\x71\x3a\xf8\x37\xfb\xa4\x0e\x7e\x7f\x86\x26\x6f\x72\x13\x60"
- "\xec\x34\x0b\x1f\xe3\xe0\xbb\x94\x40\x72\x06\xf3\x27\xcf\xcd\x92"
- "\xf3\x66\xff\x22\x9e\x2c\xe9\x6d\x6e\x88\x95\x51\xbf\x54\xb9\x6b"
- "\x32\xf5\x19\xe5\xac\xd2\xf6\x82\xb5\xb2\x27\xf4\xdb\xaf\xf5\x0d"
- "\x7d\x12\x7d\x43\x1f\x45\xdf\xc8\xaf\x86\xec\x9b\xd8\xcb\xbc\xb8"
- "\xfe\xec\xdf\x27\xd7\x9e\x0c\xe6\x9e\x41\x65\xbc\x5d\x2e\x6c\xfa"
- "\x31\x26\xa0\x0f\x97\x9f\x64\x6f\xcd\xe7\x49\x4f\x25\x5d\x5c\x99"
- "\x6f\xc9\x18\x89\x55\x73\xb3\x9e\x05\x0d\x96\xe7\x8c\xc8\xbe\xe5"
- "\xed\x95\xa0\xe5\x59\x24\xc3\x0c\xa3\x3e\xe0\x47\x1c\x1d\x7a\xcb"
- "\x47\x63\x75\xe3\x5e\x96\x2d\xf1\xf0\xad\xe3\xa4\x97\x90\x71\x55"
- "\xde\xaa\x03\xde\x3f\x20\x60\x1d\xb5\xef\xd4\x09\xfb\xce\x78\x1a"
- "\x7b\x91\x6d\x94\x32\x4d\xca\x55\x90\x0d\xdf\x2a\x13\x36\x3c\x68"
- "\xef\xfa\xb0\x46\xff\xde\x2a\xe3\xa4\x1b\x2e\x55\x75\x84\x44\xcb"
- "\x4a\xa5\x5f\xae\xa0\xf3\x6d\x6b\x54\x47\x48\xe7\x30\x9d\xbc\x83"
- "\xf2\x61\xec\xbf\xa2\x3c\xd2\x6f\xd0\x49\xf5\x8c\xe2\xdb\xdf\x56"
- "\xcf\x1f\x66\x92\x5d\x13\xbe\x5d\xea\x65\xbd\x42\x5e\x25\x18\x50"
- "\xdd\xa2\xed\x7a\xd2\x07\xbe\x6d\x8f\xe9\x64\xdf\x92\x67\x1a\x85"
- "\xfd\xcb\xdb\x75\x1a\x8e\xa0\xbf\x93\xa5\x2f\xfd\xfd\x67\x0f\xcc"
- "\x66\x02\x07\x86\xb9\x25\xe9\x9b\x8d\x84\x93\x6f\xb7\xc5\xc3\x69"
- "\x71\x58\x71\x48\x1a\xf4\x56\x33\x17\x73\xfd\xad\xe6\xbf\xcd\x4f"
- "\xbc\x93\xac\xf1\x22\x12\xce\xa9\x68\xe3\xbb\xdd\x02\xd6\xae\xa3"
- "\x39\xe4\xeb\xf2\xf1\x52\xf2\xdd\xfb\xce\x21\xf2\x91\x1c\x76\x1d"
- "\xb5\x47\x1c\x16\xf2\x09\xc9\x14\xd7\x51\x57\xbf\x8d\xe9\x73\x6d"
- "\xa4\x87\x3e\xeb\x26\x19\x0f\x32\x6b\x2a\x4f\x02\x7f\x82\x79\xbe"
- "\x69\x25\x33\xff\x47\x01\xca\x76\x64\xa6\x91\x0f\x63\xf2\x5f\x4c"
- "\xfe\xc7\x23\x8e\xcc\x4b\x70\x3f\x1d\xfc\x5c\x2a\x37\x1e\x2d\xa0"
- "\xbd\xec\x88\x93\x83\x1e\xf7\x90\x1f\x65\xbd\xc7\x1f\x62\x9b\x06"
- "\x99\x91\x7c\x24\x87\xb7\x9e\xed\xee\x0c\x1c\x13\xf2\x4d\x8a\x8d"
- "\xa5\x81\xff\x48\x07\xcc\x2d\x4a\xe2\x59\xc8\xa1\x67\xdb\x65\xbf"
- "\xbf\xe2\xb2\xdf\xb2\xdd\xd4\x7e\x41\xe3\x5c\x3d\xae\x52\xd1\xf6"
- "\x77\x7f\x1a\x46\xf9\x8a\xeb\xf8\x96\x88\xeb\x78\x99\x3c\x07\x7b"
- "\x90\x95\x16\xf1\x01\x4f\xe0\x20\x64\xae\x33\x22\x5e\x14\xed\x95"
- "\x53\x1f\xa9\x7f\x54\xf7\x87\x43\x83\xc2\xe7\x73\x18\xcf\x8e\x55"
- "\xea\x37\x3e\x7c\xe3\x3b\xc8\xce\xb9\x8e\x8b\xbe\x77\x06\xe4\xb7"
- "\xb9\xe2\x9e\xbe\x8f\x83\x83\xda\xe7\x28\x1c\xd0\x77\xea\x1f\xf5"
- "\x3f\x4c\x30\x01\x0c\xd4\xbe\x5a\x46\xd5\x7e\x52\x1f\xff\x88\x55"
- "\x67\x07\xfa\x89\xbe\x8a\x7e\x8e\xa2\x9f\x1d\x05\x8c\x85\x6a\x32"
- "\x52\xcf\x26\x1d\x2f\x23\x19\xd5\xf1\x11\x78\xf8\x92\x3a\x06\x59"
- "\xd4\xf0\x4a\x69\x9d\xbe\x12\xbc\x49\xa9\x1f\x32\xa9\x9f\x0f\x90"
- "\xbd\xab\xc7\x86\x5f\xb8\x91\x11\x8f\xa3\xf1\xeb\xa8\xdb\xf2\xa1"
- "\xf2\x39\x2b\x1d\xe0\x03\xe0\x4d\x43\x9e\x30\xf2\x14\xa0\xff\x90"
- "\x61\xfb\xd5\xf6\x53\xde\x4d\xa7\x65\xbf\xcc\xab\x58\xda\x3b\xff"
- "\xee\xd2\x7b\xba\x5d\x4c\xeb\xcb\x43\xc8\x87\xfe\x58\x50\x56\x32"
- "\xf5\x47\x41\x3f\x77\xa2\x9d\xa1\xb8\x3e\x1d\xf2\x91\xcd\xed\x27"
- "\x2c\x69\x09\xd3\xed\x38\x85\x7e\x9c\x62\x96\xba\x52\xf0\x5f\xf7"
- "\x13\xbf\xe8\x7e\x79\x6a\x0e\x03\x2d\x7d\x47\xc6\xab\x94\xfe\x57"
- "\x2f\x3b\xc9\xde\xfd\x28\xea\x63\x95\xfc\x56\x27\x9e\xed\x21\x3c"
- "\x12\xbe\x56\x69\xcd\x08\x02\x67\x68\x4f\x7b\x3d\xea\x08\x66\x4e"
- "\x17\xed\x71\xce\x21\x9b\x5a\x13\x9e\x29\x5e\x0b\x9d\x31\xd3\xe1"
- "\xbb\x6e\x0e\x98\x51\xf9\xe0\xe7\xda\xe9\x4a\x30\x1c\xd7\x3e\xf5"
- "\x57\x6c\x1e\xea\xd8\x47\xf2\x77\x6b\xa9\x5f\xff\xc4\xaf\xd8\xec"
- "\x8b\xa3\x29\xef\xb1\x89\xe8\x37\xe9\x32\xa9\x3c\xf4\xed\x92\x93"
- "\xec\xbd\xcf\xc7\xce\x31\xab\xa0\x65\x92\x0e\xbe\xb7\x97\x74\x85"
- "\x17\x59\xaf\xe0\xe1\xc8\x1e\xe1\x22\xbf\x6b\xd5\xda\x81\xfb\xaf"
- "\xd9\x11\x69\x6d\xbf\x78\x38\x1c\x30\x4e\x54\x56\xf5\x73\xc2\x9e"
- "\xd0\x51\xf3\x1c\xe8\x05\x78\x85\x03\x16\xda\x77\xc0\xda\xb9\x27"
- "\xc0\xd6\xee\x62\x46\xc7\x20\xe9\x85\xee\x65\x07\x1a\xb3\x58\xd3"
- "\x10\xf9\x79\xca\xbc\x64\xdb\x10\xc6\x52\xa5\x21\xc4\x93\x92\xce"
- "\x95\xaf\xcd\x4c\xad\x7d\x4e\xe3\xe1\x0f\x7c\x54\x72\x86\xe9\x65"
- "\x8c\xee\x03\x5d\x0b\xac\x3c\x5c\xaf\x57\x0a\x1a\xc9\x77\x70\xca"
- "\x4c\xe2\x5f\x0a\x34\x7f\xbc\x82\xf7\xb1\x63\xce\x0d\x5b\x92\xaa"
- "\x0b\xd9\x6c\xf2\x21\x6e\xf6\x4b\x5e\x4e\xae\xd7\xed\xb4\x1f\x92"
- "\xaa\xfa\xe8\x4d\x95\x3e\x7a\xdf\x5b\x48\xf6\xd9\xea\xfb\x9b\x23"
- "\x90\x61\x44\xb9\x85\x2c\xa3\x71\x88\x65\x12\x1f\x94\xfb\xb9\xe4"
- "\xd9\x48\x2e\xbc\xd7\x67\xe6\x91\x2f\x33\xd9\xae\x93\x31\x1f\xe3"
- "\xfe\xb5\xe4\x97\x9c\x5b\x26\xb2\x35\xae\x9d\x2e\xf6\xde\x85\x7f"
- "\x4b\xd2\xc9\xe3\x99\xd5\x3f\xc3\x0c\x07\xc8\x8e\xaf\x59\x9e\x5b"
- "\x3a\x10\x96\xb6\xb1\x41\x67\x7b\xb3\xe6\x7b\x79\xc2\xbd\x65\x97"
- "\x94\x77\x94\xc9\x90\xbf\xfc\x41\xb7\xf4\x1b\xd8\x3e\xe0\xd9\xa2"
- "\xc4\xc9\x38\xed\x1f\xd0\x3b\x4a\x23\x5f\x4c\xd9\x02\x96\xef\xa7"
- "\x92\xdc\xa3\xca\x8c\xef\x58\xb5\x34\x55\x66\x14\xf6\xc9\x16\xb9"
- "\x57\x86\xb5\x29\x25\xe8\x7c\x7f\xb6\xb6\x9e\xd1\xba\x2e\x75\xc3"
- "\xef\x67\x7b\x75\x7d\x5f\xb3\x13\x88\xdf\x1b\x51\xed\xa9\x69\x9f"
- "\x23\x1b\xf9\x6d\xda\xfa\x26\xf6\x3b\x37\xcf\xb8\x73\xed\x06\x96"
- "\xfe\x83\x2b\x8c\x8c\xf6\xca\x90\x77\x40\xae\xbb\xef\x37\xc4\xf4"
- "\xe9\xd9\x02\xde\x74\xae\x58\xc8\x18\xe4\xaf\x4f\xfa\x11\xf7\x69"
- "\x7e\xfb\xe4\xfa\xfb\xfe\x6f\xe3\xea\xe9\x8e\xae\xa3\xa8\x83\xec"
- "\xb5\xa9\x7c\xc9\x9b\xbc\x5f\x25\xce\x9e\x21\x9f\x5c\x5f\xdf\xaf"
- "\xba\x00\x2f\x96\x49\xf0\x55\x54\x79\xd2\xe3\xfb\x42\xc2\xd7\xce"
- "\x12\x6e\xaa\x67\x96\x77\x4a\xbd\x86\x14\xe9\x17\xd7\xdc\xcb\x7e"
- "\x7f\x1d\xbd\x27\x5c\x77\xdf\x48\xfa\xc0\xdf\x3f\xe1\xa1\x75\x7b"
- "\x34\xc7\x74\x1f\xc9\xfa\x82\x17\xff\x7d\xd1\x0d\xf8\x0e\x69\x97"
- "\xbc\x7d\x2a\x64\xa8\xdd\xc8\x66\x4b\xff\x87\xbf\x17\xf2\x86\xff"
- "\xf2\x47\x83\xdf\x4c\x63\x96\x6f\xd6\xb3\xcc\xa0\xf3\xf7\x8d\x5e"
- "\xdd\x67\xc2\x3f\x8d\xa8\xbf\x66\xee\x32\xf2\xa1\xfe\xea\x39\xef"
- "\x24\x39\x56\x7f\xf8\x0e\x9e\x33\x63\xcf\xbf\xff\x44\xdd\x4b\x01"
- "\x9f\xf3\x87\x79\xbb\x4f\x49\xbb\x73\xa1\x5f\xaa\x9a\xe9\x8d\xed"
- "\xd5\xff\xe1\x3b\xb2\x2d\x7f\xf8\xce\x01\x1b\x23\xdd\xf9\xe1\x26"
- "\xe1\x0f\xf9\x0f\x90\x39\xde\x5f\xa4\xea\x63\xba\x04\x5e\x11\xbf"
- "\x5b\x41\x32\xd8\x17\xee\x6a\xe4\xa3\x75\x02\xfc\x51\xb6\xe0\xe1"
- "\xc1\xeb\x2a\xc0\x9f\xb8\xfe\xbf\x48\xfa\xc6\x71\x69\xe2\x0e\xc6"
- "\xc4\x37\xd5\x33\xe7\x09\xdb\x8f\xea\xb9\x6d\xb8\x1a\x79\xf5\x2c"
- "\x2f\xae\x26\xa4\xfb\x71\x25\xdc\x1b\xc0\x35\x0d\xef\x9b\x09\x2f"
- "\x21\xc3\x5a\x28\x2e\xdc\x70\xf2\xcc\xac\x89\xce\x10\x11\x6c\x3c"
- "\x5b\xfe\x8d\x49\xfb\xb6\x8e\x74\x8a\x09\xb6\x78\x17\x63\x6b\xc3"
- "\xfc\x9c\x75\x26\xf9\xf5\xef\x48\x77\xec\xa2\x7d\xe7\x3f\xf8\xc7"
- "\xee\x3b\x77\xa4\xe2\xb7\x04\xbf\x3d\xf8\x1d\xc6\x2f\x3d\xf6\xfb"
- "\x20\x35\xe8\xec\x48\x07\x1c\x05\x8f\x75\x71\x34\xb1\x43\xf8\xd6"
- "\xaa\x25\xb9\x28\x51\x61\x6a\x7f\x53\xf1\x6c\xe4\xc9\x73\x97\xc8"
- "\xfe\xce\x62\x78\x4e\xb5\x3a\xb0\xae\x25\x03\x26\x33\xd0\xe7\xe4"
- "\xb9\x6d\xd4\x5f\x6a\xef\x70\xf2\x2c\x6f\xfc\xf9\x29\x2a\x93\xfa"
- "\xef\x4f\x9e\x45\xe5\x31\x7e\xed\x36\x9b\x06\x4f\x15\x4e\x74\xb6"
- "\x44\x3f\x8c\x32\x24\x1f\x84\xfc\x28\x43\xcb\x1f\x85\x3d\xf2\x09"
- "\x39\x11\xf9\x20\x13\x1b\xb5\xb3\x59\x41\xe7\x07\xc6\x77\x57\xc9"
- "\xfd\x0c\xfa\x36\x10\xf7\x2d\xf9\x0b\x19\xef\x7b\xd4\x69\x94\x75"
- "\xce\xf2\xf6\xb3\x8e\xab\xd4\x7a\xbf\xe6\x3b\x33\x7a\xfe\xf1\x6a"
- "\xf0\x77\x8d\x5e\x3a\x47\x44\xfc\xd0\x7c\x4f\x7a\x80\x79\x1a\x15"
- "\xa6\xd4\xcc\x4a\xcd\x2e\xe5\xee\x7e\xf6\xc1\x5b\x9d\xa1\x81\x8b"
- "\x5c\x0f\x3f\x10\xb6\x77\xfc\x5c\x19\xf3\x94\xdc\x22\x6c\xd9\x4f"
- "\xb1\x3f\x0e\x7a\xfc\xe2\x8c\x2e\xdd\x1f\xa1\xf7\xb4\xdf\x4c\x6b"
- "\x03\x64\xec\xa8\x6f\x7a\x05\x79\x9b\x28\x1d\x69\xe4\x47\x60\x77"
- "\xdc\x3b\x5e\x33\x53\xdd\xa7\xf9\xe3\x8b\xc4\x5b\x88\xf6\x86\xff"
- "\xc5\x4d\x6d\xc6\x5c\xb2\x50\x1f\x1c\x90\xff\x28\x1e\x1f\xcd\x09"
- "\x6b\x31\xe9\x0a\xff\x58\x0e\xbc\xe3\x90\xb5\x2d\x17\xd7\x87\x3f"
- "\x8a\xf3\xc7\x8e\x30\x3f\xe5\x4f\x9e\x69\x21\x9e\xa4\xb6\x74\x92"
- "\xf1\xae\x46\xee\x1e\x4e\x99\x05\x3c\xfc\xe3\x9e\x77\xed\x72\x6c"
- "\x2e\xb2\xdc\x3d\x5a\xdf\x9b\xd4\xbe\x23\x4d\xec\x51\xdd\xd4\x20"
- "\x7d\xf6\xe3\xb9\x67\x42\x9d\x15\xc6\x99\xf8\x01\xac\x0d\x67\x25"
- "\x2c\x3e\x9c\x1d\x5d\x1b\x2e\xaa\x1d\x1f\xce\xfe\x3b\xea\x18\x55"
- "\xeb\xa8\xfb\x07\xeb\xa8\xbb\x50\x1d\x72\xaf\xf9\x60\xfa\xc5\xcb"
- "\x8e\x1f\x8a\x18\xc9\x4a\xd5\x2c\x35\x0e\xe7\xa1\xea\x08\xe4\xb7"
- "\xb0\x69\x6e\x2a\xf1\x36\x64\x57\x4a\xf1\x0b\xc2\x2e\x85\x1d\xb2"
- "\x9f\x63\xee\xe2\x8f\x59\x1f\x3b\x28\x7c\xd8\x1c\x2a\x22\x99\x6d"
- "\xee\x92\xd1\x9a\x59\xcb\x46\xf5\x1f\xae\x22\x78\xef\xc2\x38\xec"
- "\x8c\xc3\xb3\xce\xc0\xc7\xcc\xb3\x8c\xf4\xab\x5d\xa4\xd7\x5e\x82"
- "\x79\x95\xaa\x80\x36\x80\x47\x8f\x08\x78\x80\x7f\x11\xf2\x16\x64"
- "\x36\x21\x6f\xf9\x85\x9f\xd3\x64\x11\x97\xc0\xb9\x2d\x83\x74\xdf"
- "\x91\xd1\x1c\x6b\xd0\xc9\x96\x50\xbc\x02\xd2\x3b\x73\xa3\xaf\x6e"
- "\x71\x38\x81\x0b\x79\x0a\xbc\x3f\xc5\x2b\xf0\x04\xbc\x2c\x02\x3e"
- "\xba\x71\x84\xa5\x35\x82\xf7\x04\xcd\x4e\x25\xba\xbe\x5b\x8d\x59"
- "\x50\x3d\x12\x8b\x59\xd0\x44\xba\x9e\x6e\xdc\x8f\x30\x43\xa4\xfa"
- "\x9b\xa1\x9d\x23\x2c\x63\x57\x31\xcb\xdc\x49\xba\xbc\x13\x92\xf7"
- "\x11\x76\xe0\x14\xbf\x60\x4d\x26\xed\x25\xc4\x78\x1f\x3a\x53\x1e"
- "\xa3\x5b\x06\xa1\x03\xb9\x28\x78\x1f\x12\xeb\x60\xb8\x6a\xe6\x3c"
- "\xc0\xb8\x0d\xb0\xf3\x7a\xd9\xc1\x2a\xc0\xcf\x38\xde\xd8\x6a\xf6"
- "\x24\xf5\x71\x31\x27\xde\xcd\x90\xf4\x1d\x65\x75\x4d\x84\x13\x91"
- "\x9d\x39\xec\x26\x1f\xcb\x92\xe7\x19\x13\xb1\x26\x76\xce\x21\xfb"
- "\xbf\xd2\xc7\x98\x25\xb2\x73\xa9\xce\xf1\x3c\x4b\xf0\x84\xb3\x19"
- "\xfd\x4a\x4f\xf3\x81\x9b\x56\xb1\x2c\xda\x7f\xa0\xbd\x12\xeb\xe3"
- "\x22\xff\xa4\x8c\x12\x96\x15\x5f\xf6\x63\x1b\x0a\x57\xde\x9c\xf5"
- "\xe3\x7c\xeb\x23\x2b\x0b\x1f\x5b\xbf\xbc\x30\x9f\x2d\x94\x66\x13"
- "\xc2\x85\xf4\x06\xb2\x99\x58\xbf\xb2\xa8\xc0\xba\x62\x5d\x61\x61"
- "\xfe\xea\x22\xeb\xbd\x77\x2d\xf9\xba\x1f\xc1\x9d\x96\x3d\xc2\x6f"
- "\xac\xb0\xa1\xf3\x7c\xce\x7f\xf6\xad\x91\x9a\x62\x66\x30\x97\xdf"
- "\xfd\x80\x39\xbc\xd0\x2a\x63\x19\x75\x19\xc9\x6e\x95\x3b\x72\x1a"
- "\x24\x9f\xda\x95\x28\xe5\xa9\xe1\x85\xf2\x6c\x45\x97\xd4\xc9\x04"
- "\x17\xa6\xcb\x39\xe5\xb9\x22\xa1\x88\xd1\xfd\x63\x74\x6f\x2e\x62"
- "\x2e\xf7\x0c\xda\x0f\xf7\x5c\x21\xf2\xed\x5c\xa4\xd3\xf2\x69\x79"
- "\xe4\xfb\x4e\x71\x16\xa2\x49\xf8\xd4\xec\xcc\x06\x7c\x2e\x09\x3a"
- "\x3d\x59\x5e\x7d\xb7\x5f\xdd\x5f\x1f\x90\xf6\x7a\x5d\x46\xf2\xab"
- "\xc7\x7f\x76\xe5\x88\x5a\x4e\x01\xea\x9b\x8a\xbc\x4b\x31\x06\x7d"
- "\xaa\x5d\xdf\xac\x5e\xb5\x5d\xd2\xee\xb4\xf3\x7e\x69\xdf\xe1\x29"
- "\x8b\x3b\xd7\x2d\xce\xe6\xd3\xda\xa8\xf2\xa4\x41\xb5\xbc\x3d\x1a"
- "\x4d\x40\xfe\x56\xf0\x75\x0b\x2f\x9e\x16\x7a\xa4\xfc\x33\xc6\x5f"
- "\x8a\x0a\xa7\x9d\x96\x97\x40\x1f\xd2\x4f\xb2\xce\x86\xf3\xf1\x25"
- "\x3a\x82\xf7\xac\x5e\xb1\xe6\x31\xdb\xf2\xa2\x95\x0f\xaf\x5c\xb5"
- "\xb2\x68\x83\x38\x4e\x3e\x5b\xfc\xfb\xe7\x6b\xf2\x1e\x38\xdf\x07"
- "\xf4\x6c\xd2\xb1\xa8\xbe\x63\x03\x64\xd3\x20\xf5\x5c\x5d\xbb\xc2"
- "\x4e\x36\xeb\xe2\xda\xdd\x25\x6c\x04\x1b\x85\x1f\x83\xae\xbd\xe0"
- "\x07\x43\xea\x7e\x87\x4f\x85\xbd\x78\x3f\x6c\x9a\xdb\x6c\x9d\xc1"
- "\xe6\xf7\xb2\xc3\x8b\x68\x9f\x0b\xf0\xf3\xd3\x7a\x58\xb3\x91\xd6"
- "\x2d\x8c\x42\xf8\x16\x35\x8e\xea\x47\xaf\x13\x0c\x88\x27\x04\x0c"
- "\xf6\xf4\xb2\x8f\xae\x16\x30\xf8\xca\xb2\x47\xf8\x30\xf8\xca\xf2"
- "\x12\xe1\x16\xb5\x59\xe1\x39\x3b\x39\xcf\xd9\xa1\x7c\x55\xb0\x93"
- "\x7f\x55\xb0\x23\xe6\x7f\xee\xa3\x2a\x7c\xbb\x17\xdf\x3e\x4d\xf1"
- "\x61\x6a\x4e\xb1\xbd\xb4\xff\x4d\xcf\xe6\xa2\x54\x16\x31\xcd\x1c"
- "\xa0\xf6\x78\x06\xb2\x04\xbf\xdd\x87\xfc\x9e\xc0\x2d\x0c\xbc\xa4"
- "\xf0\x63\x26\xf7\xeb\xc0\xef\xe1\x3b\x0f\xda\xe5\x19\x38\x47\xbc"
- "\xc5\x80\x02\x9e\x0f\xfd\xdd\x8f\xf5\x33\x8b\xca\xa5\x3e\x8b\xf3"
- "\xc9\xd3\xb9\x37\xe8\xfc\xa8\xc5\xcb\x3a\xed\x2a\x6f\x2a\xec\x2d"
- "\x08\x06\x63\xc7\xf3\x23\xe1\xc7\x18\x30\xbe\x9c\xbb\x8e\xb6\xc8"
- "\x31\xfd\xe8\x38\xa5\x2d\xea\xe3\x5f\xc5\xce\xc5\x7f\x74\x06\xcf"
- "\xa3\xf8\x29\xdc\xf5\x97\x8e\xb8\x7d\x65\xbc\xfb\x58\xfa\x57\x9f"
- "\xce\xfd\xb6\x8d\x14\x5f\xfb\xe3\xeb\x24\xde\xfc\xe5\x0f\x7e\x47"
- "\x41\x02\xbe\x89\xd0\x39\x4e\x09\xcb\x8f\xef\xf1\x6c\x39\xa5\xd9"
- "\x69\xa0\xfe\x8f\x4f\xb8\x1f\x09\x33\x11\xef\xb9\x2f\x2c\xec\xfe"
- "\x54\x5f\x05\x3a\xc5\xd9\x95\x46\xf6\xe2\x90\xed\x68\x2f\x5a\xf8"
- "\x5a\x0f\x3a\x3f\x2e\x89\x9e\x13\x33\x49\x7e\x8f\x78\x2e\x8a\x81"
- "\x45\xb8\x4f\xfc\x1b\xb5\x89\x70\x1f\x65\xb7\xd0\x1e\xb5\x9c\x03"
- "\x1f\xef\xfb\xc7\xe6\xc0\xc7\x42\xff\x8b\xb2\x16\x72\xbd\x83\xdf"
- "\x54\xc5\x96\x09\x1b\x82\x70\x80\xce\xdf\x1a\xb0\x6e\x6c\x91\xf4"
- "\xe4\xf0\x35\xc2\xce\xa4\xd8\xd7\x4c\x67\x5c\x77\x9f\x63\x26\xc5"
- "\xe5\x73\x11\x9f\x7d\xa8\x44\xd8\x5e\x18\xf1\x5d\x2b\xd9\x66\x90"
- "\x2d\x5d\x8a\x88\xb1\xf6\x31\xdb\x7d\x86\x19\xfa\xd8\x9f\xe6\xd0"
- "\x5e\x50\x0c\xd6\x7f\xda\x4a\x7b\x7f\xbc\xf2\x48\xb6\xb9\x44\x2f"
- "\xca\x50\x46\x06\xe7\x69\xdf\x51\x2c\x5f\xfa\xae\x97\xfd\xe9\x31"
- "\xf1\x1d\xe5\x25\x5f\x4d\xa5\xa9\x4b\xc1\x67\xcd\xa3\xfc\x61\x3c"
- "\x37\x29\xa9\x4b\x38\xd6\x83\x48\x71\xb8\x15\xef\x1e\xc0\x7a\xec"
- "\x45\x5a\x8e\xd8\x83\x18\xb5\xd0\xde\x24\xe3\xc6\xb3\x7e\x8f\xf7"
- "\x0b\xb7\x68\x0f\x9d\xc9\x2d\xc2\xda\x29\xe4\x92\x3f\xbd\xdb\x74"
- "\x82\x19\x6c\x8f\xd0\x78\x1e\x16\xba\x56\xe0\x5e\x8b\x6c\xdf\xe1"
- "\x07\x87\x2b\x8f\x97\x0d\x03\x37\x03\x7a\x23\x3b\x60\x09\xd1\x9a"
- "\xdd\x7c\xc0\x72\x0e\xe3\x73\x38\x1d\xb4\xae\x55\xf2\xc4\xf2\x3b"
- "\x0d\x27\x13\x2c\xa9\xf7\xe1\xfd\x7c\xcd\x1e\x49\xc3\x47\x2f\xfb"
- "\x53\x1a\xc1\x0d\x78\xec\xed\x5c\x15\xf3\x69\x3a\x2c\xcf\xaf\x81"
- "\x97\x3b\x6c\xd3\x6c\xec\x22\x23\xca\x41\xb4\x83\xfc\x73\xd8\x23"
- "\xc5\x4a\x0f\xed\x9d\xdf\x77\x46\xe1\x64\xdb\x4f\xe7\x34\x48\xee"
- "\x59\x6c\xe7\xc3\x24\xc7\xd1\x99\x28\xda\x37\xa7\x33\xe3\xbb\x20"
- "\x07\x53\x1b\x50\xd6\x7e\xed\xec\x78\x35\xd2\xa8\x0d\x74\xee\xa9"
- "\xe6\x27\x62\x4e\x92\x6e\xc3\x24\xf6\x0e\x12\x1e\x3d\x71\x5f\x00"
- "\x65\x9e\x12\x7b\x5e\xc3\x4d\x6a\x39\xe4\xd7\x27\xe8\xfc\x84\x69"
- "\x65\x28\x64\x27\x5b\x28\xec\xe1\xbc\xf2\x7b\x69\x27\x74\x5f\x40"
- "\x11\xe7\x55\xe8\x7b\x69\xbf\xf3\xc9\x9c\xa8\xad\xa5\x38\x43\xf2"
- "\xc9\x02\xcd\xef\x0f\xee\x97\x44\xcf\xc0\x01\xa6\xc3\x55\x33\x07"
- "\x02\xa0\x05\x81\xaa\x99\x59\x78\xb7\x0a\x94\x68\xef\x05\x75\x19"
- "\xe4\x2f\x60\x1d\xd3\x2b\x49\xbe\x7d\xe4\x0b\x82\xce\x76\x4a\xfb"
- "\xee\x4f\x0e\xa9\x7e\x21\x12\x4e\xb1\x4f\xb6\xc6\xf6\xd0\x23\xaa"
- "\xfe\xf7\x93\x80\x94\x3f\x3e\x09\x08\xfd\x6f\xcd\xcc\xae\x17\x36"
- "\x86\xf4\xad\x1b\xbd\x7a\x69\xf3\xf8\xc9\x80\x97\xfd\x35\xce\xe6"
- "\xf1\x93\x16\x2a\x6b\x7c\xff\x19\x43\xaa\x6f\xb4\xff\x3e\x26\x78"
- "\xbf\xa8\x3c\xff\x67\xab\xa8\x77\xf3\x8c\x65\x0a\xf1\x7e\x49\x4a"
- "\x2a\xd9\x37\x79\x6c\x43\xa4\x07\x9e\x2c\x75\x0b\x32\x8f\x6a\xcf"
- "\x78\xe9\xc9\xb1\xcf\x97\xd0\xb3\x84\xd9\x7f\xdb\xb5\x3d\xa5\x1a"
- "\xbd\x42\xf1\xba\xb8\xa3\x19\xb4\xd1\x16\x10\xfe\x08\x3c\xe0\x25"
- "\x29\xd6\xb5\xad\x90\xce\x0c\xfe\xf7\x2b\xe4\xa7\x40\xce\xcd\x3f"
- "\x0b\x7a\xad\x38\x6f\xe7\x0e\x92\xa7\xfc\x14\x1b\x64\x88\x21\xdf"
- "\x34\xe4\x3b\xd2\x5e\xe2\x23\xfb\xb0\x12\x8a\xfb\xd8\xa7\xd6\xed"
- "\x4f\x1c\x6a\xfe\xa6\x89\x2d\x43\x9d\xc0\xcf\x97\x17\x5d\x3c\xdd"
- "\xf8\x6f\xdf\x85\x78\x6b\xc9\xeb\x65\xb3\x89\xe4\x73\xd2\xbf\xdc"
- "\x88\xfa\xef\xe5\xa2\xfd\x47\xc2\xfa\x10\x1b\xd5\x4f\xe1\xdf\x2a"
- "\xb3\xb3\xb0\x73\x0a\x8f\x6c\xc4\x78\x0d\x5b\x20\xbf\x1d\x64\x9d"
- "\xd2\x66\x86\xf6\xfd\xcd\xa5\x01\x3e\xe4\x09\xef\x23\xfd\xbf\x1f"
- "\x63\x05\xba\xf5\xe7\x8f\x3c\xe1\xb7\x18\xd9\x31\x13\xbd\xe9\x65"
- "\x7f\x7e\x8b\xda\x75\xa3\xad\x8c\xdd\x70\x4a\xbc\x2f\x91\x7c\xdf"
- "\x9f\xbb\xd5\x6b\x0b\xf9\xe3\x8c\x6f\xd3\x3f\xaf\x5b\xbd\x82\x9c"
- "\xba\xde\xb0\x28\xbf\x38\x7f\x95\xf5\x7e\x72\xf9\x7a\x9e\x4d\xa2"
- "\x31\x16\x17\xac\x7b\x0f\xad\xa5\xc4\x7b\x53\x7c\xb0\x0b\xc5\x06"
- "\xd3\xe2\x82\x61\xce\x65\x90\xbe\xfa\x7f\x33\x36\x98\xc6\x5b\x53"
- "\x5c\xb0\xd8\xde\xcd\x91\xbc\xe8\x1c\x50\xde\x09\xd2\xb3\x58\xbf"
- "\x9d\x7f\xee\xa3\x79\x24\xd7\x97\xee\x9e\x78\x9f\x39\x82\xb7\xda"
- "\x7a\xd6\x8f\xf4\x80\x76\xb6\x13\xb8\x68\x0a\x3a\x8f\x18\x62\x67"
- "\x49\x8e\xa4\x02\x6e\xd2\xfe\xd8\x48\x79\x8f\x58\x35\x1b\x07\x35"
- "\x06\xb4\xb0\xc9\x50\x2a\xae\x48\x93\x7a\xc5\x23\xd7\x34\x29\x53"
- "\x8c\x72\x4f\xeb\xc8\x22\xed\xac\x92\x9c\x9b\xef\xa8\x73\xf3\x48"
- "\xde\x85\xec\x50\x62\x73\xe3\x48\x73\x6c\x5e\x7f\xaa\x7d\xdb\xfc"
- "\xb7\x6c\x58\x54\xf9\xee\xb2\x93\xec\x2f\xbf\x25\x5d\xa3\x3c\x9b"
- "\xfc\x97\x5d\x54\x96\xf4\x3b\xf1\x97\x0d\xea\x3d\xea\xf8\xcb\x72"
- "\xf5\xfe\x4a\xdc\xdf\xa3\xde\xcf\xc0\xfd\xcd\xea\x3d\xe6\xec\x5f"
- "\xae\x50\xef\xd3\x70\xaf\x53\xef\xb1\x76\x1c\x3d\xa1\xde\x4f\xc7"
- "\xfd\x47\xea\xfd\x15\xb8\x7f\x5d\xbd\xc7\x1c\x3c\x2a\xfc\x2d\xa3"
- "\xed\xc6\x7e\x76\xb4\xfa\xe2\xe5\xcd\xa3\x39\x72\xcf\xf9\x68\x03"
- "\xd6\x90\x6c\xb9\xf6\x44\xd3\xf6\x62\x6c\xc2\x1a\x7c\x91\xbe\x84"
- "\xea\x41\x7a\xbb\x97\xb5\xef\x8d\x4b\xcf\x56\xf3\xf7\x80\xce\xd9"
- "\xe3\xd2\xe7\xa8\xe9\xa0\x7f\x1f\x76\xc5\xa5\x67\xca\xf4\xbf\x98"
- "\x30\xd7\x59\x5c\xba\xea\x23\xfe\x2f\x19\x5e\xf6\xb6\x37\x2e\x3d"
- "\x55\x4d\x9f\xaf\xd9\xdf\xa8\xe9\x06\x35\xfd\x01\x2f\xfb\x5d\x5d"
- "\x2c\xfd\x48\x48\x4d\x07\xfd\x3f\x62\x8b\x4b\x8f\x9e\x69\x11\xf1"
- "\xd9\x4a\x68\x6e\xfd\xa5\xce\xcb\xf6\x97\xc5\xe5\xf1\xaa\xdf\x82"
- "\xff\x7b\xb3\x25\x2e\xfd\xb0\x9a\xee\xf6\xea\xa6\xc6\x97\xd9\x31"
- "\x11\xad\xd2\x35\xb0\x65\x13\xe9\xe4\x49\x7e\x11\x76\xc8\x82\xa7"
- "\xee\x89\xd0\xd9\x27\xf3\x2e\xde\x6b\x2d\xe5\xbc\x97\xf5\xf4\xa9"
- "\x76\xb7\x76\xb2\x81\x94\xe7\xc8\x7a\x0e\xaa\x3e\x04\xfc\xe2\x6c"
- "\xd9\x46\x91\x26\x7c\x11\xdf\x64\x2f\x93\xfe\x79\xb5\x58\x0f\xa4"
- "\x9b\x52\xf7\xed\x91\x67\x03\xe9\xea\xa9\x1c\xd2\x5f\x7b\x8a\xce"
- "\x49\xdf\xcd\x90\x61\x29\x8d\x74\x34\x04\x8f\x78\x5d\x94\xa4\xfb"
- "\x3d\x11\xe5\x1c\x9d\xdf\x94\x7a\x2c\x9a\x8b\x94\x9f\x6c\xcd\xe2"
- "\xf3\x7a\x59\x8f\xd0\xbf\x25\x58\xa6\xbd\x18\x74\xf6\xf4\xc4\xce"
- "\xcd\xf4\xcc\x51\xd3\xf7\x20\x3d\x10\x97\x6e\x9d\x90\xb6\x83\x0e"
- "\x72\xe3\x11\xd7\xe8\x08\x0f\x84\x47\x78\xa8\xe6\xaf\xd2\xe6\x1c"
- "\xb4\x6e\x66\xc4\x75\xa4\x81\xce\x95\x50\x4c\xc5\x70\x31\xf7\x93"
- "\x3d\x23\xd2\xa7\xde\x17\xf0\x83\xc7\x08\xf2\xea\x87\xc9\x76\xf5"
- "\x0c\xa3\x7d\x55\x87\x8f\xe2\x73\x99\x39\x9d\x57\xde\x34\xc8\x4c"
- "\x74\xee\x84\x6c\xd3\x69\xcf\xf3\xde\x02\x3f\x3b\x54\x10\x61\x4d"
- "\x28\x7b\xd7\xc3\x1a\x7f\x71\xac\x3e\x76\x26\xf6\x08\xed\x43\xcf"
- "\x74\x88\x18\xb2\xc7\xde\xa7\xb6\x9a\xcb\xc9\x1e\x60\x6e\x07\x7f"
- "\x4f\xf0\xc6\x56\x73\x39\xb3\x7a\xd9\xb1\x2e\xdc\xa7\xca\x1f\xde"
- "\x21\x7d\xa2\x3e\xc9\xb9\xfc\x57\x93\x94\x99\x8f\x1a\x25\xbd\xf8"
- "\xab\x89\xff\x27\x9d\xb3\xf8\x2b\x95\xd1\xe1\x4f\x9e\xd9\x31\xde"
- "\xf7\x9b\x76\x31\xfd\x68\x25\x78\x93\x53\x6d\x7a\x49\x9f\xfe\x1a"
- "\x56\xf4\xc6\x72\xd2\x93\x8b\xf8\x91\x95\xbe\xf6\xbd\xab\x43\xfa"
- "\x43\x1b\xfb\xd8\xe3\x57\x30\xcb\xd2\x90\x9e\xf2\x6c\x4a\x29\x42"
- "\xdd\xe0\x49\xc0\xcf\xea\x7f\x83\xf7\x6f\xaf\x6e\xd3\x87\x05\xbf"
- "\xf2\xd7\xb0\xd0\xad\xba\x7c\x0d\xb4\x86\x78\xba\x23\xc4\x8b\x9b"
- "\xc0\x8b\xbb\x40\xff\x8d\x91\xf5\x05\x97\x84\xd7\x16\x4c\xdd\x55"
- "\xc8\x4c\x91\xb5\x99\x69\xdb\x46\xd8\x3c\x6d\xfd\xd9\x55\x8c\x35"
- "\x25\x68\x49\xaa\xc5\x9a\x42\x3a\x9b\x14\x5d\xaa\xd8\x43\xa6\x7b"
- "\x45\xff\xae\xaf\xa9\xf8\xc2\xb1\x70\x23\xeb\x33\x85\x5f\x05\x6a"
- "\xcb\x78\x7d\xad\xda\xc1\x0c\x11\xf5\xfc\x65\xe9\xe7\x6c\x3a\xf8"
- "\x67\x7d\xca\x19\xee\x3e\xb9\x8a\xe9\x29\x7e\x68\x69\xbe\xd0\x8b"
- "\x4e\x3a\x54\x10\x66\x1e\xfb\x51\x56\x5a\x48\x63\xf4\xe9\xf7\x89"
- "\x4f\x23\x5b\x64\xe4\x4f\x3d\xc9\x3e\x5d\x6e\x0e\x61\xcd\x08\x81"
- "\x27\xff\x09\xc9\xc0\x9f\xae\x93\x7e\x1c\x3e\x6d\xa3\xf3\x92\xee"
- "\xc2\x3b\x29\xed\x69\xc7\xe7\xc2\xe6\xa7\x44\xce\xad\x4f\x57\xd1"
- "\xb3\x83\xce\x83\x26\x9d\x6e\xff\xd5\xb9\xd0\x24\xa9\x7b\xfb\xf4"
- "\x31\x75\x7d\x70\x4b\xd9\xee\xd3\x09\xf7\x31\x15\xd7\xb1\x16\x4e"
- "\xb1\xd3\x1a\x89\x7f\xe5\x5e\xb1\x3f\x4f\x67\xe3\xed\xb7\xbb\xf9"
- "\x48\x9d\xea\xb3\xc7\x7b\xb3\xb2\xf5\x58\x8b\xf4\xab\xe7\x15\x72"
- "\x9e\xd0\xd5\x6f\x3d\x26\xf7\x26\xb6\x1e\xeb\x10\xba\xfa\xad\xc7"
- "\xba\x37\xcf\xa0\xb3\x00\xde\xac\xe1\xc4\x63\xe0\x23\xbd\x86\xe1"
- "\xa4\x91\xb6\x09\xd7\x23\xd7\xd1\x6e\xeb\x4c\x96\x46\x7b\x44\xb9"
- "\x11\xe9\x57\x52\xce\xe1\xe3\x73\xf8\x56\xf1\x6e\x56\xaf\x8d\x25"
- "\x48\x19\xd2\x5b\x7e\x53\x23\xb3\xa2\xad\xc9\xdc\x78\xcc\x25\x6c"
- "\x16\x5d\xc7\x1a\x3c\x3e\x8a\x0b\x13\x61\x72\x2f\xef\x78\x36\x4f"
- "\x3c\xe6\x52\xf3\x7f\xd4\xe9\x43\x1f\x8c\xc7\x72\x3c\xa1\x41\x95"
- "\x27\xf4\x76\xa1\x8d\x39\xdc\x75\xac\x40\x9e\xab\x3e\x7e\xb5\x46"
- "\x57\x25\x8e\x1e\xbf\x4c\xc5\xf5\x6e\x09\xb7\xe3\xd9\xea\x7a\x35"
- "\x8b\xee\xb1\x76\x67\x49\xdb\x93\xe3\x26\x8d\x47\xf6\xaa\x79\xe8"
- "\x1b\xf4\xd7\x2f\x69\xed\xf1\xd9\x18\xb7\x76\xf9\xde\x2b\x74\x6b"
- "\xe8\x1f\xd6\x2c\x6f\x01\xf5\x6b\x22\xda\x2a\x60\x51\xc2\x12\xd0"
- "\x66\x3b\xd9\x69\x13\x9f\xe2\x09\xdc\xee\xf6\x88\x31\xe8\xfd\x80"
- "\xec\xf2\xa9\x1e\xf2\xab\x43\x74\x13\x65\x1a\xa8\xbc\xb8\xf6\xbf"
- "\xa2\xb5\x85\xea\xa3\x77\xe8\x6b\x8e\x90\xab\xd1\x67\xca\x43\xe3"
- "\xda\x6f\x23\x9d\xdd\x19\xc0\x8c\xec\xdf\x7a\xbb\x09\x26\x12\x66"
- "\xbd\xfb\x54\x99\x5e\x1d\x87\xde\x97\xc7\xc2\x43\x3e\x2b\x46\xd0"
- "\x86\x42\xb2\x83\xea\xed\x56\xe1\xa7\xc6\x34\xe8\x15\xe7\xd4\xd5"
- "\x77\xb7\xc5\x7d\x7b\x55\x34\x2f\xda\x4d\xbc\x11\xd9\x14\xd0\x1e"
- "\x93\xc4\xd7\xde\x82\xb8\xef\x0a\x72\x4f\x83\x47\x06\x0f\xb9\xf9"
- "\x39\x11\x23\x0e\xf2\x50\x6f\x49\x0c\xde\xb2\x9c\x71\xea\x98\xa9"
- "\xd5\x81\x3c\xf3\xb5\x76\xe2\x5e\x5d\x83\x7b\xdd\xb1\x31\x39\xee"
- "\xd5\xbe\x23\xfd\x0d\x9e\xab\x28\xde\xe2\x04\x7e\xe8\x75\x1e\xac"
- "\xee\x9d\xe1\xdb\xdd\x02\x1f\xd9\x67\xf3\xc8\xc6\x1c\x70\xb5\x4b"
- "\x1c\xfa\x2c\x5d\xae\x85\x9f\x09\xbf\x60\xb4\x4f\x28\xe3\x92\x7c"
- "\x96\x85\x72\x17\xc9\xfa\x3e\x53\xfd\x3f\x7e\x06\xf9\xcf\x3b\xff"
- "\x7c\xb9\xee\xce\xe5\x79\xd6\x25\x37\x8b\xb3\xa5\x37\xac\xb3\xd1"
- "\xb1\xd1\xbc\xd8\xc3\x58\x9e\x3b\x35\xe6\xcb\xeb\xb3\xba\xa8\x2f"
- "\x2f\xd7\x50\xbb\x84\xff\x67\x3d\x7c\x84\xd7\xd3\xb9\x0f\x5e\xcc"
- "\x1b\x6a\x30\x86\x8e\x33\xec\x72\x8a\x23\x5b\x6a\xe3\x5f\x90\x9f"
- "\x37\xd0\x4b\x8a\x83\x3c\x50\x7a\x86\x4d\x21\x9b\x22\xa2\x3f\xa4"
- "\xf7\xe2\x89\x48\xdf\xea\x1b\x88\x9d\x37\xfb\xe2\x30\x9d\x91\xe4"
- "\x8e\x1c\x3d\xf2\x87\x09\x1f\xc8\xbe\xbc\x9f\x7d\xb1\x0f\xf9\xe8"
- "\xfc\x64\x51\xb5\xd0\x25\x0c\x66\x47\x8c\x43\x8d\x8e\x41\x36\x59"
- "\xc4\x14\xb3\x87\x98\xf5\x27\x74\x2e\xa9\xef\x36\x9e\x38\x98\x8d"
- "\xf4\x14\x91\x1e\x42\xdd\x5b\x07\xb3\xf1\x2e\x05\xef\x36\xe0\xaa"
- "\xa0\x0c\x7b\x0d\xda\x5d\x3a\xc8\x66\xa2\x2d\x03\xdc\x35\x98\x8d"
- "\x76\xf6\x3b\x1e\x63\xd3\x3b\x6d\x03\x24\xdf\xa1\x3c\xaf\x8c\x95"
- "\x86\x6f\xf1\xdd\x21\xf4\xcb\x4e\x3a\x11\x5c\x4b\xaa\x71\x2d\x8d"
- "\xb0\x94\xd2\x4d\x58\xf7\x36\xa1\x7e\x3a\xbf\x89\x72\xc8\xd7\x86"
- "\x6c\x0b\xfa\x46\x3a\x34\x94\xbb\xc9\xc7\xfb\x51\xf6\xc0\x21\x48"
- "\x76\x1e\x7b\x77\xb4\x4c\x95\xa7\xc6\xfc\xfe\xe2\x15\x5e\x39\xd2"
- "\x85\x36\x35\x90\xdd\x35\xd2\x40\x93\xbf\x68\x89\xf1\xc3\x5f\xbc"
- "\xac\xde\x27\x46\xf3\x3a\x72\x58\xe9\x59\x66\x11\xb6\x03\xeb\x13"
- "\x40\x8f\xbf\x98\x47\xfe\x9e\x62\x65\x7e\xfe\x5b\x2a\xaf\x0a\xe5"
- "\x39\xf2\x59\x22\x68\xb5\x11\x6d\xa4\x98\xaa\xc7\x05\x9c\xc4\x1c"
- "\xfb\x7c\x1f\xfa\x52\x47\x7d\x52\x30\x76\xd5\x98\x0f\xe8\x8f\x0e"
- "\xfd\x49\xdc\x14\x89\x9e\x49\xa5\x3e\x4d\x23\x79\x8e\xfa\x25\xc7"
- "\x71\x70\x29\xfa\x95\xb7\xa9\x80\x1f\x47\xdf\x06\x0e\x15\x74\x33"
- "\xac\x3d\xe6\x4e\x5b\x17\x9d\x7f\x38\x2e\xe1\x36\x40\xf6\xa3\x4b"
- "\xd1\xcf\xbc\x98\xff\xd2\x2f\x28\xe6\x54\x37\xda\x55\xa5\xf6\x93"
- "\xd2\x66\xc7\x78\xfa\x2f\x6e\x50\xef\x93\xa2\x79\xbf\xd6\xcf\xfe"
- "\xe6\xb8\x7e\xd2\xf7\x9f\x50\x79\x6a\x3f\x93\xd0\xcf\xc4\xaf\xf7"
- "\x13\xf8\x54\xcc\xb7\xa8\xfd\x74\xa9\xfd\xd4\xa3\x9f\x49\xe8\xe7"
- "\x8c\xb8\x7e\x5e\x72\x5e\x3f\x97\xa1\x9f\x05\xe8\x67\x6f\x5c\x3f"
- "\x53\xc7\xe9\xe7\x32\x2f\xd5\xb1\x75\xb0\x40\xfa\xc1\xfa\x6c\x89"
- "\x3c\xe7\xdd\xdf\x16\xf5\x33\x31\xc2\x5b\xe9\x1c\xa3\x52\xcc\xf7"
- "\x91\xfe\x86\xf4\x46\x24\xeb\xd1\x59\xc6\xdc\x0d\xae\x32\xa1\xbb"
- "\x99\x2e\xf5\xd0\x92\xbf\xea\x0f\x44\xcf\x5d\x3c\x27\x62\x45\xc8"
- "\x73\x8a\x74\xf6\xb1\x90\x09\xdd\xe3\xe2\x0d\xeb\x1d\xf4\x3d\x7d"
- "\x1b\x74\x7e\x91\x11\x3b\x1f\xd6\x2f\x75\xe6\x80\x1f\xdd\x93\xcf"
- "\x27\xa9\xcf\xff\x6c\x99\xd4\xe7\x7f\x11\xf5\x7f\x01\xb8\xb4\x13"
- "\x5c\xc4\xb9\x4d\xb2\xab\x8c\x30\x57\x6e\xd8\xa5\x9d\xbf\xf6\x21"
- "\x6f\x49\xdc\xf9\x6b\x9f\x68\xc3\x39\xe1\xe3\x60\xfd\xe2\xf0\x7a"
- "\x2e\xcf\xe5\x7e\xd1\x1c\xab\xfb\x73\xab\x5a\x77\x17\xdd\xfb\xa5"
- "\x0f\x32\xd2\xb1\x59\xa5\xad\xcc\x17\x07\x35\xfb\x14\x2f\xeb\x33"
- "\xd2\x5c\x1e\x3f\xae\xc2\x17\x81\xb1\x3e\x8f\x06\xda\xc9\xaf\x7b"
- "\xd0\x39\x60\x8a\x9d\xa9\x1e\xb0\xfc\xad\x33\xd5\x0e\x3f\xc6\x09"
- "\xf3\xcd\x26\x62\x04\x0f\xe4\xf1\xad\x43\x8d\x32\x36\xc1\xc0\x6f"
- "\xa9\x9d\xbd\x6c\x60\x0b\x9e\xcd\x72\x2f\x67\x60\x9d\x4a\x9b\x43"
- "\x8b\x23\x61\xb3\x17\x75\x0a\x1f\x4a\xb1\xe7\x55\xe4\x13\x02\xf9"
- "\x5e\x94\x3e\x9d\x07\xf2\xce\xcb\x4f\xef\xcb\xce\x7b\xce\x3e\xef"
- "\xd9\x1a\x00\xcd\x9a\xc8\x0e\xa7\x7a\x86\xd0\xf1\x36\xa4\x94\x33"
- "\x9b\xe3\x04\x4b\x00\x2e\x7e\x4e\x6d\xeb\x1c\x10\x67\xf4\xcc\xdc"
- "\x99\xc5\x3c\x03\x61\xc9\xb7\x83\x5f\xea\xcd\x40\x9e\x13\x6c\x3a"
- "\x9d\x11\xa1\xd8\x0d\xc8\x7f\x52\xc6\x6b\x38\x79\xef\xd2\x75\x49"
- "\x4c\xf9\x71\xce\x54\xae\x5f\x61\x21\x3b\x80\x57\xce\x79\x29\xe6"
- "\x81\xae\x74\x3b\x4b\x27\x3a\x05\x1c\xee\xe3\xfa\x3c\xf2\x33\xe6"
- "\x7b\xe1\xdc\xc0\x24\x4f\xf8\x28\xb3\x81\x7e\x9e\x64\x27\xb3\x0d"
- "\x25\xcc\x50\xdb\xcf\x52\x81\x67\xe1\x03\xe1\x79\x4c\xf3\x69\xd0"
- "\x78\x89\x3c\x2b\xdf\x08\x9c\x5c\x6b\xe1\xa1\xa0\xf3\x44\x23\xe4"
- "\xda\xa5\x9a\xfe\xa2\x4a\xfa\x34\x33\xa0\xfe\x44\xe1\x7f\x41\xf2"
- "\x07\x80\xed\x89\x23\xf2\x8c\x68\xda\x5c\x7c\xd3\x15\x93\x6d\x4e"
- "\x2e\x95\x30\x1c\x72\xcb\x75\xe4\xe4\xd2\x03\x80\xea\x16\x69\xcf"
- "\x94\x86\xbc\xe1\xa8\x3d\x93\xd0\x09\x9e\x04\x4d\x19\x72\x4b\xb9"
- "\x67\xc8\x9d\x1b\x31\xaa\x73\x9c\xd2\x8f\xe4\xd0\xb7\xf8\xce\x2c"
- "\xe3\xca\x9d\x9c\x17\xc3\xb5\x93\xa4\x6b\xd5\xa1\x4f\xc0\x9f\x13"
- "\x45\xd4\x2f\x82\x49\x40\xf8\x2f\x3b\x61\x3f\xb0\x67\x82\xb8\x23"
- "\xc6\xa3\xc6\xb0\xd0\x2f\xcd\xec\x00\x3e\x0d\x62\x0c\x2e\x25\x1f"
- "\x4e\x1e\xd4\x73\xa8\xe9\x1c\x3b\x64\x19\x66\x9d\xb8\xa7\x73\x0b"
- "\xee\x9f\x7c\xc6\xfa\xac\xe3\xaf\xe5\xe0\x07\x5c\x68\x73\x03\x95"
- "\x45\xb4\x86\x6c\x3d\xc9\xd7\x5e\x27\xb8\x36\x4f\x1f\x13\x65\x1c"
- "\x52\x06\xd8\x21\xfb\x71\xd2\x6d\x77\x74\x36\x1d\x65\x9d\x96\x3f"
- "\x89\x7a\x88\xdf\x76\x17\x0e\x5f\xa8\xec\x16\x94\xdd\xa6\x96\xed"
- "\x43\xd9\x69\x13\x97\x3d\xd3\x7a\x91\x65\x5f\x44\xbb\x67\xa6\x5e"
- "\x4c\xd9\x8e\x06\x1e\x01\x1d\x4e\xc6\x1a\xef\x22\x3f\xa4\x74\x3e"
- "\x35\x32\x42\xbe\x57\x66\x71\x69\x3f\xef\xfb\x36\xd1\x1b\x61\xdb"
- "\xb1\xd5\xb7\x45\x9c\x5d\x25\x3d\xbb\x7a\x66\xd5\x13\xfe\x9c\x91"
- "\xde\x3d\xe8\xf4\x45\xed\xbf\xe3\xf6\xb5\x21\x0b\xf8\x16\x48\x3b"
- "\x69\xdf\x16\x89\x5b\x5f\x9e\xa5\xb2\xc6\x97\x39\x07\xf7\x49\x7b"
- "\x7b\xdf\x26\x4d\xbf\x35\x9c\x38\xb8\x4f\x2d\xcb\x7a\xbe\xde\x54"
- "\x75\x98\x63\xcd\xb7\x17\x59\xd7\x17\xae\x2c\xca\xd7\x0e\x57\x27"
- "\xb1\xfb\xf3\x57\xe4\xaf\x2c\xce\xcf\xb3\x3e\xb0\xae\x70\xf5\x0d"
- "\x6b\x1e\x79\xc4\x7a\x6f\xfe\xda\xb5\xcb\x7f\x9c\x9f\xc4\x1e\x28"
- "\x5c\xbe\x7a\xed\x4a\xd2\x6d\x5a\xad\x0b\x6e\xcd\x2d\x58\x53\x74"
- "\xc3\xf7\x16\x64\x9d\xa7\xdb\xa4\xb3\xd6\x3d\x24\xe3\x60\x7d\x9a"
- "\x0e\x1e\x63\x1a\xf9\xdf\x31\x6f\xe0\xee\xc7\x21\x5f\x03\x07\x4f"
- "\xd2\x5a\x48\xeb\x0f\xc9\x5e\xe4\xc7\x97\x7c\x03\xef\x7c\x8e\x77"
- "\xf5\x33\xfe\x6d\xf0\xed\xdd\x48\x23\x3f\xbc\x3d\xfc\x9c\xc3\x4f"
- "\x63\x80\xf4\x69\xc8\xd3\xfe\x14\xd2\xfc\x89\x43\xee\xda\xbf\x32"
- "\x83\xe4\x31\x06\xeb\xb8\x7e\x0a\xaf\x22\x9f\xba\x9f\x59\x98\xea"
- "\xab\x5b\xef\xf1\x86\xc8\xfe\xc7\xb8\x38\xec\xe0\x44\x53\xe5\xfc"
- "\x1a\x7c\x5a\xce\xd3\x63\x2d\xf2\x1c\x82\x72\x9a\x64\xc4\xcd\x22"
- "\xce\xd9\x20\xe8\xff\xa7\xc6\x18\xad\x1e\xd1\x78\xf3\x6e\xc0\x7d"
- "\x7d\x2f\x9e\xa5\x4f\x91\xc1\x83\x63\x6d\xbb\xbe\xda\xcb\xd8\x68"
- "\x9a\xfc\xd1\x37\xa3\x56\xf9\xa3\xfb\xf8\x9f\x72\x58\xfe\xce\x4f"
- "\xff\x9f\xfe\xb4\xfa\xff\xd1\xef\x83\x75\x17\xfe\xfd\x3d\xf5\x8b"
- "\x7e\xff\xff\xd8\xff\xff\xc9\xf7\xc1\x86\x0b\xfd\x08\xdf\x80\x5b"
- "\x3d\x4f\xfd\x95\x19\x81\x9f\xf5\xd5\x0f\x03\xa7\x8f\x31\x4b\x49"
- "\x98\xf7\x39\xfe\x83\xa5\x97\x9e\x00\x0f\x06\x5e\xab\xc8\xce\xfb"
- "\x4a\x47\x48\x2f\x11\x5c\x09\xfc\x6d\xab\xe9\x65\xa6\xea\x5e\xf0"
- "\x59\x45\x32\x3e\x06\xed\x37\xd1\x19\x2d\x0f\x9e\x0f\x16\x87\xd8"
- "\x87\xfe\xd3\x64\x0f\xe9\xee\x5c\x06\xda\xd3\xc3\x18\xe1\xaf\x69"
- "\x19\x4b\x6b\x9c\xce\xf7\x73\xe7\xb6\x34\xae\xdf\x66\x40\xda\xe1"
- "\x57\x95\xec\x49\xaf\x6e\xec\x98\x64\x7d\x98\xd6\x79\xff\xf7\x55"
- "\xdc\x3c\x22\xcf\x20\x8e\x08\x9b\x33\xd5\x97\x32\xd6\xa7\xe0\x83"
- "\x72\x4d\x0f\x5e\xa3\xea\xf3\x70\x3f\xf2\x01\xdd\xa3\x1f\x6d\xdc"
- "\xb9\xc2\x42\x65\xfe\x4a\x69\x9b\x44\x6b\xe6\xab\x1b\xb3\x27\x95"
- "\x2c\x67\xfa\x4e\xef\x49\x76\x00\xb4\x90\xf6\xc2\x31\xef\xf6\x62"
- "\x9e\xb5\xee\x9a\xce\xeb\xd0\xbe\x2a\xf0\x73\x2e\xb4\xa9\x25\xe8"
- "\xf4\x43\xfe\x3b\xd9\xaa\xf2\x72\x6e\xcc\x8b\xbd\xd5\xc8\xb3\x78"
- "\x1d\x9b\x55\x8d\x7c\xe0\xed\x5c\x24\xa3\xc8\xf6\x05\x5e\x07\x0c"
- "\xf6\xa1\xce\x2e\xeb\x43\xf4\x3c\x24\x78\x0c\xaa\x1b\xfd\xb0\xf6"
- "\xb2\x21\x21\xf3\x53\x1d\x5a\xbd\x41\xe7\x69\xd0\xbf\x2f\x0b\xd4"
- "\x3d\xc6\x3a\x59\xce\xe9\x45\x72\xbe\x0e\x9a\x28\x66\x9f\x3c\xe3"
- "\x35\x68\xaa\xde\x88\x75\xfd\x1c\x33\xa2\x8e\x7a\xd4\xe1\x36\x97"
- "\x33\x6e\xa6\xf3\xc1\x3d\x61\xc8\x35\x8a\x6a\x7b\x3b\x74\xb3\xfc"
- "\x56\xf2\x21\x82\xf7\x88\x80\xbf\x17\xfa\x19\xf0\x1f\x05\xa0\x13"
- "\xe0\x39\xc4\xd9\x0a\xf0\x1b\x94\x8e\x3a\xea\xd1\xaf\x2e\xc8\xcd"
- "\xfb\xb0\x76\x53\x7c\x36\xe3\x43\x67\xfe\x95\x89\x78\xe5\xe0\x17"
- "\xd6\xda\x79\x48\xc6\x2f\x3b\x7d\x50\xe3\x17\x08\x3f\x88\x47\xa8"
- "\x7e\x88\x19\x46\x31\xc6\xc0\x91\x0e\xf0\x1f\xe0\xe9\x87\x8c\xea"
- "\xd8\x74\x08\xbe\x40\x8d\xdb\x2a\x69\xf8\xd0\x65\x58\xdf\x4d\xa8"
- "\xa3\x03\x92\xa3\x80\x85\xa4\x41\x43\x19\xda\x5a\x2f\x63\x8f\x0f"
- "\x19\x39\x68\x1d\xe0\xb6\x6f\xf6\x32\x1d\xf3\xb2\xd3\xab\x30\x16"
- "\xfb\x28\x2f\xf9\xcf\x40\xfe\x07\xc0\x8f\x1d\x56\xc7\xa4\x07\x32"
- "\x01\xf8\x80\xd3\x3d\xd4\x0e\x7c\x73\x10\xb0\xa6\xb1\xa8\x52\xe9"
- "\xd8\x61\xc9\xc3\x04\xd6\x69\xb0\xc7\x58\x6f\x89\xc1\x7f\xa8\x39"
- "\x1e\xfe\x80\xc5\x16\x75\x2c\xaf\x8e\x1b\x3b\xc8\xa5\xc3\x21\xd2"
- "\x43\xa3\xbe\xfd\x52\x87\x36\x74\x84\x7c\x9c\x01\x67\xf6\x03\x16"
- "\xfb\x91\xaf\x8d\x68\xf3\xe6\xbf\x82\xe6\x3e\x4c\x3c\xd4\xf0\x71"
- "\xc9\xa3\x0e\x97\x11\x0e\xe3\x59\xc4\xee\xeb\x63\xa7\xbd\x54\x1e"
- "\x9e\xbf\x8f\x2b\x78\xd9\xe1\x7b\x1c\x8d\x14\x4f\x74\x30\x87\x7c"
- "\x90\xa9\x63\x9d\x13\x74\x0e\xcf\xd3\xce\x2f\x11\x0e\xd0\xd8\xa3"
- "\x8f\x5e\xa9\xa7\x18\x9e\x47\xba\x46\xf1\xdd\x68\x01\xb5\xb1\x87"
- "\xe6\xa7\xf6\x1e\xe9\x03\xe4\x1b\x36\x0e\x36\x5e\x75\x4c\xda\x64"
- "\x6c\xbe\xe1\x23\x6a\xdb\xf6\xe1\xd9\x88\x67\x69\xb7\x37\x5a\x90"
- "\x50\x4b\xdf\x94\xc6\xbe\xa1\xf9\x03\x5c\x36\x23\xcf\x47\xb8\x72"
- "\x2d\x2f\xf9\x87\x47\x3b\x72\xb6\x09\x1f\x5d\xc3\xb6\xe1\xd1\x4c"
- "\x3d\xea\x0d\xa1\x5e\x3d\xe1\x06\xe1\x85\x56\x46\xad\x84\xd1\x5e"
- "\x8c\x9f\xc0\xaf\x03\xe1\x36\xc0\x3d\x00\xfe\xff\x2f\x7e\xc9\xdf"
- "\x0d\xe7\xa8\xed\x73\xcb\x98\x11\x3e\x57\x93\xf4\xa7\x43\xf9\xb2"
- "\xa3\xf2\x4e\x94\xcf\x1c\xce\x21\xdc\x43\x59\x07\x55\x9c\x30\x23"
- "\x5f\x41\x14\x87\x84\xaf\x82\xe1\x01\xe2\x35\xd5\xf6\xd3\x9c\x3a"
- "\x2e\x61\x37\xe4\x22\x1c\x00\x1f\xef\x56\xe7\x9a\x97\x78\x55\x89"
- "\x87\x81\xbd\x5a\x19\xd2\xdf\xc1\xf0\x3c\x05\x65\x68\xb8\x12\x4f"
- "\x1b\x90\x17\xf2\xd9\xc9\x28\xde\x68\xb4\x40\xa5\x53\xd3\x54\x3e"
- "\xa4\x03\x63\x43\x7e\xc9\xdd\xc2\xdf\x93\xc0\xcb\x33\x7d\x07\x02"
- "\x61\xf6\x14\xe1\xe5\x43\x44\x13\xce\xdc\x31\x9c\x34\xe2\x8d\xe1"
- "\xf6\x99\x2c\x0d\xb7\xe3\xc6\x55\xe0\xf6\x16\x41\x8f\xce\x2c\xf1"
- "\xb2\xac\x45\x1a\xee\xd3\x3c\x57\x30\xaf\x6b\x8b\xc5\xfe\x80\x99"
- "\xf4\x81\x62\xde\x87\x7c\x42\xc6\xa0\xf1\xec\xb4\xf7\x09\x5f\xf0"
- "\x9b\x15\x66\xec\x0c\x7c\x4e\xfa\x91\x93\x34\xff\xb5\x39\x4e\x63"
- "\x83\xba\xdc\xe4\xaf\x7f\x0b\x68\x20\xcd\xc1\x00\xda\x44\x31\xea"
- "\xc9\xf7\x59\xfb\xd2\x6c\xb6\x16\x63\x7b\x60\x19\x8d\xdb\x99\x2e"
- "\xed\xbc\x44\xad\xa4\x01\x26\x15\x5f\x44\x1b\xcf\x83\xab\x59\xc2"
- "\x75\xc4\x30\x76\x7e\x0f\xef\xa1\xf9\x1d\x0f\x57\x82\x29\xc1\x16"
- "\x79\xd1\xff\x2f\x4d\x1a\x5c\xe3\x60\xfa\xbc\x8a\x8f\x2a\x6d\x1d"
- "\x19\x97\xb6\xd6\xca\xd8\x08\x6d\x9b\xa9\x2f\x58\x53\xa8\x7e\x11"
- "\xfb\x47\x95\x7d\xda\xfd\x84\x53\x23\xf5\x5e\x96\xd7\xa2\xd1\x31"
- "\xb4\x47\xf8\x9b\xa3\xb1\xd2\x68\x07\xe9\xca\xd4\xb6\xbb\xb5\xf1"
- "\xa0\x76\xc7\xd3\x04\xac\x37\xe2\x7c\x5f\xac\xcf\x23\xa7\xf1\xdd"
- "\x25\x44\xdb\x62\xfc\x55\x90\x8d\xed\xfb\xc8\x00\xf5\x9d\x70\xc2"
- "\x56\x4c\xfa\x32\xb9\x96\x79\x99\xbf\x68\x2c\xbd\xf2\xaf\x94\x76"
- "\x19\x92\x1f\x23\x7a\x6f\x7b\x48\xe6\xa7\xf5\x0d\xf9\x85\x6e\x5e"
- "\x5d\x0f\x89\x57\xa3\xb4\x65\x2a\x0c\x7a\x90\xbf\x9d\xce\x60\x93"
- "\x1f\x9e\xa9\x3d\x52\x16\x04\x8d\xde\x4f\x31\x22\x90\xcf\xda\x09"
- "\x39\x20\x3c\x99\xb1\x46\x95\xdf\x24\x3a\xc1\xd7\xe7\x4c\x5d\x3f"
- "\xc0\x12\x6d\xdf\xe3\x9f\xf5\xb3\xd0\x55\x98\x47\x21\xf2\x0b\x89"
- "\xb2\xad\xfd\xec\x5c\x04\xf5\xa6\xa9\x57\x0b\xae\x9f\xe3\x7a\x05"
- "\xae\x87\x70\xbd\x12\xd7\xdf\x22\xbf\xa2\xe6\xcf\xc2\xf3\x2e\xa4"
- "\xdf\xaa\x5e\xd1\xc6\x10\xed\x67\x2f\x79\x8a\xf8\xca\x87\x44\xfa"
- "\x4f\xe9\x19\xd7\xe5\x6a\xbf\x0f\xca\xb9\x1d\xba\x03\xe5\xd8\x29"
- "\x1f\xad\x6b\x48\xb3\x21\xcf\x35\x54\x36\xf9\x44\xe8\x67\x67\x8f"
- "\xc4\xf1\xa7\x28\xe7\x2c\x9d\xcd\x98\x83\xef\x3e\xc0\xb5\x08\xd7"
- "\x6a\x2a\x17\x30\xe8\x8a\xd1\x8b\xd3\xde\x3c\xbb\x1c\x4f\x2f\x0b"
- "\x2c\xa5\xf9\xae\xd1\x03\xc2\xa7\x31\xf9\x96\xca\x7c\x52\x7e\x0d"
- "\xed\xd7\xc6\x2e\x2c\xf1\xd6\x16\xc6\xd8\xa1\xfc\x3b\xe8\x7b\x5c"
- "\xef\x52\xaf\xd9\xea\xf5\x6e\xf5\xfa\x2f\xea\x75\x81\x7a\x5d\xe8"
- "\x65\xa1\x2a\x95\x37\x01\xcc\x42\x64\xdf\x47\x7b\x52\x6a\xbd\x67"
- "\xdd\x24\x5f\x83\xfe\x7f\x7b\x98\xe2\xbd\x39\xcf\xce\xd1\xf4\xd6"
- "\xa4\xfb\x19\x75\xfa\x5e\xd8\x29\x74\x3f\x67\x17\xc5\xd1\xc2\x3a"
- "\x93\x2e\x9b\x81\x77\x9a\xdc\xa8\xe7\x75\x6a\x39\x7b\xf4\xea\x7e"
- "\x3d\xc5\x3d\xa1\x38\x76\xe4\x8f\x4f\xc8\x51\xc9\x73\xe7\xd1\x7c"
- "\x15\x3a\xfd\xad\xe4\x5f\x68\xa8\x1e\xbf\x66\xc8\x14\x7b\x34\x7a"
- "\x4f\xf2\x92\xea\x77\xb3\x1d\x75\xb5\xc5\xe4\xfc\xb3\x05\x72\x6f"
- "\xf3\xf2\x6c\xa4\xc7\xc9\xff\x67\x33\xa8\xcd\x80\x75\x37\xfa\x33"
- "\xa7\x97\x9d\x0d\xe1\x7a\x4b\x9f\xec\x73\x96\xd6\x67\x75\xac\x6c"
- "\x1a\xcc\xfb\x58\xa8\x1e\xf4\xb0\x90\xf0\xbb\x37\x4a\x97\x43\xf5"
- "\x74\x55\xf1\x07\xe3\x1c\xba\x9b\xc6\x3b\x8e\x9e\x74\xc7\xe8\xf4"
- "\xb9\x07\xc6\x8e\xcb\xd0\x03\x61\xc9\x2f\x74\x63\x5e\x12\x0e\xa4"
- "\x9f\x37\x2f\x29\x66\xfd\x25\xea\xb7\x75\x63\x69\xfc\xc8\x00\xd1"
- "\x78\xb5\x8d\xc0\xdb\xa0\xd0\x59\x7b\xd9\x39\x9b\xba\x26\x75\x63"
- "\x8d\xfc\x36\xd2\xfb\x64\x3b\x65\xba\x5a\x17\xf0\x2f\x48\xfe\x50"
- "\xaf\xd4\xd2\x55\xfc\xa6\x72\x0e\xd3\x58\x6b\xe9\x6a\xf9\xc0\xd3"
- "\xe0\x41\x9a\x3f\x5a\xba\xc4\xc9\x33\x19\x44\x6f\xe8\xdb\xb0\xb0"
- "\x65\x84\xfc\xfd\x50\x3b\xda\x3d\xba\x04\xfc\x05\xf9\xa8\xef\xd9"
- "\xbc\x91\x99\xd6\x37\xb0\x64\x39\x37\x47\x7f\xaa\x7d\x2b\x75\xfa"
- "\xa3\x79\x1a\x8d\xaa\x15\xf4\xec\x4c\xf7\x58\x5a\xa9\xe8\xb8\xd3"
- "\x1c\x0e\x1b\x87\xaa\x0e\x85\xe7\x08\x9a\x8b\x79\xdf\x88\xef\x1a"
- "\xbd\xec\x19\xb7\xba\x96\x1c\x94\x7b\x2a\xa3\x1f\x1d\x6a\x96\xb4"
- "\x4b\x2d\x3b\x4a\xff\xe2\xf8\x10\x41\xeb\xa9\x2e\x2a\x0b\xeb\x4a"
- "\x6a\xc0\x91\x33\x55\xd2\xef\x51\xbf\x97\x4d\xcd\xd0\x68\x2b\xad"
- "\x4f\x66\x1d\xb3\xd5\x3c\x24\xd7\x27\x85\x74\x60\xb6\x80\xf0\xa7"
- "\xd6\x69\xf3\x31\x5a\x37\xc9\xcf\x75\xee\x86\x24\xf2\x37\x95\xd3"
- "\xcf\x22\x9f\x83\x3f\xdb\xa3\xee\xcd\x40\xce\x8d\x3c\x4b\xb2\xac"
- "\x0a\x57\xcc\xa7\xc8\x06\x75\x5c\x7a\xd0\x9e\x3d\x44\xdb\x37\x17"
- "\xcb\xd8\x41\xa4\x0f\x12\xb1\xa6\x88\x67\xb5\xf0\x90\xf4\xd9\x1f"
- "\x2e\x8b\xd3\x71\xa9\x76\x67\xa3\xf9\x22\x16\x83\x6b\xa8\x4a\xea"
- "\x13\x23\xc9\x32\x3d\xec\x97\x76\x08\x43\xea\x7c\x0a\xf7\x24\x58"
- "\xa6\xbf\x24\xf5\xc2\xbe\xb7\x25\x3f\x12\x8e\x8f\xff\x2c\x60\x2d"
- "\xfd\xf9\x86\x07\x62\xf3\x22\xbc\x9f\xbe\xc1\xb7\xaf\x07\x9d\x11"
- "\xa6\xa5\xcb\xb5\xe6\xf4\x61\x55\x67\x56\x37\xb5\x3c\x9b\x81\x36"
- "\x4f\xde\xe9\xd4\xe6\x6f\x64\x99\xa8\x5f\x9d\xbf\xd4\x47\xc2\x07"
- "\x9a\xc3\x61\xf2\x09\x86\x39\x4c\x73\x19\xf7\xf5\x61\x6d\xee\x4a"
- "\xfe\xae\x5b\xcc\x5d\x31\x6f\x23\xb6\x58\x3b\x22\x99\x2a\xae\xf6"
- "\x0c\xaf\xb0\x98\xf0\xae\x0a\x6b\xab\xba\x97\x15\x96\x32\xc6\xd6"
- "\xa3\xdd\xca\x08\x0f\x91\x6e\x9a\xf4\x09\xa4\xb3\x51\xed\x55\x69"
- "\xaf\x24\x40\x7e\xce\xea\x30\x1f\x62\xbe\xcd\x52\x99\xe6\xdb\x0c"
- "\xe5\xf5\xc4\x74\xc7\x61\xcd\x37\x68\x15\xea\x6b\x74\x97\xbe\x47"
- "\xf0\xbb\x41\xce\xb1\xf0\x6c\xc2\x63\x0f\x70\x0f\xeb\x4f\x03\xc5"
- "\xa2\x0f\x3a\x15\x8b\x86\x7b\x98\xa3\x79\xc0\xd1\x97\xeb\xa7\xf3"
- "\x06\x8c\x29\xd9\xdc\xaf\xc2\xf3\xb3\xb8\xe6\xc9\xab\x2e\x95\xae"
- "\x2a\xce\x37\xe0\x5b\xcc\xff\xa4\x0e\x6d\x0c\x02\xc9\x33\xb3\x05"
- "\x8e\x95\x92\x7d\x63\x96\xd8\xeb\x27\x1c\x23\xfc\x12\x7b\xfe\xc0"
- "\x35\x73\xf9\xbf\x32\xc2\x33\xe1\xef\xc4\x4e\x63\x12\x9e\x4f\x78"
- "\x86\xb2\x9a\x35\xdf\xbe\x5e\xa6\xa8\xfb\x6d\xca\x3e\xcd\x0e\x9c"
- "\xf0\xb0\xe8\x6a\x76\x19\xca\xb7\xb6\x5b\x03\xa4\x3b\xff\xd4\x13"
- "\xbe\x9b\x51\x5e\x82\x9d\xa4\x97\x97\x6f\xc3\x37\x71\xe3\x3f\x24"
- "\x6c\x59\x0f\x2c\x15\xfa\xcc\x4b\x83\x4e\x6e\x18\x4b\x73\x06\xeb"
- "\x04\x5f\x89\xf5\xf9\x9b\x69\xcc\x0a\xbc\xc5\x5a\xc3\x33\x35\x7e"
- "\xf8\xa6\x34\xb2\xb7\x18\xa4\xf6\x91\x0c\x0e\x7a\x3b\x98\x49\xeb"
- "\xf4\x04\x7a\xe7\x39\xa4\x2b\x22\x9a\x41\xba\x27\xd2\x83\x01\xd6"
- "\x87\xfb\x75\xfa\x97\x0f\x41\x92\xe7\x6b\xbe\xee\xdf\xb9\xd4\xce"
- "\xcf\x90\x2f\x2c\x6b\x21\xbb\xb4\x57\xa7\xa7\xb3\x9a\xdd\x8e\xd3"
- "\xa4\xe3\xe1\xad\x63\x74\x3c\x31\x8f\x4a\x69\xf8\xd9\x63\x3f\x9d"
- "\x51\xbd\xdf\x72\xe1\x9f\xce\x2a\xf3\xea\x66\xe3\x37\x4f\x85\xd5"
- "\x9f\x82\x15\x2c\x4d\x83\x15\xd1\x14\xa2\xb1\x64\x67\x43\xf3\x5c"
- "\x17\x66\xe4\xeb\x08\xe3\x84\x76\x6f\xbe\xfe\x7e\xf7\x46\xc8\xb4"
- "\x3a\x76\xb7\x90\x39\xf4\x17\x79\x26\x5b\xc7\xc4\x78\x0a\x3f\xaa"
- "\x3a\x66\x44\xdd\x9f\xd5\x9e\x62\x06\x5b\x21\xbb\x8a\x74\xe8\xe6"
- "\x08\x77\x93\x0c\x4c\x38\x01\x18\x74\x9d\xd4\xe9\x12\x8b\x36\x31"
- "\x3d\xde\xcf\x3a\xa9\x63\x21\x8d\x97\xc2\x37\xa9\x09\x21\x96\x46"
- "\x3c\xd4\x5d\x9b\xd8\x2c\xb4\xff\xb0\x36\x56\xc4\x67\x90\x1e\x2f"
- "\x1a\xd7\x49\xc7\x84\x2d\x00\xf9\xac\xf7\x12\xdc\x34\x5a\x75\x8a"
- "\x99\xf0\xec\x4e\x08\xb0\x54\xb1\x0e\x55\xe8\x80\xff\xbe\x6e\x81"
- "\x2f\x3a\xd6\x03\xdc\x3f\x1c\x6b\xa7\xe5\xb2\xb8\xfb\x07\xe9\x7b"
- "\x73\x80\x78\xb8\x89\xe0\xa3\xcb\xd7\xe0\x43\xe7\x0e\xcc\xe0\xff"
- "\xc5\x78\x87\xb9\x0f\x6d\x3b\x68\xdb\xc8\x8c\x27\x75\xfa\x07\xd1"
- "\x47\x3a\xd7\xdb\x21\x74\xfc\x3a\xfd\x3d\x9a\x9c\x2e\xdb\xad\xbf"
- "\xcc\x5c\x9e\xc0\x48\x37\x4f\xfe\x1e\x85\x2d\xe6\x57\x16\xa1\x8f"
- "\xf7\x60\x6a\xbb\x4b\xbf\x4b\xf5\x1c\x57\xd7\xb2\x9e\x61\x87\x85"
- "\x1d\xb0\xcc\x67\xe8\x87\xd7\xab\xeb\x5b\x76\xd1\x36\xaf\x3a\x9d"
- "\x57\x85\xef\x41\x61\x2b\xa2\xd3\xfd\x9a\xd6\x12\xd2\x0d\x60\x1d"
- "\x69\xa7\xf5\x3a\x58\xa1\x9f\xaf\xcd\x1b\xac\x13\xed\xf8\x26\xea"
- "\xd7\x00\xf7\x7b\xc9\xe7\x8c\x90\x1f\x64\x7e\x93\xd8\x37\xa8\xd0"
- "\xdb\xa2\xfc\x36\xf2\xd1\x77\xc2\x86\x50\xa7\xdb\x92\x1b\xd1\x01"
- "\xa6\xba\x2d\xd4\x37\x89\x8b\x96\x1f\x21\x7f\x73\x74\xde\x62\x1c"
- "\xc4\xbc\xf5\xc5\xcd\xcb\x0a\xbd\x3b\x26\xa7\x72\x3a\x5b\x3c\xae"
- "\xdd\x93\x2d\x05\x6b\x95\x2e\xe1\xe6\xda\x5a\xde\x5c\xa7\x57\xee"
- "\xdc\x5c\xc3\x4c\xba\x2a\x80\x8d\xe6\x59\xf1\xb2\xcb\xfa\x75\x09"
- "\x77\x98\x4d\x97\x2f\xb9\xab\x68\x0a\x2f\xb5\x30\x7d\xf5\xd0\x14"
- "\xe3\xd5\xa1\xcb\x9b\x79\xc2\xf5\xf7\xdf\x5b\x44\x7b\xdf\x75\xec"
- "\x8b\x55\x2c\xe1\xae\x08\xea\x36\x31\x9b\x57\x37\x69\x11\x9d\x51"
- "\x3f\x60\x02\x2f\x82\x7b\x2a\xb3\xa4\x91\x19\x4b\xfa\xf8\x40\xd5"
- "\x23\x93\x8c\x58\x7f\x53\xb1\x6e\xb8\xa6\x9a\x2e\x6f\x1e\x45\x19"
- "\xef\x2e\x13\xdf\xb5\x5e\xa0\x6d\x87\xc6\x6f\x9b\x6d\x3a\xda\x76"
- "\xec\xe2\xda\x36\xb9\x2a\xd6\xb6\xc9\x55\xff\xf3\xb6\x19\x56\xc6"
- "\xb5\x2d\x35\xd6\xb6\x02\xb4\xcd\xb0\xe1\xe2\xda\x36\xe5\x60\xac"
- "\x6d\x53\x0e\xfe\x9d\x6d\xdb\x3b\x71\xdb\x26\x4d\x1a\xbf\x6d\xf6"
- "\xcb\xfb\x75\x93\x2e\xbb\xb8\xb6\x25\x9a\x62\x6d\x4b\x34\xfd\x4f"
- "\xda\x56\xda\xc8\x3f\xef\x04\x97\x4b\xfa\x1c\xa2\xf3\xfd\xba\xc9"
- "\x57\x6c\x4a\x17\x76\xdc\x97\xa0\x5d\x87\x1c\x8d\xfc\x33\xc1\xdb"
- "\xe8\x26\x09\xdd\x7f\xb0\x62\x92\x0b\xf8\x2b\xed\x4a\x74\x93\xed"
- "\x94\xa6\x24\xcc\x68\xe1\x4e\x1e\xbe\x31\x40\x36\x83\x61\xf2\xcb"
- "\x42\x3e\xcf\x3b\x5e\x1d\x09\x51\xbc\x89\xee\xdd\x43\x06\xf6\xea"
- "\x88\x5f\x8f\x6f\xdb\x35\x5f\xac\xda\xb7\xe6\x86\x0b\xd1\xa3\x49"
- "\x67\xef\x2a\x60\x66\xa2\x47\x74\xa5\xb8\x91\xb5\xa5\x53\x8c\x77"
- "\x9d\xc6\xba\x5f\x31\x39\x55\x3b\x6b\xab\x95\xb5\x78\x60\x0a\x37"
- "\x97\xb0\x04\x3a\xef\x2b\xfc\x36\x5a\xfc\x2c\xa3\x84\x4d\x5a\x6c"
- "\x47\xf9\x21\xb6\xcc\x6c\x47\xd9\x80\x87\xe0\xe5\x75\x93\x1f\x4c"
- "\x58\xc5\x4c\xf5\x28\x9b\xae\x77\x59\x1c\x7c\xf3\x76\x66\xa0\x73"
- "\xc1\x74\xbe\x57\x9e\xed\x9d\x6c\x44\x3d\x76\xad\x9e\xbf\x01\xbf"
- "\x14\x09\xbf\x29\x3f\x8c\xc1\x6f\x4a\x72\x0c\x7e\x93\x3f\x92\xf0"
- "\x9b\xdc\x11\x83\xdf\x94\xb6\x8b\x83\xdf\x14\x43\x0c\x7e\xf2\xdb"
- "\x0b\xc3\x6f\xca\x77\x26\x86\xdf\x94\x25\x31\xf8\xc9\xb2\x26\x80"
- "\xdf\xe4\xf1\xe1\x37\xe5\xd9\xbf\x0f\x7e\x53\xda\xfe\x4e\xf8\x25"
- "\x4b\xf8\x19\xb7\xc7\xe0\x67\xbc\x37\x06\x3f\xe3\x34\x09\x3f\xa3"
- "\x31\x06\x3f\x63\xe8\xe2\xe0\x67\x5c\x10\x83\x9f\xfc\xf6\xc2\xf0"
- "\x33\x6e\x98\x18\x7e\xc6\xba\x18\xfc\x64\x59\x17\x07\x3f\xe3\x27"
- "\x80\x5b\xaa\x0a\xbf\xd4\x89\xe1\x67\x0c\xfd\x9d\xf0\x33\x4b\xf8"
- "\x25\x1e\x89\xc1\x2f\xb1\x3a\x06\xbf\xc4\xef\x4b\xf8\x25\x2e\x8c"
- "\xc1\x2f\x69\xde\xc5\xc1\x2f\x71\x4b\x0c\x7e\xf2\xdb\x0b\xc3\x2f"
- "\xf1\xf5\x89\xe1\x97\xd8\x15\x83\x9f\x2c\x6b\x02\xf8\x4d\x19\x1f"
- "\x7e\x49\x97\xfd\x7d\xf0\x4b\x9a\x77\x21\xf8\x5d\x1c\xaf\x91\x24"
- "\x64\x9d\xff\x85\x72\xea\x27\x2a\x87\x60\x48\xf6\x89\x4a\x45\x52"
- "\x7d\x93\x32\xd9\x28\xcf\x70\x24\x2d\x82\x0c\x73\x7b\xaf\x2e\xe9"
- "\x78\x93\x32\xc9\xc8\x9d\x7f\x68\x53\x9c\x1f\x2c\xe3\xe5\x93\x0d"
- "\x4a\xf9\x14\x03\xf9\x22\x98\x30\x0e\xb5\x6e\xea\x1d\x09\x57\xb0"
- "\x99\x74\x5e\x6f\x33\xf8\x35\xba\x0f\x56\x4c\x5d\x04\x5e\xa4\xfb"
- "\x7c\x98\xe4\xad\x5c\x2b\x82\x5a\x16\xe6\xe7\xad\x5b\x9d\xb7\x7c"
- "\x75\x91\x75\xf9\x8a\x47\xd7\x8e\xf5\x15\x2f\xe2\x41\x6e\xa1\xf1"
- "\x9b\x1a\xf5\x7f\x46\x31\x1d\xc9\xcf\x9e\xed\x1b\x2c\xf1\xa4\x6e"
- "\x6a\x97\xf0\xdf\x9f\x34\xbc\x80\x8f\xe6\xec\xc8\xfe\x26\x7f\x47"
- "\xf8\x0f\x1c\x2d\xd8\x01\x79\xca\x47\x3e\x61\x54\x5f\x83\xbe\x7e"
- "\x5d\xf2\x09\x9e\x18\x2c\x23\x9b\x0e\x71\xb6\x43\x67\xb2\x0a\x5e"
- "\xce\xc9\x3b\xb8\x71\x70\x81\xe2\x0a\x96\xf1\xad\x41\x3b\xc1\xa0"
- "\x93\x7c\xb7\x15\x27\xcc\xea\xd5\x99\xf7\xf2\xc4\xc1\x05\xdc\x35"
- "\xb8\x50\xdd\xe3\x58\x48\xf6\xa2\xd9\x1b\xf9\xa7\x54\x9e\xca\x0b"
- "\x52\x7c\x0e\xb7\xe4\x07\x4d\xf9\xe6\x72\x6b\x02\xe5\x25\x1f\x8a"
- "\xe4\x5b\x50\x8b\xc9\x44\xed\xa6\xbc\xe0\xc7\x6f\xc7\xf7\xb7\x53"
- "\x4c\xca\x68\x19\xb2\x4d\x97\xa2\x4d\x8d\xa2\x2f\x2e\x9f\x7f\xf8"
- "\xf1\x9c\x1d\x22\x2e\xa2\x80\xab\xf9\x69\xf4\xc1\x2f\xe2\x59\x86"
- "\xbf\x12\xf1\x2c\xd5\x6f\xae\xc2\x37\x82\x9e\x92\xdf\x54\x59\x86"
- "\x79\x83\xd6\x2e\xf0\xd0\x49\x78\x5e\x1e\x57\xc7\x54\x3c\xdf\x13"
- "\xf7\xde\x84\xe7\x1b\xc0\x87\x4e\x53\xdf\x27\xe3\x79\x1a\xf1\xa5"
- "\xa2\x5f\x35\x65\xd2\x26\x5a\x97\x42\xb6\x31\xa9\x6a\x9e\x69\x27"
- "\x75\x29\x47\x88\xd7\x55\xcb\xb8\x04\xcf\x6f\x91\xcc\xa8\xbe\x4f"
- "\xc3\xf3\xf3\xb4\x2f\xa0\xbe\xbf\x0c\xcf\x4f\xe0\xf9\x9f\xd4\xf7"
- "\xe0\xeb\x93\xf7\x8b\x36\x1b\x07\xe7\x53\x9f\x00\xfb\x65\x04\x77"
- "\xc0\x7a\x3e\x37\xfa\x7c\x90\x57\x1d\x34\x8e\xd4\x4f\xf7\xc6\x93"
- "\xac\x57\x97\xfc\x6b\x3a\x97\x27\xc7\x2a\x58\x26\x7d\xfb\xe8\x73"
- "\x90\xde\x4a\xe9\x64\x5b\xae\x6c\x0d\x2e\xa3\x7b\xb4\xf5\x1e\x82"
- "\xa1\x5a\x17\x64\xa2\xe4\x6e\x75\x9c\x01\x3b\xf2\xbf\xcb\xca\x76"
- "\xab\x63\x81\xb6\x4d\x41\xdb\xbe\xad\xee\x7b\x84\x16\x87\x47\xe5"
- "\xf9\x22\x5d\x0a\xfb\x87\xfc\x4d\xe0\x3b\x49\xf7\x52\xb2\xb5\x58"
- "\x7d\x5e\x5d\xb2\xf0\x15\x41\xf8\x49\xfa\x15\x7f\xa2\xaf\x5b\xf8"
- "\x57\x01\x8e\x6a\xb8\x42\x78\xc2\x27\x4f\xcd\x11\xba\x9a\x8a\x94"
- "\xe8\xf9\x5f\x7c\xdb\xa6\xc6\x37\x60\x52\x4e\x48\x69\x88\xda\x17"
- "\xe9\x92\x05\x7d\x88\x7b\xb7\x2f\xee\xdd\x7c\xed\x9d\xb0\x81\xab"
- "\x48\xe9\x8a\x7b\x37\xfb\xbc\x77\xbe\xb8\x77\xe9\x63\xcb\x34\x1b"
- "\xe3\xde\x99\xc6\x7e\x67\xce\x88\xbd\x33\x85\xce\x7b\x97\x1d\xf7"
- "\x6e\x40\x7d\x97\x80\xf4\x9c\xa8\x7f\x43\x9d\xa9\x5b\x4d\x07\xad"
- "\x37\xdb\xe2\xd2\x3b\xd4\x74\xaa\x1f\xfc\xdf\x1b\x6d\x6a\xba\xc0"
- "\x73\xe0\xd1\xb5\x6a\x1d\x7b\xe2\xea\x68\x90\x32\x96\xaf\x5b\x8e"
- "\x9f\x29\xd5\xac\xb3\x4e\x21\x9c\x32\x97\x97\x51\xac\x9c\x3a\xe9"
- "\xcb\x4b\xce\x43\x11\x6f\x99\x62\xc2\x22\xdf\x44\xb4\x71\x5c\x1b"
- "\xc1\x8a\x54\x8b\x76\x8e\x35\xe2\xf2\xf5\x28\x55\xb3\x88\x86\xce"
- "\x22\x9f\x5f\x0e\x1f\xf9\x7d\xd1\x62\xef\x9d\x63\x9e\xa2\x60\x19"
- "\x79\x4a\x50\xfd\xc4\xa4\x90\xcf\xb2\x4e\xa1\xdf\x19\x94\xf1\xf7"
- "\xe8\x7c\xef\x56\x5f\xcf\x7a\x1f\x4b\xb7\x7d\x8f\xf7\x91\x9c\x27"
- "\x69\x42\x6a\x15\xbe\x31\xab\xbe\x1c\xb6\x8b\xf3\xe6\xba\xd4\x0e"
- "\x4a\xf3\xf8\x84\x9e\xd9\xd8\xaf\x9b\x66\x11\xef\x79\xce\x76\xd9"
- "\xdf\x69\x16\x21\x4b\xab\xe7\x0a\xd1\x4e\x77\x34\x3e\xa4\x6e\x5a"
- "\xfa\x99\xc4\xb3\x03\x48\x3b\x3c\xc6\xbe\x51\x97\x3a\x48\x65\x52"
- "\x3f\xbc\xba\xd4\x3a\x2a\x1b\x79\x42\x51\xfb\x46\xa4\xaf\x0f\xb3"
- "\x19\x68\x5b\xbf\x56\x7e\xb0\x62\x9a\xc5\xab\x33\x0b\xb9\x92\xca"
- "\x3c\x53\x3d\x0b\xe5\x4e\x9b\xed\xd5\xbf\x35\x5b\xd8\x47\x56\x4c"
- "\x9b\xe7\x65\xbf\x37\x4d\xb4\xfe\x09\x9d\xa4\x31\xd8\xc0\x5d\xc1"
- "\x66\xcc\xf9\x3a\x61\xaf\x9c\x18\x6c\x90\xb2\xfc\xb4\x27\xc8\xfe"
- "\x82\x62\x55\xd3\xbe\xa3\xa4\x3b\xd3\x84\x3d\x04\xa5\x01\x36\x2d"
- "\xa0\xcf\xcd\x02\x07\x2e\x6a\x4e\x4e\x13\xeb\x5f\xed\x10\x33\xd6"
- "\xa8\x36\xaf\x68\xa7\x37\x2e\x4e\x83\xb4\xff\xd7\x5d\x92\xd8\x69"
- "\x17\x7b\x4f\xa2\x8d\xe7\xb7\x81\xda\x8b\xb2\xb6\x4c\xb8\x96\x1a"
- "\x83\x75\x42\x0f\x5a\x39\x24\x63\xa8\xea\x2e\xf9\x7e\x82\xe5\xca"
- "\xb6\x60\xc5\x25\x8b\xa2\xf1\x29\x90\xa7\x86\x6c\x82\x51\x7e\xb4"
- "\x9f\x85\x54\xc7\x25\x62\x1f\xcd\xab\xbb\xc4\x05\x3a\x46\xf6\xd1"
- "\x06\x35\xdd\xd5\x19\x0e\xd1\xd9\xfa\x71\xfd\x67\xd1\x1a\x29\x7c"
- "\x2f\x55\x06\xeb\xe8\xfc\xc4\x4d\x21\xad\xcd\x97\xba\xc8\x6e\x9f"
- "\xda\x2c\x61\x7b\xe9\x26\x0d\x8e\xd5\x43\x28\xbb\xf4\x28\xeb\xd3"
- "\x5d\x3a\x89\xec\x5b\xe8\x1c\x4a\xed\x46\xd5\xe6\x0a\x69\x22\xdf"
- "\x39\x2d\xcf\x25\x42\xdf\x41\xf6\xbe\x44\x4f\x9b\xc8\xef\x00\xca"
- "\xac\xc1\x58\x08\x9f\x22\xba\x4b\xef\x15\xfa\xcd\x42\x26\xfb\x4d"
- "\xf6\x6c\xba\x4b\xf7\x4a\x5c\xb9\x74\x81\x57\x77\xa9\x3a\x77\x65"
- "\x1a\xc5\x3a\x27\x3b\x84\x53\xba\x4b\xaf\xa1\x98\xa9\x80\x47\x33"
- "\xf9\x9d\xeb\x0c\x60\xbe\xd8\xcf\x11\x2e\x34\x53\x6c\x3c\xe4\xcf"
- "\x90\xeb\x03\xc1\xfc\x52\x23\xd5\x4f\xb0\xa5\x78\xb1\x80\xe9\xef"
- "\x51\x76\x54\xff\x41\xb1\x69\x01\xb7\xfd\x13\x8d\x0b\xc1\x28\x82"
- "\x36\x93\x17\x0f\xf7\x8c\xa3\x68\x5f\xda\x4a\x25\x29\x58\x47\xf6"
- "\x93\xb8\x97\xbe\x4e\x5d\x72\xec\xe4\x5c\x4a\xbb\x03\x75\x9c\xa6"
- "\xbd\x46\xb2\x19\x17\xf1\xba\x75\x97\x0e\xa8\xf0\x13\xf1\x2a\xea"
- "\x8a\x25\x1c\xd4\xfc\x8d\x52\x2f\x73\x65\x30\x58\x91\x36\x2f\xa6"
- "\x97\x49\x13\x3e\x8b\x35\x1b\x6b\xbc\x7b\x20\xae\xcd\x01\x71\x0e"
- "\x70\x88\x64\xea\x4b\xc3\x54\x57\x35\xf9\x05\x23\xbc\x38\x19\x8f"
- "\xff\x97\x1e\xa3\x76\x92\x6d\x5e\x24\x71\x88\x6c\x03\x7c\x04\x67"
- "\x94\x9d\x86\xb9\x50\x37\x41\x3c\x74\x11\x8f\x09\xf5\xb5\xc7\xc5"
- "\x98\xc5\x3a\x98\x76\x46\x5b\xe7\x68\x8d\x26\x3f\x0f\xd1\xb4\xea"
- "\xb9\x2d\xe0\x71\xac\x2a\x8f\x33\xae\xae\x48\xf8\x28\xbc\x91\x65"
- "\xd1\x59\x63\xb2\xd3\x26\x7c\xe3\xa6\xb9\x0b\xc9\xef\x31\xf9\x70"
- "\x74\x6f\xbc\x05\xed\xbd\xec\xc5\x6d\xd3\xc5\xf9\xc6\x80\xfb\xc6"
- "\x21\xb2\xd1\xf1\xf5\x97\x08\xdf\x44\xc6\xc5\xf6\x30\xdf\x2d\x63"
- "\x4c\xfb\x79\xf2\x5c\xe2\xa3\x7c\xc2\xef\x3f\x95\xf9\x8f\xfa\xf0"
- "\xd5\x5d\x66\x53\x79\x19\x1f\xe8\xe4\xe5\x27\x75\x97\x89\xf3\x8c"
- "\xb8\x9f\x7e\x52\x37\xfd\x90\x8c\x8b\x28\xfd\xd0\xab\xb6\x86\x93"
- "\xe5\xf9\x7c\x3f\x13\xe7\xa5\x75\xd3\xef\xb0\x5e\xcf\x98\x4f\x37"
- "\xfd\x6e\xe1\x13\xda\x35\x98\xa5\xc2\x20\xab\x56\xb6\xcb\x9c\x6b"
- "\xd7\x8b\x36\x52\xfb\x2e\xae\x6d\xd3\xb5\xf5\x72\x72\xb0\x62\xfa"
- "\x12\xed\x5c\xbf\xe8\xbf\xea\x2b\xda\xfd\x0d\x92\x5b\xa6\xbf\x25"
- "\x71\x70\x70\x8e\x5a\xf7\x9c\xff\x85\xba\x5d\x6a\x99\x46\xe1\x2f"
- "\x1b\x70\x41\xb9\x58\xbf\xa6\x77\x6b\xeb\xa9\x6a\x23\x3f\x5b\xae"
- "\xf3\xd3\xfd\xb1\xb5\x54\xc2\x70\xcc\x99\x9d\x35\x6b\x8a\xac\x60"
- "\xd8\x6d\xcb\x8b\x56\x14\x58\xf3\x0b\x0b\xd7\x14\x5a\xc9\xb9\x4d"
- "\xfc\x1c\x13\x36\x30\x15\x97\x1b\xd4\x18\x67\x2d\xd1\x18\x67\x15"
- "\x97\x2f\x8a\x8f\x3d\xe7\xd5\x5d\xbe\xe4\x7f\x47\xae\xb9\x7c\xc2"
- "\x73\x7e\x75\x7a\xa5\x15\xbf\x36\xfc\xdc\xf8\x75\x90\x9c\x93\x1b"
- "\x62\xd9\x58\x1f\xc5\xf9\xb4\xd8\x79\xf5\xcb\x33\x68\x1f\xbc\x57"
- "\x77\xf9\x07\x4d\x8a\x81\x09\xbf\x26\x4e\x85\x6c\x49\xc8\xb7\x79"
- "\x1b\x7e\x6e\xfc\x3a\xf0\x13\xdf\x29\xef\x89\xb3\xb6\xad\xf1\xef"
- "\x68\x6f\x9a\x3b\xf7\xf8\x28\x0f\x2f\x37\x08\xfe\x4f\x79\x46\xe6"
- "\x3b\xaf\x0d\x7a\x5e\x31\x6d\x91\x9a\x4f\x9c\x89\x4e\x29\x67\xd6"
- "\x71\xf2\x25\xf0\x8a\xa9\x76\x35\x9f\xb0\x4b\xd3\xfa\x43\x7e\xf7"
- "\x91\x5f\xcb\x67\xe0\x15\x97\x19\xd5\x7c\x02\xd7\x14\xa7\x7e\xbc"
- "\x7a\x27\x71\xe7\x91\x7d\x6a\xbe\xd4\xf8\xf2\xe2\xf2\x4c\x56\x2a"
- "\xf4\x3d\x94\x47\x29\x37\x08\xfd\x3f\xc6\x72\x15\xf2\x8f\x2b\xeb"
- "\x5d\xdc\x38\x5d\x91\x76\xfe\x38\xd9\x56\xac\xcc\xff\xee\xca\xd5"
- "\xc5\x14\x05\xaa\x68\xcd\xba\x22\xba\xae\x5e\xfe\xa8\xb8\xac\xc9"
- "\x7d\x64\x85\xbc\x29\x5a\x95\x45\x37\xab\x80\x6f\x74\xcd\x5b\x67"
- "\xa3\xcb\x8a\x35\xf4\x68\x2f\x98\xbd\x6e\x85\x16\xba\x3a\x1e\x0f"
- "\x33\x83\x15\x57\xec\x07\x6e\xec\x95\xfc\xc8\x15\x1d\x90\x7f\xc5"
- "\x3e\xb0\xb9\xdc\xcb\xde\xcf\x14\x31\xee\xd8\xd7\xfc\x15\xe8\xae"
- "\xf8\x84\xfc\x15\x98\xcb\x6d\x2b\xcc\xe1\x95\xf9\x7c\xeb\xf0\xc2"
- "\x60\xc5\x0c\x83\x97\x3d\xe5\x96\xbc\xd0\x60\xb6\xf0\xf9\x59\x71"
- "\xc5\x03\x9a\x7d\xa1\xe2\xf2\x05\xc8\x97\xbd\xb0\x37\x7a\x86\x7c"
- "\xe1\x0c\x5a\x91\x6f\x7e\xd3\x33\x22\xa6\x4c\x1a\xde\xd3\x77\x0b"
- "\xf0\x4c\xb1\xd7\xd2\x15\xd7\x31\x17\x9d\x4f\xc4\xb3\x15\xcf\x19"
- "\x28\x3f\x4f\x9b\x17\xf1\xb0\x51\x83\xaa\x7d\x77\x5c\xf9\x78\xac"
- "\x3f\x29\xcc\xad\x19\x2d\x5a\xcc\x5a\x11\x9f\xb6\x62\x46\x5b\x34"
- "\x3e\xad\x88\xc3\x94\xba\x54\xac\x6b\x62\x6d\xbf\xf2\xdb\x09\x96"
- "\xab\xfe\x59\xf2\xe1\x33\xbc\x9a\x4f\x06\xc9\x67\xcf\xf0\xc7\xc5"
- "\xf6\xc5\xf3\x95\x2c\x1a\xdb\x57\xf2\xa1\x3b\x24\x1f\x7a\xe5\x42"
- "\x5e\x31\xc3\x16\x8d\xc3\x56\x71\x65\x66\x7c\x1c\x36\x2f\xde\x93"
- "\x7c\x83\xf4\xec\xd8\x3a\x38\xe3\x30\xd5\x39\x5e\x1c\x63\xc8\xe7"
- "\xf6\xdc\x0d\xe0\xc5\x71\x15\x7c\xb9\xca\x03\x53\x3a\x77\x66\x93"
- "\x7f\x1b\x2b\xbd\x23\xde\x6f\x5c\x9d\xc3\x4c\xd1\xaf\x23\xe4\x33"
- "\xd7\xef\xc8\xd3\x7d\xb3\x89\xe9\xc4\xb3\xf4\xf9\xc8\x4f\xe9\xae"
- "\x14\xe7\xd8\x34\x7f\x70\xf1\x67\xe2\xc7\x3d\x7b\xf0\xb1\xb6\x67"
- "\xbc\x6a\x8d\x39\xbc\x3c\x5f\xf2\x71\xe9\xdf\x91\xb4\x74\xd8\x24"
- "\xd7\xfb\xf4\x0c\x7e\xbf\x8c\x55\xe2\xd5\xa5\xb7\xd0\x79\x24\xb3"
- "\x6e\xd5\x1a\x8e\x6f\xcd\xf6\xe5\xf9\x22\x0d\xf9\x36\x83\xd7\x92"
- "\xed\x4b\x4f\xf4\xa4\x0f\x30\x3e\x12\x91\x67\xfd\x75\xe9\xc6\x87"
- "\xae\x2a\xa3\x7a\x8c\x82\x8f\xf8\x98\x99\x28\x26\x1e\xb5\xad\x29"
- "\xce\x5f\x5d\x2d\xd2\x44\xbc\xfb\xfb\x99\x89\xfc\xf3\xaa\x6d\x31"
- "\x8a\x38\x63\x15\xe9\xcd\x9a\xcf\x1c\xd4\xf7\x35\x5f\xcb\xf7\xff"
- "\x40\xcc\x90\x6b\x56\xcc\x5e\x72\x37\xee\x66\xab\xe1\x5c\xe3\x71"
- "\x27\x7d\x38\xe9\xcc\xbc\xe1\x97\xb6\xad\x17\xf1\x10\x2b\xd2\xc1"
- "\x43\x5d\xa9\xc6\x50\xfe\xd1\x09\xa2\x2d\x22\x4e\x20\x9d\x2b\x54"
- "\x02\xa8\x77\xd6\x21\xe1\x1b\x57\x2f\xf9\x45\xe1\x93\xae\x22\x7d"
- "\x1f\x4f\xf2\x79\x65\x2c\xd4\x61\x2f\xc6\x4f\xac\xfb\x34\x37\xc4"
- "\xf9\xc9\x54\xea\xfb\x55\xe0\x0f\xd8\x5d\xf8\xfd\x3f\x19\xdb\xe5"
- "\x47\x27\xb4\x72\xc9\x7f\x14\x70\x6b\x21\xae\xa9\xc1\x8a\xab\x6c"
- "\x51\x1b\x21\xed\x4c\xa6\xee\xaa\xa7\xc9\xb7\x55\x8c\x3f\x9f\xf5"
- "\xba\xe4\x2b\xaf\x6a\xf4\x32\x73\x83\x9c\xdf\x57\x01\xff\x5f\x59"
- "\xa0\xde\x43\xfe\xbd\xb5\xe3\xbc\x32\x22\x9a\xee\x43\x8e\xdd\x55"
- "\xdd\xc0\xc5\xbb\xf0\xfb\x7f\xc8\xdf\xa7\xc5\x82\xde\xac\x17\x67"
- "\x8b\xfa\x13\x2c\x2c\x0b\xe9\x61\x2d\x7d\x92\x2e\x1b\xb0\x99\x69"
- "\xd2\xe8\xc9\x70\xd2\x10\x64\x87\x99\xe9\xe0\x37\xeb\xe5\xf3\x30"
- "\xbd\x9f\xad\x3d\xe3\x7e\x9e\x46\x6f\x48\x07\x31\xfc\x78\xce\x76"
- "\x92\xff\x56\x58\xc0\x93\x59\x48\xbe\x9a\x09\xf9\x77\x6f\x96\x9a"
- "\x37\xcf\xcb\x7e\xa5\x7d\x87\xfe\xbf\xed\x8f\xc1\x3f\xc1\x2c\xdb"
- "\x3f\x6b\x0f\x4f\x9e\x65\xa4\x18\xdc\xc8\x53\x8f\xb9\x24\xfd\x67"
- "\x14\xfb\x9a\xab\xce\xa5\x3e\xe0\x81\x34\xe2\x7e\x84\xf0\x62\x96"
- "\xb0\xad\xa9\xde\x98\xba\x84\xf8\x3b\xf2\x39\x20\x62\x9a\x91\x6f"
- "\xc8\x30\x9b\x2c\xfc\xf1\x57\xcf\x0c\x09\x3f\xf4\xeb\x33\x4d\x9a"
- "\x5f\x48\xcc\xc9\x3a\xae\xdf\x96\x41\xbe\x22\x85\xde\x2c\x98\x99"
- "\x22\xfc\x43\xaa\x7e\x21\x77\x15\xb3\xb4\x46\x45\xfa\x85\x14\xfe"
- "\x08\x2e\xe0\x1b\x92\x3b\x3f\x4c\xd5\x7c\x43\xa2\xcf\x74\xce\x30"
- "\x93\x8f\x84\x43\xb8\x66\xc4\xf9\xb5\x31\x8c\xeb\x27\x52\x0f\x1a"
- "\xa9\x97\x7e\x22\x2f\x6e\x6d\x99\x65\x93\x38\x31\xab\x55\x8b\x4b"
- "\x1d\x97\xd6\x0e\x9c\x56\x69\xd0\x55\x75\x6a\x1a\xf8\x9f\x5f\x36"
- "\x46\xf9\x30\xd0\x36\xd2\x1f\xe2\x7d\x1a\x77\x14\x6c\x8f\x9f\x43"
- "\x8c\xd1\x12\x3d\x09\x73\x6b\x32\x7e\x53\xe8\xb7\x30\x4a\x27\x46"
- "\x78\x37\xc9\x02\x66\x1d\xd6\x15\x7b\x02\x5f\x1c\x0e\x27\xe4\x86"
- "\x75\x87\x89\xc7\xa4\xb3\xd5\x8b\x23\x61\x3a\xe3\x6f\x58\x1c\x19"
- "\xa6\x78\x91\x87\xe9\xcc\x58\xed\x23\x74\x86\x71\x16\xa7\x58\x32"
- "\x8b\x23\x5f\xf1\xdd\xf2\x6c\x66\x17\xc9\x00\x91\x11\x7e\x30\x52"
- "\xcc\x3b\x30\x06\x26\x92\x2f\xc8\xcf\x56\x8a\x2e\xc4\x52\x6c\x09"
- "\xef\xdc\x77\xe6\x1d\x4e\x3e\xb6\x28\x8e\x98\x52\x11\x02\x4d\xb4"
- "\xea\x72\xc3\x09\x65\x9e\x70\x9f\xf0\xe5\xbf\x38\x32\x85\x2f\xb6"
- "\xdf\xc6\x45\xfc\xaf\x62\xde\x0e\x7a\x9a\x20\x62\x42\x6f\xe0\xc3"
- "\xb8\x37\x2e\xde\x30\xcc\x29\x5e\x25\xca\xee\x58\x1c\x56\xce\x2d"
- "\xb6\x2b\x8e\x5c\xbb\x0e\xdf\x7d\x86\xef\x3e\x43\x7b\xb2\x50\x66"
- "\x2a\x9e\x6f\xe7\xbb\x1f\xa1\xb3\x4e\x65\x42\xc6\x41\x1f\xdd\xea"
- "\xf9\xd1\x36\xb4\x6f\x1f\xf9\x02\xcf\x0d\xbb\xcb\x76\xab\xe7\x41"
- "\x45\xac\x54\xfb\x28\x57\xeb\x99\xb7\x78\x03\xbb\x3d\x77\xc3\x2c"
- "\x71\xae\x94\xce\x4c\x2d\x0e\x5b\x51\x67\x19\xc1\xc3\x24\xe2\x53"
- "\xd3\xb9\xa9\x8a\xab\x73\x2e\x14\xe7\x92\xec\x41\xd6\x5e\xc1\xf4"
- "\xa4\x07\x88\x34\x39\xfd\xe4\xf3\xcb\xe1\xe7\x21\xd2\xef\xbd\x73"
- "\xae\x5b\x6f\x2d\x36\x80\x7e\x5e\xbd\xa9\xd3\x96\x35\xfe\xd9\xb9"
- "\x8a\x48\x0b\xaf\x7e\x6d\x0b\xaf\x64\x76\x5e\xdd\x66\xe0\xae\x00"
- "\xd1\x6c\x1d\xaf\x4c\x58\x88\x67\xa4\x4f\xb6\xf0\xea\xd7\x21\x2f"
- "\x1b\x07\x70\xc5\xf3\xd4\x36\x5e\xfd\x06\xf8\xa8\xfe\x32\x7c\x57"
- "\xc6\x2b\xbe\xa0\xef\x80\xe7\x03\x36\x5c\xf1\x7c\xa2\x00\xf9\xf0"
- "\x7c\x72\x19\xae\x78\xfe\x32\xa7\x5f\xf7\x0d\x94\xf5\x06\xe4\xdd"
- "\x14\x97\xac\x6b\x9a\x4b\xd4\x55\x99\xe6\x92\x75\x5c\xee\x92\x75"
- "\xcc\x70\xc9\x3a\xae\x72\xc9\x3a\x7c\x4b\x90\xdf\xc5\x2b\x06\xdd"
- "\xc8\x87\xb6\x7e\x95\x85\x2b\x9e\xfd\xcd\xc8\x87\xe7\xa1\x54\x5c"
- "\xf1\x3c\x8c\xb6\xbc\x81\xe7\x80\x1f\xf9\xab\x78\xc5\x48\x1e\xf2"
- "\x99\x78\x45\xb0\x1b\x57\x3c\x9f\x5d\x84\x7c\x78\x3e\x87\x72\x5e"
- "\xc7\x73\x78\x0e\xf2\x83\x96\x5a\xa9\x3d\x75\xbc\xf2\x1b\x54\x6e"
- "\x2a\xaf\xfc\x26\xe5\xc7\xf3\x35\x28\xef\x75\x3c\xff\x53\x26\xae"
- "\x78\xce\xec\x42\x7e\x3c\x5f\x8f\xbe\xbe\x56\xcf\x2b\x67\x67\x20"
- "\x5f\x1a\xaf\xbc\x01\xe9\x6d\x78\xbe\xa9\x04\xf9\xf0\x7c\x33\xe5"
- "\xc7\xf3\x2d\x87\x91\x1f\xcf\x73\x08\x46\x0d\xbc\x72\xae\x17\xf9"
- "\x2c\xbc\xf2\x3b\xd9\xb8\xe2\xf9\xff\x52\xfb\xf1\xfc\x3d\x86\x2b"
- "\x9e\xb3\x01\xab\x37\xf0\x7c\x27\xda\xf7\x5a\x23\xaf\xbc\x9b\xca"
- "\x4f\xe7\x95\xff\x42\xf0\xc1\xf3\x3d\x3e\xe4\xc3\xf3\x22\xc0\xe3"
- "\x75\x3c\xdf\xb7\x0f\xf9\xd3\xc7\x1d\xcf\xca\xef\x57\xf1\xf2\xc9"
- "\x80\xf5\xbf\x77\xf0\xf2\x29\xb8\x2e\xb5\xf3\xf2\x49\x99\xbc\x32"
- "\xb7\x1b\xe9\xb8\xfe\xc7\x12\x3c\xcf\x56\x9f\x71\x7d\x28\x13\xcf"
- "\x59\xea\x33\x5d\x19\x9e\xe7\xa8\xcf\xb8\x2e\x77\xe1\x79\x1e\xaf"
- "\x7c\x98\xf6\x33\x70\x5d\x1e\xc0\xf3\x7c\xf5\x19\xd7\xbc\x0c\x5c"
- "\xc3\xfe\xab\x9c\x0b\xfd\xc9\x4f\x32\x7f\xf2\x9b\x36\xc2\xc9\x48"
- "\xcd\x6b\x65\x4a\x4a\x1b\xed\x7b\x4d\x76\x9c\x61\x53\xfa\x75\xd7"
- "\x5c\x46\x6b\xa1\xa7\xc4\x2b\x62\xcf\xa9\x3e\xe8\x26\xf7\xea\x32"
- "\xa6\x61\xed\x9f\x47\xf1\xba\xd1\xf7\xfd\xdc\x39\x69\x08\x7d\x9e"
- "\xcf\x9d\x53\x7b\x71\xc5\xf3\xb4\x8f\xd1\x67\x3c\xcf\xad\xc4\x15"
- "\xcf\x3f\xba\x13\x7d\x9f\x1f\xac\xc8\xb0\x79\x75\x57\xef\x11\xb4"
- "\xfd\xa5\x6d\x36\x73\xd8\x01\x9a\x02\x7a\xbb\xfd\x3d\xc8\xa3\xcb"
- "\x00\xd7\xfd\xa9\x66\x8a\x11\xb1\xcb\xe9\xe2\x29\x4f\x8a\x36\x51"
- "\x1c\x18\x3e\x9a\xa1\x97\x75\x4f\xe5\xa8\x7b\x17\xe9\x38\x79\xca"
- "\xee\x89\xde\xbf\x25\xde\xcf\x78\x2f\x5b\xbe\x37\xb2\xd8\xfb\x1f"
- "\xd1\xfb\x63\x66\xd2\x4b\xcf\xdc\x28\xde\x7b\x02\x03\x6a\xbf\x12"
- "\xe8\xdd\x59\xca\xeb\xd5\x5d\x93\x2e\xf5\x54\x19\x56\xee\x4c\x60"
- "\xc3\xc6\x61\xac\x5d\xd7\x60\xfd\xbb\x3a\x4f\xd5\x19\x06\xb8\xd1"
- "\x17\x92\xfe\x06\x82\x13\xf9\x42\x31\x2a\x55\xee\x82\x6a\x27\xef"
- "\x22\xd9\x13\x6b\x88\xde\x5a\x9a\xd1\xd6\xab\xbb\x36\xb4\x4b\xe8"
- "\x14\xde\x33\xd2\x99\xa0\x5e\xdd\x35\x6f\x8d\x56\x06\xb2\xac\x1b"
- "\xcd\xa8\xff\xda\xb3\x8e\x10\x3f\xe3\x2e\xbd\x13\x6b\x9d\x48\x5f"
- "\x25\xec\xcc\xe5\x7d\x8e\xb4\x0d\x12\xf7\x0b\xa4\x7e\xf4\xda\x10"
- "\x7d\x1b\xcf\xeb\x47\x2a\x16\xfb\x94\x94\xf7\x52\xe5\xde\xd6\x35"
- "\xef\xbe\xa5\x78\xf5\xe6\x22\x36\xc9\xba\xf1\x1d\x2a\xdf\x38\x56"
- "\x2e\xd4\xf2\xd2\xbb\x6b\x06\xdf\x46\xde\x9d\x42\x87\x73\x6d\x54"
- "\xff\xcb\xd1\x87\xa7\x24\x4f\x94\x4d\xeb\x9a\xe4\xed\xae\x6d\x20"
- "\x5f\x98\x61\xd3\x9b\xfe\x70\x55\x85\x3f\x52\xf5\x9e\x91\xd7\xbc"
- "\x97\x9a\x12\xd6\x31\x61\xa3\xaf\xbb\xf6\xd0\x4d\x21\xd2\xad\xfd"
- "\x91\xf2\x3e\xa1\x4c\xfe\xe1\xde\x1b\xed\x4c\xef\x2e\x3c\x4a\xcf"
- "\xef\xf3\x8a\xdc\x07\x3c\xbe\x6e\x46\xfe\x7c\xf1\xdc\xce\x2b\x1e"
- "\x9d\xa7\x4c\xce\x4f\x6d\x22\x9e\xd4\x4e\x3a\xa1\x8f\x29\xfd\x1e"
- "\x8c\x0b\x78\xff\x6b\xf7\x68\x6d\x21\x7f\xfe\xd5\x80\x1d\xf1\x8b"
- "\x74\xa6\x3a\x37\x12\x21\xff\x4f\x2e\x2f\xe0\x20\xc7\xeb\x5a\x17"
- "\xd1\x6d\xb5\xde\x63\x4a\x52\x20\xbd\x73\x29\xed\x9f\x1a\xc9\x9f"
- "\xce\x19\x71\x06\x33\x4c\x31\xf8\x68\xad\x94\x79\xc7\xf8\x30\x5e"
- "\x61\xcb\xdd\x68\x5b\x53\x58\x94\xbb\xce\xf6\x5d\x2b\x04\x36\xeb"
- "\x9a\x47\xac\x8f\xe5\x3f\xb6\xa6\x70\xc3\xf9\x7c\xa5\x31\x58\xf1"
- "\x4f\xf3\x81\x27\xe2\xac\xc5\x07\xe0\x55\xa5\xae\xf9\x3a\x61\xe7"
- "\xb4\xfd\x39\x19\xf3\x01\x79\x96\x79\x59\x95\xf0\xe7\xa5\x34\xbc"
- "\x97\xc9\x1b\x9d\xae\xad\x74\x96\x7c\x1d\xc9\x06\x7e\xe6\x61\x43"
- "\x68\x9b\x8c\xff\xd7\x49\xfe\x0e\x8a\x4b\xb8\xbb\x78\x88\xe6\x81"
- "\x91\x57\xbf\x69\xc1\x3c\xe8\x3a\x5b\xfd\x64\x41\xaf\x2e\xd3\x7f"
- "\xb6\xfa\x4d\xa3\x16\xa3\x27\x52\xf5\x66\x81\x62\x72\x97\x51\x8c"
- "\x9e\x51\x6e\x61\x87\x00\xcb\x73\xae\x00\xf8\x9c\x80\x61\x97\x13"
- "\xeb\x18\x64\x0a\xe1\x67\xe1\xa5\x6d\x4b\x22\x3c\xd3\x10\x71\x32"
- "\x23\xae\x29\x3c\xe5\xdd\xd6\x51\xd3\x7e\x46\xef\x29\x36\x4f\x64"
- "\x34\x93\x95\x1e\xe6\xca\xbf\x17\x00\x6f\x9c\x8c\x8b\x78\xa8\x05"
- "\x83\x0c\xe9\x49\x4a\xcd\x9b\x75\xfd\x0b\x99\x9e\xf2\x82\x47\x62"
- "\x4b\x71\x5f\xb2\x9c\x25\x23\x9f\xb9\xe4\x03\xa4\x07\x33\x93\xc2"
- "\x8e\x4c\xe3\x39\x47\x66\xd2\x28\xcf\x34\x79\xfa\x42\x6c\xf4\x9a"
- "\x6d\xcb\x6e\xf0\x33\xc3\x76\xf0\x52\xbb\x14\xcc\xc1\x46\xa7\x2d"
- "\xf2\x78\xe6\xe4\xf0\xe3\x99\x86\xd1\xd1\x4c\x63\x78\x7d\xa6\xe1"
- "\xdc\xfa\xcc\xc9\xa3\xc1\x4c\xa3\x27\xcf\xcf\xfe\xe8\xff\x05\xeb"
- "\xec\x1b\x10\xfa\xc8\xd1\xe4\x77\xf7\x8f\x26\xbf\xd9\x68\xea\x63"
- "\x69\x37\xda\xc0\x53\x81\x9f\xdc\x01\xde\x19\x38\x61\x0a\xbf\xb8"
- "\x0d\x34\xf4\xdd\x65\xfd\xba\xcc\x4f\xee\xbe\x8e\x7f\x15\xa9\xb8"
- "\xb1\xc5\xfa\xaf\xa0\x57\xe5\x86\x74\xa4\x01\x7f\xfe\xaf\x85\x57"
- "\xfc\x1f\xd0\x36\x83\x15\xbf\x0c\xaf\x1c\x07\xac\x67\x37\x2c\xc5"
- "\x73\x3a\xe5\x95\xf9\x6e\xdd\xeb\x15\xd7\x9b\x84\xed\x7e\xa4\xe2"
- "\x9f\x0c\xbb\x84\x7c\x77\x9d\x51\xe3\xcb\xdb\x0d\xe3\x9f\x57\x47"
- "\x9e\xd9\x51\x39\x59\x01\xcd\xa9\x7e\xcd\x36\x3e\x2d\xff\x32\x4c"
- "\x7b\x99\x0a\xe0\x06\x7c\xd8\x45\x3e\xa6\xb8\x63\xa1\x2a\x9b\x5e"
- "\x27\x78\x36\x3a\xe3\x4d\xfa\x0b\x35\x4d\xe8\xda\x15\x7d\x36\xf9"
- "\xe3\x6f\x23\xbf\x5e\xa4\xaf\x00\x5e\x43\xa6\xbf\xae\x15\x70\x98"
- "\x04\xb9\xae\x15\xbf\x36\xfc\xdc\xdb\x48\x8f\xe1\x64\x77\x6b\x3a"
- "\x9e\x09\xda\x0a\xfe\xaf\xba\x21\x26\xe7\x5e\x37\x80\xb2\xb2\x2f"
- "\xde\x0e\xf0\xba\x81\x0b\xe8\x9b\x0d\xe4\x9f\x96\xd7\xbc\xd6\x5c"
- "\xa7\x44\xfd\xd9\x62\x6d\xb8\xfe\x36\xd0\x89\x32\xf1\xae\x6a\x7f"
- "\x6a\xe9\x69\x96\x40\xef\x5a\xc9\xee\x01\xcf\xd6\x42\x1d\xf7\x04"
- "\x42\x0c\xdf\x18\x78\xba\xd3\xd5\x3a\xe2\xd7\xd3\xbc\xe8\x44\x1a"
- "\xbe\x7d\xb0\x6e\x44\x2d\xb7\xe1\xbd\x2c\xc7\x4f\x99\x88\x2f\x42"
- "\x31\x8a\x68\xbe\xd4\x95\x42\x86\xa4\x78\x4a\x85\x44\xab\xaf\x7f"
- "\x1a\xf7\x46\xca\xc7\x4d\xfb\x53\x15\x94\x81\x39\x63\xe7\xc9\x6f"
- "\x86\x94\xea\x37\xcb\x30\x77\xb2\xf9\x55\xce\x01\x65\xfb\x7b\x96"
- "\x60\xc5\xf5\xd4\x7f\x11\x87\x9d\xfc\x07\x91\x8e\x24\x02\x59\xbd"
- "\xb3\x25\xcc\xf8\x9d\x61\xf6\x7e\xd1\x19\xe6\x4f\x0c\x98\xfc\xc9"
- "\xee\x02\x7f\xf2\xbb\xcb\x22\xc9\xee\x56\xfc\xf6\xd9\x0a\x69\xdf"
- "\xf8\x5b\x7b\xa3\x7e\x30\x4f\x5f\xd8\x0f\x26\xca\xcc\xd0\x7c\x61"
- "\x46\xd6\x5f\xbc\x1f\xcc\x88\xfe\x80\x61\x57\xf1\xdf\xf6\x83\x09"
- "\x9e\xb5\x0b\xfc\xaa\x5b\xf3\x59\x12\x11\x76\xe8\xcc\x14\x49\x7e"
- "\x73\x40\xf8\x3d\xb1\xbb\x85\xef\x12\xe2\x5d\x69\xad\x09\x56\x7c"
- "\x6b\x40\xe3\x47\x89\x7e\x46\xb6\x06\x2c\xf8\xa5\x05\x2b\x66\x33"
- "\xaf\xee\xf6\x79\x1a\x6d\xc5\x9a\x6b\x8d\x24\x3d\xe6\x0b\xd2\xd9"
- "\x82\xd1\x82\xdb\x29\x2f\xe0\xb8\x04\x75\x27\x44\x46\x0b\xe6\xe3"
- "\x77\x1b\x7e\xdf\x8b\x54\xbf\x99\x1a\xa9\x7e\x37\x3b\x52\xfd\x64"
- "\x06\x7e\x99\xf8\xcd\xc6\x2f\x0b\xbf\x39\xf8\xcd\xe3\xd5\x4f\xce"
- "\xc7\x95\xde\x2f\xc0\x6f\x21\x7e\x8b\xf0\x5b\x82\xdf\x03\x91\xed"
- "\xef\x59\x23\x3a\x43\x3a\x7e\x19\xf8\x59\x23\xd5\xee\x16\xfc\xec"
- "\x28\xd3\x2f\xce\x7c\x56\xcc\xae\xd7\x70\x75\x02\x9f\xab\x99\x22"
- "\x66\xc2\xa4\x4f\xb9\x99\xe2\xf9\x96\x9c\xa1\x3d\xec\xcc\xff\x8f"
- "\xbd\xf7\x81\x8b\xaa\x4a\xff\xc7\xcf\x5c\xc7\x42\x9b\x81\xc9\xa5"
- "\x96\x0c\x6d\xb6\x68\x3f\x53\xab\xc5\xb6\xe6\x52\x1f\xdd\xc8\xac"
- "\xb5\x52\xb1\x5d\x6c\xa9\x2c\x31\xb1\xd0\x10\x51\x49\xc9\x3f\x80"
- "\x93\x29\x12\x20\x9b\x6e\x1f\x34\xfe\x58\x6b\x9f\xa5\x5d\x2d\x77"
- "\xd7\xfd\x3a\x20\xd5\x68\xba\x8b\x0a\x0c\xba\xda\xd2\x7e\xf0\xd7"
- "\xc4\x92\x4b\x86\x36\xc1\x28\x03\xcc\xdc\xf3\x7b\x9e\x7b\xee\x65"
- "\xee\x1d\x66\x60\x66\x40\xb3\x0d\x7c\x5d\x67\xe6\xdc\x73\xcf\x3d"
- "\xe7\x79\xde\xcf\xfb\x79\xce\xb9\xe7\x9e\x73\xd8\x60\x0f\x6c\xef"
- "\x0c\xd5\xb8\x43\xbe\xb0\x8d\xe5\x03\xcf\x74\x07\x56\xde\xf8\x5e"
- "\xe3\x7f\x3d\xf1\x7e\xc4\x41\x83\x33\xd2\x58\xef\x34\x92\x6c\xe0"
- "\x36\x55\x5d\x62\x33\x89\xb3\x91\xac\x9a\xe6\x2e\x92\x95\x44\x5d"
- "\x02\x0f\xac\xc1\x39\xde\x5b\xa2\x10\xe7\x2e\x9a\xa0\xef\xce\xdb"
- "\x1f\xe1\xd2\x98\x63\xa9\xc6\x9c\x21\xac\xad\x07\x7c\x82\x7b\x94"
- "\xf5\xf4\x69\x11\x77\xd0\xaf\xad\x6d\xbd\x40\x56\x27\x51\xbe\x36"
- "\x19\x62\xb4\x06\x00\x9f\x8a\xbc\x29\xe0\x4f\xec\xd7\x3e\xda\x48"
- "\xb3\x01\x4f\x23\x5c\x20\x37\x1e\xfb\xb3\x80\xbd\xb2\x15\x24\x5a"
- "\xc2\x1f\xf8\x75\x9d\xb4\xaf\x13\xbd\x6a\x5c\x39\x9c\x53\xe3\xbe"
- "\x4f\xc5\xd0\xaf\x2d\x5e\x41\xa2\x8a\xe1\x9c\xb0\x47\x27\xd4\x7b"
- "\x66\x5a\x18\xe5\x5f\x30\x90\xd2\x45\x24\x44\x7b\x8e\xed\xfb\xea"
- "\x02\xd9\xbb\xf7\x3e\xd8\x98\x3c\xe3\x9c\x9e\x1c\x36\x9c\x06\xff"
- "\xbc\x07\xf4\xb2\x31\xb9\x1b\x7c\x18\xc8\xd2\x15\x98\x2c\xef\x48"
- "\xbc\x54\xb2\xec\x8e\x34\xa6\x31\x79\x26\x12\x94\x99\xa7\x3c\x51"
- "\xc6\xab\x9a\x41\x9e\x20\x57\xcb\x49\x17\xf4\x4f\xc9\x3c\x49\x9e"
- "\x6f\x80\x3c\x41\xa6\x11\x28\x53\x90\x87\x20\x53\x2a\xca\xb4\x54"
- "\x26\x53\xe0\x2f\x61\x1d\x42\x94\x29\x0f\x32\x2d\xf5\x21\xd3\x9e"
- "\xf1\x01\x90\x69\x99\x5f\x32\x2d\x1f\x80\x4c\xef\xdc\xeb\x4b\xa6"
- "\x4e\x8c\x1d\x0a\x36\x26\x52\xe0\x46\x8b\xf3\xa8\xb0\xa6\x26\xc4"
- "\x7d\x7b\x21\x7e\xdd\xc3\x6b\xf6\x27\xe3\x3e\xde\xf8\x5c\x1f\xf7"
- "\x19\x13\xd6\x80\x2a\xa7\x9d\xae\x82\x03\x66\x4c\x03\x6e\x4b\xbe"
- "\x13\xe7\x12\xa5\x59\xc1\x7f\x51\x53\xdd\x45\x1c\x47\xbb\xeb\x5c"
- "\x17\xc6\xde\x05\x07\x28\x4f\x93\x09\xf2\xca\x33\xb7\x11\x75\x17"
- "\x70\x47\xda\x0a\x72\x53\x21\xf0\x61\x57\xbe\x79\xef\x59\x55\x74"
- "\xce\x83\x69\x3c\x85\x23\x0b\xd7\x86\xe4\x81\x77\x81\xcf\x05\xfd"
- "\xa2\xce\xf0\xf9\x60\xed\x33\x07\xa1\xbc\x1f\xbf\x74\x2c\xd1\x49"
- "\xb2\x92\x7b\xeb\x97\xcf\x4a\xd0\xbb\xf2\xfa\xb7\x13\xdc\xeb\x70"
- "\x4d\x0b\xea\x75\x0f\xb1\x34\xbb\xed\x84\x17\x79\x1a\x75\x81\x76"
- "\x81\x36\xb2\x59\xc6\xcf\xc0\xfd\xba\x12\x71\xef\x0f\x97\x11\xf8"
- "\x19\xd7\x8a\x07\x5d\xe2\x9e\x20\x5e\xed\x63\x35\xd8\xc7\x2a\x61"
- "\x5f\xa6\x08\x90\xc7\x9e\xae\x0e\xa6\x43\xd4\x99\xc5\x59\x2d\xe8"
- "\xaf\x50\xf4\x07\x4c\xee\xe6\xd5\x94\x26\x40\x4c\x77\x8b\x83\x2f"
- "\x38\xb0\x87\x76\x24\x8f\xc4\xbd\xb9\xca\xce\x03\x9e\x92\x20\x86"
- "\xfa\x0a\xfc\x45\x2a\xe0\xeb\x3c\x89\x2a\x4b\x85\xb8\xa8\x03\xf7"
- "\x57\x83\xfa\xbc\xc4\xf6\xa5\xe5\x37\x8c\xd7\xc0\x39\x61\xad\x4b"
- "\x5e\x5a\xeb\xb2\xdd\x80\x63\x1b\xee\xf1\xa6\x25\x06\xce\x7d\xcf"
- "\x4e\xb3\x4b\x73\x8b\x43\x78\x37\x55\x75\xd7\xfd\xec\xf9\x73\x63"
- "\x0e\xca\xb5\x55\x75\x57\x3a\x1b\x03\xfe\x2c\x2f\x2d\x13\xe7\x0c"
- "\xdd\x75\x1b\xcd\xfd\x22\x3b\x0d\xf7\xd8\x96\xce\x65\x41\x5d\x8d"
- "\x07\x9d\x77\x64\x93\x6c\x57\x7e\x54\x04\xee\xbd\x8e\xeb\x86\x05"
- "\x86\xc5\xbb\x62\xb1\x2c\x57\x4e\xe7\x21\x90\x53\x2c\x9f\xdb\x59"
- "\x03\x9c\x12\x4d\x5f\x80\xb6\x2e\x82\xb6\x9e\x05\xb9\x9e\x85\xb6"
- "\xae\x14\xdb\x2a\xee\x39\xc7\x83\xfc\xe1\x9c\x77\xff\x28\xb5\xf5"
- "\x05\x90\x77\xce\x27\x09\x6b\xcf\x91\xef\x51\x88\xc9\x6b\x5b\x85"
- "\xf7\x82\x3a\x2c\xce\xd3\x04\xef\x2b\xf8\xef\xbc\x8d\x31\xb3\x01"
- "\x8f\x28\x73\x88\x19\x76\xd0\xd0\xfd\x85\x92\x1e\xb0\x3e\xb4\x3b"
- "\x79\x64\x69\x2a\xd4\x07\x65\x7f\x9e\x8c\x43\x7b\x06\xd9\x47\x95"
- "\xa2\xfc\x95\xfb\x3e\x87\x0b\x3a\xb8\x0a\x74\x90\x2a\xea\x20\x5f"
- "\xd4\x01\xc4\xcc\xe0\x8b\x71\xac\x27\xa2\xd4\xc8\x74\x10\x98\x8c"
- "\x7e\x92\x34\xc8\xf6\x7a\xc8\xb7\xbd\x4e\x7c\xb3\x8b\xf5\xa5\x55"
- "\xb8\xe6\x26\x0d\x3d\x38\x8c\xef\x06\xbb\x2d\x10\xed\x96\x26\xff"
- "\x4c\xb2\xd9\x33\xaa\x09\x93\xfd\xb3\xd9\xbb\xc7\x7f\x47\x6d\x36"
- "\xfc\xd2\xda\xec\xdd\x17\x94\x36\x3b\xd1\xa0\xb4\xd9\xbb\x4f\xbb"
- "\x6d\x56\x3c\x37\x28\x36\x7b\xb7\xfd\x9b\xb1\xd9\xbb\xed\x5e\x6c"
- "\x76\xa7\x1f\x36\x1b\xe1\xc3\x66\x23\x2e\x9d\xcd\xfe\x34\xe2\xf2"
- "\xf9\xd8\x7b\x9f\xe8\xe2\xbc\xf8\xd8\xd5\x32\x1f\xab\x45\x1f\xfb"
- "\xd3\x56\x6f\xf6\xda\x5d\x0c\xf6\xaa\x11\xed\xf5\xc9\x4a\x28\x2f"
- "\xe6\xf3\xa3\x8d\xfd\xdb\xab\xb3\xd8\x1d\x3f\xf9\xb4\xd9\x64\xb4"
- "\xd9\x72\x62\xb1\x0a\x36\x3b\x4f\xb2\xd9\x62\xb1\x3f\xd4\x87\xdd"
- "\x86\xfb\xb2\x5b\xdc\x87\x0b\xf7\xe0\xea\xd3\x6e\xc5\x78\xa9\x7b"
- "\x0c\xda\xad\xf9\x0a\xf3\xb5\xf7\xec\x56\xda\xed\x3d\x56\xa5\xdd"
- "\xde\xf3\x1b\xb7\xdd\x8a\xe7\x06\xc5\x6e\xef\xd9\xf5\xcd\xd8\xed"
- "\x3d\xbb\xbe\x3d\xbe\xf6\x5e\x9f\x63\x29\x83\xef\x6b\x7f\x76\x9d"
- "\x60\xb7\xbe\x7c\x6d\x96\xe8\x6b\xb5\xe8\x6b\xff\xfb\x1d\xff\x6c"
- "\x77\xd2\x9b\xdf\x71\xdb\xbd\xc4\x3e\x77\xf2\x42\xa5\xed\x4e\x2e"
- "\x56\xda\xee\xe4\xc7\xdc\xb6\x2b\x9e\x1b\x14\xdb\x9d\x9c\xfc\xcd"
- "\xd8\xee\xe4\xe4\x6f\x8f\xcf\xfd\x99\xcf\xfd\x8b\xf5\x63\x49\x76"
- "\x93\xea\x67\x9f\x5b\x8a\x85\x39\x80\xd9\x16\xe7\xbd\x84\xcd\x55"
- "\xb9\x4f\x6b\x89\x88\x21\x7c\xae\x3d\x1b\xf7\x94\xc0\x39\x33\x5b"
- "\x64\x73\x52\xd8\x1c\x8a\xfb\xc6\x4b\x73\x6a\xca\xc4\x7d\x27\xfa"
- "\x9a\x53\x43\x73\xec\xe1\xe2\x75\xc9\x0c\x1b\xf6\x08\xe9\xb7\xb0"
- "\xe6\x95\xea\xbe\x14\xba\xc9\xae\xb3\x8d\xb0\xeb\x7c\x3d\x2f\x0a"
- "\x5d\x47\x29\xee\xd7\xd4\x3e\x76\x0b\x69\xcf\x25\xa4\x50\x78\x16"
- "\x73\xdf\x4e\x68\xa3\xb0\xcf\x48\x7b\xe8\x44\x6b\xbb\x71\x16\x81"
- "\x34\x93\x94\x26\xec\x7d\x6d\x1c\x46\x79\x38\x47\x0b\x36\xd4\x94"
- "\x65\x92\x10\x5c\x47\xf4\x8e\x8b\x88\xc5\xfb\xaa\x81\x23\xc2\x71"
- "\xcf\x27\xdc\x67\x83\x7e\xff\x46\x7b\x69\x1b\x51\xd7\xad\x17\xc6"
- "\x9f\x71\x2e\xce\x8e\x02\xc4\xff\xb0\xdb\x8b\x28\xa7\x26\x7c\x89"
- "\xb1\x81\x6a\xcd\x26\x61\xee\x2f\x60\x45\x9a\x9f\x83\xfb\xa5\xf1"
- "\x63\x8c\x19\xd2\x3a\x96\x14\xea\xf7\x41\xa6\x8d\xc3\x3d\xca\x4b"
- "\x97\x11\x1d\x1c\x1a\x9a\x6f\x36\x75\x6c\x88\x9d\x25\x8d\x27\xfa"
- "\x9c\xc7\x8d\xfb\xf7\xde\x18\xa1\x16\xe7\x02\xe1\xfb\xb8\xc2\x3b"
- "\x0d\x9b\x39\x3e\xc7\x05\xe9\xd4\x98\x25\xec\xbb\x15\x06\xb2\xc0"
- "\xb9\xb7\xb8\x1f\x12\x5f\xba\x85\xbc\x3c\x9a\x90\x77\x57\xb5\x70"
- "\x38\x17\xc4\xf5\x3f\x37\xda\xcd\x99\x77\xe1\x7a\x15\xc2\x5a\xe7"
- "\x67\x54\xf7\xcf\x88\xfb\x82\xed\xd5\x0b\xdf\x9f\xc0\x67\x30\x33"
- "\xe0\x37\xce\x0f\xe0\xdb\x23\xd4\x98\x17\xd2\x87\x9b\x57\xfc\x93"
- "\x84\xa5\x09\xf3\xe3\x43\x58\xde\xd8\x93\x98\xd7\xaa\xba\x5f\x58"
- "\xe3\x0c\x7e\xb7\xe0\x73\x03\x9c\x43\x8f\xf3\x9d\x68\xb1\xb1\x41"
- "\xe0\x87\x3c\xb3\x09\xda\xdf\x20\xcc\x5b\x85\x76\x6e\x86\x36\x43"
- "\x1e\x0d\xce\xed\x11\x3e\x33\x89\x6e\x2b\xa4\x61\x39\xf0\xa9\x31"
- "\xa7\xe2\x5c\x95\xd8\x43\x58\xb6\xcf\xf7\x03\x34\x66\x13\x35\xaa"
- "\x09\x7b\xc7\x47\x75\xbc\x49\x75\xbf\x23\x4c\x45\x29\xdc\x33\xe3"
- "\x65\x1c\xe7\xc6\x39\xd9\xc2\x3c\xf3\xfb\x8f\x43\xf9\xea\x32\x61"
- "\x1c\xf7\xfe\x3d\x56\x55\x6c\xcf\x9a\xc0\xec\x99\xd3\x14\x5c\x6b"
- "\x57\x85\xd7\x88\xf9\x77\xb0\xf9\xcf\x66\x93\x3e\x73\x18\x85\xdf"
- "\x5f\xb3\x79\xdb\x21\x89\x70\xbd\xcd\x3d\x5f\x4d\xb8\x0e\xb0\x34"
- "\x45\x0d\x3a\x13\xf6\xc9\xc1\xdf\x3e\xe7\x44\x8b\x7a\xab\x85\x08"
- "\xb7\x97\xee\x24\x8c\x00\x2e\x24\x8c\x60\x7d\xdf\xcb\xb4\x72\xec"
- "\x19\xc7\x14\xe1\x3d\xe7\x02\xd0\xa1\xeb\x8d\x08\xb5\xb0\x5e\x78"
- "\x37\xea\x05\xe7\xd6\x3f\xf0\x30\xea\x65\x33\xf8\x02\x31\x6f\x8a"
- "\xbb\xfe\xf8\xfb\x01\x41\x9f\x3c\xe8\x82\xcd\xf1\x7f\x60\x8c\xb0"
- "\xf7\x0c\x70\x06\xce\x2f\x3f\x94\x41\xf0\x79\x71\x03\x05\x8c\xbc"
- "\xbb\xcc\xc1\x95\xae\x60\xe9\x1f\xb4\x39\x38\x9c\x4b\x82\xe3\xe1"
- "\xf9\x8b\x88\x30\xae\x8e\x65\xd2\x48\x63\xc6\x9d\x92\x1e\x57\x81"
- "\xee\x56\x00\x76\x41\xe6\x9b\x41\x7e\xa5\x5d\xc2\x33\xab\x8c\x52"
- "\x9e\x68\x78\xc8\x67\x55\x3d\x90\x00\xe5\xe9\x4a\xae\xa7\x36\x9c"
- "\xd3\x0d\x32\x4c\xef\xd8\xf0\xc0\x04\x49\x86\x58\x27\x9c\x93\x9d"
- "\x2f\xcc\xcd\x9f\xb2\x87\x61\x68\x4a\xb6\xd4\x66\x5f\xf2\xcc\x7f"
- "\x97\x44\xe6\xdf\x41\x62\x78\xcd\x58\x03\x1d\x76\xe3\x0e\x1c\x6f"
- "\x9e\xd9\x4a\x08\xae\x8f\x1f\xf7\xca\xa7\xd4\x62\x73\x11\x5e\x3b"
- "\xd6\x80\xcf\x27\x5c\x2f\xdf\x3e\x2a\xee\x25\x90\x17\xf8\xfb\x2c"
- "\x07\xd1\x59\x32\x6d\x6c\x8f\x34\xf2\x35\x71\x2d\x07\x0e\x07\x5e"
- "\x07\x9f\xaa\xce\xfa\x9a\xe0\xfe\xa5\x70\xdd\xfe\x88\x33\xaa\xa9"
- "\x23\x66\xa7\x93\xec\xc0\x78\xf4\x01\xb6\xf6\x0d\xc4\x17\xc0\xf9"
- "\x1c\xce\xc5\xb3\xd8\x20\x3e\xc9\xdf\x1f\xd8\x7e\xce\xaa\xa9\x91"
- "\xbe\x38\x12\xdb\xcd\xe3\x38\xb4\xd8\xe6\x38\x6c\xb3\xdd\x41\x70"
- "\x2c\x7f\xe6\x52\x5c\x87\xf4\x02\xe1\xf3\xc7\x1a\xb0\xcd\x10\xeb"
- "\x14\x05\x3e\xa6\x3f\xb5\xa8\xaf\x7b\x53\x90\x37\xff\xf2\x8d\x3b"
- "\x78\x8d\xb9\x08\xef\x8d\x75\xc0\x77\x73\x66\x42\x8f\x1a\xe5\x8e"
- "\xf2\xb7\x38\x5c\xb8\x3f\xa7\xac\x0e\xce\x00\xeb\xf0\xa0\xef\xf6"
- "\xdf\x41\x22\xf3\xde\x65\x7a\x77\xbd\x2c\xca\x20\x19\x9f\x93\x99"
- "\x8b\x70\x7d\xfc\x99\x58\x07\xdb\x39\x32\xe3\x1c\x11\xf4\x6f\x31"
- "\xb4\x12\xd7\xb0\xdb\x47\xe1\xdc\x0b\xd4\x7f\xa6\x13\xf4\x7f\xd1"
- "\x81\x6b\x87\xd8\x2c\xd9\x9d\x04\xe3\x17\x67\xbb\x81\xeb\xad\xff"
- "\x87\x46\xcc\xce\x08\x54\xff\x0f\x0e\x92\xfe\x1f\xba\x02\xda\xff"
- "\xf3\x20\xda\xff\xd0\x20\xb5\xff\xe7\x57\x40\xfb\xa7\x05\xd1\xfe"
- "\x9f\x0f\x52\xfb\xa7\xf9\x6c\xff\x03\x37\xf0\x54\x98\x93\x13\xba"
- "\x2f\x1b\x7d\x00\xf3\x57\x0f\xab\x70\xfe\x8d\xf0\x2e\x96\xf8\x9b"
- "\xb0\x77\xb3\x42\x3c\x7e\x6b\x3c\x7e\xeb\x3c\x7e\x87\x7b\xfc\x8e"
- "\xf0\xf8\x1d\x29\xfd\x06\x3f\x32\xfc\xbc\x6a\xda\x52\x88\x4b\xb3"
- "\xad\xaa\x87\x35\xe2\xf9\x28\x5c\x5b\x07\x7c\x7a\x94\xaf\x7d\xfa"
- "\xb4\x2a\x42\xbb\x39\x4a\x84\xfd\xf3\x54\x0f\x67\x77\x19\x09\xa5"
- "\xc3\x46\x1b\x70\x8f\x33\x3e\x6f\xe3\xd4\x99\xc0\xd3\x16\x9b\x03"
- "\xe2\xfc\x88\xab\xa0\xec\xef\xe3\xde\x8d\xa8\x57\xfd\x32\x9c\x5f"
- "\xf3\xf0\x62\x6c\xe7\x1d\x69\x66\xc2\x0f\xbb\x5d\x98\xdf\xc0\xe7"
- "\x6f\x9c\x6a\x1b\x76\xfb\x68\xba\xed\xa0\x3e\xdf\xc8\x87\x58\x5a"
- "\x4f\x92\x02\x8e\xd7\xaf\x59\x03\xfa\x6d\xdd\x4b\x56\xb7\xd2\x96"
- "\x35\x4e\xea\xb0\xcc\x31\x93\x2c\x1b\xee\x7d\x52\x4d\xea\x6c\x27"
- "\x85\xfd\x4f\x84\x7d\x5e\x6c\x7b\x09\xc6\x3f\x59\x98\x07\xd2\xea"
- "\x6c\xbb\x48\x2d\xfc\x36\xa7\x7e\x0e\xed\x7c\x64\x8c\xa5\x75\x17"
- "\xf4\x97\x36\xc6\xf2\x9a\x8d\x51\x54\xb3\xd1\x50\xdb\x8a\xfb\xbb"
- "\x6e\x1c\x87\x75\xad\x83\x7a\x58\x9c\x26\xec\x67\x8d\x13\xca\xb5"
- "\xd7\x0b\x7d\x52\x7c\x6e\xcb\x6b\x21\xbf\x76\xa3\x01\xeb\x87\x75"
- "\xf3\xfe\x1c\x76\xdf\x5e\xa8\xfb\xbd\xb3\x0d\x6a\x82\xef\x4f\x04"
- "\x86\x91\x47\x62\x7d\xc6\xd1\x79\xa6\x09\xac\xdc\x90\x60\xca\xf5"
- "\xc9\xff\x50\xae\x58\x5f\x5d\x30\xe5\xda\x7c\x97\x5b\x21\xd6\x57"
- "\x1f\x44\xb9\x8f\x4e\xeb\xa3\x5c\xb1\xbe\xb1\xc1\x94\xbb\xc3\x77"
- "\xb9\x95\x62\x7d\xb3\x83\x29\xd7\xe1\xbb\xdc\x7d\x7b\x83\xc3\xc2"
- "\x74\x9f\xeb\x3f\x20\x16\x82\xc3\xc1\xf4\x3e\xda\x6f\xda\x1b\x1c"
- "\x06\xa6\xdb\xfb\xc2\x40\x70\xfa\x9f\xd1\xa7\xfe\x83\xd3\xfd\x8c"
- "\xe2\xbe\x74\x1f\x9c\xde\x67\xf8\xc4\x3f\xf6\x0d\x40\xf7\x69\x34"
- "\xf4\xa0\x8e\x2f\xd8\x98\xc6\x87\xee\x5b\xf6\x32\x1f\x4b\x1e\x58"
- "\x4b\x48\x58\x11\xb9\xf6\x81\x92\x4f\x69\xac\xd0\xe7\x9e\x99\xb3"
- "\xb6\x98\x70\xd0\x87\xe6\x76\xaf\x6a\xe0\x2c\xce\x18\xe4\x2d\xd7"
- "\xce\x15\x0e\xd5\x2d\x90\x7e\x00\xfc\xa0\x1d\x62\x59\x56\xd6\xc6"
- "\xb4\x82\xcc\x58\x22\xbc\x5b\x07\xfd\x88\x99\x4b\x3f\xa5\xb8\x2e"
- "\x61\xdc\xd7\xc0\xaf\x45\xb8\xce\x21\xb9\x16\xae\x75\x02\x8e\xa1"
- "\x1c\x07\x79\x8f\xb7\xa9\x66\xda\x84\xbc\x36\x61\xbe\x7b\xc1\xbe"
- "\x65\xd8\x57\xa0\x59\x06\x5c\xb3\xcc\x06\xf7\xee\x1c\x66\x23\x5c"
- "\x29\xee\xbb\xb3\x61\xa6\xdd\xaa\x8a\x93\xde\x4f\x6d\x15\xd6\xd6"
- "\x83\xba\xe3\xda\x7a\x2f\x43\xbf\x01\xf3\xdf\x91\x46\x38\x5c\xff"
- "\xb8\x63\x43\x9c\x1e\xd7\xdb\xeb\xeb\x3d\x6f\x57\x9e\x39\x1e\xaf"
- "\xa7\x79\xe0\x9f\xcf\x11\xae\xce\x6e\x23\xd0\xc7\xa8\x2f\x80\xfe"
- "\xc9\x83\xb7\xe1\x78\x4a\x1b\xc9\x5c\x4b\x79\x1c\xdb\xa2\x9a\xfd"
- "\x21\x38\xff\x50\x58\x0b\x5e\x15\x57\x85\x7d\x7d\x71\xbf\xa5\xd1"
- "\x67\xe1\xb7\xd0\x47\xc2\x79\x38\x9a\x0d\x0e\x5a\xa0\x8d\xad\xb3"
- "\xb7\x09\x7b\x7d\x34\xa9\xe2\xde\xc7\x75\xcf\xda\x35\xe6\x59\x76"
- "\x8d\x39\x01\xea\x65\x92\xda\x80\xf7\x97\xd2\xb1\x4f\x88\xf9\xe0"
- "\x7c\x83\xf4\xde\xb7\x8f\x3d\x89\x47\xc5\x45\x50\x1b\xca\x97\xd5"
- "\xe5\xb1\xc9\xa8\x03\x88\x43\xa6\xd9\xb3\x0c\x63\xd9\x18\xc9\xac"
- "\x24\xec\x6b\x43\xbd\xd9\xfb\x9a\xf9\x1b\x27\x08\xef\xf8\x83\x3f"
- "\x98\x6d\xe0\x02\x8c\x89\x67\x45\x63\xdb\xcc\x63\xd1\xff\x3e\x76"
- "\x2b\x94\xff\xdf\x4d\xaa\x59\xec\xdd\xcd\xbc\x8d\xd3\xd8\xbb\x9b"
- "\xb3\xa2\xe0\x1e\xd3\x68\xde\x06\x1b\xe6\x83\xf3\xe5\xe2\xf9\x59"
- "\xb2\xf3\xb3\x70\x3e\xaa\x78\xbe\x5a\x3c\x1f\x2f\x3b\x1f\x9f\x36"
- "\x16\xc7\x3d\x66\xd9\xb0\x0d\xe0\xf3\xa2\xe1\xfc\x54\x61\x7d\x04"
- "\x61\x2f\xc8\x8d\xd1\x62\xbe\xa9\xad\xaa\xc7\x46\xb4\x03\xc6\xe0"
- "\xfc\x74\xd9\xf5\xd3\x3f\xca\x88\x26\x0f\x94\xa0\x0c\x1f\x8b\xb4"
- "\x72\x1f\x4e\x63\x7d\xe5\x59\x82\xbf\x46\x1f\x2a\x2f\x0f\xd2\x5b"
- "\xd0\x4f\xda\x21\x46\x83\xef\x3a\xbc\xa7\x5c\xde\xd2\x1b\xa4\xfa"
- "\xa4\xc5\xf3\xf4\xf3\x97\xbc\x98\x8a\x6f\x00\x2a\xdf\x6d\xd3\xe1"
- "\x3b\xb2\x7c\x5e\x55\x8c\xa5\x08\xdf\xd9\xd3\x09\xef\x87\x6f\xc5"
- "\x39\x5a\xa1\x07\xd2\x5c\x05\x07\x08\x1f\xba\x5f\x6f\x5e\x35\x85"
- "\x9c\x57\x3d\x26\x3c\x3f\xb0\xe8\x09\xc9\x83\xf3\xe6\x55\x47\x31"
- "\xed\x80\x90\x96\xc4\xde\x5b\xd7\xaf\x0a\x21\x87\xf4\x6d\xc2\x98"
- "\x02\x9c\xeb\x14\xc6\x4f\x2e\x10\xce\x69\x0c\x21\x7f\xce\xac\xe7"
- "\xaa\x78\x2b\xf7\x67\xbe\x41\x98\x0b\xfd\x51\x44\x35\xb9\x33\x23"
- "\x04\xf7\x92\xe3\x3e\x84\x7e\x3a\x9e\xc7\x73\xd2\x3b\x44\xe7\x55"
- "\xbf\x78\x58\x98\x17\x7d\x33\xfb\x9e\x55\x44\x3f\xfb\x28\xc2\x26"
- "\xbe\x3b\xfe\x58\x09\xd6\x15\xe7\x39\x82\x1c\xdf\xc4\xfa\x59\x55"
- "\x8f\xed\x18\x56\x2c\xcc\x0f\xd7\x40\xfe\x7c\x3e\xbf\x2a\x06\xb9"
- "\xc1\xb9\xe1\xb1\x78\x6a\xd4\xec\xc4\xf7\x07\x8b\x5f\x93\xde\x95"
- "\xfd\x45\x86\xec\x7d\x3a\x4d\x3b\x47\xee\x83\xb4\x3c\x69\x6d\x0c"
- "\xdc\xa3\xc8\x17\xd7\x38\x20\x7e\xec\x8c\x34\x26\xf0\x9a\x2a\xd0"
- "\x45\x55\x4c\xf5\x54\x82\x63\x3a\x2a\x9c\x97\xdc\xaa\x8a\x5f\x4f"
- "\xb5\x55\x86\x4c\xb4\xe9\x82\xfd\xfa\xdf\xe3\x9c\x43\x90\xe3\x2e"
- "\x9c\x63\x08\xb2\x7c\x07\x7e\x1f\x9d\x56\x4e\xf4\xbf\xc0\x78\xec"
- "\x17\xae\x47\x93\xa8\xf3\xf6\x59\x66\x52\xd3\xfc\x27\x72\xec\x64"
- "\x35\xd1\xcc\x21\xc3\xb2\xac\xd4\x25\xb4\x31\x9d\x70\x71\x56\x32"
- "\x0c\xd7\x6d\xc2\xb5\xda\xf1\x1d\x8d\x3a\x47\x2d\xc4\x48\x5b\xa2"
- "\x76\x67\xb6\x0c\xd7\xcf\x24\x10\x5b\xb1\xe7\xd7\xc2\xfb\x47\x36"
- "\xe1\xfd\x6f\x2d\x8e\xa5\xcb\xde\x3b\xda\xba\x26\x91\xf2\x6b\xcf"
- "\x91\x90\xda\xe4\xd3\x24\x2e\x71\x18\x15\xde\x3b\xca\x80\x8c\x36"
- "\xd0\xfd\x4a\x36\x4f\x70\xdb\x45\x12\x5e\x97\x6e\x25\x96\xd6\x6a"
- "\xf2\xc6\x32\x12\x4e\x3b\x92\x47\xd4\x54\x1f\x25\xb4\xe0\x26\xdb"
- "\x7b\x99\xe6\xe1\x2e\x0d\x9b\xbb\x15\xb6\x4e\x85\x63\xa7\xa1\x79"
- "\x38\x87\xeb\x22\x89\x9e\xfb\x79\xb6\x30\xde\x8b\x63\xeb\xce\x0e"
- "\x83\xbe\xbb\xc3\x70\x73\xd7\x4a\xc3\x58\x69\x4c\xfe\xe9\x73\x3a"
- "\x7c\x06\x91\x40\x37\x4c\xb5\xe2\x3b\x4b\x18\x8b\x3a\xb5\xb7\x38"
- "\x70\xfc\x5d\x58\x87\x66\xa5\x21\x92\x9f\x6f\x20\x77\xda\x84\x77"
- "\xa2\xf0\x99\x80\xae\xf4\x59\xac\x6b\x1b\x11\xe6\x21\x69\xd9\x3c"
- "\x24\x07\x3e\x0f\xd7\x98\xcb\x67\x2c\xd4\x93\xae\x31\xc6\x04\x4b"
- "\xc6\xef\x49\x56\x27\xfd\x4c\xe8\x23\x64\x00\x6e\x37\xfc\x62\x27"
- "\xd5\x9a\xcb\x0f\x1b\x4e\xa1\x6f\x89\x09\x9c\x1f\xe2\x85\x77\xa5"
- "\x51\x36\xa0\xa7\xb4\x5d\x6d\xa8\xb7\xfd\xfa\x3f\x2c\xb3\x71\x8f"
- "\x34\x53\x67\x6d\xd2\xef\xc9\xb1\x86\x7a\x85\x7e\x04\x7d\x42\x3e"
- "\xd4\x13\xea\x08\x75\xe5\xd6\xd3\x29\x41\x4f\xbb\x78\xa6\xa7\x2e"
- "\xcd\xbe\x34\x49\x57\x8e\x62\x63\xb2\x3f\xfa\xaa\x69\xf6\xae\x2f"
- "\x90\x73\x8f\xbe\xb6\xb7\x91\x70\x4b\x2b\xc4\xcd\xa0\xaf\x47\x1e"
- "\x23\xe4\x91\x77\x28\x5f\x3b\xed\x44\x8f\xde\x9c\x79\x3e\xf4\xf6"
- "\x85\x5b\x6f\xa0\xff\x3e\xf4\xf6\x60\x52\x20\x7a\xab\x69\x66\x7a"
- "\x73\x8a\xf3\xc7\x0c\x87\x08\xe7\x58\x69\xe0\x8a\x2e\x92\x18\xd4"
- "\xdf\xf4\xcf\xf5\xe4\x70\x7c\x2d\xe8\xec\x4f\x0a\xfd\xf1\xf9\xe6"
- "\x69\xa0\x83\xe9\xa8\xc3\xe0\xec\xee\x57\x4e\xff\xed\xee\xf1\x17"
- "\x87\xec\x6e\xb0\xec\xee\xf1\xc8\x81\xd9\xdd\xaf\xaa\x87\xec\xee"
- "\x9b\xb6\xbb\x5f\x1d\xf2\xb4\xbb\x9e\xb8\x61\xd9\x82\xc5\xf3\x16"
- "\xa6\x2e\x4c\x7d\x5e\xff\xec\x4b\xe9\x0b\x96\xb3\xe8\x41\x11\x3f"
- "\x44\xb8\x32\x63\x39\xdc\xbb\xbd\xa6\xa8\x9e\xbc\x37\xba\x9e\x73"
- "\xfd\x3b\x42\x4d\xf3\x26\xc6\xf2\x79\x13\xcd\xb8\x8f\x3b\xda\x27"
- "\xee\xef\x7e\x46\xf5\x4c\x36\xae\x69\xc8\xd6\x83\x79\x46\x78\x8e"
- "\x05\x71\x6a\x0b\x3e\x0b\x7a\xb9\x0b\x8e\x55\x44\x1d\xe6\x20\x21"
- "\xe6\xb1\x78\xfe\xe9\xd3\xb8\xfe\x1a\x2d\x31\xb6\x94\xe2\xbe\xeb"
- "\x5d\x44\x6d\xd7\x6c\xb0\xad\x87\xf2\x6c\xda\xaa\x18\xb5\x1e\xdf"
- "\x6d\x79\x72\x12\xf8\xfc\x14\xf7\x3a\x4b\x4f\xef\xa0\x57\x3d\x91"
- "\x87\xdc\x80\xef\x22\x9e\x57\x3d\xb9\xb4\x13\x9f\xa5\x40\x3c\x3d"
- "\xfb\x36\xb8\xd7\x18\x63\xb2\xb0\x86\x04\xf0\x04\x3b\x3f\x47\x78"
- "\xbe\xd6\x99\xb7\x5f\x8f\x31\x47\xbb\xe6\x40\x5a\x7b\xde\x01\x72"
- "\x74\x4d\x91\xc8\x13\x4f\x96\x3c\x52\xc4\x78\xa2\x36\x02\x70\x38"
- "\x1d\x70\x98\xd0\x1f\x4f\xc8\xf0\x37\x36\x30\x9e\x40\xbc\x21\xee"
- "\x10\x73\xd7\x00\xe6\x10\x87\x12\xee\xb6\x88\xb8\x0b\x6b\x24\x3a"
- "\x01\x7b\x4e\x86\x3d\x7c\x67\xbb\x36\xc3\x8d\x3b\x97\x27\xee\x2e"
- "\x7a\xe0\x8e\x13\x71\xb7\x52\x89\xbb\xa7\x4e\xeb\xc8\x1b\x8c\x2f"
- "\xdc\xb8\xcb\xbf\xc5\x21\x61\x0e\xf1\x87\x58\xe3\x9f\x37\x90\xda"
- "\xd6\xb6\x1e\xfc\x95\x3e\xc7\x9e\xe7\x0a\xf3\x85\x39\xba\xa7\x73"
- "\xa5\xc8\x17\xe7\x24\xbe\xd8\xee\xc3\x4f\x9f\x0e\x92\x2f\x9e\x62"
- "\xeb\x9f\x81\xae\xba\x40\x6f\xa8\xaf\x47\x22\x80\x27\x22\xde\x22"
- "\xc7\xe2\xaf\x10\xfd\x2c\x1b\x1c\xfd\xe0\xfe\xd7\x50\x17\x2f\x3a"
- "\x7a\x20\xa5\x3f\x1d\xa1\x7e\x50\x4f\x82\x7e\x40\x4f\xd2\x33\x77"
- "\x7c\x06\x8b\xba\x42\xfd\xdc\xb1\x86\x70\xa8\xaf\xd2\x15\x8c\x23"
- "\x90\x0b\x84\x39\xde\x1e\x1c\x0f\x32\xb7\xa3\xce\x84\x7e\xb6\x51"
- "\x9b\xb2\x75\x94\x7b\xbf\x9c\x8e\x0d\x4f\x9b\x7b\xc7\xd1\x4f\x9f"
- "\x74\xaf\x31\xf7\xa4\x30\xbe\x60\x1e\x8d\xeb\x83\x3f\xc9\xd6\x3b"
- "\xc9\xdb\xdf\xc2\x62\xf8\xb9\x3f\x16\x39\xa0\x1e\xfb\xae\x42\x3f"
- "\xd5\x05\xfd\x54\x0d\xf4\x53\xf3\xa0\x9f\x8a\xe3\x88\xc2\x5a\x0c"
- "\xcf\x8c\x67\xcf\xf8\xa0\x5f\xaa\xdd\x1f\x42\xf3\x37\x38\x50\xae"
- "\xc2\xf3\x64\xad\x19\xf7\x72\x69\xa5\xf9\xd0\x07\x7e\x8b\x23\xf0"
- "\x3b\xe1\xb0\xc1\x15\x20\xa6\x9e\x11\xf7\x53\xb3\xeb\xd8\x3a\x85"
- "\x73\x23\x59\xfd\x9e\x10\xe6\x39\x0a\xcf\x1a\x39\x7e\x87\xeb\x65"
- "\xe5\xb3\x46\xf9\xb3\xe8\xf7\x32\x6d\xe2\x73\xc6\x67\x7a\xd6\x41"
- "\x40\x1e\xdc\x0d\x7d\x1a\xf7\xb3\xc6\x13\xd8\xe6\xe1\xca\x67\x8d"
- "\xcf\x08\x6b\xf3\x59\x55\x73\xa3\x71\x7e\x0d\xfc\x6e\x65\xe9\x4f"
- "\xd8\xe5\xe9\xee\x67\xf9\x2c\x1d\xdf\xe9\x12\xc7\x0a\x5a\xd9\x38"
- "\xc1\xdc\x69\x52\x7f\xdc\x47\xfc\x14\x00\x4f\x27\x4d\x72\xf3\x74"
- "\x12\xdb\xb7\x21\xe2\x60\x44\x6d\x2f\x9e\xc6\x35\xbe\xe6\x6f\x9b"
- "\x89\x3c\x9d\xb7\x5f\x27\xea\xf4\x14\xc8\x64\x18\xee\x79\x87\xe9"
- "\xf8\xee\x13\xf2\x75\x09\x5c\x57\x22\x70\xf8\xc1\x90\xf5\xc2\x9c"
- "\x82\xb9\x0e\x25\x77\xcf\x9f\xa3\xe4\xee\xc4\xf1\x7d\x73\xf7\xbc"
- "\x2f\xfa\xe6\xee\xc4\x27\x86\xb8\x7b\xb0\xb9\x5b\x8a\xf5\x82\xe5"
- "\xee\x79\x7b\x87\xb8\xfb\x72\x73\xf7\xbc\x3d\x32\xee\xfe\x95\x92"
- "\xbb\xe7\xaf\xe9\xcd\xdd\xf3\x0b\xdd\xdc\x9d\xa8\x76\x73\xf7\xdc"
- "\x2a\x25\x77\x27\x9d\xf3\x8f\xbb\xe7\x7f\x71\x69\xb9\x3b\x29\x44"
- "\xc9\xdd\x49\xe2\xba\xa4\x73\x4b\x02\xe7\xee\xa4\x8a\xbe\xb9\x3b"
- "\xe9\x80\x92\xbb\x93\xb6\x32\x8e\x4e\x6a\x65\xdc\x9d\x54\xce\xd2"
- "\xe7\x16\xcb\xd3\xdd\xdc\xcd\xd2\x7b\x73\xf7\x02\x75\x3f\xdc\x6d"
- "\x70\xf1\x12\x77\x37\x00\x77\x37\x70\xfc\xf3\xbe\xb8\x7b\x51\x52"
- "\x2d\x72\xf7\x32\xe4\xee\x45\x49\x7d\x73\xf7\xa2\xc7\x90\xa3\x01"
- "\xc7\xa4\xf8\x75\xda\x82\x6b\x56\x9a\x9f\xfb\x27\x8e\x61\x37\x23"
- "\x6e\xcf\xa8\x16\xbe\x33\x73\x8d\x9c\xdb\x17\xfc\xb1\x87\xdb\x21"
- "\x9d\xbf\x41\xc9\xed\xc8\xeb\xc8\xef\x25\xaf\x53\x6b\xe9\xeb\xb8"
- "\x87\xc9\x82\x46\x89\xe3\xf3\x21\x0d\xf7\x29\xc1\x35\x95\x4a\x2e"
- "\x0a\x87\x1a\x64\xd0\xfc\x32\xdc\x17\xaf\xe9\xd8\xf0\x5c\x88\xd2"
- "\x1f\x2c\x4c\x71\x6e\x90\xfb\x83\xe7\x26\xa3\x3f\xc8\x63\xeb\x00"
- "\x08\x7e\xc0\x59\x62\x4c\x46\xdf\xc0\xce\x3f\xdf\xd9\xb7\x3f\x78"
- "\x6e\xe1\x37\xe5\x0f\x90\x6b\xae\x91\xf5\x21\x7d\xf9\x03\x1c\x53"
- "\xad\x4d\xba\x3c\xfe\x00\x79\x06\xf9\x05\xb9\x06\x79\x07\x79\x06"
- "\x39\xc7\x29\xbe\xfb\x57\x6c\xf4\xc3\x1f\x00\xaf\xd0\xab\x1e\x8f"
- "\x14\xfc\x81\x2a\x18\x7f\xf0\xfc\xa1\x6f\x95\x3f\x40\xfd\xac\xb9"
- "\xb4\xfe\x40\xea\xe7\xa3\x7e\x50\x57\x92\x8e\xa4\xbe\x3e\xea\x07"
- "\xf5\x84\xfa\xc1\xd8\x48\xf2\x07\xe3\x33\x98\x3f\x28\xe9\xd7\x1f"
- "\x3c\x6f\xee\xf1\x07\x1c\xf3\x07\xc2\x98\xf8\x28\xf4\x07\x0b\xf3"
- "\x7a\xfb\x83\x85\x3b\xdc\xfe\xe0\xb9\x70\x91\x1f\x9b\x71\x7d\x0b"
- "\xe0\x83\x22\xa5\x4f\x78\xe1\x3a\xff\x7c\xc2\x42\x57\x2f\x9f\x00"
- "\xb2\xcd\x63\xcf\xce\xd0\x1f\xcc\x42\x7f\xe0\x44\xbf\x10\x94\x4f"
- "\x58\x14\xe9\xf6\x5b\x0b\x32\x18\x17\x2f\x34\x29\xfd\xc4\x0b\xe2"
- "\x73\x84\x05\x4f\xc8\xfd\x04\x3f\xcc\x1f\x3f\xb1\x48\xda\xe7\xc8"
- "\x8e\x3c\xbc\x1b\x9f\x59\xf4\xf8\x09\x81\x57\xbf\x30\xaf\x68\x92"
- "\xf9\x89\x45\x55\xac\x0e\x2f\x84\xbb\x04\x3f\xb1\xa8\x9e\xa5\x2f"
- "\x48\x90\xa7\xbb\xfd\x04\x4b\x77\xc9\xfd\x44\x0b\xfa\x89\x17\xc6"
- "\xf5\xe3\x27\x26\xf8\xef\x27\x96\xaa\xdd\x7e\x62\xa9\xba\x6f\x3f"
- "\x91\xf6\x35\xfa\x09\x61\x4d\x5e\xd0\x3d\xe0\x5c\x5d\x70\x3d\xf3"
- "\x11\x38\x46\x03\xbe\xc3\x8a\xeb\xaa\x40\xbe\xd3\x65\xe8\x47\xe0"
- "\x80\xf3\x2d\x79\xf8\x9d\x17\xae\x69\x0c\xb3\x91\x10\xf4\x19\x79"
- "\x67\x88\x1a\xf7\x87\x62\x72\x4a\xbb\x07\xae\x6d\x70\xfb\x97\x94"
- "\x6b\xfd\xf4\x2f\x27\xc1\xbf\xd4\x77\x6c\x48\x99\x24\xf3\x2f\xb8"
- "\xc7\x56\xbd\x87\x7f\xb1\x82\x7f\x69\x96\xae\x81\xfc\x29\xf2\xfc"
- "\x58\x3f\x21\xff\x19\xe1\xc0\xfc\x0d\x2f\xe3\x7e\x71\x82\x3f\x4a"
- "\x29\x52\xfa\xa3\x25\x4e\x5e\xd1\x3f\x49\xa9\x95\xfc\x11\xfa\x73"
- "\xbe\x97\x3f\x4a\xdd\xd4\xe3\x8f\xae\x97\xf9\xa3\x0c\xc9\x1f\xa5"
- "\x74\x5e\xf1\xfd\x93\x01\xf0\xdd\xa5\xf6\x47\x3c\xf8\x1d\x4f\x7f"
- "\x84\x3e\x4a\xea\x9f\xf0\x41\xf9\xa3\xd4\xf8\x6f\x95\x3f\xba\x0c"
- "\xfd\x13\x4f\xdd\x48\x3a\x43\xfd\xa0\x6e\x50\x2f\xb8\x2e\x38\xea"
- "\x0c\xf5\x85\xba\x1a\x9f\xa6\xf4\x45\x82\xbe\xc0\x1f\xf5\x7a\x76"
- "\x00\xba\x02\x99\xcf\x42\x7d\xc9\xfd\x51\xe9\x28\xc9\x1f\xa5\x45"
- "\xf6\xf6\x47\x69\xd1\x6e\x7f\x94\x22\xec\xb7\xcc\xd6\x65\x7c\xc1"
- "\xa1\xf4\x45\x4b\xff\xe2\x9f\x2f\x4a\xdb\xe4\xc5\x17\x09\xeb\x6b"
- "\xe6\xbd\xae\xe8\x9b\xcc\x02\x7f\x14\x84\x2f\x4a\x2b\x67\x75\xc4"
- "\x79\xe6\x2f\x54\x33\xbe\x4f\x9b\xea\xf6\x4f\x2f\xec\x90\xa7\xb9"
- "\xfd\xd3\xd2\x1d\xa2\x4f\x5d\x17\xb8\x7f\x5a\x2a\x5c\x83\x73\xd0"
- "\x77\xb7\x31\x1f\xa0\xf4\x4f\x4b\x37\x29\xfd\xd3\xd2\x39\xac\x0e"
- "\x4b\xf7\x32\xff\xb4\x34\x8d\xa5\xbf\x90\x2d\x4f\x77\xfb\x27\x96"
- "\xde\xdb\x3f\x2d\xad\xe9\xc7\x3f\x69\xba\x8b\x8d\xc9\x5d\x79\x07"
- "\x66\x39\x77\x6e\x21\xe3\xe6\xdc\xe4\xf2\xb4\x27\x66\x47\x2e\xb6"
- "\x57\x91\xf4\xbc\xed\x71\x42\xba\x35\xfb\xd2\x78\xf1\x5d\xed\xae"
- "\x48\x63\xc2\x99\x14\xb0\xa9\x56\xdf\x36\x05\xf6\x14\x22\xd9\x53"
- "\x6d\xf2\xe7\x04\x6c\x8c\xc3\xe7\x6d\xdb\xc1\x96\x2c\xf6\x06\xc1"
- "\xb6\x34\xcd\x7a\x82\x6b\x6e\x6a\x5b\x89\x4e\xab\x52\x5d\xf5\x28"
- "\x44\x02\x2e\xb0\xab\x07\x6f\xa3\xfc\xed\x8d\x7a\xa2\x4d\x26\xa1"
- "\x68\x5b\xef\x8a\xcf\x73\x70\x9d\x0d\x7c\x8e\x03\xb8\x8e\x9e\x7b"
- "\x9c\xd9\xd4\x76\x38\xba\x98\x4d\x8d\xed\xea\x30\xdc\xec\xeb\x39"
- "\x8e\x25\xc3\x2a\x3c\xc7\xc1\xf7\xa0\xf0\xfd\x33\x1e\x6d\x08\x9f"
- "\xe3\x38\x58\x6c\x07\xf5\xd5\x95\x09\xcf\x71\x9a\x14\xcf\x71\x7e"
- "\xd4\x48\x38\x5c\x83\xe3\x0d\xf9\x73\x1c\x43\x6d\xaf\xb8\x0e\xed"
- "\x0b\xed\x29\x70\xce\x5b\xee\x73\xfe\x97\x30\x77\x02\x64\xed\xd2"
- "\x1c\x98\x45\xb7\x1f\x8c\xfd\x43\x93\x43\x85\x6b\x9d\xba\x40\x77"
- "\x3c\x70\x1b\xd5\x78\x70\x5b\xb7\xa8\x87\x6e\xa6\x07\xd0\x61\xc8"
- "\x33\x76\x42\xe7\x3a\xc1\x7e\xba\xc5\xf5\x4e\x1d\x56\xc0\xa1\x61"
- "\x54\xc9\x2a\x94\x7b\x04\x29\x11\xd7\x3c\xe5\x57\x27\x8f\xe0\x41"
- "\xd6\xd4\xc8\x91\xdd\x17\x1d\xc2\x73\xcf\xbc\x2e\x32\x0e\xb8\x4c"
- "\x8b\x5c\x06\xd8\x1d\x59\xd6\x05\x72\xff\x8c\xc9\x1d\xd7\xd4\xc3"
- "\x4f\xe7\x6a\x83\x1e\xca\xbe\xb9\xbb\x1b\xb8\xcc\xc1\x64\xff\xcc"
- "\x52\x1d\x11\xd6\x49\xc5\x67\x9f\x10\x37\xd4\x81\xbe\x05\x2e\xb3"
- "\x87\x51\xdc\x3f\x84\xff\xb7\x01\xd7\x17\x8b\xbc\xd3\x8e\x7b\xc5"
- "\x18\x10\x1b\xba\xd2\x33\xf8\xec\xf3\x9f\x8a\x67\x9f\xb6\xd5\xee"
- "\x67\x9f\x75\xe5\xa7\xd8\x5c\x15\xc5\x78\xd8\x52\x6b\x77\x09\xf3"
- "\x39\xc2\x78\x58\x7a\xa0\xb2\x4f\xf7\xb9\xfe\xcf\xa5\x97\xbd\xee"
- "\x5b\x2e\xfb\xe5\x85\x03\x93\xfd\x0a\x9f\xf3\x7f\x2f\xbd\xec\x43"
- "\xbe\xe5\xb2\x7f\x51\x33\x30\xd9\xaf\xec\x6b\x0f\x11\x0d\xf6\x61"
- "\xa4\xfe\x8b\xd4\x77\x41\x1f\xc6\xfc\xf5\xaa\x59\xee\x7e\xcb\xaa"
- "\x59\xd2\x33\x64\x90\x99\x3a\x1f\xd7\x07\x07\x59\xa4\x3d\x87\x7b"
- "\x70\xbc\x74\x58\x7a\x7e\x5c\x88\xfb\xcc\xa0\x1e\xb7\x83\x1e\x53"
- "\xf1\x3d\x26\x51\x87\xe0\x73\xe6\xda\xc1\x2f\x8c\x31\x26\xbb\xf2"
- "\xc1\x27\xbd\xbd\x85\xf8\xd0\x27\x87\xfe\x44\x9b\x4e\x74\xcf\xa4"
- "\xb9\xf5\xca\xaf\x06\x7d\x76\x41\x6c\xe6\x68\x21\xf8\x6e\x72\x58"
- "\x0b\xc4\xad\xdd\xc9\x23\xe6\x40\x1f\x40\xd2\xe9\xbb\x2b\x1c\x42"
- "\x5c\xe6\x55\xa7\xdb\x94\x3a\x6d\xf7\xa2\xd3\xa7\x17\x82\x9d\x72"
- "\x62\xec\x2c\xe8\xd4\xda\xa3\x53\xc1\x8f\xac\x36\x44\xa2\x5e\x25"
- "\x9d\xa2\x1f\x11\x74\xda\xca\xfc\x48\xcf\x3a\x4e\xab\xdd\xb1\x73"
- "\x4d\xe2\x69\x2f\x3a\x5d\x91\xa3\xd0\x69\x62\xa0\x3a\x7d\xa9\x50"
- "\x19\x7f\xad\x72\xf9\x17\x7f\xad\xd2\x62\x7c\x25\x8f\xbf\xf0\x77"
- "\x3b\xc4\x5b\x2e\xad\x39\xde\x1e\x54\xff\x7f\x55\xa4\x32\x96\x5a"
- "\x25\xd6\x29\xe3\x9e\xc0\x63\xa9\x55\xc2\x9e\x44\xbb\xb7\x7b\x8b"
- "\xa3\x56\x1d\x57\xc6\x51\xab\x76\xb2\x78\x69\x95\xb3\xdd\x88\x71"
- "\xd4\x2a\x13\x4b\xcf\x88\x91\xa7\xbb\xe3\x28\x96\xde\x8e\x6b\xdd"
- "\x6d\x58\x1d\x12\x58\xec\xf4\xfd\x6f\x38\x76\x8a\xe8\x23\x76\x8a"
- "\xf8\x8e\xc4\x4e\x6b\x7c\xee\x51\x35\xe4\xbf\xfb\xf3\x21\xab\x23"
- "\x07\xe6\x43\x32\xc9\x90\xff\x0e\x56\xf6\x6b\x6a\x06\x26\xfb\xac"
- "\x35\xc1\xfb\x6f\xa3\xce\xed\xbf\x8d\x3a\xdf\xfe\x7b\xdd\x2b\x43"
- "\xfe\x3b\x10\xff\x9d\x39\x6d\x60\xfe\x7b\xdd\x2c\xa5\xff\x36\xbe"
- "\xef\x9f\xff\x5e\x57\x3b\xf8\xfe\x7b\x5d\xa3\xd2\x7f\x1b\xcb\x59"
- "\x9d\xb2\x3a\x03\xf7\xdf\xc6\x4d\xbe\xfd\xb7\xf1\xd7\x4a\xff\x6d"
- "\x4c\x62\x7e\xda\x58\xc5\xfc\xb7\x31\x83\xa5\x67\x39\xe4\xe9\x6e"
- "\xff\xcd\xd2\x99\xff\x36\x56\x07\xe6\xbf\xc3\xbe\x61\xff\xad\xeb"
- "\xc3\x7f\xeb\xbe\x23\xfe\x7b\xfd\xd4\x21\x1f\x12\xac\x0f\x31\x36"
- "\x0e\xcc\x87\xbc\x62\x0e\xde\x87\xe4\xc4\xbb\x7d\x48\x4e\xbc\x6f"
- "\x1f\xb2\xf1\xc8\x90\x0f\x09\xc4\x87\xac\xcf\x1b\x98\x0f\xd9\xb8"
- "\x55\xe9\x43\x36\xa9\xfc\xf3\x21\x39\xd7\x0e\xbe\x0f\xc9\xd1\x2b"
- "\x7d\x48\x4e\x2b\xab\xd3\x86\xc9\x81\xfb\x90\x9c\x5a\xdf\x3e\x24"
- "\xe7\x94\xd2\x87\xe4\x94\x33\x5f\xb1\x89\x30\x1f\x92\x53\xc5\xd2"
- "\x37\x4c\x92\xa7\xbb\x7d\x08\x4b\x67\x3e\x64\x93\x26\x30\x1f\x72"
- "\xf5\x37\xec\x43\x42\xfa\xf0\x21\x21\xdf\x11\x1f\x92\x9b\x13\x3c"
- "\x8f\xe5\x47\xba\x79\x2c\x3f\xd2\x37\x8f\xe5\xfd\x7a\x88\xc7\x02"
- "\xe1\xb1\x4d\xfa\x81\xf1\x58\xde\x1c\x25\x8f\xe5\x1f\xf1\x8f\xc7"
- "\xf2\x3e\x19\x7c\x1e\xcb\x6b\x51\xf2\x58\xfe\x5e\x56\xa7\x57\x87"
- "\x07\xce\x63\xf9\xbf\xf1\xcd\x63\xf9\x25\x4a\x1e\xcb\x4f\x63\x7c"
- "\x95\x5f\xcd\x78\x2c\x7f\x3d\x4b\x7f\x55\x2d\x4f\x77\xf3\x18\x4b"
- "\x67\x3c\x96\x7f\xb2\x3f\x1e\x43\xbb\xa8\x8d\xf0\xb0\x8b\x17\x24"
- "\xbb\x28\x9c\x7a\xac\x58\xb2\x8b\x42\x21\x46\xe3\x8b\x8d\x2d\xaf"
- "\xae\x20\xea\x3c\xdc\x9f\x07\x38\x22\xed\x49\xb4\x8b\xcd\x15\x38"
- "\x4f\x44\xd3\x08\xbc\xd7\x2c\xf2\x60\x06\xf0\x60\x33\xfc\xc6\x35"
- "\xdb\xc6\x18\x5b\x90\xbf\x70\x3f\x0f\xfc\xcd\xf8\xd0\x36\x1c\xf7"
- "\x07\x12\x9e\xcd\xcb\xec\x46\xb0\x95\x76\xd1\x56\xda\x99\xad\x48"
- "\xef\xee\xad\x69\xa6\xbc\x6b\xb9\x61\x54\x5c\xd2\x30\x8a\xf6\x23"
- "\xbc\x13\x06\xf6\x43\x97\x1b\x42\x8b\x97\x81\xcd\xd8\x5a\x08\xae"
- "\xcb\x8f\x36\xa3\x5d\xa7\x0a\xa5\xed\xc9\x23\x80\x13\x19\xf7\xf1"
- "\xd5\xc3\x9d\xb8\xc6\xd6\x72\xe0\xbe\x36\xe0\xbe\x36\xb7\xad\xe0"
- "\xf3\xf6\xf6\xe5\x06\xbd\x7d\xb9\x61\x6c\x77\x3b\x70\x9f\xcd\xd3"
- "\x4e\x1e\x48\x29\x6b\x43\xee\x6b\x11\xec\x44\xe0\x3e\xb0\x0d\xbe"
- "\x1d\xb8\xef\x79\x91\xfb\xda\x0d\xc8\xf5\xba\xb2\xe7\x80\xfb\x12"
- "\xcf\x32\xee\x13\x63\xb8\x5b\x90\xfb\x96\x1b\xb8\x2d\x6d\x22\xf7"
- "\xcd\x43\xee\x3b\x0c\x36\x52\xa9\xe4\x3e\x6d\xb0\xdc\xb7\x79\xbd"
- "\xd2\x4e\x0a\xbf\xf6\xcf\x4e\x0a\x55\xbe\xec\xa4\x3b\x3f\x58\x3b"
- "\x29\xd4\x29\xed\xa4\xb0\x91\xd5\xa9\x60\x4c\xe0\x76\x52\xf8\x7e"
- "\x8f\x9d\xbc\xe0\x69\x27\x85\x87\x95\x76\x52\x58\xc4\xec\xa1\xd0"
- "\xc6\xec\xa4\x70\x17\x4b\x2f\x88\x94\xa7\xbb\xed\x84\xa5\x33\x3b"
- "\x29\x74\x0e\x3d\x2f\xff\xb6\xf9\xfb\xd7\x32\x86\x9e\x97\x07\xdb"
- "\x67\xfc\xb5\x6e\x60\x7d\xc6\x2d\x3e\xd7\xbf\x19\x1a\x6f\xef\x4f"
- "\xf6\xaf\x99\x07\x26\xfb\xdf\xa4\x0d\x8d\x95\x04\x2b\xfb\xad\x93"
- "\x06\x26\xfb\xd7\x5b\xfb\xeb\x63\xf8\x8e\xa5\xb6\x15\xd5\xf4\xf4"
- "\x31\xb6\x15\x49\xf3\x7c\x7b\xf7\x31\xb6\x69\x95\xef\xf1\xfd\x4f"
- "\x89\xe7\x7b\x7c\xfd\xf5\x3d\x9c\x43\x7d\x0f\xd0\xf5\x6f\x4c\x03"
- "\xeb\x7b\x14\x35\x28\x63\xaa\xed\x0f\xfa\x17\x53\x6d\x9b\xed\x2b"
- "\xa6\x72\x06\xdd\xf7\xd8\x96\xa4\x8c\xa9\xb6\x47\x8b\xd8\x58\x18"
- "\x78\x4c\xb5\xfd\x5a\xdf\x31\xd5\xf6\x1b\x94\x31\xd5\xb6\x56\x16"
- "\x3b\x6d\x9f\xca\x62\xaa\xed\xe2\xde\x85\xff\x93\x2c\x4f\x77\xc7"
- "\x54\x2c\x9d\xc5\x54\xdb\x67\x0d\x3d\x47\xff\xb6\xc5\x54\x6f\xd4"
- "\x0c\xf9\xf5\x60\x7d\xcb\xf6\xa4\x81\xf9\x96\x92\x6f\x70\xfe\xe7"
- "\xb7\xdd\xaf\x17\x87\x0f\x4c\xf6\xa5\x7d\xce\xff\xec\xdb\xaf\xbf"
- "\x99\xe6\xf6\xeb\x6f\xa6\xf9\xf6\xeb\x3b\x3e\x57\xfa\xf5\xb2\x17"
- "\x87\xfc\x7a\x30\x7e\xbd\xa4\x70\x60\x7e\x7d\xc7\x1e\xa5\x5f\x7f"
- "\x6b\x8c\x7f\x7e\xfd\xcd\xf1\x83\xef\xd7\xdf\x9c\xa4\xf4\xeb\x6f"
- "\x85\x88\xd8\xb8\x3f\x70\xbf\xfe\xe6\x17\xbe\xfd\xfa\x9b\x5f\x2b"
- "\xfd\xfa\x9b\x87\x98\xff\x7e\x2b\x92\xf9\xf5\x37\x1b\x58\x7a\x59"
- "\xac\x3c\xdd\xed\xd7\x59\x3a\xf3\xeb\x6f\x19\x86\x9e\xaf\x7f\xdb"
- "\xfc\xfa\x6f\x77\x0e\xf9\x96\x60\x7d\xcb\x5b\x03\xec\x33\xbe\xad"
- "\x0f\xde\xb7\xfc\xae\xc6\xed\x5b\x7e\x57\xe3\xdb\xb7\xfc\xee\x7e"
- "\xa5\x6f\x79\xfb\xf8\x90\x6f\x09\xc6\xb7\xfc\xb6\x75\x60\xbe\xe5"
- "\x77\x1a\xa5\x6f\x29\x7f\xc9\x3f\xdf\xf2\xbb\x4d\x83\xef\x5b\x7e"
- "\x57\xa4\xf4\x2d\xe5\x49\x22\x36\x4a\x02\xf7\x2d\xe5\x0f\xfa\xf6"
- "\x2d\xe5\x33\x94\xbe\xa5\x5c\xcf\x7c\x48\x79\x06\xf3\x2d\xe5\x13"
- "\x58\xfa\xdb\xc5\xf2\x74\xb7\x6f\x61\xe9\xcc\xb7\x94\xaf\x1f\x7a"
- "\xee\xfe\x6d\xf3\x2d\xbf\xef\x73\xfe\x6f\xdf\xfc\xb6\x6b\x97\x9b"
- "\xdf\x76\xed\xf2\xcd\x6f\xbb\x7e\xa0\xe4\xb7\xdf\xff\x71\x88\xdf"
- "\x82\xe1\xb7\xf2\xa2\x81\xf1\xdb\x1f\x5a\x95\xfc\xb6\xfb\x09\xff"
- "\xf8\x6d\xd7\xc2\xc1\xe7\xb7\x5d\x19\x4a\x7e\xdb\x3d\x55\xc4\xc6"
- "\xda\xc0\xf9\x6d\xf7\xad\xbe\xf9\x6d\xf7\x78\x25\xbf\xed\x26\x8c"
- "\xc7\x76\x27\x30\x7e\xdb\x1d\xce\xd2\x7f\xbf\x46\x9e\xee\xe6\x37"
- "\x96\xce\xf8\x6d\x77\xd2\xc0\x9e\xc7\xbf\xd7\xea\x7e\x1e\xff\x9e"
- "\xa0\x0b\xbe\xe8\x60\x44\xef\xe7\xf1\xef\xcd\x53\xae\x17\xb4\xfb"
- "\x73\xe1\xd9\x3c\xda\x8c\x9d\xad\xe9\xe0\xf5\x39\xfd\x0d\x07\x23"
- "\x86\x9e\xd3\x5f\xca\xe7\xf4\xef\x8d\x53\xda\xcf\x9e\x6d\xfe\xd9"
- "\xcf\x7b\xef\x0c\xfe\x73\xfa\xf7\x3c\xd6\x61\xd9\xb3\x5e\xc4\xca"
- "\xee\xc0\xed\x67\xcf\x02\xdf\xf6\xb3\x67\xb1\xd2\x7e\xf6\x88\x7d"
- "\xcc\x3d\x45\xcc\x7e\xf6\xc4\x8b\x76\xb5\x4b\x9e\xee\xb6\x1f\x96"
- "\xce\xec\x67\xcf\x4e\x7f\xe2\x03\xa7\xe6\x40\x3c\xfa\xfb\x71\x8d"
- "\x37\xb9\x7a\x70\x9e\x2e\xe2\xdc\x5b\x7c\xf0\x2c\xf3\x17\x42\x6c"
- "\xb0\x73\x8b\xba\xdf\xf8\xa0\x59\x8c\x0f\x92\x7a\xc7\x07\x52\x6c"
- "\x50\x0c\xf8\xde\xee\xd7\x33\x7a\x11\xef\x18\x1b\x5c\x0c\x34\x36"
- "\x78\xc8\x1d\x1b\xe4\x7b\xc4\x06\xcf\x7b\xc4\x06\x02\xde\x9b\x14"
- "\x78\xef\x15\x1b\xf4\xe0\x7d\xb0\x62\x83\x3f\xf9\xdc\xff\x69\xe8"
- "\x19\x7d\x7f\xfd\xce\x3d\xa6\x81\xf5\x3b\xff\xec\x73\xff\xa3\xa1"
- "\xb1\xfc\xfe\x64\xff\xa7\x01\x8e\xe5\xff\x25\x7c\x68\xbc\x25\x58"
- "\xd9\xff\x79\x80\x6b\x39\xfc\xbf\xc2\xe0\xfb\x23\x15\x73\xdc\xfd"
- "\x91\x8a\x39\x52\x7c\x85\xbc\x2b\xac\x99\x05\x5c\x9b\xbf\x0c\x8e"
- "\x8b\x84\xbc\xba\x4c\xd8\xf3\x20\xc4\xd2\x7c\x0a\xf7\x80\x83\x98"
- "\xcb\x74\x3c\x2e\x43\x1e\x73\xed\x9b\x2d\xc5\x5b\x71\x18\x8b\x41"
- "\x6c\x85\x71\x95\xd4\x07\x29\x6c\xeb\x67\xfe\xf0\xad\x5b\xd4\xd8"
- "\x67\xe9\xd6\x1e\x88\xff\xee\xf6\x57\xfe\x32\x67\x60\xfd\x15\x53"
- "\xb1\x32\xde\xaa\x1c\xe1\x5f\xbc\x55\x71\xc3\xe0\xf7\x57\x2a\x0c"
- "\xca\x78\xab\xc2\x2e\xe2\x44\x1b\x78\xbc\x55\x71\xca\x77\xbc\x55"
- "\x71\x5a\x19\x6f\x55\xec\x61\x71\x55\x65\x08\x8b\xb7\x2a\x0e\xb1"
- "\xf4\x7d\x1a\x79\xba\x3b\xde\x62\xe9\x2c\xde\xaa\x0c\xf7\x33\xde"
- "\x4a\x18\x40\xbc\x15\xf2\xed\x89\xb7\x7e\x7e\x85\xc7\x5b\xfb\x7d"
- "\xee\x7f\x2e\xf3\x3b\xf1\x1e\x7e\x47\x3d\xe4\x77\x90\x6b\x2a\x0d"
- "\x03\xf3\x3b\xef\x87\xf4\x2b\xfb\x3c\x99\xec\x91\xf3\x45\xb9\xbb"
- "\xa2\xb6\xa8\x83\x96\x3d\x70\x7d\x49\xe6\xb7\x59\xee\xfb\x4f\x0e"
- "\x4c\xee\x1f\x64\x0f\xc5\x5a\xc1\xca\xfe\xfd\x59\x03\x93\xfd\x87"
- "\xce\xe0\x63\xad\x83\x2d\xc7\x7a\x62\xad\x83\x2d\x9e\xb1\x16\xc6"
- "\x56\x33\x1c\x2c\xe6\x7a\x15\x62\xa5\xdc\x54\x88\xbb\x56\x10\x62"
- "\x69\x7e\x9f\xe4\x41\xec\x95\x7b\x1e\xe2\xaf\x14\x88\xbf\x9c\x6f"
- "\x8b\xf1\xd7\xc1\xa7\x95\xf1\x97\xf9\x94\xd7\xf8\x4b\xeb\x8e\xbf"
- "\x9c\x10\x5b\x75\xbf\xbd\x45\x5d\x78\x5e\x16\x8b\x2d\xea\x1d\x8b"
- "\x75\xe5\x1f\x48\xe8\xba\x75\x4b\x48\x37\xc4\x63\x7d\xc5\x62\x02"
- "\x26\xbc\xc4\x63\xff\x19\xb1\xd8\x07\xd5\x03\x8b\xc5\x0e\x1a\x94"
- "\xb1\xd8\x47\xbf\xf1\x2f\x16\x3b\xf8\xb6\xcf\xb1\xaf\xa0\x63\xb1"
- "\x83\x7b\x95\xb1\xd8\x47\xd9\x22\x66\x5e\x0a\x3c\x16\xfb\x68\x9e"
- "\xef\x58\xec\xa3\x85\xca\x58\xec\x23\xf1\xdd\xd3\x8f\xb6\xb2\x58"
- "\xec\xa3\x59\x2c\xdd\x9c\x21\x4f\x77\xc7\x62\x2c\x9d\xc5\x62\x1f"
- "\xed\xf0\xf3\xd9\x58\xbc\x13\x7c\xfa\x37\x3f\x9f\xb2\xaf\x67\x63"
- "\x83\x35\x9f\xf2\xa1\x2b\xfc\xd9\xd8\xe1\xfe\xc7\xbf\x86\x62\x02"
- "\x2f\x5c\xf3\xd1\xde\x81\xf9\xa5\xbf\x6e\x1d\x8a\x09\x82\x95\xfd"
- "\xe1\x01\x8e\x7d\x55\xeb\x82\x8f\x09\x8e\x36\xba\xc7\x5f\x8e\x36"
- "\x06\x36\xfe\x72\xf4\x31\xa5\xff\xaf\xf6\xee\xff\x87\xc6\x5f\x02"
- "\xf0\xf9\x7f\x6d\x1c\x98\xcf\x3f\x1a\xa9\xf4\xf9\xc7\x36\xf9\xe7"
- "\xf3\x8f\x6e\x1b\xfc\xf1\x97\xa3\xe5\x4a\x9f\x7f\x2c\x5d\xc4\x49"
- "\x7e\xe0\x3e\xff\xd8\x6c\xdf\x3e\xff\xd8\xd3\x4a\x9f\x7f\x2c\x9a"
- "\xf9\xf6\x63\x39\xcc\xe7\x1f\x9b\xca\xd2\xab\xf3\xe4\xe9\x6e\x9f"
- "\xcf\xd2\x99\xcf\x3f\xb6\x35\xb0\xe7\x5d\x61\x57\xe8\xf3\x2e\xdd"
- "\x77\xe4\x79\x57\xad\x66\xc8\xef\x04\xeb\x77\x8e\x95\x0f\xcc\xef"
- "\xd4\xf5\xbb\xfe\x87\x6f\xbf\x73\x3c\xde\xed\x77\x8e\xc7\x07\xe6"
- "\x77\xea\x8f\x28\xfd\x8e\x65\xc6\x90\xdf\x19\xa8\xdf\xa9\x8d\x1f"
- "\x98\xdf\xa9\xf7\x58\xff\xe8\x84\x9f\xeb\x1f\x1d\xf7\xb9\xfe\x51"
- "\xf0\x7e\xe7\xb8\x5e\xe9\x77\x8e\x8b\xeb\x1f\x59\x82\x58\x37\xe4"
- "\x78\xad\x6f\xbf\x73\xdc\x63\xfd\xa3\xe3\xe2\xfa\x47\x27\xc4\xf5"
- "\x8f\x8e\x8b\xeb\x1f\x59\xd4\xf2\x74\xb7\xdf\xb1\xc8\xd6\x0d\x39"
- "\x31\xb4\xfe\xd1\xb7\x6e\x1e\xe6\xdf\x07\xc0\x7f\x1f\x4f\x70\xf3"
- "\xdf\xc7\x13\x7c\xcf\xc3\x3c\xf5\x8e\x72\x1e\xe6\xc9\x7b\x86\xe6"
- "\x61\x06\xc3\x6f\x27\x06\xb8\x2e\xd2\xa9\x74\x25\xbf\x7d\xfc\x99"
- "\x7f\xfc\x76\xea\xeb\xc1\xe7\xb7\x8f\x89\x92\xdf\x3e\xae\x11\xb1"
- "\x11\x04\xbf\x7d\xbc\xdb\x37\xbf\x7d\xfc\x17\x25\xbf\x7d\x9c\xc3"
- "\x78\xec\x63\x2b\xe3\xb7\x8f\x8b\x59\xfa\x49\xb5\x3c\xdd\xcd\x6f"
- "\x27\x65\xfc\xf6\x71\x6b\x60\xcf\x35\x83\x8a\xab\x2f\xc3\x73\xcd"
- "\xc1\x8a\xab\xaf\xf4\xe7\x9a\x0d\x49\x43\xe3\x68\xc1\xc4\xd4\xff"
- "\x20\x03\x8b\xa9\x3f\x69\x0c\xde\xa7\x34\x9a\xdd\x3e\xa5\xd1\xec"
- "\xeb\xf9\x4e\x2e\xe0\x2e\x0f\x62\xe2\x4d\xe7\x89\xfa\x55\x7c\xbe"
- "\x73\xb2\x96\xe4\xe3\xf3\x9d\x54\xe9\xf9\x4e\x89\x18\x67\x37\xde"
- "\xad\x8c\xb3\xff\xf9\x17\x6f\x71\x36\xc6\xd7\x2e\x88\x9d\x9d\x9e"
- "\xcf\x75\x9e\xf4\xee\x8b\xba\xb4\x07\x12\x3a\xdf\xde\x12\x12\xa8"
- "\x2f\x7a\x63\x15\xf3\x45\xdb\xbf\xf5\xbe\xa8\x61\xd7\xc0\x7c\x51"
- "\x23\x51\xfa\xa2\xd3\x8b\xfd\xf3\x45\x8d\x6b\x07\xdf\x17\x35\xe6"
- "\x29\x7d\xd1\xe9\x04\x11\x2b\x41\xec\x2d\x79\xfa\x1e\xdf\xbe\xe8"
- "\xf4\xfd\x4a\x5f\x74\x3a\x9c\xf9\x9c\xd3\x29\xcc\x17\x9d\x36\xb0"
- "\xf4\x7f\x26\xc8\xd3\xdd\xbe\x88\xa5\x33\x5f\x74\x3a\x23\xb0\x31"
- "\x9e\xab\xaf\xd0\x31\x9e\x90\xef\xc8\x18\xcf\xff\x67\x0b\x9e\x13"
- "\x3f\xdb\x5b\xd3\xf3\xfe\xc6\x67\x7b\x7b\x8d\x33\xac\x80\x78\xbb"
- "\x8d\x3d\xe7\xee\x19\x67\xb0\x9e\x16\xf9\xef\xb3\xdb\x94\xfc\xf7"
- "\xa9\x4f\xfe\xeb\xeb\x59\x36\x8e\x2b\xb8\x80\x1b\x71\x8f\xcc\xa0"
- "\x9f\x65\xaf\xf8\xb6\x73\xde\xe9\x01\xae\xaf\x6c\xb5\x2b\x39\xaf"
- "\x69\x9e\x7f\x9c\xf7\xd9\x52\x9f\x9c\x17\xf4\x7b\x1c\x9f\x65\x2b"
- "\x39\xaf\x69\xba\x88\x8f\xc5\x81\x73\x5e\xd3\x78\xdf\x9c\xd7\x74"
- "\xb7\x92\xf3\x9a\x42\x18\xb7\x35\x25\x32\xce\x6b\x8a\x64\xe9\x9f"
- "\xa6\xc8\xd3\xdd\x9c\xc7\xd2\x19\xe7\x35\xa5\xf4\xc5\x79\x34\x6f"
- "\x63\x42\x21\xc7\xef\x81\xc3\x04\x75\xbc\x01\xb0\x61\x86\xef\xd5"
- "\xa0\xe3\x51\xf0\xbd\xde\x97\xfd\xd9\xb4\x1b\x13\x78\x23\xd4\x99"
- "\x23\x2a\x8b\xed\x2b\xb3\x79\xb4\x13\xeb\x29\xbe\xb3\xb6\x31\x21"
- "\xcc\x79\xf5\x34\x9e\x26\x13\xd0\x4b\x82\xb0\x7f\x26\xe4\xc7\xf7"
- "\x83\xf4\x2b\x48\xe8\x79\xd5\xbf\x34\x52\x3e\xa8\x6f\x68\x93\xaa"
- "\xe9\x08\x96\xd1\xb1\xe1\x5f\x11\xd0\x96\x0c\x9f\x75\x85\xb2\xe2"
- "\xde\x19\x4b\xd6\x3a\xe9\xbf\xcd\xa9\x6d\xa4\x59\xf5\xaf\x79\x61"
- "\xad\x57\x4f\xa3\x59\x09\x04\x63\xb9\x3d\xa3\x6d\x6a\x2c\xd3\x9c"
- "\xda\x85\xe7\xa6\xe2\x39\x17\xd4\x31\x73\x31\xe1\x0a\xda\xae\x0e"
- "\x01\x9e\x18\x9e\x65\xa7\x2d\x4b\x9c\x50\x67\xc0\xe6\x87\x63\x1b"
- "\xd4\xef\x6d\x87\x34\x17\x89\xc0\xfd\x4c\xb1\x0c\x88\x67\xa1\x3e"
- "\xff\x5a\x50\x0a\xf9\xbd\xd5\xe1\x95\x77\xc9\xb8\xe1\xb7\x51\x6b"
- "\x60\xb8\xf9\x97\xc9\x97\x1c\xc3\xd6\x8d\x25\xe6\xdb\x41\x76\x7a"
- "\xc2\x79\x3b\x1f\xd8\x7d\x9a\xf5\x7d\xf0\x65\x08\xee\x91\x9c\xb5"
- "\x8d\x70\x9b\xf9\xab\x43\x3e\x5a\x23\xec\x51\x6c\xeb\xd8\xd0\x9c"
- "\x67\x55\x4d\x9b\x83\x32\xc7\x7d\x2d\x71\x7f\x6d\xc0\x0d\x81\xf4"
- "\x9d\x07\x32\x08\xf1\xd4\xc5\xb2\xa4\xc5\xf3\xf4\xe9\x0b\x17\x2f"
- "\x58\xf2\x62\xba\xfe\xd6\xa4\x91\x24\x7e\xc9\x12\xfd\xe2\x79\xa9"
- "\x2f\xe9\xe5\x67\xee\xd5\x27\x2d\x5c\x3e\xef\xd9\x94\x05\xe3\x17"
- "\xcf\x4f\x1b\x89\x41\x8b\xac\x1e\xe1\x58\x17\x7e\x43\xf3\x9e\xd2"
- "\xd7\x08\xd9\x32\x8a\xa8\xb1\x5e\x1d\x1b\x3e\x0f\x97\xf6\x3d\x2d"
- "\x78\x9d\xda\x39\xc8\x93\x05\xfc\xb8\x39\xf3\x6a\xcc\xab\x2f\x83"
- "\x7a\x95\x42\xbd\xa1\x8e\x50\xe7\xcf\x63\xa5\x3a\x4b\x98\xc8\x42"
- "\x4c\x64\xb6\x01\x06\x3f\x9f\x17\xe6\xb8\xfa\xe7\x94\x26\x60\xfb"
- "\xec\x60\x27\x2a\x48\xfb\xa3\xe0\xcb\xf2\x37\x26\xc0\xb5\x6b\x24"
- "\x8c\xe1\xb5\xb4\x60\xa3\xbe\x03\xed\x84\x26\xff\x8c\xd9\xd4\x99"
- "\xf8\xd9\x06\x15\x61\xfb\xae\x7e\x5e\xee\xde\x77\xf5\x8c\x30\x56"
- "\x0d\xf5\x68\x85\x74\xb3\x55\x75\xc3\x4e\x4c\xc7\xfd\x82\x71\xff"
- "\x6e\xac\x33\xb4\x0b\x7c\x29\x35\x53\xa3\x88\xfd\x9c\x4f\x12\xf8"
- "\x9c\x4e\x9b\x45\x7d\x91\xc4\x39\x69\x37\xdd\xf4\x49\x42\x9d\xdd"
- "\x4e\xc2\xd6\xa5\xcd\xa7\x57\x35\x1f\x08\x73\x2e\x5c\x50\x36\x0a"
- "\x6c\x68\x53\xa7\x8d\x6e\x6a\x9f\x36\xfb\x36\xa2\xeb\xd8\x70\x46"
- "\xbe\xff\xab\x3a\x30\xfd\x9f\x11\xf4\x8f\x7a\x84\xfa\x88\x7a\x3c"
- "\x93\x72\x20\xbd\xb7\x1e\x7b\xf0\xf7\x0e\x4f\x0e\x03\x16\xa8\x66"
- "\xdf\x8e\x38\x17\x93\x23\xda\x6e\x7b\x56\x32\xb9\x53\x90\xdd\xbf"
- "\xa3\xf8\x82\x7d\xd9\x7c\xde\x3e\x13\xcd\xdb\xb7\x13\x64\x16\x53"
- "\xb0\x82\xe8\xe7\xba\x74\x24\xff\x22\x89\xb6\xe5\xef\xdb\xa1\x55"
- "\x65\xab\x20\x1e\xe1\xc0\x9f\x44\x03\x67\x44\x8b\xf6\x1e\x83\x72"
- "\xfc\x1b\x30\xc2\xcc\xe5\x84\xfc\x7b\x12\x19\x56\x0a\xd7\x05\xd8"
- "\x1e\xc1\xff\xd3\x0d\x67\xca\xcb\xe0\x5a\xdc\xd7\x37\xb0\xeb\xff"
- "\x1d\xed\xd3\xee\x7a\xda\x6d\xd2\x7b\x6f\x77\x4b\x24\x5f\x60\x82"
- "\xbe\xad\x29\x86\xe6\x99\xa2\x7a\xb7\xdb\xa4\x67\xed\x1e\xde\x36"
- "\xf8\xed\xfe\x37\x5b\xff\x7a\xc3\xbf\x77\x04\xd7\xee\x16\x83\x1f"
- "\xed\xf6\xa1\xef\x2f\xc2\xa1\xdd\xa0\x6f\x13\xe8\xdb\xe4\x45\xdf"
- "\x26\x51\xdf\xd7\x34\x0d\x7e\xbb\x5b\xac\xac\xdd\x2d\x45\xc1\xb5"
- "\xfb\x0b\x9f\xfc\xe7\x6e\x77\x85\x0f\x7d\x9f\xd5\xf0\x05\x15\xa0"
- "\xef\x0a\xd0\x77\x85\x17\x7d\x57\x88\xfa\xbe\xf6\xc4\xe0\xb7\xfb"
- "\x0b\xb6\xfe\xe1\x86\x2f\x0a\x83\x6b\xf7\xd9\x08\x3f\xda\xed\x43"
- "\xdf\x5f\xaa\xa1\xdd\xa0\xef\x0a\xd0\x77\x85\x17\x7d\x57\x88\xfa"
- "\x9e\x98\x3b\xf8\xed\x3e\x5b\xcf\xda\x7d\x36\x27\xb8\x76\x7f\xe9"
- "\x73\xfe\x8b\xbb\xdd\x95\x3e\xf4\xfd\xa5\x93\x2f\xa8\x04\x7d\x57"
- "\x82\xbe\x2b\xbd\xe8\xbb\x52\xd4\xf7\x53\x53\x06\xbf\xdd\x5f\x56"
- "\xb3\x76\x7f\x99\x1d\x5c\xbb\x5b\x7d\xce\x7f\x97\xf1\x79\x39\x70"
- "\x76\x2f\x9d\x5b\x32\x62\xc8\x1d\x17\xb1\xfd\xe7\x52\xa8\x76\x5f"
- "\xf9\x35\xeb\xb2\x55\x4e\xcd\xbe\x5d\xd7\x40\x5f\xee\x0d\x23\x9f"
- "\x1c\x66\x25\x23\xa0\xad\xc9\xb4\xa0\x2a\x16\x3f\x79\x28\xc7\x09"
- "\xdc\xef\xd2\xec\xdb\xd9\x95\xb7\x31\xe6\xd5\xe7\x88\x3e\xcb\x46"
- "\x74\x75\x99\x56\x92\x99\x46\x6d\x75\xe4\x33\xa2\xb5\x12\x0e\xc7"
- "\xcb\x8e\xb5\x9a\x48\xea\x32\x4a\xa1\xec\xd9\xd8\xc7\x2c\x38\x43"
- "\xa2\x21\x26\xce\xa6\xe0\x3f\x0a\x79\xa2\x87\xf2\xa3\x51\x96\x50"
- "\xf6\x94\xb0\x78\xa2\xfa\xe0\x59\x07\x41\x79\xa2\x6c\xa1\x3f\x1a"
- "\x2d\xc8\x15\xa2\xfd\x47\x9f\x62\x72\x7d\xe3\xb9\x40\xe5\x7a\x8e"
- "\x3d\xff\xcb\xdb\x67\xb6\x58\xbb\x08\xc4\x96\x3a\x7c\xe7\x1e\xe4"
- "\xd5\x58\x97\xd6\x06\x7d\x91\xd6\x6c\x9a\xbf\x6f\x0f\x0f\x3e\x2b"
- "\xc0\x72\x7d\xae\x7f\x2d\xe3\x53\x03\x70\x66\x2f\xac\xb9\xe5\x7d"
- "\xbe\x91\x6a\x4d\x06\x26\x6f\xd3\xb8\x6b\x1a\x87\xb7\x79\x97\xb7"
- "\xc9\xe0\x04\x9f\xe3\xd2\x98\xa2\xfc\x97\xf7\xf9\xc3\x4a\x79\x9b"
- "\xc8\xe5\x91\xf7\x79\x71\xff\x53\x53\xac\x52\xde\xe7\xa7\x33\x79"
- "\x9f\xb3\xd1\x7c\x53\x34\x0f\xbe\x32\xc0\x72\x5b\xfc\x90\x37\xe0"
- "\xbb\xb7\x0f\x73\xcb\xdb\x36\x1d\xe4\x2d\xe2\xdb\x04\xf8\xbe\xa6"
- "\xc9\x87\xbc\x01\xdf\x26\xc0\xb7\x29\x00\x7c\xdb\xee\xf6\x90\xf7"
- "\x65\xc2\xb7\x4d\x1c\xff\x33\x79\xe0\xfb\xab\x2a\x26\xef\xaf\x12"
- "\x41\xde\x80\x6f\x53\x80\xf8\xb6\x25\xf8\xe1\x3f\x00\xdf\xbd\x7d"
- "\xa7\x5b\xde\x5f\x57\x51\x6d\x85\x88\xef\x0a\xc0\xf7\xb5\x27\xbc"
- "\xcb\xbb\x02\xf0\x5d\x01\xf8\xae\x08\x00\xdf\x5f\xbf\xad\x94\x77"
- "\xc5\x65\xc2\xf7\xd7\x6c\x8d\xc9\xbc\x0a\x0f\x7c\x7f\x3d\x8e\xc9"
- "\xdb\x56\x4f\xf3\x2b\x00\xdf\x15\x81\x96\x5b\xed\x87\xbc\x01\xdf"
- "\xbd\x7d\xb6\x5b\xde\xed\xe3\x40\xde\x22\xbe\x2b\x00\xdf\x13\x73"
- "\x7d\xc8\x1b\xf0\x5d\x01\xf8\xae\x08\x00\xdf\xed\xd7\x79\xc8\xfb"
- "\x32\xe1\xbb\xcd\x2a\xca\xdb\x03\xdf\x6d\xc5\x4c\xde\x6d\xb1\x20"
- "\x6f\xc0\x77\x45\x80\xf8\x6e\x8f\xf1\x23\x4e\x00\x7c\xf7\x8e\x15"
- "\xdc\xf2\xb6\x17\x53\x6d\xa5\x88\xef\x4a\xc0\xf7\x53\x53\xbc\xcb"
- "\xbb\x12\xf0\x5d\x09\xf8\xae\x0c\x00\xdf\xf6\x57\x94\xf2\xae\xbc"
- "\x4c\xf8\xb6\x8b\xfb\x5f\x56\x7a\xe0\xdb\xae\x61\xf2\x6e\xdf\x43"
- "\xf3\x2b\x01\xdf\x95\x81\x96\x5b\x1e\x4c\x7c\xb2\xbc\x84\x84\x28"
- "\x65\x7e\x51\x77\xe9\x62\x94\x0b\x9d\xdf\x4c\x8c\x72\xe1\x90\xf7"
- "\x18\xe5\x42\x36\x93\xf9\x85\xa8\xe0\x62\x94\x8b\x3e\xdf\x7f\xe8"
- "\x2b\x46\xe9\x2d\xf3\x8e\xf5\x97\x2e\x4e\xe9\x58\xfc\xcd\xc4\x29"
- "\x1d\x31\xde\xe3\x94\x8b\x76\x26\xf3\x8b\x45\xc1\xc5\x29\x1d\x3e"
- "\xd7\x3f\xe8\x2b\x4e\xe9\x2d\x73\x87\xe3\xd2\xc5\x2a\x8e\xcf\xbe"
- "\x99\x58\xc5\xb1\xcb\x7b\xac\xe2\x48\x66\x32\x77\x68\x82\x8b\x55"
- "\x3a\xd5\xc1\xc4\x2a\xbd\x65\xde\x95\x72\xe9\xe2\x95\xae\xd9\xdf"
- "\x4c\xbc\xd2\xa5\xf7\x1e\xaf\x74\x8a\xfd\x9f\xce\xec\xe0\xe2\x95"
- "\x2e\x3f\xfa\x3f\xbd\xe3\x95\xde\x32\xef\xb6\x5e\xba\x98\xa5\xfb"
- "\xc8\x37\x13\xb3\x74\x6f\xf5\x1e\xb3\x74\xcf\x62\x32\xef\xb2\x07"
- "\x17\xb3\x74\xfb\xdc\xff\xa4\xaf\x98\xa5\xb7\xcc\x5d\xf1\x97\x2e"
- "\x6e\x71\x4d\xfe\x66\xe2\x16\x57\x88\xf7\xb8\xc5\x79\x88\xc9\xdc"
- "\x99\x1c\x5c\xdc\xe2\x4a\x0c\x26\x6e\x41\x59\xa3\xcc\x31\x56\x11"
- "\x64\xce\x91\x28\x1a\xba\x2f\xbb\x1b\xe2\x11\x2d\xc8\x5d\xdb\x4a"
- "\xb8\x12\x94\x79\x03\x93\xb9\x2b\xb4\x2a\x16\xe4\x93\x8c\x32\x13"
- "\xda\xf1\x65\x44\xa8\x2b\x6f\xdf\x2e\xca\x11\x68\x4b\x08\x39\xa3"
- "\xe2\x7f\xec\x34\x92\x50\x7d\xe6\x3a\x02\x65\x5d\x87\x79\xf4\x99"
- "\x1b\x4e\x43\x1b\x87\xe1\x33\x0a\x67\xfe\x06\xab\x4b\xbb\x3f\xf1"
- "\x8c\x8a\x2e\xa5\x63\x8c\xd6\x6e\x88\x25\xe8\x0b\x11\xe1\x96\xd6"
- "\x3d\xc4\xe2\x3c\x4a\xea\x1a\x2a\x09\x1f\x5a\x35\xe5\x4e\x27\x31"
- "\xd0\x2f\x0d\xe1\x35\xe9\x56\xe2\x9a\x1f\xa1\xb1\x64\x54\x03\x2e"
- "\xfe\x44\xe2\x5a\xe8\x45\xfa\x2f\x83\xa6\x5b\x6b\xde\xe1\xd2\x56"
- "\xe9\x5d\xf9\x07\x92\x9d\x5a\x73\xe1\xee\x15\x56\x4e\xe3\x20\x86"
- "\x94\x66\x4a\x0b\x9e\x25\xea\x82\x26\x12\xb2\xf9\x59\xa2\xd9\xdc"
- "\x44\x74\x35\xcd\x0d\xa4\xf6\x6c\x35\xa9\x6d\xfb\x84\xd4\x5e\x84"
- "\xa3\x0b\x0e\x1e\x8e\xec\x4f\x48\x0d\x20\x75\xc6\x39\x42\xb2\x9a"
- "\xa9\xed\x47\x8d\x24\xbc\xc6\xd9\x40\xf4\xcf\x10\x72\x5e\x45\x87"
- "\x6b\x12\x49\x38\xfd\x57\x04\xa1\xf3\x23\x38\x38\xa7\xc6\x74\x8b"
- "\xd3\x46\x6a\x9a\x1d\x70\x9e\x6f\x86\xf3\xea\xac\x66\x28\x9f\xaf"
- "\xc6\xb5\x0c\x6d\x35\xd9\x47\xa0\x7d\x13\xeb\x41\xce\x26\x29\x26"
- "\x2b\xe8\x22\xd1\x9b\x41\xcd\x88\x99\x38\xca\x30\x53\xd6\x15\x28"
- "\x66\x28\x5b\xff\xfd\x85\x88\x51\x20\xef\xd1\xfc\x0b\x09\xba\x99"
- "\x9f\x7c\x4a\x71\x3e\x18\x3e\x9f\xa9\xb3\x1f\x25\xf8\xcc\x3a\xee"
- "\x25\x42\xa6\xbb\x08\x41\x99\xe0\xb3\xe4\x99\x69\x24\x0c\xe7\xa9"
- "\xf1\x5f\x1a\x46\x59\x9a\x6d\x64\xad\x13\xea\x7a\xde\xd1\x53\xd7"
- "\xba\xf5\x75\x04\xce\x8d\xae\x4b\xb6\x12\x4d\x1a\xd1\xa1\x9c\x21"
- "\x16\x2d\x9f\xd9\x42\x46\xa4\xda\x29\x45\x19\xa3\x6c\x51\xce\x58"
- "\x9e\x24\x7b\x4b\x92\x8d\x64\x39\x88\xce\x92\x09\x9f\x19\xd4\x66"
- "\x21\x5f\x13\xa8\x63\x04\xd5\x4e\xac\x07\x7c\x4c\x45\x4c\x58\x55"
- "\xbc\x01\x70\x30\x8a\x6e\x70\x35\x96\x42\x7b\xf1\xd9\x7e\x40\x6d"
- "\xe6\x88\x3f\xcf\x3f\x7a\xc5\x84\x6e\x3c\x9b\x0c\x0c\xcf\x9c\x9d"
- "\x86\x9a\x48\x37\xc4\x7a\x0c\xcf\xc3\xdb\xfa\xc7\xb3\x69\x5c\x0f"
- "\x9e\x39\x95\xca\x8d\x67\xee\x73\x9f\x78\xe6\xb8\xfb\x19\x9e\x4d"
- "\xb1\x57\x24\x9e\x39\xd5\xa9\x3e\xf1\xcc\xa9\xf6\xfa\xc6\xb3\x29"
- "\x46\x8a\x77\x07\x05\xcf\x1c\xa7\xb9\x7c\x78\x36\x19\x82\xc2\x33"
- "\xa7\x6a\x51\xe0\x99\x23\x0e\x01\xcf\xb9\x64\x57\x70\x78\x1e\x46"
- "\x82\x89\xb7\x65\x78\x16\xf9\x79\xf8\x21\xc0\x33\xf0\xb3\x49\xe4"
- "\xe7\x6b\x9a\xfc\xc0\xb3\x9b\x9f\xb9\x61\xc7\xdd\x78\x1e\xfe\x17"
- "\xdf\x78\x1e\x7e\xad\x88\xe7\x2b\x93\x9f\x39\xf5\xdb\x7d\xe3\x59"
- "\xbd\xbe\x0f\x3c\x9b\xa4\xbe\xc4\xe0\xe0\x59\xdd\x78\x19\xf1\x1c"
- "\x1c\x3f\x73\x6a\x93\x12\xcf\xc3\xaa\x19\x9e\x87\xad\x09\x0e\xcf"
- "\xc3\x7d\xce\xaf\xe9\xab\x2f\xe3\xc6\x73\x85\xc8\xcf\x21\x5b\x69"
- "\x68\x05\xf0\x73\x85\xc8\xcf\xd7\x9e\xe8\x1f\xcf\x15\x32\x7e\xbe"
- "\xea\x4d\x37\x9e\x43\x5e\xf1\x8d\xe7\xab\x3f\x63\x78\xae\xb8\x42"
- "\xf9\xf9\xea\x17\xfb\xc6\xf3\xd5\xf1\xbe\xf1\x5c\x11\x23\xf5\xd3"
- "\x06\x07\xcf\x57\xef\xba\x7c\x78\xae\x08\x92\x9f\xaf\xce\x51\xe2"
- "\xf9\xaa\x22\x86\xe7\xab\xa6\x07\x87\xe7\x90\x1d\xc1\xf4\x13\x65"
- "\x78\x16\xf9\xf9\x9a\x24\xc0\x33\xf0\x73\x85\xc8\xcf\x13\x73\xfd"
- "\xc0\xb3\x8c\x9f\x47\x2c\x75\xe3\xf9\x9a\xd9\xbe\xf1\x3c\xf2\x8f"
- "\x22\x9e\xaf\x50\x7e\x1e\xf9\x60\xdf\x78\x1e\x19\xd5\x07\x9e\x4d"
- "\x52\x1f\x78\x70\xf0\x3c\x72\xcd\x65\xc4\x73\x90\xfc\x3c\x32\x41"
- "\x89\xe7\x11\xc9\x0c\xcf\x23\x22\x83\xc3\xf3\x35\x3e\xf7\x7f\xed"
- "\xab\x0f\xee\xc6\x73\xa5\xc8\xcf\xa1\x13\x68\x68\x25\xf0\x73\xa5"
- "\xc8\xcf\x4f\x4d\xe9\x1f\xcf\x95\x32\x7e\xd6\xdc\xef\xc6\x73\xe8"
- "\xad\xbe\xf1\xac\x5d\xc7\xf0\x5c\x79\x85\xf2\xb3\xf6\xba\xbe\xf1"
- "\xac\xb1\xfb\xc6\x73\x65\x8c\x34\xbe\x30\x38\x78\xd6\x4e\xbf\x7c"
- "\x78\xae\x0c\x92\x9f\xb5\x06\x25\x9e\x35\x31\x0c\xcf\xd7\xb4\x06"
- "\x87\xe7\xd0\xd8\xc1\x19\xdf\xb8\x76\x02\x8e\x6f\x74\xe1\xf8\x86"
- "\x7b\xee\x5f\x72\x58\x3d\xc3\x73\x37\xe0\xf9\x0d\x39\x9e\xff\xcf"
- "\x63\x7c\x83\x0b\xbb\x96\xef\xc1\xf3\xb5\xbd\xf0\xcc\x03\x9e\xbb"
- "\x05\x3c\xeb\x26\x4b\xe3\x1b\x96\xd6\x1d\x80\x93\xb3\xc4\x32\x0b"
- "\xb0\x5c\x20\x62\xf9\xff\x00\xcb\x20\x43\x1e\x64\x5c\xd3\xd8\x40"
- "\xe2\x6c\x4c\x96\x5d\x20\x63\x5e\x8e\xe3\xae\x16\x0e\xf1\x8b\xb8"
- "\x95\x30\x5c\x9b\x0a\xd8\x5d\x76\x9c\xd4\xae\x80\x63\x15\x1c\x99"
- "\x70\x90\xe3\xa4\xa6\x05\xb0\xbb\x50\x8e\xdd\x7a\x11\xbb\x61\xc7"
- "\xfb\xc6\x6e\xd8\x9e\xcb\x36\x96\xc1\xe9\xd8\xf8\xd7\xff\x25\xe8"
- "\xe2\x1e\xfb\x94\x5a\x32\x1a\x44\x7c\x9e\x25\x71\x4e\x12\x46\x9f"
- "\x32\x8c\xd2\x24\x10\xdd\x6a\x17\xe1\xf2\x9f\x25\xba\xfc\x7f\x42"
- "\xbb\x25\xfb\x6d\x22\x9a\xa3\x8e\x4a\x52\xd3\xd6\x40\x6a\x2e\x1e"
- "\x21\x35\x3c\x1c\x67\xe1\x80\xba\xc6\x2d\x90\xb7\xdb\x26\xb6\x5b"
- "\x77\x04\xca\x8a\xf2\xdd\x6e\x5d\xb9\xd0\xee\x24\x68\x77\x97\xbb"
- "\xdd\x16\xb0\x03\xd0\xcf\x68\x5e\x1c\x0f\x89\xb3\x91\x11\x4b\x9c"
- "\x94\x76\x89\xf8\x47\xfd\x1c\x3d\xe9\x20\x71\x69\xa0\xb3\xf9\x80"
- "\xff\xe6\x72\x92\xb5\x06\xf0\xdf\xe5\x40\xdc\xd9\x2c\xd9\x9d\x80"
- "\xff\xb0\x66\x0a\xf2\xeb\x46\xfc\xff\x1f\xe2\x3f\x2c\x84\x17\xf0"
- "\x1f\x5a\x15\x1c\xfe\xaf\xf5\x03\xff\xfe\x8c\x87\x84\x4f\xc0\xf1"
- "\x90\x2e\x1c\x0f\x71\xcf\x01\xed\x07\xff\xf2\xf1\x90\x51\x32\xfc"
- "\x87\xf7\x81\xff\xef\x4d\x96\xc6\x43\xbe\x79\xfc\x8f\xea\x07\xff"
- "\xa3\xfa\xc0\xff\x60\x8f\x7d\x7c\xef\x32\xe2\xff\x7b\xfd\xe0\xff"
- "\x7b\x7e\xe0\xdf\x64\x08\x0e\xff\xa3\x3c\xf0\x3f\x4a\xc4\xff\xb5"
- "\x41\xe2\x3f\xdc\x1f\xfc\xfb\x31\x7e\xf2\x7d\xc4\x3f\xf0\xbf\x69"
- "\xa7\x6c\x2e\x70\x7f\xf8\x97\xf1\xff\x75\x32\xfc\x7f\xbf\x0f\xfc"
- "\x5f\x2f\xe1\xff\x0a\xe0\xff\xeb\xfa\xc1\xff\x75\x7d\xe1\x7f\x90"
- "\xc7\x4a\xae\xbf\x8c\xf8\xbf\xbe\x1f\xfc\x5f\xef\x0f\xfe\x83\xe4"
- "\xff\xeb\x3c\xf0\x7f\x9d\x88\xff\xf0\x20\xf1\xff\x7d\x3f\xf0\xef"
- "\xcf\x78\xcb\xe8\x09\x38\xde\xd2\x85\xe3\x2d\xee\x39\xe1\xfd\xe0"
- "\x5f\x3e\xde\x12\x21\xc3\xff\xe8\x3e\xf0\x7f\xc3\x64\x69\xbc\xe5"
- "\x9b\xc7\x7f\x44\x3f\xf8\x8f\xe8\x03\xff\x83\x3d\xb6\x72\xc3\x65"
- "\xc4\xff\x0d\xfd\xe0\xff\x06\x3f\xf0\x5f\x11\x24\xff\x47\x78\xe0"
- "\x3f\x42\xc4\xff\xf7\x83\xc4\xff\x68\x7f\xf0\xef\xc7\xf8\xcc\x18"
- "\xc4\x3f\xf0\x7f\xc5\x4e\xd9\xbb\x01\xfd\xe1\x5f\xc6\xff\x37\xca"
- "\xf0\x3f\xa6\x0f\xfc\x47\x4a\xf8\xbf\x02\xf8\xff\xc6\x7e\xf0\x7f"
- "\x63\x5f\xf8\x1f\xe4\xb1\x98\xc8\xcb\x88\xff\xc8\x7e\xf0\x1f\xe9"
- "\x0f\xfe\x83\xe4\xff\x1b\x3d\xf0\x7f\xa3\x88\xff\xd1\x41\xe2\x7f"
- "\x8c\x1f\xf8\xf7\x67\x3c\x47\x2f\x8c\xe7\x74\xe1\x78\x8e\xfb\x1d"
- "\x91\x7e\xf0\x2f\x1f\xcf\x19\x2b\xc3\xbf\xbe\x0f\xfc\xdf\x34\x59"
- "\x1a\xcf\xf9\xe6\xf1\x3f\xb6\x1f\xfc\x8f\xed\x03\xff\x83\x3d\x76"
- "\x73\xd3\x65\xc4\xff\x4d\xfd\xe0\xff\x26\x3f\xf0\x5f\x19\x24\xff"
- "\x8f\xf5\xc0\xff\x58\x11\xff\x63\x82\xc4\xbf\x7e\x90\xc6\x7f\x7e"
- "\xd0\x88\xe3\x3f\xbc\x66\xdf\xce\xee\x62\xa3\x95\xcf\x33\xef\x08"
- "\x53\xe9\x89\x53\xb3\x3f\xd1\x92\x6e\x27\x33\x2f\x80\x4e\xd2\x2e"
- "\x90\x67\x2e\xe8\x70\x2f\xcb\x42\x0a\xfd\x7f\xc5\x3b\xa2\x70\x38"
- "\xf3\x26\xd6\x6f\x4e\x25\x6a\x57\x68\x95\xf0\x7e\x95\xe5\x8c\x83"
- "\x60\x9b\xd7\xa2\x0c\xce\xba\x65\x80\x63\x70\xf4\x2b\x83\xae\xd4"
- "\x08\x79\xba\xac\xa4\x19\xf0\x52\xd3\x6c\x05\xd9\xaf\x12\xb0\x85"
- "\xba\x80\xfa\xac\x29\x3b\x4f\xd4\xce\x7f\x45\x8c\x06\x1d\x87\x6b"
- "\x57\x12\x55\x64\x33\xe5\x51\x97\xa8\x23\xd4\xab\x7e\x15\xa5\x90"
- "\xef\x54\x1d\xe0\xdb\xf9\x2f\xc3\xe8\x52\xc8\x37\xf8\xe3\x32\x3f"
- "\x10\x9e\x7f\xc0\x67\x7a\x4d\x23\xc8\x32\x57\x1f\xa4\x9e\x7e\xe0"
- "\xcf\xfb\x2f\x7e\x8c\x53\xdc\xb2\x1e\xc7\x29\x78\x8d\x29\xca\x3f"
- "\x3d\x99\x0c\x8a\x77\x5a\x07\x5d\x4f\xb7\x44\xf9\xa7\xa7\x5b\xd6"
- "\x2a\xf5\x34\xd8\xe3\x07\xb7\x4c\x63\x7a\xba\x25\x92\xe9\xe9\xe6"
- "\xa4\xe0\xf4\x74\x4b\x50\xf3\x7f\x7b\xf7\xa7\x6f\x1d\x87\xfd\x69"
- "\xd0\x93\x9f\xf6\x64\x2a\x57\xbc\x83\x3b\xe8\x7a\x8a\xaa\xf1\x4f"
- "\x4f\xb7\xde\xea\xa1\xa7\x41\xee\xe7\x46\xd9\x98\x9e\xa2\x0e\x31"
- "\x3d\x45\x69\x82\xd3\xd3\xad\x7e\xbc\xff\xe1\x4f\xbf\xef\x87\x27"
- "\xb1\xdf\xc7\x43\xbf\xcf\x3f\x3d\x55\x18\x14\xef\x0c\x0f\xba\x9e"
- "\x7e\x98\xee\x9f\x9e\x7e\x58\xab\xd4\xd3\x60\xf7\xc7\x7e\x58\xc4"
- "\xf4\xf4\xc3\x14\xa6\xa7\x5b\xf7\x06\xa7\xa7\x1f\x5a\x07\xa7\x7f"
- "\x62\x58\x83\xfd\x13\xd0\x93\x9f\xf6\x54\x51\xae\x78\xc7\x79\xd0"
- "\xf5\x64\x88\xf4\x4f\x4f\x86\x17\x3d\xf4\x34\xc8\xfd\x06\x43\x2c"
- "\xd3\x13\xc4\x8d\x82\x9e\xfe\x6b\x4e\x70\x7a\x32\xf8\x5c\xff\x34"
- "\xb0\x38\xfa\xf6\x28\x8c\xa3\x79\x88\xa3\xfd\xd3\x53\xa5\x41\xf1"
- "\x4e\xf6\xa0\xeb\xe9\xb6\x43\xfe\xe9\xe9\xf6\x31\x4a\x3d\x0d\x76"
- "\x7c\x7b\x5b\x0b\xd3\xd3\x6d\x55\x4c\x4f\xb7\xa9\x83\xd3\xd3\xed"
- "\x7e\xcc\xff\xf4\xfe\x1e\x56\xef\x98\xef\x47\xf5\x57\x56\xcc\xf7"
- "\xa3\x34\xff\x74\xf5\xa3\x23\x97\x36\xe6\xfb\xd1\x56\xa6\xab\x1f"
- "\x25\x33\x5d\xdd\xbe\x27\x38\x5d\xfd\xc8\xe7\xfa\x8f\xfd\xbd\xbf"
- "\xd5\x3b\xee\x1b\xbf\xe6\xca\x8a\xfb\xc6\xfb\xc9\x7f\xe3\x5f\xbc"
- "\xb4\x71\xdf\x78\x91\xff\xc6\x8b\xfc\x37\x2e\x48\xfe\x1b\xef\x07"
- "\xff\x79\x7f\xef\xab\x77\xec\x77\xa7\xe1\xca\x8a\xfd\xee\xa8\xf6"
- "\x4f\x57\x77\xfe\xe0\xd2\xc6\x7e\x77\xb4\x32\x5d\xdd\x61\x66\xba"
- "\xba\x23\x24\x38\x5d\xdd\x39\x21\xd8\xf7\xc5\x7a\xc7\x7f\xd1\x57"
- "\x58\xfc\x17\xed\x67\xfc\x17\x7d\x89\xe3\xbf\x68\x31\xfe\x8b\x16"
- "\xe3\xbf\x3b\x83\x8c\xff\xa2\x83\x8a\xff\x3c\x74\x25\xda\xd5\x5d"
- "\xd9\x57\x56\x0c\x78\x97\xde\x3f\x5d\xdd\xf5\xd2\xa5\x8d\x01\xef"
- "\x9a\xca\x74\x75\x57\x04\xd3\xd5\x8f\x13\x83\xd3\xd5\x5d\x3e\xf7"
- "\xbf\xed\xef\xfd\xb4\xde\x71\xe0\x84\x71\x57\x56\x1c\xf8\x13\x3f"
- "\xfb\xbf\x13\x6e\xbd\xb4\x71\xe0\x4f\xc4\xfe\xef\x4f\xc4\xfe\xef"
- "\x4f\x82\xec\xff\x4e\xf0\xa3\xff\xeb\xcf\xb8\xdf\xc4\x3c\x8c\x01"
- "\x5d\x79\xfb\x76\x86\x81\xfc\xc3\x32\x08\xd7\x15\x09\xfa\xd2\x80"
- "\xbe\xd6\xe9\x49\x77\x1e\xe8\xcb\xe6\x24\x33\x97\x7e\x4a\xeb\x5a"
- "\x5d\xa4\x0b\x74\xd5\x09\x71\xa0\xc5\xd6\x82\xef\xe8\xfd\x77\x13"
- "\x37\xf1\xd6\xa7\x96\xea\x08\xea\x0b\xe5\xef\xd2\x4c\x84\x98\xb2"
- "\x6a\x8a\xa0\x3f\xcd\x81\x64\x67\x5e\x95\x7e\xc6\xb9\x4f\xe9\x12"
- "\x2b\xa5\xb5\xc9\x0e\xa8\xd3\x06\x6b\x6d\x72\x03\x89\x6b\x26\x23"
- "\xf4\xbf\x40\xbd\xdc\x7d\x0a\xd3\x2d\xb6\x06\x82\xeb\x7e\x0a\x63"
- "\xe0\x9f\x1a\xc2\x9d\xff\x30\x68\x70\xfd\x26\x7c\xaf\x50\x5a\xa3"
- "\xc9\x72\xb6\x48\xd0\xbf\xe7\x98\xaa\xa0\xff\x7f\x18\x74\x6f\xe0"
- "\xfb\x89\x83\x1e\x0b\xde\x2d\x8c\xff\xf1\x9f\x46\x8c\x96\xea\xb8"
- "\x24\x85\x52\xa8\xe3\xa8\x3a\xbb\x8d\x60\x3d\xeb\xec\x66\x92\x95"
- "\x4e\x74\x75\x5d\x2d\x24\xd3\x4e\x6d\x75\xd9\x5f\x90\xb8\x0b\xf8"
- "\x5c\x00\xf1\x34\x71\x0c\xd3\xf7\xdd\xd3\xf8\x4f\x0d\xa3\xad\xdc"
- "\xc4\xf0\xba\x7a\x42\xc2\xd6\x81\xac\x9d\x84\x13\xde\xd7\xe4\x48"
- "\x08\xc8\x2b\xd9\x92\xdd\x44\x40\x76\x3b\x2c\xce\x7f\xa2\x3c\x93"
- "\xe1\xfc\xa4\x9e\xe7\x0d\xa1\x55\x6f\x61\x1a\xca\x16\xe7\x99\x5a"
- "\xd2\x6c\x42\x1e\xe9\x3c\xd3\x5d\x36\xb1\x64\x74\x91\x3a\x27\x21"
- "\x80\x0f\xfb\xb1\x84\x06\xc0\xd7\x84\x20\x79\x7b\x62\xd1\xe0\x8c"
- "\x57\xc6\xb4\x62\xdc\xea\xca\x33\x45\xb1\x3a\x0e\x6f\xeb\x1f\x5f"
- "\x26\x83\x1b\x5f\x31\xaf\x0c\x0c\x5f\x31\x77\x0f\x2e\xbe\x06\x3b"
- "\x7e\x8d\x21\x03\xc3\x57\xcc\x5a\x86\xaf\x9f\x96\x33\x7c\xc5\xa4"
- "\xbb\xf1\x35\xbc\xed\xd2\xe1\xeb\xa7\xf1\x0c\x5f\x3f\x0d\x0f\x0e"
- "\x5f\x31\x8e\xc1\x19\x67\xfd\xef\xe9\x18\x6b\x03\xbe\x44\xfe\xba"
- "\xa6\xc9\x0f\x7c\xc9\xf8\xeb\xde\xcf\x07\x86\xaf\x7b\x7f\x33\xc8"
- "\xf8\x1a\xe4\x98\xfb\xde\xc4\x81\xe1\xeb\xde\xd3\x0c\x5f\xf7\x86"
- "\x30\x7c\xdd\x7b\xd2\x8d\xaf\x6b\x9a\x2e\x1d\xbe\xee\xd9\xcb\xf0"
- "\x75\x4f\x7a\x70\xf8\xfa\xef\xa0\xd6\xbf\xea\xdd\x3f\x98\xbc\x0b"
- "\xfb\x07\xae\xbc\x0a\x91\xbf\xae\x3d\xd1\x3f\xbe\x2a\x64\xfc\x35"
- "\xf9\xc1\x81\xe1\x6b\xd2\x85\xc1\xc5\xd7\x60\xf7\x13\x26\x99\x07"
- "\x86\xaf\xc9\x93\x19\xbe\x26\x25\x33\x7c\x4d\x9e\xe0\xc6\xd7\xb5"
- "\x27\x2e\x1d\xbe\x26\x85\x33\x7c\xfd\xf7\xc9\xe0\xf0\x35\xd9\xf7"
- "\xfa\xcf\x01\x8d\x6b\xc7\x6a\xb0\x4f\x03\xf8\x12\xf9\x6b\x62\xae"
- "\x1f\xf8\x92\xf1\xd7\x7d\x6f\x0f\x0c\x5f\xf7\xcd\x1e\x64\x7c\x0d"
- "\x72\xdf\xe6\x3e\xfd\xc0\xf0\x75\x5f\x09\xc3\xd7\xcf\xaa\x19\xbe"
- "\xee\xdb\xea\xc6\xd7\xc4\xdc\x4b\x87\xaf\x9f\xa5\x33\x7c\xfd\x6c"
- "\x42\x70\xf8\x8a\xf5\x63\xfd\x57\x7f\xc6\xe3\xa7\xa4\x60\x3f\xcc"
- "\x95\x57\x29\xf2\xd7\x53\x53\xfa\xc7\x57\xa5\x8c\xbf\xa6\x0c\x1f"
- "\x18\xbe\xee\xff\xcb\xe0\xe2\x6b\xb0\xfb\x63\xf7\x67\x0f\x0c\x5f"
- "\xf7\xbb\x18\xbe\xee\x37\x30\x7c\xdd\x6f\x77\xe3\xeb\xa9\x29\x97"
- "\x0e\x5f\xb1\x27\x19\xbe\x62\xb7\x06\x87\xaf\x29\x7e\xac\xff\xe3"
- "\xef\x73\x84\xa9\xf5\x03\xeb\x43\x4e\x5d\x38\x30\x8c\x4d\xbd\xe1"
- "\xca\xee\x43\x3e\xd0\x3c\x30\x8c\x4d\x9d\xc7\x30\xf6\x40\x1e\xc3"
- "\xd8\xd4\x84\xcb\xd3\x87\x7c\x20\x86\x61\x6c\x8a\x23\x38\x8c\x4d"
- "\x1d\xc4\xe7\x1f\x3f\x9f\x30\xb0\x7e\xe4\x43\xb5\x03\xc3\xd8\x43"
- "\x6b\xaf\xec\x7e\xe4\x43\xd3\x06\x86\xb1\x87\x0e\x33\x8c\x3d\x68"
- "\x63\x18\x7b\xa8\xea\xf2\xf4\x23\x1f\x2c\x66\x18\x7b\x30\xc8\xe7"
- "\x36\x3f\xf7\x63\xfe\x9b\xbf\xcf\x6d\x1e\x2e\x1a\x58\x5f\xf2\xe1"
- "\x1f\x0f\x0c\x63\xd3\x3e\xbb\xb2\xfb\x92\xd3\x76\x0d\x0c\x63\x0f"
- "\xdf\xc6\x30\x36\x2d\x9e\x61\xec\x61\xfd\xe5\xe9\x4b\x4e\x23\x0c"
- "\x63\x3f\x37\x07\x87\xb1\x87\x77\x0e\xde\xf3\xa6\x47\x9d\x03\xeb"
- "\x4f\x3e\xfa\x9b\x81\x61\xec\xd1\x07\xaf\xec\xfe\xe4\xa3\xba\x81"
- "\x61\xec\xd1\x7c\x86\xb1\x47\x4c\x0c\x63\x8f\xae\xbf\x3c\xfd\xc9"
- "\x47\x92\x18\xc6\x1e\x89\x0a\x0e\x63\xd3\xfd\x58\xff\xdf\xdf\xe7"
- "\x64\x33\x13\x07\xd6\xa7\x9c\xd1\x39\x30\x8c\xcd\x78\xe7\xca\xee"
- "\x53\xce\x48\x1f\x18\xc6\x66\x7c\xcd\x30\x36\x23\x92\x61\x6c\x46"
- "\xcb\xe5\xe9\x53\x4e\xaf\x66\x18\x9b\x9e\x13\x1c\xc6\x66\xa6\x0c"
- "\xde\xf3\xbd\x59\x87\x06\xd6\xaf\x9c\xf5\xf4\xc0\x30\x36\x4b\x7b"
- "\x65\xf7\x2b\xe3\x1a\x06\x86\xb1\x59\xb3\x19\xc6\xe2\xb2\x19\xc6"
- "\x66\x4d\xbf\x3c\xfd\xca\xb8\x71\x0c\x63\x33\x83\x5c\x8f\x62\x56"
- "\xaf\xf5\xaf\x16\xa6\xae\x98\x97\xb2\x30\x49\xbf\x30\x35\x7d\xd9"
- "\x52\xfd\xf2\x85\xab\x16\x4c\xbe\xf5\xc5\x71\xfa\x65\x19\xfa\x65"
- "\x0b\x53\x9f\x17\x13\x92\x46\x92\x5f\x2c\x48\x99\x97\x81\x29\x90"
- "\xfb\xf9\xd4\xc5\x0b\x52\xd3\xf5\xcb\x16\x2c\x7d\x71\xe1\xb2\x05"
- "\xf8\x7d\xb9\xfe\xb9\x25\xcb\x20\x61\xfe\x82\x85\x2b\x16\xe8\x9f"
- "\x7d\xf1\xb9\xe7\x16\x2c\x5b\x3e\x92\xcc\x78\x31\x25\x7d\x61\x5a"
- "\xca\x02\xfd\xd4\x19\xf7\x8f\x8f\x7f\xf0\x97\xf1\xf7\xdd\x87\x9b"
- "\x93\xc9\xf6\x26\x8b\xa4\x79\x07\x12\x01\x73\xea\x33\xdc\x93\x2f"
- "\xd5\x45\x10\x61\x7f\xdc\xcd\x6d\x44\xb7\x69\x19\x51\xe7\xb4\x91"
- "\x90\xfc\x36\xa2\xd1\x2f\x22\xb1\x74\x13\x8f\xe9\xe1\x34\x7f\xa2"
- "\x8e\x16\x6c\x68\x81\xcf\x59\x36\xed\x4d\x42\x5e\x9a\x3f\x36\x06"
- "\xcf\x81\x6c\xd5\x90\x6e\x6a\xe2\x9e\x8c\x81\x73\xd6\xac\x2f\x08"
- "\x47\x47\xfe\x82\xbc\xcb\xdb\xb8\x03\xc8\x2a\xd0\x76\xc2\xfd\x32"
- "\x02\x0e\x35\x1c\x7b\xe1\x38\x04\x47\x3d\x1c\x0e\xc2\xc5\x13\x38"
- "\xc2\xe1\xd0\xc3\x31\x0e\x8e\x09\x70\x4c\x82\x63\x2a\x1c\xd3\xe1"
- "\xa8\x86\xa3\x05\x0e\xc8\x3b\x5b\xc7\xca\x99\x1d\x09\xc7\x34\x38"
- "\x0a\xe1\x80\xb2\x1e\x37\xc3\xd1\x4a\xb8\x5f\xe5\xc1\xa1\x81\xc3"
- "\x00\x47\x34\x1c\xf1\x70\x40\xcf\x7b\xb6\x9e\x9d\x4b\x80\xb4\x84"
- "\x14\x02\xf5\xec\xff\x48\xc0\xfc\x5b\xe1\x30\x11\xee\x09\xb8\xe7"
- "\x13\x6b\xe0\xa8\xf1\xc8\x17\x2e\xfb\x1e\xdd\x4f\x99\xb3\xc2\xd6"
- "\xdd\x64\x15\xf6\xc0\xe3\x7e\xf9\xa2\xcb\x48\x86\xb9\xf2\x6f\xb2"
- "\xa6\xdd\x4e\x54\x67\xb9\x5f\xde\x6f\x59\x8f\x3c\x33\x51\x27\xec"
- "\xe9\x08\xbf\x51\x66\x1d\xb9\xbf\x8c\xb5\x92\x2d\xd3\x70\x4f\xb3"
- "\xc0\xf0\xf6\xcb\x58\xf1\xfa\x6c\xab\xea\x76\x83\xb0\x07\x5c\x6e"
- "\xfb\x54\x9a\x95\xf0\x86\xb0\xf7\x1b\xca\x10\xed\x20\xa7\xad\x98"
- "\x86\x9c\x8b\x44\x9b\x37\xaf\x12\xea\x75\x03\x35\x92\x50\xb8\x3e"
- "\x82\x42\xdd\x6c\xda\x0d\x2d\x50\x4f\x35\xfe\x86\xba\x92\x4e\xad"
- "\x39\x16\xbf\x3b\x4a\x8c\x69\x34\xcf\x8c\x36\xc5\x99\x33\x5f\x23"
- "\x4d\x70\x5d\xa7\xf6\x60\x88\xfe\x91\x30\xda\x84\xd7\x1a\x09\x07"
- "\xf9\x76\x31\x5b\xfd\x65\x44\xa7\x76\x83\xcd\x55\x74\x30\x1a\xd2"
- "\xd5\xae\xfc\x0d\x2d\x62\xf9\xc0\x93\x55\x3a\x2b\x17\x1f\x22\xa4"
- "\x17\x1b\x73\xa4\xef\xf0\xa9\x76\x15\x98\xf7\xe0\xa7\x76\x1d\xb1"
- "\x0b\xbf\x8d\xb1\x84\x7d\xea\x88\xfe\x11\x42\x5a\xb9\xf8\xdd\x77"
- "\x56\x13\x95\xf9\x11\xac\x77\x7c\x46\x56\x35\xe5\xf5\x99\xc3\xe0"
- "\xfe\xf1\x2f\xf5\xdc\xf7\x86\x83\x06\xdc\x3f\x95\xe6\x3e\xa6\x2b"
- "\x7b\x8d\x10\xbc\x16\xeb\xb6\x6d\x14\x51\x97\xbc\x46\x42\xb0\x8d"
- "\x1d\xb9\xf1\x3b\xa5\x7d\xe8\xf0\x1a\x0e\xf2\x3f\xfc\x70\x16\x95"
- "\x95\xbd\xd4\xc5\xda\x13\xce\x64\x1a\x7f\xd2\xaa\xfa\xaf\x28\xcc"
- "\xaf\xbf\x59\x90\xe5\x0d\xe2\x79\x94\x91\x15\xcb\xa7\xf9\x07\x12"
- "\xf1\x37\xee\x73\x17\x06\xe8\xd5\x67\x46\x99\x98\x8c\xcc\xc9\x58"
- "\x0e\xe6\xa7\x05\xfb\xf1\xbb\x89\xe6\x0b\x32\x36\xe8\x53\x49\x6c"
- "\x13\x37\xfb\x7e\xd7\x26\xbb\x1a\xca\x00\xbb\xb3\x87\x40\xfe\x6c"
- "\x41\xde\xf9\x55\xd0\xf6\xd9\x13\xe0\x5c\x48\xcf\xde\x97\x4c\xce"
- "\x2a\xc8\x17\xd1\x91\x3b\x3b\xd9\xaa\xba\x2f\x46\xd0\xf3\x0a\x7a"
- "\x12\xf7\xd8\x6c\x5f\x41\x9d\x71\xce\x4f\x79\xe0\x2a\x02\xe7\x73"
- "\xac\x64\x6a\x88\xd4\x46\xa6\xfb\x9e\x72\x6e\xc0\xdf\xb6\x11\x42"
- "\x39\x7b\xbc\x95\x03\xf7\xce\x98\xeb\xd4\xab\xba\x2e\xd2\xfa\xcd"
- "\x8f\xa3\x1c\x09\xed\x5a\x41\x6b\xd6\x4e\xa3\x8e\x82\x13\x84\xd4"
- "\x26\x37\x12\xb0\xf9\xc8\x50\x15\xb5\xc5\xbd\x44\xc2\x42\xd3\xc2"
- "\xe8\x91\xea\x46\xb2\x7a\x1a\x6d\xc1\x7d\x7f\xeb\xec\xcd\x64\xcd"
- "\x27\x44\x93\x55\x4b\xc2\xd7\x4c\xa3\xb6\x9a\xc4\x46\xc2\xd2\x6b"
- "\x49\xd6\x67\x44\xbd\xfa\x10\x75\xcc\x04\xfe\x3f\xd6\x88\xe9\xcd"
- "\x04\xf7\xa8\xcc\x6a\xa1\xce\xcc\xa7\x89\x06\xbf\xd7\x1e\xc2\xf4"
- "\xcf\x49\xd6\x39\xa2\x8e\xcb\xb0\x85\x95\xc2\x3d\xf1\xfa\x32\xa8"
- "\x0b\x7f\x91\x56\x6d\xbe\x48\xc8\xea\x27\x48\xc4\x9a\x79\x44\x17"
- "\xe7\x22\xd4\xe2\xfc\x0b\x89\x73\x51\xf0\x2f\x87\xc9\xda\x85\x24"
- "\x24\xce\x89\xef\xb1\x9d\x22\xb8\xef\x77\x19\xe4\x85\xb6\x99\xb1"
- "\x6d\xab\x4f\x93\x08\xdc\x07\x9d\x5d\xf3\xbe\x78\xcd\x69\x82\x32"
- "\xeb\xd4\x4e\x8c\x75\xe4\x4f\x34\x43\xdb\xd7\xa0\x0c\xe0\x3e\xf5"
- "\x3c\x5e\x07\xd7\x6f\x5e\x26\xc8\x40\x35\xd7\x49\x34\xae\xfc\xfd"
- "\x2d\x73\x33\xcc\x42\xb9\x56\xee\x71\x53\xd9\x32\xa1\x4e\x8a\xbc"
- "\x71\x4e\xda\x6e\xd3\xee\x07\xdc\x3f\x6e\x8d\xcb\xb8\x8f\xe2\xb5"
- "\xa0\xcb\xf0\x8e\xdc\x5f\xe9\x25\x79\x4b\x7a\xb1\x72\xbf\x0a\x07"
- "\x5d\x84\x0f\x4b\x23\x6a\x38\x1f\x6b\x55\x4d\x09\x97\x61\x6d\x17"
- "\xe8\xfc\x2a\x29\xaf\x98\x27\xc9\xaa\x8a\x9d\x23\xcb\x83\xf8\xea"
- "\xc9\x03\xe7\xd7\x5b\x55\xf7\x27\xb1\x7b\xfc\x6a\x2a\xe6\x11\xb9"
- "\x5f\xca\x3b\x8c\xe6\xb4\xda\x5c\x5a\x73\x1a\xe5\xa8\x83\xe6\x6f"
- "\x0c\xa1\xed\x11\x9a\x99\x4e\xea\xe0\xf3\xf7\x23\xcf\x6b\x70\x5f"
- "\x57\x96\x3f\xe1\x3a\x38\xaf\xd3\xaf\x10\xbe\x1b\xf0\x3e\x34\x6f"
- "\xa3\xae\xe7\x9c\x91\x0c\xa7\x25\xc6\x44\xf0\x1d\xba\xb8\x6a\xea"
- "\x70\xe5\x6f\x4c\x2c\x58\x86\xbe\xc3\x9c\x88\x76\xcd\x6b\xab\x22"
- "\x1c\xdb\x0e\xea\x90\x9f\xd0\x46\x68\xde\x7e\xb1\xdc\x5f\xee\x46"
- "\xbb\x61\x5c\xf3\xab\x56\x17\x94\x01\x75\xb2\xc3\xb9\xe1\x4d\x5c"
- "\x42\x22\xbe\x4f\x4a\x73\xce\x8d\x13\xf6\xbd\xe4\x12\x16\x30\xfc"
- "\xb6\xda\x14\xbf\x39\xc1\xe6\x4d\x14\x38\x0b\xf9\x01\xd2\x5f\x71"
- "\xdb\xb0\x20\x37\x8e\x71\xd1\x7e\x1d\xe3\x91\x61\x3c\xe4\x53\x35"
- "\x89\xf6\xd8\x39\xc2\xae\xe9\xc8\x4d\x00\xfc\xff\x60\xa7\xc2\x4e"
- "\x72\xbf\x28\xc4\x3d\x36\xa1\x2e\xc3\xa0\xcc\xd3\xf0\x79\x35\x7c"
- "\x7e\xf6\x51\x35\xea\x5b\x28\xf7\x1a\xfc\xbe\xed\x7a\x6a\x9b\xfa"
- "\x20\xc1\xfd\x34\xc1\xde\x12\x1c\x56\xb2\x54\x83\xe5\x6c\xc2\x7d"
- "\x46\x21\x0d\xf3\x74\xe4\x3e\xa1\x83\x74\xa7\x58\xbe\xc9\x0e\x75"
- "\x55\x96\xff\xc4\xdd\xac\x7c\x56\x2e\x96\x27\x95\x5d\xf2\x3a\x6d"
- "\x65\x65\x3f\x11\x2f\x95\x9d\x0f\x69\x52\xf9\x53\x17\xf7\xdc\x23"
- "\x1d\xce\xaf\x97\xb7\xa1\xe8\x75\x6a\xc7\x32\xe0\x5c\xa1\x95\xbc"
- "\x62\xc3\x73\x39\x90\x86\xd7\xca\x70\x35\xec\xa3\x69\x50\xc6\x21"
- "\xa1\x0c\x93\x95\xac\xcf\xf0\xe0\x38\xad\xc4\x71\x62\x59\x8d\x52"
- "\x59\xb2\x72\x44\x3c\x39\x76\x88\x7a\xc5\x72\x35\x58\x6e\x47\xee"
- "\x93\x1a\x2b\x59\x5e\x23\x6f\x7b\xe7\x88\x76\xa7\x78\xce\x00\x72"
- "\x4f\x52\xda\xc1\xec\x70\x5a\x60\xce\x40\x8e\x13\xcb\xba\x1f\xf9"
- "\x5a\x3a\x8f\x7b\x90\x02\xaf\xc7\xa0\x2d\x09\xdc\x9e\xbf\x1f\xea"
- "\xf4\x64\x9a\x07\x97\xab\x31\x9f\x2b\xf7\xb1\xc5\x25\xb8\x07\xeb"
- "\xf5\xb4\x05\xf2\x6c\x55\xec\x3b\xca\x91\x9f\x41\x5a\xcf\xfe\xa7"
- "\x05\x90\xc7\xca\x3d\xb6\xc3\x57\x9f\x20\xf3\x07\x84\xb3\x14\x5b"
- "\x31\xb6\x46\xcc\x4d\xb2\x44\xda\x89\xa5\x98\x27\x7c\xa9\xb1\x30"
- "\x36\x93\x9a\xcf\x70\x4f\xdd\x8a\xfb\x59\x07\xe6\xaf\x9f\x64\xfb"
- "\x7f\x76\x41\xcc\xb9\xe6\x2e\x82\x3e\xfa\x3c\x37\x67\xb6\xc5\xd6"
- "\x26\xd8\x07\x7c\x17\xe2\x81\x2d\x10\xa3\x62\x9c\x0a\x7d\x83\xe4"
- "\x42\x8e\xc5\xaa\x3c\xe4\x2d\xc5\x74\x8c\x63\x81\x43\xcb\x64\xe7"
- "\x68\xa9\x71\x1a\x93\xdd\x1c\xad\xe0\x2b\xb0\xbe\xce\x9f\x9b\xb1"
- "\xce\x7c\xb1\x71\x1a\xb6\x21\x2b\x83\xf2\x16\x67\x87\x19\x79\x56"
- "\xbf\x02\x63\xec\xa7\xbe\x88\x2b\x21\x94\x2f\x31\x4e\x0b\xac\x0d"
- "\x4f\x09\x7b\x8f\x43\x3f\xe2\xbc\x6d\x8c\x71\x1a\xee\x03\xbd\x39"
- "\x73\x78\xc8\x03\xc5\xd4\xdc\x3e\xd6\x58\xd8\x91\x3b\x47\x23\xed"
- "\xb3\x1b\x58\xb9\x73\x34\x52\xdb\x4b\xc5\xb6\xc3\xbd\x84\x3e\xdb"
- "\x9d\x45\xc2\xfe\xdf\xf0\x7b\xce\x54\x5f\xfa\x02\x8e\xc9\xc0\x6b"
- "\xa1\xed\xb1\x65\x92\x9c\x9c\x36\xdc\xff\xfc\xda\xb3\xdc\x9c\x4f"
- "\xe2\xd6\x98\x89\xb0\xa6\x7f\xfe\xfe\x8c\x00\xeb\x25\x8c\x7f\xd5"
- "\x41\x1f\x26\xce\xf9\x21\x65\x9c\xf8\xb4\x6a\xa6\x58\x1e\x9e\x93"
- "\x74\x55\x2a\xf6\x2d\x02\xbf\xc7\xd3\x3e\xc7\x3f\x64\xed\xd2\xf5"
- "\x6e\xd7\xd3\x7f\x0c\xbe\x5d\x4f\xaf\xf1\xd2\xae\x4f\x06\xb9\x5d"
- "\x56\x3f\xda\xa5\xef\xdd\xae\x67\x36\x05\xdf\xae\x67\xe2\x7b\xb7"
- "\xeb\x99\x3f\x0e\x6e\xbb\x9e\xf1\x39\xff\x41\xd6\xae\xe8\xde\xed"
- "\x9a\x3b\x2f\xf8\x76\xcd\x1d\xd7\xbb\x5d\x73\x37\x0d\x6e\xbb\xe6"
- "\xfa\x7c\xff\xd7\x27\x1f\x16\x98\xcd\x8c\x0f\x13\xef\x0e\x9c\x0f"
- "\x13\x49\x6f\x3e\x9c\xb7\xc0\xcd\x87\xf3\x1e\x0b\x8a\x0f\x0b\x36"
- "\x8a\xf1\xc6\xbc\x31\xbd\xf8\x30\x6f\x23\xf1\xce\x87\x89\x9d\x02"
- "\x1f\xe6\x6f\x0c\xb4\x0d\x87\x7a\xf8\x50\xbb\x91\x28\xf8\x30\xd4"
- "\x6c\xee\xc8\x9d\x17\x19\x1c\x1f\xce\x8b\xec\xcd\x87\x89\x6b\x94"
- "\x7c\x38\x2f\xbe\x0f\x1c\x3a\xbc\xf1\x61\x9c\xf3\x2b\x2a\x62\xc3"
- "\x11\x60\x7d\x76\xf5\x71\xaf\xec\x7e\xee\x95\x1d\xd8\xbd\x9e\xf5"
- "\x39\xff\x03\xfa\xb1\x3a\x88\x41\x74\x6b\xdf\x24\xdc\x19\xe8\xa9"
- "\xd7\x45\x36\x40\x1f\xc1\x41\xee\x48\x03\x4c\x18\xc9\xa4\xba\xe2"
- "\x56\x52\x17\x79\x86\xd0\x11\xe7\x74\xf4\x7f\xb7\xe8\x62\x97\x21"
- "\x36\x9f\x3d\x6e\x49\x77\x04\xa8\xd7\x67\x8b\x25\x6c\xd6\x39\x01"
- "\x9b\x2b\x10\x8f\x49\x2a\x4b\xeb\x59\x11\x9b\xf3\xcf\xf5\xe8\xc7"
- "\xc8\xf0\xe9\x15\x9b\x60\x13\x4a\x6c\xee\x4f\x63\xd8\x9c\x5f\xd1"
- "\x1b\x9b\xfb\xd3\xbc\x63\x73\xfe\x6f\x18\x36\xf7\xa7\x05\xd6\x86"
- "\xf9\x89\x6e\x6c\xee\x4f\x53\x60\xf3\x87\x5b\x74\x1d\xb9\xf3\x4d"
- "\xc1\x61\x73\xbe\x49\x6a\x7b\x89\xd8\x76\x48\x8b\x50\x62\x73\xbe"
- "\xcd\xa7\x0e\x73\x3e\x49\x00\x3e\xd4\x9c\xe5\x92\xcc\x2e\x88\x69"
- "\xf9\xbc\x5b\x1c\xd0\x27\xeb\xc0\xfd\xe4\x29\x37\x81\xd0\x95\x06"
- "\x4d\x07\xf4\x8d\x3b\x3a\x92\x43\xe8\xc8\xd6\xed\xb4\x3b\x02\xed"
- "\x2a\x8c\x76\x18\x42\x41\x66\x51\xf0\x39\xaa\x64\x05\x09\x87\x23"
- "\xa2\x44\x94\x2b\x7c\x8f\xa6\x2b\x23\x46\x16\xac\x20\xe3\xc2\xec"
- "\x24\x04\xea\x90\x10\xb6\x4e\x47\xc2\x9c\x24\x1c\xbf\x53\xe3\x47"
- "\x6a\xe8\xbb\xa9\x71\x5c\x94\xd7\xc2\xfd\x32\xc2\x28\x5d\x6e\x20"
- "\xd0\x8f\x0b\x01\x1d\x44\x94\x71\x74\x8f\x6b\xa5\x81\xa3\xa1\xe6"
- "\xd5\x74\x75\x82\x50\x27\x3e\x6a\xcb\x2c\xc0\xd0\x2c\x9a\x95\x8c"
- "\xf7\x8d\xc5\x7d\x8d\xe9\x0f\xb7\xc4\xd3\x8e\x88\x91\xf9\x17\xc9"
- "\xb8\xb2\x15\x24\xaa\x74\x05\x31\xd0\x6e\x03\x07\x32\x48\x78\x66"
- "\xa9\x0e\xf5\x0e\x6d\x80\x7b\xad\x80\x7b\x81\x2e\x5d\xf9\x70\x2f"
- "\x27\xdc\xeb\x2b\xb8\xd7\x79\x82\xe3\x1e\x11\x65\x46\x76\xaf\xc0"
- "\x64\xbe\x60\x5c\x5f\xe3\xd7\x71\x6b\xc7\xe2\x3a\xbb\xff\x0e\xcb"
- "\xb8\x7a\x1a\x8e\x65\xb7\xaf\x4e\x0e\x10\xef\x0b\x7c\xbe\xff\xb2"
- "\xf9\x5d\x12\x49\x35\x63\x0d\x33\x5f\xf9\x94\x62\x1f\xfb\x95\x77"
- "\xc9\x38\xb4\xb9\x3a\xc7\x39\x42\xb5\x63\x0d\x87\x0d\xad\x81\xde"
- "\xcb\xe7\xfc\xe7\x5c\x23\xad\xef\x8e\x84\x7e\x61\x9e\x39\x67\x33"
- "\x47\x33\xba\x22\x8d\xd9\x47\x4f\x76\x91\xb9\x19\x38\x5e\x4e\x33"
- "\xf4\x4f\x92\x90\x26\x2e\x65\x57\xd6\x27\x38\xf6\xf8\xdc\x1a\xe5"
- "\xd8\xe3\x73\x3b\x08\x97\x3c\x95\x70\x0b\xd3\x09\xb7\xc8\x49\x20"
- "\x9f\xc7\x31\x21\xee\x9d\xb1\x24\xd3\x49\xff\x0d\xfd\xd9\x84\x02"
- "\xe8\x07\xc7\xdd\xa6\xb2\x9a\x57\xe0\x58\x5c\xf2\x64\x90\xdf\x97"
- "\xe0\x83\xc2\xf0\x3b\x96\x97\xb6\x8c\x7c\xef\x2c\x97\x3c\x29\xcc"
- "\x7e\xf5\x34\xa7\xc6\x5c\xee\x84\xfe\x5b\x77\xc4\x41\x5d\x67\x9e"
- "\x39\xb1\x1b\xfb\xb4\xcf\x22\x0f\x3c\x7f\x77\x98\x2a\x1b\xfa\xda"
- "\xb7\x38\x28\x8d\xc0\xf1\xe5\x84\x62\x38\x50\xf7\x82\xde\x47\xb6"
- "\x4d\x45\x7c\x20\x16\xcb\x58\xba\x0e\xf1\xb8\x59\xf4\xd9\xb6\x61"
- "\xb7\x27\xa2\x0d\xb8\xe0\xfa\xac\xcf\x49\xa4\xa5\xd1\x45\x00\xd3"
- "\x09\x73\x5d\x21\x68\x47\x09\xe6\x27\x4f\x90\x33\x69\x84\xcb\xfa"
- "\x9a\x68\x01\x43\x1a\xb4\x07\x1e\xec\x21\xae\x31\xcc\x01\x76\xcd"
- "\x67\x5e\x20\x61\xc8\x13\xb8\x86\xb3\xa5\xd5\x4a\xf8\xaf\x0c\xa1"
- "\x6f\xa4\x92\x70\xe7\x57\xc9\xa3\x6c\x5f\x25\x7f\x6f\x1b\x4f\xc2"
- "\x43\xd3\x88\xae\x24\x15\xb0\xbb\x04\xec\xe3\x3c\xd8\x47\x2b\xb3"
- "\x8f\x1e\xbc\x6e\xf8\xd7\x1e\x7c\x3f\x48\xb0\x8d\x7c\xd1\x36\x56"
- "\x02\x5e\x57\xb8\x6d\xc3\xb9\xc4\xc0\x95\x70\x94\x40\x1d\x41\xee"
- "\x0b\x52\xca\x32\xaf\x46\xde\x27\x74\xac\xd1\x06\xbc\x0b\x6d\xa5"
- "\xce\xf7\x40\x17\xc3\x6f\xe3\xf4\x34\xdf\x5c\x7e\x74\x56\x0b\x71"
- "\xf7\xe9\x52\x76\x77\x8d\x31\x66\xeb\x7f\x41\xbf\x6a\xe2\x92\x27"
- "\x40\x7a\x88\xfe\xf1\xff\xd2\x81\x1e\x77\xb3\x3e\x60\xca\x2e\x1c"
- "\x4f\xb0\x72\xc9\xb8\x1e\x10\xc1\x67\x28\xc7\x84\xf1\xd3\x85\x29"
- "\x90\x97\xb8\x40\xe6\x4e\xcd\x46\x1d\xaf\x31\x67\x98\x17\x75\x09"
- "\xb6\xd9\x0d\x3a\x38\x93\x42\xb8\xb9\xad\x20\x1b\x17\xc8\xa6\x43"
- "\xe0\x8c\x59\x02\x67\xe4\xb4\x6e\x5d\x63\xa5\x7c\x5c\xd2\x30\x0a"
- "\x72\x09\xc1\x31\xa4\x67\xd2\x08\x5d\x7b\x0e\x64\x64\x6f\x40\x7e"
- "\x09\xe5\x57\x32\x0e\x79\x03\xe4\xa3\x6d\x25\x3a\x5a\x70\x93\xed"
- "\xdd\xcc\xea\xe1\x2e\xc0\x39\xf2\x48\xd8\x3a\xd5\x08\xd0\x55\x68"
- "\x1e\xda\x39\xd8\x7d\xd8\x3a\x81\xd7\x04\xdd\x3a\x57\x1a\x6e\xee"
- "\x5e\x69\xd0\xc3\x31\x56\xe2\x1a\xdc\x37\xac\x04\x79\x26\x77\xc1"
- "\x49\xe4\x19\x4b\x86\x95\x38\x41\x96\xa1\xe8\x97\x56\x1a\x22\x05"
- "\x99\x3e\x0f\x32\x7d\x8e\x84\xdc\xe9\x20\x2a\xa8\x97\x0e\xea\x4c"
- "\x6a\x93\x9b\x08\xca\xd8\x05\x76\x84\x72\xee\x46\x0e\x02\xac\x41"
- "\x9c\xa2\x9b\xb1\x50\x4f\x0e\x1b\x4e\x11\x5c\x07\x2a\xab\x93\x7e"
- "\x86\xe3\xb7\x96\x0c\x27\xd8\x9c\xb9\x1c\x65\x0b\xf2\xd2\x1c\x9d"
- "\xe5\x20\xbe\x31\xbd\xe8\x82\x1b\xd3\x8b\x2e\xb8\x31\xbd\xc8\x2e"
- "\x3c\xff\x90\xe1\xba\xb3\x08\x70\xad\x91\xe3\x7a\x91\xf6\x92\xe2"
- "\x7a\x66\xe0\xb8\xde\x76\x5e\x86\xeb\xcc\x6f\x06\xd7\xc7\x12\x04"
- "\x5c\x0f\xeb\x1e\x23\xe0\x55\x67\x71\xfe\x89\x58\xb9\x45\x56\x09"
- "\xb7\x47\x7e\x8f\xb8\x4d\x89\xba\x52\x71\xdb\xd9\x61\xd0\xc3\x31"
- "\xe8\xb8\x85\x32\xfd\xc6\xed\xb1\x84\x2e\x22\xc9\x0f\xf1\x4b\xf3"
- "\xc6\x1a\xf4\x59\xe4\x3e\x90\xdb\xae\xb0\x75\x63\x49\x2d\x93\xe1"
- "\x2e\xfd\xe3\x94\x07\x8e\x78\x1a\xf1\xd4\x65\xa4\x94\xd7\x54\x45"
- "\x64\x1d\x27\x3a\xb8\x47\xa2\xc5\xb9\x9b\x84\xa5\xe1\xf3\xa8\x0d"
- "\xb8\x27\x93\x49\x78\x66\xc5\x11\x35\x9f\x3f\x36\x06\xc7\xae\x70"
- "\x6c\xd1\x95\x7f\x20\x91\xdf\x04\x7d\x14\xed\x44\x1d\x3e\xcf\xa2"
- "\xda\x9b\x48\x47\x6e\xca\x2e\xe9\x59\x8b\xd7\xd8\x44\x73\x20\x11"
- "\xec\x45\x7d\x86\x5b\xfc\x0e\x7c\x72\xf0\xf9\x20\x7c\x0e\x83\x4f"
- "\x61\xdf\xba\xc0\xfc\x5c\x8a\xd0\xff\x05\x5f\xb6\x57\xe4\xc1\xcf"
- "\x04\x1b\xbc\x9d\x68\xcf\x8a\xdf\x3b\x72\x17\x4f\x92\x9e\xdd\xb8"
- "\xf3\xf7\xc8\xa3\x01\xef\x0d\x32\x51\xb3\xe7\x49\xec\xb7\xac\xbc"
- "\x4f\x84\xdf\x44\xad\x87\x3e\x8f\x1e\x9f\xfb\x02\x96\x54\x1d\x34"
- "\xf9\x67\xe2\xe7\x64\xc4\x2a\x8e\xc1\x62\x9c\x27\x72\xad\x55\xbc"
- "\xef\x5e\x2b\xf7\x5c\x8c\xfc\xbe\xde\xe4\x61\xe5\x16\xfb\xdc\xd3"
- "\x27\x30\x59\x2c\xf6\xb9\xff\xe3\x83\x06\x17\x0d\xac\xac\x54\x9f"
- "\xef\x7f\xd2\x48\x63\x6c\x5c\xb9\xcb\xcc\x77\x27\x84\x1d\x5e\x73"
- "\x2e\xc0\xb8\x24\xd5\x67\xff\xd7\xa5\xa9\x8a\x8e\xbb\x6d\x2c\x71"
- "\x15\x1b\x63\x71\xac\x13\x63\xad\x3a\x83\x93\x60\xbc\xf5\xce\x22"
- "\x2b\xd7\x0d\x31\x63\x28\xd8\xe3\x4c\xfb\x87\x74\xf3\x59\x88\x51"
- "\x57\x26\x84\x15\x2c\x22\x93\x9c\x5f\x45\x8c\x7c\x15\x38\xa8\x0b"
- "\xf8\xa0\xeb\xab\xe4\xb0\xba\x34\x07\xe1\x4b\x8c\xb1\x16\x67\x35"
- "\x29\x83\x7c\xc8\xbf\x58\xdf\xce\xaf\x12\x42\x73\x53\xf1\xf9\xc5"
- "\x05\x62\x7e\xf6\xf7\xc0\xbf\x4b\x7e\x3d\x7c\x2d\x70\x0e\x70\x86"
- "\xc0\xc3\x41\x70\x70\xd7\xcb\xb7\x27\xce\x98\x43\x1d\x75\x8d\x27"
- "\x48\x56\x2d\xd1\x65\xbd\x48\xb4\x58\xbe\xc5\x59\xcb\x78\xf9\x09"
- "\xe0\x65\xf8\x5d\x2a\xe3\x65\x61\x7e\x81\x07\x2f\x63\xfc\x5d\xd7"
- "\xdc\x42\x42\xed\xe4\xea\x99\xf6\x30\x47\xa6\x9d\xf2\x18\x8f\x5b"
- "\x9c\xe7\xf0\xdd\xe3\x50\x89\xa3\xb7\x43\xdc\xd1\xbd\x84\xf1\x73"
- "\x89\xc8\xcf\xdb\xcf\x0f\x9c\x9f\xb7\x1b\x81\x9f\x21\xde\xdb\x86"
- "\xdc\x0c\xbc\xbc\xeb\x8c\x8d\x73\x02\x17\x07\xa6\xdb\x34\x9f\xf3"
- "\x3f\x66\x82\xff\x44\x9d\x22\x76\x6a\xcb\x9d\x38\x1f\xe1\xdf\xae"
- "\xd0\x7d\xd9\xe8\x1f\xbb\xc0\x37\xbe\xb3\xa8\x81\x0b\xcd\x00\xdd"
- "\xa6\x7d\x48\x9d\xcb\x13\xc2\x68\x77\x82\xd6\x95\x57\x15\xed\xec"
- "\x8e\x08\xe9\xee\x06\xfd\x02\x5f\x80\xbf\xd2\xd9\x56\x27\x0b\x32"
- "\xe1\xc7\x18\x63\xf9\x0d\x8f\x44\x83\x6f\x8a\x29\x3d\x4f\x26\xd0"
- "\xfc\x7d\x3b\x9c\xf9\xfb\x76\x75\xe7\xef\xdb\x09\xb8\x0c\x85\xf8"
- "\x11\x74\xde\x69\xe6\xf3\xf7\x99\xf9\x82\xca\x6c\x97\xb6\x2a\xda"
- "\xa6\xdd\x57\x0e\xbf\x4d\xfc\x6a\xc0\xc1\x2a\x22\x3c\xd3\xd2\xcf"
- "\x44\x3f\xbc\x74\x9b\x37\x1c\x6c\x33\x06\xe6\x8b\x67\x24\x00\x0e"
- "\x1a\x00\x07\x5f\xcb\x71\xf0\x3e\x71\x1a\x45\x1f\x3d\x9b\x61\x01"
- "\xe4\x2e\xf4\x65\x7a\xfc\xf4\x2f\x8e\x7a\xc7\x43\xa3\x7f\x78\xe8"
- "\xfa\x4a\x89\x87\xe2\x20\xf1\x00\xfe\x35\xa2\x14\xfa\x4d\x9d\x5f"
- "\x19\xb8\x62\xc4\xc3\x29\x37\x1e\xfe\xf0\xff\xd9\xb8\xee\x80\xf1"
- "\xb0\x6c\x4d\x60\x78\x30\x91\x01\xe2\x21\xc7\x8d\x07\x93\xde\x99"
- "\x6f\x1a\xd7\x9d\x6f\x8a\x72\xe3\xe1\x02\xe0\xc1\x14\xeb\xc6\x83"
- "\xc9\x00\xbf\x63\x7a\xe3\x61\xf9\x3b\x97\x17\x0f\xc3\xdb\xbe\x1b"
- "\x78\x48\xf7\xd9\xff\xf5\x81\x87\x81\xf2\x83\x55\x86\x07\xe0\x07"
- "\x13\xf0\x83\x49\xc6\x0f\xe7\x10\x0f\x32\x7e\x30\x01\x3f\x98\xbc"
- "\xf0\xc3\x8b\x15\x97\x17\x0f\xd7\x34\x7d\x37\xf0\xb0\xa2\x38\x30"
- "\x3c\x54\x0c\x90\x1f\x1e\x8d\x71\xe3\xa1\x02\xf8\xa1\x02\xf8\xa1"
- "\x42\xc6\x0f\xa7\x01\x0f\x15\x32\x7e\xa8\x00\x7e\xa8\xf0\xc2\x0f"
- "\x2b\x8f\x5c\x5e\x3c\x5c\x7b\xe2\xbb\x81\x87\x0c\x9f\xe3\xdf\x3e"
- "\xf0\x30\x40\x7e\x78\xb4\x50\x86\x07\xe0\x87\x0a\xe0\x87\x0a\x19"
- "\x3f\xbc\x8f\x78\x90\xf1\x43\x05\xf0\x43\x85\x17\x7e\x78\xe9\x93"
- "\xcb\x8b\x87\x89\xb9\xdf\x0d\x3c\xac\xaa\x0a\x0c\x0f\x95\x03\xe5"
- "\x87\x16\x37\x1e\x2a\x81\x1f\x2a\x81\x1f\x2a\x65\xfc\xb0\x16\xf0"
- "\x50\x29\xe3\x87\x4a\xe0\x87\x4a\x2f\xfc\xb0\xfa\x8b\xcb\x8b\x87"
- "\xa7\xa6\x7c\x37\xf0\xb0\xa6\xa6\x3f\x3c\x48\x58\x40\x5c\x20\x16"
- "\xba\xb3\x12\x08\xf6\x33\xde\x39\xcb\xf0\x80\x38\x10\x30\xd1\x9e"
- "\x10\xe6\x02\x2c\x38\x57\x03\x16\xba\x18\x16\x50\x16\x88\x07\xec"
- "\x57\x60\x7f\x02\x31\xe1\x82\x3e\x85\x53\x0b\x7d\x8a\x75\xea\x08"
- "\xc4\x41\x97\xa6\x9f\x7e\x45\x17\x11\xfa\x7e\xd8\xc7\x3b\xcf\xad"
- "\xfd\xda\x1b\x0e\xb6\x07\x38\xc6\xd7\xd3\xbf\x54\xe0\xe0\xb0\x1b"
- "\x07\x4f\xf8\xe8\x57\x3c\xee\x03\x07\x56\x3f\x70\x70\xbe\x77\x3f"
- "\x73\xa0\x38\xe8\x5a\x22\xe2\x00\xfb\x99\xbc\xd8\xcf\x7c\x16\xfa"
- "\x99\xda\x40\x71\x90\x79\x32\x38\x1c\x54\x90\xc0\x70\xf0\x68\x0c"
- "\xc6\x09\x0c\x07\x15\xe3\x9c\x5a\x88\x15\x14\x38\xe8\x23\x5e\x50"
- "\xe0\x20\xab\xf3\xf2\xe2\xc0\x23\x5e\xf8\x8f\xc5\x41\xb6\xcf\xf7"
- "\x7f\x79\xd0\x3b\xf2\x3d\x8e\xdb\xe3\x7b\x26\xa1\x36\x36\x6e\x84"
- "\xef\x9b\x6c\x4e\x25\x51\xe8\x23\x5c\x2b\x13\xc2\xf2\xce\x93\x49"
- "\x9b\x52\x89\xda\xb9\x1c\xf4\xbf\x8c\xa8\xbb\x38\x42\xba\x96\x27"
- "\x87\xd5\x34\xdb\xd8\x18\x12\xce\x47\x85\xfc\xdd\x79\x6c\x0c\xc9"
- "\xd5\x9e\x10\xba\xa9\x8d\xcd\x81\x35\x3f\xf3\x16\xe8\x76\xdd\x29"
- "\x6f\xba\x7d\x23\x00\xae\xef\x92\x73\xfd\x39\xa5\x6e\xe5\x3c\x5f"
- "\x6c\x94\x8d\x21\xcd\xf4\x31\x86\xe4\x87\x4e\x85\xb1\xfd\xf3\x8c"
- "\xe7\x7b\xc6\x90\x06\x38\xc6\xdf\x0d\x1c\xbf\x9d\x53\x72\x7c\x70"
- "\x3a\x35\xee\xe9\x6b\xdc\x11\xed\x1b\xed\x5a\xb2\xe9\x1e\x1f\x8f"
- "\x76\x0c\xfa\xee\xcc\xdb\xb7\x5e\xf0\xf5\xab\xdd\x36\x8d\xb6\x8c"
- "\x76\x8d\x76\x2c\xf8\x7a\x5c\x93\x78\xc3\xf4\xd8\x52\xd9\xd8\x91"
- "\x4b\x2b\xf2\xbc\x17\x8e\xe7\xfb\xe4\xf8\x97\xbd\xea\xff\xdb\xc0"
- "\xf1\x88\x03\xc9\xbe\xaf\x3c\xdb\x5e\xef\x7b\xfe\x97\x5f\x38\x30"
- "\xa9\xfb\xc7\x81\x89\x00\x0e\xb6\x96\xca\xc6\x8c\x5c\x5a\x13\xf0"
- "\x3c\x1b\x33\x62\x38\x70\x8f\x19\xf1\x9e\x63\x46\x0a\x1c\xbc\x72"
- "\xfa\xf2\xe2\xc0\x63\xcc\xe8\x3f\x16\x07\x1b\xcc\x03\xc4\x81\x1f"
- "\x7c\x60\x42\x3e\x68\x91\xe1\x00\xf8\xc0\x04\x7c\x60\x92\xf1\x81"
- "\x7b\xac\x88\xf7\x1c\x2b\x52\xe0\x60\xe3\xe7\x97\x17\x07\x1e\x63"
- "\x45\xff\xb1\x38\xc8\xa9\x1e\x18\x0e\x2a\xfc\xe0\x83\x0a\xe0\x83"
- "\x19\x93\x4a\x65\x63\x44\x2e\xad\x18\xf7\x79\x89\xf9\xf8\x3e\x63"
- "\xbe\x4d\xe7\xbe\xad\x31\xdf\x95\x8d\x83\x5c\x9f\xcf\x4a\xfd\xc4"
- "\x81\x1f\x7c\x50\x01\x7c\x30\xa3\x50\x86\x03\xe0\x83\x0a\xe0\x83"
- "\x0a\x19\x1f\xb8\xc7\x86\x78\xcf\xb1\x21\x05\x0e\x5e\xbd\x70\x79"
- "\x71\xe0\x31\x36\xf4\x1f\x8b\x83\xbc\x86\x81\xe1\xa0\xd2\x0f\x3e"
- "\xa8\x44\x3e\x68\x2e\x95\x8d\x09\xb9\xb4\x95\xc0\x07\x95\x32\x3e"
- "\x70\x8f\x09\xf1\x9e\x63\x42\x0a\x1c\xe4\xbb\x2e\x2f\x0e\x3c\xc6"
- "\x84\xfe\x63\x71\x50\xe0\x73\x5e\x85\x84\x81\x9e\x31\x00\xea\xc6"
- "\x81\xa0\xfb\xe5\x09\x61\x5d\x9a\x7d\xeb\xa5\xfe\x7f\x5e\xaf\xfe"
- "\xff\xf4\x58\x9f\xe3\x40\x1e\xcf\x97\x85\xbe\x41\xc1\xbe\x6c\xd6"
- "\x4f\xa8\x8a\x46\xfd\xbf\xba\x8a\xf5\x13\xf5\x8f\xa3\xfe\x37\x7b"
- "\xd7\x7f\xa0\x63\x82\x49\xa0\xff\xe6\x3e\xf4\xff\xb4\x8f\x7e\xc2"
- "\x93\x03\xd3\x3f\xce\x77\xec\xfe\x6a\x10\xf5\x2f\x8d\x09\x9e\x26"
- "\xdc\xf6\x01\xf5\x17\x0b\x7d\xea\xdf\xeb\x7c\x92\x72\x36\x9f\x04"
- "\xe7\x92\xd4\xb5\xb4\x90\x4d\x17\x89\x2e\x34\x85\x61\x42\x98\x53"
- "\x02\x98\xc8\x3b\x4b\x26\x39\x59\xdb\x7a\xe6\x94\xe0\x1a\xee\x8c"
- "\x17\xcc\xc2\x9c\x12\x69\x3c\xa0\x67\x3e\xc9\x33\x38\x9f\xe4\xd7"
- "\x9f\x0d\x78\x2c\x00\xe7\x93\xa4\x83\x8e\xed\xa0\xe3\x0b\xa8\xdf"
- "\xc3\x0a\xbb\x56\x8c\x01\xf8\x9a\x47\xe2\xcf\xb8\xce\x25\x98\x47"
- "\x22\x8c\x01\x0c\x8a\x4d\xbf\xb6\xd7\x27\xb7\x83\x1e\x51\x9f\x16"
- "\x83\x53\x18\xd7\x95\x6c\xdc\x92\x51\x4f\x36\x75\x11\x9d\x34\xfe"
- "\x2f\xe9\x14\xf9\x9e\x02\x0e\xe8\x57\x09\x5a\xd4\xe9\xab\xa9\xc0"
- "\xf3\x4b\xdc\x3c\xcf\x5f\xf5\x48\x74\xc9\x2a\xe0\xf7\x55\x64\x82"
- "\x20\xa3\xd0\xca\x6c\x36\x1e\x50\x15\x8d\xf6\x8e\xf6\x4c\xb5\xfb"
- "\x4c\xdd\xa2\xbd\x33\x7d\xd7\x12\xd4\x33\xdb\xeb\x73\xcb\x29\xb4"
- "\x3d\xd4\x79\xa8\xa8\xf3\x52\x1f\x3a\x17\xf4\xad\xd2\xe1\xba\x21"
- "\xf8\x9e\x59\x8f\xce\x9d\x2f\xcb\xc6\x7f\xe4\x3a\x17\xc7\x7d\x78"
- "\xb0\x65\xbf\xe6\x0f\xf9\xa9\xf7\x41\x1b\xdf\x07\xbd\x97\x8a\x7a"
- "\xef\x19\xdf\x1f\x90\xde\xb7\xfa\x7e\xff\x45\xa1\x77\x13\x19\x04"
- "\xbd\xe7\xf4\xd6\x3b\xf6\xff\x51\xef\xa6\x28\xec\xe7\x53\xad\x29"
- "\xa6\x5b\x9c\x37\xd2\x5b\xef\xbf\xa9\xbd\xf4\x7a\x1f\xde\xf6\xdd"
- "\xd0\xfb\xeb\x3e\xd7\x3f\xf3\xd0\xfb\x60\xd8\xbb\xd5\x8b\xde\x45"
- "\x7b\x37\xed\xc4\x7e\x3d\xe8\x5d\xb4\xf7\x73\x5e\xf4\xfe\x3f\x87"
- "\x2f\xbd\xde\xaf\x69\xfa\x6e\xe8\xbd\xc8\xe7\xfc\x0f\xa5\xde\x2b"
- "\x06\xc1\xde\x1f\x8d\xe9\xad\xf7\x0a\xd1\xde\x2b\xa2\xb0\x1f\x4f"
- "\xb5\x15\xa2\xbd\x9f\xf6\xa2\xf7\x6d\xef\x5f\x7a\xbd\x5f\x7b\xe2"
- "\xbb\xa1\xf7\xed\x5b\xfd\xd4\xfb\x20\xd8\xfb\xa3\x85\x5e\xf4\x2e"
- "\xda\x7b\xc5\x4e\xec\xb7\x83\xde\x45\x7b\x7f\xdf\x8b\xde\xdf\xf8"
- "\xcb\xa5\xd7\xfb\xc4\xdc\xef\x86\xde\x8b\x7d\xce\xff\x53\xea\xbd"
- "\x72\x30\xec\xbd\xa5\xb7\xde\x2b\x45\x7b\xaf\x8c\xc2\x7e\x3a\xd5"
- "\x56\x8a\xf6\xbe\xd6\x8b\xde\x4b\x76\x5f\x7a\xbd\x3f\x35\xe5\xbb"
- "\xa1\xf7\xd2\xf5\xfd\x3d\xaf\x97\x74\x2f\x8d\xd9\x08\xcf\x67\x21"
- "\xbe\x97\xf4\x8d\x38\x40\x9d\x23\x16\xe4\x3a\x17\xe6\xf0\x2c\x61"
- "\x73\x78\x30\x6e\xa7\xd0\x17\xa7\x57\x09\xf3\x37\x4c\x42\xbf\x5d"
- "\x8c\xe3\xa9\x4a\x1d\x81\xb1\xbc\xef\x38\xbe\xac\x44\xd2\x77\xb0"
- "\x7d\xb7\xfe\xf4\xed\xd9\x27\xbf\x52\xf4\x2d\xef\xbf\x0d\x8e\xbe"
- "\x77\xa4\x07\xa7\xef\x0a\x12\x98\xbe\x2b\xf4\x4c\xdf\xc2\x3c\x8d"
- "\x18\xb7\xbe\x2b\xa2\x98\xbe\x2b\x0c\xbe\xfd\xf9\x9b\xf9\x97\x5e"
- "\xdf\xca\x31\xf9\xff\x5c\x7d\xbf\x95\xd4\xd7\x18\x0c\xea\x1a\xf5"
- "\xbe\x79\x11\x89\x7a\x75\x11\x1b\x5b\x71\x7e\x15\x21\xac\x4f\x87"
- "\xfa\xc7\x77\x7c\x42\x01\x03\xc7\x12\x6c\xa4\xab\x23\x81\xe0\xbb"
- "\x3c\x38\xef\xa2\x2e\xd9\x4a\x2c\x19\x47\xc9\xa6\x65\x44\x57\x93"
- "\xd8\x46\x66\x96\xd3\x6e\x4b\xa3\x19\xdf\xf1\x56\x9b\x57\x1d\x25"
- "\x74\x89\x61\xe4\x33\x76\xc2\x9d\xe7\x7e\x1b\x89\xf3\x36\xee\xb0"
- "\x83\x4c\xf0\x7d\x1f\xd0\xf9\xa6\xf3\x84\x1c\x06\x14\xea\x9f\x43"
- "\x5d\xff\xf6\xa5\xe1\x2f\x7a\x79\xcf\x27\x90\x71\x19\xf9\xd8\xab"
- "\x17\x5d\xbf\xc1\x0d\xce\xdc\x0c\x69\x5e\x86\x62\x5c\x66\xa0\xef"
- "\x5f\x0e\xda\xdc\x8c\x9d\xd3\xfb\x9a\x6f\x83\xfa\x44\x9b\x76\x16"
- "\xb0\x71\x19\x4b\x46\x35\xc1\x79\x35\x68\xc3\xae\xf6\x88\x90\xd5"
- "\xe9\x60\xeb\x0d\xcc\xd6\x5f\x6d\x83\xbc\x89\xff\x24\x88\x0f\xa6"
- "\xdb\x6e\xa6\xdb\x36\xd4\xed\x3f\x09\x5d\x6e\x18\x79\x9e\xdb\x69"
- "\x47\xfd\xa2\x5e\xb3\x3e\x21\xba\xb9\xb8\x2e\x0a\x72\x3c\xf0\x3b"
- "\xe8\x39\xa6\x6c\x11\x99\x80\xf6\xef\xca\xdf\xb7\xd3\x99\xcf\xe6"
- "\x68\x20\xef\x77\x6b\xcc\xe5\xb9\xcb\x44\xfd\x3f\x89\xfa\x7f\xdb"
- "\xab\xfe\xdf\x08\x76\xec\x5d\xd4\x7f\xd0\xef\xf5\x7c\x53\xf6\xbe"
- "\x64\xb0\xec\xfd\x7f\x7d\xae\x89\xa2\xc4\x01\x1b\xa7\x09\x0c\x07"
- "\x1d\x5e\x70\xf0\xbf\xce\xde\x38\x30\xe9\x01\x07\x39\x4a\x1c\x98"
- "\xa2\x18\x0e\x4c\x06\x38\x1f\xd3\x1b\x07\xbf\x5b\x77\x79\x70\xe0"
- "\xe7\xfb\x3c\xdf\x7a\x1c\x94\xcf\xf1\x13\x07\x41\xf0\xc1\x57\x5e"
- "\x70\xf0\x8e\xda\x0b\x0e\x90\x0f\xac\x1e\x38\x10\xf9\xc0\x04\x7c"
- "\x60\xf2\xc2\x07\xef\x6c\xba\x3c\x38\xf0\xf3\x3d\x9e\x6f\x3d\x0e"
- "\x7e\xef\xd3\xff\x2b\x71\x50\x11\x04\x1f\x7c\xea\x05\x07\x7f\xd0"
- "\xf4\xc6\x01\xc4\x82\x10\x07\x2a\x71\x50\x21\xf2\x41\x85\x01\xe3"
- "\xc3\xde\x38\xf8\xc3\xaf\x2f\x0f\x0e\xfc\x7c\x7f\xe7\x5b\x8f\x83"
- "\x5d\x3e\xdf\xff\xf5\xc0\x41\x10\x7c\xf0\xa1\x17\x1c\xec\x0e\xf7"
- "\x82\x03\xe0\x83\x47\x0b\x3d\x70\x20\xf2\x41\x05\xf0\x41\x85\x17"
- "\x3e\xd8\xbd\xed\xf2\xe0\xc0\xcf\xf7\x76\xbe\xf5\x38\x78\xd7\x67"
- "\xff\x4f\x89\x83\xca\x20\xf8\x20\xcb\x0b\x0e\xde\x8b\xec\x8d\x83"
- "\x4a\xe4\x83\x16\x25\x0e\x2a\x45\x3e\xa8\x04\x3e\xa8\xf4\xc2\x07"
- "\xef\xbd\x79\x79\x70\xe0\xe7\xfb\x3a\xdf\x7a\x1c\xec\xf1\xf9\xfe"
- "\xb7\x1c\x07\xdd\x3d\xfd\x05\x93\x80\x83\xdc\x55\x0c\x07\x6b\x11"
- "\x07\x2d\x6c\xfe\x4e\x9e\x88\x83\x9e\xbe\x42\xb3\x27\x06\xfe\xa8"
- "\xef\xc1\xc0\x17\xee\xbe\x42\x37\xe8\x5b\x18\x0f\x12\xfb\x09\xd2"
- "\x38\x90\xd0\x4f\x80\x7e\x62\x6e\x9b\xa8\x7f\x61\x4c\xe0\x8f\xde"
- "\xf5\x1f\x40\x3f\x51\x31\x47\xc3\x53\xff\x57\xf8\x7b\x3a\xbd\xc6"
- "\x05\x3e\x19\xe8\xdc\x8c\x3f\xf9\xa9\x7f\x29\x2e\xf0\x57\xff\x9f"
- "\x7a\xd1\xff\x9f\xbd\xe8\xbf\x42\xcf\xf4\xff\x68\x8c\x14\x0f\x48"
- "\xe3\x42\x42\x3c\xd0\x4b\xff\x7f\xbe\x4c\xfa\xbf\x32\xdf\xcf\x19"
- "\x7c\xfd\xef\xf5\xa9\xff\x42\x8e\xdf\x03\x87\x09\x0e\x33\x1c\xd5"
- "\x2e\x8e\x3c\x58\xc2\xf1\xc2\xdc\x4e\x5c\x43\xbc\xc4\xd8\xeb\xfc"
- "\x55\xf4\xaa\xdb\x6a\x30\x0f\xe8\x50\xd8\x3f\x40\x2a\x83\xe6\x12"
- "\x94\xa3\x59\xab\x4a\xc4\xf5\xaf\x30\xef\xd5\x52\x59\xda\x75\x24"
- "\x56\x2a\x0b\xda\x97\x0d\x72\x37\x87\xad\x8b\xbd\x0a\xf2\x57\xd3"
- "\xdc\xc5\xad\x90\x37\x44\x28\x73\x9d\x5a\x58\x0b\x54\xca\xeb\x32"
- "\xaa\x70\xcd\x26\x73\x98\x0a\xf2\xb2\x32\x47\x88\xf9\xf4\xbc\x91"
- "\xe8\x85\x7a\x72\x1c\xde\xcf\xb3\x9e\x23\xc5\x7c\x51\xf2\x3a\x6a"
- "\xd7\xc5\x0a\xe5\x89\x79\xae\xa1\x57\x71\x8d\x62\x5b\x0c\xf2\x7c"
- "\xae\x29\x04\xcb\x94\xf2\x69\xc4\xb2\xc6\x29\xf2\xbc\x45\x48\x98"
- "\x4a\xcf\xea\x97\xc1\x11\xb1\x7e\x5a\xcc\xeb\x1a\x99\x62\x76\xa9"
- "\xd4\xd1\x3c\x47\xa2\x15\xd7\x6c\x20\x42\x7e\x31\x6f\xa8\x90\xf7"
- "\xaa\xb8\x09\x90\x77\x82\x28\x73\xb5\x5c\xe6\x62\xbe\x30\x49\x8e"
- "\xf2\x73\x2e\x23\x87\x65\xe1\x79\x1d\xbd\x6a\x66\x0c\xb4\x61\x92"
- "\x94\x4f\xba\x9f\x25\x99\x10\x21\x2f\x47\x7e\x2c\xea\xe4\x5a\x68"
- "\x47\xac\x94\x0f\xd7\x51\x93\xf2\x02\xae\x6f\x28\x73\xcb\x66\x94"
- "\x2b\x37\x35\xdb\xb5\x4e\x3d\xd5\xb3\xcc\xb0\x75\x2a\x2b\xe6\xab"
- "\x6d\x11\xca\x06\xfd\xa5\x4e\x80\xfc\xdf\x13\x65\x34\x8d\xe9\x44"
- "\xd7\xa3\x13\x17\xe7\xc4\x73\xe6\x52\x56\xd7\x70\x31\xdf\xf4\xde"
- "\xf9\xd4\xf2\x7c\xd7\x31\x39\xae\x0d\x07\xd9\xcc\xea\x9d\x37\x44"
- "\x9e\xf7\x7a\x96\x37\x6d\x2f\xe4\x8d\xef\x9d\x57\x27\xcf\xfb\x7d"
- "\x96\x77\xd9\x21\xc8\x9b\xe0\xa5\xae\xa3\x64\x79\x23\x58\xde\xf4"
- "\x93\x90\x77\x4e\xef\xbc\x7a\x79\xde\x1b\x58\xde\xac\x48\xc8\x9b"
- "\xd8\x3b\x6f\xac\x3c\xef\x68\x96\x77\x45\x33\xe4\x4d\xea\x9d\x37"
- "\x5b\x9e\xf7\x46\x96\x37\xc3\x0e\x79\x93\x3d\xf3\x96\x31\xdd\xde"
- "\x2c\xea\x36\x92\xe5\x5d\xad\x86\xbc\x29\x5e\xda\x36\x4c\x28\x97"
- "\xe5\x1d\xc3\xf2\xa6\x36\x40\xde\x34\x2f\xba\x90\xe7\x1d\xcb\xf2"
- "\x6e\x36\x40\xde\x74\x2f\xba\x90\xe7\xbd\x89\xe5\x35\x3a\x20\x6f"
- "\x86\x17\x5d\xb8\xf3\x8e\x7c\x85\x40\x9e\x35\xd0\xce\x7a\x2f\xb2"
- "\x95\x97\xf9\x03\x56\xe6\xc6\x10\xc8\x9f\xed\x45\xb6\xf2\xbc\x37"
- "\xb3\xbc\x9b\x74\x90\x77\xbd\x17\xd9\xca\xf3\xde\xc2\xf2\xbe\x1a"
- "\x01\x79\x73\x7a\xe7\x05\x7b\x63\xf2\xbd\x4b\x94\x6f\x14\xcb\x9f"
- "\xaf\x87\xfc\x79\x5e\xe4\x8b\xe5\x49\x36\x7b\x2b\xcb\xbb\x2e\x0a"
- "\xf2\x16\x7a\x91\xaf\x3c\xef\x0f\x59\xde\xd2\x1a\xc8\xbb\xd5\x8b"
- "\x7c\xe5\x79\xff\x8b\xe5\x7d\xcd\x09\x79\x8b\xbc\xc8\x57\x9e\xd7"
- "\xc0\xf2\x6e\x45\xec\x14\x7b\xa9\xef\xcd\xb2\xbc\xb7\xb1\xbc\xaf"
- "\xb7\x42\xde\x1d\x5e\xf4\x21\xcf\x7b\x3b\xcb\xbb\xa3\x0a\xf2\xee"
- "\xf4\xa2\x0f\x79\xde\x1f\xb1\xbc\x45\x88\xf5\x72\x2f\xfa\xe8\xc9"
- "\x0b\x7e\x61\x9c\x6b\xe4\xf6\xc6\x32\xcc\xaf\x52\x0b\x73\xd0\x28"
- "\x27\xf8\x77\x21\x2f\xe0\xc4\x2c\xf2\xdd\x78\x56\x66\x31\xda\xa5"
- "\xf0\x9e\x22\xe6\xa9\x75\x08\x7c\x04\xfe\xc5\xf9\x93\x32\x37\x77"
- "\xdf\xc1\xf2\xfe\x1a\xb1\xbb\x57\xce\xa1\x94\x53\xcb\xf3\xdd\xc9"
- "\xf2\xed\x41\x5e\x30\x29\xf3\x85\xb8\xf3\x8d\xdc\xb9\x15\xce\x57"
- "\x95\x7a\xf0\x31\xd4\x53\x5e\xd6\x8f\x59\x59\xff\x5b\x0c\x79\xcd"
- "\xca\x7c\xce\xbb\x64\xf9\xee\x62\xf9\xca\x77\x42\xbe\x43\xca\x7c"
- "\x7a\x79\xbe\x9f\xb0\x7c\x7f\xc2\xba\x55\x2b\xf3\xc5\xca\xf3\x4d"
- "\x70\xe5\xfe\x7e\x97\x90\x77\x9d\xba\xc6\x53\x7e\x20\xeb\xbb\x64"
- "\x3e\xed\x6e\x57\xee\xae\xbd\x62\xde\x7a\x49\x86\x82\x9c\x19\xe6"
- "\x39\x11\xf3\x13\x5d\xb9\xef\x56\x89\xf9\x4e\xca\xfd\x80\xcc\xd7"
- "\xfe\x94\x8e\x7c\x6b\x97\xe8\x47\x85\xf7\x01\x80\xdf\x1b\xbd\xc5"
- "\x1b\x69\xb7\x93\x6b\xce\x72\xef\xaf\x61\xbe\x47\xda\xaf\xeb\x03"
- "\xb6\x6f\x72\xb1\x31\x31\xce\x4e\x9d\xf2\xb4\xcd\x1c\xad\xbf\xd3"
- "\x4e\xd4\xb8\x66\x2a\xd5\x9a\x73\xac\x90\x6e\x1b\x63\xcc\xee\xc8"
- "\x7d\x3f\xc7\xaa\x7a\x38\x02\xd7\xf4\x83\xef\x5b\xad\x24\xbf\x08"
- "\xbf\x6f\x36\x52\x07\xc8\x44\x85\xfb\xbb\x94\xc1\xf7\x02\x38\x84"
- "\x3d\x55\x20\xae\xa3\x1b\x48\xac\x79\x85\x93\x9c\xc9\x20\x1c\x5f"
- "\xb0\x51\xaf\x5f\x86\xeb\x0a\xbe\xff\x19\x5d\x99\x3c\x09\xea\x12"
- "\x0b\xf7\x4d\x6a\x82\xdf\x42\x5d\xa0\xfd\xe0\x1b\x27\x99\x97\xe1"
- "\xda\xa2\x1f\x5c\x67\xd3\x1e\x88\xa5\x2f\x3f\xf5\x45\x5a\x26\xb9"
- "\xe9\x2c\xf7\x41\x78\x3b\x70\x43\xfb\xca\xe4\x9f\x61\x19\xbc\x76"
- "\xe3\x24\xc8\x53\x8f\x6b\x12\xd2\xa2\x83\x7a\xb6\x5e\xe1\x07\xc2"
- "\x7a\xee\x50\x9f\x7a\x1a\x69\x9c\xc5\x77\xad\xcf\xc6\xbd\xe1\xcc"
- "\x99\x67\x49\x93\xec\x9c\xed\x86\x83\xc2\x5a\x86\xd0\xbe\x59\xae"
- "\x9c\x56\x07\x1f\xd2\x6a\xa7\x39\x1d\x26\x4b\x8a\x95\xb0\xbd\x60"
- "\x3e\xf8\x9c\x86\x3e\x61\xe1\x73\x5a\x1b\x21\xbd\xdc\x62\xef\x12"
- "\xd2\xa1\x8c\x62\x8c\x3b\xdb\x43\xda\x9d\x34\xc7\x4e\xcc\xa3\xbb"
- "\x48\x33\xf7\x81\x60\x5f\x98\x4e\x37\x75\x98\x50\x56\xfc\xa6\x8e"
- "\xf2\x61\x11\x44\xdd\x3e\xa2\x1d\xe4\xf4\x41\x95\x55\xdc\x93\x44"
- "\xba\x17\x96\x6b\x15\xcb\x82\xf3\x8d\x56\xd5\x6d\xb1\x6c\x9d\xc4"
- "\x0f\xc2\xfb\x98\x23\x12\x46\xf3\x37\x26\x74\xe4\x7e\xa8\x81\xd8"
- "\xb2\x8a\xe9\xe0\xc3\x08\xab\x4a\xaf\x11\xbf\x47\x59\x55\xb7\xa4"
- "\x8b\xdf\xa3\xad\xaa\xfb\x32\xc4\xef\x3d\xeb\x3f\x7a\x5f\x8f\x72"
- "\xe3\x38\x90\xf9\x54\xfe\x8d\x84\x10\x8c\x8b\x31\xd6\xa7\xda\x8d"
- "\xe3\xf4\x63\x71\x1f\xc2\x0f\x4f\xc2\x3d\xa7\xb2\xbd\x00\x3e\xdc"
- "\x06\x9f\x61\xe2\xa7\x4d\xfc\xa4\x98\x47\xc0\x55\xa4\xb1\x9e\xe6"
- "\xed\x8f\x40\x79\x67\xba\x28\x0f\xe5\x26\x83\xec\xf6\x58\x32\x5a"
- "\x44\x99\x7e\x28\xec\x81\x2c\xe8\x14\xf4\x4e\x47\x74\xec\x11\xee"
- "\x95\x7f\x20\x56\x5e\xaf\xe8\x1f\xdf\xf5\x93\x09\x77\x4f\xfc\x69"
- "\xcc\x3d\xf3\x9e\x9d\x9f\xb4\xe0\xb9\xe7\x93\x17\x2e\x7a\x21\x65"
- "\x71\xea\x92\xb4\xa5\xcb\x96\xa7\xbf\xb8\x62\x65\xc6\x4b\xab\xa0"
- "\x9c\x9e\x3d\xe8\xe8\x1b\x53\x55\x76\x8e\xc0\x3d\xa6\xc0\x3d\xcc"
- "\x77\x0b\x75\x81\x34\x86\x07\x73\x94\x5a\xef\x5d\x9e\x96\x08\xe8"
- "\xf7\xdc\x8c\xfb\x7f\x99\xd7\xe1\xbe\x37\x80\x3d\x95\xa5\xf8\xe7"
- "\x66\xdc\x37\xad\x99\x33\xa7\xd7\xd9\x7e\x6e\xc6\x7d\xfb\x3e\x8a"
- "\x68\x21\x51\x37\xe3\xde\x6a\xe6\x44\x3c\x5f\xf6\x43\x42\x0e\xc1"
- "\xb5\xde\xca\xbc\x59\x47\x22\xb6\x5c\x4f\x6d\x5b\xaf\xa7\xad\x58"
- "\xfe\xd6\xd7\x69\x8b\x6d\x75\x32\x29\x80\xdf\x80\x59\xdd\x19\xee"
- "\xc0\xdd\x1f\x41\xa4\x0d\x31\x74\x64\xe9\xeb\xb4\x79\xfd\xf5\xb4"
- "\xf9\xe5\xd7\x69\x6b\xd9\xf5\xd4\x1a\xb5\x95\x68\x3a\x72\xcd\x2d"
- "\x56\xce\x2c\x60\x61\x33\x9c\xe7\x47\x7e\x68\xdd\x0c\xe7\xee\x74"
- "\x92\x61\x65\xf0\x1b\xd2\xec\x1f\xe9\x59\xbd\xdf\x6b\x73\x0c\x87"
- "\xf6\xd5\xd0\xee\x14\x55\x01\xdc\x87\xe9\xe8\xc0\x13\x87\xc0\xfb"
- "\xc3\xfd\x6c\x16\x47\x13\xb1\x72\x07\x12\x70\x3f\x29\xb8\x5f\x98"
- "\xa5\xa8\x95\x60\x79\xef\x2e\x73\x0c\x5f\x3e\x9a\x3a\x21\x6f\x0c"
- "\xbf\x3a\x45\x05\x79\xc2\xa1\x6c\xbb\xbc\x3d\x86\xe7\x16\xa7\xeb"
- "\x53\x5f\x4c\x49\xb9\x6d\x24\x31\x08\x9f\x8a\x3d\xff\xd2\x71\x2d"
- "\xda\x2d\xaf\xd3\x43\xd0\x4e\x33\xb4\xb7\xba\x16\xa2\x7d\xc0\x0b"
- "\x81\x36\x15\x42\xb9\xbb\x21\xbd\x0a\xbe\x57\x41\xdd\xab\xd9\x3e"
- "\x71\x27\x3e\xa1\xb9\x07\x92\xa0\x9e\xe8\x6f\xf4\xb8\x76\x6d\xfb"
- "\xca\x78\x15\xb4\x7b\x2b\xe4\xab\xd6\x8f\x26\xb7\x9e\xe1\x0e\xde"
- "\x0d\xf5\xd8\x09\xdf\x31\xbf\xc0\x07\x90\xff\x10\x6b\xd7\x89\x23"
- "\xf8\x1b\x64\x65\x2e\xb9\x9e\xe6\x75\xe4\x1e\xd4\xe1\x9a\xdc\xc2"
- "\xde\x45\xf0\x1b\xe4\x52\x0d\x79\x0b\xdb\xb3\xe2\x55\xd0\x67\x54"
- "\x95\xf5\x94\x79\xc0\x8a\x75\xc2\x7a\x60\x3f\xf4\x18\x44\x7d\x7c"
- "\x77\x02\x19\xef\x20\xaa\x63\xc0\x74\xc5\xaf\xd3\x1d\x70\x14\xc3"
- "\x51\x74\x14\xce\x1d\x81\xa3\x1a\xd2\x6b\xe0\xf3\x28\x7c\x1e\x81"
- "\x03\xfa\xb1\x11\x58\xef\xe5\x6b\x68\xcb\x9d\x45\xe4\x16\x2c\x1f"
- "\xb0\xf5\xab\x26\xee\x44\x34\xd6\x1d\xd7\xbc\xa7\x23\x0f\xee\x54"
- "\xae\x13\x0e\x08\x81\xf3\xf0\x39\x8e\x7d\xca\x8f\x43\xe9\x70\x6c"
- "\x15\xbf\x37\xc2\xa1\x16\xbf\xdb\xe0\x70\xf6\x7f\x78\x96\xe7\xeb"
- "\x38\x9c\xec\x7f\x5e\xbf\x8e\x9d\xfe\xe5\xfb\x9b\x9e\x70\x47\x80"
- "\xed\x8f\xec\x51\xa6\x1f\xc9\x61\x69\x75\xf1\xec\x77\x5d\xa2\xf8"
- "\x99\x07\xbd\x79\x90\x93\x05\xca\xb7\x54\xb3\x34\xcb\x49\xf8\x8c"
- "\x84\xc3\xe0\x71\x7f\x2c\x53\xc0\x55\xb7\x11\xfc\x05\xe8\xd2\xca"
- "\x1d\x4c\x47\x1d\x6d\x66\xd8\x52\xf1\x54\x48\x4b\x03\x6c\x15\xbb"
- "\xf1\x73\x68\x81\x12\x3f\x87\x66\x79\xe0\xa7\x10\xb9\x08\x6c\xa1"
- "\xaa\x8c\xe1\xa5\xaa\x7d\x75\x12\xfc\x3e\x14\x0f\xe5\x54\xe1\xf8"
- "\x08\x94\x21\xc4\x00\x9b\xcf\x12\xa2\x4d\x26\x6a\xe4\x97\x56\xee"
- "\xd0\xdb\x88\x59\xbc\xb7\x78\x5f\x56\x17\xa8\x1f\xa4\xed\xc0\xfa"
- "\x2d\x81\x72\xe1\xf7\x4e\xc8\xb7\xc3\x42\xda\xa4\xba\x09\xd7\xe4"
- "\x2e\x02\x3c\x8a\xf5\xc5\x32\xf1\x3a\xea\x6e\x57\x1a\x5e\xc3\xee"
- "\x7d\xf8\x09\x48\xc7\x7e\x2d\xbe\xfb\x34\xcc\xe2\xb4\x12\xc4\x24"
- "\x7e\x5a\x9c\xd1\x60\x4b\xd3\x08\xdf\x91\x40\xee\x8c\x20\xd1\x60"
- "\x6f\x23\x9a\xb8\xc3\x93\xee\x58\x43\xa2\xb1\x3c\xe4\x74\x2b\x77"
- "\x98\x94\xa1\x2d\xb2\xb2\x04\x3f\x88\xe5\x1f\x4d\x23\xc2\x7d\x4a"
- "\xb1\x3e\x70\x5e\x76\xdf\xad\xd8\x87\xdd\xbc\x8a\xb5\x15\xee\xb5"
- "\x13\xae\xdf\x83\x6d\x47\x79\xc2\x79\x13\x94\x53\x84\xe7\x84\x7d"
- "\x83\x58\x7b\x76\xe2\xde\x12\x28\x0f\xcc\x8f\xfb\x50\xb2\x35\xc2"
- "\x0f\xbc\x2f\xc8\x0d\xae\x47\x7d\x50\xb8\x07\x96\x91\xe5\xa4\x4e"
- "\x0a\x7c\xf4\xdb\x55\x0e\x88\x3b\xfe\x76\xad\x52\x3f\x87\x6d\x72"
- "\xfd\xc0\x75\x7b\xe0\xfa\x43\x14\xda\x88\x7c\x02\xf7\x0c\xc3\x58"
- "\x03\xd2\x0a\xf9\x5c\x28\x63\x85\x43\x18\xd3\x81\x72\x90\x53\x0a"
- "\xb1\x1c\xa8\xcf\x21\x56\xd6\x5f\x27\x1d\x58\xa3\xd4\xb5\x58\xde"
- "\x4e\xd4\xb9\x60\xcf\xab\x84\x36\x01\x77\xfd\xf5\x78\x29\x3b\x67"
- "\x82\x3c\x26\xda\x3d\x8d\xe0\x5e\x0d\xcc\x97\x08\xe7\xf6\x66\x75"
- "\x0a\xfa\x3d\xc4\x78\xed\xaf\x5f\x2f\x5f\x4b\x5b\xdc\xf5\xfe\x6b"
- "\xb9\xb4\xdf\x85\x58\xef\xbd\x78\x3f\xba\x72\x8e\xe0\x57\xf1\x1e"
- "\x78\xbd\x58\xde\x7a\x2c\x4f\x92\xd5\x1d\x50\x0f\x26\xaf\xc3\x26"
- "\x48\xdf\x89\x58\x14\xe4\x06\x3c\xda\x9e\x85\x58\xfc\xeb\x2e\xb8"
- "\xbe\xaa\x00\x7f\xaf\x14\x7e\xc7\x0a\x1c\xdb\x73\xfe\xb0\x1d\xcf"
- "\x5b\x5a\x40\x6f\x2f\x00\x96\x78\x42\x6e\x09\x27\xd1\x76\xa3\xd0"
- "\xb6\x5d\xf6\xd5\x53\x55\x1f\x39\x09\xc1\x7a\x82\x8c\x4c\x1d\xb9"
- "\x7f\x8b\x07\x5f\xb3\x15\xeb\x0a\x7c\xbd\x97\xfe\x36\x81\x60\x9d"
- "\x81\xcf\xc4\xfa\xfd\xed\xb0\xa8\xfb\xbd\xd8\x46\x94\xe7\x1d\x8c"
- "\xfb\xe0\xdc\x91\x85\x58\x77\x77\xbb\xff\xb6\x43\x2e\x63\xa1\xdd"
- "\xa0\x07\xd4\x17\xea\x45\x56\x26\x62\xbf\x10\xca\xda\xc5\x7e\x33"
- "\x6c\xa0\xac\x0b\xaf\xa7\x35\x98\xdf\x9d\xb7\xfa\x13\x3c\x97\x09"
- "\xf7\xbe\x33\x0d\x7c\x3a\xd8\x05\xee\x59\x02\xe5\xee\xc2\x3d\x46"
- "\xa1\x0c\x13\xca\x14\xea\x32\x1e\xf1\x08\xbf\x6b\xc4\xeb\xc6\x81"
- "\x3f\xc7\x63\x92\xdb\xfe\x8f\x8c\x51\xe2\xab\xda\xd3\xfe\x51\xdf"
- "\x85\x7c\xd6\x34\x22\xe0\x61\x19\xd1\x9f\xe7\xaa\x2b\x44\xdf\x21"
- "\xea\xfa\x88\xf6\x23\xb0\x17\x59\x19\x5b\x3d\x74\x6d\x12\xf0\xb8"
- "\x72\xba\x0a\xdb\x0c\xd7\x9a\xc4\x72\x84\x36\x0b\x78\x32\x0a\x18"
- "\xa8\xa1\x2b\xa1\x9d\x3d\x38\xf8\x9b\x4d\xd4\x73\x8d\x87\x4c\x24"
- "\xee\x9a\x84\x7b\xcb\x21\x27\x75\x18\xc9\xcf\x3a\xba\xdd\xbc\x84"
- "\xba\xe7\x05\xdd\x57\x17\x95\x31\x7f\x2b\xf2\x56\x35\x3b\x7f\xbd"
- "\x02\xc3\x58\x97\x5a\x01\xbf\x58\x97\xac\x39\x58\x17\x93\x50\x8f"
- "\x2c\x3d\x39\xcf\x1d\x99\x8a\xf7\x87\x6b\xeb\x45\x7b\x15\xcb\xfa"
- "\x1b\xda\x7e\xd5\xcb\xc0\x55\x58\x27\xb8\x77\xb4\xc0\x7f\x0f\x09"
- "\x32\x79\x5b\xac\x7b\xb5\xc3\x88\xd7\x1e\x2a\xea\xe4\x84\x6b\xab"
- "\xe1\xbb\xc6\xc1\xf6\x9f\x19\x09\xd7\x97\xe3\x9a\xff\x67\xb8\x3a"
- "\xe4\x0b\x15\x3e\x6f\x3a\xc3\xd5\x9e\xc3\x77\x43\x81\x53\xd4\x50"
- "\x5e\x08\x62\x54\xc2\x45\x2b\x57\x7b\x1a\xd7\xc6\x07\x59\xef\x82"
- "\x18\xa9\x1c\xe5\x8d\x58\x86\x18\x69\x42\x47\xee\x51\x8d\x84\x5b"
- "\xb8\x4f\x31\xca\x9e\xe9\xe7\xe8\x63\x80\x63\x93\x1b\x5b\x47\x1f"
- "\x13\xe5\x58\x0e\x72\x0c\x81\xfb\x1d\x17\xdb\x55\x0e\xf9\x21\x16"
- "\xab\x3d\x20\xd6\xbd\x48\xcc\xbf\x58\xd2\x83\x68\xab\x35\x05\xc8"
- "\xbf\x82\x0e\x8e\xa9\xc5\x6b\x77\xb2\x7b\x1d\x1b\x2e\xe5\xc5\x18"
- "\x91\xed\x2b\x75\x6c\x38\xf2\xe0\x9d\xa0\x7b\x81\xfb\x84\xfd\x77"
- "\x59\x1a\xda\x0e\xbb\x47\xad\xb0\x1f\xc5\xcb\x10\xf7\xb8\x71\x74"
- "\xb4\xd1\x83\x9f\x90\x8b\x0b\xeb\xa0\x0c\xe4\x53\xc4\x12\x72\x2a"
- "\xf6\x61\xa0\x8e\x7b\x45\xfb\x11\xeb\x7c\xec\x61\x25\x56\x6a\xb7"
- "\x01\x56\xc6\xbb\xcb\x3e\x16\xe3\xcd\xcf\x95\x31\x0e\x2c\x16\xdb"
- "\xb6\x49\x6c\xdb\x2e\xb1\x6d\x9b\xc4\xb6\x95\xc3\x3d\x50\x6e\x33"
- "\x64\x72\x04\xb9\xd5\x54\x88\xf9\x4d\xc8\xe5\x6e\x7b\x3d\x76\x41"
- "\xb2\xe5\xde\x7c\x51\xf3\x0e\xda\x83\xac\x5e\xf5\x1e\x7c\x61\xf2"
- "\xce\x17\xc7\x76\x88\xed\xdd\xe1\x61\x1b\x3b\xc5\x78\xf7\x7d\x49"
- "\x0f\x75\xd0\x47\x63\x7b\x28\x1d\x78\x1f\xf9\x13\xef\x2d\xf7\x41"
- "\xa5\x4c\xae\xa2\x2d\xd7\xfc\xa6\xb7\x1e\x6a\x92\xe4\xf6\x8c\xba"
- "\x46\x4e\xc0\x32\x50\xa7\x42\x5c\x09\x69\x4c\xaf\x35\x93\x90\x1b"
- "\xe4\x1c\x0d\x79\xb7\xf2\x14\xed\xa5\x26\x59\x69\x8b\xc7\x4e\x8a"
- "\xb6\x28\xde\xbb\xf6\x1e\xd0\x51\xb4\xec\xbe\x8d\x1e\xf7\x45\xdd"
- "\x1c\x42\x39\x88\x3a\xbd\x55\xf2\x69\x98\x1f\xae\xcd\xe8\xc8\xad"
- "\xd5\x79\xf8\xc7\x42\xac\x1f\xdc\x2b\x47\xe0\xac\xd7\x05\xae\xc8"
- "\xe8\x10\xea\x53\x1b\x5e\x26\xfa\x09\x48\x8b\x66\x69\x35\x56\xd1"
- "\x97\x48\xb8\x79\x45\x59\xa7\xda\x34\xef\xf1\xd1\xb1\x1c\x29\x3e"
- "\x12\xca\x12\xb8\xa8\x36\x5d\x6c\x1f\xa6\x8d\x67\x69\xc7\x26\x61"
- "\x5a\x01\x93\xc3\x56\x2a\xf8\xab\xa3\x56\xd1\x5f\xa1\x7d\x71\xf0"
- "\x7b\x16\xda\x18\xfe\x86\x32\xaa\xb1\x7c\x4b\x76\x17\xf6\x21\x8a"
- "\xac\xdc\x91\x56\xe4\x03\xe4\x0b\x9c\xc3\x2a\x7c\xce\x14\x3e\xaf"
- "\x43\xde\xc1\x38\x04\xcf\x43\xbe\x46\xe4\x22\x48\xbf\x0d\xf7\x6a"
- "\xa5\x5f\x86\x40\xb9\x75\x1a\xf1\xda\xc9\x42\xac\xf0\xe5\xb4\x61"
- "\x52\x9a\x74\x1d\xf0\xd6\x39\xbc\x0e\xaf\x97\xf8\x0b\xb9\xcb\x89"
- "\xdc\xc4\xee\xb7\x4e\xc4\xb8\xd0\x6f\x90\xe2\xa2\x6e\x4e\x96\x17"
- "\xf7\x9e\x61\x9c\x56\xc3\xf8\xac\xee\x7d\xbc\x56\xd0\x1f\x70\x65"
- "\x66\x27\xfd\xac\x6c\x19\x51\x97\xb6\x21\x2f\x1e\xa8\x62\xf5\xb4"
- "\x44\x88\xed\xf8\x4c\x68\x07\xe3\xd4\x42\x56\x97\x03\x55\xa5\x5d"
- "\xc2\x39\x17\xb6\x05\xcf\x6d\x96\x9d\xa3\xdd\x06\x38\x67\x11\xf6"
- "\x58\xf6\xbc\x8e\xef\x4e\xee\x95\x1f\xf7\x1e\x06\x0e\x0d\x29\x7d"
- "\x5d\xe2\x5e\x4b\x11\xab\xa7\x65\xb6\xc4\xbb\x20\xf7\x66\xe4\x5e"
- "\xe1\xdc\x73\x62\x9e\x99\xe2\xa7\xc0\xef\x96\x57\x98\x5c\x23\x38"
- "\x51\xde\xad\x62\x3b\xb6\x09\xfd\xec\x2f\x13\x40\xb6\x96\x35\x92"
- "\x6c\xe5\xdf\xd1\x7e\xe0\xfe\x3a\xfc\x2d\xe0\x7e\x8d\xd0\x87\x2d"
- "\xc6\x3c\x58\x27\xe6\x23\xea\xd2\x3d\x63\x6a\xe8\xeb\x5d\x8b\x7e"
- "\x89\xc5\xaa\xc7\xbf\x16\xc7\x85\x88\x79\xd9\x5b\xe0\x17\xea\x27"
- "\x49\x1c\x43\x3b\xa6\x41\x9f\xbf\x09\xf2\xd4\x0b\x7b\x29\xe1\x7e"
- "\x22\xf2\x3c\xc8\x4f\xef\x75\x59\xc5\x32\xeb\x23\x24\xde\x40\x2e"
- "\xa9\xb3\x37\x89\x31\x5d\x7d\x75\xa9\xc8\x25\xe7\xb9\xfa\x23\xca"
- "\x38\xac\xfe\x88\x92\x33\x8e\x9f\xf6\xe4\x0c\x88\x9b\xd7\x77\xe4"
- "\xd6\x17\x2b\xe2\x00\x48\xeb\x9b\x3b\xea\xd3\xd0\x46\x71\x3f\x39"
- "\x81\x9f\x84\xb1\xae\xe3\x3f\x96\xea\x8c\xbc\xd9\xbe\x5a\x1a\xbf"
- "\x38\x5e\x8b\xb1\x9a\xf2\x7e\xc7\x35\x0a\xee\xc4\xfb\x49\xe5\x81"
- "\x97\x42\x3b\x32\x2f\xc3\xf1\x96\xfa\x46\x91\xe7\x77\x28\xb8\x52"
- "\xf4\x61\xc8\x93\x4a\x5f\x75\xe0\x7d\xa5\xaf\x3a\x5e\xd1\x9b\x23"
- "\x8f\xe7\xf8\xef\xab\x8e\x27\x22\x6f\x49\x1c\xa9\xe4\x82\xe3\x79"
- "\xa5\x8a\x58\xf6\x78\xb8\x14\xcb\xba\x79\xb4\x1e\xfb\x4c\x55\x70"
- "\x7f\x13\xbb\xf7\x09\xc0\xab\x39\x44\xba\x37\x9c\x9f\x54\xa7\x07"
- "\x6c\xe6\x1e\x48\x03\x4c\xb5\x88\x31\xa0\x60\x9b\x5d\xc2\xde\x45"
- "\x96\x68\xc0\xdf\x48\xc4\x99\x39\xb5\x8d\x34\xbb\x7d\xc5\xa1\xf6"
- "\x25\x92\x7c\x4f\xfc\x46\x1e\x17\x96\xbc\x4e\x73\xe0\x3e\x29\xf2"
- "\x36\xe6\x43\xda\x66\x71\x0c\x41\x90\xad\x50\xd6\x89\xd8\xb2\xd7"
- "\x95\x6d\x63\xed\x38\x91\x8e\xed\xc0\x3e\x11\xdc\x7f\x02\xc6\x3d"
- "\x10\xf3\xc1\xf7\x23\xa6\xb2\x1e\xcc\x1f\xd2\x74\x1a\xe5\xf1\xd5"
- "\xc1\x70\xe4\x4a\xb1\xef\x59\x0d\xf1\x4e\xa1\x7c\x2c\x66\xc6\x03"
- "\xb3\xf4\x69\xcb\x16\xa6\xa6\x3f\x77\x97\x7e\x61\xea\xc2\xf4\x85"
- "\xf3\x52\x16\xae\x9a\x97\xbe\x70\x49\xea\xb8\xc5\xf3\x9e\x5f\x38"
- "\x5f\xbf\x72\xde\x72\x7d\x74\xc6\xad\x19\x23\x89\x3b\xeb\xbd\xfa"
- "\x79\xcb\x97\xbf\xb8\x78\x41\x92\x3e\x75\xe1\xfc\xf1\xcb\x16\x2c"
- "\x5f\x90\xae\x9f\xb7\x6c\xc9\x8b\xa9\x49\xfa\x5b\x93\xee\xb8\x35"
- "\x7a\x62\xd2\x48\xf9\x18\xda\xcd\x3a\xd2\xca\x5f\x6c\x69\xd9\x7c"
- "\x91\x84\x84\xa9\xd2\x96\x85\x65\x2c\x4c\x65\x63\x76\x7f\x3f\x7d"
- "\xe7\x56\x92\x06\xe7\x35\xb8\x37\x32\xcd\x3d\x61\x83\x4f\x35\xe6"
- "\x83\x76\xea\xe1\x7b\x08\xd4\x3d\xb2\x23\xf7\xef\x3b\xac\xdc\x3f"
- "\x72\x84\x7d\x8f\x21\x1d\xda\x16\x49\x2f\x56\xb7\x40\xcc\x96\x86"
- "\xcf\xd6\xcb\x2e\x92\xf0\xc2\x15\x44\x0d\x87\x06\x0e\x1d\xa7\xc3"
- "\xb1\xae\xbf\x9f\xb4\x72\x27\x6d\x6c\xdc\xf3\x64\xba\x6d\xc4\x85"
- "\x09\x34\xe7\xc2\x04\xa6\x97\x93\x4b\xa5\x71\xe8\xb8\x57\x48\x1c"
- "\xe2\xb3\x89\x3b\x29\x3c\x2f\x7b\x19\xb0\x8c\x63\xb8\xed\x1f\x4c"
- "\x89\x85\x78\xb0\x11\xc7\x60\xe1\xdc\x52\x3b\x47\x34\x50\x2f\xf5"
- "\x47\x6b\xa2\xc9\x16\xb8\xd7\xf2\x08\x4a\x3b\x72\x4f\xc6\x48\xe3"
- "\x69\xd0\x06\x1d\xb4\xa5\x81\xb5\xe3\xef\x37\x0a\xed\x78\x9d\x46"
- "\x6d\x1d\x05\xf5\x7b\x0d\xeb\x73\x32\x49\x6a\x03\xd4\xbb\xc1\xca"
- "\xfd\xbd\x1a\xea\xa9\xc3\x7a\x79\x1b\xeb\xc3\xf1\x2e\xa8\xe7\x6e"
- "\x7e\x05\xc8\x6d\x2c\xdb\x0f\x6f\x73\x29\xb3\x3f\x68\x4f\x73\x19"
- "\x7c\x2f\x68\x23\x9a\x7c\xdc\xb7\xdc\x78\x13\xad\xb5\x3b\x89\x25"
- "\xb9\x81\x84\xbd\x44\x6d\xf4\xff\xb5\xb4\x88\x6d\x6a\x40\x6e\xf8"
- "\xf3\xa2\x06\x35\xb6\x09\x7c\x85\xa6\xac\xcd\xe7\xd8\xa2\x7a\xcb"
- "\xf5\xd4\x4e\xdf\x90\xc7\x5c\xa7\x84\xfd\x9c\x31\xde\x6a\x37\xe2"
- "\xfe\xd7\xa7\x0c\x70\xef\x6c\x31\x36\xb6\xd3\xee\x39\xb2\x58\xea"
- "\x14\xe2\xcc\xee\xa3\xec\x10\xa9\x6c\xdc\x23\x1d\xaf\x61\xfa\x3f"
- "\xb5\x1b\xae\xb1\xc9\xca\xcf\xf1\x2c\x1f\xcb\x84\xef\x36\xe9\x3e"
- "\xac\x1f\x7e\x0a\x63\x02\x1b\x60\xd9\xe6\xe3\x7e\x51\xaf\xbd\x4e"
- "\x4f\x5a\x20\x7d\x73\x27\x51\x43\xde\x93\x65\xaf\x0b\xe5\xb7\x80"
- "\xdc\xa7\x63\xf9\x2f\x5f\x4f\xc8\x7a\xc8\xd3\x9e\x7b\x32\xdb\x2e"
- "\xec\x57\xfe\x31\xfa\xb5\x0c\xcf\x71\x6c\x11\xcf\xf7\x7a\xe0\x39"
- "\xf6\x35\x8c\x09\xb7\x42\xf9\x80\xa1\xcd\x17\xc0\x0f\xc3\xef\x3b"
- "\xb6\x12\x03\xde\x07\xbe\xd7\xe3\x78\x08\x94\x99\x20\xdd\x8f\x02"
- "\xfe\x0b\x78\x36\x06\x23\x62\x6b\x1c\x8e\x5d\x67\x65\x50\xfa\x11"
- "\xf0\x3b\xd6\x11\x31\x06\xd7\xe4\x49\x98\x02\xac\x9f\x14\x70\x15"
- "\x4e\x0c\x34\xf7\x63\x5d\xd9\x28\xc8\x07\xb8\x2a\x05\x3c\x21\xae"
- "\x20\xaf\x49\xc2\x14\x60\xad\x1e\xf3\x41\x1d\x46\xee\x59\x15\xab"
- "\x46\x8e\x6c\xe6\xfe\x31\x1e\x31\x46\xff\xe7\xd1\x06\xfa\xfd\xa7"
- "\x1a\x98\x9e\xfe\x31\xde\xe2\x60\x3a\x70\xcb\xfd\x1f\x44\x26\xf7"
- "\x7a\xc0\xf1\x48\x94\x33\x1b\xab\xfe\xc7\x78\xa8\x5b\xbd\x10\x8b"
- "\xaf\x05\x1d\x08\xbe\xea\xe3\x56\xbc\x5e\x94\x61\x8d\x5b\x86\xff"
- "\x98\xe6\x4d\x86\x1e\xb2\x53\xb3\x3d\xd1\xff\x11\x8f\xb6\x02\xd7"
- "\xac\x91\xf6\x39\xf7\xa6\x4b\xb8\x87\x5a\xbd\x95\x84\xe0\x3d\x0e"
- "\x85\x0b\xf9\x77\x49\xf7\xd8\x0c\xb2\xb6\x65\x25\xf7\x89\xe7\x43"
- "\x3b\x08\xc1\x31\x71\xbc\x3e\x2a\x1c\xe5\xfb\x8f\x56\xf7\xf5\xd4"
- "\xee\x79\xfd\xad\xf3\x15\x75\x15\x0e\x9a\xdb\x40\xb6\x8c\x02\x1c"
- "\x09\xf5\x6d\x18\xd7\x57\x7d\xa3\xf4\xcc\x4f\x9a\x6f\x46\x7c\x37"
- "\x2c\xb0\x14\x11\x82\x69\xe2\xef\xf8\x76\xf0\x3d\x9e\xe3\xfb\xbe"
- "\x9f\x37\x34\xbc\xad\x7c\xde\xd0\xb0\xd5\xd7\xf3\x06\x8f\xfb\x7e"
- "\x86\xf7\xe5\xcb\xe2\x55\xb2\x7b\xd7\xf0\x5e\xee\x2d\x5d\x7f\xc7"
- "\x0e\x79\x7f\xe6\x93\x1f\x63\x1d\xea\xc0\x4f\xd1\x1b\xe3\x55\x14"
- "\xca\x39\x24\xf8\xf0\x4f\xa2\x59\xfc\x82\x71\xd1\x27\x3a\xcc\xe3"
- "\xd9\x8e\x9e\xbf\x90\x70\xec\xff\x92\x4e\xe1\xc7\xf0\x87\x88\x0e"
- "\x3f\x6f\x4a\x90\x4e\x73\x8a\xcc\x84\x7a\xf9\xa1\x21\x44\x2f\xe4"
- "\xa7\xf0\xc7\x92\xc4\xdf\x36\xe1\x87\xba\x27\x7f\xcf\xf9\x01\xfc"
- "\x8d\x60\xf5\x15\xca\x73\x10\x95\x78\xbf\x0c\x59\x8e\xa9\x7d\x5c"
- "\x4d\x89\x74\x89\xb7\x3f\xf4\x36\xd9\xf1\xd0\xa7\xd7\x17\x09\x99"
- "\x29\x75\x8a\xe5\x4b\xbf\xa9\xfc\x37\xa6\x28\x7f\xc3\xdf\xb0\x39"
- "\xb2\x1b\xdc\x34\x2c\x49\x98\x26\x75\x4b\x4d\x4f\x12\xb7\x43\x27"
- "\xbf\xa5\x8e\x64\x0f\x17\xbe\x84\xe1\x7f\x0e\x28\xcf\x00\xe7\xf5"
- "\xa6\x9e\x0c\xdf\xb3\xaf\x93\x65\x3f\xc6\xaa\x7f\x73\x48\x1f\x6d"
- "\x0c\xf4\x6f\xac\xec\xfb\x4d\xec\xe3\x07\xd5\x83\x58\x7e\xdf\x7f"
- "\xfa\xfa\x11\xd2\x57\x37\x3c\x6e\x9e\xee\x2d\xab\x5b\xfe\x37\xef"
- "\x92\x92\xe4\x08\x75\x9f\xff\xa1\x41\xf9\xfb\xbf\x1c\xca\xdf\xb7"
- "\x4f\x1b\x8c\xaa\x9b\xf1\xbf\x2c\xeb\xb5\x84\xdc\x16\xde\x93\x18"
- "\xe6\x61\x32\x61\x85\x1e\x26\xe4\xfe\x13\x6b\x33\x0c\xea\x53\x2c"
- "\x4b\x56\x7b\xcf\x7d\x69\xfe\x46\xaf\x13\x0d\xe2\x26\x9b\xae\xd7"
- "\xc9\xfb\x3c\xd2\xf0\xf7\x55\x7a\x31\xed\xc7\x07\x7a\xe5\x17\xd2"
- "\xf4\xb2\xdf\xaa\x58\xf8\x6f\x07\x30\x6b\x42\xef\xbc\x43\x7f\x43"
- "\x7f\x7e\xfc\xa9\xd0\x3e\x86\xfe\x2e\xd1\x1f\x65\x5e\x1c\x98\x48"
- "\xf8\xc0\x7f\xb4\x87\x28\xa9\x78\x82\x8a\x09\x54\xfc\x32\x28\x7e"
- "\x7c\xe8\x6f\xe8\x6f\xe8\x6f\xe8\x6f\xe8\x6f\xe8\x6f\xe8\xef\x3f"
- "\xe0\x4f\x25\xef\x58\x63\xff\xf4\x6a\xf1\x53\xde\xff\x51\x89\x87"
- "\x3c\x8d\x1b\xc8\x75\x54\xfc\x23\xd9\xb1\x66\xfd\x8e\x44\xab\xae"
- "\x70\x56\x7d\xf4\x9e\x34\x5b\x48\xce\xb4\xea\xff\x7f\x1a\x2b\x32"
- "\x5e\x48\xcc\x88\xb8\x61\xb1\xa3\xe2\x07\x4b\x8b\xcb\x11\x95\x25"
- "\x29\x4f\x44\xa6\x84\x5c\x31\xd9\x52\xf2\x85\xa7\xc7\xe7\x8c\xce"
- "\x9a\x9c\x37\x32\x73\x62\xee\xd8\xec\xa9\xf9\xc3\xd4\xe4\x74\x48"
- "\x69\x51\xd2\x23\xa1\x49\x41\x97\x8c\x36\x15\x7d\xe2\xea\xf2\x3a"
- "\xa5\xb5\x2a\xeb\x95\xd4\xac\xa8\x5b\x56\xbb\xaa\x7e\xb1\xb5\xb9"
- "\x1d\x53\x5b\x96\xf6\x4c\x6c\x5a\xd8\x35\xb3\x6d\x65\xdf\xf8\xfa"
- "\xfc\xce\xe9\xad\xcb\x7b\x27\x37\x2f\xee\x9e\xdd\xbe\xba\x7f\x8c"
- "\x8d\x8e\x07\x15\x17\x26\x3e\x14\x9c\x18\x78\xd1\x70\x63\xe1\x47"
- "\xce\x4e\xcf\x93\x9a\x2b\x33\x5f\x4a\xce\x8c\xbc\x69\xb9\xb3\xf2"
- "\x27\x6b\xab\xeb\x51\xd5\xa5\xa9\x4f\x45\xa7\x86\x5e\x35\xdd\x5a"
- "\xfa\x95\xb7\xd7\xf7\xac\xee\xda\xdc\xb7\xb2\x73\x63\xef\xda\xee"
- "\xad\xfd\xcb\xdc\xec\x7c\x58\x79\x71\xf2\x63\xe1\xc9\xc1\x97\x8d"
- "\x37\x17\x7f\xe6\xee\xf6\x3e\xad\xbd\x3a\xfb\xb5\xf4\xec\xe8\xdb"
- "\xd6\xbb\xab\x7f\xb3\xb7\xbb\x1f\x57\x5f\x9e\xfe\x5c\x7c\x7a\xf8"
- "\x75\xf3\xed\xe5\xdf\xf9\xfb\xfd\xcf\xeb\xaf\xcf\x7f\x2f\x3f\x3f"
- "\xfe\xbe\xfd\xfe\xfa\xff\x94\x84\x1f\x03\xd3\x8f\xc9\xf4\x8e\x37"
- "\x08\xd5\xd6\x41\x8e\xfe\xff\x4c\x8c\xd0\x78\x87\x08\x34\x98\x32"
- "\x30\x72\x30\xb0\xb1\x90\xd1\x53\x20\xd7\xbf\x38\x80\x02\xb2\x7e"
- "\x62\x00\x68\x7f\x1a\x68\xce\xcf\x18\x88\xa5\xc1\x22\x88\xde\xbf"
- "\x12\x91\x66\xd0\x1e\x30\x02\xfd\xce\x0c\x74\x19\x2b\x03\x1b\x30"
- "\xb4\x38\x18\x38\x19\xb8\x18\xb8\x19\x78\x18\x78\x19\xf8\x18\xf8"
- "\x19\x04\x18\x04\x19\x84\x18\x84\x19\x44\x18\x44\x19\xc4\x18\xc4"
- "\x19\x24\x18\x24\x19\xa4\x80\xbe\x91\x61\x90\x65\x90\x63\x90\x07"
- "\x06\x8a\x22\x76\xbf\x34\x30\x38\x48\x00\x09\x20\x0a\x60\x70\x00"
- "\xf3\x13\x46\xc5\xe9\x2a\x7e\x00\x2a\x7e\x01\x2a\xfe\x60\x54\x9c"
- "\xae\xe2\x0a\x03\x4c\x2b\x0e\x28\xcd\x08\x6c\x32\x40\x5a\x0d\x28"
- "\x6d\x07\x38\x40\x17\x65\x84\x02\x38\x9f\x81\x80\x7e\x0c\xf3\x50"
- "\xf5\xa3\x03\x07\x20\x36\x81\x30\xeb\x19\x18\x20\xf3\x0c\xff\x91"
- "\xc1\x9f\x69\x8c\x87\x58\x04\x1b\x40\x53\x26\x1c\x0c\x22\x60\x92"
- "\x30\x58\xaa\x02\xc4\xc0\x72\x7e\xa9\x0d\x10\xdb\x03\xb1\x37\x10"
- "\x87\xc2\xcc\x66\x60\x64\xba\xc3\x00\xda\xcb\xcd\xc8\x5c\xc1\x00"
- "\xda\x4f\xc7\xc8\xea\xc2\xc0\xc8\x7e\x84\x81\x91\xad\x85\x81\x91"
- "\x93\x05\xe1\x78\x21\x05\xb8\x2b\x19\x05\xa0\xe2\x40\x21\x46\x91"
- "\x15\x48\x96\x91\x5a\x9f\xed\x70\x0d\xf1\x50\x30\xd4\x33\xd1\x33"
- "\x35\x50\xd0\x0d\xd0\x55\x30\x32\x30\x34\xd0\x37\x30\xd1\x37\x34"
- "\x53\x30\x34\xb6\x32\x36\xb0\x32\x30\x57\xc8\xad\x2c\xca\x34\x34"
- "\x48\x4f\x55\x48\xcb\x2c\xca\x2d\x4f\x2c\x4a\x25\xc2\xd3\xa4\x03"
- "\x90\xef\x64\xff\x42\x9c\x89\x1c\x43\x8c\xc0\x1a\x84\xe9\x61\x03"
- "\x03\xd3\x57\x0b\x06\xb8\x0c\xe3\x04\xa8\x57\x34\xa0\x18\x15\x30"
- "\xf6\xbe\x60\x60\xec\xba\xc0\xc0\xd8\xc6\xc1\xc0\x58\x0f\x0c\xcb"
- "\x0a\x16\x06\xc6\xb5\xc0\xf0\x5d\xe5\xc1\xc0\xb8\x34\x83\x81\x71"
- "\x3e\x0f\x03\xe3\x74\x13\x4c\xb1\x6d\x37\x20\x62\x97\x81\x7a\xcf"
- "\x01\xf1\x89\x08\x06\xc6\x03\x2e\x10\xb1\xfb\x16\x0c\x8c\xb7\x54"
- "\x68\xe2\x77\xf2\x01\xa9\xf1\xcd\x08\x00\xb0\xe3\x2b\x95"
+static unsigned int ethp_z8e_uncompressed_length = 385956 ;
+static unsigned int ethp_z8e_length = 120433 ;
+static unsigned char ethp_z8e[120433 + 1] =
+ "\x78\x9c\xec\xbd\x7f\x7c\x94\xc5\xb5\x3f\x7e\x76\xb3\xc0\x26\x06"
+ "\x36\x42\x84\x95\xa2\x5d\x2c\x68\xb4\x20\xd1\x62\x4b\x2d\xd4\x20"
+ "\x41\xc1\xf2\x4b\xc1\x36\x2a\x1a\x50\xa0\x8b\x46\x88\x10\x61\x81"
+ "\x90\x5d\x16\xb4\x09\x02\x89\x1a\x35\x4a\x48\xe8\x15\x2d\x6d\x69"
+ "\xc5\x16\x2b\x3f\x42\x59\x9a\x78\x2f\xd0\x24\x9b\x56\xf0\x93\xdb"
+ "\x8b\xb7\x2b\x37\xd2\x94\x1b\x60\x4b\x16\xb2\x26\xbb\x3b\xdf\xf7"
+ "\x99\x79\x9e\x64\x77\xd9\xa0\xdc\x7b\x5f\xaf\xef\x3f\xcd\xeb\xb5"
+ "\x79\x9e\x67\x9e\x99\x33\x33\x67\xce\x39\x73\xce\xcc\x99\xf3\x10"
+ "\x5d\xfd\x9f\x8f\xcc\x7c\x31\x90\xb1\xa9\xec\xf0\xff\xa0\xfc\x3f"
+ "\xff\xfe\xf9\xf7\xcf\xbf\x7f\xfe\xfd\xf3\xef\x9f\x7f\xff\xfc\xfb"
+ "\xff\xf7\xcf\x6f\xa0\xb1\x17\x8c\x26\xfa\x43\x19\x51\x87\xdb\x3c"
+ "\xcc\x47\x91\xbc\x37\x5e\x15\x21\xbc\x32\x60\x9e\x1f\xc6\x57\xfe"
+ "\xbd\x82\x34\x63\x19\x99\x6f\x4a\xa3\x34\xf1\x86\xd5\x38\x69\x1b"
+ "\x51\xf9\x60\xd1\xf6\xea\xeb\xc2\x5f\x57\x48\x54\xbb\x03\xcf\xaf"
+ "\x8b\xd6\x57\x07\x8b\x00\xe0\xcc\xf3\x51\x6e\x39\xc3\x59\x8f\xe7"
+ "\xf5\x48\x47\x5a\x81\x8f\xe6\x6d\xe0\xb4\x52\x94\xd3\xd3\xbd\x1b"
+ "\x2e\x51\x9d\x2d\x44\xa5\x0c\xc7\x16\xa6\xec\xe1\xb2\x1d\xdb\x91"
+ "\x37\x95\xf3\xae\x1b\x8c\x7a\xd3\x89\xdc\xaf\x8b\x60\x54\x1b\xcc"
+ "\x5c\x0f\xd7\xad\xe5\x6f\x8a\xab\xcf\x8f\xb4\x16\xbd\xbe\x5e\x60"
+ "\xa4\x71\x79\xee\x83\xed\x46\x4a\x3a\x4d\xd7\x5c\xc7\x30\xb9\x6d"
+ "\xc2\x4d\x66\x6f\x67\x88\x4e\x53\x72\x46\xbb\x9b\x92\x6a\x81\x8d"
+ "\x2d\xaf\xcb\xf4\x24\x6f\x20\x44\xb6\x22\x32\xe0\xdd\x74\x5c\x8d"
+ "\x28\xd7\x9f\xf1\x33\xbb\x92\x46\x70\xdd\x80\x6b\x12\x46\x8f\xa1"
+ "\x7a\x20\x11\xe3\x28\x60\xa4\x5b\x02\x6e\x32\x74\xb8\x93\xd1\x7f"
+ "\x73\x86\xec\x3f\xea\x45\x59\xd3\x69\x4a\xf9\x87\x11\xf9\x51\xa7"
+ "\xdf\xb6\x9a\xdb\x90\xf2\x91\x70\x7b\x8c\x3a\x9c\x88\xdb\x73\x4d"
+ "\xd5\x2b\x44\xed\x6e\xe3\xd4\x80\xd1\x22\x34\x38\x35\x3a\x1c\xce"
+ "\x87\xba\x52\xb9\xae\x76\xb7\xe9\x95\xa8\x3c\x3e\x3d\x0f\xda\xed"
+ "\x1f\x13\xa0\x24\x6e\xf3\x29\x4a\x19\xc7\xf5\x69\x7d\x31\x71\x1d"
+ "\xde\x15\x21\xf2\x62\xec\x51\x77\x3a\xfa\x6a\xab\x0d\x12\x01\xe6"
+ "\xb5\xd5\x45\x44\x0c\x1f\xed\xb7\x29\x98\x29\x63\x75\x98\x0c\xa3"
+ "\xbb\xaf\x6e\xcf\xc0\x6a\xd9\x46\xee\xab\x99\xb4\xbc\xf3\xa2\xdb"
+ "\xc8\x70\xd1\x97\x21\xdc\x97\x3a\x50\x94\x96\x67\x43\x37\x3e\xba"
+ "\xfb\x7f\x4d\x56\x1c\x6c\xab\x82\x6d\x00\x6c\x83\x47\x2b\xd7\xdd"
+ "\x7f\x5f\x5c\x7e\x95\x37\x2d\x39\x60\x14\x1a\x1e\x52\x5a\x7b\xf2"
+ "\x26\x97\x47\xe7\x45\x7b\x8c\x0a\xb7\x64\xf4\x51\x4a\x33\xfa\x99"
+ "\x84\x3c\xd3\x30\x8e\x36\xed\xfd\x75\xda\x7b\x2b\xde\xdd\xa3\xe0"
+ "\x5d\x33\x2e\x0a\x5e\x1a\xc3\x8b\xa6\x2d\xc5\x51\x26\xfc\xfa\x40"
+ "\x41\xee\x8b\x5f\x3f\xb3\x4e\x6f\xcb\xad\x22\xe2\xbc\x1e\x7d\xda"
+ "\xb8\x2f\x2b\xe2\x16\xe4\x75\x04\xc9\x36\x94\x9c\xa7\xe8\x9a\xdd"
+ "\x80\x4f\x5b\x56\x93\xd9\x99\x2f\x82\x5e\x47\x1b\x35\xfa\xdb\xc8"
+ "\xe9\x07\x6f\x84\x2e\x52\xd1\x45\xd0\x62\xe8\x2c\x15\x3d\x47\xd6"
+ "\xba\xc2\xcf\x29\x11\x2d\x47\x8c\x82\x9c\xc3\xb8\x6c\x0b\x35\x56"
+ "\xb6\x90\xb3\x32\xb6\xac\xf3\x06\xb2\x36\xe0\x19\x63\x6e\xe1\x76"
+ "\x30\xbf\x85\x52\xf6\x65\x15\xbe\x49\x26\xe7\x70\x32\x36\x2c\xf0"
+ "\x68\x6d\x49\x75\x70\x5b\x36\x9c\x21\xf3\xdb\x8b\x40\x87\x67\xb8"
+ "\xbd\x87\xb3\xde\x5b\x1d\x34\xd6\x5a\xa7\x51\xad\xf5\x24\xd5\x59"
+ "\x27\x50\x9d\x23\x9b\xb6\x9c\xa1\xd4\xda\xe0\x78\xaa\x33\xdd\x47"
+ "\x75\x23\xb2\xc9\xdb\x86\x7b\xf0\x6f\xad\x35\x40\xb6\x15\x4c\x4f"
+ "\xa9\xf6\xf2\xa7\xc9\xec\x53\x30\x81\xbb\xd4\x82\xc3\x05\x44\x8c"
+ "\x3b\x7e\x4e\xd4\x8f\xe5\xd7\x93\x15\xed\x6b\x45\x5b\xbe\x8b\xb6"
+ "\xfc\x6a\x84\x95\x32\xd1\xe6\x7e\xde\x8a\x10\x99\x0a\x29\xb9\x17"
+ "\x3e\x4e\x8f\x80\xf6\xc0\xbb\x6d\x55\x90\x27\xcc\xbf\xed\x6b\x72"
+ "\x20\x13\x52\xc1\xff\xa9\x1b\x34\x1e\x68\x73\xfe\x94\x4c\xed\x2b"
+ "\x73\x0c\xd5\xaf\x8b\x96\x0e\x77\x7f\xd2\xdf\x81\x17\x5b\xf0\xbe"
+ "\x75\x4c\x3a\xa5\x79\x43\x59\x74\xa8\xb3\x95\xf9\xb1\x6d\x40\x80"
+ "\x0c\x0c\xcf\xe2\x00\xef\xac\xa0\x3e\x68\xcf\x9f\xaa\x91\xfe\x0d"
+ "\xe4\x43\xf9\x2c\x1f\xbd\xd6\xc6\xe5\xc5\x90\xc7\x02\x91\x21\x8f"
+ "\x5d\x8c\xbc\xf1\x58\xbb\x78\xe3\xb1\x0b\xe1\x37\x1e\xfb\x87\x73"
+ "\x15\x99\xc3\x43\x1e\xf3\x37\xe6\xcb\x31\x48\x6b\xcc\xc7\x18\x84"
+ "\xc9\xbc\xf6\x2c\xa5\x3d\xf1\x1c\xc6\x3e\xf4\x29\xad\x5d\x4c\xd6"
+ "\x48\xf2\xa1\xa0\x37\x74\x82\x9e\x28\x24\x11\x49\xf6\x98\x13\xf5"
+ "\xaf\x3d\xe5\xb0\x4b\xe7\x2d\xd4\xbb\xd7\x67\xdc\x3b\x8e\xeb\xf5"
+ "\x27\x1f\x75\xe1\xb7\x01\xbf\x62\xfc\x36\x89\x94\xc3\x9b\x80\x2b"
+ "\xe7\x80\x75\x06\xaa\xea\x24\x1a\x13\x21\xc3\x19\xea\x7f\x1c\xed"
+ "\x4f\xeb\x05\x6f\xc3\x22\x1b\x8f\x7b\x6e\x71\x51\x51\x47\x87\x9d"
+ "\x58\x16\xb2\xfc\x63\x79\xd8\xe1\x1e\x60\x43\x3d\x0e\xc9\xbf\xaf"
+ "\x43\xc6\xa4\x1c\xf7\x20\xbd\x35\xb0\xc6\x6e\xf0\xaf\xb1\x1b\xdb"
+ "\x53\x8e\xd7\x22\x4f\x36\xf2\xec\xd6\x70\xd8\xca\xb0\xc0\x5b\xfe"
+ "\xfe\x21\x4a\x02\xcc\xfc\x0f\x2f\x35\x9b\xb6\xbd\x2e\x4e\x22\x5f"
+ "\x5e\x37\x2c\xc0\x06\x1c\xe0\x7f\x80\x4b\x4f\x03\xae\x5b\x36\x23"
+ "\x1f\x97\xf7\x06\xb3\x78\x4e\xf1\x79\xf3\x5a\xc9\x12\xa2\x14\xd1"
+ "\xa5\xea\x43\x9e\x56\x96\xe9\xfd\x83\xd4\xb7\xc3\x4d\xb3\x18\x36"
+ "\x97\xf3\xb6\xb5\x12\xca\xd5\x0a\xa7\xdd\x88\xf4\x19\x1d\xc2\x6e"
+ "\xd8\x80\xf4\x5a\x94\xd7\xea\x6e\xd5\xdb\xc8\x75\xf0\x58\xcb\x76"
+ "\x82\x1e\x6a\xf3\x82\xd4\xbf\x82\x92\x50\x6e\x36\xc3\x63\x58\xa0"
+ "\x03\x1f\xfa\x5a\x5b\x9b\xe7\xa7\x88\x88\x81\xe9\x53\xf0\x2c\xe3"
+ "\x62\xe0\x21\x5d\x00\x1e\xd3\x5f\x1d\xca\xf4\xdf\x2e\xe1\x3d\xf4"
+ "\x61\x84\xe1\x05\xc9\x64\x93\xed\xfd\x21\xc3\xe8\x60\xf9\x01\x98"
+ "\x9e\x15\xf7\x52\x1b\x59\xb6\xfb\x9d\xf6\xa4\x46\xcc\x9b\x5c\xfe"
+ "\xbd\xa2\xd6\x3e\xa2\x3d\x27\x89\x69\x8e\xdf\x7b\x43\x17\x38\xcf"
+ "\x3a\xd1\x6e\x4f\xea\xdf\x06\x59\x84\x3c\x28\xef\xe0\x76\x46\x8f"
+ "\xe5\x43\x93\x7f\x38\x81\x7e\x98\x3d\x35\x7b\x02\x4d\x9f\x38\x69"
+ "\x02\x65\x7e\x77\x74\xe6\xd8\x6f\x7d\xe7\x5b\xf2\xe6\x5b\xdf\x19"
+ "\xf7\x2d\x9a\xf5\xa3\x87\x26\xd0\xac\x19\x13\x68\x36\x7e\xb3\x66"
+ "\x4f\x7e\x28\x7b\xf2\xec\x09\x94\x73\xdf\x54\x3c\x4d\x9a\x70\x47"
+ "\xe6\xfd\xa3\x67\x4d\x9a\x3a\x99\x1e\x9c\x73\x67\xe6\x9d\x77\xd2"
+ "\xc4\xc9\xd3\xee\xc8\xcc\xd4\xae\x77\x64\x72\x96\x47\xc7\x4d\x9e"
+ "\x3d\x7a\xd6\xb2\xa5\x05\x4b\x47\xcf\x98\x3a\x89\x53\x20\xdd\xa2"
+ "\x68\x28\x23\x7c\x29\xc2\xb8\x0e\x88\xf3\x53\x28\x02\xd9\x51\x05"
+ "\x1a\xc0\xaf\xcd\x53\x74\x0a\x32\xe0\xda\xe7\xab\x78\xec\xe4\x1c"
+ "\x60\xa9\x01\xdf\x9b\x3a\xdc\x69\x85\xc0\xa1\x9f\x71\x68\xbb\x89"
+ "\xe5\xc4\x90\x7d\x78\x77\x58\x9b\x6b\xfa\xe0\x7d\x65\xec\xfb\x41"
+ "\x90\xc1\x96\x7f\x6b\xb4\x11\x79\xf1\x03\xde\x03\x90\x85\xc0\xaf"
+ "\x9f\xda\x9d\x39\x7d\x40\xdf\x06\xd4\xd1\x02\xde\x6c\x42\xd9\xe6"
+ "\x28\x9e\x6f\xc1\xf8\x34\xf1\xbc\x72\x8e\xd2\xde\x6f\x2c\xc8\x22"
+ "\x1e\x27\x6f\x81\x06\xe3\x62\x37\x8c\x14\x09\x03\x63\x0f\x38\xc7"
+ "\x15\x9c\x6b\x6d\x51\xf2\xc1\xc7\x70\xb6\xe0\x9d\x06\xeb\x62\x23"
+ "\xe4\x04\xe4\xf8\x03\x11\x67\x06\x89\x94\x7d\x53\x22\x5d\x19\x72"
+ "\xae\x44\xb9\x9c\x28\xba\x0e\xd4\x39\x90\xef\xed\x29\x06\xd0\x81"
+ "\x01\xf3\x2f\xfa\x92\xb6\x00\xf4\x1d\x08\x6f\x3c\xfa\xb2\x38\x9f"
+ "\xc3\x7a\x44\xdf\xd3\x34\xf0\x4f\xe8\x5f\x7d\x64\xe3\xd1\x32\xd1"
+ "\x21\xd3\x18\x6f\x7b\x05\x3f\xa7\x20\x5f\x57\x77\xda\x3e\x4e\x03"
+ "\x1d\x24\x31\xbf\x0a\x21\xd3\x31\x67\x0e\x5c\x05\x99\xd6\x8c\xbc"
+ "\x65\x9c\x77\x4c\x88\xfa\x41\xd6\x58\x6d\x4e\x03\x9d\xa2\x81\x14"
+ "\x49\x39\xfa\x4a\x54\x7d\x80\x33\x90\x27\x29\xa6\x47\x53\xc7\x79"
+ "\xc0\x69\x97\xe9\xd0\x63\x06\x3e\x0e\xf8\xaf\xb2\xac\x54\xf2\x7b"
+ "\xc8\xbf\x73\x3e\x6d\x6e\xee\x79\x06\xaf\x2b\x38\x43\xfe\xbd\x16"
+ "\xb8\x64\x7d\x81\xf5\xbf\x0e\xf7\xc0\x39\x3e\xea\xef\x57\x73\xe3"
+ "\x90\x66\xce\x1b\x41\x1b\x45\xea\xf5\xad\x80\x5b\xee\x59\xdd\x46"
+ "\xa7\xf3\x79\xae\x1d\x98\x16\x71\xda\x29\xb6\x4d\xd7\xd6\x73\xfb"
+ "\x59\x7e\x00\x17\x27\x40\x07\xc9\x80\xb7\x23\x96\x0e\x06\x7a\x00"
+ "\xe7\x65\xb4\xaf\x19\x7d\x7a\xd9\x47\xd7\x1e\x89\xb4\xdb\x51\x2f"
+ "\x19\xc1\x57\x90\xe7\x3d\x30\xb4\xf2\x2d\xb1\xe5\xaf\x2d\xe6\x72"
+ "\xc8\xdf\xa7\xa3\x5d\xe6\xdf\xc4\x38\xd7\xe8\x0e\x74\x39\x28\x3d"
+ "\x8e\x2e\xb7\xa1\x2d\xff\x19\xf5\x7e\x6c\xdc\xfb\x75\x78\xff\x5f"
+ "\xda\x7b\xf0\xfd\xa0\x39\x71\x74\x9b\x8f\xf7\x7f\x43\x7b\x03\xe0"
+ "\x6b\xe8\x16\xd7\x4e\x01\x8d\xf9\xa3\xf2\x6f\x88\xcb\xbf\x1d\xf9"
+ "\xff\x9b\xe9\x86\xe7\x1c\xce\x5f\xad\xf1\x0e\xf2\x9b\x91\x7f\x4f"
+ "\x5c\xfd\xf3\x91\x3f\x10\xd5\xbe\xe3\xb1\xef\xd3\x2b\xf1\xfe\x0b"
+ "\xa6\x75\xe8\x44\x7d\x90\xa7\x1f\xcb\x12\x96\x63\xb5\x79\x3c\x5e"
+ "\xe9\xa6\xb8\xfc\x23\x90\x2f\x55\xc3\x91\x51\xc3\xd1\x14\x1e\x47"
+ "\xd4\x71\x52\xb5\x21\x7d\x5c\x5c\x99\x1c\x94\x49\x07\x1e\x5f\xd6"
+ "\xe9\x32\x41\x99\xbc\xb8\x32\x9b\x78\x1c\x85\xaa\xc7\xd4\xd1\xd5"
+ "\x53\x46\x93\x91\xd1\x30\xb8\x6f\xd7\x00\xc6\xee\x58\x18\x83\x5b"
+ "\x51\xef\xb0\xcd\x4a\xee\x5c\x03\x1a\xba\x13\x69\xff\x0e\x98\xaf"
+ "\x31\x0f\x80\x57\x03\x5e\x7f\x90\x84\x73\x4a\xaa\xa2\xdd\xeb\xae"
+ "\x1d\x10\x22\xbe\x1f\xcd\xf7\x0c\x5b\x74\x4c\xd3\x78\xf2\xba\x6b"
+ "\x71\x45\x7a\x3a\xeb\x6f\x06\x96\xc1\xa2\xe3\x07\x11\x05\xf3\xba"
+ "\xbb\x84\x91\x8c\x78\x0e\x6b\x75\xfc\x09\xcf\x06\xb4\xff\x15\xcc"
+ "\x39\x24\x56\x22\xdf\x6a\x9a\x84\xf4\xc3\x92\x57\x55\x3e\xf9\xac"
+ "\xea\x98\xc2\xf4\x3d\x16\xcf\xfb\xb4\xf2\xef\x33\x3c\xdc\xdf\xa1"
+ "\xdd\x1b\xc2\x0c\xeb\xbc\xce\x83\x83\x7f\x2e\xcb\x81\x0f\x25\x7c"
+ "\x94\x17\x2b\xe5\x3b\x86\xf9\x1a\xae\x53\x71\x5d\x87\xeb\x83\xb8"
+ "\x3e\xee\xfc\x82\xac\xce\xb0\xe4\x47\x7e\x9e\x8a\xeb\x43\xb8\xde"
+ "\x85\xeb\x6c\x5c\x87\xe3\x7a\x2f\xfa\x10\x66\xbe\xc0\x3c\xca\x36"
+ "\x56\x00\xf3\xaa\xa2\x2d\xb6\x01\x3a\xa6\x30\x0e\x26\x23\x4f\xab"
+ "\xe4\x57\x25\x5f\xcc\x6a\x1c\xaf\x6b\x93\x69\x29\x32\xad\x9f\xa2"
+ "\x07\x95\x16\xd6\xe5\xd0\xf9\x9e\x34\x4d\x36\x69\xbc\xa8\xa5\x29"
+ "\xf8\xb3\x00\xdf\xc3\x6d\x15\x0a\x56\x1f\x35\xe6\x1a\x7c\x55\xce"
+ "\x94\xa0\x4e\x43\x74\x9d\xb8\x96\x3b\x1d\x42\xe0\xea\xe2\x31\xf2"
+ "\xd1\xe0\xdd\x42\xd2\x3d\xe6\x58\x05\x6f\xae\x96\x6f\x2c\xe3\x58"
+ "\x96\x97\xe9\xe9\x4d\x51\xb4\x34\xb0\xc3\x3d\x38\x14\xc7\x47\x99"
+ "\xa0\xa5\xdb\x99\x66\x18\xef\xdc\xb7\x01\xf9\x72\x1e\x97\x7d\x91"
+ "\xf0\xcf\x2b\x9a\xac\xd2\xec\x56\xc5\xbf\x43\xb2\xe3\xe4\x8b\xa4"
+ "\xd9\x38\x7e\x6f\x63\x9c\x27\x15\x32\x1f\x0c\x81\xfd\xf7\xde\x30"
+ "\xa9\x33\x6e\x3c\xfa\x3a\xbf\x0f\x60\x8c\xb9\xde\xa4\x7c\xee\xc7"
+ "\x90\x72\xfd\xbd\x7c\x97\x7c\x22\x8b\xe9\x3b\x29\x4f\xbe\xdb\x8d"
+ "\xf9\x68\xaf\xfe\x4e\xaf\x27\xa9\x40\xbe\xab\xef\x81\xbb\xcf\xae"
+ "\xc1\x4d\x4a\xa4\xf3\x89\xe2\x7d\x39\xa3\x89\x8c\xb7\xb9\xa8\x8f"
+ "\x37\x74\x9c\x66\x86\x44\x78\xb4\x8b\x92\xbd\xa1\x5d\x74\x2b\xd1"
+ "\xb5\xde\xd0\x49\xba\x8d\x68\xb8\x37\x54\x0e\x1d\x64\x07\xbf\x3f"
+ "\x74\x0b\x19\x0c\xb8\x3a\x6f\x76\x19\x0d\xde\x50\x01\x8d\x70\x99"
+ "\x70\xcd\xa3\xfb\xfa\x88\x0e\x6f\x68\x1a\xf2\x2d\xa0\x99\x61\x71"
+ "\x3e\xbb\x8f\xf8\x6b\x6e\x98\xd2\xa6\xbd\x20\x9c\xde\x10\xec\x81"
+ "\x50\x3d\xd2\x23\x62\x66\xf8\x0b\xfc\x3a\x44\xa4\x78\x9f\x7d\x66"
+ "\xf8\xbc\x98\xf4\xc2\x21\x3c\xff\x55\x60\x8c\x84\x37\x34\x9e\x1a"
+ "\x03\x01\xe4\x73\x0a\x51\xb2\x2f\xe7\x89\x8b\x46\xea\x82\x0e\x11"
+ "\x29\xd9\x67\x47\x5f\x1c\x5d\xe8\x07\xe6\xd7\x95\x5d\x6b\x70\xdd"
+ "\xb8\x6f\x85\x7c\x2e\xde\x57\x2c\xcc\xfb\x1c\xb7\xc3\xb8\xe2\x3e"
+ "\x78\x43\x2d\x94\x0b\xf3\x60\xe6\x2a\xbf\xe0\xf6\x0f\x58\xc7\xb6"
+ "\xd5\x78\xc2\x18\x58\x66\xae\x72\x0a\xbc\x33\x8b\xe4\x7d\x0e\x6f"
+ "\xa8\x8d\x50\x47\x31\xe0\xbd\x20\xe1\x15\xef\xdb\x89\xbc\x7e\xce"
+ "\x17\x0d\x87\x61\x70\xde\x99\x61\xb2\x20\xff\xce\xae\xe4\x7d\x15"
+ "\xf8\xed\xc5\xaf\x15\x65\x3b\x85\x3b\xfd\xb0\xc0\x7c\x2f\x8a\xf7"
+ "\x9b\x45\xca\x7e\x6b\x10\x3c\x2c\x71\x19\xa6\x7e\xa2\x64\x3f\xc6"
+ "\x99\xb2\x41\x77\x68\xef\xfe\x71\xb2\xbd\x1b\xf7\x7f\x27\x28\xfb"
+ "\xb1\xff\xdb\xaa\x1f\xfb\xef\xe2\xf4\x76\xe8\x3a\xb8\xcf\x69\x57"
+ "\xef\x7e\x84\x72\x73\x64\xb9\xe2\xfd\x39\xc2\xbc\xdf\x1e\x04\x7f"
+ "\x01\xaf\x2e\xc6\x23\xf0\xea\x62\x5c\x02\x7e\x8e\xd7\xb1\x89\x44"
+ "\xf2\x7e\x7b\x57\xf2\x7e\x07\xca\x6f\xec\x92\x3a\xc8\xfe\x8a\xa0"
+ "\x82\xfd\x06\xe0\xcc\x05\xdd\x26\x01\x46\x05\x60\xed\xec\x72\xdb"
+ "\x68\xe6\x2a\x11\x9c\x19\x5a\x17\xca\x5d\x45\x49\xa3\xc8\x85\xf6"
+ "\x1e\x04\x8e\x16\xa0\x9f\x75\xb8\x66\xe3\x3d\x0d\x42\x5d\x87\x00"
+ "\xb7\x82\xeb\x43\x3d\x3b\x01\xf3\x1d\xc0\x5a\xc0\x6d\xfa\xc2\x4d"
+ "\x69\x78\xde\xfb\x85\x6a\x5f\x73\xa4\x78\x7f\x30\x62\xde\xdf\xaa"
+ "\xd3\x10\xd3\x8f\xc2\x5b\x39\xcd\x08\x88\x90\x37\xb4\x8d\x40\x63"
+ "\x69\x8d\x81\x93\xfc\x1e\xf6\xcf\x2e\x8c\x33\xd3\x54\x01\xae\x3b"
+ "\x88\xe9\xa7\x31\xff\x05\xce\x7b\x88\x69\x68\x46\x7e\x60\xdd\x68"
+ "\xca\x37\xe0\xd9\x99\x1b\x32\xd3\x13\xf9\x26\x57\xb8\x78\xff\x91"
+ "\xc6\x7c\x1e\x97\xe3\x28\xc3\xe5\xf2\xc8\x62\x80\x0d\x60\x10\x21"
+ "\x8b\xc3\x6f\xea\x6f\x77\x8a\xc6\xc0\x34\xe4\xcd\x27\xee\x0f\xd3"
+ "\x11\xe7\x9f\xde\x26\x7c\x61\xf3\x01\x07\xf7\x4d\x0c\x70\x51\x43"
+ "\xdb\x5d\xc4\x76\x58\x43\xdb\x0e\xa6\xd3\x88\x30\x1f\x98\x02\x1a"
+ "\xed\x9a\xde\xe6\xea\xf3\xc4\x45\x32\x20\x2d\xdc\x60\xdf\x85\xf7"
+ "\x75\xc8\x57\x2f\xe9\x76\xc6\xc5\x90\x25\x64\xde\xbf\x37\x54\x7c"
+ "\x20\x67\xc6\xc5\x2e\xd1\x60\x2f\xa7\xc7\xdb\x5c\xc0\xd5\x2e\x9a"
+ "\x7e\x36\x94\xd4\x98\xbf\x00\x79\x3a\x90\xbe\x43\xd2\xff\xf4\xb3"
+ "\xed\x62\xc6\x73\xe2\xfc\x8c\x8b\x7f\x15\xd3\xed\xe2\x50\xae\x83"
+ "\x06\x5c\xb3\x4e\x44\x98\x2f\xea\x5b\x76\xd1\x35\x27\x7d\xc4\x3c"
+ "\x31\x6d\x7e\x44\x4c\x3f\x7b\x5e\x3c\xf1\x1c\xe3\x66\x3c\x35\xd8"
+ "\xc1\x3f\x8e\x72\xc6\x77\x73\x83\xbd\x06\xf5\x67\x03\xae\x53\x78"
+ "\x1d\xdb\x90\xd7\x63\x79\xfc\x6c\x1a\xd5\xb7\x94\x53\x28\x79\xff"
+ "\xde\x70\xc9\xfe\x23\x91\xe4\xfd\xad\x91\x92\xfd\x41\x91\x7c\x60"
+ "\x4a\xa8\xe4\x40\x4e\x38\xf9\x00\x68\xe0\xc0\x11\x8c\x53\x32\x8f"
+ "\x79\xa7\x9b\x6c\x78\xfe\xd7\x4e\x1e\xff\xe2\x03\xcd\xe8\x6b\x10"
+ "\x3a\xaf\x50\xb4\x7f\xa0\x99\xd7\x16\x50\x36\xd8\x95\x7c\x00\x3a"
+ "\x19\xae\x92\xf6\x6a\xcc\x4c\x97\xc8\x67\x14\x1b\x6b\xfa\xc1\xee"
+ "\x49\xea\x4a\xae\xb1\xe2\x97\x81\xdf\x38\xa4\x15\x03\xfe\xb5\x92"
+ "\xa6\x8a\x6b\x8a\xc5\xf7\xcb\xa0\x43\x5f\x04\x9c\x9a\x9d\x33\xc3"
+ "\xf7\x08\xe0\x10\x7c\x52\x53\x1c\x29\xa9\xa9\x00\xac\x23\x41\x49"
+ "\xfb\x35\xff\xc6\xb0\xbb\xd6\x64\xf0\x9a\x83\x09\xef\x9b\xc5\xc6"
+ "\x83\x0f\x04\x99\x56\xcd\x07\xa7\x44\xcc\x07\x77\x8a\xe2\x83\x39"
+ "\x3f\x78\x41\xf8\xc3\xc5\x07\x1d\x91\xe2\x83\xf6\x50\x5f\xe8\xe6"
+ "\x8e\x1a\x62\xf9\x14\xfa\xbd\x00\x0e\x3e\x02\x3e\x76\xc8\xf1\xf7"
+ "\x3a\xc0\x03\xab\x86\xba\x1a\xda\x40\x0b\xf9\xbf\x92\xb2\xa9\x31"
+ "\x70\x5c\xe2\x54\x24\x1f\x9c\xc2\x34\xc5\xe3\xfb\x44\x3e\xb9\x44"
+ "\xc9\xc1\x9c\x48\xc9\x41\x7b\xb8\x04\x70\x93\x51\x4f\xca\xa1\x33"
+ "\x41\xc9\xaf\x87\x40\xaf\x35\x28\xf3\x11\x29\x1a\x3f\xd4\xda\x9b"
+ "\x8c\x64\x59\xc5\xf2\x69\x66\x28\xc8\x34\xf3\x37\x96\x6b\x4a\x4e"
+ "\x51\xae\x2e\xa7\x58\x46\xb1\xbd\xc3\x72\x2a\xa2\xc9\xa9\x88\x26"
+ "\xa7\xe4\xb3\x19\xb2\xa6\x78\x9f\x83\xe5\xd1\x4c\x87\x92\x33\x33"
+ "\xc3\x99\x02\xb4\x91\x0a\x18\x0e\x35\x16\xc8\xb3\x71\xdf\x0b\x32"
+ "\xbf\xc4\xd3\xbe\x9d\x11\xc8\x1b\xfc\xf6\x46\x94\xbc\x09\x6a\xf2"
+ "\xc6\xa8\xcb\x9b\x30\xe6\x35\xf0\x54\x24\x91\xbc\x89\x68\xf2\x26"
+ "\x2c\x94\xbc\x89\x68\xf2\x86\xd3\xc3\x9a\xbc\x09\x27\x90\x37\xe0"
+ "\x67\xee\x6f\x92\x26\x67\x5c\x2c\x67\xb8\xbf\xa0\x35\x7b\x44\xc9"
+ "\x99\x62\xd8\x3a\x46\x96\x33\x61\x94\x89\xe8\x72\xa6\x43\x96\xdf"
+ "\xc9\xb2\xa6\xeb\x45\x82\xfc\xb4\x11\xcb\x18\x29\x4f\x42\xc3\x43"
+ "\x2c\x4f\x80\xbf\x7b\xe2\xe5\x09\xe0\xed\xc5\x7d\x9a\x26\xa7\x5a"
+ "\x61\xe9\x86\x20\x4f\x8e\xcc\x74\x04\x30\xd6\x9f\xc2\xf6\x87\xdc"
+ "\x76\x14\xb8\xbc\x8e\x10\x41\x0e\x04\x45\xa3\x8b\xd0\x46\xd0\x6f"
+ "\x18\xb2\x82\x08\x7c\x39\x25\x04\x1e\x07\x8d\xe7\x34\xe6\x9f\xa0"
+ "\x30\x78\x75\x7a\x5b\xbb\xf7\x89\x40\x46\xda\xf4\xb3\xc2\x0f\xfc"
+ "\xf8\x9e\xc8\x77\x41\xbe\x64\xf8\x1b\xda\x0e\xd2\xb4\x16\x11\x99"
+ "\x36\xcf\x67\x03\x0f\xe4\x4c\x5f\xec\xb1\x3c\xf1\x5c\x1a\xf8\x4c"
+ "\x78\x20\x17\x3f\x9e\x7e\x36\xcd\x32\xb7\x85\x6e\x9c\x36\x5f\x44"
+ "\xc2\xe0\x33\xf4\xf7\x08\xfa\xdd\x8c\xb6\xb7\x82\xe7\x82\xe0\xb3"
+ "\x29\xa1\x38\x3e\x13\x29\x07\xfe\x15\xf7\x36\x85\xbf\x03\x41\xf0"
+ "\x59\x73\x44\xce\x67\x2d\xd2\xc6\x44\x3d\x72\x2d\x0e\xbc\xd6\x1c"
+ "\x29\x51\xbc\x16\x11\x8a\xd7\x22\x8c\x3f\xa3\xc6\x6b\x18\x0b\xf0"
+ "\x8d\x15\xbf\x0c\xfc\x12\xf3\x5a\x7e\x14\xaf\x3d\xa7\xf1\x5a\xb2"
+ "\xe2\x35\x8c\x69\x52\x78\x8d\xe2\x37\x86\xcf\x76\x68\x37\xbf\xa5"
+ "\x1c\x9c\x82\x7b\x83\xa2\x1d\xc9\x73\x98\x57\x0e\x3a\xc0\x6f\x76"
+ "\xf0\x1b\xe0\x09\x3f\xcb\x4d\xd0\xe6\x7f\xf2\x5c\x37\x23\x5f\xfc"
+ "\x67\x6e\x78\xa8\x0b\xfc\xe4\x80\x2c\xfb\x2b\xe4\xe8\x7f\x3e\x11"
+ "\xa0\xed\xe0\xa7\x29\xe0\xa3\x1c\xf0\x93\x1d\x7c\xc5\xfc\xd4\x1a"
+ "\x5e\xc3\x30\x0f\xb5\x76\xc3\x90\x73\x65\x2c\x3f\xf5\xb6\x0e\xda"
+ "\xe1\xb6\x15\xfa\xe8\x40\x3e\xeb\x2b\xb8\x2f\xf6\x51\x4d\xb6\x76"
+ "\x0f\xfd\x67\xbb\x55\xea\x31\xe0\xc1\xfc\x22\xba\xee\x0c\x0d\x9f"
+ "\x02\x7a\x27\xdc\xa7\xe2\x7e\xda\xcc\x5b\x0f\x89\xc8\x26\x83\x15"
+ "\xf5\x76\x30\x1f\x0a\xf7\x58\xd6\xcf\xb2\x40\x87\x66\xd1\x91\x91"
+ "\x2a\x52\x8e\xdd\x28\xba\xac\xbc\xd6\x66\xc1\xf3\x00\xf4\x7f\x04"
+ "\xae\x03\xb7\x5d\xa2\x74\xfc\xac\xdb\xdc\x11\x17\xeb\x4e\xb8\xcf"
+ "\x14\x2b\xad\x29\x5b\x56\xd0\x28\x4b\x80\xcc\xd5\xee\x48\x8e\x65"
+ "\x5d\x1a\xaf\x39\xa5\xf3\xbd\x70\xef\x18\x5f\x7d\x89\x4c\xbc\x2e"
+ "\x10\xe9\x8f\xfa\x1c\x16\x21\x96\x67\x50\xf5\x32\xc8\x07\x37\x59"
+ "\xab\xdd\x62\x77\xb8\x83\x71\xb0\x2f\x47\x6f\x0b\xb7\x0d\xed\xbc"
+ "\x01\xed\x9c\xfb\xf0\xaa\x2c\xfa\xc8\x41\x09\xd7\x6a\x3b\xdc\xc3"
+ "\xbb\xfb\xdf\xcb\xfb\x4a\x1d\x27\xbd\xbc\xaf\xd1\xf1\xd4\xcb\xba"
+ "\x9e\x89\xe7\xe8\xf0\x0a\xe1\x2f\x7d\x9a\x18\x17\x56\x67\x48\xfc"
+ "\x17\xf0\xe8\x2a\x0a\xd3\x0d\x33\x57\x7d\x5d\x78\xdb\x84\xc7\xeb"
+ "\x38\x4b\xd5\x78\x5f\x54\x28\x22\x91\xe4\x63\xa0\xd9\xa3\xa1\xf6"
+ "\x15\x22\xc4\x6b\x39\x1d\xee\x9b\x6c\x3e\xfa\x9e\x47\x8d\xc5\xfe"
+ "\x66\x69\x43\x9a\x8f\x86\x00\xeb\x5a\x86\xd5\x80\xf2\xe1\x92\x63"
+ "\xd0\x3d\x6f\x9a\xe2\xa3\xa3\x39\x32\x9f\x79\x7f\x73\xfe\x6a\xfa"
+ "\xda\x19\xba\x49\xe2\x58\x14\x1f\x4b\x67\x79\x80\xb4\x34\xa4\x6d"
+ "\x12\x25\xc7\xac\xc8\xef\xf0\xd1\x07\xe5\x4a\x8f\xbd\x69\x93\x9e"
+ "\x0f\xf7\xf3\xf8\x3e\x86\x7e\x0c\x72\x31\x1d\xb0\x6c\x3d\x9b\x55"
+ "\x06\x6d\x79\x5d\xff\x4b\xc3\x2f\x2b\xf1\xeb\x1e\x79\x7e\x20\x07"
+ "\xba\x16\x39\xd7\xd2\x30\x8c\x0f\xda\xf7\x0d\x03\xec\x88\xd3\xc2"
+ "\x7d\x53\xc5\xdb\xab\x83\xb0\x13\xbe\x91\xea\xa3\x97\xea\x7a\xc3"
+ "\xa7\x60\x5d\xe7\x92\x68\x2d\x5d\xd1\x8d\xcb\xcf\x66\xae\x8a\x08"
+ "\xbe\x67\x79\x54\x8d\x74\xc6\x1b\xe0\xcc\xd1\x71\xd6\xfb\xb8\x1c"
+ "\x4b\x53\x36\xe7\x37\xf6\x08\xb7\x20\xcf\x8d\xbc\xc7\xf4\x8d\x0f"
+ "\x14\x1e\x0e\xb4\xb6\x43\x8e\xf0\x3a\x31\x6c\xb3\xc0\x72\xab\x08"
+ "\x02\xe6\x4e\x1f\x8d\xca\xd4\xd6\xa1\x02\xde\xd0\x64\x96\x2d\x09"
+ "\xe7\x2d\xde\x13\xeb\x81\x3f\xe2\x78\xe3\x30\xc8\x21\x29\x9b\x4e"
+ "\x6c\x28\x52\xed\x0e\x32\x5c\x4f\xd1\x05\x6a\xc1\xfb\xe5\x01\xd1"
+ "\x2a\x8a\x4f\x38\xd8\x8e\xf0\xac\xe8\xe4\xb4\x13\xa0\x6d\xe1\x59"
+ "\xc6\x6d\x1a\x71\xc2\x73\x63\x27\x9d\x76\x50\x52\x75\xf7\xfa\xcf"
+ "\x08\x0f\xaf\xf7\xa8\x75\xae\x11\x59\x3e\x1a\x1d\xd4\xdb\xc5\x3a"
+ "\x06\xf0\xcb\xb8\x6e\x66\x5d\x83\xf7\x1e\x96\x17\x8a\x20\xeb\x1c"
+ "\xc8\x9b\xa7\xf7\x81\xfb\xa7\xfa\x35\xc2\x15\xdd\x2f\xde\xa3\xb2"
+ "\x14\x2a\x1c\x2c\x5f\x45\x66\x9b\xc2\xb5\x99\xfb\xcb\x7d\xe1\x3e"
+ "\xcb\xbe\x48\x19\x8b\x39\x22\x74\x17\xec\x31\x99\xce\xb0\x60\xff"
+ "\x8c\xd2\x68\x6a\x44\x56\x3c\x1d\x75\x8f\xa3\x79\xff\x4e\xd8\xa0"
+ "\x37\x3a\x23\xe2\xd4\x69\x1a\xf9\x88\x5a\x3b\x1b\xf9\x48\x84\xf5"
+ "\xec\x20\xd3\xaf\x57\xee\xbd\x78\x0b\x59\xde\xca\xbc\x83\x90\xb7"
+ "\x05\x79\xa6\x6a\x79\xa7\xaa\x3d\x3b\x79\xed\xc7\x57\xcc\x63\xef"
+ "\xf8\x68\xe4\x3c\xbf\x9c\xef\x4f\x64\xe9\xcf\xb0\xdd\x61\xff\x8d"
+ "\xb4\x8a\x12\x6f\x30\x71\x5b\x0e\xee\xe4\xf9\x2c\x7c\x49\xb4\xa1"
+ "\x9e\x21\x4c\x53\xce\x55\x74\x3d\xe8\xf2\xb3\xa2\xb5\x34\x88\xe9"
+ "\x49\x24\x1f\x1b\xa6\xf0\x3e\x72\x97\x70\x43\xf7\x84\x44\xcd\x5f"
+ "\x41\x5f\x03\x1f\xa5\x9f\xa1\x91\x87\x73\x0b\x6d\x68\x2b\x51\xe9"
+ "\x39\x22\x29\x83\x92\x8f\x59\xbd\xa1\xcf\xa9\xfa\x1c\xaf\xed\x8c"
+ "\xf4\xe9\xb4\x88\xfb\xb6\x2b\xc9\x0b\xcc\x33\x19\x6a\xed\xe1\xe6"
+ "\x47\x78\x9f\xe1\x14\xdd\x9c\xcd\xfd\x55\x7b\x9c\x37\xdf\x25\x2e"
+ "\x89\xb9\x42\xce\x69\x35\x56\x1f\xdd\x9c\x8f\x6b\x86\xfc\xb9\x69"
+ "\x9e\xf6\x6c\x45\xbe\x11\xe2\x52\x84\xf3\x64\x20\x6d\xbc\x70\x1b"
+ "\x98\x27\x6a\x3a\xdc\x37\xc3\x1e\xfd\x7e\xb3\x1a\x9b\x9b\xc7\x32"
+ "\xac\x5e\xda\x60\xc5\xd8\x12\xd3\x26\x60\xfd\xc9\x56\xc4\x6b\x97"
+ "\x37\xbf\x23\xf9\x02\xb0\xaa\x8d\x4a\x6e\x47\xd0\xd6\x2a\x77\xc4"
+ "\x0e\x19\x6d\x8f\x6c\xfc\xb3\x5d\xde\x6b\xef\x84\x36\x8f\x26\x86"
+ "\x7f\x62\x83\x67\x28\xd3\xf8\x2d\xa3\x14\x9c\x13\x0e\xcf\xd0\x33"
+ "\xfc\x3c\x9a\x9f\x03\xe6\x8f\xed\xde\x8a\x2c\xd4\x7f\x06\xf5\xde"
+ "\x32\x4a\xd9\xf3\xb7\x8c\x6e\x47\x1d\x1d\xee\x5b\x46\xf9\x68\x8c"
+ "\x49\xed\xb9\x7c\x6c\xef\x6d\x2f\x99\x79\x87\x79\x4e\xf1\x74\xc6"
+ "\xd9\x86\xed\xcc\x7f\x35\xe6\x76\x73\x4d\x86\x26\x37\x78\x9d\x26"
+ "\xf5\x14\x65\xb4\x35\x58\x25\x7d\x1b\x85\xf1\x96\x4d\xbf\x8e\xf8"
+ "\x8d\xbc\x2f\xa6\xc4\x57\x46\xdb\xe5\xbf\x5b\x3c\xf8\x35\xe1\x77"
+ "\x52\x7b\x6e\xc5\x2f\x84\xfb\x69\xf8\x9d\x94\xb8\xdb\xba\xc0\xe0"
+ "\xc3\xbb\x76\xe8\xec\xfc\xec\xa3\x5b\x8e\x88\xad\x23\x8c\xc2\xac"
+ "\xee\xab\xaf\xe7\x75\x82\x5b\x02\x18\x83\x42\x35\x16\x19\x72\x4d"
+ "\x05\x6d\x63\xbc\x0b\x67\x85\x08\xd6\x15\x05\xb8\xdd\x23\xea\x2a"
+ "\x02\x64\xbb\x99\xfb\x9f\xc1\x63\x2c\x02\xc0\x3f\x5f\x97\x57\x08"
+ "\x7f\x6d\x65\x88\x78\x7f\xae\xc3\x9d\x01\xfe\x5f\x3c\x4d\xad\x39"
+ "\x9c\xd8\xce\xf0\x34\x9a\x10\x7a\xff\x95\x4c\xfb\xd8\xce\x63\x89"
+ "\xe7\xe7\xd1\x77\xcb\x39\xca\xf8\x40\xa4\xfc\xd9\x5e\x6b\x27\xda"
+ "\x06\x39\x82\xb9\x46\xee\x15\x54\x4b\xff\x80\x0c\xcc\xff\x37\x9f"
+ "\xd4\xf7\x93\x36\xe3\xfd\x16\xbc\xc3\xdc\xe3\x6f\xb0\x07\x89\x61"
+ "\x85\xb9\x7f\x28\x7f\x30\xe2\x37\x61\xae\xc6\x98\x7f\x6c\x2f\xca"
+ "\x87\x9c\xe9\x96\x5b\x19\x73\xd7\x9e\x15\x41\xbd\x7f\xb5\xdb\x99"
+ "\x17\x32\x40\xff\xcf\xd8\x7b\xa5\xff\xee\x36\xdf\x96\x5c\x3b\x42"
+ "\x8d\x59\x04\x78\x89\x1d\xb3\xdb\xcc\x6a\xbc\x6e\x1d\x1f\x3b\x5e"
+ "\xb7\x41\xb7\xb9\x75\x03\x7e\x95\xf8\xed\x52\xcf\xd1\xbf\x5b\xf3"
+ "\xa3\xee\x6b\xf0\x83\xec\xbc\x15\xf3\xff\xc8\xa0\x1a\x07\x4e\x47"
+ "\x3f\x98\x46\xfe\x41\xd0\x0d\x73\x88\xf7\x6b\x39\x9d\xe9\x99\xd3"
+ "\x23\xd0\x67\x7c\x74\x6b\x19\xde\xa7\x31\xaf\x96\x46\x28\xe6\xbd"
+ "\x17\xb5\x7b\x56\x43\x56\xd3\xad\x9f\x31\x2c\xcb\xba\xe2\x62\xa6"
+ "\x53\x94\x29\xb7\x84\x8a\xa1\x4f\xde\xda\xa6\xe3\x15\x69\xc7\xf9"
+ "\x3d\xd3\x64\x87\xfb\x36\x13\xf0\xb2\x53\xee\xc7\xc2\xde\x4b\xac"
+ "\x6b\xdc\x96\xd1\xad\x93\x99\x6b\x8a\x59\x1e\xb5\xd1\x37\xc7\x42"
+ "\x66\x61\x6c\xff\x3c\x4f\xcd\x35\xdf\xbc\x8b\x9f\x21\x2b\x3f\xc3"
+ "\x7d\x66\x03\x64\x52\xe7\xc6\xa3\xae\x2e\x23\xf5\xeb\x34\x52\x56"
+ "\x68\x8b\x61\x7c\x28\xe5\xf0\x26\x6f\xeb\x1e\x6a\x0c\xfd\x86\x6c"
+ "\x4f\x4b\x18\xb7\x7a\x41\x03\xce\x55\x22\xfc\x5e\xe7\x4e\x93\x37"
+ "\x74\xde\x83\xb9\xf9\xeb\x67\xe8\x9b\x12\x1f\x2f\x9d\xc2\xac\xff"
+ "\x84\x84\xad\xf0\x93\x6a\xb0\x6e\x59\x24\x42\x5b\x4e\x8b\x00\xf4"
+ "\xbb\x94\xcd\x9d\x34\xea\xad\xd5\x94\x59\xd9\x49\x23\xaa\x3a\x29"
+ "\x43\xfc\x2d\xc3\x58\x09\xbd\xed\x89\x8b\x69\x04\x99\x90\x33\x20"
+ "\x9f\xcc\x55\xab\x49\xd2\x48\x78\x33\xf4\xb7\x10\xf4\xb7\xf3\x19"
+ "\x2c\x1b\xbb\xf5\xb7\x2e\xa9\x17\x1f\xdb\xa0\xe8\xe8\xd8\x86\xfe"
+ "\x76\x32\xa4\xce\xa3\x34\xb4\xcf\x79\x8e\x6e\x5b\x9c\x8a\x09\x91"
+ "\xfb\xec\xd3\xfa\x0b\x9c\x17\x5a\xec\xd4\x4f\xf6\x15\xf2\x5a\x94"
+ "\xfc\x79\x5e\xaf\xf3\xb0\x91\x69\x2a\xc0\x7c\xc3\x7d\x58\xc7\x7b"
+ "\xc6\x7b\x86\x06\x4d\xcb\x2b\x45\x90\xd3\x0b\x86\x8b\x20\xd2\xed"
+ "\x5c\xf7\x6e\xa4\x77\xb8\xbf\x59\xe6\x33\x7e\x30\xad\x37\x1a\x85"
+ "\x7d\xa4\xc9\x95\x51\xd7\x0a\xa3\x8b\x69\xf4\xc8\xda\x10\x74\xef"
+ "\x73\xcc\xb3\xa3\xd2\x66\xe6\x89\x90\x6d\x09\xef\xdf\x8f\x22\xf6"
+ "\x2d\xe0\x3d\xc5\x5f\x43\xb7\xf9\x32\x7f\x02\x9e\x2f\xd8\x56\xb0"
+ "\xe4\x01\xe6\xc6\x9a\x23\x02\xf6\xf9\x57\xf5\x67\x40\x3f\x53\x5f"
+ "\x1d\xcc\x7e\x36\xa3\xa6\xf9\x68\xda\x0e\x6e\xbb\xf4\xa5\x81\xec"
+ "\x84\xbe\x35\x08\xed\x2a\x0e\x00\x0f\x78\x8f\xf9\x7f\xaa\xbe\xff"
+ "\xeb\xe7\xbd\x57\xa4\x61\xfe\x7f\xa0\x86\xd3\x0a\x86\x93\xb5\xc0"
+ "\x26\x7a\xd3\x69\x4c\xbc\x27\x0d\x78\x43\x50\x66\x8f\x0e\x07\xf3"
+ "\xd4\x2f\xda\x8d\x0f\x3f\x8c\xb4\x23\x3a\x1c\xe4\xb9\x0e\xcf\xcd"
+ "\xdd\x79\x54\x99\xd6\xa8\x32\x0f\xb7\x1b\x6f\xfb\x05\xd2\x42\xb1"
+ "\x65\x46\xa7\xc6\x96\x19\x3d\x2c\xaa\x8c\x4b\xd5\x33\x3a\x33\xae"
+ "\x4c\x56\x5c\x99\x59\x97\xb7\x6d\xf4\x82\xb8\x32\x05\x71\x65\x36"
+ "\x5c\xde\xb6\xd1\x15\x71\x65\x76\xc6\x95\xd9\x1b\x85\x4b\xf6\xab"
+ "\xc9\x44\x5a\x7d\x5c\x99\x93\x71\x65\xda\xf4\xe7\x5e\x70\x9c\xba"
+ "\x7c\x1b\x59\x41\x9b\xec\xbb\xe5\x7f\x15\xe3\xd3\xfe\xc6\x33\x1d"
+ "\xaa\xec\xed\x19\x97\xf7\xeb\xf6\xf1\xb1\xf5\xdd\x3e\x2d\xb6\xbe"
+ "\xdb\xe7\x5e\xde\xaf\xdb\xf3\xe3\xca\xb8\xe2\xca\x94\x45\x95\xd9"
+ "\xae\xd5\xb3\x23\xae\xcc\x9e\xb8\x32\x75\x97\xd3\xd5\xed\xcd\x71"
+ "\x65\x5a\xe3\xca\x04\xbf\x04\x17\x3c\x8f\x2b\xbf\xb6\xc1\xac\x2b"
+ "\xdf\x0b\x1d\x61\xcc\x7c\xf6\x8d\xe0\x7d\xd0\xb7\x3b\x83\x7d\x78"
+ "\x7f\x8e\xe7\xab\x5a\x47\x10\x73\xcb\x18\xd8\x3f\x63\x3d\xfa\x9c"
+ "\xc5\x7e\x23\xcc\xd3\x4a\xc7\x1e\x93\xd1\x9b\x2e\x2a\x7d\xcf\x34"
+ "\xff\x35\xae\xab\x76\x18\xcf\x53\x63\xca\xbb\x75\x62\xe5\x83\x46"
+ "\x1a\x9c\xbf\xeb\xfb\xb0\xd5\xca\x1f\xc5\xc0\x3a\x79\xad\x43\x96"
+ "\x39\x12\xa5\x47\x73\xfd\x81\x3d\xab\x83\xa6\xb8\x76\xec\xbc\x42"
+ "\x3b\x52\xa1\x1b\xd9\x1b\x31\x7b\xf1\xfe\x7a\x43\x25\x74\x20\xe8"
+ "\xfd\xdc\xb6\x53\x94\x99\x29\x75\xb2\x25\x9d\xc4\xf7\xde\xc2\xbb"
+ "\xe5\xfe\xbb\xd2\x49\x33\xed\x75\xa8\x9f\x75\xf7\xba\xfc\x0b\xec"
+ "\x23\x85\xf9\x97\x75\xb7\xcc\xd7\x6a\x0b\xfd\x68\x57\xe6\x3c\xdd"
+ "\x4f\xc5\x47\x99\xe5\x52\xd7\x28\x3e\x31\x8f\x7d\x03\xd8\x87\xa6"
+ "\x36\x30\x8e\xf3\x80\xfe\xc7\xe4\xe9\xfd\xc5\x5c\xef\x47\xde\xf1"
+ "\x57\xc2\x99\x1a\xc3\xcc\x9a\x58\x9a\xec\x03\x5a\xc9\x6c\x8a\x1d"
+ "\xf7\x4c\x5f\xec\xb8\x67\xfa\x63\x69\xd2\x08\x9a\xbc\xc3\x14\x5b"
+ "\xe6\x8e\xf4\xd8\x32\x77\x8c\x88\x2a\x53\xa6\xea\xb9\x63\x5c\x5c"
+ "\x99\x29\x71\x65\x72\xa2\x9e\xd1\xc7\x3b\xec\xdd\xb6\x8f\xf4\x81"
+ "\xba\xc3\x11\xf5\x6c\x2c\x97\xf2\xf3\x8e\x4d\x7a\x1a\xaf\x1d\x55"
+ "\xbd\xae\x7c\x70\x34\x78\x3b\xe3\xf8\x9d\xf3\xd7\xc4\xb5\xa1\x3e"
+ "\xae\x0d\xdd\xfc\xaf\xed\xdd\xff\xe1\x34\xdd\xb9\x47\xdb\xbb\x6f"
+ "\xc3\x9c\x3d\x93\x9f\x01\xab\x02\xf9\x81\x87\x3b\x53\x63\xe1\xdd"
+ "\x39\x2c\x16\xde\x9d\xa3\xa2\x9e\xd3\xf0\x3c\x3e\xaa\x0f\x69\x49"
+ "\x56\x32\x80\x5e\xa0\xbf\xdd\x39\x47\x4f\x67\x9b\x12\xed\x6d\x75"
+ "\xca\xb9\x26\x8b\x7d\xcb\x06\x9e\xa2\x3b\x27\xb2\xfd\xa9\xc1\x8c"
+ "\xe6\x7f\x52\xfd\xba\xb3\x3c\xae\x1d\x3b\xe2\xda\xb1\x27\xaa\x5f"
+ "\x01\xcb\x3a\x7a\xd0\x12\x7a\xe8\x11\xd6\x7d\xd8\x9f\x52\xfa\x78"
+ "\xad\x85\xce\x76\x91\xd2\xd8\xb7\xee\x74\x01\x25\x79\x1d\xad\xb0"
+ "\xe5\x8e\xb9\x7a\xa5\xa7\x94\x13\xf9\xca\xb7\x8a\x6c\x1d\xee\x6f"
+ "\xa5\xeb\xf4\x18\xd9\x78\x22\x3f\x52\xf2\xa7\x6c\xa4\x41\xfe\x65"
+ "\x6e\x57\x7a\x6e\x53\x99\x70\xe6\x54\x00\x9f\xb0\x8b\xc6\x5e\xa7"
+ "\xd9\x11\x1b\xd8\x47\x8c\xfd\x58\x31\xc7\xa7\xaa\x7d\xf8\x6f\xcd"
+ "\x8d\xa2\xeb\x80\x6d\xf5\x3d\xe2\x14\x8d\x1d\xce\x3a\x00\xf3\x28"
+ "\xfb\x9a\xd5\x86\xfc\xc4\xb6\xb7\x37\x74\x46\xea\x6e\x78\x6f\xd3"
+ "\xca\x56\x44\x95\xf5\x6b\xb6\x71\x2b\xbf\x1b\x13\x22\x53\x6d\xc0"
+ "\x4f\x80\x93\xae\xf4\xbd\xb1\xc3\x6b\xc1\xaf\x28\x53\xaf\x97\x61"
+ "\x3b\x5a\xee\xf1\x16\x90\xe9\xf6\x42\x32\x79\x56\x9f\x92\xb0\x75"
+ "\xbf\x0d\xe8\xd2\x6d\xde\xc2\x56\xf2\x06\x9a\x79\xad\xcb\xa4\x7c"
+ "\x74\xc6\xda\x92\x82\x64\x6e\x2f\x39\x01\x7b\x6e\xac\x2d\x5c\x72"
+ "\xc2\x8e\xb6\x61\x7c\xbe\x95\xcd\xf2\x26\x1a\x77\x93\x27\xcf\x7a"
+ "\x68\xe6\xf4\xd1\x3f\x7a\x68\xea\x9c\xc9\x77\xdb\xe6\x2c\x7e\x76"
+ "\xe1\x82\xd1\x4b\x9f\x2f\xb0\xad\x5c\xb6\xb8\x60\xf1\x92\x1f\xdb"
+ "\x32\x1d\x23\x1d\xb6\xf9\x05\xea\x9a\x91\x37\x7f\x79\xc1\x04\xbe"
+ "\x1d\x65\xcb\x5f\xb6\x70\x85\xbc\xbd\x35\x85\x62\x81\x2c\x2e\x58"
+ "\xb8\xcc\x36\x72\xc1\x28\xdb\x7d\xf3\x17\xe7\x3d\xbf\x6c\x61\x42"
+ "\x58\x77\xdb\x96\x2d\x5c\xb6\x70\xfe\x02\xdb\x04\x5b\x26\x43\x8e"
+ "\x06\x17\x35\x9e\x99\xfa\x3c\xc6\xf3\x57\xa9\x5b\x34\x69\xf3\x99"
+ "\x4f\xd1\xcf\xd8\xc0\xe5\x73\xd9\x5d\xe6\x58\x9a\xbb\xcb\x1a\x4b"
+ "\x73\x77\x65\x5c\x3e\x97\xdd\x15\x37\xff\xdd\x15\x37\xff\xdd\x35"
+ "\xf7\xf2\xb9\xec\xae\xb8\xf9\xef\xae\xb8\xf9\xef\xae\xee\xf9\x0f"
+ "\xb4\xe4\x5b\x2f\xe5\xc2\x5d\x71\xf3\xdf\x5d\x71\xf3\xdf\x5d\x75"
+ "\x71\xcf\xc7\xa3\x9e\x07\xe1\xb9\x25\x7a\x7e\xc4\x73\x40\xe7\xcf"
+ "\x1e\xf9\xf2\x6d\xb3\x9e\x87\x65\x3d\x64\x73\x8b\xca\xfb\x6d\x5b"
+ "\x54\xde\x56\x2d\xef\xd8\x6e\xfe\xe3\x7d\x6d\xa4\x2b\x7b\xfd\xdb"
+ "\x6f\xb2\x4c\x67\x7f\x3c\x9e\x9b\xc0\x1f\x5f\x3f\x47\xdf\xbe\x96"
+ "\x61\x31\x0d\xb3\x7f\xa6\x78\xe3\xb1\x8e\xea\x81\x64\xe6\x32\xd5"
+ "\xaf\xb0\x5f\xef\xd8\x51\xec\xab\x8b\x34\xf6\x5d\x86\x4c\xf9\x36"
+ "\xf4\xdf\xdf\x69\x7b\xdf\xdf\xf6\x49\x9d\x1f\x65\x34\xf8\xd2\xae"
+ "\x01\x1c\xf6\x05\x36\x97\xaa\xb9\xb8\x05\xf7\xa9\x4c\xd3\x28\x6f"
+ "\x12\xc6\xb1\xcf\xb1\x0f\x34\xd2\xd2\xf0\x4b\x07\x3c\x9f\x0e\x6f"
+ "\xc3\xe0\xc4\xba\x65\xbc\x9e\xdb\x6d\x0f\x1a\xc9\x52\xea\x8e\x34"
+ "\x7b\x23\xac\x5b\x7f\x27\x5d\xad\x2d\x1c\xdd\x2e\xdc\x87\x72\xaa"
+ "\x91\x9e\xd8\x4e\xfa\x0e\xf4\xbf\xef\x98\xd5\x7a\xcb\x77\x30\xfe"
+ "\xd3\xc7\xaa\xb5\xd3\xa3\xdb\x21\x6f\x3b\x01\xe7\x22\xae\x5d\xb8"
+ "\xfe\xbb\x0e\xdf\x23\xed\xed\xef\x14\x08\xb7\x61\x36\xc3\x8d\x4b"
+ "\xdf\x04\xf9\xd6\x69\x09\xb9\x72\x12\xbc\xdb\x29\xdc\x49\x0f\x25"
+ "\x48\xf7\x40\x67\xe8\x44\x3b\x02\xdc\xde\xa8\xf4\x66\xe1\x1e\x30"
+ "\x87\xf3\xfb\xb8\x3e\x94\xe9\x4d\xd7\xd6\xfd\x6f\x95\x0f\xff\xb8"
+ "\x11\x71\xfd\xf8\xe2\x34\x8d\xfb\xa9\xea\xc7\xb8\x70\x6c\xdd\xe3"
+ "\xc6\x27\xee\xc7\xb8\x39\xe8\xc7\x17\x89\xfb\x31\x2e\x5f\xe2\xd6"
+ "\x88\xbe\x18\x2f\x7b\xc7\xbe\xac\x5f\x48\xbc\xc7\xa6\xef\xd0\x74"
+ "\xa1\x00\xec\xb0\x34\xbc\x93\x65\x67\x17\xf6\x8c\x9b\x96\xaf\xde"
+ "\x52\x41\xb3\x12\xd4\xd9\x22\xdc\xfd\x66\xfb\xe8\xbb\xf2\x5c\x43"
+ "\x54\x7a\x48\xb5\x05\x78\x32\x32\x9e\xd0\x1f\x94\xeb\x6d\xbc\x75"
+ "\xbb\x44\xad\x85\x7c\x17\xfc\x3f\x8e\xf4\xb5\xcc\xe5\x85\xc2\xaf"
+ "\xe3\x11\xef\xec\x71\xef\x82\x51\xef\x36\xc4\xbc\x5b\xdb\x9d\x5e"
+ "\xa9\xa7\x7f\xb5\x71\xfa\x6e\x7d\xdc\x38\x61\x7c\xee\x7e\x3c\xb6"
+ "\xdf\xdf\x3d\xa9\xfa\x87\x31\xba\x0c\xd7\xdf\x0d\x62\x8c\xba\x12"
+ "\x8f\xd1\xdd\xe9\x89\x69\xed\x6e\xb9\x8e\x26\x06\x52\x02\x78\x77"
+ "\xf3\xbe\x53\x97\xa4\x41\x6d\x9c\x2e\x1f\x9f\xbb\xf3\xf4\xf1\xf9"
+ "\x6a\x7d\xbc\x7b\x77\x5c\x1f\xc3\xa7\xe9\x7b\xa3\x55\x5f\xbf\xb7"
+ "\x36\x0e\xf6\x91\xc4\xb4\x78\xb7\x0f\xfd\x0c\xf7\xd2\xcf\x50\xef"
+ "\xb4\xf8\x3d\x2b\xfa\x13\xbe\x9c\x16\xbf\x97\xa9\xca\x50\xa2\x32"
+ "\xd3\x84\x3b\x51\x3d\xdf\x5b\xe0\x0c\xb1\x9e\xfb\xbd\x4a\x5e\x5f"
+ "\x8a\x4a\x2f\x8c\xa5\x3f\xf4\x81\xcb\x31\xfe\x42\x4a\xce\xf2\x38"
+ "\x9c\xb6\x91\xf1\xcb\x68\xb2\xc3\xfd\xbd\x93\x71\xb8\x3a\x7f\x9a"
+ "\xc6\x3f\xde\x6e\x34\xec\x50\xf8\x9a\x30\x3c\xae\x4d\xc1\xc4\xf8"
+ "\x1a\x9f\x06\x7c\x9d\x4f\x8c\xaf\xf1\xa3\x7a\xc7\xd7\x78\x1e\xff"
+ "\xf3\x97\xe3\x6b\xfc\xbc\x68\x7c\x41\xd7\x95\xfd\xfb\x86\x15\xb4"
+ "\xd1\x95\x2b\xaa\xb9\xaf\x61\x4a\xb3\x80\x56\x54\x99\x36\x2e\x53"
+ "\x6e\x09\x2a\x3a\x81\x0e\x69\x3e\x47\xe3\x0b\x75\xfe\x1f\x50\x41"
+ "\xfd\x44\xd7\x63\xec\x47\x64\xe0\x72\x5e\xc7\x79\x8f\x37\x94\x49"
+ "\x6c\x7f\xc4\xd5\xdb\x9c\x58\x16\x8c\xf7\x03\xa7\xaf\x5c\x9e\x3e"
+ "\xc1\xac\xfc\xc8\x26\x64\xc5\xca\x88\x09\xb6\xd8\x31\xfa\x1e\xef"
+ "\x47\x58\xb4\x6d\xa7\x2f\xfd\x5d\x79\xcc\x26\x94\x5d\x3e\x66\xdf"
+ "\xbf\x43\x8d\xd7\xf7\xaf\x8d\x6b\xdf\xce\xc4\xe3\x35\xc1\xd3\xfb"
+ "\x78\x4d\x38\xd9\xfb\x78\x4d\xe0\xf5\xd3\xf3\x3e\xfa\x7e\x66\xec"
+ "\xbc\xf1\xfd\xb4\xd8\xfe\xa2\x5e\x94\x13\xc6\xbe\x83\xf8\xf9\xab"
+ "\xf6\x5b\xff\xb1\x8c\xe3\xb1\xe2\x73\x45\x68\xff\x70\x6e\xe3\xd5"
+ "\xc2\xe8\x15\x36\x70\x58\xb6\x3a\xf1\x7e\x2b\xdb\xb8\x8d\x15\x44"
+ "\xbc\x8f\x6c\xbb\x91\x75\xf7\x7b\xfa\x44\x8c\xd4\x8c\x7b\xe3\x69"
+ "\xca\xfa\x53\xc4\x68\x2c\xe4\x3d\x4f\xe9\xb7\x2e\xd7\x10\xee\x19"
+ "\x16\x3d\x16\xbc\xf7\xc9\xb6\xe9\x16\x65\x3b\xfd\x15\xe5\xdf\x51"
+ "\xe3\x92\xf5\x7e\x2c\x1e\xef\xc9\x4a\x3c\x2e\xf7\xe4\x60\x5c\xfe"
+ "\x9a\x78\x5c\xee\x29\xe8\x7d\x5c\xee\x29\xc3\xb8\xfc\xf5\x72\x3e"
+ "\xba\x67\xa7\xc6\x47\xeb\xb9\x8c\x6d\x09\xdb\xe3\x59\xd7\x73\x1e"
+ "\xdc\x83\x47\xb2\x24\x4e\x46\xb7\xe9\x7c\x24\xcb\x9c\x04\x2c\x59"
+ "\xbf\xca\x73\x4f\xb3\x06\x23\x0a\x6e\x16\x59\xda\x12\xf1\x49\x96"
+ "\x95\xf3\xde\x9e\x4f\x66\xe0\x30\x67\x1b\xc3\x58\x46\x84\x7a\x9e"
+ "\xe5\x7c\x9c\x7e\x7b\x20\x9a\x4f\xb2\xa6\xe8\xf9\x58\xd6\x69\x79"
+ "\xb3\x44\x87\x9d\x38\x5f\x1c\x6c\xad\xff\xfd\xe4\x3c\xc2\xf9\x39"
+ "\x5f\x5c\x9e\x0a\xc5\x8f\x59\x27\x63\xf9\x31\x6b\x77\x2c\x7d\x02"
+ "\xff\x28\x17\x81\x9c\xc3\xbd\x09\x6d\xf8\xca\xf4\x75\x65\xde\x9c"
+ "\x38\x2a\x8e\x37\x41\x03\x13\x1b\x14\x0d\x4c\xfc\x55\x6c\x5b\x27"
+ "\x66\x27\xa6\x81\x89\x73\x7b\xa7\x81\x89\x8e\xde\x69\x60\x62\x39"
+ "\xd3\x80\x8f\x26\xd6\xc7\xf2\xe6\xc4\x5d\xb1\x7d\x47\xbd\x92\x37"
+ "\xe9\xda\xab\xe1\x4d\xe8\x42\x83\x7a\xe3\x43\xe6\x29\xf6\x1f\xa9"
+ "\xee\xd4\xf7\x3a\xbe\x12\xce\xcc\xe0\x2b\xb4\xef\xde\x79\xbc\xa6"
+ "\x04\x19\x3f\x8e\x71\x58\x25\xcf\x63\xde\x5b\x10\x8d\xc7\x2d\xea"
+ "\x0c\xa4\x13\x79\xbf\xe0\x7d\x65\x85\xcf\x49\x87\x63\xfb\x7f\x6f"
+ "\x79\x62\x7c\xde\xbb\x0b\xf8\x74\x26\xc6\xe7\xbd\x47\x7a\xc7\xe7"
+ "\xbd\x2d\x7c\x46\xea\x72\x9e\xba\x37\x64\x5b\x21\x75\x14\x59\xe6"
+ "\x1c\x4d\x7a\xf8\xab\xcd\x4f\x93\xc6\xc6\xce\x4f\x93\x86\x5d\xfd"
+ "\xfc\x34\xc9\x91\x78\x7e\x9a\x54\x96\x78\x7e\x9a\xb4\x53\xf1\xc3"
+ "\x24\x5f\x2c\x3f\x4c\xf2\xc4\xd2\x04\x70\xf7\x7f\x36\x3f\x65\x67"
+ "\xc6\xf1\x40\xe9\x69\xca\x7e\x1f\x3a\x85\x4b\x8d\xdb\xe4\xe7\x63"
+ "\xdb\x98\x3d\x2d\xf1\xb8\x65\x2f\xc0\xb8\x95\x26\x1e\xb7\x6c\x57"
+ "\xef\xe3\x96\x5d\x89\x71\x2b\xbd\x7c\xdc\xb2\xf7\x5c\xbd\x4e\x91"
+ "\xdd\x1a\x3b\x66\xd9\x4d\x57\x3f\x66\x93\x47\x25\x1e\xb3\xc9\xd9"
+ "\x89\xc7\x6c\xb2\xe6\x9b\x3e\xb9\x3c\x76\xcc\x26\x17\xc4\x8e\x19"
+ "\xf0\xf6\xbf\x1c\x33\x8c\xcf\x0e\xe5\x9f\x30\xf9\x22\xec\xf6\x7e"
+ "\x1d\xee\xc9\x6d\x3e\xba\x6f\x8f\xb2\xad\xef\x53\x73\x87\x1a\xc3"
+ "\xf7\x90\xc7\x77\xf9\x3c\x70\x9f\x59\x4b\xfb\xd1\xe5\xe3\x70\xdf"
+ "\x08\xc8\xe8\xb6\xba\x42\xb9\xb7\xa5\xc6\x90\x71\x8e\x7c\x9e\xd5"
+ "\xbc\x3f\x75\x5f\x36\x97\xc5\x18\x0b\x6f\x30\x44\x2c\xd7\x91\x3f"
+ "\xc0\x70\xf8\x6c\x68\x1c\xac\xfc\xab\x99\xe3\x7b\xf7\xa9\x39\xba"
+ "\xc3\x53\x74\x27\xe0\xdd\xff\x82\xa2\xd5\xfb\xe2\xf5\xdf\x6a\xbc"
+ "\x7b\x44\xd1\xe9\xd4\x91\x71\x6d\x08\x24\xa6\xd3\xfb\x53\xd1\x87"
+ "\xea\xc4\x74\x7a\x7f\x46\xef\x74\x7a\x3f\xc6\x9f\xaa\xa3\x6c\x9f"
+ "\x81\x4f\x84\x7c\x71\xb6\xcf\xfd\x76\x4b\x40\xd1\x8e\xd4\x89\x4a"
+ "\x8e\xee\xe8\x70\xdf\x1f\xaf\xff\x61\x6c\xa6\xf4\xd7\xda\xdc\x27"
+ "\xae\x7c\x2f\xfa\xdf\xfd\xac\xff\xbd\xd7\x4b\x9b\xaf\xa0\xff\xdd"
+ "\xcf\xfa\xdf\x7b\x97\xf3\xd6\x14\x4d\xff\x4b\x64\xe3\x4d\x19\x95"
+ "\x78\xfc\xa7\xc4\x8d\x3f\xe5\x14\xc0\x1e\x96\xe5\x63\xf3\xe5\x45"
+ "\xe7\x63\xdf\x24\xce\xcb\x34\x92\x20\x6f\x45\x3c\xcc\x5e\xf2\x79"
+ "\x2e\xa3\x3d\xf6\xa5\x4a\x48\x7b\x53\xb4\x33\x25\x53\xb3\x63\xf9"
+ "\x71\xaa\x29\x96\x1f\xef\xdf\x19\x5b\x6e\xea\x88\xd8\xf7\xf7\x05"
+ "\xfe\xef\x64\xec\xd4\xf2\x38\x1a\x38\x74\x9a\x1e\xb8\x56\xd1\xc0"
+ "\x03\x8b\xe3\xda\xb1\x2b\x31\x0d\x4c\xad\x43\xff\x0f\x25\xa6\x81"
+ "\xa9\xbe\xde\x69\x60\x6a\x08\xb8\x3c\x14\x4d\xb7\xb3\x0b\xb3\xfa"
+ "\xc5\xe6\x79\xc0\x96\x58\xe6\x3d\x30\x2e\xf1\x1a\xc1\x03\xb3\x14"
+ "\x8e\x1f\x28\x8e\xc5\xf1\x03\xf6\x58\x1c\xa2\x2f\xff\x7b\x1c\x76"
+ "\xc7\x83\xe8\x70\x3f\x10\xcf\xff\xde\xd3\xf4\x03\x8d\xff\xa7\x3d"
+ "\x18\xd7\xc6\x80\x6a\x4b\xa2\x75\x91\x1f\xb0\xfd\xeb\x4d\x8c\xcb"
+ "\x1f\x8c\x4a\xdc\xe7\x1f\x64\x63\x0e\xf2\x46\x2e\xe3\xa5\x1f\xcc"
+ "\x45\xfa\x6c\x5e\x0f\xe5\xf5\x90\x2a\xa4\xcf\x0e\x91\x59\xce\x57"
+ "\xdd\xf3\xd2\x0f\x5c\xec\x8b\xc2\xf8\x67\xfa\xb5\x0c\xa3\x59\x3c"
+ "\x07\x71\xbb\x72\x0b\xa5\xdf\x82\x65\x03\xd3\xfa\x4d\x4c\xeb\x3f"
+ "\x90\xfa\x1f\xef\xb3\xb0\x1f\xa1\xc5\x41\xb3\x38\x2e\x85\x4e\xef"
+ "\x9c\x3f\x0e\xf6\x49\xe6\x0b\xce\xaf\xe7\x55\xeb\x66\xae\x38\xd9"
+ "\x34\xcd\x94\x78\x8c\xa7\x0d\xeb\x9d\x76\xa6\x8d\x53\xe3\x3c\x2d"
+ "\x2f\x76\x9c\xa7\xcd\x8a\xb8\x07\xcc\xe1\xbe\x82\x06\xae\x8a\x4f"
+ "\x0a\x6c\xc2\xdf\xab\xbc\x5f\xff\x58\x73\x7e\x11\xdd\x78\x86\xa6"
+ "\x1d\x97\xf5\x19\x45\xd0\xb2\xce\x40\x75\x52\x06\x4c\xbf\x55\xb6"
+ "\x13\x79\x72\x43\x64\x14\xeb\x9f\x69\xe6\x77\xd5\x6e\x11\x44\xbe"
+ "\x26\xde\x13\xe0\xb3\xd5\xa0\x85\x41\xa7\x68\xda\xd9\x98\xf2\xe0"
+ "\x7c\xaf\x82\x91\x51\x2d\xf9\x71\xfa\x08\x7d\x4d\x77\x03\x9e\x13"
+ "\xaf\xfb\x4e\x9f\xa2\xfb\x3e\x28\x9f\xb1\xe9\xbd\xee\x5f\x72\x9b"
+ "\xf8\xac\x0c\xb7\xe9\xca\x72\x60\x7a\xa5\x4e\xbf\xca\xd7\x72\xfa"
+ "\xae\x1e\x5f\xbe\xe9\x7b\xf1\x6e\xde\x15\xd6\x06\xa3\xf8\x60\x7a"
+ "\x4b\x34\x1c\x15\x13\x65\x7a\x50\xf7\xc7\xeb\x70\xcf\x30\x7d\x09"
+ "\x2c\xad\x3d\x33\x46\xc5\xb6\x67\xc6\x78\xe8\x29\xe9\x1a\x8c\x29"
+ "\x57\x82\xc1\x63\xae\x68\x96\xe9\x61\xc6\xbc\x2b\xad\xf9\x25\x59"
+ "\x69\xd6\xab\x97\xd1\xd6\x0c\xa9\x2f\x31\x8c\x2f\x69\x63\x53\x8c"
+ "\x6d\x21\xf7\xee\x79\x6f\x6b\xe6\x36\xc5\xf7\x33\xe3\xd6\x08\x67"
+ "\xb4\x49\x7f\x2a\x8d\xef\x9f\x08\xc5\xf3\xc1\xcc\x54\x7d\x8e\x8e"
+ "\x4b\x1f\xa1\xf3\x3d\xec\x5a\x86\x1b\xb7\xce\x3a\x33\x5b\xf1\xc2"
+ "\xcc\xca\x48\x72\xb4\xbd\x36\x53\xea\x7f\xfa\x7a\x29\xde\x67\xc7"
+ "\x95\x8b\x5b\xff\x9b\xd1\x26\x7a\x5f\xa7\x4f\xc5\xf8\x06\x78\x6f"
+ "\x4b\xc5\x6a\x98\x59\x1f\xb7\x5e\xe1\xdf\x22\xcf\xdf\xff\x05\x70"
+ "\x67\x69\x72\xef\xc1\x89\x71\xf5\xb5\x39\xcf\x5e\xa9\xff\xb3\x7a"
+ "\xe9\xff\xac\x9e\xfe\x2f\x91\x70\xe3\xd6\x12\x67\xc9\xfe\x87\x2f"
+ "\x93\x7f\xb3\xd8\x87\x54\xc7\x1b\x74\xee\x59\x1f\xe8\xba\x3a\xaf"
+ "\x1f\xf4\xae\xab\xcf\xea\x59\xff\x53\xe5\x7a\xd6\xff\xfc\x89\x74"
+ "\x75\x1f\xc9\xbd\xd5\xd8\xba\x9b\x2d\x95\x09\xfb\xd2\xcb\xfa\xdf"
+ "\x83\xda\xfa\xdf\x83\xf3\x62\xe5\xd9\x83\xb6\xd8\x31\x9c\x15\x37"
+ "\x86\x0f\x66\xc5\x8e\xe1\xcc\xb6\xff\xe9\xbc\x86\x67\x4a\x4a\x4a"
+ "\x32\x26\x19\x8c\x86\x24\xbc\x46\x17\xa9\x5f\x92\x29\xa9\x0f\x7e"
+ "\x7d\xb5\x6b\x3f\x63\x92\xd1\x84\x5f\x1f\xed\xda\x37\xee\xb9\x1f"
+ "\x97\xc5\xcf\xa4\x5d\xfb\xc4\x3d\xf7\xfd\x92\xf7\xfd\xb4\x7a\xf5"
+ "\xfa\x4d\x71\xcf\x7d\xbe\xe4\x7d\xdf\xff\x65\x79\xba\xec\x39\xd6"
+ "\x0f\x6d\xea\x92\x15\xf3\xf3\x16\x2f\x90\xfb\xc5\x0b\x6d\xf3\x9f"
+ "\x7a\x6a\xe1\xf2\xe5\xb6\x82\xa5\xb6\x7b\x27\x3e\x74\xe7\xdd\x36"
+ "\xb5\xed\x9c\x37\x61\xe4\x82\x14\x9a\xbe\x72\x19\xbf\x98\x3e\x7b"
+ "\x6a\x8e\x6d\xd6\xbd\x13\x63\x5f\xea\x60\xe4\xf6\xf2\x95\xa0\x44"
+ "\xf1\x5f\x56\xc9\x60\xa2\x4d\xaf\x4b\xd9\xd3\xc2\x7e\xbe\x6a\xcd"
+ "\xe3\x47\x87\xeb\xd9\x7f\xb4\xd3\x29\x3c\x37\xf1\x9e\xfe\xec\x85"
+ "\xdc\x89\xd1\xdb\x5d\x94\xff\x24\x9f\x5f\x99\xbd\x4e\xfc\xde\x4f"
+ "\xb6\x07\xc8\x78\x8a\xe6\xfe\xa9\x6e\x0a\xf2\xe2\xd9\xeb\x0b\x91"
+ "\xcd\x49\x66\x94\x7f\x0e\xef\x0c\xe2\xfb\x11\xa4\x05\x34\x5f\xe8"
+ "\x1f\xae\x93\x69\xbf\x77\xe9\xf9\x2c\xa7\x69\xce\x48\xf1\x7b\x21"
+ "\x9f\xf9\x7c\x90\xca\x37\xfb\x0b\x61\x7c\x68\x2f\xcb\x86\xca\x81"
+ "\x64\xe2\xbd\xd0\x37\x07\x92\xf9\xcd\xc1\x1c\xb3\x64\x76\x9b\xbe"
+ "\x17\x5a\x82\x67\x1f\xcd\x6d\xe2\xba\x39\x6f\xc4\xf8\xd0\x29\xce"
+ "\x5f\x15\x93\x7f\xce\xb0\x9e\xbd\xd8\xd9\x6d\x46\xe4\x9b\xf9\x19"
+ "\x59\x2c\x61\xf1\x8f\x60\xca\x61\xd7\xed\x53\xc8\xe0\xc5\x50\xd4"
+ "\x87\x5c\xa4\x7c\x7e\xe6\x2c\x5c\x15\x16\x21\xf6\x4f\x9f\xde\xe6"
+ "\x14\xa5\xcf\x92\x09\x3c\x6d\xf0\x2c\x63\x1f\x85\x39\xd3\xaa\x17"
+ "\x92\x09\xfd\x1f\x76\x86\x1e\x2e\xb4\xcd\x20\x72\x4e\x27\xd3\x31"
+ "\x07\xfb\x1b\x1e\xbb\x71\xcb\x9f\xc9\xf4\xcb\x4e\x97\xb1\x53\x58"
+ "\xa9\xb0\x40\xb4\x0a\x8e\x63\x14\x10\x41\xf6\xf1\xaf\x9f\x17\xe6"
+ "\x3c\x03\x3a\x9c\x56\x6a\x2c\x08\xd0\xda\x93\x22\x58\xfc\x67\x75"
+ "\x36\xa0\xa1\x2d\xc0\xfe\x8b\xe6\xb5\xd3\x29\xe9\x74\x0e\x19\x1b"
+ "\xec\x15\xe4\x9d\x1b\xa0\xc2\x93\xa2\xb5\x7e\xde\xe7\xd4\x68\xdf"
+ "\x4d\xb9\xcd\x64\xac\x6f\xf9\x94\x64\x2c\x9e\x2d\x86\xcc\xa2\x8b"
+ "\x64\x5d\xbb\x98\xd3\x2e\xd2\xea\xb5\xd4\x7f\xf5\x09\xb2\x78\x5b"
+ "\x9b\x51\xcf\x59\x7a\xf4\x38\x19\x00\xcf\xb8\xe6\x53\xb2\xae\x79"
+ "\x84\xfd\x7c\xb3\xa8\xb2\x88\xac\xc2\x99\x91\xda\xe9\xcc\x48\xeb"
+ "\x14\x19\x03\x3b\x9c\x19\xe9\x8d\xf9\xc8\xdf\x72\x90\x06\x34\x53"
+ "\xfa\xef\xcf\x34\x1b\x2b\x2e\xd0\x30\xee\xd3\x69\xf4\xad\xf2\x02"
+ "\xf2\x6f\xfc\x64\x77\x04\x65\xa3\xcb\x84\x92\x3f\x39\xe2\xcd\x09"
+ "\x52\x04\xb0\x2a\x3a\x69\x58\x65\x27\x59\x23\x25\x9f\xec\xe6\x72"
+ "\x6d\xf4\xc3\x55\xde\x7a\xa2\xc2\xb5\x22\xdc\xb5\xf1\xa8\x0b\x32"
+ "\xb1\xdf\x7b\x4f\xee\x35\x79\xeb\xdb\xa8\x21\xd0\x49\x8d\xf4\x17"
+ "\xf2\x3a\xfe\xe6\xf9\xe5\x93\x7b\x79\xcd\xda\xe0\x59\xdd\x82\xba"
+ "\x14\xed\x38\x1b\xf8\xac\xb2\x8b\x4a\x8b\x28\x35\x7f\x35\xf5\x3b"
+ "\x83\x74\x65\xdb\xd7\x14\x7b\x43\x7f\xf3\xac\x96\xfe\xb8\x73\x9b"
+ "\x8a\x1a\x28\xa9\x31\x50\xc1\x7e\x9f\xc6\xf0\x00\x43\xa6\x37\xd0"
+ "\x44\xde\xfc\xbf\x7a\x22\xa9\x06\xeb\xa6\x08\x99\x7f\x75\xa9\xc9"
+ "\xe8\x35\x5d\x22\x6f\x4e\x80\x0e\xa1\x6e\xb1\xc5\xc0\x7b\x9f\x59"
+ "\x8d\x81\x20\x9f\x77\xca\x14\xed\xd6\x94\xd2\x65\x34\xaa\xea\x02"
+ "\x8d\xd8\x76\x81\x32\x44\x47\x86\x91\x7d\x6c\xf9\x6c\xea\x36\x5c"
+ "\x53\x5b\xc8\x8c\xbe\x2b\x7f\xec\xfe\x9a\xaf\x6d\x57\x06\x55\x77"
+ "\xf6\xf8\xda\x76\xb6\xf7\xf8\xda\x82\xa6\xfc\xec\x6f\xeb\xa3\x87"
+ "\x37\x58\xea\xa9\x1f\xf8\x64\x27\xd3\x77\xe9\x39\x32\xad\x3f\x47"
+ "\x74\xbb\xcb\x48\xb6\x45\x7c\xce\xe2\x47\x0b\xbd\x18\x1b\xbe\x3f"
+ "\x45\x3f\x1a\x86\x6b\x2a\x7e\x06\xa4\xcb\xf8\x0d\x2d\x1a\x1d\x23"
+ "\xcd\x88\xb4\x3e\xb8\x26\x81\x5f\xc2\xce\x4a\xe1\x47\x5d\xcd\xed"
+ "\x46\x4a\x61\x7a\xd6\xfc\x7b\x9b\x3b\xdc\x3f\x0c\xf8\xe8\xd9\x36"
+ "\x9d\xae\x95\x8c\x9f\xed\x3f\x74\xea\x2c\xc7\xcb\xf2\xcb\x76\x75"
+ "\xd9\x0d\x1c\x3b\x4b\x4b\xe7\x36\x3c\xce\xf5\xa2\xfe\x2c\x5c\x2d"
+ "\xf8\x81\x4f\x7f\x78\x5c\x2f\xdb\xde\x65\x47\x9d\x3f\x7a\x18\xe9"
+ "\x42\x4f\x47\xbf\x4d\xfc\xee\xb7\xa7\xce\x1a\x55\x9e\x0c\x23\x60"
+ "\x06\x35\xf8\xe0\xfd\xd9\xe5\xcc\xe3\xed\x46\x8b\xa8\x9d\x37\x96"
+ "\x2a\x5f\x17\xf5\xdb\x5e\x17\x75\x8a\xf7\x7e\x54\xe1\xa3\xa5\x65"
+ "\xdc\x46\xcc\xe3\x75\x9b\xf0\xae\x16\xb3\x0e\xe3\xa5\x6e\x01\xfb"
+ "\x93\xfd\x08\xfa\xdf\x35\x35\xd1\x7d\x10\xee\x07\x2b\x78\x2e\xfd"
+ "\x75\xd1\x91\x3e\x90\x01\x15\x8d\x2d\x6d\xf4\xcb\xce\xd6\x3e\xce"
+ "\xa3\x64\xf4\x86\x4e\xd1\x98\x74\xb2\xb2\x3e\x58\xfd\xba\xf0\xbd"
+ "\xca\xf1\xf9\x5e\x17\x6d\xa0\x97\x1b\xce\x50\x4e\x9f\x6f\xa6\x53"
+ "\xfa\x1f\x1d\xa4\xc9\xa7\x9c\x1b\xa2\xe4\xd3\x3b\x0d\xbe\xbd\x51"
+ "\xb2\x69\xee\xc3\x97\xcb\xa6\xc7\x1e\x54\xb2\x09\xbc\x2f\x65\x51"
+ "\xd8\xa7\xa5\x4f\x88\x4b\xd7\xfc\x44\x1e\x1b\x1e\x97\x1e\xd4\xd2"
+ "\xfb\xc7\xa5\xfb\x55\xfa\xa3\xd3\x75\xd9\xd7\xc8\xed\x58\xc9\xb2"
+ "\xef\xd1\x3b\x58\xf6\x35\xce\xd3\x64\x9f\x94\x3f\x8f\x5e\x27\xfe"
+ "\x05\xb2\x68\x05\xcb\x9b\x47\xce\x72\xfb\xc5\xef\x49\x6f\x7b\x32"
+ "\xd2\x7e\xc5\x69\x65\x7f\x21\x13\x7e\xba\xdc\x13\x2c\xf7\x58\xe6"
+ "\xb1\xec\xdb\x3a\x58\x34\x6f\x7d\x5d\x1c\xaf\x94\xb1\x7f\x1e\xe9"
+ "\x96\x7f\x2f\x21\x6d\x13\xd2\x5e\xc2\x7b\x96\x83\x8c\x93\x86\x9c"
+ "\xbd\xc4\xfe\x27\xa0\xb1\x61\x11\x63\x26\x6d\xc1\x78\xf3\x79\xc3"
+ "\x0d\xc0\xaf\xc5\x40\xf9\xde\x02\x3e\xc3\x1a\x66\x9f\xb4\x96\xc6"
+ "\x82\x16\xe6\xbb\xc1\xeb\xc1\x67\x5e\xc7\xe7\x54\x14\x10\x67\xf8"
+ "\xdc\x1d\xb7\x21\x77\xd5\x03\x1c\x2f\xc9\x50\x07\x6b\x98\xfd\xc2"
+ "\x59\x66\xa3\x2d\xa6\x32\xb4\x49\xc5\x67\x79\x64\x87\x8f\x76\xb8"
+ "\xd4\x58\xcf\x6d\xe2\xb8\x6c\xa7\x28\xa7\x15\xf6\x5e\x90\xfb\x66"
+ "\x09\xbb\x88\xcf\xc1\x70\xac\x42\xbe\x6e\x35\x46\xec\x65\xfa\x59"
+ "\x18\x37\x64\x03\xf2\x78\x9b\x83\xc4\x6d\xf6\xd1\x23\x63\x1b\x0a"
+ "\xf7\x72\xf9\x66\xc6\x8d\x70\x3b\x75\x18\x06\x09\xc3\x28\xed\x46"
+ "\x3b\xf2\xa9\xb5\xf3\x94\xa3\xae\x86\xb9\x7e\x62\xb9\xef\x6d\x05"
+ "\x8c\xc2\x53\x0a\x06\x60\x09\xcc\x01\x31\xef\x34\xf8\xfd\xd7\x8a"
+ "\x7f\x00\xfe\x0e\x1e\x2f\x3e\x17\xc9\xfb\x6d\xc0\x4b\x2a\xfb\xca"
+ "\x2b\x5d\xf4\x91\xd1\xd5\x7f\x21\xd2\xce\x76\x82\xde\x1e\x19\xc5"
+ "\xe7\x96\xf8\x3c\xe7\x95\xce\x72\x02\x47\x23\xf4\xf3\x9c\x91\x95"
+ "\xff\xb7\x67\x39\x01\xdb\x5a\x65\x14\xbb\xd1\xfe\x51\x7c\x9e\x13"
+ "\xed\xdf\xc4\x74\xa8\xf5\x29\xf3\xb5\x47\x25\xce\x0b\x38\x0d\xb6"
+ "\xe3\x11\x7d\xfc\xb9\xbf\xdc\x17\xbc\xcb\x51\x3a\xa2\x80\xfd\xf1"
+ "\x58\x26\xbf\x47\x5a\x36\xe7\x1f\x03\x39\xe6\xc5\x1c\xf6\xde\xa9"
+ "\xb0\xb1\x74\x35\x99\x94\x4c\x9b\x3b\x95\xcb\x2b\x99\x36\x97\x7a"
+ "\x64\xda\x63\x17\x95\x4c\x53\x38\x56\x32\xed\xb1\xbf\x2b\x99\xf6"
+ "\xd8\x67\x72\x5f\x0c\x32\x8d\xdf\xb1\x5c\xd3\x65\xda\xb6\xc1\xe2"
+ "\x08\xcb\x8e\x0e\xf7\x63\x4d\xba\x6c\xdb\x8c\x34\x96\x1d\xdc\x46"
+ "\x25\xa7\x1e\xcd\x10\xff\x91\x41\xca\xef\x80\xef\xed\x7c\x7e\xa1"
+ "\x55\xbb\xe7\xf9\x64\xa2\x92\x71\x73\x47\xf4\xc8\xb8\xc7\x76\xf6"
+ "\x94\x65\x19\x37\xf7\xbb\x4a\xc6\xa9\xf4\xea\x47\x59\xc6\x3d\x9a"
+ "\xc1\x38\xd0\xe0\x1b\x79\x0d\x4f\xcb\xcf\x78\xcc\x8c\x96\x71\xb1"
+ "\xfc\x35\xb7\x50\x97\x71\x2c\xdb\xf0\xbc\x09\x32\x4d\xda\x90\xcc"
+ "\x67\xe5\xc0\xb9\xce\x77\x3c\x06\xdc\x67\x8e\xbf\xc6\x78\x9b\x74"
+ "\x96\xfa\x69\x67\x87\xb4\x7e\xcf\x3d\xa2\xfb\x3e\x02\xff\x4d\x89"
+ "\xf4\xe8\x9e\x18\x89\xf4\x75\x3e\x3b\xef\x75\x9d\x22\x6f\x85\x70"
+ "\x35\x86\x4e\x52\x6e\x01\x64\x45\xd2\x33\x9f\xf1\xd8\xc2\xee\xf8"
+ "\x1e\x5f\x59\xf6\x9c\xa1\xc7\xfb\xe7\x06\xa8\x2f\x6c\xf5\xcf\x4a"
+ "\x8d\x78\xe7\x88\x79\x27\xd7\x18\x6e\x5f\xc6\xf1\xf5\xc0\x08\xbd"
+ "\xd8\xfb\x57\x59\xdf\xda\x2b\xd4\xf7\xa6\xac\x0f\x3a\x15\x6c\xa0"
+ "\x6b\xcf\xd1\xe3\xd2\x2e\x91\xf1\x6d\xd6\x27\x84\x75\x54\x7b\xdf"
+ "\xa7\x97\xf7\x7f\xbf\x72\xf9\x27\x92\xaf\x5c\xfe\x89\x5b\x59\x16"
+ "\xa1\x7f\x96\xb0\x3b\x16\xce\x80\x90\x9e\xef\x0c\xe7\x7b\x50\x5b"
+ "\x8b\xf9\xcc\x39\x5c\xda\x68\x56\x1d\x26\xd3\xdf\x16\xe4\x93\x31"
+ "\x43\x20\x2b\xb3\x57\x11\xc7\x6b\x89\x2e\xbb\xb9\x07\xc7\x4f\x64"
+ "\x5d\x61\xdd\x2f\xd5\x5b\x41\x32\x66\x6c\x2d\x74\x52\x8e\x69\x54"
+ "\xde\xbd\xfe\xf1\x44\x0b\xe4\xa6\x2f\xca\x2f\x96\xed\xb1\xaf\x73"
+ "\x5c\x03\xd6\x2f\x4b\x95\xbd\x39\x04\xf2\x79\x20\x9f\x87\xe1\xb3"
+ "\x31\xb9\xe1\x59\xc6\x5a\x19\xcb\x2c\xd7\xa6\x97\xed\x6d\x9d\x85"
+ "\xeb\xd5\xea\x64\x1f\xd3\x00\xca\xcc\xd1\xcb\x30\x6c\xf6\x53\xc4"
+ "\xbc\xfc\x75\x79\xa6\x34\xd4\xc6\xb2\x70\x08\x74\xd1\x81\xaa\x9e"
+ "\x79\xa4\xd5\x53\xec\xa3\xc7\x67\x5d\xe9\x6c\x46\xef\xfd\xcb\xad"
+ "\xbb\xfa\xfe\x91\xd6\xbf\x79\xf4\x25\xfd\xbb\x42\xbd\xf3\xc6\x5f"
+ "\x7d\xbd\x69\x7a\xbd\x8e\xab\xc7\xeb\xbc\x5d\x5f\x1d\xaf\x99\x1a"
+ "\x5e\xe7\xf9\xbe\x04\xaf\x09\xea\x99\x9f\xfe\xd5\xeb\xb1\x69\xf5"
+ "\xcc\x9f\x92\xa8\x1e\x92\x7f\xbd\x9e\x9b\x32\xeb\xb1\x36\xdb\xc1"
+ "\x3b\x2a\x56\xdd\xfc\xb2\xe8\xf8\xc5\xed\x92\xaf\xe6\xef\xe8\x8e"
+ "\x97\xac\xf6\xca\x21\xab\xe7\x1f\xce\xdd\xce\xf3\xbb\x88\xf8\x68"
+ "\x7e\x1d\xc7\x71\xcd\x5e\xab\xce\x64\x6b\x65\x9a\xaf\x14\x37\x99"
+ "\x63\x74\x71\x4c\x3e\xaf\x15\x7d\xaf\xe0\xd8\x25\x27\xca\xd8\xff"
+ "\x1e\x36\x15\x64\xfc\x93\x37\x70\xcc\x31\xdc\xf7\xc3\x7d\x86\x92"
+ "\x01\x4f\x66\xa0\x9e\xde\xcf\x4e\x6e\x3c\xb1\x7d\x47\x51\x66\x9f"
+ "\xde\xfc\xeb\x51\x1e\x3a\xc5\x73\x72\x6d\x2a\x92\xf2\xb1\x03\xb6"
+ "\x84\x16\xef\x6f\xc1\xe7\x32\x06\x9c\x33\x87\xcf\x93\x60\x5e\x5c"
+ "\xd0\x5f\x3b\x07\x00\x7c\xb8\x80\xd7\x27\xb7\xeb\xf8\xd0\xd3\x91"
+ "\xb6\x47\xc7\x07\xf4\x9b\x54\xef\xf6\x10\x9f\xd3\x09\xa8\x33\xd9"
+ "\x4f\xfe\xbb\x28\x39\x51\xa1\x60\x3f\xa5\xf6\x68\xb8\xbe\xae\x1c"
+ "\x93\xb4\x9b\x8a\xd8\x6e\x7a\xaa\xc6\x9f\x7c\xa2\x42\x6f\x87\x58"
+ "\x6e\x35\xf2\xd9\xef\x31\x98\x4b\xb7\xa8\x98\x7b\x06\x3e\x27\x27"
+ "\xdf\x2f\xcf\x30\x2a\x9c\x3c\x35\x41\xb4\x73\xec\x18\x09\x3b\x15"
+ "\xed\x6c\x61\xb8\x3e\x5c\xfd\x6b\x32\x38\xee\x85\xd6\x9f\xa7\x46"
+ "\x46\x36\x7e\xec\x88\x74\x58\x8d\x7a\x7b\xab\xe4\x99\xd6\xa7\xd0"
+ "\xff\x79\x2a\x4e\xac\x6c\x8f\xd5\xc8\xfe\xfc\x91\x94\x13\xdb\xc5"
+ "\x1a\x2b\xed\x59\xd6\x2a\xed\x26\xae\x73\x0c\xea\x17\x6c\x27\x41"
+ "\x37\x41\xb9\xed\xdd\x78\x03\x5c\xd1\xa1\xe3\xed\xa9\x69\x6a\x5e"
+ "\x56\x7d\x0c\xac\xb1\x1a\x6b\xfd\xf2\xbc\x1d\x8d\xb0\x39\xbf\x50"
+ "\xb1\xb0\x9f\x3a\xa9\xe3\xae\xbb\x4d\x68\x0f\xe7\x51\xfe\x4d\x4f"
+ "\x85\xf4\x36\x49\xde\x4d\xe1\xf3\xbb\x4f\xfa\xf9\xdc\x90\xc2\x7f"
+ "\x6d\x6a\x87\x7b\x81\xed\x72\xfc\x2f\x18\x1b\x85\xff\x24\xa6\x3d"
+ "\xc6\x3f\xaf\x75\x00\x2f\x8f\x03\x97\x66\x75\xde\x81\xf5\x99\x05"
+ "\x0b\xf1\x9c\xca\xed\x8c\x94\xe8\x38\xcf\x31\xa9\x75\xb2\x05\x15"
+ "\x51\xe3\x80\xfe\x5a\x59\x57\x33\xe8\xfd\xe7\x32\x8c\x03\x8e\x2b"
+ "\xc9\x75\xa3\x3d\xd7\xa0\xee\xdd\xf1\x7d\x5a\xaf\xce\x92\x90\xf2"
+ "\x2d\x59\xd0\x14\x15\x5b\xdc\x5f\x60\x13\x41\x75\x2e\x79\x81\x63"
+ "\x4f\x91\xdf\xd4\x9b\x0c\x60\x1a\x94\x31\x2a\x8d\x72\x5d\x01\x3a"
+ "\xd7\xa2\x8f\x04\xda\xa6\xc6\x7e\xd1\x36\x95\xb6\xf0\xef\xb8\x82"
+ "\xc6\x16\x4e\x14\xa8\xdb\xef\x94\x31\x56\xd0\xb7\x45\x3e\xa6\x39"
+ "\x9d\xce\x78\x1d\x52\xf9\x8c\x2f\x7c\x87\x65\x8a\x8e\x73\xb4\x3f"
+ "\xa5\xc3\xbd\x30\x5f\x6f\xbf\x9e\x9f\xc7\x8e\xf3\xf0\x9e\x4d\x9d"
+ "\x2d\x28\x65\xad\x3a\x33\xb4\xb0\x52\xe7\x61\xae\x83\xc7\x99\x65"
+ "\x0d\xe3\x43\xe1\x62\x61\x4d\x2c\x2c\xab\x51\xc5\xcd\x64\x9a\x07"
+ "\x3f\xae\x0e\xf6\x41\x1e\x5f\x0f\x8c\x85\x73\xd5\xbb\xee\x76\xb2"
+ "\x9f\xbf\xf4\xc5\x53\xe3\xb1\x68\x2a\xf7\xab\xa7\xbd\xcc\x7f\x8b"
+ "\xba\xc7\x9f\xdf\x05\x9c\x56\x8e\xc1\x2b\x65\x4c\xc1\x70\x6e\xaf"
+ "\x9f\x63\xdb\x4a\x5a\x07\xfc\x32\x6e\x3b\xe7\xd1\xc7\xac\x87\x16"
+ "\x17\xd9\xa3\xe1\x08\xa7\x6c\xab\x84\xa3\x64\x87\x9f\xf7\xb6\x6d"
+ "\x6a\xbf\x65\x51\x79\x54\xbf\x53\xf5\xf6\xf4\xc8\x84\x45\x7b\xe2"
+ "\x69\x92\xeb\xe6\x58\x7c\x1a\x6c\x96\x25\x69\xa7\x68\xd1\x76\xad"
+ "\x5d\x56\x1e\xc7\xde\xe6\x37\x8e\x73\xc9\xb1\x4f\x5f\x55\x32\x04"
+ "\xe3\x6c\x1f\xfe\xaa\x3a\x47\x14\x50\xf1\x4f\x7f\x3c\x52\x18\x7f"
+ "\xca\xb8\xe2\xf5\x74\xbf\x8c\xd7\x21\xcf\x98\xff\x98\xf7\xf8\xc5"
+ "\x80\xfc\x9f\xca\x58\xb7\x9a\x6f\xa0\xbf\x2e\x3f\x24\x63\xf9\x39"
+ "\x0b\xf8\xcc\x6d\x88\x6d\x3d\xe9\xfb\x56\x5b\x10\xa2\xd9\x41\xe6"
+ "\x89\x1f\x17\xf0\x59\x7a\x15\x47\xfc\xc7\x2e\xfd\xfc\x3c\xc7\xce"
+ "\xe4\xb8\xaf\x90\x43\x49\x3d\x71\x5b\xed\x39\xac\x63\x69\xe3\x4b"
+ "\x5b\x8c\xa2\x49\xf1\xff\x8f\x8f\xf2\x79\x79\xb5\x8f\x75\x0a\x32"
+ "\x21\xe9\x6f\xa7\xe8\xc7\x9f\xa9\x75\x1f\x5d\x46\xd9\x1f\xe1\xbd"
+ "\x2c\x9f\x06\x03\x75\xb5\x81\xbf\x67\x5d\x2e\x4b\x7e\x7c\x54\xb7"
+ "\x5d\xf8\xfc\x9d\xda\x17\xeb\x81\xe7\xa3\x1f\x4b\x5b\xb0\x67\x0c"
+ "\xfe\x00\x58\xf6\x71\x97\xcb\x05\xfb\x34\x9d\xf7\xf2\x6f\xe2\x33"
+ "\xdc\x3f\x4e\xe3\xfa\x7b\x9b\x2f\x84\xf3\x11\x1e\x27\xf3\x69\x5b"
+ "\xe2\xb1\x49\xbc\xcf\x66\xdf\xad\xf7\x41\xc7\x89\xea\xc3\xe2\xe4"
+ "\xf6\x94\xa3\xbb\x7a\xfa\xbe\x58\xea\xae\x51\xef\x27\x46\xe1\x86"
+ "\x9f\xb3\xd4\xbc\xb6\x18\xf8\x59\xa0\xc5\xaa\x55\x69\xe0\x9d\xad"
+ "\x62\x4d\x0e\xa9\x36\x2e\x26\x9d\xd7\x91\x77\x94\x8f\x2e\x5a\xd5"
+ "\x7e\xd7\x62\xf4\xdf\x5e\xac\xca\xd9\x8f\x73\x5b\x12\xf6\x33\xb6"
+ "\x8d\x7b\x59\xd7\x50\x31\x15\x16\xef\xe3\xf6\xda\x6e\xe6\x31\x5e"
+ "\xfc\x82\x94\xe1\x1c\x5f\xa1\xcb\xde\x27\xd0\x95\x41\xed\x5d\x76"
+ "\xc8\x85\x0c\x23\xea\x81\xec\x6a\x0f\x68\x75\xee\xd2\xdb\xca\x6d"
+ "\x93\xf1\x39\xc5\xe2\xc4\xf8\xe5\x7a\x65\xcc\x27\x7b\x3f\xfc\xcc"
+ "\xf8\xf5\xfd\xaa\x7a\x09\xf4\xf4\x56\x7f\x49\x53\x66\x64\x85\x38"
+ "\xc2\xf1\xc5\x60\x8b\xb4\x96\x82\x7e\x07\xac\xf3\x40\x37\x7f\xdc"
+ "\x98\xbb\x8a\xb2\x60\x33\x93\xb8\x24\xc6\x55\x45\x70\x5d\x21\xc6"
+ "\x72\x9c\x71\x3c\x67\x6a\xcf\xa3\xf8\xb9\x7d\x85\x98\xdb\xe1\x7e"
+ "\x7a\x9e\xbe\x47\xa8\x62\xe3\x3c\x9d\xdf\x1d\x4f\x28\xe9\x31\x3e"
+ "\x4f\xc4\x71\xa7\x22\xb0\x85\x5a\xb9\xde\x5c\xb6\x67\x51\x1f\xf2"
+ "\x55\x40\xdf\x68\xe1\x7c\xfe\xa4\xdb\x06\xe2\x97\x38\x9e\x07\xca"
+ "\x70\xbb\xda\x93\x9b\x32\xf5\xb6\x0e\x08\x64\x19\xbf\x62\xdb\x42"
+ "\x7a\xdb\x90\x7e\xa4\x54\xa5\x87\x38\xfe\x21\xfb\x3a\x76\xb8\x9f"
+ "\x19\xa6\xb7\x55\x6f\x03\xd7\xc7\xe7\x37\x45\xca\xd1\xbd\x1c\x7b"
+ "\x86\xeb\xe3\x78\xaa\xc8\x3b\x45\x6f\xef\x57\xa5\xe5\xa2\x4a\x21"
+ "\x78\xfe\x64\xf9\x6b\x1b\x4a\xd4\x18\x60\x99\xf2\x4c\x65\x6d\x65"
+ "\x00\x34\x77\x74\x3f\xea\xd8\xd7\x2e\xec\x14\xe9\xb2\x27\x1c\x63"
+ "\x2e\x83\xfc\xcd\x52\x3e\x6c\x3c\xba\x2f\x22\xa6\x40\x4e\xa0\x5c"
+ "\xd7\x14\x5e\x6b\x02\xdf\xe6\x99\xea\x0a\x5b\xf9\xcc\x25\x64\x4e"
+ "\x9e\x09\x79\xf6\xb2\x9e\x05\x7b\x2b\x28\xbf\x5f\x01\xd9\xe4\x59"
+ "\x31\x16\x30\xf2\xfa\x98\x1c\x64\xaa\x8b\x8b\x53\xd5\x1b\x7d\xb4"
+ "\x9b\x3f\xde\xdd\xbe\xf1\xe3\xe2\x0e\x77\x1e\xf4\xff\x67\x7b\xdd"
+ "\xf3\x5d\x3f\x18\xf8\x44\xbe\xb2\xa1\x6c\xef\xe5\xd9\xaf\x94\x57"
+ "\xdf\xaf\x66\x19\x34\xc6\x4a\xa9\x22\xf9\xe3\xdd\x2c\x6f\xdb\x53"
+ "\x3e\x2e\xe6\xb9\x04\xe5\x77\xea\xe5\x79\x5e\xe7\xb9\x03\xe3\x65"
+ "\x2d\xed\x96\x87\x79\x4d\x8a\x9f\xf3\x9a\x74\x1e\x4d\x54\x4f\xc1"
+ "\x0e\x11\x71\x8e\x24\xa3\x17\xf3\xd6\xed\x41\x4a\xad\x7a\x8b\xa8"
+ "\x6c\xb5\x08\xbe\xba\x1a\x36\xcc\x50\xfe\xde\x45\xde\x14\xe6\x51"
+ "\xa6\xef\x2d\xa0\x97\x24\xb4\xe5\xd5\x4b\xa8\xb3\x48\xe5\xd3\xfc"
+ "\xd6\xad\xc8\x57\x80\x6b\xba\x30\x1a\xa9\xbc\x88\xcc\xe5\x11\x32"
+ "\x95\x15\xd1\x30\xa4\x41\xd7\x7d\x76\x8e\xce\xb3\x89\xda\x50\x5a"
+ "\x45\xf4\x0a\xea\x5d\x57\x24\x42\x7f\xc0\x7c\xee\x8e\x88\xe0\x57"
+ "\xc1\x3b\xfa\xbf\x47\xf5\xf1\xd9\x3d\xba\x4e\x88\x7b\x4f\xac\xdf"
+ "\xc1\xb3\x97\x9d\xf1\x7e\x72\xe9\xd2\x82\xdc\x65\x0b\xf9\x92\x31"
+ "\xf2\xf9\x5b\x53\xa2\xd7\x42\x78\xfe\x53\x71\x2a\x9e\x6d\xe6\x75"
+ "\xc7\x57\x07\xea\xfb\xe8\x4b\xac\xfa\xda\xa7\xe6\xaf\x7f\x0f\xdb"
+ "\x74\x6c\xfb\xe0\xdd\xd8\xc3\x85\x6b\x19\x8c\xe1\x33\x33\x19\xe3"
+ "\xeb\x5b\x34\xbf\x60\x7e\xde\xdd\xbc\x63\x96\x92\xa0\x9e\x25\x53"
+ "\xe2\xea\x71\x75\xd7\xa3\xe6\x9f\x80\x91\xf3\x6d\x1e\xd2\x24\x92"
+ "\x43\xf9\xea\xac\xf4\x92\x1d\xfa\x9a\x56\x2f\x7e\x8e\xc1\xf0\xc6"
+ "\x4f\xfc\xcc\x0f\xce\xb5\x64\xfc\xed\xea\x66\x23\xeb\x91\x45\xb8"
+ "\xe7\xb5\x05\xb9\x46\xa6\xc5\x8b\xfa\xfd\x85\x66\xcc\xef\x4b\x82"
+ "\xa2\xe4\x68\xd0\x47\x4b\x7a\x5d\xb3\x89\xf6\x11\x61\x9f\xc2\x16"
+ "\x5a\x9a\x76\x25\x9f\x23\xce\xcf\xfd\x61\x9a\x8d\x2b\xf7\x82\x1a"
+ "\xb3\xa5\xa0\xff\x3c\x5b\xf7\x79\x5e\x2d\x4f\xe9\x60\x3d\x0e\xd7"
+ "\xd2\xb9\xbd\xfa\x8b\x14\x7f\xbc\x57\xd1\xf8\xd2\x8f\xea\x60\xaf"
+ "\xa1\x9f\x3f\x39\x45\x4b\x0f\x9b\xac\xd0\x11\x86\xd2\xcf\x70\xff"
+ "\x11\x97\xe5\x77\x31\x74\x74\xc3\xd9\xed\x26\x48\x17\x48\x19\x83"
+ "\x50\x7f\x64\xd2\x6e\x92\xf0\x33\x0a\x83\xdc\x4d\x4d\xc2\x08\xf6"
+ "\xeb\x6b\x22\xcb\x80\x54\xf3\xd7\x6f\x1c\x66\xbd\xe7\xfb\xe3\xc7"
+ "\x39\x8b\x0a\x21\x95\x43\x41\x8b\x88\x8e\x9f\x16\xb2\x3e\x7c\xab"
+ "\x8b\xa4\x3f\x4d\x49\x28\x61\x9c\x98\xcd\x6e\x91\xcf\x67\xd7\x23"
+ "\x03\x06\x65\x39\x9f\x27\xe3\x7b\x9d\x3e\x23\xc7\x68\x66\xfd\x99"
+ "\xbf\x75\x71\x8a\xf2\x1f\x3c\x84\x34\xe0\xcb\x21\x36\x0d\xca\x52"
+ "\x7a\x67\xfe\xcb\x91\x2d\x83\xb2\x7a\xe0\x9b\x88\xe1\x3b\xdf\x24"
+ "\xe3\x8e\xa2\x56\xa3\xd7\xf4\x7d\xf2\xda\x02\x74\x08\xf7\x09\xc7"
+ "\x0a\x75\xb2\x2e\xcb\x30\xaa\xdd\x91\x62\xe7\x17\x64\xd4\xce\x9f"
+ "\x1a\xcf\x51\xfe\xd1\xdd\xbd\x94\xe3\xf3\xde\xed\x29\xde\x4b\x1d"
+ "\xee\xe7\x4c\x3e\xba\x37\x5b\xd3\x65\x30\xe7\x3e\x07\xfb\x7f\xa9"
+ "\x8c\xf3\x84\xf7\x17\xf9\xbb\x30\x48\xcb\xd0\xf3\x24\xd6\x67\x78"
+ "\x0d\x5e\x78\x98\x0e\xc4\xa5\xbf\xb7\xf2\xd9\x96\x5e\xfc\x60\xfa"
+ "\x79\x1d\x77\xf2\x5e\x64\x9f\x01\x90\x3f\xce\x8b\xa2\x2b\xec\xa6"
+ "\x74\xb0\x93\x31\x6c\xa4\xaf\x87\x2e\x89\x9c\x86\xb6\x0b\x32\xa6"
+ "\x29\xcb\x9a\x5f\x2f\xfa\x83\xd1\x1b\x3c\xef\xf1\x6e\x88\x50\x23"
+ "\xf4\x4a\x6f\xe5\x79\x8f\x8a\x7d\x1a\xa6\x06\xfa\x0b\x35\x38\xfe"
+ "\x9f\xcb\xeb\xfa\x0b\xd2\x85\x8c\x85\xdd\x75\x49\xcc\xf1\x9a\x3e"
+ "\x21\xfe\x4e\x11\xcf\x71\xc0\xbb\xed\x1c\x3d\xf7\x8f\xdf\x03\xce"
+ "\x7b\xff\x09\x58\x32\x66\xda\x04\x3a\x84\x7b\xf4\xa9\x7b\xfe\x4b"
+ "\x18\x6b\xc6\xe0\xd9\x6c\x71\x3c\x6e\x8c\x60\x2e\xe5\xd8\x76\x98"
+ "\x43\xc7\x72\xbf\xf0\x9c\xc9\xcf\xb8\x8e\xe2\xab\x65\x9d\x67\x9b"
+ "\x25\xf4\x38\xcf\xad\x39\x3c\x6f\x22\x7d\x4e\xf5\x25\x39\xd7\xce"
+ "\xd2\x9e\xa7\x69\xcf\x53\xb4\xe7\x6c\xed\x39\x4b\x7b\xe6\x75\x79"
+ "\x6d\x4e\x5e\x56\xd6\xad\x2f\x18\xfb\x35\xe1\x79\xbb\x3e\x16\x68"
+ "\x4f\x7f\x8b\x63\xad\x9c\xdb\xb5\x76\x8c\xd5\xda\x95\xa9\x3d\xeb"
+ "\xed\xb9\xc1\x12\x5a\xfb\x7f\xd4\x9e\xe5\xb6\xd8\xf6\x2c\xcf\x8c"
+ "\x6a\x0f\x59\x1c\x59\x5f\xa5\x3d\x69\x16\xfe\x4e\xc4\xff\xa2\x3d"
+ "\xdc\x16\x4e\x43\xfd\xbb\xe3\xda\xe3\xd1\xdb\x93\x90\xde\x56\x88"
+ "\x56\xd6\x6b\x96\x5f\x2f\xe3\x3a\xf7\x63\x9d\xa5\xba\x53\x8f\x53"
+ "\xb8\x3c\x74\xa5\x38\x85\xe0\x05\xcc\xdb\x05\xe8\xff\xf2\x7a\x4d"
+ "\x7f\xab\x51\x7a\x7e\xc1\x58\xdd\x77\x0c\x7d\xdd\x59\xaa\xfa\xba"
+ "\x6b\x03\xc7\xea\x5b\x45\x5f\x73\x3a\x44\x2b\xec\xee\xff\x62\xdb"
+ "\x30\x1a\x6e\x5e\xc1\xf2\xe5\xcf\xde\x6d\xcb\x9b\xbf\x64\xa1\x6d"
+ "\xe4\x02\xdb\x72\xfb\xe2\x45\x05\x0b\x63\xfd\x29\xd2\xb4\xef\xf7"
+ "\xc8\x73\x22\x6c\x4b\x49\x5b\x1a\xf4\x2f\xe5\xa4\xf4\xc9\x2b\xb8"
+ "\x28\xdc\x05\xf3\x58\xe6\x56\xbd\xa2\xbe\xf3\x84\xf6\xd4\xe9\x73"
+ "\x88\x6e\xff\xf2\x1c\x82\xf4\x93\x98\x27\xe7\x46\xa5\x73\x5e\xbf"
+ "\x9e\xc6\xf0\x35\xd9\xd4\xef\x14\x15\xbc\xcc\x75\x26\xc4\xe1\x25"
+ "\x01\x3b\x20\x87\xbf\x61\x61\x84\x4c\x11\x1c\x77\x8b\xcf\x5f\xa2"
+ "\x9c\x38\x4d\xcf\x4b\xbb\x62\x0e\x9e\x95\xcd\x26\xd0\xc6\xe7\x1f"
+ "\x46\x99\x1d\x48\x33\xb1\x0e\x01\x3b\xb0\x95\xcb\x21\xfd\x59\x8e"
+ "\x83\x81\x74\xb3\x16\x4f\x8c\xd3\xd6\x71\x9c\x0a\xa4\xa5\x45\xa5"
+ "\xbd\x86\x34\x2b\xd2\x6c\x1a\xbc\x77\x18\xcf\x78\xce\xd2\xd6\xc9"
+ "\x38\xcf\x3e\xad\xde\x98\x98\x16\xfc\x0d\x97\x3b\x6f\xcf\xb4\xcd"
+ "\x99\xfd\xed\x09\xdf\x7f\x6a\xe9\x92\x45\x29\x24\xd1\x9e\x81\xe9"
+ "\x38\xf3\x4e\xc7\xad\x77\xdb\xf2\x17\x2e\x5c\x66\x5b\xb9\x70\x49"
+ "\x81\x6d\xfe\xca\xf9\xab\x52\x68\xd1\xd2\x65\x4f\x71\x94\x05\x1e"
+ "\x96\xe5\xb9\x4f\x2d\xfa\x31\x3b\xbd\xa8\xdc\x29\x31\x7a\xc2\x1c"
+ "\x96\x6d\x5a\x5c\x92\x23\xa5\xac\x43\x26\x1f\x77\xe1\x9e\xe3\x75"
+ "\x59\x71\xad\xc3\xaf\x06\xbf\xbd\xf8\x1d\xc7\xaf\xe9\x0c\xad\xe1"
+ "\x98\x18\x7b\x3a\xdc\x2b\x16\xe8\xfa\x4a\x0f\x0d\xad\x70\xe8\x34"
+ "\x04\xfd\x62\x8f\x9a\xdf\x56\xec\x6c\x0c\x49\xfe\xe9\xa6\xa9\xd2"
+ "\x4b\x3d\x34\xc5\xf1\x46\x1b\xd9\xa7\x6b\x05\xde\x77\xca\xb5\x4a"
+ "\x5e\x33\x49\x66\xbc\x9d\xa6\x55\xdb\xaa\x5f\x17\xf5\x1c\x2b\x07"
+ "\xd7\x3a\xd0\x4b\xbd\x8a\x4f\xb3\x72\x04\xf2\x0d\x47\x1d\x35\xaa"
+ "\x0e\xed\x79\xb0\x38\xc2\xdf\x70\x39\xa5\x3d\x33\x2c\xc0\xb8\x8b"
+ "\xef\xf9\xaa\xed\x9d\x5a\xb4\x6f\xbc\x19\x7b\xde\xad\x6c\xd0\xea"
+ "\xe0\x6f\xfd\xb8\xaa\xdc\xd2\x96\x92\xb6\x33\xaf\x11\x5b\x0c\xf7"
+ "\x08\xb4\xe7\x7c\x24\xe9\x31\x15\xff\xd2\xd5\x09\x19\xf1\xad\x6f"
+ "\x79\x1d\x32\xbf\x81\xd7\x90\x67\xe4\x8b\x08\xc7\x21\x8f\x24\x3d"
+ "\xd3\xcc\xe5\x84\xf9\xb8\x2b\xb2\xa5\x7f\x96\xd2\x19\x38\xee\xe0"
+ "\xca\x9d\x1a\xcc\x20\xe3\xf6\x0c\xad\x78\x44\xd9\xe1\x6b\x36\x28"
+ "\x5d\x62\xe5\x1e\xdd\xd7\x12\x3c\x9a\x81\xe7\x3a\x5d\x06\xf8\x68"
+ "\x65\x99\xe6\x17\xe7\xd1\xfa\x1f\xd2\x9e\xf7\x6a\x6d\x34\x70\x2c"
+ "\x14\xb4\xbf\x89\xc7\x0e\xfa\xca\x5e\xdc\x1f\x07\x7e\xea\x15\x7e"
+ "\x1c\x32\xce\x01\xf4\x26\x7e\x7f\x9c\xbf\x77\x83\x77\xc7\x55\x9c"
+ "\x91\x95\x63\xb9\xcf\x3d\xbe\xb3\x95\x59\x68\xeb\x5d\xbc\xc7\x0c"
+ "\x5e\xda\xeb\xbd\xc4\xfc\xb9\x32\x13\xf0\x76\xeb\x72\x87\xe5\x4c"
+ "\x6e\x18\x7c\x2a\xed\x29\x47\x9e\x2e\x6f\x7a\xe8\xc0\xe1\x4a\x24"
+ "\x4b\x12\x8d\xbb\xc2\xbf\xe3\xef\xc2\xfd\x7c\x1d\xda\xb4\x5b\x8e"
+ "\x01\xc7\x63\xbd\xd4\x6d\xb7\x75\x29\x19\xe9\x38\xde\x6d\x63\x6a"
+ "\xed\xe0\xd8\xee\x3e\x6e\x5b\xa7\xdc\xf7\xd7\xe4\x86\x23\xa4\xcb"
+ "\x0d\x1d\x8e\xc5\x20\x22\x16\x07\xfe\x15\x1f\xab\xe0\x3d\x12\x9e"
+ "\x2f\xa5\x3e\x02\x38\x03\x2e\xaa\x33\x70\x91\x92\x63\xb0\x4d\x1d"
+ "\x7b\xf8\x9b\x6f\x52\xa7\x75\x3f\xff\xff\x7a\x64\xd1\xaa\x59\xd1"
+ "\x30\x85\xf9\x58\x05\xc3\x65\x79\xc4\x3a\x49\x6e\xd8\xc4\x71\x68"
+ "\x2a\xb4\xf9\x05\x32\x78\x95\x4b\x6f\x2b\x70\x78\x44\x6f\xaf\xf6"
+ "\xcd\xb1\x23\xa8\xc7\x37\x33\xdc\xc5\xbe\xe0\x75\x6a\x3c\xd7\x48"
+ "\x79\x83\x77\xbb\x50\xb6\xc6\x47\xcf\xa7\x69\x3c\x54\x8f\xf2\xbb"
+ "\x6a\x8b\xb2\x91\x67\x55\xb3\xe6\xcf\xdc\x84\xf1\x3d\xde\x43\xfb"
+ "\x2b\x1a\xa2\xd6\x79\x8e\xab\x31\xfc\xbe\xeb\x14\xad\xb6\x46\xa5"
+ "\x6b\x63\x5b\x3b\x0b\xe9\x0d\x6a\xcd\xe4\x58\x8e\x2a\xbf\x5a\xf9"
+ "\xae\x6a\x6d\x64\x59\xc0\xe7\xf5\x98\xc7\x25\xee\xe5\x18\xaf\x9e"
+ "\xa5\xcf\x17\x80\xb5\x47\xe2\x7c\xb0\xa8\x61\x3c\xa9\x78\x1f\xcf"
+ "\x5f\x52\x78\x5a\xed\x88\xc1\x3d\xcf\x9b\xa8\x87\xf1\x34\x60\x9d"
+ "\x88\x0c\x08\x18\x44\xee\x2a\x13\x31\xbf\x30\x8f\xf3\xde\x20\xe8"
+ "\x43\xea\x55\x0a\x6f\xab\xf7\xea\x78\xd3\xc7\x8e\xf1\xe4\xa3\xd5"
+ "\x19\x8c\xdb\xd8\x3e\xf6\x6b\x3a\xa5\xf7\x1d\x38\xe5\x98\xa6\x78"
+ "\xae\xd7\xf8\xa2\xde\x33\x94\x7d\x47\x56\xfc\xa9\xd6\xf4\x6d\xaa"
+ "\x75\x8c\x25\x85\xdb\x35\x56\x1f\x15\x38\xa2\xec\x92\x23\x8c\x5f"
+ "\xe6\x15\xb4\xb3\x5c\x8b\xbd\x75\x44\xf9\x31\xad\xa8\x17\x25\xc7"
+ "\xca\x25\x2f\xaf\x90\x31\x52\x38\x6e\x6f\x13\xe3\x88\xe5\x22\xf3"
+ "\x12\xf3\x00\xf3\x93\xc2\xd1\x9a\x82\x28\x1c\xd5\x31\x7e\x34\x3c"
+ "\xed\x89\x93\xe5\x0b\x6d\x79\x13\x94\x2c\xb6\x65\x8c\x5c\x30\x46"
+ "\x06\xba\xb1\xdd\x37\xe9\x6e\xdb\xac\x09\x23\x1d\xf6\x51\x33\xd4"
+ "\x65\xd2\xac\x69\x7c\x4d\x89\xb5\xeb\x6c\xa8\xe7\x64\xac\x6d\xb8"
+ "\xce\xae\xe4\xc7\x9a\x80\xcf\x90\x2a\xfd\xd9\x39\xee\x6c\xe9\x12"
+ "\xa2\x30\xda\xbd\xe5\x0c\xc6\xd4\x7c\x6c\x2c\xc7\x39\x9e\xe9\x20"
+ "\x8e\x8b\xfe\x45\x35\xde\x55\x21\x7d\x40\x3e\x7f\x1f\xe1\xaf\x22"
+ "\x92\x7c\x6c\x2c\xaf\xd9\x88\x92\xfd\x41\x7f\x72\xc8\xea\x4f\xee"
+ "\xf2\xf9\x93\x9b\xcc\x93\x6f\x75\x8a\x0e\x77\xe1\x34\xbd\x5f\xbc"
+ "\xb6\x03\x3c\x8d\x9d\xe9\x10\x61\xc6\x51\xae\x83\x63\x91\x03\x76"
+ "\x12\xaf\xed\x14\xa2\xff\xf9\xbb\x95\xfd\x5a\x08\xfa\x5f\xa1\xe9"
+ "\x33\x34\x0b\xcf\xd0\xff\xbe\x2d\xd7\xb8\x22\x6e\xab\x8c\x61\x1e"
+ "\x59\x7f\xdb\x43\xa2\xa4\xcb\xa7\xc3\x04\xac\xbe\x9a\xdf\x83\x84"
+ "\xf7\x55\xfd\x6a\x23\x1b\xff\x98\x6d\x31\xa8\xb8\x90\xe0\x71\x57"
+ "\xb5\x31\x92\xd3\xed\x27\x83\x77\x03\xd6\xa5\xb1\x1f\x4d\x0e\x68"
+ "\xcf\xc5\x79\xf4\x77\xa5\xee\x88\xaf\xd4\x18\x09\x62\x1c\xd3\x94"
+ "\xfe\xdc\xc6\xf2\x13\xb6\xeb\xda\xf1\xfa\xbc\x26\xe7\x43\x23\xb9"
+ "\x94\x3d\xb3\xf6\x71\x2e\x77\xc1\x6d\x22\xc8\xec\xfa\x9b\xd2\xa5"
+ "\x8d\x12\x8c\xb8\x0d\xa4\x7c\x99\xd7\xde\xa1\xcb\x58\xde\x2f\xb5"
+ "\xac\x13\x7e\x5e\x23\xb6\x84\x84\x5f\xc6\xda\xe7\xb9\x83\xce\x90"
+ "\xb7\xb0\xc3\xe5\x95\xdf\xe0\xe4\xef\x8a\x04\xb4\x79\x23\xac\xe6"
+ "\x0d\xd4\xef\x4f\xba\x6d\x1e\xe6\x07\xc3\x19\x82\xae\x8b\xf6\x33"
+ "\x6e\x78\xaf\x25\x02\x5c\x79\x79\x9e\x64\xfc\xa4\xd4\xd7\xb1\x0f"
+ "\x0c\xf7\xd5\x12\x42\x9f\xa3\xfb\x65\x8c\xf8\xb6\xb8\xd1\x2f\x23"
+ "\xfa\xe5\x38\xcb\x3c\x13\x64\xdf\x24\xf0\xdb\x60\x19\xcf\x5a\xda"
+ "\xe7\x45\xb6\xe8\x3e\xb2\xfc\x57\x7d\x28\x9a\x98\xa8\x8f\xc2\xc8"
+ "\x7d\x64\x1c\x14\x5d\xa7\xf1\x9b\x6c\x27\xcb\x8f\x36\x5a\x7b\x7c"
+ "\xc0\x3a\xf6\x09\x3a\x36\x16\xf2\x6d\x12\x8f\x21\xe6\xcf\x32\x6e"
+ "\x67\xa2\xf1\x62\x78\x1a\x2c\x9f\x65\x9d\x6b\x1e\xda\xb2\x2b\x31"
+ "\xbe\x8b\x1a\xae\x8c\xef\xa2\x9f\x72\x79\x6e\x07\xef\xef\x58\x42"
+ "\x46\xc8\xe0\x2e\x1f\xec\xb5\xe2\x44\xf5\x0e\x58\xb7\x9d\xdb\x95"
+ "\xf0\x9d\x60\x7e\xd1\x64\x10\xe8\x50\x80\x4f\x04\xcb\xa4\x0e\xb7"
+ "\x73\x8a\x2e\x8f\x2c\x06\x5b\x92\x94\x0f\x46\x51\x96\x08\x86\x65"
+ "\x5d\x19\xef\x73\x4d\x42\xfd\x09\xdf\x47\xf8\xdb\x1d\xc5\xc7\x6c"
+ "\x91\xf5\xdf\xbc\xc9\x62\xa0\x7b\xfc\x49\xdf\x4c\xb1\x38\x42\x23"
+ "\x18\x87\x80\xe9\x00\x1f\x3f\xcc\x76\xaa\x5a\x1b\x71\x42\xff\x7f"
+ "\x59\xc6\x67\xf2\x27\x1f\xb3\xa9\x7d\x23\x27\xe6\xbf\x0a\x9b\xbe"
+ "\x36\x8f\xe7\x16\x1f\xfd\xdd\xae\xf8\xf2\x6b\x6f\x89\x8d\xde\xe3"
+ "\x11\xb7\x45\xd8\x56\x5b\xa0\x47\xba\xd6\x46\x04\x7f\xcf\xc1\x7b"
+ "\xbc\x87\x4e\x94\xbf\x94\x4e\x27\x1d\x6e\xd7\x88\xc4\x34\xe0\x9a"
+ "\x7c\x65\x1a\x70\x5d\xcf\xef\x19\xef\xca\x56\x71\xe5\xe9\x7a\x8a"
+ "\x58\xff\xb5\xb7\x6c\x45\xb2\x7e\x52\x75\x33\x4e\xb2\x78\xcf\x68"
+ "\x1a\xf0\xe2\x42\xde\x0a\x5d\x0e\x30\xbd\x58\xc2\xfc\xad\x0b\x92"
+ "\x34\x8d\x77\x98\x57\x0a\xcc\x6a\x1d\xbc\xa9\x4c\x7e\xbf\xd2\xbd"
+ "\xa6\xcc\xef\xb4\x6f\xe5\xef\xb4\x06\x92\x8f\x55\x22\x4f\xb3\x8f"
+ "\xea\xd4\x7e\xab\xf9\x58\x39\x60\x54\x94\x2b\x7f\x68\xb3\x8c\x17"
+ "\x05\x9e\xe6\x18\x51\xcc\xd7\x48\x4b\x47\xbb\x39\x5e\x14\xec\x9d"
+ "\x75\x69\xdd\xf3\x92\x3b\x0b\xb2\x42\x48\x5d\x0c\xf3\xd2\xb0\x76"
+ "\xe0\xee\x35\x63\x64\xe7\xa5\x31\x56\xe2\x3e\x5f\x5a\x3f\x74\xe7"
+ "\x4f\x6e\x27\xd3\xbf\x5a\x9f\xa4\xfc\x3b\x29\x7d\xdd\xb7\x4d\xf4"
+ "\xdf\xe3\xc8\xc8\x78\xf0\xd1\x3a\x9b\xc2\xdd\xba\x79\xfa\xf8\xf8"
+ "\xc8\x79\x44\xca\xce\xf5\x8f\xb5\xce\x0c\x89\x2f\xd4\x3a\xf7\x3a"
+ "\xc8\xbf\x67\x2b\xd4\xfb\x35\xad\xf1\x6b\x40\xac\xcf\xdb\x16\x2f"
+ "\xb7\x2d\x58\xba\x72\xc9\xf0\xe1\x31\xb6\x92\x49\x7d\x17\x77\x5d"
+ "\xb9\x9a\x4f\xd7\x1d\xd1\xdb\xcd\x7a\x09\x9e\xd1\xff\x35\x97\xc5"
+ "\xb2\x9f\x96\xab\xb9\xb9\xe7\x66\x52\xcf\xfd\x1d\x34\xed\x8e\xa8"
+ "\xc7\x6f\xd1\xb4\x3b\xbf\x95\xfb\xd0\xc2\xf9\x0b\x56\x45\xa5\xde"
+ "\x15\xbd\x6e\x58\xfa\x16\xea\x4e\x1a\x7a\x2f\x64\x85\x61\xc6\x1a"
+ "\x9e\x5b\xdc\x07\x8b\x42\xe2\x6f\x90\xd7\xe3\xc0\x63\xb9\x0d\x05"
+ "\x21\x6a\x80\x2c\x13\x5f\x63\x19\xde\x4f\x9d\xed\x84\x3e\x05\xda"
+ "\xb2\xa0\xef\x7e\xe8\x75\x17\x79\x7d\x06\xe5\x3e\x6b\xac\xe0\x98"
+ "\xce\x4d\x5a\xbc\x7a\x77\x25\xd2\xaf\xc5\xf5\x23\x5c\xfb\xe2\x7a"
+ "\xd4\xb6\x04\x76\x0f\xfb\xd2\xaf\x60\x5f\x7a\xf7\xfb\xd2\x1f\x28"
+ "\xe0\x22\xf6\x09\xc2\xfb\x39\xac\x83\xf8\x68\xbd\x89\xd7\xc1\x39"
+ "\x2f\xd2\xb6\xd9\x9e\xa6\x4c\xbe\x0a\xb9\x37\xe8\xae\x14\x25\x4d"
+ "\x69\x62\x6b\x0e\x7f\x6f\x6d\xc4\x69\x5a\x6f\x48\x32\x7c\x46\x49"
+ "\x56\x73\x6a\x87\x7b\x3d\xca\x2e\x99\xc3\x78\xea\xed\x5b\xb4\xf2"
+ "\x1b\xc0\x71\xfa\x61\x8f\x6e\xb8\x91\xa4\x7e\xab\xe9\x73\x55\x72"
+ "\x5e\x58\x3f\x27\x4a\xa7\xe3\xbd\xe9\x14\xa5\x9f\x88\xb0\xd2\x4f"
+ "\xd7\x17\xe8\x7c\x80\x7b\x97\x4e\xa7\x31\xf1\xf5\x96\x14\x2c\x5c"
+ "\xb6\x70\x81\x6d\xe4\xf2\x14\x8a\x8a\xae\x67\x5f\xb8\xc4\xb6\x6c"
+ "\xe1\x73\xcf\x2f\x5c\x2e\x23\xe3\xf1\xdb\x98\x39\x3f\x5d\xa4\x34"
+ "\x66\xeb\xe7\xbe\x6c\x43\x19\xbf\xeb\x3f\xe7\x98\x6c\x62\x63\x63"
+ "\x1d\xfb\xee\x48\x1d\x25\x75\x50\x4e\xac\xbd\xf1\x82\x8a\x3b\x51"
+ "\xdc\xa4\xd9\x3a\x2f\xc8\xef\x58\x9f\xa2\x0d\x65\x3d\xf1\xdf\x37"
+ "\x4c\x04\x2e\x8d\x1a\xde\x2e\x76\xb8\x37\x8c\xd3\xf1\xe6\xa3\x17"
+ "\x3c\x9a\x2e\xd5\x26\xe5\x07\xe6\x58\xc8\xbf\x98\xf9\x55\x7d\x83"
+ "\x76\x03\xc7\xe5\x48\x92\xeb\xc9\xc9\x4d\x26\xae\x8b\x61\xa2\x3e"
+ "\x0f\xc6\x07\xb8\xb5\xb1\x7c\x2b\xd6\xe1\xa1\xce\x0c\xae\x4f\xb3"
+ "\x83\x86\x9c\xa1\x17\xe4\x9a\x73\xa4\xb8\xc9\xc4\x32\x85\x63\x88"
+ "\x44\x4a\x00\x47\xee\xd1\xbe\xe0\x91\xeb\xb0\xfc\x0d\x02\xc0\xe2"
+ "\x75\x60\xc8\x86\x74\xfe\x5e\x31\xa7\xa9\xd8\x70\xeb\x37\xf1\xda"
+ "\xb3\x28\xf1\x02\xef\x1b\x82\x3d\x67\x1b\x5e\xf0\xb0\xde\xc9\x70"
+ "\x7d\xb4\xa1\x86\xe1\xa9\xd8\x77\x2f\x0c\x03\xed\x8c\xe8\xd1\x9f"
+ "\x5e\x98\x17\x65\x97\x71\x7b\x64\x3b\x03\x68\x8b\x8c\xb3\xaa\x7c"
+ "\x4d\x65\xbf\x59\x7e\x96\x6b\x7d\xd7\xfb\x03\x78\x90\x7f\xeb\xd3"
+ "\x74\xbf\x09\x9f\xd6\x6f\x6e\x1f\xb7\x3d\xba\xcd\x5a\x7b\x2b\xb8"
+ "\xbd\x28\xb7\x23\x8a\xb7\x79\x5d\xa6\x0f\xd2\xf6\xf6\xf8\xb0\x6f"
+ "\xa0\x78\xb9\xb1\x74\x89\x2d\x6f\xf1\x92\x67\x72\x57\xce\x7f\x66"
+ "\x61\xee\xf3\xf9\xa3\x6c\xcf\x2f\x79\x32\x6f\xe9\x53\xcf\x30\xd5"
+ "\x2c\x2f\x78\xfe\xa9\x67\x6c\x2c\x59\x72\xb3\xa7\x4d\xcb\xbd\xf7"
+ "\xe1\xd9\x8f\xa4\xd0\xbd\xf3\x91\x06\xcb\x7f\x5a\xe6\x28\xf5\xea"
+ "\xa1\xc9\x93\x7e\x98\x3b\x69\xe6\xc3\x33\xe6\xc8\x43\x2f\xdd\xef"
+ "\xb3\x97\x24\xce\x10\x43\x87\x69\xa2\xd8\x1b\xc2\xf8\xf6\x39\x45"
+ "\x25\xe3\x55\xbc\xf4\x17\xf3\x62\xe3\xa5\xbf\x88\x46\xbf\xb8\x1d"
+ "\xbf\x1a\xa2\x9f\xf8\xf1\x83\x74\x2f\xc9\x54\xf4\x95\xfc\x44\x87"
+ "\xfb\xc5\x8a\x1e\xfa\x2a\x91\x67\x29\xd9\x4f\x49\xad\xcf\xbe\x08"
+ "\xf9\xbf\x7e\x6f\xf4\xbb\x1e\x7b\xf2\xc5\xa6\x6e\x7b\xb2\x5b\xa6"
+ "\xbc\xd8\x6d\x5b\x22\xcd\x0c\xbb\x32\x99\xed\x4a\xb5\x9e\x54\x32"
+ "\x41\xd2\x54\xaf\xfc\x6d\x26\xdd\xae\x64\xde\x96\x7b\x52\xd2\xfe"
+ "\xf8\xc9\xb8\x68\x1e\x97\x6b\xfa\x1a\x8f\x73\x39\xb9\x7e\x97\x3a"
+ "\x28\x9b\xd7\xb4\xfd\xc9\x5e\xd6\x15\x30\x7f\x75\x08\xd1\x7f\x50"
+ "\xb6\x6a\xd3\x4f\x1c\xbc\xc6\xcd\x7a\xb3\x46\x4f\x03\xce\xd0\x4f"
+ "\x3e\x10\xee\x17\xea\x95\x4d\xf9\x42\x98\xe5\xba\x58\x3f\xf4\x5e"
+ "\xf6\x2d\x62\xdb\x09\x75\xee\xea\xa1\xd9\x92\xf1\x4c\x0b\x3d\xb6"
+ "\xec\x4f\x62\xe4\x7f\xbb\xfc\x2e\xe1\x4f\x4e\xea\xf1\x1e\x0a\x86"
+ "\x93\xd1\x34\xbc\x8c\xca\x8d\x02\xf2\xe6\x27\x9b\xb8\x0e\xc6\xa7"
+ "\x8f\x5e\xdc\x89\xbc\xa6\x1e\xfc\x15\xa7\x75\xe3\x4f\x5b\x67\xd1"
+ "\xd7\x58\x54\xbb\x4b\x26\xf4\x86\xab\xc4\x78\x2a\x9e\xf7\xa5\x78"
+ "\x72\x53\x1f\xe6\x49\x1d\x5f\x97\xe3\xaa\x78\xc7\xe5\xb8\x2a\xbe"
+ "\xd8\x83\xab\x17\x6f\xb8\x1c\x57\xc5\xcd\x51\xfb\x4a\xda\x3a\x4a"
+ "\xc9\x04\xc6\x19\xd3\x18\xfa\xbd\x09\x74\x56\xd1\x83\xbf\x12\xf3"
+ "\xe5\xf8\x2b\x19\x96\x18\x7f\xc5\x7c\xbe\x2a\x1a\x4e\x55\xa2\x79"
+ "\x63\xc0\x3a\xa3\x76\x1e\xac\xe4\x65\xfe\xd6\x3d\xb7\xe3\x55\x63"
+ "\xc4\xfe\xaa\x1b\x3f\x5c\xd9\x8e\xe8\xd1\xc5\x45\x50\xc3\x6f\x59"
+ "\x1d\x6c\x5e\x5e\x57\xba\xc2\x5c\x74\x52\x5f\xf3\xc0\x7d\x33\xdb"
+ "\xce\xfc\x4d\x28\x4e\x67\x7c\xf2\x37\xc6\x40\xef\xcd\x4a\x2f\x2d"
+ "\xe9\xfe\xfe\x47\xfb\xcd\x2b\xb6\x27\xad\x23\x5b\x6d\xe5\x9d\x9c"
+ "\x1e\x04\x0d\x4d\xe1\x74\xf6\xdd\xea\x0d\x66\x6e\x38\x8b\x12\xc3"
+ "\xdd\xd8\x4d\xff\xbd\x9d\x89\x8e\x93\x47\xf6\xf9\x4b\x16\x2c\x5d"
+ "\xb4\xe8\xcb\x45\x51\xf4\xbe\x5a\x99\x3b\xc2\xdf\xc1\xea\xdb\xb1"
+ "\xfe\xe9\xd5\xa8\x13\xfa\x7f\x7e\xab\x9a\x37\x37\x42\xfe\x2d\xae"
+ "\x53\xba\xe4\x63\xad\xea\x1c\xf8\x4b\xe9\x51\xf2\x19\x34\xf2\x92"
+ "\x4d\xb8\x37\xce\xed\x19\xe3\x8d\x6d\x97\x8f\xf1\x4b\x94\x78\x8c"
+ "\x5f\x1a\x11\x59\xc1\xe7\x70\x5e\x82\xfd\xb3\x4c\xea\x9a\xfc\xcc"
+ "\x7e\x10\xb0\x99\x5b\x61\x2f\xb7\xcd\x5c\xe5\xb9\x27\x77\x95\x41"
+ "\xee\x15\xf3\xb7\x57\x42\x97\x44\x0b\xfb\x22\xf0\xfe\x18\x7f\x7b"
+ "\x85\xbf\xb9\xc4\xdf\xff\x94\x79\x70\x5f\x7a\x9a\xa4\xed\x88\xf7"
+ "\xb6\xea\xd3\xf2\xfb\xd8\xd0\x15\x5e\x72\xe9\xba\xb5\x05\x2a\x23"
+ "\x9f\x4f\xdf\xa2\xc6\xa3\x99\xc7\x82\xeb\xcb\x5d\xe5\x51\x75\x5c"
+ "\xe2\xef\xaa\x91\x45\xe9\x10\x2f\xed\xbd\xe2\xda\x7d\x72\xa8\xb7"
+ "\x18\x68\x66\x61\x74\xf5\xeb\xde\xab\xd4\xbe\x43\xcc\xbc\xcf\xfe"
+ "\xa3\x1d\xee\x4d\x69\xf1\xfe\xa7\xca\x77\x68\x53\x86\xee\x93\x55"
+ "\x2a\x7d\xa0\xc8\xc2\xf2\x93\xed\x9c\xd3\xb4\x69\x5a\xb5\x9c\x2f"
+ "\x37\x4d\x8b\xde\xe3\xb4\xad\x5e\xd7\xf7\x1c\xbd\x74\xf1\x0a\xfb"
+ "\xa6\xa9\x3d\xbe\xaf\xae\x7e\x28\xbf\xa9\xdb\x47\xcc\xed\xea\x57"
+ "\x1d\xd5\x36\xbc\xdb\x19\xe5\xab\xe8\xe7\xf9\x98\xed\xc7\x6a\xf5"
+ "\x5d\x55\x3f\xda\xd0\x80\x34\xd8\x13\x9b\x65\x3c\xc2\x95\x21\x1a"
+ "\x96\xff\x7d\xfe\x66\xcf\xa6\x8b\x9a\x1d\xda\x66\x2b\xe2\xf6\x6c"
+ "\x7a\x8d\xe1\xfa\x90\x4f\xc8\xfd\x80\xcd\xd4\xdd\xe6\xa8\xfa\x74"
+ "\xd8\x0a\x27\x9b\x47\xe8\xed\xf2\xd1\x26\x19\x3f\x85\xbf\x73\x1d"
+ "\xdd\x27\xc7\xa2\xc5\xb9\xf9\xf6\x55\xb9\x8b\x97\x2c\x2e\x48\x21"
+ "\xc7\xfc\xe7\x17\x8f\x41\x92\xed\x29\xfb\xe2\xfc\xdc\xc5\x32\x5a"
+ "\xb1\x0c\x84\x5c\xb0\x2a\x9f\xf7\x3e\x2e\xdb\x83\x4f\x93\xba\xbc"
+ "\x71\xf3\x78\x35\xdf\x6f\x2e\xd7\xe9\x54\x7e\xfb\x5b\xe4\x50\x8f"
+ "\xef\x95\xfc\x66\x70\x12\xfa\x79\x98\x69\x58\xc5\xf7\xd9\xd2\xac"
+ "\xf4\x8b\xcd\xf5\x97\xfb\x64\x6d\xf6\xe9\x3e\x59\xa0\xef\x34\xe6"
+ "\xf5\x28\x58\xa0\xff\x2d\x74\x79\x99\x2d\xe9\xdd\xfe\x9d\xda\x77"
+ "\xc7\x79\xac\x64\xbc\xfb\x57\x58\xde\x6e\x7e\xc0\xeb\x98\xcc\x31"
+ "\x7b\x35\xbe\xda\x92\x1d\xd5\x5e\xe9\xcb\xcb\xb0\xf8\x9c\xd4\x98"
+ "\x60\xb4\x2f\xdb\x96\x8f\x30\xf7\x5a\xf5\x7a\x6c\x6b\x8c\x90\x77"
+ "\x5b\xde\x0c\x18\x3d\x49\xd2\xff\x18\xe5\x00\xab\x4c\xf7\xa3\xf1"
+ "\x75\xf7\x6b\xcb\x8e\xf8\x36\xa2\xed\xc3\x91\x5e\xd3\xe3\x27\xb8"
+ "\xc5\xc5\x30\x90\x86\xf9\xbf\x74\x54\x74\x5a\xf4\x38\x4d\x9c\x3c"
+ "\x0d\x0a\xf4\xf2\x85\x18\xa4\x49\xf3\xf3\xf2\x58\x06\xcd\x5f\x98"
+ "\xf7\xfc\xb2\xa5\xcb\xb5\xa1\x9b\xb8\x88\xc3\x50\xcb\x2c\x77\x6b"
+ "\x6f\x6c\x4b\x16\x2e\x5c\xa0\x92\xb4\x81\x8c\xdd\xb3\x52\x7e\x0c"
+ "\xa5\xb0\xff\x37\xd9\x7b\x74\xc5\xd2\xed\xc2\xb8\xa5\x05\xbf\xf3"
+ "\x52\xfe\xc8\x71\x2d\xcd\x8b\xb5\xd1\x4a\x0b\x75\xde\x97\xe3\xec"
+ "\x64\x9f\xb3\xa3\x2f\xb7\x0b\xb9\xc7\x83\x71\x2d\xfb\x13\xfa\xd9"
+ "\xc7\x47\x65\x7c\xe6\xcb\x10\x05\x67\x4f\x37\xbe\xd7\x3f\xd6\xbc"
+ "\x5e\xf9\x4c\x98\xf8\x9b\xb5\x1c\x53\x02\xef\x61\xff\xbf\x74\x52"
+ "\xc9\xc9\x52\x5f\xf7\xde\x8b\x31\x09\xf6\x66\x29\x68\x7f\x69\xe6"
+ "\xe5\xfc\x5d\x66\xbe\x9c\xef\xd9\xd7\xb2\xcc\xa6\xe3\x38\xea\x1b"
+ "\xf4\xa0\xbf\xb2\x83\xfa\x9a\x71\xb5\xf6\x4d\x04\xbe\xe7\xb2\x6c"
+ "\x57\x88\x01\xfd\xef\x61\xbf\x86\x53\x54\xb6\x49\xd1\x54\x99\x3d"
+ "\xca\x37\x30\xed\x0c\x95\x15\xab\xb1\x2d\x73\xe9\xfc\x87\x7e\x4a"
+ "\x5d\x8e\x61\xa8\x79\xbd\xb4\x8f\xa2\xaf\xb2\x1d\x3a\x6e\xd9\x86"
+ "\xc7\xf3\x9e\x1e\x3d\xa8\x74\x8e\xf4\x17\x51\x31\x35\xba\xb8\xff"
+ "\x80\x33\x56\x87\x83\xbc\xe8\xbf\xd9\xaf\xe3\x4a\xcf\x13\x4d\x13"
+ "\x93\xe6\xe7\xc3\xc0\x5e\xbc\x68\xd1\xc2\x65\xcb\xf5\x38\xe3\x19"
+ "\x4b\xf3\x16\xa8\xb8\xe2\x77\x63\xf8\x57\x82\x87\x27\x70\x68\x72"
+ "\xa4\xaa\xdb\x38\x7d\x77\x14\xaf\x89\x48\xff\x51\x69\x73\xbd\x76"
+ "\xb0\x4a\xb3\xbf\x4e\xd1\x2b\xb3\x94\xff\xd5\x2b\xd7\x2a\xdd\xf6"
+ "\x9a\xb7\x3b\xdc\x2f\x17\xe8\xba\x2d\xaf\xb5\xb6\xd3\x4d\x15\x7c"
+ "\x46\x8e\xcf\x12\x6c\x7b\x5d\xb4\xf0\xda\x2a\xf2\x54\xe8\xdf\xa2"
+ "\x63\xbd\x69\xf3\xeb\x2a\x86\xb6\x67\x09\xfb\x8a\xbc\xf6\x69\xa4"
+ "\xe4\x58\x9a\x48\xd9\x97\x05\xfd\x2c\x95\x79\xa2\x7f\x1b\xfb\xf0"
+ "\x72\xec\xab\x97\x5b\x58\xaf\x63\x59\xc6\xdf\x6b\x68\xa1\x97\xf7"
+ "\x40\x46\x43\xa6\xbf\xe6\xf3\x27\x1f\x4b\xdb\xb0\x9a\xcc\x5c\x07"
+ "\xe4\xb5\xaf\x6e\x3b\xe3\xf6\x15\x3a\x0c\x59\xa6\xc9\x6c\x1f\xd7"
+ "\xe3\xa3\x97\xeb\xb5\x75\xff\x11\xda\x3a\xeb\x08\xe4\x83\xfc\xef"
+ "\x5f\xa1\x68\x75\xff\x87\xb7\xb8\xc8\xc1\xdf\xa6\x54\x71\xab\x3e"
+ "\xde\x8b\x7e\xec\xe5\x6f\x40\x42\x17\x84\xbd\xf3\x72\x01\xfa\xb0"
+ "\x57\xf3\x01\x07\xad\xbc\xd2\xa0\x7c\xfb\x5f\x5e\xc0\x38\x00\xdc"
+ "\x4c\x0d\x6e\x26\xe0\x62\xfc\x6f\xd0\xe2\x65\xbf\xb2\x49\xaf\x03"
+ "\xf3\x9f\x1f\x7a\x73\x90\x75\x67\xb4\xdb\x8c\x5f\x6a\xa9\xdc\x4b"
+ "\xf7\x41\xee\x5b\x04\xfb\xae\xf5\x7c\x6f\xef\x95\x3a\x7d\x2e\xe4"
+ "\xba\xb5\xb6\x8f\xe2\xb5\x3e\x5e\xe7\xd3\xea\x62\x79\x6f\xd0\x61"
+ "\xe2\xd9\x1c\xb9\x74\x76\x3b\x60\x9a\x31\xaf\xfb\xb5\xef\xac\xa5"
+ "\x96\x5e\x60\x3f\x47\x1f\xe6\xed\xaf\x8b\xdc\x50\x1a\xef\x41\xf5"
+ "\xd7\xbf\x63\x57\x7d\x81\xf1\xf5\x6a\x66\xcf\xde\x12\xca\x03\xff"
+ "\xe0\x07\x57\x0b\xbd\x3a\x95\xeb\x65\x5e\xe0\xb1\xec\xc4\xd8\x60"
+ "\x7c\xa6\x88\x4b\x67\x77\xdb\x96\x50\xff\xd3\xf4\xea\xb3\x3c\x46"
+ "\xbc\x1f\xcc\xfe\x87\x48\xb3\x70\xdc\xfd\x53\xf4\xea\x23\x3c\x3e"
+ "\xdc\x16\xe0\xd0\x1a\xea\xc8\xb9\x9f\xcf\x5c\xb3\xcc\x5c\x5b\x08"
+ "\x9d\x7b\x11\xcb\x92\xf2\x4f\xd9\x86\xe7\xef\x25\xf1\xbd\x73\x81"
+ "\x88\xc8\xf1\x5d\xcd\xe3\x5b\xfe\xe9\xda\x56\x11\xf9\xc2\x4d\xe2"
+ "\x48\x80\xe8\x0b\x23\x85\x82\x46\x03\xb7\xdb\xe8\x3c\xcb\xe7\xc2"
+ "\xb7\x93\xd7\x51\xcc\xbe\x6c\xe6\x2d\xab\x29\x8d\xcf\xd4\xf3\xb7"
+ "\x80\x1a\x03\x95\xd4\x98\x5f\x49\xc7\x42\xe5\xe4\x59\xc1\xf1\x51"
+ "\x5e\xdb\xf0\x47\x47\x39\xef\xb1\x25\xe3\x7e\xb2\xed\x87\xb2\xae"
+ "\x61\x7f\x3c\xfe\x67\xfa\xa3\xe7\xcf\x64\x7b\x54\x3e\x8f\xaa\xcf"
+ "\x39\x46\xf5\x59\xc7\xc8\xd9\x22\x22\x6c\xd7\x15\x3d\xcb\x75\x14"
+ "\x03\xd6\x76\x3e\x7f\x9e\x16\x69\xb7\xa6\xa0\xff\x26\xde\x3f\x68"
+ "\x0c\xf8\xc9\xb3\x64\x3f\xb7\xf1\x57\x55\x17\xc8\xec\x59\xf2\x07"
+ "\x79\xaf\xec\xad\xb3\xdb\xbd\x0b\x9a\x59\xa7\x0c\xf1\xd9\x7b\xde"
+ "\x93\x84\x8d\x11\x29\xe5\x36\x86\x55\xbb\x81\x2f\x93\x5e\x1e\x3a"
+ "\xa7\x5e\x5e\xc6\x8a\xdb\xc6\xf8\x40\x9b\x1a\xe6\x28\x9c\xd4\x63"
+ "\xa6\xd0\xda\xfc\xa9\x33\x27\x1a\x3f\xaf\xd6\x33\x7e\x38\x66\x6b"
+ "\x04\xe3\x85\xb6\x65\x01\x07\x11\xbd\x0e\xb4\xd9\xac\xad\xe1\x9a"
+ "\xb7\x5c\xa0\x54\xcf\x12\xfe\x16\xdc\x6b\x77\x58\x66\x99\x40\x1f"
+ "\xe7\x76\x97\x5e\x24\x13\x8f\x1b\xef\xdb\x94\xca\xf7\x0c\xf3\xb5"
+ "\x74\x1e\x33\x7f\xf2\x51\x17\x7e\x1b\xf0\x2b\x66\xba\xc3\x75\x13"
+ "\xc6\xab\x18\x6d\xd8\x85\xb1\xda\xce\x57\x45\x8b\xfb\xf7\x72\x5c"
+ "\x12\xcd\x86\xea\x49\x07\x1f\x85\x84\xfc\xde\x32\x78\xa6\x7c\x57"
+ "\x04\x7c\xc4\x6b\x38\x55\xaf\x50\x6a\xc4\x5d\x16\xdc\x06\x59\x57"
+ "\xf9\x8a\x3c\x97\x9c\xc6\xeb\x9a\x6f\xc9\x6f\x6b\xbc\xb6\x5b\x97"
+ "\x7d\x1b\x07\xf3\xd9\xcd\xf2\x93\x46\x5e\xf7\x29\x3e\x96\xa1\xd1"
+ "\x79\x06\xf2\x40\xfe\x0f\xd1\xe6\xd0\x57\xa4\x7d\xc1\xbc\xdf\x9b"
+ "\x3d\x01\x5d\xb6\x5e\x6c\xcd\x21\xde\xff\x49\x5d\x27\xfc\xa9\x2d"
+ "\x16\xd1\x18\xa8\x97\x67\x76\x1b\x03\x61\xb9\xff\x83\xf7\x86\x19"
+ "\x01\xbf\x05\xba\x6f\x13\xe3\x4e\x4f\xe7\xbd\x23\x5e\x57\x9b\x11"
+ "\x10\xfe\x99\xab\x2c\xfc\x2d\xcc\x61\x72\xef\x40\x4b\x6f\xb4\xc2"
+ "\x6e\x58\xe5\xb7\xa0\xef\xa1\x6e\x58\xed\x39\x49\xcc\x6f\xc8\x9b"
+ "\xde\x9d\xb7\x3d\xc7\xc4\xdf\x76\xe6\x3a\xa3\xd2\xfa\xcc\x74\xa0"
+ "\x2c\x8f\x95\x96\xa6\x74\xe6\xd7\xf7\x74\xdb\x94\x7c\x7e\xa1\x1d"
+ "\xf3\xe6\xf2\x1c\x43\xa4\x3d\xc7\x18\x06\x6c\xd0\x7e\x9a\xfc\x26"
+ "\x67\xc8\xaf\x7d\xe3\xaa\x15\xfc\xdb\x4c\x62\xf3\x90\x79\xc8\x67"
+ "\x62\xb8\x1c\x0b\x82\xbf\x0d\x22\xfa\x5f\x9f\xf8\xdb\xcf\x9b\x0c"
+ "\x56\x4f\xd1\xa3\xa0\xa7\x37\x6a\x98\x9f\xc3\xe6\x3f\x8e\xb5\x3d"
+ "\xcd\x3a\xcc\x1b\xd2\x37\x20\x0c\x1e\x0b\x27\xff\x71\xec\x98\x56"
+ "\x32\x14\x81\x6e\xd5\x1a\xd4\x1b\x0f\x7b\xc1\x83\xce\x88\x80\x1e"
+ "\xfa\xc6\x14\xa6\x1b\x4b\x1b\xfb\xca\xfd\x71\x9c\xf4\x4f\x4b\x09"
+ "\xa7\x79\x83\xad\x54\xef\xfa\x0b\xd5\x87\xbc\xae\x9a\x0b\x7e\x93"
+ "\xf2\x53\x33\x31\xdc\xc5\xfc\xce\x09\x5a\xcd\x0d\x6f\xa7\xde\xf6"
+ "\x06\xd8\x3e\xc6\x1c\xf6\x57\x65\x2b\xbe\x51\xa3\xdb\xc5\x57\xee"
+ "\x43\x45\x3a\xc7\xcf\x10\xc2\x4a\x91\x8d\xff\xc1\xb1\xf2\x9d\xa2"
+ "\x23\x83\xc6\xac\xe6\x35\xb9\x37\xda\x60\xa3\x64\x69\x70\xcf\x2b"
+ "\xb8\xc8\x7f\x05\xb8\x4c\x33\xf5\x15\x72\x5f\x0a\x7d\xfa\x0f\x0a"
+ "\x03\x76\x38\xe5\x3f\xb2\x20\xe3\x9d\xce\x2f\x78\xcd\xf6\xcd\x47"
+ "\x50\x0f\x35\x86\x9a\x88\xe3\xf0\x54\x45\x30\x3f\x9e\xb7\x92\xe6"
+ "\x93\xe7\x3c\x47\x15\x93\x23\x22\x23\x0d\xf6\x3a\xef\xc7\x38\x59"
+ "\xc6\xf1\x5a\x40\x51\x98\xfa\x7a\x31\x33\x72\xec\x08\xc0\x98\xfe"
+ "\x11\xef\x7d\x41\x4e\x84\x85\xd5\x78\xf0\x12\x66\x7a\xc8\x4e\x19"
+ "\x4b\x62\xfd\xd7\xde\x1a\xb0\x8e\xee\x11\x46\x8b\xf4\xe9\x8c\x94"
+ "\x74\x59\x31\xb6\x76\xd9\x9e\x8d\xc7\xc6\x45\xf9\xff\x25\xa1\x2e"
+ "\xe9\xff\x27\xcc\x47\x43\x95\x72\xdd\xf1\x8f\x63\x3b\xdc\x15\x01"
+ "\x1f\xbd\x21\xd7\x5f\x37\xf1\x19\x0f\x29\x63\xdf\x9c\xef\x4f\xfe"
+ "\xc4\xc7\x30\xf8\x2c\x6b\x64\x45\x78\x77\xe9\x3f\xa4\x7e\xcd\xef"
+ "\x26\x36\xb6\x75\x78\x44\xf1\x27\x3e\x3e\xc7\xa8\xc1\xb6\x9c\xa3"
+ "\x37\xaf\x15\x25\x9f\x40\xbf\x78\x73\x9e\x1a\x1b\x79\x3f\x8a\xdf"
+ "\x87\xba\x32\xa0\x57\x57\xec\xac\xec\xe4\xbd\x80\x8a\x39\xc2\xfd"
+ "\x75\x4f\xbb\xf9\x13\xdf\x6c\x2b\xeb\x54\x6f\x16\xf8\x0c\xb5\xc5"
+ "\xda\x3a\xa0\x8c\x8b\xd1\x9b\x8d\x24\xb6\x5a\x53\xbc\x00\x02\x7b"
+ "\x36\xfd\x0c\x6d\xfd\xbc\xd3\x4d\xc6\x2e\xe8\x82\x9d\x46\xe2\xf5"
+ "\xec\xd4\x2d\x43\x29\x13\xef\x86\x9e\xa1\x37\x8f\x86\x8c\x94\x8e"
+ "\x5f\x9a\xff\x6b\xf6\x64\xc0\xcd\xe2\x35\xd2\x86\x0b\xbc\xc6\xf5"
+ "\x96\x3c\xa7\x5c\xfa\x16\x8d\x88\x00\x1e\xef\xf7\x94\x0e\xa5\x11"
+ "\xbc\x4e\x89\xb4\x8c\xdc\xb0\xda\xf7\xd4\xd7\x22\xd6\x0f\xa5\x51"
+ "\xb1\xf5\xbe\xb9\x5b\xad\x63\x6e\x6d\x91\xb6\x95\x9f\x6e\x84\x6d"
+ "\x75\x0a\x70\x77\x08\x77\x92\x10\x5f\xb3\x1a\x95\x6f\xc2\x5b\x9b"
+ "\x2d\x15\x8a\xee\xe4\x3e\x1f\xe8\x8d\xf7\x51\xb5\x3d\x25\x83\x8c"
+ "\x07\x92\xe2\xad\xe3\xef\x50\x47\xad\x13\xa7\xc9\x76\x68\x67\xf8"
+ "\xc3\xeb\x6f\xe3\xd8\x60\xf2\xec\x7e\xee\x7c\xb5\x1f\xc5\xe7\xfb"
+ "\x7d\xf4\x96\x8c\xc7\xb8\xe9\x2d\x4a\x7d\xe9\x2d\x4a\x6b\x58\x24"
+ "\xfb\x55\xa3\x78\xd1\x44\xdc\xde\x48\x31\xf3\x19\x68\x02\xed\xe6"
+ "\xfa\x98\x36\x1a\x43\xe7\x3d\xce\x02\x11\xf1\x3c\xcd\xba\xe8\x5b"
+ "\x61\xcf\xb2\x5d\x34\xb3\x25\xa4\xce\xa2\xce\x25\x7f\x35\xe0\x55"
+ "\x0f\xa5\xb4\xd3\xb4\x35\xd9\x9b\x47\xbc\x5f\x71\x93\x67\xd9\x1e"
+ "\xc0\xde\x7a\x03\xcf\x05\x9b\x81\x1f\x35\x27\x6c\x6d\xf2\x06\x9b"
+ "\xa9\x01\xfc\x3d\x23\x5f\x48\x38\xc8\xf3\xb0\xec\xef\x56\xab\x2d"
+ "\x57\xc5\x60\x90\x7d\xed\xde\xe7\xd3\xfa\xe1\xbd\x20\xe1\xd9\xbd"
+ "\xa0\x12\xbd\x4f\x3a\xae\x15\x7d\x6d\x7d\xc7\xb3\x6c\x07\xf1\xf8"
+ "\x70\x7e\x3c\x97\x7b\xdb\x90\xf7\x6c\xec\xb8\x70\x1e\xbc\xfb\x08"
+ "\x70\xbf\xd3\xb3\x57\xcd\x7b\xa8\x3d\x79\x2a\xdf\xe2\xf3\x68\x6f"
+ "\x99\xb7\x02\x47\x6a\x6d\x7f\xeb\x1d\xdc\x56\x8c\x5d\xa6\xb7\xe0"
+ "\x2f\x89\x7d\x52\xc1\xfb\xa0\xfb\x75\x8d\x72\xcf\xae\x72\xf8\x8c"
+ "\x50\x44\x28\x79\x56\x79\x3c\x02\x39\xe0\xc3\x95\x65\x81\x94\x27"
+ "\xb7\xb3\x1f\x50\xe5\x09\x8b\x41\x8d\x2f\xf7\x85\xf5\x95\x44\x63"
+ "\x1c\xb5\x9f\x98\xc6\x6d\xd5\xc7\x98\xbf\xe1\x18\xe1\x3d\x61\xf6"
+ "\xb7\xef\xb2\x92\xa2\x3f\x51\x06\xb8\x1f\x69\xba\x9b\x43\x9b\xcb"
+ "\x1c\xed\xc9\x7f\xcc\xe2\xf3\x91\xba\x6f\x30\xf8\x77\x7c\xae\xf2"
+ "\xe7\xb6\xb2\x8c\xaa\x36\x0a\x8d\x36\x2b\x8f\x6b\x65\x0b\x94\x4f"
+ "\x46\x65\x39\xca\x17\x24\xec\x6f\x12\xe4\x8e\x1b\x62\x1a\xfd\x61"
+ "\x3d\x52\x40\x56\x61\x3e\xe8\xeb\x0d\x74\x6a\xdf\xcf\xdc\xf6\x20"
+ "\x74\xea\xbe\x7c\x3e\x4a\x6f\xdb\xd5\xed\xfd\x6d\x1b\xa6\x6c\x9b"
+ "\x6d\x73\xf5\xb5\x25\x61\x06\x8e\xdd\x16\xc1\x67\x25\xf9\xbc\x4b"
+ "\xa0\xbf\xc1\xe6\xef\x3f\x68\x96\xe2\x9b\x6d\x1b\x44\xb2\x92\xb7"
+ "\xb9\x41\x72\x71\xbf\x78\x6f\x17\x76\x53\x5f\xee\x33\xe0\xc0\xfe"
+ "\xc9\x1f\xaf\xe6\x73\x05\xbb\xd7\xb5\x1d\xbd\x6f\xe8\x93\xec\x1b"
+ "\xfa\x28\xfb\xa6\x7d\x5f\xea\x34\x55\x0d\x97\xeb\xe5\x57\xd7\x1f"
+ "\x15\x5f\x66\x93\xc1\xc6\xdf\xce\x3d\x4d\xd5\xfb\xe4\x19\x18\x8c"
+ "\x89\xda\x07\xa9\x2a\x10\x29\x2f\xa5\x5c\x1d\xcc\xaa\x2c\x05\x73"
+ "\xd0\xac\xd7\x38\x16\xa5\xf6\x8d\x3a\xc0\xfe\xa9\xd8\x3c\x68\x96"
+ "\x3c\x63\x88\xfa\xf8\x1b\x9f\x3d\x72\xa8\x7a\x04\x8f\xd5\xed\xbb"
+ "\x28\x4b\xd1\x61\xf5\xf5\xbc\xd6\xac\xec\xbc\xaa\x23\x90\xbd\x9b"
+ "\x94\x4d\xa5\xfb\x91\x1b\xa4\x1f\x79\xb4\x8c\xbd\xca\x36\x4a\x79"
+ "\x27\x52\x3a\x3d\xb8\xdf\x2b\xcf\x4a\xa2\xbd\x2b\x43\xba\xfc\xab"
+ "\xda\xcb\x3e\x49\xdd\xfe\x00\xab\x40\x2b\x45\xea\x1c\x79\x87\xbb"
+ "\x3a\x47\xd7\x51\xe4\x37\xc9\xdc\xe2\x08\xe7\x9b\xb9\xea\xbc\xf4"
+ "\x17\x28\x95\x31\x0f\xce\x68\xe7\xec\xaa\x9f\xd5\xd6\x35\x32\xd8"
+ "\x87\x1f\x65\xcb\x7d\x74\x58\x9e\x09\x64\x1c\x70\xdd\xb2\xed\xf2"
+ "\xbb\x60\xd5\xbb\x7b\xf6\x7d\xaa\xe4\x77\xd3\x95\x5f\x6b\xf5\x11"
+ "\x9d\x46\xd0\xdf\xbe\x2a\x36\x68\xd5\x1d\xb5\xa3\x48\xd2\x40\xbb"
+ "\xb0\xa6\x7c\xa3\x92\x69\xb2\xda\x1f\x8d\xa7\x99\xa1\x88\x53\xc9"
+ "\xa0\xaa\x66\x21\x79\xbd\xaa\xf9\xcb\xf5\x89\xed\x93\x75\x5d\x44"
+ "\xe1\x39\x0d\xf2\xe5\xed\x34\x89\xeb\xe2\xfd\x39\x1c\xa3\x65\x4d"
+ "\x11\xc7\x9c\xfa\x69\x1f\x8e\xed\x15\x2a\xde\xef\x08\xf3\x99\x4c"
+ "\xcc\xb3\x91\xe2\xfd\xc5\xa7\xf3\xc9\x98\x9b\xcf\x7b\x5d\x9f\xec"
+ "\x66\xfb\x4a\x38\xa1\x0b\xa4\x40\x3f\x01\x9f\xaf\x5d\x4c\x96\xc7"
+ "\xed\x80\xed\xcc\x48\xe7\xd8\x5b\x1c\x77\x8b\x63\xe7\x85\x9d\x19"
+ "\x03\x71\x3f\x18\xfa\x5c\x9a\x30\xef\xb7\xb3\xbf\x4c\xd8\x2d\x20"
+ "\x8f\x4f\x72\xfc\x2f\xa3\xd7\x1f\xa4\xb5\x67\xc9\xcc\xb1\xbd\x42"
+ "\x25\x9f\x1c\x69\x0c\x7c\x2a\x6d\x8b\x01\xf9\xd0\xa7\x23\xf2\x5c"
+ "\x8e\x35\x92\xfc\xc9\x6e\xcc\xf1\x7b\x54\xbf\xcf\x0b\xd5\x6f\xd5"
+ "\x6e\x6e\xbf\x94\x71\xc5\x35\xc5\x45\xb2\xed\xff\xf2\xf3\x10\xe0"
+ "\x47\x8a\x0f\x6f\x08\x17\x1f\x76\xa9\xb3\x9c\xf5\x54\x54\x20\x5a"
+ "\xbd\xd0\x8d\xd9\x7f\x93\xcf\xeb\xb2\x3f\x0e\xf7\x91\xfb\xc7\x75"
+ "\xff\xf1\xc2\x59\x19\xab\x2c\x84\x67\x67\x9e\x56\xa6\x0d\x65\xda"
+ "\xea\xa9\xb3\xf8\xb0\xec\x7b\x63\x40\x95\xcd\x95\xf7\x5c\x3e\x0a"
+ "\x0f\x5a\x9f\xbb\xf1\x80\xbe\x73\xff\xb8\xff\x21\xc6\x09\x70\xa0"
+ "\xf5\xd5\xda\xa5\xf5\x93\xfb\x78\x0c\xb3\xce\x5b\xe8\x27\xfa\x2a"
+ "\xfb\xd9\x85\x7e\x1e\xb1\x13\x05\xb7\x18\x32\xbf\x48\x39\xec\x62"
+ "\xfb\xd0\xf9\x27\xe8\xd1\x85\x65\x04\x3b\xd0\xf4\xab\xa2\x32\xe3"
+ "\x46\xe8\x26\x45\x7e\xd8\x83\x7e\xd1\xca\xfa\xbe\x37\x1f\xbf\x50"
+ "\xa5\xfc\xee\xb0\xd4\x8f\xf9\x1b\xb1\xcf\xa1\x4f\x91\xcf\xa9\xa8"
+ "\x55\xb4\x42\x37\x0d\x7a\x43\xc8\x63\x47\xff\x61\x3f\x9e\xd6\xda"
+ "\xcf\x79\xd7\xfe\x43\xf5\xcb\x92\x47\xe9\x87\x1e\x2d\x36\x7a\x9b"
+ "\x8b\x49\xef\xcb\x13\xc8\x87\xfe\x58\x01\xab\xbf\xfc\x2e\x03\xfa"
+ "\xb9\x15\xed\x0c\x46\xf5\xa9\xa1\x2d\x08\x98\x27\x28\x65\x16\x19"
+ "\xde\x3a\x87\x7e\x9c\x23\x6b\x59\x11\xf4\xaf\x87\x58\x5f\xfc\xe9"
+ "\x67\xd7\xe4\xd0\x08\x1f\x6d\x6f\x55\x74\x27\xe3\x06\x5d\x77\x86"
+ "\xde\x4e\xee\x8e\x0d\xc4\xf1\xd6\x92\x3f\xa9\x67\x3a\x92\x31\x82"
+ "\x78\xce\xe8\x00\xcd\xb0\x2f\xcd\x4a\xd4\xd1\x91\x31\x58\xb6\xc7"
+ "\x3d\x96\xf0\x9c\x8a\x67\xd6\x83\xd3\x79\x4d\x00\xe5\x8e\x08\xe0"
+ "\x8c\xe1\x43\x9f\xdb\xc3\x57\xc6\x61\xc2\xb3\x26\xbf\xa6\x71\xa8"
+ "\x63\x1c\xdb\xbe\xbb\x8b\xfc\xc6\x17\x7e\x4d\xa3\xae\x4e\xa6\xbc"
+ "\x3d\xae\x37\xf9\xcd\xfb\x16\x0c\x0f\x7d\x1b\x78\x86\x76\xdc\x10"
+ "\xcb\x63\x36\x29\xcb\x94\x1c\x7c\xbb\x85\xf7\x0a\xae\xb2\x5e\x29"
+ "\xff\xd8\xe7\xe9\x2a\xcb\xb5\xea\xed\xc0\xfd\x8e\xde\xda\x7e\xf5"
+ "\x78\xd8\x91\xd5\x1b\xac\xcd\xaf\xcb\x78\x71\xce\x2d\xaf\x43\x5e"
+ "\x40\x57\xa8\xb5\x72\x0c\x6f\xcc\x9d\x3b\x02\xb4\x7c\x1b\x99\x9d"
+ "\x67\x79\x4d\x66\x3a\xd5\x56\x66\x52\x15\x6c\x72\xd1\x9e\x31\xf0"
+ "\xd5\x0b\xec\xfb\xa0\x64\x08\xeb\xa4\x7c\x96\x52\x2c\xcf\x48\x2b"
+ "\x7d\x5d\xd7\xe1\xdf\x49\x2e\xbc\x48\x46\xf5\x8d\x94\x77\xcc\xd9"
+ "\x36\x11\x2a\x37\x46\xec\x95\x1c\xf3\x2a\xa5\x6b\x1e\xc7\xbc\xd2"
+ "\xe3\x48\x49\xdd\xc7\x01\x9e\x6b\xb7\xa6\x6c\x5e\x46\xa3\x38\xf6"
+ "\x9d\xc5\xaf\x74\x39\x35\x5f\xbf\x33\x0e\xed\x4b\xd3\xf6\xfb\xd3"
+ "\x54\x6c\xa9\xb7\x5d\xd5\x17\x50\x97\x7a\xbf\x38\x0c\x1b\x46\xc2"
+ "\x5d\x46\x23\x2a\x2f\x50\x06\xeb\x41\xb9\x9f\x2b\x9d\x8d\xed\xc2"
+ "\xe9\x6d\x16\x11\xfe\xef\x0c\xda\x76\xa6\x27\x36\x9e\x7f\x39\xc7"
+ "\xd3\x13\x09\xcf\x55\xa9\xf5\x77\xe9\xf3\x23\xe3\xb1\xa8\x6f\xe8"
+ "\x11\x95\xbf\x42\x26\xfe\x66\x2c\xaf\xe5\xf1\xda\x30\x9f\xfb\x51"
+ "\x73\xc8\x3b\xcd\x7a\xcc\xb0\x5e\xf7\x11\x8b\x95\xbd\x13\xe9\x0b"
+ "\xfb\xcb\xdf\xe1\xf1\xac\xe0\x39\xe3\x5d\x1b\x9f\x35\xea\xb1\x71"
+ "\xde\x35\xf0\x3b\x4e\x63\x5f\xf8\x2c\x89\xcb\x77\xa7\xb0\xdd\xa3"
+ "\xd9\x8c\x87\x6c\xdd\x69\x4a\x87\xe1\xb9\x8c\xdb\x50\xad\xd6\x91"
+ "\x07\x74\xb8\xdf\x5d\xa0\xcf\x67\x3c\xaf\xab\xef\xd5\xbe\xeb\xf0"
+ "\x19\x3e\xea\x75\xff\x4a\x5f\x57\x97\x7e\x6e\x1c\x0b\xcc\xfd\xee"
+ "\x4e\x7d\x7e\x93\xdf\x23\x59\x3f\xf4\xde\xe5\xab\x68\xd8\xec\xeb"
+ "\xcd\x32\xf6\x06\x7f\x77\x54\xcd\xbb\xef\x36\xf5\xec\xa7\x65\x49"
+ "\x7c\xcb\x6f\x0d\xb2\x8d\x61\xc4\x1c\xac\xe2\xdf\xb5\xa9\xf9\x57"
+ "\x3f\xe7\xfe\xee\xd9\x9e\x7a\x7e\x96\xd6\x3d\x8f\xa2\x0e\xf6\xeb"
+ "\x60\xf8\x4a\x37\x79\x97\x7d\x68\x78\xef\x2b\x4b\xcd\xaf\xef\xd6"
+ "\x5d\x41\x17\xcb\x60\xfc\x46\x34\x7b\xd2\xdb\xf6\x37\x85\x5f\x07"
+ "\x25\x8d\x29\x27\xeb\xa1\x22\x9f\x69\x80\x8a\xe3\x64\x39\x45\x3f"
+ "\x9b\xcf\xef\x99\xd6\x3d\xb7\xf3\x5a\xdc\xcf\x0e\x7a\x79\xde\xee"
+ "\xca\x49\x9d\xc1\xb6\xbe\xd4\xc5\x7f\xb6\x6b\x34\xca\x21\x6d\xe0"
+ "\xef\xcf\x05\x4d\xa5\xab\x69\x14\x7f\xd3\x13\xe9\x72\x9d\xc0\x3f"
+ "\xe4\x99\x8e\x6f\xa4\x93\xf5\x1b\xe5\x7c\x1e\xe0\x67\xc7\x61\x5f"
+ "\x86\xe4\x3a\x2a\xd7\xbf\x65\x88\x8b\x63\xff\xbd\xd7\xe9\xeb\xa3"
+ "\xc6\x6a\xe7\x73\x78\xce\x88\x7a\xee\xaf\xaf\xe5\xfb\x68\x67\xbe"
+ "\xdc\xbb\x64\x9f\xe7\x25\x3c\x5f\xb3\xad\xa4\xfb\x09\xed\x7c\x4e"
+ "\xb5\x65\xe7\x73\xb5\xf9\xc4\x6b\xd5\xc7\xab\x64\x1c\xaf\x9d\xd9"
+ "\x3e\x7a\x77\x83\xb6\x1e\xd3\x24\xe9\x8a\xf5\xdd\x17\xd9\x06\xfb"
+ "\x9b\x67\x33\xf2\xf1\x3c\x91\xeb\xa0\x2c\xa5\xc3\x87\x38\xee\xa5"
+ "\x2f\xaa\xff\x9f\xf2\x5a\x5f\x42\x99\xf8\x16\x91\x2c\x53\xd2\x35"
+ "\x4b\xfa\x9c\x6d\xbe\xde\x87\xab\x59\x94\x84\xd9\x5e\x4a\x05\xcd"
+ "\xa5\xe1\xca\x73\x38\xe7\x4d\x17\x9b\x87\x78\x98\x2e\x61\xc3\x5a"
+ "\x61\x27\x98\xdb\x93\xbb\xa6\xf4\x76\x56\x91\x71\xe3\xdd\xf0\x43"
+ "\x52\x3e\xb4\x3f\x9f\xd3\xe0\x87\x7e\xb6\x8d\x68\x79\x48\x74\xda"
+ "\x6e\xe4\x33\x41\x3f\x9f\xe3\xdc\xc6\xbe\x2b\x3f\xcf\x88\xf5\x5d"
+ "\xf9\xf9\x14\xfc\x8a\xf1\x3b\x49\xf4\x8b\x54\x5c\xe7\xf4\xfc\x7e"
+ "\x31\xa5\xc3\xfd\xf3\x39\xc0\xa3\xd4\xb1\xae\x4e\x26\x72\x79\x8c"
+ "\x03\xdb\x45\xc9\x7f\xf1\xab\xfe\x0e\xca\xc4\xb3\x59\xf4\x1f\x92"
+ "\xaf\xf5\xd7\x86\xe7\x34\x9b\x13\xf3\x5a\x32\x70\x32\x14\x7d\xee"
+ "\x7f\xbd\x8f\xfb\xcb\xed\x6d\x4f\x0e\x53\xf4\x39\x4d\x86\xc9\xfd"
+ "\xf7\x27\xa3\x1c\x70\x29\x6e\x5e\xb1\x5d\xc7\xa7\x86\x27\xde\x37"
+ "\x32\xb6\x03\x86\xd2\x83\x90\x1f\x30\xf4\xfc\xdd\xb8\x1f\xca\xdf"
+ "\xd7\xc0\x98\x22\x1f\x6c\x62\xb3\x7e\x06\xb4\xc3\xfd\x8b\xac\xc3"
+ "\x79\x6a\xff\x80\xcb\x06\xa2\xca\x72\xcc\x8b\x44\xe5\x51\xa7\x2c"
+ "\xcf\x6d\x3d\x4d\x3f\x7f\x58\xd5\xfb\x8b\xb1\xbd\xf1\x52\xd1\x70"
+ "\xe8\x77\x95\x3e\x8e\x8b\xc1\xfa\xd0\x78\xef\xb0\x00\x79\x2b\x23"
+ "\x98\xf3\x43\x99\x59\x45\xc2\x73\x9a\x7e\x71\xb1\x31\xd8\x7a\x95"
+ "\xf3\xe1\x2f\xa4\x4f\x96\xe8\x74\x91\xb7\xf0\x4e\xf9\x2d\xeb\x73"
+ "\xb4\x6b\xa4\xd7\x2f\x63\xc2\xf3\xbd\x8c\x2d\xca\x7e\x1a\x3c\x37"
+ "\xc0\xc6\xee\x8e\xa9\x18\x41\xde\x2a\x4e\x47\x9a\x37\xe0\x97\xb1"
+ "\x17\x7b\xfc\xc8\xbb\xcc\x8a\xa7\x7e\xf9\xa9\x8c\xbf\xc0\xed\x0d"
+ "\xdd\xef\xe1\x36\x47\x8a\xbb\xcc\xdc\x07\x27\xec\x3f\x6f\xa8\xc3"
+ "\xc3\x3c\x61\x5b\xc1\x6b\x85\xbf\xdc\x07\xba\x13\x91\x92\x2e\xf3"
+ "\xd5\xf5\xe1\x97\xf2\x3c\x90\x33\x24\xce\xf9\x93\xbb\xcc\xac\x93"
+ "\x94\x16\xf5\x31\x4f\xaa\x14\x9e\xf6\x94\x50\x66\x87\xfb\x97\x27"
+ "\x0f\x3b\xd4\xd8\x5c\x25\xdc\x93\x7a\xdf\xab\xb4\xbe\x23\x4d\xee"
+ "\xcd\x8d\xa9\x50\xb1\x26\x7d\xb4\x2b\xbd\xd7\x35\x2b\x8c\x33\xeb"
+ "\x03\xec\xe3\xaa\x70\xb1\x6b\x41\xf7\xdc\x70\x55\xed\xd8\xb5\xe0"
+ "\x2b\xd4\xd1\xa5\xd5\x71\xe4\x7f\x58\xc7\x91\x2b\xd5\x01\xd9\x70"
+ "\xc3\x19\xfa\xd5\x9c\xab\xb7\x1d\x7f\x65\x93\xb4\x52\x1c\xb2\x29"
+ "\x99\xf9\xeb\x8f\xc2\xb0\xdf\x42\xa9\x83\x32\xe5\x77\xa7\x8c\xe4"
+ "\xe2\xb8\x9b\xa1\xe2\xbf\xf8\x1b\x1c\x9d\xe4\x59\xf1\x67\x6a\xa1"
+ "\x5f\xc9\x58\x77\x0d\x05\x6c\xb3\x0d\xc9\xef\xda\x18\x72\x75\x19"
+ "\x77\xed\x60\x7c\x6f\xc3\x38\x6c\x8d\xa2\xb3\xc6\xc0\x9f\xc9\x3b"
+ "\x8f\xd7\x57\x9b\x78\x5d\x3b\x5f\xf4\x1f\x94\x19\x81\x6c\x80\x8e"
+ "\x1e\x96\xf8\x80\xfe\x22\xed\x2d\xd8\x6c\xd2\xde\xf2\xcb\xf3\x89"
+ "\xfd\x65\x3c\x4d\xf7\xd2\x00\xaf\x7d\x87\xbb\x72\x6c\x1d\x6e\x9a"
+ "\xc5\x71\x36\x79\xdd\x59\x98\x8f\xa5\xcf\x0c\x25\x09\x69\x4f\x41"
+ "\xf7\xe7\x38\x9b\xde\x80\x8f\xc2\xd0\xa3\x2b\x2f\x51\x7a\x25\x74"
+ "\x4f\xc8\xec\x34\x96\xeb\xd5\x5a\xac\xcd\xcd\x97\x7a\x62\x6d\x56"
+ "\xf1\x5a\x4f\x33\xee\x2f\x91\x29\xbc\xd9\x60\xdd\x7a\x89\x46\x6c"
+ "\x5b\x41\x19\x5b\x79\x2d\xef\xef\x4a\xf7\x61\xbd\x42\xc6\xdd\x5c"
+ "\x9a\xc1\xeb\xf9\x3d\xba\xcf\x4a\x8e\x0b\xdc\x2d\xb7\x4c\x72\x0d"
+ "\xe4\xaa\xf0\xfd\x6b\x39\x0f\x86\x8a\xbb\x66\x85\x52\xaf\xf7\x75"
+ "\x6d\x0c\xc3\x26\xfd\x55\x1d\xf0\x97\x95\x68\x6c\x75\x3f\xac\xf2"
+ "\xa8\x58\xa9\x87\x47\x28\xf9\xee\xa3\xf7\xcc\xbd\xd1\x44\x78\x6b"
+ "\x0e\x8d\x69\xa3\x4c\xe5\xd3\x90\x8c\x39\xf1\xbd\x3c\xde\x3f\x2f"
+ "\x7a\x96\xac\xe1\xad\x73\x0d\xce\x9f\x52\x12\x7f\xe7\x9c\x7f\x45"
+ "\xff\x10\xad\x63\xf2\x28\x93\xf7\x1f\xd8\xef\xc1\xb6\x46\xe6\x9f"
+ "\x30\xa2\x90\x32\xa3\x61\x4f\x51\x8e\x51\x77\xdb\xa6\x2e\x79\x6a"
+ "\xe9\xb3\xf9\xf3\x0b\x16\x3f\xb9\x38\x6f\x71\xc1\x2a\x19\x42\x61"
+ "\x94\xfc\x77\xdf\xc8\x05\x73\xe4\xa6\x73\x94\x7e\x31\xa2\x67\x3d"
+ "\xee\xbd\x8b\x21\x5e\x3f\xb8\x2a\x7c\xbd\x27\xe5\x5f\x25\x74\xa9"
+ "\x4a\xe9\xbb\xb3\xdb\xec\x33\xd4\x35\xc9\x35\x71\xa4\x6d\xd2\x7c"
+ "\x6c\x4e\x6b\xf9\x22\x9b\x86\x78\x40\xc7\xe3\x4f\xd1\x6f\x42\xbc"
+ "\x1f\x82\xb1\x4a\xf3\x16\x9e\x61\x5b\x72\x3c\xaf\xf1\x37\xf0\x5a"
+ "\xc6\x32\xce\xbf\x7b\x2d\xfb\x30\xb0\x3f\x14\xe8\x70\xc7\x29\xed"
+ "\x59\xfb\x66\xfa\xd6\xd0\x52\xeb\x8e\xd0\x79\xeb\xbb\x42\xe4\xbc"
+ "\x25\x96\xda\xb7\x8a\xf3\xf6\xb7\xa2\xe2\xbf\xf5\x45\xf9\x97\xc1"
+ "\x27\xdf\xc1\x6f\x88\x28\xde\xbf\x13\xfc\x37\xec\x0c\xed\x7e\x87"
+ "\xdb\x30\xdd\x2e\xce\xf7\xc4\x42\xd8\xbd\x0f\xcf\x5d\xf8\x45\x44"
+ "\xf1\x81\x23\x51\xfb\x6b\xfc\xee\x53\xce\x9f\xbf\x88\x7d\xc2\x76"
+ "\x9f\xe5\x76\x89\x8d\x07\xfe\xcd\xef\xb4\x27\x21\x7f\x58\xb5\xf3"
+ "\xfd\x64\xef\x86\x46\xb2\x3d\x29\xef\xcd\x9e\xa7\x59\x9f\x7b\xff"
+ "\xa7\xc2\xe8\x14\xbc\x07\xe7\x6d\x0d\x91\x3a\xaf\xf6\x9e\x83\x7d"
+ "\x10\xaa\xa0\x6f\x57\x0e\xa4\xb4\xb2\x81\x94\xda\xe1\x7e\x7f\x6c"
+ "\xb7\xff\x85\x59\xcd\xb7\x3c\xe7\x71\xec\x6c\xc8\xa3\x0e\x9e\x3f"
+ "\xb9\x1d\x4c\xc3\x80\x39\x8f\xf7\xe7\xd4\xf9\xa8\xf7\xf3\xa0\x5b"
+ "\x5a\xaf\x5e\x1e\xbf\x2f\xbf\xa7\x32\x66\x13\xcd\xe3\x35\x6d\xde"
+ "\x77\xe6\xd8\xd2\xe0\x57\xb3\xb2\x37\x7e\x73\x42\xee\xab\x43\xa6"
+ "\xf0\x7e\x49\x75\x11\xf4\x04\xf3\xb1\x54\xd6\x6f\x42\x6e\x72\xf1"
+ "\xde\x66\xe4\xd2\xd9\xdd\xbc\x1f\x2d\xcf\x16\xca\x98\xec\xc7\xa8"
+ "\xfa\x22\x99\x5a\xe8\x7d\xfe\x56\x77\x5a\x0f\x5e\x7f\xf3\x5d\x86"
+ "\x21\x36\xee\xcb\xb2\x14\x1a\x8b\x19\x46\xe4\xd2\xb9\x71\x7a\x39"
+ "\xe0\xae\x1f\x97\x03\x1d\xdc\x20\xcb\x71\x5e\x19\x13\x25\x6d\xae"
+ "\x30\x77\xcd\x92\x75\xaa\xe7\x59\x02\x7c\x18\xba\x14\xde\x8d\xfb"
+ "\x39\x8c\x27\x5c\x73\xe4\xda\x2f\xec\x75\x19\x8b\xc7\xfc\x89\xcf"
+ "\xeb\xfb\x9b\x47\xb6\x87\x7d\x71\x0b\x20\xb3\xa4\x3e\xf8\x9b\xe7"
+ "\xaa\x3e\x27\x53\xfe\xd3\x3c\x7e\xbf\x95\xeb\xfe\xa0\xa7\x9d\xaa"
+ "\x7d\xbf\xed\xd3\xbe\xf1\xb0\xab\xdd\x1c\x4a\x0b\x18\xcd\x54\x6b"
+ "\x0d\xb2\xac\xf4\xd4\x5a\x3b\x61\x53\xfc\xa6\xde\x67\xdc\xbb\x5b"
+ "\xe9\x22\xaa\x1c\xef\x13\x43\x4f\x6d\x4d\xb2\xa6\x39\xf1\xbe\x4d"
+ "\xf7\xbb\x80\x4e\xda\xba\x19\xef\x80\xdb\x3a\xc6\x9b\x8f\x76\x67"
+ "\x35\xe6\xa9\xb3\x19\x78\xee\xcb\xe7\xed\x25\xae\xd7\x3f\xd3\x6a"
+ "\x59\xe7\xe1\xf3\x9f\xe3\x2c\xa1\x2c\x23\xef\x03\xf3\xb9\x7f\x8e"
+ "\x85\xc0\x67\xff\x79\x2d\x4f\x7b\x9f\x19\xf7\x7e\x94\xfe\xbe\xc3"
+ "\xfd\xdb\x05\xfa\x99\x7d\x8e\xa9\xc4\x3e\x06\x61\xcd\x57\x50\xc6"
+ "\x1a\xba\xa0\xf6\x51\xd9\x57\x90\xd7\x11\xf9\xcc\x23\xef\x75\xa2"
+ "\x5c\x65\xb7\xef\xa6\x3c\xeb\xf3\xdb\x5d\xba\x6f\x14\xee\xf7\x76"
+ "\xfb\xf5\x00\x17\xed\xc5\x21\x73\x20\x75\x88\x27\x50\xdc\x05\xfd"
+ "\xf3\xb7\xc7\x21\x0f\x7b\x8d\x45\x24\x6d\x3f\x8e\xc9\xfc\x3c\x19"
+ "\x23\x29\xc7\xc6\x71\x8c\x8e\xda\x00\x69\xbe\xff\x7b\xee\xd2\xce"
+ "\xc4\x27\x9d\xa3\xdf\xfe\xa3\x67\xcf\x31\xac\xad\x97\xed\x99\xab"
+ "\xf4\xb5\x3d\x73\xe5\x7a\xd9\xc6\x2e\xff\xdb\xab\x83\xc6\xdd\xab"
+ "\x7d\x46\x75\xf6\x61\xcf\x2c\x1f\xd5\x6c\xd0\xfd\x56\x90\x2f\xad"
+ "\xb7\xd8\x6b\xa2\xb8\x29\x55\xc1\xfc\x40\xae\x27\xf6\xd8\x3f\x1f"
+ "\x48\xdf\x20\xde\x1f\x8c\xf0\x5c\x99\xf2\x1f\xd2\x6f\xd2\x9b\x7f"
+ "\x81\xd7\xcd\xfa\x2a\x5b\xec\x03\xed\x5b\x52\xd2\xd7\x73\xd0\x99"
+ "\xd8\xe7\x81\xfc\xac\x70\xb6\xc7\xa7\xaf\xc1\x6f\x31\x46\x38\x2e"
+ "\xb7\x70\x6e\x17\x01\x6f\x7e\x80\xa0\x87\xf9\xbd\x98\x7b\x51\x87"
+ "\xc8\x5f\xc6\x71\xf3\x3f\xb8\x8e\x71\xaf\x78\xea\x83\x12\xd9\x26"
+ "\xf7\x3d\xc2\xc9\xfa\xa7\xbf\x4d\xda\x41\xc8\x77\x2d\xf2\x4d\xac"
+ "\x2b\x6c\x63\x3f\x16\xe2\x98\x87\x2d\x5a\xdd\xfe\xe4\xa6\xd4\x6f"
+ "\xa4\xd2\xbc\x0e\xf7\x07\xd0\xff\x5f\xcc\xba\x7a\x3e\xff\x60\xce"
+ "\x95\x74\x11\x35\x37\x66\x51\x6f\xf6\x0c\xdb\xab\xb7\xa3\xfe\xe9"
+ "\x82\xdb\xff\xbb\x89\x21\x63\x90\xba\x8c\xfd\xc4\x37\x5d\x0e\xc8"
+ "\x81\x7e\x22\xbc\x1a\xe3\xd5\x6e\x85\xbe\x5b\x4f\x8d\xa1\x3a\xe9"
+ "\x23\x02\x1e\xb6\x14\x05\xc4\x05\x6f\x68\x8f\xf4\xef\x55\xe7\xe0"
+ "\x7f\xf7\x5d\x6f\xe8\x20\x35\xe6\xfb\xc9\xb3\xec\xcf\x98\xb3\x7e"
+ "\x37\x92\xdb\x75\x7b\xbe\x8b\x46\x9f\xe3\xf7\x1f\xb4\xa8\x79\xf2"
+ "\x77\x59\xda\x35\x8d\x63\x63\x46\xb7\xe9\xbe\xe7\x97\x3c\x55\xb0"
+ "\x78\xe9\x92\xd1\xd3\x16\xae\x58\x98\x67\x7b\x48\xb9\xdc\xc5\xcc"
+ "\x5f\xe6\x9e\xf8\xdf\x1f\xa6\xf2\x9c\xc2\xba\x0a\xc7\x01\xbf\x52"
+ "\x0c\x70\x3d\xfe\x37\xf4\x86\x11\xbc\xbe\xf7\x7f\x19\x03\x5c\xd7"
+ "\x45\x38\xfe\x77\xcf\x5a\xf7\x87\xf5\xdd\x3c\x10\x39\xd4\xc1\xcf"
+ "\x7c\xf6\x33\xe2\xfe\xdd\x34\xe6\xa3\x2a\xe9\x9f\xf6\x61\x76\x74"
+ "\xac\x24\xf6\xc5\xe3\xf5\x11\xa4\xcf\xd5\xcf\xd9\x82\x16\x31\x6f"
+ "\x7c\x98\xd7\x73\xee\xe7\x43\x07\xc6\x7b\xaf\xe2\x5f\x99\xb7\x58"
+ "\xdf\x13\xd6\xbe\xbb\x26\xf7\xb0\x23\xee\xae\x2c\xb5\x0e\xf3\xe1"
+ "\xe6\xaa\x48\x3f\xb3\xda\x03\xf8\x70\x8f\x7e\xa6\x4c\xf1\xe6\x21"
+ "\x8d\x37\x3f\xac\xbf\xd2\xbe\x7d\x0f\x6f\xec\x35\xf7\xf0\xf5\x5f"
+ "\xb5\xb2\x7b\xcd\x5f\xb6\xe7\xaf\xe9\xc3\xd7\x9d\xa1\xfd\x37\xf0"
+ "\xda\x0c\xee\xbf\x8e\xfb\x3e\x72\xae\x95\xfe\xf5\xfb\x3e\xd3\xee"
+ "\x51\xc7\xbe\xa3\xda\xfd\xd7\x70\xff\xbe\x76\x3f\x14\xf7\x6f\x6a"
+ "\xf7\xe0\xd9\x7d\xeb\xb4\xfb\x74\xdc\x2f\xd6\xee\x21\xf3\xf7\x3d"
+ "\xa8\xdd\x0f\xc6\xfd\x77\xb5\xfb\xeb\x71\x3f\x5c\xbb\x07\x0f\xee"
+ "\x4b\xd6\xf6\x4f\xcd\x68\xfb\xc5\xab\xd7\xcf\xf7\x7a\xd4\x1e\xdd"
+ "\x3e\xe8\x89\xef\xed\x50\x73\x46\x77\x5a\x3a\x68\x7a\x81\x8e\x5f"
+ "\xa4\xf3\xdc\x68\x46\xfa\x28\x1f\xbd\xd3\x12\x95\xbe\x53\xcb\x9f"
+ "\x8d\xf9\xc6\x17\x95\x5e\xa9\xa5\xcf\x85\x0e\x6a\x8e\x4a\x2f\xd3"
+ "\xd2\x0b\x20\x17\xed\x51\xe9\x5a\x5c\x87\x7d\x9b\x7c\xb4\xdd\x1a"
+ "\x95\xee\xd0\xd2\x77\xe8\xfe\x0a\x5a\x7a\x9e\x96\x5e\x83\xf4\x23"
+ "\x51\xe9\xf3\xb4\x74\xc8\xff\x0f\x9b\xa3\xd2\xd5\xba\x82\x3c\x8b"
+ "\x66\x11\xb5\x85\xcc\x5b\xfb\x82\x3e\xda\xb6\x37\x2a\xcf\x14\x55"
+ "\x76\x7f\x9a\x8f\x2a\xa3\xfb\x32\x5e\x4b\xcf\xf0\xd1\xdf\xb7\x47"
+ "\xa5\x67\xf6\x26\xab\x0c\x15\x34\xaf\xb7\x35\x4c\xfe\x4e\x95\xf4"
+ "\x93\x94\xba\xe5\x81\x85\x7c\x4e\xcd\xb2\x4d\x9c\xb2\x15\x09\x71"
+ "\x8a\x0e\x4c\x53\xfe\x81\x47\x79\xee\x68\x53\xe7\xfd\x0e\x8c\x95"
+ "\x67\xc0\xd8\xe7\x9c\xcf\x00\xae\xe6\xb4\xfd\x32\xf6\xc9\x18\x87"
+ "\x4b\xc5\xe4\x54\xfe\xa7\x6d\xd2\x96\xd7\xf6\x39\x91\xe7\x33\x5e"
+ "\xdb\x64\x38\xbc\xde\xe7\x2d\xe8\x94\x3e\x91\x6c\x4b\x71\x1a\xdb"
+ "\xb4\xf2\x5c\x58\x94\x4d\xa5\xe4\xfe\x81\x85\x11\x3e\xb7\xef\x56"
+ "\x76\x3f\xf3\x22\xe7\x67\xdf\x9c\xe8\xbc\x3e\x3a\x20\x6d\xd3\x24"
+ "\xeb\xb5\x9f\x74\xb8\x0f\x64\xf7\x9c\x55\xda\x5f\xa9\xa5\x9f\x40"
+ "\xfa\xdc\xa8\xf4\xe2\xde\x65\x3b\xe4\x9d\x79\x5f\x71\xd7\x25\x11"
+ "\x08\x5d\x12\xc1\x2d\xff\x89\x76\x2f\x92\xe7\x6e\x6e\x0c\x17\xef"
+ "\xab\xd0\x62\x60\x7c\x16\x5a\x21\xfc\x90\xd9\xfc\x8d\x89\x6b\x66"
+ "\x04\xfc\x34\x23\xbf\x43\x6c\x7e\x92\xfd\xec\x2e\xca\x78\x50\xce"
+ "\x36\x8e\xbf\xcd\xbe\x5b\x01\xde\x1f\x4a\x6d\xc4\x1c\x57\xb5\x88"
+ "\xdf\x7f\x4a\xd3\xed\x7e\x6a\xb0\x87\xa9\x0a\xb0\xb7\x3d\xa9\xfb"
+ "\x4d\x1e\xe8\x8e\xff\xc3\x6d\xe0\xfa\x9c\xf2\x5b\x31\x35\xa3\xb9"
+ "\xad\xfc\x2d\x3c\xb1\xf9\x7a\xbf\xf8\x03\xeb\xb2\x5d\xfc\x0d\x44"
+ "\x1b\xe6\xf6\x71\xb8\x27\xf9\xe3\x77\x48\xef\xad\x4f\x8a\x97\x6b"
+ "\x34\x7f\xcc\xfd\x66\x25\x2f\x6a\x0a\xc4\xbf\xf0\xb9\xa3\x1a\x07"
+ "\xca\xb6\xfa\x93\xbb\x12\xfa\x5f\xad\xdd\x46\xc6\xae\x8d\xd0\x4d"
+ "\xce\xed\x35\x2a\xf9\x74\x70\x41\xc4\x68\x5e\xc7\xeb\x8a\xf2\x3b"
+ "\x11\x1b\x8f\x4d\xd9\xb5\x24\x68\x6c\x58\xdd\x42\x6b\xae\x27\xeb"
+ "\xdc\x20\xfb\x92\xd7\x7c\x3e\xa0\x80\x63\x71\x75\xf9\xa1\x87\x1a"
+ "\x7f\x8b\xf7\xbf\x5f\xb2\xd7\x18\x92\xfa\xca\xc1\x05\x72\x2d\xaa"
+ "\xf8\xd8\x30\x9e\x43\xbc\xcd\x61\x3e\x7b\x24\xf5\x64\xc8\x7f\x73"
+ "\x78\xa5\x7d\x60\x68\xb9\xfd\x9a\x6d\xcb\x28\x35\xbc\x3c\x23\xfd"
+ "\xd5\x4b\x34\x4e\x9f\x7f\x60\xc3\x66\x8a\x0e\x6b\x4a\x29\xe6\x14"
+ "\xb6\x71\x07\x18\xd2\xe4\x9e\x1b\xdf\x47\x8c\x6f\x8f\xa8\x5a\x71"
+ "\xe5\x6f\xde\x84\x61\xdb\x72\xec\x69\x6e\x4b\xa2\xbe\x6e\x7a\x0b"
+ "\xf6\xb2\x76\x4e\xb6\xe8\x73\x1a\x0c\xbb\xc5\x38\xe0\xa2\xf0\x9c"
+ "\xc9\x23\x23\x7f\x27\xa4\x68\xa1\x5c\x47\xea\xd3\x60\x0f\x91\xd7"
+ "\xf1\x17\x2a\x5a\xc6\x63\x74\x70\x1f\xeb\x69\xec\x37\x89\xfc\x69"
+ "\x67\xe8\xe0\x51\x4b\x10\x73\x46\x10\xba\xf4\xd3\x6c\x13\x1e\xfc"
+ "\x34\x20\x63\xdf\xfe\xde\xc6\xbe\xe3\xff\x1f\x7b\xdf\x03\x17\x65"
+ "\x95\xee\x7f\x66\x18\x75\xd0\xe1\x8f\x46\x39\x1a\xda\x54\xba\x4d"
+ "\x2d\x16\xb6\xd6\xb5\x5d\xdb\xa8\x74\xd7\x6d\x35\xac\x6b\xbf\xcb"
+ "\xae\x96\x98\x60\x68\xa8\x23\x12\x91\x21\x20\x12\x3f\x30\x06\xe9"
+ "\xae\xdb\x45\x18\xfe\x74\xc5\x7b\x69\xd7\x36\xb7\x9f\x7b\xd7\xf6"
+ "\x97\x85\x89\x1b\x12\x30\x68\x58\x68\x98\x13\x21\xa1\x8b\x36\xc2"
+ "\x20\x23\xcc\xbc\xe7\xf7\x3c\xe7\xbc\x2f\x33\x03\x0c\x0c\x03\x9a"
+ "\xfd\x56\x3e\x9f\xf7\x33\xbc\xe7\x3d\xef\x79\xcf\x79\x9e\xef\x79"
+ "\x9e\xe7\xfc\x7b\x9e\xf2\xb8\xc7\x30\xed\x4a\xca\x59\xb6\x47\x82"
+ "\xf0\xbe\x75\xb0\x1e\xef\x53\xf0\xdc\xee\x78\xe3\xfc\x3f\x75\x5b"
+ "\xc7\xf0\xb9\x8a\x83\x27\x38\xcf\x7a\x4c\x7c\xfc\x75\xb0\xde\x1d"
+ "\x76\x85\xcc\x83\x65\x14\x7d\xa3\x1b\x6c\xe4\x49\x0b\x35\xb1\xf5"
+ "\x4c\xf4\x57\x90\xf8\x48\x39\xbd\x9c\x4b\xf8\x19\xbb\x0f\x77\x09"
+ "\x59\x07\xcb\xb8\xbf\xca\x0f\xdf\x20\x7c\x2f\x12\xe8\xc8\x83\x07"
+ "\xf8\x5c\xee\xc1\x4a\x3e\xb7\x79\xb0\x61\xdb\x54\xdc\xab\xfc\x61"
+ "\x5e\x87\xef\xc1\x56\xf8\x8d\xed\x18\xff\x59\xb9\x7b\x7d\xf4\xb7"
+ "\x06\xcd\x74\x12\x84\x73\xea\xb8\xef\xb8\x98\xef\x37\x86\x6f\x7c"
+ "\x64\xa0\x59\xec\xd9\x6d\x4d\x3a\xe2\xc3\xc7\x7b\x1f\x9e\xbb\xcf"
+ "\x40\x34\x50\x57\x3f\xaa\x3c\x98\xc9\xf6\x78\x65\x1e\xcc\x33\xb6"
+ "\xd1\x72\xdc\x5b\xc8\xd7\x3e\x3e\x2a\xa3\xbe\x07\x33\x79\xfe\x8f"
+ "\x1e\xaa\x6d\x83\x36\x28\x0f\x46\x18\xad\x17\x44\x9b\xf0\x23\xc0"
+ "\xfe\xc1\x08\x9a\x79\x30\x86\x9f\x7f\xff\x28\x4b\x92\xab\x1c\xa3"
+ "\x1f\x6d\x11\xb1\xde\xc0\xe9\xf6\x51\x99\xa8\xaf\x6e\xc3\xff\x41"
+ "\x77\x87\xf2\xb5\xfa\x8f\xe2\x25\x1b\xd9\x24\xe6\xc1\x77\xe0\xff"
+ "\x08\x2e\x6b\x3f\xda\x09\x6d\x17\xcf\x30\x7c\xc4\xd6\x0b\xa1\x7d"
+ "\xa0\xb3\x3e\xac\xc3\x76\xb9\x93\xad\x8c\x16\x49\xc4\x07\xea\x9c"
+ "\x88\x7b\x4a\xd1\x4e\x31\x5a\x1e\x29\xe7\xb1\x2c\x0f\xcd\x66\xe7"
+ "\x80\xe1\x3b\xc0\x1f\x39\xca\x4d\x3c\xb7\x8c\xe5\x39\xea\x5f\x7e"
+ "\xb3\x54\x17\xfc\x1e\x3e\x83\xb6\xe2\xfe\x1e\xa4\x55\x0c\xe6\x41"
+ "\xbe\xb6\xe8\x70\x8e\xa3\x13\x68\x86\xfb\x85\x0e\x85\x21\x4d\x38"
+ "\xcd\x0e\xf5\xc6\x3c\xe7\xf4\x3a\x34\xd1\x95\x1e\xfc\x5e\x50\x82"
+ "\x6c\x88\xc3\x7d\x23\x87\xc2\x44\xfa\xb5\x89\xdf\x67\x71\x38\xf9"
+ "\xb3\xf2\x3d\x4e\xef\x4e\xeb\xcd\xcb\xe3\xa6\xca\x71\x0d\x16\xe7"
+ "\xe4\x39\x5e\xcb\xeb\x9c\xde\xab\x5b\x71\x09\x6d\xe4\xf7\x23\x30"
+ "\xce\x25\xd2\xbc\x2b\xad\xbc\xd9\x41\x6f\x5e\xce\x00\xdf\x98\x2e"
+ "\x7d\xc3\x44\xca\x4b\xa5\x7a\xc2\xff\xa2\x0e\x3e\xa4\x75\xf0\xa4"
+ "\x7c\xa1\xf4\x5e\x11\x3b\x4b\xf4\x91\x05\xcf\x40\x0e\x28\x07\x71"
+ "\xed\x07\xa8\x52\x6b\x7b\xa4\x9c\xe1\x91\x1c\x2a\xc1\x3d\xb1\x40"
+ "\xd7\x44\x8e\xa1\x43\xe9\x5c\x17\x1e\x2a\xc1\x32\x71\x5d\x85\xfb"
+ "\x3b\x3d\x94\x07\xe5\x8a\xb1\xba\x0f\xed\x15\xeb\x00\xe3\xbf\x0f"
+ "\x4b\xfb\x8e\xeb\x1e\x5b\x19\xc5\x0e\xfb\xce\x7a\x49\xd7\xf7\x5c"
+ "\x91\xd2\x71\xae\xf3\x50\xab\xd3\xb9\xd8\x50\x4e\xef\x8f\xe7\xc0"
+ "\x38\x75\x7f\x0e\xf7\x8b\x7b\x20\x07\x78\x96\xd2\x49\xa6\x62\x7c"
+ "\x98\x64\x1d\x3d\x5f\xab\x83\xb1\xb5\xb2\x2a\x0a\xe4\x45\x4c\x72"
+ "\x27\x19\x8f\x7b\x2e\x50\xde\xe0\x7c\x0f\xf5\x85\xf4\xac\xaa\x18"
+ "\xc7\xd9\xbb\x0a\x13\x8c\x6d\xcb\xf4\x30\x96\x4d\xb9\x40\xa6\xf2"
+ "\x3d\x14\x1f\x6f\x14\xe7\x7d\xf2\x85\xcc\xaa\x58\x3c\xd7\x59\x0b"
+ "\x23\x42\x9a\x12\x93\x2f\x64\x55\xc5\x42\xb9\x49\x29\xeb\xc8\x24"
+ "\xd4\x6f\xb8\x57\x97\x63\xa6\xa2\x1c\xca\x4d\x42\x9f\x6b\x02\x8d"
+ "\x90\xc1\xf7\xcb\x05\x65\x9d\x52\x2f\x10\xb6\x47\x1c\x70\x26\x6f"
+ "\x22\x1f\x1f\x82\xef\x97\x63\xdc\x4a\x9c\xf3\x31\x5a\xad\xe8\x17"
+ "\xa2\x1c\x9e\xf9\xc3\x33\x9c\xef\x11\xd0\xff\x1a\xfa\x73\x87\xf2"
+ "\xd5\x58\x3e\x7c\xab\x9c\xd7\x9d\xf9\x45\x29\x6f\x22\x87\x6f\xc7"
+ "\x3c\x92\x5f\x37\x21\x25\xc2\x07\x9f\xe3\x39\x61\x3b\xc6\x45\x00"
+ "\xeb\x9c\xbf\xd3\xd0\xfb\x8e\x68\x3f\x43\x5f\xae\x78\x9f\x6e\xff"
+ "\xac\x01\xf2\x1e\xc0\x3d\xa9\xdc\x96\xad\xd8\x2f\xf6\x75\xb0\x8f"
+ "\x2b\xfe\x22\xfe\xaf\xea\xcd\x9b\x12\x41\x92\xaf\x10\x35\x5b\x57"
+ "\x7d\xd9\x07\x64\x6f\x85\x0a\x63\x2c\x38\x95\xf9\x35\x96\x97\x8d"
+ "\xfe\xe2\xa2\x89\x0a\xe4\xf2\x04\xa8\x37\xc6\x47\xf9\x1a\xe7\x6a"
+ "\x45\xda\x98\x80\x4f\xfb\x76\x70\x9f\x80\xfb\xf5\x80\xfd\xe4\x2d"
+ "\x60\x0f\x6c\x21\xaa\x2d\x76\x12\x8c\xed\x04\xbe\xb5\xe2\xbe\x6a"
+ "\x1c\xbb\x21\x6d\x44\x1e\x36\x42\x5b\x9a\xb7\xc4\xd0\xe6\x2d\x6d"
+ "\xb4\xb5\x26\xa6\x81\x80\x9e\x99\x54\xab\xab\x43\xdf\xe4\x5f\x63"
+ "\x5b\x71\x8e\x12\x68\xda\x68\xc2\x6f\x64\x55\x35\xe3\x59\x19\x36"
+ "\x4f\x20\x3f\x74\x40\x3a\x57\x54\xc4\xce\x1e\x55\x84\xf6\xce\x7d"
+ "\x25\xd0\x0a\xb1\x2e\x95\x02\xfe\x9f\xc0\xce\x27\x8e\xc7\xf1\x0f"
+ "\xce\x69\xac\x78\xa5\xa4\xf7\x8c\x06\x9f\x1b\xa8\x88\x75\xf2\xcb"
+ "\xc5\xde\xc5\x39\x02\x7c\x37\xdc\x46\x3b\x77\x88\x79\xf1\xdd\xf0"
+ "\x57\x56\x50\x7c\x17\xde\x29\xe9\x7d\xc7\xe5\x8c\xcf\x61\x6e\x57"
+ "\x00\x6d\xf1\x7f\x33\xd0\x52\xdc\x43\xa5\xe1\xeb\xdf\x15\x0d\xd2"
+ "\x9a\xb3\x89\x7c\x9c\x8b\x78\x1a\xd8\x9f\xf8\x11\xe2\xea\x23\xe9"
+ "\x48\x1d\xfa\x6f\x82\x74\xb5\xe4\xcb\x08\xfe\x9f\x01\x65\x71\x3b"
+ "\xdb\xc9\x47\x59\x8e\x93\xbf\xc3\x14\x33\xfd\x06\x71\x02\x72\xc5"
+ "\xe7\x3c\x39\xa2\xa3\x59\x75\x4a\x7e\x4e\xea\xc8\x21\xac\x67\x13"
+ "\x39\x82\xbe\x14\x02\xb8\x2f\x85\x23\x5b\x45\xf9\x61\x0d\xb7\xdb"
+ "\x02\x4c\xf0\x4d\x3c\xf3\xe3\x74\x9f\x08\xf2\x24\x10\xf2\xfd\x99"
+ "\xfb\x03\x3c\xa2\xeb\x93\x1f\x9f\xa7\xf6\xb9\x0f\xeb\x73\xaf\xb1"
+ "\x40\xbf\x71\xb7\xb6\xae\x9f\xca\xe6\x0f\x83\xfd\xb7\x12\x5d\xca"
+ "\x39\xe2\x03\x58\x39\x8b\x75\xab\x6d\x6d\xc3\x36\x05\xd0\xb4\x50"
+ "\x82\x73\xa0\xcc\xb6\x04\x9d\xde\x34\x03\xf2\x9c\x23\xb7\xe0\xbe"
+ "\x6f\x8c\x91\x02\xf9\xcf\x73\x3f\xe6\x9f\xfc\x66\xf9\x4b\xe3\x89"
+ "\xf0\x42\xc4\x04\x2a\x7f\x2a\x0f\xd7\xf6\xde\xe9\x36\x8d\xc1\x75"
+ "\xae\xe4\x5d\x04\x6d\xad\x5b\x00\x63\xcd\x18\x8f\x0e\xde\x69\xdb"
+ "\xdd\xdd\x3a\xc6\x68\x3b\x45\x74\x6b\x89\xfc\x3c\xf9\x64\x91\x22"
+ "\x89\x28\x76\xb4\x90\x40\xe0\xab\xed\xb0\x6d\x6e\xaf\x2f\x04\xc3"
+ "\x24\x7e\x8e\xdb\x00\xf2\x75\x93\x9a\x5a\xbb\xd2\xfe\x5e\x06\x63"
+ "\xaf\x9d\xd2\x18\x3b\x9b\xc7\x41\x51\xc0\xf7\x6f\x96\x8b\x7e\x1f"
+ "\x38\x6d\xff\x7e\x96\x9f\xb3\x0a\x7a\x01\xde\x69\x74\xd8\xdf\x9f"
+ "\xf0\x58\xe3\x99\x75\x21\x5c\xf6\x7d\x12\x73\x18\x2c\xf8\x74\xbe"
+ "\x47\x21\xa8\x2b\xed\x13\x65\xef\x1e\x05\x36\x6f\xf5\x49\x0c\xf0"
+ "\x30\x84\xdb\xe6\x75\x21\x2b\xec\x4a\xb1\x0f\x62\xfa\xfb\x11\xf8"
+ "\x2e\xbc\x17\x60\x61\x73\x4c\x9f\xcc\x77\x60\xed\x13\x15\xca\x7c"
+ "\x68\x93\xca\x44\xfe\x9e\x8a\xed\x42\x9a\x40\x3e\x05\xdc\xa7\x1f"
+ "\x2e\x75\xe3\x17\x56\xf9\x37\xa5\x0d\xe7\x40\x32\x7b\x5a\x01\x4f"
+ "\x17\x80\x07\x37\xa1\xef\x27\x23\x7c\xa7\xa6\xa8\x9b\xd4\xa8\x3b"
+ "\x48\x2d\xfc\x8f\x7b\x91\xcb\xd7\x7e\x43\x9a\x35\x03\xeb\x1b\xd0"
+ "\x59\x99\x50\xe7\x3c\x2c\x0b\x65\x01\xee\xdf\x32\x26\x81\xfe\x31"
+ "\x43\x59\xcd\x84\x95\x51\x23\xb4\x92\x9a\x44\x18\x67\x65\x4f\x31"
+ "\xd7\x16\x9d\x22\xb5\xea\xcf\xd8\x77\xd0\x26\x2c\x8f\xeb\x18\xac"
+ "\xec\x32\x28\xfb\x80\x58\x76\x1b\x94\x1d\xe4\xb6\xec\xcc\x9e\xc0"
+ "\x61\x96\xed\x79\xbd\x33\x7b\xc8\x70\xca\x06\xd9\xa7\xc2\x38\x37"
+ "\x78\xae\x2b\x79\x0a\xf1\xb3\x5f\x46\xbf\x9f\xb7\x51\xbe\x1f\xf6"
+ "\xe8\xc3\xec\xec\x57\x1a\xdb\x6f\xac\x64\x67\xc0\x2e\x12\xb6\xa7"
+ "\x91\x9f\xfb\x3a\x4b\x70\x3f\x44\x57\xda\x51\xad\x63\xac\xd4\xbb"
+ "\x4e\x05\xb6\xea\xd1\x45\x7c\xdf\x63\x95\xb8\xee\x7b\x14\xfd\x46"
+ "\xba\x19\xe7\x7d\x3a\x87\xef\x9f\x3d\xfa\x9a\x34\xff\xd2\xe1\xfb"
+ "\xe9\x1c\xb1\x2c\x4d\xdf\x79\x3d\x29\x20\x6d\x74\x62\xbc\x14\xdb"
+ "\x36\x5e\x3c\x7e\xfa\x74\xf4\xaa\xe8\x35\x09\xd1\x51\x9a\xa5\x2f"
+ "\xc5\xad\x9f\xb5\x61\xf5\x6a\xcd\xe2\xe8\x4d\x9b\x56\xbe\x10\x3d"
+ "\x9e\x2c\x8d\x5b\xb9\x7e\xd3\x1a\x9c\x7b\xd3\x68\xe6\xff\x64\x45"
+ "\xcc\x86\xf8\x59\x3f\x9f\x1f\xda\x67\xee\x0d\xcf\x2a\x36\xa2\x0d"
+ "\x0e\xba\xe3\x96\x64\x3b\x99\x88\x7e\x7c\x02\x5e\xa1\xe5\xaf\xc2"
+ "\xf8\x0f\xf0\x77\x1e\xf5\x14\xea\x06\x1c\x1b\xa0\x0f\x41\x90\xdf"
+ "\xd5\x05\x6f\xd2\xba\x16\xf2\xa5\x1d\xec\xca\x86\x62\xee\x0f\xaf"
+ "\x11\xc6\xe4\x66\x1e\x6f\xf1\xcb\x93\xe8\xeb\xee\x75\x48\x33\xfb"
+ "\xd6\x85\xec\xf8\x8a\x28\x40\xaf\xc1\xb8\xa4\x2a\x8f\xca\xc7\xd1"
+ "\xec\x5b\x68\x05\xfd\x46\x4d\x44\x1f\xe2\x72\xa3\xc9\x8a\xeb\xf9"
+ "\xca\x70\x5b\x0a\x45\x79\xca\xfb\x56\xd5\x2e\x4e\x97\x83\x65\x7c"
+ "\x5f\xf1\x97\xef\xe3\x18\x66\x1b\x8b\x87\x59\x05\xfd\xff\xa0\xce"
+ "\x21\xa7\x3f\xab\x10\x6d\xc7\x06\xa0\xfb\xcb\x4d\x70\xcf\xfd\x8c"
+ "\x54\xd5\xbb\xee\xd5\xa8\x06\xbd\xfc\x45\x2b\xbf\xf0\x9d\x06\x25"
+ "\xbf\xf0\x7f\xe7\xeb\x4b\x03\xbf\xfa\xa6\x8f\xf4\x92\xbe\xef\xed"
+ "\xfb\xf5\x49\x83\x5f\x9e\x7c\x1f\x7f\xbf\xcf\xf6\x8f\xe4\xfd\xfa"
+ "\xf4\xc1\x2e\xc4\x1b\x60\xab\xf1\xf5\xaf\x88\x12\xf0\xb9\x53\xff"
+ "\x3c\x60\xfa\x34\x51\x27\xd9\x68\x73\xca\xb3\x24\x38\xf9\x1c\xc1"
+ "\x78\x84\xad\xf1\x89\xb4\x39\xf9\x32\xda\xa4\xf5\xcf\x00\x7e\x0f"
+ "\xe4\x34\x11\x95\xbe\x89\x04\xd6\xc6\x63\xac\x62\xf4\xf5\x05\x72"
+ "\xa6\x0d\x2e\xb8\xaf\x4e\xb0\x92\x4f\xcd\x97\x70\x7f\x53\x79\x6d"
+ "\x24\xc8\x9d\x46\x42\x10\xbf\xaa\x48\x12\x64\xb8\x85\x7e\x40\xd3"
+ "\x36\x80\x3e\xdb\x80\x71\x09\xeb\xdf\x15\xc2\xc6\xbc\xbb\xb9\x72"
+ "\x8c\xe6\x79\xd4\xf1\x35\xbf\x11\xb1\x79\x84\x9f\x29\xfa\x8c\x9d"
+ "\x67\x80\x7e\x52\xcf\xe7\xd5\xeb\x1f\xe5\xfa\xbc\x7e\xa2\x38\xdf"
+ "\x04\xff\x7f\xc6\x6c\x45\x68\xc7\x01\x8c\xdf\x8a\x65\xfe\x49\x38"
+ "\xc0\xe2\xb7\xbe\xbb\x39\x6c\x4c\xd2\x4a\x22\xaf\x35\x9d\x27\x18"
+ "\xdb\x09\x63\x81\x42\xbf\xdb\x0b\xfd\x6c\x5f\xe1\x2d\x34\x17\xea"
+ "\x97\x5d\x74\x0b\xcd\x84\x3a\x95\x75\xa5\xd5\x54\x82\xee\xf9\x40"
+ "\x5c\x77\x29\x87\x7e\xb1\x57\x0f\x79\xc2\x5f\x22\xb7\xe9\x21\x5f"
+ "\x0e\xe4\x43\x3b\x99\xd7\xef\x98\x1e\x68\xb0\x1f\xbe\x59\xa7\x79"
+ "\x0e\xef\x8d\x6c\xef\x0d\x7e\x1b\xda\xa1\x69\x22\x46\x35\xe8\x36"
+ "\x05\x7e\x43\xfa\x6e\x57\x5a\x2d\xc8\xbf\xca\x78\xb6\x76\x06\xe9"
+ "\xbc\x9c\xda\xa5\xbc\xbf\x56\x65\xef\x70\xc4\xd7\xcd\xd6\x6f\x06"
+ "\x9d\xde\xcd\x7c\x60\xa2\xdf\x35\x66\x63\x30\xbb\xc2\x4e\x02\xf8"
+ "\xfc\x00\xd8\x16\x31\x20\x07\xc0\x9e\x60\x7b\xa1\xc1\x96\x80\xba"
+ "\xec\xc4\x38\x8f\xf8\x1c\xc6\x6d\xfb\x41\x2f\xef\x43\x3b\xe0\xb9"
+ "\xce\x27\x08\xce\xb1\x63\x8c\xd6\x4d\xcb\xa9\x95\xc7\xcc\xa9\xdd"
+ "\x2f\xd9\x02\x28\x83\x50\xff\x83\x2d\xac\xe8\x01\x1e\x02\x06\x2a"
+ "\xc1\xb6\x98\x78\x9e\x69\x0e\x46\xfb\x4a\xa6\xf3\x13\x98\xcf\x66"
+ "\x1f\x2e\xa3\x6b\xed\xd0\x3e\x15\x7c\x03\x68\xd6\xc8\xe6\xc2\xb9"
+ "\x8c\x31\xaa\x24\x3d\x8e\x63\x5e\x13\x94\x41\x41\x96\x89\xcf\xa0"
+ "\xfd\x47\xa4\x58\x77\x60\x57\xd4\x7e\x20\xd2\xac\x9a\xaf\x21\x1b"
+ "\xd9\xd8\x1f\x6c\xae\x10\x91\x36\x95\x68\x57\x88\xef\xf6\xee\x7f"
+ "\xc4\x71\xb9\x00\x76\x05\xd2\x0b\xe9\x04\xe5\x54\x8a\x72\xac\x9e"
+ "\xdb\x2f\xc7\x5e\x12\xd7\x2d\x73\x81\xd7\xe9\x0e\xfa\x1b\xcb\x9c"
+ "\xe9\x0f\xef\x8b\xe3\xc6\x63\xb7\x3b\xf1\x0e\xc6\x46\x75\x56\x9c"
+ "\x27\x85\x3a\x7e\xc0\xe7\x78\x8c\x5f\xa3\xaf\x34\xf4\xcd\x0c\x34"
+ "\xfe\x20\x1b\xfd\x00\x83\x6c\xde\xf6\x15\xc1\xb5\x6f\xb0\x9f\xea"
+ "\xbe\xe6\xf6\x69\x5d\x2a\x62\x18\xee\xd9\x3c\x7c\x33\xd4\x0b\xcb"
+ "\x83\xfb\xa7\xe0\x17\xec\xd8\xba\x5f\x39\xc7\x53\x76\xc4\x52\xae"
+ "\x0b\x73\x9c\x47\x30\xc6\xf2\xf1\xb3\x31\x16\xe7\xc0\x58\xfe\x9e"
+ "\x18\xac\x5b\x23\xf6\x4b\xa9\xad\x18\x57\x19\xd2\xd1\xf6\x6f\x44"
+ "\xbe\x49\xe9\xe8\x43\x18\xf8\xa4\x82\x6f\x9d\x14\xeb\xb4\x1f\xee"
+ "\x95\x70\x3f\x83\xcd\xef\xf7\xb0\xf3\xe6\x8d\xfa\x64\xc7\x3b\xd8"
+ "\x6f\x00\xc3\x01\x90\xe7\x18\xfc\x52\x29\x2f\x8f\xbd\x5c\x17\xf1"
+ "\xbb\x6e\x9c\x03\xab\xd3\x49\xb1\x97\x31\xee\x32\xca\x0c\xfd\x73"
+ "\x2e\xb4\x47\xda\xec\x05\x5e\x31\xdc\x1d\xb6\x1d\x00\x7a\x1f\x03"
+ "\xfb\xff\x6f\x11\xbc\x5d\x75\x11\x62\xfd\xca\xb9\xff\x94\xa3\xb9"
+ "\xcc\xdf\x2f\x1b\x0f\x1d\x0b\xeb\x1d\x0f\xf5\xda\x96\x75\xcc\x8f"
+ "\x2d\x94\x55\x8d\xfc\x47\x3b\x11\xf2\xc5\xf4\x62\x8b\x9d\xf7\xad"
+ "\x6b\x45\xfb\x52\xac\x3f\xe2\xe5\xa8\x48\xbb\x5c\xe7\x7e\xe7\xdc"
+ "\xcf\xa1\x0c\x18\xff\x7f\xd2\x8b\x01\xa9\x5f\x73\x1c\x1c\x17\x63"
+ "\x3f\xf5\xb4\xa2\x0f\x5f\x28\xb7\x1c\x6d\x70\xae\x57\x8f\xef\x3f"
+ "\xdc\x68\xc3\x39\xf4\x7a\xb8\x87\xfe\x7d\x3c\xb7\x63\xfc\x67\xa6"
+ "\x74\x26\x37\x8e\x03\x7d\xee\x63\xb1\x4a\x90\x2e\x52\x7f\xdd\xf1"
+ "\x1c\x8e\xfd\x42\x79\x9f\x4d\x04\x34\x58\xdb\x88\xb8\xd7\x1f\xfa"
+ "\xec\x59\x5c\x3b\x3d\x0f\x18\x52\x62\xff\x05\xfe\xee\x45\x7f\xd3"
+ "\x40\xc7\xba\xf4\x37\x59\xbf\x55\x61\xbf\xed\x41\x1f\x12\xf0\x9d"
+ "\x8a\xc8\x30\x72\x38\xb1\x9c\xf5\x63\xf4\x1f\x52\x00\xb4\xc3\x38"
+ "\xc7\xf0\xed\x24\x69\x8f\x32\x62\x04\xfd\x85\x88\x38\xa9\xc0\xbe"
+ "\x2c\xd2\x4e\x01\xf9\x4a\xa5\xbe\xe7\xc4\x7f\x96\xa7\x4f\x7f\x0b"
+ "\xe0\xfd\xed\x78\xbd\x44\x6b\x1b\xeb\xc7\x75\x3a\x1b\xf4\x63\x67"
+ "\x9a\x22\x3d\x91\xae\x5d\x69\x9f\x41\xfb\x2b\xd5\x12\x4d\x1d\xf4"
+ "\xfc\x6c\xa3\xc8\xf3\x3a\x3e\xc7\xf4\xd9\x1c\x71\xfe\xa9\x97\x86"
+ "\x22\xfe\x50\x0f\x1c\xd8\x86\x6d\x07\xdd\x80\xdf\x47\x8c\x14\x88"
+ "\x32\xab\xc2\x8c\x18\xf9\x0c\xfa\xff\xbf\x6a\x1d\xb2\xa3\x2e\x9e"
+ "\x8d\x59\x80\x4f\x9c\x3f\x9f\x15\x32\x7f\x1b\x03\xc8\x0e\x13\x39"
+ "\xb6\xdc\x21\x9f\x3e\xdb\x2b\xd1\x41\xc2\xa4\xd4\xef\xa1\x8c\x2b"
+ "\xae\xf2\xe7\xb3\xd3\x50\xc6\x24\x94\x6f\x0e\x1b\xea\xb3\x36\x57"
+ "\xf9\xf6\x59\x3d\xca\x37\xc4\xb5\x2e\x01\xe7\xd8\xb8\xbe\x32\x91"
+ "\x9a\x24\x57\x99\x54\xb3\x91\xef\x0d\xe0\x36\x17\x62\x4b\xf7\x1c"
+ "\xcf\x8f\x3a\x0c\xf2\xb3\xb1\xb8\xa8\xf3\x2a\x50\xc7\x41\x5a\x8c"
+ "\x48\xaf\x46\xc8\x5f\x81\xe7\x26\xd1\x57\xc2\x84\x46\x3e\xd6\x03"
+ "\x39\xfd\x01\xfa\xef\x86\x7c\xda\x5a\xf8\x5a\x4f\x06\x97\xdd\x92"
+ "\xac\xa0\xab\x22\x26\xbc\xdc\x4a\x7c\x75\x3f\xa7\xdf\xb4\x90\x13"
+ "\x78\x9e\xd5\x8a\x3e\x24\xa1\x6c\x4d\x0b\xf9\xe2\x18\x7c\x37\x48"
+ "\xfc\x55\xc3\xef\xfb\xf0\x3b\x05\x7e\xdf\x82\xdf\x5b\xe1\x37\x0b"
+ "\xf2\x0b\x62\xfe\x50\xb8\xdf\x08\xe9\x3f\x11\x7f\xa1\x8e\x27\xd0"
+ "\xde\x5c\x22\xda\x8e\x98\xbe\x00\xef\xe1\xf7\x01\x91\xe7\xd5\x9c"
+ "\xe7\x27\x66\x41\x39\x89\x50\xff\x06\x63\x23\x2b\x4b\xd7\x42\x3e"
+ "\xef\xc4\xb2\xf1\x1c\x33\xfc\xff\xb6\x93\x0d\x0a\xe5\x9c\x38\x01"
+ "\xbf\x73\xe0\x77\x17\xfc\xc6\xc3\xef\x3a\x91\x06\x75\x28\x1b\xa2"
+ "\x12\x19\xcd\x33\x35\xdc\xde\x5d\x22\xf5\x79\xd4\xc3\x0e\xd9\x51"
+ "\x5b\x19\xb5\x9c\xf3\xdb\x44\x8e\x33\x1c\x40\xde\x47\x31\x2f\xfc"
+ "\x3e\x2e\xfe\x86\x89\xbf\x0b\xc4\xdf\x5f\x8a\xbf\xf3\xc5\xdf\x85"
+ "\x26\x72\x42\x27\xda\x18\x40\x97\x13\x3a\x6c\x37\xf4\x6d\xd1\x9f"
+ "\xda\xe7\xb9\x38\x46\x06\x39\xfe\x00\x94\xef\xd3\x95\xf6\xb9\x42"
+ "\x9a\x1f\xc5\x39\x9f\x9e\xb4\xa3\x7f\x2c\x60\xeb\xda\x9f\x07\x3b"
+ "\x64\x9b\xd1\xa6\x92\x85\x11\xb0\x81\x6e\x36\xc8\x69\xae\x58\x4e"
+ "\xbc\x5c\x5c\x17\x16\x63\x03\xf8\xa0\xbf\x3c\x36\x1e\xf2\xbb\x29"
+ "\x02\xfb\x2a\x9b\x3b\x46\xdf\x6e\xbe\x75\x04\x2e\x15\x8c\x0d\x02"
+ "\x25\xf9\x8d\xe3\x1e\x3e\x56\x1f\xf7\x19\x7c\x2b\xd3\x31\x56\xff"
+ "\x7c\x2e\x5f\x43\x9b\xbc\x11\xd2\x4b\x1c\xe9\x27\xf0\x3c\xc0\x03"
+ "\x40\xcf\x06\x68\xcf\x9c\x26\xf2\x39\xfa\xf0\xbf\xbf\x99\xb7\x39"
+ "\x54\x6a\xb3\xc8\x0f\x9d\x44\xdf\x66\x72\x22\x11\x64\x61\x1c\x62"
+ "\xb8\xa9\x57\xce\x9e\x60\xf3\xba\x22\x46\x80\x97\x27\x66\x23\x4f"
+ "\x9d\xfa\xa0\xb3\x0c\x0a\xea\x4a\xfb\x42\xeb\x2a\x53\x8c\x5a\x94"
+ "\x29\x88\x0d\x90\xdf\xc8\x6b\x65\x9f\xfe\x57\x8f\xfd\x8f\xf7\xbb"
+ "\x2f\xa2\x5c\xdf\xfd\xac\xde\xc6\xfb\x5d\x03\xe0\x0c\xf0\x59\x8f"
+ "\xf1\x21\x40\x0e\x7d\x31\x5f\xec\xd3\x0d\xd0\xa7\x1f\x80\xf4\x3a"
+ "\x5e\x57\x9e\x2e\x7e\x0b\x70\x56\x8f\xed\xbe\x55\x4a\x17\xdb\x8b"
+ "\xe5\xa0\xcf\xff\x29\x52\xba\x58\x3e\xe0\xb1\xfe\x00\xf6\x13\x29"
+ "\x5d\x6c\x13\xd8\x51\x5f\xd8\x24\x79\x92\xcd\xf1\x96\x2e\xbd\x87"
+ "\x7c\x43\xff\x58\x7c\x8e\xff\x0b\x3c\x5b\x51\x82\xfa\x61\xdb\x73"
+ "\x44\xf5\x72\x1e\xf1\xe3\xfd\xf2\x8b\x56\x57\x19\x79\xea\x28\x4d"
+ "\x0b\xb0\x51\xa5\xd1\x5a\x63\x9b\x23\xd9\xab\x86\xae\xb4\x86\x28"
+ "\x29\xce\xb7\x23\xce\x40\xc3\xae\x9a\x92\x5e\xfa\x42\x5d\x1a\x32"
+ "\xa5\xba\x38\xe9\x67\xc6\x03\xac\x1b\x96\xb5\x0d\xec\x75\x0b\xc8"
+ "\x05\x2e\xb7\x1b\x0e\x98\xc8\x04\xc9\xde\x65\x7a\x2b\x40\x46\x74"
+ "\x39\x09\x6c\x7d\x34\x00\x75\x23\xee\xf1\x11\x70\x1e\x2b\xd1\x4e"
+ "\x6a\x75\x30\x96\x4f\x3c\x4b\x56\xbc\x32\x1e\x7d\xaf\x44\x40\x5d"
+ "\xdf\x81\xba\x95\xda\x71\xee\x7f\x3d\x8e\x53\x4f\xad\xb4\x27\x50"
+ "\xab\x48\x33\xe8\x47\xa7\x16\x88\xb4\x45\xf9\x55\x8a\x32\x7d\x5b"
+ "\x32\x8f\x19\x84\x73\x39\xd8\x3f\x7e\x87\x7a\x4c\x4d\xad\x15\x06"
+ "\xec\x2b\x27\x17\x4a\x36\x29\xd4\xb7\x84\xdb\x84\xc7\xf7\x30\xdf"
+ "\x44\x60\x79\xf3\xb9\xc0\x93\x27\x78\xdb\x4f\x7e\xc0\xd7\xb9\x99"
+ "\x8f\x4c\xbc\x2f\xf3\x51\xdf\xf2\x05\xdf\x97\x75\xf4\xef\x7c\x4f"
+ "\xc9\xc9\xbc\xde\x3d\x25\x0e\x5b\xb1\x9c\xfb\x8d\x3a\xb9\xdf\xd1"
+ "\x27\x4e\xa6\xe3\x7b\xf0\xfe\x79\x48\xaf\x76\xa4\x1f\x2f\xe5\xf6"
+ "\x80\xd1\xe6\xbf\x35\x0c\xf7\x96\xdd\x8c\xbe\xb6\xf9\xf7\x4e\x85"
+ "\xb0\xef\xb3\x39\x0f\xa3\x4d\xea\xbf\x48\x67\xd4\xd9\xac\x0f\x43"
+ "\xff\xc5\x7e\xdc\x93\x55\x47\xe0\xe2\xfd\x96\xeb\xe6\x72\xd6\x6f"
+ "\x59\x9f\x3d\x35\xcf\xa9\x1e\x16\x36\xef\x85\xfc\x7c\x55\xad\x82"
+ "\x67\x11\xa0\x57\xeb\xc4\x67\x3c\xa6\xc4\x79\xe6\x23\xcf\x8c\x6b"
+ "\xdb\xb8\xd6\x89\x67\xb4\x02\x00\xdd\xe8\x13\x44\x5a\xab\x5e\xdc"
+ "\x96\x42\xed\xb8\xee\x74\x99\x5a\x72\x7b\x7d\xfd\x9f\x2a\x75\xf8"
+ "\xf7\x39\xa9\x10\xdb\x65\x85\x6f\x19\xf8\x5e\xb0\x86\x4e\x6e\x53"
+ "\x35\x58\x10\xa7\x46\xc0\x1e\xfc\xe6\xf1\xb8\xcc\xa7\x4c\x12\xf6"
+ "\xa0\x5f\x46\xb5\x90\x2f\x37\xee\xbc\x85\xe6\x01\x4f\xf3\xa0\x2f"
+ "\xc5\xc2\xfd\xb3\xf0\x1b\xc5\x7f\x65\x81\xf8\x2b\xf6\x91\xbc\xae"
+ "\xb4\x2f\x83\xa5\x78\xf4\x48\x1b\x8b\x6f\x4f\x24\xe2\x2c\x07\xe8"
+ "\x80\x58\x63\xeb\xc8\x50\x6f\xc4\x17\xe2\x0c\x31\x16\xb0\xf5\x09"
+ "\x86\x33\xe6\x7f\x20\x11\xf7\x20\x9f\x54\x20\xce\xa0\xac\x18\xc9"
+ "\xcf\xaf\x89\x7c\xa9\xe2\xeb\x39\x5f\x26\x49\x7b\x6e\x71\x2d\x29"
+ "\xfe\x76\x72\x33\x94\xab\xa9\xd0\x30\x5f\x9a\x67\x8c\xb6\x05\x04"
+ "\xf3\xe2\x3a\x1c\x97\x93\x93\x2b\xe0\x9d\x7d\x0e\x9a\x1b\x59\x6c"
+ "\xe6\xc3\xcb\xd9\x5c\xe4\x4d\xf0\xac\xda\x79\x9c\x61\x22\x55\x79"
+ "\x38\xd6\xc0\xbd\x7d\x77\x06\x11\x5c\x07\x06\x39\xf6\xa5\x59\xb2"
+ "\x6b\xef\x0b\xc2\xf5\xfc\xaa\xf9\x50\x3f\x1c\x43\xd7\xc1\xff\xa1"
+ "\x30\x96\xac\x74\x33\x67\x3c\x07\xe7\x7a\xc4\xf8\x3c\x8d\x38\x8f"
+ "\x85\xf1\x0c\x5a\xc8\x99\x8d\x35\xe8\x0b\x64\x43\x7f\x3f\xcf\xc9"
+ "\x89\xb4\x13\x7d\x3d\x6b\xe2\xc8\x4d\x4d\xe4\xcc\x52\x9c\x37\x4a"
+ "\xb9\x84\x73\x34\x8d\x89\xae\x73\x34\x8d\x95\xe2\x05\x23\xed\xd3"
+ "\x61\x4e\x57\x9d\xf8\xbb\x68\x88\xab\x55\xcc\x0b\x2d\xfd\x4a\xd4"
+ "\x29\x6a\xe8\x27\x8d\xbd\xf3\xbf\x88\x4b\xec\xdb\xb8\x8f\x03\xe7"
+ "\x9c\x64\x36\x82\xbe\x47\x80\x4f\x50\xef\x6d\xf7\x3c\x5d\xbe\x19"
+ "\x71\x74\x9a\x9d\x83\x42\x1f\xc4\xc3\xdb\x4b\x74\x9a\xf1\x93\xfb"
+ "\x03\x6d\xac\x83\x6f\x07\xed\xb8\x48\x14\xba\x38\x32\x0d\xe7\xbf"
+ "\x03\xec\xb4\x1c\xc7\xb8\xa2\x4f\xc1\xba\xf3\xe4\xf4\xb1\xf8\x2d"
+ "\x44\x0e\xcf\x6f\x83\xff\xcb\x25\x3b\x09\xde\x09\xf4\xb1\x92\x20"
+ "\xb4\x8f\x1e\xdf\x42\x6e\xeb\x4a\x3b\x6d\x90\x78\x85\x36\x04\xce"
+ "\xc3\x89\x73\x09\x50\xd7\x46\xb6\xc7\x19\xfd\xd4\x9b\x18\xdd\x98"
+ "\x1c\xc6\x32\x60\x0c\x7b\x3a\xd3\xc7\x42\x02\xb9\xee\x39\x0d\xf8"
+ "\x3f\x2a\xda\x8c\xa7\x4b\x01\xfb\xf5\x4e\xf5\xfc\x85\xd3\xff\x19"
+ "\xf8\x7e\x80\x05\xed\x33\x77\xf4\xf9\x6a\x96\x44\x1f\xdc\xaf\x1a"
+ "\x00\xe3\x04\xc6\x6f\x1b\x6d\x83\xba\x55\xeb\x36\x13\xe5\x79\x72"
+ "\x66\x5a\xf1\x9b\xec\x9c\x5d\x25\x9f\x9f\x3f\x33\x51\x1a\x87\xf3"
+ "\x7a\x7f\x75\x3a\x60\xab\x0f\xc1\x79\x75\xf4\x77\xc6\xf6\xfa\x7d"
+ "\xa7\x66\x73\xe9\x46\xdb\x3c\x52\x9e\xfc\x53\xcc\x23\xd9\x55\x8d"
+ "\x1d\x29\x6a\x72\x58\x3d\x0f\xfa\xf1\x57\x65\x26\xd9\x91\xb9\xc3"
+ "\xdf\x53\xf9\x55\x99\x48\xdf\x6a\xbe\x17\xe1\xab\x57\x50\x97\xe0"
+ "\xd8\x1f\xf4\x48\x05\xea\xe8\xae\xb4\x33\x0a\xa9\xdf\x80\xde\xa8"
+ "\x80\x77\x44\x7f\xd8\xb8\xfe\xfb\x55\x3c\xfa\x80\x60\xe3\x06\x9e"
+ "\x5f\xc5\xe7\xfc\xcf\xcc\xed\xb5\xa5\x21\x1f\xbe\xc7\xf7\xa8\x7d"
+ "\xb5\x68\x85\x5d\x06\x34\xfd\x6a\x11\xb6\x4d\xc4\x22\xe8\xab\x33"
+ "\x31\x8e\x7e\x7b\x9a\xc9\xe6\xc3\x6d\xce\xfd\xf2\x4c\xa6\x63\xbc"
+ "\xd9\x38\x6f\xd6\x4e\xa2\x19\xa8\x1f\xea\xfc\x51\x57\x9d\xb9\xb2"
+ "\x63\x07\x2d\xc9\x95\x0b\x8f\x6d\xcb\x21\x2a\x59\x36\x90\x0d\xfb"
+ "\x59\x42\xe4\xcd\x2d\xc4\xe4\x1b\xa0\x9a\xbc\xe4\xf1\xf8\x71\x34"
+ "\x59\x4d\xe4\xfa\xf6\x71\xca\xdb\xad\x93\x4b\xa8\xcf\x3d\x4f\x2f"
+ "\x8e\xb7\x12\xcd\xda\x5c\xf2\x6d\x2c\xf1\x79\xdc\x0e\xdf\x56\x11"
+ "\x9d\x89\x34\x05\xe1\x99\xd1\xc3\x2a\xb4\x3f\x9a\x82\xb0\xcc\x24"
+ "\x03\x51\x26\x35\xd3\xd6\xec\xd5\x63\x94\xa0\x0f\x02\x0b\x00\x63"
+ "\x13\x54\x93\x4b\x7a\xa0\x8c\x43\x91\xec\xbd\x01\xcf\x46\xf3\xba"
+ "\x99\x7e\x3f\x70\xdd\x74\xb7\x40\xdd\xf6\x0c\xaf\x6e\xdf\xec\x77"
+ "\xd4\xed\x9b\xfd\x23\xaf\xdb\xd7\xb3\x9d\xea\x16\xe8\xa8\x5b\x0c"
+ "\xd4\xed\xeb\x47\x87\x57\xb7\xb3\x4b\x1d\x75\x3b\xbb\xd4\xc3\xba"
+ "\xed\x1d\xa4\x6e\x35\x03\xd7\x2d\x71\x32\xd4\xed\xf4\xf0\xea\xd6"
+ "\x62\x71\xd4\xad\xc5\x32\x92\xba\xe1\x58\x3e\x39\x98\x9e\x65\xfe"
+ "\xe4\xe3\xb8\xbf\xd6\x16\xf2\xcd\xc3\xc9\x06\x76\x3f\xa9\x85\x34"
+ "\x5d\x11\xfb\xb7\x39\xc5\x42\xbf\xe1\x76\x4e\x53\xf4\xbd\x3a\xdc"
+ "\xef\xda\xb4\x1c\xb0\x1c\xc4\x31\xfd\x0d\xdb\xdf\x90\x62\xa6\xe2"
+ "\x7e\xd3\xa6\xd7\x8a\xd8\x7e\x94\xfa\x4c\xf1\xbe\xb2\x63\x7c\xdd"
+ "\x1c\xdc\x0b\x22\x40\x7f\xa6\xe3\xeb\xc2\x30\x7e\xe7\xbb\x71\x66"
+ "\x39\x4d\x43\xdf\x61\xe8\xef\x4f\x41\xe8\xf6\xba\x25\xef\xc6\x59"
+ "\x59\xec\xf0\x6d\xec\xbc\x6f\x53\xb9\x74\xc6\x4d\xfa\x86\xd9\xb7"
+ "\x3e\x13\xd2\x1b\xa4\x38\xb0\x54\xae\xc4\xb1\xc7\x5c\x2c\x1f\xd2"
+ "\xcd\x52\x6c\x56\xc0\x7b\xba\x28\x1b\x2c\x01\xd6\xc1\xe4\xde\x37"
+ "\x33\x25\xb9\xf7\x78\x3c\x09\xc0\xb8\x94\x3b\x92\xc7\xe1\x9a\x23"
+ "\x94\xd5\xb4\x1f\xe9\x1e\x6e\x19\x47\x03\x92\x88\x0f\x9e\xed\xc3"
+ "\x3d\x7a\x46\xb5\x99\xcc\x48\x22\x63\xc2\x13\xa1\x4c\x2b\x89\x0c"
+ "\x48\x84\xf2\x80\xd6\x7c\x6c\xf0\x0d\x9b\xe3\xdb\x09\xe5\xe1\xfa"
+ "\xb7\x4f\x3c\x51\x3d\xae\x4e\xa1\xdb\x76\x11\x05\x9e\x03\xc4\xf3"
+ "\x7c\xfc\x2c\xdf\x58\x65\x57\xda\x37\x25\x52\xfb\x3c\xe0\x8f\x3f"
+ "\xe7\x4f\xf3\x69\x07\x7f\x9a\x77\xf5\xe7\x4f\xf3\x18\xce\x9f\x6f"
+ "\x6c\x0e\xfe\x9c\x0d\x73\xe5\x4f\xf3\x4c\x57\xfe\x34\xc7\x78\xc7"
+ "\x9f\xe6\x48\x07\x7f\xf8\x37\x38\x7f\x9a\x13\x07\xe6\x4f\x73\xae"
+ "\x83\x3f\xcd\x33\x3c\xe3\x4f\xf3\x11\xf7\xfc\x69\x5e\x3a\x08\x7f"
+ "\xc6\x0e\xcc\x9f\xb3\x37\x7b\xce\x9f\xb3\x61\xc3\xe0\x8f\x1f\xe7"
+ "\x4f\xcb\x16\x07\x7f\x5a\x1e\xea\xcf\x9f\xb3\x7b\x38\x7f\xce\x1a"
+ "\x1c\xfc\x69\x31\xb9\xf2\xe7\xec\x11\x57\xfe\xb4\x28\xbd\xe3\x4f"
+ "\x0b\x71\xf0\x87\x7f\x83\xf3\xa7\x45\x3d\x30\x7f\x5a\x42\x1d\xfc"
+ "\x39\x5b\xe1\x19\x7f\x5a\xa2\xdd\xf3\xe7\xac\x65\xf8\xfc\x69\xf9"
+ "\x4b\x1f\xfe\x04\xba\xe7\x4f\x8b\x69\x18\xfc\x09\xe0\xfc\x69\x9d"
+ "\xe6\xe0\xcf\xb7\x27\xfb\xf3\xe7\xdb\x05\x9c\x3f\xdf\xce\x73\xf0"
+ "\xa7\x35\xd5\x95\x3f\xdf\x46\xbb\xf2\xe7\xdb\x32\xef\xf8\xf3\x6d"
+ "\x89\x83\x3f\xfc\x1b\x9c\x3f\xdf\x1e\x18\x98\x3f\xdf\xd6\x39\xf8"
+ "\xf3\x6d\x94\x67\xfc\x69\x1d\xe3\x9e\x3f\xdf\xee\x1c\x84\x3f\xe3"
+ "\x06\xe6\x4f\xeb\x33\x9e\xf3\xa7\x35\x75\x30\xfe\x0c\xcf\xd6\x6b"
+ "\xdd\x89\xdf\x1d\x85\x72\x1a\xdd\x95\x83\xb4\xc3\xfd\x87\x42\x5a"
+ "\x6b\x63\x91\x30\x56\xc9\xcf\x68\xb4\xee\xd4\x6c\x26\x8f\x34\x91"
+ "\x73\x77\x17\x09\x63\x94\x34\xad\x0c\xc6\x49\x7f\xc8\xa3\x5b\xc7"
+ "\x2a\x84\xad\xe3\x14\x78\x36\xdb\x7d\xfc\xf6\x73\x59\x3e\x53\xc8"
+ "\x74\x3c\x47\xb7\x0d\xec\x65\xfc\xbf\x2b\xed\xdc\x4e\xb0\x05\xc3"
+ "\x06\x3b\xbf\x85\x7b\x9d\x0e\xa7\xe3\xf8\xf6\x5c\x79\xaf\x5f\x8c"
+ "\x34\x9a\x88\xfe\xc5\x74\x77\xe0\x39\x8b\x73\xad\xe8\xeb\x1b\xc6"
+ "\xab\x15\x61\x77\xd0\x33\x38\xf6\x68\x21\xe7\xcf\xd2\xac\x2a\x8c"
+ "\x8d\x69\x01\x5b\xfd\xa6\xf3\xe4\x7c\x68\xef\xfe\x3c\x1a\x91\x2f"
+ "\xce\x11\xea\x78\xde\xb6\x67\x20\xaf\x0e\xe3\x90\x6e\x4a\xc6\xf8"
+ "\x9a\x6d\x0f\x83\xed\xfb\x23\xfc\x06\xfa\x4e\x2a\x86\x5f\xdc\x27"
+ "\xc3\xf7\x66\x9e\x5f\xc2\xec\xe5\x6d\xb7\xe6\xf3\xbd\x70\x6d\x33"
+ "\x25\xdc\xc1\x77\xc6\xc3\xbd\x9f\x68\xcf\x63\xfe\x09\xe7\xc9\x3f"
+ "\x3a\x9d\x9e\xab\xe0\xfe\x24\x94\x3d\x51\x7c\xee\x07\xf7\x07\xd1"
+ "\xce\x66\x7e\x3e\x72\x52\xc5\x3d\xc4\xff\x28\x81\xb4\x40\x31\xcf"
+ "\x44\xc8\xf3\x1a\xda\xee\x62\x19\x93\xe0\x7e\x0d\x8e\x81\xc5\xe7"
+ "\x41\x70\xbf\x18\xd7\x0e\xc4\xe7\x37\xc3\xfd\x6c\xb8\xbf\x8b\x9f"
+ "\x79\xe9\x11\xfb\xe8\x79\x9b\x77\x67\xc6\xcf\xb3\x98\x9a\xc8\x03"
+ "\x3e\x16\xf8\x87\xd3\xfe\x9f\xf3\xcd\x7d\x9e\x45\x3a\x3d\xab\x97"
+ "\x9e\xf1\x3d\x6a\xff\x48\x72\x7a\x56\xd1\xe7\x59\x9e\xd3\xb3\xfd"
+ "\x7d\xca\xdc\xef\xf4\xac\xb4\xcf\x7b\x75\x4e\xcf\x72\xfb\x3c\x6b"
+ "\x73\x7a\x96\x2a\x3e\xf3\xe9\x4a\x6b\x53\x38\xd6\xf0\xce\xeb\xc4"
+ "\x74\x39\xa4\x07\x3b\xa5\x47\x8a\xe9\xf0\xfd\xb6\x39\x26\x52\x60"
+ "\x16\xd3\x19\xef\x79\xf9\x6d\x8b\x9c\xca\x0f\xe5\x73\x1c\x6d\x91"
+ "\xbd\x7b\xe7\xc6\xd7\xe5\x0a\x3d\x11\xf9\xf0\x4c\x8d\xb8\x72\xc6"
+ "\xf6\xfa\x04\xcd\xf3\x2f\xbd\xa0\x89\x8b\x8e\xc7\xed\x2b\xeb\xd6"
+ "\xc4\x6b\xd6\x6d\x88\x8a\x76\xf1\xb3\x1e\x84\x3e\x07\x31\xa6\x1a"
+ "\xfa\x6e\x61\xf1\x0b\xde\xa4\xad\xbd\x31\x3f\x40\xae\xc2\xb7\xaa"
+ "\x4d\x64\x01\xfb\xd6\x4e\xee\x8f\xbc\x12\x7d\xbf\x70\x3f\x2f\xe4"
+ "\x89\x26\xd2\x76\x4c\xf4\xf3\x52\x0e\x79\xad\xee\xfd\xbc\x5c\xac"
+ "\x67\xfe\x0d\x21\x1f\xf7\xf3\x72\xb1\x01\xfa\xf9\xe3\x74\x3c\x8f"
+ "\xe1\xc1\x63\x9b\x5d\x90\x6c\x13\xf3\x8a\x2b\xcc\x47\x60\x2a\x9f"
+ "\xcb\xe8\xeb\xaf\xb5\xaa\x14\xdf\x13\xd7\x4b\x4b\x9d\xde\x8f\xe2"
+ "\xcf\x25\xfd\x20\x7e\x33\xb3\x0a\xcf\xb9\x8e\x6f\x82\x7b\x36\x7f"
+ "\xcf\x9e\x5d\xe0\x73\x79\x59\x55\x7b\xb1\x4d\xd8\x6e\xd7\xb6\xc9"
+ "\xff\xad\x89\x5c\x78\xc7\xd1\xb6\x0b\xf5\x4e\xbe\xe0\xc4\x36\x5c"
+ "\xb0\xf1\x3e\xda\xaf\xad\x6c\x7f\x22\x55\x56\xed\xc5\x6f\xa3\x3c"
+ "\x63\x75\xf5\x85\xfb\xac\xaa\x32\xa9\x3e\x4e\xf5\xdb\x8b\xe3\x7a"
+ "\xa8\xdf\x49\x4e\x13\x90\x1f\xc0\x53\xb1\x0d\xbb\x68\x5a\x5b\x12"
+ "\x8f\x65\x00\xfa\x04\x63\xb2\x30\x5d\x75\x31\x4a\x9a\xcb\x44\x1d"
+ "\xc5\xe7\x30\x2f\x3a\xec\x3f\xf4\xd1\x95\x25\xe9\xaf\x8b\x4e\xf6"
+ "\x1f\xff\x26\xa4\x95\x3a\x63\xc8\xe9\x7b\xc7\xf0\x7b\x90\x6f\x11"
+ "\x3f\x0f\x50\x55\x86\xfd\x1d\xee\x03\x71\x2f\x26\xbe\x8b\x75\x74"
+ "\x17\x87\xcf\x9d\x0f\x45\x07\x1d\xbf\x0b\x96\xe8\xb8\x93\x9d\x91"
+ "\xff\x2e\x44\x9a\xaf\x13\x63\x60\x94\xef\xec\x8d\x4b\xfd\x5d\x04"
+ "\x8b\xed\x96\x3d\xb9\xf2\x3e\x15\x89\xe4\xb4\xfd\x6e\x25\xca\x78"
+ "\xec\x33\x5c\xd6\x7f\x57\x2e\xf2\x3c\x92\xd7\xff\xbb\x2c\x4c\x77"
+ "\xec\xbf\xff\xce\x24\xe5\x93\xe4\x32\x5f\xaf\xfa\xee\x7d\x96\x8f"
+ "\xc7\x0a\x8e\xe1\x3c\xbf\x2b\xb0\x89\x7c\x57\x2d\xe6\x3f\xc7\xb0"
+ "\xc8\xfc\xf7\x7c\xd7\x4a\xb3\xea\x63\xa0\xae\x30\xfe\x69\x13\x63"
+ "\x56\xf0\xef\xc2\x6f\x35\xd6\x05\x69\x84\x67\xc9\xa9\x7e\x72\x25"
+ "\xf0\x67\xc0\xb3\x5a\xe2\xbe\xee\xdb\xce\x93\x4b\xdc\x86\x90\x53"
+ "\x2b\xce\xb1\xf2\xb6\x5e\x8a\x76\xda\xfb\xac\x92\xf2\x70\xd9\xcd"
+ "\x9e\xb1\x3d\xe5\xba\x04\x9c\x0f\x12\x9f\x25\xe0\xf9\xda\xde\xff"
+ "\xc7\x3a\xfd\x3f\x06\xff\x67\xfb\x9a\x37\x33\xdd\xaa\x70\x9c\xe3"
+ "\xbf\x14\x05\xf7\xaa\x3e\xf7\x41\x2e\xf7\xaf\xf0\x7d\xcf\x60\x9b"
+ "\x35\xb3\x3d\xe4\x62\xba\x58\xb6\x2f\xab\x4f\x02\x9d\x0b\xd8\x38"
+ "\x80\x67\xba\xc5\x7e\x78\x00\xcf\x6c\x07\xd8\x9e\x65\xe7\xb5\xe1"
+ "\xf9\x1c\xf1\x37\x54\xfc\x0d\xe1\x71\x5a\x2f\x05\x3b\x62\xad\xe3"
+ "\x1c\xcd\xa5\x10\x77\xb1\xdf\xf1\x3c\xb8\xf8\x1b\x2a\xfe\x86\x88"
+ "\xb1\x6a\x97\xc3\x7b\xbd\xe7\xbf\x07\xde\x83\x7c\x29\x5d\x3a\xcb"
+ "\x6d\xcf\xac\x5a\x2e\x64\x1e\x5b\x88\x71\x41\xd1\x4f\x58\x4a\x1b"
+ "\xfa\x8a\xb1\x10\x23\xe9\x26\xc6\xf8\xae\x54\x8c\x0d\x5a\xcb\x63"
+ "\x82\xe2\x19\x58\x19\xce\x9b\xa3\xed\x58\xab\xbb\xc0\xe2\x82\xbe"
+ "\xdc\x26\xc5\x3d\xb9\xd4\x6a\xcf\xaa\x5a\x2e\xf6\x97\x5d\x7c\x8f"
+ "\x7e\x3b\x9b\x2f\x66\x71\xad\xdb\xd8\xba\x97\xb2\x85\xb4\x27\x4a"
+ "\x79\x38\xed\xda\xd9\xdc\x57\x71\x9a\x14\xfb\xb1\x5d\x23\xc5\x9a"
+ "\x36\x91\xf6\xa4\x4e\xdf\xcf\x1b\x20\x6d\x8e\xeb\x9e\xe9\xf6\xc5"
+ "\x58\x26\xd6\xdd\x44\x2e\x99\xb1\x6c\xc8\x13\xd1\xdb\x67\x21\xfd"
+ "\x65\x1b\x99\x0a\xf5\x6a\x91\xca\x87\xe7\xd0\xff\xcd\x8c\x96\x58"
+ "\x66\x67\x96\x1d\xe8\xd0\x9e\x6d\x92\x17\x2e\xe2\x7b\xae\xdb\x41"
+ "\xff\xfd\xf7\xfc\xc1\x6c\x20\xe8\x0b\x79\xd0\x97\x4a\x84\xcc\xfa"
+ "\x5c\xe6\xcb\xdb\xb7\x3e\x8f\xcf\x31\xb6\x9f\xc5\xdd\xe1\x3b\x2e"
+ "\x13\x05\xee\x81\xe0\x98\xed\xe0\x3e\x90\x21\x0d\x64\x75\x19\xf4"
+ "\x11\x36\x57\x30\x3c\xbd\xdf\x6e\x61\x65\x4c\xe5\xbe\xcd\xf0\xec"
+ "\x52\x57\x5a\x47\x58\x6f\xfc\x84\xde\x7e\xdc\xb1\x06\xd7\x1e\xa0"
+ "\x7f\xb0\x3a\xf6\xad\x03\xd6\x17\xca\x6a\x76\x6b\x63\x2a\xeb\xd9"
+ "\xfa\x2c\xc8\x80\x48\xbe\x47\xb5\xe3\xcf\x3e\xea\x5b\x5b\xe1\x5b"
+ "\x7b\x7b\xe3\x46\x40\x9e\x1c\xdc\x7b\x0f\xe5\xf7\xb6\x33\x8e\x7d"
+ "\xa3\x9e\xf7\xf5\x8e\x56\x21\xab\x3e\x77\x47\x37\x51\x88\xe9\xad"
+ "\xb5\x36\x2b\xc6\x1e\x18\xd0\xcf\x16\x8b\x9d\x87\x7b\xc2\xb7\xd7"
+ "\xe7\xe2\xb9\xa1\xfb\xac\x52\x9d\x2d\xad\x78\x5e\x05\xeb\xcc\x69"
+ "\x6b\x39\x2d\xd1\x51\xdf\x0e\x65\x27\x9f\x22\xcd\xc4\x12\x8d\xfb"
+ "\xe6\x18\x4d\x36\x4b\x7b\x39\x2d\x6c\xcc\xc7\xbe\xcf\xf3\xb0\xb1"
+ "\x3f\x8b\x63\x04\xe5\x17\xb1\x58\x6c\xd0\x06\xe0\x45\x79\x32\x9e"
+ "\xf9\xb7\xb0\xb8\x00\xdb\x98\xaf\x0e\x68\x37\xdb\x27\xdb\x29\xae"
+ "\x93\x58\x4a\x25\x5d\x61\x12\xd3\x76\xe0\xb7\x13\xba\xc9\x45\x62"
+ "\x79\x0d\x63\xac\x03\x3d\x4a\xd0\x3f\x5d\xad\x05\xfa\x49\x62\x37"
+ "\x62\xa1\x04\x63\x77\x9a\x88\x25\x9d\xeb\x37\xa4\xb9\x25\x06\xbf"
+ "\x8f\xb4\x85\xb1\x99\x19\x68\x7a\xb9\x2b\xad\xb3\x37\xfe\x63\xce"
+ "\x2d\x38\xde\xb1\x0c\xea\x5f\xd7\x0e\x75\xae\xcd\x03\xdd\x39\xf5"
+ "\x14\xd6\xef\xa8\x30\xbe\x3e\x17\xf7\x64\xc3\xff\xeb\x44\xd9\xce"
+ "\x78\xc7\x71\xd0\xf9\x96\x8f\x3a\xf8\xf6\x5a\x8e\x05\xe6\x43\x0d"
+ "\xd2\x16\x8a\xf4\x63\xf1\x24\x72\x13\x38\x1d\xc4\xfc\x36\x3e\x5f"
+ "\x1c\x7c\x17\xd4\xcb\x29\xfe\x5d\x27\xd3\xdd\xe8\xfb\xbe\x88\x8d"
+ "\x09\x3b\xf7\x3b\xd5\xd9\xc2\xce\xbf\xb6\xe3\x5c\x5f\xe7\x72\xfc"
+ "\x96\x1e\xfd\x87\x21\x2e\xce\x3b\xe3\xbf\xf3\x61\xac\x27\xee\xf9"
+ "\xb5\xfb\xd6\x45\x82\xbe\x8d\x42\x3a\xc3\x3b\xf1\xd0\x17\x72\x07"
+ "\xd1\x85\x2c\xee\x5e\x57\xda\x65\xad\xa4\x0b\x61\x7c\x01\x7a\xa1"
+ "\xeb\x76\x36\xee\x04\x7b\xda\x28\xa0\x3d\xd3\xa5\x41\xdc\x40\x5f"
+ "\x2f\x11\x65\x6c\x09\xbc\xb3\x5c\x5a\xf3\xb2\xe3\xb9\x89\x8b\x6c"
+ "\xbd\xd7\x22\xc5\x93\xe3\xfe\xfa\x2e\xa7\x3a\xce\x59\x5c\xce\xee"
+ "\x77\xce\x02\xcf\xfe\xbc\xc9\xe2\x8e\xed\x45\x9d\x52\xd3\xd6\x8c"
+ "\x3a\x82\xbd\x8f\x67\x2f\x92\x61\x4c\xce\xcf\x0f\x35\xe3\xfc\x3c"
+ "\x8b\x79\x82\x75\xe1\xb1\x27\x9a\xd8\xff\x80\x5b\x05\xfe\x72\x2c"
+ "\x5d\x36\xf7\xc6\x4c\x07\x7e\xe3\x5a\xdb\x61\xc5\x2f\x48\xf9\x1d"
+ "\xa8\xaf\xbb\x6e\xc7\xf8\xdf\x5d\x69\x5d\x41\x52\xec\x6f\x16\xeb"
+ "\x9b\xb7\x67\xa7\x5b\xbf\x8c\xf7\x92\x50\xf4\x17\x80\xe7\xeb\x18"
+ "\x0d\x54\x93\x63\xd0\xd7\x33\xfa\xad\x2c\xdf\x8c\x31\x59\xba\x8e"
+ "\xfd\xee\x16\x76\x46\xd9\x52\x7e\x6f\x3b\xee\xc3\x6a\x6b\x49\x62"
+ "\xfe\x98\x94\xe1\x89\x36\x8a\xef\x31\x7b\xc2\x6f\x32\x9e\x37\x6e"
+ "\x63\xb1\x0e\xb0\x4c\xaf\xfd\x16\x77\x19\x44\xdb\xb4\x0d\xc6\x3e"
+ "\x93\x81\x57\xcc\x76\x87\xff\x6f\x39\x4f\xac\x57\x78\x0c\x5a\xee"
+ "\x7b\x5f\xdc\x8f\x3d\x96\xfb\xd8\x00\x9a\x31\x9f\x07\xd6\x75\x9a"
+ "\x7b\x30\x5e\xb3\x75\x23\xf3\x83\x9d\x59\xb5\x4f\xa4\xc1\xbe\x1d"
+ "\xbc\x5e\x01\x2b\x12\xe5\xac\x8e\x58\xbf\xe1\xd5\xcd\x3a\x57\x1c"
+ "\x47\x8c\xed\x4a\xb3\x26\x49\xbe\x39\xb8\x3d\xc5\xfd\x63\x73\x5e"
+ "\x58\xcf\x89\xf6\xf3\x7e\xf1\xdb\xfb\x47\xe1\xdb\xfb\xc5\x32\x33"
+ "\xb9\x8f\xf0\x2e\xe8\x07\x55\x60\x9f\x5e\x51\x48\xe3\x19\xf1\x0c"
+ "\x51\x08\x1f\x67\x5d\x09\x76\x8c\x67\x38\x0d\x5d\xce\xdd\x6d\xd8"
+ "\x10\xaf\x89\x5a\xb3\x49\xb7\x32\x7e\x55\x8c\x26\x3a\x2e\x6e\x43"
+ "\x9c\x06\x9d\x34\x39\xf7\x1f\x1e\xc7\xe8\x4a\xa8\x18\x9f\xb0\xcc"
+ "\x11\x9f\xf0\x4a\xa2\x73\x4c\x4f\x13\xb9\x92\x34\x3a\x73\x17\x57"
+ "\xf2\xdc\x95\x93\x2b\x17\xf6\xc1\x75\x00\xae\x72\xb8\x2a\x71\x2e"
+ "\x63\x85\x95\x84\x81\xae\x67\xfb\x4c\x1c\x3e\x27\xae\xa0\x5f\xf2"
+ "\xb0\x26\x72\xa5\xb3\x48\x50\xe0\x38\x08\xe3\x86\xef\xc3\xfc\xc5"
+ "\xf0\x3e\x5c\xe5\x70\x55\xc2\xc5\xde\x13\x3e\x66\xe7\xe5\xf7\x39"
+ "\x3f\xe3\xfb\x47\xb6\xee\xc5\x3c\x74\x2b\x2e\xd9\x43\xbe\x7f\xe7"
+ "\xf9\xfa\xd4\x41\x4e\xd3\xda\xa5\x7c\x6c\x6d\xdf\x7f\x2b\xd1\x0c"
+ "\x90\xcf\x87\xa6\x9d\x2b\x13\xf3\xb1\xbd\x36\x52\x7b\x30\xd6\x00"
+ "\xe4\x97\xf2\x29\x68\x5a\xd7\x1c\x31\x1f\xd3\x15\x42\x9a\x7c\xa0"
+ "\xef\x8e\xa1\x69\x07\x82\xc5\x7c\x81\xce\xe5\x39\xe5\x19\x2b\xa4"
+ "\x9d\x29\xc5\x3c\xc2\x56\x45\x10\xb7\x9d\xae\xe4\x41\xfe\x01\xfd"
+ "\xaf\x0c\x8f\x4f\x3d\x61\x7d\xf9\xa4\x5b\xb5\x26\xfa\xa7\x6b\xd6"
+ "\x27\x60\xa4\xa9\xf8\x0d\x2f\xc5\xe3\xef\xfa\x95\x2f\xb2\x9f\x0d"
+ "\x2b\x56\xaf\xe2\xff\xc4\xc7\x86\xe2\x3f\xb1\x80\x37\xfc\x8d\x7a"
+ "\x49\x87\x3f\xab\x36\xe0\x6d\x62\x4c\xc8\x4b\xab\xf0\xa7\xef\x39"
+ "\x50\x6d\x57\x5a\x4f\x2b\x60\xa3\x81\xcb\xd9\x1e\x18\x23\x9d\x63"
+ "\xd8\xc3\x78\x4a\x47\xb4\x36\x22\xcd\x6b\xb9\xfa\x1c\xb1\xc9\xd0"
+ "\xe7\x48\xc0\x56\xdd\xaa\x00\xdb\x9a\x68\xd0\x19\x3b\xbb\xd2\x6c"
+ "\xa1\x26\xb2\x96\x88\xb2\xb1\x9c\xf9\x39\x4d\xeb\x49\x15\xf7\x76"
+ "\x2a\x84\xcc\xaa\x78\xf4\xdf\x0f\xf7\x2c\xce\x36\xdc\x97\xc0\xfd"
+ "\x07\x70\x8f\xf1\xb5\x83\xe0\x3e\x09\xe7\xa4\xe0\x5e\x0d\xf7\xc1"
+ "\x42\xe6\xc1\x4c\x3c\x63\x0c\xf7\x1a\xb8\x9f\x01\xe5\xe7\x4a\xfd"
+ "\x62\x60\x5b\xd9\xb6\x4f\x8a\xfd\xcd\xe3\x7c\xdb\xca\x7b\xe3\x7c"
+ "\x63\x3c\xa7\xe4\xc0\xe5\x4c\xff\x32\x1b\xc4\xd6\xec\xa3\x9e\x96"
+ "\x00\x79\x9a\x25\x7d\xc9\xe7\x3b\x6c\x16\xc9\x7f\x0a\x9f\xcf\xb0"
+ "\x2b\x9c\xe2\xa5\xe3\x7d\x90\x14\x2f\x1d\xe7\xbb\x58\xbc\x46\xf8"
+ "\xa5\x69\xe8\x4f\x96\x96\x0d\x38\x97\xc7\xe2\x7c\xda\x5f\x41\xdf"
+ "\xbc\xe6\x94\x28\xd9\x9d\x45\x38\x87\x06\xf7\xdc\xb7\x24\xbd\x48"
+ "\xec\x2c\x3e\x94\xe4\x77\xce\xd9\x97\xc4\x80\xe7\xa1\x8e\x83\xcd"
+ "\xc0\xe2\x5d\xc5\x6e\x08\xb0\xad\x8c\xe6\x76\xa0\xfd\x24\x97\x5f"
+ "\x75\xe9\xdc\x5e\xb0\x57\xd0\xa7\x79\x4c\x14\x13\x11\x16\x72\xdf"
+ "\x53\xb1\x1b\x28\xbc\x1b\x90\xb8\x32\x9a\xa5\x41\xbe\x6d\x60\xab"
+ "\x89\xf5\x7b\xdb\x18\x8c\x67\x5c\x05\xd1\x47\x86\xbd\xec\xb9\x69"
+ "\xa9\xf8\x1d\x25\xb3\x43\x8e\x13\x15\xc6\xdb\xc4\xba\x15\x39\xf9"
+ "\xc5\xdb\x01\x69\xb8\x87\xb4\xe3\x69\xa2\x42\x3f\xc0\x62\x5d\xca"
+ "\x78\xfc\x30\x21\x4c\xf2\x35\x65\x82\xb4\xbe\xed\x79\xfa\x5f\x19"
+ "\x2a\x67\xae\x0a\x59\xb2\x00\xfe\x0b\x11\x43\x56\x3b\x63\x33\xb8"
+ "\x63\xfc\xf1\xc8\x8e\xff\x4a\xf8\x6f\x1e\x97\x54\x00\x3b\xcd\xce"
+ "\xc6\x42\x02\x8e\x81\xbb\x22\xf2\xf8\x1e\x54\xe1\x28\xfa\xdd\x15"
+ "\xd2\xd0\x9e\xc4\x73\xd3\xc2\x01\xc4\x2c\x55\xd6\x65\x16\x6f\x41"
+ "\x1f\xcf\x32\xa0\xb1\xf0\x0e\x3e\x13\x7d\x78\xc9\x99\x8f\x2b\x3b"
+ "\x51\xb3\x33\xc2\x60\xa3\xe0\x19\xd4\x16\x99\xac\x06\xed\x0e\x9c"
+ "\x4f\x12\xd2\x84\xa5\x88\x5b\xe0\x31\xfa\x10\xb1\xd0\xf1\x55\x91"
+ "\xd4\xf7\x58\x08\xe2\x18\x6d\x5d\x63\x20\xd2\x8c\xa2\xcf\x80\xc7"
+ "\xe1\xfa\x37\x1e\x7b\x66\x59\xab\x54\x26\xdc\xab\xc0\x86\xda\x09"
+ "\xbf\x81\x5d\x69\x74\xa1\x53\x4c\x3e\xf1\x4c\x34\x5d\x83\xbe\xdf"
+ "\xb0\x6c\x66\x3b\xcb\x64\xef\x73\x1b\x84\xc6\x9b\x48\xe0\x1c\xde"
+ "\x17\x31\xd6\xe8\xf6\x4c\xf1\x7f\xb0\x7f\xee\x37\xf7\x29\xe3\x84"
+ "\x34\x57\xca\x31\x0d\x3a\x4f\x4e\x1e\x87\xeb\xdf\x20\xff\x07\x26"
+ "\xf2\x20\xcb\xbf\x4d\xce\xce\x49\xb6\xf8\xa8\xf1\xbc\x3b\xad\x97"
+ "\xd2\xc7\xc8\xc2\x80\xa6\x18\xd3\x8d\xf7\xfd\x8e\xf1\x75\xb1\x70"
+ "\x6f\x91\xe6\x58\xd8\x9c\x4b\x06\xee\xeb\xea\xbd\x4f\x84\xfb\x20"
+ "\xe9\x1e\xfe\xd7\x48\xb2\x02\xe7\x24\x3a\x52\x22\x76\xe1\xb8\x73"
+ "\x95\x1a\xec\x42\xb0\x6f\xe0\x39\xf0\x7f\xfb\x42\xfe\x6e\x8f\xa6"
+ "\x23\x4d\xaf\xb3\xf8\xdf\x14\x69\x01\xf9\x07\xcf\xc0\xfe\x8b\x6d"
+ "\x14\xcb\x89\x31\xc9\x8b\x7a\xdb\x26\xa4\xf9\x04\x08\x59\xc7\x16"
+ "\xb2\x36\xca\x64\xa5\xf0\xff\x22\xb3\x6f\x95\x06\xf2\x01\xff\x6d"
+ "\x06\x96\x2f\xe1\x42\x49\x76\x77\xe0\x52\x23\x58\xf0\xe5\xab\xbb"
+ "\x91\x7e\x6c\x4f\xb6\x7e\x73\x20\xf3\x5d\x8b\x7e\x40\x58\x4c\x34"
+ "\xf4\x6f\x69\x23\x63\x59\x4c\x81\x2c\x9b\x9a\xf9\xd2\x7f\x59\xab"
+ "\x92\x7c\x5b\x82\xbc\x09\xa2\xf2\x0d\x16\xf4\x77\xc9\x62\x87\x74"
+ "\x69\xfd\x99\x8f\x4b\xd1\xb7\x65\x61\x02\x09\x32\x08\xdc\xb7\x25"
+ "\xf3\x11\x32\x16\xc6\x29\x09\x03\xfb\xb7\xa4\x69\x7b\x17\x4a\xfe"
+ "\x2d\xe9\x65\xbb\x15\xfe\x9f\x01\xf4\xc0\xf8\xef\x5a\x76\xef\xf0"
+ "\x37\xa5\x18\xd0\xdf\xa5\x9c\xb0\x98\x25\xe8\xef\x72\x58\xfa\x42"
+ "\x26\x63\xf3\xb2\x5d\x19\x32\x90\x7f\xaf\xb2\xb8\x80\x4e\x69\x15"
+ "\xd0\x12\xd1\xbf\x01\x8d\x11\xd3\x1a\x4c\x24\xcb\x20\x8e\x4b\xcd"
+ "\x38\xc6\xdf\xc9\xe6\xc6\x84\x36\xda\x13\xb3\x6b\x20\x99\xd3\xee"
+ "\x3f\xc5\xd4\x8e\xfe\x29\x32\xe4\x6a\x93\x4c\x9e\x84\xef\xb2\xb1"
+ "\xa4\x4c\xae\xee\xdb\xaf\x9f\x5f\xb5\x21\x2a\x7a\xc5\xda\x75\x3a"
+ "\xcd\xd3\x4b\x1f\x67\x81\x12\x43\x34\x6b\xe2\xa3\x99\x4a\xd2\x3c"
+ "\xbd\xe0\xb1\xf0\xf0\xa5\x2b\xfe\x75\xe9\xa3\x4b\x9f\xf9\xd7\x87"
+ "\xf9\x89\xc5\xa5\x71\xaf\x60\xb0\xcd\xf8\x0d\x1a\x7c\xe9\x79\x31"
+ "\x9a\xf8\xe6\xe8\xb8\x0d\x7d\xe5\x41\x10\x9b\xe7\x92\xb3\x39\x5d"
+ "\x0b\xfe\xcf\xe6\xd2\x64\xf2\xfd\xd2\x1c\x17\x93\x7d\x32\xf9\x1e"
+ "\xa4\x2d\x8b\x35\x9e\x21\xc7\x3e\x4b\xc4\x38\xef\xa8\x77\x14\xd8"
+ "\xa7\x51\xff\x40\x5b\x4c\xce\xbe\xb9\xf8\xbb\x3e\x0a\x39\xbe\x27"
+ "\xf6\x65\x31\x6d\x0a\x9d\x3a\x35\x85\xf9\xd7\xca\xf0\x09\x92\xe6"
+ "\xbd\x31\x4d\xaa\x43\x13\xe6\xc9\x90\x3f\xdb\x1b\x4f\x38\xc3\x67"
+ "\x9e\x23\x0e\x25\xfb\x73\xa1\x11\x21\x68\xce\x8c\x01\x5b\x65\x2c"
+ "\x5c\xe3\xf0\x5a\xd8\x2b\xdf\x13\x68\x03\x8e\xd9\x02\x64\xa0\x83"
+ "\x13\x7d\x78\x1c\xab\x8c\x7a\x16\x7b\x21\xdc\x6e\xf3\x59\x61\x97"
+ "\xc3\xaf\x0f\x5d\x61\x57\xb0\x71\x22\x4d\xa0\xf5\xec\xac\x7d\x02"
+ "\xad\xc3\x78\x6d\x80\xe3\xcc\x70\x5b\x72\x66\xb8\x9d\xda\x56\x80"
+ "\xfd\x0e\xbf\xdf\xe2\x99\xf1\x70\xfb\xb7\x94\xc5\xac\xc1\xb3\xf5"
+ "\xdc\xcf\x60\x25\xee\xa1\x7c\x0e\x30\x5c\xd4\xce\x63\x12\x87\xbf"
+ "\xf2\xdd\x99\x15\xaf\x98\x78\x4c\xe2\x8b\x3c\x8e\x37\x8f\x75\x4e"
+ "\x92\xa1\x9c\xa3\x2b\xec\x3e\x9a\x70\x7b\x0f\x65\xe7\x5e\x33\x14"
+ "\x9a\xc1\xe2\x0c\xa3\x8c\xdd\x34\x85\xc8\xf1\x1c\x9d\xbd\x68\xb5"
+ "\x06\x7d\x0a\xa6\x98\xa9\x15\x7d\xd3\x7c\xd4\xdd\x20\xd7\x24\x28"
+ "\x80\x6e\x8a\x05\xb5\xba\xd0\x81\xcf\x3d\x67\x7c\x95\x4a\xf5\xf9"
+ "\xfb\x69\xc6\xd7\x4b\xa8\xbe\x60\x0e\xcd\x3c\x86\x73\xa3\x32\x9a"
+ "\xd1\xac\x81\x7b\x48\x6f\x31\x53\xbd\x61\x0e\xcd\x38\x57\x0e\xbf"
+ "\x70\xdf\x96\x4b\xf5\x85\x70\xff\x49\x04\xbc\xb7\x8f\x66\x54\xe2"
+ "\x7b\xa1\x34\xe3\xe8\x42\xf8\x85\xfb\xaa\x30\xc8\x07\xf7\x9f\xce"
+ "\x85\x5f\xb8\xaf\x0e\x6d\x91\x8d\x09\x84\x77\x20\xed\xbb\x48\xfe"
+ "\xad\xf6\x48\xf6\xad\x8c\xce\x48\xfe\x0d\x6b\x24\xff\x46\x4f\x24"
+ "\xff\x86\x10\xc9\xbf\x51\xa3\x85\xfc\x07\x68\x46\x6d\x1e\xe4\x9b"
+ "\x4b\x33\xea\x94\xf0\x0b\xf7\xc7\x12\x21\x1f\xdc\x1f\x6f\x85\x5f"
+ "\xb8\xaf\x87\xba\x14\xc2\xfd\x89\x4a\xc8\xff\x01\xcd\xf8\x62\x1e"
+ "\xe4\x9b\x47\x33\x1a\xf6\xc1\x2f\xdc\x9f\x9a\x01\xf9\xe0\xfe\x4b"
+ "\x28\xc7\x00\xf7\xa7\x55\x90\x7f\x1e\xdd\x2e\xc3\xfa\x94\xd3\xed"
+ "\x3e\x58\x6e\x18\xdd\xae\xc0\xfc\x70\x3f\x16\xca\x33\xc0\x3d\x8c"
+ "\xaf\xf5\x06\xb8\xf7\x2d\x83\xfc\x70\x3f\x01\xda\x9a\x5f\x41\xb7"
+ "\xab\x6c\x90\x6f\x3e\xdd\xee\x0f\xe9\x05\x70\x1f\xb8\x14\xf2\xc1"
+ "\xfd\x24\xcc\x0f\xf7\x37\xed\x85\xfc\x70\x7f\x33\xd2\xa8\x92\x6e"
+ "\x9f\x7c\x00\xf2\x2d\xa4\xdb\xa7\xaa\xe1\x17\xee\x83\xb1\xfe\x70"
+ "\x3f\xbd\x01\x7e\xe1\xfe\x76\xa0\x55\x21\xdc\xdf\x09\xf5\xcb\xaf"
+ "\xa6\xdb\x67\x62\xf9\x8b\xe8\x76\x2d\xd2\x07\xee\xef\xa9\x80\x7c"
+ "\x70\x3f\x0b\xe8\x61\x80\xfb\xfb\xb2\x21\xff\xa2\x01\xf9\xb9\xfd"
+ "\xfe\x28\xba\x75\x2c\xa1\xdb\x7f\x6a\xa1\x5b\xc7\xc1\xef\xbc\x52"
+ "\xba\x75\x8c\x96\x6e\x0f\x53\x40\x3a\xfc\x3e\x9c\x04\xf7\x21\xe2"
+ "\x3d\xfc\xfe\x7c\x29\xdc\x87\x8a\xf7\xf0\xfb\x48\x08\xdc\xcf\x11"
+ "\xef\xe1\xf7\xd1\xfd\x70\x3f\x97\x6e\x7f\x2c\x1b\xee\xf1\x57\x03"
+ "\xf7\xf3\xc4\x7b\xf8\x9d\xbf\x04\x7e\x6d\xe6\x69\xd1\x89\x66\xbf"
+ "\xb5\xa1\x66\xbf\xa2\x12\xc4\xa4\x3d\x27\x7f\x9f\xe0\x5f\x10\x0a"
+ "\x7a\x77\x6c\x4a\x27\x19\xd7\x22\x1b\x77\x1a\x65\x8a\x31\xc9\xc4"
+ "\x62\x01\x8a\x3e\x2e\xc7\x36\xc9\xc6\x9e\x04\x1b\x09\xe3\x39\xc8"
+ "\xa1\xed\x6d\x34\x6d\x4c\x3b\xb4\x39\x96\xa6\x4d\x68\x82\x5f\xb8"
+ "\x9f\x78\x1c\xda\x0c\xf7\x0f\x6e\x87\x5f\xb8\x5f\xf6\x18\xb4\x3d"
+ "\xb6\x2b\x63\xdc\x5c\x93\x4c\x11\xcb\x64\xc4\x7f\x25\x94\x04\xd8"
+ "\x52\x68\xb8\x0d\x74\xc7\xae\x3d\x91\x01\xb6\x48\xe0\x43\x71\x58"
+ "\x00\xc6\xec\x28\x8c\x3e\x40\xfd\xd7\xb2\x3a\x61\x5c\x1e\xda\x33"
+ "\x43\xce\xbf\x3d\x81\x36\xc9\xc6\x45\x63\xfc\x08\xea\x9f\xe6\xee"
+ "\xf9\x6b\xec\xf9\xd4\x3d\x3a\xfe\x1c\xf0\xd0\xfb\x7c\x19\x3e\xdf"
+ "\x13\x80\x7e\xd8\xa7\x3f\xcb\x9e\x1b\x2d\xad\x62\xbb\x7c\xf0\xd9"
+ "\x21\xcc\x6b\x92\x8d\x6b\xe6\x32\x7c\x6c\x2b\x4d\xf3\x21\x1d\xca"
+ "\x63\x4b\xa0\xee\x16\xa8\x7b\x88\x68\xc3\xc7\x53\x65\x55\x22\xf7"
+ "\x71\x52\x7f\xc0\xdd\x3c\x90\x90\xbd\x3b\x4f\x0f\x72\x10\xc7\xc5"
+ "\xa0\x0f\xe5\x9a\xe4\x19\x07\x9a\x64\xbe\xe5\x85\x6c\xbe\x63\xcf"
+ "\x5c\x2e\x1f\x95\xaf\xf5\x6c\x3f\x96\xae\xd9\x1c\x00\xdf\xf7\x3d"
+ "\x94\x62\xa5\x9d\xe5\xc9\x8f\x81\x6c\x65\xe9\xe5\xec\x0c\x11\xff"
+ "\x9f\xad\x21\x89\xff\xe7\xb1\x79\x68\x28\x0b\xdf\x75\x1e\x87\xd8"
+ "\x33\x66\x2f\x11\xfc\xf7\x84\xb1\xb5\x75\x99\x32\xeb\xa0\x60\x92"
+ "\x07\xc4\x93\x31\x9a\xcd\x1f\x41\xf9\x4a\xd7\x31\x6b\x6f\x5e\xf6"
+ "\xec\x2f\x1f\x42\xde\x02\x9c\x5f\xca\x50\xf6\xc6\x3f\xa6\xd0\x86"
+ "\xd7\x51\x17\xca\x49\x18\xea\x67\x66\x03\xcb\x7c\x23\xf1\xb4\x93"
+ "\x4d\x55\xac\xb1\x65\xaf\xd5\xd8\xb3\xf7\xcc\xa5\x39\x7b\xc2\xfc"
+ "\x6d\x32\xee\x1b\x58\xe6\xfb\xfb\xfb\xac\x68\x73\x56\x61\xde\xc5"
+ "\xc2\xd8\x9f\x05\xde\x9b\x48\xe4\xe5\x71\xa7\xf0\x5e\x4f\x33\xc2"
+ "\xca\x8c\x6d\x0d\xa4\x3c\x8e\x95\x95\x4d\x33\x16\x45\x08\x63\x7f"
+ "\xb1\xb4\x08\x6d\xf7\x44\x9c\x7b\x3b\x8e\xe9\x13\x81\x2f\xa0\x57"
+ "\x7c\x63\xa5\xba\xa0\x4e\xd1\x03\xed\xd0\xae\x46\x7f\x18\x2b\xec"
+ "\x76\xf4\x2f\x97\x69\x02\x3a\x70\x7e\xf9\x2e\xc1\x38\xef\xe2\x77"
+ "\xf7\x08\xe3\x8f\xe9\x6a\x97\xe3\x3a\xa2\x12\xfd\x75\x75\xb2\x33"
+ "\xf4\x18\xfd\x58\x40\x3b\x80\xe7\x75\xe6\xdd\xba\x55\xba\x15\x9b"
+ "\x75\x1b\xe2\xe2\x57\xbc\xa4\xfb\xa9\x06\x06\x93\x9a\x0d\xab\x35"
+ "\xeb\xa2\xd7\x6d\x88\x7b\xa5\x9f\x8f\xa0\xae\x8c\xf1\x0a\x93\x4c"
+ "\xc9\xe6\xc4\x8e\x82\x4d\xcf\xe6\xf4\x65\x13\xea\x91\xd7\xbb\xde"
+ "\xe4\x31\x38\x20\x8f\x16\xc6\x7d\x7b\x99\x5d\x9e\xb7\x27\x82\x1a"
+ "\xa2\x0f\x64\xa1\x1f\x90\x97\x30\xc6\x83\x99\x18\x49\x3b\x8f\xcb"
+ "\xcb\x62\xee\xc1\x18\x23\x61\x0b\x2d\x4f\x68\xc7\x7e\x00\xb2\xa5"
+ "\x68\x21\x2d\x5c\x4d\xae\xe8\xd7\xe6\x35\xc9\x26\x1c\xb8\xa2\x2f"
+ "\x9a\x2b\xc5\x4c\xb2\x67\x17\xe5\x09\xaa\xdd\xfb\x30\x66\x52\x0f"
+ "\x55\x93\x1a\xa0\x65\x77\xe6\xb1\xe5\xa0\x07\x22\x0a\xd3\xe8\x01"
+ "\x3b\x8c\xb9\x98\x0f\x9b\xff\x4a\x48\xb5\x53\xad\xc2\x9e\x46\x94"
+ "\xf0\xeb\x4f\xfd\x4b\x4d\x3d\xaa\xe2\x50\x7c\x8e\xb1\x92\xec\x3d"
+ "\x5a\x92\x5c\x4f\x85\xdf\xc6\x00\x6e\xd2\xc0\x68\xc7\xd8\xb0\x31"
+ "\x17\x08\xa4\x8f\x17\x72\x8a\xca\x5b\x16\x12\x39\xe6\x05\x7b\x8f"
+ "\x2c\x87\xff\x93\x56\x12\x3f\xc8\x17\x90\x74\x14\xd2\xbb\xb4\xe3"
+ "\x6d\x29\x5a\x65\x77\x8a\x76\x7c\x0f\xd5\xaa\x8c\xcd\x56\xd2\x33"
+ "\x33\x21\x77\x96\x99\x28\x76\x81\x5d\x58\x28\x40\x1f\x34\x44\x97"
+ "\xd8\x5f\xd5\x8e\xb5\xbd\xaa\x55\xf4\xf4\x68\x95\xb6\x97\xb5\x8a"
+ "\xee\x97\xb5\x63\x7b\xba\xb4\x4a\x63\x94\x99\x54\x99\xff\x40\x6a"
+ "\x9b\x5b\xd9\xbc\x6f\x8f\x5f\x69\x5b\x8f\x5f\x51\xb5\xaa\x99\x04"
+ "\xdd\xab\x03\xbb\x10\xec\xe5\x7c\x18\x2b\x00\x26\x54\xb6\x3d\x09"
+ "\xa0\xef\x4a\x73\x81\xbe\x85\x0b\xee\xa6\xdf\xd9\x33\x02\x63\x34"
+ "\x4f\x80\xbc\xda\xaa\x50\x43\x1a\xe0\x27\xb8\x81\x66\x4c\x01\x19"
+ "\xa7\x08\x86\x4b\x63\xe2\x7c\x20\x34\x23\x00\xef\xd5\x98\x97\xe7"
+ "\xbb\x39\xd6\xc4\x7e\x27\x7e\xc0\x62\xb8\x66\xf8\x56\x17\x32\x9b"
+ "\x64\x42\x9d\x64\x93\x54\x28\x06\xf6\x35\x02\x79\x2c\xbd\x63\x78"
+ "\x01\x64\x8e\x3e\x7f\x40\xdf\x38\xdc\xff\x0f\x7c\x3b\x27\xbf\x2e"
+ "\x57\xe8\xf5\xff\x0c\x32\x53\x35\x0d\xfa\x4f\x2a\x7b\x96\x5d\x1c"
+ "\x96\x7c\x89\xf8\xe0\xb3\x7d\x97\xad\x72\xbc\xd7\xc4\xc9\xa8\xd1"
+ "\x62\x25\xb9\xb8\xfe\x11\x1c\x7d\x60\xdf\x65\xb3\x1c\xf1\x52\x0b"
+ "\x69\xf0\xee\x03\xb9\x97\xc5\x72\xf3\xf6\x44\xa6\x6c\x24\x2c\x0e"
+ "\x0a\xc6\x52\x42\x1c\xe5\x26\xc3\x18\x14\xe3\x3e\xc5\xa1\x0c\x53"
+ "\x6d\x84\xff\x95\x98\x8f\xaa\x8a\xc3\x04\x28\x03\xb0\x54\x46\xfd"
+ "\x8a\xb5\x82\xbe\x68\x1f\xc8\x56\x1d\x9d\xb6\x5a\x2d\xec\xda\xb3"
+ "\xb0\x2b\x43\x55\x09\xf4\x30\x49\x73\x1a\xb5\x65\x36\x82\xfe\xbb"
+ "\xe8\x63\x36\x72\x24\xbe\x13\x7d\xfc\xfa\x98\x7d\x8f\x45\x9a\xfd"
+ "\x76\xe7\x99\xfd\x4a\x73\x05\xfd\x6e\x13\x5c\xcd\xba\x38\xa2\x3a"
+ "\x2f\xf3\xcb\xee\xf5\x3f\x7b\xe9\x3a\xf1\x3f\x0b\x76\x1e\xb3\xf7"
+ "\x00\x3b\x68\xbf\x09\xfa\x62\x16\xcf\x04\xed\x3a\x94\xb9\x5d\x19"
+ "\x7e\x07\x24\xbb\x0c\xe5\x88\x3d\xeb\x58\x2c\x5c\x31\x90\x5e\x67"
+ "\x92\x69\xac\x92\x8c\x01\xdd\xb3\x44\xd8\xfe\xa4\xba\x0b\xcf\x58"
+ "\xf5\xc4\x3c\x82\x79\x81\x6e\xa9\xf0\x2d\x1f\x7b\x4f\xcc\x3c\xb8"
+ "\x1e\x86\xeb\xe7\x76\x7d\xb1\xc6\xae\x2f\x0a\xb3\xeb\x4b\x75\x76"
+ "\xfd\xda\xa5\x70\x45\xc0\xb5\x1c\xae\x48\xb8\xa2\xe0\x8a\xa1\xfa"
+ "\xb5\xb1\xf0\x8b\xcf\xe3\xe1\x4a\x84\x2b\x09\xae\x54\xb8\xd2\xed"
+ "\xbb\xf6\x2c\x11\x00\x9f\x70\x69\xe0\x0a\xb6\xeb\x77\x37\xc0\x35"
+ "\xe0\x5c\x09\xcd\xec\xe1\xb1\x1b\xc6\x9c\xa1\x01\x18\xdb\x37\xa9"
+ "\x13\xfd\x49\xaa\x8f\x68\x2d\xc3\xf3\x61\x2f\xf3\x4f\x77\x37\x7f"
+ "\x82\xe5\x43\xff\xea\x19\x66\x79\xee\xfd\x1c\xaa\xf7\x44\xd8\x82"
+ "\x57\x33\x7f\xea\xd0\xa7\x65\xb5\x91\xcd\x24\xdc\x4c\x52\xaa\x9b"
+ "\xbb\x49\x4a\x14\xb5\xb3\xb1\x79\x12\x9e\x6d\xd9\x60\x41\x1c\xdb"
+ "\x69\x84\xa6\x27\xbb\x68\xa1\x5d\xb5\x5b\x47\x55\xbb\xcb\x98\xcf"
+ "\x4a\x90\x3f\x18\x2b\xad\x77\x5c\x8a\xb8\x82\xb1\x69\x4d\x5b\x27"
+ "\x79\x35\x8a\x0a\x35\x31\x60\x9b\x34\x00\xc0\x64\xe4\x2d\xc4\x98"
+ "\x34\x36\xfd\x75\x23\x4d\x05\xbc\xf8\xda\x81\x6e\x02\x8e\x49\x01"
+ "\x5b\x38\x3e\x95\xf0\x05\xfa\x2c\x50\x8a\x2f\x45\xc7\xfa\xc7\xc0"
+ "\x33\x05\xc6\x9f\x32\xc0\x98\xd4\x90\x40\x66\x18\xe0\x19\x8b\x15"
+ "\x0a\xf5\x7e\x52\x17\x40\x85\x17\xb5\xa4\x68\x2d\x51\xfa\x5d\xe0"
+ "\xf1\x67\xed\x40\xfb\xde\x18\x0c\xd9\x6b\xf3\x16\x5f\xd0\x90\x23"
+ "\xda\xd3\xa0\x97\xf6\x81\xfc\x5e\x9b\xd7\x03\xb2\x1b\x68\x69\x1f"
+ "\x1e\x2d\x03\x35\x57\x8b\x96\x3d\xc1\xd1\x25\x9c\x9e\x91\x04\x69"
+ "\xd6\x97\x9e\x48\xe3\xcd\xcd\x40\x4f\xa0\xab\xb1\xde\x4e\xfc\x65"
+ "\x64\xa5\x44\xcf\x02\xa0\x27\xd0\x54\x8d\x34\x05\x7a\x30\x9a\x52"
+ "\x91\xa6\x45\x4e\x34\x05\xf9\xc4\xfc\x7b\x22\x4d\x05\xa0\x69\x91"
+ "\x1b\x9a\xf6\x8e\xef\x81\xa6\xc5\x1e\xd1\xb4\x6c\x04\x34\x9d\x18"
+ "\xef\x8e\xa6\x36\xd4\x99\x39\x6b\x73\x29\xc8\x3c\xa3\xad\x8a\xf9"
+ "\xaa\x05\x7b\xa7\x19\xec\x36\x93\xa0\x2a\xca\x03\x9a\xa8\x70\x9f"
+ "\x00\xc6\x3b\x63\x7e\xe5\xca\xe8\x15\x7b\x4e\xa9\x19\xd3\x40\x76"
+ "\xc5\xdc\x87\xbe\xf9\x74\x26\x52\x24\xa7\x07\x6a\x2f\x5b\x40\xc7"
+ "\x04\xbd\xd3\x8d\x36\x67\xce\x9e\xfb\x04\x1a\x43\x50\x8e\x3c\x77"
+ "\x37\x51\x74\x83\xac\xd0\x25\x90\xdb\x72\x41\xde\x75\x83\xfc\x3c"
+ "\x2f\x9b\xb4\x70\x81\x4e\xa0\x70\xa5\xa0\xcf\x55\xc1\x6f\xb7\x09"
+ "\xe4\x35\xe3\x2f\xf2\x0c\xd7\x1f\x6b\x9e\xfb\x18\xca\xbb\xe9\xa1"
+ "\x4f\x23\x6d\x24\x25\xa6\x3f\x7f\x85\x94\x08\xb0\xbb\x86\xee\x27"
+ "\x18\x73\x31\xa9\x15\xf9\xba\x8f\x18\x9b\x1d\xfd\x44\x78\x99\xcb"
+ "\x61\xe4\x05\xf6\x0b\xec\x23\x3b\x9c\xe4\x2f\xc8\xf6\xc0\x42\x31"
+ "\x06\x89\x1d\xe4\x2f\xe4\x55\xa0\xaf\x56\x8c\x4d\x32\x60\xff\x78"
+ "\x15\xfa\xc7\x66\x16\x1f\x4a\x0d\xf4\xd8\xd7\xdd\xc5\x79\x88\x3c"
+ "\x33\xda\x2a\x19\xff\x72\x45\x79\xcf\xe9\xbe\xfb\x8f\x94\x46\x80"
+ "\x2d\x23\x53\x0b\x39\xa5\x26\xda\x15\x33\x1e\xe7\x2a\x61\xfc\x1c"
+ "\x1a\x10\x05\xb6\xc3\x77\xa0\x0f\xd6\x03\xbe\x2e\x92\x19\xc5\xeb"
+ "\xc1\x1e\xe8\xc2\x38\x6f\x50\x9f\x57\x78\x7c\x5c\x21\xc3\xbf\x1a"
+ "\x9e\x31\x1f\xb2\x82\xe4\x43\xb6\x43\x8b\xe3\x7e\xc7\x7c\xd1\x06"
+ "\xad\xdc\xf1\xcd\xcf\xf7\xd9\x55\x32\x35\x3b\x6f\x2f\x0b\xe2\xfb"
+ "\xcc\x94\x1f\x64\x22\x5d\xdb\x64\x41\x73\xf8\x1c\xf1\xa1\x6c\x5d"
+ "\x32\x19\x77\x5e\x76\xd3\x39\xba\xfd\x68\xaa\x0e\x63\x7d\x4b\xcf"
+ "\x52\x22\x90\x0e\x73\xee\x4d\x25\x20\xbb\x65\x73\x8d\x89\x17\xd0"
+ "\x27\xe3\x30\x65\x6f\x10\x9b\xef\xb0\x67\x7e\xbe\x1f\xe8\x14\x26"
+ "\x6c\xff\xfc\x03\x90\x29\xa1\xf4\x45\x68\xeb\x5a\x68\xeb\x79\xa0"
+ "\xeb\x79\x68\xeb\xcb\x62\x5b\xc5\xd8\x77\x02\xd0\x1f\x9e\x0d\xac"
+ "\xff\xa4\xb6\xbe\x88\xb1\x60\xde\x8f\xd8\x72\x81\xdc\x44\xef\xc0"
+ "\x35\x5f\x76\x1e\xb2\xcb\x68\x3b\x4d\xf0\xbb\x4c\x3f\x67\xaf\x8d"
+ "\x79\x06\xf0\x88\x34\x07\x9b\x00\xf4\x5c\x51\xb9\xc4\x07\xac\x0f"
+ "\xed\x89\x19\x5f\xb4\x1e\xea\x83\xb4\xbf\x48\x42\xb0\x3f\x03\xed"
+ "\x67\x14\x21\xfd\x5d\xe3\x4f\x07\x31\x1e\x8c\x05\x1e\xac\x17\x79"
+ "\xa0\x17\x79\x00\xb6\x22\xe8\x6a\x9c\xe3\x50\x17\xa5\x71\x1e\x0c"
+ "\x8f\x46\x37\xcf\x18\xe5\xfe\x6a\x71\xdf\x5f\xd5\x2b\xbb\xf9\x18"
+ "\x52\x86\xbe\x6c\xa9\xff\x9e\x9f\x08\x3d\xd0\x6f\x73\xc4\x7e\x4b"
+ "\x63\x7e\x2e\xf5\xd9\x16\xd9\xcd\x76\xcf\xfa\xec\x2d\x17\xfe\x49"
+ "\xfb\x6c\xd0\xd5\xed\xb3\x93\xff\xe2\xda\x67\x27\xb7\xba\xf6\xd9"
+ "\xc9\x85\x8e\x3e\x2b\x3e\x1b\x95\x3e\x3b\x79\xff\xf7\xd3\x67\x27"
+ "\xef\x1f\xa0\xcf\xd6\x7b\xd0\x67\xd5\x6e\xfa\xac\xfa\xea\xf5\x59"
+ "\x75\xc3\xb5\xd3\xb1\xc1\x53\xba\xe5\x03\xe8\xd8\x57\x9d\x74\xac"
+ "\x1f\xea\xd8\x29\x7b\x07\xea\xaf\x3d\x06\xe8\xaf\x2a\xb1\xbf\xfe"
+ "\xf6\x6f\x50\xde\xd4\x3d\x55\x8d\x43\xf7\x57\x9b\xc1\x61\x3f\xb9"
+ "\xed\xb3\x31\xd8\x67\xcb\x88\xd1\xc4\xfa\xec\x4a\xa9\xcf\x1a\xc4"
+ "\xf1\xce\x20\xfd\x36\xc8\x5d\xbf\xc5\x78\x60\x18\x0b\x6c\xd0\x7e"
+ "\x2b\xda\x4b\x3d\xd3\xb0\xdf\x96\x5f\x67\xba\xf6\xd6\x75\xae\xfd"
+ "\xf6\xd6\x12\xd7\x7e\x7b\xeb\x33\x8e\x7e\x2b\x3e\x1b\x95\x7e\x7b"
+ "\x6b\xec\xf7\xd3\x6f\x6f\x8d\xfd\xe1\xe8\xda\xe0\xdc\x6b\xa7\x6b"
+ "\x6f\x3b\xc1\xfa\xad\x3b\x5d\x9b\x22\xea\x5a\x3f\xd4\xb5\xd3\xd6"
+ "\x78\xd6\x77\xa7\xaf\xfc\x27\xef\xbb\x57\x59\xe7\xde\x76\xb7\x6b"
+ "\xdf\xbd\x6d\xb9\x6b\xdf\xbd\x6d\xa2\xa3\xef\x8a\xcf\x46\xa5\xef"
+ "\xde\xa6\xfd\x7e\xfa\xee\x6d\xda\x1f\x8e\xce\xd5\x2c\x72\xd7\x77"
+ "\x35\xd3\x49\x6a\x93\x4c\xb3\xc7\x68\x60\xfb\xf2\x52\x8d\xb6\x9f"
+ "\x12\xb6\x97\x45\xa6\xa9\x31\xaa\xe7\x12\x61\xfb\xb1\x06\x8c\xd5"
+ "\x82\x7b\x6a\x7e\xe7\xb4\x67\x85\xaf\xe9\x6a\x2e\x48\x7b\x6e\x8a"
+ "\xc5\x78\x2e\x83\xed\xb9\xa1\x99\xc7\x62\xf8\x7b\xb7\xf3\x7d\xf2"
+ "\x99\xc7\x62\xa5\x7b\xe6\x5f\x46\x76\x7b\x08\xcd\x3a\x16\x65\xf6"
+ "\x3d\x16\xe5\x6e\x9d\xc4\x7f\x2b\xa5\xb8\xcf\xa4\x63\x7a\x42\x68"
+ "\xc7\x76\x42\x72\xd9\x1a\xc4\xed\x51\xd0\x46\x1e\x0f\xd8\x7f\x6a"
+ "\x60\x47\xda\x12\x02\x69\x89\x52\x1a\x8b\xc1\x9d\xe6\x43\x05\x78"
+ "\x46\x73\xd6\xd8\x30\x5e\x1f\xfa\x3e\xbe\xf7\x32\x62\xf1\xf6\x4c"
+ "\x90\x11\x6c\x0f\x09\x5b\xc7\x9f\x7c\xab\xa5\xa8\x9d\x28\x6a\xd3"
+ "\xd9\x5e\x3a\xdc\xab\x53\x92\x83\xf8\xf7\xb9\x27\x8f\xca\x15\x44"
+ "\x28\x5c\xad\xa4\x7e\xbb\x5b\xd9\xde\x62\xc0\x8a\xb4\x7f\x07\xe3"
+ "\x1a\x0a\xd3\xa2\xcb\x24\xff\xbb\x14\xea\xf7\x61\x32\x9e\x3d\xf5"
+ "\xa1\x45\x71\x24\x10\x2e\x15\xd5\xef\x6e\xed\xca\xb8\x23\x50\x9a"
+ "\x3f\x74\xbb\x4f\x1c\xe3\x08\xdf\xaa\x56\x88\x7b\x85\xd0\x0f\x01"
+ "\xdb\x73\xb8\x43\x2e\x64\xda\x21\x9d\xa6\xa5\x50\x63\xa2\x8d\x04"
+ "\x00\x2d\x70\x0d\x1f\xe3\x8c\x09\x45\x09\xa1\xdb\xa6\x12\xf2\xa7"
+ "\xcd\xad\x72\xdc\xcf\x61\xff\x8f\x5b\x2d\xe5\xc9\xf7\xe3\x1a\x3f"
+ "\x8b\x29\xd0\x22\xbb\xd3\x2f\xfc\x1c\x8f\x19\x0c\xff\x4f\xc1\xb5"
+ "\x87\xc5\x70\x8f\x6b\xe4\x42\x87\x5a\x81\x79\x5b\x64\x77\x1c\x29"
+ "\x4f\x38\x45\x02\x74\x44\x99\x03\x6d\xe3\x79\xef\xd8\x89\x79\x4d"
+ "\xb2\x3b\xd9\x1e\x05\xb8\x2f\xc3\xf9\x72\x78\x8f\xcd\x95\x52\xc3"
+ "\x6a\x25\x93\x0f\xd9\xbb\x5b\x85\x69\xab\x95\x6c\x2f\x29\xb4\x73"
+ "\x07\xb4\x19\xf2\xa8\x70\x0f\x0f\xfb\x4d\x26\x81\x3b\x21\x0d\xcb"
+ "\x81\x5f\x15\xdb\x47\x2c\xbb\x23\x1d\xcb\x76\x7b\xfe\x40\xb5\xbb"
+ "\x95\x02\xb6\xf9\x79\x1c\xd9\xb1\x26\xd9\x9d\x07\x02\x64\x94\x52"
+ "\x43\x74\xd9\x36\x9c\xc7\xc6\x3d\xdf\xb8\x8f\x5d\x76\xe7\x1b\x50"
+ "\xbe\xa2\x98\xcd\xdb\xde\xa9\x33\xc9\xee\x70\xec\x47\x60\x6b\x2d"
+ "\x77\x56\xe2\x77\xf0\x1d\x31\x3f\xdb\x6b\x8a\x75\xd6\x24\xfb\x50"
+ "\xb8\xff\x33\xdf\x17\xae\x5c\x0d\xef\x3b\xfc\xff\xf0\xf7\x00\x4b"
+ "\x77\x56\x00\x36\x99\x6f\x14\xbc\x77\xbb\x4f\x59\xe4\x5b\x0d\x50"
+ "\xaa\x1f\xef\x24\x8c\x00\x2e\x24\x8c\x60\x7d\xdf\x4d\x36\xc9\x99"
+ "\x3e\x92\xcd\x60\x31\xb9\x72\x80\x87\xf6\x02\xb5\x82\xcd\x4d\xf7"
+ "\x20\x5f\x9a\xe0\xd9\x4c\x5f\xe4\xcb\x0e\xd0\x05\x62\xde\x10\x47"
+ "\xfd\xf1\x7e\x26\xe3\xa7\x00\xbc\xe0\xfb\xa0\x66\x9c\x66\x31\x9d"
+ "\x40\x66\xe0\xfe\xf5\x8a\x44\xa8\x17\xe2\x16\x30\xf2\xa7\x38\xab"
+ "\xbc\x28\x81\xa7\x7f\xd8\x6e\x95\xef\x38\x4f\x50\xb6\x10\xfd\x5a"
+ "\xa2\x00\x3d\xa4\xc0\x32\x69\x70\x74\xd9\x7d\x12\x1f\x37\x03\xef"
+ "\x12\x00\xbb\x40\xf3\x1d\x40\xbf\xa2\x6e\xb6\x56\x53\x56\x24\x10"
+ "\x95\x00\xf9\x4c\xb2\x99\x6a\x28\x2f\xb0\xf0\x16\x6a\xc6\x7d\xd6"
+ "\x40\xc3\xcd\x5d\x19\x33\x2c\x12\x0d\xb1\x4e\xb8\x4f\x5a\x8f\x7b"
+ "\xff\x65\x33\x74\x1c\x43\x33\xc2\xa4\x36\xbb\xa3\xa7\xfe\x4f\x24"
+ "\x58\x7f\x2f\x99\x2b\x28\x7b\xd4\xd4\xe7\xd6\x12\x9c\x6f\x7e\xb2"
+ "\x0d\xfd\x58\xb5\x92\xf0\xd7\xce\x50\xa3\xd9\x4e\x04\xdf\x1e\x35"
+ "\xae\x43\xd8\xb7\xdd\x33\x29\xfc\x15\xa0\x17\xe8\xfb\x14\x2b\x09"
+ "\x34\x26\x9b\x79\xec\x41\x72\x89\xd8\x37\x81\x0c\x07\xb9\x0e\x3a"
+ "\x55\x91\x72\x89\x4c\x41\x7a\x09\x7e\x45\x0b\x81\x66\x47\x9f\x89"
+ "\x27\xa9\xc3\x93\xa3\x33\xd9\xf9\x67\xb4\x2f\x40\xe6\xcb\x71\xaf"
+ "\x9e\xd1\x0c\xf6\x89\xbe\x68\xe1\x30\xcb\x71\x7b\xfe\x19\xdb\x2d"
+ "\xe0\x3c\xb4\xd8\xe6\x70\x6c\xb3\xc5\x4a\x70\x2e\xff\xc9\x8d\xe8"
+ "\x3f\xb9\x93\x08\x59\x3d\x6a\x6c\x33\xd8\x3a\x95\xc3\x9f\xd3\xff"
+ "\x51\xc4\x60\xdf\xa6\x40\x6f\x61\xdb\xad\x25\x82\x6a\x77\x25\x7e"
+ "\x1b\xeb\x80\x67\x7f\x9e\xec\x24\x8c\xee\x48\x7f\xa3\xd5\x4e\xa8"
+ "\xaf\x73\x1d\x6c\xc3\xad\x83\xfb\xf6\xdf\x4b\x82\xb3\xff\xc4\xf9"
+ "\x6e\xdf\x26\xd2\x20\x06\xd7\xc1\x76\x57\x62\xcc\x8d\x27\xb1\x0e"
+ "\xe6\x0b\x64\x31\x68\x1e\xe4\xbf\x51\xdb\x46\xec\x3e\xf7\x4c\xc2"
+ "\x3d\x07\xc8\xff\x64\x1b\xf0\xff\xb2\x15\x7d\x26\x99\x8d\xa9\x57"
+ "\x08\xda\x2f\xb6\x0e\xad\xbc\x3f\xff\xef\x3a\xfa\x4c\xe2\x70\xf9"
+ "\x7f\xd7\x28\xf1\xff\xae\xeb\xa0\xfd\x5a\x2f\xda\xaf\x1d\xa5\xf6"
+ "\x6b\xaf\x83\xf6\xdf\xed\x45\xfb\xef\x1e\xa5\xf6\xdf\xed\xb6\xfd"
+ "\x8f\x4f\x11\x28\xdb\x8b\xe2\x9f\xcf\xe2\xd0\x70\x7d\x75\xcf\x21"
+ "\xdc\x77\xc2\xce\x7a\x89\xf7\x84\x9f\xfd\x52\xf6\xb9\x57\xf5\xb9"
+ "\x0f\xec\x73\x1f\xd4\xe7\x5e\xdd\xe7\x3e\x58\xba\x07\x3d\x32\xe6"
+ "\xa2\xec\x9e\xd9\x60\x97\xa6\x9a\x64\xf7\x54\x8b\xcf\x67\xa0\x4f"
+ "\x31\xd0\xe9\x33\x06\x89\x7f\x79\xeb\x79\xd9\x8f\xd9\x19\x14\xba"
+ "\x6d\xaa\x96\x6e\x4e\x25\x42\xf6\xda\xf8\x27\xb7\x80\xec\x02\xfe"
+ "\xd1\x1e\xf5\x58\xb0\x11\x26\xa3\xdf\x3a\xdc\x77\xa0\x89\xc3\xfd"
+ "\x24\x3f\x9e\x89\xed\xbb\x57\x57\x4e\x04\x9f\x7b\x98\x2d\x28\xe8"
+ "\xd7\xc6\x9b\x7d\xee\x99\x4a\x77\xed\x59\x92\x23\x17\x94\x39\x69"
+ "\x82\x66\x8b\x99\x9a\x17\x5d\x02\x39\xd4\x89\xbe\xe4\x81\xc7\xf1"
+ "\xd4\x5c\x1e\x77\x01\xea\xfb\x63\x7d\x4d\x12\x94\x0d\xdf\x81\x6f"
+ "\xc1\x38\x6e\xed\x52\x1e\xb7\x7d\x6d\x7c\xad\xa5\x92\x60\x8c\x21"
+ "\xb1\x4c\x1d\xf5\x5b\xbb\x14\xcb\x1c\xd0\x3e\xcd\xce\x6f\x86\x6f"
+ "\xfe\xf4\x19\xad\x82\xd0\xad\x8a\xa0\xe1\xf1\xf4\xc7\xfb\xdc\xda"
+ "\xbd\xd9\x05\x51\xbc\x5c\xa5\x17\xe5\x86\xb8\x8d\x95\x0e\xe5\x8a"
+ "\xf5\x0d\xf4\xa6\xdc\x48\xf7\xe5\x1a\xc4\xfa\x6a\xbc\x29\xf7\xc0"
+ "\x20\xe5\x8a\xf5\x0d\xf3\xa2\xdc\x59\x81\xee\xcb\x2d\x14\xeb\x9b"
+ "\xea\x4d\xb9\x31\xee\xcb\xcd\x6f\xf6\x0e\x0b\xb3\x3e\x18\x0c\x0b"
+ "\xde\xe1\xe0\xde\x41\xda\x5f\xd0\xec\x1d\x06\xee\x8d\x1a\x0c\x03"
+ "\xde\xf1\xff\xde\x41\xf9\xef\x1d\xef\xef\x53\x0d\xc6\x7b\xef\xf8"
+ "\x7e\x9f\x5b\xfc\xa3\x2d\x0f\xbc\x2f\xa1\xfe\x7b\xc2\x84\x9c\xb5"
+ "\x25\x82\x7f\xfe\x7f\x6e\x13\xc2\xc8\xe3\x20\xc3\x02\xf2\xc8\xc4"
+ "\x30\x36\x3e\xbe\xcf\xb2\xc5\x40\xe4\x30\xde\x95\xbf\xb3\xb9\x41"
+ "\x6e\xb4\xcd\x45\x9d\x63\x2f\x4d\xb0\xca\xee\x84\xf4\x43\x80\x2a"
+ "\x0b\xd8\x9d\xbc\x9c\xb5\x25\x39\xc9\x61\x44\xf4\xa3\x61\xc1\xb3"
+ "\xcb\xe1\x20\xc7\x8c\x79\x56\xdc\xb7\x32\x11\xde\xb3\x01\x7e\xa1"
+ "\x0c\x2b\x79\x57\x30\xcb\xc2\xe2\x58\x3e\x33\x3b\xb3\x97\x93\xff"
+ "\x9f\x34\x45\x8b\xfe\x14\xcd\x2d\xb2\xd0\x67\x7d\xcc\x44\x8e\x7e"
+ "\x8f\xba\x32\x42\x23\x4c\xb2\xd9\x0b\xc5\x33\xaa\x6d\xcc\xef\x27"
+ "\xd4\x17\xcf\x7f\x62\x5e\xf4\xff\x79\xaf\x8e\xc8\xd1\x27\x3b\xe4"
+ "\x4d\x47\x5f\xa0\x83\x9d\xf5\xb6\x67\xef\x4e\xc7\xf7\x69\x36\xe8"
+ "\xd0\x0b\x44\x8e\xe7\x3b\x69\xf0\x6a\x92\x03\x63\x88\x05\x77\xe3"
+ "\x9c\x47\x3b\x49\xde\x42\x05\x9c\x7f\xa2\xaa\xa2\xb9\xb8\x37\x8e"
+ "\xef\x1b\x9f\xad\x29\xe2\xfb\xc8\xad\x2c\xfe\x30\xdc\xb3\x71\x0c"
+ "\xee\x8d\x51\xad\xd5\xd2\x1c\xbf\xb0\x5a\x4b\x3b\x8f\x87\x29\x9b"
+ "\x7d\x3b\xfa\x64\xec\x50\xed\x4e\xb5\xa8\x76\x67\x76\x65\xcc\x0e"
+ "\x96\xda\x80\xdf\x97\xd2\x71\xdc\x86\xf9\xe0\xf9\x3c\xe9\xec\xb7"
+ "\x9b\x78\xdc\x93\xc2\xd5\xd4\xdc\xeb\x6b\x43\x76\xff\x5b\x48\x7b"
+ "\xb0\x15\x12\x2d\x29\xda\xe9\x7c\x1e\x63\x76\x25\x8e\x87\xa1\xde"
+ "\x51\x7c\x6c\xba\x36\x8a\xf9\xe5\x05\x1d\xf0\x8c\x56\x3e\x4c\xbb"
+ "\x75\x36\xd3\xff\xe5\xd3\x51\x47\xde\x9f\x05\xe5\xff\x0c\xda\xd4"
+ "\xc6\xc7\x62\x6b\x13\xd9\x99\x47\xd9\xec\x4c\xf8\x46\x22\xdc\x6b"
+ "\x30\x5f\x93\xec\x7e\x95\xf8\x3c\xd5\xe9\x79\x2a\xee\x95\x14\x9f"
+ "\x8b\x63\xb9\xb5\xe9\x4e\xcf\xd3\x75\xd3\x71\x6e\xe2\xfe\xa5\xd8"
+ "\x06\xa0\x63\x24\xea\xb6\x5e\xdf\x21\x7e\x6b\x23\xc5\x7c\xf1\x6d"
+ "\xb2\xfb\xd7\x75\x00\xb6\xe0\x79\x92\xd3\xfb\x49\x87\x13\x43\xc9"
+ "\xe3\x85\x48\xc3\xfb\x53\x4d\xf2\xe2\x85\x7c\x3c\x3b\x3b\x9b\xb5"
+ "\x5d\xb5\x36\xc2\xb9\x3c\x93\xec\xfe\x45\x50\x66\x84\x05\xec\x28"
+ "\xc8\x13\x8f\xdf\x74\xa6\xb7\x74\xf2\x52\x13\xb5\x6e\xa5\x66\xd5"
+ "\x86\x97\xd6\xe3\xc9\xb9\xf1\x2e\x7b\x1c\x03\xf1\x6c\xa9\x90\x5d"
+ "\x1c\x63\xcc\xc3\xb3\x6e\x81\xec\x8c\xf8\x4e\xdc\x37\xe5\x5f\x5a"
+ "\x62\xcf\x29\x0d\x15\xfc\x8b\x96\x94\x6f\x7e\x8c\x5c\x94\xfd\x84"
+ "\xf9\x2b\x35\x02\x4a\xb2\xdf\x44\xdf\x1e\x55\x98\xc6\xfc\x19\x61"
+ "\xac\x29\x36\x66\xdf\xac\x24\x15\x9a\x76\x36\xee\x87\x67\xcf\xb2"
+ "\x39\x8e\x4e\x22\xb7\xa5\x29\xc9\xff\x49\xae\x93\x7f\x20\x98\xe4"
+ "\xff\x47\x68\x60\xfb\x74\x0f\xab\x2b\xc9\x7d\x89\x4a\x8c\xab\x28"
+ "\xff\x08\xc6\xd2\xf8\x1c\x9f\x49\x67\x11\xe0\xfd\x77\xd8\x9e\xdd"
+ "\x3b\xf8\xff\x29\x79\xf4\xeb\xc3\x6a\xd1\x8f\x85\xec\x27\x32\xac"
+ "\x2b\xfa\xf8\x68\x93\xfd\x64\x0c\xd6\xcf\x24\xfb\x89\xc2\xc7\x80"
+ "\x7b\x7c\x89\x0a\xf2\x5f\x12\xf4\xc5\x31\x28\x0f\x6c\x19\xf7\x1f"
+ "\xa0\x69\xaa\x3f\xe0\xb9\x3b\x83\x78\x16\xaf\x2b\xe3\x27\x8d\x4e"
+ "\x67\x4c\x55\x1d\x72\xf2\x08\xa4\x99\xa5\xb3\x0d\x18\xfb\xcc\x9d"
+ "\x7c\xb1\x82\x8d\x77\x25\x38\x3a\x53\x50\x15\x03\x2f\x8a\x63\x2a"
+ "\xe7\x13\x9c\x77\x91\xe1\x9e\xd9\x36\xd9\x03\xad\xd4\xaf\x38\x22"
+ "\x19\xfb\x74\x4e\xd1\x92\x3f\xe0\xbe\x3f\xa0\xe3\x5e\xdc\xe7\x07"
+ "\xb4\x7c\x1b\xee\xab\x16\x96\x11\xcd\xd3\x68\x3b\xcd\x59\xf9\xeb"
+ "\x28\x6a\xbb\x67\x49\x39\xa9\x6e\x7e\x8f\x7c\x5a\x5f\x49\x54\xcb"
+ "\x89\x4f\x8a\x89\xda\x59\x1b\xe3\x89\x3c\xdc\x44\x7c\x92\x3b\xb1"
+ "\x4f\xdb\x09\x9e\x1f\xa8\xb5\xd6\x80\x3d\xb4\xc1\xf2\x4e\x72\xeb"
+ "\x18\xcd\x93\x84\x40\xdf\x63\x6b\xcc\xec\x9c\x8f\x99\x9d\x9b\xf6"
+ "\xc3\xf9\x6e\xa7\xf3\x3d\xea\xa4\x48\x2a\x6c\xb9\x40\x94\x35\x31"
+ "\xa7\x49\x78\xa4\x0f\x65\xe7\x7b\x12\x21\xa3\x19\x78\xff\xb2\xd6"
+ "\xdf\xfe\xb2\x76\xd2\xae\xcb\x24\xa8\x36\xde\x04\xb6\x59\x25\x29"
+ "\x88\x23\x41\xb4\x2b\xc6\xb7\xba\xb2\x8a\xd0\xed\xf6\xc0\x77\x93"
+ "\xcb\xc7\xd8\x95\x7c\x7f\x55\xc0\x56\x19\xce\x6f\xfa\x67\xe3\x3e"
+ "\xab\xcb\x24\x74\xc5\xd9\x54\x36\x27\x8b\xf3\xdf\xb6\x2e\xad\xa6"
+ "\xa7\x4b\x7b\x47\xf7\xcb\xda\xe9\xd2\xbc\xf9\xb3\x17\x02\x71\x9d"
+ "\x20\x82\x66\xfc\xa8\x04\xf7\xf6\xe1\x38\xc0\xe6\x27\x53\xe3\x1c"
+ "\x39\x62\x18\xbe\x1f\x2c\xac\xd2\x92\xfb\xcc\xec\xec\x11\xce\xdb"
+ "\x07\x16\x3d\x8f\x75\x6d\x27\x6c\xaf\x90\x2f\xdf\x2b\x64\xc5\x35"
+ "\x6b\xd5\xee\x86\xc5\x6b\x34\xa4\x7b\x5a\x74\xa6\x31\xf1\x0f\x24"
+ "\xe5\x0a\xfd\x9a\xd9\xf1\x89\x80\xdb\x8c\x39\x38\xb7\xd7\x70\x44"
+ "\x7b\x02\xf5\xc9\x9c\xe1\xcb\x87\x07\xd8\xfa\x2f\xd2\x06\xf8\x54"
+ "\xb2\xb7\x1d\xf9\x56\xb4\xe4\x8f\x71\x66\xf9\x13\xcd\xd4\x56\x13"
+ "\xf5\x07\xf2\x69\x43\x9d\x0b\x7f\x18\x3f\x21\x1f\xf2\x09\x79\x84"
+ "\xbc\x72\xf0\xe9\x04\xe3\xd3\x5e\x81\xf3\xa9\x5b\x95\x5f\x22\xf1"
+ "\xca\x6a\x88\xce\xf3\x84\x5f\xd5\xcd\x03\xf3\x0b\xe8\xdc\xcb\xaf"
+ "\xfc\x76\x12\x64\x6c\x03\x7b\x19\xf8\xf5\xc4\x53\x84\x3c\xf1\x36"
+ "\x15\x6a\x16\x1e\xef\xe5\x9b\x2d\xd3\x0d\xdf\xce\x39\xf8\x06\xfc"
+ "\x1f\x84\x6f\x77\xcd\x18\x0e\xdf\xaa\x9b\x39\xdf\x6c\xe2\x1e\x2f"
+ "\x6d\x05\x91\x5b\x5f\xd6\xca\xf3\x2e\x93\xb9\xc8\xbf\x45\x67\x35"
+ "\xe4\xc8\xd2\x1a\xe0\xd9\x7b\x2e\xfc\x13\xf4\xbb\x13\x81\x07\xfb"
+ "\x90\x87\xde\xf5\xbb\x87\x22\x3d\xef\x77\xff\x72\xf2\x46\xbf\x1b"
+ "\xad\x7e\xf7\x2f\xa9\x23\xeb\x77\x0f\x85\xdc\xe8\x77\xdf\x77\xbf"
+ "\x7b\x48\xdb\xb7\xdf\xf5\xda\x0d\x71\xd1\xeb\x56\xae\x59\x8f\xc7"
+ "\x13\x9f\x7f\x25\x3e\x7a\x13\xb7\x1e\x5c\xec\x07\xb5\x3d\x39\x4c"
+ "\x8e\x3e\xe7\xaa\xf3\xea\xc8\xbb\x53\xeb\xe4\xf6\x6f\xd5\x0a\x9a"
+ "\x3d\x39\x52\xc8\x9e\xd2\x8a\xbe\x43\xb1\x7f\xee\x44\xbf\x1e\xb2"
+ "\x47\xea\x6b\x83\x79\x9c\x4e\xfc\x9f\xd9\x4e\xc1\xab\xd5\xb8\x5e"
+ "\xb3\x6d\x33\x51\x6c\xc3\x33\xda\x56\x9c\x17\x61\xcf\x1f\x46\x5f"
+ "\x8a\xb4\x70\xb5\x1a\xfd\xf2\x58\x54\x6b\x35\xe9\x50\x96\xd9\xaf"
+ "\x38\x46\xa1\xc1\x33\x17\x3f\x33\x80\xed\x53\xd7\xeb\x67\x49\xf6"
+ "\x08\xa1\x63\x7f\x6a\x46\xb9\x80\x67\xe4\x2e\xca\x7e\x76\xec\x0a"
+ "\xae\x75\x80\x3d\xfd\xcc\xdd\xf0\x9d\x69\xd1\x79\xcc\xef\x02\xc8"
+ "\x08\xfe\xfc\x61\x3d\x7e\xff\x4a\x76\x11\xc6\xba\xb1\x74\xa8\x4a"
+ "\x4b\x3a\xb2\x4b\x43\xab\x92\xf2\x44\x19\xf1\x33\xfb\x13\x79\x5c"
+ "\x46\xd4\xa8\x01\x83\x8b\x00\x83\x11\x43\xc9\x08\x27\xec\x4d\x1f"
+ "\x9e\x8c\x40\xac\x21\xe6\x10\x6f\x13\x00\x6f\x88\x41\x09\x73\xbf"
+ "\x13\x31\x17\xd0\x48\x02\x19\xee\x6c\x1c\x77\x78\xee\xb9\x26\xd1"
+ "\x81\x39\x7b\x5f\xcc\x5d\xee\x83\x39\xb9\x88\xb9\x97\x5d\x31\xb7"
+ "\xec\x74\x20\x29\xe0\xb2\xc2\x81\x39\xbd\x4c\x2d\xe1\x0d\xb1\x87"
+ "\x38\x13\x5e\xd0\x92\x9a\xb6\xf6\x5e\xec\x15\xad\xe6\xeb\xad\x6c"
+ "\x3f\xaf\x9c\xee\xbb\xf2\xb2\x28\x2b\x2e\x48\xb2\x22\xdf\x8d\x8e"
+ "\x3e\xed\xa5\xac\x78\x98\xcd\x7f\x23\xaf\xba\x81\x6f\xc8\xaf\x27"
+ "\xd4\x20\x23\xd4\xff\x49\x3e\x5d\x7a\x9d\xf0\x27\x6e\x74\xf8\x83"
+ "\xbe\x70\xa1\x2e\x03\xf0\x68\x66\xc8\x50\x3c\x42\xfe\x20\x9f\x18"
+ "\x7f\x80\x4f\xd2\x9a\x38\xae\x91\x22\xaf\x90\x3f\xf7\x26\x11\x39"
+ "\xf2\xab\x28\x81\xcb\x07\x94\x03\x6c\x0f\x76\x1f\xf9\x0e\x34\x5f"
+ "\x8a\x3c\x63\xe3\xea\x34\xbf\x17\x76\xe2\x19\xe2\x49\x92\x0d\xfd"
+ "\x88\xa6\xbf\x0d\xfd\xc8\x9c\x5e\xbf\x98\xb2\x9f\x95\xf1\xf1\x51"
+ "\xb1\x78\x8e\x38\xec\x35\xb1\xcf\x13\x1c\xab\xb2\x71\xa9\x1d\xc6"
+ "\xa5\x2a\x18\x97\x66\xc3\xb8\x34\xb1\x95\xfb\x4f\x90\x3d\xb2\x95"
+ "\x88\xe7\x99\xa9\x5f\xd1\x5c\x18\x13\x69\x91\x96\x6c\x8d\xd7\x6f"
+ "\x77\x2a\xae\x49\x51\x3d\x8c\x79\xff\x53\x4e\xe0\x3e\xf3\x88\xd6"
+ "\x3e\x4c\x1c\x3d\x22\xee\x4d\x3a\x16\xa5\xdb\x8c\xfb\x1b\xc2\x74"
+ "\xbc\x7e\x3f\xfb\x0d\xa6\xb3\xf5\x3f\xb9\x50\x62\xdf\xe6\xba\xfe"
+ "\xe7\xbc\x3e\xfc\x6e\xb2\x59\x5c\xfb\x0b\x63\x6b\x7f\x28\x43\x50"
+ "\xee\xbd\x03\x63\x18\xc7\xfa\xdf\x71\x7c\xfe\x1b\xd7\xf5\xbf\x30"
+ "\xa6\xef\x4c\xb2\xb0\x74\xdc\xf3\x02\xf7\xe2\x7a\xda\xcf\x22\x9c"
+ "\xd3\x1d\xeb\xeb\x3c\x5d\x90\xb3\xb8\x2b\x38\x3f\xd0\xc6\xe7\x05"
+ "\xc2\x0c\xd2\xf8\xdb\x8d\xbd\x34\x0c\xb9\xbc\x20\xd5\x21\x97\x17"
+ "\xb0\x3d\x00\x54\xbd\x67\x61\x4d\x3f\xb9\x7c\x0a\x9e\xcf\x3f\xf7"
+ "\x24\xca\xe5\xec\xa2\x30\x5e\xbf\x47\xef\x06\x9a\xf8\x60\xfc\x4c"
+ "\x4c\xc7\xf3\x46\x28\xa3\x0b\x99\xcc\xde\x33\x37\x9d\xad\xf1\x3f"
+ "\xba\xd0\x55\x56\xcf\xdf\xeb\x2a\xab\x1f\xdd\x32\xb8\xac\x7e\xfc"
+ "\xa1\xc1\x65\xf5\xa3\x6f\xdf\x90\xd5\xa3\x2d\xab\x25\xbb\xce\x5b"
+ "\x59\xfd\xb8\xe2\x86\xac\xbe\xd6\xb2\xfa\x71\xe2\x24\xab\x97\xba"
+ "\xca\xea\xf9\xd5\xfd\x65\xf5\x7c\x93\x43\x56\x3f\xba\xd4\x55\x56"
+ "\xff\x62\xb6\x67\xb2\x7a\xc1\xac\xab\x2b\xab\x17\x2c\x72\x95\xd5"
+ "\xbf\x08\x16\x75\xc9\xa5\xe1\xcb\xea\x05\xf6\xc1\x65\xf5\x2f\xc6"
+ "\xb8\xca\xea\x05\x0d\x5c\x26\xff\x22\x94\xcb\xea\x05\x6d\xa2\x0c"
+ "\x37\x3b\xa7\x3b\x64\x35\x4f\xef\x2f\xab\x7f\xb1\x70\x08\x59\xad"
+ "\xb5\x0b\x92\xac\x6e\x00\x59\xdd\x20\x17\x5e\x70\x27\xab\x7f\x9d"
+ "\x5e\x83\xb2\x3a\x0e\x65\xf5\xaf\xd3\x07\x97\xd5\x4f\x5c\x40\x99"
+ "\xcc\xfc\x7a\xbe\x49\x9b\x99\x5f\xc5\x37\x69\x2b\xe2\xf4\xc9\x24"
+ "\x48\x87\x34\xf4\x3f\x89\xf9\x38\xef\x25\x99\xfe\x0b\x7b\xaf\x4c"
+ "\x87\x7c\xc2\x14\x87\x4c\x47\x79\x8e\x72\xbd\xf0\x4d\x6a\x2a\x7a"
+ "\x93\x36\x76\x65\xfc\x72\x86\x24\xdb\xf5\x90\x86\x71\x92\xd0\xf7"
+ "\x11\xee\x8f\x04\x1a\x34\x6f\x83\xef\x61\x7e\xc8\xb7\xc8\x55\x07"
+ "\x3c\xb1\xcf\x55\x07\xfc\x72\xeb\xe0\x3a\xe0\x57\x0f\x0f\xae\x03"
+ "\x7e\xf9\xce\x0d\x1d\x70\xbd\xe9\x80\x5f\x29\x6f\xe8\x80\xa1\x75"
+ "\xc0\x40\x3c\xea\xab\x03\x66\x89\x3a\xa0\x70\x48\x1d\xf0\x2b\x85"
+ "\x7b\x1d\xf0\x44\x5d\x7f\x1d\xf0\x44\xb3\x43\x07\xfc\x32\xc2\x55"
+ "\x07\x2c\x7a\xc0\x33\x1d\xf0\xeb\xd9\x57\x57\x07\xfc\x7a\x89\xab"
+ "\x0e\x58\xa4\x11\xe5\x54\xa1\xb3\x0e\x10\x7c\x3c\xd1\x01\x8b\x64"
+ "\x92\x0e\x40\x19\xfb\x0e\xae\x37\xf4\xea\x00\x94\x85\x8b\x7c\xcb"
+ "\x13\x9a\x9c\x74\xc0\xaf\x1b\xb9\xac\x5f\x34\xc7\xce\x74\xc0\xaf"
+ "\xcd\x3c\xfd\x17\x06\xe7\x74\x87\x0e\xe0\xe9\x76\x67\x1d\xd0\x8a"
+ "\x3a\x60\xd1\xa2\x21\x74\x40\xa8\xe7\x3a\xe0\xa9\x46\x87\x0e\x78"
+ "\xaa\x51\xd2\x01\x28\xf7\x51\x07\xa0\xcc\x46\x3d\xc0\x7c\x83\xb1"
+ "\x3d\x21\x4f\x2d\x08\x30\x13\x25\xfa\x24\xc6\x39\x15\x94\xdd\xe8"
+ "\xff\x08\x75\x01\xcb\xb3\x9e\xe7\x01\x79\xde\x0c\x32\xbc\x15\x64"
+ "\x78\xab\xfe\x22\x51\x40\xbe\x86\x1c\xdc\x5f\x08\xf7\x28\xeb\x03"
+ "\xda\x40\x6f\xd8\x98\xde\x68\x40\x7d\xc3\xe9\xf5\xd4\x02\x57\xdd"
+ "\xb1\xf8\xa1\x81\xc6\x03\xb9\x4e\xba\xa3\xe8\x16\x5a\xdf\x95\xb1"
+ "\x78\xb9\xa4\x0f\x72\xe0\x1e\x75\x46\x6e\x3b\xd3\x19\x26\xd0\x19"
+ "\xcd\x5c\x67\x2c\x4e\xed\xcd\x03\x75\x60\x79\xb8\x5e\x69\x80\x3c"
+ "\x8d\x62\x9e\x52\x57\xbd\xf2\x94\xd2\x55\xaf\x2c\x3e\x89\x7a\x05"
+ "\xfd\xe4\xb2\xf8\xf2\xfa\xe2\x08\x7b\x61\x74\x1e\xea\x18\xfe\x3c"
+ "\xfc\xf7\xbd\x7a\xe5\x16\x27\xbd\x92\x28\xe9\x95\x27\xc7\x5c\xf7"
+ "\x7a\x05\xb0\x5c\x93\xf4\xcf\xa4\x57\xc2\x23\xaf\x07\xbd\x82\xbc"
+ "\x99\xe0\x34\x37\xec\x4e\xaf\xa0\x5f\x89\x9a\xd8\x1f\xba\x5e\x09"
+ "\x5f\xee\x5e\xaf\x3c\xa5\xed\xaf\x57\x9e\x9a\xe7\xd0\x2b\x8b\xf7"
+ "\xb9\xea\x95\xa7\xf5\x9e\xe9\x95\xa7\xb2\xfa\xea\x15\xa4\x65\x0e"
+ "\xdf\x5f\xd1\x86\xfa\xc4\xae\xdf\x9d\x2a\xa0\x6e\xf1\x4a\xaf\x3c"
+ "\x55\xe6\xaa\x57\x9e\x4e\x14\xf5\xde\x5b\xc3\xd7\x2b\x4f\xb3\xb9"
+ "\xa3\x1c\x49\xaf\x5c\xee\xab\x57\x9e\x5e\xe9\xaa\x57\x9e\x9e\xc3"
+ "\xf5\xc7\xd3\xd9\x5c\xaf\x3c\xbd\x50\xd4\x4f\x25\xce\xe9\x0e\xbd"
+ "\xc2\xd3\xfb\xeb\x95\xa7\x4b\x87\xd0\x2b\xaa\x1e\x43\x74\x5e\x77"
+ "\x76\x69\xaa\xad\x34\x21\x34\x64\xf9\x6d\xf6\xbe\x7d\x83\xf7\x09"
+ "\x3b\xc1\x3e\xd2\xbb\xc6\xf5\xbf\x08\xe9\x51\xe5\xe3\x5e\x62\xd6"
+ "\x37\xba\x83\xa3\x33\x5b\x62\xa1\x7f\xb4\xb9\xef\x1f\xd0\x37\x94"
+ "\x52\xdf\xa8\x89\x39\x4b\xa0\xbf\xc8\x71\x8d\x2b\x1f\xfa\x85\xd1"
+ "\xd2\xc0\xe4\x98\xaa\x59\x43\xd0\x9f\xa4\x5f\x1b\x09\xf4\x93\xc9"
+ "\xc6\xfe\x1a\xa8\x66\x87\x3e\xb2\xe0\x6e\x2a\xdc\xd3\xa8\x21\x7e"
+ "\x31\xc4\x1f\xfb\xc9\x9f\xc4\x35\x14\xf4\x3f\x81\x6b\x27\x80\xcf"
+ "\xd0\x15\xc7\x78\xff\xc8\x87\xab\x9b\xf7\x8f\xe9\xdd\x5d\xda\x3b"
+ "\xdc\xad\x9d\x18\x13\x4d\x6c\xed\x04\xcf\x07\xe1\xb9\x2c\x01\xfa"
+ "\x07\xc5\xb5\x13\x2b\xef\x13\x50\xdf\xc0\x62\xb6\x76\xd2\xe4\xb2"
+ "\x76\xf2\xe3\x46\x22\x47\xdf\x14\x05\xce\x6b\x27\xda\x9a\x7e\x7d"
+ "\x02\xfb\x0a\xf6\x89\xe1\xcb\xaf\xa5\x9a\xc1\xf6\x2f\xd9\x80\xd6"
+ "\x76\x55\x69\x2a\xcd\xdf\xa3\xfb\x63\x93\x55\x86\x7e\x3c\xed\xc0"
+ "\x3b\x01\xe4\x14\x55\xf5\x91\x53\x3d\x22\x1f\x7a\x38\x1f\x80\x87"
+ "\xca\xe7\x2c\x84\xae\xb0\x81\xad\xd5\x23\xfa\xf2\xb4\x9a\x00\x87"
+ "\xda\x49\x85\x9b\x91\xee\x6a\x52\x28\xfa\xf3\x14\x5e\x8d\xf1\x15"
+ "\x80\xd6\x34\x4d\x4e\xde\xb9\x6c\x65\x6b\x8d\xd9\xdd\x24\x04\xe4"
+ "\x92\x1f\xca\x25\xc0\xee\xf8\xe2\x6e\xa0\xfb\xd7\x9c\xee\xe8\x63"
+ "\x0d\x7f\x6d\xaf\x6a\x35\x50\xf6\x1d\x3d\x3d\x20\x97\xac\x9c\xf6"
+ "\xcf\x6d\x0c\x24\xcc\x07\x28\xae\x37\x82\xae\xaf\x05\x7e\xa3\x5c"
+ "\x7a\xd2\x12\x40\x31\x56\x87\xf0\xad\x16\xfd\x4d\x05\xdf\x67\x01"
+ "\xda\xf7\x68\x11\x1b\x81\x45\x2d\xb8\xde\x78\xca\x65\xbd\xd1\xfc"
+ "\xaa\x63\xbd\xb1\xb6\xec\x04\xdf\x1f\xe2\xa2\x3b\x9e\x3e\xd0\x53"
+ "\x18\x9d\x89\x74\x67\xba\x23\x7e\xb8\xb4\x7f\xc6\xf0\xfd\xd1\x3e"
+ "\xf0\x07\x4e\xfb\xa5\x31\x23\xa3\xfd\xbf\xf5\xf3\x95\x7a\xed\x68"
+ "\xaf\xfc\x81\xd3\xfe\x99\xe6\x91\xd1\x3e\xc2\x6d\xfc\x3f\xa4\x3d"
+ "\x8e\x3d\xa4\x71\x87\x34\xe6\x40\x3d\xc6\xf5\xf0\x32\xad\x63\xbc"
+ "\xb1\x4c\x2b\xad\xdb\x02\xcd\x14\x7a\x71\xbe\x49\xb7\x9a\xdc\x76"
+ "\x5e\xf6\xdb\x42\x69\xcd\x16\xed\x7d\xc6\xc7\x7c\xe0\xe3\x7a\x3c"
+ "\xdf\x23\xf2\x10\x74\xce\x0a\x0b\xe8\x85\x69\xd1\x79\x76\x3d\xe8"
+ "\xa4\x3d\x09\xa1\x6e\xf8\x29\x47\x7d\xe2\x17\x4f\x02\x9f\xd3\x39"
+ "\xf8\x2a\xbc\x0a\xfc\xec\x06\x3b\xcb\xda\x4a\xf0\xcc\x6e\x40\x2b"
+ "\xd8\x5f\x3d\x31\xbe\xcb\xc1\x9e\x97\x78\xfa\xa7\x04\x2b\xb3\xb1"
+ "\x06\xe4\xe9\x2e\x57\x9e\x76\x0c\xc0\xd3\x67\xd7\x40\x3f\x95\x8b"
+ "\x76\x30\xe3\xa9\xa9\x97\xa7\x4c\x8f\xbc\xaa\x0d\x46\xbe\x4a\x3c"
+ "\x45\x3d\xc2\x78\xda\xc6\xf5\x48\xaf\x7f\xa3\x57\x1d\x76\x70\x75"
+ "\xe4\xe9\x01\x78\xfa\x6f\x91\x2e\x3c\x8d\x1c\x2e\x4f\x7f\x1b\xe3"
+ "\x6a\x57\x2d\x3b\xe1\x99\x5d\xf5\xdb\xb3\x68\x3b\x39\xdb\x55\x78"
+ "\xdf\x01\x63\x75\xbb\xdf\xee\x74\x8b\x57\xb6\xd4\x6f\x2d\xae\xb6"
+ "\xd4\xb2\x72\x5e\xa7\xdf\x4c\x1c\xbe\x2d\xb5\x8c\xd9\x5f\xef\xe4"
+ "\xf3\x31\xb0\xab\x1d\xb5\xec\x6d\x57\x3b\x6a\x59\x12\xb7\x97\x96"
+ "\xd5\x77\xa4\xa1\x1d\xb5\x2c\x97\xa7\xff\x26\xd0\x39\xdd\x61\x47"
+ "\xf1\xf4\x0e\xf4\xf9\x96\xb1\xcc\x34\x3c\xdb\x69\xf2\xf7\x6c\x3b"
+ "\xa9\x07\xb1\x9d\xd4\xff\x24\xb6\xd3\xb3\xcb\x6f\xe8\x6f\x6f\x75"
+ "\xc8\x32\xcb\xc8\x74\xc8\x73\x6e\xfd\xbf\xdc\xd0\xdf\x43\xd1\xfe"
+ "\xd9\xd2\x91\xd1\x3e\x72\xa9\xf7\xfa\xfb\xf9\x56\x87\xfe\x7e\xbe"
+ "\xd5\xbd\xfe\x7e\xfe\xd9\x1b\xfa\x7b\x38\xfa\x7b\x85\x66\x64\xfa"
+ "\xfb\x79\xad\xab\xfe\x5e\xf5\x7b\xcf\xf4\xf7\xf3\x7b\x46\x5f\x7f"
+ "\x3f\xbf\xdf\x55\x7f\xaf\x4a\xe5\x75\x8a\x3c\x36\x7c\xfd\xbd\x6a"
+ "\xa5\x7b\xfd\xbd\x6a\x8d\xab\xfe\x5e\x35\x8f\xeb\xe9\x55\x3b\xb9"
+ "\xfe\x5e\xb5\x84\xa7\x47\xd6\x39\xa7\x3b\xf4\x37\x4f\xe7\xfa\x7b"
+ "\x55\xc9\xf0\xf4\x77\xc0\xf7\xac\xbf\x03\x07\xd1\xdf\x81\xff\x24"
+ "\xfa\x3b\x7a\xb0\x18\x82\x37\x74\xc8\xa0\x3a\x64\xd5\xfe\x91\xe9"
+ "\x90\xd5\x6e\xe3\x9f\x0d\xad\x43\xd6\x84\x38\x74\xc8\x9a\x10\xf7"
+ "\x3a\x24\xe6\xad\x1b\x3a\x64\x38\x3a\x24\x3a\x6a\x64\x3a\x24\x26"
+ "\xd6\x55\x87\xac\x39\xe9\x99\x0e\x89\x39\x37\xfa\x3a\x24\xc6\xea"
+ "\xaa\x43\xd6\x54\xf0\x3a\xbd\x70\xf3\xf0\x75\xc8\x9a\x3d\xee\x75"
+ "\xc8\x9a\x77\x5c\x75\xc8\x9a\x54\xae\x2b\xd6\x34\x70\x1d\xb2\x66"
+ "\x27\x4f\x7f\x21\xc8\x39\xdd\xa1\x43\x78\x3a\xd7\x21\x6b\x9a\x87"
+ "\xa7\x43\xc6\x7d\xcf\x3a\x44\x39\x88\x0e\x51\xfe\x93\xe8\x90\x17"
+ "\x07\x3d\xff\x3b\xb8\x1c\x5b\x67\x71\xc8\xb1\x75\x16\xf7\x72\x6c"
+ "\xdd\x9a\x1b\x72\x6c\x38\x72\x6c\x8d\x75\x64\x72\x6c\xdd\x1c\x57"
+ "\x39\xb6\xfe\x2d\xcf\xe4\xd8\xba\x3f\x8f\xbe\x1c\x5b\x57\xee\x2a"
+ "\xc7\xd6\x67\xf3\x3a\xbd\x78\x7a\xf8\x72\x6c\xfd\x3a\xf7\x72\x6c"
+ "\xfd\x4b\xae\x72\x6c\xfd\x42\x2e\xaf\xd6\x97\x70\x39\xb6\x7e\x39"
+ "\x4f\x7f\xb1\xd1\x39\xdd\x21\xc7\x78\x3a\x97\x63\xeb\xf7\x0e\x25"
+ "\xc7\xb0\x5f\xd4\xa8\xfb\xf4\x8b\x17\xa5\x7e\xb1\x31\xf8\x53\x83"
+ "\xd4\x2f\x36\x32\x1b\x4d\x30\xac\x56\xbf\x9e\x40\x14\xd9\x18\xaf"
+ "\x05\x64\x84\xee\xb7\xd8\x2f\x74\x6f\xe0\xfe\x12\x55\x23\xc8\xbd"
+ "\x66\x51\x0e\x26\x82\x1c\x6c\x86\x7b\xf4\x65\x36\x6d\xb5\x1a\xe5"
+ "\x17\xee\xd3\xc0\x7b\x2e\x0f\xcd\x63\x30\x5e\x0c\x5b\x67\x77\xea"
+ "\x37\xac\xaf\x74\x88\x7d\xa5\x83\xf7\x15\xe9\xbc\x5c\x52\x33\x15"
+ "\xec\x9b\xb4\x93\xc2\xa3\x7c\x28\xf6\x1f\x76\x0e\x0b\xfa\x0f\xdd"
+ "\xa4\xf5\x37\xc4\x41\x9f\x31\xb7\x12\xf4\x57\x8f\x7d\xc6\x6f\xab"
+ "\xcc\x9f\x76\xc4\xf8\x82\x4c\xe4\xb2\x4f\xa8\x1c\x63\x43\xdf\x53"
+ "\x9b\x40\xf6\xb5\x83\xec\x6b\x77\xf4\x15\x5c\x3b\xef\xd8\xa4\xd5"
+ "\x58\x36\x69\xa7\xf7\x74\x80\xec\x33\xf7\xed\x27\x33\x43\x8a\xdb"
+ "\x51\xf6\xb5\xb2\x7e\xc2\x64\x1f\xf4\x0d\xa1\x03\x64\xdf\x0b\xa2"
+ "\xec\xeb\xd0\xa2\xac\x0f\x2c\x5e\x0d\xb2\x2f\xf2\x3c\x97\x7d\xa2"
+ "\x0d\x77\x27\xca\xbe\x4d\x5a\xf9\xef\xda\x45\xd9\xb7\x12\x65\xdf"
+ "\x11\xe8\x23\x7f\x73\x95\x7d\x7e\xde\xca\x3e\xdd\x72\xd7\x7e\xb2"
+ "\xf1\xa8\x67\xfd\x44\x77\xd2\x5d\x3f\xe9\xd1\x7b\xdb\x4f\x74\xad"
+ "\xae\xfd\x64\xe3\x7e\xb1\xef\x76\x0e\xbf\x9f\x6c\xfc\x7d\x6f\x3f"
+ "\x79\xb1\x6f\x3f\xd9\x58\xe8\xda\x4f\x36\xea\x78\x7f\xd8\x58\xc9"
+ "\xfb\xc9\xc6\x74\xb1\xff\x58\x9c\xd3\x1d\xfd\x84\xa7\xf3\x7e\xb2"
+ "\xb1\xfe\xc6\x7a\xf9\x0f\x4d\xdf\x6f\x5a\x72\x63\xbd\xdc\xdb\x31"
+ "\xe3\xc6\xd6\x91\x8d\x19\xe3\xab\x6f\xcc\xb7\x7b\x4b\xfb\x4d\x79"
+ "\x23\xa3\x7d\xc2\xc2\x1b\x73\x25\xde\xd2\xfe\xa5\xa0\x91\xd1\xfe"
+ "\xe5\x8a\xa1\xc6\x18\xee\x6d\xa9\xcd\xba\xea\xde\x31\xc6\x66\x9d"
+ "\xb4\x3f\xb7\xff\x18\xe3\x95\xb3\xae\x67\xe9\x12\x5f\xea\xbb\x77"
+ "\x76\xa8\xb1\x87\xed\xc6\xd8\x03\x78\x9d\x90\x3b\xb2\xb1\xc7\x2b"
+ "\x7d\xf6\x27\xbe\x3a\xcd\x33\x9b\x6a\xf3\x2c\x77\x36\x95\xcd\xeb"
+ "\xb1\xc7\xe6\x79\xae\x36\xd5\xab\x4a\x11\x1b\x8f\x0e\xdf\xa6\xda"
+ "\x7c\xce\xbd\x4d\xb5\xf9\x92\xab\x4d\xb5\xb9\x82\xdb\x4e\xaf\x06"
+ "\x73\x9b\x6a\x73\x03\x4f\x4f\x0c\x73\x4e\x77\xd8\x54\x3c\x9d\xdb"
+ "\x54\xaf\x6a\x6f\xac\xa3\xff\xd0\x6c\xaa\xa4\xd2\x1b\x7a\xdd\x5b"
+ "\xdd\xf2\xea\xbc\x91\xe9\x96\xe4\xef\x71\xff\xe7\x0f\x5d\xaf\x27"
+ "\xb5\x8d\x8c\xf6\x29\x83\xee\xff\x1c\x5c\xaf\xa7\x2d\x74\xe8\xf5"
+ "\xb4\x85\xee\xf5\xfa\xd6\x83\xae\x7a\x3d\x75\xf1\x0d\xbd\xee\x8d"
+ "\x5e\x4f\x8e\x19\x99\x5e\xdf\x9a\xe9\xaa\xd7\xd3\x3a\x3d\xd3\xeb"
+ "\x69\x63\x46\x5f\xaf\xa7\x05\xb9\xea\xf5\x34\x93\x88\x8d\x29\xc3"
+ "\xd7\xeb\x69\x87\xdc\xeb\xf5\xb4\xa3\xae\x7a\x3d\x4d\x3c\xa7\x96"
+ "\x66\xe1\x7a\x3d\x6d\x1f\x4f\x4f\x55\x3b\xa7\x3b\xf4\x3a\x4f\xe7"
+ "\x7a\x7d\x1b\xb9\xb1\xbe\xfe\x43\xd3\xeb\xe9\x49\x37\x74\x8b\xb7"
+ "\xba\x65\xdb\x08\xc7\x8c\xaf\x59\xbd\xd7\x2d\x99\xa5\x0e\xdd\x92"
+ "\x59\xea\x5e\xb7\x64\x4e\x71\xd5\x2d\x19\x6f\xdf\xd0\x2d\xde\xe8"
+ "\x96\xf4\x8a\x91\xe9\x96\xff\xdd\xec\xaa\x5b\xb2\x9e\xf2\x4c\xb7"
+ "\x64\xae\x1c\x7d\xdd\x92\xa9\x73\xd5\x2d\x59\xf3\x44\x6c\xbc\x34"
+ "\x7c\xdd\x92\x35\xcd\xbd\x6e\xc9\x9a\xe9\xaa\x5b\x32\xad\x5c\x87"
+ "\x64\x2d\xe1\xba\x25\x4b\xc5\xd3\x33\xe2\x9d\xd3\x1d\xba\x85\xa7"
+ "\x73\xdd\x92\xb5\xfc\xc6\xba\xfb\x0f\x4d\xb7\x6c\x1f\x74\xff\xef"
+ "\xe0\xf2\x4d\x9f\xee\x90\x6f\xfa\x74\xf7\xf2\x2d\xfb\x8a\xab\x7c"
+ "\x7b\x3d\xeb\x86\x7c\xf3\x46\xbe\x65\xe9\x46\x26\xdf\xb2\x2b\x5c"
+ "\xe5\x5b\x8e\x87\xfe\x80\xf4\x8f\x8e\xbe\x7c\xd3\xf7\xf1\xff\x90"
+ "\x23\xfa\x00\x7a\xfd\x99\xe1\xcb\x37\xbd\xdd\xbd\x7c\xcb\x19\xe3"
+ "\x2a\xdf\xf4\xa2\xff\x9f\x9c\x50\x2e\xdf\xf4\xa2\xff\x9f\xd7\x97"
+ "\x3a\xa7\x3b\xe4\x1b\x4f\xe7\xf2\x2d\x67\xde\xc8\xd6\xe3\x73\x2b"
+ "\x1c\xeb\xf1\xb9\x8c\x17\x42\xde\x9e\x85\xfd\xd7\xe3\x73\x1f\xc2"
+ "\xf5\x78\x47\x7f\xc9\x39\xc8\xd6\xe6\xb1\xcf\x58\xb8\xff\x9e\x01"
+ "\xd7\xe9\xa7\xec\x59\x78\x63\x9d\xfe\x6a\xae\xd3\xe7\x2a\x5c\xfb"
+ "\xcf\x1b\x1b\x3d\xeb\x3f\xb9\x5b\x47\x7f\x9d\x3e\x37\xd7\xb5\xff"
+ "\xbc\xb1\x5c\xc4\xca\x6b\xc3\xef\x3f\x6f\x3c\xec\xbe\xff\xbc\xb1"
+ "\xc0\xb5\xff\xbc\x21\x8e\x31\xdf\xd0\xf1\xfe\xf3\x46\x08\x4f\xcf"
+ "\x49\x77\x4e\x77\xf4\x1f\x9e\xce\xfb\xcf\x1b\x49\x9e\xd8\x07\x36"
+ "\x55\x69\x3a\xea\xfb\x90\xc6\xdb\xec\xbd\x38\x8f\x17\x71\x3e\x90"
+ "\x7d\xf0\x3c\xd7\x17\xcc\x36\x28\x4d\x98\x33\xa4\x7d\xd0\x2c\xda"
+ "\x07\x51\xfd\xed\x03\xc9\x36\x30\x00\xbe\xf3\x3d\x5a\xa3\x17\xf1"
+ "\x8e\xb6\xc1\xe5\xe1\xda\x06\x5a\x87\x6d\xa0\xef\x63\x1b\xbc\xd0"
+ "\xc7\x36\x60\x78\x6f\x72\xc1\x7b\x3f\xdb\xa0\x17\xef\xa3\x65\x1b"
+ "\xfc\xbb\xe5\xc6\x1a\xbd\xb7\xe3\xce\x37\x72\x47\x36\xee\xdc\xa9"
+ "\xbb\x31\x97\xef\x2d\xed\x7f\x37\xc2\xb9\xfc\xdf\xb7\xdd\x98\x6f"
+ "\xf1\x96\xf6\x3b\x47\xe8\xcb\xe1\x3f\xdc\xc6\x7f\x1a\xda\xbe\xca"
+ "\x9f\xe3\x18\x8f\xe4\xcf\x91\xec\x2b\xc9\x37\x22\xc8\x67\x85\x3e"
+ "\x0e\xae\xcb\x84\xbc\x1e\xc7\xe2\x0c\x28\x8d\xcd\x27\x88\x2e\x19"
+ "\x6d\xae\x5d\x6f\x87\x27\x3a\xdb\x5c\x79\xb3\x24\x7b\x2b\x1c\x6d"
+ "\x31\xb0\xad\xd0\xae\x92\xc6\x20\xe8\xd7\x6a\xd0\xfd\xc3\x33\x13"
+ "\xe6\xe0\x98\xa5\xc7\xaf\x34\xfd\x9f\x77\xbc\xf2\xe6\x9c\x91\x8d"
+ "\x57\x76\xc5\xbb\xda\x5b\xf9\x5f\x7b\x66\x6f\xed\xba\x34\xfa\xe3"
+ "\x95\x7c\xe2\x6a\x6f\xe5\x57\xf3\x3a\xfd\xc7\xd9\xe1\xdb\x5b\xf9"
+ "\xef\xb8\xb7\xb7\xf2\xff\xe2\x6a\x6f\xe5\x67\x72\xbb\x2a\xdf\xc4"
+ "\xed\xad\x7c\x03\x4f\xff\x8f\x66\xe7\x74\x87\xbd\xc5\xd3\xb9\xbd"
+ "\x95\xdf\xe6\xa1\xbd\x95\x39\x02\x7b\x6b\xee\x0f\xc7\xde\xba\xfb"
+ "\x3a\xb7\xb7\x0c\x6e\xe3\xbf\x39\xe9\x9d\xf4\x3e\x7a\x67\xce\x0d"
+ "\xbd\x83\xb2\xa6\x80\x8c\x4c\xef\x14\x9a\x86\xa4\x7d\xb6\x13\xed"
+ "\x51\xe6\x8b\x74\xb7\xcf\x48\x98\xe3\x35\xed\x41\xd6\x17\x26\xff"
+ "\x90\xe9\x6e\xd8\x3b\x32\xba\x17\xbb\x8d\x7f\x7c\xc3\xd6\x1a\x8a"
+ "\xf6\x45\xda\x91\xd1\xbe\xa4\xde\x7b\x5b\x6b\x77\xf9\xa7\xbd\xb6"
+ "\xd6\xee\xf2\xbe\xb6\x16\xda\x56\x8b\xad\xdc\xe6\x7a\x1d\x6c\xa5"
+ "\xed\xeb\xc1\xee\x4a\x20\xc4\xd8\x7c\x90\x64\x83\xed\xb5\xfd\x22"
+ "\xd8\x5f\xb1\x60\x7f\xd9\xf6\x88\xf6\xd7\xee\x07\x5c\xed\xaf\xb7"
+ "\xde\x19\xd0\xfe\xf2\x73\xd8\x5f\x36\xb0\xad\x7a\xf6\x24\xcc\xc9"
+ "\xbd\xe8\x64\x8b\xad\xed\x6f\x8b\x75\xeb\x4b\x33\xbb\x67\x26\xcc"
+ "\xed\x01\x7b\x6c\x30\x5b\x8c\x61\x62\x00\x7b\xec\xff\x0f\x5b\xac"
+ "\xb8\x64\x64\xb6\xd8\x6e\xe2\x6a\x8b\x95\xae\xf3\xcc\x16\xdb\xbd"
+ "\xc5\xed\xdc\x97\xd7\xb6\xd8\xee\x6c\x57\x5b\xac\x34\x42\xc4\xcc"
+ "\x53\xc3\xb7\xc5\x4a\x1f\x72\x6f\x8b\x95\x3e\xea\x6a\x8b\x95\x8a"
+ "\x67\x4f\x4b\x63\xb9\x2d\x56\xaa\xe5\xe9\x6f\x2d\x71\x4e\x77\xd8"
+ "\x62\x3c\x9d\xdb\x62\xa5\x89\x1e\xae\x8d\xa5\xdb\x40\xa7\x7f\xff"
+ "\xfb\x29\x07\x5b\x1b\x1b\xad\xfd\x94\xda\xeb\x7c\x6d\x6c\xcf\xd0"
+ "\xf3\x5f\x37\x6c\x82\x01\x64\x4d\x69\xf6\xc8\xf4\xd2\x7f\xc7\xde"
+ "\xb0\x09\xbc\xa5\xfd\x7f\x8d\x70\xee\xab\xac\xd5\x7b\x9b\xe0\x8f"
+ "\xfb\x1d\xf3\x2f\x7f\xdc\x3f\xbc\xf9\x97\x3f\xde\xed\xaa\xff\xdf"
+ "\x1e\x58\xff\xdf\x98\x7f\x19\x86\xce\xff\xef\xfd\x23\xd3\xf9\x7f"
+ "\xb0\xb8\xea\xfc\xbd\x2b\x3d\xd3\xf9\x7f\xdc\x38\xfa\xf3\x2f\x7f"
+ "\x4c\x75\xd5\xf9\x7b\x17\x89\x38\x89\x1e\xbe\xce\xdf\x3b\xcb\xbd"
+ "\xce\xdf\xfb\x80\xab\xce\xdf\xab\xe4\xba\x7d\x6f\x24\xd7\xf9\x7b"
+ "\x83\x79\xfa\xdb\x51\xce\xe9\x0e\x9d\xcf\xd3\xb9\xce\xdf\x1b\x3b"
+ "\xbc\xf5\xae\x80\xeb\x74\xbd\x2b\xf0\x9f\x64\xbd\xeb\x9d\xe6\x1b"
+ "\x7a\xc7\x5b\xbd\xb3\x37\x75\x64\x7a\xe7\xdd\x48\xef\xf5\xce\x7b"
+ "\x21\x0e\xbd\xf3\x5e\xc8\xf0\xf4\xce\x9f\xdf\x72\xd5\x3b\xfb\x66"
+ "\xde\xd0\x3b\x23\xd5\x3b\x7f\x0a\x19\x99\xde\xf9\x73\x1f\xff\x47"
+ "\xef\x79\xe8\xff\xe8\xcf\x6e\xfd\x1f\x79\xaf\x77\xfe\xdc\xc7\xff"
+ "\xd1\x7b\xa2\xff\xa3\x77\xbd\xf0\x1b\xf2\xde\x1e\xf7\x7a\xe7\xbd"
+ "\x3e\xfe\x8f\xde\x4b\xe5\xfa\xe5\x3d\xd1\xff\xd1\x7b\xa2\xff\xa3"
+ "\x77\x1b\x9d\xd3\x1d\x7a\xe7\x5d\x27\xbf\x21\xef\xdd\xf0\x7f\xf4"
+ "\x83\xdb\x87\xb9\x7f\x04\xf2\xef\xaf\x2a\x87\xfc\xfb\xab\xca\xfd"
+ "\x3e\xcc\xff\xd9\xea\xba\x0f\xf3\x2f\x13\x6f\xec\xc3\xf4\x46\xbe"
+ "\xbd\x37\x42\xbf\x48\xff\xb3\xc8\x55\xbe\xfd\xf5\x7d\xcf\xe4\xdb"
+ "\xff\x1c\x1d\x7d\xf9\xf6\x3f\x0d\xae\xf2\xed\xaf\xa5\xbc\x4e\xfb"
+ "\xbd\x90\x6f\x7f\x7d\xcd\xbd\x7c\xfb\xab\xde\x55\xbe\xfd\x35\x92"
+ "\xcb\xb1\xbf\x1e\xe0\xf2\xed\xaf\xf1\x3c\x7d\x7f\xa3\x73\xba\x43"
+ "\xbe\xed\x77\x92\x6f\x7f\xad\x18\xde\xba\xa6\x57\x76\xf5\x35\x58"
+ "\xd7\x1c\x2d\xbb\xfa\x7a\x5f\xd7\x7c\x7f\xde\x8d\x79\x34\x6f\x6c"
+ "\xea\xbf\x36\x8c\xcc\xa6\xfe\xdb\x7e\xef\x75\xca\xc1\x3c\x87\x4e"
+ "\x39\x98\xe7\x6e\x7d\x67\x3b\xe0\x2e\x1b\x6c\xe2\xac\x8b\x44\xf1"
+ "\x3a\xae\xef\xd4\xd7\x10\x3d\xae\xef\xac\x97\xd6\x77\x0a\x45\x3b"
+ "\xfb\xa0\x9f\xab\x9d\xfd\x7f\xf5\x03\xd9\xd9\x68\x5f\xdb\xc1\x76"
+ "\xb6\xf5\x5d\xd7\xf9\xed\xc0\xba\xa8\xdb\xaf\x34\xf3\xca\x9e\x84"
+ "\xb9\xc3\xd5\x45\x05\x9b\xb9\x2e\xca\xff\xc1\xeb\xa2\xf7\xd3\x47"
+ "\xa6\x8b\x3e\x68\x70\xd5\x45\x1f\x2e\xf0\x4c\x17\x1d\x7c\x66\xf4"
+ "\x75\xd1\xc1\x28\x57\x5d\xf4\x61\xa8\x88\x95\xd9\xc3\xd7\x45\x1f"
+ "\x4e\x74\xaf\x8b\x3e\x9c\xe2\xaa\x8b\x0e\xb6\x71\x9d\xf3\xe1\x7c"
+ "\xae\x8b\x3e\x24\x3c\xfd\xff\x86\x3a\xa7\x3b\x74\x11\x4f\xe7\xba"
+ "\xe8\xc3\x25\xc3\x9b\xe3\x19\x77\x9d\xce\xf1\x28\xff\x49\xe6\x78"
+ "\x3e\xaa\xf4\x5e\x26\x7e\x9c\x5d\xdd\x7b\x7e\xe3\xe3\xec\x7e\xf3"
+ "\x0c\x09\x60\x6f\xb7\xf3\x75\xee\xde\x79\x06\xd3\x69\x51\xfe\x7d"
+ "\x2c\x73\x95\x7f\xe5\x6e\xe5\xdf\x60\x6b\xd9\x38\xaf\x60\x07\xd9"
+ "\x68\x2b\x1c\xc1\x5a\x76\xc2\x0f\x5d\xe6\x7d\x38\x42\xff\xca\x87"
+ "\xaa\x5d\x65\xde\xe1\x87\x3c\x93\x79\x1f\xff\xca\xad\xcc\xf3\xfa"
+ "\x1c\xc7\xc7\x11\xae\x32\xef\xf0\x0c\x11\x1f\x0b\x86\x2f\xf3\x0e"
+ "\x8f\x71\x2f\xf3\x0e\xfb\xb9\xca\xbc\x8f\x4d\x5c\xb6\x1d\x9e\xcb"
+ "\x65\xde\xc7\x16\x9e\x5e\x3e\xdf\x39\xdd\x21\xf3\x78\x3a\x97\x79"
+ "\x87\xe7\x0f\x26\xf3\x68\xf6\xda\xcc\x5c\xb9\xb0\x0f\xae\x03\x50"
+ "\xc7\x29\x80\x8d\x72\xf8\xbf\x12\x78\x3c\x11\xfe\xaf\x73\xd7\xff"
+ "\xcc\x7e\x6b\x33\x85\x34\xa8\xb3\x9c\xc8\x8c\xe6\xef\xca\xcb\xa7"
+ "\xda\xb0\xde\xe2\x99\xb5\xb5\x99\x01\xb6\x71\x0b\x05\x1a\x43\x80"
+ "\x2f\x99\x2c\x36\x26\xe4\xc7\xf3\x41\x9a\x04\xe2\x7f\x51\x76\xb8"
+ "\x59\xca\x07\xf5\xf5\x6f\x92\x1d\x7e\x0b\xcb\x80\xba\x9a\xa1\x2d"
+ "\x4b\xdc\xd6\x15\xca\x0a\x7f\x7b\x3a\xd9\x62\xa3\xdf\x96\xaf\x6f"
+ "\x27\xcd\xb2\x8a\x87\x02\xda\xc6\x2d\xa4\x29\x11\x04\x6d\xb9\x7d"
+ "\x53\xcd\x0a\x2c\x13\xe3\xe9\xc2\xb3\x60\x7c\x66\x87\x3a\x26\xaf"
+ "\x23\xf2\x9c\xf6\x71\x4a\x90\x13\x63\x52\x2c\xb4\x75\x83\x0d\xea"
+ "\x0c\xd8\xfc\x68\x7a\x83\xe2\xdd\x7c\x48\xb3\x13\x35\xc6\x26\xc5"
+ "\x32\xc0\x9e\x85\xfa\x54\x3c\x5c\x04\xf9\x07\xaa\xc3\x6b\x7f\x22"
+ "\x21\x63\xee\xa6\xa6\xe1\xe1\xa6\x22\xd7\x1d\x1d\x03\xb6\x4e\x27"
+ "\xe5\xf7\x00\xed\x34\x44\x3e\xd0\xf3\x61\x7e\x67\xb0\xf3\xef\x4a"
+ "\x8c\x6d\x9c\xb2\x8b\xc8\x77\x08\xe3\x94\x87\x93\x58\xfc\x61\x73"
+ "\x57\xc6\x91\x28\x93\xec\x1e\x16\x3b\x14\xe3\x5a\x62\xfc\x77\xc0"
+ "\x0d\x81\xf4\xa4\x43\x89\x84\xf4\xe5\x45\x5c\xd4\xba\x95\x9a\xf8"
+ "\x35\xeb\xa2\x37\xbc\x14\xaf\x99\x19\x35\x9e\x2c\xdd\xb0\x41\xb3"
+ "\x6e\xe5\xfa\x57\x34\xce\x4f\x7e\xaa\x89\x5a\xb3\x69\xe5\xf3\xb1"
+ "\xd1\xb3\xd6\xad\xd2\x8d\xc7\xcd\x28\x4e\xf5\x08\xc2\xba\x08\x19"
+ "\x47\x32\x8b\xfe\x9d\x90\xdf\x4d\x22\x0a\xac\x17\x7c\xaf\x4d\x8a"
+ "\x61\x8a\x31\x3c\xe5\x90\x27\x05\xe4\xe3\x8e\xe4\x71\x90\xb7\xc2"
+ "\x5a\x0c\xf5\x2a\x82\x7a\x43\x1d\xa1\xce\x7f\x57\x4b\x75\x96\x30"
+ "\x91\x82\x98\x48\x6e\x07\x0c\xfe\xfd\xa1\x00\xeb\xb8\x5f\x52\x1a"
+ "\x81\xed\xc3\x7e\x22\x83\xb4\x2c\xa6\xcb\xf4\x6b\x33\xe1\xdd\xa5"
+ "\x12\xc6\xf0\x5d\x9a\xb3\x76\x49\x17\xf6\x13\x1a\xf3\x73\xde\xa7"
+ "\x3e\x09\x79\x46\x2b\x23\x3c\x86\xea\xdf\x53\x1d\x31\x54\x3f\x61"
+ "\x73\xd5\x50\x8f\x36\x48\xcf\x33\x91\x1e\x16\xf3\x18\x63\xff\x62"
+ "\x2c\x54\xac\x33\xb4\x0b\x74\x29\x2d\xa7\x69\x22\xf6\x33\xdf\x8f"
+ "\x10\x32\x3f\x37\x19\x15\x97\x49\xb8\x8d\xf6\xd0\xac\xf7\x23\x6a"
+ "\x2d\x16\x12\xb0\x55\xb7\x8a\x8e\x3d\xb2\x2b\xc0\xb6\x26\x1a\x63"
+ "\xb8\x0a\x59\x9f\x9b\x68\x56\xdd\xce\x67\xee\x26\x81\x50\xb6\xc5"
+ "\x29\x96\xab\x62\x78\xfc\xff\x3b\xe3\x3f\xf2\x11\x63\xb4\x72\x3e"
+ "\x7e\x32\xff\x50\x7c\x7f\x3e\xf6\xe2\xef\x6d\x81\x1c\x01\x2c\x50"
+ "\x55\x7e\x5d\xb8\x9d\xd3\x11\xfb\x6e\x47\x4a\x0c\xb9\x8f\xd1\xee"
+ "\x13\x9b\x90\x93\xbf\x4f\xc8\xce\x6f\xa5\xd9\xf9\xf5\x40\xb3\x98"
+ "\x9c\x04\xa2\x59\x61\x0f\x24\xfa\xcb\x24\xd4\xac\xcf\xaf\xf3\x93"
+ "\xa5\xca\xc0\x1e\x91\x83\x3e\x09\x05\x99\x11\x2a\xf6\xf7\x18\xa4"
+ "\xe3\x27\x60\xad\x3d\xb9\x89\x90\x6f\xe7\x11\x9f\x22\x78\x6f\x78"
+ "\xed\xf9\x84\xe9\x7f\x9a\xf1\x49\x6a\x31\xbc\x8b\x31\x7a\x87\xf7"
+ "\x7e\xa5\xd2\x6d\xbf\xeb\x6d\x77\xc1\x92\x81\xdb\x5d\x69\x11\x72"
+ "\x0a\x42\x85\xec\x82\x18\x9a\x5d\xb0\xb4\x7f\xbb\x0b\x96\xf0\x76"
+ "\x8f\x69\x1f\xfd\x76\x57\x96\xf3\x76\x57\x26\x7a\xd7\xee\xa3\xc4"
+ "\x83\x76\xbb\xe1\xf7\xd1\x36\x68\x37\xf0\xbb\x00\xf8\x5d\x30\x00"
+ "\xbf\x0b\x44\x7e\x4f\x68\x1a\xfd\x76\x1f\x3d\xc0\xdb\x7d\x54\xe7"
+ "\x65\xbb\xdd\xca\x3f\x47\xbb\x0d\x6e\xf8\x5d\xd5\x2c\xe4\x18\x80"
+ "\xdf\x06\xe0\xb7\x61\x00\x7e\x1b\x44\x7e\x4f\x3c\x3e\xfa\xed\xae"
+ "\xe2\xfe\x0f\x33\xaa\x62\xbc\x6b\x77\x95\xd9\x83\x76\xbb\xe1\xf7"
+ "\xa7\x8d\xd0\x6e\xe0\xb7\x01\xf8\x6d\x18\x80\xdf\x06\x91\xdf\x0f"
+ "\x6e\x1f\xfd\x76\x7f\xca\xe3\x3f\x67\x7c\x1a\xe9\x5d\xbb\x3f\x75"
+ "\xbb\xff\xc5\xd1\xee\x42\x37\xfc\xae\xae\x17\x72\x0a\x81\xdf\x85"
+ "\xc0\xef\xc2\x01\xf8\x5d\x28\xf2\x7b\xd9\x63\xa3\xdf\xee\xea\x12"
+ "\xde\xee\xea\x08\xef\xda\x5d\xed\x76\xff\xbb\x93\x3c\x6f\x00\x99"
+ "\xdd\x8f\xe7\xc6\xc4\xb9\xe4\xde\xcb\xd8\xfe\xda\xf9\xd4\x2f\xbf"
+ "\x61\xc2\xd6\x54\x99\x4d\x95\xdf\x38\x01\xc6\x72\x05\x69\x42\x4c"
+ "\x80\x89\xf8\x42\x5b\x63\x68\x4e\xb1\x0e\x7f\x05\x28\xc7\x06\xb2"
+ "\xdf\xae\xca\xaf\xef\xce\x5e\x1b\xf3\xfa\x6a\xa2\x49\x31\x93\xc0"
+ "\xda\x64\x13\x49\xd6\x51\x73\x2d\xf9\x9a\xf8\x99\x88\x1c\xe7\xcb"
+ "\x3e\x6d\x3b\x40\xd6\xc7\x51\x0a\x65\xcf\xc2\x31\x66\x4e\x0b\x09"
+ "\x05\x9b\x38\x95\x82\xfe\xc8\x15\x88\x06\xca\x0f\x45\x5a\x42\xd9"
+ "\x71\x01\x4b\x89\xec\xc3\xe7\xad\x04\xe9\x89\xb4\x85\xf1\x68\x28"
+ "\xa3\xab\x85\x90\x5f\x2f\xe3\x74\x2d\x58\x3d\x5c\xba\xd6\xf0\xf5"
+ "\xbf\xec\x7c\xb3\xd1\xd4\x4d\xc0\xb6\x0c\xc4\x33\xf7\x90\xbe\xbf"
+ "\x56\xd7\x0e\x63\x91\x9a\x08\xaa\xcf\x37\x09\xa0\xb3\x86\x57\x6e"
+ "\xad\x5b\xff\xd7\x4e\xf2\x34\x02\x64\x66\x3f\xac\x39\xe8\x6d\xdc"
+ "\x4f\xfd\x0a\x22\x38\xbd\x0b\x96\x4f\x68\x1c\xd3\x3e\x30\xbd\x0b"
+ "\x22\x6c\xa0\x73\xec\xaa\x82\xa5\x9e\xd3\xdb\x58\xe8\x4a\xef\x82"
+ "\xd0\x6b\x43\x6f\xa3\x18\xff\xb4\x40\xe7\x4a\x6f\xe3\x0c\x4e\xef"
+ "\xda\x4a\xaa\x2f\x88\x14\x40\x57\x0e\xb3\xdc\x72\x0f\xe8\x0d\xf8"
+ "\xee\xaf\xc3\x1c\xf4\x3e\x36\x03\xe8\x2d\xe2\xbb\x00\xf0\x3d\xa1"
+ "\xc9\x0d\xbd\x01\xdf\x05\x80\xef\x82\x61\xe0\xfb\x98\x5f\x1f\x7a"
+ "\x5f\x23\x7c\xd7\x89\xf3\x7f\x05\x7d\xf0\x5d\xb7\x93\xd3\xbb\x0e"
+ "\xc6\xb9\x05\x80\xef\x82\x61\xe2\xfb\x58\xa8\x07\xfa\x03\xf0\xdd"
+ "\x5f\x77\x3a\xe8\x7d\x7c\x27\xf5\x33\x88\xf8\x36\x00\xbe\x27\x1e"
+ "\x1f\x98\xde\x06\xc0\xb7\x01\xf0\x6d\x18\x06\xbe\x8f\x6f\x71\xa5"
+ "\xb7\xe1\x1a\xe1\xfb\x38\xf7\x31\x99\x6d\xe8\x83\xef\xe3\x0a\x4e"
+ "\xef\x63\x65\x54\x6f\x00\x7c\x1b\x86\x89\xef\xe3\x25\x1e\xd0\x1b"
+ "\xf0\xdd\x5f\x67\x3b\xe8\x5d\xaf\x00\x7a\x8b\xf8\x36\x00\xbe\x1f"
+ "\xdc\xee\x86\xde\x80\x6f\x03\xe0\xdb\x30\x0c\x7c\x7f\x76\xa1\x0f"
+ "\xbd\xaf\x11\xbe\x3f\x3b\x20\xd2\xbb\x0f\xbe\x3f\x8b\xe7\xf4\xfe"
+ "\x4c\x0d\xf4\x06\x7c\x1b\x86\x89\xef\xfa\x40\x0f\xec\x04\xc0\x77"
+ "\x7f\x5b\xc1\x41\xef\x13\xf1\xd4\xaf\x50\xc4\x77\x21\xe0\x7b\xd9"
+ "\x63\x03\xd3\xbb\x10\xf0\x5d\x08\xf8\x2e\x1c\x06\xbe\x4f\x3c\xeb"
+ "\x4a\xef\xc2\x6b\x84\xef\x13\x62\xfc\xcb\xc2\x3e\xf8\xae\x6f\xe6"
+ "\xf4\xae\xcf\xa4\xfa\x42\xc0\x77\xe1\x30\xf1\x7d\x22\xd5\x1b\xfb"
+ "\x64\x53\x21\x51\xba\xd2\xfc\xf3\xd6\xab\x67\xa3\x7c\x7e\xec\xfb"
+ "\xb1\x51\x3e\x37\x0c\x6c\xa3\x7c\x1e\xc1\x69\x7e\xc2\xe6\x9d\x8d"
+ "\xf2\xb9\xdb\xf3\x0f\x83\xd9\x28\xfd\x69\xde\xb0\xfc\xea\xd9\x29"
+ "\x0d\x0b\xbe\x1f\x3b\xa5\x21\x70\x60\x3b\xe5\x8b\x6a\x4e\xf3\x2f"
+ "\x74\xde\xd9\x29\x0d\x6e\xfd\x1f\x0c\x66\xa7\xf4\xa7\xf9\xc9\xba"
+ "\xab\x67\xab\x9c\x7c\xff\xfb\xb1\x55\x4e\xa6\x0f\x6c\xab\x9c\x0c"
+ "\xe3\x34\x6f\x68\xf6\xce\x56\x39\xd9\xe8\x8d\xad\xd2\x9f\xe6\x5f"
+ "\xce\xbf\x7a\xf6\xca\x97\xb3\xbe\x1f\x7b\xe5\x94\x75\x60\x7b\xe5"
+ "\x94\x38\xfe\x39\x15\xe1\x9d\xbd\xf2\xa5\x07\xe3\x9f\xfe\xf6\x4a"
+ "\x7f\x9a\x37\x1e\xb8\x7a\x36\x4b\xe3\x5b\xdf\x8f\xcd\xd2\x18\x3b"
+ "\xb0\xcd\xd2\xa8\xe5\x34\xff\xb2\xda\x3b\x9b\xa5\xd1\x6d\xfc\x93"
+ "\xc1\x6c\x96\xfe\x34\xff\x2a\xe4\xea\xd9\x2d\x5f\xdd\xfc\xfd\xd8"
+ "\x2d\xa7\x4d\x03\xdb\x2d\xa7\x0d\x9c\xe6\xa7\xc3\xbc\xb3\x5b\xbe"
+ "\x9a\xeb\x8d\xdd\x82\xb4\x46\x9a\xa3\xad\xc2\x69\x6e\xb2\x51\xff"
+ "\xfc\x7d\x3d\x60\x8f\xf8\x01\xdd\xfd\xda\x88\xbc\x10\x69\xde\xc0"
+ "\x69\x6e\xf7\x2f\xd6\x01\x7d\x62\x90\x66\xac\x1d\xff\x50\xfb\xdb"
+ "\xb3\xf3\x1b\xa9\x9c\x40\x5b\x94\xa4\x45\x76\xc6\xd7\x96\x46\xfc"
+ "\x35\xc9\x5b\xe1\x7f\xd3\x05\xcc\xa3\x49\xce\x38\x0d\x6d\xf4\xc1"
+ "\x35\x0a\x9b\x7e\x6d\xa0\xdd\xaf\x28\x17\x9e\xfd\x8a\x4e\x5b\x1d"
+ "\xd8\x03\xb6\x04\x7d\x51\x1d\x64\x6c\xdb\x47\x8c\xb6\x2a\x52\xdb"
+ "\xf0\x37\x22\xf8\x17\xc7\xdd\x67\x23\x5a\xfa\x0f\x6d\x50\x75\xbc"
+ "\x89\xd8\x57\xa9\x55\xc6\xc4\x4a\xc0\xc5\x7b\x24\xbc\x95\x5e\xa6"
+ "\xdf\x68\x55\x3d\x7e\xbb\xeb\xec\x7e\xc5\x4b\xec\xfa\xd2\x3c\x9b"
+ "\xdf\xee\xf2\x77\x12\x4c\x72\x95\x95\x68\x63\x9b\x29\xcd\x79\x9e"
+ "\x28\x72\x9a\x88\x72\xc7\xf3\x44\xb5\xa3\x89\x04\x56\x37\x37\x90"
+ "\x9a\xf3\x95\xa4\xa6\xfd\x24\xa9\xb9\x0c\x57\x37\x5c\x02\x5c\xa9"
+ "\x27\x49\x75\x1b\x21\x8b\xa1\x96\x29\xcd\xd4\xfc\xe3\x46\x12\x54"
+ "\x6d\x6b\x20\x9a\xe7\x08\xb9\x28\x3b\x73\x5a\x15\x49\x82\xe8\x37"
+ "\x6a\x42\x57\xa9\xe5\xf0\x4c\x81\xe9\x46\x9b\x99\x54\x37\x5b\xf1"
+ "\xf9\x07\xf0\x5c\x91\xd2\x0c\xe5\x0b\x95\xe8\xcb\xd0\x5c\x9d\x7a"
+ "\x14\xda\x37\x15\xe9\xdc\x2a\xd9\x64\x39\xdd\x24\x74\x07\xb0\x19"
+ "\x31\x13\x4e\x39\x66\x8a\xbb\x87\x8b\x19\x13\xf7\xff\xfe\xa2\x7a"
+ "\x12\xd0\x7b\xaa\xf0\x62\x44\xe0\x93\x27\xcf\x50\xdc\x0f\x86\xeb"
+ "\x33\xb5\x96\x2a\x82\x6b\xd6\xe1\xaf\x10\xb2\xc8\x4e\x08\xd2\x04"
+ "\xd7\x92\x9f\xd4\x91\x00\xdc\xa7\x26\xfc\x43\x3b\xc9\xd8\x6c\x26"
+ "\x5b\x6c\x50\xd7\x8b\xd6\xde\xba\xd6\xa6\xd7\x12\x78\x36\xb5\x36"
+ "\xc6\x44\x54\x3a\x12\x88\x74\x06\x5b\xb4\xe1\xc9\x56\xe2\xbb\xde"
+ "\x42\x29\xd2\x18\x69\x8b\x74\xc6\xf2\x24\xda\x1b\xa3\xcc\x24\xc5"
+ "\x4a\x02\x8d\xc9\xf0\x9b\x48\xcd\x46\x72\x89\x98\x64\x67\xcc\xd4"
+ "\x6f\x2a\x01\x7c\xc4\x23\x26\xe0\x9e\x00\x0e\x26\xd1\x8c\xaf\xf6"
+ "\x17\x41\x7b\x71\x6d\x7f\x78\x6d\xfe\xda\x93\xf5\x8f\x7e\x36\xa1"
+ "\x03\xcf\x05\x11\x1c\xcf\xdf\x54\x53\xff\x82\xd0\x1e\xb0\xf5\x38"
+ "\x9e\xc7\xb4\x0f\x8d\xe7\x82\xe5\x0e\x3c\x7f\x7d\xd2\x81\xe7\x6f"
+ "\x0e\xba\xc7\xf3\x37\x53\x38\x9e\x0b\x74\xd7\x27\x9e\x9b\xde\x19"
+ "\x1c\xcf\x4d\xd9\xee\xf1\x5c\x10\x23\xd9\xbb\xa3\x83\xe7\xa6\xe6"
+ "\x6b\x87\xe7\x82\x08\xef\xf0\xdc\x54\xee\x8a\xe7\xaf\xeb\x38\x9e"
+ "\xbf\x4e\xf7\x0e\xcf\xdf\xb8\xf5\x7f\x3c\x98\xbd\xed\x84\x67\x51"
+ "\x3e\xb7\x18\x00\xcf\x20\x9f\x0b\x44\xf9\x3c\xa1\xc9\x03\x3c\x3b"
+ "\xc9\xe7\xe6\xb7\x1d\x78\x6e\xd1\xbb\xc7\xf3\xd9\x73\x22\x9e\xaf"
+ "\x53\xf9\x7c\x76\xcb\xe0\x78\x3e\xbb\x7c\x10\x3c\xb7\x4a\x63\x89"
+ "\xd1\xc1\xf3\xd9\xfd\xd7\x10\xcf\x5e\xca\xe7\xb3\xb9\xae\x78\x6e"
+ "\x2e\xe1\x78\x6e\x5e\xea\x1d\x9e\x5b\xca\xbc\x19\xcb\x38\xf0\x6c"
+ "\x10\xe5\xf3\xb9\x58\xea\x6f\x00\xf9\x6c\x10\xe5\xf3\xc4\xe3\x43"
+ "\xe3\xd9\xe0\x24\x9f\xbf\x7d\xc5\x81\xe7\x73\xcf\xba\xc7\x73\xeb"
+ "\xfb\x1c\xcf\x86\xeb\x54\x3e\xb7\x2e\x1e\x1c\xcf\xad\x21\xee\xf1"
+ "\x6c\x88\x91\xc6\x69\xa3\x83\xe7\xd6\xf4\x6b\x87\x67\x83\x97\xf2"
+ "\xb9\x35\xd2\x15\xcf\xdf\xea\x38\x9e\xbf\x9d\xe1\x1d\x9e\xcf\x25"
+ "\x7a\x33\x4e\x74\xc2\xb3\x28\x9f\xdb\xe6\x01\x9e\x41\x3e\x1b\x44"
+ "\xf9\xfc\xe0\x76\x0f\xf0\xec\x24\x9f\xcf\xff\xca\x81\xe7\xb6\x59"
+ "\xee\xf1\xfc\x8f\x2c\x11\xcf\xd7\xa9\x7c\xfe\xc7\xb4\xc1\xf1\x7c"
+ "\xde\x36\x08\x9e\x5b\xa5\x31\xf0\xe8\xe0\xf9\x1f\x4b\xaf\x21\x9e"
+ "\xbd\x94\xcf\xff\x08\x75\xc5\xf3\xf9\x30\x8e\xe7\x73\x16\xef\xf0"
+ "\xdc\xe6\x36\xfe\xeb\x60\x63\x70\x07\x9e\x0b\x45\xf9\xfc\x9d\x8a"
+ "\xfa\x17\x82\x7c\x2e\x14\xe5\xf3\xb2\xc7\x86\xc6\x73\xa1\x93\x7c"
+ "\xbe\x30\xc5\x81\xe7\x8b\x76\xf7\x78\xbe\xf8\x1b\x8e\xe7\xc2\xeb"
+ "\x54\x3e\x5f\xb8\x30\x38\x9e\x2f\x54\xbb\xc7\x73\x61\x8c\x34\xbf"
+ "\x30\x3a\x78\xbe\x38\xe3\xda\xe1\xb9\xd0\x4b\xf9\x7c\x91\xb8\xe2"
+ "\xf9\x42\x20\xc7\x73\x5b\x85\x77\x78\xfe\x4e\x3d\x3a\xf3\x1b\xed"
+ "\x2a\x9c\xdf\xe8\xc6\xf9\x0d\xc7\xde\xbf\x98\x80\x3a\x8e\xe7\x1e"
+ "\xc0\x73\x81\x33\x9e\xbf\xec\x3b\xbf\xf1\xdd\x39\xa1\x17\xcf\x97"
+ "\xfa\xe1\x59\x00\x3c\xf7\x30\x3c\x5f\xba\x59\x9a\xdf\x30\xb6\x95"
+ "\x00\x4e\xce\x13\xe3\x12\xc0\x72\x8e\x88\xe5\x2f\x01\xcb\x40\x43"
+ "\x01\x68\x5c\xdd\xd8\x40\xc2\xcd\x9c\x96\xdd\x40\x63\xc1\x19\xc7"
+ "\xdd\xad\x72\xc4\x2f\xe2\x56\xc2\x70\xcd\x7a\xc0\x6e\xdc\x31\x52"
+ "\x93\x00\xd7\x66\xb8\x92\xe1\x22\xc7\x48\x75\x2b\x60\x77\x8d\x33"
+ "\x76\xeb\x44\xec\x9a\xdf\x1e\x1c\xbb\xe6\xcc\x6b\x37\x97\x61\xe6"
+ "\xf3\x5f\x5f\x46\x04\x86\x3f\x75\x86\x1a\x13\x1b\x44\x7c\x9e\x27"
+ "\xe1\x36\x12\x40\x97\x69\x27\xa9\x22\x48\xe0\xab\x76\x22\xd7\x3f"
+ "\x4f\x02\xf5\xa7\xa0\xdd\x52\xff\x6d\x22\xaa\x2a\xeb\xdf\x48\x75"
+ "\x7b\x03\xa9\xbe\x7c\x94\x54\x0b\x70\x9d\x87\x0b\xea\x1a\x1e\xed"
+ "\xdc\x6e\xb3\xd8\xee\x4b\x6f\x41\x59\x33\xdc\xb7\xfb\x52\x2a\x6b"
+ "\x77\x14\xb4\xbb\xdb\xd1\x6e\x23\xf4\x03\xe0\xcf\x54\x41\x9c\x0f"
+ "\x09\x37\x13\xdf\x0d\x36\x4a\xbb\x45\xfc\x23\x7f\xaa\xea\xad\x24"
+ "\x5c\x07\x3c\x5b\x05\xf8\x6f\x2e\x23\x29\x49\x80\xff\x6e\x2b\xe2"
+ "\xce\x6c\x4c\xbd\x02\xf8\x37\x7f\x40\x81\x7e\x3d\x88\xff\x2f\x11"
+ "\xff\xdf\x99\x04\x86\xff\xef\x76\x7a\x87\xff\x76\x0f\xf0\xef\xc9"
+ "\x7c\x48\xa7\x0a\xe7\x43\xba\x71\x3e\xc4\xb1\x07\x74\x08\xfc\x3b"
+ "\xcf\x87\xb4\x3b\xe1\xdf\x32\x08\xfe\x2d\x37\x4b\xf3\x21\xdf\x3f"
+ "\xfe\x3b\x86\xc0\x7f\xc7\x20\xf8\x1f\xed\xb9\x8f\x8e\x6b\x88\x7f"
+ "\xcb\x10\xf8\xb7\x78\x80\xff\x82\x08\xef\xf0\xdf\xd1\x07\xff\xed"
+ "\x22\xfe\xdb\xbd\xc4\x7f\xa7\x27\xf8\xf7\x60\xfe\xc4\x8a\xf8\x07"
+ "\xf9\x5f\x50\xef\xb4\x17\x78\x28\xfc\x3b\xc9\xff\x4e\x27\xfc\x77"
+ "\x0d\x82\xff\x2e\x09\xff\xd7\x81\xfc\xbf\x3c\x04\xfe\x2f\x0f\x86"
+ "\xff\x51\x9e\x2b\xb9\x7c\x0d\xf1\xdf\x35\x04\xfe\xbb\x3c\xc1\xbf"
+ "\x97\xf2\xff\x72\x1f\xfc\x77\x8a\xf8\xef\xf4\x12\xff\x56\x0f\xf0"
+ "\xef\xc9\x7c\x4b\x8f\x0a\xe7\x5b\xba\x71\xbe\xc5\xb1\x27\x7c\x08"
+ "\xfc\x3b\xcf\xb7\x58\x9d\xf0\xdf\x3d\x08\xfe\xbb\x6f\x96\xe6\x5b"
+ "\xbe\x7f\xfc\x5f\x19\x02\xff\x57\x06\xc1\xff\x68\xcf\xad\x5c\xb9"
+ "\x86\xf8\xef\x1e\x02\xff\xdd\x1e\xe0\xdf\xe0\xa5\xfc\xbf\xd2\x07"
+ "\xff\x56\x11\xff\x56\x2f\xf1\xdf\xe3\x09\xfe\x3d\x98\x9f\x11\x10"
+ "\xff\x20\xff\x0d\xf5\x4e\x67\x03\x86\xc2\xbf\x93\xfc\xef\x71\xc2"
+ "\xbf\x7d\x10\xfc\xdb\x25\xfc\x5f\x07\xf2\xdf\x36\x04\xfe\x6d\x83"
+ "\xe1\x7f\x94\xe7\x62\x6c\xd7\x10\xff\xf6\x21\xf0\x6f\xf7\x04\xff"
+ "\x5e\xca\x7f\x5b\x1f\xfc\xf7\x88\xf8\xef\xf1\x12\xff\x82\x07\xf8"
+ "\xf7\x60\x3e\x47\x2e\x63\xf3\x39\xdd\x38\x9f\xe3\x38\x23\x32\x04"
+ "\xfe\x9d\xe7\x73\x04\x07\xfe\xe5\xc4\x3d\xfe\xe5\xe4\x66\x69\x3e"
+ "\xe7\xfb\xc7\x3f\x1d\x02\xff\x74\x10\xfc\x8f\xf6\xdc\x0d\xbd\x76"
+ "\xf8\x97\x93\xc1\xf1\x2f\x27\x1e\xe0\xbf\xd0\x4b\xf9\x4f\xfb\xe0"
+ "\x5f\x10\xf1\x2f\x78\x87\x7f\xb9\x6c\x74\xe6\x7f\xe4\xf2\xfd\x38"
+ "\xff\x23\xa8\xf2\xeb\x7b\x0c\xab\x03\x85\xec\xdd\x75\x01\x32\x0d"
+ "\xb1\xa9\x8a\x72\x8d\xf1\x16\xf2\x64\x27\xf0\x44\xd7\x49\x9e\xeb"
+ "\x0c\xc4\x58\x96\xe5\x14\xc6\xff\x2e\x67\x44\xe1\xb2\x65\x4f\x25"
+ "\x3b\xd6\x13\x85\xdd\xbf\x38\x0e\xd3\x8c\x2d\x56\x82\x6d\xde\x82"
+ "\x34\x38\xef\xa0\x01\xce\xc1\xd1\xef\xb4\x81\x45\x69\x90\xa7\xdb"
+ "\x44\x9a\x01\x2f\xd5\xcd\x26\xa0\xfd\x66\x86\x2d\xe4\x05\xd4\x67"
+ "\x69\xf1\x45\xa2\xb0\x7d\xa3\x9e\x0a\x3c\x0e\xf2\x7b\x99\xc8\x82"
+ "\x9b\xa9\x80\xbc\x44\x1e\x21\x5f\x35\x9b\x29\x85\x7c\xef\xd4\x02"
+ "\xbe\x6d\xdf\x68\xa7\x16\x41\xbe\x51\x9f\x97\x91\xcb\xd9\xfa\x07"
+ "\xfc\x2e\xaa\x6e\x04\x5a\x6e\x97\x79\xc9\x27\xb9\x27\xe7\x5f\x86"
+ "\x9e\xa7\x90\x2b\x96\xe3\x3c\x85\xa0\x2a\x58\xea\x19\x9f\x0a\x22"
+ "\x5c\xce\xb4\x8e\x3a\x9f\x7c\x6c\x9e\xf1\x49\xf1\x8c\x2b\x9f\x46"
+ "\x79\xfe\x40\xae\xd0\x70\x3e\xf9\x58\x38\x9f\x7c\xe6\x79\xc7\x27"
+ "\x85\x57\xfb\x7f\xfb\x8d\xa7\xe5\x63\x15\x38\x9e\x06\x3e\x79\xd8"
+ "\x9f\x0a\x1a\x5c\xce\xe0\x8e\x3a\x9f\xc6\x94\x7a\xc6\xa7\x31\xf6"
+ "\x3e\x7c\x1a\xdd\x71\xae\x7c\x4c\x25\xe7\xd3\x18\x03\xe7\x93\xa2"
+ "\xd9\x3b\x3e\x8d\xf5\xe0\xfc\x87\x07\xe3\x3e\xf9\xb8\xbd\x38\xee"
+ "\x13\x60\xdc\xe7\x19\x9f\x0c\x11\x2e\x67\x86\x47\x9d\x4f\xe3\x16"
+ "\x79\xc6\xa7\x71\x7b\x5c\xf9\x34\xca\xe3\x31\xf9\x38\x1d\xe7\xd3"
+ "\xb8\xf9\x9c\x4f\x63\xb3\xbd\xe3\xd3\xb8\x03\xa3\x32\x3e\x91\xfb"
+ "\x2e\xc5\xf1\x09\xf0\xc9\xc3\xfe\x64\x68\x70\x39\xe3\x3c\xea\x7c"
+ "\x52\x5a\x3c\xe3\x93\xef\xe2\x3e\x7c\x1a\xdd\x71\x83\xdc\x97\xc7"
+ "\x03\x96\x2b\xdb\x38\x9f\x94\x73\xbc\xe3\x93\x6f\xe4\xe8\xd8\xd1"
+ "\xe3\x6d\x68\x47\x0b\x60\x47\x7b\xc6\xa7\xc2\x08\x97\x33\xd9\xa3"
+ "\xce\xa7\xf1\x06\xcf\xf8\x34\xbe\xd3\x95\x4f\xa3\x6c\xdf\xca\xc7"
+ "\x97\x73\x3e\x8d\xdf\xc9\xf9\xe4\xdb\xe8\x1d\x9f\x26\x78\xb0\xff"
+ "\x73\xe0\x73\x58\xfd\x6d\x3e\x55\xd9\xf5\x65\xf3\xa9\x16\x7a\xc6"
+ "\x2b\xd5\x5b\x57\xd7\xe6\x53\xc5\x72\x5e\xa9\xc2\x38\xaf\x26\x64"
+ "\x7a\xc7\x2b\x95\x5b\xff\x8f\x43\x9d\xdf\xea\x6f\xf7\xf9\x2f\xbd"
+ "\xbe\xec\x3e\x3f\x0f\xe5\x9f\xff\xe2\xab\x6b\xf7\xf9\x8b\xf2\xcf"
+ "\x4f\x94\x7f\x7e\x5e\xca\x3f\x7f\x0f\xe4\xdf\xc0\xe7\xbe\xfa\xdb"
+ "\x7e\x81\xe4\xfa\xb2\xfd\x02\x4a\x3c\xe3\x55\xc0\x95\xab\x6b\xfb"
+ "\x05\x54\x70\x5e\x05\xe4\x71\x5e\xf9\x9b\xbc\xe3\x55\xa0\xca\xdb"
+ "\xf3\x62\xfd\xed\xbf\x89\xd7\x99\xfd\x37\xd1\x43\xfb\x6f\xe2\x55"
+ "\xb6\xff\x26\x8a\xf6\xdf\x44\xd1\xfe\x0b\xf4\xd2\xfe\x9b\xe8\x95"
+ "\xfd\xd7\x87\x57\x62\xbf\xba\x29\xe2\xfa\xb2\x01\x27\x59\x3d\xe3"
+ "\xd5\x4d\x4f\x5d\x5d\x1b\xf0\xa6\x60\xce\xab\x49\x66\xce\xab\x49"
+ "\x73\xbd\xe3\xd5\x4d\x6e\xe3\xdf\x0e\x75\x3e\xad\xbf\x1d\x78\xb3"
+ "\xe2\xfa\xb2\x03\x83\x3c\x1c\xff\x06\xd9\xaf\xae\x1d\x18\x24\x8e"
+ "\x7f\x83\xc4\xf1\xef\x4d\x5e\x8e\x7f\x6f\xf6\x60\xfc\xeb\xc9\xbc"
+ "\xdf\xe4\x28\xb4\x01\xed\xd9\xf9\xf5\x01\x40\xff\x80\x44\x22\xef"
+ "\x0e\x06\x7e\xa9\x80\x5f\x5b\x35\xa4\x27\x1b\xf8\x65\xb6\x91\x27"
+ "\x37\x9e\xa1\xb5\x6d\x76\xd2\x0d\xbc\xba\x02\x76\xa0\xd1\xdc\x8a"
+ "\x67\xf4\x7e\xd6\x24\xbf\xc5\xbe\x6c\x63\x20\x41\x7e\x21\xfd\xed"
+ "\xaa\xa9\xa0\xfb\x8a\xe3\x18\xff\x54\xa5\x79\xb6\xec\xe2\x25\x8b"
+ "\x2f\x9c\xa1\x1b\x4c\x94\xd6\xc4\x58\xd1\x77\x64\x60\x4d\x4c\x03"
+ "\x09\x6f\x26\xbe\x9a\xa7\x91\x2f\xb7\xbc\x83\xe9\x46\x73\x03\x41"
+ "\xbf\x9f\x6c\x0e\xfc\x8c\x36\xc8\xf6\x85\x56\x85\xfe\x9b\xf0\x5c"
+ "\xa1\xe4\xa3\xc9\x78\x3e\x8f\xf1\xbf\xef\x9c\x2a\xe3\xff\x17\xda"
+ "\xc0\x02\x3c\x9f\x38\xea\xb6\xe0\x2d\x6c\xfe\x4f\x38\xa3\x9e\x2a"
+ "\xd5\x71\x43\x2c\xa5\x50\xc7\x49\xb5\x16\x33\xc1\x7a\xd6\x5a\xca"
+ "\x49\x4a\x3c\x09\xac\xed\x6e\x25\xc9\x16\x6a\xae\x4d\x3d\x47\xc2"
+ "\x3b\x71\x5d\x00\xf1\x74\x4b\x27\xe7\xf7\x2d\x1a\xe1\x8c\x76\x2a"
+ "\xfc\xb6\xd5\xd6\x11\x12\xb0\x15\x68\x6d\x23\x72\x76\x5e\x53\x4e"
+ "\x94\x40\xaf\x18\x63\x6a\x13\xd2\xae\xce\x68\x3b\x85\xf4\x8c\x81"
+ "\xe7\xf3\x7a\xd7\x1b\xfc\x8b\x8f\x63\x1a\xd2\x16\xf7\x99\x1a\x75"
+ "\x66\x96\x47\x7a\xce\x79\x97\x4a\x8c\x89\xdd\xa4\xd6\x46\x08\xe0"
+ "\xa3\xfa\xd3\x88\x06\xc0\xd7\xcd\x5e\xca\xed\xc9\xba\xd1\x99\xaf"
+ "\x9c\x52\x81\x76\xab\x3d\xbb\x60\x29\xaf\xe3\x98\xf6\xa1\xf1\x55"
+ "\x10\xe1\xc0\xd7\x94\x67\x47\x86\xaf\x29\x7e\xa3\x8b\xaf\xd1\xb6"
+ "\x5f\xd5\x0d\x23\xc3\xd7\x94\x67\x38\xbe\xd4\xa9\x1c\x5f\x53\x16"
+ "\x39\xf0\x35\xa6\xfd\xea\xe1\x4b\x1d\xc2\xf1\x35\xb9\xcd\x3b\x7c"
+ "\x4d\x71\xeb\x87\x76\x78\xf3\xac\xc1\x33\xd0\xd6\x06\x7c\x89\xf2"
+ "\x6b\x42\x93\x07\xf8\x72\x92\x5f\xb7\x1e\x1c\x19\xbe\x6e\x5d\x37"
+ "\xca\xf8\x1a\x65\x9b\xfb\xd6\xb9\x23\xc3\xd7\xad\x7f\xe1\xf8\x9a"
+ "\x6a\xe2\xf8\xba\x75\xaf\x03\x5f\x13\x9a\xae\x1e\xbe\xa6\x66\x73"
+ "\x7c\x4d\x5d\xe4\x1d\xbe\x82\xbd\xf2\x7f\xd5\x7f\x7c\x30\x3d\x1d"
+ "\xc7\x07\xf6\x6c\x83\x28\xbf\x26\x1e\x1f\x1a\x5f\x06\x27\xf9\x35"
+ "\x7d\xda\xc8\xf0\x35\xad\x66\x74\xf1\x35\xda\xe3\x84\x69\x79\x23"
+ "\xc3\xd7\xf4\x9b\x39\xbe\xa6\x85\x71\x7c\x4d\x57\x39\xf0\x35\xf1"
+ "\xf8\xd5\xc3\x57\x70\x1b\xc7\x57\xf0\x5e\xef\xf0\x35\xdd\xbd\xff"
+ "\xe7\x61\xcd\x6b\x6b\x9a\x71\x4c\x03\xf8\x12\xe5\xd7\x83\xdb\x3d"
+ "\xc0\x97\x93\xfc\xd2\x6c\x19\x19\xbe\x34\xb3\x46\x19\x5f\xa3\x3c"
+ "\xb6\xb9\xcd\x3a\x32\x7c\x69\x5e\xe2\xf8\xba\xad\x84\xe3\x4b\x13"
+ "\xeb\xc0\xd7\x83\xdb\xaf\x1e\xbe\x6e\x5b\xc4\xf1\x75\x9b\xca\x3b"
+ "\x7c\x69\x3c\xf0\xff\xea\xc9\x7c\xfc\x9d\xf3\x71\x1c\x66\xcf\x2e"
+ "\x14\xe5\xd7\xb2\xc7\x86\xc6\x57\xa1\x93\xfc\xba\xe3\xf4\xc8\xf0"
+ "\x75\x87\x7e\x74\xf1\x35\xda\xe3\xb1\x3b\x22\x46\x86\xaf\x3b\x4e"
+ "\x70\x7c\xdd\x41\x38\xbe\xee\xa8\x76\xe0\x6b\xd9\x63\x57\x0f\x5f"
+ "\xb7\xef\xe5\xf8\xba\x3d\xd6\x3b\x7c\xdd\xe9\x81\xff\x1f\x4f\xd7"
+ "\x11\x66\x96\x8d\x6c\x0c\x39\xf3\xd1\x91\x61\x6c\xc6\xa5\xeb\x7b"
+ "\x0c\x39\xe3\x83\x91\x61\x6c\xe6\x43\x1c\x63\x33\xa2\x38\xc6\x66"
+ "\x86\x5e\x9b\x31\xe4\x8c\x40\x8e\xb1\x3b\xeb\xbc\xc3\xd8\xcc\x51"
+ "\x5c\xff\xd0\xaa\x46\x36\x8e\xbc\x6b\xcf\xc8\x30\x76\xd7\x33\xd7"
+ "\xf7\x38\xf2\x2e\xcd\xc8\x30\x76\x57\x21\xc7\xd8\x8f\x2a\x39\xc6"
+ "\xee\xda\x79\x6d\xc6\x91\x3f\x8a\xe7\x18\xfb\x91\x97\xeb\x36\x5a"
+ "\xaf\xce\xbf\x0c\xbc\x6e\x73\x8f\x6e\x64\x63\xc9\x7b\x7c\x47\x86"
+ "\xb1\xbb\xdf\xbf\xbe\xc7\x92\x77\xa7\x8f\x0c\x63\xf7\xc8\x38\xc6"
+ "\xee\x0e\xe1\x18\xbb\xdb\x7a\x6d\xc6\x92\xda\x06\x8e\x31\x6d\x9e"
+ "\x77\x18\xbb\x27\x69\xf4\xd6\x9b\x42\xea\x47\x36\x9e\x0c\x59\x37"
+ "\x32\x8c\x85\x4c\xbb\xbe\xc7\x93\x3f\x6e\x1d\x19\xc6\x42\xa2\x39"
+ "\xc6\x7e\x9c\xcb\x31\x16\xb2\xfc\xda\x8c\x27\x7f\x3c\x8f\x63\xec"
+ "\x1e\x9b\x77\x18\x0b\x31\x8d\xde\x3a\xd9\x7d\x73\x47\x36\xa6\xbc"
+ "\xf7\xd8\xc8\x30\x76\xef\xd6\xeb\x7b\x4c\x79\xef\xa2\x91\x61\xec"
+ "\xde\xa3\x1c\x63\xb3\x2c\x1c\x63\xf7\x96\x5f\x9b\x31\xe5\xac\x12"
+ "\x8e\xb1\x59\x91\xde\x61\xec\xbe\xf9\xa3\xb7\xbe\x37\xdb\x30\xb2"
+ "\x71\xe5\xec\x07\x46\x86\xb1\xd0\xb3\xd7\xf7\xb8\x32\x74\xdf\xc8"
+ "\x30\x36\x7b\x16\xc7\x58\x68\x04\xc7\xd8\xec\x19\xd7\x66\x5c\x19"
+ "\xaa\xe0\x18\xbb\xcf\x3b\x7f\x14\xf2\xd9\xfd\xfc\x5f\xad\x59\x9f"
+ "\xb0\x32\x76\x4d\x94\x66\xcd\xfa\xf8\xb8\x8d\x9a\x4d\x6b\x36\x47"
+ "\x3f\x3c\xf3\xa5\x10\x4d\x5c\xa2\x26\x6e\xcd\xfa\x17\xc4\x84\xa8"
+ "\xf1\xe4\xe9\xe8\xd8\x95\x89\x98\x02\xb9\x5f\x58\xbf\x2e\x7a\x7d"
+ "\xbc\x26\x2e\x7a\xe3\x4b\x6b\xe2\xa2\xf1\xff\x4d\x9a\xd5\x1b\xe2"
+ "\x20\x61\x55\xf4\x9a\x84\x68\xcd\xf3\x2f\xad\x5e\x1d\x1d\xb7\x69"
+ "\x3c\x59\xfc\x52\x6c\xfc\x1a\x5d\x6c\xb4\x66\xfe\xe2\x47\x67\x2d"
+ "\x5d\xf0\xaf\x4b\x1f\x79\x04\x83\x93\x39\xc5\x26\x0b\xa6\xd9\xa5"
+ "\xb9\x80\x39\x45\x8b\xfc\xa7\x7b\x6a\xc1\x5a\xc4\xf8\xb8\x3b\xda"
+ "\x49\xe0\xf6\x38\xa2\xc8\x6a\x27\x4a\x7d\x3b\x51\x69\xd6\x92\x30"
+ "\x9a\x75\xca\x9c\xd3\x4e\x82\x68\xce\x5a\xb5\xa0\xbf\x29\x94\xea"
+ "\x27\xeb\xcc\xbe\x36\x0d\xa4\x05\x0a\x59\x3d\x4b\xe0\x9d\x20\xa0"
+ "\xad\x82\xea\xa7\x98\x9a\xe4\x3f\x8d\x32\xfb\xda\x49\xca\x39\x22"
+ "\xa7\xe3\xef\x6f\xf8\x93\x60\x96\x1f\x8a\x27\xf8\x27\x23\xf2\x9f"
+ "\x98\xe1\x6a\x24\xf2\x39\xd9\x70\x19\xe0\x2a\x83\xab\x0e\xae\x06"
+ "\xb8\xda\xe0\xb2\x12\xf9\x03\x0a\xb8\x54\x70\x05\xc1\x15\x0c\xd7"
+ "\x0c\xb8\x4a\xe0\x2a\x87\x0b\xf2\x3e\xd0\xca\xcb\x79\xc0\x42\xe4"
+ "\x0f\x6a\xe0\x5a\x08\x57\x24\x91\xff\x0b\xe4\xff\x97\x39\x70\xed"
+ "\x87\x6b\x11\x5c\x11\x70\x61\x7a\x3a\x5c\xf8\xbe\x95\x3f\x9b\xbb"
+ "\x1c\xae\x3c\x02\xf5\x1c\xfa\x9a\x7b\x00\x2e\xf8\xee\xdc\x66\x22"
+ "\x7f\x68\x3e\x5c\x50\xdf\x87\xac\x7d\xf2\x85\x39\xfd\xbf\x7c\x88"
+ "\x32\x93\x02\xb6\xde\x66\x62\x31\xf0\xe4\x73\x16\xd3\x34\xe2\x43"
+ "\xb3\xec\x44\x77\x0f\x91\x9d\x97\xcf\x99\x62\x4c\x47\x39\x73\x53"
+ "\x28\x8b\xe9\x08\xf7\x48\xb3\xae\xed\x73\xd4\x26\xa2\x53\x63\x4c"
+ "\xb3\xe1\xe1\x6d\x8e\x5a\x7c\x3f\xc2\x24\x53\x29\x59\x0c\xb8\xed"
+ "\x75\xb9\x34\x25\xa2\x80\xc5\x7e\x03\x1a\xe2\xb9\x2c\x9a\x59\xa7"
+ "\xa4\xca\x2a\x03\xf6\xf9\xf2\xcd\x58\xaf\x9f\x5c\xe2\xfd\x0b\x9e"
+ "\x43\xdd\xcc\x7e\x6b\xd5\x50\x4f\x05\xde\xd3\x2c\x9b\xa6\xdb\x6f"
+ "\xb7\x0e\xff\xbf\x52\x18\x5d\x42\xb3\x77\xe7\xe1\x38\xbb\x3c\xf9"
+ "\x3f\x49\x13\xbc\xd7\xed\xb7\x67\xae\xe6\xe9\x00\xda\xc4\xcb\x96"
+ "\x43\x1d\xd2\xa5\xb2\xba\xfd\xd6\x6a\x68\xde\x9e\x48\xaa\x07\x0c"
+ "\x89\xe5\x09\x50\x1e\xcd\x2e\x0e\x83\x7c\x26\x4c\xa7\x86\xe8\x03"
+ "\xd2\xff\xf0\xdb\x48\x73\x76\x9b\xf0\x37\x60\x2b\xb1\xb0\xfb\xb4"
+ "\x30\xc2\x7f\x03\x09\xca\xba\x36\xf9\x03\xaf\xdd\x57\x47\x64\xe5"
+ "\x4f\x63\xbd\x1f\x58\x92\x52\x47\x05\x4d\xb2\x0f\x7c\xff\x81\xa7"
+ "\x7a\xbf\x3b\x65\x4f\x04\xc6\x4f\x15\xb6\xcf\x6e\xc5\x18\x7c\xf8"
+ "\x2e\xd6\x2d\x7f\x12\x51\x14\xff\x3b\x51\x62\x1b\xbb\xb6\x3f\x90"
+ "\x24\xc5\xa1\xc3\x77\xe4\x90\xff\x89\xa7\x52\xa8\x53\xd9\xbf\xa2"
+ "\xac\x3d\x3f\x69\xe3\x34\x7d\x60\xaf\x49\xe6\xcb\x62\xe5\x69\xee"
+ "\x60\xb4\xbc\x24\x3e\x37\x23\x3f\xb1\x7c\x41\x5f\x9a\x8b\xf7\x18"
+ "\xe7\x2e\x00\x50\xab\x49\x9e\x71\x80\xd3\x68\x77\x1e\x96\x83\xf9"
+ "\x85\x9c\x22\xf8\x7f\x4e\xae\x00\xed\xb5\xa7\x11\xad\x66\x3d\x09"
+ "\x6b\x92\x3f\x38\xc5\x9e\x75\x2c\x02\x9e\x43\xbf\x3b\xb6\x1c\xf2"
+ "\xef\x63\xf4\xd6\x17\x87\x9a\xe4\x0f\xaa\xe0\xd9\xf2\xde\xd8\x97"
+ "\x9c\xce\x32\x21\xeb\x58\x6c\xd7\xf6\x07\xc3\x4c\x32\x8d\x55\x6a"
+ "\x03\x93\x71\x8e\x7c\x22\x4f\x1f\x9c\x63\xf6\x3d\x16\xdb\x93\x40"
+ "\xeb\x76\x9c\x22\x04\xbe\x49\xbb\x2f\xd3\xea\xa4\x25\xd4\x9a\xf3"
+ "\xbf\x08\xa9\x8e\x6c\x24\x29\x2b\x49\xf0\x84\xad\xd4\x1c\x6e\x27"
+ "\x01\x13\x1a\x03\x68\xcd\x92\x46\x90\xd1\x9d\x24\xa9\x8e\xb6\xd6"
+ "\xea\x3e\x20\x49\x67\x89\x6a\xcb\x1a\x12\x94\xb2\x84\x9a\x93\xab"
+ "\xa9\xd5\x98\xd8\x48\x6a\x2d\x70\xe9\x6a\x20\xdf\x09\xb8\x3e\x20"
+ "\x29\xaf\x90\xff\xc7\xde\xfb\xc0\x37\x55\x64\x8b\xe3\x27\xb7\x29"
+ "\xa4\xb5\x7f\x02\x56\x2d\x5a\x31\x60\xd5\xa2\x2d\x54\x17\x5d\x74"
+ "\x8b\x44\x28\x58\x14\x68\x85\x8a\x55\x10\x8a\xb6\x58\xb0\x40\x2c"
+ "\x05\x02\x16\x5a\x22\xba\xa5\x16\xa8\x2b\xcf\xad\xd2\x7f\x2e\x75"
+ "\xb7\x2a\x2e\xd5\x65\x9f\xf5\x7d\xf0\x99\x5d\xaa\xaf\x8b\x40\xba"
+ "\xfb\xf0\xf3\xed\xbe\x1f\xae\x91\x57\xd9\x3e\xb6\x40\xb4\x81\x84"
+ "\x36\xc9\xfc\xce\x99\xb9\xb7\xbd\x49\x13\xa4\xca\xba\xff\xac\x5e"
+ "\x72\xef\xcc\x99\x33\x67\xce\xbf\x39\x33\x77\xee\x8c\x76\x0e\xfa"
+ "\xd3\x4d\x67\x21\xea\x88\xe9\x2c\xa6\x9d\x82\x92\x5c\xe6\x39\x7c"
+ "\x88\xe0\x3e\x84\x4c\x8f\x23\x76\xe3\x29\xd0\xd6\xcd\xa7\x6f\xcb"
+ "\x3e\x85\x7a\xa4\xa5\x37\xfa\xaa\xdc\xf3\xdb\x46\x75\xf5\xac\x65"
+ "\x1e\x57\xc5\x0f\xa3\xec\xf0\x23\xab\x5f\x5b\x88\x66\x3a\x37\x14"
+ "\xdb\x4b\x30\xbe\x6d\xf5\xf1\x8b\x3d\xa4\xe7\x3f\x04\xf4\xc5\xa0"
+ "\xe4\x53\x9e\x23\xba\x1e\xf5\xe7\x87\xc9\x99\x1e\xe6\x22\x78\x6a"
+ "\x37\xf2\xa8\x40\x6e\x7f\x41\x98\x09\xb4\x58\x87\xc9\xae\xb9\xfe"
+ "\xa8\x4a\x86\x24\x93\x61\x4a\x7d\x32\xcc\x4e\xbb\x66\x2c\xd7\x0b"
+ "\x1f\xcf\x9b\x58\x42\xb0\x98\x8e\xf2\xbf\x3e\x51\xd0\xf7\xc3\x62"
+ "\x4a\x93\x7d\x29\xd9\xed\x16\x1f\xd9\x75\xf9\x41\x93\x37\x7a\x77"
+ "\x03\x93\x98\x1b\xf5\x79\x12\xeb\x89\x8f\x9a\xe3\x61\x6e\xdf\xb6"
+ "\xba\x54\xf4\x97\x51\x74\x4e\xaa\x80\x9f\x34\x1d\xf3\x8d\x86\xb5"
+ "\xfc\x3e\x85\xea\xf1\xd5\xe6\x57\x91\x6f\xcd\x6c\x27\xf8\xe5\x55"
+ "\xdb\x8b\xd0\xf7\x6e\xdb\x5d\x45\x76\xe8\x8b\xae\xcf\x38\xff\xf2"
+ "\x6b\x64\x33\xf1\x0c\x75\x8c\x55\x2e\x37\xf6\xe3\xb1\x40\xb8\x5d"
+ "\x9a\xa4\x65\x58\x9e\x55\xd6\xa5\xca\xb2\x3f\x25\x74\x73\x12\xf1"
+ "\x4e\x8b\x74\x15\x63\x7a\xf8\x71\x69\x52\x25\x7d\xa3\x89\xcf\x7b"
+ "\xf8\x59\x92\xd2\xa4\x17\x84\xce\x1c\x34\xf9\x3d\x4b\xc4\x3f\xb4"
+ "\x49\xf4\x03\x22\xbe\x98\xf4\xf6\x80\x5d\x08\x3d\x16\xf6\x5d\x87"
+ "\x34\xdd\xde\xed\xb3\x84\xf9\x10\x4e\x73\x5c\xf0\x41\xea\x8d\xf8"
+ "\x7d\xae\xab\x62\xd2\x31\xbb\x46\x5b\xe8\x27\xcf\x8a\xdf\x55\xd1"
+ "\xb9\x95\x48\x4b\xd8\x09\xe9\xce\x08\xfc\x1d\x8e\xbf\xd1\x07\xda"
+ "\xa9\xaf\xe5\x78\x2f\xa3\xfb\x57\xae\x64\x8e\xf4\xd9\x40\x67\x54"
+ "\x22\xdf\xef\x4c\xb4\xc3\xe2\x9d\x84\xa7\x82\xce\xee\xc4\x34\x82"
+ "\xc1\xf4\x34\x3b\xe4\x6e\x11\xf8\x27\xda\x9d\xe4\xb3\xfc\xf1\x2f"
+ "\x11\xf8\x05\x5e\xc2\xa7\xe0\xae\x7d\x89\x75\xcb\xb8\xcb\x14\xdc"
+ "\xdb\x30\x4d\xc1\x9f\xbe\xa2\xbf\x8e\x06\xac\x23\x4a\xdd\x86\x97"
+ "\x5f\x62\x4e\xc2\x81\x79\xfb\xed\x50\x90\x47\x79\x5b\x31\x8d\xca"
+ "\xaa\x74\x2a\xec\x40\x16\xe2\x38\xc4\x71\x74\xda\x61\xa9\x9f\xdf"
+ "\x40\x1e\x45\x2b\xbe\x56\xe0\xba\x4b\xa7\xe0\x1a\xc0\xa3\xe8\xd4"
+ "\x27\xd5\xb2\x4c\x09\x6f\x14\xe1\x45\xf8\x49\x76\x78\x6c\xa2\xba"
+ "\xed\xc8\xf3\x2c\x39\x2f\x1b\xf9\x9e\xac\xa6\x59\xf6\xab\x4d\x58"
+ "\x5e\x23\xeb\xeb\x28\xf2\x59\x4a\x3e\x9d\xeb\xc9\x2a\x6e\xd3\x93"
+ "\xdd\xa0\x7f\x04\xb4\x33\x03\xe2\xa9\x09\xf0\x8f\x5a\x82\xf3\x55"
+ "\xdc\x36\x9d\x9f\x6b\x7a\x25\xeb\x42\x18\xab\xdf\x59\x9e\x12\xdc"
+ "\x8d\x69\x47\x95\x33\x45\xb7\x23\x8c\x5d\xba\x2d\xe4\x9e\x89\x9b"
+ "\xc6\x80\x64\xab\xb1\x53\xbc\x4a\x3a\x97\x66\x4b\x70\x82\xad\xc6"
+ "\x07\xbe\xba\x7c\xab\x71\x13\xb3\x9e\x90\x7e\xf4\x00\x9d\x11\x3d"
+ "\xb4\x3e\xf0\x47\x7c\xfd\x1f\xeb\xc5\x38\xae\xe4\x36\x7e\x76\xfa"
+ "\x69\x29\x6d\xb3\xcd\xf1\x15\xb7\x3d\xbc\x5f\x41\xf9\x2f\x62\xdc"
+ "\x47\xb1\x1f\xc6\xdb\x05\x55\x92\x88\xff\x7c\x08\x5b\x47\xe9\x14"
+ "\x1b\x62\x5c\x5a\xaf\xca\x63\x75\xf9\x66\xc1\xbb\xb4\x3b\x89\x8f"
+ "\x9c\x5e\xcf\xbd\x56\xa2\xd9\x57\x93\x6f\xa6\x36\x94\x9a\x99\xcf"
+ "\xe6\x71\x59\xe9\xac\x5d\xc3\x5a\x8a\x5b\xd3\xae\xc8\xac\x05\x86"
+ "\xb6\x6d\x1e\x62\x1b\xf8\xf8\x17\x63\xf3\xd3\x8e\x6b\xf3\xcd\x74"
+ "\xb6\xf2\x8e\x4d\xe1\xba\x69\x35\xcc\xda\x33\x3a\xdf\xea\xaa\x48"
+ "\x9b\xa4\x9c\x5d\x3b\x34\xbc\x69\x93\x94\xb6\xd7\xc9\x6d\xc7\xba"
+ "\xf8\x3b\xeb\x09\xd5\xfc\x4c\x6d\x7c\x4e\x0b\xb9\xd6\x09\xfd\x4b"
+ "\x13\x95\xc5\xb6\x1b\xeb\x15\x3e\x79\x1c\x74\xa6\xf8\x88\x93\xd2"
+ "\xe4\xf0\xcc\x12\x2b\xf0\x7d\xf2\xb7\xd5\x35\x0d\x91\x2e\xbe\xfe"
+ "\xe5\x08\x8e\x0b\x32\x3d\x1f\x30\xe1\x17\x27\xa7\xcc\x91\xf1\x51"
+ "\x9e\x22\xab\x3a\x39\x5e\x1f\x7a\x1d\x93\x27\x5e\x44\xbb\xf4\x41"
+ "\xda\xf5\xe9\x37\x6f\xd7\xe4\xa6\xc1\xed\xba\x3b\xfc\xd2\xb6\xeb"
+ "\xee\x90\xeb\xbf\x55\xed\x32\x0c\x6e\xd7\xdd\xbf\xfe\xe6\xed\xba"
+ "\xbb\x2c\x48\xbb\x3e\xbd\xc4\xed\xea\xbc\x88\x76\xa5\x0e\x6e\xd7"
+ "\x94\x6d\xdf\xbc\x5d\x53\x72\x06\xb7\x6b\xca\xaf\x2f\x6d\xbb\xa6"
+ "\xec\x1f\xb2\x3f\xdc\xbe\xdb\x21\xfc\xa1\x71\xc9\xd0\xfd\xa1\x31"
+ "\x79\xb0\x3f\xbc\xe7\x85\x01\x7f\x78\xcf\xc6\x6f\xe4\x0f\xb7\x2f"
+ "\x97\x63\x8d\x7b\x66\x0e\xf2\x87\x95\xcb\x53\x83\xfb\xc3\x7b\x6e"
+ "\xe0\xfe\x70\xdb\xf2\x21\x8e\xa3\x8d\x8e\x7e\x7f\x18\xbd\x3c\xd5"
+ "\xcf\x1f\xc6\xec\xc6\xfe\xf3\x9e\x8c\x6f\xe6\x0f\xef\xc9\x18\xec"
+ "\x0f\x8d\x4d\xfe\xfe\xf0\x9e\xb2\xd0\x7a\x58\x9f\x14\xcc\x1f\x66"
+ "\x7a\xce\x30\xa1\x1b\xf5\x49\x43\xa4\x27\xe4\xfe\xef\xa8\xf3\xcd"
+ "\x17\xae\xab\xae\x79\x68\x75\x4d\x0d\x39\xff\x85\x63\xc3\x2a\x8c"
+ "\x41\xf4\x1b\x5f\x05\xe9\x44\x09\x48\x47\x12\x3a\xc0\x66\x76\xc3"
+ "\x78\x13\xea\x84\x05\xd2\x8e\xd4\x74\xc3\x91\x84\x13\xc0\x22\x0e"
+ "\x56\xb1\x9f\xaf\x35\x1a\x8b\x48\x37\xa7\x7a\x6d\xc5\xee\x21\xea"
+ "\xe6\xd4\x36\x45\x37\x8f\x78\x50\x37\xd7\x92\x3e\xa6\xa7\xd8\xba"
+ "\x4f\xca\xba\x99\x3e\xaa\x5f\x3e\x16\xa1\x9f\x41\x75\x13\x6d\xc2"
+ "\x5f\x37\xeb\x1a\x84\x6e\x4e\xfb\x62\xb0\x6e\xd6\x35\x04\xd7\xcd"
+ "\x69\xbf\x11\xba\x59\xd7\x30\xb4\x36\x4c\xab\x1c\xd0\xcd\xba\x06"
+ "\x3f\xdd\xbc\x71\xad\xd1\x55\x31\xad\xf3\x9b\xe9\xe6\xb4\x4e\xa5"
+ "\xed\xb5\x72\xdb\x31\x2d\xdd\x5f\x37\xd3\x13\x42\xca\xb0\xfc\xbd"
+ "\x1c\xf4\x87\x51\x27\xa5\xf4\x6e\x2f\xc6\xb4\xbe\x4a\x4d\x7c\xa6"
+ "\x97\xb9\xe8\x8c\x76\x26\x4d\x04\xb6\x2e\x29\xca\x85\xe3\x4d\x97"
+ "\xab\x40\xc7\x22\x0f\x8e\x66\x7d\xf1\x80\xb4\xc7\x32\x57\x52\x0c"
+ "\xf2\x2c\x11\x7f\x47\xd6\xae\x85\x38\xbc\xe2\x6b\x65\xbe\xe2\x7d"
+ "\x2a\x5b\x17\x1f\xb9\x7d\x2d\x24\xc7\x3a\x41\x87\x34\xe4\xc4\x6e"
+ "\xd6\x43\xac\x07\xe2\xe8\x9e\x59\x1a\xd3\xea\xcf\x81\x96\xe6\x1a"
+ "\x7d\xd1\x58\x9f\x39\x96\xb1\xd5\x49\x50\x5f\x84\xf4\x48\x10\x5f"
+ "\x2f\xb1\x66\xef\xba\x24\x89\xc5\xec\x7e\x93\x3d\x9d\xc3\x69\xf2"
+ "\x25\xae\x2d\x43\x1d\x2a\x63\xa5\x05\x54\xaf\x91\xce\x0a\x66\x37"
+ "\xae\xdd\xc2\x5c\xf1\x91\xdb\xce\x41\x72\xfd\x5a\x48\xac\x5b\x0b"
+ "\x49\xac\x2f\x49\x42\x1e\xe4\x2c\x7a\x4a\x4f\x72\xc7\x36\x60\x5d"
+ "\x6b\xb1\x2e\x94\xa5\x77\x1b\xd6\xe5\xc1\xba\xce\x60\x5d\xa7\xb1"
+ "\x2e\x0b\xd6\x65\x11\x75\x0d\x8d\xe7\xd3\x73\x2e\x34\x27\x9c\xb9"
+ "\x71\x34\xed\x5d\xfb\xe7\x58\xf3\xf0\x0c\x9a\x1f\xee\x79\xba\x60"
+ "\x88\xfa\x3e\x3d\xe4\xf7\x3f\x3b\x7e\x09\x09\x4c\xd7\x17\x3f\xe7"
+ "\xd9\xcf\x58\xa6\x07\xe0\xd9\x5f\x42\x32\xd9\xdc\x11\xf7\x29\xb4"
+ "\xb3\xbe\xf8\x0f\x93\xba\x87\x58\xd7\x8c\xc4\x50\x75\x55\x58\x58"
+ "\x7b\x5f\x02\x8d\x17\x77\xb7\xec\x90\x98\xb9\x37\x21\xbf\xf9\xe0"
+ "\xd1\x5e\x58\x6c\xa6\x39\x68\x66\x36\x3c\x02\xba\xe3\xd2\xac\x8e"
+ "\xd2\x3f\xd2\x7c\xde\x8c\x26\xff\xf9\xbc\x19\x87\x40\xca\x30\x81"
+ "\x34\xb3\x01\xa4\xfb\x93\x00\xe1\x02\xae\xdc\xcc\xd7\x47\xc3\x26"
+ "\x0f\xfb\x33\x8e\x53\xcb\xb7\xe3\x58\x38\x73\x9c\xc6\x6e\x5d\x4b"
+ "\xf3\x5b\x19\xcb\x90\x7f\x7f\xc1\x3e\x28\x96\xee\x09\x9f\xa9\x08"
+ "\x2e\x3f\x29\x65\x14\xc4\x3a\x87\x67\x78\xa2\x76\x77\x78\x70\xfc"
+ "\xd6\x17\xff\x9a\xf1\x7c\xe5\xee\xaa\x3e\x1a\xcf\x3e\x46\x7e\xe0"
+ "\xde\x25\xb1\x9a\x32\x1c\x6f\x6b\xe2\x19\x8b\xa7\x39\xdb\x9c\x1a"
+ "\xbc\x48\xf6\x5c\xee\x91\xb6\x56\xd2\x0f\xd2\xc5\x7a\x91\xae\x27"
+ "\x7d\xdc\x21\xf7\xd9\x8e\xb0\x9b\x73\xc9\x06\xbc\x58\xbe\xf4\x0b"
+ "\x48\xb0\x1d\xf3\x02\xea\x74\xce\x62\xaf\x8e\xec\x28\xc7\xfa\xc8"
+ "\x1f\xe0\x04\xb6\xa8\xf4\x4b\x88\x46\x1d\x8a\x22\x7b\xf0\xa1\x3d"
+ "\x64\x1e\x8b\x75\xa3\x5d\xfb\x36\x9d\x85\x58\xf2\x13\xb4\x2f\xb2"
+ "\xad\xdb\x0e\xbe\x33\x49\x31\xbb\x56\x42\x9c\xe7\x4c\xc1\x48\xc7"
+ "\x99\x82\xcb\x5f\xf6\x41\x5c\x8c\x09\xf4\xb5\x2b\x51\x77\x57\xa1"
+ "\x7d\x9c\x46\xfb\xe8\x16\xf6\xd1\xaf\xaf\xcf\xb5\x96\xd3\x37\x37"
+ "\xdc\x36\xb6\xc9\xb6\xb1\x0e\xf5\x75\xed\x80\x6d\x78\x56\x25\x49"
+ "\xb5\x12\x03\xa4\x11\xf9\x3e\xbd\xba\x7e\xd3\x70\xf2\xfb\xa9\x6c"
+ "\xf4\x52\x03\x8d\xcd\x32\x3d\xcc\xb3\x17\x65\x11\x3e\x4e\x32\xb0"
+ "\x6d\xbb\x3b\x0e\x66\x75\xc1\xc0\x98\x6e\xd6\x1f\x7b\xaf\xcd\x6f"
+ "\x36\xcc\x65\x67\x8e\x4b\x19\xb9\x98\xae\x33\xcc\xbf\x49\x8f\x72"
+ "\xfc\xa3\x18\x03\xce\xea\xa0\x39\x02\xbb\x94\x31\x11\x71\x01\xbd"
+ "\x97\xf8\x98\xcf\x49\xce\xac\x46\x58\xf0\x22\xcf\x3d\x51\xcb\x8d"
+ "\xbe\xa8\xdd\x4d\xd6\xe5\xbd\xdc\x36\xfb\x50\x06\x27\x0a\x41\x5a"
+ "\xdc\x8d\xbc\xf1\x22\x6f\x5c\xdc\x67\x64\x71\x9f\x51\x7e\x30\xbe"
+ "\xc4\xce\x7c\x99\x79\x61\x0c\xf9\xa2\xb3\x99\xbd\xb0\xc8\x04\x6c"
+ "\xe3\x29\xe4\x91\xb3\x83\xfc\x4b\x8c\x6f\x9d\xf0\x21\xbb\x90\x3f"
+ "\xd1\xdd\xa0\x67\x15\x5e\xfd\x2f\x37\xb5\x85\x7b\x51\xcf\xc9\x8f"
+ "\xc4\x6e\xd6\x44\xa0\xac\x62\x2a\xc9\xce\xd1\xee\x63\x37\x73\xbf"
+ "\xc6\x65\xeb\x59\x97\x34\xb6\x6f\x5d\x92\x01\xaf\xd1\x8a\xaf\xa1"
+ "\xb3\xb8\x6a\xc9\xcf\x54\xcc\x00\xf2\x33\x36\xb3\x1d\x3c\xc8\xcb"
+ "\x18\xea\x97\xd6\x25\x25\x70\x9e\x3e\x81\x3c\x5d\x0a\xba\x09\x6e"
+ "\xd0\x20\x5d\x7a\xa4\x19\x0e\x17\x1c\x07\xe2\xb1\x17\xed\x88\xf8"
+ "\xdc\x47\x3e\x08\x75\x0d\xe3\x14\xe3\xec\x65\x06\xf8\x30\xe9\x13"
+ "\xa0\xbd\x95\x4a\xcf\xb3\xcf\x69\x4e\xd4\x66\xf6\x00\x8b\xde\xdd"
+ "\xc1\xf8\x3c\x52\xc6\xa4\x83\x59\x6e\x08\xad\xd3\xf7\x8f\x19\xd0"
+ "\xe9\xfb\xc7\x0c\xe8\xf4\xfd\x06\xfe\x4e\x41\xa5\xd7\xe7\xab\x51"
+ "\xaf\xa3\xd4\x7a\x7d\xdf\x9d\x7f\x55\xbd\x9e\x33\x74\xbd\x7e\xf9"
+ "\xb4\x4a\xaf\x37\xfd\x6d\xf4\xfa\xe3\x1c\xae\xd7\x61\x7d\xd7\x72"
+ "\x7d\xc5\xbe\xfb\x1d\xb0\x4b\xf7\x47\x29\x7a\xfb\xbb\x37\x48\x6f"
+ "\x67\x65\xfd\xbd\xea\xed\x79\x57\x92\x01\xaf\x4b\xae\xb7\x88\xf3"
+ "\xa2\xf5\xf6\xe3\x9c\x5e\x50\xf8\x47\xfa\xcb\xca\xfb\xe2\x0d\xa5"
+ "\x30\x05\xf9\xd6\x11\xbb\x79\x34\x1c\x16\x3c\xec\x30\xcc\x67\x3e"
+ "\xf4\x11\x5b\x49\x9f\x7a\x2d\x8c\xf9\xa2\xea\x33\x4a\x7f\x0f\x7a"
+ "\xac\xa3\xca\xe6\x79\x0b\x62\x4d\xf4\x8e\x67\x79\x3c\x8b\x1e\x65"
+ "\xa7\x77\x41\x48\x8f\x96\xde\xff\x78\xb7\x7a\xc1\x8b\xfe\xc4\xbb"
+ "\xad\xb1\xca\xb7\xf5\x7f\x1c\xbe\x68\xf1\x8e\x88\x45\x78\x0c\xae"
+ "\x8a\x59\x1d\xca\xfb\x8b\xa0\xb1\x49\x54\x63\x15\xda\x8b\xf6\x84"
+ "\x34\xfb\x13\xfc\x95\xf0\xf7\x29\xfc\x0d\xc3\xdf\x7b\x88\x8e\xa1"
+ "\xf5\x73\xb3\xf9\xf8\x17\xfb\xb2\x4e\xe1\x07\x67\x47\x73\x1b\xbc"
+ "\x19\xa2\x4f\xca\xf7\xae\x8a\xd9\x05\xca\xfb\x90\x7e\xf8\x7e\x7e"
+ "\xcc\xd6\x52\xdd\xc8\x13\xad\x78\x47\x23\x9e\x55\xf8\xc2\xf9\x33"
+ "\x68\x13\xb0\xfd\x59\xf4\x2e\x15\x75\x49\xe3\x62\x05\x77\xcb\xbf"
+ "\x93\xf9\x3b\x1d\xe4\x03\xc5\x79\xc2\xd7\x8a\x3a\xb0\x5e\x3b\xf6"
+ "\xc3\x79\xea\x7a\x83\xf1\x03\xf3\x3c\xa1\xf2\x86\xc6\x8b\x39\x21"
+ "\xd7\x7f\x4d\x4f\xf2\xb2\x21\xe2\x0a\xf9\xfd\x2b\x4b\xc8\x37\x65"
+ "\x36\x79\xad\xbe\xbe\x9c\xd8\x0f\x4b\x4e\x0d\x31\x2e\x99\x13\x72"
+ "\xfc\xeb\x8d\xaa\xcf\xcd\x1c\x37\x1a\xbc\x35\xf9\x26\x9a\xeb\xa4"
+ "\x58\xeb\x48\x92\x07\x28\xde\x7a\x7d\xb9\x5d\xea\xc3\x98\x31\x06"
+ "\xed\x71\x8e\xf3\x03\xb6\xe3\x24\xc6\xa8\xeb\x72\x62\xb7\x2f\x87"
+ "\x34\xcf\x99\xf8\xc8\xe7\xd1\x07\xf5\xa2\x3f\xe8\x3d\x53\x10\x7b"
+ "\xc4\xe4\x06\x5f\x6d\xbe\xc9\xe6\x69\x83\x7a\x84\x23\xff\x4b\xf4"
+ "\x9e\x3f\x93\x13\x53\xb1\x12\xf8\xbb\x0d\xeb\x63\x6f\xa0\xff\xcd"
+ "\x7c\x3f\x7c\x23\xfa\x1c\xf4\x19\xdc\x0f\x7f\x03\x1f\xdc\xfb\xcc"
+ "\xcd\xb9\xb3\x17\x32\xf7\x91\x63\x7f\x80\xd2\xc3\xa0\x2f\x5d\x03"
+ "\xd1\x84\xdf\xe6\x39\x2c\xfc\xf2\xc3\xe8\x97\xf1\xb9\x4e\xe5\x97"
+ "\xf9\x9c\x7a\x80\x5f\xa6\xf8\xfb\x48\x67\x17\xc4\x38\x61\xf8\x1c"
+ "\x67\xac\x7b\x93\x93\xf9\x28\x1e\xa7\xf7\x28\x08\x13\xa3\xf8\xe8"
+ "\x57\x30\xee\xe8\x5b\x25\xfc\x73\xad\xec\x9f\x5f\x39\xfd\xed\xfd"
+ "\xf3\x2b\x16\xf4\xcf\x18\xef\xbd\x4c\xbe\x19\xfd\xf2\x9e\x13\x0e"
+ "\xc9\x83\xbe\x78\x68\xb2\xcd\xaa\x0e\x25\xdb\x39\xd8\x7f\x92\x4c"
+ "\x49\x77\x0e\x37\x79\xe8\x1d\xff\x9f\xbd\x31\xaf\x34\x53\xff\xd8"
+ "\x8b\x7d\xe3\xeb\xcb\x3b\xa4\x18\x33\xca\xd6\xf4\x01\xf3\xac\xce"
+ "\x89\x65\x7d\x39\xd1\xde\xca\xfa\x5c\x4f\x5f\xbc\xae\xaf\x0f\xe5"
+ "\x8b\xfe\x02\xfb\x2b\xbd\xe3\xe9\x02\xce\x13\xdf\xb5\xf9\x26\xdf"
+ "\x73\xb7\x34\x60\xdf\x34\xa9\xee\x34\x4c\x64\xdb\x5e\x69\xf7\x6c"
+ "\x7b\xe5\x58\xdf\xb6\x57\x8e\xa2\x5e\xc6\x60\xfc\x88\x32\x3f\x6f"
+ "\xf5\x6d\x7b\xc5\xe1\xdb\x5e\xdb\xec\x8d\xae\xcf\x75\x44\xbf\xd2"
+ "\x81\xcf\x5d\xbe\xa7\x51\x0f\x36\x90\x1e\x7c\x08\x86\x39\xd4\x0f"
+ "\x3f\xf0\x61\x30\x3d\x78\xd9\x32\xb4\xbe\x78\x76\x0e\xea\x41\x07"
+ "\xea\xc1\x97\x6a\x3d\x78\x9f\xce\x38\x14\xba\xf0\xa0\xd0\x05\xe4"
+ "\x3b\x1f\xcb\xf4\xf7\xd3\x73\x0f\x06\xd7\x87\x63\x17\xa7\x0f\xbd"
+ "\x67\xfc\xf5\xa1\xe6\x1b\xea\x03\xf6\xaf\xf1\x75\x38\x6e\x3a\x7f"
+ "\x26\x49\xaa\x21\x7d\xf8\x64\x40\x1f\xde\xfc\x93\x43\xea\x1b\xb2"
+ "\x3e\xcc\x0d\x79\xfe\x57\x70\x7d\xd8\x95\xfa\x2d\xf5\xc1\x3d\xa0"
+ "\x0f\xbb\xb2\x3c\xdb\x76\x2d\xec\xdb\xb6\x2b\x7b\x40\x1f\xce\xa2"
+ "\x3e\xec\x32\x0d\xe8\xc3\xae\x1c\x7c\x2e\x18\xac\x0f\xf3\x3e\xf9"
+ "\x6e\xf5\x21\xfc\xab\x7f\x0d\x7d\xc8\x0e\x39\xfe\x0d\xa1\x0f\xdf"
+ "\xd2\x3f\x24\x67\xa9\xf4\x01\xfd\xc3\x2e\xf4\x0f\xbb\x54\xfe\xe1"
+ "\x14\xe9\x83\xca\x3f\xec\x42\xff\xb0\x2b\x88\x7f\x78\xf0\x8b\xef"
+ "\x56\x1f\x2e\x3b\xfe\xaf\xa1\x0f\xf3\xdb\x86\xa6\x0f\x35\xdf\xd2"
+ "\x3f\x24\x37\x0d\xe8\x43\x0d\xfa\x87\x1a\xf4\x0f\x35\x2a\xff\xf0"
+ "\x29\xea\x43\x8d\xca\x3f\xd4\xa0\x7f\xa8\x09\xe2\x1f\x1e\x3a\xfb"
+ "\xdd\xea\xc3\x88\x3f\xfc\x6b\xe8\x43\x4e\xc8\xf9\xef\x10\xfa\xf0"
+ "\x2d\xfd\x43\x0a\xa8\xf4\x01\xfd\x43\x0d\xfa\x87\x1a\x95\x7f\x78"
+ "\x9f\xf4\x41\xe5\x1f\x6a\xd0\x3f\xd4\x04\xf1\x0f\x8f\x84\x7f\xb7"
+ "\xfa\x70\x47\xc5\xbf\x86\x3e\x3c\xd2\x35\x34\x7d\xa8\xfd\x96\xfe"
+ "\x21\x25\x67\x40\x1f\x6a\xd1\x3f\xd4\xa2\x7f\xa8\x55\xf9\x87\x8d"
+ "\xa8\x0f\xb5\x2a\xff\x50\x8b\xfe\xa1\x36\x88\x7f\x58\x78\xc5\x77"
+ "\xab\x0f\x0b\xa6\xfe\x6b\xe8\xc3\x42\xf7\xd7\xe9\x83\xa2\x0b\xa4"
+ "\x17\xa4\x0b\x7d\xa5\x39\x40\xe3\x8c\xd7\x4f\x0a\x7d\x20\x3d\xe0"
+ "\x3a\xd1\x93\x13\xeb\x45\x5d\xf0\x3c\x8d\xba\xd0\x2b\x74\x81\x78"
+ "\x41\xfa\x40\xe3\x0a\x1a\x4f\x90\x4e\x78\x71\x4c\xe1\x89\xc6\x31"
+ "\xc5\x66\x6d\x1c\xe9\x41\x6f\xd4\xd7\x8c\x2b\x7a\x81\x8f\xfd\x68"
+ "\x8c\x77\x5a\x5a\x74\x6d\x30\x3d\x78\x65\x88\x73\x7c\xfd\xe3\x4b"
+ "\x3f\x3d\xf8\x70\x40\x0f\x1e\x0e\x31\xae\x98\x1f\x42\x0f\xec\x17"
+ "\xa1\x07\xa7\x07\x8f\x33\xbf\xad\x1e\xf4\xae\x92\xf5\x80\xc6\x99"
+ "\x3e\x79\x9c\xf9\x18\x8e\x33\xa3\x87\xaa\x07\x8b\xe1\x9b\xe9\x41"
+ "\x4d\xea\xd0\xf4\x20\xb9\x89\xe2\x04\xa1\x07\x35\x0b\x3d\xd1\x18"
+ "\x2b\xf8\xe9\xc1\x05\xe2\x05\x3f\x3d\xc8\xbd\xe1\xbb\xd5\x83\x80"
+ "\x78\xe1\x9f\x56\x0f\x96\x84\xdc\xff\xd5\x87\x72\x27\x7f\x4f\xf3"
+ "\xf6\xf4\xed\x46\x8c\x43\xcc\x1b\xd1\x37\x1c\x3b\x56\x42\x22\xf5"
+ "\x11\xde\x75\x39\xb1\x95\xa7\x21\x6d\xeb\x4a\xd0\x7a\x56\xa3\xfc"
+ "\x8b\x40\xdb\x2b\x01\xf4\xae\x2e\x88\x3d\xd4\xe9\x10\x73\x48\x66"
+ "\x2b\xd4\x23\x7c\x5f\xa5\x98\x43\xf2\xf6\xe4\xc4\x6c\xfd\x0a\xf8"
+ "\xba\x57\xeb\xa2\x9f\xa1\x6c\x1f\xd3\x04\x93\xed\xae\x21\xf8\xfa"
+ "\x5e\xb5\xaf\x3f\xe5\x2f\x5b\xb5\x9f\xaf\xb1\xa8\xe6\x90\xe6\x84"
+ "\x98\x43\xba\x08\x99\xf2\xb9\xfd\xd3\xc2\xcf\xf7\xcf\x21\x7d\xcb"
+ "\x39\xfe\x3e\xf4\xf1\xaf\x48\xfe\x3e\xfe\x9b\xc9\xf4\xb1\x63\x17"
+ "\x9a\x77\x24\xfb\x26\xbb\x56\x6c\xba\xbf\x8f\x27\x3b\x46\x79\x9f"
+ "\xaf\x7c\x65\x1f\xef\xeb\x9f\x1e\xb0\x69\xb2\x65\xb2\x6b\xb2\x63"
+ "\xde\xd7\xd3\x3e\xbf\xcf\xa5\x34\xd7\xa9\xe6\x8e\xbc\xd1\xb2\x9f"
+ "\x0f\xe2\xe3\x7d\x17\xf4\xf1\x79\x41\xe5\xff\x8f\xe0\xe3\x49\x0f"
+ "\x14\xfb\xfe\xfb\xb3\xed\xbc\xd0\xeb\xbf\x2e\x4a\x0f\x76\x4d\xfc"
+ "\x7a\x3d\xd8\x95\xea\x7b\x6e\xbc\xb6\x4e\x35\x67\xe4\x8d\xde\x85"
+ "\x7e\x5e\xcc\x19\x09\x3d\x18\x98\x33\xf2\x05\xce\x19\xf9\xe9\xc1"
+ "\xd2\x88\xef\x56\x0f\x02\xe6\x8c\xfe\x69\xf5\x60\x69\xf7\xb7\xd4"
+ "\x83\x8b\xf0\x07\xbb\xd0\x1f\x8c\xcf\x51\xe9\x01\xfa\x83\x5d\xe8"
+ "\x0f\x76\xa9\xfc\xc1\xc0\x5c\x91\x2f\x70\xae\xc8\x4f\x0f\x0a\x46"
+ "\x7c\xb7\x7a\x10\x30\x57\xf4\x4f\xab\x07\x05\xce\x6f\xa7\x07\x35"
+ "\x17\xe1\x0f\x6a\xc8\x1f\xec\xa9\x53\xcd\x11\x79\xa3\xe5\xb8\x2f"
+ "\x48\xcc\xe7\xbb\x60\xcc\xb7\x7c\xd4\x3f\x6a\xcc\xf7\xf7\xad\x07"
+ "\xcb\x43\xbe\x2b\xbd\x48\x3d\xb8\x08\x7f\x50\x83\xfe\x60\x02\xa8"
+ "\xf4\x00\xfd\x41\x0d\xfa\x83\x1a\x95\x3f\x18\x98\x1b\xf2\x05\xce"
+ "\x0d\xf9\xe9\x41\xe1\x98\xef\x56\x0f\x02\xe6\x86\xfe\x69\xf5\x60"
+ "\x85\xf6\xdb\xe9\x41\xed\x45\xf8\x83\x5a\xf4\x07\x13\xb2\xeb\x54"
+ "\x73\x42\xde\xe8\x5a\xf4\x07\xb5\x2a\x7f\x30\x30\x27\xe4\x0b\x9c"
+ "\x13\xf2\xd3\x83\x95\xe3\xbe\x5b\x3d\x08\x98\x13\xfa\xa7\xd5\x83"
+ "\x55\x21\xd7\x55\x28\x3a\xd0\x3f\x07\xc0\x06\xf4\x80\xcb\x7e\x75"
+ "\x4e\x6c\x6f\xd4\x2b\xfb\x94\xf1\x7f\xe5\xa0\xf1\x7f\x4a\x73\xc8"
+ "\x79\xa0\x80\xf7\xcb\x7c\x6c\xb0\xfd\x95\x66\x31\x4e\xa8\xcf\x25"
+ "\xf9\x3f\xbf\x41\x8c\x13\x0d\xf3\x49\xfe\xa6\xe0\xf2\x1f\xea\x9c"
+ "\x60\x1e\xca\xbf\xf3\x02\xf2\x7f\x34\xc4\x38\xe1\x91\x6f\x27\x7f"
+ "\x5a\xef\xd8\x77\xe6\x12\xca\x5f\x99\x13\xfc\x14\xa4\x57\xbe\xd5"
+ "\x78\xf1\xa9\x90\xf2\x0f\xba\x9e\xa4\x49\xac\x27\xa1\xb5\x24\x47"
+ "\xba\xba\x60\xeb\x39\xd0\xc7\x14\x0a\x9d\xe0\x6b\x4a\x50\x27\x2a"
+ "\x4f\x42\x9a\x47\xb4\xad\x7f\x4d\x09\xed\x8b\x2e\xfc\x82\x95\xaf"
+ "\x29\x51\xe6\x03\xfa\xd7\x93\x2c\xa2\xf5\x24\x45\xd1\xdf\x7a\x2e"
+ "\x80\xd6\x93\x14\xa3\x8c\x9d\x28\xe3\xb3\x24\xdf\x0f\xfd\xec\xda"
+ "\x6f\x0e\x20\xd4\x3a\x92\x8b\x99\xd7\xf9\x2b\xac\x23\xe1\x73\x00"
+ "\x97\xc4\xa6\x8b\xec\x21\x7d\x3b\xca\x91\xe4\x69\x4b\xf2\xf0\x79"
+ "\x5d\xc5\xc6\x6d\xe6\x76\xd8\xda\x0b\x7a\x65\xfe\x5f\x91\x29\xf9"
+ "\x7b\x86\x7a\xc0\xce\xe4\x44\x93\x4c\x9f\x5f\x89\x7e\x7e\xd5\x80"
+ "\x9f\xf7\x0d\xbb\xa5\xa1\x76\x03\xfa\xf7\x0d\x30\x91\xf3\x28\xa6"
+ "\xb6\x59\xcc\x07\xd4\xe7\x92\xbd\x93\x3d\xb3\xe8\x57\xba\xfa\x64"
+ "\x7b\x17\xf2\x3e\x0c\x24\x67\x71\x7e\x66\xb1\x86\x6c\x8f\x64\x1e"
+ "\x23\xcb\xbc\x2e\x84\xcc\xb9\xbc\x35\x7a\xda\x8b\x83\xbe\x33\xeb"
+ "\x97\xb9\xe7\x19\xd5\xfc\x8f\x5a\xe6\xf2\xbc\x8f\x0f\x6d\xf9\xa2"
+ "\xd6\x0f\x5d\xa4\xdc\x2f\xd9\xfc\x3e\xca\xbd\x4e\x96\x7b\xff\xfc"
+ "\xfe\xb7\x92\x7b\x71\xe8\xef\x5f\xfc\xe4\xbe\x2b\xf5\x12\xc8\xdd"
+ "\x3d\x58\xee\x34\xfe\x27\xb9\xef\xca\xa6\x71\x3e\x8b\xde\x55\xd0"
+ "\x27\xaf\x1b\x19\x2c\xf7\x35\xe7\xff\xfa\x72\x0f\xff\xea\x5f\x43"
+ "\xee\x6b\x43\xee\x7f\x1e\x20\xf7\x4b\x60\xef\xc9\x59\x41\xe4\x2e"
+ "\xdb\xfb\xae\xa3\x34\xae\x47\xb9\xcb\xf6\x7e\x2a\x88\xdc\xd7\x7d"
+ "\xf9\xd7\x97\xfb\x65\xc7\xff\x35\xe4\x6e\x0e\xb9\xfe\xc3\x5f\xee"
+ "\x35\x97\xc0\xde\x93\x9b\x06\xcb\xbd\x46\xb6\xf7\x9a\x6c\x1a\xc7"
+ "\xb3\xe8\x1a\xd9\xde\x3f\x0d\x22\xf7\xf5\xff\xf7\xd7\x97\xfb\x88"
+ "\x3f\xfc\x6b\xc8\x7d\x83\xf5\x22\xe5\x7e\x09\xec\x3d\x05\x82\xc8"
+ "\x5d\xb6\xf7\x9a\xa3\x34\x6e\x47\xb9\xcb\xf6\xfe\x7e\x10\xb9\x3f"
+ "\xfd\xf9\x5f\x5f\xee\x77\x54\xfc\x6b\xc8\xbd\x24\xe4\xfa\x3f\x7f"
+ "\xb9\xd7\x5e\x02\x7b\x4f\xc9\x19\x2c\xf7\x5a\xd9\xde\x6b\xb3\x69"
+ "\x9c\xce\xa2\x6b\x65\x7b\xdf\x18\x44\xee\x1b\xff\xf8\xd7\x97\xfb"
+ "\x82\xa9\xff\x1a\x72\xdf\xd4\xfc\x75\xef\xeb\x15\xd9\x2b\x73\x36"
+ "\xfc\xfd\x2c\xc6\xf7\x8a\xbc\x49\x0f\x48\xe6\xa4\x0b\x6a\x99\xf3"
+ "\x35\x3c\xab\xc4\x1a\x1e\x8a\xdb\x19\x8e\xc5\xd9\x30\xbe\x7e\xa3"
+ "\x8b\x8f\xdb\xe5\x38\x9e\x69\xb4\x71\x14\xcb\x87\x8e\xe3\x4b\x7f"
+ "\xa7\xc8\xfb\x9b\x8e\xdd\xbe\x4e\xde\x81\x63\xf2\xbf\x17\x79\xab"
+ "\xc7\x6f\x97\x46\xde\x65\x0d\xdf\x4c\xde\x35\xa9\x43\x93\x77\x4d"
+ "\x96\x90\x37\x5f\xa7\x51\x30\x20\xef\x9a\x6c\x21\xef\x9a\x9c\xd0"
+ "\xfd\xf9\xe6\xf7\xfe\xfa\xf2\xf6\x9f\x93\xff\xe7\x95\xb7\x25\xe4"
+ "\xf9\x1f\x34\x07\x43\xb2\x26\xb9\xef\x58\x0e\x89\xcf\x2f\x17\x73"
+ "\x2b\x9e\x33\xf1\xe4\xf3\xb5\x24\x7f\xfa\xc6\x27\x06\x75\xe0\xe3"
+ "\x1c\x07\xf4\xba\x72\x80\xbe\xe5\xa1\x75\x17\x47\x0a\xec\x60\x33"
+ "\x1f\x84\xad\x45\xa0\x3f\x94\xfb\x15\xcc\x69\x62\x7d\xb6\x63\x56"
+ "\xfa\xc6\x5b\x6b\xdd\x70\x10\xd8\xaa\xa4\xc8\x45\x4e\x90\x4e\x4b"
+ "\xcf\x64\xd0\xba\x8d\xf1\x4e\xe4\x09\x7d\xef\x83\x32\xdf\x7a\x1a"
+ "\xe0\xc3\x62\x00\xc3\x52\x92\xf5\x33\xaf\x85\xaf\x09\xf2\x9d\xcf"
+ "\x50\xe6\x65\xd4\x73\xaf\x41\x64\xbd\x4b\xba\x34\x6b\x33\x94\x75"
+ "\x19\x7e\xf3\x32\xdf\xf6\xfb\xcb\x4b\xb6\x36\x63\x4b\xc8\xbd\x9c"
+ "\x68\xbd\x0d\xc9\x93\x6c\xda\xb3\x5d\xcc\xcb\xd8\x30\xbc\xa7\x75"
+ "\x35\x64\xc3\xde\x9e\x78\xdd\xd3\xc5\x68\xeb\x1d\xc2\xd6\x9f\xff"
+ "\x0a\x61\x73\xff\x07\x48\x3f\x84\x6c\xfb\x84\x6c\xbf\x22\xd9\xfe"
+ "\x0f\xb0\xd5\x49\x91\xa7\xa5\x67\x0d\x24\x5f\x92\x6b\xe9\x1f\x41"
+ "\xbf\x98\xf6\x45\x21\x1f\x8f\xfe\x1d\xe5\x3c\xa9\x7e\x39\x4c\x24"
+ "\xfb\xf7\x6e\x7b\xe5\xa8\x67\x9b\x58\xa3\x41\x7e\xbf\x2f\x6a\x77"
+ "\x47\x45\x91\x2c\xff\x47\x48\xfe\xcf\x06\x95\xff\xae\x6f\x3a\xf7"
+ "\x2e\xcb\xff\x1b\x7f\xd7\xf3\xb7\xb2\xf7\x55\x97\xca\xde\x9f\x2b"
+ "\xbb\x38\x3d\x10\xf3\x34\x43\xd3\x03\x57\x10\x3d\xf8\x71\xd2\x60"
+ "\x3d\xd8\x95\x85\x7a\xe0\xf6\xd7\x83\x5d\xd9\x42\x0f\x76\xe5\x60"
+ "\x7e\xc1\x60\x3d\xf8\xf1\x5b\xdf\x8d\x1e\x5c\xe4\xf7\x3c\xff\xf0"
+ "\x7a\x50\x5e\x7e\x91\x7a\xf0\x0d\xfc\xc1\x99\x20\x7a\xb0\x35\x35"
+ "\x88\x1e\xa0\x3f\x48\xce\x0a\xd0\x03\xd9\x1f\xec\x42\x7f\xb0\x2b"
+ "\x88\x3f\xd8\xfa\xeb\xef\x46\x0f\x2e\xf2\x3b\x9e\x7f\x78\x3d\xa8"
+ "\x08\xd9\xff\xfb\xeb\x41\xcd\x37\xf0\x07\x9f\x05\xd1\x83\xe7\x27"
+ "\x0d\xd6\x03\x8c\x05\x31\x0e\xf4\xd7\x83\x1a\xd9\x1f\xd4\xe4\x50"
+ "\x7c\x38\x58\x0f\x9e\x7f\xff\xbb\xd1\x83\x8b\xfc\x7e\xe7\x1f\x5e"
+ "\x0f\x2a\x43\x7e\xff\x1b\xa0\x07\xdf\xc0\x1f\x7c\x10\x44\x0f\xb6"
+ "\x19\x83\xe8\x01\xfa\x83\x14\x08\xd0\x03\xd9\x1f\xd4\xa0\x3f\xa8"
+ "\x09\xe2\x0f\xb6\x7d\xf8\xdd\xe8\xc1\x45\x7e\xb7\xf3\x0f\xaf\x07"
+ "\xdb\x43\x8e\xff\xfc\xf5\xa0\xf6\x1b\xf8\x83\xd2\x20\x7a\xb0\x23"
+ "\x63\xb0\x1e\xd4\xa2\x3f\x48\xc9\xf1\xd7\x83\x5a\xd9\x1f\xd4\xa2"
+ "\x3f\xa8\x0d\xe2\x0f\x76\x1c\xfe\x6e\xf4\xe0\x22\xbf\xd7\xf9\x87"
+ "\xd7\x83\xaa\x90\xdf\x7f\xab\xf5\xa0\xaf\x7f\xbc\xd0\xc2\xf5\xa0"
+ "\x62\x83\xd0\x83\x8d\xa4\x07\x5d\x62\xfd\x4e\xa5\xac\x07\xfd\x63"
+ "\x85\xce\x40\x1d\x78\x61\x56\xbf\x0e\xfc\xdf\xc0\x58\xa1\x0f\xe5"
+ "\xcd\xe7\x83\xe4\x71\x82\x32\x0f\xc4\xc7\x09\x38\x4e\xac\xf8\x4a"
+ "\x96\x3f\x9f\x13\x78\x21\xb8\xfc\x87\x30\x4e\xf4\x5b\xa3\x11\x28"
+ "\xff\xbf\xf3\xef\x74\x06\xcd\x0b\xfc\xf1\xdb\xae\xcd\xf8\xc9\x45"
+ "\xca\x5f\x89\x0b\x2e\x56\xfe\x9f\x05\x91\xff\x8b\x41\xe4\x5f\x93"
+ "\x25\xe4\x9f\xdc\xa4\xc4\x03\xca\xbc\x10\x8f\x07\x06\xc9\xff\xc5"
+ "\xef\x48\xfe\x7f\x9f\xdf\xe7\x5c\x7a\xf9\xef\x0c\x29\x7f\x2f\xda"
+ "\x40\xad\xe4\x6b\xae\x92\x7c\x2d\x78\x59\xf1\x6a\xc3\xb4\x70\x4c"
+ "\xe3\xef\x82\xab\xe4\x3c\x6f\x05\xd0\xde\x49\xd6\x58\x4d\x2e\xf1"
+ "\x9b\x60\x86\x29\x30\xb1\x9b\xc1\x88\x6d\x13\x70\x12\x94\x61\xba"
+ "\x35\x7a\xb3\x71\x18\xc2\xb7\xb1\x8a\x39\xf1\x98\x36\x9c\x60\xd9"
+ "\x66\x2d\xdf\x17\x27\x56\xc3\xf7\xce\x94\xe1\x35\xb4\x57\x96\x95"
+ "\x60\x11\x4e\x27\xc3\x89\xbd\xa3\x25\x09\xea\x07\xd3\x16\x21\xc3"
+ "\xd0\x9e\x55\x06\x35\x8d\xd1\x1a\x23\xc7\x25\xc3\x45\x7a\x2d\x9f"
+ "\x35\x12\xac\x77\xb3\x36\x51\x0d\xc7\xa6\x02\xe1\x55\xe0\x2e\x93"
+ "\xf1\x25\xf9\xb5\x77\x2c\x40\xf4\x66\x03\xc7\x17\xdd\x2d\x81\x4c"
+ "\x1f\xea\xc4\xac\x6e\x0e\xaf\xd1\x26\xfb\xc1\x0f\x03\x75\x3b\xa2"
+ "\xd9\xb0\xd4\x6a\x19\x2e\xd5\x27\x01\x3f\xf7\x19\xd3\xb5\x6a\x5e"
+ "\xcb\xb0\x31\x0a\x1f\x69\x4f\x27\x75\x7b\xbd\xd8\xfe\x5a\x41\x63"
+ "\xac\xf7\xb9\x09\x4d\x72\x5b\x26\xa9\xeb\x25\x38\x2c\x77\xab\x2c"
+ "\x13\x3d\xb6\x23\xad\x1f\x5f\xe5\xf2\x72\x05\x0e\x75\x76\x14\xca"
+ "\xc8\x6a\x2b\x00\x90\xdb\x3d\x02\x65\xb3\x47\x6e\xbb\xd1\x9f\x8f"
+ "\x1a\xbb\xc2\x47\x84\xa1\xbd\xcd\x46\x22\x4c\xba\x82\xd7\x6b\xe1"
+ "\xfb\x68\x89\x76\x5b\x3c\x97\x93\x5e\x1c\xee\x02\xa8\x13\xed\xb9"
+ "\x5c\xc6\x99\x21\xda\xac\x87\xda\x7e\x59\x6b\x29\xcf\x2a\xc3\xc5"
+ "\xf1\xf6\x44\x3e\x6a\xf4\x6a\xb4\xb3\x06\xc3\xea\xd4\xb0\x57\x08"
+ "\xd8\x2c\x3b\xc2\x66\x0d\x86\xd5\xab\x61\xaf\x14\xb0\x73\x1d\x08"
+ "\x9b\x3d\x18\xd6\x33\x52\x05\x7b\x95\x80\x7d\x10\x10\x36\x67\x30"
+ "\xac\x41\x0d\x1b\x2f\x60\x17\x67\x20\xec\xc2\xc1\xb0\x46\x35\xec"
+ "\x28\x01\xfb\x90\x1e\x61\x73\x07\xc3\x96\xa9\x61\xaf\x16\xb0\x0f"
+ "\x1b\x10\x36\x2f\x10\xb6\x9e\xeb\x01\x8c\x95\xf5\xe0\x1a\x01\xbb"
+ "\x20\x15\x61\x0b\x82\xb4\x2d\x8c\xe3\x15\xb0\x09\x02\x36\x53\x8b"
+ "\xb0\x85\x41\x64\xa1\x86\xbd\x56\xc0\xae\xca\x46\x58\x53\x10\x59"
+ "\xa8\x61\x47\x0b\xd8\xc7\x13\x11\xb6\x38\x88\x2c\xd4\xb0\xd7\x09"
+ "\xd8\xfc\x64\x84\x35\x07\xe1\xef\x00\x6c\xe4\x13\x13\x11\xa6\x04"
+ "\x79\xd2\x1e\x84\xb7\x6a\x9c\x63\x04\xce\x65\x69\x08\x5f\x16\x84"
+ "\xb7\x6a\xd8\xb1\x02\xf6\xc9\x74\x84\xdd\x32\x18\x16\x34\xb5\x82"
+ "\xbf\xb7\xc9\xfc\xbd\x5e\xc0\xaf\x98\x85\xf0\xe5\x41\xf8\x4b\xf9"
+ "\x56\xd9\xd6\x12\x05\xec\x92\x2c\x84\xad\x0c\xc2\x5f\x35\xec\x0d"
+ "\x02\x76\x93\x1b\x61\xab\x82\xf0\x57\x0d\x7b\xa3\x80\x5d\x9d\x84"
+ "\xb0\x3b\x83\xf0\x57\x0d\x7b\x93\x80\x5d\x43\xba\x53\x1d\x84\xde"
+ "\xb1\x2a\xd8\x24\x01\xbb\x2e\x1e\x61\x6b\x82\xc8\x42\x0d\x3b\x4e"
+ "\xc0\x96\x75\x21\x6c\x43\x10\x79\xa8\x61\x6f\x16\xb0\xeb\x49\xd7"
+ "\x1b\x83\xc8\x43\x0d\x7b\x0b\x8b\x7c\x5a\x27\xfb\xc5\xa6\x40\x58"
+ "\x94\xbd\xf0\x89\x16\x48\x66\x91\x1b\xc9\xc7\x10\xdc\x1e\x82\xeb"
+ "\xc7\x67\xf1\xfc\x80\xfc\x8d\xec\xc3\x52\x58\xe4\x53\xd9\x32\xbe"
+ "\xe6\x41\x75\x5b\xb4\x6a\xd8\xf1\x2c\xb2\xca\x21\xc3\xee\x1b\x0c"
+ "\xab\x53\xc3\x4e\x60\x91\x5b\xac\x32\x6c\xcb\x60\x58\x7d\x3f\x2c"
+ "\x8b\x7c\xae\x0d\x61\xf6\xd7\xc9\xbe\x51\x45\xe7\x6d\x2a\x7c\xb7"
+ "\xb2\xc8\xf2\x76\x19\x9f\x75\x30\x3e\x83\x1a\xf6\x36\x16\xf9\x13"
+ "\x85\xce\xd6\xc1\xb0\x46\x35\xec\x0f\x58\x64\x45\x87\x0c\xdb\x36"
+ "\x18\xb6\x4c\x0d\x3b\x91\x45\x56\xda\x65\xd8\x43\x83\x78\x4f\x76"
+ "\x60\xc1\x58\x40\xf8\xa4\xdb\x59\xe4\xf6\x2e\x19\xd6\x2f\x0e\x50"
+ "\xf5\xc3\x77\x08\xb9\x5b\x3a\x50\xee\x47\x79\x7f\xb3\x59\xdb\x11"
+ "\x2c\xc6\x30\xdd\x0c\x97\x9d\x94\x6a\x6b\x44\x9f\xa4\x9c\x7b\x55"
+ "\xc7\xbf\x2b\xf4\xd5\xe4\x57\x65\x3a\x99\x47\x9d\xb6\x43\x62\xed"
+ "\x13\x9c\x20\xce\x52\x89\xde\xdd\x62\xc7\x74\xc7\xb5\xf9\xcd\xae"
+ "\x8a\xda\x26\xbb\xe6\xe6\x0e\xda\xc7\x0f\xef\xf7\xd9\xe1\xc9\x6c"
+ "\xba\xdf\x61\x61\x6e\xda\xbf\xd2\xbb\x7d\x79\x96\xcd\xd7\x8d\xb1"
+ "\x1c\x73\x23\x0e\x37\xc6\x72\x61\x06\x1c\x57\x96\x9a\x59\xaf\xcd"
+ "\xdc\x0d\x27\xa4\xda\xf3\x6c\x55\x41\x1a\xd2\x60\xc2\xfa\xf2\x8e"
+ "\xe3\x33\xa7\x01\x63\x20\xec\x2b\x0b\xad\x45\xb4\x8f\x68\xdd\x38"
+ "\x47\x74\xa3\x89\x3d\xb3\xa0\xcb\xb4\x09\xae\x3b\x29\xd5\xf1\xb8"
+ "\x80\xef\x31\x78\xa6\xe0\x6e\x5f\xf4\xf2\x42\xda\x7b\x90\x55\xbf"
+ "\x96\x25\xf6\x25\xac\xe3\x67\x3b\x22\x0d\xed\x2c\x21\xbf\xcc\xd7"
+ "\xbb\xa5\x8c\xce\x55\xb3\x6e\x3a\x09\xc7\x55\x79\x8e\x51\xaf\xf1"
+ "\x3d\x0b\xb1\x4d\x65\xde\xf2\x83\x66\x9f\xee\x60\x31\x2b\x3f\xda"
+ "\x62\x2b\xb4\x83\x38\xf3\xa5\xee\x0b\x16\xf3\xb0\xcd\x57\x7e\x70"
+ "\x21\xa6\x37\xd9\x9c\xbd\x3c\x1d\x71\x34\x53\x7c\xd9\xa3\xfb\x7d"
+ "\x16\x2b\xff\x7d\xb6\xf5\xea\x5e\xe8\x94\xea\xf8\xde\x7d\x94\xce"
+ "\xb6\x1e\xe5\xfc\xf1\x6d\x3d\xda\x14\x16\x0f\xda\x9e\x88\xdf\x67"
+ "\xb9\x2a\xea\xda\x95\xb3\x47\x94\xba\x08\xaf\x5d\xc6\x15\x62\xdd"
+ "\x47\x2c\xdb\xb6\xbc\xdc\x55\x51\x1f\x85\xf1\x62\x97\xe0\x71\x7d"
+ "\xbc\x5d\x13\x96\x27\xdf\x27\xda\x35\xc3\xd2\xe4\xfb\x54\xbb\x66"
+ "\xcc\x24\xf9\x3e\x4d\xd9\xd3\x31\xf8\x1e\x93\xcb\x17\x22\x6f\x8b"
+ "\x7d\xbb\x72\x74\x14\xeb\x52\xfc\xce\xa2\x97\x2f\x34\x8c\xa6\xf3"
+ "\xfa\xea\x8f\x62\x9d\xc5\x62\x7f\xff\xfa\x97\xf1\x37\x56\xfe\x75"
+ "\xc8\xbf\x8c\x60\xb8\xde\x24\x2c\x05\x56\x59\x97\x41\xbc\xdd\xe4"
+ "\x65\x3e\xc4\x5b\x8d\x7c\x6a\xb6\x99\xbb\x64\xfe\xd5\x7f\xc8\xe3"
+ "\x7e\x92\x1d\xca\x97\x45\x1c\x6d\xe6\x75\x6d\x6b\x34\xa9\xe9\x4a"
+ "\xbd\xf5\xb6\x1f\x4c\xbc\xfd\x8e\x1f\x4e\xba\x73\xc9\x63\x8f\xe7"
+ "\xe5\x2f\x7d\xa2\x60\xd9\xf2\x27\x0b\x57\xac\x5c\x65\x7a\xaa\x68"
+ "\x75\xf1\x9a\xb5\xeb\xcc\xeb\x37\x20\x9e\xfe\xb3\xda\xd8\xae\x74"
+ "\x8d\x53\x02\xac\x63\x2a\xd6\xd1\x70\x3b\xa7\x05\xd3\x84\xec\x1b"
+ "\x12\xb5\x86\xe0\x71\xb5\x0d\x23\x5d\x3a\x3f\xa6\x5b\x6a\xd8\x4c"
+ "\x67\xd9\xa0\x8e\x69\x6c\x35\xf7\x5a\xe9\x7c\xb1\x4e\xa9\xa1\xf8"
+ "\x88\xe3\x5e\x2b\x9d\x6f\x77\x20\xbe\x0b\x12\xc7\xd2\x19\x64\x0d"
+ "\xb9\x94\x5f\x7f\x23\x40\x2b\x96\x0d\x86\x73\xac\x1e\xe2\x5f\xbc"
+ "\x92\x39\x76\x5e\xc9\xba\x09\xff\xce\x97\x58\x97\xe3\xe9\x02\xd8"
+ "\x8e\xcf\xa8\xe7\xfa\x13\xd2\xab\xb7\x1f\x48\xe0\xe7\x34\x25\xd4"
+ "\xbd\xc4\x3a\xb7\x5c\xc9\x3a\x9f\x79\x89\x75\xd7\x5f\xc9\xec\x89"
+ "\x3b\x21\xca\x55\xd1\xd0\x65\x97\x1a\x8c\xdc\x66\x30\xdf\x17\x59"
+ "\x6f\xdf\x81\x79\x13\x3c\x10\x56\x8f\xcf\x98\xe6\x3c\x60\x10\x74"
+ "\xef\xfd\xca\x1d\x8e\xed\x3b\xc4\xfa\x0a\x35\xdb\xb1\x1e\x21\xa3"
+ "\x57\x1f\x6e\xc5\x5e\x1c\xeb\x73\xd8\xdc\xc7\xc1\x2e\xbd\x9a\x53"
+ "\x7f\x8e\xd7\x17\x6b\xab\xee\x06\xc2\xf7\xcb\x22\x77\xf8\xea\xab"
+ "\x99\x07\x61\x27\xf9\x9e\x2e\xd4\x20\x4c\x1c\xe2\x76\xaa\xdb\x93"
+ "\xb4\x74\x45\xb1\x61\xe5\x9a\xc2\xc2\x71\x91\x90\xc4\x7f\xfd\xce"
+ "\xc6\x2b\xa6\xfd\x65\x5f\x7c\x89\xb5\x62\x3b\xad\xd8\xde\xb6\xc3"
+ "\x18\xbd\xa3\xbe\x00\xb6\xa9\x0a\xf1\xbe\x85\xe9\xfb\xf1\x7e\x3f"
+ "\xd2\xde\x26\xce\x53\x7b\xe7\x8f\xac\xe2\xd5\x3c\xa4\xb3\x8d\xce"
+ "\xd8\xa0\xfd\x68\x7b\xd6\x65\x6b\xb0\xdd\x3b\x11\xae\xcd\x70\x35"
+ "\xdc\x70\x42\xfa\xd9\xed\x48\x47\x23\xde\x13\xfc\xe7\x24\x47\x84"
+ "\x6f\x15\xed\x7a\x87\x9f\x9d\x89\xbc\xb2\xd6\x5e\xc9\x2a\x5d\x15"
+ "\x3f\xd3\xd3\x3e\xdb\xfc\x3c\x22\x7c\x46\xbe\xb4\x21\x6c\x55\x4f"
+ "\x69\xb6\x06\xc7\x81\x9a\xfa\x7e\x9c\xaf\xda\x89\x26\xa2\x83\xc6"
+ "\x96\x1f\x63\xf4\xe6\xeb\xcb\x81\x14\x37\x68\x3e\x46\x4f\x56\xf3"
+ "\x12\x6b\xc0\xab\x06\xaf\xea\x83\x98\xf7\x3b\xbc\xda\x30\xfd\x10"
+ "\xfe\x1e\xc4\xdf\xdf\xe1\x85\x63\xd3\x78\xa2\x7b\x75\x09\xeb\x9a"
+ "\x50\x0d\xd7\x13\x7e\xd4\xad\x87\x8e\x4b\xef\xa4\x12\xed\xb4\x8f"
+ "\x3d\x8b\xfc\x59\xa3\xff\xde\xdf\x8d\xf1\x80\xf9\xf8\x9b\x2c\x7e"
+ "\xd5\x57\x63\x31\x5e\x3b\xe5\xfb\x63\x78\x69\xe5\x7b\x07\x5e\x9e"
+ "\xaf\xbf\x02\xf1\x85\xba\x5e\x2b\xb8\x78\xd8\x8b\xba\x1a\x2f\x0e"
+ "\xee\x17\x06\x90\x5e\x37\xe3\xd5\xec\x9f\xfe\x7a\xb9\x48\xfb\x65"
+ "\xb6\x78\xfe\x65\xae\xfc\x5b\x09\xd2\x5e\xe4\xd3\x5e\xc4\xbf\xb7"
+ "\x4d\xa4\xed\x3d\x8a\xbf\x09\x78\x25\x05\xd4\x4f\x38\xb9\x5e\xf5"
+ "\xd1\xd9\x6e\x28\x4b\xbb\xf4\xb3\x62\x92\xd1\x0e\xa1\x5b\x1a\x1f"
+ "\xe3\x69\x26\xd4\xad\x9a\x01\xfd\x69\xcc\xf7\xd7\x9f\xc6\xac\x00"
+ "\xfd\xa9\x22\x5f\x84\xb6\xb0\xbf\x5e\xe8\xcb\xfe\x9e\xa7\xf3\xf0"
+ "\xb9\x31\x1b\xf1\xec\xa7\x39\x0f\xc4\xc1\xfb\xef\x1d\x27\x71\xdc"
+ "\x59\x00\x5a\xf2\x2f\xdd\x52\xe3\x6b\xa4\xb3\x54\xb7\x5c\xaf\xa0"
+ "\x05\xe9\xc3\xb4\x06\xa2\x6f\x15\xe2\xc5\xe7\x46\x84\x6b\xb0\xc1"
+ "\x57\x0a\x6d\xbc\x4c\xc5\x72\xd4\x47\x99\x5e\xc2\x49\xe5\xd8\x40"
+ "\xbb\x4c\x54\x46\xd4\xfd\xda\xc3\x98\x4e\xe3\x54\xfa\x9e\x29\xcc"
+ "\xe6\xb1\x03\xe9\x24\xfd\xda\x3c\xa9\x68\x4b\x19\xe0\x73\xe5\xc0"
+ "\x84\x78\x48\x45\x7b\x8b\x38\x2e\xbd\x96\x36\xbe\x04\x52\x09\x1f"
+ "\xf9\x74\xbb\xf4\x1a\xd4\x93\x2d\x0a\x5c\xf2\xf9\x7f\x3f\x33\x1d"
+ "\x34\x01\xaf\xa7\x8e\xe8\xc1\x7c\x55\xbd\x3b\x69\x1c\xba\x63\x83"
+ "\x68\x2b\xd6\xd5\x88\xe5\x9b\xa9\xed\xc4\x4f\xcc\x6f\x41\x3c\xd5"
+ "\x94\xc7\xcf\x02\x12\xed\x69\xa4\xf3\x22\x88\x1f\x04\x4f\xe7\x35"
+ "\x8a\x7d\xbf\x5f\x7d\x9f\xf3\x0d\xcb\x93\x3c\x18\xd6\x41\x38\x4a"
+ "\x3d\xcc\xc3\xd0\x1f\xed\xde\xe0\xc6\xb8\xe2\x17\x23\xfc\xe5\xf3"
+ "\x9a\x43\x2d\x1f\x2c\xd7\x8c\xe5\x5b\x19\xb6\x91\xfc\x09\xd6\x19"
+ "\x4b\x67\xc4\x61\x5a\x95\xaf\x02\x71\xac\x75\xf3\x79\x1a\xc4\x43"
+ "\x3e\xa5\x8a\xf0\x20\x3d\xad\x02\xd7\xcf\xd3\x7e\x53\xe2\x2f\x6b"
+ "\x19\x5f\x23\xc9\x9c\xdb\xf3\x06\xde\x26\xf4\x5d\x3f\xff\x7d\x9d"
+ "\xc8\x6b\x41\x98\x16\xd6\x97\x01\x74\xfe\x82\xe8\x4b\x78\xde\xbe"
+ "\xd2\xf3\x5c\xbe\xad\xc2\xaf\xfd\xfc\xcb\xd5\x1b\x59\xd7\x00\xdd"
+ "\x3f\x6f\x52\xce\xb0\x90\xe9\xde\x47\xf5\xb1\x75\x0b\x79\xbf\x4a"
+ "\x75\x50\x79\x19\xdf\x16\xc2\xa7\xf0\x6a\x3c\xd2\x21\xf8\xf5\x5a"
+ "\x0b\xa6\x37\x92\x2e\x72\xbe\xa1\x1f\xed\x29\x25\x5d\xfc\xf9\x1e"
+ "\x2c\xbf\x7f\x3b\x3d\xaf\xe3\xcf\x46\xee\x63\xfb\xf3\x5f\x73\x52"
+ "\xbe\x0d\xc7\xf9\x3b\x9e\x44\x5d\xf2\x01\x5c\x1f\x07\xa9\x4e\x0b"
+ "\x6f\xdb\x1e\xe7\xd3\xe9\x9a\x03\x1e\x00\xa2\x13\x79\xd4\xe2\xaa"
+ "\xf8\x45\x36\xf6\x35\xfc\x4c\x37\xf4\xd7\xfb\xd8\xee\x1c\x20\x9a"
+ "\xd1\x9f\xc9\xf4\xfd\xe2\x43\x59\xf6\xfb\xa8\x8d\xc4\xcf\xf1\xc2"
+ "\xf7\x61\xde\xeb\xcb\x88\xf6\x81\x76\xff\xa2\x41\xcd\x63\xde\x6e"
+ "\x94\x03\xc9\x8b\xe4\xa2\xc2\x49\xba\x5f\x85\xb8\xf6\x88\x67\xa1"
+ "\x1b\xc4\xeb\xaa\x2b\xd9\x21\x82\x1f\x80\x6d\xe2\xfb\xf1\x6f\xc2"
+ "\xba\x27\x98\xb0\x4f\x47\xbb\xa0\x73\x48\x10\xef\x1e\x3a\x8b\x13"
+ "\x71\xb4\x10\x4f\x91\x96\x14\xd2\x47\x7c\x3e\x24\x97\x4b\xc6\xfe"
+ "\x9c\xae\xb4\x01\xfb\x7f\xfd\x5a\x7f\xfd\x6a\x0a\xb4\x7f\x92\x77"
+ "\x95\xaf\x34\x03\xb8\x3e\x14\x81\xe1\xb4\xd4\xf4\x9e\xdc\x77\xc8"
+ "\xb2\x7e\x3d\xfa\x00\xda\x8b\x0a\xc7\xce\x00\x59\xb7\x70\x7d\x5c"
+ "\x37\x4b\x43\x6d\xc6\xb2\x2d\x32\x1e\xde\x66\xae\x4f\x16\xae\x03"
+ "\x87\xd8\x3a\x6c\x67\xbf\x1e\xfc\xc2\x21\xcb\xf9\x50\x00\x4f\x14"
+ "\xdf\x95\x46\xe7\xc5\x91\x4f\xc2\x18\xf7\x6e\x57\xdf\x80\x5f\x22"
+ "\xd9\xfb\xb8\xec\x9b\xaa\xeb\x45\x7f\x2b\xfb\xad\x26\x91\x7f\xa5"
+ "\x9f\x0e\x13\x2d\x87\xb9\xfe\x12\x2d\xa5\x0b\x89\x96\x16\x4e\x47"
+ "\xa9\x01\x4e\x4b\xaf\xa7\x53\xfd\x58\xb6\x5d\xb6\x57\x19\xd7\x2f"
+ "\xc8\xf6\xf7\x3f\x83\xbe\x8a\x68\xc2\xba\x53\xb9\xff\x9b\xc1\x79"
+ "\xf2\x9a\x4c\x7b\x9b\xdb\x42\x65\x1b\xab\xcf\x4b\xbc\x6c\x1b\xde"
+ "\x47\xb9\xc5\x99\x32\x91\x58\xbe\x89\xf6\xf1\x3f\x21\xfd\x92\xfc"
+ "\x85\x86\xde\x21\x9d\x90\xde\x3a\x45\xdf\x7b\xa2\x4f\xd1\x22\x3e"
+ "\x1d\xe9\xa8\xa2\x17\xdd\xd2\x5b\x9f\xd2\x78\x01\x79\xbd\x07\x63"
+ "\xa4\x26\xe2\x37\xe9\x32\xc6\x48\x13\x5d\x15\x6f\x44\x29\x7a\x8b"
+ "\xf5\xd4\x10\xef\x85\x7c\xde\x78\x00\xf5\xb8\x65\x40\xb7\xde\x78"
+ "\x40\xe6\x63\x13\xf2\x51\x87\xf5\xfd\x5e\x6e\x57\x13\xc2\x63\x2c"
+ "\xf6\xd6\x6f\x64\xda\xe5\x73\x03\xdf\x58\xa1\xc8\x41\xb6\xd5\x43"
+ "\xdb\xc9\xff\x72\x19\xbc\xa9\x95\xcb\x36\x8a\xba\xde\x0c\x57\x60"
+ "\x29\x46\x14\x67\x45\xbd\x19\x4e\x7e\x70\x02\xca\x9e\xfb\x3e\x7e"
+ "\x4e\xad\x48\x23\xdb\x11\x75\xbc\xf5\x16\xd7\x43\x8c\x7b\x06\xf4"
+ "\xe8\x8d\x63\x01\xfe\x89\x7c\x71\xd5\x11\xc4\x41\xfe\x94\x74\x89"
+ "\x7c\x2a\x8d\x57\x90\xc6\x7d\xb2\xfd\xc8\x34\xbf\x39\xd3\x5f\x57"
+ "\xde\x7a\x19\x75\x25\x65\x00\xf7\x9b\x93\x82\xf5\x73\xf5\xc2\x07"
+ "\xd6\xc8\x6d\xdb\x2a\xb7\x6d\x8f\xdc\xb6\xad\x72\xdb\x9a\xb0\x0e"
+ "\xe2\xdb\x6c\x15\x1f\x91\x6f\x7b\xde\x93\xe1\x5b\xc8\x97\x0f\xd8"
+ "\xeb\x9b\x67\x15\x5b\x1e\xec\x2f\xf6\xbc\x4e\xf6\xa0\xa2\xab\x3d"
+ "\xc0\x5f\xb4\x04\xf7\x17\x6f\x36\xc8\xed\x6d\x08\xb0\x8d\x46\x39"
+ "\xde\x7d\x5f\x91\xc3\x11\x1c\x8f\x89\x73\x91\x5e\x7d\x9f\xfc\x27"
+ "\xd5\xad\xee\x83\xea\x04\x5f\x65\x5b\xde\xf3\x6f\x83\xe5\xb0\x27"
+ "\x4f\x6d\xcf\x24\x6b\xf2\x09\x84\x83\x64\xca\xe3\x4a\x4c\x13\x72"
+ "\xdd\x93\x46\xbe\x41\xed\xa3\x11\x76\xa7\x8f\x91\xbd\xec\x29\xf0"
+ "\xb7\xc5\x37\x8f\xca\xb6\x28\xd7\xfd\xd6\x9d\x28\xa3\x54\x55\xbd"
+ "\xc7\x02\xea\x25\xd9\xb4\x12\x1f\x64\x99\xde\xa0\xf4\x69\x04\x8f"
+ "\x65\xcd\xae\x8a\xb7\xf4\x01\xfd\x63\x15\xd1\x87\x75\x95\x73\x9f"
+ "\xf5\x12\xf7\x15\x66\x17\xa7\xe7\xad\xb8\x7a\xb9\x9f\xc0\xb4\x54"
+ "\x91\xb6\xc7\x2e\xf7\x25\x8a\xde\x3c\xeb\x4f\xd3\x5b\xa6\xe0\xf1"
+ "\xd1\x9b\xe5\x4a\x7c\xc4\x71\x71\x5f\xf4\x56\xb1\xdc\x3e\x4a\x4b"
+ "\x11\x69\x6f\xa6\x51\xda\x76\xc1\x87\x9d\x8c\xf7\x57\x6f\xd8\xe5"
+ "\xfe\x8a\xec\x4b\xc2\xe7\x2c\xb2\x31\x7a\x46\x1c\x6d\x84\xdf\x56"
+ "\xd6\x4b\x63\x88\x6a\xbb\xf4\x7a\x37\xf9\x03\xf2\x17\xb4\x2e\x95"
+ "\xff\xce\xe1\xbf\x57\x90\xdf\xa1\x38\x84\xf2\x11\xee\x18\xf9\x22"
+ "\x4c\x1f\x67\xb8\x0f\xe3\x82\xbf\xe8\x10\xef\x2f\xa3\xe4\xb2\x93"
+ "\x79\xac\xf0\x97\x8c\x30\x25\x4d\x29\x87\x7e\xeb\x14\x95\xa3\xf2"
+ "\x8a\xff\x22\xdf\xe5\x21\xdf\x24\xea\xdb\x2c\xeb\x38\x1f\x37\x28"
+ "\x71\x51\x9f\xa4\x82\xa5\xf3\x64\x84\x4f\x3b\x24\xfc\xd9\x2f\xdf"
+ "\xa7\xb2\x5c\x7e\xe8\x2b\x37\x9d\x67\x9f\xd7\x17\x81\xb6\xee\x2b"
+ "\xf2\x8b\xaf\xee\x17\x74\xee\x8d\x97\xdb\xf1\x39\x6f\x87\xf0\xa9"
+ "\x55\x82\x96\x57\xf7\xd7\xf5\xf2\x3c\x2f\xb5\x85\xf2\x76\xa8\xf2"
+ "\x58\x5f\x12\xe6\xed\xe5\xe7\x7c\x05\x96\xf3\xf5\x15\x0c\x82\xaf"
+ "\x17\xe7\x01\xeb\xea\x5e\x52\x7c\xef\xde\x6a\x41\xe7\xde\x07\x15"
+ "\xbf\x8b\x7c\xef\x24\xdf\xcb\xf3\x96\xca\x30\x73\xe4\x5f\xee\xdf"
+ "\xf7\x3e\x2b\xf8\x1a\x2f\xc9\xfc\xee\x96\xdb\xf1\x32\x1f\x67\xff"
+ "\x25\x07\x79\xbb\xb7\x44\xe1\xad\xfa\x9e\xec\x07\xeb\xd7\xd3\x33"
+ "\xd7\xfb\x12\x3e\x86\xad\x21\x18\xa2\x49\xf4\x11\xbf\x2c\x0e\x8c"
+ "\xa9\x71\xac\x37\x82\xfa\x25\x11\xab\xbe\xfd\xa5\x3c\xff\x03\xd6"
+ "\xa2\x9f\x61\xbf\xd0\x9c\xa6\xf8\x18\xe6\xca\xc0\x31\xff\x71\x84"
+ "\x69\x9e\x4c\x69\x74\x46\x88\x1a\x86\xfc\xd3\xde\x5e\xbb\x8c\xb3"
+ "\x39\x5e\xf1\x1b\xe4\x4b\x8e\x38\x8f\xcb\x31\x5d\x73\x5b\x9d\xec"
+ "\x4b\x4e\x4b\xcd\xbf\xf3\x8f\xc3\x9a\x7f\xe7\xef\x33\xde\xfe\x34"
+ "\xd0\x67\x60\xdc\xbc\xc5\x55\xd1\x5c\xe3\x17\x07\x60\xda\x85\x7d"
+ "\x47\xb3\x89\x6c\x94\xce\x88\xe3\xfe\x89\xcf\x69\xbd\x7d\xab\x42"
+ "\x33\xf9\xcd\x9e\xa7\x95\xf9\x8b\xb7\x0f\x53\xac\xe6\x5f\xdf\xdb"
+ "\x51\x7e\xbe\x93\xea\x53\xf0\x61\x2f\x45\x76\x64\x2d\xa2\xf9\x96"
+ "\xe6\x63\xb2\x9f\x6f\xf0\xf3\x95\x72\x1f\x46\x7e\xd2\xbf\xaf\x7a"
+ "\xf5\x7d\xff\xbe\xea\xed\xf7\x06\xfb\xc8\xb7\xcb\x2f\xbe\xaf\x7a"
+ "\x3b\x97\xfc\x96\xe2\x23\xfd\x7d\xc1\xdb\x95\x75\x7e\xb1\xec\xdb"
+ "\x71\x4a\x2c\x3b\xe0\x47\x9b\x69\xcc\xb4\x1f\xeb\x6f\x11\x75\xbf"
+ "\x83\xfa\xda\xa0\x53\xea\xc6\xfc\xb4\x23\x06\xd4\xcd\x8a\x57\x4d"
+ "\xa8\x53\x5d\x72\x0c\xc8\x6d\xb3\x97\x9f\x47\xb4\x37\x15\xf5\x2f"
+ "\x92\xf4\xcc\xba\xf2\x2b\xe8\x1c\xe8\x2b\x5a\x7b\x56\x29\xfc\x7d"
+ "\xe7\xdf\xd4\x71\x61\xed\x4b\xac\x1c\xeb\x29\x54\xb7\x71\x1b\xa6"
+ "\xed\x90\xe7\x10\x38\x6f\x39\xae\x77\x8c\xf5\x2f\xf9\xb7\x4d\xb4"
+ "\xe3\x9d\x62\x6a\x07\x8d\x89\xb0\xfe\x89\x14\xf7\x60\xcc\x87\xf7"
+ "\xaf\xb7\xd4\xf7\xeb\x7c\x63\xd4\x79\x8b\x3a\xbe\xfa\x59\x1c\xf9"
+ "\x4a\x79\xec\xd9\x86\xf1\x4e\x95\x7a\x2e\x66\xf6\xb4\x2c\x83\xa9"
+ "\x68\xd9\xca\xe2\xa5\xb7\x19\x96\xad\x5c\x56\xbc\x6c\x49\xe1\xb2"
+ "\x0d\x4b\x8a\x97\xad\x5a\x99\xbc\x62\xc9\x13\xcb\x1e\x37\xac\x5b"
+ "\xb2\xda\x90\x6a\xbe\xc1\x1c\x09\x03\xa0\x77\x19\x96\xac\x5e\xbd"
+ "\x66\x45\x7e\x9e\x61\xe5\xb2\xc7\x53\x8a\xf2\x57\xe7\x17\x1b\x96"
+ "\x14\xad\x5a\xb3\x32\xcf\x70\x43\xde\xf8\x1b\x52\xef\xc8\x8b\x54"
+ "\xcf\xa1\x8d\xd5\x43\xb7\xef\xdc\xff\x75\xed\x38\x07\xba\x58\x8d"
+ "\xa9\x28\xd6\xbc\x6c\xa5\x98\xb3\xfb\xd5\xa7\x13\x76\x82\x89\xce"
+ "\x88\xa7\xf3\x8e\x59\xc5\x3b\x0e\xfc\xd5\x12\x1c\xb6\xd3\x40\x67"
+ "\xc4\x23\xed\x09\xae\x8a\x5f\x35\xd8\xa5\x77\xcb\xf9\x59\xc6\x98"
+ "\x8e\x6d\x4b\x60\xe7\x7e\xd7\x85\x31\x9b\x89\xde\x97\xd7\x9f\x83"
+ "\xb8\xaa\xb5\xa0\xc5\x2b\x0a\x2f\x3d\x9d\x21\x8f\x65\x8e\xda\xa5"
+ "\x7d\x0e\x71\xe6\xcb\xbe\x62\x47\xc4\x1f\x72\x58\xf9\x1f\x72\x84"
+ "\x5c\xf6\x3d\xa5\xcc\x33\x67\x3e\x0b\x99\xa4\x9f\xc7\xa5\x7d\xfc"
+ "\xbd\xd7\x33\xa8\xcb\x34\x5f\xdb\xf3\x9f\x53\x8d\x18\x0f\x1e\xa3"
+ "\xf9\x56\xcc\x7b\xca\x29\x41\x14\xd2\xa5\x3d\x50\x92\x0a\x2f\x62"
+ "\x5d\xab\xe3\x19\x73\x55\xec\x9b\xa4\xcc\xa7\x61\x1b\xf4\xd8\x96"
+ "\x0e\xd1\x8e\x5f\x5d\xc3\xdb\xf1\x12\x4b\xdc\x39\x12\xe9\xfb\x09"
+ "\xd1\xb3\x2f\x4f\x69\x03\xd2\xdd\x61\x97\x7e\xd5\x86\x74\xea\x89"
+ "\xae\x60\x73\x7d\x34\xdf\x85\x74\xbe\xe5\x5b\x8b\x7c\x1b\x2d\xce"
+ "\xb8\xdb\x51\x27\xec\x0f\xdb\xd3\x59\x8f\xf7\xdb\xbf\x82\xa8\x6d"
+ "\x74\x3e\xb9\xe5\x3a\x76\xd8\xe9\x01\x5b\x41\x07\xc4\xae\x67\x0e"
+ "\xf6\xef\xff\xd7\x25\xb7\xa9\x83\x7c\xc3\xaf\x96\x77\x68\xa9\x4d"
+ "\xd8\x57\x44\xd5\x7f\x15\x72\x6e\x51\xfb\xe2\x95\xcc\xc9\x76\xa9"
+ "\x63\xae\x5f\xf3\x73\x80\x28\xde\xea\xb1\xd0\x99\xd6\xbf\x4e\xc2"
+ "\xba\xcb\xe4\xd8\xd8\xc9\xfa\x16\xaa\x62\xa9\x5f\x93\x9e\x39\x43"
+ "\xe0\xd6\x29\xb8\xe9\xdc\x73\x2a\x23\xe4\xff\xeb\xb7\xb0\x8c\x43"
+ "\x85\xbf\x3c\x10\x3f\xe1\xc4\x7b\x87\x52\x8f\x18\x87\xff\x9a\x62"
+ "\x02\x07\xea\xb2\x23\x44\x7d\x89\x3f\x79\x89\x1d\xb5\x61\xfa\x8e"
+ "\xf3\xa0\x45\xd8\xa3\xf5\x2f\x71\xfc\x5d\xc8\xf7\x59\x84\xff\x99"
+ "\x2b\x01\xb6\x20\x4c\x4f\xc5\xbe\x32\x27\x3f\x83\xfc\xdf\xa9\x5f"
+ "\x33\x07\xce\x63\xcb\xfa\x7c\x57\x80\x3e\x1b\x7f\x42\x31\xe1\x4e"
+ "\xc4\x8f\x3a\xb4\xe3\x2c\xf6\xc3\xf8\x3c\x7e\x27\x24\x51\x3d\x78"
+ "\xdf\x4e\xf3\x21\x88\x33\x47\xa9\x8f\xa1\xfe\x6f\xf7\x89\x39\x18"
+ "\x59\xb7\x92\x69\xee\xba\xd4\xcc\xd8\x01\xf4\xef\x44\x23\xe9\x18"
+ "\x96\xa9\x54\x74\x0a\x75\xfd\x28\xd7\xab\x38\x48\x62\x15\xff\xae"
+ "\xaf\x1f\x89\x70\xa8\x57\x75\xa8\x4f\xa4\x57\x08\xdb\xa2\xe8\x14"
+ "\xea\x5a\x3b\xc1\x21\x0d\x91\xcd\x1b\x8c\x5a\xf2\x91\x9d\xd2\xbb"
+ "\x29\xa4\x63\xec\xa7\xf7\x77\xb0\xab\x16\x74\x08\x39\xbd\x9b\x62"
+ "\x73\x0b\x19\x0c\xf0\xfd\x5d\x50\xf1\xbd\x1d\xf5\x38\x92\xf8\x2c"
+ "\xe6\xaa\xdf\x4d\x41\xda\xda\x79\x2c\xbe\x11\x65\xc0\xfb\xaa\x7f"
+ "\xef\xa6\xf2\x32\x0f\x0f\x0d\xf0\xf0\xdd\x8c\x60\x3c\x0c\xe0\x9d"
+ "\x56\x9c\x73\xfe\x6e\x36\xd9\x0a\x96\x29\x51\xce\x2e\x0f\x26\x4b"
+ "\xac\x43\xab\xdd\x09\x3a\xaa\xa3\x35\x8e\xc3\xef\x51\xea\xd8\x81"
+ "\xbc\x76\x94\x16\x5c\x50\x9f\x5b\x1b\x00\x68\x4e\x9c\xca\x27\xc6"
+ "\x11\x7f\xdf\xed\x1e\x28\xcf\x9c\x81\xe5\x6f\x78\xdc\x8f\x56\x7e"
+ "\xb1\x8a\x16\x78\x71\x24\xea\x11\xa7\xb7\x25\xf9\x42\xf4\x26\x1a"
+ "\x44\x3f\x69\x1d\x4b\xfa\xdd\x92\x6f\xab\x06\xa0\x34\xf9\x39\xbb"
+ "\x07\xfb\x9e\xc0\xf9\xfd\xd0\xef\x1b\x5a\x5e\xf3\x7f\xdf\xd0\xb2"
+ "\x33\xd4\xfb\x86\x80\x7a\x3f\xa7\x7a\x7d\xf5\xd9\x1a\x55\xdd\x87"
+ "\x7c\x41\xea\x56\xca\x8f\x6f\x50\x8f\x67\xde\xbb\x95\x68\x38\x82"
+ "\xfd\x14\xbb\x26\x5b\xc3\x10\x4f\x2b\xef\xc3\xdf\x4b\x15\xf1\x0b"
+ "\xc5\x45\xef\xe9\x09\x26\xb0\x1d\xfd\x7f\xba\x38\x1a\xff\xc2\x79"
+ "\xfe\x10\x3e\x03\xf4\xf4\x6b\x28\x50\xb2\x25\x3f\x60\x60\x41\x1e"
+ "\xa2\x00\xc6\x70\x78\x86\x7f\x22\x49\x7e\x76\xf0\x07\x6d\x3f\x7c"
+ "\x7f\xfe\xb7\xf8\x8b\x10\xf4\x72\x7c\x6e\xd0\xc8\xf5\x95\xab\x20"
+ "\xd2\x2f\x50\x9a\x81\x52\x24\xd8\x1f\xf5\x36\x65\xd9\x38\xa6\x1f"
+ "\xd3\xc4\x81\x19\xf3\xc8\xf8\x95\x67\xa6\x7e\xa6\x14\xff\x67\xfc"
+ "\x0b\x5b\xa8\xaa\xe0\xba\xb0\x3c\xbe\xf4\x29\xd1\xde\x9f\x24\x35"
+ "\xe8\xd5\x55\xea\xa1\x2c\x9c\xdf\xc4\xd2\x3f\x6e\xc4\x97\x84\xf9"
+ "\x63\xda\xfa\x01\x2e\x77\x6e\x56\x81\x7f\x2c\xc8\xbf\x3e\xfe\x02"
+ "\x6d\x1c\xea\xdf\x68\xd5\xfd\x75\xe2\x67\x6c\xc7\x25\xc4\x7f\xe1"
+ "\x3f\x43\x7b\x84\x72\x3b\xa0\x1e\xd7\xe7\x06\x03\x1d\xe0\xff\xf5"
+ "\x56\x25\x49\xad\xa1\x03\xf9\x37\xa5\xf9\x3f\x27\xb9\xfd\x9f\x6f"
+ "\xc9\xf8\xf6\x84\xa3\x0d\xd2\x3f\xa5\xf6\x11\x00\x37\xc7\xf5\x27"
+ "\xc6\x06\x98\x4c\x6c\x55\x80\x09\x0d\xfc\xc9\xd4\x84\x21\x3d\x35"
+ "\xaa\x64\x6d\x70\xe8\xbf\xce\xdf\xd5\x9b\x65\x83\xb8\xce\xa1\x1f"
+ "\x94\x39\x25\x20\x8d\x9e\x87\x19\xe4\xb4\x5b\x7f\x33\x08\x9e\xa7"
+ "\x19\x54\xcf\x1a\x23\xfe\xd3\x00\x70\x43\xe1\xa5\xa0\xf5\xfb\xbf"
+ "\x7f\xc1\x3f\x0d\xd9\xc7\xf7\x7f\x7f\xa5\x3f\x26\x7a\x71\xf4\x44"
+ "\xfc\x87\xfe\x63\xfd\x8e\x92\xc9\x19\x4c\x4e\x60\xf2\xcd\x25\xe9"
+ "\xc7\xbf\xff\xfb\xfe\xef\xfb\xbf\xef\xff\xbe\xff\xfb\xfe\xef\xfb"
+ "\xbf\x7f\x82\x3f\x0d\x1f\x47\x30\xf9\xaf\xff\xbe\x3f\x9f\x86\x41"
+ "\x05\x35\x4c\xd2\x00\x53\x65\x94\xdd\x0e\x1a\x1d\x0c\xd3\x5e\xba"
+ "\x28\xcf\xd0\x4f\xd0\x45\x16\xa0\x6f\x7e\xe8\xbd\xcb\x0f\xf0\xba"
+ "\x46\x95\x3e\xf6\x52\x51\xf4\xad\xff\x34\xc8\xbc\x30\x1c\x17\x86"
+ "\xc3\x30\x18\x0e\x3a\x88\x80\x48\xb8\x0c\xa2\x20\x1a\x62\x70\xbc"
+ "\xa9\x87\x11\x30\x12\x2e\x87\x38\xb8\x02\xae\x84\xab\x20\x1e\x46"
+ "\xc1\xd5\xd8\x92\x04\xb8\x16\xc7\xf6\xd7\x21\x43\xc6\x04\x6f\x4b"
+ "\x19\x18\xe3\xf1\x1f\xfc\x3f\x0b\x8c\xfc\x39\xf7\xfb\xf4\xef\x34"
+ "\xdd\x2a\xa7\xb7\xcb\xe9\xf6\xef\xd3\xbf\xd3\x74\xc3\xdf\xf8\x77"
+ "\xcc\xdf\xf4\x57\x83\x2e\x5b\x78\x6d\x4d\x50\x5f\x19\x98\xaa\x91"
+ "\xff\xfa\x9f\xe1\x6b\xca\x0f\xc2\xe7\x5f\x3e\xf0\xcf\x88\xd7\x44"
+ "\x71\x5b\x0a\x20\xe6\x79\x99\xfa\xcf\x13\xaa\xa4\xf2\xb7\xb9\x13"
+ "\x2f\x07\x5e\x08\xb9\x19\x7b\x18\xcb\x65\x78\x5d\xa1\xe0\x11\x30"
+ "\x74\x04\xde\x69\xcc\xff\xac\x11\xc0\x7e\x0c\x2f\xac\xf6\x73\x33"
+ "\xc0\xf1\x28\x80\x2f\x66\x01\xfc\xef\x1e\x80\x13\xdd\x03\x38\x7b"
+ "\xca\x06\xa8\xfb\xd2\x24\xee\x0d\x78\x9d\x23\x44\x60\xd7\xf4\x4f"
+ "\xef\x59\xa7\x67\x67\x18\x6e\x1d\x3f\x71\xfc\xed\x3f\x58\x62\x48"
+ "\xc9\x4a\x31\xdc\x96\x7a\xeb\xad\x13\x52\xef\x98\x70\xeb\x0f\x0d"
+ "\xb7\xdd\x76\xd7\xad\xa9\x77\xa5\xa6\x1a\x56\xac\x2f\x5a\x76\x6b"
+ "\xea\x13\xf9\x86\xa5\xcb\x8a\x56\xac\x5b\x52\x94\xff\x75\x4d\xfa"
+ "\x26\x7f\x44\xde\xb5\x3e\xe0\x12\xf0\xe7\xf6\x14\x90\x7e\x53\x06"
+ "\xd2\x1f\x72\x61\x90\x78\x34\x55\xf2\x5c\x6a\x92\x7c\x05\x64\xaf"
+ "\xb4\x82\xe6\xc9\x26\xd0\x2c\xb5\x83\x26\xb7\x06\x34\x39\xc7\x40"
+ "\xb3\x3d\x0b\x34\xcf\x1b\x40\xf3\x9c\x11\x34\xa5\x9d\xa0\x31\x47"
+ "\x0d\x4e\xfb\x69\xb3\x48\xdb\x87\x65\xf7\xe2\xf5\x7a\x2a\x68\x5e"
+ "\x4d\x10\x69\x56\x3d\x68\xfe\xe3\x6b\xa5\xfa\x1d\xff\x5d\x6c\xdc"
+ "\x30\xe8\xcf\xce\x75\x8b\x66\xac\x62\xd3\x83\x4c\x8e\x7e\xff\xf7"
+ "\xfd\xdf\xf7\x7f\xdf\xff\x7d\xff\xf7\xfd\xdf\xf7\x7f\x7f\xe7\x7f"
+ "\x0e\x0d\x4c\xfc\x4a\xd2\xc2\x6f\x31\x2a\x72\x59\x74\x09\x76\xcd"
+ "\x9d\x13\x69\x2d\x09\xd0\x37\x53\xa0\xe3\xfb\x9e\x88\x4b\x8b\x3f"
+ "\xe1\xd8\xf1\x0f\xc3\x6b\xb8\x4e\xbd\x26\x85\xd6\x1c\x1d\x88\x4f"
+ "\x85\xb0\x78\x10\xeb\xa3\x2c\xac\x5d\x7c\x73\x7c\x1b\x74\x83\x8e"
+ "\xef\x19\x40\xdf\x89\x22\x7e\xb3\x1d\xde\x68\x50\xd6\x53\x29\x70"
+ "\xb4\x9e\x8a\xd6\x5f\x21\x2c\xff\x26\x21\xc4\xfa\x19\x3d\xfb\x69"
+ "\xbc\x34\xad\x16\x80\xbe\x37\x7d\xf1\x25\xe6\x68\x2d\x01\x38\xd0"
+ "\x28\xbe\x3b\xa5\xb5\x35\x88\xbf\xc3\x0e\xe5\x8d\x62\x3d\x15\x73"
+ "\x3e\x83\xe9\x98\xd6\x6d\x87\xad\xca\xf7\x13\xdd\x4a\xba\x6d\xcb"
+ "\x39\x68\x35\xf0\xef\x6a\x1c\xad\x06\x2f\xa4\x8f\xa1\xf6\x47\xc4"
+ "\x23\x6c\xc8\xb5\x34\xca\xba\x31\xaa\x5b\x86\xcf\x08\xa8\x0f\xdb"
+ "\x18\xb1\x50\xa9\x2f\x04\x8e\x28\x2a\xab\xe0\x41\xda\xbb\xb1\x4c"
+ "\x95\x82\x07\xe9\x51\x68\x74\xa4\x6f\xe4\x75\xec\x09\x46\x93\xe1"
+ "\xc3\xb4\xf0\xfc\x3b\x26\x74\xa6\x1d\x5d\x9a\x68\xb8\xe2\xd6\xe9"
+ "\xf9\x89\x37\xb1\xd4\xd8\xe4\xe7\x53\x2f\x33\x46\x18\x63\x26\xcc"
+ "\x4d\x95\xf4\xd2\x58\x29\x75\xa4\x5e\xba\xf1\x31\xfa\xb7\x7d\x74"
+ "\x12\xff\x35\x68\xd3\xb6\xe4\xdd\x61\x18\x3e\xe5\xc7\xcf\xad\x35"
+ "\xbe\xfb\x8b\x19\xc6\x7b\xe7\xaf\x1e\xf7\xdb\x54\xe9\xf2\x3f\x3c"
+ "\xff\x7e\xd2\x57\x04\x31\x66\x2c\xfd\xbb\xf0\x40\x58\xdc\x38\x0b"
+ "\x61\x69\x1f\x65\xf8\x2d\xa5\xdc\xac\x4d\x2b\xce\xbb\x7d\x42\x23"
+ "\xd5\xf8\xe0\xe3\x29\x16\x2a\x33\x63\xb6\x28\x23\x20\x26\xec\x53"
+ "\xe7\x8d\x7f\x87\x4a\x1b\x38\x0d\xa0\x15\xb8\xfa\x71\x5f\x25\x28"
+ "\x14\xa9\x63\x0f\xa7\x5e\x2b\xd7\xfd\x33\xfa\xf7\x91\xdd\xe3\x25"
+ "\xc4\x30\x32\x65\x2a\xe5\x4e\x70\xa5\xba\x0c\xad\x69\xda\x27\x12"
+ "\x93\x86\xdf\xfa\x0b\xbc\x4b\x7c\x22\x51\x2f\xe1\xfd\x8f\xc5\x3d"
+ "\xf1\x20\xef\x87\x02\x42\x2f\xdd\x10\x97\x96\x97\x77\xc7\x67\xce"
+ "\xbc\x3b\xf4\x92\xb1\x31\x2f\xcd\x78\x65\x65\xe1\x2d\x89\x69\x89"
+ "\x79\xb7\xeb\x25\xfe\x7b\x97\xf1\x86\x8a\x47\xf4\xd2\x4d\xbf\x49"
+ "\x1d\xa1\xd7\xfc\x57\x83\x06\x3e\x94\xe6\xed\xf9\x30\xec\x93\x4f"
+ "\x3e\x82\x9b\x57\x7c\xa4\xb9\x79\xd6\x47\x92\x66\xc4\x47\x51\x0f"
+ "\xc3\x7f\xe9\x87\xc3\x7f\xc5\xe3\x65\xb8\x17\xda\x34\xa5\x59\x6d"
+ "\xd2\xba\xdc\xb6\xb0\xd2\x23\x6d\xda\x87\xa0\x2d\x7c\xf1\x88\xb6"
+ "\x61\xf7\x3e\xd0\x36\xfc\xa1\xcf\xdb\x74\x37\x41\x5b\x04\x40\xdb"
+ "\x18\x90\xda\xc6\x42\x5c\xdb\x6d\x23\x9e\x6b\xbb\x77\xb4\x64\xbd"
+ "\xbc\xe7\x1e\xeb\xd5\xda\x19\xd6\x44\x3d\x58\x6f\x88\x04\xeb\x8d"
+ "\x51\x51\xd6\x9b\xf0\x1a\x07\x0d\xd6\x54\x7c\x4e\x83\x04\x6b\xf8"
+ "\x86\x61\x00\x82\x96\x8f\x0c\x00\x1f\x8d\x81\x29\x1f\x8d\xc5\xdf"
+ "\xeb\xf1\x4a\xc4\xeb\x06\xbc\x6e\xc2\x0b\xc7\x29\x1f\xd1\xfe\x3e"
+ "\x90\x34\x2c\xed\xdf\x7f\xb3\x64\xc9\xc4\x25\xb7\x67\x4f\x0b\x0b"
+ "\xcb\x4f\x84\xcb\x90\x6b\xda\xb4\xc4\x31\xe1\x93\xc2\xf3\x13\x3f"
+ "\x73\x1a\xf1\x5f\xbd\xf4\xe8\x7f\x87\x0d\x9b\xe0\x9a\xe4\xca\x7d"
+ "\xf7\x33\x2f\x44\x22\xff\x21\x50\x87\x7b\x2c\xa0\x71\x22\x8d\x4e"
+ "\x4b\xcf\x3d\x2e\x4b\x94\xde\x0e\x11\x05\x8a\x1e\x8b\xbc\xdf\xea"
+ "\x9d\x96\x32\xd4\xbf\xa8\xe4\xe0\x79\x9b\x29\x2f\xe3\x02\xe5\xf2"
+ "\x82\xe7\x91\x4e\x47\x95\x29\x79\x3d\xd2\x81\x2c\x7c\x46\xfd\xd7"
+ "\x4d\xf2\x87\xb5\x86\x39\x2d\x9a\xcd\x98\xb7\x67\x30\x1e\x2b\xe2"
+ "\x49\xaf\xc0\xbc\xb6\x20\x79\xf7\x39\x2d\x73\xa9\x8e\xce\x80\x3a"
+ "\x9c\x4a\x1d\xf4\x3d\x77\x1d\xda\x17\xf9\x1d\x9f\x25\xa2\x85\xca"
+ "\xda\xdc\x0e\x68\xf4\x75\x69\xb4\xe6\x43\x40\x78\x5c\x96\xe8\x44"
+ "\xa5\x3c\xc1\xd1\x7e\x04\xf4\x1d\x1e\x5f\xef\x09\xd1\x0f\xd2\x7a"
+ "\xcf\xed\x88\xc3\xb0\x56\x73\xd5\x71\x88\xf2\x52\x19\x3b\x44\x17"
+ "\x38\xa5\x83\x58\x77\x74\xae\xe2\xe7\x30\x8d\xaf\xcf\xa7\x3a\xb0"
+ "\xed\x65\x98\x57\x32\x98\xe6\x83\x23\x05\x5f\xa2\xab\x95\xbc\x0b"
+ "\xad\x21\x14\x65\x18\x73\x5a\x0e\xfa\xb0\xcc\xa1\xc1\xf8\x58\x99"
+ "\xd3\x22\x3d\x87\x79\x5d\x41\xf2\x36\x8b\xba\x62\xb4\x41\xf2\x2c"
+ "\x98\x27\x61\x9e\x21\x44\x5e\x18\xe6\xa5\x05\xcb\x6b\xad\xe1\x38"
+ "\x73\xfa\x79\x1e\x13\x6d\xc4\xe7\x02\x85\xe7\x5f\xdf\x1e\x92\xf7"
+ "\xad\xc8\xf7\x98\x9a\x40\xfc\x84\xdb\x29\x1d\x26\x7c\x2d\x83\xeb"
+ "\x3e\xa4\x71\x5a\x32\x50\x17\x62\x8e\x0e\xce\xfb\xf8\x1a\xe4\x03"
+ "\xd1\xe5\x08\x92\x97\x80\xed\x41\x7f\x1d\x1b\x15\x04\xe7\x30\xcc"
+ "\xb3\x63\x5e\xd2\xd7\xc8\x43\xcf\x7d\x38\xed\x77\x30\x1a\xc2\x4f"
+ "\xc0\xc8\xc9\xd4\x1e\xa1\x17\x30\xec\x04\x8c\x38\xdc\x23\xd6\xbe"
+ "\x3b\x0c\x1b\x20\x0c\x9f\x5f\x65\x16\xeb\x15\x98\xdf\x8d\xfa\xa4"
+ "\xb3\x9d\xf3\xc0\x09\x88\xad\x44\x98\x30\xfa\x56\x95\xfa\x27\x4c"
+ "\x0f\xb3\xb9\x3d\xf4\xbd\x06\xea\x59\xec\xdb\xf8\x2b\x61\x39\xfe"
+ "\xfd\xc9\xbc\x1a\x48\x24\x1a\xf9\x7a\x55\x8b\x55\x43\xeb\x3f\xa9"
+ "\x3f\x74\x4a\x70\x93\x93\xeb\x6c\x2c\xf6\x7f\xba\x06\x79\xad\x2e"
+ "\xd1\xa0\xc5\xb2\x1b\x25\x3d\x5f\xfb\xed\x40\x5c\x44\xc3\x03\x3e"
+ "\x8b\x55\xea\xc7\x23\x59\x2f\xa3\x75\xbc\x3d\x16\x69\xa6\x53\x8a"
+ "\x65\x02\x8f\xde\xa0\xe0\x21\x38\xac\x8b\xaf\x87\xef\xb1\x68\x7f"
+ "\xa2\x82\x49\x57\xd7\x35\xc1\x09\x61\x44\xf3\x71\xd0\xd7\x50\x7d"
+ "\x72\x1b\xf9\xda\x5a\xdb\x5a\x0f\xd8\x30\xbe\x38\x01\x7a\x33\xb6"
+ "\xd5\x70\xc0\x4d\xdf\x34\x5b\x47\xd4\x6f\x02\xe0\x76\x21\x81\x41"
+ "\xc6\x59\xad\xe0\x24\x1c\xaa\xb6\x8e\x14\xf5\x53\x5b\x75\x20\xc3"
+ "\xb6\xaa\x69\x24\xbc\xd8\xae\xab\xea\x10\xae\x15\xa3\x16\x19\xa6"
+ "\x4b\x81\x51\xc9\x60\x8c\x4c\x1f\xf1\x87\x64\xb6\x50\xb1\x4f\x97"
+ "\x65\x04\xf6\xff\x97\x75\x09\xbb\x1d\x48\x97\x69\x88\x17\x34\x68"
+ "\x90\x06\x8d\x55\xe0\x1f\x91\xa1\xe0\xb7\x83\xde\xad\xa6\xb9\x8e"
+ "\xc3\xea\x23\x84\x9d\x72\xd8\xe2\x01\xd8\x58\x3f\x58\xe4\x85\x24"
+ "\x64\x00\x92\x1d\x46\xe4\x21\x3f\xc2\x10\xa6\x19\xe5\x6d\x50\x60"
+ "\xe4\xf6\xc7\x63\xde\x14\x19\x5f\xab\x0a\x5f\x31\xe1\xa3\xf5\xaf"
+ "\xc2\xf7\x8e\xb0\x0f\xf8\x3e\x68\xc3\x67\xc7\x60\xff\x4a\xf6\x3a"
+ "\x52\x87\x70\x89\x94\x6e\x1a\x0b\xfa\x93\x30\xe2\x8b\x1e\x29\xac"
+ "\x4b\xf0\x62\x24\xfa\xbf\xe8\xfe\xd8\x06\x9f\x27\xda\xc1\xe0\x96"
+ "\xeb\xcb\x23\xde\x0c\xf8\x5b\xaa\x73\x64\xb6\x52\xa7\x92\xaf\xb6"
+ "\x19\x63\xc4\x04\x8c\x4f\x8c\x6f\x18\x13\x8c\xa3\x95\xd8\x65\x72"
+ "\xeb\xd2\xc4\x09\xce\xc9\xad\x86\xdb\x53\x5f\xcb\x4f\x4c\xe6\x7d"
+ "\xff\x4d\xc7\x53\xc7\x62\xef\xfe\x07\xfe\xef\x4f\x28\x25\x91\xa7"
+ "\x60\x3a\xdd\x8f\xa5\x7b\x39\x5e\xc0\xbb\x07\xe7\x85\x0d\xbf\xa1"
+ "\x88\xee\x44\xe4\x60\xbc\x72\xd1\xe3\x61\xe9\xf2\x7d\x8c\xc8\xb9"
+ "\x85\xc7\x1c\x49\x53\xe9\xfe\x46\x8e\x6b\x42\x23\xd5\x3c\xfe\xf9"
+ "\xd4\x1f\xcd\xff\x55\xd8\x47\xcf\x3d\x69\x8c\xba\xc9\x42\x30\xc9"
+ "\xf7\xa7\xee\xc2\x94\x03\x94\x32\xf6\x67\x9c\x02\x75\xa9\x7d\x54"
+ "\x4a\xce\x4f\x48\x9e\x9e\xfa\x6f\x0b\xe6\x5d\xff\x87\xd4\x91\x97"
+ "\xff\x76\xe1\x01\x2a\x7f\xf9\x48\xbf\x9a\xc6\x0e\x50\xf5\xd8\x8e"
+ "\x71\xcf\xfe\xe0\x35\x81\x65\xfe\xbc\xb0\x3f\x18\x47\xaf\x2a\xa2"
+ "\xd4\xeb\x79\x2c\x46\xb1\xca\x84\xb3\xa9\xe1\xcf\xcd\xff\xec\x3f"
+ "\xe6\xef\x6e\x7f\x64\x1c\xb6\xf4\xf2\x9f\xb4\x3f\x32\x7f\xf7\x67"
+ "\xff\x11\xf6\x0c\x41\xde\x9c\x97\x1a\x67\x08\x9f\xbc\xa6\xf5\x81"
+ "\x71\x9c\xaa\xab\x2a\xe3\xab\x47\x35\x5e\xdd\x7c\xcd\xfe\x84\xb6"
+ "\x6b\xff\x7b\xf4\x9f\xae\xfb\x3f\x83\x73\x0c\xc3\x38\xe2\x9e\xd4"
+ "\x31\xfd\x71\x04\x60\x1c\x71\x1c\xe3\x88\x52\x8c\x23\x8e\xa8\xe3"
+ "\x88\xdf\x45\xde\x55\x22\x62\x09\x01\x2f\xe2\x9f\xe4\xff\xc6\xf8"
+ "\x67\x25\xc6\x3f\xc9\x1f\x85\x3f\xf8\xd0\x47\x51\xd9\x22\xfe\x19"
+ "\x11\x3b\x8c\xc7\x40\xa3\xf0\x17\xe3\xa0\xff\x1a\x83\xbf\x49\xf8"
+ "\x3c\x6e\xe4\x70\xff\x98\x68\x6e\x4c\x5b\xf8\x42\x8c\x89\xd2\x30"
+ "\x26\x32\x2e\x69\xd3\xcd\xfc\x4d\x5b\xc4\x24\x63\x5b\x64\x7f\x5c"
+ "\x34\xa3\x2d\x3d\x7e\x42\xdb\x4c\x2d\xb4\xdd\x07\x22\x36\xda\x02"
+ "\xa9\xbf\xd3\xc6\x69\x3e\x8e\x02\xed\xc7\x31\x0d\x91\x1f\xc7\x5a"
+ "\xad\x1f\xeb\xf1\x1a\x01\x0d\x1f\x8f\x84\xe1\xbf\xbd\xa7\x01\x7e"
+ "\x3b\xad\xd4\xfe\x91\x16\x62\x3e\x8a\x80\xb3\x1f\x8d\xc0\xdf\xdc"
+ "\x97\xe0\xa3\x1f\x83\xf6\xa3\x48\xed\xd9\x81\xf6\xc6\x7d\xf1\xd1"
+ "\x98\x0f\x27\x7f\x34\x36\xed\x3f\x3f\xba\x3e\x7d\xee\x47\x89\x1f"
+ "\x7e\xf8\xd1\x0d\xf6\xd1\xea\xb8\x89\xda\x0c\x70\xcb\x16\x8a\x60"
+ "\x91\xdf\xb7\x27\x0d\x4b\x1d\xf6\x6c\x3e\x8f\x07\xef\x90\xe3\xc2"
+ "\x3b\x8c\xd3\x9f\x9b\x3f\xff\xf1\x30\xc9\x38\x9a\x47\x97\x72\xa4"
+ "\x39\x10\x7d\xfa\xc7\x9c\x93\x5b\x07\x62\xce\x44\xe7\x40\xcc\x69"
+ "\x18\x36\x79\xad\x5f\x7c\xd6\x87\x69\x47\xd3\x12\x0d\x37\xa4\xf2"
+ "\xc8\xac\x7d\x54\x60\xb4\x36\x7e\x5b\xea\xe4\x44\xdd\xed\x1d\x18"
+ "\xb3\x0d\x2f\xff\xf1\xe3\xbf\xa0\x0b\xa3\xb6\xf3\x7a\xe9\xb9\xe5"
+ "\x4b\x26\xe5\x3c\x73\x33\xca\xfc\x72\x8a\x82\x87\xff\xf8\xd9\x96"
+ "\x1f\xff\xf8\xb9\x96\x8f\x1e\x99\x37\xee\x1d\x4c\xfb\x6d\x62\x31"
+ "\xea\xcf\xff\xcb\xfb\x7f\x13\xce\xa6\x85\xff\xf8\xa1\x96\xe7\x7e"
+ "\xfa\xc4\x13\xad\xa4\x2f\x24\x5b\xa5\x8f\xea\xb1\x8c\xc4\x98\x44"
+ "\xf3\xae\xcb\x72\x05\xc6\x3f\xa3\xda\x02\xfb\xb2\xef\xed\xf2\x7b"
+ "\xbb\xfc\xde\x2e\xff\x16\x76\x79\x25\x08\xbb\x1c\x55\x19\xcc\x2e"
+ "\x67\xce\x99\x91\x79\x97\x61\xcd\xe3\x06\x53\xd1\xaa\x27\x8a\x96"
+ "\xac\x30\x14\xae\x5a\x92\x97\x9f\x17\x09\xfd\x19\x4b\x1e\x2f\x5e"
+ "\xb6\x76\x49\x71\xfe\xa0\x6f\x1b\xe3\x95\x98\x74\x70\x6c\x3d\xca"
+ "\x1d\x3a\xb6\xbe\x3a\x2e\xf8\xb8\x44\x83\x7d\xfb\xd5\xa9\x41\xf2"
+ "\xc6\xca\x79\xb3\x82\xe4\x4d\x95\xf3\x0a\x82\x8c\x01\xa3\xc5\x18"
+ "\xe3\xea\x2d\xc1\xf2\x30\xbd\x46\x89\x49\x70\x9c\x26\xb5\x8e\xed"
+ "\x06\x8a\x49\x4e\xc0\xd5\x1f\x62\x9b\xba\x30\x7f\xbf\x12\xcb\xd8"
+ "\xe1\xea\x2d\x4a\x8c\x26\x8f\x43\x92\x9c\x16\x23\xb6\xf3\x6a\x7b"
+ "\x90\x31\xca\xcd\x72\xbd\x9e\x81\xd8\x68\x8e\xc1\x65\xb9\x26\x6a"
+ "\x70\x6c\xd4\x0e\x62\x0c\x79\x4d\x52\x00\xec\x24\x05\x16\xe3\x49"
+ "\xda\xf3\xa1\x9b\xbe\x49\xeb\x86\x6b\xf6\x33\xcb\xa8\x6a\x8a\x29"
+ "\x69\x1c\x49\x78\xc4\x58\xb2\x83\x8f\x25\x71\xac\xd8\x89\x65\x8b"
+ "\x55\xe3\xc9\x4e\x8c\x8d\x87\xd3\x78\xf2\x04\x5c\xf3\x2a\x8d\x29"
+ "\xb7\x73\x5c\x27\x09\xd7\x6c\xc2\x65\x87\x6b\xac\x3c\xee\x13\x65"
+ "\x9b\x55\xf3\x66\x38\xae\xbd\x86\xef\x05\xaa\xc4\x85\x98\xdf\x6e"
+ "\x97\xbe\x8a\x53\xda\x40\xb1\xa0\xdc\x8e\x32\x21\x87\x6b\x82\x8c"
+ "\x7f\xda\x7f\x22\xc6\x81\x09\xfd\xe3\x1f\xc2\xe7\xb3\x8c\x7a\xbb"
+ "\x8e\xe3\x4c\x48\x54\x70\xaa\xf5\xf2\xf1\x55\x2b\x97\x2e\x7b\x62"
+ "\x4d\x51\xbe\x61\xf5\xac\x59\x86\x15\xab\xf2\xf2\xc7\x8f\x1f\x1f"
+ "\xe9\xa7\x7f\x51\x22\xa6\x3d\x68\x24\x3d\xa4\xb8\x56\xd6\x43\x23"
+ "\xc6\x9c\x72\xdc\x9c\x50\xe6\x3f\xbe\x38\x68\x94\xe3\x5b\xfa\x86"
+ "\x2b\x55\x86\x69\xf4\x83\x41\x7c\x72\x8c\x4c\x71\x6e\x8c\x0c\xd3"
+ "\x16\x88\x07\xf3\xf8\xb8\x88\xbe\xb3\xeb\x11\xed\xeb\x0e\xc0\x73"
+ "\x8f\x3c\xde\x41\xbd\x1f\x26\x8f\x13\xae\xd5\x07\xe0\xb9\x67\x60"
+ "\xbc\xa1\x51\x60\x26\xaa\xc7\x26\xf8\x9c\xae\xc8\x64\x20\x8e\x3f"
+ "\xd0\x25\x70\x6b\xf4\x03\x71\xff\xb5\x85\x01\x63\xa9\x2b\x07\x70"
+ "\x83\x5e\x86\xa9\xf2\xa7\xf1\xc0\x49\xb9\xad\x3a\x15\x9e\x7d\xfe"
+ "\x78\x0e\xfc\x45\xc6\x13\xa6\x82\xe9\x08\xa0\xb1\x6b\x30\x8d\xd6"
+ "\x18\x81\xbb\x01\xeb\xb7\xcb\x6d\x1b\x1d\xd0\x7e\x84\xe1\xb8\xe3"
+ "\x10\x26\x41\x81\x99\xa8\x1e\x4b\xd1\x78\x8e\x7f\x7b\x09\xa3\x67"
+ "\x91\x3e\xe1\x35\x0c\xe9\xfe\xb3\x6a\x4c\x37\x5c\x2e\x17\xd8\xfe"
+ "\xe8\x1e\x1c\x2f\xd4\xfb\x8d\xd3\x46\x07\xb4\x1f\xc7\x86\x23\x15"
+ "\x1e\x69\x15\x98\xc0\xf6\xdb\x05\x8d\x23\x46\x0c\xb4\x7f\x74\x47"
+ "\x00\x9e\x2b\x49\xa7\x08\x97\xaa\x2e\x4f\x00\x9e\xe3\x32\x1f\x55"
+ "\xbc\xbe\xce\x10\x20\x8f\xff\x95\xe9\x51\xf1\xfa\xba\xf4\x00\x3c"
+ "\x67\x28\xdf\xbf\x5d\xd7\x15\x04\xe0\x39\x33\xd0\x2e\xd4\x63\x01"
+ "\x53\x19\x30\x8e\x95\x98\xe5\xb7\xd1\x01\x78\x9a\x15\x98\x9e\x61"
+ "\xcf\x35\x08\xd9\x5e\xd7\xaa\xf8\x22\x21\xd7\x84\x54\xc2\x8d\xe9"
+ "\xc7\xd4\xbe\x00\xe9\xea\x1a\xcc\x27\x03\x04\xf2\x49\x45\x97\x3c"
+ "\x16\x37\x24\x06\xb4\xef\xa4\xcc\xa7\x48\x15\x9e\x8c\x80\xf6\xfd"
+ "\x45\xc6\x13\xae\x82\x09\x90\xff\x81\x6e\x19\x8f\x56\x05\x13\xa8"
+ "\xff\xa7\x64\x3c\xea\xba\xf6\x7d\x3d\x9f\x0c\x7e\xfa\x4f\xbc\xc2"
+ "\xb4\xee\xaf\x99\x83\xd2\x89\x77\x07\x63\xb0\xff\xdb\x5d\xc3\xbf"
+ "\x8d\x8e\x19\xbe\x8f\xf6\x90\x42\x1f\x6d\xe4\x73\x83\xbd\xe4\xa7"
+ "\xc7\x98\xeb\xd1\x9f\x89\x36\x40\xaa\xf0\xdd\x63\x96\x00\xdf\x8b"
+ "\x75\x4c\x96\x1d\x62\x8a\xd5\xef\x01\xec\x30\xa6\x52\xce\xc3\xf6"
+ "\x5f\xd1\xa1\xe4\x51\xba\x98\x5f\x1c\x83\xfd\xdf\x28\x93\xe8\xc7"
+ "\xc6\x14\xca\xb0\xe8\xf7\x13\x32\x82\x7d\xaf\x1c\xea\xfd\xcb\xea"
+ "\x78\xe6\x2b\x1d\x45\xdf\x2f\x9f\x9d\xe4\xb3\x30\xb0\x99\xdd\x60"
+ "\xb8\x1a\x4a\x8f\xc3\x58\x1d\x8d\xf1\xb7\x6f\x00\x5d\xa9\x89\xb9"
+ "\x69\xbf\xd9\x23\x8e\x6e\x28\x75\xb0\x2e\x3a\x6b\x60\xd3\x59\xd0"
+ "\xd1\x99\x01\x9b\x9e\x82\xf8\xd6\x92\x2f\x82\x7e\x83\xeb\xa3\xb3"
+ "\x01\x13\xa8\x6c\x27\x1c\xa9\xe9\x84\xd2\x1a\xff\xb2\xa5\xd7\x42"
+ "\xfc\x61\x3a\xb7\xc0\x02\xb1\x44\x07\xbd\x4f\xf1\x44\x9e\x9d\x54"
+ "\xf2\x32\x68\x4b\x31\xba\x3c\x9c\x67\x55\x68\x69\x27\x5a\xb6\x9c"
+ "\x04\xdd\xee\xa5\x56\xe9\x99\x93\x44\xaf\x77\xd2\xde\x0d\x6e\xe9"
+ "\x40\xfc\x2c\x38\x10\x7f\x0c\x5a\xe3\x27\x43\xab\x39\x1d\xb6\x9f"
+ "\x84\xa8\x03\xee\x34\x68\xd5\xce\x80\xd6\xc4\x74\xb0\x75\xe3\xbd"
+ "\xc1\x8b\x30\x4e\xbe\xdf\xd1\x09\x18\x6b\xdd\xb9\x1c\x74\x76\x81"
+ "\x13\x79\x36\xf6\x90\xb2\x77\x0f\x3d\x07\x6b\xc7\xea\x51\x10\x8f"
+ "\xf4\x75\x21\x2d\x77\x1e\x87\xeb\xc3\x13\xe3\x21\x95\xfa\x5f\x5b"
+ "\xb5\x07\xb4\x25\x10\x11\x42\x2f\xe2\xf8\xbe\x9f\x18\x47\xd5\xbd"
+ "\x84\x7d\x3d\xfe\xf6\xa0\x4e\xb8\x2c\xd7\xa7\x61\xdd\xc7\xe4\x79"
+ "\xaf\xee\xd2\x57\x51\xcf\xd6\xe5\xd0\x3e\x20\xd8\x4f\x5f\x9f\xa3"
+ "\xe4\xd1\x7e\xa6\xb4\x4f\xe9\x84\x38\xd0\xdb\x3c\x46\xf8\xa0\xb7"
+ "\x8b\xbe\xb5\xef\xa6\xfd\x0f\x08\x1f\xf6\xf9\x61\x34\xff\x84\xf4"
+ "\x8c\xc3\x3e\xbe\xfb\x7a\x84\xc3\xf2\x28\xff\x76\xbe\x87\x30\xbb"
+ "\x6a\x81\xd3\x77\xd5\x82\xb3\xbe\x9f\x2e\xe8\x61\x3f\x5d\xf0\x95"
+ "\xf7\xa7\x0b\xbe\x2c\x5d\x0f\x3a\xef\x55\x0b\x1c\x47\x4c\x5c\x06"
+ "\xfa\x23\xa6\x53\xf4\xdd\xbc\x6e\xe3\x29\xd0\x2f\x7a\x0a\x65\xef"
+ "\xf9\x14\x36\x2e\x83\x78\x5f\x44\x9f\xc3\xe6\xf9\x04\x16\x95\x00"
+ "\xf3\x45\x78\x82\xca\xb6\x27\xd2\x6b\x56\xe6\xd3\x5c\x96\x44\xbd"
+ "\x5d\x72\xa6\x52\xbd\x8e\xe8\x70\x33\x5e\x25\x78\x95\xe1\xb5\x85"
+ "\x45\x7a\xb7\x20\xaf\x4a\x63\x36\x6b\x80\xf6\xeb\x99\xe0\x03\xcd"
+ "\x49\x48\x4c\xa6\x33\x8d\x43\xf0\x2d\xc1\xb7\x3d\x0e\x6e\x2a\x83"
+ "\x4d\x2e\x57\x01\xed\x9b\xea\x20\xfb\xa2\x78\x14\xeb\x31\x63\x3d"
+ "\x5c\xe7\xd1\x46\x9c\x2c\x26\x8e\xde\xe5\x75\x39\x9f\x2e\xd0\x38"
+ "\x9e\x2e\x90\x7a\x62\xe2\xc2\x10\xa6\x06\x61\x9a\x64\x1e\x76\x11"
+ "\x2e\xb4\x1b\x47\xb4\x07\xc2\x10\xa7\xe9\xdd\x73\x1d\xda\xda\x97"
+ "\xd8\x31\x84\x6b\xed\xc7\x85\xb8\x77\xf2\x38\x29\xb1\x43\x49\xa3"
+ "\x38\x69\x1b\xc2\x51\x79\x9b\xdb\x48\xf5\xd8\x6d\x85\x5d\xb4\x5f"
+ "\x45\x24\xeb\x13\xf5\x51\x0c\x47\xb6\x1a\xed\x86\x61\x2e\x0b\x64"
+ "\x11\x6e\x2a\x67\xeb\xee\x02\x2c\x17\xc6\x4a\x0b\x30\x5e\x84\x39"
+ "\x2e\x56\xa0\xa1\xbd\x6b\x0f\x60\x79\x51\xf7\x0d\x46\x85\x46\xaa"
+ "\x83\xef\x5d\x4b\x74\xa2\x3e\x1c\x28\x74\x43\x74\x35\xcd\x93\xc3"
+ "\x3c\xc2\x47\xb8\x50\x0f\xec\xd8\xd6\xb0\x03\x85\x0e\xf0\x31\x3f"
+ "\x9c\x76\x19\x5f\x95\x1f\x3e\x4c\x67\x88\x8f\xf4\xaf\x15\xcb\x44"
+ "\x37\x70\x7c\x73\xdf\xf5\x11\x3e\x37\x68\x0d\x9c\xde\xf9\x84\x83"
+ "\xef\x03\x8d\x38\xad\x6b\xa7\x62\xec\x78\x83\xdb\x51\x5a\x10\xc6"
+ "\xbf\x93\xc7\xf2\x7b\x37\x75\x85\xb3\x9e\x9c\xb0\x18\xfe\x8d\xfc"
+ "\x54\xa0\x77\xad\x08\xf3\x47\xd6\x53\x10\x16\xdd\x8d\xb1\x1e\xc2"
+ "\xd0\xbe\x59\x44\xa7\x5a\x96\x73\xa7\xcf\x9f\x0c\xf3\xd3\x67\xa6"
+ "\x4f\x86\xd9\xf7\x4c\x9b\x0c\xa9\x77\xa6\xa4\x4e\xfc\xc1\x0f\x7f"
+ "\xc0\x6f\x7e\xf0\xc3\x49\x3f\x80\xac\x87\xe6\x4e\x86\xac\x39\x93"
+ "\x61\x1e\x5e\x59\xf3\xa6\xcf\x4d\x9f\x3e\x6f\x32\xe4\xcc\x98\x89"
+ "\x4f\xd3\x26\xdf\x9a\x7a\x6f\x4a\xd6\xb4\x99\xd3\xe1\x81\xec\xdb"
+ "\x52\x6f\xbb\x0d\xee\x99\x3e\xeb\xd6\xd4\x54\xf9\xf7\xd6\x54\x02"
+ "\x79\x64\xd2\xf4\x79\x29\x59\x45\xab\x8a\x57\xa5\xcc\x99\x39\x8d"
+ "\x52\x60\xfa\xf4\xc9\x59\x7e\x71\x64\x92\xf7\x9c\x97\xf8\xed\x64"
+ "\x67\x32\x68\xbf\x62\xa8\x43\x3d\xc0\xab\x9b\xef\x83\x04\x37\xfd"
+ "\xbe\x8e\xe4\xc7\xfb\x82\x1b\xe3\xa8\x3f\x75\x59\x6e\x24\xf9\xf3"
+ "\xf9\x5b\xda\x33\xf8\x04\x8c\x9f\x8c\x79\xa3\xe4\x78\x24\x1c\xf3"
+ "\xdd\xfe\xf9\xe3\x16\x62\xfe\x75\xb4\xaf\x8e\x0d\x2f\xe4\xbd\x13"
+ "\xfd\x21\xf2\xd8\x01\x3d\xa5\x39\xe1\x7c\x5f\x43\x94\x3b\xed\x37"
+ "\xe1\xb2\xdc\x34\x51\x65\xf7\x9d\xb4\x2f\x05\xcd\x27\x9f\x86\x9b"
+ "\xa2\x8f\x14\x1b\xb9\xac\x6c\xc5\x32\x8e\xb3\xfd\x38\x22\xe5\xbd"
+ "\x11\xed\x75\xb4\xe7\x87\xc0\x53\xa2\xf2\x11\xb4\xdf\x71\xfb\x76"
+ "\xcc\x93\x71\x3d\x70\x04\x7d\x05\xfa\xf2\xa9\xbe\xd2\x24\x60\x91"
+ "\x67\x8d\xbe\xbe\x24\x10\xf3\xaf\x37\xed\x53\xe9\xb6\xb3\xd5\x8c"
+ "\x70\xbb\x33\x34\xb4\xff\x02\xdf\x8b\x01\x6e\xb4\xa2\x8e\x3b\xbd"
+ "\xdb\xc3\xb7\xb2\x33\x7c\xff\xc3\x61\xd8\xbe\x14\x6c\x5f\xa2\x6f"
+ "\x7b\x78\x39\xdf\x4b\x94\xc3\x25\xc5\x31\x7a\x8e\x41\xb8\xbe\xfe"
+ "\xb4\x2b\x28\xcd\x45\xef\x77\xd0\x66\x19\xe3\xe9\x61\x98\xfe\x09"
+ "\xfa\xb5\x0e\x84\x2d\x27\xd8\x09\x1e\x18\xce\xf7\x3d\x29\xd5\xc0"
+ "\x71\x48\x5a\xe8\x8b\x09\xaf\x50\xd5\x47\x78\x16\x8a\x7e\x0c\x65"
+ "\x71\x06\xf1\xf4\xf0\x74\x09\xd3\xdf\x43\xfc\xcf\x93\xbf\x14\x3e"
+ "\x7c\xfc\xa3\x00\xfd\xef\x45\x06\x9e\x69\x5f\xe7\x4d\xe2\xf9\x00"
+ "\xf2\x92\xde\x13\xd0\x3b\x7e\x97\x25\x09\xe3\x9f\xc4\x0c\xd1\x57"
+ "\x8e\xe7\x75\xd0\x3e\xb2\x2c\xea\xa1\x54\xc4\x5b\x69\xdd\xd0\xcd"
+ "\xcf\xc9\xb1\x43\x52\xa1\xaf\xb4\x00\x02\x68\x4a\x22\xfa\xc9\x87"
+ "\x20\x2f\x52\x50\x0f\x22\x5c\x96\x71\x10\xa0\x07\x09\x88\x67\x2b"
+ "\xd2\xd7\x81\x6d\xda\x8a\x78\x12\x7d\x3d\x05\x64\x1b\x12\xda\x16"
+ "\xc6\x4a\x03\x38\xe4\xf2\x46\xff\xf2\x37\x75\x52\x39\x84\x0f\x77"
+ "\xf5\x10\xfc\x4d\x5d\xc4\x73\x59\xef\x50\x2f\xc7\x99\x02\xf4\x72"
+ "\x0c\xd2\x72\x87\x2a\xbf\x2a\x20\x3f\x1c\xf3\x7f\x24\xe7\xa3\xed"
+ "\x8f\x6b\x0e\xa0\xf7\x10\xe6\x4f\x41\x7a\x9d\x68\xdb\x61\x58\x5f"
+ "\x63\x9d\x1c\x9b\xc8\xf0\xf6\x00\x78\x0f\xc2\x4f\x23\xbd\xa1\x7e"
+ "\x87\xe0\xeb\x65\xdb\x41\x78\x9d\xcb\x72\xb3\xde\x1f\x3e\xe5\x0b"
+ "\x84\x9f\x35\x40\xdf\xcd\xa9\xfe\xf9\x37\xbb\x31\xff\x01\xd2\x75"
+ "\xfc\x7d\x94\x62\x7d\xf2\x27\xe4\xcb\x0e\x14\x92\xbc\x6e\xce\x0d"
+ "\x80\x2f\x43\xb8\x3c\x99\x47\x92\xcc\xa3\x46\x79\xec\x7e\x4c\xa6"
+ "\x61\x67\x40\x99\x7d\x58\xa6\x10\xf9\xb8\x55\xd1\xcb\x20\x65\xda"
+ "\x02\xca\x74\x91\x1c\x99\xa8\x47\xeb\xea\x1b\x28\x23\xfb\x49\x35"
+ "\x0e\x6a\xdb\x65\x2e\xcb\x2d\x51\x01\x6d\x4f\xc7\x7a\x8b\xb7\x09"
+ "\xbf\x73\x19\xea\xd0\x6d\x98\x76\x3b\xe2\xdc\x46\x36\xb0\x9d\xe2"
+ "\x41\x87\x1b\x58\x69\x46\x94\xd0\xdd\x5b\x56\xc4\x78\x80\xee\x53"
+ "\xe8\x9e\x70\x33\xd7\x2c\xd9\x26\x6f\x59\x81\xbf\x94\xce\xcf\x7d"
+ "\x21\x3f\xcc\x5c\xf7\xfb\x04\xce\x5b\x5e\xa0\xf3\xbe\xf0\xd9\x2b"
+ "\xd7\x91\x42\x7b\x85\x22\xfd\x15\xd8\xef\x00\x5b\x87\x70\x1b\x60"
+ "\x1a\xa6\x5f\xcb\x6d\x55\xc0\xf1\x67\x51\x47\x06\xe9\xf7\x44\x7c"
+ "\xbe\x42\x2e\x1f\x4d\xf8\xf0\xfe\x56\xf9\x5e\xe3\x25\x5c\x67\x14"
+ "\x1b\x4c\xe1\x7b\x78\x92\x1d\x72\xfc\x58\x9e\xf6\x65\x15\x38\x93"
+ "\xbf\xc4\xdf\x99\xf8\xfb\x29\xfe\x3e\x80\xbf\xef\xd1\x3e\xa9\xa5"
+ "\x5e\x6e\x8f\xf4\xfc\x1a\xfe\xce\xc5\xdf\x17\xf0\x77\x1e\xfe\x6e"
+ "\xc4\xdf\xa9\xf8\xfb\x30\xd9\x05\xed\xf9\x4e\x7b\xd7\x60\xdf\x2a"
+ "\x74\x8b\xde\xfd\xb9\x32\x88\x07\xd3\x11\x26\x9d\xdb\xab\xf0\x2f"
+ "\x3a\x21\xc7\x64\x7e\x16\x0f\xea\x03\xa5\x0d\x17\xfa\x20\xd2\xbc"
+ "\x8a\x1f\x3a\x33\x90\x26\xfb\x26\xd9\x16\xe5\x34\x81\x3f\x0b\xf1"
+ "\x27\x10\xad\x4c\xe0\x0a\x17\x32\x97\xf1\x8b\x72\xda\x20\x75\x6a"
+ "\xd4\x75\xda\xe1\x16\x07\xed\x7b\x84\xbf\xc7\xf8\xbe\x92\x90\x12"
+ "\xc5\xb8\xde\x63\x3f\xcb\xf1\xdd\xd2\x22\xc3\x55\x11\x8f\x79\x79"
+ "\x91\x9e\xac\xd2\xa5\x91\x2e\x4b\x4a\x4e\x80\x2e\x61\xac\x7f\xe3"
+ "\x73\xa4\x33\xc4\x77\x6a\x5b\x8c\x89\xf7\xe5\xbc\x2d\x1c\xff\x19"
+ "\xa1\x93\x75\xf2\xda\x24\x61\xbf\x29\x0d\x01\x78\xf6\x23\x9e\x8a"
+ "\x00\x7b\xef\x1e\xe8\xd7\x52\xda\x03\xfc\x51\x23\xd6\x87\xbe\xf2"
+ "\xe6\x2e\xd9\xaf\x3a\xc3\x4a\xc8\x5e\x52\xdc\x76\x38\xc9\xf7\x94"
+ "\xc3\xfc\xed\x84\xc7\x59\xca\xf7\xeb\x77\x86\x99\xa8\xbd\xe3\xe3"
+ "\x95\x7c\x9e\x17\x1d\x57\x46\x76\x10\x56\xc8\xf3\xb0\xff\xbb\x5e"
+ "\xaf\xe4\x81\xd8\x07\xce\x19\x56\xcc\xf3\xb2\xfa\xf1\x56\x9c\xcd"
+ "\x95\xf1\x86\x05\x3d\x7f\xa1\xfc\x6c\x56\x0a\x80\x74\x73\x19\x84"
+ "\xdb\x3c\x47\x21\xd3\xc3\xbc\x29\x65\x10\x61\xf3\xec\x81\x71\x00"
+ "\x23\x6c\x9e\x63\x70\x33\xc0\x18\x9b\x67\x27\xc6\x2b\x8d\x94\xff"
+ "\xc1\x4d\xa0\xd1\xe0\x6f\xe9\x8d\x65\x92\xc6\xe6\x29\x86\xc4\x32"
+ "\x2d\xfe\x16\xc2\x8c\x70\xe6\xb2\x79\x66\x21\x5c\x1e\x64\x7a\xd9"
+ "\x99\xf4\x70\xf6\xd9\x62\x2f\xe8\x67\x3d\xcb\x4a\x6d\x1e\x1c\x3b"
+ "\x78\x0e\x61\xba\x8f\x65\x7a\xcf\xe3\xe5\x62\xbe\xf2\xb3\xb9\x99"
+ "\xde\x33\x6c\xda\xb3\x1f\xe0\xf3\x67\x0c\x65\xc9\x6c\x9e\x34\x38"
+ "\xe2\x74\x22\x5c\x29\x63\x5b\xcf\x66\x2d\x3a\x2b\x41\x1f\x9d\x8f"
+ "\xb0\xf5\x6c\x2e\xb6\xc5\xd4\x87\xed\xc0\x7e\x78\x55\xdf\xd3\xf8"
+ "\x5b\x71\x76\x25\x7f\x2e\x3f\x5b\xc6\x74\x67\x4d\xe3\x71\x20\x46"
+ "\x6d\xb0\x79\x3a\x61\x31\x0e\x25\x32\xd7\x3b\x18\xd1\x1f\xb3\x99"
+ "\xc6\x61\x69\xb4\xb7\x72\x6c\xe6\xfa\x52\x86\x79\x3a\x16\x71\xd6"
+ "\x64\xf3\x74\x03\xd6\x51\x86\xf8\x36\x72\x7c\xe5\x67\x1b\x10\xd6"
+ "\x41\x70\x6a\x3c\x84\x83\x60\x33\xbd\x10\x8b\xf0\x0d\x7d\x11\x67"
+ "\xab\xf0\x6a\xc6\xcb\x8e\x65\xbf\x62\x96\xb8\xdf\xd0\xfe\x98\xac"
+ "\xfc\x1c\xc6\x08\xe7\xf4\x6e\x3a\xcb\x81\x78\xe9\x85\xe1\x6c\xeb"
+ "\x39\xd2\xab\x74\xd4\x4f\xa4\xf7\x5c\x2a\xa7\xb7\xe2\xdc\x04\x37"
+ "\x6f\xc7\xb9\xf1\xa2\x1d\xe7\x52\x28\xbd\x07\x75\x07\xef\xb3\x7a"
+ "\x44\x5e\x26\x96\xcb\xe6\xe5\xca\xcf\x65\x31\xdd\xb9\x5c\x37\xda"
+ "\x21\xf2\xb5\x8c\xf8\x88\x7c\x2d\x23\x5e\x22\xfe\x2c\x9b\xb9\x12"
+ "\x58\xc4\xb9\xdc\xbe\x88\x73\x26\x2c\x6f\xe9\xe3\xb1\xca\xb9\x2a"
+ "\xb7\xc0\xbd\x03\xf1\x2c\x44\xfd\x0e\x43\x1c\x55\x88\xab\xa1\xcf"
+ "\x62\x80\xcc\xf5\xcc\x9d\xe9\xd9\xec\x59\xbc\x1e\xc2\x92\xa1\x0c"
+ "\xe9\x7d\x1f\x79\x94\x87\xed\x6c\xc5\xdf\x74\xcc\x87\xcb\xb1\xae"
+ "\x0f\x10\x6f\x15\xd5\x87\xf5\x34\x20\xce\x5a\xc4\x95\x47\x34\x9d"
+ "\xb7\x80\x1e\x9f\x9b\xcf\x0b\xfa\xda\x7d\xe5\xe7\x1c\x3e\xdd\x39"
+ "\xbb\xa2\x43\xa4\x3f\x82\x6f\x3b\x61\x8e\x93\x79\x6c\x9e\x5a\xec"
+ "\x75\x70\x8c\xe4\x3c\x46\xf9\x38\x56\xda\x83\x72\x26\x9d\x2a\xc6"
+ "\xdf\x46\x20\xfd\x39\x62\x7a\x96\x60\x3f\x20\x1d\x9a\x63\x72\x6e"
+ "\x4e\x01\x93\x06\x9f\x4b\x17\x7b\x74\xb0\xc8\xa4\x2d\xf3\x96\x9f"
+ "\xb3\x1e\x31\x91\x5c\x8e\x62\x19\x2a\x57\x08\xb1\x1a\x1c\x2f\x68"
+ "\x98\x27\xd6\xec\xd0\x46\x17\x94\xb2\x23\xce\x59\x08\x6b\x02\x6a"
+ "\x0f\xe9\x11\xc1\xcf\xee\x66\x76\xaf\xce\x65\xa2\xb6\xb1\x98\x32"
+ "\x38\xdc\x7d\x3b\xd0\x98\xed\x70\x77\x23\xe9\xa9\x8f\xe9\x5c\x46"
+ "\xd4\xd1\xbe\xd9\xdd\x65\xe1\x8b\xce\x82\x06\xd3\xbc\x87\x0b\xf6"
+ "\x60\x7e\x2b\xc2\x1d\xe2\x7a\x3b\xe7\xac\x27\xd6\xa3\x3b\xd7\xec"
+ "\x29\x77\x65\xcd\x39\xdb\xc7\x0e\x17\xec\x84\x47\xbb\xcb\x90\x57"
+ "\x7b\x60\xf6\x29\x4f\xd8\x11\x53\x1e\xc2\xb8\x30\xbd\x91\xeb\xff"
+ "\xec\x53\x3d\x6c\xce\x53\xec\xcc\x9c\xb3\x9f\xb1\xd9\x05\xec\x83"
+ "\xc5\x66\x88\xb9\x6c\x33\xf3\x91\x5d\x1c\xea\xdc\x03\x97\x1d\xa3"
+ "\xbd\xf3\xd3\x61\xd6\x12\x1f\x9b\x7d\xea\x0c\x5b\xf4\x14\xf1\x26"
+ "\x0d\x0e\x17\xa0\xfd\x98\x77\x12\xbf\xdb\x0f\x17\xec\xc7\xfa\xd3"
+ "\x11\x6f\x29\xb3\x99\x6b\x11\xd6\x1a\xfb\xe8\x29\x3d\x1c\xea\xdc"
+ "\x09\x9e\x88\x73\xcd\xde\xad\xe7\xac\xbe\x88\x73\x76\xdf\xd6\x73"
+ "\x0e\x16\xe1\x32\x7a\xb6\xba\xb2\xbc\x11\x2e\xd4\x01\x97\x15\xe5"
+ "\x14\x41\x32\xef\xb5\x80\x01\x9f\xff\xb3\x97\xe4\x5f\xee\x6a\xc7"
+ "\xb6\x3a\x30\x36\x66\x42\xf7\x5d\xed\x34\x0f\x81\x65\x1d\x7d\x11"
+ "\x2e\x3b\xc2\x39\x84\x7d\xb9\x81\xf4\x92\xe6\xfb\x31\x0d\x19\x54"
+ "\x10\xd6\x17\xe1\xd6\xe3\x65\xc0\x2b\x95\x55\xb8\xcb\x10\xff\x08"
+ "\xae\x53\xe5\xee\x32\x76\x77\x15\xc6\xda\x67\x11\x8f\xbb\x21\xd3"
+ "\x3b\x85\x21\x0f\xd1\x4e\xdc\x65\xbe\xad\xee\x2a\xc4\x65\x75\x73"
+ "\xdd\x77\x7f\x40\xb8\xfb\x9e\x4e\xa2\xf9\x09\x2d\xe6\xb7\xb3\x8a"
+ "\xf3\x53\xdd\xa4\xab\xba\xf3\x46\x9f\xee\x7c\x03\x2b\x3f\x9f\x75"
+ "\xff\xb3\xcc\xe1\x2d\x3f\x6f\xf2\x95\x9f\xcf\xf5\x0c\xc3\x18\xde"
+ "\xbc\x1f\xc8\x3f\x79\xfe\x93\x21\x0f\x3e\x44\x7e\x34\x72\xf9\xdb"
+ "\xcc\x68\x03\xeb\xaf\x2e\x3b\xdc\x8d\xba\x60\x7a\x8b\xfb\xa6\x23"
+ "\xce\xa3\x9c\xa7\x2c\xe2\xbc\x91\x74\x8a\xe4\xbb\xc8\x04\x65\x6c"
+ "\xeb\xf9\x2c\xdf\xd6\xf3\xb9\xde\xad\x88\x37\x02\xeb\x89\xec\x3b"
+ "\xee\xe6\xf6\xda\x87\xfa\xba\x1f\xe8\xec\x47\xa1\xe3\x7d\xf6\x50"
+ "\x3e\x92\x7c\x15\xf9\xa7\x4c\x8f\x9b\x74\xe6\xcf\xe4\xd7\x84\x9f"
+ "\x82\xc5\x8a\x9f\x22\x1f\x45\xe3\x22\xf2\x53\x3e\xd9\x4f\xf9\x64"
+ "\x3f\xc5\x9f\x75\xe8\x6b\xca\xcf\x9a\xc8\x1f\x65\x9a\x85\x9f\xc9"
+ "\xf4\xa6\x32\xd4\x8d\x28\xc4\x61\x12\xb2\x40\x98\x8a\xb3\x1b\x39"
+ "\x3c\xe7\xd3\xd9\x06\x1f\xfa\x1b\xbc\x9a\x7d\xc2\xdf\x38\x64\x7f"
+ "\x23\x29\xfe\xc6\x6b\xa1\x33\x2f\x49\xb7\x06\xfb\x1b\x9f\xec\x6f"
+ "\xbc\x4c\xf8\x1b\x9f\xec\x6f\x28\xdd\x2b\xfb\x1b\x6f\x10\x7f\x83"
+ "\xf6\x4c\xed\x0d\x93\xfd\x4c\x19\xf9\x19\x6a\x2f\xea\x5a\xae\x4f"
+ "\xf8\x99\x32\x1c\x13\x49\xe4\x67\xbc\x58\xc6\xa7\xf8\x19\x17\x2f"
+ "\xdf\x40\xbe\xa6\xef\x39\x40\xff\x69\x00\xf2\x31\xdc\x9f\x78\xc6"
+ "\x78\xc8\x9f\x20\xff\xa6\x04\xfa\x13\xc4\xd7\x8c\xf7\x7a\xd9\x4f"
+ "\xd9\x63\x37\x33\x0f\xfa\x13\x6b\xa6\xd9\x89\xb2\xfe\x14\x62\x3d"
+ "\xe8\xb7\xcd\xc5\x65\x36\xb3\x07\xd0\x0f\x38\xd8\x91\x32\x40\x1a"
+ "\x51\x7f\xbd\xe8\x2b\x00\xd0\x2e\x8d\x1e\xb4\x71\xd4\xf1\xac\x23"
+ "\xa6\x4f\xc0\x8b\xb6\x3a\xbb\xbb\xc7\xb6\xc8\x99\xa4\x9f\x7d\x8a"
+ "\x39\x90\x3f\xf6\x45\xa6\x32\xf4\x2f\x49\x8e\xc3\xdd\xef\xc3\xac"
+ "\x4e\xe6\x9b\x95\x6b\x37\xa0\x0d\x64\xcd\x5e\x66\x8d\xa5\x73\x37"
+ "\xe7\x9c\x65\x56\xf4\x8b\xff\x3d\xfb\x94\x3e\x76\x61\x27\x8c\x9e"
+ "\xb5\x84\xf9\xbc\x68\x67\xd8\x5e\x2b\xb6\xbb\x1d\x69\xb7\xa3\xcd"
+ "\x39\xd0\xce\x8c\x9e\x00\x3b\x63\x91\xae\xff\xc4\x7b\x83\xe0\x9f"
+ "\xcb\x81\x76\xd6\xee\xe3\xfd\x59\x27\x1f\x8b\x62\x3d\x0e\x9a\xb7"
+ "\x43\x5b\x6b\xf7\x6d\x15\xb6\xe6\x63\xc2\xd6\x7c\xc4\x3f\x49\xb6"
+ "\x35\x94\x05\xda\x8d\x1e\x2f\x03\x5e\xc1\x6d\xcd\xa4\xb2\xb5\xa7"
+ "\x64\x5b\x8b\x10\xb6\x86\x32\x0d\xf3\x3e\x2d\xec\x8d\xf0\xd3\x78"
+ "\xb5\xdf\xde\x22\xcf\x1b\xe9\x0c\x00\xa1\x3b\xdc\xe6\xb0\x5f\x39"
+ "\x6f\x42\x7b\xcb\x45\x7b\x43\x7c\xcc\x41\x7e\x13\x75\xf3\x4f\xd4"
+ "\xd7\xcd\x31\xb1\x3f\x2d\xf6\x5e\x5d\x86\xf6\x64\x42\x5f\xf6\x19"
+ "\xfa\xd1\x3f\x2d\x72\x42\x03\xda\x93\x11\xed\x28\x0b\xed\x29\x17"
+ "\xed\x8a\xec\xc9\xee\x7d\x9a\x70\xf6\xd9\xfb\x71\xf0\xbe\xd2\xdf"
+ "\x9e\x2e\x34\x6f\xea\xb2\xfc\x50\x6b\x87\xf3\x7c\x3c\x8d\xf7\x7a"
+ "\x3b\xf4\xa6\xcb\xf7\x09\x76\xf8\xff\xb4\x3c\x96\x41\x3b\x34\x6d"
+ "\x82\x2b\x4e\xc2\x0f\xdb\x51\xe7\x01\xef\xa3\xf0\xfe\x68\xe6\xb8"
+ "\x0f\x98\xaf\xd2\x58\x80\x75\xbb\xc8\x16\x99\x65\x22\xd9\x80\x11"
+ "\x75\x51\xc7\x5c\x49\x51\x2c\x46\xf7\x0a\x9d\xd3\x4a\xe7\xb2\xe2"
+ "\x73\x0c\xf2\x20\x11\x7f\x47\xd6\x9e\x83\x38\xbc\xe2\x6b\xe5\x33"
+ "\x61\xf1\x3e\x95\xad\x8b\x8f\xdc\xbe\x16\x92\x63\x9d\xe2\x3c\x56"
+ "\x3a\x3f\x16\xe3\xe8\x38\xba\x67\x96\xcf\x92\xea\xcf\xc9\x67\xb2"
+ "\x46\x63\x7d\x74\x26\xeb\xea\x24\xa8\x2f\xe2\xe7\x63\xc5\xd7\x5b"
+ "\x58\xb3\xd7\x45\x7c\x38\x9b\xa5\xd0\x42\xb4\x21\x9d\xd7\x22\x9d"
+ "\x9d\x0f\xae\x37\xc2\x87\xe6\xe0\xfb\x2b\xba\x2c\x93\xfa\xdb\x1f"
+ "\x22\x3f\x51\xe1\x49\x88\xfc\x74\x85\x4f\xa1\xd6\x76\x52\x3f\xed"
+ "\x5d\xcb\xba\x69\xaf\x6e\x9a\x37\x28\xf5\xb0\xff\x45\x3e\x96\x6d"
+ "\xf2\x82\x2e\xd3\xec\x66\xb6\x6e\x66\xb5\x99\x4f\x41\x3d\xed\x1f"
+ "\x5e\xc2\x7c\xbe\x68\x5d\x09\xdb\xa6\x33\xf7\xac\x65\x1e\x9a\xf7"
+ "\xc1\x3a\x9a\xec\xb0\xa0\x41\xc8\xe2\x5c\x3b\x1f\x6f\x46\xe9\xcc"
+ "\x88\x6b\x04\xe1\x3a\x8c\xe5\xbd\xdb\x74\xa8\xaf\x93\xda\xed\x1a"
+ "\x5d\x0b\x87\xd3\x9d\x6b\x37\x6d\x80\x6b\x4e\xc2\x9d\x3a\x3e\x4e"
+ "\xa8\xd4\x55\x91\x4f\xc0\x34\x3d\xa6\xc5\x21\xfe\x9d\x2e\xcb\x9d"
+ "\x18\x73\xf7\xec\x14\xb1\xec\x9d\x71\x0a\x9c\x1d\x26\x75\x05\xae"
+ "\x5b\x93\xbf\x92\x2c\xf3\xdb\xef\x4d\x03\xfe\xbb\xd7\xd1\x4e\x71"
+ "\xc6\xe0\xd9\x03\x3e\xdd\x95\x45\xe7\x6e\x95\x6e\x84\x04\x94\x0f"
+ "\xd1\xb7\x15\xc7\x1c\x27\x98\xe5\x4e\xc3\xee\x0d\x6e\x1c\x53\xdc"
+ "\xb9\xd3\x0e\x07\x43\xf2\xd3\x77\x8e\x75\x22\x0f\x1c\x3b\xd6\x02"
+ "\x10\x7f\x88\x9f\x68\x37\x3e\xe4\xc3\xe7\xe4\x93\xea\xd7\xd2\xb8"
+ "\xfb\xce\x0e\x85\x5f\x21\x65\x52\xa9\xab\x14\x63\xd3\xbb\x26\x31"
+ "\x0b\x03\xeb\x68\x7a\x8f\x71\xd7\x9d\x9c\x07\xe5\x2e\x7b\x0f\xfa"
+ "\x11\x9a\x53\xa6\x33\xb2\x56\xc7\x33\xb7\xcb\x72\x57\xb2\x1d\xa6"
+ "\xb6\xc9\xf3\x55\x4e\x9b\x67\x3a\xf9\x96\xa0\xfd\x16\xdf\x9b\xb4"
+ "\x1f\xff\x8f\x72\x8e\x24\xa0\x1f\x22\xdf\x14\x15\xd7\xba\x49\xc8"
+ "\xdf\x4d\x78\xe9\x5b\x8f\x4e\xcc\x5f\xed\x64\x5d\xac\x32\x8e\xce"
+ "\x22\x71\xd2\x3e\x9f\x98\x46\xe7\xfe\x30\x6b\x11\xd1\xf4\xa3\x87"
+ "\xad\xa3\x7b\xe1\x84\x19\xc2\xea\xfb\xe7\x89\x7e\x94\x4e\xf3\x42"
+ "\x62\x3e\xec\xae\x56\x3b\x4c\xcf\x53\xe8\xa2\x18\x03\x79\x4b\x7c"
+ "\x6e\xa7\x58\x83\xde\x53\xac\x2e\x61\x6e\x8a\x39\x10\xd6\xa1\xb4"
+ "\x81\xda\x27\xda\xf5\x23\xad\xba\x5d\xf4\xee\x3e\xb6\x44\xf0\x60"
+ "\xf5\x7a\xd0\xf1\x33\x7b\xbc\xf4\x9e\x63\x3a\x6f\x0b\xb5\x99\xb7"
+ "\x85\xfb\x58\xec\x23\x3c\xb7\xa3\x0e\xf1\x74\x07\xe2\xc2\xf1\xcf"
+ "\xb4\x76\xa1\x4f\x77\xb5\x86\xfa\x86\x05\x75\xb3\x01\xc7\xaa\xa3"
+ "\x4b\x7d\xec\x38\xe2\xfc\x54\xcc\xb1\xfd\x88\xce\xfe\x08\xcb\x74"
+ "\xa3\xee\x46\xc5\x54\x52\x9f\x6c\x2b\x21\x7f\xcb\x61\x2f\x47\xd8"
+ "\x4e\x84\x39\x2c\xc3\x1e\xe6\xe7\x12\x8a\xdf\xe1\xf4\x8b\xfd\x58"
+ "\x2d\xd2\xd1\x49\xf3\xbe\xc8\xe7\x32\xe5\x19\xc7\xf8\x38\x4e\xfc"
+ "\x51\x0d\xdb\x16\x53\x19\x9c\x96\xf3\x0d\xd4\x9f\x79\xcf\xb1\x6e"
+ "\xac\xe7\x2a\xd2\xa3\xd2\xf5\x30\x0a\x75\xf2\xf3\x4d\x1b\xe1\x0a"
+ "\xd2\x31\x16\xad\xab\x16\x7c\x4f\x4b\x65\x16\x8c\x3d\xd1\xa3\x9a"
+ "\xd6\xc2\x35\x68\x43\x55\x27\x21\x6d\xfa\xe2\x12\x03\xd2\x0a\xb0"
+ "\xe3\x34\x50\x8c\xf2\x19\xc2\xef\xb4\x79\xbe\x80\xfa\xd3\xa4\x8b"
+ "\x69\x79\x8a\x2e\xe2\xbd\xe9\x42\xbe\x02\xfb\x19\x83\x98\xa3\x48"
+ "\xfb\x94\xde\x49\x1c\x87\xb4\x36\x6a\xaf\x58\x03\x9d\xf6\x1e\x3b"
+ "\xc7\x12\x18\xef\xd3\xdc\xe8\xa7\xd3\x9c\xf8\x6b\xe0\x17\xfa\x12"
+ "\xf9\x59\x8f\x70\x4d\xec\x9c\x97\x60\x0c\x98\x66\x65\x16\x0d\xd9"
+ "\x49\x0d\xd6\xdd\x6d\x87\x45\x2d\x42\x36\x69\x2d\x84\x2b\x04\x0d"
+ "\x7a\xc6\xf7\xb9\xfd\x0a\xdb\x3b\xf9\x41\xc3\x26\x9a\xe3\x9c\x3c"
+ "\x8e\xdb\x05\xe2\xaa\x97\x84\xcf\xf6\x21\xad\x75\x16\x5f\x01\xfa"
+ "\xe7\x02\xdf\xf6\x11\x19\xfc\x5e\xce\x63\x72\x3f\x1a\x14\x7f\x65"
+ "\x5c\x2b\x3f\x2b\x11\x26\xf3\x73\x41\x7d\xa8\xf7\xd6\xab\x4f\xd2"
+ "\xf3\xdb\xf4\xec\x8c\x1a\x99\x61\xab\x36\x8a\x73\x1a\x11\x46\x8c"
+ "\xe3\x27\xbf\xdd\x83\x75\xb8\x2c\x93\x9b\xed\x30\xa3\x41\xbc\x9f"
+ "\x19\x99\x11\xf2\xfb\x28\xb4\x01\xb2\x39\x61\xd3\x53\x9e\x3d\xdc"
+ "\x40\xf6\xe7\x86\x1e\x9d\xdb\x20\xfb\x5f\x9a\xcf\x89\x3a\x0e\x53"
+ "\xb6\x1c\x8e\xe7\xfa\x2d\x31\xe9\x6e\xbd\xdf\x59\x6e\x98\x37\xf8"
+ "\xba\x3b\x1d\xaf\x6c\xbc\x72\xe5\xe7\x42\xbc\xb0\xcd\x77\xb7\xe3"
+ "\x73\x31\xe7\xdd\xae\x3c\x8d\x1d\xf3\x7a\x30\x66\xa7\x67\x3b\xdc"
+ "\x3d\x8b\xed\x4a\x94\x94\xfb\xfa\x97\x69\x9e\xe0\x6e\xb3\x1d\x26"
+ "\x83\x90\xc5\x14\xbe\x76\x07\x69\x23\xbe\xb3\xd2\x6a\xe6\x6e\xdd"
+ "\xe4\x44\xba\xef\x6e\x6a\xad\x76\x82\xe1\x46\x6a\xff\xdd\x7b\xa8"
+ "\x4d\xb4\x86\x85\x7e\x57\x57\x33\xc7\x81\x1a\x0f\xd0\xbb\x3c\xc4"
+ "\x85\xf6\x5f\x9f\x28\xe6\x32\xe2\x1c\x84\x4f\xd6\x09\xa6\xb4\x5f"
+ "\xf0\x79\x64\x86\x61\xad\x86\x9e\x47\xd4\xbd\xc4\xe7\x61\x3c\xac"
+ "\x34\x47\x5e\xbb\x30\x25\x02\xed\x7c\x0a\x9d\xf3\x78\x1a\xa6\xcc"
+ "\x66\xc8\xeb\x03\x05\xfc\xcc\x28\x07\xf6\x3f\xdd\x75\x7c\xbd\xd1"
+ "\x14\xf4\x7f\x93\x73\xf9\xbb\x19\x4c\xe7\xbe\x06\x71\x6e\xc7\x3c"
+ "\xec\x8f\xba\x0f\x17\xb8\xc1\x4b\x6d\xc6\xb2\xef\x9f\x73\x6b\x63"
+ "\x8b\x41\xb3\xc9\x84\x7e\x07\xe9\x60\x28\x2b\xe1\xcb\xee\xb6\x6f"
+ "\x3c\xc5\xdc\x4a\x9b\x0f\x34\x90\x7d\x4c\xd9\x62\x87\xd7\x8f\x86"
+ "\xb4\x89\xfe\x76\x18\x5f\x3d\x90\x28\xe4\xe8\x43\x5e\xf9\xcb\xd1"
+ "\xd8\x20\x64\x38\xe5\xa8\xbf\x0c\x8d\x58\x83\x11\x35\xc1\x38\x11"
+ "\xaf\x74\xf9\x59\x7d\xe9\x54\xf7\x28\x57\x63\xa5\xcb\x62\x8c\x43"
+ "\xfb\x28\x11\xb2\xa1\x74\xd4\x67\xd2\x9b\x2f\xb1\xef\xe9\xcb\x01"
+ "\x7a\xdf\x4b\xe9\xa4\xe3\x94\xee\xc3\xf8\x06\x9f\x93\x30\x5f\x4f"
+ "\xf6\x4b\xe7\x6f\xa9\xf3\xfb\xcf\x59\x00\xe3\x7a\xc2\x15\xbb\xb9"
+ "\xbc\x9c\x74\x17\x61\x92\x63\x3d\xe5\xe5\x58\xdf\x16\x85\xaf\x98"
+ "\x56\x48\xf9\xa4\xa7\x98\x5e\x63\x87\x37\xf8\xfa\x05\x27\x8e\x01"
+ "\x83\xc7\x1e\x46\x6b\x7f\x8c\xa6\x73\x97\x91\x2c\xbb\xe1\x9e\x43"
+ "\xe8\xc7\xb0\x1f\x1f\x61\x14\xfd\xcf\x3d\x74\xf6\x93\x06\xfd\xe7"
+ "\xe7\x78\xdf\x76\x18\xfd\x54\xef\xf6\x70\x73\x9f\x04\xc3\x7b\x25"
+ "\x30\x7a\xb6\x1b\x2b\x3d\x91\xde\x2d\xb6\xae\x7d\x70\xc4\xf3\x0e"
+ "\x18\x96\x73\x1c\xbf\xa1\x73\xe0\x4a\xd7\x33\xef\xde\xde\x26\xad"
+ "\xcd\x73\xc6\xca\xcf\x5c\x85\x7b\x38\x3f\x9e\x3f\x8e\x51\xc0\x22"
+ "\x8e\x5b\xf0\x27\xca\x58\xb0\x7d\x29\xf3\x6c\x3f\x41\x7b\xc3\xc7"
+ "\x47\x6e\xeb\x85\xe4\x57\x36\x40\x6a\x4d\x2f\x24\xd6\xf5\x42\x12"
+ "\xfb\x73\x92\x54\x83\x71\xdc\xa2\xb3\x7a\x3a\x8b\x3c\x27\xc6\x04"
+ "\xba\xba\x0d\x18\xcf\x79\x40\xe3\xdd\x86\xf1\x9c\x07\xe3\xb9\x33"
+ "\x49\xe4\x2f\xfb\xe3\xb9\x3e\x8a\x95\x2b\x23\xb4\xe2\xac\xd0\x08"
+ "\x3a\x2b\x4a\x13\x95\x0b\x7a\xa4\xaf\xf4\x34\xdc\xa3\x89\xea\xc4"
+ "\x58\x12\xdb\x6c\x97\xdb\x8b\xbf\x71\xb1\x05\x30\x9c\xb7\x15\x7d"
+ "\x38\xdb\x36\xc2\x18\xb2\x6f\x96\x48\xa7\x9c\x64\x4b\xd8\x86\xa9"
+ "\xa3\xe8\x9d\xf3\xbe\xab\xdd\xda\xd5\x35\xcc\x4d\xe9\xc5\x63\x98"
+ "\x1b\xd3\xf9\x9e\xfe\xcd\x98\xee\xb2\x4c\x4d\xb2\x4b\x5f\x86\x8c"
+ "\x01\x71\xcc\x24\xfb\x9a\xa9\xaf\x33\xa9\x8c\x74\xd4\xba\xd1\x83"
+ "\xf1\xf8\x69\xb2\xe3\xa9\x4d\x99\x85\xcc\x63\x58\x49\xef\xff\xa7"
+ "\x56\xd3\xda\x04\x7a\x27\xf9\x4b\x8c\x75\xbe\x6e\x3d\x02\xf5\x21"
+ "\x34\x7e\x88\x2d\x44\x9c\x15\x6e\x2b\xc3\x31\xfb\xc5\xc6\xf5\xb4"
+ "\xfe\x4c\x7c\x6b\x3a\xb5\xd3\x0e\x2b\xf9\xba\x0f\xfe\x7d\x0e\xf7"
+ "\xa7\xd3\x5a\x9d\xc8\x03\x7f\x1f\x30\xad\x9a\xf6\x29\xef\xa9\x1c"
+ "\xa6\xb5\x8e\x26\xdf\x3f\xed\x05\x11\x0f\x0e\x93\xfb\x82\x69\x4f"
+ "\x89\xf7\x07\xd3\x26\xda\x61\x2e\xef\xe3\x4d\x63\x49\x27\xa6\x15"
+ "\xb2\x98\x61\x61\x04\x37\xbe\x0c\xca\x56\x79\x20\x97\x6d\x1b\x06"
+ "\x8c\xdb\xca\x69\x60\x3f\x7d\xd2\x45\xdf\xdc\x38\xaf\x5a\xe0\xc2"
+ "\xd8\xa0\x15\xf3\xb4\x54\x87\x03\x61\x90\xef\x11\x62\xed\xc2\xb4"
+ "\x72\x3b\x3c\x20\xfb\xc3\x69\x0b\xc5\x1c\xf3\xb4\x85\x3d\x58\x16"
+ "\x63\xc5\xcb\x31\x1f\xe3\xdf\x27\xa3\xe4\x77\xdc\x8e\x67\xf8\xb7"
+ "\xa2\xd3\xf6\xdb\xa1\x30\x8b\xd2\x8a\xc7\x40\x7c\xb1\x81\x75\x85"
+ "\x8c\xf5\xfc\xda\x39\xfd\x1e\xbe\x0e\x4f\x82\xab\x5c\x96\x74\x50"
+ "\xf0\x62\x7f\xfb\x46\x8f\xf4\xe0\x83\x98\x16\xa7\xe0\x45\x98\x2b"
+ "\xf0\x39\xb1\x1f\x46\x94\x99\xa8\x2a\xf3\x60\x8f\x74\xf3\x1b\x98"
+ "\x96\x11\x50\x26\x27\xa0\x4c\x81\xaa\x4c\x99\x5c\x4f\x49\x40\x99"
+ "\xca\x80\x32\x35\x41\x68\x6b\x0e\x28\x63\x0d\x28\xd3\x1e\x84\xb6"
+ "\xce\x80\x32\x4e\xff\x32\xd3\xb5\x2a\xde\xd2\x7a\xa2\x54\x4c\x8b"
+ "\xf7\x2f\x33\x3d\x29\xa0\xcc\x24\xe5\x19\x63\xcf\x1c\x11\x1b\xa0"
+ "\x3e\xa1\x4c\x51\xae\x68\x2f\xd3\xb1\xfd\x0f\x16\x5e\x20\xfe\xc6"
+ "\xb1\x61\xb8\xa7\xb4\x56\x9c\x9b\x4b\x7e\x95\xd6\x1f\x90\x3f\xa7"
+ "\x77\x26\xa4\x13\x14\x77\x52\x5d\x27\x60\xc6\xb3\xa4\x43\x88\x73"
+ "\xcf\x60\x7e\x4c\xb7\x06\xd0\xd9\x1e\x40\xa7\x7d\x30\x3f\xa6\x3b"
+ "\xfd\xcb\xcc\xd0\xfa\x97\x99\x11\xa7\x2a\xd3\x20\xea\x99\x91\x14"
+ "\x50\x66\x52\x40\x99\x8c\xc1\xfa\x39\x63\x61\x40\x99\xc2\x80\x32"
+ "\x25\x03\x3c\x9c\xc1\xbf\x0d\x27\x7b\xc0\x74\x1c\xff\xcc\xdb\x7f"
+ "\x01\xde\xe9\x15\x7d\x56\xbe\x9d\x16\x7a\x7d\xef\xa8\x9d\xe2\xbb"
+ "\x39\x7e\x46\x41\x27\xdc\x9b\xa2\xbc\x5b\xde\xdd\xeb\x0e\xa7\x77"
+ "\x9e\xc8\xdb\xae\x03\x66\x37\xf6\xb9\x33\xb0\x0f\x9e\x9d\xaa\xac"
+ "\x2d\xa1\xf5\x38\xfc\x8c\x1b\x3e\x1e\x99\xd1\x21\xec\xef\x5e\xe5"
+ "\x9d\x0e\xb5\x07\xc7\x19\xf7\x26\x7f\x43\xba\x0e\x13\x5d\x74\xd6"
+ "\x03\xe2\x30\xf5\x8f\x35\xfa\x69\xa5\x3a\xef\xfd\xa3\x42\x6b\xbd"
+ "\x58\x13\x44\x6b\x85\x1d\x74\xfe\x06\x96\x69\x54\x8d\x4f\x88\x56"
+ "\xe7\xbe\x0d\x6e\xad\x3f\xcd\xf7\x6e\x91\x69\xee\x10\x3e\xea\xde"
+ "\x0e\xc5\x9f\x84\xd4\xbf\xca\xb8\xa6\x23\x35\x00\xb4\xe6\xe1\x70"
+ "\x0d\xc6\x9b\x38\xc6\x22\xba\x8f\x43\x86\x81\xc7\xbf\x2b\x7b\x81"
+ "\xee\x6d\x25\x77\xf1\x35\x11\xa2\x2d\x19\x39\x74\xce\x32\xc5\x3e"
+ "\xad\xa6\xaf\x68\x5d\x1e\xe3\x67\x2e\x41\xc6\xb3\x07\x4a\x1c\x48"
+ "\x6b\x46\x96\xb2\x7e\xc8\x0e\x19\x22\xae\xab\x8c\x6b\xa0\xf5\x1a"
+ "\xb4\xb6\xe9\x80\x73\x12\xc1\x14\x23\x9d\xca\xda\xe9\x6e\x3a\xb3"
+ "\x19\x61\x93\x43\x8d\x95\xd4\x7c\x15\x34\xdc\xf7\xa5\xd0\x9f\x8c"
+ "\xfd\xfe\xf6\x10\x8e\x7a\x9a\xd1\xee\xaf\x73\x19\x76\x7f\x9d\xcb"
+ "\x70\xf8\xdb\x83\x84\xf6\x30\x53\xeb\x5f\x66\x66\x9c\x7f\x99\x99"
+ "\x89\xaa\x32\x55\xa2\x9e\x99\x93\x02\xca\x64\x04\x94\x51\xfb\x3f"
+ "\x6c\xf3\xcc\x82\xfe\x71\x27\xf7\xf7\x33\xcd\xaa\x67\x69\x27\xef"
+ "\xa7\x66\x56\x2a\x69\xf2\x77\xc9\x7c\xad\x94\x8c\xaf\x29\xc0\x47"
+ "\x11\xfc\xfe\x00\x1a\x0e\x05\xd0\x70\x4c\x79\x96\xd7\x57\xfc\x16"
+ "\x79\x37\x46\xd6\x33\x67\xec\x66\x78\x20\xd6\x33\xf7\x61\x8a\xcd"
+ "\xa8\x7f\xe2\x6b\xd8\x36\x62\x4c\x79\x16\xf4\xb4\x76\xf0\x44\x31"
+ "\x84\xd1\x39\x30\x76\xb8\x3f\x9b\x45\x47\x10\x4c\x37\xc6\x53\x99"
+ "\x27\x60\x66\x37\xd6\x5f\x8d\x75\x20\xef\xee\x33\xfa\xd3\x70\x5f"
+ "\x96\x3f\x0d\xf7\xe5\xaa\x9e\xf5\xf8\x6c\x52\xb5\x5b\x4f\xfb\x44"
+ "\xbc\xc8\x63\xeb\xfb\xca\x95\x74\x9a\x03\xc0\x36\x76\x95\xf2\x38"
+ "\xc0\x48\xeb\x06\x47\x1e\x87\xfb\xd6\xd0\x7c\x81\x8c\x73\x9f\x9a"
+ "\xb7\x82\x17\xf7\xb5\x05\xd0\xd1\x11\x40\x47\xd7\x80\xaf\x99\xd9"
+ "\x2d\x6c\xe4\x3e\xbc\x9f\x9f\x44\x69\xc8\x0b\x43\xac\xc7\x70\xb9"
+ "\x75\x2c\xc5\xa9\xf7\xcf\x74\x62\x7b\xd9\x73\xd2\x48\xf9\x79\x36"
+ "\xc3\x98\x01\x63\x31\x3a\xbb\x97\xbe\x9d\xbd\x0e\xd3\xb2\x85\x5c"
+ "\xef\xc7\xf6\xcf\x33\x0a\xbc\xf7\xf3\x77\xfb\x04\x8b\xf7\x06\x16"
+ "\x1d\xd7\x12\x4a\x9f\x7b\x62\xe2\x9a\x95\x35\xb6\x88\x63\x8b\x62"
+ "\x0f\xbe\xed\x71\xcd\xbe\x6d\xb1\x6e\x4c\xab\x46\x9b\xa8\x12\x63"
+ "\x9a\xd8\x74\xd4\x7d\x1a\x7f\xe3\x18\x78\x96\x3c\x96\x89\x6b\xa5"
+ "\xb5\x83\xb4\x7f\x05\xfa\xcc\x28\xb1\x36\xe3\xfe\x43\x2a\xbb\x72"
+ "\x1a\x36\x4c\x61\xc7\x61\xd6\x0b\x14\xdb\x91\xdf\xa0\x35\x88\x07"
+ "\x3c\x0e\xa0\x79\x16\x9b\xe7\x24\x8f\xc9\x31\xbf\x4a\x94\x9d\xa5"
+ "\x53\x95\x75\xc8\xf3\x20\x5d\x94\x37\xc1\x03\xda\x03\x4e\x07\xc5"
+ "\x2a\x71\x22\x8e\x9f\xf5\xc2\x01\xf4\x17\x58\x26\x4d\x29\x43\x73"
+ "\x26\xfc\xbd\x7f\x31\x68\xc7\x97\x80\xd6\xba\xe1\x38\xc7\x2d\xbf"
+ "\x73\xe6\xe3\x23\x5b\x49\x17\xd8\x9c\x1d\x14\x53\x6a\xc5\xba\xad"
+ "\x59\x55\x61\x6e\xd0\xf5\x6c\x8b\x6b\xb0\xe3\xbd\x77\x5b\x5c\x13"
+ "\xd2\x86\xfd\xd9\xfd\xfb\xc8\x07\xaa\x79\x37\x7d\x7a\xd6\xdc\xcc"
+ "\xd9\x29\x0f\xcd\x9d\x99\x3d\xfd\x2e\x43\xf6\xb2\x15\xf9\x79\x29"
+ "\xab\xd6\x14\x1b\xd6\x15\x2d\x2b\x5e\xb6\xf2\x09\x7e\x0c\x98\x61"
+ "\x49\xb1\xf8\x4d\x2a\x5c\xb2\xba\x78\x32\xdd\x26\x1b\x4c\x45\xf9"
+ "\x6b\xf9\xed\xb8\x48\xf0\x47\xb2\xac\x38\xbf\xc8\x70\x43\x5e\xb2"
+ "\x61\xc6\x92\x65\x85\xf4\x15\x43\x30\x5c\x77\x19\x8a\xf2\x8b\xf2"
+ "\x97\xe4\x19\x26\x1b\x52\x09\xb3\x1a\x9d\x4a\x9e\xa9\x8a\x7f\x5a"
+ "\x8d\xfd\x39\xc6\xd0\x5d\xe4\xa7\xa8\x5f\x3f\x01\x99\x6b\x28\x86"
+ "\xe3\xe7\x76\xa1\x1e\x62\x9f\x60\x77\x59\x66\x17\x0f\xee\xc7\x67"
+ "\x97\xfb\xeb\xef\xec\x6a\x7f\xfd\x9d\xdd\x34\xb8\x1f\x9f\x1d\x60"
+ "\xff\xb3\x03\xec\x7f\xf6\xb1\xc1\xfd\xf8\x6c\x87\x7f\x99\x39\xe0"
+ "\x5f\x66\x8e\xbe\xdf\xcf\x20\xad\xcf\x70\xbf\x34\x27\x31\xa0\xcc"
+ "\xc4\x80\x32\xe9\x01\xcf\xd9\xaa\x67\x8c\x5d\xe7\xe4\xa9\x63\x03"
+ "\x7c\x2e\x56\x6c\x7d\xc0\xbf\xcd\x29\x57\x60\xa8\xef\xa1\x6f\x5d"
+ "\x64\xd8\x06\x15\x6c\x97\x0c\xdb\x6f\xff\xe4\x93\x68\xed\xa6\x88"
+ "\xcf\x33\x6f\x90\x7d\x5b\xe7\x8e\x81\x3e\xb4\x13\x65\x71\xdd\x69"
+ "\x98\xf3\x42\xbd\x80\x75\xd0\x7a\x5e\xf6\xd3\x05\xae\xfa\x91\xa0"
+ "\xa3\xb2\x74\x6e\x15\xb3\xcc\xaa\xa1\xf5\xe3\x98\x16\x85\x17\xfa"
+ "\xa9\xcc\x78\x65\xed\xfc\x16\x84\xb1\x43\x26\xd7\x65\x2a\xb7\x85"
+ "\xaf\x3b\xe4\xf5\xbd\x40\xdf\x58\xd1\x59\x70\x3b\xc4\x1e\x12\x9d"
+ "\x74\x9e\x1a\xd5\x8d\x38\xb4\x4c\x9a\xf5\xb9\x7c\x2e\x96\x1e\xaf"
+ "\x38\xc4\x59\xa8\xe0\x44\x7c\xfc\x5c\x46\x8a\xf9\x28\xd6\x13\x71"
+ "\x4f\x66\xa5\x12\x5f\xd0\x58\x21\x98\xef\x08\xbe\x36\x1b\x62\x77"
+ "\x58\x7c\x1d\xd6\x4d\x9d\x44\xd3\x7e\x8a\x43\x6d\xf1\x1e\x38\x52"
+ "\xe3\xc1\xf1\x2b\xe8\xf9\x78\xca\x7c\x0a\x6c\x0d\x1e\xa0\xf9\xe1"
+ "\xc5\x66\x28\xab\x97\x7c\x1d\xac\xbf\x1c\x8d\xd1\x32\x9d\x44\xcf"
+ "\x16\x4a\xc7\xf2\x38\x96\x70\xd0\x1a\xee\x10\xf3\x11\xb1\x04\x67"
+ "\x1d\x4b\xe3\xbd\xac\x64\x39\xf6\x2d\xaf\x47\x5c\x41\xd7\x17\x4b"
+ "\x60\x73\x59\xb2\xb0\xff\x5b\xd7\xae\xf8\xec\x03\xd5\xdc\xf7\x49"
+ "\x98\x8e\xe3\xd7\xcc\xe6\x50\x71\x8a\xec\xdf\x4d\xb4\xae\x0c\x61"
+ "\xf7\x5c\x08\x96\xe8\x3e\x80\xed\x66\xdb\x87\xe9\x76\x6f\x4a\x0d"
+ "\x97\xfd\xab\x0e\xcb\x75\x2a\xe5\x2e\xa6\x7d\x14\x1b\x51\x7f\x8c"
+ "\xb6\xea\x14\x63\xc5\xb9\x0f\xbf\xc8\xd7\x2c\x3f\x80\xf1\x5f\x96"
+ "\x62\x07\x97\xe1\x33\xfa\xbf\x2c\x3e\x9f\xc8\xd7\xf5\xe0\x78\x72"
+ "\xb5\x09\x63\xb6\x78\x27\xfa\xc6\x07\x72\x94\x3c\x3e\x4f\x44\x79"
+ "\x25\xcc\x7d\x20\xbe\x93\xf2\x8a\xfb\xf3\xc4\x37\x04\xec\x80\xd9"
+ "\x43\xe9\x95\x4a\xba\xe8\x5b\x1e\xa8\x09\x78\xde\xa3\x3c\xe3\x7d"
+ "\x0b\xde\x1b\x64\xfc\x0e\xf4\xb9\x1a\xb1\xe7\xc2\xdc\x51\x75\xdc"
+ "\x6e\x1e\xe8\x50\xf2\xf9\x9c\xda\xab\xf4\x6e\xcc\x09\xbe\x98\x61"
+ "\x3a\x1e\x73\x61\x99\xbd\x5f\xb9\xc3\x71\x8c\xa1\x61\x74\x86\x2a"
+ "\xa6\x11\x1e\xb2\x19\x7e\x96\x3d\x3e\x1f\x87\x07\x0e\xd1\x77\x0e"
+ "\xa4\x23\xeb\x3c\x90\x60\xba\x9b\xe6\x9f\xe7\x72\xbd\xa5\x34\xc2"
+ "\x4b\xf8\xa8\x4f\x24\xdc\x84\x6f\x3b\xc5\xb4\x7c\xbd\xe4\x5c\x6a"
+ "\x7f\x65\x28\x59\x61\xbe\x59\xc5\xcb\x70\x7c\x2e\xf7\x6f\xeb\xdc"
+ "\xea\x80\xe7\x26\xe5\x99\xe6\x7a\x85\xee\xcd\xad\x91\xf3\x5a\x2f"
+ "\x54\xd7\x58\xfe\x8d\xcc\xdc\xae\x80\xfa\xdc\xfe\xf8\xe7\xe9\x02"
+ "\x9e\xe3\x95\xe7\x9d\xfc\x1d\xc3\xbc\x24\xa5\x0e\x2e\x33\xd4\xb1"
+ "\xc6\x4d\x8e\xf0\x0b\xed\x65\x82\x65\x16\xaa\xea\x1c\x86\xcf\x85"
+ "\x03\xf2\x9b\x67\x56\xf0\xe1\xfd\x16\x15\x1c\xc6\x25\xf3\x76\x2a"
+ "\x70\xe2\xfd\xc6\xbc\x46\x55\xb9\xe6\xaf\x69\x6b\x80\xee\x66\x7b"
+ "\x85\xee\xce\xeb\x0a\xa0\xc5\x3d\x80\x33\x5b\x3b\x40\x4b\xb6\x5e"
+ "\x05\x87\xf6\x99\x6d\x08\xd4\xd5\xd5\x66\xd2\x71\xd2\xd7\xec\xb4"
+ "\x20\x79\x6e\x39\x2f\x27\xb8\x8e\x67\x9b\x54\xe9\xf2\xf8\x28\xfb"
+ "\x13\x39\x4e\x20\xff\xec\xec\x29\xcd\x56\xce\x53\xe5\x3a\x49\xfb"
+ "\x88\x4d\x10\x67\x77\xa3\x5e\x67\x37\x07\xe2\x15\xdf\xdf\xc8\x38"
+ "\x06\x70\x96\x89\x18\x2f\xdb\xae\x6a\x5b\xb7\x1d\xe6\x2a\xef\x89"
+ "\x1c\x62\x6e\x70\xde\xb1\x50\xe3\x0e\x97\xe5\xc1\x04\x7f\x9e\x3d"
+ "\x98\x3c\xc0\xb3\x07\x27\x0d\xe0\x7d\x30\x5d\x05\xf7\x5f\xf8\x9c"
+ "\xad\x82\xcb\xfd\x3a\xdd\x14\xba\xf2\x60\x79\x40\x5d\xd5\x2a\x1c"
+ "\x8d\xaa\xba\x9a\x55\x70\x1d\xf8\x6c\x0d\x2d\x9f\x07\x8f\x85\x96"
+ "\xcf\x83\xee\xe0\xf2\x99\xaf\x1f\xa8\x77\x7e\xc2\xd7\xdb\xd5\x7c"
+ "\xa3\x8a\x9e\x7a\x7c\xce\xf2\xb7\xa3\xf9\xb9\x01\xcf\xfd\xf2\x67"
+ "\xe8\x3b\x1a\x37\x18\xc3\x29\xbd\x78\x0c\xe8\x85\x9d\xcd\xaf\x52"
+ "\xe7\xef\xed\x15\xf9\x44\x23\x7f\x07\x47\xef\x37\x05\x5c\x4b\x20"
+ "\x1c\xc1\xa8\xf2\x3b\x14\xda\xb1\xbf\x0e\x7a\xf6\xa7\xd2\xff\xd9"
+ "\x7c\xd4\xff\xcd\xe7\xfd\x1f\xdb\x36\x3c\x8d\x59\x3e\xc8\x09\xd5"
+ "\x97\xb9\x2c\x0f\xa5\xe2\x98\xa1\x4b\xf0\xe7\x21\xd4\xff\x95\x3c"
+ "\x36\x61\x95\xc3\xd3\x50\x9f\x7a\x4f\xc0\x43\x9f\xe0\x6f\x1f\xfe"
+ "\xbe\xe7\xdf\xbf\x3e\x94\xcd\x2c\x9a\x79\xf5\x96\xc0\x7e\xf7\xa1"
+ "\x42\x1c\x7b\xf4\xc6\x7a\xca\x72\x82\xe4\x95\x33\x4b\xd8\xdc\x20"
+ "\xe9\x0d\x28\xaf\x5e\x3b\x3c\x74\x94\xe8\x55\xa5\xb7\x30\x4b\x4c"
+ "\x36\xc1\xdb\xa9\x3e\x2c\x13\x4a\x6e\xca\x77\x50\x42\xf7\x72\xb4"
+ "\x01\xed\x38\x7f\x02\x72\x36\x8b\x76\xe4\x7c\xea\x5f\x77\x4e\x42"
+ "\xf0\x76\xe4\x4c\xc4\x76\x9c\x0f\xde\x8e\x9c\x2c\xce\x5b\x09\xdb"
+ "\x32\x28\xee\xc8\x29\xc4\xb6\x9c\xe7\x7c\xf7\x4f\xdf\xa2\x8c\x53"
+ "\x4b\xcf\x03\xbd\x17\xe2\x65\xe7\x95\x0c\xc8\x4d\x86\xdb\x13\x5b"
+ "\x0d\x59\x41\xea\x6c\x65\x96\xe1\xf3\xec\x90\xe3\x51\xfa\x2b\x39"
+ "\xfd\x98\xa0\x05\xf9\x24\x11\x9f\xb0\x3d\x58\x2e\x94\xbc\x15\xfb"
+ "\x14\xef\x99\x1e\x46\xfb\x7f\xc8\xae\xf4\xe9\xd8\x9f\x3b\x14\x3e"
+ "\x62\x5e\x46\x40\x9e\x5b\x95\x97\xe7\x97\xb7\xb1\x3f\xbd\x44\x49"
+ "\xbf\x38\x39\x3d\xbc\x27\x40\x4e\x28\x9f\x47\x26\xfb\xb7\xfb\xe1"
+ "\xfd\xa2\x7d\x28\xa3\x41\xbc\x7e\xb8\x03\x65\xd4\x17\x5c\x46\x0f"
+ "\x3b\x83\xeb\xda\x23\x51\x1c\xdf\x48\x08\x82\xef\x91\x24\x94\x5d"
+ "\x1f\xd7\x41\x59\x4e\x83\xe5\xf3\xc8\x2c\x45\x3e\x17\xd7\xc6\x47"
+ "\xaa\x02\xda\xe8\x3d\x01\x0b\xa2\x45\x5b\x17\x3c\x1a\x80\xbb\x29"
+ "\xb8\x2e\x3e\x62\xc5\x76\x7a\x83\xb7\xf3\x91\x63\xa1\x75\xf1\x11"
+ "\x7a\x57\xe7\x1d\xac\x8b\x0b\xf4\xa2\x0c\x04\x29\xb3\x20\x99\x59"
+ "\x82\xd5\xb3\x20\x9d\xe2\x22\x3b\x2c\x28\xa1\xf7\x74\xaa\xf4\x85"
+ "\xfe\xfa\x87\x6d\xa0\x72\xc4\x3f\x8f\x18\xc7\x90\x1c\x4e\x18\x40"
+ "\xfa\x3a\x9d\x74\x59\x16\xec\x0f\xe0\xd5\x99\x13\xb0\x70\x72\x8f"
+ "\x24\xcd\x10\xfc\x7a\x54\x13\x40\x53\x47\x70\x7e\x2d\x70\x20\xbf"
+ "\xce\x04\xe7\xd7\xc2\xa8\xd0\xfc\x5a\x48\xf2\x3f\x33\x98\x5f\x0b"
+ "\x8d\x6a\x7e\xf9\x2c\xa2\x7d\xd7\xc7\xa3\x6e\xf4\x2d\x66\xf5\xc2"
+ "\x97\xeb\x63\x51\x57\x44\x99\x6e\x2a\x53\x1c\xeb\x16\x7a\x62\xb8"
+ "\x1a\x74\xa7\x61\xe1\x42\xc5\xfe\x63\xaa\x61\x38\xeb\x5b\x40\x6b"
+ "\xb4\xe9\x4c\x67\xbd\xcd\x7c\xc6\x6a\xf3\xa4\x02\xcd\x37\x06\xd4"
+ "\xdb\x12\xdc\x17\x2c\x6c\x47\x9e\xfe\x24\x48\x7a\x97\x98\x33\x7d"
+ "\xd4\xe0\xef\x23\x1e\x05\x7f\x19\x2d\xe0\xe5\xa0\x7f\xff\xd3\x0b"
+ "\x5f\x17\x96\xd9\xa3\xa6\xc1\x32\x5b\x34\x42\x96\xd7\x97\xfe\xf4"
+ "\x3d\x5a\x1e\x5c\x5e\x8f\x36\x84\x96\xd7\xa3\xfb\x43\xcb\xeb\x51"
+ "\x1a\xfb\x9c\xb1\xc3\x22\xbd\x7f\xbf\xf1\xa8\xc3\xbf\xbd\x58\x2f"
+ "\x96\x63\xd2\xb0\xcb\xe9\xf9\x62\xdb\xad\x5c\xe4\xe3\x48\x56\xf4"
+ "\xfd\x3f\xd2\x3f\x86\x68\x1c\x2a\x8e\x90\xb8\x91\x87\x55\x1b\x42"
+ "\x9e\x13\x1e\x75\x04\xc7\x95\xb4\x3e\xcf\x30\x9a\xe6\xca\x16\x7d"
+ "\xe1\x93\x34\x77\xe1\xbd\x74\x02\x72\xdf\xf6\x49\x61\x65\xb4\x96"
+ "\x8c\x7f\x3b\xc8\xdf\x4f\x2c\xf2\xa8\x65\x41\x6b\xca\xb6\x8b\xbd"
+ "\x1c\x69\x9e\xf3\xb3\x13\xb0\xf8\x59\x21\x97\xdc\x17\xfc\xf9\xb8"
+ "\xd8\x10\x5c\x2e\x8b\x27\xa1\x5c\x3e\x0b\x2e\x97\xc5\xd9\xa1\xe5"
+ "\xb2\xd8\x84\x72\xf9\x6c\xb0\x1d\x2d\x2e\x97\xed\xe8\x19\x2a\x63"
+ "\x58\x49\xf1\xea\xe2\xf3\x04\x83\xf7\x68\x23\x8b\x3f\xa7\xfc\x94"
+ "\x6e\xc5\x8e\x78\x19\x1a\xff\xf3\xfa\x65\x98\x16\x19\x87\x1a\xaf"
+ "\x3d\xb6\x3b\x98\x9d\x2c\xa6\xf7\xa9\x9a\xf1\x26\xd0\x21\x0f\x73"
+ "\x6a\x09\x47\x11\xc0\x69\xc8\x9d\x4d\x70\x94\x4e\x67\x2c\x0f\xc0"
+ "\xe7\x26\x29\x70\x7c\x5e\x54\xc0\x1a\x98\xab\x00\x08\xce\x1f\x77"
+ "\xae\xdc\xfe\xe1\xbc\x1f\x21\x78\x82\x0b\x80\x31\x0b\x7b\xcc\xdd"
+ "\xef\x6f\x8f\xb9\x55\xfe\xfa\xb9\x98\xde\x4f\xc4\xfa\xd0\xcf\xa1"
+ "\x2e\x77\x7a\x2d\x9a\xbb\x2e\x8d\x6d\x2e\x89\x0a\xb0\x4d\xd4\x81"
+ "\x25\x6f\x09\x1d\x58\xb2\xcd\x9f\xd6\x25\x89\xc1\x75\x60\x49\x5a"
+ "\x68\x1d\x58\x92\x13\x5a\x07\x96\x14\x93\x0e\xd8\x61\xc9\x1e\x7f"
+ "\xdb\x5c\x52\xe9\xdf\x76\xac\x97\xdb\x26\x8c\x18\x8a\x6d\x62\x2c"
+ "\x74\x79\x28\x3b\x94\xe3\x7f\x4d\x7d\x2f\xc0\x10\x78\xa6\x43\xbb"
+ "\x42\xfa\x1e\x33\xd2\x3b\x24\xf4\xf1\x05\xc4\xc3\x3a\x3e\x46\x7b"
+ "\x2c\x5b\xcd\xc7\xed\x62\xac\x55\x8a\xb0\x7f\xa4\x35\x7b\x82\x9f"
+ "\x8f\xbf\xea\xdf\xfe\xc7\x8a\x83\xf3\xf3\xb1\x4a\xe4\x67\x69\x70"
+ "\x7e\x3e\xd6\x14\x9a\x9f\x8f\xb5\xd2\xb7\xea\x83\x6d\xea\xb1\x63"
+ "\x86\xb5\x3c\x46\xe1\x65\x4e\xc3\xe3\xb7\x5f\x5c\xff\xf4\x78\x9c"
+ "\x7f\xff\xf4\x98\x67\xe8\xfd\xd3\xe3\x39\xc1\xfb\xa7\xc7\x4d\xc1"
+ "\xfb\xa7\xc7\xcb\x85\x3d\x3c\x6e\xf5\xb7\x87\xc7\x1b\xfc\x75\x02"
+ "\x79\x77\xc9\xfa\xa7\x3c\x7d\x80\x0d\xec\x38\x01\x79\x2f\x60\x4c"
+ "\x21\xfb\xc2\xfc\x07\xfd\x69\xcc\x4b\x0e\x2e\xb7\xbc\x74\x94\xdb"
+ "\x8e\xe0\x72\xcb\xcb\x0d\x2d\xb7\xbc\x12\x94\xdb\x8e\xc1\x72\xcb"
+ "\xdb\x39\xf4\x98\x22\xaf\xcd\x5f\x66\x79\xcd\x43\x97\x59\x7e\x54"
+ "\x70\x99\xe5\x27\x06\x97\x59\x7e\x9a\x90\x59\x7e\xb1\xbf\xcc\xf2"
+ "\xb3\xfd\x65\x86\x7c\xbb\x64\x32\xcb\x6f\x0d\x90\xd9\xaa\x13\xb0"
+ "\x74\x3a\xca\xac\x5d\xc8\xec\x89\x88\x00\x1a\xed\xc1\x65\x96\xef"
+ "\x46\x99\xad\x0a\x2e\xb3\xa5\x71\xa1\x65\xb6\x94\xf6\xd0\x58\x35"
+ "\x58\x66\x4b\x33\x86\x2e\xb3\xa5\x25\xfe\x32\x5b\x9a\x37\x74\x99"
+ "\x2d\xb5\x06\x97\xd9\xd2\x8e\xe0\x32\x5b\xea\x10\x32\x7b\x22\xc9"
+ "\x5f\x66\x4f\xe8\xfc\x65\x86\x7c\xfb\x96\x32\x43\xf9\x18\xc5\x7a"
+ "\xdd\x27\xb6\xf6\xf0\x39\xed\x27\xca\xec\x50\x20\x7f\xcf\x5e\xc0"
+ "\x75\x47\x96\xe1\x5e\x84\x29\x1e\xdc\x77\x3f\x51\x23\xa7\x3d\x34"
+ "\x58\x0e\x4f\xb4\x60\xbf\xda\xdd\x5a\xc2\xd7\x75\x09\x19\x12\xcf"
+ "\x11\x4e\xcc\x91\x3d\xc1\xfd\x3f\xca\x98\xd1\xbe\xc2\xd4\x17\x23"
+ "\xbc\x93\xf0\xd0\xbe\x2a\xfe\xb8\x0a\xb4\x43\x89\xcb\x42\xaf\x31"
+ "\x1f\x6e\xa4\xbd\xff\x4f\xc0\xb2\x51\x42\x57\x0b\x02\xe3\xdf\x7a"
+ "\xac\xeb\x94\xd0\xd3\xe5\x01\x73\x26\x05\x21\xe2\xdf\x02\x8a\x7f"
+ "\xeb\x83\xeb\x69\xc1\x05\xe2\xdf\x02\xe2\x47\xbd\x6a\xbc\x3a\x12"
+ "\x23\xc0\x80\xf1\x6a\x81\x27\xd6\x29\x74\x87\xc7\xb1\xdb\x86\x1b"
+ "\x5d\x96\x65\x89\x01\x34\xa3\x6c\x96\xbd\x2a\xd3\xfc\xb2\x7f\xf9"
+ "\x65\x69\xc1\x69\x5e\x96\x8d\x34\xef\x0d\x4e\xf3\x32\x53\x68\x9a"
+ "\x97\x55\x22\xcd\x7b\x07\xdb\xd6\xb2\x46\x59\x0f\x82\x8c\xcb\x97"
+ "\x59\x83\xcb\x7f\x59\x80\xfc\x21\xa7\xb8\x84\x39\x78\x79\x3f\xb8"
+ "\xe5\xa0\x86\xa3\xb5\xfa\x04\x4b\x3a\x12\x04\x36\x39\x10\x67\x08"
+ "\xb8\xec\x41\xba\x47\xdf\x16\x04\xd5\xbd\xe5\x65\xc2\x1e\x97\x77"
+ "\xf8\xdb\xe3\xf2\x6a\x7f\x7b\x5c\x16\xc0\x93\xe5\x2d\xfe\xf9\x05"
+ "\xe5\x97\xce\xc7\x3e\x99\x14\xa0\x03\x1f\x9c\x80\x27\x5f\x13\x3a"
+ "\xf0\xa4\xd7\x9f\x8e\x27\x8d\xc1\x75\xe0\xc9\x1c\x6c\xff\x07\xc1"
+ "\x75\xe0\xc9\xe2\xd0\x3a\xf0\x64\x15\xf2\xf2\x03\xb5\xde\xce\x2b"
+ "\x31\x0e\x0f\x80\xd9\x17\xdc\xe7\x3d\x79\x28\xf8\xbc\xce\x93\x9d"
+ "\x82\xc7\x85\x09\xfe\x3c\x7e\xd2\xe3\xcf\x43\x6c\xcb\xb7\xe7\x61"
+ "\xff\x59\x19\x2e\x4b\x61\xa0\xfd\xdb\x4e\x40\xa1\x6c\xff\x2b\xbe"
+ "\xf0\xa7\xb1\x50\x1e\xff\x04\x9b\xcb\x2a\x6c\x44\x5e\xda\x82\xf3"
+ "\xb2\xd0\x1a\xbc\xcd\x85\xd4\x07\xd9\x7c\x83\x6c\xa9\x90\xbe\x4b"
+ "\x9d\x47\xef\x0e\x68\x0e\xab\x0e\xd3\xe7\x79\x40\xc7\xfb\xab\xfe"
+ "\x7e\x69\x45\x1c\xcd\x91\xf3\x39\x66\xd4\xdf\xd8\x04\xc8\xa2\x3e"
+ "\x88\xe8\x5a\x5c\x12\xf8\x4e\x74\x85\x91\xe8\xa6\x75\x2c\xf4\x5d"
+ "\x4d\xac\x19\xb2\x6c\x4e\x0f\x28\xfa\x4e\xf0\x01\xb8\x4d\x64\x17"
+ "\x04\xaf\xc0\x8a\xb9\xce\xb2\x00\xdf\xb4\xa2\x3a\xb8\x8c\x57\x34"
+ "\x87\xd6\x9d\x15\x87\x84\x9c\x57\x82\xbf\x9c\x57\x74\xfa\x2c\x31"
+ "\xd9\xd4\x56\xd4\x81\x21\xd9\x09\xbd\x3b\x0d\xe9\xef\x9f\x59\xd0"
+ "\x61\xda\x04\xa3\x4f\xc2\xca\x02\x5e\x9f\xc4\x30\xa6\xd0\x40\x2b"
+ "\xf7\x01\x2b\xdf\xe7\x74\x22\xcc\x62\x0f\x48\xec\x99\x27\x3b\x28"
+ "\xaf\xde\xc2\xdc\x74\x6e\x8c\x72\x06\x0c\xea\xc2\xe5\xc7\x61\xe5"
+ "\x66\xbf\xf2\xd8\x1b\xd9\x04\x8e\xfd\x62\x7e\x7f\x65\x8b\x32\x0f"
+ "\x1f\x6a\x7e\x1f\x61\x8e\x29\xeb\x7e\xc5\xbb\xb0\x95\xed\x21\xfb"
+ "\x65\xa4\x89\xbe\x1d\x27\x9a\x2e\xec\x07\x56\xa5\x2a\xfa\x2b\xde"
+ "\xcd\xad\x32\x0e\x7c\xdb\xb2\x6a\x16\xe6\x39\x2f\x30\x9f\xab\xb2"
+ "\x83\x55\x66\x35\x1e\x71\x5e\xcc\xaa\x4a\xe5\xfb\x14\xbc\xaf\xfe"
+ "\x1a\x5c\x0a\x3d\xd6\x00\x7a\xda\x71\xbc\xe0\x94\x71\x1c\xfb\x1a"
+ "\x1c\x71\xb6\xc6\xbb\x60\xbc\x0f\xc2\x4e\x42\xd1\x38\x3a\x7f\xc6"
+ "\x56\xd3\x05\x51\x1e\xd0\x8a\xb1\x9d\xe9\x56\xfa\x36\x84\xc6\x86"
+ "\x36\xcf\x14\x2b\xbd\x83\xe3\x6b\x08\xe2\xa7\x58\x0f\x9b\xbd\xf2"
+ "\x1e\x6c\xa6\x7b\x88\xa7\x87\x0b\xce\x58\x6b\x5e\x62\x5d\xb5\x7c"
+ "\xef\x2d\x93\xdf\xf8\xaf\x92\xd6\xff\xd0\x3a\x8c\x4d\x30\x05\xe1"
+ "\xff\x28\x6c\xbd\x28\x20\x26\x35\x85\x18\xff\x99\x68\xfc\x37\x25"
+ "\xb8\x9d\x9b\x2e\x30\xfe\x33\xd1\xf8\x6f\x8a\xba\xdf\x14\xef\x79"
+ "\x4c\xc7\xd4\x31\x29\xed\x8f\x65\x58\x4a\x71\xe6\x53\x0f\xdc\xb2"
+ "\x13\xf4\x1e\x7a\xa7\x8d\xb6\x69\xeb\x6a\x25\x7b\xd5\x1f\x76\xb4"
+ "\xd0\x3e\x0c\xba\x18\x13\xe9\x22\xf5\x65\x64\xaf\x4f\x19\x78\x5f"
+ "\xe6\x11\xb6\x58\x6a\x66\x8e\xe4\x4e\xd4\xa1\x55\x05\x0a\xae\xa8"
+ "\x8d\x05\xe2\xbb\x8f\x98\x4e\x18\x6e\xeb\xe2\xfd\xa2\x86\xe2\x55"
+ "\x1e\xb7\x7a\xce\x02\xe1\x3d\x50\x72\x18\x08\xaf\xaf\xbf\x9f\xe4"
+ "\xb8\x4b\xc8\xc6\x09\x27\xe1\x3e\x82\x70\x84\x97\xe0\x94\x76\x88"
+ "\x6f\x63\x9e\x6a\x54\xb7\x9d\xcf\xbf\x60\xdd\x98\xfe\x39\xcd\xab"
+ "\xd8\xa8\x5c\xe9\x02\x36\xbe\x93\xde\x99\x9d\xb1\xb2\xd2\x27\xd9"
+ "\xf8\x22\x9a\x13\x2b\xa2\x73\x9f\x35\x7b\xff\x64\x0f\x2f\x1e\x03"
+ "\x3a\x91\xf6\x54\x77\xab\xc1\x0d\x76\x28\x4a\xf5\xf7\x11\x45\x01"
+ "\xf1\xaf\x89\x8f\x33\xf1\x57\x4b\xeb\x13\xe5\xf5\xab\xe4\x0f\x98"
+ "\xcd\xe3\xe2\xfa\x71\xa1\x35\x15\xf4\x4e\x9a\xd6\x44\x89\xfd\xdf"
+ "\x8a\xcc\x01\x73\x6f\x8e\xed\x7c\x5d\xcd\xff\x60\xbd\xab\xc3\x85"
+ "\x8e\x14\x87\xfb\xcb\xb4\xa8\xba\xf4\x14\xbd\x0b\x12\xfd\xc1\x22"
+ "\x4f\xa0\x7f\x2c\x6a\x51\x62\xb7\x80\xf4\x76\xa5\x3f\x30\xac\x24"
+ "\xbc\xab\x03\xfa\x99\x22\x1e\xff\x7b\x07\xf5\x0b\xab\xc9\xaf\xfb"
+ "\xe9\xe4\x11\xae\x43\xab\x0d\x87\x9d\xa8\x37\x45\xa4\xff\xab\x5f"
+ "\x46\x98\xcd\xf4\xcd\x21\x3e\x0f\x3f\x0d\xab\xb3\xbc\x16\xd0\x1d"
+ "\x76\xf0\x6f\xaa\xf4\xa8\x23\x5c\x6f\xa9\xdf\x98\x20\xd6\x23\x39"
+ "\x03\xea\x28\x54\x78\x4e\x30\x47\x8a\xfe\x07\xc4\x7a\x0a\xd2\x85"
+ "\xd5\x46\x5a\x9b\x11\xd3\xcd\xf7\xda\xd2\x2b\x3a\x64\xf3\x74\xc0"
+ "\x11\x4f\xe0\x98\x67\xf5\xbe\xe0\x6d\x5f\x4d\xfd\xff\x4f\xec\x50"
+ "\x9c\xe8\x2f\xdb\xd5\xbc\xff\x57\xde\xeb\xa0\xec\x1d\xfe\xe5\x8a"
+ "\xb5\xfe\xb2\x2f\xaa\xa6\xfc\x90\x6b\x7c\x2a\x87\xa7\xe3\x78\x66"
+ "\xb1\x93\xaf\xf7\x2a\x46\xfb\x2f\xca\xbe\x90\x1f\x64\x51\xc3\xd3"
+ "\x7d\x08\x2b\xaf\x0b\x46\xbf\x55\x5c\xee\x37\x67\x74\x25\x9f\x33"
+ "\x5a\x7c\x02\xd6\xc8\xef\x7e\xd6\x1c\x0e\xa0\xaf\x31\x74\x6c\x50"
+ "\x4c\xef\x7f\x16\x07\xf7\x19\xc5\xc7\x82\xc7\x06\xc5\x4e\xd9\x2f"
+ "\x2c\x66\xd1\x81\x7a\xb0\x86\xbe\xa7\xe3\x65\x94\x31\x2c\xcd\x85"
+ "\x86\x1e\xc3\xae\x31\xf6\x8f\x61\x8b\xc8\x1f\xac\x49\xea\x1f\xc3"
+ "\x3a\x82\x8d\x61\xed\x41\xe4\xb9\x66\x4b\x70\x79\xae\xa9\x09\x3e"
+ "\x86\x5d\xb3\x4f\xf4\xf3\x6b\xba\xfc\xe5\xbc\xe6\xd0\xc0\x3b\xe1"
+ "\xe2\xc6\x4b\x17\x0f\xaf\x9d\x34\x38\x1e\x5e\xfb\x6b\x21\xab\xb5"
+ "\x67\xfd\x69\x5b\x9b\x15\xdc\xb7\xaf\x2d\x08\x1d\x0f\xaf\xdd\x12"
+ "\xda\xb7\xaf\x6d\x18\x1c\x0f\x1b\x86\x05\xc0\xb4\xf6\xc7\x4a\x7e"
+ "\xb1\xd9\xda\x63\x82\x4f\xeb\x28\x9e\x0b\x53\xc1\x3b\xfd\xf5\x1d"
+ "\x69\x46\x7c\xe8\xdb\x4e\x92\x4f\x53\x74\x26\x14\x4f\x68\xef\xa5"
+ "\xeb\x77\x42\x04\xda\xc0\x07\x2e\xcb\xba\x7e\xfd\xa7\x75\x7c\x54"
+ "\x0f\xf9\xc8\x90\xeb\xe9\x24\x85\x3e\xa2\x63\x5d\xc9\x85\xde\x97"
+ "\x86\xc5\x43\xd6\x8b\x83\xf8\xb1\x8e\xc7\x7f\x84\xe3\xc2\x32\x5b"
+ "\xd7\x1d\x60\x63\x4e\xb1\x0e\xd7\xfc\x9e\x90\x9b\x39\x60\x2c\x6b"
+ "\xd6\xf1\x6f\xfa\x42\xfa\x5b\x73\x52\x70\x1d\x35\x1b\xfb\xfd\x6d"
+ "\x11\xc7\xbb\x3e\x20\x3f\x57\xc8\xc0\xdc\xe2\x8b\x56\xcf\x75\x9b"
+ "\xcd\xfe\x3e\xc9\x9c\x1b\x50\x2e\x60\xfc\x67\xe6\xf4\x5c\x5c\x7f"
+ "\x63\xee\x0a\xdd\xdf\xac\x5f\x23\xda\xbf\x21\xe0\xfd\xf2\x7a\xdd"
+ "\x85\xfb\x9b\xf5\x21\xda\xbf\xde\xe8\xdf\xdf\x6c\x08\x78\x47\xbf"
+ "\x3e\x37\x78\x7f\xb3\xde\xac\xf8\x19\xe1\x37\xd6\xff\xfe\xe2\xfc"
+ "\xcd\xfa\x66\x7f\x7f\xb3\xbe\xfa\xeb\xfc\xcd\x81\x41\xfe\x66\xbd"
+ "\x33\xb6\x26\x58\x5b\x36\x44\x05\xf7\x37\x1b\x12\x85\x0c\x37\x94"
+ "\xf8\xfb\x9b\x0d\x69\xfe\x32\x5c\x1f\x20\xc3\x0d\x01\xef\xbf\xd7"
+ "\xeb\xbe\xa9\x4f\x0a\x0b\x0b\x93\xc2\x34\x92\x26\x0c\xb3\xb0\x79"
+ "\x30\x3c\x4c\x1b\x16\x8e\xd7\x30\xf9\x77\xb8\x14\x26\x69\xf1\xfa"
+ "\xff\x89\xfb\x1e\xe8\xa8\xaa\x6b\xef\x33\x93\x09\x4c\x70\x32\x13"
+ "\x42\x8c\x23\x7f\x64\x50\xb0\x51\x41\xa2\xe2\xf7\x51\xc4\x1a\x2b"
+ "\xbe\x87\x6f\xa1\xa4\x14\x6b\xda\x87\x26\x68\x62\x43\x45\x98\x26"
+ "\x01\x02\x86\x4c\x18\x22\x8d\x9a\x7f\x6a\xc4\x00\x21\x44\xa5\x2d"
+ "\xb4\xa8\xb1\xc6\x36\xf6\xa1\x8e\x12\x7d\x51\x43\x26\x5a\x6c\xa3"
+ "\x0f\xdb\x21\x0d\x31\xa4\x01\x46\x32\x49\x86\x64\xe6\x9e\x6f\xff"
+ "\xce\xb9\x77\x66\x12\x13\x2c\xef\xbd\xb5\x3e\xd6\x0a\x73\xef\xb9"
+ "\xe7\xef\x3e\xfb\xec\xb3\xf7\x3e\xfb\xec\x1d\xad\xfe\x4e\x18\xf5"
+ "\x3e\x11\x65\xe9\xcf\xa0\xfe\x46\x8f\x7a\x9f\xf0\x2d\xdf\x27\xaa"
+ "\xed\x6a\xed\x1b\x46\xbd\x47\x7f\xcb\xf7\x09\xff\xc3\xf2\xec\x1b"
+ "\xef\x23\xef\x41\xde\xb5\x6e\xe3\xea\xb5\x6b\x32\x85\x5d\x7b\x96"
+ "\x6d\xf5\x43\x0f\x65\xe5\xe6\xda\xf2\xd6\xdb\xbe\x7f\xfb\x8a\x1b"
+ "\x17\xd9\xa4\x79\xfc\xda\x5b\xe7\x64\x4e\x62\x77\x6f\xca\xc1\x87"
+ "\xbb\x7f\x78\x57\x9a\x2d\xf5\xfb\xb7\x8f\xfc\xa8\x55\x23\xcc\xe0"
+ "\x2f\x54\x4b\xc4\xda\x4b\x79\x22\x91\xb1\xd2\x9d\x82\xee\x74\xe2"
+ "\xee\xb9\x94\x27\x8a\x3e\x6f\xc1\xfd\xe5\x21\x07\xc7\xbd\x8a\x0e"
+ "\x56\xb0\x15\x83\x98\x57\x57\xc4\xec\x0f\xc2\x9f\x4a\xc1\x2e\xfe"
+ "\xb6\x97\xd9\xfe\x8d\xe9\x3b\xd8\xe3\xa7\x9a\x96\x52\x5e\x7a\x77"
+ "\x7b\x02\xcc\xe6\x00\x6f\x5b\xf4\x04\x7d\xd3\xf1\xef\x29\x94\xe6"
+ "\x53\xef\x64\x3a\x76\x89\xb4\xb7\x8b\xb4\x7c\x96\x2e\xb6\xf5\x56"
+ "\xfe\x36\x17\xef\xf0\x59\x23\xf3\x6d\x9d\xcc\xf5\x8f\xb5\x81\x2e"
+ "\xd4\xc4\x33\x03\xec\xb2\x77\xc5\x33\xe3\xae\x44\xf8\xdc\xdd\x6a"
+ "\xd0\xec\xb2\x9f\xa0\x77\x0f\x7b\xbc\x1b\x6d\x23\xaf\xa2\x7f\x6c"
+ "\x08\xf9\x6b\x47\xe6\x5f\x10\xb6\xe3\xde\x6a\xd0\x53\xbe\xe5\x27"
+ "\x98\xc5\x12\xe4\x5f\xfb\x27\x05\xf3\xaf\x5f\x4a\x7c\x1a\x4d\x45"
+ "\x4b\xa0\x88\xc9\xbb\x51\x5b\xb7\x6e\x0e\xf2\x00\x7c\x26\xdc\xdd"
+ "\xeb\xe0\x15\x8f\x32\x03\xad\x67\x9d\x2b\x07\x77\x29\xb6\x66\xee"
+ "\xcb\x62\x06\x1a\xff\xf4\x1e\x56\x58\x65\xbb\x87\xf8\xc6\xbb\x99"
+ "\xe1\xa3\xfc\x22\xc6\xcb\x8d\xbb\xcb\x3f\x65\x86\xdf\x0e\x15\xe9"
+ "\x87\xb8\x95\x15\xe4\xf1\x6e\x0e\x3f\xdc\x3e\xee\x87\xbd\x6d\x4b"
+ "\x46\x10\x79\x9e\x1c\x74\x58\x59\x2b\xb1\x2f\x5b\x8f\x73\x7f\xc9"
+ "\xa7\xd2\x5f\xc5\xd1\x5e\x1f\xee\xcf\x1a\xb7\xde\xcd\xa2\xba\xd2"
+ "\x98\xfe\x68\x76\x35\x73\xaf\xf2\xb1\x82\xe3\xbc\xbb\x25\xe3\x24"
+ "\x6b\xcd\xae\x67\xe9\xed\x4c\xdf\xd2\xf9\x25\x13\xbe\xa4\xcb\x53"
+ "\x8a\x0a\xfb\x99\x75\xeb\x1a\xa4\xf5\xb3\x2d\x5b\x59\xec\x96\xcf"
+ "\x20\x07\xb5\x53\x3b\xa7\xd9\x4f\x8e\x31\x1d\xd5\xa7\x7f\xec\x4b"
+ "\x66\x7d\xec\xc7\xb8\x67\x9e\xc2\x6a\x0a\x99\x95\x3b\x92\x4c\x43"
+ "\x8e\xa4\xb8\x21\x9e\x14\x3f\xe8\x48\x4a\x68\xb5\x53\xfe\xce\xb7"
+ "\x98\xb9\x9d\x25\xbc\xdd\xd3\xae\xaf\x3e\xc7\xa6\x63\x4c\x5d\x34"
+ "\xb6\x9a\x73\x94\xbf\x3c\x91\x29\x54\x36\xb2\x4c\x20\x36\xd1\xea"
+ "\x4e\xf3\x33\x85\xea\xaa\x1e\x62\xd3\x6b\x86\x98\x55\x29\x4b\x64"
+ "\x28\xd7\xcb\x1c\x4f\xbb\x5b\x18\x61\x0a\x0f\x0e\x97\x47\xe7\x13"
+ "\x3d\x9c\xf8\xea\x83\x8d\x06\x77\x4b\x2f\x3b\xea\x1b\x62\xad\xec"
+ "\x0b\xe6\xce\xff\xca\xf5\xdb\x07\x1b\xa3\x89\x9f\xd4\xb9\xb6\xc0"
+ "\x06\x5e\xe2\x8e\xe3\x28\xfc\xe7\x15\xb1\x8a\x42\x66\xb2\x6f\x61"
+ "\x13\x7b\x28\x5d\xd0\x9e\x12\x7f\x91\x3b\xf0\x95\x6b\x8b\xb8\x0f"
+ "\xfe\x78\x77\xe1\x51\x16\xd5\xea\xab\xc6\xbd\x63\x7d\xd0\x9c\x52"
+ "\xe4\xf6\xb5\x31\xb7\xfd\x6f\x2e\xc5\x94\x92\x5d\xaa\x30\xe3\xcb"
+ "\x03\x6d\x7a\xb7\x61\x80\xb9\xd3\x7c\xec\x1d\x6a\x9b\x97\xa7\x94"
+ "\x12\xcd\x4a\x69\xf5\xf9\xe1\x7f\x27\x99\xf7\x59\x27\x55\xe4\xb0"
+ "\xb9\xb5\xe7\xd8\xec\xbd\xe7\x58\x12\x1f\x4c\xd2\xe3\x8e\x37\xfc"
+ "\xa5\xed\xa5\x5f\x13\xc9\x60\x34\x76\x79\x8f\x3b\x56\xbd\xeb\x3d"
+ "\x9c\xc4\xf6\x0d\x85\xef\x7a\x0f\xf5\x85\xef\x7a\x13\x4e\x19\x71"
+ "\xdf\xdb\xc3\x0a\x6b\x2c\x2d\x6c\x22\xad\x13\x17\xf0\xbb\xe2\x0c"
+ "\x33\x6c\x3f\xc3\xd8\xf5\x45\x7a\xc8\x99\x06\x5a\x0f\x5b\xdd\x34"
+ "\x37\x78\xee\x60\x45\x0b\xe8\xd7\x44\x7f\x24\xcf\x15\x09\x5f\x15"
+ "\x9d\x2a\x1e\x53\x9a\x9e\xd2\x66\xd0\x6f\x14\xfd\x5e\xea\xa8\xe1"
+ "\x5e\x6a\x2b\x8d\x78\x95\x49\xc0\x67\xf5\x7e\x79\xda\xa0\xb3\xc8"
+ "\xe4\x61\x87\xd6\x6a\x78\x2d\xe9\xfb\x56\xe3\x3b\x1d\xa7\xe1\xef"
+ "\xdd\x2b\xfa\x35\x9c\xad\x83\xef\x77\x35\x1d\x7d\xd8\x80\x76\xa9"
+ "\xfd\x34\xfa\xb5\x48\x19\xd4\xd1\xab\x95\xed\x1b\xce\x46\x9b\x8f"
+ "\x52\x3a\xd7\xd2\x69\xdc\x06\x7c\x7b\xbd\xe3\xb4\x5e\xe6\x49\xd2"
+ "\x53\x9d\x7e\xb5\x7e\x5a\xfb\x05\x87\xb0\xc6\xfb\xf4\x16\x7e\x24"
+ "\x63\x01\xab\xd9\xc9\x5b\xf6\xee\xe4\x4d\x72\xed\x15\xd5\x7b\xd8"
+ "\x2b\xc2\xf7\x24\xed\xe1\x4d\xa5\xf4\xed\x08\x49\xe3\x80\x4b\x53"
+ "\x26\xec\x4b\x8b\xda\x3c\xec\xca\x84\xc8\x31\x70\xe7\x96\x7a\xec"
+ "\xa3\xaf\x14\x36\x93\x3c\xf9\x58\x7d\x6b\x67\x2f\xfb\xed\x50\x77"
+ "\xb4\xe3\x43\xa6\x77\x07\x3a\xd8\xfc\x04\x19\x27\x67\xdf\x4e\xee"
+ "\x79\x16\xf1\x83\x77\xf2\x5e\xc2\x97\x19\x3d\x6c\xdb\x8c\xeb\x12"
+ "\x58\xc2\xc7\xc4\x95\x48\xfa\xb4\xed\xe6\x08\xfa\xf4\xd6\x51\x4f"
+ "\x63\x04\x6d\x7a\xfc\xd1\x6f\xd2\xa6\xe2\x35\x92\x36\xd1\xda\x17"
+ "\xb4\x28\xe8\x51\xd3\xef\x1d\x95\xae\xde\x5f\x29\xfe\xee\xa8\x74"
+ "\xbf\x9a\x3e\x67\x54\xba\x57\xa6\x6f\xcf\xd2\x68\x5f\x2b\xfa\xb1"
+ "\x09\xb4\x6f\xfb\x5d\xa0\x7d\xad\x19\x2a\xed\x13\xf4\x67\xfb\x3c"
+ "\xfe\x22\xd1\xa2\x8d\xa0\x37\xdb\xa3\xd1\x7f\xfe\x36\xd3\xfa\x1e"
+ "\xd3\xc5\x9c\xef\x23\xad\xf2\x0b\x66\xa0\x3f\x95\xee\x15\x5c\x06"
+ "\xba\x07\x9a\x07\xda\xb7\x27\x91\xb7\xef\xd9\xc9\x8f\xd5\x08\xbf"
+ "\xd5\xce\x10\xfd\x7b\x8a\xd2\x4a\x29\xed\x29\xfa\x0e\x3a\x08\x98"
+ "\x1c\x4d\x6b\x64\x22\xae\x4d\xa9\xb1\x5a\xd1\x27\xb3\x72\x9a\x6f"
+ "\xf8\xbf\x2a\x26\xf8\x5a\x74\xcc\xee\xce\xf3\x89\x7b\x28\xf0\x95"
+ "\xde\x9a\xd7\x89\x75\x97\xb8\x5d\x81\x9e\xe2\x24\x2b\xf4\xf1\x1e"
+ "\xdc\x55\x41\x1f\xd2\x37\xff\x1b\x7c\x7d\xeb\x9a\xb2\x19\x83\x5f"
+ "\x02\xd0\x6c\xea\x8b\xa1\x92\xfa\x24\x7d\x0b\x3b\x0f\x7b\xd8\xdf"
+ "\x54\x7c\x7d\x1c\x77\xd5\x68\x4f\x21\x41\xdc\x49\xf4\x91\xc6\x66"
+ "\x09\x16\x31\xf8\x66\x41\x7c\x4d\xfc\xee\xd1\x2b\xd9\x95\x9a\x7f"
+ "\x16\x27\xd1\x06\xca\xe3\x6e\xf7\x33\xf4\xd9\xc3\x9c\xcb\x8e\x16"
+ "\x34\x52\xf9\x6d\x5e\xc0\x86\x3b\x1d\x5a\x1d\x3a\x51\x87\x5e\xe8"
+ "\x6e\xb3\x29\x9f\x47\x94\x37\x47\xe7\x1f\x5d\xe5\x65\xa0\xfb\xee"
+ "\x6e\xaa\xa3\xa0\x43\xd6\x41\x75\x71\xda\x03\x46\x7c\x53\xeb\x8f"
+ "\xdd\xca\xbf\xa6\xfa\x0f\x63\xbe\xe0\xa7\x0b\x76\x4a\x04\x17\x13"
+ "\x7c\x35\x48\x3e\xd4\x79\xe7\xbe\x2f\x18\x53\x7d\x8d\x11\xbe\x39"
+ "\x97\xc0\x97\x17\xfc\x8b\x5d\xc8\xb7\x18\xc1\x68\xb6\xe6\x5f\x4c"
+ "\xd9\xf4\xbf\xeb\x5b\x8c\xea\xb6\xd6\xea\x39\xad\x39\xe7\x12\xf8"
+ "\x17\xa3\xfe\xef\x07\x1e\xaa\x63\x5a\xfa\xdc\x4f\x00\xf3\x6d\xa5"
+ "\x48\xab\x70\xf2\x66\x6d\xfe\x31\x5e\x8c\x85\xbe\xd9\x25\x7f\xc8"
+ "\x69\x5d\x16\x2f\xc5\x77\x4a\x5b\x85\xfc\xf3\x89\x8e\xb9\x69\x0f"
+ "\x7b\xb5\x23\xa8\xaf\xd8\xc2\x0c\x92\xa6\x3d\xbe\x1a\xe5\x25\x4d"
+ "\x7b\xdc\x1a\xa6\x69\x8f\xc7\x4a\x9a\x26\x61\x2c\x69\xda\xe3\x3a"
+ "\x49\xd3\x8a\xcf\x0b\x7b\x22\xa2\x69\xf8\x06\xba\xa6\xd1\xb4\xbd"
+ "\x89\xbc\x19\xb4\x63\xd0\x59\xdc\xad\xd1\xb6\x32\x4a\x03\xed\x40"
+ "\x1f\x25\x9d\xda\x9e\xc2\xff\x2b\x89\x49\x7b\x4d\x3c\x67\xc3\x7f"
+ "\x46\xb7\xfa\x8c\xfd\xe4\xc7\x92\xc6\x3d\xbe\x38\x4c\xe3\x8a\x5d"
+ "\xe1\xb2\xa0\x71\x8f\xff\x40\xd2\x38\x99\xbe\xef\x27\xa0\x71\xdb"
+ "\x53\x00\x03\xb5\x7e\x3d\xce\xd1\xd4\xfc\x80\xe3\xd2\x48\x1a\x37"
+ "\x72\x7d\x3d\x5e\xa5\xd1\x38\xd0\x36\x7a\xdf\xef\x61\xb3\x84\x5e"
+ "\x18\xeb\xac\x8a\x60\xae\xad\x3b\xcc\x01\xc6\x8c\xf8\x01\x80\xdb"
+ "\x1d\xa7\xd9\x44\xd5\x6f\x8d\x3a\xee\xc7\x3d\xda\x1d\x4d\x82\xff"
+ "\x37\x7d\x9a\xb1\xb0\x5f\x32\x9a\xeb\x99\xf0\xe7\xe8\x2e\xea\x60"
+ "\xee\x6a\x5e\xd4\x1a\x38\xce\x94\xed\x8f\x9c\xc0\xbc\x92\xbc\x71"
+ "\x0b\x7e\x41\x77\x7a\xd8\x8e\x59\xe9\x3e\xa1\xbf\x3f\x51\xa1\xa7"
+ "\x6f\xf9\x23\xbe\xdd\x8a\x36\xa0\x57\xa4\x67\xe3\x78\x7a\x84\x8b"
+ "\x68\xab\xec\x02\x6d\x1d\x14\x6d\x11\x2f\x45\x72\xcf\xe4\x33\x6c"
+ "\x87\x38\x43\x13\x3e\x99\xc7\xae\xeb\x73\xf5\x7b\xd4\x38\xdf\xcf"
+ "\x5f\xb8\xfc\x2f\x2e\xbf\x70\xf9\x5f\x7c\x17\x34\x08\xf7\xf1\x82"
+ "\xce\x91\xf5\x98\x03\x5a\xbe\x1e\xe4\x5b\xad\x9e\x83\x9c\x70\xcc"
+ "\x12\x72\x99\x55\xab\x13\x78\x57\x4e\xf9\x84\xff\x5a\xa2\x91\x4b"
+ "\x36\x33\xf8\x0e\x8e\x2c\xbb\x37\x0c\xdf\x5f\xa4\x5e\x40\x4f\x63"
+ "\x72\x93\x14\x88\xf8\xf2\x47\x68\x17\xc4\x5d\x9a\xaa\xd0\xd9\xc3"
+ "\x2f\x7c\x44\x2f\x45\xfc\x56\xf5\xde\x6e\x2f\xd1\xb7\x99\xf0\xb1"
+ "\x09\xbe\x52\xbd\x6b\x71\x19\xd1\xe5\x78\xf8\x61\x81\xbe\x3a\x3d"
+ "\x98\xaa\x3f\x22\xfc\xef\x97\x24\x6b\x65\xc7\xd3\xed\xa1\x5d\xb5"
+ "\x4d\x71\x0f\x89\xca\x64\x6a\x65\x50\x37\xee\xde\xd0\x7e\x3c\x53"
+ "\xf8\x37\x0b\xf4\x82\x06\x5e\x46\x3c\x68\xbc\x6c\x27\x83\xa9\xed"
+ "\x54\x7b\xd8\x8e\xcc\x0b\xdd\x73\x1a\x7f\x7c\x25\xc7\x2e\x7e\x7c"
+ "\x4c\x1d\xdf\x13\x71\xdf\x32\xbe\x0b\xb4\xfb\xc4\xb2\x8b\x6f\x37"
+ "\x4e\x6b\xb7\xe4\xe2\xe1\xfa\xc4\xe1\x7f\x1e\xae\xc9\x2a\x5c\x9f"
+ "\xf0\x7e\x0b\x5c\xc7\x68\xe7\xc9\xd9\xff\x7c\x3b\x36\xb5\x9d\x27"
+ "\xd3\xc6\x6a\x87\x89\x7f\xe3\xfa\xeb\x31\x6a\x31\x62\xd4\xb8\xc4"
+ "\x31\x54\x4f\x9d\x87\x95\x84\x62\x0f\xcb\x78\x49\x4f\x36\x78\xd8"
+ "\x13\x55\x23\xef\x71\x3d\xf9\x49\x7a\x1d\xf6\x75\xae\x78\xd8\x93"
+ "\xc7\xa0\x6b\x5b\xb2\x55\xfa\x07\x54\xcb\x10\x3d\x7f\x62\xfa\x85"
+ "\xce\xd3\x44\x2c\x0c\xd5\x77\x07\xee\xa7\xf2\xf2\x04\x4f\x9f\x23"
+ "\x9b\xc9\x58\xd1\x4f\xdd\x80\x7b\x48\xf4\x3c\x91\x9e\xa5\x1e\x0a"
+ "\xf1\x05\xa4\x4f\x8a\x09\x94\xb6\x0d\xf1\x27\xe4\xfd\xbd\xa7\x56"
+ "\x52\x1f\xf2\x85\xae\x49\xf8\xd8\x17\xbe\x5d\x7c\x94\x4f\x8f\xb2"
+ "\xd2\xa7\xc7\x53\xf9\x5a\x1e\x8f\x56\x5f\xc8\xbf\xc5\x53\x77\xc9"
+ "\xbd\xe5\xa9\xa5\x7d\xe3\xc4\x31\x82\x9f\xb3\xfd\x85\xc9\x23\xee"
+ "\x1f\xde\x99\x93\xb3\x3e\x67\x91\x2d\xf7\xd1\x07\xe7\xe5\xe6\xad"
+ "\xce\xdb\x90\x2b\x2e\xaa\x4f\x62\x94\x60\xcb\x5b\xf3\x68\xd6\xfa"
+ "\x0d\x79\x49\x9b\x56\xaf\x91\x17\xdb\xaf\xa1\x8c\x91\x99\xd8\xc8"
+ "\xb8\x91\x44\x83\xda\xb8\x5e\xf8\xa0\x10\xb1\x23\xe1\x8b\x44\xbb"
+ "\xb7\xdb\x64\x15\x31\xb6\x88\x66\x95\x2e\xf6\xb0\xf5\xdd\xda\x3c"
+ "\xc0\x3f\x22\xf1\x2d\xd6\x1e\x56\xfa\x63\xe0\xce\x72\x62\x41\xf7"
+ "\x49\xbf\x12\xc2\x37\x80\x3b\x8f\x12\x5a\x99\xd1\xb5\x11\x7a\xd8"
+ "\xd2\x36\xc5\xf9\x94\x4b\xf8\x7b\xdc\xd2\x83\xf7\x7e\x8d\x4f\xc0"
+ "\xb9\x92\x3c\x07\x9e\x79\x5b\x07\x2b\x9d\x83\x76\xb1\xee\x6a\x9f"
+ "\x91\xb1\xba\xb9\xf3\xa9\x76\xdc\xd5\xa6\x77\x23\xf5\xc1\xa5\xf1"
+ "\xa2\xd4\x5f\x13\x8f\x4d\xa0\x79\x2e\xf5\xbd\x17\xe7\x65\xea\x5d"
+ "\x6f\x63\xad\xbc\xd7\x6d\xa0\xbc\xbd\xa1\xbc\x4e\xca\x5b\x96\xd0"
+ "\x4d\xfb\xe6\x98\x67\xd9\xdc\x1c\x9f\xad\x0c\xa7\x45\x47\x8e\x99"
+ "\xe4\x6a\x9a\xbf\xb2\x5f\xd2\xd8\x13\x34\x5c\x91\x73\x5f\x56\x26"
+ "\x7c\x2f\x97\xc7\x67\x53\xda\x04\xfa\x2d\xea\xa3\x6f\xf0\x81\x40"
+ "\xdf\x32\x70\x46\xd6\x5a\x70\xd6\x75\xc4\xda\x41\xf3\x5e\x66\xf7"
+ "\xb0\x8d\xd3\xe5\xbd\x35\xca\x4f\x6d\xb8\x8b\x86\x58\x93\x8d\xbb"
+ "\xa0\xa3\xf3\xb0\xb2\xc3\x4d\x36\x1f\xe3\x51\xff\x7e\x02\xe5\x68"
+ "\x5d\x59\x1d\xf9\xe0\x45\x28\x5d\xdc\xcf\x2b\xab\xd7\x60\x9e\x67"
+ "\xe3\xa7\x91\x67\x3c\xbd\x32\xf6\xcb\x0a\xb1\x97\x9c\x63\xb0\xc1"
+ "\xea\x64\x65\xc7\x46\xef\x17\x73\x32\x17\xd9\x32\x57\xe7\xd9\xd6"
+ "\xae\x59\x97\x65\xcb\x5c\x93\x69\x5b\xb7\x3e\xcf\xf6\xd3\xf5\x50"
+ "\xf0\x40\xa5\x33\x02\x27\x14\x8c\x6f\x53\x5a\xb4\x76\x86\xdd\xb7"
+ "\x29\x7b\x82\xc4\xe9\x8a\x79\x7d\x83\xd9\x13\x47\xc2\xa4\x62\xb2"
+ "\xdc\x2b\xcb\x33\xa8\xef\x06\x79\xff\x2f\xaa\x9b\xde\x69\xfc\x65"
+ "\xcd\x23\xd7\x6e\xc5\xfd\x6a\xde\x52\x2d\xaf\xc0\x8b\x2b\x7b\x42"
+ "\xdf\x2a\x54\x7c\xdc\x27\xef\x29\x0b\xbf\x37\xfb\x84\x0d\x7f\xb9"
+ "\x6b\xdc\x32\xf0\xf5\xb5\x85\x3d\x74\x86\x95\x1f\xe4\xce\x32\x9f"
+ "\x8a\x43\x46\xa5\x34\x3e\x5f\xc5\x1f\xc2\x89\x0a\xf6\x4d\xfc\xa9"
+ "\x58\x05\xfc\xe1\x83\x69\x46\x61\xef\x11\xf0\x13\x9d\xa3\x77\xda"
+ "\x9f\x3d\xac\x3c\x13\xe3\xf0\x6d\x4a\x33\x3a\x76\x09\xff\x7b\xa7"
+ "\x70\x76\x8a\xf8\x34\x84\x2b\x31\x32\x8e\x66\xc5\x4a\x6d\x8e\xb4"
+ "\xfc\x63\xaf\x61\x81\x2f\x23\x71\x4c\xc2\xf3\x65\x81\x63\xc4\x1f"
+ "\x50\x9f\xf4\x9a\x9f\x3f\xec\x21\xd4\xb7\xa6\xbc\xad\x9c\x53\x1b"
+ "\x8d\x11\x78\x70\x66\x2c\x3c\xa0\xb9\x7d\x68\xed\xfa\x87\x1e\xa1"
+ "\x85\x9e\x93\x95\xf7\x50\x36\x7c\x5b\x80\x0e\x08\xc7\x19\x73\x32"
+ "\x6d\x1b\x72\xb3\x1e\x9a\xc4\xc6\xca\x15\xfa\x18\x39\xff\x71\x0a"
+ "\xe1\x6b\x5f\x5f\x5a\x34\xee\x58\xc8\x3b\x15\x4f\x6f\xed\xcb\x25"
+ "\x59\x64\xc4\xbc\x3f\xfd\x73\xb7\x35\x99\x78\xba\x64\xe1\x3b\x0e"
+ "\x30\x93\x76\x02\x4f\xbf\x01\x38\xf4\xe9\x75\xb4\x9f\x54\xe6\x69"
+ "\x38\x40\xcf\x45\x34\xa6\xec\xb0\x8d\xc6\xd3\x0d\x7d\xfa\xe8\xe3"
+ "\xa0\x3f\xd2\x1e\xa4\x87\xe8\x80\x65\x5f\x07\xab\x14\xb6\x60\xb5"
+ "\x62\x3f\xaa\x6c\xd0\xca\x94\x87\xee\x39\x3f\x3d\x5d\xc3\x93\x88"
+ "\x32\xbf\x44\x9a\xf0\x75\xe4\xac\x68\xc3\x9c\x73\x39\xf7\x06\x2d"
+ "\x1f\xc1\x95\xef\x13\x74\xe4\x69\xe3\x68\xda\xf0\x5e\x1c\xce\xc4"
+ "\x65\x7f\x04\xfe\x99\xe2\x53\x85\xdf\x14\xe2\xf5\x3a\xd8\xd3\x97"
+ "\xaa\xf6\x29\x42\xa7\xe8\xce\xa7\xba\xfc\xb2\x2e\x6a\x6b\x40\x6b"
+ "\x8b\xc7\xc6\xa7\xee\x13\x78\xf6\x74\x76\x58\x67\xf8\x74\x02\x64"
+ "\x65\xde\x97\x36\xc1\xc3\x2a\x57\x0a\xdc\xa2\xe7\xbc\xcb\xa5\x0f"
+ "\x37\xe0\x1b\xc6\x09\xbc\x0a\xe3\xd4\xd3\x07\xb4\xf9\xc6\x98\xa9"
+ "\xdc\x2a\x9b\xf0\xf3\xfb\xb4\x4b\x83\xe5\x78\xbe\x66\xc4\xba\x35"
+ "\x51\x5f\x06\xe5\xda\x15\x72\x9e\xf4\x2f\x84\x7b\x2e\x51\xd4\xc7"
+ "\xfc\x2e\xf6\xcc\x27\xb0\xdd\xb7\xf8\x21\x37\xc5\x8b\x78\x70\x72"
+ "\x2f\x7b\xc6\x46\x38\x9c\x10\xbe\x9b\xfe\x0c\xf1\x7f\x95\x09\x72"
+ "\xee\x9e\x59\x1c\xb1\xf6\xbc\xaa\x3d\xc0\x44\xc0\x08\xf4\xcc\x9d"
+ "\x7f\xa7\x58\xaf\xf2\xde\xef\x33\xd9\x5a\x39\xe1\x67\x80\x70\x03"
+ "\x76\xb0\x67\xd8\x33\x25\xd8\x23\xd0\x3f\x0f\x7b\xc6\x88\xf6\x31"
+ "\x3e\xec\xd9\x02\x6f\xac\x88\x81\xf2\xcc\xfe\x51\x7d\x68\xd0\xea"
+ "\x52\xeb\x6e\xd2\xde\xe1\x77\xcc\xc3\xaa\x52\x11\x07\xf2\x88\x4f"
+ "\x8c\xe1\x92\x26\x92\x0a\x9a\x7c\x22\x5f\xaf\x06\x43\x4a\x2f\xa2"
+ "\x77\x9a\x8b\x52\x26\xcf\x84\x12\xd4\x78\x53\x55\x88\x61\xca\x1d"
+ "\x36\xf8\x25\x5c\x2c\xe9\x8d\xf0\xa5\x23\xbe\xc5\xa8\x6b\x36\x06"
+ "\x77\x84\x84\x5d\x8c\x2f\x20\x68\x83\xf4\xbd\x40\xdf\x69\x8d\x0c"
+ "\x22\xa6\xcb\x70\x76\x8c\xec\xdb\xb3\x19\xa1\x36\x10\x9f\x52\x9c"
+ "\x41\x3e\x9b\x2a\x7d\x99\x4c\x24\x59\xef\xd9\x22\x6d\xfe\x8a\x77"
+ "\x52\x1a\xe2\xa7\xea\x99\xb1\x49\xf8\x0a\x7b\xb6\x46\xeb\xaf\xfa"
+ "\x4d\x2f\xf0\x41\xc0\xe0\xd9\xd0\xfa\xef\x13\xb1\x3e\x9f\x6d\xd6"
+ "\xda\x11\x79\x29\x1f\xf2\x37\xcd\x16\xdf\x3a\x43\xf5\x48\x1f\x2a"
+ "\x46\x11\xef\xb9\x0e\xdf\xaa\x58\x98\x56\x3d\x23\xfc\x15\x0b\xbb"
+ "\x35\x1a\x87\xf7\xb1\xec\x18\x31\x07\x36\x86\xf8\x20\x88\x23\xac"
+ "\x97\xb8\x58\xb5\x40\x2b\x13\xa5\x03\x1c\xab\x96\x68\x6d\x6b\x75"
+ "\xa0\xff\x17\xa4\x79\x72\x2c\x06\xac\x11\x35\x66\xa7\xa0\x17\x92"
+ "\xd7\xaa\x3a\x2a\x70\x50\x8c\xb3\xaa\x2e\x72\xae\x25\x2f\x57\xd5"
+ "\x10\x81\x0f\xe8\x4f\x68\xfe\x69\xee\x7d\x72\x2f\xa9\x6a\x8f\xe8"
+ "\x63\x0a\xbd\x77\x87\xe6\xa1\x5c\xcc\x11\x62\x40\x8d\x19\xef\x51"
+ "\xac\x15\xca\xa3\x70\xd1\x4f\xcc\x07\xc9\x62\x0b\x59\x13\x78\x42"
+ "\x5a\x2b\x04\x13\xea\xe3\x73\x8f\x02\xaf\x06\x9d\xcf\xa5\x8c\xc4"
+ "\xcd\xe7\x52\x23\xfa\xab\x03\x5d\xa7\xb4\x4c\x2d\x8f\x87\x3d\x27"
+ "\xee\x32\x69\xf0\xa4\x6f\x45\xa1\x79\xbc\x51\xe4\xad\xd4\xfa\xf9"
+ "\x2d\x7b\x86\x0a\xab\xe7\x3e\x54\xdb\x68\xd6\xda\xa0\x67\x92\x7f"
+ "\xaa\x56\x8d\xae\xe3\xc1\xcd\x79\x59\xd2\xb9\x11\x36\xf9\xd5\x0f"
+ "\x3d\x92\x95\x39\xd7\xb6\xfa\x61\xb8\x41\xca\x5d\x9b\x95\x65\x17"
+ "\x87\x38\x23\xf9\xc0\x04\xd1\x1e\xc1\x41\xfa\x9c\x7e\xfe\x07\xcf"
+ "\x4a\xfb\x15\xac\x0b\xac\x77\x2f\xd6\xfb\x91\x82\x73\x42\xb6\x71"
+ "\x17\xdd\xc8\xdc\x7e\x5e\x04\xfe\x5f\xd0\x3e\x8c\xdf\xea\x93\xfb"
+ "\x00\xcd\x27\xf6\xc8\x41\xe7\x4e\xfb\x48\x78\xed\x2c\x1a\xb9\x96"
+ "\x77\x56\x8e\x4d\x27\x76\xde\x20\xe8\x44\xa9\xc4\x0b\xd0\x27\xd8"
+ "\xfe\xa3\x5e\x2a\xd3\x34\xaa\xce\x63\x61\x1a\xb5\xd3\xa3\xd1\x28"
+ "\xb9\x4f\x3c\x6f\xa0\x3d\xa8\x52\x6d\x2b\x10\xc6\x9b\xe7\x0b\x24"
+ "\xde\x3c\x4f\xf2\xdf\xcb\xc5\x9a\xac\x23\xf7\x8e\xe7\x3c\xe0\x1f"
+ "\x65\x7c\xed\xe7\x93\xb5\xfa\xaa\xe2\xb1\x6f\x3c\x9f\xf2\x4d\xfe"
+ "\x61\x67\x2f\xf8\x07\xd8\x25\x02\x16\x22\x9e\xb0\x58\x37\xcf\xaf"
+ "\x8d\xa0\x3f\x71\xf4\x5e\x30\xd6\x5c\x3f\x88\xed\x78\x1e\x8e\xdb"
+ "\xe6\x3d\xb4\x2e\xef\x56\xb8\xa8\xca\xca\xb7\x67\x3d\x94\x97\x95"
+ "\x39\xfa\x9c\x2d\x49\xe3\xc5\x70\xc6\x5d\x45\xeb\xde\x1b\x0b\x78"
+ "\x3c\x4f\xe3\xdf\x15\xd0\xc6\x20\xe8\x14\xf1\x8e\x2a\x8d\x33\x75"
+ "\xb1\x5d\x1f\xca\x58\xe2\xcf\x07\x34\x3c\x41\xbe\x3b\xf2\xb9\x32"
+ "\xe8\xac\xa6\xf1\xef\x34\xaa\xf2\x16\xc9\xb4\xd5\x36\xed\x3d\x5c"
+ "\xbe\x3a\x4b\xec\x7d\x3b\x85\x4d\x1f\xc1\xb4\xba\x33\x82\xdf\xc2"
+ "\xfb\x61\xf5\x5d\xf8\x61\x92\x71\xd1\xab\x37\x4b\xf8\x56\xd3\xfc"
+ "\x3f\xa7\xd2\x8a\x5d\xcd\xb2\x1e\xc6\x5e\x2a\xf4\x46\xef\x13\xfa"
+ "\xfd\xea\x4a\xad\x3d\x2a\x7f\x3c\xb2\x4d\xec\x5b\xa3\xeb\xf3\xb0"
+ "\x6a\x71\x3f\x64\xbb\xf0\x21\x57\xdd\x32\x46\x5f\x53\x23\xf3\x51"
+ "\x1e\x92\x7f\x9f\xab\xd1\xc6\xfc\xc3\x7c\xa4\xed\x32\x5c\x60\x8c"
+ "\xbd\x72\x8c\xbb\x8a\x80\x5b\x68\x1f\xf8\xaf\xf6\x21\x53\xf5\x4b"
+ "\xe2\x41\xfc\x46\xf4\x5f\xf8\x47\xb3\x62\x5d\xef\x22\xf9\xf7\xe9"
+ "\x16\x6d\x1c\x18\x63\x43\xa1\xd7\xa0\xf9\xa5\x92\xe5\x77\xdd\x3a"
+ "\xb2\x6f\xbb\x4a\x23\xca\x74\xbb\xae\x84\xee\x7e\xd7\x1c\xee\x7c"
+ "\xbe\x04\x78\x08\x7f\x55\x55\x21\x3c\xdc\xd5\xf8\x4d\xbc\xdb\x35"
+ "\x1b\x78\x17\x89\x4b\x6b\x6e\x7c\x88\x30\x29\x37\x2b\x6f\x91\xe0"
+ "\xee\x89\xb1\x83\xdb\xb3\xd5\x79\x6b\xd6\xaf\xcb\x9d\x6b\xcb\xcd"
+ "\x5c\xad\x2e\xfa\x11\x6b\xde\x29\x64\x7f\x9f\xb6\xce\x06\x9d\xbb"
+ "\x67\x87\x69\xcb\xee\x30\xfe\xc3\x46\xeb\x4a\xe8\x66\x77\x6f\x96"
+ "\xeb\x69\xf7\xb2\x88\xb5\x2b\xca\x63\x8d\xee\x13\x3c\xdb\xee\xc8"
+ "\xfd\xdf\x47\x30\x8d\x39\xc3\x76\x5f\xaa\xc2\xd4\x27\x61\xbc\xfb"
+ "\x5d\x31\x4e\xe1\x8f\x6b\xd7\x31\x8c\x53\xf8\x7f\x11\xfc\xd9\xee"
+ "\x03\xda\x78\xc3\x72\xc3\x6e\x97\xe0\xa3\x54\x7e\xed\xdb\xe4\x7a"
+ "\xc9\x9f\xee\x59\xa5\xea\xde\xda\x35\x19\x4f\xe3\xaf\xa9\x2f\x99"
+ "\x92\x57\xdd\x73\xe9\xf2\x02\x3e\x9c\x9e\x0f\x3f\x75\x98\x83\x3d"
+ "\xb7\x6b\xbc\xa5\xb0\xdf\x2b\x8b\x4f\x1b\x74\xee\x59\x18\x49\x27"
+ "\x78\xd4\x23\xed\x2a\x8f\x98\x26\x65\xd7\x4b\xfe\xd0\x41\x6d\xe1"
+ "\xec\xe1\x02\x7d\xa3\x71\xed\x21\xfa\xf7\x6a\x03\xea\x01\x7f\xcd"
+ "\xfb\xac\x6a\xac\xca\x1a\x71\x86\x57\x4b\x75\x7b\x69\x6e\x29\x1f"
+ "\xf1\x7f\xbb\x05\x6e\x28\x84\xa3\xb0\xdd\xf1\x69\x3c\x12\xdb\xf3"
+ "\x19\xf6\x22\x7a\x26\xbc\xad\x49\x92\x38\x55\x93\xe4\xcd\x4d\x62"
+ "\x7d\x7d\x56\x7d\x5f\x6e\x9a\x01\xfa\x02\xc0\xc2\x5d\xe3\x67\x12"
+ "\x7f\xf6\xf8\x89\xe6\x1d\x88\xac\x4f\xad\x0b\x30\x35\xa0\x1f\x3c"
+ "\xd7\xaa\x07\x7e\x03\x5f\x79\x5f\x12\xf1\x09\x7b\x5c\x3c\x37\x49"
+ "\x3f\x8e\xef\xad\x0b\x8d\xd3\x84\x78\x8f\x88\x01\x0a\x7a\x25\xfd"
+ "\xfb\xef\x7d\xfc\x59\xa9\x1b\x50\xdb\xad\x79\x82\xeb\x5f\x10\xfb"
+ "\x4a\xb9\xd8\x57\x38\x93\xfe\xd2\x6b\x0e\x08\x3b\x5a\xfb\x0b\x22"
+ "\xe6\xab\x7a\x3f\xdb\xdb\x64\x0f\x88\x58\x75\x8e\x3c\xf0\x69\x01"
+ "\x9c\x1b\x89\xfb\xc7\x47\xf2\x02\xec\x87\x7e\xe0\x64\x4d\x3b\x7c"
+ "\xc5\xcb\x58\xe0\x35\x9d\x9a\x7f\x78\xc4\x90\x44\xfc\x53\x1a\x57"
+ "\x54\x38\x7e\xe9\xde\xc3\xd0\xdb\x4a\x79\xdc\xca\xca\x89\xa7\x97"
+ "\x73\xb0\x77\x1e\x62\xf1\x49\x59\xa1\x83\xe6\x25\xea\x2b\xca\x7b"
+ "\xa7\xc0\x9f\x10\x9d\xd8\xfb\x16\x6c\xd3\x3d\x6a\x1d\x83\xce\xbd"
+ "\xb4\xff\xef\xc9\x96\x6d\x51\x7d\x83\xda\x7c\xee\x9d\xf7\x4d\xfd"
+ "\x46\xb8\x3e\x2a\x3f\x57\xe5\x0b\x98\xd4\x7d\xbd\x87\xba\x6a\x34"
+ "\xdd\x57\x98\xf7\xd9\x5b\xaf\xe9\xbe\xa4\xef\xe9\x9a\x3c\xb4\x3f"
+ "\x9e\x8e\x88\x3b\x7e\x0c\xbc\x37\x82\x87\x1b\x97\x9f\xa0\xfd\x1d"
+ "\x7d\xd7\xf8\x42\x39\x3f\xb5\x77\x81\x3f\x44\xcc\x55\x8d\x97\x94"
+ "\x3c\x40\xed\x4a\xb9\x97\xd5\x2e\xd4\xf6\x32\x2a\xdb\xa0\xd2\x0a"
+ "\x75\x9f\xab\x0d\xc9\xbf\x63\xdb\xe5\xd7\xe6\x69\x30\xd2\x60\x2e"
+ "\x61\x54\x7b\xb4\xcf\x3c\xb1\x31\x0c\xdb\xda\xa3\x02\xd6\xa1\xef"
+ "\xfb\xa2\x23\x60\x8f\x77\x83\xa4\x9b\xb5\xb4\xff\xd7\x2c\x90\x7b"
+ "\x8a\x4c\xe3\xe6\x84\x7f\x88\xb8\xed\x02\x06\x6b\x84\x6e\xc6\xeb"
+ "\x48\x42\xdf\xbc\x1e\x5d\xb2\x4d\xd2\xb2\x5a\xca\xbf\xb7\x57\x96"
+ "\xab\xad\x46\x5f\x22\xfb\x7b\xef\xba\x47\xd6\xad\xdf\xb4\x0e\x0a"
+ "\xb5\x0d\xb9\xb6\x87\xd6\x67\x66\x4d\x1a\x43\x1f\x62\x45\x5c\x6b"
+ "\x5f\x55\xc8\xef\xd4\x8b\x46\xd8\xd1\xcb\x98\x05\x2f\xc6\xd8\xae"
+ "\x06\x7e\xed\x7b\x14\xba\x02\x11\x3b\x02\x3e\x56\xa5\xde\xa0\x1b"
+ "\xe5\x25\xac\x5f\xe8\xef\xdb\x94\xad\xf2\x58\x2f\xbc\x06\x38\xaa"
+ "\x32\x07\xa7\x31\x9e\xd2\xf6\x21\xf4\x4f\xf0\xe6\xc3\x49\x82\x2e"
+ "\x2a\xc3\xd9\x06\x01\xaf\xe1\x24\xda\x6f\xf6\x35\x7b\x74\xd7\x07"
+ "\xe4\xb8\xf6\x1d\xd3\xe0\x81\xf1\x0f\x22\xd6\x26\x5f\x43\x38\xfa"
+ "\xa2\x51\xad\x0b\xf4\x13\x75\xd7\x68\x76\xdc\xf0\x25\xea\xda\x08"
+ "\x3f\xc2\x75\x9f\x29\x65\xa0\x37\x75\x56\x8d\x2e\x61\x2f\x52\xa8"
+ "\x9e\x57\x07\xbc\xd1\xb4\x6e\x6e\xa7\xb2\x89\x1d\xec\x85\x4c\x19"
+ "\x6f\xa0\x6e\xc9\xc8\x78\x03\x2f\xd8\xe8\x2f\x53\xfd\x2b\x8e\x78"
+ "\xbe\xd0\x9f\x56\x26\x35\x9c\x56\x57\x37\x2a\x4f\x31\xf5\xe9\x50"
+ "\x88\x5f\x91\xfe\x4c\x55\xff\xc7\x88\x9d\x51\x77\x0a\x3e\x43\xc3"
+ "\xb8\x51\x17\xab\xf2\x20\xdd\x80\x1d\xf6\xdb\x4e\xf6\x82\xf4\x65"
+ "\x52\x4e\xb8\xc1\xd3\x10\xd7\xdb\xcb\x07\xd7\x10\x4e\xbc\x60\x08"
+ "\xe3\x81\x84\x11\xa5\x59\xc3\x7c\x4a\x5d\x2f\xca\x44\xc2\x81\xda"
+ "\xb8\x5d\xca\xa6\x2f\xa4\x68\x7b\x36\xfc\xa5\xca\xf8\x13\x75\x87"
+ "\x1a\x0a\xbb\x49\xe6\x7f\x61\x55\x44\x1d\x87\x54\x5d\x84\x81\xeb"
+ "\xf7\xc5\xed\x13\x32\xdb\x0b\x05\x61\x9d\x40\xdd\x21\xd0\x5d\x51"
+ "\x87\x39\xc1\xeb\xf6\x89\x98\xd1\x3a\x2d\x46\x3c\xe5\x3d\xa0\xf1"
+ "\x28\x5a\x5d\x4d\x52\xe7\x24\x7c\x5c\xd2\x1a\xac\xa4\x3c\x2d\x21"
+ "\x7d\x2c\xa5\x85\x64\xc0\x7c\x5a\xc7\x82\xf7\x7e\xa1\x37\x2c\xeb"
+ "\xed\x13\x7e\x05\x84\x1c\x28\xeb\x31\x7a\xd8\x0b\x9e\xd1\x72\x1b"
+ "\xf1\x0f\xb6\x35\xeb\xd6\x10\xfb\xf0\x53\xfb\xfa\x5b\x49\x74\xf8"
+ "\xa9\x7d\xcd\xad\x30\xf9\xba\x7b\xc9\x5d\xe2\x97\x16\xc7\xad\x63"
+ "\xe8\x8f\xa1\xf7\x16\x71\x99\xa1\x33\x22\x39\x17\xba\xd3\x41\x19"
+ "\x2b\x75\xa2\xfa\x6b\x54\x7f\x27\xd0\xbe\x57\x44\x6b\xa5\x0c\xb1"
+ "\x6f\x08\xfe\x75\x8a\x53\xc6\x79\x55\xf7\x6c\xa2\xe5\x2f\x3e\xae"
+ "\x9d\x97\x09\x1b\x78\xf8\x31\xec\xcb\x16\xfa\xb8\x41\xe7\x8b\x21"
+ "\xfd\x87\xd4\x2f\xca\x33\x37\x4a\x6f\xd7\xd2\x35\x7d\x2c\xa5\xf5"
+ "\x6a\xba\x57\x99\xf7\xc5\x40\xb8\xec\x08\xdd\x76\x82\x76\x1e\x37"
+ "\xe8\x7c\xc9\xa6\xc1\x4c\xab\xc7\x61\xe3\x67\x54\x3e\x29\x4a\xf0"
+ "\xd5\xce\x17\x13\x84\xef\x50\xf0\xe2\x42\xcf\xfc\xd2\x4a\xad\x1d"
+ "\xc8\x08\xe8\xb7\x7a\xf6\x23\xd6\x3d\x7c\x84\x4a\x1f\xa3\x2f\x85"
+ "\xe6\x7f\x14\xcc\x93\x6e\xba\x46\xe8\xe5\x93\x72\x89\x3f\xbb\x66"
+ "\x94\x1e\x0e\x38\x34\xbf\x8a\xc5\x08\x1d\x93\x94\xd3\xa3\xc1\x23"
+ "\xd0\x18\x5e\xa0\xf9\x8c\x02\x2d\x97\xfb\xde\x4b\xc7\x43\x7b\xbc"
+ "\x29\x81\xf0\x6a\x62\x03\xfc\xcc\xcb\x7b\x0b\x2f\x9d\x07\xbe\x79"
+ "\x2f\x7b\x64\x90\xc3\x46\xf9\xf9\x7f\x1f\x94\x7a\xf8\xfd\x37\x87"
+ "\x75\x66\x2f\x95\xa8\x3e\x51\x61\xff\x46\xf3\xb5\x7f\x6e\x88\xe7"
+ "\xa4\xfc\x82\xf7\xa2\x3a\x71\x47\x01\xed\x5f\xc4\x39\x0f\xc9\xfd"
+ "\x8b\x4a\xe4\x3a\xdd\xef\x12\x75\x10\xad\x96\xf7\x00\xf6\x13\xff"
+ "\xff\x52\x8d\xdc\x1b\x50\x77\x1a\xeb\x33\x2f\xb2\xf7\x39\x3f\x9a"
+ "\x0b\x18\xfa\xcc\x2b\xea\xa5\x0f\xe2\xfd\xef\xfa\x9c\x06\x9a\xd3"
+ "\xfd\x34\xff\xbf\xfd\x86\xac\xab\xb5\x35\xbc\x91\x37\x05\x06\x78"
+ "\x63\xf9\x17\x44\xe7\x1e\x66\x2c\xb0\x91\xd7\x0f\x0f\xf0\x06\x11"
+ "\x83\xfc\x41\xc6\xca\xfe\xca\x58\x30\xea\xdf\x4f\x0d\x11\xae\xde"
+ "\xd3\xaf\x9c\x41\xbc\xc0\x7d\x94\xef\x1e\xdf\x59\x5e\x4b\x65\xee"
+ "\xb1\xf3\x33\xb5\x94\xef\xee\xd3\x67\xf8\x5e\xca\x7b\x77\x36\xe1"
+ "\xca\x46\x1e\x08\x46\x3d\x72\xca\xf6\x23\xd0\xee\x5f\x2e\xf1\x96"
+ "\x99\x9b\xb8\x53\x5f\xc1\xb7\x5f\x77\xed\xa0\xf3\x97\xa9\xa1\x38"
+ "\x65\x54\x2f\xf0\x6a\x79\x3e\x9e\x1f\x39\x45\x78\x70\x2a\x9d\xf8"
+ "\x0e\xc2\xdb\x53\x94\x0f\xe7\x3f\xe2\x6e\x96\x37\xea\xda\x78\xfa"
+ "\x4b\x1a\xb3\xff\x03\xbc\x29\xb8\x91\x37\x56\x3c\x40\xfd\xef\xa1"
+ "\xfe\x0f\xf0\x7a\x1a\x43\x43\x79\x17\x63\xe8\x7f\x10\x75\x06\x59"
+ "\x54\xfa\x66\xdd\xe4\x7d\xf4\x3d\x3d\x3f\x8e\xed\xa3\xbc\x0f\xf8"
+ "\xd8\xe4\x5a\xca\xf3\xc0\xcf\x27\x33\xd1\xff\x5e\xea\x77\xac\xb9"
+ "\x29\x48\x6d\xa3\xff\xd4\xbe\x5f\xeb\xa7\xd6\x3e\xfa\xab\xad\xdb"
+ "\x74\xe8\x08\xcd\x13\x45\xbf\xe5\xb9\xc7\xaf\x56\x7b\x73\x69\x9e"
+ "\xa3\xae\xbb\x56\xca\xd8\xbf\x5a\xa8\xf5\x7f\xe4\x39\xd8\xaf\x8a"
+ "\x24\xfd\xfc\x15\xc9\x3f\xfb\xd5\x98\x2e\x32\x0d\xe3\xf7\xd2\xba"
+ "\x55\xef\xfe\x9d\xd2\x60\x46\xdf\xe7\x8e\x3e\xe7\x4a\x5d\x9f\x23"
+ "\x74\xd4\xab\x1f\xca\x5b\xb3\x71\x35\x49\xbe\x93\x98\x1d\x49\x42"
+ "\x36\xce\xca\xb4\xad\x5f\x67\x7b\x78\xf5\x9a\xb5\xeb\x37\x66\xe5"
+ "\xcc\x15\xea\x8c\xdc\xac\x75\x99\x50\x5d\xe7\xac\xce\xb1\x4f\x1a"
+ "\x25\xcf\x94\x9a\x9b\x5a\x11\x83\xa6\x10\xf8\x7d\xf0\x43\x55\x6f"
+ "\xeb\xe7\xce\x14\x21\x17\x4b\x1a\xf3\xeb\x9b\x6d\x5b\x52\xf0\xfd"
+ "\x2d\xb9\x8f\x1f\x6c\xe6\xe5\x13\x83\x9c\x8b\xd8\xda\xba\x33\xec"
+ "\xe0\x1b\x02\x1e\x7d\x4b\xb5\x7a\x84\xec\x0a\x9c\xb5\x6f\x01\x1f"
+ "\xf6\xeb\x55\x1c\xdf\x47\xc0\xe2\x60\x99\xe4\x45\x28\x7d\x78\x29"
+ "\x0b\xdb\xdb\x1f\xfc\x90\xeb\x69\xec\x04\x4b\x55\x66\x28\x51\xef"
+ "\x3d\xfe\x67\x07\x3b\x08\x59\x0a\xe7\x36\x6d\x82\x27\x17\xf7\xb3"
+ "\x0e\xae\x21\x99\xa3\x84\x3b\x27\x98\x00\xaf\x72\x29\xd3\xeb\x2d"
+ "\x3a\xc4\xce\xed\xc0\x5d\xd1\x64\x9c\xef\xee\x73\x2a\xc9\x61\xfb"
+ "\xa6\x5f\x95\x42\xbe\x10\xe7\x1c\x82\x26\xfd\xba\x5b\x5b\xbb\x7a"
+ "\xdc\xbf\xd9\x3e\x75\x91\x5c\x7f\xbf\x3e\x8d\xfc\x34\xff\x8b\xe4"
+ "\xf8\x44\x1c\x70\xe2\x0d\x0e\x46\xd3\xf8\x15\xee\x58\xaa\x9e\x49"
+ "\x1e\x8c\x56\xcc\x3f\xaa\x0f\xe6\x92\x5c\x60\xba\x2f\x99\x97\x1b"
+ "\x13\x95\x72\xe3\x84\x20\xf1\x54\x0a\xc9\x09\xbc\xfc\xbe\x9b\x82"
+ "\xe5\x46\xa6\x6c\x4a\xd2\x63\x6f\x75\xe4\x13\x7c\xd7\x67\x4f\xe2"
+ "\x67\xb3\x2f\x09\x6e\x4a\x82\x9d\xaa\x91\x73\x2a\x6b\x36\x5a\x45"
+ "\xbc\xe2\x72\xe3\x24\xf5\x7d\x2a\xde\x15\xe2\x93\x29\xcd\x46\xef"
+ "\x57\x2a\x3c\x22\xff\xc8\xbc\xb3\xf1\x6e\xd1\x09\xbb\xca\x64\x92"
+ "\x4b\x16\x63\xec\xda\x98\x85\x7c\x06\x1d\x51\x68\x6c\x07\x99\x96"
+ "\x0e\xb9\x41\xf2\xf0\xec\x21\x82\xb1\xf4\x65\x11\xca\x77\xe0\x73"
+ "\x0d\x06\x32\x3e\xf7\x44\xc2\xd9\x83\xcd\x0a\x62\xa3\x6f\x9f\x76"
+ "\x2d\xd7\xff\x6a\x1f\x68\xd6\xf2\xa0\xa0\x85\x4c\x9e\x3b\x1d\x5c"
+ "\xa8\xc1\x13\xf7\x08\x40\x4b\x69\xde\x92\xd2\xbd\x6c\x92\xa4\x03"
+ "\x07\xd3\x22\xe4\xc3\x5e\xcc\xb5\x87\x1d\x50\xfd\x6c\x19\xb7\xcb"
+ "\xf7\x5f\x1f\x90\x6b\xe5\x60\xb1\x96\x97\xd2\xa4\xbf\x9f\x52\xe3"
+ "\xf1\x4d\x01\x36\xd5\xfe\x3d\xde\x45\x73\x94\xa6\xe6\x3b\x14\x5e"
+ "\x53\x12\xdf\xe8\x77\x21\xe4\x6b\x9c\x3f\xe2\xb9\x76\x9c\xbb\xb0"
+ "\x85\x35\x9c\x63\xbf\xc2\xfe\x69\x9b\xca\x58\xab\x0f\xb2\xd5\x6f"
+ "\x8c\x47\x6a\x7c\x4c\xcc\xb3\x79\x62\xb0\x8f\x67\x23\x1e\xe8\x98"
+ "\xb2\x04\xca\x50\xfe\x25\x42\x4e\xa2\x75\xa1\xd0\xba\xa0\x32\x0a"
+ "\xf0\xba\xb0\x1f\xf2\xcb\x6f\x8a\x9b\x0a\xba\xe1\xab\x9f\xf0\xf5"
+ "\x37\xc5\x80\x21\xd6\x41\xb9\x53\xdc\x83\x14\xfb\xa4\x6b\xe3\x02"
+ "\xd4\xf1\x73\xb3\x9f\x19\x5a\x69\x87\xa0\x79\xf1\xdb\x0b\xd9\xe4"
+ "\x1e\xca\x6f\xc8\x63\x46\xc8\xb0\x23\xf7\x90\xb1\xf7\x8f\x3e\x53"
+ "\x7c\x63\x5f\x79\x3c\xf1\x3b\xbf\x39\x4c\xb4\x7f\x5c\xff\x89\xdb"
+ "\x13\x89\xaf\xa1\x7c\x95\x53\x71\x56\xfd\x9b\xee\x0b\xe5\xd5\xee"
+ "\xe6\x02\x57\xe6\x5b\xa1\x4f\x89\x6f\x14\x67\xde\xe6\xf8\x4a\xa9"
+ "\xb7\xfc\x6d\x92\x56\x1e\x7a\x4f\xd8\x15\x54\x0c\x31\x6b\x45\x48"
+ "\x56\xfc\x6d\xaa\x9c\xa3\xdf\xa6\x6a\xf2\xc5\x58\xed\xe4\xed\xe7"
+ "\x8a\x63\x0e\xd3\xbb\x6d\x5e\x76\xbd\x9f\x99\x6a\x77\x33\x56\xb9"
+ "\x85\xfb\x9f\xdd\x42\x78\x44\x30\xe6\xfa\xdf\x34\xc3\xfe\x62\x1f"
+ "\xed\xd1\xe5\x0a\x63\x51\xd4\x97\x67\x07\xa8\xcd\x42\x99\x8f\x4b"
+ "\xbf\x6a\x56\xca\xe7\xa3\xdf\x04\xa2\x23\xac\xaa\x90\x19\xab\x14"
+ "\x66\xa8\x2c\x64\xd3\x29\x8d\xf8\x8a\xdf\x1e\xd3\x64\x81\x31\xcf"
+ "\x85\x6b\x89\x3e\x52\xbb\xdb\x0a\x79\xe0\x3d\x92\xef\x9c\x0a\xf7"
+ "\xff\x33\x70\xf7\xb0\x43\x0b\xe4\x18\x0f\x2d\xd0\x64\x03\x7a\x4e"
+ "\x19\x79\xc7\xfa\x50\xd2\xe8\x33\xe6\x07\xd7\xaf\xcf\x4b\xcf\xc9"
+ "\xc2\x4f\xd2\x9c\x0d\xd7\x8c\xe6\x15\x4d\x32\x1e\xd5\xa1\x34\xac"
+ "\x2d\xf0\x4f\xf2\xae\xd2\xa1\xea\x08\x7d\x0f\x74\xce\xb7\x81\xef"
+ "\x83\xad\x09\x7d\x6b\x78\x57\x5c\x1d\x60\xba\x13\x46\xa6\x1f\xdd"
+ "\xde\xc3\xab\xf3\x56\xaf\x5d\x24\xcd\x1a\xc6\x68\xa7\x79\x64\x3b"
+ "\x2f\x87\xce\x7f\x55\xd9\xdc\x27\xe8\x63\xd9\x7d\x36\x1e\x7b\x8b"
+ "\x4b\xee\x75\x2f\xcf\xd6\x6c\x07\xc7\xf6\xe9\x62\xcc\x0b\x96\x27"
+ "\xa6\x60\x8d\x38\xb6\x32\xfd\xeb\x5b\xda\xf5\x90\x4b\x0a\xe9\x19"
+ "\xb6\x5c\x42\xff\xad\xc6\x8a\x7c\xfb\x5c\x3b\xed\xa5\x2f\xe7\xf3"
+ "\x32\x23\xc9\xc0\x2f\xdb\xc7\xb3\xdf\x8a\xbc\x0f\x2f\xcf\xee\x5f"
+ "\xae\xbc\x80\xad\x97\xc8\xaf\xd9\x69\x8c\x2c\xf7\x4a\xb4\x9c\xb3"
+ "\x97\x09\xff\x7f\x53\xa7\xe1\xaf\x96\xa7\x22\x51\x8b\xc1\xf9\xf2"
+ "\xb8\x7e\x90\x79\x69\xbc\x4b\xe2\xf8\x2b\x77\x8a\x33\xea\xa9\xec"
+ "\x17\x1d\xec\x95\xdb\x0d\x56\x66\xa5\xe7\x5f\xd3\xb3\xd0\x61\xe0"
+ "\xdb\x08\x3c\x9a\xd1\x5b\x67\x20\x8a\x43\x94\x47\xc7\xe5\x3f\x62"
+ "\xfc\xe4\xbf\x28\xfa\xd3\x73\x9d\xb8\xb5\x12\x45\x33\x38\x71\x82"
+ "\x81\x59\xcc\x26\xe3\xcc\x2b\xa6\x5b\x6f\xfb\xde\xe2\x85\x8e\xc2"
+ "\x82\x7c\xae\x04\xfc\x16\x1e\x11\x37\xb5\xf4\x96\xec\x7b\xaf\x29"
+ "\x92\xfc\x43\xd9\x2d\xd9\x63\xf5\xb5\xcc\xc9\xed\x90\x69\x15\xf3"
+ "\x8a\x4a\xc7\x06\xa6\x7f\x75\xc8\xa3\x87\x0c\x05\x1e\xc6\x1d\xf8"
+ "\x92\x64\xf1\x57\x3e\x79\x87\xd2\x08\x5e\xf9\xbc\x74\x45\xa5\xbc"
+ "\x93\xf4\xea\x64\xa5\x7c\x45\x65\xb8\x7e\x03\x43\xfd\x24\xa7\xeb"
+ "\xf7\x17\x76\xeb\xdd\x86\xef\x31\xb7\xcd\xc7\xde\xa1\xe7\x31\xe7"
+ "\x8a\xda\x84\x4e\x18\x75\xd0\x1e\x5c\xe2\x38\x4f\x7b\x73\xbe\x38"
+ "\x9f\xd1\x9f\x61\xaf\xde\x55\x3f\x4e\x39\x71\xc6\x6a\x36\x6f\x1c"
+ "\x74\xbe\x4a\xf4\xff\xc1\xd9\xaa\x1c\x42\x72\xd2\xab\x55\xda\x7e"
+ "\x40\xdf\x37\xc8\x73\xa2\x57\x0f\x68\x79\xc6\x9c\xa3\x27\x61\xeb"
+ "\xcc\x5d\xc0\x03\x3e\xd0\xdd\x0d\xdf\x8b\xe3\xe0\xca\x12\xe2\x51"
+ "\xca\x40\x9b\x63\xb7\xc5\x4d\x30\x6f\x4b\x7e\xb4\x85\x78\xa3\xd8"
+ "\xde\x4b\x99\xd9\x77\x3f\xfa\x0c\x7b\xfb\xb6\xbd\x24\x73\xe2\x7c"
+ "\xd8\xa2\x4b\x5e\x63\xd9\x96\xbc\x3a\xe8\x5c\x7c\x13\x78\x28\x4b"
+ "\xfe\x5d\x3a\x4b\xe0\x76\x5d\xc0\xb9\xe0\xa6\x7d\x32\x56\x91\xaf"
+ "\x32\x91\xb7\x53\x99\xe3\x54\xc6\x43\x7f\x9d\x54\xae\xa5\x8b\xd5"
+ "\xaf\xa1\xdf\x66\x8b\x8e\xef\xb3\xd0\x4c\xce\x2f\x12\xb1\x5b\xb1"
+ "\x3f\xb7\x70\x33\xc9\x76\xc3\x42\x07\x17\x1d\xd6\xc1\xd5\x97\xd2"
+ "\xbc\x4d\x58\xf6\x38\x7f\x87\xea\x6a\x0e\x0e\x28\xcd\xb5\x67\x40"
+ "\x0f\x85\x5c\x75\x8c\x68\xc0\xb1\xb9\x55\xcc\xaa\xda\x4c\xeb\x5b"
+ "\x02\xcd\xd8\x87\xe1\x73\xa0\x89\xda\x3c\x4c\x7f\x8d\xb6\x75\x2c"
+ "\xea\x0c\xab\xff\x52\xb3\xb9\x92\x7c\xdd\xef\xee\x55\xf5\x00\xae"
+ "\xeb\xa9\xfc\xd6\x47\x81\x13\xdd\xfa\x00\xd5\x4f\xb2\x76\xb3\x3b"
+ "\xbb\x59\xd8\xb0\xe1\x4e\x02\xf2\x50\x1b\x49\x6e\x7f\x33\x53\xb8"
+ "\x55\x4f\xef\x8d\xb8\x5f\xc0\x29\x6f\x6b\x7e\x3b\x6b\xb5\xfb\x69"
+ "\xdf\x6c\x21\xd9\x33\x69\x36\xf5\x47\xd4\x47\xdf\x8f\xbd\x4a\xf3"
+ "\x6b\x23\x99\x81\xea\x13\x31\xed\x71\x77\x9f\xe7\x26\x5d\x4d\xe5"
+ "\x9b\xf8\xb0\x55\x8f\xfa\xcf\xb0\xd7\x4e\xf2\xbe\xa4\xa4\xf9\xbd"
+ "\x32\x96\x69\x07\x7b\xed\x30\xf5\xb3\x3c\xa2\x9f\x77\x52\xff\x0d"
+ "\xb4\x57\xba\xa8\xce\xc3\x7c\x23\xb5\xd9\x49\x6d\xfa\xbc\xb0\xff"
+ "\x9c\xcd\x37\x59\x0d\xe8\x73\x2b\xfa\x9b\x1f\x64\x7c\x53\x92\xa1"
+ "\xe2\x1c\x33\xd0\x5a\x70\xed\xa3\x5f\x1a\x7f\x03\xf1\xf5\xd3\x07"
+ "\x9d\xaf\x85\xfc\x3f\x80\x8f\xa4\x77\x8f\x86\x4b\x65\x94\x87\xfa"
+ "\xd8\x48\xfd\x3a\x1c\xdb\xcb\xa0\x5b\x88\x26\x3c\x8d\xa6\x76\x27"
+ "\xd2\x5c\x35\x12\xec\xde\x25\x58\x1f\xc6\x98\x94\x01\xa5\x5b\xa1"
+ "\xfa\x2a\x06\xa8\x4f\xb9\x56\x83\xa9\x13\x71\xde\x07\x39\xc1\xfb"
+ "\xd8\xf2\xfc\x41\x0e\x7b\x71\xd8\x5e\x53\x99\xbd\x34\x56\x83\x87"
+ "\xfd\xae\x00\x72\x7e\x17\x7b\xad\x58\xc6\x62\x7d\xad\x44\x3d\x4b"
+ "\x3e\x26\xf5\xbb\xf5\x5f\x02\xf6\x18\x97\x69\x5b\xdc\x0e\x77\xb7"
+ "\x97\x99\x3a\x2f\x25\x9e\xe5\x35\x56\xa3\x80\x3f\xfd\x5d\x89\xd6"
+ "\xcf\x71\xd6\x98\xdf\x4d\xf4\x45\x19\xe0\xdd\x90\x5f\xa4\x9d\xd9"
+ "\xef\x0e\xa7\xe7\x47\xa5\x90\xac\xa2\xa7\x7e\xe2\x1e\x53\x22\xf1"
+ "\x68\xb7\xc1\x0e\x91\xfa\x47\x7b\xf6\xef\x8e\x5f\x28\x06\x32\xc1"
+ "\x87\xf8\x82\xd7\xa9\x0f\xbf\x13\xfa\x54\xc4\x88\x95\x3a\xd6\xd7"
+ "\x13\x34\x3f\x1c\x7c\x80\x17\x60\xef\xa5\x76\x8b\x8a\x37\x8a\x36"
+ "\x10\x17\xb7\x3b\xcf\xc6\x4f\x34\xd9\xbc\xe3\xfa\x3a\x88\xb0\x9f"
+ "\xf3\xaa\xb1\xf6\x84\x2d\xc1\x48\xfb\xb9\xd7\x0b\x22\xf4\x35\xb0"
+ "\x27\x28\x82\xcd\x84\xf4\x97\xf4\xba\xb0\x09\x5c\x9e\x2f\xfd\xc2"
+ "\xb8\xfd\xbd\xaa\xdc\xf1\xfa\x87\x22\xfe\x16\x78\x5a\x61\x73\xd7"
+ "\xa3\xda\xc9\xbd\xbe\x1a\x6d\x34\x8d\x8a\xf1\x9d\xb5\x6e\xf5\x83"
+ "\x6b\xb3\xa4\x0a\x73\xde\xcf\xf2\x56\xff\x74\xa4\x6c\x64\x10\xb2"
+ "\xb8\xf3\xf5\x63\xf2\x4c\xa0\xc1\x14\x21\x23\x18\x42\x3a\x5d\x3d"
+ "\x6b\x90\x7a\xdd\x86\xb9\x63\xe9\x75\xef\xfa\xe9\xba\xf5\x39\xa2"
+ "\x0d\x61\x52\x98\x25\x6f\x05\x4e\x62\xf7\x2e\xb9\x6b\xc9\xbc\xdc"
+ "\xac\x3c\x11\x54\x47\x2a\x51\x57\x67\x66\xe6\xa8\x06\x87\x6b\x50"
+ "\x0a\x5f\x1e\xde\x24\x8a\xda\x1f\xc9\x93\xa6\x8a\xb9\x6b\x57\x6f"
+ "\xcc\x52\xab\x88\xec\xeb\x74\xd0\xcb\xa6\x1a\xa1\xab\x9a\x24\xed"
+ "\x23\x1a\x0e\x47\x9c\xa7\x46\xea\x6f\x2e\xa7\x6f\xa1\xf3\x7f\xfb"
+ "\x95\xc0\x95\x37\xd6\xb4\xd6\x09\x5f\x26\x86\x23\x2f\x02\xbe\x6f"
+ "\xdc\x89\x38\x10\xb4\xb7\x79\x10\xb7\x58\xb5\x3d\x20\x7a\xfd\xc6"
+ "\x2c\x92\xb5\x3c\x04\xdf\xfc\xe5\xc4\xe5\x12\x4d\x25\x39\xfd\xcd"
+ "\x04\x55\x27\x62\x54\xf4\x0d\x0b\x61\x37\x56\x2b\xf4\x77\x6f\x2c"
+ "\x0e\xeb\xef\xde\x84\x4d\x8f\x91\xe6\xbb\x13\x7d\x43\x3f\xe9\xfb"
+ "\xaa\x08\x9b\x9d\x4e\x0f\x81\x11\xf5\xc0\xb6\x44\xc4\x68\x21\x9e"
+ "\x58\xf5\x07\xa1\x6f\x7d\x11\xfb\xd0\x1f\x8a\x41\x73\x95\xd2\xf8"
+ "\x76\xb9\x66\x7e\xbf\x97\x97\x9b\x37\xcd\xf7\xb1\x04\x49\x33\xde"
+ "\x80\x2c\x3e\x85\xfa\xd8\x44\xe9\xf9\x44\x77\xa2\xc1\x1b\xc9\x33"
+ "\xaa\x37\x4e\xa9\xfa\x3c\xc0\x27\x3a\xa2\x0f\x9e\xb0\xce\xef\xcd"
+ "\x04\x6f\x6c\x7c\x7b\xb1\xb4\xc9\x11\xf6\x07\xd2\x06\xe4\xf7\x86"
+ "\x90\x8e\x8b\xda\x56\xcf\xdc\x13\xba\x28\x3f\xc1\xa2\x5d\x3d\x07"
+ "\xc7\xd8\x53\x31\x6e\x69\x4b\xf9\xfb\x11\xf2\x8f\x8c\x89\x61\xde"
+ "\xa4\x48\x7b\x59\xf4\x3d\x4b\xf0\x51\xd0\x2f\x0e\x01\xde\xbf\xdf"
+ "\x4c\xdf\x69\xaf\xfb\xbd\xdd\xc3\x5e\x0f\xf5\x07\x7d\xce\xcb\x27"
+ "\x66\x80\xca\x61\xef\xa3\x3e\x4d\xa4\x3c\x55\xe1\x3e\xff\x5e\x9c"
+ "\x8d\x42\xa6\x94\x3c\xc8\x1f\x8c\x52\xcf\x1b\xdf\x1d\x31\x6f\x86"
+ "\x33\xec\xf7\xa7\xa8\xaf\x22\x1e\x96\x36\x7e\x89\xb3\xbf\x1f\x31"
+ "\xfe\xb0\x0e\xb6\x61\x9d\xd4\xc1\xfe\x81\x85\xe7\xf0\xf7\x4d\xc0"
+ "\x7b\xd8\x0d\x69\x36\x43\x98\x4f\x19\x2f\xe4\x0f\x49\x5a\x3d\x8a"
+ "\x39\xbe\x19\x72\x72\xb9\x3c\xff\xa6\x79\xf9\xc3\x9a\x28\xdd\x09"
+ "\xc1\x4b\xcd\xf7\xb3\x3a\x4a\x9b\x40\x69\xf7\x23\x1f\xda\x14\xba"
+ "\x4a\x82\x0d\xc6\xa2\x90\x8c\x15\x65\x9d\xb0\x9c\xea\x23\xbc\x3a"
+ "\x74\x2c\x8c\x1b\x7f\x48\x11\xf4\x52\x85\x35\x77\x36\x6c\x0f\xcb"
+ "\xee\x7f\xd8\x1f\xd2\xbb\x51\x3d\xe1\x3d\xe3\x0f\x1f\x02\xc6\x15"
+ "\x21\x1d\x44\x63\x40\xf4\x43\x9e\xa7\xbe\xd7\xc5\x1a\x4f\x73\xe2"
+ "\x2f\xb0\xd7\x42\x3e\xc4\xdc\x0b\x7e\x4f\xe8\xcf\x1a\x7f\x59\x2b"
+ "\xcf\x2c\x76\xd2\xf3\x41\x45\x3f\x16\xee\x34\x4e\x8f\xb4\xef\x95"
+ "\xf0\x6f\xcc\x54\x50\x27\x8d\x1f\x75\xd1\xfe\xa3\xd3\xf4\x9a\x6a"
+ "\xbd\xf7\x52\x9d\xcf\x77\xa9\xb0\x16\x67\x79\xe5\x2a\x1c\x30\xc7"
+ "\x02\xe6\x8d\xc4\xfb\xbe\x2e\x62\xa6\x39\xea\xf8\xe9\xf5\x54\x87"
+ "\x8c\xad\xdb\x58\xc5\x01\x5b\x35\xbf\x17\xf2\x37\xf5\x5d\xde\x89"
+ "\x24\x5c\x24\xd9\x14\xfd\x54\xca\xe3\xdb\xd0\x77\x9c\xe3\x85\x75"
+ "\x2a\x8d\x1f\xa2\xac\xf7\x31\x59\xa6\x42\x9e\x33\xd2\xdc\x34\xea"
+ "\xf8\xa6\x6c\xa6\x9e\x6f\x11\x9e\xff\xbe\x0d\x78\x8f\x7a\x7c\x42"
+ "\x66\x6e\xf4\x28\x04\x17\x9a\x93\xf8\x41\xe7\x9b\x26\x6d\x4e\x68"
+ "\x3e\x9a\x2f\xc0\x6f\xd3\x9c\xbc\xb9\x50\xf3\xad\x84\xbd\x89\xd6"
+ "\x70\x91\xe4\x25\xdf\x3c\x6f\xd9\x76\x1b\xb7\x04\x6e\xba\x09\xbc"
+ "\xd1\x3e\xbd\xd0\x85\x6a\xf6\xab\x33\x09\x4e\x67\xb5\xbb\x00\xca"
+ "\xf6\x7f\x6f\x87\xed\xaf\xdb\x2f\x6d\x7f\x91\x7e\x8f\x8f\x2b\xad"
+ "\xbe\x20\xee\xc2\xb4\x53\x1b\x35\x9a\x9c\x05\xfa\x16\xb5\x4d\x47"
+ "\xb0\x7b\x13\xf7\x1f\x0f\xab\x74\x6d\x62\x0f\x7b\xf3\x73\xb5\xfe"
+ "\xc8\x3e\xac\x94\x67\x8a\x6f\xfa\x25\xef\xff\x26\x68\x4f\x95\x94"
+ "\xd7\xde\xf4\x6a\xfd\xa6\xef\x87\x47\x8f\x31\xf5\x8e\xbb\xb2\x6c"
+ "\x6b\x41\xa2\x93\x6f\xcc\xb7\x25\xcd\xc9\x9c\x2f\x8c\xc5\x6d\xff"
+ "\x72\xc7\x22\x5b\xea\xad\x73\xf2\xb3\xe7\xde\x23\x7f\xee\x48\x5d"
+ "\x86\xdf\x51\xb6\x03\xb6\x41\xe7\x1f\x53\x47\xca\x83\xef\xa8\x7d"
+ "\xf8\x63\xb6\x47\xf7\x2f\x42\x17\xcd\x4d\xc6\x7a\x5e\x32\xe0\xa5"
+ "\x3d\xb5\x17\x7c\xf2\xf2\xe0\xdf\x38\x7f\x62\xc0\xcb\x63\x8d\xf5"
+ "\xde\xd8\x5b\xb2\xe9\x2f\xd9\x1b\x6b\xae\xa9\x20\x1a\x68\xd9\xc6"
+ "\xfd\x96\xc0\x44\x49\x2b\xe9\x9d\x78\x92\x6e\xe2\x7b\x30\x97\xec"
+ "\xce\x6b\x1c\x7c\x79\x90\xbb\x89\xff\x21\xb8\xfc\xb1\x59\xdb\xc7"
+ "\x85\x1e\xb3\xd4\x58\xbf\x3c\x9f\x0f\x03\x77\x88\x3f\x20\x79\x8e"
+ "\xda\x8c\x82\xde\xf5\x8f\x34\xfe\x57\x93\x25\x2c\xfe\x08\x18\xd8"
+ "\x54\xf8\xa6\x0e\x3a\xff\x83\xe6\x7f\xb9\xd0\x3d\x2b\x4e\xab\xd8"
+ "\x2b\x94\xed\xd7\xae\x20\x59\x20\x59\xab\x93\xea\x32\x49\x7b\x26"
+ "\x59\x1f\x8b\xf0\x4d\x70\xa1\x3f\xa5\x3c\xa6\x09\x7a\x2b\xdc\x0b"
+ "\xb6\xe4\xeb\x10\x7f\x2b\x2d\xa4\xab\xa3\x6f\xe6\x6d\x71\xd0\xdf"
+ "\xa5\x99\x7d\xba\x22\xe4\x09\xeb\xb4\x14\x4f\x85\x5e\xf1\x13\x3f"
+ "\x11\x07\xfc\x10\xbc\xaa\xb0\xa7\xf8\x8f\xc6\xd0\xf9\xdc\x88\xb9"
+ "\xff\x0f\x81\x0f\xe7\x9c\x06\xc2\xed\x3f\xa6\x5c\x99\x20\x79\x27"
+ "\xc5\xa9\x63\xd2\x57\xc4\x7f\xbc\x2c\xd6\xa5\x8a\x8f\x04\x5f\x2f"
+ "\xce\xce\x2d\x01\xee\xc5\x3d\x15\x25\x8a\x70\x92\xf5\x30\x77\xc1"
+ "\x60\x11\xee\xab\x87\xf0\xd2\x4e\x78\x69\x27\xbc\x84\x9d\x03\xb5"
+ "\xef\x8d\xba\x36\x83\xd6\xac\xae\x87\xfd\x47\x01\xfa\x0f\xd8\x10"
+ "\xff\x6e\x52\x08\x56\xc2\x9e\x15\xf0\x31\x5f\xb2\x04\xf7\x0c\x31"
+ "\x56\x4b\x80\xc6\x1c\x39\x2e\xbd\xe2\x29\x77\xd2\xb8\xf4\x34\xae"
+ "\xfc\xd3\x42\x17\x84\xfb\x9f\x44\x4b\x12\xc3\x31\x5c\x0e\xd7\x44"
+ "\x8e\x51\x41\xdc\x27\x31\x86\xc3\x6f\x8d\x35\x46\xae\xc7\x18\x01"
+ "\x83\xc3\x4f\xab\xe7\x9c\xa2\x9f\xa0\x5b\xbd\xec\x70\xaa\x79\x5b"
+ "\x11\x43\x3f\x89\xef\xbd\x03\x73\x58\xeb\xe4\x95\xe8\xe7\x58\xf3"
+ "\x85\xfa\x64\x5d\x6f\xad\xb2\x6c\x2b\xca\x18\x74\xbe\x95\x34\x36"
+ "\xbc\xdf\xba\xeb\xc2\xf0\x7e\x6b\x06\xca\xa3\x1f\xb8\x43\x6a\x81"
+ "\x83\x31\xc2\x6f\xe2\x2b\x4a\xc6\x6a\xd7\xbc\xad\x0e\xfd\x1a\xf3"
+ "\x1b\xe1\x7e\x6f\x45\xce\xc8\x35\xa1\xd4\xfa\x19\xe0\x07\x7d\x91"
+ "\xd4\xeb\xbf\xd5\x16\x3a\x7f\x28\x35\xb6\x5b\x74\xb6\x28\xac\x31"
+ "\xc1\x13\xd3\x78\xc7\xaa\xd7\xa2\xab\x84\x8f\xc2\x3b\x88\x56\x8d"
+ "\xf9\x9d\xd6\x81\x8d\x6f\xbf\xee\x4a\xaa\xaf\xc6\xbc\x4d\xc7\xbd"
+ "\x51\xd7\x4d\x32\xfb\x02\xb3\x01\x57\xea\x6b\x3e\xad\xf1\x93\x62"
+ "\xef\x16\xba\x92\xb7\x69\xfd\x7f\x2c\xe2\xee\x78\x63\x8d\x6a\x7c"
+ "\xae\xb7\x33\x3d\xec\x4f\x11\xb1\x50\xdf\xce\xf3\xe8\xbe\x53\x22"
+ "\xd7\xea\xb4\xdd\xb4\xa7\xad\x54\x9c\x16\x6e\xdb\x62\xe1\x54\x57"
+ "\xac\xc2\x93\xf4\xb4\x6f\xad\x0c\xe3\x8e\xbc\xa7\xaa\xe1\x0e\x95"
+ "\x6f\x18\x1b\x2f\xde\xfe\xec\xc2\x78\xf1\xf6\x41\x55\xcf\x9b\x21"
+ "\x6d\x6f\xdf\x0e\x68\x32\x07\xdf\x3e\x6d\xb7\xad\x10\xed\xbf\x5d"
+ "\x29\xdb\x26\x98\x04\x52\x40\x67\x96\x11\xdc\x8a\x06\x9d\xef\x24"
+ "\x69\xb4\x01\x38\x64\x09\x42\x1e\x62\x02\xcf\xe9\xdb\x12\xa2\x3d"
+ "\xea\x19\xa1\x65\x09\x78\x55\xc5\xf9\x47\x03\xed\x5f\x7b\x70\xf7"
+ "\xc4\x17\x1b\x43\x72\xd9\x3b\x44\xff\x0c\x4b\x25\xfd\x8b\x49\xe0"
+ "\xa5\x31\xd6\x2a\xe9\x87\xc2\x28\x62\x06\xd2\x3a\x47\x9c\x40\xac"
+ "\x75\x4a\x4b\xa0\x7e\x23\x66\x20\xc9\x08\xef\xd4\x69\x7b\xbf\xe2"
+ "\x4c\x01\xbc\x85\xce\x58\x0f\x7e\x98\x60\xf7\x9c\x5e\x39\x30\x30"
+ "\xdf\xca\x30\xe6\x81\xed\x53\x0f\xfc\xe2\x7a\x66\xf8\xc0\xfa\x20"
+ "\xb3\xdf\xc8\x12\xb6\xfd\x1f\x03\xfb\xc7\x42\xa6\x07\x1c\x3c\xec"
+ "\x9d\x7a\x09\xbb\x77\xbc\xda\xfc\x78\xd8\xdb\xf0\x01\xc0\x70\x2e"
+ "\xb3\x3c\xc0\xfb\xe4\xb9\x94\x2b\x8e\xf6\x40\xab\xfc\xfe\xc7\x55"
+ "\x63\xec\x0f\x77\xda\xd6\xe4\xda\x32\xd7\x6f\x5a\x37\x6b\xd6\xa4"
+ "\x31\x64\x09\xd7\x6c\x29\x4b\xb8\xd2\x22\x65\x09\x7a\xcf\xa6\xfa"
+ "\x16\x8e\x96\x1d\x96\xa5\xab\xee\x45\xd2\x93\x59\xf8\xf9\x06\xb6"
+ "\xec\x86\x88\xd7\x9b\xd8\xb2\x1b\x6f\x4a\x5f\x91\xb5\x3a\x73\x73"
+ "\x44\xea\xcd\x91\x7a\xc4\x8a\xdd\xd4\x76\xd4\xd4\xef\x13\xfd\xd0"
+ "\xdd\xf3\x18\xf6\x9d\x77\xef\x2e\x0c\xf0\xaf\x08\x77\x17\xc2\xa7"
+ "\xd7\xd1\xbc\x00\x3b\x4a\xf4\x8d\x4f\x03\x5d\x9f\x28\xfd\xda\x06"
+ "\x19\xf4\x74\x16\x1a\xbb\x97\x64\xba\x7e\x79\xf7\xe2\xdd\x9f\xb7"
+ "\x56\xfb\x89\x4e\x98\xf7\x4b\x7e\xe7\xdd\xb9\x94\x3e\x99\x7e\xef"
+ "\x95\x67\x3a\xef\xfe\x98\xe4\xe5\x14\xe1\xc3\x64\x23\x7c\x98\xbc"
+ "\x2b\x6c\xc3\xae\xf7\x15\x31\xe9\x4b\xcf\xd5\x09\x1f\xf7\x1e\xf6"
+ "\x6e\x15\xf8\x0b\xe4\xa5\x32\xf3\x6c\x3f\x63\xc9\xf8\x05\x3f\x4c"
+ "\xdf\xe6\xf2\x32\xf3\x7e\xbe\x27\x0d\x36\x35\xb3\x29\xfd\x69\xf0"
+ "\x6d\x51\x56\xa3\x69\xd0\xf9\x6e\xa5\xc6\x83\xf8\xc6\xb9\xfb\x05"
+ "\x38\x6b\xfb\xa0\x99\xe8\xb7\xd9\x67\xe1\xe9\xf0\x09\xa4\x63\xb3"
+ "\xb1\x3f\x58\xf2\x53\xc5\xdd\x42\xec\x8b\xa0\x09\xb5\x82\x96\xbe"
+ "\xdb\xad\xd1\x85\x72\x29\x8f\x4e\x42\x79\xda\x3f\xcf\xca\xfd\xf3"
+ "\x3d\xa3\xb6\x16\xe8\x39\x41\xc3\xd5\x11\xf7\xcb\xd6\xe5\x65\xe5"
+ "\x64\x65\xda\xe6\xe4\x4e\x62\x11\x11\x58\xb3\xb3\xd6\xd9\x72\xb2"
+ "\x7e\xbe\x21\x2b\x57\x08\x7a\xf8\x3a\xf2\xfc\x8d\x68\x50\x38\x1e"
+ "\xf6\x54\xc0\xf8\xbd\xcd\x90\x85\x2d\xdb\x66\x89\xb3\x14\x79\x06"
+ "\xb6\xe2\x80\x52\x1e\x9b\x22\xf5\x96\x3d\x04\xd7\x23\xd2\x1f\x57"
+ "\xa9\xb9\x0a\x7c\x5c\x17\x3b\x52\x26\x6d\x65\xde\x7b\x5f\x85\x55"
+ "\x15\xf5\xf3\x70\x98\x5f\x6b\x12\x7e\x87\xa4\xcd\xea\x7b\xc7\x3c"
+ "\xcc\xd5\x10\xe6\x41\x9a\x6e\x05\x1d\x14\xf4\xf0\x5b\x68\xa1\xca"
+ "\x3b\x53\x3b\x47\xb6\xf1\x8d\xbc\xb3\x62\x88\x09\x7d\x20\x62\x23"
+ "\x48\xfa\x7a\x24\x59\x83\x23\xf1\x2f\x9d\xd0\x3b\x68\xf2\xd1\xf2"
+ "\xc0\x79\x5e\xb8\x99\xe9\xa1\x7b\x20\x1a\x72\xe0\x95\x1c\xaf\x9e"
+ "\x3b\xdf\xb3\x11\x2f\x53\x85\x3c\xb5\xaa\xed\x26\x8f\x35\x57\x52"
+ "\x3d\xf9\x61\xb9\xa3\x69\xb1\xe0\xe3\x87\x80\x37\x47\xa6\xa7\x63"
+ "\x8f\x90\xb4\xfb\x92\x6f\xeb\x2f\x9f\x24\xcf\x51\x24\x7d\x3b\xd2"
+ "\xa8\x8e\xa1\x17\x34\x4b\xb5\xfd\xd5\x4b\xbc\x6e\x5a\x4c\x38\x57"
+ "\x85\xb9\x20\x3a\x5f\xa2\xc1\x0b\xe3\x45\xdf\xa1\xb7\x26\x3a\x7c"
+ "\xe0\xd5\x2d\x7e\xbd\x8c\x5d\xfa\xde\x5c\x29\x1f\x35\xd9\x22\xcf"
+ "\x0d\xa5\x2c\xd4\xb4\x20\xec\x27\xe4\xbd\xaa\xd1\x34\x62\xfd\x3a"
+ "\x5c\x27\x7b\x24\x7d\xd3\xea\x47\xb2\xd2\x37\xd8\xe7\xda\x36\xac"
+ "\x13\xc7\xb6\x42\x0d\x90\xb7\xe1\xa1\x47\x6c\xa0\x22\xe9\x4b\x96"
+ "\x2d\x4b\xff\xfe\xbd\x3f\xfc\xf1\x24\xf6\xfd\xd5\x94\x96\xb7\xde"
+ "\xb6\x2c\x79\xae\xfc\xb4\xe2\xce\x3b\x7e\x94\x7e\xc7\xf2\x7b\xef"
+ "\x59\x39\x86\x4d\xba\x89\x70\xa2\x92\xe6\x28\xba\x83\x7d\x50\x2a"
+ "\x6d\x90\x9a\x9a\x47\xda\x20\x35\x79\xe8\x8f\xa8\xf3\xfb\x56\xc6"
+ "\x3e\xa0\xd4\x0f\x4a\xe9\xaf\x48\xe2\x4d\x4c\x1c\xf5\xdf\x17\xc6"
+ "\x9b\x0f\xc4\x79\x1b\x74\x07\x52\xf7\xfa\x3e\xd1\xbf\xf7\x96\x45"
+ "\x7e\x0b\xd3\x82\xf7\x83\x82\x5e\xaa\x78\x01\x7c\x48\x0f\x18\x05"
+ "\x6e\x48\x7e\xe5\xfd\x65\x1a\x6e\x54\xc8\xf3\x21\x06\x9d\x19\xbe"
+ "\x13\x7e\x57\x41\xbf\x4c\xb8\x50\x89\xb3\x75\xa4\xf3\xd8\x15\x55"
+ "\x6a\xbd\xc5\xd0\x37\x83\x9f\x55\xcf\xc4\xcc\x3d\xec\xfd\x77\xb9"
+ "\xb3\x69\xa9\x94\x05\x9b\x36\x0b\xbc\xd9\x3e\xf5\xfb\xe2\x0c\x52"
+ "\xdc\x27\x7a\xbf\x31\x8c\x3f\x1f\x94\x62\x6e\x40\x17\x24\xed\x7d"
+ "\xff\xd8\x28\x3d\x4e\x14\xa5\x75\x6b\x7e\xe6\xf3\x66\x31\xbd\x61"
+ "\x56\x25\xab\xd2\xf3\x22\x0f\x7b\xbf\x5a\xda\xa1\x7e\x60\xd4\xf8"
+ "\x67\x7a\x4e\xf0\x30\xde\x3e\x5a\xff\x55\x1e\xa1\xff\x2a\xb4\xf3"
+ "\x13\xad\x76\x2f\x78\x64\x97\xdb\x2b\xfc\x9b\xde\xd6\x6a\xf7\xc1"
+ "\xb6\x64\x52\x17\xfb\xe0\x7e\x47\x90\x0f\xd1\xf3\x54\x1a\x9b\xd8"
+ "\x43\xe6\x4b\x9d\x02\xc9\x63\x1f\x94\x49\xd9\x44\xa6\x03\xee\xf4"
+ "\x8c\x3e\x1a\x30\x3f\x84\x97\xdd\x34\x47\xcb\xc7\xa2\x7b\xe6\x6d"
+ "\x7a\xd5\x8f\xd4\x07\x27\x20\xa3\x02\x56\xcf\xea\x95\xec\x67\x9d"
+ "\xf4\x47\xbf\xa0\x7d\x61\xfe\x92\xfb\x25\x6c\x3f\xf0\x34\xe5\xf7"
+ "\x62\xdf\xf4\x8f\x47\x4b\x69\x3e\x8f\x6b\xf3\xb9\x3c\xe8\xbd\x0d"
+ "\xf3\x35\xe8\xfc\x4f\xab\x36\x97\x7d\x57\xbf\xee\x89\xda\xc6\x6c"
+ "\x47\x6a\x6e\x44\x3a\xad\xff\x0f\xaa\x85\x6d\x0f\xd6\xd7\xa8\xb2"
+ "\x44\x87\x53\xd4\xf2\x69\x5a\xf9\xd1\xfe\x89\xc5\x05\x5d\x28\xb9"
+ "\x16\x49\x1b\x1f\x35\x9c\xf4\x08\x1b\x1f\x9c\x01\x36\x49\x9c\xd4"
+ "\x74\x70\x71\x72\x3c\xcd\x3f\x50\xca\x49\xfe\x2e\x8f\x7e\x52\xd5"
+ "\x03\xd0\xda\xfe\xcf\xfe\xeb\x19\x5b\xeb\xdb\x94\x16\xd2\xa1\x40"
+ "\xf7\x01\x9f\x83\xd4\x0f\x4f\x84\x8e\x2c\x64\xa3\xe9\x61\xcd\xa9"
+ "\xb0\x19\xc3\x9d\x65\xd4\x83\x75\x25\xf5\x36\xcd\x71\x6e\xa2\xbc"
+ "\x54\xdf\x3a\x71\xfe\xed\xfc\xcf\x6c\x81\x7b\x24\x6b\x0b\x39\xbf"
+ "\x80\x7f\xa5\xda\x30\x09\xde\x45\xde\xc7\x6b\x5e\x12\xd2\x05\x89"
+ "\xbb\x69\xff\x29\xec\xb2\x29\x7d\xd5\x58\xfa\x42\xa2\x0f\xd9\xab"
+ "\xd7\x65\xae\x7f\xf8\xe1\x6f\x27\x0d\x91\x67\x5c\x95\x4e\xa5\x84"
+ "\xea\x24\xf9\xf7\xd5\x6c\x89\xa7\xcd\x44\xff\x5f\x4c\x91\xfc\xdb"
+ "\xbf\x9f\xa2\x75\x33\xa3\x87\x7d\x68\xd5\xf8\x77\xb9\x8e\x3e\x9c"
+ "\xcd\x9d\xcd\xd9\xe1\xb5\xd1\xec\xfd\xe6\xda\xf8\xd0\x30\xf6\xda"
+ "\xf8\x30\x89\xf6\xd9\xe3\xf4\x7d\x36\xb5\x79\x5c\xd0\x7c\xcc\xb7"
+ "\xe4\xc1\x5d\x96\xc0\x6d\x82\x07\x4f\xdf\xcc\x74\xe0\xbf\xa1\x9b"
+ "\xc6\x7e\x10\x24\xb9\x36\x48\x34\x22\x3d\xc0\xe2\xb0\x17\x54\xac"
+ "\x83\xde\x71\x26\x0f\x0c\x70\x4f\xfa\x66\xa2\x17\xf4\x5e\xde\x23"
+ "\xcf\xe0\x1f\xe8\x27\x39\x84\x9e\x2b\xba\x40\x2b\x14\x04\x43\x60"
+ "\x72\xbf\xfe\xb0\x5a\xe3\x71\x2d\xdb\x6c\xc2\x47\x36\xf6\xed\xa0"
+ "\xb4\x67\xaa\xc7\xde\x4d\xed\x34\x08\x1a\x14\xb4\xe0\x0c\x80\x55"
+ "\xfc\x8c\xea\x85\x5d\xd0\x3a\xf4\x2f\xea\x26\x4b\x20\x59\x9c\x15"
+ "\xec\xfb\x99\xb0\x07\xba\x49\xda\x03\xdd\xc4\x6a\xd7\x01\x0e\x1f"
+ "\xfa\x2f\xa8\x1b\x8f\xbd\x25\x35\x32\x3d\xff\xe1\x35\xe9\xf6\xec"
+ "\xcd\xe9\xb0\x05\x1c\xb5\xbf\xcb\x35\xe4\xfc\x68\xba\x84\xef\x47"
+ "\xa9\x61\x5d\x95\xb4\xe1\x03\xcd\x9c\xef\x17\x3e\x6c\xd5\xb3\x9e"
+ "\x8f\x17\x00\xf6\x8e\xf3\x78\x37\x12\xce\x7d\x3c\x0f\x67\x3f\x7d"
+ "\xb0\x9d\xd9\x97\xc6\x2a\x9d\x1c\xe7\x8d\xc4\x6b\x7d\x7c\xa9\x76"
+ "\xa7\xbe\x8f\xd2\x69\xed\x23\x2d\x46\x9c\x35\xe6\x09\xdd\x1c\xc1"
+ "\xe9\x23\x97\x87\x59\x54\x5b\xd7\xe8\xa7\x60\x9f\x27\x6c\xca\x05"
+ "\x9f\xf1\xd1\x69\x79\x47\xeb\xa3\x4e\x0d\x96\xc4\xfb\x2e\xc4\xbd"
+ "\x7e\xd8\xe9\xf4\x71\xd8\x04\x7e\xcc\xb4\xf2\x1e\xf6\x91\xb8\x63"
+ "\x7a\x8f\x4f\x3c\x1f\x7a\xc0\x17\x79\x27\xff\xa3\x6a\x49\xb7\x3e"
+ "\xaa\xa1\x74\xa2\x95\x1f\x15\x51\x9f\xcd\xd2\x47\x80\xa8\x67\xa9"
+ "\x66\x0f\x15\x09\xb7\x3b\x56\xdb\x89\x59\x5e\xf3\xf0\xc3\x59\x39"
+ "\xb9\x5a\x4c\xf9\xa4\xf5\x6b\x33\x6f\x55\xef\xe0\xaf\xcb\xda\x94"
+ "\xbe\x26\x53\xdc\xf1\xa1\x54\xf9\x38\x0a\xbe\x73\x21\xdf\x08\xbb"
+ "\x79\x31\xa6\xb6\x39\xb5\x2a\x1f\xd5\xc1\x5a\x1a\xa4\xbd\x45\xcb"
+ "\xa3\x72\x6f\xbb\xe4\x25\xea\x47\x9b\xb6\xb7\x41\xc7\xd2\xc7\xbe"
+ "\x6b\xc3\x99\x19\xfc\x32\xe0\x6c\x0e\x7a\x16\xca\x43\x6b\xf4\xa3"
+ "\xd0\x9d\xe9\x32\x4a\xc7\x99\xb0\x6b\x1d\xce\x81\xdb\xee\x54\xca"
+ "\x8c\xa5\x7c\x52\xff\x42\xa2\x6b\x26\xcc\x1d\xce\x8a\x64\x0c\x8f"
+ "\x96\x14\xd0\x6b\xe8\x02\x5d\xeb\x60\x4f\xdb\x12\x47\xfc\x09\xed"
+ "\x97\x6d\x4b\x49\xd6\x2b\x2d\xde\xc2\x8c\x68\x83\xf6\x42\x8f\xd4"
+ "\x2b\xb7\xac\x7a\xb7\x80\x31\x75\x3f\xf4\x94\x09\x3d\x67\x4b\x92"
+ "\xdc\x53\x8d\x75\xaa\x1e\xa5\x8e\xf2\x15\x7b\xd8\x55\x5e\xd9\xe7"
+ "\xfe\x0c\x81\x27\x82\xd6\xb5\x1c\xe0\x4f\xf6\x8b\x3b\x02\xf4\x9b"
+ "\xa1\xf0\xec\x28\xbc\xd3\x5e\x33\x89\xe6\xb1\x8d\x3b\x92\x98\x6a"
+ "\x27\x1d\xd5\xc5\x8e\xde\x00\x3d\x30\xe1\x87\x0b\xb0\xa0\xfa\x0f"
+ "\xa9\xf5\x1f\xa2\xfa\xa9\xdd\x9b\xd4\xf8\xb9\x2d\x5e\xad\x2d\x5a"
+ "\xaf\x5e\xda\x8f\x4b\xb1\x27\x53\xff\x8b\xe9\xaf\x44\xea\x9c\xfc"
+ "\x24\xfb\xcd\x0c\xe9\x9c\x24\xdf\x77\x34\x49\x5b\x2f\x68\x5b\x1d"
+ "\xc3\x01\xc5\x29\xfc\xb7\xea\xd4\xb6\x0e\x40\xff\xa1\xd5\xc9\xa9"
+ "\x4e\x3e\xd0\x5b\x47\xfb\xa7\x91\xe8\x86\xd7\xbc\x8d\xf6\x49\xb4"
+ "\x01\xbe\xdd\x37\x93\xd3\x3e\x1a\x4c\x0f\x1a\xa4\x0f\x8d\xcd\x2c"
+ "\x36\x92\x67\xa7\xf6\xaa\xc3\x7c\x26\xd5\x31\x40\xf4\xb9\x90\x15"
+ "\x75\xb2\xa3\xaf\xa1\x6d\xd8\x39\x61\x5e\x87\x68\x9e\x68\xae\x52"
+ "\xa8\x9d\x7a\x92\x35\x62\x09\x0e\x9f\x61\xbe\x60\x3b\x52\x3b\x24"
+ "\xe4\x0f\x0b\xf5\xcd\xd0\xc1\x8e\xbe\x8b\xb9\x42\x5d\x84\x17\x71"
+ "\x81\xc1\xb4\x7f\x85\x0f\x3b\xc0\x7a\x6b\x01\xef\xc6\xf9\x65\x17"
+ "\x73\xdf\x09\xbe\x9c\x64\x15\xf1\xec\xc8\xe4\x8a\x98\x6b\x61\x3b"
+ "\xed\xbe\x73\x6b\x37\x57\xce\x3b\x19\x6f\xa6\xfd\xe1\xbc\x9e\x05"
+ "\xfc\x24\x57\x53\xbf\xf5\x8e\xd3\xf0\xb3\x57\x47\xb4\xa6\x04\x36"
+ "\x2b\xc6\xf2\x2d\x2c\x0e\x3e\x0a\x1d\x76\xee\x6f\xf5\xd5\xb0\x56"
+ "\x7b\x0d\xfb\x28\x50\xc5\x5c\x1b\xa1\xa7\x75\xf7\x7e\x9c\x5f\x85"
+ "\xbb\x2a\x31\xf4\xfc\xb2\xed\x47\x68\xab\xb5\xf8\xe3\x63\x9f\xd2"
+ "\xcc\x7d\xca\x6c\x3f\x11\xef\x55\x2d\x69\x1f\x11\xb6\x7d\xc4\x1c"
+ "\x9d\x5c\x01\x8f\x57\xf8\x28\xda\x28\xa1\xba\xea\xe0\xcf\x2f\x4e"
+ "\xe9\xb3\x4e\xa2\xf1\x1b\x96\xe7\x33\x71\x46\xea\x5a\xf7\x47\xf4"
+ "\xf1\xd2\xda\x73\xcc\xe8\x5a\xf7\x9e\x78\x16\x3a\x13\x1a\xaf\x3b"
+ "\xb3\x5d\xd8\x60\xc2\x97\xa1\x3b\xbf\x1b\x77\xbe\x95\x0a\xf4\x31"
+ "\x28\xfb\x4d\xf0\x32\x68\xe5\xf7\x15\x6a\xe5\x5b\x05\x2d\xd8\x0b"
+ "\x78\x50\x9f\x8e\xae\x94\x30\x69\xa1\x54\xd9\x67\x82\x4f\x5a\x24"
+ "\x7c\x5a\x17\x00\x3e\xb0\x49\x57\x36\xf6\xd6\x51\xdf\x52\x08\x06"
+ "\x8a\xd6\x06\x70\x00\x67\x79\xa8\xbf\xfc\x1c\x33\xb9\xd6\xc1\x66"
+ "\xdd\xbd\xcb\x92\x6a\x30\x2a\x03\xa7\xeb\x2b\xfa\x99\x01\xf3\x06"
+ "\xde\xa1\x42\x7c\x17\x30\x2f\xc0\x9c\x79\x63\xa3\xf3\xe9\xaf\x80"
+ "\xfe\x8a\x80\x7b\xf4\x5b\x4c\xf3\x55\x42\x7d\x48\xa0\xb9\xaa\xc3"
+ "\xaf\xc0\xc7\x92\x81\x7a\xf8\x78\xc5\xfe\x4c\xb8\x12\x4e\x7f\x72"
+ "\xe0\xd5\x00\xad\x1d\x45\xc8\x9e\xee\x04\xa5\x2c\xde\x25\xed\x97"
+ "\x3f\x5e\xb9\x97\x78\xfd\x9a\x67\x84\x8f\x0c\x13\xc9\x27\xd0\x39"
+ "\xb0\xdd\xe2\x2e\x5d\x9b\x55\xa3\xe3\x4f\x26\xc2\xff\x84\x7b\x89"
+ "\x5e\xd8\x52\x1a\xf7\xab\xb8\xbe\x9f\xf2\x2c\xf6\xb0\xeb\xb3\xe5"
+ "\x9a\x68\x11\x77\x00\x41\x07\xc6\xe3\xb3\x68\xef\x6a\x81\x0d\x2b"
+ "\x9f\x96\xc6\x4c\x3a\xee\x35\x65\x58\xb8\x3b\xd0\x04\x1c\x32\x09"
+ "\xdc\x97\xdf\x88\x37\xf6\x5a\x68\x6f\x6b\xa3\x74\x83\x96\x8e\x3d"
+ "\x54\x21\x79\x19\xb2\xfa\xf2\xcd\x16\x5e\xd8\xcf\xa6\x0b\xbd\x97"
+ "\x96\xbe\xd9\x6b\x69\xa5\x9d\xbf\x90\x68\x37\x7c\xeb\xa0\x0c\xa5"
+ "\x47\xd1\x5e\x79\x98\xda\x75\x51\xfe\x04\x2d\x3f\xef\x4b\x33\xb8"
+ "\xf3\x9b\xc4\x3a\x83\xff\x35\xb1\x47\xca\xf4\xe8\xe5\xf9\x5e\x8b"
+ "\x98\x33\x2d\x2d\x37\x4d\xec\xcd\xf0\xc3\x41\xbc\x37\x17\xfd\xe9"
+ "\x12\xe9\x3a\x92\x9d\x91\x1e\x17\x91\xa6\x87\xcf\x13\xf8\xd3\x8c"
+ "\x48\x8b\xa2\x3e\xb3\xd0\x3b\xb5\x8d\x7d\x1a\xeb\x6e\xf9\x66\x9c"
+ "\x01\xca\xfd\x59\xb4\xbd\x99\x33\xe9\xa3\x57\xa6\x49\x3e\xe0\x93"
+ "\xba\x48\xb9\x1d\xe7\x2e\x68\x5b\xe9\x4b\xd3\x07\xfb\xd2\xa2\xd0"
+ "\x3e\xea\x82\xce\x95\xc6\x48\xed\x76\x33\xf8\x87\xe7\x65\x3f\xaa"
+ "\xe7\xb8\xf7\x45\xf5\x8a\xfe\xe4\xfb\x89\xf6\xdc\x97\x3c\xb6\x7d"
+ "\x4f\x4a\xb6\xab\xf0\x27\x84\xd3\x9f\x1e\x00\x4d\x09\x9a\x62\x1a"
+ "\x6c\x3f\xc3\x3e\xfd\xe9\x2c\xcc\x69\x90\xd6\x79\x30\x36\xa6\x61"
+ "\x7e\x37\xd3\x15\xd2\xda\x91\x67\x93\x9f\xde\x0e\x3e\xd1\xa1\x70"
+ "\x4e\xcf\x0b\x80\xbb\x96\x5e\xd8\xe5\xc4\x34\x0a\x5b\x18\xf3\xe2"
+ "\x0c\xb7\xbf\x9b\xb5\x14\x7d\xc1\x5a\x02\xee\xa2\xc3\xe7\xbc\x06"
+ "\x69\x13\x63\x40\xbd\xf7\xe2\x9b\x83\xd6\x4b\x7a\xb0\x6e\x7c\xd9"
+ "\x96\xe4\x25\x82\xdd\xdf\xe4\x5e\xf0\xe9\x01\x4d\x46\xba\xf0\x18"
+ "\xfe\x24\x7c\xa2\xc2\x5e\x54\x29\x9f\x0a\x9d\xab\x83\x0f\x26\xb1"
+ "\xf9\x5b\xa0\xab\xfe\xb4\xdd\xec\x63\x29\x6a\xbd\x67\x65\xbd\x7f"
+ "\x62\x17\xaa\x17\x78\xdb\x52\x2d\xed\x50\x14\xf3\xd4\xd4\x20\xd5"
+ "\x1d\x34\x4f\xad\xa4\xbd\xc6\x41\xfc\x0b\xf1\x23\xc7\xee\xa4\x76"
+ "\x52\x5b\x03\x6d\x0c\x7e\x95\x6b\x15\xda\xaf\xcf\x5a\x99\x6a\xff"
+ "\xe3\x38\xc3\xfe\x74\x83\xc2\x93\xe2\x48\x76\x13\x7d\x01\x9d\x85"
+ "\x3e\xbd\x30\xc8\x26\xb8\xf3\x48\xca\x8a\x4d\xc9\xa6\x3a\xbe\xfb"
+ "\x3e\x74\xed\x44\xab\x82\xdc\xaa\x7f\x6b\xc0\xc3\x2a\x88\x7e\x0b"
+ "\xff\xa0\xdb\xa7\xed\x36\x6f\x63\xb7\x71\xbd\x45\xd8\x8f\x29\x65"
+ "\x8b\xb2\x69\x6e\x25\x8c\xcb\x8d\x0d\x11\xb6\x46\x51\xd4\xd6\x1b"
+ "\xb0\x35\xe2\x26\x63\x7e\x0d\xf6\x4c\x9a\xb3\x41\xe7\x9f\x88\xff"
+ "\xff\x44\xec\x77\xa5\xe0\x8b\x04\x9d\x3f\x76\xb7\x37\x36\x31\x19"
+ "\x75\xc0\x4f\x99\xb2\x31\x50\x5f\xf1\x35\x33\x48\x78\x1c\x9b\xd7"
+ "\xda\x3b\xe8\xe2\xa5\x89\xc9\x58\x47\x6a\xdd\x16\xaa\x3b\xc8\xcb"
+ "\x12\x49\xf6\x39\xb6\x4c\xce\x8d\x78\xb6\xe2\x7b\x60\x18\x77\x03"
+ "\xff\x54\x55\x33\x04\xbe\xe8\x4f\x29\xc4\xeb\xba\xfa\x4c\x89\xc9"
+ "\x3f\xb4\x16\x11\x0f\x70\x2c\xc3\xa3\x53\xc4\x1d\x36\xcd\xd7\xe9"
+ "\x78\xe7\x6a\x7c\x8f\x75\x92\x9b\x2a\x21\xbe\x3d\xa1\x87\xfd\xf9"
+ "\x93\x21\x27\xd3\x0f\xd3\xde\x3a\x44\xb2\x0f\xdf\x93\x66\x2a\x9f"
+ "\xca\x92\xe9\xdb\xd4\x1e\x76\xec\x8d\x80\x9e\x25\xd0\x5f\x9c\x77"
+ "\x5a\x76\x0c\xd5\x9b\x02\x9d\xee\xd1\x73\x38\x67\xfe\x4c\xfa\xe5"
+ "\xd8\xcd\x66\x2b\x54\x1f\x74\xc9\x15\x53\xd9\x6c\xe8\x91\x29\x2d"
+ "\x29\x3d\x28\xcf\x59\x34\x39\x71\xfb\x54\x36\x77\x64\xbb\xc7\x6a"
+ "\x24\x9f\xf7\x67\xb1\xc7\x6f\xf2\xb2\x2b\xec\xdf\xe3\x1d\x54\x6f"
+ "\x25\x77\x46\x71\x3e\xcd\xaa\x97\xfc\xe0\x67\x9b\x2d\xd5\x12\xef"
+ "\xc4\xb9\x02\xe1\x1b\xce\x6d\x54\x7d\xb5\x4e\xf8\x78\x35\x9b\x97"
+ "\xe0\x6e\x96\x48\xd3\xc5\x01\x96\x71\xa2\x1f\xaa\x5f\xc6\xe0\xf6"
+ "\x6b\x33\x50\x07\xfa\x93\xbe\x5a\xea\xba\xe1\xb3\x91\xe0\x2a\xec"
+ "\x84\x4b\x77\x33\xd3\x53\xbb\x59\xdc\xd1\x87\xc5\xb8\x0e\xc8\xb5"
+ "\x68\x60\xe8\xaf\x52\x8a\x75\x46\x38\x41\xfd\x46\x7b\xc0\x8d\xd6"
+ "\xc0\x59\x97\x23\x8f\x2b\xae\x9f\xc1\x3f\xc9\x67\xa7\x5c\x39\x87"
+ "\xd8\xf2\xce\x80\xf4\x33\xb6\x8a\x79\xf7\x51\x7d\xfb\xa6\xb2\x38"
+ "\xaa\xab\xdf\xbd\x16\xb4\xd6\x7a\xa5\x2b\xa7\x81\xea\xfe\x73\x0c"
+ "\xf6\xa3\x32\x82\x8f\xdc\x97\xfe\x7c\xd8\xed\x6f\x67\x88\x71\x71"
+ "\x8f\x9d\x07\x51\x0f\xe5\xb9\x5d\x8c\x77\x8f\xd5\x96\x2e\xfd\x6a"
+ "\x8a\xb1\x86\xce\x10\xd4\x71\xb8\xcf\x89\xfa\x56\xba\x33\x88\xe7"
+ "\x54\xc7\xa4\xc1\x5a\xe2\xd7\x9f\x9f\x76\xe5\xec\x67\x98\x1f\xe4"
+ "\xa7\xf7\x22\x77\x2f\xe5\x3d\x3d\x72\x5e\x90\x87\xbe\xbd\x46\xf5"
+ "\xfe\xdf\xf0\xd9\x18\xce\x6c\xc2\x79\x6a\x68\x3c\x04\x2b\xdf\x1e"
+ "\x82\x91\xd4\x19\xfe\x79\x06\xfa\x4a\x73\x37\xdd\x9d\xf7\xc5\xd8"
+ "\x77\x22\x69\xed\x13\xde\x6f\x6b\x15\xfa\xb2\xbf\xc4\xde\x13\x50"
+ "\xb8\xa4\x67\x7f\x71\x11\xef\x96\xed\xa1\x5f\xd0\x02\x41\x4f\xae"
+ "\xc7\x79\xf6\x5f\xde\xb5\xe8\xe4\xfc\x62\x2c\xe0\x99\xc6\x9a\xe3"
+ "\x88\xb3\x8a\x38\xf4\x55\x9b\x63\x6e\x4a\xc9\x56\x70\x06\x05\xdb"
+ "\xde\x61\x2b\x93\xf8\xc7\x2b\xa9\xde\xd7\x54\x1e\xd2\xaf\xee\xa7"
+ "\xfe\xbe\xd8\x18\x17\x7f\xcc\xca\x34\x3b\x44\x5a\xbf\x87\xd3\xa5"
+ "\xed\xa8\x15\x34\x6a\x9f\x5e\xae\x1d\xf4\x51\x2d\xeb\x93\x67\xe3"
+ "\x7f\x29\xa2\xf2\x63\xda\x7d\xf3\xa8\xa9\xf0\x3f\xe5\x80\x0f\x51"
+ "\x71\x57\x89\x68\x15\xed\x07\x13\xdc\xbe\x21\x26\xcf\xeb\xdb\x6f"
+ "\x25\x1e\x7f\x02\xee\xa9\x6a\x7d\xbb\xb8\x73\x85\x76\xf5\xbe\x5c"
+ "\xfb\x52\x4d\x86\xe6\x26\x82\xb1\xd3\x22\xe2\x1d\x10\xdf\xa5\xf8"
+ "\x62\x53\xec\xde\xd8\x15\x75\x72\xdd\xb4\xdb\x79\xac\xa4\xb7\xe9"
+ "\x7e\x56\x84\x71\xa9\x7a\x89\x09\x18\x33\xd5\x53\xa9\x9d\x6f\x6b"
+ "\x75\x8f\x1b\x43\x44\x1b\x1b\x8d\x49\xfa\x37\x48\xc9\x16\x63\x83"
+ "\x8f\x1e\x31\xb6\xcf\xc5\x1d\xc0\x8b\x1c\x4f\xbb\x84\x6d\x8a\xdd"
+ "\x35\x15\x75\x7c\xf1\x4b\xf4\x0f\x73\x42\xf4\xe1\xb2\x1e\xf6\x79"
+ "\x06\x9f\xf4\xd4\xa4\x8b\xab\xf3\xf3\xb9\xb2\xce\x15\x75\xcf\x11"
+ "\x0d\x96\x77\x16\x61\xb3\xf3\x45\x19\x2f\x5b\x51\x07\x19\xa6\x8f"
+ "\xda\x23\xfc\x88\xa0\x43\x5f\xc4\x61\xae\xae\x3f\xc4\x52\x24\x1e"
+ "\x7e\x11\x0d\x79\x57\xc6\x78\xfa\xbc\x81\xf0\x5e\xfa\x97\x0b\xd9"
+ "\xac\xea\xc4\x3e\x16\x49\x63\x2f\xb2\x8f\x52\xa6\x31\x2f\x22\x79"
+ "\xee\xf3\xfd\xc2\x2e\x89\xfa\xbb\x29\xa0\xd1\xbf\xcf\xf7\x73\xe8"
+ "\xbb\x0b\x55\xbd\x27\x68\x59\xa1\xf4\x11\x38\xe8\xfc\x62\x49\x48"
+ "\xef\x89\x3b\xdd\x4e\xde\x8c\x7c\x34\xf7\x67\x91\x47\xfa\x20\xeb"
+ "\x51\xef\x3b\x7f\xf1\x63\xf5\x2e\x73\x12\x6c\xb5\xa8\x2c\xd1\x3b"
+ "\x2e\xf4\xad\x80\x01\xda\x16\x7d\xd7\x43\xc7\xf9\x45\x4d\x58\xcf"
+ "\xfc\xb9\x88\x0d\x21\xfd\x11\x7c\xd1\xa0\xe1\x08\x8d\x77\x82\x8c"
+ "\xeb\xf1\xf9\x8c\x23\x73\x99\xc0\x81\x3e\x6e\x9d\x74\x55\x0d\x70"
+ "\xf2\x8b\xe3\x91\x70\x5a\x1e\x50\x1c\x92\x06\x7d\xde\xc4\xc5\x5a"
+ "\xff\xbc\xe9\xdb\xf9\x89\xff\xba\x41\xe3\x45\x24\x9c\xe3\x88\xbe"
+ "\x7c\x19\x10\xb0\x2e\x19\x40\x0c\x38\xcb\x63\x85\xf0\x23\xfe\x5f"
+ "\x5f\xc3\x5f\x7b\xa0\x64\xc0\x1e\x74\x58\xe1\x9f\x96\x29\x25\x03"
+ "\x45\x5d\x76\xa6\x4f\xb7\x43\xb7\x9e\x28\x64\x3c\x92\x59\xe3\xb8"
+ "\x99\xf8\x13\x5a\xe7\x5b\xd7\x30\xcb\xfd\xd9\xd0\x31\x24\x25\xc0"
+ "\x9f\x3a\x7c\xa9\x23\x16\x42\xd0\x91\x14\x4f\xcf\x89\xc4\xcf\xc5"
+ "\x71\xe3\x40\x06\xce\xe7\x83\x4e\x4e\xf4\xf8\x38\x7c\xba\xeb\xdd"
+ "\x5e\x3f\xdb\x7a\x9a\x19\xe1\xaf\x3d\x50\x96\x68\x6d\xf5\x7d\x29"
+ "\xe4\x1b\xb3\x9d\x25\x10\xff\x81\x3b\x00\x56\x25\x36\x91\xd1\x1e"
+ "\x6f\x90\xe3\x3e\xcb\xe5\xb8\x65\xbf\xd1\x7f\x41\xe3\x4a\xfc\x45"
+ "\x85\xa2\xef\x5f\x3e\x17\xa0\xfa\x95\x92\x60\x41\xb0\x24\x98\x2f"
+ "\xef\xd4\xb7\xb0\xc2\x3c\xde\xed\xf6\xb5\x90\xcc\xd5\x2f\x62\xd7"
+ "\xe1\xfc\x1f\x63\xc4\xf8\xd0\xf6\xc7\xe7\x4e\x0b\x5e\x2b\x40\xef"
+ "\x8e\xb5\x6a\x99\x5e\x2a\xd3\xdb\xc2\x86\x4a\x82\x62\xec\xad\x3e"
+ "\x59\x36\x5d\x3c\xa3\x7c\x04\x1c\xd4\x31\x87\xe0\x40\x63\xc7\xf8"
+ "\x30\xfe\x00\x60\x42\x30\x50\xc7\x6a\x1d\x56\xc7\x89\x31\x7e\x44"
+ "\xbb\xce\x6e\x1a\x27\x8d\x55\x8c\x73\x98\xc6\xd9\x9c\xcd\x98\xbf"
+ "\x3c\xa5\xe8\xfc\xa4\x60\x3e\x64\x54\xc7\x27\xc4\xc3\x17\x54\x32"
+ "\x92\x45\x0d\x2f\x17\x56\xea\x9f\x24\xde\xa4\xd0\x4b\x32\xa9\x97"
+ "\x77\xc3\x86\xd7\x6d\xa7\xbf\x40\x0d\x03\x8f\xa3\xf1\xeb\xd4\xb6"
+ "\xf5\x63\xe5\x24\x2b\xec\xe6\xdd\xc4\x9b\xfa\xdd\x01\xca\x93\x4d"
+ "\xe3\x27\x19\xb6\x4b\xed\x3f\xf2\x6e\xfd\x5a\x8e\xcb\xb2\x96\x25"
+ "\xbc\xf3\x93\x12\xbd\xbb\xbd\x84\x69\x63\x79\x80\xf2\xd1\x78\xac"
+ "\x54\x57\x2c\xc6\xa3\xd0\x38\xf7\x50\x3f\xfd\x11\x63\x3a\xda\x0b"
+ "\x3b\xe2\xcf\xd8\xa4\x54\xa6\xdb\x7d\x86\xc6\x71\x86\x59\x2b\x0b"
+ "\x89\xff\x5a\x01\x7e\xf1\xf8\xd1\x4b\xd2\xd8\x6c\x0f\xfb\xaf\x63"
+ "\x52\xa6\x13\xbe\xa0\x2f\xed\x61\x5f\xf6\x87\xfc\x3d\xc3\x87\x7e"
+ "\x6c\xe2\x74\xe0\x91\xf0\xfb\x8c\x3d\x63\x90\x70\x06\xe7\xf4\x9b"
+ "\xa8\x8d\xc1\xa4\x44\xd1\x1f\xe7\x02\xd8\x09\x9b\xe8\x1d\xb1\xa3"
+ "\x70\x5f\x55\x47\xe5\xac\x9c\x60\x86\xfa\x89\x9f\x33\xe0\x17\x30"
+ "\x1c\xd3\xe6\xf6\x15\xb6\x90\xda\x68\x80\xfc\x5d\x5f\xe8\xd5\x3f"
+ "\xfe\x0a\x9b\x7b\x71\x34\xe5\xaf\xb3\xc7\xa3\xdf\xd0\xcf\xa2\x3e"
+ "\x1a\x5b\x7c\x0f\xfb\x5b\xcc\xc8\x35\x66\x13\xb4\x4c\xd2\xc1\xbf"
+ "\xb6\x41\xff\x79\x91\xed\x0a\x1e\x0e\x36\x16\x17\x59\xee\x98\xd6"
+ "\x0f\x7a\x1e\xf7\xbe\xc5\xc5\xc3\xe1\x6f\x73\xc7\xab\xab\x6c\xa7"
+ "\xb0\x91\x74\x94\xef\x24\x7a\x41\xbc\xc2\x11\x2b\xce\x52\x68\xef"
+ "\xdc\xef\x63\xb9\x7b\x19\xe2\xcf\xc4\xba\x03\x77\xb3\x23\x35\xc9"
+ "\xac\xf6\x1c\x7c\xc6\x25\xc5\x3f\x7b\x8e\xe6\x52\xa5\x21\xe0\x49"
+ "\xa1\x47\xe6\xb9\x49\x71\x15\x3b\x35\x1e\xfe\x6f\xfd\x05\xfd\x4c"
+ "\x6f\x5b\x27\x9e\x7d\x4b\x6c\x3c\x50\xa5\x57\xb2\x6b\xe0\xc7\xdc"
+ "\xbc\xa8\x1e\x7e\xcc\x35\xdf\xe0\x82\xf7\xc9\xa7\x35\xd7\x67\x9d"
+ "\x54\x96\xc3\xe6\x22\x9e\x81\xc5\x2b\x79\x39\xb9\x5f\x7b\x66\x53"
+ "\xff\xe2\x54\x7f\xe1\x71\xd2\x5f\xf8\x5f\xd7\xc2\xe6\x5c\xfd\x7e"
+ "\x6f\x90\x64\x18\x51\x6f\x0e\x9b\x5d\x73\x8e\x25\x81\x0f\x4a\x3f"
+ "\x29\x79\x36\xc8\x85\x77\xf7\x5a\x78\xf0\x1f\x49\x6c\x6f\x4f\x38"
+ "\xde\x81\x37\x17\x31\x12\xb8\x75\x3c\xfb\xe9\x8a\x44\x61\x4f\x20"
+ "\x7c\xed\xe2\x9c\x81\xde\x59\xd5\x33\xcc\x70\x04\xb6\x89\x75\xf2"
+ "\x1e\xde\x91\x80\xb4\xf7\x1d\x74\x7a\x9a\x34\x3f\xf0\xe3\x9e\x97"
+ "\x97\x4a\x79\x47\x99\x40\xf2\x97\x77\xd0\x25\x7d\x90\x9e\x30\xb9"
+ "\x8b\x95\x08\x19\xc7\x73\x1a\xdf\x90\x06\xbf\x6e\x29\x02\x96\x27"
+ "\x16\x40\xee\x51\x65\xc6\x77\x6c\xa1\x34\xc9\xc3\x08\x9b\x6b\xab"
+ "\x3c\xff\xa3\xbd\xc9\x3c\xe8\x3c\x91\xaa\xed\x67\xd8\xd7\xa5\xaf"
+ "\xd7\x13\x99\x1e\x3d\x3b\x7e\x81\xfe\xc5\xa9\x36\xe2\x38\xbb\x49"
+ "\xa1\xfc\x55\xda\xfe\x26\xce\x70\xb7\x4f\xfd\x7e\xee\x66\x36\xfd"
+ "\x87\x97\x1b\x19\xce\xff\x28\x6f\xb7\xdc\x77\x4f\x1c\x0e\x9f\x11"
+ "\xa4\x08\x78\xc3\x47\x81\x90\x31\xe0\xfb\x53\xc6\x34\xe8\xd5\x7c"
+ "\x80\xca\xfd\xf7\xc4\xe7\x11\xed\x04\x42\xfb\x28\xb5\x01\x1b\x74"
+ "\xd4\x2f\x79\x93\x13\xf5\xe2\x2e\x25\xe5\x93\xfb\xeb\x89\x71\xe5"
+ "\x36\xf8\xa1\x02\x7c\x15\x55\x9e\x74\xf7\x7e\x25\xe1\x9b\xcf\xa2"
+ "\xe6\x57\x31\xeb\x3b\x85\x1e\x83\x59\xfa\xe8\xb6\x74\xb0\x8e\xbb"
+ "\xf1\x1d\xb8\xee\xba\x1e\xfa\xc0\x8e\x83\x6e\xec\xdb\xc3\x69\xa6"
+ "\x7b\x20\xeb\x0b\x5e\xbc\xa3\x7a\x1e\x95\xa3\xb4\xf8\xb7\xcf\xf8"
+ "\x0d\x15\x5b\xd8\x5c\xe9\x4b\xb5\x43\xf8\xe8\xc2\x9d\xf5\xab\x12"
+ "\x98\xf5\xaa\x2a\x96\x34\xe8\xec\x70\x79\x74\x5c\xd8\xab\x88\xf6"
+ "\xcb\x7f\xd4\x86\x78\x0e\xaf\x0e\x79\xa2\xe5\x5c\xfd\xfd\x7e\x7a"
+ "\x4f\x0a\xbf\x77\x9c\x57\xcf\x87\xda\x3c\xec\xef\xab\xf6\x9d\x91"
+ "\xb6\xf4\x42\xbf\x54\x7a\x4b\x6a\xd8\xfe\xe0\xef\xf7\xcb\xbe\xfc"
+ "\xfd\xfe\x23\x76\x06\xdd\xf9\xb1\x5a\xe1\x9b\xfd\xef\x24\xf7\x9e"
+ "\xb0\xab\xfa\x98\x36\x81\x57\xe0\x77\x77\x40\x06\xfb\xca\x55\x46"
+ "\xf9\xb0\x4f\x10\x7f\x94\x22\x79\xf8\x5b\xb2\x15\xc2\x9f\x88\xf1"
+ "\x7f\x08\x7d\xe3\x98\x34\x71\x37\x63\xa2\x4c\xd9\xa2\x3a\x61\xcf"
+ "\x52\x76\x5f\x12\xfd\x1a\x79\xd9\xe2\x54\xfa\x35\x11\xce\x65\xd0"
+ "\x6f\x1c\xfd\x42\x96\x4d\xa0\xef\x71\xc0\x4b\x92\x61\xad\x88\x51"
+ "\xd9\x17\xbb\xa8\x7a\xbc\x7b\x51\x80\x8d\xbb\xf8\x47\x4c\xda\xec"
+ "\x75\xa6\x20\x3e\xe1\xf2\xbd\x8c\xe5\x06\xf8\x90\xed\x0a\xc4\x18"
+ "\xe9\x4c\x71\xec\xc5\x59\x7a\x67\xc2\xc8\xb3\xf4\xce\x05\xf4\x47"
+ "\x6f\x9d\xcd\xf4\xe7\xa7\xbf\x94\xf0\xdf\xc9\x05\x83\xce\xce\x14"
+ "\x82\xa3\xe0\xb1\x2e\x8e\x26\xa2\x3c\xcd\x03\xe4\xa2\xd8\xa9\x29"
+ "\x72\xbc\x2b\x8a\xe8\xdd\xc8\x63\x7f\xe4\x52\xc7\x6b\xa7\xf7\x38"
+ "\x9b\x83\xf6\xb5\x58\x82\xc9\x54\x1a\x73\xec\x7d\x49\x18\x2f\xfa"
+ "\xdb\x17\xbb\x38\x35\xf2\x4e\x18\xea\xc4\xf8\xbd\xb1\x54\x8e\x60"
+ "\xc9\xaf\x7e\xdd\xa3\xc1\x53\x85\x13\xee\xcb\xe8\xfb\xa8\x0e\xc9"
+ "\x07\x51\x7e\xaa\x43\xcb\x1f\x82\xfd\x54\x26\xf8\x26\xb4\x45\x32"
+ "\xb1\x51\xbb\x6f\x36\xe8\x3c\x39\xf7\xdd\xb5\x4c\xf5\xe7\xd1\x99"
+ "\xe2\x8b\x28\x0b\x9f\x0a\x63\x95\xa7\x36\x8d\xb2\xcd\xc5\xa9\x5d"
+ "\xac\xf3\x76\xd9\xee\x49\xdb\x78\x6b\xa9\x70\x16\xf1\x77\xc4\xf5"
+ "\xce\x97\x72\xdf\x62\xf7\x74\x1f\x73\xd7\x28\xb4\xe7\xdf\x52\x94"
+ "\x52\xc8\x5d\x5d\xec\xe4\x89\x56\x7f\xf7\x45\xee\x87\x27\x85\xbf"
+ "\x10\x3e\x54\xc4\xdc\x05\x37\x8a\xf3\xac\x33\xec\xab\xc9\x6e\xaf"
+ "\xb8\x73\x4e\xcf\x5d\x41\x7c\xc7\x19\x3a\xf6\x06\x92\xb1\x43\x71"
+ "\x32\x14\xca\x5b\x8b\x74\x4a\x83\x4f\x92\x7d\x11\xdf\x78\xf9\xa2"
+ "\x34\xb9\xa6\xba\x3e\x04\x6f\x21\xfa\x1b\xf8\x57\x17\xfa\xac\x94"
+ "\x2e\x4a\xc3\x18\x1c\x24\xff\x21\x36\x28\xd6\x84\x6d\x23\x74\x85"
+ "\x5d\xbf\x24\xbc\xe3\x4a\xd9\xa2\xb4\x8b\x1b\x43\x97\xb8\x2b\xe9"
+ "\x08\xf0\x33\xde\xd8\x45\x69\xe0\x49\x2a\x0a\xa3\x8d\x77\xd4\x70"
+ "\x57\x9f\xf9\x96\xa2\x41\x67\x57\xf3\xbb\xf9\x72\x6e\x2e\xb2\xde"
+ "\x66\x6d\xec\xb5\xea\xd8\x29\x4d\x9c\x51\xcd\xaf\x96\xf1\x43\x3c"
+ "\xec\x2b\x36\xae\xce\x8a\xe6\x19\xfc\x00\xed\x0d\xe7\x25\x2c\xbe"
+ "\x4a\x0d\xed\x0d\x17\xd5\x8f\xaf\xc6\xf5\xe5\x1f\xd1\xc6\xb0\xda"
+ "\x46\xc3\x7f\xb3\x8d\x86\x0b\xb5\x21\xcf\xcf\xbb\x53\x2e\x5e\x76"
+ "\xec\x16\x7e\x75\x88\x7e\xda\x25\xcd\x3c\xf5\x5a\x90\xe4\xb7\x80"
+ "\x69\x45\x11\x78\x1b\xd8\xca\x22\x96\x4a\xa0\x74\x6a\xca\xd1\xfc"
+ "\x21\xe6\xda\xf8\x29\xeb\x64\xdd\xc2\x7f\xdf\xd1\x3c\xc8\x6c\x3f"
+ "\x72\x0d\x97\xdf\xd2\x36\xac\xff\x0a\xf7\x27\xb3\xf7\xd2\x3c\xec"
+ "\x89\xc0\xb3\x56\xdf\xa7\xcc\x9d\x01\xfd\x6a\x1b\xf4\xda\x2e\x1e"
+ "\xbb\xa2\x48\x21\xda\x40\x3c\x7a\x50\xc0\x83\xf8\x17\x21\x6f\x91"
+ "\xcc\x26\xe4\x2d\xaf\xf0\x99\x1c\x2b\x62\xa4\x38\x5f\xc9\x83\xee"
+ "\x3b\x38\x9c\x66\x1b\x74\xb2\x54\xc4\x4e\x81\xde\x99\x9b\x8c\x95"
+ "\xcb\x03\x51\x5c\xc8\x53\xc4\xfb\x23\x76\x8a\xdb\xe7\x61\x41\xe2"
+ "\xa3\x6b\x06\x58\x42\x0d\xf1\x9e\x44\xb3\xe3\x40\xd7\xf7\xa9\xf1"
+ "\x53\xca\x06\xc2\xf1\x53\x6a\xa1\xeb\x69\xa7\xe7\x01\x66\x08\x96"
+ "\xa5\x64\xef\x19\x60\xb3\xf7\x6e\x64\x49\x7b\xa0\xcb\x3b\x25\x79"
+ "\x1f\x61\xdb\x8e\x58\x2a\xeb\x93\x70\x96\x10\xe6\x7d\xe0\x23\x21"
+ "\x4c\xb7\x0c\x42\x07\x72\x51\xf0\x3e\x25\xf6\xc1\x40\xe9\xa2\xba"
+ "\x80\xe9\xbe\xa4\xe1\xf2\xc5\xc4\x73\x74\xd7\x13\xfc\xe6\x8e\x35"
+ "\xb7\x9a\x8d\x4c\x55\x44\xfc\x9b\x77\x67\x4b\xfa\x4e\x75\xf9\xc6"
+ "\xc3\x89\xe0\x9e\x34\x36\xbf\x97\x25\xcb\x73\xfb\x18\xda\x13\x7b"
+ "\xd2\x60\xd3\x58\xf8\x28\xb3\x06\xf7\xac\xd2\x39\x5e\x60\x51\xee"
+ "\x40\x0a\xc3\x5f\xe1\xd7\xbc\x7b\xfe\x5a\x96\x8c\xf3\x07\x9c\x95"
+ "\xd8\x1e\x13\xf9\xaf\x99\x5d\xc0\x46\x9c\x39\x3c\xba\x39\x67\xcd"
+ "\x0d\xc9\x3f\xcd\xb2\x3d\xbc\x26\xe7\xd1\x4d\xab\x73\xb2\xd8\x52"
+ "\x69\x0a\x22\xdc\xd1\x6f\x86\x1d\xc8\xa6\x35\x79\xd9\xb6\x87\x36"
+ "\xe4\xe4\x64\xad\xcb\xb3\xdd\x7d\x47\xea\x37\x7d\x92\xee\xb1\xee"
+ "\xc7\x59\x8f\xb4\x0b\xec\x8d\xe1\xcf\x5f\x37\x50\x8e\xf8\x5a\xdb"
+ "\xee\x5c\x69\x09\x2c\xb5\xc9\x38\x47\xbd\xab\x60\x8b\xcb\x1d\x69"
+ "\xd5\x92\x4f\xed\xbd\x5f\xf2\xf6\x96\xa5\xf2\x1e\x5d\xaf\xf4\x03"
+ "\xd8\xb7\x74\xba\x5c\x53\xff\xb8\x35\xca\xce\xf0\xfc\x28\x9e\x2d"
+ "\x76\x56\xe2\x9a\x8a\xf3\xf0\x7f\x08\x1f\x8d\x7c\xcf\x32\x9d\x96"
+ "\x4f\xcb\xa3\x7e\x17\x7e\xa7\x6b\xe1\x57\xd7\xd9\x93\x49\xf0\x89"
+ "\x1f\x74\xfe\x63\xa5\x47\xef\xeb\x56\x79\x84\x6e\x69\x83\xd8\xbb"
+ "\x0a\x3e\x3a\xf9\xf3\xd3\x06\xd4\x7a\x4a\xa9\xbd\x4b\x28\x6f\x91"
+ "\x87\xf5\x18\x55\x5b\xc5\x99\x1d\x6a\xbf\xa4\x4d\x45\xcf\x46\x69"
+ "\x53\xf1\x8f\xfd\x11\x77\xe1\x85\xaf\x09\xec\x8d\x2a\x4f\x3a\xa8"
+ "\xd6\xd7\xac\xd1\x04\xca\x7f\x8c\xf8\xba\xea\x8b\xa7\x85\xff\x90"
+ "\xf2\xcf\x08\xdf\x4b\xbd\x77\x8e\xf4\x69\xa2\xc1\xcd\xfa\x2b\xa9"
+ "\x8b\x97\x70\xa5\x31\x1c\x96\x70\x12\xe9\xd3\x7b\xe8\x1d\xe5\x3c"
+ "\xac\x77\xfa\x68\xfc\x0a\xcd\xf8\x5d\xeb\x1e\x5a\xff\xa8\x7d\x75"
+ "\xde\x9a\x07\xd7\xac\x5d\x93\xb7\x59\x5c\xd9\x9f\x2b\xfe\xfb\x97"
+ "\x39\x99\x2b\x47\xfb\x9f\x4f\x82\x4e\x46\xf5\x5b\xed\x83\x0d\x84"
+ "\xd4\x8b\xf5\x7e\x1d\x70\xb2\xdb\x2e\x6e\x9c\xbd\xa2\xaf\x35\xc2"
+ "\x8f\xc7\x69\x46\xfc\x63\xaf\x7a\x3e\xd2\xab\xce\x95\xf8\xde\x67"
+ "\xba\x2f\xce\x36\x95\x2d\xee\x60\xde\x06\x9c\x8b\x11\xbc\x33\xb0"
+ "\x7f\x96\x6d\xc1\x3e\xd7\xc6\x8e\x06\x68\x2f\x15\x67\xe5\x67\x62"
+ "\x01\x33\xf0\x90\x04\xa3\xfd\x1d\xec\xf4\x06\x01\x8b\xb3\xd6\xfd"
+ "\xc2\x37\xc7\x59\xeb\xaf\x80\x8b\xe8\xb3\xc2\xd3\xf6\x70\x9e\xb6"
+ "\x5b\x39\x9b\xbd\x87\x9f\xcd\xde\x1d\xf6\x7d\x79\xda\x43\x65\x0f"
+ "\x51\xd9\x93\x88\x6d\x55\x7e\x86\x1d\x02\x9d\xc4\xbb\x25\x2f\x8e"
+ "\x64\xc3\x5b\xd2\xd0\x1f\xb7\x37\x99\xc9\xfb\xfa\xa7\x3d\x6e\xdf"
+ "\x8d\x8c\x78\xcf\x0c\x71\x3f\x54\x9c\xef\x11\x7f\x48\xe5\xdc\xd4"
+ "\x2f\xb7\x77\x08\x32\x74\x9a\x42\x3c\xa2\x87\x9d\x8e\xa3\xfd\xb6"
+ "\x1a\xf5\x62\xcc\x7b\x09\x27\x61\xa7\x41\x63\x27\x3e\xa6\xa7\x46"
+ "\xbd\x1b\xdc\x59\x46\xe9\x80\xc1\xc8\xf9\x3f\x33\x0b\xf3\x48\x30"
+ "\xfe\xbf\x61\x1c\x38\x23\x7c\x44\x2d\xeb\xe4\x7f\xe3\x25\x03\x75"
+ "\x72\xbe\xcf\xdc\xa5\xa6\x9d\x0d\xfb\x0b\x38\x73\x3f\xbd\x0f\xd3"
+ "\x9f\xc2\x4b\x06\x5d\x11\x67\xd3\xf8\x26\x7c\x7a\xc1\xee\xc4\xbe"
+ "\x85\x5d\x41\xe5\x9f\x96\x67\xd5\x83\xef\x78\x1d\xd9\x51\x54\x26"
+ "\x88\xfb\xad\x2a\x7c\x5f\x73\x17\x9f\xd1\x6c\x3d\xa8\x4f\x67\x7f"
+ "\xe0\x7a\x38\xc0\x44\xfc\xfa\xce\x80\xb0\x87\x54\x7d\x44\xe8\x14"
+ "\x67\x2f\xec\xd5\xe0\x5f\xcd\xb4\x37\x5e\xc6\x7e\x18\x74\x9e\xe9"
+ "\x0c\xd9\x24\x99\x24\xcf\x08\xbe\x0d\x31\xfd\xb0\x7e\xc0\x03\xa2"
+ "\x4f\x58\x3f\x54\x77\x1c\xce\xb9\xe5\x3a\x3a\x3b\xfd\xbf\xb7\x8e"
+ "\xce\x0a\x9c\xa7\x7e\xd7\x73\xbd\x83\xcf\x2f\x65\x19\xc2\x0e\x21"
+ "\xe0\xc3\xbd\x64\x03\xed\x3d\xc5\x92\x26\x79\xcb\x84\xad\xca\xc6"
+ "\x5e\xc4\x33\x2e\xda\x37\xc4\x4c\x4a\xa9\xb1\x04\xbc\xfa\xd1\x02"
+ "\x61\xbf\x61\xa4\x72\xf5\xb0\xef\x80\x8d\xa1\x59\xc4\x8c\xfc\x94"
+ "\xed\xeb\x67\x86\x4e\x76\xb6\x06\xe7\x49\x61\x58\x9f\xfd\x1a\xe7"
+ "\x87\xfc\xc9\xfe\x85\x96\x02\xbd\xa8\x43\x19\x38\xbd\x50\x2b\x87"
+ "\xd8\xe4\x28\xd7\xc1\xce\x7e\x26\xca\x21\xaf\xf0\x25\x12\xb7\x8a"
+ "\x78\xb5\x3a\xe4\x0f\xd0\x7b\xad\x12\x97\xca\x69\x4f\x09\x6e\x0c"
+ "\xd4\xd3\xb7\x95\x4a\xe9\xe2\x54\x4a\x4b\x13\xe7\x18\xc3\x56\x9c"
+ "\x6f\x12\xce\x25\x26\xbb\x3d\x5f\xb9\x44\x7f\x70\x57\x39\x8f\xf6"
+ "\x5f\x21\xdb\x78\xaf\xa9\x3d\xc5\x0c\xf6\x87\x31\x9f\x5e\xe9\x03"
+ "\xf8\x0c\x3b\x20\xfb\xe7\x7d\xab\xef\xc9\x60\x7e\x1f\xe1\xab\x4f"
+ "\x6f\x64\x47\xac\xb0\xb1\xbf\x2f\xee\x88\x75\x88\xe6\xc7\x5b\x4c"
+ "\xf4\xf2\x80\xe4\xab\xbd\xa1\xb5\x09\x1c\x8d\xb2\xc6\x39\xe8\xfb"
+ "\x7e\xcd\xa6\x09\x78\x5a\x2a\x7c\xbc\x9f\x2d\x00\xdc\x08\xb7\x17"
+ "\x1c\x5d\x1b\xf6\xb1\xdc\x27\xef\xf5\xc5\x51\x99\xd0\xfd\xdf\xe0"
+ "\x80\xd2\x42\xfd\x80\x2f\x9a\xfc\xe0\x46\xe5\x38\xce\xdf\xef\xe9"
+ "\x57\x38\xee\x3c\xe0\xfe\x0a\x64\xa7\xe5\xf9\xbc\x0f\xb2\x20\xee"
+ "\x8a\xe1\xec\x1d\x77\xe9\xc3\xeb\xe4\xeb\xd9\xda\x9d\x7a\xac\x11"
+ "\xf4\x01\xf7\xc1\xca\x7f\x26\xd6\x29\x6c\x60\x4d\xe2\xfc\x21\xea"
+ "\x91\x53\xf7\xf8\xa8\xce\x33\xe2\xdc\xac\xaf\x56\xad\x07\x3e\xb3"
+ "\xa8\x8e\x6c\xad\x0e\x05\xf6\xc3\x39\xc2\x7e\xcf\x23\xcb\x4b\x5b"
+ "\xa3\x7b\x7c\x8a\xb8\xc7\x83\xf2\xd2\x06\xe8\xeb\x9a\x90\x0d\xaa"
+ "\xb8\x5b\xf3\xf5\x21\xcd\xc6\x8c\x9e\x43\xf7\xbf\x00\xd3\xbe\xd2"
+ "\x5b\xd2\x7c\x44\x1f\x7c\xa5\x8b\xaa\xe9\x1b\xd1\xff\x53\x6d\x17"
+ "\xd4\x87\xc0\x8f\xc2\x06\xa6\x57\xcc\xc6\x06\xf8\xc8\x80\xb5\xbd"
+ "\xb4\x7b\x3f\x77\xb3\xea\x2f\x23\xea\x0c\xfb\xfa\xeb\xf0\x39\x7c"
+ "\x50\xd5\x21\x9f\x5b\x25\x65\x98\x73\xab\x84\x0e\xb9\xfc\x96\x94"
+ "\x97\xb6\xf8\xf5\xf5\x5b\x3c\x7a\x69\x8f\x77\x8e\x78\x91\xa1\xe2"
+ "\xb0\x2d\xe8\xb9\x38\xd4\x35\x36\xcf\x69\xae\x93\x75\xf6\x09\xff"
+ "\x21\x61\x9d\x40\x9f\xb8\xff\x84\x33\x73\x05\xfc\xa3\x79\x6a\x2a"
+ "\x6c\xa4\xdc\xf6\x73\xd0\x25\x4f\x90\xfa\x09\x99\x47\xb5\xf3\x9c"
+ "\xd2\x33\xf2\x3d\x1e\xef\x12\x66\xe7\x3c\xda\xb9\x54\xb9\x5e\x41"
+ "\xfc\x41\xee\xa8\x23\x7a\x69\xf7\x09\x3f\x0d\x6e\xe2\x47\xa9\x0d"
+ "\x6e\xcf\xc1\x5d\xca\xbe\x4b\xe1\xbf\x41\xae\xcd\xbe\x27\x44\x9f"
+ "\x9c\xb7\x71\x07\x64\x32\x2f\x62\x1d\x9d\x63\x94\x6f\x32\xe5\xbb"
+ "\xbd\xa9\xa0\x17\x36\x66\x05\x88\x63\xdb\xa9\xb6\xed\x8d\x35\xd7"
+ "\x5d\x65\x62\x19\x83\xce\xbe\x95\x1e\xd6\x54\x73\xf1\x74\xa3\x6f"
+ "\xe5\x85\xf8\x73\xc9\x2f\xa6\xb0\xf1\x64\x7c\xe8\x70\xae\xa7\xf6"
+ "\xef\xe6\xe8\xbf\xef\xf6\x80\xde\xcf\x86\xf5\x13\xf9\x75\x45\xf9"
+ "\x2c\xe0\x9c\xc8\x83\x5b\x68\xbe\xfa\xac\x24\x03\xb6\xb0\x56\x69"
+ "\x77\x03\xdb\x01\x4b\xa1\x8f\x9f\x73\x07\x1a\x70\x86\xe0\xa5\xb9"
+ "\x22\xba\xe5\xfb\xae\x3b\xf0\x16\x83\x7d\x37\xe8\x4d\x07\xf3\xcd"
+ "\x41\xbf\xae\xb7\x17\xb1\x79\x67\xf0\xbd\xaf\x53\xee\xf9\xbe\x14"
+ "\xf5\x37\x0e\xfe\x81\x23\xfb\xf4\x2f\x1b\xd6\x3d\x04\x27\xd3\xf3"
+ "\x96\x65\x6d\xcc\x5a\x6b\x5b\x01\x17\xd4\xa3\xed\x46\xc3\x71\x0e"
+ "\xfb\x4d\xd8\x5f\xc1\xbf\x23\xde\xe1\x85\x62\x1d\x6a\x71\x0e\x69"
+ "\xcd\xcd\x86\xce\xfb\x7f\x33\xd6\xa1\xc6\x9f\x23\xce\x61\xf8\xfc"
+ "\xa7\xbf\x25\xb4\x06\x94\x77\x06\xf1\x2e\xf6\x74\xa7\x6f\x19\xd6"
+ "\x91\xdc\x5f\xfa\x97\x44\xfa\x2a\x92\xfc\x59\x62\x32\xa5\xaf\xd2"
+ "\xee\xbc\x12\x2e\x9a\xe8\x7d\x6d\xf8\x8e\x4d\x7f\x3e\xcd\x77\xa3"
+ "\x5c\xbf\x22\x6f\x89\x66\x27\xa1\xc6\xb4\x17\x76\x1d\xca\x8e\x9b"
+ "\x0b\xa4\x6e\xb2\xbf\xac\x56\x99\x68\x94\xe7\x62\xfd\x0d\xda\x1d"
+ "\x2e\xb9\x36\xdf\x51\xd7\x66\x7f\xcb\x85\x6c\x59\xc2\x6b\x63\xc0"
+ "\x18\x5e\xd7\x7f\x53\xcb\x0e\x18\xbf\xcd\x0e\x46\x95\x11\x2f\xed"
+ "\x61\xfe\x19\xd0\x57\xca\x3b\xdb\x7e\xe1\x5f\x48\xfa\xe3\x18\x3c"
+ "\xa1\x3e\x53\x1b\x83\x1f\xaa\xcf\xd3\xe8\xf9\x35\xf5\x99\xf8\xc5"
+ "\xc1\x5d\xea\x33\xad\xd9\xc1\x6d\xea\x73\x02\x3d\xaf\x51\x9f\x69"
+ "\xef\x18\xfc\x81\xfa\x9c\x48\xcf\xdf\x55\x9f\x2f\xa7\xe7\x59\xea"
+ "\x33\xad\xc1\x41\x71\x66\x40\x7d\x37\x52\xdf\xfb\x2f\x5e\x66\x1d"
+ "\x70\xc9\x73\xeb\x41\x46\xfc\x60\x95\xdc\x7b\x42\x69\x09\x84\xd3"
+ "\x99\x1a\x7c\x29\xbd\x11\xed\x50\xfa\x5c\x0f\xf3\xb4\x45\xa4\xab"
+ "\xfe\xdb\x06\x97\x78\xd8\xd7\x9e\x88\xf4\x1a\x35\x7d\x15\xc9\xdc"
+ "\xbe\x88\xf4\x4a\x35\x3d\x8f\xe8\x62\x76\x44\x7a\xb1\x9a\x5e\xea"
+ "\x61\xff\x65\x88\x48\xcf\x57\xd3\xf7\x6b\x36\x3c\x6a\xfa\x5a\x35"
+ "\xfd\xb0\x87\x7d\xda\x10\x91\x9e\xa1\xa6\x13\xfd\xef\x6f\x8f\x48"
+ "\x17\x74\x45\xfa\x64\xb7\xf0\x23\x05\x58\x5b\x83\x7e\x0f\x6b\xdf"
+ "\x1f\x91\x67\xa9\x2c\xeb\x27\x7e\xf1\x2f\x2d\x11\xe9\x8b\xd5\xf4"
+ "\x24\x8f\xee\x3b\x91\x75\x26\x8f\x47\xab\x74\xd5\x2c\x63\x3c\xbd"
+ "\x3e\x64\x20\x61\xcb\x2c\xf8\xec\xf3\x59\xb8\x13\x66\xd9\xcb\x3b"
+ "\x6c\x85\x9c\x77\xb0\xf3\xcb\x54\xdb\xdd\x7c\xd8\x51\xca\xfb\x75"
+ "\xe7\x17\xa8\xbe\x15\xbc\xe2\xce\xdd\x16\xa4\xf9\xdf\x14\xfa\x99"
+ "\xfc\x22\xe9\x2f\x5c\x8b\x3d\x03\xfd\x96\x7a\xf6\x4f\x79\xe0\x2b"
+ "\x16\xb6\xe0\xbd\xd0\x81\xbb\xf3\x86\xa4\x2f\x79\x92\x83\x91\x06"
+ "\x3d\x0f\xe0\x11\xa9\xcf\x92\x74\xff\x7c\x96\x32\x84\x7b\xad\x52"
+ "\x17\x86\xb5\x88\xfc\xb0\x57\x8b\xcc\xeb\x61\xe7\x85\x5f\x8a\x28"
+ "\xeb\xe4\x3f\x0f\x3a\xcf\x2f\x09\xdf\x27\xf2\xd7\xa8\xe9\x9f\x51"
+ "\xfa\xaa\x88\xf4\x92\x71\x69\x3b\xd1\x41\x6e\xec\x2f\x1a\x1e\xe0"
+ "\xbe\xc0\x00\xf7\x97\xff\x95\xfa\xfd\xb0\xb0\x11\xbc\x22\x58\xd2"
+ "\x5f\x89\xfb\x36\x88\x11\x1b\xd8\xc8\xbd\xb0\x89\xa4\xf4\x4b\xee"
+ "\xf1\x79\x89\xc7\x18\xe4\x65\x0f\xc2\xfe\xb5\x9f\xe1\x6c\xd6\xd1"
+ "\x8b\x78\x83\x16\x8e\x7b\xdc\x5b\x4f\x33\x13\xee\xe3\xd4\x3e\x8c"
+ "\xef\x5f\xb2\xbb\xb3\xbd\xec\x68\x76\x90\xd5\x52\xdd\x7b\x1f\xd4"
+ "\xf8\x8b\xf3\x81\xd0\x5d\x61\xea\x03\xda\x73\x88\x98\xd8\x43\xc2"
+ "\x57\xb9\x65\x1b\x6c\x0a\xee\x5b\xc8\xdf\x03\x6f\xbc\x28\xc3\xb2"
+ "\x8d\xd9\x68\x6f\x5f\x48\xcf\xa9\xf2\xef\x3e\x3c\x8f\x39\xd7\x2a"
+ "\x6d\xa7\xb5\x3c\x94\x27\x68\x4d\xc9\x00\x93\xf4\x62\x28\x8f\xbf"
+ "\x88\xfb\x27\x43\xf9\x44\x6f\x16\x12\x1f\xbe\x70\xac\xf2\x5b\xf7"
+ "\x32\xfd\x70\x39\xf1\x26\x67\x1a\xf5\x92\x3e\x0d\x67\x2a\x7a\xe3"
+ "\x36\xe8\xda\x45\x3c\xdc\x72\x63\xd3\xa1\x75\x7e\xfd\xd1\x2d\x9d"
+ "\xec\xb1\xcb\x99\x75\x95\x5f\x4f\x79\x86\x4e\x9a\xf3\xe0\xd3\xfc"
+ "\x96\x14\xe2\x67\xf5\xaf\xd3\xf7\xb7\xd7\x35\xea\x03\x82\x5f\x19"
+ "\xce\x14\xfa\xd9\x52\x63\x35\xf6\x10\x77\x7b\x10\xbc\xb8\x89\x78"
+ "\xf1\x12\xa2\xff\xc6\xe0\xa6\xec\xf8\x40\x6e\xf6\x25\x7b\x73\x98"
+ "\x29\x98\x9b\x94\xf0\xec\x00\x5b\xa8\xed\x3f\x7b\x37\xd2\x9e\x32"
+ "\x68\x9d\x54\x41\x7b\x0a\xf4\x3e\x66\x5d\x9c\x38\x87\xc6\xb3\xa2"
+ "\xff\x6b\x5c\xed\xc6\x0b\xc7\xf6\x0e\x6e\x4a\x12\xfe\x26\xd0\x97"
+ "\xb1\xc6\x5a\xba\x9b\x19\x82\xea\xbd\xd4\xc2\x93\x2c\x91\xf8\x67"
+ "\xbd\xb9\x9f\xbb\x7a\xd6\x32\x3d\xe2\x21\x17\x66\x09\xdd\x6a\xf4"
+ "\xd1\xec\x00\x73\xe7\x7f\xc1\x0a\x73\x30\x47\xc3\x6f\x82\x4f\x83"
+ "\x3d\x33\xe5\x8f\xeb\x61\xc3\x1f\x5a\xfc\xb4\x67\xf8\x89\x27\xff"
+ "\x19\xe4\xe2\xe1\x2f\xa5\x7f\x8b\x80\x0d\xf7\x48\x5d\x39\xdf\x47"
+ "\xda\x79\xc7\x49\x61\x37\x54\x20\xd7\xd6\xf0\x31\xbc\x3b\x70\x4f"
+ "\xd6\x1c\xdb\xf4\xca\x90\x3f\x5a\xea\xef\x86\x3f\x53\xf7\x87\x64"
+ "\x29\xdb\x0d\x1f\x1b\x0f\x77\x95\x92\xf3\x90\x5d\x66\xba\x6b\xc0"
+ "\xbf\x72\x8f\x38\xe3\x87\xcf\x80\xfc\xdb\x5c\x9c\xc8\x9d\xf4\x65"
+ "\x14\xd8\xa5\x3c\x71\xbe\x4e\xfa\x90\x0c\xc8\xbb\xf9\xd0\xf7\x3f"
+ "\x71\xbe\x5e\x9c\x6f\x3c\x71\x5e\xea\xfb\x9f\x38\xdf\xb6\x7d\x2a"
+ "\xee\x13\x04\xaa\xfb\x62\xce\x13\xdf\x16\x58\xdb\x67\x8e\x1f\x33"
+ "\x3e\x9f\xd8\x8f\x4a\x06\xda\x6c\x57\xb0\x04\x9c\x33\xa5\x07\xa5"
+ "\x2f\x56\xb9\x86\x83\x35\xfc\x09\xf1\x6d\x66\x87\x9d\x45\x49\x7f"
+ "\xc7\x81\x53\xf3\x6b\x98\x8d\xfa\x1a\xcb\x8d\xe7\x8b\x84\xdd\x63"
+ "\xc9\xf9\x4a\x77\x2f\xe2\x54\x05\x99\x3c\x0f\x0c\x1e\xe0\x31\xe7"
+ "\x8b\x64\xfe\xe0\x77\x5b\x7b\x69\x0c\xc6\xf3\xa9\x6e\xff\x69\x95"
+ "\x27\x0c\x2e\xa4\x3e\xa6\xf2\x92\xf3\x19\xf2\xbe\x79\xf0\x09\x8d"
+ "\xae\x4a\x1c\x0d\x6e\x55\x71\xbd\x4d\xc2\x2d\x78\x40\xdd\xaf\x66"
+ "\xe2\x99\xf6\xee\x64\x69\xbf\x12\xcc\xd3\x78\x64\x8f\x9a\x07\x65"
+ "\xe8\x59\xf5\xf3\x19\xac\xa2\xb1\xcf\x55\xbf\x2f\x44\x1a\x8d\x8f"
+ "\xf6\xac\x40\x1b\xc6\x35\x1e\x6d\x15\xb0\x28\x60\x51\xd4\x67\xf8"
+ "\xc0\xc3\x1d\x01\x9f\xdb\x77\x9b\xcb\x2d\xe6\x80\xdf\x00\xdb\x7e"
+ "\xb4\x03\x7f\x43\xa0\x9b\x54\xa7\x01\xf5\x85\xfb\xaf\x5c\xaa\xf5"
+ "\x05\xed\xe1\x1b\x8d\x35\x55\xc8\xd5\x34\x66\xe4\xc1\xbc\x76\xd9"
+ "\xa1\xf7\xeb\x27\x98\xc1\x86\x8e\xa7\x00\x26\x12\x66\x7c\xba\x2a"
+ "\xd3\xab\xf3\xc0\x27\x8f\x84\x87\x7c\x57\x8c\x44\x1b\x72\x60\x4b"
+ "\xc5\x53\x54\xf8\xa9\x31\x56\x14\xe1\x8b\x56\x7e\x53\x7e\x19\x51"
+ "\x76\x46\x28\x2f\xf5\x1b\xbc\x11\xec\x12\x70\x4e\x25\xf1\x55\x69"
+ "\x8b\x28\xd7\x96\xfe\x35\xf1\xc8\xc4\x43\x6e\xdf\x29\x62\x56\x12"
+ "\x6f\xa5\x74\x86\xe1\x2d\xeb\x19\xa3\x8d\x2b\xb4\x36\x3c\x4c\xd9"
+ "\xaf\xf5\x93\x9e\xd5\x3d\x98\x27\x85\xe7\x44\x59\xaa\x95\x83\x4e"
+ "\x87\xe6\xc8\x87\xf8\xb1\xe3\xc4\xc5\xd0\xb9\x09\x2a\xad\x81\xdb"
+ "\x5c\x02\x1f\x19\xaf\x83\xee\x92\xe0\x6a\x97\x38\xc4\x8b\xe5\x5e"
+ "\xc8\xeb\x50\x27\xce\x1a\xa5\xbf\x51\x5e\x4d\xf5\xaa\x77\x96\xf8"
+ "\x21\xb5\x0f\x24\xff\x05\xf6\x8f\x96\xeb\xbe\xbf\x3a\xd3\x96\x7a"
+ "\x83\xb8\x73\x3b\x6f\x83\x1d\xd7\x69\x33\xc3\x2f\x23\x79\xee\xb8"
+ "\xb0\x8f\x33\xc4\xa2\x56\x7d\x9c\x95\x9a\x9b\x04\xfc\x75\x6c\x09"
+ "\x1f\xe0\x55\xb8\x3b\xc2\x37\xf2\xea\x72\x9a\x43\x47\x3f\xbb\x0c"
+ "\x71\xb1\x0b\xed\xfc\x2b\xf8\xbf\x23\x7a\x89\xb8\xee\xdd\x85\xfd"
+ "\x6c\x22\xec\x92\x40\x7f\x60\xf7\xcc\x63\x29\xbd\xcc\xd8\x1d\xba"
+ "\x87\xa7\x33\x2c\xc6\xdd\x51\xee\x48\x23\x5e\xda\x18\x00\x3e\xc0"
+ "\x46\xbd\x4b\x67\x98\x4e\xf9\x70\xaf\x34\xaf\x4c\xe8\x12\x62\x52"
+ "\x82\x26\x73\x8d\xe3\x34\x9b\x20\x62\x1c\xe6\xfb\xa1\x53\xd3\x77"
+ "\xe8\xd8\x2f\x79\x6c\x4c\x0a\xa5\x9b\x45\xba\x9f\xda\x2e\x8b\x49"
+ "\xa1\x6f\x66\xfa\x76\x82\x7e\x15\xaa\x23\xbf\x9c\xfa\x5d\x78\x9a"
+ "\x5d\x41\x7d\xe9\xe6\xa5\x31\x29\xd4\xcf\x2e\xc7\xa3\x2c\xb1\xd5"
+ "\xde\x0d\xf9\x8e\xea\xf3\xc8\xd8\x8d\x54\xb6\x43\xa7\xbb\x99\xc6"
+ "\x95\x0f\x9d\x08\xfd\x16\x94\xd1\x6f\x61\x90\x99\x0b\xb7\xd2\xbe"
+ "\xb7\x95\xda\xc7\xbd\x56\xaa\x07\x3e\x48\x64\x5f\x68\x6c\xd0\xab"
+ "\x51\xbd\x5b\x7b\x79\x17\xd5\xdd\x7d\xb4\x97\xea\xcb\x6f\x0f\xd5"
+ "\xa9\xf2\xd4\x33\x69\xbc\x97\xf2\xf2\x29\x46\xea\x53\x35\x6c\xb7"
+ "\x29\x2d\x8e\xd2\xe2\x42\xfc\xb0\xce\x30\x59\x7d\x8e\x09\xe5\x75"
+ "\xa4\xb1\xc2\xf3\x4c\xd8\x50\xdb\x36\x45\xb1\x0e\x5d\x54\x1d\xfc"
+ "\x60\x85\xeb\xd4\xcf\x40\x7d\xa5\x54\x9f\x23\x8b\xc5\x10\xad\x36"
+ "\x52\x1f\x11\x23\xfa\x84\x80\x13\xd6\x98\x4e\x3f\x9d\xc6\x52\x89"
+ "\x31\x29\x34\x77\x65\xb4\x1e\x68\x3c\x3a\x1a\x4f\xcc\xd6\x60\xe8"
+ "\xae\x2e\xc6\x34\x19\xf2\x1c\xc6\x25\xe7\x31\x66\x15\x8d\x2b\x73"
+ "\x6b\x36\x3f\x41\x63\xeb\x3e\x9a\xdd\xce\x68\xef\xb1\xb4\xda\xdb"
+ "\x70\x87\xe2\x84\x84\x5b\x37\x6c\x50\x49\xde\x8f\xc9\x0c\xf9\xea"
+ "\xd5\x45\xed\xa2\xbe\xc7\x51\xbf\x4a\xd5\x71\x22\xad\x2a\xc4\xd3"
+ "\xeb\xa2\x9e\x53\x9f\x27\x85\xf2\x7e\x73\x9c\xc6\x88\x71\x52\x79"
+ "\xc3\xad\xa8\x4f\x1d\xe7\x24\x1a\x67\xcc\x37\xc7\x49\xf8\xb4\x91"
+ "\x17\xab\xe3\x2c\x51\xc7\xa9\xa7\x71\x4e\xa2\x71\x4e\x8d\x18\x67"
+ "\xfc\xa8\x71\x66\xd0\x38\xb3\x69\x9c\x1d\x11\xe3\x8c\x1b\x63\x9c"
+ "\x19\x1e\xb4\x51\x16\x93\x2d\xfd\x83\xf1\x46\x71\xff\x7d\x47\x54"
+ "\xe8\xfe\xbb\x82\x7b\x97\x03\xc2\x07\x51\x03\xf4\x37\xd0\x1b\x41"
+ "\xd6\xc3\x1d\xcf\xf4\xcd\x25\x45\x42\x77\x93\x28\x75\xd3\x82\xbf"
+ "\xda\x11\xb5\x2a\x74\x77\x63\xa7\x88\x5d\xe3\x43\xba\xf0\x19\x90"
+ "\xc3\x84\xee\x71\xf9\xe6\x4d\x0e\x94\x47\x59\xca\x5f\x1a\xba\x63"
+ "\xa6\xd3\xdb\xa5\x2e\x7e\x4a\x1c\x9e\xe1\x0b\x4b\x9e\x09\xf0\x66"
+ "\x71\x26\xb0\x23\x2a\x1c\xff\x69\x23\x6f\x02\x5c\xc4\x7d\x56\x71"
+ "\x1f\x94\x95\xa4\x07\x4a\xb4\x7b\xe9\xbd\x94\xb7\x33\xe2\x5e\x7a"
+ "\xaf\xe8\xc3\x90\xf0\xfd\xb0\x69\x79\x60\x93\xb8\x9f\x3e\xb8\xc3"
+ "\x60\x0c\xb7\xad\x2b\x51\xdb\x36\xe2\xd9\x2b\x7d\xb3\x41\xc7\x66"
+ "\x13\xf6\x36\x3b\x0c\x0b\x34\x1b\x17\x8f\x8e\xd9\xb1\x96\xc7\x8c"
+ "\xf3\xb2\xc3\xb0\x6a\x84\x2f\x28\x5d\x34\xfc\xbc\x23\x3d\x2f\x74"
+ "\xd7\x7c\x87\xa1\xe8\xdb\xee\x9a\x3b\xbc\x34\x4f\xb4\xde\xec\x88"
+ "\x79\xae\x33\x90\x8c\x6b\xae\x11\xb1\x52\x74\xd1\x33\xd0\xcf\x0e"
+ "\x9d\x01\xfb\x87\x45\x9c\x07\xe9\x0c\x5f\xaa\xb4\xd9\xbb\x3c\x18"
+ "\xb0\x78\xa8\x4d\xe1\x5b\x2a\xf4\x6e\x38\x06\x5f\x19\x54\x36\x56"
+ "\xf8\x39\xa7\xfa\x46\xe6\x17\xdf\x8b\x46\xbd\xa7\x8c\x7a\xb7\xf9"
+ "\x88\x66\x8d\x67\xcb\x53\x36\x55\xe8\x78\xab\xcd\xdb\x98\xdd\x71"
+ "\x8a\x45\x11\x2e\x9e\x44\xdf\x5a\xbb\xc5\x3d\x3f\x0b\x77\x26\x33"
+ "\x77\x77\x40\xf2\xed\xc4\x2f\x75\xcc\xa6\x3c\xa7\x58\x22\xee\x99"
+ "\x20\x96\x0c\xe5\xef\x11\xf1\x63\x74\x13\xde\x58\xb5\x61\x12\x53"
+ "\x7e\x9a\x76\x09\xd7\x6f\xa9\x87\x2d\xc1\xcb\x43\x1e\xc4\x60\xd1"
+ "\x15\xee\x62\xd3\x41\xa7\x08\x87\x3b\xb9\xfe\xb1\x7a\x2a\xd3\xfb"
+ "\xd2\x50\x77\xb4\x3b\xf0\x05\xb3\x13\xfd\xec\xd1\x4d\x38\x60\x28"
+ "\x60\x86\x8a\x2e\x16\x47\x78\x16\x38\x12\x58\xc8\x34\x5f\x0f\x35"
+ "\xf1\xd2\x87\x40\x0d\xe1\x64\xae\x95\xfb\x07\x77\x4c\x30\x90\x5c"
+ "\x5b\xa4\xe9\x2f\x4a\xa5\xaf\x37\x03\xb5\xff\x73\xe1\x97\x42\xf2"
+ "\x07\x04\xdb\x09\xb7\xcb\x7b\xa6\x09\x3f\xa5\x32\x0b\x43\xb2\x8d"
+ "\x6e\x42\x93\xe4\x17\xcd\x52\x17\x4d\xef\x47\x48\x3a\x2a\x96\x36"
+ "\x51\x09\x94\x37\x33\x64\x13\x05\x9d\x20\x7d\xa7\x39\x74\x09\xb9"
+ "\xc7\x64\x76\xa5\x07\x8d\xea\x1a\xa7\x74\xda\xb7\x51\x96\xca\x59"
+ "\x44\x9c\xcb\x1d\x13\xea\xc2\xb8\x36\x01\xf6\xcd\x3a\x1a\x93\x89"
+ "\xe6\xf5\x38\xc6\x05\x98\xf8\xe0\xd7\x4d\x17\xed\x39\xb2\x7f\x9c"
+ "\x38\x48\xc6\x01\x16\x10\xfa\xa5\x5b\x16\x12\x3e\x9d\xa6\x39\x98"
+ "\x02\xdf\x56\x6e\x6a\xe7\x68\xed\x10\x3b\x6a\xed\x63\xad\xf4\x8c"
+ "\xbb\x0f\xae\x9f\xfd\x9d\x75\xda\xc6\xde\xcb\x89\x1f\x20\xbc\xe8"
+ "\xaf\x44\x5d\xa0\x35\xb0\x17\x85\x0f\xc2\x56\x2f\xd5\xd5\xc9\x44"
+ "\x1d\x47\x95\x6e\x76\x34\x1f\x32\xec\x7d\x0b\x5b\x6b\xbf\x60\xad"
+ "\xd6\x3f\x89\x76\xc0\x6f\xbb\x72\xfa\x2e\x54\x77\x1d\xd5\x5d\xaf"
+ "\xd6\xdd\x4b\x75\x27\x8c\x5f\xf7\xa2\x8c\x8b\xac\xfb\x22\xfa\xbd"
+ "\x28\xf5\x62\xea\x76\x54\xf3\x20\xd1\xe1\x58\xda\xe3\x4b\xe0\x9f"
+ "\x15\x77\x5c\x83\x03\xf0\x49\x33\x53\xc8\xea\x5d\x3a\xe3\x5e\xd0"
+ "\x1b\x61\x1f\x52\x66\x2c\x16\xf7\x5f\xa1\x67\x57\xef\xbd\xba\x03"
+ "\x27\x19\xf4\xee\x83\x3b\x8c\x25\x61\xbf\x55\xa1\xb3\x71\xa2\x7d"
+ "\xc6\x43\xc2\xd6\xba\xd4\x58\x2c\x71\xcb\xb8\x1a\x75\x8d\xad\x23"
+ "\x8d\x69\x10\x36\xfb\x3a\xe3\x49\x4d\xbf\xd5\x17\x1b\xd3\xa0\xd6"
+ "\x65\x1b\xad\x37\x55\x1d\x09\xd9\xb2\xf2\xf3\x6c\x9b\x72\xd6\xe4"
+ "\x65\x69\x17\xb4\x27\xb1\x15\x59\x0f\x65\xad\xd9\x98\x95\x69\x5b"
+ "\xb9\x21\x67\xdd\xbc\xf5\x0f\x3f\x6c\xbb\x3b\x2b\x37\x77\xf5\x4f"
+ "\xb3\x26\xb1\x95\x39\xab\xd7\xe5\xae\x81\x6e\xd3\x66\x5b\x72\x53"
+ "\x7a\xf6\xfa\xbc\x79\xdf\x5b\x92\x3c\x4a\xb7\x89\xfb\xda\xc7\x21"
+ "\xe3\xd0\xfe\x94\x48\x3c\xc6\x64\xf8\x25\xb2\x6c\xe6\xae\xc7\x48"
+ "\xbe\x26\x1c\xec\xc1\x5e\x88\xfd\x07\xb2\x17\xfc\x1b\xc3\x67\xf2"
+ "\x9e\x9d\xbc\xad\x4b\x37\x6d\x2f\xf1\xed\xed\x94\x06\xff\xc4\xc7"
+ "\xf9\x90\xc3\x2b\xce\xb3\x75\xd3\x36\x53\x9e\xa6\xa7\x28\xcd\x1b"
+ "\x6b\x76\x55\xfc\x95\x19\x24\x8f\x11\xe3\xe7\xfa\x89\xbc\x14\xbe"
+ "\x86\xff\x6e\x65\xaa\x8f\x74\xbd\xdb\xe3\x87\x0d\x91\x71\x79\xc0"
+ "\xc1\x41\x53\xe5\xfa\x8a\x39\x2f\x69\xdd\xf9\x3a\x71\x97\x41\x37"
+ "\xed\xc7\x90\x11\xb7\x23\xee\xe2\x8e\x49\x44\xff\x87\xed\x61\x5a"
+ "\x3d\x45\xe3\xcd\xdb\x09\xee\x9b\x3a\xe8\x5d\xf8\x5a\x99\x30\x69"
+ "\xc1\x08\xfb\x30\x9d\x29\x81\xe9\x2e\x2b\x90\x7f\x54\x46\x77\x59"
+ "\x89\xfc\xc3\x73\xe4\xdf\xb4\xc5\xf2\x6f\x74\xfa\xff\xf4\x4f\x6b"
+ "\xff\xbf\x5d\x87\xff\x5b\xfe\xfe\x89\xf6\xc5\xb8\xff\x3f\x8e\xff"
+ "\x7f\x52\x9e\x16\xc3\x05\xfe\x80\x6f\x84\x5b\xc7\x9f\xfa\x2b\x33"
+ "\x12\x7e\x56\x95\x3d\x48\x38\xfd\x25\xb3\x16\x04\x78\xa7\xe3\x7e"
+ "\x36\xbd\xf0\x14\xf1\x60\xc4\x6b\xe5\xe5\xf3\xce\xc2\x01\x7e\x82"
+ "\xf0\xe6\x13\xc2\xdf\xc6\xf2\x0e\x66\x2a\xeb\x20\x3e\x2b\x4f\xc6"
+ "\x9e\xc1\x79\x13\xee\x79\xb9\xe9\xbd\x65\xa3\x9f\x7d\xec\xfd\x1a"
+ "\x36\x95\xae\xd6\x0c\xa2\x3d\xc7\x19\x03\xfe\x9a\x32\x58\x42\x4d"
+ "\x22\x3f\xcc\x9d\xaf\x64\x72\xfd\x2b\x2b\x29\xed\xd8\xab\x4a\x4a"
+ "\xf4\xab\x5b\x9a\xa3\x6d\x0f\x62\x9f\x37\xbd\xa9\xe2\xe6\xed\xe2"
+ "\x1e\x23\xfd\x02\x07\x55\x1f\xd3\xb4\x3f\x4d\x79\x4b\xee\xe9\x53"
+ "\xca\x54\x7d\x1e\x9e\xc5\xfd\x0d\x1a\x47\x23\x77\x6e\xa9\x47\x9d"
+ "\xaf\x28\x8d\xd1\xd8\x33\x5f\xdd\x92\x12\x5d\xb0\x9a\xe9\x5b\x3d"
+ "\x3d\xec\x08\xd1\x42\x9c\x8f\xd3\xba\x3b\x44\xeb\xac\x7e\x6f\x22"
+ "\xaf\xa4\xfe\x95\x12\x3f\x57\x42\x7d\x3a\x30\xb8\x23\x36\xc9\xa3"
+ "\x9b\x68\x55\x79\x39\x17\xad\x8b\x43\x65\x94\x67\xf9\x06\x36\xb3"
+ "\x8c\xf2\x11\x6f\x57\x02\x19\x45\xf6\x6f\xf2\x2c\x82\x41\x03\xb5"
+ "\xd9\x66\x7b\x00\xef\x66\xc1\x63\xa0\x6d\x1a\x87\xad\x43\x67\x16"
+ "\x32\x3f\xda\xd0\xda\xa5\xfa\x4b\xa8\xfe\x36\xf5\x8c\xb1\x52\xd6"
+ "\x13\xdb\x20\xe9\x58\x8c\x09\x31\x44\xe5\x3d\xb1\x18\x53\xd9\x16"
+ "\xda\xd7\x87\x18\xfc\xe0\x56\x51\x1b\x2e\xcb\x36\xc6\x2d\xb8\x63"
+ "\x7c\x3c\x40\x72\x8d\x22\xed\x77\x75\xe6\x5d\xb2\xac\xe4\x43\x04"
+ "\xef\x11\x24\xfe\x5e\xe8\x67\x88\xff\xc8\x26\x3a\x41\x3c\x87\xb8"
+ "\x9f\x41\xfc\x06\xd2\xa9\x8d\x2a\x1a\x57\x1b\xc9\xcd\x0d\xb4\x77"
+ "\xd7\x83\x57\x78\xa0\xff\xdf\x18\xce\x38\xc0\x2f\xe4\xe6\x73\xbf"
+ "\x88\x2b\xb5\xc3\xbc\x40\xe3\x17\x80\x1f\xe0\x11\xca\x1e\x60\x86"
+ "\x61\x9a\x63\xc2\x91\x66\xe2\x3f\x88\xa7\x37\xdb\xd5\xb9\x69\x16"
+ "\x7c\x81\x1a\x47\x5a\xd2\x70\xf3\x56\xda\xdf\x4d\xd4\x46\xb3\x47"
+ "\x37\x4d\xc0\x42\xd2\x20\x73\xa9\xb6\xd7\x43\xe7\xe0\xa1\x3a\x38"
+ "\xd1\x3a\x82\x5b\xc3\xdc\x0c\x1d\xf3\xe8\x62\x8f\xd1\x5c\x34\x20"
+ "\x2f\x95\x37\x50\xfe\xc3\xb4\xef\x2f\x56\xe7\xe4\x38\xc9\x04\xc4"
+ "\x07\x98\x97\xa0\x1f\x54\xa6\x85\x60\x4d\x6d\xc5\xf9\x54\x3a\x76"
+ "\x4c\xf2\x30\x71\x5f\x6a\xb0\xa7\xb9\x2e\x0e\xc3\xdf\x62\x8c\x84"
+ "\x3f\xc1\x42\xca\xe5\xba\xb8\x27\x22\xe6\x8e\xe4\xd2\xb8\x0c\xe8"
+ "\xa1\xa9\xbd\xc3\x42\x87\xa6\xb3\xdc\x0e\xdf\x6f\x84\x33\x87\x09"
+ "\x16\x87\x29\x5f\x23\x68\xf3\xf6\xbf\x12\xcd\x7d\x10\x3c\x54\xdc"
+ "\x5d\x92\x47\xb5\x74\x03\x87\xbb\x74\x96\x4f\xf0\xde\xa9\x33\x2f"
+ "\x45\x7d\xf4\xfe\x26\xfd\x12\x2f\x6b\x79\xcd\x51\x83\xf8\xc6\x31"
+ "\xf0\xc9\x37\x49\x9d\xeb\x34\xea\x57\x9d\x76\x07\x0a\x38\x80\xb9"
+ "\xa7\x31\x0a\xfd\x83\x47\x67\xa9\x83\xae\x51\x94\x1b\xce\x46\x1f"
+ "\x8f\x63\x7d\x6a\xdf\x29\xbd\x1b\x3e\x73\x23\x60\xb3\x54\x9d\x93"
+ "\x46\x11\x2b\x54\x17\x77\xbb\xec\x5b\xdc\x74\x7a\x37\x52\x1f\xc4"
+ "\x39\x44\xdf\x70\x76\x54\x05\xca\x14\x86\xcb\x60\xfd\x10\x2e\x5b"
+ "\xa8\xcc\x77\xe9\x97\x6b\x79\xe1\x37\x9f\xfa\xe1\x7a\x16\xbe\xcb"
+ "\x74\x96\xf6\xbe\xe1\x24\x3d\xb5\xeb\xa7\x76\xf5\xc0\x0d\xe0\x85"
+ "\x56\x47\x85\x84\xd1\x21\x9a\x3f\x81\x5f\x47\x02\x8d\x04\xf7\x38"
+ "\xe2\xff\xfd\x69\x92\xbf\xb3\xb8\xd4\xfe\xb9\xc4\xf9\xe0\x04\xa3"
+ "\xb7\x56\xfa\x19\x42\xbe\x50\xfc\xd7\x30\x9f\x69\x81\x9f\x21\x23"
+ "\xd5\xd5\xa2\xe2\x84\x85\xf2\xb5\x85\x70\x08\xfe\x0e\x74\x71\xa9"
+ "\xe0\x35\xd5\xfe\x03\xf7\xee\x92\xb0\x33\x7b\x81\x03\xc4\xc7\xbb"
+ "\xe4\x3c\x9b\x97\x82\x57\x95\x78\x38\x39\x41\xab\x43\xf8\x4c\x20"
+ "\x38\x2b\x54\x87\x86\x2b\x91\xb4\x81\xf2\xa6\x10\x5f\x1a\xc2\x1b"
+ "\x8d\x16\xc8\x3a\xe3\x37\xab\x7c\xc8\x42\x9a\x1b\xf8\x6b\x77\x09"
+ "\x3f\x58\x02\x2f\xe3\x97\x1d\xf1\x05\x40\x5f\x8f\x51\xbf\x88\x26"
+ "\x4c\x3e\xd8\x67\x9e\x62\x0d\xe3\xf6\xe4\x6a\x0d\xb7\x23\xe6\x55"
+ "\xe0\x76\xb1\xa0\x47\x93\x1b\x3d\xec\x5f\x3b\x35\xdc\xc7\x3a\x57"
+ "\x68\x5d\x57\x6c\x14\xe7\x03\x16\xe8\x03\xc5\xba\xf7\xf7\x0a\x19"
+ "\x03\xf3\xd9\x9a\xdf\x29\x7c\xe4\x6f\x57\x98\xb1\xd5\x77\x12\xfa"
+ "\x91\x1e\xac\x7f\x6d\x8d\x63\x6e\xa8\x2d\x17\xe2\x18\x14\x13\x0d"
+ "\xc4\x1a\xf4\x51\x9f\xe8\x9b\x11\x3e\xe1\x9a\x56\xa5\xb0\x5c\x9a"
+ "\xdb\x23\x19\x98\xb7\xf8\x85\xda\x9d\x8b\x0a\x49\x03\x4c\x2a\xbe"
+ "\x88\x3e\x8e\x82\xab\x45\xc2\x35\x7e\xed\xc8\xf5\x1d\x67\xc2\xfa"
+ "\x8e\x84\x2b\x60\x0a\xd8\x52\x5e\x1a\xff\xc4\x3c\x0d\xae\x61\x98"
+ "\x4e\x89\x51\xf1\x51\xa5\xad\xf1\x63\xd2\xd6\x0a\x19\x33\xa2\x71"
+ "\x3b\xc6\x42\x7b\x0a\xda\x17\xf1\xb0\x54\xd9\xa7\xc9\x0b\x9c\x8a"
+ "\x0f\x78\x58\x41\x8a\x46\xc7\xa8\x3f\x2b\x81\x4f\x98\x2b\x8d\x76"
+ "\x40\x57\x26\xfb\x3e\x25\x49\x9b\x0f\xf4\x3b\x92\x26\x50\x9f\x84"
+ "\xbd\x57\x78\xcc\x53\x7e\x4c\xe5\xe2\x41\xdb\xc2\xfc\xd5\x94\xec"
+ "\x91\x63\x9f\x92\x8a\xb1\x03\x27\xec\x1b\xa1\x2f\x93\x7b\x99\x47"
+ "\x67\x3a\x3e\x92\x5e\x99\x3e\x11\x76\x19\x2a\x3f\x06\x7a\x6f\x7f"
+ "\x40\xe6\xc7\xfe\x46\xf9\x85\x6e\x5e\xdd\x0f\x53\xb0\xff\x51\x5a"
+ "\xb3\x0a\x83\xe3\x94\xbf\x09\xf7\xb8\xe1\xcb\xe7\x92\xe3\x52\x16"
+ "\x24\x1a\x7d\x18\xb1\x33\x28\x5f\x49\x2b\xc9\x01\x81\x09\x8c\xd5"
+ "\xa8\xfc\x26\xe8\x04\xdf\x94\x76\xc9\xa6\x6e\x16\x63\xff\x1e\xff"
+ "\x7b\x97\x2e\xe1\x71\x5a\x47\x7e\xf8\xcb\xa4\xba\x6d\x5d\xba\xcb"
+ "\xb2\xa8\xdd\x04\xf5\xd7\x4a\xbf\x77\xd3\xef\xe5\xf4\x7b\x33\xfd"
+ "\x4e\xa3\xdf\x19\x94\x5f\x51\xf3\x27\xd3\x7b\x34\xa5\xdf\xa4\xfe"
+ "\x52\x1f\x13\x70\x9e\x9d\xfa\x14\xf8\xca\x07\x90\x9e\xf8\x39\xde"
+ "\xe9\xf7\x43\x75\xdc\x2d\x72\x6d\x27\x1c\xa4\x7a\xf2\x91\x0f\xfb"
+ "\x1a\xa5\xd9\x29\x4f\x19\xea\x86\x5f\x05\x7a\xbe\x3d\x82\x3f\xa5"
+ "\x7a\x2e\x7d\x94\x7e\x17\xd0\xef\x0d\xf4\x9b\x47\xe5\xe1\xcf\x33"
+ "\x95\x60\xd0\x16\xa6\x17\xe6\xa5\x99\xf9\x72\x3e\x69\x0e\x9b\xb0"
+ "\xde\x35\x7a\x00\x7c\x1a\x91\x6f\x95\xcc\x27\xe5\xd7\x4b\x67\x6b"
+ "\x73\x17\x10\x73\x67\x69\x0f\xd0\xdc\x51\xfd\xb7\xa3\x3c\xfd\xde"
+ "\xa1\xfe\xa6\xa8\xbf\x77\xaa\xbf\xff\xaa\xfe\x2e\x51\x7f\x97\x7a"
+ "\x74\x09\x3e\x95\x37\x21\x98\x25\x08\x3d\x39\xad\x5d\xb5\xdd\xc4"
+ "\x24\xc8\xd7\x44\xff\x6f\x46\x1c\x47\x6a\xb7\x46\xd3\x5b\x43\xf7"
+ "\x33\xbc\x23\xe6\x92\x3d\x42\xf7\x73\x69\x43\x04\x2d\xac\x34\xe9"
+ "\x52\x18\xf1\x4e\x13\x6a\xf4\xbc\x52\xad\xc7\xa4\x57\xcf\xeb\x11"
+ "\x0f\x06\x71\x35\xe1\xa7\x50\xc8\x51\xb1\x2b\x0e\x60\xbd\x0a\x9d"
+ "\x7e\x19\x7c\x14\x99\xab\xe8\xaf\x8e\x64\x8a\xfd\x1a\xbd\x87\xbc"
+ "\x24\xe5\xfc\x89\x7f\x1a\xdc\x91\x68\x0b\xcb\xf9\x97\xb6\xc9\xb3"
+ "\xcd\xcb\x7e\x4e\xe9\x11\xf2\xff\xa5\xf0\xd1\x75\x33\xc1\xba\x9d"
+ "\xc6\xb3\xa0\x43\x97\x98\x41\xbf\x37\x76\xca\x31\x27\x6b\x63\x56"
+ "\xe7\xca\xae\xc1\xbc\x53\x97\x10\x20\x7a\x98\x03\xfc\xee\x08\xd1"
+ "\xe5\x84\x00\x7e\x55\xfc\xa1\x79\x4e\x78\x19\xf3\x1d\x41\x4f\x52"
+ "\xc2\x74\x3a\xf1\xf0\xc8\x79\x31\x1f\x0e\x48\x7e\xa1\x9d\xd6\x25"
+ "\x70\xa0\x78\xd4\xba\x4c\xc5\xba\x54\xcb\xfa\x47\xd2\xf8\x29\xa9"
+ "\xa0\xf1\x6a\x1f\x09\x6f\x13\x32\x31\x37\x1e\x5d\x62\xbb\xba\x27"
+ "\x21\x26\xc3\xcd\x94\xbe\x4c\xf6\x53\xa6\xab\x6d\x11\xfe\x25\x2c"
+ "\x01\xfe\x6b\xe9\x2a\x7e\xa3\x9e\xc5\x98\x6b\x2d\x5d\xad\x9f\xf0"
+ "\x34\x61\x01\xd6\x8f\x96\x2e\x71\x72\x72\x29\xe8\x0d\xca\x06\x84"
+ "\x2d\x23\xc9\xdf\x0f\x34\x51\xbf\x2f\x6b\x24\xfe\x02\xf7\xc4\x8f"
+ "\x6f\xdf\xc2\x4c\x9b\xaa\x59\xac\x5c\x9b\x97\x7d\xae\x95\x15\x3a"
+ "\xfd\x1d\x97\xb5\x68\x34\xaa\x42\xd0\xb3\xf8\x94\x91\xb4\x72\xea"
+ "\x1a\xee\xb4\x04\x02\x26\x73\xe9\xd1\xc0\x02\x41\x73\x69\xdd\xd7"
+ "\x0c\xee\xb0\x1a\x3c\xec\x95\x38\x75\x2f\x69\x11\xbc\x9a\xce\xfa"
+ "\xdd\xa3\x75\x92\x76\xc9\xba\xad\x21\xfa\x17\xc1\x87\x08\x5a\x8f"
+ "\xb6\x50\x17\xed\x2b\x71\x3e\x47\xda\x25\x92\x7e\x5b\xd3\x3c\xec"
+ "\xca\x04\x8d\xb6\x62\x7f\xb2\xe8\x98\xbd\xfc\x01\xb9\x3f\x29\xd0"
+ "\x81\xd9\x7d\xc2\x3f\x5d\xab\xbd\x97\x61\xdf\x84\xff\xef\xf4\xcd"
+ "\x93\xe0\xb3\x2a\x8d\xfa\x7a\x37\xf1\x67\xfb\xd5\xb3\x19\x92\x73"
+ "\x2f\x0f\x42\x96\x55\xe1\x4a\xeb\xe9\xf2\x13\xea\xbc\x1c\xa7\xfe"
+ "\xec\x07\x6d\xdf\xbe\x51\xc6\x54\x82\x3e\x48\xc4\xf8\x02\xcf\x6a"
+ "\xe5\x7e\x11\xcb\x60\x87\xb5\x3b\x42\xc7\x25\xed\xce\x74\x97\x1d"
+ "\x15\x31\x2a\x4a\xcd\xa5\x52\x9f\x78\xf9\x06\x99\x7e\x79\x9a\xb4"
+ "\x43\x30\xab\xeb\xe9\xf2\x25\x51\xd6\xc4\xbf\x08\xfd\xeb\x84\x98"
+ "\xab\x25\x3f\x72\xf9\xc2\x08\x9b\x1f\x01\x6b\xe1\xe7\x78\xc7\xe5"
+ "\xa9\xe1\x75\x71\xf9\x6c\x94\xa1\xb2\x3d\x94\x9e\xad\xa5\xcb\xbd"
+ "\xc6\xbc\x58\xd5\x99\x55\x5e\xb2\x2d\x85\x11\x6d\x9e\xb0\xc7\xa9"
+ "\xad\xdf\xcb\x9b\x65\xfb\x72\xfd\x62\x8c\xc0\x07\xac\xe1\x80\xf0"
+ "\x2b\xb6\x42\xf8\xc2\xa1\xe7\xaa\x80\xb6\x76\x25\x7f\x27\xee\x9c"
+ "\xc9\x75\x7b\x79\x7b\x44\x3f\x2a\x55\x5c\x3d\xde\xf7\x90\xd5\x44"
+ "\xdf\x7c\x1e\x9d\x51\x9e\x65\xe9\xac\x52\xc6\x78\x62\xa0\x4d\x19"
+ "\xe0\x7e\xe8\xa6\xa1\x4f\x80\xce\x46\xb5\x57\xc5\x59\x89\x0f\xbe"
+ "\xd2\x2a\x69\x3d\x84\xfd\xa3\xc5\x31\xcd\x3f\xda\xe0\x8e\xa9\x4b"
+ "\xc2\xba\x63\xeb\x7e\x75\x5c\xa5\xd4\x5e\x8d\xab\xf0\x3d\xe0\xd2"
+ "\x73\x72\x8d\x59\xab\x80\xc7\x6e\xc2\x3d\xda\x7f\xaa\x8f\x14\x88"
+ "\xb2\x45\x1a\xee\xd1\x1a\xcd\xec\xd2\x4d\x9b\x5c\x95\xc8\xab\x69"
+ "\x4e\x61\xb7\xbf\x96\xf0\x20\x48\xbf\x99\xf2\x57\x17\x87\x5f\x15"
+ "\xe7\xab\xa9\x2c\xad\xff\x59\x8d\xda\x1c\xf8\x62\x17\xd5\x0b\x1c"
+ "\x2b\x84\x7d\x63\xb2\x38\xeb\x07\x8e\x01\xbf\xc4\x99\x3f\xe1\x9a"
+ "\x65\xdb\xbf\x31\xe0\x99\xf0\x99\x42\xef\xe8\x2f\xf0\x6c\x70\xc7"
+ "\x34\xa3\xe6\xf3\xd8\xa3\x9b\x2a\xcf\xdb\x76\x4c\x9b\xae\xd9\x86"
+ "\x03\x0f\xf3\x66\xb1\x4b\xa9\x7e\x5b\x93\xcd\x07\xdd\xf9\xdf\xdc"
+ "\x81\x3b\x19\xf2\x02\x76\x92\x5e\x5e\xd6\x44\x65\x22\xe6\xdf\x2c"
+ "\x6c\x59\x8f\xac\x12\xfa\xcc\x29\xf4\x6d\xed\x48\x9a\x13\xe3\x17"
+ "\x7c\x25\x51\xc7\xab\x12\x18\xce\xe9\x69\xaf\x99\x56\xa9\xf1\xc3"
+ "\xf3\x29\x8d\xf2\xa0\x7f\x90\xc1\xdb\xe8\xb9\x12\xfb\xf4\x38\x7a"
+ "\xe7\x05\xd0\x15\x81\x66\x40\xf7\x04\x3d\x18\xc1\xfa\x58\x97\x6e"
+ "\xe6\xe4\xa3\xf0\x5f\xb4\xfe\x9b\x7e\xaf\x0b\xf3\x79\x3f\xfc\x69"
+ "\xd9\x72\xd8\x94\x0e\xdd\x15\x3e\xe8\x9d\x1c\x5f\x43\xc7\x33\xdd"
+ "\x3a\x52\xc7\x33\x3d\x5b\xfd\x2b\xa0\x3f\x4f\xf8\x6f\x86\x5d\x7d"
+ "\xee\xbd\xf0\xdf\x8c\x12\x99\x77\x46\x15\xfd\xd5\x49\x58\x59\x69"
+ "\xad\x4c\x2f\xd0\x60\x05\x9a\x02\x1a\x0b\x3b\x1b\xac\x73\x5d\x80"
+ "\xc1\x5f\x12\xcd\x13\xf5\x7b\xfb\xb5\x2b\x5c\x5b\x20\xd3\x4e\x17"
+ "\xb1\x0b\xe0\xbf\xf8\xa2\x6c\xbd\x74\xd3\xc5\x7c\x0a\xff\xb2\xba"
+ "\xe9\x76\x6a\x3b\xa1\xe2\x0c\x33\xd8\x73\xd8\x0c\xe8\xd0\x2d\x41"
+ "\xee\x82\x0c\x0c\x9c\x20\x18\xb4\xf5\xe8\x66\xfc\x3c\x6f\x2b\xd3"
+ "\xd3\xf7\x99\xf4\x9c\xa1\xf1\x52\x54\x26\x2e\xca\xcf\x12\xc0\x43"
+ "\xdd\xb1\x95\xcd\x1c\xdc\x31\x63\xb1\x36\x57\xe0\x33\xa0\xc7\x0b"
+ "\xc5\xbb\xd2\x4d\x17\xb6\x00\xf0\xe5\xef\x01\xdc\x34\x5a\x75\x06"
+ "\xba\xeb\x19\x49\x51\x3e\x16\x27\xf7\xa1\x19\x45\x34\xaf\x29\x12"
+ "\x5f\x66\x2c\x21\xdc\x3f\x16\xd1\xcf\x7f\x89\x78\xde\x81\xf2\x16"
+ "\x1f\x78\xb8\xf1\xe0\x33\xe3\xa8\x06\x9f\x0a\xe1\x03\x94\xd9\xc5"
+ "\x7c\x07\x78\x2f\xf5\xad\xc5\xbe\x85\x19\x7b\x74\x57\xbc\x45\x63"
+ "\xc4\xdd\xe0\x66\xa9\xe3\xbf\xe2\x35\x4d\x4e\x97\xfd\xbe\x62\xab"
+ "\x65\x5b\x14\x83\x6e\x1e\x3e\x23\x85\x2d\xe6\x59\xab\xd0\xc7\xbb"
+ "\x03\x8b\x99\xab\x70\x11\xf2\xdc\xa5\xee\x65\xc7\xfb\x1c\x56\x76"
+ "\xc4\xba\x98\xd6\xf1\x15\x4b\x3d\x7a\xb6\xf2\xa2\x6d\x5e\x75\x57"
+ "\x2c\x55\xe1\xdb\x22\x6c\x45\x74\x57\x5c\x8e\xbd\x04\xba\x01\xda"
+ "\x47\xc0\xa3\xc5\x53\xdd\xfb\xb5\x75\x43\xfb\x44\x13\x95\xb1\x4a"
+ "\x3d\x66\x7f\x2a\x3d\x27\xc0\x6f\x8d\x90\x1f\x64\x7e\x93\x3c\x37"
+ "\xb8\xa2\x3d\xc4\x6f\x53\x3e\x94\x13\x36\x84\xba\x19\xbd\xe9\x41"
+ "\xe8\x12\x66\xf4\x62\x6c\x2a\x2e\xd2\x7e\x35\xd3\x18\x5e\xb7\x33"
+ "\x96\x88\x75\xdb\x1b\xb9\x2e\x67\x26\x85\xe5\xd4\x69\xc7\xe7\x55"
+ "\x31\xdb\x58\xeb\xd0\x6e\xc6\x5e\x35\x73\x57\x45\x05\xaf\xab\xd4"
+ "\x2b\xdf\xdf\x5e\xce\x4c\xba\x52\x02\x1b\xd6\xd9\xc6\x8c\x4b\x69"
+ "\x3d\x1e\xb4\x98\x2e\x4b\xbd\x23\x6f\x22\x2f\xb4\x32\x7d\xd9\xb9"
+ "\x89\xc6\x59\xfe\xcb\xea\x78\xd4\xb5\x2b\xee\xce\xc3\xd9\x77\x25"
+ "\xfb\x6a\x2d\x8b\xba\x83\xa8\xdc\x55\x26\x66\xf7\xe8\x66\x35\xe0"
+ "\x9e\xfb\x11\x13\x78\x91\x59\x0d\xa8\xb3\xa0\x86\x19\x0b\x3a\x79"
+ "\x77\xe9\xc3\xd1\x46\xda\x7f\xe3\x68\xdf\x28\xb9\xc4\x74\x59\xdd"
+ "\x30\xd5\xf1\x6e\x86\x28\x57\x3f\x7e\xdf\x6c\x37\x8f\xdd\x37\x7b"
+ "\x62\x97\xce\x76\xe7\xc5\xf5\xed\x4a\x5f\xb8\x6f\x57\xfa\xfe\x17"
+ "\xfa\xf6\x49\x44\xdf\xe2\xc2\x7d\xcb\x46\xdf\x4e\x5c\x5c\xdf\x66"
+ "\x2f\x08\xf7\x6d\xf6\x82\x7f\xb2\x6f\x87\xc6\xef\xdb\xac\x47\xc7"
+ "\xee\x5b\xfe\x65\x5d\xba\x59\x5b\x2f\xae\x6f\x73\xf2\xc2\x7d\x9b"
+ "\x93\xf7\x3f\xe9\x5b\x61\x0d\x3f\xd9\x3a\x9d\xc1\x9f\xa6\x09\x74"
+ "\xbe\x4b\x77\xe5\xb6\xad\xd3\x85\x1d\x77\x3c\x3d\xdf\xec\xa8\xe1"
+ "\x7f\x97\xbc\xcd\xac\xf3\x72\x4f\x9b\xe5\x25\xfc\x95\x76\x25\xba"
+ "\x2b\x3d\xc2\xce\x25\x6a\xea\x01\xee\xe4\x81\xeb\x7d\xb0\x19\x0c"
+ "\xc0\xb7\x0b\x7c\xc1\x37\xbf\x3a\xe0\x47\x1c\x8e\xf6\x7d\xe7\x0c"
+ "\xec\xd5\x01\xaf\x7e\x70\xc7\x95\x73\x35\x7f\xae\x5a\x59\x4b\xf5"
+ "\x85\xe8\xd1\x95\xab\xef\xc8\x66\x16\xd0\x23\xfc\x22\x9e\x66\x45"
+ "\xe1\x44\xe3\x1d\x5f\x63\xdf\xbf\x32\x5f\xbb\xaf\xab\xd5\xb5\xbc"
+ "\x7b\x22\xb7\x14\xb0\x28\xdc\x19\x16\xbe\x1f\xad\x5e\x36\xbb\x80"
+ "\x45\x2f\xcf\xa7\xfa\xfd\x2c\xc3\x92\x4f\x75\x13\x3c\x24\x2f\x7f"
+ "\xe5\x5b\x51\x6b\x99\xa9\x8a\xea\xc6\xef\x1d\x56\x07\xdf\xbe\x8b"
+ "\x19\x70\xb7\x18\x77\x84\xe5\xfd\xe0\x09\x46\x6a\xc7\xa3\xb5\xf3"
+ "\x2d\xf0\x33\x4b\xf8\x5d\xf5\x6e\x18\x7e\x57\x6d\x08\xc3\xef\xaa"
+ "\xef\x4a\xf8\x5d\x95\x1c\x86\xdf\x6c\xdb\xc5\xc1\xef\xaa\xb5\x61"
+ "\xf8\xc9\xb2\x17\x86\xdf\x55\x2f\x8c\x0f\xbf\xab\x1a\xc3\xf0\x93"
+ "\x75\x8d\x03\xbf\x09\x63\xc3\xef\xaa\xe0\x3f\x07\xbf\xd9\xb6\x7f"
+ "\x12\x7e\xb1\x12\x7e\x73\x74\x61\xf8\xcd\x7e\x23\x0c\xbf\xd9\x9b"
+ "\x25\xfc\x66\xdb\xc3\xf0\x9b\x93\x71\x71\xf0\x9b\x7d\x28\x0c\x3f"
+ "\x59\xf6\xc2\xf0\x9b\x7d\x62\x7c\xf8\xcd\xf6\x87\xe1\x27\xeb\xba"
+ "\x38\xf8\xcd\xb9\x95\xe0\x16\xa7\xc2\x2f\x6e\x7c\xf8\xcd\xc9\xf8"
+ "\x27\xe1\x67\x91\xf0\xbb\xfa\xf6\x30\xfc\xe6\xf4\x87\xe1\x37\xe7"
+ "\x4d\x09\xbf\x39\xf5\x61\xf8\x5d\x5d\x77\x71\xf0\x9b\xd3\x1b\x86"
+ "\x9f\x2c\x7b\x61\xf8\x5d\x3d\x6b\x7c\xf8\x5d\xbd\x30\x0c\x3f\x59"
+ "\xd7\x38\xf0\x9b\x38\x36\xfc\xae\xde\xfa\xcf\xc1\xef\xea\xba\x0b"
+ "\xc1\xef\xe2\x78\x8d\xab\xc7\xbd\xff\x7e\x91\xf5\x04\xc6\xab\x07"
+ "\x30\x84\x7d\xa2\xb2\xe3\xea\x40\xad\x32\xc1\x28\xef\x70\x5c\xdd"
+ "\x40\x32\xcc\x6d\x1d\xba\xef\xdc\x55\xab\x44\x1b\xb9\xf3\xef\xc7"
+ "\x15\xe7\xc9\x62\xbe\x6d\x82\x41\xd9\x36\xd1\x00\x7f\x06\xe3\xc6"
+ "\x5c\xd7\x7d\xe7\x60\xd4\xe5\xec\x0a\xdc\xd7\xdb\x4e\xfc\x1a\x9e"
+ "\x07\x77\x7c\xa7\x81\x78\x91\x94\xd1\x30\xc9\x5c\x93\x2b\x82\x7d"
+ "\xe6\x64\x65\x6e\x58\x97\xb9\x7a\x5d\x9e\x6d\xf5\x43\x8f\xe4\x8e"
+ "\xf4\xa1\x2f\xe2\x64\x16\x63\xfe\xbe\xe3\x0f\xf9\x98\x71\xf2\x7c"
+ "\xf8\xea\xb3\x5f\x09\xdb\xb4\xa4\x85\x22\xae\x81\xd9\xb2\x84\x0f"
+ "\xa7\xed\x4e\xb9\x8a\xbf\x23\x7c\x10\x0e\x67\xef\x26\x79\xaa\x17"
+ "\x7e\x65\x54\x7f\x85\xbd\x5d\xba\x6b\x7f\xc0\x63\xa7\x34\xc2\xa6"
+ "\x43\xdc\xed\xd0\x25\x69\x77\xb0\x9a\xb9\x29\x66\x89\x52\x3a\xa5"
+ "\x91\x97\x4d\xa9\x07\x0c\x5a\xe1\xff\x6d\x63\xd4\xcc\x0e\xdd\xdc"
+ "\x04\x1e\x1b\xb3\x84\x97\xc6\x2c\x55\xcf\x38\x96\xc2\x5e\x34\x65"
+ "\x0b\xff\x1b\xea\x53\x79\x41\xc4\x2d\x71\x49\x7e\x30\xe9\xa8\x65"
+ "\x9b\x2d\x0a\x79\xe1\x87\x11\xfe\x09\xb5\x58\x55\xe8\x37\xf2\x12"
+ "\x3f\x7e\x1b\x95\xbf\x0d\xb1\x3a\x43\x75\xc8\x3e\x4d\xe9\xd1\x5d"
+ "\x63\x10\x63\x29\x35\x7a\xfb\x1e\x4b\xdb\x2d\xe2\x45\x0a\xb8\x5e"
+ "\x77\x9e\xc6\xe0\x15\x71\x3e\x03\x67\x45\x9c\x4f\xb5\xcc\x0c\x2a"
+ "\x23\xe8\x29\x7c\xaf\xca\x3a\xae\x3b\xa1\xf5\x8b\x78\xe8\x49\xf4"
+ "\xfe\x61\x44\x1b\x97\xd0\xfb\x6b\x11\xdf\x4d\xf4\xfe\x1c\xf1\xa1"
+ "\x93\xd5\xef\xb1\xf4\xbe\x19\x7c\xa9\x8c\x91\x59\x24\x6d\xa2\x75"
+ "\xd7\xad\xa2\xb4\x38\x35\xcf\x64\xca\x73\x3b\x78\x5d\xb5\x8e\x78"
+ "\x7a\x9f\x03\x99\x51\xfd\x9e\x40\xef\x31\x38\x17\x50\xbf\x5f\xda"
+ "\xa3\xbb\xf6\x34\xbd\x7f\x47\xfd\x4e\x7c\xfd\xb5\xc2\xd7\x16\xc1"
+ "\x7d\x31\xc6\x44\xb0\xaf\x06\xdc\x09\xd6\x8b\xb9\xc9\xd8\x4b\xf2"
+ "\xaa\x03\xf3\x88\x71\xba\xb6\xf4\xb0\x0e\xdd\xb5\x97\xe3\x5e\x9e"
+ "\x9c\xab\x29\x8d\xd2\x3f\x90\x3e\x8d\xd2\xad\x48\x87\x6d\xb9\x52"
+ "\x36\xa5\x1a\xcf\x04\xd3\xd7\x00\x43\xb5\x2d\x92\x89\xae\x4d\x51"
+ "\xe7\x99\x60\x07\x1f\xbe\xac\x68\x9f\x3a\x17\xd4\xb7\x89\xf4\x7d"
+ "\xaf\x7a\xee\x91\xbd\x3c\x30\x2c\xef\x17\xe9\xae\xcd\xfe\x6f\xf9"
+ "\xac\xa0\x72\x92\xee\x5d\x7b\x40\x8b\x61\x48\x69\xc2\x57\x06\xf0"
+ "\x13\xfa\x15\x6f\xac\xb1\x5d\xf8\x68\x21\x1c\xd5\x70\x05\x78\xc2"
+ "\x27\x7c\xc7\x25\x75\x35\xd7\x86\xee\xff\x52\x59\x9b\x1a\xf7\x81"
+ "\x49\x39\xe1\x3a\x16\xb6\x2f\xba\x46\xd0\x87\x88\x6f\xd3\x23\xbe"
+ "\x69\x7e\x09\xa5\xcf\xa9\x1d\xd7\x2d\x8c\xf8\x56\x35\xea\xdb\xca"
+ "\x88\x6f\xc5\xa3\xea\xb4\x47\x7c\xcb\x1b\x55\xae\x34\xe2\x5b\xc6"
+ "\xa8\x6f\x07\x22\xbe\xa5\xaa\xdf\xa2\x28\xdd\x15\xf2\x91\xa8\xbb"
+ "\x26\x45\x4d\x27\x5a\x7f\x5d\x7b\x44\x7a\xb2\x9a\x8e\xf6\xbd\x1e"
+ "\xf6\xe7\xe3\x6a\xba\xc0\x73\xc2\xa3\xab\x65\x1b\x73\x4d\x11\x6d"
+ "\x30\x39\x87\xc6\x76\x39\x7f\x49\xf9\x16\x9d\x6d\x22\x70\xca\xb2"
+ "\xad\x08\x31\x84\x2a\xa5\x3f\x30\xb9\x0e\x45\x1c\x6a\xc4\xca\xa5"
+ "\x7c\xe3\xd1\xc6\xb1\x6d\x04\xe7\x16\x69\xf7\x58\x83\xa5\xc6\xe3"
+ "\x4a\xa9\x05\xe7\x23\x33\xe1\x37\xcc\xd1\x0b\xdf\x31\x5a\x4c\xc2"
+ "\x21\xe6\xce\x1b\x2c\x6a\xf5\x8b\xfb\xb6\xb8\x0f\x61\x86\xdf\xb3"
+ "\x56\xa1\xdf\x39\x2d\xe3\x12\xe2\x7e\x6f\x99\xf1\xf8\xa6\x5e\x36"
+ "\xdd\xfe\x3d\xde\x09\x39\x4f\xd2\x84\xb9\xa0\x27\x16\x95\xa6\xed"
+ "\x12\xb6\xde\xba\x79\xc9\x48\x73\xf7\x0a\x3d\xb3\xb1\x4b\x37\xaf"
+ "\x48\xfb\x2e\xc7\x3b\xaf\x48\xc8\xd2\xea\xbd\xc2\xc1\x1d\xf3\x92"
+ "\x42\x71\x33\x75\xf3\x8a\xfb\x63\x13\x93\x28\x6d\xf1\x48\xfb\xc6"
+ "\x79\xf7\xa2\x4e\x8c\xc3\xa3\x9b\xeb\x47\xdd\x94\x27\x23\x64\xdf"
+ "\x48\xe9\x9b\x02\x6c\x2a\xf5\xad\x4b\xab\x9f\xbe\x93\xfc\x3f\x57"
+ "\xc8\x95\xa8\xb3\xbf\x6c\x71\x1a\xa5\x55\x79\xf4\x9f\xdb\xa4\x7d"
+ "\xe4\xbc\x3a\x0f\xeb\x48\x1e\x6f\xff\x13\x3a\x49\xd3\x94\x36\x5e"
+ "\x3a\xa5\x9d\xd6\x7c\xb3\xf4\x03\x30\xa5\x4d\xca\xf2\xf3\x4e\x23"
+ "\x16\x19\x62\x78\xe3\xdc\x51\xd2\x9d\xeb\x85\x3d\x04\xd2\x08\x36"
+ "\x07\x88\x3e\x0b\xfd\xf3\xc5\xad\xc9\x79\x62\xff\x83\xef\x26\xdc"
+ "\xb9\xc0\x1d\x8e\xc1\x1d\xd7\x2f\x0d\xc5\x7a\xd0\xee\x13\xe8\xae"
+ "\xff\x39\x74\x7c\x15\x8a\xec\xe3\xe8\x3e\xa0\xbf\x54\x57\xef\xb8"
+ "\x7b\xa9\x69\x8a\xd4\x83\x96\x9b\x65\x6c\x59\xdd\xf5\x6f\x46\x59"
+ "\xa7\x75\x53\x5b\x0d\xa1\x18\x17\x94\xa7\x1c\x36\xc1\x54\x7f\x68"
+ "\x9c\x39\xa2\x8d\xe3\x52\x4f\x7f\xbd\x97\xe8\x58\x73\xc5\x10\x33"
+ "\xa8\xe9\xde\xd6\x80\x1f\x77\xeb\xc7\xf4\xc1\x85\x3d\x52\xf8\x6f"
+ "\x2a\x9f\xd2\x8c\xfb\x13\xf3\xfd\x5a\x9f\xe7\x7b\x61\xb7\x8f\x3e"
+ "\x4b\xd8\xce\x3f\xa9\xc1\xb1\xec\x1c\xd5\x5d\xf8\x05\xeb\xd4\xcd"
+ "\x7f\x14\xf6\x2d\x02\x26\x5b\x34\x9b\xab\xf9\x8f\x8a\x7c\x43\xa1"
+ "\x3c\x42\xdf\x01\x7b\x5f\xc0\xa9\x16\x7e\x07\xa8\xce\x72\x9a\x0b"
+ "\x11\xc7\x56\x37\xff\x0d\xa1\xdf\xa4\xef\x62\xdc\xc2\x9e\x2d\x39"
+ "\x41\xe2\xca\xfc\x43\x1e\x5d\xb2\x4d\xe2\xa0\x4c\x43\x0c\x78\xd8"
+ "\x21\x9c\xd1\xcd\x2f\x43\x2c\x59\x82\x47\x3b\x7c\xd7\xb5\xfa\x68"
+ "\xbd\xe4\x0f\x01\x17\xda\x11\x33\xd0\xa3\x9b\x2f\x63\x59\x99\x00"
+ "\xf3\xf9\x76\xb4\x0f\xd8\x22\x8e\x2e\xc1\x74\x60\x70\x47\x72\x48"
+ "\xff\x81\x98\xbd\x94\x67\x5c\xdf\x8d\x80\x51\x90\xfa\xdc\x4a\xfc"
+ "\xaa\x6b\xea\x17\xe8\xdf\x27\x8a\x79\x4a\x33\xec\x27\xe9\x59\xfa"
+ "\xbe\x28\x95\x73\x27\xf1\x20\xf9\x60\x94\x75\xfa\xac\x56\x89\x0b"
+ "\x32\x8e\xb9\x2e\x39\xf5\xff\xb1\xf7\x3d\xf0\x4d\x55\x67\xff\x27"
+ "\x69\x80\x80\x49\x13\xb1\x73\xc1\x15\x8c\xae\x6e\xd1\xa1\x56\x45"
+ "\x45\xc4\x59\x15\x1c\x28\x52\x74\xa0\x55\x10\x8a\xfc\x0b\x5a\x20"
+ "\x94\x52\x02\x94\xfe\x13\xbb\x52\x93\xd2\x39\xe6\x5b\xa4\x2d\x15"
+ "\x71\x2d\x1b\xba\x6e\xb0\xfd\xba\xbd\x30\xe3\x2b\xec\x2d\xda\x36"
+ "\xd5\x1f\xfc\x6c\x4a\x1d\x69\xd7\x61\x65\x05\x62\x29\x34\xb4\xc9"
+ "\x3d\xbf\xe7\xb9\xe7\xa6\xb9\x69\x93\x36\x49\x0b\xe2\xa4\x9f\xcf"
+ "\xfd\xdc\xde\x73\x9f\x9c\x7b\xce\xf3\x7c\xcf\xf3\x3c\xe7\xdf\x73"
+ "\x04\xfe\xf1\x67\x5e\x14\xa4\x32\x3e\x30\xfa\xbb\x64\x6c\x5c\x26"
+ "\xfa\xc7\x50\xae\x52\xef\xb8\xcc\x5d\x32\x7e\x4c\x4d\x58\x63\x0d"
+ "\xef\x0e\x88\xca\xdc\xc1\xef\x03\x6c\xc7\x3e\x75\xec\x62\xfc\x96"
+ "\x19\x63\x8b\x21\x2e\x4e\x89\xf1\x1f\x3b\x15\xcb\x89\x6b\xf3\xdc"
+ "\xca\xc8\x56\x6a\x8e\x6c\x43\x3e\xc3\x6f\xd2\xa0\x2d\xf8\x1d\x5b"
+ "\x45\xbd\x89\xe7\x9e\x74\xe6\xdc\x35\x5e\x74\xf6\x2e\xd8\xc1\xbb"
+ "\x5e\xf4\xd8\x39\xb4\xd1\x18\xe7\xa1\x27\xcd\xfc\x9c\x06\x7c\x1c"
+ "\xad\xe0\xe3\xf8\x1d\x2b\xe2\xe3\x1c\xde\x41\x62\x71\xaf\x31\xae"
+ "\xd3\x46\xbc\x51\xc5\xb3\x95\x18\x3b\x19\xe3\x40\x5a\x36\xdc\x0d"
+ "\xe5\xbd\x5b\xf9\xab\xeb\xf9\xfd\x8d\x1d\x96\x3b\xda\x71\x8d\x4e"
+ "\xdb\xc9\x34\x3e\xbe\x91\x3c\xde\xe8\xa2\x3b\xd9\xd9\xdb\x0e\xaa"
+ "\x7c\xb6\x12\xdf\xf1\x67\x07\x60\x9e\xe1\xc6\x01\x96\xdc\x55\x2f"
+ "\xf8\x32\x6d\x60\xcb\xbf\x0f\xf5\xe1\xf7\x33\xc2\xff\xd7\x9f\x92"
+ "\xdc\x73\x2f\x3b\x2f\x92\xc5\xb2\x17\xd6\x1a\x0e\x67\xfb\xf3\x1d"
+ "\x84\xdf\x2f\x2d\xb9\x7b\x8f\xf6\x36\x42\xda\x24\x77\xbf\xc7\xc7"
+ "\x95\x36\x8d\x8c\x15\x78\x10\xbb\x95\x95\x4b\xb5\xc0\x28\xe5\xcb"
+ "\x88\xe5\x0b\xad\x6c\x77\x7b\xec\xe5\xf0\xce\x9c\xbb\x2b\x3d\xfb"
+ "\xfa\xf9\xfa\x0b\xf1\xa6\x2d\x37\x63\xbf\xe5\x9e\x5b\x98\x5c\x46"
+ "\x4e\x10\xbe\x3d\x61\x08\xbe\xed\x10\xf2\x94\xf3\x31\xb7\x81\x2f"
+ "\x90\x2f\xe8\xbd\x7b\xe2\x3c\xf6\x54\x58\x23\x3f\x9e\xd9\xf9\x7b"
+ "\x12\xbc\xb6\x94\xf1\xd0\x67\xcf\xce\xaa\x55\x29\x5a\x70\xd8\x0d"
+ "\x0b\x53\x16\xe9\xb5\x4b\x92\x93\x57\x25\x6b\x31\xe0\x4d\xaf\x73"
+ "\x95\xe4\x34\xe7\x9e\x24\xe1\xec\xb7\xf2\x9e\xb3\xdf\x72\xee\xd9"
+ "\x2f\x3e\x93\xcf\x2e\xb9\xa7\x72\x68\xfa\x35\xf7\x04\xdc\xe7\x57"
+ "\x20\xe5\x2a\xe0\xaa\x84\xcb\x02\x57\x15\xf6\x73\x16\x38\x49\x1c"
+ "\xd8\x47\x7e\x4e\xd8\xbb\x5f\xfd\x1e\x13\xce\x83\x37\x4b\x26\xdc"
+ "\x55\xc2\xc9\x08\x1f\xd7\x24\x9b\xc3\xb5\x24\x18\x1f\xbd\x12\x2e"
+ "\x0b\x5c\x55\x70\xf1\xbf\xe3\xfe\x87\xdf\x6b\x5b\x21\x7e\x87\x73"
+ "\xd3\x34\xdb\x32\x19\x69\x68\x96\x8c\xf7\x43\xb8\x37\x18\x5d\xaf"
+ "\x32\x48\x69\xce\xed\xfb\x05\x3a\x5e\x37\x44\x66\x11\xad\x1f\xba"
+ "\x08\x9a\xf3\x63\xbb\x40\xc7\xef\x7d\xf7\xd4\x07\x63\xf7\x03\xbd"
+ "\x87\x4e\x46\x73\xee\x32\x08\x74\x2c\xa6\x59\xb6\xd4\xdf\x77\x87"
+ "\xd1\xec\x0b\xd1\x02\x9d\x5a\x9c\x9f\x88\x66\x38\x97\x73\xe3\x14"
+ "\xa4\xe1\xb2\x64\xec\x1c\x96\x9c\x7b\x8e\x02\xbd\xdf\x98\xa7\xa1"
+ "\xc9\xe9\xde\xb4\xde\x72\x32\x2c\x5a\xbe\x64\xd2\xf2\x95\xa9\x78"
+ "\x92\x54\xca\xaa\xb5\x29\x78\x5f\xb9\xf0\x15\xfe\xb6\x6a\xc1\xd2"
+ "\x45\xec\x9f\x94\xa4\x58\xfc\x27\x09\xf0\x86\xf7\xc5\x6b\x0d\x78"
+ "\x5b\xb4\x0a\x1f\x8d\xfa\xf1\x6b\x17\x79\x8e\xf4\xf6\x89\xbb\xd4"
+ "\x99\x73\x5f\x8c\x5d\x32\x21\x8a\xf9\x23\xf7\xc5\xda\x25\x3f\xe6"
+ "\xe7\x81\x55\x59\x76\x72\x58\xc7\x9f\xfd\x47\xfa\xc4\x2b\x90\xdc"
+ "\xf7\x10\xc6\x2b\x50\x65\x19\x16\xa9\x5c\xcb\x97\x50\xb3\x6a\x1a"
+ "\xfc\x36\xc9\x4e\x76\x0b\x7b\xcb\x47\xc6\xf1\x71\x43\x73\xee\x3d"
+ "\xe0\x59\x5f\xc8\x99\xe4\x1d\x18\x0f\x9f\x5f\x6f\xf4\x06\xc6\xc2"
+ "\x19\xa9\x05\xba\xc9\x25\x6f\xf0\xe7\xd2\x44\xc1\x7b\xfc\xdd\x14"
+ "\x78\xd6\xc0\x73\x34\x97\x7b\x31\x13\xf7\x27\xc2\xb3\x16\x9e\x63"
+ "\x20\xff\x6a\x4f\xbb\x10\xf3\x46\x38\x6c\x6e\x92\xdf\xfe\xb1\x6f"
+ "\x8c\x29\x68\x5b\xf7\xab\x3d\x67\xf9\xf2\xe7\xf6\xe6\xdc\xaf\xed"
+ "\x39\xb7\x97\x3f\xcb\x49\x3d\x8f\xb7\x6b\xbc\x6d\xbf\xbf\x38\x42"
+ "\x33\x36\x95\xf9\xe1\xf7\x4f\xf3\xc4\x64\x60\x7e\xf6\xfd\x09\xa2"
+ "\x33\x8f\xf1\x59\xdf\x73\xe6\x31\x8b\x4b\xf6\x16\x1f\xf7\x48\x72"
+ "\x7f\x05\xcd\xb9\xaf\xbe\xe7\x7c\xba\x9c\xfb\x0b\xc4\xe7\xd3\xd9"
+ "\xe1\x3d\xf6\x6f\x20\xbd\xdc\x6b\x07\xef\x9f\x8c\xdf\xf4\x77\xbe"
+ "\x33\xf4\xcf\x8d\x0b\xd6\x83\x2f\x0e\x77\xde\x2f\x17\x7c\x60\x4c"
+ "\xa7\xd9\x71\x18\xdf\x46\x8b\xef\xd0\xf7\xf3\x3b\xe6\x80\xe7\x2b"
+ "\x4a\x26\x3e\x82\x71\x77\x1d\x19\x8b\x25\x3f\x2c\xc1\x35\x48\xf0"
+ "\xcc\xe2\x46\xd2\x33\x92\x89\xfc\x3e\x36\x4f\x4c\x39\xf1\x9e\x78"
+ "\xbf\x7b\x0f\x3e\xf3\xcc\x19\x27\xad\x52\xb9\x16\x2e\x61\x7e\xdc"
+ "\xc4\xb7\x99\x2e\x55\x29\x98\xbd\x9f\x68\xa2\xcf\xb0\xf3\x4e\xec"
+ "\x92\x07\xd4\xb8\x1f\x49\x25\x49\x5a\x45\xe1\xb7\x2a\xe3\xc2\x25"
+ "\x7c\x1a\xd0\xbd\x0a\xbe\x96\x50\xbe\xd5\xd6\xe8\x56\x42\x2f\xb8"
+ "\xd9\x5e\x7f\xc9\x44\xc3\xfc\xb1\x99\xf8\x1d\x39\xef\x47\x7c\x46"
+ "\x14\x78\x56\x20\x96\xad\x44\x14\xf3\x6e\x2b\xa4\xe1\x7a\xac\x73"
+ "\xcf\x10\x3e\xee\xaf\x50\x16\x03\x7f\x56\x59\xce\x03\x72\x4f\xcc"
+ "\x1c\x3b\xa4\xf5\xae\xcf\x33\x3f\xe7\x5b\xc8\x2d\x8b\xc6\xcf\x9a"
+ "\x0a\xff\x8d\x17\x8e\xb9\x15\x63\x27\xfa\x5c\xe4\xb5\x71\xe7\x7e"
+ "\xb3\xef\x4b\xfe\x9c\xc8\x9c\x07\x12\x40\x4e\x2e\x5e\xde\xaf\xce"
+ "\xfd\x0a\x75\x0b\x7f\x7e\x22\xee\x2b\xe4\x3a\xe0\xbb\x93\xa7\xf3"
+ "\xf1\x75\xa5\xcc\x5f\xe4\xe3\xda\xe5\x3c\x80\x31\xbd\xed\xec\x8c"
+ "\x58\x95\x1d\xe4\xc7\xdb\x7d\x6c\x1b\xfc\xfe\x49\x35\xd6\xfd\x81"
+ "\x0a\xd0\xa9\x8f\xc1\xf5\x1c\x3b\x1f\x66\xee\x57\x9e\x7c\x31\x7e"
+ "\x14\x60\x6b\x1a\xdc\xd5\xf0\xfd\xfa\x9e\x35\x42\x3d\x7b\x32\x1f"
+ "\xb8\x88\xb1\xad\x7a\xf6\xe7\x4a\x26\xdf\xcb\xfc\xca\x49\x32\x3b"
+ "\xf9\x51\x01\x6b\xdf\x18\xff\xbf\x4a\xd8\x9b\x35\x09\xfa\xbf\x4f"
+ "\x26\xfa\xe6\x31\x69\x89\x67\xec\x83\xc9\x6e\x52\x1c\x60\xf1\x31"
+ "\xb8\x9e\x03\xfa\x19\x9e\x33\xb2\x5f\x95\xf2\x7b\x8b\x4e\x46\x68"
+ "\x48\x2c\xa4\x2f\xf6\xa4\x0f\x93\xc4\x01\x6f\x26\xa5\x78\xf4\xc9"
+ "\xb9\xc8\xc8\x0e\x78\xde\x0c\x7e\xba\x8b\x3d\xab\xf0\xfd\x36\xcf"
+ "\x33\xfc\x5f\xea\xd1\x37\xd8\x3f\x3b\xb7\x31\x61\x3b\xf6\xff\x16"
+ "\x69\xc0\x27\xd3\x60\xff\x6a\x12\xf4\x7f\xff\x37\x93\xfd\x76\x92"
+ "\xe1\x5c\xf6\xc7\xe3\x3b\x22\x9f\xa9\xe8\x00\x1d\x0a\xef\x1a\xed"
+ "\xe4\x77\xf3\x84\x7c\x5a\xed\xd2\x86\x16\xaf\x3c\x22\x54\xc0\x63"
+ "\x17\xab\xd3\x64\x2d\x55\xaa\x09\x9e\x57\xde\x99\xf3\xa0\xda\x2e"
+ "\xb9\xcf\xc9\xd3\xa5\xb6\x95\x9a\xba\xd4\xb3\xad\xd0\x83\xb7\x2c"
+ "\x45\xac\x3c\xc8\xef\x4f\x36\x6f\x50\xf3\x31\xc4\x30\x0e\x01\x1f"
+ "\x9f\x0c\x63\x4e\xba\xc8\x70\x3e\xce\xbf\xf9\x41\x3d\x1f\xdf\x7e"
+ "\x9d\x4e\xe1\x89\x37\x09\xed\xb4\x80\x4a\xdf\x4f\xc1\x18\x94\xfc"
+ "\x58\x5a\xa7\x2e\x92\x8f\x3b\x29\xc4\x9b\x2c\x4e\x25\x51\x45\x1c"
+ "\x8b\x37\xc9\xc7\x28\xe8\x27\xe6\x24\xcd\xfe\x72\x82\x27\xe6\x24"
+ "\xf0\x01\xf7\x1e\xea\xe8\x05\x97\x13\xee\x31\xa2\x58\x37\x32\xbf"
+ "\xf1\x27\xa5\xa0\x37\xa5\x2c\xfe\x64\x68\xf6\xe6\xc1\x36\x86\x93"
+ "\xc9\xe3\x3d\x67\x78\x8b\xd2\xe2\xa0\xbd\x08\x7e\xce\x03\x4e\x21"
+ "\x6d\xb6\x9d\xfc\xbd\xad\xc7\x37\x03\x7d\x87\x63\x8a\xf0\x3e\x8d"
+ "\x66\xe8\xb7\x8b\xdb\x15\xe1\xff\xd0\x74\x0f\x03\xbb\x3c\x1c\xae"
+ "\x11\x78\x4d\xeb\xd1\x1f\x17\x68\x3d\xf6\x11\x54\x12\xb0\x37\xc6"
+ "\x08\x1a\xef\x72\x45\x2c\x70\x49\x8e\xa2\xef\x89\x7b\xae\xe3\xdd"
+ "\x2e\xdc\xfb\x2f\x8b\x77\x9f\xc3\xf3\x35\x8f\xe2\x5e\xb2\xad\x4b"
+ "\x71\x6f\xe3\x8d\x14\xcf\xa9\x89\x77\x9f\xa5\x3b\xd9\x9e\xcd\x3a"
+ "\xe1\xcc\xcc\x6a\x77\x2a\xad\x02\x39\x28\xb0\xdf\x81\xf1\xb7\x22"
+ "\x25\x4e\x12\x69\x88\xf8\x60\xe6\xf9\x0f\x28\xc6\xde\xc2\x33\xca"
+ "\xb8\x1c\x27\xe8\x4a\xad\x64\x81\x2b\x22\xd3\xea\x6a\xe1\xcf\x09"
+ "\x88\x77\x8f\xa0\xf1\xc6\x87\x28\x7f\xb6\x58\x2a\x3d\x04\x7a\x36"
+ "\x82\x3f\x43\x7b\x3d\x3d\x07\xff\xcb\xe3\xd7\x9f\xa3\x78\xbe\x27"
+ "\xe4\x5d\x15\xef\xe2\xba\xe2\x8d\x5c\xc6\x02\xa3\x04\x7e\xf7\x4f"
+ "\xf8\xdd\x3f\xa1\x3c\xb1\x90\xa7\x1a\x9e\x1f\xa6\x3b\x97\xe2\x1e"
+ "\xa8\x4c\xbe\xef\x03\x75\xb4\x08\xfb\x4a\x2b\xf1\x4c\x4f\x8c\x33"
+ "\xbe\xc0\x65\xc9\xdc\x29\xec\x13\xe5\xcf\x96\x35\x76\x53\xe1\x3b"
+ "\x13\xe3\xd7\x93\x87\x17\xac\xbf\x91\xdf\x6f\x8a\x7b\xa9\xe2\x5d"
+ "\x5a\xf8\x66\x26\xf2\x43\xc1\x9f\xe7\xcd\xef\xa7\x7a\xa8\xbe\xbf"
+ "\xf3\x3d\x71\x9d\xc8\x9a\x31\x44\x8a\xfb\x33\xdc\x25\xef\x24\x62"
+ "\x2c\xb0\x0c\x07\x75\xe2\xb8\xdf\x07\x5d\xf5\x52\x6d\xaa\x0c\xf4"
+ "\xea\x43\xee\x5a\x43\xac\xff\x3d\x75\x79\x63\xc0\xff\xfd\xbc\x83"
+ "\xe6\x45\x27\x51\x73\x7d\x0a\x35\xa9\xa3\x70\xbd\x2a\xcd\xbb\x71"
+ "\x32\x3c\x43\xfa\xcd\x0a\x6a\xb6\xa5\xd0\xbc\x98\x46\xb8\xc3\xf3"
+ "\x8f\xf7\x52\x73\x03\x3c\x4b\x53\xe0\x77\x0e\x9a\x17\x81\xbf\x33"
+ "\xd0\x3c\xd9\x62\xb8\xc3\xf3\xb0\x79\x40\x07\xcf\xc3\x67\xc3\x1d"
+ "\x9e\x47\xcc\x38\x29\xf9\x69\x15\xfc\x06\xd2\x6e\x4b\x63\xdf\xba"
+ "\x3d\x8d\xff\x56\x1e\xf6\xd5\xf0\x1b\xf7\xa4\xb1\x6f\xdc\x97\xc6"
+ "\xbe\x01\xf8\xe2\xbf\x21\x9f\x02\xf4\x4e\x9a\x37\x72\x3f\xd0\x19"
+ "\x69\xde\x35\x31\x70\x87\x67\xc5\x36\xa0\x83\xe7\x48\x19\xdc\xe1"
+ "\x59\x05\x65\x69\x80\x67\x75\x0b\xd0\xbb\x68\xde\xe8\x04\xa0\x4b"
+ "\xa3\x79\xd7\x55\xc3\x1d\x9e\xbf\x17\x07\x74\xf0\x7c\x3d\xe4\x63"
+ "\x83\x67\x8d\x0e\xe8\xe1\x79\x32\x7e\x9f\xd0\xbc\x9f\x62\xbe\x99"
+ "\x34\xef\x61\xa0\xb7\xc1\xf3\x23\x90\x9f\x0d\x9e\x1f\x8b\x06\x3a"
+ "\x78\x9e\x72\x08\xee\xf0\xfc\x38\xd6\x55\x46\xf3\xa6\x69\xe0\xbe"
+ "\x99\xe6\x4d\x87\x74\x1b\x3c\x3f\x69\x80\x3b\x3c\x3f\x85\xf4\xf0"
+ "\x3c\x13\xeb\x0b\xcf\xb3\x20\x9f\x7a\xe0\xf1\x33\x47\xe1\x9e\x4b"
+ "\xf3\xe6\x4c\x00\x3a\x78\x7e\x0e\xcb\x0f\xcf\xcf\x77\x00\x1d\x3c"
+ "\xcf\x03\x5e\x35\xc0\xf3\x7c\xac\xa7\x82\xe6\x2d\xc4\xfc\x4d\x34"
+ "\x6f\x11\xf2\x03\x9e\x97\xd8\xe1\x0e\xcf\x7a\xe0\x47\x03\x3c\xbf"
+ "\x5c\x0e\x77\xbf\xe7\xf3\xd1\xbc\x15\x99\x34\x6b\x38\x94\x39\xf5"
+ "\x00\xcd\x1a\x01\x77\x63\x12\xcd\x1a\xa6\xa3\x79\x1b\xab\x21\x1d"
+ "\xee\xeb\xa7\xc0\xf3\x78\xe1\x19\xee\x1b\xa2\xe1\x39\x56\x78\x86"
+ "\xfb\x86\x0e\x78\x9e\x20\x3c\xc3\x7d\x53\x1a\x3c\x4f\xa4\x79\xe9"
+ "\xb3\xe1\x19\xee\x9b\x5a\xe1\x79\xb2\xf0\x0c\xf7\x4c\x0d\xdc\x5d"
+ "\x8e\xb1\xbb\x2a\x1d\xca\x32\x83\x43\x79\xdc\x8e\x98\x74\xe7\x7f"
+ "\xee\xe0\x22\xeb\x31\x8e\xf0\xf0\x8c\xf3\x64\xc4\x49\xc9\x23\xbf"
+ "\x46\x1b\x69\x4d\xb3\xf3\xe7\xda\x09\xb1\xe9\x86\x37\x4b\xe2\x7e"
+ "\x09\x3e\xc1\x44\x3c\xdf\x1c\xea\x3c\x9e\x66\x0f\x6b\x87\xfb\x5e"
+ "\x9a\x7d\x4d\x33\xd4\x19\x9e\xaf\xfd\x0c\xee\xf0\x7c\x5f\x1e\xd4"
+ "\x19\x9e\xe7\x3e\x0a\xf7\xbd\x9d\x39\x71\x0e\xbb\xe4\xa7\x31\xbc"
+ "\x7e\xff\xcd\x3e\xbb\xca\x95\x01\x3a\x05\x74\xee\xf6\xe6\x52\x95"
+ "\x2b\x91\x50\x73\x63\xa6\x0a\xcf\x9f\x28\xde\xe5\xa4\x91\x65\x7c"
+ "\x99\xf0\x8c\x19\xda\x1d\x23\x65\xdf\xbe\x86\x36\x4b\x1e\x19\x8b"
+ "\x63\x9f\x34\xf2\x83\x40\xef\x1f\xe2\xdf\xdf\xd0\x5c\xc1\xde\xcb"
+ "\x89\xf7\xfd\x5c\x7c\xff\xa2\x0a\xc7\xab\xc7\xbd\xc5\xbf\xb7\x76"
+ "\xb4\x0a\xf5\x8a\xc0\x77\xeb\x91\xd6\x2e\x79\x84\x9d\x43\x26\x89"
+ "\x2b\xa5\xd9\x11\xe4\x9c\x42\x0d\xbe\xe9\x23\x7b\xed\x92\x87\x5a"
+ "\x84\xb1\xc4\x0e\xaa\x90\x3b\x59\x1c\x82\xeb\x02\xc5\x48\x91\x73"
+ "\x26\x7b\xbd\x39\x9b\xd6\x61\x9f\x14\xec\x88\x54\x9b\x1e\x53\xd9"
+ "\x2c\x79\xcc\x58\xcc\x8f\x35\x34\x1b\x71\xaf\x50\xb3\xe4\xd1\x87"
+ "\xba\xf3\xd5\x13\xb5\x1b\x54\xf0\xfd\xc7\xd6\x67\x38\xe9\x79\x4b"
+ "\xfa\xa3\x60\xef\xf8\xf4\x14\xb6\xfe\x9c\xff\x3f\x91\xad\x19\xe2"
+ "\xff\x9f\xc1\xc6\x4d\x1f\x33\xe2\x6f\xc5\x7d\x00\x77\x4e\x52\x12"
+ "\x17\xd9\x9c\xc9\xe6\xbc\x1e\x7d\xe4\x20\x67\x97\xaa\x52\xc8\x30"
+ "\xed\x86\x0f\x20\xff\x47\x73\x7d\xfb\x8b\x1e\x5a\xfe\xdd\x8a\xbf"
+ "\x01\xed\x0e\x7e\x6c\xe7\xd1\x9e\xf3\x8f\x29\xd4\xe1\x75\xe6\x2b"
+ "\xc5\xa1\x6d\x63\x3e\xdf\x63\x1a\x8c\x91\xe9\x52\x34\x26\xba\x4c"
+ "\x65\x89\x6e\x53\xb3\x91\xe6\x37\x67\x46\xba\x24\x84\xad\xdd\x7f"
+ "\xec\xa9\x3b\x9d\x38\xe6\xf6\x31\xd2\x0e\xe3\x86\xa7\x8e\xbf\xc3"
+ "\x48\xa4\x96\xe4\x06\x7c\x9e\x4a\x73\x36\x1e\xb2\xb6\xd5\x13\x4b"
+ "\x32\x9f\xd7\x14\x9a\xf3\x8b\x14\x6e\x78\x96\xa1\x04\x7d\x55\x23"
+ "\x8e\x15\x7d\x86\x7c\x39\x02\x72\x01\xbe\x3f\x16\xe3\x29\x0b\x9e"
+ "\x15\x60\x06\xde\xa1\x1f\x89\x7b\xad\x17\xb8\xdd\x18\x17\x2a\xd7"
+ "\x0e\x7c\x60\xf2\x7a\x0c\x63\x42\x13\xe1\xbb\x2f\x72\x91\xea\x98"
+ "\xda\x79\x38\xaf\x2a\xc7\x38\x3b\xe7\xf9\xbd\x99\x2e\x3c\xdf\x0f"
+ "\xed\x25\xa3\xf5\x89\x8f\xbc\xc8\xb0\x60\x83\x61\x55\x72\xca\x82"
+ "\xb5\x86\x49\x5a\xe8\xc8\x69\x57\x2d\xd5\xae\x58\xb2\x62\x55\xf2"
+ "\xfa\xde\xfe\xa6\x1c\xca\x75\x00\x70\x52\x85\xe5\x3a\x02\x3e\x2c"
+ "\x1b\x83\x9e\x6a\x42\x59\x6f\x7f\x93\x9d\x27\x01\x34\x76\x3b\x79"
+ "\x97\xef\x97\x70\x85\xcd\x85\xb4\x68\x97\x73\x0b\xee\x31\x5f\x8b"
+ "\x7d\x06\x07\xb1\x92\x76\x28\x1b\x3b\x5b\xb0\x16\xe3\x20\xa4\xa6"
+ "\x51\x4b\x6a\x3b\xb6\x03\x23\x35\x1f\xcf\xa5\xc5\xef\xc4\x5d\x34"
+ "\x97\xd5\x37\x4b\xa6\x1a\x2e\x9a\x8f\x1b\x3d\xe7\xff\xb8\x4d\xc7"
+ "\xeb\x39\x85\xdd\x81\xe7\xff\x74\x53\x0d\xa9\x01\x5e\x76\x99\xd4"
+ "\x6a\xb0\x03\x8a\xe2\x6c\xb0\x63\xd0\xd7\xe0\xe3\x2f\xfc\x66\x9f"
+ "\xc5\x4d\x75\x32\x77\x36\x91\xc3\x3d\x92\x46\x36\x6b\xbb\x15\x8d"
+ "\x06\x7c\x8f\xe7\xfe\xb8\xbb\x75\x24\xfd\x28\xe5\x5e\xd0\x03\x6e"
+ "\xb2\x09\xe5\xcf\x5a\xd5\x9f\x26\x90\x3e\x8a\xcb\x6f\x24\x27\xa7"
+ "\x11\x29\xd2\x82\x9f\x44\xe6\xc1\xff\x69\x0b\x89\x12\xe8\x54\x69"
+ "\x47\x20\xbd\x53\x37\xca\x95\xa1\x93\x77\x65\xe8\x46\x75\x53\x9d"
+ "\xc2\xda\xe2\x24\xdd\xb7\xec\xab\xbb\xdd\x41\x64\xdb\xc1\x9f\x2a"
+ "\xe6\xa0\x0d\x16\xed\xb2\xbb\x37\xea\x86\xbb\x36\xea\x64\xdd\xdd"
+ "\x3a\xb9\x6b\x9d\x4e\xd6\xb5\x4e\x37\xbc\xbb\x53\x27\xb7\x2e\x76"
+ "\x90\x8f\x1d\xbf\x25\xb5\x2d\xad\xfc\x38\x65\xb7\xb2\x79\x7c\xb7"
+ "\xb2\x51\xa1\x68\x21\x51\x77\x18\xc0\xaf\x02\x3f\xf3\x2d\xf0\xa9"
+ "\x01\x13\x0a\xd7\xbb\xfb\x2c\xd4\xdc\x54\x07\xfc\x9d\x33\xf5\x56"
+ "\x7a\xd6\x9d\xf3\xa4\x4e\xfb\x04\xe8\xab\x2c\x59\x34\xa4\x01\x7e"
+ "\x9e\x2b\xa4\x39\x3f\xb7\x43\xff\x5e\x0b\x17\xf4\x97\x79\x39\x80"
+ "\x2f\x37\xbd\x11\x9e\xa3\x91\x96\xd1\xcd\x1a\x6f\xe7\xef\x33\xd2"
+ "\xf8\x33\x51\x73\x1e\xdb\x5c\xcc\xf7\xfb\xa6\xe6\x7a\xfc\xf5\x43"
+ "\x32\xff\xfb\xd8\x81\x66\x6f\x4f\xff\x99\x03\x9d\x63\xfe\xdc\xee"
+ "\x57\x97\xe7\x8f\x70\xe1\x1c\x27\x07\x7c\x3b\x29\x79\x7c\x2c\xc6"
+ "\x9e\xa2\x19\xd3\x84\x3e\xeb\x54\x7e\x1c\x0b\xf7\x7e\xe3\xb8\x06"
+ "\x4b\x7b\x9c\x1f\x3b\xe1\xa4\x71\x18\xeb\xbf\x12\xe3\x7d\xe1\x38"
+ "\x06\xe0\xba\xca\x2e\x79\x1c\xc7\xcd\x86\x41\x7f\xaf\x02\xae\x4a"
+ "\xb8\x2c\xbf\xc2\xf1\x8d\x6c\x32\xd5\x33\xf6\xe3\xbf\xac\x8f\x43"
+ "\xff\xf7\x37\xd5\xde\xfe\xef\xe3\xd0\xff\x9d\x6a\x09\x7d\x7d\xe0"
+ "\xe3\xfa\x7e\xc6\xa1\x65\x18\xb7\x96\xe6\xd7\xab\x0b\xb8\x9e\x38"
+ "\xb7\x60\x1b\x1e\x3f\x08\x7a\x22\x93\x7f\x67\x6a\xcc\x4c\xff\x9a"
+ "\x44\xe0\xbb\x0a\x5c\x0f\x01\xcf\xda\x64\x09\xb5\x76\x38\x49\x01"
+ "\xce\x4b\x44\xef\x72\x56\x5c\x70\x48\xb1\x5d\xd4\x42\x1a\xfc\xf6"
+ "\x58\xc1\x05\x21\xdf\xc2\xe6\xd2\x8c\xd5\x84\x3f\xbb\x04\xcf\x3f"
+ "\xc2\xf6\x52\x90\x0e\x7d\x4b\x3c\xab\x29\x19\x75\xf5\xcf\xae\x85"
+ "\xff\xe5\x48\x47\x15\x8d\x99\x1c\xe4\x01\x6d\xa6\x95\x2a\x1b\xf5"
+ "\x9c\xf9\xb8\x03\x6c\x48\x05\x1d\xfb\x4e\x02\xb7\xbd\x39\xb7\x33"
+ "\xe7\x67\x58\x7f\x3e\x96\x30\xc6\x15\xc2\xb1\x13\x37\xf4\xe1\x6b"
+ "\xcb\x5d\x84\x3e\xea\x22\x87\x53\xce\x43\xff\x43\x1d\xe5\x50\xda"
+ "\xeb\x1d\xca\xa6\x3a\xb7\xb2\x49\x0b\x57\x8c\x21\x19\xe7\x93\xa7"
+ "\x8d\xef\x89\x8f\xf9\x75\xff\xf1\x31\x21\xcf\x18\x4f\x8c\x4c\xf7"
+ "\xba\xd0\xe3\x63\xba\xa5\x27\x74\xc5\xa9\x03\xc7\xc7\x04\x9f\xb5"
+ "\x0e\xfc\x55\x8b\x27\x96\x89\x9b\x5f\x9f\x4e\x14\x6e\x65\x63\x02"
+ "\x1f\x0f\xc5\x68\xe1\x63\x9a\xa0\xef\x8a\xb6\xa6\x33\x67\x9a\xde"
+ "\xe3\x8f\xa2\xfe\x74\x9b\xd5\x5a\xb8\xa2\x21\x3d\xd3\x2e\x99\x5b"
+ "\xe9\xd1\xad\x60\x73\x0b\xdc\xa3\xb6\xd8\x3b\x71\xcf\x41\xb7\xfe"
+ "\x61\xa4\x05\x3e\x5a\xe0\xdb\x11\xee\x6e\xfd\x64\xb8\x1e\x82\xeb"
+ "\xa7\x6e\xf3\xf1\x4c\xb7\xb9\xa9\xc2\x6d\x2e\xdb\x06\x57\x21\x5c"
+ "\x45\x70\x95\xc2\xb5\x1b\x2e\xf0\x73\xca\xf6\xc2\x1d\xdf\xef\x87"
+ "\xab\x12\xae\x03\x70\x59\xe0\x3a\xe4\xde\xde\x5c\xe0\x96\xc8\xa2"
+ "\xe1\x8a\x81\x0b\xca\xd1\xa4\x71\x9b\xed\xad\x6e\x73\x63\x22\xdb"
+ "\x0b\x3a\x3d\xca\x83\x55\xff\x71\x06\x26\xb1\xf3\x18\x86\x9d\xa0"
+ "\x2a\x3c\x2b\x38\xed\x3c\xc6\xc7\xd3\x1f\xd6\x75\x84\x76\x2e\x87"
+ "\x64\xfa\x94\x40\xd8\xc6\xfc\x41\xcf\x74\x87\x98\xdf\xb6\x80\xe3"
+ "\x30\x9a\xe6\x42\x57\xf4\x3b\x71\xae\x6c\x92\x09\xba\x4d\x52\x9b"
+ "\xd8\x42\xe2\x1d\x24\xa3\xba\xa5\x8b\x64\x2c\xa6\x6e\x5e\x0f\xa4"
+ "\xe1\xf9\x2f\xef\xa7\x20\xce\xdd\x34\x41\xdb\x6d\x3a\x9e\xeb\x56"
+ "\xd8\x2b\xa8\xc2\xde\xca\xc7\xdc\x03\x7d\x82\xe7\x9f\xf5\xf4\x6b"
+ "\x11\x77\xd0\xb7\xad\x69\x3b\x4f\x36\x2e\xa6\x5c\x0d\x48\x18\xe3"
+ "\xea\xa9\x24\xe4\x6d\x1e\x7f\x42\xdf\xf6\xc9\x46\x9a\x09\x78\x1a"
+ "\xe9\x06\xbe\x71\xd8\xa7\x05\xec\xed\x4c\x25\xb1\x1e\xfc\x81\x5d"
+ "\x57\x7b\xce\x8c\xa2\xc3\xa7\xeb\xe0\x9d\x0c\xcf\x94\x2a\x82\xbe"
+ "\x6d\x51\x2a\x89\x29\x82\x77\xfc\xf9\x9f\x50\xee\x99\x06\x15\xe5"
+ "\x5e\xd1\x91\x92\x97\x89\x5c\x79\x9a\x9d\x29\xeb\x06\xde\x7b\xcf"
+ "\x55\x28\xab\x7f\xea\xb4\x96\x1c\xd6\x7d\x01\xf6\xb9\x02\xe4\x52"
+ "\x56\xdf\x0d\x36\x0c\x78\xe9\x0e\x8d\x97\x4f\xd8\x2f\x15\x2f\xbb"
+ "\xa3\x77\xd9\x19\x3f\x13\x09\xf2\xac\x37\x3f\x91\xc7\x1b\x5a\x80"
+ "\x9f\xc0\x57\xeb\x51\x37\xf4\x4f\xc9\x42\x0f\x3f\x77\x00\x3f\x81"
+ "\xa7\x1a\xe4\x29\xf0\x83\xe7\x29\x15\x78\x5a\x22\xe2\x29\xe8\x2f"
+ "\x3e\x3e\x21\xf2\x94\x03\x9e\x96\x04\xe0\x69\xcf\x18\x01\xf0\x74"
+ "\x67\x50\x3c\x2d\x1f\x04\x4f\x67\x4c\x08\xc4\x53\x17\xfa\x0e\xf9"
+ "\x65\x75\x14\x74\xa3\xd5\xf5\x31\x1f\x6b\x93\x9a\x9a\x62\x38\x53"
+ "\x93\x96\x53\x1c\xaf\xc7\x33\xc2\x71\xbe\x1f\xcf\x30\xe3\x63\x43"
+ "\x95\xd3\x8b\xee\xfc\xe6\x58\x4c\x03\xdd\xa6\xbf\x13\xd7\x18\x19"
+ "\xec\x60\xbf\x68\x65\xed\x05\x1c\x5f\x8b\x5f\xd1\x85\xbe\x77\x7e"
+ "\xf3\x2a\x8e\xea\x09\xea\x95\xf9\xb7\x12\x59\x17\xe8\x0e\x43\x2a"
+ "\xb9\xb1\x00\xf4\x61\x97\xb9\x29\xe6\x94\xe4\x29\xf9\x54\x03\x47"
+ "\xe1\xca\xc0\x98\x91\x1c\xe8\x5d\xd0\xe7\xbc\x7c\x51\x66\x38\x6f"
+ "\x58\x33\x1f\xf7\xb0\x3c\x75\xf1\x93\x44\x17\xc9\xd0\xf7\x95\x2f"
+ "\x97\x91\xa0\x75\x9b\x06\x6e\x27\x78\x8e\x62\x5a\x2b\xca\xb5\x82"
+ "\x58\x5b\xbc\xed\x84\x13\xf4\x34\xca\x02\xdb\x05\xb6\x91\xad\x22"
+ "\xfd\x0c\xba\x5f\x5d\x2c\x9c\x2b\xe2\xce\x06\xfd\x8c\x31\xe4\x41"
+ "\x96\x78\xde\x88\xdf\xf6\xb1\x11\xda\xc7\x06\xfe\xcc\x27\x0d\xf0"
+ "\xa3\xa2\xab\x93\xc9\x10\x65\x66\x75\x55\xf1\xf2\x2b\x10\xec\x01"
+ "\xe3\xbb\xfd\xdf\x94\x26\x80\x4f\x17\xa7\xe7\xf2\x9b\xb5\xb4\x53"
+ "\x3f\x0a\xcf\xfd\xda\x79\x06\xf0\xb4\x18\x7c\xa8\xb3\x60\x2f\x56"
+ "\x02\xbe\xce\x90\x98\x9d\x2b\xc1\x2f\xea\xc4\xb3\xdb\xa0\x3c\xeb"
+ "\xd9\x99\xb7\x5c\xce\x74\x13\xbc\xe3\x63\x60\x72\x9e\x18\x98\xe7"
+ "\x74\x38\xb6\xe1\x1d\x73\x5a\xa5\x93\x7a\xbf\x79\x3d\x71\x2b\xe2"
+ "\xf4\x6c\xcf\xea\xcc\x0f\xf9\xb1\x60\xb9\x13\xfb\x0b\xa4\x4d\x32"
+ "\x93\xdf\x2b\x48\x73\xdd\x9b\x0d\xe9\xb8\x96\x68\xe6\x1e\x9a\x3f"
+ "\xcc\x68\xc0\xf3\xbb\x3d\xef\x32\x12\x90\x0f\xda\x3b\x32\x09\xd8"
+ "\x80\xb8\x5c\x3c\xd7\x1d\xe3\x89\x85\x86\xc5\x99\x16\xcc\xcb\x6d"
+ "\xba\x1e\x6d\x7d\x1c\x97\x7f\xbd\x02\x74\x4a\x2c\x7d\x05\xea\xfa"
+ "\x32\xd4\xf5\x14\xf0\xf5\x14\xd4\x75\x9d\x50\x57\xe1\x3c\x3b\x0e"
+ "\xf8\x0f\xef\xfc\xdb\x47\x4f\x5d\x5f\x01\x7e\xe7\x9e\x9f\xb5\xe9"
+ "\x34\xb9\x8e\x82\x4f\x5e\xd3\xc6\xef\x17\xea\xb4\xba\xbe\x20\xf8"
+ "\x5d\xde\x7e\x9b\xca\xca\xe7\x00\x1e\x91\xe7\xe0\x6b\x43\x5f\xb2"
+ "\x91\x78\xe4\x80\xe5\xa1\xdd\xfa\x51\x25\x2b\xa1\x3c\xc8\xfb\x33"
+ "\x64\x3c\xb6\x67\xe0\x7d\x4c\x09\xf2\xdf\xf7\x4c\xe9\x28\x5e\x06"
+ "\xc3\x41\x06\x2b\x05\x19\x98\x05\x19\x80\xcf\x0c\xb6\x18\xc7\x7a"
+ "\x34\x25\xd9\x4c\x06\xa1\xf1\x28\xbe\x65\x88\xdb\xeb\x84\xc0\xed"
+ "\xf5\xe7\x37\x75\xb1\xbe\xb4\x04\x63\x71\x42\x3f\x61\x0d\xd7\x0d"
+ "\xed\x36\x5f\x68\xb7\x54\xff\x53\x4f\x9b\x3d\x29\x99\x75\x30\xb8"
+ "\x36\xfb\xf4\x7b\xdf\xd1\x36\x1b\x75\x69\xdb\xec\x33\x6b\x7d\xdb"
+ "\xec\x33\xe5\xbe\x6d\xf6\x99\x17\xbd\x6d\x56\x78\x37\x24\x6d\xf6"
+ "\x99\x94\x6f\xa6\xcd\x3e\x93\xe2\xa7\xcd\x46\x05\xd1\x66\x35\x01"
+ "\xda\xac\xe6\xd2\xb5\xd9\x9f\x17\x5e\x3e\x1b\xfb\xac\xad\x4b\xea"
+ "\xc7\xc6\x6e\x14\xd9\x58\x25\xda\xd8\xd9\x49\xfe\xda\x6b\x77\x11"
+ "\xb4\x57\x85\xd0\x5e\x5f\xf8\x2b\xe4\x37\x67\xc9\xc7\x8d\x03\xb7"
+ "\x57\x57\x91\xd7\x7f\x0a\xd8\x66\xf5\xd8\x66\xcb\x89\xd5\xce\xb7"
+ "\xd9\x85\x9e\x36\x5b\x24\xf4\x87\xfa\x69\xb7\x51\x81\xda\x2d\x9e"
+ "\xf1\x85\xe7\x7b\xf5\xdb\x6e\x05\x7f\xa9\x7b\x2c\xb6\x5b\xcb\x15"
+ "\x66\x6b\x9f\xbd\xdd\xb7\xdd\x3e\x9b\xe8\xdb\x6e\x9f\xfd\x9e\xb7"
+ "\xdd\x0a\xef\x86\xa4\xdd\x3e\x3b\xfe\x9b\x69\xb7\xcf\x8e\xff\xf6"
+ "\xd8\xda\xe7\x02\x9e\xff\x37\xf4\xb6\xf6\x85\x5f\xf3\xed\x36\x90"
+ "\xad\xcd\x10\x6c\xad\x12\x6d\x6d\xc2\xad\xc1\xb5\xdd\xe7\x6f\xfa"
+ "\x8e\xb7\xdd\x4b\x6c\x73\x9f\xff\xca\xb7\xed\xbe\x10\xed\xdb\x76"
+ "\x9f\xff\xd4\xdb\x76\x85\x77\x43\xd2\x76\x9f\x6f\xfd\x66\xda\xee"
+ "\xf3\xad\xdf\x1e\x9b\x3b\x57\x11\xa8\xed\x6a\xc7\x91\xcc\x66\xc9"
+ "\xdc\x25\xd6\x22\x7e\x6d\x60\xa6\xd5\x35\x89\xb0\x35\x2c\x73\xcd"
+ "\x56\xcd\x44\xc2\xe5\xab\x73\xf1\xac\x09\x5c\x4b\xf3\x2b\xd1\x5a"
+ "\x15\xb6\xb6\x62\xee\x7b\x9e\xb5\x36\x3b\x85\xf3\x28\xfa\x5b\x6b"
+ "\x43\x4d\xea\x68\xe1\x77\xad\x6c\x7d\x8d\x5a\xeb\x79\x66\xb1\xb0"
+ "\xe6\xb6\x51\xb3\x5a\xe3\x50\xaa\x03\x9d\xbb\x2d\x8f\xcc\xa2\x14"
+ "\xcf\x71\x3a\x37\x6e\x9f\xe1\x5c\x1e\x21\x05\xfc\x5c\xcc\xbc\x18"
+ "\xf8\xed\x0c\xb6\xc6\xe2\xb9\x59\xe7\xb2\x67\x11\x48\x9b\xe8\x49"
+ "\xe3\xcf\xd5\xce\x8e\xa0\x1c\xbc\x03\x1d\x32\x79\x67\x3a\x91\x63"
+ "\x7c\xd1\x3b\x2e\x20\x16\xe7\x4d\x03\x1d\x11\x85\x67\x41\xe1\xf9"
+ "\x1b\xf4\xfb\x3f\xe8\x28\x69\x27\xb2\xda\xcd\xfc\xf8\x33\xae\xd1"
+ "\x29\xcd\x47\xfc\x47\xdc\x56\x48\xa5\x32\xc2\x15\xbf\x33\x8d\x2a"
+ "\x9b\x74\xfc\x9a\x60\xc0\x8a\x67\xdd\x0e\x9e\xa3\xc6\x8d\xdd\xd5"
+ "\xea\x89\x6f\x49\xa1\x7c\x7f\x4b\x77\x48\xf1\xfc\xf3\x92\x64\xa2"
+ "\x86\x4b\x41\xcd\x4d\x3a\x28\x57\x9d\x67\x3c\x31\xe0\xfa\x6e\x3c"
+ "\x1b\xf8\x07\x1a\x99\xb0\x46\x08\xf7\xe9\xf2\x3e\xd3\x56\x29\x97"
+ "\xeb\x86\x74\x9a\x9d\xc1\x9f\xc7\xa5\x02\x5e\xe0\x9a\x5c\x3c\x27"
+ "\x89\x2b\xd9\x67\x78\xf5\x06\x42\xde\xdf\xd0\x2a\xc5\xf5\x20\xee"
+ "\xff\xfa\x41\x87\x25\xfd\x6e\x8c\x63\xc1\xc7\x40\x3f\x29\x79\xb1"
+ "\x26\xfe\x2b\x76\x0e\x30\xfc\x6f\xc3\x39\x98\xa7\xe0\x19\xd7\x07"
+ "\x70\xe7\x34\x32\xa4\x85\xf4\xd7\x2c\xa9\x0d\x44\x65\x20\xf2\x7c"
+ "\xa8\x9b\x40\x3b\xbb\x83\x8f\x5d\xf3\x22\xbf\xee\x16\x9e\xf5\x38"
+ "\x6f\x00\xbf\x93\xe3\x3a\x28\x5a\xf4\xce\x34\x5e\x3f\x98\x9a\x74"
+ "\xdc\xd8\x77\x84\x3d\x53\x4d\xba\xad\x50\x67\xa0\x51\xe0\x9a\x1f"
+ "\xfe\x9e\x4e\xd4\xdb\x92\x31\x5e\xea\x8b\xf5\x70\x57\x58\x56\xe2"
+ "\x7a\x95\x17\xa7\x60\xde\x81\xf7\x0d\x34\xe9\x68\xb6\x8c\xb0\xbd"
+ "\x3f\x92\x4f\x9b\x25\xf3\x8d\x2a\x09\xa5\xb4\x68\x57\xeb\xab\x38"
+ "\xce\x8d\x6b\xb5\xf9\xf5\xe7\xf3\x9f\x86\xfc\x65\x3b\xf9\x71\xdc"
+ "\xf9\xb1\x76\xc9\xbc\xc6\x9e\x75\xfe\xfc\x9c\xd3\x7c\x5c\x57\x25"
+ "\xc1\xdf\x08\xf4\x5a\x86\xbf\x26\x9d\x36\x3d\x82\xc2\xf3\x6a\xb6"
+ "\x9e\x5b\xbe\x14\x7e\x6f\xf0\xae\x63\xe3\x7f\x07\x58\x9a\xbf\x19"
+ "\x64\xc6\xaf\xb9\xc1\xe7\x80\x6b\xa5\x05\xb9\xd5\x68\x00\x1b\xbd"
+ "\x65\xe7\xc1\x08\xe0\xc2\x83\x11\x2c\xef\xef\xd3\xed\x52\x36\xc7"
+ "\xb1\x80\x5f\xb7\x96\x0f\x32\x74\xef\xd0\xc8\xf8\x38\xe2\xdd\x28"
+ "\x17\x5c\x73\xbf\xe0\x08\xca\x65\x2b\xd8\x02\x46\x3b\xbf\xcd\x5b"
+ "\x7e\xfe\xb7\xbc\x3c\x39\x90\x05\x5b\xfb\xbf\xa0\x98\x3f\x93\x06"
+ "\x74\x06\xae\x3b\x3f\x64\x84\x72\x21\x6e\x01\x23\xef\x27\x3b\xa5"
+ "\x25\xa9\x2c\xfd\x6f\xed\x4e\x29\xae\x25\xc1\xf1\x70\xf3\xcb\x44"
+ "\x86\xe3\xea\x98\x27\x8d\xde\xd5\x7a\xa7\x47\x8e\x1b\x40\x76\xa9"
+ "\x80\x5d\xe0\xf9\x56\xe0\x5f\x49\x17\x3f\x67\xd5\x5a\xc2\x11\x05"
+ "\x07\x74\x76\xc9\x82\x7a\xc8\x4f\x5d\x7c\x3d\x75\xe0\x5a\x6f\xe0"
+ "\xe1\x86\xce\x9c\x05\x3d\xfb\x1f\xb0\x4c\xb8\x56\xdb\xcc\xaf\xd9"
+ "\x5f\x10\xcb\x30\xb4\x80\x78\xea\x1c\x88\x9f\xe6\xf7\x49\xb4\xf9"
+ "\x0e\x32\x91\x53\x4c\xd2\xd3\x88\x1f\x94\xe2\x78\xf3\x4c\xa8\x35"
+ "\xc6\xcd\x8f\x7f\xed\x04\xb5\x3a\xdc\x84\x53\x4e\xd2\xe3\xfc\x84"
+ "\xfb\xd5\xdb\x46\xc7\xaf\xc7\x3d\x16\xc7\x73\x33\x9c\x44\x6d\x4d"
+ "\x77\xb0\xb3\xd3\xc8\xd7\xc4\xbd\x06\x74\x38\xe8\x75\xb0\xa9\xb2"
+ "\x8c\xaf\xc9\x18\xe4\x17\xa7\x3c\x9e\x7b\x52\x92\xb8\x65\x4e\x0a"
+ "\xc9\x0c\x4d\x8f\x26\xf2\xe7\x14\xa1\x7f\x01\x3a\x5f\x8a\x6b\xf4"
+ "\xac\x0e\xf0\x4f\xcc\xc7\x43\x8c\xf7\x91\xd8\x67\xbd\xb5\xb8\xde"
+ "\x1c\x8e\x43\x0b\x75\x8e\xc7\x3a\x77\x38\x09\x8e\xe5\xcf\x5c\x8d"
+ "\xf1\x49\xcf\x13\xce\x3c\x49\x8f\x75\x06\x5f\x47\x1e\xfa\x98\xfe"
+ "\x42\x4d\x7f\xdf\xa6\xc0\x6f\xee\xd5\x1f\x94\x72\x8a\x26\x39\x7e"
+ "\x1b\xcb\x80\x7b\x76\x66\x9e\x27\x3c\xdf\x91\xff\x56\xa7\x9b\x50"
+ "\xa5\xb8\x0c\xae\x50\xcb\x10\xb8\xfe\x77\x90\x68\xd3\xfb\x4c\xee"
+ "\xee\x57\x05\x1e\xe8\x71\x9e\xac\x49\x8e\x71\xf3\x67\x62\x19\x1c"
+ "\xa7\xc9\x53\xa7\x09\x2f\x7f\xab\xae\x8d\xb8\x23\x6e\x1b\x8d\x6b"
+ "\x2f\x50\xfe\xe9\x2e\x90\xff\x05\x27\xc6\x14\x71\x58\x33\x2f\x12"
+ "\xf4\x5f\x5c\xe7\x74\xd2\xbe\xf2\x7f\x69\xcb\x1c\x63\xa8\xf2\x7f"
+ "\x69\x88\xe4\xff\xd2\x15\x50\xff\x45\x61\xd4\x7f\xd1\x10\xd5\x7f"
+ "\xd1\x15\x50\xff\xc5\x61\xd4\x7f\xf1\x10\xd5\x7f\x71\xc0\xfa\x3f"
+ "\x36\x86\xa3\xfc\x9a\x9c\xc8\xcf\x1d\x68\x03\x98\xbd\x5a\x92\x85"
+ "\xeb\x6f\xf8\x3d\x5a\xc2\x33\x61\x7b\xb6\xe4\xbd\x9e\x15\xbd\x9e"
+ "\xd5\xbd\x9e\xa3\x7a\x3d\x6b\x7a\x3d\x47\x7b\x9e\xc1\x8e\x0c\x3b"
+ "\x23\x59\xfc\x35\xf8\xa5\x99\x76\xc9\x12\x93\xf0\x3e\x06\x63\xee"
+ "\x80\x4d\x8f\x09\x74\x7e\x9f\x52\x42\x68\xb7\x94\x12\xfe\x5c\x3d"
+ "\xc9\x52\xd2\x95\x4d\x28\x8d\xb8\x41\x87\x67\x9f\x71\xa6\xb2\xfd"
+ "\x33\x41\x4f\x5b\x1d\x4e\xf0\xf3\x35\xc3\x21\xef\xef\xe3\x99\x8e"
+ "\x28\x57\x6d\x32\xae\xaf\x59\x72\x1a\xeb\x79\x87\xc1\x42\xb8\x88"
+ "\xdb\xf8\xf5\x0d\x9c\xb9\x6c\xbf\x23\xe2\xb6\x1b\xe8\xf6\xe6\x02"
+ "\x73\x36\x27\xb7\xb6\x1d\x25\xf9\x52\x4e\x9b\x96\x06\xf2\x6d\xdb"
+ "\x4f\x36\xb6\xd1\xd6\x34\x17\x75\x5a\xe7\x59\x48\x86\x03\xcf\x44"
+ "\xa9\x22\xb5\x8e\xa3\xfc\xb9\x28\xfc\xf9\x2f\x8e\xfd\x04\xfd\x9f"
+ "\x0c\xa4\x81\xb4\x5a\xc7\x5e\x52\x03\xcf\x96\x95\xff\x82\x7a\x2e"
+ "\x2d\xb6\xb6\xed\x85\xfe\x52\x59\x05\xa7\x28\xdb\x46\x15\x65\x85"
+ "\x35\x6d\x78\x9e\x4a\x59\x11\x96\xb5\x16\xca\x61\x75\x55\x62\x3f"
+ "\xab\x88\xcf\xb7\xa3\x8e\xef\x93\xe2\xbc\x2d\xa7\x04\x7a\x65\x59"
+ "\x21\x96\x0f\xcb\xe6\xdf\xdf\xad\x8f\x81\xb2\x4f\x9a\xa3\x93\x11"
+ "\xdc\x57\x11\x1a\x46\x96\x5a\x02\xfb\xd1\xf5\xbb\x59\xbe\xf2\x30"
+ "\xf2\x5d\x16\x50\xff\x53\x93\x4d\x28\xaf\x3a\x9c\x7c\xfb\xac\x49"
+ "\x17\xe5\x2b\x94\x57\x1b\x4e\xbe\x55\x81\xf3\x6d\x10\xca\x1b\x17"
+ "\x46\xbe\x7a\x6d\x3f\xf9\x0a\xe5\xcd\x0c\x27\xdf\x80\xfb\x8b\x11"
+ "\x0f\xe1\x61\x41\x5f\xdd\x1f\x16\xc2\xc3\xc1\xf2\x7e\xea\x6f\x8b"
+ "\x09\x0f\x03\xcb\x53\xfa\xc3\x40\x78\xf2\x5f\xde\xaf\xfc\xc3\x93"
+ "\xfd\xcb\x7d\xce\x7c\x17\xcb\x3e\x3c\xb9\xbf\x1c\x10\xff\xd8\x37"
+ "\xa0\xa6\xcf\xed\x34\xb2\x39\x93\xcb\x2f\xb3\x73\x91\x9f\x37\xbf"
+ "\xca\xc5\x91\xc7\x36\x11\xa2\x2a\x24\xd7\x3e\x56\x7c\x82\xc6\xf1"
+ "\x7d\xee\x57\xe4\x9b\x8a\x88\x14\xfa\xd0\xd2\xf7\x36\xd4\x4b\xad"
+ "\xae\x89\xa8\xb7\xdc\xbb\x53\x9d\x92\x1f\x42\xfa\x87\x60\x07\x3b"
+ "\xc0\x97\x65\x79\x95\xd9\xf3\xd3\xe3\x08\xbf\xe7\x0e\xfa\x11\x33"
+ "\x57\x9f\xa0\xb8\x97\x39\xfe\x6b\xd0\xaf\x85\x18\xff\x90\x5c\x0b"
+ "\xbf\x75\x01\x8e\x21\x1f\x27\xf9\x3d\xe7\x90\xcc\x74\xf0\xb4\x0e"
+ "\xb6\xe6\xfd\xf3\x66\xec\x2b\xd0\x0c\x1d\xc6\x32\x73\xc0\xb7\xd7"
+ "\x47\x38\x88\xb4\x84\x3f\x8f\xe7\x95\x14\xbb\x24\x69\xb1\xb0\x6f"
+ "\xb5\x8d\x8f\xb9\x07\x65\xc7\x98\x7b\xaf\x42\xbf\x01\xe9\xef\x30"
+ "\x10\xe9\x47\x7c\x8c\xe2\x57\x4a\x31\x0e\x5f\x7f\xfb\xbf\xdd\x26"
+ "\xfb\x21\xfc\x3d\x35\x81\x7d\x3e\x4d\xa4\xb5\x1d\x0e\x42\xa3\xdf"
+ "\x89\xcb\x87\xfe\xc9\xd4\x5b\x71\x3c\xa5\x9d\xa4\x6f\xa2\x1c\x8e"
+ "\x6d\x51\xc5\x71\x23\xae\x3f\x64\x31\xe2\x93\x26\x63\x5f\x5f\x38"
+ "\x87\xe9\x86\x53\xf0\xcc\xf7\x91\x70\x1d\x8e\xa2\x4c\x4f\xf3\x95"
+ "\x71\xb5\x1d\xed\x84\xc5\x39\x4f\x7a\x08\xe3\xa1\x9d\x53\xd8\x2d"
+ "\x1d\x0a\x7b\x55\x67\x4e\xd2\x44\x4f\x1d\xf0\xfb\x9e\x74\xec\x13"
+ "\x22\x1d\xbc\x4f\xf0\xec\x07\x0f\x70\x56\xf1\xe8\x78\x0d\x75\x20"
+ "\x7f\x59\x59\x56\x1c\x44\x19\x50\x93\xbd\xb2\x23\x43\x37\x8e\x8d"
+ "\x91\x24\xb5\x60\x5f\x1b\xca\xbd\x9b\xf5\x7b\xcb\x76\xf3\x7b\xff"
+ "\xc1\x1e\xcc\xd1\x49\x43\xf4\x89\x93\xf8\xbd\xb0\x96\x71\x68\x7f"
+ "\x57\xbc\x0b\xf9\x3f\xd8\x2c\x59\x21\x9c\x83\x5b\x56\xc9\xf6\x74"
+ "\x26\xed\x86\x6f\x54\xc2\x73\x22\xd2\xc1\x7b\x9d\xf0\xde\x22\x7a"
+ "\x6f\xc1\xf5\xa8\xc2\xfb\x69\xc2\xfb\x43\xa2\xf7\x87\x0c\xe3\x70"
+ "\xdc\x63\x85\x01\xeb\x00\x7c\x2c\x85\xf7\xfb\xf9\xb8\x09\xfc\x19"
+ "\x91\x65\xa5\x02\xdd\xfe\x36\xc9\x8a\x2d\xe7\x00\x63\xf0\xfe\x80"
+ "\xe8\xf7\x07\x3e\x32\xc6\x92\xc7\x8a\x91\x87\x2b\x8a\xec\xd2\xe3"
+ "\x42\xcc\xe9\xa4\x72\xbe\xee\x60\x43\xc5\xf9\xd9\x25\x2b\xf4\x68"
+ "\x27\x3b\xc0\x47\x03\x9a\x02\xfc\xa6\x98\xdf\x9e\x9d\xa5\xda\xc5"
+ "\x2b\x16\x6a\x17\xad\x5a\xbb\x12\x77\x06\xfa\xee\x79\x53\xe3\xde"
+ "\x59\xce\xd4\x58\x6e\x2d\xc4\xbd\x7c\x6a\x7e\xdf\xf8\x36\x5c\xa3"
+ "\x15\xd9\x64\x77\xe7\x37\x19\xb8\xc8\xe3\x05\x96\x0d\x8f\x92\x33"
+ "\x92\x95\xfc\xfc\x81\x15\x34\x9b\x09\xde\x5b\x36\x7c\x8c\x69\x7c"
+ "\x1c\x66\x3c\x2b\x86\x1f\x0f\xd8\x20\x27\x87\xb4\xed\xfc\x98\x02"
+ "\xbc\x5b\xcf\x8f\x9f\x9c\x27\x52\x57\xb6\x9c\xec\x4b\xaf\x93\x1e"
+ "\xe0\xec\xd2\x7d\x5c\x3d\xbf\x16\xfa\x23\x4d\x15\xb9\xd3\x28\xc7"
+ "\x33\xe6\xa4\x1f\x40\x3f\x1d\xdf\xe3\x3b\xcf\xde\x22\xf8\xfd\x11"
+ "\x7e\x5d\xf4\xcd\xec\xff\x8c\x42\xda\xf4\x91\xc6\x21\xec\x29\x5f"
+ "\x39\x16\xcb\x8a\xeb\x1c\xdb\x24\x2b\x6f\xc2\xf2\xd9\x25\x2b\xb5"
+ "\x11\x45\xfc\xfa\x70\xc5\x19\xc9\x2a\x25\x67\x6e\x2c\x47\xdd\xe0"
+ "\xca\x59\x71\x94\x66\x2b\x7e\x8b\xfb\x0a\x8b\xde\xf0\xec\xa1\x5d"
+ "\xe9\x14\xed\xb3\x53\x9c\x93\x92\x87\x3b\x73\x56\x29\x3c\x31\x33"
+ "\xf0\xec\xa2\x40\xba\xc6\x09\xfe\xe3\xc5\xe8\x5d\x55\x9c\xa2\x11"
+ "\x64\xd1\x58\x5e\x35\x85\xe0\x98\x8e\x04\xd7\x25\xb7\x49\x56\xcb"
+ "\xa8\xb2\xb1\x30\x1d\xdb\x74\xfe\xf1\x82\xdf\xf2\x31\x98\x9a\xec"
+ "\x7b\x71\x8d\x21\xf0\x72\x0f\x3c\x7f\x3c\xad\x9c\x68\x9f\x41\x7f"
+ "\x6c\xd5\xa6\x27\x17\x53\xd7\x6d\xb3\x2c\xa4\xba\xe5\x8f\xe4\x93"
+ "\xa3\x55\x44\x31\x8f\x44\x64\xd8\xa9\x9b\xaf\x63\x0a\x91\xc6\xdb"
+ "\x49\x04\xc6\x73\xc2\x18\xee\xb8\x47\xa3\xd6\x59\x03\x3e\xd2\xfb"
+ "\x29\xef\xa5\xb7\x0e\xd3\xce\x24\xe0\x5b\xb1\xf9\x6b\x7e\x0f\x92"
+ "\x83\xdf\x17\xae\xc4\xb1\x74\xd1\xde\xa3\x6d\x69\x89\x94\xdb\x74"
+ "\x9a\xc8\x6b\xf4\x5f\x90\xf8\xc4\x08\xca\xef\x3d\x32\x02\xa1\x03"
+ "\x64\xbf\x8e\xad\x13\xdc\x7e\x81\x44\xd5\xa6\xd8\x89\xb5\xad\x8a"
+ "\xec\x48\x26\x51\xb4\x53\x3f\xb2\xba\xea\x63\x42\xf3\x27\x27\xfe"
+ "\x3e\xdd\x32\xcc\xad\x60\x6b\xb7\x54\x59\x12\x1c\x3b\x8d\x34\xe1"
+ "\x1a\xae\x0b\x24\x76\xc1\xbf\x32\xf9\xf1\x5e\x1c\x5b\x77\x75\xea"
+ "\xb4\xdd\x9d\xba\x9b\xbb\xd6\xe9\xc6\x79\xc6\xe4\x5f\x3c\xad\xc6"
+ "\x39\x88\x04\x9a\xb3\x30\x11\xf7\x2d\xa1\x2f\xea\x52\xc6\xe9\x71"
+ "\xfc\x9d\x8f\x4f\xb3\x4e\x17\xcd\x2d\xd2\x91\x3b\x1d\xfc\xbe\x28"
+ "\x9c\x13\x50\x97\xbc\x84\x65\x6d\x27\xfc\x3a\x24\x25\x5b\x87\xe4"
+ "\xc4\xf9\x70\x45\x93\xe6\x29\x30\xab\x5d\x63\x77\x55\x59\x8d\xbf"
+ "\x25\x19\x17\x69\x13\xdf\x47\x30\x02\x6e\x73\x56\xc5\x50\x65\x93"
+ "\xe6\xb0\xee\x18\xda\x96\x89\xa1\xeb\x07\x03\xbf\x96\x15\x79\x03"
+ "\x72\xb2\xef\x6d\x47\xb9\x1d\x2f\xf8\x5d\xb2\x43\xfa\x44\x0b\x75"
+ "\xd5\x2c\xfe\x2d\xf9\xa4\xbe\xce\x47\x3e\xbc\x3c\x81\x0e\xe5\x84"
+ "\x32\x42\x59\x79\xe5\x74\x8c\x97\xd3\x5e\x8e\xc9\xa9\x4b\xf1\xb9"
+ "\xdd\x23\x2b\x67\xd1\xae\xfa\x60\xe4\x55\xdd\xe2\x5f\x5e\xc0\xe7"
+ "\x1e\x79\xbd\xd5\x4e\xa2\xac\x6d\xe0\x37\x83\xbc\x9e\x78\x9a\x90"
+ "\x27\xf6\x50\xae\x66\xda\x67\x3d\x72\x73\x99\x02\xc8\xed\x2b\xaf"
+ "\xdc\x40\xfe\xfd\xc9\xad\x25\x14\xb9\x55\xb7\x30\xb9\xb9\x84\xf5"
+ "\x63\xba\x43\x44\xea\x5c\xa7\x93\x16\x5e\x20\x13\x51\x7e\x33\xfe"
+ "\xa5\x25\x87\x67\xd7\x80\xcc\xfe\xe8\x23\x3f\xce\x6c\xaf\x04\x19"
+ "\x54\xa3\x0c\xc3\x6b\x77\x29\x69\xc1\xb7\xbb\xe4\xf3\x57\xdb\xdd"
+ "\x50\xb5\xbb\xe4\xa2\xc1\xb5\xbb\x94\x69\x57\xdb\xdd\x37\xdd\xee"
+ "\x52\xa6\xf4\x6e\x77\x3d\x7e\x43\xf2\x92\x15\x0b\x97\xaf\x5c\xbe"
+ "\x72\x99\xf6\xa5\xf5\x29\x4b\xd6\x30\xef\xc1\xc7\x7f\xd0\xb8\xd3"
+ "\xe3\xa4\x78\xa6\x7b\x75\x61\x1d\xf9\xfd\x0d\x75\x52\xf7\x97\x1a"
+ "\x19\x35\x3d\x5b\xc1\x99\x9e\x8b\xc5\xf3\xdd\xb1\x7d\xe2\xb9\xef"
+ "\x27\x25\x1b\x1c\x18\xeb\x90\xc5\x89\xd9\xc0\xe2\x69\x44\xbf\x93"
+ "\x80\x73\x41\xaf\x6e\x20\xb2\x57\x71\xdf\xb7\x13\xc7\x5c\xf8\xf7"
+ "\xcf\x63\x5c\x36\x5a\xfc\x4e\x02\xc6\xea\xe9\x50\x94\x25\x6e\x86"
+ "\xbc\x1c\xca\xc6\x72\x99\x16\xf7\xb5\xa4\x42\xb9\x57\xb4\x79\x63"
+ "\x2f\x6d\x88\xa6\xc3\x53\x15\xa8\x17\x70\x1f\xe2\x19\x49\xea\xe9"
+ "\x8b\x38\x8f\x02\xbe\xf4\x9c\x5b\xe1\x3b\x63\x77\xd5\xf3\x71\x25"
+ "\x40\x47\xb0\xf7\xc6\x3d\xf8\xfd\x8b\xa6\xe3\x05\xe8\x6f\x9c\x53"
+ "\x34\xd9\xcf\x99\x9a\x0c\x1f\xa7\x15\x0a\x3a\x62\xdd\x98\x27\x0a"
+ "\x99\x8e\xa8\xd1\x00\x06\x67\x00\x06\x13\x06\xd2\x11\x22\xec\x8d"
+ "\x0b\x4d\x47\x20\xd6\x10\x73\x88\xb7\x6b\x00\x6f\x88\x41\x0f\xe6"
+ "\x7e\x25\x60\x4e\xd5\x48\xd4\x3c\xee\x5c\x0c\x77\xb8\x8f\xbb\xc6"
+ "\xe8\xc5\x9c\xbb\x37\xe6\x2e\xf4\xc2\x9c\x54\xc0\xdc\x3a\x5f\xcc"
+ "\xcd\xfd\x42\x4d\x76\xf0\x98\x4b\xf4\x62\xce\x1c\xa7\xf7\xe0\x0d"
+ "\xb1\x87\x38\xe3\x96\xe9\x48\x4d\x5b\x7b\x0f\xf6\x4a\x96\xb2\xb9"
+ "\x5c\x7e\xad\xb0\x94\x56\x5c\x5c\x27\xe8\x8a\xd3\x1e\x5d\xf1\x56"
+ "\x00\x1b\xfd\x45\x98\xba\xc2\xc8\xe2\xbf\x80\xac\xba\x40\x6e\x28"
+ "\xaf\x27\x34\xa0\x23\x34\xbb\xc8\x27\xb3\xaf\x10\xf9\x24\x0f\x8d"
+ "\x7c\xf0\x4c\x6c\x28\x8b\x1f\x19\x2d\x68\x1b\x48\x46\x28\x1f\x94"
+ "\x13\x2f\x1f\x90\x93\x67\xbe\x1d\xe7\x5f\x51\x56\x28\x9f\x3b\xd2"
+ "\x88\x14\xe5\x55\x92\xca\xf4\x03\xea\x01\x7e\x7d\x77\x2f\xfd\x0e"
+ "\x3c\x37\xa0\xcc\xf8\x3e\x76\xb6\x72\xd9\xb6\xd1\xde\x33\x74\x3a"
+ "\x73\x36\x4c\xee\xeb\x43\x6f\x98\xe5\x8d\x3b\x97\x2a\x9c\x0b\xda"
+ "\x98\xc0\x7c\xf6\x8d\x6f\x0b\x6d\x3e\x0e\xfb\xaa\x7c\xbf\xd4\x0d"
+ "\xfd\x52\x05\xf4\x4b\x4d\xd0\x2f\xc5\x71\x43\x3e\x26\xc3\x86\x62"
+ "\x36\xa7\x07\xfd\x50\xe5\x71\x23\xf4\x89\xf4\xc8\x4b\x7e\xfe\x58"
+ "\x69\xb7\xe0\x7c\x17\x35\x43\x9f\x77\x97\x94\xc0\x73\xd5\x61\x9d"
+ "\x3b\x44\x1c\x6d\x38\x20\xcc\x8f\x6b\x58\xbc\xc2\x8d\x26\x56\xbe"
+ "\x54\x7e\x5d\x23\x3f\xb7\x28\xe5\x4a\xdd\xaf\xfa\xce\x2d\x8a\xe7"
+ "\x9e\x7f\x9f\xee\x10\xe6\x15\x37\xb2\xf8\x5e\xd8\x5f\x02\xbd\xf7"
+ "\x1e\xf4\x61\xbc\x73\x8b\x9f\xe1\xfb\xb5\xbe\x73\x8b\x1b\x85\xb3"
+ "\xbb\x36\x96\xe2\x7a\x1a\x78\x9e\xc7\xd2\x53\x53\xc4\xe9\xde\xb9"
+ "\x7b\x96\x8e\x7b\xb8\x84\xb1\x81\x36\x36\x2e\xb0\xb1\xd2\xd3\xff"
+ "\x0e\xe0\x2f\x85\xa0\x97\x33\x8b\xbc\x7a\x39\x93\x1f\x3b\xa7\x9a"
+ "\xe6\xdc\x9a\x3e\x7a\x19\x63\x7d\x65\x0e\x9b\x89\x7a\xd9\x74\x3c"
+ "\x93\x95\x2f\x6d\x2a\xf0\x24\x02\xcf\xbe\xc3\x74\xdc\xeb\x84\x3a"
+ "\xba\x98\xd7\xd9\xcd\xc6\xcd\xfc\xfa\x81\xb4\xc5\xbe\xba\x3a\xa3"
+ "\xca\x57\x57\xa7\x6d\xef\x5f\x57\xa7\xcf\xe9\x5f\x57\xa7\x1d\xbe"
+ "\xaa\xab\x87\x5a\x57\x7b\xfc\xba\x70\x75\x75\xba\xf6\xaa\xae\xbe"
+ "\xdc\xba\x3a\x3d\x5a\xa4\xab\x67\xfb\xea\xea\x8c\xd6\xbe\xba\x3a"
+ "\xc3\xe5\xd5\xd5\x69\x06\x5f\x5d\x9d\xf5\x54\x70\xba\x3a\x73\xfa"
+ "\xa5\xd5\xd5\x99\x7a\x5f\x5d\x9d\x35\x51\xd0\x3b\xca\xd0\x75\x75"
+ "\xd6\x98\xfe\x75\x75\xd6\x4d\xbe\xba\x3a\xb3\x83\xe9\xe4\xac\x19"
+ "\x4c\x57\x67\x09\xe9\x69\x0a\x71\xba\x57\x57\xb3\xf4\xbe\xba\x3a"
+ "\x6b\xf1\x00\xba\x5a\xe7\xe6\x3c\xba\xba\x1e\x74\x75\xbd\x94\x5b"
+ "\x16\x48\x57\xe7\x94\xd6\xa0\xae\x4e\x46\x5d\x9d\x53\xda\xbf\xae"
+ "\xce\x19\x89\x3a\x99\x8f\xf5\xf9\x26\x6d\xe1\x63\x2d\xbe\x49\x5b"
+ "\x11\xa7\x33\xd3\x20\x1d\xd2\x30\x26\x25\xd2\x31\x1e\x7b\x74\x7a"
+ "\xf6\x98\x1e\x9d\x0e\x74\xdc\x18\xaf\x4e\x47\x7d\x8e\x7a\xbd\xf8"
+ "\x4d\x6a\x2f\x79\x13\xcf\x2f\xc9\x8e\xf3\xe8\x76\x33\xa4\xe1\x19"
+ "\x25\x18\x4f\x09\xd7\x5e\x02\x0f\x5a\x5e\x85\xef\x21\x3d\xd0\xe9"
+ "\x7d\x6d\xc0\x6b\xd5\xbe\x36\x20\xbb\xb8\x7f\x1b\xb0\xf9\xf9\xfe"
+ "\x6d\x40\xf6\x91\xab\x36\xe0\x4a\xb3\x01\x9b\x63\xae\xda\x80\x81"
+ "\x6d\x80\x3f\x19\xf5\xb6\x01\xb7\x0b\x36\xa0\x78\x40\x1b\xb0\x59"
+ "\x1b\xd8\x06\xbc\xd6\xd6\xd7\x06\xe4\x10\xaf\x0d\xc8\x4e\xf1\xb5"
+ "\x01\xbf\x78\x3a\x38\x1b\x90\xf3\xd4\xa5\xb5\x01\x39\x49\xbe\x36"
+ "\xe0\x17\x93\x05\x1b\xf5\x17\xb1\x0d\xe0\x22\x82\xb1\x01\xbf\x18"
+ "\xeb\xb1\x01\xa8\x63\xdf\xc3\xf9\x86\x1e\x1b\x80\xba\xf0\x17\xb7"
+ "\x58\x52\x9b\x45\x36\x20\xc7\xc9\x74\xfd\x2f\x66\xb9\x79\x1b\xf0"
+ "\x0b\x85\x60\x4b\x2a\xc5\xe9\x5e\x1b\xc0\xd2\xdd\x62\x1b\xd0\x8a"
+ "\x36\xe0\x17\xfa\x01\x6c\x40\x6c\xf0\x36\xc0\xe4\xf4\xda\x00\x93"
+ "\xd3\x63\x03\x50\xef\xa3\x0d\x40\x9d\x8d\x76\x80\x8f\x5b\xc6\xaf"
+ "\x37\x31\x2d\x54\x39\x88\x1c\xe3\x14\xe3\x98\x0a\xea\xee\xfc\x76"
+ "\x66\x0b\x78\x9a\x95\x8c\x06\xf4\x79\x0b\xe8\xf0\x56\xd0\xe1\xad"
+ "\xe6\x33\x44\x06\x74\xf5\xf9\xb8\x76\x11\x9e\x51\xd7\xab\xda\xc0"
+ "\x6e\xb8\x78\xbb\x51\x8f\xf6\x86\xf1\xcb\xb4\xd0\xd7\x76\xe4\xce"
+ "\xf1\xd7\x1f\x28\x10\xd9\x8e\x92\xeb\xe9\xd1\xce\x9c\x5c\xa3\xc7"
+ "\x1e\xe4\xc3\x33\xda\x8c\x82\x76\xde\x66\xd8\xc1\x66\xb4\x30\x9b"
+ "\x91\x5b\xd4\x43\x03\x65\xe0\x69\x98\x5d\xa9\x7f\x15\xcf\x7b\x63"
+ "\x34\x16\x5f\xbb\x62\x8a\xf1\xb5\x2b\xb9\xe7\xd1\xae\x40\x1d\xf0"
+ "\x6c\x34\x09\x67\x6e\x2c\x74\x17\xef\xaa\x47\x1b\xc3\xde\xe7\xfd"
+ "\xa1\xc7\xae\x5c\x2f\xb2\x2b\x46\x8f\x5d\xd9\x72\xd3\x15\x6f\x57"
+ "\x00\xcb\x35\x69\xdf\x25\xbb\x92\x97\x76\x25\xd8\x15\x94\xcd\x35"
+ "\xa2\xb1\xe1\x40\x76\x05\x63\x58\xd4\x24\x7d\xdb\xed\x4a\x9e\x31"
+ "\xb0\x5d\x31\x4d\xe9\x6b\x57\x4c\x09\x5e\xbb\x92\x5b\xed\x6b\x57"
+ "\xcc\x7b\x82\xb3\x2b\xa6\x77\x7b\xdb\x15\xe4\x65\x3e\x5b\x63\xd1"
+ "\x86\xf6\xc4\x6d\xb6\x5b\x38\xb4\x2d\x61\xd9\x15\xd3\x21\x5f\xbb"
+ "\x62\xde\x26\xd8\xbd\x83\xa1\xdb\x15\x33\x3f\x76\x94\xef\xb1\x2b"
+ "\x17\x7a\xdb\x15\xf3\x26\x5f\xbb\x62\x9e\xc5\xec\x87\xb9\x9c\xd9"
+ "\x15\xf3\x62\xc1\x3e\x1d\x10\xa7\x7b\xed\x0a\x4b\xef\x6b\x57\xcc"
+ "\x96\x01\xec\x8a\xa2\xbb\x68\x57\x7d\x97\xa9\xc9\xe2\xda\xbd\xcf"
+ "\x30\x7e\xde\x8d\xee\xde\x6d\x83\xb5\x09\x37\x3b\x37\xc8\x33\xc7"
+ "\xf5\x2c\x21\xdd\x8a\xcf\xed\x9c\xb0\x3f\xba\x2b\x7a\x57\xd5\xc9"
+ "\x24\x68\x1f\x6d\x81\xdb\x07\xb4\x0d\xb9\xa7\x6d\xd4\xe8\xff\x45"
+ "\xa0\xbd\x48\x71\x8e\xeb\x2d\x68\x17\xd6\x8e\x7a\x5e\x8f\x29\x5a"
+ "\xb4\x04\x63\x5d\x2a\xdb\x88\x5a\x29\x91\x0c\x7f\x12\xbc\x7a\x37"
+ "\xb4\x91\xa9\xb7\x52\xee\xb6\x46\x2d\x51\xea\x49\x24\xb6\x93\xf7"
+ "\x85\x39\x14\x8c\x6d\x81\x73\x27\x80\xcf\xd8\x05\x9f\xb2\xf6\xf1"
+ "\x16\x5c\x5d\xac\x7d\x8c\xeb\xea\xd4\xdd\x1c\x68\xee\xc4\x6a\xb4"
+ "\xf3\x73\x27\xb8\xf7\x08\xf7\x7c\x71\xd0\x3e\x28\xce\x9d\x38\x59"
+ "\x9b\x80\xf2\xaa\x77\xf2\x73\x27\xcd\x3e\x73\x27\x3f\x69\x24\x52"
+ "\x8c\x7b\xb1\x43\x3c\x77\xa2\xab\xe9\xd3\x26\xb0\xad\x60\x9b\x08"
+ "\x5d\x7f\x6d\x9d\xdc\xdf\x5a\x26\x17\xf0\xda\xad\x68\xb2\xd0\xb7"
+ "\x9a\x2b\x7e\xd7\xec\x94\x60\x8c\x51\x37\xc8\x8e\x03\x3d\x45\x15"
+ "\xbd\xf4\x54\xb7\x20\x87\x6e\x26\x07\x90\xa1\x7c\x7e\x07\xa1\x0b"
+ "\x5c\xe0\x6b\x75\x0b\x71\x46\x9d\x76\xc0\xa1\x6e\x74\xf1\x06\xe4"
+ "\xbb\x86\x14\x0b\xb1\x46\xb9\x8d\xfa\x91\x1c\xf0\x9a\x66\x4b\xc9"
+ "\x7b\x17\x9c\xfc\x5c\xa3\xa9\x8b\x8c\x07\xbd\xa4\x44\xbd\x04\xd8"
+ "\x1d\xb5\xb3\x0b\xf8\xde\xc4\xf8\x8e\x71\xec\xf0\xee\xda\xa8\xd3"
+ "\x42\xde\x37\x77\x77\x83\x5e\x72\x32\xde\xcf\x5f\xad\x26\x7c\x7c"
+ "\x52\x9c\x6f\x04\x5b\x5f\x0b\xf2\x46\xbd\x34\xb3\x43\x45\xf1\x2c"
+ "\x0f\xee\x4b\x1d\xc6\xf4\x8a\xbe\xb3\x03\xcf\x6d\xd1\x21\x36\xd4"
+ "\x25\x27\x71\xbe\xb1\xc1\x67\xbe\xd1\xb1\xd1\x3b\xdf\x58\x5b\x7e"
+ "\x8c\xad\x0f\xf1\xb1\x1d\xe6\xa3\xdd\xc5\xbb\xaa\x90\xef\xbc\xed"
+ "\x48\x09\x95\xf7\x05\x01\x63\xa5\x5f\x7a\xde\xab\xbf\xe5\xbc\xdf"
+ "\xba\x79\x70\xbc\x7f\x23\x60\xfc\x97\x4b\xcf\x7b\xf9\xb7\x9c\xf7"
+ "\xbf\x24\x83\xe3\xfd\xaf\x2a\xfa\xe3\x3d\xf6\x3d\x3c\xfd\x0e\x4f"
+ "\x9f\x03\xed\x18\xb3\xc3\x6f\x4e\xf1\xf6\x37\xde\x9c\xe2\x99\xb7"
+ "\x05\x9e\xc9\xcc\xc2\x78\x93\x61\x29\x9e\x87\xf1\xeb\xbf\x78\xe6"
+ "\x6c\xd1\xdf\xe7\xe5\xf8\x16\xc8\x71\x25\xee\x1d\x12\x64\x08\x36"
+ "\x67\x41\x07\xd8\x85\xb1\xbb\xea\xdd\x66\xb0\x49\xef\xee\x33\x04"
+ "\x90\xa7\x14\xed\x89\x32\x85\xa8\xe7\x1b\xbc\x72\xe5\x36\x82\x3c"
+ "\xbb\xc0\xcf\x72\xb6\x12\xdc\x0f\xac\x6a\x05\xff\xab\x5b\x3f\x72"
+ "\x1e\xf8\xf3\x1e\x99\xbe\x9f\xea\xe4\x7d\x2c\xbf\x32\xdd\xee\x2b"
+ "\xd3\x73\x7e\x64\xfa\xe2\x72\x68\xa7\x52\xc1\x0f\xe6\x65\x6a\xef"
+ "\x91\x29\x6f\x47\x36\xea\xa2\x51\xae\x1e\x99\xa2\x1d\xe1\x65\xda"
+ "\xc6\xec\x48\x4f\xec\xa4\x8d\x5e\x3f\xb8\x3a\xf1\x0b\x3f\x32\x7d"
+ "\x23\xcd\x47\xa6\x89\xa1\xca\xf4\xd7\x9b\x7d\xfd\xaa\x37\xbf\x0e"
+ "\xce\xaf\x7a\x53\x82\xbe\x93\xd8\xaf\xc2\xe7\x73\xd0\x57\x77\x2b"
+ "\xed\x87\x3a\xc2\xf2\xa5\xde\x54\xfb\xfa\x52\x6f\x36\xb2\x32\x6d"
+ "\xbb\x3d\x74\x5f\xea\x4d\xde\xff\x7a\xef\x2d\xd6\x07\xf6\xf5\xa3"
+ "\xde\x3c\xec\xeb\x47\xbd\x59\xc8\xfc\xa5\x37\x1d\xe7\xb2\xd1\x8f"
+ "\x7a\x73\x2f\x4b\xdf\x36\x5e\x9c\xee\xf5\xa3\x58\x3a\x3b\xd3\xfe"
+ "\x4d\x57\x68\xbe\xd3\xf7\xbf\x61\xdf\x49\xd3\x8f\xef\xa4\xf9\x8e"
+ "\xf8\x4e\x85\x01\xd7\xff\x5f\xb5\xdf\x03\xd9\x90\xff\x52\x0f\xce"
+ "\x86\x6c\xef\xb8\x6a\xbf\xc3\xe5\x7d\xa1\x65\x70\xbc\xdf\xd1\xef"
+ "\xfe\x87\xfe\xed\x77\x89\xcc\x6b\xbf\x4b\x64\x81\xed\x77\xf1\xfa"
+ "\xab\xf6\x3b\x14\xfb\xfd\xd6\xe4\xc1\xd9\xef\xe2\x29\xbe\xf6\xbb"
+ "\xe4\x0f\xc1\xd9\xef\xe2\x0f\x87\xde\x7e\x17\xd7\xf9\xda\xef\x92"
+ "\x22\x56\xa6\x1d\xa7\x43\xb7\xdf\x25\x9b\x02\xdb\xef\x92\xd7\x7c"
+ "\xed\x77\x49\x02\xb3\xd3\x25\x15\xcc\x7e\x97\x24\xb1\xf4\x1d\x6d"
+ "\xe2\x74\xaf\xfd\x66\xe9\xcc\x7e\x97\x1c\x08\xcd\x7e\xab\xbe\x61"
+ "\xfb\xad\xee\xc7\x7e\xab\xbf\x23\xf6\xbb\x74\xe2\x55\x1b\x12\xae"
+ "\x0d\x29\xa9\x1b\x9c\x0d\x79\x3b\xe0\xf9\xd7\x03\xdb\x90\xdd\xd3"
+ "\xbc\x36\x64\xf7\xb4\xc0\x36\xe4\x9d\x83\x57\x6d\x48\x28\x36\xa4"
+ "\x34\x73\x70\x36\xe4\x9d\x5c\x5f\x1b\xb2\xfb\x7c\x70\x36\x64\xf7"
+ "\xb0\xa1\xb7\x21\xbb\xa3\x7c\x6d\xc8\x6e\x3b\x2b\xd3\xae\xbb\x42"
+ "\xb7\x21\xbb\x3f\x0c\x6c\x43\x76\x1f\xf1\xb5\x21\xbb\x85\xb3\x32"
+ "\x76\x77\x30\x1b\xb2\x5b\x88\x6b\xbf\x2b\x56\x9c\xee\xb5\x21\x2c"
+ "\x9d\xd9\x90\x77\x49\x68\x36\x64\xc4\x37\x6c\x43\xe4\xfd\xd8\x10"
+ "\xf9\x77\xc4\x86\xfc\xa6\xcf\xf9\x87\xc1\xeb\xb1\x3d\x6a\xaf\x1e"
+ "\xdb\xa3\x0e\xac\xc7\xca\x5f\xbb\xaa\xc7\x42\xd1\x63\xef\x46\x0d"
+ "\x4e\x8f\x95\xcf\xf2\xd5\x63\x7b\x0e\x06\xa7\xc7\xca\x6b\x86\x5e"
+ "\x8f\x95\x37\xfa\xea\xb1\x3d\xe5\xac\x4c\xbf\xb9\x18\xba\x1e\xdb"
+ "\xb3\x25\xb0\x1e\xdb\xf3\x4b\x5f\x3d\xb6\x67\x31\xd3\x57\x7b\x0e"
+ "\x30\x3d\xb6\xc7\xc8\xd2\x7f\xe3\x14\xa7\x7b\xf5\x18\x4b\x67\x7a"
+ "\x6c\x4f\xd5\x40\x7a\x0c\xdb\x45\x8d\xa6\x57\xbb\x78\xc5\xd3\x2e"
+ "\xf6\x4e\xfc\xa4\xc8\xd3\x2e\xf6\xf2\x3e\x1a\x57\xf4\x4e\xc2\xeb"
+ "\xa9\x44\x66\xc2\x33\x71\x40\x47\x18\x5e\xc0\x76\xf1\xbb\xf7\x70"
+ "\x7d\x89\xa2\x11\xf4\x5e\x8b\xa0\x07\x8d\xa0\x07\x5b\xe0\x19\xe3"
+ "\xa4\x8d\x7d\x27\x01\xf5\x17\xae\xd3\xc0\x67\xa6\x0f\x1d\xc3\xf0"
+ "\x4c\x1e\x7e\x9e\x5d\xd4\x6e\xf8\xb6\x72\x4e\x68\x2b\xe7\x58\x5b"
+ "\xf1\xec\x97\x4b\x6b\xa1\x9c\x7b\x8d\x6e\x74\xfc\xe2\x08\x8a\xed"
+ "\x87\xdf\x87\x05\xed\x87\xae\xd1\x45\x16\x25\x43\x9b\x71\xb4\x12"
+ "\x8c\x85\x8f\x6d\x46\x99\x25\x89\xa4\xe7\xf4\x23\x41\x27\x32\xdd"
+ "\xc7\x55\x0d\x73\x61\x5c\xab\x35\xa0\xfb\xda\x41\xf7\xb5\x7b\xdb"
+ "\x0a\xce\x9d\x9f\x5b\xa3\xd3\x76\xac\xd1\x8d\xeb\x3e\x07\xba\xcf"
+ "\xd1\xbb\x9d\x2c\x68\xdb\xd9\x8e\xba\xaf\x95\x6f\x27\xbc\xee\x83"
+ "\xb6\xc1\x9d\x03\xdd\xb7\x4c\xd0\x7d\xe7\x74\xa8\xeb\xd5\x3b\x97"
+ "\x82\xee\x4b\x3c\xc5\x74\x9f\xe0\xc3\xfd\x10\x75\xdf\x1a\x9d\xf4"
+ "\x57\xed\x82\xee\x5b\x88\xba\xef\x30\xb4\x91\xbf\xfa\xea\x3e\x65"
+ "\xb8\xba\xef\x77\x46\xdf\x76\xb2\xf7\x5f\xc1\xb5\x93\xdf\x9d\x0f"
+ "\xd4\x4e\xba\xcd\xe1\xb6\x93\xbd\x32\xdf\x76\xb2\xb7\x8e\x95\xe9"
+ "\xb7\xd7\x86\xde\x4e\xf6\xfe\xa1\xa7\x9d\xbc\xd2\xbb\x9d\xec\xfd"
+ "\x8b\x6f\x3b\xd9\x6b\x62\xed\x61\x6f\x0b\x6b\x27\x7b\x4b\x59\xfa"
+ "\x6f\xd5\xe2\x74\x6f\x3b\x61\xe9\xac\x9d\xec\x75\x5c\x9d\x2f\xff"
+ "\xb6\xd9\xfb\xf7\x93\xae\xce\x97\x87\xdb\x67\x7c\x4f\x36\xb8\x3e"
+ "\xe3\xef\x5b\xaf\x8e\xb7\x87\xcb\xfb\xf7\xf7\x0f\x8e\xf7\x7f\x58"
+ "\x7c\x75\xac\x24\x5c\xde\x57\xc4\x0e\x8e\xf7\x7f\xb4\x0f\xd4\xc7"
+ "\x08\xec\x4b\xfd\xc9\x54\xdd\xd3\xc7\xf8\x93\xc9\xb3\x3e\xb7\x6f"
+ "\x1f\xe3\x4f\x12\xdf\xbd\x74\xfb\x7e\xd9\x7b\xed\xec\x40\x7d\x0f"
+ "\xd7\xd5\xbe\x07\xc8\xfa\x0f\x7b\x07\xd7\xf7\xd8\xdf\x6b\x7d\xe2"
+ "\x9f\x1f\x08\xce\xa7\xfa\xd3\xf4\x40\x3e\x95\x2b\xec\xbe\xc7\x9f"
+ "\x12\x7c\x7d\xaa\x3f\xc7\x08\xd8\x78\x31\x74\x9f\xea\xcf\xc3\x02"
+ "\xfb\x54\x7f\x56\xfa\xfa\x54\x7f\xb2\x33\xdf\xe9\xcf\x13\x99\x4f"
+ "\xf5\x27\xe1\x8c\xf0\x7d\xf3\xc4\xe9\x5e\x9f\x8a\xa5\x33\x9f\xea"
+ "\xcf\x53\xae\xce\xa3\x7f\xdb\x7c\xaa\xff\x63\xb9\x6a\xd7\xc3\xb5"
+ "\x2d\x7f\x4e\x18\x9c\x6d\xf9\xcb\x37\xb8\xfe\xf3\xdb\x6e\xd7\x2b"
+ "\xe5\x83\xe3\xfd\x5f\xfb\x5d\xff\xd9\xbf\x5d\x3f\xb8\xd8\x6b\xd7"
+ "\x0f\x2e\x0e\x6c\xd7\x0f\xd8\x7c\xed\xfa\x7f\x2f\xbf\x6a\xd7\xc3"
+ "\xb1\xeb\x7f\xd9\x3c\x38\xbb\x7e\x60\xb7\xaf\x5d\xff\xdb\xb5\xc1"
+ "\xd9\xf5\x83\x37\x0d\xbd\x5d\x3f\x18\xeb\x6b\xd7\x0f\xba\x04\x6c"
+ "\xdc\x1b\xba\x5d\x3f\xf8\x45\x60\xbb\x7e\xf0\x5f\xbe\x76\xfd\xa0"
+ "\xb0\x4f\xed\x6f\x6a\x66\xd7\x0f\x56\xb3\xf4\xff\x9e\x20\x4e\xf7"
+ "\xda\x75\x96\xce\xec\xfa\xdf\xa2\xaf\xce\xaf\x7f\xdb\xec\xfa\x07"
+ "\x01\xcf\xff\xba\x6a\x5b\x06\xb2\x2d\x7f\x1b\x64\x9f\xf1\xc3\xa8"
+ "\xf0\x6d\xcb\x47\x16\xaf\x6d\xf9\xc8\x12\xd8\xb6\x7c\x74\xaf\xaf"
+ "\x6d\xf9\xf0\xf0\x55\xdb\x12\x8e\x6d\xf9\xc0\x3e\x38\xdb\xf2\x11"
+ "\xf1\xb5\x2d\x87\x56\x04\x67\x5b\x3e\xda\x34\xf4\xb6\xe5\x23\x93"
+ "\xaf\x6d\x39\x24\x94\xe9\xc3\x5f\x86\x6e\x5b\x0e\x3d\x10\xd8\xb6"
+ "\x1c\x7a\xc4\xd7\xb6\x1c\x8a\x62\x36\xe4\x50\x12\xb3\x2d\x87\x74"
+ "\x2c\xfd\xc3\x02\x71\xba\xd7\xb6\xb0\x74\x66\x5b\x0e\x19\xaf\xce"
+ "\xbb\x7f\xdb\x6c\xcb\xe1\x7e\xd7\xff\xf6\xaf\xdf\xaa\x4a\xbd\xfa"
+ "\xad\xaa\x34\xb0\x7e\xab\xfa\x9e\xaf\x7e\xfb\xfb\xbb\x57\xf5\x5b"
+ "\x38\xfa\xed\x90\x69\x70\xfa\xed\x7f\xed\xbe\xfa\xed\x48\x90\xf1"
+ "\x80\xaa\x5e\x1c\x7a\xfd\x56\xd5\x2b\xfe\xc3\x11\x21\x06\xd0\xdf"
+ "\x57\x87\xae\xdf\x8e\x8c\x09\xac\xdf\x8e\xdc\xe4\xab\xdf\xaa\x84"
+ "\xf8\x3f\x47\x66\x30\xfd\x76\x44\x48\xff\xbb\x41\x9c\xee\xd5\x6f"
+ "\x2c\x9d\xe9\xb7\x23\x09\x83\x9b\x8f\xff\xc4\xee\x9d\x8f\xff\x84"
+ "\x97\x05\x57\xd8\x9c\xdb\x77\x3e\xfe\x93\x39\x38\x1f\xef\x6d\x2f"
+ "\x47\x6c\xfc\xdc\x3c\xb6\x99\x0e\x16\xbf\xc7\xef\x3c\xfd\x98\xe6"
+ "\xdc\xab\xf3\xf4\x97\x72\x9e\xfe\x13\xad\x6f\xfb\xa9\x36\x07\xd7"
+ "\x7e\x3e\x29\x1e\xfa\x79\xfa\x4f\xf6\xfa\xb6\x9f\x6a\xa3\x80\x95"
+ "\xb7\x43\x6f\x3f\xd5\xcf\x07\x6e\x3f\xd5\x0b\x7d\xdb\x4f\xb5\xd0"
+ "\xc7\xac\x36\xb1\xf6\x53\x3d\x4d\x68\x83\xa5\xe2\x74\x6f\xfb\x61"
+ "\xe9\xac\xfd\x54\x17\x06\xe3\x1f\xb8\x14\x4d\x87\xd0\xde\x8f\x6f"
+ "\xbc\xd1\xdd\x83\xf3\x14\x01\xe7\xfe\xfc\x83\x97\x98\xbd\xe0\x7d"
+ "\x83\xdd\xfb\x52\x06\xf4\x0f\x5a\x04\xff\x60\x71\x5f\xff\xc0\xe3"
+ "\x1b\x14\x01\xbe\xdf\x0a\x6a\x8e\x5e\xc0\x3b\xfa\x06\x17\x42\xf5"
+ "\x0d\x5e\xf2\xfa\x06\xe6\x5e\xbe\xc1\xb2\x5e\xbe\x01\x8f\xf7\x66"
+ "\x1f\xbc\xf7\xf1\x0d\x7a\xf0\x3e\x54\xbe\x41\xad\xfa\xea\x1c\x7d"
+ "\xb8\xfd\xce\xea\xbd\x83\xeb\x77\x5a\x4d\x57\xc7\xf2\xc3\xe5\x7d"
+ "\xed\x20\xc7\xf2\x3f\x95\x5f\x1d\x6f\x09\x97\xf7\xd6\x41\xc6\x72"
+ "\xf8\x6c\x73\xf8\xfd\x91\x63\xb3\xbc\xfd\x91\x63\xb3\x3c\xfe\x95"
+ "\x27\x36\x22\xe8\x67\x99\x39\x19\xae\x0b\x84\xbc\x9e\xcc\x9f\x33"
+ "\x20\xb7\xb6\x1c\xc3\x73\xd7\xc0\xe7\x3a\x7a\x38\xde\x28\xf6\xb9"
+ "\xfe\xef\x74\x8f\xbf\x15\x8f\xbe\x18\xf8\x56\xe8\x57\x79\xfa\x20"
+ "\x18\xd7\xaa\xdf\xf5\xc3\xb7\xec\x4b\xc1\x3e\x4b\xb7\xb2\xe9\xd0"
+ "\x77\xb7\xbf\xf2\xe9\xac\xc1\xf5\x57\x8e\x16\xf8\xfa\x5b\xc7\xdc"
+ "\xc1\xf9\x5b\xc7\x94\x43\xdf\x5f\x39\x16\xed\xeb\x6f\x1d\x6b\x15"
+ "\x70\x22\x09\xdd\xdf\x3a\x76\x24\xb0\xbf\x75\xec\x53\x5f\x7f\xeb"
+ "\xd8\x6e\xe6\x57\x1d\x73\x31\x7f\xeb\x58\x25\x4b\xff\xbf\x44\x9c"
+ "\xee\xf5\xb7\x58\x3a\xf3\xb7\xfe\x9f\x3c\x48\x7f\xab\x6a\x10\xfe"
+ "\x96\xf1\xdb\xe3\x6f\x2d\xba\xc2\xfd\xad\xcf\x33\x83\xb0\x3b\x87"
+ "\x7a\xd9\x9d\x94\xab\x76\x07\x75\xcd\xff\x8b\x1e\x9c\xdd\xa9\x77"
+ "\x0d\xc8\x7b\x93\x88\xf7\xa8\xf3\x05\xbe\xbb\x63\xf6\xa5\x84\xcd"
+ "\x7b\xd0\xf5\xc5\xe9\xdf\x66\xbe\x7f\x5e\x35\x38\xbe\x37\x04\x3c"
+ "\xff\xf0\xaa\xaf\x35\x10\xef\x6d\x53\x06\xc7\xfb\xe3\x8e\xf0\x7d"
+ "\xad\x7f\x34\x7e\xd2\xe3\x6b\xfd\xa3\xb1\xb7\xaf\x85\xbe\xd5\x53"
+ "\x4e\xe6\x73\xbd\x0e\xbe\x52\xde\x4a\xf0\xbb\x52\x09\xb1\xb6\x1c"
+ "\x24\x26\xf0\xbd\xf2\xce\x80\xff\x95\x04\xfe\x97\xeb\x5d\xc1\xff"
+ "\xfa\xc7\xd3\xbe\xfe\x57\xe3\x11\xbf\xfe\x97\xd2\xeb\x7f\xb9\xc0"
+ "\xb7\xea\x7e\x77\x5f\x4a\xc1\x19\x91\x2f\xf6\x72\x5f\x5f\xac\xcb"
+ "\xdc\x54\xd5\x75\xcb\x3e\x63\x37\xf8\x63\xfd\xf9\x62\x3c\x26\xfc"
+ "\xf8\x63\xff\x19\xbe\x58\xc3\x81\xc1\xf9\x62\xff\x88\xf6\xf5\xc5"
+ "\x4e\x6c\x09\xce\x17\xfb\xc7\xf6\x80\x63\x5f\x61\xfb\x62\xff\x28"
+ "\xf7\xf5\xc5\x4e\xa4\x08\x98\x59\x11\xba\x2f\x76\x62\x4e\x60\x5f"
+ "\xec\xc4\x8b\xbe\xbe\xd8\x09\x61\xef\xe9\x89\x5c\xe6\x8b\x9d\x98"
+ "\xc2\xd2\x1b\x93\xc4\xe9\x5e\x5f\x8c\xa5\x33\x5f\xec\xc4\xb6\x20"
+ "\xe7\xc6\x0e\xb9\xc0\xa6\x7f\xf3\xeb\x29\xfb\x9b\x1b\x1b\xaa\xf5"
+ "\x94\x2f\x5d\xe1\x73\x63\x4d\x03\x8f\x7f\x5d\xf5\x09\xfc\xe8\x9a"
+ "\x13\xe5\x83\xb3\x4b\xcd\xb9\x57\x7d\x82\x70\x79\xdf\x34\xc8\xb1"
+ "\xaf\x16\x59\xf8\x3e\xc1\xc9\x3a\xef\xf8\xcb\xc9\xba\xd0\xc6\x5f"
+ "\x4e\x4e\xf5\xb5\xff\x2d\xfe\xed\xff\xd5\xf1\x97\x10\x6c\x7e\x73"
+ "\xdd\xe0\x6c\xfe\x49\xb5\xaf\xcd\xff\x72\x53\x70\x36\xff\xa4\x79"
+ "\xe8\xc7\x5f\x4e\x16\xf9\xda\xfc\x2f\xf5\x02\x4e\xb2\x42\xb7\xf9"
+ "\x5f\x4e\x0f\x6c\xf3\xbf\x7c\xda\xd7\xe6\x7f\x19\xc3\x6c\xfb\x97"
+ "\x69\xcc\xe6\x7f\x39\x91\xa5\xb7\x64\x8a\xd3\xbd\x36\x9f\xa5\x33"
+ "\x9b\xff\x65\x6e\x68\xf3\x5d\xaa\x2b\x74\xbe\x4b\xfd\x1d\x99\xef"
+ "\xfa\x8a\x5c\xb5\x3b\xe1\xda\x9d\x2f\x8b\x06\x67\x77\x4e\x0d\x18"
+ "\xff\x23\xb0\xdd\x39\x3d\xcd\x6b\x77\x4e\x4f\x0b\xcd\xee\xb4\x1d"
+ "\xf4\xb5\x3b\xff\x7e\xe4\xaa\xdd\x19\xac\xdd\xf9\x6a\xda\xe0\xec"
+ "\x4e\x5b\xaf\xf8\x47\xa7\x83\x8c\x7f\x74\x3a\x60\xfc\xa3\xf0\xed"
+ "\xce\xe9\x5e\xf1\x8f\x4e\x0b\xf1\x8f\x4e\x85\x11\x37\xe4\xf4\x87"
+ "\x81\xed\xce\xe9\x5e\xf1\x8f\x4e\x0b\xf1\x8f\x4e\x0b\xf1\x8f\x4e"
+ "\x0b\xf1\x8f\x4e\x39\xc5\xe9\x5e\xbb\x73\x4a\x14\x37\xe4\xcc\xd5"
+ "\xf8\x47\xdf\xba\x75\x98\x67\x07\xa1\xff\xda\x75\x5e\xfd\xd7\xae"
+ "\x0b\xbc\x0e\xf3\xeb\x62\xdf\x75\x98\x8e\xdb\xaf\xae\xc3\x0c\x47"
+ "\xbf\x9d\x19\x64\x5c\xa4\xaf\xf5\xbe\xfa\xad\xfd\x58\x70\xfa\xed"
+ "\xeb\x7f\x0d\xbd\x7e\xfb\xba\xc3\x57\xbf\xb5\x5b\x58\x99\xce\x86"
+ "\xa1\xdf\xda\xdf\x0e\xac\xdf\xda\xf7\xf8\xea\xb7\xf6\x34\xa6\xc7"
+ "\xda\x8f\x32\xfd\xd6\x5e\xc0\xd2\xcf\x3a\xc5\xe9\x5e\xfd\x76\x56"
+ "\xa4\xdf\xda\xed\xa1\xcd\x6b\x86\xe5\x57\x5f\x86\x79\xcd\xa1\xf2"
+ "\xab\xaf\xf4\x79\xcd\x8e\x84\xab\xe3\x68\xe1\xf8\xd4\xed\x1d\x83"
+ "\xf3\xa9\xcf\xd7\x85\x6f\x53\x9c\xfb\xbd\x36\xc5\xb9\x3f\xd0\xfc"
+ "\x4e\x1e\xe0\xce\x04\x3e\xf1\x96\x33\x44\xf6\x3a\xce\xef\x1c\xad"
+ "\x21\x66\x9c\xdf\x59\xe9\x99\xdf\x29\x16\xfc\x6c\xe7\xad\xbe\x7e"
+ "\xf6\x85\x3d\xfe\xfc\x6c\xf4\xaf\xdd\xe0\x3b\xbb\x7a\xcf\xeb\xbc"
+ "\xe0\xdf\x16\x75\x29\x9b\xaa\x2e\xbe\xbb\xcf\x18\xaa\x2d\xda\xb1"
+ "\x81\xd9\xa2\xb7\xbe\xf5\xb6\xa8\xa3\x74\x70\xb6\xa8\xb3\xc3\xd7"
+ "\x16\x5d\x5c\x18\x9c\x2d\x72\xae\x1e\x7a\x5b\xe4\xcc\xf4\xb5\x45"
+ "\x17\x67\x08\x58\x79\x2a\x74\x5b\x74\xf1\xf6\xc0\xb6\xe8\xe2\xbd"
+ "\xbe\xb6\xe8\xa2\x9c\xd9\x9c\x8b\x89\xcc\x16\x5d\x8c\x66\xe9\x17"
+ "\x66\x88\xd3\xbd\xb6\x88\xa5\x33\x5b\x74\x31\x29\xb4\x31\x9e\x11"
+ "\x57\xe8\x18\x8f\xfc\x3b\x32\xc6\xd3\xd5\x12\xbe\x4e\x74\x97\x57"
+ "\xf7\xec\xdf\x70\x97\xf7\x19\x67\x48\x05\x7f\xbb\x9d\xcd\x73\xf7"
+ "\x8c\x33\xd8\xbf\x10\xf4\x9f\x7b\xac\xaf\xfe\xeb\x0e\xa8\xff\xfa"
+ "\x9b\xcb\xc6\x71\x05\x37\xe8\x46\x57\xf1\x20\xe6\xb2\x53\xbf\xed"
+ "\x3a\xef\xe2\x20\xe3\x2b\xbb\x5a\x7d\x75\x1e\x37\x27\x38\x9d\xe7"
+ "\x5e\x12\x50\xe7\x85\xbd\x8f\xc3\x9d\xe2\xab\xf3\xb8\x38\x01\x1f"
+ "\x0b\x43\xd7\x79\xdc\x4d\x81\x75\x1e\x77\xab\xaf\xce\x73\xbb\x98"
+ "\x6e\xe3\x66\x33\x9d\xc7\xa9\x59\x7a\x77\xa2\x38\xdd\xab\xf3\x58"
+ "\x3a\xd3\x79\x5c\x62\x7f\x3a\x8f\x9a\xca\xaa\x0a\xa4\x5c\x05\x5c"
+ "\x95\x50\xc6\x31\x80\x0d\x0b\xfc\x5f\x05\x32\x1e\x0d\xff\x07\xf4"
+ "\x49\x1c\xca\xb2\x2a\x2e\x1b\xca\x2c\x25\x12\xab\xe3\xac\xc5\x72"
+ "\x83\x0b\xcb\x6d\x67\xfc\x29\xab\x52\xb9\x46\x4c\xe3\xa8\x9e\x80"
+ "\x5c\xaa\xf8\xb3\x31\x81\x1e\xf7\x07\x69\x53\x49\xe4\x19\x09\x25"
+ "\x1e\x3a\x28\x6f\x64\xb3\x84\x3b\x88\x79\x74\xe6\x50\x05\xd4\x25"
+ "\x29\x60\x59\x21\xaf\xf8\x3d\xe3\xc8\x26\x17\xfd\xd2\xb2\xb2\x9d"
+ "\xb4\x48\xe8\x1c\x55\xdb\x88\x69\x34\x23\x81\xa0\x2f\x57\x71\x83"
+ "\x43\x86\x79\xe2\x79\xba\xf0\x6e\x22\xbe\x73\x43\x19\xd3\x57\x10"
+ "\x69\x7e\xfb\x08\x39\xe8\x89\x61\x19\x1d\xb4\x75\x95\x0b\xca\x0c"
+ "\xd8\xfc\x60\x5c\xbd\xec\xf7\x6f\x41\x9a\x9b\x68\xf0\x6c\x52\xcc"
+ "\x03\xfc\x59\x28\x0f\x7d\xbe\x04\xe8\xfd\x95\xe1\xb5\xf7\xc9\xf8"
+ "\x61\xb7\x52\x7b\x68\xb8\xa1\x7b\x03\xf1\x51\x95\x35\x8e\x58\x6e"
+ "\x03\xde\x69\x89\xd4\xdf\xfb\x90\xbe\x23\x25\xfd\xed\x7f\x97\xe3"
+ "\xd9\xc6\x19\xdb\x89\x74\x2b\x37\x42\xfe\x51\x1a\x7f\xfe\xb0\xa3"
+ "\x33\x8f\x64\xda\x25\x8b\x1b\x91\xe7\x78\xae\x25\x9e\xff\x0e\xb8"
+ "\x21\x90\x5e\xf8\xa1\x91\x90\xde\xb2\x48\x5e\xbc\x62\xa1\x36\x65"
+ "\xf9\x8a\x25\xab\xd6\xa6\x68\x6f\x59\x3c\x8a\xcc\x5e\xb5\x4a\xbb"
+ "\x62\xe1\xca\xf5\x5a\xf1\x9b\x49\xda\xc5\xcb\xd7\x2c\x7c\x29\x69"
+ "\xc9\xed\x2b\x16\x19\x46\xa1\xb0\x45\xe5\x88\xc2\xb2\x70\x79\x64"
+ "\x77\xc9\x1b\x84\xfc\x6a\x34\x91\x61\xb9\x3a\xf3\x24\x72\xcf\x19"
+ "\xa6\x78\x86\xa7\x14\x68\x32\x40\x3f\x6e\x4d\x1f\x81\xb4\x51\x3b"
+ "\xa1\x5c\x25\x50\x6e\x28\x23\x94\x59\x32\xc1\x53\x66\x0f\x26\x32"
+ "\x10\x13\xe9\xed\xe4\xa4\x54\x32\x47\xe5\x1c\xf1\x33\x4a\x13\xb0"
+ "\x7e\x18\x43\x4b\x02\x69\xef\xf2\xb6\xcc\x5c\x56\x05\xbf\x35\x78"
+ "\x30\x86\xbf\xa5\xf9\x65\x05\x9d\xd8\x4e\xa8\xfe\xa7\x7c\x9b\x92"
+ "\x4a\xa7\xcd\xd1\x49\x08\x7f\x86\x6a\x9e\xa4\xa8\xe7\x0c\x55\x48"
+ "\x47\xde\x42\x39\xda\x20\x7d\xbf\x5d\x72\x9f\x02\xd3\xf1\xec\x5f"
+ "\x3c\x0b\x15\xcb\x0c\xf5\x02\x5b\x4a\x2d\x34\x5b\xc0\x7e\xee\xf9"
+ "\x59\x9c\xe9\xfa\x58\xab\xec\x02\x89\x77\xd1\x6e\xba\xe5\xfc\xac"
+ "\xda\x8e\x0e\xa2\xca\x32\x2c\xa2\xa3\xc8\x9f\x54\xae\xe5\x4b\xf0"
+ "\x0c\x57\xce\x7c\x7d\x2c\x35\xab\xa6\xcd\xb9\x95\xa8\x3b\xf3\xa4"
+ "\x6a\xd1\x59\xae\xb2\xd0\xe4\x2f\xe5\xe5\x8f\x72\xc4\x33\x5a\x99"
+ "\x1c\xa5\x89\x1f\xa6\xf4\x95\x63\x0f\xfe\xf6\x70\xe4\x30\x60\x81"
+ "\x2a\xea\xd5\xf1\x6e\xc6\x47\x6c\xbb\xe7\x32\xf4\xe4\x4e\x9e\x77"
+ "\x11\x1a\x2e\xff\x73\x07\x67\xaa\xd7\x51\x53\x7d\x14\xf0\xac\x3c"
+ "\x3f\x95\x68\x17\xb8\xd5\xc4\x7c\x81\xc4\x3a\xcc\xf5\xe0\x9f\x64"
+ "\x4a\xc0\x1f\x91\x82\x3d\x89\x05\x9d\x11\x2b\xb4\xf7\x72\xe4\xe3"
+ "\xff\xb6\x11\x32\x73\x0d\x21\x5f\x4e\x26\x11\x25\xf0\xbb\x10\xeb"
+ "\xc3\xdb\x7f\x9a\x27\x2d\xda\x09\xbf\xc5\x33\x7a\x43\xfb\x7d\x44"
+ "\x4c\xc0\x76\xe7\xad\x77\x81\xff\x7a\xcb\xd4\x5c\x7e\xbd\x01\xea"
+ "\x5d\x0e\xf5\xde\xe6\xa7\xde\x05\xac\xde\xc3\xda\x87\xbe\xde\x11"
+ "\x2c\xfe\x75\x5e\xc4\xb6\xf0\xea\x2d\x8b\x1e\xb8\xde\xb6\x00\xf2"
+ "\x1e\x26\x87\x7a\x83\xbc\x6d\x20\x6f\x9b\x1f\x79\xdb\x04\x79\x5f"
+ "\xd3\x3c\xf4\xf5\x96\x1d\x65\xf5\x96\x99\xc2\xab\xf7\xb0\x80\xfa"
+ "\x4f\x54\xef\x00\xf2\x1e\x4e\xb8\x7c\x1b\xc8\xdb\x06\xf2\xb6\xf9"
+ "\x91\xb7\x4d\x90\xf7\xb5\x9f\x0d\x7d\xbd\x87\xb1\xf8\x87\x79\xc3"
+ "\x36\x87\x57\xef\xe1\x8a\x81\xeb\xdd\x10\x40\xde\xc3\x9d\x50\x6f"
+ "\x90\x77\x03\xc8\xbb\xc1\x8f\xbc\x1b\x04\x79\xdf\x97\x37\xf4\xf5"
+ "\x1e\xce\xce\x7f\xce\x1b\x9e\x16\x5e\xbd\x47\x04\x5c\xff\x22\xaa"
+ "\x77\x00\x79\x8f\x70\x70\xf9\x0d\x20\xef\x06\x90\x77\x83\x1f\x79"
+ "\x37\x08\xf2\x9e\xfb\xe8\xd0\xd7\x7b\xc4\x01\x56\xef\x11\x29\x61"
+ "\xd6\x3b\xe0\xfa\x77\x91\x5e\xd3\x80\xee\xea\x23\x73\xab\x71\x22"
+ "\xb9\xe3\x02\xd6\x7f\x64\x22\x55\xd6\x6b\xae\xc9\xca\x94\xb8\x14"
+ "\xf5\xd1\xd7\x40\x5f\x6e\x47\x36\xa7\x57\xd9\xc9\x48\xa8\xab\x9e"
+ "\xe6\x37\x56\xe0\x9d\x83\x7c\x5c\xa0\xfb\xdd\x8a\xfa\xa8\x2e\x53"
+ "\x59\xf9\xeb\x4b\x89\x36\xc3\x41\xd4\xb5\xe9\x76\x92\x6e\xa0\x8e"
+ "\x5a\xd2\x44\x94\x76\x22\xc5\xf1\xb2\x4f\xda\x2a\xc9\xca\x64\x4a"
+ "\x21\xef\xe9\xd8\xc7\xcc\x3f\x49\x62\xc1\x27\xce\xa4\x60\x3f\x0a"
+ "\x38\xa2\x85\xfc\x63\x91\x97\x90\xf7\x1f\x55\xb3\x89\xe4\x6f\x2f"
+ "\x39\x09\xf2\x13\x79\x0b\xfd\xd1\x58\x9e\xaf\x1d\x84\x3c\x39\x97"
+ "\xf1\x75\xc7\xd2\x50\xf9\x3a\x52\x98\xff\xab\x8f\xb5\xda\xbb\x08"
+ "\xf8\x96\x6a\xdc\x73\x6f\x97\xca\xeb\x6a\x0d\xed\x84\xe6\xc9\x53"
+ "\xa8\xb9\x5e\xcb\x81\xcd\x0a\x31\xdf\x80\xf1\xaf\x45\xfc\x2e\x04"
+ "\x7e\xf7\xc1\x9a\x97\xdf\xa3\xa0\x1f\x52\x5f\x28\xf0\xbb\xe8\x9a"
+ "\xc6\x61\xed\x01\xf8\x5d\x08\xfc\x2e\x07\x7e\x6f\x0b\x9e\xdf\xa3"
+ "\xfe\xe2\xcb\xef\x7a\xc3\xe5\xe1\xf7\x28\xe1\xfc\xd3\xfa\x0a\x5f"
+ "\x7e\x8f\x8a\x63\xfc\x1e\xd9\x02\xfc\x2e\x05\x7e\x17\x84\x98\x6f"
+ "\x63\x10\x7a\x1c\xf0\xdd\xd7\x86\x79\xf9\xad\x88\xa3\x4a\x9b\x80"
+ "\x6f\x1b\xe0\xfb\x9a\x66\xff\xfc\xb6\x01\xbe\x6d\x80\x6f\x5b\x08"
+ "\xf8\x56\xdc\xda\x8b\xdf\x97\x09\xdf\xd7\x08\xe3\x7f\xb6\x5e\xf8"
+ "\xbe\xa6\x82\xf1\xfb\x9a\xd9\xd4\x6c\x03\x7c\xdb\x42\xc4\xb7\x62"
+ "\x46\x10\xfc\x06\x7c\xf7\xb5\x9d\x5e\x7e\x2b\x2b\x80\xdf\x02\xbe"
+ "\x6d\x80\xef\x6b\x3f\x0b\xc0\x6f\xc0\xb7\x0d\xf0\x6d\x0b\x01\xdf"
+ "\xca\xed\xbe\xfc\xb6\x5d\x26\x7c\x2b\x17\x0b\xfc\xee\x85\x6f\xa5"
+ "\x96\xf1\x5b\x71\x08\xf8\x0d\xf8\xb6\x85\x88\x6f\xe5\x81\x20\xec"
+ "\x16\xe0\xbb\xaf\xcd\xf6\xf2\x5b\xa5\xa5\xca\x06\x01\xdf\x0d\x80"
+ "\xef\xfb\xf2\xfc\xf3\xbb\x01\xf0\xdd\x00\xf8\x6e\x08\x01\xdf\xaa"
+ "\x91\xbd\xf8\x7d\x99\xf0\x1d\xc9\xfc\x3f\x53\x43\x2f\x7c\x47\x16"
+ "\x30\x7e\x47\x4e\xa0\xe6\x06\xc0\x77\x43\x88\xf8\x56\x8d\x0f\x82"
+ "\xdf\x80\xef\xbe\xbe\x82\x97\xdf\xea\x02\xe0\xb7\x80\xef\x06\xc0"
+ "\xf7\xdc\x47\x03\xf0\x1b\xf0\xdd\x00\xf8\x6e\x08\x01\xdf\xea\xf5"
+ "\xbe\xfc\x6e\xb8\x4c\xf8\x56\x0b\xe7\x5f\x36\xf4\xc2\xb7\x9a\x30"
+ "\x7e\xab\x76\x03\xbf\x01\xdf\x0d\x21\xe2\x5b\x5d\x14\x8e\x7f\xb2"
+ "\xa6\x98\xc8\x7d\x79\x3e\x5a\x76\xe9\x7c\x94\x6b\x4f\x7f\x33\x3e"
+ "\xca\xb5\x95\xfe\x7d\x94\x6b\x53\x18\xcf\xaf\xd5\x84\xe7\xa3\x8c"
+ "\x0e\xb8\xff\xa1\x3f\x1f\xa5\x2f\xcf\xaf\x33\x5e\x3a\x3f\xe5\xba"
+ "\x85\xdf\x8c\x9f\x72\xdd\x78\xff\x7e\xca\xe8\x56\xc6\xf3\xd1\xa6"
+ "\xf0\xfc\x94\xeb\x02\xc6\x3f\xe8\xcf\x4f\xe9\xcb\xf3\xa8\xb6\x4b"
+ "\xe7\xab\x44\x1d\xfb\x66\x7c\x95\xa8\x52\xff\xbe\x4a\xd4\x3c\xc6"
+ "\xf3\x28\x12\x9e\xaf\x12\xe5\x0c\xc7\x57\xe9\xcb\xf3\xeb\x13\x2f"
+ "\x9d\xbf\x72\xfd\xf4\x6f\xc6\x5f\xb9\x3e\xca\xbf\xbf\xf2\x3d\xa1"
+ "\xff\xf3\xbd\x94\xf0\xfc\x95\xeb\x83\xe8\xff\xf4\xf5\x57\xfa\xf2"
+ "\xfc\xfb\x47\x2f\x9d\xcf\xf2\xfd\x83\xdf\x8c\xcf\xf2\xfd\x5c\xff"
+ "\x3e\xcb\xf7\xa7\x30\x9e\x5f\xdf\x1a\x9e\xcf\xf2\x7d\x7b\x38\x3e"
+ "\x4b\x5f\x9e\x8f\x99\x76\xe9\xfc\x96\x31\x77\x7d\x33\x7e\x8b\xc6"
+ "\xe5\xdf\x6f\xd1\x54\x32\x9e\x6b\xe6\x85\xe7\xb7\x8c\x99\x1d\x8e"
+ "\xdf\x82\xbc\x46\x9e\xa3\xaf\xc2\x78\x1e\xad\xa1\x91\x9f\x3b\xba"
+ "\xc1\x1f\x51\x02\xdf\x95\x6d\x44\x5a\x8c\x3c\xaf\x67\x3c\x77\x47"
+ "\x36\x56\x00\x7f\xf4\xc8\x33\xbe\x1e\xff\xd6\x44\xba\x4d\xf5\xd1"
+ "\x54\x4a\xa0\x2e\x72\x72\x52\x7a\xc3\x2d\xae\x6c\x12\xa9\x4d\xcf"
+ "\x82\xff\xa3\x47\x22\x8d\x36\x3d\xe7\x0b\xa8\x63\x04\xce\x51\xb8"
+ "\xcc\x65\xb3\xdc\xca\xe3\x75\x27\xa5\x3f\x58\x42\xc7\xbe\x33\xab"
+ "\x1b\x7c\x09\xfa\x8a\x26\xca\xda\x56\x41\xac\xae\x8f\x49\x6d\xfd"
+ "\x5f\x09\x17\xd9\xf8\xc7\x3b\x5d\x44\x47\xff\xad\x8b\xaa\x4e\xb1"
+ "\x13\xf7\x22\x8d\xc2\x6a\xac\x02\x5c\xfc\x91\xc4\xb7\xd2\x0b\xf4"
+ "\x9f\x3a\x45\xb7\xb2\x49\xed\x56\x36\x16\xb8\xcd\x4d\xf5\x2e\x65"
+ "\x13\x79\x2f\x15\x7a\x82\x4e\xa2\x4b\x6a\xa1\x34\xff\x25\x22\xcb"
+ "\x6f\x26\xf2\xad\x2f\x11\xc5\xd6\x66\xa2\xae\x6e\xa9\x27\x35\xa7"
+ "\xaa\x48\x4d\xbb\x8d\xd4\x5c\x80\xab\x0b\x2e\x0e\xae\x4c\x1b\xa9"
+ "\x6e\x23\xe4\xa9\xd3\x84\x64\xb4\x50\xc7\x4f\x1a\x49\x54\xb5\xab"
+ "\x9e\x68\xe7\x13\x72\x46\x7a\xc3\x45\x45\x22\x89\xa2\xff\xd4\x10"
+ "\xba\x48\x23\x85\x77\x32\x4c\xb7\xba\x1c\xa4\xba\xc5\x89\xef\xeb"
+ "\xe1\xbd\x2c\xa3\x05\xf2\xe7\xaa\x30\x96\xa1\xa3\x3a\xf3\x08\xd4"
+ "\xef\xb9\x38\xe0\xb3\xce\xe3\x93\xe5\x77\x91\xd8\xad\x20\x66\xc4"
+ "\x4c\x3c\x65\x98\xd9\xd9\x15\x2a\x66\x7e\xc0\xe2\xbf\xbf\xa2\x19"
+ "\x0d\xfc\xbe\x81\x7b\x25\x41\x3d\xd3\x76\x82\xe2\x7a\x30\x9c\x9f"
+ "\xa9\xed\xf8\x98\xe0\x9c\x75\xfc\x7a\x42\x66\xb8\x09\x41\x9e\xe0"
+ "\x5c\xf2\x4c\x03\x51\xe1\x3a\x35\xee\xdf\xba\xd1\xd6\x16\x07\xd9"
+ "\xe4\x82\xb2\x9e\x71\xf6\x94\xb5\x76\x73\x2d\x81\x77\x37\xd4\xea"
+ "\xed\x44\x61\x20\x6a\xe4\x33\xf8\x45\x9a\x99\xad\x64\xe4\xca\x0e"
+ "\x4a\x91\xc7\xc8\x5b\xe4\x33\xe6\xe7\xe1\xbd\x75\xb1\x83\x64\x38"
+ "\x89\xda\x9a\x0e\x77\x23\x75\x58\xc9\xd7\x04\xca\xa8\xa0\xca\xe7"
+ "\xe2\x00\x1f\xfb\x11\x13\x76\xe9\x0d\xd1\x80\x83\xd1\x34\x6f\x4c"
+ "\x5d\x09\xd4\x17\xe7\xf6\x43\xab\x73\x74\x30\xf3\x1f\x7d\x7c\x42"
+ "\x11\x9e\x0b\x19\x9e\xc7\xb5\xd2\xc8\x7a\x03\xe0\x79\x1b\xc3\xf3"
+ "\xb0\xf6\x20\xf0\x5c\xe4\xc5\x73\xf4\x79\x2f\x9e\xc7\xd9\x02\xe3"
+ "\x79\xdc\xbd\x02\x9e\x2b\xae\x4c\x3c\x8f\x3d\xd2\x3f\x9e\xc7\x96"
+ "\xf7\x83\xe7\x72\x8f\xbf\x3b\x34\x78\x1e\x47\x2e\x23\x9e\x0b\xc3"
+ "\xc3\xf3\xd8\x46\x5f\x3c\x47\xb7\x31\x3c\x47\x97\x86\x87\xe7\x71"
+ "\x01\xe3\x1f\xf7\xe7\x6f\x7b\xf1\x6c\x13\xf4\xf3\x4d\x95\x80\x67"
+ "\xd0\xcf\x36\x41\x3f\x5f\xd3\x3c\x30\x9e\x6d\x22\xfd\x7c\xe3\x61"
+ "\x2f\x9e\x6f\xda\x13\x18\xcf\x37\x0d\x63\x78\xb6\x5d\xa1\xfa\x59"
+ "\xbb\xbd\x7f\x3c\x6b\x8d\x81\xf1\x6c\xd3\x79\xfa\x12\x43\x83\x67"
+ "\x6d\xdd\xe5\xc3\xb3\x2d\x4c\xfd\xac\xdd\xeb\x8b\xe7\x1b\x0f\x30"
+ "\x3c\xdf\x68\x08\x0f\xcf\x37\x1d\x0a\xa7\x2f\x23\xc2\xb3\xa0\x9f"
+ "\x63\x72\x69\xa4\x0d\xf4\xb3\x4d\xd0\xcf\xd7\x7e\x16\x04\x9e\x45"
+ "\xfa\xf9\xe6\x5f\x7b\xf1\x1c\xb3\x3e\x30\x9e\x7f\x78\x4c\xc0\xf3"
+ "\x15\xaa\x9f\x7f\xb8\xbc\x7f\x3c\xff\x70\x5a\x3f\x78\x2e\xf7\xf4"
+ "\xd3\x86\x06\xcf\x3f\x2c\xbd\x8c\x78\x0e\x53\x3f\xff\x30\xcd\x17"
+ "\xcf\x37\x9b\x18\x9e\x6f\x8e\x0b\x0f\xcf\x31\xdb\xc2\xe9\x27\x7a"
+ "\xf1\xdc\x20\xe8\xe7\x1f\x27\x00\x9e\x41\x3f\x37\x08\xfa\xf9\xbe"
+ "\xbc\x81\xf1\xdc\x20\xd2\xcf\xb7\x2c\xf1\xe2\xf9\xc7\xd3\x03\xe3"
+ "\xf9\x47\xef\x32\x3c\x37\x5c\xa1\xfa\xf9\x47\x0f\xf4\x8f\xe7\x1f"
+ "\x69\x02\xe3\xb9\x41\xe7\xe9\x03\x0f\x0d\x9e\x7f\x64\xb8\x7c\x78"
+ "\x6e\x08\x53\x3f\xff\x68\x86\x2f\x9e\x6f\x99\xc7\xf0\x7c\x8b\x3a"
+ "\x3c\x3c\xff\x38\xe0\xf9\xaf\xfd\xf5\xc1\x45\x78\x16\xf4\xf3\x6d"
+ "\x3a\x1a\xd9\x00\xfa\xb9\x41\xd0\xcf\x73\x1f\x0d\x02\xcf\x22\xfd"
+ "\xac\xbb\xd7\x8b\xe7\xdb\xc6\x04\xc6\xf3\xad\x6b\x05\x3c\x5f\xa1"
+ "\xfa\xf9\xd6\x91\xfd\xe3\x59\xd7\xda\x0f\x9e\xcb\x3d\xe3\x0b\x43"
+ "\x83\xe7\x5b\xe3\x2e\x23\x9e\xc3\xd4\xcf\xb7\x46\xfb\xe2\x59\x37"
+ "\x9e\xe1\xf9\xc7\xf6\xf0\xf0\x7c\xdb\x84\xa1\x19\xdf\xb8\x5d\x87"
+ "\xe3\x1b\x5d\x38\xbe\xe1\x5d\xfb\xa7\x57\xd5\x31\x3c\x77\x03\x9e"
+ "\x77\x88\xf1\x7c\xbc\xf7\xf8\xc6\x4f\x86\x71\x3d\x78\xbe\xbd\x0f"
+ "\x9e\x39\xc0\x73\x37\x8f\xe7\xf1\x77\x79\xc6\x37\xac\x6d\xa5\x80"
+ "\x93\x53\xc4\x3a\x0b\xb0\x9c\x2f\x60\xf9\x38\x60\x19\x78\xc8\x01"
+ "\x8f\xab\x1b\xeb\x49\xbc\x83\xf1\xb2\x0b\x78\xcc\x89\x71\xdc\xd5"
+ "\x2a\x45\xfc\x22\x6e\x3d\x18\xae\x59\x09\xd8\x4d\xfe\x94\xd4\xa4"
+ "\xc2\xb5\x01\xae\x74\xb8\xc8\xa7\xa4\xba\x15\xb0\xbb\x5c\x8c\xdd"
+ "\x3a\x01\xbb\x3f\x39\xdc\x3f\x76\x7f\xb2\xfb\xf2\x8d\x65\xfc\x84"
+ "\x8d\x7f\x1d\x4f\x50\xc7\x3f\x7d\x82\x5a\x8d\xf5\x02\x3e\x4f\x91"
+ "\x78\x17\x51\xd1\xb9\xba\xd1\x8a\x04\xa2\xde\xe8\x26\x52\xf3\x4b"
+ "\x44\x6d\x6e\x80\x7a\x7b\xda\x6f\x33\x51\x7c\xec\xfc\x2b\xa9\x6e"
+ "\xaf\x27\xd5\x17\x8e\x90\x6a\x0e\xae\x53\x70\x41\x59\xe3\x97\x88"
+ "\xeb\xed\x10\xea\x3d\xfe\x20\xe4\x15\x13\xb8\xde\xe3\x8b\xf8\x7a"
+ "\x2f\x86\x7a\x77\x79\xeb\x6d\x85\x76\x00\xf2\xb9\x81\x13\xc6\x43"
+ "\xe2\x1d\x64\xe4\x2a\x17\xa5\x5d\x02\xfe\x51\x3e\x1f\x1f\x75\x92"
+ "\x78\x03\xc8\x6c\x11\xe0\xbf\xa5\x9c\x64\xa4\x01\xfe\xbb\x9c\x88"
+ "\x3b\x87\x35\xf3\x22\xe0\xff\x27\xf5\x14\xf8\xd7\x8d\xf8\x3f\x8e"
+ "\xf8\xbf\xcd\xc5\xf1\xf8\xbf\xad\x22\x3c\xfc\xdf\x1e\x0c\xfe\x83"
+ "\x18\x0f\x89\xd5\xe1\x78\x48\x17\x8e\x87\x78\xd7\x80\x0e\x84\x7f"
+ "\x91\x3e\xbf\x43\x84\xff\xd8\x7e\xf0\x7f\xa7\x07\xff\x15\xdf\x3c"
+ "\xfe\xef\x18\x00\xff\x77\xf4\x87\xff\x21\x1e\xfb\xb8\xe3\x32\xe2"
+ "\xff\xce\x01\xf0\x7f\x67\x30\xf8\x2f\x0c\x0f\xff\x77\xf4\xc2\xff"
+ "\xed\x02\xfe\x6f\x0f\x13\xff\xb1\x41\xe0\x3f\x98\xf1\x93\x7b\x10"
+ "\xff\xa0\xff\x6d\x51\xa2\xb5\xc0\x03\xe0\x5f\x3c\x7e\x72\x97\x08"
+ "\xff\xf7\xf4\x83\xff\xbb\xef\xf2\x8c\x9f\x7c\xf3\xf8\xbf\x6b\x00"
+ "\xfc\xdf\xd5\x0f\xfe\x87\x7a\xac\xe4\xae\xcb\x88\xff\xbb\x07\xc0"
+ "\xff\xdd\x41\xe0\xdf\x16\xa6\xfe\xbf\xab\x17\xfe\x63\x05\xfc\xc7"
+ "\x86\x89\xff\x7b\x82\xc1\x7f\x10\xe3\x2d\xf7\xe9\x70\xbc\xa5\x0b"
+ "\xc7\x5b\xbc\x6b\xc2\x07\xc2\xbf\x48\xff\x4f\x10\xe1\xff\xbe\x7e"
+ "\xf0\x7f\xaf\x07\xff\x57\x80\xfe\x9f\x30\x00\xfe\x27\xf4\x87\xff"
+ "\x21\x1e\x5b\x99\x70\x19\xf1\x7f\xef\x00\xf8\xbf\x37\x18\xfc\x87"
+ "\xa9\xff\x27\xf4\xc2\xff\x3d\x02\xfe\xef\x09\x13\xff\xf7\x05\x81"
+ "\xff\x60\xc6\x67\x1e\x40\xfc\x83\xfe\x6f\x88\x12\xed\x0d\x18\x00"
+ "\xff\xe2\xf1\x99\xfb\x45\xf8\x7f\xa0\x1f\xfc\x4f\xbc\xcb\x33\x3e"
+ "\xf3\xcd\xe3\xff\xfe\x01\xf0\x7f\x7f\x3f\xf8\x1f\xea\xb1\x98\xfb"
+ "\x2f\x23\xfe\x27\x0e\x80\xff\x89\x41\xe0\xbf\x21\x4c\xfd\x7f\x7f"
+ "\x2f\xfc\xdf\x27\xe0\xff\xbe\x30\xf1\xff\x40\x30\xf8\x0f\x62\x3c"
+ "\x67\x32\x3f\x9e\xd3\x85\xe3\x39\xde\x3d\x22\x03\xe1\x5f\xa4\xff"
+ "\x27\x89\xf0\x3f\xb9\x1f\xfc\x3f\xe8\xc1\xff\x15\xa0\xff\x27\x0d"
+ "\x80\xff\x49\xfd\xe1\x7f\x88\xc7\x6e\x26\x5d\x46\xfc\x3f\x38\x00"
+ "\xfe\x1f\x0c\x06\xff\x61\xea\xff\x49\xbd\xf0\xff\x80\x80\xff\x07"
+ "\xc2\xc4\xff\xe4\x21\x1a\xff\x79\xa8\x0e\xc7\x7f\x38\x45\x7d\x54"
+ "\x77\xd1\x3b\xb3\x38\x53\x93\x5a\x25\xd1\x12\x97\xe2\x78\x9d\x35"
+ "\xa5\x83\xcc\x3c\x0f\x32\x31\x9c\x27\xf3\xcf\xab\x89\xdb\xd4\x44"
+ "\x28\xf4\xff\x7d\xf6\x88\xc2\xe5\x32\x3d\x17\xb7\x75\x25\x91\xb9"
+ "\x23\x1b\xff\x88\x69\xd6\x93\x4e\x82\x75\xde\x84\x3c\x38\xe5\xe5"
+ "\x01\x8e\xc1\xd1\xb3\x3a\x75\x49\x36\xd0\x74\xd9\x49\x0b\xe0\xa5"
+ "\xba\xc5\x0e\xbc\xdf\xc0\x63\x0b\x65\x01\xe5\x31\xec\x3c\x43\x64"
+ "\xae\x7f\x6a\x6e\x00\x19\x47\x29\xd7\x11\x49\x74\x0b\xe5\x50\x96"
+ "\x28\x23\x94\xab\x76\x03\xae\x57\x7a\xe8\x48\x2d\xe0\xdb\xf5\x4f"
+ "\xdd\x0d\x25\x40\x37\xf4\xe3\x32\x0f\xf1\xf3\x1f\x70\xd7\x57\x37"
+ "\x02\x2f\xf3\x26\x87\x29\xa7\x87\x82\xd8\xff\x12\xcc\x38\xc5\xc3"
+ "\x46\x1c\xa7\x00\x39\x6d\x0b\x52\x4e\x85\x3e\x7b\x5a\x87\x5c\x4e"
+ "\x0f\x6b\x82\x93\xd3\xc3\xab\x7b\xc9\x69\x88\xc7\x0f\x1e\x9e\xcc"
+ "\xe4\xf4\xb0\x9a\xc9\xe9\xa7\x09\xe1\xc9\xe9\xe1\xb0\xd6\xff\xf6"
+ "\xed\x4f\x3f\xa2\xc5\xfe\x34\x07\xfd\xe9\xe0\xe4\x64\xd3\xf8\xec"
+ "\xc1\x1d\x72\x39\xc5\x59\x82\x93\xd3\x23\x63\x7c\xe5\x34\xd4\xfd"
+ "\xdc\xb8\x16\x26\xa7\xb8\x4a\x26\xa7\x38\x12\x9e\x9c\x1e\x09\x62"
+ "\xff\x47\x30\xfd\xbe\x47\xab\xb0\xdf\x07\x72\x0a\xb2\x3d\xd9\x0a"
+ "\x7d\xf6\x0c\x0f\xb9\x9c\x1e\xd5\x07\x27\xa7\x47\x3f\xec\x25\xa7"
+ "\x21\xee\x8f\x3d\x6a\x62\x72\x7a\x34\x91\xc9\xe9\x91\xf2\xf0\xe4"
+ "\xf4\xe8\xd1\xa1\xe9\x9f\x4c\x31\x60\xff\x84\x83\xfe\x49\x70\x72"
+ "\x6a\xd0\xf8\xec\x71\x1e\x72\x39\x4d\x51\x07\x27\xa7\x29\xcb\x7d"
+ "\xe5\x34\xd4\xfd\x86\x29\xec\x3c\x60\xe9\x14\x39\x93\xd3\x63\xb3"
+ "\xc2\x93\xd3\x94\x80\xf1\x4f\x43\xf3\xa3\x1f\xd7\xa0\x1f\x0d\x72"
+ "\x0a\xb2\x3d\x35\x14\xfa\xec\xc9\x1e\x72\x39\x4d\xad\x0c\x4e\x4e"
+ "\x8f\x5f\xdb\x4b\x4e\x43\xec\xdf\x4e\x6d\x64\x72\x9a\x5a\xc1\xe4"
+ "\x34\xc5\x19\x9e\x9c\x1e\x0f\x66\xfd\xa7\xdf\x7d\x58\x7d\x7d\xbe"
+ "\x9f\x1d\xba\xb2\x7c\xbe\x9f\x2d\x0e\x4e\x56\x3f\x3b\x78\x69\x7d"
+ "\xbe\x9f\xe5\x32\x59\xfd\x6c\x1e\x93\xd5\xe3\xbb\xc3\x93\xd5\xcf"
+ "\x02\xc6\x5a\x1a\x68\xff\x56\x5f\xbf\x6f\xba\xe1\xca\xf2\xfb\xa6"
+ "\x07\xa9\xff\xa6\x2f\xbf\xb4\x7e\xdf\x74\x41\xff\x4d\x17\xf4\xdf"
+ "\xb4\x30\xf5\xdf\xf4\x20\xf4\x9f\xff\x7d\x5f\x7d\x7d\xbf\x27\xa3"
+ "\xaf\x2c\xdf\xef\x89\x03\xc1\xc9\xea\xc9\xef\x5d\x5a\xdf\xef\x09"
+ "\x3b\x93\xd5\x13\xfb\x99\xac\xa6\xbb\xc2\x93\xd5\x93\xba\x70\xf7"
+ "\x8b\xf5\xf5\xff\x66\x5c\x61\xfe\xdf\x8c\x20\xfd\xbf\x19\x97\xd8"
+ "\xff\x9b\x21\xf8\x7f\x33\x04\xff\xef\xc9\x30\xfd\xbf\x19\x61\xf9"
+ "\x7f\xbe\xb2\xf2\xf8\x80\x33\x53\xae\x2c\x1f\x70\x66\x54\x70\xb2"
+ "\x9a\xb9\xe2\xd2\xfa\x80\x33\x27\x32\x59\xcd\x54\x30\x59\x3d\x35"
+ "\x3b\x3c\x59\xcd\xcc\x0c\x77\x7f\x5a\x5f\x3f\x70\x96\xf6\xca\xf2"
+ "\x03\xe3\x83\xec\xff\xce\x1a\x73\x69\xfd\xc0\x78\xa1\xff\x1b\x2f"
+ "\xf4\x7f\xe3\xc3\xec\xff\xce\x0a\xa2\xff\x1b\xcc\xb8\xdf\x33\x99"
+ "\xe8\x03\xba\x4d\xf5\x51\x2a\xe0\xbf\xca\x48\xa4\x5d\xd1\x20\x2f"
+ "\x05\xc8\x2b\x4b\x4b\xba\x4d\x20\x2f\x87\x8b\xcc\x5c\x7d\x82\xd6"
+ "\xb6\xb9\x49\x17\xc8\xea\x22\xf8\x81\x56\x47\x2b\xee\xd1\x7b\xb0"
+ "\x59\xfa\xcc\x98\xb9\xab\xd5\x04\xe5\x85\xfc\x77\x2b\x9e\x8b\xa3"
+ "\x20\x2f\x5e\x7e\x8a\xa6\x7a\x97\xa9\xb1\xe0\xa9\xd3\x27\xe8\x2a"
+ "\x3b\xa5\x35\x7a\x27\xc6\x8e\x9c\x55\xa3\xaf\x27\xc0\x85\x91\xda"
+ "\x67\x50\x2e\x4f\x1f\xc1\x74\xab\xa3\x9e\x60\xdc\x4f\x7e\x0c\xfc"
+ "\x84\x2e\xca\xf5\xb9\x4e\x81\xf1\x9b\x70\x5f\xa1\x27\x46\x93\xf5"
+ "\x54\x21\x2f\xff\xde\x63\xaa\xbc\xfc\x3f\xd7\xa9\x77\xe0\xfe\xc4"
+ "\x21\xf7\x05\x9f\xe6\xc7\xff\xb8\x13\x9a\x1b\x3c\x65\x5c\x95\x44"
+ "\x29\x94\x71\x74\x6d\x87\x83\x60\x39\x6b\x3b\x2c\x24\x23\x85\xa8"
+ "\x6b\xbb\x5a\x49\x7a\x07\x75\xd4\x66\x7e\x45\xe2\xcf\xe3\xbc\x00"
+ "\xe2\xe9\x99\x6b\x99\xbc\x9f\x9e\xcc\x9d\xd0\xdd\x60\x97\x3e\x23"
+ "\xaf\x05\xaf\x50\x95\x05\xbc\x76\x11\x29\xbf\x5f\x53\x4a\xe4\xc0"
+ "\x2f\xbd\x35\xb3\x99\xd0\xc8\x2f\xd4\x56\x57\x03\xf2\x53\x0f\xef"
+ "\x27\xf7\xcc\x37\x44\x7e\x31\x1a\xd3\x90\xb7\xb8\xce\xd4\x6a\x70"
+ "\xf0\x34\x9e\xf7\x4c\x76\x99\xc4\x6a\xec\x22\xb5\x2e\x42\x00\x1f"
+ "\xad\x9f\x24\xd4\x03\xbe\x66\x85\xa9\xb7\x9f\x31\x0d\xcd\x78\xe5"
+ "\x6c\x3b\xfa\xad\x80\xaf\x6d\xac\x8c\xc3\xda\x83\xc0\x57\xa1\x17"
+ "\x5f\xb3\xd7\x0f\x0e\x5f\xb3\x6f\x1d\x62\x7c\x0d\xb1\xff\xfa\xf3"
+ "\x8e\xc1\xe1\x6b\xf6\x6a\x86\xaf\x9f\x17\x31\x7c\xcd\xd6\x7b\xf1"
+ "\x35\xac\xfd\xd2\xe1\xeb\xe7\xd3\x18\xbe\x7e\x2e\x0f\x0f\x5f\xb3"
+ "\xdb\x86\x66\x9c\x15\xf1\x50\x0f\xfa\xcb\x26\xe8\xaf\x6b\x9a\x07"
+ "\xc6\x97\x4d\xa4\xbf\x9e\xb5\x0d\x0e\x5f\xcf\x6e\x19\x5a\x7c\x0d"
+ "\xb5\xcf\xfd\xec\xec\xc1\xe1\xeb\xd9\x4f\x19\xbe\xe6\xb8\x18\xbe"
+ "\x9e\xad\xf2\xe2\xeb\x9a\xe6\x4b\x87\xaf\x39\xe5\x0c\x5f\x73\xf4"
+ "\xe1\xe1\xeb\xb9\xb0\xe2\x5f\xf5\xed\x1f\x3c\x5f\x8a\xfd\x03\xc0"
+ "\x97\xa0\xbf\xae\xfd\x2c\x08\x7c\x89\xf4\xd7\xf3\x0f\x0c\x0e\x5f"
+ "\x09\x5f\x0d\x31\xbe\x86\xb8\x9f\x90\xb0\x7f\x70\xf8\x7a\xfe\x2e"
+ "\x86\xaf\x84\x79\x0c\x5f\xcf\xeb\xbc\xf8\xba\xf6\xb3\x4b\x87\xaf"
+ "\x04\x39\xc3\xd7\x73\x55\xe1\xe1\xeb\xf9\xc0\xf1\x9f\x43\x1a\xd7"
+ "\x9e\x47\xb0\x4f\xe3\x36\x35\x08\xfa\xeb\xbe\xbc\x81\xf1\xd5\x20"
+ "\xd2\x5f\x73\xb7\x0f\x0e\x5f\x73\xa7\x0f\x2d\xbe\x86\xba\x6f\x33"
+ "\x37\x6a\x70\xf8\x9a\xfb\x4b\x86\xaf\x17\x0e\x30\x7c\xcd\xcd\xf5"
+ "\xe2\xeb\xbe\xbc\x4b\x87\xaf\x17\xf4\x0c\x5f\x2f\xe8\xc2\xc3\xd7"
+ "\xbc\x60\xe2\xbf\x06\x31\x1e\x3f\x3f\x11\xfb\x61\x80\x2f\x41\x7f"
+ "\xcd\x7d\x34\x08\x7c\x89\xf4\xd7\x8b\x17\x07\x87\xaf\x17\xf7\x0c"
+ "\x31\xbe\x86\xb8\x3f\xf6\x62\xca\xe0\xf0\xf5\xe2\xd7\x0c\x5f\x2f"
+ "\x46\x33\x7c\xbd\xd8\xea\xc5\xd7\xdc\x47\x2f\x1d\xbe\xe6\x55\x31"
+ "\x7c\xcd\xcb\x0d\x0f\x5f\xf3\x83\x89\x7f\x1a\xe4\x3c\x42\xe2\xa1"
+ "\xc1\xf5\x21\x13\x5f\x1c\x1c\xc6\x12\x95\x57\x76\x1f\x72\x41\xfd"
+ "\xe0\x30\x96\x38\x87\x61\x6c\x41\x26\xc3\x58\xe2\x8c\xcb\xd3\x87"
+ "\x5c\x30\x9e\x61\x6c\x7e\x5b\x78\x18\x4b\x1c\xc2\xf9\x8f\x45\xba"
+ "\xc1\xf5\x23\x5f\xfa\x70\x70\x18\x7b\x69\xf5\x95\xdd\x8f\x7c\x69"
+ "\xf2\xe0\x30\xf6\xd2\x5f\x18\xc6\x16\xb6\x30\x8c\xbd\x54\x71\x79"
+ "\xfa\x91\x0b\x0b\x18\xc6\x16\x86\x39\x6f\xb3\x28\xac\xfd\x2f\xfe"
+ "\xe7\x6d\x96\x98\x06\xd7\x97\x5c\x72\xcb\xe0\x30\xb6\xf8\xd8\x95"
+ "\xdd\x97\x5c\x5c\x3a\x38\x8c\x2d\x19\xcb\x30\xb6\x78\x1a\xc3\xd8"
+ "\x92\xa8\xcb\xd3\x97\x5c\xd4\xc1\x30\xb6\x68\x7f\x78\x18\x5b\x52"
+ "\x38\x74\xf3\x4d\xcb\x1c\x83\xeb\x4f\x2e\xdb\x32\x38\x8c\x2d\x7b"
+ "\xe0\xca\xee\x4f\x2e\x93\x0d\x0e\x63\xcb\xb2\x18\xc6\x96\xee\x65"
+ "\x18\x5b\x66\xbc\x3c\xfd\xc9\xa5\x09\x0c\x63\x4b\x35\xe1\x61\x6c"
+ "\x59\x10\xf1\xff\x83\x9d\x27\x7b\x79\xf6\xe0\xfa\x94\xcb\x4f\x0f"
+ "\x0e\x63\xcb\x8b\xaf\xec\x3e\xe5\x72\xfd\xe0\x30\xb6\xfc\x5f\x0c"
+ "\x63\xcb\xd5\x0c\x63\xcb\x1b\x2f\x4f\x9f\x52\x7f\x80\x61\x4c\x9f"
+ "\x16\x1e\xc6\x5e\x4e\x1c\xba\xf9\xbd\xa4\xca\xc1\xf5\x2b\x93\x9e"
+ "\x1e\x1c\xc6\x92\x24\x57\x76\xbf\xf2\x95\xea\xc1\x61\x2c\x69\x3a"
+ "\xc3\xd8\x2b\x29\x0c\x63\x49\x71\x97\xa7\x5f\xf9\x8a\x96\x61\xec"
+ "\xe5\x30\xe3\x51\x24\xf5\x89\x7f\xb5\x7c\x65\xea\xc2\xa4\xe5\x8b"
+ "\xb5\xcb\x57\xa6\x24\xaf\xd6\xae\x59\xbe\x61\xc9\x43\xb7\xac\x1d"
+ "\xaf\x4d\x36\x6a\x93\x97\xaf\x5c\x26\x24\x2c\x1e\x45\x9e\x59\x92"
+ "\xb4\xd0\x88\x29\x40\xbd\x6c\xe5\x8a\x25\x2b\x53\xb4\xc9\x4b\x56"
+ "\xaf\x5d\x9e\xbc\x04\xff\x5f\xa3\x5d\xba\x2a\x19\x12\x16\x2d\x59"
+ "\x9e\xba\x44\xfb\xd2\xda\xa5\x4b\x97\x24\xaf\x19\x45\x9e\x5a\x9b"
+ "\x94\xb2\xdc\x90\xb4\x44\x3b\xe5\xa9\x47\x6e\x9f\x3d\xf5\xe7\xb3"
+ "\x1f\x7e\x18\x0f\x27\x13\x9d\x4d\x16\x4d\x4d\x4d\x75\x80\x39\xd9"
+ "\x49\x69\xea\x8a\x5a\x0d\xe1\xcf\xc7\xdd\xda\x4e\xd4\x5b\x92\x89"
+ "\x2c\xb7\x9d\xc8\xcd\xed\x44\xa1\x7d\x99\xc4\x51\xf3\x0d\x71\x90"
+ "\x1e\x45\xcd\xcf\x64\xd2\xfc\xb2\x04\x6a\x7e\xd6\xe2\x50\x3e\x68"
+ "\x40\x5a\x6a\x9e\x54\x8a\xef\x80\xb7\x32\x6a\x7e\x4e\xd7\x2c\x4d"
+ "\x1d\xef\x50\x4e\x9e\x95\xf1\x15\x91\xd2\x51\x2b\x3a\xde\xe7\x1c"
+ "\xd2\x0f\x71\x24\x01\xea\x4e\xa4\xab\x14\x44\xba\xd2\x09\xf7\x72"
+ "\xb8\x2a\xe1\x3a\x04\x57\x1b\x5c\x1d\x44\x6a\x90\xc3\x15\x05\x97"
+ "\x16\x2e\x1d\x5c\xb1\x70\x01\xf7\x0c\x71\x70\x1d\x80\xab\x11\x2e"
+ "\xa0\x5d\x2d\x63\xf9\x40\x23\x91\xae\x9e\x0c\xd7\x66\xb8\x20\xaf"
+ "\xe4\xfd\x70\xd9\x89\x74\x4d\x26\x5c\x04\xae\x68\xb8\x62\xe0\x9a"
+ "\x06\x57\x12\xd0\x44\xb1\x77\x29\x90\x96\x92\x48\xa0\x9c\x03\x5f"
+ "\x29\x48\x9f\x0b\xd7\x5e\x22\x5d\x0b\xdf\x5c\x6b\x80\xcb\xd2\x8b"
+ "\x4e\x2e\xfa\x3f\x66\x80\x3c\xa7\xa8\xb2\x6e\xb4\xf3\x67\xe0\x49"
+ "\x57\x2d\x77\x67\x93\x08\xb7\x79\xf2\x2c\xc3\x6d\x44\x72\x4a\xba"
+ "\xea\x5e\xeb\x66\xd4\x33\xcf\x64\xf2\x67\x3a\xc2\x33\xf2\xac\x33"
+ "\x6f\xd5\x04\x3b\x79\xbf\x10\xcf\x34\x0b\x0d\x6f\xab\x26\x08\xbf"
+ "\x4f\xb1\x4b\x1e\x2f\xe7\xcf\x80\xcb\x57\x4d\xa1\x19\x09\x3b\xd8"
+ "\xd9\x6f\xab\xf8\x71\x34\x6a\x8a\x2c\xa2\x8a\x91\xd1\xd8\xe6\x2d"
+ "\x1b\xf8\x72\x29\x69\x36\x89\x84\xdf\x2b\x28\x94\xcd\xa1\x2c\x4b"
+ "\x80\x72\xca\xf0\xd9\x6d\x7e\xd0\x70\x51\x69\xaf\xc0\xff\x9d\xc5"
+ "\xbb\xec\xd4\x64\xaf\xc7\x7e\xb6\x25\xfd\x0d\xd2\x0c\xbf\xbb\xa8"
+ "\x6c\x36\x6a\x9f\x50\xd1\x66\xfc\x6d\x36\xc6\xa8\x5d\x55\xca\xda"
+ "\xea\x2a\xc5\x45\x65\x59\xa2\xbb\xb0\xb9\x14\xd2\x65\x6e\x73\x59"
+ "\x02\xcb\xff\x41\xd0\x93\x8d\x99\xf0\xbf\x8b\x4f\x2f\xda\xe5\xf4"
+ "\xfc\x0f\x77\xa7\x3b\xbf\x49\x8b\x77\x65\x16\xe9\xe0\x9f\xb3\xe3"
+ "\x08\xbb\xab\x89\xf6\x09\x42\xda\xa4\x86\xb7\xef\xac\x22\x12\xcb"
+ "\x13\x58\x6e\x43\x52\x46\x15\xe5\xb4\xe9\x11\xf0\x7d\xc3\x8a\x9e"
+ "\xef\x8e\x69\x2e\xc4\xf3\x53\x69\xde\x0a\xd9\xce\x37\x08\xc1\xdf"
+ "\x62\xd9\xb6\x8f\x26\xb2\xe2\x37\x88\x1c\xeb\xd8\x99\x67\x28\xf4"
+ "\x9c\x43\x87\xbf\x91\x02\xfd\xf4\xe9\x19\x54\x94\xf7\x12\x37\xab"
+ "\x8f\x9c\xf1\xd4\x50\x65\x97\x3c\xb6\x1b\xe9\xb5\x37\xf3\xbc\x54"
+ "\x0a\xef\x15\x28\x4f\xcc\x9f\x9a\x9b\xea\xf0\x19\xcf\xb9\x53\x55"
+ "\x11\xa9\x36\x3d\xa6\x92\xf1\xc8\x5e\x8f\xf9\x20\x3d\xcd\x3f\x8e"
+ "\xff\xef\xa5\x66\x9e\xc7\x3a\xed\x4a\x12\xd7\x2c\x5d\x7d\xaf\xdb"
+ "\xac\x46\xfe\x41\xbb\x53\xab\x81\xde\xc1\xf3\xdb\xdc\x68\xb0\x4b"
+ "\x57\xeb\xe0\x9d\xba\xe7\xec\x4b\xc6\x67\x09\xd0\x69\x3b\xf3\x56"
+ "\xcf\xb3\x4b\xe6\x56\xf2\x72\x4e\xa5\x47\xf1\x8c\xcd\x73\xa9\xd4"
+ "\x15\xef\x3a\xc1\x81\xae\x22\xf0\x3e\xcd\x4e\xe6\x96\x7a\xea\xc8"
+ "\x64\xdf\x93\x8f\x12\x9f\x1d\x4a\x3e\x9f\xdd\xfe\xf2\x81\x6f\x27"
+ "\x2d\x70\x69\x25\x5d\x17\x68\xdd\xd6\x67\x91\x8f\x84\x76\xa5\xd2"
+ "\xea\x4d\xd3\xa8\x33\xff\x33\x42\x6a\xf4\x8d\x04\xda\x7c\x74\xa4"
+ "\x84\x3a\xe2\xd7\x13\x55\xa4\x41\x45\x8f\x54\x35\x92\x8d\xd3\x68"
+ "\x2b\x9e\xfb\x5b\xdb\xd1\x42\xd2\x6c\x44\x91\x51\x43\xa2\xd2\xa6"
+ "\x51\x47\x75\x62\x23\x61\xe9\x35\x24\xa3\x89\xc8\x36\x1e\xa2\xce"
+ "\x99\xa0\xff\x3f\x69\xc4\xf4\x16\x82\x67\x54\x66\xb4\x52\x57\xfa"
+ "\x8b\x44\x81\xff\xd7\x1c\xc2\xf4\x7f\x91\x8c\xd3\x44\x16\x6f\x74"
+ "\xa8\x4a\xe0\x9b\xf8\xfb\x9d\x50\x16\xee\x02\x3d\xb0\xf5\x02\x21"
+ "\x1b\x9f\x27\x9a\xb4\x85\x04\xfc\x40\x42\xad\xae\x3f\x91\x78\x37"
+ "\x05\xfb\x72\x98\x6c\x5a\x4e\xe4\xf1\x2e\xdc\xc7\x76\x8c\xe0\xb9"
+ "\xdf\x3b\x81\x16\xea\x66\xc1\xba\x6d\xfc\x82\x68\xf0\x1c\x74\xf6"
+ "\x9b\x83\xc2\x6f\xbe\x20\xc8\xb3\x8b\xca\x67\x2b\x9c\xe6\xe7\x62"
+ "\xa1\xee\x06\xe4\x01\x7c\xa7\x8e\xc3\xdf\xc1\xef\xb7\x26\xf3\x3c"
+ "\x90\x2c\x70\x11\x90\x79\x63\xc2\x02\xa3\x85\xcf\xd7\x2e\x4d\xde"
+ "\xbb\x33\x99\x2f\x93\x0f\x6d\xbc\x8b\x9e\x73\x28\x1b\x01\xf7\xc9"
+ "\x47\xe3\x8d\x0f\x53\xfc\x2d\xc8\x32\xba\x33\x6f\x4d\x94\x87\xdf"
+ "\x1e\xb9\xd8\xa5\x6b\xe4\x20\x8b\xe8\x08\x03\x91\xc1\xfb\x09\x76"
+ "\xc9\xfc\x6d\x22\xac\x61\x1b\x1a\xee\xa1\x15\x68\x12\xec\x92\x79"
+ "\x8d\x22\x1a\xc4\x57\x0f\x0d\xbc\x37\xda\x25\x2f\xb6\xb0\x6f\xac"
+ "\x99\x88\x34\x82\xee\xf7\xd0\x46\x50\x93\xdc\xe1\x56\xda\xed\x54"
+ "\x4a\x9d\x80\x47\x23\x3d\xa7\x51\xcc\x74\x51\x27\x67\x3e\x8e\x7a"
+ "\x5e\x81\xe7\xba\x32\xfa\x94\x91\xf0\x3e\x53\x9b\xca\xff\x1f\x8d"
+ "\xdf\xa1\xa6\xb2\xcc\x9e\x77\xd9\x64\x18\x2d\xde\x55\x07\xb6\x43"
+ "\x1d\x5f\x45\x9d\xd0\xd6\xeb\xf2\x93\xd1\x76\xd8\xeb\xb0\x5d\x73"
+ "\xca\xc6\x5c\xe7\xf6\x66\x6c\xf3\x13\xb0\x8d\x50\xd3\x71\x83\x50"
+ "\x8e\xb7\xb1\xdd\x30\x5d\xb3\xc6\xee\x86\x3c\xa0\x4c\x1d\xf0\x6e"
+ "\x58\xb3\x34\x65\x36\xee\x27\xa5\xa6\x91\xe3\xd9\xb9\x97\x29\xcf"
+ "\x33\xfc\xca\x1d\x3e\xcf\x52\xbe\xcd\xef\x05\xdf\x26\x01\xf5\x03"
+ "\xa4\xaf\xf7\xb6\x61\x9e\x6f\x52\xa6\x8b\x8e\x67\x32\x3d\x12\xc1"
+ "\x01\x9d\xa4\x59\x68\x8f\x17\x95\xea\xa8\xce\xbc\x14\xc0\xff\x4f"
+ "\x63\x7c\xda\x49\xfe\xb0\x5c\x3c\x63\x13\xca\x12\x01\x79\x7e\x0a"
+ "\xf7\x11\x70\x3f\xf6\x51\x15\xca\x9b\xcf\xf7\x1a\xfc\x7f\xfb\xf5"
+ "\xd4\x31\x65\x2a\xc1\xf3\x34\xa1\xbd\xa5\xb4\xd9\x49\x2e\xaf\x23"
+ "\xb6\xe0\x39\xa3\x90\x86\x34\x9d\x79\x6b\x65\x76\xb2\x65\x9b\x90"
+ "\xff\xde\x0e\x28\xab\x6f\xfe\x6b\x6f\x65\xf9\xb3\x7c\x31\x3f\x4f"
+ "\xde\xc5\x6f\xd2\x36\x96\xf7\xda\x69\x9e\xbc\xcd\x90\xe6\xc9\x7f"
+ "\xca\x8a\x9e\x6f\xe8\xe1\x1b\xd1\xe2\x3a\x14\xbe\x49\x3b\xb6\xf3"
+ "\xe7\x89\xae\xdd\x6c\x27\xc5\x55\xf8\x2e\x17\xd2\xf0\xb7\x22\x5c"
+ "\x45\x7c\x34\x0d\xf2\x38\xc4\xe7\xb1\xd7\x4e\x8a\x66\xf5\xd2\x71"
+ "\x4a\x8f\x8e\x13\xf2\xaa\xf3\xe4\x25\xca\x47\xc0\x53\x54\xab\x20"
+ "\x57\xcc\x57\x81\xf9\x76\xe6\xa5\x12\x3b\x79\x7d\xb7\xb8\xee\xc0"
+ "\x73\x99\xf0\x2e\xda\x2e\x79\xa8\xc5\xb7\x1d\xac\x96\xd3\x7c\x7b"
+ "\x2b\xea\x38\x21\xaf\x7b\x51\x5f\x7b\xde\xe3\x19\xa4\xa0\xd7\xc7"
+ "\x63\x5b\xe2\x75\xbb\xb9\x31\x11\xf2\x59\xdc\x4b\x97\xcb\x90\xce"
+ "\x9d\xb7\x62\x61\x31\x9e\xc1\x7a\x3d\x6d\x05\x9a\x5c\x9f\x73\x47"
+ "\xa5\xe4\xa7\x90\xd6\x73\xfe\x69\x3e\xd0\xd8\xa5\x2b\x02\xc6\x77"
+ "\x4c\xbf\x89\x48\xad\x40\x0d\xbe\x35\x62\x6e\xb2\x35\xba\x83\x58"
+ "\x8b\x38\xc2\x95\xbc\x43\xe2\xd2\xa9\xe5\xa4\x74\xdd\x18\x3c\xcf"
+ "\x3a\x34\x7b\x9d\xca\xce\xff\xec\x02\x9f\x33\xed\x6e\x82\x36\xfa"
+ "\x8c\xd4\x38\xdd\xea\x68\xe7\xdb\x1d\xfc\xcf\xfb\x03\xbf\x02\x1f"
+ "\x15\xfd\x54\xe8\x1b\xe8\x0b\xa4\xcc\x57\xe5\x80\xb6\x04\xd3\xd1"
+ "\x8f\x05\x1d\xba\x53\xf4\x8e\x96\xec\xaa\x64\xbc\x33\x4a\x78\x5b"
+ "\x81\xe5\x75\xfd\xcc\x82\x65\xe6\x8a\x76\x55\x62\x1d\x32\x8c\x94"
+ "\xb3\xba\x3a\x2d\xa8\x67\xb5\xa9\xe8\x63\xaf\xfb\x22\xbe\x98\x50"
+ "\xae\x78\x57\x65\x68\x75\x58\xc7\x9f\x3d\x0e\xfd\x88\x33\x8e\xb1"
+ "\xbb\xf0\x8c\x65\xe9\xd6\xf4\x61\xf2\xc7\x8a\xa8\xe5\xdc\xb8\x77"
+ "\x40\xc6\x46\xe2\x39\x67\x37\xb4\x7c\x8d\xc4\x53\xf7\x12\xa1\xee"
+ "\xf0\x2d\xbe\xcf\x76\x67\x21\x7f\xfe\x37\x3c\x1b\x27\x06\x92\x17"
+ "\xe8\x98\x56\xfc\x2d\xd4\x3d\x6e\xa7\x87\x4f\x2e\x07\x9e\x7f\x7e"
+ "\xed\x29\xa9\xb1\x26\x3e\xcd\x42\xf8\x98\xfe\xe6\xe3\xad\x21\x96"
+ "\x8b\x1f\xff\xaa\x85\x3e\x4c\xbc\xeb\x03\xca\x74\xa2\xf1\xfc\x4c"
+ "\x21\x3f\x7c\xe7\x91\x55\x89\xd0\xb7\x08\xe3\x1b\x01\xc7\x3f\x44"
+ "\xf5\x52\xf7\xad\xd7\xfa\x77\xc3\xaf\xd7\x7a\x43\xdf\x7a\xad\xaf"
+ "\x19\xda\x7a\xad\x0f\xb8\xfe\x59\x54\x2f\x6d\xdf\x7a\x6d\xd8\x14"
+ "\x7e\xbd\x36\x4c\xeb\x5b\xaf\x0d\xef\x0e\x6d\xbd\x36\x04\x5c\xff"
+ "\x20\xaa\x57\x6c\xdf\x7a\x6d\x9c\x13\x7e\xbd\x36\x6a\xfb\xd6\x6b"
+ "\xe3\xa6\xa1\xad\xd7\xc6\x80\xfb\x7f\x03\xea\xc3\xfc\xa6\x58\xa6"
+ "\x0f\xd3\x6e\x0d\x5d\x1f\x6e\xec\xe8\xab\x0f\x37\x3d\xef\xd5\x87"
+ "\x9b\xa6\x86\xa5\x0f\xf3\xcb\x04\x7f\x63\xd3\xb5\x7d\xf4\xa1\xa9"
+ "\xcc\xe0\x5f\x1f\xa6\x9d\xe6\xf5\xa1\xb9\xcc\x10\x5a\x1d\xd2\x2a"
+ "\x7b\xf4\xa1\xb2\xcc\xe0\xa3\x0f\x23\x9b\x62\x3b\xf3\x36\xa9\xc3"
+ "\xd3\x87\x9b\xd4\x7d\xf5\x61\x9a\xc1\x57\x1f\x6e\x9a\x16\x18\x87"
+ "\x8d\x7a\x7f\xfa\x30\xde\x75\x96\x32\x6c\x34\xea\x43\x2c\x4f\x69"
+ "\x3f\x98\x77\xf4\xff\xad\xe3\x8e\xd0\xbe\x95\x1e\x70\xfd\x07\xf4"
+ "\x63\xd5\xe0\x83\xa8\x37\xbd\x4d\xa4\x27\xd3\x88\xb4\x36\xba\x1e"
+ "\xfa\x08\x4e\x72\x87\x01\x30\x91\x4d\x26\xd7\x16\xb5\x91\xda\xe8"
+ "\x93\x84\x2a\x47\xaa\xe9\x6f\xf6\x65\xc6\x25\x23\x36\xd3\x0f\x5b"
+ "\x53\x9c\x21\x62\x33\xbd\xc0\x83\xcd\x5a\x17\x60\x33\x15\xf1\x98"
+ "\x71\xde\xda\x76\x4a\xc0\x26\xf4\x68\x3c\xf2\xc9\x66\xf8\xf4\x8b"
+ "\x4d\x68\x13\xbe\xd8\x3c\x6e\x67\xd8\xcc\x78\xaf\x2f\x36\x8f\xdb"
+ "\xfd\x63\x33\x63\x0b\xc3\xe6\x71\x7b\x68\x75\xc8\x98\xed\xc5\xe6"
+ "\x71\xbb\x0f\x36\x7f\xb4\x2f\xb3\x33\x2f\x63\x6f\x78\xd8\xcc\xd8"
+ "\xeb\xa9\x7b\xb1\x50\x77\x48\x53\xf8\x62\x33\xa3\x25\xa0\x0c\x73"
+ "\xcf\xcf\x02\x7d\xa8\x38\x25\xcd\xdc\xef\x06\x9f\x96\x33\xc5\xe9"
+ "\xa1\x4f\xd6\x89\xe7\xc9\x53\xe9\x04\x42\xd7\xe9\x14\x9d\xd0\x37"
+ "\xee\xec\xd4\xcb\x69\xa4\xfc\x2d\xda\xad\x21\x50\x76\x15\xed\xd4"
+ "\x45\x02\xcf\x62\xe0\x3e\xba\x38\x95\x44\xc1\xa5\x29\x16\xf8\x0a"
+ "\xff\xc7\xd2\x75\x9a\x51\xf9\xa9\x64\xbc\xaa\x83\xc8\xa1\x0c\x09"
+ "\xaa\x2c\x35\x51\xb9\x48\x14\xfe\x4f\xb3\x4f\xe8\xa0\xef\x26\xc3"
+ "\x71\x51\x4e\x09\xdf\x33\xaa\x28\x5d\xa3\x23\xd0\x8f\x93\x83\x0c"
+ "\x34\x3b\xa5\xb4\xc2\xbd\x4e\x27\xa5\x91\xf6\x7f\xd3\x8d\x09\x7c"
+ "\x99\xb8\x98\x7d\x16\xc0\x90\x85\x66\xe8\xf1\xbb\x71\x78\xae\x31"
+ "\xfd\xd1\xbe\x43\xb4\x53\x33\xca\x7c\x81\x8c\xdf\x99\x4a\x62\x4a"
+ "\x52\x89\x8e\x76\xeb\xa4\xc0\x83\x84\xf9\xab\xd5\x28\xf7\x04\x2a"
+ "\x85\x6f\xa5\xc2\xb7\x5c\xd8\xff\x83\x6f\xb9\xe0\x5b\x67\xe1\x5b"
+ "\x67\xe0\x5b\xd9\xf0\xad\x6c\xf6\xad\xd0\x78\x9e\xa5\xed\x6f\xfc"
+ "\x3a\x7e\xd3\x38\x8c\xb3\xfb\xa5\xca\x38\x62\x1a\x8e\x65\x9f\xdb"
+ "\xa8\x0f\x11\xef\x59\x99\x81\xf2\xdf\xfa\x3e\x89\xa6\x8a\x49\xfa"
+ "\x99\xaf\x9d\xa0\xd8\xc7\x7e\xed\x7d\x32\x1e\xdb\x5c\xad\xf3\x34"
+ "\xb4\xb3\x49\xfa\xc3\xba\xb6\x50\xbf\x15\x70\xfd\x73\x5e\x36\xad"
+ "\xeb\x8e\xc6\x7e\xa1\xdd\xb9\x55\x4a\x8d\x5d\xd1\xbb\x1c\x1f\x1f"
+ "\xed\x22\x0b\x8c\x38\x5e\x4e\x8d\xda\x17\x88\xbc\x59\x9a\x5b\x9a"
+ "\x61\xc3\xb1\xc7\x6c\x83\xef\xd8\x63\xf6\x36\x22\xdd\x0c\x5f\x79"
+ "\x4d\x4f\xa4\x39\x0e\x02\x74\xbd\x2e\x5d\xfc\x9e\x71\x24\xdd\x45"
+ "\xbf\x84\xfe\x6c\x55\x3e\xf4\x83\xe3\x6f\x95\xd8\x2d\xa9\x38\x16"
+ "\xb7\xf9\x2e\xe0\xdf\xbf\xc1\x06\xa9\xf0\x7f\xcc\xcf\x90\x4c\xae"
+ "\x3b\x25\xdd\x1c\xab\xea\x18\x31\xcd\xa5\x68\xd2\xb8\xa0\xff\xd6"
+ "\xad\x69\xce\xbc\x68\xb2\xd7\x75\x63\x9f\xf6\x25\xd4\x03\xaf\xde"
+ "\xaa\x92\x64\x42\xbf\x35\x4e\x4f\xa9\x06\xc7\x97\x13\x8a\xe0\x42"
+ "\xd9\xf3\x72\x8f\x8c\x9c\x82\xf8\x40\x2c\xee\x64\xe9\x6a\xc4\xe3"
+ "\x56\xc1\x66\x3b\x22\x6e\x4b\xc4\x36\xe0\x86\xdf\x67\xfc\x8b\x44"
+ "\x5b\x1b\xdd\x04\x30\x9d\xb0\xc0\x2d\xc7\x76\x94\x60\x79\xe1\x33"
+ "\x72\xd2\x40\xa4\x19\x5f\x13\x25\x60\x48\x81\xed\x81\x83\xf6\x10"
+ "\xdf\xa8\x72\x42\xbb\xe6\xd2\xcf\x13\x15\xea\x09\x8c\xe1\x6c\x85"
+ "\xde\x28\x77\x56\x17\xb9\x63\x25\x89\x72\x9d\xd5\x8f\x76\x9c\xd5"
+ "\x5f\xb7\x9d\x23\x51\x91\x06\xa2\x2e\x5e\x09\xd8\x5d\x05\xed\xe3"
+ "\x0c\xb4\x8f\x36\xd6\x3e\x7a\xf0\x9a\x43\x77\xe3\xfe\x20\xbe\x6d"
+ "\x98\x85\xb6\xb1\x0e\xf0\x9a\xea\x6d\x1b\xae\x55\x3a\x69\xb1\x94"
+ "\x12\x28\x23\xf0\x3d\x2b\x71\x67\xfa\x08\xd4\xfb\x06\x3a\xee\x9d"
+ "\x44\xd0\xbb\x50\x57\xea\xfa\x3d\xc8\x62\xd8\xad\x52\x2d\xf4\xf9"
+ "\x35\x1f\xcf\x6a\x25\xde\x3e\x5d\xee\xdb\x5d\x63\x77\x39\xb4\xcf"
+ "\xd0\xb3\xcd\xd2\xcd\x3a\x48\x97\x6b\x9f\xfd\xb1\x1a\xe4\xf8\x36"
+ "\xeb\x03\xe6\x96\xe2\x78\x82\x5d\xfa\x2a\xc6\x03\x22\x38\x87\xf2"
+ "\x09\x3f\x7e\xfa\x5a\x22\xd0\x12\x37\xf0\xdc\xa5\x28\xcb\xe4\x14"
+ "\xf6\x56\xcb\xcb\x5d\x7c\xdb\xec\x06\x19\x9c\x4c\x22\xd2\x05\x6d"
+ "\xc0\x1b\x37\xf0\xa6\x93\xd7\x19\xb3\x78\x9d\x61\x92\x6f\x4b\xb3"
+ "\x53\x2e\x7e\x71\x04\x05\xbe\xc8\x71\x0c\x69\xbe\x81\xd0\x4d\xa7"
+ "\x81\x47\x1d\xf5\xa8\x5f\x22\xb9\x75\x4c\x87\xec\x00\xfe\x28\xdb"
+ "\x88\x9a\xe6\x4f\x4e\x7c\x3f\xbd\x6a\x98\x1b\x70\x8e\x7a\x44\x95"
+ "\x25\x19\x09\xb2\x8a\x34\x61\x3b\x87\x76\xaf\xca\xe2\xf5\x1a\x2f"
+ "\x5b\xd7\x3a\xdd\xcd\xdd\xeb\x74\x5a\xb8\xc6\x79\x74\x0d\x9e\x1b"
+ "\x56\x8c\x7a\x26\x2f\xab\x0a\xf5\x8c\xd5\x68\x27\x2e\xe0\x65\x24"
+ "\xda\xa5\x75\xba\x68\x9e\xa7\xcb\x80\xa7\x4b\x89\xfc\x4e\x27\x91"
+ "\x40\xb9\xd4\x50\x66\x52\xa3\x6f\x26\xc8\x63\x37\xb4\x23\xe4\x73"
+ "\x37\xea\x20\xc0\x1a\xf8\x29\x99\x4f\x2d\xd7\x92\xc3\xba\x63\x04"
+ "\xe3\x40\x65\x5c\xa4\x4d\x38\x7e\x6b\x85\xae\x02\x55\x36\x69\x90"
+ "\xb7\x76\xe9\x66\xf2\xf1\x2c\x27\x09\x8c\xe9\x9c\xaf\xbc\x98\xce"
+ "\xf9\xca\x8b\xe9\x9c\x56\x7e\xfe\x43\x84\xeb\x8b\x85\x80\x6b\x85"
+ "\x18\xd7\x39\x92\x4b\x8a\xeb\x99\xa1\xe3\x7a\xfb\x19\x11\xae\xd3"
+ "\xbf\x19\x5c\x7f\x92\xc0\xe3\x3a\xa2\x7b\x2c\xe2\x75\xb3\xcc\xea"
+ "\xfa\x23\xb1\x4b\x73\x8e\x7a\x70\x7b\xe4\xb7\x88\xdb\x5c\xcd\x95"
+ "\x8a\xdb\x8b\x9d\x3a\x2d\x5c\x43\x8e\x5b\xc8\x33\x68\xdc\x7e\x92"
+ "\xd0\x45\x3c\xfc\x43\xfc\x52\xd3\x24\xbd\x36\x83\x3c\x0c\x7c\x2b"
+ "\x55\x65\x8d\x23\x35\x8c\x87\xa5\xda\x67\x29\x07\x3a\xe2\x69\xc4"
+ "\x53\x57\x36\xa5\x9c\xa2\x31\x37\xe3\x53\xa2\x86\x6f\xd4\x59\x5d"
+ "\xef\x11\x95\x01\xe7\xa3\xca\x12\xa8\xf2\x39\x1d\x3f\x67\x25\x25"
+ "\x32\xce\x3c\xa9\x14\xc7\xae\x70\x6c\xd1\x6d\x6e\xaa\xe3\xcc\x37"
+ "\xc4\x71\xca\x67\x32\x71\x3e\x8b\x2a\x1f\x34\x74\xe6\xe5\x96\x7a"
+ "\xe6\x5a\xfc\xfb\x97\x4d\x75\xd0\x5e\x64\x27\xa5\x5b\x8a\xe1\x2e"
+ "\x85\xfb\x03\x70\x8f\x80\x3b\x7f\x6e\x5d\x68\x76\x2e\xf7\x28\x1b"
+ "\xc3\x6c\x8a\x11\xf4\xe0\x31\xbe\x0d\xde\x46\x94\xa7\x84\xff\x3b"
+ "\xf3\xb6\xc4\x7a\xe6\x6e\xbc\xf4\x3d\xfc\xa8\xc6\x6f\x03\x4f\x64"
+ "\x6c\x3e\x89\x3d\x8b\xf2\xab\xe1\x9f\x89\x4c\x0b\xf5\x2f\xc0\x79"
+ "\x5f\xc0\x92\xa4\x93\xea\x7f\x2a\xdc\x1f\x42\xac\xe2\x18\xec\x87"
+ "\x46\x66\x23\x3d\xdf\x80\xef\x96\xdb\xa5\xd9\xe3\xc5\xdf\xf5\xc7"
+ "\x0f\xbb\x74\x4b\xc0\x33\x7d\x42\xe3\xc5\x16\x7b\xa0\x7c\xa6\xea"
+ "\xdc\x34\xb4\xbc\xf2\x02\xee\xff\xa4\xd1\xbb\x2a\xe2\xcb\xdd\x16"
+ "\xae\x3b\x41\x75\x38\xed\x74\x88\x7e\x49\x5e\xc0\xfe\xaf\x5b\xd1"
+ "\x58\x1a\x7f\xeb\x38\xe2\x2e\xda\x55\x81\x63\x9d\xe8\x6b\xd5\xea"
+ "\x5c\x04\xfd\xad\x3d\x2f\xdb\xa5\xdd\xe0\x33\x46\x42\x7b\x9c\xd9"
+ "\xf1\x01\xdd\x7a\x0a\x7c\xd4\x75\x09\xaa\xfc\x97\xc9\x64\xd7\x59"
+ "\xcd\xa8\xd7\x41\x07\x75\x81\x3e\xe8\x3a\xab\x57\xd5\x1a\x9c\x84"
+ "\x2b\xde\x55\x61\x75\x55\x91\x9d\x40\x87\xfa\x17\xcb\x7b\xf1\x6c"
+ "\x42\x64\xde\x4a\x9c\xbf\x38\x4f\x2c\x2f\xfd\x16\xf4\xef\xeb\xaf"
+ "\x0d\xdb\x04\x3a\x07\x74\x06\xaf\x87\xc3\xd0\xc1\x5d\xaf\xde\x96"
+ "\xf8\xd4\x3c\xea\xac\x6d\xfc\x8c\x64\xd4\x10\x75\xc6\x5a\xa2\xc4"
+ "\xfc\xad\xae\x1a\xa6\x97\x9f\x07\xbd\x0c\xcf\x25\x22\xbd\xcc\xaf"
+ "\x2f\xe8\xa5\x97\xd1\xff\xae\x6d\x69\x25\x91\x1d\x64\xc4\xcc\x0e"
+ "\x95\x33\xbd\x83\x72\xe8\x8f\x5b\x5d\xa7\x71\xef\x71\xa4\x47\x47"
+ "\xbf\x05\x7e\x47\xf7\x2a\xa6\x9f\x8b\x05\xfd\xfc\xd6\x99\xc1\xeb"
+ "\xe7\xb7\xb2\x41\x3f\x83\xbf\xb7\x1d\x75\x33\xe8\xe5\xbd\x27\x1d"
+ "\x52\x17\xe8\xe2\xd0\x64\x6b\x0a\xb8\xfe\x63\x26\xd8\x4f\x94\x29"
+ "\x62\xa7\xa6\xdc\x85\xeb\x11\xbe\x74\x47\x7e\xee\x40\xfb\xd8\x05"
+ "\xb6\x71\xcf\xcb\xf5\xd2\x48\x23\xc8\xd6\xf0\x01\x75\xad\x49\x50"
+ "\xd1\xee\x04\xa5\xdb\xd4\x58\xea\xea\xd6\xc8\xbb\xbb\x41\xbe\xa0"
+ "\x2f\xc0\x5e\xa9\x1d\x1b\xf5\x3c\x4f\xb8\xb1\xbb\x2a\xb8\x9c\xa5"
+ "\x15\x60\x9b\x26\x96\x9c\x21\x13\xa8\xb9\x5e\xed\x32\xd7\x47\x77"
+ "\x9b\xeb\xa3\x00\x97\x91\x17\x4d\x28\xf3\x8b\x16\xce\x5c\x1f\xcb"
+ "\xe5\x37\x38\xdc\xca\xc6\x52\x87\xb2\x5e\x03\xcf\x3a\x6e\x23\xe0"
+ "\x60\x03\xe1\xe7\xb4\xb4\x33\xd1\x0e\x9b\xcd\xfe\x70\xb0\x3d\x3b"
+ "\x34\x5b\xfc\x54\x02\xe0\xa0\x1e\x70\xf0\xb5\x18\x07\x07\x89\x2b"
+ "\x5b\xb0\xd1\x73\x18\x16\x80\xef\x7c\x5f\xa6\xc7\x4e\x3f\xf3\xb1"
+ "\x7f\x3c\x34\x06\x87\x87\xae\xb3\xbe\x78\x28\x0a\x13\x0f\x60\x5f"
+ "\x35\x25\xd0\x6f\xba\x78\x56\x27\x2d\x42\x3c\x1c\xf3\xe2\xe1\x77"
+ "\xff\x70\x48\xbb\x43\xc6\x43\xbe\x21\x34\x3c\xd4\x1b\x06\x87\x87"
+ "\x65\x72\x11\x1e\x0a\x00\x0f\x45\x80\x87\x6d\x5e\x3c\x9c\x47\x3c"
+ "\x54\x88\xf0\x50\x08\xcf\xe5\x7d\xf1\xb0\xb5\xf8\xf2\xe2\x61\x58"
+ "\xfb\x77\x03\x0f\x05\x01\xfb\xbf\x01\xf0\x30\x48\xfd\xb0\x2c\xd1"
+ "\x8b\x07\x1b\xe8\x07\x1b\xe8\x07\x9b\x48\x3f\x9c\x06\x3c\xd8\x44"
+ "\xfa\xc1\x06\xfa\xc1\xe6\x47\x3f\xfc\xf2\xbd\xcb\x8b\x87\x6b\x9a"
+ "\xbf\x1b\x78\x78\xa3\x20\x34\x3c\xd8\x06\xab\x1f\x2a\x45\x78\x00"
+ "\xfd\x60\x03\xfd\x60\x13\xe9\x87\x2f\x10\x0f\x22\xfd\x60\x03\xfd"
+ "\x60\xf3\xa3\x1f\x7e\x75\xf0\xf2\xe2\xe1\xda\xcf\xbe\x1b\x78\xd8"
+ "\x16\x70\xfc\x3b\x00\x1e\x06\xa9\x1f\xf4\x6a\x2f\x1e\x1a\x40\x3f"
+ "\x34\x80\x7e\x68\x10\xe9\x87\x83\x80\x87\x06\x91\x7e\x68\x00\xfd"
+ "\xd0\xe0\x47\x3f\xfc\xba\xe6\xf2\xe2\xe1\xbe\xbc\xef\x06\x1e\xde"
+ "\xac\x08\x0d\x0f\x0d\x83\xd4\x0f\x7a\xbd\x08\x0f\xa0\x1f\x1a\x40"
+ "\x3f\x34\x88\xf4\xc3\x26\xc4\x83\x48\x3f\x34\x80\x7e\x68\xf0\xa3"
+ "\x1f\xfe\xeb\x8b\xcb\x8b\x87\xb9\x8f\x7e\x37\xf0\x50\x68\x19\x08"
+ "\x0f\x1e\x2c\x20\x2e\x10\x0b\xdd\x19\x09\x04\xfb\x19\x7b\x4e\x31"
+ "\x3c\x20\x0e\x78\x4c\x9c\x4b\x50\xb9\x01\x0b\xae\x8d\x80\x85\x2e"
+ "\x86\x05\xe4\x05\xe2\x01\xfb\x15\xd8\x9f\x40\x4c\xb8\xa1\x4f\xe1"
+ "\x52\x42\x9f\x22\x4b\xa6\x41\x1c\x74\x29\x06\xe8\x57\x74\x11\xbe"
+ "\xef\x87\x7d\xbc\x33\xd2\xed\xff\xf2\x87\x83\xb7\x42\x1c\xe3\xeb"
+ "\xe9\x5f\xfa\xe0\xe0\xb0\x17\x07\xcf\x07\xe8\x57\x3c\x1b\x00\x07"
+ "\xf6\x20\x70\x70\xa6\x6f\x3f\x73\xb0\x38\xe8\x5a\x25\xe0\x00\xfb"
+ "\x99\x9c\xd0\xcf\x7c\x09\xfa\x99\xca\x50\x71\xf0\x56\x55\x78\x38"
+ "\xb0\x19\x42\xc3\xc1\xb2\x4a\xf4\x13\x18\x0e\x6c\x45\x2e\x25\xf8"
+ "\x0a\x3e\x38\xe8\xc7\x5f\xf0\xc1\xc1\x8e\xd3\x97\x17\x07\xbd\xfc"
+ "\x85\xff\x58\x1c\x14\x05\xdc\xff\xcb\x81\xdc\x51\xdf\xe3\xb8\x3d"
+ "\xee\x33\x89\x74\xb0\x71\x23\xdc\x6f\xb2\x75\x25\x89\x41\x1b\xe1"
+ "\x5e\x97\xa0\x32\x9d\x21\x93\xb7\xac\x24\x32\xd7\x1a\x90\x7f\x32"
+ "\x91\x75\x49\x09\xe9\x5a\xa3\x57\x55\xb7\x38\xd8\x18\x12\xae\x47"
+ "\x05\xfa\x6e\x13\x1b\x43\x72\x9f\x4b\x88\xdc\xd2\xce\xd6\xc0\x5a"
+ "\xe6\xef\x02\xd9\x16\x1f\xf1\x27\xdb\x1d\x21\xe8\xfa\x2e\xb1\xae"
+ "\x3f\xed\x2b\x5b\xb1\x9e\x2f\xca\x16\x8d\x21\xcd\x0c\x30\x86\x14"
+ "\x84\x4c\xf9\xb1\xfd\x33\x4c\xcf\xf7\x8c\x21\x0d\x72\x8c\xbf\x1b"
+ "\x74\xfc\x5b\x52\x5f\x1d\x1f\x9e\x4c\x4b\x76\xf7\x37\xee\x88\xed"
+ "\x1b\xdb\xb5\xa7\x4d\xf7\xd8\x78\x6c\xc7\x20\xef\x8b\xa6\xcf\x3b"
+ "\x78\x5b\xbf\xd1\xdb\xa6\xb1\x2d\x63\xbb\xc6\x76\xcc\xdb\x7a\x8c"
+ "\x49\x9c\xa3\xb7\x94\x88\xc6\x8e\xdc\x4a\x41\xcf\xfb\xd1\xf1\x5c"
+ "\xbf\x3a\x7e\xa7\x5f\xf9\x7f\x1b\x74\x3c\xe2\xc0\xd3\xbe\xaf\xbc"
+ "\xb6\x5d\x1a\x78\xfd\x57\x50\x38\xa8\x4f\x19\x18\x07\xf5\x06\x2e"
+ "\x67\x79\x94\x08\x07\x05\x80\x03\xd0\xf3\x6c\xcc\x88\xe1\xc0\x3b"
+ "\x66\xc4\xf5\x1e\x33\xf2\xc1\xc1\xdb\x9f\x5e\x5e\x1c\xf4\x1a\x33"
+ "\xfa\x8f\xc5\xc1\xae\xfd\x83\xc4\x41\x10\xfa\xa0\x1e\xf4\xc1\x72"
+ "\x7d\x89\x68\xac\xc8\xad\xb4\x81\x3e\xb0\x89\xf4\x81\x77\xac\x88"
+ "\xeb\x3d\x56\xe4\x83\x83\x77\x6c\x97\x17\x07\xbd\xc6\x8a\xfe\x63"
+ "\x71\xb0\xfb\xc0\xe0\x70\x60\x0b\x42\x1f\xd8\x50\x1f\x1c\x10\xe1"
+ "\x00\xf4\x81\xe0\xf7\xf9\xf1\xf9\xb8\x7e\x7d\xbe\x77\x9b\xbe\xad"
+ "\x3e\xdf\x95\x8d\x83\xdf\x04\x9c\x2b\x0d\x12\x07\x41\xe8\x03\x1b"
+ "\xe8\x83\x97\xd5\x25\xa2\xb1\x21\xb7\xb2\x01\xf4\x41\x83\x48\x1f"
+ "\x78\xc7\x86\xb8\xde\x63\x43\x3e\x38\x28\xfb\xea\xf2\xe2\xa0\xd7"
+ "\xd8\xd0\x7f\x2c\x0e\xca\xab\x07\x87\x83\x86\x20\xf4\x41\x03\xe8"
+ "\x83\x97\x17\x8b\x70\x00\xfa\xa0\x01\xf4\x41\x83\x48\x1f\x78\xc7"
+ "\x84\xb8\xde\x63\x42\x3e\x38\xd8\xf3\xf5\xe5\xc5\x41\xaf\x31\xa1"
+ "\xff\x58\x1c\xfc\x36\xe0\xba\x0a\x0f\x06\x7a\xc6\x00\xa8\x17\x07"
+ "\xbc\xec\xd7\x24\xa8\xba\x14\x9f\x77\x78\xfa\xff\xa6\x3e\xfd\x7f"
+ "\xbd\x25\xe0\x38\x50\xaf\xf9\x65\xbe\x6f\x90\xff\xb9\x83\xf5\x13"
+ "\x1a\x4b\x51\xfe\xaf\x6f\x60\xfd\x44\xed\xb3\x28\xff\xdf\xf9\x97"
+ "\x7f\xa8\x63\x82\x8b\x41\xfe\x2d\xfd\xc8\xff\xc5\x00\xfd\x84\x17"
+ "\x06\x27\x7f\x5c\xef\xd8\x7d\x76\x08\xe5\xef\x19\x13\xfc\x82\x48"
+ "\xdf\x1a\x54\x7f\x71\x6f\x40\xf9\xfb\x5d\x4f\x52\xce\xd6\x93\xe0"
+ "\x5a\x92\xda\xd6\x56\xb2\xe5\x02\x51\x47\x26\x31\x4c\xf0\x6b\x4a"
+ "\x00\x13\xa6\x53\x64\xb2\x8b\xd5\xad\x67\x4d\x09\xc6\x70\x67\x7a"
+ "\xc1\xc2\xaf\x29\xf1\x8c\x07\xf4\xac\x27\x99\x8f\xeb\x49\xde\x3b"
+ "\x36\xe8\xb1\x00\x5c\x4f\x92\x02\x32\xee\x00\x19\x9f\x47\xf9\x1e"
+ "\xf6\x69\xd7\x3e\x63\x00\x81\xd6\x91\x04\x33\xae\x73\x09\xd6\x91"
+ "\xf0\x63\x00\x43\xd2\xa6\xdf\x2f\x0f\xa8\xdb\x41\x8e\x28\x4f\xab"
+ "\xce\xc5\x8f\xeb\x7a\xda\xb8\xd5\x58\x47\xb6\x74\x11\xb5\x67\xfc"
+ "\xdf\x23\x53\xd4\xf7\x14\x70\x40\xcf\x26\x28\x51\xa6\xaf\xaf\x04"
+ "\x3d\xbf\xca\xab\xe7\xb9\xe1\x4b\x2b\x8a\x37\x80\x7e\xdf\x40\x26"
+ "\xf0\x3c\x8a\x6c\x70\xb0\xf1\x80\xc6\x52\x6c\xef\xd8\x9e\xa9\xb2"
+ "\x5e\xd7\x2d\xb4\x77\x26\xef\x1a\x82\x72\x66\x67\x7d\xfe\xfe\x08"
+ "\xb6\x3d\x94\x79\xa4\x20\xf3\x92\x00\x32\xe7\xe5\x2d\x51\x63\xdc"
+ "\x10\xdc\x67\xd6\x23\x73\xd7\xab\xa2\xf1\x1f\xb1\xcc\x85\x71\x1f"
+ "\x0e\xda\x72\x50\xeb\x87\x82\x94\xfb\x90\x8d\xef\x83\xdc\x4b\x04"
+ "\xb9\xf7\x8c\xef\x0f\x4a\xee\x15\x81\xf7\xbf\xf8\xc8\xbd\xde\x30"
+ "\x78\xb9\x2f\x93\xfb\x91\x7b\x81\x20\xf7\x6d\xd8\xcf\x07\xb9\x97"
+ "\x77\x0b\xeb\x46\xfa\xca\xfd\x0f\x1f\x5e\x7a\xb9\x0f\x6b\xff\x6e"
+ "\xc8\xfd\x8f\x01\xe3\x9f\xf5\x92\xfb\x10\xb4\xf7\x65\x89\x7d\xe5"
+ "\x6e\x13\xda\xbb\x2d\x0a\xfb\xf5\x54\x69\x13\xda\xfb\x69\x3f\x72"
+ "\xdf\xf7\x97\x4b\x2f\xf7\x6b\x9a\xbf\x1b\x72\xdf\x1f\x70\xfd\x87"
+ "\xaf\xdc\x6d\x43\xd1\xde\x2b\xfd\xc8\x5d\x68\xef\xb6\x6d\xd8\x8f"
+ "\x07\xb9\x0b\xed\xfd\x0b\x3f\x72\xff\xd3\x1f\x2e\xbd\xdc\xaf\xfd"
+ "\xec\xbb\x21\xf7\x3f\xe7\x06\x29\xf7\x21\x68\xef\x7a\x75\x5f\xb9"
+ "\x37\x08\xed\xbd\x21\x0a\xfb\xed\x54\xd9\x20\xb4\xf7\x83\x7e\xe4"
+ "\xfe\x7f\xf6\x5c\x7a\xb9\xdf\x97\xf7\xdd\x90\x7b\x65\xc0\xf5\x7f"
+ "\xbe\x72\x6f\x18\x82\xf6\xae\xd7\xfb\x91\xbb\xd0\xde\x1b\xb6\x61"
+ "\x3f\x1d\xe4\x2e\xb4\xf7\x4d\x7e\xe4\xfe\x97\xb7\x2f\xbd\xdc\xe7"
+ "\x3e\xfa\xdd\x90\xfb\x5f\x8d\x03\xcd\xd7\x7b\x64\xef\x19\xb3\xe1"
+ "\xe7\x67\xc1\xbf\xf7\xc8\x1b\x71\x80\x32\x47\x2c\x88\x65\xce\xaf"
+ "\xe1\x59\xc5\xd6\xf0\xa0\xdf\x4e\xa1\x2f\x4e\x87\xf3\xeb\x37\x74"
+ "\x7c\xbf\x5d\xf0\xe3\xa9\x44\xa6\x41\x5f\x3e\xb0\x1f\xff\xdf\xbf"
+ "\xf4\xc8\x3b\xdc\xbe\xdb\x40\xf2\xee\xdd\x27\xbf\x52\xe4\x2d\xee"
+ "\xbf\x0d\x8d\xbc\x0f\xe8\xc3\x93\xb7\xcd\x10\x9a\xbc\x6d\x05\x4c"
+ "\xde\xfc\x3a\x8d\x72\xaf\xbc\x6d\xdb\x98\xbc\x6d\x85\x81\xed\xf9"
+ "\xc1\xac\x4b\x2f\x6f\xdf\x31\xf9\xff\x5c\x79\xff\x2d\xa1\xbf\x31"
+ "\x18\x94\x35\xca\x7d\xeb\xcb\x24\xe6\xf5\x97\xd9\xd8\x8a\xeb\xac"
+ "\x06\x75\xbe\x0c\xe5\x8f\x7b\x7c\x22\x01\x03\x9f\x24\x38\x48\x57"
+ "\x67\x02\xc1\xbd\x3c\xb8\xee\xa2\x56\x6f\x27\x56\xe3\xc7\x64\x4b"
+ "\x32\x51\x57\x27\xb6\x93\x99\xe5\xb4\xdb\xda\x68\xc1\x3d\xde\x32"
+ "\xcb\x86\x8f\x09\x5d\xa5\x1b\x35\xbf\x83\x48\xcf\x48\x3f\x50\xe3"
+ "\xba\x8d\x3b\x3a\x80\x27\xb8\xdf\x07\x64\xbe\xe5\x0c\x21\x87\x53"
+ "\x08\xd1\x2e\x45\x59\x7f\xb0\x62\xd8\x5a\x3f\xfb\x7c\x42\x19\x97"
+ "\x11\x8f\xbd\xfa\x91\xf5\x0e\xe9\xd0\xac\xcd\xf0\xac\xcb\xf0\x19"
+ "\x97\x19\xec\xfe\xcb\x21\x5b\x9b\x61\x89\xeb\x6f\xbd\x0d\xca\x13"
+ "\xdb\xb4\x2b\x9f\x8d\xcb\x58\x8d\x55\x04\xd7\xd5\x60\x1b\x76\x9f"
+ "\xd3\xc8\x37\xa6\x40\x5b\xaf\x67\x6d\xfd\xf5\x76\xa0\x4d\x6c\x20"
+ "\x88\x0f\x26\xdb\x6e\x26\xdb\x76\x94\x6d\x03\xa1\x6b\x74\xa3\xce"
+ "\x48\x2d\xad\x28\x5f\x94\x6b\x86\x8d\xa8\x17\x60\x5c\x14\xd4\xf1"
+ "\xa0\xdf\x41\xce\x13\x77\xbe\x4c\x26\x60\xfb\x77\x9b\xeb\xa3\x5c"
+ "\x66\xb6\x46\x03\xf5\x7e\xb7\xa2\x49\x93\x97\x2c\xc8\xff\x05\x94"
+ "\xff\x87\x7e\xe5\xbf\x23\xdc\xb1\x77\x41\xfe\x61\xef\xeb\xf9\xa6"
+ "\xda\xfb\xaa\xa1\x6a\xef\xff\x13\x30\x26\x8a\x2f\x0e\xd8\x38\x4d"
+ "\x68\x38\xe8\xf4\x83\x83\xff\x71\xf8\xc1\x41\x01\xe8\x7d\x79\x2f"
+ "\x1c\x6c\x13\x70\x50\x08\xef\xcb\xfb\xe2\xe0\xa3\xb5\x97\x07\x07"
+ "\x41\xee\xe7\xf9\xd6\xe3\xe0\xd0\xac\x20\x71\x10\x86\x3e\x38\xeb"
+ "\x07\x07\x87\x9c\x7d\x71\x60\x03\x7d\xb0\x2c\xd1\x17\x07\x36\x41"
+ "\x1f\xd8\x40\x1f\xd8\xfc\xe8\x83\xc3\x9b\x2e\x0f\x0e\x82\xdc\xc7"
+ "\xf3\xad\xc7\xc1\xdf\x03\xda\x7f\x5f\x1c\xd8\xc2\xd0\x07\x27\xfc"
+ "\xe0\xe0\x7f\x89\x1f\x1c\xa0\x3e\xa8\xec\x85\x03\x41\x1f\xd8\x0a"
+ "\xd1\x3f\xec\x8b\x83\xff\x7d\xed\xf2\xe0\x20\xc8\xfd\x3b\xdf\x7a"
+ "\x1c\x54\x05\xdc\xff\xdb\x0b\x07\x61\xe8\x83\x0f\xfc\xe0\xe0\x88"
+ "\xbc\x2f\x0e\x1a\x40\x1f\xe8\xd5\xbe\x38\x68\x10\xf4\x41\x03\xe8"
+ "\x83\x06\x3f\xfa\xe0\x88\xf9\xf2\xe0\x20\xc8\x7d\x3b\xdf\x7a\x1c"
+ "\x7c\x1c\xb0\xff\xe7\x8b\x83\x86\x30\xf4\x41\x86\x1f\x1c\x7c\xa2"
+ "\xf6\x83\x03\xd0\x07\x7a\x7d\x2f\x1c\x08\xfa\xa0\x01\xf4\x41\x83"
+ "\x1f\x7d\xf0\xc9\xaf\x2f\x0f\x0e\x82\xdc\xaf\xf3\xad\xc7\x41\x75"
+ "\xc0\xfd\xdf\x62\x1c\x74\xf7\xf4\x17\x2a\x79\x1c\xe4\x6d\x60\x38"
+ "\xd8\x84\x38\x68\x65\xeb\x77\x4c\x02\x0e\x7a\xfa\x0a\x2d\xbd\x31"
+ "\x50\x13\xd5\x83\x81\xaf\xbc\x7d\x85\x6e\x90\x37\x3f\x1e\x24\xf4"
+ "\x13\x3c\xe3\x40\x7c\x3f\x01\xfa\x89\x79\xed\x82\xfc\xf9\x31\x81"
+ "\x1a\xff\xf2\x0f\xa1\x9f\xe8\xb3\x46\xa3\xb7\xfc\xaf\xf0\x7d\x3a"
+ "\x7d\xc6\x05\x6c\x83\x5d\x9b\x51\x1b\xa4\xfc\x3d\x7e\x41\xb0\xf2"
+ "\x3f\xe1\x47\xfe\x56\x3f\xf2\xb7\x15\x30\xf9\x2f\xab\xf4\xf8\x03"
+ "\x9e\x71\x21\xde\x1f\xe8\x23\x7f\xeb\x65\x92\xff\x95\xb9\x3f\x67"
+ "\xe8\xe5\x5f\x17\x50\xfe\x05\x52\xae\x02\xae\x4a\xb8\x2c\x70\x55"
+ "\xb9\xa5\x64\x6a\xb1\x94\xe3\xf7\xf3\x60\x0c\xf1\xe2\xec\x3e\xef"
+ "\x87\xd3\xe1\x8f\xcf\x40\x1a\x90\x21\x7f\x66\xab\x27\x0f\x9a\x47"
+ "\x90\x8f\x16\xa5\x24\x11\xe3\x5f\x21\xed\x08\x4f\x5e\xca\x2c\x12"
+ "\xe7\xc9\x0b\xea\x97\x09\x7c\xb7\xa8\xb2\xe2\x86\x03\x7d\x15\xcd"
+ "\xdb\x62\x07\x5a\x39\x9f\x67\x96\x2c\x1a\xe9\x3d\xb4\xee\x6c\x09"
+ "\xc6\x6c\xb2\xa8\x24\x40\xcb\xf2\x1c\x29\xd0\x69\xb9\x6c\xa2\xe5"
+ "\xcb\x29\x95\xe2\xf7\x7a\x97\x73\x94\x40\x17\x23\x2e\xa3\x32\x2b"
+ "\x8e\xcf\x4f\xa0\xb9\x86\x0e\xbf\x71\x8a\x50\x17\x9d\x98\xce\xfd"
+ "\x28\xc1\x3c\x3d\x74\x0a\x21\xaf\xf1\x3e\x34\xbb\x08\x51\x49\xb4"
+ "\xac\x7c\x46\x29\x11\xca\xa7\x44\x5a\xf7\xa8\xdc\xfd\x6e\x89\x2c"
+ "\x96\x93\x92\x58\x9f\xdf\xe4\x10\x9e\x5e\xa0\x8d\xe4\x69\x87\xbf"
+ "\x82\xb4\x13\x04\x9e\xcb\xc4\x3c\x17\xe8\x54\x1e\x3e\x8a\xdf\xb9"
+ "\xb3\xa5\x98\x17\xbe\x07\x5f\xeb\xe5\x4a\xa8\xc3\x64\x0f\x9d\xe7"
+ "\x7b\x56\xf0\x00\x78\x5a\x29\xb9\x4b\x90\xc9\xb5\x50\x8f\x38\x0f"
+ "\x1d\xc6\x51\xf3\xd0\x02\xae\xc7\xec\xf4\xf2\x66\xb4\x3b\x2f\x2f"
+ "\xc5\x9d\x25\x9b\xd2\x3b\x4f\x55\x96\xc4\x8e\x74\x35\xad\x7c\xde"
+ "\x20\xbf\x3c\x1d\xd0\x5f\x27\xf0\x68\x1a\x93\x89\xba\x47\x26\x6e"
+ "\xa9\x0b\xdf\x59\x4a\x58\x59\xa3\x04\xba\x19\x7d\xe9\x64\x62\xba"
+ "\xef\x31\x3e\x6e\x97\x03\x6f\x66\xf5\xa5\x95\x8b\x69\xaf\x67\xb4"
+ "\xa6\x72\xa0\x9d\xdd\x97\x56\x2d\xa6\xfd\x3e\xa3\xcd\xaf\x04\xda"
+ "\x04\x3f\x65\x1d\x2d\xa2\xd5\x30\xda\x82\x2a\xa0\x9d\xd7\x97\x56"
+ "\x2b\xa6\x1d\xc3\x68\x77\xa8\x81\x36\xb1\x2f\x6d\x9c\x98\xf6\x06"
+ "\x46\xfb\x46\x3d\xd0\x2e\xee\x4b\x9b\x29\xa6\xfd\x01\xa3\xdd\xd6"
+ "\x0a\xb4\xfa\xde\xb4\x3b\x99\x6c\x6f\x16\x64\x1b\xcd\x68\xdf\x74"
+ "\x02\x6d\x92\x9f\xba\x45\xf0\xf9\x32\xda\xb1\x8c\x36\xaf\x1a\x68"
+ "\x0d\x7e\x64\x21\xa6\x1d\xc7\x68\x7f\x17\x0d\xb4\x29\x7e\x64\x21"
+ "\xa6\xbd\x91\xd1\x96\xb4\x01\xad\xd1\x8f\x2c\xbc\xb4\xa3\x4a\x3b"
+ "\x80\x26\x0d\xea\x59\xe7\x87\xb7\xe2\x3c\x6f\x62\x79\xee\x72\x01"
+ "\x7d\xa6\x1f\xde\x8a\x69\x6f\x66\xb4\xef\xca\x80\x76\xb3\x1f\xde"
+ "\x8a\x69\x7f\xc8\x68\xcb\x14\x40\x9b\xdb\x97\x16\xda\x1b\xe3\xef"
+ "\xdd\x02\x7f\x63\x18\xfd\x9e\x28\xa0\x37\xf9\xe1\x2f\xe6\xe7\x69"
+ "\xb3\xb7\x30\xda\x62\x0d\xd0\x16\xf8\xe1\xaf\x98\xf6\x47\x8c\xf6"
+ "\xaf\x16\xa0\xdd\xe6\x87\xbf\x62\xda\x1f\x33\xda\xf7\x1d\x40\x5b"
+ "\xe8\x87\xbf\x62\x5a\x1d\xa3\xad\x40\xec\x14\xf9\x29\xef\xcd\x22"
+ "\xda\x5b\x19\xed\x1f\xed\x40\x5b\xea\x47\x1e\x62\xda\xdb\x18\xed"
+ "\x81\x0a\xa0\xdd\xed\x47\x1e\x62\xda\x9f\x30\xda\xfd\x88\xf5\x72"
+ "\x3f\xf2\xe8\xa1\x05\xbb\x30\xde\x3d\xea\xcf\x75\x3b\x91\x5e\x22"
+ "\xe3\xf7\x9d\x51\x29\x6f\xdf\x79\x5a\xc0\x89\x45\xd0\x77\xb7\xb3"
+ "\x3c\x2b\xb1\x5d\xf2\xb1\x09\x90\xa6\xc6\xc9\xeb\x23\xb0\x2f\xae"
+ "\x7b\x76\x7a\x75\xf7\x1d\x8c\xf6\x3d\xc4\xee\x7e\xb1\x0e\xa5\x52"
+ "\x99\x98\xee\x4e\x46\x57\x8d\x7a\xa1\xd2\x97\x4e\xee\xa5\x1b\x65"
+ "\xc9\x85\xf7\x07\x4a\x7a\xe9\x63\x28\xa7\x38\xaf\xbb\x58\x5e\xff"
+ "\x53\x00\xb4\x16\x5f\x3a\xd7\xdd\x22\xba\xbb\x19\xdd\xa1\x42\xa0"
+ "\x3b\xe4\x4b\xa7\x15\xd3\xdd\xc3\xe8\x6a\xb1\x6c\x55\xbe\x74\x71"
+ "\x62\xba\x09\xee\xbc\xbf\x97\xf2\xb4\x59\xb2\xea\xde\xfc\x03\x5e"
+ "\xdf\x2d\xb2\x69\xf7\xba\xf3\xaa\xca\x05\xda\x3a\x0f\x0f\x79\x3e"
+ "\x33\xcc\x4b\x05\xcc\xdf\xe7\xce\xfb\xb8\x42\xa0\x3b\x2a\xb6\x03"
+ "\x22\x5b\x7b\x3f\x1d\xf5\xb7\x52\xc1\x8e\xf2\x67\x20\x83\x7e\x6f"
+ "\xf4\xe7\x6f\x18\x6e\x23\xd7\x9c\x92\xda\x0c\xcc\xf6\x78\xce\xeb"
+ "\x6a\x60\xe7\x26\x17\xed\xaa\x8b\xef\xa0\x2e\x71\xda\x56\x29\xad"
+ "\xbb\xb3\x83\xc8\x30\x66\x2a\x55\xda\x9d\x76\x48\x77\x8c\xdd\xe5"
+ "\xe8\xcc\xb3\xa5\xd9\x25\x4b\xf8\xd8\x86\xf0\x7f\xae\x9d\xfc\xa6"
+ "\x1a\xff\xdf\x9a\x4d\x9d\xc0\x13\x09\x9e\xef\xb2\x13\xfe\xcf\x87"
+ "\x8b\x3f\x53\x05\xfc\x3a\x9a\x43\xe2\x2c\xa9\x2e\x72\xd2\x48\xa4"
+ "\x5c\x7e\x59\x81\x36\x19\xe3\x0a\xda\x8e\xd1\x75\xfa\xc9\x50\x96"
+ "\x0a\xf8\xee\xe2\x66\x78\xe6\xcb\x02\xf5\x07\xdb\xb8\xd7\x92\x8c"
+ "\xb1\x45\x1b\x46\x3a\x94\x4d\x15\xf4\xd5\xb9\x5f\x19\xd2\xc9\x8d"
+ "\xa7\xa4\x0d\xf2\x73\xa0\x1b\xce\xad\xd3\xff\x14\xf3\xe0\x94\x65"
+ "\x7b\x81\xe6\x10\xc6\x24\xa4\x85\xcd\x05\x2c\x5e\x61\x03\x1f\xcf"
+ "\x1d\xca\x53\x47\xa3\x77\x59\xb8\xae\xcd\x99\x78\x36\x9c\x25\xfd"
+ "\x14\x69\x16\xbd\x73\x8c\x69\xe6\x63\x19\x42\xfd\x2c\x6e\x93\xdc"
+ "\xc9\x29\xe4\x1d\xd4\x74\x9d\xc3\x9a\x64\x27\xec\x2c\x98\x06\x1b"
+ "\x8d\x7c\xde\xca\x99\xe4\x8d\x90\x6e\xb7\x76\x74\xf1\xe9\x90\x47"
+ "\x01\xfa\x9d\xe7\x14\x6a\x19\x35\xa9\xe5\x96\x1b\xba\x48\x8b\xb4"
+ "\x81\x6f\xe3\x98\x4e\xcd\xd7\x39\x90\x57\x9c\xf9\x3a\x7b\x84\x86"
+ "\xc8\xce\x29\xd5\xb2\xce\xbc\x86\x0a\xcf\x99\x24\x9e\x6f\x61\xbe"
+ "\x76\x21\x2f\x78\x5f\x67\x97\x4c\xb5\xb0\x38\x89\x0d\xf2\x7e\xd6"
+ "\x88\xa8\xa8\xb9\xac\xaa\x33\xef\x38\x01\xdf\xb2\x82\xc9\xe0\xb8"
+ "\xc2\x2e\x99\x6c\x12\xfe\xd7\xd8\x25\x0f\x77\x08\xff\xc7\xd8\x25"
+ "\x73\x9d\xc2\xff\x3d\xf1\x1f\xfd\xc7\xa3\x2c\x2b\x02\x9e\xef\xe7"
+ "\x76\x24\xc8\xd1\x2f\x46\x5f\x9f\x2a\xcb\x8a\xb4\xe3\xf0\x1c\xc2"
+ "\xe3\x55\xf0\xcd\xfd\xec\x2c\x80\xe3\x66\xb8\xab\x84\xbb\x43\xb8"
+ "\x53\xa4\xe1\x71\x15\xfd\x4e\x1c\x35\x1d\xcf\x45\x7e\xa7\xbb\x29"
+ "\x07\xf9\xd6\x03\xef\x5a\xad\xc6\x56\x81\xa7\xc7\xf9\x33\x90\x79"
+ "\x99\x82\xdc\xa9\xf2\xba\x56\xfe\x5b\xe6\xa6\x0a\x71\xb9\x80\x86"
+ "\xc4\xde\x75\xf7\x3d\x13\xee\xbd\xef\xfe\x89\x0f\x2c\x7c\x69\xd1"
+ "\xe2\x25\x4b\x97\xe9\x97\xbf\xfc\x4a\xd2\x8a\x95\xab\x0c\xab\x93"
+ "\xd7\xa4\xac\x4d\x5d\x67\x5c\xbf\x01\xe9\x7a\xea\xb0\x63\xca\xff"
+ "\x6f\xef\x7a\xc0\xa2\x3c\xce\xfc\x7c\xcb\x9a\x22\xc5\x82\x86\x10"
+ "\x6a\x4c\x5c\x0d\xf4\xc8\x9d\xc0\x62\x48\xa2\xd6\x36\x24\x35\x09"
+ "\xb9\x9a\xc6\xdc\x79\x57\xef\x4a\xee\xe4\x82\x06\x52\x44\x0b\x24"
+ "\xe2\xbf\x40\xd0\x5e\xd3\x3d\x95\x4d\xe4\x28\x77\x41\x96\x34\xd8"
+ "\xb3\x2d\xd7\x98\x0b\xf6\xe8\xd5\xf6\xb0\x92\x1e\x26\x44\x4c\x6b"
+ "\xee\xc8\x15\xec\x8a\x0b\x2c\xb0\xe0\x0a\xab\xa0\x20\x73\xbf\x77"
+ "\x66\x3e\xf6\xdb\x05\x8d\xf9\xdb\xe7\xb9\x87\xd1\xe1\xfb\xe6\x9d"
+ "\x99\xf7\xdf\xbc\xf3\xce\x3b\xb3\xb0\xa3\xf9\x4c\x0c\x74\xee\x07"
+ "\x9d\xb6\x04\xc1\x0f\x60\xd2\x26\xda\xe6\x99\x2d\x53\xeb\xb4\x25"
+ "\x06\x7b\x9f\x85\x74\x07\x58\xdb\x16\xba\xfb\x06\xf6\xa7\xb5\x54"
+ "\x3e\xd4\x40\x77\xa7\xb9\x4c\x6d\x39\x27\xbc\x0f\x35\xd0\xdd\x7d"
+ "\xc7\x62\xdc\x2c\x76\x21\xdd\xaf\xd6\xb6\x86\xea\x1d\x5f\x60\xac"
+ "\x11\x7d\xa7\xc2\xb9\x30\x92\xc5\xec\x8b\xe6\xde\xb2\x68\xee\x21"
+ "\xfc\x65\xe5\xdc\xed\xdd\x96\xc5\xf6\xa2\x0c\xbb\x8d\xec\x32\xb5"
+ "\x27\x1c\x43\xb4\x8d\x38\x7a\x5e\x55\x39\x77\xed\x8a\xe6\xae\x9d"
+ "\xe5\xdc\xe3\x88\xe6\xce\xd8\x32\x16\x3e\x6c\x6b\x73\x3a\x4d\x6d"
+ "\x4b\xc4\xbc\x42\xfd\x78\xd8\xef\x5a\x4b\x51\x97\x34\xc6\x42\x1c"
+ "\x28\x03\xe6\x3b\x66\x91\x7c\xbf\x3a\x38\x32\x03\xf2\x35\xf2\xd1"
+ "\x1c\x6d\x2f\xe8\xc8\x71\x6a\x7f\xac\x11\x11\x00\xe8\x79\x5b\x46"
+ "\x3a\x60\x2b\xed\xab\xe8\x4e\x29\xd0\x8b\x68\xa9\xf0\x30\xc2\xf7"
+ "\x93\xbc\x91\x19\xf9\x73\xf9\x18\xda\x5a\xc7\xb7\xe5\x68\x68\x13"
+ "\x0e\xdc\x3e\xa3\x3c\xf1\xeb\x37\x14\x58\x72\x9f\xce\xc9\xb9\x23"
+ "\x8c\xc5\x8b\x67\xc0\xbd\x7f\x05\xf4\x7d\xb4\xfb\xca\x79\x23\xe4"
+ "\x6c\x80\xbc\x4d\x6f\x23\xe2\x87\xcd\x30\xc8\x64\x07\xde\x03\x80"
+ "\x1f\xc1\xfb\x11\xf0\xde\x24\xef\x8a\x1b\x78\x87\xdb\xda\xd3\xc1"
+ "\x27\xad\x39\x16\xfa\xfe\xda\xa1\xcd\xab\x35\xc8\x5d\x86\x76\x4d"
+ "\x96\xb9\x2c\xae\xcb\x74\x3a\x01\x7c\xd4\xe0\x9d\xda\xbf\x47\xe3"
+ "\x88\xf6\x8d\x52\xae\x81\xa3\x54\x86\xae\x1a\xf6\x47\xf3\xdd\xc3"
+ "\xb6\xd3\xa1\xf4\xbd\xdc\xe2\xfe\x22\x94\xa1\x97\x26\xb4\xb5\x0f"
+ "\x15\xad\xd6\xb0\x6f\xd4\x1c\x13\x38\xdb\x5b\x89\x27\xe2\x83\xf6"
+ "\xa2\x6f\x21\xf2\x1b\x1f\x5d\xc3\x12\x46\x98\xf6\x96\x8b\xb1\xca"
+ "\x72\x5e\x8d\x5c\x89\x5c\xf1\x26\xea\x8e\x23\x37\x01\xde\x8c\xe7"
+ "\x9b\x78\x1e\x47\xc6\x5e\x36\x86\xf8\xce\xdf\xce\xdd\x49\x15\xec"
+ "\x76\xc2\x0f\xdb\xfa\x7a\x87\x69\x20\x9e\x78\xa7\xef\xbd\xe7\x61"
+ "\xa7\x2b\x03\xbf\x2b\xdc\x19\xc9\x50\x8f\x67\xac\x7c\x1a\xb3\x33"
+ "\x07\x79\xb7\x7a\x3f\xc5\x4c\xbf\x1f\x53\xef\x6e\x64\xdf\xfb\xe7"
+ "\x60\x7c\x57\xcb\x67\xd6\x5e\x7f\xdb\xeb\xca\x95\xd7\xd7\xee\x6c"
+ "\x0c\x33\x75\xc2\xfb\x77\x1e\x0c\x84\x77\x16\x4b\x58\xef\x4a\x59"
+ "\xee\x5d\xa3\x9e\xbb\x98\xa9\x0f\x7a\xea\x03\xfe\xbe\x06\x09\xeb"
+ "\x6b\xc6\x33\x0a\xd9\x12\x44\x9f\x70\xd6\xd1\x78\x8e\x96\x60\xcd"
+ "\xc0\x58\x3a\x4d\xa7\x73\x68\x8c\x4a\xa5\x6d\x69\xe3\x5c\xc0\xb2"
+ "\x60\x5b\x95\x7e\xfb\x71\x3e\x1e\x68\x3f\xce\xb4\x20\xfb\xb1\x93"
+ "\x3f\xc2\x5c\xa8\x73\x48\x7b\x39\x32\xb4\x2d\x13\x65\xe7\x4a\xe0"
+ "\x39\x42\x67\x24\xc0\x21\xe2\x8a\xd2\x5e\xc6\x66\x65\x31\x33\xf9"
+ "\x17\x8f\xc9\xb9\x9f\x6c\x96\x68\x2b\xba\x92\x17\xf0\x07\x58\x35"
+ "\xf1\xb7\x11\x78\x51\xae\x41\xbb\xea\x16\x36\xa8\xf3\x26\xfa\xd8"
+ "\x9e\x82\x3d\x2a\x7e\x09\x27\xf5\xe3\x7e\xb9\xb2\xa8\x8f\xa4\x7d"
+ "\xe6\x31\xc0\x69\x6f\x4b\x7f\xff\x14\xd2\x32\xe6\x64\x64\x93\xf4"
+ "\x6c\x19\xb3\x62\x2e\xa5\xb1\xf1\xe1\x35\x2c\x29\x86\x59\x31\xdf"
+ "\x66\x76\x98\xce\xa4\x24\x6e\x67\x56\xc2\x47\x7e\x1d\x72\x8c\x38"
+ "\x68\x2e\x4a\x5c\xea\xfe\xd3\xd3\x59\x6f\x6e\x62\x82\x4e\x15\xf1"
+ "\x83\x7a\x03\xdd\x32\xda\xc7\x96\x6e\x95\xb2\x82\x56\x0d\xfa\x1f"
+ "\x22\xd9\x49\x9f\xa8\xaf\x07\x1e\x3b\xd5\x89\xbb\x83\xa4\x3c\x35"
+ "\x74\xbf\x04\xe9\x83\xda\xd3\x5d\x94\xf2\x7b\xc2\xdb\x0f\x0b\xbd"
+ "\xa1\x3f\x8d\x07\x07\x0d\xc2\x51\x34\xc6\xc7\x38\xfc\xd1\x2b\x5b"
+ "\x47\x10\x7b\x9c\x9d\x19\x38\x3e\x67\xdc\xc6\xf1\x41\xbf\x43\xe8"
+ "\xdf\xc8\x21\x23\xf9\x13\xd0\x8c\xa0\x78\x03\x30\xfb\xb8\x0d\x38"
+ "\x9e\x19\x11\xe7\x3a\x5d\xa6\x8e\x4b\xe0\xc5\x4e\x78\xc0\x4f\xa3"
+ "\xc4\xd5\x91\x72\x74\x7b\xe0\x58\x2b\x7c\x35\x34\xe6\x62\x3e\x6f"
+ "\x15\x32\xc1\x77\x75\x1c\xaf\x92\x75\xf5\x68\x53\xcf\x47\xd3\x18"
+ "\xdd\xd7\x20\xd7\x12\x51\x57\x57\x74\x49\x8c\x6f\xa3\xf4\x6b\x1d"
+ "\x3d\xf9\x3b\xb8\xdb\xcf\x77\x47\xb5\x7e\xe7\x85\xe2\xbb\x8e\xe8"
+ "\xf1\xcd\xe9\x62\x6d\x25\x1a\xd4\x5f\xe1\xdb\x4e\xf8\x74\x5d\x25"
+ "\x82\x0f\xa9\xaf\x33\x87\x00\xaf\x21\x5b\x14\x7a\x83\x1f\x1d\x2a"
+ "\x22\x5b\xec\x20\x1b\x3a\xb2\x97\xca\x9b\x45\x79\x89\xf0\xb1\x13"
+ "\xf5\x67\x3c\x54\xdf\xe2\xc6\xb8\x7d\x13\xb6\x34\xce\xd8\xed\x51"
+ "\xcc\xea\x2b\x11\xb2\xd5\xfa\xb6\xad\xd0\x8e\x8d\x31\x46\x7c\x42"
+ "\x47\xf5\xc3\xb6\xb3\x2b\xb1\xd6\x88\xf8\x01\xfe\xba\x8e\xbf\xb2"
+ "\x86\x11\xcf\xf0\x67\x8a\xbf\xb3\xbf\x50\x63\x5f\x47\x32\x92\x3e"
+ "\x13\xa5\xef\x43\x5d\x67\x06\xf1\xee\x97\xfb\x6c\x85\x51\xc7\x42"
+ "\x6e\x8c\x03\x8d\x17\x8d\x8b\x01\x27\xd9\xbe\x1d\xb8\x6a\x65\x59"
+ "\xda\x06\xe9\xda\x1e\xcd\x9b\xa9\xbd\xbf\xad\xeb\x1d\xaa\x7b\x16"
+ "\xb4\x93\x36\x31\x71\xf7\x18\xdd\x5b\x02\xbc\xb5\x74\xcf\x28\x70"
+ "\xd4\x93\x4e\xc1\x4b\x1c\xd9\x23\xca\xcd\xaa\x5f\x2c\xd6\xf3\x45"
+ "\xc8\xcb\xfd\xf3\xbf\xf3\xa6\x40\xfb\x72\x05\xcf\x7f\x1a\x6f\xfb"
+ "\x78\x51\x1a\x13\xf6\x90\xc7\x2c\x03\x26\xd7\x6b\x6a\xed\x50\x63"
+ "\xdd\x39\xe3\x18\xe6\x8b\x01\xc7\xee\xa0\xb1\xae\x17\xf6\xb8\x79"
+ "\xa5\x46\x32\xa3\x6f\xbd\xc2\x23\x64\x16\xf6\x54\x22\x6c\xa0\x99"
+ "\x6f\x86\x9c\x13\x76\x70\xd6\xad\xc6\xb9\x39\x48\x27\xba\xef\x4a"
+ "\xa1\xfb\xe5\xc8\x27\x0d\x97\xb0\x2f\x0f\x8f\xfa\xfd\x12\x8d\xfd"
+ "\xb8\x18\x7b\x97\xdd\x21\xd7\x5b\xe5\xb7\x5c\xb2\x3e\x3a\xc0\x86"
+ "\x89\x97\x37\x84\xfd\x12\x2f\x45\xe9\xc4\x4b\xbd\xe0\xa3\xc8\xc2"
+ "\x06\x4c\x9d\xcb\x89\x3e\xfa\x36\xa9\xf9\xaa\x70\x9d\xad\x24\x5c"
+ "\x3b\xe1\xab\x88\x27\xd0\x8e\x17\xfe\xef\x41\xa1\x93\xfd\x8a\xf7"
+ "\xa6\x91\x12\xea\xeb\xb4\x5f\x32\x89\xbe\x4d\x78\x37\x8f\xc8\x3b"
+ "\x68\xc2\xd0\xff\x20\x7d\xef\x7f\x97\xa9\x67\x8c\x7c\x34\x7d\xe6"
+ "\x84\xf7\x4e\xfa\xfb\x50\xf8\x14\x33\xf0\x85\x92\x8d\xea\x76\xe1"
+ "\x31\xf5\xbc\x4b\xdf\x8f\x0f\x5d\xd7\x22\x46\x3a\x48\xfa\x26\x5b"
+ "\x46\x8c\x94\x32\x6c\xeb\x32\xeb\x76\x0b\x3a\x95\xa4\x7b\x39\x3e"
+ "\x5d\x0f\xc3\x8e\xeb\xfd\xb6\xd5\xf5\xb0\xd2\xe3\x41\xe8\x31\x14"
+ "\xf4\x8e\x2b\xb9\x0e\xa2\x3d\x62\xb1\x9e\x9f\x29\xde\x2b\x54\xfb"
+ "\x75\xfa\x38\xa8\xb9\xda\xbc\x97\xfc\xaf\x18\x83\xae\x31\xd5\xb7"
+ "\x46\xd1\xba\xa2\xb7\xa5\x18\x51\xde\x2d\xd5\x75\x85\xfc\x60\x12"
+ "\xc6\x5e\xf8\x3e\x71\x07\xaf\x84\xd1\xdc\x91\x34\x7a\x0e\x08\x3b"
+ "\x44\xdc\xe3\xb7\xa3\xae\x53\x41\xfe\x89\x7c\xb1\xfd\x04\x70\x90"
+ "\x3f\x25\x5b\x22\x9f\x4a\xfb\x18\xe0\xab\x55\xf3\x47\xf1\xdc\x7d"
+ "\x5f\xa0\xad\xf4\xbc\x00\x5b\x49\xf0\xe3\xee\xb6\x4e\xb5\xce\x39"
+ "\xa4\x0f\xac\x94\x7d\xba\x9f\x53\xb2\xd5\x4a\xd9\x54\x99\xf4\xf6"
+ "\xac\xd0\xdb\x03\x06\x3d\x42\x6f\xee\xd7\x54\xfb\x7a\xf2\xe5\xfe"
+ "\xf9\xda\xdd\xaf\xcf\xe5\xc9\xfe\xc2\xfd\x32\xcd\x07\x03\x5f\x4d"
+ "\x41\xfe\xa2\x7e\x6a\x7f\xd1\x5d\xa1\xe4\xad\x0e\x9a\x1b\x35\x2a"
+ "\xde\x3d\xac\x8f\xc3\x09\xec\xd3\xe4\x3d\x4a\xed\x87\xc9\x7f\x12"
+ "\x6d\xe3\x1a\x54\x25\xf5\xaa\xe6\xb2\x7b\xcf\xe4\x71\x70\xa7\x1b"
+ "\xe7\x33\x8d\x35\xf9\x04\xc2\x41\x63\x2a\xe2\x4a\xc0\xe4\xb8\xba"
+ "\x53\xc8\x37\x18\x7d\x34\xda\x96\x8d\x73\x9a\x2f\xee\xb5\x81\x73"
+ "\xb1\xbb\x59\xcd\x45\x45\xbb\x27\x19\x63\x64\x35\xd0\x3d\x15\x44"
+ "\x97\xc6\xa6\x91\xf4\xa0\xc6\xf4\x56\x7d\x4d\xa3\xf6\xe8\x5b\x38"
+ "\x6c\xeb\x09\x0d\x5a\x1f\xed\xc4\x1f\x68\x15\x0b\x9f\x55\x2e\x7c"
+ "\x45\xe1\xb0\xe0\xa7\x27\xdc\xa1\xd6\x09\xc0\xac\x12\xe6\x6e\x55"
+ "\x6b\x89\x6e\x37\x3b\x02\x79\xea\xc9\x9a\x3a\x3e\xea\x2e\xd6\xe3"
+ "\x23\x81\x4b\xf8\xa2\x9e\x1c\x25\x1f\xc1\x12\x24\xac\x3b\x85\x60"
+ "\x7b\xa5\x1e\xca\xb8\x58\xaf\xba\x5a\xd5\x7a\x45\xf3\xcb\x84\x72"
+ "\x1a\xcd\x31\x2a\x03\x47\x03\xe1\x6f\x29\xbe\x4c\x7b\x88\x0a\xa7"
+ "\xa9\xd3\x45\xfe\x80\xfc\x05\xfd\x1e\xab\x78\xd2\xef\x96\x9a\x7a"
+ "\x67\x91\xdf\xa1\x38\x84\xea\xd1\xee\x14\xf9\x22\xc0\x17\xd0\x7d"
+ "\xad\xbc\x2f\x14\x78\x7b\xcd\xb2\x6f\xef\x5d\x22\x56\xe8\x4b\x0b"
+ "\xd1\x61\x7a\x3f\xf8\xad\x4e\xea\x47\xfd\x75\xff\x45\xbe\x6b\x8c"
+ "\x7c\x93\xa0\xd7\xbb\x45\xd9\xb8\xd8\x37\xe8\x71\xd1\xa8\xc9\xd0"
+ "\x96\xee\x9f\x11\x3e\xad\xb7\x51\xfa\xb3\xde\xc3\xd4\x57\x8c\x1f"
+ "\x7c\xe5\xb3\x97\xf8\x19\x47\x1e\x33\x57\x0d\x92\x5f\x6c\xaf\x93"
+ "\x7c\xf6\x45\x2a\x39\xde\x13\x72\x48\x9f\x6a\x97\xbc\xb4\xd7\x55"
+ "\x5d\x16\x75\x17\x48\x16\xaa\x2b\x35\xd4\xf1\xd1\x78\xd4\xf5\xcd"
+ "\x16\x7c\x05\xf5\x1b\x1f\xcd\x9a\xd4\x9e\xee\x1f\x86\x0f\x0d\xad"
+ "\x2a\xd7\x7d\x6f\x9f\x5d\xf2\xd9\xf7\x88\xee\x77\xa1\xf7\x36\xf2"
+ "\xbd\xa2\x6e\xbd\x6a\xf3\x35\xf5\x14\xfe\xbd\x6f\x87\xd4\x6b\x8c"
+ "\x49\xe9\xdb\xa5\xe4\x78\x41\xec\xb3\xfb\xd6\x40\xb7\x7d\x05\xba"
+ "\x6e\x8d\xef\x34\x7f\x40\x3f\x92\xca\xc2\xee\xb7\x8b\x3d\x6c\x25"
+ "\xb5\x21\x9e\xe4\x1a\xd1\x9b\x13\x1c\x53\x63\xaf\x37\x93\xd6\x25"
+ "\x19\xab\xf6\xf7\xa8\xb3\x21\xd6\x90\xf7\x7d\xac\x0b\x9e\x14\xdd"
+ "\xc7\xf0\xe1\x34\xec\xf9\x3b\xd0\xc6\x23\xee\x35\xa5\x3b\x45\x8c"
+ "\x6d\xc8\x3f\xbd\x7a\xd9\xa9\x70\x7a\x22\x75\xbf\x41\xbe\xe4\x84"
+ "\xaf\x43\xc5\x74\x9e\x86\x2a\xe5\x4b\x06\x4c\x9e\xa3\x81\x71\x98"
+ "\xe7\x68\xa0\xcf\xe8\x7f\x37\xd8\x67\x20\x6e\xde\x35\x6c\xf3\x94"
+ "\x05\xc4\x01\x80\x5d\xdb\x77\x78\xb2\x68\x8e\xd2\x9d\x72\xc2\x3f"
+ "\x89\xf3\xae\xfe\x3b\x74\x9e\xc9\x6f\x0e\x6d\xd3\xcf\x2f\xfa\xdf"
+ "\xa0\x58\x2d\x90\x5e\xbf\x39\xc0\x77\x12\x3d\x1d\x9f\x99\xd1\x9d"
+ "\x64\xd0\x03\x9d\xb9\x78\x4e\x29\x3f\x5f\x1d\xe0\x2b\xd5\x1a\x46"
+ "\x7e\x32\x70\xad\x6a\x3f\x1c\xb8\x56\xf5\xbf\x36\xd9\x47\xf6\x17"
+ "\x5f\xff\x5a\xd5\xbf\x86\xfc\x96\xee\x23\x03\x7d\x41\xff\xae\xaa"
+ "\x80\x58\xb6\x3f\x5c\x8f\x65\xfd\x7e\xd4\x53\x49\x3e\x0a\xf4\xeb"
+ "\x15\xed\x31\xac\xfb\x13\xb4\x51\x9f\x72\xc2\x02\xdb\xb4\xb5\x67"
+ "\xc1\xa6\x9c\x2a\x06\x14\x73\xf3\xb2\xb8\xbf\xa8\x2f\x1e\xf6\x17"
+ "\x46\x76\xd6\x90\x3b\xc8\x5c\xfe\xb5\xa2\x71\x68\xa3\xae\xdf\x81"
+ "\x3d\xc6\xb8\x70\x7f\x39\x7f\x7e\xd8\x36\x90\x69\x94\x71\x0f\x60"
+ "\xa5\xea\x0c\x41\xe8\x56\xe0\x1a\x58\xe2\x28\x0f\x94\x4d\xca\x31"
+ "\x90\x43\x72\xd0\x9e\x08\xf4\x17\x51\xdc\x83\x98\x0f\xef\x9d\x87"
+ "\x1c\x13\x36\xef\x34\x5f\x2a\x31\xc6\x57\xa7\xc3\xc9\x57\xaa\xbd"
+ "\x67\x13\xe2\x1d\xbb\xf1\x2c\xe6\x91\xaf\xac\xb2\x6c\xca\xcb\xce"
+ "\x2d\x58\xbf\xd8\x92\x9d\x9b\x5d\x90\x9d\x91\x93\xbd\x35\xa3\x20"
+ "\x7b\x63\xee\xa2\x0d\x19\x4f\x66\x3f\x61\xd9\x9c\x91\x6f\xb1\x16"
+ "\xc6\x15\x86\x31\x7f\xd3\x65\x96\x8c\xfc\xfc\xa7\x37\xac\xcb\xb4"
+ "\xe4\x66\x3f\x91\x90\xb7\x2e\x7f\x5d\x81\x25\x23\x6f\xe3\xd3\xb9"
+ "\x99\x96\xb8\xcc\xc4\x38\xeb\xdd\x99\x61\xc6\x33\xb4\x85\x91\xcc"
+ "\x33\x7e\xd1\xed\x2e\xbd\xc8\x42\x23\xb4\x4d\x79\x11\x85\xd9\xb9"
+ "\xf2\xdc\xee\xdc\xbb\x49\x65\x6c\x13\xea\xc3\xe9\x7e\x64\x6e\x1b"
+ "\x70\xe3\x69\xa6\x76\x90\xd3\x82\xf7\x50\xf0\x3e\x6f\xd8\x76\x0e"
+ "\x3e\x7b\xa8\x58\xdc\x7d\x0c\x38\x64\x9b\xc7\x2f\x36\xb9\x11\xb3"
+ "\x6d\xa2\xcf\xd7\x1d\x17\x59\x94\xfd\x19\x66\x46\x0e\x47\x8e\x34"
+ "\x45\xd2\x59\xd7\x39\xf8\x7d\xaf\x5b\x9e\x7d\x7a\x73\xbc\xb3\x66"
+ "\x2f\xe7\xbb\x67\x2f\x97\xe3\xe2\xcd\xd6\xcf\xa2\x1f\xfd\x36\x7b"
+ "\x94\xec\xb3\xc3\xe4\x15\x9f\xc5\xed\x84\x2d\xd3\x39\xee\xd0\x2f"
+ "\xef\x4f\x45\x3c\xd8\x46\xe7\xb0\xa8\xcb\xf6\x99\x58\x38\xf8\x32"
+ "\x1f\xdb\x6e\x65\xfb\x40\x2b\x3f\x86\xf3\x61\x9b\xd7\xaa\x9f\xa7"
+ "\x41\x86\x48\xc8\xd2\x2a\xe5\x38\x77\xa3\x90\xa3\x9c\xc7\x96\xcd"
+ "\x01\x7f\x2f\x12\x3f\xde\x74\x5d\x06\xf0\xdd\xea\x34\x9d\x6b\x00"
+ "\x9f\x91\xc4\xd7\x54\x67\x7d\x74\xde\x05\x3e\x0f\x8c\x3f\x03\xbd"
+ "\xdd\x26\xef\xc4\x2b\xad\x92\xf3\x0f\xf2\xb4\x39\xf0\xbe\x77\x90"
+ "\x85\xef\xa1\xbb\xcb\x4b\xe6\xf3\xb7\x7d\x63\xac\x25\xab\x95\x45"
+ "\x6c\xe1\x5e\xfe\x53\xb7\x5b\xc9\x74\x92\x7c\xc3\xeb\x4f\xb5\x9a"
+ "\x49\x26\xac\x15\xe1\x8e\xc1\xab\x9e\x2d\x9a\xf7\x45\x73\x1f\x7f"
+ "\xc9\x18\x73\x9d\x5f\x4a\x3a\xa1\x78\x6b\xa8\x84\xee\xc0\x3e\x6f"
+ "\x01\xed\x42\x15\x1b\xfb\xf8\x68\xba\x21\x96\x3a\x4f\x76\xe6\xbb"
+ "\x0a\xee\x50\x1d\x37\xdd\x93\x4e\x7d\xe4\xf8\x9f\x3f\x80\x3e\x5e"
+ "\x03\xfe\xe2\x60\xfc\x84\x13\xef\x5e\x9d\x8e\xdc\x87\x9f\xa7\x98"
+ "\xc0\x0b\x5b\xf6\x5e\x85\x5e\xec\x8b\xe5\xfc\x54\x0b\xe0\xa5\x97"
+ "\x98\x19\x6d\xe1\xab\x04\x7e\x27\xf4\xbe\x82\xf0\xef\x8c\x66\x6c"
+ "\x17\xda\x0c\xd9\xbc\x85\x3e\x71\x67\xf9\x79\xd8\x49\xfb\xa6\xe0"
+ "\xb3\x6c\x65\xcf\xcb\x82\xec\x39\xf5\x45\x8a\x09\xcb\x80\x1f\x36"
+ "\x54\x7a\x01\xeb\x30\xca\x89\x65\x2c\x9e\xe8\xe0\xfd\x24\x9d\x87"
+ "\x0c\xdb\x06\x57\xe9\xf4\x38\xec\x7f\xef\xb8\x3c\x83\x51\xb6\xb5"
+ "\x88\xce\xaf\x8b\x0a\x39\x3f\x06\xff\x4e\x3c\x92\x8d\xa1\xcf\x2e"
+ "\xdd\xa6\x60\xeb\xa7\x84\x5d\x45\xb1\x78\x6e\x1b\x0c\x75\xcc\x41"
+ "\x3b\xd8\x55\x15\xec\x89\xec\x0a\x6d\x0f\xe9\x36\x05\x5b\x3b\x49"
+ "\xed\xc0\x43\xd8\xa1\xad\xa9\x66\xf2\x91\x2e\xd3\x50\x1c\xd9\x18"
+ "\xff\xde\x57\x5b\xf9\xcd\xdf\x68\x95\xe3\x34\x14\xd7\x32\x22\xc7"
+ "\xc0\xaf\xf7\xc1\x11\x83\xde\x4f\xc2\x8e\xc3\x48\xcf\xf2\xac\x7a"
+ "\x28\x0e\xbc\x9d\x14\xb1\xf8\x0e\x8c\x81\x58\xab\x06\x5d\xd4\x5f"
+ "\xe9\xb0\xd9\xaf\xc3\xa1\xd4\xa9\x74\x18\xa4\x3b\xb3\xbc\x17\x7d"
+ "\x68\x25\xcd\x15\xf4\x29\xd0\xef\x3a\x9f\x6a\x2c\x41\xc3\x6c\x2e"
+ "\x63\xa1\x44\xa3\x31\x4a\xb4\xaf\xd1\x69\x94\x42\xd7\xde\xa2\xac"
+ "\x6b\xda\x73\x63\x35\x63\x74\x26\x4e\xfd\x63\xa3\x48\xbf\x43\x2e"
+ "\x7f\x7f\xee\x0b\xee\x1f\xf7\x44\x00\xaf\x22\x83\xd7\x91\x7d\x73"
+ "\x60\x47\x82\x5f\x5f\xec\xb5\xf8\x8d\xb5\xc8\x75\xb2\x61\x21\xd9"
+ "\xb7\xef\xf1\x96\x0a\xc6\x08\xa6\xca\x2b\x87\xb0\xf6\x04\x9f\xef"
+ "\x5f\xfd\xf3\x06\xdf\xfe\xc0\xcf\x1b\x7c\xbb\xaf\xf6\x79\x43\x10"
+ "\xdd\xf7\x88\xee\xb8\x63\xb5\x66\xa0\xdd\x38\x3e\x05\x6d\xbd\x7f"
+ "\x62\xb5\x71\x3f\x73\xe1\x0e\xe2\xe1\x04\xd6\x29\x7e\xcb\x6a\x8d"
+ "\x03\x4f\xa3\x58\xc3\x2f\xc4\xcb\xf8\x85\xe2\xa2\x0b\xa1\xd4\x26"
+ "\x58\x8e\x89\x14\x1a\x45\x67\xea\xec\x92\x28\xcc\x78\x90\x51\x84"
+ "\xc4\xee\xf6\xea\xd5\xa6\x80\xc6\x8c\x4f\x51\x08\x67\xec\x1e\xd1"
+ "\x9e\x23\x49\x90\x2a\x4b\x2c\xe6\x89\xf6\x13\xf5\x1f\x21\xcd\x94"
+ "\xfc\x0a\x7c\x23\x4c\x93\x6f\x4b\x22\x0d\x2d\x56\x5c\xa3\x37\x67"
+ "\x7a\x97\xa9\xd2\xb7\x90\x8b\x57\xcf\x00\x3e\xab\x68\xcc\xf9\x98"
+ "\xc2\xaf\x97\xb9\xb1\x4c\x90\xc0\x32\x52\x48\xba\x81\xc0\xfc\x90"
+ "\x4c\xf1\xab\x52\x5f\xcc\x9c\x00\x99\xaa\x8d\xbc\x42\xdd\xc5\x33"
+ "\xc4\x4b\x04\xfd\x18\x01\xbe\x78\xd4\x2f\x59\x35\xd1\xe0\x46\xdf"
+ "\x73\x86\xe6\x6f\x49\xf6\x97\x56\x5f\x43\xc6\x0f\x9a\x6e\x33\xbc"
+ "\xcf\x97\x8f\xa5\x6b\x3f\x46\xfc\xd7\x4e\x96\x93\x33\xf5\x57\xbf"
+ "\x79\x2c\x75\x4d\xd5\xd4\xaf\xff\x65\xfa\x18\x73\xa3\x85\xfa\xeb"
+ "\xbf\xd4\x10\x58\xbe\xd7\x1e\x58\xbe\xcf\xf9\x31\x70\xce\x04\x91"
+ "\x22\x27\xf6\x62\xa9\xb5\x13\xc0\x88\xa0\x29\x13\x61\x0f\x9a\x42"
+ "\xfe\xa4\xb8\x09\x61\xec\xfe\x14\x03\xd8\x3c\x75\xeb\x4f\x26\xcd"
+ "\x7d\x4e\x4d\x88\xf9\xde\xc8\x49\x95\xf7\x06\xc1\xa8\x7c\x83\x45"
+ "\xc1\x92\x8f\x4e\x6a\x2f\x60\x16\x43\x59\x4b\xc5\x8f\x6a\xd8\xbf"
+ "\x77\x72\xdb\xe9\x34\x9d\xae\x23\x69\x34\x3f\xa6\xd3\x27\x94\xb8"
+ "\x5c\xc5\xe1\x89\xc4\x83\xfe\xf1\x09\x47\xc9\x55\x05\x57\x00\xae"
+ "\x5e\x3e\x96\x75\x7c\x3a\x4d\xa7\xe9\x34\x9d\xa6\xd3\x74\x9a\x4e"
+ "\xff\x0f\x92\x66\xdc\x58\xd3\xef\xb0\x7e\x46\x3d\x8d\xfb\x1f\x4d"
+ "\x65\x23\xcc\xf4\x51\xfa\x71\x95\x58\x71\x6a\x83\xa5\x7a\xad\x33"
+ "\xd2\xbe\xea\xa4\xf5\xd0\x26\x6f\xe8\xf3\x69\x4d\xf1\x07\xb3\xdc"
+ "\x31\x15\x6b\x5a\x97\xd4\x17\x8e\x98\x77\xad\x68\x8c\xad\xc9\x74"
+ "\x45\x95\xad\x3e\x95\x52\x57\xe0\x0b\xdf\xbd\xb2\x79\x51\x6d\x8e"
+ "\x67\x5e\x65\x7a\xdb\xf2\x23\xdb\xc7\x4c\x25\xf7\xff\x6a\xe1\xf7"
+ "\xff\xae\x63\xce\x8b\x7f\xf6\x9b\xc5\xff\x96\x37\x18\x66\xfb\xd3"
+ "\x37\xff\xf8\x47\x4f\xf5\xce\xfd\xe7\xbf\xfe\xdf\x65\xff\xb1\xf5"
+ "\xf2\x0d\x7f\xff\xe0\xaf\xbf\xf0\x83\xf5\x5d\xd1\xe5\x7f\xf9\xdf"
+ "\x77\xff\xf4\x99\x8b\x9f\xdb\xfb\xb5\x13\x89\x3f\xc9\x1d\xb8\xad"
+ "\xea\x6f\x4e\x7f\xf9\x97\xcf\x8e\x6b\xcf\xdd\x77\x74\xc1\xcb\x19"
+ "\x67\x66\xbf\xf0\xd8\x3b\xc9\xaf\x7d\xeb\xfc\xcc\xef\x3e\x7c\xfc"
+ "\x8e\x1f\x66\xf7\x7c\xfe\x9f\xfe\xea\xbd\xa5\x3f\xdb\x72\x69\xc6"
+ "\xb7\x1f\x78\x23\xee\xc0\xba\xce\x9b\xfe\xf1\x2f\xde\xbd\xeb\xf0"
+ "\xd3\x17\x66\xed\x79\xe4\xed\x84\x7f\xdd\xd0\x7f\xeb\xfe\xc7\xdb"
+ "\xbf\xf4\x8b\x1d\x57\x42\x76\x7e\xe5\xd8\xed\xaf\x3c\x71\xf6\xc6"
+ "\x7d\x7f\xfe\xdb\x3b\x5f\xcf\x1f\xfa\xec\x3f\x7c\xf5\xad\x3f\xf9"
+ "\xf1\x37\xfb\x6e\x79\xe9\x1b\xbf\xfb\xe2\xcf\xb7\x8d\x7e\xe6\x3b"
+ "\x0f\xfd\xd7\x1f\xfd\xcb\x93\xdd\x37\x7f\xef\xeb\xff\x73\xcf\xbf"
+ "\x6f\x1e\x8e\x28\x7d\xb4\x25\xe9\xd5\x8d\xe7\xe6\x3b\xfe\xf6\xf7"
+ "\xf7\xfe\x67\x11\xff\x28\xfa\x63\x21\x51\xbf\xfd\x34\xc7\xcd\x1f"
+ "\x3c\x12\xb8\x6a\xed\x87\xc6\x63\xd2\xd4\xf8\x4b\x40\xf1\x5d\x4c"
+ "\x0b\x65\x37\x98\x3f\xc4\x8e\xe1\xc3\xca\x7d\x95\x64\x31\xf6\xbf"
+ "\x9e\x44\xe7\x47\xc9\xc8\x77\x22\xdf\x22\x20\xfe\x53\x80\x85\xd7"
+ "\x89\xe3\x93\x4f\x1a\x64\x0f\x01\x67\x33\xd8\x0d\xd0\x56\x28\x9b"
+ "\xc9\xc2\xd8\x67\x59\x38\x9b\xc5\x3e\xc7\x22\x58\x24\x9b\xcd\xe6"
+ "\xb0\x1b\x59\x14\xbb\x89\x45\xb3\x9b\x59\x0c\xfb\x3c\x9b\x0b\x69"
+ "\xe6\xb1\x5b\xd9\x6d\x6c\x3e\x94\xb2\x60\x6a\x59\x8a\x59\x6a\x0c"
+ "\x7e\xe0\xff\x2a\x96\x2a\xca\x6b\xa7\xe1\x9f\x2a\xbc\x41\xc1\x4f"
+ "\x2a\xb8\x73\x1a\xfe\xa9\xc2\x2d\x7f\xe0\xe7\x82\x3f\xe8\x53\x43"
+ "\xe8\x20\xa3\x87\x80\x18\x62\x22\x05\x43\x35\x95\x26\xca\xec\x7d"
+ "\xfa\x4f\xc2\x17\xd8\x3f\x38\xa5\x22\xab\x03\xd9\x22\xc6\xe4\xe7"
+ "\x0d\xdc\x98\xc6\xca\xb5\x5f\x99\x67\x17\xd3\x47\x27\xa1\x2c\x4a"
+ "\xfc\x7c\xff\xd4\x50\x80\x5c\x8c\xbc\x1b\xb9\x14\xf9\x25\xe4\x03"
+ "\x3a\x6e\xa6\xcd\x5f\xc1\x34\xcb\x76\x3c\x9d\x4c\x5b\x10\x83\x5c"
+ "\xcb\xb4\xd8\x45\x4c\x5b\xe8\x61\x5a\x5c\x8e\x9f\xf9\xc4\xe7\x27"
+ "\xb8\xd4\x16\x29\xb8\x05\xef\xc9\xc6\xb3\xda\x0f\xba\x9e\x35\x3c"
+ "\xb0\x3a\xcd\x92\x9c\x98\x92\x78\xd7\x9d\x19\x96\x84\x55\x09\x96"
+ "\xc5\xd6\xe4\xe4\x24\xeb\xdd\x49\xc9\xf7\x58\x16\x2f\x5e\x96\x6c"
+ "\x5d\x66\xb5\x5a\x36\x6c\xc9\xcb\x4e\xb6\x3e\xb9\xce\xb2\x3e\x3b"
+ "\x6f\xc3\xe6\x8c\xbc\x75\xd7\x21\xf5\x07\x4e\x10\x85\xdd\x7a\x45"
+ "\xb2\x69\x1c\x21\x8d\xdd\xcb\x4c\x57\x0a\x59\xc8\xec\x54\x36\x69"
+ "\x48\x35\xbb\x12\x29\x5e\xe5\xa0\xea\x1f\xb6\x31\xed\x07\x8d\x4c"
+ "\x7b\x79\x8c\x69\x2f\xd5\x33\x6d\xdf\x08\xd3\x8e\xe7\x30\xed\xd7"
+ "\xcb\x99\x76\x34\x9d\x69\x3f\x47\x9b\xd7\xe3\x27\xc3\x7e\xd3\x2c"
+ "\x61\xe7\xd0\xb7\x17\xd9\xb5\x92\x69\x6d\x4b\x24\x6c\x14\x63\x73"
+ "\x31\xe6\x93\x50\xc1\x47\x48\x1f\x74\xdc\xb5\xff\x03\x03\x93\xab"
+ "\x6c"
;
diff --git a/sys/dev/mxge/if_mxge.c b/sys/dev/mxge/if_mxge.c
index f6164d0..23af286 100644
--- a/sys/dev/mxge/if_mxge.c
+++ b/sys/dev/mxge/if_mxge.c
@@ -2834,7 +2834,7 @@ mxge_media_init(mxge_softc_t *sc)
return;
}
}
- if (*ptr == 'C') {
+ if (*ptr == 'C' || *(ptr +1) == 'C') {
/* -C is CX4 */
sc->connector = MXGE_CX4;
mxge_media_set(sc, IFM_10G_CX4);
diff --git a/sys/dev/mxge/rss_eth_z8e.h b/sys/dev/mxge/rss_eth_z8e.h
index 935b14c..e0dfade 100644
--- a/sys/dev/mxge/rss_eth_z8e.h
+++ b/sys/dev/mxge/rss_eth_z8e.h
@@ -1,6 +1,6 @@
/*******************************************************************************
-Copyright (c) 2006-2010, Myricom Inc.
+Copyright (c) 2006-2011, Myricom Inc.
All rights reserved.
Redistribution and use in source and binary forms, with or without
@@ -28,9669 +28,9874 @@ POSSIBILITY OF SUCH DAMAGE.
$FreeBSD$
***************************************************************************/
-static unsigned int rss_eth_z8e_uncompressed_length = 553468 ;
-static unsigned int rss_eth_z8e_length = 154580 ;
-static unsigned char rss_eth_z8e[154580 + 1] =
- "\x78\x9c\xec\xbd\x7f\x78\x54\xd5\xb5\x3f\xbc\x32\x19\x24\x60\x92"
- "\x99\xc4\x48\x47\x4c\x74\x10\xd0\x68\xf9\x11\x15\x5b\xb4\xa0\x51"
- "\xc0\x62\xe5\x47\xaa\x68\x03\x22\x09\x1a\x30\x68\xc4\x11\x02\x04"
- "\x08\x99\x61\xc0\x16\x2b\x90\x49\x44\x0c\x12\x48\xb4\xd8\x4b\x6f"
- "\x51\xd3\x8a\xb7\xd8\xa2\x4e\x4b\xfa\x7d\xe9\xbd\x24\x93\xf6\xa5"
- "\xef\x9b\xdb\x97\xde\x8e\x7c\x23\x8d\xdc\x00\x23\x19\xc8\x98\xcc"
- "\x9c\xfd\xfd\xac\xbd\xcf\x49\x66\x86\x09\xca\xbd\xf7\x79\xde\x7f"
- "\x9a\xe7\x99\x9c\x73\xf6\xd9\x7b\xed\xb5\xd7\x5e\x6b\xed\xb5\xf7"
- "\x5e\x7b\x1d\xa2\x2b\xff\xf3\x53\x0a\x5f\x92\xc8\x3c\xba\xf3\xb7"
- "\xff\x85\xf2\xff\xf8\xfb\xc7\xdf\x3f\xfe\xfe\xf1\xf7\x8f\xbf\x7f"
- "\xfc\xfd\xe3\xef\xff\xdf\xbf\x40\x12\x4d\x3a\x6f\x32\xd3\xef\x3c"
- "\x44\x3d\xee\x94\x6c\x3f\xf5\x3a\x5e\x7f\x55\x84\xf1\x2a\x09\xe3"
- "\x7c\x36\x5f\xf9\x57\x8b\x34\x93\x87\x52\x6e\xb2\x52\xea\xb4\x3d"
- "\x44\x3b\x46\x88\xae\x57\x77\x8a\xc0\xa6\x9d\xa2\x6b\xfa\xdb\x44"
- "\xcd\x63\x88\x5e\x1d\x21\x82\x80\xb1\xd0\x4f\x8b\xe6\x31\x8c\x4d"
- "\x78\xe6\xf7\x9b\x47\x88\x00\xd2\xcb\x91\x7e\x8c\xd3\x37\x8e\x00"
- "\xac\x2c\x22\xf7\x4e\x11\x8a\x82\x9b\xc2\xe5\x19\xe6\xf4\x51\x12"
- "\x97\x7d\x71\x70\x18\xc6\x21\x3f\x15\x4d\xbf\x0c\x8c\x54\x03\xaf"
- "\xa0\x89\x92\x18\x5e\xb7\x9b\x6c\x41\xb7\xf7\x5a\x94\x0d\xa2\x3d"
- "\xb9\x5c\xb6\x1a\x79\x84\x9b\x92\x9b\x2b\xc2\x64\xbf\x89\x92\x4e"
- "\xd1\xf0\x37\x71\x35\xe1\xfa\x1a\xb7\x75\x93\x2a\x37\x86\x61\xa0"
- "\x6c\x52\x8f\x7b\x58\x5e\x7f\x59\xc0\xb6\x57\x91\x19\x79\x97\x05"
- "\x4d\x5e\x93\xca\x6b\x1d\xa6\xe7\x35\x21\xef\x42\x23\xaf\x7a\x67"
- "\x7a\x48\x7f\x77\x35\xde\x55\xc4\xbe\x33\xd7\xea\xef\x52\xf1\x6e"
- "\x47\x1c\x7e\x66\x5f\x6f\x98\x4e\xd1\xb0\x03\xc0\xc5\x7e\x04\x3d"
- "\xc2\x65\xf4\xfc\x19\xc8\xdf\x1c\x0b\x8b\x48\x7f\x97\x89\x77\xfe"
- "\xd8\x77\x1f\xe7\xe9\xef\xbe\x81\x77\xe1\xd8\x77\x49\x46\x39\x5b"
- "\x8f\x7b\xb8\x2d\x41\x3b\xb9\xfe\x24\x55\x37\xb7\x61\xf8\x14\xe4"
- "\x71\x71\x9e\x79\x76\x17\x71\x5f\xf1\xbb\x23\x8d\xfd\xf5\x73\x9e"
- "\x62\x03\x8e\x1f\xe5\xa3\x68\x0a\x5a\x0e\xaf\x34\xca\x4f\xb7\x33"
- "\x0c\x92\x34\x64\x38\x7e\x1a\x36\x93\xe1\xf0\x33\xee\xb3\xb9\xdd"
- "\xfa\xbd\x9d\xdb\x17\xdd\xe7\x44\x66\x80\x1d\x02\x43\xf4\x2a\xfc"
- "\x86\xa6\x18\x3c\xb0\xd2\x26\x34\xe7\x75\x64\x16\xb5\xa9\x75\x9a"
- "\x5b\x90\xaf\x22\x44\xf6\x91\xe4\x3c\x49\x57\xdb\x80\x1f\x6d\x5f"
- "\x47\x29\x4e\x87\x08\xf9\x2a\xba\xa8\x35\xd0\x45\xce\x80\xe8\xf4"
- "\x85\x2f\x50\xd5\x05\x4a\xf1\x85\xcf\x50\xd5\x8b\x64\x6b\xae\xfc"
- "\x8c\x12\xf1\x97\x66\x12\xe4\xcc\xe6\xb2\x1d\xd4\x5a\xdf\x41\xce"
- "\xfa\xd8\xb2\xce\x1c\xb2\xb5\xe0\x19\x7d\x67\x61\x3c\x9a\xed\x61"
- "\x0a\x67\xa6\xd6\x55\xee\x22\xb3\x73\x14\x99\x5a\x4a\xbc\x06\x2e"
- "\x7e\xc6\x65\xf3\x69\x4a\xf9\xc9\x52\xf0\xd0\x69\xc6\x37\xab\xee"
- "\xbd\x75\x21\xd3\x11\xdb\x2c\x3a\x62\x3b\x41\xcd\xb6\xa9\xd4\x5c"
- "\x31\x9d\xb6\x9f\xa6\xd4\x23\xa1\x29\xd4\x6c\x7e\x10\x32\x36\x9d"
- "\x7c\x5d\xb8\xb7\x47\x90\x27\x48\xf6\xd5\x04\xfe\xb8\xba\x6d\xc7"
- "\xb3\x94\xe2\x57\x30\x41\xdf\xab\x4f\xfc\xb6\x9c\x88\xe9\xcb\xcf"
- "\x89\xda\xb1\xf2\x3a\xb2\x01\xbf\x4e\xe0\x72\xf7\x49\x4a\xbd\x76"
- "\x8c\x8d\xf2\x80\xf3\x50\x5f\x5d\x98\xcc\x95\x34\x6c\x10\xd9\xca"
- "\xd2\xdc\x52\xc6\xbb\xf6\xee\x14\x9d\xcc\xa3\xdd\xeb\x0b\x21\xa7"
- "\xa9\xb3\x50\x77\x17\xd7\xb7\x1d\xb2\xee\x7c\x93\xcc\xdd\x6b\x0a"
- "\x93\x1a\x76\x8a\x0e\xbc\x2b\x35\xde\x81\x9f\x3a\xf0\xbe\x73\x62"
- "\x16\x59\x7d\xe1\x7c\xfa\xa4\xb7\xd3\xcc\x30\xd2\x83\x94\xc4\xf0"
- "\x2c\x15\x94\x8c\xf6\x0c\x01\x3e\x77\x37\x20\x7d\x34\xf2\xa1\xfc"
- "\x7e\x3f\xd5\xda\xb8\xbc\xf8\xc6\x13\x41\xed\x1b\x4f\x5c\xd0\x5e"
- "\x7f\xa2\x5b\xbc\xfe\xc4\xf9\xc8\xeb\x4f\x7c\xe1\x5c\x4b\x29\x91"
- "\x6f\x3c\x11\x68\x75\xc8\x3e\xb0\xb6\x3a\xd0\x07\x11\x4a\xd9\x70"
- "\x86\xac\x8b\x5e\x44\xdf\x87\xff\x4a\x1b\x96\x91\x4d\xcb\xb8\xa6"
- "\xc0\x17\xfe\x33\x2d\xaa\x24\x81\xfb\xe2\x44\xed\xeb\xce\xcc\x6a"
- "\x57\x32\x94\x82\x36\xa5\xd9\xfd\xe6\xab\x3d\x5c\x6f\x20\x23\xbb"
- "\x1d\xbf\x13\xf8\xf9\xf1\xeb\x10\x99\x59\x1d\xa0\x95\x33\x7d\x63"
- "\x12\xed\xed\x25\x9a\xa8\x51\xd2\x69\x4a\x9b\x02\xfc\xad\x83\xd0"
- "\x2d\x5b\xab\x2d\x74\xdd\xe2\xa2\xaa\x9e\x9e\x52\x62\xdd\xc4\x7a"
- "\x89\xf5\x14\xea\xd9\x82\x7a\xda\xa4\x2c\xee\x14\x41\x91\x59\xe8"
- "\x42\x7a\x67\x70\x7d\x69\x52\x60\x7d\xa9\xa9\x3b\xb3\x70\x13\xf2"
- "\x1c\xf0\x9b\x53\x53\x74\x1a\x76\x32\x2c\xc8\x44\x20\x2d\x4c\xc9"
- "\x80\xe9\xf8\xd5\xc5\x76\xf3\x9e\x9d\xe2\x04\xf2\x1d\xef\x87\x05"
- "\xd8\x80\x03\xfa\xa7\x75\x1a\x69\xa0\x75\xc7\x36\xe4\xe3\xf2\xbe"
- "\x50\x3e\xeb\x6f\xbf\xaf\xac\x93\x2c\x61\x1a\x2e\xfa\x54\x7d\xc8"
- "\xd3\xc9\x7a\x36\x2d\x44\x57\xf5\xb8\xa9\x80\x61\x73\x39\x5f\x57"
- "\x27\xa1\xdc\x26\xe1\x2c\x85\x7e\xa3\x39\x3d\xa2\x34\x09\x3a\xbd"
- "\xe3\x08\xca\xab\xba\xd3\x0b\x0c\x1c\xb9\x0e\xee\x6b\x89\x27\xf8"
- "\xe1\x48\x59\x88\xd2\xea\x28\x19\xe5\x1e\x65\x78\x0c\x0b\x7c\xe0"
- "\x47\x5b\x37\x1d\x29\x0b\x90\x26\x62\x60\xfa\x75\x78\x8d\x31\xf0"
- "\x90\x2e\x00\x8f\xf9\xaf\x19\x65\xd2\x1a\x25\xbc\x47\x7e\xa5\x31"
- "\xbc\x10\x99\xed\x12\xdf\xc7\x19\x46\x0f\xeb\x18\xc0\xf4\xae\x7e"
- "\x80\xba\xc8\x92\x12\x70\x96\x26\xb7\x56\x12\x71\xf9\xf7\xaa\x3a"
- "\x87\x88\xee\xc2\x64\xe6\x39\x7e\xef\x0b\x9f\x47\x9e\xf4\xcf\x45"
- "\x77\x69\x72\x5a\x17\x99\x19\x67\x94\xaf\x60\x3c\xa3\xfb\xf2\x91"
- "\x19\x8f\x4f\xa5\xc7\xa7\x3f\x34\x7d\x2a\xcd\xbe\x7f\xda\x54\xca"
- "\xbb\x7b\x7c\xde\x9d\xdf\x9e\x7c\x27\x15\xfc\xe0\x91\xa9\x54\x30"
- "\x67\x2a\x3d\x8a\x5f\xc1\xa3\x33\x1e\x99\x3e\xe3\xd1\xa9\x54\xf8"
- "\xe0\x43\x78\x9a\x36\xf5\xf6\xbc\xef\x8e\x2f\x98\xf6\xd0\x0c\xfa"
- "\xfe\xbc\x3b\xf2\xee\xb8\x83\xee\x9f\x31\xeb\xf6\xbc\x3c\xfd\x7a"
- "\x7b\x1e\x67\x59\x30\x79\xc6\xa3\xe3\x0b\x56\xbc\x50\xfe\xc2\xf8"
- "\x39\x0f\x4d\xe3\x14\x1e\x93\xa3\x78\x27\x37\x72\x51\x63\x1a\x07"
- "\xc5\xb9\x99\xa4\x41\x67\xec\x45\xdf\xe3\xd7\xe5\xad\x3a\x09\xd9"
- "\xb7\xfe\x79\x2f\xf7\x99\xd4\xad\x16\x1e\xaf\xcc\x3d\x6e\xcb\x09"
- "\xd0\x6e\x26\xd3\x0e\x63\x1a\xf2\x8c\x58\x8b\x77\xb7\xea\x63\xc7"
- "\x10\xbc\x0f\xc7\xbe\xcf\x84\x9e\xb5\x4c\x6c\xb5\x13\xf9\xf0\x03"
- "\xbd\x83\xd0\x81\xa0\x6b\x80\xba\x9d\x85\x43\xc0\xd7\x49\xa8\xa3"
- "\x03\x32\xd9\xd6\xe3\xb6\x4e\x8e\x92\xf5\x0e\xf4\x4b\x9b\x7d\x1d"
- "\x25\x9f\x25\x6b\x46\x6b\x79\x3e\x71\xff\xf8\xca\x75\x18\x17\xfa"
- "\x61\x0c\x97\x30\xd0\xe7\x80\x73\x5c\x87\xe3\x8a\xd2\x0b\x7e\x86"
- "\xb3\x1d\xef\x74\x58\x8f\xb5\x42\x3f\x40\x7f\xbf\xa5\x39\x73\x49"
- "\x64\xa6\x36\x6a\x7d\xb9\x72\x4c\x40\xb9\x43\x06\x3f\xa3\xfe\x60"
- "\x33\xea\x14\x3f\x99\x99\x84\xfe\x4f\xc2\x58\x85\xb6\x58\x9a\xc1"
- "\xd7\x90\xa3\xec\x4e\xd1\x57\x48\x2a\x2d\xc3\x1c\xa9\xc5\x73\x6d"
- "\xf6\xe7\xc2\x89\xb4\x75\x32\x6d\x08\x9e\x3b\xd1\xd7\xc9\xe0\x15"
- "\x8a\x9c\x43\xfa\x72\x4a\x46\xfa\xef\x41\xeb\x76\x99\xff\x9c\x2c"
- "\x3f\x14\x69\x6f\x03\xde\xe7\x5a\x66\xf6\x69\xf0\x0e\xa7\xc1\x4e"
- "\xc8\x78\x19\xe5\xff\x93\xf5\x9d\xd2\xc1\x23\x76\xf1\x18\x87\x76"
- "\x04\x14\x7c\xfd\x19\xf2\xaa\x70\x18\xb1\xeb\x08\xe8\x72\x04\xa3"
- "\x56\x73\x25\xdb\x36\x19\x68\x7f\x5a\xa1\x1a\x1f\x47\xd4\x71\x5e"
- "\x4d\x14\x92\xb0\xee\xaa\x00\xdc\x2e\xef\xba\x2e\x3a\xe5\x20\x93"
- "\x9f\x32\xa6\x68\xce\x52\x8a\x6a\x4b\x2e\xe3\x01\xbc\xcd\x3d\x7d"
- "\xa5\x18\x2f\x33\xc6\xc9\xb2\xc0\x4f\xc7\x8d\xf3\xd8\x18\x7f\xd6"
- "\x11\xe8\xd7\x49\xe8\xf3\x61\xa8\x2f\x10\xd7\xe7\xa9\x4c\x0f\xe0"
- "\xdb\xae\xe1\x0a\x38\x59\x62\x4d\x29\xf0\x22\x13\xd3\xc3\x3f\x00"
- "\x23\xa8\x78\x2a\x33\x2f\x8e\xa7\x9e\x04\xec\xa9\x51\xef\x0b\xe2"
- "\xde\xdf\x8f\xf7\x0f\xe8\xef\x21\xab\x99\x8e\xb8\xfa\xb7\xe2\xfd"
- "\x83\xdc\x87\x90\xc5\x64\x3f\x59\xf7\xef\x65\x5b\x72\x20\x7f\x63"
- "\x5c\xfe\xc3\xc8\xff\x3d\xe0\x1b\xe4\x71\x82\xf3\x37\xe8\x7c\x8f"
- "\xfc\x29\xc8\xdf\x16\x57\xff\x28\xe4\x7f\x34\x0a\xbf\xb8\xf6\x5f"
- "\x73\x08\xef\x0b\x99\x4f\x71\x2d\x41\x9e\xa1\x2c\xff\xac\x7b\x8e"
- "\x94\x71\xff\x5c\x63\x8f\xcb\x9f\x8f\x7c\xcf\x31\x9d\x25\x8d\xba"
- "\x99\x46\xd6\xfd\xba\x5d\x73\x42\xe1\x70\xcd\xbc\xb8\x32\xe5\x28"
- "\xb3\x92\xe9\x2b\xf9\xac\x27\x61\x99\x2d\x71\x65\xf6\x4b\x3e\x55"
- "\xf5\xe8\x7d\xac\xca\xe8\x7a\x2d\x1a\x06\xb7\x0d\xb6\xd6\x35\xc7"
- "\x62\x61\x5c\xbb\x1f\xf5\xae\xdf\xa6\x74\xc6\xd5\xe0\x89\x3b\x90"
- "\xb6\x0b\x30\xcf\x30\x1f\x41\xce\x82\xbe\x40\x08\x7a\x77\x66\xaa"
- "\xe2\xdd\xac\xf1\x96\x4a\xe2\xfb\xf1\x7c\xcf\xb0\x45\xdf\x2c\x5d"
- "\x9e\xb2\xc6\xe3\xca\xe9\x59\x9c\xce\x72\x2c\xfa\x1e\xd6\x14\xcc"
- "\xac\xef\x43\xde\x4d\x78\x8e\xe8\x75\xd4\xe0\x39\x09\xf8\x9f\x86"
- "\x4e\x07\xcf\xce\x64\x7e\x9c\x84\xf4\x97\xf5\xf7\x1b\x39\x3f\xee"
- "\x6f\xd7\xef\x93\xc0\x63\xa7\x75\x39\x83\x4c\x5d\xbb\x56\xd6\x0d"
- "\xb9\x32\xca\x6b\x8a\xef\xa7\xe1\xdd\x12\x5c\x1f\xc2\xf5\xfb\xb8"
- "\x7e\x1f\xd7\xf1\xce\x0b\x64\x73\x46\xa4\x7c\xf1\xf3\x75\xb8\x3e"
- "\x82\xeb\x10\x5c\x1f\x05\x6e\x5f\x80\xee\x9d\x01\xf0\x74\x1c\xcf"
- "\x74\xa1\x0f\x59\xee\x87\xaa\x3e\xcc\xf2\x73\x9d\x11\x43\x17\x9c"
- "\x1b\x48\xd3\xf5\x83\x2e\x0f\x7a\x5a\xdf\x4c\xa6\x4b\x01\xe0\x1f"
- "\xe6\xfa\x85\x82\x35\x44\xf5\x93\xca\xa3\xa9\x72\x66\xd5\xdf\x7a"
- "\x9a\xca\x97\x14\x5d\x27\xae\x9e\xaa\xa0\x10\xb8\x56\x32\x5d\xfd"
- "\x74\x2d\x8f\x6f\x66\x3c\x17\x30\x9d\x64\x7e\x09\xf7\x9a\xae\xa8"
- "\xfe\x86\x6d\x7f\xed\xe1\xb8\xfe\x66\x39\xdf\x26\xfb\x1b\xb4\x33"
- "\x70\x66\xfc\xc1\xd3\x3c\x4e\x5e\x65\xf0\x0d\xf8\xbb\x6b\x40\xc6"
- "\x46\x98\x63\xe1\x28\xbe\x62\xfe\x48\x77\xe8\x32\x09\x7a\x41\x87"
- "\x05\x93\x2b\x99\x57\x47\x4c\xf2\xd3\xcf\x65\x7e\xc0\x3e\xcb\xef"
- "\x83\xd0\x4d\x9c\x3f\xd9\xc1\x32\x36\x62\x9e\xf1\x5e\xbe\xcb\x98"
- "\x2f\xc7\x81\xe4\x32\xf9\xce\xe1\x07\x8b\x19\xef\x64\x3d\xfc\xae"
- "\x5c\xbe\xdb\x3a\x00\x37\xd5\xab\xc3\x4d\x4e\x64\x4b\x09\x4f\x6a"
- "\x13\x18\xd4\x74\x9b\x8b\x86\xf8\xc2\xc7\x69\x6e\x58\x44\xc6\xbb"
- "\x68\x98\x2f\x7c\x80\x6e\x25\xca\xf0\x85\x4f\xd0\x6d\x44\xa3\x7c"
- "\xe1\x1d\x18\xdb\xf7\xf1\xfb\x4f\x6e\xa1\xa4\x24\x5c\x9d\x37\xbb"
- "\x4c\x49\xbe\x70\x39\x8d\x71\x99\x71\x2d\xa3\x07\x87\x88\x1e\x5f"
- "\x78\x16\xf2\x95\xd0\xdc\x88\x38\x37\x7d\x88\xf8\x5b\x51\x84\xac"
- "\xb3\x5e\x12\x4e\x5f\x18\x76\x76\xf8\x18\xd2\x35\x31\x37\xf2\x25"
- "\x7e\x3d\x42\xf3\xa4\x7a\xe7\x46\xce\x89\x69\x2f\x7d\x82\xe7\xbf"
- "\x09\x61\x22\xe1\x0b\x4f\xa1\xd6\x60\x10\xf9\x9c\x42\xd4\xa4\x36"
- "\x2d\xba\x60\xa2\x3e\x8c\xd1\x5a\x4d\xaa\x17\x6d\x69\xeb\x43\x3b"
- "\x30\x7e\xf9\xfa\xd6\xe3\x5a\x9b\xda\x2a\x9f\x3d\xa9\x7e\x61\x4d"
- "\x6d\x9b\x80\x49\x0b\xb7\xc1\x17\xee\xa0\x22\x98\xdd\x73\xd7\x06"
- "\x04\xe3\x9f\xbe\x91\xe7\x2c\x53\x08\x7a\xd1\x32\x77\xad\x53\xe0"
- "\x5d\x8a\xc8\x48\x6d\xf3\x85\xbb\x08\x75\xc0\x6e\x4a\xfd\xab\x84"
- "\xe7\x49\xe3\xbc\x01\xce\x17\x0d\x87\x61\x70\xde\xb9\x11\xb2\x88"
- "\x9a\x34\xea\xcb\x48\x0d\xf4\x65\xa4\x59\xf1\xcb\x17\x99\x69\x8f"
- "\x08\x77\xd6\x6f\x05\xc6\x53\x94\x2f\xc6\xb3\x23\x84\x39\x82\xa4"
- "\x65\x84\x86\x22\x7f\x31\xf8\x65\x3a\xf8\x0e\xf8\xa6\x79\x24\xbe"
- "\xb5\x69\xd5\x21\xd9\x8e\xb4\xed\xaa\x1d\x69\xdb\x38\xbd\x1b\xb6"
- "\x04\xee\x9b\xba\xd5\xbb\xf7\x50\x6e\x9e\x2c\xe7\x49\x6b\x12\xd6"
- "\x34\x6f\x08\xf2\x04\xba\xba\x98\x8e\xa0\xab\x8b\x69\x09\xf8\x4d"
- "\xbe\x8a\xad\x24\x32\xd2\xbc\xc0\xa7\x0d\xe5\x4f\xf6\xc9\x31\x3e"
- "\x2d\x10\x52\xb0\xcf\x01\xce\x42\xf0\x6b\x32\x60\x04\x84\x27\x9d"
- "\xfa\xdc\x76\x9a\xbb\x56\x84\xe6\x86\x37\x86\x8b\xd6\x52\xf2\x38"
- "\x72\x01\xdf\x8f\x40\xa3\x12\xb4\xb3\x19\xd7\xe9\x78\x4f\xd7\xa0"
- "\xae\x4f\x00\x37\xc0\xf5\x89\x9a\x74\x86\x19\x01\xac\x12\xc6\xe9"
- "\x4b\x37\x59\x45\x66\xba\xf5\x4b\x89\x5f\x7a\x9e\xe6\x49\x2f\xd0"
- "\xac\xe9\xf9\x06\x0f\x31\xff\x28\xba\xed\xa0\x39\x41\x11\xf6\x85"
- "\xf7\x10\x78\xcc\xda\x1a\x3c\xc1\xef\x31\xaf\x38\x80\x7e\x66\x9e"
- "\x2a\xc7\x75\x1f\x31\xff\xb4\x3a\x5e\xe2\xbc\x9f\x30\x0f\xcd\x71"
- "\x04\x37\x8e\x27\x47\x12\x9e\x9d\x45\xe1\x14\x5a\xe4\x30\xbb\x22"
- "\x9e\x74\x7b\xab\x83\xfb\xe5\x38\xca\x70\xb9\x32\xb2\x24\xc1\xb6"
- "\x4e\x12\x61\x4b\x45\xc0\x9c\x56\xea\x14\xad\xc1\x59\xc8\xeb\x20"
- "\x6e\x0f\xf3\x11\xe7\x9f\xdd\x25\xfc\x11\x6b\x7a\x1b\xb7\x4d\xa4"
- "\xbb\xa8\xa5\xeb\x2e\xe2\xf9\x4d\x4b\xd7\x3e\xe6\x53\x4d\x58\xd3"
- "\x1b\xc1\xa3\x7d\xb3\xbb\x5c\x43\x16\x5d\xa0\x24\xa4\x45\x5a\x4a"
- "\x0f\xe0\x7d\x33\xf2\x1d\x93\x7c\x3b\xe7\x42\xd8\x12\xb6\xa6\x5b"
- "\xc3\x9e\xf4\xa6\x39\x17\xfa\x44\x4b\xe9\x0e\x7a\xb2\xcb\x05\x5a"
- "\x1d\xa0\xd9\x67\xc2\xc9\xad\x8e\x12\xe4\xe9\x41\xfa\x3e\xc9\xff"
- "\xb3\xcf\x74\x8b\x39\x2f\x8a\x73\x73\x2e\xfc\x4d\xcc\x2e\x15\x9f"
- "\x14\x55\x50\xfa\xd5\x1b\x85\xc6\x72\x71\xac\xe3\x00\x5d\x7d\xc2"
- "\x4f\x2c\x13\xb3\x16\x6b\x62\xf6\x99\x73\x62\xd1\x8b\x4c\x9b\x29"
- "\xd4\x52\x0a\xf9\xa9\xd8\xc1\xf4\xce\x6b\x29\x3d\x8c\xfa\xa7\x03"
- "\xae\x53\xf8\x2a\xf6\x20\xaf\xd7\xf2\xe4\x19\x2b\x1d\xeb\xd8\x41"
- "\xe1\x8c\x74\x6b\xa4\x26\xdd\xae\x65\xa4\xe7\x6b\x35\xe9\x05\x22"
- "\x23\xbd\x31\x5c\x93\xde\x14\xc9\x48\x07\x0f\x58\xec\xe8\xa7\x61"
- "\xdc\xe7\xbd\x98\xef\xe3\xf9\x86\x5e\xee\x7f\x8f\x25\x4f\x58\x2d"
- "\xac\x0b\x85\xe2\x7d\x4b\x1e\xcf\xd9\x45\x86\xa5\xa0\x2f\xc3\x92"
- "\x8f\x7c\x05\x4a\xbe\x2c\xc5\xcc\x97\x72\x2c\xaa\xb5\x14\x61\xec"
- "\x48\xc6\x7b\x07\x7e\x2e\xfc\x3c\x48\xf3\x03\x7e\x46\x8f\x82\xe9"
- "\x17\xf7\x7a\x60\xa3\x62\x8e\x9e\x61\x05\x3d\xef\x13\xa0\x21\xe4"
- "\xc4\xe2\xd7\x6a\x2c\x01\x91\x69\xb5\x87\x24\xef\x5b\x6f\x64\xd8"
- "\x7d\xeb\x73\x79\x2e\x6f\x16\x35\xd6\x3c\xa4\xbd\x15\x62\x5e\xb5"
- "\x5a\x1b\x35\x6b\x06\xe4\xc7\xda\xf4\xf0\x4b\x22\x10\xf1\x58\xdb"
- "\x34\x8f\xd5\x1b\xbe\x0a\xb6\x6f\xc5\x61\x62\xfd\x14\xfe\x58\x80"
- "\x06\xbf\x07\x3d\xf6\xc9\xfe\xf7\x55\x40\x06\xd6\x8e\x74\xb5\x74"
- "\x81\x17\x1c\xef\x48\xdd\xd4\x1a\x3c\x2e\x69\x0a\x3c\x1a\x99\xa7"
- "\xb8\x7f\x17\x39\xc8\x85\xba\x9a\xb4\x1a\xab\x37\x52\x03\xb8\x19"
- "\xa8\x27\xf3\x9a\x07\x42\x52\x5e\xaf\x01\xbf\x1e\x46\x99\xdf\x93"
- "\xe2\xf1\x6b\xf2\x07\xd3\x91\xac\xab\x58\x3f\xcd\x0d\x87\x98\x67"
- "\xfe\xce\x7a\x4d\xe9\x29\x2a\x32\xf4\x14\xeb\x28\x9e\x4f\xb0\x9e"
- "\xd2\x74\x3d\xa5\xe9\x7a\x4a\x3e\x5b\xa1\x6b\x3c\xa9\x6d\xac\x8f"
- "\xe6\x56\x28\x3d\x33\x37\x92\x27\xc0\x1b\xa9\x80\xd1\xa6\xfa\x02"
- "\x79\x6a\x53\xff\x2a\xf3\x4b\x3a\xa5\x91\x06\x7d\xa3\x41\xdf\x68"
- "\x4a\xdf\x14\xe8\xfa\xc6\x64\xe8\x9b\x08\xc6\x35\xc8\x94\x96\x48"
- "\xdf\x68\xba\xbe\x89\x08\xa5\x6f\x34\x5d\xdf\x70\x7a\x44\xd7\x37"
- "\x91\x04\xfa\x46\xf3\xa4\x71\x7b\x93\x75\x3d\xe3\x62\x3d\xc3\xed"
- "\xd5\x6a\xd2\xbc\x9a\xd2\x33\x7e\xcc\x25\x4c\xac\x67\x22\x28\xa3"
- "\x19\x7a\xa6\x47\xea\x03\x62\x5d\xd3\xf7\x43\x82\xfe\xb4\x13\xeb"
- "\x18\xa9\x4f\xc2\xa3\xc2\xac\x4f\x40\xbf\xfb\xe2\xf5\x89\xa8\x4d"
- "\xb7\xe2\xde\xaa\xf4\x54\x7a\xbe\x65\xa3\x08\x43\x9f\xd8\xe7\x56"
- "\x04\xd1\xd7\x7f\xc5\x9c\x1a\x7a\xbb\xa2\xdc\xe5\xab\x08\x13\xf4"
- "\x40\x81\x68\x75\x11\x74\x0e\xf8\x37\x02\x5d\x41\x04\xb9\x6c\x84"
- "\x7c\xb6\xa1\xee\xa6\x56\xc7\x9f\x09\xf2\x6e\x9d\xdd\xd5\xed\x5b"
- "\x14\xcc\xb5\xce\x3e\x23\x02\xa0\x8f\x7f\x91\xc3\x05\xfd\x92\x1b"
- "\x68\xe9\xfa\x88\x66\x75\x08\x6d\x56\xb1\xdf\x0e\x3c\x9a\x66\x2f"
- "\xf3\x5a\x16\xbd\x68\x85\x9c\x09\x2f\xf4\xe2\xff\x3d\xfb\x8c\xd5"
- "\xb2\xb0\x83\x6e\x98\xb5\x58\x68\x90\x27\xd0\x1d\x72\x06\x79\x84"
- "\x8c\xe5\x43\xe6\x0a\x20\x67\x8d\xe1\x38\x39\x83\xcc\xdc\x80\x7b"
- "\xbb\xa2\x9f\xa5\x00\x72\x96\xa7\xc9\xf1\xac\x43\xce\xe1\x20\x0f"
- "\x05\xbc\xc6\x05\x59\xcb\x83\x5c\x48\x59\xd3\x54\xb9\x62\x8d\xe9"
- "\x67\xd2\x65\x0d\x7d\x81\xf7\x0e\xfc\x5c\xf8\x25\x96\x35\x47\x94"
- "\xac\xbd\xa8\xcb\x5a\x86\x92\x35\xf4\x69\x72\x64\xbd\x92\x37\x86"
- "\xcf\xf3\xbc\x7e\x79\xcb\xb4\x36\x0a\xb6\x27\x25\xef\xb0\xcc\x59"
- "\x31\xae\x58\xdb\x20\x6f\x5e\xcd\x93\xc1\x7c\x1d\x60\xbd\x09\xde"
- "\xfc\x0f\x1e\xeb\xe6\x38\xc4\x7f\x14\x45\x46\xba\x50\x57\x1b\x74"
- "\xd9\xdf\xa0\x47\xff\x63\x51\x90\x1a\x01\xab\x51\xcb\xb0\x36\x41"
- "\x9e\xbc\x5a\x8d\x94\xa7\xfc\xc8\x7a\x86\x79\x4d\x7e\x3f\x0c\x39"
- "\x56\xc6\xca\xd3\x60\xeb\x8b\x3d\xee\x1b\xa7\xf8\xe9\x57\xe5\x6c"
- "\xaf\xe0\x7e\xa6\x9f\x0e\xcd\xd4\xef\x61\xff\xd4\xcb\xb5\x69\x96"
- "\x41\x47\x15\x5d\x7b\x9a\xec\x29\xe0\x77\xc2\x7d\x2a\xee\x53\xe7"
- "\xde\xfa\x09\xec\x88\xcd\xfb\x51\x6f\x0f\xcb\xa1\x70\x4f\xe2\x39"
- "\x57\x3e\xf8\x30\x45\xf4\xe4\xa6\x8a\xcc\x9c\xd5\xa2\xcf\xc6\x6b"
- "\x58\x16\x3c\xa7\xa3\xfd\x63\x70\xcd\xdc\x73\x91\xb2\xf0\xb3\xed"
- "\x71\x6b\x2e\xb6\x9d\x70\x9f\x27\xd6\xd8\x86\x6f\x5f\x4d\xe3\x2c"
- "\x41\x4a\x69\x70\x6b\x85\x96\x8d\x56\x5e\xcb\xc9\xe2\x7b\xe1\x6e"
- "\x2c\x6d\xb8\x48\x66\xb6\x2b\xb5\x0c\xd4\x57\x61\x11\x62\x65\x2e"
- "\x35\xac\x80\x7e\x70\x93\xad\xc1\x2d\x9a\x22\x3d\x4c\x83\xd4\x26"
- "\x03\x17\xc6\x0d\x78\xe6\x00\xcf\xec\xc7\xd6\xe6\xd3\xef\x2b\x28"
- "\xe1\x1a\x68\x8f\xdb\xde\xdf\xfe\x41\xde\x2f\x34\x68\x32\xc8\xfb"
- "\x4a\x83\x4e\x83\xac\x97\x99\x79\x8c\x8e\xac\x16\x81\xea\x67\x89"
- "\x69\x61\x73\x86\xc5\xff\x06\x1d\x5d\x55\x11\xca\x99\xbb\xf6\x46"
- "\xe1\xeb\x12\x5e\x5f\xc5\x19\x6a\xc0\xfb\xaa\x4a\xa1\x69\x19\x39"
- "\x85\xa2\x26\x67\x5e\xf7\x6a\x11\xe6\xb5\x12\xd4\xe1\xf7\xd3\x3d"
- "\x2e\xd5\x17\xe9\x79\x72\x9e\x67\xcd\x99\x07\x58\x19\x0c\xab\x05"
- "\xe5\x23\x35\x39\x0b\x7b\xdc\xa3\x52\xfc\xf4\xfb\x85\x32\x9f\x35"
- "\x3d\xcf\xb1\x8e\xae\x3f\x4d\xa3\xf2\xa5\xad\xef\xc9\x29\x63\x7d"
- "\x80\x34\x2b\xd2\x66\x01\xbe\x03\xf9\x27\xfb\xe9\x17\x75\xca\x8e"
- "\x1d\x35\xcb\xc8\x87\x7b\x3b\xdf\xc7\xf0\x4f\x92\xdc\x5e\x41\x7f"
- "\xd9\x07\x36\x5b\x38\xcd\x1c\xb5\xf9\x62\xc5\x2f\x3f\xf1\xeb\x01"
- "\x7d\x9e\xde\x04\x5b\x8b\x9c\x1b\x28\x1b\xfd\xc3\xf8\xfd\xd6\x59"
- "\x21\x4e\x09\xf7\xa8\xc2\x9f\xac\x0b\x61\x9e\x30\xea\x98\x9f\xb6"
- "\xd4\x0f\x46\x4f\xc1\xb6\xce\x45\xd1\x59\xbd\xba\x9f\x96\x9f\xce"
- "\x5d\xab\x09\xbe\x67\x7d\xd4\x80\x74\xa6\x5b\x8f\xfb\xa6\x2c\x83"
- "\x66\x83\xf7\x4b\x4e\xa9\x9a\x17\xde\x54\x2e\xdc\x82\xbc\x37\xf0"
- "\xfe\xc4\x4d\xab\x14\x1d\x2c\xf9\xdd\xd0\x23\xbc\xfe\xda\x00\x7a"
- "\xaf\xb4\x89\x10\x60\x96\xfa\xe9\xb6\x80\xbe\xce\x13\xf4\x85\x67"
- "\xb0\x6e\x49\x38\x6e\xf1\xfe\xcf\x00\xfc\xd1\x3b\x5a\xb3\xa1\x87"
- "\xa4\x6e\x9a\x3f\xbd\x4a\xe1\x1d\x62\xb8\xde\xaa\xf3\xd4\x81\xf7"
- "\x2b\x83\xa2\x53\x78\xe6\x4f\xe6\x79\x84\x77\x75\x2f\xa7\xbd\x06"
- "\xde\x16\xde\x15\x8c\xd3\xe8\xd7\xbc\x37\xf4\xd2\x29\xcc\xfb\x1a"
- "\xfa\xd7\x64\x46\xbb\x78\x0d\x46\xad\x23\x8d\xc6\x7c\x68\xdc\x21"
- "\x03\x2f\xb6\x31\x40\xdf\x14\xb6\x39\xd8\xd6\xe0\x35\xfd\x95\x95"
- "\x22\xc4\x36\x07\xf2\x8e\x33\xda\xc0\xed\x53\xed\x1a\x9d\x1f\xdd"
- "\x2e\xe0\x10\xc0\x1c\x5a\xd2\x60\xe5\x5a\x4a\xb1\x2b\x5a\xa7\x70"
- "\x7b\xb9\x2d\xdc\x66\xd9\x16\xa9\x63\x31\x46\x84\xef\x42\xfd\x32"
- "\xbd\x00\xb0\x30\xff\xf9\xe6\x3c\xc5\x53\xa3\x29\x9e\x8f\xfa\xfb"
- "\xd1\x9a\x4e\xce\x2f\xe9\x06\xa7\x26\x4e\x9e\xa2\x31\x3c\xdf\x4d"
- "\xe6\xab\xc6\x76\x76\x88\xf9\x77\x74\x01\x8f\xc9\xbe\x4a\xd6\xb7"
- "\x32\xef\x35\xc8\xdb\x81\x3c\xc3\xf4\xbc\xc3\xd4\x7e\x8e\xbc\x0e"
- "\xe5\x2b\xc6\xc5\x88\x9f\xc6\xd8\x03\x72\xbc\x9f\x4f\xc6\xb3\xc0"
- "\x33\x70\x69\x17\x35\xa3\x0b\x12\xe3\x92\x21\xc7\xb3\xc8\x45\xd1"
- "\x85\x7a\xbe\xc1\x3c\xe5\x5c\x4b\xd7\x81\x2f\x3f\xad\xda\x40\xd7"
- "\x30\x3f\x89\x8c\x9c\x72\x45\xf7\x31\x65\xc2\x0d\xdb\x13\x1a\xd5"
- "\xb1\x9a\xae\x87\x1c\x95\x9d\xa6\x31\x1b\x8b\x2a\xed\xc0\x95\xa8"
- "\xfa\x2c\x91\xd4\x41\x19\x39\x0e\x5f\xf8\x33\x6a\x38\xcb\xeb\x2f"
- "\x63\x1a\x0d\x5e\xc4\xfd\x81\xcb\xe9\x0b\xd0\xd5\xa5\xd6\x0f\xc6"
- "\x5e\xc7\xeb\xf7\x27\x69\xac\x99\xdb\x8b\x5f\x12\xea\xbe\x20\x2e"
- "\x8a\x85\x42\x8d\x69\x98\x83\x8e\xcd\xc3\xd5\x25\x7f\x6e\x2a\xd6"
- "\x9f\x1d\xc8\xd7\x21\x2e\x6a\x9c\xc7\x85\xf6\x87\x85\x3b\x89\x65"
- "\xe2\x70\x8f\x7b\x6c\xae\x9f\xa6\xea\xf2\x3e\x26\xc8\xb0\x06\xc1"
- "\xc1\x81\xbe\x25\xe6\x4d\xe0\x51\x63\xaf\x4a\x62\x3c\x96\x48\xb9"
- "\x00\xac\x06\x93\xd2\xdb\x1a\x70\xdd\xeb\xd6\x4a\xa1\xa3\x4b\xb5"
- "\xda\xb1\x47\xe5\xbd\xfe\x4e\xe8\xe3\x68\x62\xf8\xf3\xa7\x7b\x47"
- "\x32\x8f\x8f\xed\x52\x70\xe6\x4f\xf6\x8e\x3c\xcd\xcf\x67\xf8\x39"
- "\x68\xbd\xf9\xa8\xaf\x2e\x1f\xf5\x9f\xe6\x7a\xbb\xd4\x7c\x7e\xec"
- "\x99\x6e\xd4\x81\x36\x74\xf9\x69\x7c\xb3\xda\xcb\xb8\xf9\xe8\x20"
- "\xb2\x67\x65\xd9\x61\x99\x53\x32\x7d\xcb\x3b\x2d\x8d\x52\xfe\x8a"
- "\xc1\xf3\x2e\x5d\x6f\xf0\x5a\x4b\xea\x49\xba\xe5\x40\x8b\x4d\xf2"
- "\xb7\x49\x98\x6e\x9e\xf5\xae\x16\x30\xf1\x7e\x93\x52\x5f\xb7\x1c"
- "\xb8\xf4\x77\x33\xda\x77\xb3\x07\xbf\x7a\xfd\x19\xf3\xff\x9b\x0f"
- "\xe3\x3e\x15\xbf\x7a\x49\xbb\xdd\x25\x49\x7e\xbc\xeb\x86\xcd\xce"
- "\xcf\x7e\xba\x79\x8b\xd8\x3d\xc6\x04\xbb\x44\xde\x37\x5c\xc7\xeb"
- "\x04\x37\x1f\x44\x7f\x4d\x51\x7d\x71\x8b\xdc\x53\x04\x6e\x4c\x77"
- "\xe1\xac\x13\xa1\xe6\xaa\x20\xf0\xbe\xb9\xa3\xb9\x2e\x48\xf6\x9b"
- "\xb9\xfd\x37\x77\x72\x9b\x82\xa0\x3f\x5f\x57\xd6\x89\xc0\x91\xfa"
- "\x30\xf1\xbe\x57\x8f\xfb\x16\xc8\x5f\x29\xa9\x35\x87\xf9\xc5\x0c"
- "\x4f\xe7\x09\x61\xb4\x5f\xe9\xb4\x9b\x8f\x72\x5f\xe2\xf9\x2e\xb4"
- "\xdd\x72\x96\x6e\x59\x25\x32\xc7\x1e\x3d\x52\x4a\xb4\x07\x7a\x04"
- "\x63\x8d\x5c\x8b\x87\x5e\x62\x98\x18\xff\xc7\xd6\x1b\xfb\x34\xdb"
- "\xf0\x7e\x3b\xde\x61\xec\x09\xb4\x94\x86\x88\x61\x45\xb8\x7d\x28"
- "\xff\x91\x16\x30\x63\xac\x46\x9f\xdf\x7c\xb4\xca\x01\x3d\xd3\xaf"
- "\xb7\x6e\xc9\xde\x70\x46\x84\x8c\xf6\xf1\x5e\x28\xe0\x82\xff\x9f"
- "\xb5\x0d\xca\xff\xfd\x38\xe7\xfe\xe1\xc8\x18\xd5\x67\x1a\xe8\x12"
- "\xdb\x67\xb9\x47\x55\x7f\xdd\x12\x8e\xed\xaf\xdc\xa3\xf8\x4d\xc7"
- "\x6f\x21\x7e\x65\xfa\x73\xf4\x2f\x2f\xea\x1e\xd2\x9a\x7b\xb0\xc7"
- "\x9d\x8b\xf1\x7f\xcc\x21\xd5\x0f\x9c\x8e\x76\x30\x8f\x7c\x41\x29"
- "\xbc\x5e\xc7\xfb\xa0\x9c\xce\xfc\xcc\xe9\x1a\xec\x19\x3c\x17\xe0"
- "\xbd\x95\x65\xb5\x5a\xa3\x98\xf7\xbe\xcd\xe0\xb9\x75\xbd\x8c\xff"
- "\x9b\x72\x8d\x71\xe3\x96\x2d\xcc\xa7\xc8\x33\xcf\x12\xde\xb2\x05"
- "\xf5\x1d\x30\xe8\x8a\xb4\x1d\xfc\x9e\x79\x12\xe9\xcd\xa0\x8b\x5c"
- "\x43\x0f\x62\xbe\x97\xd8\xd6\xc8\xed\xec\xb7\xc9\xac\x16\x3f\xeb"
- "\xa3\x2e\xba\x35\x08\x9d\x85\xbe\x1d\xeb\x55\x63\xcd\xad\x17\xf8"
- "\x19\xba\xf2\x53\xdc\x07\x5a\xd0\xca\xde\xda\xec\xf6\x3e\x13\x0d"
- "\xed\x35\x51\x7e\xb8\x76\xf3\xb1\x70\x66\x56\x87\xaf\xf3\x20\xb5"
- "\x86\x7f\x49\xf6\x67\x25\x8c\xcf\x7d\xe0\x01\xe7\x5a\x11\x79\xaf"
- "\x77\xbf\xd9\x17\x3e\xe7\xc5\xd8\x7c\xe3\x69\xba\x55\xd2\xe3\x95"
- "\x93\x18\xf5\x17\x49\xd8\x3a\x7d\x36\xef\xdf\xbe\x54\x84\xb7\x9f"
- "\x12\x41\xd8\x77\xc3\xb7\xf5\xd2\xb8\x37\xd6\x51\x5e\x7d\x2f\x8d"
- "\xd9\xdb\x4b\xb9\xe2\xef\xb9\xa6\x7a\xd8\x6d\x8b\x2e\x58\x09\x3a"
- "\xa1\x30\xdd\x41\x29\x7b\xd7\x91\xe4\x91\x48\x0d\xec\xb7\x30\xec"
- "\xb7\x73\xb9\xac\x1b\xfb\xed\xb7\x3e\x69\x17\xe7\x9c\x50\x7c\x94"
- "\x73\x22\xad\x94\x92\x52\x8b\xc9\x0a\xfc\x9c\x67\xe9\xd6\x5b\x53"
- "\x3b\x60\x3b\xa2\xcd\x7e\xbd\xbd\xb8\x4e\xb1\x94\xd2\x50\xd9\x56"
- "\xe8\x6b\x51\x33\xd6\x3b\xe8\x38\x6c\x62\x9e\x0a\xb2\xdc\xa0\x0d"
- "\xb7\xdd\xcf\x7b\xb1\x07\x47\x86\xcc\x2b\xeb\x45\x88\xd3\xcb\x47"
- "\x89\x10\xd2\x73\xb9\xee\x26\xa4\xf7\xb8\x6f\x2b\xf0\x9b\x53\xf6"
- "\x0d\xc6\xa3\x98\x1f\xe9\x7a\xe5\xb6\x3f\x0a\x93\x8b\xe7\xce\xf6"
- "\x0d\x61\xd8\xde\x67\x59\x66\x6f\x6b\x9b\x5b\x26\xc2\xf6\xe5\xbc"
- "\x2f\x7e\x9b\x97\xf7\xec\x79\xaf\xee\x5d\xd8\x36\x5f\xb5\x4f\xcf"
- "\xe3\x05\xcf\x15\x2c\x65\x80\x59\x6b\xc5\xb8\x95\x1b\xe7\x23\x40"
- "\x34\x98\x1d\xcf\xbe\x22\xaf\x4a\xbf\x94\x6f\xa6\xfa\xe9\xe1\x12"
- "\xc6\x9d\xf7\x64\x59\x77\xc2\xde\xba\xe6\x14\x7d\x73\x66\x10\x74"
- "\xc0\x7b\x8c\xff\x33\x27\xeb\xfb\xaa\xd2\xdf\x05\x69\x18\xff\x1f"
- "\xaa\xe4\xb4\xf2\x51\x64\x2b\xb7\x8b\xce\xc1\x6c\x26\xe9\x83\x62"
- "\xa2\x6f\xa0\x4c\xb9\x01\x07\xe3\xd4\x3f\x77\x9b\x1e\x7b\x0c\x69"
- "\x5b\x0c\x38\xc8\x73\x2d\x9e\xeb\xfa\xf3\xa8\x32\xfb\xa3\xca\x3c"
- "\xd6\x6d\xba\xed\x9f\x91\x76\x38\xae\xcc\xb1\xb8\x32\x27\xa2\xca"
- "\xb8\xf4\x7a\x02\xb1\x65\xc6\x51\x6c\x99\x71\xd6\x4b\x71\x1b\x37"
- "\x26\xae\xcc\xa4\xb8\x32\xd3\x2f\xc5\x6d\x5c\x61\x5c\x99\xd2\xb8"
- "\x32\x15\x51\xb4\x64\x7f\x10\xd8\x57\xe3\xb6\xc6\x95\xa9\x8f\x2b"
- "\x73\xc0\x78\x1e\xcc\xe7\x67\xe5\x1e\xb2\x81\x37\x3b\xb9\x3f\x5f"
- "\x45\xff\x74\xbf\xfe\x5c\x8f\x5e\xb6\x33\x41\xbb\xc2\xb1\xf5\x8d"
- "\x4f\x8d\xad\x6f\x7c\xf6\xa5\xed\x1a\x9f\x17\x57\x26\x3f\xae\x4c"
- "\x41\x54\x99\x46\x55\xcf\xf8\x92\xb8\x32\xe5\x71\x65\x36\x5f\xca"
- "\x57\xe3\xeb\xe2\xca\xec\x8f\x2b\x73\xe8\x2b\x68\xc1\xe3\xb8\xf2"
- "\xcd\x1a\xc1\xb6\xf2\x03\xb0\x11\x26\x8c\x62\x9f\x03\xde\x9b\xfc"
- "\x49\x6f\x68\x08\xef\x87\xf0\x78\x75\xa4\x22\x84\xb1\x65\x02\xe6"
- "\x3f\x77\xba\x8c\x31\x8b\xfd\x31\x58\xa6\x95\x8d\x3d\xbe\x73\x30"
- "\x5b\x94\xeb\x31\x7c\xb5\xb8\xae\x23\xd9\x3c\x4e\x4d\x98\xd7\x6f"
- "\x13\x2b\xff\x25\x52\x70\x26\xfc\xcc\xd8\x1b\x6d\x50\x7e\x1e\x49"
- "\x6c\x93\x1f\xa9\x90\x65\xb6\x44\xd9\xd1\x5c\x7f\xf0\xe0\xba\x90"
- "\x39\x16\x8f\x09\xa5\x97\xc1\x23\x15\xb6\x51\x6e\x2b\x2c\x0b\xde"
- "\xbf\x6e\xa9\x87\x0d\x04\xbb\x9f\x71\x3b\x49\x13\x02\xd2\x26\x5b"
- "\xde\x4b\x7c\xef\xab\xbc\x47\xee\x6f\x2b\x9b\x74\x62\x6e\x33\xea"
- "\x67\xdb\xbd\xd9\x71\x9e\xba\xe5\xf8\xcb\xb6\xdb\xc4\xc7\x8e\x54"
- "\x06\x80\xd7\xc4\x7e\xff\x0f\x3f\x4d\x9c\x27\x6d\x0d\xcf\x7c\x3b"
- "\xef\xbd\xf3\x1e\xd2\x91\xe0\x64\xce\x03\xfe\x9f\x30\xce\x68\x2f"
- "\xc6\x7a\xc8\xd8\x84\xf0\xe5\x68\xa6\xfa\x70\x62\x65\x2c\x4f\x0e"
- "\x01\xaf\x4c\xf4\xc4\xf6\xfb\xc4\xc6\xd8\x7e\x9f\xd8\x14\xcb\x93"
- "\x26\xf0\xe4\xc4\xe6\xb8\x32\xc7\xe3\xca\x74\x44\x95\xf1\xe8\xf5"
- "\x84\x62\xcb\xe4\xa5\xc4\x96\xc9\xb3\x45\x3d\xa3\x8d\x79\xb9\xfd"
- "\x73\x1f\xe9\x5b\x94\x37\x39\xea\xd9\xb4\x43\xea\xcf\xbc\x59\x46"
- "\x1a\xaf\x1d\xed\xdd\xa9\x7c\x5b\x74\x78\xa5\x71\xf2\xce\xf9\x2b"
- "\xe3\x70\xd8\x1a\x87\x43\xbf\xfc\xeb\xfb\xe9\xbf\x3b\x45\xb7\x97"
- "\xeb\xfb\xe9\x5d\x18\xb3\xe7\xf2\x33\x60\xd5\x21\x3f\xe8\x90\x77"
- "\x2c\x0e\xde\x89\x38\x78\x5d\x51\xcf\x56\x3c\x87\xa3\xda\x60\x4d"
- "\xb6\x49\x3f\x41\xd8\x6f\xb7\x67\x19\xe9\x3c\xa7\x04\xbe\x9d\x4e"
- "\x39\xd6\xe4\xb3\xcf\x56\xe6\x49\xba\x9d\x7d\x9a\x74\x5d\x7e\x7b"
- "\xb4\xfc\x93\x6a\xd7\xed\xf3\x62\xf1\xb8\xbd\x24\x16\x8f\xdb\xcb"
- "\xa3\xda\x15\xb4\x6c\xa4\xef\x5b\xc2\x8f\xcc\x67\xdb\x87\x7d\xed"
- "\xa4\xef\xd4\x06\xd8\x6c\x17\xc8\xca\x3e\x6b\xa7\xca\x29\xd9\x57"
- "\xd1\x89\xb9\x5c\x4e\xfb\xa0\xfc\x94\x39\x3f\x4f\xf7\xfb\xb3\x03"
- "\xfe\x71\x83\x1f\xb5\xda\xf9\x79\x5a\xcd\x98\x7a\xa4\x41\xff\x4d"
- "\x2c\x56\x76\xee\xe8\x4e\xe1\x2c\xac\x03\x3d\x31\x2f\xba\xe3\xcf"
- "\xfa\x3c\x62\x3a\xfb\x5e\x41\xf7\x74\x62\x8c\x4f\x55\x7b\xe5\x77"
- "\x64\x47\xf1\x75\xd0\xbe\xee\x3e\x71\x92\xee\xf8\x94\x6d\x00\x96"
- "\x51\xf6\xe1\x3a\x12\x0e\x10\xcf\xbd\x7d\xe1\xd3\xd2\x76\xc3\x7b"
- "\xbf\x5e\xb6\x30\xaa\x6c\x40\x9f\x1b\x77\xf2\xbb\x89\x61\x32\x1f"
- "\x09\x06\x08\x70\xb2\x94\xbd\x77\xc7\xa7\x47\x20\xaf\x28\xb3\xd5"
- "\x28\xc3\xf3\x68\x2e\x63\x29\x27\xf3\x84\x4a\x32\x7b\xd7\x9d\x94"
- "\xb0\x0d\x5f\x0a\xd8\xd2\x5d\xbe\xca\x4e\xf2\x05\xdb\x79\xad\xcb"
- "\xac\x7c\x60\xee\xf0\x27\x87\x28\xa5\xbb\x66\xbe\xdd\x8f\xfb\x48"
- "\xcd\xfc\x5c\xe0\x86\xfe\xb9\xc3\xcc\xfa\x26\x9a\x76\x33\x66\x14"
- "\x3c\x32\x77\xf6\xf8\x1f\x3c\xf2\xd0\xbc\x19\xf7\xd8\xe7\x2d\x7b"
- "\x7e\x49\xc9\xf8\x17\x56\x95\xdb\xd7\xac\x58\x56\xbe\x6c\xf9\x33"
- "\xf6\xbc\x8a\xb1\x15\xf6\xc5\xe5\xea\x9a\x5b\xb6\x78\x65\xf9\x54"
- "\xbe\x1d\x67\x77\xac\x58\xb2\x5a\xde\xde\x3a\x9c\x62\x81\x2c\x2b"
- "\x5f\xb2\xc2\x3e\xb6\x64\x9c\xfd\xc1\xc5\xcb\xca\x56\xad\x58\x92"
- "\x10\xd6\x3d\xf6\x15\x4b\x56\x2c\x59\x5c\x62\x9f\x6a\xcf\x63\xc8"
- "\xd1\xe0\xa2\xfa\x33\xcf\x18\xc7\x78\xfc\xaa\x76\x8b\x36\x7d\x3c"
- "\xf3\x2b\xfe\xb9\xf3\xe0\xa5\x63\xd9\x9d\x47\x63\x79\xee\xce\xf6"
- "\x58\x9e\xbb\xb3\xf3\xd2\xb1\xec\xce\xb8\xf1\x6f\x52\xdc\xf8\x37"
- "\x29\xfb\xd2\xb1\x6c\x52\xdc\xf8\x37\x29\x6e\xfc\x9b\xd4\x3f\xfe"
- "\x81\x97\xfc\x9b\xa4\x5e\x98\x14\x37\xfe\x4d\x8a\x1b\xff\x26\x6d"
- "\x8e\x7b\xde\x11\xf5\x7c\x0d\x9e\xf7\x45\x8f\x8f\x78\x3e\x68\xc8"
- "\xe7\x80\x7e\x99\x74\xd4\xc8\xc3\xba\x1e\xba\xb9\x43\xcf\xeb\x8f"
- "\xca\xdb\xa9\xe7\x0d\xf6\xcb\x1f\xf8\x88\x7d\xdd\xd4\x7c\xfd\xae"
- "\xf9\xac\xd3\xd9\xcf\x8d\xc7\x26\xc8\xc7\x8d\x67\x69\xd2\x1f\x19"
- "\x16\xf3\x30\xfb\x3d\x8a\xd7\x9f\xe8\x69\xc8\xa4\x14\x2e\xd3\x50"
- "\x4b\x66\xe1\xbe\xa3\x0b\x57\x42\x5a\x2a\x7e\xd0\x29\x77\xc1\xfe"
- "\x1d\x56\xae\xc6\x8b\xbb\x1a\xa5\xcd\x8f\x32\x3a\x7c\x39\xaf\x01"
- "\x1c\x1b\xca\xa4\x54\xab\xb1\xb8\x03\xf7\xa9\xcc\xd3\x28\x6f\x16"
- "\xa6\x3b\x6f\xc7\x95\x90\x66\xc5\x2f\x0b\xf0\x1a\x0d\x78\x9b\x47"
- "\x24\xb6\x2d\xe3\xed\xdc\xfe\xf9\xa0\x89\x2c\xd5\x6e\xad\xdd\xa7"
- "\xb1\x6d\x7d\xd7\x71\xb5\xb6\x90\x8d\x39\xe6\x27\x85\x0d\x48\x4f"
- "\x3c\x4f\xfa\x16\xec\xbf\xbb\x8e\xaa\xf5\x96\x6f\xa1\xff\x1f\x0e"
- "\xaa\xb5\xd3\xec\x10\xf4\x6d\xef\x29\xfa\xd6\x07\xb8\xf6\xe1\xba"
- "\xcb\x80\xef\x95\xf3\xed\x6f\x4d\x12\xee\xa4\x47\x19\x6e\x5c\xfa"
- "\x2c\xe8\xb7\x5e\x4b\xd8\x55\x98\xe0\x5d\xa9\x70\x27\x3f\x92\x20"
- "\x9d\xe7\xdf\xbd\x7e\xfa\xd6\x41\xc6\x37\x2a\xbd\x4e\xb8\xd3\xe7"
- "\x71\x7e\x3f\xd7\x87\x32\x83\xd9\xda\x86\x5f\xab\xf2\x43\xff\x56"
- "\x47\x5c\x3b\xbe\x3c\x45\xdf\x5e\xac\xda\xf1\xed\x8f\xe2\xea\x0e"
- "\x27\x6e\xc7\xb7\xb3\xd0\x8e\x2f\x13\xb7\xe3\xdb\x79\x92\xb6\x26"
- "\xb4\xc5\x74\xc9\xbb\x59\x68\xcb\x97\x92\xee\xb1\xe9\x25\xba\x2d"
- "\xc4\x73\x32\x2b\xde\xc9\xb2\x8f\x56\x0e\xf4\x9b\x9e\x6f\xab\xa5"
- "\x8e\x0a\x12\xd4\xb9\x4f\xb8\x87\x3e\xea\xa7\x6f\x9f\x90\x70\x06"
- "\xd2\x0f\x2b\x5c\x40\x27\x93\xa4\x13\xcb\x83\x65\xb0\xfe\x36\xe6"
- "\x25\x6a\x2d\x64\x32\xe4\xff\x5b\x5e\x63\x2d\x73\x65\xa5\x08\x18"
- "\x74\xc4\xbb\xdc\xb8\x77\xa1\xa8\x77\xd3\x63\xde\x6d\xe8\x4f\x5f"
- "\x68\xa4\x7f\xbd\x7e\x9a\xbc\x35\xae\x9f\xd0\x3f\x77\xe7\xc4\xb6"
- "\x7b\x72\xbd\x6a\x1f\xfa\xe8\x12\x5a\x4f\x3e\x84\x3e\xea\x4b\xdc"
- "\x47\x93\x8f\x27\xe6\xb5\xc9\x72\x1d\x4d\x64\x52\x02\x78\x77\xf3"
- "\x1c\xbb\x4f\xf2\xa0\xde\x4f\x97\xf6\xcf\xdd\xe3\x8c\xfe\xf9\x7a"
- "\x6d\xbc\xdb\x11\xd7\xc6\x08\x60\x9c\x51\x6d\xbd\x67\x6a\x1c\xec"
- "\x2d\x89\x79\xf1\xee\x46\xb4\x33\x92\xb8\x9d\x77\x1f\x1e\x9c\x17"
- "\xef\x6e\x47\x7b\x22\x97\xf2\xe2\xdd\x01\x55\x86\x12\x94\xb9\x27"
- "\x55\xb8\x13\xd5\x73\xcf\x18\x67\x98\xed\xdc\x7b\x16\xf2\xfa\x52"
- "\x54\xfa\x94\x58\xfe\x43\x1b\xb8\x1c\xd3\x2f\xac\xf4\x2c\xf7\xc3"
- "\x29\x3b\x99\xbe\x8a\x27\x7b\xdc\xf7\xd4\xc7\xd1\xea\xdc\x29\xfa"
- "\x4e\x4e\xb7\x29\x69\x9f\xa2\xd7\x77\x3e\x8d\xc3\xe9\x50\x62\x7a"
- "\xdd\xd3\x06\x7a\x9d\x4b\x4c\xaf\x7b\xba\x06\xa7\xd7\x77\xb8\xff"
- "\xcf\x5d\x4a\xaf\xef\xd8\xa3\xe9\x05\x5b\x57\xb6\x6f\xb4\x0d\xbc"
- "\xd1\x57\x24\x1a\xb8\xad\x11\xb2\x5a\xc0\x2b\xaa\x4c\x17\x97\x99"
- "\x67\x09\x29\x3e\x81\x0d\x99\x72\x96\xbe\x33\xc5\x90\xff\xf4\x3a"
- "\x1a\x2a\xfa\x9e\x60\x3f\xa2\x24\x2e\xe7\xab\x38\xe7\xf5\x85\xf3"
- "\x88\xe7\x1f\x71\xf5\xd6\x25\xd6\x05\xdf\x69\x02\x4d\x6b\x13\xa4"
- "\x1f\x55\xfe\x65\x53\x28\x56\x47\x7c\xc7\x1f\xdb\x47\xa0\x1b\xca"
- "\xe9\xdb\x4e\x5f\xf9\xbb\x7c\x9f\x4d\x29\xb8\xb4\xcf\xa6\x7c\xa1"
- "\xfa\x6b\xca\x1f\x63\xf1\x9b\x52\x9a\xb8\xbf\xa6\xb8\x06\xef\xaf"
- "\x29\xf5\x83\xf7\xd7\x94\x43\xdc\x5f\x68\x6f\x20\x76\xdc\x98\xd2"
- "\x16\xdb\x5e\xd4\x8b\x72\xc2\x74\xd5\x35\xfc\xfc\x75\xdb\x6d\xfc"
- "\x58\xc7\x71\x5f\x35\x54\x11\x78\x39\x69\x14\xe3\x78\xa5\x30\x06"
- "\x85\x0d\x1a\x7a\xd6\x25\xde\x6f\xe5\x39\x6e\x6b\x1d\x11\xef\x23"
- "\xdb\x6f\x60\xdb\x7d\xea\xef\x35\x13\xb5\xe3\xde\x74\x8a\xee\xab"
- "\xd1\x4c\xa6\x4a\xde\xf3\x94\x7e\xe1\x72\x0d\x61\xea\x89\xe8\xbe"
- "\xe0\xbd\x4f\x9e\x9b\x6e\x57\x73\xa7\xbf\x9d\xa2\x7b\x97\xa8\x7e"
- "\xb9\xef\xc5\x58\x3a\xde\x4b\x89\xfb\xe5\x5e\x1b\xfa\xe5\x6f\x89"
- "\xfb\xe5\xde\x49\x83\xf7\xcb\xbd\x05\xe8\x97\xbf\x5d\x2a\x47\xf7"
- "\x96\xea\x72\xb4\x89\xcb\xd8\x97\xf3\x7c\xfc\xde\x7f\xe7\x3c\xb8"
- "\x87\x8c\xdc\xcb\x47\xca\x93\xc6\x77\x19\x72\x24\xcb\xd4\x03\x96"
- "\xac\x5f\xcf\x53\xa7\xc3\x88\x86\xeb\xb5\x74\x25\x92\x93\x7b\x65"
- "\x3f\x4d\x70\x10\xef\xc5\x17\xee\x61\x18\x2b\x88\xce\xd2\x7d\xe3"
- "\x39\x1f\xa7\x4f\x08\x46\xcb\xc9\x7d\xfd\xf9\x58\xd7\xe9\x79\x49"
- "\xf4\x94\x12\xe7\x8b\x85\x7d\x9f\xde\xfe\xa1\x72\x1c\xe1\xfc\x9c"
- "\x2f\x2e\x4f\xa1\x92\xc7\xfb\xea\x63\xe5\xf1\x3e\x47\x2c\x7f\xde"
- "\x2b\xcb\x69\xd0\x73\x7e\x9a\xda\x0c\x1c\xbe\x36\x7f\x5d\x5e\x36"
- "\xef\xeb\x8a\x93\x4d\xf0\x40\xfe\x36\xc5\x03\xf9\xcf\xc7\xe2\x9a"
- "\x6f\x4e\xcc\x03\xf9\xd9\x83\xf3\x40\xfe\xe4\xc1\x79\x20\x7f\x1e"
- "\xf3\x80\x9f\xf2\xb7\xc6\xca\x66\x7e\x59\x6c\xdb\x51\xaf\x94\x4d"
- "\xca\xb8\x12\xd9\x84\x2d\x74\xcd\x60\x72\xc8\x32\xc5\xfe\x23\x0d"
- "\xbd\xc6\x5e\xc7\xd7\xa2\x59\x0a\xe4\x0a\xf8\xdd\x6f\xe7\x35\x25"
- "\xe8\xf8\xc9\x4c\xc3\xbd\xf2\xec\xe1\xfd\x93\xa2\xe9\xb8\x5d\x9d"
- "\x8f\x73\x22\xef\x87\xbc\xaf\xac\xe8\xf9\xc0\xc6\xd8\xf6\xdf\x3f"
- "\x2f\x31\x3d\xef\x2f\x03\x3d\x9d\x89\xe9\x79\xff\x96\xc1\xe9\x79"
- "\xff\x3e\x3e\x7b\x74\xa9\x4c\xdd\x7f\xd8\xbe\x5a\xda\x28\xb2\xcc"
- "\x59\x7a\xe0\xda\xaf\x37\x3e\xdd\x1f\x8c\x1d\x9f\xee\x3f\x71\xe5"
- "\xe3\xd3\x03\x93\x13\x8f\x4f\x0f\x14\x24\x1e\x9f\x1e\x28\x55\xf2"
- "\xf0\x40\x63\xac\x3c\x3c\xe0\x8a\xe5\x09\xd0\xee\x7f\x6c\x7c\x7a"
- "\x20\x10\x27\x03\xd5\xa7\x68\xda\x8b\xb0\x29\x5c\xaa\xdf\xa6\xdf"
- "\x15\x8b\xe3\xb4\xd4\xc4\xfd\x36\x6d\x0c\xfa\xad\x3a\x71\xbf\x4d"
- "\xcb\x1f\xbc\xdf\xa6\xf1\x1e\x74\xf5\xa5\xfd\x36\xad\xfc\xca\x6d"
- "\x8a\x69\xfb\x63\xfb\x6c\x9a\xe7\xca\xfb\x6c\x5a\x57\xe2\x3e\x9b"
- "\x6e\x4e\xdc\x67\xd3\xb3\x55\x9f\x4d\x9f\x17\xdb\x67\xd3\x27\xc5"
- "\xf6\x19\xe8\xf6\xdf\xec\x33\xf4\x4f\x58\xf9\x27\x4c\xff\x00\xf3"
- "\xf6\xa1\x3d\xee\xe9\x07\xfc\x34\x43\x9f\x5b\xcf\x50\x63\x87\xea"
- "\xc3\xf7\x90\xa7\xf1\xd2\x71\x60\xfa\x51\x3d\xed\x07\x97\xf6\xc3"
- "\xf4\x0e\xe8\xe8\xae\xe6\x4a\xb9\xb7\xa5\xfa\x90\x69\x8e\x7c\xde"
- "\x75\xbc\x3f\x35\x83\x37\x8b\x92\xd0\xc7\xc2\x17\x0a\x13\xeb\x75"
- "\xe4\x0f\x32\x1c\x3e\x73\x19\x0b\x6b\x46\xde\x95\x8c\xf1\x83\xfb"
- "\xd4\x64\x87\xbd\x55\x77\x00\xde\x83\x33\x14\xaf\xce\x88\xb7\x7f"
- "\x1b\xf0\xee\x3a\xc5\xa7\xdf\xfd\x2c\x0e\x87\x83\x89\xf9\x74\xc6"
- "\x31\xb4\xa1\x21\x31\x9f\xce\xe8\x1c\x9c\x4f\x1f\x44\xff\x53\x43"
- "\xd4\xdc\x27\x73\x51\xd8\x1f\x37\xf7\x79\x30\xd7\x12\x54\xbc\x23"
- "\x6d\xa2\x9a\xec\x70\x8f\xfb\xc1\x78\xfb\x0f\x7d\xf3\x60\x8b\x8e"
- "\xf3\xef\xe3\xca\x0f\x62\xff\x3d\xc8\xf6\xdf\x7b\x89\x71\x7e\xf0"
- "\x32\xf6\xdf\x83\x6c\xff\xbd\x77\xa9\x6c\x3d\xa8\xdb\x7f\x89\xe6"
- "\x78\x0f\x76\x25\xee\xff\xef\xc6\xf5\x3f\x15\x96\x63\x3e\x2c\xcb"
- "\xc7\xe6\x1b\x17\x9d\x8f\x7d\x93\x38\x2f\xf3\x48\x82\xbc\x85\xf1"
- "\x30\x07\xc9\xe7\xba\x84\xf7\xd8\x97\x2a\x21\xef\x7d\xf7\x80\x92"
- "\xc7\x99\xe6\x58\x79\xfc\x6e\x73\xac\x3c\x3e\x58\x1a\x57\xae\x23"
- "\xf6\x3d\xf8\xe7\x7f\x4c\xc7\xce\x9c\x17\xc7\x03\x9f\x9c\xa2\x99"
- "\x7f\x54\x3c\xf0\xd0\xad\xb1\x78\xcc\x2c\x4b\xcc\x03\x33\x37\xa3"
- "\xfd\x9f\x24\xe6\x81\x99\x8d\x83\xf3\xc0\xcc\xc3\xa0\xe5\x27\xd1"
- "\x7c\xfb\x68\x65\xfe\xd0\xb8\x3c\xfe\xc4\x3a\x6f\x66\x28\xf1\x1a"
- "\xc1\x43\x56\x45\xe3\x87\x66\xc6\xd2\xf8\xa1\xdc\x58\x1a\xa2\x2d"
- "\xff\x7d\x1a\xf6\xc7\x3e\xe8\x71\x3f\x14\x2f\xff\xbe\x53\xf4\x3d"
- "\x5d\xfe\x1f\xce\x88\xc3\xf1\xa0\xc2\x25\xd1\xba\xc8\x43\x3c\xff"
- "\xf5\x25\xa6\xe5\x43\x5d\x89\xdb\xfc\x3d\x33\xc6\x20\x9f\x76\x89"
- "\x2c\x7d\x2f\x1b\xe9\x8f\xf2\x7a\x28\xaf\x87\xec\x45\xfa\xa3\x61"
- "\x4a\x91\xe3\x55\xff\xb8\xf4\xbd\x7c\xf6\x45\x61\xfa\x33\xff\x5a"
- "\xb2\xa9\x80\xc7\x20\xc6\xab\xa8\x52\xfa\x2d\x58\x36\x33\xaf\xdf"
- "\xc4\xbc\xfe\x3d\x69\xff\xf1\x3e\x0b\xfb\x11\x5a\x2a\xa8\xc0\x17"
- "\x0c\x93\xc1\xef\x9c\x3f\x0e\x76\x3d\xcb\x05\xe7\x37\xf2\xaa\x75"
- "\x33\x57\x9c\x6e\xfa\x5e\x73\xe2\x3e\xfe\xde\x89\xc1\x79\xe7\x7b"
- "\x21\xd5\xcf\x0f\x8f\x8b\xed\xe7\x87\xad\x9a\x3b\x7d\x1e\xb7\x15"
- "\x3c\x70\x45\x72\x52\x6e\x17\x81\x41\xf5\xfd\xa6\x27\xda\x1d\x55"
- "\x74\xc3\x69\x7a\x78\x87\xac\xcf\x24\x42\x96\x8d\x49\xd4\x2c\x75"
- "\xc0\xc3\x9f\x4b\x3c\x91\xa7\x28\x4c\x26\xb1\xe9\xb9\x76\x7e\xd7"
- "\xe0\x16\x21\xe4\x6b\xe3\x3d\x01\x3e\xb3\x0c\x5e\xb8\xe6\x24\x3d"
- "\xfc\x4e\x4c\x79\x68\x02\x9f\x82\xd1\xd9\x20\xe5\xf1\xe1\x0e\x63"
- "\x4d\x77\x33\x9e\x13\xaf\xfb\xce\x4a\x31\x7c\x1f\x94\xcf\xd8\xc3"
- "\x83\xee\x5f\x32\x4e\x7c\x56\x86\x71\xba\xbc\x1e\x98\xb5\xd0\xe0"
- "\x5f\xe5\x6b\x39\xab\x6c\xc0\x97\x6f\x56\x85\x9f\x66\xd9\x2f\xb3"
- "\x36\x18\x25\x07\xb3\xf6\x45\xc3\x51\xf1\x3f\x66\x1d\x32\xfc\xf1"
- "\x70\xdf\xfc\x15\xb0\x0c\x7c\xba\xe2\xf0\x81\x1d\xf1\xc0\x71\x05"
- "\x63\x76\xca\xe5\x60\x70\x9f\x2b\x9e\x65\x7e\x98\x6d\xbf\xdc\x9a"
- "\x5f\xb2\x8d\x0a\x5e\xbd\x84\xb7\x66\x4b\x7b\x89\x61\x5c\x1e\xc7"
- "\xd9\x9e\x98\xb9\x85\xdc\xbb\xe7\xbd\xad\x39\x4f\x2a\xb9\x9f\x13"
- "\xb7\x46\x38\xfb\x80\xf4\xa7\xd2\xe5\x7e\x51\x38\x5e\x0e\x66\x1f"
- "\x33\xc6\xe8\xb8\xf4\x0e\x43\xee\x31\xaf\x65\xb8\x71\xeb\xac\x73"
- "\xcc\x4a\x16\xe6\x2c\xd4\x32\xa2\xe7\x6b\x73\xa4\xfd\x67\xac\x97"
- "\xe2\xbd\x39\xae\x5c\xdc\xfa\xdf\xec\x03\x62\xf0\x75\xfa\x54\xf4"
- "\x6f\x90\xf7\xb6\x54\x0c\x84\x39\x5b\xe3\xd6\x2b\x02\xdb\xe5\xf9"
- "\xf6\xbf\x00\xee\x5c\x5d\xef\x15\xc4\xd9\x78\x73\x0e\x38\xcf\x5c"
- "\xae\xfd\x73\x06\x69\xff\x9c\x81\xf6\x2f\x67\xb8\x73\xe3\xd6\x12"
- "\xe7\xca\xf6\x47\x2e\xd1\x7f\x73\xb3\xa1\xbf\x0c\xba\xc1\xe6\x9e"
- "\xbb\xca\xb0\xd5\x79\xfd\x60\x70\x5b\x7d\xee\xc0\xfa\x9f\x2a\x37"
- "\xb0\xfe\x17\x48\x64\xab\xfb\x49\xee\xad\xc6\xd6\x5d\x67\xa9\x4f"
- "\xd4\x96\xb9\x83\xac\xff\xcd\xd5\xd7\xff\x0a\xec\xb1\xfa\x6c\xae"
- "\x3f\xb6\x0f\xe7\xc6\xf5\x61\x01\xc5\xf6\xe1\x9c\x03\xff\xd5\x71"
- "\x8d\x01\x25\x27\x27\x9b\x92\x93\x4c\x49\xc9\x78\x8d\x26\xd2\xd0"
- "\x64\x73\xf2\x10\xfc\xae\xd2\xaf\x43\x4d\xc9\x26\x33\x7e\x43\xf4"
- "\xeb\x55\x71\xcf\x43\xb9\x2c\x7e\x66\xfd\x3a\x24\xee\xf9\xaa\xaf"
- "\x78\x3f\x54\xaf\xd7\xa8\xdf\x1c\xf7\x3c\xe4\x2b\xde\x5f\xf5\xdf"
- "\x2c\x4f\x97\x3c\xc7\xfa\xa1\x3d\xb4\x7c\xf5\xe2\xb2\x65\x25\x72"
- "\xbf\x78\x89\x7d\xf1\xd3\x4f\x2f\x59\xb9\xd2\x5e\xfe\x82\xfd\x81"
- "\xfb\x1f\xb9\xe3\x1e\xbb\xda\x76\x2e\x9b\x3a\xb6\x64\x38\xcd\x5e"
- "\xb3\x82\x5f\xcc\x7e\xf4\xa1\x42\x7b\xc1\x03\xf7\xc7\xbe\x34\xc0"
- "\xc8\xed\xe5\xcb\x41\x89\x92\xbf\xfc\x97\x47\x10\x6d\xdd\x29\x75"
- "\x4f\x07\xfb\xf9\xaa\x35\x8f\xc7\x37\x1e\x63\xff\xd1\x5e\xa7\xf0"
- "\xde\xc4\x7b\xfa\x8f\x8c\xe5\x46\x8c\x6f\x74\x91\xe3\x29\x3e\xbf"
- "\xf2\xc8\xfd\xe2\xe3\x00\xd9\xbf\x47\xa6\x93\xf4\x44\x4d\x33\xac"
- "\x22\x7e\xf6\xf9\xc3\x64\x77\x52\x0a\xca\xdf\x8e\x77\x49\xe2\x5e"
- "\x0d\x69\x41\xdd\x17\xfa\xb1\xfb\x65\xda\xc7\x2e\x23\x9f\xe5\x14"
- "\x3d\xf2\x99\xf8\x58\xc8\x67\x3e\x1f\xa4\xf2\x3d\xf2\xa1\x30\x7d"
- "\xbf\x82\x75\x43\x7d\x26\x99\x79\x2f\x74\x57\x26\xa5\xec\x1a\xc1"
- "\xb1\x40\x1e\x39\x60\xec\x85\xbe\x8c\x67\x3f\x3d\xe1\xe1\xba\x39"
- "\xaf\x66\xfa\xfe\x5b\x9c\x7f\x6f\x6c\xfe\x13\x03\x7b\xb1\x8f\x1c"
- "\x30\x21\xdf\xdc\x4f\xc9\x62\x89\x88\x2f\x42\x99\x59\xed\x13\x66"
- "\x52\x92\x0f\x5d\x71\x2c\xec\x22\xe5\xf3\xf3\xe8\xd8\xb5\x11\x11"
- "\x66\xff\xf4\xd9\x5d\x4e\x51\xfd\x3c\x99\x21\xd3\x49\xde\x15\xec"
- "\xa3\xf0\x68\x6a\xc3\x12\x32\xa3\xfd\xd9\xa7\x69\xde\x14\xfb\x1c"
- "\x22\xe7\x6c\x32\xff\x6b\x05\xfb\x1b\xe6\xac\xde\xfe\x27\x32\xff"
- "\xbc\xd7\x65\xea\x15\x36\xaa\x2c\x17\x9d\x82\xe3\x03\x05\x45\x88"
- "\x7d\xfc\x8f\x15\x47\x38\xcf\xd2\x1e\xa7\x8d\x5a\xcb\x83\xb4\xe1"
- "\x84\x08\x6d\xf9\x93\x3a\x1b\xd0\xd2\x15\x64\xff\xc5\x94\x0d\xb3"
- "\x29\xf9\x54\x21\x99\x5a\x4a\xeb\xc8\xb7\x30\x48\x95\x27\x44\xe7"
- "\xb1\xe2\xcf\xa8\xb5\xb4\x89\x8a\xda\xc9\x74\xac\xe3\xaf\x24\x63"
- "\xdc\xd4\x6e\xf6\x56\x5d\x20\xdb\x86\x65\x9c\x76\x81\xd6\x6d\xa0"
- "\xb4\x75\x7f\x26\x8b\xaf\xb3\x1d\xf5\x9c\xa1\x05\xc7\x29\x09\xf0"
- "\x4c\xeb\xff\x4a\xb6\xf5\xf3\xd9\xcf\x37\x9f\xea\xab\xc8\x26\x9c"
- "\xb9\xa9\xbd\xce\x5c\x6b\xaf\xc8\xcd\xec\x71\xe6\x66\xb5\x3a\x90"
- "\xbf\xe3\x23\x4a\x6f\xa7\xac\x8f\x4f\xb7\x9b\xea\xce\x53\x36\xb7"
- "\xe9\x14\xda\x56\x7f\x1e\xf9\x6b\x17\x38\x34\x94\x8d\x2e\x13\xce"
- "\x58\xb0\xc5\x57\x18\x22\x0d\xb0\xea\x7a\x29\xbb\xbe\x97\x6c\x5a"
- "\xcd\x02\x07\x97\xeb\xa2\xc7\xee\xf6\x1d\x23\xaa\xdc\x20\x22\x7d"
- "\xb5\xd9\xbc\x7e\x31\xf4\xbd\xa7\x0e\x99\x7d\xc7\xba\xa8\x25\xd8"
- "\x4b\xad\xf4\x17\xf2\x55\xfc\xdd\xfb\xf3\xa7\x0e\x0d\xd1\x20\x04"
- "\xde\x75\x1d\xa8\x4b\xf1\x8e\xb3\x85\xcf\x2a\xbb\xa8\xba\x8a\x52"
- "\x1d\xeb\x68\xe8\x69\xa4\xab\xb9\xbd\xc5\xef\x0b\xff\xdd\xbb\x4e"
- "\xfa\xe3\x3e\xe1\xa9\x6a\xa1\xe4\xd6\x60\x1d\xfb\x7d\x9a\x22\x99"
- "\x9b\xbd\xbe\x60\x1b\xf9\x1c\x7f\xf3\x6a\xd6\xcd\xfb\xb7\x6a\x94"
- "\xf2\xce\xc5\x36\x93\xcf\x7c\x91\x7c\x85\x41\xfa\x04\x75\x8b\xda"
- "\xcd\xc7\xa0\xb7\xf2\x5b\x83\x21\x3e\xef\x94\x27\xba\x6d\xc3\xab"
- "\x57\xd0\xb8\xbd\xe7\x69\xcc\x9e\xf3\x94\x2b\x7a\x72\x4d\xec\x63"
- "\xcb\x67\x53\xf7\xe0\x9a\xda\x41\x29\x68\xbb\xf2\xc7\xce\xd0\x7d"
- "\x6d\xfb\x72\xa9\xa1\x77\xc0\xd7\xb6\xb7\x7b\xc0\xd7\x16\x3c\xd5"
- "\xc4\xfe\xb6\x7e\x9a\x37\xdd\x72\x8c\x86\x42\x4e\x4a\x99\xbf\xab"
- "\xcf\x92\x79\xd3\x59\xa2\x09\x2e\x13\xd9\x97\xf2\x39\x8b\xc7\xc7"
- "\xfa\xd0\x37\x7c\x7f\x92\x1e\x3b\x81\x6b\x2a\x7e\x49\x90\x89\x3f"
- "\x72\x3b\x3b\x74\x3e\x46\x9a\x09\x69\xbf\xc7\x35\x19\xd7\x8f\x9c"
- "\xf5\x22\x20\x3c\x37\xe4\x75\x9b\x68\x38\xf3\xb3\xf2\xef\xbd\x21"
- "\xaf\xc7\xfd\xd8\x41\x3f\x3d\x37\xc6\xe0\x6b\xa5\xe3\x1f\x69\xfa"
- "\xe4\xe4\x19\x8e\x43\x15\x90\x78\xf5\x95\x26\x71\x4c\x2a\x3d\x9d"
- "\x71\xc8\xe1\x7a\x4f\xd2\xe3\x5c\x8f\x05\x3f\xc8\xe9\x63\x3b\x8c"
- "\xb2\xdd\x7d\xa5\xa8\xf3\xf1\x6b\x91\x2e\x8c\x74\xb4\xdb\xcc\xef"
- "\xde\x3f\x79\xc6\xa4\xf2\xe4\x9a\x00\x33\xa4\xc3\x87\xec\x3f\x32"
- "\x8f\x65\xbc\xdb\x64\x11\x47\x8a\x27\x51\xfd\x4e\x71\x6c\xcf\x4e"
- "\xd1\xac\x64\xef\xf1\x42\x3f\x95\x95\x32\x8e\x18\xc7\x9b\xb7\xe2"
- "\xdd\x11\x8c\x42\x4c\x97\xe6\x12\xf6\x27\x7b\x1c\xf6\xdf\xd5\x31"
- "\x6d\x10\xee\x82\x42\x1e\x4b\xdf\xad\x3a\x3a\x04\x3a\xa0\xb0\xb5"
- "\xa3\x8b\x7e\xde\xdb\x39\xc4\xf9\x07\x32\xf9\xc2\x27\x69\x62\x16"
- "\xd9\xd8\x1e\x6c\xd8\x29\xfc\xb8\x76\xb2\x7f\x27\xf8\x25\xe7\x34"
- "\x3d\xfe\xfb\x6f\x66\x51\xd6\xbf\x55\x90\xae\x9f\x1e\xff\x6b\x94"
- "\x7e\x5a\xd2\xe2\x3f\x14\xa5\x9b\x9e\xb8\xf6\x52\xdd\xb4\x20\x43"
- "\xe9\x26\xc8\xbe\xd4\x45\x11\xbf\x4a\x9f\x1f\x89\x4b\xd7\xfd\x44"
- "\xe6\x7f\x1a\x97\x1e\xd2\xd3\x5b\xe2\xd2\x03\x7a\x7a\x9a\xa1\xfb"
- "\x5a\x19\x8f\x35\xac\xfb\x0a\xbf\x60\xdd\xd7\x5a\xac\xeb\x3e\xa9"
- "\x7f\x0a\xff\x2c\xde\x82\x2e\x5a\xcd\xfa\xa6\xf0\x1d\xc6\x5f\x7c"
- "\x4c\x06\xee\xc3\x90\xf6\x3c\xa7\x79\xfe\x42\x66\xfc\x0c\xbd\xf7"
- "\x09\xeb\x3d\xd6\x79\xac\xfb\x76\x8f\x10\xed\xbb\x77\x8a\xe3\xf5"
- "\x32\xb6\xce\x0f\xfa\xf5\xdf\x2b\x48\xdb\x8a\xb4\x57\xf0\x9e\xf5"
- "\x20\xd3\xa4\xa5\xf0\x10\xc7\xc4\xe8\x00\x3f\x97\x6b\xa6\x3c\xda"
- "\x8e\xfe\xe6\xf3\x86\x9b\x41\x5f\x4b\x12\x39\x7c\xe5\x7c\x86\x35"
- "\xc2\x3e\x69\x1d\xad\xe5\x1d\x2c\x77\x23\x36\x41\xce\x7c\x15\x9f"
- "\x51\x55\x50\x9c\xe6\x73\x77\x8c\x43\xd1\xda\xef\x71\x3c\xa2\xa4"
- "\xe6\x52\x22\xf6\x0b\x67\x9d\x0d\x5c\xcc\x1e\xe0\xa4\x62\xa8\x14"
- "\x96\xf8\xa9\xf1\x80\xea\xeb\x27\x3c\x1c\xef\xec\x24\xfd\x60\x3f"
- "\xe6\x7b\x21\x6e\x9b\x25\xe2\x22\x3e\x07\x03\x19\xe3\xf3\x8b\xa5"
- "\xbb\x4d\x5a\xa9\xc7\x38\x0b\xc3\xb1\xef\x90\xc7\xd7\x1e\x22\xc6"
- "\xd9\x4f\x3f\x08\xb6\x54\x1e\xe2\xf2\x75\x4c\x1b\xe1\x76\x1a\x30"
- "\x92\x24\x0c\x93\x9c\x37\x96\xfa\xa9\x50\xad\x9d\x67\x66\xb7\xb7"
- "\x2c\x0c\x10\xeb\x7d\x5f\x27\x60\x54\x9e\x54\x30\x00\x4b\x60\x0c"
- "\x88\x79\xa7\xc3\x4f\xdb\x20\xbe\x00\xfc\x12\xee\x2f\x3e\x17\xc9"
- "\xfb\x6d\xa0\x4b\x2a\xfb\xca\x2b\x5b\xf4\x07\x67\x1a\xfe\x42\xa4"
- "\x9f\xed\x04\xbf\xfd\xa0\x8b\xcf\x2d\xf1\x79\xce\xcb\x9d\xe5\x04"
- "\x8d\xc6\x18\xe7\x39\xb5\x35\xff\xb3\x67\x39\x01\xdb\xb6\xd7\x24"
- "\x9a\x80\x7f\x17\x9f\xe7\x04\xfe\xb3\x98\x0f\xf5\x36\x05\x5e\x5b"
- "\x20\x69\x3e\x89\xd3\x30\x77\x3c\x6a\xf4\x3f\xb7\x97\xdb\x82\x77"
- "\x36\x65\x23\x8a\x36\x3f\xcd\x0f\xf0\x7b\xa4\x99\x39\xff\x44\xe8"
- "\x31\x1f\xc6\xb0\xf7\x4e\x46\x4c\xd5\xeb\xc8\xac\x74\xda\x13\xc3"
- "\xb8\xbc\xd2\x69\x0b\xbc\x03\x3a\x6d\xc1\x07\x4a\xa7\x29\x1a\x2b"
- "\x9d\xb6\xe0\x67\x4a\xa7\x2d\x78\x53\xee\x8b\x41\xa7\xf1\x3b\xd6"
- "\x6b\x86\x4e\xdb\x33\x42\x1c\x65\xdd\xd1\xe3\x5e\xe0\x31\x74\xdb"
- "\x36\xa4\xb1\xee\x60\x1c\x95\x9e\x2a\xec\x14\xff\x5f\x2e\x29\xbf"
- "\x03\xbe\x2f\xe5\xf3\x0b\x9d\xfa\x3d\x8f\x27\x49\x4a\xc7\x2d\xe8"
- "\x18\xd0\x71\x0b\x4a\x07\xca\xb2\x8e\x5b\xf0\xa5\xd2\x71\x2a\xbd"
- "\x61\x01\xeb\xb8\xc2\x4e\xa6\x81\x0e\xdf\xc4\x6b\x78\x7a\x7e\xd0"
- "\xf1\xf1\x40\xb4\x8e\x8b\x95\xaf\x27\xa6\x18\x3a\x8e\x75\x1b\x9e"
- "\x67\xf9\x69\xb8\x9c\x67\xb3\x9c\xed\x00\xcd\x0d\xb9\xe3\x3e\xe0"
- "\x36\x73\x5c\x33\xa6\xdb\xb4\x33\x34\x54\x3f\x3b\xa4\xb7\xfb\x89"
- "\x2d\x86\xef\xa3\x9f\x16\x78\x12\xd9\xd1\x03\xb1\x07\xe9\x46\x3e"
- "\x3b\xef\x73\x9d\x24\x5f\x9d\x70\xb5\x86\x4f\x50\x51\x39\x74\x45"
- "\xf2\x73\x9f\x72\xdf\x62\xde\xf1\x1d\xbe\xb2\xee\xc1\x58\xda\x52"
- "\x14\xa4\xab\x30\x57\xff\xb4\xda\x84\x77\x15\x31\xef\xe4\x1a\xc3"
- "\x84\x15\x1c\xb7\xee\x89\xa6\xc1\xe6\xfb\x57\x56\xdf\xc2\xa9\x83"
- "\xd7\xb7\x70\xbe\xac\x0f\x36\x15\xe6\x40\x19\x67\x69\xa1\x9c\x97"
- "\xc8\xf8\x36\x9b\x12\xc2\x7a\x59\x7f\x3f\x64\x90\xf7\x3f\xfb\x8a"
- "\xf2\x7f\xf8\x8a\xf2\x9f\xb3\x2e\x42\xfb\x2c\x11\x77\x2c\x9c\xf4"
- "\xb0\x91\xef\x34\xf2\x3d\x99\xa1\xaf\xc5\x7c\xea\x1c\x25\xe7\x68"
- "\x36\x03\x26\xf3\xdf\x76\xe4\x93\x31\x43\xa0\x2b\xa7\xaf\x25\x8e"
- "\xd7\x12\x5d\x76\xf6\x00\x8d\x9f\xa4\xcb\xac\xfb\xa5\xfa\xea\x48"
- "\xc6\xd0\x3c\x02\x9b\x14\x63\x1c\xc7\xed\xd3\xd7\x3f\x9e\xdc\x07"
- "\xbd\xd9\x18\xe5\x17\xdb\x05\x3d\x77\x23\xc7\x35\x60\xfb\xb2\x5a"
- "\xcd\x37\xbf\x01\xfd\x9c\xc9\xe7\x61\xf8\x6c\x4c\x51\xa4\xc0\x74"
- "\x44\xc6\x17\x7b\xd2\x6f\x94\x1d\x6c\x9d\x85\xeb\xd5\xeb\x64\x1f"
- "\xd3\x60\x8f\x7b\x51\x96\x51\x86\x61\xb3\x9f\x22\xc6\xe5\x1b\xe5"
- "\x99\xd2\x70\x17\xeb\xc2\x6f\xc0\x16\xcd\x54\xf5\x14\x93\xaa\x67"
- "\xd1\x4c\x3f\x2d\xb4\x5e\xee\x6c\xc6\xe0\xed\x5b\xb4\xf9\xca\xdb"
- "\x47\x7a\xfb\x16\x79\xbf\xa2\x7d\x97\xab\x37\x7c\xe5\xf5\x5a\xf5"
- "\x7a\x8b\x26\x5f\x39\x5d\x8b\xca\xbe\x3e\x5d\xf3\x74\xba\x16\x35"
- "\x7e\x05\x5d\x13\xd5\x73\xfc\xeb\xd7\x63\xd7\xeb\x29\x4e\x49\x54"
- "\x0f\xc9\xbf\x41\xcf\x4d\xa5\x18\x31\x2c\x39\x9e\xab\x8a\x2f\x57"
- "\x5c\x10\x1d\xab\x57\xc5\x79\x2d\x2e\x31\x62\xf5\xea\xb1\x64\xa1"
- "\xab\x8b\x37\x16\x35\xf2\xf8\x2e\x34\x3f\x15\x6f\xe6\xf8\xa8\xd3"
- "\x37\xa8\x33\xd9\x7a\x99\xba\xcb\xc5\x08\xe6\x98\x56\x42\x14\xd2"
- "\x91\x3a\xb9\xdf\x0e\xbd\x5e\xfc\x47\xf6\xbf\x57\xfb\x85\xc5\x27"
- "\x94\xdc\x17\xc3\x36\x2f\xce\x1d\x1c\xc6\xfc\xe2\x7d\x55\x79\x43"
- "\x06\xf3\xa9\xef\x71\x2f\xce\xf6\xd3\xf2\x54\xe9\x47\x9f\x79\x73"
- "\x3b\xe6\x0f\x7a\x5c\xbd\xa7\x77\x45\xc5\x10\xc4\x58\xf8\xd4\x6f"
- "\x75\xdf\x7f\xd0\xc0\x05\x5a\x2e\x9e\x67\xd0\xc0\x48\x47\x5a\xa9"
- "\x41\x03\xd8\x34\xa9\xbe\xc6\x30\x9f\xcd\x09\xaa\x73\xd8\x8b\xb7"
- "\x89\x9a\xf9\x05\x0a\xf6\xe2\x76\x65\xb7\xa0\xbe\xbe\x42\xb3\x9c"
- "\x2b\x55\xf1\x5c\xe9\x29\x47\x20\x63\x7e\x81\x81\x87\x58\x69\x33"
- "\xf1\x79\xef\x89\x61\x15\xa7\x8b\x6d\x02\x3e\x1b\x27\xdf\xaf\xcc"
- "\x35\x61\x6e\x09\x9a\x2c\xfe\x42\x74\x73\xbc\x18\x09\x3b\x15\x78"
- "\xd7\x31\x5c\x3f\xae\x81\xf5\xb9\x1c\xeb\x42\x6f\xcf\xe2\x7f\xd7"
- "\x6a\x6f\x6e\xd7\x7a\x6c\x26\x03\xdf\xbd\xf2\x1c\xeb\x53\x68\x7f"
- "\x91\xb4\xdb\x14\x3e\x36\x13\xfb\xf0\x6b\x99\xf3\x8b\xc5\x7a\x1b"
- "\x1d\x5c\xd1\x29\xe7\x4a\x5c\xe7\x44\x8e\x07\xc7\x73\x23\xd8\x23"
- "\x28\x37\xaf\x9f\x6e\x80\x2b\x7a\x0c\xba\x3d\x45\x6a\x2c\x56\x6d"
- "\x0c\xae\xb7\x99\x8e\x04\xe4\x19\x3b\x1a\x63\x77\x7e\xa9\x62\x3d"
- "\x3f\xe5\x31\x68\xd7\x8f\x13\xf0\xe1\x3c\xca\xa7\xe9\xa9\x26\x03"
- "\x27\x29\xaf\x99\x7c\x66\x77\xf1\x3e\x3e\x2b\xa4\xe8\x7f\x24\x15"
- "\x79\x8e\x5f\x4a\xff\xa7\x3a\xa3\xe8\x9f\xcc\xfc\xc6\xf4\xe7\xf5"
- "\x0d\xd0\x25\x03\xb4\x4c\x51\x67\x1c\xd8\x86\x79\x9a\xcf\xd2\xa7"
- "\x32\x9e\x5a\x8d\x41\xf3\x42\xb3\x5a\x1b\x7b\x7a\x56\x54\x3f\xa0"
- "\xbd\x36\xb6\xcf\x92\x8c\xf6\x73\x19\xa6\x01\xc7\x77\xe4\xba\x81"
- "\xcf\xd5\x3d\xee\xa7\x4b\xe2\xdb\xb4\x49\x9d\x1f\x21\xe5\x4f\xf2"
- "\xf4\xe6\x7e\xf9\x18\x21\x02\xe5\x76\x11\x52\x67\x91\x9f\x1e\x77"
- "\xb0\x2a\x60\x1e\x4c\xee\x99\x07\x65\xac\x48\x93\x5c\x4b\x80\x9d"
- "\xb5\x64\xad\x00\x6e\xaa\xef\x97\x7c\x5f\xa5\x95\xec\xc1\x15\x3c"
- "\xf6\xf4\x05\x81\xba\x03\x4e\x19\x57\x05\x6d\x5b\xb2\x83\x79\xce"
- "\xe0\x33\x5e\x7b\x54\x7e\xe2\x25\xf3\x59\x8f\x18\x34\x07\xfe\xc3"
- "\x7b\xdc\x25\x63\x0c\xfc\x8d\xfc\xdc\x77\x9c\x87\xf7\x69\x9a\xed"
- "\x21\xa9\x5f\xd5\x39\xa1\x92\x02\x43\x6e\xb9\x0e\xee\x67\xd6\x2f"
- "\x4c\x0f\x45\x8b\x12\x47\x2c\x2c\x9b\x49\xc5\xa7\x64\x9e\x87\x3c"
- "\xae\x0b\x0d\x41\x9e\x1d\x03\x30\x4a\xac\xea\x5d\x3f\x9e\xec\xdb"
- "\x2f\xfd\xef\x54\x7f\x94\x44\xb8\x5d\x03\xf8\xb2\xfc\x95\xf4\xf7"
- "\x3f\xbf\x0b\x3a\x6d\x1c\xcf\x56\xea\x95\xf2\x51\x8c\x6f\x80\xe3"
- "\xc4\x4a\x5e\x07\xfc\xe9\x8c\x3b\xe7\x31\xfa\x6c\x80\x17\x97\x64"
- "\x47\xc3\x11\x4e\x9b\xc9\xd0\x4f\x4a\x77\x04\x30\x4f\x25\xbb\xda"
- "\x63\x59\x32\x33\x0a\x67\xaf\x81\xcf\x80\x4e\x58\x52\x1a\xcf\x93"
- "\x5c\x37\xc7\xdf\xd3\x61\xb3\x2e\xb1\x9e\xa4\x25\xf3\x14\x5e\x4f"
- "\x1f\xe3\x7e\x1c\x6c\x4c\x33\xe2\x7c\xbe\xaa\x74\x08\xfa\x79\xe9"
- "\x9f\x5f\x55\x67\x87\x82\x2a\x96\xe3\x92\x7f\x17\xa6\x37\x99\x56"
- "\xbc\x86\x1e\x90\x31\x3a\xe4\xb9\xf2\x25\xf2\x8c\x79\xba\xe3\x4d"
- "\x19\x3f\x56\xf7\x07\x0c\x34\x3b\xc2\x32\x7e\x9f\xb3\x9c\xcf\xd9"
- "\x86\x79\x7e\x27\xfd\xdd\x8e\x94\x87\xe9\xd1\x10\xcb\xc4\xd2\x5c"
- "\x3e\x3f\x1f\x94\xb2\xb4\x74\x92\x71\x66\x9e\x63\x5a\x8a\x9e\x42"
- "\x82\x1e\x4a\x66\xbb\xc8\xee\xe4\x78\x07\xcf\xf0\xf9\x21\xd2\xfb"
- "\x97\xb6\x9b\x44\x9b\x92\xff\xa5\x1b\x64\x1c\x41\xb9\x77\x75\x12"
- "\x3a\x21\xf9\xef\x27\x69\xe9\x6b\x6a\xad\xc7\xd0\x51\xcf\xa4\xf1"
- "\xfe\x95\x5f\x87\x81\xba\x30\xfe\x2d\x36\x5f\xaa\x4b\x96\x6e\x30"
- "\xe6\x2b\x7c\xe6\x4e\xed\x85\x0d\xc0\xf3\xd3\xd2\x4a\xbe\x0e\xf4"
- "\xc1\xef\x18\x56\xd7\xa5\x7a\xe1\x19\x32\x64\xcf\x71\x13\x9f\xdb"
- "\x5e\xd2\xcc\xf5\x0f\x36\x5e\x08\xe7\x7c\xee\xa7\x94\x53\xf6\xc4"
- "\x7d\x93\x78\x6f\xed\x99\x12\xa3\x0d\x06\x4d\x54\x1b\x9e\xf9\xa8"
- "\x3b\x33\x27\x4a\x3f\x3f\xf3\x91\xa4\xc5\xc0\xfb\x0b\x51\xb4\xe1"
- "\xe7\xa0\x1a\xd7\x9e\x39\x08\xfe\xd8\xa7\x78\x4d\xa5\x41\x76\x1e"
- "\x15\xeb\xa1\x0b\x24\x8e\xcb\xc8\x90\x75\xe4\x85\xfd\xf7\x45\xb6"
- "\xda\xe3\x7a\x06\xed\x7f\x46\x8f\x9b\xf0\xcc\x16\xc6\x25\x61\x3b"
- "\x63\x70\x2c\x2d\x63\xfb\x42\xc5\x51\x28\x7d\x9e\xf1\xb5\xdf\xcc"
- "\x7d\x5c\x7a\xb7\xd4\xe1\x1c\x53\xa1\xaf\x74\x48\xb0\x2f\x97\xba"
- "\xfb\x4a\xa1\x17\x72\x4d\x3d\xee\x52\xe8\xff\x73\x21\x55\x67\x69"
- "\xb1\x81\x2b\xe3\x06\xbb\x39\xa5\x47\x2c\x4b\x4c\x5f\xae\x57\xc6"
- "\x79\x2a\x1d\x8a\x5f\x0a\x7e\x57\x7d\x9d\x38\x4c\xb0\xcb\x3b\x03"
- "\x35\xa3\xb7\x68\xab\xc5\x51\x8e\x27\x86\xb9\x47\x67\x35\x78\x37"
- "\x7d\xa3\x17\xb6\xf8\x93\xa6\xa2\xb5\x94\x8f\x39\x32\x89\x8b\x62"
- "\xf2\x5e\x0d\xd7\xd5\x62\x12\xc7\xeb\xc6\x73\x9e\xfe\x3c\x8e\x9f"
- "\xbb\x57\x8b\x85\x3d\xee\x65\x56\x63\x4f\x50\xc5\xc2\x59\x66\xef"
- "\x8f\x1f\x94\xfc\x04\x9f\x1f\xe2\x38\x53\x1a\xe6\x3e\x9d\x5c\x6f"
- "\x11\xcf\x5f\x51\x1f\xf2\x41\xfe\x8b\x65\x3b\x03\xc9\xb7\x65\xe2"
- "\x97\x3b\xc8\xde\x69\x27\xe3\xd5\x9d\x31\x7a\x8b\x81\x6b\x7a\x30"
- "\xdf\xf4\x35\x71\x3b\x60\xe0\x86\xf4\xa3\xd5\x2a\x3d\xcc\xf1\x0e"
- "\xd9\xb7\x11\xef\x8f\x19\xb8\x1a\x38\x70\x7d\x7c\x5e\x53\x64\xe6"
- "\x58\x39\xd6\x0c\xd7\x17\x58\xcf\xf1\x7d\x97\x85\x0c\x7c\xbf\x2e"
- "\x1f\x57\xd5\x0b\xc1\x63\x27\xeb\x5e\xfb\x48\xa2\xd6\x20\xeb\x93"
- "\x67\x67\x1d\xa9\x0f\xf2\xfa\x76\x26\xea\xc8\xe8\x16\xa5\xa4\xf5"
- "\x95\x26\xec\x5f\x2e\x83\xfc\x5b\xa4\x6e\xa8\xcd\xc9\xd0\xc4\x4c"
- "\xe8\x08\x94\xeb\x9b\xc9\x6b\x4b\x90\xd9\x67\x0f\x36\x57\x76\xf2"
- "\x19\x4b\xe8\x9b\x67\x0f\x22\x8f\x95\x6d\x2c\xcc\xaf\x58\x67\x25"
- "\xb3\x5e\xf2\xae\x9e\xc4\x30\x3e\x30\x57\x90\xb9\xb9\xe2\xeb\x7d"
- "\x07\x00\x70\xbb\x94\xdc\x3c\xdb\x65\xd8\x25\xb8\x0f\xc5\xee\x77"
- "\x3f\xeb\x8f\x9f\x9b\x3d\xf5\xc2\x0b\xe5\x45\x2b\x96\xf0\x25\x77"
- "\xec\xaa\x5b\x87\x47\xcf\xc1\x59\x07\xab\xf8\x08\xcf\x59\x79\xbd"
- "\xeb\xd5\x4c\x63\xff\xf6\xb9\xfe\xf3\x5f\xba\x9f\xf8\x7d\x3c\x97"
- "\x60\x9b\x1b\xef\xca\x7e\x5b\xb9\x41\xda\x40\x9f\xa6\x90\x29\xbe"
- "\xbe\xa5\x8b\xcb\x17\x97\xdd\xc3\x3b\x35\xc3\x13\xd5\xe3\x8a\xab"
- "\xe7\x50\x7f\x3d\x4a\x07\x06\x4d\x9c\xaf\xe6\xf5\x62\x91\xe1\x22"
- "\x75\x46\xf7\xb9\x13\xc6\x5a\x4a\x62\xff\xba\x9c\x82\x48\xed\x82"
- "\x26\xee\x17\xe7\x06\x32\xbd\xbf\xae\xdd\xc4\xb6\x4c\x15\xee\x79"
- "\x4e\x2b\xd7\x66\xf4\x38\x45\x1f\x9f\x6f\xc7\x18\x53\x96\x27\x6a"
- "\x72\x30\xbe\x97\xe5\x0e\x36\x8f\x8d\xf6\x4d\x60\x5f\xb6\x0e\x2a"
- "\x9b\x39\xa8\x1f\x81\xe7\x66\x3d\x26\x76\xd9\x9e\x66\x1b\x71\xbf"
- "\xff\xe8\x24\x95\xed\x32\xdb\x30\x8e\x8c\xa4\x7f\xc2\xfd\x1e\x2e"
- "\xcb\xef\x62\xfa\x39\xe7\x4c\xa3\x19\x5c\x08\x6e\x4c\x12\xea\x8f"
- "\xcc\xfa\x4d\x32\x7e\x26\x91\x24\x77\xd9\x92\x41\xe1\xa1\x57\x99"
- "\xc9\x92\x9e\x9a\x72\xe3\x0d\xd9\xb6\xfb\xee\x9d\x32\xd9\x59\x55"
- "\x09\xe9\x0d\x87\x2c\x22\x3a\xae\x96\x73\xff\x63\xb7\xba\x48\xfa"
- "\x59\xd4\x38\xf7\x27\xc2\x75\x9b\x5b\x38\xf8\x4c\xb3\x96\xb9\xb3"
- "\xcd\xb9\x8a\x4c\xef\xf5\xfa\x4d\x1c\x3b\x9e\x6d\x2c\xfe\xb6\xc0"
- "\x49\x7a\xfe\xd6\x4f\x90\x86\xf6\x57\x08\xcf\xce\x36\x65\x9b\x3c"
- "\xbf\x4c\xab\xdd\xd9\x36\x00\xdf\x4c\x0c\xdf\xb9\x8b\x4c\xfb\xaa"
- "\x3a\x4d\x3e\xf3\xbd\xe4\xb3\x07\xe9\x13\xdc\x27\xa4\x25\xea\x64"
- "\x7b\x87\x61\x34\xb8\xb5\x2d\xce\x2f\xc9\xa4\x9f\x4b\x34\x9d\xa5"
- "\xe7\xdf\x6c\x1a\xa4\x1c\x9f\x03\xee\xce\x1c\x3d\xa7\xc7\xfd\x3c"
- "\xfa\xff\x7e\xb3\x3e\xde\x41\x2f\x3f\x0f\xfe\x2f\x93\xfa\x1f\xef"
- "\x67\x77\xcb\xd8\xc2\xcb\xc9\xc8\x93\xb0\x8f\x7e\xcc\x6b\xb3\xc2"
- "\xcb\xfd\x2a\x2e\x7e\xde\xc9\x67\x1e\x06\xf1\x8f\x18\xea\xab\xb8"
- "\x83\xf7\xa8\x86\xa4\x87\x28\xd5\x79\x41\xf4\x45\xdc\x94\x05\x76"
- "\x37\x45\x30\xa7\x0e\x5f\x14\x85\x2d\x5d\xe7\x65\xac\x4b\xd6\x1f"
- "\xef\x2e\xfd\x9d\xc9\x17\x3a\xe7\xf5\x6d\xd6\xa8\x15\xb6\x87\xaf"
- "\xfe\x9c\x57\xc5\xc4\x8c\x50\x0b\xfd\x85\x5a\x2a\xfe\x5f\x97\xcf"
- "\xf5\x17\xa4\x0b\x17\xd3\xb9\xef\xa2\x98\xe7\x33\xff\x3f\xc4\xdf"
- "\x3e\x61\x5d\x08\xba\xdb\xcf\xd2\xf2\x3f\x7c\x0c\x38\xef\xfd\x07"
- "\x60\xc9\x58\x5a\x53\xe9\x13\xdc\xa3\x4d\xc7\x0d\x3d\x99\x30\x06"
- "\x49\x92\x77\x9b\xa5\xe2\x49\x93\x06\x9d\xcb\x31\xcf\xa0\x6b\x27"
- "\x71\xbb\xf0\x9c\xc7\xcf\xb8\x8e\xe3\xab\x65\xa3\x77\x8f\x25\xfc"
- "\x24\xeb\xe0\x42\xd6\xaf\x48\x9f\xd7\x70\x51\xea\xe4\x02\xfd\x79"
- "\x96\xfe\x3c\x53\x7f\x9e\xae\x3f\xe7\xeb\xcf\x53\xf8\x59\xe9\xee"
- "\x17\x4a\xfb\xc7\x15\xd3\xd0\x36\x3c\x57\x18\x7d\x01\x7c\xd2\x2c"
- "\x15\x1b\xe4\x18\xa0\xe3\x31\x49\xc7\x2b\x4f\x7f\x36\xf0\xc9\xb1"
- "\x84\x37\xfc\x4f\xe1\x13\x8a\xc5\xc7\x91\x12\x85\x0f\x59\x2a\xf2"
- "\xbf\x0e\x3e\x56\x0b\xc7\xe7\xff\x6f\xe0\xc3\xb8\x70\x1a\xea\xdf"
- "\x12\x87\x4f\x9d\x81\x4f\x42\x7e\x5b\x2d\x3a\x79\xfc\x5b\x79\x9d"
- "\x8c\xf7\x3b\x94\xc7\xb6\x86\x5e\x23\x7e\x9d\xe3\xf8\xe5\xe2\xd7"
- "\x41\x16\x6c\xc8\x83\xf6\x3b\xf6\xe9\xe3\xfc\x61\x65\x0b\xbe\x98"
- "\x6a\xf8\x14\xa1\xad\xfb\xab\x55\x5b\x0f\x6c\xe6\x18\x6e\x6b\xe9"
- "\x7a\x67\x85\xe8\xc4\xdc\xec\x7f\xf3\xfc\x21\x1a\x6e\x59\xf9\xca"
- "\x95\xcf\xdf\x63\x2f\x5b\xbc\x7c\x89\x7d\x6c\x89\x7d\x65\xe9\xb2"
- "\xa5\xe5\x4b\x62\xf7\xd9\xad\xfa\xf7\x52\xe4\xf9\x01\xb6\xb7\xe5"
- "\x7c\x0b\xfc\xcf\x7a\x5b\xf9\x7c\xbe\xd8\x22\xdc\x2f\x4e\x66\x5d"
- "\xbf\xb7\x96\xcc\x7c\xa6\x18\xf8\xd4\x1b\x3a\xde\x98\x23\xb1\x8e"
- "\x47\x3a\xec\xbf\xe5\x93\xa2\xd2\x39\xef\x51\x23\x8d\xe1\xeb\xba"
- "\x69\xe8\x49\x7a\x71\x19\xd7\x99\x90\x86\x17\x45\x23\xc6\x57\xfe"
- "\xde\x80\x09\x3a\x45\x70\x3c\x26\x3e\x97\x87\x72\xe2\x14\xad\xb8"
- "\x8e\x75\x2f\x7f\x93\x47\xd9\xf5\x02\x38\xae\x18\x8f\x32\xfb\x90"
- "\x66\xde\x8e\xbc\x98\x2b\x74\x72\x39\xa4\xcf\xe0\xf8\x08\x48\x4f"
- "\xd1\xe3\x4c\x71\xda\x7c\x8e\x5f\x80\x34\x6b\x54\xda\xf3\x1c\x2b"
- "\x1d\x69\x76\x1d\xde\x06\xa6\x33\x9e\xf3\xf5\xb5\x14\xce\x53\xa3"
- "\xd7\x1b\x13\xff\x8c\x3f\x9e\x71\xc7\x84\x3c\xfb\xbc\x47\xbf\x35"
- "\xf5\xde\xa7\x5f\x58\xbe\x74\x38\x49\xb2\xe7\x62\xb8\xcc\xbb\xa3"
- "\xe2\xd6\x7b\xec\x8e\x25\x4b\x56\xd8\xd7\x2c\x59\x5e\x6e\x5f\xbc"
- "\x66\xf1\xda\xe1\xb4\xf4\x85\x15\x4f\xf3\xe9\x7b\xee\x96\x95\x45"
- "\x4f\x2f\x7d\x86\x9d\x21\x54\xee\xe1\x31\xe3\xf8\x3c\xd6\x6d\x7a"
- "\xbc\x8a\xa3\xd5\x6c\x6b\x64\xdc\xd2\x84\x7b\x8e\xe3\x64\xc3\xb5"
- "\x19\xbf\xc3\xf8\x1d\xc2\xef\x38\x7e\x6d\xa7\xa9\x62\x21\xae\x07"
- "\x7b\xdc\x2b\xa7\x18\xf6\xc4\x00\x0f\xad\x2c\x30\x78\x08\xe3\xff"
- "\x41\x35\xbe\xad\x74\xb5\x86\xa5\xfc\xf4\xf3\x54\xf5\xc5\x01\x9e"
- "\xe2\x38\x94\xad\xec\xeb\xb3\x1a\xef\xc1\xc3\xa0\x3f\xcf\xab\x87"
- "\x31\xdd\x4e\xd1\xea\x55\x98\x8f\x1f\xe3\x18\x2a\xb8\x36\x83\x5f"
- "\x8e\xa9\xb8\x25\x2b\xc3\xc8\x37\x0a\x75\x1c\xd6\xeb\x50\xcf\x23"
- "\xc4\x51\xfe\x76\xc6\x49\xfd\x99\x61\x01\x46\x1a\xdf\xf3\x55\xdf"
- "\x53\xb3\xb0\xdf\xa4\x9a\x37\x1a\xef\xca\xdf\xd6\xeb\xf0\x82\x16"
- "\xae\xbd\x6e\xb9\xf6\x27\xe7\x57\xbc\x76\x68\x49\xba\x4f\x00\x9f"
- "\x73\x5a\xf2\x13\xed\x32\x2e\xa2\xab\x17\x3a\xe2\xce\x3b\x7d\x15"
- "\x32\x7f\x12\xaf\x2d\xce\x71\x08\x8d\xe3\x53\x6b\xc9\xcf\xb5\x73"
- "\x39\x61\xbd\xa5\x49\xdb\x9e\x96\xaf\x6c\x01\x8e\x47\x57\xee\xd2"
- "\x61\x86\x98\xb6\xa7\x69\xe5\xed\x6a\xae\x56\xb1\x50\xd9\x67\xe5"
- "\x5b\x0d\x1f\x3c\xc8\x68\x2e\x9e\xeb\x0d\x1d\xe0\xa7\xf2\x52\xdd"
- "\x5f\xca\xab\xda\x5f\x7e\x5c\x7f\x3e\xa4\xe3\x98\xc4\x31\x32\x80"
- "\x7f\x1b\xf7\x1d\xe6\xbd\x87\x70\x7f\x1c\xf4\x39\xa6\xe8\x53\x2e"
- "\x6d\x40\xd8\x35\xfc\xfe\x38\x7f\x67\x04\xef\x8e\xab\xf8\x13\xe5"
- "\xa9\xdc\xe6\x01\x9f\xca\xfa\x7c\xe0\x9a\xc6\x7b\x8f\x90\xa5\x43"
- "\xbe\x8b\x2c\x9f\xe5\x1c\xcb\xb2\xc9\xd0\x3b\xac\x67\x8a\x22\x90"
- "\x53\x69\x77\xaf\x9a\x6e\xe8\x9b\x01\x3e\x58\x55\x98\x48\x97\x24"
- "\xea\x77\x45\xff\x55\xbf\x15\xee\x15\xf5\xc0\xa9\x49\xf6\x01\xc7"
- "\xe9\xbc\xd8\x6f\xdf\xf7\x29\x1d\xb9\xea\x40\xff\x5c\x44\xc7\x83"
- "\x63\x7e\xfb\x19\xb7\x5e\xb9\x1f\xac\xeb\x8d\x55\xc7\x0d\xbd\x61"
- "\xc0\xb1\x24\x09\xcd\x52\x81\x7f\x9e\x9c\x00\xaf\x9d\xf3\x78\x29"
- "\xed\x11\xc0\x49\xbf\xa0\xce\x46\x69\x35\x39\x01\x3f\xad\xda\x0a"
- "\x1d\x63\x96\x36\xa7\x7b\xc5\x7b\x03\xba\x68\x75\x6e\x34\x4c\x61"
- "\xcd\x09\x30\x5c\xd6\x47\x6c\x93\x14\x45\xcc\x1c\x9f\x24\xa0\x8f"
- "\x2f\xd0\xc1\xab\x0b\x0d\x5c\x41\xc3\xa3\x06\xbe\xfa\x37\x9e\xa0"
- "\xab\x56\x1d\x9a\x1b\xe9\x63\x1f\xe1\x66\xd5\x9f\x15\x52\xdf\xe0"
- "\xdd\x01\x94\xdd\xe1\xa7\x17\x3b\x75\x19\x3a\x86\xf2\x07\x8e\x54"
- "\x4d\x47\x9e\xd5\x4d\xba\x9f\x6b\x1b\xfa\xf7\x78\x14\xef\xbf\x1d"
- "\xb5\x16\x70\x5c\xf5\xe1\xbd\xae\x93\xb4\x3a\x10\x95\xae\xf7\xed"
- "\x91\x82\x93\xb4\xe6\x6d\x35\xaf\xce\x69\x52\xe5\xd7\xa8\xb3\x2b"
- "\x3a\x8e\xac\x0b\xf8\x1c\x17\xcb\xb8\xa4\xbd\xec\xe3\x35\xb9\xc6"
- "\x78\x01\x58\x07\x25\xcd\x47\x88\xc3\x4c\x27\x15\x07\x62\x45\xab"
- "\xa2\xd3\x9a\x82\x18\xda\xf3\xb8\x89\x7a\x98\x4e\xe9\x1b\x85\x96"
- "\x1e\x4c\x12\x45\x6b\xcd\xc4\xf2\xc2\x32\xce\x7b\x46\xe0\x0f\x69"
- "\x57\x29\xba\xad\xf1\x18\x74\x33\xfa\x8e\xe9\xe4\xa7\x35\xc4\xb4"
- "\x8d\x6d\xe3\xd0\xb6\x93\x46\xdb\x41\x53\x5e\x07\xc7\xf3\x3e\x5d"
- "\x2e\x8e\x79\x47\xb2\x4f\xc1\xca\x9f\x1d\x31\x7f\x8b\x8e\x54\x4c"
- "\x22\x45\xdb\x35\xe8\xe3\x17\x0b\xa2\xe6\x0d\x47\x99\xbe\x2c\x2b"
- "\xc0\xb3\x4b\x8f\xc9\x74\x54\xf9\xb7\xac\xdc\x07\x7b\x5f\xae\xd7"
- "\x30\x6d\xba\x4d\x32\x9e\x6b\x1b\xd3\x88\xf5\x22\xcb\x12\xcb\x00"
- "\xcb\x93\xa2\x51\xc5\xac\x28\x1a\x35\x33\x7d\x74\x3a\x1d\x8c\xd3"
- "\xe5\x4b\xec\x65\x53\x95\x2e\xb6\xe7\x8e\x2d\x99\x28\x03\xa0\xd8"
- "\x1f\x9c\x76\x8f\xbd\x60\xea\xd8\x8a\xd2\x71\x73\xd4\x65\x5a\xc1"
- "\x2c\xbe\x0e\x8f\x9d\x77\xd9\x51\xcf\xc1\xd8\xb9\x5b\x55\xbe\xd2"
- "\x1f\x15\xc7\xfc\x49\x57\x37\x71\x3a\xc7\x23\xad\x5e\x4e\x14\x01"
- "\xde\xdb\x4f\xa3\x4f\xad\x39\x5b\x39\xfe\xed\x5c\xcc\x19\xe7\x5c"
- "\x10\x5f\x36\xe0\xdd\x5e\xa4\xa7\x3b\x38\x6e\xfe\xdf\x84\x96\x91"
- "\xb3\x95\xe7\xf6\xa2\x26\xbd\x20\x90\xe1\xdc\x8f\x9f\x23\x90\x31"
- "\xba\x78\xc6\xad\x4e\xd1\xe3\x5e\x3b\xc6\x68\x17\xaf\x01\x80\x4e"
- "\x5b\xe7\x56\x88\x08\xd3\xa8\xa8\x82\x63\x54\x03\x76\x32\xaf\x01"
- "\xac\x45\xfb\x9f\xdf\xa2\xe6\x97\x6b\xc1\xff\x2b\xba\x74\x5d\x56"
- "\x80\x67\xd8\x7f\x77\x49\xdc\x34\xb7\x4d\xc6\xb6\xd6\x36\xdd\xf6"
- "\x08\xe6\x03\x0e\x03\x26\x60\x5d\xa5\xc7\xf0\x93\xf0\xbe\xae\xbf"
- "\xa5\x56\x7b\x43\xbd\x25\x49\xc5\x0b\x84\x8c\xbb\x1a\x4c\x5a\x61"
- "\xbf\xff\x04\xde\xa5\x6f\xb4\xb2\x7f\x45\x21\x78\x8f\x63\x8e\xf6"
- "\xbf\xab\x76\x6b\xfe\x6a\x93\x16\x42\x3f\x5a\x95\xfd\xdc\xc5\xfa"
- "\x13\x73\xcb\x75\x59\xc6\xb8\x26\xc7\x43\x13\xb9\xd4\x7c\x66\xdd"
- "\x5d\x5c\xee\xbc\xdb\x8c\x39\x43\xc5\xbe\x9b\xb2\xe4\x1c\x25\xa4"
- "\xb9\x93\x48\xf9\xb8\xae\x1b\x66\xe8\x58\xde\x47\xb3\x6c\x14\x01"
- "\x5e\x47\xb4\x84\x45\x40\xc6\x60\xe7\xb1\x83\x4e\x93\xaf\xb2\xc7"
- "\xc5\x3e\x76\xd2\x06\x42\xbd\x6a\xdc\x88\xa8\x71\x03\xf5\x07\x92"
- "\x6f\x2b\xc6\xf8\x90\x74\x9a\xd6\xb6\x33\xfe\x4c\x1b\x5e\x8f\xd7"
- "\x40\x2b\x1f\x8f\x93\x4c\x9f\x4c\x7b\x36\xfb\x46\x70\x5b\x2d\x61"
- "\xb4\x39\xba\x5d\x26\xcd\xbf\xdd\x8d\x76\x99\xd0\xae\x8a\x33\x2c"
- "\x33\x21\xf6\x59\x81\xbc\x8d\x90\x71\x8e\xe5\xfc\x79\x5d\x28\xba"
- "\x8d\xac\xff\x55\x1b\xd6\x5f\x97\xa8\x8d\xc2\xc4\x6d\x94\x34\x38"
- "\xa3\xcb\x9b\xc4\x93\xf5\x47\x17\xad\x3b\x90\xbe\x91\x7d\x45\x72"
- "\xb6\x42\xbf\x4d\xe3\x3e\xc4\xf8\xe9\x61\x3c\x13\xf5\x17\xc3\x53"
- "\xb0\xd6\x1f\xb2\x6c\x74\x15\xf7\xb8\xd7\x6f\x4e\x4c\xef\xf5\x6f"
- "\x5f\x9e\xde\xeb\xd7\x72\x79\xc6\x83\xf7\x00\x2c\x61\x4c\xd6\xc1"
- "\xb7\x98\xaf\x6d\x49\x54\x6f\xfa\xc6\x46\xc6\x2b\xe1\x3b\xc1\xf2"
- "\xa2\xeb\x20\xf0\xa1\x80\x9c\x08\xd6\x49\x3d\xee\xca\xfe\xf5\x2f"
- "\x4b\x92\x3d\x59\xea\x07\x93\xf0\x24\x82\x61\xd9\xe8\xe1\xbd\x90"
- "\x69\xa8\x3f\xe1\x7b\x8d\xbf\xe9\xe0\xc9\xa9\xd0\x36\x7d\xf3\x26"
- "\x4b\x12\xdd\x17\x48\xfe\xe6\x70\x4b\x45\x78\x0c\xd3\x10\x30\x2b"
- "\x20\xc7\xe3\x79\x9e\xaa\xd6\x2e\x2a\x61\xff\x6f\x93\xf1\xb8\x03"
- "\x19\x39\x15\x6a\x6f\xa1\x12\xe3\xdf\x8e\x59\xc6\xfa\x2d\x9e\xa1"
- "\x5f\x3e\x2b\x53\x72\x79\xfd\x1b\xa2\x76\xf4\x38\xcd\x6d\x11\xf6"
- "\x75\x16\xd8\x91\x1b\x1e\xd3\x04\xc7\xf9\x1f\x3d\x6e\x80\x4f\x94"
- "\x1f\x8d\xc1\x27\x28\x1f\x4e\xcc\x03\x1b\x72\x2e\xcf\x03\x95\x5f"
- "\xf0\x7b\xa6\xbb\x9a\xab\x6c\x98\x6e\xd8\x29\x62\xd3\xf5\x6f\xd8"
- "\xab\xb8\xfe\xca\x76\x55\x37\xd3\x24\x9f\xd7\x63\x66\x81\x2e\x2e"
- "\xe4\x75\x18\x7a\x80\xf9\xc5\x12\xe1\x6f\x20\x90\xe4\x69\xbc\x83"
- "\xfd\xe3\xf0\xab\xb5\xd2\xd1\x9d\xf2\x7b\x81\xee\x8a\xd2\x80\xb3"
- "\x74\x37\xc6\x61\x0a\x66\xe4\x80\x6f\x37\x34\xf9\xc9\x2b\xe3\x19"
- "\x61\x0c\xee\x02\x8c\xc0\x0e\xe5\x27\x9b\x22\xe3\x08\x41\xa6\x39"
- "\x76\x10\xcb\x35\xd2\xb2\x80\x37\xc7\x11\xc2\x7c\x67\x43\x67\xff"
- "\xb8\xe4\xce\x87\xae\x10\xf2\xdb\x3b\x18\x97\xb2\xbb\x41\xbb\xd7"
- "\x4c\xda\xfe\x8b\x13\x6d\xc4\x6d\xbe\xb8\x69\xe4\xfe\x1f\x4d\x20"
- "\xf3\xff\xb2\x3d\x45\x8e\x3b\x28\x6b\xe3\xb7\xcc\xf4\x9f\x93\xc9"
- "\xc4\x74\xf0\xd3\x86\x90\xa2\x5d\xd5\x64\xa3\x7f\xfc\x54\xd9\x28"
- "\x75\xe7\xa6\x27\x3a\xe7\x86\xc5\x97\x6a\x3d\xb4\x0a\xfa\xef\xd9"
- "\x36\xf5\xbe\xc2\x1b\xbf\x06\xc4\xf6\xbc\x7d\xd9\x4a\x7b\xc9\x0b"
- "\x6b\x96\x8f\x1a\x15\x33\x57\x32\xcb\xb3\x31\xee\xaa\x32\x35\x9e"
- "\x56\xf5\xc7\x3f\x62\xbb\x04\xcf\x68\x7f\xc5\x25\x31\xce\x67\x15"
- "\xe9\xee\xcf\x45\x79\x34\x70\x7f\x3b\xcd\xba\x3d\xea\xf1\x4e\x9a"
- "\x75\xc7\x9d\x45\x8f\x2c\x59\x5c\xb2\x36\x2a\xf5\xae\xe8\x75\xbd"
- "\xea\x37\x50\x77\xf2\xc8\x07\xa0\x2b\x92\xe6\xac\xe7\xb1\xc5\xf9"
- "\x5a\x55\x58\xfc\x1d\xfa\x7a\x32\x64\xac\xa8\xa5\x3c\x4c\x2d\xd0"
- "\x65\xe2\x7a\xd6\xe1\x43\xd5\x99\x3f\xd8\x53\xe0\x2d\x0b\xda\x1e"
- "\x80\x5d\x77\x81\xd7\x67\x50\xee\xc3\xd6\x3a\x8e\xf5\x3b\x5a\x8f"
- "\x63\xee\xe4\x18\xd8\x19\xb8\xee\xc1\xf5\x2a\x5c\xdf\xb4\x2f\xc7"
- "\xbc\x87\x7d\xac\x57\xb3\x8f\xb5\x53\xfa\xba\x4c\x08\xba\x88\x7d"
- "\x45\xf0\x7e\x1c\xdb\x20\x7e\x72\xf2\xf7\xc1\xf8\x9b\x74\xf9\x48"
- "\x5b\x65\x7f\x96\xf2\xf8\x2a\xe4\xfe\x11\x66\x60\x35\xa3\x4b\xc5"
- "\xee\x42\xfe\x96\xd6\x18\xa4\xff\x7b\x72\xd2\xa7\x94\x6c\x1b\x1a"
- "\xe9\x71\x3b\xdb\xfd\xf4\xdc\x56\xa6\xd3\x60\xdf\xfe\x64\x3a\xc7"
- "\xdb\x87\x03\xb6\xe1\x8f\x49\xda\xb7\xba\x3d\xb7\x57\x8e\x0b\xae"
- "\x71\x51\x36\x1d\xef\x5f\x0e\x57\xf6\x89\x88\x28\xfb\xd4\x35\xcb"
- "\x90\x03\xdc\x17\x1a\x7c\x1a\x13\x77\x6d\x79\xf9\x92\x15\x4b\x4a"
- "\xec\x63\x57\x0e\xa7\xa8\xa8\x6b\xa5\x4b\x96\xdb\x57\x2c\x79\x71"
- "\xd5\x92\x95\x32\x62\x1a\xbf\x8d\x19\xf3\xb3\x44\xe6\xa8\x7a\xe3"
- "\x3c\x90\x7d\x24\xd3\xd7\xf5\x11\xc7\xea\x12\xb5\x37\x65\xb3\x4f"
- "\x87\x9a\x6f\xec\xec\x8c\x9d\x6f\xb8\x0b\x94\x9d\x37\xba\x50\xcd"
- "\x75\x36\x7e\xc6\xcf\x27\x69\x63\xe9\x40\x5c\xf0\x8d\xd7\x81\x96"
- "\x26\x45\xb7\x94\x53\x3d\xee\x8d\x56\x83\x6e\x7e\x72\xd7\xe9\xb6"
- "\x54\x97\xd4\x1f\x18\x63\xa1\xff\x62\xc6\x57\xf5\xcd\xcf\x8d\x36"
- "\xf0\x46\xb2\x5c\xef\xcd\x18\xbd\x90\xeb\x62\x98\xa7\x50\x1e\xfd"
- "\x83\x72\x76\xd6\x6f\x5b\x0c\x78\xa8\x93\xb8\x3e\x7d\x1e\xf4\x0d"
- "\x94\x97\xfb\xe1\x9a\x67\xf4\x42\xd6\x29\x1c\x5b\x42\xab\x19\xbd"
- "\x50\xed\xe3\xb9\xeb\xd8\xc6\x94\xb1\xe9\x01\x8b\xd7\x69\xa1\x1b"
- "\xca\xf8\xfb\xb0\x9c\xa6\x62\x86\xb9\x4a\x78\x6d\x18\x75\xcd\x03"
- "\xfe\x6d\x03\x3e\xef\xee\x3a\xb6\x3b\x19\xae\x9f\x36\xee\x60\x78"
- "\x2a\x26\xda\xc6\xa0\x9f\xaa\xc2\x03\xf6\x93\x7b\x72\xd4\xbc\x0c"
- "\xf8\x28\x3c\x83\xc0\x45\xc6\xdf\x54\x3e\x88\xb2\xdd\xac\x3f\x77"
- "\xe8\x6d\x37\xda\xd3\xe3\x76\x43\xff\x39\x3b\x8d\xbd\x75\xbf\xde"
- "\x6e\xc6\x8f\x71\x8f\xc6\x59\xc7\xd7\xc1\xf8\xa2\x5c\x65\x94\x6c"
- "\xf3\xba\xcc\x10\xa4\x79\x06\x7c\x9b\x5d\xed\xf1\x7a\xe3\x85\xe5"
- "\xf6\xb2\x65\xcb\x9f\x2b\x5a\xb3\xf8\xb9\x25\x45\xab\x1c\xe3\xec"
- "\xab\x96\x3f\x55\xf6\xc2\xd3\xcf\x31\xd7\xac\x2c\x5f\xf5\xf4\x73"
- "\x76\xd6\x2c\x45\xd3\x67\xcd\x2a\x7a\xe0\xb1\x47\xe7\x0f\xa7\x07"
- "\x16\x23\x0d\x33\xff\x59\x79\xe3\xd4\xab\x47\x66\x4c\x7b\xbc\x68"
- "\xda\xdc\xc7\xe6\xcc\x93\x87\x21\xfa\xdf\x4f\x5f\x9e\x38\x43\x0c"
- "\x1f\x5a\xc1\x4b\xf3\xd0\xbf\x43\x4e\xd2\x0f\xb3\x54\x1c\xed\x4d"
- "\xd3\x63\xe3\x68\x6f\xc2\x5c\x76\x13\xac\xcc\x4d\x3b\x88\x36\x1f"
- "\xc5\x0f\xf3\xd4\x1f\xa6\x28\xfe\x1a\x36\xb7\xc7\xbd\xc9\x31\xc0"
- "\x5f\x3f\xcc\x92\xfb\xe3\x75\x72\xdf\xd9\x84\x77\xd0\xff\x2e\x4f"
- "\xf4\xbb\x81\xf9\xe4\xa6\xfd\xfd\xf3\xc9\x7e\x9d\xb2\xe9\xb8\x31"
- "\xb7\x44\x5a\x31\xe6\x95\xc3\x78\x5e\xa9\xd6\x93\x7e\x78\xad\xe4"
- "\xa9\x41\xe5\x3b\x85\x8c\x79\x25\xcb\x36\xef\x13\xab\xf9\xc7\x66"
- "\x6b\xb4\x8c\xcb\xd8\x8d\xba\x8c\x73\x39\xb9\x7e\x67\xdd\x79\x9c"
- "\xd7\xb4\x61\x1f\xcf\x83\xad\x80\xf1\xab\x47\x88\x8c\x9d\xc7\x15"
- "\x4e\x9b\x0b\x78\x8d\x9b\xed\x66\x9d\x9f\xd2\x4f\xd3\xe6\x6d\xc2"
- "\xed\xde\xa7\xe6\x94\xee\x3f\xb3\x5e\x17\x9b\x46\x3e\xc0\xfe\x27"
- "\x3c\x77\x42\x9d\x9b\x07\x78\xf6\x87\x59\xcc\x0b\x03\x73\xd9\xcd"
- "\x31\xfa\xbf\x5b\x7e\xaf\x6e\xf3\x41\x23\x0e\x40\xf9\x28\x32\x99"
- "\x47\x79\x68\x87\x49\xb8\xfc\xb4\xb9\x84\xeb\x60\x7a\xfa\x69\x93"
- "\x0b\x79\xcd\x03\xf4\xdb\xdc\xd9\x4f\x3f\x7d\x9d\xc5\x58\x63\x51"
- "\x78\xff\xf0\xda\xc1\x68\x95\x98\x4e\x2f\x4d\xfe\x4a\x3a\xb9\x69"
- "\x08\xcb\xa4\x41\xaf\x4b\x69\xf5\x52\xe5\xa5\xb4\x7a\xa9\x25\x8a"
- "\x56\x17\x2e\xa5\xd5\x4b\x4d\x51\xfb\x3e\xfa\x3a\xca\x0f\xaf\x65"
- "\x9a\x31\x8f\xa1\xdd\x25\xe0\xb3\x97\x07\xe8\xf7\x92\xff\x52\xfa"
- "\xbd\x14\x4c\x4c\xbf\x97\x3c\x37\xc5\xc2\xa9\x4e\x34\x6e\xa4\x6f"
- "\x34\xe9\xe7\x84\x7e\xb8\xac\x39\x5b\xce\x49\x43\xaf\x9a\xb4\xd2"
- "\x57\xdd\xf8\xe1\xca\xf3\x88\x01\x5b\x5c\x84\x74\xfa\x96\x36\x63"
- "\xce\xcb\xeb\x4a\x97\x19\x8b\x4e\x18\x6b\x1e\xb8\x6f\xe7\xb9\x33"
- "\x7f\x2b\x88\xd3\x99\x9e\xfc\xed\x29\xf0\x7b\xbb\xb2\x4b\x7f\x78"
- "\xa8\x7f\xcd\x65\xc2\x0d\x79\xc9\x1b\xc9\x7e\xa4\xfe\x0e\x4e\x6f"
- "\x03\x0f\xc9\x35\x24\xf6\xef\x19\x0c\x66\x51\x24\x9f\x12\xc3\xfd"
- "\x51\x3f\xff\x0f\x76\x56\x36\x4e\x1f\x95\x2e\x5e\x5e\xf2\xc2\xd2"
- "\xa5\x5f\xad\x8a\xa2\x7d\x77\x3c\x6e\x6d\x4b\x0f\x7f\x8f\x71\xd3"
- "\xb3\xeb\x50\x27\xec\xff\xe7\xbd\x6a\xdc\xfc\x11\xf4\x5f\x69\x85"
- "\xb2\x25\x9f\xe8\x54\xe7\x83\x7f\xd4\x15\xa5\x9f\xc1\x23\x3f\x0a"
- "\x09\xf7\x8f\x26\x0d\xf4\xf1\x8f\x9a\x2f\xed\xe3\x1f\xb5\x27\xee"
- "\xe3\x1f\x85\xb5\xd5\x7c\x3e\xe3\x47\x3c\xff\x91\xb6\x26\x3f\xf3"
- "\x7e\x39\xe6\xcc\x9d\x98\x2f\x77\xcd\x5d\xeb\xbd\xaf\x68\x6d\x12"
- "\xfb\x95\xcb\x6f\x72\x84\x2f\x8a\x0e\xde\xb3\xe6\xfd\x31\xfe\x26"
- "\x07\x7f\x8b\x87\xbf\xd5\x2a\xf3\xe0\xbe\xfa\x14\xc9\xb9\x23\xde"
- "\xdb\x1b\x4e\xc9\xef\x12\xc3\x56\xd8\x52\x68\xd8\xd6\x96\x8d\x76"
- "\x79\x6e\x79\xbb\xea\x8f\x76\xee\x0b\xae\xaf\x68\xad\x57\xd5\x71"
- "\x91\xbf\xb7\x45\x16\x65\x43\x6c\xf1\x5c\x76\xed\x3e\xc3\xe9\x19"
- "\xd4\x1f\xca\xed\x1a\xfa\xaa\x8a\x69\xcd\xbe\x9c\x01\xc3\x57\x87"
- "\xfd\x0a\x01\xb7\x33\xde\x2f\x51\xf9\x97\xbc\x4c\x86\xdf\x0e\xee"
- "\x53\xfb\xe7\x03\xfc\x1d\x17\xcc\xe3\xec\x55\x1b\xaf\x3a\x4b\x5b"
- "\x5a\x1a\x06\x59\x43\x37\xce\x29\xeb\x7e\x3e\x43\x01\xa3\xdf\xff"
- "\x11\xe3\xdc\x50\xd6\x17\x03\x3e\x8d\x2f\x97\x45\xf9\xae\x05\x78"
- "\xec\xe5\x6f\xc5\x9c\xa2\x97\xb7\xc9\x6f\xd3\xdc\xc4\xeb\xdf\x2f"
- "\x1f\x50\xdf\x05\x7e\xb9\x2e\x1a\x17\x85\xc7\xcb\xf3\x79\x8d\x96"
- "\xdf\x47\xe3\x52\xb1\x78\xd5\xb2\x89\x15\x4b\x97\xd9\x9f\x2e\x5d"
- "\xe6\x28\x5a\x26\x63\xcb\xca\xb0\xb5\xe5\x6b\x1d\xbc\x23\x71\xeb"
- "\xf0\xb8\x31\x4c\xf7\x9d\x34\x7c\x60\x94\xff\xe4\x8f\x33\x40\x0f"
- "\x93\xf2\x9f\x7c\xc5\xac\xc6\xf5\x1f\x67\x5f\xea\x2f\xf3\xe3\x3c"
- "\xc3\x5f\x06\x7c\x65\xdd\xa1\x62\xda\xeb\x3e\x36\xcc\x77\x3f\x2e"
- "\x48\x50\xa6\xdf\xff\x93\xbf\x67\xcb\xdf\x9e\xe5\x7d\x6d\x19\x7f"
- "\xbc\x96\xfb\xed\xe5\x43\xbe\x8a\x19\x1c\x43\x55\xe7\xe7\x1f\xef"
- "\x30\xf8\xd9\xf0\xb3\x64\x58\x7c\x6e\x65\x62\x28\xda\xcf\xe8\xc7"
- "\x5f\x62\xcc\xb3\xf5\xb7\x63\xbd\x89\x18\xf7\xa0\xc9\xcb\x78\xb4"
- "\xc7\xe3\x01\xfc\x46\x21\x3d\x30\xe0\xa7\x65\xb4\xf3\x15\x33\xee"
- "\x0b\xe3\x79\xee\xfe\x19\xb3\x60\x94\xae\x5c\x52\x3e\x9c\xa6\x2d"
- "\x2e\x2b\x63\xb9\x5e\xbc\xa4\x6c\xd5\x8a\x17\x56\x16\x2d\x5b\xbe"
- "\x0c\xa9\xf7\x2f\xe5\x90\xbf\x32\xcb\x3d\xfa\x1b\xfb\xf2\x25\x4b"
- "\x4a\x54\x92\xde\x0d\xb1\xfb\x40\x6a\xef\xfe\x95\x72\x3f\xbd\x3c"
- "\x6e\xc0\xfe\x7a\xe5\x98\x30\xbd\x62\xc5\xef\x7a\x29\xd3\xd2\x36"
- "\x7a\xa5\x2e\x76\xde\xf3\xca\x7e\x83\x1f\x64\xff\x39\xd9\xd7\x27"
- "\xfb\xf3\x6e\x21\xf7\x4d\xd0\x67\x5b\x23\xfc\x4d\x6f\x3f\x6d\x95"
- "\xf6\x7e\x14\x9c\x7e\xfd\xcf\xe7\xf6\x37\x29\x3f\x01\x33\x7f\x1f"
- "\x94\xcf\xef\xf7\xb8\xb7\x82\xff\xb7\x1c\x54\xfc\xbf\xb5\x9f\xff"
- "\xbb\x4d\xc9\x98\xc3\x6d\xcd\x36\xec\xf9\x58\x99\xd9\x3a\xe9\x52"
- "\x59\x62\x1f\xb7\xad\xb3\x0c\xda\x1a\xfd\xac\x78\x6b\xeb\xe7\xc6"
- "\x3a\x6c\x83\x1e\x7f\x9e\xef\xb9\x2c\xdb\xea\x22\x3d\xed\x3e\xf6"
- "\xc7\x3f\x49\x5b\x0f\x29\x7e\xd9\xba\x23\xca\x27\xcb\x7a\x9a\xb6"
- "\x1e\x54\xfd\xb4\xf5\x80\x81\x1f\xda\x29\xf7\x03\x18\x86\x92\xfd"
- "\x57\x6e\x57\xbc\xb3\xb5\xcd\xa0\x2d\xcf\x8b\xf1\xec\x1f\xb0\x2d"
- "\x5e\x71\x49\x1f\x09\x15\xbf\xa0\x8f\xdb\x0f\x38\xc5\x06\x9c\x1e"
- "\xf7\x36\xb4\x3f\xa5\xd9\xa0\x95\x91\x27\x9a\x27\xa6\x2d\x76\x60"
- "\xd2\xba\x6c\xe9\xd2\x25\x2b\x56\x1a\x31\x9d\x73\x5f\x28\x2b\x51"
- "\x31\x9c\xef\x41\xf7\xaf\x81\x04\x4e\xe5\x30\xd0\x48\x55\xb7\x71"
- "\x36\xe4\x38\x5e\x67\x90\x7e\x7b\x72\x1e\x53\xf3\xf9\x5e\x7d\x4e"
- "\x73\x92\xb6\x57\x2a\xdf\x97\xed\x53\x95\xbd\x78\xf5\x1a\xe0\xd4"
- "\x68\xd8\x8b\xbc\x7e\xd9\x4d\xa3\x0a\xf9\x3c\x12\xfb\x6d\xef\xd9"
- "\x29\x3a\x78\xbd\x12\x79\x9a\x8d\xef\x7e\xb1\x2d\xb2\x4d\x7d\x8f"
- "\x3d\xe0\x5d\xce\x31\xf3\x6b\x87\x69\x35\x39\xa5\x22\x33\xb5\x0e"
- "\x36\x4f\x2a\xcb\x42\x5a\x17\xfb\x4e\x72\x9c\xa1\xed\x56\xb6\x95"
- "\x58\xbf\x70\x6c\xfc\x0e\xda\xe6\xc7\xfc\x06\xe3\x5f\x6d\x6a\x20"
- "\x23\xa7\x74\xf3\x3a\x4a\xe1\x3a\xa0\x9b\xfc\xcd\x8d\x4c\xdb\xed"
- "\xe3\x7e\x0b\xdd\xa3\xaf\xef\xfa\xb9\x1e\x3f\x6d\x0b\xe9\x6b\xe9"
- "\x95\xfa\xda\x65\x25\xf2\xcd\xf3\x53\x9a\xfe\x4d\x9d\x74\xcb\x2d"
- "\x2e\xaa\xe0\xef\x00\xaa\x18\x41\x37\x77\xa2\x1d\x56\xfe\xde\x1e"
- "\xec\x2b\xcc\x21\xb6\x35\xa2\x0d\x56\xdd\xf7\x16\xbc\xb2\xfd\x4b"
- "\xe5\x53\xbd\xcd\xc3\x34\x00\xdc\x2d\x3a\x5c\x8c\x97\xdb\xd1\xff"
- "\xd7\xeb\xb1\x89\xb7\x1f\x32\xea\xc0\x98\x12\x80\x2d\x5a\xc0\xf6"
- "\x28\xf0\x2e\xc6\xaf\xa4\x5a\xee\x4f\xfb\x31\x6f\xb1\x08\xf6\x1b"
- "\x1a\xf8\xb6\xd9\xf6\x80\x31\xbe\x70\xdd\x3a\xee\x9b\x79\xfd\x8c"
- "\xd7\xce\xf4\xba\x36\xf3\xfc\xda\x80\x89\xe7\x62\xed\xe2\x99\x46"
- "\xc0\x4c\xc1\x58\x19\xd0\xbf\x69\x55\x52\x7d\x9e\x7d\xcc\xfc\x18"
- "\x0b\x6f\x14\x45\x61\x2b\xef\xeb\xa4\x19\xdf\x0c\x6b\x38\xcf\xf4"
- "\xaa\x5e\x38\xb0\x5f\x83\xf2\xa0\x3f\xe4\xc1\xd5\x41\xd5\xf2\x3b"
- "\x69\x2c\x0b\xdc\x97\xbd\xe8\x1b\xfe\xb6\xbd\xb8\x78\xa6\x09\xf3"
- "\xfc\xb4\x53\x54\xbd\x8b\xfb\x88\xf7\x58\xd9\xf7\x0b\x69\x16\x8e"
- "\x71\x7e\x92\xaa\x5f\xe2\xfe\x61\x5c\x84\x27\xcd\x11\xee\x29\xfc"
- "\x2e\x9f\x6f\x65\x7d\xb8\xa1\x12\x76\xec\x52\xd6\x25\x35\xc3\x78"
- "\x5e\xcc\xdf\xa6\xe1\x7b\x67\x89\xd0\x64\xff\xae\xe3\xfe\xad\x19"
- "\xb6\xa1\x53\x68\x5f\xba\x49\x1c\x0d\x12\x7d\x69\xa2\x70\xc8\x94"
- "\xc4\x78\x9b\x9c\x67\xf8\x0c\x6e\x23\xf9\x2a\xb6\x10\xea\x4d\xd9"
- "\xbe\x8e\xac\x7c\x7e\x99\xbf\xbb\xd2\x1a\xac\xa7\x56\x47\x3d\xfd"
- "\x6b\x78\x07\x79\x57\x73\x2c\x8a\x9a\xa6\x7f\xab\xd8\xc1\xfb\x56"
- "\xc3\x70\xff\xa2\xfd\x71\xae\xcb\x33\xf3\xdf\x8e\xff\x89\xfe\xcd"
- "\xfb\x27\xb2\x2f\x90\xcf\x85\xc7\x0a\xff\x95\x8e\xe5\xff\x2b\x39"
- "\x3b\x84\xc6\x73\xa5\xaa\xe7\xb9\x8e\x2d\x80\xd5\xc8\x67\x7d\xad"
- "\x5a\xb7\x6d\x38\xda\x6f\xe6\x35\xf9\xd6\x60\x80\xbc\xcb\x7f\x0d"
- "\x1c\x3d\xff\xbe\xf7\x3c\xa5\x78\x97\xff\x4e\xde\xab\x39\xcc\x99"
- "\x46\x5f\x49\x3b\xdb\x69\x61\x3e\xe7\xcc\xfb\x7c\xb0\xdb\xb5\x6a"
- "\xc6\x31\xa2\xf0\xe6\x6f\xb6\x1b\xe5\x61\xc7\x19\xe5\x65\xac\xa8"
- "\x3d\x4c\x0f\xe0\xd4\x32\x4f\xd1\xe4\x18\x66\x95\x0a\x67\xd0\xa7"
- "\x30\x9a\x3e\xd5\x21\xa6\x0f\xc7\xc7\xd4\xd0\x5f\xc0\x2d\x1f\x34"
- "\xd0\x8c\x3a\x80\x73\x8a\xbe\x2e\x9a\xb2\xfd\x3c\xa5\x7a\x97\xf3"
- "\x77\xb7\x6a\x9e\xb4\x14\x98\x53\xb4\x8b\x67\x9b\xaa\x2f\x90\x99"
- "\xfb\x8d\xf7\x42\xaa\xe5\x7b\x49\xf3\x7c\xee\xb3\x40\x46\x76\x3b"
- "\x7e\x27\xf0\xf3\x33\xdf\xe1\xca\x67\xd4\xb6\x80\x4e\xed\xe8\xab"
- "\x46\xbe\x2a\x5e\x4c\xe7\x36\x19\x7b\xe6\x03\xe9\x90\xa3\xb0\x90"
- "\xdf\xb6\x85\xcc\x78\xda\x35\xc8\x11\xaf\x8b\xec\xad\xa5\x54\xcd"
- "\xbd\x6d\xcc\x1e\xe8\xba\xfa\x5a\x79\x06\xd4\xca\x6b\x85\x6f\xc8"
- "\xef\x18\xd4\xf4\x9f\xff\xfc\xf1\x08\x3e\x27\x57\x93\x62\xe2\xb5"
- "\x14\x4f\x8e\x4b\xe7\x73\x57\x8f\xbb\x16\xfa\x7f\x84\xee\x4b\xba"
- "\x5d\x9e\xc3\x65\xd9\x1f\xcc\x46\x87\x7d\x78\x4c\xec\x2e\x24\xde"
- "\x53\x49\xdd\x28\x02\xa9\x1d\x16\xd1\x1a\x3c\x26\xcf\x47\xb6\x06"
- "\x23\x72\x4f\x05\xef\x93\xe6\x04\x03\x16\xd8\x93\x6d\x4c\x3b\x23"
- "\x9d\xf7\x63\x78\xad\x6a\x4e\x50\x04\xe6\xae\xb5\xf0\x77\x07\xb3"
- "\xe5\x7a\xbc\x9e\xde\x6a\x83\x2d\xbe\x36\x60\x41\xdb\xc3\xfd\xb0"
- "\xba\x0b\x93\x59\xde\x90\x37\xab\x3f\x6f\x77\xa1\x99\xbf\xa3\xcb"
- "\x75\x46\xa5\x0d\x99\x5b\x81\xb2\xdc\x57\x7a\x9a\xb2\x43\x6b\xfb"
- "\xbf\xff\xc8\xf6\x27\xfb\x4c\x8b\x95\x85\x49\x5a\x77\xa1\x29\x02"
- "\xd8\xe0\x7d\xab\xfc\xfe\x61\x38\xa0\x7f\x4f\xa8\x13\xf2\xdb\x4e"
- "\xa2\x66\x67\x00\xf9\xcc\x0c\x97\xcf\xdd\xf3\x77\x18\x44\xc6\xae"
- "\x8a\xc4\x7e\x6c\x9b\xf7\x7b\xab\x16\x80\x9f\x5e\xed\x64\x79\x8e"
- "\x58\x6f\xd8\x6a\x7f\x96\xed\x93\x57\x17\x33\x3d\x23\x90\xb1\x48"
- "\xc6\x0d\x5b\x27\x76\x52\x52\x15\xf8\x56\xad\xeb\xbc\xba\xd1\x07"
- "\x19\x74\x6a\x02\x36\xdf\xab\xe5\xcc\x37\x96\x2e\xf6\x3f\xbb\xc1"
- "\x23\x7d\xbe\x32\x5d\x8d\xbe\x50\x27\x1d\x73\xfd\x85\x8e\x85\x7d"
- "\xae\xc3\xe7\x03\x66\xe5\xfb\x65\x66\xb8\xaf\xf1\x3b\x27\x78\xb5"
- "\x28\xd2\x48\x83\xad\xb7\xf3\x9c\x13\x63\xd8\xdf\xd4\xfc\xeb\xd5"
- "\x4e\x63\xae\x79\xf9\x36\xec\xc8\xe7\x58\x05\x42\xd8\x48\xab\x5d"
- "\xc4\xfb\x38\x4e\xd1\x93\x4b\x13\xd7\xf1\x3a\xd7\x0e\x1b\xec\xfe"
- "\x7c\x1d\xee\x39\x05\x17\xf9\x2f\x03\x97\x79\xe6\x58\x9d\xdc\xeb"
- "\x41\x9b\x16\x79\x23\x80\x1d\xc9\x2c\x62\x9b\xc5\xe9\xfc\x92\xd7"
- "\x41\x5f\x7b\x09\xf5\x78\x5b\xc3\x6d\xc4\x31\x4f\xf6\x6a\x18\x1f"
- "\xcf\xd9\x48\xf7\x73\x73\x9e\xa5\x1d\x2f\x6a\x22\xd7\x8a\x39\x30"
- "\xef\x71\x38\x59\xc7\xf1\xfc\xba\x2a\x42\x57\xf9\x60\x45\xf1\x39"
- "\x7d\xc0\x58\xfb\x7b\xde\x4f\x82\x9e\x88\x08\x9b\xe9\xa3\x8b\x7e"
- "\x62\x5f\x16\x79\x6e\x7f\xd3\xf5\x6f\xa4\x6f\xa4\xfb\x84\xc9\x22"
- "\xfd\x18\xb5\x9a\xaa\x76\xf4\x6d\x48\xf9\xd5\xe5\x78\xa2\x7c\xea"
- "\x92\x51\xd7\x05\xf6\xa9\x13\xd6\x9c\x79\xf5\x72\x2d\xef\x86\xad"
- "\x3d\xee\xd7\xec\x7e\x7a\x35\x8f\xf9\x67\x2b\xfb\xd6\x4b\x1d\xfb"
- "\xda\xb6\x40\xc6\x82\x46\x86\xc1\xe7\x06\xb5\xd5\x91\xa6\xea\x2f"
- "\xc8\xac\xe8\xf1\xda\xf3\xad\x5d\x3d\x5e\xe1\x59\xd0\xc8\x67\xc6"
- "\x74\xd8\x96\xb3\xf4\xda\x54\x51\xb3\x00\x63\xf9\x6b\x5b\x55\xdf"
- "\xc8\xfb\x42\x7e\x1f\xee\xcb\x85\x0c\xee\x38\x5e\xdf\xcb\xeb\xeb"
- "\x3b\x5c\xc2\x7d\xa3\xb7\xdb\xba\xa0\xf1\x51\x1b\xdb\x54\xaf\x35"
- "\xfa\x4d\xff\xab\x4b\x5f\x5b\x93\x31\x08\xe2\xd7\xc4\xfa\xfb\x70"
- "\xb7\x6d\xb8\x0f\x40\x30\x47\xcc\x3a\x4d\x75\x19\xbd\x6e\x32\xf5"
- "\xc1\x16\xec\x35\xc1\xe6\xdf\x5d\x98\xba\x7d\x24\xe5\xe1\xdd\xc8"
- "\xd3\xf4\xda\x85\xb0\x89\xb2\xf0\xb3\x06\xae\x2f\x1d\x06\xb8\xf9"
- "\xbc\xee\xd8\x72\x9e\xd7\x8d\x76\x3e\x26\x6d\xb5\x37\x68\x8c\x06"
- "\x78\xbc\x87\x52\x3d\x92\xc6\xf0\xda\x1f\xd2\x72\x8b\x22\x6a\x2f"
- "\xd1\x98\xdf\x6f\x1a\x49\xe3\x62\xeb\x7d\xed\x84\x5a\x1b\xac\x93"
- "\x31\xd3\xd6\x04\xe8\x06\xc7\xbd\xfc\x9d\xca\x9d\x6d\xc2\x9d\x2c"
- "\xc4\xf5\x36\x93\xda\xef\xdf\xf9\xa1\xa5\x4e\xf1\x9d\xdc\x3b\x03"
- "\xbf\xf1\xde\xa4\xbe\x4f\x93\x24\x63\x2f\x64\x8e\xce\xe6\x6f\xfe"
- "\x46\xad\xbd\x5a\x25\x1e\xfa\x79\xe9\xc8\xa6\xdb\x8a\x19\x06\xe3"
- "\x53\xb4\x58\xed\xf1\xf0\x59\x6a\x3f\xed\x94\xf1\x18\xb7\xbe\x41"
- "\xa9\xaf\xbc\x41\xd6\x96\xa5\xb2\x5d\x9d\x4a\x16\xcd\xc4\xf8\x6a"
- "\x1e\x96\x33\xf0\x04\xf0\xe6\xfa\x98\x37\x5a\xc3\xe7\xbc\xce\x72"
- "\xa1\x79\x9f\x65\x5b\xf4\xf5\x5b\xbd\x2b\x0e\xd0\xdc\x8e\xb0\x3a"
- "\xf7\xb7\x90\x02\x0d\x80\xd7\x30\x92\xac\xa7\xe8\xf5\xbb\x7c\x65"
- "\xc4\x7b\x00\x37\x79\x57\x1c\x04\xec\xd7\x1f\xe2\xb1\x60\x1b\xe8"
- "\xa3\xc6\x84\xd7\xc3\xbe\x50\x3b\xb5\x40\xbe\xe7\x38\x44\x84\xe1"
- "\x20\xcf\x46\xd9\xde\xdd\x36\x7b\x91\x3a\xef\x2e\xdb\xda\xbf\x77"
- "\xa6\xb7\xc3\x77\x5e\xc2\xdb\xe1\x83\x55\x6a\xb4\xc9\xa0\xb5\xe2"
- "\xaf\xd7\xff\xe8\x5d\xb1\x8f\xb8\x7f\x38\x3f\x9e\xbd\xbe\x2e\xe4"
- "\x3d\x13\xdb\x2f\x9c\x07\xef\xbe\x00\xdc\x6f\x0f\xec\xff\xf2\xbe"
- "\xe4\x40\x9e\xfa\x37\xf8\x1c\xd0\xce\x49\xbb\x41\x23\xb5\x5e\xfe"
- "\xfa\x93\x8c\xab\x9f\x5e\x5f\xe8\x2b\xff\x4b\x62\x3f\x4f\xc8\x3e"
- "\xf8\x7e\x63\xab\xdc\x07\xab\x9b\x3d\x27\xac\x09\xa5\xcf\x76\x41"
- "\xb6\x9c\x98\xa3\xec\x22\xd6\x05\x52\x9f\x4c\x60\xdf\x9a\x5d\x49"
- "\x96\x24\xd5\xbf\xdc\x16\xb6\x57\x12\xf5\x71\xd4\x1e\x9d\x95\x71"
- "\x35\xfa\x98\xbf\x97\xa7\xf1\x3e\xeb\x48\xd0\xbb\xcf\x46\x8a\xff"
- "\x84\x07\x75\x7f\xa1\xdb\x6e\x6d\xfa\x58\xd6\xd6\x9d\x71\x43\x1d"
- "\x9f\x4b\x33\xfc\x6d\x21\xbf\x3b\x8a\x94\x0f\xb3\x8d\x75\x54\x83"
- "\x49\xc9\x0e\xe3\xa8\x97\x3d\xa6\xfc\x1c\xea\xbc\x28\x7f\x2c\x61"
- "\x7b\x93\xa1\x77\xdc\x50\xd3\x68\x0f\xdb\x91\x02\xba\x0a\xe3\xc1"
- "\x55\xbe\x60\xaf\xfe\xad\xc2\x5d\x1b\x60\x53\x5f\xc5\xe7\x52\x0c"
- "\xdc\xae\x6c\x3f\x6d\xd7\x4c\x35\xb7\xd9\xb5\xc5\x58\xaf\x11\x56"
- "\xd0\xd8\x6d\x11\x7c\x46\x8d\xcf\x1a\x04\x33\x36\x37\x05\x32\x76"
- "\xfa\x95\xdc\xec\x6a\x82\x9d\x2a\xf5\x6d\x51\x88\xbf\x11\xef\xdc"
- "\xcf\xfb\xa5\x98\x37\x5d\xc5\x6d\x06\x1c\xcc\x7f\x9e\xcf\x52\xe3"
- "\xf9\xae\x41\x7d\xaf\xe5\x9c\xc9\x68\x1b\xda\x24\xdb\x86\x36\xca"
- "\xb6\xe9\xdf\xf2\x39\x45\x6f\xc8\xb3\xcb\x57\xd6\x9e\x37\x6c\x8a"
- "\xb6\x9b\x9b\xf8\x3b\xa5\xa7\x68\xf7\x67\xf2\xfc\x01\xfa\x44\xed"
- "\x2d\xbc\xd1\x28\x86\xbf\x32\xfc\x0a\x61\xaa\x18\xd1\x9e\x9d\xfe"
- "\xd7\x38\xee\x9f\xfe\x3d\x30\xc0\x6e\x81\x2e\xf7\xcb\xb3\x5d\xa8"
- "\x8f\xbf\xa7\x38\xa0\x87\x76\x17\x70\x5f\x4d\x38\x40\xf9\x8a\x0f"
- "\x77\xcf\xe0\xf5\x5b\x35\xcf\x7b\x23\x08\xdd\x7b\x48\xcd\xa9\x0c"
- "\xdf\xec\x24\xe9\x9b\x1d\xad\x63\xaf\x0c\xc7\xdd\x52\xdf\x89\xcc"
- "\x2a\xe8\x9f\x37\x3a\xe4\x19\x35\xe0\xbb\x26\x6c\xe8\xbf\x37\x3a"
- "\xd8\xcf\xa7\x7f\x8f\x7d\x2d\x78\xa5\x4a\x9d\xd9\xed\x71\xef\xde"
- "\x6c\xd8\x28\xf2\xfb\x4f\x6e\x71\x94\xf3\xcd\x5d\x7b\x4e\xee\xc1"
- "\x57\xcb\xf3\xe5\xa7\xf5\xf3\x4d\xbb\x77\xe9\xeb\x19\xb9\xec\x17"
- "\x8f\xb2\x5e\x3f\x7d\x24\xfd\x79\x98\x06\x5c\xb7\xc4\x5d\x7e\x83"
- "\x69\xf7\x89\x81\xbd\x94\x37\x0e\xc9\x74\xe9\x2b\xba\x3b\x68\xf0"
- "\x08\xda\x7b\x95\x8a\xc3\xf8\xc6\x93\x47\xc6\x91\xe4\x81\x6e\x61"
- "\x1b\x3e\xba\x9e\x79\xb2\x3e\x3b\x9a\x4e\x73\xc3\x9a\x53\xe9\xa0"
- "\xdd\x66\x21\x65\x7d\xb7\xf9\xab\xed\x89\xfa\x17\x0d\x5b\x44\xd1"
- "\xd9\x0a\xfd\xd2\x30\x45\xd2\xda\x93\xd6\xc4\xf1\x30\xd6\x57\x71"
- "\x7c\x9f\x3d\xb7\x73\x1c\xa5\xb0\x27\xad\x2d\xc2\x67\xe1\x30\xce"
- "\x6a\x9e\x34\xff\x29\x07\x99\x8a\x1c\xbc\x7f\xb4\xc0\xc1\xf3\x2b"
- "\xe1\x84\x2d\x90\x09\xfb\x04\x72\xbe\x61\x19\x59\x9e\x2c\x05\x6c"
- "\x67\x6e\x16\xc7\x39\xe2\x18\x47\x1c\xa7\x2c\xe2\xcc\xcd\xc4\xfd"
- "\x08\xd8\x73\x56\x61\x4d\xf3\xb2\x0f\x4a\xc4\x2d\xa0\x8f\x4f\x70"
- "\xac\x25\x93\x2f\x10\xa2\x0d\x67\x28\x85\xe3\x28\x85\x6b\x16\x6c"
- "\x69\x0d\xfe\x55\xce\x2d\xd2\x1d\xb0\xa7\x35\xca\x06\xcd\x6d\x5a"
- "\xc6\x02\x07\xc6\xf8\x72\xd5\xee\x73\x42\xb5\x5b\xe1\xcd\xf8\x2b"
- "\x1d\x67\xf1\x57\x49\xdc\xf7\xfe\x39\x0c\xf8\x9a\x27\xeb\x44\xc4"
- "\x93\xd5\xae\xce\xd0\x1d\xa3\xaa\x72\xd1\xe9\x83\x6d\xcc\x3e\x91"
- "\x7c\x4e\x92\x7d\x5c\xb8\x8d\xdc\x3e\xae\xfb\xdf\xce\x9f\x91\x71"
- "\xa1\xc2\x78\x76\x96\xe9\x65\xba\x50\xa6\xeb\x18\xf5\x7a\xb2\x64"
- "\xdb\x5b\x83\xaa\x6c\x91\xbc\xe7\xf2\x51\x74\xd0\xdb\xdc\x4f\x07"
- "\xb4\x9d\xdb\xc7\xed\x0f\x33\x4d\x40\x03\xbd\xad\xb6\x3e\xbd\x9d"
- "\xdc\xc6\x7f\xc5\xa8\xf3\x06\xda\x89\xb6\xca\x76\xf6\xa1\x9d\x47"
- "\x4b\x89\x42\xb5\x9b\xbd\x5f\x66\x66\xb5\xf3\xfc\xd0\xf9\x47\xd8"
- "\xd1\x95\x1e\xc2\x3c\xd0\xfc\x4e\x95\xc7\xf4\x63\xd8\x26\x55\x01"
- "\xcc\x07\x03\xa2\x93\xed\x7d\x9f\x03\xbf\x70\xbd\xfc\xc6\xab\xb4"
- "\x8f\xf9\x7b\x9c\x2f\xa2\x4d\xda\x67\x54\xd5\x29\x3a\x61\x9b\x86"
- "\x7c\x61\xe4\x29\x45\xfb\x31\x7f\x3c\xa5\xe3\xcf\x79\x37\x7c\xa1"
- "\xda\x65\x29\xa3\xac\x4f\x16\x6c\x31\xf9\xda\xb7\x90\xd1\x96\x45"
- "\xc8\x87\xf6\xd8\x00\x2b\x4d\xc6\xc0\x47\x3b\x77\x03\xcf\x50\x54"
- "\x9b\x5a\xba\x42\x80\xf9\x67\x1a\x5e\x40\x49\x6f\x9c\x45\x3b\xce"
- "\x92\xcd\x53\x05\xfb\xeb\x11\xb6\x17\xf7\xa6\x5d\x5d\x48\x63\xfc"
- "\xb4\x27\x4b\xf1\x9d\x8c\xd1\x72\xed\x69\x6a\xb8\xab\x3f\x0e\x0b"
- "\xc7\xb6\xca\x58\xb0\x95\xf9\x48\xc6\x63\xe1\x31\xa3\x07\x3c\xc3"
- "\xfe\x29\x6b\x50\x47\x4f\xee\x08\x89\x8f\x7b\x12\xe1\x39\x15\xcf"
- "\xfc\x7d\x9e\x2c\x5e\x13\x40\xb9\x2d\x02\x34\x63\xf8\xb0\xe7\xca"
- "\xf9\xca\x34\x4c\x78\x7e\xe3\x5d\x9a\x8c\x3a\x3c\x3c\xf7\x6d\xaa"
- "\x0a\x98\x5e\x7a\x97\xc6\x5d\x99\x4e\x69\x28\x19\x4c\x7f\xf3\x5e"
- "\x00\xc3\x43\xdb\x32\x4f\x53\xe3\x43\xb1\x32\x66\x97\xba\x4c\xe9"
- "\xc1\x46\x2b\xaf\xbf\x5f\x61\xbd\xd2\x86\x63\x3f\xa2\x2b\x2b\xd7"
- "\x98\x65\xe0\x01\x18\x6d\x83\xe1\x7e\xe5\x74\x68\x2c\x1b\x0c\xd6"
- "\xb6\x9d\x32\x36\x97\x73\xfb\x4e\xf6\xf1\xdb\xbc\xff\x88\x8d\xe3"
- "\x25\x63\xec\xdc\x17\xa4\x95\x7b\x28\xc5\x79\x86\xd7\x64\x66\xd3"
- "\x91\xfa\x3c\xda\x8b\x39\xb9\xe8\xce\xcd\x7c\xf5\x3c\xfb\x13\x28"
- "\x1d\xc2\x36\x29\x9f\x63\x13\x2b\x73\xad\xd5\x3b\x0d\x1b\xfe\xcd"
- "\xbb\x2a\x2f\x90\x49\x7d\x8f\xe2\xcd\x49\xd3\xed\x22\xbc\xc3\xa4"
- "\x95\xd6\x73\x7c\xa1\xcc\x2a\x8e\x01\x5d\x6a\xc4\xec\x91\xb6\x4f"
- "\x05\x64\xae\xdb\x36\x7c\xdb\x0a\x1a\xc7\x71\xc6\x2c\x01\x65\xcb"
- "\xa9\xf1\xfa\xcd\x12\xe0\x67\xd5\xf7\xd0\xad\x2a\x8e\x4f\xc3\x81"
- "\x86\xf3\xa8\x4b\xbd\x7f\x2d\x82\x39\x8c\x84\xbb\x82\xc6\xd4\x9f"
- "\xa7\x5c\xb6\x83\x8a\x3e\x53\x36\x1b\xcf\x0b\x67\x77\x59\x44\xe4"
- "\x3f\x73\x69\xcf\xe9\x81\x38\x64\x81\x95\x1c\xbb\x4c\xd8\x06\x3b"
- "\x1f\x5c\x3d\x42\xfa\xd1\xc8\xd8\x17\xea\x7b\x65\x44\x3b\x6a\xc9"
- "\xcc\xdf\xe7\xe4\xb5\x3c\x5e\x1b\xe6\xb3\x34\x6a\x0c\x79\xcb\x6c"
- "\xc4\x67\x1a\x74\x6f\xce\xa3\xe6\x3b\xda\x55\x98\x7f\x05\x7a\xbc"
- "\xde\xd5\x3c\x66\xbc\x35\x8b\xcf\xef\x0c\xcc\x71\xde\x1a\xcf\xef"
- "\x38\x8d\xfd\xcb\xf3\x25\x2d\xdf\x2a\xe7\x79\x8f\x3e\x67\xfc\xc4"
- "\xde\x9f\xa6\x6c\x18\x1e\xcb\x18\x87\x06\xb5\x8e\x9c\x0e\x5c\x3c"
- "\xc6\x78\xc6\xe3\xba\xfa\x36\xe8\x5b\xfb\xfc\xa6\x3f\x0c\x7a\x8e"
- "\xcd\x58\x57\x97\xbe\x63\x1c\x77\xc9\xfd\xd6\x71\x63\x7c\x93\xdf"
- "\x7e\xd8\x34\xf2\x81\x95\x6b\x29\xfb\xd1\xeb\x52\x64\xcc\x03\xfe"
- "\xc6\xa3\x1a\x77\xdf\x0a\x0f\xec\x51\xe5\x4b\x7a\xcb\xef\xba\xf1"
- "\x1c\xc3\x84\x31\x58\xc5\x1a\xeb\x52\xe3\xaf\x71\xbe\xf8\x27\xd7"
- "\x0d\xd4\xf3\x93\x29\xfd\xe3\x28\xea\x60\x5f\x09\x86\xaf\x6c\x93"
- "\xb7\xb8\x6c\x80\xe7\x56\x6a\x7c\x7d\x2b\x70\x19\x5b\x2c\x97\xe9"
- "\xab\xe9\xf3\x49\x5f\xd7\xdf\x15\x7d\x2b\x28\x79\xe2\x0e\xb2\x7d"
- "\x52\xe5\x37\xa7\xab\x98\x39\x16\xd4\xbf\x8d\xdf\x33\xaf\x7b\x27"
- "\xf0\x5a\xdc\x4f\x3e\xf7\xf1\xb8\xdd\x57\x98\x3a\x87\xe7\xfa\xd2"
- "\x16\xff\x49\xfb\x78\x94\x43\x5a\xe6\xc7\x67\x43\xe6\xea\x75\x34"
- "\x8e\xbf\x9f\x88\x74\xf9\x6d\xa8\xc0\x37\x9e\xeb\x19\x9d\x45\xb6"
- "\xd1\x3b\xd8\xc7\x7e\x1f\xf9\x4d\xff\x97\xfc\x2e\xa4\xac\xbf\xf6"
- "\x75\x2b\xc7\x59\x7b\xaf\xd7\x3f\x44\xf5\xd5\xbe\x3d\x78\xce\x8d"
- "\x7a\xbe\xdb\x58\xcb\xf7\xd3\xbe\x7a\xb9\x1f\xc8\x7e\xc4\xcb\x79"
- "\xbc\x76\x7a\x06\x7c\x6f\xf6\xed\x51\xb8\xec\xdb\x73\xc4\x41\xbc"
- "\x56\x7d\x7c\xaf\x8c\x99\xb4\x0f\xba\xf3\xad\x26\x7d\x3d\xa6\x4d"
- "\xf2\x15\xdb\xbb\x3f\xe4\x39\xd8\xdf\xbd\xdb\x90\x8f\xc7\x89\xa2"
- "\x0a\xca\x57\x36\xbc\x73\xbf\x06\xfe\x19\x68\xff\xbe\x61\xbc\xd6"
- "\x97\x50\x27\xbe\x41\x24\xcb\xd4\x54\x75\x4a\x3f\xae\x9a\x5d\x0e"
- "\x5c\x53\x44\x8d\xcb\x83\x6b\x2a\x78\xae\x11\x57\x2b\xae\x75\xb8"
- "\x42\x7f\xbf\x5e\xc0\x7c\x89\x39\xac\x0d\xf3\x84\x94\xee\x8c\x2a"
- "\xff\x60\xe7\xff\x98\x36\xbe\xcd\x8f\x93\xf2\x4b\x7d\xdb\xd5\x82"
- "\xde\x9c\xbb\x87\x68\x65\x58\xf4\xda\x6f\xe0\x73\x36\x6f\xbb\x9c"
- "\x7b\xd8\x1f\xe4\xed\x79\xb1\xfe\x20\x6f\xe3\xee\xed\x83\x44\x3f"
- "\x4d\xc1\x6f\x32\xee\x5d\x03\xbf\x9f\x96\xf7\xb8\xdf\x86\xbd\xb8"
- "\x4f\xda\x58\x57\xa6\x13\xdf\x56\xfb\xeb\x3c\x2f\xca\x58\xd4\xa4"
- "\xda\xbb\xd3\x8b\xe7\x14\x91\xf1\x3a\xe9\xed\x6d\xc2\xb3\xd5\xee"
- "\xc4\xb8\x96\x01\x9a\x8c\x44\x9b\x33\x76\x39\xb8\xbd\x8c\x6f\x77"
- "\x86\xcb\x13\x7d\xf6\x91\x61\x72\xfb\x03\x19\x4e\x86\x47\x62\xc2"
- "\x0d\x79\x06\x3d\x75\x3a\xf1\xbe\x91\xa9\x1b\x30\x94\x1d\x84\xfc"
- "\x80\x61\xe4\xef\xa7\xfd\x48\xfe\x96\x01\xfa\x14\xf9\x30\x27\x4e"
- "\x31\xce\x55\xf6\xb8\x7f\x5a\xf6\xdb\x32\xb5\x7f\xc0\x65\x83\x51"
- "\x65\x39\xd6\x40\xa2\xf2\xa8\x33\x45\xd5\xe9\xc2\x9c\xef\xed\x8d"
- "\xaa\xde\x9f\x16\x0f\x26\x4b\x55\xa3\x60\xdf\xd5\xfb\x39\x1e\x01"
- "\xdb\x43\x53\x7c\xd9\x41\xf2\xd5\x6b\x18\xf3\x9d\xde\xfc\x2a\xe1"
- "\x3d\x45\xff\x34\xaa\x35\xd4\x79\x85\xe3\xe1\x4f\xd5\x37\xc2\x7a"
- "\x5d\xe4\xab\xbc\x43\x7e\x37\xf8\x2c\xed\xff\xbe\x2f\x20\xe3\x6f"
- "\xf3\xfd\x54\x7e\xcf\xbe\x0f\x3c\x36\x60\x8e\xdd\x1f\xbf\x4e\x43"
- "\xde\xbd\x9c\x8e\x34\x5f\x30\x20\xe3\xdc\x0d\xf8\x66\x57\x1d\x55"
- "\x32\xb5\x7f\x98\x3c\xf7\xce\xf8\x86\xbf\xeb\x65\x9c\x35\x4f\xd5"
- "\x51\x6e\x83\x13\xf3\x3f\x5f\xb8\xc7\xcb\x32\x61\x5f\xcd\x6b\x85"
- "\xff\xf4\x19\xf8\x4e\x68\x35\x55\x47\xaf\xac\x0d\xff\x24\xe7\x34"
- "\xce\xb0\x38\x1b\xc8\xa8\x3a\xca\x36\x49\x75\xd5\x90\x94\x69\xf5"
- "\xc2\xdb\x9d\xe9\xf4\xf6\xb8\xf7\xa7\xfc\xb6\x42\xf5\xcd\x95\xc1"
- "\xdd\x9f\x62\xb4\x7d\xaf\xde\x76\xd4\x25\xf7\xe6\x26\xd6\xa9\xb8"
- "\x7e\xc8\x93\x3f\xe8\x9a\x15\xfa\x99\xed\x01\xf6\x1b\xd5\x69\xe1"
- "\xe9\x1f\x1b\xae\x0c\x8f\x4b\x62\xa6\x25\xa8\xa3\x4f\xaf\x23\xf8"
- "\x5f\xac\x23\x78\xb9\x3a\xa0\x1b\x72\x4e\xd3\xcf\x5c\x57\x3e\x77"
- "\xfc\xd9\x2c\xc9\x2b\x1e\x67\x93\xd2\x99\xff\xfc\x45\x04\xf3\xb7"
- "\xb0\x75\xa7\x57\x7e\xe3\xc7\x44\x2e\x8e\x71\x18\xf6\x2c\x6a\x6a"
- "\xa9\xe8\x25\xef\xea\x3f\x51\x07\xfd\xec\x43\x2e\xd3\x52\xce\x73"
- "\xb6\xd7\xa9\xaf\xd6\x65\xed\x33\xed\xe7\x73\xc2\xa5\x7b\xd0\x0f"
- "\xbb\xa3\xf8\xac\x35\xf8\x27\xf2\x15\xf3\xfa\x6a\x1b\xe4\xeb\x75"
- "\xe8\x8b\x9d\x5e\x0d\xba\x01\x36\x7a\x44\xd2\x03\xf6\x8b\x9a\x6f"
- "\x6d\xde\x2f\xe7\x5b\x01\x79\xe6\x2f\x4d\xc6\x2e\x74\x97\x1d\xe3"
- "\xb5\xef\x48\x5f\xa1\xbd\xc7\x4d\x05\x1c\xd3\x90\xd7\x9d\x85\x35"
- "\xa7\x6c\x6e\x38\x59\xc8\xf9\x14\x6c\x7f\x8e\x69\xe8\xc3\xac\x32"
- "\x02\x3b\xba\xfe\x22\x65\xd5\xc3\xf6\x84\xce\xb6\xb2\x5e\x6f\xd0"
- "\xe3\x1a\x6e\xbb\x38\x10\xd7\x70\x2f\xaf\xf5\xb4\xe3\xfe\x22\x99"
- "\x23\x35\x9b\xf7\xef\xbe\x48\x63\xf6\xac\xa6\xdc\xdd\xbc\x96\xf7"
- "\xb9\xb2\x7d\xd8\xae\x90\x31\x0e\x5f\xc8\xe5\xf5\xfc\x01\xdb\x67"
- "\x0d\xc7\x60\xed\xd7\x5b\x72\x2e\x7a\x65\xf4\xfe\x67\x39\x0e\x86"
- "\x3d\x55\x9d\x61\xeb\x2e\x07\x68\x07\x9b\xe3\x67\x01\xd0\xaf\x2c"
- "\x51\xdf\x1a\xbe\x4d\x3b\xa2\xe2\x52\xfe\x76\x8c\xd2\xef\x7e\xfa"
- "\xf9\xa4\xc1\x78\x22\xb2\xbb\x90\x26\x76\x51\x9e\xf2\x57\x18\x86"
- "\x31\xf1\xe7\x75\xbc\x7f\x5e\xf5\x3c\xd9\x22\xbb\x17\x26\x39\xdf"
- "\xa4\x64\xfe\xa6\x34\xff\xaa\xbe\x10\x9d\x13\xcb\x28\x8f\xf7\x1f"
- "\xd8\xa7\xc1\xbe\x5e\xe6\x5f\x36\xa6\x92\xf2\xa2\x61\xcf\x54\xce"
- "\x46\xf7\xd8\x1f\x5a\xfe\xf4\x0b\xcf\x3b\x16\x97\x2f\x7b\x6a\x59"
- "\xd9\xb2\xf2\xb5\x32\x6c\xc0\x38\xf9\xef\xc1\xb1\x25\xf3\xe4\xa6"
- "\x73\x94\x7d\x31\x66\x60\x3d\xee\xc0\xa8\x08\xaf\x1f\x5c\x11\xbd"
- "\x7e\xde\xa5\xef\xa3\x05\xf6\xc8\x7d\xa5\x03\x93\xfc\xa6\xa3\xf2"
- "\xac\xe9\x36\x15\x43\xa6\x53\xf9\x31\xa8\x7c\x9a\xe7\x75\x8e\x41"
- "\x34\xe5\x24\xbd\x67\xe5\xfd\x10\xf4\x55\xa3\xaf\xf2\x34\xc1\x0e"
- "\x99\xc2\xfb\x2c\x2d\xbc\x96\x21\x6d\xdf\x03\x6f\xca\x31\xec\xac"
- "\x8c\x43\xb5\xef\x24\x9e\xd9\xef\x5d\x13\x85\xbb\x23\x2f\xd8\xf6"
- "\x69\x2f\xd8\x7e\x2a\x44\xe1\x1b\xda\xb9\xd2\xdd\xe2\x5c\xe9\x1b"
- "\xc2\x93\xce\xe3\x6f\xf6\x69\x3a\xf0\x41\xd8\x4d\xdf\xc0\x6f\xe8"
- "\x40\x0c\x81\x03\x7f\x98\xd5\x21\xfa\xf0\xd3\x30\x2f\xb7\x47\xed"
- "\xa1\xf1\x3b\x79\x66\xc3\xb1\x82\x7d\xa9\x0e\x44\xb8\x6e\x51\x6b"
- "\xb9\x31\xe0\x2c\x4d\x46\xfe\x88\xc2\xe5\x9d\xeb\x7c\x9b\x4f\x91"
- "\xda\x37\x7d\xc7\xe6\x95\x6b\xc6\xef\xfc\x82\xcb\xf1\x3e\x1b\xdb"
- "\xd0\xbe\x0e\x9e\x5b\xfc\x7c\x1f\xfb\xe1\xb1\xfd\xbc\x27\x93\xac"
- "\x9e\x4c\x4a\xed\x71\xbf\x33\xbd\xdf\xc7\xc2\xaa\xc6\x54\x1e\xd7"
- "\x38\x16\x31\x74\x4e\x0f\x8f\x91\x8c\x07\xf3\x29\x60\x3a\x78\x0f"
- "\x4e\x9d\x2b\x7a\xa7\xd2\x4f\x65\x81\x2b\xd7\xb9\xef\xc8\xd8\x36"
- "\xc2\xe4\x14\x13\xb7\x92\xdc\x9b\xd6\x7d\x0e\xcd\x90\xcb\x62\xd5"
- "\x9e\x77\x3f\x97\xfb\xe7\xab\xcf\x34\x42\x6e\x5c\x0d\xbd\x94\xaa"
- "\x79\x72\x4a\xd8\x8e\x69\xa9\x94\xfb\xca\x29\x28\xd7\xc4\xfb\xce"
- "\xf2\x5c\x9e\x8c\x73\xfd\x27\x6a\xb8\x40\xe6\x0e\x7a\x27\xc4\x6b"
- "\xed\x03\xb4\x7d\x77\x36\xef\xad\x88\xda\xd4\x3a\x4b\xa5\x69\x0b"
- "\xc3\xd0\x2e\x9e\x9d\x6c\x94\xc3\xd8\x3d\x94\xcb\x9d\xa4\x77\x6f"
- "\x97\xe5\x38\xaf\xfc\x3e\xa2\x75\x21\xc6\xb1\x4e\xce\x1f\xc6\xf3"
- "\x5e\xcd\x5a\x20\x20\x6f\x91\xd5\x91\x26\xbc\x9b\xa7\x79\x5c\x1e"
- "\xa4\x15\xca\x35\x5e\xcc\xcb\x65\xbc\x13\xeb\x82\x46\x9f\xff\xef"
- "\x5e\x89\x0f\xfb\xb1\x96\x43\x37\x49\xbb\xef\xdd\x97\xf6\x7e\x4e"
- "\x66\xc7\x52\xee\xc3\xf7\x6c\x3a\xdf\xec\x57\xf8\xbd\x77\x5d\x77"
- "\x6d\x56\x7b\xb7\xd5\xd9\x18\x34\xa5\xd0\x11\x1b\xfb\xdd\xbf\x5e"
- "\x70\xc4\xd6\x8b\xb9\xc3\xbb\x7e\xbf\x39\x35\x45\xd9\x1c\xaa\x1c"
- "\xef\xed\xc0\x1e\xed\x4a\xb6\x59\xe7\xf4\xb8\xdf\x23\xc3\xbf\x82"
- "\xbf\x29\xce\x7b\x3c\xa0\x6f\x3b\xd3\xcd\x4f\x07\xca\xe4\x3a\xff"
- "\xa6\x27\x3a\xd1\x9e\xab\xd8\x07\x8e\xe9\xcc\xe7\x1b\x2c\xb8\x17"
- "\xab\xc5\x64\x4b\x38\xdf\xd4\x20\xcf\x35\xca\xf3\xf2\x93\xf4\x98"
- "\x2d\x79\x7a\x0c\x97\x71\xfc\xac\xce\xdb\xbf\xd7\x7f\xfe\x9f\xe3"
- "\xd4\xb0\xef\x40\x44\xf7\xab\x93\xf1\x5b\xce\xab\xfd\x51\xf6\xab"
- "\xe3\xf5\x41\x3e\x1f\xc8\x7b\x98\x28\xd7\xd8\xef\xe7\x28\xcf\xc5"
- "\xbc\xd7\x64\xc4\x6d\xc1\xfd\xe1\x7e\x7f\x1d\xb4\xbd\xdb\xe3\xac"
- "\x0b\x5a\x5f\x2f\x08\x7a\xaa\xfc\x78\xd7\x0e\xb9\xbd\x5c\xdc\x40"
- "\xfe\xbe\x0b\x71\x2c\x0b\x2d\x33\xc7\xc3\xf1\x2c\x8e\x04\x49\x3f"
- "\x13\xdc\x74\xb7\x7e\x7e\x3c\xf9\x2c\xbd\x77\x61\x60\x2f\x31\xa2"
- "\xaf\x83\x35\x15\x2b\x3b\xac\x49\x9e\x8f\x13\xb5\x4e\xd7\x4f\xd6"
- "\x85\x4c\x4d\xeb\xfc\x26\x75\x4e\xa0\x69\x9e\x9f\x0e\x6d\x31\xfc"
- "\x51\x90\x2f\x6b\xb0\x58\x56\xc2\x33\xba\x44\xc1\xfc\x85\x5c\xc3"
- "\x18\x98\xd7\xfc\x42\xed\x93\x6d\x1a\x59\xac\xf1\x18\x98\xb9\xc8"
- "\x2b\x7d\x2b\x1c\xe7\x79\x3d\xec\x2a\x35\xc7\x52\x79\x74\xbf\xc8"
- "\x6b\x4e\xc7\x3e\x67\xf2\xb3\xa2\x59\x53\x87\xb1\xb6\xbe\xdd\xa4"
- "\x71\x6c\x63\xe1\x6c\x14\x41\x9f\x23\x48\xb0\xaf\x02\x3e\x8c\xa9"
- "\xa8\x43\x40\x3f\x0c\x45\x99\xeb\x98\xf6\x4a\x86\x7e\xb1\x4d\xe2"
- "\xe4\xbe\x4f\x38\xd9\xae\x0c\xb0\x6f\xc7\x79\x42\xbe\x0c\xe4\x9b"
- "\xd1\x5c\xd9\xc5\xfe\x29\x85\x1c\x43\xae\x43\xaf\x3b\x90\x31\xba"
- "\x64\x74\x2a\x15\xf7\xb8\x7f\x51\xe8\xa7\x4d\xb6\x2b\x97\xed\x5f"
- "\x14\x5e\xce\xc6\x50\x63\x5e\x3e\x0d\x36\x4f\xe1\x79\xe8\x04\xd4"
- "\x3f\x5b\x30\xfe\xbf\x9c\x11\x36\x85\xa8\xcf\x34\x54\x7c\xd3\x55"
- "\x41\x61\xf7\x50\x11\x59\x87\xfe\xea\xb6\xc1\x8e\x3d\x46\xad\xe1"
- "\x66\xe9\xfb\x01\x99\xb5\x54\x05\xc5\x79\x5f\xf8\xa0\xf4\x85\x55"
- "\x67\xc6\x7f\x39\xd5\x17\xfe\x88\x5a\x1d\x01\x62\xbd\x70\x92\x7e"
- "\x79\x2b\xe3\x35\xc1\xe1\xa2\xf1\x67\xf9\xfd\x2f\x3a\xd5\xf8\xf7"
- "\xcb\xe9\xfa\x35\x8b\x63\x0d\x46\xe3\xf4\xe0\xaa\xe5\x4f\x97\x2f"
- "\x7b\x61\xf9\xf8\x59\x4b\x56\x2f\x29\xb3\x3f\xa2\x5c\xe9\x62\xc6"
- "\xa5\x94\x81\x18\xca\xef\xcb\xb1\x82\x6d\x10\x8e\xa5\x7c\xb9\x38"
- "\xca\x46\x0c\x65\xe8\xb5\x31\xbc\x6e\xf7\x3f\x19\x47\xd9\xb0\x31"
- "\x38\x86\xf2\xc0\x1a\xf6\xfb\x6d\xfd\x32\xa0\x7d\xd2\xc3\xcf\x7c"
- "\x4e\x52\x73\xff\xb2\x80\xe5\x68\xaf\xf4\x3b\x7b\x7f\x66\x74\xdc"
- "\x1f\xf6\xb1\xe3\x75\x0f\xa4\x17\x1b\x67\x52\xc1\x8b\x18\x2b\xde"
- "\x77\x0c\x9c\x91\x79\x1f\xfa\xff\x17\x87\x95\xfc\xca\xbc\x5b\x8d"
- "\xbd\x5e\xfd\xdb\x55\x72\x6f\x5a\x73\xf7\x4c\x57\xeb\x2b\xef\xd7"
- "\xec\xd5\x86\xa6\xa8\xb5\xfd\xf7\x0f\x19\xe7\xaf\x94\x6c\x7e\xa2"
- "\xcb\xe6\xfb\x6d\x97\xdb\x8f\x1f\x90\x8d\x83\xa9\x03\x72\xfd\x37"
- "\xbd\xec\xc1\xd4\xaf\xda\xcb\xd7\xed\xdc\x6b\x4f\xd3\xbf\x8c\xe2"
- "\x35\x17\xdc\xdf\x88\x7b\x79\xee\x53\xf9\xa2\x7f\xf0\x99\x7e\x8f"
- "\x3a\x3e\x68\xd1\xef\xaf\xc7\xfd\x07\xfa\xfd\x48\xdc\xef\xd1\xef"
- "\x21\xb3\x1f\xbc\xa4\xdf\x67\xe1\xfe\x79\xfd\x1e\x3a\xfe\x83\xc7"
- "\xf4\xfb\x11\xb8\x9f\xaa\xdf\x5f\x87\xfb\xb1\xfa\x3d\x64\xf0\x83"
- "\x34\x7d\x5f\x34\x05\xb8\x7f\x79\xe5\x76\xf7\xc1\x66\xb5\xf7\xf6"
- "\x81\x19\xba\x52\x3f\xab\xd6\x9f\x66\x03\x4f\x97\x1a\xf4\x45\x3a"
- "\x9f\x35\x4f\x41\x7a\x9e\x9f\xde\xb2\x46\xa5\x1f\xd0\xf3\xcf\xc4"
- "\xf8\xd2\x11\x95\xde\xa8\xa7\x17\xc3\xb6\x9c\x14\x95\xbe\x43\x4f"
- "\xaf\x80\x5e\x2c\x8b\x4a\xdf\xa2\xa7\xc3\x16\xad\x9f\x1e\x95\x5e"
- "\xa9\xa7\xef\x37\xfc\x10\xf4\x74\x87\x9e\xee\x45\x7a\x30\x2a\xbd"
- "\x44\x4f\x87\xfe\x7f\xff\x44\x54\xba\xd4\x2b\xd5\xf2\xdc\x96\x45"
- "\x1c\xa9\x64\xd9\xfa\x80\xf7\x08\xa3\x71\x9e\xa5\xca\xfe\x4b\x16"
- "\xd2\x53\xa3\xd2\xf3\xf5\xf4\x71\x7e\xfa\x6c\x5f\x54\xfa\xa0\xb6"
- "\x6f\x52\x1d\x15\x0f\xb6\x36\xc9\xdf\xfa\x91\xfe\x8f\xd2\x66\xfc"
- "\xd5\x32\x3e\xd3\x65\xd9\x23\x4e\xda\xab\x84\x38\x49\xbf\x2a\xd0"
- "\xfd\xfe\xe6\xb1\x1f\x96\x3a\x1b\xf7\xab\xc9\xf2\xbc\x14\xc7\x31"
- "\xe4\xf3\x72\xeb\x38\xed\x5f\x64\xac\xbc\x89\x15\x2e\x15\xe3\x50"
- "\xf9\x95\x76\xc9\x39\xba\xbe\x7f\x89\x3c\xfc\x8d\x44\x62\x38\xbc"
- "\x8e\xe7\x2b\xef\x95\xbe\x8e\x3c\x47\xe2\x34\x9e\xab\xca\x33\x54"
- "\x51\x73\x25\xa5\xf7\x7f\xb5\x4c\xe3\x33\xee\x6e\x35\x9f\x67\x59"
- "\xe4\xfc\xec\x73\x13\x9d\xd7\x4f\xbf\x92\xf3\xdc\x64\x5b\xc6\xdb"
- "\x3d\xee\x5f\xcd\x1c\x38\xd7\xf3\x2f\x8d\x7a\xfa\x3e\xa4\x17\x47"
- "\xa5\x6f\x1d\x5c\xb7\x43\xdf\x59\x53\xfd\x7d\x17\x45\x30\x7c\x51"
- "\x84\xb6\xff\x07\xf0\x5e\x2a\xcf\xa8\xdc\x10\xf1\xa4\x06\xf4\x78"
- "\x11\x9f\x86\x57\x8b\x00\x74\x36\xc7\xe9\xbf\x7a\x4e\x30\x40\x73"
- "\x1c\x3d\x62\xdb\x53\xec\x3f\x77\x41\xc6\x4e\x72\x76\x71\x0c\x63"
- "\xf6\xc9\x0a\xf2\xbe\x4f\x6a\x2b\xc6\xb8\xbd\x4b\xf9\xfd\x5f\x69"
- "\x76\x29\x6c\xef\xd2\x08\xed\x05\xec\x3d\x4f\x19\xfe\x90\x1c\x03"
- "\x5e\xf7\x51\x04\x0e\x5c\x9f\x53\x7e\x6f\xe3\x90\x8c\xcd\xc1\xdf"
- "\x13\x13\x35\xbb\x5c\xe2\x77\x6c\xbf\x56\xf1\x77\xe4\xec\x18\xdb"
- "\xa7\xe0\xde\xab\x7e\x78\x87\xf4\xc1\xda\xa4\x64\xf9\x50\x85\xd2"
- "\x35\x69\xc5\x4a\x5f\x1c\xaa\x10\x6f\xf1\x19\x9d\x43\x7c\xfe\xa5"
- "\x02\xb6\x72\x42\xbf\xaa\x0d\x7b\xc8\xd4\x57\x0b\xdb\xe4\xec\x21"
- "\x93\xd2\x4f\x1f\x96\x6a\xa6\x94\x8d\xbc\x5e\x28\x63\xed\xd7\xe6"
- "\x34\x1e\x58\x1e\x32\xb5\xac\xeb\xe0\x53\xdb\xb6\x85\x21\xf6\xff"
- "\x3e\xf4\x79\x7a\x39\xc7\x6a\x74\xba\x60\x77\x9a\xde\xc7\xfb\x8f"
- "\x97\x1f\x32\x85\xa5\xbd\xf2\x61\xa9\x5c\x63\xf2\xe4\x94\xf3\x18"
- "\xe2\x6b\x8f\xb0\xcd\x9c\x0a\x9b\xb9\x04\xfa\x3f\x25\xb2\xa6\x34"
- "\x33\xbc\xb2\xf4\xea\x3d\x2b\x28\x35\xb2\x32\x37\xeb\xd5\x8b\x34"
- "\xd9\x18\x7f\x30\x37\xcd\x13\x3d\xb6\xe1\xd5\x18\x53\x78\xee\x9a"
- "\x9e\x64\x95\x7b\x69\x7c\xaf\x99\x1a\x0a\xf6\xae\xbe\xfc\x77\x43"
- "\x22\x98\xb3\x72\x2c\x5f\xc6\x25\x51\x5b\xb7\xbe\x81\x79\xb0\x7e"
- "\xa6\xb4\xea\x33\x1a\x01\x3b\xd7\x94\x7e\x41\x78\x4f\x97\x91\x89"
- "\xbf\xb5\x50\xb5\x44\xae\x0f\x0d\x69\x29\x0d\x93\xaf\xe2\x2f\x54"
- "\xb5\x82\xfb\xe8\xc3\x8f\xd8\x4e\x63\x7f\x48\xe4\xb7\x9e\xa6\x0f"
- "\x5b\x2c\x21\x8c\x19\x21\xd8\xce\xcf\xf2\x5c\xef\xc3\x4f\x83\x32"
- "\x96\xe8\xaf\xc7\xb0\x4f\xb8\x77\xc5\x03\x9c\x16\x71\x7e\x26\x7d"
- "\x1f\x0a\x95\x6c\x7d\xd8\xce\xcf\x4e\x3e\xe3\x9a\x79\x53\xfd\xbb"
- "\xbd\xa1\x21\x6a\x0d\xe2\xc3\x7f\xd7\xc7\x07\x87\x9a\x73\x7d\x78"
- "\xc9\x59\xbc\xfe\xb5\x51\x4f\x06\x9f\x75\xba\xd1\x57\x1f\xa6\x39"
- "\x41\xe1\x97\xfb\x94\x7c\xb6\xbf\xe2\x3e\xaf\xb8\xe8\x21\x75\x1e"
- "\xed\xd7\x7b\xb4\x9a\x0c\x52\x31\x00\x7f\x2d\x63\x74\xaa\x35\xcb"
- "\x0c\xab\x5a\xa3\xcd\xb0\xab\x35\xcb\x8c\xbc\x4d\x23\xd9\x07\xf9"
- "\xd7\xf5\xdd\x19\x19\xf9\xb8\x3a\xba\x33\x6f\x1e\xfc\x1b\x7a\x9e"
- "\xf4\x3c\xfb\x0d\x94\xc5\x6b\xe5\xec\x4f\xdc\xa0\xfc\x88\x51\xc7"
- "\x6f\xd8\xaf\x98\xdf\xdd\x78\xd2\x41\xc9\xbc\xbe\x88\x7a\xcf\x4c"
- "\xac\x27\x3b\x70\x4d\x13\x56\xab\x5f\xfa\x6e\x79\xac\x01\x5f\x97"
- "\xf0\xb2\xcf\xa0\xda\xd3\xf8\xcd\x01\x91\x61\xf5\xab\xfc\xbf\x99"
- "\xda\xda\x85\x36\x58\xad\x4d\xbe\xd0\x19\xdd\x26\xfc\x0d\x78\xdf"
- "\xda\x24\x3c\x56\xaf\x3a\x2b\xfe\x9b\x6d\x86\x5e\x55\x3c\xfa\x9b"
- "\x8d\x8a\x6e\xe9\x79\x8a\x6e\xbf\x39\xa0\x8f\x57\x37\xf2\x3d\xc6"
- "\xee\x3c\xb5\x07\xff\x9b\x0a\xc3\x46\xf6\xeb\x79\xb8\x0c\xee\xf5"
- "\x58\x38\xbf\xa9\x43\xdb\xf3\xf4\xf7\xf2\x5b\x61\x68\x1f\xc6\xac"
- "\x5f\x1f\xe7\x76\x0d\xa6\x5b\x25\x2d\x2a\x29\x19\x38\xcb\x98\x38"
- "\x6c\xa7\xf8\x82\xf7\x79\xd5\xf7\x00\x3f\xba\x4b\x9e\x99\x45\x3d"
- "\xe8\x1f\x13\xeb\x4d\x3e\xe3\xcb\xf0\x06\xf0\x3f\x7c\x9d\x81\x0b"
- "\xd7\xc7\xef\xd0\xd6\x26\xee\x4f\xd0\xca\xcb\x79\xb8\x5f\x4f\x39"
- "\x78\xed\xe2\x02\x68\xc6\x7e\x40\x1f\x4d\x67\x9a\x28\x9a\x7d\x64"
- "\x97\xf4\xe8\xef\x87\x8f\xae\x8d\xa5\x87\x7a\xd6\xac\xd0\x0d\x2b"
- "\xd8\x1f\xe4\xa3\xe9\x3a\xfd\xba\xf4\xfa\xbf\xd0\xe7\xea\x78\x77"
- "\xf8\x67\x51\x65\x73\xfa\xf3\xaa\x6f\x4f\x9a\x78\x6f\x95\xd7\xda"
- "\x15\xbf\x1e\x3e\x1e\x55\xee\x78\xd1\x17\x6c\x23\xa7\x36\xf1\xb7"
- "\x02\x99\xe6\x3d\xee\xc3\x9d\x03\xf4\x56\x70\x12\xd4\x71\x83\x51"
- "\x87\x9f\x0e\xef\x37\xf0\xc4\xbd\x3e\x06\x7f\x34\x6e\xa0\x4f\x0e"
- "\xcf\x32\xca\xb1\xff\x3e\xfa\x28\xc4\xe7\x05\x13\xea\x41\xde\xd3"
- "\xc9\x86\x0e\x0e\xdf\xe7\x95\xfc\x48\x1f\xed\x63\x5f\x57\xd0\xb5"
- "\x4d\xf1\xd0\x47\x5b\xd4\x58\xf8\x91\x8c\xdd\xc2\xfb\x25\x1c\x8b"
- "\x18\xf5\xd5\x03\xee\x21\x1d\xe7\x26\x1d\x07\xe0\xf3\xeb\xfd\xf1"
- "\xf3\xba\x07\x16\x97\xc8\x83\xb1\xe3\x57\x39\xe2\xe3\x54\xa6\x0c"
- "\x9c\x81\xfc\xa8\x2b\xea\x0c\xe9\x16\x45\xef\x8f\x27\xff\x1f\xf6"
- "\xbe\x07\x2e\xaa\x6a\xdb\x7f\xcf\x30\x10\x2a\xc9\x80\x40\x54\x68"
- "\x63\x62\x52\xd7\xca\x6e\xea\xb3\xd4\x7b\xa9\xd4\x67\x5d\xff\x60"
- "\x57\x8b\xcc\x3f\xf8\x87\x2e\x78\x51\x47\x44\x44\x44\x40\x24\x9e"
- "\xdd\x14\xd1\x90\x87\x86\x48\xf7\x5a\x8f\xba\xfe\xa1\x7b\xeb\x3d"
- "\xec\xa9\x8d\x57\xec\xa1\x02\x83\x85\x85\x86\x3a\x22\x1a\x12\xda"
- "\x24\xa3\x0c\x30\x73\xce\x6f\xad\xbd\xcf\x99\x33\x67\x98\x01\xc6"
- "\x34\xbb\xbf\xf7\xf8\x7c\xe6\x73\xd8\xe7\xec\xb3\xcf\x3e\x7b\xad"
- "\xfd\xdd\x6b\xad\xb3\xf6\x5a\xa0\xa7\x7e\x92\xcd\xf4\xd6\xd2\x6c"
- "\xa0\x59\xda\x0d\xf2\x00\xe6\xd8\x48\xd5\xf2\x4d\x55\x5a\xd0\xa5"
- "\xd5\xfd\x0f\x00\x5e\x60\xde\xa9\xde\xe8\x4b\x81\x78\x83\xbe\x9a"
- "\xbc\x1f\x9c\xdf\xdc\x5f\x27\xed\x53\xd3\x35\x80\x6e\x5b\xbc\x11"
- "\x74\xd9\xb4\xab\xe4\x01\xe6\x1b\x71\x68\x05\xda\x74\xf8\xb4\xc8"
- "\xed\x5c\x4e\xff\x32\xdc\x03\x59\x05\x1a\x21\x9f\x16\xb3\x9d\xdb"
- "\xdc\xbf\x0c\xda\xad\x49\x5b\x4c\xfc\x71\x7d\x43\xdb\x10\xe3\x19"
- "\x5d\x19\xb4\x8b\x7b\x5b\x8b\x38\x3e\x52\xc1\xab\x07\x04\x73\xea"
- "\x41\x51\x1b\x39\x42\x7d\xbf\x81\xcf\x94\xf5\xe4\xd0\x51\xde\x6f"
- "\x40\x30\xe6\xfe\x43\x3b\x8f\xde\x0c\xfd\xdc\x3c\x20\x18\xae\xf5"
- "\x85\x6b\x3f\xc2\x91\xc3\x58\x65\x18\x1f\x1b\xda\x0f\xc6\xf6\xf9"
- "\x9c\x01\xc1\xac\xef\x46\x5a\xb7\x9e\x7c\x3e\x18\xeb\x88\x31\xd0"
- "\xb8\xb4\x48\x0f\xbc\x8e\x7b\x6a\xad\x70\x9f\x1e\x66\x28\xbb\xa7"
- "\xd6\x76\x8f\x20\x3f\xc3\x5c\xd6\x1d\xe4\xb7\x0c\xc1\x18\x6a\xa5"
- "\xe8\x6b\xca\x64\x59\x5d\xa9\x30\xd7\x41\x3e\xd6\xed\x17\xfe\xf7"
- "\xb1\xd5\x4d\x8b\x24\xa9\x6d\x24\x98\x7e\x2f\x5d\xe9\x01\xd8\xab"
- "\x53\xc3\x38\x10\xbb\x36\x2f\x61\x7b\x1b\x30\xb6\x5a\x34\xf1\x01"
- "\x5c\xee\x03\xfd\xc6\x1c\x13\x17\xd0\x06\x2b\x8c\x4d\x03\xd0\xa9"
- "\x64\x13\x8b\x9f\xf7\xc9\x46\xe0\xfd\xd4\x35\x20\x0f\xac\x21\x3e"
- "\x6b\xac\x24\x04\xdf\x13\xe8\xd6\x88\xfe\xd2\xa8\xbb\xe1\xd8\x30"
- "\x1a\x0e\x18\x0e\xef\x32\x66\x4d\x0c\xdf\xb0\xa6\x99\x6f\xac\x8c"
- "\xa9\x25\xb0\xce\xf8\x57\x69\xab\x31\xd6\xf3\x05\x7c\x57\xb4\x3d"
- "\xc2\x98\x0e\x37\xe0\x33\x36\x0f\x18\x83\x7b\x60\xa8\x9d\x40\x79"
- "\xf0\x80\xb8\x5f\xa8\x90\xee\x29\xd2\x0d\xb7\xd9\xbb\x12\xf9\x32"
- "\xa1\x2f\xe5\x1c\xfe\x9f\x48\xf7\xf2\xf5\x46\xfd\x07\x6d\x1a\x73"
- "\x57\x15\xd9\xf6\x5e\x30\xdb\x80\x4e\x6b\x17\xc3\x8a\xde\x8b\x36"
- "\x02\xbc\x77\xaa\x85\xbf\xb1\x49\xa8\x8b\xf7\x4e\x5d\x35\x97\xc7"
- "\x7b\xe1\x9e\x5d\xb6\x7b\x64\x7b\x77\x3e\x67\x72\x05\x8c\x2d\xfe"
- "\x6f\x84\xb1\x14\x7c\xa3\x34\xec\xbb\xb6\xae\x4e\xfc\x96\x6c\x20"
- "\x87\x72\x91\x9f\x9c\xc7\x67\x3e\xac\x92\xc7\x13\x3a\x5c\x83\xb1"
- "\x8e\xe0\x7c\x88\x18\xf7\x07\xfe\x0f\x83\xb6\xd8\xde\x26\xbb\x78"
- "\x5e\xd9\x76\xb1\x01\xd3\x8c\xfc\x45\xe4\x13\xc0\x15\x8f\x26\x72"
- "\x18\x63\x33\x44\xb1\xfd\x4f\x87\x8f\x62\x3f\xeb\xc9\xe1\x5c\x28"
- "\xfb\xb2\xb8\x03\x87\xdf\x14\xf0\x23\x62\xaa\xd5\xe2\x6b\x80\x67"
- "\xe2\x5e\x1e\xbb\x72\x0a\xe0\x89\x1a\xea\x7d\xca\x62\xe7\xd1\x2f"
- "\x8a\x0a\x87\xeb\xe9\x0e\xe5\x70\x87\xb2\xc6\x04\xf3\xc6\xd5\x37"
- "\xf3\x8d\x0f\x50\x7b\x61\x42\xdf\xb5\x44\x9b\x76\x85\x78\x00\xaf"
- "\x5c\xc2\xbe\x55\x35\x36\xe3\x3b\xf9\xf2\x19\xc3\x88\xbe\xd1\xc2"
- "\x64\x4b\x58\xd3\xeb\x43\xa1\xce\x15\x12\x84\xfe\xdc\x98\x67\x02"
- "\xea\x37\xb1\xb8\xd0\x47\x66\xcf\x5a\xd1\x9b\x70\x7f\x88\xec\xc3"
- "\x2b\x23\x22\xf1\x9b\xdd\x9e\x76\x83\x27\x7e\xbf\x4a\xdd\x06\x3c"
- "\x69\x25\x41\xc0\x63\x0d\x98\xd3\x0b\x73\xae\xff\xa5\xbd\xd1\x53"
- "\x6f\x39\x43\xb4\x8b\x88\xb2\x89\x1c\x89\x50\xa5\x10\xd5\xa6\xcb"
- "\x44\x0d\x74\xb5\x1c\xb1\x8c\x22\x62\xdc\x80\x02\x7f\xb6\xe7\xb9"
- "\x00\xf0\x75\x79\x30\x6f\x6e\xcd\xf8\xc7\x6e\x03\x79\x4f\x27\xea"
- "\xd8\x1b\x58\x2e\x09\x15\x3c\xff\x7e\xa5\x10\x23\x81\x8d\xed\x3f"
- "\xae\xb0\xfd\x53\x01\x23\xe1\x1e\x83\x24\x7f\x1f\x11\xfc\x08\x07"
- "\x65\x32\xec\x3b\x12\x77\x04\xb4\xa5\x4c\xe6\x7b\x10\xd0\x9a\x71"
- "\xc4\xc7\xe6\x7b\x40\xed\x56\x47\xe2\x80\x86\x99\x4c\x36\x1f\x94"
- "\x39\xd7\xea\x2d\xcc\x41\x3c\xef\x53\x82\xf7\xc2\x7d\xbe\x26\x6a"
- "\x63\x3a\x32\x51\xe2\xb5\x23\x6a\xc4\x7c\x78\x27\x68\xef\x1f\x99"
- "\xf8\x5e\x38\x26\x50\x0f\xf8\xec\x1f\xeb\x8f\xec\x72\x11\x43\x55"
- "\x7d\x6f\x94\x85\xda\x40\xd2\x92\x80\x9f\xae\x02\x0d\xfa\x61\x9c"
- "\x24\x3d\x3c\xa7\xb2\xb0\x9d\x54\x06\xb7\x90\x2a\xf8\x1f\x7d\x8c"
- "\x75\x8b\x2e\x92\x06\x8d\xf3\xf5\x06\xd6\x2c\x03\xf4\xd9\x88\x6d"
- "\x21\x16\xa0\x5f\x96\x1e\x56\xb0\x2a\x23\xb4\xd5\x40\x68\x1b\x95"
- "\x5c\x23\xa9\x4c\x42\x3d\x6b\x5b\x7a\x55\xe1\x19\x52\x15\xfc\x15"
- "\x7d\x0e\xca\x84\xba\xf8\x96\x2e\xda\xbe\x17\xee\xb9\x57\x2d\xb4"
- "\xdd\x0c\x6d\x07\xb8\x6e\x3b\xb5\xda\xbd\xb6\xdd\xe9\x77\xaa\xce"
- "\x9d\xb6\x61\x9d\x59\xa8\x0f\x66\xfb\xb5\x52\xef\x27\xf7\x5a\x6f"
- "\x62\x8c\xcc\x87\x78\xe6\xe7\x7a\xf4\x39\xba\xa7\x2b\x83\xfa\x11"
- "\x47\xd1\xbd\x5d\xd7\x08\xf5\x55\x64\xfb\xb9\x2e\x11\xf4\x73\x68"
- "\xcd\x38\x3a\x54\xd2\x95\x6c\xdf\x9f\x40\x56\x3d\x1a\xc1\xfc\x19"
- "\xfb\x47\x31\xbe\x3a\xea\x89\x6d\x39\xef\xc7\x80\x0d\xcc\x2f\xf6"
- "\xe8\x5b\xa2\xfd\xa5\xc5\x6f\xc0\x06\xa1\x2d\x8d\xa3\x5d\x4f\x4c"
- "\xea\x19\x9d\x94\x20\xe6\x07\x4d\x10\xb6\x95\xbe\x1c\xbd\x20\x3a"
- "\x36\x31\x7a\xa1\x66\xfa\x8a\xf8\x25\x8f\x2f\x7d\xe3\x0d\xcd\xe4"
- "\xe8\xe5\xcb\xe7\xfd\x21\xba\x37\x99\x1e\x3f\x6f\xc9\xf2\x58\xb4"
- "\xbd\x69\x34\xe3\x9e\x9e\x1b\xb3\x34\xe1\xf1\xdf\x8c\x1b\xe6\x60"
- "\x7b\xc3\x3d\x88\x75\x28\x83\xc3\xda\x11\x94\x6a\x25\x7e\x18\xf3"
- "\xc6\x77\x15\xaf\x5b\x0d\xfa\x1f\xf0\x5f\x13\xae\x53\xb8\x36\xa0"
- "\x6e\x80\xf1\xf6\x00\xbf\x2b\xde\xcd\xe3\xab\x2f\x93\x5a\x94\x2b"
- "\x6b\x77\xb2\xd8\x71\x75\xa0\x93\x1b\x59\xce\xba\x6f\xce\x62\x5c"
- "\xb8\xb7\xe1\x9c\xd1\x6f\x50\xe6\xa6\x73\x44\x05\xeb\x1a\xe8\x25"
- "\x5f\x14\xf0\xca\x7b\xf8\x0d\x41\x7c\x19\x7f\x31\x98\x08\xf1\xb0"
- "\x95\x7a\x83\x19\xbf\xd3\x7b\x4f\xb5\xa4\xf1\x88\xa7\x6c\x6e\x7d"
- "\xb1\x83\x8d\x8b\x1f\x61\xfe\xc2\xdf\x1c\x44\x1d\x66\x1d\xcd\x29"
- "\xf8\x05\xcc\xff\xfd\x09\x12\x4e\xeb\xcb\x05\xd9\xb1\x16\xc6\x7d"
- "\x65\x3d\x94\x59\x4c\x8e\x2f\x6a\xe5\x3e\x18\xe5\xb0\x2e\x7f\xd5"
- "\xcc\x7e\x78\x4f\x8d\x0f\xfb\xe1\xff\xf6\xbf\x6f\x8a\xd8\xcf\xf1"
- "\xfc\x4f\xfd\x89\xcf\xbf\xd5\xfb\xab\xd3\xbb\xfe\xf5\xe4\xf9\x78"
- "\xbc\x9b\xef\xff\x53\xee\xaf\x5e\xdf\xd5\x0f\xf9\x0d\x78\xab\xee"
- "\xed\x73\xc4\x1b\xf8\x33\x77\xe3\x7c\xe0\xe9\xb3\x24\x38\xc5\xc2"
- "\x37\xa4\xcd\x26\x21\xa9\x57\x08\xe6\x74\x6b\x4c\x48\xe2\x1b\x52"
- "\x6f\xa2\x4c\x5a\x8d\x39\x4e\x4a\xb3\xeb\x89\xcf\xc6\x7a\xa2\xae"
- "\x4a\xc0\x7c\xaf\x18\x17\x0b\x9e\x86\x23\x04\xe5\x8a\x44\x33\x39"
- "\x61\xfc\x11\xfd\x96\x74\x55\x51\x80\x3b\x75\x84\x20\xff\xfa\x44"
- "\x91\x80\x82\x20\xfe\x00\x9f\x11\x77\x80\x57\xc6\xed\x86\x73\x35"
- "\xfb\xb8\x70\xcf\x7d\xc9\xe5\x9e\x9a\xf9\xb8\xc6\x1f\x9b\x2d\xf0"
- "\xe6\x31\xb6\x57\x48\x4f\x73\x90\xc1\x3c\xa9\x61\x76\xf5\xea\xf1"
- "\x6c\x3d\xaf\x0e\x14\xec\x4d\xf0\xbf\x9e\xca\x8a\xf0\x1e\xa5\x98"
- "\x03\x13\xdb\xdc\xcb\x95\xd2\x1c\x98\xfb\x92\xc3\x3d\x53\xe6\x11"
- "\x65\x95\x01\x56\x4a\xc0\x41\x5c\xc1\x60\xde\xed\x86\x79\x56\xb2"
- "\x23\x88\xcf\x81\xfe\x6d\x28\x0c\xe2\xd7\x43\x9f\x8a\x5b\x33\x8e"
- "\x55\xc0\xda\xa3\x13\xbe\xbb\xe8\x60\x5e\xec\xde\x08\x75\xa6\xae"
- "\x20\x0f\x6d\x84\x7a\xd9\x50\x0f\xe5\x64\xd6\xbf\xca\xcd\x30\x06"
- "\x9f\xc0\x33\xab\x35\x73\xb0\x7c\x82\xc6\x00\xc2\x67\xc3\x7b\x68"
- "\xea\xc9\x89\x10\x58\xdb\x54\xf8\x0c\xf1\xb9\xad\x19\xc7\x01\xff"
- "\xca\x92\x84\xef\xbe\x39\xac\x9d\xe3\x91\x6c\xbe\xf6\xc7\x3d\xc7"
- "\x42\x8e\xd2\xfe\x0d\x1b\x93\x61\x4d\x6f\xa7\xf1\x22\x73\xd1\xde"
- "\x82\x32\x06\x95\x2b\xac\xc4\x97\xd9\x07\x40\xb6\x88\x01\x1c\x00"
- "\x79\x82\xfa\x38\x83\x2c\x01\x7d\xc9\xc5\x5c\x79\x78\x1d\xf4\xb6"
- "\x4f\x60\x5d\x2e\x41\x39\x60\xce\x8d\x97\x08\xda\xd8\x31\xcf\xe5"
- "\xf2\x59\xbc\x99\xe5\x20\x39\x5e\x2a\xca\x02\x88\x41\xb8\xfe\x83"
- "\x2c\xac\xea\x00\x1a\x02\x0f\x94\x83\x6c\xe1\xd7\x44\x8e\x9b\x84"
- "\xb1\x2f\xa7\x6b\x7e\x22\x8d\x6f\xec\xc1\x30\xfa\x04\xfa\xc2\xfb"
- "\xc0\x33\xca\x0d\xa4\x96\xda\xc2\x19\xc6\x9c\x50\x8b\xeb\x38\xea"
- "\xbc\x06\x68\x83\x07\x2c\x13\xae\xc1\xfb\x1f\x6e\x10\x9f\x09\xd7"
- "\x74\xc2\x98\x55\xc0\x98\x61\x9b\x54\xf7\x07\x99\x2b\x53\x18\x9b"
- "\x0a\x94\x2b\x84\x7b\x63\xc4\x76\x51\x2f\xe7\x40\xae\xc0\xf1\xc2"
- "\x71\x82\x76\x2a\x04\x1c\xab\x61\xf2\x4b\xe5\x2a\xc2\xbe\xb7\xe7"
- "\x00\xad\x33\xa5\xf1\x3f\xb1\xdb\x7e\xfc\xe1\x7e\xe1\x39\x95\x83"
- "\xed\x68\x07\xba\x51\x85\x05\xed\xa4\xd0\xc7\x03\xcc\xc6\x73\xe2"
- "\x12\xc6\x15\xc3\x38\xc6\x30\xc6\x07\x36\x60\xcc\x5c\xc0\xe6\x75"
- "\xe7\x00\x73\xe7\xa3\xfc\x54\x21\xc4\xc5\xaa\xc8\x44\x1e\x86\x32"
- "\xb5\xc3\x37\x40\xbf\xb0\x3d\x28\xcf\x80\x23\xc8\xb1\x15\x93\xed"
- "\x73\xd2\x4a\xf9\x68\x2b\xc6\x49\xfb\x0c\x4e\x68\x99\xfe\x7c\x42"
- "\x8b\x36\x30\x5a\xbf\x23\x06\xfb\x56\x87\xf3\x52\x7c\x57\xcc\x4d"
- "\x0b\xe7\x51\xf6\xaf\x43\xba\x89\xe7\x31\xde\x2e\xd0\xc9\x07\x9e"
- "\x75\x56\xe8\x13\x96\xbd\xa1\x4c\x73\x0e\x60\x9e\xda\x4d\x78\x4f"
- "\xaa\x74\x0f\xce\x1b\xe0\x61\x5f\xa8\x73\x0a\x8e\xbc\x58\x97\xe5"
- "\xaf\xad\x98\xf5\x4e\x3b\xda\xc0\x2a\x12\xc4\xfc\xb5\x98\xbb\x16"
- "\x31\x63\xe3\x1c\xd9\xd8\xe3\xd8\xec\x06\x5a\x51\xbe\x3b\x62\x29"
- "\x85\xf1\xae\x04\xf9\xff\x3f\x85\x18\x77\x15\xb3\x84\xfe\xe9\x58"
- "\x3e\x86\xa3\xb9\x85\x5b\xc4\x18\x0b\x95\xd2\xf7\x7f\x9b\x6c\x59"
- "\x31\x0b\x79\x12\xda\xaa\x40\xfa\xa3\x9c\x08\xf5\xe2\x6c\xbc\x45"
- "\xf7\xf1\x56\x34\xa3\x7c\x29\xf4\x1f\xf9\xa5\x52\x18\xbb\x5c\xfb"
- "\x79\x67\x3f\xcf\xa1\x0d\xd0\xff\x8f\xd8\x78\x40\x9c\xd7\x8c\x0f"
- "\xaa\x2e\x09\x32\x45\x12\xc6\xbb\x85\x76\x75\x28\x83\xb3\x75\xb5"
- "\xaa\xf4\x48\x9d\x05\x6d\xe8\x35\x50\x86\xf9\x5d\x95\xdb\xe2\x3f"
- "\x44\x9d\x49\x71\xa3\x0a\xc6\xe1\x09\x1a\x03\x02\xc7\x45\x9c\xaf"
- "\x9b\xe6\xa0\xee\x37\x8c\xcd\xd9\xa4\x06\x52\x65\x6e\x26\x82\x0f"
- "\x3f\xcc\xd9\x4b\xf8\xed\xb4\x09\x78\xc8\x1b\xe7\x2f\xd0\x77\x37"
- "\xc6\x66\x86\x71\xac\xce\xcc\xa3\xf3\xd6\x07\xe7\x6d\x07\xc6\x86"
- "\x80\xe7\x94\x45\x85\x43\xaf\x75\x74\x1e\x63\xcc\x8f\x77\x61\xec"
- "\x30\x57\x2c\x3c\x3b\x5d\xf4\x3d\x46\x1e\xc1\x18\x1f\x02\x9f\x94"
- "\xe3\x5c\x16\xc6\x4e\x05\xf5\x8a\xc5\xb9\x67\x47\x7f\x5a\xc7\x61"
- "\xbe\xf9\xb2\xf9\x56\x55\x2b\x8e\xb5\x85\xce\xe3\x8a\x04\x0b\xcc"
- "\x63\xfb\x31\xc5\xf1\xc4\x71\x6d\xcd\xd0\x43\x5b\x65\x21\xe2\x98"
- "\x4a\xe3\xa9\x5f\x21\xd0\xbc\x9a\xd9\x98\xf4\xa3\x04\xfb\x93\x6d"
- "\x0c\x05\xfe\xc3\x1c\x9f\xa5\xeb\xf0\xdd\x61\x6d\xc0\xe7\x23\x8f"
- "\xbc\x2b\x60\x56\x99\x11\x79\x44\x0f\xf3\x7f\x5a\xa3\x84\x1d\x15"
- "\x49\x54\x67\x01\x3a\x31\xfa\xe8\xdf\xa3\x71\x34\x9c\x60\x87\x81"
- "\x54\x46\x49\xf8\xa4\x2f\x11\xc7\x41\xe4\x49\x71\xde\x43\x1b\x56"
- "\x39\xfe\xe8\x2f\x40\x1b\xfe\x88\x6f\x92\x0c\xa5\x37\xca\xf1\x4d"
- "\x5f\x8b\xf8\x86\x7c\xad\x4d\x44\x1b\x1b\x5b\xaf\x0c\xe4\x58\xba"
- "\x1c\x93\x8e\xad\x60\xbe\x01\x4c\xe6\x42\xde\xd2\xce\x61\xf5\x71"
- "\x0d\x83\xfa\x54\x17\x17\xd6\x3c\xf4\x6b\xc4\x73\x71\xc2\x78\xd5"
- "\x41\xfd\x32\xdc\x0f\x89\x31\x10\xfa\xd4\x31\x5d\x0f\x70\xfa\x00"
- "\xc6\xba\x86\x7a\x43\xab\x40\xce\xef\xc8\x62\xd8\x2d\x62\x05\xbf"
- "\x20\xb2\xcf\xca\x46\xd2\x4b\xfb\x1b\xfe\xe2\x65\x72\x12\xe3\x71"
- "\x9b\x31\xde\x22\xb4\xad\xb9\x4c\xbe\x3a\x05\xcf\x0d\x10\x8e\xc1"
- "\x70\x3c\x08\xc7\xfb\xe1\xf8\x3e\x1c\x1f\x84\xe3\x46\xa8\xcf\x09"
- "\xf5\x87\x41\x79\x05\x9c\x7f\x5a\x38\x42\x1f\x4f\xa2\xff\x7d\x84"
- "\x20\x3b\xe2\xf9\x17\xb1\x0c\xc7\x67\x04\x9a\x57\x30\x9a\x9f\x7c"
- "\x0a\xda\x49\x82\xfe\xd7\xea\xeb\x68\x5b\xda\xcb\xe4\xcb\x36\x6c"
- "\x1b\xf7\x27\xc3\xff\x7b\xec\x64\x50\x68\xe7\xe4\x69\x38\x0e\x87"
- "\xe3\x0e\x38\x26\xc0\x71\x99\x30\x06\xd5\x88\x0d\x0b\x93\xe8\x98"
- "\x6f\xd0\x30\x79\x37\x42\x9c\xf3\xb8\x0e\x4b\xd8\x71\xbc\x62\xe1"
- "\x2c\x46\x6f\x03\xa9\xa2\x7c\x00\x75\x9f\xc3\xba\x70\x7c\x41\x38"
- "\x86\x0b\xc7\xf1\xc2\xf1\x5f\x85\xe3\x38\xe1\x08\xfa\xe8\xc9\x04"
- "\x41\xc6\x80\x71\x39\x99\x40\xfd\x9e\x72\xfa\x17\xb0\x67\x7c\x99"
- "\x8b\x3a\x32\xe0\xf8\x08\x68\xdf\xa3\x35\xe3\x4b\x6f\xd1\x3e\x8a"
- "\x36\x9f\x8e\x8c\xa3\xfb\xde\xa5\xdf\xb5\xbf\xd4\xd8\x61\xdb\x74"
- "\x1f\x45\x38\x01\x19\x28\xb0\x40\xc9\xe7\x08\xed\x24\x29\x85\xef"
- "\xc2\x42\x1c\x7d\x0f\x8c\x2d\x47\xf5\x21\xbf\xbc\x46\x9c\xab\xd4"
- "\x76\x8c\x71\xd0\xfc\x06\x45\xc2\x6f\x21\xe8\x06\x31\x22\x7e\xa3"
- "\xde\x23\xc4\xac\x2c\x83\x67\x6d\x90\x74\xf5\x2f\xc7\xb0\x6f\x68"
- "\xf7\x85\xc3\xf9\x5d\xd2\xf9\x93\x66\xec\x33\x8c\x67\x2d\xbc\xcf"
- "\xf0\x7a\xf2\x25\xc6\xc3\xff\x75\x03\x7b\xe7\x61\xe2\x3b\x0b\xf4"
- "\xd0\x8a\xe3\xdb\x40\x4e\xa6\x00\x16\xc6\x23\x0f\xd7\xdb\x70\xf6"
- "\x24\xb5\xeb\x0a\x3c\x02\xb4\x3c\x39\x02\x69\x6a\x37\x07\xed\x31"
- "\x28\xa0\x35\xe3\xab\xa1\x72\x4c\x39\x31\x14\x31\x05\x79\x03\xf0"
- "\x1b\x69\xed\xe3\x30\xff\x30\x2f\x9d\x3f\x9b\x77\x5f\xc5\xc8\xef"
- "\xd5\xd7\x5a\xd8\xbc\xab\x05\x3e\x03\xfe\xac\x6e\x46\xfa\x18\xc8"
- "\x57\x13\x85\x39\x5d\x0b\x73\x7a\x04\x9c\xaf\x61\x7d\x65\xe7\x85"
- "\x67\x01\x9f\x55\xe3\x7b\x3f\x28\x9e\x17\xde\x17\xdb\xc1\x78\xea"
- "\xf7\x8b\xe7\x85\xf6\x81\x1f\xab\x0f\xe0\x3c\x11\xcf\x0b\xef\x04"
- "\x72\x54\x0d\x11\xf1\x64\x03\xe3\xb7\xf5\xe2\x7d\x48\x37\x8c\x37"
- "\xc5\x6c\xfc\x5f\xe1\x37\xd4\x22\x5c\x1f\xd6\xcd\x21\x3e\x2b\xf3"
- "\xc9\xbd\x6c\x5e\x7e\xd5\x2c\xc7\xc8\xaf\x2b\xf9\x0c\x5f\x0b\xaf"
- "\x1e\x14\x51\x69\x19\x2e\xca\xab\x05\xf0\x9c\x18\x31\x57\xb2\x14"
- "\x93\xbf\x66\x47\x65\x91\x6d\x7c\xb1\x2f\x1b\xc4\xbe\xd8\xad\xcf"
- "\x94\x06\xd8\x37\x6c\x6b\x1d\xc8\xeb\x26\xc0\x05\x86\xdb\x35\x07"
- "\xc4\x1c\xf2\xd9\xc2\xba\x85\x79\xcb\xb3\x13\x59\x1e\x73\x5c\x1b"
- "\xd1\xc7\x87\x43\x3b\x56\x92\x95\x54\x69\x41\x97\x4f\xba\x44\xe6"
- "\xae\xea\x8d\x31\x55\x22\xa1\xaf\x1f\x43\xdf\x76\x59\xd1\xf6\xbf"
- "\x04\xf5\xd4\xaf\xa3\xad\x89\xbc\x59\x18\x33\x98\x47\x5f\xbf\x28"
- "\x8c\x2d\xe2\x17\x8d\xc9\xb7\x2e\x95\xe5\xd7\x41\x5b\x0e\xce\x8f"
- "\x77\x70\x1d\x0b\xe6\xcd\x65\x05\x38\x57\x4e\x4d\x12\x65\x52\xe8"
- "\x6f\x11\x93\x09\xab\x3e\xa4\x31\x87\x72\x06\x45\x30\x5b\xe0\xa9"
- "\xd3\xec\xdd\x4f\xe9\xd8\x77\x6e\x1a\x4f\x12\xcb\xbb\x3d\x82\x83"
- "\x3e\x60\x7e\x59\x47\x8f\x33\x9f\x92\x53\xb6\xfc\x1f\x76\xb2\x62"
- "\x19\x8b\x07\x75\xaa\x54\x9a\x13\xa7\xd6\xe3\x7d\x70\xff\x7e\x38"
- "\x5f\x2d\x9d\xaf\x2a\x16\xec\x5d\xd3\xfb\xae\x0d\x47\xdf\xb2\x40"
- "\x8c\x4b\xcd\x9e\xf7\xf5\x30\xfa\x7c\x6a\xf3\x80\xb9\x29\xcc\x5f"
- "\x1c\x67\x5c\xb3\xe9\x1c\x86\xf9\x8b\xf3\xb8\x63\xf3\xa0\x48\xf8"
- "\xb1\x79\xcb\xd6\xe6\x32\x3a\x6f\xe9\x9c\xfd\x3a\xdc\xae\x1f\x66"
- "\x6a\xf7\x42\x7a\xae\x0e\xf6\x81\x6b\xb3\x60\x5d\xad\x11\xae\x51"
- "\xdf\x3b\x8c\x1b\x62\xb9\xc9\x1b\xf1\xdb\x36\x7e\xeb\xc4\xbd\x57"
- "\xbe\xc0\xdd\x18\xeb\x43\xfc\x56\x3d\xb9\x39\x8d\xb7\xe2\x77\xa7"
- "\x9b\xbc\x29\xc7\x16\x17\xff\xeb\x62\x29\x6e\xcf\x29\x6f\xe1\xbd"
- "\x22\xe0\x59\x05\xcc\x17\xac\xa6\x8d\xc9\x54\x35\x66\xe4\x53\x3d"
- "\xf0\x1e\x1c\xf3\x59\x6e\xdb\xaf\x1b\x44\xde\x83\x79\xb9\xf0\x32"
- "\xf9\x66\x45\x6e\x10\x9f\x0f\x34\xcd\x87\xb9\x14\x07\xe5\x79\x70"
- "\x5c\xc8\x8e\x0a\x35\x1e\x85\x39\x92\xdf\x9a\xf1\x8d\x46\xcc\xe9"
- "\x8d\x63\x63\xf2\x4b\x35\x22\x9f\x65\xc3\x38\x20\xaf\xd1\xef\xc8"
- "\xd0\x6f\xe4\x2f\xe4\x33\xe4\x31\xdf\xb5\x2f\x51\x3e\xa3\x71\x05"
- "\xe0\x3c\xf6\x17\xf9\x0c\xda\x8a\x13\x63\xe2\x1a\xc8\x37\x6a\xf6"
- "\x3d\xe7\x9b\x74\xd1\x97\x16\xbf\x25\x25\x0c\x24\x81\xd0\xae\xa6"
- "\x4c\x43\xe3\x4e\x9e\xd7\x5b\xc6\x13\xac\x8b\xdf\xe1\x18\x4e\xde"
- "\xf7\x0e\xdc\xf3\x89\x34\xe6\x27\x86\xd2\x6f\x46\xb3\xa8\x2d\xb2"
- "\x1f\x5c\xab\xb6\xd7\x33\x0c\xe4\x8b\x02\xd4\x35\xd0\xb7\x6f\x50"
- "\x00\xd1\x00\xdf\x02\x8e\x7d\x63\x12\xe5\xda\x27\x03\xf0\x7b\xfe"
- "\x17\x13\xa1\x7f\x75\x2c\x4f\xf9\x17\xc3\x41\x97\x2c\x77\x61\x33"
- "\x1e\x8e\xb6\x1e\x21\x97\x4d\x1d\xda\xb1\x30\xf6\xff\x65\xf2\xed"
- "\x8a\x4a\x8c\xf1\xb1\xb4\x73\x4c\xe4\xd4\x24\xfe\x06\xc6\x45\xd6"
- "\xc4\x93\x7e\xf5\xe4\xdb\x48\xb4\x1b\xa5\xfd\x88\x36\x9a\xda\x14"
- "\xb9\x8d\xa6\xb6\x42\xf8\x19\x08\x39\x3d\xce\xee\x57\x23\x1c\x23"
- "\xba\xf9\x35\x0b\x75\xcd\x84\x9c\x51\x09\x63\xf5\x55\x6b\x46\xad"
- "\xcd\xfe\x8b\x7c\x89\x73\x1b\xfd\x38\xd0\xe6\xa4\xb0\x10\x8c\x29"
- "\x02\x74\x82\x7e\xaf\x7b\xec\x65\x5d\x32\xf2\xd1\x69\x9a\xeb\x1b"
- "\xe3\xf5\xba\xe7\x4b\x74\x9a\xd2\x93\xc5\xce\xac\xad\x81\x67\x5f"
- "\xdc\x74\x8d\xa8\xb4\xf1\xa4\x3f\xda\xbf\x7d\xad\xbc\x0e\x75\x5c"
- "\xe4\x89\x9d\x34\x87\xcc\xe9\x53\x09\x6b\x88\x12\xae\x3f\x04\xff"
- "\x97\x89\x72\x12\xdc\xa3\xf6\x30\x93\x00\x94\x8f\x5e\x58\x43\x1e"
- "\x6a\xcd\x38\x5d\x24\xd2\x0a\x65\x08\xb4\xc3\x09\xb6\x04\xe8\x6b"
- "\xed\x05\xbc\x0f\x63\xba\x1b\xe8\xb8\x51\x1c\xc6\x36\x7c\xa0\x3f"
- "\x1b\x3c\x4c\x44\xcd\xd6\x9e\xd3\xc0\xff\x47\x05\x99\xf1\x74\x31"
- "\xf0\x7e\x8d\xd4\xcf\xe0\x40\xbb\xff\x67\xe0\xfd\xbe\x26\x94\xcf"
- "\x5c\x8d\xcf\x99\xa7\xc4\xf1\x41\x7f\x55\x5f\xd0\x13\x28\xbd\x2d"
- "\x7c\x33\xf4\xad\x42\x9b\x4c\xbc\x9b\xc8\xb7\x03\x77\xe6\xd1\xfd"
- "\x73\xe5\xcc\x3e\xff\x6d\xa0\xa8\x87\xb3\x7e\x9f\xb9\xe0\xbb\xd6"
- "\x83\xa0\x5d\x1d\xe3\x98\x51\x5f\xbf\x1f\x82\xa9\x2d\x5d\x6f\x19"
- "\x43\x74\xa9\xcf\x62\x1d\x51\xae\xaa\x6b\x49\x0b\x26\x47\x82\xc7"
- "\xc0\x3c\x3e\xb3\x1b\xe6\x4a\x81\xfb\x3e\x95\x67\x76\x0b\xe3\x5b"
- "\xc1\x7c\x11\xce\xac\xc1\xb5\x04\x75\x7f\x58\x47\xca\x70\x8d\x6e"
- "\xcd\xf8\xd6\x5b\x9c\x37\xb0\x6e\x94\xc1\x3d\xcc\xc7\x3a\x07\xbf"
- "\xff\x9e\x49\xc2\xd8\x0e\x54\x6f\x60\xf5\x7d\x98\xcd\xff\xdb\x31"
- "\x36\x59\x1a\xea\xe1\x7d\xcc\x47\xed\x4c\xc4\x5c\xab\x02\xc6\xf4"
- "\x4c\x04\xbe\x1b\xe3\xc5\xe0\xd7\xa1\x7e\x9c\x34\x6f\x4f\x53\x6c"
- "\x3e\xd2\x6c\x3f\x2f\xbf\xdd\x20\xe9\x9b\xb5\xe1\x8f\xe7\x12\x8d"
- "\xb3\x79\xa8\xed\x8b\x6b\xd5\xb7\xd6\x4d\x9b\xf8\xa2\x1c\x25\xf7"
- "\xfc\xba\x6c\xe2\xa3\xd8\x00\xc3\x86\xf3\x2c\x31\x2a\xf0\x32\xa9"
- "\xbb\xd7\xd7\xe7\xbe\x88\x17\x12\xee\xe1\x53\x83\x89\x72\xe3\xf5"
- "\x7b\xbc\x07\x9a\xef\x2b\xe2\x3d\x1e\x7b\x79\x72\x82\x99\x68\x16"
- "\xe5\x90\xef\xe2\x88\xc7\x0b\xa0\x2d\x0c\xf2\x21\x5a\x03\x39\x17"
- "\x8c\x7b\x41\x8f\xf8\xa0\xfc\x71\x2e\x18\xdb\x4c\x29\x20\xde\x29"
- "\x0d\x7c\xe3\x86\x37\x3c\xbd\x61\x3d\x50\xbf\x0b\x3c\xd6\xc7\xe7"
- "\xbe\xa2\x0e\x68\xe3\x70\x14\xbd\xaf\xc4\x75\xdf\xea\xb6\x39\xef"
- "\x9b\x36\x08\xfa\xf6\xa1\x7b\x7d\x3b\x5f\x2a\xf5\xed\x7c\xe9\x4f"
- "\xef\xdb\xd9\x11\x76\x7d\x53\x4b\x7d\x8b\x81\xbe\x9d\x1d\xef\x5e"
- "\xdf\x2e\x44\x4a\x7d\xbb\x10\xd9\xc3\xbe\xed\xee\xa2\x6f\x27\x9d"
- "\xf7\x2d\xe9\x3e\xe8\xdb\x05\xf7\xfa\x56\x6f\x96\xfa\x56\x6f\xfe"
- "\x29\x7d\x43\x5d\x3e\x35\x84\xbf\x44\x63\xaf\xc7\x13\x1f\xf4\xdd"
- "\xbb\x4c\xce\x3f\x97\x5a\x40\xcb\xfe\x97\xc9\x39\xab\x30\xbf\x8d"
- "\x69\x26\xfe\x22\x93\x73\xce\xc5\x3e\xa1\x45\x7f\xd7\x73\x51\xc0"
- "\xcb\xc1\x8c\xa7\xcf\x53\xff\x86\x34\x23\x2f\xf8\x9b\x9e\x7b\xab"
- "\x90\xfa\xa3\x0c\x29\x15\xca\x15\x2d\xfe\x83\x36\xa0\x2f\x08\x07"
- "\xf3\x99\xf7\x1f\x94\x8f\xb9\x28\xf7\xc5\x1b\x95\x7c\x06\xc6\x04"
- "\xc3\x38\x7e\x2a\xc2\x6f\x19\x54\xbc\x2f\xde\x4c\x73\x31\xaf\xa3"
- "\xfb\x78\xcf\x95\x89\x7b\xd7\xc4\x67\x18\xfd\x86\x94\xc2\xf9\x3a"
- "\x31\xf7\x2d\xaf\x44\x79\x66\x50\x0e\xb6\x0f\xe7\x4d\x62\x7e\x5a"
- "\xe0\xf7\xf5\x02\x36\x98\x7c\xcd\x5d\xe1\xde\xf9\x47\x45\xdc\x7b"
- "\x21\x81\xf8\x62\x0e\xc7\x4d\xa9\xf7\xe0\x37\x47\xd0\xa7\xcf\x95"
- "\xe2\xb8\x4f\x35\xdd\xc3\xfb\xa6\x10\x0f\xdc\xb3\x87\x3e\x7a\xfa"
- "\x60\x23\x09\x4d\x21\x9e\x53\x93\xa0\x4d\x33\x89\xf2\x4d\x82\xf6"
- "\x60\xac\x99\x6e\x70\x9e\xda\xf8\x72\xa1\x3d\xfc\xfe\xed\x91\x40"
- "\x7c\x5e\x08\x4e\xe3\xd7\x6d\x23\x2a\xdc\xdf\x87\xfb\xf4\xd8\x1e"
- "\x3d\x2f\xef\xd6\x8c\xf3\xbb\xc4\xf7\xeb\x01\x7d\xfa\x32\xfa\x18"
- "\x2e\x48\xf4\x31\xec\xe8\x4c\x1f\x43\x2f\x46\x1f\x03\x91\xe8\x73"
- "\x61\x9c\x9c\x3e\x86\x47\xe5\xf4\x31\xc4\xdd\x1a\x7d\x0c\x0b\x25"
- "\xfa\xb0\x67\x30\xfa\x18\x52\x9c\xd3\xc7\x90\x2b\xd1\xc7\x10\xd6"
- "\x33\xfa\x18\x8e\xb9\xa6\x8f\x21\xb2\x0b\xfa\x78\x39\xa7\xcf\x85"
- "\xfb\x7b\x4e\x9f\x0b\xe3\xdc\xa0\xcf\xbd\x8c\x3e\xf5\x6b\x25\xfa"
- "\xd4\x8f\xed\x4c\x9f\x0b\x1f\x32\xfa\x5c\x28\x92\xe8\x53\xdf\x20"
- "\xa7\xcf\x85\x63\x72\xfa\xd4\xfb\xdc\x1a\x7d\xea\x55\x12\x7d\xd8"
- "\x33\x18\x7d\xea\x43\x9c\xd3\xa7\x7e\xb8\x44\x9f\x0b\xe5\x3d\xa3"
- "\x4f\x7d\xac\x6b\xfa\x5c\x30\xbb\x4f\x9f\xfa\xfd\x0e\xf4\x51\xbb"
- "\xa6\x4f\x7d\x83\x1b\xf4\xf1\x65\xf4\x69\x18\x28\xd1\xe7\xe2\xd9"
- "\xce\xf4\xb9\xf8\x22\xa3\xcf\xc5\x70\x89\x3e\x0d\x99\x72\xfa\x5c"
- "\x8c\x95\xd3\xe7\xe2\xee\x5b\xa3\xcf\xc5\x5d\x12\x7d\xd8\x33\x18"
- "\x7d\x2e\x1e\x70\x4e\x9f\x8b\x35\x12\x7d\x2e\xc6\xf4\x8c\x3e\x0d"
- "\xbd\x5c\xd3\xe7\x62\x7e\x17\xf4\xb9\xc7\x39\x7d\x1a\x5e\xeb\x39"
- "\x7d\x1a\x32\xbb\xa2\x8f\x7b\xb2\x5e\x03\xcd\x49\x71\x1b\xda\x31"
- "\xb8\x6a\x07\xc7\x0e\xfd\x0f\xb9\x8c\x06\x43\x21\xe7\xe5\xcd\xf6"
- "\x68\x34\xe4\x6b\x92\xc9\x6f\xeb\xc9\xa5\xc7\x0b\x39\x4f\x6f\x3e"
- "\xe3\xfd\x10\x2e\xe3\x83\x32\x7e\xad\x97\x8a\x5b\x7b\x8f\x0a\xf7"
- "\x5c\xbb\xce\x89\x7d\x69\xa3\xc7\xfd\x64\x00\xee\x9b\x5b\x07\xf2"
- "\x32\xfe\xdf\x9a\x71\x29\x1f\x64\xc1\x71\x5d\xed\xdf\x42\x5f\xa7"
- "\x23\x99\xa8\xdf\x5e\x2a\xb3\xc5\xbb\xc8\xe0\x93\x30\x6e\x98\xf6"
- "\x61\xdc\x67\x71\xa9\x39\x97\xc6\xa1\x1a\x10\x12\xfe\x30\x7f\x1e"
- "\x75\x8f\xcb\xe4\xf2\x15\x7e\xf3\x80\x10\xe4\x07\x90\xd5\xfb\x35"
- "\x91\xcb\xc3\x6d\xfe\x79\x7c\xe4\x76\xc1\x46\x58\xce\xea\x36\xbe"
- "\xc6\x6f\xee\x5f\x8e\x39\x3b\x97\xa7\x62\x2e\xca\xc6\xe7\x40\xf6"
- "\x7d\x04\x9f\x81\x31\x91\x76\xc2\x11\xfd\x64\x98\x6f\xe6\xe5\xe9"
- "\x54\x5e\x5e\xf7\xe0\x76\xe6\x0b\xd7\xf8\xa8\xc8\x77\xf0\x9c\xde"
- "\x50\xf6\x13\xe4\x79\xac\xdf\xa7\x89\x7c\xd7\x66\x77\xdd\x07\xca"
- "\x67\xa1\x6d\x3f\xe1\xfa\xbd\x50\x3e\x8c\x72\x36\x8d\xdf\x91\x9d"
- "\x2e\xf8\x10\x7f\xb7\x0b\xce\xa9\x85\x3a\x7e\x50\xe7\x2d\x94\xdd"
- "\x85\x36\xfc\xa1\xbc\x18\x75\x60\xe1\x7a\x00\x94\xa7\xe1\xb7\x03"
- "\xe1\x7a\x20\x94\xd1\xd6\x39\x84\xed\x79\xe9\x10\xe6\xe8\x77\xe4"
- "\xd6\xf6\x82\x7f\x47\xf5\x56\xa4\x01\xd3\x05\xbe\xb3\xf3\xff\xb9"
- "\xdc\xe8\x70\x6d\xa1\xdd\xb5\x5a\xf1\x1a\xf3\x51\xfb\x2e\xdd\xee"
- "\x5a\xb9\xc3\xb5\x02\xbb\x6b\xa5\x0e\x6d\x96\xda\x5d\x2b\x76\xb8"
- "\xaf\xc6\xee\x5a\xae\xc3\x35\xa3\xdd\xb5\x4c\xe1\x9a\x47\x6b\x46"
- "\xa3\xb7\xf4\x0d\xef\x72\x82\x70\x5e\x09\xe7\x35\x76\xe7\x17\x0a"
- "\xe7\xe1\xf9\x8d\xa3\x0c\x24\x3f\x44\x38\x4f\x69\xcf\xda\x6f\x8c"
- "\xb0\x6b\x7f\x38\xb3\x71\x34\x2e\xb4\xf9\xce\xf9\x0f\x6a\xe4\x3a"
- "\x22\xb7\xc3\xb5\x10\xe4\x2b\x7b\xde\x5e\x92\xa8\x99\xbf\xe2\x0f"
- "\x9a\xf8\xe8\x04\x74\x5f\x59\x1c\x9b\xa0\x59\xbc\x74\x61\xb4\x2c"
- "\x7e\x7a\x00\xc6\x12\xc4\xfc\x63\x18\x93\x45\x88\xf5\xdf\x68\xcb"
- "\x8f\x01\xb8\x0a\xcf\xaa\x36\x90\x71\xd4\x8e\x9d\xcb\xe2\x8c\x97"
- "\x63\x4c\x17\x16\xbf\x85\xbc\x54\x4f\x1a\x4f\x09\xf1\x5b\x74\x50"
- "\xd7\xe2\x3a\x7e\x4b\x53\x2d\x8d\x5b\x08\xf5\x58\xfc\x96\xa6\x3a"
- "\x98\xe7\x2f\xf0\xbd\x59\xbe\x0b\x96\x07\xec\x8a\x28\x9b\x18\xe7"
- "\xb6\xd1\xd8\x7f\xe9\xcc\x96\xe1\x18\x87\xb5\xbf\x05\xef\x13\xbe"
- "\x8d\x5b\xec\xee\x8f\x61\xd7\xc5\xf5\x41\x78\x66\xce\x00\xec\x6b"
- "\xef\x7a\x28\x53\xfb\x3d\xbd\x76\x85\xd9\xf2\x36\x0f\x50\xe1\x3b"
- "\xe1\x7b\xcb\xdf\x4d\xf9\x6a\x3d\xb9\xf2\xb1\xf4\x6e\x57\x6a\xed"
- "\x62\xbc\x89\xef\x40\xd8\x1c\xed\xf4\xae\xd4\x3f\x91\x57\x0f\x50"
- "\xe1\xb3\x11\xcf\xd8\x5e\x06\x28\x6f\x1e\x60\xeb\x8f\x5d\xff\x30"
- "\x4e\x92\x0a\xfa\x77\x96\x8e\x09\xd0\x94\x07\x9a\x0a\xef\xb0\x83"
- "\xcf\x68\x4c\xa7\xbe\xf9\xb8\x07\x18\xf3\x97\xd0\xb5\xaa\x29\x46"
- "\xb4\x65\xe2\x1a\xc5\x6c\x98\x4d\x92\xfc\x87\xb1\xb7\x36\x8b\xeb"
- "\x57\x93\x9d\xfc\xc7\x9e\x09\xe7\x8a\xed\x79\xc8\xee\x79\xa7\xf0"
- "\x79\x50\x2f\x82\xed\x07\x18\x80\xdf\x38\x41\xbe\x6f\x0a\x40\x5f"
- "\x4c\xbc\x17\xfb\xe8\x2a\x67\x9d\xab\xd8\x88\xd2\x38\x7e\xaf\x11"
- "\xc7\x31\x97\xe6\x4e\xfa\x7e\x98\x68\xaf\xa3\xfb\x91\xa0\x4e\xae"
- "\x2d\x87\xf3\xf7\xb3\x68\x1e\xb4\x9c\x7f\x8f\x7c\xd2\x87\x44\xb1"
- "\xb1\xfd\x3e\x1a\x31\x1e\xe7\x0c\xc3\xfa\xef\xcb\x04\x9a\x0b\x76"
- "\xd8\xef\x37\xe2\x79\xc9\xff\xfe\xfb\x06\xb1\x9e\x88\xcb\xec\x7b"
- "\xd5\xf7\x07\x69\x3d\x96\x57\x37\x9f\xd1\x7c\x88\xba\x9e\x7c\x5f"
- "\x2d\xd4\x67\x79\x09\x69\x5c\x9e\xef\x9b\xf9\xcd\x43\xf2\xa1\xaf"
- "\xa0\xff\x34\xe6\xb3\x71\x64\xcf\x85\x63\x35\xf6\x05\xc7\x08\xf7"
- "\x8e\xf3\x9b\xff\x3d\x12\xe8\xe3\x34\xa7\x86\xe0\xd7\xfd\x50\x13"
- "\xb9\xca\x64\x08\x25\x4f\xed\xbb\xec\x5d\xaf\xc6\xda\xf9\x3e\xfb"
- "\x88\x75\x18\x76\xd3\x6b\xd4\xa7\x5c\x9b\x88\xf6\x20\xe1\x5a\x22"
- "\xee\xaf\xb5\xfd\xef\x65\xf7\xbf\x27\xfe\x4f\xfd\x9a\x93\xe9\xda"
- "\xaa\x92\xf6\xee\x5f\x8d\x81\xb2\x8f\x43\x39\x40\x56\x5e\xc5\xfc"
- "\x9e\x41\x36\x6b\xa0\x3e\xe4\xc2\x79\xa1\xed\x5e\xb4\x3f\x89\xfc"
- "\x28\xe0\x0d\x35\xee\xc5\x16\xfc\x16\xd4\xb8\x87\xdb\xd7\x32\x9b"
- "\xee\xdf\x86\xeb\xc3\x85\xe3\x30\xe1\x38\x94\xe5\x34\xbd\xaa\x91"
- "\xf2\x92\xa3\x8d\xe6\xea\x30\x57\x79\xd2\xc5\x3c\xf2\x62\x9e\x74"
- "\xdc\xff\x2d\xe4\x75\x9d\x05\xf7\xc5\x74\x95\x93\x1e\xae\xaf\x17"
- "\xf7\x72\x5b\x73\xfa\x7f\xc2\xe5\xa4\x95\x62\x0e\x4d\x8c\xff\x95"
- "\xd6\x8c\x31\x60\x4c\x44\x4f\xda\x89\x3e\xa1\x35\x1d\xf3\x68\x56"
- "\xb1\xfc\x99\xb8\x07\x56\x81\x76\x73\x94\x1d\xab\xb4\x57\x69\x0e"
- "\xcd\x95\xcd\x24\x44\xfb\x1b\xbe\x01\xc6\xa0\xd9\xba\xb9\xff\x27"
- "\x02\x1f\x6d\x83\x35\x70\x40\x13\xb9\x46\xed\xc5\x34\x07\x74\x33"
- "\xfd\xee\xe5\x7d\x99\x5c\x4b\xa1\x75\xf8\xc8\x6d\x6c\xec\xae\x51"
- "\xdb\xd7\xce\x0c\x31\x4f\xe2\xb5\x50\x31\x2f\xb3\x81\x5c\x4b\xbf"
- "\xe1\x37\x13\x78\xeb\xda\x28\xb9\xcf\xf4\xb5\x69\xd8\x26\xf6\xdd"
- "\x40\xae\x9a\xb0\x6d\xa8\x33\xcb\x36\x67\xe1\xfc\x4a\x0b\x79\x00"
- "\xfa\x75\x59\x6c\x1f\xae\xc3\xfc\x6f\xa6\x7b\xf3\xb1\xcd\x1b\x9b"
- "\xd3\xb1\xdd\x1c\x83\x87\xb1\x88\xf9\x5c\x5f\x83\xf5\xef\x2f\xda"
- "\xae\x64\x20\x98\x0b\xe5\x30\x97\xaa\xb9\x9c\x21\x3a\x16\xa3\x7b"
- "\x88\x60\x63\xbc\x76\x05\xfd\xba\x36\xdd\x24\x2a\xf4\x81\x60\x3c"
- "\xfb\xc3\xe3\x94\x8f\xe1\x1c\x60\x75\x31\xcc\x11\xba\xaf\xd7\xbd"
- "\x75\xff\x1a\xcb\x8b\x7d\x9d\x78\x67\xc7\x8b\x31\xc6\x7f\x18\x67"
- "\x97\x17\x41\xd8\xf7\xf2\xc3\xe2\xaa\x24\xfa\xbd\x9b\xf6\xd1\xb1"
- "\x0f\xd8\x5f\x68\xab\xd1\xa5\x8c\xa9\x1e\xc2\xbe\x0f\x6d\x19\x54"
- "\xca\x7c\x54\x7f\xf8\xd4\x23\xf8\x41\xc0\xd1\x1f\x4a\x6c\xf9\x20"
- "\xa0\x4e\x36\xfa\xde\x43\xfb\xb6\xf7\x8c\xa7\xcf\xa8\x65\x73\xfd"
- "\x87\x66\x6e\xf3\x10\x1d\xf6\x41\x38\xdf\x5c\x65\x31\x63\xec\x07"
- "\xa7\xf1\xb3\x68\x9e\x39\xf4\x09\xdf\x32\x44\x87\xfb\x86\x9e\x34"
- "\x8b\x7d\x36\x36\xe3\x7e\x15\xec\x33\x1b\x5b\xe3\x05\x71\x1c\x37"
- "\x5e\x87\xb6\x53\xcf\x90\x06\x62\x8c\x45\xbf\x39\xdc\x7f\x85\x73"
- "\x98\x8d\x81\x91\xea\x7c\xf4\xf9\xac\x0e\xd5\xfd\x69\xce\x1f\x68"
- "\xbf\x90\xe6\x2d\x83\x77\x00\x5a\xe8\x52\x71\xcf\xbf\x91\xc6\xdb"
- "\x58\x17\x4f\xd8\x7b\x53\x3f\xd9\x1f\x85\xef\x24\xc6\x62\x71\xad"
- "\x30\x08\xe7\x36\xe1\xb3\x13\xdb\xc9\x35\x62\x7c\x0b\xf3\x91\xc3"
- "\x78\x54\x63\xdc\xb9\x2a\x13\xcc\x93\xa4\x76\xe4\x85\x6a\xcc\x73"
- "\x69\x20\xc6\xf5\x6c\x7d\xc3\x31\x37\xc6\xe1\xf3\x71\x6c\x81\x76"
- "\x46\x18\xd3\x2f\x5a\x33\x7e\x54\x89\x63\x9a\x1d\x84\xfa\x8e\x51"
- "\xd3\xd5\xda\x60\x85\x3e\x57\x81\x96\xa1\x7b\xe0\x0c\xf6\xaf\x92"
- "\xf3\x1f\xa2\x43\x9f\x6c\xf8\x5f\x88\x75\xca\x68\xc7\xe6\xd2\x8f"
- "\xef\xc3\x33\x7e\x44\xff\x06\xc4\x4a\x8c\x8d\x06\xe7\x26\x09\xe3"
- "\x47\xf3\x44\xe4\x24\xb2\x71\x60\xf5\xaf\x0b\xdf\xc3\x1f\x6c\x85"
- "\x7e\x15\x48\xf6\xe2\xeb\x74\xed\x46\x7e\x2b\xa4\x3a\xe1\x8f\xa5"
- "\x76\x7d\x36\xd1\xfd\xaf\xd7\xd1\xd6\xf7\x63\x14\x3e\x6b\x23\xc6"
- "\x05\x43\xbe\x68\xb2\xe7\xff\x1f\x9f\xc3\x7e\xa2\xcf\xaf\xd5\x6f"
- "\x50\x29\xac\xb7\x07\x70\x9c\xe1\x9e\x24\x98\x0b\xba\x2e\xd6\x42"
- "\x9a\xa3\xae\x35\xe3\xfa\x50\x71\x2d\x04\xfd\x02\xd6\x85\x96\xc1"
- "\x54\xef\x04\x79\x5a\xcf\xa1\x3c\xd3\x12\x8a\x7c\x03\x73\xdd\x2c"
- "\xc8\x3a\x66\xb8\x27\x4a\xfc\xe6\x65\xc5\x7d\x13\xd7\xe8\xf7\x5e"
- "\x93\x98\x7b\x8d\xc5\xe1\xbb\x9e\x29\xed\xb3\xb8\x9e\xd3\x69\x9f"
- "\x05\xee\xfd\xc9\xa3\x39\xba\x76\xe3\x9a\x52\xd9\xdc\x80\x6b\x04"
- "\xbd\x1f\xf7\x5e\xa4\x82\x4e\xce\xf6\x0f\x35\xa0\x7d\x9e\xe6\x32"
- "\xc1\xbe\xb0\x9c\x12\xf5\xf4\x7f\xe0\x5b\x15\x1e\x19\x2f\x5d\x37"
- "\xd9\xf2\x8b\x03\xbd\xf1\x5b\xdb\x11\xd5\x04\xa2\x7b\x18\xd7\xeb"
- "\x96\xc1\x98\x2b\xbb\x35\xa3\x25\x58\xcc\x93\x4d\xf3\x62\xb3\xf7"
- "\x69\x76\x19\x6f\xf1\x09\x32\x0c\xe3\x05\xe0\xfe\x3a\x3a\x06\xea"
- "\x3c\x33\xc6\x70\xc6\x78\x94\xba\x64\xcc\xb5\xd2\x72\xea\x9d\x20"
- "\xba\x47\xd9\xa4\x7b\xe2\x3a\xca\x28\xcd\x97\x53\x68\x9c\x25\xef"
- "\xa9\x49\x16\x1e\xef\xa3\xf2\x84\x5f\x9e\x19\xaf\xd1\x1c\x06\xd8"
- "\xe6\x2d\xc7\x23\x6e\x29\x12\x64\xd3\x66\xc0\xfd\xfb\x80\x56\x54"
- "\x76\x87\xff\x83\x9a\x88\xc9\xca\xf2\xb5\xb2\x98\xfa\x82\x3f\xb6"
- "\x17\x8b\xb1\x01\x63\x46\x63\x1e\x98\x96\x69\x1e\xc3\xdc\xc6\xa6"
- "\x15\x34\xbe\x75\xce\x00\x6f\x61\xdd\xf4\xde\xc4\xfa\xe5\x3b\x37"
- "\x49\x49\xfb\x88\xfd\x73\xaf\x6f\xa6\x31\x82\x1e\xe1\xd5\x9a\x61"
- "\x4a\x17\x63\x73\x30\x79\x8a\xc5\xbd\x66\xb4\x30\x5d\x65\xf3\x69"
- "\x80\x8f\xf0\x6c\x9f\xdb\xf0\xec\x52\x41\x26\x37\xb0\xd8\xdf\x2d"
- "\x0b\x81\xae\x86\xd6\x8c\x1b\xde\xa2\x3e\x23\xec\x21\x1a\xca\xf4"
- "\xac\x1b\x1a\x49\x9f\x69\xe9\x14\x8f\xf5\xf9\xa5\x4b\x13\x34\x0b"
- "\x63\x97\x6b\xe7\x25\x2c\x88\xd1\x44\xc7\xc7\x2f\x8d\xd7\x60\xf0"
- "\x25\xfb\xf9\xc3\xf2\x13\xdd\x18\x2e\xe4\xf2\x2b\x96\x72\xf9\xdd"
- "\x90\xe5\xbf\x34\x90\x1b\xe9\xb7\xc7\x76\x71\xa3\xc0\x55\x3b\x39"
- "\x4a\xae\x04\x7e\xf8\x1d\x45\x07\xbf\x72\xb4\x65\xcc\x35\x93\x70"
- "\x58\xeb\xe9\x5a\x28\xc5\x9c\xb8\x31\x1d\x7d\x8c\xea\xc9\x8d\xb6"
- "\x42\x4e\x45\x68\x0c\xa1\x0c\x0e\xf7\x81\x62\x9c\xf6\x52\xf8\xe9"
- "\xe0\x57\x0e\x3f\x7a\x1f\xf7\x0f\xba\x5f\xbe\xc4\xfe\x1a\xf3\x1f"
- "\x49\xcd\xc4\x3a\xfc\x5a\x15\xc5\x2f\x6e\x0b\xab\xe7\xd0\x07\x25"
- "\x9f\x71\xad\x44\xa8\x47\x73\x72\xf5\x5d\x4b\x34\x4e\xea\x79\xf0"
- "\x19\x97\x76\x0b\xf5\xa8\x0f\x80\xf8\x3e\x98\x43\x00\xea\x8b\xf5"
- "\x54\x7c\x46\xcb\x28\xa1\x1e\xf5\xc9\xe1\x32\x94\xce\x9e\xeb\xc9"
- "\x67\x7c\xa2\x11\xea\xa9\xed\xdb\xb3\xab\xe3\xc5\x65\x7c\x5b\x8c"
- "\x75\xb8\xb5\x2a\x16\xdf\x36\xe3\x46\x01\xd4\x77\x1a\x7b\xd5\x3d"
- "\x3a\xb5\x8e\x73\xa4\x93\x76\x41\x6c\xf4\xb3\xb1\x4b\x12\x31\x83"
- "\x54\xc2\xd2\x15\x09\x78\x5c\x32\xef\x8f\xf4\xb0\x74\xee\x1b\x0b"
- "\xd8\x3f\x09\x71\xc3\xf0\x9f\x38\xe0\x37\x3c\x2e\x5c\xa1\xc5\xc3"
- "\x82\xa5\x58\x4c\x8a\x19\xba\x62\x01\x1e\x1c\xf7\x81\x86\xb5\x66"
- "\xb4\x36\x03\x6f\xd4\x31\x9c\x6d\x35\x1b\xc8\x25\x2a\xd3\x61\x9e"
- "\xa4\xa3\x61\x16\x22\xda\xb5\xe4\x31\x47\xcc\x9e\x18\x73\xc4\x77"
- "\xad\x76\x81\xaf\x25\x36\x1a\xd6\x0c\xd0\xb1\xcd\xc3\x0d\x24\x46"
- "\xc8\x61\x3d\x20\x98\xc6\x2f\xcd\x68\xcd\x14\x7c\x3b\x55\x5c\x4e"
- "\xff\x0a\x8c\xcb\x0f\x65\x9a\x93\x1a\xca\x66\xa8\x87\xb9\x6a\x30"
- "\x17\x75\x00\x94\x6b\xd0\x26\x05\xe5\x60\x28\x87\x70\x39\x6a\x03"
- "\xee\x31\x86\xb2\x06\xca\xa1\xd0\xbe\x2d\xff\x9b\x73\x59\xd9\xfc"
- "\x89\x98\x27\x9b\xe5\xc4\x36\x97\xd9\x72\x62\x63\x9e\xa6\x54\xf5"
- "\x2c\xba\xfe\x52\x19\xc4\xdc\xe8\x11\xdc\x7f\x02\xd4\x69\x14\xd7"
- "\x4b\x66\xef\x30\x9b\xc5\xf8\x29\xcc\x9e\xd1\xe6\x6d\x97\x5b\x1c"
- "\xcb\xc1\x62\x6e\x71\xb4\x77\xd1\xdc\x86\x70\xe4\x33\x30\x4e\x2c"
- "\xef\x34\xf6\x0e\xcb\x89\xd9\xb6\x06\x63\xee\x1a\xd3\x16\x2a\x06"
- "\x15\xa2\x0d\x0d\xca\x2c\x66\x24\x7f\x8d\xb4\xd1\x78\xfa\x62\x3c"
- "\x39\xfb\x58\x12\x4e\xf7\x43\x7d\x09\x32\x03\xcd\x63\x15\xb7\xd4"
- "\xd7\x32\x2f\x9a\xc9\x81\x6d\x67\x19\x7e\x0d\xaa\x63\xf2\x42\x5b"
- "\x39\xff\x32\xcb\x75\x62\x20\xed\x93\x50\x67\xf1\x55\xc4\x2d\xe5"
- "\xe1\x5e\xdf\xa4\x79\xd1\xf4\x1c\xd4\x5b\x07\xb2\x9a\xd0\xbf\x3d"
- "\xfa\x10\xdc\xe3\xca\x09\x31\x32\xda\x76\xcf\xe9\x9f\x8e\xcf\xf1"
- "\xa6\x72\xc8\x97\xc4\x07\x73\x53\x62\xdf\x0a\xed\xe2\xdd\x6d\x82"
- "\x73\xe8\x43\xda\xf2\x32\xf1\xc1\xf8\xbe\x42\x5f\x76\xb3\xbc\x60"
- "\xed\xe3\xc4\x58\x53\x06\x38\xe7\xf8\x3e\x2f\xff\x9e\x72\xe5\xe0"
- "\x05\x43\x23\xc6\xc3\x7f\x43\x85\xf4\xce\xf6\xbc\x19\xd2\xe2\x3f"
- "\x58\xd7\xb2\x77\xc0\xbf\xb0\x1c\x9e\xed\xa0\xff\xb7\x8d\xa2\x3e"
- "\x2c\xa8\x97\xb4\x46\xe6\x33\x1f\xd4\xf6\x4a\x8c\xa7\xcb\x65\xa0"
- "\x3c\x89\xfb\xa6\xdb\x0f\x20\xcf\xf2\xea\x41\x86\x9d\x6b\x30\x76"
- "\xb3\x02\xc6\xb8\xfd\x63\xbc\x26\xc4\xec\x52\xd2\x18\x57\x56\x12"
- "\x4c\xf7\x08\x83\x8c\x82\x7b\x50\x2f\x13\xeb\x41\x94\x3b\xd0\x9e"
- "\xc4\x65\xb4\x47\x22\xdf\x02\x8d\x31\x86\x88\x89\xf7\xef\x5f\xca"
- "\xfb\x85\x66\x22\x1f\xa3\xac\xab\x57\xe3\x98\x75\x84\xc2\x73\x5f"
- "\x80\xdf\xab\x2c\xa7\xcc\xeb\x8d\x62\x9b\x18\x57\x0d\x64\xa8\x66"
- "\x38\xaa\x5b\x33\x3a\x26\xd9\xe5\xda\x13\xf6\x44\x77\x2c\xc6\x78"
- "\x6f\xd8\x36\x93\x9d\xad\x1f\x32\x19\xa4\x23\xc9\x40\x7c\x73\xd9"
- "\x5c\xec\x00\xf9\xe7\xdf\xa2\x84\xff\x41\xfe\x79\xaa\xc4\xa1\x8d"
- "\xd3\xa2\xad\x94\xf1\x74\xc7\x27\xc0\xa3\x2f\xc0\xef\x55\xa8\xaf"
- "\x13\xf3\xc9\xaf\x53\xd2\x7d\x92\x97\x3d\x82\x71\xbf\x7b\x47\xad"
- "\x78\xde\x53\x11\x0e\x63\xda\xd1\x28\xce\xfd\x16\xff\x41\x65\x50"
- "\x36\x8b\x36\x16\x66\x73\xb1\x78\xdb\x95\xab\xa1\x1c\x2c\x96\xe1"
- "\xff\x50\x11\x2b\x50\x4f\x6c\x01\x5d\x12\xf5\xce\x05\xc1\x20\x17"
- "\x06\xa3\x9e\x67\x01\xfa\xff\x9b\x46\xa8\x1b\x61\x20\x6f\x09\x18"
- "\x63\x99\x65\xf0\xb8\x1e\x29\xbe\x0b\x97\xe1\xe1\xcb\xde\xc7\x9a"
- "\xcb\x6d\x4e\x2b\x35\xfa\xf5\x4f\x82\x3a\xb0\xfe\x9b\xa9\xbe\x87"
- "\x31\xd7\x36\xb4\xab\xa7\xeb\x33\x41\x4e\x7e\x03\xf9\xcb\x4a\xfd"
- "\xb0\x36\x26\xab\x69\x9c\x5e\x8c\xf9\x41\xe3\xf3\x61\x8c\x4a\x0b"
- "\xf1\xa2\x79\x01\x36\xa7\x15\xd3\x78\xf8\x2b\xc3\x7c\xc4\xf8\x94"
- "\x80\x3d\x71\xbc\x32\xae\x02\x63\x56\xd2\xfc\x1f\xad\x61\x7d\x69"
- "\x9c\x4a\x21\x3e\xe5\x8e\x44\x12\x50\xc0\xb1\xf8\x94\x34\x1e\x88"
- "\x17\xe8\x24\x89\xce\x63\x54\xf2\x19\xc5\x09\x62\x8c\x4a\xfe\xa6"
- "\xd5\x0c\xff\x23\x2f\x60\x5e\xf4\x30\x5a\x96\x62\x4b\xa9\x9c\xc6"
- "\xac\x54\x02\xc6\x29\x59\xcc\x4a\xf7\xd6\x06\x6b\x14\xe3\x13\x6b"
- "\x91\x98\xef\xde\xee\x1c\xe0\x5f\x9b\x10\xcb\xa0\x23\x4e\x38\x57"
- "\x6e\x20\x59\x62\xfc\x29\x23\xda\xc8\x72\xa9\x1d\xac\x1d\xf7\x5f"
- "\x6c\x73\x86\x2f\xd7\xfd\xb7\x69\xaf\xd3\x58\x14\x1c\x3c\x8f\xa3"
- "\x58\xc7\xf4\x46\xce\xdb\x71\x0e\xcf\x5f\xb0\x74\x61\xf4\xdc\x45"
- "\x8b\xb5\x9a\x97\xa7\xbf\x40\x93\x1d\x0e\xd5\xc4\x26\x44\xd3\xe5"
- "\x47\xf3\xf2\xf8\xe7\xa7\x4e\x9d\x3e\xf7\xf7\xd3\x9f\x9b\x3e\xe3"
- "\xf7\x63\xd9\xee\xc4\xe9\xf1\xab\x30\x61\x66\xc2\x52\x0d\xde\x34"
- "\x5f\xc8\xb2\x9d\x1c\x1d\xbf\xd4\x71\xee\x07\x50\x9b\x96\x92\xda"
- "\x6f\x4d\xf8\x3f\xb3\x9b\x71\xbb\x44\x7b\x16\xc3\x39\x6e\x2b\x8e"
- "\x2d\xcd\x5f\x9a\xc1\x85\xa0\x2c\x25\xe4\x3f\xc7\x35\x06\x6d\xa2"
- "\x46\x5c\x6b\xe0\x5d\xaa\xed\xe3\x70\x09\xf7\x62\x3c\x2e\xb5\x38"
- "\x6f\xd9\x39\xbe\x17\xff\xc0\x03\x69\x2c\x96\x16\xaf\x12\x6d\xdc"
- "\x78\x4e\xec\x43\x3d\xd6\xc9\xe0\x26\x4b\x79\x76\xf9\xa1\x52\x2e"
- "\x49\xfa\x27\x1b\x23\x42\x50\x74\xf1\x84\xb1\xf3\x82\xdf\x3d\xf8"
- "\x9b\x68\xc3\xf2\x44\xbe\x16\xf5\x33\x5f\x05\xac\xb7\x49\x1e\x2c"
- "\x17\x55\x56\x0d\xcd\x9f\x30\xd5\x6a\xf1\x98\x6b\x55\xc2\xd1\x83"
- "\x9f\x6b\x55\x51\x9d\x90\x4f\xe4\x6b\xe8\xbe\xfa\x44\xbe\x1a\x73"
- "\xae\x01\x1f\xaf\x9f\x6a\x49\x5d\x3f\xd5\xca\x5b\xe6\x82\xac\x0e"
- "\xc7\xef\x70\x7f\xf8\x54\xeb\x77\x3c\xcd\x3b\x83\xfb\xe8\x59\x4c"
- "\xc1\x72\xf4\x97\x9c\x03\x3c\x5c\x78\x9d\xe5\xea\x9d\xba\xea\x87"
- "\xf3\x73\x57\x19\x58\xae\xde\x6b\x2c\xbf\x35\xcb\x01\x4e\x52\xa1"
- "\x9d\x63\x73\xad\x1e\x9a\xa9\xd6\x0e\x9e\xee\x71\xcd\x22\xea\xae"
- "\xf2\xef\x3a\xb5\x55\x64\x3f\xd6\xc0\x6f\x1d\xa4\xe2\xb3\x1f\xd7"
- "\xc1\x31\x93\xcf\x09\xdd\x8d\x78\xcd\x67\x0f\x2b\xe0\xb7\x86\xc2"
- "\xf9\xa7\x93\xe0\x98\xc9\x67\x8f\x9c\xce\x6f\x1d\x0c\xe5\x67\x86"
- "\xc1\x11\xca\x7d\x42\xa0\x3e\xe1\xb3\x7d\x36\xc0\x31\x9d\xcf\xbe"
- "\xd7\x02\xf5\xa0\xec\x1b\x07\x47\x28\xab\xeb\xa0\x1e\x94\xfd\x27"
- "\x5d\x56\x90\x1a\xf8\x1f\xce\x8d\xf1\x61\xcf\xfa\x6d\x30\x7d\x56"
- "\xf6\xf3\xa1\xec\x19\xe3\x87\xb1\x67\x4c\x1c\xc3\x9e\xf1\xbb\x89"
- "\xec\x19\xfd\x0e\x40\x3d\xe8\x63\x60\x31\x1c\xd7\xf3\xd9\xf7\xe5"
- "\x42\x3d\x28\xdf\x9f\x0e\x47\x28\x3f\x08\xcf\x1a\x0c\xe5\xfe\x91"
- "\x70\x84\xf2\x43\xe3\xa0\x9e\x0f\x9f\x3d\x70\x38\x1c\x37\xf0\xd9"
- "\x83\xb0\x7d\x28\x0f\x0e\x80\x23\x94\x87\xa8\xa0\x1e\x94\xc3\x4c"
- "\x70\x84\xf2\x14\x78\xa7\x41\x6a\x3e\x3b\xc2\x1b\x8e\x39\x7c\xf6"
- "\x34\x78\x5e\x28\x94\x7f\xaf\x85\x23\x94\x67\xc0\xfd\x83\xa1\xfc"
- "\x4a\x2d\x1c\xa1\x1c\x89\xef\x1a\xc0\x67\xcf\xc4\xe7\xe4\xf2\xd9"
- "\xaf\xe3\x3b\x43\x79\xf6\x27\x70\x84\xf2\x5c\xec\x0f\x94\xe7\xe1"
- "\x7d\x50\x9e\x0f\x63\x30\x28\x98\xcf\x8e\xde\x0d\xc7\x7c\x3e\x3b"
- "\x26\x05\xea\x41\xf9\x8f\x93\xe0\x08\xe5\x25\x30\x86\x83\xa1\xac"
- "\x6d\x86\x23\x94\x97\xe3\xfb\x86\xf0\xd9\x89\x39\x70\x2c\xe0\xb3"
- "\x57\x2d\x84\x7a\x50\x4e\x19\x05\x47\x28\xa7\xc1\xf8\x0d\x86\xf2"
- "\x5a\x03\x1c\x0b\x9c\xd3\xf3\xcd\x48\x7e\xad\x17\x8c\x7b\x4e\x0d"
- "\xbf\xf6\x1e\x38\x6e\xc9\xe4\xd7\x7a\x86\xf1\xd9\x79\xc3\xe1\x3c"
- "\x1c\xdf\xd1\x42\x79\xa8\x50\x86\x63\xee\x2c\x28\x0f\x13\xca\x70"
- "\xdc\x3a\x11\xca\xc3\x85\x32\x1c\xb7\x63\x79\x14\x9f\xfd\x2e\x1c"
- "\xbd\xe0\xb8\xbd\x1c\xca\x63\x84\x32\x1c\x77\x04\xc0\xd1\xc2\x67"
- "\xe7\x13\x38\x1f\x0e\x47\x1d\x94\xe1\xb8\x2d\x1d\xca\xe3\xe0\xd8"
- "\x00\xe5\x71\xc6\xc1\xfe\x25\xb8\x9e\xf3\xfe\x57\x74\x5c\xd0\x90"
- "\xf4\xb4\x1b\x44\x89\xf1\x8f\x4a\x52\x0d\x18\x03\xe6\xa1\x7a\x85"
- "\xf2\x63\xcc\xb3\x81\x75\xac\x79\x83\x08\x17\x34\x28\x1d\xce\x7b"
- "\x41\xbd\x7b\x2e\x2b\x3c\x8e\x22\xc6\xe8\x53\x0c\x34\xbf\x9f\x10"
- "\xdf\xd2\x0b\xee\xc1\x7c\x91\xa3\x00\xd3\x95\x30\x5e\x63\xf8\x0c"
- "\xcf\xeb\x70\x3c\xc0\x67\xf4\xa9\x87\xf1\x82\xb2\xdf\x97\x70\x84"
- "\xf2\xc8\x3f\xc1\x78\x41\xf9\xf5\xe7\xe1\x78\xa0\x35\xcb\x63\x94"
- "\x41\x41\x58\x3c\xb6\xbd\x03\x86\xf9\x5a\x78\x7e\x2a\xa0\x27\xff"
- "\xde\xb4\x12\x5f\x8b\x8e\xf0\x5b\x47\x14\xf9\x62\x9c\xc6\xf7\xfb"
- "\x95\xf0\xfe\xd7\xab\x69\xbf\x33\x40\x8f\xee\x08\x55\xb2\x67\xf7"
- "\xe1\xeb\x15\x1e\xd1\x98\x13\x82\x0f\xea\xed\xea\xfa\x9b\xf4\xfa"
- "\xc3\x2f\x0f\x63\xd7\xd5\x44\xba\xfe\x2a\x5e\x7f\xdf\x17\x63\xab"
- "\x3f\xa2\x1c\x66\x50\x78\x54\x60\x1d\x83\x42\xd9\xc8\x67\x78\x10"
- "\xbd\xa9\x51\x78\xc7\x7b\xb0\x5e\x25\xde\xe7\xca\xbe\xc3\xe5\x8e"
- "\x0e\xdb\x08\x98\x87\xfa\x2e\xac\x7d\x4a\x4d\x6a\x68\x69\xbd\xc2"
- "\xb3\x60\x07\xca\x43\x01\x11\x46\x8a\x85\x0a\xd5\xbc\x8e\x2d\xa1"
- "\x0d\x9a\x64\x5f\x68\xcf\x73\x47\x9a\x99\x37\xe9\x52\x9f\x27\x97"
- "\xe9\xf9\xc1\x1a\xba\x37\x88\xfd\xef\x43\x7d\x3e\x59\x7d\x33\xb5"
- "\x2f\x43\x5b\x78\xaf\xbd\x7e\x61\xcd\x2a\x5b\xc8\x05\x4d\x23\xf4"
- "\x9b\xb9\x42\x15\x7d\x90\x33\x28\x7d\x13\x88\xa7\x26\xf9\x73\x68"
- "\x5f\xb5\x5b\xa6\x8b\xda\xea\xd2\x6b\x9b\x0f\x41\xdd\x77\xd1\x6e"
- "\x94\xa5\xb2\xc5\x3f\xe5\xe1\x1d\xde\xc6\x75\x4f\x49\xc2\x71\x2d"
- "\xa6\xb2\xad\xc2\x73\x0c\xc6\xba\xb5\x04\x0c\x57\x5b\x72\xae\x94"
- "\x58\x73\x23\x8c\x7c\xde\x34\xd2\xd7\xa2\x20\xd4\x37\x5f\xe1\xb9"
- "\xec\x49\x33\xca\x92\xc7\xb1\xee\xa3\x9c\x57\x55\xd8\x13\x49\x44"
- "\xa9\x8b\x3f\x83\xe5\x58\x3e\xeb\xf4\x50\x7d\x73\x2d\xd1\xc5\xd3"
- "\xb6\x62\xf8\x2c\xa3\x86\xf3\x6a\x98\x58\x88\x32\x79\x12\xda\xd4"
- "\xbe\xc4\x71\xb9\x0a\xe3\xac\x6a\xcd\xf2\x9c\x68\xcb\xd7\x0d\x63"
- "\xb9\x11\xc6\x0e\xe5\x65\x8c\x73\x31\xd7\x6a\xc5\xb8\x71\xeb\x0d"
- "\x30\x0e\x74\x7d\x55\x78\x0e\xc5\x5c\xe7\xc2\x73\xd7\x72\xfe\xa1"
- "\xd5\x55\xb3\xf0\xfb\xa0\x1a\xe3\x70\x99\xe8\xde\x78\x0b\xe6\x30"
- "\x84\x75\x46\xa8\x6b\x4f\xbb\x58\x21\x26\x40\xec\x92\x84\xf8\x65"
- "\x9a\xe5\xb1\xc9\xd1\x63\x07\xaf\x18\xaa\x89\x4f\xd2\xc4\xd3\xdc"
- "\xf3\xf4\x04\x2c\xcb\xcb\xe3\x96\x26\x68\x30\x07\x78\xe7\x1c\xc4"
- "\xc1\xbc\x3a\xb4\x98\xca\x92\x8a\x3e\x74\xbf\x26\x5f\x34\xad\x38"
- "\x21\x85\xe7\x34\x0f\xdf\xc3\x5f\x53\x78\x8d\x69\xf3\xf2\x2c\xc6"
- "\xb5\x96\xcb\xd0\x10\x21\xde\xb1\xcf\x36\x7f\x82\xfb\xf7\xbc\x5b"
- "\xb3\xbc\x6c\xf1\x5f\x0c\x8a\x3e\x29\xd4\x4e\x92\xe5\x35\x11\x78"
- "\xb0\x59\xf8\x4e\xc6\x62\xfb\x09\xd7\xe8\x77\xe4\x2c\xaf\x18\x03"
- "\x89\x65\xf1\x2a\x8b\xa6\x79\xd3\x35\x58\xe1\x45\x7d\x35\x78\xcd"
- "\xb4\x62\x7e\x57\xbf\x12\x90\xe3\x14\xf4\x9b\x9d\xe5\x21\x5e\x4f"
- "\xae\xb3\x58\xbb\x5b\x47\x68\x30\x3e\x87\x35\xef\x91\x22\x2e\x68"
- "\x84\x86\xfb\x20\x40\x9b\xf6\x1e\x51\xee\x83\x39\xaf\xd2\x00\x7f"
- "\x3f\x4c\x1e\xfa\x3c\xb5\x51\x09\x7d\xfe\xf0\xf3\xd4\x5a\x25\x9f"
- "\x3b\x24\xa9\x25\x34\x30\xc7\x2c\xe4\xaa\xd6\x5b\xcc\xe4\x7f\x40"
- "\xcb\x06\x9d\xad\xd4\x14\x38\x16\x7e\x8f\xac\x37\x6f\x9d\xa0\xd1"
- "\x3d\xfc\x6b\x32\xfe\x51\xfe\x87\x2f\xca\x08\x69\x56\xf4\x59\xf8"
- "\xc5\x38\xd4\x23\x42\x8b\xcc\xea\xd0\x5d\xa6\xbc\xe1\x45\x18\x1b"
- "\xab\x2d\x6f\x82\xb6\x3d\xe8\x51\x72\x04\xea\x1c\x07\x3d\xe7\x84"
- "\x06\xf8\x77\x20\x51\xb6\x3d\xd2\x8f\xec\x6b\xcf\x51\x96\x97\x8d"
- "\x61\x36\xde\x28\x98\x33\x94\x9f\xee\x99\xfc\xc5\x27\x65\x04\x9e"
- "\x0d\xd7\x27\x2a\xff\x67\x54\xa7\xeb\x8b\xbf\x18\x56\x46\x5a\x31"
- "\x7e\x32\xe8\x91\x87\xce\x00\xde\xe5\x8d\x36\xec\x49\x36\x2b\x67"
- "\x19\x88\xb2\xb2\x36\x9f\xa4\x5c\x22\xf7\x5a\x7e\x08\x53\xfd\x15"
- "\xee\x6f\xc3\x78\xa7\x27\x82\x69\xdc\xc3\x54\x1d\xcd\x43\xeb\x5b"
- "\x05\xf2\x02\xf7\x43\x98\x57\xd5\x74\x1d\x81\xeb\x6f\x58\x7e\x17"
- "\x4c\x2a\x63\x8c\x44\x1f\x59\x44\xda\x94\xe1\x64\xff\xcc\x22\xf2"
- "\x2e\xe8\x24\xef\x5e\x23\x3e\x54\xf6\xed\x08\xf3\xb2\x74\x84\xa9"
- "\x2c\xab\xc3\x30\x0e\x15\xcf\xff\x10\xd6\x1b\x65\x61\xcb\xd2\x30"
- "\xef\x2a\x63\x11\x79\xb2\x91\x84\xb5\x29\x89\x6f\xdb\xea\xb0\xde"
- "\x55\xda\x7c\x68\x0b\x84\x5b\x18\x57\x8c\x81\x87\xb1\xf1\x70\x9c"
- "\xfa\x44\x92\xe9\xcd\x8a\x7b\x06\xf7\xae\x21\x81\x18\x83\x15\xe5"
- "\x4b\x8c\xd7\xcc\x05\x8c\x36\x58\x03\x86\x17\xa5\xde\x80\x7e\x61"
- "\x8c\xa1\xbd\x03\xd4\x28\x9f\x83\xec\xa1\xc0\x77\xe6\xf8\xb0\xde"
- "\x73\xf1\xb8\xa5\xff\x1b\x28\xa3\x73\xad\xc1\x98\xe3\xc9\x1b\xfb"
- "\x89\xf9\x96\xd7\x5c\x80\xb1\x4c\x0b\x53\x41\x3d\x1f\x38\xdf\x57"
- "\xdf\x6c\x26\xd6\xc7\x07\x68\x9e\xd0\xd2\x3c\xba\x01\x85\xa9\x44"
- "\x9d\x93\x4a\x02\x34\x23\x29\x2f\x8d\xb7\xee\x19\xa0\xe6\xb3\x82"
- "\x03\xd0\xf6\xc2\xce\xf5\x1e\xac\x99\x40\x88\xe6\xd7\xf8\x7f\xaf"
- "\x4a\xcd\xb3\x40\xc3\x80\xd1\xe1\x54\x7f\x40\xfd\x54\xd1\xeb\x30"
- "\xe3\xf1\x5e\xfb\xdb\xbc\xe6\x47\x72\x59\x5b\x13\xb8\xb5\xaa\x10"
- "\xcc\xb1\x7d\x4d\xd1\x6b\x07\x9f\xfd\x1f\x99\x7c\xee\x04\xca\x8b"
- "\x50\xde\xd6\xe6\x05\xb2\x42\xf6\x7f\x34\x42\xfb\x63\xda\x14\xaa"
- "\x1a\xf8\xd5\x0a\xf7\xe7\xe0\x7b\x5b\x77\xf5\x5b\x8f\xef\x4d\xf3"
- "\x02\xc1\x7b\xcd\x05\x9a\xf1\x41\xcf\x1a\x69\xac\xfc\x0e\x18\x5f"
- "\x21\x6f\x2a\x8e\x07\x8e\x01\xd7\x11\xd6\x9b\xbe\x6b\x47\x98\x0f"
- "\x8c\x2f\xc6\x5b\xf6\x4d\x9d\x07\xf7\xe4\x8d\x56\xc1\xb5\xbe\x6d"
- "\x01\xa3\x47\x61\x7e\x2e\xbd\xd6\x48\xac\x5b\x47\xd3\x78\x82\xdb"
- "\x92\x61\xce\x05\x3e\x6b\xe4\xb7\x8e\xf6\x11\xe6\x16\xc1\x7e\x72"
- "\xd9\xc5\xc3\xdb\x70\x1f\x1d\xf4\x0d\xfa\x07\xeb\xb2\xaa\xd6\xa0"
- "\xe8\x15\xd0\x36\xb8\x5f\xbe\x41\xe1\xdd\x08\x7d\x0d\xe1\xb3\x86"
- "\x8d\xc3\xff\xe1\x5a\x08\xf4\xd9\x8a\xe3\x80\xe3\x21\x8c\xc5\x0d"
- "\x69\x2c\x66\xa5\x43\xbd\x06\x2e\x2b\x27\x18\xda\x28\xe3\xb3\x7e"
- "\xa5\x92\xea\xf5\xee\x2f\xd5\x8b\x09\x65\xf5\xb6\x97\xb3\x7a\x23"
- "\x52\xe0\xfa\x7e\x36\xde\xbd\xe7\x75\x1e\xef\xde\xaf\x49\xf7\x46"
- "\x54\xb0\x7b\xdf\x8c\x64\xf7\x6a\xf0\xde\xcd\xf2\x3e\xf5\x7e\x4b"
- "\xaa\xff\x3b\xc2\xea\xa7\x7b\xb3\xfa\x0f\x4e\xb4\xab\xf7\xb1\x54"
- "\xef\x95\x0d\xac\xde\x9f\x8a\x58\xbd\xc1\xc5\x70\xfd\xaa\x93\xbe"
- "\x5c\x92\xee\x49\x50\xb3\x7b\xde\x3f\xc0\xee\x09\x1f\x05\xfc\xd4"
- "\x5f\xde\x97\x3e\x81\x52\xfd\x25\xc2\x7b\x17\x4d\x62\xf5\x9f\x6d"
- "\xb0\xab\x37\x96\xd5\xc3\xeb\x7f\x85\x7a\xbd\x4a\xdb\xbc\x56\x99"
- "\x58\xbd\xf1\x99\xc8\x8f\x50\x67\x36\x97\x75\xff\xae\x36\xaf\xa0"
- "\x1c\x68\x67\x37\xd0\x26\x18\x8f\x40\xbb\x60\x2e\x27\x14\xfa\xed"
- "\x1d\x8a\xdf\x70\x10\x73\x0d\x0a\x2f\x15\xe0\xae\xd5\xa9\x9d\x2b"
- "\xab\x4f\x81\xcd\xce\xc6\x81\x6c\xb0\xf5\x61\xa7\x71\x36\x69\x5e"
- "\x66\x94\x0f\xf2\x06\x69\x72\x38\x96\xdf\x1d\x78\x14\x64\x9b\x3e"
- "\x47\x61\x2d\x4c\xa7\x71\x95\x73\x47\x14\x71\xa1\x80\xb1\x57\x89"
- "\x87\x3e\xa5\x91\x94\x70\x8d\xca\x9c\x76\xa2\xaa\x82\x75\x06\xeb"
- "\x97\xc0\x9a\xaa\x59\xe2\x01\xeb\x6b\x9f\xb3\x39\x37\x85\xf6\x8a"
- "\xa6\x95\xa4\x2d\x66\x39\xad\x51\xae\x42\x6c\x86\xf9\xe8\x43\x73"
- "\xad\x2d\x41\xb9\xc2\xc7\x0f\xfe\xf7\xc6\xba\x6d\x8f\xf8\x0f\x6b"
- "\xfb\xf3\xb4\x92\xf6\xa0\x30\xd2\xfe\x41\xa0\xba\x23\x68\x44\x51"
- "\x47\xde\x70\x8d\xe5\xcf\xd3\x34\x96\x47\xfa\x95\x58\x83\xc2\xd2"
- "\xe1\xd9\x80\xdb\xf9\xca\xbd\x5c\x89\x72\x6f\xaa\x4e\x89\xed\x7e"
- "\x9e\x5a\xa4\x3c\x94\x5a\xad\x3c\xc4\x95\x2a\x3f\x4f\xcd\x81\x63"
- "\x31\xe6\xdd\x02\x59\xce\x67\xde\xa1\xd4\x72\x58\x37\x7c\x60\xbc"
- "\xfa\xac\x17\xed\x94\xfc\xf3\x16\x52\x55\x6c\x21\x47\x13\x6e\x10"
- "\xa3\x5f\x68\x31\xfc\x76\x1b\x03\x47\x87\x19\x03\x27\x68\x68\x9f"
- "\x83\xc6\xd0\x77\xc4\x7d\xa8\x87\x38\xd6\x67\x61\x3c\xb0\xcd\x63"
- "\x85\x1c\xfa\x88\x08\x31\xa7\x15\xf7\x66\x76\x8a\x39\xad\x64\x39"
- "\xdf\x6c\x71\xa7\x7f\x8e\x98\xd3\x82\x8d\x80\xc6\x9c\x06\x7d\x8f"
- "\xea\x7d\xb0\x7e\xd1\x3c\x91\x16\x90\xcf\xb6\x3e\x8d\xf1\xfb\xf1"
- "\xdb\x96\xa9\x35\xeb\xde\x12\x51\x3f\x43\x19\xc3\xba\x39\xb4\x14"
- "\x7e\x9f\xc0\x79\x98\xa3\x1f\x6b\xc4\xf3\xfc\x96\x26\x1d\xda\xcb"
- "\xad\x7c\xcc\x6f\x5a\x71\x6f\x25\x1f\xf3\x5b\xeb\xd6\x47\x72\xac"
- "\x5b\x27\x10\x38\x37\x06\x7e\x63\xad\x9b\x9b\xca\xe0\x57\x0e\xbf"
- "\x0a\xf8\x55\xc3\xaf\x06\x7e\xb5\xf0\x33\xc0\xaf\x01\x7e\x8d\xf0"
- "\x6b\x86\x9f\x11\x7e\x26\xde\xaf\xa9\x0e\x63\x66\xf2\x5b\xbe\x47"
- "\x3e\x08\x16\xdb\x95\xc6\xb7\xef\xe3\xf0\xbe\xe1\x28\xff\x70\xd9"
- "\xff\x41\x73\x00\x20\xcf\xf3\xef\xfb\x97\x22\xee\xf2\x83\x03\x73"
- "\x8c\x03\xa7\x15\xc1\xcf\xdb\xe8\x17\x19\x05\xbf\x18\xf8\x69\x8d"
- "\x5b\x47\x87\x03\xfd\xbc\x81\x8e\xd5\xad\x59\x7d\x61\xce\x04\x52"
- "\x5b\x04\xfc\x5f\x00\xff\x6f\x10\xfe\x87\xb9\xe2\x47\xe3\x1c\x1b"
- "\x03\xc7\xe4\x40\xb9\xd4\xa0\xe8\x47\xeb\xb5\x04\x8d\x8e\x10\xf6"
- "\x64\xa6\xc3\x79\xd0\xff\xfb\xe4\xb0\x7a\xc3\xd5\xf6\xf3\x65\xf1"
- "\x02\xed\xdc\xc5\xf3\x92\xe6\x2e\x8f\x8b\x5d\x10\xbd\xfc\x59\xcd"
- "\xe0\x85\x9a\xb0\xd8\xf8\x65\x73\x97\xad\x88\x5e\x11\x4d\xc5\x26"
- "\x38\xf5\xa8\xdc\xdf\xcc\x82\xb9\x0b\x40\xbe\xef\xdb\xc0\xf3\xb8"
- "\x5e\x4d\x32\x01\x8f\x3d\x3c\xad\xe4\xc0\x35\xa3\xd2\x0a\x72\x8b"
- "\x4f\x43\x3a\xcc\xbb\x11\x45\x07\xae\x99\x95\x3e\x0d\x1a\xc2\x03"
- "\xaf\xe3\x35\x7d\x43\xb5\x20\xc7\x7c\x49\x2a\x50\x8e\x81\x3a\x7b"
- "\x97\x98\x95\x53\xf0\xfe\x0f\xfa\x95\xec\x83\xff\xe1\x9c\x06\xef"
- "\xe3\x41\xb6\xa1\x47\x90\x6d\x58\x39\x8c\x1c\xa2\xc7\xe1\x9a\x43"
- "\xb4\x5e\x58\xfa\xe7\x78\xbc\xb9\x86\xaf\x80\x76\xd1\x36\xc6\x7f"
- "\xe0\x3f\x8c\xd6\x81\xb9\x46\xeb\xc0\x3c\xab\x57\xa8\x17\x62\x3d"
- "\xaa\x2b\x40\x1f\xf7\x41\x3f\xd2\x56\x10\x95\x38\x77\x51\x1f\xb0"
- "\xcd\xdf\x44\x94\xf3\x7c\x2b\x71\xfe\x62\x7f\x78\x98\xaf\x7b\xe0"
- "\xde\xbd\x4b\x98\xfe\x04\x3a\x93\x07\xea\x4a\x88\x11\x88\x0d\xfa"
- "\x94\x6a\x7a\x7f\x09\x57\x0d\xba\x96\x07\xdc\xab\xbe\x17\xaf\x15"
- "\x80\x6c\x56\x40\x65\x71\xb5\x4d\xfe\xdd\x10\xc4\x62\xb3\xf9\x44"
- "\x01\x5f\xcc\x27\x0f\xc1\x73\x06\xe2\xf8\xe1\x78\xe1\xb7\x52\x3e"
- "\xab\xaf\x01\xe3\x22\xec\xf0\x27\xde\x96\xc0\x08\x33\xb5\xad\x64"
- "\xa9\xd7\x8b\x32\xa5\x29\x20\xc2\x6c\x4f\x37\x46\x2f\x4d\xf4\x92"
- "\x79\xf3\xe3\xa2\x17\xd2\xcf\x6b\xf3\x96\x2f\x5f\xb1\x38\x5a\x13"
- "\x3d\x6f\x41\x8c\x86\x5e\xd6\xac\x58\x0e\x55\x62\x13\x96\x6b\x96"
- "\xae\x5c\xa2\x59\xbc\x3c\x16\xa5\xe3\xe8\xf8\xf8\x15\xda\x84\xde"
- "\x84\xdd\xa9\x59\xbc\x22\x2e\x21\x56\x0b\xff\x2c\x8f\x5e\xb2\x50"
- "\x43\xa9\xbe\x1c\x9a\x8a\x8b\xd3\x08\x4f\x58\x1e\x33\x2f\x1e\x19"
- "\x61\xc9\x1f\xa0\x92\xdd\xfd\x72\xd9\xd9\x07\x63\xdf\xa1\xcf\xd5"
- "\x35\x85\xdf\x95\x32\x15\x8c\x75\x6e\x84\x19\x7d\x15\xa0\xdc\x48"
- "\xf5\xa9\x2c\x75\x3e\xda\x94\xdf\x81\x77\x6c\x01\x9e\x6f\xcd\xf2"
- "\x5b\x28\xbe\x1b\xb5\x31\x63\x3c\x50\x8c\x35\xab\xf0\x3b\x45\xf7"
- "\x06\x03\xff\x53\x5f\x96\x2c\xf5\x5f\xd9\x58\xf8\xe5\xda\xdb\xb0"
- "\xa8\xcd\x54\xe1\xb7\x07\x7d\xe6\x60\x0e\x34\xa2\x4c\x20\xe4\x6f"
- "\x50\xc0\x3d\xa7\xf1\x1e\x6e\xeb\x04\x58\x2f\xfc\x2a\x24\xb9\xdc"
- "\x6f\x17\xd6\xa7\xf5\xb2\xd4\x37\xf9\xc0\xd1\xe1\x70\x6e\x3d\xf6"
- "\xcb\xc5\x1a\xa2\xb9\x09\xed\x9e\x28\x21\xe4\x57\x01\x24\xec\xe6"
- "\x96\x21\x86\x56\xff\x50\x5d\x7b\x06\xb9\xa7\x1d\xe6\xb1\x59\x49"
- "\x1e\x6a\x03\xbe\x58\xf5\x14\xf1\x58\x33\x99\x28\x4b\x16\x95\x60"
- "\x3c\x63\x52\x31\x31\x9f\xe8\xa3\x40\xa7\x36\xef\x26\x15\xba\x7a"
- "\x52\x69\xf9\x88\xe5\x04\x49\x46\xb9\xba\xdf\x64\x8c\x5f\x97\xb6"
- "\x86\xb7\xee\xfb\xcc\xe8\xb9\xb7\xa9\x04\x73\x79\x3c\xa4\xb7\x9c"
- "\xd7\xe9\x53\x76\x11\x7d\x92\x5e\x87\xb1\x43\xae\x29\xfc\x9f\x39"
- "\x04\xd7\x7a\x55\xc0\x7d\x53\xc8\x3d\x50\x7e\x1c\x9f\xb1\x3e\x8f"
- "\xaf\x7d\x2b\x88\xaf\x7b\x2b\x8f\x37\x00\x4f\x35\x00\x4f\x35\x6e"
- "\x0c\xe2\x9b\xd1\x17\x00\x7d\x1e\x90\x4f\xb5\x89\x24\xb8\x49\xe1"
- "\x5f\x46\x75\xfb\x71\xb4\x7c\x3f\x94\xe9\x9e\x79\x7d\x52\x1e\x96"
- "\x1f\x80\x72\x03\x2b\x17\x62\xf9\x41\x28\x9b\x58\xf9\x0b\x2c\x87"
- "\x34\x29\xfa\xa9\x58\xb9\x8a\xd0\x18\x18\x8a\x7e\x01\xac\xfc\x35"
- "\x96\x61\xec\xfb\x85\xea\x12\xb1\xbf\xe7\x80\x66\xfd\x9e\x4a\x3b"
- "\x0b\xfa\x59\xd2\x65\x3a\x1f\x3e\x4f\x8d\x41\xdb\x03\xcc\x07\xff"
- "\x4f\xfb\xd4\xa1\x6e\xd7\x6f\xba\xd7\x30\x3c\xfa\x47\xfa\x9a\xc9"
- "\x3d\x20\x2b\xf5\x81\x6b\x83\x71\xec\x9c\xda\x5a\xf6\x06\x9e\x9f"
- "\x6a\xe1\x75\xfc\xfb\xfd\x8a\xf9\xad\x23\x35\xfc\xfb\x01\xe8\x53"
- "\x08\xeb\xd8\xc3\x86\x92\x64\x33\x8d\x29\x0d\xf2\x29\xcc\xa1\x7e"
- "\x9b\xb1\x4f\x46\x90\xf7\x5c\xc4\x98\x55\xf3\x5b\x87\x68\x40\x8f"
- "\xca\x9f\x1c\x66\x41\xdf\x66\x90\x71\x03\x06\x1f\x8d\x41\xb9\x60"
- "\xcc\x3b\xdc\xae\x00\x23\x97\x16\x49\xf8\xd0\x7e\xc5\x93\x63\x78"
- "\x1d\xac\x51\x0a\x66\xab\xe6\xf1\xf9\xe7\xe9\x73\x07\xf7\x2b\xe6"
- "\x56\xc6\x60\xae\x27\x8a\x2f\xa9\xb8\x5e\x27\x02\x9e\xac\x8e\xf4"
- "\xb5\x6e\x1d\x93\x73\x34\xe6\x92\x7b\x79\x83\x14\x01\xa1\x2e\xfd"
- "\x9b\xa0\x4f\x18\x63\xd5\x02\xcf\xb1\xc0\xbb\xa2\x6c\xb0\x97\x2b"
- "\x57\x82\x8c\x52\xbc\x67\x7e\xad\x27\xbf\x32\xd2\x17\xde\xe9\x29"
- "\x7d\xd8\x0d\x52\xd5\x8e\x73\x25\xa0\xe1\x68\x12\x21\xe3\x93\x2c"
- "\x3a\x5f\x23\x8d\x85\xad\xd6\x2e\x22\x03\xf8\xc0\x21\x9a\x26\x45"
- "\xe0\xf0\x29\x29\xf0\x0e\xf0\xee\x87\xea\x6b\x55\x1c\xbc\xc7\x93"
- "\x6c\xdc\xe0\xbe\x40\x58\x7f\xfa\xe5\x8b\x72\xbd\x9b\xfd\xa7\x7c"
- "\xc3\x2d\x8f\x24\xb8\x67\x79\x1f\xc8\x23\x5c\x47\xa4\x2f\x07\xeb"
- "\x0f\x5e\x3b\x1a\x76\x95\xe0\x33\x85\xb1\x66\xb1\x77\x42\x61\x9c"
- "\xe1\xf9\x18\x83\x5b\x1c\x57\x58\xc3\x82\xad\x1d\x31\xce\xe9\x9f"
- "\x37\x26\x0a\xfa\x97\xc3\x6f\x6e\x72\xba\x67\x11\xd6\xf1\x4d\x8c"
- "\x3f\xfc\xcb\xe1\x57\xcb\xbf\x37\x4d\x6d\x1c\xec\xdf\x48\x73\x71"
- "\xe6\x3d\x9d\x23\xda\x48\x60\xbe\x01\x8f\x04\x7e\x5a\x02\xba\xb0"
- "\xf3\xb8\x83\xa9\xb5\x34\x07\x9a\xe7\x79\xde\xd7\x8a\xb9\x7d\x6f"
- "\x60\x3c\xf7\xda\xa3\x61\x26\x37\x69\x1a\x68\x76\x45\x53\x6c\x1f"
- "\x74\xea\x0e\xf7\xda\x0b\x9a\xe8\x92\x47\x76\xc1\xb8\xa8\x9b\x4a"
- "\xda\xf9\x71\x0a\x26\x7b\xdf\x77\x15\xc7\xca\x02\xeb\x48\xf2\x29"
- "\xa2\x34\xc3\x7a\xf9\xd1\x2b\xeb\x95\x43\x61\x9d\xb1\xc2\xda\x7f"
- "\xac\xba\x8c\x4c\x9d\x44\xd2\x2a\x63\xae\x13\x31\xb7\x19\xac\x6b"
- "\x9a\x0f\x5f\x31\x2a\xf1\x9b\x11\xe6\x32\xa3\x7a\x6a\xde\xb3\x51"
- "\x7f\xfd\x1a\xd6\x4c\x90\x1b\xf6\x7c\x6d\x54\x5a\x5a\x22\x35\x34"
- "\x9e\x3c\xe8\xe4\x69\x31\x3c\x67\xfb\x8e\x84\x39\x47\x72\xfa\xc7"
- "\x61\xae\xe8\x13\x11\xd5\x74\x8f\xff\x89\xc8\x32\x72\xa2\x2e\x9f"
- "\x54\x34\x9c\xc5\xbd\xcf\xef\x9d\x88\xcc\x41\x79\xb1\xaf\x05\x64"
- "\xc2\x77\x41\x26\x84\xf9\xda\x8b\x53\xa7\xd6\x8a\xdf\x92\x30\xf7"
- "\x99\x28\x0f\x5a\x60\x8e\x16\x08\xf9\xcd\x2c\x59\x81\x75\x05\xc2"
- "\x77\x25\xcc\x7b\xb6\x3d\x91\x84\x6e\x57\x72\x91\xce\xbe\x21\xf5"
- "\x5d\x46\xfd\xa3\x83\x39\xbf\xd4\x5a\x31\xff\xd9\x94\x65\x1a\xf2"
- "\xdf\xf0\xee\x47\xc3\xdc\x9d\x93\xf7\x51\xff\x17\x0b\xf0\x9d\x05"
- "\x78\xce\x02\xe3\x09\x34\x28\x06\xba\x39\xd5\x41\x44\x1a\x74\xa4"
- "\x89\x34\xb8\x7f\x0d\xa5\x01\xe8\x2e\xab\x5f\x13\x68\x70\x06\x68"
- "\xd0\x00\x34\xc8\x20\xe9\xc7\xa7\x57\x90\xa9\x11\x40\x83\xe6\xeb"
- "\x98\x8b\x80\xe5\x97\x4b\x60\x63\x4f\x69\x71\xc6\xa8\xac\x32\x31"
- "\x1a\xec\x9e\xc9\x68\xb0\x77\xa6\x11\xe4\x98\x7e\xe4\x43\x28\x5b"
- "\x57\x46\x6a\x30\x1f\x14\x9f\x11\x85\xb9\xb0\x19\x2d\x3a\x80\x16"
- "\x1d\x8c\x16\xa9\xcb\x80\x16\x35\xb5\x34\x0e\xd5\x89\xba\x0a\x52"
- "\x11\x55\x44\x2a\x01\x97\x80\x16\xf3\x90\x2e\xa8\x57\x5b\x57\x87"
- "\xf9\x83\x1e\x1d\x50\x90\x4c\x82\x45\x7a\x80\xde\xde\x7b\x63\x32"
- "\x41\x9f\xde\x61\x30\x37\x45\x7a\x04\x50\x7a\x5c\x15\xe8\xd1\x8e"
- "\x7e\x71\x40\x8f\x76\xa0\x47\x3b\xd0\x23\x83\xd1\x03\x71\x7e\x8a"
- "\xc9\x97\xe7\xbe\x0f\xc3\x38\x15\x9d\xe9\xb1\x5a\xa0\xc7\x99\x5b"
- "\xa1\xc7\xfd\x13\x3b\xd3\x23\x78\x68\x77\xf4\x90\xe6\xc4\x83\x03"
- "\x91\x1e\x1d\x45\xc2\x9c\x78\x04\xe7\x44\xba\xf2\x57\xb0\x16\xe1"
- "\x98\x1e\xab\x3e\x40\xe7\x04\xbc\x6b\xfa\x87\xaf\x98\x95\x15\x0d"
- "\x40\x97\x85\x42\xce\x33\x81\x2e\x8c\x1e\x23\x34\xc5\x5f\xb3\xf1"
- "\xd7\xbc\x84\x6b\x06\xce\x0d\xa4\x0f\xd0\x09\xe6\x8f\xb3\xdc\x80"
- "\xf6\xdf\x5b\xa1\x4d\x0e\xe7\x09\xce\x11\x9c\x0f\x95\x31\x67\x69"
- "\xae\xf5\x13\x11\xe5\x04\xbf\xbb\x9e\x88\x3c\x00\xb4\xca\x27\xd6"
- "\x95\x40\x9b\x44\xdc\xc7\x41\x06\x62\x8e\xc0\x13\x91\xeb\x51\x5e"
- "\x50\x03\xcf\xf7\xb2\x02\x9d\xac\xad\xc1\xbd\x37\x80\x0e\x85\xdf"
- "\x63\xed\xbf\xc3\x62\x3e\x64\xde\x2b\xb0\x0e\xce\xab\x2c\x40\x23"
- "\x98\x3b\xb2\x39\x63\xcb\x93\x7c\x31\x8c\xec\xa8\x27\xde\xf7\xc6"
- "\x32\x1a\x59\xed\xe6\xcc\xe4\x58\x9c\x33\xe9\x40\xa3\x53\x6e\xd2"
- "\xe8\x01\x96\xff\x33\x08\xb0\xda\xaf\xa9\x04\xd6\x49\xa0\xd1\xfd"
- "\x07\x5c\xd1\xc8\xba\xcb\xbf\xdc\xaa\x0e\xdd\x85\x39\x11\xb8\xa5"
- "\xd3\x15\x1c\xe8\x4b\xed\xa0\x97\x9e\x30\x5a\x48\xca\x6c\xa2\x4c"
- "\x3e\x4b\xbc\xf4\xd3\xbf\x24\x7a\x43\x29\x8d\x67\x8e\xf6\x5e\xcc"
- "\x33\xa2\xb7\x94\x02\x5e\x4d\x48\xc7\xf2\x0e\x5a\x36\x92\xd5\xb3"
- "\x89\x07\xcd\x1d\x1a\x59\x44\x36\x00\x7f\xee\x99\x59\xa4\xe4\x72"
- "\x87\x24\xf1\x6a\xcc\x8f\x44\x74\x55\x5a\x0b\xc6\x63\xf3\xa9\x8c"
- "\xa9\xc0\x18\x96\xe7\x31\x5e\x78\x95\x09\xda\x34\xf2\xed\x56\x58"
- "\x33\x0a\x33\xf8\x52\xcc\x19\xf1\x24\xae\x11\x18\x63\x4e\xf1\xa0"
- "\x15\x65\x11\xb4\x7b\xe9\x52\xb7\x83\xec\x15\x42\xf7\x41\xc0\x39"
- "\x45\xe5\x22\x13\x5c\x7f\x68\x19\xf6\x8b\xd9\xa0\xd9\xf1\x49\x8c"
- "\xfd\x1d\x34\xe1\xc8\xc1\x54\xa3\x2a\x07\xf4\x5d\x90\xd1\xa0\x5e"
- "\xc8\x64\x1a\x3b\x66\x4b\x93\x59\x5f\x63\xa6\xf6\x47\x63\x5a\x8c"
- "\x57\x4e\x32\xfa\x5e\x61\xfe\x09\x5c\xb3\x1f\x1a\x88\xfe\x1a\xfc"
- "\x2e\x58\xaf\x82\x9e\xce\x29\x99\x6f\x54\x4a\xeb\x72\x48\x12\xac"
- "\x67\x8d\xe3\xc3\xf8\x34\xcc\xd3\x71\x08\xde\x0b\xf5\xa0\x8f\xea"
- "\xcd\x14\x53\xfe\x3a\x7f\xbd\x12\xed\x23\x66\xc0\x87\x8a\xaf\xff"
- "\x46\xf3\xb9\x5e\x56\xf4\x7f\xeb\x78\xa4\x85\xe0\xf3\x67\x3c\x8a"
- "\xdf\x18\x42\x0e\xb4\x29\x8b\xa2\xda\xbc\x82\x46\xa5\x35\x48\xb9"
- "\x2c\xed\x73\x56\x22\xce\xec\x99\x0f\x6d\x22\xce\xd4\xa7\x2b\x19"
- "\xb6\x84\xa3\x8d\xce\xdb\x11\x5b\x2a\x9b\xaf\x92\x54\xe0\xe3\xca"
- "\x98\x22\x9a\x4b\xa5\x2f\xe0\x3b\xb7\x1a\xf0\xa4\x03\xf4\x7d\xc0"
- "\x13\xc4\x81\x42\xc0\x0f\x6e\x35\xe8\xf9\xed\xa0\xe7\x0b\x38\x82"
- "\xb2\x17\x1e\x67\x03\x8f\xfa\x96\xc3\x39\xa0\x13\x07\xb8\x0e\x78"
- "\x12\xf6\x6e\x32\x09\x7d\x17\x78\x74\x07\xe2\x08\xc8\xc5\x53\xb4"
- "\x80\x23\x2b\x01\x47\x12\x69\x4e\xe1\xe0\x42\x25\xc3\x8f\xcf\xea"
- "\xd7\x2b\x73\xc4\x9c\xe2\x74\x7c\x07\xf4\xaf\x42\xfe\x88\x4a\xc7"
- "\xbe\x2a\xad\xb8\x3e\xad\x8e\xf4\xa8\x32\x01\x8f\xe4\x4d\xd0\xe2"
- "\x39\x3a\x6f\x57\xc6\xf4\xe6\x18\xaf\x85\xe3\x98\xec\xbc\x46\x86"
- "\xd1\xbc\x9b\x3f\x04\xf7\xde\xb4\x84\x0c\x2d\xbc\x46\x42\x0b\x97"
- "\x90\x30\x98\xaf\xca\x42\xe8\xc3\x9c\x65\x6a\x42\x73\x96\x78\x05"
- "\x85\xc3\x79\xa7\x39\x4b\x40\xae\x0e\x2e\xc4\x39\xb3\x34\xcc\xd6"
- "\x27\x4b\xce\x4c\xad\x15\xc6\x8e\xc6\x77\x53\x0c\x58\xc1\xfc\xa9"
- "\x7d\x0d\x4c\xce\x1f\x20\xc4\x19\x0a\x68\x00\x5d\xe5\x9e\x26\xc5"
- "\x80\xd9\xfc\x96\x90\x5a\x6d\x32\x51\x34\x89\xd7\x40\xf6\xe4\x80"
- "\x56\x4f\xa4\x93\x74\xce\x2f\xb3\x5c\x9f\x74\x15\x73\x00\xb8\x39"
- "\x0f\x07\xd0\x7d\x69\xd6\x9c\x99\x09\xd4\x0f\x68\xcb\xcc\x94\x9d"
- "\x4d\x64\x18\xff\x47\xa0\xc7\x22\x78\xd7\x26\x12\x5a\xd0\x04\xef"
- "\xba\x92\xbd\xab\x98\x43\x9d\xcb\x28\x8a\x81\x6b\x5d\xe6\xfb\x32"
- "\xfe\x11\xf3\x7d\xf9\x94\x00\x86\xf5\xe3\x1f\x46\x1f\x63\x1a\x7f"
- "\xa7\x55\x6f\x39\x4b\xf0\xb9\x68\x1b\xd2\x5f\xa7\x3c\x3d\x0d\x79"
- "\x99\x2b\x9a\xa6\x9e\x5b\x07\xbc\xdd\x1a\x83\x76\x32\xf5\xa1\x7a"
- "\x23\xc6\xbb\xa1\x32\x9f\x41\x11\x92\x8e\x72\xda\xe7\x70\x0e\x79"
- "\xdf\x8e\xe7\xd3\x91\xe7\xf1\x3a\xe5\x7b\xb8\x4f\x5f\x77\x89\x60"
- "\x7b\xf6\xed\x20\xfd\xc5\xb6\x2e\x2b\x34\x23\xb0\x2d\xe4\x05\xb4"
- "\xe9\xe0\x5c\x63\xb4\x2f\x45\x7f\xf2\x60\x3e\xe8\x51\xa1\x6c\xc4"
- "\x5c\x36\x6a\xe4\x01\xca\x2b\x80\xdf\x18\x5f\x99\xe7\x23\x3d\x80"
- "\xcf\xb0\x9f\xbd\x81\xde\xc3\x44\xbe\x80\x73\x01\x8e\xbc\xd1\x77"
- "\xad\x1a\x75\x9a\x00\xfc\xbf\xa7\xfc\xe1\x1e\xfd\x34\x2e\xf3\x45"
- "\x71\xa1\x20\xdf\x02\x5e\x22\x6e\x5a\x5b\xec\x30\xb3\x99\x61\x26"
- "\x62\x92\x88\x9b\x14\x9b\x68\x1e\x87\x52\xf4\x45\x8d\xa1\x7d\x74"
- "\x13\x37\x2b\x9b\x25\xdc\x9c\xa2\xb5\xc3\xcd\x66\xbe\x9d\x1b\xec"
- "\x0c\x37\x07\x8e\x90\xe3\xe6\xc0\x67\xe4\xb8\x19\xba\xc3\x11\x37"
- "\x3b\x63\xe6\xc0\x55\xce\xf0\x12\xf4\x98\x87\x9a\x14\xa1\x93\x5c"
- "\x63\xe5\xc0\x5d\xee\x63\xe5\xc3\x9f\xca\xb1\x72\x60\xe3\xff\xbf"
- "\x58\x39\xe8\x45\x19\x56\xaa\x7b\x88\x95\x4d\x14\x2b\x03\xf8\xef"
- "\x61\x4e\x08\xf8\x51\xb8\xc8\x05\x56\x2e\xea\x66\x2e\xfc\xd1\x15"
- "\x56\x0e\x7a\x4f\x8e\x95\x83\x6a\xe4\x58\x39\xe8\x2d\x09\x2b\x85"
- "\x6b\xb7\x05\x2b\x07\x15\xdd\x1d\xac\x1c\x54\x44\xb1\xf2\x1a\x62"
- "\x65\xe8\x9a\xee\xb1\x72\xe0\x6e\xe7\x58\x09\xe7\x29\x56\x0e\xdc"
- "\x2d\x61\xe5\xd9\x6e\xb0\x72\xf0\x3c\x37\xb0\x32\x80\x62\xa5\xda"
- "\x05\x56\x2e\x82\xb1\x12\xf8\x82\xf2\x9e\x03\x6f\x08\x58\x19\x6c"
- "\xc3\xca\x1e\xf0\x87\x7b\xf4\x1b\x1c\xd5\x15\x56\x72\x39\x4c\xbe"
- "\x44\xac\xe4\xfd\x05\xac\x8c\xb3\x90\xe4\xd3\x80\x91\x35\x4d\x34"
- "\x5f\x0d\xf5\xe1\x85\x5f\xca\x6b\x88\x45\xc3\x8b\xf6\xc2\x78\xe9"
- "\x0d\x25\x14\x9b\xa8\x2f\xea\x24\xc4\xaa\x12\xa8\x9b\x6f\x93\x3b"
- "\x29\x76\x9e\x16\xb0\x73\x96\x80\x9d\x73\x7e\x02\x76\xce\x44\x5a"
- "\x3e\xb2\xac\x4d\x29\x62\xe7\x16\xc0\xce\x47\xa8\xfc\x80\xdf\x33"
- "\x19\x76\x3e\x7a\x55\xec\x17\xda\x34\xf5\x09\xdb\x09\xeb\xd7\xf5"
- "\xce\x38\xfa\x12\x6d\xef\xa8\x6e\x51\x33\xb1\x61\xe9\x2c\x09\x4b"
- "\xa1\xad\x1d\xae\x71\xf4\x91\x66\x1b\x8e\x66\x00\x8e\x9e\xb3\xc3"
- "\x51\xd0\x9b\xfe\x8a\x98\x07\x38\xda\x4a\x71\xf4\x33\x01\x47\x87"
- "\x58\x8f\xcf\x02\x1c\x7d\x49\xc4\xd1\x21\xc3\xcc\x19\x45\x51\xe6"
- "\xac\xee\x71\xb4\x95\xe2\xa8\xf6\xce\xe3\x68\x99\x03\x8e\x82\xee"
- "\x8a\x79\xd4\x9d\xe2\xa8\xc8\x8f\x14\x47\xd3\x25\x1c\xa5\xe3\x1a"
- "\xb6\xad\x2a\x0a\xc6\x3d\x4a\x4b\x75\x37\x1b\x8e\x6a\x4b\x18\x8e"
- "\xc2\x39\x6a\x3f\x59\x0e\x38\x0a\xfc\x97\x56\x89\x71\xfc\x48\x38"
- "\xf4\x51\x8d\xf8\xba\x13\xe6\x0c\x8e\x91\x0d\x4f\x17\xc1\x9c\x41"
- "\x8c\x69\x81\x39\x03\x38\x3a\xe7\x86\x9a\xd0\xf9\x92\x05\xf3\xa5"
- "\xc9\x45\xbe\x3c\xd1\x5f\xd6\x25\x9e\x86\xfd\x28\xc7\xd3\x47\x43"
- "\xe5\x78\x1a\x76\x5a\xc2\x53\xe1\x1a\xe2\x29\xd0\x0c\xc6\xa7\x1c"
- "\x31\xf5\xd6\xf0\x34\xcc\x68\xc3\x53\xa5\x80\xa7\x8b\xba\xc7\x53"
- "\xfa\xdd\xcf\x05\x9e\xda\x63\x83\x6b\x3c\x0d\x33\x4a\x78\xfa\x68"
- "\xa5\x0d\x4f\x6b\x5d\xe1\xe9\x23\x26\xe7\x78\x0a\xe7\x29\x9e\x3e"
- "\x62\xb2\xe1\x69\xad\x13\x3c\x7d\xc9\x1e\x4f\x1f\x3b\xc8\xf0\xb4"
- "\x84\xe2\x26\x62\x6a\x95\x09\xf8\x03\xe7\x5c\x42\x3e\xc5\x54\x0e"
- "\x30\x15\x73\x08\x63\xfe\x28\xf4\x81\x77\x86\xa9\x0c\x73\x0d\x04"
- "\x71\x15\xe7\x66\xda\x64\xd0\x77\x61\x2d\x82\x31\xa1\x6b\xaf\x38"
- "\x7e\x3b\xed\xf0\x75\xee\x2a\x35\xca\x76\x32\x5e\xe1\x44\x5e\x69"
- "\x09\x43\x1f\x59\x19\xaf\xb8\x47\xcb\xc7\x0e\xb8\xc2\x56\x57\xba"
- "\xfb\x71\xd4\xdd\x67\x10\xe5\xea\x19\x80\xaf\x91\xa8\xbb\x17\x3b"
- "\xe8\xee\xc5\x9d\x75\xf7\x53\x5d\xe3\xa8\x5b\xba\xfb\x2b\x48\xc3"
- "\x5f\xed\x97\xe3\xe8\xaf\x0e\xca\x71\xf4\xc9\x67\xb0\x5f\x0c\xc7"
- "\x8b\x9d\xeb\xee\x74\x9e\x0f\xed\x65\xd3\xdd\x6b\xe5\xf8\x29\xe9"
- "\xee\x4f\x5c\x71\x8d\xa3\x43\x87\xcb\xe4\xd1\x39\x02\x8e\xce\x17"
- "\x70\x74\xbe\x84\xa3\x27\xbe\x14\xe5\xd1\xc7\xa7\x1d\xab\xb5\xc7"
- "\xd1\xa1\x49\x36\x1c\xad\xeb\x8c\xa3\x22\x86\x22\x9e\x62\x3b\x68"
- "\xcb\xda\x0d\x38\xbd\x6f\xbe\x56\xc9\x6c\xb5\x51\x38\x76\xde\x8e"
- "\xb6\xda\xca\xe6\x1b\x24\x75\x16\xe2\x69\x3e\xc5\x53\x5f\x05\x99"
- "\x07\xd8\xd7\x17\xfd\xfe\x0b\xf0\x9b\x7d\x22\xcb\xbf\x86\xf6\x25"
- "\x6e\x25\xcb\xe7\x29\xda\x99\xe0\x7d\xe9\xb7\xfa\xd9\x67\x05\x4c"
- "\xbd\x09\xe3\x01\x3c\xf7\xee\x4d\xc0\xd4\x44\x27\xb2\xe9\x6a\xc0"
- "\xd4\x64\x3b\xd9\x14\xe6\xfe\x67\xf3\x1d\x31\xf5\xf1\x4b\x55\xc8"
- "\x2b\x88\xa9\x32\x3d\xbe\xf8\x17\xa0\xc7\x3f\x31\x56\x8e\xa5\x4f"
- "\x68\xe5\x58\xfa\xc4\x60\x09\x4b\x85\x6b\xb7\x45\x36\x7d\x62\xcc"
- "\xdd\x91\x4d\x9f\x18\x23\xe9\xf1\x4f\xde\x6f\xc3\xd2\x1a\x57\x58"
- "\x3a\x74\x8c\x73\x2c\x85\xf3\x14\x4b\x87\x8e\xb1\x61\x69\x8d\x13"
- "\x3d\x5e\x86\xa5\x4f\x5a\x19\x96\x16\x33\xd9\xb4\x56\x94\x4d\x8b"
- "\xff\x09\xf5\xf8\x27\x2d\xee\xea\xf1\xc7\x9b\x19\x7e\x22\x3e\x89"
- "\x18\x2a\xe9\xf1\xc5\xae\xf5\xf8\x6e\x30\xd4\x2d\x59\x94\x62\xe8"
- "\x30\xab\x1c\x43\x9f\x52\xc8\x31\x74\xf8\x32\x47\x0c\xed\x8c\x9f"
- "\x4f\x3d\xe7\x0c\x3b\x99\x1e\x3f\x5c\xe3\x1a\x37\x9f\x8a\x73\x1f"
- "\x37\x7f\xfd\x96\x1c\x37\x9f\x2a\xf9\xdf\x81\x9b\x4f\xf7\x97\xe1"
- "\xa6\xba\x87\xb8\xf9\xb3\xe8\xf4\x4f\x3b\xd8\x3f\x9f\x76\xb0\x7f"
- "\x3e\x6d\x67\xff\x7c\xfa\x36\xda\x3f\x9f\xbe\x4b\xf6\xcf\xa7\x13"
- "\x24\x19\x74\xf8\xb4\xee\x71\xf3\xa9\x04\xe7\xb8\x09\xe7\x29\x6e"
- "\x3e\x95\x20\xe1\x66\x77\x32\xe8\x88\x11\x6e\xe0\xe6\x2f\x5c\xa7"
- "\x1f\xd1\xa5\xfd\xd3\x99\x4e\x8f\xb8\x49\xf1\xb2\xd6\x41\xa7\x9f"
- "\x61\xaf\xd3\x17\x4b\x3a\xfd\x44\x86\x5b\x7a\x4b\x8e\x5c\xa7\xbf"
- "\xed\x38\x3a\x72\xbc\xd9\x66\x0f\xfd\x13\xe0\xe8\x48\x9a\x2b\xc1"
- "\x6c\xb3\x87\x3e\x53\x29\xf6\x8b\xe9\xf4\x5b\x08\xeb\x97\x13\x9d"
- "\x9e\xfa\xcc\x8e\xdc\x66\xd3\xe9\x6b\x1d\x75\xfa\x67\xd6\xb8\xc6"
- "\xd4\x91\x3a\xa7\x3a\x3d\xea\xdf\x14\x53\xb5\x14\x53\x6f\xe6\xd9"
- "\x63\xea\xbf\x9c\xa5\x98\x3a\x41\xc4\xd4\x7f\x51\x99\x61\x6e\x9a"
- "\xbd\xba\xc7\x54\x6c\x47\xc2\xd4\x98\x9f\x07\x53\x75\x3d\xc7\x54"
- "\xfb\xfd\xa6\x9f\xc1\xbb\xdb\x30\x95\x8e\xf1\xa8\x55\x55\x51\x88"
- "\xa9\x31\x0e\xfa\x7d\xb1\x73\xfd\xfe\x18\x51\xe2\xf8\x88\xfa\x3d"
- "\xd2\x80\xe2\xcd\x1d\xd5\xef\x47\x9d\x94\x63\xeb\x33\x2a\x39\xb6"
- "\x8e\xda\x2f\x61\xab\x70\xed\xb6\xe8\xf7\xa3\xaa\xef\x8e\x7e\x3f"
- "\xaa\x5a\xc2\xd6\x67\xf6\x74\x8f\xad\x23\xcb\x9d\x63\xeb\xc8\x72"
- "\x86\xad\x23\xcb\xbb\xc4\xd6\x09\xf6\xd8\xfa\xec\x0e\x11\x5b\x25"
- "\xfd\x1e\xf8\x03\xe7\x5f\x42\xce\xad\xeb\xf7\x2f\xde\x6d\xfd\xfe"
- "\x59\x97\xf1\x4f\x9c\xea\xf7\x79\x80\xb3\xa0\x8b\xaf\x3e\x09\xfa"
- "\xfd\x34\x41\xbf\xaf\x2b\x72\xd0\xef\x8b\x3a\xe9\xf7\x29\xd3\x04"
- "\x4c\x85\x39\x45\x31\x75\x7e\xf1\xad\xeb\xf7\x2f\x23\x0d\x47\x6f"
- "\x93\x63\xea\xe8\x1d\x72\x4c\xfd\xed\xe3\xd8\x2f\x86\xe9\x45\xce"
- "\xf5\x7b\x3a\xcf\x47\x5f\x91\xe9\xf7\xd0\xbf\xce\xfa\xfd\x6f\xce"
- "\xca\x30\x75\x8e\x3d\xa6\x8e\x09\x90\xc9\xa9\xf0\x5e\x88\xa9\x1f"
- "\x9e\x63\x98\xfa\xd1\x39\x3b\x4c\x9d\xf2\x91\x80\xa9\x63\xc7\x1f"
- "\x9b\x6e\x8f\xa9\x63\x22\x45\x4c\xa5\x78\x39\xc7\xac\x4c\x8b\xec"
- "\xec\x77\x42\xfd\x7d\xd0\x17\x08\xda\xc6\x3d\x52\xd8\xe6\x9e\x73"
- "\x31\xdd\xfb\x9b\x44\x3a\xf7\x37\xd1\x27\x18\x48\x45\x43\x0e\xf5"
- "\x33\x29\x40\x3f\x93\xb5\x64\x60\x41\x3b\xdb\xeb\x4f\x73\x6f\xdc"
- "\x74\xbe\xcf\x7f\xf6\x6b\x12\xce\xa2\x4f\xd6\xbb\xe8\x93\x75\x93"
- "\xf9\x00\x01\xbd\x3b\xef\xeb\x17\xe5\x26\xc0\x83\xfd\xe7\x1c\x71"
- "\x76\xec\xe9\x2a\xe4\x9f\x59\x31\x0e\x3a\x7f\xd1\x2f\x40\xe7\xff"
- "\xcd\x53\x72\x7c\xfd\xcd\x42\x39\xbe\xfe\xe6\x7e\x09\x5f\x85\x6b"
- "\xb7\x45\x76\xfd\xcd\xb0\xbb\x23\xbb\xfe\x66\x98\xa4\xf3\xff\xf6"
- "\x5e\x1b\xbe\x56\xdb\xe1\xeb\x39\x7b\x7c\x1d\x13\x42\xf1\xf5\x9c"
- "\x23\xbe\xc2\x79\x8a\xaf\x63\x42\x6c\xf8\x5a\xed\xa0\xf3\x9f\x73"
- "\xc4\xd7\xdf\xfe\x48\xf1\x15\x78\x41\x2e\xbb\x16\x75\xaf\xf3\xd7"
- "\xfd\xd2\x74\xfe\xdf\x1a\xdd\xd2\xf9\x11\x53\xe3\x18\xa6\x22\x66"
- "\x89\xb8\x2a\xe9\xfc\x45\x2e\x75\xfe\xee\x70\xd5\x2d\x59\x95\xe2"
- "\x6a\xf8\x8f\x72\x5c\x0d\xbf\x21\xc7\xd5\x71\xab\x1c\x71\xb5\x33"
- "\xa6\x3e\x37\xc2\x19\x9e\x32\x9d\x7f\x5c\x98\x6b\x2c\x7d\x2e\xca"
- "\x7d\x2c\x7d\x7e\xb3\x1c\x4b\x9f\xdb\xf5\xbf\x17\x4b\x5f\x18\x2c"
- "\xc3\x52\x75\x0f\xb1\xf4\x67\xb1\x03\xbc\xb0\x46\x8e\xa5\x2f\x94"
- "\xc8\xb1\xf4\x85\x68\x09\x4b\x85\x6b\xb7\x05\x4b\x5f\x48\xb9\x3b"
- "\x58\xfa\x42\x8a\x24\xab\x8e\x7b\xad\x7b\x2c\x7d\x2e\xc6\x39\x96"
- "\xc2\x79\x8a\xa5\xcf\xc5\x48\x58\x7a\xb6\x1b\x2c\x1d\x3f\xd6\x0d"
- "\x2c\x95\xdb\x01\x1c\xb1\xf4\xae\xdb\x01\xc6\x8f\x71\xcb\x0e\x20"
- "\x62\xe9\xb4\xce\x76\x00\xc4\x57\x6a\x07\x80\xf1\x12\x31\x8c\xda"
- "\x01\xc6\x31\x2c\xd3\x5b\xd6\xcb\xec\x00\xb7\x1f\x5b\x27\x4c\x36"
- "\xdb\xec\xa9\x19\x80\xad\x13\xa6\x51\x6c\xb5\xd9\x53\x5f\xbc\x22"
- "\xf6\x8b\xd9\x01\xfe\x44\x58\xbf\x9c\xd8\x01\x9e\xa7\xed\xbd\x27"
- "\xb3\x03\xd8\x61\x2d\xb4\xb5\xcd\x35\xce\x4e\x28\x97\xd9\x01\xea"
- "\x25\x9c\xbd\x89\x3e\xea\x80\x83\x14\x67\x83\xec\x71\xf6\x5f\xdb"
- "\x28\xce\x3e\x2f\xe2\xec\xbf\xfa\xb4\xc2\xdc\x6c\x75\x17\x67\x71"
- "\x1f\xc1\xb9\xa8\xbb\x83\xb3\xa5\x6e\xe0\xac\x9d\x6d\x60\x3f\x8c"
- "\x87\x0d\x67\xe9\xb8\x4f\xdc\x5a\x35\x0b\x71\x36\xca\xc1\x36\x50"
- "\xe4\xdc\x36\x70\xf4\x6e\xd8\x06\x26\x5e\x95\xe3\xed\x8b\x1a\x39"
- "\xde\x4e\x3c\x25\xe1\xad\x70\xed\xb6\xd8\x06\x26\x36\xdf\x1d\xdb"
- "\xc0\xc4\x66\x09\x6f\x5f\x3c\xd6\x3d\xde\x4e\xa8\x76\x8e\xb7\x70"
- "\x9e\xe2\xed\x84\xea\x2e\xf1\xf6\x79\x7b\xbc\x7d\x69\xbf\x88\xb7"
- "\x92\x6d\xa0\x48\xb0\x0d\xac\xef\xde\x36\x50\xe7\xc2\x36\x30\xfe"
- "\x6e\xdb\x06\x5e\x2a\x75\xc7\x36\xd0\x96\xc7\xfc\xf6\x57\xa3\xdf"
- "\xfe\x6c\xc0\xdf\x88\x2f\x61\x0c\xba\xf7\xdb\x4f\x11\xfd\x4f\xa3"
- "\xf2\x05\x9c\xcd\x77\x6a\x1b\x38\xde\xe8\xda\x36\x70\xbc\xc6\xde"
- "\xff\xf4\x77\x9f\xca\xbf\x5b\xfd\x6e\xbf\xf8\xdd\xea\xf8\xd7\x88"
- "\xb3\x53\x0f\x63\x99\xcb\x1d\xcd\xf2\xf0\x2a\xa6\xea\xb0\x9f\xce"
- "\xfc\xf8\x3f\xe3\xec\xbf\x65\x4d\x0a\xb4\xd9\x0a\xaa\x11\x6f\xf3"
- "\x09\xc7\xc7\x78\x61\x8c\x70\x6a\x2b\x78\x05\x79\x6f\xea\x32\x7b"
- "\xdc\x3d\x74\xc6\x1e\x77\x27\x85\x8b\xb8\x6b\x05\xdc\x3d\x58\x9f"
- "\xcf\xec\xaf\x33\x99\x6f\xea\xee\x99\x76\xbe\xa9\x5f\xfe\x43\xc0"
- "\xdd\xc9\x63\x8f\x19\xe0\xfd\xbb\xf2\x9f\x82\xfb\xf7\x9e\xe9\xa9"
- "\x0f\x6a\xbe\x53\xdf\x29\x01\x9f\x9c\xfa\x4f\x41\x5f\xd5\x3b\x84"
- "\xb9\x6a\x85\x79\xba\xc3\xce\x7f\xaa\x20\x19\xe6\xb3\xb0\xaf\xa4"
- "\x4b\x3f\xd4\x99\x92\x1f\x2a\x9f\x3b\xda\x07\xd7\x37\x6e\xeb\xe8"
- "\xea\x76\x3e\xc6\x83\x0f\x18\xed\x83\xcf\xef\xe8\x80\x75\xe7\x85"
- "\x48\x0f\xa6\xd7\x3d\x6b\x04\xec\xe9\xcb\xc6\x7d\x72\x92\x15\xd6"
- "\x1a\x2b\xac\x35\x5c\xee\xb3\x46\x0b\xca\x26\x79\xcf\x9a\x0a\x40"
- "\xcf\xb3\x64\xd0\x5c\xaa\xbd\xb3\x41\xd7\xdb\x89\x7a\xde\x35\x98"
- "\x1b\x69\x61\x4a\xec\x8f\x88\xa3\xbe\x8d\xf0\x1e\xd7\xba\x96\xe5"
- "\x2c\x3f\x48\x38\xaa\x7b\xe9\x38\x3c\x73\xca\xe2\x2a\xe4\xdd\x48"
- "\x69\x4f\x01\x95\x99\x5d\xf8\xca\x62\x5f\x58\x8c\x44\xe0\x85\xdb"
- "\x60\x93\xb0\xef\x8f\x1c\xd7\xa7\x1c\x95\xe3\xfa\x14\xb3\x1c\xd7"
- "\xa7\xec\x91\x70\x5d\xb8\x06\xb8\x0e\x74\xa3\x72\x34\xac\x7d\xb7"
- "\x28\x47\x4f\x29\x13\x71\x9d\x13\x70\xbd\xb0\x07\xb8\xde\xa5\x1c"
- "\x6d\x87\x4b\xae\x71\x7d\x4a\x99\x64\x93\x98\xfa\x9e\x53\x1f\xd9"
- "\x33\xf6\xb8\x3e\x69\x22\xc5\xf5\x33\x8e\xb8\x0e\xe7\x29\xae\x4f"
- "\x9a\xe8\x72\x3f\xc1\x19\xc7\xef\x69\x11\x6f\x52\x5c\xaf\x15\x7c"
- "\x64\xab\xdd\xd8\x4f\x50\xcb\x30\x5d\xc4\x72\xb4\x57\xdd\x5d\x9b"
- "\x44\x44\xa6\x3b\x36\x09\x8a\xe5\xcd\x0c\xcb\x11\x1b\x45\x3c\xef"
- "\xc9\x7e\x82\xee\xf0\x5c\x94\x9b\x11\xcf\x5d\xc9\xcd\x72\x3c\x9f"
- "\xf6\xa6\x1c\xcf\xa7\xbd\x25\xc7\xf3\x19\x6f\xca\xf1\x7c\x46\xa6"
- "\x23\x9e\x77\xc6\xf2\x69\xa7\x9d\xe1\xb8\xf6\x15\xb4\x51\xcc\x18"
- "\xee\x1a\xc3\x5f\x56\xb9\x8f\xe1\xbf\x57\xfc\xaf\xc3\x70\xb5\x23"
- "\x86\xff\x7e\x0c\x62\x90\x35\xcb\x01\xc3\x17\x09\x18\x2e\xe0\xc8"
- "\xce\x26\x41\x16\x76\xc4\xf0\x66\x78\x8f\x6e\xf4\x71\xcb\xf7\x8e"
- "\x18\x3e\xfd\x29\x19\x86\xab\xbb\xc1\xf0\x45\xcc\x0e\x22\xf3\xcb"
- "\x75\x61\x0b\x81\xf7\x08\xdf\xe1\x42\x36\x17\xc7\xcc\xbe\x3f\x72"
- "\x0c\x9f\xfe\x96\x1c\xc3\xa7\x1f\x90\x63\xf8\xf4\x65\x12\x86\x0b"
- "\xd7\x6e\x8b\x6c\x3e\x7d\xfd\x6d\x97\xcd\x45\xfe\xe8\x12\xc3\xa7"
- "\xaf\x97\x64\xf3\x19\xd1\xdd\x63\xf8\xcb\x3e\xce\x31\x1c\xce\x53"
- "\x0c\x7f\xd9\xc7\xe5\x3e\x87\x4e\x18\xfe\xca\x78\x37\x30\x5c\x6e"
- "\x0b\x11\x31\x5c\xb0\x85\xec\xb4\xb3\x85\x58\x33\x98\x2d\x64\x47"
- "\x13\xe3\x8d\xbe\x0a\xc6\xa7\xc0\x3f\xc1\x85\xca\xae\x75\xb7\x1d"
- "\xb7\x64\x07\x79\xa5\x53\xfc\xfb\xae\xec\x20\x14\xbf\x71\x8f\xc3"
- "\x6b\x80\xdb\xd5\x3d\xdc\xe3\x30\x51\xdc\xe3\x90\xe3\x62\x8f\x83"
- "\x80\xe7\x73\x7e\x02\x9e\xd3\x3d\x0e\xaf\xce\x90\xdb\x98\x5f\x7d"
- "\x4d\xb4\x31\x33\x3c\x7f\x3d\x56\x8e\xe7\xaf\xc7\xd8\xf6\x3c\x00"
- "\xe6\xeb\xb5\x5b\x3a\xed\x79\xb0\x61\x3b\xb5\x83\xbe\xba\x5f\xf7"
- "\x4a\x03\xb1\xe1\xfb\x2c\x09\xdf\xa1\xad\xfb\x65\xd8\x5e\x6f\x8f"
- "\xed\xaf\x1a\x64\xd8\x7e\x2e\x5f\xee\x1f\x51\xaf\xb5\xc3\x76\x71"
- "\xcf\x43\xe4\xd9\x63\x75\xdd\x60\x3b\xdc\xdf\xf3\x3d\x62\xb7\x17"
- "\xdb\xc5\xfd\x0d\x4e\xb1\xdd\x7e\x7f\x83\x9d\xff\x03\x62\x3b\xcd"
- "\x47\x11\xe8\x80\xed\xab\x63\x94\xd6\x23\x30\x1f\x00\xd7\x71\x8e"
- "\x58\x79\xc0\x76\x3a\xde\xaf\x05\xdb\x63\x7b\x47\x06\xc3\xf6\x77"
- "\x9b\x7e\x3a\xb6\xdb\xe4\x61\x7b\x6c\x9f\x80\xd8\x3e\x33\x90\xed"
- "\xbf\x48\xef\xd9\xfe\x0b\x07\xff\x8c\x77\x7b\x60\x7f\xe9\x12\xe3"
- "\x9d\xf4\x4b\x8e\xf1\x33\x17\xcb\x31\x7e\x66\x91\x1c\xe3\x67\xce"
- "\x90\x30\x5e\xb8\x76\x5b\xe4\xf4\x99\x71\x77\xc7\xfe\x32\x33\x4e"
- "\xc2\xf8\xd7\x5f\xec\x7e\xef\xc5\xab\x8d\xce\x7d\x33\xe0\x3c\xc5"
- "\xf8\x57\x1b\xbb\xdc\x7b\x21\xb3\x77\xcf\x7a\xc6\xe9\xde\x8b\xea"
- "\x9f\xcf\x37\xc3\x9e\x57\x1c\xed\x2f\xb7\x6e\xfb\x9e\x35\xca\x5d"
- "\xfb\x0b\xee\xbd\x58\x7d\xca\x6e\xef\x45\x5d\xf7\x7b\x2f\x52\x66"
- "\xf4\xd0\xfe\xd2\x85\x6f\xc6\xf1\x08\x7b\x7f\xb7\xd9\x23\xe4\xf8"
- "\x3e\xfb\x19\x1b\xbe\xbf\x8c\xf8\x3e\x6f\xb2\x1c\xdf\xe7\x4d\xc2"
- "\x7e\x3a\xdb\x8b\xf1\x99\xec\xbb\xe2\xec\xad\x72\x5f\x0d\x07\xfb"
- "\xcb\xcb\xc8\x7b\x51\x56\x19\xbe\x9f\xb3\xc7\xf7\xd9\x3a\x67\xb2"
- "\x3b\xda\xbd\xa9\x4f\xf1\x1c\xbb\x3d\x6d\x53\x44\xff\xb7\x39\xc7"
- "\x8e\x45\xc2\xfb\x1b\x5c\xf8\xba\xcd\x61\xbe\x6e\xd4\xb7\x0d\xed"
- "\xe0\xd0\xd6\xbe\x39\x5a\x65\x6a\x14\xcf\xa1\xaf\x9b\xa3\x9f\x1b"
- "\xfa\xbe\xa1\xaf\x5b\x65\x4c\x8e\x4b\x3f\x37\xe4\x4d\x57\xbe\x6e"
- "\xd0\xef\x00\x8a\xf5\x17\x04\xac\x17\x7c\xdd\x0a\x12\x25\x5f\x37"
- "\x19\xd6\x3b\xf1\x1f\xde\x7f\x2e\xdd\xb9\x1c\x9f\x26\x61\x7d\x3b"
- "\xca\xf1\xa3\x1d\x6c\x31\x94\x06\x73\x55\x3f\xab\x2d\x86\x62\xfd"
- "\xdc\xb6\x2a\xe4\xe3\x59\x5a\x27\xb6\x98\xce\x3e\xce\x3f\x9f\x2d"
- "\x26\x6a\x9a\x1c\xe3\xa3\x32\xe5\x18\x1f\xf5\x8c\x84\xf1\xc2\xb5"
- "\xdb\x82\xf1\x51\x11\x77\xc7\x16\x13\x15\x21\xd9\x62\xe6\x3d\xee"
- "\xd4\xff\x4e\x66\x63\x9f\x5d\xee\xdc\xc6\x3e\x5b\xf0\xbf\x9b\x5d"
- "\xee\x72\x4f\x48\xa7\x6f\x9a\xf3\xfd\x98\x8d\xfd\x16\xf6\x84\xd4"
- "\xfd\xd2\x6c\x31\xf3\xd5\xee\xda\x62\xa8\x6f\xf3\x29\xf4\x0f\x71"
- "\x6f\x4f\x48\x77\xd8\x6e\x93\xdd\xbb\xf8\x86\x29\xc7\xf6\x05\x7e"
- "\x72\x6c\x5f\x10\x28\xc7\xf6\x3f\xf4\x97\x63\xfb\x1f\x42\x1c\xb1"
- "\xbd\x33\xae\x2f\x88\x76\x86\xe9\xda\x97\xd1\x16\xf3\x46\x85\x6b"
- "\x3c\x5f\x90\xe3\x3e\x9e\x2f\xdc\xf6\xbf\x1a\xcf\xd5\x8e\x78\xbe"
- "\xb0\xe6\x67\xb5\xcb\x50\x3c\x8f\x3e\x26\xc3\x73\x75\x37\x78\xfe"
- "\xb3\xd9\x65\xde\x18\x28\xc7\xf3\x37\xa6\xcb\xf1\xfc\x8d\x5e\x12"
- "\x9e\x0b\xd7\x6e\x8b\x5d\xe6\x0d\xcd\xdd\xb1\xcb\xbc\xa1\x91\x64"
- "\xf6\x37\xac\xdd\xe3\xf9\x82\x7c\xe7\x78\x0e\xe7\x29\x9e\x2f\xc8"
- "\x77\xe9\x4f\xdd\x09\xcf\xff\x70\xd6\x0d\x3c\x77\xea\xa3\xf2\xcb"
- "\xb0\xcb\xfc\xa1\xce\x5d\xbb\x8c\xab\x7d\x2a\x88\xef\x92\x7f\x8a"
- "\xdd\x3e\x95\x70\x71\x9f\x4a\xba\xdc\x3f\xe5\xb6\x63\x7b\xcc\x55"
- "\x39\xb6\xc7\xfc\x28\xc7\xf6\xc5\xf7\xca\xb1\x7d\xb1\x8f\xd8\x4f"
- "\x66\x97\xc9\xe8\xb4\x6f\x45\x8e\xf3\xb1\xd3\x74\x2f\x37\x10\x67"
- "\x58\x7f\x59\x11\x77\xd0\x35\xce\xc7\x26\xb9\xc2\x79\xf4\x57\xf9"
- "\xeb\x9c\x18\x27\x38\xbf\x68\xed\xff\x0f\x38\xef\xca\x0f\x85\xea"
- "\x41\x80\xf1\x88\xf7\x14\xdf\x05\xac\x47\x9c\xb7\xfe\xb7\x33\x1b"
- "\xcd\xa2\x03\x77\x0a\xe7\x5d\xdb\x68\xfe\xb8\xbf\x6a\x96\x80\xf3"
- "\x3d\xd9\x43\x73\x58\x6e\xa3\x29\x58\x74\xa7\x6d\x34\x71\x7e\x72"
- "\xbc\x8f\x1b\x27\xc7\xfb\x3f\xb6\x49\x78\x2f\x5c\xbb\x2d\xf2\x7b"
- "\x9c\xfa\xee\xd8\x68\xe2\xd4\x12\xde\xc7\x5d\xed\x1e\xef\x63\xd3"
- "\x9d\xe3\x7d\xac\x10\x9b\x2d\x36\xbd\xe7\x78\xbf\xd8\x86\xf7\x9d"
- "\xf7\xcf\xa4\xdf\xba\x8f\xcc\x73\x77\xdb\x46\xb3\xd8\x25\xfe\x77"
- "\x15\x1f\xe3\xd6\x6d\x34\xc2\x9e\xc4\xf9\xce\xe3\x63\x1c\xeb\xc2"
- "\x47\xe6\x58\x85\x3d\xd6\x2f\x39\x2d\xf7\x45\x5c\x72\x56\xf4\x45"
- "\x3c\x56\x85\x58\xbf\xdc\x53\x8e\xf5\xcb\x55\xae\x6c\x34\xfb\x39"
- "\x7b\x9f\xc4\xa5\xcf\xc8\x6d\x34\x45\x72\x1b\xcd\x14\xe4\xbd\xf8"
- "\x4f\x5d\x63\xfd\xd2\x85\x72\x1f\x70\xb6\x47\xf1\xc3\x39\x82\x0f"
- "\xf8\x1c\x3b\x1f\xf0\x97\xfe\x2c\x60\xbd\x76\x6d\x79\xb5\x85\xb8"
- "\xe3\x87\xf8\xd3\x7d\xbd\xd7\x3b\xf5\x41\xa4\x6b\x40\x17\x7e\x88"
- "\x73\x4f\xab\xd1\xa7\x39\xa6\x30\xd1\xce\x0f\xb1\x8b\x78\xc6\x32"
- "\xfc\x9f\xa3\x75\x89\xff\x6d\xbc\x84\xff\xdc\xbf\x48\x76\x1b\x0e"
- "\xe5\x7c\x4a\x17\xed\x81\x3b\x65\xb7\x71\x66\x27\xd1\x3d\x8f\xf8"
- "\xbf\xec\x63\x26\xe7\xc7\xfc\xc2\xec\x36\xf1\xbd\xe4\xb8\x1f\x3f"
- "\x46\x8e\xfb\xcb\x7e\x94\x70\x5f\xb8\x76\x5b\x7c\xd1\xe3\xbd\xef"
- "\x8e\x9c\x1f\xef\x2d\xd9\x6d\xe2\x2f\x75\x8f\xfb\x4b\xe3\x9c\xe3"
- "\xfe\xd2\x38\x86\xfb\x4b\xe3\xba\xb4\xdb\xc8\x7c\x23\x97\x1f\xfb"
- "\xc9\x76\x1b\x51\xce\xbf\xeb\xfb\x7a\x96\x97\xbb\x63\xb7\xb1\xed"
- "\x49\xff\x49\x76\x1b\xe7\x78\x2f\xca\xf6\xc7\xba\xf8\xe6\x2a\xc7"
- "\xfb\x84\x63\x72\xbc\x4f\xa8\x94\xe3\x7d\xd2\x15\x39\xde\x27\x35"
- "\x3a\xb3\xdb\xc8\xb1\x7e\x45\x7f\x67\x38\xaf\x9d\x82\x76\x9b\xa4"
- "\x7c\xd7\x18\xbf\x62\xa2\xfb\x18\x9f\x18\xfd\x7f\x18\xef\x80\xf1"
- "\x6a\x47\x8c\x4f\x2c\xfa\x59\x65\x7c\x8a\xf1\x2b\xb7\xca\x30\xfe"
- "\x36\xda\x72\x7a\xb2\x9f\xc4\xb5\x6c\xbf\xd2\xc1\xff\x3d\x49\x23"
- "\xc7\xf8\x95\x76\xfe\xef\xc2\xb5\xdb\x82\xf1\x2b\x6f\xbf\xff\x7b"
- "\x8f\x30\x7e\xa5\x9d\xff\x7b\xd2\xb1\xee\x31\x7e\x45\x84\x73\x8c"
- "\x87\xf3\x14\xe3\x57\x44\x74\x29\xdb\xcb\x30\x7e\xd5\x9e\x3b\x61"
- "\xcb\xb9\x3b\xfb\x8d\x56\xed\x76\xc7\x9e\xd3\x55\xdc\x11\x97\xf6"
- "\x9c\x51\xa2\x3d\x47\xeb\xc2\x9e\x73\xbb\x30\x3f\xf9\xa0\x1c\xf3"
- "\x93\x0f\xcb\x31\x3f\xf5\x47\x39\xe6\xa7\x1a\xe5\xf6\x9c\xf8\x4e"
- "\xf6\x1c\x39\xfe\xaf\x1e\xa8\x9b\x62\x6f\xcf\x29\xb2\xb3\xe7\xa4"
- "\xbe\xe7\x1a\xff\x57\xbb\xc4\xff\x9b\x14\xff\xa3\x9c\xe0\x7f\xca"
- "\xff\x12\xfc\x8f\xfa\x09\xf8\x9f\x72\x17\xf0\x7f\xcd\x0e\x66\xe3"
- "\xe9\x61\x9c\x94\xfd\xee\xdb\x78\x7e\xda\x3a\xb0\xe6\x86\x7c\x1d"
- "\x48\x0d\x93\xaf\x03\x6b\xce\x4a\xeb\x80\x70\xed\xb6\xac\x03\x6b"
- "\x4c\x77\x67\x1d\x58\x63\x92\xd6\x81\xd4\x93\xdd\xaf\x03\xab\x5d"
- "\xac\x03\xab\x85\x75\x60\xb5\x1b\xeb\x40\xda\x61\xd7\x36\x1e\xed"
- "\xad\xdb\x78\x9e\xb9\xdb\xfb\xa0\xd2\x74\x6e\xd9\x78\xf2\xc6\x94"
- "\x54\x60\x8c\x94\x0b\x44\xb9\x7a\x9e\x68\xe3\xd1\x39\xd8\x78\x74"
- "\x9d\x6c\x3c\xab\x2e\x08\xf8\x3f\x49\xd8\x6f\x3a\xe5\x27\xc4\x48"
- "\xa1\x39\x94\xd3\x0f\xca\xfd\xe6\xd3\x29\xfe\x4b\xf1\xfb\x32\x27"
- "\x63\xbf\xd8\xfa\xa3\xeb\x22\x06\xea\xda\x7b\x65\x36\x9d\x49\xce"
- "\x62\xa4\xac\x93\xf9\xdd\xc8\xf7\x9b\xae\x1d\x25\xc3\xfb\x29\x6c"
- "\xbf\xe9\x47\xce\xbe\xd3\xda\x62\xf2\x67\xbc\x48\x63\xf2\xdb\x62"
- "\xf9\xad\x4d\xe9\x51\x2c\xe9\x39\x42\x2c\xe9\x73\x77\x21\x96\x74"
- "\x4f\x63\xf2\x9f\x73\x8c\xdf\x97\x71\x49\x5f\xa1\x23\x55\xc8\x23"
- "\xb3\x1c\x63\x9f\xea\x9c\xef\xdd\x57\x0a\x7b\xf7\x97\xdc\x99\x38"
- "\x28\xd8\x1f\xba\xe6\xfb\x67\xea\xf6\xa4\x1a\x69\x7f\x30\x5f\x35"
- "\xd0\x39\xb6\x02\x78\x95\x43\x3c\x8d\x47\x3c\x5d\x57\x40\xeb\x5e"
- "\x00\x5e\xf0\x0f\xa8\x45\x3e\xce\xe6\x88\x8f\x36\x11\xb1\x75\x1d"
- "\xf5\xfb\x02\x31\x02\xb0\x95\xd5\x5b\x73\x81\xb7\x5a\xfd\x43\x6a"
- "\xa1\xff\xf7\xec\x5d\x52\xed\x59\x65\x30\xc1\xbc\x68\xc2\x3d\xb1"
- "\x0a\xbd\xa5\x55\x87\xb4\x38\xb4\xa4\x5a\xc5\x03\xfe\xee\x7c\x83"
- "\x78\xbb\x37\x4f\xd7\xc5\x50\x79\x06\xd7\x3d\xff\xcc\x0a\x8c\x03"
- "\x22\xca\x56\xdc\x0f\x92\x7d\x6b\x07\x8c\x0f\xc7\xb3\xb5\x6f\x6e"
- "\x2c\xc3\x0d\x78\x5e\x0c\x8c\x25\xf5\xb1\x45\xdc\xa0\x39\xac\x00"
- "\x37\x0a\xaf\x4b\xdf\xb1\xb1\x7d\x1c\x23\x66\x47\xc9\x94\xfc\x5f"
- "\x0c\xae\xb0\x75\x6d\xb8\x73\x6c\x5d\x1b\xce\xb0\x75\x6d\xb8\x0d"
- "\x5b\x0d\x4e\xec\x28\x32\x3f\xf6\x37\x05\xff\x17\x9d\x83\x8c\xad"
- "\xfb\x27\x8c\x8f\xf2\xa6\x5b\xfe\x2f\x14\x4f\xe3\x18\x9e\x22\x5e"
- "\x89\x98\x2a\xd9\x51\x74\x2e\xed\x28\xdd\x61\xaa\x5b\x7b\xf8\x29"
- "\xa6\x66\xf9\xc9\x31\x35\x2b\x50\x8e\xa9\x6f\x6d\x75\xc4\xd4\xce"
- "\x78\x9a\x35\xc3\x19\x96\xb2\xf8\x28\x6f\x8d\x73\x8d\xa3\x59\xe9"
- "\xae\x70\x94\xfa\xa7\xcf\xb1\xf3\x4f\xb7\xe1\xe8\xbf\x6d\x96\xe3"
- "\x68\x56\x59\x4f\x71\x94\xe6\x36\x39\xf7\x33\xe4\x36\xb9\x65\x1c"
- "\xd5\x3a\xe0\xe8\xfa\xc7\x25\x1c\x75\xcc\x6f\xd2\x0d\x8e\x2e\xba"
- "\x33\x31\x50\x64\x38\xca\x19\x69\x7f\x34\x4b\x68\x5f\x3f\x96\xe3"
- "\xe8\xfa\x06\xd7\x38\xba\x7e\xad\x84\xa3\xac\xde\x9d\xc5\xd1\xf5"
- "\x25\x32\x1c\x5d\x64\x87\xa3\xdf\x4b\x3a\x04\xfa\x58\xd8\x70\x74"
- "\xb1\x1d\x8e\x2e\xea\x0e\x47\xd7\xd3\x31\x62\x32\xea\x5b\x2b\xba"
- "\xc7\xd1\xac\xf5\xce\x71\x14\xce\x53\x1c\xcd\x5a\x2f\xe1\xa8\x13"
- "\x19\x55\x86\xa3\x7f\x7a\xcd\x0d\x1c\xfd\x85\xc7\x46\xf9\x53\xa4"
- "\x5b\xb6\x0a\x69\x4f\x67\xe7\x18\xa9\xb3\xed\xf7\x04\x95\x3a\xe4"
- "\x3d\x29\xed\x94\xf7\x64\x95\xb8\xc7\x73\xa2\x80\xab\x2f\xfd\x04"
- "\x5c\xa5\x7b\x3c\xdf\x8e\x95\xfb\x9e\xbc\xbd\x58\xf4\x3d\x61\xb8"
- "\xba\x49\x21\xf6\x4b\xca\x7b\x52\xda\x45\x8c\xd4\xb7\x0f\xca\x62"
- "\xa3\x4c\xb4\x8f\x8d\x92\xfd\xb1\xeb\x18\xa9\x6f\x37\xc8\x62\xa3"
- "\x1c\x2f\xb6\xe5\x3d\x71\x8c\x91\x2a\x61\xec\x86\x1b\x14\x63\x6d"
- "\x31\xa8\x36\x84\xd9\x62\xa4\x76\xb3\x2f\x08\xdb\xd9\x5b\x1f\x73"
- "\xe7\x31\x56\xe7\x06\xc6\xca\xf2\x9e\x38\xc6\x98\xda\xb8\x4d\x5f"
- "\x5e\x4a\xaa\xa2\x4a\x9d\xc4\x46\x2d\xbd\xab\xb9\x4f\xb0\x5f\xce"
- "\xb1\x36\xbb\xbf\x1c\x6b\xb3\x23\x68\xdd\xb3\xce\xb0\x76\xe3\x55"
- "\x09\x6b\x59\xbd\x35\x67\x1d\xb0\xb6\xce\x05\xd6\xc2\xba\xba\xf3"
- "\xb2\xbb\x58\x9b\x1d\x42\xb1\x36\x43\xc0\xda\xa6\xdb\x8d\xb5\xd9"
- "\x21\x12\xd6\x66\x5f\xe8\x3e\xc7\xd4\xdb\xcd\xce\xf7\xe5\xbc\xdd"
- "\xcc\xb0\xf6\xed\xe6\x2e\x73\x4c\xc9\x7c\x3e\x36\x9d\x14\x73\x4c"
- "\x49\xf6\x80\x52\xc1\x1e\xf0\xcf\x9c\x13\x65\x53\xb5\xbb\xf6\x80"
- "\x13\xa0\xbb\xe3\xbe\xcb\xd5\x98\x73\x6a\x16\xe6\x44\x29\x71\xb0"
- "\x07\x94\x74\xb6\x07\xbc\xd6\x35\xc6\xba\x65\x0f\xa0\xfb\x2e\x73"
- "\x2a\xe5\x18\x9b\x73\x52\x8e\xb1\xb9\xb1\xe2\x3e\x4b\xec\x8f\xeb"
- "\x98\xa9\x9b\xfb\xdb\xec\x01\x75\x72\x6c\x95\xec\x01\xb9\xf7\xbb"
- "\xc6\xd8\xcd\x72\xfb\xef\x4b\xc5\xb2\x7d\x96\x1f\xd5\xdb\xc7\xa1"
- "\x16\xe3\x4f\x6d\x89\x3e\x56\x63\x8f\xb1\x9b\x37\xfc\x33\xc5\xa1"
- "\xb6\xc5\x9a\xea\xc6\x97\xbb\x73\x1c\xea\x77\x00\xd7\x4a\x08\xee"
- "\x6d\xa3\x78\x2b\xb3\x0d\x94\xdc\x1d\xdb\x40\x79\x89\x0b\xdb\xc0"
- "\x3b\x6f\xca\x71\xf6\x9d\x52\x5a\xf7\xb4\x33\x9c\x7d\x67\x86\x84"
- "\xb3\xac\xde\x9a\xd3\x0e\x38\x5b\x7b\x3b\x65\xda\x77\x32\xef\xac"
- "\x6d\xe0\x9d\x4c\xc9\x36\x90\xdb\x83\xfd\x8f\x9b\x23\x9c\xe3\xec"
- "\x66\xc1\xee\xba\x59\xb2\xbb\xd6\x3a\xc9\x97\x22\xc3\xd9\xad\x8f"
- "\x8b\xfb\x1f\xa9\x4c\x5b\x27\xca\xb4\x25\xff\x84\xf9\x52\xb6\x0e"
- "\x75\xd7\x36\x80\xfb\xdc\x11\x5b\x11\xbb\x44\x7c\x95\x6c\x03\x25"
- "\xae\x6d\x03\xdd\xe0\xab\xfb\xb9\xfb\xf2\x1e\x97\xe3\x6b\xde\x53"
- "\x72\x7c\xdd\x76\xd0\x11\x5f\x3b\x63\x6b\xde\x32\x67\xb8\xca\x6c"
- "\x03\xdb\xe2\x5c\x63\x6a\x5e\x81\x2b\x4c\xa5\x31\xfd\xea\x25\x1f"
- "\x69\x09\x53\xff\x7d\xbf\x1c\x53\xf3\x0c\x3d\xc5\xd4\xbb\x92\x2f"
- "\xe5\x96\x31\x35\xc6\x01\x53\xf3\x67\x48\x98\xea\x98\x33\xa5\x1b"
- "\x4c\xbd\x53\x76\x02\x7b\x4c\x95\xc9\xae\xf9\xa7\xe5\x98\xba\xcd"
- "\xc7\x35\xa6\xe6\x7f\x28\x61\x2a\xab\x77\x67\x31\x35\xbf\xf6\xce"
- "\xda\x09\xf2\x6b\x25\xd9\x75\xdb\x8e\xee\x31\x35\x6f\x97\x73\x4c"
- "\xcd\xdb\xc5\x30\x35\x6f\x57\xcf\xf7\x94\x6f\x5f\xeb\x06\xa6\xfe"
- "\xc2\x73\xa9\x6c\x4f\x77\xdb\x4e\x80\xf6\x56\xc4\xd2\xba\x9f\x16"
- "\x3b\x24\x49\x8c\x1d\x32\x4e\xc0\xd8\x09\x3f\x15\x63\xdf\xdd\x2c"
- "\xf7\x69\x78\x77\xab\xe8\xd3\xc0\x30\x76\xe7\x08\x79\x7e\xd4\xce"
- "\xb1\x42\xe4\x31\x54\xdf\xbd\x64\xb3\x13\x20\xe6\x8e\xb3\xb7\x13"
- "\x14\x5e\x72\x8d\xb7\x05\x3e\x32\x3b\xc1\x17\xce\xf1\xf6\xa6\x0c"
- "\x6f\x77\x3c\x4a\xf1\xd6\x16\x43\xb5\x20\x42\x8c\xa1\xda\xad\x0c"
- "\x2b\xc3\xdb\xa8\x9f\x07\x6f\x4b\x7b\x8e\xb7\xf2\x5c\x2a\x8e\xf1"
- "\x52\x77\x54\xea\xcb\x00\x6f\x69\xbc\x0e\xc7\x98\xa9\x3d\x8b\xd7"
- "\x71\xa7\x62\xa6\x62\xbf\x9c\xe3\x6e\xe1\x34\x39\xee\x16\x66\xd2"
- "\xba\x4e\x71\xb7\x70\xa0\x84\xbb\xac\x5e\x8f\x71\xf7\x96\x6c\x06"
- "\x85\x11\x77\xd6\x66\x50\x18\x21\xe1\xee\xce\xc0\xee\x71\xb7\x20"
- "\xc0\x39\xee\x16\x04\x30\xdc\x2d\x08\xe8\x12\x77\x65\x3e\x04\x45"
- "\x9e\x4e\x63\x79\xd4\xfd\xb3\xe7\x59\x29\x52\xdd\x8a\xcd\x00\x30"
- "\x58\x99\x82\x31\x9c\xa2\xd0\x87\xa0\x7b\x9b\x41\x77\x78\xeb\xbe"
- "\xcd\xe0\x3d\x85\x1c\x6f\xdf\xf3\x94\xe3\xed\xae\x8f\xb1\x5f\x5d"
- "\xda\x0c\x28\x06\xbc\x37\xcd\x66\x33\x30\xc8\x71\x56\xb2\x19\xec"
- "\x9a\xe7\xfa\xdb\xd7\x7b\x29\x32\xf9\x76\x82\x43\xcc\xea\x39\x12"
- "\xde\x1e\xaf\x12\x7d\xc6\xfe\xbc\xe7\x58\x84\x3d\xde\xbe\xa7\xeb"
- "\x14\xb3\x7a\xfa\x6d\x8c\x59\x3d\xfd\x36\xc7\xac\x9e\x21\x8f\x59"
- "\xbd\xfd\xa6\xe4\x47\xe6\x7e\xcc\xea\xbf\xbc\x48\x31\x18\x79\x08"
- "\xe3\x56\xf7\xc4\x8e\x70\x87\x73\xad\xc8\xb0\x57\x66\x47\xf8\x4b"
- "\xa5\x1c\x7b\x77\x11\xd7\xd8\xfb\x97\x1d\x12\xf6\xb2\x7a\x77\x56"
- "\xe6\xfd\x4b\xc5\x9d\xb5\x23\xfc\xa5\x42\xb2\x23\xec\xda\xec\x14"
- "\x7b\x65\xdf\xc6\xde\xcb\x74\xfe\x6d\x0c\xce\x53\xec\x7d\x2f\xd3"
- "\xa5\x1d\xa1\x93\xff\xd6\xfb\x2b\xd8\xb7\x31\x41\xe6\x35\xb8\x61"
- "\x47\xf8\xc5\xf9\x18\xbc\x9f\x70\x2b\x76\x04\xc4\x5b\xc4\x33\x11"
- "\x73\x7b\x62\x47\xb8\xfd\x32\xee\x07\x2b\xe4\x98\xfb\xc1\x2a\x39"
- "\xe6\x7e\x74\xbf\x23\xe6\x76\xc6\xdb\x0f\xf6\x3b\xc3\x5a\x66\x47"
- "\xf8\xb0\xdc\x35\xce\x7e\xd0\xe0\x12\x67\x1d\x7c\x73\x25\x9c\x2d"
- "\x0e\x94\xe3\xec\x7f\x84\xdd\x12\xce\xf6\x34\x07\xcb\x2f\x0a\x67"
- "\xa3\x1c\x70\xb6\xf8\x63\x09\x67\x1d\xf3\xb0\x74\x83\xb3\x77\x28"
- "\x0f\x8b\x6b\x19\xf7\xc3\x11\x72\x9c\xfd\x30\xc6\x35\xce\x7e\xe8"
- "\x29\xe1\x2c\xab\x77\x67\x71\xf6\xc3\xe1\x77\xd6\xb6\xf0\xe1\x70"
- "\x49\xc6\xfd\xb0\xad\x7b\x9c\xfd\xa0\xd9\x39\xce\x7e\x20\x7c\x17"
- "\xfb\xa0\xd9\xa5\x8c\xdb\x09\x67\x3f\x3a\xeb\x06\xce\xfe\xc2\x7d"
- "\x10\x3e\x72\x2b\xfe\x85\x9d\xbd\xd6\x4b\x6f\x70\xd8\x2f\x71\xda"
- "\x7e\xbf\x84\x9d\x6d\x61\x9c\x68\x5b\x90\xe7\x67\x49\x12\xed\xb7"
- "\xe1\x02\xee\x3e\xff\x53\x71\xf7\xaf\x57\x5b\x6d\xb8\x1b\x0f\xb8"
- "\xfb\x57\xba\x3f\xa2\xd5\x86\xbb\xfb\xde\x17\xfb\x25\xe5\x67\x71"
- "\x61\x5b\x78\x16\xdb\xdb\xfd\x9c\xcd\xb6\x80\x38\x1c\x6e\x6f\x5b"
- "\xd8\x37\xc3\x35\x06\xef\x8e\x91\xd9\x16\xfe\xe1\x1c\x83\x4d\x32"
- "\x0c\xde\xb3\x8d\x62\xf0\xb3\x22\x06\xef\xde\x7d\x13\x74\xcb\x9b"
- "\x59\xee\x61\xb0\x89\x62\xf0\xc4\xbb\x83\xc1\x9f\xdc\x06\x0c\xa6"
- "\xe3\xbe\x77\xac\x5e\x07\x18\x3c\x0b\x31\x78\x62\xcf\xec\x0d\x3f"
- "\x53\x8e\x16\xec\x97\x73\x2c\xde\x7b\x58\x8e\xc5\x7b\x4d\xb4\xae"
- "\x53\x2c\xde\xbb\x59\xc2\x62\x56\xef\xce\xda\x1b\xf6\xea\xee\xac"
- "\xbd\x61\xaf\x4e\xc2\xe2\x7d\x6f\x76\x8f\xc5\xbb\xb5\xce\xb1\x18"
- "\xce\x53\x2c\xde\xad\xed\x12\x8b\x9f\xb5\xc7\xe2\x12\x9b\xcc\x2b"
- "\xb3\x37\x18\xfe\xd9\x73\xb7\x94\xb8\x94\x7f\x35\x03\x48\x7a\xbd"
- "\xa2\xa4\x52\x5f\x40\x48\x4b\x06\x49\xd7\x5b\x9e\x25\x70\x0e\xc6"
- "\xaf\xe4\x86\x3e\x78\x14\xe1\xb6\x0c\x1e\x85\x78\xfc\x0e\xfe\x40"
- "\xc6\xcd\x51\x0a\x73\x8b\x8e\xf1\xc7\xd4\xdf\x15\xcf\x23\xf6\xee"
- "\xb4\xbb\xee\xec\x59\x7c\x4e\xe8\x27\xc2\x7d\x11\x6c\xdf\x4d\x68"
- "\xa9\x58\x46\xde\x34\x28\x3e\x9e\xce\x6f\x0e\x2d\x31\xfa\x85\x96"
- "\x38\xbb\xff\x61\x35\xf1\xee\xbb\x96\xe7\x0b\xf3\x78\x53\xcb\x23"
- "\x81\x45\x2d\x7f\x22\x24\x27\x8f\x37\xb6\x66\x7d\xbc\x01\xde\xf1"
- "\x93\x7f\x87\x7a\x2d\xfe\xdb\x8a\x5a\x32\x22\x08\x9c\x2b\x12\xcf"
- "\xc1\xb8\x11\x2e\xc3\x83\xe7\xe0\x1a\xbf\xe5\xca\x86\x9d\xa9\x80"
- "\x55\x29\x84\x3c\x71\x13\xe7\xcc\xc7\x25\xc0\x33\x01\xd9\xd0\xe6"
- "\x26\x68\x8b\xbf\xef\x41\x13\xf0\xa3\xaa\x2a\x93\xe0\x9c\x5e\x0f"
- "\xef\x55\x94\x8d\x63\xef\xf1\x58\x3e\xaf\x54\x11\xee\xfd\x00\x33"
- "\x1f\x38\xb6\x04\xe8\x41\x72\xe2\x09\xdd\xc3\xbf\x09\xea\xf1\xca"
- "\x34\x9e\x1b\xdc\x0f\xc6\xcf\xc4\xe6\x34\xf4\xef\x10\xe8\xb1\x3c"
- "\x3c\xb7\x30\x9e\xa8\xe1\xe7\xc3\x6f\x1d\x5b\xd2\x9a\xf5\xb7\x51"
- "\xf0\x9e\x1a\xec\x97\xab\x77\xdc\xb4\x1d\xd6\x9d\x07\x83\x71\xed"
- "\xa0\xcf\xc7\x67\xd3\xe7\x28\xb9\xf5\x56\x38\xcf\x67\xa4\xf1\xfa"
- "\x24\x0b\xf1\x85\xb1\xd8\x09\xfd\x46\x7e\xe4\x3e\x08\x2c\x5a\xf7"
- "\x00\x21\x7b\x93\x1b\x95\x7a\xe8\xbb\xf5\xdf\x1f\x34\xe9\x52\x7f"
- "\x4d\xe0\xba\x11\x75\x96\xcb\x8a\xbf\x8f\x98\x7a\x85\x10\xc4\x13"
- "\xf8\xff\x39\x13\xac\x63\x93\xa1\xbc\x09\xde\x83\x6b\x09\x56\x61"
- "\xdd\xcb\x8a\xbf\x5d\xd5\x25\x9e\x21\xbe\x5a\xe2\x9d\x0d\xef\xc6"
- "\xea\xfe\xed\x00\xd6\x35\x28\xfe\x1e\x8e\x7d\x80\x72\x35\x94\xf1"
- "\x3e\xf4\x21\x23\xfc\xae\x00\x33\xe5\xcd\xdc\xb1\x25\xdc\xe0\x00"
- "\x33\xc5\x3e\x78\xcf\x4d\xf0\xce\x50\xc7\x07\xea\xf8\xd0\x63\x2a"
- "\x51\xe7\xc2\x39\x6c\x07\x8e\x3e\xba\x25\xed\xd8\xf6\x6e\x6c\xdb"
- "\xc5\x38\xa8\xf8\x80\xb1\xb0\x76\xab\xe8\x9a\xaa\x49\x55\x9c\xac"
- "\x57\xfc\xdd\xe0\xab\xe0\x79\x7e\x57\xbf\xf4\x75\xa9\xc4\x27\x87"
- "\x23\x44\xf7\x00\xb6\xf3\xf7\xfd\xd0\xbe\x0a\xc7\xa2\x35\xeb\xef"
- "\xf9\x06\xc5\xdf\xc6\xe1\xf8\x02\x3d\x4d\x9a\x87\xe9\xfb\x1a\xf1"
- "\x39\x78\x8f\x50\x9f\xc6\xbe\xc7\x3e\x6b\x52\x3d\x78\x28\x9f\xf6"
- "\x50\x5c\x20\x1e\xc1\x3e\xd9\x70\x7f\xad\x81\xfc\x71\x03\xde\x6f"
- "\x60\xf7\x01\x2f\xfd\xbd\x19\x68\x16\x85\xe7\xb0\xec\xa2\xbf\x3e"
- "\x22\xdd\x2a\x83\x81\x37\x1c\x69\x27\xf2\x08\xf0\x85\xc8\x23\xd8"
- "\xdf\x7d\xa9\x06\x25\x5d\x87\x15\x9f\x50\xbd\x2e\x1b\x68\x68\x7d"
- "\x37\x58\xb5\x09\xc6\x96\xeb\x40\xba\xd4\xc3\xb5\x4f\x9f\x42\xba"
- "\x6c\x4a\x06\x9a\xb0\xba\xd3\xa5\xfe\x63\xf9\x53\x4a\x4f\x0e\x68"
- "\xc1\xf6\x6e\x7e\xea\x89\xef\xb3\xe9\x26\xd0\x31\x88\x37\x95\x25"
- "\x41\xbf\x90\x6f\x81\x47\xf6\xc6\x9b\x95\xe8\xd7\x87\xe7\x0f\x5d"
- "\x37\x2b\x37\x35\x11\x94\x2b\xc9\x46\xc0\xe5\x1d\x89\x30\xe6\xd0"
- "\x26\x1f\xda\x2f\xfd\x49\x91\x8e\xc9\x40\xbb\x44\xe0\x5d\x18\xf3"
- "\x4d\x30\x7e\x85\x80\x79\xf8\x7f\x21\xac\x3f\x1c\xd4\x33\x28\x3e"
- "\x0d\x87\xf6\xd4\x3b\x82\x78\xe3\xce\x20\xbe\x19\xc6\xf0\xcf\xad"
- "\x59\x9f\x86\x88\x63\x88\x7d\xda\x04\xe7\x37\xc2\x75\x83\xe2\x93"
- "\x7c\xc6\x43\x9f\xc4\x88\xef\xec\x6a\x3c\x37\xec\x25\xa3\x36\xee"
- "\x25\x21\x7f\xda\x4b\xc6\xac\x6e\x80\x79\x99\xf1\x5b\xfe\xc4\x2c"
- "\x0b\xac\x89\xa9\xb5\xed\x41\x8f\x14\xe1\xb7\x27\x6e\xdd\x83\x45"
- "\x6f\xee\x25\x43\x71\x6f\xec\xd4\x66\x42\x70\x0d\x9f\xea\x79\x9e"
- "\xd7\x6b\x6f\x10\xce\x2f\xb5\xd6\xba\xee\x31\xff\x29\x37\x08\x39"
- "\x1a\x66\x22\xa9\x09\xb0\x96\x5f\x6f\x24\xa9\x26\xde\x58\x95\x7e"
- "\x85\x00\xf6\x14\xb3\xb1\xfb\xcf\xba\xa9\xd1\x84\xe0\x9e\x41\xee"
- "\xfb\x30\x72\x6f\x0c\x51\xa5\x9c\x26\xc1\x69\x0d\x7c\xa3\x35\xef"
- "\xe9\x9c\xd4\x35\x44\xb9\xf7\x7a\x2d\x93\x3d\x15\xff\xb9\xe7\x20"
- "\xee\x4f\x6d\x8d\x24\x73\x2d\xc2\x7a\x94\x3b\xb6\x34\x2d\x96\xdc"
- "\x8f\xef\xe3\x4b\x65\xaf\xff\x7c\x11\xc6\xad\xd4\x3d\x7c\xfe\xcf"
- "\x00\x4a\xcf\xbc\x11\x9a\xbd\xf3\xcd\x20\x6f\x35\x95\xa4\x45\xf3"
- "\x8d\x28\xd7\xc1\xfa\x42\x65\x41\x7d\xa3\x05\x64\xab\x85\xb0\x7e"
- "\x1b\xc8\xe7\xf5\x45\x4a\x6e\x73\x53\x89\x9b\xcf\x48\xa2\xeb\x36"
- "\xae\xa5\xd0\xf7\x19\x61\x24\x9d\xf6\x1f\xd6\x4c\xdf\x04\x94\xa7"
- "\xf8\xf3\xd8\xff\x43\xf0\xae\xfc\xc0\x69\x30\x4f\x3f\xb5\xe0\xfa"
- "\x39\xb5\x4e\x47\x2a\xcc\x56\xb2\xbd\x89\x8e\x91\x17\x8c\x91\x0a"
- "\xae\x55\xc3\x38\x79\x3b\xa3\x1b\xd2\x8c\xcb\x49\xad\xe5\x3c\x18"
- "\x6d\x28\x5d\x4c\x8c\x2e\x53\x96\x11\x58\x47\x81\x36\x9b\x19\x6d"
- "\xb8\xc0\x31\x45\x48\x1b\xf7\xde\xe3\xbf\xc2\x5d\xad\x2f\xf8\x6c"
- "\x1e\xf8\x03\xf9\x82\x0b\x18\x53\x84\xcf\xc6\x3e\xe0\xf7\x33\xe4"
- "\x83\xa9\x6f\x9e\xe7\xab\xb4\x8d\x44\x0f\xef\xc3\xfb\xd9\xf7\xc1"
- "\xe2\x6e\x1f\xca\x5c\xf5\x61\xc3\x13\xc0\xb7\x4f\x00\xdf\x3e\x01"
- "\x7c\x6b\x60\x7c\x7b\xbc\x8e\xf1\xad\x15\xfa\xd5\x06\xb2\xfb\xea"
- "\x19\x44\x89\xfd\xda\x7d\x06\x63\xf4\x41\x3f\x1b\x25\xde\x9d\x7c"
- "\x15\xc6\x48\xe4\x5f\x8f\xc7\xfc\x71\x7c\xaa\x4c\xb5\x24\x0d\xf9"
- "\xb7\xdd\x19\xff\xee\x2f\x98\x3a\x0f\x68\xf3\x07\xe0\xdf\xef\xc2"
- "\x88\x4f\x03\x51\xad\x99\x01\xfc\xdb\xe8\x8c\x7f\xf7\x2f\x3e\x00"
- "\xcf\xec\xc4\xbf\xd1\xf6\xfc\xbb\xbf\x97\xfb\xfc\x5b\x5a\x63\xe3"
- "\xdf\x99\x02\xff\xc6\x3a\xf0\x6f\x83\x1d\xff\xe2\x7b\xbb\xcd\xbf"
- "\xfb\x47\xb9\xc7\xbf\xa5\x07\x6c\xfc\x0b\x7a\xc9\xf6\x37\xe8\x18"
- "\x79\xc1\x18\x01\xff\x96\xe6\xc0\x38\x39\xe5\xdf\x9f\x9f\x7e\xff"
- "\x3d\xab\xe7\xf4\xfb\xef\xc7\xbb\xa7\xdf\x67\xc7\xdc\xa7\xdf\x67"
- "\xb9\x77\x9e\x7e\x9f\x99\xdd\xa3\xdf\x67\x29\xae\xe9\xf7\x59\xc4"
- "\x2f\x87\x7e\x07\x43\x7a\x4e\xbf\x03\x57\xbb\xa7\xdf\x81\xb7\xdc"
- "\xa7\xdf\x81\xe9\x77\x9e\x7e\x07\x4a\xdd\xa3\xdf\x81\x31\xae\xe9"
- "\x77\x40\xed\x8a\x7e\x2f\xdc\xcf\xf1\x1c\xfa\xcd\x05\x0d\x22\x28"
- "\x03\x31\x79\xed\xe0\x15\xd4\x19\xa1\xac\x12\xcb\x54\xa6\x02\xbd"
- "\xda\xa1\xec\xe3\x50\x56\x3b\x94\x03\x1c\xca\xc1\x0e\xe5\x10\xb1"
- "\x0c\xf4\xf2\xbc\xa6\x38\xf8\x1a\xe8\x6c\x20\xe3\x1c\x34\x09\xd7"
- "\x43\xe7\x5a\x35\xa8\xf7\x85\x3a\xeb\xfb\xa6\x0c\xde\xac\x4d\x25"
- "\x0f\x36\x29\x0e\x45\x51\x7a\xac\x7b\x20\x8c\x4f\x4e\x27\x40\x8f"
- "\x86\x29\x6b\x90\xaf\x8c\x84\xef\x08\xf6\x82\x71\xba\x0f\xf4\x4d"
- "\x23\xf2\x9c\x26\xfe\x73\xbe\x5e\x71\x68\x32\xbe\xdf\x13\x5a\x1d"
- "\xe1\x3c\x1e\xc3\x9c\xe8\x0a\xa0\x4f\x83\xd1\xe3\xb1\x07\x40\x1f"
- "\x2d\xca\x56\x72\xde\xd9\x19\x9c\x66\x8d\x91\x37\x4e\xfa\x11\xd6"
- "\x31\x58\xcb\xf4\xcd\x66\xe0\x49\xde\xa8\x8b\xbf\x0a\xfd\x3d\xf4"
- "\x69\x65\x0a\xb4\x0d\xcf\x81\x67\x19\x78\x75\x53\x99\xde\x52\x4d"
- "\x78\x68\xa3\xca\x54\x0e\xba\x7f\x2d\x11\xda\x34\xf0\x7e\x4d\x65"
- "\xd8\xa6\x53\xfd\x2c\x77\xd0\x70\x78\xe6\xb3\x33\xc2\x54\x84\x5f"
- "\xab\x0a\x70\x8f\x3f\x0e\xd5\xba\xd4\xfb\x72\x07\x7d\xc2\xda\xf5"
- "\xbe\x85\x76\x3f\x1f\xe6\xba\xdd\x50\xa1\xbf\xea\x5b\x69\x77\x7d"
- "\x17\xed\x0a\xfd\xd5\xdc\x4a\xbb\x06\xd7\xed\x0e\x16\xfa\x1b\x7e"
- "\x0b\xed\xea\x5c\xe6\xff\x80\x76\x85\xfe\xa6\xdf\x4a\xbb\x39\x5d"
- "\xd0\x6d\xf8\xad\xf1\x82\xae\xa1\x2b\x5e\xb8\x35\x3e\x38\xdc\xc5"
- "\xfb\x87\x0e\xbf\x35\x1e\x38\xbc\xa1\x2b\x1e\xb8\x35\xfa\x1f\xee"
- "\x92\xfe\xb7\x46\xfb\x7f\x0c\xef\x8a\xf6\xb7\x46\xf7\x7f\xb8\xe4"
- "\x7f\xd4\x65\xf9\xdc\x87\xab\xf9\xa0\x69\x84\xdb\x72\xbd\x9a\x0b"
- "\x7a\xf8\xcb\x75\x5c\x38\x79\x01\x30\xcc\x37\x9f\xf8\x85\x53\xfb"
- "\xd0\x91\x90\x35\x05\x44\x99\xa3\xe4\x94\x7b\x92\x6b\x95\x7a\xcb"
- "\x28\x92\x66\xe1\xad\xbb\x12\xcd\x8a\x41\x70\xfe\x70\x0c\x21\xa6"
- "\xe5\x61\x84\xb6\xe3\x7f\xbd\x3a\x3b\x35\x9c\x4c\xb5\x12\xb4\x47"
- "\x98\x8e\xa4\x00\x86\x01\x8e\xe9\xf3\xcd\xb8\xe6\xf9\xc1\x7d\x16"
- "\xe0\x5f\x68\xc3\x4c\xf6\x71\x46\x45\x78\x3c\xad\x67\x04\xbd\xd1"
- "\xc8\xe7\x3d\xfc\x25\x9f\x16\x46\x32\xe1\x7f\x78\xe6\x9b\x1e\x46"
- "\xa2\x2c\x04\x7d\xb2\x35\xeb\x08\xe0\x72\xd9\x2c\xd4\x31\x41\x97"
- "\x6d\x4e\xfb\x11\x6d\xee\xd3\xc8\x3a\xd0\x6b\xb1\xee\x5e\xce\xa8"
- "\x7c\x42\x4b\x94\x47\x8c\xa8\xbf\x1f\xd9\x7d\x38\x81\x90\x2e\x6c"
- "\x2e\x2a\x2e\x60\x74\x00\xde\x8f\xed\xa0\x2d\x73\x13\x07\x63\x1b"
- "\x30\xb6\x14\xfb\xcb\xe7\x3e\xb2\x5e\x97\x8c\xeb\x42\xd9\xf0\xf1"
- "\x8f\xf2\xad\x02\xce\x3f\xd0\x04\x65\xaa\xb3\x67\xf0\xd5\xbc\xfa"
- "\x4a\x29\x9f\x7d\x6f\x78\x95\xe9\x3a\xd1\x25\xb6\x93\x7a\x45\xd9"
- "\x08\x7c\x76\x4b\xc0\x68\xb5\x29\x60\x74\x70\x6b\x56\xd9\x30\xb1"
- "\xbf\xf8\x2c\xf1\x3c\xda\x28\x58\x1f\xcb\x22\x0e\xa7\xb8\xee\x23"
- "\xac\x25\xfe\x53\x83\x79\x23\x8e\xa1\x2e\xf5\x3a\xf4\xe5\xe8\x51"
- "\x1c\x67\x3e\xf7\x59\x83\x29\x2d\x6c\x00\xb3\xd9\x95\x35\xa3\xed"
- "\x07\xd6\x81\x1a\x6a\x87\xd9\xdc\x54\x43\xfd\x6c\x00\xef\x41\x67"
- "\xcf\x47\x79\xe5\x9a\xa2\x8c\xe6\x3f\x9e\x11\xa6\x74\x53\xe7\x29"
- "\xa3\xeb\xbf\x6e\x00\x8e\xc3\xd1\x3d\xf0\xbc\xd1\xf5\x8a\xa3\x6a"
- "\x66\xc7\x6b\x6a\xc4\xe7\x41\x9d\x02\x78\x66\x23\x9f\x73\xa5\x04"
- "\xeb\xc1\xf5\x61\xc2\x75\xa3\xdd\x75\x23\x9f\x3b\x3a\x4c\xb8\x2e"
- "\xd8\x01\x9b\x4c\x76\xd7\x4d\xda\x01\x68\x97\x3b\x9a\x84\xef\x04"
- "\x6b\x59\x35\xae\x6b\x68\xf3\x67\x76\xf5\xa6\x6a\xa1\x5e\x43\xb3"
- "\xe2\xe8\xe6\x16\xe0\x2b\xb8\xde\x6c\x77\x7f\xf3\x91\xa4\x61\xe4"
- "\x85\x1d\x38\xa6\x47\x77\x19\x3c\xae\x97\x30\x5b\x4e\x59\x11\x1d"
- "\x0b\x75\x53\xb9\x7d\x7b\x06\xc5\x51\x2d\xb4\x59\x6e\x02\x59\x0f"
- "\xea\xac\xc7\x67\xda\x8f\x7f\x74\x7c\xfc\xd2\x78\xcd\xe0\x85\x9a"
- "\x85\x8b\xe7\x69\x16\x2c\x5d\xb1\x24\x61\xec\xe0\x85\xbd\x09\xb1"
- "\xe3\x1d\x35\x9f\xe1\xcb\x73\xb9\x23\x23\xf5\xf9\x20\x63\x29\xd5"
- "\xb0\xde\xb6\x93\x5c\xa0\xab\x25\x6f\xc2\x30\x6b\xd0\x78\x9d\x35"
- "\x6f\xc8\xb0\xb4\x1b\x44\x99\x1a\xcc\x5f\xd0\x25\x3f\x0f\x34\xf8"
- "\x62\x2c\xae\xf7\x7a\x0d\x21\x1b\x80\x5f\x75\xc9\xff\xc0\x73\x74"
- "\x0f\x8c\x3e\x8a\x9d\xfb\x7b\x6a\xb9\xf2\xf3\xd4\x5a\x65\x45\xd4"
- "\x75\x72\x24\xd8\x48\xca\x34\xd7\x49\x01\x9e\xe7\xaa\xe9\xb7\x19"
- "\xa8\xff\x3e\x3e\x0b\xed\x5b\xf8\x3f\xb3\xd5\x7d\xf1\x28\x3e\x47"
- "\xf3\x00\x7e\x33\xf8\xe2\x71\x7c\x9e\x41\xf1\xc5\x50\x8f\x02\xa2"
- "\x00\x79\xc6\x07\xea\x5d\xe1\xb6\x8e\x8c\xa4\xf3\x3b\xeb\x68\x9d"
- "\x45\xe9\xb7\xa4\x70\x0b\xf1\xde\xb9\x85\x90\x02\x7f\xa2\x6a\xcd"
- "\xfa\xa2\xc6\xa0\xea\x95\x80\xe3\x05\x4d\xfb\xb4\x28\xc9\x6f\xe1"
- "\x5c\xa3\x81\xfc\x31\x14\xcf\xc1\xbc\x32\xb9\xc2\x0b\xfc\x56\x66"
- "\xde\xe5\xaf\xe3\x02\x46\x4e\xe4\x61\x2c\xcc\xa1\xfe\x46\x5f\x2d"
- "\xf0\x0b\xcc\x1b\x3e\x70\xe4\xc4\x66\x45\x79\xc3\x17\xc0\x41\xa9"
- "\x38\x4f\x61\x3c\xfe\x7a\xd3\x8c\xdf\xc8\x86\xed\xbe\x69\x84\xf2"
- "\x78\xdd\x87\x89\x66\xe5\xf1\x71\xa5\x44\xf3\x32\xca\x43\xff\x33"
- "\xfb\x77\x0b\x79\xcb\x63\x11\x20\x3b\x36\xfc\x8d\x9c\xa8\x2b\x27"
- "\x3e\xb3\x88\x87\x2d\x7e\x7b\x02\x51\x4e\x35\x40\x79\x05\x51\x56"
- "\x81\x2e\x8f\xf6\xf6\xd4\xe7\xd0\xe6\x5e\x49\xd0\x0e\xcf\x2b\xe3"
- "\x2a\xf6\x5c\x37\x03\x2e\x35\x7a\xe2\x7e\x6f\x4e\x9d\x59\x8c\xf7"
- "\xcc\x35\x09\xdf\xaf\x5a\x84\xef\x57\x2d\xf4\xfb\x95\x16\xbf\x5d"
- "\xe1\x37\xab\x94\x28\x9e\xb3\x2e\x0f\xf3\x9f\x1a\xe5\xc1\x63\x9b"
- "\xf8\x3d\xeb\x5e\x90\xfb\xf9\xe5\x61\x7d\xb7\xc5\x93\x80\x2a\x63"
- "\x23\xd1\x37\x96\x93\x77\x13\x49\x00\xdf\x12\xd3\xab\xa2\xec\x38"
- "\xe1\xb7\xa4\x17\xed\x4b\xd5\x79\x5a\xd1\xe6\xd1\x12\xdc\xdb\x77"
- "\xad\x02\x6d\xf7\x7d\x37\xc4\x93\xa1\x3b\xaf\x93\x61\x73\x2f\xa5"
- "\xd3\x58\x4e\x98\x77\xcf\xd2\x12\xa6\xe9\x68\x09\x7b\xb8\x7d\x79"
- "\xd8\x00\x5f\x23\xfb\xde\x35\x3b\x56\x4d\xf0\x9b\x16\x9f\xf5\x5f"
- "\xeb\x77\xa2\xdd\xd9\x64\x24\x16\xbf\xcc\x62\xe4\x4f\x78\x6e\x08"
- "\x7e\x23\x49\x5b\x45\xd4\xdc\xc5\x30\x52\xd9\x7c\x9d\x3c\x09\x7c"
- "\x83\xdf\x03\x0a\xeb\xd9\xf7\x00\xeb\xe6\xd4\x5a\xfc\x26\xd0\xba"
- "\x3c\x4c\x39\xf9\x2a\xac\x57\x59\xff\x43\xda\x07\xfb\xeb\x8e\x86"
- "\x9d\xc5\x35\x61\x98\x34\xef\xcb\x3f\xbe\xb5\x79\x5f\x4e\xf7\xff"
- "\xe3\x37\x32\x1e\xf8\x79\xf7\x75\xa4\x1b\xd0\xef\xba\x51\xf9\x52"
- "\x03\x6f\xa9\x6c\xf8\x08\xe8\x53\x2b\xa3\x0f\xa5\x67\xbc\x59\x79"
- "\x79\x21\xd0\xe5\x12\xa3\x55\x85\x09\xe8\x74\x18\xdb\x18\x1d\xb1"
- "\x07\x68\x0d\x3a\x8f\xb2\xc2\x7c\x96\xc6\xa2\x40\x7a\xed\x6e\x2f"
- "\xf7\x6c\x0f\x78\xb8\x1a\xbf\x35\xb6\x86\xfa\x1b\xda\x72\x47\x86"
- "\x75\x04\x8c\x1c\xd5\xc5\x77\x47\x2d\xd2\x6b\x4d\x2c\xf1\xae\x68"
- "\x38\x45\x28\xcd\x96\x09\x34\x43\xff\xb4\x95\x61\x7d\x2d\xad\x61"
- "\xfe\xdb\x80\x56\x55\x09\x06\xb2\xfd\x3a\x09\xd0\x37\xd6\xe2\x37"
- "\x99\x5e\x2f\x4d\x23\xe4\xa5\x0f\x79\xae\xb2\xec\x0c\xa5\xdf\x5e"
- "\xa0\x9f\x05\xe8\x87\xdf\x22\x6d\xf4\x4b\x04\xfa\xdd\x04\xfa\x5d"
- "\x95\xe8\x67\x6d\x05\xfa\xb5\x02\xfd\x56\x02\xfd\x4c\x8e\xf4\x2b"
- "\xf5\xc1\xef\x95\xf8\x5d\x08\xe9\x87\x3e\xd1\xdc\xca\xb0\x10\xfa"
- "\x9d\x72\x41\x18\xd9\x39\x9f\x78\x3f\x6e\x26\x8a\xb4\xc3\x44\x0d"
- "\xfd\x54\x0f\x81\xf1\x85\xf6\x80\xbf\xeb\x89\xbe\xd4\x4a\x56\xbf"
- "\x46\x06\x20\x3d\x2d\x02\x3d\xf5\x96\x4f\xc9\xcd\xd6\x30\x25\xb4"
- "\x39\x6a\xdb\x4d\x32\x66\xd2\x25\x0d\x39\x3a\xbd\x92\x00\x3d\x0a"
- "\xb8\xad\xcf\x1a\x6e\x7d\x1e\x56\xc4\xf5\x7c\x1e\x1e\xbf\xf4\x7f"
- "\xf3\xf0\x56\xe7\xe1\xf1\xf5\xce\xe7\x61\xc5\x33\xb7\x36\x0f\x2b"
- "\x46\xfd\xdf\x3c\xfc\x25\xcd\xc3\x8a\x50\xc7\x79\x68\x93\x15\xe2"
- "\xa3\x17\xcf\x8b\x5d\x12\xbb\xe4\x0f\x9a\xf9\xab\x12\xa2\x97\x33"
- "\x89\x41\x26\x33\x84\x59\xb9\x70\xe5\x3b\xb0\x9e\x9e\x08\xae\x25"
- "\xfb\x1e\xa8\x55\x72\xaf\x07\xab\xf8\x9c\x3c\x23\x97\xb3\x2d\xe9"
- "\x1d\x90\x7d\x71\xbe\xe6\x82\x5c\x7b\x59\x51\x1b\xf9\x3f\x21\x20"
- "\xf3\xc5\x37\x11\xfc\x9f\xc9\x4b\x91\x31\xb8\xb7\x30\x3f\x8f\x6f"
- "\xc4\xbd\x85\xc7\xc7\xe1\xda\x5f\x75\xac\x4f\x24\xac\xeb\xaf\x07"
- "\x93\xb6\xd7\x23\x95\x7f\x3a\x43\xbc\x7d\x6b\xc9\x24\x8e\xe3\x79"
- "\x5d\x6a\x13\xc8\x5a\xa7\x8a\x74\x33\x9b\x88\x26\xd9\x1b\xea\xd6"
- "\x28\x34\xc9\x6b\xe1\xf8\xd5\x25\x4d\x72\xd6\x79\x38\xbe\x4f\xed"
- "\x1b\x41\x7c\x23\x9f\x37\xa2\xc8\xfa\x41\xa0\x1a\xbf\x29\xee\x0c"
- "\xe2\x1b\xf6\x82\x6c\xbf\xb7\xdd\xac\x5c\x77\x1d\xf8\x23\xe3\x21"
- "\x1e\xbf\x0d\xe2\xb7\xc7\x75\xf1\x30\xc6\x20\x6b\x32\x79\xf0\x2b"
- "\x4f\x9c\x2f\x1b\xf2\xf8\x86\x43\x97\x6b\x95\xf8\x6d\x14\xe7\x90"
- "\x49\x7d\xa5\x24\x13\xde\x05\xfa\x69\xd8\x1e\xc4\xd7\x19\x03\x47"
- "\x46\xaa\x34\x44\xd9\x9a\xa5\x1f\x03\x72\x97\x09\x65\x8a\xf5\x70"
- "\xed\x4f\x70\x8d\x7d\xa7\xfb\x52\xc7\x7b\x55\x79\x23\x6e\x01\xff"
- "\x2a\xae\x29\xf4\x6f\xb5\xc1\x7b\x6e\x60\xba\x40\xa3\x79\xeb\xc8"
- "\x51\x96\xf7\xfd\x0d\x16\x94\xe3\x06\xfb\x1b\xdb\x03\x47\x86\x59"
- "\xb6\x8e\x9c\x38\xe3\x51\xfa\x3d\x1a\xea\x9f\x1c\x8f\xef\xd1\x11"
- "\x30\x64\x18\xd4\x37\xb5\x04\x4c\x18\xd6\x92\x3b\x5e\x77\x3c\xa9"
- "\x44\xc0\x33\xfd\xa7\x2f\xe5\x0b\x78\x96\x0f\xf3\x25\x12\xf0\x2c"
- "\xb2\x33\x9e\xb1\xef\xf7\x56\xc2\x70\xad\x92\x40\x5b\x0d\x38\x5f"
- "\x50\x36\xdc\x03\x63\x81\x73\x01\x79\x9e\xe2\x1b\x60\x9b\x38\x2f"
- "\x70\xce\x20\x86\xd1\x39\xea\x30\x47\x70\x5e\xf4\x31\x12\x35\xce"
- "\x0b\xc4\x38\x9c\x17\xe8\x17\xf3\xce\x4d\x36\x2f\x7c\xeb\x88\x9a"
- "\xce\x0d\x4b\x39\x9d\x1b\xa8\x17\x54\x58\x1c\x70\xcd\x6e\x5e\x6c"
- "\x14\xe7\x85\x88\x6b\xc0\xfb\x16\x9c\x17\x2b\xe5\xf3\xe2\xf5\xb3"
- "\x6a\x42\x31\x2f\xeb\xbf\x7c\x0a\x60\x5e\x54\x69\x8d\xc4\x2a\xe2"
- "\x1a\xcc\x0b\xdc\xb7\x43\x71\xed\x8f\x02\xae\x19\xe1\x3c\xcc\x87"
- "\xc2\x45\x72\x5c\x6b\x6b\xed\x4e\xbe\x38\xe9\x77\x6b\xb8\x76\x92"
- "\xea\x10\x48\x2b\xa4\x1b\xd2\x0b\x69\xf4\xcf\x44\x1f\xc4\x2d\xab"
- "\xda\x05\x6e\x39\xa1\x0f\xf0\x73\x33\xfc\xdf\x89\x46\x7c\xd6\xa7"
- "\xd3\xed\xb1\x0b\x31\x0b\xf1\x0b\x71\x0b\x31\x0c\xe7\x01\x62\x17"
- "\xc5\x2d\xc0\x74\x28\x37\x56\xc6\xd4\x53\x4c\x4b\xbb\x44\xd4\x69"
- "\xe3\xc9\x00\xc4\x30\xbd\xe5\x06\x41\x4c\xa3\xf4\xf3\x93\xe8\x87"
- "\x18\xb6\x3d\x91\x8c\x99\x1c\xab\x21\x88\x5d\x06\x45\xb5\xe5\x68"
- "\xd8\x29\x42\xf5\x81\x8c\x7e\xff\xba\xd3\x1f\xe6\xed\x16\xa2\xca"
- "\xf5\x27\xde\xad\x59\x5f\x1a\x3a\xeb\x02\x5f\x9a\x44\x5d\x00\xe7"
- "\x2c\xce\x5d\x83\x42\x4f\x75\x38\xdd\x03\xcf\xc2\xfc\xd5\x7b\xb3"
- "\xef\xd2\x4f\xa7\x33\xdb\xf8\x69\x96\x5b\x01\xf4\x68\x49\x87\xfe"
- "\xea\x39\xf6\x3d\x1c\x74\xe6\xc0\x47\xd6\xf3\x9b\xaf\x94\xe2\x58"
- "\xe2\xbb\xcd\x7d\x14\x78\x6e\xeb\x68\xf5\x26\x1c\x9f\xad\xa0\x8f"
- "\x6f\x1d\x1d\x2c\xf1\xd7\x57\xcb\x8e\x26\x11\x32\x23\xc9\x5d\xfe"
- "\xfa\x4a\x4b\xfb\xf0\x6d\x64\x3f\xfe\xf5\x48\x15\xf7\x6d\xa4\x27"
- "\xf0\x42\xf0\x52\x6b\x3a\xb9\x99\x13\x19\x95\x66\xe1\x1b\x35\xc9"
- "\xe4\x31\xe8\xd7\xc9\xe3\xa0\x7f\x1f\x4f\x20\x44\x1f\x11\x07\x74"
- "\x7d\xd5\xb0\x8f\x33\xaa\x0c\x8a\xaa\xf2\x9d\x30\xce\x80\xad\x2a"
- "\x7b\x6c\x65\x38\x5a\x45\x73\x00\x98\x73\x22\xb5\xd8\xd6\xd4\x72"
- "\xe2\xab\x99\x80\xfe\x76\xa7\x96\xad\x5a\x43\x70\x0f\xa9\x27\xfc"
- "\x3f\xb6\x6d\xcb\x10\x03\xdc\xdf\x97\xff\x76\xba\x42\x3b\x01\xd6"
- "\x97\xd7\xa7\x2b\xf0\xfb\xff\x47\xa9\xf9\x4a\x0e\xce\x31\x7f\xa2"
- "\x7c\x82\xd7\x37\xb4\xab\xa8\x1c\xc5\x41\x9d\x2a\x53\x3e\xd9\x90"
- "\xe8\x4d\xb0\x3e\xf3\x51\xcb\x27\x58\x7f\x63\xbc\x9a\xfa\x0f\xd0"
- "\xfb\x2c\xf9\x04\xef\xb5\xc2\xf9\xb7\x39\x1f\x92\x9d\x1c\x40\x8e"
- "\x47\x54\xd1\x36\x8e\x47\x7c\x41\xb0\x0d\xe0\x79\xf8\xff\x10\xd9"
- "\x94\x18\x0c\x73\x3c\x1f\xae\x7f\x4d\x36\x5d\x0b\x81\xe3\x65\xf8"
- "\xdd\x24\x4d\x8a\x1a\xc3\xf1\x08\x8e\xf8\xae\xfd\x2d\x0f\xbc\xcb"
- "\xeb\x71\x5f\x62\x2a\xf1\x82\x75\xe2\x8a\xbe\x36\x07\xd6\xba\xaf"
- "\xaa\x71\xdf\x3a\x9f\xf6\x7a\x33\xc7\xbf\x7e\x95\x4b\x7b\xfd\x1a"
- "\x3e\xdb\xca\xbf\xfe\x03\x3e\x7b\x63\xb2\x46\xf0\x51\xcd\xa7\xfe"
- "\x75\x1b\x6e\x86\x12\xec\x2b\x3e\x17\x9f\xb7\x29\x3e\x4c\x78\xe6"
- "\x50\xda\x37\x7c\x26\xb6\x69\xff\x4c\xcc\x09\xaf\x79\x05\x9f\x79"
- "\x6a\x36\x1c\xfd\x80\x1e\x35\x48\x07\x7c\x3e\xc7\x47\x7a\xf2\x69"
- "\x91\x1e\xf4\x9e\xa4\x46\x67\xf7\x6c\x16\xee\xa1\xb1\x58\xf0\x9e"
- "\x76\x56\x9f\xb6\x01\x6b\xdf\x1e\x3c\xff\xab\x48\x1d\xe9\x4c\xc3"
- "\xaf\x5f\x64\x6b\xe1\xd7\xf7\xb3\xb5\x90\xd1\x94\xf2\xca\xeb\x91"
- "\x9e\x40\x37\x35\xae\x9b\xd0\xc6\x8f\xb6\x36\xbe\x8d\xf4\x40\x7a"
- "\x23\xdf\x88\xbc\x84\x7c\x24\xf2\x10\xed\x27\x70\x9d\x3d\xcf\xc0"
- "\xff\xde\xac\x9d\xaf\x9f\x11\xdb\x81\x3e\x10\x91\x8f\x7e\x05\xd7"
- "\x3b\xf3\x51\xad\x9f\xc4\x47\xdf\x7c\x6c\x4e\xe5\x79\xe4\x23\xdd"
- "\xcc\x0c\x6c\x67\xad\xd4\x9f\xe9\x0a\xe4\xb1\x7f\x32\xde\x32\x20"
- "\x9d\x7e\x95\x42\x02\xd8\xfb\x7c\x43\xf3\xe7\xfe\x2a\x45\x17\x80"
- "\x7d\x15\xdf\x03\xfb\x90\xcd\x69\x88\xf8\x1e\x9b\xda\x43\xa1\xdd"
- "\x6b\x44\xb8\xe7\x4d\x6c\x5b\x1c\x03\xa0\x19\x11\xef\x11\xeb\x67"
- "\x73\x61\xd0\xef\xa1\xf4\x1e\xc6\x73\x97\x9d\xf0\xcf\x37\x27\x1d"
- "\x79\xae\x4f\x0a\x01\x41\x16\x64\xa7\x99\xd7\xf1\x39\x57\x59\xdf"
- "\x3e\xb7\xb6\xc3\x33\x80\x06\x4a\x76\xbe\xd6\xd3\x8e\x27\x84\xf6"
- "\xcd\x4e\xda\xaf\x7d\x4a\xd6\x7e\x24\xb4\x9f\x04\xed\xa3\x6c\x36"
- "\x13\xed\x60\xb5\x34\x07\xf6\xaf\x92\x58\xfb\x22\xdf\xf2\x39\xa1"
- "\x25\xda\x64\xf4\xf1\xac\x35\x31\x3c\xad\x5a\x86\xf5\xa8\x6f\x91"
- "\x92\x2b\xe2\x1c\x7c\x8b\xec\x7d\xcf\xf6\xa5\x1a\x05\xbf\xa2\xda"
- "\x53\x58\x07\xf0\xd5\x84\x32\xe6\x1e\x90\xcf\x24\xdf\xa2\x33\x78"
- "\xfd\xac\x2e\xb1\xde\xce\xb7\xa8\x96\xea\xfb\x06\xc5\x69\x6f\xd0"
- "\x25\x95\x50\x2e\x63\xe7\xab\xb4\xf6\xe7\x25\xdf\x3d\x76\x1e\xfd"
- "\xa2\x05\xdb\x6b\xf3\x91\x52\xb4\xbd\x9d\xd6\x88\xf6\x4e\x17\xba"
- "\xaa\x1b\x32\xf0\xc5\x04\x49\x06\xbe\x98\xe0\x5a\x06\x3e\x5d\xd9"
- "\xb5\x0c\x6c\x38\x20\xc9\xc0\xe7\xfb\xb3\x79\x7f\x5e\xc1\xe6\xfd"
- "\x39\x1a\x0f\x39\x1b\xda\xb3\xfc\x79\x9a\x86\xff\xa0\x5f\x09\xf2"
- "\x79\x21\xc8\xb4\xfb\x12\xcb\x95\x7b\x40\x4f\xb6\x2a\x1f\xe2\xd7"
- "\xc1\xd8\x61\x4c\xb5\x75\xc9\xb0\x4e\x5b\x6a\x48\x95\x0a\x65\x60"
- "\xf4\xd1\x3a\x37\xb0\xaa\xd9\x4c\x60\x9d\xcb\x61\xe3\x72\xe6\x51"
- "\xa0\x85\x87\xde\x6c\x26\xb4\x1e\x5c\x83\x75\xad\x01\x65\xe0\x43"
- "\x5c\xb9\xb2\x10\xc6\x14\x7e\x2a\x53\x40\x84\xd1\x5e\x46\x6e\xcd"
- "\x3a\x13\xe9\x5c\x36\x3e\x5b\x67\xc9\xb2\x97\x8d\xcf\xbc\x8f\xb2"
- "\x31\xda\xc8\x51\x0e\xe0\x98\x4c\x6c\x00\xf9\xd8\x88\x72\x32\xca"
- "\xc6\x9c\x4c\x36\xae\x9b\xd7\xb5\x6c\x7c\xe6\xe4\xff\xc9\xc6\x3f"
- "\x55\x36\x76\xa5\xf3\xd7\x3d\x7e\x6b\xb2\x71\xdd\xd0\xff\x93\x8d"
- "\xef\x96\x6c\x5c\x17\x2c\xca\xc6\x5c\x46\xbf\x5f\x17\x6c\x81\xf9"
- "\x6a\x93\x8d\xcf\x5a\x3a\xcb\xc6\xe7\xd4\x9d\x65\xe3\x33\x71\x92"
- "\x6c\x7c\xc6\x47\x2e\x1b\x37\x0c\xee\x2c\x1b\x9f\x9b\xed\x4a\x36"
- "\x06\x5c\x6a\x46\xd9\x18\x79\x0a\xe5\x64\x94\x8f\x39\x90\x8f\x19"
- "\x7f\x9d\xdb\x78\x6b\xb2\xf1\xb9\x0d\x3d\x93\x8d\xcf\x5d\x75\x2e"
- "\x1b\x9f\xae\x70\x2d\x1b\x9f\xae\x70\x2e\x1b\x1b\x36\x4a\x32\x8d"
- "\xe1\xb5\x5f\xbe\x6c\x7c\xde\xe2\x5c\x7e\x31\x78\x32\xd9\xf8\x5c"
- "\xf3\xed\x97\x8d\xcf\x35\x3b\x97\x8d\x0d\xab\x98\x1c\x71\xce\xd8"
- "\x59\x36\x86\x7b\x9c\xca\xc6\x86\x3d\xc2\x3d\xcd\x72\xd9\x98\xb5"
- "\x01\x6b\xe2\x31\xd7\xb2\xf1\x85\x68\xb6\x46\x5e\x18\xc1\xd6\x48"
- "\x46\xd3\xce\xb2\xf1\x85\x7b\xbb\x97\x8d\x19\x0f\xd1\x7e\xba\x94"
- "\x8d\x2f\xcc\xe8\x2c\x1b\x9f\xae\x70\x2e\x1b\x5f\x7c\x5c\xe2\xa3"
- "\xfa\x4a\xb9\x6c\x7c\x61\xc7\x3f\x87\x6c\xec\x8a\xb7\xce\x5b\xe4"
- "\xb2\x71\xfd\x62\xf7\x65\xe3\xfa\xf7\xdc\x93\x8d\x91\xe7\x9c\xc9"
- "\xc6\xf5\x57\x1d\x79\x4e\x2e\x1b\x5f\xec\xe5\x5c\x36\xbe\x38\x50"
- "\x2e\x1b\x63\xfb\xce\x64\xe3\x8b\x93\x65\xed\x77\x92\x8d\x2f\xc6"
- "\xca\x65\x63\x56\x4f\x92\x8d\x1b\xd4\x82\xad\x61\x85\xfb\xb2\xf1"
- "\xc5\x1f\xbb\x96\x8d\x2f\xb6\xc9\x65\xe3\x8b\x15\x4c\x06\x6e\x08"
- "\x65\xb2\xf1\x45\x03\x3b\x7f\x3a\xc1\xfe\xbc\x24\x1b\xb3\xf3\x9d"
- "\x65\xe3\x86\x31\xdd\xc8\xc6\xe1\x3d\x97\x8d\x7f\x98\x54\x6e\x93"
- "\x8d\x7f\x98\x24\xca\xc6\x98\xe3\xa7\x00\xe4\xcd\x02\x2a\x1f\x1f"
- "\x27\xc7\x17\xd2\x35\xe7\x6a\xd7\xf2\x71\x73\x8a\x24\x1f\x37\x55"
- "\xb2\xb9\xdf\xf4\x31\x9b\xfb\x4d\xcb\x6c\x36\x62\x90\x8d\x51\x46"
- "\x16\x6c\xc4\x35\x1b\xe0\xb7\x2f\xb9\x9c\xca\xc7\xe8\xbf\x8e\x32"
- "\x32\xca\xc7\x28\x27\xa3\xec\x5b\x99\x49\x48\x95\xd1\x8c\x3e\x1d"
- "\xd5\xba\x01\x38\xae\x4d\xb3\x41\xae\x36\xc0\xda\x56\x0d\xf7\x1a"
- "\xf6\x5d\x37\xe3\x5e\x88\xba\xec\x7a\xb8\xc7\xc0\xee\x81\xeb\xb5"
- "\x78\x0f\xd4\xa9\x63\xb4\xb8\xb2\x9f\xad\x9f\xa2\x7c\x7d\xe9\x2d"
- "\x99\x7c\xcd\xea\xd6\x88\xf2\xf5\x0e\xe8\x03\xfc\x54\x28\x5b\xa3"
- "\x8c\x0d\xb2\x75\xc5\x8e\x3c\xbe\xbc\x30\x88\x2f\x6b\xcd\xba\x74"
- "\x40\x94\xb1\x37\xc2\xb9\x6c\x38\x07\xfd\xa8\x2e\x2b\x22\xe4\xe0"
- "\x75\x1d\xca\x0e\x86\x1d\x97\x89\x0a\x68\x56\xbb\x0e\x9e\x8f\xf7"
- "\xc3\x3d\x46\xf1\x1e\x58\xdf\x2b\x98\x4c\x7e\x25\x89\x93\xd9\xab"
- "\x2f\x8f\xb5\xc9\xe4\x30\x4e\x68\x0f\xc7\xdc\x59\x54\x2e\x1f\xec"
- "\x6f\xb4\x88\x72\x79\xa0\xbd\x5c\xfe\x5d\x9b\x28\x97\xe3\x1e\x24"
- "\x9b\x5c\x9e\x20\xca\xe5\x97\x63\x6f\x51\x2e\xaf\xf9\xa5\xc8\xe5"
- "\x3e\x0a\x85\xca\x27\x8a\xc9\xe5\x05\x89\xb7\x47\x2e\x47\x99\x1c"
- "\xe5\x70\x94\xc9\x51\x46\x47\xb9\x1c\x65\x74\x4e\x90\xcb\x0b\xed"
- "\xe4\x72\xce\x4e\x2e\xe7\x64\x72\xf9\x77\x47\x6f\x4d\x2e\xff\xae"
- "\xec\x36\xc8\xe5\x77\x95\x3e\x77\x43\x2e\x0f\x73\x90\xcb\x51\x0e"
- "\x87\xb9\xd7\x80\xf2\xb9\x5e\x07\x63\xf3\xff\xd8\xfb\xfe\xb8\x28"
- "\xea\xfc\xff\x37\xb3\x90\x68\x28\x0b\x2d\x86\x9d\xda\x26\xbb\xb5"
- "\x76\x58\x54\xea\x69\x69\x61\x91\xe9\x9d\x0a\x74\x5a\x58\x9a\x68"
- "\xa0\x68\xa8\xa8\x68\xf8\x03\x44\xd3\x52\x03\x44\x03\xd3\x02\xc5"
- "\x4e\x3b\xbc\xd3\xa2\x3e\x76\xe1\xa5\xb9\x5e\x7a\x87\x1d\xbf\xec"
- "\xec\x8e\x3a\xbd\x56\x0f\x3d\x24\xd4\x15\x51\x16\xd8\xdd\xf9\xbe"
- "\xde\xf3\x9e\x75\x66\x76\x67\x96\x9d\x59\x24\xec\xeb\x1f\xfb\x10"
- "\x67\xde\xf3\x9e\x79\xbf\x9e\xcf\xf7\xfb\xfd\x7c\xbe\xe7\x3d\xef"
- "\xf7\x02\xd0\xe8\xa0\xcf\xdb\xd7\xe6\xff\x2b\xe1\x6b\xf3\xed\xc1"
- "\x7c\x6d\x7e\x61\xab\xab\x36\xbf\xb0\x97\xa7\xcd\xcb\x4d\x3e\xe7"
- "\x11\xd3\xee\x43\xfd\x36\xce\xc0\xba\xfb\x5c\xb2\x50\x9b\x5f\xb6"
- "\xb9\x6a\xf3\x0b\x2d\xa2\xda\x9c\xf8\x6f\xa1\x36\x0f\x79\x42\x63"
- "\xbd\xa1\xcd\xeb\x07\x2a\xd3\xe6\xf5\x06\xce\x3b\x9c\x1b\x46\xfa"
- "\x97\x0b\x65\x52\x7a\xbd\x59\xcd\xd7\xeb\xf5\x85\x9c\x5e\x4f\xe5"
- "\xe9\xf5\xda\x06\x69\xbd\x5e\xcb\xe8\x43\xbb\x3a\x2e\x05\xe7\x85"
- "\x75\x16\xb4\x95\xb5\xda\x85\x58\x6b\x35\x8c\xc7\x5a\x0b\xda\xa7"
- "\x5a\x3c\x2f\x1a\xfe\xdf\xc7\xa1\xdb\x19\x7f\x89\xb5\xfb\xb2\xae"
- "\xa8\xaf\x7e\x2c\x15\xd7\x57\x3f\x1e\xc3\x3a\x86\x7c\x73\x5a\x5f"
- "\x00\x31\xa9\xed\x58\xfd\x5e\x5f\x20\xae\xdf\x1b\x86\x13\xad\x53"
- "\x5f\x84\x71\x11\xea\x77\xb8\x46\x54\xbf\x37\xcc\x65\xaf\x29\x10"
- "\xea\x77\x92\x07\xf4\xd9\xeb\xa5\xf5\xfb\x45\x3d\xe9\xc3\x1b\xae"
- "\x91\x3e\x9c\x60\xec\xaa\xdf\x1b\x2a\xf8\xfa\x1d\xe3\xef\xaa\xdf"
- "\x09\xa7\x98\xe7\x94\xd4\xef\x17\x43\x5c\xf5\x7b\x6d\x03\xd6\xef"
- "\x56\x1e\xaf\x0a\x30\xaf\x66\x60\x5e\x5d\xf6\xc3\xbc\xc2\xfd\xa4"
- "\x76\x26\xe6\xd5\xa5\xdd\x16\xbb\x43\xc7\x6f\xc0\xf9\x25\x3a\xeb"
- "\x78\xdc\x5e\xb8\xe3\x59\xca\x42\xd4\x1f\x73\x0d\xf3\xcc\x81\x1b"
- "\x4e\x8f\xf9\x76\x73\xb9\x76\x49\x27\xce\xb5\x4b\x8f\x30\x38\xb3"
- "\x5c\xc3\xe3\x89\x44\xd7\xe3\xf2\x5d\x7a\x56\x9e\xae\x67\xae\x59"
- "\x2a\x4f\xd7\x63\x2e\x8a\xe9\xfa\x4b\xc7\x9c\xb9\x28\xd4\xf5\x97"
- "\xce\x88\xeb\xfa\x4b\x2d\x42\x5d\x8f\xf3\x17\xd3\xf5\x97\xf5\x82"
- "\xfc\x5d\x74\xfd\xe5\x51\x42\x5d\x4f\xd2\x71\xba\xfe\x72\x1d\x3b"
- "\x4e\xb2\x49\xbe\xae\xbf\x7c\x9c\x6d\xdf\x89\xae\x3f\xeb\xac\xeb"
- "\x2f\x9f\x10\xea\xfa\xcb\xbb\x48\xfb\x7a\xd9\x6a\x61\x74\xfd\xe5"
- "\x52\x72\xbc\x36\x97\x7f\x9c\xd3\xf5\xe4\xb8\x85\xaf\xeb\x8d\x58"
- "\xd7\x9b\x35\xed\xe8\xfa\x18\xcf\x75\x7d\x5b\x1e\xa7\xeb\xdb\xf2"
- "\xdc\xeb\x7a\xf3\x31\xf7\xba\xde\x52\xcd\xe9\xfa\xe6\xfb\x48\x9b"
- "\xd0\xec\x47\xda\x84\xeb\x8c\x06\x82\x7a\xc5\x8d\x7b\x2f\x60\xe6"
- "\x58\x97\x7d\xd4\x58\x46\x7d\xbc\x90\x1d\xf7\xbe\x0e\x9a\x7e\x09"
- "\xe8\xf3\x26\xa2\xcf\xa1\xcd\x3c\x8a\x75\x3d\xd6\xdf\x44\xd3\x5f"
- "\xff\x04\x8e\x99\x20\xe6\x47\x21\x2f\xd3\xde\x65\x46\x0a\xcf\xad"
- "\xc2\x69\xa1\xbe\xd7\x64\x41\x3f\x02\xc7\x6b\x20\x8d\x11\x5f\x03"
- "\xc7\x4e\x1a\x17\x32\xd7\x15\x62\xed\x0f\xd7\x19\xe1\xfc\x29\xa7"
- "\xeb\xaa\xf1\x75\x95\x69\x8c\xb6\xaf\x26\xd8\x5d\xb3\xc1\xf1\x72"
- "\xce\x07\x5c\xd9\xc4\xf8\x80\x26\xd6\x07\x40\x5a\xc8\xab\x8c\xf1"
- "\x01\x33\xc0\x07\xc0\x73\xc3\x8f\xef\x03\x0e\x82\x0f\x28\x05\xdf"
- "\xb2\xbf\xf9\xcd\x2b\x47\x79\x3e\xa0\x14\xeb\x7e\xec\x01\xb0\xf6"
- "\x87\x7e\x6d\x3f\xf6\x05\x87\x5a\x4d\x14\x60\x7c\x12\x7c\x40\x0d"
- "\xbe\x9e\xbb\xb6\x11\xf1\xaf\xc5\xe9\xe1\x19\x8d\x8c\x87\x00\x3d"
- "\x07\xcf\x70\xaa\xf0\x2c\xe3\x21\xca\xe1\xda\x6a\xe2\x21\x1a\x07"
- "\xf3\x3c\xc4\x41\xe2\x21\xae\x1d\x14\x8e\xeb\x37\xae\x92\xef\x21"
- "\x9a\x46\xba\x1f\xdb\x6f\xdc\x27\xc7\x43\x40\xb9\xcb\x1c\x3a\xd5"
- "\x65\x1e\x1f\x9e\x67\x0e\x5a\x15\xeb\x52\xb7\xf3\xc1\x58\xcd\x8a"
- "\x35\x2a\xd6\xa7\x58\xa7\x7a\xa4\x51\xe1\xf9\xcb\x2d\x1d\x38\xb6"
- "\x7f\x07\x78\x88\x25\xd2\x1e\xc2\xe1\x1f\x98\x31\x7d\xd6\x43\x40"
- "\x1d\x63\x3c\x44\xc1\x6a\x9e\x87\xb8\x83\xe7\x21\x7c\xf8\x1e\xa2"
- "\xa9\xbb\x32\x0f\xd1\xe4\xdf\x01\x1e\xa2\xec\xb6\x87\x50\xea\x21"
- "\xae\x36\xdd\xf0\x10\x14\x3b\xbe\x1f\xec\xf0\x10\xd7\x4e\xb9\x7a"
- "\x88\x6b\x66\x9e\x87\x38\x68\xf2\x69\x8c\x62\xf4\x39\xe3\x1f\xae"
- "\xa4\x0a\xfd\x83\xf5\x59\x57\xff\x70\x7d\xb8\x32\xff\x70\x7d\xb6"
- "\x32\xff\x70\x3d\x89\x3c\x1f\x7e\x37\x79\x25\x8a\xf4\x63\xd7\xfd"
- "\x39\x4f\x71\x25\x80\x7f\xac\x7d\x4f\x71\xfd\x8a\xb8\xa7\x30\x1f"
- "\x95\xf6\x14\xe6\xa3\xd2\x9e\xc2\xb2\x13\x6b\x3f\xec\x1f\x20\x7f"
- "\xd0\x7e\x96\xb9\xfc\x77\x01\x59\xed\xe8\x3c\x67\x3f\x91\x32\x83"
- "\xf8\x8f\x9b\xaf\xf3\x2c\x01\xe2\x3a\xcf\xd2\x07\x6b\x28\x2b\xa3"
- "\xf3\xae\x9b\x0b\x3a\xdc\x53\x5c\x37\x8b\x7b\x0a\x4b\x36\xd1\x59"
- "\xd7\x9b\x5c\x3d\x05\x5c\x23\xea\x29\x2c\x47\xd8\x6b\xcc\x42\x4f"
- "\x41\xf2\x00\xbd\x70\x5a\xda\x53\xb4\x2c\x25\xfa\xa1\x65\x2c\xd1"
- "\x0f\x04\x63\x57\x4f\xd1\xc2\x1f\xff\x95\xf0\x14\x84\x53\xcc\x73"
- "\x4a\x7a\x8a\x96\xd9\xae\x9e\xc2\x7c\x14\x7b\x0a\x71\x5e\xb5\x8d"
- "\x17\xf2\xaa\xf5\xa2\xd0\x53\xb4\x1c\x70\xf6\x14\xb7\x20\xd7\x02"
- "\xb8\xf7\x03\xb8\x4c\xad\xd9\xf2\x7d\x44\xeb\x11\x79\x3e\x02\xf3"
- "\x4f\xcc\x47\xb4\xf5\x74\xe6\x9f\xd0\x47\xb4\x0d\x14\xf7\x11\x6d"
- "\xa3\x84\x3e\x02\xe7\x2f\xe6\x23\xda\xe6\x0a\xf2\x77\xf1\x11\x6d"
- "\xeb\x85\x3e\x82\xa4\xe3\x7c\x84\x35\x82\xb4\xc9\xe6\xd9\xf2\x7d"
- "\x84\x35\xc8\xbd\x8f\xb0\xf6\x11\xfa\x88\xb6\x06\xd2\xa6\x5a\xa3"
- "\x88\x8f\x80\x32\x30\xc7\xcd\x49\xfc\xe3\x9c\x8f\x20\xc7\x5d\x7d"
- "\x84\x75\x4a\x3b\x3e\x22\xc0\xba\x2b\xd8\xd4\xaa\x0b\x36\xb7\x69"
- "\x46\xab\x7f\x59\xfb\x94\xed\xc6\x9e\x01\xf1\xa0\x15\x4e\x81\x76"
- "\x98\x8e\x28\xfc\xdd\x7d\xc6\x09\xd0\x04\xd3\xc9\x7c\x7f\xac\x0b"
- "\x3e\x5a\x82\x75\x9c\xd1\x0f\xaf\x71\xd8\x9a\x37\xa0\xda\x1a\xde"
- "\x1b\x61\x7d\xd0\xb2\x2b\xd8\x68\xc9\x1b\x6a\x68\xc1\x73\xfd\x93"
- "\x11\x35\xad\x41\x5c\xdb\x2d\x3f\x45\xdb\x81\xf3\xfe\xd1\x53\x88"
- "\xae\xab\x48\x3a\xc7\xf0\x18\x6b\x06\xfc\x3d\x46\x55\x53\x0d\xa3"
- "\x21\x02\xe2\x23\x51\x41\x06\xd2\xf4\x6c\x40\xea\x9e\x3e\x3e\x77"
- "\xfc\xfa\x5b\x84\x6c\xa0\x1f\x9e\x1d\x48\xdb\x7f\x99\x10\x89\xd7"
- "\xd9\xe9\x45\x34\x44\xa9\x9f\x95\xd5\x10\x6f\x5f\x47\xe1\x85\x78"
- "\x7c\xb8\x82\xd3\x0e\x2d\x0e\x6d\xc7\xd3\x0d\x53\x2f\xaa\x51\xe1"
- "\x6a\xe1\x5c\xff\xb6\x4d\x9c\x6e\xc0\x9a\x81\x9e\x06\xda\xce\x42"
- "\xe6\x6b\x2c\x8b\x25\x73\xfd\xc3\x6b\x11\xb5\xe3\x15\xe4\x5f\x1e"
- "\x7f\x16\x8f\xfd\x84\x96\xd7\xee\x46\x4b\xc7\xa2\xfe\x56\xac\x13"
- "\x40\xeb\x95\xd7\xe6\x23\xbc\x86\x60\x01\x68\x85\xad\xd7\xd1\x08"
- "\xdc\x1f\x8f\x9b\x4e\xf4\x02\xe9\x8b\x6d\xd7\x8e\x19\x8e\x21\xf9"
- "\x5a\xcf\xc6\xac\x1f\x20\xf9\xad\xed\x2e\xd0\xf5\xba\x60\xa3\x0d"
- "\xb0\x24\x6b\x47\x3e\x11\x63\xff\xe0\xf9\x88\x8f\x80\x87\x7f\x3c"
- "\x5b\xe7\x83\xd7\xc1\xc6\x7b\x42\xda\xf7\xf6\x46\x02\x6c\xda\x58"
- "\x6c\xda\x08\x36\x18\x97\x57\x52\x10\x5e\x73\xb0\x17\xc6\xa4\xca"
- "\x52\x83\xec\xcb\x1d\xfb\x42\x46\xa0\xed\x76\x82\x87\xad\x2d\xa9"
- "\xbb\x1d\x62\x8f\xd7\xd6\x02\x3e\x30\x1a\x2e\x0b\xef\x15\xb9\xca"
- "\xa7\x27\xd6\x70\xc0\xef\x1e\x3b\x5a\x01\x87\x33\x04\x07\x7a\xb5"
- "\x9a\xf9\xd7\xba\xdc\xa0\x85\xbc\x07\xb4\xb5\x01\x16\x16\x67\x2c"
- "\x3e\x5f\x87\xf7\x94\xc4\xeb\xde\x59\x37\x91\xb5\xfd\x18\x2c\x96"
- "\x1b\xfa\xe2\x75\x31\x98\xef\x65\xda\x0c\xb8\xbd\x54\x6f\x3f\x8f"
- "\xbf\xf3\x21\x18\xd8\xd8\xd8\xe3\xfd\x25\x71\xbc\xb1\x3e\xab\x02"
- "\x5d\xc6\x7c\xbf\xf2\xa6\x35\xa5\x6d\x77\xb0\x11\xcf\xa5\xb9\xe4"
- "\x43\x2b\x9c\xff\x4b\xa7\xfc\xf4\xb1\xd7\xde\x82\xb1\xb7\x8f\xb8"
- "\x11\x7b\x0a\x5d\x54\x14\x7b\x0a\x35\xfc\xf4\xb1\x57\xdf\x82\xb1"
- "\xa7\x4b\xb9\xd8\x53\xca\xf4\x3f\x45\x25\xb9\x8b\x3d\x1e\x87\x72"
- "\x8c\x41\x39\xc6\x9f\x70\x1f\xc7\x78\x15\xaa\x87\xf6\xc6\x7c\x4b"
- "\xf8\x9b\x3f\xdf\xf2\xef\x47\xf1\xf7\xe7\xec\x7c\x4b\x4a\x35\xd2"
- "\xed\xb8\x13\xd5\x2d\xe9\xc6\xb8\x13\xe5\x77\x9c\xd1\x8d\x94\xdf"
- "\x3e\x46\x37\x52\x7e\xcc\x9c\x86\xf4\xd3\x88\xb2\xde\x1f\xa2\xfe"
- "\x68\x9e\x91\xc2\xdf\x1e\x7d\x74\xc9\x42\x65\x35\x82\x0e\xa4\xee"
- "\xa5\xf1\x38\x50\xf6\x42\xf0\x1b\xd0\x37\xa7\xcc\x44\xf7\xd6\x53"
- "\xbe\xe7\xf0\x5a\x62\x5f\x5e\x32\x52\xb9\x38\xcd\x80\xe7\x23\xf6"
- "\xde\x63\xf6\xc1\x7d\xdb\x47\xf3\x2c\x94\x83\x2f\x8e\x6f\x0c\x21"
- "\x86\x66\x5b\xc8\x68\xf5\xd5\xdd\xc1\x26\xc7\x9c\x48\xeb\xbe\xde"
- "\x48\x94\x43\xf8\xdb\x45\xe0\x11\xe6\x0c\xfe\xd6\xd0\xc1\x27\xcc"
- "\xa3\x4a\x4b\x1d\xc2\x7b\xe5\x04\xd6\x21\x35\x0d\x1c\x7a\x79\x0f"
- "\xe0\xcb\xe7\x51\xae\x04\x8f\xb6\x09\x79\x74\x95\xe5\x11\xf0\x89"
- "\xe3\x11\xf7\xdd\x61\x80\x2c\x1e\x35\xb0\x3c\xda\xe4\xc4\xa3\x8b"
- "\x5a\xf4\xf7\x53\xa7\x09\x8f\x36\xf8\x0c\xb6\xea\x1d\x3c\xf2\xfd"
- "\xe4\xd8\x14\xe0\xd1\x14\xb9\x3c\xf2\x2d\x11\x78\x5b\xaa\x47\x85"
- "\x8b\xb7\xa5\xfc\x42\x9c\xbd\xad\xc3\xcb\x5e\x0d\x79\x42\x7d\x35"
- "\xff\x09\x4d\x53\x08\xeb\x67\x29\xbf\xe1\xca\xf8\xec\x37\xcc\xa3"
- "\xb9\x6a\x94\xdf\x36\xe7\xb9\x6a\x7f\xc4\x3e\x95\x52\x45\x62\xae"
- "\x89\xfa\x54\xf6\x9c\xcb\x1c\x23\xaa\xdb\xf0\x1b\x73\x8c\xa8\x6e"
- "\x7e\x5d\x7e\xae\x1a\x75\x47\xb1\xa8\x5f\xa0\xee\xf8\x84\x99\xab"
- "\x46\xf9\x6d\xed\xf0\xb9\x6a\x90\xa7\xa8\x2f\xa5\xba\x91\xf1\x7f"
- "\xca\xaf\xc0\x65\xae\x1a\xbe\x46\xcc\x97\x52\xdd\x26\xb3\xd7\x6c"
- "\x15\xf8\x52\x36\x0f\x68\x4f\x16\x4b\xfa\x52\xca\x3f\x88\xb4\x2f"
- "\xdd\xce\x90\xf6\x85\x60\xea\xe2\x4b\xa9\x6e\x07\xf8\xbe\x54\x74"
- "\xae\x1a\xcb\x21\xe6\x39\xa5\x7c\x29\xe5\xef\xe3\xe2\x4b\x29\xd5"
- "\x08\xd1\xb9\x6a\x54\xf7\xef\x38\x1e\x75\x5f\x2a\x98\xab\x46\xf9"
- "\x8f\xbd\x25\xe6\xaa\x49\x73\xab\x58\x30\x57\x8d\xea\xde\x47\xf6"
- "\x5c\x35\xaa\xfb\x78\x59\x5e\x94\xe1\x9c\x88\x17\xa5\xba\x6f\x73"
- "\xe6\x9c\xc0\x8b\x52\xdd\x3f\x13\xf5\xa2\x54\xf7\x0a\x81\x17\x65"
- "\xf2\x17\xf1\xa2\x54\xf7\x16\x41\xfe\xce\x5e\x94\xea\x11\x22\xf0"
- "\xa2\x6c\xba\x1b\x5e\x94\xea\x41\x7c\x1f\x45\x9d\x93\xed\x45\xa9"
- "\x1e\xdb\x70\x9a\x7d\xef\x91\x77\x46\x02\x1f\x4a\xf5\xd8\x29\xf0"
- "\xa1\x54\x0f\x32\x1f\x8d\xea\x51\xce\xcc\x53\xa3\x7a\xac\x23\xc7"
- "\xa9\x5a\xfe\xf1\x1b\x3e\x94\x3d\x8e\xe7\xa9\x31\xf3\xd3\x36\xf4"
- "\x38\x25\xcf\x7f\x3e\xdc\x05\xfd\x67\x84\x1b\xff\x19\x71\x6b\xfa"
- "\x4f\x2a\x60\xb1\x22\xff\x49\x05\x48\xae\xff\x7d\xdb\x03\xb9\xd1"
- "\xe1\x1b\x7a\x98\x39\x1d\xde\xf3\x8a\x32\xdd\xd2\xd3\xfc\xd3\xc7"
- "\xfe\x16\xf4\x40\x1b\x02\x0e\x72\xb1\x0f\x9c\xab\x2c\xf6\x81\xc9"
- "\xca\x3d\xd0\xdd\x3a\xce\x03\xdd\xad\x93\xf6\x40\xea\x51\xee\x3d"
- "\x90\x26\x99\xf3\x40\xc1\x64\x4e\x2d\x15\x4c\xe6\xd4\x52\xc1\x0b"
- "\xe4\x7b\xa0\xa0\x0b\xb7\x3d\x90\x1c\x0f\xd4\x6b\x18\xe7\x81\x82"
- "\x3e\x53\xe6\x81\x82\xf6\x0b\x3d\xd0\xdd\x27\x5c\x3d\x50\x70\x1f"
- "\xcf\x3d\x50\xf0\x48\x65\x7c\x0e\x1e\xe1\x99\x07\x0a\x2e\x14\xf7"
- "\x40\xea\x28\x69\x0f\x44\xce\xb9\x6a\x57\xcd\x48\x4e\xbb\x6a\xba"
- "\x77\x7d\x0f\x74\xd7\x5e\x71\x9d\x7a\xd7\x67\xc4\x03\x05\x17\x74"
- "\xbc\x07\x0a\x16\x9f\xef\x47\x69\x06\x12\xbd\x18\x5c\xe4\xea\x81"
- "\x82\xc5\xe7\xfb\x51\x9a\xa9\xec\x35\xc2\xf9\x7e\x6c\x1e\xd0\x9e"
- "\x2c\x95\xf6\x40\x21\x21\xa4\x7d\xd1\x90\x75\x5d\x58\x4c\x5d\x3d"
- "\x90\xe6\x50\xfb\x1e\x88\x70\x88\x79\x4e\x49\x0f\x14\xe2\xe7\xea"
- "\x81\xd4\x91\xe2\x1e\xa8\xf7\x69\x8e\x47\xbd\xd3\x85\x1e\x28\x64"
- "\xfc\xad\xe1\x81\x24\xb9\xb5\x57\xe8\x81\x7a\xf7\x93\xef\x81\x7a"
- "\xc7\xca\xf3\x40\xc1\xe2\xf3\xfa\xa8\xde\x85\xce\x9c\x13\x7a\xa0"
- "\xde\x07\xc4\x3d\x50\xef\x13\x42\x0f\x14\x2c\x3e\xaf\x8f\xea\x6d"
- "\x13\xe4\xef\xe2\x81\xee\xee\x23\xf4\x40\x24\x1d\xe7\x81\xee\x3e"
- "\x48\xda\xd0\xc0\x0b\xf2\x3d\xd0\xdd\x85\xd2\x1e\xe8\xee\xdd\x42"
- "\x0f\x74\x77\x1a\xf1\x3a\x77\x57\x13\x0f\x74\x77\x16\x39\x0e\x3d"
- "\x18\xef\x38\xe7\x81\xc8\x71\xce\x03\xdd\x6d\x92\xe7\x81\xee\xed"
- "\x82\x1e\x48\xeb\xc6\x03\x69\x6f\x51\x0f\xd4\x67\xa9\x32\x0f\xd4"
- "\x27\xed\xb6\x0e\x57\xa2\xc3\xef\x6e\xe2\x74\xf8\x3d\xd7\x94\xe9"
- "\x96\x7b\xdc\xbe\xff\x74\xaf\xc3\x07\xec\xe5\x74\xf8\x80\xbd\xd2"
- "\x3a\xfc\x17\xee\xd7\x3f\xa3\xee\x6d\xe2\x74\x78\xff\x49\xa4\x9f"
- "\xec\x3f\x9c\xf4\x93\xfd\x5a\xe4\xeb\xf0\x7e\x0b\x6e\xeb\x70\x39"
- "\x3a\xbc\x8f\x91\xd3\xe1\xfd\x46\x2a\xd3\xe1\xfd\x46\x08\x75\x78"
- "\xd8\x64\x57\x1d\xde\x6f\xa7\xe7\x3a\xbc\xdf\x31\x65\x7c\xee\x77"
- "\xd4\x33\x1d\xde\x5f\x2f\xae\xc3\x7f\x51\x2e\xad\xc3\xc9\x39\x57"
- "\xfd\x74\xef\x31\x4e\x3f\xdd\xbb\xa9\xeb\xeb\xf0\x7b\x07\x8b\x6b"
- "\xa5\x7b\x47\x12\x1d\xde\x5f\xd7\xf1\x3a\xbc\xbf\x4e\x5c\x87\xdf"
- "\xfb\x09\xd1\x2c\xfd\x0d\xae\x3a\x1c\xae\x11\xd5\xe1\xf7\x9e\x63"
- "\xaf\xd1\x09\x75\x38\xc9\xe3\x2c\xa5\xf5\x91\xd6\xe1\xda\x42\xd2"
- "\xbe\x68\xe7\x92\xf6\x85\x60\xea\xaa\xc3\xb5\xcf\xb6\xaf\xc3\x09"
- "\x87\x98\xe7\x94\xd4\xe1\xda\x6c\x57\x1d\xfe\x0b\xf1\x35\xa5\xa8"
- "\x01\x89\x1c\x8f\x06\xf8\x09\x75\xb8\xf6\xdb\x5b\x43\x87\x4b\x72"
- "\x6b\xb0\x50\x87\xdf\xb7\x5b\xbe\x0e\xbf\xef\x3b\x79\x3a\x1c\x73"
- "\x4e\x4c\x87\x0f\xd0\x3b\x73\x4e\xa8\xc3\x07\x8c\x12\xd7\xe1\x03"
- "\x26\x0b\x75\x38\xce\x5f\x4c\x87\x0f\x58\x2b\xc8\xdf\x45\x87\x0f"
- "\xd8\x29\xd4\xe1\x24\x1d\xa7\xc3\xc3\xa2\x48\x1b\xfa\x0b\xf9\x6b"
- "\x4a\x51\x61\x7a\x69\x1d\x1e\x36\x48\xa8\xc3\xc3\x10\xd1\xdb\x61"
- "\x71\x44\x87\x87\x69\xc8\xf1\x5f\xa4\xf0\x8f\x73\x3a\xfc\x17\x29"
- "\x42\x1d\x1e\x96\x24\x4f\x87\x07\x76\x41\x1d\xae\x76\xa3\xc3\xd5"
- "\xb7\xa8\x0e\xd7\xfb\x28\xd3\xe1\x7a\xa4\x5c\x0b\x86\x97\x72\x5a"
- "\x30\xbc\x54\x5a\x0b\xea\xbf\x75\xaf\x05\x1f\x44\x9c\x16\x34\x4c"
- "\x27\x6d\xb5\xe1\x59\xd2\x56\x1b\xfc\xe4\x6b\xc1\x07\xd2\x6f\x6b"
- "\x41\x39\x5a\x30\x6c\x05\xa7\x05\x1f\x18\xab\x4c\x0b\x3e\x30\x46"
- "\xa8\x05\x07\x25\xba\x6a\xc1\x07\xf6\x79\xae\x05\x1f\x38\xa1\x4c"
- "\x0b\x3e\x50\xed\x99\x16\x34\x3c\x22\xae\x05\xf5\x35\xd2\x5a\x90"
- "\x9c\x73\xed\xc3\x07\x9e\xe0\xfa\xf0\x81\x85\x5d\x5f\x0b\x0e\x8c"
- "\x14\xef\xaf\x07\x8e\x25\x5a\xd0\x10\xd1\xf1\x5a\xd0\x10\x21\xae"
- "\x05\x07\x1e\x22\xfd\xa6\x61\xb0\xab\x16\x84\x6b\x44\xb5\xe0\xc0"
- "\x2b\xec\x35\x11\x42\x2d\x48\xf2\x80\xf6\xa4\xa7\xb4\x16\x7c\x70"
- "\x0f\x69\x5f\x1e\x5c\x4a\xda\x17\x82\xa9\xab\x16\x7c\x30\xb6\x7d"
- "\x2d\x48\x38\xc4\x3c\xa7\xa4\x16\x7c\x70\x9b\xab\x16\xd4\x9f\x14"
- "\xd7\x82\xe1\xdc\x3a\xb5\x54\x78\x90\x50\x0b\x3e\x78\xe6\xd6\xd0"
- "\x82\x92\xdc\x8a\x14\x6a\xc1\x5f\x7e\x22\x5f\x0b\xfe\xf2\x9c\x3c"
- "\x2d\x88\x39\x27\xa6\x05\xc3\x1f\x71\xe6\x9c\x50\x0b\x86\x8f\x17"
- "\xd7\x82\xe1\x89\x42\x2d\x88\xf3\x17\xd3\x82\xe1\x9b\x04\xf9\xbb"
- "\x68\xc1\xf0\x7d\x42\x2d\x48\xd2\x71\x5a\x70\x50\x0c\x69\x43\xf5"
- "\xe9\xf2\xb5\xe0\xa0\x47\xa4\xb5\xe0\xa0\xe1\x42\x2d\x38\x88\x7c"
- "\x73\x46\x0d\x4a\x20\x5a\x70\x90\x96\x1c\xd7\xaf\xe0\x1f\xe7\xb4"
- "\x20\x39\xce\x69\xc1\x41\xa9\xed\x69\x41\xf7\xfa\x61\x88\x9a\xd3"
- "\x0f\x43\xd4\x7c\xfd\x70\x5c\xa0\x1f\x1e\x0a\x71\xaf\x1f\x1e\x8d"
- "\xe3\xf4\x43\xc4\x01\x52\xbf\x23\x0a\x49\xfd\x8e\x60\xd6\xf0\x4b"
- "\x1f\x0f\xfd\x3c\xe8\x87\x7d\xf5\x25\x44\x3f\xd4\x5b\xa8\xb7\x2f"
- "\xb1\xfa\xa1\x01\xf9\x67\xcd\x63\xf5\xc3\x2b\x58\x3f\x3c\xfc\x2d"
- "\xd6\x0f\x01\x05\xa0\x55\x6b\x59\xed\x9a\x02\xda\xb5\x16\xfe\x0f"
- "\x75\xe7\x4b\xc8\xa3\x12\xf4\x65\x2e\xbe\x1e\xef\xdb\x00\x79\x31"
- "\xdf\x72\x32\xdf\x79\x9a\xfc\xf0\x7e\x40\x58\x5b\xe0\xfd\x35\xda"
- "\xdd\x5b\xa3\x96\xdd\x5b\x23\x41\xb8\xb7\x06\xde\x53\x03\xef\xaf"
- "\x51\xb0\x10\x69\xde\x67\x35\x45\xaf\x55\x3e\xbd\xf0\xfe\x1a\xbd"
- "\x9a\x88\x3e\xdd\x67\x2f\x23\xfa\x74\x51\x68\x0f\xd0\x42\xe1\xdb"
- "\x1b\x39\x2d\xf1\x0e\xd6\x11\x8b\x0c\xda\xa6\x45\x86\xfe\x57\xaf"
- "\x1a\x06\xb8\xee\xab\xf1\xd9\x44\xbc\x27\x00\xde\x8b\xd0\xca\xea"
- "\x53\x7a\x96\x01\xed\x98\x89\xfc\x41\x17\xfb\x3c\x04\xfa\xf4\x81"
- "\xbe\xf0\xec\x15\x48\x6d\xbb\x6a\xe8\xcb\x5f\xaf\x11\x9e\x5d\x6d"
- "\xbf\x6a\x40\xe5\xf1\xdf\x33\xdf\x75\x5a\xd9\xef\x3a\xcd\x8b\x0c"
- "\x78\xaf\x81\x61\xef\x2d\xe4\xe9\xd3\x10\x87\x3e\x7d\x78\xa7\x32"
- "\x7d\xfa\x70\x91\x50\x57\x0c\x39\xe4\xaa\x2b\x22\xfc\x3c\xd7\x15"
- "\x11\xca\xd6\x7f\xa1\x22\x0c\x9e\xe9\x8a\x88\xf5\xce\xba\x62\x0f"
- "\xa3\x2b\x1e\x0a\xc5\x1c\x14\xd7\x15\xe4\x9c\x6b\x7f\xf0\xe8\x40"
- "\xae\x3f\x78\xe4\x5a\xd7\xd7\x15\x8f\x6c\x15\x6f\xfb\x1f\xd9\x49"
- "\x74\x45\xc4\xba\x8e\xd7\x15\x11\xeb\xc4\x75\xc5\xa3\x21\xa4\x0d"
- "\x8e\xc8\x72\xd5\x15\x70\x8d\xa8\xae\x78\x74\x2c\x7b\xcd\x3a\xa1"
- "\xae\x20\x79\x40\x3b\x93\x28\xad\x2b\x1e\x23\x7b\x78\x50\x8f\x9e"
- "\x20\xed\x0e\xc1\xd4\x55\x57\x3c\xba\xa7\x7d\x5d\x41\x38\xc4\x3c"
- "\xa7\xa4\xae\x78\xf4\x8a\xab\xae\x78\x48\x23\xae\x2b\x06\x1f\xe7"
- "\x78\x34\x78\xb6\x50\x57\x3c\x36\xfc\xd6\xd0\x15\x92\xdc\xda\x2a"
- "\xd4\x15\x83\xbb\xcb\xd7\x15\x83\x47\xca\xd3\x15\x98\x73\x62\xba"
- "\x62\xf0\x7a\x67\xce\x09\x75\xc5\xe0\xdd\xe2\xba\x62\xf0\x21\xa1"
- "\xae\xc0\xf9\x8b\xe9\x8a\xc1\x17\x04\xf9\xbb\xe8\x8a\x21\x7e\x42"
- "\x5d\x41\xd2\x71\xba\x62\x48\x31\xeb\xcd\x0e\xc9\xd7\x15\x43\xd6"
- "\x4b\xeb\x8a\x21\x9b\x84\xba\x62\x48\x02\xd1\x0f\x43\x0e\x12\x5d"
- "\x31\x24\x8d\xd5\x1b\x07\xf9\xc7\x39\x5d\x41\x8e\x73\xba\x62\x48"
- "\xf9\xed\xef\x2d\xbb\xe2\x18\xd3\xaf\x12\x95\xf5\xe1\xbf\x4a\xf8"
- "\xe9\xdf\xf5\xde\x82\xdf\x5b\x6e\x18\x62\xe2\xde\xf5\x0e\x3b\xa3"
- "\x4c\xb7\x0c\x33\xfd\xf4\xb1\xbf\x15\xe7\x1a\xff\x6a\x2f\x17\xfb"
- "\xc7\xa7\x2a\x8b\xfd\xe3\x53\x7e\xfa\xd8\xdf\x8a\x73\x1c\x86\x1b"
- "\xb8\xd8\x3f\xf1\x9d\xb2\xd8\x3f\x21\xb9\xff\x79\xfb\xbe\xf4\x19"
- "\xde\x1c\x87\x67\xf6\x4a\xfb\xd2\x11\xfb\xdc\xfb\xd2\x48\xde\x1c"
- "\x87\xa7\xd8\x39\x0e\x4f\xb1\x73\x1c\x9e\x64\xe6\x38\x64\x60\x5f"
- "\xfa\x41\xac\xf6\xe3\x85\xa5\x14\x5e\xeb\x6b\xdf\x42\x0b\x05\x98"
- "\xf8\x5a\xb1\x2f\x85\x58\x67\xb7\x62\x5f\x7a\x94\x1d\xd7\x7e\x72"
- "\x41\x65\x1d\x6f\x4f\x0b\x6a\x84\x8d\x5b\x73\xf7\x28\xc2\xe7\xbe"
- "\x6c\x2c\xa5\x72\x5b\x9d\xc6\xbc\x21\x4f\xed\x3c\xe1\x98\x37\x1e"
- "\xeb\x6e\xe1\xed\x4d\x61\xcb\x1f\xad\x6e\x6f\xcc\xdb\x79\xbc\xbb"
- "\xb0\x15\x69\x6e\xdd\x31\xef\xc7\x77\x71\x63\xde\x4f\x2a\x9c\xff"
- "\xf0\xa4\xd3\xfc\x87\x28\x91\xf9\x0f\x4f\xca\x98\xff\xf0\xa4\xc2"
- "\xf9\x0f\x4f\x7a\x38\xff\xe1\x29\x97\xf9\x0f\xc4\x9b\x8e\x28\xc9"
- "\x90\xf4\xa6\xe4\x9c\xab\xa7\x88\xe4\xcd\x7f\x88\xbc\x05\xe6\x3f"
- "\x44\x4a\xbc\xa3\x8e\x64\xe7\x3f\x3c\x75\x13\xe6\x3f\x3c\x25\x31"
- "\xff\x21\x92\x9d\xff\xf0\x94\xc8\xfc\x87\xa7\x24\xe6\x3f\x44\xb2"
- "\xf3\x1f\x9e\x72\x9a\xff\xf0\x14\x3b\xff\x61\x94\x9b\xf9\x0f\xa3"
- "\xd8\xf9\x0f\xa3\xd8\xf9\x0f\x04\x53\x57\x6f\x3a\xca\x83\xf9\x0f"
- "\x4f\xb1\xf3\x1f\x9e\x72\x33\xff\x61\x94\xc8\xfc\x87\x11\x7b\xc5"
- "\xbd\xe9\x33\xbc\xf9\x0f\xcf\x38\xcd\x7f\x18\x75\x8b\xcc\x7f\x90"
- "\xe4\x96\xd3\xfc\x87\xa7\x15\xcc\x7f\x78\x5a\xe6\xfc\x87\xa7\x24"
- "\xe6\x3f\x3c\xa3\x77\xe6\x9c\xd0\x9b\x3e\x23\x31\xff\xe1\x19\xa7"
- "\xf9\x0f\x4f\x49\xcc\x7f\x78\x66\xad\x20\x7f\x17\x6f\xfa\x8c\xd3"
- "\xfc\x87\xa7\x9c\xe6\x3f\x44\xb1\xf3\x1f\x46\x4c\x92\xef\x4d\xa3"
- "\xdc\xcc\x7f\x88\x72\x9a\xff\x10\xc5\xce\x7f\x88\x62\xe7\x3f\x44"
- "\xb1\xf3\x1f\x46\x4c\xe4\x1f\xe7\xbc\x29\x39\xce\x79\xd3\x28\x99"
- "\xf3\x1f\x6e\x7f\x8b\xd9\x39\xde\x74\xb4\xc2\xf9\x0f\xa3\xdd\xce"
- "\x7f\xb8\xed\x8f\xa4\x34\x7a\xd4\x0a\x4e\xa3\x3f\x97\xae\x4c\xb7"
- "\x3c\xb7\xe2\xa7\x8f\xfd\xad\xe8\x8f\x46\x8f\xe1\x62\x3f\xa6\x45"
- "\x59\xec\xc7\x58\x94\xfb\xa3\x98\x72\xce\x1f\xc5\x94\x4b\xfb\xa3"
- "\xb1\xee\xf7\xff\xa3\x26\x68\x38\x7f\x34\x6e\x31\xd1\x28\xe3\x26"
- "\x13\x8d\x32\xae\x8f\x7c\x7f\xf4\x9b\x4d\x42\x7f\xf4\xeb\x7e\xb7"
- "\xfd\x91\x52\x7f\xf4\xdc\x51\xce\x1f\xfd\x66\xaa\x32\x7f\xf4\x9b"
- "\x29\x42\x7f\x14\xbb\xd4\xd5\x1f\xfd\xe6\x88\xe7\xfe\xe8\x37\xe7"
- "\x94\x71\xfd\x37\xb5\x9e\xf9\xa3\x71\xcf\x8a\xfb\xa3\xb1\xd5\xd2"
- "\xfe\x88\x9c\x73\xd5\xb5\xe3\xcf\x71\xba\x76\xfc\x27\x5d\xdf\x1f"
- "\x8d\x9f\x28\xae\x61\xc7\x4f\x25\xfe\x68\x5c\x54\xc7\xfb\xa3\x71"
- "\x51\xe2\xfe\x68\x3c\xd9\xff\x95\x1a\x37\xc6\xd5\x1f\xc1\x35\xa2"
- "\xfe\x68\x82\x1f\x7b\x4d\x94\xd0\x1f\x91\x3c\xa0\xad\xb9\x4f\xda"
- "\x1f\x4d\x38\x44\xda\x9e\x09\xd9\xa4\xed\x21\x98\xba\xfa\xa3\x09"
- "\x89\xed\xfb\x23\xc2\x21\xe6\x39\x25\xfd\xd1\x84\x7d\xae\xfe\x68"
- "\xac\xf8\xbe\x6a\x54\xcc\x5a\x8e\x47\x31\x7a\xa1\x3f\x9a\x70\xed"
- "\xd6\xf0\x47\x92\xdc\x9a\x28\xf4\x47\xd1\xc7\xe4\xfb\xa3\xe8\x16"
- "\x79\xfe\x08\x73\x4e\xcc\x1f\xc5\x3c\xeb\xcc\x39\xa1\x3f\x8a\x99"
- "\x2e\xee\x8f\x62\x96\x0a\xfd\x11\xce\x5f\xcc\x1f\xc5\xec\x16\xe4"
- "\xef\xe2\x8f\x62\x8e\x08\xfd\x11\x49\xc7\xf9\xa3\xd8\x04\xd2\x86"
- "\x8e\x95\xbf\xaf\x1a\x15\xfb\xac\xb4\x3f\x8a\x1d\x2f\xf4\x47\xb1"
- "\x5a\xe2\x83\x62\xd3\x88\x3f\x8a\x1d\x4c\x8e\x8f\x4d\xe5\x1f\xe7"
- "\xfc\xd1\xd8\x54\xa1\x3f\x8a\x5d\x77\xfb\x3b\xcd\xae\xe8\x8f\x7e"
- "\x7b\x9f\x32\x7f\xf4\x5b\xed\x6d\x8d\xae\x44\xa3\xc7\x16\x70\x1a"
- "\x7d\x62\xa1\x32\xdd\x32\xb1\x40\xb9\x46\x9f\x92\xc2\x69\xf4\x29"
- "\x29\xd2\x1a\x7d\xd2\x02\xf7\x1a\x7d\x72\x29\xa7\xd1\xe3\xfa\x90"
- "\x7e\xf2\x45\x1b\xe9\x27\x5f\x3c\x24\x5f\xa3\xbf\x38\x44\xa8\xd1"
- "\x27\x1d\xb9\xad\xd1\x95\x6a\xf4\xdf\x26\x71\x1a\xfd\x45\x1f\x65"
- "\x1a\xfd\x45\x24\xd4\xe8\x53\xfb\xb9\x6a\xf4\x17\x13\x3d\xd7\xe8"
- "\x2f\xae\x57\xc6\xf5\x17\xd7\x79\xa6\xd1\x5f\xbc\x20\xae\xd1\x27"
- "\xa5\x4a\x6b\x74\x72\xce\x55\x5b\x4d\x5e\xcf\x69\xab\xc9\x93\xba"
- "\xbe\x46\x8f\xb3\x88\xeb\xa8\xc9\x3e\x44\xa3\xbf\x58\xd7\xf1\x1a"
- "\xfd\xc5\x3a\x71\x8d\x3e\x79\x31\xd1\x33\x2f\x36\xb8\x6a\x74\xb8"
- "\x46\x54\xa3\x4f\xde\xc3\x5e\x53\x27\xd4\xe8\x24\x0f\x68\x6b\x8e"
- "\x49\x6b\xf4\x97\xd8\xef\x82\x5e\x7a\x84\xb4\x3d\x04\x53\x57\x8d"
- "\xfe\x52\xf7\xf6\x35\x3a\xe1\x10\xf3\x9c\x92\x1a\xfd\xa5\x58\x57"
- "\x8d\x3e\x29\x45\x5c\xa3\x4f\xe1\xcd\xd3\x7c\xf9\xb8\x50\xa3\xbf"
- "\xb4\xed\xd6\xd0\xe8\x52\xdc\x8a\xb3\x08\x35\xfa\xcb\xb3\xe5\x6b"
- "\xf4\x97\x0b\xe5\x69\x74\xcc\x39\x31\x8d\xfe\xf2\x05\x67\xce\x09"
- "\x35\xfa\x14\x3f\x71\x8d\x3e\xa5\x9f\x50\xa3\xe3\xfc\xc5\x34\xfa"
- "\x94\xb1\x82\xfc\x5d\x34\xfa\x94\x44\xa1\x46\x27\xe9\x38\x8d\x3e"
- "\xd5\x9f\xed\xd3\xfa\xc8\xd7\xe8\x53\x2e\x48\x6b\xf4\x29\x57\x84"
- "\x1a\x7d\xca\x51\xa2\xc5\xa7\xf6\x25\x1a\x7d\x4a\x0d\x39\x3e\x29"
- "\x94\x7f\x9c\xd3\xe8\xe4\x38\xa7\xd1\xa7\x86\xdf\xfe\x86\xb3\x2b"
- "\x6a\xf4\x57\x8e\x29\xd3\xe8\xaf\x1c\x55\xae\x13\x67\x6e\xe5\x74"
- "\xe2\xcc\xad\xd2\x3a\x71\xda\x36\xf7\x3a\xf1\x55\x13\xa7\x13\x67"
- "\x8c\x22\x6d\xf5\x0c\x3d\x69\xab\xa7\x9f\x93\xaf\x13\xa7\x4f\x15"
- "\xea\xc4\x69\x17\x6e\xeb\x44\xa5\x3a\x71\x6a\x24\xa7\x13\xa7\x0f"
- "\x54\xa6\x13\xa7\x1b\x84\x3a\x71\x96\xeb\x9e\x5a\xd4\xf4\x6c\xcf"
- "\x75\xe2\xf4\x4f\x94\xe9\xc4\xe9\x25\x9e\xe9\xc4\x19\x41\xe2\x3a"
- "\x71\x5a\x81\xb4\x4e\x24\xe7\x5c\xfb\xf7\x57\x3f\xe1\xfa\xf7\x57"
- "\xd3\xbb\xbe\x4e\x7c\x55\x2b\xde\x97\xbf\x3a\x90\xe8\xc4\x19\xea"
- "\x8e\xd7\x89\x33\xd4\xe2\x3a\xf1\x55\x76\xfd\xb3\x19\x1a\x57\x9d"
- "\x08\xd7\x88\xea\xc4\x57\xd9\xf1\xdf\x19\x6a\xa1\x4e\x24\x79\x40"
- "\x5b\x73\x51\x5a\x27\x26\xac\x27\x6d\x4f\x02\xfb\x1e\x89\x60\xea"
- "\xaa\x13\x13\x1e\x69\x5f\x27\x12\x0e\x31\xcf\x29\xa9\x13\x13\x96"
- "\xba\xea\xc4\x69\x5b\xc5\x75\xe2\xcc\x58\x8e\x47\x89\x57\x84\x3a"
- "\x31\xe1\xc8\xad\xa1\x13\x25\xb9\xa5\x15\xea\xc4\xc4\x4d\xf2\x75"
- "\x62\xe2\x31\x79\x3a\x11\x73\x4e\x4c\x27\xce\x0c\x72\xe6\x9c\x50"
- "\x27\xce\x1c\x24\xae\x13\x67\x3e\x2b\xd4\x89\x38\x7f\x31\x9d\x38"
- "\x73\x81\x20\x7f\x17\x9d\x38\x33\x5b\xa8\x13\x49\x3a\x4e\x27\xce"
- "\x8a\x60\xfb\xb4\x51\xf2\x75\xe2\xac\x20\x69\x9d\x38\x4b\xb8\xff"
- "\x15\x35\x93\xec\x7f\x45\xcd\x8a\x22\x3a\x71\x16\xd9\xff\x8a\x9a"
- "\x16\xc9\x3f\xce\xe9\x44\x72\x9c\xd3\x89\xb3\x26\x7a\xf7\x7d\xe7"
- "\xfc\x00\x4e\x5b\xcc\x0f\x90\xd6\x16\xb3\xae\xb9\xd7\x16\xc9\x13"
- "\x39\x6d\x31\xe7\x33\x52\xbf\xe7\x6c\x23\xf5\x7b\x0e\x33\x3f\x29"
- "\xbd\x02\xb4\xc5\x80\x58\xed\x47\x97\x4a\x18\x6d\xf1\xf1\x3c\x0b"
- "\x05\x7a\xcf\xd7\x8e\xb5\x05\xe8\xba\xac\x25\x58\x5b\xd4\xb2\xdf"
- "\x77\xce\x3e\x51\x91\xc6\xd7\x16\x49\x63\x99\x6f\x3d\x6f\xec\x5b"
- "\x5b\x8b\xf0\x79\xb1\x6f\x3f\x0f\xcd\x63\xbf\xfd\x84\xbc\xf9\xdf"
- "\x7c\x32\xdf\x81\x5e\x02\xed\x31\x03\xf0\xe0\x69\x8f\xdb\xdf\x7e"
- "\xe2\xbe\x7e\x76\xa1\x32\x5d\x3b\xbb\x40\xa8\x39\xe6\x1f\x70\xd5"
- "\x1c\x73\x7c\x3c\xd7\x1c\x73\xf4\xca\x34\xc7\x1c\x9d\x67\x9a\x63"
- "\xce\x5a\x71\xcd\x31\xcb\x82\xf9\x29\xae\x39\xc8\x39\xd7\xbe\x22"
- "\x59\xcf\xf5\x15\xaf\x5d\xe9\xfa\x9a\xe3\xb5\x3c\xf1\x7e\xe1\xb5"
- "\x42\xa2\x39\xe6\xac\xe9\x78\xcd\x31\x67\x8d\xb8\xe6\x48\x66\xdb"
- "\xff\x39\xeb\x5c\x35\x07\x5c\x23\xaa\x39\x92\xd9\xf7\x7f\x73\xd6"
- "\x08\x35\x07\xc9\x03\xda\xa0\xe9\xd2\x9a\x23\xd9\x46\xda\xa4\xe4"
- "\x0a\xd2\x26\x11\x4c\x5d\x35\x47\xf2\xee\xf6\x35\x07\xe1\x10\xf3"
- "\x9c\x92\x9a\x23\xf9\xa2\xab\xe6\x98\xd5\x24\xae\x39\xe6\xf1\xe6"
- "\x69\xcf\x4b\x14\x6a\x8e\xb9\x43\x6e\x0d\xcd\x21\xc9\xad\x3c\xa1"
- "\xe6\x98\xe7\x27\x5f\x73\xcc\x1b\x2e\x4f\x73\x60\xce\x89\x69\x8e"
- "\x79\x6b\x9d\x39\x27\xd4\x1c\xf3\x76\x8a\x6b\x8e\x79\x07\x84\x9a"
- "\x03\xe7\x2f\xa6\x39\xe6\x9d\x13\xe4\xef\xa2\x39\xe6\xfb\x08\x35"
- "\x07\x49\xc7\x69\x8e\xf9\xbb\x58\xdf\x56\x28\x5f\x73\xcc\x5f\x2b"
- "\xad\x39\xe6\x67\x0b\x35\xc7\xfc\x78\xa2\x2d\xe6\x97\x12\xcd\x31"
- "\x3f\x95\xd5\x2d\x05\xfc\xe3\x9c\xe6\x20\xc7\x39\xcd\x31\xbf\x4c"
- "\xc6\xd8\x94\x46\xce\xb7\x9f\xfb\xae\x0b\xc7\xa6\x1c\xe3\x52\xd6"
- "\xf0\xde\xbe\x37\xc6\xa6\xa0\xaf\x97\xda\x47\x1d\x8f\x4d\xe1\xbe"
- "\x9b\x1b\x9b\x3a\xcd\xb4\x55\xdc\xd8\x94\x89\x19\x9b\xc2\xe3\x52"
- "\xe0\xd9\x6f\x8c\x4b\xd9\x5f\x77\xfd\xee\x73\x9f\x5d\xfe\xb8\xd4"
- "\x2b\x0b\xd4\x68\x3b\xd3\x7f\x1f\x28\x27\xe3\x52\x35\x37\xc6\xa5"
- "\x70\xbf\x6d\x6b\x76\x1d\x97\xc2\xfd\x35\x37\x2e\xf5\xbd\xc2\x71"
- "\xa9\x05\x53\x95\xf5\xdf\x0b\xba\xc0\xf7\x6f\xb7\xe2\x77\x9f\xf3"
- "\x4f\x71\xef\x8e\x17\x2a\xfc\xfe\x6d\xa1\xdb\xef\xdf\x6e\xcf\x6b"
- "\x96\x8a\xfd\x82\x5d\x5c\xec\x53\x27\x29\x8b\x7d\xea\xc4\x9f\x3e"
- "\xf6\xb7\xe2\x9c\x89\x45\x5a\x2e\xf6\x8b\x15\xae\xff\xb6\xb8\x5a"
- "\xf9\x58\x78\x7a\x19\xe7\x57\xd3\xcb\xf8\x7e\xb5\x2c\x8a\xef\x57"
- "\x97\xec\x76\xef\x57\x97\xab\x39\xbf\xba\x74\x01\xd1\x86\x4b\x27"
- "\x11\x6d\xb8\x94\xd9\x93\x2c\x7d\x14\x62\x7c\xaa\x15\x7b\xd6\x39"
- "\x16\xea\xa3\x7a\x23\x65\x5d\x4d\xbc\x6a\x95\xb5\x1c\x55\x98\x2d"
- "\xe8\xed\x25\xc8\x77\xfd\x25\xe4\xfb\x87\x46\x0b\xde\x39\xc7\x1f"
- "\xfa\x09\xd0\x52\xe5\xa0\x2d\x0a\x51\x4a\x06\xf6\xb1\x69\xd9\x55"
- "\x29\x66\x9e\x8f\x7d\xbd\x27\xe7\x61\x21\x5d\x8a\x05\x1d\x9e\x63"
- "\xa4\xb0\x57\x6d\xcb\x1f\xad\x6e\x1b\xd4\x9b\xac\x59\xc4\x1f\x2f"
- "\x87\x7b\x6b\x5f\x11\x8e\x97\xb7\xe6\x8f\xd6\xb4\xec\xeb\xed\xcb"
- "\xac\x87\xa8\xe7\xc6\xcd\x3d\x1d\x2f\x7f\xbf\x15\x69\x1c\xeb\x21"
- "\xe2\x7e\xf1\xd6\x1b\x2f\x4f\x2d\xe0\xc6\xcb\xd3\x26\x2b\x1b\x2f"
- "\x4f\x8b\x13\x7a\xd7\x8c\xc5\xae\xde\x35\xed\x90\xe7\xde\x35\x4d"
- "\xe1\xf7\xff\x69\x26\xcf\xbc\xeb\xd2\x51\xce\xde\xb5\x38\x03\x7b"
- "\xd7\x25\xc5\x98\xab\xe2\xde\x95\x9c\x73\xf5\x1c\xcb\xce\x70\x9e"
- "\x63\xd9\xbe\xae\xef\x5d\x97\xc5\x88\xfb\x8b\x65\x93\x89\x77\x5d"
- "\x1a\xd9\xf1\xde\x75\x69\xa4\xb8\x77\x5d\x56\x41\x74\xfe\xd2\x48"
- "\x87\x0f\xe5\xbc\x2b\x5c\x23\xea\x5d\x97\xfb\x38\x5f\x43\xbc\xeb"
- "\xd2\x28\xe2\x5d\x97\xf7\x93\xf6\xae\xcb\xd9\xf5\xd2\x96\xaf\x27"
- "\xed\x13\xc1\xd4\xd5\xbb\x2e\x9f\xde\xbe\x77\x25\x1c\x62\x9e\x53"
- "\xd2\xbb\x2e\xdf\xe3\xea\x5d\x97\xec\x12\xf7\xae\xe9\xab\x38\x1e"
- "\xa5\xdf\x27\xf4\xae\xcb\xaf\xdc\x1a\xde\x55\x92\x5b\x31\x42\xef"
- "\xba\xe2\x88\x7c\xef\xba\xe2\x9a\x3c\xef\x8a\x39\x27\xe6\x5d\xd3"
- "\x47\xb1\xfc\x89\x12\xf7\xae\xe9\x53\xc5\xbd\x6b\xfa\x62\xa1\x77"
- "\xc5\xf9\x8b\x79\xd7\xf4\x9d\x82\xfc\x5d\xbc\x6b\xfa\x21\xa1\x77"
- "\x25\xe9\x38\xef\x9a\x11\x4f\xda\xd0\x25\xe3\xe5\x7b\xd7\x8c\x51"
- "\xd2\xde\x35\x63\xac\xd0\xbb\x66\xf4\x25\x1e\x35\x23\x95\x78\xd7"
- "\x8c\x08\x72\x7c\xc9\x38\xfe\x71\xce\xbb\x92\xe3\x9c\x77\xcd\x58"
- "\x23\xc3\xbb\x86\x76\x90\x77\xf5\xbf\xb5\xbc\xeb\x17\x59\x9d\xeb"
- "\x5d\x33\xfb\x28\xf3\xae\x99\xa1\x1e\x6a\x78\x4d\x3b\x1a\xde\xf7"
- "\xff\x2f\x0d\x9f\xb1\x95\xd3\xf0\xab\xf2\x95\x69\x96\x55\x79\x3f"
- "\x75\xec\x6f\xbd\xb8\x67\xc6\x73\x71\x7f\xa3\xa7\xb2\xb8\xbf\x11"
- "\x70\xdb\xb7\x2a\x89\xfd\x2a\xde\x78\xcd\x1a\x85\xf3\x9f\xd7\xac"
- "\x53\xee\x5b\xb3\x76\x71\xbe\x35\x6b\x17\xdf\xb7\xfe\x55\xf0\x9e"
- "\x75\xed\x54\xf7\xbe\x75\x7d\x03\xe7\x5b\xd7\x8d\x27\xba\x70\x1d"
- "\x3b\xdf\xf6\x2d\x46\x6f\xad\xf8\x8c\xf8\xd6\xeb\xd8\xb7\x9e\x07"
- "\xdf\x3a\x33\x9e\xb2\xb2\x6b\xf0\xe3\x79\x59\x15\xe0\x3d\xb1\x57"
- "\xad\x4a\x83\xbf\x53\xcd\xe8\xed\x85\xc8\x77\x03\x78\xce\x3d\xd0"
- "\x7f\xed\x59\x62\xa6\xd6\xcd\x81\xb6\xbf\x66\x1f\x0a\x4c\x02\x3f"
- "\xdb\x88\xfd\xec\x51\xf0\xaa\x6b\x59\x3f\xfb\xd6\xec\xaa\x54\xbe"
- "\x9f\x5d\x7b\x9a\xf1\xb3\x66\x32\xe7\xab\x2a\x15\xfc\x2c\xdc\x0f"
- "\xaf\xe9\xcf\xf7\xb3\x2d\xe0\x57\x5b\xc1\xaf\xe6\xd6\x3b\x79\xdb"
- "\x99\xae\xde\xb6\x25\x64\x74\xa8\x65\x50\x6f\x7f\xec\x6d\xaf\xef"
- "\xfe\xff\xd1\xdb\xbe\x31\x91\xf3\xb6\x6f\x0d\x51\xe6\x6d\xdf\x1a"
- "\x2c\xf4\xb6\xd9\xb1\xae\xde\xf6\xad\x6d\x9e\x7b\xdb\xb7\x0e\x29"
- "\xab\x33\x6f\x1d\xf4\xcc\xdb\xae\xeb\xe7\xec\x6d\x3f\x64\xde\xcb"
- "\xae\x8d\xc7\x7c\x16\xf7\xb6\xe4\x9c\xab\x27\x59\x7f\x88\xf3\x24"
- "\xeb\xd7\x77\x7d\x6f\xbb\x3e\x5c\xdc\x7f\xac\x1f\x42\xbc\xed\xba"
- "\xbe\x1d\xef\x6d\xd7\xf5\x15\xf7\xb6\xeb\xd9\xf9\xff\xeb\xfa\xba"
- "\x7a\x5b\xb8\x46\xd4\xdb\xae\x3f\xed\x7c\x0d\xf1\xb6\xeb\xb4\xc4"
- "\xdb\xae\x6f\x91\xf6\xb6\x1b\xf2\x49\x1b\xb6\x21\x91\xb4\x61\x04"
- "\x53\x57\x6f\xbb\x61\x64\xfb\xde\x96\x70\x88\x79\x4e\x49\x6f\xbb"
- "\x61\xad\xab\xb7\x5d\x3b\x45\xdc\xdb\x66\x4d\xe5\x78\xf4\xb6\x4d"
- "\xe8\x6d\x37\x54\xdc\x1a\xde\x56\x92\x5b\xe1\x42\x6f\xfb\x76\xa1"
- "\x7c\x6f\xfb\xf6\x09\x79\xde\x16\x73\x4e\xcc\xdb\x66\xf5\x63\xf9"
- "\xa3\x15\xf7\xb6\x59\xc3\xc5\xbd\x6d\x56\xac\xd0\xdb\xe2\xfc\xc5"
- "\xbc\x6d\x56\xba\x20\x7f\x17\x6f\x9b\xb5\x4d\xe8\x6d\x49\x3a\xce"
- "\xdb\x66\x8f\x60\xfb\x3a\x3f\xf9\xde\x36\xbb\x9f\xb4\xb7\xcd\xd6"
- "\x0b\xbd\x6d\x96\x85\x78\xd8\xec\x18\xe2\x6d\xb3\x03\xc8\xf1\xb5"
- "\xbe\xfc\xe3\x9c\xb7\x25\xc7\x39\x6f\x9b\x1d\x2f\xef\xbd\xac\x57"
- "\xeb\x1e\xf9\x76\xfe\x37\x03\x1d\xb5\xee\x91\xe3\xdd\x6c\x67\x7d"
- "\x33\x90\xd3\xa2\xcc\xdf\xe6\xb8\x5d\xff\xe5\xb6\xc7\x12\xd3\xf9"
- "\xd9\xa9\x9c\xce\xcf\x5d\xa0\x4c\xb3\xe4\xa6\xdc\xf6\x58\x4a\x62"
- "\xbf\x31\x92\x8b\xfd\xa6\x8b\xca\x62\xbf\xa9\x41\xb9\xc7\xda\x56"
- "\xcb\x79\xac\x6d\xb5\xd2\xef\x06\x37\x1f\x71\xef\xb1\xde\x0d\xe7"
- "\x3c\x56\x7e\x36\xd1\x27\xf9\x0b\x88\x3e\xc9\x7f\xa4\xe3\xde\x0d"
- "\xe6\xed\x11\xbe\x1b\x7c\x67\xe0\xed\x77\x83\x1d\xe1\x9f\x72\x4b"
- "\x39\xff\x94\xb7\x58\x99\x7f\xca\x4b\x15\xfa\xa7\xf7\x36\xb9\xfa"
- "\xa7\xbc\xef\x3c\xf7\x4f\x79\x36\x65\xf5\x21\xcf\xea\x99\x7f\xca"
- "\x9f\x2a\xfe\x6e\x70\xf3\x51\xe9\x77\x83\xe4\x9c\xab\xee\xdd\x62"
- "\xe3\x74\xef\x96\xe3\x5d\xdf\x3f\x6d\x49\x16\xd7\xb8\x5b\x16\x13"
- "\xff\x94\x3f\xa5\xe3\xfd\x53\xfe\x14\x71\xff\xb4\x85\xfd\xfe\x35"
- "\x7f\x8a\xab\x7f\x82\x6b\x44\xfd\xd3\xbb\xfd\x9c\xaf\x21\xfe\x29"
- "\x3f\x9e\xf8\xa7\x77\x87\x4b\xfb\xa7\x77\xbf\x25\xed\xd3\xbb\xbb"
- "\x49\xfb\x44\x30\x75\xf5\x4f\xef\xa6\xb7\xef\x9f\x08\x87\x98\xe7"
- "\x94\xf4\x4f\xef\x1e\x73\xf5\x4f\x9b\x8d\xe2\xfe\x69\x5b\x21\xc7"
- "\xa3\x6d\x23\x85\xfe\x69\x6b\xcf\x5b\xc3\x3f\x49\x72\x2b\x59\xe8"
- "\x9f\xb6\x9e\x96\xef\x9f\xb6\x05\xc9\xf3\x4f\x98\x73\x62\xfe\x69"
- "\xdb\x54\x96\x3f\xf1\xe2\xfe\x69\xdb\x52\x71\xff\xb4\x6d\x93\xd0"
- "\x3f\xe1\xfc\xc5\xfc\xd3\xb6\x43\x82\xfc\x5d\xfc\xd3\xb6\xef\x84"
- "\xfe\x89\xa4\xe3\xfc\xd3\x7b\x2b\x48\x1b\xba\x79\xb6\x7c\xff\xf4"
- "\xde\x54\x69\xff\xf4\x5e\xa2\xd0\x3f\xbd\x37\x8c\xf8\xa4\xf7\x72"
- "\x89\x7f\x7a\x6f\x1c\x39\xbe\x39\x89\x7f\x9c\xf3\x4f\xe4\x38\xe7"
- "\x9f\xde\x2b\x92\xe7\x9f\x3c\x5f\x17\xe9\xa7\x9f\xd7\xaa\xbd\x45"
- "\xe7\xb5\x16\x0c\x51\xe6\x9d\x0a\x06\xdf\xd6\xf0\x4a\x34\xfc\x7b"
- "\xfb\x39\x0d\x5f\xa8\xf0\xfb\xdf\xc2\x12\xe5\x1a\x7e\x77\x31\xa7"
- "\xe1\x77\x17\x4b\x6b\xf8\xed\x6b\xdd\x6b\xf8\x0f\xcc\x9c\x86\xdf"
- "\x19\x4b\xfa\xc8\x9d\x43\x48\x1f\x59\x74\xad\xe3\x34\x7c\xd1\x5c"
- "\xa1\x86\xdf\x7e\xf1\xb6\x86\xef\x08\x0d\x5f\xc0\xdb\xef\xb8\x68"
- "\xb8\x32\x0d\x5f\x34\x4c\xa8\xe1\x3f\x9c\xe4\xaa\xe1\x8b\x0a\x3d"
- "\xd7\xf0\x45\x47\x94\xd5\x87\x22\xa3\x67\x1a\x7e\xe7\x7d\xe2\x1a"
- "\x7e\xfb\x3a\x69\x0d\x4f\xce\xb9\x6a\xaf\x0f\x8e\x70\xda\xeb\x83"
- "\xec\xae\xaf\xe1\x3f\x88\x10\xd7\x59\x1f\x0c\x27\x1a\x7e\xa7\xb6"
- "\xe3\x35\xfc\x4e\xad\xb8\x86\xff\x60\x1f\xd1\x3b\x3b\xb5\xae\x1a"
- "\x1e\xae\x11\xd5\xf0\x1f\x9c\x71\xbe\x86\x68\xf8\x9d\x3a\xa2\xe1"
- "\x3f\xb0\x49\x6b\xf8\xdf\x6d\x23\xed\xd3\xef\x66\x93\xf6\x89\x60"
- "\xea\xaa\xe1\x7f\x37\xaa\x7d\x0d\x4f\x38\xc4\x3c\xa7\xa4\x86\xff"
- "\xdd\x7a\x57\x0d\xbf\x7d\x8d\xb8\x86\xdf\x3d\x9d\xe3\xd1\x6e\x1f"
- "\xa1\x86\xff\xdd\x89\x5b\x43\xc3\x4b\x72\x2b\x42\xa8\xe1\x77\xed"
- "\x94\xaf\xe1\x77\x7d\x2b\x4f\xc3\x63\xce\x89\x69\xf8\xdd\xf7\xb1"
- "\xfc\xd1\x89\x6b\xf8\xdd\x23\xc5\x35\xfc\xee\x49\x42\x0d\x8f\xf3"
- "\x17\xd3\xf0\xbb\x57\x09\xf2\x77\xd1\xf0\xbb\x0b\x85\x1a\x9e\xa4"
- "\xe3\x34\xfc\x87\x91\x6c\xff\x36\x48\xbe\x86\xff\xf0\x3e\x69\x0d"
- "\xff\xe1\x40\xa1\x86\xdf\x6d\x25\x5a\xfd\xc3\x89\x44\xc3\x7f\xa8"
- "\x26\xc7\xb7\x87\xf3\x8f\x73\x1a\x9e\x1c\xe7\x34\xfc\x87\x09\xb7"
- "\xd7\x4d\xea\x8a\xeb\x26\xfd\xde\xa6\x4c\xc7\xff\xde\xaa\x5c\x4b"
- "\x7e\x5c\xcd\x69\xc9\x8f\xab\xf9\x5a\x52\xb8\xb6\x41\xf1\x09\xf7"
- "\x5a\x72\x5f\x28\xa7\x25\xff\xb8\x94\xb4\xd5\x7f\x9c\x4a\xda\xea"
- "\x3f\x32\xef\xf7\xe4\xad\x9b\xf4\x87\x7c\xe1\xba\x49\x7b\xee\xbb"
- "\xbd\x6e\x92\x52\x9d\xf8\x61\x1a\xa7\x13\xff\x30\x5d\x99\x4e\xfc"
- "\x43\xbc\x50\x27\x96\xa4\xbb\xea\xc4\x3f\x1c\xf3\x5c\x27\xfe\xe1"
- "\x82\x32\x9d\xf8\x87\x3a\xcf\x74\xe2\x1f\xc7\x8a\xaf\x61\x50\x7c"
- "\x52\x7a\xdd\x24\x72\xce\xb5\x7f\xdf\x7b\x81\xeb\xdf\xf7\x7e\xd6"
- "\xf5\x75\xe2\xde\x38\xf1\xbe\x7c\xef\x74\xa2\x13\xff\x38\xa6\xe3"
- "\x75\xe2\x1f\xc7\x88\xeb\xc4\xbd\xdf\x92\x3e\xf5\x8f\xe3\x5c\xd7"
- "\x30\x80\x6b\x44\x75\xe2\xbe\xee\xec\x35\x63\x84\x3a\x91\xe4\x01"
- "\x6d\x8d\x5e\x5a\x27\xee\x3b\x42\xda\x9e\x7d\x9b\x48\xdb\x43\x30"
- "\x75\xd5\x89\xfb\x66\xb7\xaf\x13\x09\x87\x98\xe7\x94\xd4\x89\xfb"
- "\x3e\x71\xd5\x89\xc5\xd5\xe2\x3a\xf1\x63\xde\x3a\xad\x1f\x0f\x14"
- "\xea\xc4\x7d\x2d\xb7\x86\x4e\x94\xe4\x56\x9c\x50\x27\x7e\x74\x5c"
- "\xbe\x4e\xfc\xc8\x26\x4f\x27\x62\xce\x89\xe9\xc4\x8f\xc7\x3a\x73"
- "\x4e\xa8\x13\x3f\x4e\x14\xd7\x89\x1f\xa7\x0b\x75\x22\xce\x5f\x4c"
- "\x27\x7e\xbc\x47\x90\xbf\x8b\x4e\xfc\xf8\x98\x50\x27\x92\x74\x9c"
- "\x4e\x2c\x49\x22\x6d\x68\xf1\x52\xf9\x3a\xb1\x64\xac\xb4\x4e\x2c"
- "\x89\x15\xea\xc4\x12\x1d\xd1\x83\x25\x2b\x88\x4e\x2c\x19\x46\x8e"
- "\x17\xa7\xf1\x8f\x73\x3a\x91\x1c\xe7\x74\x62\x49\x96\xbc\xef\x40"
- "\x3a\x64\xac\xb7\x93\xbe\x03\xe9\xa8\xb1\xde\xce\xfe\x0e\xe4\x53"
- "\x85\xeb\xdf\x7f\xaa\xbd\x3d\x4f\x46\xee\x38\x6f\x49\x11\x37\xce"
- "\xfb\x7f\xdb\x94\xe9\x95\xff\xdb\xaa\x5c\x9b\x7f\xc1\xdb\xbf\xf7"
- "\x0b\xc1\xfe\xbd\xc2\xf9\xf0\xfb\xe7\xba\xd7\xe6\xa5\xbc\xfd\x7b"
- "\x3f\x67\xf7\xef\xfd\x9c\xdd\xbf\xf7\x4f\x2d\x4a\xe6\xc3\x6f\x68"
- "\x44\xbe\x6f\x3b\xcf\x87\x3f\x79\x88\xcc\x87\x5f\xe8\x3c\x1f\xfe"
- "\x4f\x0b\x84\xf3\xe1\xf7\x5f\x94\x9a\x0f\x8f\xc7\x7d\xdb\xf6\xf5"
- "\x66\xe6\xc2\x8b\xce\x83\x7f\xa9\x63\xe7\xc1\x63\x6e\xbe\xbf\x8c"
- "\x68\xfb\xf7\x6e\x49\x6d\xff\x29\x6f\xed\xfc\x3f\x29\xdc\xff\xf7"
- "\x4f\x4e\xfb\xff\x1e\x14\xd9\xff\xf7\x4f\x32\xf6\xff\xfd\x93\xc2"
- "\xfd\x7f\xff\xe4\xe1\xfe\xbf\x9f\xbb\xec\xff\x4b\xe6\xc1\xef\x4f"
- "\x91\x9e\x07\x4f\xce\xb9\x6a\xb2\x52\xde\xba\x52\xa5\xb7\xc0\xfe"
- "\xbf\xa5\x12\x7b\xb4\x96\xb2\xfb\xff\x7e\x7e\x13\xf6\xff\xfd\x5c"
- "\x62\xff\xdf\x52\x76\xff\xdf\xcf\x6f\xec\xe5\xcb\x69\xfb\xcf\x25"
- "\xf6\xff\x2d\x3d\xe7\x7c\x0d\xd1\xf6\x9f\xb3\xfb\xff\x1e\x70\xb3"
- "\xff\xef\x01\x76\xff\xdf\x03\xec\xfe\xbf\x04\x53\x57\x6d\x7f\xc0"
- "\x83\xfd\x7f\x3f\x67\xf7\xff\xfd\xdc\xcd\xfe\xbf\x07\x44\xf6\xff"
- "\xdd\x9f\x2c\xae\xed\xbf\xe0\xed\xff\xfb\x85\xd3\xfe\xbf\x07\x6e"
- "\x91\xfd\x7f\x25\xb9\xe5\xb4\xff\xef\x9f\x15\xec\xff\xfb\x67\x99"
- "\xfb\xff\x7e\x2e\xb1\xff\xef\x17\xec\xfe\xbf\x9f\x4b\xec\xff\xfb"
- "\x85\xc4\xfe\xbf\x5f\x38\xed\xff\xfb\xb9\xc4\xfe\xbf\x5f\xac\x15"
- "\xe4\xef\xa2\xed\xbf\x70\xda\xff\xf7\x73\xa7\xfd\x7f\x0f\xb2\xfb"
- "\xff\xee\x0f\x91\xaf\xed\x0f\xba\xd9\xff\xf7\xa0\xd3\xfe\xbf\xf8"
- "\x93\x21\xac\xe1\x0f\xb2\xfb\xff\x1e\x64\xf7\xff\xdd\xaf\xe1\x1f"
- "\xe7\xb4\x3d\x39\xce\x69\xfb\x83\x72\xf6\xff\xd5\xc8\x19\x03\xfe"
- "\xe9\xe7\x71\xa8\x6f\xd1\x79\x1c\x87\x14\x8e\xff\x1e\xf2\x62\xfc"
- "\xf7\x58\x03\xa7\x31\x8f\x35\x48\xcf\x25\xf8\xb2\x9d\xf1\xdf\xaf"
- "\x06\x73\x1a\xf3\x08\xfb\xbd\xd2\x91\xa5\xa4\x9d\x3e\x32\xdc\xd3"
- "\xb9\x04\x1b\xae\xb3\xba\xd2\x31\x97\x60\x09\x3b\x97\x00\xb4\x25"
- "\xd1\x92\xc6\x4f\x84\x73\x09\x0e\x0f\x97\x9a\x4b\x20\x3a\x87\xc0"
- "\x49\x3f\x3a\xb4\xa6\xd2\x39\x04\xb7\xbe\x7e\x3c\xc8\x9b\x43\x60"
- "\x4c\x57\xa6\x1f\x8d\x2b\x84\xfa\xf1\xaf\xdb\x5c\xf5\xa3\xf1\x8c"
- "\xe7\xfa\xf1\x88\x9f\x32\xfd\x78\xc4\xd7\x33\xfd\x78\x24\x51\x7c"
- "\x0e\xc1\x97\x27\xa5\xe7\x10\x90\x73\xae\xfd\xfe\x57\x7e\x5c\xbf"
- "\xff\x97\x13\x5d\x5f\x3f\xfe\x25\x55\xbc\x8f\xff\x4b\x3a\xd1\x8f"
- "\x47\x12\x3a\x5e\x3f\x1e\x49\x10\xd7\x8f\x7f\xb9\x42\xfa\xda\x23"
- "\x09\xae\xfa\x11\xae\x11\xd5\x8f\x5f\xe9\x9d\xaf\x21\xfa\xf1\x48"
- "\x12\xd1\x8f\x5f\x8d\x92\xd6\x8f\x5f\x9d\x26\xed\xd2\x57\xfb\x48"
- "\xbb\x44\x30\x75\xd5\x8f\x5f\xad\x6d\x5f\x3f\x12\x0e\x31\xcf\x29"
- "\xa9\x1f\xbf\xaa\x70\xd5\x8f\x5f\x4a\x8c\x0d\x1f\xdb\xcd\xf1\xe8"
- "\xd8\xb3\x42\xfd\x78\x34\xe4\xd6\xd0\x8f\x92\xdc\x4a\x15\xea\xc7"
- "\xa3\xe7\xe4\xeb\xc7\x63\x7d\xe4\xe9\x47\xcc\x39\x31\xfd\x78\x2c"
- "\x91\xe5\x4f\x92\xb8\x7e\x3c\xb6\x4a\x5c\x3f\x1e\xdb\x26\xd4\x8f"
- "\x38\x7f\x31\xfd\x78\xec\x98\x20\x7f\x17\xfd\x78\xec\x8c\x50\x3f"
- "\x92\x74\x9c\x7e\xfc\xeb\x1a\xd2\x86\x7e\xa9\x60\x6c\xf8\xaf\x89"
- "\xd2\xfa\xf1\xaf\x73\x85\xfa\xf1\xaf\x91\x44\x27\xfe\x75\x2b\xd1"
- "\x8f\x7f\x9d\x48\x8e\x7f\x99\xc6\x3f\xce\xe9\xc7\x2f\x9d\xc6\x86"
- "\xff\x5a\xec\x4e\x3f\xd2\xb9\xf5\x96\x5c\xca\x5e\x02\xbf\x52\x78"
- "\xce\x3e\xd0\x8f\x19\xe1\xef\x32\xe8\x8f\xd4\xf0\xb7\xe4\xda\x86"
- "\xe6\xa0\x7a\x8b\x1d\xb4\x87\x1d\xee\x53\x65\xbe\x6c\x34\xde\x63"
- "\x85\x7b\xff\x8d\xec\xd9\x02\x79\x06\x5a\xbb\x8d\xb1\xd3\x49\xd0"
- "\x87\xc3\xdf\x69\x70\x0c\xd2\xf7\x82\x7e\x4f\xbb\x04\xf5\xba\x44"
- "\xfd\x6d\x8c\x23\x1d\x3c\x73\xaf\xb3\xd4\xdf\xfc\x70\x1e\xcd\x1b"
- "\xfe\x36\x11\xca\xb3\x5f\xf2\x59\x21\xaf\xe8\x3d\xfd\x51\xba\x95"
- "\xfe\x9f\x71\x5e\x23\xaa\xa5\xfe\x56\x18\xd8\xd0\x6d\x0c\xb4\x43"
- "\x08\xeb\xbd\x92\x7b\xcc\xbe\x38\x4f\xe3\xbc\x56\x7c\x2e\x13\x9f"
- "\xb3\xc1\x33\x66\xcc\x45\x54\x4e\x63\x37\x7f\xd0\x55\x7e\x2b\x9b"
- "\xe8\xba\xf9\x56\x78\xe6\x34\x2b\x3a\xdc\xbf\xc6\xf7\xe3\xf7\x6a"
- "\x98\xbe\xa7\xb2\xc9\xc6\xe4\xa1\x9d\xc7\x3c\xcf\xce\xed\x90\x5e"
- "\xec\x19\xd6\x7e\x84\xc2\xfd\x06\xd2\x26\x79\xfd\xdd\xdf\x9a\xa4"
- "\xe2\x18\xb8\xaa\x3f\x32\x3e\x08\xb1\xd3\x22\x4a\xec\xbc\xbc\xfb"
- "\x94\xb9\x5b\xff\xd6\xff\x9d\xde\x74\xd3\xca\x6d\x88\xda\x68\xef"
- "\xe6\xff\x15\xb4\x89\x3b\xb6\xd0\xe6\xe6\x0d\x65\x65\x26\x9f\x43"
- "\x51\x38\xe6\x6f\xc0\xf9\x8d\xbd\x69\xf3\xd5\xd5\x98\x37\x65\xa6"
- "\x23\xc0\x24\x67\x2c\x16\x26\xcc\x9d\xae\x4d\x9d\x3d\x37\x71\xfe"
- "\xe2\x54\xad\x3e\xa1\x07\x9a\x38\x7f\xbe\x76\xee\xf4\x79\x4b\xb5"
- "\xfc\x33\x8f\x6b\x13\x66\x2f\x9a\x3e\x23\x39\x71\xd0\xdc\x57\x53"
- "\x7a\x60\x03\xc4\x7b\x0e\x0d\x7e\x16\xfb\x86\xb2\x86\xed\x9b\x11"
- "\x7a\x27\x18\xf9\xe2\xe7\x6a\xde\x70\x3c\xc6\xe4\xdb\x3d\x15\xdf"
- "\x2f\x67\x0b\xdd\x44\x41\x9a\x95\xd0\xa6\x6d\xcc\xe8\x86\xd3\x4e"
- "\xd9\x01\xcf\xb5\x1d\x9e\x1b\x9e\x11\x9e\xf9\xf8\x0a\xc7\x33\x3b"
- "\x38\xb1\x12\x73\x22\xa3\x11\x38\x78\xbc\x30\xd0\xd2\xed\x39\x9a"
- "\x8e\xc3\xe5\x6b\x82\xba\xe2\x73\x9e\xfa\x7a\x08\xe3\x01\x36\xd5"
- "\x5b\xe0\xda\x52\x07\xc7\xec\x79\x8f\xe5\xd2\x9b\xeb\x8d\xa0\x1d"
- "\x7d\x9a\xe9\xa4\x27\x81\x9b\x70\xfd\xd7\x7e\x0f\x23\x94\x49\x37"
- "\xc7\x31\xfb\x0f\xd0\xcd\xc0\x61\xc2\x53\x7c\xae\xe6\x2a\x85\x9e"
- "\x82\x3c\xac\x26\xf4\x9a\x0e\xe7\x61\x82\x63\x38\xe6\xf6\xa2\x58"
- "\xf5\x24\x03\xca\x7c\x20\x13\x65\x36\xe3\x6b\x76\x05\xd7\x05\xa6"
- "\x22\x9f\xe8\x34\xfa\x07\x68\x77\x7c\xe8\xfb\x62\xd5\xf4\xee\xe0"
- "\x3a\x13\x75\xdc\x64\xcf\x7f\x2c\x17\xca\xd3\xd0\xbc\xe1\xeb\x28"
- "\x13\x6a\x3e\x89\xf3\xd9\xb8\x85\x89\x7d\x03\x2e\x3b\xc4\x07\xbc"
- "\x0c\x6d\xa4\x57\xb3\x75\x28\x37\xa0\xc4\x9e\xfb\x52\x51\x95\xef"
- "\x75\x14\x6d\xa5\xdb\xe8\x4d\x01\x25\x95\x4d\x4d\xd0\xa6\xa5\xbc"
- "\x4a\xf7\x28\xb3\x05\x5a\x67\x27\xee\x08\x86\xba\xb8\xe9\xa5\x22"
- "\x7a\x53\x58\xc3\xa4\x81\x48\x0d\x79\x17\x39\xe2\x09\xb1\xf4\x95"
- "\xc7\xa3\xaf\x99\x35\x5d\x30\x1f\xe0\x79\x58\x3e\x7c\x6d\x3e\x92"
- "\xea\xca\x87\x1b\x75\x73\x4b\x18\xb2\xd2\x71\xcf\xb5\xe5\x85\x0d"
- "\xa3\x35\x61\xba\x8c\x73\xe8\x0e\x1c\xdb\x4a\xd0\xfb\x39\x4b\x50"
- "\x68\xf6\x2b\x48\x3b\x6d\xa9\x1a\x99\xf3\xc3\xb4\x81\xab\x32\x7d"
- "\x20\x26\x14\xb4\x2f\x11\xd0\x66\x46\xb4\xf5\x7e\x2c\x77\x45\x22"
- "\xa2\xf6\x9d\x2d\xa1\xb0\x4e\xc6\xf3\x42\xce\x53\x7f\xff\x64\x3b"
- "\x5c\x47\x5f\x8e\x43\x18\x0f\x06\x8b\xcb\x49\x68\xfc\x6c\xe8\x9f"
- "\xe7\x30\xe7\xcf\x15\x42\x9e\xf2\xca\xf5\x77\x46\xff\xda\x00\xab"
- "\x87\x01\xa7\xaa\x5a\x1b\x93\x27\x83\x55\x32\x87\xd5\x21\x78\x0e"
- "\x0e\xaf\xbf\x27\x63\x5c\x25\xca\x9c\xc9\x96\xb9\x14\xca\xbc\xcb"
- "\x4d\x99\x8b\x48\x99\xfd\x1a\xdd\x97\xb9\x7c\xb7\xfb\x32\x97\x7f"
- "\x27\xbf\xcc\xe5\x29\xf2\xcb\x5c\x1e\x2f\x5d\x66\x1d\x8b\xb3\x0e"
- "\x70\xd6\xb9\xc1\x59\xc7\xe2\x7c\xe7\x59\xf7\x65\xae\xd8\xe6\xbe"
- "\xcc\x15\x15\xf2\xcb\x5c\x91\x20\xbf\xcc\x15\x13\xdd\x94\x99\xc5"
- "\x59\x07\x38\xeb\xdc\xe0\xac\x63\x71\x0e\xfa\xc6\x7d\x99\x2b\xb3"
- "\xdd\x97\xb9\xf2\x88\xfc\x32\x57\xc6\xc9\x2f\x73\xe5\x18\xe9\x32"
- "\xeb\x59\x9c\xf5\x80\xb3\xde\x0d\xce\x7a\x16\xe7\xa1\x1b\xdc\x97"
- "\xb9\x6a\x95\xfb\x32\x57\x7d\x26\xbf\xcc\x55\xe3\xe4\x97\xb9\x6a"
- "\x84\x9b\x32\xb3\x38\xeb\x01\x67\xbd\x1b\x9c\xf5\x2c\xce\x2f\x3f"
- "\xed\xbe\xcc\xd5\x8b\xdd\x97\xb9\x7a\x8f\xfc\x32\x57\x47\xca\x2f"
- "\x73\x75\x84\x54\x99\x5b\xa1\xdd\x0e\x80\xb2\xb4\xfd\x2b\xee\x39"
- "\x9b\x26\x2c\x3c\xa0\x16\x51\x05\xab\xed\x49\x81\x75\xa8\x3b\x94"
- "\x2d\x89\xde\x32\x34\x1e\xff\x6b\xd7\x84\x19\x5a\x35\x61\xc3\x5a"
- "\x82\xeb\x8d\xcb\xa7\xa2\x3b\xb0\x1e\x5f\x6f\x47\xa1\xf6\xbc\x30"
- "\x5d\xd6\xf3\x48\xbb\xd2\x8c\xd4\x95\x19\x26\x94\x91\x42\x9b\x2b"
- "\xd1\x19\xd4\xb3\x0e\x7b\xcf\xef\x51\x79\x43\x19\x9a\xb7\x90\xa6"
- "\xcf\x53\x27\xae\xe1\x77\xc0\xa0\x93\x33\x73\xff\x89\xb4\x70\x8f"
- "\x88\xed\xf0\xc3\xf9\x04\x8e\x83\xfe\x73\xcb\xd0\x19\x3b\x32\x50"
- "\xe8\x97\x73\xea\x10\x3e\x5e\x08\x3f\xdb\x96\xc7\x72\x33\xa6\x22"
- "\xea\xa3\xc6\x1a\x8a\xf4\xcd\x27\x8e\x38\xf7\xcd\xe3\xa6\x43\x2c"
- "\x67\xe0\x73\xdf\xf4\x2c\x78\x5e\x6e\x2c\x4f\x64\x39\xfa\x6e\x26"
- "\x96\xa7\x6c\xa4\xbf\x77\xea\xbb\xbf\x84\xfb\x73\xb1\x3c\xb1\x02"
- "\xc7\x92\xce\x0b\x8b\xac\xaa\x6b\xc5\xbe\x49\x7d\x3e\x0d\x51\x70"
- "\x3c\xbc\x32\xa5\x11\x49\xc4\x38\x93\x17\xe3\xbd\x01\xb5\x7e\x8d"
- "\x12\x31\x2e\x86\x18\x97\x8a\xc4\x78\x97\x67\x31\xfe\xc7\x64\xef"
- "\x63\xfc\x0f\xbd\x74\x8c\xff\xb1\x40\x7e\x8c\xbf\x31\xcb\x8f\xf1"
- "\x37\x26\x36\xc6\x46\x61\x8c\xbf\xc9\x95\x8e\xb1\x8e\xc7\x63\x1d"
- "\xf0\xf8\xce\xb3\xe2\x31\xd6\x01\x8f\x75\x22\x3c\xd6\x79\xc8\xe3"
- "\x93\x87\xbc\x8f\xf1\xc9\xf5\xd2\x31\x3e\xf9\xad\xfc\x18\x9f\x9c"
- "\x28\x3f\xc6\x27\xa3\x48\x8c\x75\x4e\x3c\xfe\x47\x93\x9b\x18\xf3"
- "\x78\xac\x03\x1e\x07\x7d\x23\x11\x63\xe0\xb1\x4e\x84\xc7\x3a\x0f"
- "\x79\xfc\xcf\xfb\xbc\x8f\xf1\xb7\x17\xa5\x63\xfc\xcf\xe1\xf2\x63"
- "\xfc\x6d\xa9\xfc\x18\x7f\x5b\xcc\xc6\xd8\x89\xc7\xdf\xc6\x49\xc7"
- "\x58\xcf\xe3\xb1\x1e\x78\x3c\x74\x83\x78\x8c\xf5\xc0\x63\xbd\x08"
- "\x8f\xf5\x1e\xf2\xf8\x5f\x6b\xbd\x8f\xf1\xbf\x62\xa5\x63\xfc\xaf"
- "\x42\xf9\x31\xfe\x57\x5f\xf9\x31\xfe\x57\x00\x89\xb1\xde\x89\xc7"
- "\xff\x3c\xe8\x26\xc6\x3c\x1e\xeb\x81\xc7\x2f\x3f\x2d\x11\x63\xe0"
- "\xb1\x5e\x84\xc7\x7a\x0f\x79\x5c\x73\xc1\xfb\x18\xd7\x7c\x26\x1d"
- "\xe3\xef\x7c\xe4\xc7\xb8\x26\x53\x7e\x8c\x6b\x52\xd8\x18\x3b\xf1"
- "\xb8\x46\x2b\x15\xe3\x36\xf0\x80\x3d\x21\xc6\x3d\x1b\x10\x55\x88"
- "\x63\x5b\x43\x62\x6b\xeb\x3d\x34\xbe\x90\xb2\x27\xe1\x98\x30\x63"
- "\x40\x3f\x86\xf6\xb2\xe5\x85\x85\xd3\x14\x94\x29\x03\x8f\xbb\x7e"
- "\x37\xdb\xba\x1a\xf5\xd2\x66\xe0\xf1\xdf\x7f\x33\xf3\x03\xb4\x19"
- "\x6f\x9e\x86\xfb\xa9\xf0\xb8\x97\x75\xd3\x85\x22\x5b\xc8\x03\x29"
- "\xe7\xa9\xef\x77\xd2\xfa\x10\x04\xde\x2b\x92\x7e\x2d\x54\x53\xd5"
- "\x50\x02\xf1\xf9\x1a\x55\xd6\xfc\x19\xd9\x7b\x0f\x9d\xf1\xb0\x15"
- "\x19\xe8\x1f\x0d\x9a\xf2\x54\x13\xb2\xbd\x1a\x1a\x50\x95\x56\x86"
- "\xaa\xd2\x3e\x45\xd1\x75\xf4\x75\xfa\xbf\x86\x80\xb6\x90\x11\xc5"
- "\xb6\x90\xa1\x91\xb6\xfc\xd1\x06\x6b\xc8\x88\xad\xfb\x96\x98\xa8"
- "\x00\x0b\x32\x24\xd7\xd2\x74\xce\x0c\xe4\x9b\x73\x16\xf9\x6f\x9c"
- "\x81\x02\x36\x9e\x45\xea\xf2\xda\x1a\x54\x51\x5f\x86\x2a\x1a\xbf"
- "\x43\x15\xd7\xe1\xd7\x0a\x3f\x3b\xfc\x32\xbf\x03\xac\x11\x1a\x7f"
- "\x11\xe1\xbd\x1b\xcd\xbf\x3c\x85\x34\xe5\xd6\x1a\x84\xbf\x7f\xbd"
- "\x44\x7d\x3f\x32\x20\x1e\x69\xe8\xff\x86\x22\xfa\xd5\x50\x0a\xce"
- "\xf9\xe2\xe3\x55\x56\x33\x2a\xaf\xb5\xe0\xf3\x7d\xe1\xbc\xef\xca"
- "\x5a\xc8\xdf\x5e\x86\xf7\x66\x34\x97\x67\x1e\x87\xf2\x6d\xcb\xa5"
- "\xb1\x87\xee\x1d\x86\x72\x21\xd4\x76\x3a\x74\x00\xe1\xc1\xbf\x27"
- "\x6d\xb7\xcb\xc5\xfa\xfb\x64\x26\xc6\xaf\x85\x06\x43\x9c\xef\xb1"
- "\xbf\x16\xa7\x9e\xf0\xdd\x0f\x74\x65\x53\x0d\xc2\x63\x09\x95\x4d"
- "\x5f\xa3\xaa\x35\x76\x14\xbd\x14\xa1\x71\x36\x84\x70\x2c\xaa\xd2"
- "\xea\xd0\x84\x14\x14\x88\xc7\x9f\xed\x3f\x1a\x82\xab\x6a\xcd\x28"
- "\xdd\x0a\xcf\x78\xc9\x72\xe3\x19\x2b\xd7\x54\x22\x38\x77\x4f\x65"
- "\x92\x09\x05\xa4\x20\x35\x8e\xaf\x35\x2f\xcc\x30\x01\xea\xcf\xbc"
- "\x26\x9a\xc6\xb1\xc5\x31\xc5\xf1\xc5\xf9\x39\x62\x5e\x95\x60\x46"
- "\x2b\x2d\x48\x5d\x95\x01\xff\xa6\xd1\xe6\x2a\x74\x05\xc1\x33\xc6"
- "\xd0\x41\xdb\x72\x81\x17\x09\x98\x0b\x26\xea\xbb\x78\xc0\x3f\x58"
- "\x82\x53\xbb\x08\xa7\xfc\x1a\x3d\xe0\xd4\x5e\x8e\x53\xff\x3e\xc4"
- "\x71\xea\xf4\x36\x69\x4e\x9d\xba\xc6\x72\xca\xd8\x35\x39\x75\x6a"
- "\x93\x7b\x4e\x9d\x4a\x71\xc3\xa9\x52\xe0\x54\xa6\x90\x53\xa7\xf7"
- "\xc8\xe7\xd4\x29\x63\x27\x72\xaa\x58\x19\xa7\x4e\xed\x12\x72\xea"
- "\xdf\xfb\xa5\x39\xa5\x63\xdb\xa9\x3b\xcf\xb6\xcf\x29\x1d\xaf\x9d"
- "\xfa\x4f\x10\xc7\xa9\x1f\x2e\x4a\x73\xea\x87\xb1\x84\x53\xba\x2e"
- "\xda\x4e\xfd\xe7\x9c\x7b\x4e\xfd\xe7\xa8\x34\xa7\x74\xd0\x4e\xe9"
- "\x9c\xda\xa9\x1f\x6c\xf2\x39\xf5\x83\xa6\xf3\x38\xa5\x53\xd8\x4e"
- "\xfd\xc7\x22\xe4\xd4\x7f\xfc\xdd\x70\x8a\x6d\xa7\x82\xbe\xf1\x80"
- "\x53\xbc\x76\xca\x94\xc8\x71\xea\xec\x28\x69\x4e\x9d\x29\x64\x39"
- "\xd5\x45\xdb\xa9\x33\xc3\xdd\x73\xea\x4c\xa8\x1b\x4e\x41\x3b\xa5"
- "\x73\x6a\xa7\xce\xc6\xca\xe7\xd4\x99\xa4\x4e\xe4\x94\xc2\x76\xea"
- "\xcc\x38\x21\xa7\x4c\x53\xa4\x39\xa5\x67\xdb\xa9\xa1\x1b\xda\xe7"
- "\x94\x9e\xd7\x4e\x9d\x3d\xc0\x71\xaa\x36\x5f\x9a\x53\xff\xbd\x42"
- "\x38\xa5\xef\xa2\xed\xd4\x7f\xb3\xdd\x73\xea\xbf\xc9\xd2\x9c\xd2"
- "\x43\x3b\xa5\x77\x6a\xa7\x6a\x77\xcb\xe7\xd4\x7f\x0f\x76\x1e\xa7"
- "\xf4\x0a\xdb\xa9\xff\x16\x09\x39\x75\xb6\xc4\x0d\xa7\xd8\x76\xea"
- "\xe5\xa7\x3d\xe0\x14\xaf\x9d\x3a\xd7\x93\xe3\xd4\xf9\x0b\xd2\x9c"
- "\x3a\xff\x2c\xcb\xa9\x2e\xda\x4e\x9d\x3b\xe3\x9e\x53\xe7\x8c\x6e"
- "\x38\x05\xed\x94\xde\xa9\x9d\x3a\xdf\x22\x9f\x53\xe7\xd5\x9d\xc8"
- "\x29\x85\xed\xd4\xb9\x26\x21\xa7\xce\xf9\x4a\x71\xaa\x15\xfb\x3e"
- "\x1f\xe0\x54\x12\xf8\x3e\xe0\x50\x60\x35\xe1\x54\x1b\x70\xea\x7d"
- "\x3e\xa7\xfe\xed\xec\xfb\xfe\x37\xdd\x7e\x83\x53\x17\xe6\x3a\x73"
- "\xca\x0e\x9c\x6a\x63\x38\x55\xb7\xd6\xe1\xfb\xaa\x1a\x8a\x00\xab"
- "\x7a\x54\x15\x03\x7c\xda\xc2\xf2\xe9\xdf\xc0\x27\x28\x8f\x1d\xca"
- "\x5b\x7e\xaa\x06\x45\x9b\x49\xb9\x5a\xa1\xbc\x76\x3e\x97\x5a\xeb"
- "\x28\xcc\x21\xcc\x1d\x07\x8f\x2a\xe6\x01\x7f\x16\x9e\x40\x15\x4b"
- "\xe0\xb7\x0c\x7e\x19\xf0\x43\x27\x50\x79\x1d\x62\xc6\xec\x39\xfe"
- "\x54\xb3\xfc\xa9\xbb\xcf\x3d\x7f\xea\x90\x3c\x8f\x77\x21\x5d\x3e"
- "\x7f\xea\x62\xd8\xb9\x74\xea\xe8\xd8\x1f\x68\x3c\x07\x96\x70\xa4"
- "\x1e\x45\x5b\x51\x20\xfd\xb2\x21\x38\x20\x0e\xa9\x97\xdb\x10\x95"
- "\x3d\x03\xa9\xb3\xbf\x87\xf2\x3a\xea\xce\x59\x14\xf0\xb5\xe5\xcf"
- "\xa8\xbc\xb1\x06\x95\x5f\x3f\x8e\xca\xed\xf0\xab\x87\x1f\x3c\x63"
- "\x74\x22\xbf\xbc\x66\xb6\xbc\x17\x82\x20\x2f\x9d\x9b\xf2\x9a\x99"
- "\xf2\x26\x40\x79\x5b\xb9\xf2\x56\x01\x17\x01\x97\x7b\xec\xac\x4f"
- "\x8c\x36\xa3\xee\xf3\xad\x34\xdd\xca\x72\x10\xe3\xf2\xf5\x49\x0b"
- "\x8a\x4e\x01\xac\x5e\x05\x0e\xd6\x16\xa3\x95\x2b\x80\x83\xad\x16"
- "\xfc\x5e\xdf\x5c\x95\xd9\x02\x1c\xac\x1b\x4c\x43\xdc\xda\x30\x07"
- "\xff\x8d\x39\xf8\xbf\x38\xbb\x34\x07\x77\x11\x0e\x82\x4f\x6c\x9f"
- "\x83\xbc\x76\xed\xc2\x39\x8e\x83\x3f\x5e\x91\xe6\xe0\x8f\xdd\x1d"
- "\x3e\xf1\xa7\xe7\x60\xfd\x6e\xf7\x1c\xac\x5f\x23\xcf\x13\x36\xf8"
- "\xc8\xe7\x60\xfd\xc9\xce\xe3\xe0\x8f\xf9\xee\x39\xf8\x63\xaa\x07"
- "\x1c\x2c\x56\xc6\xc1\xfa\x52\x21\x07\x2f\x9c\x92\xe6\xa0\x8e\x6d"
- "\x07\xc1\x57\xb6\xcb\x41\xbe\xaf\x6c\x98\xcd\x71\xf0\xd2\x62\x69"
- "\x0e\x5e\xcc\x76\xf8\xca\x9f\x9e\x83\x17\x07\xba\xe7\xe0\x45\x7f"
- "\x79\x1e\xf2\xd2\x5a\xf9\x1c\xbc\x18\xd7\x79\x1c\xbc\xd4\xc7\x3d"
- "\x07\x2f\x5a\xda\xe7\xa0\x4e\x61\x3b\x78\x71\x84\x90\x83\x0d\xf1"
- "\x6e\x38\xc8\xb6\x83\xe0\x43\xdb\xe7\x20\xaf\x1d\xbc\x74\x91\xe3"
- "\xa0\xb9\x45\x9a\x83\xe6\x20\x87\x0f\xfd\xe9\x39\x78\x79\x9f\x7b"
- "\x0e\x5e\xce\x92\xe7\x39\xaf\x74\x97\xcf\xc1\xcb\xa7\x3a\x8f\x83"
- "\xe6\x42\xf7\x1c\x34\xaf\xf0\x80\x83\x0a\xdb\xc1\xcb\x46\x21\x07"
- "\x2f\xd5\x4a\x73\x50\xcf\xb6\x83\xe0\x5b\xdb\xe5\x20\xdf\xb7\x5e"
- "\x59\xc0\x71\xf0\x6a\xba\x34\x07\x1b\xf3\x1d\xbe\xf5\xa7\xe7\x60"
- "\xe3\x23\xee\x39\xd8\xa8\x96\xe7\x51\xaf\x66\xcb\xe7\x60\x63\x7c"
- "\xe7\x71\xf0\xea\x7d\xee\x39\x78\x15\xb5\xcf\x41\xbd\xc2\x76\xb0"
- "\x31\x4a\xc8\xc1\x2b\x49\x6e\x38\xc8\xb6\x83\xe0\x73\xdb\xe7\x20"
- "\xaf\x1d\xbc\x7a\x8d\xe3\xe0\x75\x1f\x69\x0e\x5e\xeb\xe3\xf0\xb9"
- "\x3f\x3d\x07\x9b\x3e\x73\xcf\xc1\xa6\x3c\x79\x9e\xf6\x7a\x90\x7c"
- "\x0e\x36\xd5\x76\x1e\x07\xaf\xed\x76\xcf\xc1\x6b\x6b\x3c\xe0\xa0"
- "\xc2\x76\xb0\xa9\x4c\xc8\xc1\xab\x0d\x52\x1c\xb4\x83\x2f\x6e\xdb"
- "\x15\x82\xec\x79\x23\x8a\x03\x7d\xb4\xc8\xaa\x79\x20\xa5\x2a\xb5"
- "\x09\x4d\xb8\x06\xf1\x49\xb9\x86\x5e\xb9\xa6\x46\xb6\xbc\x11\x5b"
- "\x41\x93\x1b\x78\xfe\x99\x99\x5b\x66\xcd\xdd\x96\xbb\x71\x1e\xf2"
- "\x05\xff\x3d\x03\x1f\xab\x3a\x6f\x41\xf8\xfe\xe9\xf8\x79\xea\xb9"
- "\xe7\xc1\xe3\x04\xf4\x65\x83\x9a\x79\xc7\xdc\x6a\x42\xb5\x23\x90"
- "\xaa\xbc\xd6\x04\x71\x58\xc6\xe0\x8b\xe3\x02\x78\xd6\xee\xb8\x84"
- "\x7c\xad\xff\x0d\xbd\x07\xe2\xad\xe9\xf9\x3a\xf2\xe9\x5b\x4b\xdb"
- "\x71\x5c\x71\xbc\x70\x8c\xb5\xcb\xf0\xbb\xeb\xe6\x21\x95\xc0\x31"
- "\xeb\x7f\x0d\xf7\x6c\x87\x74\xe2\x7e\xb5\x79\xa4\x7c\x6e\x34\xb3"
- "\xdf\xc3\x5e\x3f\x55\x0e\xbd\xa5\x44\xac\x76\x79\x18\xab\x62\x9e"
- "\xcf\xbb\x09\xb1\xb2\xa8\x3d\x8b\x95\x65\xba\x53\xac\x44\x7c\x95"
- "\x65\xb6\xfc\x58\x59\xd8\x75\x22\x2d\xfe\xd2\xb1\xd2\x79\xc8\x2b"
- "\x9d\x81\xe7\x47\x6e\x42\xac\x5a\x46\x78\x16\xab\x96\x6c\x61\xac"
- "\xc4\xf4\x7f\x4b\xbe\xfc\x58\xb5\xc4\x91\x58\xb5\x0c\x76\x13\x2b"
- "\x0f\x79\xa5\x2b\xe6\xe9\xe6\x9b\x10\xab\xd6\x24\xcf\x62\xd5\x7a"
- "\xc0\x29\x56\x22\x3a\xb5\xf5\x88\xfc\x58\xb5\xae\x21\xb1\x6a\x8d"
- "\x97\x8e\x95\xde\x43\x5e\xe9\x0d\x3c\x7d\x77\x13\x62\xd5\x96\xe7"
- "\x59\xac\xda\xce\x09\x63\x25\xa6\xa7\xda\x2e\xca\x8f\x55\x5b\x09"
- "\x89\x55\x5b\x96\x9b\x58\x79\xc8\x2b\x7d\x31\x4f\x87\xdc\x84\x58"
- "\x59\x8d\x9e\xc5\xca\x16\xe4\x14\x2b\x91\x7e\xdf\xd6\x47\x7e\xac"
- "\xac\xa7\x48\xac\xac\xa5\x52\xb1\xb2\xe5\x85\xe9\x02\x21\x06\x2d"
- "\x5b\xc2\x50\x60\x1a\xa2\x5a\x75\x10\x37\x0d\xc4\x6d\x95\x16\xf4"
- "\x13\xc4\xcd\x6c\x45\x13\x16\xfc\x40\x57\x36\xd8\x50\x2b\xc4\xac"
- "\x45\x13\x66\xa8\x32\xd7\xe1\x39\x47\x4f\x9c\xa5\xec\x2d\x2f\x2f"
- "\x50\x23\x1c\x37\x1c\x07\x1c\x3b\x1a\xe2\xc6\xc4\x51\x33\xda\x60"
- "\xd3\x0c\x8d\x1c\x7f\xf1\x07\x7a\xbe\x89\xa6\x71\x79\x69\xf5\x85"
- "\x22\xfc\x5e\x20\xba\x0e\x75\xd7\x3e\x8f\xcb\x64\xdf\x83\x8f\x57"
- "\x99\x6b\x40\x1f\x34\x22\x46\x9b\xfd\x60\xd0\xd8\x5e\x34\x04\xd8"
- "\xaa\xe2\x9e\xa3\x83\xeb\x8d\xd6\xde\x8f\xe5\xae\xbc\x88\xee\xc0"
- "\xfa\x21\xc7\x8e\x42\xd3\xe7\x22\xea\xa3\x39\x46\x8a\xf9\x76\x6d"
- "\x21\x93\xc7\x62\x88\x4b\x28\x7d\x95\x37\xa7\xfb\x6a\x12\xaa\x3a"
- "\x9f\xcb\xe0\xe6\xac\x11\x18\xdc\xfe\x65\x50\x83\xce\x8c\xa0\x35"
- "\x61\xc3\x72\x2b\x91\x96\x6e\x83\x18\x33\xdf\x13\xd1\xd3\x77\xb4"
- "\xca\x8d\xb1\x9d\x99\xff\x6d\xd7\xb2\xf3\xb7\x20\x4e\xf8\xfe\xcc"
- "\xfc\xad\x14\xde\xfc\x2d\x78\x66\x6e\xfe\x96\xdd\x17\xcf\xdf\xb2"
- "\xff\x10\x7a\x8f\xa3\xec\xf3\x93\x69\x1a\xca\x1e\x5c\xd9\x64\x46"
- "\xb8\xfc\x95\x4d\x46\xb4\x32\x15\xa9\x2b\x5b\xeb\x50\x46\x13\x6d"
- "\xae\xcc\xbc\x80\xa2\xaf\x61\x1d\x8c\xf9\x62\xbf\x42\x70\xb5\x1d"
- "\xb5\xff\x60\xb8\x07\xf2\xab\xab\xac\x46\x88\xf7\x1d\x4f\x12\x68"
- "\x66\x7f\xc0\x21\xa9\x2a\xf3\x2c\x02\x4c\x8c\x55\xd6\xef\x31\x4e"
- "\x49\x70\x7e\xc4\x0d\x7d\xdd\x7b\xe8\x5f\xf0\x31\x8c\x19\x7e\xdf"
- "\x84\xd7\x07\xd8\xc1\xd3\xdf\x98\x17\x81\x69\x99\xa8\x2a\xad\x15"
- "\x55\x5a\xf1\x37\xbb\xb6\x94\xbf\xc7\xd5\x48\xf1\x68\x17\xcb\xa3"
- "\xcc\xc0\x34\xbf\x46\x0f\x78\x54\x7c\x83\x47\x2a\x9f\x51\x5e\xf1"
- "\x48\x85\xae\x78\xcd\x23\x15\x3a\xe4\x05\x8f\x4a\x05\x3c\x52\xf9"
- "\xec\x91\xcd\x23\x15\x5a\x27\x9b\x47\x2a\x34\xce\x2b\x1e\xa9\x7c"
- "\x98\xf5\x25\x20\x9f\x00\x86\x47\x2a\x9f\x08\x8e\x47\xcc\xb7\x51"
- "\x37\x89\x47\x74\xa9\x34\x8f\x74\x6c\x7b\xa4\x83\xf6\xe8\xce\xb3"
- "\xed\xf3\x48\xc7\xb5\x47\x2a\xd5\x7a\xef\x78\xa4\x1a\xee\x3d\x8f"
- "\x54\x7e\xca\x79\xa4\x13\xb6\x47\x2a\xd5\x15\xf9\x3c\xa2\xaa\xe5"
- "\xf3\x88\xca\xf3\x8e\x47\xaa\x55\x84\x47\xd4\x44\xc2\x23\x55\x1a"
- "\xc7\x23\xe6\x7b\xb3\x9b\xc3\x23\x15\x85\xdc\xf0\x88\x6d\x8f\x74"
- "\xd0\x1e\x05\x7d\xe3\x01\x8f\x78\xed\x91\xdf\x09\xef\x78\xe4\xb7"
- "\xca\x7b\x1e\xf9\x8d\xf7\x82\x47\x4e\xed\xd1\x1d\xc3\xe5\xf3\xc8"
- "\x2f\x54\x3e\x8f\x7c\x4f\x79\xc7\x23\xbf\xe3\x84\x47\xbe\x05\x84"
- "\x47\x7e\x46\x8e\x47\xcc\x37\x7c\x37\x89\x47\xbe\x63\xa4\x79\xa4"
- "\x67\xdb\x23\x3d\xb4\x47\x43\x37\xb4\xcf\x23\x3d\xaf\x3d\xf2\xef"
- "\xe3\x1d\x8f\xba\x1d\xf7\x9e\x47\xdd\xf2\x95\xf3\x48\xef\xd4\x1e"
- "\xf9\xaf\x92\xcf\xa3\x6e\xf1\xf2\x79\xd4\x4d\xe7\x1d\x8f\xfc\x83"
- "\x08\x8f\xee\xa8\x25\x3c\xf2\xf7\xe7\x78\xc4\x7c\x17\x79\x93\x78"
- "\x74\x47\xae\x1b\x1e\xb1\xed\x91\x1e\xda\xa3\x97\x9f\xf6\x80\x47"
- "\xbc\xf6\xa8\xc7\x74\xef\x78\xd4\x23\xc8\x7b\x1e\x75\x3f\xed\x05"
- "\x8f\x9c\xda\xa3\x1e\xc7\xe5\xf3\xa8\x7b\xb1\x7c\x1e\x75\x4f\xf6"
- "\x8e\x47\x3d\x26\x13\x1e\x75\x0f\x27\x3c\xea\x11\xc3\xf1\x88\xf9"
- "\xd6\xf4\x26\xf1\xc8\xbf\x46\x8a\x47\x78\x2d\x82\x77\xc8\xba\x10"
- "\x4d\x1b\x97\xa1\x61\x3b\xf0\xbf\xad\x28\xa2\x39\xe7\x4e\x74\x64"
- "\x05\x59\x0f\x00\x9e\x93\x19\xef\x15\xbb\xfe\xce\x3d\x80\x8b\x26"
- "\x4c\x1b\x7d\x9a\xac\xd1\x80\xd7\x05\xb9\xba\x32\x09\x3d\x8c\xd7"
- "\x65\x50\x05\x0c\xc3\xeb\x58\xdd\x58\x3b\x40\x23\xb1\x76\xc0\x4b"
- "\xd2\x6b\x07\xb4\x6e\x71\x7c\x77\x5b\xcc\x7d\x77\xab\x0a\xf0\x73"
- "\xfb\xdd\xad\xea\xce\x8b\x85\x2f\xc9\xe5\xc3\x9d\xcc\xf7\x5f\x57"
- "\x7b\x87\x21\x28\x3b\x2e\xf3\x49\x52\xf6\x00\x66\xbd\x95\xf6\xbf"
- "\xc7\x2d\xe6\xf1\xe4\xce\xe2\x49\x53\x50\x26\xbd\xe1\x6b\x2b\x1d"
- "\x12\xa6\xa5\xf3\xc3\x22\xe4\x3d\x4b\x40\x54\x3b\xf1\x2e\x12\x8f"
- "\x77\xcf\x62\x36\xde\x99\x6c\xbc\xc5\xd7\x2d\x78\x49\x7a\xdd\x02"
- "\xf1\x78\xf7\x74\xff\x9d\xb3\xaa\xe7\x54\xf9\xf1\xee\x69\x60\xe3"
- "\x9d\xd9\x9c\xd3\x33\x99\x8b\x77\xcf\x3a\xf9\xf1\xee\x19\x4a\xe2"
- "\xfd\x77\x33\xc4\xbb\x08\xe2\x5d\x22\xf3\x59\xf6\xbb\x8f\xb7\x4e"
- "\x82\xdf\x81\xa1\x24\xde\xec\x9a\x09\x1a\x89\x35\x13\x5e\x92\x5e"
- "\x33\x41\x3c\xde\xbd\xce\xb9\x8f\x77\xaf\x0a\xf9\xf1\xee\xb5\x95"
- "\xc4\x5b\x07\xfc\xee\x75\x8a\x8b\x77\xa0\x87\xeb\x0a\xf0\xe3\xdd"
- "\x6b\x1d\x89\x77\x79\x2d\x1d\xa2\x03\x7e\xeb\x64\xf2\x3b\x50\xd7"
- "\x4e\xbc\x25\xf8\xad\x5e\xc7\xc6\x9b\xe5\xb7\xc4\x7a\x0d\x2f\x49"
- "\xaf\xd7\x20\x1e\x6f\xf5\x24\xf7\xf1\x56\x8f\x94\x1f\x6f\xb5\x3f"
- "\x1b\x6f\xe0\xb7\x7a\x1c\x17\x6f\x75\x99\xfc\x78\x07\x5a\x48\xbc"
- "\x2b\x6a\x20\xde\xc0\x6f\x9d\x4c\x7e\xab\xf3\xdc\xc7\x5b\x2f\xc1"
- "\xef\x20\x0b\x89\x37\xbb\x56\x84\x46\x62\xad\x88\x97\xa4\xd7\x8a"
- "\x10\x8f\x77\xd0\x31\xf7\xf1\x0e\xda\x27\x3f\xde\x41\x69\x24\xde"
- "\x7a\xe0\x77\xd0\x41\x2e\xde\xc1\xc3\xe4\xc7\x3b\x28\x89\xc4\xbb"
- "\xb2\x9c\x0e\xd1\x03\xbf\xf5\x32\xf9\x1d\xec\xdb\x4e\xbc\x25\xf8"
- "\x7d\x57\x12\x1b\x6f\x96\xdf\x12\xeb\x54\xbc\x24\xbd\x4e\x85\x78"
- "\xbc\xef\x1a\xe2\x3e\xde\x77\xf5\x93\x1f\xef\xe0\x3a\x36\xde\xc0"
- "\xef\xbb\xc2\xb9\x78\xdf\x55\x2c\x3f\xde\xc1\x35\x24\xde\x55\x46"
- "\x88\x37\xf0\x5b\x2f\x93\xdf\x77\xa5\x4a\xc5\x3b\x10\xe2\x7d\x0c"
- "\x74\x0c\xf4\x83\x06\x7b\x1e\xe8\x14\x9b\x30\xee\x55\x69\xc3\xd0"
- "\x43\xd7\x71\xec\x43\x26\x42\xdf\x61\xe8\xb4\xf5\x32\x54\x21\x23"
- "\xbd\xfe\x76\x58\x15\xd2\x5d\xf2\xdb\x61\x95\xe6\x8a\xec\x6f\x87"
- "\x55\x9a\x83\x9c\x06\x0a\x41\x1c\xa6\x21\x4c\xfb\x21\xeb\x9b\x62"
- "\x95\x66\xaf\xe8\x3a\x1a\x2a\xcd\x14\xfc\x4d\x31\xbd\xa1\x7a\xbf"
- "\x3d\x5f\x89\x36\x0a\x89\xf7\x00\xeb\x62\xc0\xa1\x48\x1a\xeb\xbb"
- "\x23\x01\xeb\xe2\x4e\x5b\xb7\x43\x75\xf7\x40\xef\xb1\xee\x7d\x4d"
- "\x1a\xeb\xde\xa7\xe5\x63\xdd\xbb\x98\xd3\x5f\xbd\x1b\x38\xac\xef"
- "\xce\x94\x8f\x75\xef\xad\xa2\xeb\x79\xa8\x7a\x8f\x21\x58\x7f\x13"
- "\x0a\x58\x2b\xd0\x65\x77\x8f\x6b\x1f\x6b\x1d\xd4\x6b\x9d\x9b\x7a"
- "\xdd\x27\x1c\xfa\x4c\x43\xa7\xad\x1f\xa2\xea\x13\xe2\x3d\xd6\xa1"
- "\x67\xa4\xb1\x0e\x3d\x2e\x1f\xeb\xd0\x3c\x4e\xfb\x85\xd6\x70\x58"
- "\xf7\x49\x96\x8f\x75\xe8\x1a\xd1\x75\x45\x54\xa1\x83\x09\xd6\xff"
- "\x58\x61\xcf\x57\xa2\x09\xfb\x0c\xf3\x00\x6b\xa8\xd7\x3a\x37\xf5"
- "\xfa\x17\xa1\x80\x75\x71\xa7\xad\x63\xa2\xfa\x85\x8f\xf7\x58\xdf"
- "\x53\x21\x8d\xf5\x3d\x9f\xc9\xc7\xfa\x9e\x4c\x4e\x77\xde\x73\x94"
- "\xc3\xfa\x17\x71\xf2\xb1\xbe\x27\x45\x74\x7d\x13\xd5\x3d\x5a\x82"
- "\xf5\x49\x13\x60\xad\x40\x8f\xfe\x42\x52\xff\x73\x58\xeb\xa1\x5e"
- "\xeb\xdd\xd4\xeb\x7e\xbe\xa0\x15\x0c\x9d\xb6\x9e\x8a\xaa\xef\x45"
- "\xef\xb1\xee\x7b\x40\x1a\xeb\xbe\x3b\xe5\x63\xdd\x37\x99\xd3\xbc"
- "\x7d\x4b\x38\xac\xfb\x45\xc9\xc7\xba\xef\x14\xd1\x75\x56\x54\x7d"
- "\x03\x08\xd6\xff\x8c\xb2\xe7\x2b\xd1\xc2\xfd\xd4\x1e\x60\x0d\xf5"
- "\x5a\xef\xa6\x5e\xf7\x07\x5f\xaf\x2f\xee\xb4\x75\x5d\x54\xfd\xbf"
- "\xf3\x1e\xeb\xfe\xbb\xa5\xb1\xee\x9f\x2d\x1f\xeb\xfe\x71\x9c\xde"
- "\xee\x5f\xc0\x61\x7d\x6f\x84\x7c\xac\xfb\x8f\x11\x5d\xef\x45\xd5"
- "\xcf\x42\xb0\xfe\x57\x31\x60\xad\x40\x87\xf7\x97\xdc\xff\xc0\x9d"
- "\x0e\x5f\x54\x88\xfc\x85\x78\x6b\x4d\x9d\xab\xc5\xb5\xc7\xbd\xc7"
- "\x5b\x9b\x2f\x8d\xb7\x36\x5d\x3e\xde\xda\x31\x9c\x16\xd7\x66\x71"
- "\x78\xdf\xa7\x95\x8f\xb7\x76\x98\xb8\x16\xbf\xb7\xce\x3b\x2d\xae"
- "\x6d\x50\xa2\xc5\x5d\xf1\x1e\x50\xdd\xb9\x7a\x7c\xc0\x01\xef\xf1"
- "\x1e\xb0\x56\x1a\xef\x01\x73\xe5\xe3\x3d\x60\x18\xa7\xc7\x07\xac"
- "\xe0\xf0\x0e\x53\xcb\xc7\x7b\x80\x41\x5c\x8f\xdf\x57\xe3\x9d\x1e"
- "\x1f\x70\x4a\x89\x1e\x77\xc5\x5b\x67\xec\x5c\x4d\xae\xdb\xe3\x3d"
- "\xde\xba\xc5\xd2\x78\xeb\xa6\xca\xc7\x5b\x67\xe0\x34\xb9\x8e\x37"
- "\xfe\xad\x47\xf2\xf1\xd6\x85\x8a\x6b\xf2\xb0\x32\xef\x34\xb9\xae"
- "\x5c\x89\x26\x77\xc5\xfb\xfe\x92\xce\xd5\xe5\xf7\x6f\xf3\x1e\xef"
- "\xfb\x13\xa5\xf1\xbe\x7f\xbc\x7c\xbc\xef\x0f\xe5\x74\xf9\xfd\x53"
- "\x38\xbc\xef\x97\xbf\x7e\xa6\xea\x7e\x7f\x71\x5d\xae\x2f\xf5\x4e"
- "\x97\xdf\x7f\x50\x89\x2e\x77\xc5\xdb\x50\xd4\xb9\xda\xdc\xb0\xde"
- "\x7b\xbc\x0d\x93\xa4\xf1\x36\x8c\x94\x8f\xb7\xc1\x9f\xd3\xe6\x06"
- "\xde\xf8\xbf\xc1\x24\x1f\xef\x07\x2c\xe2\xda\xfc\x81\x62\xef\xb4"
- "\xb9\x61\xaf\x12\x6d\xee\x8a\xf7\x83\xb9\x9d\xab\xcf\x1f\x5c\xea"
- "\x3d\xde\x0f\x3e\x2b\x8d\xf7\x83\x83\xe4\xe3\x3d\xd0\xc2\xe9\xf3"
- "\x07\x47\x70\x78\x3f\x58\x2d\x1f\xef\x81\x75\xe2\xfa\x7c\xe0\x56"
- "\xef\xf4\xf9\x83\x05\xde\x8f\x93\x0f\x4a\xc6\xda\x5c\xee\xfa\x8f"
- "\x55\xa9\xec\x37\x77\xaa\x5f\x72\xeb\x3f\xaa\x06\x4d\x45\x52\x6b"
- "\xcb\xa8\xc2\x0f\x74\xe9\xf5\x1f\x55\xe1\xee\xd7\x7f\x54\x85\xcb"
- "\x5b\xff\x51\x15\xbe\x53\xf6\x7c\x7c\x55\x78\x32\xe7\x11\xc2\x79"
- "\xfe\x7f\x10\xd9\xa3\xb8\x2b\xaf\x0b\xa9\x0a\x17\xae\x0b\xa9\xfa"
- "\x25\xb3\x2e\x24\xbd\xe1\xbb\x00\x65\x5e\x64\x50\x9a\xf7\xef\x05"
- "\x22\xc6\x60\x1f\x22\x77\x1d\x4a\x8e\xdb\x0f\x3d\xcb\x71\x3b\x62"
- "\xb8\x34\xb7\x1f\xce\xef\xd2\xeb\x50\xaa\x1e\xee\xe3\x9e\xdb\x0f"
- "\x59\x64\xad\x39\xa2\x7a\x58\xfe\xba\x37\xaa\x87\xc7\x70\x7e\xe8"
- "\x61\x9e\xff\x8d\x58\xd7\x89\xdc\x56\xb6\x9e\x92\xea\xe1\x70\x21"
- "\xb7\x1f\x1a\x41\xb8\xfd\xef\x78\x65\xbe\x2b\x62\xa2\xf7\xef\x41"
- "\x1e\xd3\x61\xcf\x25\x77\x3d\x4c\x8e\xdb\x8f\xdc\xc7\x71\xfb\xb1"
- "\x10\x69\x6e\x3f\xba\xa0\x4b\xaf\x87\xa9\x7a\xe4\x9a\x7b\x6e\x3f"
- "\x72\x52\xd6\x5a\x26\xaa\x47\x27\xcb\xe7\xf6\xa3\x3a\xce\xfb\x3d"
- "\x9a\xc4\x71\xfb\xb1\x84\xce\xe3\xb6\xc2\x75\x32\x55\x8f\xfa\x0b"
- "\xb9\xfd\x48\x28\xe1\xf6\xe9\xfd\xca\x3c\xe6\x63\x11\xde\xbf\xf7"
- "\x19\x8a\xb0\xbf\x94\xbb\x2e\x27\xc7\xed\xc7\x6c\x1c\xb7\x87\xb8"
- "\xac\x0b\xc5\x71\x7b\xc8\xf8\x2e\xbd\x2e\xa7\x6a\xf0\x09\xf7\xdc"
- "\x1e\x5c\x22\x6b\x8d\x14\xd5\x90\x21\xf2\xb9\x3d\x04\x71\x3e\x77"
- "\x48\x14\xc7\xed\xa1\x91\x9d\xc8\x6d\x85\xed\xf6\xe0\x5a\x21\xb7"
- "\x1f\x6b\x22\xdc\x36\xf9\x2b\xf3\xd3\x43\x03\xbc\x7f\xcf\x35\xec"
- "\x14\xf6\xd2\x72\xd7\x07\xe5\xb8\x3d\xf4\x3b\x8e\xdb\xc3\x2a\xa4"
- "\xb9\x3d\x6c\x60\x97\x5e\x1f\x54\xf5\x2b\xf7\xeb\xff\xa8\x7e\xe5"
- "\x66\xfd\x1f\x91\x6f\x85\x55\xc3\xe4\xaf\x7b\xa1\xfa\xd5\x29\xce"
- "\xd3\x0f\xd3\x72\xdc\x1e\xde\xb7\xf3\xb8\xad\x70\xdd\x50\xd5\xaf"
- "\x8c\x42\x6e\x0f\xad\x26\xdc\x3e\x3b\x45\xd9\xd8\xc1\xb0\x3a\xef"
- "\xdf\xeb\x3d\x51\x8a\xc7\x0d\xe4\xae\x53\xca\x71\x7b\xf8\x67\x1c"
- "\xb7\x9f\xd8\x23\xcd\xed\x27\xfc\xba\xf4\x3a\xa5\xaa\xc7\xd7\xbb"
- "\xe7\xf6\xe3\x49\xb2\xd6\x74\x51\x3d\x2e\xff\x3b\x78\xd5\xe3\xa5"
- "\xdc\xf8\xc5\xe3\xbc\xf9\xef\x4f\x58\x3a\x91\xdb\x0a\xdb\xed\xc7"
- "\x0b\x84\xdc\x1e\xbe\x97\x70\xbb\xb6\x44\xd9\x38\xc9\x13\x47\xbd"
- "\x1f\x27\x79\xf2\x28\xf3\x0e\x53\xe6\x7a\xa9\x1c\xb7\x47\x6c\xba"
- "\xb1\x36\x91\xea\xc9\xcf\x9c\xb9\x7d\x63\x6d\x22\xd5\xc8\x8a\x2e"
- "\xb3\x5e\xaa\x6a\x64\xac\x7b\x1e\x8f\x8c\x90\x37\x26\x32\xf2\x33"
- "\xf9\x3c\x1e\x99\xc9\x8d\x89\x8c\xe4\xcd\x7f\x79\xca\xb1\x27\xf9"
- "\xcd\x5f\xb3\x48\xf5\xe4\x64\xb7\x6b\x16\xa9\x9e\x1c\x76\xd3\xd6"
- "\x51\x55\x8d\x4c\x10\xac\x59\xa4\x1a\xb1\xce\xce\xd4\x85\xff\xf9"
- "\x2a\x1b\x57\x79\x52\x72\x8f\x60\xcf\xc7\x55\x46\x91\xf7\xbb\x32"
- "\xd7\x6d\xe5\xea\xc2\x53\x85\x5c\x5d\x18\x75\x44\xba\x2e\x44\x7e"
- "\xd7\x65\xd6\x6d\x55\x45\x4e\x75\x5f\x17\x22\x47\xc8\x1b\x43\x89"
- "\x94\xbf\x0e\x8c\x2a\x32\x8b\x1b\x43\x89\xac\xe6\xea\xc2\xd3\xea"
- "\xce\xab\x0b\xa3\x12\xdd\xd7\x85\x51\x51\x37\x6d\x3d\x57\x55\x64"
- "\x8a\xb0\x2e\x3c\x95\x47\xea\xc2\x85\x75\xca\xc6\x61\x46\x29\x7a"
- "\xff\x2d\xac\x0b\x51\xa7\x98\x77\xdf\x32\xd7\x8f\xe5\xea\xc2\xd3"
- "\x7b\xb8\xba\x10\xe5\xa2\xe7\xb9\xba\xf0\xcc\xb9\x2e\xb3\x7e\xac"
- "\xea\x99\xd9\xee\xeb\xc2\x33\x63\xe4\x8d\xb9\x3c\x53\x21\xbf\x2e"
- "\x3c\xc3\xfb\xfe\xe9\x19\xde\xf7\x4f\xcf\xf6\xed\xbc\xba\x10\xb5"
- "\xc0\x7d\x5d\x88\x8a\xb9\x69\xeb\xca\xaa\x9e\x59\x21\xac\x0b\x4f"
- "\x17\x91\xba\xd0\x10\xa0\x6c\xdc\x26\xca\x03\xfd\xdf\xde\xb8\xcd"
- "\x73\x75\xcc\xbc\x00\x99\xeb\xd8\x72\x75\xe1\xd9\xcf\xb8\xba\xf0"
- "\xdc\x77\xd2\x75\x61\xf4\x95\x2e\xb3\x8e\xad\x6a\xf4\x62\xf7\x75"
- "\x61\xf4\x44\x79\x63\x34\xa3\xbf\x93\x5f\x17\x46\xef\xe2\xc6\x68"
- "\x46\xd7\x71\x75\x61\x8c\xa1\xf3\xea\xc2\x73\xe9\xee\xeb\xc2\x73"
- "\x53\x6e\xda\xfa\xb6\xaa\xd1\xeb\x84\x75\xe1\xd9\xbd\xa4\x2e\x5c"
- "\xca\x55\x36\xce\xf3\x5c\x93\xf7\xe3\x3c\xbf\x6e\x62\xe6\x4c\xc8"
- "\x5c\x4f\x97\xab\x0b\x63\x8e\x70\x75\xe1\xd7\xe7\xa4\xeb\xc2\x58"
- "\x5b\x97\x59\x4f\x57\x35\x76\x95\xfb\xba\x30\x36\x5e\xde\x98\xce"
- "\xd8\x73\xf2\xeb\xc2\xd8\x12\x6e\x4c\x67\x6c\x13\x57\x17\x7e\x33"
- "\xb8\xf3\xea\xc2\xaf\xd7\xbb\xaf\x0b\xbf\x4e\xba\x69\xeb\xec\xaa"
- "\xc6\xe6\x09\xeb\xc2\x98\x52\x52\x17\xae\x68\x94\x8d\x0b\xfd\x06"
- "\x79\x3f\x2e\x34\x01\x31\xf3\x49\x64\xae\xeb\xcb\xd5\x85\xdf\x54"
- "\x70\x75\x61\xbc\xf4\x3e\x0f\xaa\xf1\xdd\xbb\xcc\xba\xbe\xaa\x71"
- "\xee\xf7\x3f\x52\x8d\x73\xb7\xff\x91\xc8\x18\xd0\xb8\x2b\xf2\xeb"
- "\xc2\xb8\x83\xdc\x18\xd0\x78\xde\xf7\x7f\x13\x22\x3b\xaf\x2e\x8c"
- "\x77\xbf\xff\x83\x6a\xbc\x07\xfb\x3f\x28\x5c\xef\x57\x35\xae\x48"
- "\x58\x17\x7e\x73\x94\xd4\x85\xab\x5b\x95\x8d\x23\x4d\x68\x77\xfc"
- "\x1f\xfb\xfc\x36\x8d\xeb\x38\x52\x79\xed\x30\xf4\xcb\x97\x70\x5d"
- "\x88\xde\x6f\xcd\x0f\x33\xe0\xf5\x85\x6d\x3a\x76\x0d\xca\x55\xec"
- "\x1a\x2f\x4d\x56\xb2\x06\xa5\xd9\x76\x63\x0d\x4a\xb2\xf6\x07\xa2"
- "\xf0\xb7\xc0\xf8\x9b\x60\xab\x9a\xac\x3f\x49\xe3\x39\x51\x78\x8e"
- "\xd4\xd9\x32\x66\x7d\x95\x15\x56\x28\xfb\xf9\x76\xd6\x9f\x8c\x37"
- "\xa1\xf2\xf8\x65\xc8\x1a\xb4\x2d\x97\x7c\x27\x1c\x1d\xc5\xac\x3f"
- "\x39\x2d\xf4\x9e\x9c\xff\x20\x4d\x20\x5e\x7f\x32\x9e\xb6\xaf\x34"
- "\xd1\xe6\x4a\x0b\x82\xb4\x10\xdf\xe9\xec\x1a\x94\xaa\xe8\x7d\xb8"
- "\xec\xd6\x69\x86\x7b\xb6\xff\x47\x62\x7d\x61\x55\xb4\xfc\x75\x60"
- "\x55\xd1\xf1\xdc\xf8\x4e\xf4\x2e\x8e\xa3\xd1\x4c\x1f\x0c\xff\x8e"
- "\x28\x8f\x83\x36\x66\xc3\xf5\xbe\x6d\x8a\xd6\xde\x88\x36\x7a\x80"
- "\x19\x9e\x23\xe2\xd2\x7e\x71\x98\xc5\x26\x01\x66\xc5\x78\x9d\x63"
- "\xcf\x31\xf3\x6b\xbc\x39\x98\xc5\x58\x3c\xc7\x2c\x76\xba\x13\x66"
- "\x22\xe3\x10\xb1\x63\xe5\x63\x16\xab\xe1\xc6\x21\x62\xe3\x38\xcc"
- "\x62\x8b\x09\x66\x31\x66\x82\x59\xf3\x98\x36\x45\xeb\x77\xc4\xb6"
- "\xfb\xfd\x37\xf6\x4d\x6d\x1a\x57\x5f\xce\x61\xf6\xdb\xbe\xd6\x7c"
- "\xf0\xee\xe0\xcb\x3d\xc7\xec\xce\xb3\x37\x07\xb3\xe7\xf7\x7a\x8e"
- "\xd9\x6f\x43\x84\x98\x89\xf9\xe5\xe7\xe5\xef\xd9\xa9\x7a\xbe\x8c"
- "\xf3\xcb\xbf\x0d\xe0\x30\xfb\xed\x14\x82\xd9\xf3\xbb\x08\x66\x96"
- "\xd4\x36\x45\x6b\x80\xfc\xd6\xe0\x01\x66\xf8\x9d\xbe\x9b\x7a\x36"
- "\xb1\x1a\x30\x2b\xc6\xeb\x3e\x7b\x8e\x59\xd0\x37\x37\x07\xb3\x89"
- "\xf1\x9e\x63\x36\xf1\xb8\x13\x66\x22\xbe\x6e\xe2\x27\xf2\x31\x9b"
- "\xb8\x82\xf3\x75\x13\x8d\x1c\x66\x93\xd4\x04\xb3\x89\x71\x04\xb3"
- "\x16\xd0\x3f\x4a\x7c\xce\xc4\x76\xc7\xbf\xb0\x0e\x6d\xd3\xb8\xfa"
- "\x1c\x0e\xb3\x17\xd6\x58\xf3\xc1\x0b\x81\xcf\xf1\x1c\xb3\xa1\x1b"
- "\x6e\x0e\x66\x2f\x68\x3c\xc7\xec\x85\x74\x21\x66\x62\xfe\xe3\x85"
- "\x44\xf9\x98\xbd\x10\xc1\xf9\x8f\x17\x52\x39\xcc\x5e\x38\x4a\x30"
- "\x7b\x21\x80\x60\xd6\x5a\xde\xa6\x68\x2d\x92\x17\x72\x3d\xc0\x0c"
- "\xbf\x83\x75\x53\xcf\xe2\x86\x01\x66\xc5\x78\x1d\x6c\xcf\x31\x7b"
- "\xf9\xe9\x9b\x83\xd9\x8b\x65\x9e\x63\x16\xf7\x88\x13\x66\x22\x3a"
- "\x39\x4e\xfe\x3a\xd8\xaa\x17\x6b\x39\x9d\x1c\x67\xe0\x30\x8b\x4b"
- "\x23\x98\xbd\x68\x24\x98\xb5\x59\xda\x14\xad\x67\x12\x27\xb9\xfe"
- "\x97\x3b\xdd\xe8\x98\x97\xcf\xe1\x36\xd9\xdc\x75\xb4\xe3\xe4\x4c"
- "\xcf\x71\x9b\x7c\xa1\x7d\xed\x38\xf9\x84\x7c\xdc\x26\x17\x70\xda"
- "\x71\xb2\x89\xc3\xed\xa5\x08\x82\xdb\xe4\x34\xef\xb4\xe3\xe4\x76"
- "\xbf\x7f\x15\xd3\x8e\xae\xb8\xbd\x5c\xdc\x75\xf4\xe3\xcb\xc3\x3c"
- "\xc7\xed\xe5\x9d\xed\xeb\xc7\x97\xd7\xcb\xc7\xed\xe5\x89\x9c\x7e"
- "\x7c\x79\x2b\x87\xdb\xcb\x75\x04\xb7\x97\x23\xbc\xd3\x8f\x2f\x4b"
- "\xae\xff\xe6\x4e\x3f\xba\xe2\x36\x35\xbe\xeb\x68\xc8\x29\x66\xcf"
- "\x71\x9b\x3a\xb9\x7d\x0d\x39\x75\x94\x7c\xdc\xa6\x06\x70\x1a\x72"
- "\x6a\x0c\x87\xdb\xd4\x22\x82\xdb\x94\x3a\xef\x34\xe4\xd4\x64\x25"
- "\x1a\xd2\x15\xb7\x69\xa1\x5d\x47\x47\xbe\x52\xec\x39\x6e\xd3\x82"
- "\xda\xd7\x91\xaf\xc8\xdf\xb3\x58\xf5\xca\x51\x4e\x47\x4e\xf3\xe7"
- "\x70\x9b\x46\xf6\x60\x51\xbd\x52\xe4\x9d\x8e\x9c\xd6\xee\xfa\x1f"
- "\x62\x3a\xd2\x15\xb7\xf8\xea\xae\xa3\x25\xe3\x65\xe8\xff\xf8\xe3"
- "\xed\x6b\xc9\x78\x05\xfa\x3f\x7e\x05\xa7\x25\xe3\x79\xfa\x7f\x3a"
- "\xab\xff\xe3\xe3\xbc\xd3\x92\xf1\x9e\xe8\x7f\x17\x2d\xe9\x8a\xdb"
- "\x8c\x75\x5d\x47\x4f\xce\x08\xf5\x1c\xb7\x19\xab\xda\xd7\x93\x33"
- "\xe4\xef\x03\xa5\x9a\x31\x98\xd3\x93\x33\xd2\x38\xdc\x66\x94\x11"
- "\xdc\x66\xa8\xbd\xd3\x93\x33\x24\xd7\x7f\x74\xe0\x66\xd3\x84\x19"
- "\x68\x91\x71\xc8\x8a\xa4\x61\xec\xda\x84\x89\x71\xb6\x90\x30\x83"
- "\xdc\xfd\x5d\x1c\x6b\x4e\x1f\x4f\x42\xe8\xac\x2a\xe1\x8a\x77\xeb"
- "\x4e\x27\xec\xf4\x7e\xdd\xe9\x84\xb9\x1d\xb6\xbf\x8b\x2a\x61\x92"
- "\xfc\x75\xa7\x13\xb4\x9c\x06\x4d\x48\xe0\xb0\x4e\x64\xe6\x27\xc8"
- "\x5b\x8f\xfa\xd5\x5a\xef\xd6\xa3\x4e\xb8\x40\xf8\xf5\xea\x2e\xb2"
- "\x1e\x75\x82\xa9\x53\xf6\x7d\x51\xbd\x1a\x83\xd7\xa3\xa6\x37\xd8"
- "\x74\xca\xd6\x47\x4e\x4c\xf0\x80\xcf\xc5\xb4\xc8\x18\x2d\xc7\xe7"
- "\x24\x03\xf0\xb9\x58\xee\x3e\x33\x42\x3e\xcf\x3a\xe2\x1d\x9f\x67"
- "\x2d\xf0\x9e\xcf\xb3\x46\x76\xdc\x3e\x33\xb3\xf4\xf2\xf9\x3c\xd3"
- "\xcc\x69\xf3\x59\x83\x39\x3e\x27\x25\xc9\xe7\xf3\xcc\xfd\xde\xf1"
- "\x79\xd6\x01\xc2\xe7\x99\xa9\x84\xcf\xb3\x4a\x3a\x65\xff\x19\xd5"
- "\x4c\x2d\xe1\x33\x9d\xac\x6c\xfd\xe9\xa4\xc1\xed\xf3\x59\x67\xa0"
- "\x45\xc6\xaf\x39\x3e\xcf\xb1\xd8\x42\x74\x06\xb9\xfb\xdd\x08\xf9"
- "\x3c\x67\x93\x77\x7c\x9e\x33\xca\x7b\x3e\xcf\xe9\xd9\x71\xfb\xdd"
- "\xcc\xbe\x26\x9f\xcf\xb3\x8d\x9c\x67\x99\xe3\xcb\xf1\xf9\xb5\x61"
- "\xf2\xf9\x3c\x7b\x8d\x77\x7c\x9e\xb3\x9e\xf0\x79\x76\x14\xe1\xf3"
- "\x9c\xcc\xce\xd9\x07\x27\xc9\xcc\xf0\x39\xc7\x67\xbf\xb2\xf5\xbd"
- "\x5f\x93\x5c\xff\x98\xc7\xe7\x62\x5a\x64\x6c\x9f\xe3\xf3\xdc\x32"
- "\xe0\x73\xb1\xdc\x7d\x77\x84\x7c\x9e\xeb\xe5\x3e\x17\x73\x3b\x60"
- "\x9f\x8b\x64\x2f\xf6\xb9\x70\xde\x77\x27\xf9\x98\x7c\x3e\x27\xe7"
- "\x72\x5e\x2e\xf9\x24\xc7\xe7\x79\xfe\xf2\xf9\x9c\x3c\xd1\x3b\x3e"
- "\xcf\x65\xf7\xbf\x48\xd6\x10\x3e\xcf\x8d\xe9\x9c\xfd\x78\x5e\x33"
- "\x12\x3e\xab\xac\xca\xd6\x4f\x9f\x7b\xb2\x7d\x3e\xeb\x0d\xb4\xc8"
- "\x7b\x0f\x8e\xcf\x29\x5b\x6d\x21\x7a\x83\xdc\xfd\x7f\x84\x7c\x4e"
- "\x79\xc4\x3b\x3e\xcf\x3f\xe3\x3d\x9f\xe7\xef\xeb\xb8\xfd\x7f\xe6"
- "\xe7\xcb\xe7\xf3\xfc\x78\xce\xe3\xce\xe7\xbd\xff\x4f\xa9\x91\xcf"
- "\xe7\xf9\x5e\xee\x0b\x94\x32\x90\xf0\x79\x1e\xbb\x2f\x50\x8a\xb6"
- "\x73\xf6\x05\x9a\x97\x4b\xf8\x7c\x47\x94\xb2\xf5\xe9\x53\x76\x79"
- "\xc0\xe7\x62\x5a\xe4\x9d\x10\xc7\xe7\x45\x49\xc0\xe7\x62\xb9\xfb"
- "\x10\x09\xf9\xbc\xc8\xc7\x3b\x3e\x2f\xfc\xc4\x7b\x3e\x2f\x4c\xef"
- "\xb8\x7d\x88\x16\x26\xca\xe7\xf3\x42\xc7\xfb\x3f\x68\x9f\x17\xf2"
- "\xde\xff\x2d\x52\xb0\x3f\xd1\x82\x26\xef\xf8\xbc\xb0\x85\xf0\x79"
- "\xc1\x7e\xc2\xe7\x85\xe6\xce\xd9\x9f\x68\x41\x3c\xe1\xb3\x7f\x96"
- "\xb2\xf5\xff\x17\xb5\x3b\xff\x43\x6c\x7c\xc3\x31\x2e\xc5\x71\x7a"
- "\xc9\x08\xef\xc7\x38\x16\x7f\xeb\x1d\xa7\x17\xaf\xf5\x9e\xd3\x8b"
- "\x63\x3b\x6e\x8c\x63\xb1\x82\xbd\xfe\x16\xfb\x72\x63\x1c\x8b\xc7"
- "\x70\x9c\x5e\xb2\x42\x3e\xa7\x53\xcb\xbc\xe3\xf4\xe2\x0a\xc2\xe9"
- "\xd4\x75\x84\xd3\x8b\x8f\x76\xce\x18\x47\xea\x60\xef\xc6\x38\x96"
- "\x8c\x51\x32\xc6\xe1\xca\xe9\xa5\x6a\xef\xc7\x39\xd2\xf6\x78\xc7"
- "\xe9\xb4\xc9\xde\x73\x3a\x4d\xdf\x71\xe3\x1c\x69\x3d\xe5\x73\xfa"
- "\xf5\x1a\x6e\x9c\x23\xad\x2f\xc7\xe9\xa5\x31\xf2\x39\xfd\x7a\x81"
- "\x77\x9c\x4e\xdb\x49\x38\xfd\xfa\x14\xc2\xe9\xb4\xad\x9d\x33\xce"
- "\xf1\xba\xbf\x77\xe3\x1c\x4b\xfb\x2a\x19\xe7\x70\xe5\xf4\xf2\x5a"
- "\xef\xc7\x3a\x96\xa7\x7b\xc7\xe9\xe5\x83\xbc\xe7\xf4\xb2\x96\x8e"
- "\x1b\xeb\x58\x76\x46\x3e\xa7\x97\xed\xe5\xc6\x3a\x96\x99\x39\x4e"
- "\xaf\xd0\xc9\xe7\xf4\xb2\x14\xef\x38\xbd\x7c\x31\xe1\xf4\xb2\x08"
- "\xc2\xe9\xe5\xc9\x9d\x33\xd6\xb1\xf4\x94\x77\x63\x1d\xcb\xcd\x4a"
- "\xc6\x3a\x5c\x39\x9d\x51\xea\xfd\x78\x47\x46\xac\x77\x9c\xce\xf0"
- "\xf1\x9e\xd3\xe9\x15\x1d\x37\xde\x91\xfe\x99\x7c\x4e\xa7\x67\x72"
- "\xe3\x1d\xe9\xbc\xef\xff\x33\x2c\xf2\x39\x9d\x1e\xe5\x1d\xa7\x33"
- "\xc6\x12\x4e\xa7\xfb\x12\x4e\x67\x44\x76\xce\x78\xc7\x8a\x12\xef"
- "\xc6\x3b\x32\xda\x5d\xff\x42\x6c\xbc\xc3\x95\xd3\xab\xb2\xbc\x1f"
- "\xf3\x58\xa5\xf7\x8e\xd3\x99\xdf\x7a\xcf\xe9\xcc\x9d\x1d\x37\xe6"
- "\x91\xb9\x5e\x3e\xa7\x33\x27\x72\x63\x1e\x99\xbc\xf9\x4f\xab\xca"
- "\xe5\x73\x3a\x33\xd4\x3b\x4e\xaf\xea\x47\x38\xbd\xb2\x86\x70\x7a"
- "\x95\xa6\x73\xc6\x3c\x56\xae\xf1\x6e\xcc\x63\xd5\x56\x25\x63\x1e"
- "\xae\x9c\x5e\x13\xef\xfd\xb8\xc7\x1b\x2d\xde\x71\xfa\x8d\x3d\xde"
- "\x73\xfa\x8d\xc5\x1d\x37\xee\xf1\xc6\x54\xf9\x9c\x7e\xc3\xc0\x8d"
- "\x7b\xbc\xc1\x5b\xff\x7e\x4d\x91\x7c\x4e\xaf\x6e\xf0\x8e\xd3\x6f"
- "\x5c\x21\x9c\x5e\xbd\x97\x70\xfa\x8d\xba\xce\x19\xf7\x58\x1d\xe7"
- "\xdd\xb8\xc7\x1a\x97\xf9\x6f\x8b\x12\xe7\x25\x68\xe7\xcf\x9c\xb9"
- "\x28\x31\x55\xbb\x28\x79\xf6\xab\x89\x23\xf5\x8e\xff\x8f\x8c\x48"
- "\xd3\xa7\xf5\x40\x09\x73\xa7\x4f\x5b\xf2\x28\x77\x32\x39\x71\x1e"
- "\xfc\xd3\x03\x25\x4d\x5f\x94\xa4\x4d\x5d\x9a\x92\xa8\xc5\xff\x9b"
- "\xfb\x6a\x0a\x24\x99\x9f\xca\x1d\x79\x3e\x31\x79\x7a\xda\xec\x79"
- "\xb3\xb4\xd3\x93\x67\xcf\x9a\x37\x37\x71\x5e\xaa\x76\x61\xe2\x82"
- "\xc5\xb3\x17\x26\xe2\xbf\x17\x69\x67\xce\x5f\x08\x07\x5e\x4d\x9c"
- "\xbd\x24\x51\x3b\x63\xf1\xcc\x99\x89\x0b\x17\xf5\x40\xe3\x17\x27"
- "\xa7\xce\x4e\x49\x4e\xd4\x46\x8d\x1f\x35\x68\xe2\xb3\xbf\x9d\xf8"
- "\xd4\x53\x3d\x10\x6f\xef\x69\x2d\x9d\x37\x5a\x0b\x1c\xf2\x3d\xaf"
- "\xca\x5d\x5b\x19\x8a\x50\x36\x70\x73\xe3\x42\xa4\xde\xb0\x10\xf9"
- "\xae\x6f\x44\xfe\xd9\x8d\x28\xc0\xbe\xf9\x42\xb1\x76\x0e\x8a\xa4"
- "\x83\x5e\x29\xd9\xd8\x88\x34\xf6\x4d\xef\x22\x7a\xd3\x16\xa3\x39"
- "\x68\x65\x09\x4e\x4b\x07\x65\xd4\xe1\xe3\x80\x85\x2f\xbd\x69\x5b"
- "\xca\x59\x55\x6e\x94\x39\x28\x33\x77\xe5\x05\x44\xd1\xbd\xd6\x96"
- "\x7f\x64\x37\x53\x47\xf0\x08\x11\xc4\x0a\xa9\xde\xac\x85\x5f\x35"
- "\x52\xbd\x95\x09\xbf\x5c\xf8\x9d\x42\xaa\x75\xbe\xf0\x0b\x80\x5f"
- "\x1a\xfc\x0e\xc2\xaf\x01\x7e\x16\xa4\x5a\x0f\xc7\xd6\x6b\xe1\x67"
- "\x80\x1f\x1c\x5f\x0f\x69\xd7\xc3\xb9\x0d\xbe\x24\x9f\x0d\x70\x7e"
- "\x43\x16\xfc\xf6\xc3\xaf\x1c\xa9\xde\x86\x3c\xdf\x2e\x42\xaa\xac"
- "\x70\xf8\xb7\x14\x7e\x47\xe1\x87\x8f\xd7\xc1\x31\x9c\x56\x4d\xce"
- "\x65\xd5\x20\x55\xb6\x06\x7e\x83\xe1\x17\x03\xbf\x35\xf0\xdb\x0a"
- "\xbf\x5d\xf0\xdb\x0b\x3f\x78\xbe\x6c\x9c\x06\xee\x95\x03\xe7\x72"
- "\xe0\x1e\x39\x25\x48\xb5\xd1\x1f\x7e\xc9\xf0\x33\x22\x28\x23\xfb"
- "\xf3\xe7\xfd\x8d\x7f\x23\x9c\xfe\xef\xfc\x9b\x12\xb8\xea\x5e\x93"
- "\xf1\x41\x2b\xd4\xdb\xb7\x46\xd1\xab\x91\x8a\xde\x94\x99\x9b\xf2"
- "\x20\xf2\xa9\x57\xbd\xd5\xb3\x6a\x0d\x82\xf6\x66\x8b\xd1\xb8\xac"
- "\x15\x9f\xef\x89\x63\xd6\x9c\xf3\x56\x80\x09\x25\x9b\x71\xfd\x94"
- "\xc7\xcf\xb7\x02\xd8\xeb\xc7\x99\x7c\xee\x2c\xc1\xd7\xd3\x9b\xc3"
- "\xea\xe8\x95\x71\xef\xe3\xef\x70\xcf\x43\x0c\xf1\x77\xba\x74\x6e"
- "\x58\x3c\xad\xee\xd7\x84\xdb\x18\xe3\x32\xfc\x5c\x6f\x9e\x23\xf5"
- "\x11\xce\xc3\xb3\x99\x83\x2e\x14\x43\xfd\xf3\xc5\xff\xa7\x01\x73"
- "\xba\x28\xd6\x9f\xb4\x3b\x6f\x31\xfe\xa5\x35\xe4\xf1\x78\x7c\xae"
- "\x65\xf7\x5d\xd0\x4e\x84\xe4\x1a\xe7\xb5\xa2\x5a\xd5\x9b\x67\xa0"
- "\x6c\x14\xb4\x81\x14\x7d\xff\x5d\xc8\xbe\xe5\xf1\xf8\x03\xc0\x03"
- "\x9c\xee\xcf\x19\x75\xf8\x5f\x13\x3e\x4f\xe7\x3d\x61\xc0\xe3\x40"
- "\xc6\x8c\x0f\xa0\x5d\x7e\xf3\x5c\x6b\x48\x8c\x59\xfb\x7c\x20\x7d"
- "\x96\x3c\x1b\xa4\x7b\x2b\xcd\xf1\x2c\xad\x41\x17\x4a\x70\xfe\xb4"
- "\x36\xb6\x04\xce\xf9\xda\x37\xad\x2c\x81\xe7\xf0\xb9\x04\xd7\xd1"
- "\xf0\x8c\xc6\xe7\xf1\x7d\xd7\x2d\x80\x67\xa5\x56\xc6\x42\xde\x1f"
- "\xc4\x96\x7c\xbc\xcc\x42\xe1\x73\xf6\xdc\x0b\xc5\xc0\xf7\x00\x3a"
- "\x67\xcd\xde\xf7\x82\x91\xef\x8e\xcd\x08\x6d\xdf\x8c\xfc\x9b\x73"
- "\xd6\x25\x99\x7c\xbb\xa7\x92\xb6\xef\xcd\x5a\x0a\xd2\x98\x54\xeb"
- "\xa2\x68\xe0\x2f\x73\x2f\xcd\x90\x22\x37\xf7\xfa\xec\xc6\xbd\xb6"
- "\x0c\x29\xc2\xf7\x22\x31\xba\x50\x4c\xfe\x25\x79\xd8\x77\xdd\x55"
- "\x82\xe3\x87\x63\xe7\xc8\xc3\xbe\xc9\x91\xc7\x5b\xdf\xe2\xeb\xe1"
- "\x9e\xc5\xf4\x87\x77\x95\xd8\xb7\x8c\x28\x81\x32\xaf\xc1\xe7\x03"
- "\x57\xa1\x26\x1a\xfe\xc5\xf7\x27\x58\x40\xec\xa9\x4c\x84\xf3\xa7"
- "\xd9\x63\x34\x1c\x83\x6b\xcd\xf6\xd5\x5a\x84\xfb\xa6\x06\xd5\x7a"
- "\x66\x6c\x82\x56\xeb\x8a\x09\xc6\xeb\xc7\x2e\xad\xa6\xed\xf0\xb3"
- "\x3d\x5c\x8d\x7c\x8c\xcf\x63\x7c\xd7\x27\x69\x27\x74\x83\x18\xaf"
- "\x9f\x7d\x23\xb6\xf7\xc5\xe2\xf8\xa8\x77\x04\x43\x7d\x7f\xd3\x0f"
- "\xf0\xd6\x22\x8c\x0f\x8e\x15\xc4\x09\xc1\x71\x7f\xcc\xd3\xe6\x9c"
- "\xf5\x5b\x9d\xe2\xa5\xfe\x75\xec\x4a\x9a\x97\xf7\x74\x9a\xc1\x0d"
- "\x3f\x1b\x93\xbe\xcc\xe4\xe3\x67\xc2\xe9\xb5\x03\x18\xce\x9d\xb3"
- "\xb3\xe7\x31\xb7\x70\xfc\xe8\x90\xd1\x5a\xfc\xff\x49\x03\x91\x3a"
- "\xb0\x1a\x51\xda\x0c\x5d\x29\xe1\xc2\x13\x06\x07\x4f\x98\x32\x6e"
- "\x79\x20\xcd\xb6\x1a\xfa\xda\x1b\xfc\xdb\x10\x65\xdb\xa4\x2b\x82"
- "\x74\xa6\x96\xfc\xc1\x45\x74\xae\xae\x08\x7f\x7f\x7e\x56\xb5\x61"
- "\x24\x13\x83\xd5\xfe\x88\x3c\x87\x6e\x57\x46\x32\x6d\xce\xb8\x02"
- "\xf7\xea\xfd\x84\xe9\xcf\x4b\xcc\x80\xd7\xe0\x22\xcc\x87\x03\xd7"
- "\x2d\x14\x5e\x13\x90\xee\xb5\xa6\x72\x3b\x94\xb5\x10\x38\x01\x65"
- "\x45\x38\xdf\xe6\x9c\x0d\x6b\xb8\xb2\x6e\x30\x60\x6e\xc0\x3d\x4a"
- "\xc9\xbd\x21\xdf\xd5\x70\x8f\x4d\xba\x52\x48\xb7\xd7\xe4\xf3\x89"
- "\xd6\x11\x13\xe6\xde\x5c\x3a\xb6\x2e\x6d\x28\x32\x07\xe9\x4a\xdb"
- "\x96\xd0\xd5\x1b\xbf\x87\xfc\x57\x23\xba\xf5\x3a\x5d\xbe\x22\x86"
- "\xb6\xe4\xbc\x80\xe7\x39\x9e\x42\x2b\xa7\xa3\xbe\x77\xae\xa2\xcd"
- "\xd1\x36\x14\x78\xe7\xa9\x40\xba\x22\xe6\x14\xb3\x37\xc2\x8a\x6a"
- "\xba\xae\x32\xe5\x20\x5a\x71\x0e\x05\xa4\xcf\x46\x9a\x95\x31\x50"
- "\x96\x72\xda\x52\x95\x76\x0a\x55\x36\xc1\x2f\xa5\x02\xd2\x7d\x0b"
- "\xbf\x83\x68\xe5\x52\xe4\x3b\x01\xfa\xbd\x8c\x6b\x28\xa0\x32\xe5"
- "\x1a\x1c\xbb\x88\x56\xc4\xd3\xd6\x8a\x72\x9c\xee\x18\x8a\xb6\x9a"
- "\x03\xd3\x2f\x02\xa6\x2f\xe0\x6f\xba\x4f\xa3\x1d\xf0\x2c\xad\x41"
- "\x5b\xcc\x2d\x9b\xb6\xa5\x5d\x5d\x42\x5b\x9b\x73\xde\x4e\x33\xa1"
- "\xc7\x33\x05\x65\xc1\xcf\xdc\x8a\x10\xe0\xe6\x83\xd3\xd8\xf3\x1f"
- "\xcb\x9c\x66\xc5\xed\xcb\xdb\xc9\xa0\x3b\x90\xe3\x3c\x3e\x67\x0e"
- "\x79\x2c\x13\x8e\x6f\x8d\xb6\xd2\xcd\x38\x3e\xb8\xdc\x10\xa3\xfd"
- "\x6c\xf9\xf7\xab\x52\x90\x2f\xdc\xe3\x94\xc9\xe7\xff\xac\xf8\x1e"
- "\x90\xe7\x1d\xc0\xf7\x14\xcc\x0d\xf6\x9c\xc5\xe4\xf3\x69\x14\xc7"
- "\x97\x75\xfb\x81\x23\x77\x38\x9e\xa5\x39\x27\x2b\x14\xae\x1d\xc7"
- "\xe3\x13\xe6\xc7\x8d\xf3\x6c\x7f\x86\xdb\xa6\x34\x3b\x6e\x5b\xd5"
- "\xfd\xca\x6c\x21\x4f\x44\xd0\x41\xf5\x91\xf4\xd5\xd0\x00\x9a\xa2"
- "\x2d\x13\xac\xb4\xc5\x9e\x7f\x7f\x26\xf4\x59\x01\x55\xd6\x26\x44"
- "\xd2\x67\x1d\xa2\x37\xd5\x8f\x21\x73\x48\xb3\x76\xe3\x3c\x41\xdb"
- "\x54\xe7\x34\x22\x75\x74\x35\x6d\xc1\xf5\xd7\xbe\xa9\xd1\x98\xb3"
- "\x10\x69\xe8\xfc\x27\xb4\xf6\x90\xa1\x11\x2d\x3b\x63\x11\x6e\x63"
- "\x31\x7f\xe9\x5c\xb8\x96\xcd\x07\xee\xeb\x67\x52\x65\xad\xb0\xc3"
- "\xf5\x74\xde\xfd\x99\x2c\x0f\x98\xf6\x90\xb4\xa3\x59\x2b\x68\x3d"
- "\x9c\xcb\xed\x57\x0e\xe7\xfc\xce\xaa\xb2\xfd\xe1\x38\xa2\x73\xfb"
- "\xfb\x1a\x33\x1a\x21\x6d\x76\x4f\xc2\xa1\x7e\x65\x82\xff\x53\x38"
- "\x9e\xeb\x99\xfa\x4f\x74\x68\xf6\x20\xae\xde\x31\xe5\x65\xea\x55"
- "\x6b\xc8\xfd\x50\xef\xb2\x23\x4d\x3e\x81\xfe\x6c\x8c\x7d\x9a\x98"
- "\x36\x09\xda\x95\x9d\xb1\xfe\x5f\xc5\x20\xf4\x15\x38\x17\x48\x93"
- "\x60\xf2\x09\xea\xcb\xc5\x32\x3b\x1d\xa7\x65\x9e\x13\xea\xa6\x7d"
- "\x35\xdb\x07\xc0\x35\x50\x6f\xaa\x71\x9b\x43\xda\xb6\xec\x34\xdc"
- "\xee\x40\xbd\x1b\xc6\xb6\xfb\xeb\xe0\xb9\xd4\x74\xf0\x8b\x26\x78"
- "\xae\xcc\xb3\xec\xb3\xf0\x9f\xcd\xd1\xce\xd0\x9b\xe2\xe2\x49\x5a"
- "\x9d\x11\xee\x5f\x0b\xf7\x6f\xe2\x73\x8d\x94\x2b\x67\xf2\xc3\xe5"
- "\xf0\x37\xe8\x12\x47\x5e\x50\x57\xfd\xa1\x8e\x9e\xc7\x9c\xc2\xf5"
- "\x73\xdb\x66\xac\x35\xe2\x92\x5a\x36\xc5\xa5\x34\xe7\xe4\x84\x3b"
- "\xea\xa9\x7d\x09\x5d\x03\xb8\x22\xfb\x75\xfa\xe4\x46\xc0\x32\xda"
- "\xa6\xa2\xa7\xd9\xc2\x11\xe8\x56\xeb\x0e\x38\xbe\x63\x09\xd6\x7d"
- "\x6f\x27\x41\x5d\xf6\x17\x4f\xeb\x8b\x70\x3a\x26\x3d\x9b\xb6\x35"
- "\x28\x2e\x89\x79\x66\x4a\x65\x87\xe7\xf3\x71\x3c\x53\x6b\x90\x6e"
- "\x2f\xdc\xbb\xd8\xe4\x83\x22\x04\xf5\x65\x73\xdf\x3a\x9a\x8e\xc3"
- "\xbc\x52\x41\x59\x2a\xe0\xdf\x6e\x2c\x8f\xef\xfc\x0a\x74\x6d\xd4"
- "\x78\xa8\x2b\x80\xf7\x7b\xbd\x69\x33\x5c\x5f\x67\x42\xaf\x4c\xc4"
- "\xd7\x6f\x80\xff\xe3\xe3\x38\x4d\x73\xce\x46\x64\x42\xd3\xa2\x48"
- "\xbe\xeb\x35\x18\x3f\x61\xbe\x1b\xf5\x24\x5f\xe6\x59\xee\xc4\x79"
- "\xe2\xeb\x70\x9e\x85\x5b\xe8\x06\x9c\x0f\xe4\x11\xe5\xc8\x3b\x1b"
- "\x8e\x39\xf2\x8f\x9a\x7b\xe3\x1e\x09\x70\xbe\x9c\xff\xec\xdb\xb6"
- "\xd0\x4d\xe4\xb9\x36\x66\x9a\xd0\xac\x50\x7c\x6e\x3d\x1c\xc3\xd7"
- "\x12\x8e\x6c\x2c\xc4\xfc\x31\x91\xf2\xa8\x08\x8f\x36\xee\x35\xa1"
- "\xc4\x22\x7e\x1b\x0f\x38\xf5\x74\xf4\x01\x6c\x7e\xd5\x8e\xfc\xb8"
- "\xbc\x48\x1e\x74\xee\xe4\x18\xb6\x8e\xe0\xba\x1c\x80\xf3\x6f\xce"
- "\xc9\x85\xf2\xc7\xd7\xb1\xe5\x47\x4d\x84\xf3\x10\x7b\xe6\x1a\xc2"
- "\x87\x9c\x35\x4d\x8e\xbe\x1c\xb0\x28\x86\x6b\x06\x3b\xf5\x4d\xfe"
- "\xa4\xdf\x78\x22\x06\xf3\x86\x6d\x17\x7a\xe2\x67\x72\x94\x17\xf2"
- "\xf1\xa5\x73\xd6\xde\x81\xb9\x8e\xf3\xb1\xe7\x0f\x56\x43\x3e\x2b"
- "\x9c\xf2\xf1\xc5\xe9\xec\x39\x6b\x9f\xc0\x7d\xe1\x3b\xbd\xe9\x3a"
- "\x48\x53\xe4\x48\x83\xcf\x43\x5c\x9f\x84\x63\xfb\x4d\xe8\x35\x1d"
- "\x3e\x96\x03\x69\x4c\xaa\xb5\x92\xdf\xc7\x64\xdc\x87\xa8\xaa\x02"
- "\x13\xf6\x8e\xb8\x5e\x8f\xa8\xea\xdb\x84\xaa\x0a\xec\xc8\xfe\xa1"
- "\x26\x22\x32\x83\x36\x9e\x57\x6d\x7a\xa4\xd2\x52\x87\xe4\xe9\xbd"
- "\x5c\xe6\xfb\x37\xba\x15\x3c\xce\x8a\x47\x11\xee\xff\x2f\xa9\x36"
- "\x4f\xaf\x32\x37\x32\x6d\x1c\xfc\x3d\x1e\x9f\x7f\x07\x3c\x11\xf6"
- "\x45\xe0\x7d\x93\x72\x29\xe2\x8d\xec\x90\x76\x3b\x3e\x8e\x7d\x13"
- "\x78\xb6\x1d\xbc\x73\xf4\x87\xc1\x25\x24\x76\x9b\xfb\x30\x7d\x1e"
- "\x7e\x5e\xeb\x73\x46\xfc\xcc\xf6\x5d\xc1\x25\xb8\x0c\x2b\xd3\x68"
- "\x7b\x95\xb5\xd9\x58\xd9\x64\x43\xda\x25\xd8\xd3\x6d\xba\x16\x5d"
- "\x88\x68\x68\x03\x65\x7a\xaa\x4d\x46\x7c\x4f\xf0\xbd\x97\xcc\xfa"
- "\xe0\x92\x95\x36\x44\x6d\xcc\xf0\xf3\x7f\xa6\x80\x36\x5e\xbd\x5f"
- "\x13\xd1\x9c\xb3\x39\xf4\x08\xb4\x26\xf2\xb5\xf0\xe6\x50\x47\xd9"
- "\xb7\xb3\x65\x87\x7b\x31\xed\xd2\xc3\x5b\x33\x99\xf2\x42\x9a\x18"
- "\x29\xbc\xe8\xd5\x81\xf4\x57\x05\x56\xb4\xa8\x80\x6e\x5d\x54\x88"
- "\x28\xdb\x16\x03\xfa\x78\x7b\x0d\x6e\xcf\x23\x1d\xf1\x64\x62\x07"
- "\x7e\x3f\x25\x03\xa9\xeb\x55\x9b\x5b\xa2\x57\x64\x32\x7b\x24\x1d"
- "\x86\x74\x32\x9f\x95\x19\xff\xab\x04\x1f\x1d\x6d\x5d\x49\x93\x3e"
- "\xe9\x9d\xfb\x26\xb0\xf9\xe1\x73\x0e\xfc\xb6\xb3\xfe\x56\xfe\x3d"
- "\xde\x91\xfc\xfe\xdf\x4d\x59\xd5\xe2\x65\x7d\xe7\x9c\xf2\xb2\xbe"
- "\x53\xe2\x5a\xd6\xbc\x9e\x1d\x5b\xd6\x3c\x8d\x82\xb2\x6a\xc5\xcb"
- "\x9a\x77\x42\x79\x59\xf3\x0a\x44\xca\xda\xd2\xb1\x65\xcd\x47\x0a"
- "\xca\x1a\x21\x5e\xd6\xfc\x43\xca\xcb\x9a\xbf\xce\xb5\xac\xf9\xe7"
- "\x3a\xb8\xac\x92\xfb\x9f\xd2\x54\x20\x8d\xdb\x27\x68\x97\x5a\x33"
- "\x5a\x40\xcb\x6d\x19\x69\x4c\xdf\x89\xa8\xf2\x26\x0b\xaa\xec\x5b"
- "\x83\x75\x32\xf5\x50\x0a\xb4\x7b\xab\xd1\x08\x7a\xf3\x05\x63\x65"
- "\x41\x03\x1c\x3f\x8f\x2a\xd2\x2c\x28\x72\x21\x6e\x7f\xb7\x7c\x52"
- "\x95\x20\xb7\xfd\xdd\xb2\xe2\x46\xfb\x6b\x7d\x94\x6d\x73\xdf\x3d"
- "\x5d\xd9\xd0\x8a\x70\xf9\xe1\xef\xe3\x37\xda\xdf\xd5\x24\xde\xce"
- "\xed\x2f\x8e\x47\x95\xc5\x22\x68\x7f\xc9\x77\x52\xef\xe6\x3b\xb7"
- "\xbd\x39\xf5\x08\x89\xb7\xbd\xef\x2e\xc0\x6d\xef\x76\x38\x2f\xef"
- "\xf9\xdf\x1d\xe1\x68\x7b\x73\xe1\x9e\xfc\xb6\xf7\xab\x04\xdc\x27"
- "\xbf\x9b\xa7\xac\xed\x7d\x37\xcf\x51\xee\x42\xb6\xdc\x10\x2b\x8b"
- "\xb0\xed\x7d\x57\x72\xaf\x4b\x3e\x6f\xe9\x2d\x03\x4c\x1f\xf7\xb7"
- "\xf8\xd9\x77\x69\xcc\xb8\x7f\x6b\x86\x98\x7c\xbe\xdd\xe2\x7b\x5e"
- "\xb5\x75\x1c\x33\x9e\xd9\x9c\xe0\x43\xef\xba\x6b\x6b\x74\x2a\xfd"
- "\x03\xad\xd7\x98\xf1\x58\x25\xf6\xdc\x70\x7e\x15\xbd\xfb\xae\xad"
- "\xf2\x9e\x9b\xe4\x09\xfd\x5f\x44\x06\xd4\x97\x8f\x97\x58\x28\xfb"
- "\xf2\xb8\x40\xc0\x41\x4d\xe7\x3f\xa0\xa5\xdf\xd4\x24\x5f\xcd\x1f"
- "\x91\x7b\xcc\x70\x0e\xe1\xb4\xf4\x2a\xdf\x11\xca\x9f\x7f\x5b\x80"
- "\xfb\xe7\xdf\x36\x4a\xfe\xf3\x93\x3c\x3d\x7b\xfe\x6d\x01\x1e\x3d"
- "\x7f\x6f\x78\xfe\xd6\x61\x7e\xe0\xff\xa8\xc3\xad\xc3\x7c\x65\x3e"
- "\x8f\xe4\xfe\x77\x1d\x77\x8f\xf7\x3c\x6e\xff\xe8\xde\x83\xb5\x1f"
- "\x6f\x37\x53\xd0\x06\x30\x7d\x38\xae\x7b\xa4\xfd\xab\x83\x36\xeb"
- "\x07\x9a\xb4\x49\x66\x99\x6d\xd2\x7b\x99\x9e\xdf\xdf\x90\xd9\xf1"
- "\xf7\x7f\x5f\xba\xfc\xce\x6d\xe2\x47\xbd\xd5\x92\x6d\xe2\x96\x07"
- "\x32\x5d\xdb\xc4\xf7\x8f\xc9\x6f\x13\xdf\xcf\x75\x6d\x13\x0b\xae"
- "\x70\x6d\x62\xc1\x69\xe5\x6d\x62\xc1\x1e\xcf\xdb\xc4\x82\xb5\xca"
- "\xda\xc4\x82\x18\xf7\x6d\x62\x41\xb1\xb2\x36\xb1\xa0\xd8\xb5\x4d"
- "\x2c\x08\x10\xb6\x89\x60\x10\xa4\xb0\xcc\x0d\x28\x81\x3e\x3a\xa0"
- "\x5e\x55\x58\x62\x5d\x0d\xbe\x25\x77\x4d\x71\xb4\x8d\x6e\xa6\x37"
- "\x05\x94\xd8\xa9\xc1\xb8\x5d\x89\x6c\x6e\x4e\xf2\xb7\xbf\x6e\x08"
- "\xa0\x83\xfb\x2d\xa1\xdb\x42\x11\xc4\x49\x07\xcf\x1f\x48\x37\x1b"
- "\x7a\xd1\xaf\x1b\x82\x0b\xae\x23\x0d\xfc\x42\x0b\xd8\xfe\x18\xfe"
- "\x8e\xa0\x5f\x0f\xed\x91\xb3\x04\x85\x07\x36\x21\x7f\x78\x86\xb8"
- "\xc0\x55\x6a\x04\x6d\x90\x06\xff\x4d\xaf\x2e\x4a\xda\x71\x1d\xf9"
- "\x06\xa6\x01\x36\x41\x70\xbf\xb4\x40\x9a\x5e\x64\x40\x3b\x16\x82"
- "\x97\xa6\x50\xe8\x76\x8a\x2e\xb1\x36\x1b\x28\x9b\xe6\x89\x48\x82"
- "\xcf\xf6\x04\xba\x37\x78\xaf\xbc\x27\x02\xec\xbd\x1f\x6f\xb2\xad"
- "\x4c\x52\xd1\xcb\xe3\x54\xf8\x59\x6d\x79\x8f\x9b\xe9\x2d\xf0\x5b"
- "\x99\xd4\x0b\x6b\x68\xf0\xda\x11\x74\x73\x68\x0f\xf0\xe1\xe1\xdb"
- "\x97\x20\x5d\xe1\x75\x64\xa0\xaf\x1a\x28\xc0\x3f\x0e\xef\x35\x0a"
- "\x31\x8a\xb3\x53\x45\x49\x70\xce\x17\xb7\x89\x34\xbe\xbf\x15\xee"
- "\xdf\x06\xf7\x6f\xc5\xdc\x46\xa1\x3b\xe0\xfe\xb6\xd7\x0d\x32\xeb"
- "\xcb\x76\x66\xfe\xaf\xe3\xb9\xec\xe1\xfd\xd5\xf4\x47\xf0\xc3\xcf"
- "\x05\x31\xdc\x81\x63\xf2\x50\x7f\x0d\x7e\xb6\xec\xeb\x28\x1c\x9e"
- "\x53\x07\xcf\x60\x80\xfb\xe2\x75\x5a\xe2\x5e\x59\xa0\xc6\x1c\x15"
- "\x3c\x9b\x6d\x13\xfb\x6c\x97\xe1\xd9\x2e\x71\xcf\x86\xef\x85\xe3"
- "\x23\xf5\x0e\x34\x3a\xbd\x3f\xae\x9b\xff\x0b\x4c\xeb\x36\x06\xbf"
- "\x0f\xbd\xba\x3c\x49\x26\x57\xb7\x4b\xae\x7f\xb2\xf1\x23\xd4\x97"
- "\x56\x67\xd4\x4c\x58\xfb\x03\x1d\x0d\xa9\xd6\x7e\x84\xc2\xab\xa0"
- "\x5e\x57\x5a\x2e\x22\x3a\x28\xa3\xe6\x98\xa1\x41\xe6\xbd\x76\x24"
- "\x49\xdd\x6b\xc3\x6a\xba\xda\xae\x79\x22\x82\xd6\x8c\x58\xb7\x71"
- "\x35\x9d\xd6\xa6\x0b\xae\x6e\xd5\xdd\x55\x34\xcd\xaa\x06\x5e\xd3"
- "\x69\xda\x85\x48\x7b\x5e\xb5\x7b\xdf\xd7\x27\xc1\x97\xbe\x84\xfc"
- "\xcf\xaa\x76\xd7\xae\xfc\x0e\xbf\x2b\xda\x61\x11\xbe\x2b\x2a\xea"
- "\x8b\x54\x3b\xb3\x90\xea\x83\x02\xa4\xfa\x9d\x11\x41\x3a\xe1\x6f"
- "\xd7\x29\x92\xd7\xce\xd9\xd1\x7b\xfa\xa3\x0c\x2b\xfd\x3f\x3a\xb7"
- "\xde\x92\x43\xd1\x96\xe8\x81\x3e\x26\xe3\x12\xfc\x0e\x65\xe7\x74"
- "\x88\xe9\x8f\xd0\xd7\x06\xc2\xdf\x83\x00\x53\x94\xb2\x10\xdd\x55"
- "\xaf\xda\x19\x8e\xeb\x4d\x60\x53\xb7\x31\xb6\x95\x71\xc8\xaa\x8d"
- "\x45\x6d\x79\x4f\x68\x6d\x79\xf7\x67\xda\xd5\x6b\x8a\x57\x5e\x40"
- "\x7d\xf1\xbb\x4f\xa8\x1b\x71\xd3\x6c\xfe\xb8\x3e\xc6\x19\x67\x7c"
- "\x8d\xce\xa7\x22\x6a\xe5\x35\xd4\x13\xb8\x79\xa3\x5e\x8d\x6f\x08"
- "\xb4\xa4\x37\xd0\x76\x5c\xb7\xf0\x98\x2a\x9c\xeb\x95\x71\x0d\xfc"
- "\xbd\xb9\x0e\x15\x2c\x44\x1a\xdb\xa2\xa4\x60\xf3\xd5\xa4\xbb\xde"
- "\xb7\x23\x4d\xaf\x26\xa4\x2e\x68\x04\x4e\x2d\x02\x3e\x35\x42\x3d"
- "\x33\x93\x7a\x86\xbf\xb5\xdf\x8e\xeb\xd8\x86\xbf\x35\xec\x68\x24"
- "\x75\x8c\xe1\x11\xae\x63\xf3\x81\x47\xf3\x70\xff\x01\x3c\x5a\x0d"
- "\x75\x0c\xea\x05\x9d\xb3\xfd\x54\xc1\x6a\x1a\xa5\xcf\x46\xd4\x8e"
- "\xfa\x6e\xf8\x9c\x8f\xdf\x40\x4a\xfb\x75\x8c\x05\x71\x63\x1d\xbb"
- "\xcf\xb5\xea\xef\x2a\xd2\x3e\x4f\x5f\x3e\xab\xda\x09\xf5\x17\xf9"
- "\x6b\x5f\x78\x40\x0d\xf1\x66\xc7\xa4\x77\xd7\xe2\x31\x4e\x13\xc4"
- "\x02\xc7\x45\xfb\x3c\x7a\xe0\xac\xaa\x68\x10\x8e\xe3\xeb\xc5\x48"
- "\x95\xf2\x24\x5d\x0b\x31\x1b\x4c\xc6\x71\x8b\xc2\x99\x77\xa8\xab"
- "\xb4\xe8\xef\xcc\xbb\x2b\x72\x8d\x0d\xe2\x66\x55\xd7\x8f\x01\xbc"
- "\x63\x8c\x73\x5a\x99\x76\x08\xc7\xf1\x7c\x32\xa2\xa6\x35\x40\xac"
- "\x6c\x10\xab\x66\x43\x00\xb4\x47\x31\xb8\x3d\xa2\x73\xfb\xa5\xac"
- "\x30\xd1\xf6\xe8\x04\x15\x9d\xb1\x00\xf9\x57\xa5\xd9\xd0\x2b\x29"
- "\x88\x4e\xbf\x08\xf1\x6a\xaa\x41\xd0\x2e\xf5\x82\x36\x2b\xb8\x70"
- "\x09\xd2\xe0\x78\xf5\x6c\x00\xad\xb2\x39\xb3\xe8\xa3\x8c\x32\x3f"
- "\x1b\xf0\x17\xb7\x4f\x81\xab\x7c\xba\x43\x3d\xeb\x95\x85\xeb\x23"
- "\xd4\xcf\xc0\x55\x4c\x7b\x19\x57\x00\xf5\xd0\xfa\xba\x61\x40\xdb"
- "\xeb\x06\x2d\xfc\xfa\x3b\xda\x30\x47\xfb\x41\xe7\xec\x88\xc2\xed"
- "\x57\x55\x9a\x09\x59\x21\xb6\xbd\x70\x5f\xf7\xba\xa1\x2f\x13\xe3"
- "\x59\x06\xf4\xb0\x05\xf9\xc0\x33\xa9\xe1\x79\xd1\x8e\x99\xc8\xbf"
- "\x22\xe9\x2c\xb2\x41\xdd\x70\xc4\x7d\xfc\x6c\x2d\x82\x7c\xa9\x63"
- "\x86\x6f\x11\x1b\x33\x1f\x69\xde\xfd\xee\x00\xc7\xbb\xdf\x31\xdf"
- "\xc5\x12\xde\xfd\xae\xf4\xe7\xc8\xbb\xbf\xc7\x31\xbc\x53\xb5\xe9"
- "\x19\x3e\x0d\xae\xb2\x7e\x0a\x31\xfa\xdd\x2e\xcc\x11\xcc\x99\xe3"
- "\x7f\xc0\x9c\xd9\x55\xde\x55\x39\xd3\xd2\x6c\xd0\xc2\xef\xa6\x70"
- "\x06\xf2\x65\x38\x83\x63\xf5\xf7\xb8\x56\xe4\x88\x11\x53\x57\x73"
- "\x33\x6a\xb4\x2b\xd1\x53\x50\x57\x6b\x03\x57\xf5\x47\x15\x4c\x9c"
- "\x76\xd7\x6a\x5f\xa0\xed\x50\x4f\xfd\x56\x9e\x40\xea\xd6\xd5\x34"
- "\x5d\x65\xdd\x87\xec\x9a\xa1\x11\xcc\xfb\xc0\xdc\x46\x23\x78\xd6"
- "\x62\x1a\xbf\x87\x5f\x0d\x98\xa5\xe0\xb1\xf0\x95\x25\xb6\xfc\xd1"
- "\x5a\xfb\xa6\x8c\x3a\x3a\x68\x5b\x8a\x0d\xea\xb5\x7d\xd3\x2b\x25"
- "\xf6\xa0\x2d\xc6\xe6\x9c\xdd\xe3\x4c\xe8\x10\x33\xce\x0b\x7d\x71"
- "\x04\xb4\x0d\xb8\xfd\x65\xe6\x7b\xe2\xf7\xf4\x70\x3e\xd9\xf1\x7e"
- "\x19\xb7\x09\xec\xbb\x07\xf6\xdd\xc4\x6e\x8c\x61\x0f\xfc\x6e\x82"
- "\x6d\x53\xa6\x3a\xde\x4d\x38\xfe\x8f\xcf\xc3\x75\xf1\x78\x5c\x95"
- "\x77\xdd\x29\x92\xce\x71\xdd\x8e\x33\xb8\xad\xe7\xae\x23\xff\x87"
- "\x7e\xe4\x54\x1b\x85\xfc\x45\x35\x8e\x66\xb4\x16\xea\x0f\x78\xa3"
- "\xdf\x4f\x85\x7f\xa9\xf3\xaa\x0f\xd3\xe1\x5f\x15\xfc\xcb\x8c\x63"
- "\xca\xeb\xaf\x3e\x0c\x25\xef\x87\x46\xec\x27\xf7\xff\xb0\x0f\x53"
- "\x27\x1f\x44\x3d\xeb\xd9\xbf\x9b\x73\x3e\x4c\x75\xbc\x27\xbf\x91"
- "\xfe\x06\x3e\x1f\xaa\xf1\xbd\x01\x23\x5f\xf2\xee\x9e\xfc\x1f\xcf"
- "\x8b\x61\xf3\x63\xfe\x6f\xd7\x85\xe4\x1a\x33\xce\xa2\x06\xd5\x87"
- "\xa6\x2a\xe8\xc3\xed\x5b\x46\xec\xdf\x78\x1d\xe1\xef\x58\x7c\x1c"
- "\xf7\x85\xba\xe8\x6f\x5c\xc6\xa4\x61\xf6\xd2\xb1\xe7\x3d\x96\x4b"
- "\x6f\xae\x37\x62\x2f\xd8\x4c\x27\x3d\xc9\xfe\x3b\x12\xd7\x27\x32"
- "\x6e\xf2\xfb\x41\x34\x60\x8b\xf7\x4a\xbf\x31\x57\x08\xef\x61\x9e"
- "\xe9\xdb\xf7\xc8\x0a\xd2\x57\x3a\x9e\x17\xef\x73\x8e\xe7\xe2\x3c"
- "\x90\x89\x32\x9b\x45\xf6\x39\xe7\xe6\xec\xfc\x3e\xd4\x9e\xff\x18"
- "\x60\xff\x7b\xd0\x99\x3b\x8a\xf9\x65\x16\xc3\x02\xd2\xaf\x91\x3a"
- "\x27\x0f\x87\xdf\x17\x49\xe5\xf3\xac\xc1\x46\xcb\xcc\x4b\x7a\xfc"
- "\x47\x17\x1c\x11\x5d\x6c\x33\xda\xdb\xe2\x02\x8f\xad\xb8\x28\x53"
- "\xdb\x14\x4b\xae\xff\x67\xcb\x1b\x1a\xd3\x76\x7f\x70\x04\x7e\x4f"
- "\x61\x9b\x1f\xf7\x5c\x65\xb1\x15\xed\x99\x57\x47\xe1\xf6\x70\x6f"
- "\x7d\x09\x15\x3d\x90\xd5\x70\xb5\x48\x8d\xc7\xbd\xb0\x96\xcb\xb9"
- "\x84\x74\xad\x2b\xe3\x02\x5b\xdb\xe2\xd0\xdb\x97\xd0\x08\xfb\xac"
- "\xd0\x1e\x59\x33\x91\x6f\x0b\xb4\x85\x2d\xff\x4b\x0a\xfc\xfb\xa9"
- "\x3a\x74\x18\xae\xad\x6c\x32\xa1\xed\x90\x96\xfe\x5f\x5c\xaf\xdf"
- "\xc4\xd3\x96\xf2\xf8\x4f\x51\xb4\xc1\x66\xcc\x38\x83\x7a\x42\x9b"
- "\xa8\xae\x4a\xdb\xcd\xbc\xcf\xf5\x5b\x4a\x69\xab\xac\xe7\x50\xf6"
- "\x4c\x68\x4b\xa1\xed\x5c\x39\x09\xfa\x0c\xe0\xc4\xfb\xfc\x3e\x63"
- "\xce\x7b\x5c\x9f\x71\x19\xfa\x8c\xcd\xd0\x67\xac\x0c\x45\x95\x29"
- "\x46\x04\x6d\x58\xb7\x09\x29\x81\x96\x8c\x14\xe8\x3b\x96\x42\xdf"
- "\x91\x76\x0e\x31\xfd\x46\x43\x1d\x82\x36\xbf\x57\xe1\x3c\xa4\x69"
- "\xbd\x0c\x7d\xc7\x65\xe8\x3b\x32\x48\xdf\xb1\xed\x12\xf4\x1d\xf3"
- "\xc1\x1b\xcc\x83\xbe\xa3\x41\xa4\xef\xb8\x24\xee\x0b\x1c\xed\x60"
- "\xcb\x65\x03\xb5\x0d\xfa\x8d\x65\xdf\x22\x6a\xdb\x0b\xdd\x64\x72"
- "\x66\x8f\xe4\xf7\xbf\xf4\x96\x11\xef\xd8\xe9\x38\x84\xe3\xbe\xcc"
- "\x02\xfd\x30\xe0\x52\x65\xb0\xa2\xc0\x93\xdd\xc6\xb4\xc0\xf1\xb6"
- "\xde\x61\xa8\xf8\x7b\x33\x45\xe7\x3d\xa0\x6d\x01\xdc\x96\x2d\x46"
- "\x54\x1b\x60\xb8\xf7\xf9\x5c\x0a\xfb\x44\x7b\x7e\x58\x14\xf1\xa4"
- "\x7f\xbc\x88\xc7\x44\x02\x4d\x04\x37\x2b\x1d\x17\x48\xbf\x1a\xd7"
- "\x33\x7b\x06\xf2\xb5\xfd\x37\xb4\x87\xfd\xd5\x50\xff\x8c\x6f\x91"
- "\xda\xfc\x6a\x12\xc4\xeb\x22\x3a\xfc\x4d\x2e\xb5\xe3\x25\xa4\xc5"
- "\xeb\x22\xd2\x6f\x7e\x59\xb6\xe3\x15\x34\x6c\xc7\x7f\xd0\xe0\xed"
- "\x2f\xa1\xf0\xc2\xef\xf1\xfa\xe9\x80\x61\x1d\x6d\xa9\x48\xfa\x33"
- "\x7e\xc7\x1e\x49\x6f\xb9\x1f\xd1\x21\x43\x63\xe0\xef\x61\xb9\x2f"
- "\x81\x7f\x80\xf3\xd1\x86\x16\x63\x55\x5a\x05\xca\x3a\x8b\x50\xc6"
- "\x05\x16\xe3\x1b\xf8\x9e\x46\x56\x0a\xda\x0f\xac\x09\xc6\x13\x7c"
- "\xf1\x7b\x2f\xec\x39\x6e\x60\x3c\xf3\x2f\x42\x5d\xc0\x62\x5c\xd1"
- "\x50\x8d\xa0\x0f\xec\x76\x43\x1f\x30\x18\x9f\x46\x0e\x6d\x00\xd8"
- "\xf4\x02\x2d\xa0\x69\xb9\xea\xa4\x0f\x16\x2a\xd4\x07\xac\xbf\xb1"
- "\x2e\x32\x50\x05\x14\x8d\x56\x56\x20\x6a\xab\x5d\x2e\xc6\x7f\x64"
- "\xf6\x3f\xc4\x63\x5f\x64\x8e\xcc\x1f\x16\x60\x2c\x4c\xaa\x3f\xa4"
- "\x4c\x32\xf8\x20\x85\xd8\x67\xb6\x83\xfd\x51\x82\xfd\xbe\x0b\x0a"
- "\xb1\xcf\xa4\xdf\x3c\xac\x55\x86\xfd\x35\x99\xd8\x33\xeb\x4b\xfe"
- "\x4c\xb1\xdf\xb7\x5f\x88\xfd\xde\xb9\x04\xfb\xbd\xc9\xca\xb1\xd7"
- "\xb5\x53\xef\x75\x6c\xbd\xff\xf8\x9c\x32\xec\x75\x50\xef\x0f\xa7"
- "\x29\xc3\xfe\xa2\x4c\xec\x99\x35\x2a\x7f\xa6\xd8\x7f\x5c\x22\xc4"
- "\xfe\xa3\xd9\x04\xfb\x8f\x92\xbc\xc0\xbe\x9d\x7a\xaf\x63\xeb\xfd"
- "\x27\x67\x14\x62\x8f\xeb\x7d\xb5\x32\xec\x4f\xcb\xc4\x9e\x59\xe7"
- "\xf2\x67\x8a\xfd\x27\x7b\x85\xd8\x97\x24\x12\xec\x4b\x12\x94\x63"
- "\xaf\x6f\xa7\xde\xeb\xd9\x7a\xff\x7f\xa7\x95\x61\xaf\x87\x7a\x6f"
- "\x34\x28\xc3\xfe\x90\x4c\xec\x99\xb5\x32\x7f\xa6\xd8\xff\x5f\xb1"
- "\x10\xfb\x4f\xa7\x13\xec\x3f\x8d\xf7\x02\xfb\x76\xea\xbd\x9e\xad"
- "\xf7\x9f\x7d\xa7\x10\x7b\xa8\xf7\xc6\x4c\x65\xd8\xa7\xcb\xc4\x9e"
- "\x59\x6f\xf3\x67\x8a\xfd\x67\xbb\x84\xd8\xef\x9f\x4a\xb0\xdf\x3f"
- "\xc5\x13\xec\x97\xf3\xb1\x3f\xd5\x6d\x0c\x78\x2b\x46\xe7\xef\x79"
- "\x89\xc5\xfe\x43\xc0\x1e\xca\xbf\xf7\x85\xad\x4e\x1a\xff\xf3\x0a"
- "\x06\xf7\x78\xc0\x3d\x0d\x70\x07\x6f\xe8\xc0\x1c\x30\xea\x89\x71"
- "\xc7\x98\x67\x9c\x46\xea\xc3\x70\x2d\xc6\x07\x63\x0c\x38\x6a\x19"
- "\x9c\xef\xf8\xb2\x8c\xf6\xf1\xd5\x60\x3c\xb1\xee\xc7\x98\xb7\xa7"
- "\xed\x31\x27\xda\xc5\x3c\xf6\xe6\xe8\xfb\x56\xe7\xf1\xbf\x8e\xc2"
- "\xfc\x04\x78\xb8\x0c\xb9\x98\x7f\xbe\x55\x88\xf9\x9f\x26\x61\x1c"
- "\x4c\xaa\x3f\x4d\x54\x8e\xb9\x2e\x53\x1a\x73\x47\x1f\x7f\xe0\x88"
- "\x77\x98\x1f\xae\xe6\x30\xd7\x65\xba\xc7\xfc\xb4\x02\xcc\x3b\xb6"
- "\x7f\xef\x5a\x98\x1f\xc8\x12\x62\x5e\x3a\x96\x60\x5e\x3a\x46\x0a"
- "\x73\x3b\xb4\xd7\x78\x4c\x1d\x7f\xff\x67\x6b\x8e\x7b\xae\x0d\x70"
- "\xc5\xdf\x01\xe2\xb1\xde\x7d\xf3\x4a\xa9\x36\xc0\x7d\xe3\x12\xa4"
- "\xcb\x5a\x82\x46\x04\xd6\x91\xf6\xbb\x15\xda\xef\xf5\xd7\x91\xaf"
- "\xfd\xb5\xd0\x1e\x59\xf5\xc8\xb7\x15\x62\xdc\xfa\x5a\x52\x60\x79"
- "\xbc\x19\x1d\xbe\x54\x4a\xe1\xb1\x5b\xfc\xde\x8e\xfe\x31\xae\xd7"
- "\xd8\x04\xda\x52\x5e\xbb\x99\x8c\xab\x9c\x73\x8c\xab\xec\x13\x8c"
- "\xab\xbc\x5d\xcf\x8e\xab\x4c\x26\x18\x15\xf0\xf1\x79\xe5\x03\x89"
- "\x71\x95\xb2\x76\xc7\x55\x98\xf1\x94\x4b\x48\xd3\x36\x3f\x29\x78"
- "\x1b\x3b\xae\xf2\xde\x3c\xef\xc6\x55\x5a\xe7\x1b\xa8\xf7\x00\x9f"
- "\xe5\x93\x01\x9f\xef\xe5\xe2\xf3\x45\xb8\xa7\xe3\x2a\x8e\x3e\xd6"
- "\xd1\xaf\xe2\x3a\x87\xfb\x56\x4b\x5e\x98\xaf\xf3\x58\x0a\xae\x6f"
- "\x97\x54\x87\x46\xe2\x36\x59\xd9\x78\x8a\xb1\xe6\x56\x1b\x4f\xc1"
- "\x75\xce\xd1\xcf\x76\x8d\x3e\xf6\x90\xbf\xb0\xee\x7d\x71\x84\xf4"
- "\xb1\x5f\x18\x3d\xd5\x57\x6e\x30\x5f\xe3\x3c\x86\x42\x30\x3f\xfc"
- "\x08\x1e\x73\x51\x36\x8e\x72\x24\xfc\x56\x1b\x47\xe9\x7a\x98\x7f"
- "\x69\x15\x62\x7e\xe8\x33\x82\xf9\xa1\xfd\xde\x63\xae\xf3\x75\x1e"
- "\x3b\x21\x98\x1f\xd1\xe3\xb1\x16\x65\xe3\x27\x47\x14\x6a\xe9\x9f"
- "\x6e\xfc\xa4\xeb\x61\x6e\x34\x0b\x31\x3f\xbc\x87\x60\x7e\xb8\xb8"
- "\x03\x30\x5f\xe3\x3c\x66\x42\x30\xff\xaa\x0f\xd6\x5e\xca\xc6\x4d"
- "\x8e\x9c\xbc\xd5\xc6\x4d\xba\x1e\xe6\x7f\xa9\x15\x62\x7e\xa4\x90"
- "\x60\x7e\xa4\xc0\x7b\xcc\xf5\xbe\xce\x63\x25\x04\xf3\x63\x3d\xf1"
- "\xd8\x8a\xb2\xf1\x92\xbf\xdc\x72\xe3\x25\x5d\x0f\xf3\xa3\x35\x42"
- "\xcc\xbf\xda\x44\x30\xff\x2a\xb7\x03\x30\x5f\xe3\x3c\x46\x42\x30"
- "\xff\x9b\x0f\x1e\x53\x51\x36\x4e\xf2\x97\x15\xb7\xda\x38\x49\xd7"
- "\xc3\xfc\xaf\xe5\x42\xcc\x8f\xad\x25\x98\x1f\x5b\xe3\xa9\x67\x76"
- "\x78\x65\x87\x3f\x66\xbc\xb2\x06\x34\xbb\xd3\xd8\x08\xc1\xbb\xec"
- "\x22\xa3\xd9\x15\x7b\x65\x63\xcd\xad\x32\x3e\xe2\xc0\x1a\xfb\xe5"
- "\xae\xe1\x95\xcb\x9c\xde\x7f\xfe\x6d\x31\xf1\xca\x7f\x4b\x95\xc2"
- "\x5a\x6c\x2e\x42\x25\x78\x4d\xc7\x5c\x84\xf5\x4b\x00\x47\xe0\x01"
- "\x9e\x8b\x80\xe7\x24\x88\xcd\x47\xc0\xf3\x10\x1c\x73\x12\xf8\xf3"
- "\x11\xc6\x98\x68\x0b\x9e\x93\x80\x7d\x72\x79\xfc\x06\xe4\x98\x9b"
- "\x80\xe7\x20\xac\x3c\x83\x7a\x62\x8c\xf0\xfc\x03\xec\x97\x6f\xf6"
- "\x1c\x84\xad\xf6\xae\x30\x07\xe1\xeb\xb8\xf6\xbc\xf2\xf8\x3d\xfd"
- "\x11\xf0\xed\xc6\x38\x55\xdb\x96\x30\x84\xeb\x1c\xc6\x28\xb0\x81"
- "\xd4\xc3\x7d\x2f\x94\x50\x55\x69\xa5\x68\xfd\x32\xa4\x76\x8c\x5f"
- "\xe0\x3a\x08\xed\x72\xa0\x15\xf0\xcc\x9a\x43\xc6\x31\xec\x3f\xc6"
- "\xf5\x34\xbf\x96\x84\xbf\xd5\x57\x1f\xfe\x67\x09\x85\xc7\x1e\x77"
- "\xcc\x44\x83\xdf\x3f\x8f\x86\x55\x36\x9d\x46\x4c\x9d\xca\x0f\x1b"
- "\x06\xd7\x6a\xdb\xf2\x87\xc6\xd8\x43\xc2\x74\xe6\x90\x30\x03\xc6"
- "\x2d\xab\x1e\x21\x5c\xbf\x30\x6e\x55\x69\x85\x37\xf0\x62\xb0\xa2"
- "\xd8\xb1\x0d\xc9\x3a\xf5\x8d\x62\xcc\x0a\x2e\x01\x66\xf3\x85\x98"
- "\x15\x2a\x1d\xdf\x70\xcc\xe7\x9e\x6f\xa0\x0a\xa1\x4e\x2d\x8b\x05"
- "\xcc\x9e\x97\x8b\x59\xb9\xe4\xfe\xef\x6e\x30\xcb\xf4\x10\xb3\xa3"
- "\xed\x63\x76\x58\x2b\x82\x59\x29\x5c\x5b\xc4\x62\xb6\x0b\x30\x2b"
- "\xe6\x30\xbb\xe6\x21\x66\xce\x1e\xf6\xe7\x84\x59\x85\x51\x3e\x66"
- "\x3a\x0f\xeb\x99\xce\x83\x7a\x76\x38\xcd\x15\x33\x1d\xd4\x33\x1d"
- "\x5b\xcf\x74\x50\xcf\x74\xbc\x7a\x76\xd1\x43\xcc\x9c\x3d\xe8\xcf"
- "\x09\xb3\x2a\xc9\xf5\xbf\xdd\x60\xe6\x61\x3d\xd3\x79\x52\xcf\xaa"
- "\x45\x30\x83\x7a\xa6\x63\xeb\x99\x0e\xea\x99\x8e\x57\xcf\x4e\x7b"
- "\x88\x99\xb3\x87\xfc\x39\x61\x76\x42\xfa\xfb\x6f\x49\xcc\xf4\x1e"
- "\xd6\x33\xbd\x07\xf5\xcc\x68\x70\xc5\x4c\x0f\xf5\x4c\xcf\xd6\x33"
- "\x3d\xd4\x33\x3d\xaf\x9e\x1d\xf2\x10\x33\x67\x0f\xf8\x73\xc2\xec"
- "\x1b\xc9\xfd\x1f\xdd\x60\xe6\x61\x3d\xd3\x7b\x50\xcf\x8c\x99\x22"
- "\x98\x41\x3d\xd3\xb3\xf5\x4c\x0f\xf5\x4c\xcf\xab\x67\xe9\x1e\x62"
- "\xe6\xec\xe1\x7e\x4e\x98\x9d\x94\xdc\xff\x5d\x0a\x33\x06\x2f\xd0"
- "\x8e\xa2\x98\xb5\x0a\x75\xa3\x15\x74\x3c\x7e\xe7\x25\x8a\xd7\x9b"
- "\x5f\x96\xd1\xab\x7c\x35\x18\x2b\xac\x07\x31\x5e\x55\x69\xc7\x44"
- "\x75\x23\x7e\x2f\x06\xb8\x23\xfc\x6e\x6c\xe5\x39\x19\x7a\x71\x86"
- "\x14\x56\xed\xbf\x0f\x2b\x98\xc7\x61\xe5\x78\x1f\xd6\xa1\x58\x7d"
- "\x23\x17\xab\x7f\x8e\x50\x86\x95\x2e\xb3\x7d\xac\x74\x47\xdd\x63"
- "\x75\xb8\x9a\xc3\xea\x34\x0f\x2b\xd7\x7e\xcc\x73\xac\x9c\xfa\xaf"
- "\x9f\x15\x56\xff\xaa\x93\xc2\xca\xaa\x19\x1a\x83\xbf\x79\x9f\x00"
- "\xde\x97\x7e\x35\xee\xb9\x9c\xb3\x48\xb7\xe1\x2c\x1a\x81\xbf\x6f"
- "\xde\xb7\xcc\x42\x41\x19\xff\xf7\xf5\xc9\x3a\xd4\xf6\x63\x68\x0f"
- "\xfc\xfd\x0c\xd3\x4e\xbe\x16\xea\x5f\x15\x6f\x66\xda\xc4\x6c\xc0"
- "\xa8\xb2\xa9\x14\x62\xd2\x6d\x4c\x65\xd3\xa7\xa8\x75\x51\x1c\xfa"
- "\xfb\xa9\x7a\xc0\x85\x6e\xab\x6a\x28\x45\x3b\xe0\xbc\x71\xc9\xa7"
- "\xc8\xfe\xa3\xa1\xc7\xb4\x34\x44\x5d\x52\xd5\xec\xc5\xde\xf9\xe1"
- "\x34\xa4\x1e\xd7\x40\x5b\x2a\x1b\xbe\x46\xef\xcf\x40\xba\x63\x69"
- "\x08\xe1\x58\x33\x5e\x79\x0e\xf6\xca\x87\x04\xf8\xbc\xc7\xf3\xca"
- "\xcc\xf7\xb2\x29\x80\xcd\x15\x27\x6c\xc0\x8b\x43\xac\xbb\x4d\x68"
- "\x02\x6c\x9a\x1c\xd8\x5c\x44\x19\x0b\x30\x36\x26\xce\x2b\xb3\xd8"
- "\x14\xe0\x36\x2f\x85\xe7\x95\x2f\xf1\xb0\x61\xbf\x55\x15\x60\xe3"
- "\x18\xcb\x78\xdd\x80\xdf\x91\xbb\x78\x65\x65\x63\x19\xdf\x49\x7e"
- "\x2b\xc2\xd4\x23\xa8\x23\x13\xa0\x1e\xad\x48\x65\xea\x11\x89\x7f"
- "\xef\x30\xe0\x7b\x09\x0a\x34\x75\x1b\xb3\x01\x30\x68\x85\xba\x86"
- "\xfb\xa2\x95\x50\x4e\x8c\x25\xc6\x6d\x42\x71\x5b\xdb\x2b\x4d\x88"
- "\x82\x36\x2b\x0a\x63\x67\xfb\x31\xd4\x3f\x07\xfa\xaa\xaa\x29\xdf"
- "\x03\x3e\x8d\xa8\xca\xcc\x62\xb3\xec\x7b\x74\x49\xf5\x7d\x24\xfd"
- "\x9a\xa1\xc7\x43\xc0\x53\xe8\x7b\xd4\xd3\xf0\xb7\x2f\xd0\xe6\xbd"
- "\x3f\x13\x0d\x1b\x97\x42\x5b\x98\xb9\x3c\x50\xc7\x70\x7f\x86\xdb"
- "\xc3\xca\x94\xbf\x20\x5b\x7e\x98\xae\x2d\x64\x68\xcc\x31\x50\xb3"
- "\xb8\x4d\xc4\x58\xf8\x2d\xe6\xb0\xc3\xdf\xed\xf1\xc7\x3a\x5c\xda"
- "\xc2\x39\x5f\x8b\xd7\xaf\x29\x26\x59\xe3\x1d\x05\x6c\xfd\x2a\x50"
- "\x3a\xde\xe1\x18\x8f\x02\x0c\xf1\xb7\x7a\x2b\xbf\x45\xd4\x7b\xb2"
- "\x31\xfc\xb7\xe4\xfe\x27\x6e\x30\xcc\x6c\x1f\xc3\x66\x07\x86\x47"
- "\xdb\xc7\xf0\x94\xaf\x08\x86\x45\x1c\x86\x87\xb5\x3c\x0c\x4b\x59"
- "\x0c\x77\xf1\x30\x2c\x6e\x1f\x43\x27\x2f\xfd\xb3\xc2\xf0\xb4\xfb"
- "\xf1\x0f\x51\x0c\x75\x1e\xd4\xc3\xcb\x2c\x86\x3a\x0f\xea\xe1\xe9"
- "\x32\x57\x0c\x75\xbc\x7a\x78\x38\x8d\xc3\x50\xc7\xd6\x43\x1d\xaf"
- "\x1e\xea\x3c\xa8\x87\x4e\xde\xfa\x67\x85\xe1\x7f\xaa\x15\x60\xe8"
- "\x41\x3d\xfc\xc1\x81\xa1\x07\xf5\xf0\x87\x2c\x11\x0c\xf9\xf5\xb0"
- "\x9a\x87\x21\x5b\x0f\x75\xbc\x7a\xa8\xf3\xa0\x1e\x3a\x69\x95\x9f"
- "\x15\x86\x26\xc9\xfd\xdf\xa5\x31\xd4\x7b\x50\x0f\x0f\xb3\x18\xea"
- "\x3d\xa8\x87\x67\x62\x5c\x31\xd4\xf3\xea\xa1\xd1\xc0\x61\xa8\x67"
- "\xeb\xa1\x9e\x57\x0f\xf5\x1e\xd4\x43\x27\xef\xfd\xb3\xc2\xf0\xac"
- "\xfb\xf1\x7f\x71\x0c\x3d\xa8\x87\x2b\x1d\x18\x7a\x50\x0f\xff\xab"
- "\x11\xc1\x90\x57\x0f\x8d\x99\x3c\x0c\xd9\x7a\xa8\xe7\xd5\x43\xbd"
- "\x07\xf5\xd0\xc9\x8b\xff\xac\x30\xac\x95\xdc\xff\x8a\x8f\x21\xe8"
- "\x6c\x57\x5d\xda\xc4\x61\xc8\xc7\xcf\x59\x8b\x46\x83\x46\xc5\xd8"
- "\x4d\xb1\x22\xca\x15\xbf\xda\x93\x18\xbf\x70\xfc\x3e\xee\x1a\xa7"
- "\x49\x19\xec\xd8\xf7\x39\x18\xb3\x63\x09\x08\x61\x7d\xea\xd0\xa3"
- "\xf8\x9d\xea\x0d\x3d\x9a\xf8\xff\xab\x1e\x3d\x57\x23\x1f\x3b\xb6"
- "\x1f\x94\xc4\x4e\xd8\xf7\x45\x43\x9f\x28\x8d\xdd\xf9\x5c\x57\xec"
- "\x74\x45\x1c\x76\xa4\xdf\x23\xd8\x1d\xae\x76\xf4\x7f\x04\x3b\xb6"
- "\xff\x73\x8b\xdd\xcf\xb9\xff\xfb\x9f\x64\xff\x67\x5b\x8d\xa8\xc2"
- "\xd5\xf6\x92\x5c\xca\x5e\x0a\x3f\x23\xfc\xca\xe0\x98\x1f\x1c\x63"
- "\x74\x0f\xfc\x9f\x39\x67\xef\xc1\xac\x05\x66\x0c\xf4\x89\xc7\x7b"
- "\x7a\xe0\x34\x77\x38\xd2\x04\xae\x42\x91\x3b\xd8\x3c\xe0\x78\x26"
- "\x1c\x37\xf6\xf2\x89\xbc\x03\xd2\x97\xd1\x39\xbf\x2f\x82\x63\xdd"
- "\x70\x5a\x7a\x95\x2f\x59\xd3\x81\xa2\x70\x1e\xce\xf7\xf4\x67\xd3"
- "\xf4\xe5\xdf\xb7\xe7\xaa\x48\xbc\x0e\x88\x23\x4d\x77\x3b\xf5\xef"
- "\x62\x9c\xce\xee\xe3\xab\xb5\xaf\x46\x5a\x7e\x5a\xfa\x69\x84\xf3"
- "\x75\xa4\xed\xc1\xe6\xa7\xe3\xa7\xb1\x7d\x80\x50\x2f\x1f\x2d\x93"
- "\x67\xaf\x14\x0a\x97\x09\xa7\xbd\x93\xee\xb5\xdb\xc2\xa4\xf7\xf1"
- "\x35\x08\xd2\xbf\x89\x98\xb4\x6c\xba\x00\xfa\x8e\xaf\x8c\x6c\x3a"
- "\x66\xee\x36\x1c\xf3\xe5\xc7\x8f\x4d\xd7\xd3\x11\x1b\xbc\xde\x38"
- "\xbf\xac\xb6\xd5\x14\xce\x0f\xa7\xe9\x65\xbf\xe3\x2f\xd5\x6c\x59"
- "\x06\xf3\xef\x89\xd3\xc1\x75\x8f\xb0\x71\x0e\x84\x32\x0c\xbb\x91"
- "\x5f\x6e\xbd\xc5\x91\x6e\xa5\x0d\xf5\xd9\xc1\xc5\x46\x4d\xe7\x14"
- "\x0f\xc6\x6b\x08\x3a\x63\xd7\xcb\xc7\xc7\x84\xb1\xab\x6a\x40\x08"
- "\xa7\xa5\x7b\xfd\xbe\x0e\xd2\x07\xb1\xe5\x88\x24\xe5\x60\xd6\x5b"
- "\x21\x58\x53\xd6\xbb\xb6\x33\xcf\xea\xa3\x65\x9f\x35\x18\xd2\x45"
- "\x39\xf2\xb5\x53\xcc\x38\x06\x9b\xd6\x97\x49\x5b\x99\x8c\xd7\xd4"
- "\xbf\x91\xfe\x2e\x9c\xd6\x96\xf3\x27\x5f\xdb\x2a\xdf\x31\xce\xf9"
- "\xdb\x56\xfb\xe3\xf3\xfc\xfc\x35\x24\xfd\x1f\xfa\x42\xfa\x71\xae"
- "\xe9\xd5\xce\xe9\x43\x48\xfa\xbd\xa1\x90\x3e\xc6\x35\xbd\x35\xd8"
- "\x29\x7d\x6f\x92\xfe\x23\x0d\xa4\x9f\xe8\x9a\x5e\xeb\x9c\xfe\x6e"
- "\x92\xfe\x73\x0b\xa4\x8f\x73\x4d\x1f\xe9\x9c\x3e\x94\xa4\x2f\x51"
- "\x43\xfa\x29\xae\xe9\x33\x9d\xd3\xf7\x21\xe9\x3f\x0d\x80\xf4\xf1"
- "\xce\xe9\x77\x30\x69\xd1\x00\x36\xed\x3d\x24\xed\x7e\x7f\x48\x9b"
- "\x20\x52\x56\x15\x9b\x77\x04\x9b\xfe\x17\x24\x7d\x71\x16\xa4\x4f"
- "\x72\x4d\xef\xeb\x9c\xbe\x2f\x49\xff\xb7\x70\x48\x9f\x2c\x82\x95"
- "\x73\xfa\x7e\x24\xfd\x17\xa9\x90\x3e\x45\x04\x2b\xe7\xf4\xfd\x49"
- "\xfa\x43\x49\x90\x3e\x55\x24\xf6\xce\xe9\xef\x25\xe9\x0f\x4f\x81"
- "\xf4\x69\x22\xb1\x17\xa6\xcf\x39\x12\x03\xe9\x56\x6c\x67\xb9\xe9"
- "\x14\x77\xe7\xbc\xef\x23\x79\x7f\x15\x05\xd7\x64\xba\xa6\x47\x3e"
- "\x24\x3d\x7a\x94\x4d\x3f\x80\xa4\x3f\x36\x0c\xd2\xaf\x11\x89\x7d"
- "\x18\x4e\xbf\x83\xa4\x0d\x23\x69\x0f\x34\x40\xda\x75\x22\x71\xe7"
- "\xa7\xd5\x91\xb4\x27\x6b\x20\x6d\x96\x48\xcc\xf9\x69\xf5\x24\xed"
- "\xd7\x45\x90\x36\x57\x24\xde\xfc\xb4\xf7\x93\xb4\xe5\x13\x21\x6d"
- "\x9e\xc8\xf3\x0e\xe0\xa5\x7d\x80\xa4\xad\xc4\xbc\xda\x2a\x82\x0b"
- "\x3f\xad\x81\xa4\xfd\xe7\x1a\x48\x5b\x20\x82\x09\x3f\xed\x40\x92"
- "\xb6\xea\x20\xa4\x2d\x12\xc1\x84\x9f\xf6\x41\x3a\xe7\x44\x0a\xdb"
- "\x4e\xef\x72\x4e\xbb\x9d\x6b\x77\x7f\x69\xef\xf5\x0f\x1d\xdb\x56"
- "\x92\xef\x56\x57\xe3\xb5\xec\x6e\x94\xeb\x31\x47\x1f\x61\xa7\x50"
- "\x38\x9d\x73\x3c\x14\xae\xc3\x79\xee\x75\x6d\xdb\x7c\x1f\xdb\xce"
- "\xf5\x11\x83\xe8\x9c\xda\x04\xf6\xfe\x25\xae\x69\xfd\xf9\x69\x1f"
- "\xa2\x73\xbe\x2b\x67\xd3\xee\x77\x4d\xab\xe6\xa7\x7d\x98\xce\xf9"
- "\x77\x2e\x9b\xb6\x54\xa4\x7d\x7d\x94\x97\x36\x82\xce\x39\x3d\x11"
- "\xd2\x1d\x14\x6b\x5f\xe9\xd5\xda\x47\x71\x7b\xe0\x68\xbb\x21\xfd"
- "\x23\x24\xbe\xe7\xb5\x10\x5f\x66\xae\x86\x23\x2d\xe0\xf0\x28\xaf"
- "\xaf\x7c\xd4\xde\xeb\x87\x50\x36\x66\x47\x5d\x9f\x21\x93\xff\x0c"
- "\x8f\x91\x3c\x4d\xa7\x20\xcf\x32\xe7\x67\x60\xdb\x23\xac\x13\x70"
- "\x7c\x07\xdb\x72\xce\x16\xe1\xf8\x42\xda\x72\x81\x46\xa0\x7c\x54"
- "\x38\x4f\x16\xdb\x21\x74\x4e\x4d\x04\x1b\x03\x41\x7f\x04\xf5\x91"
- "\x69\x0f\x01\xdf\x32\xfa\xcd\xbb\x0e\x42\xda\xa1\x6c\xba\x93\xce"
- "\xfd\x20\xfb\x7c\xbf\x82\x73\x35\x37\xfa\x40\x1f\xdf\x53\x62\x5a"
- "\x26\xe5\x41\x74\x67\xbd\xca\x4c\xe6\xe3\xdf\xd8\x57\xab\x91\xe9"
- "\x4f\xec\xbb\x82\xab\xa3\x9b\x68\x2b\xff\xd8\x46\x8a\xae\x7e\xb8"
- "\x09\xf9\xe2\x35\xf8\xe8\x90\x11\xeb\x4c\x70\xdc\xac\xbf\xab\xa8"
- "\x39\xc7\x6c\x35\xf9\x7c\xc9\xac\x29\xda\x9c\x73\xc5\xdf\x84\xe6"
- "\xf8\xe2\xbf\x37\xae\xa6\x2d\x78\x9f\x02\xdb\xe6\x7a\x63\x95\xbd"
- "\x01\xaf\xa5\x68\x81\x3c\x2c\xe7\x53\x90\x0a\xef\x29\x87\xd7\x75"
- "\xad\x4a\x6b\x40\xe7\x55\x57\xc6\xd3\xf3\x93\x46\xc0\x33\xe0\xf5"
- "\x56\x13\xce\xc2\xff\x49\x4c\x41\xfb\xe6\xd6\x9f\x32\x2e\xc4\xeb"
- "\xd3\x5d\xc9\x37\x87\x8c\x46\xf4\x1b\x2f\xd7\xa5\x64\xa0\x7b\xeb"
- "\x55\x57\xf2\x1c\x6b\x51\x31\xeb\x4f\x5d\x4e\x7a\x92\xac\x3d\xd5"
- "\xd8\xcf\x1e\x54\x7f\xca\x65\xed\xa9\xa2\xd8\x22\xb2\x9e\x55\x23"
- "\x93\x37\x3c\x5b\x35\xad\x0b\x2e\xb5\xb7\xae\xc9\xc4\xfb\xbf\x19"
- "\x33\xea\xd1\x59\xf6\x1c\xce\x93\xe4\x75\xe5\x22\xce\x03\xe7\xe5"
- "\xc8\x07\x5f\x67\xbe\x2f\xb6\x08\x97\x1d\xe2\x50\xea\xf9\xfa\x55"
- "\x57\x4e\xe1\xf5\xab\x64\xa4\xcf\xc3\xe9\xc5\xd7\xe5\x05\x8d\xb3"
- "\xa9\xde\xd2\x9c\xd3\x98\x0a\x5a\xf5\x24\x89\x7b\x63\xa6\x09\xd1"
- "\x13\xd9\xbf\xb3\x4c\x3e\x14\x8b\x47\xe3\x56\x93\xcf\x27\xf1\xec"
- "\xdf\xbb\x1c\xeb\x85\x89\xe6\xab\xae\x2f\x87\x78\xd7\xda\xdf\x8f"
- "\xf3\xc7\xda\x9a\xac\x5b\x5a\x5f\xae\xed\x8f\xd7\x73\xbe\x6a\x80"
- "\x7b\xd6\x92\xb8\x5c\xf5\x81\x7f\x03\xd9\x7f\xcd\xec\xbf\x34\x4e"
- "\xc3\x70\x49\x33\xb2\x94\xce\x7d\xa0\x86\xec\x05\x73\x95\x59\xab"
- "\x8c\xc1\x0e\xf0\xa5\x83\x1e\xa8\x61\xf2\xcd\x1f\x2d\x98\x23\x8a"
- "\x17\x05\x8b\x78\xe4\xd1\xc7\x06\x0f\x19\xfa\xab\x61\xc3\xa7\xcf"
- "\x78\x35\x21\x71\xe6\xac\xa4\xd9\x73\x5e\x4b\x9e\x3b\x6f\x7e\xca"
- "\x82\x85\x8b\x52\x17\x2f\x79\x3d\x6d\xe9\x32\x9c\xee\xc6\xf3\xbe"
- "\x1f\xe5\xd3\x44\x21\xc0\xee\x69\x7c\x9f\x6c\xe6\xde\x70\x8c\xe0"
- "\x7c\x75\x85\xaf\x56\x5c\xc3\x57\x81\xaa\xc6\xfb\x79\x34\xa8\xae"
- "\x7e\x87\xf7\x17\x01\x9e\xf9\x54\x15\x3c\xc7\xec\x61\x56\xab\xba"
- "\x5a\x5e\x69\x7e\xce\x88\xf7\xdc\xfb\x2a\xb4\x0e\xe9\x06\xe0\x7d"
- "\xce\xae\x96\xe2\xf3\x3b\xee\x47\xe8\x28\x5c\x2b\x96\xe7\x00\x35"
- "\x0a\x7d\xa7\x37\x6d\xce\xeb\x4d\x37\xe0\xfc\xf3\xb6\xd0\x75\xe6"
- "\xe5\x49\x28\x07\xfe\x0f\x5c\x57\x9f\x57\x35\x65\x7f\xd5\x97\xd9"
- "\x93\xa8\xef\xf6\x2d\x74\xed\x9a\xde\x74\xed\x1b\x5b\xe8\x86\x1d"
- "\xbd\x69\x93\x2e\x0f\x05\x34\xe7\x34\x45\x9a\x54\x57\xb7\x32\xf5"
- "\x06\xce\xdb\x7b\x5d\x1d\xb6\x11\xce\x3d\x6c\x45\xaa\x1d\xf0\x7f"
- "\x38\xd6\xf4\x95\x96\x3c\xf7\xc7\x8d\x16\x3f\xc8\x4f\x47\xb7\x25"
- "\xfb\xe4\xc0\x7d\x08\x26\x4d\x9f\x1c\x85\xde\x1f\xee\x67\xae\xb2"
- "\x9c\x45\x26\x55\x53\xc9\x8e\xeb\xcc\xfd\x02\xab\xb6\x36\x20\x9c"
- "\xdf\x47\x0b\x2d\x7e\x8b\xee\xa1\xad\x90\x36\xd7\xbe\x3c\xd9\x07"
- "\xd2\x24\x43\xde\x4d\xfc\xf2\x18\x66\xce\x4d\xd5\xce\x5b\x9c\x9c"
- "\x3c\xb0\x07\x32\x30\xff\x22\xfe\xfe\x7b\xa9\x90\x1f\x7a\x67\x0b"
- "\x7d\x14\xca\x69\x84\xf2\x96\x55\x80\x5b\x00\x7e\x20\x28\x53\xee"
- "\x79\xd5\x35\x3f\x38\x7e\x10\xfe\x3e\x08\xcf\x5e\xc6\xec\xe7\xe5"
- "\x7b\xc7\x23\x74\x4e\xd3\x41\x78\xce\x32\xbc\x47\x01\x5e\x4f\xf1"
- "\xea\xeb\x13\x7d\xa0\xdc\x79\x90\xae\x4c\x7b\x0f\xd2\xc3\x75\xd9"
- "\xf0\x1c\xbb\xe0\x6f\x9c\x7e\x38\xc6\x11\xd2\xff\x3f\xf6\xde\x05"
- "\x3e\xca\x2a\xcb\x17\x5d\xf5\x08\x04\x8c\xe4\x61\xa4\xd3\x36\xdd"
- "\x16\x76\xb0\xa3\xf2\x48\x20\xda\x91\x06\x8d\x24\xd8\x41\x13\x48"
- "\x0b\x6a\x14\x04\xa2\x89\x56\x9a\x00\x91\x04\x28\x30\xa4\x2a\x05"
- "\xd8\xb1\x1b\x21\xc4\x88\xb1\x0d\x49\x1c\xd1\x8e\xa7\xe9\x91\xbe"
- "\xc3\xcc\xe4\xfc\x7e\xa8\xe9\x26\x73\x0f\x3d\x03\x29\xce\xb9\xcc"
- "\xef\x64\xfa\xe0\x74\xc9\x49\xd3\x91\x09\x58\x9a\x82\x14\xa4\xaa"
- "\xf6\xfd\xaf\xbd\xbf\x2f\xf5\x48\x05\xf5\x8c\xe7\xf1\xbb\xd7\xe8"
- "\xc7\x57\xdf\x7e\xac\xbd\xf6\x5a\x6b\xaf\xbd\xf6\x6b\xed\x1e\x59"
- "\x2f\xf3\x84\xe9\xfc\x0d\x5a\x75\x1f\x9c\x2a\xf6\x0c\xef\xbd\x6c"
- "\x65\x7f\xab\xf2\x8e\x18\x7c\x83\x2e\x27\x90\xb6\x71\xc8\xbe\xc2"
- "\xc0\x77\x55\xb6\x87\x60\xe6\x30\x4e\x8c\x07\x8f\x5d\xff\x09\x96"
- "\x60\x70\xa4\x84\x66\xf9\xc8\xf0\x4f\xfd\x44\xad\x07\x44\x07\x9e"
- "\x56\x3c\x2d\xff\x88\xb8\x3f\xe0\x39\x81\xf0\x93\x78\xff\x23\xde"
- "\x7f\xe8\x97\x6b\xa1\x69\x8c\x77\x75\xad\x18\x98\xd3\x42\xdf\x97"
- "\x77\x61\xd6\xd1\xe3\xe7\xcc\x71\x0d\x8c\x3b\xfb\x56\x16\x53\x2e"
- "\xfb\x23\x7d\xc0\x0e\x57\x11\xe2\xf1\xde\x25\xdf\xe1\x8f\x69\xf8"
- "\x24\x9e\x41\xf5\xdb\x97\x8d\xdf\xab\xb4\xdf\x05\x78\x56\x7c\xe1"
- "\x13\x0d\x6f\xbc\xc7\xe4\xeb\xfe\xd2\x69\xbf\xdc\xe3\xff\x72\xe5"
- "\x5e\xb3\x91\xc9\x7f\x9a\x4c\x81\xf8\xc8\x70\xbf\x5b\x85\x19\x0e"
- "\xab\x30\x43\x97\xf6\xee\x27\xb3\x11\x74\x32\x02\xbe\xc9\xa2\xc2"
- "\x4c\x33\xf1\xae\xc1\xe3\x88\x2c\x7f\x02\xf2\x4f\x48\x65\x7e\x8e"
- "\x40\xdf\x33\x2f\xdd\xa6\xcb\x27\x99\x47\xfb\x94\x6c\x19\x78\xbf"
- "\x03\xc2\x4e\x40\xb6\x5a\x47\xe5\xc7\x34\xfc\x7e\xa4\xfc\x0c\x77"
- "\x46\xc9\x4f\x23\xeb\x23\xe4\x4b\x6d\x57\xf2\x72\x6c\xe8\x85\x32"
- "\x7c\x0f\x1f\x06\x9c\x63\x96\xd5\x0c\xc3\x27\xc7\xcd\xfb\x2e\x10"
- "\xdd\x68\x25\xe9\x1f\x72\xd0\x34\x1c\x60\x99\xe5\xb2\xb5\x72\x15"
- "\x2e\xc0\x0f\x61\x1d\x8c\xdf\x46\xc0\xc5\xf7\x21\xa4\xeb\x70\xd1"
- "\xe7\x3a\x6e\x32\xcf\xcf\x7f\x0a\x79\xd4\xf0\x65\x98\x9c\x4f\x84"
- "\xea\x75\x82\xf3\x68\x65\xff\x16\xe1\x99\xd0\x51\x64\xff\x8c\x4c"
- "\x2e\x90\x92\x65\x92\xdf\x2e\x7f\x26\xda\x52\x01\x05\xb9\xaf\x4b"
- "\xa3\x4c\xb4\xb7\x49\xe7\x4c\xbe\xe6\xd9\xb5\x94\xc9\xf0\x58\x87"
- "\xbb\x4d\xbe\x92\x76\x6e\x8b\x0a\xd6\xbb\xca\xf7\xe2\xe5\x13\xff"
- "\x58\x45\xb2\x9c\x36\xc6\x07\xf1\x61\xe5\x36\xbb\x30\x0a\xda\xb7"
- "\x5d\xd5\x15\x65\x1d\x42\xfe\x23\x5c\x77\xa6\x27\xe2\xbb\x00\xc7"
- "\xc3\x71\x7c\xbf\x8a\x56\x9f\x43\x7c\x36\x83\xe9\xc1\xe9\xf9\x4e"
- "\x48\xe5\x53\xf6\xf2\xcd\x92\x6e\xc8\xcf\xfc\x10\x28\x83\x61\xd8"
- "\xfd\xc2\x2f\xa0\x8f\xde\xda\xce\xf7\x08\x5c\xab\x88\xe4\xcf\xd5"
- "\x82\x70\xfe\x20\xdf\x11\xe4\xef\xe1\x3e\x98\xf5\x09\xca\x4c\xe4"
- "\x3b\xd0\x10\xd6\x18\xdc\x0b\x18\x5b\x7c\x72\x1e\x08\x70\x9e\x00"
- "\x2e\x8d\x0c\x07\xf8\xf4\x68\xb0\x9a\xd9\xdf\x64\x38\xaf\x35\x78"
- "\x87\x98\xe7\xb2\x3d\x6f\x97\x75\x82\xee\xba\x76\x47\x9b\x8a\xeb"
- "\x42\x9a\x2e\x31\x52\x40\xe2\x85\x12\xed\xae\x35\x19\x77\xd4\x7e"
- "\x55\xf2\xb7\x47\xdd\x53\x78\x6d\x49\xf5\x0e\x31\x10\xc2\xfb\x1a"
- "\xe9\x7e\xd5\x35\xbc\x8f\x72\x79\x62\xeb\x2a\xd9\x8f\x72\x19\x9c"
- "\x5f\xc1\xbb\x7a\x96\xe1\xe9\xb4\x9a\x0d\x3c\x14\xbd\xae\x26\x21"
- "\xfc\x10\xcb\xa2\xa4\x1b\xf4\xe8\x90\x9d\x65\xf1\x9a\x19\xf9\x59"
- "\x87\x1e\x1b\xda\xca\xdf\x57\x5b\xa4\x8e\x1d\x8d\xbf\x5a\xc8\xf1"
- "\xae\x01\xf0\x6d\x1d\x64\x29\x48\xf4\xfd\x54\xca\xf4\x3a\x65\xdd"
- "\x0e\x7b\x5f\xc8\x37\x1c\xf7\x13\x31\x9e\xa0\x51\x17\x70\x3d\x8c"
- "\xbe\x66\x90\x71\x85\xbe\x3e\x2a\xde\x2a\x21\xc6\x19\xfa\x4c\xc3"
- "\x6f\xe4\xbb\x1a\xef\x8f\x72\x1d\x99\x9e\xb3\x95\xee\x43\x9c\xff"
- "\x77\x8c\x7b\x58\xbd\x7d\xe1\x34\x96\xf5\x06\x1f\x98\x5f\xcc\x97"
- "\x10\xcc\x6b\x2c\xfb\x8d\x80\x75\x58\x7d\x2b\xd9\x60\x5a\x37\x4e"
- "\x15\x27\x39\x7d\x28\xad\x3f\x8b\xe3\xea\x50\xf6\x9c\x2a\x79\xbf"
- "\x9b\x81\x7d\xe3\x03\xee\x61\xbe\xef\x13\x30\xba\x98\xa6\x48\xb7"
- "\x9b\xe5\x11\xdf\x27\x35\xbc\x77\xa1\x3f\x9f\x89\x67\x41\xa8\xfd"
- "\xfb\x37\x47\xca\xd7\x48\x74\xfb\x67\x7e\x37\x06\xed\x05\xa4\xdd"
- "\x75\x6c\xb9\x64\xf2\x27\x6b\x7d\x87\xc6\x6b\x7f\xf9\x71\xb4\x97"
- "\x30\x18\x83\x51\xbc\xee\x92\xf2\xb8\xb5\xd0\xc0\x75\x46\xde\x2e"
- "\x05\x67\x44\xd6\x59\xca\x93\x53\xca\xc0\x49\xb1\x15\xf5\x1c\x95"
- "\x83\x91\x02\x8d\xcf\x27\xa3\x68\xa2\xeb\xae\x66\xbe\xa7\x8b\x75"
- "\x12\x6c\xdc\xfb\x86\x47\x42\x7a\x89\x79\x1f\x94\xbc\x1f\xf1\xb4"
- "\xab\xfe\x56\xd3\x5b\x23\x2a\x7e\x6a\x84\x0c\x73\x9d\x66\x48\xf9"
- "\x65\x5c\xec\xab\x18\x97\x2e\x89\x87\xdd\x42\x88\x6b\xe5\xf2\xdd"
- "\x26\x7f\x86\xd6\x5e\x35\x58\xd7\xfc\x0c\x6b\x27\x74\x15\xe3\x84"
- "\xb2\x1b\xa4\xfe\x7b\x50\xd2\x24\xa0\xe1\x7e\xc2\xe7\xe4\xbc\xc3"
- "\x9e\xab\x46\x99\xf7\x04\x7e\x97\xf9\xd4\x3d\x07\x93\x91\xbf\xd3"
- "\xf2\x34\xf7\xe3\x86\x55\xac\xa3\x2d\x4f\xca\xdf\x8b\x2d\x8f\x41"
- "\x56\x2f\x90\x19\xf0\xe2\x59\x46\x75\xb9\x18\x34\x1b\xee\xe6\x31"
- "\x03\x68\x7d\x18\x36\x52\x27\xd3\x9b\x65\x19\x36\x52\xf6\xf0\xde"
- "\x40\x99\x2e\xb7\x28\xa7\x95\x69\xaf\xf8\x13\x78\x17\x72\xdc\x15"
- "\x92\xad\xc0\xbb\x1a\x1d\x3b\x41\xc7\x78\x94\x77\x87\x56\x2f\xbe"
- "\x63\x34\x09\xdf\xdf\xd6\x70\x6f\xd1\xd2\xff\x83\xce\x07\xad\xad"
- "\x9e\xdc\xcb\xfa\x57\xf2\x20\xb8\x4a\xcb\x7b\x48\x95\x15\x7c\x4a"
- "\x4f\xcb\x36\xa2\xba\xb3\x2c\xf8\x14\xeb\xc1\x39\xe0\xbd\xd4\x7d"
- "\xf2\x2e\x5c\x15\xc6\x6d\x47\x96\x61\x36\xc4\x49\x39\x84\xdd\x13"
- "\x92\xa3\x60\x76\x94\x7e\x62\x5d\xdc\xd8\xbb\x4b\xdd\x09\xc1\xb2"
- "\xc4\x3a\x95\xc7\x26\x80\x97\xa0\xb5\x1f\x0d\xe7\xe0\x9b\x91\x76"
- "\x12\x7d\x06\x59\x99\x15\x06\xbb\x31\x56\x3f\xd7\xae\x74\x60\xab"
- "\x56\xb7\x8f\xb5\xba\x1d\xd6\xea\xf6\xb1\x56\xb7\x4e\x94\x01\xba"
- "\xd1\xdb\x61\x74\x04\xdd\x28\x59\x4b\xdf\xc5\xba\x3c\xd4\x5e\x45"
- "\x91\xde\x96\xc7\xe8\x0b\xb3\x6a\x0f\x21\xbc\x44\x46\x94\xbe\xe8"
- "\x8a\xad\x2f\x82\x3e\xad\xbe\x1d\x51\x6d\xe3\x90\xc2\x5d\xeb\x5b"
- "\xc0\x87\x5e\xaf\x7e\x37\xc7\xe5\x9b\x59\x7f\x72\xd9\xe1\x7d\x50"
- "\x9b\xa2\xab\xd6\x96\xc5\xc5\xb1\x7c\x10\xc7\xc2\xdb\x33\xf3\x9a"
- "\x75\x02\xc3\x60\x9e\x4a\xbb\x12\x61\x8a\xaf\xd2\x6e\x6d\x0c\xd7"
- "\xd1\x48\xdb\x1c\x14\xdc\x5e\x44\x77\x64\x5b\x14\x33\xb5\xb6\xa8"
- "\xca\x36\xd3\x7e\xf0\x28\x73\xb4\xdc\x26\xca\x8e\x2a\x97\x79\xd3"
- "\x23\x7d\x2f\x2b\x9e\xee\xd0\xfb\x34\x4e\x8f\xbc\x36\xe4\xb1\x46"
- "\xf5\x8f\x8d\x8c\x9f\xdb\x14\x74\x4b\x9d\x75\x40\xea\x0a\xdb\x30"
- "\xe3\x63\xa6\xca\x76\xad\x9f\x40\x58\xa6\x16\x96\xa3\xf5\x25\xba"
- "\xdc\x7c\x14\x85\xd3\x89\xd8\xf6\x51\xd0\xad\xdb\x47\x12\xd6\x88"
- "\x84\x75\x52\xab\x1f\x87\xcd\x52\xfa\x29\xd8\xcc\x61\x7b\x15\x1d"
- "\x9a\x85\xec\xaf\x82\x39\x5a\x7f\xc5\xed\xcb\xe8\x36\x05\x3a\xb9"
- "\x8d\xf1\xb7\xdb\x6c\xb0\x30\x7c\x97\xe3\x1a\x8f\x21\x5a\x10\x97"
- "\xcf\xfa\x80\xf5\x85\xe5\x59\xa5\x37\x2c\x4b\xe5\x7b\x3d\xeb\x1d"
- "\xb6\x43\x38\x1e\xe9\xb2\x59\x17\x21\xbc\xde\xf2\x10\xec\x82\x7f"
- "\x8b\x37\x02\x56\x99\x96\xf7\x55\x69\x2b\xfc\x5b\x81\x49\x0f\xd3"
- "\xf3\xa1\xad\x2f\xe6\x7c\x9c\x5f\xd7\x5f\xac\xbb\xfc\xac\x9b\x54"
- "\x79\xff\xa2\xc9\xb8\x1c\x37\xe8\x76\xd1\x88\x31\x2c\x2d\xdf\x57"
- "\x20\x75\x9a\x31\x5d\xe9\x33\xe3\xcd\x9c\x57\xf2\x0f\xba\xb2\xee"
- "\xaa\xf8\xb8\x7d\x13\x99\xdb\x3e\x97\x36\x56\xaa\xc2\xd3\x58\xa5"
- "\xea\x61\xbc\x57\xd6\x43\xe9\xd4\x46\x85\xcb\xe5\xd4\xb6\x6b\x32"
- "\xee\x51\xae\x0b\xc7\xed\x0b\x8b\xe3\x3b\x43\x10\xf7\xbc\xc4\x2b"
- "\x2a\x5f\x70\xc4\x3a\x26\x7d\xbb\xba\xfb\x36\xbe\xed\x80\xae\x7b"
- "\x8d\x1e\x0d\xcf\xdf\xe8\x7a\x17\x74\x59\xc0\xba\x57\xc6\x3d\xab"
- "\xa5\x59\xaa\xbd\x1f\x94\xef\x8f\x14\x5d\xd3\x8c\x1a\xbd\xf3\xb5"
- "\x7a\x7c\x26\xc7\xd9\xff\x56\x02\xda\x1a\xcf\xe8\xb4\x0d\xff\xcd"
- "\xed\x07\xe5\x27\xf1\xb7\x94\xfb\x5a\x39\x86\x6d\xe5\x34\x8c\x93"
- "\xec\x23\xcc\x86\x93\xd1\x36\xf5\x79\x73\x5c\x05\xf7\x4b\xd2\x56"
- "\x35\xc7\x2d\xd1\xe6\x80\xa8\x7b\xd3\x5f\xa1\x5f\x30\x35\xeb\x3a"
- "\x46\x0c\x17\x10\xfb\x2c\x3f\x6f\x96\x97\xc7\x19\xd8\xc7\x7d\x78"
- "\x1a\xd6\x4f\xef\x5d\x73\x6b\x30\x4d\x55\xba\xde\x60\x5d\xd2\xeb"
- "\x3d\xa7\x6c\x3a\xb3\xd9\xd2\xa6\xe9\x92\x4b\x66\xf3\xf4\x08\x3b"
- "\x0c\xdf\x11\x3a\xc3\x1c\x77\x77\xb4\xce\x80\xdd\xbc\x6b\xb8\xc9"
- "\xe4\x8d\xb0\x03\x10\x76\x5d\xdd\x61\x36\x9d\xe0\x36\xca\x77\x16"
- "\x49\xfd\xb4\x49\x96\xf5\x92\x8e\x33\xeb\xcd\xa1\x17\xb4\xf9\x0b"
- "\x73\xdc\x0c\xb6\xd5\x22\xcb\x33\x97\x45\xe8\x4e\x2e\x4f\x87\x67"
- "\x26\xbe\xf7\x06\x74\xf8\x9c\x61\x66\x6b\x7a\xbe\x23\x42\x57\x6a"
- "\x7d\x18\xeb\xc9\xc8\xbe\xea\xf2\xcd\x91\x7d\x55\x5c\xf2\x18\x1d"
- "\xd9\x64\x76\x7f\xe9\xbe\xca\x6c\xee\x62\xbd\xa5\xeb\xc8\x08\x5d"
- "\x60\x36\xf7\xb7\x85\xdb\xb2\x66\x73\xa5\x6e\xcb\x8e\xea\x51\xb3"
- "\xc9\xcf\x3a\x0a\xe5\x77\xa9\xb2\xe3\x56\xa1\xdf\x5f\xab\x97\x8d"
- "\xf8\xe6\x5e\x8c\xc8\xc4\x5e\x2f\xe4\xc8\x94\xab\xd9\x80\xb2\x6d"
- "\x5e\xe3\xbb\x3f\xcc\xc6\x06\xc8\xdf\x64\x96\xb3\xee\x0d\x9f\x53"
- "\x7f\xa8\xaf\xe8\x19\xda\x38\x4a\xdf\x8b\xe1\x76\xe1\xc1\x03\xa2"
- "\x01\xe5\xf4\x84\xd7\xf1\x65\x84\xed\xd3\xe6\x10\x24\x6d\x19\x96"
- "\x39\xae\xa5\xfd\x40\x64\xdd\x54\x3d\xe2\x4e\x72\x3d\x78\x4c\x84"
- "\xf2\xd9\xce\xe6\x3b\xcf\x93\xd0\x6e\xb8\x1d\x74\xea\x76\xd1\x55"
- "\x67\xb8\x7d\x75\xb9\x92\x75\xa5\x36\xf6\x3c\x01\x7b\x27\x62\xbe"
- "\xaf\x28\xaf\xd8\x52\xb5\xa9\x62\x43\xcd\xb3\x73\x2d\x15\x1b\x2a"
- "\x6a\x2a\x4a\x2b\x2b\xb6\x97\xd6\x54\x6c\xdc\x30\x73\x7d\xe9\x73"
- "\x15\xcf\x58\xb6\x96\x56\x5b\x32\x6d\x33\x6c\x93\x29\x94\x74\xbe"
- "\xa5\xb4\xba\x7a\xf3\xfa\xf2\x32\xcb\x86\x8a\x67\x66\x6d\x2a\xaf"
- "\x2e\xaf\xb1\x94\x6e\xda\xb8\x79\x43\x99\x65\x46\xd9\xec\x19\x99"
- "\xf7\x94\x4d\x0e\x9f\x43\xbb\x2d\x89\x06\x83\x57\x3e\x19\xd8\x77"
- "\x85\xe2\x13\x0d\x55\x9b\x12\x6d\x15\x1b\xe4\xbc\x9d\x79\xe2\xdd"
- "\x73\x9a\xa9\x8a\xef\x1c\xe7\x7b\x66\x45\xd3\x84\x02\xbc\xcd\x9c"
- "\x0e\xf5\xb4\xb4\xf3\xbd\xe3\x53\xc5\xb4\xe1\xa6\x09\x3e\xb7\x79"
- "\xb2\xbc\x2f\x1d\xb4\xb0\xa0\x6e\xd3\xc4\x95\x3f\x0c\xc0\x66\xab"
- "\xe2\xfd\xd9\xed\x57\x28\xb5\x71\x0b\x99\xf1\x24\xe0\x49\xe2\x3b"
- "\xc9\x87\x9b\x26\xce\x74\x9b\xe3\x0b\xa4\x0f\x7f\xf3\xc4\x93\x9e"
- "\xe4\x19\x5d\xa2\x71\x86\xba\x7f\xdc\x3c\xf1\x0f\xfa\x5c\xf3\xb2"
- "\xdd\xb4\x8c\xe5\xf3\x9c\x79\xa2\x9c\x63\xdf\x09\x59\xe6\xf9\xd7"
- "\xa1\x0f\x16\xe5\xc2\x1e\x3c\xdb\x7d\x8b\x8c\xfb\x83\xd7\x48\x09"
- "\xc0\xcb\x7c\xbc\x36\x93\x5e\x41\x59\xd5\x69\x42\xa0\x8c\x46\x7d"
- "\x3e\x8d\xef\x89\x47\x5d\xfa\xb4\x7a\x54\xcb\x7a\x1c\x10\xe9\xcd"
- "\x29\xc0\xaf\x49\xe2\x73\x4c\xaf\x03\xf0\xee\x03\x4e\x16\xbe\x27"
- "\x9e\xf1\x8a\x35\xd7\xc7\xf3\x5d\xe7\xcd\xf1\x71\xc1\x2d\xa0\xdb"
- "\xf7\xd4\xbd\x47\xfb\xda\x54\xfb\x43\xbd\x16\xb4\xe3\xf7\xde\xcf"
- "\x29\xe1\x65\xbe\x7b\xdb\x79\xab\x38\xe5\xf5\x93\xcb\xda\x47\x89"
- "\xdb\x84\x47\xfc\xdd\x27\x03\xaa\x4e\xf1\x99\xac\x1b\xfe\xe6\xa7"
- "\x7d\x66\xae\x13\xfa\x8a\x04\xbe\xc7\x79\x9c\xb9\x45\xf3\x2b\x53"
- "\x85\x57\xbc\x11\x66\x73\x99\xe3\x5f\x67\x9a\xb0\xbd\x35\x84\x7e"
- "\x6a\xb8\x29\xde\x01\xbc\xfb\x34\xdb\xd8\x2b\x46\x56\x19\xc2\xd2"
- "\xb2\x9c\x79\xc7\x81\x1d\xaf\xc3\xe6\x3b\xbd\x39\x8f\xe2\xff\xa4"
- "\x38\xe4\xf1\x84\xc1\x77\x47\xc3\x67\x98\xf8\xed\xd1\xcb\x91\xe3"
- "\x70\x73\x3c\xdb\x04\x1e\xc8\xb2\x67\x9c\xf2\xd2\x9b\x0e\x88\x33"
- "\x2e\x84\xef\xbb\x4a\x66\xa4\x45\xbf\xc1\xf0\x27\xe5\xba\xcd\x13"
- "\x0e\x31\xfc\x9d\x53\x89\x76\x21\xcd\x50\xd3\xc4\x3e\x9e\xdf\x45"
- "\x1c\xda\xbf\xf7\x74\xf4\xbc\xb5\x26\xcf\xf3\xa3\xe4\x39\xb7\x89"
- "\x6d\x42\xf4\x04\x2c\x43\xfb\x2e\xa3\x1f\xc6\xf7\xec\x66\xca\xe0"
- "\x72\xf0\xfb\x34\xcf\x87\x00\xe6\x11\xbd\x3c\x01\xf9\xdf\x1b\x54"
- "\x73\x30\x9a\x6c\xcd\x74\xd9\x06\x78\x7d\x42\x1c\x87\x7e\x67\x1c"
- "\x59\xc6\x90\xa7\x5f\x97\x29\xc8\xfa\x19\x29\x57\xa9\x94\x21\x9a"
- "\x26\x59\xf9\x8e\x6f\x96\xab\x36\xc8\x13\xcb\xd5\x70\xd3\xe4\x24"
- "\x5d\xa6\x20\x6b\xa7\x39\x1d\x70\x98\x7c\x64\x7b\xae\x99\x75\x64"
- "\xbf\x79\xf2\x6e\x96\x31\xf1\xda\xc3\x7d\xe2\x5b\x2b\xfb\x14\x9f"
- "\x26\xef\x76\xf9\x14\x0f\x42\x74\x9f\x5c\x12\x46\xf7\xd3\x90\xe3"
- "\xc9\x4c\x67\x39\x57\x8d\xf4\xc0\xed\xb4\xb4\xc5\x77\x80\x07\xb2"
- "\xaf\x9a\x9c\xcf\xf9\x35\x1a\x9e\x0c\xd1\x70\x72\x47\x2c\x1a\x46"
- "\xd1\x4e\xde\x1b\x2d\x9a\x26\x1f\xe6\xb6\x82\x3c\x67\xf4\x3b\xa3"
- "\x63\xf1\x12\x65\x98\xcd\xcd\x14\xcf\x65\xf4\xa4\x72\xfa\x1b\xcc"
- "\x7a\x19\xfb\x40\x6b\x8f\xdd\x7a\x5d\x79\xee\xe9\x20\xe2\x39\x71"
- "\xce\x9f\x9e\xca\xf4\xbd\x21\x3f\x94\x5f\x78\xa3\xf3\xcf\x78\x26"
- "\x02\x57\xf9\x88\xa6\x1b\x4a\x5e\xd1\xee\xd4\x46\xfe\x5d\xd7\xc3"
- "\x37\xdd\xa2\xfa\xc9\xee\xdb\x58\xbe\x6f\x78\xdf\xd5\x42\xc4\x61"
- "\xda\xf7\xe1\x21\xf4\x3d\xd1\xf3\xfb\xe3\xae\x37\x98\x6f\x08\x44"
- "\xac\x37\x98\x6f\x18\x1c\x6f\xbd\x21\xb2\xdc\x84\x7b\xb9\xdc\x60"
- "\xfb\x0a\x43\xa8\xec\x84\xf4\x60\x8c\xb2\xf5\xfc\xb3\x3b\xc2\xc6"
- "\x33\xe6\x84\x97\x18\x87\x5e\xf4\x53\xe2\x3b\x2b\x0c\x02\x70\x7a"
- "\xa4\x6d\x91\xd0\xa0\xec\x17\xb6\x8b\x12\xac\x9c\x26\xba\x1e\xa3"
- "\x7f\xf1\xa9\x7c\x8f\x0b\x5d\x95\x1f\x71\x0f\x52\x12\xbf\x6f\xcd"
- "\xd0\xa3\x8d\x11\x89\x49\xc4\xf8\x48\x20\xb2\xc8\xf4\x02\x7f\x2a"
- "\x48\xfb\xf6\xc8\x0f\xf3\x68\xfa\xd1\xf8\x7f\xc7\xdf\x24\x85\xaf"
- "\x84\xe7\x23\x83\x56\x5e\x41\x58\x8a\xfc\xeb\xe4\x16\xa4\x67\x89"
- "\xf5\xc7\x56\xb5\x63\x05\xc6\xe6\x16\xab\x4c\x2c\x84\x5f\x83\xaf"
- "\x7f\x8b\xf0\x6f\x0e\x89\xfc\xc6\x9f\x69\x55\x58\x01\xb7\x9a\xca"
- "\xe4\x36\xab\xef\x77\x8c\x06\x19\x3b\x92\xc2\x8b\x4c\x22\x47\x9c"
- "\xfc\x91\xc8\xff\xf8\x00\x2f\x03\xf1\x96\x86\xd1\x04\x37\x79\xeb"
- "\xc3\x92\xff\x93\x42\x7f\x7a\xdf\x75\xea\xf8\x55\xff\xbe\x17\xf6"
- "\xfb\x56\xf5\x9a\xde\xf2\x35\xc2\xbf\xfe\x9f\xe5\xf4\x24\xfd\x67"
- "\x48\x3c\x6e\xb3\xc4\x4a\x1a\xa2\xff\x6d\x0e\x3d\x28\x5c\x42\x43"
- "\xf1\x33\xfc\x91\xdf\x3f\xe8\x8a\xfc\xbe\x33\xfe\x6b\xc0\x9c\xba"
- "\xf9\x1f\xbb\x1b\xf6\x71\xc6\x99\xd1\xc0\xc4\xa8\x26\x93\xd8\x18"
- "\xd5\x84\x42\x7f\x1a\x36\x26\xe0\xb3\x2a\x2c\xd8\x1c\x3b\xf5\xff"
- "\x9c\xbf\x5b\xea\xb5\x06\x71\xab\x27\x69\x4c\xe4\xfd\x51\x61\xfc"
- "\x3d\xc1\xa2\x85\x65\xfd\x6e\x4c\x7a\x19\x66\x09\xfb\x36\xe4\xe2"
- "\x9f\x0e\x68\xd6\x99\x5f\x07\xae\xdf\xfc\xfd\xff\xf0\xcf\xc0\xed"
- "\xe3\x9b\xbf\xff\x49\x7f\x42\xf5\xe2\xd0\x44\xf2\xc5\xff\x89\x51"
- "\x45\x29\xb4\x08\xa1\x05\x08\xed\xc7\xd7\xd2\x8f\x7f\xf3\xf7\xcd"
- "\xdf\x37\x7f\xdf\xfc\x7d\xf3\xf7\xcd\xdf\x37\x7f\xff\x1f\xf8\x33"
- "\xc8\x71\x84\xd0\xfe\xf4\xdf\x2a\x8e\x87\x40\xcf\x15\xcb\x30\xa3"
- "\x81\x42\x29\x30\xdc\xbe\x9b\x0c\xf1\x34\xc1\xfc\xf5\x59\x79\x96"
- "\x51\x84\xbe\x64\x86\x4c\x3c\xbc\xc7\x64\x1e\x9e\xef\x84\x85\xdf"
- "\xf6\x75\x61\xf4\xef\xfe\x33\x80\x80\x26\x8c\x0b\xe3\x68\x02\x4d"
- "\xa4\x78\x9a\x44\x93\xe9\x06\x4a\xa0\x1b\x69\x0a\xc6\x9b\x49\x94"
- "\x4c\x29\x74\x13\xa5\xd2\xcd\x34\x95\xbe\x45\x69\xf4\x6d\xba\x05"
- "\x35\x99\x46\xdf\xc5\xd8\xfe\x56\x10\x64\x7a\xec\xba\x38\x28\x37"
- "\x0d\xff\xe0\xff\x62\xca\x95\xdf\x6b\xbf\x09\xff\x5f\x1a\xde\xad"
- "\x85\x9f\xd6\xc2\xdd\xdf\x84\xff\x2f\x0d\xb7\xfc\x6f\x7e\x4f\xff"
- "\xdf\xfa\x36\x40\x65\x2b\xad\x6d\x88\xa9\x2b\xa3\x43\x0d\xda\xdf"
- "\xe8\x37\x7d\x41\xfe\x31\xf0\x22\xf3\x47\xff\xe5\xe2\xc9\x56\x3f"
- "\xed\x44\x6a\x9e\x57\x84\xff\xf9\xc7\xcb\xa9\xff\xd5\x1d\xc3\x73"
- "\x02\xcf\x19\x3c\xff\x15\xcf\x7f\xc7\x73\x51\x87\xa3\xd2\xf0\xd4"
- "\xdf\xbf\xe1\xf9\x6f\x9d\x44\x67\xdd\x78\xf2\x89\x3e\xaa\x25\xfa"
- "\xd7\x24\xa2\x8f\xd1\x47\xfd\xe9\x08\xd1\x39\x4f\x08\xe6\xa7\xbb"
- "\x42\xd8\x5d\x54\x3b\xbb\x25\xff\x3e\x67\xff\x34\x90\xa4\x80\x9e"
- "\xb6\x6b\xf1\x8a\x02\x4b\xd6\xec\xec\xd9\x77\x67\x5a\x66\xcd\xb2"
- "\xcc\xcd\xcc\xca\x9c\x93\x99\x3d\x27\xeb\x1e\x4b\xd6\xbc\xf9\xf3"
- "\x32\xe7\x67\xfe\xd0\xb2\x7e\xdb\xa6\x8a\xac\xcc\xe7\xca\x2d\x1b"
- "\xca\x2a\xaa\x2d\xcf\x56\x6c\x5a\xbf\xb5\x74\x53\xf9\x17\xd5\xea"
- "\x2b\xff\x31\x7a\xdf\x0d\x92\xe4\x40\x24\xb5\x6f\x25\x73\x6a\x1f"
- "\x99\x67\x74\x53\x28\x26\x43\x7b\x62\xfe\xad\x7f\xf2\xb1\x3f\xce"
- "\x58\x39\xe5\xf7\x0f\x3c\x37\x63\x61\xde\x5b\xfb\x8e\x90\x71\x56"
- "\x03\x19\x67\x14\x90\xf1\x3b\x0b\xc8\x98\x78\x94\x8c\x46\x84\x3d"
- "\x67\x25\xe3\x9a\x04\x32\xae\xe8\x27\xe3\x92\x5c\x32\x2e\xb0\x8c"
- "\x0d\xdb\x92\xa6\xc2\x3a\xf3\xc9\x78\xd0\x47\xc6\xa6\x6c\x32\xee"
- "\x3a\xad\xc2\x3e\x40\xd8\xdf\xb8\xbf\x76\x3a\xfc\xfb\xfe\xbe\xac"
- "\xfd\x30\xe6\xcf\x2d\x65\x0c\xf9\xcd\x0f\x65\xc7\x98\x24\xfd\xe6"
- "\xef\x9b\xbf\x6f\xfe\xbe\xf9\xfb\xe6\xef\x9b\xbf\x6f\xfe\xfe\x0f"
- "\xff\xf3\x18\x28\xfb\x73\xa3\x99\x7e\xdf\x48\x34\xec\x8c\x9f\xe6"
- "\x36\x4c\x3b\xc9\x7b\x4a\x88\xcf\x4e\x51\xbc\xf4\xb7\xc2\x4f\xd8"
- "\x5e\x94\x84\xbc\x83\x44\x7c\xf6\xf3\x95\x03\xc2\xc3\xe7\x3a\xf3"
- "\xdf\x26\xea\x49\x27\xe2\x7d\x2e\x80\xb1\xca\x4d\xcf\x27\xa8\xbd"
- "\x4d\xc2\xcb\xf1\xbc\x3f\x0a\xe1\x35\x08\xdf\x35\xde\x7e\x15\x7d"
- "\x6f\x16\xc3\xcc\x9f\x2e\x71\x39\x14\x05\x87\x61\x74\x21\xcc\x7f"
- "\x1d\x18\x09\x3a\x5e\x5e\x23\x19\x18\xde\x90\x93\xd2\xbc\xce\xee"
- "\x9b\x91\xd7\x8b\xfa\x64\x68\x7b\x8b\x06\x85\x93\x4c\x3d\x36\x3f"
- "\x9f\x31\x35\x9c\xa7\xc9\x6f\xe2\x6d\xc4\x5b\xee\xb1\xdd\xa9\xf2"
- "\xa5\x33\x0c\xe4\x35\x0c\x3b\x27\x65\x8e\xe6\x05\x6c\x79\x4e\x9c"
- "\x26\x57\x78\x8d\xdd\x46\x95\x36\x69\x92\x96\xd6\x88\xb4\xab\xf4"
- "\xb4\x2a\xce\xb8\x44\x8b\xbb\x01\x71\xb6\xc8\x38\x73\x93\x16\x97"
- "\x80\xb8\xe6\x28\xfc\xcc\xae\x6b\x7e\x3a\x4f\x93\x0e\x03\x17\x0b"
- "\x9f\x69\xe2\x3c\x5a\xfa\x64\xa4\xef\x89\x84\x45\xa4\xc5\xa5\x20"
- "\xce\x1d\x19\xf7\x41\xa6\x16\xf7\x2d\xc4\xf9\x23\xe3\x0c\x7a\xbe"
- "\xb4\x61\xe7\xe4\xb4\x18\xf5\xe4\xf2\x0d\xaa\x6c\xae\xc3\xe4\x05"
- "\x48\xe3\xe0\x34\x2b\x2c\x0e\x62\x5e\x71\xdc\xf1\x8e\xd1\xf2\x39"
- "\xcd\x5a\x1d\x8e\x1b\xf9\xc3\x68\x0a\x5a\x4e\xae\xd5\xf3\xe7\x5b"
- "\x18\x06\x49\x1a\x32\x1c\x37\x4d\x2a\x60\x38\xfc\x8d\xdf\xd3\xb8"
- "\xde\xda\x6f\x0b\xd7\x2f\x72\x8f\x8f\x19\x60\xe3\x60\x88\x4e\xc0"
- "\x33\x31\x5e\x97\x81\xea\x34\x11\xb4\x7f\x9b\xf7\x75\x65\x66\x06"
- "\x9d\x82\x5c\x36\x1f\x59\x6e\x21\xfb\x39\xba\x21\x8d\xf7\x09\xed"
- "\xdd\x4e\xf1\xf6\x2a\xe1\xe3\xb3\xf8\xbd\x9e\x41\xb2\x7b\xc4\x00"
- "\x9f\x77\xaf\xbb\x4c\xf1\x7c\xbf\x51\xdd\xf3\x94\xd6\x53\xfb\xe7"
- "\xd8\xf7\xdf\xf2\xfd\x41\xd3\x38\x6f\x3f\xf5\xb6\xf6\x93\xbd\x35"
- "\x32\xaf\xfd\xbb\x94\x76\x8a\xcf\xce\x3b\x29\x91\xf1\xe8\xb1\xf8"
- "\xc9\x9f\x92\x99\x59\xfb\x3a\x99\xed\xd3\xc9\x78\xaa\xac\x5b\xc7"
- "\xc5\xcd\xb8\xec\xba\x40\xf1\x6f\x3d\x0b\x19\xba\xc0\xf8\xe6\x64"
- "\xbe\xb7\xdd\x67\x3c\x9e\x56\x48\xc7\xd3\xce\x52\x4f\xda\x42\xea"
- "\xb1\xe5\xd3\xde\x0b\x94\x70\xdc\xb7\x80\x7a\xcc\x0f\xa2\x8d\xe5"
- "\x93\x6b\x10\xbf\x2d\x01\xa4\xf1\xca\x73\x20\xe7\xe9\x86\xd3\xcd"
- "\x3f\xa5\x78\xb7\x82\x09\xfa\xde\x70\x56\x3f\xd3\xc0\xdf\xb1\xea"
- "\x51\xfd\x6d\x4a\x03\x7e\x03\xc0\xe5\xde\x73\x94\x70\x73\x7a\x1a"
- "\xf1\x3d\x45\x13\x5d\x2d\x7e\x32\xd7\xd2\xa4\x71\xda\x56\xaa\x3c"
- "\x0f\x0d\xd9\x6c\x3b\x20\x06\x58\x46\x87\x5e\x28\x41\x3b\x4d\x28"
- "\x44\xd9\x83\xda\x3e\xc1\x41\xfb\x9b\x64\x1e\xda\x5a\xc2\xfb\xa3"
- "\xfb\x11\x67\xd5\xe3\xf8\x9c\x37\x9f\xdf\x9e\x93\xca\xf7\x48\xe5"
- "\xd2\x87\xd7\x06\x78\x0f\xe2\x20\xef\x0b\x65\x78\x89\x36\x32\xa1"
- "\x3e\x71\xc0\xe7\xde\x76\x84\x7f\x1f\xe9\x90\xbf\xd3\x4d\x47\x33"
- "\xe5\xbe\xc5\x6f\xad\xf4\x06\xbf\xb5\xf2\x72\xf0\xb5\x95\x43\xe2"
- "\xb5\x95\x9f\x07\x5e\x5b\xf9\x99\x7d\x1b\xc5\x07\xbe\xb5\xd2\xd3"
- "\x5b\x25\x79\x90\xd4\x5b\x75\x91\xf7\x13\xc6\xb3\xdf\xee\xd5\xcf"
- "\x83\xf7\xfe\x8f\xf8\xbe\xa5\xb4\x60\xf2\x3d\xe0\xd3\x3f\xd3\xea"
- "\x5a\x12\xf8\xed\x8b\x55\xbf\xa1\x94\x9c\x2a\xd5\x86\xe2\x51\xa7"
- "\x1b\x2d\x6e\xf3\x1c\x29\xbf\x9e\xe4\xdc\x2a\x3c\x35\x78\x6c\x78"
- "\x6a\x45\x4a\x4e\x2d\x68\x65\x9f\x52\x6f\x20\x3e\xc7\x30\x27\x48"
- "\x86\x0b\x74\xe3\x02\xe0\x9f\x34\x0e\xdd\xa6\x05\x9b\xec\xc5\x3f"
- "\x70\x50\x1d\xfb\x40\x60\xdd\xc4\x7a\x89\xf5\x14\xca\x69\x40\x39"
- "\x56\xd9\x16\x0f\x08\xaf\x48\xb1\x17\x23\x7c\xc0\xfb\x82\xd5\xe0"
- "\x79\xc1\x6a\x1c\x4a\xb1\x2f\x47\x9a\xc3\x48\xd3\xa1\xd1\x70\x80"
- "\x61\xa1\x4d\x78\x6e\xf4\x93\x09\x30\xab\xfe\xfe\x4a\x9f\xf9\xe0"
- "\x01\x71\x16\xe9\xce\x8c\xc2\x02\x6c\xc0\x01\xfd\x6f\x1c\xd0\xc3"
- "\x40\xeb\xfe\x97\x91\x8e\xf3\xbb\x7c\xb9\xac\xbf\xdd\xae\xca\x01"
- "\xde\xc7\x3b\x59\x8c\xa8\xf2\x90\x86\xcf\x78\x7a\x6e\xf4\xd1\x84"
- "\x61\x27\x15\x33\x6c\xce\xc7\xbe\xcb\x90\x6f\xb9\xb0\x5b\xa1\xdf"
- "\x68\xe9\xb0\xb0\x1a\xf8\x4c\xff\x71\xe4\x57\x65\x4f\x29\xd6\x71"
- "\xe4\x32\xe4\x99\x7e\xc6\x13\xf2\x70\xbc\xd2\x47\x37\xb6\x90\x09"
- "\xf9\x96\x33\x3c\x86\x05\x39\x70\xa3\xae\xcb\x8f\x57\x7a\x28\x28"
- "\x22\x60\xba\x35\x78\x1d\x11\xf0\x10\x2e\x00\x8f\xe5\xaf\x07\x79"
- "\x6e\xec\x90\xf0\x1e\xf9\xfb\x20\xc3\xf3\x91\xd9\x22\xf1\x7d\x8c"
- "\x61\x48\xff\x18\x80\xd9\xbd\x65\x11\x0d\x52\x62\xbc\xc7\x6e\x35"
- "\xc9\xfd\x83\xc8\xff\x5e\xdd\x40\x9c\x18\x2a\x31\x4d\x91\x7b\x07"
- "\x17\x11\xfb\xc2\x18\xa4\x29\x9f\x88\x21\xab\xe9\xc6\x41\x32\x33"
- "\xce\x7c\x9e\x88\xf1\x0c\xe7\xe5\x23\x8b\x1f\x5b\x48\x8f\xe5\x2f"
- "\xc9\x5f\x48\x45\x0f\xe4\x2d\xa4\xcc\x7b\x67\x65\xce\xfb\x61\xce"
- "\x3c\x2a\x7e\xfc\x91\x85\x54\xbc\x74\x21\x2d\xc7\x53\xbc\x7c\xf1"
- "\x23\xf9\x8b\x97\x2f\xa4\x92\x07\x97\xe0\x2b\x6f\x61\x56\xe6\x8f"
- "\x67\x15\xe7\x2d\x59\x4c\x3f\x59\x31\x37\x73\xee\x5c\x7a\x60\x71"
- "\x61\x56\x66\xa6\xf6\xce\xca\xe4\x24\x4f\xe6\x2c\x5e\x3e\xab\x78"
- "\xd3\xc6\x9a\x8d\xb3\x96\x2e\xc9\xe3\x10\x5a\xbc\x78\x21\x2f\x24"
- "\x84\xc9\x4f\x46\xe0\x4a\x80\xe9\xec\x15\x9f\x16\xb0\xff\x06\x6a"
- "\x03\xff\xf1\x0c\xca\x73\x21\x94\xf4\x2f\x6d\xcc\x37\xa9\x5f\x13"
- "\xb9\xcf\x32\x0f\x3b\x13\xdd\xa0\x9f\xdc\x8f\xcb\x3e\x14\xce\xd3"
- "\xd4\xb7\x11\x77\x87\xd6\x7f\xc4\x0d\x3b\x93\x28\x32\x3e\x05\xfa"
- "\x35\x71\x0e\x9f\x33\x70\xe1\x01\xcd\xbd\xd0\x83\xa0\xad\x87\x86"
- "\xec\x25\x71\xf2\x9c\x27\xf8\xcd\xfb\x6f\x91\x77\x41\x58\x7b\xef"
- "\xe7\x7d\xba\x96\xed\x64\xba\x44\x49\x37\xf7\xd6\xe4\xf2\x59\x1c"
- "\xe2\x1b\x67\x24\x8c\xcb\xa3\x30\x26\x6b\x67\x45\xdd\x6d\xbc\x07"
- "\x5a\xc1\xd9\x15\xa6\x1b\xdc\x0c\x67\x2f\xe2\x34\x58\x4f\xf4\x42"
- "\x47\x40\x87\xcf\x0f\xda\x33\x48\xa4\x64\xe6\x04\x47\x32\x64\xbf"
- "\x80\x7c\xc7\x74\x99\x46\xf9\xde\x1e\x94\x29\xde\x2a\x30\xf0\x7e"
- "\x54\xb9\x37\x95\x12\x4f\x34\xf3\x9e\xed\x94\x5c\x87\x3c\x83\x2d"
- "\xc3\x92\xe3\x03\x4d\xf8\x6e\xca\xad\x17\x76\x75\xb6\x1a\x61\x93"
- "\xf0\xed\x00\xbf\x4d\x90\x17\x0a\x7c\x8a\xf0\x0d\x64\x42\xf8\x1f"
- "\x40\xeb\x3e\x99\xfe\x53\x99\x7f\x22\xc2\xde\x05\xbc\xfa\x60\x4a"
- "\xae\x13\xf2\xc3\x61\xb0\x15\x92\x5f\x46\xfe\x9d\xac\xf3\x94\x1e"
- "\x9e\xaa\xce\x55\x82\x37\x0a\xfe\x54\xfd\x9c\xe5\x80\xc2\x61\xea"
- "\x3f\x1c\x07\x5d\x8e\xa3\xe7\xea\xa9\x65\xfb\x26\x19\xf5\xbf\xb1"
- "\x44\xf5\x91\x53\x7b\x38\x2d\x9f\x91\x17\x49\x1f\x14\x03\xee\xae"
- "\xee\xed\x83\xd2\xe7\xbc\x9b\x92\x73\x83\x76\x2b\x85\xd5\x65\x26"
- "\xe3\x01\xbc\xcd\xc3\x23\x56\xf4\x99\xc9\x99\x32\x2f\xf0\xd3\x70"
- "\xe3\x34\xd3\x18\x7f\xd6\x13\xe0\x6b\x36\x78\x3e\x09\xe5\x79\xa3"
- "\x78\x9e\xc4\xf4\x00\xbe\x7d\x41\xbc\x01\x27\x4d\x6c\xb5\x02\x2f"
- "\x32\x32\x3d\xdc\x21\x18\x5e\x25\x53\x29\xd9\x51\x32\xf5\x12\x60"
- "\x2f\x0c\x8b\x5f\x11\x15\xbf\x1e\xf1\x8b\xb4\x78\xb4\xd7\x94\x9a"
- "\xa8\xf2\x1b\x11\xff\x20\xf3\x10\xed\xd1\xe4\xa6\xa4\xc3\x6d\x6c"
- "\x4f\x86\xd2\x1f\x8a\x4a\xdf\x8d\xf4\x0f\xf1\x7e\x7c\xee\x2b\x38"
- "\x7d\xbb\x26\xf7\x48\x1f\x8f\xf4\x67\xa2\xca\x2f\x42\xfa\xe5\x61"
- "\xf8\x45\xd5\xff\xa6\x63\x88\x2f\x61\x39\xc5\xbb\x0c\x69\x26\xb2"
- "\x0e\x60\xfd\x73\xbc\x92\xf9\x73\x53\x7a\x54\xfa\x7c\xa4\x5b\xc7"
- "\x74\x96\x34\x1a\x62\x1a\x25\xe9\xb6\xcd\x59\x85\xc3\x4d\x25\x51"
- "\x79\x6c\xc8\x53\xcd\xf4\x95\x72\x36\x1c\x33\xcf\x9e\xa8\x3c\x87"
- "\xa5\x9c\xaa\x72\x34\x1e\xab\x3c\x9a\x6e\x0b\x87\xc1\x75\x83\xbd"
- "\x75\xd3\xe9\x48\x18\x37\xc3\x66\x4b\x7c\xe1\x65\xa5\x33\x6e\x80"
- "\x4c\xcc\x45\xd8\x41\xc0\xdc\xcd\x72\x84\x76\xe6\x75\x79\x7c\xd0"
- "\xbd\x05\x09\x4a\x76\x53\xb3\x12\x6b\x89\x7f\xcf\xe2\xdf\x0c\x5b"
- "\x8c\x14\x6a\xed\x29\x35\x0b\x6f\x0e\x97\xfe\x19\xb9\x1d\x8b\x91"
- "\x87\x83\x0a\x66\xea\xa3\x68\xef\x46\x7c\x07\xb4\x32\x5e\xe5\xf3"
- "\xcc\xc0\xdf\x09\xbd\x4e\x7c\x26\x1b\xe1\xd9\x08\x7f\x59\x8b\xdf"
- "\xcd\xe9\xf1\x3b\x4b\xfb\x6d\x80\x8c\x39\xb5\x76\x86\x36\x75\xf3"
- "\x0e\x59\x36\xda\x95\x9e\x3f\xa8\xe4\x3e\x0f\x71\x15\x78\x2f\xc1"
- "\xfb\x51\xbc\x7f\x82\x77\x16\xfb\xa0\xb0\x07\x64\xfb\xe2\xef\xef"
- "\xe2\xfd\x08\xde\x93\xf0\x5e\x0e\xdc\x2e\x83\xee\x0e\x0f\x64\x3a"
- "\x4a\x66\x06\xc1\x43\x6e\xf7\x13\x15\x0f\x53\xfb\xb9\xcc\x80\xae"
- "\x0b\x3e\x0d\x85\x69\xfa\x41\x6b\x0f\x5a\xd8\x48\x01\xd3\xa5\x18"
- "\xf0\xbb\xb9\x7c\xa1\x60\xc5\x29\x3e\xa9\x34\x41\x95\xcf\xac\xf8"
- "\xad\x85\xa9\x74\x86\xf0\x32\xf1\x6e\xae\xf3\x0a\x81\xb7\x43\xfa"
- "\xaf\xa0\x9b\x77\x81\x26\x66\x7c\xaf\x60\x3a\xc9\xf4\x12\xee\x4d"
- "\x9e\x30\x7e\xc3\xbe\xbf\xb9\x3b\x8a\xdf\x2c\xc3\x2f\x4b\x7e\x83"
- "\x76\x3a\xce\x8c\x3f\x64\x9a\xfb\xca\x09\xba\xdc\x40\xbe\x07\x43"
- "\x6d\x6c\x6a\x7c\x54\x9b\x49\x07\x9c\xfd\x2c\x1f\x53\xaa\xb4\x36"
- "\x39\x75\x34\x3d\xfa\x8d\xa9\x39\x91\xe9\x93\x58\x56\x61\x9f\xdf"
- "\x74\x58\xd3\x75\x5e\x53\x2d\xcb\xf4\x54\xd8\xff\xa7\xfa\xa5\xdd"
- "\xd6\x94\xfb\x22\xc3\xf1\xda\xa5\x7f\x20\xaf\xa9\x8a\xdb\xe2\x54"
- "\x87\x1e\x2f\xe3\x92\xed\xa7\x19\x77\x53\xa5\x8c\x6b\x75\x43\x14"
- "\xf5\x38\x52\xe7\xce\xbc\xa6\x1a\x19\xd7\x15\x82\x9b\x59\xa2\xc1"
- "\x35\xc5\xf4\xef\xd4\x98\x59\x30\x8b\xc8\x78\xa7\x83\xe2\x5c\xfe"
- "\x33\xb4\xcc\x2f\x02\xb3\x1c\x34\xc9\xe5\x3f\x4c\x77\x10\x25\xbb"
- "\xfc\x67\xe9\x4e\xa2\xe9\x2e\x7f\x33\xec\x80\x43\x1c\xff\xe1\x0f"
- "\xc8\x60\xc0\xdb\x7e\xbb\xc3\x68\x70\xf9\x6b\x28\xdd\x61\xc6\xbb"
- "\x92\x1e\x8c\x13\xc3\x2e\x7f\x21\xd2\x95\xd1\xb2\x80\xf8\x34\x3f"
- "\x4e\xfc\x69\x4d\x80\x92\x0a\x77\x0b\xbb\xcb\x0f\x9b\xdc\x7f\x12"
- "\xe1\x41\xb1\x2c\x70\x15\xcf\xb0\x08\x36\x66\x96\x2c\x0b\x7c\x2a"
- "\xf2\x76\x7f\x88\xef\x3f\x09\x61\x24\xe1\xf2\x2f\xa0\x5e\xaf\x17"
- "\xe9\xec\x42\xec\xcf\x2c\x58\x7d\xd9\x48\x23\xec\x8f\x69\x7f\x66"
- "\x09\xea\x62\x1d\x41\x3d\xd0\xcf\x3d\x37\xf2\x02\xde\x4d\x99\xcf"
- "\xca\xef\xc6\x4c\x9b\x48\xca\xb4\xce\xc6\x00\x87\xeb\xe0\xf2\xf7"
- "\xd3\x1a\x98\xe8\xcb\xb6\x79\x04\xe3\x3f\xa5\x9e\xc7\x37\x0b\xd8"
- "\x97\x43\xe2\xb2\x6d\x76\x81\xb8\x78\x91\x9c\x69\x75\xf9\x07\x09"
- "\x65\xd8\x00\x6f\xb3\x84\xd7\x98\xd9\x82\xb4\x1e\x4e\x17\x0e\x87"
- "\x61\x70\xda\x65\x01\xf6\xb1\x95\xd9\x32\x92\x9c\xd9\x80\xa7\x13"
- "\x4f\x1f\xf2\x5e\x10\xce\xd4\xdf\xf1\x79\x5c\xe4\xf7\x89\x94\xac"
- "\x78\x1f\xfb\x8e\x62\x5a\x06\x68\x22\xd2\xfb\x20\x57\xf9\x90\x4f"
- "\xe0\x9b\x95\x21\xf1\x6d\xca\xfa\x81\x4f\xd6\x23\xeb\x76\x55\x8f"
- "\xac\x19\x1c\x3e\x04\xd9\xc1\xef\x82\x21\x15\xf7\x63\xe4\x5b\x21"
- "\xf3\x35\x66\x15\x88\xa4\xac\x12\x1f\xda\x1d\xe8\xea\x60\x3a\x82"
- "\xae\x0e\xa6\xa5\xd8\x9f\x55\xe0\xb2\xed\x21\x91\x9c\x55\x32\x92"
- "\x9c\x65\x45\xfe\xed\x23\xd2\x16\xc8\x6a\xf0\x29\xd8\x3f\x03\x9c"
- "\x55\x90\x6b\x13\x60\x34\x00\x56\xcb\x88\xd3\x42\xcb\xb6\x09\xdf"
- "\x32\x7f\xbd\x7f\xcd\x36\x32\xcd\x24\x87\x81\xfd\xf9\xba\x6c\x65"
- "\xa8\x67\x0f\xde\xf9\x88\xa7\x9b\x50\xd6\x87\x80\xdb\xc0\xe5\xa1"
- "\x9c\x16\xc0\x7c\x15\xb0\xca\x18\xa7\xab\xec\x2b\x35\x25\xab\xf3"
- "\xaa\xc2\xef\x44\xb0\x31\x6b\x20\x98\x94\xd5\xa7\xcb\x10\xcb\x8f"
- "\xa2\x5b\x33\x2d\xf5\x0a\xbf\xcb\x7f\x90\x20\x63\x49\xbd\xde\xb3"
- "\x1c\x8f\x31\xc8\x61\xf0\x99\x65\xaa\x06\xef\x43\xc4\xf2\xd3\x5b"
- "\xb5\x9b\xd3\x7e\xc8\x32\xb4\xb4\xca\x5b\x3f\x8b\xaa\x0c\xf8\xb6"
- "\xaf\xf1\xc7\xd3\xea\x2a\xb3\x23\xd0\x98\xd5\xd5\x5b\xc5\x7c\x39"
- "\x83\x3c\x9c\xaf\x92\x12\x0d\xb0\xc3\x0d\xc2\x9f\x68\xf3\x98\x6f"
- "\xb4\xda\x45\xaf\xb7\x10\x69\xab\xa4\x7f\x62\x96\x23\x4e\x5f\x34"
- "\x28\xdc\x81\xa4\xb9\x56\xae\x9b\x98\xe2\xa0\x53\x83\x77\x13\x8f"
- "\x85\x4e\x0d\x1e\x62\x39\x0d\x8a\xa4\xb9\x39\x90\xd1\x91\xa2\x41"
- "\x47\xdc\xea\xcb\x64\x40\x58\xe0\x94\xf5\x30\xe2\x7b\x90\xee\xa4"
- "\x94\xdb\xa5\x97\xfd\x89\xfe\xa4\xac\x4e\x7f\xe3\xdc\x82\xa5\x97"
- "\x47\xc4\x29\x6b\x33\x3d\x35\xe8\x00\xad\x0e\x53\xd1\x45\xbf\xa9"
- "\xb7\xaa\x0c\x69\x86\x11\x7e\x48\xca\x7f\xd1\xc5\x21\xb1\xf4\x79"
- "\xf1\xe9\xd2\xcb\x7f\x12\x45\x56\xf1\xe1\x1a\x1b\x4d\xb9\xa1\x5e"
- "\x04\xb9\x5d\x9c\xec\x3f\x4c\x37\x9c\x65\x5f\x3d\xf9\x54\x58\x1a"
- "\x14\x45\x17\x3f\x15\xab\x9f\x67\xda\x2c\xa0\x53\x56\xb4\x1f\x5b"
- "\x33\xd3\xfb\xc4\x29\xeb\x31\x94\x9f\x0f\xb8\x76\xc1\xf7\x8f\x15"
- "\x96\x76\x27\x3e\x75\x31\x89\x4e\xf6\x37\x93\x3f\x39\xab\x33\xb0"
- "\x3f\xab\x2b\x98\x9c\xd5\x17\xdc\x9f\x35\x20\x92\xe7\xe6\xf8\xf7"
- "\xcf\x2d\x08\x24\xcf\x85\x0c\xcc\xed\x02\x9f\x26\x31\xcf\xaf\x39"
- "\xc9\x82\xef\xbf\xbb\xc6\xfc\x6f\x9c\x7b\x02\x75\x1d\x80\xce\x14"
- "\x4a\xf6\xe7\x9e\xe0\xf1\x3d\xf2\x0e\x8c\x24\xcf\xed\x43\xba\x01"
- "\xd5\xbe\xe6\xfa\x58\x2e\x65\x9f\xd5\x34\x77\x18\x7d\x8c\x69\x24"
- "\x79\x5e\x3c\x9e\x34\x3c\x19\xa2\x69\x9e\x0d\xf0\x93\xa5\x4c\x35"
- "\xce\xb3\x89\xfb\x1a\x61\xcb\x62\x3c\x9f\x3c\xaf\x65\x59\xe0\x7e"
- "\x01\x1a\xa2\x9d\xcc\xb3\x05\xf7\xcf\x6b\x10\x29\xf3\xba\x7c\x52"
- "\xf6\xe7\xfd\x3d\xc3\x1e\x79\x21\x83\xc7\xfd\x66\xc4\x9f\x10\x4d"
- "\xd9\xf3\x7d\x2c\xab\x49\xd9\x39\xc1\xa4\xec\x16\xd1\x98\x5d\xf0"
- "\xf0\x6e\xe1\x09\x34\x66\x5b\x83\x8d\xd9\x25\xfe\x09\xb0\x91\x6d"
- "\xc7\x88\xf5\x93\xff\x03\x21\xf8\x2e\xa9\xde\xaa\x43\x92\xff\x2e"
- "\x1b\xda\xc0\xb6\x5b\x1c\xa7\x06\x21\x0b\x55\xbf\x91\xba\xa9\xd7"
- "\x7b\x46\xd2\x54\x24\x67\xe7\xb0\x4c\x31\x7f\x57\x57\x91\x43\xec"
- "\xcf\x2e\x08\xee\xcf\x2e\x09\xec\x07\xdc\x64\x94\x93\x72\xcf\x1f"
- "\x7d\xb2\xbd\xde\x03\x79\x3d\x86\x3c\xff\x40\x4a\xc6\xef\xe9\x1b"
- "\x4f\x47\xb2\xae\x62\xfd\xb4\xcc\xef\x63\x99\xf9\x0b\xeb\x35\xa5"
- "\xa7\x68\x8d\xae\xa7\x58\x47\xf1\xb8\x83\xf5\x54\x50\xd3\x53\x41"
- "\x4d\x4f\xc9\xef\x24\xe8\x9a\xc6\x4c\x2b\xeb\xa3\x65\x36\xa5\x67"
- "\x96\x05\x32\x05\x64\x23\x01\x30\xac\x8a\x17\x48\xd3\x94\xb9\x59"
- "\xa6\x97\x74\xca\x6c\x09\x42\xdf\xe0\xe9\x0c\x2a\x7d\x33\xa0\xe9"
- "\x1b\xa3\xae\x6f\xd8\xe7\x2a\xda\x54\x30\x96\xbe\x09\x6a\xfa\x26"
- "\x20\x94\xbe\x09\x6a\xfa\x86\xc3\x03\x9a\xbe\x09\xc4\xd0\x37\x68"
- "\xcf\x5c\x5f\x93\xa6\x67\x1c\xac\x67\xb8\xbe\x90\xb5\x92\xa0\xd2"
- "\x33\x36\x8c\x39\x8c\xac\x67\x02\xc8\x13\xd4\xf5\xcc\xb0\xcc\xdf"
- "\xc2\xba\x66\xe4\x45\x82\xfe\xb4\x10\xeb\x18\xa9\x4f\xfc\xd3\xfd"
- "\xac\x4f\x40\xbf\xfb\xa3\xf5\x09\xe0\x75\xe2\x77\x92\xa6\xa7\xfa"
- "\x12\xeb\x85\x1f\xfa\xa4\x6b\x99\xcd\x4b\x7c\xef\x75\xa2\x1f\x7a"
- "\xdb\x56\xe3\x70\xd9\xfc\x04\x3d\x30\x20\x7a\x1d\x04\x1c\x21\xbf"
- "\x01\xe8\x0a\x22\xb4\xcb\x1c\x3f\xda\x38\x64\xbc\xa0\xb7\xea\x9f"
- "\x29\x80\xb6\x5a\x34\x38\xe4\x5a\xed\xcd\x48\x2a\xba\x28\x3c\xa0"
- "\x8f\x7b\x75\x95\x03\xfa\x25\xc3\x73\x6a\xf0\x7d\x2a\xec\x17\xc1"
- "\xc2\xb5\x6e\x0b\xda\x40\x41\x51\x45\x77\x22\xdf\x2b\xb5\xf4\xb2"
- "\xe8\x86\x5e\xfc\x7f\x8a\x2e\x26\x25\xae\xea\xa7\xef\x15\x96\x8a"
- "\x60\x00\xed\x0c\xf5\xed\x42\xbd\x4f\x00\xf7\x3e\xb4\xb9\x01\xb4"
- "\xb3\x1c\x7f\x54\x3b\x43\x9b\xf9\x3b\xfc\xb6\x28\xfa\xcd\x1d\x40"
- "\x3b\x63\x3f\x9f\x82\xfb\x10\x1e\xeb\xa1\x9c\x01\x9e\x0f\x43\x5b"
- "\x3b\x11\xdc\xaf\xda\x5a\x50\xe5\xf3\x05\x99\x7e\x46\xad\xad\x81"
- "\x17\x68\x37\xf1\x78\xd2\xf0\xc4\x6e\x6b\x55\x61\x6d\xed\x79\xad"
- "\xad\x25\xab\xb6\x06\x9e\x9a\x02\x2f\xa8\xf6\xc6\xf0\x79\x3c\x38"
- "\xda\xde\x52\xb2\x73\xd8\xe7\x90\x92\x1d\xd9\xe6\xd0\xaf\x64\x5b"
- "\xd1\xde\x4a\xd0\xde\x00\x4f\x78\x58\x6f\x42\x36\xff\x95\xfb\xba"
- "\xa5\x55\xe2\x5f\xd7\x04\x6e\x71\xa0\x3d\x59\xa1\xcb\xfe\x04\x3d"
- "\xfa\xaf\xab\xbd\xd4\x81\xf6\x94\x83\x76\x54\x80\xf6\x54\x82\x76"
- "\xc5\xed\xa9\x2f\xf0\x02\xc3\xbc\xa7\x6f\x14\x86\xec\x2b\x23\xdb"
- "\x93\x9a\x49\x8f\x3d\x1f\x39\xec\xbc\xb5\xd2\x4d\x1f\xc5\x4b\x9f"
- "\x94\xce\x5b\x6d\xf8\x7d\x56\xfb\x8d\xf1\xdf\x07\xd2\x96\xe2\x76"
- "\x58\x55\x47\x37\x5f\x20\x4b\x0e\x64\x9e\xf0\x3b\x01\xbf\x17\x2c"
- "\xbb\xe3\x43\xd8\x12\xbf\x66\xb9\x1a\xe6\xb6\x28\x9c\xd9\x3c\x3e"
- "\xcb\x85\x2c\xc6\x8b\xe1\x8c\x04\x91\x92\xf7\x73\x31\x92\xc6\x73"
- "\x5e\x89\xf8\x9e\x02\x1a\xa4\xe3\x9d\x72\xf0\x0a\xa5\xe2\x61\xff"
- "\xae\x0e\xb6\x9f\xf0\x3b\x53\x6c\x4d\x9b\xbc\x77\x0b\xcd\x4c\xf4"
- "\x2a\xff\xf2\x89\xf5\x49\x3c\xf7\x93\xca\xbf\x85\xf3\xb8\xb9\xfd"
- "\x8a\xee\x63\x1e\xe5\xc5\xb8\x9f\x3b\x30\x2c\xdb\x65\x81\x8e\x0b"
- "\xe3\x06\x3c\xbf\x0b\x3c\x0b\x1f\xdd\x96\x4b\x7c\x9f\x5a\x2c\x1d"
- "\x33\xec\xb4\x8c\xd6\x7f\x9c\xf8\x3d\x3a\x4d\xc6\x89\x3f\xac\xd3"
- "\x69\xbc\xf3\xb5\xdc\x4f\x07\xb6\x88\x41\xf6\x0d\xc2\xe7\x81\xed"
- "\x7e\xf1\xdf\xd9\xd7\x7c\x5d\x80\xe2\x97\xd9\x7c\xc2\x35\x28\xba"
- "\xf9\x5e\xb6\x76\xf6\x57\x52\x2b\x82\xc1\xe4\xbc\x4a\xb1\x3f\xcf"
- "\x3a\xb4\x45\xf8\x79\x5e\x65\xd8\x39\x3d\xc9\x4d\xf9\xf1\x8a\x17"
- "\x59\x27\xe4\x98\x30\x29\xcf\x0a\x58\xc9\x0c\xeb\x14\xf2\x07\xf6"
- "\xe7\x55\x21\x5d\x8e\x9b\x06\x8b\x65\xba\xa4\xac\x13\x55\xdb\xe9"
- "\x3b\x17\x68\xba\xf4\xb9\x21\x1a\xf3\x1c\xac\x13\x10\x96\x84\xb0"
- "\x5a\xc0\xdf\x85\xf4\x56\x37\xfd\xd7\x99\xca\x96\x9d\x5e\xab\xa7"
- "\xc3\x6f\xe9\x97\x3c\x42\x86\xd4\x6e\x0c\x47\xc4\xf9\x32\x03\x45"
- "\x9e\x96\xe3\x93\x69\xb9\xb1\xa3\x43\x3a\x7d\x6e\x01\xfb\xf9\xb4"
- "\xef\xa0\x69\xe0\x0f\xe3\xf7\x99\xdd\x26\xce\x0b\xe7\xf4\x86\xb7"
- "\xb6\xfb\x30\xa6\x98\x0e\x5c\xfe\xba\x76\x3c\x7a\x06\xaf\x88\x7e"
- "\xd0\x60\x60\x1f\xc6\x85\x4c\x1f\xa6\x27\xda\x4d\x10\x74\xf8\x98"
- "\x75\x52\xfb\x16\x1e\x1b\xdf\x96\xab\xd3\x6b\x7c\x9e\xe4\xd5\xaa"
- "\xf1\xe3\x6d\x1d\xc2\x29\xa8\xfb\x7b\xbc\x96\x71\xdb\x9b\x8a\x06"
- "\x73\xfb\x86\xa0\x47\x78\xae\x96\x7d\x72\x56\xa7\x09\xe8\xf6\xdb"
- "\x9a\xdd\x74\x57\xa6\x7e\x1e\xda\xe5\x5f\xcc\xba\x25\x66\xbf\x25"
- "\xcf\x42\x8f\xc2\xff\x7e\x77\xef\x34\xe8\x21\xa9\x9b\x1c\xa9\x75"
- "\x8a\xff\x3e\x86\xcb\x67\xfb\xfb\x11\x5f\xed\x15\x03\xa2\xd1\x11"
- "\xcf\xe3\x08\x3e\x57\x8c\xb0\xdf\x41\xae\x45\xf7\x26\xc6\xe9\xfb"
- "\xbf\xeb\xfe\xde\x35\x3a\x8f\xf1\x61\xfb\xe8\xdc\xcd\xf7\x0f\xf3"
- "\x5c\x8d\x9a\x6f\xfa\xfe\x4c\x37\xcd\x3a\xa9\xe3\xc5\x36\x06\x68"
- "\xcb\x74\x3e\xc1\xb6\x06\xcf\xff\x57\xd7\x0a\x1f\xdb\x1c\x48\x5b"
- "\xa2\xd7\x81\xeb\xa7\xea\xf5\xfd\xca\xf0\x7a\x01\x07\x0f\xc6\xda"
- "\x92\x06\xd5\xdb\x28\x5e\xfa\x08\x0c\xf0\xfa\xc1\x62\x59\x17\xae"
- "\xb3\xac\x8b\xd4\xb1\xe8\x23\xfc\x77\x63\xdc\x26\xc3\x07\x00\x0b"
- "\xe3\x9f\x99\x39\x4a\x9e\xbe\x3f\x33\x5a\x86\x42\xbe\x6d\xb3\x5a"
- "\xec\x57\xe9\x7b\xf6\xa0\x38\x77\x9e\xd2\x17\x83\x4e\x26\x7e\x07"
- "\xd9\xce\xf6\xb1\xec\x2e\xa9\xe5\x3e\xd9\x55\xcb\xfa\x56\xa6\xbd"
- "\x09\x69\xfb\x91\xe6\x6e\x2d\xed\xdd\x6a\xed\x47\xbe\x27\xf2\x1b"
- "\xfd\xd8\xab\x6e\x4a\x2f\xf4\xc8\xfe\xde\x7e\x5a\xff\x16\xf8\xc6"
- "\x1b\x7a\x78\x49\x6d\x6c\x5c\xb2\x5b\xb8\x3f\x0b\x5c\x11\x83\x28"
- "\xe7\x5b\x2c\x47\xf6\x6d\xf4\x6d\xc8\xe4\xc7\x75\x3b\xe8\x66\x96"
- "\x31\x91\x9c\xd7\xa0\xe8\x9e\xde\x22\x9c\xb0\x3d\xa1\x51\xab\xb6"
- "\xd0\x77\xd0\x86\x1c\x17\x28\xfd\x37\x6b\x6a\x2d\xc0\x95\x68\xdf"
- "\x25\x62\x1b\xe5\x4f\x48\xbf\x8b\xef\xd4\x6c\xbf\xc4\xb2\x98\x7e"
- "\x52\x97\x45\xfc\xee\xbb\x9e\xae\x40\x3f\x93\xa6\xe6\x19\x66\x2c"
- "\xe6\xb9\xfe\x73\x34\x23\x93\xeb\x8b\xc7\x80\xb0\xe9\xe2\x8a\x98"
- "\x26\x64\x9f\x36\x2f\xde\x4d\x33\x56\xe1\x9d\x26\x1f\xe8\x12\xed"
- "\x3b\x1e\xe9\x92\xc4\x95\x00\xa7\x49\x43\x58\x86\x70\x1a\xb8\x9d"
- "\xb4\x0e\x3b\x67\xac\x70\xd3\x8f\xb5\x71\xeb\x0c\x0b\xc3\x1a\x07"
- "\x07\xbe\xb7\x83\xa4\xdf\x09\x9a\xf1\xbe\xa5\xce\xc0\x78\xec\x97"
- "\xed\x02\xb0\xda\x8d\x4a\x67\x07\x81\x6b\x9b\x33\x68\x85\x7e\xb6"
- "\x06\x9b\x0a\x73\xe5\x6f\x2d\x4e\x68\xfd\x68\x6c\xf8\x8e\x54\xf6"
- "\x15\xd2\x4f\xb7\xa7\x29\x38\x8e\xf8\xee\x5b\x2e\xf0\xb7\xf4\x03"
- "\xe7\x4d\x2a\xca\x75\xb5\xe4\x2a\x1f\xd0\x48\xa3\xc6\xf1\xb7\x7f"
- "\x7b\x08\x65\x0c\x3b\x6f\x47\x9d\xe6\xc4\xab\x75\x8f\xa2\xdc\x71"
- "\xda\x5e\x12\xb7\x1d\x6e\x73\xaa\x4d\xff\xe0\xe2\xa9\x0e\xd9\xfe"
- "\x7c\x43\x49\xf3\xd2\x34\xfd\xcb\x73\x32\x09\xe7\xe8\x07\x83\xa7"
- "\xd2\xa4\x7c\x1b\x85\xf1\x76\x5b\x84\xef\x58\xc4\x8d\x7d\x6e\xc7"
- "\x78\xff\xf6\x63\x78\x4e\x68\xdf\x67\xf0\x0c\xe0\x77\x0e\x9e\xb3"
- "\x92\x76\x6f\x94\x19\xdc\x88\x1b\x82\xcd\xce\xdf\x6e\xba\xfd\xa8"
- "\x78\x23\xdd\xa8\xff\x6e\x7f\x9d\xe7\x09\x6e\x77\x83\x07\x56\xc5"
- "\x0b\x86\x43\x06\xe0\xc6\x74\x17\xf6\x16\xe1\xeb\xa9\xf3\x32\xde"
- "\x49\x3d\x2d\x5e\xb2\xdc\xce\xf5\xff\x41\x2a\xd7\xc9\x0b\xfa\xf3"
- "\xbb\xba\x45\x78\x8e\xb7\xfa\x89\xd7\xc8\x86\x9d\x3f\x40\xfb\xff"
- "\x59\xa1\x9a\x73\x70\xe4\x32\x3c\x4d\x26\x84\x5e\x7f\x45\xe7\xa2"
- "\x5c\xcb\x16\x03\x7f\x6f\x6b\x53\xf3\x30\xde\xd0\x5c\xf3\x0f\x9e"
- "\x47\x3b\xbf\x9f\xfd\x48\x5f\xa2\x1f\xfc\xad\x00\xad\x8f\x5b\xa5"
- "\x8f\x4a\x0f\xcf\xc7\xf0\xfc\x3d\xca\x81\xfe\x9b\x71\x42\xf3\xc7"
- "\xe3\x91\xba\x06\x30\xf7\x22\x0e\xfd\xd1\xe0\x29\xab\x8f\x02\x5c"
- "\x67\xe4\x7d\xff\x8a\xcf\xcc\x7e\xb4\xeb\xf8\x7e\x1b\xe0\x21\xc0"
- "\x2b\xa5\xcb\x7e\x50\xb0\xe3\xa2\xf0\xe9\x75\xe6\xb5\x54\xc0\x1d"
- "\x74\x53\x63\xc9\xb8\x6d\x62\xb4\x1e\x77\x4c\x3a\x9e\xae\xf8\x18"
- "\x04\xad\x22\xf9\x78\x47\xbc\xe2\x61\xc6\x82\x48\x1e\xde\x01\x5b"
- "\x27\x63\x17\x9e\x56\x3c\x87\xd5\x77\xf8\x93\x51\x15\xf6\x1b\x7c"
- "\xcd\x80\x3e\xcd\xa8\x85\xbe\xd0\xe6\x7e\x38\x1c\xf2\xcc\x72\xf3"
- "\x19\xfa\x9e\x11\xf6\x3d\x7e\x91\x38\x9c\x65\x9c\xc3\x83\xb0\x6f"
- "\xdc\x94\xd1\x88\xf8\x24\x6e\xbf\xec\xef\x33\x3c\x7e\xd4\xaf\x13"
- "\x65\x48\x7f\x7e\x89\xf5\x0d\x0d\x2c\xbb\xc8\xd3\x9c\xe8\x6f\x68"
- "\x40\x79\x83\x3a\x5d\x11\x76\x86\xe3\x59\x4e\x87\x9d\x77\x98\x41"
- "\x17\xe9\xdf\xc4\x8b\x31\x60\x6c\xdb\xe3\x8e\x8c\x51\x1b\x2d\x69"
- "\x9e\x8d\x79\x39\x48\x77\x66\x43\x8f\x41\x7f\x17\xe6\xa8\xfe\xe7"
- "\xce\xbb\xf9\x1b\xfa\xf3\x63\xfc\xce\x3c\x05\x3d\x75\xad\x29\xb7"
- "\x6a\xc4\x48\x13\xaf\x19\x29\xd7\xdf\xf4\xeb\xc3\xfe\x94\x9c\x5a"
- "\xd7\xc0\x51\xea\xf5\xff\x5f\xc4\x77\xc9\x02\xc6\x1d\xec\x77\xd6"
- "\xbe\x4d\x04\xde\xbb\xd6\x69\x76\xf9\x3f\xed\x96\x7e\xde\xd5\xb9"
- "\x7d\xc3\x2f\xce\xc1\x0a\x58\x2d\x61\x6b\xf4\xf9\x75\xc3\xde\x67"
- "\x85\x7f\xef\x79\xf6\x45\x93\x36\xf9\xe5\x6b\x34\xf3\x97\xdb\x29"
- "\xb3\xf5\x1a\xa5\xb7\x5d\xa3\x0c\xf1\x17\xbe\xff\x27\x74\x67\xd0"
- "\x94\x2a\x8a\x6f\xdb\x0e\x7b\xce\x4f\x86\xc0\x7e\xd8\x73\x7e\xd8"
- "\x73\x9f\x66\xb0\xbe\x1c\xb5\xe7\x46\xa4\xad\x9c\xe7\x95\xfe\xc9"
- "\xf7\xe7\x79\x6f\xb4\x92\x21\x61\x2d\x25\x01\x3f\xfb\x25\xba\xa3"
- "\x22\xa1\x1f\xb6\x24\xea\xec\xd6\xea\x0b\x9a\xd7\x26\x5a\x69\xa2"
- "\xac\x2b\x74\xb8\xd8\x5f\x98\x33\x6e\xdf\x6c\x64\x99\xf2\x72\x5b"
- "\xe2\x3a\xd4\xf3\x5a\xee\xd1\x5b\x7c\xe6\xea\x56\xe1\xe3\xf0\x9a"
- "\xe9\xc2\x87\x70\x2b\x97\x7d\x04\xe1\xc3\xce\x3b\x1b\xdd\xe6\x99"
- "\x0b\xc6\x93\x51\x8c\x99\x34\x5d\x73\x57\xb2\x30\x3a\x20\xa3\xf3"
- "\xba\x76\xf8\x61\x8f\x5f\xe2\x76\x7c\x57\xd2\xb2\x4a\xe1\xb7\x6c"
- "\xe0\x75\xf5\xbb\x88\xd7\xfc\x79\xad\xef\xaf\x61\xeb\x7c\xd1\x3a"
- "\x3f\xf7\x21\x3c\x7e\x48\xac\x04\xcc\xa6\x79\x5d\x02\x63\xf6\x2f"
- "\x6b\xd7\xf3\x5e\x93\x57\xe4\xbe\x96\xbb\x0a\xdd\xf4\x58\x87\xe6"
- "\x5f\x76\x50\xe9\xd3\x99\x33\xbd\xa0\x41\xa4\x0e\x98\x49\xec\x17"
- "\x65\xa8\x31\xd7\xdf\xfd\x3d\xd6\xfd\x77\x5d\x55\xb6\x50\xae\x4f"
- "\xf5\x05\x77\xfd\x8b\x9a\xe3\xbf\xab\xd5\x4d\x3f\x92\x7d\x7c\xd5"
- "\x6d\x2c\x13\x77\x9d\x11\x29\xb9\x23\x9c\x6e\xb6\x83\x1c\x1b\xfd"
- "\xb4\x56\xec\xcf\xf5\x09\xd9\x56\x2e\x91\x78\x6d\xdd\x30\xef\xd5"
- "\xf0\x7e\x6b\xe5\x30\x6c\x83\x99\x88\xf3\x73\x19\x1e\xa4\x01\xdd"
- "\x27\xa9\x3d\x01\x77\x79\xdc\x74\xaf\xa6\x0f\xef\xea\x51\x73\xcf"
- "\x77\xf5\x0c\x21\x2f\x6c\xc5\x9b\x86\x9d\x33\x61\xff\x2e\xaf\xd1"
- "\xd6\x8e\xe5\x9e\x1e\x84\xa5\xbb\x69\x45\x17\x87\xd5\x4c\xa7\xb4"
- "\x1a\x8b\x18\x18\xd7\xd6\x8b\xa8\xe7\xac\x77\xe5\xbe\x1b\x23\x7d"
- "\x0b\x30\xac\x3a\x5c\xf4\xb7\xff\x61\xc8\xf8\xe8\xa3\x08\xab\xd5"
- "\xe1\x22\xcd\xcd\xf8\xde\x33\x9a\x46\xe5\x69\x0d\xcb\xf3\xe8\x90"
- "\xf1\xce\xff\x80\xb0\x23\x51\x79\xba\xa3\xf2\x9c\x0e\xcb\xe3\xd0"
- "\xca\xe9\x8f\xca\xe3\x8d\xcc\x33\xcb\x3c\x16\xb7\x59\x69\x91\x79"
- "\x66\x65\x44\xe5\xc9\x19\x8b\xdb\xac\xc2\xa8\x3c\xab\xa2\xf2\x54"
- "\x86\xd1\x96\xf7\xc0\x64\x22\xcc\x11\x95\xa7\x31\x2a\x4f\x87\xfe"
- "\x0d\xdb\xb3\x5b\xd9\x06\x90\x27\xf0\x14\x7c\x85\x9d\x33\x0b\xf5"
- "\x5f\x78\xe6\x7a\xfb\xa0\x20\x33\x5e\xfb\x41\xe5\xa7\x9f\xf5\x2a"
- "\xaf\xeb\xb3\x3e\x87\x5d\x3c\xc8\x32\xc1\x76\x27\x97\x75\x9e\x66"
- "\x5f\x64\x19\x1a\x76\xce\x4e\x1d\x4b\x8f\xd9\x19\x91\x78\xce\xce"
- "\x89\xc4\x73\x76\xc1\x58\x7a\xcc\x5e\x15\x95\xa7\x32\x2a\x4f\x6d"
- "\x58\x9e\x0e\xad\x9c\xc6\xa8\x3c\x1d\x51\x79\x8e\x8c\x95\xcf\xd9"
- "\x3d\x51\x79\xce\x44\xe5\xe9\x0f\xd1\x70\xb6\xdc\xcf\xc6\xed\x01"
- "\xe1\xf8\x5e\x90\x7e\x1d\xda\x25\xe9\xf2\xac\xef\x47\x53\x72\x3d"
- "\xa7\xbe\x59\xed\xcb\x92\x3e\x91\xfa\x69\xce\xab\xfa\x7a\xef\x5b"
- "\xd7\x7c\x71\xbc\xc6\x04\xda\x0e\x1c\xb7\xf9\xd0\xe7\xce\x59\xeb"
- "\xa6\xbb\xf5\xfb\x0d\xe4\x5e\x19\xe9\x53\x4f\x8e\x47\xe6\xe4\xaa"
- "\xf6\x37\xa7\x59\x5b\xd3\xe1\xfa\xa0\x5f\x9c\xd3\xfc\x3f\x86\x57"
- "\xe6\xdd\x8c\x17\xfb\x96\x02\x8c\xbe\xd1\xb1\xc6\x28\xae\x5c\x66"
- "\xe6\x03\x3a\xae\xed\x6a\xaf\x0d\xfb\x33\xf3\xb0\xbf\xaf\x61\x67"
- "\x66\x42\xd8\xf8\x84\x71\xf5\x1e\xdd\xee\x33\x47\xe1\x3c\xa8\x70"
- "\xce\xcc\x55\x3a\x2a\x33\x57\xd7\x27\xe3\xca\x5f\xa3\xdd\xd7\x0b"
- "\xab\x80\xf7\x14\x9c\x6a\x85\xbd\x89\x31\x16\xe3\x7d\x8e\x32\x1b"
- "\xa4\xfd\xbb\xe1\x1a\xf1\x6f\x57\xed\x7c\xb9\xe7\x40\xab\x4b\x37"
- "\xdf\xeb\xc0\xb6\x4f\x4f\xd5\xe7\x34\x24\xc7\x68\xac\x1b\x33\x2f"
- "\x1e\xaf\xf5\x30\xae\x5d\xfa\xbe\x1c\xe0\xa2\xec\xba\x46\x3b\xef"
- "\x85\xf0\xf0\xba\xde\x71\x6f\x0e\xa7\x39\x0b\xda\x76\xe8\x34\xe0"
- "\x3b\x22\x90\x76\xdc\x3b\xee\xc2\xe9\xaa\x70\x98\xf7\x84\x92\x9f"
- "\xac\xf4\xc8\xf6\x10\x07\x39\xcd\xca\x89\x94\xb9\xac\x82\x48\x99"
- "\xcb\x2a\x89\x6c\x0f\x46\xb4\x87\xac\xca\xa8\x3c\xb5\x51\x79\xf6"
- "\x84\xe5\x69\xd4\xca\xe9\x88\xca\x73\x24\x2a\x4f\xb8\xfe\x43\x9d"
- "\xb3\x4e\x8f\x8e\x3b\xa5\xbe\xcf\x72\x87\x7d\x1b\x9b\x65\x3f\x95"
- "\xe5\xd5\xc3\x78\xde\x8e\x6d\x54\x96\x1b\x05\x6f\x6e\x52\x94\x8e"
- "\x42\xfa\xb9\xe9\x91\x38\xcc\xcd\x8e\xc4\x61\x6e\xbe\xfe\xad\xed"
- "\x79\xf8\xfd\x79\x9a\xab\xfb\xf7\xf4\x26\xd6\xd3\x4f\x12\xfd\x8f"
- "\x3c\xc1\xb6\x19\xf7\x4f\x72\x6f\xd8\x0e\xd8\x94\x97\x29\x89\xf7"
- "\xe4\x9d\xaf\x21\x13\xfb\x9d\x73\xd3\xbc\x63\x18\xcf\xb1\xbd\x3b"
- "\x08\x7b\x6a\x19\x60\xac\x40\xf9\x2d\x28\x03\xb4\x9b\xdb\x19\x85"
- "\x43\x57\x14\x0e\x27\xc2\xbe\x93\xf0\xdd\x17\x56\xef\x24\x53\x9a"
- "\xdc\x03\x0a\xdb\x7a\xae\x47\x0f\xe7\x39\x00\xd4\x71\xc0\x2e\xed"
- "\x80\x5c\xde\x8f\x97\x72\x8e\xe6\x7e\xc4\xf3\x05\x0a\xe6\xbc\x69"
- "\xe1\xb4\x55\xb4\x98\x97\x19\x89\xc7\xbc\xdc\x48\x3c\xe6\x15\x87"
- "\x74\xcd\xdc\x15\xaa\x8d\xcc\x2b\x73\xd3\x7d\x8d\x1c\x06\x5a\x58"
- "\x12\xfd\x96\x9b\xba\x6f\x63\x3b\x75\xde\x6f\xbd\xa8\xaf\x78\xd1"
- "\x98\xa2\x7d\xff\xad\xb8\x8d\xed\xee\x3c\xd6\xcf\xbc\xe7\xf2\x56"
- "\x84\x1d\x53\x7c\x9d\x87\xfa\xff\xa8\x53\xc1\x9d\x77\x4c\xf6\x03"
- "\xb7\xb1\xfd\x3b\xaf\x41\x24\x3b\x62\xda\xac\x2c\xcf\x43\x29\x0e"
- "\xd2\xf6\x83\x5a\x00\x63\x50\x6f\x0f\xc1\x26\x07\x05\xf7\x3f\x04"
- "\x7a\x64\x03\x46\xa6\x4f\x8d\x69\x1e\xca\x86\xec\xb7\x80\x7f\x18"
- "\x03\x67\x6b\x63\x19\x47\x2a\xef\xc9\x83\x5e\x62\xdf\x96\x09\x6a"
- "\xff\x44\x76\x76\x58\xbb\xf2\x5a\xb6\xdf\x2f\xce\x51\xf6\x55\xb6"
- "\xed\x58\x6f\xf0\xde\xbe\xe3\x7e\x0f\xf1\x3c\x8b\xcb\x7f\x41\xda"
- "\xe4\x88\xf7\x69\x79\xab\xc2\xf2\x7a\xb4\x79\x90\x01\x8e\x9b\xe3"
- "\x27\xf3\x71\xaf\x87\x7d\xf8\xa7\x2a\x3b\x3e\xfb\xea\x71\xe8\x0b"
- "\xe4\x39\xa4\xe7\xe1\x39\x13\xce\x83\x31\x8f\x79\x76\x2d\xdf\xf9"
- "\x79\x4e\xc2\xd6\xf7\xd7\xf0\xf8\xc8\x55\x3b\x40\x2e\x6f\x1f\xcf"
- "\x69\x9a\xd5\xbe\xa8\x6c\x9f\xc9\x47\xf1\x43\xfb\xed\xe0\x7d\xb6"
- "\x2f\xb0\xdf\xee\x03\x6e\x90\xf3\xec\x69\xac\x03\xc3\x69\xb7\x78"
- "\x71\xf1\x23\xcb\x8a\x66\x3d\xfe\xc8\x92\x15\x8b\xe7\x5b\x56\x54"
- "\xac\x2f\x2f\x9b\xb5\x71\x73\x8d\x65\xeb\xa6\x8a\x9a\x8a\x0d\xcf"
- "\x49\xb7\xa3\x96\xd2\x1a\xf5\xce\xa8\x2c\xad\xae\x59\xc8\x3f\x67"
- "\x5a\xaa\x36\x95\x6f\x91\x3f\xef\x98\x4c\x91\x40\x2a\x6a\xca\x37"
- "\x59\x66\x94\xcd\xb4\x3c\x58\x5a\x51\xb9\x79\x53\x79\x4c\x58\xf3"
- "\x2d\x9b\xca\x37\x95\x97\x96\x59\x16\x5a\x32\x19\x72\x38\xb8\x30"
- "\x7e\x66\xea\xfa\xa9\x1a\xfd\x39\x6c\xe8\x01\xd6\x53\xdc\xaf\x9f"
- "\xa7\x1f\x7e\xc4\x36\x9c\xf4\x13\x0a\x39\x44\x9f\xe0\x1e\x76\xde"
- "\x7d\x76\x6c\x3f\x7e\xb7\x27\x52\x7e\xef\xa1\x48\xf9\xbd\x27\x69"
- "\x6c\x3f\x7e\x4f\x54\xfb\xbf\x27\xaa\xfd\xdf\x93\x3f\xb6\x1f\xbf"
- "\xa7\x24\x2a\x8f\x35\x2a\x8f\x6d\x54\xcf\x00\xd7\x9d\x52\x2f\xdd"
- "\xb3\x27\x2a\x4f\x6b\x54\x9e\xc3\x51\xdf\xc7\xc2\xbe\x61\xbb\xde"
- "\x73\x32\xdc\x36\xc0\xf7\x59\xbd\xad\x87\xf4\xdb\x3d\x1e\x3d\x0d"
- "\xf7\x3d\xed\x7c\x1f\x91\x4c\xfb\xc3\xf8\xb0\xb4\x03\x2a\xed\x0f"
- "\x47\xdb\x3f\xeb\x24\xde\x13\xa9\xec\xf3\x1f\xbe\xac\xe9\x36\xbe"
- "\x9f\x48\xef\x43\xfb\xc1\x8b\x5b\x2f\xd1\x3d\x57\xdb\x55\x5a\x0f"
- "\xef\x93\x15\xaf\xad\x1c\x6e\x4f\xa1\x78\xce\xcb\x7e\x32\x85\xf3"
- "\x6e\xe9\xb3\x11\x61\x09\x78\xa0\xa7\x7e\xe8\x70\x9b\x67\xc9\xbd"
- "\xed\xbb\x90\xc6\x4d\x3f\x94\xb2\xcc\xf9\x76\xc9\x7d\x7d\xb2\xbc"
- "\xab\x7c\xcf\x12\xfb\x9e\x65\xfd\xc9\xe5\xb2\xff\x56\x2e\x1b\x30"
- "\xcc\xc2\x78\xf7\x12\xcd\x0f\x67\x12\x9e\x54\xc0\x3c\xa3\xc3\x04"
- "\x3c\x39\x4f\xb4\x53\xdb\x07\xaf\xec\x9e\x1f\x7a\x75\xfb\x82\xc7"
- "\x0a\xb1\x74\x47\xec\x3d\xcf\x94\xb8\xcf\x19\xec\xeb\xae\xeb\x07"
- "\x4e\x39\xe9\x6c\x87\xba\xd2\xfc\xd4\xdb\xea\xc7\xf8\x95\x92\xe4"
- "\x78\xca\x76\x91\x5c\x1d\x7e\xe2\xf9\xe1\x35\x36\x72\xb4\x1b\x83"
- "\x7d\x62\x34\x1f\x8f\xd1\x72\xe4\xbd\x02\xbb\x38\x1c\xf9\x31\x96"
- "\xf0\xf0\xde\xe8\xf1\xee\xfb\xe2\x74\xdd\xb7\xf1\x78\x2f\xa7\x59"
- "\xb3\x7d\x1b\xda\x01\x2b\xe6\xbe\x5d\x23\xb9\x86\x9d\x39\xe8\xff"
- "\xd6\xe6\xe8\x3a\xfb\x78\x8b\xd4\x7d\x46\x84\x83\xb6\x39\x69\xe3"
- "\xd9\x29\x9a\x7e\xaf\xe2\xbd\x5f\xc3\xce\x7b\x53\xaf\x97\x96\xf1"
- "\x3e\x8e\x7a\x8b\xa6\x07\xe8\xad\xba\xcc\x38\x4d\xbf\xc6\x23\x5f"
- "\xa1\x9e\xef\xcb\xd4\x4f\x3b\xa3\xe0\x41\x5b\xf5\xaa\xb1\xe2\xfc"
- "\xdf\xbd\x22\xf7\x02\xdf\x0b\xfb\x2f\x47\x6f\x07\x37\xe0\x1b\xfa"
- "\xef\x5e\x39\x9f\xc8\xfb\x66\x78\x4c\x5d\x5d\x05\x9b\x2d\xcd\x0b"
- "\xdd\x78\x6f\xb7\x1e\x27\xe7\x89\x38\xae\x56\xf8\x8e\xa7\xf5\x73"
- "\xdc\xd9\xd1\x38\xce\xc7\x78\xdb\xfc\x1c\xee\xd5\xc3\x55\xdf\x32"
- "\xdf\x1c\xf5\x9d\xaa\x7f\xe3\xb7\x05\xb8\x34\x68\xf0\x3d\xd0\xb9"
- "\xbc\xe7\xc9\x70\x8e\xe6\xd7\xb7\xc9\x76\x33\x3f\x57\x8f\x97\x73"
- "\x6a\x6f\xf2\xda\x98\x97\x82\x29\x0f\x90\xb4\xb9\x90\x87\xef\xed"
- "\xc2\x18\xc3\x20\x46\xe4\xfe\xab\x41\x86\xc3\x6d\x46\xde\x9d\x83"
- "\x6f\xc0\x62\xbf\xdd\x1e\x96\x91\xad\x7e\x9a\x56\x75\x1f\xcf\x3f"
- "\xcf\x97\x72\xcb\x61\x0c\x97\xe1\x71\x9f\xc8\xb0\x19\x1e\xdf\x2f"
- "\x26\x86\x78\x8f\xe2\x7c\xd4\x3f\xc7\x3b\x1e\xaf\x10\xef\x0e\xa3"
- "\x65\x1c\xbe\x3d\x91\x75\xfd\x11\x45\x7d\x27\xe9\xdf\x3c\xd7\xab"
- "\x64\xef\x47\x66\x2d\x6e\xe6\xf5\xca\xe2\xf1\x2f\xd2\x14\x47\x96"
- "\xf7\xa3\xb5\x51\xf0\xab\xa2\xbe\x1d\xfa\x77\xb3\x5c\x63\xf8\x51"
- "\xa3\x5e\x86\xe4\x19\x64\xec\x50\x9d\x27\xee\x7a\xfe\x64\x91\xa7"
- "\x27\xac\xcc\x09\xf8\x3e\x13\xe2\xdf\x8f\xdc\x3a\x3c\xfc\x1e\x0c"
- "\x4b\x07\xbb\xe4\x47\x7e\x3d\x9d\x5a\xdf\x58\x90\x10\xca\xb7\x20"
- "\xed\x0b\xea\x1a\x25\xbb\x0b\xcb\x95\xec\x2e\x28\x8e\xc4\x65\xc1"
- "\xda\x30\x98\x95\x21\x5c\x16\xd8\xc2\xd2\xa1\x7d\x2e\x68\x88\x96"
- "\xd5\x6a\x1b\xcb\x38\xcb\xeb\x82\x43\x31\xe2\x7c\x5a\x5c\x77\x6c"
- "\x19\x5f\xd0\x17\x16\xae\x8d\x8f\x16\x2e\xd4\xec\x04\xd6\xcf\x5e"
- "\xbe\x3b\x4d\xf3\xdf\x2e\x65\x92\xfd\x3a\x6b\xf7\x39\x41\xae\x17"
- "\xa6\x45\xc3\xe5\x3b\x78\x46\x61\x8c\xc2\x5c\x30\xa0\x6c\xbc\x85"
- "\x05\xa1\xba\x2d\x5c\xe1\xa6\xf9\xfa\x3a\x91\x47\xcd\x0d\x2e\xc8"
- "\x1f\x6f\xdc\x81\xf4\xbb\x22\x69\xb6\xb0\x39\x44\xb3\x85\x1d\x61"
- "\x70\x0f\x87\xa5\xfb\x4f\xf8\x3e\x16\x96\xee\xc4\x17\xc9\xa6\x92"
- "\x95\x85\x9e\xc8\xb2\xee\xa3\x10\x8c\xfb\x12\x42\x65\xdd\x97\x16"
- "\x96\xae\x0f\xdf\x19\xe3\xf3\xe7\xbe\xfc\xf1\xf9\x73\xdf\xda\xd8"
- "\xfc\xb9\xcf\x16\x56\xee\xae\x2f\x6e\x57\xf7\x75\x86\xe1\xd3\x8e"
- "\xef\xae\xc8\x76\x74\xdf\x89\xa8\xef\x51\xfe\x0b\xe8\x8e\x43\xdb"
- "\x73\xe3\x38\xbc\x66\x3a\x25\xa9\x76\x76\x9f\x2f\x3c\xfe\xbd\x6b"
- "\x2a\x9e\x71\x94\x6b\x70\xbc\xbe\x29\xd3\xdd\x6f\x89\x4e\xc7\x69"
- "\xc2\xe2\x73\x75\xdc\x77\x8d\xe3\x6b\x5c\xef\xff\x5c\x41\xee\xff"
- "\xee\x5f\xa5\xd6\x6d\x16\x65\x0b\xe7\x87\x25\xe3\xf5\x65\x80\xdb"
- "\xe2\xa6\xfb\x8b\x15\x7d\xee\x87\xfc\x3f\xae\xce\xbe\x34\x2e\xca"
- "\x86\x3c\x5d\x3b\x4f\xb9\x0b\xf1\x1e\xc1\x7b\x7a\x64\xff\x7a\xff"
- "\x31\xe1\x34\x2c\x6f\x77\x46\xf7\xbb\xf7\x9f\xc1\xd8\xe3\x5a\xa2"
- "\xdf\x51\x12\x23\xce\x23\x9c\xa6\x47\xc6\x86\xe7\x72\x5f\x77\xcd"
- "\x4d\xb9\x0b\x18\xdf\xb0\x70\x8b\x70\x4e\x59\xc1\xe9\xdd\x5c\x1e"
- "\xf2\x8c\xc7\x37\xfd\x7c\x91\x92\xbd\xdc\xca\xa8\x7a\x5c\x05\xac"
- "\x4f\x54\x3d\x1e\x58\x1c\x55\xf6\xae\xd8\xf5\xc8\x6d\x45\x3d\xae"
- "\xc6\xae\x47\xae\xbc\x43\x57\x18\x51\x97\x31\x76\x47\xee\x19\xd4"
- "\xe5\xaa\xa4\x7b\x64\xf8\xa0\x3e\x4e\xb5\x5f\xc5\xf8\xdf\x48\x32"
- "\xef\xf2\xda\x10\xdf\x54\xba\x07\x52\x13\x5b\xa8\x78\x6c\x99\x0f"
- "\xcc\x14\xce\x89\xcb\xdd\xf4\x40\x99\xde\x5f\x69\xe1\xf9\x0a\x17"
- "\xd0\xc9\xc8\x74\x42\x7d\x90\x6f\x3c\x7e\xeb\xed\x53\xad\x33\x3d"
- "\x80\xf6\x9f\x5b\xa0\xf7\xe9\xe8\xcf\x3d\x3a\x1d\x11\x77\x24\x2a"
- "\xce\x17\x16\x77\x32\x22\x6e\xc7\x68\x78\xbf\x1e\xfe\xe5\xf8\xb4"
- "\x28\x35\x8a\x4f\xe0\xcf\xa2\xb7\x23\xeb\xbd\x28\x5d\xd5\x0f\x3c"
- "\x1a\x43\xeb\x45\xb9\xe0\xd1\x48\x6c\x1e\x2d\x5a\x15\x5b\xd6\x16"
- "\xc9\x3b\xbf\x45\x0a\xc5\x82\xd7\x08\xde\x8d\x48\x19\xd4\xf8\x34"
- "\x96\x3f\x8b\x8e\xea\xfc\xf9\x92\x75\xf4\x45\xd5\x31\x70\x9e\xf2"
- "\x36\xab\xba\xe6\xfd\x43\x24\xec\xbc\xa4\xd8\xb2\x98\x97\x81\x7a"
- "\x06\x62\xd7\x33\x2f\x7f\x7c\x59\xcc\x5b\x8b\xfa\x04\xc6\xca\x62"
- "\x9e\x4d\xe5\xa1\x58\x79\x9a\x85\x33\x66\x39\x87\xd9\x2e\x72\x53"
- "\x5e\x3f\xaf\xd3\x85\x85\xf7\x44\xca\x5f\x5e\x92\xcc\xc7\xf4\xf3"
- "\xab\x71\x0c\xf3\xe1\xbc\x85\x8c\x5f\x24\x93\xc3\xce\xfc\xf4\x28"
- "\x5a\x7d\x7a\x9e\xf2\xdf\x1e\x32\x1a\x1f\x54\xf4\x5a\x5c\x11\x89"
- "\x53\x7e\x6e\x6c\x7a\xe5\x97\x80\x5e\x9f\xc6\xa6\x57\x7e\xcd\xf8"
- "\xf4\xca\x67\xfe\x7f\x3a\x96\x5e\xf9\x9d\xe1\xf4\xe2\x3b\x5f\xb9"
- "\x7e\xdf\x4f\x83\x6c\x8c\xac\x11\xed\x4a\x97\x27\x25\x42\x56\x54"
- "\x9e\x41\xce\x73\x36\xd1\xa7\xe4\xc4\x72\x0b\xc5\x5f\xa2\xfc\x1e"
- "\xbd\xfd\x4f\x69\xa1\x89\x62\x64\x25\xef\xd1\xe6\x3b\x24\x92\x5c"
- "\xb6\x4f\xbb\xf9\xae\x49\x9e\x6f\x8c\x2c\x77\xb1\x25\xb6\x2e\x58"
- "\x9c\x03\x9a\x36\xc5\x08\x2f\x56\x73\xa6\x8b\x1b\x22\x75\xc4\x62"
- "\x6b\x24\x8f\x40\x37\xa3\xf4\x8e\x6e\xf8\x32\xcf\xf5\x79\xb6\xb8"
- "\x6f\x2c\xcf\x1e\xdc\xa6\xf8\xf5\xe0\x13\x51\xf8\x79\x62\xf3\xeb"
- "\xc1\xf8\xf1\xf9\xf5\x60\xfa\xf8\xfc\x7a\x30\x97\xf9\xe5\xa6\x07"
- "\x6d\x91\xfd\xc6\x83\x25\x91\xf5\x45\xb9\xc8\x27\x8c\x13\x6e\xe2"
- "\xef\x2f\x5b\x6f\xfd\x61\x1d\xc7\xbc\x6a\x87\x7d\x05\xfc\xa7\x33"
- "\x8e\x5f\x15\xc6\xb8\xb0\x41\xc3\xc6\xed\xe3\xde\x4b\x92\xd0\x8b"
- "\x71\x25\xef\xcf\x93\x77\x44\xd3\x8f\x8b\x82\x46\xc3\x7c\xfc\x36"
- "\x9e\xa7\x25\xdf\x0e\x1a\x4d\x0e\xde\x4b\x26\xcf\xe6\xc9\xf5\x89"
- "\x1f\x97\x85\xf3\x82\xf7\x94\xf1\x5c\xf4\x5e\x35\xcf\xf9\x27\xe4"
- "\xbf\xa8\xf8\x52\x70\x35\x92\x8e\x3f\x6e\x88\xcd\x97\x1f\x77\x80"
- "\x2f\x7f\x8a\xcd\x97\x1f\x1f\x1b\x9f\x2f\x3f\xe6\x31\xe9\x9f\xc6"
- "\xb6\xa3\x1f\x7b\xb4\x76\xb4\x93\xf3\x58\x36\xb0\xbd\x5a\x50\xca"
- "\x69\xf0\x1b\x6d\xa4\x40\xde\x49\x35\x6b\x50\x6f\x47\x9c\xa7\x80"
- "\xc7\xff\xb2\x7c\x2d\x8d\x45\x83\x11\x06\xb7\xa0\x20\x71\x30\x56"
- "\x3b\x29\x58\xcb\x69\x67\x57\x11\xef\xeb\x2d\x39\xc8\x30\x36\x11"
- "\x01\xc6\xdf\x72\x3a\x0e\xe7\x3b\x1d\xc2\xd2\x37\xea\xe9\xe4\xbc"
- "\xa8\x4a\xdb\xc0\xf7\x92\x73\xba\x28\xd8\x5a\xfd\x27\xca\x7e\x84"
- "\xd3\xcb\x7b\xd0\x23\xd3\xb8\x55\x7b\x5c\x92\x1e\xd9\x1e\x0b\x7c"
- "\x91\xf2\xf9\x63\x5e\x9f\x48\x0c\x42\xcf\xe1\x77\x61\xc0\x69\x98"
- "\xff\xf5\xb4\xcd\x25\x35\x51\x6d\x13\x32\xf0\xd0\xcd\x4a\x06\x96"
- "\x5c\x8e\xc4\x75\xc9\x9e\xd8\x32\xb0\xe4\xd0\xf8\x32\xb0\xa4\x7b"
- "\x7c\x19\x58\x72\x96\x65\xc0\x4d\x0f\xa5\x46\xb6\xcd\x25\xde\xc8"
- "\xba\xa3\x5c\xd9\x36\x29\xf9\xab\xb4\x4d\xd8\x42\x37\x8d\xd7\x0e"
- "\x35\xfb\xdf\xc0\xf7\xb4\x7d\x05\x9a\xa9\x7b\x87\xe8\xa1\x4e\x5e"
- "\x43\x82\x8e\xb7\x32\x0d\xdb\xe4\x18\xed\xa1\x63\xe1\x74\xdc\xab"
- "\xc6\x5a\xf6\xf3\xf4\xf0\x03\xbc\x67\x4f\xd1\xb3\x70\x52\x64\xfd"
- "\x1f\x3a\x1b\x9b\x9e\x0f\xf1\x3a\x85\x3d\x36\x3d\x1f\x4e\x1a\x9f"
- "\x9e\x0f\xcf\xe4\x33\xe0\x63\xdb\xd4\xc3\xf9\x7c\x07\xa7\xde\x37"
- "\x5d\xa2\x87\x0f\x7e\xb9\xfe\xe9\xe1\xda\xc8\xfe\xe9\xe1\xb2\xaf"
- "\xde\x3f\x3d\xdc\x1d\xbb\x7f\x7a\xb8\x2f\x76\xff\xf4\xb0\x47\xb5"
- "\x87\xc2\x8c\xc8\xf6\x50\x18\x1f\x29\x13\xa0\xdd\xd7\xd6\x3f\x15"
- "\xda\xa2\xda\xc0\x3e\x94\x77\x15\x36\xc5\x6e\xc5\xb7\xa2\xf7\x23"
- "\x71\x2c\x6c\x8e\xcd\xb7\xc2\xc3\xe0\xdb\xbe\xd8\x7c\x2b\x3c\x31"
- "\x3e\xdf\x0a\xfb\xc1\xb7\x7d\x63\xf9\x56\xe8\xff\xea\x36\x45\x51"
- "\x66\x24\xcf\x8a\xd2\xbe\x3a\xcf\x8a\x6a\x62\xf3\xac\x68\x4f\x6c"
- "\x9e\x15\x1d\x52\x3c\x2b\x3a\x1b\xc9\xb3\xa2\x63\x91\x3c\x03\xdd"
- "\xbe\x36\x9e\x2d\x9d\x19\xc5\xb3\x8d\xe7\x69\xe9\x6f\xc0\xb3\xd3"
- "\x8a\x67\xcb\x9e\x8f\xc4\x71\x69\x41\x6c\x9e\x2d\x5d\x0b\x9e\x6d"
- "\x8c\xcd\xb3\xa5\xb5\xe3\xf3\x6c\x69\x0b\x78\xb6\x71\x2c\xcf\x96"
- "\x1e\xf9\xea\x3c\x5b\xda\x1f\xc9\xb3\xa5\x27\xbf\x3a\xcf\x96\x65"
- "\xc4\xe6\xd9\xb2\xdc\xd8\x3c\x5b\x56\xa2\x78\xb6\xac\x31\x92\x67"
- "\xcb\xaa\x22\x79\x06\xba\xfd\x3b\x79\x06\xfe\xe4\xa8\xfd\xba\xcb"
- "\xf8\x7e\xdc\x89\xc3\xce\x65\x03\x6e\x2a\x3e\xa2\xd6\x04\x8a\xa5"
- "\xec\x68\x3c\x7c\x0f\x69\xce\x8e\xed\xbb\x8b\xcd\x5a\xd8\xe3\x63"
- "\xf9\x50\x6c\x41\xbf\x3a\xd8\x53\x2b\xf7\x75\x29\x1e\x32\xcd\x91"
- "\x4e\xcd\x91\x15\xe7\x72\x5e\xf0\x58\xb8\x7c\x7e\xe2\xbe\x18\xe9"
- "\xbd\x0c\x87\xfd\x95\x44\xc1\xaa\xfc\x2a\x76\xd9\xf8\x7b\xcc\x17"
- "\xe5\x74\xd7\xcd\x05\xbc\x9f\xd4\x2b\x59\x2d\x8e\xb6\x7f\xdb\x11"
- "\xf7\xa8\x92\xd3\xe5\x51\x73\x26\xc5\xe3\xd8\xbf\x3f\x61\xfb\xb7"
- "\x3d\xb6\x9c\xfe\xe4\x3a\xf6\xef\x4f\xd8\xfe\x6d\x0f\x1b\xaf\xa6"
- "\xac\xf6\xbb\xa3\xc6\xab\x3f\x29\x4b\xf4\x2a\xd9\x91\x76\xec\xfe"
- "\x45\x39\xc3\xce\x9f\xec\x89\xc2\x19\xbc\x79\x64\x92\x86\x73\x14"
- "\x7f\x7e\x72\x68\x1c\x9c\x8f\x01\xe7\xf7\xc6\xc1\xb9\xef\x3a\x38"
- "\x73\xdf\xfc\xde\xd8\xb6\xf5\x48\x82\x26\x07\x31\xc6\xe5\x8f\x64"
- "\xc4\xe6\xff\x23\x51\xfc\xa7\x92\x9a\x5a\xe1\x91\xf9\x23\xd3\x59"
- "\xc3\xd3\xf1\x5e\x7d\x4e\xcb\x32\x12\x23\x6d\x73\x34\xcc\x71\xd2"
- "\x1d\x1b\x23\x7b\x7c\xb6\x20\xa6\xec\x3d\x32\xa0\xda\xe3\xf2\xdc"
- "\xc8\xf6\xb8\x9c\x22\xdb\x23\x68\x1d\x91\x6f\xb9\x25\x32\xbe\xd8"
- "\xf3\xf5\xe9\xd8\xe5\x8d\x51\x32\xf0\xe1\x79\x5a\x71\xa3\x92\x81"
- "\x15\xe5\x51\x78\x74\xc6\x96\x81\xe5\xdd\xa8\xff\x87\xb1\x65\x60"
- "\xf9\xd9\xf1\x65\x60\x39\xef\x21\xfe\x30\x5c\x6e\x97\xd7\xe6\x4e"
- "\x8c\x4c\xb3\x62\x5a\x6c\x9d\xb7\x22\x3b\xf6\xbc\xce\x8a\x42\x45"
- "\xe3\x15\xbb\x22\x69\xbc\xa2\x2c\x92\x86\xa8\xcb\xbf\x9f\x86\xa3"
- "\x7e\xc3\x86\x9d\x2b\xa2\xdb\xbf\xeb\x3c\x3d\xaa\xb5\xff\xc7\x8a"
- "\xa2\x70\xd4\xc6\x3f\xb1\xe6\xb2\x1e\x4d\x00\x2d\x5d\xb1\x69\xf9"
- "\x68\x46\xec\x3a\x3f\x9a\x8b\x3e\xc8\x15\x1c\xd3\x96\x1e\x2d\x41"
- "\xf8\x72\x79\x77\xe4\x55\x4a\x6a\x43\xf8\x72\x3f\xc5\xcb\xfe\x6a"
- "\xb4\x5f\x7a\x94\x7d\x0a\x09\x39\xc7\x0c\xf9\x4d\x9c\x46\xc5\xdc"
- "\x07\x31\x5e\x6b\x6a\xa3\xd7\x44\x1f\x95\xf3\x1f\xbc\x8f\x85\xcf"
- "\xd5\x24\xda\xa8\xd8\xe5\xf5\x93\x2e\xef\x9c\x3e\x0a\x76\x1f\xb7"
- "\x0b\x4e\xaf\xa7\x55\x73\x9d\x8e\x28\xdd\xf4\x18\xc5\xe6\xf1\x63"
- "\x69\xe3\xcb\xce\x63\xd9\x8a\xcf\x8f\x59\x23\xf9\xfc\x58\x61\xd0"
- "\x39\x65\x05\xd7\x15\x32\xf0\x95\xda\x09\xaf\x9d\x8e\xab\xef\x77"
- "\xae\xec\xab\xaa\xa3\xef\x5d\xa0\xc7\x4e\xcb\xf2\x8c\xc2\x97\x58"
- "\x6f\xa0\x1e\xa9\x03\x1e\x9f\x21\xf1\x44\x9a\x35\x7e\x32\x8a\x9d"
- "\xeb\xfa\x38\xae\xdd\x29\x7c\xf2\x6e\x4c\xa7\x38\xcd\xfe\x7e\x20"
- "\x0b\x37\x9d\xa3\xc7\x3e\x89\xc8\x8f\x5e\xcf\xa5\x60\xa4\xab\xf9"
- "\xfd\xc7\x2d\xfa\x3c\xfc\x78\xf3\xfb\x48\x93\xaf\xef\xfb\x55\x6b"
- "\x61\x8f\xe7\x8c\xdb\x2f\x03\x27\x3e\x3b\xce\x38\x5d\x5f\x0f\x3c"
- "\xde\xa2\xcb\xaf\x5a\x9b\x7b\xbc\x33\x74\xb6\xe5\xf1\xa3\x88\x5b"
- "\x75\x9d\xf9\xdc\xb0\x76\xf0\xb8\x3b\x1c\x8e\xf2\x9d\xf7\xb8\x57"
- "\x3f\x9f\x32\xec\x2c\xa1\x2f\x80\xa5\xe1\x53\x92\x11\x89\x4f\x49"
- "\x0e\x6c\xcb\x55\x1a\x8c\xfc\x2f\x80\x91\xea\x3a\x34\x9f\x66\x07"
- "\xc9\x74\x81\x9e\xdc\xdf\xcc\x7b\x74\x5a\x07\x28\xc1\x4f\x66\x35"
- "\xb6\x2b\x79\x9d\xcf\x86\xf0\xd8\xd0\xe5\xbf\xbf\x9b\xd7\xe0\xe4"
- "\x1e\x82\xb4\xfb\xbb\x4f\xd9\x02\x9a\x6f\xb3\x92\x77\x99\xa6\xa7"
- "\xac\x9f\x76\xb7\x1e\x10\x03\x07\xa5\x4f\xab\x92\x88\xf1\xdf\x1e"
- "\xde\xff\xc3\xfb\x30\xea\xe8\xfe\xf3\xf4\xc4\x03\xaa\xad\x3f\x19"
- "\x65\x93\x96\x8c\x33\xfe\x2b\xe1\xf1\xdf\xfd\xb1\xdb\xf9\x13\xd7"
- "\x19\xff\x3d\xc1\xe3\xbf\xfb\xc3\xfb\x4d\xb5\xce\xf3\x44\x7e\xb8"
- "\x4d\xca\x7e\xa7\x2c\xcf\xb2\x9d\xf9\xc4\x7f\xbc\xab\x99\x92\xfc"
- "\xbc\xa6\x8d\xb6\xe9\x1a\xe8\xe1\xf6\x9a\x74\xca\xd3\xc5\x7e\x18"
- "\xe2\xf9\x4e\x6f\xd5\x97\x71\x7b\x7d\x42\xce\x17\x26\xfa\x55\x5b"
- "\xb4\xdb\x84\x67\x66\x3f\x64\x68\xa3\x55\x87\x55\xb3\xc3\xaa\xce"
- "\x7d\x4c\xe9\xa7\x89\xae\x01\xd9\x2f\x1a\xd8\x5e\x95\x76\xab\xff"
- "\x32\x31\xdc\xe3\xb5\xa7\x88\xe1\x06\x47\xfb\x49\x09\xbb\x9f\xdb"
- "\x38\xc3\x64\xd8\xbd\x48\xc7\x70\x39\x9d\x5e\x0f\x75\x36\xe6\xc9"
- "\x84\xf0\xba\xcb\xf9\x17\x94\x8d\xf0\x25\x3c\xaf\xe2\xe2\x7c\xf6"
- "\x95\x62\x76\x3f\xaf\x99\x7d\xda\x2d\xec\xeb\xc4\xec\x4d\x3c\x27"
- "\xf6\xa4\xbc\xa7\xf7\xbd\x7f\x75\xc7\xd5\x4c\xa7\x78\x2d\x6c\x45"
- "\x8f\xc5\x07\x79\x7b\xb2\x25\x52\x47\x3c\x19\x65\xff\x96\xc8\x71"
- "\x26\xde\x95\xbc\x3f\x51\xdb\xbf\xca\xfa\x40\xb8\xfc\xc3\x52\x3e"
- "\xae\xb7\xa7\x82\xd7\xa4\x79\x4f\x94\xf2\xab\xf6\xa4\x3b\x6a\xee"
- "\xcd\xb3\x57\xee\xab\xf9\x23\xca\x5d\xb9\x5e\xc9\xc8\xaa\xf5\x91"
- "\x3c\x5d\x49\xf6\x8b\xbc\x16\xa4\xfa\x83\xd5\xfe\x68\xfd\xb8\xd2"
- "\xa2\xdb\x6e\x51\xe1\x39\x7a\x7f\x60\xd9\x20\xe1\x46\xf5\x33\x2b"
- "\xa5\xfd\x1f\x18\xd3\x2f\xac\xac\x42\xfd\x22\x64\xb2\x57\xca\xd0"
- "\xca\x86\x53\x5e\xc8\xcd\x26\x96\xff\x55\xbc\xf7\xa5\x9e\xcf\x1c"
- "\xe2\x7b\xe2\x25\x5a\xd9\x15\x70\x52\xfc\x29\x8f\x3c\x53\x95\x04"
- "\x19\x91\x72\xcb\xfd\xc6\x1c\xb5\x1f\xc9\x1b\x55\xc6\x19\x9d\xe6"
- "\x9c\xa6\x77\xd3\x1f\xb5\xfd\x14\x2c\x0b\x2b\x3b\x79\x6f\xc6\x94"
- "\x41\x9a\xc8\xb0\x74\x19\x72\xf9\xfb\xa8\xd7\x1f\x3d\xe6\x59\x35"
- "\x2d\x76\xdd\x57\x71\xff\xdf\xe4\xa6\x55\x7b\x22\x79\xbb\x4a\xf6"
- "\xff\xfa\xba\x8e\x1b\x34\x88\xca\x57\x19\xc9\xfb\x95\xb2\xbc\x71"
- "\xf7\xf8\x34\x2e\x5a\x80\xf1\xcc\x1a\xaf\xdc\xef\xb5\x0a\xed\xff"
- "\xc9\x63\xd7\xd3\x83\x22\x69\xd1\x82\x20\xd2\x6a\xfb\x82\xa1\xb7"
- "\x56\x79\x22\xe6\x8c\xa6\xca\x39\xa3\x35\xe7\xe9\x29\x6d\xed\x67"
- "\xf5\xdd\x91\xf8\x3d\x95\x30\xbe\x6d\xf0\x14\xaf\xff\xac\x89\xad"
- "\x33\x9e\xca\x8f\x6d\x1b\x3c\xb5\x4a\xd3\x0b\x6b\x44\x72\xb4\x1c"
- "\x3c\x65\x03\x8f\x65\x1e\x7d\x0c\xcb\x73\xa1\xe3\x8f\x61\x9f\xea"
- "\x1c\x1d\xc3\x6e\x62\x7d\xf0\x54\xe3\xe8\x18\xd6\x13\x6b\x0c\xeb"
- "\x8e\xc1\xcf\xa7\x06\x63\xf3\x73\xb5\x39\xf6\x18\x76\xf5\x34\xd5"
- "\xcf\xaf\x2e\x8e\xe4\xf3\xea\xec\xd0\x9a\xf0\x53\x09\x5f\x9f\x3d"
- "\xbc\xba\x63\xac\x3d\xbc\xe6\xbb\x8a\x57\x6b\x9e\x8a\xc2\xad\x2b"
- "\xb6\x6e\x5f\x7d\x7a\x7c\x7b\x78\xf5\xe0\xf8\xba\x7d\x4d\xfc\x58"
- "\x7b\xd8\x32\x21\x2a\xcd\xcc\x51\x5b\x29\xc2\x36\x5b\x93\xaf\xe8"
- "\xb4\x86\xed\x39\x53\x58\xfa\x55\x91\xf2\x0e\x9c\x01\x0f\xba\xed"
- "\x02\xeb\x34\x5d\x66\xc6\xa3\x09\xfb\x5e\xfa\x7e\x33\x4d\x42\x1b"
- "\xf8\x70\xd8\xb9\x66\x54\xfe\x79\x1f\x1f\x97\xc3\x3a\x72\xdc\xfd"
- "\x74\x46\x1d\x3f\x89\x47\xff\xf5\xd6\x4b\x4d\x69\x54\xfc\xca\x18"
- "\x7a\xac\x95\xf6\x1f\xc3\xb8\x3e\xcf\xd6\xae\x88\x6a\x63\x5e\xb5"
- "\x0f\xb7\x74\xba\xe2\x5b\x69\xd4\x58\x76\x6d\x95\x3c\xd3\x37\xae"
- "\xbe\x5d\xdb\x18\x5b\x46\xd7\x76\x8e\xea\xdb\x4d\x0c\x77\xed\xc7"
- "\x51\xf1\x27\x14\x0f\x4a\x2d\xc1\xe4\xf0\xb9\xee\xb5\xee\x48\x9d"
- "\xb4\xf6\x44\x64\xbe\xd2\xa8\xf1\xdf\xda\x2a\x8e\xff\x72\xfd\x4d"
- "\x69\xf1\xf8\xfd\x4d\xe9\x47\xaa\xfe\x4f\x47\xad\x2f\x97\x56\x5d"
- "\xbf\xbf\x29\x1d\xa7\xfe\xa5\x9d\x91\xfd\xcd\xd3\x51\x6b\xf4\xa5"
- "\x27\x62\xf7\x37\xa5\x6e\x5d\xcf\x28\xbd\xf1\xf4\xbd\x5f\x4e\xdf"
- "\x3c\x9d\x16\xa9\x6f\x9e\xa6\x2f\xd2\x37\xc7\xc7\xe8\x9b\xa7\x57"
- "\x25\xb6\xc6\xaa\xcb\xd3\x35\xb1\xf5\xcd\xd3\x7b\x14\x0f\x9f\xee"
- "\x8f\xd4\x37\x4f\x1f\x8a\xe4\x61\x69\x14\x0f\x9f\x8e\x5a\xff\x2e"
- "\xad\xfa\x1f\xd5\x49\x26\x93\xc9\x68\x32\x18\x0d\x26\xe2\xcb\xa9"
- "\x0c\x34\xd1\x64\x36\xc5\xe1\x99\xa0\xbd\x27\x1a\x4d\x46\x33\x9e"
- "\x38\xed\x3d\x21\xea\x7b\x22\xe7\xc5\x63\xd6\xde\x71\x51\xdf\x13"
- "\xbe\x20\x7e\xa2\x56\xae\x5e\xbe\x39\xea\x3b\xee\x0b\xe2\x27\xfc"
- "\x3b\xf3\xd3\x98\xef\xc8\x73\x90\x4b\x36\x6c\x29\xad\xac\x28\x93"
- "\xfb\xda\xcb\x2d\xa5\xcf\x3c\x53\x5e\x5d\x6d\xa9\xd9\x68\x59\xf4"
- "\xc0\x23\x73\xe7\x5b\xd4\xf6\xf8\xca\x85\x33\xca\x26\x53\xd1\xd6"
- "\x4d\x1c\x51\xb4\x7c\x49\x89\xa5\x78\xd1\x03\x91\x91\x3a\x18\xb9"
- "\x0d\xfe\x7a\x50\xc2\xda\x5e\xee\x4b\x53\x89\xf6\x1c\x90\x7a\xa7"
- "\x9f\xcf\x9e\xab\xf1\x44\xc5\x03\x27\xf9\xfc\xf2\x35\xbb\xe0\x73"
- "\x15\xe7\xa8\xec\xcf\x5c\x89\x59\x1d\x0e\xaa\x7a\x9a\xfd\xa9\x94"
- "\x1b\xc4\x07\x1e\xb2\x3c\x44\xc6\x73\xb4\xe1\x27\x3d\x05\x48\x8b"
- "\x6f\x97\xdb\x4f\x16\x3b\xdb\xb6\xd6\xcf\x10\x67\x10\xf7\x05\x11"
- "\xe6\xd5\xce\xe7\x5b\x0d\x32\xec\x03\x87\x9e\x2e\xf1\x3c\x95\xbf"
- "\x2d\x3e\x10\xf2\x9b\x7d\xd6\xa8\x74\xe5\xdb\x84\xb1\x2c\x87\xf5"
- "\x42\x6b\x0a\x99\x79\x5f\xf6\xeb\x29\x14\xff\xfa\x54\xf6\x65\x5b"
- "\x5e\xa9\xef\xcb\x7e\x09\xdf\x6e\xda\x50\xcc\x65\x73\xda\xa0\xb1"
- "\xec\x69\x4e\xdf\x16\x99\xbe\x35\xb4\x8f\xbb\xbc\xd2\x88\x74\xcb"
- "\x3e\xa6\xc4\xc4\x80\xf8\xcc\x97\x92\x53\x35\xbb\x00\x76\x1a\x58"
- "\x71\xd2\xef\x20\x75\x36\xaa\xfc\xcf\xdb\x02\xc2\xcf\x3e\x13\x8a"
- "\x06\xed\x62\xdf\x7a\x32\xa3\x3d\x1b\xba\x37\xf1\x59\x8a\xf2\x93"
- "\xed\xe5\x64\x46\xfd\xa7\x5d\xa0\x67\xfd\x96\xa5\xb0\x1b\x8b\xc8"
- "\xfc\x8f\x36\x3e\xef\x9a\xf7\xf3\xbd\xff\x85\xcc\xbf\xbe\xe6\x30"
- "\x5e\x13\x69\x54\x5b\x23\x06\x04\xfb\xb7\xf6\x0a\x1f\xef\xb7\x3d"
- "\xb9\x36\xc0\x69\xb6\x0f\xdb\xd3\xa8\xb7\xc6\x4b\x3b\xce\x0a\x5f"
- "\xc3\x7f\x51\xfe\x2a\x4e\x0d\x7a\xf9\xfc\x6c\xfc\x8e\x22\x32\x9d"
- "\x2f\x21\xe3\x29\x6b\x0b\xb9\x56\x79\xa9\xf6\xac\x18\x38\xb9\xf6"
- "\xcf\xd4\x6b\x3d\x42\x6b\xfa\xc8\x78\xb2\xff\x23\x92\x3e\x9a\x9b"
- "\x7e\xdd\x51\x77\x99\xd2\x76\x54\x70\xd8\x65\xda\xbe\x83\x6e\xdc"
- "\xfe\xcf\x3c\x0e\xea\x43\x39\x17\xe9\xc9\x33\x64\x00\x3c\xe3\x0b"
- "\x1f\x51\xda\x0b\x4f\xf0\x39\xf3\x5c\x6a\xad\xa3\x34\x61\xcf\x48"
- "\xb8\x66\xcf\x48\xba\x26\x32\x52\x86\xed\x19\xa9\xbd\x55\x48\xdf"
- "\xff\x3e\x4d\xe9\xa3\xd4\x0f\x2e\xf4\x19\x5b\x3e\xa7\x69\x5c\xa7"
- "\xf3\xa8\x5b\xeb\xe7\x48\xdf\x54\x5f\x1c\x44\xde\xf0\x3c\xfe\xe4"
- "\x7a\xab\xab\xc4\x47\x41\xc0\x6a\xb9\x46\xd3\x5a\xaf\x51\x5a\x70"
- "\x7f\x7d\x31\xe7\x1b\xa4\xe7\xae\xba\x4e\x12\xd5\xee\x10\x81\x91"
- "\xa6\xdc\x2a\xe8\xc3\x89\xef\x3d\xdd\x65\x76\x9d\x1c\xa4\x53\xde"
- "\x6b\xd4\x4b\x7f\x24\x97\xed\x2f\xdd\xbf\x7e\xba\x2b\x0e\xf6\xa4"
- "\xa1\x7b\x3b\xef\x81\x57\xb2\x63\x3f\xc5\xfe\xf3\x1c\xb4\xaf\x8e"
- "\x12\xaa\xb6\xd3\xc4\x0b\x08\x97\xba\xa7\x71\x9e\xcd\xe5\xff\x4b"
- "\xf7\x76\x79\x1e\x7c\x43\x71\xdd\x29\x32\xf5\x7a\x5b\xf8\xdc\xb1"
- "\x31\x90\xf2\xeb\x0e\x97\xf7\x34\xb9\xaa\xfe\xd4\x1d\x4c\xfa\x75"
- "\xc3\x9e\x20\xc5\xff\xe6\xca\x69\xa3\xcb\x7c\x85\x5c\x25\x5e\xfa"
- "\x10\x65\x8b\xa6\x5f\x1f\x86\xce\xca\xed\xf5\xfa\xd8\xff\x4e\xa6"
- "\x18\x4a\x9b\xbc\x6f\x13\xcd\x6c\xfb\x9c\xd2\x0f\x7e\x4e\x19\x62"
- "\x38\xc3\xc8\x67\xbc\xd9\x5f\xda\x41\xbc\x13\x30\x06\x43\xdd\xe5"
- "\x59\x6f\x91\xac\x9d\xf5\x1e\xc9\xa0\xf6\x6b\xa1\xb3\xde\xd7\x86"
- "\x42\x67\xbd\x21\x53\x55\x7c\xde\xdb\x4d\xcf\x99\x13\x4f\xd2\xc4"
- "\x73\x54\x9e\xc1\xf2\xbd\xef\x12\x99\x77\x5e\x22\x9a\xed\x30\xf2"
- "\x38\xd3\x0c\xd9\xff\xb3\x0b\xbc\xe1\xdf\xe7\xc8\xda\x8a\x77\x02"
- "\x1e\x8c\xe7\xac\xd2\x57\x45\xbf\x26\xc7\x08\x33\x22\x6c\x37\xde"
- "\x26\xbc\x77\xd8\x5b\x85\x47\x34\xe6\xb3\x0f\x9a\xc9\x2c\xcf\xea"
- "\x7c\x79\x7e\xc1\xb0\xd3\x5a\xe3\xa6\xfd\xb5\xba\x5c\x2b\xfd\x5e"
- "\x5e\xf5\xe1\xb9\x8b\xec\x47\xdd\x23\xf1\x1a\xb1\x1a\xd8\xa7\xba"
- "\x16\xce\x38\x7c\xc4\xe5\xa2\xfc\x6e\xbc\x13\xd5\x18\xd4\xba\x42"
- "\xcf\x3b\x34\x62\xe5\x32\xff\x19\xe1\x42\x0f\x47\xbd\xcd\x1c\xf7"
- "\x37\xe7\x2e\x1a\x55\x9a\x0c\x23\x60\xfa\x34\xf8\x68\xfb\xe5\xa9"
- "\xdc\xc6\x87\x8c\x89\xe2\xf8\xda\x6c\x6a\x3d\x20\x4e\x1e\x3c\x20"
- "\x7a\x54\xdb\xab\x48\x73\x53\x53\x37\xe3\x88\x3e\xbc\x67\x0f\xe2"
- "\x8e\x5b\x88\x98\x2e\x3d\x65\xbc\xbf\xb4\x22\xc7\x4d\x37\xa4\x87"
- "\xd7\x41\x38\x9f\x49\xe3\x7e\xf4\xaf\xeb\x4e\xc4\x41\x07\xa4\xf5"
- "\xf6\x0f\xd2\xaf\xaf\x0d\xc4\xd9\xff\x40\x46\x97\xff\x1c\xcd\x49"
- "\xa5\x34\x9e\x93\x69\x3f\x20\xdc\x78\x0f\xe0\x19\x84\xbc\x7c\xf7"
- "\x02\x55\xec\xbe\x2b\x95\x52\xff\xc9\x46\x9a\x7e\xaa\x38\x18\xa6"
- "\x9f\x66\x9c\x72\x77\x85\xe9\xa6\xf5\xff\x3c\x56\x37\x55\xfe\x67"
- "\xa5\x9b\xd0\xf6\xa5\x2e\x0a\xb8\xb5\xf0\xf7\xa3\xc2\xb5\xf3\x2b"
- "\x95\x6f\x46\x85\xfb\xb4\xf0\x97\xa3\xc2\x3d\x2a\x7c\xdd\x29\x5d"
- "\xf7\xf5\x32\x1e\x5b\x59\xf7\xad\xfb\x2d\xeb\xbe\xde\xb5\x9a\xee"
- "\x93\xfa\x67\xdd\xab\xe2\xaf\xa0\x8b\xb6\xb0\xbe\x59\xb7\x9e\xf1"
- "\x17\x1f\x90\x8e\xfb\x24\x84\xcd\xe2\xb0\xc6\x3f\x92\x19\x8f\xae"
- "\xf7\xec\xac\xf7\x58\xe7\xb1\xee\x7b\x63\xaa\xe8\x7b\xe3\x80\x38"
- "\xd3\x2a\xfd\x42\xff\x74\x54\xff\xfd\x02\x61\x7b\x10\xf6\x0b\xc4"
- "\xb3\x1e\x64\x9a\x9c\x2a\xe9\xe2\xb9\x81\x7e\xc8\x73\x43\xd0\x98"
- "\x49\x7b\xc1\x6f\xf6\x7f\xb5\x0b\xf4\x4d\x34\x50\x95\xab\xc6\x2b"
- "\xcf\xa1\xb0\x0f\xf2\xde\x9a\x7e\x6e\x77\x53\x77\x06\x79\x9e\xe2"
- "\xcf\x54\xe7\x15\x17\xf8\xac\x0a\xe3\xb0\x66\xdb\x43\xec\x4b\xdb"
- "\xd0\x63\x25\x62\xbf\x04\xac\xb3\x81\x8b\xb9\x11\x38\x29\xff\xbf"
- "\xeb\xd2\x61\xc9\x14\x28\x5e\x6f\x28\x66\x7f\xfd\xe7\xe8\xa7\x56"
- "\xe1\x84\x7e\x44\xdd\x12\x03\x0e\x62\xdf\x2c\x68\x63\xec\x4f\xcb"
- "\xfa\x86\x31\x68\x6d\xd4\xfd\xb3\xf0\xdd\x0d\x48\xe3\xea\xf3\x11"
- "\xe3\xec\xa6\x9f\x1e\x3d\x55\xdb\xc5\xf9\x4b\x98\x36\xc2\x69\xd7"
- "\x61\x18\x24\x0c\xa3\x9c\xbb\xb5\xba\x69\x5d\x81\xb2\x6f\x72\xab"
- "\x4e\xad\xf2\x10\xeb\x7d\xd7\x00\x60\xd4\x9e\x53\x30\x00\x4b\xa0"
- "\x0f\x88\x88\xd3\xe0\xdf\xb8\x43\x7c\x06\xf8\xe9\xcc\x2f\xf6\xd3"
- "\xc5\xfb\x94\x40\x97\x04\xf6\xd5\xa0\xec\xd0\x9f\xfe\xa6\xfd\x8f"
- "\x44\x9a\xaf\x31\xc8\xdb\x4f\x0f\xb3\x2f\x2f\xf6\x2f\x76\x3d\xdf"
- "\x62\xa0\x51\xba\xee\x5f\x2c\xb8\xf5\xeb\xf5\x2d\x06\xd8\x69\x6d"
- "\x46\x71\x04\xf8\x1f\x66\xff\x62\xc0\x3f\x81\xe5\x50\xab\xd3\x91"
- "\x57\x9f\x64\x9a\x57\x78\x39\x6c\x9f\x53\x9c\xd0\xf9\xcf\xf5\xe5"
- "\xba\x20\xae\x4f\xd9\x87\xe2\xb4\x9b\x2a\x8f\x70\x3c\xc2\x7a\x38"
- "\xfd\x1c\xe8\x31\x17\xfa\xb0\xf7\xce\x05\x8c\xfb\xb6\x93\x59\xe9"
- "\xb4\xf5\x7f\xe0\xfc\x4a\xa7\xad\x77\x84\x74\xda\xfa\xcd\x4a\xa7"
- "\x29\x1a\x2b\x9d\xb6\xbe\x42\xe9\xb4\xf5\xa5\x72\x3f\x11\x74\x1a"
- "\xc7\xb1\x5e\xd3\x75\xda\xc1\xa9\xe2\x04\xeb\x8e\x61\xe7\xfa\x62"
- "\x5d\xb7\xbd\x8c\x30\xd6\x1d\x8c\xa3\xd2\x53\xeb\x3a\xc5\x7f\xcb"
- "\x20\xb5\x5f\x93\x7f\x5b\xd9\x7f\xc6\x80\xf6\x1b\x7c\x59\xff\x3b"
- "\xa5\xe3\xd6\x1f\x0a\xe9\xb8\xf5\x19\xa1\xbc\xac\xe3\xd6\xff\x47"
- "\xa5\xe3\x54\x78\xfb\x93\xac\xe3\xd6\x75\x32\x0d\x34\xf8\x46\x5e"
- "\x47\xd3\xd2\x83\x8e\x15\x47\xc2\x75\x5c\x64\xfb\x5a\xef\xd7\x75"
- "\x1c\xeb\xb6\x61\xe7\x86\x04\x37\x4d\x96\xfe\x51\xb8\x9d\x35\x83"
- "\xe6\x7a\xbb\x63\x1e\x70\x9d\xd9\x2f\x3f\xd3\x2d\xef\x22\x4d\xd4"
- "\xfc\xd6\x68\xf5\xde\x50\xa0\x9f\xd1\x74\xd3\xfa\xb1\x3e\xcd\x28"
- "\xe4\x97\x0c\xbc\xbe\x95\xfd\x39\xba\x1c\xe7\xc8\xd5\x22\x1c\xbd"
- "\xfe\xb3\x14\xdc\xb9\xee\x63\xe6\x2b\xc6\x1b\x3f\xe2\x37\xeb\x1d"
- "\xf4\xa3\x2f\xad\xf1\xca\xf9\xfb\x8f\xf7\x19\x11\x67\x8b\x88\x7b"
- "\x9b\xcb\xe0\x79\x45\xfc\xae\x1a\x6f\x1e\xe1\x2b\x94\x75\x79\xfc"
- "\xb2\x36\x26\xcb\xb2\x60\x4b\x61\xdc\x93\x7c\x89\x36\xc8\x35\x34"
- "\xe9\x93\x39\x26\xac\x8d\x0f\x68\xf1\xa6\x71\xe2\x4b\xbf\x20\x7f"
- "\xfd\x17\xe4\x7f\x93\x75\x10\x9f\xc7\x0b\x38\x23\xe1\x4c\xf1\xeb"
- "\xe9\x2e\x70\xba\x3f\x68\xeb\x20\x1f\xdb\xa7\xcb\x71\x59\x9a\x0e"
- "\x93\xe5\x6e\x2f\xd2\x49\xff\xb5\xd0\x91\xf9\xdb\x88\x7d\x07\x87"
- "\xe5\xad\x8a\x0b\xd1\x77\x63\xd7\x75\xe6\x69\x12\x5c\x2d\x24\xef"
- "\x7e\x39\x0e\x5b\x94\xcf\xd2\x34\x8f\xae\x3d\x54\xad\x82\xbe\x5c"
- "\x2b\xcf\xad\xa9\x73\xbb\x83\xd0\x6f\xb7\xb2\x8f\x4d\xb6\x2b\xb5"
- "\xb3\x16\xdf\x82\x5e\x4e\x61\x3f\x2c\x3c\x5f\xbd\x26\x50\x6c\x3c"
- "\x2e\x7d\xe2\x57\xb5\xe8\x79\xc7\x9b\xdb\xe3\x72\xb5\x32\xe5\x39"
- "\x24\xe4\x39\xa9\xe7\x61\xd8\x7c\xf6\x06\xfd\xf1\xad\xd2\xbf\x99"
- "\x7f\x90\x75\xe0\xb7\x60\x83\xa6\xa8\x72\xd6\x92\x2a\xe7\x79\xb4"
- "\x9b\x0d\x27\xaf\x77\xce\x69\xfc\xfa\x3d\xbf\xe0\xab\xd7\x8f\xb4"
- "\xfa\x3d\x6f\xfb\x82\xfa\x5d\xaf\xdc\xa3\x5f\xbd\xdc\x24\xbd\x5c"
- "\xcf\x57\xa7\xeb\xa6\xf4\x2f\x4f\xd7\x4c\x8d\xae\x9b\x4a\xbe\x80"
- "\xae\xb1\xca\xd9\xf3\xe5\xcb\xb1\xe8\xe5\x74\xc7\x2a\x87\xe4\xdf"
- "\xb8\xfe\x7a\xe2\xf5\xbb\x57\xf8\x1e\x22\x75\x27\x42\x75\x7c\xf8"
- "\x1d\x53\xea\x7e\xa2\xea\x69\xfa\x1d\x53\xa1\x73\x5c\xd5\xf7\xae"
- "\xe9\xe0\x7e\x5d\x04\xdd\x54\xbd\x80\xe7\xda\xf2\x77\x28\xff\x80"
- "\x5a\x9e\xe2\x2f\xb8\xdb\x8a\x7d\xe4\x38\xb8\x6c\x21\xa4\x2f\x16"
- "\xaf\xf2\xb3\x57\xbd\x9f\xcf\xe4\xa9\x3d\x3b\xd5\xdd\xaa\xfd\x57"
- "\xb7\xba\x69\x93\xf2\x39\xd5\x94\xbb\x73\xc8\xae\xa5\xbf\x85\xfb"
- "\xa4\xd1\x34\xdd\x7a\x9a\x98\x73\x7e\x4d\x8e\xdc\x43\x75\x99\x11"
- "\xe7\x07\x17\x6f\xda\xb4\x71\xd3\x7c\x4b\xf5\xfa\xa7\x67\x55\xd7"
- "\x94\xd6\x6c\xae\x96\x07\xcd\x27\x13\x02\x2c\x35\x15\xeb\xcb\x37"
- "\x6e\xae\xc9\xd8\x5a\x5a\xa1\x0e\xa6\xdf\x81\x84\xe1\x89\x28\xe2"
- "\x3e\x92\x34\xe8\x90\xd3\xc2\x28\x7d\x48\x0c\x72\x9d\xd8\x97\x88"
- "\x7e\xee\xb6\x27\x8d\xc8\xeb\x64\x9d\x53\x53\xe6\xa6\x92\x62\x9d"
- "\x8e\xec\xdf\x10\x76\x47\xda\x05\xaa\xa9\x67\xde\x2f\x83\x09\xd9"
- "\xae\xfc\x42\xc8\xb3\xfd\xae\x1a\x04\xf4\x52\x7c\xf7\x16\x9e\x47"
- "\xad\xf1\x05\x9d\xd5\x03\xd2\x5f\xe3\xf6\x0b\xf8\xde\xfc\x5d\xbd"
- "\x9f\xe7\x75\x21\xb5\x8e\x7b\xeb\xfd\xe7\xa8\xa6\x88\xcb\xe5\x76"
- "\xd3\xd6\x44\x66\x86\x25\x9c\x35\x7c\x26\x9a\xf0\x1d\x0f\x1c\x06"
- "\x74\x5b\x12\xf8\x26\x88\x64\x47\xa6\x9b\x36\x4f\xfb\x7d\x92\x87"
- "\xb4\xb3\xda\xf1\x6d\xea\x5c\xb6\x79\xd8\xb9\x39\x75\x34\xad\x93"
- "\xfd\x16\x3b\x32\xf9\xde\xb2\x98\xf4\x4d\x29\x5a\x1b\x1c\x29\x89"
- "\x0b\xaf\x33\xc6\xc5\xe0\xcf\xe6\x53\xa8\x7b\x2a\xf3\x5a\xf3\x27"
- "\x32\x01\x61\x7f\xab\x7c\x27\x17\xad\x45\xd8\x04\xbc\x6d\xcc\x53"
- "\xf6\x61\x80\xb8\x06\x5e\xe3\xea\xad\xfd\xb4\xfb\x78\xda\x39\xc8"
- "\xf5\x66\xe8\xbf\xd5\xbb\xd4\xb9\x33\xa4\x47\x19\x2e\xc7\x35\xea"
- "\xb1\x88\x6e\x9e\x63\x03\xee\xfd\x3d\x16\x2f\x09\xd3\xca\x8f\x39"
- "\x1f\xda\x45\x9a\xdd\xc6\xb6\x04\xc2\xe5\xf9\xba\xcd\x7d\x3a\xcd"
- "\x6b\x2c\xe2\x22\xa7\x19\x6f\x5e\x98\xfb\xbb\x7d\xb2\x2f\xf8\x9c"
- "\x78\x0f\x55\x3f\x6d\xf6\x47\xeb\xfb\x19\x65\xf3\x2d\x65\xa5\x35"
- "\x96\xca\x8a\x0d\xe5\x96\xb2\x8a\x32\xcb\x86\x8d\x35\x96\xe7\x36"
- "\xf2\x04\x0d\x4f\xc9\x44\xc8\x44\x90\xeb\xb7\xb5\x24\x4e\x5f\x83"
- "\x1e\xda\x6a\x9d\x80\xfa\x83\x26\x5b\x1f\x1d\x1a\xb6\x4e\x8c\xa4"
- "\xc9\xd6\x7b\x95\x1c\x6f\x69\x00\xee\x33\xd5\xf9\x3d\xd3\x00\xbe"
- "\x51\xff\xcd\x9e\xc8\xb6\xb7\x75\xb7\x96\xf6\xa8\x9e\x56\xca\xc5"
- "\x6d\x17\x46\xe3\xf6\x69\xf2\xd8\xae\xce\x19\x4b\xbf\x35\xed\x72"
- "\x0f\xfe\x96\x81\x71\xf3\xb0\xaf\xae\xed\xf4\xcc\x25\xda\xf2\x9f"
- "\x85\x73\xcb\x34\x4d\x86\xe2\x83\x8d\x45\x55\x9a\xfc\x40\x26\xb6"
- "\x66\x8c\x95\x9f\xad\xbb\x58\x7e\xc4\x70\x49\xbc\xdc\xaf\xe1\xf7"
- "\x41\x4f\xe1\x1b\xfd\xab\x9b\xb6\xec\xe1\x7a\x78\xb7\x96\xc4\xdb"
- "\x5f\x97\xfe\xf3\x3e\xe1\xb5\x4f\xbe\xf3\x05\xb2\x32\x09\xb2\x01"
- "\x1e\x6d\xad\xd5\x79\xa4\xa7\x8f\xdd\x86\xa5\xbc\x44\xca\x98\xa2"
- "\xe7\x3f\x4b\x19\x43\xff\x0e\x9c\x8c\xba\x9f\x3e\xee\x03\x80\xdb"
- "\x60\xcd\x0e\x21\x50\x86\x3b\x4c\x0e\x2e\xc5\x92\x03\xf0\xf6\x99"
- "\xca\x8d\xcf\xac\x43\x43\xdf\x54\x5e\xf3\x8c\x95\x7d\x53\xb0\x1e"
- "\x90\x8e\x2f\x66\x94\x59\x36\x57\x97\x3f\x33\x99\x62\xa5\x1a\x8d"
- "\x0c\xe7\x7f\x52\x10\xf2\x3a\x34\x54\x12\xc7\x67\x24\xd4\x99\x88"
- "\x6d\x6f\x0f\x55\x63\x2c\x11\xc1\xf7\x6d\xaf\xbb\xd2\x32\x61\x93"
- "\x65\x92\xb4\xa1\x41\x33\xb5\xce\xbf\xed\x23\xa6\xc3\x90\xd1\x80"
- "\xfe\xc0\xd6\xaa\xcb\x00\x7e\x77\xa2\x4e\x8d\xa1\x3d\x16\xdb\xce"
- "\x0e\x19\xe3\xce\xb2\xfe\x51\xfb\x39\x2e\x40\x0f\x24\xb6\x9f\xa3"
- "\x6d\x72\x4e\xba\x4d\xf6\x27\xb6\xb3\x7a\x9e\xbd\xa3\xe7\x94\xb7"
- "\xe5\xeb\x72\x12\xca\x63\x3b\xc5\x61\xd2\x57\x91\x73\xab\x8f\x79"
- "\x2e\x14\xef\xcd\x7a\x3a\xd0\x55\xb4\x4b\x3d\xb2\x2d\x33\x5a\x37"
- "\xfc\x3e\x89\xd7\xb4\x15\x3e\x52\xfe\x92\x8a\x0a\xa4\xdf\x13\xd8"
- "\x6a\xc0\x67\xa1\xb6\xbf\xe4\xb4\xec\xd3\x6d\x80\xe5\x53\xb0\x84"
- "\xd3\xf6\x3d\xbd\x2c\x91\x5c\x54\xd0\x2e\xe5\x6c\x5b\x63\x68\xce"
- "\x6f\xdb\x02\x1e\xeb\x8a\xa1\x92\x09\x6e\xb2\xd5\x4a\xd9\xc2\xef"
- "\x9a\x6f\x2b\x1f\x6c\x2c\x6f\x5c\x4f\x96\xab\x90\x4c\x6d\x3b\xad"
- "\xf3\x9b\xeb\x8c\x7c\xbb\x2c\xd2\x4f\xef\xb6\x01\x9d\x96\xe3\xf9"
- "\x8a\x91\xed\x36\x09\xb8\x0c\xab\xb6\x2b\xc7\x69\xca\x3f\x10\x9f"
- "\x53\x31\x01\xc7\xaa\xf3\xb4\xfd\x2a\xef\xbd\x4f\xf4\xf1\xb8\xa7"
- "\x48\xde\x93\xa6\xce\x92\x6f\x87\xfd\xbf\x65\x41\xe8\x6c\xf9\x76"
- "\xf4\xff\xb6\x05\x8a\x77\xdb\xcb\xc2\xda\x9e\x47\x5b\xcf\x9f\xc8"
- "\x34\x62\x7d\xe6\xb2\x2d\x96\xed\x55\x9d\xdb\xdd\xde\xa8\xe7\x93"
- "\x7e\x02\xfc\xaa\x4f\xbc\x44\xdb\x8f\x70\x1f\xc1\xf8\xb9\x69\x3b"
- "\xef\xb7\x96\xfb\x9e\xb8\xcf\x95\x72\x93\xc6\x77\x98\x6c\x3f\x19"
- "\x85\xc3\x59\x1d\x96\x06\x7b\x50\xff\x66\xbf\x61\x6e\xaa\xb5\xf5"
- "\x4c\x43\x9b\xf2\xca\x3a\xdc\xd0\x53\x83\xb6\xe5\xe5\x74\x2f\xa4"
- "\xea\x34\x44\xb8\x03\xdf\xb0\x7f\x6a\x32\xd4\x9a\x8e\x23\x53\xe9"
- "\xa2\xda\x1a\xf6\x49\x65\xb7\xb0\x5f\xc1\x05\x4a\xdf\x48\x5f\x38"
- "\x32\x2e\x4b\x6b\xb3\x93\xf8\x8c\x8f\xdc\xd7\xe2\xf5\x4b\xdd\xa0"
- "\x7c\x27\x20\x1e\x6d\x64\x98\xef\x66\x19\xb1\x4e\x52\xb8\xbd\xd0"
- "\x30\x5a\x06\x64\xa2\x47\xae\x21\xbe\x60\x53\xbe\x48\x26\x62\xac"
- "\xf6\x42\xa7\xce\xbf\x5d\x07\x10\x06\x98\xc8\x17\xdf\x23\x7d\x7d"
- "\xbd\xd0\xa3\xe3\xab\xc5\x19\xa5\x3c\x48\x1a\xbc\x30\xda\xfe\x87"
- "\x52\x64\x5a\x8f\x5e\x8e\x4c\x8b\x74\x9c\x9e\xef\xec\x1c\x76\xd6"
- "\x26\x8c\xc2\x51\x3e\x50\xe2\xb9\x9c\x9e\x0e\x19\x97\x11\xd2\x55"
- "\xdb\xe5\x9a\xa9\xdc\x77\x86\x7a\x78\x5e\xb0\x4e\x92\x3c\xb0\x10"
- "\xdf\xef\x61\x66\x78\x4a\x16\x6b\x57\xe9\x79\x4c\x06\xa6\x63\x6d"
- "\xa5\x5e\xb6\x0e\x83\xf1\xbf\xae\xce\x53\x75\x31\x73\x1b\xe1\xb4"
- "\x0c\x57\xca\xc4\x76\xb6\x99\x6a\x2f\x4b\x19\x94\xf5\xac\x3d\x11"
- "\xce\x6b\x65\x8b\xd5\x9e\x0d\x93\x07\xc6\x67\x94\xff\x6e\xda\x31"
- "\x4d\xf5\x25\x3b\x28\x0c\xc7\x5c\x7c\x27\x85\xf8\x20\x79\xc4\xf7"
- "\x2c\xc5\xbc\x07\x51\xb6\x15\xa4\x09\x0a\x89\x27\xf3\x03\x63\xa9"
- "\x1c\xea\x81\xde\xe3\xb6\x02\x9a\x00\xc7\x1d\xaf\xb2\x5c\x01\xae"
- "\x35\x52\x36\x77\xd8\xc2\xf0\x35\xb0\x5e\x47\xd8\x1e\x3d\x0d\xf0"
- "\x93\x63\x2e\x9d\x9e\x88\xeb\x1c\xe5\xe3\x5c\x99\xb6\x4b\xc7\xf3"
- "\x0b\xfa\x0c\x8d\x56\x3b\x3e\xd3\xca\xf0\xe8\x65\xe0\x37\xca\xa9"
- "\x1d\x63\xab\x3e\xbd\xad\xa6\x5c\x39\x27\xe2\x4e\xbe\xf4\x99\x75"
- "\xe5\x65\x33\x2d\xa5\xcf\xb2\x1b\xa3\xea\xca\xf2\xf2\x2a\xb9\x08"
- "\x13\x69\x07\xa6\xca\xf2\x40\x07\x65\xcb\xda\xb7\xbd\xa2\xf6\x9f"
- "\x70\xbb\xe0\xf6\xee\xe1\xf6\x7e\xbc\xf6\x73\x39\x36\x71\x39\xe6"
- "\x92\xcb\x27\x1c\x6c\xbf\x4b\xdd\xc7\xf5\x4f\xf3\xaa\x7e\x00\xfc"
- "\xe4\x3e\x72\xd8\x59\xd7\x12\x49\xaf\xba\xce\xc8\xb6\x5c\xd7\x15"
- "\x5b\x4f\xd4\x3d\x21\xf5\x44\xa3\x92\x0b\xd6\x4f\xbc\x77\x9f\xe1"
- "\x22\xcf\x60\x14\x4c\x7f\x48\x47\xd9\xe3\x75\x1d\xa5\xfa\x09\xfb"
- "\x4c\xf4\x41\x8d\xaa\x2c\x7b\x7a\x48\x6e\xec\x87\x94\xdc\xd8\x73"
- "\xdc\xd4\xd4\xac\x8f\x55\x54\xdf\x51\x17\xcf\xf6\x23\xeb\x74\xc4"
- "\x97\xe8\xf0\x9a\x53\xb8\xdf\xb0\x5b\xc7\xda\x0f\xf6\x54\xb6\x1f"
- "\x78\x5f\x21\xd3\x02\xb8\xc6\xab\x76\x63\x6f\x0e\xd3\x3f\x49\xf8"
- "\x3e\x14\x8b\xd7\x4f\x73\x77\x3c\x8b\x97\xcb\x66\x3d\xb3\xa1\x66"
- "\x21\xbb\x98\x2a\xb7\x55\x95\x3f\x53\x53\x5e\x16\xbd\x4e\x96\xa1"
- "\xdb\x62\xbc\x46\xdd\x8c\x76\xef\x49\x66\x7a\xd8\x51\x1f\x67\xba"
- "\x5e\x07\xa9\xa7\x60\x3b\x6a\x3a\x2e\xe1\x3c\xd5\x7f\xd6\x2e\xf7"
- "\xd9\x39\xd2\x75\x39\xe1\x74\x79\x36\x11\x44\x18\xea\x5f\xa7\xef"
- "\x07\xc4\x98\xd4\x51\xa0\x7f\x87\xf2\x3b\x94\x9f\xa4\x03\x72\x4f"
- "\x1e\x68\x5a\x9f\x10\x66\x6f\xe1\xdb\xd1\xaf\x7d\x4b\x3f\x4a\xec"
- "\xf3\x6b\x90\x1c\x6f\x2a\xfa\x3a\xc0\xff\x1d\x9a\xae\xa8\xf7\x28"
- "\x38\x44\x6f\xd5\x79\xe2\xda\xe5\xfc\xbc\xa3\x4b\x2f\x0f\xf9\xcf"
- "\x86\x97\xc9\xfd\x56\x34\x3c\x37\x39\xe4\x3a\xf2\x4e\xe9\x03\xce"
- "\xe1\x8d\x81\xab\x2d\x3c\xdd\xb0\xb3\x3e\x0d\xe5\xf7\xe8\x75\x5e"
- "\x6e\x93\x61\x33\xaf\x53\xc7\x41\xad\x8e\x9d\x2c\x5b\x5c\x3e\xcb"
- "\xbf\x86\xc3\x1e\xcd\xaf\x88\x9b\xef\x37\x64\xfc\xa5\x7f\xb3\x34"
- "\x6e\xd7\xf5\x0e\xf4\xf3\xba\xbf\x97\xb3\x5c\xc7\xa3\x75\x1e\xb3"
- "\xee\x57\x4a\xe5\xaf\x2f\x8f\xc2\xed\x68\x58\x9e\x81\xee\xdb\x78"
- "\xee\xbd\xbe\x48\x38\xed\x47\x58\x0e\xd9\xdf\x54\xf3\xa8\x1c\xd6"
- "\xbb\xc7\xca\x5d\x7d\x21\xcb\x5d\xb8\x2c\x55\xcc\x7d\x06\x92\x54"
- "\x5d\x5e\x33\x5f\x5a\xf7\x30\xec\xd8\x6d\x59\x69\x4d\xc5\xc6\x0d"
- "\xd5\x33\x2d\xd5\x65\xa5\x5a\xa3\x8f\x68\xf3\x4e\x39\x76\xf7\xea"
- "\xed\x6c\xd8\xe9\x2c\x0c\xe9\x16\x67\x48\xfe\x79\x8f\x95\xbc\x5b"
- "\xd9\xf9\xa6\x6a\x4f\xce\x9a\xb0\xb6\x2b\xf3\x73\x1b\x6d\x97\x36"
- "\x9b\x33\xbc\xff\xe7\xb1\xf1\xa4\x4b\xe4\x5c\xa8\xd1\xd4\xab\x68"
- "\xec\xfc\x44\xd6\x53\xfa\xd3\xaa\xf7\x73\x3d\xa5\xff\x16\x69\x9f"
- "\x39\x4f\xeb\xf5\x0d\x8d\x1b\x9c\x03\xd2\x8e\xd2\xec\xb5\xeb\x8d"
- "\xcb\x43\xf6\xe9\xce\x5d\xda\xdc\x59\x9f\x3e\xc6\xd3\xed\x6b\xe0"
- "\x52\xa6\x6c\xd5\x9d\x0b\x97\xd5\x8a\x91\x35\x36\xf6\x33\xc7\x3c"
- "\xd8\x59\xa1\xdb\x96\x72\xff\xdd\xfe\xa2\xe2\x61\xe7\xce\xb5\xe1"
- "\x7a\x42\x98\xd6\xf5\x69\x36\x62\xb1\x1a\xbb\xde\xf0\xf7\xe7\x50"
- "\x16\xaf\x1d\x5c\x07\x37\xd4\x6b\x27\xf4\x5f\x73\x19\xc3\x61\xfb"
- "\x5a\x0c\xa5\x69\xf7\x3b\xee\x92\x6b\x8d\x6d\x80\xed\x01\x6f\x91"
- "\x0e\xf6\x9f\x53\xca\x46\x10\x32\xca\x7b\x6f\xbc\xba\x8d\x44\x3b"
- "\x03\xdc\x17\xe1\x37\xe4\x76\x97\x76\x26\x7d\x57\xb1\xa7\x3a\x83"
- "\x86\x86\xd2\x8c\x43\xd5\x25\x66\x9e\x2f\x60\x5a\xb8\x5a\x7d\xa4"
- "\xe4\x67\x97\x05\x7a\xea\x74\x38\x3c\x0d\x16\xd3\xd4\xcc\x78\x88"
- "\xea\x34\x23\xcb\xb7\xbc\x0f\x70\x28\x03\xfd\xe9\xce\x01\x51\x9d"
- "\x61\x1c\xc7\x77\xd6\xf5\xea\x99\xa0\xdf\x5d\xc9\xfa\x4a\xf9\xe7"
- "\xdf\xfd\x9b\x57\xd4\xdc\x80\x56\xee\xae\xdf\x0a\xe3\x9b\xb2\x5f"
- "\xd9\x2b\xfb\x15\x41\xca\xdf\xf9\xae\xd3\x72\x1f\x6c\xd5\x9b\xf2"
- "\x4e\x54\xed\x7c\xb5\xa7\xa7\xca\x2f\xef\x9a\xb3\xd7\xb0\x9d\xe6"
- "\xe7\x75\x1f\x79\x7e\xf8\x78\x8d\x9f\x96\xfb\x58\x26\x77\x13\xfb"
- "\x7a\xf7\x4a\x7b\x61\x77\x82\xee\xdf\x9d\xef\x69\x84\x1d\x4c\xa8"
- "\x97\x89\xf9\x6e\xb1\xb3\x6f\xfe\xdd\xfd\x3c\xef\xaa\xc6\xe3\x69"
- "\xb4\x17\x36\xbd\xe2\xc1\xee\x47\xf9\x6e\x3c\x35\x56\x38\x07\xbe"
- "\x98\xfe\x82\xb4\xeb\xd5\x1a\xb0\xae\x27\x76\xff\x99\xf7\x96\xbb"
- "\x35\x18\x28\x0b\xfd\xff\xce\x46\x55\x16\xe0\x0d\xeb\xfc\xdc\xfd"
- "\xe8\xd8\xf9\x8d\x10\x3c\xe4\x5f\xa1\xd9\x05\xa4\xe6\xae\x7e\xcf"
- "\xb0\x7a\xf4\xb9\xab\x90\xed\xb3\xbb\x4f\x9f\xbb\x52\xbe\xa3\x77"
- "\xb5\x72\xf9\xe3\xcd\x11\x09\xfb\x13\x2c\xf7\xf1\x6c\xc3\x8d\x6b"
- "\x4f\xa0\x7f\x67\xdc\x75\xbb\x50\xf1\xe7\xc5\xe7\xd9\x3e\xe4\x7b"
- "\x4c\x75\x5b\x52\xd9\x00\x2f\xd6\xaa\xbe\xec\xc5\xb5\x7a\x5f\x86"
- "\xbc\x47\x35\x5d\xa1\xf5\x73\x2f\x8e\x8e\x7f\x63\xef\xab\x7f\xb1"
- "\x55\xa7\x91\x4e\x73\x45\xa3\x17\x2f\x0f\xa5\x2c\x3a\x1c\xa2\xed"
- "\x8b\x97\x25\xad\x47\xe3\x7f\x36\x2b\x8c\xf6\xfc\x3d\x53\xe9\xcd"
- "\x17\xd1\xff\xef\x5a\xa5\xfa\x14\x15\x26\x52\x1c\xf3\xc4\x0b\x25"
- "\xa4\x68\x50\x21\xe7\x66\x3c\xf6\x0c\xe0\xf6\xb3\x34\xb7\xe1\xa6"
- "\x2e\xa5\xcb\x7e\x86\xfe\xef\xc5\x54\x95\xef\xc5\x6e\xc6\x25\x1c"
- "\xdf\x47\x37\xac\xdb\xb0\x71\xeb\x06\x9e\x50\xdb\x5c\x6d\x79\x66"
- "\x63\x59\xf9\xe4\x18\xf3\x21\x69\x7c\xdf\xb3\xb7\x79\xd4\x6f\xd4"
- "\xcf\x33\x79\x1f\xbc\xba\x73\xe0\xe7\x59\x96\xdb\x59\xbe\x7e\xf6"
- "\x2a\xcf\x15\xc8\xbb\x1f\xd8\x47\xaa\x9a\x37\x18\xe0\xfc\x8a\xd6"
- "\x3f\xff\xee\xd0\x56\xab\x66\x63\xbd\xf4\x2f\x4c\x47\x6d\xcc\x21"
- "\xce\x53\x43\xb2\xde\x0f\x31\x7e\xd2\x36\x1f\xc9\x90\x7a\x31\x38"
- "\x62\x35\x4b\x7a\x8d\x64\xa0\xbf\xf9\x99\xc7\x6d\x48\x69\xd6\xea"
- "\xe5\xd7\xe9\xc1\xf5\x87\xad\x1b\x3f\x2c\x2a\x20\xa3\x3f\xcf\xd4"
- "\x60\xb1\xfe\x04\xec\x9f\xf5\xe8\xfb\xb0\xd9\x17\x68\xf7\x16\xf6"
- "\x03\xdc\x10\x08\xee\x67\x7d\xd3\x90\xab\xeb\x25\xee\x8b\x82\x80"
- "\xf3\xde\x15\x4f\x1c\xda\x0d\xef\xbf\x9f\x7a\x8e\x5e\xda\xa3\xee"
- "\x0b\x68\xa8\x8c\xbc\x2f\xe0\xa5\x02\x3c\x7b\xb4\xe7\x70\xd8\xef"
- "\xeb\x3d\x7a\x1e\x5b\x28\xac\xe1\x44\x54\x9a\xc3\xc0\xe9\xcc\xa8"
- "\xbd\xa2\xfc\x91\x6a\xfe\x8b\xf9\xee\x8b\x97\x92\xd9\xe7\x67\x48"
- "\x36\x1a\xee\xd6\x6c\x90\x01\xa6\x1d\xf7\xb7\x48\x23\xcf\xb2\x80"
- "\x26\xf3\x78\x8e\x96\xeb\x24\x86\x2b\x20\x13\x2f\xcd\x0c\xc9\x81"
- "\xa2\x11\xc2\x72\x43\x76\xca\x4b\xa9\x9c\x27\x9c\x0e\x28\xe3\x01"
- "\x35\x36\x7d\xc9\xaa\xf7\xd9\xec\xef\x54\xdd\x1f\xd1\x70\xe6\x68"
- "\xdd\x00\xc6\xfc\x2f\xed\x0a\xc1\x68\x38\xa3\xcd\x45\x98\x85\xf1"
- "\x67\x39\xed\x72\xcc\xf6\xd2\xa1\xd0\x9c\x40\xc3\x19\xd6\xbb\x12"
- "\x46\x8a\x23\xd7\xe5\x95\x77\x2a\x1b\xf4\xbb\xd3\x91\xf6\xb4\x6e"
- "\xa3\xe8\xb0\x7a\xd4\x9c\x93\xf4\x51\x89\x36\xd8\x88\x34\xde\xd1"
- "\xf9\x58\x84\x8d\x8e\x01\x41\xd5\x1e\x69\x7b\xff\x3c\x35\x34\xd6"
- "\xfb\x99\x5c\xbb\x94\xe3\x40\x05\x07\x76\xf2\xcf\xe3\xa3\xc7\x6d"
- "\xb0\x1f\x2c\x15\x1b\x2a\x60\x3e\x3c\x57\xb5\x71\x21\x86\x0e\xcf"
- "\x55\x55\x2c\xe4\x2d\x5b\x45\xf9\x4b\xe4\x1b\x8d\x63\x61\x8c\xf9"
- "\x63\x75\xbf\x6b\x89\xd4\xa9\x3c\xce\xe5\xb9\xd3\x61\x75\xd7\xe9"
- "\x44\xed\x1d\xaf\xbd\x27\xa0\xdf\xb3\xa1\x0d\xfc\x2d\xdf\x5d\x03"
- "\x1c\x4e\x68\xf7\xcb\xea\x7d\x36\x74\xf9\xcf\x7f\xa3\xaf\x77\xc9"
- "\x3d\xec\xec\x87\x70\xc8\x2a\xe7\xe3\x50\xa7\xd1\xf9\x0f\x35\xbf"
- "\xa8\xd6\xcc\x86\x9d\xbf\x20\x3d\x5c\x9f\x8f\x45\x58\xaa\x3e\xf7"
- "\xaa\xd2\xfe\x22\x3d\x94\x37\x62\x6e\x3b\x55\x5f\x4f\x43\x9a\x02"
- "\x9d\x66\x3a\x1c\xbb\x45\x5c\xd2\xec\x24\x93\xb4\xab\x9d\x3f\x5f"
- "\x20\x7d\x7f\xb2\x2d\x2e\xe7\x99\x7f\x51\xab\x97\xc3\x63\x04\xc6"
- "\x5b\x5b\xbb\x91\xed\x9e\x7d\x7c\x2a\x1f\xa1\xbf\x18\xe5\x7f\xe4"
- "\x1a\x47\xec\xf5\x8d\x91\x2d\xa2\xc7\x7f\x45\x74\xed\xfd\x23\xda"
- "\xec\xb3\x44\xfe\x2d\xe2\xc8\xc8\x15\x71\x54\xde\x51\xfd\x34\xd1"
- "\xcb\xff\x4a\x14\x30\xad\xfc\xe4\x1a\xe8\xbe\xf4\x72\xf0\x12\xdf"
- "\x5d\xd7\x8e\x74\x4b\xbd\x9f\x8a\x36\xe4\x59\x5a\x25\x2e\xb5\x21"
- "\x5d\xd1\xc5\x4b\xe2\x20\xd2\x16\x59\x51\xef\x2d\xc2\x1f\x30\xad"
- "\xfb\xc4\xf2\x18\xeb\xa1\x3d\x39\x9e\xfd\x4b\x8e\x0a\xa7\x71\x9f"
- "\xd8\x79\xd7\x9d\xc3\xce\x3d\xf9\xa3\x77\x66\x01\x2e\xd3\x68\x99"
- "\x8d\x7f\xaf\xfb\x04\x75\xfa\x64\x0d\xfa\x50\xf0\xe0\x13\xa4\xc3"
- "\xf8\xbf\x5a\xea\x1b\x8f\xe9\xce\x14\x3c\x19\xb1\xf4\x3e\x70\xed"
- "\x09\x6c\x11\x5d\xfb\x56\x03\xff\x0b\xc0\xff\x8a\x38\x82\x3a\x1c"
- "\xdd\x7b\x9e\x88\xf1\x0f\x30\xcc\x00\x99\xd6\x6c\x33\x24\xb7\x23"
- "\x7e\x8d\x2d\x89\xda\x91\x76\xb5\x97\x92\xdb\x90\x66\xf5\xf3\xc9"
- "\x24\xf1\x1f\x04\xde\xc9\x4b\x8e\x06\x50\x36\xe3\x8f\xf2\x07\x75"
- "\x3c\xf5\xf2\x19\x5f\x5d\x06\xd7\xf0\x7c\x57\xca\xa2\x41\xc6\x5b"
- "\xcd\xe1\xbf\x3c\xc3\x53\x6d\x25\x8f\xe9\xae\x3b\xdd\xf4\x72\x2e"
- "\xb7\x21\xae\x8f\x07\x32\xa5\x9d\x2b\xfb\x44\xa7\x81\x1a\x4f\xbe"
- "\x5c\xa8\xd7\x2f\xbc\x5e\xc5\x1b\x37\xc9\x79\xd4\xd2\x67\x6a\x2a"
- "\xb6\x94\x62\x74\x36\x99\xaa\x38\x48\x8e\xdf\xca\xcb\x2c\x1b\x37"
- "\x58\x9e\x2d\xad\xa8\xdc\xb8\xa5\x7c\xd3\x4c\x39\xe4\xae\x2e\xdf"
- "\x50\xc6\xd3\xab\x9b\x4a\x37\x55\x4d\x8e\xb2\xb9\x1b\x97\x1c\xed"
- "\xe5\x7b\x4e\xea\x78\xfe\xba\xb1\x48\x9b\x5b\xf4\x09\x67\xae\x1c"
- "\xbb\xa9\x76\xb0\x17\x63\xfe\x5c\x8e\x7f\x40\xf5\x35\x8d\x85\xa2"
- "\x69\xd1\x45\x21\xe4\x1d\xcc\x86\x4b\xd4\x78\xaf\xac\xe7\x50\x81"
- "\x0e\x47\x9e\xd1\x90\x36\x2b\x87\x8f\x14\x50\x68\xcf\x76\x63\x91"
- "\x30\xa2\x8e\xa0\x81\x66\xb7\x3a\xb4\xb3\x73\xff\xe9\x1c\x35\xce"
- "\x40\xbd\x79\xed\xe0\xb4\xb4\x0b\xe5\x19\x9f\xc6\x9b\x61\xf7\x3a"
- "\x84\x73\x42\x02\xd3\x65\xaf\x1a\x57\x1a\x13\x0d\x7c\xff\xea\x39"
- "\x3e\x6f\x98\xc9\x6b\x84\xed\xce\x60\x66\x68\x8f\xcc\xcb\x25\x6c"
- "\xe3\xca\xb9\x76\xd9\x2e\xf6\x36\xeb\xf2\x6e\xe4\x33\x1c\x3b\x6f"
- "\x99\xaf\x74\xf5\x5e\x79\xa6\x08\x7c\x9b\xaf\xf0\x97\xf7\x41\xa3"
- "\x7f\xda\xf7\x5b\xd4\xef\x92\xb0\x17\x68\x7e\xdb\xf7\xfd\x36\x98"
- "\xf2\xfe\xe9\x40\x75\x9a\x76\x87\x7a\xde\x84\x60\xd3\xa2\x2b\x01"
- "\xf4\xeb\x41\xd8\xaa\xa2\xe9\x83\xe5\x81\xa6\x45\x9e\xe0\xd6\x0c"
- "\x23\xeb\x77\xbb\x0d\xf4\xdb\x68\x9d\x2c\x3e\xb5\xde\x10\xd8\x9a"
- "\x01\x1b\x60\x91\x4f\x08\xe4\x4d\xc9\x8b\x97\x77\xde\x36\x2d\xba"
- "\xa6\x7d\x4f\xe6\xef\x20\x6c\x35\xc0\x4c\xc2\x77\x4a\x50\x84\xa5"
- "\x8f\x4c\x9b\xca\xdf\x89\x06\xb9\x37\x2f\x13\xb6\xf1\x02\xae\xbb"
- "\x5e\x67\x39\x46\xe0\x79\x8a\xd1\xba\xed\x3b\xac\x87\xb3\xed\xaa"
- "\xec\x48\x7a\xe6\x1c\xed\xeb\x56\x3a\x6d\x34\xdd\x6e\x9d\x06\x92"
- "\xb6\x4d\x8b\xf8\x4e\x9f\x42\x79\x2f\xfc\xce\xef\xdc\x29\x8c\x2f"
- "\xaf\xe3\xbe\x63\x59\x40\xae\x65\x91\x5a\xfb\xd8\xd7\xaf\xd3\x93"
- "\xf7\xa2\x73\xff\x01\xbe\x65\xac\xf1\xd0\x64\xd5\x7e\x1b\xcd\x61"
- "\x63\x94\x41\x21\xe5\x7d\x5f\xab\x2c\xd7\x18\xbf\x53\x7d\xef\xd5"
- "\x7c\x99\x37\x66\xea\x69\x11\x96\xa3\x6c\xd2\xbd\x66\x1e\xbb\xf1"
- "\xda\x16\xff\x6e\x1b\xe7\x9c\x64\x5d\xab\x10\xac\x0b\x59\x37\x5b"
- "\x6e\x21\xea\xf5\xb2\xdd\xde\xb8\xe7\x78\xab\x97\x24\xff\x52\x16"
- "\x5d\x1c\x12\x56\x82\xbd\x12\xd3\x4e\xe5\x3c\x48\x7f\x42\xda\xe0"
- "\x90\xe7\x20\xe4\x19\x79\x2e\xb1\xbc\xd6\x5d\x66\x3c\xf6\xc7\xf7"
- "\xd4\x0e\xb0\x1f\x77\xc8\xe1\xfe\x78\xa6\x0d\xf7\x0d\x7b\x9d\xf2"
- "\x8c\x9c\xd4\xc1\xdd\x5b\xb2\x19\xc6\xe5\x29\x3e\x32\xf7\x42\x83"
- "\x82\xde\xbe\xaa\x3a\x4a\xbe\x80\xf4\xe6\x1a\x8a\xe7\xf1\xd1\x97"
- "\x5d\x47\x46\x79\xf9\x8a\x26\xfb\xf3\x75\x1b\x08\xbf\x8b\x23\xcf"
- "\x82\xee\x1f\x73\x16\xf4\xe9\x8d\x1b\x6b\xd6\x6c\x2a\xe7\x57\xc6"
- "\x8c\xcd\x77\x44\xf7\x89\x09\xea\xde\x9c\xfd\x56\xe6\x1f\xf7\x13"
- "\xea\x4c\xc5\xfe\xce\xb0\x71\x2d\xcf\xad\xdd\xcf\xfd\x1b\xaf\x89"
- "\x23\xae\xe7\x77\xb5\x3b\xa4\x5d\xf5\x71\x3c\x19\xa3\xcb\x7b\xb6"
- "\xb4\xa6\xb4\x72\xbe\x5a\xbe\x8d\x51\x4e\x5f\x64\x39\x4d\x49\xa3"
- "\xe5\xa8\x31\x88\x57\xb6\xc1\xfd\x1f\xe4\x8a\xe4\x77\xdc\x4a\xcf"
- "\x35\x65\xeb\x7b\x9c\x62\xfb\x9e\xc8\x2b\x0b\x34\xd5\x37\x32\xbf"
- "\xec\x3b\xc8\xf8\x37\xdb\xfb\x8c\x6c\x7f\xd5\xe1\x37\xef\x39\x91"
- "\xf3\x7c\xda\x9d\x76\x1f\x7c\xde\x07\x3d\xdb\xd4\x20\xf6\xe7\x95"
- "\x41\xae\x1c\xe3\xed\x33\x09\x3f\xb7\xab\xd6\x28\x9b\x3a\xc6\x4b"
- "\x2b\x1a\x8b\x1a\x54\x5b\x69\xba\x2c\xd7\xca\x6e\xa1\x9f\x9d\xa3"
- "\xa6\xcf\xcc\x69\x18\xc7\xdd\x42\xbf\xc2\x6f\x39\x5e\xe0\xb8\x08"
- "\x5e\x7f\x77\xb0\xc3\x0c\xe9\x84\x94\x1a\x84\xfa\x83\x11\xa6\xfe"
- "\x4c\x78\x8c\xc2\x20\x77\xbf\x9b\x40\xe1\x89\x13\xcc\x94\x38\x25"
- "\x21\xfe\xd6\xef\x4d\x4b\xbb\xff\xbe\x05\x39\xf6\xba\x5a\x9b\x08"
- "\xfa\x7d\x89\x22\xfc\xfe\xc5\x77\x1a\x1e\xbd\xc3\xa1\xfa\x8a\xfd"
- "\xef\x34\xc4\xc2\xf5\x65\xa7\xe0\xbd\xc6\x04\x7d\x75\xc4\xbe\x99"
- "\x8c\xef\x5d\x73\x1b\xd9\x96\xe3\xfe\xc7\xe5\xff\x08\x63\x82\x57"
- "\xea\x3f\x44\x18\xea\x6f\x13\x8d\xef\x1f\x51\x67\x1b\x5e\xf9\x5d"
- "\xb0\xe9\xfd\x23\x21\xf8\x66\x62\xf8\x18\x2f\x18\x0f\xd5\x0d\x18"
- "\x5d\xe6\xfb\xc8\x65\xf1\xd2\x87\xf8\x1d\x93\x96\x28\x93\xe7\xa6"
- "\x18\x06\xf4\x70\x83\xfd\x2a\xf4\xb3\x4d\xce\x13\x1b\x2f\xd1\x2b"
- "\x57\x8f\x8c\x93\x4f\xae\xf5\xa4\x2c\x79\x76\xd8\xd9\x0c\xfe\x3f"
- "\xb4\x47\xb3\x87\x60\xaf\x35\xe7\xeb\x3a\x01\xf1\xe5\x6a\xbe\xba"
- "\xb9\x44\x4f\x13\x93\x47\x3f\xe7\x3d\x93\xa2\x9b\xf9\x2a\xae\x0c"
- "\x0c\xb0\x0f\xb7\x71\xe6\x04\xf2\xd1\x3f\xef\xe6\x76\x7c\x63\x7d"
- "\xd2\x84\x29\xf5\x99\xeb\x4f\xa2\xff\xbb\x71\xf0\x66\x9a\xe2\x7d"
- "\x8a\x71\xe6\x7d\xbb\xa7\x0f\xc2\xf6\xe5\x75\xaa\x44\x43\x66\x45"
- "\x62\x7d\x66\x69\xc0\xb9\x60\x1e\xf7\x93\x89\xb6\x25\x86\x44\xff"
- "\x03\x06\xbf\x33\x7b\x5e\xbb\xba\xf3\xc4\xdb\x38\x55\xf4\x21\xcf"
- "\x59\xe4\x71\xe3\xe9\x47\xbe\x93\xe7\xe9\xd5\x6f\xe3\x7d\x22\xd1"
- "\x20\xda\x13\xc1\xc9\x39\x0e\x79\x07\x24\xeb\xe8\x93\x22\x05\x36"
- "\xe6\x88\x9c\x0b\x88\x0b\xcd\x05\xbc\xba\x00\x7c\x9b\x50\xb8\x5b"
- "\x7c\x08\x58\x27\x02\x57\x82\x27\xda\x2e\x11\x69\x73\xde\x67\xd0"
- "\x46\xcf\xcc\x6c\xa6\x34\x6d\xef\xa5\xf1\xa4\xff\x04\xeb\x62\x3e"
- "\xbb\xdc\x83\x32\x8f\xe1\xe9\xb2\x6c\x20\xd3\x25\x7a\xf5\x65\xb6"
- "\x3f\x42\x36\xec\x6b\x71\xda\x78\xa4\x7b\x36\xf2\xef\x58\xcf\x32"
- "\x31\x60\xf4\x03\x3e\x6c\xfe\x13\x2e\xeb\x09\xb9\x17\x86\xf7\x36"
- "\x73\x1a\x94\x91\xe1\xf2\x9d\xa0\xa0\x48\x33\xe2\xbb\x8b\xf7\x29"
- "\x0b\xa4\xed\xb5\xf5\x51\x6f\x95\x0f\x3a\xf6\x24\x6c\xe0\x8c\x74"
- "\xe0\x23\xe1\x21\xfe\xcc\x7b\xe0\xaf\x05\xf6\x1e\xe0\x9d\xe6\xbd"
- "\x35\x7c\x06\x58\x54\x67\xdc\x8e\xfc\x3d\x18\x43\x1b\x19\xfe\x25"
- "\x3a\xf0\xaa\x18\xca\xc8\x98\x33\xa8\xee\x44\x3c\x47\x07\x2a\x81"
- "\xe7\x8b\x21\x3c\x0f\x5c\x06\xfe\x66\xe8\xd5\x6e\xc0\x3c\x26\xb6"
- "\xa0\xcc\x7e\x94\x89\xf1\x08\xe4\x37\x1d\xe3\x5d\x33\xe3\xdc\xcb"
- "\xf8\xda\x02\x24\xb6\x66\x98\xf7\x7d\x4e\x66\xb4\x85\xee\x76\xbc"
- "\x51\xff\xa3\xb0\xc9\xa6\x0d\x3b\x0f\x38\xf4\x73\xe4\x6c\x4b\xe0"
- "\xbb\x51\x97\xa5\x97\x91\x06\x38\x76\x01\xaf\x63\x37\x0e\x12\x8f"
- "\x71\xe2\x20\xa7\x71\x28\x77\x22\x78\xd5\x05\xda\x3d\x0f\x5a\x1f"
- "\xe3\x3a\x05\xaf\x04\x07\x82\x80\xb7\xef\x0a\x70\xaa\x4e\x33\x27"
- "\xf4\xf3\x7d\xd1\xc3\x02\xf4\x3e\xb3\xcc\x36\x2c\x78\xdf\x29\xef"
- "\xe1\x44\x9e\x22\xd4\x15\xfd\xdd\x6b\x33\x79\xbc\x81\x7a\x64\xab"
- "\x3b\x1d\x0f\xe4\x68\x6b\x5a\x67\xd4\x3c\xd3\xab\x2f\x33\xed\xb9"
- "\x5e\x09\xf5\x49\x2f\xba\x06\x3c\x94\xd0\x7f\x33\xfa\xb7\x57\x8f"
- "\xb4\x06\xd9\x46\x79\x6d\x74\xfe\x7f\x9c\x36\xe6\x73\x41\xbf\x04"
- "\xaf\x88\x01\xb6\x3d\xd5\x7e\x97\xd7\x2a\xd7\xd8\x4c\xb9\xb0\x33"
- "\x8d\xc0\x93\xcf\x43\x4c\x45\x3f\x7d\x3f\xef\x67\x02\x7e\x18\x77"
- "\xbc\xb6\xe7\x7a\x77\xa9\x82\x3e\x69\x48\x73\x04\xb8\xe7\x4b\x7a"
- "\x6d\x11\xad\x6a\xae\xe7\xb5\x1e\xfd\x3c\xbf\xb8\x22\x6a\xf7\xd5"
- "\xc9\x72\x1d\xbb\xb6\xc8\x32\xf8\x7e\xcd\x81\x1a\x8b\xf8\xb8\xc7"
- "\xe2\x19\xf7\xcc\x74\xd8\x3e\x1e\x8f\x76\x67\x97\x5c\xd3\x8c\xdc"
- "\xc7\xd3\x32\x33\x6c\xdc\xc8\xeb\x9a\x0e\x5e\xbb\x55\x7e\x57\x5a"
- "\xe4\x7e\xe5\x65\x36\xe5\x5f\xc2\xe5\x1b\xd4\x6c\xcb\x96\x6d\xf2"
- "\x1e\x1f\xb6\x6b\xe4\xde\x9f\x0b\xda\x7e\x9d\x96\x64\x2e\xa3\x27"
- "\xea\xae\xe0\xf2\x0d\xa5\x4f\x57\x96\xab\xa9\x94\x59\x3f\xad\x29"
- "\x7d\x2e\xd2\xfe\x35\xcb\x71\xb1\xb3\x65\x97\x9a\x9b\x6c\x39\x16"
- "\x66\x27\x9a\x47\xe7\x96\x8c\x74\x54\xcd\x2f\xb5\x9c\x8d\x35\xbf"
- "\xb4\xe4\xb9\x0d\x1b\x37\xc9\x32\xe4\xd6\xa6\x72\x75\xba\x68\x32"
- "\x3d\x9a\xbf\x24\x7f\x56\x75\x79\x8d\xbc\x9c\x43\x4d\xe6\x94\x96"
- "\x95\x6d\xd2\x36\x3e\x55\x70\x2e\x8e\x79\x76\xab\xcc\x5a\xb5\xae"
- "\x46\x6d\x99\xaa\xae\x2c\xdd\x52\xae\x81\x08\xc7\x75\x1a\xeb\xcb"
- "\x9e\x56\x39\x66\x9e\xac\xd6\x69\x5f\xaf\x0c\x5b\xd7\x09\x1f\x47"
- "\x7e\x1b\x71\x0d\x7a\x5c\xd5\x6d\x2c\x2b\xbf\xfc\x76\x6f\x87\xf4"
- "\x89\x60\x3e\xfe\x57\x4c\xdf\xd7\x2f\xb3\x3f\x79\xf4\x6d\x9d\x7c"
- "\xff\xa9\xb6\x06\x0a\x7d\xfd\xfa\x7f\x86\xbd\xdd\x09\xfa\xda\x96"
- "\x05\x82\x02\x3a\xd5\xe6\xa6\x83\x3d\xda\x1c\x42\x7c\xd0\xd8\x32"
- "\xc0\xfb\x57\xda\xe4\x3c\xc2\xeb\x83\xa1\x79\x84\x83\x3d\xdc\xaf"
- "\x83\xdf\xfd\x8c\x1b\xe3\x39\xec\xfc\x65\x42\xd8\xde\x81\x7e\x37"
- "\xbd\x2e\xd7\xba\x78\x8d\x5b\xde\xf5\x00\xfb\x49\x3b\x57\x6e\xec"
- "\xfd\x2b\xee\x87\x5a\xb3\x59\xe7\x06\x1b\x8b\x3a\x54\x9b\x79\xa3"
- "\x48\x34\x2d\x79\x6e\x8e\x97\x52\x95\xce\xf8\xe5\xeb\x08\xbf\xe9"
- "\x12\xfd\xb2\x06\xe1\x56\xe8\x9d\x38\xb6\x5d\xd4\x5c\xf9\x2f\x5f"
- "\xd7\xe6\x15\x98\x3e\x71\x61\x38\x34\x86\xe6\x1e\x0e\xf6\x78\x92"
- "\x8b\x3a\x76\xa9\xbd\x01\x72\x1d\x54\xad\x45\xff\xf2\xe8\xe8\x58"
- "\x1b\x65\x6b\x6b\x7f\xa9\xe7\x91\x1e\xb4\xe8\xd0\xd6\xe3\x50\xf7"
- "\xd7\x79\x3c\xa1\xed\xe9\xfa\xe5\x40\xb8\x0d\xac\x7c\xeb\x2f\x79"
- "\x8e\xed\x66\x35\x66\x78\xe3\x66\x69\xe7\xf0\x3c\xc7\x35\xa6\xf7"
- "\x1b\x77\x20\x1e\x7d\xdd\x1b\x16\x37\xb5\xb4\xe8\xf8\x30\xce\x35"
- "\x36\x18\x03\xc8\xc7\x7d\x1f\x70\x9a\x88\x34\xf9\x21\x9c\xdf\x48"
- "\x95\x76\xb3\x28\xd1\xe6\x22\xdf\xe8\x52\xf3\x4d\x45\x47\xc2\xf8"
- "\x66\xbe\x44\x6f\xbc\x0e\x5c\x8f\xec\x54\x6b\xf0\x71\xfa\xda\x36"
- "\x60\x45\xd4\x3f\x34\x17\xf4\xfa\xf7\xd4\x5c\xd0\x1b\x47\x42\x3c"
- "\x7c\xa3\x86\xe5\x9e\xf7\x2f\xe8\x7b\x17\x98\x9f\xea\xde\x81\x37"
- "\x46\xf7\x7f\x05\x53\x8a\x1a\x79\xac\xb4\x57\xad\xc3\x81\x2f\xad"
- "\xdf\x36\x19\x3e\x96\x6b\xb1\x73\x7c\xd4\x81\xb0\x09\x08\xbb\x91"
- "\xd3\x71\x99\x72\xce\x04\xb4\xe1\xba\x04\x61\x8f\x9b\xd2\x26\x3c"
- "\x30\xec\x6c\xcd\x80\xcd\xd7\x1f\x92\x8d\x37\xe4\x9a\xdc\x5e\x8d"
- "\xd6\xc2\xf9\xfa\xbc\xd0\xf8\xad\x75\xc5\xe8\x9a\x13\xe0\x84\xfa"
- "\x8c\xd6\x6d\x4c\x63\x2e\xb7\x6a\x3b\xcf\x49\x1f\x3c\x2c\xf1\x50"
- "\xeb\x3a\xbf\x07\xff\x0e\x0a\xd8\x17\xdc\xd7\xf2\x58\x82\x79\xcf"
- "\x69\xd5\x5d\x40\x07\x79\x8e\x9d\xe7\x4e\x0f\xe0\xf7\x13\x41\x63"
- "\x2c\xd9\x69\x3d\x19\xbe\xcf\x50\xd1\xff\x60\x6a\x90\x61\xa2\xfe"
- "\x0c\x0b\xfd\x8f\x41\x9f\x5f\xd1\xe0\xc6\x01\xe6\x6b\xe7\x35\x5a"
- "\xcb\x35\x85\x26\x8d\x0e\xcc\x63\x49\xf3\x83\xe9\xd0\xb9\x72\xfe"
- "\xc7\xde\x21\x2e\x6e\x04\x0c\x75\x47\xe7\xc1\x7c\xc1\xb4\xd5\xd2"
- "\x7b\x78\x0c\x06\xdc\xd5\xd9\x2a\xc8\x22\xc6\x31\x8c\x67\xb0\xa9"
- "\xa8\x85\x71\xe7\xf5\x84\xd0\xb8\xfa\xe0\x36\xce\xeb\x79\x41\xe5"
- "\xd9\xa7\xd6\x3b\x98\x37\xbf\x15\x5b\xad\xa4\xcd\xb3\xa3\x9f\x7a"
- "\xc3\xc1\x72\xcf\x70\xbc\x72\x7c\x75\xb0\x31\x08\xba\x80\x27\xa0"
- "\xf3\xc1\x63\x3a\x4f\xdc\xd4\x6a\x1b\xcf\x1e\x56\xfe\xf3\x0f\x0e"
- "\xe8\x3e\x5a\xb8\x6f\x42\x1b\x76\x28\x5b\xb2\xed\xdd\xc4\xfa\xfb"
- "\x45\xa2\x7f\xde\x3c\xb6\x8d\xda\x8d\xc2\x17\xb6\x8f\xee\x56\xd0"
- "\xe9\x53\x7d\x4f\x71\x70\xe7\xca\x3e\xde\x83\xe8\xf2\xa9\x3d\x88"
- "\x1c\xbe\xd4\x2b\x82\xbd\xde\x00\xef\xa9\xef\x1b\x76\xb6\x15\xea"
- "\xe3\x20\xd6\x6f\xa6\x7a\x03\x68\xd7\xb6\xd6\x4d\xaf\x54\x6a\x7a"
- "\x6d\xe2\x05\x6a\x7b\x49\x83\x1f\x8e\x83\x59\x8d\x23\xdb\x3a\xd5"
- "\x78\xaa\xad\x19\xba\x27\x5f\x8d\xa7\xda\x3a\x74\xbc\x11\x5f\x19"
- "\x5d\xc7\xe2\xbc\x25\xe5\x96\x4a\x56\xd1\x99\x73\x6d\x96\x8c\x19"
- "\x65\x73\xe4\xa6\x55\xcb\x83\x79\xf3\x2d\xc5\x0b\x67\xd8\xac\x33"
- "\x97\xaa\x57\x5e\x71\x21\xbf\xa3\xd6\x30\x2d\xc3\xce\x76\x8a\x1c"
- "\xaf\x1d\xd2\x70\x68\x4f\x73\x1b\x66\x69\xf7\xbd\xe6\x75\xf0\x3d"
- "\xe8\xe8\x53\x07\xd9\x4e\x5e\x16\xf8\x93\x10\xfb\xb3\x06\x44\x72"
- "\x5e\x87\x27\xf9\x9d\x06\x3c\xc5\x9e\xe4\x25\x7b\xf8\x9e\xf4\xc4"
- "\x7a\xe1\x4b\xf4\x4f\x54\xba\x12\xdf\xb0\x49\x06\x60\xf7\x30\x2f"
- "\x69\xf1\x1d\x76\xb1\x2c\x20\x5c\xb0\x7f\x40\x97\x76\x9b\xde\x8f"
- "\xcb\x39\xa8\xc6\xbc\x8e\x65\x36\x31\xc2\xb2\x03\xfb\x00\xe3\x2d"
- "\x94\x69\xe2\x39\xb3\x76\xd4\xff\x15\xb7\xa2\x45\xfb\x61\xf0\xff"
- "\xb4\x46\xdf\x62\x7c\x83\xff\x39\x66\xd9\xc6\x9d\x69\xb2\xaf\x08"
- "\xee\xbc\xf3\x11\x8c\x05\x8a\x75\x98\x80\x95\xa0\xdd\xeb\x2a\xe1"
- "\xd1\x97\x3c\xff\x1c\x6c\xca\x3f\xca\x73\x17\x7c\xbe\x30\xd1\x66"
- "\xe0\x7b\x7c\x4a\x46\xe7\x6b\x10\x37\xa5\x3e\x89\xe7\x70\x4a\xa6"
- "\x78\x0d\x0e\x4e\x13\x9a\xd7\x08\xba\xf7\x19\x83\x3e\xd8\x13\x49"
- "\xea\xce\xf2\x41\x6d\x5d\xb7\xc3\x3a\xba\x4e\x10\xc1\xfb\x0e\x29"
- "\x0f\x9f\x3b\xcd\xe0\x43\x9b\xe7\xb6\x54\x65\x3b\x05\x9d\x06\x52"
- "\x67\xce\x3b\x9e\x92\xed\x52\x93\x47\xd0\xd7\xc3\x6b\x78\x89\x7e"
- "\xe1\xe1\xfd\xee\x41\x13\x64\x92\x2e\x90\xab\x76\xd8\xc1\xe7\x5e"
- "\x47\xe5\xb2\x0a\x72\x59\x05\xb9\xe4\xf5\x56\x94\xef\x31\xdd\xb9"
- "\x16\x6d\xd6\x70\x81\x3a\x66\x32\xfe\x4c\x1b\xd8\xef\x09\x41\xd0"
- "\x4a\xee\xab\x63\xfa\xa4\x3c\x98\xcd\xe7\x95\xb8\xae\x89\x7e\xd4"
- "\x39\xbc\x5e\xc6\xa0\x7b\xaf\x13\xf5\x32\xa2\x5e\xb6\x8b\x72\xde"
- "\x80\xcf\x91\x41\x97\x4c\x0d\xdd\x05\xf1\x66\x61\x78\x1d\x83\x7c"
- "\x7f\x8c\xac\xc3\x9b\xeb\x63\xd5\x51\x18\xb9\x8e\x4c\x83\x37\x1f"
- "\xd0\xd6\x5b\x24\x9e\xac\xb7\x06\xe9\x4d\x9a\x52\xcf\xe7\xb7\xf2"
- "\x3a\x60\xf7\xe6\x31\x0f\xdb\x9c\xa2\x91\xf1\x8c\xc5\x2f\x86\xa7"
- "\x60\xfd\x55\x42\x62\xbd\x63\x2d\x70\xe9\x8b\x4d\xef\x37\xaf\x5e"
- "\x9f\xde\x6f\x9e\xe2\xfc\x8c\x07\x9f\x45\x4b\x64\x47\x45\x90\x6f"
- "\xd8\x15\x0d\xb1\xca\x9d\x52\xdf\xc1\x78\xc5\x8c\x83\xec\x0f\xee"
- "\xdb\x14\xd9\x26\x82\x6d\x3e\x62\xfa\xb5\x23\x5c\xcd\xc9\xfe\x95"
- "\x63\x74\xee\xb8\x31\x0f\xe3\x2f\x8b\x89\xdb\x98\xb4\x89\x51\xdf"
- "\x58\x70\x13\x0d\x8d\xec\xeb\x2c\x0f\xba\x2a\x66\x3c\xda\x81\x45"
- "\xec\xbc\xeb\x36\xc0\xdb\x33\xa5\xde\x20\x3c\xa6\xbb\x26\x4f\xf1"
- "\xfa\xd3\x99\xae\xc0\xd5\x86\x36\xfe\xaa\xec\xbb\xe5\x5c\xc6\x5b"
- "\xa0\xc3\x7b\xf2\xfe\x4a\x4f\x72\xde\x1e\xb5\x3f\xe1\xad\x54\x37"
- "\xfd\xdd\x40\x68\xaf\xd1\x5b\xe9\x6e\xc3\x0d\xca\xbe\x36\x7d\xe7"
- "\x97\xe8\xd3\xf2\x83\xce\x44\x61\xd9\x9e\x28\xce\xd3\x5b\xef\x07"
- "\x45\x86\x11\xfd\x56\x7e\x48\x76\xd4\x79\x37\x5d\x76\x90\xbf\x2c"
- "\xb6\x5c\xbc\xb5\xfb\xfa\x72\xf1\xd6\x13\xda\x5c\xdf\x5a\xb5\x07"
- "\xf0\xad\xc3\xfa\x98\x43\xec\xfc\xce\x2f\x2d\x75\xb2\xfc\x5c\x55"
- "\x36\x68\xe2\xcf\x65\x3d\x53\x08\xba\x39\x90\xb6\x4f\xd7\x0d\x2c"
- "\x43\x89\x01\x1e\x0f\x91\x94\x73\xc4\x79\xa1\x7b\x5a\x54\xff\xfc"
- "\x50\x36\xdb\xaa\x41\x67\xdb\x51\xf4\x5f\x6f\xf0\x1e\x78\x6f\x72"
- "\x7e\xc2\xb0\xf3\x50\x9a\x9b\xfe\xa2\xe9\xbf\x7c\xb3\x68\xcc\x57"
- "\x7b\x4a\x52\xe4\x3c\x6d\x02\xb7\x73\xbe\x6f\x8c\xdb\x3a\xc2\x52"
- "\x81\x37\xdf\x3d\x86\x31\xc2\xa1\x62\xbd\xef\x0f\x3a\x73\x99\xde"
- "\x52\x9f\x1a\xd9\x1e\x06\xed\x5e\x35\x06\x3b\xaf\xcc\x49\x23\xae"
- "\xf3\x95\x9d\xb7\x74\xfe\x6c\x36\x99\xff\xef\xb4\xa7\xa9\x6a\x2e"
- "\xa5\xd6\xdf\x63\xa6\x7f\xcb\x21\x23\xd3\xc1\x4d\x87\xd6\x2a\xda"
- "\x1d\xea\xd0\xf9\xe3\xa6\xb7\xe4\x3d\x5d\x3c\x07\xbf\xcc\x2f\x86"
- "\xd4\x9a\xc2\xa1\x6e\xf4\x81\xda\xda\x59\x7b\x42\x8c\xfe\x61\xb1"
- "\xa5\xa2\xda\x52\xb6\x71\xeb\x86\xe9\xd3\x27\xc7\x18\x4b\x1c\x3a"
- "\xa3\xc6\x12\x6f\xc7\x87\x8f\x25\xf0\x8d\xfa\xb7\x0d\x44\x8f\x1d"
- "\x0a\xd7\x68\x6e\x0a\xd6\x64\x52\xe8\x77\x16\x15\x66\x85\x7d\xce"
- "\xa3\xc2\xb9\xf3\xd6\x3c\x52\x5e\x5a\xb6\x2d\x2c\xf4\xee\xf0\x79"
- "\xbe\x7d\xbf\x44\xd9\xa6\x5b\x16\x41\x7f\x18\x96\xbe\xc0\xfd\xce"
- "\xdb\x81\x3a\xbf\xf8\x0b\x64\x37\x87\x7d\x03\x9d\xaa\xf1\xd3\x29"
- "\xe8\x37\xf1\x1d\xd6\xeb\x13\x95\x7f\xcc\x00\xf1\x3c\x5a\x22\xea"
- "\xee\xc1\x98\xee\xb2\xda\x03\xfe\xce\xf4\xde\x16\x1f\xf4\xc4\x92"
- "\x66\x65\xef\xbc\x7d\x16\xe1\xc9\x08\x8f\x53\xfb\x58\xde\x99\x84"
- "\xf1\x72\xae\xf4\x85\xb0\x85\x7d\x21\xbc\xfd\x19\xd3\x68\xb6\xd7"
- "\x41\xca\x27\xd7\xdb\xcd\xec\x2b\xdb\x4d\xef\xe4\xb3\x7d\xc1\x69"
- "\x11\xf6\x91\xe5\xa7\x94\xc9\x6f\xb6\x87\xdd\x80\x29\xf6\x2f\x69"
- "\x16\x6f\x94\xf0\xda\x7e\x3a\x60\x3e\xc0\x76\x9b\x29\x6d\x62\x60"
- "\xd8\xf9\x4e\xae\x6e\x83\xf0\x7e\xd3\xf1\xec\x0f\xbd\x1f\x9c\x02"
- "\xfd\x3d\xc5\x9b\x28\xd6\xb0\x6f\x11\x03\xa5\x73\xff\x90\x68\x2b"
- "\x96\x67\x94\xb8\x5f\x64\x9d\xd0\x26\x75\xe9\x3b\x2d\xba\x5e\xd8"
- "\xab\xc6\xa3\x93\x39\x3f\xfa\xcf\x4f\x55\xff\xf9\x4e\x97\xde\x16"
- "\xf0\xbb\x47\x97\xd5\x88\x73\x2e\x1b\x6a\xca\x37\x95\x97\x59\x66"
- "\x54\x4f\xa6\xb0\x9b\x1c\xad\xe5\x1b\x2c\x9b\xca\x9f\xdf\x5c\x5e"
- "\x2d\x07\x7a\x1c\x1b\xb9\xc6\x02\x1d\x14\xba\x57\x57\x9e\xb5\xf9"
- "\xd5\x1d\x3c\x16\x4e\xac\x9f\x2e\xe7\xd3\xd5\x3a\xc8\xfb\x27\x82"
- "\x7b\x6f\xcc\x55\xf3\x91\x17\x40\xd7\x4e\xcd\xa7\xee\x92\x5d\x6c"
- "\xc7\x9d\xa7\xce\x85\x6a\xcd\xfe\x57\x9b\x15\xad\xe2\x77\x0f\x3b"
- "\x7f\x55\x19\xb2\xd7\x3a\xe5\xfe\x57\xb5\x77\xee\x57\xbb\x40\xe3"
- "\xb2\x90\x0d\xd2\x79\x91\xf5\xa0\xd4\x87\x5f\xa0\x0b\x35\xdb\x19"
- "\xe5\x74\x66\x89\x2d\xa2\x7f\xdf\x35\x92\xf3\x81\xec\x63\x5d\xe9"
- "\xd7\x5f\xb9\x75\x3a\xc2\x7e\xe9\xe7\x79\x07\x7d\x7c\xb4\xcc\x7f"
- "\x55\xd4\x6d\x23\x23\xcf\x3d\x40\x87\xb4\xfc\xf5\x26\x8f\x51\x38"
- "\xdf\x39\x0d\x5b\x66\x17\xa7\x69\xd3\xf6\x90\x89\xe4\x25\xd0\x27"
- "\x9d\x19\xa1\x71\x47\xe7\xa0\xb4\xe3\xaf\xb1\xdc\xfc\xea\xe4\x1a"
- "\xee\x23\x94\xee\xbe\xe1\x8b\xf0\x15\x93\xd5\x9c\xbb\xd2\x6f\x9d"
- "\x56\xad\x0e\x83\xac\xb3\xb4\x3d\x88\x46\x25\xd7\x9d\x83\x90\xb9"
- "\x5d\xcc\x0b\xe8\xf9\x06\x9d\x5e\x5c\x5f\xc6\x9d\xe7\x95\xa1\x87"
- "\x5b\xde\xdb\xee\x33\xaa\x3b\x10\xdf\x39\xab\xc6\x47\x9d\xa7\xc3"
- "\xd7\x8e\xd4\x58\xa8\xb3\x3f\xe4\x6f\xe0\x57\x63\xee\xe1\xda\xb8"
- "\x81\x8f\xb5\xac\x5b\xb3\xb5\x74\x5d\xf9\x9a\xcd\x55\x33\x2d\x9b"
- "\x37\xc8\xa5\x39\x39\x0d\x50\xb3\xf9\x99\x75\x16\xd6\x22\x6b\xf2"
- "\x0b\x0b\xd7\x2c\x7a\x74\xf9\x13\x93\x69\x51\x29\xc2\x6a\x36\x5a"
- "\x0a\x33\x67\xaa\xa8\x47\x16\xe7\x3d\xb6\x26\x6f\xd9\xa3\x4b\x57"
- "\xc4\xd8\x1b\x9b\x00\x99\x70\x80\x47\x71\xe7\xe8\xd7\x0b\xd4\x5e"
- "\x88\x77\x6d\x91\x7b\x21\xde\x05\xad\xde\x3d\x8c\xe7\x04\xd1\xaf"
- "\xd3\xf1\x2c\xc0\x93\xa9\xe4\x66\x12\x74\xe0\xbb\x87\x42\x72\xc3"
- "\x71\x6a\xbf\xb0\x9a\x7b\x7d\x17\xfa\xef\x1d\x7f\x78\x5c\x48\x17"
- "\xfc\x87\xdf\x48\x7d\xa9\xc9\x05\xcb\xc3\x1a\x7f\xbc\x94\x0d\x65"
- "\xaf\xbc\xeb\xd7\x65\x43\x9e\xb7\x43\xf8\xff\x4b\xde\xfb\x07\x46"
- "\x55\x5c\xfd\xc3\xb3\x9b\x10\x02\x04\x76\x13\x43\x5c\x11\x65\x6d"
- "\xa3\x8d\x2d\x4a\x50\xac\xd1\x47\x6b\x34\xa8\xa0\xfc\xd2\xa2\x8d"
- "\x8a\x24\x08\xd8\x80\x80\x0b\x84\xb0\x84\x90\x5f\x60\xde\xd8\x42"
- "\x58\x10\xf8\x46\x09\x10\x9f\x07\x2c\x56\xd0\xb4\xc5\x36\x5a\xc0"
- "\x55\xa2\x8d\x90\x64\xa3\xc5\x36\xd8\x88\x6b\x0c\x18\xd2\x80\x0b"
- "\x09\x64\x49\x76\xef\xbc\x9f\x33\x73\xef\xfe\x08\x1b\x30\xd6\x6f"
- "\xed\xfb\x3e\x7f\x24\x77\xef\xdc\xb9\x73\x67\xce\xcc\x7c\xe6\x9c"
- "\x33\x67\xce\x21\x9d\x19\x3d\xc7\xf8\xde\x43\xfa\x65\x8c\x85\x7c"
- "\xda\x17\xa5\x74\x1e\xbd\x6f\x8f\x5a\xee\x18\xd2\x37\x13\x3f\xab"
- "\xee\x9f\x0c\x69\x65\xbf\x5d\xc8\x0b\x77\xba\xa5\x2c\xf8\xea\xf5"
- "\x62\xdc\xac\x1c\x76\x8f\xd8\x87\x12\xe7\x1a\x7e\x9b\xe1\x1f\x3f"
- "\xaf\xd1\xb9\x06\x81\x0b\x12\x7b\x7f\xbb\xaa\x87\x1e\x27\x0c\x69"
- "\xa5\x9a\xbf\xea\xcc\x6b\x98\x3e\xfc\x1a\x1b\xdb\xa0\xe7\xe0\x15"
- "\x7e\x3b\x4e\xda\xc3\xfd\xb6\x52\xe3\x9f\xf1\x1b\xf3\xff\x4b\x4b"
- "\x4f\xfd\x57\x49\x80\xfe\x2b\xd7\xc2\xbf\xa8\xb3\xb8\x88\x47\xb6"
- "\x3b\x5c\xc2\x4f\xe2\x5d\x75\x96\x0e\xf2\xad\x37\xf0\x38\x7b\x6d"
- "\x70\x9e\x97\x77\xe1\xf7\x30\xb4\x4d\xac\x21\xa3\xa4\x4e\x01\xf2"
- "\xd8\x6b\x77\x4a\xd9\x44\xa6\x13\xdd\x9d\xec\x55\xb2\x63\x0a\xa7"
- "\xfe\xc1\xef\x52\xf4\x51\x72\x28\xdc\x1b\x52\xa0\x57\xfd\xd1\xbc"
- "\xb6\x8e\x64\x54\xa2\xd5\x0b\x7a\x25\xe3\x85\x42\xfc\xe1\x4a\xd8"
- "\xe7\xe7\x2f\xb9\x5b\xd2\xf6\x35\x5b\x95\xb5\x8d\xd6\x4d\x77\xaf"
- "\x76\x8a\x59\xbc\x51\xeb\xcf\xc9\x5e\xd7\x5d\xd4\x5f\x9d\x85\xaf"
- "\x55\x6b\x7d\xd9\x7e\x63\x0a\x64\x2f\x66\x3e\x50\x76\x13\xa5\x63"
- "\xfe\xbf\x36\x4e\xb5\xc3\xec\xe8\xf9\x2e\x70\x38\x59\xbe\xbf\x2b"
- "\x52\x7b\xbf\xa7\x9f\x53\x71\x50\x90\x94\x5c\xb7\x0b\x55\x58\x82"
- "\x1a\x96\x36\xe8\xcc\x0f\x9d\xe5\xac\x92\x63\x52\xd3\xc1\x19\x65"
- "\x7b\x76\x43\x96\x80\xfc\xbd\x3e\xb9\x50\xd5\x03\x60\x6e\xef\xda"
- "\x71\x23\x63\xf3\x3a\x96\xa6\xfa\x74\x28\xa4\xfb\x20\xdf\x65\xa8"
- "\x87\x2d\x40\x47\xe6\xb3\x15\x73\xb2\xdd\x24\x13\x43\xd6\x4e\x5e"
- "\x45\xe5\xd0\xbc\x92\x7a\x9b\x5d\x76\x47\x07\x63\x28\x6f\x81\xd8"
- "\x03\x2d\xdc\x65\x12\x63\x0f\xb2\xb6\x90\xf3\x73\xf8\x57\xaa\x2d"
- "\x85\xe0\x5d\xe4\xb9\xa0\x5d\x1d\x3e\x5d\x90\x38\x23\xb3\xcb\x42"
- "\xf6\xa1\x9d\x85\xbb\xa3\x42\xe9\x0b\x81\x0f\x19\x33\x16\xcc\x7a"
- "\xf6\xe9\xa7\x2f\x0d\x0d\x81\x36\x9b\xb6\x42\xa5\x18\x65\x42\xfe"
- "\xdd\x60\x92\xe3\x74\x37\xf0\xff\x57\x19\x92\x7f\x7b\xe2\x04\xe6"
- "\xcd\x55\xad\x6c\x77\xb5\xc6\xbf\xcb\x79\xb4\xfb\x30\x2f\xdc\x6d"
- "\xf2\xcf\x8d\xdd\xe5\x17\xce\x8d\xdd\x7b\x42\xcf\x8d\xdd\x0d\x58"
- "\x67\x1b\xf1\xfc\x30\xbe\x29\xf6\x5e\xe8\x5e\xe5\xc1\xed\x06\xcf"
- "\x5d\x82\x07\x4f\x5b\xc6\x74\xc4\x7f\x93\x6e\x9a\xd6\x03\x2f\xe4"
- "\x5a\x2f\x30\x22\xcd\xc3\x8c\xb4\x16\xac\x5d\x40\x7a\xc7\x11\xdc"
- "\x73\x8e\x3b\xd3\x96\x01\x2f\x70\x5f\xd2\x2a\xf7\x6b\xa7\x9f\x85"
- "\x1c\x82\xdf\x6b\x8f\x13\x56\x28\xe4\x54\x9d\xc9\xf5\xfa\xf5\x71"
- "\x1a\x8f\x6b\x28\x30\x0b\x5f\xbb\x62\xdd\xc6\x38\xa3\x75\x3b\xcd"
- "\x6b\xb0\xcb\x75\xfb\x75\xcb\x45\x75\xdc\xd1\xaf\x58\x42\xa5\xa3"
- "\x8e\x55\x54\x2f\xd4\xb3\x02\xf5\xda\x43\xf5\x29\x79\x9a\xda\x15"
- "\x76\xb3\xc1\x93\x28\xf6\x18\xa8\x9e\xd3\x3b\xd8\xcd\x54\xbf\xe9"
- "\x0b\x6f\x66\x5b\x9f\xa6\x7d\x62\x69\x1f\xa4\x8e\xa5\x70\x8c\x99"
- "\xfe\xc7\xd9\x1b\xf1\x1d\x22\xf6\xe1\xeb\xc0\xa2\xc8\x2a\xc9\x07"
- "\xcb\x3d\x18\xca\x43\xcf\xe4\x38\x7d\x23\xfe\x80\x95\xea\xfc\x46"
- "\xbc\x96\x2f\xb0\x6e\x29\x33\x2c\x60\x2c\xe7\x3c\xfd\xf4\xec\x45"
- "\x8b\xb5\x38\xce\x09\xcf\xce\x9b\x75\xa7\x7a\x6e\x76\xc1\xec\xa5"
- "\x69\x73\x66\x09\xbb\x7c\xa4\xca\x9f\x3d\x78\x8d\x91\x24\x0b\x08"
- "\x5b\x57\xc1\x67\xec\x21\x1b\x2e\xc1\x73\x34\xb1\x0a\x9b\xdc\xc7"
- "\xae\x18\x2f\xd7\x81\x41\x4b\x51\x8f\x5d\xda\x3a\x40\xfa\x88\x76"
- "\x76\x4d\x31\xed\x2f\xd1\x59\x68\xda\xc7\x22\x9d\x04\xf2\xd4\x3b"
- "\xd9\xeb\x39\xda\xd8\x5e\x83\x74\x3a\x7f\x61\x5f\x40\x36\x7b\x7b"
- "\xae\x51\xd6\xa5\xe4\xf0\x98\xc4\x44\x60\x40\x14\xad\x0d\xb4\xaf"
- "\x22\xfd\xe6\x57\x0c\x27\x6c\x23\xbd\x99\x7d\x01\xd9\xc0\xbd\x41"
- "\xba\x0e\xa3\x93\xed\x89\x87\x5c\x94\xb3\x2a\x9b\x45\xd2\x37\xb0"
- "\x6e\x38\xa5\x0e\xb6\x22\xe9\xdd\x1c\xc6\xd4\xb5\xc3\xb9\x46\xe8"
- "\x04\x2b\x64\xcc\x00\x5b\x8a\x4d\xd5\x39\xd8\x90\x0f\xe3\x7f\x30"
- "\x93\x75\x4e\x4c\x15\xfb\x67\x02\x17\x2a\x56\xf1\xf5\x89\xe2\x5c"
- "\x2f\xae\xa9\x0a\xcf\x08\xa3\x7b\xe0\xf2\x40\xf0\xfb\xbb\x78\x5e"
- "\x02\x53\x6d\x1b\xc3\x8e\xb3\xdf\x0d\x26\x9d\x29\xfa\xa3\x8c\x68"
- "\x81\xf2\xcb\xd4\xf2\xcb\x50\x3e\xd6\xbf\x2b\xd5\x98\x95\x15\x35"
- "\xda\xb7\x30\xb6\x5d\x58\xbb\x72\x68\xfd\x42\xfd\x33\xf1\x67\x95"
- "\xfa\x19\x37\xe4\xa4\x11\x3e\xfd\x8c\xe4\x91\x7e\x17\xae\x8d\x49"
- "\xfa\xb6\xda\x86\x52\xa5\x50\xf8\x4c\xd4\xa9\xdf\x2a\x25\x5d\x81"
- "\x56\x26\x47\x99\xfc\x5c\x5b\x39\xd6\x9a\x48\xcc\x31\xd7\x90\x02"
- "\xac\x29\xf4\x0d\xe2\x71\x3b\x46\x70\xac\x39\xde\x34\x6f\xb8\x3c"
- "\xb7\xbe\x8c\x0d\x0e\xe4\x6f\xf1\xbd\x4c\x3f\x4f\x86\x32\xce\x01"
- "\xcb\x72\xe9\x30\xc4\xef\xc4\x59\x02\xb2\x0b\xa1\x7e\xed\x42\x3f"
- "\xa1\xaf\x92\xf0\x9d\x0a\xf0\xe5\x83\x41\x87\xdf\x51\x7f\x95\x28"
- "\x98\x73\x5d\x82\x57\x37\x50\x8c\xf3\x26\xf6\xbb\x2d\xd4\x57\x54"
- "\x16\xc6\x45\xa4\xa7\x33\xf5\x7e\xf2\x1b\x45\xb4\x5e\x91\xc3\x5b"
- "\x68\xaf\xef\x38\xfb\xc3\x35\xc4\xc3\x82\xaf\x17\xbf\xf3\x66\x71"
- "\x45\xf4\xb5\xb0\x77\xfc\xc3\x35\x2b\x5a\xb8\x72\xbe\x90\xf1\x6a"
- "\x60\xe9\x79\x3d\xf3\xb8\x21\x83\xa2\xde\xfa\xbc\x93\xe4\xdb\xaa"
- "\x1c\xf3\xab\x98\xe1\xbb\x91\x25\xd9\xcc\x48\x7e\xc1\xf2\x2c\xdc"
- "\x5d\xd7\x51\xc6\xea\x2c\x65\xec\xa0\x67\x03\xb3\x67\x91\x4e\xf3"
- "\x0f\xd5\x87\xac\x1b\xc8\xbe\x7c\x00\x7e\x3f\x6f\x7e\x94\xbe\xf5"
- "\xfb\xf4\x43\x87\x3f\x66\x87\xec\x1f\x33\xf3\xe3\xe2\xde\x52\x93"
- "\x7a\x90\xd5\x24\x1f\x64\x79\xcd\x5c\x21\x7e\x28\x77\x3e\x7d\xa3"
- "\x18\x65\x95\x93\x0f\x2d\xa3\xd2\x6e\x1a\x88\xf6\x87\x4f\xb6\x32"
- "\xb1\x9f\x68\x5f\xf0\x36\xea\xf8\xfb\xd3\x5b\xcf\xb0\x48\xfb\x82"
- "\xf7\xc4\x6f\xa1\x5f\x40\x7b\x1d\xb3\x1a\x84\xad\x19\xf9\x0f\x73"
- "\x58\x5b\xe8\x9c\xa6\xb2\x96\xea\xe8\x95\xf5\x06\xbd\xc2\xb5\xf7"
- "\xb7\xe5\xfa\xde\x17\x36\x8d\x5b\x88\x1e\xa8\x53\xed\x54\x49\x93"
- "\x9a\x06\xd0\xf4\x51\x95\x3e\xa9\x81\xf4\xf9\xbd\x91\xe8\x43\x76"
- "\xa4\x4a\x56\x5b\x39\xea\x96\x0c\x1a\x28\xda\x37\x68\x0c\xd0\xbe"
- "\x17\x95\x5f\x72\x86\x45\xd9\x17\x90\x9d\xe9\x1f\x96\x18\xa6\x84"
- "\x47\x2a\xe7\x4e\x56\xac\x3d\xcb\xc2\xa9\xdf\x68\x9d\x5d\x2b\x9e"
- "\x0b\x9a\xa7\x52\x9f\xb9\xa2\x93\x2d\xf8\xc3\xf8\x4c\xb6\xd2\xd8"
- "\xc3\x35\x07\xfd\x55\x0c\x3a\xb9\xd0\x57\xe5\x74\x95\xe3\x71\xf4"
- "\x4e\xf2\xab\x48\x6b\x19\xc6\x8a\x3f\x7d\xfd\xe8\xdf\x78\x30\x77"
- "\x14\x21\xa7\xfd\xde\xa5\xac\x9b\x58\x2c\x6d\x0e\xdf\x48\xdc\x02"
- "\xbe\xb8\x6c\xbd\x38\xd7\x1e\x05\x5e\x9e\xe4\x73\xf6\x92\x38\xff"
- "\xf2\x07\xdf\xfa\xf7\x2b\x11\x73\xfc\x0f\x66\xbd\xb0\x2d\x4b\xd9"
- "\xa0\x8e\xf5\x0d\x9d\x85\x7b\x20\xff\xc6\xd5\xcb\x39\x51\x61\x17"
- "\x7a\x08\xe0\x40\x6f\x3c\x09\x70\xb9\x86\x6c\xf5\xf8\x95\xa9\x2c"
- "\x4a\xc7\x5d\x51\xe9\x06\xee\xf0\x54\xd1\x18\x8a\x12\x63\x5f\x3e"
- "\x03\x1f\xe9\x32\x00\xcb\xeb\x91\x1e\xae\xa5\x13\xae\x2b\x90\x2d"
- "\x49\xae\x9d\xbc\xcc\xc0\x73\xcf\xb2\xe1\x42\x47\xa4\xa5\x2f\x73"
- "\x19\xea\x4c\x8c\x6c\xf7\x3d\xe4\xcf\x82\xde\x41\x7a\x18\xd6\x81"
- "\xbd\xf8\xae\x1d\xf9\x63\xb5\xfc\xbc\x3d\x35\xdc\x61\xad\x12\xf3"
- "\x8c\x7c\x1e\x69\xeb\x02\xd2\xfb\x4d\xb6\xba\x0c\xa2\xcf\xb4\xb4"
- "\xc5\xa9\x62\x1d\xa3\xb3\xf3\xe0\x53\xb9\xa8\xcf\x71\x91\xae\x83"
- "\x9c\x29\x62\x9a\x07\xa4\xe9\xc9\x4f\x01\xf9\xb0\x0b\x48\x0b\x43"
- "\x9d\x99\xef\x1e\xdf\x5e\x3b\x57\xec\xf7\x9b\x26\x2f\xa3\xfd\x32"
- "\x7c\x67\xae\xfa\xed\x65\x9c\x49\xbf\x98\x32\x4d\xae\x99\x6f\xe6"
- "\x04\xca\xb8\xb4\x47\x41\xdf\x56\xda\x53\xf5\xde\xf6\xd4\x30\xfa"
- "\x3e\x95\x45\xfa\x49\x11\x5b\xdd\xd3\xc2\xc8\x27\x33\x5f\xb7\xaf"
- "\x9e\xd3\x59\x0d\x94\x2b\xea\x63\x85\xfc\x1f\xbd\x7f\x4a\x68\x5b"
- "\x98\xd7\x8a\xed\xb9\x8f\x63\x4c\xff\x71\x15\x61\x8a\xd7\x38\x76"
- "\xbb\x79\x2e\xd9\x2f\xbc\xe9\xa5\x3e\xf5\x62\x9e\x7b\xa3\xc7\x6e"
- "\x1f\xd5\xc2\x74\xb9\x98\x3b\x72\x1f\xef\x8f\x57\x11\x4f\x95\xa7"
- "\x70\x8e\xdf\x46\x1a\xbb\x86\x36\xb2\x61\x19\xbb\x53\xd8\x8d\xc4"
- "\xfc\x26\xdf\xe1\x6e\x61\x35\xf9\x9f\xb2\x1a\x8f\x23\x7f\xef\x19"
- "\x57\xb8\xb4\x1f\x09\x47\xb9\x7f\x1c\x4d\xcf\xf2\x30\x5f\xd2\xbc"
- "\xe5\xbd\xcb\x81\x90\x2d\x40\xbb\xcf\xe5\x5a\xf0\xc7\x55\x9a\x3c"
- "\x71\x89\x36\x34\x92\x1f\x42\xb2\xaf\x53\xd6\x3f\x57\x81\xba\xe4"
- "\xf1\xce\x04\x36\x2a\x9b\xf4\xba\x7f\xdc\x33\xa4\x83\x25\xab\xe5"
- "\x7e\xad\x96\xdb\x78\xb1\x72\x69\xdc\xd6\x94\x4a\x9b\x0d\x25\xe6"
- "\xb9\x72\x2f\xca\xf6\xc6\x3c\xe7\xc4\x5a\x93\x97\x77\x9e\x74\x27"
- "\x95\xd7\xe0\x3b\xe5\x75\x9e\x7a\x46\xbe\x4c\xb7\x2a\x58\xaf\xbf"
- "\x36\x31\xd5\x56\x26\xef\x14\xfb\xd3\x60\x85\x27\x18\x21\xe7\x90"
- "\xae\x34\x8f\x70\x96\x74\xcf\xb9\x5e\x16\xe1\x00\xc2\x93\x0f\x3e"
- "\x94\x31\xf4\x7d\xd2\x4b\x03\xab\xbc\xdc\xa4\xdf\x77\xce\xc9\xd6"
- "\x02\xbf\x85\x4f\xbe\x95\x57\xbe\x34\xa4\x80\xdd\xc5\xf5\x06\x61"
- "\x0b\xa5\xac\xdb\x51\x89\xbe\x6d\x90\xb6\x39\x29\xdb\x03\xec\x72"
- "\xc2\xf0\xad\x75\x64\x97\xc3\x8d\x29\x19\x65\xb4\x66\xa2\xcf\x3a"
- "\x0b\xff\xb4\xd7\xc9\xde\x14\xbe\x4f\x56\x93\x1e\x40\xe0\x7c\xe5"
- "\xf5\xae\xe8\x82\x7c\x2a\x83\x7c\x03\x29\x59\x9e\x8a\xb5\xa7\xc1"
- "\xf7\x08\x7a\x54\x0e\xa8\x6b\xeb\xb4\x73\x5b\x41\x3e\xcd\x23\xb5"
- "\x6c\x03\xca\x3e\xc2\xd7\xd1\x39\xb4\xca\x04\xd9\x37\xf4\xfb\x4f"
- "\xe2\xfc\xb7\xa7\x9b\xce\xf3\xfc\xc9\x52\xd6\x45\x3a\xb9\x3f\x0d"
- "\x07\x5f\x68\x6f\x37\x16\xe4\xff\xdc\x94\x0f\x1e\xa0\xf2\x0e\xa7"
- "\xfe\x84\xd4\x23\xaa\xfe\x05\x7b\xdb\x83\xe2\x9b\x4d\x03\x1d\x28"
- "\x04\x3c\x6e\x6c\x2b\x7b\x7b\x77\x17\xe4\xfc\x6e\xac\xad\x5d\x90"
- "\x13\xf8\xe6\xd4\xa8\x92\x61\x2c\x11\xcf\x86\xb5\xb2\xca\x75\x1e"
- "\x3d\x8b\xc5\x9f\xd1\x75\x65\xc6\x00\x94\x9b\x4c\xfa\xcf\xda\x33"
- "\xb4\x27\x5b\x29\x70\x7f\xed\x4b\x2c\x5e\x41\x79\xa4\x77\x5d\x3b"
- "\x8c\xc5\x93\xce\x15\x69\x09\x69\x5e\xb9\x27\xa1\xc9\x54\x2b\x87"
- "\xb1\x91\xc1\xdf\xad\x54\xcf\xf8\xbd\x2d\xd6\xf8\xa5\x2e\x76\xb5"
- "\xe5\x67\xbc\xe9\x38\x7b\x6b\x1e\x2f\x0c\xe3\xfc\x4a\x93\x5e\xca"
- "\x14\x6f\x3d\x62\x28\x95\xe3\x4e\xe8\xe0\x31\xde\x68\x8f\x43\xd5"
- "\xed\xea\x84\x5f\xc5\x98\xf1\x63\xe8\x3c\x85\x48\xd3\x19\x89\x96"
- "\x46\x51\x0f\xd5\x17\x9a\x77\xe5\x8f\xd3\xa9\x0c\xaa\x4f\xda\x0c"
- "\xa9\x17\x26\x3f\x69\xa0\xb1\x88\x33\xb5\xfa\x25\x16\xf5\xeb\x97"
- "\x98\xb1\xf6\x69\x6a\xd7\x5b\xab\xe4\x5c\x0c\x67\x54\x5f\xc5\x46"
- "\xf3\x0c\x63\x02\xf5\xa6\xef\xd1\xd8\xa8\xf3\x7c\x6d\xcf\xcb\xe4"
- "\x8a\x7d\x2e\xf9\x14\x78\xeb\x7d\xfb\xa2\x5d\x6c\x72\xb3\x47\xfa"
- "\xf6\x99\xc6\x5c\xdb\x50\xde\xb6\x61\xcc\x88\xb2\x3e\x72\xcc\x23"
- "\xac\x35\xfd\xc0\xbe\x68\x0f\x95\x7d\x8c\xd6\xa3\x35\xa0\x8f\x5c"
- "\x97\xde\x2e\x75\xb8\x1b\x18\xf9\x95\x9f\x64\xe1\x5e\x2a\xe7\x38"
- "\x7b\xfb\x2a\xd1\xde\xcd\x26\x73\x9a\xf4\x65\x27\xda\xea\xd3\xb7"
- "\xab\xed\x70\x9c\xa1\xf2\xde\x4e\x74\xa4\x83\xe7\x54\xdb\xa4\xd1"
- "\x5a\x8e\xaf\xb7\xe7\xdb\x17\x6d\x67\xd4\x3f\x94\x1f\xf7\xd3\x1c"
- "\x6d\xc8\x7b\x32\xb8\x5f\x28\x0f\x9e\xad\x41\xb9\xb7\xfa\xf7\x91"
- "\x68\x7f\xc3\x9f\xa7\x0c\xed\x01\xad\xea\x37\x83\x46\x52\xbf\xf6"
- "\xd6\x79\xaa\xab\x93\xbd\xe5\x76\x64\x7e\x1a\xfa\x1c\x13\xe6\x3e"
- "\xc6\x7d\x41\x9d\xd0\x2d\xbd\x7d\x62\x92\x47\xe1\x12\xcf\xfe\x5c"
- "\x06\xde\xad\xd8\x89\x2b\x61\x81\xc0\x93\x1b\x69\xef\xf7\xcf\x5b"
- "\x0c\x3a\xd9\xbf\xd4\x16\xe2\x99\x42\xf5\x71\x80\x5e\xdf\x48\x75"
- "\xd5\xfa\x98\x1b\x5f\x2b\x56\x68\xbf\x66\x18\xe8\xdd\x6d\x62\x72"
- "\xfc\x71\x1b\xca\x5d\xa3\xf2\x90\x2d\xea\x7a\xda\xd2\x1e\x3d\xb6"
- "\x82\x2f\x37\x31\xcd\x66\x0f\xf3\x77\x57\x9a\xb4\x83\x34\x11\x46"
- "\x6d\xd3\xcb\xb9\x43\x75\x54\xdf\x6d\x96\xfb\xc8\x7f\x9e\x86\xf7"
- "\x9b\x43\xb6\x37\x6c\x18\xc5\x11\xce\x23\xbf\x7d\xe2\x7c\x01\xb0"
- "\x0a\xeb\x41\x84\xa3\xa3\x8b\xc9\xbd\xed\xbd\x57\x50\x8c\x77\x3a"
- "\x5b\xa6\xd5\xad\x6f\x3a\xf8\x3f\x37\x4b\x1d\xfc\xde\x78\x4d\xde"
- "\xe4\x46\xd0\xb8\xd0\x20\x7c\x8c\x83\xef\x52\x3a\xa2\x5f\xb3\xb9"
- "\xa2\xf7\xd9\xe5\xbc\xd9\x3b\x81\x47\x4b\xbc\x4d\x73\xb3\x7c\x6a"
- "\x97\x2a\x77\x45\x50\x9b\x51\xce\x3c\x6d\x2f\x58\x2b\xbb\x57\xbf"
- "\xfd\x5a\xdb\xd0\x26\x79\x26\xf9\xb5\x62\xd1\x36\xf2\xab\x21\xdb"
- "\x26\xf6\x32\xfb\xd6\x9e\xbd\x7b\x24\x6d\x5f\xb3\xd9\x87\x51\x19"
- "\xfb\x0b\x84\x4d\x3f\xfa\x04\xf8\x70\x79\x2b\xdb\x77\x07\x1f\xf8"
- "\xeb\x81\x7d\x2b\x73\x9f\x8c\x91\x68\xdb\x67\xdf\x08\x0c\x96\xe7"
- "\x8c\xc8\xbe\x65\xff\x1c\x60\xb9\x9d\x64\x98\x76\x7c\x0f\xe3\x23"
- "\x00\x87\xf6\xb5\x51\x5f\xdd\xb8\x8b\x25\xcb\x71\xb8\xef\x0b\xd2"
- "\x4b\xc8\xb8\x2a\xfb\x6c\x18\xf7\x53\xa5\xbc\xa4\xd9\x77\xea\x84"
- "\x7d\x67\x20\xc6\xf6\xb1\x8e\x52\xa6\x89\xd9\x01\x59\x6c\x5f\xbe"
- "\xb0\xe1\x41\x7d\x97\x7a\x34\xfc\xdb\x97\xcf\x49\x37\x9c\xab\xea"
- "\x08\x09\xcb\x72\xa5\x5f\xae\xce\xc2\xfd\x66\x9f\x8e\x90\xce\x61"
- "\x16\xf2\x6a\xca\x87\xbe\xff\x9a\xf2\x48\xbf\x41\xad\xea\x19\xc5"
- "\xfd\xb7\xa8\xe7\x0f\x13\xc8\xae\x09\xef\x4e\x73\xb2\x26\x21\xaf"
- "\x12\x0d\xe8\xdb\xa2\xee\x7a\xd2\x07\xee\xb7\xfa\x75\xb2\xfb\xe4"
- "\x99\x46\x61\xff\xb2\xdf\xa6\x8d\x11\xb4\x37\x42\xfa\xd2\xdf\x7b"
- "\xfe\xc0\x48\x26\xc6\x40\x3b\x37\x0d\xfc\x61\x19\x8d\xc9\xfd\x95"
- "\x81\x74\x9a\xec\x51\xf2\x24\x06\xed\x2b\xe7\x62\xae\xef\x2b\xbf"
- "\x34\x3f\xf1\xce\x60\x8d\x17\x91\x74\x36\x02\x5f\xde\x6d\x10\xb4"
- "\xb6\x8d\x1e\x47\xbe\x2e\x97\xe7\x92\xef\xde\x77\x6a\xc9\x47\xb2"
- "\xc7\x36\x3a\xc3\x9b\x67\x22\x9f\x90\x4c\xb1\x8d\xb6\x1e\xb7\x30"
- "\x7d\x9a\x85\xf4\xd0\x05\x53\x48\xc6\x83\xcc\x4a\x67\x02\xb2\x69"
- "\x9e\xaf\x98\xc3\x0c\x4f\x66\xa0\xec\xbc\x84\x58\xf2\x61\x4c\xfe"
- "\x8b\xc9\xff\xb8\x37\x2f\x21\x06\xbf\xe3\xc0\xcf\x19\xb9\x71\x74"
- "\x2a\xed\x65\x7b\x0b\x39\xf0\xb8\x91\xfc\x28\xeb\x1d\x2e\x37\x5b"
- "\x71\x92\x45\x92\x8f\x64\xcf\xba\x82\x8c\xba\x8e\xcf\x84\x7c\x33"
- "\xc4\xc2\x62\xc1\x7f\x0c\x07\xcd\x4d\x4a\x74\x01\xe4\xd0\x82\xa9"
- "\xb2\xdd\x5f\x73\xd9\x6e\x59\x6f\xaa\xbf\xc4\xb8\x9b\xad\xb9\xa2"
- "\xee\xef\x2e\xf4\xa0\x7c\xc5\x96\x94\xe9\xb5\x25\x59\xe4\x39\xd8"
- "\x1a\x96\x9b\xc9\x5b\x1c\x1d\x35\x90\xb9\xce\x8a\x78\x51\xb4\x57"
- "\x4e\x6d\xa4\xf6\xd1\xb7\x0f\x9d\x39\x29\x7c\x3e\x7b\x70\x9f\x37"
- "\x4f\x7d\xa7\x0d\xef\xb4\xd5\xb0\x2e\x5b\x92\x68\x7b\x5d\x87\x7c"
- "\x37\x4d\xfc\xa6\xf7\x03\xe8\xa0\xb6\xd9\x47\x07\xb4\x9d\xda\x47"
- "\xed\xf7\x10\x4d\x40\x03\xb5\xad\xa6\x6e\xb5\x9d\xd4\xc6\x83\x58"
- "\x75\x5e\x42\x3b\xd1\x56\xd1\xce\x6e\xb4\xb3\x3a\x83\x31\xf7\xfa"
- "\xd7\xca\xcf\xc7\x24\x59\x48\x46\xcd\xfb\x08\x3c\x7c\x8e\x8d\x41"
- "\x16\x0d\xdf\x9d\x6b\xd3\xff\x0a\xbc\x49\xae\x0b\x32\xa9\x8b\xb7"
- "\x90\xbd\xab\xc3\x82\x3f\x4f\x19\x23\x1e\x47\xe3\xd7\xf1\x6d\xd3"
- "\x21\xe5\x18\xcb\x6d\xe1\x2d\xe0\x4d\xdd\x0e\x0f\xf2\x64\xa0\xfd"
- "\x90\x61\x8f\xab\xf5\xa7\xbc\x2b\x4e\xcb\x76\x19\xe6\xb1\xd8\x77"
- "\x1e\x2f\xd6\x3b\x1a\x8a\x99\xd6\x96\xe9\xc8\x87\xf6\x98\x50\xd6"
- "\x60\x6a\x8f\x82\x76\x6e\x46\x3d\xdd\x01\x6d\xaa\x6d\x23\x9b\xdb"
- "\x4f\xd8\xc0\x29\x4c\xf7\xd2\x29\xb4\xe3\x14\x33\xd9\x72\xc1\x7f"
- "\x3d\x4c\xfc\xa2\xfd\xd5\x41\xa9\x0c\x58\xfa\x8e\x8c\x57\x29\xfd"
- "\xaf\x0e\x6d\x65\xef\x7e\xe4\xf3\xb1\x4a\x7e\xab\xa3\x0b\xe6\xd1"
- "\x38\x12\xbe\x56\x69\xcd\xe8\xc4\x98\xa1\x3d\xed\xa5\xf8\x46\x67"
- "\x42\x9c\xa8\x4f\xe1\x18\xb2\xa9\x8d\xc2\x3d\xc5\x6b\xa1\x33\x66"
- "\x3a\xbc\x97\xc1\x41\x33\x2a\x1f\xfc\xdc\x54\xba\x12\x0d\x43\xda"
- "\xa7\xbe\xce\x92\xf0\x8d\xed\x24\x7f\x57\xe4\xba\xf4\xcf\xbd\xce"
- "\x46\xf6\x0d\x53\xde\x63\xbd\xe1\x37\xe9\x32\xa9\x3c\xb4\x2d\xa6"
- "\x95\xbd\x77\x2c\x78\x8e\x99\x05\x96\x49\x1c\x7c\x6f\x17\xe9\x0a"
- "\xfb\xf8\x5d\xc1\xc3\x91\x3d\x42\x1f\xdf\xab\xd0\xea\x81\xdf\x17"
- "\xd8\x11\x69\x75\xef\x3b\x1d\x0e\x44\xf6\x56\xd6\x9a\x4d\xc2\x9e"
- "\x30\xaf\x64\x13\xf0\x02\xbc\xc2\x01\x13\xed\x3b\x60\xed\xdc\xde"
- "\xc1\x16\x6f\x61\x91\x79\x27\x49\x2f\x34\x91\x1d\x28\x4b\x64\x5b"
- "\xcf\x90\x9f\xa7\x84\x98\x17\xce\xa0\x2f\x55\x0c\x21\x9e\x94\x74"
- "\xae\x7c\x71\x82\x71\xed\x26\x8d\x87\x3f\xf0\x51\xce\x59\xa6\x97"
- "\x31\xba\x0f\xd4\x8f\x35\x73\xcf\x06\xbd\x92\x51\x46\xbe\x83\x63"
- "\x76\xd4\x93\xef\x60\xcd\x1f\xaf\xe0\x7d\xac\x98\x73\xed\xa6\x81"
- "\x6b\x16\xb1\x91\xe4\x43\xdc\xe0\x92\xbc\x9c\x5c\xaf\xab\x68\x3f"
- "\xc4\xa8\xfa\xe8\x35\x4a\x1f\xbd\xef\x8d\x23\xfb\x6c\xf5\xf9\x68"
- "\x2f\x64\x18\x51\xee\x22\x16\x5f\x76\x86\x25\x10\x1f\x94\x76\x4c"
- "\xf2\x6c\x24\x17\x4e\x6c\x33\x70\xef\x3f\x13\xd8\x96\x56\xbf\x8f"
- "\x71\xd7\x62\xf2\x4b\xce\x4d\xbd\xd9\x1a\xaf\x8d\x13\x7b\xef\xc2"
- "\xbf\x25\xe9\xe4\x71\xcf\x36\xac\x67\xe1\x07\xc8\x8e\xaf\x5c\x9e"
- "\x5b\x3a\xe0\x91\xb6\xb1\x9d\x85\x55\xe5\x9a\xef\xe5\x5e\xf7\x96"
- "\x6d\x52\xde\x51\x22\x20\x7f\xb9\x3a\xed\xd2\x6f\x60\x55\x8b\x63"
- "\x95\x12\x20\xe3\x54\x7d\x48\xcf\x28\x8d\x7c\x31\x25\x0b\x5a\xbe"
- "\x6f\x24\xb9\x47\x95\x19\xdf\x31\xfb\xd2\x24\x0f\x23\xec\x93\x4d"
- "\x72\xaf\x0c\x6b\xd3\x90\xce\xc2\xf7\x47\x6a\xeb\x19\xad\xeb\x52"
- "\x37\xfc\x7e\xb2\x53\xff\xcf\xfa\x8b\xd4\xcf\xa8\xda\x53\xd3\x3e"
- "\x47\x32\xf2\x5b\xb4\xf5\x4d\xec\x77\xae\x1c\x76\xcf\xe2\x65\x6c"
- "\xf8\xcf\xaf\x88\x64\xb4\x57\x86\xbc\x2d\x72\xdd\x7d\xbf\xd4\xaf"
- "\x4f\x4f\x16\xf4\xa6\x73\xc5\x42\xc6\x20\x7f\x7d\xd2\x8f\x78\x9b"
- "\xe6\xb7\x4f\xae\xbf\xef\xbf\x19\xf0\x9d\x06\xdf\x3a\x8a\x6f\x90"
- "\xbd\x36\x95\x2f\x79\x93\xf7\x57\x8b\xb3\x67\xc8\x27\xd7\xd7\xf7"
- "\x57\x5f\x84\x17\x4b\x20\xfa\x2a\xaa\x3c\xe9\x68\xfb\x4a\xd2\xd7"
- "\xca\xc2\x46\x6d\x60\xa6\x77\x72\x9d\xe1\x43\xa4\x5f\x5c\x43\x13"
- "\xfb\xe0\x7a\x7a\x4e\x63\xdd\x7e\x23\xe9\x03\x3f\x78\xce\x41\xeb"
- "\x76\x77\x6a\xd4\x24\x92\xf5\x05\x2f\xfe\x41\xe6\x0d\x78\x0f\x69"
- "\x31\xfb\x4f\xb9\xc3\xd7\x66\xb3\x91\xd2\xff\xe1\x07\x42\xde\x70"
- "\x5d\xfe\x4c\xe7\x0f\x63\x99\xe9\x87\x1b\x58\x42\x67\xe1\x07\x65"
- "\x4e\x7d\xab\xb4\x25\xa1\xef\xaf\xdf\xe7\x22\x1f\xea\x6f\x74\x39"
- "\xfb\xc9\xbe\xfa\xcb\x6d\xb8\x4f\xf0\xdf\x7f\xf0\x89\xba\x97\x52"
- "\xef\x64\x7f\x49\xda\x76\x4a\xda\x9d\x0b\xfd\x92\xed\x15\x8b\x7f"
- "\xaf\xfe\x2f\xb7\xc9\xba\xfc\xe5\xb6\x03\x16\x46\xba\xf3\xc3\x5b"
- "\x85\x3f\xe4\xbf\x40\xe6\x78\x7f\x82\xaa\x8f\xa9\x17\xe3\x8a\xf8"
- "\xdd\x22\x92\xc1\xbe\xb2\xaf\x41\x3e\x5a\x27\xc0\x1f\x25\x4b\x1e"
- "\xfe\x95\x62\x05\xe3\x27\xa0\xfd\x3b\x48\xdf\x18\x12\x13\x5f\x62"
- "\x4c\xbc\xb3\x6e\x47\xb5\xb0\xfd\x58\xb7\x7f\x1c\xae\x91\x7c\xdd"
- "\x6f\x2c\xb8\x46\x61\xcc\xe5\xe3\x4a\x63\xcf\x8a\x6b\x2c\x9e\x27"
- "\xd2\xb8\x84\x0c\x6b\xa2\xb8\x70\xed\xd1\x3b\xec\xbd\x9d\x21\x22"
- "\xda\x38\x56\x3d\xca\xa4\x7d\x5b\xf5\x70\x8a\x09\x36\x79\x0b\x63"
- "\x8b\x3d\xbc\xcb\x7c\x35\xf9\xf5\xaf\x1e\x9e\xb7\x85\xf6\x9d\xff"
- "\xe2\x0a\xde\x77\xae\x36\xe2\x6f\x0a\xfe\xb6\xe3\xef\x30\xfe\x86"
- "\xfb\xff\x3e\x34\x76\x16\x56\x0f\x07\x1d\x05\x8f\xd5\x37\x4c\xac"
- "\x16\xbe\xb5\xd6\x92\x5c\x14\xfd\x9c\x4d\xb6\x77\x5f\x39\xee\x23"
- "\x79\xf4\x3e\xa7\xda\x5e\x1b\xee\x8d\xe6\x3c\xac\x6b\xd1\xa0\xc9"
- "\x30\xb4\x39\x7a\xff\x38\x6a\x2f\xd5\xb7\x3d\xfa\x37\x96\xc0\xf3"
- "\x53\x54\x26\xb5\xdf\x15\xfd\x0a\x95\xc7\xf8\x8d\x29\x3e\x7a\xaa"
- "\x74\xa2\xb3\x25\xfa\x76\x94\x21\xf9\x20\xe4\x47\x19\x5a\x7e\x1f"
- "\xed\x87\x91\x2f\x31\xf4\x29\xf2\x41\x26\x8e\xd4\xce\x66\x75\x16"
- "\x7e\x18\xf9\xee\x3c\xb9\x9f\x41\xef\x76\x04\xbc\x4b\xfe\x42\x42"
- "\xbd\x8f\x6f\x46\xca\x6f\xfe\xc6\x72\x9c\x55\x5f\xa5\x7e\xf7\x02"
- "\xdf\x99\xbe\xf3\x8f\xd7\x80\xbf\x2b\x73\xd2\x39\x22\xe2\x87\xee"
- "\x70\x0c\xef\x60\x8e\x32\x05\x6b\xfe\x2b\xe5\xc9\xb9\xdc\x7e\x9c"
- "\x7d\xb8\xaf\xce\xdd\xd2\xc7\xf5\xf0\x43\x61\x7b\xc7\xbb\xf2\x99"
- "\x23\xe7\x26\x61\xcb\x7e\x8a\x1d\x3c\xe9\x70\x89\x33\xba\xf4\xfb"
- "\x08\x3d\xa7\xfd\x66\x5a\x1b\x20\x63\xfb\x7c\xd3\x2b\xc8\xbb\x95"
- "\xd2\x91\x46\x7e\x04\xb6\x05\x3c\xe3\xeb\x77\xec\x94\x73\xea\xe0"
- "\x0e\xe2\x2d\x44\x7d\x3d\xf7\xdb\xa9\xce\x8a\x6d\xc7\x4e\x6a\x43"
- "\x1e\xe4\x3f\x8a\xc7\x47\x73\xc2\x9c\x45\xba\xc2\x83\x05\x18\x77"
- "\x5c\x59\xb7\x63\x67\xdf\xda\x70\x50\x9c\x3f\xce\xf3\xf0\x53\xae"
- "\xe8\x1d\xa4\xe7\xd6\xaf\xcd\xed\x17\x99\x52\xc6\xed\xed\x31\xaf"
- "\x94\x77\x16\x1e\xdc\xfe\xae\x55\xf6\x4d\x1f\xcb\xdd\xae\xb5\x7d"
- "\xab\xda\x76\xa4\x89\x3d\xaa\x51\xa5\xd2\x67\x3f\xee\x1b\x7b\xd5"
- "\x59\xa1\x9f\x89\x1f\xc0\xda\x70\x5e\xd2\xe2\xd0\x48\xdf\xda\xd0"
- "\xa7\x7a\x1c\x1a\xf9\x0d\xbe\xd1\xad\x7e\xc3\xf6\x2d\xbf\x61\xbb"
- "\xd8\x37\xe4\x5e\x73\xcd\xf0\xbe\xcb\x8e\x87\x44\x8c\x64\xe0\xa7"
- "\x4d\x62\x66\xed\x1a\x2f\xe4\x37\x8f\x11\x72\x16\x78\x1b\xb2\x2b"
- "\xa5\xf8\x05\x1e\xdb\x73\xb6\x5a\x6b\x17\xb3\x67\x7d\xcc\x9a\x59"
- "\x8d\xf0\x61\x53\x9b\x49\x32\xdb\x3e\x67\xf7\xfa\x57\x5c\xdd\xfa"
- "\x43\xf3\x88\xde\x5b\xd0\x0f\x9b\x03\xc6\x59\x5d\xc7\xc7\xcc\x91"
- "\x4e\xfa\xd5\x7a\xd2\x6b\x3b\x81\x0f\xe5\x0a\xb0\x01\x3c\xba\x57"
- "\xd0\x03\xfc\x8b\x94\xb7\x5e\x2b\x16\xf2\x96\x4b\xf8\x39\x1d\x2c"
- "\xe2\x12\x14\xbe\x10\x4f\xba\x6f\x6f\x77\xaa\xb9\xb3\x90\x4d\xa1"
- "\x78\x05\xa4\x77\xe6\xc6\x94\xfc\xc9\x9e\x30\x2e\xe4\x29\xf0\xfe"
- "\x14\xaf\xc0\xd1\xe1\x64\x5e\xf0\xd1\x65\xe7\x58\x6c\x19\x78\x4f"
- "\x60\xb6\x91\x70\x7d\x9b\x1a\xb3\x60\xcd\x39\x7f\xcc\x82\xad\xa4"
- "\xeb\x69\xc0\xef\x73\x2c\xdc\xbb\xee\xb5\xe2\xcd\xe7\x58\xfc\x96"
- "\x2c\x96\xb0\x99\x74\x79\x27\x24\xef\x23\xec\xc0\x29\x7e\xc1\xb3"
- "\x09\xb4\x97\xe0\xe7\x7d\xe8\x4c\xb9\x1f\xb7\xc2\x85\x0e\xa4\x4f"
- "\xf4\xae\x15\xeb\xa0\xc7\xb6\xa3\xda\x63\xdc\x3f\xae\x7b\xfd\x6f"
- "\xc0\x2f\xd4\xac\x06\xfd\x22\x43\xf5\xad\x66\x4f\xb2\x21\x20\xe6"
- "\xc4\xbb\xf1\x12\xdf\x51\x56\x7d\x6f\x63\xc2\xbb\x39\x95\x8d\x6a"
- "\x63\x89\xf2\x3c\xe3\x00\xac\x89\x75\x63\xc8\xfe\x2f\x77\x3e\x33"
- "\x79\x37\x4f\xd3\xe5\xbd\xcc\xc2\x1c\x9e\x64\x46\x7f\xb9\xa7\x79"
- "\xcb\xa8\x79\x2c\x91\xf6\x1f\x68\xaf\xc4\xbc\x5c\xe4\xef\x17\x9f"
- "\xc3\x82\xfc\x38\xcd\x5f\xb6\x68\xce\xe8\xc4\x5f\xce\x36\x3f\x3d"
- "\x67\xd1\xfc\xa5\x33\x16\xcd\x66\xe3\xa4\xd9\x84\x70\x21\xbd\x8c"
- "\x6c\x26\x96\xce\xc9\xcc\x30\xcf\x5c\xb2\x68\xd1\xec\x05\x99\xe6"
- "\x89\x29\x53\x2e\xf4\x23\xb8\xd9\xb4\x5d\xf8\x8d\x15\x36\x74\x8e"
- "\x63\xfc\xff\xfc\xe4\x5c\x49\x16\x0b\x37\x14\xdc\x3b\xd5\xe0\x19"
- "\x67\x96\xb1\x8c\xea\x23\xc9\x6e\x95\xe7\xa5\x96\x4a\x3e\xb5\x7e"
- "\x80\xe4\xed\x1f\x48\x92\x67\x2b\xea\xa5\x4e\xa6\x73\xdc\x70\x39"
- "\xa7\x1c\x57\x84\x65\x32\xfa\x3d\x9f\x7e\x1b\x32\x59\xb1\x7d\x18"
- "\xed\x87\x3b\xae\x10\xf9\x36\x4f\xd0\x69\xf9\xb4\x3c\xf2\x79\x9d"
- "\x38\x0b\xb1\x55\xf8\xd4\xac\x4b\x06\x7d\x62\x3a\x0b\x1d\x89\xce"
- "\xf0\x51\x4e\x75\x7f\xbd\x45\xda\xeb\xd5\x47\x92\x5f\x3d\xfe\x7f"
- "\xae\x3c\xa7\x96\x93\x81\xef\x0d\x42\xde\x69\xe8\x83\x66\xd5\xae"
- "\x6f\x44\x93\x5a\x2f\x69\x77\x5a\xf7\xb0\xb4\xef\x70\xe4\x07\x9c"
- "\xeb\x16\x67\xf3\x69\x6d\x54\x79\xd2\x4e\xb5\xbc\xed\x1a\x26\x20"
- "\x7f\x05\xf8\xba\x71\x7d\xc7\x42\x87\x94\x7f\x82\xfc\xa5\xa8\x74"
- "\xda\x6c\x7a\x05\xf8\x30\xbc\x95\xd5\x95\xf6\x1c\x2f\xbe\x1e\x1c"
- "\xbf\x60\xe6\xb3\xf3\x2d\x33\x32\xe7\x3c\x35\x67\xde\x9c\xcc\x65"
- "\xe2\x38\xf9\x48\xf1\xef\xbe\x6b\x67\x4d\xed\xe9\x03\x7a\x24\xe9"
- "\x58\x54\xdf\xb1\x1d\x64\xd3\x20\xf5\x5c\xf5\x5b\x3c\x85\x6c\x44"
- "\xdf\xea\x5d\x2f\x6c\x04\xcb\x84\x1f\x83\xfa\x5d\xe0\x07\x9d\xea"
- "\x7e\x47\x9b\x4a\x7b\xf1\xbc\xdd\xb8\x3f\xd1\x3c\x8c\xdd\xd1\xc4"
- "\x0e\x4f\xa0\x7d\x2e\xd0\x2f\x9f\xd6\xc3\x92\x6c\x5a\xb7\xd0\x0b"
- "\x9e\x9b\xd4\x38\xaa\x1f\xbd\x45\x34\x20\x9e\x10\x34\xd8\xde\xc4"
- "\x3e\xba\x46\xd0\xe0\x6b\xd3\x76\xe1\xc3\xe0\x6b\xd3\x2b\x34\xb6"
- "\xa8\xce\x0a\x4f\xdd\xcc\x79\xea\x4b\xca\xd7\x19\x9b\xf9\xd7\x19"
- "\x2f\xf9\xfd\xcf\x7d\xb4\x1a\xef\xee\xc2\xbb\xeb\x28\x3e\x4c\xc9"
- "\x29\xb6\x8b\xf6\xbf\xe9\xde\x90\x69\x64\x5e\xe3\x2b\x56\xaa\x8f"
- "\xa3\x25\x51\xf0\xdb\xcd\xc8\xef\xe8\xb8\x89\x81\x97\xcc\x17\x67"
- "\x23\xc5\x7e\x1d\xf8\x3d\xbc\xe7\x40\xbd\x1c\x2d\x5d\x24\x13\x5b"
- "\x15\xf0\x7c\x68\xef\x5e\xac\x9f\x76\x2a\x97\xda\x2c\xce\x27\xc7"
- "\x71\x67\x67\xe1\x47\x3b\x9d\xac\xce\xaa\xf2\xa6\xc2\xde\x82\x68"
- "\x10\xdc\x9f\x1f\x09\x3f\xc6\xa0\xf1\xe5\xdc\x36\xba\x54\xf6\xe9"
- "\x47\x5f\x50\xda\x84\x66\xfe\xb5\xff\x5c\xfc\x47\x67\x71\xdf\x8d"
- "\x3f\x85\xdb\x6e\xaa\x0c\xd8\x57\xc6\xb3\x8f\xa5\x7f\xf5\x38\xee"
- "\xb2\x64\x53\x7c\xed\x8f\xaf\x97\xe3\xe6\xa6\x3f\xb9\xf2\x32\xc2"
- "\xf0\x8e\x97\xce\x71\x4a\x5a\x7e\x3c\xde\xb1\xea\x94\x66\xa7\x81"
- "\xef\x7f\x7c\xc2\xfe\xb4\x87\x89\x78\xcf\xcd\x1e\x61\xf7\xa7\xfa"
- "\x2a\xd0\x29\x85\xf5\xb1\x64\x2f\x0e\xd9\x8e\xf6\xa2\x85\xaf\xf5"
- "\xce\xc2\x8f\x73\x7c\xe7\xc4\x8c\x92\xdf\x23\x9e\x8b\x62\x60\xd1"
- "\xd8\x27\xfe\x8d\xea\x44\x63\x1f\x65\xef\xa4\x3d\x6a\x39\x07\x3e"
- "\xde\xf3\xed\xe6\xc0\xc7\x42\xff\x8b\xb2\xc6\x71\x7d\x1e\x1f\xb5"
- "\x9a\xa5\x0b\x1b\x02\x4f\x07\x9d\xbf\x0d\xc7\xba\x91\x29\xf1\xe4"
- "\xf0\xb5\xc2\xce\x24\xab\x8d\xd6\xb8\xfc\x6d\x5d\x2c\x4a\xb1\xa5"
- "\x58\x89\xcf\xae\xcd\x11\xb6\x17\x91\x78\xaf\x82\x6c\x33\xc8\x96"
- "\x6e\x88\x88\xb1\xf6\x31\xdb\x76\x96\x85\x37\xb3\xbf\x8e\xa1\xbd"
- "\x20\x3f\xad\xff\xfa\x3c\xed\xfd\xf1\xf5\x89\x89\x86\x1c\x7d\x31"
- "\x95\xa1\x9c\x3b\xe9\x7b\x8f\x62\xf9\xd2\x7b\x4d\xec\xaf\xf3\xc5"
- "\x7b\x94\x97\x7c\x35\xe5\x1a\xa7\x81\xcf\xaa\xa6\xfc\x1e\xdc\x6f"
- "\x55\x8c\x53\x38\xd6\x03\x6f\x96\xa7\x02\xcf\xa6\x2a\xb6\xdf\x58"
- "\x90\x96\x2a\xf6\x20\xba\x4d\xb4\x37\x89\xf1\x55\x80\xb5\xf8\x2b"
- "\xbb\xa8\x0f\x9d\xc9\xcd\xc4\xda\x29\xe4\x92\xbf\xbe\xbb\xf5\x04"
- "\x0b\xb7\x3c\x4d\xfd\x79\x58\xe8\x5a\x31\xf6\x54\xfe\xee\xf0\x23"
- "\xed\xeb\x93\x2c\xed\x18\x9b\x1d\xfa\x48\x76\xc0\x44\xb6\xe4\xfb"
- "\x13\x0f\x98\xba\xd0\x3f\x87\x87\x03\xeb\xd4\x98\x2e\xf2\x3d\x6d"
- "\x4c\x86\x99\x8c\x93\xf0\xfc\x0e\xcd\x1e\x49\x1b\x8f\x4e\xf6\xd7"
- "\x58\xa2\x1b\xc6\xb1\xb3\x6e\x9e\xdf\xa7\x69\xbb\x3c\xbf\x06\x99"
- "\xe2\xb0\x45\xb3\xb1\xf3\x9e\x53\x6a\x50\x0f\xf2\xcf\x61\xf5\x66"
- "\x29\x8d\xb4\x77\x3e\xe9\xac\xc2\xc9\xb6\x9f\xce\x69\x90\xdc\x33"
- "\xd9\xca\xdb\x49\x8e\xa3\x33\x51\xb4\x6f\x4e\x67\xc6\xb7\x40\x0e"
- "\xa6\x3a\xa0\xac\xbd\xda\xd9\xf1\x35\x48\xa3\x3a\xd0\xb9\xa7\x92"
- "\xb9\x62\x4e\x92\x6e\x23\x4a\xec\x1d\x84\x3d\x73\x62\x52\x07\xca"
- "\x3c\x25\xf6\xbc\xda\xb7\xaa\xe5\x90\x5f\x9f\xce\xc2\x4f\x98\x56"
- "\x86\x42\x76\xb2\x8b\x84\x3d\x9c\x53\xbe\x2f\xed\x84\x26\x75\x28"
- "\xe2\xbc\x0a\xbd\x2f\xed\x77\x3e\x19\xe3\xb3\xb5\x14\x67\x48\x3e"
- "\x19\xab\xf9\xfd\xc1\xef\x29\xbe\x33\x70\xa0\x69\xbb\xed\x15\x6b"
- "\x07\xb0\xa0\xc3\xb6\xc3\x8e\x67\xf3\x80\x44\xbb\x2e\xaa\xcb\x20"
- "\x7f\x01\x4b\x98\x5e\x89\x49\xd9\x4e\xbe\x20\xe8\x6c\xa7\xb4\xef"
- "\xfe\xa4\x56\xf5\x0b\x11\x76\x8a\x7d\xf2\xbc\x7f\x0f\xdd\xab\xea"
- "\x7f\x3f\xe9\x90\xf2\xc7\x27\x1d\x42\xff\xbb\xfe\x95\xf4\xff\xc9"
- "\x76\xeb\x2b\xb2\x9d\x7a\x69\xf3\xf8\x49\x8b\x93\x1d\x1d\xee\xb7"
- "\x79\xfc\x64\x27\x95\x15\x9a\x5f\x1c\x6f\x93\x65\xfe\xed\x33\xc1"
- "\xfb\xf9\xe4\xf9\xbf\x9b\xc5\x77\x57\x0e\x4b\x57\x88\xf7\x8b\x79"
- "\xae\x9c\xec\x9b\x1c\x96\x33\xa4\x07\x8e\x90\xba\x05\x99\x47\xb5"
- "\x67\xbc\xac\x35\xf8\x3e\x86\xee\x25\xcd\xfe\x66\xd5\xf6\x94\x4a"
- "\xf4\x0a\xc5\xeb\xe2\x79\xe5\xc0\x46\x4b\x87\xf0\x47\xe0\x00\x2f"
- "\x49\xb1\xae\x2d\x8b\xe8\xcc\xe0\xdf\x76\x93\x9f\x02\x39\x37\xff"
- "\x2e\xf0\x5a\x29\xbc\x8b\xe7\x91\x3c\xe5\xa2\xd8\x20\x67\x18\xf2"
- "\x45\x23\xdf\x91\xaa\x9c\x36\xb2\x0f\x9b\x47\x71\x1f\x9b\xd5\x6f"
- "\xbb\xa2\xc7\xdb\x7e\x18\xc5\xd2\xf1\x4d\x8c\xcf\x57\x27\xf4\x1d"
- "\x37\xfe\xd6\x76\x31\xde\x5a\xf2\x7a\xc9\xac\x37\xf9\x9c\xf4\x2f"
- "\x37\xe2\xfb\x13\xb9\xa8\xff\x11\x8f\xde\xcd\xba\xf5\xfd\xf9\x4f"
- "\xf2\xad\xcc\x53\xd8\x9f\x7b\xb3\xd1\x5f\xed\x26\xc8\x6f\x35\xac"
- "\x4e\xda\xcc\xd0\xbe\xbf\x21\xb7\x83\x9f\x71\x78\xf6\x90\xfe\xdf"
- "\x85\xbe\x02\x6e\xfd\xfd\x23\x87\x67\x1f\x23\x3b\x66\xc2\x9b\x26"
- "\xf6\xf7\x7d\x54\xaf\x1b\x2d\xf9\xec\x86\x53\xe2\x79\x8e\xe4\xfb"
- "\xfe\xde\xa0\x5e\x77\x92\x3f\xce\xc0\x3a\xdd\xb7\x64\xc1\x4c\x72"
- "\xea\x7a\xc3\x84\xd9\x59\xb3\xe7\x99\x1f\x26\x97\xaf\x3d\x6c\x12"
- "\x23\xfd\x71\xc1\x1a\xb6\xd3\x5a\x4a\xbc\x37\xc5\x07\xbb\x58\x6c"
- "\x30\x2d\x2e\x18\xe6\x5c\x3c\xe9\xab\xbf\xcb\xd8\x60\x1a\x6f\x4d"
- "\x71\xc1\xfc\x7b\x37\x47\x66\xf9\xe6\x80\xf2\x4e\x27\xdd\x8b\xf5"
- "\xbb\xf0\xef\xcd\x34\x8f\xe4\xfa\xd2\xd0\x18\xe8\x33\x47\xf2\x56"
- "\x05\xf9\x48\xef\xd0\xce\x76\x62\x2c\x46\x75\x16\x1e\x09\xf7\x9f"
- "\x25\x39\x62\x04\xdd\xa4\xfd\xb1\x91\xf2\x1e\x31\x6b\x36\x0e\x6a"
- "\x0c\x68\x61\x93\xa1\x14\x5d\x11\x2b\xf5\x8a\x47\xae\xdd\xaa\xf4"
- "\x8f\x94\x7b\x5a\x47\x26\x68\x67\x95\xe4\xdc\x7c\x47\x9d\x9b\x47"
- "\x66\x5d\xcc\x0e\xc5\x3f\x37\x8e\x94\xfb\xe7\xf5\xe7\xda\xbb\xe5"
- "\x97\xb2\x61\x51\xe5\xbb\xa1\xad\xec\x1f\x6f\x92\xae\x51\x9e\x4d"
- "\xfe\xc7\x16\x2a\x4b\xfa\x9d\xf8\xc7\x32\xf5\x37\xbe\xf1\x8f\x19"
- "\xea\xef\x2b\xf1\x7b\xbc\xfa\x7b\x18\x7e\x8f\x56\x7f\x63\xce\xfe"
- "\xe3\x0a\xf5\x77\x2c\x7e\xeb\xd4\xdf\x58\x3b\x3e\x3d\xa1\xfe\x8e"
- "\xc3\xef\x8f\xd4\xdf\x57\xe0\xf7\x5b\xea\x6f\xcc\xc1\x4f\x85\xbf"
- "\x65\xd4\x3d\xf2\x38\xfb\x74\x4d\xdf\xe5\xcd\x4f\x53\xe5\x9e\xf3"
- "\xa7\xa5\x58\x43\x92\xe5\xda\xe3\x4b\xdb\x85\xbe\xf1\x68\xf4\x45"
- "\xfa\x14\xfa\x0e\xd2\xab\x9c\xac\x6a\x57\x40\x7a\xb2\x9a\xbf\x11"
- "\x38\x67\x0d\x48\x1f\xa3\xa6\x03\xff\x0e\xd5\x07\xa4\x27\xc8\xf4"
- "\x7f\x44\x61\xae\xb3\x80\x74\xd5\x47\xfc\x3f\xe2\x9d\x6c\xbf\x33"
- "\x20\xdd\xa8\xa6\xdf\xa1\xd9\xdf\xa8\xe9\xe1\x6a\xfa\x54\x27\xfb"
- "\xa3\xcd\x9f\x7e\xc4\xad\xa6\x03\xff\x8f\x58\x02\xd2\x7d\x67\x5a"
- "\x44\x7c\xb6\x1c\x9a\x5b\xff\xb0\x39\xd9\xde\xfc\x80\x3c\x4e\xf5"
- "\x5d\xf0\x7f\x7f\xde\x19\x90\x7e\x58\x4d\xb7\x3b\x75\x83\x02\xcb"
- "\xac\xee\x0d\xab\x74\xa5\x2c\xbd\x37\x9d\x3c\xc9\x2f\xc2\x0e\x59"
- "\xf0\xd4\x8d\x5e\x3a\xfb\x64\xd8\xc2\x9b\xcc\xb9\x9c\x37\xb1\xc6"
- "\x66\xd5\xee\x36\x83\x6c\x20\xe5\x39\xb2\xc6\x1a\xd5\x87\x80\x4b"
- "\x9c\x2d\xcb\x16\x69\xc2\x17\xf1\x28\x6b\xbe\xf4\xcf\xab\xc5\x7a"
- "\x20\xdd\x94\xba\x6f\x8f\x3c\xcb\x48\x57\x4f\xe5\x90\xfe\xda\x91"
- "\xd9\x25\x7d\x37\x43\x86\xa5\x34\xd2\xd1\x10\x3d\x02\x75\x51\x12"
- "\xf7\x1b\xbd\x4a\x17\x9d\xdf\x94\x7a\x2c\x9a\x8b\x94\x9f\x6c\xcd"
- "\x02\xf3\x3a\x59\xa3\xd0\xbf\x85\x99\xa2\x77\x74\x16\x36\x36\xfa"
- "\xcf\xcd\x34\x8e\x51\xd3\xb7\x23\xbd\x23\x20\xdd\xdc\x3b\xb6\x03"
- "\xef\x8c\x89\xd6\xee\x73\xbc\xc3\x73\x8e\xbb\x4b\x8e\x4a\x9b\x73"
- "\x60\xdd\xd5\x5e\x5b\x62\x31\x9d\x2b\xa1\x98\x8a\x9e\x2c\xee\x22"
- "\x7b\x46\xa4\x0f\x9a\xd4\xe1\x02\x8f\xd1\xc9\xd7\x3c\x45\xb6\xab"
- "\x67\x19\xed\xab\xe6\xb5\x51\x7c\x2e\x03\xa7\xf3\xca\x2b\x4e\xb2"
- "\x28\x3a\x77\x42\xb6\xe9\xb4\xe7\x39\x31\xc3\xc5\x6a\x33\xbc\x6c"
- "\x2b\xca\xde\xf2\x94\xc6\x5f\x7c\xb6\xc1\x7f\x26\x36\x91\xf6\xa1"
- "\xaf\xce\x13\x31\x64\x3f\x7b\x9f\xea\x6a\x28\x20\x7b\x80\xfd\xa9"
- "\xfc\x3d\xe2\x8d\x77\x54\x18\x0a\x98\xd9\xc9\x3e\xab\xc7\xef\x72"
- "\xf9\x87\x67\x48\xef\xad\x4d\x72\x2e\x1f\x8d\x92\x58\x93\xe8\x96"
- "\x78\x71\x34\x8a\xff\x37\x9d\xb3\x38\x4a\x3a\xe8\x54\xf0\xe1\xa9"
- "\xa1\xde\x5f\xb1\x85\xe9\xbb\xd7\x83\x37\x39\x55\xa9\x97\xf8\x74"
- "\xd4\xa3\xe8\x23\x0b\x48\x4f\x2e\xe2\x47\xae\x4f\xd9\xb3\x6b\x81"
- "\x5b\x5f\x9b\xdd\xcc\x96\x5f\xc1\x4c\xd3\xdc\x7a\xca\xb3\x62\x48"
- "\x26\xf9\x10\x7e\x25\x1d\xfc\xac\xfe\x0f\x78\xbe\x7f\x41\xa5\xde"
- "\x23\xf8\x95\xa3\x1e\xa1\x5b\xb5\xa5\x14\xd3\x1a\xe2\x68\xf0\x12"
- "\x2f\x1e\x05\x5e\xdc\x0a\xfc\x8f\xf4\x2e\xcd\x88\xf1\x2c\xce\x18"
- "\xb4\x65\x11\x8b\xf2\x2e\x4e\x88\x7d\xe1\x1c\x4b\xd2\xd6\x9f\x2d"
- "\x59\x58\x53\x3a\x4d\x03\xd7\x62\x4d\x21\x9d\xcd\x10\x9d\x51\xec"
- "\x21\xd3\x6f\x45\xff\x6e\xdb\xd6\xac\x8b\xc7\xc2\xf5\x2e\x4d\x10"
- "\x7e\x15\xa8\x2e\xa1\xda\xba\xfa\x25\x16\xee\x55\xcf\x5f\xe6\x1e"
- "\x63\x71\xe0\x9f\xf5\x43\xce\x72\x7b\xeb\x3c\xa6\xa7\xf8\xa1\xb9"
- "\xb3\x85\x5e\xb4\x5f\x6d\x86\x87\x39\xac\x9f\xb2\xdc\x45\xd4\x47"
- "\x9f\x3f\x44\x7c\x1a\xd9\x22\x23\xbf\xb1\x95\x7d\x3e\xc3\xe0\xc6"
- "\x9a\xe1\x06\x4f\x3e\x97\x64\xe0\xcf\x97\x48\x3f\x0e\x9f\x57\xd2"
- "\x79\x49\xfb\xa2\x7b\x28\x6d\x5d\xde\x31\x61\xf3\x33\x4f\xce\xad"
- "\xcf\xe7\xd1\x7d\x1e\x9d\x07\x8d\x19\xb7\xe7\xf5\x2e\x77\x3f\xa9"
- "\x7b\xfb\x5c\xf5\x29\xfd\xca\x14\x29\xdb\x7d\xde\xeb\x3e\xa6\x62"
- "\x1b\x53\xca\x29\x76\x5a\x19\xf1\xaf\xdc\x29\xf6\xe7\xe9\x6c\xbc"
- "\xf5\x2e\x3b\x3f\x67\x53\x7d\xf6\x38\x47\x2b\xeb\xc6\x94\x4a\xbf"
- "\x7a\x4e\x21\xe7\x49\x5d\xfd\x98\x9d\x72\x6f\x62\x4c\xa5\xd4\xd5"
- "\x8f\xa9\x5e\x39\x8c\xce\x02\x38\x13\xdb\xa3\xc7\x34\xe0\x1a\xde"
- "\x1e\x33\xb1\xb2\xf7\xf5\x68\x74\xb5\xf9\x6a\x16\x4b\x7b\x44\x69"
- "\x5e\xe9\x57\x52\xce\xe1\x2f\xc6\xf0\x75\xe2\xd9\x88\x26\x0b\x0b"
- "\x93\x32\xa4\xb3\x60\x54\x19\x33\xa3\xae\x83\xb9\x71\x8c\x55\xd8"
- "\x2c\xda\xc6\x14\x3b\xda\x28\x2e\x8c\x97\xc9\xbd\xbc\x2f\x92\x79"
- "\xf4\x18\xab\x9a\xff\xa3\xba\x36\xb4\xc1\x38\x66\x9c\xc3\x7d\x52"
- "\xe5\x09\x9d\x18\xfb\x63\xc6\x71\xdb\x98\x54\x79\xae\xfa\x8b\x6b"
- "\x34\x5c\x95\x63\xf4\x8b\xa1\x92\x6e\xa3\xab\x25\xdd\xbe\x48\x56"
- "\xd7\xab\x11\xf4\x1b\x6b\x77\xa2\xb4\x3d\xf9\x22\x4a\xe3\x91\x9d"
- "\x6a\x1e\x7a\x07\xed\x75\x49\xac\xfd\x62\x24\xfa\xad\x4a\x3e\x77"
- "\x0a\xdd\x1a\xda\x87\x35\xcb\x99\x41\xed\xea\x0d\x5b\x05\x2d\x72"
- "\x58\x18\xea\x9c\x41\x76\xda\xc4\xa7\x38\x3a\xee\xb2\x3b\x44\x1f"
- "\x34\x7d\x48\x76\xf9\xf4\x1d\xf2\xab\x43\xb8\x89\x32\xc3\xa9\xbc"
- "\x80\xfa\xef\xd6\xea\x42\xdf\xa3\x67\x68\xeb\x38\x21\x57\xa3\xcd"
- "\x94\x87\xfa\xf5\xb8\x85\x74\x76\x67\x41\x33\xb2\x7f\x6b\x6a\x20"
- "\x9a\x48\x9a\x35\xed\x51\x65\x7a\xb5\x1f\x9a\x5e\x0d\xa6\x87\xbc"
- "\x57\x8c\xc0\x86\x45\x64\x07\xd5\xd4\xa0\xd2\x4f\x8d\x69\xd0\x24"
- "\xce\xa9\xab\xcf\xee\x0c\x78\xf7\x2a\x5f\x5e\xd4\x9b\x78\x23\xb2"
- "\x29\xa0\x3d\x26\x39\x5e\x9b\x32\x02\xde\xcb\x48\x3b\x4d\x3c\x72"
- "\xe2\xb8\x95\x9b\x44\x8c\xb8\xc4\xce\xc2\xa6\x1c\x3f\xbd\x65\x39"
- "\x21\xbe\x71\xb5\xf6\x0d\xe4\xb9\x43\xab\x27\x7e\xab\x6b\x70\x93"
- "\xdd\xdf\x27\x5f\x38\xb5\xf7\x48\x7f\x83\xfb\xd5\x14\x6f\xb1\x17"
- "\x3f\xf4\x3a\x07\x56\xf7\x3a\xcf\x5d\x76\x31\x1e\xd9\x97\x49\x64"
- "\x63\x0e\xba\x66\xc8\x31\xf4\xe5\x70\xb9\x16\x7e\x29\xfc\x82\xd1"
- "\x3e\xa1\x8c\x4b\xf2\x65\x22\xca\x9d\x20\xbf\xf7\xa5\xea\xff\xf1"
- "\x4b\xc8\x7f\xce\x3b\x7a\xca\x75\xf7\xcc\x98\x65\x9e\x32\x5a\x9c"
- "\x2d\xbd\x61\x89\x85\x8e\x8d\xce\xf2\xdf\x04\xf3\xdc\x46\xbf\x2f"
- "\xaf\x2f\x6d\x3e\x5f\x5e\xb6\xf1\xea\x79\xcb\x2f\x1b\xf9\x39\xbe"
- "\x81\xce\x7d\xf0\x2c\x5e\x5a\x82\x3e\xcc\x3b\xcb\x2e\xa7\x38\xb2"
- "\xb9\x16\xfe\x15\xf9\x79\x03\x5e\x1e\x06\x7e\x34\xe4\x9e\x65\xfd"
- "\xc9\xa6\x88\xf0\x87\xf4\x5e\x3c\x1a\xe9\xeb\x52\x1a\xfc\xe7\xcd"
- "\xbe\x3a\x4c\x67\x24\x79\x5e\x2a\xc5\x01\x17\x71\x38\xc8\xbe\xfc"
- "\x38\xfb\x6a\x0f\xf2\xb5\xe1\x59\xe6\x1a\xa1\x4b\x18\x9b\xe8\x35"
- "\x8e\x5f\x9d\x77\x92\x45\x88\x98\x62\x56\x37\x33\xcf\xa5\x73\x49"
- "\xcd\x77\xf2\xe8\xb1\x89\x48\x1f\x22\xd2\xdd\xf8\xf6\xba\xb1\x89"
- "\x78\x36\x04\xcf\x96\xe1\xaa\xa0\x0c\x6b\x09\xea\x9d\x7b\x92\x5d"
- "\x8d\xba\xb4\x70\xdb\xd8\x44\xd4\xf3\x78\xde\x7c\x16\x57\x67\x69"
- "\x21\xf9\x0e\xe5\x39\x65\xac\x34\xbc\x8b\xf7\x6a\xd1\x2e\x2b\xe9"
- "\x44\x70\xcd\x59\x83\x6b\xae\x97\x0d\xc9\x5d\x81\x75\x6f\x05\xbe"
- "\x4f\xe7\x37\x51\x0e\xf9\xda\x90\x75\x41\xdb\x48\x87\x86\x72\x57"
- "\xb4\xf1\xe3\x28\xbb\xa5\x16\x92\x9d\xc3\xda\xe0\x2b\x53\xe5\xa9"
- "\x31\xbf\xbf\xda\xcd\xd7\x4f\xac\x47\x9d\x4a\xc9\xee\x1a\x69\xc0"
- "\xe4\xaf\x76\xfa\xf9\xe1\xaf\x5e\x55\x7f\x0f\xf0\xe5\xcd\x4b\x65"
- "\xb9\xe7\x99\x49\xd8\x0e\x2c\x0d\x03\x1e\x7f\x95\x44\xfe\x9e\xfc"
- "\x65\x1e\x7b\x93\xca\x5b\x8d\xf2\xf2\x66\xb3\x01\xc0\xea\x48\xd4"
- "\x91\x62\xaa\x7e\x21\xe8\x24\xe6\xd8\xb1\x3d\x68\x8b\x8d\xda\xa4"
- "\xa0\xef\xd6\x60\x3e\xa0\x3d\x3a\xb4\x67\xc0\x0a\xaf\xef\x4c\x2a"
- "\xb5\x29\x9a\xe4\x39\x6a\x97\xec\xc7\xb1\x13\xd0\xae\xa9\x2b\x32"
- "\xf8\x17\x68\x5b\x4b\x6d\x46\x03\xc3\xda\x63\xa8\xb3\xd4\xd3\xf9"
- "\x87\x2f\x24\xdd\x5a\xc8\x7e\x74\x02\xda\x39\xd5\xef\xbf\xf4\x2b"
- "\x8a\x39\xd5\x80\x7a\xad\x56\xdb\x49\x69\x23\xfd\x3c\xfd\x57\x37"
- "\xa8\xbf\x07\xfa\xf2\x5e\xd0\xce\xe3\xe5\x01\xed\xa4\xf7\x3f\xa1"
- "\xf2\xd4\x76\x0e\x44\x3b\x07\x5c\xd8\x4e\x8c\xa7\x2c\xbe\x4a\x6d"
- "\x67\xb1\xda\x4e\x3d\xda\x39\x10\xed\x1c\x16\xd0\xce\x98\x1e\xed"
- "\x9c\x82\x76\xa6\xa2\x9d\x4d\x01\xed\x34\x86\x68\xe7\x14\x27\x7d"
- "\x63\xdd\xd8\x54\xe9\x07\xeb\xcb\x29\xf2\x9c\xf7\xf1\x4a\x9f\x9f"
- "\x89\x73\xbc\x82\xce\x31\x2a\x59\x7c\x0f\xe9\x6f\x48\x6f\x44\xb2"
- "\x1e\x9d\x65\x4c\x5b\x56\x9c\x2f\x74\x37\x71\x52\x0f\x2d\xf9\xab"
- "\xe3\x1d\xbe\x73\x17\x9b\x44\xac\x08\x79\x4e\x91\xce\x3e\x2e\x62"
- "\x42\xf7\x38\x79\xd9\xd2\x3c\x7a\x9f\xde\xed\x2c\xfc\x2a\xde\x7f"
- "\x3e\xec\xb8\xd4\x99\x83\x7e\xf4\x9b\x7c\x3e\x49\x7d\xfe\x97\xe9"
- "\x52\x9f\xff\x95\xcf\xff\x05\xe8\x52\x45\x74\x11\xe7\x36\xc9\xae"
- "\xd2\xcb\x8a\xd3\x3c\xc5\xda\xf9\xeb\x36\xe4\xcd\x09\x38\x7f\xdd"
- "\x26\xea\xd0\x25\x7c\x1c\x2c\x9d\xec\x59\xca\xe5\xb9\xdc\xaf\xca"
- "\xfd\xdf\x3e\x66\x56\xbf\x5d\x4f\xbf\x5d\xd2\x07\x19\xe9\xd8\xcc"
- "\xd2\x56\xe6\xab\x1a\xcd\x3e\xc5\xc9\x9a\x23\x69\x2e\x87\x8e\xab"
- "\xf0\x55\x47\xb0\xcf\xa3\x96\x2a\xf2\xeb\xde\x59\xd8\x12\xe5\x3f"
- "\x53\xdd\x62\xba\xd4\x99\xea\x3c\x17\xfa\x09\xf3\xcd\x22\x62\x04"
- "\xb7\x40\xc6\x1d\xbf\x5a\xc6\x26\x68\x79\x93\xea\xd9\xc4\x5a\xc8"
- "\x17\x82\x41\xee\xe5\xb4\x2c\x51\xb1\xb9\x65\xb2\xd7\x63\x70\xe2"
- "\x9b\xc2\x87\x92\xff\x7e\x1e\xf9\x84\x40\xbe\x1d\xd2\xa7\x73\xcb"
- "\xac\x1e\xf9\xe9\x79\x7e\x8f\xfb\xe4\x1e\xf7\xe6\x0e\x60\x56\x6f"
- "\x76\x38\x6b\x86\x09\x1d\x6f\xf1\x90\x02\x66\xc9\x3b\xc1\xc2\x30"
- "\x16\x8f\x51\xdd\xea\x5a\xc4\x19\x3d\x03\x2f\x4c\x64\x8e\x16\x8f"
- "\xe4\xdb\xc1\x2f\x35\xc5\x23\xcf\x09\x16\x47\x67\x44\x28\x76\x03"
- "\xf2\xb7\xca\x78\x0d\xad\x13\xa7\x2d\x19\xc8\x94\x5f\xa6\x0e\xe2"
- "\xfa\x99\x26\xb2\x03\xd8\xdd\xe5\xa4\x98\x07\xba\xdc\x17\xd9\x70"
- "\xc2\x29\x8c\xe1\x66\xae\x9f\x45\x7e\xc6\xda\xfe\xa7\xab\xa5\x9f"
- "\xc3\xf3\x29\xb3\x00\x3f\x5b\x59\x6b\x72\x78\x0e\x0b\x5f\x7b\x9c"
- "\x19\x31\xce\x3c\x07\x3c\x49\x4c\xf3\x69\x50\x16\x23\xcf\xca\x97"
- "\x61\x4c\x2e\x36\x71\x77\x67\xe1\x89\x32\xc8\xb5\xd3\x34\xfd\xc5"
- "\x6a\xe9\xd3\x2c\x1c\xdf\x1f\x20\xfc\x2f\x48\xfe\x00\xb4\x3d\x71"
- "\x44\x9e\x11\x8d\xfd\x29\xde\xa9\xf7\xcb\x36\xad\xd3\x24\x0d\xc7"
- "\x57\xc8\x75\xa4\x75\xda\x01\x50\x75\x95\xb4\x67\x8a\x45\x5e\x8f"
- "\xcf\x9e\x49\xe8\x04\x5b\xa7\xa1\x0f\x2b\xa4\xdc\x33\xbe\x22\xcd"
- "\x1b\xa9\xce\x71\x4a\x4f\x1c\x47\xef\xe2\x3d\x83\x8c\x2b\xd7\x9a"
- "\xe4\x1f\x6b\xad\xa4\x6b\xd5\xa1\x4d\x18\x3f\x27\x32\xa9\x5d\x44"
- "\x93\x0e\xe1\xbf\xec\x84\xf5\xc0\xf6\x5e\xe2\x8e\x18\x13\xdd\x1e"
- "\xa1\x5f\x7a\x25\x15\xe3\xe9\x24\xfa\xe0\x32\xf2\xe1\xe4\xc0\x77"
- "\x6a\xb7\x76\xb1\x5a\x53\x3b\xab\xc3\x6f\x3a\xb7\x60\x9f\xfb\x25"
- "\x6b\x36\x87\x5e\xcb\xc1\x0f\x58\x51\xe7\x62\x2a\x8b\xb0\x86\x6c"
- "\x3d\xc9\xd7\x5e\x1d\xb8\x36\x47\x33\x13\x65\xd4\x2a\x2d\xac\xd6"
- "\x4a\x32\xec\xfe\xd4\xba\xad\x9f\xb2\x3a\xd3\x5f\xc5\x77\x88\xdf"
- "\xb6\x2f\x6a\xbf\x58\xd9\xa5\x28\x7b\xa7\x5a\x76\x1b\xca\x8e\xed"
- "\xbd\xec\x1d\x15\x7d\x2c\xbb\x0f\xf5\xde\x51\xde\x97\xb2\xf3\x4a"
- "\xb9\x17\x38\x3c\x18\x6b\xbc\x95\xfc\x90\xd2\xf9\x54\xef\x39\xf2"
- "\xbd\x32\x82\x4b\xfb\xf9\xb6\x5b\x08\x6f\x84\x6d\xc7\xba\x94\x4c"
- "\x71\x76\x95\xf4\xec\xea\x99\x55\x87\xe7\x18\x23\xbd\x7b\x67\x61"
- "\x9b\xd9\x2f\x8b\xfa\xf6\xb5\x21\x0b\xb4\x8d\x95\x76\xd2\x29\x99"
- "\x72\x6c\xfd\xf3\x3c\x95\x15\x5a\xe6\x1c\xbb\x5d\xda\xdb\xb7\xad"
- "\xd0\xf4\x5b\xed\xd1\x63\xb7\xab\x65\x99\x7b\xea\x4d\x55\x87\x39"
- "\xe6\xd9\xd6\x4c\xf3\xd2\x45\x73\x32\x67\x6b\x87\xab\x07\xb2\x87"
- "\x67\xcf\x9c\x3d\x27\x6b\xf6\x2c\xf3\xd4\x25\x8b\x16\xdc\xf0\xec"
- "\xd3\x4f\x9b\x27\xce\x5e\xbc\x78\xc6\x2f\x67\x0f\x64\x53\x17\xcd"
- "\x58\xb0\x78\x0e\xe9\x36\xcd\xe6\xb1\x37\xa7\x65\x3c\x9b\x79\xc3"
- "\xcf\xc6\x26\xf6\xd0\x6d\xd2\x59\xeb\x46\x92\x71\xb0\x3e\xc5\x81"
- "\xc7\x88\x26\xff\x3b\x86\x65\xdc\xbe\x1c\xf2\x35\xc6\x60\x2b\xad"
- "\x85\xb4\xfe\x90\xec\x45\x7e\x7c\xc9\x37\xf0\xe6\x4d\xbc\xfe\x38"
- "\xe3\xb7\x80\x6f\x6f\x40\x1a\xf9\xe1\x6d\xe4\x5d\x79\x2e\xea\x03"
- "\xa4\x47\x23\x4f\xd5\xaf\x91\xe6\x8a\x1e\x5f\xb1\xf6\x28\x0b\x97"
- "\x3c\xc6\x49\x1b\xd7\xf7\xe7\xab\xc9\xa7\xee\x97\x26\xa6\xfa\xea"
- "\xd6\x3b\x9c\x6e\xb2\xff\x89\x9c\xec\xc9\xe3\x84\xa9\x72\x7e\x9d"
- "\x5c\x27\xe9\x32\xa6\x54\x9e\x43\x50\x4e\x93\x8c\xb8\x52\xc4\x39"
- "\x3b\x09\xfc\xff\x3c\xd2\x8f\xd5\xe7\x34\xde\xbc\x01\x74\x5f\xda"
- "\x84\x7b\xe9\x53\xe4\x64\x4d\xb0\x6d\xd7\xd7\xbb\x18\xeb\x8e\x95"
- "\x7f\xf4\x4e\xb7\x59\xfe\xd1\xef\xc0\x3f\xe5\xb0\xfc\xeb\x99\xfe"
- "\xaf\xfe\x69\xdf\xff\xb6\xef\x77\xda\x2e\xfe\xf7\x4d\xbe\x2f\xda"
- "\xfd\x3d\xb6\xff\x5f\x79\xbf\xb3\xf4\x62\x7f\x34\xde\x30\xb6\x1a"
- "\x7f\x7d\x94\x45\x62\x7c\x6e\x58\xf3\x14\xc6\xf4\x67\xcc\x94\xe3"
- "\xe1\xcd\x79\x4f\xb2\xe1\xb9\x27\xc0\x83\x81\xd7\xca\xb4\xf2\xe6"
- "\xdc\x73\xa4\x97\xe8\x9c\x83\xf1\x5b\x59\xd2\xc4\xa2\xd6\x34\x81"
- "\xcf\xca\x94\xf1\x31\x68\xbf\x89\xce\x68\x39\x70\x5f\x93\xe5\x66"
- "\x87\x5c\xa7\xc9\x1e\xd2\x5e\x97\x0e\xec\x69\x64\x8c\xc6\x6f\x54"
- "\x3a\x8b\x2d\x8b\xe3\x7b\x79\xe1\x0b\xb1\x5c\xff\x42\x38\xd2\x0e"
- "\xbf\xa1\x24\xf7\x7b\x23\xbb\xba\x9f\xf9\x29\x5a\xe7\x5d\x0f\xa9"
- "\x63\xf3\x88\x3c\x83\x78\x4e\xd8\x9c\xa9\xbe\x94\xb1\x3e\x75\x3e"
- "\x22\xd7\xf4\xce\x6b\x55\x7d\x1e\x7e\x9f\xfb\x90\x7e\xa3\x1d\x95"
- "\xbc\x70\xa6\x89\xca\x7c\x5d\xa9\xec\x47\x6b\xe6\x1b\xd9\xc9\xfd"
- "\x72\x66\x30\x7d\x9d\xb3\x95\x1d\x00\x16\xd2\x5e\x38\xe6\xdd\x2e"
- "\xcc\xb3\x8a\x2d\x71\xdc\x86\xfa\xad\x06\x3f\x57\x8c\x3a\xed\xec"
- "\x2c\x74\x41\xfe\x6b\xad\x50\x79\x39\x3b\xe6\xc5\xae\x35\xc8\x33"
- "\x79\x09\x1b\xb1\x06\xf9\xc0\xdb\x15\x93\x8c\x22\xeb\xd7\xf1\x16"
- "\x68\xb0\x07\xdf\xac\x37\x4f\xa7\xfb\x33\x82\xc7\xa0\x6f\xa3\x1d"
- "\xe6\x26\x76\x46\xc8\xfc\xf4\x0d\xed\xbb\x9d\x85\xa7\x81\x7f\xff"
- "\xcc\x50\xf7\x18\x6d\xb2\x9c\xd3\x13\xe4\x7c\x4d\x11\x31\xfb\xd4"
- "\x33\x5e\x9e\x35\xd9\x58\xd7\xbb\x58\x24\xbe\xb1\x01\xdf\xb0\x1b"
- "\x0a\x18\x37\xd0\xf9\xe0\x46\x0f\xe4\x1a\x45\xb5\xbd\x3d\x33\x5a"
- "\x7d\x57\xf0\x21\x82\xf7\xf0\x82\xbf\x17\xfa\x19\xf0\x1f\x19\xc0"
- "\x09\xf0\x1c\xe2\x6c\x05\xf8\x0d\x4a\xc7\x37\x36\xa0\x5d\xf5\x90"
- "\x9b\xf7\x60\xed\xa6\x18\x7f\x91\xd3\xcf\x3e\xc0\x44\xbc\x72\xf0"
- "\x0b\x8b\xad\xdc\x2d\xe3\x97\x9d\xae\xd1\xf8\x05\x1a\x1f\xc4\x23"
- "\xac\x99\xce\xc2\xbb\xd1\xc7\x18\x23\xd5\xe0\x3f\xc0\xd3\x9f\x89"
- "\x54\xfb\xa6\x5a\xf0\x05\x6a\xdc\x56\x89\xe1\x67\x86\x62\x7d\x8f"
- "\xc2\x37\xaa\x21\x39\x0a\x5a\x48\x0c\x3a\x13\xaf\xad\xf5\x32\xf6"
- "\xf8\x99\x48\x0e\xac\x03\xdd\xf6\x8c\x4c\xd7\x31\x27\x3b\x3d\x0f"
- "\x7d\xb1\x87\xf2\x92\xff\x0c\xe4\x9f\x0a\x7e\xec\xb0\xda\x27\x8d"
- "\x90\x09\xc0\x07\x9c\x6e\xa4\x7a\xe0\x9d\x1a\xd0\x9a\xfa\x62\xb5"
- "\x8a\x63\x87\x25\x0f\xd3\xb1\x44\xa3\x3d\xfa\x7a\x95\x9f\xfe\x67"
- "\xca\x03\xe9\x0f\x5a\xac\x52\xfb\xf2\x9a\x80\xbe\x83\x5c\xda\xee"
- "\x26\x3d\x34\xbe\xb7\x57\xea\xd0\xce\x1c\x21\x1f\x67\x18\x33\x7b"
- "\x41\x8b\xbd\xc8\x57\x49\xd8\xbc\xf2\x28\x30\xf7\x29\xe2\xa1\xda"
- "\xbf\x90\x3c\x6a\x7b\x3e\x8d\x61\xdc\x8b\xd8\x7d\xcd\xec\xb4\x93"
- "\xca\xc3\xfd\x43\xb8\x82\x97\x6d\x1f\x9f\x57\x46\xf1\x44\xc7\x8e"
- "\x23\x1f\x64\xb2\xaf\xc7\x8e\xeb\x2c\x6c\x4f\xd2\xce\x2f\xd1\x18"
- "\xa0\xbe\x47\x1b\x9d\x52\x4f\xd1\x9e\x44\xba\x46\xf1\x5e\x77\x06"
- "\xd5\xb1\x91\xe6\xa7\xf6\x1c\xe9\x2d\xe4\x1b\x36\x80\x36\x4e\xb5"
- "\x4f\x2a\x65\x6c\xbe\xf6\x23\x6a\xdd\xf6\xe0\x3e\x12\xf7\xd2\x6e"
- "\xaf\x3b\x23\x6c\x2d\xbd\x93\xeb\x7f\x87\xe6\x0f\xc6\xb2\x01\x79"
- "\x3e\xc2\x95\x6b\x79\xc9\x3f\x3c\xea\x91\xfa\x82\xf0\xd1\xd5\x6e"
- "\x69\xef\x4e\xd0\xe3\xbb\x6e\x7c\x57\x4f\x63\x83\xc6\x85\x56\xc6"
- "\x5a\x49\xa3\x5d\xe8\x3f\x31\xbe\x0e\x78\x2a\x41\xf7\x0e\xf0\xff"
- "\xff\x70\x49\xfe\xae\x3d\x55\xad\x9f\x5d\xc6\x8c\x68\x2b\xde\x2a"
- "\xfd\xe9\x50\xbe\x64\x9f\xbc\xe3\xe3\x33\xdb\x53\x69\xec\xa1\xac"
- "\x1a\x75\x4c\x18\x90\x2f\xc3\x37\x86\x84\xaf\x82\xf6\x16\xe2\x35"
- "\xd5\xfa\xd3\x9c\xfa\x42\xd2\xee\x4c\x31\x8d\x01\xf0\xf1\x15\xea"
- "\x5c\x73\x12\xaf\x2a\xc7\x61\xc7\x2e\xad\x0c\xe9\xef\xa0\x3d\x49"
- "\x41\x19\xda\x58\x09\xc4\x06\xe4\x85\x7c\xd6\xea\x1b\x37\x1a\x16"
- "\xa8\x38\x15\xad\xf2\x21\xa9\xe8\x1b\xf2\x4b\x6e\x17\xfe\x9e\xc4"
- "\xb8\x3c\xdb\x7c\xa0\xc3\xc3\x7e\x4d\xe3\x72\x3a\x61\xc2\xd9\xbb"
- "\xdb\x63\x26\x3a\xfd\x63\xfb\x6c\xa2\x36\xb6\x03\xfa\x55\x8c\xed"
- "\x55\x02\x8f\xce\x42\x5e\x4d\x9c\xa0\x8d\x7d\x9a\xe7\x0a\xe6\xf5"
- "\xda\x2c\xb1\x3f\x60\x20\x7d\xa0\x98\xf7\xee\x36\x21\x63\x50\x7f"
- "\xd6\x59\x9b\x85\x2f\xf8\x95\x0a\x8b\xac\xeb\x38\x46\xfa\x91\x56"
- "\x9a\xff\xda\x1c\xa7\xbe\xc1\xb7\xec\xe4\xaf\x7f\x15\x30\x90\xe6"
- "\x60\x07\xea\x44\x31\xea\xc9\xf7\x59\xd5\xb4\x64\xb6\x18\x7d\x7b"
- "\x20\x9d\xfa\xed\x6c\xbd\x76\x5e\x62\xad\xc4\x80\x28\x75\xbc\x88"
- "\x3a\xf6\xa0\xab\x41\xd2\xf5\x5c\x78\xf0\xfc\x6e\xdf\x4e\xf3\x3b"
- "\x90\xae\x44\x53\xa2\x2d\xf2\xa2\xfd\xff\x8c\xd2\xe8\x1a\x40\xd3"
- "\x97\xd5\xf1\xa8\x62\xeb\xb9\x90\xd8\xba\x56\xc6\x46\xa8\x5c\x49"
- "\x6d\xc1\x9a\x42\xdf\x17\xb1\x7f\x54\xd9\xa7\xca\x45\x63\xea\xdc"
- "\x06\x27\x9b\xb5\x53\xc3\x31\xd4\x47\xf8\x9b\xa3\xbe\xd2\xb0\x83"
- "\x74\x65\x6a\xdd\xed\x5a\x7f\x50\xbd\x03\x31\x01\xeb\x8d\x38\xdf"
- "\xe7\x6f\xf3\xb9\xd3\x78\x2f\x86\xb0\xcd\xcf\x5f\x75\xb2\xe0\xb6"
- "\x9f\x6b\xa1\xb6\xd3\x98\xb0\x64\x91\xbe\x4c\xae\x65\x4e\xe6\xca"
- "\x0c\xc6\x2b\xd7\x1c\x69\x97\x21\xf9\x31\xc2\x7b\xcb\x74\x99\x9f"
- "\xd6\x37\xe4\x17\xba\x79\x75\x3d\x24\x5e\x8d\xd2\xd2\x55\x1a\x34"
- "\x22\x7f\x15\x9d\xc1\x26\x3f\x3c\x83\x1a\xa5\x2c\x08\x8c\xde\x4b"
- "\x31\x22\x90\xcf\x5c\x07\x39\xc0\x13\xc1\x58\x99\xca\x6f\x12\x4e"
- "\xf0\xa5\xa9\x83\x96\xb6\xb0\x01\x96\x9f\xf1\x2f\x8f\x33\xf7\x55"
- "\x98\x47\x6e\xf2\x0b\x89\xb2\xcd\xc7\x59\x97\x17\xdf\x8d\x55\xaf"
- "\x26\x5c\x8f\xe1\x7a\x05\xae\xb5\xb8\x5e\x89\xeb\x9b\xc8\xaf\xa8"
- "\xf9\x13\x71\xbf\x05\xe9\x37\xab\x57\xd4\xd1\x4d\xfb\xd9\x53\x7e"
- "\x4d\x7c\xe5\x74\x91\xbe\x90\xee\x71\x9d\xa1\xb6\xbb\x46\xce\x6d"
- "\xf7\xdd\x28\xc7\x4a\xf9\x68\x5d\x43\x9a\x05\x79\xae\xa5\xb2\xc9"
- "\x27\xc2\x71\x76\xfe\x48\x00\x7f\x8a\x72\xce\xd3\xd9\x8c\x31\x78"
- "\xef\x43\x5c\x33\x71\x5d\x43\xe5\x82\x06\xf5\x7e\xbc\x38\xed\x9c"
- "\x65\x95\xfd\xe9\x64\x1d\xd3\x68\xbe\x6b\x78\x40\xe3\x29\x28\xdf"
- "\x34\x99\x4f\xca\xaf\xee\xbd\x5a\xdf\x79\xe4\xb8\xb5\x78\xd0\x77"
- "\x28\xff\x6e\x7a\x1f\xd7\x14\xf5\x9a\xac\x5e\xef\x55\xaf\xf7\xab"
- "\xd7\xb1\xea\x75\x9c\x93\xb9\x57\xab\xbc\x09\x68\xe6\x26\xfb\x3e"
- "\xda\x93\x52\xbf\x7b\xde\x4e\xf2\x35\xf0\xff\x96\x76\x8a\xf7\x56"
- "\x78\x7e\x8c\xa6\xb7\x26\xdd\x4f\x77\x61\xdb\xff\x6c\x16\xba\x9f"
- "\xf3\x13\x02\xb0\x30\x3f\x4a\x97\xcc\xc0\x3b\x45\x94\xe9\xb9\x6a"
- "\x4f\x73\x7e\xbb\x5e\xdd\xaf\xa7\xb8\x27\x14\xc7\x8e\xfc\xf1\x09"
- "\x39\x2a\x7a\x1f\xe9\xfb\x1b\x85\x4e\x7f\x1d\xf9\x17\x1a\xbf\x0a"
- "\x7f\x36\xc8\x14\x1b\x34\xbc\x27\x79\x49\xf5\xbb\x59\x85\x6f\x55"
- "\xfa\xe5\xfc\xf3\x19\x72\x6f\xf3\xf2\x64\xa4\x07\xc8\xff\xe7\xe3"
- "\xa9\xce\xa0\x75\x03\xda\x33\xa6\x89\x9d\x77\xe3\x7a\x53\xb3\x6c"
- "\x73\xa2\xd6\x66\xb5\xaf\x2c\x1a\xcd\x9b\x99\x7b\x03\xf0\x70\x11"
- "\x8d\xef\x26\x1f\x2e\xbb\x37\xd0\x55\x1d\x3f\xe8\x67\xf7\xbd\xd4"
- "\xdf\x01\x78\xd2\xe0\xc7\xe9\xae\xa9\xc1\xfd\x72\x66\xaa\x47\xf2"
- "\x0b\x0d\x98\x97\x34\x06\x86\xf7\x98\x97\x14\xb3\x3e\x46\x7d\xd7"
- "\x16\x8c\xf1\xe7\x5a\x08\xe3\xd5\x3a\x62\xdc\x76\x7a\xa8\x6f\x9c"
- "\xac\xcb\xa2\xae\x49\x0d\x58\x23\x6f\x41\x7a\xb3\xac\xa7\x4c\x57"
- "\xbf\x85\xf1\xd7\x49\xfe\x50\xaf\xd4\xd2\xd5\xf1\x4d\xe5\x1c\xa6"
- "\xbe\xd6\xd2\xd5\xf2\x31\x4e\x3b\x6b\x68\xfe\x68\xe9\x72\x4c\x9e"
- "\x8d\x27\xbc\xa1\x77\x3d\xc2\x96\x11\xf2\xf7\xf4\x2a\xd4\xbb\x7b"
- "\x0a\xf8\x0b\xf2\x51\xdf\xb8\x32\x9b\x45\x2d\x2d\x65\x83\xe5\xdc"
- "\xec\x5e\xa8\xbd\x2b\x75\xfa\xdd\xb3\x34\x8c\x5a\x2b\xf0\xec\x6c"
- "\x43\x30\x56\x2a\x3a\x5e\x68\xf0\x78\x8c\xe3\x73\x6a\x3d\x63\x04"
- "\xe6\x62\xde\x97\xe1\xbd\x32\x27\x5b\x6f\x57\xd7\x92\x1a\xb9\xa7"
- "\xd2\xfd\x51\x6d\xb9\xc4\x2e\xb5\x6c\x1f\xfe\x05\xf0\x21\x02\xeb"
- "\xe9\x5b\x54\x16\xd6\x15\x63\x47\x5e\xea\x20\x89\xdf\xdd\x2e\x27"
- "\x1b\x14\xaf\x61\x2b\xad\x4f\x06\x1d\xb3\x94\x4c\x97\xeb\x93\x42"
- "\x3a\x30\x4b\x87\xf0\xa7\x56\x67\x69\x63\xb4\x6e\x92\x9f\xeb\xb4"
- "\x65\x03\xc9\xdf\x54\xea\x71\xe6\x3d\x06\xfe\x6c\xbb\xba\x37\x03"
- "\x39\xd7\xbb\x91\x64\x59\x95\xae\x98\x4f\xde\x65\x6a\xbf\x34\xa2"
- "\x3e\xdb\x09\xdb\x57\x66\xc9\xd8\x41\xa4\x0f\x12\xb1\xa6\x88\x67"
- "\x35\x71\xb7\xf4\xd9\xef\xc9\x0f\xd0\x71\x95\xcb\x79\xd2\x3d\x5b"
- "\xc4\x62\xb0\x8d\xcf\x91\xfa\x44\xef\x60\x99\xee\x71\x49\x3b\x04"
- "\xe1\x4f\x93\xee\x1b\xc3\x4c\x71\xaf\x48\xbd\x70\xdb\x7e\xc9\x8f"
- "\x78\x02\xe3\x3f\x0b\x5a\x4b\x7f\xbe\x9e\x16\xff\xbc\xf0\xec\xa5"
- "\x77\xf0\xee\x5b\x9d\x85\x5e\xa6\xa5\xcb\xb5\xe6\xf4\x61\x55\x67"
- "\x96\x3f\xa8\x20\x99\x01\x9b\x23\x36\x17\x6a\xf3\xd7\x9b\x2e\xbf"
- "\x2f\xe7\x2f\xb5\x91\xc6\x03\xcd\x61\x8f\xf0\x09\xb6\xaf\x9a\xe6"
- "\x32\x7e\xaf\xf2\x68\x73\x57\xf2\x77\x0d\x62\xee\x8a\x79\xeb\xb5"
- "\xf8\xeb\xe1\x4d\x50\xc7\x6a\x63\xfb\x4c\x53\x14\x9e\xad\xc6\xda"
- "\xaa\xee\x65\x79\xa4\x8c\xb1\x6e\x74\xb5\x72\x8e\xbb\x49\x37\x4d"
- "\xfa\x04\xd2\xd9\xa8\xf6\xaa\xb4\x57\xd2\x41\x7e\xce\x6c\x98\x0f"
- "\x7e\xdf\x66\x46\xa6\xf9\x36\x43\x79\x8d\x7e\xdd\xb1\x47\xf3\x0d"
- "\x9a\x83\xef\x95\xd9\x73\xdf\x23\xfa\xdd\x20\xe7\x98\x67\x24\x8d"
- "\x63\x07\xc6\x1e\xd6\x9f\x52\x8a\x45\xdf\x59\xa8\x98\xb4\xb1\x87"
- "\x39\x3a\x0b\x63\xf4\xd5\x0d\x71\xbc\x14\x7d\x4a\x36\xf7\xf3\x70"
- "\xbf\x11\xd7\x59\xf2\xaa\x33\xd2\x55\x1d\xf3\xa5\x78\x17\xf3\x7f"
- "\x60\xb5\xd6\x07\x1d\xd1\x3b\xea\xc5\x18\xcb\x25\xfb\xc6\x44\xb1"
- "\xd7\x4f\x63\x8c\xc6\x97\xd8\xf3\xc7\x58\x33\x14\x3c\xc0\x68\x9c"
- "\x09\x7f\x27\x56\xea\x13\xcf\x1d\x34\xce\x50\x56\xb9\xe6\xdb\xd7"
- "\xc9\x14\x75\xbf\x4d\xd9\xa3\xd9\x81\xd3\x38\xcc\xbc\x86\x0d\x45"
- "\xf9\xe6\x2a\x73\x07\xe9\xce\x3f\x77\x78\xee\x65\x94\x97\x68\x27"
- "\xf1\xf2\xf2\x17\xf0\x4e\x40\xff\x9f\x11\xb6\xac\x07\xa6\x09\x7d"
- "\xe6\x65\x9d\x85\x3c\x3c\x18\x73\x4e\xda\x04\x5f\x89\xf5\xf9\x87"
- "\xb1\xcc\x8c\x71\x8b\xb5\x86\x27\x68\xfc\xf0\xa8\x58\xb2\xb7\x38"
- "\x49\xf5\x23\x19\x1c\x78\x7b\x32\x81\xd6\xe9\x5e\xf4\xce\x63\x48"
- "\x57\x44\x98\x41\xba\x27\xd2\x83\x81\xd6\x87\x8f\xeb\xf4\xaf\xd6"
- "\x42\x92\xe7\xcf\x5e\xe8\xdf\x39\xd7\xca\xcf\x92\x2f\x2c\xf3\x22"
- "\x76\x59\x93\x4e\x4f\x67\x35\x1b\xf2\x4e\x93\x8e\x87\x57\x04\xe9"
- "\x78\xfc\x1e\x95\x62\xf1\x67\xf5\xff\xe9\x22\xd5\xdf\xab\x2e\xfe"
- "\xa7\x33\xcb\xbc\xba\x91\xf8\x4b\x52\x69\xf5\xd7\xce\x22\x16\xab"
- "\xd1\x8a\x30\x85\x30\x96\xec\x6c\x68\x9e\xeb\x3c\x8c\x7c\x1d\xa1"
- "\x9f\x50\xef\x95\x3f\x7e\xd8\x9e\x0d\x99\x56\xc7\xee\x15\x32\x87"
- "\xbe\x8f\x67\xb2\x75\x4c\xf4\xa7\xf0\xa3\xaa\x63\x91\xf8\xf6\x97"
- "\x6b\x4f\xb1\x70\xcb\x22\x76\x15\xe9\xd0\x0d\x5e\x6e\x27\x19\x98"
- "\xc6\x04\x68\x50\xdf\xaa\xd3\x0d\xc8\x5c\xc1\xf4\x78\x3e\xa2\x55"
- "\xc7\xdc\x1a\x2f\x85\x77\x8c\x61\x6e\x16\x4b\x3c\x54\xca\x0a\x36"
- "\x02\xf5\x3f\xac\xf5\x15\xf1\x19\xa4\xc7\xf3\xc5\x75\xd2\x31\x61"
- "\x0b\x40\x3e\xeb\x9d\x44\x37\x0d\xab\x4e\xb1\x28\xdc\xdb\xc3\x3a"
- "\x98\x51\xac\x43\x45\x3a\x8c\xff\xb6\x06\x31\x5e\x74\xac\x11\x63"
- "\xff\xb0\xbf\x9e\xa6\xa1\x01\xbf\x1f\xa1\xf7\x0d\x1d\xc4\xc3\xf5"
- "\x46\x1f\xdd\x6c\x8d\x3e\x74\xee\xc0\x00\xfe\x5f\xf4\xb7\x87\xb7"
- "\xa1\x6e\x35\x96\x6c\x16\xd9\xaa\xd3\x3f\x82\x36\x12\x0f\x50\x2d"
- "\x74\xfc\x3a\xfd\x78\x4d\x4e\x97\xf5\xd6\x0f\x35\x14\x84\x31\xd2"
- "\xcd\x93\xbf\x47\x61\x8b\xf9\xb5\x49\xe8\xe3\x1d\x98\xda\xf6\xdc"
- "\xdb\xe9\x3b\x5f\xa8\x6b\x59\x63\x7b\x9e\x89\x1d\x30\xdd\xc1\xd0"
- "\x0e\xa7\x53\xff\xcf\xbe\xdb\xca\xeb\x74\x4e\x95\xbe\x35\xc2\x56"
- "\x44\xa7\xfb\x1d\xad\x25\xa4\x1b\xc0\x3a\x52\x45\xeb\x75\x67\x91"
- "\xfe\x0e\x6d\xde\x60\x9d\xa8\xc2\x3b\x3e\xbf\x06\xf8\xbd\x8b\x7c"
- "\xce\x08\xf9\x41\xe6\x8f\x12\xfb\x06\x45\x7a\x8b\x8f\xdf\x46\x3e"
- "\x7a\x4f\xd8\x10\xea\x74\xab\xd2\xbc\x3a\xd0\x54\xb7\x8a\xda\x26"
- "\xc7\xa2\xe9\x09\xe4\x2f\xf7\xcd\x5b\xf4\x83\x98\xb7\x6d\x01\xf3"
- "\xb2\x48\x6f\xf7\xcb\xa9\x9c\xce\x16\x9b\x43\xcd\x43\xcb\x10\xac"
- "\x55\xba\xb0\xd1\x6b\xd7\xf2\x72\x9b\x5e\xb9\x67\x65\x09\x8b\xd2"
- "\xad\x06\xd9\x68\x9e\x65\xa5\x0f\x3d\xae\x0b\xbb\xdb\x10\x75\xf9"
- "\x94\x94\xcc\xfe\x3c\xd7\xc4\xf4\x6b\xce\xf4\x8f\xbc\xc6\x7d\x79"
- "\x39\x0f\xfb\xf1\xc3\x13\x33\x69\xef\xdb\xc6\xbe\x9a\xc7\xc2\x52"
- "\xbc\xf8\x76\x14\xb3\x38\x75\xfd\x26\xd0\x19\xf5\x03\x51\xe0\x45"
- "\xf0\x9b\xca\xcc\x29\x63\x91\x39\xcd\xbc\x65\xf5\xd3\xfd\x22\xb1"
- "\xfe\x1a\xb1\x6e\x14\x0f\x8a\xba\xbc\xbc\x1b\x65\xbc\x9b\x2e\xde"
- "\x0b\x69\x93\xa5\xd6\xad\x36\x74\xdd\x2c\x71\xa8\xdb\x67\x7d\xab"
- "\x5b\xc4\x6a\x7f\xdd\x22\x56\xff\xeb\x75\x0b\x9f\x13\x50\x37\xa3"
- "\xbf\x6e\x19\xa8\x5b\xf8\xb2\xbe\xd5\xad\x7f\x8d\xbf\x6e\xfd\x6b"
- "\xbe\x61\xdd\x76\xf5\x5e\xb7\x7e\xfd\x42\xd7\xcd\x7a\xf9\x71\x5d"
- "\xbf\xa1\x7d\xab\xdb\x80\x28\x7f\xdd\x06\x44\xfd\x2b\x75\xcb\x2d"
- "\xe3\xc7\xea\xc0\xe5\x92\x3e\x87\x70\xfe\xb8\x2e\xe2\x8a\x15\xc3"
- "\x85\x1d\x77\x0c\xea\x55\x9b\x57\xc6\xbf\x14\xbc\x8d\xae\x9f\xd0"
- "\xfd\x77\x16\xf5\x2b\xc6\xf8\x95\x76\x25\xba\x08\x2b\xa5\x29\x61"
- "\xc3\x76\xf2\x42\xee\xb9\xb1\x83\x6c\x06\x3d\xe4\x97\x85\x7c\x9e"
- "\x57\xbe\x71\xce\x4d\xf1\x26\xaa\xb7\x9d\x09\x67\x6f\x9c\x73\xe9"
- "\xf1\x6e\x95\xe6\x8b\x55\x7b\xd7\x50\x7a\x31\x3c\xea\x77\x3e\x25"
- "\x83\x19\x08\x8f\xe8\x4a\x71\x23\xd7\xe6\xf6\x8f\x4c\x39\x8d\x75"
- "\xbf\x28\xc2\xa8\x9d\xb5\xd5\xca\x9a\xdc\xd2\x9f\x1b\x72\x58\x18"
- "\x9d\xf7\x15\x7e\x1b\x4d\x2e\x16\x9f\xc3\xfa\x4d\xb6\xa2\x7c\x37"
- "\x4b\x37\x58\x51\x36\xe8\x21\x78\x79\x5d\xc4\x23\x61\xf3\x58\xd4"
- "\x06\x94\x4d\xd7\x14\x53\x1e\x5f\xf9\x22\x0b\xa7\x73\xc1\x74\xbe"
- "\x57\x9e\xed\x8d\x88\xc4\x77\xac\xda\x77\x2e\x41\xbf\x21\x92\x7e"
- "\xfd\x1f\xf3\xd3\xaf\xff\x60\x3f\xfd\x22\x3e\x92\xf4\x8b\xa8\xf6"
- "\xd3\xaf\x7f\x65\xdf\xe8\xd7\x3f\xdc\x4f\x3f\xf9\xee\xc5\xe9\xd7"
- "\xff\xb6\xde\xe9\xd7\x7f\x8a\x9f\x7e\xb2\xac\x5e\xe8\x17\x11\x9a"
- "\x7e\xfd\x37\x7e\x33\xfa\xf5\xaf\xfc\x86\xf4\x1b\x2c\xe9\x17\xf9"
- "\xa2\x9f\x7e\x91\x13\xfd\xf4\x8b\x8c\x96\xf4\x8b\x8c\xf4\xd3\x2f"
- "\xd2\xdd\x37\xfa\x45\x8e\xf5\xd3\x4f\xbe\x7b\x71\xfa\x45\x2e\xeb"
- "\x9d\x7e\x91\x36\x3f\xfd\x64\x59\x7d\xa3\x5f\xe4\x27\xa0\x9b\x51"
- "\xa5\x9f\xb1\x77\xfa\x45\xba\xbf\x21\xfd\x0c\x92\x7e\x03\x8e\xf8"
- "\xe9\x37\x60\x8d\x9f\x7e\x03\x1e\x92\xf4\x1b\x30\xce\x4f\xbf\x81"
- "\x49\x7d\xa3\xdf\x80\x55\x7e\xfa\xc9\x77\x2f\x4e\xbf\x01\x6f\xf5"
- "\x4e\xbf\x01\xf5\x7e\xfa\xc9\xb2\x7a\xa1\x5f\xff\xd0\xf4\x1b\x38"
- "\xf4\x9b\xd1\x6f\x60\xd2\xc5\xe8\xd7\x37\x5e\x63\xa0\x90\x75\xbe"
- "\x83\x72\x36\xf4\x56\x0e\xd1\x90\xec\x13\x95\xa2\x81\x1b\xb6\x2a"
- "\x11\x91\xf2\x0c\xc7\xc0\x09\x90\x61\xee\x6a\xd2\x0d\xfc\x62\xab"
- "\xd2\x2f\x92\x17\xfe\xa5\x52\x29\xfc\x30\x9d\x17\x44\x84\x2b\x05"
- "\xfd\xc3\xc9\x17\x41\xaf\x71\xa8\x75\x83\xee\x0e\xbb\x82\x5d\x4d"
- "\xe7\xf5\x56\x82\x5f\xa3\xdf\x9d\x45\x83\x26\x80\x17\x69\xe8\x49"
- "\x93\x59\x73\x16\x8b\xa0\x96\x8b\x66\xcf\x5a\xb2\x60\xd6\x8c\x05"
- "\x99\xe6\x19\x33\x9f\x59\x1c\xec\x2b\x5e\xc4\x83\x5c\x45\xfd\x37"
- "\xc8\xe7\xff\x8c\x62\x3a\x92\x9f\x3d\xcb\x0f\xd8\x80\x56\xdd\xa0"
- "\x7a\xe1\xbf\x3f\xe6\x81\x31\xbc\x3b\xf5\xa5\xe4\x1f\xf2\x77\x84"
- "\xff\xc0\xee\x8c\x97\x20\x4f\x35\x92\x4f\x18\x75\x1f\xaa\xf1\xb8"
- "\x6e\xf0\x09\x1e\x3d\x29\x9f\x6c\x3a\xc4\xd9\x0e\x5d\x94\x59\xf0"
- "\x72\x85\xbc\x9a\x1b\xc7\x8e\x51\x6c\x93\xf2\xf9\xba\x49\x56\xa2"
- "\x41\x1d\xf9\x6e\xcb\x0a\x1b\xd1\xa4\x33\xec\xe2\xd1\x63\xc7\x70"
- "\xdb\xd8\x24\x75\x8f\x23\x89\xec\x45\x93\xb3\xf9\xe7\x54\x9e\xca"
- "\x0b\x52\x7c\x0e\xbb\xe4\x07\xa3\x66\x1b\x0a\xcc\x61\x94\x97\x7c"
- "\x28\x92\x6f\x41\x2d\x26\x13\xd5\x9b\xf2\x82\x1f\xbf\x0b\xef\xdf"
- "\x45\x31\x29\x7d\x65\xc8\x3a\x5d\x86\x3a\x95\x89\xb6\xd8\x52\x9c"
- "\xed\xcb\x53\x5f\x12\x71\x11\x05\x5d\x0d\xeb\xd0\x06\xa7\x88\x67"
- "\xe9\xf9\x5a\xc4\xb3\x54\xdf\xb9\x0a\xef\x08\x3c\x25\xbf\xa9\xb2"
- "\x0c\xc3\x32\xad\x5e\xe0\xa1\x07\xe2\x7e\x46\xc0\x37\x06\xe1\x7e"
- "\x7c\xc0\xf3\x28\xdc\xdf\x00\x3e\x34\x5a\x7d\x3e\x18\xf7\xd1\xc4"
- "\x97\x8a\x76\x95\xe4\x4b\x9b\x68\xdd\x10\xb2\x8d\x31\xaa\x79\xa2"
- "\x5b\x75\x43\x8e\x10\xaf\xab\x96\x11\x83\xfb\x7d\x24\x33\xaa\xcf"
- "\x63\x71\xff\x32\xed\x0b\xa8\xcf\x87\xe2\xfe\x39\xdc\xff\x48\x7d"
- "\x0e\xbe\x7e\xf0\x5e\x51\x67\xe3\xd8\x91\xd4\x26\xd0\x3e\x9d\xe8"
- "\x0e\x5a\x8f\xe4\xc6\x94\x46\xc8\xab\x79\xd4\x8f\xd4\x4e\x7b\x76"
- "\x2b\x6b\xd2\x0d\xfe\x1d\x9d\xcb\x93\x7d\x35\x29\x5f\xfa\xf6\xd1"
- "\xa7\x22\x9d\xf6\xea\xc2\xc8\xb6\x5c\x59\x37\x29\x9d\x7e\xa3\xae"
- "\xe3\x89\x86\xea\xb7\x20\x13\x0d\x6e\x50\xfb\x19\xb4\x23\xff\xbb"
- "\x2c\x7f\x9b\xda\x17\xa8\x5b\x7f\xd4\xed\x16\x75\xdf\xa3\x78\xb2"
- "\xa7\x5b\x9e\x2f\xd2\x0d\x61\xdf\xca\xdf\x04\xde\x93\xb8\x37\x24"
- "\x59\x8b\xd5\xe7\xd4\x0d\x16\xbe\x22\x68\x7c\x92\x7e\xc5\x15\x9d"
- "\x52\x2d\xfc\xab\x60\x8c\x6a\x63\x85\xc6\x09\x8f\x18\x94\x2a\x74"
- "\x35\x45\x43\x7c\xe7\x7f\xf1\x6e\xa5\x1a\xdf\x80\x49\x39\x61\x48"
- "\xa9\xcf\xbe\x48\x37\x58\xe0\x43\xc0\xb3\x3d\x01\xcf\xee\xd0\x9e"
- "\x09\x1b\xb8\xa2\x21\xf5\x01\xcf\x46\xf6\x78\xd6\x16\xf0\x6c\x78"
- "\x70\x99\x86\xc8\x80\x67\x51\xc1\xef\x19\xe2\xfd\xcf\xa2\xdc\x3d"
- "\x9e\x25\x07\x3c\x6b\x51\x9f\x85\x21\x3d\xd5\xe7\xdf\x50\x17\xd5"
- "\xa0\xa6\x03\xeb\x0d\x96\x80\xf4\x6a\x35\x9d\xbe\x0f\xfe\xef\xed"
- "\x4a\x35\x5d\x8c\x73\x8c\xa3\xeb\xd4\x6f\x6c\x0f\xf8\x46\xa9\xec"
- "\xc3\x94\x6a\xd9\x7f\x51\x46\x83\xce\xdc\x9f\xc6\x94\xa1\x20\x9f"
- "\x62\xe5\xd8\xa4\x2f\x2f\x39\x0f\x45\xbc\x65\x8a\x09\x8b\x7c\xbd"
- "\x61\x63\x48\x1b\xc1\x22\xa3\x49\x3b\xc7\xea\xb5\xa5\xd4\x28\xb6"
- "\x57\x4a\x29\xfe\x1e\xf9\xfc\xca\x6b\x23\xbf\x2f\x5a\xec\xbd\x2e"
- "\xe6\xc8\xec\xcc\x27\x4f\x09\xaa\x9f\x98\x21\xe4\xb3\xac\x4e\xe8"
- "\x77\x4e\xca\xf8\x7b\x74\xbe\x77\x5d\x4a\xcd\xd2\x36\x36\xdc\xf2"
- "\x33\xde\x4c\x72\x9e\xc4\x04\xe3\x6a\xbc\x63\x50\x7d\x39\xbc\x28"
- "\xce\x9b\xeb\x8c\xd5\x94\xe6\x68\x13\x7a\xe6\xc8\xe3\xba\x68\x93"
- "\x78\xce\x53\x5f\x94\xed\x8d\x36\x09\x59\x5a\x3d\x57\x88\x7a\xda"
- "\x7d\xf1\x21\x75\xd1\xc3\xcf\x46\x17\x58\x91\x76\x38\xc8\xbe\x51"
- "\x67\x3c\x49\x65\x52\x3b\x9c\x3a\xa3\x8d\xca\x46\x1e\xb7\xcf\xbe"
- "\x11\xe9\x4b\x3d\x6c\x18\xea\x76\x5c\x2b\xbf\xb3\x28\xda\xe4\xd4"
- "\x19\x84\x5c\x49\x65\x9e\x5d\xf7\x1b\x94\x1b\x3d\xd2\x19\x1e\x6b"
- "\x14\xf6\x91\x45\xd1\x49\x4e\xf6\x41\x54\x6f\xeb\x9f\xd0\x49\x1a"
- "\x27\x95\x72\xdb\xa4\x72\xcc\x79\x9b\x3c\xf3\x3f\xa9\x54\xca\xf2"
- "\xd1\xcf\x91\xfd\x05\xc5\xaa\xa6\x7d\x47\x89\x3b\xd1\xc2\x1e\x82"
- "\xd2\x40\x9b\x9d\xc0\xe7\x72\x31\x06\xfa\x34\x27\xa3\xc5\xfa\xb7"
- "\xf6\x0c\x8b\x2c\x51\x6d\x5e\x51\x4f\x67\x40\x9c\x06\x69\xff\xaf"
- "\x8b\x19\x50\x67\x15\x7b\x4f\xa2\x8e\x3d\xeb\x40\xf5\x45\x59\xab"
- "\x7a\x5d\x4b\x8d\x93\x6c\x42\x0f\xba\x7e\x7c\x83\xb0\x25\xd3\xc5"
- "\x3c\x14\x66\xba\xb2\xb2\xb3\x28\x66\x82\x2f\x3e\x05\xf2\x94\x90"
- "\x4d\x30\xca\xf7\xb5\x73\x11\x7d\x23\x46\xec\xa3\x39\x75\x31\xc5"
- "\xc0\x31\xb2\x8f\x0e\x57\xd3\x8b\xeb\x3c\x6e\x3a\x5b\x1f\xd2\x7f"
- "\x16\xad\x91\xc2\xf7\xd2\xfa\x49\x36\x3a\x3f\x31\xca\xad\xd5\xf9"
- "\xb2\x62\xb2\xdb\xa7\x3a\x4b\xda\x5e\xb6\x42\xa3\xe3\x9a\x33\x28"
- "\x3b\xf7\x53\xd6\xac\xbb\xac\x1f\xd9\xb7\xd0\x39\x94\xb5\xd9\xaa"
- "\xcd\x15\xd2\x44\xbe\x2e\x2d\x4f\x8c\xd0\x77\x90\xbd\x2f\xe1\xe9"
- "\x56\xf2\x3b\x80\x32\x4b\xd0\x17\xc2\xa7\x88\xee\xb2\x89\x42\xbf"
- "\xb9\x88\xc9\x76\x93\x3d\x9b\xee\xb2\x5d\x72\xac\x5c\x36\xd6\xa9"
- "\xbb\x4c\x9d\xbb\x32\x8d\x62\x9d\x93\x1d\xc2\x29\xdd\x65\xd7\x52"
- "\xcc\x54\xd0\xa3\x9c\xfc\xce\xd5\x75\x60\xbe\x58\xbb\x68\x2c\x94"
- "\x53\x6c\x3c\xe4\x8f\x97\xeb\x03\xd1\xfc\xb2\x48\xfa\x3e\xd1\x96"
- "\xe2\xc5\x82\xa6\x1f\xa0\x6c\x9f\xfe\x83\x62\xd3\x82\x6e\x7b\x7b"
- "\xeb\x17\xa2\x91\x17\x75\x26\x2f\x1e\xf6\x61\x9f\xa2\x7e\xb1\x73"
- "\x94\x98\x49\x36\xb2\x9f\xc4\x6f\xd5\xd7\xa9\xec\x3b\x39\x97\x62"
- "\xef\xc6\x37\x4e\xd3\x5e\x23\xd9\x8c\x8b\x78\xdd\xba\xcb\x5a\x54"
- "\xfa\x89\x78\x15\xb6\x2c\x49\x07\x35\x7f\x99\xd4\xcb\x5c\xd9\xd9"
- "\x59\x14\x9b\xe4\xd7\xcb\xc4\x0a\x9f\xc5\x9a\x8d\x35\x9e\x4d\x0d"
- "\xa8\x73\x87\x38\x07\x78\x86\x64\xea\xcb\x3c\xf4\xad\x35\xe4\x17"
- "\x8c\xc6\x45\x6b\xe0\xf8\xbf\xec\x33\xaa\x27\xd9\xe6\x79\xa3\xc7"
- "\x37\xf0\x75\xe3\x1b\x89\xce\x28\x3b\x16\x73\xc1\xd6\x4b\x3c\x74"
- "\x11\x8f\x09\xdf\xab\x0a\x88\x31\x8b\x75\x30\xf6\xac\xb6\xce\xd1"
- "\x1a\x4d\x7e\x1e\x7c\x69\xeb\xf6\x27\x81\xc7\x31\xaa\x3c\x8e\xb1"
- "\x57\x1f\x85\x37\xb2\x44\x3a\x6b\x4c\x76\xda\x34\xde\xb8\x71\x5f"
- "\x03\xf9\x3d\x26\x1f\x8e\xf6\xec\x9b\x50\xdf\xa1\x3b\x5e\x88\x13"
- "\xe7\x1b\x3b\xec\x37\x9e\x21\x1b\x9d\xb6\xe3\x39\xc2\x37\x51\xe4"
- "\x64\xab\x87\x6f\x93\x31\xa6\x5d\x3c\x7a\x5f\x03\x3d\x13\x7e\xff"
- "\xa9\xcc\x6f\xeb\xc3\x57\x37\xd4\xa2\xf2\x32\x6d\xc0\xc9\xcb\x5b"
- "\x75\x43\xc5\x79\x46\xfc\x8e\x6b\xd5\xc5\xd5\xca\xb8\x88\xd2\x0f"
- "\xbd\x6a\x6b\x18\x21\xcf\xe7\xbb\x98\x38\x2f\xad\x8b\xbb\xdb\xfc"
- "\x63\xc6\xda\x74\x71\xf7\x0a\x9f\xd0\xb6\xb1\x66\x95\x06\xe6\xb5"
- "\xb2\x5e\x86\x34\xab\x5e\xd4\x91\xea\xd7\xb7\xba\xc5\x69\xeb\x65"
- "\x44\x67\x51\xdc\x14\xed\x5c\xbf\x68\xbf\xea\x2b\xda\xfe\x03\x92"
- "\x5b\xe2\xf6\xc9\x7e\x19\x1b\xaf\x7e\x3b\xfe\x3b\xf8\x76\xb1\xba"
- "\x1e\xba\x85\xbf\x6c\xd0\x05\xfc\xa3\x1b\xf5\x68\xd0\xd6\x53\xd5"
- "\x46\x7e\xa4\x5c\xe7\xe3\x5c\xfe\xb5\x54\xd2\x30\xe8\xcc\xce\xb3"
- "\xcf\x66\x9a\xc1\xb0\x5b\x66\x64\xce\xcc\x30\xcf\x5e\xb4\xe8\xd9"
- "\x45\x66\x72\x6e\x13\x38\xc7\x84\x0d\x4c\xd1\xe5\xe1\x6a\x8c\xb3"
- "\x9d\xbe\x18\x67\x45\x97\x4f\x08\x8c\x3d\xe7\xd4\x5d\x3e\xe5\xbb"
- "\x91\x6b\x2e\xef\xf5\x9c\x9f\x4d\xaf\x54\xe0\xaf\x12\x7f\x76\xfc"
- "\xd1\x19\x32\x96\xe6\x66\xc9\x58\x1f\xc5\xf9\x34\xff\x79\xf5\xcb"
- "\xe3\x69\x1f\xbc\x49\x77\xf9\x87\x5b\x95\x70\x26\xfc\x9a\x14\x2a"
- "\x64\x4b\x42\xbe\xcd\x2b\xf1\x67\xc7\x5f\x35\xfe\xc4\x7b\xca\x7b"
- "\xe2\xac\x6d\x45\xe0\x33\xda\x9b\xe6\x85\xdb\xdb\x28\x0f\x2f\x08"
- "\x17\xfc\x9f\xb2\x5e\xe6\xeb\x51\x07\x3d\x2f\x8a\x9e\xa0\xe6\x13"
- "\x67\xa2\x87\x14\x30\x73\x88\x7c\x61\xbc\x68\x90\x55\xcd\x27\xec"
- "\xd2\xb4\xf6\x90\xdf\x7d\xe4\xd7\xf2\x85\xf3\xa2\xa1\x91\x6a\x3e"
- "\x31\xd6\x94\x42\x7d\xa8\xef\xf6\xe3\x85\x47\xf6\xa8\xf9\x8c\x81"
- "\xe5\x05\xe4\x89\x50\x8a\xf4\x8d\x94\x47\x29\x08\x17\xfa\x7f\xf4"
- "\xe5\x3c\xe4\x0f\xe9\xaf\xb4\x6f\xfd\x74\x45\x6c\xcf\x7e\xb2\xcc"
- "\x9c\x33\xfb\xf6\x39\x0b\xb2\x28\x0a\x54\xe6\xb3\x4b\x32\xe9\xba"
- "\x60\xc6\x33\xe2\xf2\x6c\xda\xd3\x33\xe5\x8f\xcc\x79\x89\xf4\x63"
- "\x1e\xc6\x1b\x5d\x67\x2d\xb1\xd0\x65\xe6\xb3\x74\x6b\xcd\x18\xb9"
- "\x64\xa6\x16\xba\x3a\x70\x1c\x26\x74\x16\x5d\xb1\x17\x63\x63\x97"
- "\xe4\x47\xae\xa8\x86\xfc\x2b\xf6\x81\x0d\x05\x4e\xf6\x7e\x82\x88"
- "\x71\xc7\x2e\xf0\x57\xa0\xbb\xe2\x13\xf2\x57\x60\x28\xb0\xcc\x34"
- "\x78\xe6\xcc\xe6\xeb\x1e\x48\xea\x2c\x1a\x16\xee\x64\xbf\xb6\x4b"
- "\x5e\x68\x6c\xa2\xf0\xf9\x59\x74\xc5\x54\xcd\xbe\x50\xb1\xa5\x34"
- "\x93\x2f\x7b\x61\x6f\xb4\x9e\x7c\xe1\x8c\x35\x22\xdf\xc8\xad\xeb"
- "\x45\x4c\x99\x58\x3c\x6f\xc3\xfd\x18\xdc\x53\xec\xb5\xe1\x8a\x6d"
- "\x8c\x95\xce\x27\xe2\xde\x8c\xfb\x78\x94\x3f\x4b\x9b\x17\x81\xb4"
- "\x51\x83\xaa\xdd\x1e\x52\x3e\x0e\xf6\x27\x85\xb9\x35\x6c\xa7\x16"
- "\xb3\x56\xc4\xa7\x2d\x1a\x56\xe9\x8b\x4f\x2b\xe2\x30\x19\xa7\x89"
- "\x75\x4d\xac\xed\x57\xde\x12\x66\xba\xea\x3e\xc9\x87\x0f\x73\x6a"
- "\x3e\x19\x24\x9f\x3d\xcc\x15\x10\xdb\x17\xf7\x57\x32\x5f\x6c\x5f"
- "\xc9\x87\xbe\x24\xf9\xd0\x2b\xc7\xf1\xa2\x61\x16\x5f\x1c\xb6\xa2"
- "\x2b\x13\x02\xe3\xb0\x39\xf1\x9c\xe4\x1b\xa4\x27\xfb\xd7\xc1\x61"
- "\x87\xe9\x9b\xa1\xe2\x18\x43\x3e\xb7\xa6\x2d\x03\x2f\x8e\xab\xe0"
- "\xcb\x55\x1e\x98\xd2\x79\x61\x32\xf9\xb7\x31\xd3\x33\xe2\xfd\x42"
- "\xea\x1c\xae\x16\xed\x3a\x42\x3e\x73\x5d\x79\xb3\x74\x3f\xdc\xca"
- "\x74\xe2\x5e\xfa\x7c\xe4\xa7\x74\x57\x8a\x73\x6c\x9a\x3f\xb8\xc0"
- "\x33\xf1\x21\xcf\x1e\x7c\xac\xed\x19\xcf\x7b\xd6\xe0\x99\x31\x5b"
- "\xf2\x71\xc3\x6f\x53\xf7\x88\x3d\x72\xbd\x1f\x1e\xcf\x1f\x96\xb1"
- "\x4a\x9c\xba\xe1\x3b\xe9\x3c\x92\x41\x37\xef\x59\x8e\x77\x0d\xd6"
- "\x19\xb3\x45\x1a\xf2\xad\x04\xaf\x25\xeb\x37\x7c\x80\x63\x78\x0b"
- "\xe3\xe7\xbc\xf2\xac\xbf\x6e\x78\xe4\xf4\xab\xf2\xe9\x3b\x91\x82"
- "\x8f\xf8\x98\x45\x51\x4c\x3c\xaa\xdb\xd6\x00\x7f\x75\x6b\x91\x26"
- "\xe2\xdd\x3f\xcc\xa2\xc8\x3f\xaf\x5a\x97\x48\x11\x67\xac\x68\x78"
- "\xb9\xe6\x33\x07\xdf\xbb\xc0\xd7\xf2\xc3\x3f\x17\x33\xe4\xda\x99"
- "\x23\xa7\xdc\x8b\x5f\x23\xd5\x70\xae\x81\x63\x67\x78\x7b\xcc\x84"
- "\xa4\xf6\xd7\x53\xfa\x8b\x78\x88\x45\xc3\xc1\x43\x5d\xa9\xc6\x50"
- "\x7e\xe2\x04\x61\x8b\x88\x13\x48\xe7\x0a\x95\x0e\x7c\x77\x44\xad"
- "\xf0\x8d\xab\x97\xfc\xa2\xf0\x49\x57\x34\x7c\x0f\x8f\x49\xa9\x97"
- "\xb1\x50\x1f\xa8\x47\xff\x89\x75\x9f\xe6\x86\x38\x3f\x69\xa4\xb6"
- "\x5f\x35\x0e\x98\x9a\x82\xbf\x5f\xc8\xd8\x2e\x4f\x9c\xd0\xca\x25"
- "\xff\x51\x18\x5b\x49\xb8\x1a\x3b\x8b\xae\xb2\xf8\x6c\x84\xb4\x33"
- "\x99\xba\xab\xd6\x91\x6f\x2b\x3f\x7f\x3e\xe2\x2d\xc9\x57\x5e\x55"
- "\xe6\x64\x86\x52\x39\xbf\xaf\xc2\xf8\xdf\x3d\x56\xfd\x0d\xf9\xf7"
- "\xe6\xea\x1e\x65\x78\x35\xdd\x87\xec\xbb\xab\x1a\x30\x16\x53\xf0"
- "\xf7\x0b\xe4\x6f\xd6\x62\x41\xaf\xd4\x8b\xb3\x45\xc7\xc3\x4c\x2c"
- "\x11\xe9\x1e\x2d\xbd\x9f\x2e\x19\xb4\xb9\x3a\x4a\xc3\x93\xf6\x98"
- "\xf1\xcd\xb8\x1f\x0e\x7e\x73\x83\x7a\x0f\xbe\xee\xea\x91\xda\x3d"
- "\x7e\x27\x69\x78\x43\x3a\x88\xf6\xe5\xa9\x2f\x92\xfc\x37\xd3\x04"
- "\x9e\xcc\x44\xf2\xd5\xd5\x90\x7f\x77\x25\xaa\x79\x67\x39\xd9\xeb"
- "\xda\x7b\x68\xff\x50\x97\x9f\xfe\x61\x06\x59\xff\x11\xdb\x79\xf4"
- "\x2b\xa5\x14\x83\x1b\x79\x36\x60\x2e\x49\xff\x19\x59\x6d\xe5\xab"
- "\xbb\x8c\x53\x1d\x90\x46\xec\x4f\xd3\xb8\x18\x21\x6c\x6b\xd6\x64"
- "\x1b\xa7\x10\x7f\x47\x3e\x07\x44\x4c\x33\xf2\x0d\xe9\x61\x11\xc2"
- "\x1f\xff\xba\x57\x8a\x85\x1f\xfa\xa5\x09\x51\x9a\x5f\x48\xcc\xc9"
- "\x7c\xae\x7f\x21\x9e\x7c\x45\x0a\xbd\x59\x67\xc2\x10\xe1\x1f\x52"
- "\xf5\x0b\xb9\x25\x8b\xc5\x96\x29\xd2\x2f\xa4\xf0\x47\x70\x11\xdf"
- "\x90\xbc\xf0\x90\x51\xf3\x0d\x89\x36\xd3\x39\xc3\x04\x7e\xce\xe3"
- "\xc6\x35\x3e\xc0\xaf\x4d\x78\x48\x3f\x91\x7a\x60\xa4\x5e\xfa\x89"
- "\xec\xdb\xda\x32\xc2\x22\xc7\xc4\x88\x0a\x2d\x2e\x75\x40\x5a\x15"
- "\xc6\xb4\x8a\x41\x57\xd9\xd4\x34\xf0\x3f\xaf\x95\xf9\xf8\x30\x60"
- "\x1b\xe9\x0f\xf1\x3c\x96\xe7\x65\xbc\x18\x38\x87\x18\xa3\x25\xba"
- "\x1f\xe6\x56\x04\xfe\xfa\xd3\xdf\x38\x1f\x4e\x9c\xe3\x0d\x24\x0b"
- "\x18\x74\x58\x57\xac\x61\x7c\xb2\xc7\x13\x96\xe6\xd1\x1d\x26\x1e"
- "\x93\xce\x56\x4f\xf6\x7a\xe8\x8c\x7f\xf8\x64\x6f\x3b\xc5\x8b\x3c"
- "\x4c\x67\xc6\xd6\x3e\x4d\x67\x18\x47\x70\x8a\x25\x33\xd9\xfb\x35"
- "\xdf\x26\xcf\x66\xd6\x93\x0c\xe0\x3d\xc7\x6b\xbc\x59\x9c\xf4\x42"
- "\x51\x24\x5f\x90\x9f\xad\x21\x3a\x37\x1b\x62\x09\x7b\x67\xd2\xd9"
- "\x77\x38\xf9\xd8\xa2\x38\x62\x4a\x91\x1b\x98\x68\xd6\xa5\x79\xc2"
- "\xf2\x1d\x9e\x66\xe1\xcb\x7f\xb2\xb7\x3f\x9f\x6c\xbd\x93\x8b\xf8"
- "\x5f\x59\xbc\x0a\x78\x1a\x26\x62\x42\x2f\xe3\xed\xf8\x1d\x39\x79"
- "\x59\x3b\xa7\x78\x95\x28\xbb\x7a\xb2\x47\xe9\x9a\x6c\x55\xf2\xd2"
- "\xac\x3a\xbc\xf7\x25\xde\xfb\x12\xf5\x49\x44\x99\x46\xdc\xdf\xc5"
- "\xb7\x3d\x4d\x67\x9d\xf2\x85\x8c\x83\x36\xda\xd5\xf3\xa3\x95\xa8"
- "\xdf\x1e\xf2\x05\x9e\xe6\xb1\xe7\x6f\x53\xcf\x83\x8a\x58\xa9\xd6"
- "\x6e\xae\x7e\x27\x69\xf2\x32\x76\x57\xda\xb2\x11\xe2\x5c\x29\x9d"
- "\x99\x9a\xec\x31\xe3\x9b\xf9\x44\x8f\x28\x11\x9f\x9a\xce\x4d\x15"
- "\x5d\x93\x7a\xb1\x38\x97\x21\xe5\xea\x92\x89\x36\xbe\xf1\xfe\xc3"
- "\xbc\x64\xca\x3c\xbe\x71\xdc\x54\x6e\x7b\x80\x62\xc2\xea\x78\xc9"
- "\xcf\xc7\xe1\x1e\xe9\x8f\xc6\xf3\x8d\xe3\xa7\xf2\x92\xc7\x18\xae"
- "\xb8\x7f\xa2\x91\x6f\x7c\x00\xf7\x37\x54\xe3\xbd\x7a\x5e\x32\x2a"
- "\x09\xf9\xa6\xf0\x92\xc4\x9d\xb8\xe2\xfe\x26\x13\xf2\xe1\xfe\xe6"
- "\x62\x5c\x71\x3f\xc6\x7d\x5c\xf7\x83\xe1\x78\x07\x69\xd3\x2b\xe5"
- "\xb7\x66\x54\x89\x6f\x95\xcc\xaa\x97\xdf\xf8\x65\xa3\xfc\xc6\xdc"
- "\x16\xf9\x8d\xf9\x1d\xf2\x1b\x3f\xcd\x40\xfe\x06\x5e\x92\x34\x15"
- "\xf9\x52\x79\xc9\xed\xc9\xb8\xe2\xfe\x8e\x91\xc8\x87\xfb\x9f\xd1"
- "\xb7\x70\x9f\x1c\x8e\xfc\xb8\xbf\xdb\x85\xfc\x8d\xbc\x24\xc5\x89"
- "\x7c\xd3\x78\xc9\xbd\x54\x3e\xee\xef\xb7\x23\x1f\xee\xc7\x57\xe0"
- "\x8a\xfb\x07\xcb\x91\x1f\xf7\x0b\xd1\xa6\xfb\x9d\xbc\x64\xd1\x1e"
- "\xe4\x4b\xe7\x25\x99\xf8\xde\x38\xdc\x67\xa1\xbe\xe3\x71\xbf\x14"
- "\xef\x8f\xc7\xfd\xb2\x55\xc8\x8f\xfb\xe5\x68\xeb\xfd\xcd\xbc\x24"
- "\x07\xdf\x19\x37\x8b\x97\xe4\x52\x9b\x71\x9f\x9f\x8e\x7c\xb8\x2f"
- "\xa4\xfa\xe0\x7e\x25\xde\x7b\x00\xf7\xcf\x81\x06\xf7\xb7\xf0\x92"
- "\xe2\x54\xe4\xcb\xe0\x25\xbf\x4e\xc0\x15\xf7\x6b\xdc\xc8\x87\x7b"
- "\x1b\x68\x38\x1e\xf7\x2f\x94\x22\x3f\xee\x37\x51\x7b\xdb\x78\xc9"
- "\x8b\x77\x20\xdf\x3c\x5e\x52\x66\xc4\x15\xf7\x5b\x9b\x91\x0f\xf7"
- "\x2f\x83\x7e\xe3\x71\xbf\x7d\x35\xf2\xcf\x0b\xdd\x9f\x3b\xc3\x79"
- "\x41\x04\xe3\x25\x7b\x4c\xbc\xa0\x3f\xae\x6f\x56\xf3\x82\x7e\x09"
- "\xbc\xe4\x2d\x2b\xd2\x71\xfd\xe3\x1e\xdc\x8f\x54\xef\x71\xfd\x53"
- "\x39\xee\x13\xd5\x7b\x5c\x2b\x57\xe3\x7e\x8c\x7a\x8f\xeb\x3e\xba"
- "\x4f\xe2\x25\xfb\x71\x8d\xa0\x6b\x14\xee\xef\x50\xef\x71\xb5\xa7"
- "\xe2\xea\xe1\x25\x7f\x1e\x8b\xf4\x64\x5e\xb2\x97\xbe\x4f\xd7\x2a"
- "\xdc\x8f\xc5\xfb\x09\xb8\x1f\xeb\xba\xf6\xd6\x7c\xb2\x47\xe2\x71"
- "\x43\x6c\x4a\xdc\x84\x29\x79\x67\x99\x9e\xf4\xca\x15\xb9\x4e\xf2"
- "\xdb\x30\xa2\x49\xf7\xc3\xf3\x14\x13\x82\xf2\x78\x37\xdd\x5f\xaf"
- "\xc4\x8d\x9b\x82\xf4\x08\xe4\xeb\x7f\x5c\x77\x2d\xc5\xbe\x60\x8e"
- "\x1c\xa7\x88\x45\xa7\xfa\xa4\x8b\x68\xd2\xc5\x5f\x03\x5e\x20\x89"
- "\xe2\x77\x83\x4e\x51\xbc\xb0\xdf\x19\x5c\x57\xf3\xc2\x41\x4d\xa0"
- "\x13\xee\xa3\x3f\xc6\x15\xf7\x3f\xfd\x15\xe8\x85\xfb\x27\xee\xc1"
- "\x15\x58\x1f\x9f\xef\xd4\x5d\x23\x7d\x34\xbd\x9e\x02\xdc\xe4\xc0"
- "\x18\xd4\xed\xe5\xac\x7c\x83\xc7\x8e\x31\xf1\xb8\xc5\x40\xbe\xd5"
- "\x76\x24\xe5\xf3\xb8\xcb\xcb\x45\xbd\x0b\x21\xbf\x76\xc7\xeb\xe5"
- "\xb7\x07\x71\x7c\x7b\x37\xe9\x3c\x79\xdc\xa8\xde\x9e\xd7\x8a\xe7"
- "\x3f\x58\xca\xe4\x73\x23\xf3\x3f\xff\x05\x3d\x3f\x69\x20\x3d\xf5"
- "\x75\x3f\x02\x2f\x78\x6d\x2c\xe5\x71\xea\xe2\x21\x97\x86\x31\x47"
- "\x47\x8b\xda\xc6\xfe\xc8\x77\xed\x50\x7a\xaf\x37\xdd\x8b\xb2\x21"
- "\xcd\xbd\xa6\x90\xd7\x93\x9c\x89\xf5\x42\x6f\xce\x8d\xaf\x6c\xd2"
- "\x5d\xd7\xbc\x85\xf4\x07\xb1\x4b\xec\x74\xfe\x07\x65\xbc\xda\xbd"
- "\xfe\xc1\x91\xe6\x6c\x03\xca\xbb\xee\x58\x9e\x9b\x77\xd8\x73\xef"
- "\xc1\xba\x26\xd2\x33\x84\x4d\xb9\xfc\x3d\x55\xda\x01\x89\xdf\xc9"
- "\x52\x17\x7a\x5d\x33\xbd\x1b\xc8\xd7\x7b\x8b\xbe\x32\x2a\x71\x4b"
- "\xea\xe5\x3e\xd6\xb5\xbb\xf7\x29\x4e\xbd\x21\x93\xf5\x33\x67\xbf"
- "\x43\xf5\xed\x08\x96\x01\xb5\xbc\xe2\xd9\x91\xfd\xc8\xbb\x59\xe8"
- "\x6b\xae\x0b\xd7\x74\xbd\x1c\x6d\xf8\xb5\xe4\x7f\x92\x69\x0d\x93"
- "\x7c\xdc\x75\xab\xc8\xef\xa5\x27\x36\xd5\xe9\xd9\x30\x24\xdf\xbb"
- "\x61\x89\x9d\x6f\x5a\x52\x3f\xc4\xa3\x63\xc2\x1e\x5f\x77\xdd\x5b"
- "\xa3\xdc\xa4\x47\x3b\x48\x79\x17\x2a\x11\xae\xc3\x37\x5a\x99\xde"
- "\xbe\xe8\x53\xba\xff\x1d\x2f\xea\x6e\x70\xb4\x35\x30\xf2\xdd\x8b"
- "\xfb\x0a\xfe\xab\x98\x1a\x65\x60\x44\xc7\x56\xe2\x3f\xad\xa4\xff"
- "\xf9\x98\xd2\x6f\x01\x9d\xc1\xe7\x5f\x67\xd3\xea\x42\xbe\xfb\xd7"
- "\x80\x76\xc4\x1b\xd2\xf9\xe9\x34\xaf\x97\x7c\x3d\x15\x3b\x41\x07"
- "\xa9\x43\xbc\x2e\x93\x30\x5a\xfd\xee\x87\x4a\xcc\x83\xa6\xba\x69"
- "\xb4\x57\x6a\x24\xdf\x39\x1d\xe2\xbc\xa5\x87\xe2\xed\xd1\xba\x28"
- "\xf3\x06\xf6\xdd\x1c\xf5\x9c\xe9\x9c\x05\x99\x8b\x16\x9a\x17\xcf"
- "\xc9\x9e\x7d\xe7\xb5\x4b\x46\x9a\x17\x59\xcd\x8b\x44\x7c\x67\x91"
- "\x30\x6b\xa4\x79\xf1\xbc\x67\x33\xcd\x99\xcb\x2c\xb3\x2f\x8c\xdf"
- "\x6b\xe2\xc6\x07\x54\x9e\x6d\xa4\xdc\x9b\x2a\xcf\xb2\x66\xe6\x70"
- "\xc5\xfc\x83\xfe\xe0\xc9\x7f\xb4\xea\x7c\xc4\x75\x2e\x3a\x7b\xae"
- "\x14\x9a\x99\x1a\x83\x3a\xea\xc5\x18\x46\xe7\x3a\x22\x3b\x8b\x7e"
- "\x14\xb0\xff\x31\xb2\x4a\xea\x27\x7e\x64\xc3\x18\x1c\x43\x69\x1b"
- "\x34\x7f\x5c\xea\x33\xb9\x7f\xf0\x23\xac\xff\xab\xa5\x7f\xb0\xf2"
- "\x25\x0d\x92\xd7\xfb\x91\xd0\x5d\x72\x73\x96\x95\x6f\x4f\xca\x07"
- "\xef\xa3\x23\xbd\x8f\x88\x73\xcb\xce\x88\xb3\xa7\x7c\xe3\x63\x2e"
- "\x3a\xf7\xed\xdd\xf4\xa0\x45\x89\x7b\xcc\xa5\xbc\x72\x5b\x72\xde"
- "\xcb\x4c\xff\x06\xe6\x7c\xb8\x19\xe3\xfb\x07\x6c\xc4\x3b\xb9\x2d"
- "\x7a\xd4\xf9\xf4\x3b\xb9\x0d\x7a\xbe\x61\xc2\xb8\xf6\xf8\xdb\xd3"
- "\xdd\x85\xc2\x6f\x27\xca\x70\xb3\xbf\x8c\x65\x24\xb3\x54\x76\x0c"
- "\x7d\xaa\xb8\x63\xe8\x83\xa9\xee\x8d\x73\x5d\xf6\x1f\xdc\xc4\xee"
- "\xbd\x9e\x7f\xfd\x41\x15\xe9\x96\x46\xee\xfa\x60\x2c\xe9\xf6\x1e"
- "\x68\x73\x1b\x1f\x70\x75\x6c\x7a\xcc\x42\xfe\x6c\xce\x6f\x7a\x26"
- "\xb9\x2b\x6e\x62\xfd\x01\xe4\x39\x08\x9e\xfe\x90\x19\xe3\xf7\x1a"
- "\xa6\x3f\x7f\xdd\xad\xf5\x6f\x74\xd9\xf4\xd5\x55\x77\x48\x7d\x64"
- "\x3a\xe6\x8c\x18\x4f\x09\x1b\x3f\xd8\x53\xc5\xf0\x6d\xf6\x46\xd7"
- "\x38\xfd\x5f\x92\x2e\x78\xfe\xe6\x07\x89\x55\xac\x93\x7c\xa9\x42"
- "\x76\xda\xff\x69\x29\xe3\x9b\xd2\x2b\x76\x67\xbb\xf5\xd3\x9c\x4c"
- "\x5f\xdb\x50\xca\x72\x8e\xb1\xc1\x9e\xaf\x13\xc2\x5f\xc3\xfb\xe7"
- "\xc9\x47\xe1\x21\x93\xf0\x55\x96\x6b\x17\x71\x5b\x0d\x75\xe0\x27"
- "\x94\xaf\x13\x22\xea\xa6\xda\x19\x9e\x67\x7b\x1e\x34\xb1\xda\x0c"
- "\x17\x73\xa4\x96\xb3\xf3\xfa\x64\xf6\xd6\xe3\xe5\x6c\x33\xf8\xf6"
- "\xcd\xa7\x58\x94\xdc\x67\x4d\x88\xf0\x74\x27\x84\x7b\x96\x27\x90"
- "\xef\x18\xce\xbf\x4e\x18\x48\xfc\xa3\xe7\xd9\x84\xc8\x3a\x57\x39"
- "\x1b\xd5\xc2\x12\xce\xeb\x99\xe1\xfc\xf2\x84\x81\x75\x96\x52\x94"
- "\x45\xc1\xa6\x99\x8e\xfc\x56\x91\x3f\x2b\xa2\xd3\xa0\x54\x36\xb5"
- "\x4d\x97\x30\x7f\xe0\x61\x36\x94\xfc\x26\x92\xdf\x33\xf2\xdd\xaa"
- "\xc4\xa6\x57\x78\x63\x1f\xb3\xe4\x9e\x25\x3f\x1f\x6e\xc6\x5f\xbf"
- "\xc7\x49\x3c\xed\x74\xe0\x0e\xb5\x59\xe1\x09\x03\xd3\xe8\xba\x3e"
- "\x25\x9b\xf8\x5a\xa5\xd3\x44\xf1\x88\x22\xa9\x9e\x98\xa7\x91\x2b"
- "\xbe\x00\x2d\xf3\x12\xc2\x91\x2f\x0a\xe9\x43\x1c\x6d\x6e\xe6\xbd"
- "\xe1\x1e\xd7\x8d\x16\x11\x77\x36\x76\x6b\x2e\x33\xda\x72\x59\xac"
- "\xf9\xa7\x62\x2c\xad\xf1\xee\xbe\xc7\xc9\x8b\x6e\x9f\xc5\x0b\xc2"
- "\x87\xcb\xb4\x9f\xcc\x37\xdf\xc7\x98\xf9\x26\xf1\x7b\xa8\xf9\x76"
- "\xf4\x61\x6c\xba\x51\xf0\xdc\x42\x16\xfb\xc9\x00\x39\xc6\x7f\xa2"
- "\x3b\x1f\xb1\x6a\xa7\x52\xf4\xa7\x2a\xa5\x20\xdc\x4c\xf1\xa9\x4f"
- "\xe9\x7e\x7c\x8c\x97\x1c\xac\xe6\x1b\xe6\x8a\xb1\x88\xfb\x2f\xce"
- "\x47\xfc\x34\x8a\x97\x1c\x1a\x89\xf2\x93\xcf\xeb\xc2\x1b\xf0\xd7"
- "\x28\xdf\xff\x71\x03\xb5\xdb\xbb\x3d\x29\x95\xda\x2d\x62\xd8\xa0"
- "\x5d\x69\xe8\x33\x1e\x97\x66\x17\x7e\xdd\xbb\x41\x5f\x35\xc6\x27"
- "\xd1\x83\x68\xa0\x74\x27\x0c\x14\x6d\xed\x4e\x88\x02\x7d\xc9\x47"
- "\xaa\x21\x77\x06\xde\xd9\x94\x76\x18\xcf\x86\x9c\x8f\x4d\x8f\xa4"
- "\x58\x52\x0e\x8b\x8b\x79\x37\xa6\xd5\x93\x0f\xb0\x17\xb3\x31\xe7"
- "\x86\xa6\x81\xd7\x48\x6b\x54\xe7\x16\xa3\x7a\x2a\x25\x87\xac\xe7"
- "\xc9\x86\x1f\x75\x43\xfd\x1a\xf0\x87\xe7\x3f\x9e\x76\xfe\xda\xa4"
- "\x0c\x5c\x13\x51\x57\x33\x2f\x7a\x78\x03\xfd\xc6\x33\x33\xda\x7c"
- "\x2f\xd1\x81\xe8\xa1\xd2\xe2\x4e\x3f\x2d\x72\xeb\x91\x6f\xa4\x52"
- "\xf4\x7b\xbc\xfb\x93\x28\x5e\x34\x71\x6a\x40\xbe\xd9\xfe\x7c\xbf"
- "\xca\x94\xf9\xf6\x99\x64\xbe\x5f\xd4\xa0\x1f\x74\x2a\xbd\x5f\x0d"
- "\x41\xef\x97\xfd\xef\x2e\x1e\x2e\xdf\xfd\xcd\x4e\xf9\xee\x3d\x78"
- "\xf7\x27\x47\x7a\xd4\xe9\x23\x7f\xfe\xf9\x53\x64\xfe\xff\x4e\x95"
- "\xf9\xef\x2c\x0d\xc8\x77\xde\x9f\xcf\xda\x28\xf3\xed\x72\xc9\x7c"
- "\xf7\x83\x37\x1c\x79\xcb\x85\x75\x19\x79\x83\xff\x9d\x4d\xe9\xf2"
- "\x9d\xea\x28\xf9\xce\x53\xc5\x78\x3e\x3b\xb8\x2e\x23\x9f\xf4\xe7"
- "\xb7\xa9\xed\x7e\xaf\x4c\xe6\x7f\x72\x4c\x40\xbe\xe7\xd4\x31\x81"
- "\xe7\xb5\xc8\xf7\x13\x76\x3e\xa2\x6c\xac\xcc\xf7\xcb\xc3\x34\x1e"
- "\x91\x67\x87\x52\xf4\x5f\x1d\xe7\x23\x92\x9c\x4e\xdd\xf5\x1d\xe8"
- "\x9b\xe1\x74\x45\xdf\x0d\x57\x6c\x0f\xb4\xe1\xf7\x3c\xda\x6f\x20"
- "\xcc\x75\xea\x7e\x34\x01\xb8\xeb\x0d\xbd\x97\x39\xb2\xd9\xa7\xdf"
- "\x52\xc0\x1b\x6c\xbc\xbf\x3c\x24\xbf\xb6\xfe\x9e\x36\xb2\x41\x20"
- "\x4c\x39\xae\xbb\xe1\x11\xf2\x0d\xc7\xf3\xc6\xa9\x3a\xa5\x1b\x84"
- "\xad\x3e\xf9\x66\x20\xbd\xa3\x9a\x26\xfd\x51\x61\x6c\x42\x2e\xac"
- "\x24\x7f\x7c\xa4\x67\xc4\x1a\x55\xed\xd4\xdd\x90\x01\x9c\xe8\xf7"
- "\x82\x5e\xa9\xc0\x5f\x25\xfe\xec\x2f\x90\xfe\xb1\x90\xdd\xab\xe9"
- "\x66\x43\xd7\xf5\x06\xac\x7f\x6b\x4a\xfd\xfa\xa9\x1b\xca\x31\x7e"
- "\xdd\x7d\xb7\xdf\xbd\xa1\xfc\x22\xfb\x44\xe1\xc2\x47\xfa\xa6\xfb"
- "\x5d\x36\x45\xc6\x80\xc7\x5c\x04\x0f\x77\xc3\x59\xac\xf9\xf9\xc2"
- "\xe7\xeb\x86\xc7\x2d\x4a\x3c\xd6\x92\x93\x2c\xcc\x91\xd3\xc2\x2a"
- "\x94\x16\xbd\xad\x8b\x85\xd7\x61\x3d\xa5\xfc\x15\xe0\x1d\xcc\x0b"
- "\xc2\xc0\x47\xdc\x38\xd8\x76\x4e\x2d\xaf\x3c\x2b\x3f\x6f\xbe\x8c"
- "\x75\x4d\xfc\x23\xad\x41\xc0\x9d\x28\x11\xff\x6c\x01\xf1\x4f\x37"
- "\xde\x8d\xdf\x91\x94\x17\xd8\xcf\xce\xff\x77\x56\x7e\xd7\xa6\x09"
- "\xf5\x5d\xd7\xdd\xe6\xec\x8e\x7b\xdc\xd2\xbd\x29\xd5\xe5\xf9\xef"
- "\x25\x2e\xcf\x75\x49\xf9\xde\xb8\x89\x53\xf0\x6d\xac\x4f\xa5\xfa"
- "\xd7\x95\x0a\xfd\xeb\xb9\x76\x3d\x95\xfb\x4e\xee\x4e\xfd\xfe\xdc"
- "\x7a\xfd\x7e\xa5\x52\xff\x4e\xae\x0d\xd7\x72\x8a\x85\x05\x9e\xf5"
- "\xc6\x75\xfb\x73\xab\xb1\x3e\xde\x88\x39\x39\xb2\x5e\xd3\x83\xf2"
- "\x7b\x3c\xac\x6e\xa7\x87\xbd\x9f\x79\x96\xb9\xa2\x1f\xe8\xc0\x9f"
- "\xdb\x35\x34\x0d\x7f\x73\x45\x8c\x75\x1e\x37\x43\xb4\x91\xce\x62"
- "\xed\x57\x64\x9d\x55\x7a\x50\x99\xe7\xb7\x2a\x74\x5e\x4b\xf5\x87"
- "\xab\x1b\xb5\xe7\x02\x7f\xb8\x7a\x19\x87\xcd\xe7\x13\xf7\xdf\xe1"
- "\x0f\x57\xd5\x21\x90\x3f\x5c\xc8\xae\xf5\xaa\xec\x6a\x57\x7d\x1f"
- "\x45\x91\xbc\x2a\x7c\x1f\x59\xed\xc2\x7f\x91\xd8\x97\xdf\x98\x3a"
- "\x85\xf8\xd0\xce\xa2\x51\x2e\x4d\x2e\x25\xde\xca\xbb\xee\xc1\x70"
- "\xfc\x41\x5e\x4d\xc4\x98\xf9\xab\x45\x4b\xe7\x9b\x0c\x36\xa2\x89"
- "\x97\x67\xfc\xac\x93\xce\x19\xf1\x8c\xbb\xbc\x1b\x1f\x4c\xf7\x6e"
- "\x9c\x5b\x8f\xb4\x3b\xf0\x77\xa7\x77\xa3\x61\x03\xfe\x4a\xf1\x57"
- "\x86\xbf\x72\xfc\x6d\xc7\xdf\x4e\xfc\x55\xe0\x6f\x0f\xfe\x2a\xf1"
- "\xb7\x17\x7f\x76\xfc\x55\x29\x1b\x0d\xbb\xc8\xbf\x1f\xca\xae\xc7"
- "\x38\x30\x69\xe5\xfa\xe9\x9d\x38\x1f\xed\x4f\x26\xbe\x8f\x0f\x39"
- "\xd8\xcc\x31\xdf\xf9\x8e\x5b\x8b\x45\xfd\x09\x97\x77\xdc\x9e\xee"
- "\xba\x26\xcb\xe2\xba\x66\x49\x83\x2b\x3a\x2f\x11\x7f\x49\xf8\x4b"
- "\x76\x6d\x4c\x37\xa2\x3f\x1b\x5c\x43\xd3\xcb\xd1\x0e\xf4\xff\xad"
- "\x7b\xa5\xae\x29\x11\x18\x77\x6b\xa3\xfa\xbb\xc5\xa9\x1b\x23\xf4"
- "\x67\xae\xa1\x33\xd2\x71\xef\x76\xea\x6e\x11\xf9\xda\xe3\xd2\xcd"
- "\xea\xf9\xa4\xfc\xce\xa2\xd1\x46\x67\xf8\xa8\x04\x99\x2f\xd5\x49"
- "\x7b\x47\x48\x8b\xd7\xe6\x60\x50\xbc\x8b\x99\x96\xb4\xf9\x33\xac"
- "\x69\x8b\xe7\xcd\x99\x39\x7b\xf1\xed\xe6\x6b\x67\x99\x13\xe6\x2c"
- "\x5a\x98\xb6\x70\xc9\xec\x25\xb3\x05\xfb\x88\xa4\xeb\x83\xf6\x8e"
- "\x28\xae\x31\xf3\x40\xce\x19\xd2\xcc\x39\xad\xdb\x13\xc0\xa1\xf3"
- "\x1f\x64\xe5\xef\x3d\xe5\xd2\x7b\xc1\xbf\x45\x35\xe7\x63\x5e\x3e"
- "\x6e\xd9\x7b\xca\xad\x8f\x6a\x36\x33\x8e\xb9\x40\xcf\x1c\xcd\xf5"
- "\x2a\x3f\xf7\x31\xab\x21\x7e\x0e\x79\x5e\x5f\xe0\xd6\x4f\xa2\xf7"
- "\x5f\x49\xca\x7f\x03\xbf\xf9\xa6\xc7\x5c\xf4\x1e\x07\x8f\x27\xae"
- "\xe0\xf1\xe4\xfd\x84\xfa\xfd\xe2\x9a\xea\xda\x2f\xf2\x4d\x9c\xf2"
- "\x0e\x5d\xcf\xe5\xf0\x1a\x94\x4b\x7a\x35\xfe\xca\xad\x6c\xbf\x7c"
- "\xc7\x29\xf2\x60\x1e\x36\xe9\x6e\xda\x43\xf9\x84\xcc\x84\x3a\xbe"
- "\x81\x7a\xe4\x2d\x61\xe1\xda\xdc\x26\xb9\xc8\x37\xbf\xb3\x88\xdf"
- "\xbd\xe9\x2a\x9a\xdf\x54\x1f\x8e\xf9\xbc\x1b\xef\xbe\xbe\x40\xca"
- "\x91\x90\x1d\xc3\x48\x66\x24\x0c\x21\xec\x70\xe4\xd4\x8b\xf7\x2b"
- "\x94\x7a\xc8\x9c\x61\xf4\xee\x93\xf4\xac\x0c\x3c\x6a\x99\x90\x49"
- "\x6e\xf2\xc5\x3f\x5b\x1d\x27\x7d\x1f\x45\xa5\x33\x3a\xa3\x3d\xe2"
- "\x94\x6e\xf4\x42\xa2\x1f\xd1\x8b\xf6\x6a\x79\xd1\xe8\xc4\xb2\x18"
- "\x16\xbe\x25\x86\x45\x7a\x86\x2e\xa9\x96\xfa\xfa\x9b\x1a\x34\xde"
- "\xba\x23\x76\x49\xd0\xd9\x1c\xd9\x5f\xe6\xd9\x0b\x68\xd7\x61\x96"
- "\xd8\xde\x9b\xb1\x78\xf1\x92\xf9\xb3\xcd\xb3\x67\xcc\xcc\x30\x8b"
- "\xc7\xe6\x25\x8b\x91\x65\x4e\xe6\x62\xf3\xb3\x4b\x17\x98\xe7\x2f"
- "\x9e\x43\x52\xc2\xec\x45\x8b\x96\x58\x32\x07\x32\xf9\xa6\x79\xfe"
- "\x92\x79\x99\x73\x2c\xf8\xb1\x78\xf6\x82\x59\x66\xd1\xeb\x8b\x51"
- "\xd4\xbc\x79\x66\xf5\x0b\x8b\x33\x66\x2c\xa2\x81\xb0\xe0\x97\xc8"
- "\x14\xf0\x7e\xb0\x0c\x11\x45\xbe\xa5\x68\xdd\x39\xa5\x1b\x73\x5b"
- "\x55\x38\x68\xbd\x61\x49\x35\xd9\x17\xe0\x3e\x49\xc8\x95\x45\x37"
- "\xd1\xde\x0b\x7b\x01\x6d\x6c\xbf\xf6\x76\x8c\xdd\x9b\xf7\x68\x6d"
- "\x23\x5f\xee\xc2\x97\x21\xf9\xc9\xd4\x8d\xb9\x56\x9c\x9b\xc3\x7c"
- "\x10\xf6\x27\x45\x37\x75\x4b\x5a\xdc\xdc\x1c\xe8\x07\x5b\xf8\x54"
- "\xd4\xdd\xec\x95\xfb\x18\x63\x92\x88\x37\x52\x7d\xcf\xeb\x78\xd1"
- "\xcd\xd7\xd3\x3b\xca\xc6\xb9\x0d\x9d\x45\x63\x86\xfb\xe5\x93\x9b"
- "\x85\xff\x6c\x91\xaf\xe8\xe6\xfb\xf8\xd0\x74\x23\xd2\x1a\xa8\x5e"
- "\xbd\xac\x31\xe6\x73\x28\xf7\x50\x05\x63\x3f\x89\x65\x09\xe7\xd6"
- "\x4f\xaa\xe8\x8c\x79\x30\xb2\xab\x90\xf5\xef\xc2\xba\xe6\xd6\xb3"
- "\x11\xe7\x31\x2e\x96\x8d\x66\x61\x2b\x26\x32\x7d\xc5\xdc\x0a\xf2"
- "\xc5\xca\x6a\xc6\x95\x32\x47\xba\x93\x39\xdc\xbb\x58\x8d\xbd\x89"
- "\xd5\x7a\x7e\x2b\xe3\x24\x64\x93\x7c\x71\xcb\x16\xf2\x0f\x95\xb7"
- "\x82\x7b\xdf\x78\xdb\xd5\xef\xf5\xd6\x0a\x8a\x6f\x30\xc2\xe1\xf9"
- "\xdc\xee\xc8\xd9\xce\x1c\x56\x87\x9d\xce\xcd\x83\x6e\xcf\xef\xc7"
- "\xb3\x01\x35\x78\x6f\x12\xeb\x8f\xfb\x15\xf4\x8d\xe2\x4d\xbc\xe1"
- "\xf9\x38\xde\xf8\xfc\x26\xee\xc4\x98\xa2\x78\x05\x2d\x6b\xe2\x78"
- "\xdb\x1a\xd5\x07\x1c\x8d\x53\x4b\x16\x33\xb5\xea\x6e\x89\x15\x3a"
- "\x8e\xb1\xe2\xfe\x0a\xdc\x0b\x1b\x0d\x87\x75\x13\xdd\x0f\xc3\xfd"
- "\x18\x79\xbf\x95\xee\xaf\xc4\xfd\x58\x79\xff\x01\xdd\x0f\xc7\xfd"
- "\x54\x79\x5f\xc7\xc4\x19\x72\xdd\x2d\xb3\xe4\xfd\xdf\xe8\x1e\xb4"
- "\xbf\x25\xd3\x9e\x45\xf5\x3d\x8a\x3e\xbb\xa5\x20\xef\x33\xc8\xa9"
- "\xd6\xe3\x62\x3e\xbc\x93\x9b\x41\x3a\x18\xcc\x87\x5b\xfa\x0d\x6a"
- "\x24\x19\xf7\x96\xed\x11\x89\x74\x1d\xb3\xd3\xe0\x66\xfd\xc1\x33"
- "\x0e\x42\x7b\x96\x10\xed\x42\xf2\x30\xaf\xdf\xfe\xc6\x64\x0f\xb7"
- "\xf3\x1d\x49\x56\xbe\xf1\x71\x17\xdf\x71\x9b\x9d\x8b\x75\xee\xfe"
- "\x8a\x8a\x6c\xb7\xf0\x87\x0b\x3e\x1d\x73\xe8\x16\x71\x56\xc8\x05"
- "\xbe\xb7\x17\xff\x98\x46\xbe\xf1\x41\x17\xe4\xc9\x8c\x89\x09\x1e"
- "\xb2\x15\x04\xaf\xff\xd3\x25\xef\x67\x10\xdf\x30\x63\xa6\xb2\xfd"
- "\x36\xbb\x92\x97\xca\x78\x7c\x92\x75\x62\x06\xb7\x63\x0d\xd3\x49"
- "\x5d\x37\xff\x1c\xdf\xff\x5c\x7c\xf7\xda\x24\xab\xb2\x34\x83\xe2"
- "\x33\x09\x7c\xc9\xa5\xf5\x3c\x0b\x78\xb2\x3c\xd5\xe0\xdd\x38\x23"
- "\xfd\xfd\x8c\x63\x7d\x8b\x75\xa6\xfb\x69\x66\xaf\x36\x49\xa8\x93"
- "\x97\xa7\x32\x0f\xbe\xe3\x41\x5b\x89\x77\x78\x5d\xa9\xd6\x83\x87"
- "\xb1\xee\x7e\xaa\xa1\x1f\x5f\x9a\x6a\x40\x9b\x46\x3b\x12\xce\xb2"
- "\xba\x2e\x9a\x2b\xb7\x8e\x79\xdf\xca\xd8\xbd\x56\x8f\xdd\xe0\x12"
- "\x76\x6b\x46\xcb\x5c\x76\x35\x1f\xfa\xa0\xab\x55\x77\xeb\xaa\x49"
- "\x39\x68\x03\xda\xbe\xbf\xa9\x21\x5c\x41\x3b\x46\x49\xba\xd1\x7b"
- "\x19\xa0\x6d\x86\x26\xdf\xf4\xad\xfe\xb7\x8a\x71\xa3\x2c\x4e\x65"
- "\x74\x9e\xef\x0d\xf0\x2b\x4a\x77\xaa\x41\xc1\x7a\x44\xcf\xde\x4f"
- "\x38\xc9\xe8\x9b\x92\xd6\xb7\x4a\x5b\xcd\x78\xd0\x19\xdf\x27\xff"
- "\xc1\x1a\x5d\x91\x37\xc3\xdb\x9d\x11\xba\xff\x37\xcd\x48\x44\xfd"
- "\xd2\xf9\x46\x43\x7e\xe8\xe7\x86\x34\x39\x3e\x6e\x2d\xc5\xdf\x4e"
- "\xfe\xf2\x12\xa7\xeb\xda\x5b\x2b\x45\xfc\xcc\x4d\xa9\xe9\x9a\xae"
- "\x08\xf3\x0d\x63\x24\xa9\x5f\x45\x6e\x4b\x68\xff\xa9\xb6\x1d\x95"
- "\x22\x6e\x59\xbf\xcf\xb9\xc1\x4b\xf1\x78\xcf\x92\x2f\xea\xca\xf7"
- "\x13\x3a\xfa\xd8\xa7\x49\xe3\x7a\xeb\x53\x2a\xff\xde\xeb\x79\x77"
- "\x1f\xcb\x2b\xed\x75\x8c\x6c\x07\x5d\x62\x0d\xf9\x5d\x7c\xac\x4e"
- "\xca\x20\xb7\xdf\x49\xb4\xf2\x60\x1d\xc9\xfe\x84\xe9\xdd\x58\x2f"
- "\x7f\xfb\x68\xb1\x7e\x24\xd6\x19\x2f\x78\x81\x0f\xeb\xab\xd8\xe4"
- "\x09\x2c\xaf\x36\xe3\x0c\xd3\xe2\x91\xf1\xb8\xc7\x5c\xaf\x3e\xea"
- "\xd2\xd3\x7e\x13\xc5\x1f\x13\xf2\xfa\xa6\xb4\xc4\xd7\xfe\x86\x35"
- "\x13\x7c\xc4\xee\xbf\xb9\xf4\x9e\xf6\x54\xb3\xf0\x85\x0d\x39\x22"
- "\x2f\x83\x2b\xbe\x3d\x28\x8a\x97\x60\x4b\xc9\xa7\xf8\xce\x87\xa6"
- "\xd4\x8b\x33\xd6\x87\x52\xab\xd8\xa1\xc6\x52\x56\xd3\xfc\x19\x9d"
- "\x0b\x7c\xf9\x50\xaa\x8d\xf8\xc9\x21\x1e\xf0\x8c\x9b\xc1\x33\x62"
- "\xbe\x0e\x50\x8c\x3b\x2a\xb5\x7d\x28\xda\x93\xd2\xf8\x45\x0f\xe6"
- "\x68\x99\x1a\x93\xcc\x53\x94\x34\xb2\x4c\xdd\x93\xa2\x58\x65\x2f"
- "\x65\xb1\xf8\x97\xf4\x4a\x6a\xa8\x3d\xa8\x21\x0b\x85\x0f\x16\x93"
- "\x12\xbd\xa3\x52\x8b\x59\x36\x69\xa1\x99\xfd\x19\x6d\x7f\x3f\xa1"
- "\xaf\x73\xf2\x76\xb1\x27\xeb\xc1\xb8\xf3\x60\xcc\x79\x40\x4f\xf4"
- "\x81\x1b\xfd\x16\x52\x16\xd3\xfa\xa0\x3b\x4f\xeb\x83\xff\xaa\x15"
- "\x7d\x00\x19\x6e\xf9\x63\x6a\x1f\x7c\x8a\x3e\x68\x46\x1f\x14\xb2"
- "\xfc\x83\x53\x6b\xd8\xe4\x29\xe8\x83\xb6\x33\xe4\x47\x5d\xc6\x84"
- "\xcb\x94\xb4\x17\x7d\xf1\xa9\x4b\x5f\xd7\x21\xfb\x60\xd7\xe3\xb2"
- "\x0f\x5e\x7f\xdc\x05\x3e\xe6\xd6\xfa\x57\x71\xef\x5d\x9a\x6a\xa6"
- "\x18\x39\xbc\x30\x9d\xe2\x57\xcb\xbe\xe8\x46\x5f\x74\xcb\xbe\xc8"
- "\x5d\x88\xbe\x38\xdc\x20\x7c\xb1\x1c\x6a\xac\x61\x35\xe9\xe5\xac"
- "\x16\xb8\x84\xbe\x98\x41\xfd\x42\xfa\x05\xef\xf2\x84\x98\x17\xb3"
- "\x59\x6c\x59\x36\x33\x69\xfd\xa1\x74\xa3\x3f\xb2\xd1\x1f\x5d\xe8"
- "\x0f\xb7\xaf\x3f\x62\x45\x7f\x9c\x54\xfb\xa3\x8b\x6c\xd9\xd0\x1f"
- "\x5d\xe8\x8f\x2e\xf4\x47\xa1\xec\x0f\xc2\xf9\x49\x1d\x06\xae\xfc"
- "\x33\x81\x6d\x6d\x0d\xd1\x1f\xcb\xd5\xfe\xf8\xf4\xdb\xf4\xc7\x7f"
- "\x95\x5e\xd8\x1f\xb7\xe7\x5c\xaa\x3f\xfc\x73\xe2\xce\x85\xd4\x1f"
- "\xdd\xe5\xea\x9c\xb8\x8e\xe6\x44\xbe\xfe\x27\x58\x8b\x88\xa6\x1f"
- "\xd6\xef\x15\x73\x02\x6d\xcd\x7f\xf5\x51\xb7\xbe\xa6\x19\xfd\x32"
- "\x8b\x7b\x85\x3c\xac\xf6\x8b\xec\x8f\xc7\x5c\x3b\xff\x26\xe9\x6f"
- "\x7e\x80\xd6\x0c\x9a\x1b\xd4\x3f\xe8\x27\xcc\x9f\x50\xf1\xfc\x02"
- "\xf7\x6a\x51\xa6\x42\xf3\x84\xe6\x08\xcd\x87\xda\x8c\xcf\x44\x7c"
- "\xf4\x43\x53\xaa\x19\xed\xd9\x1e\x4a\xdd\x8b\xbe\x2a\x65\xde\xa5"
- "\xe8\x9b\x2c\xcc\x13\x1d\xbb\x86\xe2\xfa\x1d\x4a\x2d\x26\x7e\xc1"
- "\x88\x31\x3f\xc0\x8b\x7e\xf2\x76\x9a\x06\xae\x86\x8c\xb5\x2d\xcb"
- "\x3f\x6f\xb6\xaa\x31\x8c\x79\x44\x12\xa5\x87\x7b\xd0\x47\x98\x3b"
- "\x41\x73\xc6\x17\xdb\xf8\xcb\x04\xb6\xa5\x89\x45\x0e\x9e\x23\xfb"
- "\xc8\x1b\x30\x67\x26\xce\xa1\x39\x93\x8f\x3e\xfa\xa4\x8f\x7d\x74"
- "\xa7\x3c\x8b\x1f\x07\xac\x1e\x6a\xc8\xc7\x3a\x89\x3e\xba\x23\xaa"
- "\xb7\x3e\xf2\x6e\xbf\xb5\xd4\x6b\x7c\x80\xe2\xf5\x8e\x50\x9e\x9d"
- "\xaa\x53\x20\x3f\x75\x41\x6e\x3d\xe4\xf2\xb0\x9c\x27\x99\x3e\xfb"
- "\x33\x16\xe1\x98\xfa\x31\x73\x38\x2b\x19\xf9\x46\x26\xbd\x37\xc5"
- "\x48\x70\x78\x2a\x81\x57\xcf\x4c\xa1\xfb\x2d\xe2\xde\xc5\x96\x3f"
- "\xc9\xc2\x44\xbc\xcf\xd4\x72\xb6\x1a\xe3\x73\xf7\xe3\xe5\x7a\x65"
- "\xc3\x04\x8a\x73\x40\xf6\x0b\x76\x3a\xa7\x94\xb7\x8c\x45\xd5\x66"
- "\xd4\x90\x7f\xb8\xcf\xc9\xdf\x6f\x5d\x07\xca\x74\xf1\x2e\x2f\xd6"
- "\x8c\xad\x85\xbc\x92\xfc\xdd\x8f\xa2\x35\x82\x7c\x57\xe8\x7e\x36"
- "\x91\x78\x11\xd2\xff\xd9\x73\x5f\x02\xef\xf5\x33\x71\x1e\x0a\x69"
- "\xba\xda\xb9\x64\x4f\x71\xf7\xbb\x54\x2f\xa9\x8b\x97\xd7\x51\x14"
- "\x17\x31\xee\x99\x17\xf6\xe5\xba\xc2\x6d\x90\x87\xc1\xa3\x51\x39"
- "\x5b\xb8\x94\x0d\xab\x1d\x87\xdd\x42\x0f\xeb\xca\xcb\x88\xb0\x65"
- "\x93\x6f\x5d\xf2\x9d\x4f\x6b\xf6\xdd\x0b\x29\x66\x31\xdf\x8e\xf5"
- "\x2a\x2e\x35\xbd\xe2\x29\x97\xde\xbf\x2e\xff\xac\x1a\xeb\x59\xe5"
- "\xbd\x09\x3c\x8f\x62\x0c\xec\x47\xbb\x48\x0e\xfa\x6d\x93\x5b\x60"
- "\xca\x6b\x4f\x15\xeb\x49\x4f\xe4\x06\x3e\xd4\xfc\xed\xf7\x22\x06"
- "\xeb\x71\xdd\x5d\x47\x0e\xa6\x7a\x18\x7d\xff\x91\xeb\x69\xaf\xe5"
- "\xae\xa8\xf3\xfa\xf7\x3c\xe7\x23\x92\x8a\xf3\x9a\xfd\xf1\x27\x03"
- "\xe3\x4c\x12\xce\xec\x7e\x0a\x65\x12\xce\x34\xe5\xeb\x25\xb6\x24"
- "\x93\xae\x32\xb2\x27\xb6\xd4\xb6\x9d\x64\xb9\x18\xc7\xb5\x19\xe5"
- "\x22\x0e\xc4\x10\xe0\xbb\xb2\x1c\x78\xd2\x9d\x10\xb3\x05\x78\x42"
- "\x38\xb0\x15\xf8\xa1\x2c\x37\x0d\x2c\xe9\x62\x23\x35\x1c\x21\xde"
- "\x8b\xae\x4f\x62\x8c\x1a\xaa\x91\x86\x7e\x52\x80\xeb\xc0\x93\x84"
- "\xcd\xd9\x2c\x7e\x33\xc6\xe8\x16\xc2\x11\xf0\xc5\x93\x2c\xc0\x91"
- "\xa5\xc0\x91\x2c\x11\x07\xd8\xb4\x55\x2f\xf1\xe3\xed\xa6\x62\xbd"
- "\x4d\x8b\x03\x2e\xe8\x9b\x3c\xbf\x8e\xc6\x47\x7a\xbe\x38\x87\xe6"
- "\xa5\xf5\x69\x79\x6a\x58\x5d\x07\xc6\xc8\xa6\x67\x92\x29\x4d\xcc"
- "\xdb\xa5\x19\x03\x15\x39\xd6\x92\x89\x26\xdb\x4e\xb1\x44\x11\x2b"
- "\xf3\x6b\xd3\xc0\xb5\x0b\xd8\xc8\xad\xa7\x58\xfc\xd6\x05\x2c\x01"
- "\xf3\x55\xbf\x15\x75\x98\xbe\xd0\xc8\x44\xbc\x85\x88\x24\x1b\xd2"
- "\x43\xc6\x5b\x00\x5f\x6d\xda\x4a\x73\xe6\xd9\x04\x5f\x9d\x3c\xb6"
- "\x82\x29\x5e\xd0\x4e\xf8\x47\xd2\x25\xbf\x2f\x6d\xa0\x6f\xb6\x4a"
- "\x3e\x3f\xd9\x2d\xed\x90\x92\x72\x20\xab\xf4\x6f\xd5\x25\xef\xe6"
- "\xeb\x93\x2d\x96\x6c\xa6\x6b\xd5\x9e\x81\xf7\x54\xd0\x57\x37\xe6"
- "\xb3\x7c\x25\xfa\xb5\x9d\x0e\x2b\x78\x27\xf2\x87\xdc\xa7\x79\x98"
- "\x5c\x45\x65\x79\x6d\x05\x53\xa9\xbd\xca\xfa\x82\x69\xdb\x5a\x59"
- "\x22\x7f\x06\xfd\x31\x17\x6d\x6d\x65\xf1\x65\xad\x68\xeb\x52\xd9"
- "\x56\x2d\xee\xb9\x52\x78\x20\x1c\xcf\x2e\x1a\xab\xc8\xf5\x0c\xc5"
- "\x2a\x4a\x1c\x07\x0c\xbb\x8c\xff\x80\xb1\xda\x36\xe1\x9b\xa2\xd3"
- "\xe1\xf9\x8c\xd1\x77\x49\x77\xe4\x38\x23\xc6\xf4\xcb\x34\x96\x95"
- "\xf2\x25\xce\xb4\x46\x8c\xed\xce\x0c\xc6\xf1\x7b\x7f\x93\x8b\x7c"
- "\x41\x08\x9e\xcf\xa9\xfb\x59\x3d\xf1\x69\xef\x20\x8d\xc6\x7e\xc0"
- "\x98\xaf\xa7\x31\x4f\xcf\xc5\xb8\xc7\x7b\x8e\xc6\x63\x8c\xca\x0b"
- "\x2c\x87\xfa\x5f\x2b\xeb\xb8\xee\x9e\xe7\xa8\x2c\x1a\x0b\xa4\xe3"
- "\xa1\xb9\x26\xfb\xbe\x92\x6c\xc0\x4d\x3c\x6e\x62\xbd\xbc\x77\x91"
- "\x8f\x11\x23\x8d\x01\x31\x56\x80\xdf\xe4\xbb\x94\xf3\xd4\x30\x8c"
- "\x33\xaa\xe7\x40\xf4\x77\xa2\x36\x2e\x90\x16\xdb\x73\x6c\x0c\x29"
- "\x30\x92\x4c\x13\x4b\xbf\xbf\xe9\xf8\xe8\x5b\xff\xdd\xd3\xeb\x19"
- "\x05\x25\xfe\x56\x11\xff\x82\x70\xd3\xdb\x1e\x80\x99\x6d\x12\x33"
- "\x09\x93\x34\xdc\x14\xd8\x24\xfc\xe5\x57\x92\x2d\x6c\x86\xa8\x63"
- "\x1f\x71\xb3\xb6\xcd\x8f\x9b\x93\x2c\x01\xb8\xd9\xc6\xbb\x94\x6b"
- "\x43\xe1\x66\xca\x73\xc1\xb8\x99\xf2\x7c\x30\x6e\xde\x77\xb2\x27"
- "\x6e\x5e\x88\x99\x29\x1f\x86\xc2\x4b\xc8\x31\x23\x5a\x75\xf7\x95"
- "\xf5\x8e\x95\x29\x1d\x7d\xc7\xca\x7b\xfb\x05\x63\xe5\xd8\xa4\xff"
- "\xff\x62\xe5\xbd\x2f\x06\x61\xa5\xf1\x1b\x62\x65\xab\xc0\xca\x58"
- "\xfe\x4f\xcc\x09\x15\x3f\xb6\xce\xed\x05\x2b\xe7\x5e\x62\x2e\x3c"
- "\xd3\x1b\x56\xde\x7b\x3a\x18\x2b\xef\x8b\x0f\xc6\xca\x7b\x8f\xf8"
- "\xb1\x52\x7d\xf6\x9d\x60\xe5\xbd\xae\xef\x07\x2b\xef\x75\x09\xac"
- "\x3c\x45\x58\x79\x5f\xed\xa5\xb1\x32\xc5\x13\x1a\x2b\x91\x2e\xb0"
- "\x32\xc5\xe3\xc7\xca\xcf\x2e\x81\x95\xf7\xff\xae\x0f\x58\x19\x2b"
- "\xb0\xd2\xd8\x0b\x56\xce\x05\xad\xd4\x71\x21\xc6\x5e\x8f\xb1\xa1"
- "\x62\xa5\xc9\x87\x95\xdf\x60\x7c\xf4\xad\xff\xee\xaf\xb8\x18\x56"
- "\x2a\x36\xc9\x5f\x12\x56\xf2\x38\x15\x2b\xe7\x79\x58\xf6\x11\x60"
- "\xe4\xe1\x56\x11\x57\x43\xd8\xed\xe2\x2f\xe7\x31\xc2\xa2\xc7\x2c"
- "\xaf\x83\x5e\x0e\x67\x85\xc0\x26\x71\xf6\x6a\x02\x61\x55\x05\xf2"
- "\x96\xfa\xf8\x4e\x81\x9d\x47\x54\xec\x9c\xa6\x62\xe7\xf4\x7f\x01"
- "\x3b\x1f\xa7\xbe\x1c\xf7\xee\x79\xbd\x86\x9d\xeb\x81\x9d\xe3\x04"
- "\xff\x40\xfb\xba\x12\x3b\x27\xdc\xa9\xd5\x8b\x74\x9a\x8e\xcc\x97"
- "\x98\xac\xd7\x99\x0b\x71\xf4\x01\x2a\x6f\xfc\x50\xfb\xdc\x36\xe6"
- "\xc3\xd2\x69\x7e\x2c\x3d\xae\x7b\xf0\x64\xef\x38\x3a\xfe\x0e\x1f"
- "\x8e\x16\x02\x47\x8f\x06\xe0\x28\xe4\xa6\xd7\x08\xf3\x80\xa3\x9d"
- "\x02\x47\xdf\x56\x71\xf4\x81\x89\x07\xa7\x01\x47\x1f\xd0\x70\x74"
- "\x7c\xbe\xbb\xf0\x3d\x8f\xbb\xe8\xd2\x38\xda\x29\x70\xd4\xf2\x7f"
- "\x1f\x47\xab\x7a\xe0\x28\x64\x57\x8a\x7d\x1e\x12\x47\xb5\xf1\x28"
- "\x70\x34\xdf\x8f\xa3\x82\xae\x0f\x9c\xa8\x4b\x07\xdd\xd3\x2d\x42"
- "\x76\xf3\xe1\xa8\xa5\x42\xe2\x28\xd2\x84\xfe\x64\x31\x70\x14\xe3"
- "\x2f\xaf\x96\x7c\x5c\xb1\x64\xd4\xd1\x48\xf8\xba\x0d\x73\x86\x68"
- "\xe4\xc3\xd3\xb9\x98\x33\x84\x31\xed\x98\x33\xc0\xd1\xe9\x67\x8d"
- "\x4c\xcc\x97\x22\xcc\x97\xd6\x5e\x62\x7d\x69\xf6\xb6\xbd\xe2\xe9"
- "\x83\x77\x07\xe3\xe9\x83\x99\xc1\x78\xfa\xe0\xf5\x7e\x3c\x55\x9f"
- "\x11\x9e\xa2\xcf\x40\x9f\x9d\x84\xa9\xdf\x0e\x4f\x1f\x4c\xf6\xe1"
- "\xa9\x5e\xc5\xd3\xb9\x97\xc6\x53\xb1\x2f\xd8\x0b\x9e\x06\x62\x43"
- "\xef\x78\xfa\x60\xb2\x1f\x4f\x27\x5c\xe5\xc3\xd3\x86\xde\xf0\x74"
- "\xfc\xd8\xd0\x78\x8a\x74\x81\xa7\xe3\xc7\xfa\xf0\xb4\x21\x04\x9e"
- "\x3e\x10\x88\xa7\x13\x07\x4b\x3c\xad\x90\xbe\x30\x80\xa9\x75\x1d"
- "\x18\x1f\x34\xe7\x32\x4b\x05\xa6\x2a\xc0\x54\x8a\x7f\x4a\xf1\x5f"
- "\xc8\x5e\x3e\x14\xa6\x4a\xcc\x75\x32\xc2\x55\x9a\x9b\x79\x13\x21"
- "\xef\x62\x2d\x02\x4d\xc4\xda\xab\xd1\x6f\x5b\x00\xbe\xa6\x2d\x33"
- "\x12\x6f\x17\x34\x56\x14\x6d\xac\xb4\x27\x90\x1d\x70\xd0\x58\xe9"
- "\x5b\x5f\x4e\x8c\xea\x0d\x5b\x7b\x93\xdd\x0f\x92\xec\xfe\x08\xd3"
- "\x2f\x7f\x04\xf8\x9a\x4a\xb2\xfb\xce\x1e\xb2\xfb\xce\x0b\x65\xf7"
- "\x4f\x2e\x8e\xa3\x7d\x92\xdd\x1f\xa5\x3e\x9c\x34\x20\x18\x47\x27"
- "\x0d\x0e\xc6\xd1\x87\x9e\xa7\x7a\x49\x1c\xdf\x19\x5a\x76\x17\xf3"
- "\x7c\xd2\x63\x3e\xd9\xbd\x21\x18\x3f\xfd\xb2\xfb\x43\xb7\xf5\x8e"
- "\xa3\x93\x56\x05\xf1\xa3\xd3\x55\x1c\x7d\x4a\xc5\xd1\xa7\xfc\x38"
- "\x7a\xe8\x63\x8d\x1f\x9d\xfc\xf2\x87\x0d\x81\x38\x3a\xa9\xda\x87"
- "\xa3\x8d\x17\xe2\xa8\x86\xa1\x84\xa7\x54\x0e\xe9\xb2\x76\x01\xa7"
- "\xdf\x78\xca\xa2\x97\xba\xda\x74\xa2\x5d\x64\x4f\x5d\x6d\x6d\xdb"
- "\x59\x96\x3b\x8d\xf0\xb4\x54\xe0\xa9\x41\xc7\x66\x00\xfb\x86\xd0"
- "\x99\x81\x32\xda\xd3\xcf\x92\xf1\x93\x48\xbf\xa4\x2c\x95\xb1\x08"
- "\x35\x3d\x13\xda\x2b\xf6\xf2\x9f\xfc\x4c\xc5\x54\x8a\x31\x8e\x31"
- "\xb7\xf9\x1c\x30\x35\x2b\x04\x6f\xba\x1c\x98\x9a\x1d\xc0\x9b\x62"
- "\xee\xbf\xfd\x54\x4f\x4c\x9d\x72\x4b\x1d\x8d\x15\xc2\xd4\x20\x39"
- "\x7e\xe7\x7f\x80\x1c\x3f\x65\x4d\x30\x96\x4e\xb1\x07\x63\xe9\x94"
- "\x25\x7e\x2c\x55\x9f\x7d\x27\xbc\xe9\x94\xd5\xdf\x0f\x6f\x3a\x65"
- "\xb5\x5f\x8e\x7f\x68\x8e\x0f\x4b\x0f\xf7\x86\xa5\x93\x56\x87\xc6"
- "\x52\xa4\x0b\x2c\x9d\xb4\xda\x87\xa5\x87\x43\xc8\xf1\x41\x58\xfa"
- "\xf0\x44\x89\xa5\x3b\x25\x6f\xda\xa0\xf1\xa6\x3b\xff\x3f\x28\xc7"
- "\x3f\xdc\xab\xff\x9f\xde\xe4\xf8\x83\x6d\x12\x3f\x09\x9f\x34\x0c"
- "\xf5\xcb\xf1\x3b\x7b\x97\xe3\x2f\x81\xa1\x7d\xe2\x45\x05\x86\xfe"
- "\x7c\x62\x30\x86\xfe\xfc\xa1\x60\x0c\x7d\xf4\xdd\x9e\x18\x7a\x21"
- "\x7e\xfe\x7c\x5d\x28\xec\x94\x72\xfc\xa3\x96\xde\x71\xf3\xe7\x7b"
- "\xfb\x8e\x9b\x53\x8f\x04\xe3\xe6\x54\xf6\xbf\x03\x37\x1f\x99\x1f"
- "\x84\x9b\xc6\x6f\x88\x9b\xff\x16\x99\xfe\x91\x1e\xfa\xcf\x47\x7a"
- "\xe8\x3f\x1f\x09\xd0\x7f\x3e\xf2\x1d\xea\x3f\x1f\xf9\x9e\xf4\x9f"
- "\x8f\x54\xf9\x79\xd0\x47\x5f\xbe\x34\x6e\xfe\xbc\x2a\x34\x6e\x22"
- "\x5d\xe0\xe6\xcf\xab\xfc\xb8\x79\x29\x1e\xf4\x17\xcf\xf5\x01\x37"
- "\xff\xc3\x65\xfa\x5f\x5c\x54\xff\x19\x4a\xa6\x27\xdc\x14\x78\xd9"
- "\xd0\x43\xa6\x7f\x24\x50\xa6\xdf\xe9\x97\xe9\xc7\x49\xdc\x72\x78"
- "\x6c\xc1\x32\xfd\x77\x8e\xa3\xa9\x1b\xdd\x3e\x7d\xe8\xaf\x80\xa3"
- "\xa9\x2f\x52\xdb\xdc\x3e\x7d\xe8\xb4\xab\xb4\x7a\x49\x99\x7e\x3d"
- "\x93\xf5\x0a\x21\xd3\x0b\xdb\xe1\xd4\x13\x3e\x99\xbe\xa1\xa7\x4c"
- "\xff\x44\x6d\xef\x98\xfa\x98\x31\xa4\x4c\x4f\xf2\xb7\xc0\x54\x8b"
- "\xc0\xd4\x73\x9b\x02\x31\xf5\xf1\x1b\x04\xa6\xde\xa7\x61\xea\x63"
- "\x53\xdd\x98\x9b\xee\x88\x4b\x63\x2a\x95\xe3\xc7\xd4\x8c\x7f\x0f"
- "\xa6\xda\xbf\x39\xa6\x06\x9e\x57\x7d\x1b\x6d\xf7\x61\xaa\xa0\xf1"
- "\xe3\x1f\xd6\xa5\x13\xa6\x66\xf4\x90\xef\x77\x86\x96\xef\x3f\x64"
- "\x7a\xa2\x8f\x26\xdf\x53\x1f\x08\xbc\xf9\xbf\x2a\xdf\x3f\x71\x4d"
- "\x30\xb6\x3e\x31\x35\x18\x5b\x9f\x18\xe0\xc7\x56\xf5\xd9\x77\x22"
- "\xdf\x3f\x61\xfe\x7e\xe4\xfb\x27\xcc\x7e\x6c\x7d\xc2\x7b\x69\x6c"
- "\x7d\xcc\x14\x1a\x5b\x91\x2e\xb0\xf5\x31\xd3\x45\xb1\xf5\xbe\x40"
- "\x6c\x9d\x76\x52\xc3\x56\xbf\x7c\x8f\xf1\x41\xf3\x2f\xd3\xf6\xed"
- "\xe5\xfb\xf1\xdf\xb7\x7c\x3f\xad\xad\x4f\xf2\xfd\x26\xe0\x2c\x64"
- "\xf1\xe5\x1f\x41\xbe\x7f\x48\x95\xef\x1b\xcb\x7b\xc8\xf7\xe5\x17"
- "\xc8\xf7\x39\x0f\xa9\x98\x8a\x39\x25\x30\xf5\xa9\x9d\xdf\x5e\xbe"
- "\x7f\x98\xfa\xf0\xc9\x13\xc1\x98\xfa\xe4\xc9\x60\x4c\x9d\xb1\x82"
- "\xea\x25\x31\xbd\x3c\xb4\x7c\x2f\xe6\xf9\xf4\xdb\x82\xe4\x7b\xd4"
- "\xef\x42\xf9\x7e\xc6\x0d\x41\x98\x3a\x3d\x10\x53\xa7\xcf\x0a\xe2"
- "\x53\xd1\x2e\xc2\xd4\x57\x8f\x4a\x4c\xfd\xed\xd1\x00\x4c\x9d\xf4"
- "\x5b\x15\x53\xd3\x36\x7e\x38\x35\x10\x53\xa7\xef\xd4\x30\x55\xe0"
- "\xe5\x74\xb7\x3e\x2f\xf5\x42\xbb\x13\x61\xef\x43\xb6\x40\x28\x9b"
- "\xce\x8a\x51\x99\xbb\x8f\x66\x5c\xda\xde\x24\x35\xb4\xbd\x89\x23"
- "\xd3\xc9\x6a\x9a\x6d\xc2\xce\xa4\x8c\xec\x4c\x0a\xd8\x35\x65\x5d"
- "\xd2\x4f\x80\xf0\x67\xd8\x8b\x8f\x80\x27\x1f\xf3\xe3\x2c\xd9\x64"
- "\x6d\x26\x9b\xac\x73\xd2\x06\x08\xfd\x7d\xa1\x5f\x00\x8d\x6f\x02"
- "\x1e\xbc\x75\xb4\x27\xce\xa6\x5f\x5f\x47\xe3\x67\x5a\x46\x0f\x99"
- "\xbf\xfc\x3f\x40\xe6\x4f\x2f\x08\xc6\xd7\xf4\x3d\xc1\xf8\x9a\x3e"
- "\xc7\x8f\xaf\xea\xb3\xef\x84\x77\x4d\xcf\xff\x7e\x78\xd7\xf4\x7c"
- "\xbf\xcc\x3f\xe3\x49\x1f\xbe\xd6\x07\xe0\xeb\xd1\x40\x7c\x9d\x3e"
- "\x4f\xe0\xeb\xd1\x9e\xf8\x8a\x74\x81\xaf\xd3\xe7\xf9\xf0\xb5\xbe"
- "\x87\xcc\x7f\xb4\x27\xbe\x3e\x75\xb7\xc0\xd7\xc6\xf2\x1e\xbc\x6b"
- "\xf9\xa5\x65\xfe\xc6\xff\x34\x99\xff\xa9\xe4\x3e\xc9\xfc\x84\xa9"
- "\xf3\x24\xa6\x12\x66\x69\xb8\xea\x97\xf9\xcb\x7b\x95\xf9\x2f\x85"
- "\xab\x7d\xe2\x55\x05\xae\xce\xbc\x3b\x18\x57\x67\xde\x1b\x8c\xab"
- "\x4f\x7f\xd8\x13\x57\x2f\xc4\xd4\x99\xcf\x85\xc2\x53\x29\xf3\x3f"
- "\x6d\xed\x1d\x4b\x67\x56\xf4\x1d\x4b\x67\x7d\x11\x8c\xa5\x33\x3b"
- "\xfe\xf7\x62\xe9\xec\x25\x41\x58\x6a\xfc\x86\x58\xfa\x6f\xd1\x03"
- "\xcc\xae\x0d\xc6\x52\x24\x06\x61\xe9\xec\x37\xfd\x58\xaa\x3e\xfb"
- "\x4e\xb0\x74\x76\xcd\xf7\x83\xa5\xb3\x6b\xfc\xbc\xea\xd3\xaf\x5e"
- "\x1a\x4b\x67\x56\x86\xc6\x52\xa4\x0b\x2c\x9d\x59\xe9\xc7\xd2\xcf"
- "\x2e\x81\xa5\xbf\x5c\xd3\x07\x2c\x0d\xd6\x03\xf4\xc4\xd2\xef\x5d"
- "\x0f\xf0\xcb\xd5\x7d\xd2\x03\x68\x58\xfa\xd0\x85\x7a\x00\xc2\x57"
- "\xa1\x07\x00\xbd\x34\x0c\x13\x7a\x80\xb1\x12\xcb\x1c\x9e\xe2\x20"
- "\x3d\xc0\x77\x8f\xad\x19\x5b\xdc\x3e\x7d\x6a\x21\xb0\x35\x43\xc4"
- "\x95\x74\xfb\xf4\xa9\xf3\x6e\xd3\xea\x25\xf5\x00\xbf\x62\xb2\x5e"
- "\x21\xf4\x00\xf7\x88\xf2\x4e\x07\xe9\x01\x02\xb0\xf6\xb8\xee\x99"
- "\x13\xbd\xe3\xec\x1c\x53\x90\x1e\xa0\xc9\x8f\xb3\xe7\xc8\x46\x1d"
- "\x38\x28\x70\x36\x2e\x10\x67\xe7\x8e\x17\x38\x7b\x8f\x86\xb3\x73"
- "\xa6\x75\x62\x6e\x76\xf6\x15\x67\xe9\x1c\xc1\xd1\xf4\xef\x07\x67"
- "\x2b\xfb\x80\xb3\x01\xba\x81\xb7\x40\x0f\x1f\xce\x0a\xba\xcf\x3d"
- "\x56\x37\x8d\x70\x36\xbd\x87\x6e\xa0\x3c\xb4\x6e\xe0\xfd\xef\x43"
- "\x37\xf0\xcc\x9d\xc1\x78\xfb\x8c\x25\x18\x6f\x9f\xb9\xd6\x8f\xb7"
- "\xea\xb3\xef\x44\x37\xf0\xcc\x1d\xdf\x8f\x6e\xe0\x99\x3b\xfc\x78"
- "\x3b\xef\x8a\x4b\xe3\xed\x1c\x73\x68\xbc\x45\xba\xc0\xdb\x39\xe6"
- "\x8b\xe2\xed\x3d\x81\x78\x3b\x7f\x80\x86\xb7\x7e\xdd\x40\xb9\xaa"
- "\x1b\x28\xbe\xb4\x6e\xa0\xb1\x17\xdd\xc0\xbd\xdf\xb7\x6e\x60\xfe"
- "\x05\x3e\x09\x2f\xa6\x1b\x38\xbf\x49\xda\xed\x2f\x27\xbb\xfd\x27"
- "\x81\xbf\x53\x3e\x06\x0d\x2e\x6d\xb7\x9f\xa3\xd9\x9f\xa6\x97\xaa"
- "\x38\x5b\x1a\x52\x37\x70\xb0\xa5\x77\xdd\xc0\xc1\xc3\x81\xf6\xa7"
- "\x0b\xfa\x05\xef\x5b\x2d\x18\xa0\xed\x5b\x1d\xfc\x1b\xe1\xec\x22"
- "\x11\x17\x46\xd9\x90\x5e\x2e\xfd\x6a\x2f\x32\x52\x3d\x43\xd9\xf1"
- "\xbf\xad\x04\xee\x65\x2d\x98\xed\xd3\x15\xd4\x13\xde\x96\x32\x85"
- "\x67\x44\x90\x5f\x6f\xa1\x2b\x78\x94\xc6\xde\xc2\x77\x03\x71\x77"
- "\xff\xa7\x81\xb8\xbb\xc0\xa6\xe1\xae\x17\xb8\xbb\xaf\xa9\x54\xea"
- "\x5f\x1f\x97\xb6\xa9\xbb\x1e\x0f\xb0\x4d\xfd\xf8\x3d\x15\x77\x9f"
- "\x5d\xf3\xa1\x13\xed\xbf\x98\xfd\x14\xde\x7f\xfd\xd3\x6f\x6a\x83"
- "\x5a\x1a\xd2\x76\x4a\xc5\xa7\x90\xf6\x53\xa8\xab\x71\x8b\x3a\x57"
- "\xbd\x98\xa7\x5b\x02\xec\xa7\xca\xb2\x31\x9f\xd5\x73\x25\x17\xb5"
- "\x43\x7d\xdc\x6f\x87\xca\x37\xa4\x35\xd2\xfa\xa6\x6c\x4c\x2f\xef"
- "\xe2\x19\x61\x3c\x36\xad\x91\xbe\xdf\xdd\x8d\x75\x27\x25\x35\x4c"
- "\xca\x75\x69\x76\x60\xcf\x10\x49\xf7\x67\xab\xbd\x58\x6b\xbc\x58"
- "\x6b\x94\x0d\x69\x76\x0f\xf1\x26\x9b\xd2\xaa\xca\x20\xe7\x79\x0a"
- "\x45\x9c\xc1\x81\x25\x90\xf5\xb6\x91\x9c\x77\x0a\x73\x23\x2f\x41"
- "\x4f\xf5\xd1\x70\xd4\xd0\x82\x76\x9c\xba\x38\x2f\xe7\xf9\xda\x8f"
- "\xa3\xf6\x07\x0e\xe2\x9b\x96\x7d\x75\x34\x76\x53\xfd\x67\x0a\x04"
- "\xcf\xdc\x8b\xad\x2c\xd5\x45\xfa\x57\xc4\x58\xf8\x0e\x74\x12\x81"
- "\xf5\x09\xc6\xf5\x85\x43\x83\x71\x7d\xe1\xb8\x60\x5c\xb7\x78\xfd"
- "\xb8\xae\x3e\x03\xae\x7b\x0b\x25\x1f\x8d\xb5\xef\x5b\xf2\xd1\x0b"
- "\x63\x35\x5c\x57\x54\x5c\xdf\xfa\x0d\x70\xfd\xa2\x7c\x74\x00\x2e"
- "\xf5\x8e\xeb\x0b\x63\xfd\x3a\x89\x85\xa7\x43\xda\xc8\x7e\x1a\x88"
- "\xeb\x0b\x4a\x05\xae\x7f\xda\x13\xd7\x17\x94\x4a\x5c\x5f\x50\xda"
- "\xeb\x79\x82\x4f\x7b\xee\xa7\x2d\xfa\x44\xe0\x7a\x83\x6a\x23\x5b"
- "\xdf\x87\xf3\x04\x0d\x12\xd3\x35\x2c\x27\x7d\xd5\xf7\xab\x93\x58"
- "\x74\xb8\x2f\x3a\x09\x81\xe5\x6d\x12\xcb\x09\x1b\x35\x3c\xff\x26"
- "\xe7\x09\x2e\x85\xe7\x1a\xdf\x4c\x78\xde\x1b\xdf\x1c\x8c\xe7\x8b"
- "\x3f\x09\xc6\xf3\xc5\x47\x82\xf1\x7c\xe9\x27\xc1\x78\xbe\xf4\x70"
- "\x4f\x3c\xbf\x10\xcb\x33\xaf\x0f\x85\xe3\x96\x47\x49\x47\xb1\x74"
- "\x55\xef\x18\x9e\x39\xb5\xef\x18\xbe\xe4\xa1\xff\x75\x18\x6e\xec"
- "\x89\xe1\x4b\x56\x13\x06\x79\x8b\x7a\x60\xf8\x5c\x15\xc3\x55\x1c"
- "\xd9\xd6\xaa\xf2\xc2\x3d\x31\xbc\x0d\xed\xb8\x84\x3c\xee\xf9\x67"
- "\x4f\x0c\xcf\x2a\x08\xc2\x70\xe3\x25\x30\x7c\xae\xd4\x83\x04\xd9"
- "\xe5\xf6\xa2\x0b\x41\x3b\x6c\x5b\x7a\xe1\xcd\x35\x9a\x05\xd6\x27"
- "\x18\xc3\xb3\x8e\x04\x63\xf8\xd2\xa8\x60\x0c\xcf\x7a\xd7\x8f\xe1"
- "\xea\xb3\xef\x84\x37\xcf\x6a\xf8\xce\x79\x73\x6d\x7c\x5c\x14\xc3"
- "\xb3\x1a\xfc\xbc\xf9\xd2\x37\x2f\x8d\xe1\x99\xd3\x42\x63\x38\xd2"
- "\x05\x86\x67\x4e\xeb\xf5\x9c\xc3\x05\x18\x6e\xdd\xd8\x07\x0c\x0f"
- "\xd6\x85\x68\x18\xae\xea\x42\xb6\x05\xe8\x42\xbc\x85\x52\x17\xb2"
- "\xa5\x55\x8e\x8d\x21\x3a\x39\x4e\x31\x7e\x4c\x5b\xf5\x17\x97\xdd"
- "\xb6\x7c\x2b\x3d\x88\xb5\xd7\xf8\x6f\xa1\xf4\x20\x02\xbf\xe9\x8c"
- "\xc3\x63\xc0\xed\xfa\x6f\x78\xc6\x61\x9c\x76\xc6\xc1\xd6\xcb\x19"
- "\x07\x15\xcf\xa7\xff\x0b\x78\x2e\xce\x38\x2c\xdb\x11\xac\x63\x5e"
- "\xf6\xaa\xa6\x63\x96\x78\xbe\xe2\xad\x60\x3c\x5f\x51\xe9\x3b\xf3"
- "\x00\xcc\x77\x58\xd6\x5f\x70\xe6\xc1\x87\xed\x42\x0f\x9a\x3d\xc0"
- "\xfe\x68\x33\xf3\xe1\xfb\x34\x3f\xbe\xa3\xac\x39\x41\xd8\xde\x14"
- "\x88\xed\xd9\x89\x41\xd8\x7e\xb4\x34\xd8\x3e\xa2\xc9\x12\x80\xed"
- "\xda\x99\x87\xe5\x37\x7c\xd8\x78\x09\x6c\xc7\xfb\xdf\xfc\x8c\xd8"
- "\x77\x8b\xed\xda\xf9\x86\x90\xd8\x1e\x78\xbe\x21\xc0\xfe\x81\xb0"
- "\x5d\xc4\xc3\x18\xda\x03\xdb\x97\x67\xe8\xbd\x07\x30\x1f\x80\xeb"
- "\x34\x47\xbc\x1c\xd8\x2e\xe8\xbd\x3c\x23\x10\xdb\xbb\x0b\x25\xb6"
- "\x6f\x6e\xfd\xd7\xb1\xdd\xc7\x0f\x07\x62\xfb\x7d\x84\xed\x39\xb3"
- "\xe5\xf9\x8b\xfc\x6f\x76\xfe\xa2\x87\x7d\xc6\xe6\x6f\xa0\x7f\xb9"
- "\x28\xc6\x87\xa8\x57\x30\xc6\xe7\xec\x0b\xc6\xf8\x1c\x57\x30\xc6"
- "\xe7\xec\xf0\x63\xbc\xfa\xec\x3b\xe1\xd3\x73\xf6\x7e\x3f\xfa\x97"
- "\x9c\xbd\x7e\x8c\x5f\xf1\xe2\xa5\xcf\x5e\x64\x27\x85\xb6\xcd\x40"
- "\xba\xc0\xf8\xec\xa4\x8b\x9e\xbd\x08\xd2\x77\xe7\x3e\x1f\xf2\xec"
- "\x45\xfd\xbf\xcf\x36\x23\x70\xac\xf4\xd4\xbf\x7c\x7b\xdd\x77\x6e"
- "\x71\x5f\xf5\x2f\x74\xf6\x62\xf9\x27\x01\x67\x2f\x1a\x2f\x7d\xf6"
- "\x22\xe7\x91\x6f\xa8\x7f\xb9\x88\x6d\xc6\xc1\x29\x81\xf6\x6e\x79"
- "\xcf\x05\xe3\x7b\xde\xf3\x3e\x7c\x7f\x98\xf0\x7d\xe5\x96\x60\x7c"
- "\x5f\x59\x46\xf5\x0c\x75\x16\xe3\xed\xa0\x7d\xc5\xbc\x63\xc1\xb6"
- "\x1a\x3d\xf4\x2f\x0f\xd3\xd8\x5b\x39\x31\x08\xdf\x8f\x06\xe2\x7b"
- "\xbe\x31\x14\xef\x4e\x7a\x6f\x61\x53\x3c\x3d\xe0\x4c\xdb\x24\xcd"
- "\xfe\xad\xe0\x8a\x0f\x53\xd1\x7e\x67\x2f\xb6\x6e\xd3\xa5\xad\x9b"
- "\xb0\x6d\x23\x3d\x38\xca\x7a\x63\xba\x45\x9f\x9b\xce\x15\xb2\x75"
- "\xeb\x69\xe7\x46\xb6\x6f\x64\xeb\x56\x9b\x61\xeb\xd5\xce\x8d\xc6"
- "\x66\x6f\xb6\x6e\xa8\x77\xac\xc0\xfa\x2f\x54\xac\x57\x6d\xdd\xca"
- "\xb2\xfc\xb6\x6e\x41\x58\x1f\xc2\x7e\xf8\xad\xa3\xf9\xa1\xf9\xf8"
- "\x3c\x3f\xd6\x77\x11\x1f\xff\x5f\x3d\x74\x31\xa2\x0f\x0a\xa6\xfe"
- "\x5b\x75\x31\x02\xeb\x0b\xc7\xd7\xd1\x38\x9e\x66\x09\xa1\x8b\xb9"
- "\xd0\xc6\xf9\xdf\xa7\x8b\x29\x7c\x39\x18\xe3\x0b\x0f\x07\x63\x7c"
- "\xe1\xf3\x7e\x8c\x57\x9f\x7d\x27\x18\x5f\x58\xfe\xfd\xe8\x62\x0a"
- "\xcb\xfd\xba\x98\x95\x2b\x42\xda\xdf\x05\xe9\xd8\xf3\x4d\xa1\x75"
- "\xec\xf9\xaa\xfd\x5d\xbe\xa9\xd7\x33\x21\x17\xec\x69\xae\x9a\x21"
- "\x75\xec\xdf\xe2\x4c\x48\xe3\x7f\x9a\x2e\x66\x55\x7a\x5f\x75\x31"
- "\xc2\xb6\xf9\x13\xb2\x0f\xe9\xdb\x99\x90\x4b\x61\xbb\x8f\x77\xbf"
- "\xc8\x1e\x66\x30\xb6\x3f\x37\x23\x18\xdb\x9f\x9b\x1d\x8c\xed\xcf"
- "\xcf\x0f\xc6\xf6\xe7\xe7\xf5\xc4\xf6\x0b\x71\xfd\xb9\x37\x43\x61"
- "\xba\xe5\x61\xd2\xc5\x3c\x3f\xbc\x77\x3c\x7f\xce\xd9\x77\x3c\x2f"
- "\x3a\xf1\xbf\x1a\xcf\x8d\x3d\xf1\xfc\xff\x89\xff\xb7\xea\x65\x04"
- "\x9e\x17\x5f\x11\x84\xe7\xc6\x4b\xe0\xf9\xbf\x4d\x2f\x53\xbc\x30"
- "\x18\xcf\x8b\xb7\x07\xe3\x79\xf1\x63\x7e\x3c\xff\x7f\xd9\xfb\xf6"
- "\xb8\x26\xae\xb4\xff\x93\x04\x2d\xb6\x28\x60\xc1\x45\xab\x36\x76"
- "\x75\x8b\x56\x5b\xed\xab\xf5\xb2\xba\xd5\x56\x57\xa0\x5e\xb0\xd5"
- "\x2d\xf5\x52\x41\xc1\xa2\x8b\x36\x22\x5a\xb4\x08\x78\x5d\xb4\xa8"
- "\x60\xc1\xa2\x82\x62\xab\xad\xf7\xcb\x56\xdf\xc5\x5d\x75\xe3\xaa"
- "\x5d\x6c\xb9\xd9\xd5\x16\x5b\xac\xd1\xa2\x8b\x16\x6d\x44\xd4\x08"
- "\x49\xe6\xf7\x9c\x39\x13\x4e\x26\x99\x49\x32\x13\x40\xf8\xbd\xfe"
- "\x91\x8f\x32\x99\x39\x99\x79\x9e\xef\x79\xce\xf7\xfb\xcc\x39\xcf"
- "\xe1\xbe\xab\x97\xbc\x4c\x8a\xe6\xd1\xe4\x65\x52\x34\x94\xb3\xaf"
- "\x1a\xed\x3c\x9e\xaf\xa8\x10\x8e\xe7\x70\x9c\x8d\xe7\x2b\x2a\x44"
- "\xe7\x53\xdb\xc5\xf3\xd5\xbd\x24\xc4\x73\xc1\x39\x2a\x4d\x23\x2f"
- "\xb3\xba\xa7\xd4\xbc\x8c\xd8\x3a\x15\x1c\xdf\xe9\xfc\x14\xab\x75"
- "\x2a\x43\x2d\xeb\x54\x92\xf9\xf3\x53\xea\x3d\xb6\x7f\x34\x84\x1f"
- "\xdb\x3f\x1a\xc6\x8f\xed\xeb\xa6\xf0\x63\xfb\xba\xc9\x96\xfb\x24"
- "\x79\x99\xa5\x76\xeb\x56\xf8\x71\xfe\xa3\x6d\xda\x37\xcb\x91\x50"
- "\xac\x87\xb6\x5a\x8b\xc7\xf9\x8f\xf2\xc5\xe2\x3c\x9e\xaf\xb2\xe7"
- "\xdd\x68\x81\x38\x9f\x7a\xee\xff\x87\x38\x2f\x36\x0f\x85\xd5\x41"
- "\x10\xe3\x71\xbc\x67\xe3\x3b\x17\xeb\x71\x9c\x37\xfd\x43\x28\x47"
- "\xb3\xc6\xab\xa1\xe2\xbc\x78\x8e\x66\x6d\xab\xa2\xc9\x5c\x9c\x77"
- "\x65\x0d\xcd\x49\x7e\x8e\x26\x7b\x56\x43\xe7\x68\xd6\x46\xf0\xe3"
- "\xfd\xda\x0c\x7e\xbc\x5f\x1b\x4c\xe3\x3d\xf7\x5d\xbd\xf0\xf7\xb5"
- "\xe1\x8f\x26\x47\xb3\x36\x9c\xc6\xfb\x75\x43\x9c\xc7\xfb\x8f\x4a"
- "\x84\xe3\xfd\x47\x5c\x6d\xb6\x8f\x4a\x5c\x8f\xf7\x69\x75\xf1\xde"
- "\x7e\xfd\x4c\xb2\xfc\x39\x32\xc3\x1e\x75\x8e\x26\x4d\x34\xfe\x3b"
- "\xaa\x8f\x21\x3f\x47\xc3\xad\x49\x9c\x26\x5c\x1f\xe3\xac\x83\x39"
- "\x32\x67\x0b\xac\x63\x7d\x7a\x77\xfe\x5c\xc4\xf4\x5e\x96\xb9\x88"
- "\x67\x8b\x70\xac\xcf\x9c\xc0\x8f\xf5\x99\xe3\xc5\x72\x34\x47\xcd"
- "\xd6\x73\x12\xd3\x57\xf1\x73\x34\xb9\xfc\x1c\xcd\x18\x8c\xbd\xcc"
- "\x16\xe2\xb1\x3e\xfd\x30\x7f\x0e\x38\x59\xa3\xb8\xeb\x5d\x6e\x0e"
- "\xf8\xbb\x56\x73\xc0\x43\x3e\xe5\x62\xfd\xfa\x73\xf9\x25\x46\x24"
- "\x65\x1e\xa2\xfb\x73\xbd\x53\x04\xe7\x20\xb2\x63\x80\x83\x79\x88"
- "\x53\x2f\xfa\x20\xb3\x12\x74\xf8\x02\xab\x79\x88\x0e\xea\x19\xf3"
- "\xe2\xff\xbb\x1a\xd1\xf8\xff\x90\xa1\xf1\xdf\xdc\x9f\xe6\x6d\xcc"
- "\x98\xe7\xb3\x7e\xf9\xd8\xab\xa1\xf2\x36\x42\x79\x12\xed\x6b\x38"
- "\xfe\x67\x28\x08\xcf\x8f\x6e\x62\x79\x9b\x8c\x77\xf8\x71\x3f\x23"
- "\x95\x1f\xf7\x33\x86\xd1\xb8\xcf\x7d\x57\x2f\x73\xd1\x33\xc2\x1e"
- "\x0d\xcf\xcf\x08\xa3\x79\x9b\xcc\x7e\xce\xe3\x7e\xfa\x31\xe1\xb8"
- "\x9f\x7e\x8c\xc4\xfd\xf4\x63\x0e\xf3\x36\xbc\xb9\x91\x1b\xda\xbb"
- "\x9d\xb7\xb1\xf0\xfc\x47\xbe\xae\x67\x43\x80\x94\xbc\x4d\xdd\x9a"
- "\x74\xb7\xf2\x36\xc2\xf1\xde\xc2\xed\xcf\x3a\x78\xe7\xca\x8f\xf7"
- "\x9f\xb4\xe7\xc7\xfb\x4f\x3a\xf1\xe3\xfd\xe6\x81\xfc\x78\xbf\x79"
- "\x80\x50\xde\x86\x1f\xeb\x3f\x99\x2d\x14\xe7\x35\x63\x70\xde\x66"
- "\x53\x85\x78\x8c\xff\x24\x4b\x7a\x8c\xcf\x3a\xf2\x38\xc6\xdb\xc4"
- "\x78\x1f\xdb\x18\x9f\xa5\x6f\x54\x8e\xcf\xc6\xf8\x8d\xd7\x78\x31"
- "\xbe\x1e\x73\x39\xae\xac\x27\x11\xe7\xf6\x9b\x6c\xe6\xbf\x6f\xb2"
- "\x99\xff\xbe\xc9\x6a\xfe\xfb\x26\x4d\xfd\xc5\xf8\x4d\xf5\x3f\xff"
- "\xdd\xa5\x18\xbf\xc9\x6a\xfe\xfb\xe6\xf6\xce\x63\xfc\x27\xb9\xc2"
- "\x31\x1e\x8e\xb3\x31\xfe\x93\x5c\x87\xdc\x9e\x17\xe3\x37\x9b\x1a"
- "\x22\x97\xf3\x68\xd6\x1b\x6d\x36\x4a\xc9\xe7\x38\xaa\x3b\x22\x9a"
- "\xcf\x19\x60\xc9\xe7\x68\x44\xf2\x39\xf5\x15\xf3\x73\x5a\xf3\x63"
- "\x7e\x8e\x2f\x3f\xe6\x6f\x1b\xc6\x8f\xf9\xdb\x86\xf2\xf3\x39\xb1"
- "\x76\xf9\x1c\x7e\xfc\xcf\x99\xab\x1d\x63\x9d\xcf\xc9\xb5\xca\xe7"
- "\xe4\xde\x11\x8f\xff\x39\xa2\xf1\xff\x3e\x1b\xff\xc3\x05\xe2\xff"
- "\x96\xff\x23\xf1\x3f\xdc\x8d\xf8\xbf\xe5\x11\xc4\xff\xad\xb7\x48"
- "\x8e\xc7\xc5\x3a\x29\x47\xa5\xe7\x78\xdc\x1b\x07\x72\x47\xf0\xc7"
- "\x81\xdc\x78\xfe\x38\x90\xdb\x8b\x8e\x03\xdc\x77\xf5\x32\x0e\xe4"
- "\x0e\x7f\x34\xe3\x40\xee\x70\x3a\x0e\x6c\xeb\xe2\x7c\x1c\xc8\x11"
- "\x19\x07\x72\xb8\x71\x20\x47\xc2\x38\xf0\xa9\xaf\x78\x8e\x47\x23"
- "\x3f\xc7\x33\xf0\x51\xaf\x83\xfa\xd4\x47\x52\x8e\x67\x43\x44\x72"
- "\x01\xae\x91\x72\x05\x29\x3f\x8c\xb0\xe4\x78\xb4\x36\x39\x1e\xad"
- "\x5d\x8e\x67\xe1\x15\x2e\xfe\x8f\xe2\xd6\x9b\x8e\x71\xa3\x46\x0a"
- "\xbb\x97\xf4\x67\xad\xf9\xf3\xe6\x3f\x63\xe3\x3f\xad\xdf\xf7\x79"
- "\x0e\xbe\x2f\x32\xfe\x68\x1d\xd4\x40\xfd\x6c\x0a\x2f\xa7\x33\x4a"
- "\xa8\x46\xca\xe7\xbc\x79\x37\xfc\xf5\xa6\x9f\xa5\xf0\xe2\xfd\x18"
- "\xb2\xde\x74\xb7\xd0\x7b\xda\xba\x9a\xfc\xdb\x37\xb2\x35\xf9\xeb"
- "\x6a\xf9\x7d\x56\xe0\x52\x2d\xe9\x77\xb9\x5a\xd2\x3f\x3d\x82\x5a"
- "\xd2\xae\xd6\xe4\xff\xc9\xb6\x7e\xdf\x8e\x7e\xc5\x05\x5a\x54\x84"
- "\x31\x32\xd9\xb6\xf6\xa9\x56\x78\xed\xbe\x92\x5b\xbb\x3f\xa7\x61"
- "\xea\xa0\xe0\xfb\x61\xc7\xfc\xb6\x7b\x72\xf7\x25\xea\xd9\xfb\xc1"
- "\xfb\x76\xc3\xbd\x1e\x2d\x00\xac\x9a\x71\x3c\x8d\xc5\xf1\x74\x47"
- "\x25\x7b\xee\x15\xc0\x42\xdb\x01\x1a\x8c\xe3\xb5\x66\xe4\xa5\x59"
- "\x80\x63\xeb\x0e\x76\xde\x17\xd0\x08\x88\xad\xe4\xbc\xc5\x57\x18"
- "\x93\xa9\xed\x50\x0d\xdc\xff\x13\xfb\xe7\x94\xb4\x28\xd2\x55\x43"
- "\xbf\xb8\xc9\xee\xe3\x5a\x6c\x7c\xa0\xc5\xbe\x38\x31\xa7\xc4\x83"
- "\x81\xf8\xbb\x75\x06\xf2\x94\xd6\x4f\x77\xb0\xfb\xd4\xb3\x6b\xd7"
- "\xdb\xee\xd9\x8b\xeb\x80\x58\xb8\x95\xf9\x57\x9a\xdf\xca\x01\xfb"
- "\x98\x19\x32\xf6\x4d\x9d\x49\xe2\x06\x03\xe3\x35\xd8\x92\x9d\x63"
- "\x8b\xe3\x06\xbb\x87\x15\xc4\x8d\x2d\x55\xf4\x3d\x36\x6e\x1f\xdb"
- "\x88\xe4\x51\x3e\xa7\xf3\x5f\x74\x62\xb1\xf5\xb3\x34\xe1\xd8\xfa"
- "\x59\x1a\x89\xad\x9f\xa5\xd5\xc5\x56\x9d\x40\x1e\x85\x37\x8f\xfd"
- "\x0b\x6e\xfe\x8b\xd6\x86\x63\x6b\x9b\x61\x7d\x94\x2f\x24\xcd\x7f"
- "\x61\xe3\x69\x0c\x89\xa7\x38\x5e\x59\x62\x2a\xcd\xa3\x68\x45\xf3"
- "\x28\xce\x62\xaa\xa4\x35\xfc\x6c\x4c\xdd\x19\xc1\x8f\xa9\x3b\xa3"
- "\xf8\x31\x75\xcf\x35\xdb\x98\x6a\x1f\x4f\x77\xee\x10\x8a\xa5\xa4"
- "\x3e\xca\x9e\x0c\xf1\x38\xba\xb3\x44\x2c\x8e\xb2\xf3\xd3\xdf\xb5"
- "\x9a\x9f\x5e\x17\x47\x77\x5d\xe1\xc7\xd1\x5d\x7e\xae\xc6\x51\x76"
- "\x6f\x93\x9f\x1a\x61\x6f\x13\xd9\x71\x54\x63\x13\x47\x77\x2f\xa6"
- "\x71\xd4\x76\x7f\x13\x27\x71\x74\x56\xc3\xd4\x40\xe1\xc5\x51\xb3"
- "\x9e\xbd\x1f\xf5\x1c\x7c\xaf\x7b\x14\xfc\x38\xba\xa7\xaf\x78\x1c"
- "\xdd\x7d\x8e\xc6\x51\x72\x5e\xc3\xc6\xd1\x3d\x88\x17\x47\x67\x59"
- "\xc5\xd1\x5f\xa8\x86\xc0\x73\x2c\xea\xe2\xe8\x6c\xab\x38\x3a\xcb"
- "\x59\x1c\xdd\x83\xb0\x8d\x08\x47\xdd\x73\xc6\x79\x1c\xdd\x59\x2a"
- "\x1c\x47\xe1\x38\x1b\x47\x77\x96\xd2\x38\x2a\xc0\x51\x79\x71\x74"
- "\xef\x2e\x09\x71\xb4\x89\xd7\x46\xd9\xbb\x53\x52\xae\x82\xae\xe9"
- "\xb4\xaf\x91\x3a\xc5\x7a\x4d\x50\x9e\xcd\xbe\x27\x79\x76\xfb\x9e"
- "\x2c\xb4\xac\xf1\x0c\xe2\xe2\x6a\x88\x1b\x71\x95\x5d\xe3\xb9\xef"
- "\x28\x7f\xee\xc9\xbe\xe3\x96\xb9\x27\x24\xae\x1e\x1a\x67\xb9\x2f"
- "\xba\xef\x49\x9e\x83\x1a\xa9\xfb\x5b\xf3\x6a\xa3\x04\x59\xd7\x46"
- "\x39\xa4\x10\xaf\x91\xba\xbf\x2f\xaf\x36\xca\xd7\x3b\xeb\xf6\x3d"
- "\xb1\xad\x91\x4a\x63\xec\x81\x11\x6c\x8c\xad\xab\x41\xb5\x3f\xbe"
- "\xae\x46\xaa\x93\x75\x41\xb8\x9d\xfd\x57\xa3\x1b\x3e\xc6\x6a\x25"
- "\xc4\x58\xde\xbe\x27\xb6\x35\xa6\x0e\xdc\x28\xce\xcf\x43\x45\xe1"
- "\x79\x02\xb5\x51\xf3\x1e\xe9\xde\x27\xf8\xbe\x84\x63\xed\xc1\xd9"
- "\xfc\x58\x7b\x30\x97\x3d\xf7\x92\x50\xac\x3d\x38\x84\xc6\x5a\x72"
- "\xde\xe2\x4b\x36\xb1\xb6\x4c\x24\xd6\xc2\xb8\xba\xf5\xba\xd4\x58"
- "\x7b\x30\x86\x8d\xb5\x4b\xb9\x58\x7b\xb3\xbe\x63\xed\xc1\x18\x1a"
- "\x6b\x0f\xf5\x71\xbe\xc7\xd4\xfe\xc1\xc2\xeb\x72\xf6\x0f\x26\xb1"
- "\x76\xff\x60\x87\x7b\x4c\xf1\xe6\x7c\xfc\xb5\x8b\x65\x8f\x29\x9a"
- "\x0f\xc8\xe3\xf2\x01\xcd\x79\x4f\x94\xbf\xaa\xa5\xe6\x03\xbe\x01"
- "\xed\x8e\xd7\x5d\x7e\x88\xf7\x9c\x9a\x8c\xf7\x44\x39\x68\x93\x0f"
- "\x38\x68\x9f\x0f\x78\xc7\x71\x8c\x95\x94\x0f\x60\xd7\x5d\x7e\xd9"
- "\x89\x1f\x63\xbf\xec\xc2\x8f\xb1\xff\x7b\xd4\xb2\xce\x12\xdf\x8f"
- "\x78\xcd\xd4\x2f\x67\xd7\xe5\x03\xca\xf8\xb1\x95\xe6\x03\xfe\x77"
- "\xa6\x78\x8c\xfd\x92\x9f\xff\x0d\xd9\xc9\x5b\x67\xb9\xfb\xaa\x75"
- "\x1d\x6a\x4b\xfd\xa9\xc3\x47\xce\x9e\xb7\x8e\xb1\x5f\x96\x35\xa7"
- "\x3a\xd4\x75\xb5\xa6\x9c\xcc\xe5\xb6\xaf\x43\x7d\x64\x5c\x71\xfe"
- "\x41\x84\xd7\xb6\xb1\xf1\x96\x97\x1b\x38\xf8\x68\x72\x03\xf9\x07"
- "\x45\x72\x03\x47\x2e\xf0\xe3\xec\xff\x7a\xb2\xe7\x5e\x14\x8a\xb3"
- "\x47\x76\xd0\x38\x4b\xce\x5b\x7c\xd1\x26\xce\x96\xd6\x27\xa7\x3d"
- "\x72\xbe\x61\x73\x03\x47\xce\xd3\xdc\xc0\xff\xba\xb0\xfe\xf1\xcb"
- "\x5c\xe1\x38\xfb\x25\x97\x77\xfd\x92\xe6\x5d\x4b\x05\xf6\x4b\xe1"
- "\xc5\xd9\xbf\x2d\xb6\xac\x7f\x64\x39\x6d\x99\x85\xd3\x1e\x6c\x86"
- "\xfb\xa5\xfc\x2d\x41\x6a\x6e\x00\xaf\x73\xc7\xb1\x15\xc7\x2e\x4b"
- "\x7c\xa5\xb9\x81\x83\xe2\xb9\x01\x27\xf1\x55\xfa\xde\x7d\x79\x8b"
- "\xf9\xf1\x35\x6f\x09\x3f\xbe\x1e\x6b\x6d\x1b\x5f\xed\x63\x6b\xde"
- "\x49\xa1\xb8\x4a\x72\x03\xff\x38\x26\x1e\x53\xf3\x2a\xc5\x62\x2a"
- "\x5b\xd3\xef\x2a\x9d\x23\x4d\x63\xea\xdf\x5b\xf1\x63\xea\xd1\xde"
- "\xae\xc6\xd4\x47\xb2\x5f\x8a\xec\x98\x1a\x6d\x13\x53\xff\xbe\x83"
- "\xc6\x54\xdb\x3d\x53\x9c\xc4\xd4\x86\xca\x13\x58\xc7\x54\x1e\x77"
- "\xfd\x47\x77\x7e\x4c\xfd\xc7\x64\xf1\x98\xfa\xf7\x87\x34\xa6\x92"
- "\xf3\x1a\x36\xa6\xfe\x23\xb0\x61\xf3\x04\xff\x08\xa4\xdc\xf5\x1f"
- "\xb7\x9c\xc7\xd4\xbc\x6a\xe1\x98\x9a\x57\x4d\x62\x6a\x5e\xb5\xeb"
- "\x6b\xca\x8f\x9d\x93\x10\x53\x9b\xf8\x5e\x2a\xc7\x4a\x24\xe7\x09"
- "\x70\xbe\x15\xc7\xd2\x32\xf7\x6a\x87\xc4\x5b\x6a\x87\x0c\xe7\x62"
- "\xec\x1f\xdd\x8d\xb1\xc7\xaf\xf0\xe7\x34\x1c\xbf\x66\x99\xd3\x40"
- "\x62\xec\xc9\x15\xfc\xfd\x51\xed\x6b\x85\xf0\x6b\xa8\x9e\xe8\x57"
- "\x97\x27\xc0\x31\x77\xb8\x75\x9e\xe0\x64\x3f\xf1\x78\x7b\x62\x32"
- "\x2f\x4f\xf0\x95\x70\xbc\xbd\xcf\x8b\xb7\xff\x5c\xc8\xc6\xdb\xba"
- "\x1a\xaa\x27\x72\x2d\x35\x54\x9d\x72\x58\x5e\xbc\x0d\x6f\x9c\x78"
- "\x9b\xe7\x7a\xbc\xe5\xef\xa5\x62\x5b\x2f\x55\xdb\xa9\xf8\x34\xc4"
- "\x5b\xb6\x5e\x87\x6d\xcd\x54\xd7\xea\x75\x34\x54\xcd\x54\x7c\x5f"
- "\xc2\x71\x57\xbb\x8d\x1f\x77\xb5\xe7\xd9\x73\x05\xe3\xae\x76\x2e"
- "\x8d\xbb\xe4\x3c\x97\xe3\xae\xac\x9c\x81\x36\xb7\x61\x73\x06\xda"
- "\x5c\x1a\x77\x4f\x46\x39\x8f\xbb\x27\x22\x85\xe3\xee\x89\x48\x12"
- "\x77\x4f\x44\x3a\x8c\xbb\xbc\x39\x04\xff\x9a\x20\x58\xcb\xa3\xac"
- "\xb9\xef\xb3\xf2\xaf\xf1\x72\x72\x06\x10\x83\x95\x09\xb8\x86\x53"
- "\x38\x9e\x43\xe0\x3c\x67\xe0\x2c\xde\x4a\xcf\x19\x9c\x1a\xc7\x8f"
- "\xb7\xa7\x26\xf0\xe3\xed\xbf\x15\xf8\xbe\x1c\xe6\x0c\xd8\x18\x70"
- "\x6a\x5b\x5d\xce\x40\xc7\x8f\xb3\x34\x67\xf0\xd5\x21\xf1\x77\x5f"
- "\xa7\x0a\x78\xfc\xf6\x8f\x36\x35\xab\xdf\xa5\xf1\xf6\xeb\x22\xcb"
- "\x9c\xb1\xd3\xa6\xb3\xa1\xd6\xf1\xf6\xb4\x8f\x5d\xcd\xea\xf1\xf5"
- "\x58\xb3\x7a\x7c\x3d\xd7\xac\x9e\xc0\xaf\x59\xbd\xe9\x3e\x9d\x47"
- "\x26\xbd\x66\xf5\x99\x8d\x6c\x0c\xc6\x18\xc2\x75\xab\x5d\xc9\x23"
- "\x34\xf0\x5e\x2b\xbc\xd8\xcb\xcb\x23\x7c\xd5\x89\x1f\x7b\xbf\x0a"
- "\x15\x8f\xbd\x67\x6e\xd1\xd8\x4b\xce\x6b\x58\xce\xfb\x55\xc7\x86"
- "\xcd\x23\x7c\xd5\x91\xe6\x11\xbe\xba\x22\x18\x7b\x79\xef\xc6\x4e"
- "\x9d\x17\x7e\x37\x06\xc7\xd9\xd8\x7b\xea\xbc\x68\x1e\xc1\x6e\xfe"
- "\xd6\xbf\xcf\x90\x77\x63\x1c\xe7\xd5\x49\xc8\x23\x34\xb9\x39\x06"
- "\xff\x3e\x2d\x27\x8f\x80\xe3\x2d\x8e\x67\x96\x98\xeb\x4a\x1e\xa1"
- "\xfe\x39\x6e\xfe\x19\x7e\xcc\xcd\x3f\xcb\x8f\xb9\x05\x33\x6d\x63"
- "\xae\x7d\xbc\x3d\xdb\x4a\x28\xd6\x92\x3c\x42\x41\x80\x78\x9c\x3d"
- "\xdb\x57\x34\xce\xda\xcc\xcd\xa5\x71\xf6\xeb\x28\x7e\x9c\x3d\x1b"
- "\x2f\x2b\xce\xba\xba\x07\x4b\x93\x8a\xb3\xe1\x36\x71\xf6\x1b\x05"
- "\x8d\xb3\xb6\xfb\xb0\x38\x89\xb3\x0d\xb4\x0f\x8b\x38\xc7\xfd\x66"
- "\x05\x3f\xce\x7e\x93\x27\x1e\x67\xbf\x99\x40\xe3\x2c\x39\xaf\x61"
- "\xe3\xec\x37\xcb\x1b\x36\xb7\xf0\xcd\x72\xca\x71\x0b\x82\x9d\xc7"
- "\xd9\xb3\x83\x85\xe3\xec\x59\xee\xbd\xd8\xd9\xc1\xa2\x1c\xd7\x2e"
- "\xce\x16\xf6\x92\x10\x67\x9b\xf8\x1c\x84\x42\x49\xf5\x2f\xac\xf2"
- "\xb5\x2d\x8b\x75\x36\xeb\x25\x2e\x5a\xaf\x97\xb0\xca\x2d\x0c\xb7"
- "\xe4\x16\xf8\xfb\xb3\xc4\x5b\xf2\xb7\x43\xb9\xb8\xfb\x9a\xbb\x71"
- "\xb7\x68\xc8\x83\xba\xb8\x1b\x0b\x71\xb7\x88\x5d\x1f\xf1\xa0\x2e"
- "\xee\x9e\xbb\x67\xb9\x2f\xba\x3f\x8b\x48\x6e\x61\x10\xdb\x5e\x7a"
- "\x5d\x6e\x01\xc7\xe1\xa1\xd6\xb9\x85\x73\x3b\xc4\x63\x70\x51\x1e"
- "\x2f\xb7\xf0\x2f\xe1\x18\x5c\xcd\x8b\xc1\xc5\x37\xd8\x18\x3c\xc8"
- "\x12\x83\x8b\x8c\xf7\x41\x5b\xde\x5f\x29\x2d\x06\x57\xb3\x31\x38"
- "\xe8\xd1\xc4\xe0\xc3\xf5\x10\x83\x59\xbb\x97\xac\x29\xd6\x42\x0c"
- "\x9e\x8c\x63\x70\x90\x6b\xf9\x86\x46\xda\xa3\x05\xdf\x97\x70\x2c"
- "\x3e\xe7\xcb\x8f\xc5\xe7\x86\xb3\xe7\x0a\xc6\xe2\x92\x2b\x34\x16"
- "\x93\xf3\x1a\x36\xdf\x70\xce\xa7\x61\xf3\x0d\xe7\x7c\x68\x2c\x3e"
- "\x77\xc1\x79\x2c\x2e\xd2\x0a\xc7\x62\x38\xce\xc6\xe2\x22\xad\xc3"
- "\x58\x3c\xc8\x3a\x16\x7f\x5b\xc7\x79\x79\xf9\x06\x5d\x73\xdf\xbb"
- "\xe5\x5b\x51\xfe\xab\xee\x8c\x92\xaf\x2a\xfe\xd3\xa9\x38\x1b\xa1"
- "\xbb\x4b\x51\x72\xb1\x71\x10\x82\x63\x60\xbf\xff\x8c\x28\x0e\x18"
- "\x80\xcc\xeb\xdf\x48\xc6\xf1\xf8\x63\xfc\x01\x8e\x9b\xa6\xe4\xfa"
- "\x16\x6b\xe3\xff\xb0\xf3\x5d\xf1\x71\x1c\x7b\xb7\x5a\x7d\x2f\xf4"
- "\x5b\x4c\xda\x1b\x88\xbb\x2e\x97\xac\xbb\x79\xc3\xc3\xf2\x37\xc6"
- "\xa6\x4e\xf1\x9f\xed\x4c\x7a\x88\x51\xef\x1b\x62\x14\xba\xfe\x39"
- "\x1f\xe4\xd9\x66\x09\xc3\x6c\xd9\xc0\x54\xdf\xfd\xdd\x20\xcd\xdd"
- "\xd5\x08\xa5\x6d\x60\xf4\x0f\x56\xfe\xa7\x0c\xae\xf5\xf8\x04\xce"
- "\xbb\xdb\xf6\x84\xe6\xee\xd2\x50\x04\xc7\xf4\x96\x63\x60\x37\x64"
- "\x5e\xaa\x62\xcc\xf0\x1d\xb3\xa1\xcd\xe4\xad\x89\x10\xab\x12\x10"
- "\x7a\xf1\x3e\xee\x33\xe7\x71\xcc\xf4\x5b\x0b\x6d\xae\x83\xb6\x98"
- "\xdf\x3c\x53\x0d\x78\xf4\x28\x02\xc6\x01\xcf\x9d\x02\xcf\x95\xbb"
- "\x16\xdb\x5e\xd5\x23\x8b\x51\x7a\x20\xf3\x8e\x81\xf9\x8c\xff\xb4"
- "\x64\xf0\x07\x4a\x8b\x45\xec\x9e\x38\xeb\xe0\x3c\x46\x99\xc4\x98"
- "\xbb\x0d\x08\x2d\x36\x56\x93\x3e\x0d\xf7\x77\x02\x74\x2c\x03\xbf"
- "\xbb\x25\x16\xf9\xc0\xc7\x8b\xc9\x9c\x96\xfc\x60\xe5\xf9\x14\xb8"
- "\x2f\x0d\xbe\x2f\xb1\x67\x5c\xb7\x09\xc6\x9d\x67\x02\xf0\xd8\xc1"
- "\xfe\x3e\xfe\x6d\xf6\x77\x94\xe6\x14\x13\x1c\x67\x96\x26\x31\xc5"
- "\xf1\x46\xe4\x0d\xb6\xd8\x0a\xf7\x8d\xf1\x68\xfe\x7c\x90\x66\x59"
- "\x07\x84\xf6\x2f\xaa\x50\x16\xc3\xbd\x9b\x3e\x79\xa6\x5a\x9b\xf8"
- "\x32\x82\xef\xf5\x58\xb3\x5c\x57\x5c\x58\x31\xf6\x06\x42\x38\x9e"
- "\xc0\xff\xd3\xab\x61\x1c\x1b\x0d\x7f\xaf\x83\xe7\x30\xdf\x0d\xf0"
- "\xc0\xe7\xc2\xf1\x21\xda\x05\x3f\x20\x6f\x0d\xf2\x5c\x0b\xcf\xc6"
- "\x9d\xeb\x85\xcf\xd5\x29\x2e\xa4\xe1\x7b\x80\xbf\xd5\xf0\x37\xbe"
- "\x0e\xcf\x21\x43\xcc\xf6\x81\xf9\x2c\x36\x33\xa6\x25\x9b\xbb\x0d"
- "\xcc\x67\x63\x1f\x3c\xe7\x3a\x78\x66\x38\xc7\x0b\xce\xf1\x62\xff"
- "\x4d\x44\x3e\x19\x70\x0c\xb7\x03\xff\x7a\x69\xe7\xd4\x40\xdb\xe7"
- "\x8d\xb8\x6d\x11\x3b\x78\x30\x7e\xd3\x92\x19\xc0\x36\x1e\x53\xd5"
- "\x89\x8a\x73\x57\x15\xdf\xf5\xf6\x56\x30\x0c\xb3\x7d\x40\xe8\xb2"
- "\x44\xe4\x95\x66\x46\x48\xdb\x01\xb7\xf3\x5d\x2b\x68\xdf\x03\xdb"
- "\xe2\xc1\xca\x0b\x15\x3a\xc5\xf9\x0c\x6c\x5f\xf0\x67\xb5\xfa\x39"
- "\xfc\x0c\xdf\x0d\xc5\xbf\x83\xaf\x21\xe7\x5f\x60\x6b\xdf\xe3\x7b"
- "\x56\x27\xaa\x18\xf8\xbe\xbb\x4a\x71\x05\xa9\x02\xbc\xd6\x3e\x58"
- "\xf9\x5d\xa0\x0e\xa5\x97\xe3\xeb\x75\xe4\x3a\xc0\xd2\x77\x83\xc1"
- "\x67\x07\xf1\x31\xfc\xb7\xc8\xfd\x7a\x59\xfc\x56\x18\x00\xd8\xb0"
- "\xf5\x9d\x05\x23\x80\x0b\x0b\x46\xf0\xfd\x1e\x48\xd4\x29\xd9\x71"
- "\x58\xf1\x1d\xab\xeb\xd6\x82\x0f\x4d\x9b\x03\x3c\xd6\x81\x6d\xcd"
- "\xb5\xd8\x2f\x57\xe1\xbb\xef\x97\x60\xbf\xac\x5b\x04\x3e\x21\xe7"
- "\x6e\xa7\xf7\x8f\xff\xfe\x9e\xf5\xa7\x19\x7c\x41\xd6\x6e\x7e\x3f"
- "\x01\x3f\xcf\xba\xfb\xe0\xc7\x76\x4c\xf5\xe9\x78\xb8\x2f\x8c\x5b"
- "\xc0\xc8\xfe\x58\x83\x12\xcf\xeb\xc3\xc7\x4f\x54\x19\x94\xeb\x6e"
- "\x22\xcc\x2b\xd1\x1a\x88\xcb\x39\x0b\xc0\xe6\xd0\x26\xd3\x75\x40"
- "\xe8\x4b\x16\x3f\x2e\x02\xdf\x2d\x00\xec\x82\xcd\xd7\x81\xfd\xb6"
- "\x40\xcc\xc3\xff\xdf\x02\xe3\x8f\x19\xce\xd3\x29\xbe\x4f\x83\xf6"
- "\x7c\x72\xda\x31\xfa\xad\xed\x98\x4a\xb0\xe1\xa7\x0f\x56\x7e\x1f"
- "\x63\xb1\x21\xbe\xa7\x75\x70\x7c\x0d\x7c\x0f\xf6\xac\x20\x18\xfa"
- "\x2e\xcf\xf2\xcc\x62\xf6\x4c\xdd\x8f\x06\xac\xd9\x8f\x3a\xae\xde"
- "\x8f\x06\x7f\x58\x0e\xfd\x72\xe9\xab\xcc\x37\x93\x8d\x30\x26\xee"
- "\xc8\xab\x69\xf7\x86\x06\xbf\x7b\x32\x2f\x7b\x26\x77\xc5\x7e\xd4"
- "\x13\xaf\x8d\x1d\x5b\x89\x10\x1e\xc3\xc7\xb6\xb8\xcc\x14\x6b\xee"
- "\x21\xb3\xef\x8e\x3c\xd3\xb2\x1e\x6d\xc7\xdc\x43\xe8\x4c\x60\x35"
- "\x4a\x8c\x83\xb1\xbc\xaa\x02\x25\x56\x33\xfa\xa2\xe4\x1b\x88\x49"
- "\x0b\xa9\x26\xb6\xbb\xd8\x73\x2c\x44\x31\xbc\x66\xd0\xfc\x4b\x20"
- "\x6a\x1d\x8d\x3c\x12\x2e\xa2\x80\xa4\x72\xa6\xc2\xb4\x21\x2c\x3c"
- "\x71\x31\x52\xee\xaf\x2a\x25\xdc\x53\x51\x6a\x3a\x8e\xd7\xa7\x3e"
- "\x08\x43\x53\x8d\xdc\x78\x94\x31\x2d\x25\x69\x26\x6a\x8f\x9f\xc7"
- "\x9b\xe5\x5e\xa5\x1b\xc1\x6e\x29\xd2\xe2\x73\x69\x24\xeb\xcf\x0d"
- "\xef\xe8\xf7\x4f\x33\x00\x6f\xf5\x4e\x4e\x8a\x62\x2a\x30\xaf\x83"
- "\xf1\x85\xe5\x82\xc5\x15\x46\xe0\x56\x91\x30\x7e\xeb\xd0\x3f\xaf"
- "\xe6\x2a\xcd\x99\xde\xc9\x12\x7f\x23\x9f\x1d\xb7\xf1\x58\x0a\xf7"
- "\x3e\x21\x10\x25\xb3\xf7\x0f\x63\xa6\x77\x1c\xe6\x53\xcc\x65\x7c"
- "\xff\x27\xe0\x59\x99\x2e\xf3\x75\x70\xfe\x28\x3c\x7e\x8e\x2d\xd3"
- "\xa2\x02\x83\x09\x6d\xba\xc9\xda\xa8\x25\xd8\xc8\x03\xbe\x53\x83"
- "\x9d\x3c\x85\xfc\x86\x7d\x66\x4e\xdb\x91\x67\x56\x11\xdf\xb0\x7e"
- "\xa9\x26\x7e\x19\x33\x17\xc1\x38\x0a\xbe\x49\x27\xbe\x31\xfb\x47"
- "\x68\xb0\x6f\xa4\x3d\xc7\xc5\x34\xb1\xf1\x05\xff\x36\x03\xf8\xc0"
- "\xb8\x30\xfb\x45\x68\xf0\x6f\xe3\x7b\xc0\xef\xcf\x30\x0e\xc6\xae"
- "\xb8\xcc\x14\x69\x2a\x50\x31\x3c\x0f\xe3\x6b\x7d\x0f\x46\x89\xf7"
- "\xf0\x83\x9f\xd8\x3d\xa4\xbe\x08\xb8\x7d\x11\x70\xfb\x22\xe0\x56"
- "\x47\x70\xfb\x75\x19\xc1\xad\x09\xee\xeb\x21\x70\xf7\x0f\x27\x20"
- "\x25\xbe\xaf\xbd\x3f\xe0\x1a\x7d\x70\x9f\x15\x14\xbb\xa3\x6f\x81"
- "\x8d\x2c\xf8\x55\xf5\x68\x8b\xed\x53\x54\x5d\x8a\x92\x30\x7e\x6b"
- "\x84\xf0\xfb\x63\xe5\xd8\x08\xf0\xcd\x7b\x80\xdf\xff\x06\x22\xaf"
- "\x72\xe4\xb1\x78\x02\xe0\xb7\x42\x08\xbf\x3f\x1e\x3f\x06\xbf\x69"
- "\x87\xdf\x28\x6b\xfc\xfe\xf8\x8e\x74\xfc\xfe\xd8\xb5\x0e\xbf\x13"
- "\x39\xfc\xce\xb4\xc1\x6f\xb9\x15\x7e\xf1\x73\x4b\xc6\xef\x8f\x29"
- "\xd2\xf0\xfb\xa3\x57\x1d\x7e\x41\x97\x6c\x9a\xc1\xda\xa8\x25\xd8"
- "\x08\xf0\xfb\x83\x0e\xec\x24\x88\xdf\xc6\xf7\xdf\xa5\xbd\xae\xfb"
- "\xef\xd2\x62\xe7\xfe\xbb\xd4\x5e\xba\xff\xca\xca\x1b\xde\x7f\x97"
- "\x82\xa4\xf9\xaf\xac\x40\xdc\x7f\x65\xb9\x4d\xc7\x7f\x97\x63\x5c"
- "\xf7\xdf\xe5\x21\xce\xfd\xf7\xd3\x45\xe9\xfe\xfb\x69\x7b\xc3\xfb"
- "\xef\xb2\xa7\x34\xff\xfd\x94\x2a\xee\xbf\x9f\xc2\xc5\xfc\xf7\x7a"
- "\x7b\x33\x63\xc6\xf3\xe6\xda\x8d\x2c\xc1\x1c\x88\xf0\x35\xdd\x40"
- "\xac\x19\xe1\x6f\x0f\xcb\xdf\x2c\xa7\x02\x5d\x6d\xf3\xb7\x97\xcd"
- "\xdf\x3e\x36\x7f\xfb\xd9\xfc\x1d\x60\xf3\x77\x47\xcb\xdf\xe0\xaf"
- "\x16\xb7\x15\x97\x77\x81\x66\x4b\xd6\x29\x74\xc3\xb9\xef\xbb\x4e"
- "\x35\xa9\xb1\xee\xeb\x2a\x74\xef\xeb\x96\x32\x86\xd6\x0a\xc4\xd4"
- "\x2a\x19\xa4\x49\x44\xcf\xdc\x54\xe8\xf2\x6a\x96\x82\x24\x54\x75"
- "\x08\x64\x6a\x92\x11\xf8\xe5\xf0\x98\x85\x80\x2f\x3d\xe8\xc4\xa4"
- "\x80\x96\xd0\xf6\x6f\xc0\x6e\xfa\x22\x8d\x1e\x78\xf9\x3f\x99\xab"
- "\x0a\xdd\x0e\xfc\x9c\x2f\x6a\xb4\xc8\xac\xea\x11\xc8\xb0\xb5\x9b"
- "\xbd\x0f\xeb\x55\x3d\x3a\x30\xdb\x16\x68\xd6\x2c\x35\x7b\x16\x57"
- "\x9e\x47\x6b\x95\x66\x75\x42\x02\xf0\xfa\xca\xc3\xe8\xc3\x4a\xa6"
- "\x22\xc1\xc8\x18\x8a\x27\x6b\xf1\x7b\xdb\x8a\xe2\xf8\x7c\x54\xa4"
- "\x3f\x8f\xf0\x98\x87\xb1\x5a\xac\x3f\x4c\xde\x13\xe3\x73\xe0\x58"
- "\x91\x7e\x2f\x2a\x84\xbf\xb5\x73\xae\xc1\x73\x5e\x99\x50\x5c\xb9"
- "\x17\x99\x32\xbc\x0f\x9a\xfd\xbc\x33\x18\x3f\xef\xac\xc2\x4a\xb8"
- "\xb7\x0c\xef\x6c\x7c\xaf\x45\x70\x1f\xec\x1e\x9d\x99\xde\xd9\x6c"
- "\xbb\xd5\x25\x6c\x0e\xc1\x94\x09\xe7\xfb\xc3\xf9\xfe\xde\x59\xf8"
- "\xfe\xf0\xbd\x09\xea\xbd\x8c\x20\x0f\xb8\xf7\x41\x13\x02\x3d\x10"
- "\xb3\xc4\x23\x40\x1a\xde\xae\xc4\x8b\xea\xc8\x8c\xa0\xe5\xa4\x5d"
- "\x4f\x39\xed\x8a\xce\x7f\x62\x32\x82\xb9\xfb\xf5\x91\xd1\xee\xd5"
- "\x40\x07\xed\x72\xf7\xab\x96\xd3\xae\xb8\x9e\xce\x08\xe1\xee\x77"
- "\xa8\x9c\x76\x4b\x1d\xb4\xcb\xdd\x6f\xb2\x8c\x76\x7f\xee\xed\xc0"
- "\x6f\x1e\xf2\xb0\xf0\xf3\x72\x47\x58\x90\x87\x83\x9f\x1d\x3c\x7f"
- "\xb0\x87\x3c\x0c\x94\x8b\xe6\xbf\x31\x06\xe4\xf9\xbf\xdc\xa1\xff"
- "\xe5\xf9\xbe\x5c\x74\xff\x47\xec\x7b\x79\x7e\xbf\x26\x8a\x7f\xac"
- "\x8d\x99\x8c\x91\xb9\x4c\xbb\xf9\x25\xe6\x0d\xbf\xc9\x35\xb7\x1b"
- "\xf9\xe9\x32\xf3\x50\xf4\xfa\x62\x18\xf3\xb2\x90\xef\xeb\x39\x97"
- "\x99\xa1\x6c\xce\xe9\x9a\x76\x71\x36\x52\xa6\x29\xcd\xca\x7d\x8b"
- "\x4a\x95\xc5\xc6\x01\x38\x6e\x99\xb6\x2f\x30\x28\x7e\x0b\xc7\x4f"
- "\x46\x23\x54\x3d\x2f\x10\x91\xb6\x7e\x93\xbb\x36\x71\x28\x1a\x6b"
- "\x42\x38\xc7\x51\x3d\x66\xee\x65\xe6\x54\x02\x70\xfc\x3b\x10\x5f"
- "\xb3\x0c\x78\x2c\xf5\x85\x6b\x8d\x80\x63\x68\xc7\x80\x0e\x98\xf5"
- "\x8a\x31\x7a\xf6\x5c\x3d\xe8\x51\x3d\xb3\x61\xe4\xa7\x78\x4c\x66"
- "\x92\x02\xd1\x72\xf8\xfb\xba\xe2\x7a\x1f\x95\x1e\x29\xb7\x80\x56"
- "\x7d\xb0\xf2\x7a\x4f\x9d\xe2\xbf\x9e\x58\xbf\x82\x4e\xae\x4c\xba"
- "\x83\xf3\xf9\xf3\x4b\xf6\x9b\xf5\xca\x65\xa0\x9b\xf1\xf9\x2f\x6a"
- "\x90\xf2\x94\x1e\xe7\x06\xae\x87\x9d\x8c\x43\xc8\x41\x3e\xc7\xc3"
- "\xec\x37\xb5\x1c\x5f\x8f\xdb\xc1\x79\xd2\x75\x66\xb0\xb3\xdf\xb4"
- "\x14\x7c\xdf\x4c\xc6\x1b\x61\xda\x45\x78\xcc\xb9\xae\x1b\xd1\x9d"
- "\x79\x80\xc7\x10\x18\x3b\x3a\xdc\x84\xbf\xd9\x7c\xc0\x52\xa6\x84"
- "\xf1\x6b\x93\xc2\xac\x6d\x3d\xb4\xa8\xba\x0a\x69\x17\xd4\xa0\xab"
- "\x8a\xeb\x57\xf0\x6f\xdf\xf5\x9b\xaa\xab\xf6\x9b\x5a\x01\xf7\x50"
- "\x66\xb9\x5f\xfc\x5b\x96\xe3\x38\xff\xc1\xdd\xa3\xf1\x64\x82\xf8"
- "\x3d\x32\xcb\x3a\xb4\x1d\x1b\xc0\xe8\xb1\x2d\xb5\x89\x55\x70\x2f"
- "\x15\x73\xb1\xbd\x99\x8c\xa9\x07\xab\x93\x02\x3b\x93\x7c\xe0\x7f"
- "\xb3\x70\x5e\x09\xc6\x86\xed\x24\xc7\xe3\xbd\x9d\x9d\xc3\x03\xb1"
- "\x9f\xd9\x3e\x20\x1a\x73\xa1\xdb\x8a\xff\xb2\xf9\xc0\x09\x81\x4a"
- "\x89\x7a\xea\xbf\xac\xfe\xd5\x76\xc6\x76\xa8\x78\x07\x7e\xef\xf7"
- "\x57\x15\xff\x3d\x46\x72\x1c\xde\x79\xf8\xf7\xe0\x9c\x20\xf8\xcd"
- "\x3c\x26\xa3\x4d\x32\x3e\x0f\xbe\x2f\xe3\xbe\xd7\x5a\x7d\xaf\x85"
- "\x7b\x36\x70\xdf\x1b\xb9\xef\x4f\x5b\x7d\x7f\x5a\xd3\x19\xe7\xfc"
- "\x2a\xba\xe2\x67\x82\xf1\x2e\x17\xbe\x3f\x8c\xdf\x27\xb0\xcf\xe4"
- "\xef\x9d\xcb\x9d\x77\xb8\x52\x51\x31\xe4\x2e\xe0\x0b\xbe\x3f\x66"
- "\x75\xfd\xb1\x53\xf1\xbd\xd1\xeb\x39\xd8\xa6\x15\xa1\x3a\x8f\x76"
- "\x41\x24\x4f\xf4\xdf\x51\xac\x2d\x60\xfc\xb4\x6e\x4f\xa7\xa8\xe8"
- "\x88\xc7\xc8\x6a\xe0\x91\x70\x4e\x5f\xfc\x9b\xd6\xf6\x8f\x8a\x8d"
- "\x7d\x3f\x56\xdd\x2d\x52\x1d\x39\x3b\x42\x3d\xfd\xfd\xf9\x73\xe2"
- "\x86\x74\x8b\x7c\x12\x21\x2b\xec\xf8\x30\x4b\xbd\x19\x73\xc6\xa4"
- "\xc0\xe2\x2c\xe0\x6f\x4a\x1f\x18\xcb\x6b\x50\x06\xf8\xd5\xb8\xe1"
- "\xcf\xc8\xd4\x6e\x56\x9a\x69\xc3\x28\x94\x74\x0f\x29\x13\x03\x98"
- "\x2b\xda\x45\xaf\x81\x0f\x2a\x6e\x60\x0e\x51\xac\x46\x28\x15\xb0"
- "\xaa\x5d\xf4\x2f\x38\x76\x43\xc1\xbe\x6f\x08\x27\xc7\xbe\x4c\xcc"
- "\x57\xfe\x33\xb1\x54\x59\x10\x5e\x85\x4e\x05\xe8\xd1\x69\x75\x15"
- "\xca\xc6\xc7\xcd\x25\xec\x7b\x1f\x38\x7f\x1c\xfe\x2d\x9c\x3b\xc3"
- "\xff\x27\x79\xc0\x8a\x0b\xf8\x77\xd4\x1d\xf0\xfb\x88\x8a\x8b\xf8"
- "\xf7\xe0\xf9\x4a\x55\xd9\x48\x01\xfd\xc8\x0b\xce\xcb\x34\x67\x4e"
- "\x0a\x64\xfb\xfa\xca\x8a\x14\xa3\xd2\x77\xce\x96\xf5\xc8\x73\xeb"
- "\x7a\x84\xb2\xdb\x22\x8f\x07\x2b\x6f\x24\xeb\x3c\x7a\x79\x61\x7b"
- "\x41\xd3\x5e\x77\x95\xe8\x55\x38\x96\xa1\x43\xe9\x09\xf8\x18\xf4"
- "\xa9\x6a\xb1\xd8\x81\xdf\xc3\x19\xb6\xf7\x4f\x33\xfb\x4d\x0a\x60"
- "\xc0\x16\x86\xae\xfd\xb5\xde\x1a\xc0\x0b\xf4\x1b\xc6\x7f\x52\x40"
- "\xa5\xe2\x97\xb4\xaf\xf2\x10\x4a\xc4\xfd\x14\xec\xb1\xe7\xbe\x01"
- "\xbf\x7f\x43\x7b\xef\xeb\xe1\xef\x59\x69\xbb\x16\x18\x94\x5f\x0f"
- "\xcf\x43\xea\x37\x31\xc7\xba\xd9\xea\x8d\x48\xc6\xd8\x23\x14\x78"
- "\x69\xf9\x5f\xd1\x37\x65\xf9\xc8\x6b\x32\x52\xd5\xd5\x86\x8f\x43"
- "\xca\xb1\x3a\xf8\x7b\x3e\x52\x16\x19\x4c\xec\x7b\x80\xc4\x61\x38"
- "\x9f\x5f\x88\x70\x8e\x9f\x51\x7e\xdc\x75\x5f\x95\x01\xe2\x53\x45"
- "\x0b\xbc\x96\xdc\xec\xb3\x27\x05\x5f\x33\xb5\x9a\x7b\x37\x76\x97"
- "\x7b\x37\x76\x97\x7d\x37\xb6\x1c\xbf\x17\xc3\xef\xc3\x12\xc2\x19"
- "\xb3\x69\x5e\x60\xdb\xb1\xe1\x2a\x06\xb7\x89\xdf\x95\xb5\x06\x4d"
- "\xc1\xcc\x0b\x6c\xb3\x31\x16\xf9\x15\xe9\x2b\x50\x71\x45\x3e\xda"
- "\xbc\x00\xf9\x31\x77\xa3\x5b\x15\x9c\xfe\x1a\x31\xeb\xbf\x48\x3e"
- "\x90\xa8\x6d\x61\xc2\xf9\x94\xbb\x01\x4f\x7a\x2f\x51\xe0\xf7\x02"
- "\x6d\x52\x63\x51\xcf\xad\x55\xa8\xf7\xd4\x6b\xc9\x6c\x9d\x28\xbc"
- "\xa7\x9f\xf1\x6e\xa0\xba\xf6\x6e\xe0\x73\x35\xf3\x02\x3b\x7b\xeb"
- "\xc9\xbb\xb4\x29\x33\x7d\x10\x7e\x5f\xc6\xac\xbc\x58\xba\x15\xe7"
- "\xb4\xab\xf5\xc8\xe8\xbb\x27\x05\xe3\x13\x7e\xb7\x23\x7e\xff\x92"
- "\xb4\x10\xf9\x98\x7f\x0e\x44\x85\x95\x55\xe8\x25\xc0\x0d\x7e\xd7"
- "\xb0\xe5\x2a\x79\xd7\x60\x4a\xdf\x91\x87\xdf\x37\x3c\x98\x17\xa8"
- "\x1c\x7d\x0b\xc6\xae\x95\x37\xf6\xd6\x74\xeb\x9f\x76\x26\xf0\x12"
- "\x1e\x1f\xfa\xd2\x7e\xff\xcb\x14\x79\xfd\xfe\x97\xc9\xf8\x3a\xfc"
- "\xfe\x8d\x01\x3c\xef\xad\xc2\x7e\x03\xff\x55\xe9\x95\x21\xe5\x8c"
- "\xb1\xb0\x7c\x37\xf8\xa7\x94\xe7\x1f\xd6\x9f\xb1\x06\xe5\xf5\x48"
- "\xf0\xcb\x35\xe2\xab\x82\x6a\xf0\xd3\x49\xdc\x46\xb8\x7a\x1f\xf8"
- "\x1a\xf4\x94\xb2\xc0\x70\x89\xad\x73\x81\xfd\xb5\xb7\x26\xbf\x45"
- "\x8d\xdf\xc8\x5c\xfc\x1e\xf3\x41\xd7\xfe\x07\x1f\x66\x4c\x34\xd4"
- "\xfa\x4d\xf2\x74\xf0\x4e\x73\x39\xf6\xd7\xe2\x99\xc8\xb3\xa0\xfc"
- "\x02\x62\x7d\x36\x97\xf3\x19\x9e\xfb\xf6\x41\x60\x1b\xe3\x83\xc0"
- "\xb6\x1b\xc1\x57\x45\x71\x3a\xb4\xa9\x0a\xf9\x15\x57\x94\xe2\xf7"
- "\x3d\xad\x42\xc6\x21\x14\xb2\x8b\x31\x17\x9e\xfe\x81\xf5\xdf\x7e"
- "\xf0\x9f\x11\xfc\x87\xdf\x73\xd6\xf9\x6f\x01\xf8\xef\x3e\xf8\xef"
- "\x16\xf5\x9f\xe9\x01\xf8\xef\x01\xf8\xef\x03\xf0\x5f\xb5\xad\xff"
- "\x7e\x98\x8c\xdf\x85\xe2\x77\x4e\xd8\x7f\x78\xbe\xb5\xf9\x83\xc0"
- "\x8e\xec\x3b\xd0\xe9\x81\x68\xeb\x34\xe4\xd9\xcb\x80\x14\x49\x27"
- "\x91\x0f\xdc\xa7\xcf\xf3\x60\x5f\x68\x0f\xf0\x7d\x15\x15\xe7\x99"
- "\xd0\x87\xef\xa0\xce\xd8\x9f\x46\xce\x9f\xc5\xc6\x23\xe8\xfe\x83"
- "\x40\x25\xb4\x39\x60\xe3\x7d\x34\x78\xd4\x35\x35\x3a\x33\xbe\x10"
- "\x81\x3f\x82\xcc\x99\x53\x0f\xca\xef\x87\xbf\x06\xb8\xde\x0f\x6f"
- "\xa5\x3f\xee\x87\x72\xfb\xe1\xad\xbe\xc2\xfd\xf0\xf6\x35\x79\xfd"
- "\xf0\x76\xf9\xe3\x7e\xd8\x94\xfa\xe1\xed\x12\xdb\x7e\x58\xc7\x15"
- "\x62\xa3\x66\x47\xcc\x9c\x33\x73\xce\x7b\xea\x69\x0b\xe3\xa2\xe6"
- "\x11\xc6\xc0\xe3\x0c\x81\x26\xf3\x50\xe5\xc7\x30\x9e\x7e\x13\x50"
- "\x8a\x0e\x74\x28\x55\x9a\x27\x05\x78\x30\x69\xc7\x4b\xcc\x69\x27"
- "\x42\x3f\x06\xfe\x8b\xfb\x6b\x06\xf0\xda\xeb\x8a\x5a\x8f\x7f\x77"
- "\x04\xce\x17\x7b\x13\xe1\xff\x93\x77\xb2\x49\x03\xf0\xba\xc5\xac"
- "\x0d\x4c\x05\x5e\xb7\xf8\xf5\x70\x3c\xf6\xdf\x99\xff\x54\x18\x8c"
- "\xeb\x93\x02\xd0\xc3\x49\x61\xca\xd5\x3f\x20\x4f\xef\x52\x34\xca"
- "\x6c\x66\x18\x6d\xe2\x4d\xe0\x5a\x86\x51\xda\x89\x37\x91\x7a\x91"
- "\x27\x9c\x7b\x7f\x9f\x7a\xd1\x12\xfc\x6f\xba\x7a\xd1\xca\xcb\xf0"
- "\xef\x38\x36\x77\xd2\x8e\xa9\x60\x36\x4c\xd4\x98\x3e\x1f\xa8\xc3"
- "\xef\x2b\xb7\xb6\x63\xca\xf7\x03\xc7\xdf\x5f\x63\x50\x2e\xab\x02"
- "\x7c\x2c\x7d\x96\xc1\xef\x1d\xf1\x7b\xcd\x65\xb1\x60\x63\xe0\x9a"
- "\x84\x0f\xde\x3b\x84\xfb\x4b\xea\x06\xa6\xfc\xc4\xf5\x52\x25\x7e"
- "\xef\x8a\xfb\x50\xb5\x5f\x9b\xe4\xe5\xf0\x2c\x70\x9f\xba\x4d\xed"
- "\x98\x32\xbd\xff\xa4\x40\x0f\x35\x52\x3e\x58\x79\xa7\x02\x78\x49"
- "\x2e\xe6\x14\x29\xf0\xdd\x6a\xf8\x8e\xbc\x03\xbc\x17\xc3\xb4\xd4"
- "\x1f\xc6\x71\x0b\xf0\xab\xb8\xad\xa8\xea\xf7\x10\x9e\x33\x95\xe8"
- "\x81\x0a\x43\xe6\x24\x4f\xe3\x8e\xfe\x07\x8d\x98\xc7\x75\xeb\xaf"
- "\xad\xf1\x9f\x68\x30\x66\x4e\xc2\xfb\xb8\x28\xc8\xf9\x77\xef\xe0"
- "\xe7\xa8\xf5\x1b\x85\xe0\xfc\xea\xbb\x7e\x7f\x46\x77\x33\x66\xa5"
- "\x7d\x1d\x7f\x90\x8b\x67\x55\x11\x21\x59\x5c\x3c\xcb\x82\xfe\x12"
- "\x06\xf1\x2c\xcc\x3e\x9e\x91\xb9\x01\x26\x44\xe2\x5a\x21\x6e\xab"
- "\x1c\xf7\x17\xcc\x0d\xf7\x81\x2d\x70\x5f\xc0\x98\x67\xe3\x1b\xc4"
- "\x36\x4b\xbf\xc0\x7d\x06\xc7\x30\xb6\x8f\xda\xf4\x11\xdc\x2f\x9e"
- "\xd2\x23\x1f\xdc\x2f\x70\x8c\xc3\xfd\x02\xcf\xb9\xf9\xf8\x3e\xe9"
- "\x17\xde\x65\xc8\x87\xed\x1b\xc6\x7c\xb6\x6f\x60\x5d\x50\x60\xb4"
- "\x89\x6b\x56\xfd\x62\x8d\xa5\x5f\x58\xe2\x1a\x60\xdf\x88\xfb\xc5"
- "\x07\xfc\x7e\x31\xe9\x92\x0f\x62\x63\xde\xca\x8b\x93\xb3\xa1\x5f"
- "\xe0\x3c\x96\xc9\x12\xd7\xa0\x5f\xe0\x35\x41\x6c\x5c\xfb\x33\x17"
- "\xd7\xf4\x70\x1c\xfa\xc3\x96\x59\xfc\xb8\xf6\xf0\x81\x33\x7e\x71"
- "\xf7\xb8\xbc\xb8\x76\x97\xd5\x10\xd8\x57\xd8\x6f\xd8\x5f\xd8\x47"
- "\xcd\xc9\x3f\x38\x6e\x99\x7c\x44\xe2\x96\x80\x7f\x00\xcf\x95\xf0"
- "\x7f\x3b\x1f\x31\x2b\xbf\xdf\x6e\x1d\xbb\x70\xcc\xc2\xf1\x0b\xc7"
- "\x2d\x1c\xc3\x70\x3f\xc0\xb1\x8b\x8d\x5b\x10\xd3\xe1\xef\x8a\xc2"
- "\xe8\xab\x6c\x4c\x4b\xba\x86\x7c\x92\x46\xa0\xce\x38\x86\x15\x1b"
- "\xef\x21\x1c\xd3\x58\xff\xf9\x52\xff\xe1\x18\xb6\x69\x01\x1a\x3c"
- "\x7a\xa6\x1a\xe1\xd8\x05\xb6\xdf\x79\x26\xf0\x02\x62\xf5\xc0\xd2"
- "\xa7\x47\x6e\x6d\x0b\xfd\x76\x3d\xf2\xc8\x68\x8b\x3c\x1f\xac\xbc"
- "\x97\x6a\xaf\x05\xee\xe5\x5a\xb4\x00\xee\xb3\xb8\xef\xea\x14\x77"
- "\x58\x0d\xa7\xed\x30\x08\xc7\xa0\xc3\x44\xcf\x85\x85\x92\xbc\x7b"
- "\xed\x11\xf6\x6f\xd0\xd1\x54\x43\xdf\xbb\x45\xde\xb5\x83\x66\xf6"
- "\x7f\x23\x8c\xc9\x6c\x93\x82\x6d\x89\x9f\x6d\x6a\x77\xc0\x5c\xe6"
- "\x54\xdd\x3a\x6c\x9f\x4c\xd0\xe3\x99\x53\x2b\x28\xbe\xee\x77\x3a"
- "\x13\x8f\xd0\x84\x78\xa9\xf8\xba\xcf\xce\xff\x67\x7e\x0c\x7b\x9a"
- "\x99\x14\xe6\x61\xfe\x31\xac\x05\x60\x21\xe0\x7d\x53\x32\xba\x9f"
- "\x96\xd4\x3b\xc9\xc8\x54\xa8\x17\xa1\x1e\x10\x03\x17\x7f\x0d\xfa"
- "\xfb\xeb\x38\x84\x8a\x43\x63\xc0\xaf\x89\x07\x0f\x98\xf5\x1e\xf0"
- "\x7c\x71\x5b\xc1\xce\x10\x5b\x3d\xac\x63\x2b\x89\xa3\x77\xe2\xd8"
- "\x79\xde\x69\x49\x43\x71\x5b\x63\xf3\x91\xb7\xfa\x8f\x78\x2e\x9f"
- "\xa1\xd3\xc2\xc5\x08\xaf\x4f\x6d\x71\x5d\xf1\xe0\xc6\xc3\xf5\x63"
- "\x0e\xc2\xf5\x6d\x98\x1f\xc7\x2b\x34\x7f\x84\xf1\x65\xd2\x78\x05"
- "\x9e\x5b\xb0\x3b\x31\x4b\x69\x86\x63\x64\xae\x52\x16\xc2\xdf\xa7"
- "\xd6\x78\xb0\x3c\xca\x0c\xe7\x14\x55\x67\xa1\xd4\x05\x9e\x08\x9f"
- "\x4f\xe6\xbf\x65\x21\x7c\xfe\x9a\x58\x1f\x76\x6e\x02\x7b\x9d\x31"
- "\x0b\xe1\x6b\x4d\x70\xfc\x23\xb3\x17\x5a\xbb\xc8\x0f\x7d\x1d\x5a"
- "\xc4\xb6\xf1\x75\xe8\x57\x08\xb7\x01\x98\x87\xff\x9f\x40\xeb\x16"
- "\x04\x40\x1f\xcf\x82\xef\xbf\x43\xeb\x6e\x77\x84\x7f\xaf\xc3\xe7"
- "\x3e\xba\xa9\x78\x90\xfa\x75\xa8\x19\x79\x2f\x79\x95\x01\xec\x32"
- "\xc5\x78\xcd\x63\x22\x6a\x09\xf7\x9e\x59\x5c\x9a\x06\x63\xdd\xfd"
- "\x04\xbc\x26\x9e\x49\x9a\x54\x69\x66\x26\xdd\x32\x27\x4d\xba\x8d"
- "\x7f\xdb\xc4\x4c\xfa\x15\xff\xf6\x9a\x45\x6a\x6e\x3e\x6c\x16\x3b"
- "\x77\x2f\xf5\x7e\x57\x84\xef\x15\xff\x2e\xfe\xbd\x75\xb1\x81\xdc"
- "\x6f\xf6\x64\xef\x0d\xff\x26\x6e\xd3\xfa\x37\xf1\x7e\xf3\xea\x3f"
- "\xe1\xdf\x34\xb4\x82\x7f\x7d\xc1\x1f\xc9\xd8\x0f\xf8\xf7\xcd\x4c"
- "\x58\x0b\x26\x29\x4c\xc5\x5e\x13\x5f\x21\x74\xcd\x10\xee\x1a\xb6"
- "\x16\x01\xbe\xa6\x86\x9c\xcf\xb6\x01\x63\x1f\xbb\x7f\xc8\x0b\x61"
- "\x5a\x64\xef\x43\xc3\x3d\x32\x16\x1a\xce\x90\xb1\x90\xf8\x94\xc5"
- "\xca\xa4\xb0\x16\xe0\x37\x1f\x3c\x6e\x42\x1b\x39\x75\x6d\xfc\x18"
- "\xa6\xc2\xfe\xc6\xb8\xb1\x60\x09\xe3\xc8\x82\x21\xf6\x3e\x35\x08"
- "\x59\x63\x06\xfe\xef\xc9\xb5\x73\xcd\xd2\x0e\xdc\x03\xb2\xe0\xe8"
- "\x05\xf8\xde\x1e\x47\x35\xc7\x29\x8e\x6a\xa6\x18\x12\x19\x06\xe3"
- "\x48\x3b\x71\x29\xb4\xf3\xb0\x17\xbd\x9f\xf1\x0a\x8c\xb1\x66\x86"
- "\xad\x54\xec\xa7\x17\x12\x90\x1f\xf7\x3c\x26\xf6\x79\x12\xb4\x7e"
- "\xf8\x5e\x2d\xcf\x81\xef\x61\xad\x59\x8d\x2c\xcf\xb1\xae\xa6\x2b"
- "\xb4\x7b\x1b\x91\x6b\x6a\xfa\xe0\xb6\x2d\x36\x00\x9f\x21\xcb\x35"
- "\x96\xf3\xd7\x9a\x03\xe1\xbe\x7b\xb2\xd7\x10\xcc\x5d\x17\xc0\x4f"
- "\xcd\x62\x5b\xcc\x3d\x95\x80\x80\xc8\x02\x77\x9a\x58\x85\x7f\x67"
- "\x23\xb9\xb7\x7f\x9a\x6a\xe0\x37\xc0\x07\x4a\xee\xf8\x21\x2b\x4c"
- "\x70\xed\x1b\x84\xda\xbf\xc4\x6b\x3f\x0c\xda\x8f\x87\xf6\x31\x37"
- "\x9b\x88\xf3\x60\x35\x6c\x1d\x80\x17\xe2\x49\xfb\x16\xdc\x32\x69"
- "\x21\x46\xcd\x22\x3c\x7f\xb4\x36\x97\xc4\xd3\x3b\xec\x1e\x20\xec"
- "\xbc\x25\xa5\x39\xd7\x6c\x33\x6f\xc9\x7a\x5e\xdb\x81\x44\x3d\x37"
- "\x67\xa9\x96\xad\x69\x01\xf1\xb5\x1a\x73\xcc\x7d\xc0\xcf\xe8\xbc"
- "\xa5\x1f\xf0\xf7\xab\xb4\x0b\xae\x5a\xcd\x5b\xaa\x65\xf5\xbe\x4e"
- "\x51\x7b\x18\xb4\xa4\x12\xfe\xd6\x90\xe3\x77\x3a\x5a\x1f\xa7\xf3"
- "\x02\xc9\x71\x3c\xe7\x9a\xcb\xbb\x56\x9e\xca\xc3\xb9\xb7\xda\x02"
- "\x4b\xbe\x53\x44\xab\xba\xce\x81\x95\x2d\xd5\x75\x1c\x18\xfe\x2f"
- "\xce\x81\x8d\x0b\x1d\x72\x60\xa5\x2a\xba\x8e\x03\x2b\x15\x67\xd9"
- "\x7e\xaf\x54\xec\x63\xfb\xbd\x52\xc1\xee\x83\xbb\x16\xda\x33\x7e"
- "\x3a\x5f\xcf\x7c\x3e\x20\x19\xe3\x7c\x0b\x70\xda\x03\x0b\xf2\x95"
- "\xfb\x40\x27\x9b\x94\xcf\x32\xcb\xc0\x76\xb8\x5e\xdb\xb2\x45\x30"
- "\x4e\x1b\xcf\xa3\x22\x0f\xcc\x81\xaf\x42\x3b\xa8\xb0\x88\x7d\x2f"
- "\xf7\x46\x38\xb1\x8b\xf1\x02\xf8\x42\x55\x6c\x30\x20\xf6\x3c\xf8"
- "\x0e\xc6\xb5\x72\xcc\x81\x4f\x98\xf3\x95\x5b\xc0\xa6\xf0\x01\x8e"
- "\x3c\x5f\x6b\xcd\x91\x1f\xac\x34\x79\x08\x72\x63\x25\x4a\x31\xae"
- "\xb4\xe6\xc6\xa6\x71\x98\x1b\xe3\x3c\x39\xe6\x01\x66\xc2\x89\x0f"
- "\x02\x3f\xd6\x62\x9e\x8c\xb9\xb1\x99\xc7\x8d\x99\xd6\x8e\xb9\xb1"
- "\x69\xf1\x63\x6e\xec\x2e\x37\x16\xd3\xfc\xe6\x8b\xf2\xb8\xb1\xb9"
- "\xf4\x31\x37\x7e\x54\xdc\xd8\x7c\xda\xc2\x8d\xcd\x4b\x9f\x7e\x39"
- "\x7b\x3d\xf4\x57\x0b\x37\x5e\x8d\x76\xda\x71\xe3\xd5\xe8\x98\x3d"
- "\x37\x36\x05\x50\x6e\x6c\xcc\xe3\x71\x63\x65\xcb\x73\x76\xdc\x58"
- "\xa9\x68\x25\xc6\x8d\x21\x2e\x55\x62\x6e\x8c\x31\x85\x79\x32\xe6"
- "\xc7\x70\x9f\x15\x2c\xbe\x94\x8a\x81\xb2\xb8\xb1\x52\x31\xc0\x25"
- "\x6e\xac\x54\x6c\x14\xe6\xc6\xc6\x78\x71\x6e\x6c\x8c\x17\xe4\xc6"
- "\x4a\xd5\xc0\x3a\x4e\xa3\x54\xb5\x68\xf2\xdc\x58\xa9\xdc\x29\xc8"
- "\x5f\x94\xca\x43\x2c\x37\x56\x2a\xb2\xea\x9d\x1b\x43\x9b\x82\xdc"
- "\x58\xa9\xea\xc6\xf2\x08\xa5\x22\xdb\x8e\x1b\xe3\x6b\x84\xb8\xb1"
- "\x52\xf5\x0e\x77\x4d\x16\x8f\x1b\x73\x6d\xc0\x98\x38\x5f\x94\x1b"
- "\x2b\x3d\x7c\xc9\x18\xa9\xba\x42\xb8\x31\xf1\xa9\x1d\x37\x56\xaa"
- "\x8e\x3a\xe5\xc6\x1c\x86\xd8\xfb\x14\xe3\xc6\x4a\x0f\x85\x3d\x37"
- "\x36\xc6\x0b\x72\x63\x65\x8b\x8b\x14\x47\x2d\x16\xf2\xb8\xb1\xd2"
- "\x23\xb8\x59\x70\x63\x71\x6c\xed\xe4\x71\x63\x65\x8b\xf6\x92\xb9"
- "\xb1\xb2\xc5\x68\x49\xdc\x98\xc5\x9c\x00\x37\x56\xb6\xd8\x68\x8b"
- "\x39\x1e\x37\x56\xb6\x38\x22\xc8\x8d\x95\x2d\x0a\x79\xdc\x98\x6d"
- "\x5f\x80\x1b\x2b\x5b\x3c\xe4\xb5\x6f\xcb\x8d\x95\x2d\xfd\x79\xdc"
- "\x98\x3b\xaf\x8e\x1b\x2b\x5b\x1e\xe3\xf8\x56\x17\xc9\xdc\x58\xd9"
- "\x32\xc7\x21\x37\x56\xb6\xdc\xc1\xe3\xc6\xca\x96\x2c\xfe\x75\xca"
- "\x96\x25\x2c\x37\x56\xb6\x4c\x25\xdc\xd8\xa8\xb6\x3e\x4e\xb9\x31"
- "\x39\x6e\xc7\x8d\x57\xb7\xac\x70\xc2\x8d\x87\xba\xce\x8d\x7d\x0d"
- "\xf9\x75\xdc\xd8\xd7\x60\xe1\xc6\x78\xff\xa0\x6c\xe0\x9b\xd9\x2c"
- "\x3f\xfe\x1a\x7d\x1d\x89\xef\xff\x89\x8d\x8e\xf9\xb1\x77\x20\xe5"
- "\xc7\xad\x17\x92\xbe\xdf\x7a\x0a\xe1\xc7\xad\x3b\xd5\xe5\x88\x81"
- "\x1b\x63\x8e\xcc\xe5\x88\xcf\xa7\xc2\xe7\xc0\xa2\x7c\x96\x1f\xe3"
- "\xb9\xf1\x98\x23\x63\x7e\x8c\x79\x32\xe6\xbe\x85\xcb\x11\x2a\xd2"
- "\x1b\xf0\xbc\x8e\x12\x6d\x67\x6c\xd7\xd6\xad\x80\x57\xe3\x3c\x4f"
- "\x09\x5c\xab\x3b\x50\x65\xc0\xeb\x2c\xca\xd6\x5e\x85\x6b\x74\xe4"
- "\x1a\xf8\xbe\x14\x5f\x03\xe7\x94\x11\x5f\x78\x45\x91\xf1\x93\xe3"
- "\xd7\x4a\xcf\x7e\x3c\x7e\x4d\xce\x3d\x6f\xe1\xd7\x39\x70\x0f\xf0"
- "\xf1\xc0\xdc\x1a\x73\x6c\xe0\xd6\x05\x39\x1b\x98\xfc\x2d\xed\x98"
- "\xd3\x0f\x56\x7b\x46\x5b\x38\xf6\x1a\x38\xb6\x16\x8e\xc1\x7d\x94"
- "\x9c\xce\x45\xe8\x78\x95\x16\x73\x07\x5d\xce\x75\xe4\x01\x3e\x2b"
- "\x5d\x06\xbf\x8f\xaf\x87\x6b\xb2\x2d\xd7\xc0\xf8\x5e\x40\x38\xb9"
- "\x57\x57\xb3\x75\xbe\x5a\xe9\x79\xa3\x8e\x93\x83\x9d\x70\x3e\x1c"
- "\xef\xcb\xc5\xf2\xf2\x6e\xfd\xb5\x46\x0b\x2f\xf7\xb7\xe2\xe5\xca"
- "\x27\x77\x58\x78\x39\x5e\xdf\x54\xc7\xcb\xe3\x38\x5e\xae\x6c\xe5"
- "\x2f\x93\x97\x9f\x6f\x2a\xbc\xdc\x4b\xa1\xf0\xf0\x0a\x27\xbc\x3c"
- "\x7b\x41\xfd\xf0\x72\xcc\xc9\x31\x0f\xc7\x9c\x1c\x73\x74\xcc\xcb"
- "\x31\x47\x37\x73\xbc\x7c\x8b\x15\x2f\x37\x5b\xf1\x72\xb3\x35\x2f"
- "\x57\x3e\x39\x57\x16\x2f\x57\x3e\xa9\xa9\x07\x5e\xfe\x48\xfd\xf3"
- "\x28\x78\x79\xa0\x0d\x2f\xc7\x3c\x1c\xfa\x5e\x39\xe6\xe7\xc5\x5a"
- "\xb0\xcd\x5c\xe0\xe8\xc0\xcf\x9d\x72\x73\xe5\x93\x93\xad\xb9\xf9"
- "\x96\xb6\xd6\xdc\xdc\x6b\xb8\x3d\x37\xf7\x0a\xb3\xe2\xe6\x05\x3a"
- "\xa5\xe7\x5e\x36\xee\x43\xff\xd6\x4e\xc3\xbc\xdb\x33\x80\xcf\xcd"
- "\xdb\xee\xb2\xe7\xe6\x5e\x3b\x04\xb9\x39\xd1\xdf\x7c\x6e\xee\x3f"
- "\xb5\xdc\x58\xc7\xcd\xbd\x2e\xc8\xe3\xe6\x5e\xe7\xeb\xb4\x83\xf2"
- "\x89\x72\x32\xbe\x78\xc5\x89\xf1\xf5\x07\x3e\xd6\x7c\xbd\x75\x30"
- "\xe5\xeb\x71\x94\xaf\x2b\x9f\xc8\x12\xe5\xeb\xf0\x1d\x3b\x77\xdc"
- "\x27\x69\x28\x6e\x0b\xf3\x2c\x88\x95\xe5\xea\x58\xcc\xb5\xda\x3c"
- "\xc4\x5c\x0b\xe2\x53\x39\x9e\x73\x0d\x7f\x9f\xb1\xf0\x76\x56\x5f"
- "\x62\xee\xbe\xa8\x29\xf2\xab\x36\x91\xc2\xfc\xaa\xcd\x5c\xcc\x63"
- "\xd8\xf5\xac\xca\xd6\x41\x60\x93\xf2\xfa\xe5\xef\xad\x83\x84\xf9"
- "\x7b\x9b\x6b\x84\xeb\xb4\x1e\x85\xfd\xc2\xe7\xef\x70\x8d\x20\x7f"
- "\xf7\x6e\xcf\x5d\x13\xc4\xe7\xef\xa4\x0d\x18\xb3\xfb\x89\xf3\x77"
- "\xef\x73\x64\x0c\xf7\xde\x46\xc6\x70\xe2\x63\x7b\xfe\xee\xbd\xd0"
- "\x9a\xbf\x63\xff\xdb\xf3\x77\x82\x29\xf6\x3e\x45\xf9\xbb\xf7\x49"
- "\x3b\xfe\x0e\xbf\x89\xf9\xbb\xd1\x0a\x57\xd9\x18\x57\xd3\x30\xae"
- "\x7c\x0f\x61\x5c\xe1\x71\x52\x3d\x03\xe3\xca\x77\x9c\xc1\x6c\xe1"
- "\xf1\xab\xa1\x3d\x1f\x5f\x5b\x1e\x8f\xe3\x85\x23\x9c\x69\x62\x51"
- "\x67\x8c\x35\x8c\x33\x8b\xdf\xf0\xf9\x18\x6f\x0d\x8b\x35\x9f\x12"
- "\x61\xac\xf9\x5c\x62\xfd\xcc\x61\x0d\xe7\x13\x09\xaf\x67\x9f\xef"
- "\x8e\x34\x5e\x8f\xaf\xf1\xed\x26\x8d\xd7\x63\x2c\x0a\xf1\x7a\xdf"
- "\xb9\xb6\x58\xe4\xf3\x7a\xdf\x35\xc2\xbc\xde\x77\x07\x9f\xd7\xe3"
- "\xf6\x85\x78\xbd\xef\x39\x5e\xfb\x76\xbc\xde\xf7\x16\x9f\xd7\x93"
- "\xf3\x28\xaf\x6f\x9b\x41\x62\xf1\x13\x43\xa4\xf3\xfa\xb6\xf3\xb9"
- "\xf8\x4e\x78\xfd\x55\x5b\x5e\xdf\x76\x31\x9f\xd7\xb7\x0d\x25\xf1"
- "\xb5\xed\x4e\x03\xcb\xeb\xdb\x46\x92\xe3\x4f\x0c\xb6\x3e\x5e\xc7"
- "\xeb\xb9\xe3\x06\x6b\x5e\xaf\xc5\xbc\xbe\xad\xd6\x09\xaf\x0f\x75"
- "\x9d\xd7\x77\x1e\x4a\x79\x7d\xe7\xa1\x8e\x79\xfd\xd3\x73\x1d\xf3"
- "\xfa\x67\x12\x28\xaf\x6f\x5f\x48\x62\x42\xfb\x43\x24\x26\xb4\x67"
- "\x39\x10\xf4\x2b\x9a\xf7\x9e\xcb\xce\xb1\xce\xdf\x5f\x95\xaf\x3c"
- "\x10\xcb\xe5\xbd\xef\x03\xa7\x5f\x00\xfc\xbc\x9a\xf0\x73\x88\x99"
- "\xa7\x31\xaf\xc7\xfc\x9b\x70\xfa\xf6\x53\xe0\x98\x0e\x6c\x7e\x1a"
- "\xda\xd2\xed\x5d\xa4\x55\xe2\xb9\x55\xf8\x5c\xe8\xef\xa5\xa9\x30"
- "\x8e\xc0\xf1\x52\x38\x47\x8b\xaf\x81\x63\xe7\xb5\xb1\xec\x75\xc1"
- "\x98\xfb\xc3\x75\x5a\xf8\xbe\xcc\xe6\xba\x12\x7c\x5d\x51\x3c\xcb"
- "\xed\x4b\x88\xef\x02\x76\xc1\xf1\x02\xaa\x03\xfc\x86\xb0\x3a\xa0"
- "\x9a\xd3\x01\x70\x2e\xb4\x95\xcf\xea\x80\x69\xa0\x03\xe0\xbe\xe1"
- "\x63\xad\x03\x8e\x81\x0e\xc8\x03\xdd\x72\xf8\xc1\x6a\x3f\x8d\x95"
- "\x0e\xc8\xc3\xbc\x1f\x6b\x00\xcc\xfd\x61\x5c\x3b\x8c\x75\xc1\xf1"
- "\x1a\x1d\x9e\x4f\x7e\x1e\x74\x40\x29\xbe\xde\xea\xda\xbd\xd6\xd7"
- "\xe2\xf3\xe1\x1e\xb5\xac\x86\x00\x3e\x07\xf7\x50\x96\x73\x95\xd5"
- "\x10\x05\x70\x6d\x09\xd1\x10\x7e\x3a\x2b\x0d\x71\x8c\x68\x88\x80"
- "\x68\x5e\x5e\x5f\xe9\xdf\x4b\xba\x86\x68\x77\xc3\x61\x6e\x5f\xe9"
- "\xff\x8e\x14\x0d\x01\xcf\x9d\x6f\xe1\xa9\x76\xf3\xf8\xf0\x3c\x73"
- "\xe0\xaa\x98\x97\x3a\x9c\x0f\xc6\x71\x56\xcc\x51\x31\x3f\xc5\x3c"
- "\xd5\x25\x8e\x0a\xf7\x5f\x60\xa8\xc7\xdc\x7e\x4b\xd0\x10\x0b\xc4"
- "\x35\x84\x45\x3f\xb0\x39\x7d\x4e\x43\x40\x1f\x63\x35\x44\xf6\x52"
- "\x2b\x0d\xd1\xd2\x4a\x43\x28\xac\x35\x44\xbb\x23\xf2\x34\x44\xbb"
- "\xc3\xf5\xa0\x21\xf2\x1f\x6b\x08\xb9\x1a\xa2\x5d\x6e\x9d\x86\x50"
- "\x72\xf9\xfd\xb6\x16\x0d\x11\x90\x62\xaf\x21\x02\xb2\xad\x34\xc4"
- "\x31\x9d\xd2\x4f\xcf\xf2\x73\x56\x3f\xf8\xa9\xf9\xfa\xa1\xf3\x1d"
- "\x7b\xfd\x10\x70\x4d\x9e\x7e\x68\xef\x2f\x4f\x3f\xb4\xf7\x23\xf7"
- "\x87\xdf\x4d\x3e\xad\x27\xe3\x58\xc0\x61\xaa\x29\x9e\xce\xb3\x3e"
- "\xe6\x5c\x53\xb4\xcf\x11\xd6\x14\x4f\x6b\xc4\x35\xc5\xd3\x1a\x71"
- "\x4d\xf1\xcc\x68\xcc\xfd\xb0\x7e\x80\xf6\x81\xfb\x3d\xd3\xde\xfa"
- "\x5d\x40\xaa\x13\x9e\x67\xab\x27\x34\xd3\x88\xfe\x68\x78\x9e\xd7"
- "\x21\x4f\x98\xe7\x75\x38\x83\x39\x94\x91\xe5\x79\xed\xb3\xb3\xeb"
- "\x5d\x53\xb4\xcf\x16\xd6\x14\xcf\x0c\x24\x3c\xab\x7d\xae\xbd\xa6"
- "\x80\x6b\x04\x35\xc5\x33\xb3\xb9\x6b\xb2\xf9\x9a\x82\xb4\x01\x7c"
- "\x61\x95\xb8\xa6\xe8\xd8\x8d\xf0\x87\x67\xee\x11\xfe\x40\x7c\x6c"
- "\xaf\x29\x9e\xb1\xce\xff\x8a\x68\x0a\x82\x29\xf6\x3e\x45\x35\x45"
- "\x47\x7f\x7b\x4d\xf1\xb4\x06\x6b\x0a\x61\x5c\x75\x7a\xc8\xc7\x55"
- "\xa7\x8d\x7c\x4d\xd1\x31\xca\x56\x53\x34\x43\xac\xe5\xd1\xf7\x03"
- "\xf8\x99\x3a\x0d\x94\xae\x23\x3a\xcd\x96\xa6\x23\x30\xfe\x84\x74"
- "\x44\xa7\xa3\xb6\xf8\xe3\xeb\x88\x4e\x17\x84\x75\x44\xa7\x5b\x7c"
- "\x1d\x81\xdb\x17\xd2\x11\x9d\xdb\xf3\xda\xb7\xd3\x11\x9d\xfb\xf1"
- "\x75\x04\x39\x8f\xea\x88\xce\x65\x24\x26\x3f\xed\x2f\x5d\x47\x74"
- "\x3e\xee\x58\x47\x74\x3e\xc3\xd7\x11\x9d\xb3\x48\x4c\xed\xac\x27"
- "\x3a\xa2\xf3\x5e\x72\xfc\x69\x3f\xeb\xe3\x54\x47\x90\xe3\xf6\x3a"
- "\xe2\x59\x4f\x27\x3a\xc2\xcb\xb8\xbd\xff\xc1\x9a\xae\xfd\xb5\xb5"
- "\x7e\xb3\x74\x2f\x94\xbf\x6a\xaa\xdb\x8f\x20\x1c\xb8\x42\x19\x70"
- "\x87\x08\xa4\xc4\x6b\xfa\x13\xcf\x01\x27\x88\x20\xf3\xfd\x31\x2f"
- "\xd8\xbf\x00\xf3\x38\x6d\x0b\x5c\x3f\xb1\x26\x63\x64\xae\xb1\xe7"
- "\xa0\x12\xcc\x0f\x1e\x6e\xef\x9f\x66\xc8\x98\x68\x78\x88\xe7\xfa"
- "\xc7\x20\xe5\xd4\x4a\x61\x6e\xf7\x61\x19\x63\x06\xcc\x7b\x8e\x9d"
- "\x4c\x78\x5d\x61\xf4\x35\x16\xc7\x98\x33\xe0\xf5\x18\xc5\xd5\xa5"
- "\x2c\x87\xf0\x0a\x1f\x8a\xb2\x13\x91\x5f\xeb\x4a\xe4\xd3\x5a\xa1"
- "\x68\x19\x02\x28\x30\x01\x7f\x18\xd1\x9d\x31\xbf\x10\x39\x14\xd7"
- "\xf0\x69\x43\x38\x44\x5e\x0b\x23\xc7\x21\x3e\xba\x8f\x7a\xe6\xe0"
- "\xfc\x70\x21\xe5\x0e\x0f\x2d\xdc\xce\x8a\x37\x4c\xb9\xe5\x83\x72"
- "\x96\xf2\xe7\xfa\xd7\xa6\x53\xde\x80\x39\x03\x33\x15\xb8\x9d\x81"
- "\xcc\xd7\x58\x34\x8e\xcc\xf5\xef\x59\x8e\x94\x5b\xdf\x45\x9e\x05"
- "\xe1\x57\x71\xee\x27\xa0\xa0\x7c\x07\x5a\x18\x8c\x3a\x1b\x31\x4f"
- "\x00\xae\x57\x50\x9e\x89\x70\x7d\xc2\x6c\xe0\x0a\x59\xf7\xd1\x60"
- "\x3c\x1e\x8f\x8a\x20\x7c\x81\x8c\xc5\xea\x6d\x67\x02\xcf\x20\xe9"
- "\x5c\x4f\x9d\x8b\x1c\xad\xbb\xdd\x0e\xbc\xbe\x6b\xff\x34\x13\xf8"
- "\x92\xd4\xa5\x0c\x57\x9b\x3f\xfd\x00\xed\x07\x1c\xee\xb9\x5a\xa1"
- "\xc0\x35\xb6\xf1\x7e\x93\xe6\xbd\x83\x4a\x78\xbe\xa9\xe5\x7c\x53"
- "\x4b\x7c\x83\xfd\xf2\xae\x06\xe1\x7a\x86\x6d\xb0\x4f\x8a\x0d\xa5"
- "\xc8\xfc\xa1\x65\xcf\xc9\xde\x68\x8b\x99\xf8\xc3\x54\x1b\xdd\xca"
- "\x0c\xb6\xc7\x75\xbb\x00\x0f\x2c\x87\x4b\xc5\xfb\x50\x2e\x51\xb4"
- "\xc6\x1c\x0e\xf0\xfd\xe4\xd6\x1a\xf0\xc3\x15\xe2\x07\x66\xa9\x0f"
- "\xfb\xaf\xf1\xc3\x40\x35\xb4\xfd\x5c\x6d\x2d\xf8\xc2\x60\xeb\x8b"
- "\x8b\xa5\x78\xbf\x4a\x5c\x53\xcf\x98\x4e\xea\x06\xb2\xbe\xf8\x30"
- "\xb0\x23\xae\xb9\xc1\xae\x97\xa9\x0d\xc4\xf1\xd2\x67\xcb\x75\xbc"
- "\xce\x87\xf8\xc0\xc4\xd9\x1e\xef\x5d\x89\xed\x8d\xf9\x59\x31\xf0"
- "\x32\x76\xfd\xca\xea\x67\x3b\xd6\xee\xe8\x9f\x86\xe7\xd2\xdc\x56"
- "\x3e\x27\x6f\xfe\xaf\xf2\xb9\x8e\x8f\xde\xf6\xea\x66\x68\x7b\x75"
- "\x05\xb5\xfd\x6f\x37\xca\xb3\xfd\x6f\xb3\x1e\xbd\xed\x7d\x9a\xa1"
- "\xed\x9f\x8b\xa4\xb6\xef\x26\x93\xff\x77\x13\xad\x7f\x85\x6d\x8f"
- "\xf3\x50\x96\x1c\x94\x25\xff\x84\xc7\x38\xa2\x55\x7a\x16\xd0\xf9"
- "\x96\x3d\x0b\xac\xe7\x5b\x7e\x73\x1a\xaf\x3f\xe7\xe6\x5b\x2a\xbb"
- "\xdd\x70\x9c\x77\xea\xe1\x47\xf3\x4e\x81\xf3\x09\x6f\x0c\x7c\x87"
- "\xf0\xc6\x40\x76\x4e\xc3\xe2\x4b\x48\x69\xfc\xdd\x40\xdd\xfe\x39"
- "\x5a\x25\x5e\x7b\xb4\xff\xb6\x41\x99\x5a\x05\x3c\x50\xf9\x2c\x83"
- "\xf3\x40\x6b\x62\x41\x6f\xc0\xd8\xac\x99\x81\x9e\xbd\xa9\x7c\x3e"
- "\x1d\xd7\x29\x3b\x71\x5b\xab\x4c\xc3\xe7\x3c\xf7\x01\xda\xdb\x41"
- "\xaf\xc0\x63\xdb\xfe\x39\x06\xa5\x05\x2f\x96\x35\x86\x60\x43\xad"
- "\xc9\x7f\x96\xee\xee\x8e\xfe\x07\x2d\x73\x22\x8d\xfb\x06\x95\x08"
- "\x62\x08\xaf\x5d\x04\x1c\x61\xcc\xe0\xb5\x86\x16\x3c\x61\x1c\x15"
- "\x19\x2a\x10\xde\x87\xc7\xbb\x02\xf9\x30\x80\xa1\x49\xbb\xc0\xbf"
- "\xd6\x38\x4a\x13\xc1\xd1\x46\x3e\x8e\xee\x72\x38\x02\x3c\x51\x1c"
- "\xd1\x75\x87\x93\x25\xe1\xa8\x92\xc3\x51\xba\x0d\x8e\x6e\xa9\xd1"
- "\x37\x65\x97\x38\x1c\xfd\x56\x67\xec\x66\xc1\xd1\xf3\x53\xce\x4c"
- "\x06\x1c\x4d\x96\x8a\xa3\xe7\x27\xf3\xb5\x6d\xaf\x85\xf6\xda\xf6"
- "\xf9\x93\xb6\xda\xd6\xa2\x65\xef\xfa\x4f\xd5\xdd\xcd\x9c\x5a\x5e"
- "\xed\x6f\xd1\xb3\xcf\x5f\x93\x87\xe7\xe7\xcb\x5d\x9b\xab\x16\x38"
- "\xc2\x76\xae\xda\x1e\x56\xa7\x76\xab\xc4\x58\x13\xd6\xa9\xe4\x3b"
- "\xfb\x39\x46\xdd\xaf\xd1\x39\x46\xdd\x0f\x35\xfd\xb9\x6a\xdd\xc7"
- "\x0b\xeb\x85\xee\x53\xc8\x5c\xb5\xc0\xe1\xf5\x3f\x57\x2d\x70\xb8"
- "\xb0\x2e\xed\xce\xe5\xff\x03\x83\xec\xe7\xaa\xc1\x35\x82\xba\xb4"
- "\x47\x0b\xee\x9a\xe1\x7c\x5d\x4a\xda\x80\x78\xd2\x45\x5c\x97\xf6"
- "\x38\x4e\xe2\x4b\x8f\x35\x24\xbe\x10\x9f\xda\xeb\xd2\x1e\x51\xd6"
- "\xba\x54\x78\xae\x1a\xc1\x10\x7b\x9f\xa2\xba\xb4\xc7\x3e\x7b\x5d"
- "\xda\xad\x42\x78\xae\x5a\xcf\x15\x14\x47\x3d\xbb\xf1\xe7\xaa\xf5"
- "\xb8\xd7\x3c\xe6\xaa\x89\x62\x6b\x3c\x7f\xae\xda\x0b\x67\xa4\xcf"
- "\x55\x7b\xe1\xa1\x34\x2d\x8a\x31\x27\xa4\x45\x7b\x8e\xb0\xc5\x1c"
- "\x5f\x8b\xf6\x8c\x10\xd6\xa2\x3d\x17\xf2\xb5\x28\x6e\x5f\x48\x8b"
- "\xf6\xdc\xc1\x6b\xdf\x4e\x8b\xf6\x3c\xc9\xd7\xa2\xe4\x3c\xaa\x45"
- "\x7b\x45\x92\x18\xda\x2d\x5d\xba\x16\xed\x35\x02\x9f\xb3\x6f\x13"
- "\x79\x67\xc4\xd7\xa1\xbd\x46\xf3\x75\x68\x2f\x6e\x3e\x5a\xaf\x78"
- "\x32\x4f\xad\x57\x5f\x72\xbc\x5b\x9a\xf5\x71\xaa\x43\xc9\x71\x3c"
- "\x4f\x8d\xcc\x4f\xeb\x95\x22\x4d\x7f\xbe\xd4\x04\xf5\x67\x6f\x07"
- "\xfa\xb3\x77\x33\xd5\x9f\x2f\x75\x91\xa7\x3f\x5f\x52\x3f\x7a\x1e"
- "\xde\x1c\x35\x50\xaf\x6c\xca\xc3\x7b\xe7\xc8\xe3\x2d\xbd\xb3\x1f"
- "\xbd\xed\x9b\xa3\x06\x7a\x29\x9a\xda\xfe\xe5\xf6\xf2\x6c\xff\x72"
- "\x80\x7c\x0d\x34\xb0\x84\x6a\xa0\x81\x25\xe2\x1a\xe8\xe5\x5b\x8e"
- "\x35\x50\xff\x00\xaa\x81\xfa\x71\x73\x6a\xfb\x71\x73\x6a\xfb\x75"
- "\x92\xae\x81\xfa\x66\x3e\xd6\x40\x52\x34\x50\xef\x72\xaa\x81\xfa"
- "\x46\xc8\xd3\x40\x7d\xc3\xf9\x1a\x68\xd0\x62\x7b\x0d\xd4\xf7\x8c"
- "\xeb\x1a\xa8\xef\x0d\x79\x78\xee\x5b\xe1\x9a\x06\xea\x17\x2c\xac"
- "\x81\x5e\xd6\x8b\x6b\x20\xf2\x9d\x3d\x77\x7d\xe5\x06\xe5\xae\xaf"
- "\x1c\x69\xfa\x1a\xe8\x95\x30\x61\x9e\xfa\x4a\x04\xd1\x40\xfd\x82"
- "\xea\x5f\x03\xf5\x13\x99\xef\xf7\xca\x05\xc2\x17\xfb\x8d\xb2\xd7"
- "\x40\xfd\x44\xe6\xfb\xf5\x6f\xc5\x5d\x63\x33\xdf\x8f\xb4\x01\xf1"
- "\xa4\x9b\xb8\x06\xea\x7f\x92\xc4\x97\xfe\xa4\xae\x0b\xe7\x53\x7b"
- "\x0d\xd4\x7f\xa6\x73\x0d\xd4\x8f\x9b\xef\xd7\xcf\xc1\x7c\xbf\xfe"
- "\x87\xec\x35\xd0\xcb\x95\xc2\x1a\x68\xe0\x2a\x8a\xa3\x81\xdd\xf9"
- "\x1a\xa8\xff\xc3\xe6\xa1\x81\x44\xb1\x15\xc6\xd7\x40\x03\xce\x4a"
- "\xd7\x40\x03\x4c\xd2\x34\x50\x3f\x91\x79\x7d\x03\x83\x6d\x31\xc7"
- "\xd7\x40\x03\xa3\x84\x35\xd0\xc0\xc5\x7c\x0d\xd4\x4f\x64\x5e\xdf"
- "\xc0\x5d\xbc\xf6\xed\x34\xd0\xc0\x33\x7c\x0d\x44\xce\xa3\x1a\x68"
- "\x50\x34\x89\xa1\x2f\x67\x4a\xd7\x40\x83\x82\xc5\x35\xd0\xa0\x71"
- "\x7c\x0d\x34\xa8\x2b\xd1\x3a\x83\x12\x88\x06\x1a\x34\x80\x1c\x7f"
- "\x39\xc3\xfa\x38\xd5\x40\xe4\x38\xd5\x40\x83\x52\xa5\x69\xa0\x67"
- "\x9b\xa0\x06\x52\x3b\xd0\x40\xea\x66\xaa\x81\x06\x77\x93\xa7\x81"
- "\x06\x77\x7d\xcc\xc3\xe5\xf0\xf0\x41\xb9\x94\x87\x0f\xd9\x26\x8f"
- "\xb7\x0c\x71\xf8\xfe\xd3\x31\x0f\x1f\x11\x46\x79\xf8\x88\x30\x71"
- "\x1e\xfe\x07\xc7\xf5\xcf\x94\xaf\xe5\x52\x1e\x3e\x4c\x41\xc6\xc9"
- "\xa1\xd7\xc8\x38\x39\x74\x87\x74\x1e\x3e\xb4\xd3\x63\x1e\x2e\x85"
- "\x87\x0f\x8e\xa1\x3c\xfc\xd5\x1b\xf2\x78\xf8\xab\x15\x7c\x1e\xfe"
- "\xc7\x16\xf6\x3c\x7c\xe8\x68\xd7\x79\xf8\xd0\xb9\xf2\xf0\x3c\x54"
- "\xe3\x1a\x0f\x1f\x7a\x4e\x98\x87\xff\x21\x5e\x9c\x87\x93\xef\xec"
- "\xf9\xd3\x6b\x73\x29\x7f\x7a\x6d\x48\xd3\xe7\xe1\xc3\x74\xc2\x5c"
- "\x69\xd8\x0d\xc2\xc3\x87\x96\xd4\x3f\x0f\x1f\x5a\x22\xcc\xc3\x5f"
- "\x9b\x42\x38\xcb\xd0\xf3\xf6\x3c\x1c\xae\x11\xe4\xe1\xaf\xa5\x73"
- "\xd7\x94\xf0\x79\x38\x69\x03\xe2\xc9\x3e\x71\x1e\xfe\x7a\x30\x89"
- "\x2f\xaf\xb7\x27\xf1\x85\xf8\xd4\x9e\x87\xbf\x76\xc7\x39\x0f\x27"
- "\x18\x62\xef\x53\x94\x87\xbf\x3e\xd0\x9e\x87\xff\x41\xb8\xa6\x94"
- "\x72\x84\x2f\xc5\xd1\xf0\x43\x7c\x1e\xfe\xfa\x92\xe6\xc1\xc3\x45"
- "\xb1\xa5\xe3\xf3\xf0\xe1\xe3\xa4\xf3\xf0\xe1\x2b\xa4\xf1\x70\x8c"
- "\x39\x21\x1e\x3e\xfc\x9c\x2d\xe6\xf8\x3c\x7c\xf8\x2d\x61\x1e\x3e"
- "\xa2\x05\x9f\x87\xe3\xf6\x85\x78\xf8\x88\x3e\xbc\xf6\xed\x78\xf8"
- "\x88\xd1\x7c\x1e\x4e\xce\xa3\x3c\x7c\x84\x9e\xc4\xd0\x3f\x48\xaf"
- "\x29\xa5\x1c\x71\x4e\x9c\x87\x8f\xb8\xc8\xe7\xe1\x23\xf6\x12\xbe"
- "\xfd\x47\x0f\xc2\xc3\x47\x68\xc9\xf1\x3f\x74\xb4\x3e\x4e\x79\xf8"
- "\x1f\xea\xea\x49\x11\x1e\xfe\x47\x3f\x69\x3c\xdc\xbb\x09\xf2\x70"
- "\x1f\x07\x3c\xdc\xa7\x99\xf2\xf0\x91\xfb\xe4\xf1\xf0\x91\x7b\xe5"
- "\x73\xc1\xb1\x91\x94\x0b\x8e\x8d\x14\xe7\x82\x41\x4b\x1c\x73\xc1"
- "\x51\x7b\x29\x17\x7c\xa3\x35\x89\xd5\x21\x77\x48\xac\x0e\x39\x24"
- "\x9d\x0b\x86\x74\x7f\xcc\x05\xa5\x70\xc1\x3f\x06\x52\x2e\x18\x7c"
- "\x4f\x1e\x17\x0c\xae\xe6\x73\xc1\x50\x5f\x7b\x2e\x18\xf2\x8e\xeb"
- "\x5c\x30\x64\xb1\x3c\x2e\x18\x92\xe0\x1a\x17\x0c\xb9\x24\xcc\x05"
- "\x83\x96\x8b\x73\x41\xf2\x9d\xfd\x18\x3e\x6a\x31\x1d\xc3\x47\x05"
- "\x37\x7d\x2e\xf8\x46\xa5\xf0\x78\xfd\xc6\x3d\xc2\x05\x43\xca\xea"
- "\x9f\x0b\x86\x94\x09\x73\xc1\x51\x33\xc9\xb8\x19\xa2\xb3\xe7\x82"
- "\x70\x8d\x20\x17\x1c\x95\xc3\x5d\x53\xc6\xe7\x82\xa4\x0d\x88\x27"
- "\x47\xc5\xb9\xe0\xe8\x09\x24\xbe\x8c\xee\x46\xe2\x0b\xf1\xa9\x3d"
- "\x17\x1c\x65\x72\xce\x05\x09\x86\xd8\xfb\x14\xe5\x82\xa3\x47\xd8"
- "\x73\xc1\xa0\x64\x61\x2e\x38\x96\xd6\xa9\x55\x8e\x39\xce\xe7\x82"
- "\xa3\xd7\x34\x0f\x2e\x28\x8a\xad\x4a\x3e\x17\x1c\x33\x45\x3a\x17"
- "\x1c\x93\x2e\x8d\x0b\x62\xcc\x09\x71\xc1\x31\x97\x6c\x31\xc7\xe7"
- "\x82\x63\x1e\x0a\x73\xc1\xb1\xbe\x7c\x2e\x88\xdb\x17\xe2\x82\x63"
- "\x87\xf0\xda\xb7\xe3\x82\x63\xdf\xe1\x73\x41\x72\x1e\xe5\x82\x63"
- "\x8d\x24\x86\x06\x75\x97\xce\x05\xc7\x5e\x12\xe7\x82\x63\xaf\xf1"
- "\xb9\xe0\x58\x6e\xcd\x59\xa8\x0f\xe1\x82\x63\x0b\xc8\xf1\xa0\x40"
- "\xeb\xe3\x94\x0b\x92\xe3\x94\x0b\x86\xaa\x9d\x71\x41\xc7\xfc\xe1"
- "\xed\x63\x94\x3f\xbc\x7d\xcc\x9a\x3f\x9c\xe5\xf1\x87\xd0\x93\x8e"
- "\xf9\xc3\x04\x0f\xca\x1f\xde\x8a\x22\xfd\xfb\xad\x60\xd2\xbf\xdf"
- "\x62\x6b\xf8\x2d\x1e\x0d\xe3\x3c\xf0\x87\x7d\x37\x0f\x12\xfe\x70"
- "\xd3\xa0\xfc\xe8\x36\xc7\x1f\x2a\x91\x67\xea\x1c\x8e\x3f\xbc\x8b"
- "\xf9\xc3\x9b\x4b\x30\x7f\xf0\xca\x06\xae\x5a\xce\x71\x57\x0d\x70"
- "\xd7\x72\xf8\x1b\xfa\xce\x09\x68\xa3\x08\xf8\x65\x1a\xbe\x1e\xef"
- "\xdb\x00\x6d\xb1\x6b\x39\xd9\x75\x9e\xba\x16\x78\x3f\x20\xcc\x2d"
- "\xf0\xfe\x1a\x4e\xf7\xd6\x28\xe7\xf6\xd6\x88\xe4\xef\xad\x81\xf7"
- "\xd4\xc0\xfb\x6b\x64\xc7\x22\xbf\xcd\x1c\xa7\x68\xb3\x44\xd1\x06"
- "\xef\xaf\xd1\xa6\x9a\xf0\xd3\x7d\xe6\x7c\xc2\x4f\xe7\x05\x3c\x09"
- "\x5c\xa8\xe7\x96\x2a\xca\x25\x3e\xc6\x3c\x62\x5e\xa0\xba\x7a\x5e"
- "\x60\xe7\xbb\x77\x03\x9f\xb3\xdf\x57\xe3\xfb\xed\x78\x4f\x80\xe2"
- "\xf8\x52\x96\x47\xb0\xfb\x31\xbc\x17\x88\xb6\xce\x40\x9e\xc0\x8b"
- "\x15\x2f\x02\x3f\x7d\xbe\x23\xdc\x7b\x21\xf2\x31\xdd\x0d\xec\x68"
- "\x5d\xaf\x11\xee\xdd\xc7\x7c\x37\x10\x15\x84\xff\xc0\xae\xeb\x34"
- "\x72\xeb\x3a\xf5\xf3\x02\xf1\x5e\x03\x03\x36\xc5\x5a\xf1\x53\x7f"
- "\x0b\x3f\x7d\x73\xb4\x3c\x7e\xfa\xe6\x28\x3e\xaf\x08\x9b\x69\xcf"
- "\x2b\xde\x3c\xe4\x3a\xaf\x78\x53\x66\xfd\x97\x37\xcf\xbb\xc6\x2b"
- "\xde\xea\x67\xcb\x2b\x76\xb1\xbc\x22\xf4\x34\xc6\xa0\x30\xaf\x20"
- "\xdf\xd9\x8f\x07\xe3\x2f\xd0\xf1\x60\xfc\xb6\xa6\xcf\x2b\xc6\x0f"
- "\x17\x8e\xfd\xe3\x47\x13\x5e\xf1\x56\xdf\xfa\xe7\x15\x6f\xf5\x15"
- "\xe6\x15\xe3\x4f\x92\x18\xfc\xd6\x00\x7b\x5e\x01\xd7\x08\xf2\x8a"
- "\xf1\xf7\xb8\x6b\xfa\xf2\x79\x05\x69\x03\xe2\x8c\xaf\x38\xaf\x98"
- "\x40\xf6\xf0\x50\x4e\x58\x4c\xe2\x0e\xf1\xa9\x3d\xaf\x98\x30\xc1"
- "\x39\xaf\x20\x18\x62\xef\x53\x94\x57\x4c\xc8\xb1\xe7\x15\xa1\x5a"
- "\x61\x5e\xf1\xf6\x7c\x8a\xa3\xb7\xfd\xf9\xbc\x62\xc2\xb5\xe6\xc1"
- "\x2b\x44\xb1\x35\x9c\xcf\x2b\xfe\x74\x44\x3a\xaf\xf8\xd3\x0d\x69"
- "\xbc\x02\x63\x4e\x88\x57\xbc\xdd\xcf\x16\x73\x7c\x5e\xf1\xf6\x38"
- "\x61\x5e\xf1\xf6\x4c\x3e\xaf\xc0\xed\x0b\xf1\x8a\xb7\x33\x79\xed"
- "\xdb\xf1\x8a\xb7\x0f\xf1\x79\x05\x39\x8f\xf2\x8a\xb0\xf1\x9c\x36"
- "\x9b\x29\x9d\x57\x84\xf5\x13\xe7\x15\x61\x43\xf8\xbc\x22\xcc\x87"
- "\xf0\x87\xb0\x68\xc2\x2b\xc2\xba\x92\xe3\xa1\xd1\xd6\xc7\x29\xaf"
- "\x20\xc7\x29\xaf\x08\x8b\x7f\xbc\xde\xb2\x29\xe6\x98\x26\xfa\xca"
- "\x1b\xc3\x27\xfa\x3c\xfa\x77\xbd\xcd\x71\xbd\x65\x58\x2a\x7d\xd7"
- "\x3b\x69\x8d\x3c\xde\x32\x29\xf5\xd1\xdb\xbe\x39\xce\x35\x9e\x18"
- "\x46\x6d\x3f\xa5\x95\x3c\xdb\x4f\xf1\x7c\xf4\xb6\x6f\x8e\x73\x1c"
- "\x26\x9d\xa7\xb6\x7f\x77\x85\x3c\xdb\xbf\x2b\xba\xff\xb5\x73\x5d"
- "\x3a\xc3\x6a\x8e\xc3\x8c\x30\x71\x5d\x3a\xf5\x1d\xc7\xba\x74\xba"
- "\xd5\x1c\x87\x69\xdc\x1c\x87\x08\x6e\x8e\x43\x04\x3b\xc7\x21\x11"
- "\xeb\xd2\x4f\xe7\xeb\x0f\xc4\xe6\x29\x71\xad\xaf\x7d\xb1\x06\x25"
- "\xf8\xc4\xc3\x88\x75\x29\xd8\x7a\x4d\x0d\xd6\xa5\xa7\xb9\xbc\x76"
- "\x44\xa7\xa2\x0a\xab\x3d\x2d\x94\x53\x77\xd1\x9a\xbb\xa7\x11\xfe"
- "\xee\x44\x55\x9e\x32\xad\xc6\x26\xe7\x0d\x6d\xaa\xe7\xf0\x73\xde"
- "\x38\xd7\xfd\xd0\x6a\x6f\x0a\x53\xe6\x2c\x9d\xb3\x9c\xb7\x6d\xbe"
- "\x3b\xa7\x06\xf9\x35\xdf\x9c\xf7\x94\x50\x9a\xf3\x0e\x97\x39\xff"
- "\x21\xdc\x66\xfe\xc3\x7b\x02\xf3\x1f\x22\x24\xcc\x7f\x88\x90\x39"
- "\xff\x21\xc2\xc5\xf9\x0f\x11\x76\xf3\x1f\x88\x36\x9d\x3a\x39\x51"
- "\x54\x9b\x92\xef\xec\x35\xc5\x74\xab\xf9\x0f\xd3\x9b\xc1\xfc\x87"
- "\x69\x22\xef\xa8\xa7\x71\xf3\x1f\x22\x1a\x60\xfe\x43\x84\xc8\xfc"
- "\x87\xe9\xdc\xfc\x87\x08\x81\xf9\x0f\x11\x22\xf3\x1f\xa6\x73\xf3"
- "\x1f\x22\x6c\xe6\x3f\x44\x70\xf3\x1f\xa6\x3b\x98\xff\x10\xc9\xcd"
- "\x7f\x88\xe4\xe6\x3f\x10\x9f\xda\x6b\xd3\xe9\x2e\xcc\x7f\x88\xe0"
- "\xe6\x3f\x44\x38\x98\xff\x10\x29\x30\xff\x61\x6a\x98\xb0\x36\x9d"
- "\x61\x35\xff\x21\xca\x66\xfe\x43\x64\x33\x99\xff\x20\x8a\x2d\x9b"
- "\xf9\x0f\x51\x32\xe6\x3f\x44\x49\x9c\xff\x10\x21\x32\xff\x21\xea"
- "\x9c\x2d\xe6\xf8\xda\x34\x4a\x64\xfe\xc3\x0c\x9b\xf9\x0f\x11\x22"
- "\xf3\x1f\x66\xf4\xe1\xb5\x6f\xa7\x4d\x67\xd8\xcc\x7f\x88\xb0\x99"
- "\xff\x30\x83\x9b\xff\x30\x55\x21\x5d\x9b\xce\x70\x30\xff\x61\x86"
- "\xcd\xfc\x87\x19\xdc\xfc\x87\xf7\xb8\xf9\x0f\x33\xb8\xf9\x0f\x53"
- "\x91\xf5\x71\xaa\x4d\xc9\x71\xaa\x4d\xdf\x93\x38\xff\xe1\xf1\x5a"
- "\xcc\xc6\xd1\xa6\xd1\x32\xe7\x3f\x44\x3b\x9c\xff\xf0\x58\x1f\x89"
- "\x71\xf4\xf7\x02\x29\x47\x9f\xd5\x5d\x1e\x6f\x99\x15\xf8\xe8\x6d"
- "\xdf\x1c\xf5\x51\x74\x35\xb5\xfd\x9f\x77\xc8\xb3\xfd\x9f\xb7\xcb"
- "\xd7\x47\xf3\xe2\xa9\x3e\x9a\x17\x2f\xae\x8f\x62\x9c\xec\xff\xa7"
- "\xd1\x52\x7d\xf4\x7e\x17\xc2\x51\xde\x6f\x41\x38\xca\x9c\x33\xd2"
- "\xf5\xd1\x9c\x21\x7c\x7d\x14\x73\xf6\xb1\x3e\x92\xab\x8f\x66\x69"
- "\xa8\x3e\x9a\xd3\x4a\x9e\x3e\x9a\xe3\xc9\xd7\x47\x71\xdd\xec\xf5"
- "\xd1\x9c\xd9\xae\xeb\xa3\x39\xe9\xf2\xb0\x3e\x27\xcd\x35\x7d\x34"
- "\xe7\x8e\xb0\x3e\x8a\x49\x10\xd7\x47\xe4\x3b\x7b\x5e\xab\x49\xa7"
- "\xbc\x56\x33\xa5\xe9\xeb\x23\x0d\x12\xe6\xb0\x9a\x56\x44\x1f\xcd"
- "\xd1\xd7\xbf\x3e\x9a\xa3\x17\xd6\x47\x1a\xb2\xff\xab\x72\x4e\xb5"
- "\xbd\x3e\x82\x6b\x04\xf5\x91\xe6\x10\x77\x8d\x9e\xaf\x8f\x48\x1b"
- "\x10\x6b\x0a\xc5\xf5\xd1\xdc\x99\x24\xf6\xcc\x1d\x48\x62\x0f\xf1"
- "\xa9\xbd\x3e\x9a\xeb\xeb\x5c\x1f\x11\x0c\xb1\xf7\x29\xaa\x8f\xe6"
- "\xbe\x63\xaf\x8f\x62\x44\xf6\x55\x9b\xd7\x87\xe2\x28\xf6\x1c\x5f"
- "\x1f\xcd\xdd\xd6\x3c\xf4\x91\x28\xb6\x10\x5f\x1f\xc5\xce\x95\xae"
- "\x8f\x62\x77\x48\xd3\x47\x18\x73\x42\xfa\x28\xf6\x8e\x2d\xe6\xf8"
- "\xfa\x68\x5e\x6b\x61\x7d\x34\xaf\x1b\x5f\x1f\xe1\xf6\x85\xf4\xd1"
- "\xbc\x71\xbc\xf6\xed\xf4\xd1\xbc\xd9\x7c\x7d\x44\xce\xa3\xfa\x28"
- "\xce\x87\x1b\xd3\x64\xec\xab\x36\xef\x8e\xb8\x3e\x9a\xf7\x90\xaf"
- "\x8f\xe6\x15\x10\x1d\x14\xd7\x95\xe8\xa3\x79\x3a\x72\x3c\x46\x6d"
- "\x7d\x9c\xea\x23\x72\x9c\xea\xa3\xb8\xbe\x8f\xd7\x69\x36\x45\x7d"
- "\x34\xbf\x50\x9e\x3e\x9a\x5f\xf0\x98\xa3\xcb\xe1\xe8\x71\x41\x94"
- "\xa3\x7f\x10\x2c\x8f\xb7\x7c\x10\x24\x9f\xa3\x27\x75\xa4\x1c\x3d"
- "\xa9\xa3\x38\x47\x8f\xef\xe4\x98\xa3\x27\x44\x52\x8e\xbe\xe8\x0c"
- "\x19\x27\x17\xed\x22\xe3\xe4\xa2\x99\xd2\x39\xfa\xc2\x2b\x7c\x8e"
- "\x1e\x3f\xfb\x31\x47\x97\xcb\xd1\x17\xf8\x51\x8e\xbe\x70\x9f\x3c"
- "\x8e\xbe\x70\x2f\x9f\xa3\x27\x9d\xb5\xe7\xe8\x8b\x7c\x5d\xe7\xe8"
- "\x8b\xfa\xc9\xc3\xfa\xa2\xbe\xae\x71\xf4\x45\x99\xc2\x1c\x3d\x5e"
- "\x2d\xce\xd1\xc9\x77\xf6\xdc\x2a\xa1\x1f\xe5\x56\x09\x8a\xa6\xcf"
- "\xd1\x3f\xdc\x2e\xcc\xa3\x3e\xdc\x47\x38\xfa\xa2\x8c\xfa\xe7\xe8"
- "\x8b\x32\x84\x39\x7a\x42\x17\xc2\x67\x16\x65\xd9\x73\x74\xb8\x46"
- "\x90\xa3\x27\x4c\xe0\xae\xc9\xe0\x73\x74\xd2\x06\xc4\x9a\xb9\xe2"
- "\x1c\x7d\x31\xb7\x2e\x28\xe1\x12\x89\x3d\xc4\xa7\xf6\x1c\x3d\xe1"
- "\x88\x73\x8e\x4e\x30\xc4\xde\xa7\x28\x47\x4f\x30\xd9\x73\xf4\xf8"
- "\x8e\xc2\x1c\x3d\xd1\x6a\x9e\x66\xe2\x7c\x3e\x47\x5f\x3c\xa2\x79"
- "\x70\x74\x51\x6c\x6d\xe7\x73\xf4\x44\x7f\xe9\x1c\x3d\x31\x58\x1a"
- "\x47\xc7\x98\x13\xe2\xe8\x89\x99\xb6\x98\xe3\x73\xf4\xc4\x43\xc2"
- "\x1c\x3d\xf1\x2c\x9f\xa3\xe3\xf6\x85\x38\x7a\xe2\x3d\x5e\xfb\x76"
- "\x1c\x3d\xc9\x97\xcf\xd1\xc9\x79\x94\xa3\x27\x1d\x26\x31\xf4\x83"
- "\x33\xd2\x39\x7a\x52\xa6\x38\x47\x4f\xca\xe1\x73\xf4\x24\x0d\xe1"
- "\xe2\x49\xf9\x84\xa3\x27\x2d\x27\xc7\x3f\x38\x6d\x7d\x9c\x72\x74"
- "\x72\x9c\x72\xf4\xa4\xd2\xc7\x6b\x38\x9b\x22\x47\x5f\x32\x57\x1e"
- "\x47\x5f\xa2\x91\xcf\x13\x57\x0d\xa7\x3c\x71\xd5\x70\x71\x9e\xb8"
- "\x74\x84\x63\x9e\xb8\x32\x95\xf2\xc4\xe5\xb7\x48\xac\x5e\x7e\x8e"
- "\xc4\xea\xe5\xe9\xd2\x79\xe2\xf2\x56\x7c\x9e\xb8\x34\xf3\x31\x4f"
- "\x94\xcb\x13\x93\x2a\x29\x4f\x5c\x76\x41\x1e\x4f\x5c\x76\x9e\xcf"
- "\x13\x57\x09\xec\xa9\xb5\x7c\xa0\xeb\x3c\x71\xf9\x14\x79\x3c\x71"
- "\xf9\x64\xd7\x78\xe2\xf2\xe3\xc2\x3c\x71\x69\x90\x38\x4f\x24\xdf"
- "\xd9\x8f\xef\x2b\xa7\xd0\xf1\x7d\x65\xf7\xa6\xcf\x13\x57\x14\x08"
- "\x8f\xe5\x2b\x2e\x10\x9e\xb8\xfc\x58\xfd\xf3\xc4\xe5\xc7\x84\x79"
- "\xe2\x4a\xae\xfe\xd9\x72\xad\x3d\x4f\x84\x6b\x04\x79\xe2\x4a\x2e"
- "\xff\xbb\xfc\x18\x9f\x27\x92\x36\x20\xd6\x6c\x14\xe7\x89\x7f\xe9"
- "\x47\x62\xcf\x5f\xb8\xf7\x48\xc4\xa7\xf6\x3c\x71\xe5\x25\xe7\x3c"
- "\x91\x60\x88\xbd\x4f\x51\x9e\xf8\x97\x6e\xf6\x3c\x71\xe9\x70\x61"
- "\x9e\x98\x62\xa2\x38\x4a\xc9\xe1\xf3\xc4\xbf\xcc\x6e\x1e\x3c\x51"
- "\x14\x5b\x05\x7c\x9e\x98\x32\x44\x3a\x4f\x4c\x99\x2b\x8d\x27\x62"
- "\xcc\x09\xf1\xc4\x94\xe3\xb6\x98\xe3\xf3\xc4\x94\x8b\xc2\x3c\x31"
- "\xe5\x0e\x9f\x27\xe2\xf6\x85\x78\xe2\xaa\x4e\xbc\xf6\xed\x78\xe2"
- "\xaa\x81\x7c\x9e\x48\xce\xa3\x3c\x71\x15\xb7\x07\xd6\x92\x5b\xd2"
- "\x79\xe2\xaa\xe3\xe2\x3c\x71\x95\xcd\xfe\x57\xab\xb8\xfd\xaf\x56"
- "\xe9\x09\x4f\x5c\xc5\xed\x7f\xb5\xa4\xd2\xfa\x38\xe5\x89\xe4\x38"
- "\xe5\x89\xab\x91\x7b\xeb\x3b\xd3\xf3\x28\xb7\x48\xcf\x13\xe7\x16"
- "\xab\xb7\x39\xe6\x16\xeb\x10\xe5\x16\x6b\x22\x48\xff\x5e\x33\x82"
- "\xf4\xef\x35\xec\xfc\xa4\xc5\x85\xc0\x2d\x9e\x9b\xaf\xdf\x7f\xfb"
- "\x20\xcb\x2d\x0e\xcc\x31\x28\x81\xef\x79\x98\x31\xb7\x00\x5e\x97"
- "\xba\x00\x73\x8b\x72\x6e\x7d\x67\xea\xe2\xc2\x78\x6b\x6e\xb1\xfa"
- "\x1e\xbb\xd6\xb3\x6e\xdf\xda\x72\x84\xbf\x17\x5a\xfb\x79\x7c\x0e"
- "\xb7\xf6\x13\xda\xb6\x5e\xf3\xc9\xae\x03\xbd\x0d\xdc\x63\x1a\xf8"
- "\xc3\x8a\x7b\x3c\x5e\xfb\x89\xc7\xfa\xd4\x60\x79\xbc\x36\x35\x88"
- "\xcf\x39\xd6\x47\xd9\x73\x8e\xd4\x7d\xae\x73\x8e\xd4\x73\xf2\x38"
- "\x47\x6a\x89\x6b\x9c\x63\x4d\x1f\x61\xce\xb1\x7a\x3b\xc6\xa7\x30"
- "\xe7\x20\xdf\xd9\x8f\x15\x6b\xcf\xd1\xb1\x62\x6d\x4e\xd3\xe7\x1c"
- "\x6b\x87\x0a\x8f\x0b\x6b\x83\x09\xe7\x58\xd3\xbb\xfe\x39\xc7\x9a"
- "\xde\xc2\x9c\x63\x2d\x17\xff\xd7\xf4\xb5\xe7\x1c\x70\x8d\x20\xe7"
- "\x58\xcb\xbd\xff\x5b\xd3\x9b\xcf\x39\x48\x1b\x10\x83\x5a\x8b\x73"
- "\x8e\x75\xbb\x48\x4c\x5a\xb7\x90\xc4\x24\xe2\x53\x7b\xce\xb1\x6e"
- "\x9c\x73\xce\x41\x30\xc4\xde\xa7\x28\xe7\x58\xb7\xd1\x9e\x73\xac"
- "\xce\x15\xe6\x1c\xe9\x56\xf3\xb4\xd3\x7d\xf9\x9c\x63\xdd\x95\xe6"
- "\xc1\x39\x44\xb1\x35\x94\xcf\x39\xd2\x0e\x49\xe7\x1c\x69\xd7\xa4"
- "\x71\x0e\x8c\x39\x21\xce\x91\xde\xc7\x16\x73\x7c\xce\x91\x3e\x5a"
- "\x98\x73\xa4\x47\xf1\x39\x07\x6e\x5f\x88\x73\xa4\xa7\xf3\xda\xb7"
- "\xe3\x1c\xe9\xfb\xf8\x9c\x83\x9c\x47\x39\xc7\x7a\x2e\x86\xae\x0e"
- "\x96\xce\x39\xd6\xf7\x11\xe7\x1c\xeb\x07\xf2\x39\xc7\x7a\x2f\xc2"
- "\x2d\xd6\x47\x12\xce\xb1\x5e\x4d\x8e\xaf\x0e\xb2\x3e\x4e\x39\x07"
- "\x39\x4e\x39\xc7\xfa\x38\x09\xb9\xa9\x72\x29\x6b\x3f\xf7\xdd\xe7"
- "\xe7\xa6\x2c\x79\x29\x63\xcf\x41\xe7\xeb\x72\x53\x30\xd6\x8b\xed"
- "\xa3\x8e\x73\x53\x78\xec\xa6\xb9\xa9\x4b\x6c\xac\xa2\xb9\x29\x1d"
- "\x9b\x9b\xc2\x79\x29\xd0\xec\x75\x79\x29\xf3\x07\xf6\xeb\x3e\xf7"
- "\x99\xa5\xe7\xa5\xde\x9d\xeb\x83\xb6\xb0\xe3\x77\x59\x47\x92\x97"
- "\x2a\xad\xcb\x4b\xe1\x71\xdb\xf4\xc0\x3e\x2f\x85\xc7\x6b\x9a\x97"
- "\xfa\x41\x66\x5e\x2a\xa3\x95\xbc\xf1\x3b\xa3\x09\xac\x7f\x6b\x8e"
- "\xeb\x3e\xd7\xa7\xd0\x77\xc7\x99\x32\xd7\xbf\x65\x3a\x5c\xff\xf6"
- "\x78\x5e\xb3\x98\xed\x33\x42\xa9\xed\x3f\x51\xc8\xb3\xfd\x27\xe8"
- "\xd1\xdb\xbe\x39\xce\x99\xc8\x2c\xa0\xb6\xcf\x92\x59\xff\x2d\x2b"
- "\x41\x7e\x2e\x3c\x37\x8e\xea\xd5\xdc\x38\x6b\xbd\x9a\x3f\xdc\x5a"
- "\xaf\x6e\x1c\xe7\x58\xaf\xe6\x1c\xa3\x7a\x35\xbb\x13\xe1\x86\xd9"
- "\x0a\xc2\x0d\x37\xb3\x7b\x92\x2d\x1e\x86\x58\x9d\x6a\xc4\x9a\x75"
- "\x96\x41\xb9\xff\xa6\x56\x69\x5c\x4a\xb4\x6a\xb1\xb1\x00\x15\xea"
- "\x0d\xe8\xa3\x05\xc8\x63\xd5\x6d\xe4\xb1\xbb\xca\xa0\xf4\x8e\x41"
- "\x9e\x30\x4e\x00\x97\x2a\x00\x6e\x91\x83\x34\x89\x58\xc7\x6e\x1e"
- "\x58\xac\xd1\x5b\xe9\xd8\x8d\x47\xa9\x86\x85\xf3\x34\x06\xf4\xcf"
- "\x59\x5a\x25\xd6\xaa\xb5\x99\xb3\x74\xb5\xbd\x06\x95\xb0\x35\x8b"
- "\xac\xf3\xe5\xf0\xdb\xea\x77\xf9\xf9\xf2\x9a\xcc\x59\xe5\x0f\xf7"
- "\x0d\x3a\xcf\xd6\x43\xec\x46\xf3\xe6\xae\xe6\xcb\x37\xd7\x20\x3f"
- "\x4b\x3d\x44\x3c\x2e\x36\xbf\x7c\xf9\x27\x41\x34\x5f\xbe\xb9\x85"
- "\xbc\x7c\xf9\x66\x0f\xbe\x76\xdd\xd6\xc5\x5e\xbb\x6e\x9e\xe9\xba"
- "\x76\xdd\x2c\x73\xfd\xff\xe6\x54\xd7\xb4\xeb\xe6\x5b\xb6\xda\x75"
- "\x67\x22\xd6\xae\x1b\xc7\x63\xac\x0a\x6b\x57\xf2\x9d\xbd\xe6\xc8"
- "\x59\x43\x35\x47\xce\x3b\x4d\x5f\xbb\x66\x1b\x85\xf5\x45\x4e\x0b"
- "\xa2\x5d\x37\x57\xd6\xbf\x76\xdd\x5c\x29\xac\x5d\x73\x16\x12\x9e"
- "\xbf\xb9\xd2\xa2\x43\xa9\x76\x85\x6b\x04\xb5\x6b\xce\x3e\xdb\x6b"
- "\x88\x76\xdd\xac\x27\xda\x35\xe7\xac\xb8\x76\xdd\xc2\xd5\x4b\xdb"
- "\xd2\x8f\xc4\x27\xe2\x53\x7b\xed\xba\xa5\xb5\x73\xed\x4a\x30\xc4"
- "\xde\xa7\xa8\x76\xdd\x32\xc1\x5e\xbb\x6e\x0c\x15\xd6\xae\xb9\xbd"
- "\x28\x8e\xb6\x16\xf2\xb5\xeb\x96\x9c\xe6\xa1\x5d\xc5\xb0\x95\x6d"
- "\xe4\x6b\xd7\xad\xb3\xa5\x6b\xd7\xad\xdb\xa4\x69\x57\x8c\x39\x21"
- "\xed\xba\xf5\x16\x87\x1f\xbd\xb0\x76\xcd\x6d\x25\xac\x5d\x73\xbb"
- "\xf0\xb5\x2b\x6e\x5f\x48\xbb\xe6\x8e\xe6\xb5\x6f\xa7\x5d\x73\x67"
- "\xf2\xb5\x2b\x39\x8f\x6a\xd7\x6d\x5e\x24\x86\x66\x3d\x94\xae\x5d"
- "\x73\x6f\x89\x6b\xd7\xdc\x7b\x7c\xed\x9a\x9b\x4f\x34\xea\x36\x35"
- "\xd1\xae\xb9\x65\xe4\x78\x96\xc1\xfa\x38\xd5\xae\xe4\x38\xd5\xae"
- "\xdb\x7a\x4b\xd0\xae\x15\xf5\xa4\x5d\x4b\x9b\x97\x76\xbd\x54\xd6"
- "\xb8\xda\xf5\xd3\x33\xf2\xb4\xeb\xa7\xa7\x5d\xe4\xf0\xe5\x4e\x38"
- "\xfc\xf9\xff\x5b\x1c\x7e\xdb\x70\xca\xe1\xb7\x0f\x93\xc7\x59\xb6"
- "\x0f\x7d\xd4\xb6\x6f\x7e\x76\xff\xcc\x8b\xda\x7d\xc7\x51\x79\x76"
- "\xdf\x91\xf7\x58\xb7\xca\xb1\xfd\x76\xab\x7c\xcd\x17\x32\xe7\x3f"
- "\x7f\xd1\x57\xbe\x6e\x3d\x10\x4a\x75\xeb\x81\x50\x6b\xdd\xfa\x15"
- "\xef\x3d\xeb\xce\x56\x8e\x75\xeb\xde\x2c\xaa\x5b\x77\x3f\x24\xbc"
- "\x70\x37\x37\xdf\x76\x37\xcb\xb7\x12\x8e\x10\xdd\x7a\x1f\xeb\xd6"
- "\xeb\xa0\x5b\x67\x84\x2b\x8d\x5c\x0d\x7e\x3c\x2f\xab\x10\xb4\x27"
- "\xd6\xaa\xc5\xf1\xf0\xff\x38\x3d\xfa\x28\x16\x79\xac\x06\xcd\xb9"
- "\x0b\xc6\xaf\x5d\x0b\xf4\xca\x94\x59\x10\xfb\x4b\xf7\x21\xef\x68"
- "\xd0\xb3\x55\x58\xcf\x9e\x06\xad\xba\x82\xd3\xb3\xbb\xfd\x8b\xe3"
- "\xac\xf5\xec\xce\x55\xac\x9e\xd5\x93\x39\x5f\xc5\x71\xa0\x67\xe1"
- "\xf7\x70\x4d\x7f\x6b\x3d\xfb\x10\xf4\x6a\x0d\xe8\xd5\xb4\x9b\x36"
- "\xda\x76\x86\xbd\xb6\x7d\xe8\x3f\xab\xc2\xd0\x6b\x50\x29\xd6\xb6"
- "\xf7\x77\xfc\x5f\xd4\xb6\x9f\x23\xaa\x6d\x77\x5d\x91\xa7\x6d\x77"
- "\xe9\xf8\xda\xf6\x80\xc9\x5e\xdb\xee\x1e\xe1\xba\xb6\xdd\x3d\x53"
- "\x5e\x9f\xd9\x1d\xed\x9a\xb6\xdd\x7d\xd6\x56\xdb\x7e\xce\xbe\x97"
- "\xdd\xe9\x85\xf1\x2c\xac\x6d\xc9\x77\xf6\x9a\x64\xef\x4c\xaa\x49"
- "\xf6\xf6\x6b\xfa\xda\x76\x4f\xa9\xb0\xfe\xd8\x73\x85\x68\xdb\xdd"
- "\xf9\xf5\xaf\x6d\x77\xe7\x0b\x6b\xdb\xbd\xdc\xfc\xff\xdd\xf9\xf6"
- "\xda\x16\xae\x11\xd4\xb6\x7b\x57\xd9\x5e\x43\xb4\xed\xee\x02\xa2"
- "\x6d\xf7\xee\x10\xd7\xb6\xfb\x86\x91\x18\xb6\xcf\x97\xc4\x30\xe2"
- "\x53\x7b\x6d\xbb\xf7\x86\x73\x6d\x4b\x30\xc4\xde\xa7\xa8\xb6\xdd"
- "\xd7\xc7\x5e\xdb\xee\xf4\x14\xd6\xb6\x07\x5a\x51\x1c\xed\xdf\xc5"
- "\xd7\xb6\xfb\x16\x36\x0f\x6d\x2b\x8a\xad\x52\xbe\xb6\xdd\x1f\x2c"
- "\x5d\xdb\xee\x5f\x2c\x4d\xdb\x62\xcc\x09\x69\xdb\xfd\x67\x39\xfc"
- "\x14\x08\x6b\xdb\xfd\xd7\x84\xb5\xed\x7e\x13\x5f\xdb\xe2\xf6\x85"
- "\xb4\xed\x81\xee\xbc\xf6\xed\xb4\xed\x81\x11\x7c\x6d\x4b\xce\xa3"
- "\xda\xf6\x40\x05\x89\xa1\x5f\x1c\x92\xae\x6d\x0f\x9c\x15\xd7\xb6"
- "\x07\xce\xf1\xb5\xed\x81\xed\x44\xc3\x1e\x30\x12\x6d\x7b\x20\x8f"
- "\x1c\xff\xe2\xa0\xf5\x71\xaa\x6d\xc9\x71\xaa\x6d\x0f\x7a\x49\x7b"
- "\x2f\xeb\x56\xdd\xa3\xf3\x8d\xbf\x66\xa0\xbe\xea\x1e\x59\xde\xcd"
- "\x36\xd6\x9a\x81\x43\x3b\xe4\xe9\xdb\x43\x0e\xeb\xbf\x3c\xd6\x58"
- "\x42\x3c\xff\xa0\x9a\xf2\xfc\x2f\x3b\xc9\xe3\x2c\x5f\x76\x7c\xac"
- "\xb1\xe4\xd8\xfe\x50\x25\xb5\xfd\xe1\x8d\xf2\x6c\x7f\x38\x4b\xbe"
- "\xc6\x3a\x96\x46\x35\xd6\xb1\x34\xf1\x77\x83\x47\x66\x3b\xd6\x58"
- "\x47\x4b\xa9\xc6\xca\x1b\x48\xf8\x49\x5e\x27\xc2\x4f\xfe\x76\xa9"
- "\xfe\xde\x0d\xfe\x6d\x02\xff\xdd\xe0\x91\x0b\x8f\xdf\x0d\xd6\x87"
- "\x7e\xfa\x32\x92\xea\xa7\xbf\x75\x91\xa7\x9f\xfe\xa6\xe6\xeb\xa7"
- "\xe3\x43\xec\xf5\xd3\xdf\x56\xb8\xae\x9f\xfe\xb6\x4b\x5e\x7f\xf8"
- "\xdb\x4e\xd7\xf4\x53\x5e\x2b\xe1\x77\x83\x47\x34\xe2\xef\x06\xc9"
- "\x77\xf6\xbc\xf7\xe8\x2e\xca\x7b\x8f\xce\x6f\xfa\xfa\xe9\x68\x80"
- "\x30\xc7\x3d\xda\x85\xe8\xa7\x3c\xcf\xfa\xd7\x4f\x79\x9e\xc2\xfa"
- "\xe9\x28\xb7\xfe\x35\xcf\xd3\x5e\x3f\xc1\x35\x82\xfa\xe9\xe8\x59"
- "\xdb\x6b\x88\x7e\xca\xf3\x22\xfa\xe9\xe8\x35\x71\xfd\xf4\xf7\x25"
- "\x24\x3e\xfd\x7d\x1c\x89\x4f\xc4\xa7\xf6\xfa\xe9\xef\xdd\x9d\xeb"
- "\x27\x82\x21\xf6\x3e\x45\xf5\xd3\xdf\xe7\xda\xeb\xa7\x23\x31\xc2"
- "\xfa\xe9\x58\x30\xc5\xd1\x3f\x6e\xf0\xf5\xd3\xdf\x8f\x36\x0f\xfd"
- "\x24\x8a\xad\x00\xbe\x7e\xfa\xc7\x2a\xe9\xfa\xe9\x1f\xc7\xa5\xe9"
- "\x27\x8c\x39\x21\xfd\x74\xac\x15\x87\x1f\x2f\x61\xfd\x74\xac\x9b"
- "\xb0\x7e\x3a\x36\x84\xaf\x9f\x70\xfb\x42\xfa\xe9\xd8\x4c\x5e\xfb"
- "\x76\xfa\xe9\xd8\x0a\xbe\x7e\x22\xe7\x51\xfd\x74\x3c\x90\x1b\xdf"
- "\xfc\xa5\xeb\xa7\xe3\xad\xc4\xf5\xd3\x71\x5f\xbe\x7e\x3a\x56\x4e"
- "\x74\xd2\xf1\xc1\x44\x3f\x1d\x33\x90\xe3\x47\xfc\xac\x8f\x53\xfd"
- "\x44\x8e\x53\xfd\x74\x7c\x94\x34\xfd\xe4\x7a\x5d\xa4\x47\x3f\xaf"
- "\x55\xdd\x4c\xe7\xb5\x9e\xb8\x22\x4f\x3b\x9d\xd0\x3d\xe6\xf0\x72"
- "\x38\xfc\xf1\x70\xca\xe1\xb5\x32\xd7\xff\x6a\x27\xcb\xe7\xf0\xf9"
- "\xe3\x29\x87\xcf\x1f\x2f\xce\xe1\x4f\xf6\x71\xcc\xe1\xcf\x64\x53"
- "\x0e\x7f\xca\x44\xc6\xc8\x53\x57\xc8\x18\x79\x6a\x5b\xfd\x71\xf8"
- "\x53\xed\xf9\x1c\xfe\xe4\xc6\xc7\x1c\xbe\x3e\x38\xfc\x3f\xad\xf6"
- "\x3b\xfe\xd7\x35\x79\x1c\xfe\x5f\xe5\x7c\x0e\x7f\x56\x61\xcf\xe1"
- "\x4f\x05\xbb\xce\xe1\x4f\xcd\x96\xd7\x1f\x4e\xc5\xb8\xc6\xe1\x4f"
- "\x15\x0a\x73\xf8\x93\x7d\xc5\x39\x3c\xf9\xce\x9e\x7b\x9d\x99\x4d"
- "\xb9\xd7\x99\x81\x4d\x9f\xc3\x9f\x2e\x13\xe6\x59\xa7\xaf\x11\x0e"
- "\x7f\xaa\xa0\xfe\x39\xfc\xa9\x02\x61\x0e\x7f\xe6\x1d\xc2\x77\x4e"
- "\x15\xd8\x73\x78\xb8\x46\x90\xc3\x9f\x59\x63\x7b\x0d\xe1\xf0\xa7"
- "\x4a\x08\x87\x3f\xb3\x4b\x9c\xc3\x7f\x35\x82\xc4\xa7\xaf\xfc\x49"
- "\x7c\x22\x3e\xb5\xe7\xf0\x67\x6e\x39\xe7\xf0\x04\x43\xec\x7d\x8a"
- "\x72\xf8\xaf\xfa\xd9\x73\xf8\x93\xbd\x85\x39\x7c\x7e\x6b\x8a\xa3"
- "\x7f\xef\xe3\x73\xf8\xaf\x16\x37\x0f\x0e\x2f\x8a\xad\x32\x3e\x87"
- "\xff\xf7\x68\xe9\x1c\xfe\xdf\x4b\xa4\x71\x78\x8c\x39\x21\x0e\xff"
- "\xef\x42\x0e\x3f\x25\xc2\x1c\xfe\xdf\x37\x84\x39\x7c\xbe\x82\xcf"
- "\xe1\x71\xfb\x42\x1c\x3e\xbf\x17\xaf\x7d\x3b\x0e\x9f\x1f\xcc\xe7"
- "\xf0\xe4\x3c\xca\xe1\xf3\x2b\x49\x0c\xd5\x5e\x94\xce\xe1\xf3\x0b"
- "\xc5\x39\x7c\xfe\x05\x3e\x87\xcf\xdf\x49\xb8\xfa\x59\x44\x38\x7c"
- "\xfe\x31\x72\x5c\x5b\x6a\x7d\x9c\x72\x78\x72\x9c\x72\xf8\xb3\x3e"
- "\x8f\xeb\x26\x35\xc5\xba\x49\x5f\xef\x92\xc7\xe3\xbf\xde\x29\x9f"
- "\x4b\x7e\x9b\x40\xb9\xe4\xb7\x09\xd6\x5c\x92\x5f\xdb\xe0\x9b\xc5"
- "\x8e\xb9\x64\xf1\x69\xca\x25\x8b\xba\x91\x58\x5d\xd4\x8a\xc4\xea"
- "\x42\xf6\xfd\x9e\xb4\xba\x49\x85\xc3\xf8\x75\x93\xbe\x29\x7c\x5c"
- "\x37\x49\x2e\x4f\x3c\xdb\x95\xf2\xc4\xc2\xd6\xf2\x78\x62\xa1\x17"
- "\x9f\x27\xfe\xa7\xbb\x3d\x4f\x2c\x9c\xeb\x3a\x4f\x2c\xcc\x94\xc7"
- "\x13\x0b\x33\x5c\xe3\x89\x85\xf7\x84\x6b\x18\x7c\x93\x2c\x5e\x37"
- "\x89\x7c\x67\x3f\xbe\x17\x67\xd2\xf1\xbd\x38\xa2\xe9\xf3\xc4\x62"
- "\x0f\xe1\xb1\xbc\xb8\x35\xe1\x89\x85\xd5\xf5\xcf\x13\x0b\xab\x85"
- "\x79\x62\xf1\x12\x32\xa6\x16\x1a\xec\x6b\x18\xc0\x35\x82\x3c\xb1"
- "\xf8\x08\x77\x4d\x35\x9f\x27\x92\x36\x20\xd6\x9c\x13\xe7\x89\x25"
- "\xb3\x49\xec\x29\x19\x42\x62\x0f\xf1\xa9\x3d\x4f\x2c\xf1\x77\xce"
- "\x13\x09\x86\xd8\xfb\x14\xe5\x89\x25\x53\xec\x79\xe2\x37\x09\xc2"
- "\x3c\xf1\x5b\xab\x3a\xad\xe7\x2e\xf0\x79\x62\xc9\x8e\xe6\xc1\x13"
- "\x45\xb1\xe5\xc1\xe7\x89\xe7\xe6\x4b\xe7\x89\xe7\x76\x49\xe3\x89"
- "\x18\x73\x42\x3c\xf1\xdc\x3d\x5b\xcc\xf1\x79\xe2\xb7\xbe\xc2\x3c"
- "\xf1\xdb\xee\x7c\x9e\x88\xdb\x17\xe2\x89\xdf\x4e\xe0\xb5\x6f\xc7"
- "\x13\xbf\x9d\xcb\xe7\x89\xe4\x3c\xca\x13\xff\xe3\xc7\x8d\x69\xdd"
- "\xa4\xf3\xc4\x6f\xef\x89\xf3\xc4\x6f\x4d\x7c\x9e\xf8\x6d\x09\xe1"
- "\x83\xff\x09\x24\x3c\xf1\xdb\x72\x72\xfc\x9b\xae\xd6\xc7\x29\x4f"
- "\x24\xc7\x29\x4f\xfc\xcf\x00\x69\xeb\x40\xea\x25\xd7\xdb\x48\xeb"
- "\x40\xea\x2b\xd7\xdb\xd8\xeb\x40\xce\xcb\xac\x7f\x7f\xde\xd5\xfa"
- "\xf7\x8f\xe7\xc9\xd4\xe5\x79\xff\x33\x8a\xe6\x79\xbf\x1b\x21\x8f"
- "\xaf\x7c\x37\x5c\x3e\x37\xff\xc9\x6a\xff\xde\x9f\x78\xfb\xf7\xf2"
- "\xe7\xc3\x7f\xdf\xde\x31\x37\xff\xd1\x6a\xff\xde\x1f\xb8\xfd\x7b"
- "\x2f\x72\xfb\xf7\x5e\xdc\x21\x67\x3e\xfc\xea\x2a\xe4\xf1\x91\xed"
- "\x7c\xf8\xf3\xc7\xc9\x7c\xf8\x58\xdb\xf9\xf0\x17\x3b\xf1\xe7\xc3"
- "\x7f\xbf\x51\x6c\x3e\x3c\xce\xfb\xd6\xee\x1b\x74\x1e\xcf\x85\x17"
- "\x9c\x07\x3f\xb1\x7e\xe7\xc1\x63\x6c\x6e\x5e\x44\xb8\xfd\xa6\x66"
- "\xc9\xed\x2f\x58\xd5\xce\x2f\x95\xb9\xff\x6f\xa9\xcd\xfe\xbf\x97"
- "\x05\xf6\xff\xbd\x28\x61\xff\xdf\x8b\x32\xf7\xff\xbd\xe8\xe2\xfe"
- "\xbf\x17\xed\xf6\xff\x25\xf3\xe0\xbf\xef\x28\x3e\x0f\x9e\x7c\x67"
- "\xcf\xc9\x7e\xb4\xaa\x2b\xf5\x63\x33\xd8\xff\xf7\x07\x91\x3d\x5a"
- "\x7f\xe0\xf6\xff\xbd\xd8\x00\xfb\xff\x5e\x14\xd9\xff\xf7\x47\x6e"
- "\xff\xdf\x8b\x75\x7b\xf9\x52\x6e\x7f\x51\x64\xff\xdf\x1f\xd3\x6d"
- "\xaf\x21\xdc\xfe\x22\xb7\xff\xef\x8f\x0e\xf6\xff\x2d\xe3\xf6\xff"
- "\x2d\xe3\xf6\xff\x25\x3e\xb5\xe7\xf6\x3f\xba\xb0\xff\xef\x45\x6e"
- "\xff\xdf\x8b\x0e\xf6\xff\x2d\x13\xd8\xff\xf7\xfb\x00\x61\x6e\xff"
- "\x93\xd5\xfe\xbf\x97\x6c\xf6\xff\x2d\x6b\x26\xfb\xff\x8a\x62\xcb"
- "\x66\xff\xdf\x4b\x32\xf6\xff\xbd\x24\x71\xff\xdf\x8b\x22\xfb\xff"
- "\x5e\xe2\xf6\xff\xbd\x28\xb2\xff\xef\x25\x91\xfd\x7f\x7f\xb2\xd9"
- "\xff\xf7\xa2\xc8\xfe\xbf\x3f\xf5\xe1\xb5\x6f\xc7\xed\x7f\xb2\xd9"
- "\xff\xf7\xa2\xcd\xfe\xbf\x3f\x71\xfb\xff\x7e\x77\x52\x3a\xb7\xff"
- "\xc9\xc1\xfe\xbf\x3f\xd9\xec\xff\xfb\x13\xb7\xff\xef\x65\x6e\xff"
- "\xdf\x9f\xb8\xfd\x7f\xbf\xd3\x5a\x1f\xa7\xdc\x9e\x1c\xa7\xdc\xfe"
- "\xb2\x94\xfd\x7f\xcb\xa5\xe4\x80\x1f\xfd\x3c\x0e\x9f\x66\x3a\x8f"
- "\x43\x27\x33\xff\xab\x73\x23\xff\x5b\x91\x45\x39\x66\x45\x96\xf8"
- "\x5c\x82\x2b\x4e\xf2\xbf\xd7\x74\x94\x63\x96\x73\xeb\x95\xca\xbb"
- "\x91\x38\xfd\xf3\x35\x57\xe7\x12\xac\xbe\xcf\xf1\x4a\xcb\x5c\x82"
- "\x05\xdc\x5c\x02\xe0\x96\x84\x4b\xfe\x3c\x85\x3f\x97\xe0\xca\x35"
- "\xb1\xb9\x04\x82\x73\x08\x6c\xf8\xa3\x85\x6b\xca\x9d\x43\xd0\xfc"
- "\xf9\xe3\x65\xab\x39\x04\x3f\x77\x97\xc7\x1f\x7f\x0e\xe4\xf3\xc7"
- "\x1b\x23\xec\xf9\xe3\xcf\x6b\x5c\xe7\x8f\x3f\x1f\x92\xc7\x1f\x7f"
- "\x3e\xe8\x1a\x7f\x2c\xf7\x15\x9e\x43\x70\x25\x59\x7c\x0e\x01\xf9"
- "\xce\x7e\xdc\xbf\x76\x88\x8e\xfb\xd7\x16\x37\x7d\xfe\x78\x4d\x2d"
- "\x3c\xc6\x5f\xeb\x4e\xf8\x63\xb9\x4f\xfd\xf3\xc7\x72\x1f\x61\xfe"
- "\x78\x2d\x87\x8c\xb5\xe5\x3e\xf6\xfc\x11\xae\x11\xe4\x8f\xd7\xce"
- "\xd9\x5e\x43\xf8\x63\xb9\x1f\xe1\x8f\xd7\x6e\x89\xf3\xc7\xeb\xab"
- "\x48\x5c\xba\xfe\x0e\x89\x4b\xc4\xa7\xf6\xfc\xf1\x7a\x1f\xe7\xfc"
- "\x91\x60\x88\xbd\x4f\x51\xfe\x78\x7d\xa1\x3d\x7f\xbc\x22\x92\x1b"
- "\xae\x18\x47\x71\xf4\xdf\x3b\x7c\xfe\x78\xfd\x64\xf3\xe0\x8f\xa2"
- "\xd8\x52\xf3\xf9\xe3\x7f\xd3\xa5\xf3\xc7\xff\x9e\x91\xc6\x1f\x31"
- "\xe6\x84\xf8\x63\x85\x2f\x87\x1f\x3f\x61\xfe\x58\xd1\x4b\x98\x3f"
- "\x56\x8c\xe0\xf3\x47\xdc\xbe\x10\x7f\xac\x98\xcb\x6b\xdf\x8e\x3f"
- "\x56\xac\xe1\xf3\x47\x72\x1e\xe5\x8f\x37\x7a\x73\xe3\x9a\x8c\xdc"
- "\xf0\x0d\x5f\x71\xfe\x78\xa3\x3d\x9f\x3f\x56\x70\xb5\xf3\x6f\x0c"
- "\x27\xfc\xf1\x06\x22\xc7\xaf\x74\xb5\x3e\x4e\xf9\xe3\x15\x9b\xdc"
- "\xf0\x8d\xf1\x8e\xf8\x23\x93\xe1\x9d\x9f\xa6\x34\x1f\x84\x4f\x1e"
- "\xdc\x67\x7b\x18\xc7\xb4\xf0\xff\x7c\x18\x8f\x7c\xe1\xff\x25\x62"
- "\x7c\x45\xef\xef\x9d\x6f\x06\xee\x61\x86\xdf\x29\xd6\xff\xaa\xd5"
- "\x76\x30\xe2\x7b\xe7\xf6\x6c\xf1\xce\xf7\x36\x3e\x11\x64\x66\xa2"
- "\x11\xe3\x07\xff\x8f\x87\x63\x70\x7e\x1b\x18\xf7\xd4\x0b\x50\x9b"
- "\xdb\xca\x1b\xd5\x96\xf3\xe0\x9e\xdb\x5c\x55\xde\x38\x84\xdb\x78"
- "\xb0\xfa\x26\xd8\xf9\x46\xb8\xe8\xbd\x42\x5b\x63\x77\x75\x46\x8b"
- "\x8d\xcc\x7f\xb5\x73\xaa\x50\xb9\xf2\x66\xb0\x77\xe5\x13\x41\x10"
- "\x87\x10\xe6\x7b\x07\x3b\xe8\x3d\x70\x9b\xda\x39\x35\xf8\xbb\x9e"
- "\xf8\x3b\x13\xdc\x63\xe2\x6c\xa4\x5c\x5b\xf5\x84\x27\xf0\xaa\x16"
- "\x49\xd5\x4c\xc5\xfb\x46\xb8\xe7\x78\x23\xfa\x67\xe7\x52\x8f\x03"
- "\x9b\x4a\xd9\xb1\xa7\xa8\xda\xc4\xb6\xa1\x9e\x83\xef\xe7\xe6\xe8"
- "\x2d\x70\xbe\xd0\x3d\xac\xd8\x8f\x7a\xb6\xe8\xce\xe8\xa4\x8d\x77"
- "\x37\x73\xc5\xec\xe8\xbd\xa4\x33\xd2\xf6\x00\xdb\xa9\x91\x52\xe8"
- "\x7b\x69\xbf\xf3\x8b\xa3\xfa\xb7\x9e\x1f\xb7\x63\xaa\x93\x36\x22"
- "\xe5\x3a\xf3\x13\x9e\xa7\x20\x26\x6e\xdd\xc0\xe8\x1f\xac\xfe\x25"
- "\x4e\xa7\xb8\x9c\x81\x6d\xbe\x0c\xbe\x5f\xd7\x8e\xd1\xdf\x5d\x8a"
- "\x71\xf3\x4b\xea\x49\x18\xdb\x6d\x7d\x11\x1b\x39\x3b\x42\x1d\x37"
- "\x73\x76\xd4\xfb\xf3\xe3\xd4\xdd\x22\x9f\x44\xe3\xdf\x7f\x5f\x3d"
- "\x3b\x62\xce\x42\xb5\xf5\x37\x83\xd4\x91\x33\xe7\x45\x4c\x8b\x89"
- "\xea\x35\x7b\xba\xe6\x49\xb8\x27\x64\x75\x1f\x7e\xf8\x5e\xcc\xab"
- "\x7f\xc9\xda\xb2\x1e\xa1\x8f\xdb\x22\x0f\x7c\x5f\xf0\x7b\x46\x9d"
- "\x47\x2f\x2f\xfc\x7b\x6b\x37\x30\xd5\x4a\x38\x27\x09\x62\xda\xba"
- "\xc4\x27\xf0\xb9\x9e\x5b\xe1\xbe\xb6\xc0\x7d\xc3\x3d\xc2\x3d\x57"
- "\x06\x5a\xee\xd9\x82\x89\x24\x8c\x89\xc4\x2a\xc0\x60\x65\xb0\xb7"
- "\xe1\x89\x91\x0c\x13\x86\x9f\xaf\x1a\xfa\x8a\x02\x8e\x5d\x61\x35"
- "\x40\xa6\x77\x3e\x5c\x1b\x69\xc1\x98\x39\x23\x2c\x9c\xd9\xe0\x9d"
- "\x06\xdc\x51\xf1\x80\x89\xfe\x03\x60\x13\x5f\x7f\xe8\x25\x84\x92"
- "\x99\x07\x61\xec\xfe\x03\xcc\x03\xc0\x30\xc1\x29\x7c\x77\x6b\xf9"
- "\x5d\x25\x7a\x15\xda\xd8\xa9\x43\xe9\x09\xb8\x0d\x1d\x1c\xc3\x36"
- "\x37\xe7\xce\xd7\x4d\x08\x44\xc9\xcf\x27\xa3\xe4\x07\xf8\x9a\xed"
- "\xfd\xf3\xbc\xe3\x90\x62\x6c\x3c\x73\x19\xe2\x8e\x82\xe9\x32\x5f"
- "\xc7\xec\xe8\x9f\xa7\x53\x56\xa6\x9a\x33\xc3\xc2\xe1\x79\x2a\xa1"
- "\x1d\xbd\x4e\xd1\x7e\x3b\x6e\x67\xdd\x06\xd6\xf6\x95\xf8\xd9\xc1"
- "\x3e\xa0\x65\x18\x2d\xb3\x94\xeb\x43\x69\xbd\x83\xcc\x69\x4b\x92"
- "\x8b\x3d\xee\xa3\xb1\x46\xa6\x96\x49\xef\x1d\x54\x54\x5d\x0d\x31"
- "\x4d\x33\x9d\x79\xf2\x97\x5d\xde\xc6\x99\x51\x5b\xdb\x42\x5f\x4c"
- "\x5f\x92\xcc\xa4\x87\x0c\x98\xd0\x1d\xf9\x3c\x58\x7d\x6b\x94\xc5"
- "\x9e\x60\x4b\x0f\x69\x38\xba\xc5\xd6\x74\xc1\x78\x80\xfb\xe1\xf0"
- "\x70\x2b\xfb\x64\x9c\x3d\x1e\xea\xfa\xe6\x86\x91\x25\x46\x26\x6c"
- "\x64\x6d\x46\x10\xf4\xd3\x91\xd5\x89\xd7\x50\x4b\x6c\xdb\x22\xe0"
- "\xfb\x6b\x17\xa0\x80\x35\xef\x22\xf5\xd4\x85\x3e\x48\x9f\x39\x52"
- "\xef\xbd\x24\x59\x01\x36\x51\x42\x7c\xe9\x0d\x31\xb3\x77\x6d\xbb"
- "\xb0\xf0\x84\x28\xa4\xdc\x77\xf5\xa0\x12\xf3\x64\x3c\x2f\xe4\xba"
- "\xf2\xf6\x94\x2d\x70\x1d\xf3\x6b\x18\xc2\xfe\x60\x7d\xf1\x6b\x34"
- "\x1a\x3d\x13\xc6\xe7\x59\xec\xf7\xe9\x39\xd0\xa6\xb4\xe7\xba\xcd"
- "\xf2\x5f\x13\xf8\xea\x25\xf0\x53\x71\xb9\x89\x6d\x93\xf5\x55\x0c"
- "\xf5\xd5\x71\xb8\x0f\xea\xaf\xdb\x01\xd8\xaf\xc2\xcf\x1c\x14\xca"
- "\x3d\x73\x0a\xe3\x17\x14\x27\xfe\xcc\x41\x1a\xf2\xcc\x2d\xaa\x1c"
- "\x3f\xf3\xaf\xe3\x1c\x3f\xf3\xaf\x2b\xa4\x3f\xf3\xaf\x1d\xa5\x3f"
- "\xf3\xaf\x5e\x0e\x9e\x99\xf3\x73\x30\xf8\x39\xc8\x81\x9f\x83\x38"
- "\x3f\x3f\x75\xd5\xf1\x33\xeb\x47\x38\x7e\x66\xfd\x42\xe9\xcf\xac"
- "\xf7\x91\xfe\xcc\x7a\x24\xfe\xcc\xc1\x9c\x9f\x83\xc1\xcf\xc1\x0e"
- "\xfc\x1c\xcc\xf9\xd9\xf7\x5b\xc7\xcf\x7c\x67\xa0\xe3\x67\xbe\x33"
- "\x5b\xfa\x33\xdf\xf1\x90\xf1\xcc\xd5\x0e\x9e\x99\xf3\x73\x08\xf8"
- "\x39\xd8\x81\x9f\x83\x39\x3f\xbf\xb2\xda\xf1\x33\x57\xf5\x72\xfc"
- "\xcc\x55\x11\x32\x9e\xd9\x20\xfd\x99\xef\x54\x88\x3f\x73\x08\xe7"
- "\xe7\x10\xf0\x73\x88\x03\x3f\x87\x70\x7e\x9e\xf4\x9a\xe3\x67\xbe"
- "\xdb\xc5\xf1\x33\xdf\x9d\x20\xfd\x99\xab\x2a\xa5\x3f\x73\x55\x99"
- "\xd8\x33\xd7\x40\xdc\xf6\x82\x67\xa9\xfd\x3e\x6c\xa4\xc9\x6f\xa4"
- "\xd1\xab\x1c\x29\xb3\x97\x9a\xa3\xbd\x2b\x50\x2b\x78\xb6\x68\x66"
- "\xc3\xa4\xde\xf8\x5f\xb3\xdf\x48\x43\x8d\x5f\x90\xe7\xc3\x76\xde"
- "\x69\x1f\x4e\x41\x2d\x31\x1f\x5f\x65\x46\x01\xe6\x8c\x91\xd5\xa9"
- "\x6f\x22\x75\x92\x1e\xf9\x14\x25\xea\x50\xa2\x86\xd1\x17\xa1\x2b"
- "\xa8\x75\x05\xd6\x9e\x3f\xa0\x82\xca\x7c\x34\x27\x96\x61\xae\x2b"
- "\xab\xb7\xe1\x77\xc0\xc0\x93\x93\xd3\xbe\x43\x6a\xf8\x8d\xde\x5b"
- "\xe0\x83\xdb\xf1\x1e\x05\xe3\xe7\x86\x49\x2f\x6f\x4d\x44\x01\x27"
- "\x66\x55\x20\x7c\x3c\x07\x3e\xa6\x0d\x61\xe1\x89\x53\x90\x72\x7f"
- "\x55\xa9\x92\x8c\xcd\xd5\xb3\x6d\xc7\xe6\x51\x11\x60\xcb\x69\xec"
- "\x77\x47\xb3\xdf\x94\x6a\xcb\xea\x01\x96\xb1\x9b\xb5\x65\x99\x89"
- "\x8c\xf7\x36\x63\xf7\x09\xf8\x7d\x6a\xcb\xea\x40\x6c\x4b\x26\x23"
- "\xc8\xa7\xb8\xa2\x06\xeb\x26\x9f\xeb\xf1\x48\xa9\x53\xde\x2d\x2d"
- "\xd2\x54\x21\x61\x1b\x07\x85\x52\x1b\x07\x25\x78\x95\xb7\xa8\x12"
- "\xb6\x71\x50\x3c\xd8\x38\xc5\xde\xc6\x41\x71\xae\xd9\xf8\x7e\x0b"
- "\xf7\x6d\x7c\xef\x9c\xb8\x8d\xef\x77\x92\x6e\xe3\x7b\xd9\xd2\x6d"
- "\x7c\x2f\x95\xb3\x71\x1a\xdf\xc6\xf7\x06\x3b\xb0\xb1\x15\x8e\x83"
- "\x00\xc7\x4f\x5d\x15\xb1\x31\xe0\x38\x58\x00\xc7\x41\x2e\xe2\xf8"
- "\xc1\x4c\xf7\x6d\xfc\xa0\x9f\xb8\x8d\x1f\x2c\x91\x6e\xe3\x07\x48"
- "\xba\x8d\xef\xeb\x89\x8d\x83\x6d\x70\x7c\x3f\x57\xdc\xc6\xc1\x56"
- "\x38\x0e\x06\x1c\xfb\x7e\x2b\x6c\xe3\x60\xc0\x71\xb0\x00\x8e\x83"
- "\x5d\xc4\xb1\xa1\xd0\x7d\x1b\x1b\x36\x8a\xdb\xd8\x70\x4d\xba\x8d"
- "\x0d\x91\xd2\x6d\x6c\x18\xcf\xd9\xd8\x06\xc7\x06\x0f\x07\x36\xb6"
- "\xc2\x71\x30\xe0\xf8\x95\xd5\x22\x36\x06\x1c\x87\x08\xe0\x38\xd8"
- "\x45\x1c\xd7\xf4\x71\xdf\xc6\x0f\x4d\xe2\x36\xae\x09\x96\x6e\xe3"
- "\x87\xf9\xd2\x6d\xfc\x30\x8f\xd8\x38\xc4\x06\xc7\x0f\xa3\xc5\x6d"
- "\x1c\x62\x85\xe3\x10\xc0\xf1\xa4\xd7\x84\x6d\x1c\x02\x38\x0e\x11"
- "\xc0\x71\x88\x8b\x38\xae\xcd\x74\xdf\xc6\xb5\x11\xe2\x36\xae\xdd"
- "\x27\xdd\xc6\xb5\x3d\xa5\xdb\xb8\xb6\x23\x67\x63\x1b\x1c\xd7\x14"
- "\x88\xd9\xb8\x16\x34\x60\x6b\xb0\x71\xeb\x4a\xa4\xcc\xc1\xb6\x2d"
- "\x25\xb6\x35\xb5\x9b\xd4\x3b\x47\x69\x8e\xc6\x36\x61\x73\x40\xbf"
- "\x04\xb4\x31\x65\x8c\x34\x32\x4a\x78\xa6\x44\x9c\x77\x35\xfa\x1b"
- "\x97\xa2\x36\xea\x44\x9c\xff\x35\xb1\xf3\x03\xd4\x89\x2b\x2f\xc1"
- "\xef\xa9\x70\xde\xcb\x98\xd9\x46\x63\xf2\x1f\x35\x14\xbe\x1b\xcd"
- "\x74\x1b\x58\x02\xda\xcb\x87\xf9\x73\x80\x5f\x71\xe5\x41\xb0\xcf"
- "\xd7\xa8\xa8\xf4\xef\xc8\xdc\x6e\xd2\xcb\x2f\x19\x51\x20\xf3\x4b"
- "\xa0\x5f\x41\x9c\x0e\x99\xa6\x07\x78\x15\xc7\xe7\xa3\xe2\xf8\xbf"
- "\xa2\xb1\x15\xcc\x7d\xe6\xe7\x40\xaf\x5a\xff\x88\x78\x93\xff\x24"
- "\x1f\x53\xe6\x2c\x83\xd1\x3f\x22\x7a\xdf\x02\x9d\xd2\xcb\x80\x02"
- "\x63\xca\x19\x66\xed\x34\xe4\xb1\xf6\x2a\xf2\x5c\x37\x0d\x79\xad"
- "\xbb\x8a\x7c\x0a\xca\x4b\x51\xe1\xcd\x7c\x54\x58\x75\x11\x15\xde"
- "\x87\x4f\x0d\x7c\xcc\xf0\x49\xbe\x08\xbe\x46\x68\xf4\x2d\x84\xf7"
- "\x6e\xd4\xbf\x50\x86\xfc\x0a\x8c\xa5\x08\xaf\x7f\xbd\xad\x34\xde"
- "\xf0\x0a\x47\x7e\xcc\xcf\x01\x88\x99\x1e\xa0\x84\xef\x3c\xf0\xf1"
- "\x62\xa3\x1e\x15\x94\x1b\xf0\xf7\xf9\xf0\xbd\x47\x52\x39\xb4\x6f"
- "\xce\xc7\x7b\x33\xea\x0b\x92\xcf\x22\x63\xfa\x89\x70\x06\x6b\xe8"
- "\x76\x23\x4b\xd2\xc0\xd4\x66\x26\xe0\x39\x82\x03\xb3\x62\x8b\x59"
- "\xaa\xaf\x4d\x01\xac\x8d\xff\x1c\xd0\x16\xec\xdc\xc1\xfc\xe7\x30"
- "\x9f\x31\x17\x2f\x33\x45\xd5\xa5\x08\xe7\x12\x8a\xaa\xbf\x46\xc5"
- "\xcb\xcd\x68\xec\x42\x84\x46\x99\x10\xc2\xb6\x28\x8e\xaf\x40\x63"
- "\x34\xc8\x1b\xe7\x9f\xcd\xbf\x04\xb6\x2d\x2e\xd7\xa3\xc5\x46\xb8"
- "\xc7\xdb\x86\xba\x7b\x2c\x5a\x5e\x84\xe0\xbb\x0e\x45\xd1\x3a\xe4"
- "\xa5\x41\x3e\xd8\xbe\xc6\x8c\x91\x86\x31\xd0\x7f\xe6\x54\x33\x0c"
- "\xb6\x2d\xb6\x29\xb6\x2f\x6e\xcf\x62\xf3\xe2\x48\x3d\x4a\x32\x20"
- "\x9f\xe2\x44\xf8\x37\x9e\xd1\x17\xa3\x3b\x48\xa7\x34\x1a\x19\xdf"
- "\x13\xe1\x80\x8b\xbe\x18\x0b\xf0\xb7\x17\xf8\xbf\xad\x30\xa6\x82"
- "\xe2\x08\xa6\x5a\x54\x39\xc7\x54\x50\x02\xc5\x94\x79\x66\x1d\xa6"
- "\x54\x68\x84\x38\xa6\x98\x6d\x1c\xa6\xd2\x9a\x26\xa6\x98\x21\x8e"
- "\x31\xc5\x74\x74\x80\xa9\x14\xa6\x5d\x50\x28\x0f\x53\x2a\x34\x41"
- "\x3a\xa6\x98\x98\xc6\xc3\x54\x50\xbc\x3c\x4c\x31\xa1\x7c\x4c\x99"
- "\xc3\x1d\x60\x8a\x8b\x53\x4f\x5d\x75\x01\x53\x34\x4e\xa9\xd0\x71"
- "\x8a\x29\xe5\x46\x51\x4c\xa9\x14\xf7\x08\xa6\x82\x9b\x66\x9c\x52"
- "\x29\xd2\x1d\x62\x4a\xa5\xd0\x88\x63\x2a\x18\xe2\x54\x10\x3f\x4e"
- "\xa9\x94\xbb\x24\x63\x4a\xa5\xd0\x36\x22\xa6\xe4\xc5\x29\x95\x62"
- "\x3b\x0f\x53\x2a\x74\x58\x1c\x53\xc1\x5c\x9c\xf2\xfd\xd6\x39\xa6"
- "\x82\x69\x9c\x52\xa9\x7c\x29\xa6\x3c\x6e\x89\x63\xca\x23\x98\xc3"
- "\x54\xd3\x8c\x53\x2a\xd5\x35\xc7\x98\x52\x9d\x76\x80\x29\x88\x53"
- "\xc1\x36\x71\xca\xc3\x24\x1d\x53\x1e\x7e\x8d\x87\xa9\x60\x79\x71"
- "\x4a\xa5\x32\xf0\x31\xa5\xf2\x74\x80\x29\x2e\x4e\xbd\xb2\xda\x05"
- "\x4c\x59\xc5\xa9\x16\x51\x14\x53\x4f\x0c\x13\xc7\x54\xcb\x1c\x82"
- "\xa9\x90\x26\x1a\xa7\x5a\x0e\x74\x8c\xa9\x96\x01\xe2\x98\x0a\x81"
- "\x38\x15\x6c\x13\xa7\x9e\x18\x27\x1d\x53\x2d\xa3\x1b\x11\x53\x32"
- "\xe3\x54\xcb\x51\x7c\x4c\xb5\x98\x2c\x8e\xa9\x10\x2e\x4e\x4d\x7a"
- "\xcd\x39\xa6\x42\xac\xe2\xd4\x13\x47\x29\xa6\x5a\x65\x8a\x63\xca"
- "\xf3\x0e\x87\xa9\x26\x1a\xa7\x3c\xd7\x38\xc6\x94\x67\x8c\x03\x4c"
- "\x41\x9c\x0a\xb1\x89\x53\xad\x76\x48\xc7\x94\xe7\xb1\xc6\xc3\x54"
- "\x88\xcc\x38\xe5\x99\xcb\xc7\xd4\x13\x07\xc5\x30\x55\x83\x75\x9f"
- "\x02\x30\x15\x0d\xba\x0f\x30\xe4\x5d\x42\x30\x55\x0b\x98\xda\x6c"
- "\x8d\xa9\x1f\x6d\x74\x9f\xea\xc9\xd6\xe6\x3a\x4c\x79\xb5\xb7\xc5"
- "\x94\x19\x30\x55\xcb\x62\xea\xa9\x3e\x16\xdd\x57\x5c\x99\x0b\xbe"
- "\xba\x89\x8a\x43\x01\x4f\x1b\x38\x3c\xfd\x08\x78\x82\xe7\x31\xc3"
- "\xf3\x16\x94\x95\xa2\xb1\x7a\xf2\x5c\x35\xf0\xbc\x66\x6b\x2c\xd5"
- "\x54\x28\x31\x86\x30\x76\x2c\x38\x2a\x9c\x03\xf8\x89\x3d\x87\x0a"
- "\x17\xc0\x67\x11\x7c\x12\xe1\x83\xce\xa1\x82\x0a\xc4\xe6\xec\x29"
- "\x7e\x4a\x38\xfc\x3c\x59\xe8\x18\x3f\x4f\xee\x95\xa4\xf1\x54\x5e"
- "\xdd\xa5\xe3\xe7\x49\x23\x37\x97\xce\x67\xec\xb8\xcb\x0c\x9e\x03"
- "\x4b\x30\x72\x13\x8d\x35\x22\x6f\x66\x52\x60\x5b\xaf\x30\xe4\xf3"
- "\xa1\x09\x29\xd7\x4c\x43\x3e\x6b\x7e\x80\xe7\xb5\xf4\x9d\xab\xc8"
- "\xeb\x6b\xc3\xdf\x51\x41\x55\x29\x2a\xb8\x7f\x16\x15\x98\xe1\x73"
- "\x13\x3e\x70\x8f\x63\xa3\xac\x9f\x57\xcf\x3d\xef\x53\xc7\xa1\xad"
- "\xae\xe2\xcf\xfb\x54\x36\xfb\xbc\x91\xf0\xbc\x35\xf4\x79\x8b\x01"
- "\x8b\xe0\x97\x0e\x66\x4e\x27\x8e\xd5\xa3\x56\xef\x1b\x19\xa6\x86"
- "\xc3\x20\xf6\xcb\xd7\xe7\x0d\x68\xac\x06\x7c\x35\x1d\x30\x58\xbe"
- "\x13\x25\x25\x00\x06\x6b\x0c\xf8\xbd\xbe\xbe\x38\xf9\x21\x60\xf0"
- "\x49\x1d\x03\x76\xab\xc5\x18\xfc\x11\x63\xf0\x49\x0f\xb3\x28\x06"
- "\x41\x27\xb2\x18\x04\x9d\xe8\x14\x83\x56\x3a\x51\xe5\x95\x4e\x31"
- "\xd8\x26\x47\x1c\x83\xad\x8f\x58\x74\xe2\xa3\xc7\x60\xeb\x71\x8e"
- "\x31\xd8\xba\xb7\x34\x4d\xd8\x66\x9f\x74\x0c\xb6\x4e\x6e\x3c\x0c"
- "\xb6\x19\xe6\x18\x83\x6d\xd4\xce\x31\x18\x14\x2f\x0f\x83\xad\x23"
- "\xf9\x18\xf4\x4a\x71\x80\x41\x2e\x0e\x82\xae\x74\x8e\x41\xab\x38"
- "\xe8\xed\x4f\x31\xe8\xdb\x45\x1c\x83\x3e\x03\x2d\xba\xf2\xd1\x63"
- "\xd0\xfb\x82\x63\x0c\x7a\x1f\x96\xa6\x21\x7d\xfb\x48\xc7\xa0\x8f"
- "\x47\xe3\x61\xd0\xe7\x8c\x63\x0c\xfa\x6c\x77\x01\x83\x32\xe3\xa0"
- "\x77\x05\x1f\x83\xde\x5e\xe2\x18\x0c\xe6\xe2\x20\xe8\x50\xa7\x18"
- "\xb4\xd6\xa1\xbe\x1b\x29\x06\x9f\xde\x21\x8e\xc1\xb6\xc7\x2d\x3a"
- "\xf4\xd1\x63\xb0\xed\x3b\x8e\x31\xd8\x76\x80\x34\xcd\xf9\xf4\x11"
- "\xe9\x18\x6c\x9b\xd2\x78\x18\x7c\x3a\xd8\x31\x06\x9f\x0e\x74\x8e"
- "\xc1\x60\x99\x71\xb0\x6d\x0c\x1f\x83\xbe\x69\x0e\x30\xc8\xc5\x41"
- "\xd0\xad\xce\x31\x68\x15\x07\xfd\x3a\x51\x0c\xb6\xeb\x2e\x8e\x41"
- "\xff\x61\x16\xdd\xfa\xe8\x31\xe8\x77\xc9\x31\x06\xfd\x8e\x49\xd3"
- "\xa8\xed\x06\x4a\xc7\xa0\xbf\x57\xe3\x61\xd0\xbf\xd0\x31\x06\xfd"
- "\xf7\xba\x80\x41\x99\x71\xd0\x4f\xcf\xc7\xa0\x9f\x9f\x38\x06\x43"
- "\xb8\x38\x08\x3a\xd7\x29\x06\xad\x75\x6e\xbb\x6d\x14\x83\x01\xfb"
- "\xc4\x31\xf8\x9b\x33\x16\x9d\xfb\xe8\x31\xf8\x9b\x08\xc7\x18\xfc"
- "\xcd\x50\x69\x9a\x36\xe0\xb8\x74\x0c\xfe\x26\xad\xf1\x30\x18\x30"
- "\xce\x31\x06\x03\x7a\x3b\xc7\x60\x88\xcc\x38\xf8\x9b\x38\x3e\x06"
- "\xdb\x65\x89\x61\xd0\x0c\xba\xb8\x76\xfb\xc0\x12\x73\x46\x44\xbc"
- "\xb7\x42\x8d\x8c\x7e\xa3\x86\x16\xc7\x55\xa3\x31\xf7\xc0\x3e\x9a"
- "\x7b\xe8\xdd\x7b\x3e\xc8\x94\x11\x11\xcd\x80\x3e\xb2\xd2\xcf\xec"
- "\xdc\x32\x63\xda\x89\xf0\x75\x73\x90\x07\xe8\xef\x97\xf1\xb1\xe2"
- "\xeb\x06\x84\x7f\x7f\x31\xbe\x9f\x9b\xf4\x7e\x70\x9e\x80\xf9\x35"
- "\xd0\x87\x7d\xc7\x5c\xa3\x43\xe5\x83\x91\xaa\xa0\x5c\x07\x76\x58"
- "\xc4\xfa\x17\xdb\xe5\xba\xaa\x7d\xda\xd6\xdb\xc8\xc3\xf8\x73\x40"
- "\x07\xb0\xb7\x5f\xeb\x0f\x90\xa2\x63\x39\x63\xc6\x76\xc5\xf6\xc2"
- "\x36\x56\x2f\x62\x18\x38\xef\x4a\x11\x60\xcc\xf8\x73\x60\x87\x2d"
- "\x70\x9e\xb0\x5e\x6d\x7f\x43\x3a\x36\xda\x93\xf5\xb0\xaa\xf6\x29"
- "\x05\x65\x48\xf0\xdd\xb1\x19\xf4\x9b\x6b\xb6\x0a\x8a\xb7\xd2\x79"
- "\x0d\x60\xab\x0e\xc7\x5c\xb3\xd5\x33\xad\x6d\x6c\x25\xa0\xab\x9e"
- "\xf1\x97\x6e\xab\x0e\xa4\x4e\xa4\xaa\xc3\x61\x07\xb6\x72\x11\x57"
- "\x41\x06\x2b\x3d\xd2\x00\xb6\x7a\xa6\xc2\x35\x5b\x75\x1c\xc8\xb7"
- "\x95\x10\xff\xef\x38\x4c\xba\xad\x3a\x7a\x10\x5b\x3d\xa3\x13\xb7"
- "\x55\xb0\x8b\xb8\x0a\x8e\xb7\xe2\xcd\x0d\x60\xab\x4e\x7e\xae\xd9"
- "\xaa\x53\x94\x8d\xad\x04\x78\x6a\xa7\xd9\xd2\x6d\xd5\xa9\x37\xb1"
- "\x55\x27\x2f\x07\xb6\x72\x11\x57\xc1\x06\x2b\x7e\xd7\x00\xb6\xea"
- "\x3c\xd4\x35\x5b\x75\x4e\xe7\xdb\x4a\x88\x4f\x75\xde\x28\xdd\x56"
- "\x9d\x27\x13\x5b\x75\x1e\x20\x6e\xab\x10\x17\x71\x15\x12\x6f\xc5"
- "\x43\x1a\xc0\x56\xcf\xc6\xb8\x66\xab\x67\x8f\xdb\xd8\x4a\x60\xdc"
- "\x7f\xf6\x8c\x74\x5b\x3d\x9b\x42\x6c\xf5\x6c\xa4\x98\xad\x4c\x19"
- "\x23\xab\xbd\xc1\x06\x0f\x37\x8c\x2c\xf1\x8e\x47\xca\x9a\xae\x60"
- "\x37\x3f\xb0\xdb\x12\x35\xaa\xcd\x00\xbb\xe9\x8d\x68\xcc\xdc\xcb"
- "\x4c\x51\xa5\x09\xd5\x80\xcd\x1e\xfa\x8d\x34\x14\xeb\x2b\xf0\x9c"
- "\xa3\xdf\x5f\x55\x75\xd9\x31\x69\xae\x0f\xc2\x76\xc3\x76\xc0\xb6"
- "\x63\xc0\x6e\xac\x1d\xfd\x66\x19\x4c\x7e\x93\x7c\x46\xdf\xba\xcc"
- "\xbc\xaf\x63\x18\xfc\xbc\x8c\x5f\x1b\x0d\x7e\x2f\x30\xb6\x02\xb5"
- "\x52\xbf\x89\x9f\xa9\xcb\x04\x7c\xbc\x58\x5f\x0a\xfc\xa0\x0a\xb1"
- "\xdc\xec\x72\xa0\x9f\xe9\xed\x40\x2f\x53\x71\xd8\x48\xa6\x9d\x77"
- "\x9a\xb1\x5d\x58\x78\xd2\x2d\xd4\x12\xf3\x87\xb5\x66\x14\xb0\x78"
- "\x36\x52\xee\x9f\xa5\x55\xb2\x6b\xd7\x62\xd9\x36\xba\x80\x5d\x02"
- "\x98\xbb\x56\x73\xba\xef\x46\xa3\xe2\xeb\x69\xac\xdf\x6c\x39\x02"
- "\xeb\xb7\xef\x03\x7d\x80\x67\xf6\x66\xfc\x82\x3c\xd3\x8a\x90\x9a"
- "\xa9\x05\x1b\xe3\xf5\x44\xaa\xe7\x5a\x6f\xad\x91\x6a\x63\x35\x3b"
- "\xff\xdb\xac\xe6\xe6\x6f\x81\x9d\xf0\xef\xb3\xf3\xb7\x34\x56\xf3"
- "\xb7\xe0\x9e\xeb\xe6\x6f\xa9\xd4\x07\xf1\xfc\x2d\xf3\xe5\x80\x0e"
- "\x96\x67\x7f\x3f\x86\x61\xe0\xd9\xdb\x16\x55\xeb\x11\x7e\xfe\xa2"
- "\x6a\x2d\x4a\x8a\x43\x3e\x45\x35\x15\x28\xb1\x9a\xd1\x17\x25\xdf"
- "\x40\x63\xef\x61\x1e\x8c\xf1\xd2\x25\x87\xf8\x55\xad\x31\x5f\x0e"
- "\xec\xa0\x53\x75\xc9\x28\x2a\x41\xc8\x6a\x1d\x4f\x34\x70\x66\x4f"
- "\xf0\x43\x74\x71\xf2\x55\x04\x3e\x49\x2b\x36\xfe\x80\xfd\x14\x0d"
- "\xdf\x0f\xae\xe3\xd7\xed\x26\xad\xc7\xc7\xb0\xcf\xf0\xfb\x26\x5c"
- "\x1f\x60\xab\x15\xff\xc6\xb8\xf0\x8e\x4f\x46\xc5\xf1\x35\xa8\xc8"
- "\x88\x80\x5f\xa9\x3b\x7e\x13\x56\x2a\x82\xa3\xa0\x38\x82\xa3\xa0"
- "\x50\xef\xf8\x16\x55\xce\x71\x14\x14\x4f\x71\xf4\xdb\x5b\xee\xe1"
- "\xe8\xb7\x39\xee\xe3\xe8\xb7\x33\xdd\xc0\x51\x0a\x1f\x47\x5d\x27"
- "\x48\xc7\xd1\x6f\xfb\x4a\xc7\xd1\x73\x06\xf7\x70\xf4\xdb\x6b\x04"
- "\x47\xcf\xe5\x11\x1c\xfd\xb6\x8c\xe2\x88\x5d\x1b\xd5\x40\x38\x7a"
- "\x2e\xd2\x01\x8e\xb8\x78\x14\x04\xf1\xe8\xa9\xab\x2e\xe0\xc8\x2a"
- "\x1e\xfd\xae\x9f\x7b\x38\xea\x76\xcd\x7d\x1c\x75\x3b\x24\x1f\x47"
- "\xc1\x36\xf1\xe8\x77\x39\xd2\x71\xd4\x2d\x41\x3a\x8e\xba\x0d\x75"
- "\x0f\x47\xbf\xeb\x45\x70\xd4\x0d\x11\x1c\xfd\xae\x2b\xc5\x11\xbb"
- "\xde\xac\x81\x70\xd4\x75\xaf\x38\x8e\x82\xb9\x78\x14\x0c\xf1\xc8"
- "\xf7\x5b\xe7\x38\x0a\xb6\x8a\x47\x81\x8b\xdd\xc3\x51\x60\x2f\xf7"
- "\x71\xf4\xfc\x43\x37\x70\x64\x13\x8f\x02\xaf\x49\xc7\xd1\xf3\xa7"
- "\xa5\xe3\xe8\xf9\x14\xf7\x70\x14\x38\x9f\xe0\xe8\xf9\x20\x82\xa3"
- "\xc0\x18\x8a\x23\x76\x0d\x5f\x03\xe1\xe8\x77\xd5\x0e\x70\xc4\xc5"
- "\xa3\x60\x88\x47\xaf\xac\x76\x01\x47\x56\xf1\xa8\xc7\x19\xf7\x70"
- "\xd4\x63\xbe\xfb\x38\xea\x31\x4c\x3e\x8e\x42\x6c\xe2\xd1\x0b\xbd"
- "\xa4\xe3\xa8\x87\x97\x74\x1c\x75\x2f\x71\x0f\x47\x3d\x8e\x13\x1c"
- "\x75\x4f\x23\x38\xea\x71\x98\xe2\x88\x5d\x17\xd9\x40\x38\xea\x3e"
- "\x58\x1c\x47\x21\x5c\x3c\x0a\x81\x78\x34\xe9\x35\xe7\x38\x0a\xb1"
- "\x8a\x47\xbd\x5a\xbb\x87\xa3\x9e\xc7\xdd\xc7\x51\xcf\x55\x6e\xe0"
- "\xc8\x26\x1e\xf5\x9a\x2f\x1d\x47\x3d\xc7\x4b\xc7\x51\xcf\x00\xf7"
- "\x70\xd4\xab\x05\xc1\xd1\x0b\xa5\x04\x47\x3d\x8d\x14\x47\xec\x5a"
- "\xd3\x06\xc2\xd1\x0b\xcb\xc5\x70\x84\x6b\x11\x7c\x4c\xea\x42\x54"
- "\xaf\x5b\x84\x06\x6c\xc5\xff\xd6\xa0\xde\x0f\xd6\xf6\xda\x7b\x32"
- "\x81\xd4\x03\xd0\xa9\x7a\xb1\xf9\x5e\xa1\xeb\x9f\xda\x05\x7e\xf1"
- "\x1b\xa9\x1f\x7b\x89\xd4\x68\xc0\x75\x41\xee\x26\x45\xa3\x97\x70"
- "\x5d\x06\xd5\x8b\xe5\xb8\x8e\x55\x5d\xed\x00\x3f\x91\xda\x01\x13"
- "\xc5\x6b\x07\xd4\x6c\xb0\xac\xbb\xdd\x49\xd7\xdd\xaa\x5e\x3c\xe4"
- "\x70\xdd\xad\xea\xc5\x8d\x39\x13\xa5\xe2\xe1\x45\x76\xfd\xd7\xdd"
- "\x76\x23\x4b\x1e\xac\x7d\x71\x27\x3c\x73\x32\x79\xf6\x97\xd8\x7a"
- "\x2b\xce\xd7\xe3\xee\xb4\xc2\xc9\x8b\xe3\x27\x4c\x46\xc9\xcc\xea"
- "\x5b\x3b\x19\xff\x91\x7a\x26\x33\x48\x5a\xfd\x2c\xd5\x8b\x7a\xc7"
- "\xf6\x0e\xd2\x08\xdb\xbb\xf7\x78\x62\x6f\xae\x6e\x81\x9f\x48\xdd"
- "\x82\x89\xe2\x75\x0b\x84\xed\xdd\xdb\xf1\x3a\x67\x55\xef\x56\xd2"
- "\xed\xfd\xd2\x79\x62\xef\xa0\xd0\x07\x6b\x7b\x07\x50\x7b\xf7\xce"
- "\x90\x6e\xef\x97\x4e\x13\x7b\xdf\xce\x66\xfc\x83\x34\x60\xef\x64"
- "\x69\xf7\xd2\x3b\xdc\x89\xbd\x45\xf0\xdd\xe7\x34\x67\x6f\x0e\xdf"
- "\x22\x35\x13\x26\x8a\xd7\x4c\x10\xb6\x77\x9f\x74\xc7\xf6\xee\xb3"
- "\x50\xba\xbd\xfb\x0c\xe7\xec\x0d\xf8\xee\x93\x42\xed\xfd\xb2\x8b"
- "\x75\x05\xac\xed\xdd\xa7\x2f\xb1\xf7\xaf\x69\x60\x6f\xc0\x77\xb0"
- "\x44\x7c\xf7\x11\xad\x3b\x44\xec\x1d\x2c\x82\xef\xff\xe9\x4b\xec"
- "\xcd\xd5\x6b\xf0\x13\xa9\xd7\x30\x51\xbc\x5e\x83\xb0\xbd\xff\x47"
- "\xe1\xd8\xde\x2f\xdf\x90\x6e\xef\x97\x0f\x13\x7b\x07\x03\xbe\x5f"
- "\x36\x50\x7b\xff\x4f\x9c\x74\x7b\xbf\xbc\x9d\xd8\x5b\xbf\x9c\xf1"
- "\x0f\x06\x7c\x07\x4b\xc4\xf7\xff\x0c\x75\x62\x6f\x11\x7c\xf7\xdd"
- "\xce\xd9\x9b\xc3\xb7\x48\xad\x88\x89\xe2\xb5\x22\x84\xed\xdd\x77"
- "\xae\x63\x7b\xf7\x7d\x47\xba\xbd\xfb\x76\xe5\xec\x0d\xf8\xee\x1b"
- "\x4d\xed\xdd\xb7\x5c\xba\xbd\xfb\xfa\x11\x7b\xdf\x89\x07\x7b\x03"
- "\xbe\x43\x24\xe2\xbb\xef\x41\xc7\xf6\x0e\x11\xc1\xf7\x2b\x7e\xc4"
- "\xde\x5c\x9d\x0a\x3f\x91\x3a\x15\x13\xc5\xeb\x54\x08\xdb\xbb\xdf"
- "\x15\xc7\xf6\xee\x77\x56\xba\xbd\xfb\x65\x10\x7b\x87\x00\xbe\xfb"
- "\x95\x52\x7b\xbf\x32\x5e\xba\xbd\xfb\x2d\x27\xf6\xae\x8a\x61\xfc"
- "\x43\x00\xdf\x21\x12\xf1\xfd\x8a\x5a\xcc\xde\xde\x60\xef\x33\xc0"
- "\x63\x80\x77\x18\xcc\x19\xc0\x53\x4c\x7c\xbb\x17\xc7\x0f\x40\x2f"
- "\xde\xc7\xb6\x1f\x80\x60\xac\x36\x34\x5a\xbd\x0c\x55\xff\x1b\x6e"
- "\xaf\x1d\x56\xf5\x3f\x22\xba\x76\x58\xd5\x3f\x47\xf2\xda\x61\x55"
- "\xff\x68\xca\x81\xfa\xef\xa5\x3e\x1d\xc0\xc6\x0f\x49\x6b\x8a\x55"
- "\xfd\xc3\x04\xeb\x68\xa8\xfa\x7b\xe2\x35\xc5\xcc\xea\xbb\xe1\xe6"
- "\x4c\x39\xdc\x68\x80\x97\x73\x5f\x07\xc5\x9b\x33\x80\x23\x89\xfa"
- "\x7a\x60\x25\x8c\x5b\xf1\x8d\x56\xb7\x43\x35\xf0\x82\xfb\xbe\x1e"
- "\xb8\x4d\xdc\xd7\x03\x57\x49\xf7\xf5\xc0\xf1\x94\x7f\x0d\xcc\xa2"
- "\xbe\x1e\x24\x7d\xfd\xb8\x6a\xe0\x70\xc1\x7a\x1e\xaa\x01\xd5\xc4"
- "\xd7\xd5\xa7\xcd\x99\x72\x78\xd9\x40\x83\x0b\xbe\x86\x7e\x1d\xe4"
- "\xa0\x5f\xff\xbe\x14\x7c\x6d\x68\xb4\xfa\x21\xaa\xdf\x9f\x74\xdf"
- "\xd7\xbf\x5f\x23\xee\xeb\xdf\xcf\x97\xee\xeb\xdf\x0f\xa5\xdc\xef"
- "\xf7\xcb\xa9\xaf\x07\x07\x48\xf7\xf5\xef\x7b\x0b\xd6\x15\x51\x0d"
- "\xd2\x11\x5f\xdf\x0f\x04\x5f\xcb\xe0\x84\xbf\x2f\x77\xee\xeb\x60"
- "\xe8\xd7\xc1\x0e\xfa\xf5\x90\xd3\x30\x5e\xc7\x37\x5a\x1d\x13\xd5"
- "\x90\x7d\xee\xfb\x7a\xc8\x42\x71\x5f\x0f\x89\x90\xee\xeb\x21\x3d"
- "\x29\xef\x1c\xa2\xa1\xbe\xfe\x83\x87\x74\x5f\x0f\xe9\x28\x58\xdf"
- "\x44\x35\xb8\x80\xf8\xfa\x41\xaa\x39\x53\x0e\x1f\x1d\x22\xca\xff"
- "\xad\x7c\x0d\xfd\x3a\xd8\x41\xbf\x7e\xf5\x20\xf8\xda\xd0\x68\xf5"
- "\x54\x54\xaf\x6e\x74\xdf\xd7\xaf\x46\x89\xfb\xfa\xd5\xd1\xd2\x7d"
- "\xfd\x6a\x00\xe5\xbc\xaf\x4e\xa6\xbe\x7e\x55\x2f\xdd\xd7\xaf\x7a"
- "\x0a\xd6\x59\x51\xfd\x21\x8f\xf8\xda\xa0\x07\x5f\xcb\xe0\xc2\xaf"
- "\x1e\x73\xee\xeb\x10\xe8\xd7\x21\x0e\xfa\xf5\x30\xd0\xf5\x21\xf1"
- "\x8d\x56\xd7\x45\x35\x6c\x85\xfb\xbe\x1e\x36\x4e\xdc\xd7\xc3\x06"
- "\x4a\xf7\xf5\x30\x0f\xca\xb7\x87\x05\x51\x5f\x0f\x2b\x93\xee\xeb"
- "\xa1\xd5\x82\xf5\x5e\x54\x43\xb7\x13\x5f\xd7\x8c\x37\x67\xca\xe1"
- "\xe1\xc3\x44\xf7\x3f\x70\xc4\xc3\xe7\xe5\x20\x4f\xbe\xbf\x5f\x4f"
- "\x6d\x5c\x2e\xfe\xfa\x7c\xf7\xfd\xfd\xfa\x30\x71\x7f\xbf\xde\x5d"
- "\xba\xbf\x5f\xab\xa6\x5c\xfc\xf5\x01\xd4\xdf\xaf\x17\x48\xf7\xf7"
- "\x6b\xe5\xc2\x5c\xfc\xb5\x0c\xf7\xb8\xf8\xeb\x59\x72\xb8\xb8\xbd"
- "\xbf\x47\x24\x34\x2e\x1f\x1f\x11\xe5\xbe\xbf\x47\xf4\x11\xf7\xf7"
- "\x88\xf6\xd2\xfd\x3d\xbc\x9c\xf2\xf1\x11\x81\xd4\xdf\x23\x8e\x49"
- "\xf7\xf7\xf0\xf3\xc2\x7c\x7c\xf8\x72\xf7\xf8\xf8\x88\x14\x39\x7c"
- "\xdc\xde\xdf\x23\x63\x1a\x97\x93\x8f\x9c\xe0\xbe\xbf\x47\x76\x11"
- "\xf7\xf7\xc8\x56\xd2\xfd\xfd\xc7\xf3\x94\x93\x8f\xb4\xca\x7f\x8f"
- "\xdc\x2b\xdd\xdf\x7f\x3c\x2d\xcc\xc9\xff\x18\xe7\x1e\x27\x1f\x19"
- "\x2f\x87\x93\xdb\xfb\x3b\x78\x72\xe3\xf2\xf2\xe0\x11\xee\xfb\x3b"
- "\xd8\x57\xdc\xdf\x41\x0f\xa5\xfb\x3b\xe8\x34\xe5\xe5\xc1\x9e\xd4"
- "\xdf\xc1\xd2\xeb\x67\xaa\x82\x0e\x0b\xf3\xf2\xa0\x48\xf7\x78\x79"
- "\x70\xb4\x1c\x5e\x6e\xef\xef\x37\x46\x35\x2e\x37\x7f\xa3\x9f\xfb"
- "\xfe\x7e\x43\x21\xee\xef\x90\x1b\xd2\xfd\x1d\x72\x98\x72\xf3\x10"
- "\xab\xfc\xff\x1b\xa9\xd2\xfd\x1d\xb2\x5d\x98\x9b\x87\x8c\x77\x8f"
- "\x9b\xbf\x11\x26\x87\x9b\xdb\xfb\x7b\xf4\xe0\xc6\xe5\xe7\xa3\xbb"
- "\xb9\xef\xef\x51\x77\xc4\xfd\x3d\xea\xa2\x74\x7f\x8f\xda\x4e\xf9"
- "\xf9\xa8\x0a\xea\xef\xd1\x09\xd2\xfd\x3d\x2a\x43\x98\x9f\x8f\x1a"
- "\xee\x1e\x3f\x1f\x1d\xe4\x7e\x9e\x3c\x34\x00\x73\x73\xa9\xf5\x1f"
- "\x8b\xe3\x2c\x6b\xee\xc6\xd0\xfa\x8f\xaa\xd0\x56\x48\xb4\xb6\xcc"
- "\xd8\xa8\x26\x5d\xff\x51\x35\xc6\x71\xfd\x47\xd5\x18\x69\xf5\x1f"
- "\x55\x63\x47\x4b\x9f\x8f\x3f\x36\x80\x6a\x84\xb1\x56\xfa\x3f\x94"
- "\xec\x51\xdc\x94\xeb\x42\xaa\xc6\xf0\xeb\x42\xaa\xc6\xb0\x75\x21"
- "\x99\xd5\xb5\x79\xf2\xb4\x48\x68\x57\xf7\xdf\x0b\xbc\x59\x8d\x75"
- "\x88\xd4\x3a\x94\x14\xdb\xa1\x77\x28\xb6\xdf\xbc\x26\x8e\xed\x37"
- "\x87\x35\xe9\x3a\x94\xaa\x71\x67\x1c\x63\x7b\xdc\x76\x69\x35\x47"
- "\xde\x94\x51\xf7\x66\x5c\x35\xd5\x43\x6f\x5a\xe9\xdf\xb7\xfa\x36"
- "\x1e\xb6\x65\xd6\xa7\x54\x8d\x2b\xe5\x63\x3b\xb4\x82\x60\xdb\xec"
- "\x25\x4f\x77\xbd\x85\xdc\x7f\x0f\x32\xa1\x04\x6b\x2e\xa9\xf5\x30"
- "\x29\xb6\xdf\x2a\xa4\xd8\x9e\x70\x52\x1c\xdb\x13\x3a\x35\xed\x7a"
- "\x98\xe3\xb7\x39\xc6\xf6\xf8\x64\x69\xb5\x4c\x26\xb4\x90\x8e\xed"
- "\xf1\x25\x54\xfb\x4d\xf0\xa3\xd8\xfe\x93\x4f\x23\x62\x5b\x66\xdc"
- "\x1e\x7f\x98\x8f\xed\xb7\x4e\xb3\xd8\x5e\x8b\xc2\xe5\x69\xcc\x09"
- "\x65\xee\xbf\xf7\x09\xdb\x8b\xf5\xa5\xd4\xba\x9c\x14\xdb\x7f\xda"
- "\x45\xb1\x1d\x66\x57\x17\x8a\x62\xfb\xed\x87\x4d\xbb\x2e\xe7\xdb"
- "\x8b\x1d\x63\xfb\xed\xc9\xd2\x6a\xa4\xbc\x7d\x45\x3a\xb6\xdf\xde"
- "\x4b\x75\xee\xdb\x7a\x8a\xed\xb0\xca\xc6\xc3\xb6\xdc\x7a\x9d\x6f"
- "\xa7\xf1\xb1\xfd\xa7\x5c\x82\x6d\xe5\x61\x79\x7a\x3a\x2c\xcf\xfd"
- "\xf7\x5c\x93\x52\xb0\x96\x96\x5a\x1f\x94\x62\xfb\x9d\x15\x14\xdb"
- "\x93\x16\x8a\x63\x7b\xe2\x85\xa6\x5d\x1f\x74\xa2\x93\xfa\x3f\x13"
- "\x1d\xd4\xff\x11\x5a\x2b\x3c\x51\x46\xdd\x8b\x89\x29\x54\xd3\x4f"
- "\x2c\xa0\xd8\x9e\x94\xdf\x88\xd8\x96\x19\xb7\x27\xc6\xf0\xb1\xfd"
- "\x4e\x02\xc1\x76\x0b\x4f\x79\xb9\x83\x49\x19\xee\xbf\xd7\x7b\x37"
- "\x12\xe7\x0d\xa4\xd6\x29\xa5\xd8\x9e\x1c\x41\xb1\xfd\xee\x04\x71"
- "\x6c\x4f\x39\xd4\xb4\xeb\x94\x4e\xe9\xe7\x18\xdb\x53\xfc\xa4\xd5"
- "\x74\x99\x22\x63\x1d\xfc\x94\x48\x9a\xbf\x98\x62\x35\xff\xfd\xdd"
- "\xed\x8d\x87\x6d\xb9\xf5\x4b\xa7\x04\xf1\xb1\x3d\x39\x8c\x60\xfb"
- "\x89\xc9\xf2\xf2\x24\xef\x6a\xdc\xcf\x93\x44\x68\xd8\x77\x98\x12"
- "\xeb\xa5\x52\x6c\x4f\x1d\x42\x6b\x13\x45\x44\xd8\x62\x9b\xd6\x26"
- "\x0a\x5f\xd8\x74\xea\xa5\x4e\x35\x39\xc6\xf1\xd4\x32\x69\x39\x91"
- "\xf0\x08\xe9\x38\x0e\xef\x49\x73\x22\xe1\x56\xf3\x5f\x22\x2c\x7b"
- "\x92\x37\x42\xcd\xa2\x88\x16\x8e\x6b\x16\x85\x97\x37\x5c\x1d\xd5"
- "\x70\x1f\x7e\xcd\xa2\xa9\x7d\xcd\x6c\x5f\x68\x75\x50\x5e\x5e\x25"
- "\x22\xc1\xfd\xbc\x4a\x24\x79\xbf\x2b\xb1\x6e\x2b\xed\x0b\xd3\x82"
- "\x69\x5f\x88\x9c\x2d\xde\x17\xa6\xaf\x68\x3a\x75\x5b\xa7\xb7\x72"
- "\xdc\x17\xa6\x55\x48\xcb\xa1\x4c\x97\x51\x07\x66\xfa\x00\x9a\x43"
- "\x99\x9e\x40\xfb\x42\xe4\xb1\xc6\xeb\x0b\x91\xbe\x8e\xfb\xc2\x74"
- "\x7d\xc3\xd5\x73\x9d\xde\x91\xdf\x17\xa6\x0d\x25\x7d\xc1\xab\xaf"
- "\xbc\x3c\x4c\xa4\xac\xf7\xdf\xfc\xbe\xf0\x5e\x0a\xfb\xee\x5b\x62"
- "\xfd\x58\xda\x17\xa2\x26\xd0\xbe\xf0\x9e\x1d\x9f\xa7\x7d\x61\x46"
- "\x7a\xd3\xa9\x1f\x3b\xc3\xdf\x71\x5f\x88\xaa\x96\x96\x73\x99\xb1"
- "\x50\x7a\x5f\x98\x61\xb5\xfe\x69\x86\xd5\xfa\xa7\xf7\xf2\x1b\xaf"
- "\x2f\xbc\xd7\xc9\x71\x5f\x98\x61\x6c\xb8\xba\xb2\x33\x02\xf9\x7d"
- "\x21\x6a\x14\xe9\x0b\x6d\xf2\xe4\xe5\x6d\xde\x73\x81\xff\x3b\xcb"
- "\xdb\xcc\xca\x60\xe7\x05\x48\xac\x63\x4b\xfb\x42\x74\x04\xed\x0b"
- "\xb3\x56\x88\xf7\x85\x99\x39\x4d\xa7\x8e\xed\xcc\x2e\x8e\xfb\xc2"
- "\x4c\x24\x2d\x47\x33\x73\x85\xf4\xbe\x30\x33\x94\xe6\x68\x66\x66"
- "\xd0\xbe\x30\xeb\x7c\xe3\xf5\x85\x59\xdd\x1d\xf7\x85\x59\x9e\x0d"
- "\x57\xdf\x76\x66\x5f\x7e\x5f\x88\x0e\x23\x7d\xc1\x77\xb0\xbc\x3c"
- "\xcf\xac\x5c\xf7\xf3\x3c\xb3\x73\xd9\x39\x13\x12\xeb\xe9\xd2\xbe"
- "\xf0\xe7\xd9\xb4\x2f\xcc\x4e\x17\xef\x0b\x31\xbb\x9a\x4e\x3d\xdd"
- "\x98\x5e\x8e\xfb\x42\x8c\x97\xb4\x9c\x4e\x4c\xba\xf4\xbe\x10\x33"
- "\x99\xe6\x74\x62\x72\x69\x5f\x98\xad\x6b\xbc\xbe\x30\xbb\x9f\xe3"
- "\xbe\x30\xdb\xaf\xe1\xea\xec\xc6\x0c\xe5\xf7\x85\x3f\x47\x92\xbe"
- "\xf0\xb4\x56\x5e\x5e\x68\xf6\x5e\xf7\xf3\x42\x9a\xbd\xec\x7c\x12"
- "\x89\x75\x7d\x69\x5f\x98\xb3\x90\xf6\x05\x8d\x83\x7d\x1e\xde\x3f"
- "\xd2\x74\xea\xfa\xbe\xef\x64\xff\xa3\xf7\x1d\xed\x7f\x24\x90\x03"
- "\x7a\x3f\x47\x7a\x5f\x78\x3f\x9a\xe6\x80\xde\xb7\x5a\xff\xa7\xa9"
- "\x6c\xbc\xbe\xa0\x71\xb2\xff\x83\xc6\x85\xfd\x1f\xe4\xd6\xfb\x7d"
- "\x7f\x14\xbf\x2f\xcc\xd1\x90\xbe\xd0\x6e\xb8\xbc\x3c\x92\xc6\x69"
- "\xfe\x1f\xeb\xfc\x5a\x3f\xfb\x3c\x52\x41\xf9\x00\xf4\xc2\x44\xdc"
- "\x17\x62\xc3\x8d\x99\x23\x0d\xb8\xbe\xb0\xa9\x2b\x57\x83\x72\x09"
- "\x57\xe3\xa5\xda\x48\x6a\x50\xea\x4d\x75\x35\x28\x49\xed\x0f\xa4"
- "\xc4\x6b\x81\xf1\x9a\x60\xa3\x0f\xa9\x3f\xc9\xe0\x39\x51\x78\x8e"
- "\xd4\xd5\x7c\xb6\xbe\x4a\x82\x11\x9e\xfd\xba\x93\xfa\x93\xe1\x3a"
- "\x54\x10\xbe\x08\x19\x7d\x4f\x84\x93\x75\xc2\x73\xf5\x6c\xfd\xc9"
- "\xa9\x01\x1d\xd6\xfe\x84\xfc\xbc\x71\xfd\xc9\x70\xc6\x9c\xa4\x63"
- "\xf4\x45\x06\x04\xe7\x82\x7d\x23\x2c\x35\x28\x63\xdf\xc1\xcf\x6e"
- "\x9c\x1a\xd8\x61\xcb\x4f\x62\xf5\x85\x63\x65\xd4\x81\x8d\xf5\xa2"
- "\xf9\x9d\xd8\x50\x8a\xd1\x58\x76\x0c\xd6\xa9\xe6\x56\x14\x84\x41"
- "\x8c\x59\x1b\x90\x5f\x2b\xab\xf6\x46\x6c\x8c\x73\x9f\xb1\x73\x44"
- "\xec\xe2\x17\xf5\x59\x9c\x9f\x31\x33\x28\x1e\xd7\x39\x76\xdd\x67"
- "\x2d\xaa\x1a\xc6\x67\xf3\xb6\xbb\xee\xb3\xb8\xd6\x36\x3e\x13\xc8"
- "\x43\xcc\xbb\x27\xdd\x67\xf3\xb4\x34\x0f\x11\xe7\x41\x7d\x16\x37"
- "\x9e\xf8\x6c\x5e\x36\xf1\x59\xfb\xea\x5a\x59\xf5\x3b\xe2\xd4\x2e"
- "\xf8\x0c\xcf\x7d\x70\xd0\xcf\xe6\xe7\x83\xcf\x0c\xb8\xde\xb2\xeb"
- "\x3e\x7b\xea\x6a\xc3\xf8\x6c\x7e\x98\xeb\x3e\x9b\x7f\x92\xef\x33"
- "\x21\xbd\x3c\x5f\xc6\x9e\x9d\xf3\xe3\xa8\x5e\x9e\x9f\x47\x7d\xb6"
- "\xc0\x93\xf8\x6c\x7e\x28\xf1\xd9\x33\xea\x5a\x59\x35\x40\xe6\x9f"
- "\x77\xee\x33\xf6\x9d\xbe\x83\x7e\xf6\x41\x82\x31\x13\x34\x26\xe8"
- "\x47\xd7\x7d\xe6\xfb\x6d\xc3\xf8\xec\x03\x2f\xd7\x7d\xf6\xc1\x7c"
- "\x1b\x9f\x09\xe8\xba\x0f\xa6\x48\xf7\xd9\x07\x81\x54\xd7\x7d\x10"
- "\x43\x7d\xf6\xc1\x31\xe2\xb3\x0f\x3c\x88\xcf\x3a\x8e\xaa\x95\x55"
- "\x47\xe4\x03\xa7\xf9\x2f\xcc\x43\x6b\xfd\xec\x75\x0e\xf5\xd9\xc2"
- "\xde\xe0\x33\x03\xae\x3f\xed\xba\xcf\x5e\x59\xdd\x30\x3e\x8b\xd7"
- "\xba\xee\xb3\x85\xdd\xf9\x3e\x13\xd2\x1f\x0b\x7d\xa5\xfb\x2c\xbe"
- "\x8c\xea\x8f\x85\x6a\xea\xb3\x85\x1a\xe2\xb3\xf8\x3c\xe2\xb3\x4e"
- "\xf1\xb5\xb2\x6a\x91\x2c\x1c\xec\xdc\x67\xec\x3b\x58\x07\xfd\x6c"
- "\x51\xb9\x31\x13\x38\x3b\xf0\x71\xd7\x7d\x36\xe9\xb5\x86\xf1\xd9"
- "\xa2\x38\xd7\x7d\xb6\xe8\x92\x8d\xcf\x04\x78\xf2\x22\x19\x75\xb0"
- "\x17\xa5\x51\x9e\xbc\xe8\x3c\xf5\xd9\x87\x5d\x89\xcf\x16\xc5\x10"
- "\x9f\x75\xde\x5e\x2b\xab\x9e\xc9\x22\xd1\xfa\x5f\x8e\x78\xa3\x65"
- "\x5e\x3e\xf5\x5b\x42\x76\xd3\xe1\x8e\x09\x3d\x5d\xf7\x5b\x42\xa6"
- "\x73\xee\x98\xb0\x58\xba\xdf\x12\x82\x28\x77\x4c\x48\xa5\x7e\x4b"
- "\x28\x23\x7e\x4b\xe8\xea\x1e\x77\x4c\x70\xba\xfe\x55\x88\x3b\xda"
- "\xfb\x2d\x71\x7c\xd3\xe1\x8f\x8b\xcb\x5d\xf7\x5b\xe2\x68\xe7\xfc"
- "\x31\xb1\x9f\x74\xbf\x25\x22\xca\x1f\x13\x87\x53\xbf\x25\x66\x10"
- "\xbf\x2d\x2e\x73\x8f\x3f\x26\x86\xcb\xe1\x8f\xf6\x7e\x4b\xf6\x6a"
- "\x3a\x1c\x32\x29\xdb\x75\xbf\x25\xb7\x70\xce\x21\x93\x6e\x49\xf7"
- "\x5b\x52\x1e\xe5\x90\x49\x46\xea\xb7\xe4\x51\xc4\x6f\x49\x19\xee"
- "\x71\xc8\xe4\x00\x39\x1c\xd2\xde\x6f\x4b\x4e\x37\x1d\x1e\xb9\x64"
- "\xbc\xeb\x7e\x5b\x72\xdc\x39\x8f\x5c\x22\x63\xcf\xe2\x25\x1a\xca"
- "\x23\x97\x1c\xa6\x7e\x5b\xca\xed\xc1\xb2\x64\x94\x7b\x3c\x72\x89"
- "\xd3\xfa\x1f\x42\x3c\xd2\xde\x6f\xcb\x12\x9a\x0e\x97\x5c\x26\x81"
- "\xff\x2f\x9b\xef\x9c\x4b\x2e\x93\xc1\xff\x97\x05\x52\x2e\xb9\xcc"
- "\x8a\xff\x2f\xe3\xf8\xff\x32\x0f\xf7\xb8\xe4\x32\x17\xf8\xbf\x3d"
- "\x97\xb4\xf7\xdb\x8a\xbe\x4d\x87\x4f\x2e\x3f\xed\xba\xdf\x56\xf4"
- "\x72\xce\x27\x57\xc8\xd8\x07\x6a\xb9\x8e\xf2\xc9\x15\x5d\xa9\xdf"
- "\x56\xc4\x11\xbf\x2d\x3f\xe6\x1e\x9f\x5c\x31\xd4\x99\xdf\x4c\x7e"
- "\x23\x0d\x8c\x40\x1e\xb2\x30\x7a\x00\x57\x9b\x30\xc5\xc3\xe4\x3f"
- "\xd2\x20\x75\x7f\x17\x4b\xcd\xe9\xb3\xd1\x08\x5d\x55\xfd\x25\xc7"
- "\xbd\xba\xd3\x7f\x19\xed\x7e\xdd\xe9\xbf\xb4\xaf\xbf\xfd\x5d\xfe"
- "\xa2\x90\x5e\x77\x7a\x65\x01\xe5\xa0\x7f\xf1\xa1\xbe\x4e\x61\xe7"
- "\x27\x48\xab\x47\xbd\x32\xcd\xbd\x7a\xd4\x7f\xc9\x24\xf8\x5a\x19"
- "\x4a\xea\x51\xff\x25\xb5\x71\xf6\x7d\x59\x61\xc4\xf5\xa8\x99\xb5"
- "\xcf\x96\xc8\xab\x8f\x9c\xe2\xe3\x1c\xcf\x41\xf1\x8c\x40\x8e\x96"
- "\xe2\x79\xf5\x79\x93\x7f\x50\xbc\xd4\x7d\x66\xf8\x78\x5e\x3d\xdb"
- "\x3d\x3c\xaf\xee\xe4\x3e\x9e\x57\xdd\xa8\xbf\x7d\x66\x56\x9d\x93"
- "\x8e\xe7\x55\xd9\x94\x9b\xaf\xd2\x51\x3c\x7f\xe4\x27\x1d\xcf\xab"
- "\xc2\xdd\xc3\xf3\xea\x28\x82\xe7\x55\x6a\x82\xe7\xd5\x93\x1b\x67"
- "\xff\x99\x94\x02\x82\xe7\xe7\x02\xe4\xd5\x9f\x5e\xad\x73\x01\xcf"
- "\x06\x46\x20\x7f\x4d\xf1\xbc\x66\x3b\xe0\xd9\x20\x75\xbf\x1b\x3e"
- "\x9e\xd7\x0c\x71\x0f\xcf\xa9\xb7\xdc\xc7\x73\xea\xd1\xfa\xdb\xef"
- "\x26\x75\x9b\x74\x3c\xa7\xc6\x50\xcd\x92\x7a\x90\xe2\x79\x4d\xb9"
- "\x74\x3c\xa7\xf6\x76\x0f\xcf\x6b\xfa\x11\x3c\x7f\xa4\x27\x78\x5e"
- "\xd3\xb3\x71\xf6\xc1\xf9\x28\x9b\xe0\xb9\x6b\xb8\xbc\xfa\xde\x6b"
- "\x44\xeb\x1f\x53\x3c\x07\xc7\x33\x02\xb9\x7d\x8a\xe7\xb4\x38\x93"
- "\x7f\x70\xbc\xd4\x7d\x77\xf8\x78\x4e\x73\x73\x9f\x8b\x75\xf5\xb0"
- "\xcf\xc5\x3a\x37\xf6\xb9\xb0\xdd\x77\x67\xdd\x5c\xe9\x78\x5e\x37"
- "\x98\x6a\xb9\x75\xc9\x14\xcf\x69\x87\xa5\xe3\x79\x1d\x72\x0f\xcf"
- "\x69\xdc\xfe\x17\x6b\xb5\x04\xcf\xeb\x8c\x8d\xb3\x1f\xcf\xda\x18"
- "\x82\xe7\xdf\xed\x94\x57\x3f\x3d\x2d\xd9\x05\x3c\x1b\x18\x81\xf7"
- "\x1e\x14\xcf\x1f\x0f\x07\x3c\x1b\xa4\xee\xff\xc3\xc7\xf3\xfa\x4b"
- "\xee\xe1\x79\xfd\x1a\xf7\xf1\xbc\xfe\x9d\xfa\xdb\xff\x67\xfd\x30"
- "\xe9\x78\x5e\xef\x45\x35\xee\x7a\xab\xf7\xff\x1f\x2f\x97\x8e\xe7"
- "\x74\x37\xf7\x05\x5a\x7f\x81\xe0\x39\x9d\xdb\x17\x68\x7d\x41\xe3"
- "\xec\x0b\x94\x3e\x98\xe0\x39\x50\x2f\xaf\x3e\xfd\xc7\xa1\xce\xf1"
- "\x1c\x12\xcf\x08\xbc\x13\xa2\x78\xde\xe0\x67\xf2\x0f\x89\x97\xba"
- "\x0f\x11\x1f\xcf\x99\xfb\xdc\xc3\x73\xe6\x14\xf7\xf1\x9c\xd9\xbd"
- "\xfe\xf6\x21\xca\xf4\x95\x8e\xe7\x8c\x32\xaa\xfd\x33\xad\xde\xff"
- "\x6d\x90\xb1\x3f\x51\x46\xae\x7b\x78\xce\xdc\x41\xf0\x9c\x11\x4e"
- "\xf0\x9c\x99\xdd\x38\xfb\x13\x65\x78\x11\x3c\xbf\x30\x40\x5e\xfd"
- "\xff\x0d\x4e\xe7\x7f\x08\xe5\x37\x2c\x79\x29\x8a\xe9\xac\x0a\xf7"
- "\x73\x1c\x59\x4b\xdc\xc3\x74\x56\x1f\xf7\x31\xfd\x89\xa9\xfe\x72"
- "\x1c\x9f\xc8\xd8\xeb\xef\x93\x83\x34\xc7\xf1\x49\x35\xc5\xf4\xc6"
- "\x40\xe9\x98\xfe\x24\xce\x3d\x4c\x67\x2d\x24\x98\xfe\xa4\x2f\xc1"
- "\x74\x96\xa6\x71\x72\x1c\x1b\x74\xee\xe5\x38\xb2\xaa\xe5\xe4\x38"
- "\xec\x31\xbd\xf9\x98\xfb\x79\x8e\xcd\x13\xdc\xc3\xf4\xe6\x16\xee"
- "\x63\x7a\xd3\xb9\xfa\xcb\x73\x6c\x3a\x2a\x1d\xd3\x9b\x96\xd3\x3c"
- "\xc7\xa6\x7c\x8a\xe9\xcd\x46\xe9\x98\xde\x14\xe4\x1e\xa6\x37\x8f"
- "\x26\x98\xde\xe4\x49\x30\xbd\x79\x78\xe3\xe4\x39\x36\x1e\x76\x2f"
- "\xcf\xb1\x39\x5f\x4e\x9e\xc3\x1e\xd3\x5b\xd2\xdc\xcf\x75\x6c\xe9"
- "\xee\x1e\xa6\x73\x2e\xba\x8f\xe9\x9c\x1d\xf5\x97\xeb\xc8\x59\x23"
- "\x1d\xd3\x39\x61\x34\xd7\x91\x93\x4d\x31\xbd\xa5\x44\x3a\xa6\x73"
- "\x3a\xba\x87\xe9\x2d\x5d\x08\xa6\xb3\xcb\x08\xa6\xb7\x04\x34\x4e"
- "\xae\x23\x3b\xc5\xbd\x5c\xc7\x96\x6c\x39\xb9\x0e\x7b\x4c\x6f\x8b"
- "\x74\x3f\xdf\x91\x6b\x72\x0f\xd3\xb9\xfb\xdc\xc7\x74\xee\xc2\xfa"
- "\xcb\x77\xe4\x46\x48\xc7\x74\xae\xd5\xfe\x17\xb9\x56\xeb\xff\xb7"
- "\x6d\x97\x8e\xe9\xad\x7a\xf7\x30\x9d\x7b\x8f\x60\x7a\xeb\x41\x82"
- "\xe9\xdc\xca\xc6\xc9\x77\x6c\x9d\xec\x5e\xbe\x63\x9b\xd3\xfa\x17"
- "\x42\xf9\x0e\x7b\x4c\x6f\x1f\xe0\x7e\xce\xe3\xb3\x73\xee\x61\xfa"
- "\xb3\x25\xee\x63\xfa\xb3\xd1\xf5\x97\xf3\xf8\xac\x9f\x74\x4c\x7f"
- "\x86\x68\xce\xe3\x33\xab\xf9\x4f\xdb\xe3\xa5\x63\xfa\xd3\xd3\xee"
- "\x61\xfa\xb3\xb3\x04\xd3\x9f\x2e\x27\x98\xfe\x4c\xdb\x38\x39\x8f"
- "\x4f\x7b\xbb\x97\xf3\xd8\x3e\x5c\x4e\xce\xc3\x1e\xd3\x5f\x78\xb9"
- "\x9f\xf7\xf8\x7c\x87\x7b\x98\xfe\x7c\x82\xfb\x98\xfe\xbc\x4b\xfd"
- "\xe5\x3d\x3e\x6f\x25\x1d\xd3\x3b\xce\xd3\xbc\xc7\xe7\x56\xf5\xef"
- "\xbf\x18\x25\x1d\xd3\x3b\xb2\xdc\xc3\xf4\xe7\x39\x04\xd3\x3b\xc2"
- "\x08\xa6\x3f\xcf\x68\x9c\xbc\xc7\x0e\x0f\xf7\xf2\x1e\x5f\xd8\xcd"
- "\x7f\x9b\x17\x35\x27\x52\xfd\xfe\x8c\x19\xf3\xa2\xe2\xd4\xf3\x62"
- "\x66\x4e\x8f\x1a\xd2\xcd\xf2\xf7\x90\xde\xf1\xdd\xe2\x9f\x44\x91"
- "\xb3\x23\xa6\x2e\x78\x99\x7e\x19\x13\x35\x07\xfe\x79\x12\x45\x47"
- "\xcc\x8b\x56\xc7\x2d\xd4\x44\xa9\xf1\x5f\xb3\xa7\x6b\xe0\x94\xf7"
- "\xe3\xe8\x91\x37\xa3\x62\x22\xe2\x67\xce\x79\x4f\x1d\x11\x33\xf3"
- "\xbd\x39\xb3\xa3\xe6\xc4\xa9\x63\xa3\xe6\xce\x9f\x19\x1b\x85\xff"
- "\x3f\x4f\x3d\xe3\xfd\x58\x38\x30\x3d\x6a\xe6\x82\x28\xf5\xb4\xf9"
- "\x33\x66\x44\xc5\xce\x7b\x12\x8d\x9e\x1f\x13\x37\x53\x13\x13\xa5"
- "\x1e\x3e\x7a\x58\xaf\xf1\x23\xde\x1a\xff\xea\xab\x4f\x22\xab\xbd"
- "\xa7\xd5\x4c\xc6\x2c\x3d\x60\xc8\xe3\xba\xea\xcb\xb3\x45\xf0\x34"
- "\x6b\x00\x9b\xeb\x62\x91\xcf\xaa\x58\xe4\x91\x52\x85\x3c\xd7\x54"
- "\x21\x2f\xf5\x2c\x34\x94\xf1\x5d\x91\xb6\xae\x0a\xf9\x31\xed\xda"
- "\xc4\x33\xe9\xc7\x73\x19\xdf\xe3\x3a\xbd\xef\xe7\xf8\x98\x0f\x93"
- "\xbe\x23\x1f\x7f\x07\xbe\xf0\x60\xd2\x4f\x04\x5d\x55\x7d\x99\xa2"
- "\xf7\xfd\x42\x93\x74\x03\x29\x99\x36\x3b\xe3\xf7\x9b\xf5\xca\x93"
- "\x78\x26\x0d\xd8\x0a\xa9\x76\xa5\xc1\x27\x01\xa9\x76\xf7\x84\xcf"
- "\x60\xf8\x2c\x87\xcf\x5e\xf8\x1c\x46\xaa\x3d\x6a\xf8\x44\xc3\x27"
- "\x0b\x3e\x70\x6c\x8f\x16\x3e\x05\xf0\x39\x8f\x54\x7b\xe1\xf8\xde"
- "\x14\xf8\xc0\x77\x7b\x0f\x92\x76\xf6\xe6\x21\xd5\xbe\x01\xf0\x49"
- "\x86\x0f\x5c\xbf\x1f\x8e\xef\x2f\x43\xaa\x03\x70\xde\x7e\x23\xfc"
- "\x1b\x00\x1f\x68\xf3\xc0\x70\xf8\xe0\xeb\x8f\x91\xef\x0e\xf6\x85"
- "\x8f\x06\x3e\xd0\xc6\x41\xf8\x9d\x83\x3a\xf8\x54\x23\xd5\x21\x04"
- "\x1f\x4f\xf8\xc0\xbd\x1d\x82\x73\x0e\x05\xc1\x07\xee\xe1\x50\x3e"
- "\x7c\x2a\x91\xea\xaf\xd0\xce\x5f\xe1\x37\xbe\xf4\x80\x4f\x0a\xf7"
- "\x19\x65\xf5\x7f\xfc\x49\xb6\xf9\xdb\xf6\x93\xeb\xbd\xe4\x59\x9d"
- "\xb6\x87\x11\xfa\xed\xae\x5b\xa6\xa5\x48\x65\x4a\xff\x42\xa3\xe9"
- "\x81\x14\x37\x55\xbb\x8e\x16\x83\xca\x65\x7c\x8e\xe7\x6a\x17\xd5"
- "\xe0\xef\x8f\x62\x9b\x3d\x58\xbb\x2b\x4f\x87\x3e\x0e\xc2\xfd\x53"
- "\x1a\x3e\x77\xe5\x71\xd7\x1b\x74\x8a\x5e\x3a\x7c\x3d\xb3\x3e\xa4"
- "\x2f\x93\x14\xb6\x19\xaf\xc3\xbd\x8e\x6d\x88\xfb\x4d\x5a\x70\x2a"
- "\xe3\x33\xdc\x0b\xc7\x18\xed\x22\xf6\xbe\xd2\xa1\xbf\xb5\x81\xeb"
- "\xd3\x18\xf0\xa3\xde\x1f\x7c\xbe\x14\x79\xb0\x7f\xa7\x7f\x9e\xc6"
- "\xe4\xce\x2f\x25\x71\x67\x37\xab\x5f\x1e\xfa\x4f\xed\x8d\xbf\x33"
- "\xec\xe8\x5f\xc2\x6c\x1f\x14\xae\x9d\x53\x83\xca\x55\xbb\x17\x43"
- "\xfc\x53\x32\xbf\xeb\x5f\x62\xde\x30\xb5\x77\x1e\x60\x00\x9f\x73"
- "\x34\xb1\x02\xff\x9b\x0a\xcf\xad\x64\x32\xa6\x1a\x70\x0e\x48\x9b"
- "\xb8\x1e\x62\xf2\xae\xf4\x87\xfe\xf3\xb5\xea\x10\x6f\xe6\x2a\xfe"
- "\x1d\x25\xae\xb7\xbe\x9b\x9b\xcf\xbf\x2b\xed\xa1\x7f\x9b\x64\xdc"
- "\xb6\x29\x77\x41\x32\x7c\xe7\xc1\x00\xf6\xe0\x1e\x14\xb7\xe1\x3a"
- "\x53\x66\x9b\x78\x6d\x08\xfe\xcd\x3d\xed\xe1\x3e\x95\x49\xc1\xd0"
- "\xf6\xa7\x0b\x92\x0f\x2c\x32\x28\x19\x7c\xef\x7e\x6d\xe2\x01\xeb"
- "\x5e\xa6\xb5\x5f\x84\x6d\x6c\x8b\x3c\x72\xd6\x23\xb4\xb5\x2d\xf2"
- "\x7c\xb0\x76\x8f\x8f\xce\xa3\x97\x17\x89\x7b\xbb\xd2\x94\x70\x0e"
- "\xfc\x66\x25\x03\xfe\x60\x7f\x2b\x63\xa2\xc6\xc1\x6f\x45\xd4\xfd"
- "\xd6\x86\x89\x1a\xfc\x5b\xac\x7d\x88\xad\xc8\xff\x2d\xed\x6c\x1f"
- "\xe0\xe8\x9e\xa7\xe0\x36\x74\xaa\x3d\xa1\xcc\xe7\x03\x92\x4d\x1b"
- "\x22\x92\xf1\x77\xf8\x7c\x62\xff\xcf\xd3\xbc\x97\xa0\x6a\x06\x8e"
- "\x99\x38\x1f\x98\xb0\x0f\x94\xc9\x10\xbf\x76\xf7\xc6\xbf\x07\xd7"
- "\x66\x9b\x96\xaa\x91\x3a\x04\xa1\x4a\xd5\x5e\x36\x37\xc1\xf8\x84"
- "\x54\x13\x1f\xef\xb9\x17\x9f\xcf\x98\xe1\x63\x7a\xe9\xff\xb5\xf7"
- "\x3d\x00\x51\x55\xd9\xff\x67\xde\x3c\x15\x0d\x9d\xd1\x00\xc7\x42"
- "\x7d\x2a\xe8\x58\xa8\x58\x96\xd6\xcf\x5a\xb6\x6c\x05\x34\x61\xf7"
- "\x67\x7d\xa7\xb2\xc4\x22\x43\x33\xc5\xff\x93\x1a\x20\x59\x3f\x6b"
- "\x0d\x90\x90\xaf\x15\x82\xed\xea\xae\xed\x62\x51\xab\x1b\xb6\x96"
- "\x53\xe2\x7e\x51\x51\xa8\x74\xd7\x5a\xdd\x46\x22\x63\x0d\x6d\xd2"
- "\x49\x46\x98\x99\xfb\x3d\xe7\xdd\xf7\x98\x37\xc3\xa0\x80\xb6\x5b"
- "\xfe\x7c\xf5\x9c\x79\xf7\x9d\x7b\xee\xb9\xe7\x73\xfe\xdc\x7b\xdf"
- "\xf0\x6e\x25\xe8\x6c\x89\x84\x6f\x69\x98\xf4\x8b\x6e\xa8\xe7\xd2"
- "\xf0\x16\xfd\x0e\x5a\x42\x3a\x32\xa2\x5e\x42\x3d\xcf\x0f\x75\x30"
- "\x41\x02\xea\x87\x56\x5f\xd4\x9f\xc6\x9c\xd2\x09\x01\x3a\x33\x26"
- "\x24\x64\x32\x0d\xef\x9e\xda\xfe\x23\xfd\x22\xbb\x6e\x98\x99\xe8"
- "\xa5\xc1\xb2\xcd\xad\xf5\x28\xf7\xc9\xee\x09\x67\x16\x3e\xdb\x41"
- "\xd7\xf7\x0d\x07\xa3\xa1\x12\x04\x29\x23\xaa\x9c\xdb\xc3\x74\x17"
- "\xf6\x2d\x85\xf3\xc3\x3e\x16\x4e\x8e\xc7\xba\x66\x9f\xfd\x95\x3a"
- "\x3c\x6b\x13\x1b\xce\x87\xa7\x94\xb9\xd6\x3d\x90\xce\xf2\x12\x1b"
- "\xe8\xef\xcf\xb1\x5f\xff\x92\x75\x90\x1d\x02\x5c\x8e\x44\x47\xc6"
- "\x1c\xe6\xc8\xf8\x0e\xdb\x8a\x48\x29\xdb\xb1\xc4\x81\x98\x3d\x90"
- "\x4e\x36\x51\x7e\xce\x25\xd0\x3b\x01\x59\xaf\xdf\x2f\x2b\xe6\x7d"
- "\x0d\xc1\xbe\x02\xf1\x6d\xcc\xd9\x1a\xeb\xeb\x6b\xe9\x21\xb2\x0f"
- "\x96\x37\x49\xe4\x6d\x23\xdf\x6c\x6c\x63\xed\x24\x11\xe9\x2c\x76"
- "\xdd\xa7\xe9\xb2\x7f\x2d\x61\x87\x72\x9b\x00\xce\x2e\x61\xee\x24"
- "\xf7\x17\x5e\xcc\xcb\x80\xf7\xad\x76\x98\x10\xa2\xea\x8c\xfb\x5c"
- "\x0b\x1f\xf9\x5d\x11\x8e\xde\x32\x9f\x8d\xc1\xf8\xd8\xf5\x5b\xd3"
- "\xa6\xbb\x25\x5d\xd3\x39\x56\x93\x7b\x3f\xca\x96\x0d\xac\x69\x09"
- "\xab\x7a\x26\x9e\xb9\x72\x3e\x01\x1c\x1b\x1d\x05\x8c\xb5\x91\xbd"
- "\x74\xcc\x91\xf4\x34\x18\x7a\xa5\x1b\xd8\xde\xca\xa3\xb0\x3c\x9e"
- "\xd5\x57\x5b\x3d\x70\xd0\x59\x07\x2b\x3e\x83\xd0\xcc\x03\x10\xb6"
- "\x22\x9e\x39\xaa\x52\x8e\x02\x2f\x3f\x00\x99\xc7\x41\x5c\x5e\xc1"
- "\x5c\x53\x30\x4f\xef\x3f\x4a\xe5\x75\x58\xee\x81\xcc\x7a\xe6\xce"
- "\x78\x18\x42\xe9\xfb\x81\x0a\x2a\xff\x0a\xd0\x9f\xc5\x24\xab\xc3"
- "\x50\x8c\x6d\x52\xfd\x12\x94\xc5\x7b\x8e\xed\xcc\x3d\x07\xb0\xfc"
- "\x01\x30\xad\x98\x01\xc6\x24\x1c\x2e\x54\xbb\xb7\x43\x92\x87\xe1"
- "\x38\x60\x0f\x3c\x33\x0b\x42\x92\xdc\xf4\xf7\xe3\x87\xf1\xdc\x00"
- "\x25\x48\x8b\x7d\xb3\x51\xdf\x96\x1f\xc3\x71\xd1\x29\xb5\xce\xfb"
- "\x4a\x9d\x63\x40\x3a\x3b\xdf\xfb\xfd\x1a\xd7\xda\x0f\x92\xb1\xef"
- "\x73\x48\x07\xd8\x4e\x8d\x97\xea\x9d\x93\xf3\x13\xe9\x40\x37\xdd"
- "\x8d\xb6\xba\xce\x92\x3c\xdd\x6a\x93\xf9\xda\xf5\x6f\x6e\x29\x59"
- "\x20\xcb\xe4\x47\x9b\xe4\x66\x67\x1d\xe1\x16\xe4\xf5\x66\x4d\x92"
- "\xf5\x67\x4c\xc1\x0d\x71\x79\xcb\xa8\xea\x5b\xc5\xc5\xae\x7f\x4b"
- "\x44\x2c\x40\x9f\x0e\x88\xc7\x5b\xb1\x76\xdd\xdf\x26\x6b\x6c\x97"
- "\xe2\x56\x57\x95\x56\xa1\x99\x6a\xd7\x1d\x2a\xf0\xd1\xfc\x21\x0a"
- "\x6d\xba\x85\x06\xef\xa3\xfd\x1f\x2e\xf2\xdd\x97\xed\xb9\xe5\xbe"
- "\x92\x7f\x55\xde\x7a\x66\xbc\xdb\xee\x09\x4f\x01\x16\x6e\x30\xb2"
- "\xb3\xa6\x50\x26\x20\x36\x6e\xe6\xf2\xae\x9b\x94\x8c\x39\x36\xb4"
- "\xda\xed\x04\x4e\x5f\xd6\x8f\xad\x33\x98\xf8\x6f\x5e\xcb\x74\xc4"
- "\x13\xc7\x62\x1b\x31\x5f\x1b\x93\x2a\x99\x8b\xe2\x87\x67\x5d\xdf"
- "\xbc\x9c\x05\x98\xb3\xd7\x4d\x77\x78\xc3\x1f\x02\xd7\xeb\x8b\x6b"
- "\x28\x27\x90\xbf\xb1\x02\xac\xab\xf0\xc1\x76\xbb\x60\xbf\x8f\x78"
- "\xb0\x3e\x2b\x98\x94\xcc\xcb\x79\x7c\xe3\x71\xe8\xad\x23\x2c\x1a"
- "\xef\xe5\xdd\x5d\x87\xf7\xba\xd4\xea\xcb\x52\xb1\x1c\x58\xde\x84"
- "\x48\x5b\xc6\x19\xe2\x31\x8b\xdb\xf4\xdd\x76\xbf\x6b\x81\xf4\xf9"
- "\xc7\x6d\x14\xa3\x28\x36\x61\xf9\x0b\xbe\x38\xc1\x73\x00\x8f\xed"
- "\x93\x52\x1a\x73\xca\x8a\xec\xba\xd1\x16\xd2\x13\x61\xeb\xe4\x71"
- "\x6d\xa3\xe7\xf5\xc5\x47\x76\xc7\x03\xec\xae\x20\x3f\x2a\xb3\xd9"
- "\x75\x37\xcf\xf1\xe9\xb2\xec\x33\xa2\x95\xe5\xc4\x58\x42\xdf\xe5"
- "\xb8\x82\x75\xd0\xcf\x37\x52\xce\xe2\xf1\xb1\xec\x10\xe5\x2d\x8c"
- "\x13\x21\x3c\x4f\x8d\xb3\x20\xef\x0a\xd6\x27\xa3\x0c\xe5\xca\xaa"
- "\x55\x64\xd1\xca\xa6\xc6\x45\xb6\x36\x33\x96\xd3\x4e\xc2\x7c\xf1"
- "\x76\x9c\x5d\x37\x66\x82\xd6\x5e\x78\xbf\xde\x7e\x03\x6d\xfa\xc8"
- "\xa8\x0a\xbc\xc6\xb1\x94\xca\x0f\xe3\x4b\x08\xc6\x95\x7c\xb2\x37"
- "\x8a\x29\xeb\xf3\x69\x7c\x94\x39\xce\xb5\x36\x33\x0e\x79\xad\x51"
- "\x63\x0b\xd5\x25\x7f\xc0\xf8\x12\x22\xc7\x0d\x8f\x5b\x2f\xfb\xbc"
- "\x07\x62\x5a\x62\x09\x96\x9d\xef\x9d\x39\x4e\x29\x17\x65\x99\x04"
- "\xbd\x17\xdb\xd7\xa9\xed\x9d\xef\x9d\xe8\x42\xbe\x75\x76\xdd\x20"
- "\xab\x5f\xac\xc9\x8f\xcb\x62\xcc\x42\x76\xa3\x3f\xa1\x7f\xa7\x3b"
- "\x7e\x76\x53\xec\xf4\x9a\xdd\x95\x00\x13\xee\xc1\x36\x10\xcf\x57"
- "\x22\x98\xa3\x31\xe7\x9d\x28\x3b\xcc\x97\xe5\x7a\x01\xaf\xa9\x9c"
- "\x68\xb0\x7c\x3c\x96\xbb\x39\xdf\x3f\xc4\x12\x3e\x01\x7c\x67\x71"
- "\xbe\xef\x3c\x45\xfc\x94\x1c\x7f\x0d\x7d\xa7\xfa\xc4\x7b\x43\x21"
- "\x6b\x20\x7e\xc8\x6b\xb5\xda\xc6\x4b\x58\xa6\xb6\x33\xe1\xa9\x96"
- "\xb6\xb6\xe0\xfd\x55\xda\x3e\xac\x2f\x64\x4e\x45\xbe\x0a\x3b\x3c"
- "\xe7\xa0\x7b\xab\xb1\x8c\xea\x72\x5b\x78\xe7\x38\xd9\x89\x9d\xf7"
- "\x4b\xcf\xed\xe5\x1d\x87\x1d\x56\x59\xb5\xb9\x07\xb1\xe8\xa9\xe6"
- "\x26\xce\xef\x4f\x61\x2a\x3f\x1f\x2f\xce\x83\xe5\x65\xc5\x2a\xbe"
- "\x40\x3e\x1b\x4a\xfc\x91\x7e\x82\x1d\x16\x56\x71\xd9\xfe\xb8\xcd"
- "\xc9\x6d\x1b\x31\x90\xeb\x70\xcc\x73\x7e\xbf\x91\xf2\x66\x49\x3e"
- "\xc5\xb1\x44\x27\xd6\xb1\x06\xe4\xcc\x10\x9e\xcf\x52\x24\xb2\x0d"
- "\xc5\xff\x77\x90\x4c\x6a\x7f\x91\x8f\x88\x7c\xde\x21\x9b\x26\x3e"
- "\x18\xe7\xec\xc8\xc7\x16\xc0\x47\x24\x3a\x1c\xd7\x7c\x4d\x39\xfa"
- "\xe5\x08\x56\x8f\x34\x75\x2a\x0d\xdd\x47\xbd\xde\x89\x65\x2e\x3b"
- "\xac\x5d\x41\x65\x39\x48\x63\xd7\x6f\x69\xf3\xef\x76\x32\x06\x81"
- "\x50\x5d\x64\xa7\x39\x2d\xf9\xef\xf8\xea\x48\x27\x54\x17\x79\xc1"
- "\xfb\xbb\xdb\x20\x2e\x83\xd9\x4e\xe8\xb7\x2d\x3e\xe8\xaa\xef\xe0"
- "\xdc\x7f\x5b\x9c\x6c\x87\x4d\x38\xf7\x5a\x71\x13\xd0\xb8\xe4\xb4"
- "\x7e\xfb\xe6\x6a\xc7\x19\x39\x96\xe1\x77\x39\x07\xbe\x8c\x73\x35"
- "\x9a\xaf\xe1\x9c\x3c\x2d\x4f\xe0\x73\x36\x2f\xd2\x16\x53\x39\xcd"
- "\xe7\x30\x47\x95\x68\xee\xb1\xdf\x8d\xcd\xe2\xba\xdb\xfe\xb0\x1c"
- "\xd3\x49\x5e\xf7\x44\x1b\xc9\xec\xdd\x34\x36\x8b\xfa\x90\x69\x65"
- "\xde\x6a\x77\xa3\x8d\xf2\x98\xb4\x84\xe6\x9a\xdb\x6f\x4b\xda\x00"
- "\xcc\xbb\x79\x6c\x07\xe7\x7a\xdb\xe5\xbf\xbd\xc1\xf9\xf8\x69\x47"
- "\xf4\xd8\xac\x4c\x0f\x08\xb9\x19\x5d\x42\xee\x2e\x62\xb6\xb3\x43"
- "\x6f\x43\xbb\xd8\x3e\xed\x43\x2b\x40\xc7\xc7\xe8\xdb\xa7\xa9\x7d"
- "\x2f\x56\xfa\x8e\xfa\x92\xff\x5e\x64\xd4\xfa\x2c\xb9\xbf\x48\xd3"
- "\xe6\xbb\xde\x58\xb6\x81\xed\x2e\x72\xc3\xc2\x22\xd6\xb4\x70\x03"
- "\x08\x38\x46\xaa\x79\xab\xf8\x08\xc5\xed\x38\x55\x9f\xb2\xee\xdc"
- "\x0e\x48\xcf\x00\xe3\x49\xfd\x9f\xef\x48\x5a\x91\x25\xef\xdd\xb4"
- "\x0b\xe9\x3a\x26\xeb\x9f\xe5\x77\x0f\x1c\xc4\xf9\x7d\x92\x3b\x93"
- "\xf1\xdc\xf3\xe7\xc7\xa7\x28\xfc\xe8\x9e\x8a\x5f\xb1\x32\xef\xee"
- "\x44\x1b\x6d\xbe\xff\xe3\x02\x7d\x35\x06\xef\xeb\xbb\xc3\x2f\xa1"
- "\xaf\xce\xd6\x7d\x7d\xf7\x97\x97\xb7\xaf\xef\xb6\xb9\xff\xd7\x05"
- "\xfa\x2a\x05\xef\x6b\x79\x78\xe7\xfb\xfa\xae\xbd\x75\x5f\xcb\xef"
- "\xb8\xbc\x7d\x2d\x6f\x73\xfd\xef\x02\x7d\x8d\x0d\xde\xd7\x1d\xba"
- "\xce\xf7\xb5\xbc\xaa\x75\x5f\x77\x0c\xbf\xbc\x7d\xdd\x11\xdb\x66"
- "\x5f\x05\x03\xa3\xf8\x84\x71\xa9\x29\xe3\x3c\x8e\xd9\x0a\x1f\xcd"
- "\x7b\xe6\x75\x10\xaa\x9c\x2e\x38\x18\x79\x04\x32\x9f\x06\x61\x64"
- "\x3a\xc6\xbd\x6c\x18\xcf\x0a\x7b\xe5\x1d\x2c\x6a\xc0\xf2\x13\x70"
- "\xc0\xea\x82\xb8\x05\x14\x7f\x77\x7c\x5f\x9d\xda\xd1\xf8\xbb\xc3"
- "\xd6\x12\x7f\xdd\x37\x29\x31\xf7\x2f\x83\x0e\x36\x34\x01\xf5\x1f"
- "\xbf\xf7\x6c\x89\xbf\xd9\x5c\xdf\x81\xf1\x97\xf4\x51\xed\x72\xf9"
- "\xc5\x5f\xfe\xf7\x5b\xef\x7d\x16\x18\x7b\x73\x4e\x02\x04\x8f\xbd"
- "\xef\x6d\xa7\xd8\x5b\x8c\xf7\x3b\x26\xff\x7b\x59\x6a\xec\xcd\xc3"
- "\x36\xb5\xb1\x77\x77\x2a\xe5\xe4\xf7\x8e\x74\x2e\xf6\xbe\x77\x44"
- "\xed\xf7\x06\xa5\xdf\x58\x36\xde\x3f\xf6\xfe\xa5\xcd\xbf\x75\xd1"
- "\xda\x2d\x2b\x9c\x58\xf6\xd6\x00\x57\x17\xef\xa6\xdb\x6c\x94\xdf"
- "\x1a\x51\x27\xef\x16\xbb\xc4\x13\xfa\xbf\xf0\x77\x15\x34\xa6\xea"
- "\xd8\xa6\x71\x69\x49\x8b\xd8\x17\x2c\xfa\x36\x1b\xad\xa1\xd2\x5a"
- "\x00\xde\xdf\xc3\x36\x8f\x4b\xeb\x98\xdc\x9c\x27\xe6\x3f\xc8\x40"
- "\x7f\x79\x6b\x89\x4b\xf0\x2e\xb7\x18\x10\x07\x23\x5b\x37\xc9\xc1"
- "\x9e\xbf\x75\xe7\xd9\x75\x33\x52\xf6\x98\xbf\x02\xa2\x65\x2b\xc5"
- "\xb8\xce\xcb\xbf\x33\xf9\xc2\xf2\xef\x7c\xae\xe3\xf2\x73\x9e\xed"
- "\x93\x7f\x67\x72\xbb\xe4\x8f\x40\xf9\x9b\xc6\x75\xc1\x39\xa1\xb0"
- "\xab\x69\x9c\xd8\x41\x79\xec\xed\xc2\xf8\x92\xda\x78\xbf\xdd\xf1"
- "\x8f\x45\x58\x1c\x6f\x15\x3b\x04\x8c\x01\x72\x0e\x27\xdf\xe3\xf1"
- "\xaf\x1e\x63\xd6\x17\x8c\xc7\x24\x47\x07\x63\xd2\xfb\x15\xed\x6f"
- "\xff\xde\xe4\xcb\xdf\xfe\x07\x6d\xf7\x3f\x30\x26\xbe\x79\xbb\xbd"
- "\xed\x98\x38\x39\xb9\x75\x4c\xdc\xd5\xbd\xe3\x31\xf1\x83\x43\xad"
- "\x63\xa2\xed\x16\x5f\x4c\xb4\x0d\xea\x7c\x4c\xdc\x75\xaa\xfd\x31"
- "\x71\xd7\xde\xce\xc5\xc4\x5d\x05\x17\x8e\x89\xbb\x1a\x3a\x17\x13"
- "\x77\x35\xb4\x8e\x89\xbb\x92\xfd\x63\xa2\xad\xcd\xbd\xfe\x58\x5e"
- "\x6c\x3c\xe6\xe8\xd0\x93\x7a\x9b\xd3\x9d\x0d\xe0\xcd\xfb\xe3\xea"
- "\x24\x0f\x6b\x64\x6b\x63\xe3\xbd\xc2\x18\x8a\x2b\x71\x8d\x8d\x69"
- "\x21\xde\xa5\xe6\x50\xd6\xe7\xee\x17\x59\xb3\x09\x50\x4f\x51\x28"
- "\xbf\x81\x35\x9a\x7b\xb1\xa5\xe6\x3e\x45\xe7\x20\x0c\x4f\x53\x91"
- "\x92\x8f\xf1\x7b\x2c\x5b\x6a\xea\x91\xb3\x04\x62\x0c\x4e\x08\x41"
- "\x19\x2c\x86\x95\x46\xc0\x18\x14\x46\xdf\x59\xf6\x6e\xb1\xe4\x1c"
- "\x88\x06\x2b\x62\xd3\x1b\xdb\xb3\x1a\x18\x5b\x68\x86\x92\x05\x10"
- "\xe2\x15\xc0\x54\x2c\xb0\x32\x77\xa3\x59\xf0\x84\xa5\x18\x39\x3e"
- "\x1f\x6e\x61\x11\x38\xf7\x2a\x98\x7e\xd4\x1b\x31\xbd\xc2\x93\x99"
- "\xa6\x67\xcb\x2d\x7a\x92\xd5\x53\x30\xdd\xc6\x0a\xf1\xcc\x4c\xeb"
- "\x45\x63\xe8\x92\x25\xd8\x76\xa3\xa9\x47\x2e\xb6\x5d\xbc\x04\xa2"
- "\x36\x9c\x03\x33\x3b\x6b\x16\x10\x7f\x0b\xed\x81\x8a\x3a\xb2\x78"
- "\x85\xdd\x22\xde\x13\x29\x26\x32\x6a\xdf\x8d\xed\x37\x9b\x69\x1d"
- "\x0b\x6d\x1b\x4c\x25\xd8\xbe\x67\xa9\xb9\x83\xfe\x22\x3f\x31\xd1"
- "\xa9\x72\x79\x63\xee\xb2\xb3\x37\xf1\x24\xb9\x50\x87\x25\xa4\x93"
- "\x91\x77\xd5\x91\x6c\x2f\x9d\x83\x18\x94\x33\x0a\x65\x30\x63\xbb"
- "\xf4\xfe\x18\xcb\x23\xf3\x8d\x64\xa3\x7e\xb2\x79\xd6\x2a\xb2\x7d"
- "\x8b\xb2\x9d\xf6\xc9\x46\x6d\x91\x7e\xda\x7a\x36\x9b\xf4\xcc\x00"
- "\xf2\xcd\xaf\x0d\xd6\x6e\xf1\xf4\x9c\xf6\xec\xf2\xb4\x0e\xda\xea"
- "\x47\x71\x6d\xd9\x4b\xee\x9b\x10\xc9\x8c\x9b\xcb\xa7\x3c\xf7\x05"
- "\xa3\x75\xc2\xe7\xde\x84\x98\x6a\xf4\xeb\x83\xae\x53\xc0\x7a\x6f"
- "\x2e\xdf\x63\x6e\xe8\x68\x5b\x6d\xbe\xff\xf4\xc5\x6c\x56\xe3\x0d"
- "\x4b\x01\x16\x36\xc3\x92\x9b\xcd\xac\xcd\x51\x63\x37\x36\x45\x8d"
- "\x4b\x9f\xee\x36\xa2\x5d\x33\xab\xb4\x00\xa4\x13\xfa\xca\xef\xf6"
- "\x1d\xc2\x79\xe9\x83\x10\x52\xab\xdf\x6b\xce\xfc\x8c\x9e\x61\xed"
- "\x1e\xef\xff\x0c\x6b\x77\x0a\xe8\x2b\x6a\x40\xbf\xc7\x0e\xfa\xff"
- "\x11\x01\xe9\xfc\xcf\x4a\x89\xf3\xaa\xd8\x9a\xf4\xc6\x00\xc8\x70"
- "\xb3\xaf\x59\x81\xa1\x32\x47\x60\xae\xa4\xe1\x3a\xbb\x6d\x09\x3d"
- "\xdb\xa9\xd8\x8c\x3a\xfd\x06\x73\xad\x01\xbf\xcf\x47\x4c\x21\x7d"
- "\x01\x5c\x7b\x52\x5f\x91\x4e\x7e\x63\x70\x76\x8b\xf7\x64\x5a\xc0"
- "\x2d\x2d\xae\x69\x2e\x98\xee\xf0\x14\x4c\x4a\xf6\x1a\xff\xb8\x9a"
- "\xd6\x79\xe9\x99\x2c\xfa\x86\x65\xba\x27\x84\xfc\xd1\x62\x7b\x74"
- "\x1f\x9c\x58\x04\x42\xe6\xf7\xd0\x13\x6d\xb3\xc5\xaf\xee\x6d\x30"
- "\xb8\x9e\x69\x60\x5e\xf2\x2d\x5a\x57\xc5\x7b\xbd\x32\xbe\xc7\xf9"
- "\xbd\xa3\x1e\x8a\x16\x40\x98\x67\x61\x5a\x1f\xc7\xd9\xb4\x6b\x5f"
- "\xf3\x42\x58\x2f\x27\x18\x8b\xce\xa0\x4d\x2d\x44\x7b\x3a\x83\x7e"
- "\xe6\xe0\x7e\x46\xef\x00\x28\x26\x1f\x7b\xf1\xe4\xfa\x92\x33\xdc"
- "\xc7\x64\x3b\x22\x1f\x9b\x87\x76\x34\x97\xf2\x07\xda\x51\x36\xfa"
- "\x18\xfa\x05\xcb\xf9\x48\x2a\xca\x66\xb4\xee\x2b\x94\x9c\xec\x46"
- "\xf7\x74\x5d\x86\x0b\xd2\xbe\x64\x17\xf8\xd6\x3a\xf6\x0e\x6f\x8a"
- "\x1e\x97\x2e\xfd\x8a\x7d\x5b\xab\xaf\x28\xc2\xf2\x10\xe9\xfe\x61"
- "\x46\xd4\xf7\x70\xbe\xee\xb6\xd7\x4c\x6b\x99\x76\xd4\x05\xe9\x45"
- "\xfa\x15\x0c\xab\xd5\xef\x9e\x4f\x7a\x5c\xba\x05\xf4\xe9\x77\xb2"
- "\x3a\xd4\x19\x3d\x67\x41\xda\xdd\xf2\x6f\x65\xe8\xb9\xff\x7e\xf9"
- "\x99\x1a\xaf\xe3\x41\xbd\xb9\xc3\x0c\x26\xc4\x5b\xb2\xcd\x6e\x92"
- "\xe3\x10\xe9\xf1\xc4\x1c\x10\xa6\x37\xa0\xae\x3c\xa8\xab\x46\x73"
- "\x28\xc6\xa3\x64\x8a\x47\x2c\xef\xee\x55\x2b\xec\xcc\x9b\x94\xaa"
- "\x67\x19\xf3\x21\x84\xd6\xb7\x1f\x49\x07\xf6\xcc\x29\xd4\x97\xf3"
- "\x08\x60\x5c\xea\x85\x31\xab\xcf\x86\x25\x10\x46\xfa\xea\xd9\x80"
- "\x63\x95\xfc\xdf\x67\xbd\x99\x51\xd9\xc5\x83\xf6\x4b\xf1\xc9\xb0"
- "\x52\xd7\x1d\xfd\xac\xd7\x1a\xf2\x47\xf4\x4f\xc3\x4a\x39\x5e\x5a"
- "\x8a\xd0\x0f\xdd\x4b\xcd\x83\x9b\x97\x9a\x25\x3c\x07\xa8\x31\x4c"
- "\x8d\x1f\xa8\xb3\xd5\x14\xbf\xaa\xad\x76\x70\xa3\x6e\x7b\x51\xae"
- "\x5b\x6a\x8e\x94\x75\xfc\x84\x19\x46\xb9\x40\x87\x32\x19\x51\x5e"
- "\x28\x99\x09\x21\x07\xd2\x6a\xc1\x83\xbe\xa1\xea\xfd\xde\x59\x12"
- "\x20\x5f\x61\x8f\xf9\x30\x28\x3a\xd3\xb5\x6d\x77\x7f\xf5\xf8\xec"
- "\xee\xaf\x1e\xd2\x1d\xb7\xbb\xbf\xba\xaf\x44\xbb\xdb\x6f\x91\xed"
- "\x4e\xdf\x1c\x2d\xdb\x93\xb5\xda\xfd\x0e\xea\xe8\xaf\xf5\x64\x23"
- "\x64\x33\x7b\xff\x40\x36\x53\x69\xfc\xb1\xda\xcc\xf9\x46\xb3\x84"
- "\xe7\x0f\x62\x33\xc8\x57\xb6\x19\xd2\xd5\x7e\x4b\x13\xa8\x3a\x92"
- "\x7d\x35\x6f\x73\xb9\x94\x09\x3f\x43\x5f\x35\x1b\x56\x0e\x80\x03"
- "\xb2\x9e\xf6\x9a\xa5\xfb\x99\xb7\x56\x5f\x99\x90\xf9\x31\x18\x9b"
- "\xb2\x19\xab\x76\x6f\x05\x6f\xd8\x43\x40\xcf\x27\xbd\x05\x7d\xf3"
- "\x70\xce\x4a\xbf\x0f\xb0\xd3\xda\xbb\x21\x9d\xd6\xbb\x7f\x97\xe7"
- "\x59\x37\xdb\xe1\x5d\xbb\xb9\x92\xf5\xfe\x20\x9e\x9e\x31\x78\xd7"
- "\x3e\x97\xe7\xed\xfd\xfe\xc6\xc6\x9c\xca\x3c\x3b\x7c\xc9\x9f\x77"
- "\x15\xa4\xd0\x18\x8c\xe2\xef\x0e\xfe\x3c\x8c\x9e\x1d\x56\x96\xa9"
- "\xcf\xbd\x29\x26\x28\xcf\x18\x94\x67\x10\x95\x84\x61\x0f\x7a\x06"
- "\xc1\x63\x4a\xe5\xeb\xea\x33\x08\xf5\x9a\xee\xdb\xf5\x95\x9b\xe4"
- "\xe7\xb0\x2d\xf5\xf6\x4a\x9c\x4e\xad\xb7\x3b\x9a\x62\xbd\xaf\x1e"
- "\xbf\xc6\xb8\x22\x35\x0b\x10\x12\x74\x8c\x13\x36\xdb\x81\xfe\x83"
- "\x73\xa3\x7d\xaf\xe3\xa7\x80\x7a\xf9\x10\x3f\xf5\xf8\x29\xaf\x63"
- "\x76\x2c\x5f\xed\x9d\xc6\x9f\x03\xcd\x58\xa5\xc4\xc6\x87\x65\x9f"
- "\xbc\x01\x7a\x9e\x54\xbe\x37\xe6\xec\x2d\x57\x9f\xdf\xb7\xd0\xfb"
- "\xf0\x99\x4a\x6d\x23\x46\x22\xff\x4d\x01\xbf\xa6\xdf\xeb\x28\xfc"
- "\xe4\x6b\x6f\xd4\xed\x29\xb6\x8c\x5a\x68\xd0\xef\x8b\xaa\xc6\x1c"
- "\xee\x2d\x9c\xb1\x8a\x9e\x8f\x91\x5f\xa9\xed\xa2\x2f\x86\xd8\x96"
- "\xc9\x34\xf2\xdf\x89\x7a\x0b\x2c\x29\xac\xd0\x90\x47\x73\xc1\x46"
- "\x96\x76\xa7\xf2\x79\x07\xf9\x13\x5f\x37\xd9\x37\x9f\x21\xb6\xb4"
- "\x87\x7b\xcb\x6f\x98\x68\x6f\xf5\x2c\x51\xfa\x70\x05\xcf\x95\xaa"
- "\xbc\xb4\xff\x3a\xfd\x46\x68\x58\x16\x64\x35\x06\xd9\x7f\xdd\xf7"
- "\x5b\xa2\x7d\xd3\xbc\xeb\x2c\x29\x8d\x39\xfb\x4a\x31\x97\x37\x68"
- "\xfb\x1c\x0c\x0b\xa4\x6f\xf3\x37\xed\x1d\xc3\x61\x5f\x5d\x5b\x7c"
- "\xee\x31\x7b\x58\xc7\x78\xed\x6f\x7b\xfd\x27\x6a\x2c\x24\x6d\xf1"
- "\xd8\xbc\xcd\x16\xc3\x9e\x15\xa7\x3a\x38\xb6\xd9\xdf\xe6\xfb\x7f"
- "\x3c\x05\x0f\x49\xcd\x43\xc7\x92\x2f\x87\x7a\xe6\x59\x26\x1e\xdc"
- "\xe2\x86\x37\xe6\xd6\x0b\x14\x0f\x4b\x4f\x96\x09\x49\xc3\x95\x31"
- "\x5c\x1d\x18\x69\xdd\x8b\xc6\x72\x39\xa7\x21\xaa\x29\xd3\x62\x68"
- "\x6a\xb6\xc0\xaf\x4f\xc3\x78\xef\x13\xa6\x1e\x6b\x66\x82\x78\x1e"
- "\x63\xe1\xf9\xaf\xd3\x0c\xfb\x8f\xd6\xc3\x2e\xac\x7b\xd0\x69\x87"
- "\x62\xa4\x65\x5f\x5b\x7a\x4d\x4a\x61\xae\xaa\x94\x77\x20\xc9\xec"
- "\xb1\x65\x1c\x87\x9e\x18\x13\x8d\xd5\xd6\xcd\x38\x87\x3a\x05\x5d"
- "\x9e\x16\xa4\x6a\xf7\x57\xf0\xd2\x4c\x8c\xa5\x18\x3b\x33\xef\xc3"
- "\x9c\x81\x36\xf1\x9a\x36\x67\xcc\x7e\xd5\x97\x33\xbe\xc5\x9c\x91"
- "\x8f\x39\x23\xd3\x04\x07\xd3\x6d\x80\x31\xac\xdb\x94\x74\x83\x2b"
- "\x23\x1d\x73\xc7\xd3\x98\x3b\xac\x5f\x81\x9c\x37\x1a\xea\x01\x63"
- "\x7e\xaf\x0d\x73\x21\xac\xe9\x5b\xcc\x1d\xdf\x62\xee\xc8\xe0\xb9"
- "\xe3\x95\xd3\x98\x3b\xe6\xe1\xdc\x60\x2e\xe6\x8e\x86\x20\xb9\xe3"
- "\x74\xf0\x79\x81\x1a\x07\xcf\x7f\x6b\x16\x5e\xc1\xbc\xb1\xec\x30"
- "\x08\xaf\xdc\xdf\xad\x83\x36\x73\xa0\xcd\xe7\x28\xac\x70\xc6\x63"
- "\x5e\x66\x01\xd2\xfb\x32\x17\xe6\x61\xc4\xa5\xda\xec\x06\xc3\xa1"
- "\x6e\xf1\xe7\xb1\xbc\x39\x62\x62\xcd\x96\xcf\x1d\x02\x2b\x98\xe4"
- "\x38\x8f\xb8\x2d\x5b\x0c\x42\x33\x62\x58\xfa\xab\x3c\x81\xe6\x89"
- "\xde\x75\xf1\x61\x7c\x4e\x5a\x3d\x9a\xd6\x44\x0c\x76\x8e\x9b\x9b"
- "\x59\x0c\xec\x31\x4b\xcf\x97\x1e\x05\xd1\xf3\xa5\xa9\x87\xf7\x31"
- "\x53\x48\xc6\x61\x30\x3a\x1e\x4b\x43\x7d\x9d\x82\x5d\x9f\xe4\x09"
- "\x25\x0f\x82\x44\xef\x6b\x64\xcf\x1f\x4f\x2b\x79\x04\xc6\x95\xfc"
- "\x13\xc6\x14\x3f\x08\x31\x1b\x3e\xa7\xf7\xba\x23\x86\xf5\xcc\x75"
- "\x20\xed\x3d\x28\xf9\x1c\xe2\x58\x61\x62\x0d\x0b\x7f\x48\xc2\xef"
- "\xe3\xf2\x1e\xc4\xf9\x03\xde\x4f\x32\x9f\xb7\x55\x5b\x0f\xc0\x9a"
- "\x5a\x80\x8c\x7f\x29\x18\xb7\xe0\x7b\x0c\xdc\x02\xc6\x0f\x1a\x13"
- "\xdc\xcb\xf1\xa5\xe7\x5e\x34\xe7\x68\xc1\x78\xe6\x47\xfe\xe3\x02"
- "\x05\xe3\x03\x0d\x35\x80\x39\xb0\x5b\xcb\xf8\x40\xc6\xf8\x18\xa8"
- "\x63\x03\xc4\xa6\x17\x8e\x05\xc2\xce\x9f\x0d\x18\x1f\x2c\xe8\xe4"
- "\xf8\x40\x99\xdf\xb8\x17\x9a\x85\x22\x81\x41\xe6\x01\x10\xd6\x7b"
- "\x3b\x8a\xf1\x41\xf9\xef\x8b\x68\xed\x8b\xff\x76\xe7\xc0\x76\xc2"
- "\x02\xb1\xdf\x76\x9f\x59\x07\x9d\xc3\x3e\x3e\xf9\x22\xd8\x17\x70"
- "\xec\x3f\x1e\xd1\x39\xec\xe3\x93\x11\x7b\x5b\xe7\xb0\xff\xbe\x83"
- "\xd8\xcb\xef\xbd\xbc\x42\xb1\xaf\x71\xf9\x63\x5f\xfd\x36\xc7\xbe"
- "\xba\xec\x12\xb0\xbf\x88\xdf\x27\x28\x7e\xff\xe9\xf0\x4e\x62\x8f"
- "\x7e\x5f\x6b\xea\x1c\xf6\xa7\x3a\x88\xbd\xfc\xee\xcc\x2b\x14\xfb"
- "\x4f\x9c\xfe\xd8\x7f\xbc\x95\x63\xff\x71\x69\xe7\xb1\x4f\xb8\x88"
- "\xdf\x27\x28\x7e\x7f\x38\xba\x73\xd8\x27\xa0\xdf\xd7\xa6\x77\x0e"
- "\xfb\x63\x1d\xc4\x5e\x7e\xff\xe6\x15\x8a\xfd\x21\x87\x3f\xf6\x9f"
- "\xbe\xc1\xb1\xff\x74\xcb\x25\x60\x7f\x11\xbf\x4f\x54\xfc\xfe\xef"
- "\x83\x3a\x89\x3d\xf9\x7d\x65\xe7\xb0\x7f\xbf\x83\xd8\xcb\xef\xf0"
- "\xbc\x42\xb1\xff\x5b\x83\x3f\xf6\x87\x37\x73\xec\x0f\x6f\xea\x3c"
- "\xf6\x89\x17\xf1\xfb\x44\xc5\xef\x3f\xeb\xdf\x39\xec\x13\xd1\xef"
- "\xbf\x94\x3a\x87\xfd\x33\x1d\xc4\x5e\x7e\x0f\xe8\x15\x8a\xfd\x91"
- "\x7a\x7f\xec\xff\xfe\x3a\xc7\xfe\xef\x1b\xdb\x83\xfd\x72\x2d\xf6"
- "\x47\xbb\xc5\xe3\xdc\x4a\x1e\xe7\xbf\xf1\xa0\x82\xfd\xef\x10\x7b"
- "\xec\x7f\xe9\xfd\xeb\x03\xc6\xf8\xff\xe8\x2d\xe3\x9e\x82\xb8\x5b"
- "\x11\x77\x9c\x1b\xaa\x98\x23\x46\x3d\x09\x77\xc2\x3c\xe3\x18\x18"
- "\x77\x61\x5d\xc2\x87\x30\x46\x1c\x25\x19\xe7\xae\xc7\xd3\x98\x4e"
- "\x34\x11\x9e\x34\xee\x27\xcc\x2f\x36\xb6\x27\x9b\xb8\x28\xe6\xbf"
- "\xfc\x61\xc6\xf7\x4d\x81\xeb\x7f\x97\x0b\xf3\x8f\x71\x0e\x97\xd1"
- "\x51\xcc\x3f\x3f\xea\x8f\xf9\x67\xaf\x10\x0e\x76\xfd\x67\xeb\x3b"
- "\x8f\x79\x42\x72\xdb\x98\xab\x39\xfe\x58\x97\x4b\xc3\xbc\x36\xdd"
- "\x87\x79\x42\xf2\x85\x31\x3f\xd6\x09\xcc\x2f\x6f\x7e\xff\x71\x61"
- "\x7e\xb4\xc6\x1f\xf3\x7f\xbc\xc4\x31\xff\xc7\x9a\xb6\x30\xf7\x62"
- "\xbc\xa6\x35\x75\xfa\xbb\x44\x4f\xa3\x65\x62\x33\xe2\x4a\x7f\x9f"
- "\x48\x6b\xbd\x5b\xe7\x96\x0b\xcd\x88\x7b\xee\x12\x88\x5a\xb3\x04"
- "\xc6\x1b\xea\x79\xfc\x6e\xc2\xf8\xfd\xc2\x39\x10\xbd\x4f\x9a\x7a"
- "\xac\x39\x09\x62\x13\xea\xb8\xe9\xc9\x34\x43\x55\x8a\x03\x76\x9d"
- "\x2e\x17\x68\xed\x96\x9e\xdb\xb1\x6f\x2c\xbd\x12\x52\x99\xab\xaa"
- "\x2e\x9f\xaf\xab\x7c\xa5\xae\xab\x6c\xf5\x5b\x57\xf9\xf5\x49\x65"
- "\x5d\xe5\x01\x8e\x51\x91\x16\x9f\x47\x7e\xd3\xc6\xba\x4a\xe5\x45"
- "\xd7\x55\xe4\xf5\x94\xd3\x10\xd6\x3c\x2f\xad\xcf\x2b\xca\xba\xca"
- "\xab\x73\x2f\x6d\x5d\xa5\x69\x9e\x59\x78\x15\xf1\x59\xfe\x00\xe2"
- "\xf3\x79\x47\xf1\xf9\x67\x9b\x7f\xff\x1c\x98\x6b\xd5\x1c\xab\xe6"
- "\x55\xf2\x39\xca\xad\xae\x82\x89\x87\x02\xd7\x52\xc8\xdf\x4e\xeb"
- "\xed\x2b\x29\x26\x77\x6e\x3d\xe5\x4b\xeb\x4f\x6d\x3d\x85\x7c\x4e"
- "\xcd\xb3\x3f\x8e\x1c\x6b\x9f\xec\xef\x7b\x5f\x74\xe1\x39\xf6\x0b"
- "\xb1\xbd\xe3\xab\xb6\x31\x8f\x9f\x1a\xb8\x86\xc2\x31\xaf\x5d\x4c"
- "\x6b\x2e\x9d\x5b\x47\xf9\xb2\xea\xa7\xb6\x8e\xf2\xe3\xc3\xbc\x36"
- "\xce\x1f\x73\xfb\x79\x8e\xb9\xdd\x75\x19\x30\x3f\x14\xb8\x76\xc2"
- "\x31\xaf\x9b\x45\x6b\x2d\x9d\x5b\x3f\xa9\xeb\xe4\x58\xfa\x3f\xb7"
- "\x7e\xf2\xe3\xc3\xbc\x6e\x8c\x3f\xe6\xb5\xa7\x38\xe6\xb5\x0d\x97"
- "\x8e\x79\xc2\xd4\xc0\x35\x13\x8e\xf9\x89\x87\x69\xec\xd5\xb9\x75"
- "\x93\xba\x45\x3f\xb5\x75\x93\x1f\x1f\xe6\x27\xcc\xfe\x98\xd7\x1d"
- "\xe7\x98\xd7\xd9\x2f\x03\xe6\x87\x02\xd7\x4a\x38\xe6\xf5\xbf\xa4"
- "\xb5\x95\xce\xad\x97\xd4\xfd\xe4\xd6\x4b\x7e\x7c\x98\xd7\x47\xfa"
- "\x63\x7e\xe2\x30\xc7\xfc\xc4\xa1\x4b\xc7\x3c\x71\x6a\xe0\x1a\x09"
- "\xc7\xfc\xe4\x3d\xb4\xa6\xd2\xb9\x75\x92\xaf\x22\x7f\x6a\xeb\x24"
- "\x3f\x3e\xcc\x4f\x1a\xfd\x31\xaf\xdf\xcb\x31\xaf\xaf\x6c\xef\x9c"
- "\x59\x9d\x2b\xab\xf3\x63\x79\xae\x1c\x86\x63\xf6\x80\xb5\x11\x8e"
- "\x77\xc3\x68\x79\xcc\xde\xe9\xb9\xf2\x97\xd6\x9f\xca\xfa\x88\x8a"
- "\x35\xcd\x97\x7f\x1c\x73\xe5\x6f\x02\x9e\x7f\x9e\xdc\xc1\xe7\xca"
- "\x27\xcb\xdb\xc2\x3a\xd8\x6f\x11\x0e\xe2\x5c\x53\xfd\x2d\xc2\x0b"
- "\x4b\x10\x47\xb4\x03\xfa\x2d\x02\xfd\x26\x21\xd8\xef\x11\xe8\x77"
- "\x08\xea\x6f\x12\xb4\xbf\x47\x88\xb7\x33\x17\xfd\x26\x81\xe6\xc9"
- "\x55\x29\x2f\x82\xfa\xdb\x04\xfa\x0d\x42\xe6\x71\xe8\x49\x18\xd1"
- "\xef\x0f\x68\xbe\xfc\x43\xff\x06\x61\xbd\xf7\xc7\xf0\x1b\x84\x53"
- "\x6d\xbe\xff\x4e\xf5\xb9\x7b\xdf\x18\x00\x68\x6f\x2d\xeb\x54\xcd"
- "\x85\x13\x6b\xc8\xe7\x08\x23\x43\x03\xf7\xc3\xad\xf7\x97\x09\xd5"
- "\xd6\x72\x78\x61\x19\x18\xd5\xf5\x0b\xf2\x41\x8c\xcb\x06\x37\xe2"
- "\xb9\x66\x36\x5f\xc7\xf0\x7e\x63\xe9\xe9\x78\x32\xcd\x40\x7f\xb7"
- "\xbf\xeb\x6f\x65\x02\xad\x3d\x96\xcc\x84\x31\xaf\x9d\x80\x71\x07"
- "\x9d\xc7\x40\xf6\xa9\x75\xf1\x21\xde\x75\x13\x1d\xcd\xeb\x1e\x92"
- "\xbc\xe1\x13\x9d\x8e\xf0\x89\x2e\xc2\x6d\xcd\x49\x00\xf2\x2f\xc2"
- "\xad\xda\xba\xa1\x05\x2f\x19\x2b\x41\x59\xdb\x68\xd3\xa7\x3e\xe9"
- "\x34\x66\x45\xa7\x11\xb3\x79\xfe\x98\x6d\xe8\xec\xfa\x86\xfa\x7b"
- "\xee\x79\x66\x61\x03\xfa\xd4\xb2\x5f\x22\x66\xbf\xea\x28\x66\xdf"
- "\xb6\xf9\xfe\xef\xb6\x31\x8b\x4f\x6e\x27\x66\x05\xed\xc0\xcc\x16"
- "\x04\xb3\xd5\x58\x37\x9d\x63\x16\xbf\xc8\x11\x1e\x6f\xf5\x61\xf6"
- "\x7d\x3b\x31\x0b\x9c\xc3\x5e\x49\x98\x7d\x27\x76\x02\xb3\x76\xfa"
- "\x59\x42\x3b\xfc\xac\xd6\xd4\x1a\xb3\x04\xf4\xb3\x78\xc5\xcf\xe2"
- "\xd1\xcf\xe2\x35\x7e\x76\xaa\x9d\x98\x05\xce\x41\xaf\x24\xcc\xce"
- "\x94\x77\x1c\xb3\x84\x76\xfa\x59\x42\x3b\xfc\xac\x36\x3d\x08\x66"
- "\xe8\x67\x09\x8a\x9f\x25\xa0\x9f\x25\x68\xfc\xec\x58\x3b\x31\x0b"
- "\x9c\x43\x5e\x49\x98\x39\xdb\xfe\xfb\xef\xb6\x31\x6b\xa7\x9f\x25"
- "\xb6\xc7\xcf\x2a\x5b\x63\x96\x88\x7e\x96\xa0\xf8\x59\x02\xfa\x59"
- "\x82\xc6\xcf\xde\x6f\x27\x66\x81\x73\xc0\x2b\x09\xb3\x73\x52\xc7"
- "\x31\x4b\x6c\xa7\x9f\x25\xb6\xc3\xcf\xbe\x94\x82\x60\x86\x7e\x96"
- "\xa8\xf8\x59\x22\xfa\x59\xa2\xc6\xcf\x9e\x69\x27\x66\x81\x73\xb8"
- "\x2b\x09\xb3\xc6\x43\x1d\xc5\x4c\xc6\x0b\xc7\x8e\x41\x31\x6b\xf2"
- "\x1f\x37\xba\x71\x1c\x4f\xcf\xbc\x82\xe2\xf5\xfc\xf1\x34\xb6\x52"
- "\x34\x11\x56\x34\x1e\x24\xbc\xaa\xad\x7b\x20\xd8\xb8\x91\x9e\x8b"
- "\x21\xee\x40\xcf\xc6\x32\xbf\xea\xc0\x78\xf1\xd1\xb6\xb0\xba\xf8"
- "\xf3\xb0\xa2\xb9\x3e\xac\xd4\xe7\x61\x97\x15\xab\x4f\x3a\x8a\xd5"
- "\xf9\xac\xce\x61\x95\x90\x7c\x71\xac\x12\x0a\x2e\x8c\x55\x6d\xba"
- "\x0f\xab\x63\x1a\xac\x5a\xe7\xb1\xf6\x63\x15\x90\xbf\xae\x28\xac"
- "\x9a\x63\xda\xc2\xca\x1d\xf6\x90\x44\x7f\xf3\x3e\x05\xe7\xbe\xec"
- "\x31\xcb\xc4\x9c\x5a\x88\x7a\xb1\x16\xc6\xd3\xdf\x37\x6f\x5d\xe6"
- "\x12\xb0\x8f\x5f\xef\x3b\x54\x0f\xcd\xdf\x98\x7a\xd0\xdf\xcf\xc8"
- "\x71\xf2\x49\x53\x48\x75\x8a\x43\x8e\x89\x2f\x21\x46\x07\x9d\xe5"
- "\xa8\x93\x6e\xf1\x07\x9d\xef\x40\xd3\x42\x0b\xec\x3f\x7a\x12\x71"
- "\x61\xcd\xd5\x0d\xe5\x50\x82\xf7\x6d\x4b\xde\x01\xef\x37\xe6\x1e"
- "\xd3\xad\x20\x9c\xd6\x37\x3b\x68\xee\x3c\xca\x0a\xc6\xc9\x0d\xcc"
- "\x75\xb0\x61\x1f\xbc\xf6\x28\x44\xed\xb1\x02\x90\xae\xe5\xb9\xf2"
- "\x6c\x9a\x2b\xbf\xef\x87\xcf\xab\x9a\xb9\xb2\xfc\xf7\xb2\xe9\x88"
- "\xcd\x77\x01\xd8\xe0\x5c\x1c\x75\xdd\x6d\x8a\x13\xb1\x71\xaa\xd8"
- "\x9c\x82\x8c\xf9\x84\x8d\xdd\x37\x57\x56\xb0\x29\xa2\x98\x97\xae"
- "\x99\x2b\x9f\xd6\x60\xa3\xfc\xad\xaa\x1f\x36\xea\x5a\xc6\x52\x33"
- "\x3d\x23\x6f\x35\x57\xee\xdc\x5a\x86\xbb\xcd\xbf\x15\x91\xfd\x08"
- "\x7d\x64\x0a\xfa\xd1\x8a\x45\xb2\x1f\x71\xfd\x47\x4c\x44\x7b\x2f"
- "\x03\x83\xbd\x5b\xfc\x8b\x88\x41\x13\xfa\x1a\xe5\xa2\x4c\xec\x27"
- "\x61\x49\xb8\x4d\xd9\xd2\xdc\xfc\x88\x13\x04\x1c\x83\x87\x11\x76"
- "\x9e\x6f\x4c\x21\x39\x98\xab\xaa\xa7\x7d\x8e\xf8\x9c\x81\x6a\x87"
- "\x82\xcd\xb2\xcf\xe1\xb4\xde\xb3\x8a\x3d\x69\xee\x31\x12\xed\x14"
- "\x73\x8f\x71\x3a\xfd\xed\x0b\xc6\xbc\xd7\x66\xc2\xb8\xc9\xe9\xcc"
- "\x25\xff\x96\x07\x7d\x8c\xf2\x19\xc5\xc3\x83\xe9\x1f\x81\x67\xdd"
- "\x44\x67\x73\xf8\x43\xd2\x9e\x45\x00\x14\x13\x09\x8b\x2e\x8b\x7d"
- "\xd8\xd1\xdf\xed\x69\xd7\x3a\x5a\xc5\xc2\xd9\xfb\x82\xfb\xd7\x34"
- "\x7b\x87\xd6\x3b\x8a\x14\xff\x2a\xea\xec\x7a\x87\xba\x1e\x85\x18"
- "\xd2\xdf\xea\x65\x1e\x06\xe1\xd5\x0e\x63\xe8\x5d\xd3\x71\x0c\xe3"
- "\x93\x2f\x8e\x61\xa3\x8a\x61\xc1\xc5\x31\x64\xf1\xad\x31\x8c\x4f"
- "\xd7\x60\x68\xd3\x60\xb8\x9a\x63\x18\xbf\xc8\x87\x61\xbc\xf5\xe2"
- "\x18\x06\xcc\xa5\xaf\x24\x0c\x45\xb8\xf0\xfa\x47\x70\x0c\xdb\xe1"
- "\x87\xdf\x2a\x18\x26\x5c\xdc\x0f\x45\x5d\x68\x10\x0c\x35\x7e\x58"
- "\x6b\xf2\x61\x98\xa0\xf8\x61\xbc\xc6\x0f\xe3\xdb\xe1\x87\x01\x73"
- "\xeb\x2b\x0a\x43\x21\xac\xe3\x18\x26\xb4\xc3\x0f\xbf\x50\x31\xbc"
- "\xb8\x1f\x8a\x42\x4d\x6b\x0c\x13\x34\x7e\x88\x63\x17\x1f\x86\x8a"
- "\x1f\x26\x68\xfc\x30\xa1\x1d\x7e\x18\x30\x56\xb9\xa2\x30\xd4\x1f"
- "\xe9\x04\x86\xed\xf0\xc3\x5d\x0a\x86\x89\xed\xf0\x43\xb1\x20\x08"
- "\x86\x5a\x3f\xac\xf4\x61\x98\xa8\xf8\x61\x82\xc6\x0f\x13\xda\xe1"
- "\x87\x01\x73\xef\x2b\x0a\xc3\x2e\x17\x5e\xff\x0f\x8a\x61\x62\x3b"
- "\xfc\x30\x53\xc5\xb0\x1d\x7e\xd8\xd5\xd2\x1a\xc3\x44\x8d\x1f\x7e"
- "\x29\x69\x30\x54\xfc\x30\x51\xe3\x87\x89\xed\xf0\xc3\x80\xb9\xf8"
- "\x15\x85\x61\xb7\x94\xf6\x60\x88\xe3\xec\xd6\xe3\x52\xa7\x0f\x43"
- "\x2d\x7e\x81\x63\xd1\x24\x1c\xa3\x12\x76\xd3\xdc\x20\xb4\xc6\x2f"
- "\xc4\x44\xf8\xc5\xd0\xf3\xb8\xef\x7d\x63\x52\x19\x3b\xe5\x79\x0e"
- "\x61\xb6\x27\x15\x80\xc6\xa7\xea\x78\x94\x9e\xa9\xb6\x8c\x47\x1f"
- "\xff\xff\x74\x3c\x2a\x76\x8f\xec\x38\x76\x4a\x1e\x6c\x13\x3b\xff"
- "\xdc\x97\x84\x39\xb1\x6d\xec\xba\x1f\x6a\x8d\x5d\x42\xba\x0f\x3b"
- "\x9e\xf7\x38\x76\xb5\xe9\x6a\xfe\xe3\xd8\x29\xf9\xef\x82\xd8\x5d"
- "\xc9\xf9\xaf\x47\x9b\xf9\x2f\x4f\xf0\x96\xe1\x59\x8e\xa7\x0d\xcf"
- "\x4a\x8f\x00\xf7\x6c\x10\xbc\xfc\x77\xe3\xdc\x9e\x03\xef\x77\x65"
- "\xcf\x8f\x58\x45\x34\x6c\xa5\x28\x8f\x8d\x54\x1e\x9e\x1e\x00\x58"
- "\x6e\x33\xe8\x52\x68\x3f\x12\xa2\xed\xa6\xf2\x32\xac\x84\x38\xec"
- "\x33\xa7\x13\x20\x8b\xd3\xc5\x75\x25\x3a\x96\xb3\xaf\x0e\xcb\x42"
- "\x14\x9e\xb2\x9d\x79\x04\x81\x78\x05\xb6\xdd\x5d\xa1\x91\x3c\xd9"
- "\x20\x69\xdb\x46\x5e\xd4\xa6\x4a\xd7\x83\xe8\x3c\x5d\x85\xa3\x1e"
- "\x9d\x18\xa5\xa5\x63\x77\x81\x96\xee\x1a\x85\x9f\xd9\xaf\x1f\x83"
- "\x01\x0c\x3a\x89\xf7\xc5\x2a\xa8\x7d\x09\x95\x79\xf6\xda\x3b\x1e"
- "\x79\xc6\xf8\xf1\xec\x0a\xd0\x13\xe9\x89\x6f\xcf\x34\x59\x6e\xa2"
- "\xef\xc9\xba\x9e\x98\x23\xf3\xd7\x89\xb1\x5e\x01\x62\x79\xbf\x40"
- "\xdc\xd0\x22\xb3\x04\x79\xfe\x6d\xf4\x52\xf5\xa5\xa5\x23\x1a\x26"
- "\xb4\xd0\x18\x78\xdf\xbe\x4a\x47\x39\xc6\x69\xe5\xe0\x74\x30\x5a"
- "\xa1\x33\x62\xbf\xc6\xb7\x60\x59\x60\xa8\x54\xe9\x32\x3d\xd0\x0f"
- "\xb1\xb0\x55\xa7\x01\x28\x7a\xe8\xcd\x72\xf6\x5b\x15\x5d\xc4\x69"
- "\x79\xf6\xd4\xe9\xec\x1b\x14\x7d\x79\x73\xf6\xc7\x20\x6d\x1f\xef"
- "\x4a\x71\x42\x0b\xdf\x6c\x7a\xa7\x94\xa2\x87\x6c\xf7\xb5\x32\xdf"
- "\x7a\xf4\x2d\x41\x27\x29\x7a\xb8\x96\x68\xb1\x4e\x3c\xef\x97\xb1"
- "\x05\x57\x8f\x20\xd2\x3d\x9b\x86\x36\x8c\xeb\xf8\xb3\x78\xec\xdb"
- "\xe4\xd6\xf4\x21\x81\xf4\xe1\x9c\xfe\x40\x0a\xd2\x27\xb7\xa6\x37"
- "\x06\xd2\x47\x70\xfa\xea\x69\x48\x3f\xb5\x35\xbd\xbb\x4f\x00\x7d"
- "\x5f\x4e\xff\xb1\x05\xe9\x2d\xad\xe9\xa5\x40\x7a\x13\xa7\xff\x07"
- "\xd9\xc8\xb4\xd6\xf4\x71\x81\xf4\xfd\x38\xfd\xa7\x53\x91\x3e\xa5"
- "\x35\x7d\x56\x20\xfd\x75\x9c\xfe\x70\x32\xd2\xa7\x06\xd2\x97\xc8"
- "\xb4\x30\x58\xa1\xbd\x9e\xd3\xfe\x7d\x32\xd2\xa6\x05\xe9\xab\x5e"
- "\xe1\x1d\xab\xd0\x47\x72\xfa\xfd\x35\x48\x3f\x27\x08\x56\x81\xf4"
- "\xfd\x39\xfd\x49\xb2\xc3\xf4\x20\x58\x05\xd2\x0f\xe0\xf4\xff\x2c"
- "\x47\xfa\x45\x41\xb0\x0a\xa4\x1f\xc8\xe9\xed\xa5\x48\x6f\x0d\xa2"
- "\x7b\x7f\xfa\x5e\xb5\x1b\x91\x6e\xc5\x86\x6c\xd5\x7f\xfc\xf4\x1e"
- "\xc8\x7b\x10\xe7\x5d\x57\x80\x75\xb2\x82\xe8\x3d\x90\x7e\x30\xa7"
- "\x3f\xb1\x1a\xe9\x57\xb5\xa6\x07\x1d\xa7\x87\x9b\x14\xfa\x21\x9c"
- "\xbe\x7e\x05\xd2\xaf\x0e\xa2\x7b\xba\x6f\x53\xfc\x34\x8a\xd3\x1e"
- "\x8b\x45\xda\x35\x41\xf4\xae\xa5\x8d\xe6\xb4\xae\x48\xa4\xcd\x0b"
- "\xa2\x73\x2d\xed\x50\x4e\x7b\xaa\x0e\x69\x0b\x82\xe8\x5b\x4b\x3b"
- "\x8c\xd3\x7e\xbb\x1e\x69\xd7\x07\x91\x77\xb0\x86\xd6\xcc\x69\xbf"
- "\x23\xbb\x2a\x0a\x82\x8b\x96\x76\x38\xa7\x3d\x5f\x89\xb4\x1b\x83"
- "\xe0\xa2\xa5\xbd\x81\xd3\x9e\x05\xa4\xdd\x14\x04\x13\x2d\xed\x8d"
- "\xac\x97\x73\x9b\x12\x5b\xb7\x04\xd2\xa2\x0d\xd8\x30\x0e\x55\x62"
- "\x2c\x8c\x61\x39\xe7\xe8\xdd\x8e\x14\xd7\xe4\xf7\xe5\xa9\x34\x4c"
- "\x70\xdf\xac\xc9\x03\x23\x58\x4e\xc3\x34\x25\xfe\x95\x05\xf2\x63"
- "\x82\xa8\xa5\x1d\xc9\xf2\xbb\x6d\x51\x68\xb7\xb5\xa6\x0d\xd1\xd2"
- "\x8e\x62\x39\x1e\xa3\x42\x5b\xde\x9a\xd6\xd8\x42\xcb\x72\xbc\x87"
- "\x90\x66\x67\xb1\x12\x57\x35\x72\xde\xa4\xe1\x37\x9a\xe5\xc3\x7a"
- "\x85\x9f\xad\x35\x3f\x49\x4b\x7b\x13\xcb\xef\x9e\xaa\xd0\x56\xb4"
- "\xa6\x8d\xd3\xd2\xde\xcc\xf2\x05\xb5\xff\x95\xad\x69\xb3\xb4\xb4"
- "\x63\x58\xbe\x28\x29\xb4\x55\x81\xb4\xc5\x3c\x07\x09\x0a\x4e\xb7"
- "\xb0\xfc\x2e\x75\x0a\x6d\x8d\x5f\x8e\x15\x74\xb2\x8f\x15\x73\xba"
- "\x5b\x59\xaf\xe6\x45\x0a\x9e\x87\xfc\x72\x6b\xb6\xae\x0f\xe5\x94"
- "\x0d\x84\xe7\xf3\xb7\x86\x22\xed\x58\x85\xdf\x91\xc0\xdc\xa7\xc8"
- "\x37\x0e\xef\x1d\x55\xf3\x13\xe6\x1d\x7b\xb0\x71\x4f\xfa\x0d\x70"
- "\xcd\x49\x31\x2c\x85\xe7\x46\x65\x6f\x30\x31\x5c\x7e\x37\x92\x77"
- "\xd3\xd8\x8d\x49\x4e\xe6\xd6\x96\xe5\x0a\xac\x66\x94\x13\x44\x7a"
- "\x5f\x1f\x0b\x9f\x61\xb1\x63\xb9\x23\x7a\x5c\x7a\x63\x7e\xd8\x1c"
- "\xbb\xce\x9e\x4c\xef\x6f\xc2\xef\x56\x3b\xbc\xb4\x9e\xbe\xe7\x66"
- "\xd3\xde\x24\x71\x3a\x4f\xa1\x21\x8f\xf6\x32\x29\xc1\xeb\x1c\x3c"
- "\xe5\x7d\x43\xd2\x71\x0c\xfc\x3c\xc4\xd9\x96\xb8\xe1\x84\x15\x04"
- "\x79\x9f\x3c\x31\x6c\x0f\x9b\x97\x36\x1e\x65\xa9\xc1\x76\x53\x6b"
- "\xf1\x5a\x96\x85\xf6\x0d\x2a\x30\x94\xda\x16\x34\x21\x4d\x78\x3f"
- "\x47\xf8\xec\x1a\xf6\xec\x43\xff\x4a\xcf\x80\x81\x27\xc5\x70\x93"
- "\xfa\xfe\x2a\xf9\x9d\x55\xdf\xa6\xdd\x29\xbf\xaf\x4a\x0c\xdf\xee"
- "\x0d\x37\x94\x06\xbe\xaf\x8a\xb7\x13\xbe\xf1\x2c\xc6\x2b\xb6\x71"
- "\x49\xba\xfc\x3e\x2c\x31\xfc\x2b\xb9\x7f\xd9\xac\x86\x45\x8d\x5d"
- "\xed\x6d\x5a\x95\x45\xfb\xda\xd9\x32\x4e\x42\xad\x72\x8f\xf8\x2b"
- "\x7c\xe7\x13\x3f\xe2\xab\xf2\xa4\x7a\x8e\x41\x4b\xd2\x49\x1f\xa8"
- "\x9b\xd5\xed\x7e\xff\x95\x18\x9e\x22\xbf\xff\x2a\x3f\xbc\xd4\xae"
- "\x8b\x71\xc9\xef\xbf\x52\xfb\xd3\x7e\x1e\xa1\xc4\x23\xf8\xbb\x7e"
- "\xc1\xc0\xd6\x19\x2a\x1b\xf3\x23\x42\xed\xe2\x35\x26\x8e\x4f\x84"
- "\xc9\xae\x93\x42\x95\xef\x51\x76\xdd\x90\x78\xe5\x7b\xac\x5d\xf7"
- "\x69\x99\xf2\x7d\xbc\xfa\x0e\xb2\xe0\xef\x44\x33\x14\x21\x1e\xdb"
- "\xbc\xaf\x59\x42\x68\xbc\x2e\xcb\x13\x6e\x28\x92\x06\x80\xee\x84"
- "\x18\x61\xc3\x36\xb7\x71\x5d\x45\xbc\x82\x9f\x06\xe5\xd3\xa1\x7c"
- "\x32\xa2\x91\x6d\x2e\xec\xd1\xd5\x2c\x6f\xca\x16\xd9\x1e\xc4\x88"
- "\xb7\xa9\x4c\xc6\x16\xf1\x67\xbd\xa7\x6c\x91\xf9\xae\x9b\x5d\xa3"
- "\x95\x81\x5e\x34\x16\x3b\xfa\xa6\x9b\xc7\xdc\x72\xeb\xd8\x71\xb7"
- "\xcd\x78\xf4\xb1\xd4\xc7\x67\x3e\x91\x36\x6b\xf6\x93\x73\x9e\x9a"
- "\x3b\x2f\x7d\xfe\x82\x85\x8b\x16\x2f\x59\x6a\x7d\x7a\x19\xd1\xb5"
- "\xc8\xfb\xda\x04\x9d\x53\x00\xc4\xf3\x2e\x6c\xa7\x6f\xb4\xdc\x36"
- "\x96\x71\xec\xfb\x86\x89\x52\xf0\x79\x41\x35\x22\x41\x7b\x84\x34"
- "\x88\x7d\xe7\xd3\x9e\x25\x68\x87\xba\xea\xa2\x89\x36\xda\xaf\xad"
- "\x4e\xec\x9b\x7a\xd0\x31\xd1\x46\xfb\x0b\xee\x36\xd5\x43\xd4\x60"
- "\xd0\x9d\x14\xfb\x26\xd3\xfd\x92\xa1\x00\x15\x58\x37\x18\xcf\xc1"
- "\x46\x30\xbd\x1c\xc1\x1c\x05\x11\xac\x81\xf8\x17\x14\xb2\x7a\xc7"
- "\xf2\x34\xc8\xc1\x6b\xb4\x4d\xe3\x09\xd1\x14\xbd\x1b\x47\xff\xde"
- "\x6c\x88\x2c\x2e\x64\x75\xab\x22\x58\xdd\xb3\x85\xac\xa1\x24\x82"
- "\xd9\xa3\x0a\x20\xb4\x31\xbf\xef\x11\xbb\xd8\x37\x56\xf6\x2f\xbc"
- "\xef\xed\x13\x51\x93\x8b\xf7\x46\xb9\x41\x5f\x82\xd7\x58\xe6\xdc"
- "\x2d\x71\xb9\xdf\x3a\xe3\xea\x82\xfd\xdb\xc9\x9a\xe7\xe8\x72\xb0"
- "\x1d\x8e\x89\x29\xa1\x02\x47\x12\xd8\x9e\xa3\xda\x55\x0b\x76\xd1"
- "\x14\x4f\xfb\x29\x61\x7b\x86\xea\xf5\x0d\x40\xfc\xde\x5c\xe0\xea"
- "\xb2\xf0\x3a\xe6\x46\x5a\xb3\x77\xf9\x1c\x1d\xd2\x88\xc8\xdb\xa9"
- "\xed\x8f\x79\xe6\x53\x8b\xa4\xb9\x8b\xe7\xcc\x19\xde\x03\xcc\xf2"
- "\x27\x68\xf7\x1a\x5c\x84\xfc\xe0\xe5\x42\x56\x81\xfd\xb4\x61\x7f"
- "\x2b\x0f\xe0\x0c\x04\xed\x03\xb0\x4f\x79\xc8\x77\x03\x96\xef\xc4"
- "\xef\x3b\x51\xf6\x4a\x79\xef\x32\x71\xf8\x5e\x96\x6f\x9a\x8a\x72"
- "\x52\xce\xa2\xbd\x52\xe0\xec\xd2\xa9\x3a\xec\x77\x01\xd2\x55\x4a"
- "\xd7\x41\xf4\x09\xb1\x5f\x34\xca\xb1\x09\xbf\x13\xfd\xc7\x84\x23"
- "\xd2\x57\xf0\x7e\x0d\x97\xdf\x25\x88\xba\xb2\x6d\x88\x60\x6b\x1a"
- "\xf3\xfb\x01\xbd\xc3\x55\xde\x77\x06\xaf\x51\x2f\x95\x48\x9b\x77"
- "\x36\x73\xaa\x8e\xf6\xe5\x2c\x69\xe1\x69\xaa\x21\x99\x48\x0e\x9a"
- "\x0f\xef\xc7\x11\xa5\xb7\xd9\x02\x23\x5c\xa0\xdb\x8f\x51\xaf\xa8"
- "\x90\x6d\xc4\xb3\x08\xcf\xf5\xfb\xf0\xde\x5e\x3c\x2b\xb1\xbc\x0a"
- "\x3f\xe9\x2d\x72\x7b\xeb\xe4\xe7\xab\x26\x92\x7b\xe1\x0a\x56\x3f"
- "\x6a\x3d\x0c\x91\xf7\xfd\xcc\x80\xff\xaa\x15\x87\x4b\x24\x3b\xbd"
- "\xaf\x99\xf5\xe9\x57\xe0\xf7\x5e\x59\xf1\xfa\x10\xc0\xfb\xf8\x19"
- "\xc9\x3f\xb5\xe7\xf5\xa9\x78\xae\x52\xbe\x57\x81\x78\x9d\x53\xf9"
- "\x6e\xc7\xb3\xe1\xe2\x67\x20\xbf\xb6\xce\x48\x4b\xfb\x69\xdb\x75"
- "\x16\xb4\x8f\x6e\x80\x11\x44\x29\x0d\xcf\x8d\xfe\xe5\x92\x95\x97"
- "\x45\x4f\xe0\xd7\xd1\xc9\xca\xe7\x0a\x10\x87\xa2\x9e\x86\x22\xff"
- "\xa1\xe5\xbc\x6c\x68\x05\x7e\x86\xe2\x69\x0a\x68\x9f\x78\x96\x12"
- "\x9e\xcd\x98\x0f\x08\x4b\xbb\xd8\x2f\x95\x30\xca\xe5\xb6\xa5\xa3"
- "\xdf\x50\x60\x59\x0a\xda\x56\x91\xcf\x7e\xae\xbf\xcf\xdf\x7e\xae"
- "\x8f\x0b\xb0\x9f\x3c\x8a\x47\xe8\x0b\xa5\x25\xdc\x5e\x76\x9e\x5d"
- "\x9e\x8a\xd7\xd7\x4f\x40\x3e\x3b\xa5\x47\x64\x1e\xf2\xf8\x26\xf7"
- "\x24\xce\x85\xa9\x77\x19\x14\x3b\xae\x5f\x47\x36\x4b\x6d\x2b\xed"
- "\x72\x59\x50\x3e\x2c\xdb\x48\xf2\xcd\x43\xbe\x78\xbd\x09\xe9\x36"
- "\x56\xc3\x19\x55\x36\xb9\xce\x8b\xb3\xd1\x1e\x15\x79\x89\x27\xd5"
- "\x63\xbe\x7e\xa5\x50\x1d\xde\x76\x64\x02\x96\xd3\x1c\x1b\x32\xbf"
- "\x03\x7d\xb5\xdb\x0e\x64\x93\xf4\x59\xed\x8e\x45\x5f\x8a\x07\x2f"
- "\xe5\x42\x13\xc4\xa2\xbf\x75\xaf\x15\x23\x63\x46\xae\x80\x58\xe2"
- "\x47\x31\x1c\xfb\xe1\x28\x21\x5f\xe4\xbc\x7e\x4e\xfd\x20\xfe\xfb"
- "\x70\x56\x43\x9f\xc5\x24\x0f\xde\xd7\xb4\x5b\x40\x73\xe7\xdc\x65"
- "\xbc\xaf\xd8\xd6\x26\xac\x5f\x46\x7d\x27\x7d\xe2\xfd\x72\xe4\xb3"
- "\x9a\xee\xd1\x9e\x2d\x4a\x7f\x36\xd1\xdf\x7b\x90\x3e\x88\x9e\xf6"
- "\xbf\x94\xdf\x53\x2b\x9a\xb6\xca\x7a\xc3\xfa\x84\x07\xc3\x36\x88"
- "\x47\xa6\x9b\xb9\x19\xc6\xa3\xdf\x2e\x73\xe1\x18\x64\x80\xce\x1f"
- "\x9f\x48\xbb\x16\x1f\xac\x57\x86\xf5\x2b\x28\x2f\x53\x3c\xc1\x36"
- "\x0d\x34\xe6\xc0\xb2\x3c\x6f\x3e\xf2\x58\xe2\x92\xd7\x96\x4e\x88"
- "\xfd\xbf\x43\x59\xf2\x88\x0f\xca\x53\xc1\x79\xf5\x8f\xa1\x77\x58"
- "\x6a\xb1\x56\xf8\x6d\x22\xcc\x65\x7f\x5e\x26\xf7\x09\x63\x57\xff"
- "\x0f\x8b\xf9\xbd\x72\xa4\x29\x67\xcd\xf1\xc0\x96\x5b\xf8\x3e\x6d"
- "\xfc\xde\xb6\xcc\xf3\x32\xbe\x15\x3c\xae\xf5\x3f\xbe\xf0\x19\x56"
- "\xef\x93\xbb\xff\x7a\xf5\x5d\xed\x8a\xdc\xdb\xa8\x3d\xb6\x74\x9a"
- "\x9c\x47\xa9\x0d\xaa\xaf\xf0\x5b\x44\xfc\x54\x5d\x8d\x44\x39\xb8"
- "\xbe\x22\xb7\x60\xf9\x26\xb2\x45\x59\x6f\x18\x47\xcf\x66\x92\x2d"
- "\xf6\x2f\xc2\xfa\x3b\x73\xe8\x7a\xa9\x7c\x1d\x2b\xc7\xd8\x96\xfb"
- "\x91\x75\x74\x9f\xd6\x26\x72\x9f\x44\x5b\xf2\x02\x0c\x09\x83\x58"
- "\x67\xb6\xdc\xb7\x52\xe7\xf2\x09\xba\xdd\x6e\x00\x92\x13\x75\x54"
- "\xde\x98\x3f\x60\x02\xe6\x1a\x79\x6f\x2e\x8c\xd7\xdb\xd8\x6f\x2d"
- "\x40\x32\x63\x3c\x53\xe4\x1b\xb0\x5d\xc1\x7e\x1b\xf5\x91\xf4\x39"
- "\x92\xc7\x3e\xbc\x27\x3d\x40\xb2\xfb\xfa\x3d\x20\x4f\xab\x63\xb9"
- "\xdf\x88\x03\xe1\x45\xb8\x68\x78\x92\xed\xe7\x21\xaf\x52\x7e\xcd"
- "\x6d\x83\x74\x9d\x17\xc1\xaa\x88\xde\x47\x3b\x50\xde\x1f\x3b\x03"
- "\xdb\x1e\x95\x2e\xef\x0d\xa7\xa3\xf7\xed\x23\xdf\x52\xda\xdb\x14"
- "\x79\x94\x93\x4e\x51\x96\xfe\x64\x8f\x78\x5d\xa5\xd4\x8b\xc4\x7c"
- "\x1e\x83\xe7\x78\x9f\xff\x4b\x3d\xfd\xed\x6b\x60\xa0\xff\x13\xde"
- "\x79\xde\xcc\x78\x50\xf6\x75\x96\x4e\x8b\x03\xdf\x50\x72\x87\x82"
- "\xf5\x40\x0f\xbd\xa1\x5a\xc3\x63\x55\x00\xd6\xe5\xb2\x3d\x2e\x9d"
- "\xac\xa3\x3e\x63\xdd\x72\x85\x8f\xdc\x67\xd9\x9e\xb2\x65\x1b\xa8"
- "\x62\x4b\xb1\x9f\x2d\x76\x30\xc0\xae\xe0\x5c\x15\xa0\x13\x35\x76"
- "\x51\x5f\xee\xa4\x98\x84\x63\xe0\x3b\x1b\x9b\x7d\x71\x89\xb0\xf7"
- "\xca\xd8\x0f\x5c\x5d\xc2\xf3\xad\x12\xb7\x06\xf2\xfb\x11\x7e\x36"
- "\x4c\xb2\xbc\x2f\xdb\x2f\xc9\x92\x39\x8d\x64\x29\x97\xe5\xc8\x94"
- "\xe0\xb4\x28\x8d\xa1\xf6\xb1\xae\x4d\xf1\x57\x85\xd7\x80\x02\xe2"
- "\xf5\x2c\xc6\x2a\x92\x09\xdb\x96\xe4\xf8\xf7\x0b\x59\xaf\xeb\x14"
- "\xd9\x2b\x5d\xd9\x54\xf7\xfa\xd5\xe7\x05\xb9\x6e\xa5\x5d\xbc\xce"
- "\xed\xe2\x7b\x27\xf4\xc0\xfa\x5b\xa4\x47\x89\x3e\xca\x49\x31\x5a"
- "\x7a\x50\xfe\x7e\x4c\xba\x1f\x6d\xf5\x24\x88\xc8\x2f\x84\x6c\x54"
- "\xb5\x8b\x06\x31\xea\x00\x8e\x31\x08\xaf\x52\x1c\x23\x6d\x21\x7d"
- "\x93\x2d\xe3\x18\x69\x4c\x63\xbe\xe4\x56\xed\x16\xdb\x29\x22\xdd"
- "\x73\x7c\x06\xfd\x1c\xed\xb8\xdc\x67\x5b\x83\x7e\xae\xe8\x71\x0b"
- "\xea\x31\x04\xdb\xfb\x50\xe9\xd7\x16\xa4\xc7\xb1\x58\xd4\xdb\x8a"
- "\xec\xeb\x15\xfa\x87\x55\x1c\x14\x5f\xad\xca\xa1\xf8\x2b\x63\x30"
- "\xc8\xa9\xd4\xdd\xa4\xb4\xf5\xbd\x4a\x4b\x63\x44\x79\x1f\x34\x2c"
- "\xa3\x38\x38\x0a\xb1\x97\x63\x1f\xed\xfb\xab\x94\x91\xef\xf0\x36"
- "\xa2\xe4\xfd\xb1\x9f\xc5\x71\x8f\xcf\x8e\x06\x55\x05\xc4\x27\x8a"
- "\xc5\x79\x07\x57\xf1\x7d\x26\xc8\x96\x28\xa6\xd2\x7c\x05\xf9\x6d"
- "\x52\xfc\x47\x91\x79\xf0\x6d\xfe\xb6\x12\xf5\x02\xda\xca\x08\x1f"
- "\xef\xc1\xe6\x60\x79\xae\x84\xc7\xc0\x22\x5e\x67\xf0\xd3\x4a\xdf"
- "\x4a\x79\xdf\x94\x6b\xd2\x5b\x86\xac\xb7\x3b\x34\x7a\x44\xbd\x0d"
- "\x79\x43\xa1\x2f\xa7\x58\xee\xf3\xd7\xc1\x5f\xa9\xbe\xdc\x3a\x5e"
- "\x0c\x79\x85\xfc\x41\x23\x97\x2d\x20\x5e\x94\x07\x8f\x17\x83\xf3"
- "\x94\xfe\x6e\x0c\xf0\x8d\x4d\xca\x78\x77\xab\x8a\xc3\x41\xa7\xb2"
- "\xdf\x07\x96\x51\xfc\xa4\xb6\xb5\x39\xa8\x98\xeb\x55\xf1\xe5\x21"
- "\xcf\xb5\xc6\x61\xc8\x54\xad\x3f\x13\xd6\x14\x13\x88\x07\x61\x2a"
- "\x8f\x2b\xb1\x8c\xe3\x3a\x24\x86\x62\x83\x36\x46\x23\x6d\x81\x97"
- "\x91\xbf\x0c\xb1\xf8\xfb\xe2\xe0\x0a\xc5\x17\x95\xb6\xa3\x86\x23"
- "\x46\xb1\x9a\x76\xab\x02\xda\x25\x6c\x2a\xe4\xf7\x39\x73\x4c\xc3"
- "\xd5\x9c\x46\xf4\x58\xd7\xda\x98\x1f\x05\x01\xf9\x31\x8f\xe4\xc3"
- "\xb6\xac\x72\xcc\x2a\x94\x63\x85\xb5\x51\x96\x27\x4a\x2c\x51\xf2"
- "\x04\x96\xc5\xf2\xb2\x21\x35\x4a\x2e\x51\xed\x66\xb1\xbf\x4c\x51"
- "\x29\xc1\xc7\x47\x83\xad\xea\xf8\x48\xe6\x25\xc7\xa2\xa8\x54\xa5"
- "\x7f\x54\x36\x82\x97\x0d\x8e\xa1\xb2\x1c\xae\x87\x02\x26\xe7\xab"
- "\x41\x35\x4a\xbe\x22\xff\x12\xf0\x3a\x8e\x7c\x8c\xae\x91\x87\x1c"
- "\xcb\xab\xb3\x9a\x68\x0e\xb1\xde\x2e\x4a\x47\x29\x1e\x50\xbc\x90"
- "\x66\xf2\xb8\x21\x4d\xa1\xcf\xe8\x2e\x14\x77\x68\x1c\x42\xf7\x91"
- "\xae\x8a\x62\x11\x96\xf7\xa3\xfd\x3b\xd9\x37\x21\xc8\x37\xca\xcd"
- "\xeb\x46\x8f\x90\xc7\x0a\xdf\xc4\xeb\xd5\x32\xb5\x1e\xc6\xad\x63"
- "\x54\x8f\xea\xab\xf1\x8b\x62\x97\x9b\x62\x93\xdc\x5e\xf4\x7c\xc5"
- "\xc6\xe5\x79\x83\x3a\x2e\x6a\x16\x34\xb4\xb4\x07\x82\x1c\xd3\xa2"
- "\x77\xf2\x78\x16\xbd\x95\xea\xca\xf8\x61\xac\xcc\x38\xcf\x8e\x97"
- "\x2c\x00\xb1\xf8\x0c\xc5\x45\x53\x29\x97\x73\x68\x88\xd2\x8f\x8f"
- "\xe5\x7e\xf0\x98\x9a\xc7\x65\x31\x95\x16\x37\xc9\xf7\x4e\x51\x5f"
- "\xe8\x5e\xae\xe6\x1e\xed\x43\x82\xf5\xbb\xcb\x72\x05\xd4\xf3\x36"
- "\xa7\xb5\xa2\xa7\xbd\x77\x31\x86\x86\x14\x17\xaa\xb1\x77\xe8\x6a"
- "\x2e\xe7\xd0\x7b\xd4\xb8\x8b\x7a\x39\x44\xb1\x57\xbe\x37\x53\xa1"
- "\x99\xa2\x7c\xca\xf1\x7d\xe8\x62\xae\x57\x93\xa0\xe8\xfb\xa8\xd2"
- "\x8f\x17\xe4\x79\xf6\x37\x16\xd4\xed\xd0\x39\xaa\x6e\xb5\xdf\xc9"
- "\x7f\xb0\x7d\x23\x5d\xcb\x76\xbf\x42\x9e\xc3\x16\x11\x0d\xc9\xc4"
- "\x73\x44\x74\x6a\xe0\x98\x1a\xe7\x7a\x72\x5e\xe2\x63\x55\xf3\x71"
- "\x65\x8d\x08\x6c\x0b\x7e\x83\x79\x61\x58\x8c\x1a\x63\x58\x63\x3c"
- "\xd0\x7b\xd0\x4f\x88\xc3\x46\x50\x19\xbd\x37\x5f\x4b\x43\xf1\xe9"
- "\xad\x26\xbb\xc2\x73\x58\x88\x1a\x37\x28\x96\x1c\x74\xd6\x2a\x63"
- "\xba\x61\xe5\xc5\x4a\x2c\x39\x2d\x0e\xdb\xe1\x3f\x0e\x1b\xb6\xc3"
- "\x3f\x66\x98\x0f\x04\xc6\x0c\x1c\x37\xaf\x6a\xcc\x1f\xb6\xc6\x6f"
- "\x1c\x80\x65\x17\x8e\x1d\xc3\x52\xc8\x47\x69\x1f\x24\x39\x3e\xc9"
- "\xeb\x5e\xe6\x41\xaa\xcc\x14\x37\xcf\x2e\x57\xd7\x2f\xcc\xef\xd3"
- "\x58\x2d\xa0\x3d\xb7\x5f\xec\xa4\xf6\x54\x7e\x22\xd0\x5e\x3a\xa8"
- "\x07\x5a\x73\x19\x56\xa5\xc4\xf9\x8d\x7e\xb1\x52\xc9\x61\x14\x27"
- "\xfd\x73\x95\x69\xab\x7f\xae\x32\xbf\xd1\x3a\x46\x9a\xad\xed\xcf"
- "\x55\xe6\x64\x8a\x5b\x6a\x8c\xf4\x8f\x05\xe6\x15\xc5\x7e\x63\x59"
- "\xb3\xa8\x8e\x65\x7d\x71\x74\x58\x01\xc5\x28\x6c\xbf\x5c\x69\xdb"
- "\x69\x17\x23\x5c\x6a\xdb\x78\x3f\xe6\xa0\x84\xb6\x99\x6f\x4a\x41"
- "\x9b\x3a\xa2\x8c\x01\x65\xdf\x6c\xa2\xfd\x44\xc4\xa1\x12\xda\x5f"
- "\x0f\xb2\x33\xdb\xdc\x33\x50\xe7\xcb\x15\x15\x67\xe7\xa9\xfa\x1d"
- "\xfe\x9c\x76\x5c\xb8\xa1\x90\xad\x6e\xcc\x1f\x3e\x4d\xdb\xc7\x97"
- "\xb0\x2c\x57\x59\x43\x90\x75\x2b\xf3\x1a\x1e\x5b\x52\xe8\xdf\x37"
- "\xde\x8f\xe1\xa9\xd4\x0f\x9a\x13\x61\xfb\x51\x34\xee\xa1\xbd\xd0"
- "\xd0\x0a\xb7\x94\xb4\xd8\xfc\x75\xee\xf3\xd9\xda\xf1\x55\x3f\x91"
- "\x62\xa5\x32\xf7\xac\xc4\xf1\x4e\x9e\x76\x2d\xe6\xde\xbb\x93\xa5"
- "\xf4\x05\xb3\xe6\x2e\x9a\x79\x93\x34\x6b\xee\xac\x45\xb3\x66\xcc"
- "\x99\xb5\x6c\xc6\xa2\x59\xf3\xe6\xc6\x3c\x35\xe3\x89\x59\x8f\x49"
- "\x4b\x67\x2c\x94\x62\xad\xd1\xd6\x1e\xe0\x23\xbd\x5d\x9a\xb1\x70"
- "\xe1\xe2\xa7\x1e\x4f\x95\xe6\xce\x7a\x6c\xc4\x82\xc7\x17\x3e\xbe"
- "\x48\x9a\xb1\x60\xde\xe2\xb9\xa9\x52\x74\xea\xc8\xe8\xd8\x5b\x53"
- "\x7b\x68\xd7\xd0\x06\x1b\xa1\xc1\x7b\xae\xbe\x3e\xf7\x1c\x84\x18"
- "\x74\xe9\x0b\x0c\xd6\x59\x73\xf9\xba\xdd\x0d\x07\x46\x15\x80\xbc"
- "\xbf\x3a\xed\x5d\xcb\xf2\x87\xdb\xf1\x53\x24\x3a\xec\xa7\x54\x42"
- "\x7b\xac\x47\xb0\xc8\xc6\xfc\x1b\x50\x17\x23\xe5\xfd\x79\x51\x17"
- "\x12\xf6\x2d\x92\x9d\xab\xac\xc7\x31\x5b\x3a\xfd\xe6\xbb\xe4\x1c"
- "\x84\xe5\x2d\x01\x11\xcf\x50\x3c\x8d\xb4\xff\x3a\xd6\xc1\xb1\xe4"
- "\x8d\x7c\x2f\x04\xf1\xc6\x54\x47\xef\xc9\x63\x58\xde\xe4\x31\x1c"
- "\x97\x1b\x67\xa8\x6b\xd2\x49\xcf\x41\x12\xd9\x67\xad\x78\xa3\xbc"
- "\x96\xfd\x2c\xda\x32\xad\xc9\x9e\xfd\xe0\xae\x38\x1c\x0f\x1e\xb5"
- "\x5d\x27\xdf\x9b\xe1\x14\x20\x14\xe5\x12\x77\xaf\x88\x85\x97\xb1"
- "\xad\x85\x26\xc6\x1a\xf3\x6f\x34\xab\xeb\x69\xd8\x07\x23\xf6\xe5"
- "\x08\xef\xc7\x0d\xd7\xc8\xfd\x28\x64\x51\x05\x7d\x50\xbe\x7c\x92"
- "\xe7\xc6\xa9\x6a\x1f\x50\xee\x23\x76\xf1\x86\x72\x94\xd3\x48\x72"
- "\x05\x5b\xeb\xa3\xf5\x2e\x94\x73\x83\x77\x09\xea\x6d\x00\xdf\x4b"
- "\x29\xb7\x98\xfb\x1f\xf6\xe7\x50\x09\x7e\xcf\x39\x03\xa1\x2f\xd1"
- "\xbe\xdd\xd9\x03\xd9\x01\xa7\x1b\xaa\xd3\x8e\x80\xe1\x69\xe6\x60"
- "\x7f\xae\xaf\x57\xfa\x54\x49\xb1\xe1\x4f\xb3\x8f\x88\xd4\x27\xcc"
- "\x15\xa1\x25\x67\xda\x5c\x5b\x14\x5f\x8e\x60\x4e\xf6\x9a\x76\xcc"
- "\x15\x33\x9a\x74\x42\xe3\xad\xb3\x98\xa7\x1a\xf3\x63\x4c\xd8\x76"
- "\xba\x32\x36\x76\xb2\xe6\x69\x9a\xb1\x54\x0c\xd9\x99\xb3\x0d\xde"
- "\x21\x2a\x6f\xda\x0f\x9c\xea\x70\xfc\x63\x36\x60\x1d\x87\x86\xbf"
- "\x35\x90\x3f\xf1\xc4\xef\x0e\xb5\x1d\x3e\x0f\x8f\xa1\x31\x81\x03"
- "\x6d\xd9\xd1\x46\x7b\x51\xf9\x85\xec\x50\x35\x96\xe7\x9e\x07\x92"
- "\xeb\x50\x49\xa1\xcc\x9f\xf4\x3e\x9e\xf8\x3f\x1b\x01\xb0\x0a\x69"
- "\xce\xe6\xdf\x98\x4e\xeb\xbb\x78\x0f\xfd\xdf\x94\x16\xb8\x6e\xad"
- "\xd8\xf3\xed\x01\xf6\x1c\x97\x4f\x63\xc2\x02\xe4\x8f\x36\x94\xfb"
- "\x3d\x50\x7c\xa9\x1a\x59\x00\x66\x6a\x07\xbf\xd7\xd0\x7a\x48\x63"
- "\xfe\x88\x78\xb5\x3d\x86\xf6\x9f\xe3\xe5\x6b\x30\x8a\x6d\xc5\x54"
- "\x5b\xeb\x69\xaf\x05\xb6\x1b\xe3\x3b\xc9\x48\x36\x86\x75\x56\xa8"
- "\x36\x85\xb6\x7e\x48\xb6\xab\x30\x30\xb3\xfc\x11\x40\x7b\x83\x93"
- "\x5d\x15\xa3\x3d\x91\x5d\x21\xed\x16\xd5\xa6\xd0\xd6\x6a\x88\x0e"
- "\x65\xe8\x51\xb6\x2c\x4e\xa4\x18\x59\x27\x8e\xec\x4f\x36\xc6\xfe"
- "\x7b\xd2\x11\xd6\xf7\xa1\x23\x1c\xa7\x91\xfd\xab\x5d\x1c\x03\x9f"
- "\xde\x47\x38\x34\x7a\xaf\x41\x3b\xee\x41\x7a\xe6\x6b\xd5\x23\xfb"
- "\xa3\x6c\x35\xf2\x58\xfc\x19\xc4\x40\xce\x55\x23\x8e\x52\x7d\x45"
- "\x87\x55\x3e\x1d\x8e\x1c\x17\x4c\x87\x01\xba\x93\xf7\xa2\x66\xf9"
- "\x23\x27\x90\xaf\x60\x9d\x39\xea\x3e\xd4\xc1\xb0\xc4\x36\x44\xb1"
- "\x00\x42\xa8\x8d\x8a\x30\x99\xbe\x48\x6d\x23\x17\x75\xed\xc8\x4c"
- "\xbb\xa0\x3d\x57\x6c\x04\xa0\x35\x71\xaa\x1f\x15\x46\xfa\x1d\x79"
- "\xd4\x57\x9f\x39\x03\xeb\x47\x3f\xe6\x27\xab\x7c\xa2\xac\x8e\x97"
- "\x95\x7d\xba\x1b\xf3\x47\x45\x5e\x48\xde\x28\x89\xe7\x49\xdb\x60"
- "\xb2\xef\x51\xf7\x55\xaf\x07\xa0\x32\xe5\x7a\xc2\x59\xcc\x3d\x81"
- "\xeb\xfb\x6d\x3f\x6f\x18\xb5\xce\xff\x79\xc3\xa8\x55\x6d\x3d\x6f"
- "\x08\x68\xf7\x63\x6a\xd7\x5b\x32\x55\xa7\x69\x7b\xa7\x37\x48\xdb"
- "\x6a\xfd\x91\x1b\xb5\xf3\x99\xd8\x41\x24\xc3\x41\xcc\x53\xec\xfa"
- "\xa9\x3a\x86\x7c\x2a\xe4\x1c\x1e\x2b\xf1\xf1\x0b\x8d\x8b\x62\x81"
- "\x68\x02\xfb\xd1\x72\x84\x84\xd1\x7c\x18\xce\xcb\x17\x5d\x7e\x01"
- "\xf4\x26\x18\x18\x68\x51\x6f\x0b\x7e\xc4\xc0\x82\x5c\x84\x02\x48"
- "\x32\x3d\xc3\x83\x17\x29\xd7\x0e\xf9\x42\x6c\xa1\x6f\xb9\x7f\x09"
- "\x47\x77\x2e\xaf\xcc\xcf\x05\x3a\xa5\x3d\xab\x86\x62\xc2\x05\x6a"
- "\x33\x50\xab\x04\x3b\x68\xb4\x9f\x35\xb5\x0b\xf2\x5b\x2f\x13\x33"
- "\xe6\x56\xf8\xab\xd7\x4c\x7b\x4d\x25\xfe\xd7\x78\xe8\xa7\x69\x1a"
- "\x18\xa8\x4f\x95\x7f\xbe\x35\xa4\xaa\xa5\x48\xd8\x68\xd4\x36\x69"
- "\x84\xac\x2e\xf2\x17\x03\xfd\xe3\x42\x7e\x66\xbc\x2f\x95\xb7\x10"
- "\x5c\xeb\x5c\xa9\x21\xdf\xcf\xc5\x1f\x1c\x72\x81\x3e\x76\xf4\x18"
- "\xa0\xf9\x3e\x90\x7f\x0c\xaa\xbc\x8c\xfc\x2f\x7c\x48\x35\xdd\xd5"
- "\xaf\x3e\xf3\x18\x3c\x39\x18\xa9\x4f\xff\x83\x4b\xd5\x22\xad\x85"
- "\xfa\xee\x0f\x35\xfb\x5f\x0f\x73\xf9\x5f\xdf\x10\x7f\x39\x44\xb7"
- "\xd1\x3f\x99\xf6\xde\x00\xc3\xc3\x5a\x0a\x0d\x01\x2e\x63\xc8\x0b"
- "\x70\x21\xdf\xa1\x48\xa3\x47\x79\x8a\x34\xc5\x62\x70\xea\x1f\xe6"
- "\xb8\x6e\xa5\xe2\x10\x03\x1d\xc6\x56\x37\x7f\x16\x50\x46\xd7\x5d"
- "\x25\xa5\x6c\xf4\x87\xad\xe8\xe5\x32\x49\x73\xad\x8b\xc3\x7f\x36"
- "\x62\x64\xb5\xb4\xa6\xbd\x7a\x5c\x3d\xda\x71\xe8\xc8\x3f\xae\x1e"
- "\x3f\xd0\xc1\x78\x16\xc7\x48\x24\x7f\xd0\x7f\xac\x25\x50\x32\xe5"
- "\x06\x53\x0a\x98\xf2\xe5\xb2\xe4\xf1\xab\xc7\xd5\xe3\xea\x71\xf5"
- "\xb8\x7a\x5c\x3d\xae\x1e\x57\xc0\xa1\xd3\x4e\xac\x69\x7e\xda\x4d"
- "\xf9\xd4\xce\x7f\x74\xca\xa9\x2d\x13\x2e\xa5\x1e\x53\x0e\xc8\x8a"
- "\xb3\x49\x1b\x53\xec\xc6\xbc\xe4\x9a\xd8\xb2\x74\x47\xc8\xea\xf8"
- "\x4a\xf3\x96\xb4\x7a\xd3\x7a\xcb\x91\x71\xe5\x56\x97\xb8\x6a\x42"
- "\x45\xd4\xa6\xd4\xba\xb0\x82\xa9\x87\xc6\x6c\x5b\xe4\x0c\x5d\x33"
- "\xb9\x2a\xa6\x74\x4e\x43\x64\xd1\xb4\xa3\xe3\x77\xae\x70\x0b\xd9"
- "\x77\x7d\x34\xf8\x37\x8f\xd6\xf6\xc9\xff\xd5\x27\x37\xbd\xb3\xe0"
- "\x4c\x8f\x17\x13\xf7\xdd\xf0\x87\xd9\x27\xaf\x7b\xf5\xc1\xcf\x6f"
- "\x7f\x6f\x59\x53\xd7\xe7\x7f\xf1\xd7\xa1\xbf\x9b\x79\x22\xa2\xf0"
- "\xfe\xbf\xdd\xfa\xe7\x25\xe7\x7a\xe5\x4c\x39\x38\xf2\xcd\xb9\xa7"
- "\x07\x14\x3f\xf2\xcf\x3b\x3f\xc8\xf0\xea\x56\xfe\xfc\xc3\x41\xaf"
- "\xcf\x38\xde\x7b\xed\x2f\x3f\x1e\xfd\xf6\xfc\xef\xba\xbf\x90\xb0"
- "\x77\xf8\x1b\xb3\xfe\xd5\xef\x95\x07\x3e\xbb\x6d\xc7\xd3\xe7\xbb"
- "\x3c\x77\xcf\x9e\xe8\xcd\x8f\x7f\x15\xbe\xee\xbe\xc3\xb7\x6c\x5f"
- "\xfc\x7d\xcf\x97\xee\x3d\x30\x62\xeb\x53\xa7\xfa\x6f\x78\xf8\xd8"
- "\x1d\xef\x3f\xe3\xd1\x3f\x7b\xf7\xee\x21\xbf\x7d\xec\xcb\x6b\x5f"
- "\xfe\xbf\x9f\xde\xfc\xa7\x85\x67\xaf\xf9\xf5\xa4\xfd\x37\xfe\xf1"
- "\xc9\x6f\xae\x7f\xed\xa1\x7f\xfc\x9f\xbf\x2c\x6f\xee\xf6\xff\x26"
- "\xfe\xcf\xb0\xdf\x3f\xf1\x75\xdf\xff\xfe\xaf\xbf\x8f\x7d\x77\x69"
- "\xa3\x21\x37\xa9\x7a\xd4\x5b\xf3\xbe\x1d\x58\x32\xfd\x8b\x9f\xed"
- "\xca\x64\x97\xa2\x3f\x10\xb3\x86\xfc\xbb\x71\xe3\x1f\xcf\xaf\xee"
- "\x4c\x7d\x26\xe8\x14\xdc\x79\x41\xd6\x2d\xa0\x0b\x81\xae\x62\x27"
- "\x66\x0a\x9d\xed\x6f\x1b\x87\xa4\xad\xdf\x9e\x83\xfe\x56\x8e\xd6"
- "\xee\x6f\xc6\xf3\x7a\xb9\xc4\x37\xfb\x1f\xdc\x4e\x1e\x3f\xfc\xa1"
- "\xc3\xbe\xeb\x51\xb2\x2e\xd0\x15\xb5\x15\x02\xdd\xa1\x07\x5c\x03"
- "\xa1\xd0\x13\x7a\x81\x01\x8c\xd0\x1b\xfa\xc0\xb5\x10\x06\xe1\x10"
- "\x01\x7d\xc1\x04\xfd\xe0\x3a\xec\x4d\x24\xf4\x87\x01\x30\x10\x95"
- "\x32\x28\x78\x5f\xb2\x20\xce\x84\xff\xe0\xff\xc9\x10\x27\x5f\xa7"
- "\x5c\x2d\xff\xb7\x96\xdb\x94\xf2\x1a\xa5\xdc\x7e\xb5\xfc\xdf\x5a"
- "\x2e\xfd\x87\x3f\x07\xfd\x47\x3f\x75\x38\x64\xe0\xa3\x06\xbf\xb1"
- "\x43\xcb\x11\x58\xaa\x53\x8e\x96\x6b\xb8\x48\xfd\x56\xfc\xfc\xeb"
- "\x07\x1e\x71\x78\x8e\xe1\x5f\x33\x01\xf8\x73\x06\xa6\x3d\xdc\x85"
- "\xba\x8f\xc4\xde\x59\xf4\xc8\x24\x04\xc2\xe4\x7f\x2f\x7e\x6c\x8e"
- "\xc2\x13\xe3\xfc\xe6\xf1\x78\xfe\x0c\xcf\x49\x78\xde\xa7\xf2\x06"
- "\x9d\x70\x14\x74\x62\x18\xe8\xf4\x56\xfc\x2c\x03\x5d\x97\x09\xa0"
- "\xeb\x56\x01\xba\xae\xab\x40\xd7\x5d\xf4\x09\xdf\x47\x6a\x91\x52"
- "\x67\x54\xca\xb1\x48\x17\xb6\x45\xd3\x58\x47\xf3\x59\xf9\x3d\x53"
- "\xe3\xa5\xd1\x23\xc7\x8c\xbc\x25\x56\x1a\x31\x42\xba\x29\x76\x74"
- "\xec\xa8\xd8\x31\xa3\x46\xdf\x2a\x8d\xbe\xf9\xf6\x9b\x63\x6f\x8f"
- "\x1d\x2b\x3d\xf5\xf4\x82\x59\xa3\x63\x9f\x78\x5c\x9a\x9b\x3a\x6b"
- "\xa1\x34\x73\xd6\x82\xa7\x96\xce\x58\xf0\x78\x3b\x3a\xde\xb1\x83"
- "\x7a\xd7\xdf\xc3\xc5\xd4\x22\xa4\xc3\x0c\x22\x8e\x4b\x07\x71\xf2"
- "\x38\xf0\xdd\x31\x2b\x67\xab\xe3\xa9\x07\xef\xff\x3c\xfa\xa1\x5e"
- "\x1f\xfd\xfc\x89\xe8\x3b\xee\xfe\x6d\x6e\x19\x08\xc9\x63\x40\x98"
- "\xe8\x04\xe1\x8e\x7a\x10\x6e\x4a\x01\x21\x7a\x1a\x08\x2f\x86\x81"
- "\xb0\xb2\x1c\x84\xa5\x79\x20\x3c\xd9\x00\xc2\x23\x55\xad\xcb\xd6"
- "\x57\xf0\xb2\x7d\x0e\x10\x6c\x9b\x40\xd8\x66\x07\xe1\xf7\x2b\x78"
- "\x99\x1d\xcb\xfe\xb6\xe6\xb2\xeb\xe0\xd2\x8f\x8e\xe2\xaf\xfb\x5f"
- "\x9b\xb3\x38\x57"
+static unsigned int rss_eth_z8e_uncompressed_length = 561364 ;
+static unsigned int rss_eth_z8e_length = 157863 ;
+static unsigned char rss_eth_z8e[157863 + 1] =
+ "\x78\x9c\xec\xbd\x7f\x78\x54\xd5\xb5\x3f\xbc\x32\x19\x60\xc4\xc0"
+ "\xcc\x84\x88\x53\x8b\xed\x60\x01\x47\xcb\x8f\x68\xb1\x8d\x16\x34"
+ "\x08\x28\x58\x7e\x29\xd8\x46\x09\x04\x14\x68\xd0\x08\x11\x22\x0c"
+ "\x10\x32\x61\x82\x36\x56\x20\x93\x18\x35\x42\x48\xf0\x8a\x2d\x6d"
+ "\x69\xc5\x16\x2b\xde\x62\x1d\x4b\x7c\x5f\xda\x26\x19\xda\x97\x7e"
+ "\x6f\x6e\x5f\x6c\x47\x1a\x69\xca\x0d\x30\x25\x03\x19\xc9\xcc\xd9"
+ "\xef\x67\xed\x7d\x4e\x32\x33\x4c\x50\xee\xbd\xcf\xf3\xfe\xd3\x3c"
+ "\xcf\xe4\x9c\xb3\xcf\xde\x6b\xaf\xbd\xf6\x5a\x6b\xaf\xbd\xf7\xda"
+ "\xeb\x10\x5d\xfd\x5f\x90\x2c\x7c\x49\x23\xf3\xcd\xb6\x0f\xfe\x1b"
+ "\xe5\xff\xf5\xf7\xaf\xbf\x7f\xfd\xfd\xeb\xef\x5f\x7f\xff\xfa\xfb"
+ "\xd7\xdf\xff\xbf\x7f\xa1\x34\x9a\x78\xde\x64\xa6\xdf\xf8\x88\xba"
+ "\xbd\x96\x11\x41\xd2\x8a\x5e\x79\x51\x44\xf1\x2a\x0d\xe3\xfc\x08"
+ "\xbe\xf2\xaf\x06\x69\x26\x1f\x59\x6e\xb2\x91\x4d\xbc\xe2\x30\x4d"
+ "\xdd\x4d\x54\x3b\x5c\x74\xbe\xf8\xb2\x08\x35\x95\x12\x1d\xd9\x8b"
+ "\xe7\x97\x45\xc7\x8b\xc3\x45\x18\x70\x96\x04\xa9\xa0\x96\xe1\x54"
+ "\xe0\xb9\x02\xe9\x48\x2b\x09\xd2\x92\xad\x9c\x56\x85\x72\x46\x7a"
+ "\x60\xeb\x45\x6a\x72\x46\xa9\x8a\xe1\x38\x63\x34\x6d\xa4\xc4\x63"
+ "\x0f\xf2\x66\x70\xde\x2d\xc3\x51\x6f\x16\x91\xf7\x65\x11\x89\xc3"
+ "\xc1\xc2\xf5\x70\xdd\x7a\xfe\x63\x49\xf5\x85\x90\xd6\x6e\xd4\xd7"
+ "\x0f\x0c\x1b\x97\xe7\x36\x38\xbf\x44\xe9\xa7\xe8\xda\xeb\x18\x26"
+ "\xe3\x26\xbc\x64\x09\x5c\x8a\xd2\x29\xba\xc6\xd5\xe5\xa5\xf4\x23"
+ "\xa0\xc6\x8e\x97\x65\x7a\x7a\x20\x1c\x25\x67\x19\xa5\xe1\xdd\x6c"
+ "\x5c\x4d\x28\x37\x84\xe9\x33\xbf\x9e\x46\x71\xdd\x80\x6b\x16\x26"
+ "\x7f\x5a\x63\x26\x11\xd3\x28\x6c\xa2\x9b\xc3\x5e\x4a\xeb\xf6\x5e"
+ "\x83\xf6\x5b\x5c\xb2\xfd\xa8\x17\x65\xcd\xa7\x68\xf0\x3f\x4d\xc8"
+ "\x8f\x3a\x43\xce\x8d\x8c\xc3\xe0\x0f\x85\xd7\x6f\x32\xe0\x68\x5e"
+ "\xff\xb5\x0d\x35\x44\x5d\x5e\xd3\xcc\xb0\xc9\x2a\x74\x38\x87\x0d"
+ "\x38\x9c\x0f\x75\x65\x70\x5d\x5d\x5e\x73\x4d\x5c\x9e\xa0\x91\x07"
+ "\x78\x87\x26\x84\x29\x9d\x71\x3e\x49\x83\x73\xb8\x3e\xbd\x2d\x66"
+ "\xae\x23\xb0\x2e\x4a\x01\xf4\x3d\xea\xce\x42\x5b\x9d\x47\x22\x44"
+ "\x80\x69\x6f\x2c\x23\x62\xf8\xc0\xdf\xa9\x60\x0e\x9e\x68\xc0\x64"
+ "\x18\xbd\x6d\xf5\xfa\x33\x1b\x25\x8e\xdc\x56\x0b\xe9\x79\x97\xc4"
+ "\xe3\xc8\x70\xd1\x96\xeb\xb9\x2d\x4d\xe0\x28\x3d\xcf\xd6\x5e\x7a"
+ "\xf4\xb6\xff\xda\xdc\x24\xd8\x0e\x05\x3b\x0d\xb0\xd3\xfc\x7a\xb9"
+ "\xde\xf6\x07\x93\xf2\xab\xbc\xb6\x6b\xc2\x26\xa1\xd3\x61\x70\x47"
+ "\x5f\xde\x6b\x6a\xe3\xf3\x02\x1f\x93\xa2\x2d\x99\x82\x34\xb8\x0d"
+ "\xed\x4c\x47\x9e\x59\xe8\x47\xa7\xfe\xfe\x3a\xfd\xbd\x03\xef\xee"
+ "\x51\xf0\xae\xcd\x89\x83\x67\x63\x78\xf1\xbc\xa5\x24\xca\x8c\xdf"
+ "\x00\x18\xc8\x03\xf1\x1b\x64\x31\xf8\x6d\xad\x43\x68\x9e\x2f\xa0"
+ "\x4d\x35\x56\xbf\xe6\x15\x14\x70\x47\xc8\x79\x03\x79\x4e\xd2\xb5"
+ "\x07\x00\x9f\x76\x6c\x24\x8b\xa7\x58\x44\x02\xee\x4e\x6a\x0d\x75"
+ "\x92\x27\x04\xd9\x88\x5e\xa0\xb2\x0b\xe0\xc5\xe8\x19\x2a\x7b\x9a"
+ "\x1c\x4d\xa5\x9f\x50\x2a\x5e\xd6\x4c\x82\x3c\x23\xb8\x6c\x3b\xb5"
+ "\xd6\xb7\x93\xa7\x3e\xb1\xac\xe7\x46\x72\xb4\xe0\x19\x7d\x6e\x65"
+ "\x3c\x58\xde\xa2\x99\x56\x7f\xe9\xab\x64\xf6\x8c\x24\x53\xcb\x32"
+ "\xbf\x8e\x4b\x86\x9b\x71\xd9\x7a\x9a\x2c\xaf\xaf\x00\x1f\x9e\x66"
+ "\x7c\xaf\xf7\xbf\xb9\x31\x62\x3a\xe2\x98\x45\x47\x1c\x27\xa8\xc9"
+ "\x31\x99\x9a\xdc\xd3\x68\xc7\x69\xca\x38\x12\x99\x44\x4d\xe6\xfb"
+ "\xa8\x69\xd4\x34\x0a\x74\xe2\x1e\xf2\x7b\xc4\x11\x26\xe7\x3a\xe6"
+ "\xa7\x8c\xc2\xda\x27\xc8\x12\x54\x30\x41\xbb\x8c\x92\x0f\x4a\x88"
+ "\x98\x76\xfc\x9c\xaa\x1d\x6b\xbf\x40\x0e\xe0\xd7\x01\x5c\xee\x04"
+ "\x2e\x3f\x1d\xe5\xa0\x6c\xe0\x3c\x28\x50\x17\x25\x73\x29\x5d\xd3"
+ "\x8f\x1c\x67\x69\xe0\x3d\xc8\x6e\x67\x03\xf4\x09\xcb\x6f\xd7\xa6"
+ "\x3c\xe8\x84\x0c\xc8\x7f\xc6\x56\x5d\x06\x3a\x3d\xaf\x91\xb9\x6b"
+ "\x7d\x5e\x5a\xe3\xcb\xa2\xbd\xdb\x3b\x84\x8c\x77\x90\xc5\x76\xbc"
+ "\xef\x98\x90\x45\xb6\x40\x34\x97\xde\xbf\xd4\xc1\xf2\xd8\x39\x34"
+ "\x4c\x69\x0c\xcf\xea\x86\xec\xac\xa3\x01\xc0\xe7\x0f\x8d\x48\xff"
+ "\x0a\xf2\xa1\x7c\x6e\x90\x5e\xea\xe4\xf2\xe2\xfa\x85\x61\xed\xfa"
+ "\x85\x17\xb4\x57\x16\x76\x89\x57\x16\x9e\x8f\xbd\xb2\xf0\x9f\x9e"
+ "\x0d\x64\x89\x5d\xbf\x30\xd4\x5a\x2c\xfb\xc0\xd6\x5a\x8c\x3e\x88"
+ "\x91\x65\xf3\x19\xb2\x2d\x7e\x1a\x7d\x1f\xfd\x88\x36\xaf\x24\x87"
+ "\x66\x1f\xee\x0e\x44\xff\x44\x8b\x4b\x49\xe0\xbe\x32\x55\xfb\xba"
+ "\x32\x1d\xbd\xb2\x85\x7a\x0f\x05\xcd\x43\x0f\x71\xbd\x21\xbb\x93"
+ "\xf0\x33\xe3\x67\xc1\x2f\x43\x64\x3a\x32\x40\x2b\xcf\xd0\x2d\x69"
+ "\xd4\x70\x89\x68\x82\x46\x69\xa7\x69\xc8\x71\xe0\x6f\xeb\x87\x6e"
+ "\x23\xb4\x9a\x85\xc1\x9b\xcb\xa9\xac\xbb\xbb\x90\x58\x17\xb2\xfe"
+ "\x63\x7d\xd8\xed\x1d\xea\x44\x3d\x11\x29\xbf\x2f\x43\xc7\x64\x2e"
+ "\x0c\x22\xbd\x23\xbc\xa9\x30\x2d\xb4\xa9\xd0\xd4\x95\xb9\xf0\x6f"
+ "\xc8\x33\x2d\x68\xb6\x66\xeb\x34\xec\x60\x58\x90\xad\xd0\x90\x28"
+ "\xa5\x03\x66\xf1\x3b\x17\xdb\xcc\xbb\x5f\x16\x27\x90\xaf\xa8\x17"
+ "\x16\x60\x03\x0e\xe8\x3f\xb4\xdc\x48\x03\xad\xdb\xb7\x23\x1f\x97"
+ "\x0f\x44\x72\x79\x4c\x09\x06\x8a\x3a\xc8\x1a\xa5\xc1\xa2\x47\xd5"
+ "\x87\x3c\x1d\xac\xd3\x87\x44\x68\x60\xb7\x97\xe6\x31\x6c\x2e\x17"
+ "\xe8\xec\x20\x94\xfb\x9b\xf0\x14\x9a\x90\x3e\xa7\x5b\x14\xa6\x6d"
+ "\x45\xfa\x11\x94\xd7\xeb\xee\x30\x70\xe4\x3a\xb8\xaf\x25\x9e\xe0"
+ "\x87\x23\x45\x11\x1a\x52\x47\xe9\x28\x37\x9f\xe1\x31\x2c\xf0\x41"
+ "\x10\x6d\xfd\xdb\x91\xa2\x10\x69\x22\x01\x66\x50\xc1\xb3\xe6\x24"
+ "\xc0\x43\xba\x00\x3c\xe6\xbf\x26\x94\x19\xb2\x47\xc2\x7b\xe8\x1d"
+ "\x8d\xe1\x45\xc8\xec\x94\xf8\x7e\x9b\x61\x74\xb3\xfe\x00\x4c\xff"
+ "\xba\x7b\xa9\x93\xac\x7b\x42\x9e\xc2\xf4\x56\x8c\x9b\x5c\xfe\xcd"
+ "\xb2\x8e\x01\xa2\x2b\x2f\x9d\x79\x8e\xdf\x07\xa2\xe7\x39\xcf\x16"
+ "\xd1\x55\x98\x3e\xa4\x13\xba\x08\x79\x50\xde\xcd\x78\xc6\xf7\xe5"
+ "\x43\xd3\xbf\x3d\x99\xbe\x3d\x6d\xe6\xb4\xc9\x34\x7b\xca\xd4\xc9"
+ "\x94\x7d\xe7\xb8\xec\x89\x5f\xfb\xc6\xd7\xe4\xcd\xd7\xbe\x91\xf3"
+ "\x35\x9a\xf7\x9d\x87\x26\xd3\xbc\x39\x93\x69\x3e\x7e\xf3\xe6\x4f"
+ "\x7f\x68\xda\xf4\xf9\x93\x29\xef\xbe\x99\x78\x9a\x3a\xf9\xb6\xec"
+ "\xfb\xc7\xcd\x9b\x3a\x73\x3a\x3d\xb8\xe0\xf6\xec\xdb\x6f\xa7\x29"
+ "\xd3\x67\xdd\x96\x9d\xad\x5f\x6f\xcb\xe6\x2c\x8f\xe6\x4c\x9f\x3f"
+ "\x6e\xde\x9a\xd5\x25\xab\xc7\xcd\x99\x39\x95\x53\xa0\xdd\xe2\x78"
+ "\xc8\x15\xbb\xa8\x31\xad\xc3\xe2\xdc\x0c\xd2\xa0\x3b\x1a\xc0\x03"
+ "\xf8\x75\xfa\xcb\x4e\x42\x07\xd8\x9f\x69\xe0\xbe\x93\x63\x80\xf5"
+ "\x30\xe4\xde\xdc\xed\xb5\x95\x82\x86\xc5\x4c\x43\xe7\x4d\xac\x27"
+ "\xae\x7f\x17\xef\x3e\xd0\xc7\x9a\x01\x78\x5f\x9f\xf8\x7e\x18\xf8"
+ "\xdf\xfa\x7f\xb7\x3a\x89\x02\xf8\x81\xee\x61\xe8\x42\xd0\x37\x44"
+ "\x5d\x9e\xbc\x01\xe0\xef\x34\xd4\xd1\x0e\xd9\x3c\x86\xb2\x6d\x71"
+ "\x32\xdf\x8e\xfe\x39\xc6\xe3\xca\x59\xb2\xbd\xd5\x5a\x92\x4b\xdc"
+ "\x4f\x81\x12\x1d\xc6\x85\x5e\x18\x83\x25\x0c\xf4\x3d\xe0\x1c\x57"
+ "\x70\xec\xce\x38\xfd\x10\x64\x38\x3b\xf0\x4e\x87\x75\xa1\x15\x7a"
+ "\x02\x7a\xfc\x77\x9a\xc7\x45\x22\xd3\x7a\x54\xeb\x71\xc9\xb1\x12"
+ "\xe5\xf2\xe2\xf8\x3a\xdc\xe4\x46\xbe\xd7\x67\xa4\x81\x0f\xd2\x30"
+ "\xfe\xa2\x2d\xb6\x65\xe0\xef\x70\xac\xc6\x69\x17\xe7\xf2\xd8\x8e"
+ "\x18\x78\x8a\x32\xff\x80\xf6\x35\x6b\x35\x4e\x9b\xe8\x96\x69\x4c"
+ "\xb7\x43\x82\x9f\x33\x91\xaf\xa7\x37\xed\x5d\x4e\x03\x1f\xa4\xb3"
+ "\xbc\x0a\x21\xd3\x31\x66\x66\x6e\x80\x4e\x6b\x43\x5e\x1b\xe7\x9d"
+ "\x10\xa5\x41\xd0\x35\x0e\xa7\x27\x8d\x4e\x52\x26\x69\x99\xce\xcc"
+ "\xb8\xfa\x00\x27\x93\x07\x29\xe6\x47\x73\xf7\x39\xc0\xe9\x92\xe9"
+ "\xb0\x63\x32\x17\x01\xfe\x30\xd6\x95\x4a\x7f\x5f\xff\x9f\x9c\x4f"
+ "\x1f\x9b\xfb\x9e\x21\xeb\x0a\xce\xf5\xff\x79\x04\xb4\x64\x7b\x81"
+ "\xed\xbf\x6e\x6f\xe6\x82\x20\x0d\x09\xa9\xb1\xf1\xfa\x36\xce\xab"
+ "\x01\x47\x61\x7b\xcd\x02\xb8\x59\xfe\x8d\x9d\x74\xaa\x98\xc7\xda"
+ "\x4c\x9b\xe6\x29\xa4\x44\x9c\xec\xcd\x8c\x3f\xeb\x0f\xd0\xe2\x4f"
+ "\xe0\x83\x6b\x00\x6f\x6f\x22\x1f\x64\xfa\x01\xc7\x0e\xfc\xda\xd0"
+ "\x26\x7b\x90\xec\x47\xb5\xae\x42\xd4\x4b\x26\xc8\x15\xf4\x79\x1f"
+ "\x0c\xbd\x7c\x7b\x62\x79\x7b\x25\x97\x43\xfe\x01\xdd\x5d\x32\xff"
+ "\x36\xa6\xb9\xce\x77\xe0\xcb\x61\x59\x49\x7c\xb9\x1b\xb8\xfc\x25"
+ "\xee\xfd\xc4\xa4\xf7\x5b\xf0\xfe\x6f\xfa\x7b\xc8\xfd\xb0\x05\x49"
+ "\x7c\x5b\x8c\xf7\x7f\x07\xbe\x61\xc8\x35\x6c\x0b\xfb\x0c\xf0\x58"
+ "\x28\x2e\xff\xd6\xa4\xfc\x7b\x90\xff\xbf\x98\x6f\x78\xcc\xe1\xfc"
+ "\x8d\xba\xec\x20\xbf\x05\xf9\x0f\x26\xd5\xbf\x14\xf9\xc3\x71\xf8"
+ "\x1d\x4f\x7c\x9f\x55\x8f\xf7\x9f\x32\xaf\xc3\x26\x1a\x80\x3c\x83"
+ "\x58\x97\xb0\x1e\x3b\x52\xc4\xfd\x95\x65\x4e\xca\x3f\x0a\xf9\x32"
+ "\x74\x1a\x99\x74\x1a\xcd\xe0\x7e\x44\x1d\x27\x14\x0e\x59\x39\x49"
+ "\x65\xf2\x50\x26\x0b\x74\xb4\x1b\x7c\x99\xa2\x4c\x51\x52\x99\x6d"
+ "\xdc\x8f\x42\xd5\x63\xee\xee\xe9\x2b\xa3\xeb\xc8\x78\x18\xdc\xb6"
+ "\x6b\x01\xe3\x40\x22\x8c\xe1\x1d\xa8\x77\xc4\x76\xa5\x77\xae\x05"
+ "\x0f\xdd\x8e\xb4\xff\x04\xcc\xeb\x58\x06\x20\xab\xe1\x40\x28\x42"
+ "\xc2\x33\x23\x43\xf1\xee\x75\xf6\xa1\x51\xe2\xfb\x71\x7c\xcf\xb0"
+ "\x45\xf7\x2c\x5d\x26\xaf\xb3\xe3\x8a\xf4\x2c\xb6\xdf\xd2\x58\x07"
+ "\x8b\xee\x6f\x69\x0a\xe6\x75\x77\x08\x13\x99\xf0\x1c\xd3\xeb\xf8"
+ "\x03\x9e\xd3\x80\x7f\x26\xc6\x1c\x12\xeb\x91\x6f\x23\x4d\x45\xfa"
+ "\x07\x52\x56\x55\x3e\xf9\xac\xea\x98\xc1\xfc\x3d\x11\xcf\xef\xea"
+ "\xe5\xdf\x62\x78\xb8\xbf\x4d\xbf\x4f\x8b\x31\xac\x73\x86\x0c\x0e"
+ "\xff\x91\x2c\x07\x39\x94\xf0\x51\x5e\xac\x97\xef\x18\xe6\x4b\xb8"
+ "\xce\xc4\x75\x0b\xae\x0f\xe2\xba\xc8\xf3\x29\x39\x3c\x31\x29\x8f"
+ "\xfc\x3c\x13\xd7\x87\x70\xbd\x03\xd7\xf9\xb8\x8e\xc4\xf5\x5e\xb4"
+ "\x21\xc6\x72\x81\x71\x94\xe7\x58\x61\x8c\xab\x8a\xb7\x78\x0e\xd0"
+ "\x3d\x83\x69\x30\x1d\x79\x3a\xa4\xbc\x2a\xfd\x62\x51\xfd\x78\x5d"
+ "\xa7\x4c\xcb\x94\x69\x83\x14\x3f\xa8\xb4\x98\xa1\x87\xce\xf5\xa5"
+ "\xe9\xba\x49\x97\x45\x3d\x4d\xc1\x9f\x07\xf8\x7e\xc6\x55\x28\x58"
+ "\x03\x54\x9f\xeb\xf0\x55\x39\x73\x8a\x3a\xd3\xe2\xeb\xc4\xb5\xd6"
+ "\xe3\x16\x02\xd7\x72\xee\xa3\x20\x0d\x3f\x20\x24\xdf\x63\x8c\x55"
+ "\xf0\xf2\xf5\x7c\x13\x99\xc6\xb2\xbc\x4c\xcf\x3a\x16\xc7\x4b\x99"
+ "\xdd\xde\xe1\xd1\x24\x39\xca\x06\x2f\x8d\x67\x9e\x61\xba\x73\xdb"
+ "\x86\x16\xcb\x71\x5c\xb6\x45\xc2\x3f\xa7\x78\xb2\x41\x9f\xb7\x2a"
+ "\xf9\xbd\x7e\x5a\x92\x7e\x91\x3c\x9b\x24\xef\x9d\x4c\xf3\xf4\x52"
+ "\x96\x83\xeb\x31\xff\x7b\x73\x84\xb4\x19\x6b\x9c\xc3\xf9\x7d\x18"
+ "\x7d\xcc\xf5\xa6\x17\x73\x3b\xae\xaf\x35\xde\xcb\x77\xf6\xfc\x25"
+ "\xcc\xdf\xe9\x45\xf2\xdd\x01\x8c\x47\x87\x8c\x77\x46\x3d\xe9\x25"
+ "\xf2\x5d\x73\x1f\x5c\x6b\x87\x0e\x37\x3d\x95\xcd\x27\x7c\xd6\xb6"
+ "\x71\x44\xa6\x5b\xcb\x69\x40\x20\x7a\x9c\xe6\x46\x45\x6c\x5c\x39"
+ "\x5d\x13\x88\xee\xa7\x5b\x88\xec\x81\xe8\x09\xba\x95\x68\x64\x20"
+ "\x5a\x0b\x1b\x64\x2f\xbf\x7f\xff\x66\x4a\x4b\xc3\xd5\x33\xa6\xdc"
+ "\x94\x16\x88\x96\xd0\xa8\x72\x33\xae\x45\x74\xdf\x00\xd1\x1d\x88"
+ "\xce\x42\xbe\x65\x34\x37\x26\xce\x4d\x1b\x20\xfe\x5a\x10\x23\xdb"
+ "\xac\x67\x85\x27\x10\xc5\x7c\x20\xda\x8c\x74\x4d\xcc\x8d\x7d\x8a"
+ "\x5f\xb7\xd0\x7c\xd6\x8e\xb9\xb1\x73\x62\xea\xb3\xef\xe3\xf9\xaf"
+ "\x02\x7d\x24\x02\xd1\x49\xd4\x1a\x0e\x23\x9f\x47\x88\x6a\x6b\xdb"
+ "\xe2\x0b\x26\xea\x81\x0d\xa1\x55\x5b\x3b\xd0\x96\x48\x0f\xda\x81"
+ "\xf1\xb5\xbb\x67\x13\xae\x35\xd6\x8b\xf2\xd9\x67\xb3\x08\x9b\x35"
+ "\x32\x1e\x93\x2b\x6e\x43\x20\xda\x4e\x05\x98\x1e\xcc\xdd\x10\x12"
+ "\x8c\xff\xd0\x2d\x3c\xb7\x9a\x44\xe8\x03\xeb\xdc\x0d\x1e\x81\x77"
+ "\x16\x61\xb7\x46\x02\xd1\x4e\x12\xd5\x28\x9b\x69\x1b\x20\xe1\xf9"
+ "\x6c\x2e\xe4\x0d\x71\xbe\x78\x38\x0c\x83\xf3\xce\x8d\x91\x15\xf9"
+ "\x5d\x3d\x76\x9b\x03\xbf\x1c\xfc\x0a\x51\x76\xa3\xf0\x66\x7d\x20"
+ "\x30\xde\xa3\x7c\x25\x9e\xeb\x22\x90\x61\x49\xcb\x18\x0d\x42\xfe"
+ "\x4a\xf0\xcb\x34\xf0\x1d\xf0\xb5\x1d\x92\xf8\xd6\xd8\xde\x89\xc8"
+ "\x76\xd8\x7e\xa9\xda\x61\x7b\x9b\xd3\xbb\x60\xeb\xe0\xbe\xad\x4b"
+ "\xbd\xfb\x0f\x94\x5b\x20\xcb\xf9\x6c\x6d\xc2\x66\xeb\x88\x40\xbe"
+ "\x40\xd7\x72\xa6\x23\xe8\x5a\xce\xb4\x04\xfc\xb6\x80\x7b\x1b\x09"
+ "\xbb\xad\x03\xf8\x44\x44\x8d\x7d\x70\x8f\xb4\x41\xec\x8e\x88\x84"
+ "\x6d\xbf\x1e\x70\xf2\xc1\xb7\xe9\xc2\x66\x77\x08\x9f\xdd\xd5\xe3"
+ "\x75\xd2\xdc\x0d\x22\x32\x37\xba\x25\x5a\xb0\x81\xd2\xc7\x52\x39"
+ "\xf0\x7d\x0f\x34\x5a\x86\x76\x36\xe1\x3a\x0d\xef\x69\x18\xea\x7a"
+ "\x5f\xd8\xed\x0e\xae\x4f\x54\xdb\x5d\x80\x39\x1a\xb0\x96\x31\x4e"
+ "\x9f\x7a\x09\xb6\x88\x3d\xe7\x53\x89\x9f\x3d\x4f\xf3\xd9\xdd\x9a"
+ "\xcd\x5e\x68\xf0\x10\xf3\x8f\xa2\x5b\x2d\xcd\x09\x8b\x68\x20\xba"
+ "\x9b\xc0\x63\xb6\xd6\xf0\x09\x7e\x8f\xf9\xcf\x7e\xf4\x33\xf3\x54"
+ "\x09\xae\x7b\x89\xf9\xa7\xb5\xf8\x59\xce\xfb\x3e\xf3\xd0\x9c\xe2"
+ "\xf0\x96\x71\x54\x9c\x86\x67\x4f\x41\xd4\x42\x8b\x8b\xcd\xe5\x31"
+ "\x9f\x7d\x46\x6b\x31\xf7\xcb\x71\x94\xe1\x72\x45\x64\x4d\xc3\x1c"
+ "\x20\x4d\x44\xad\xee\x90\x79\x48\xa1\x47\xb4\x86\x67\x21\x6f\x31"
+ "\x71\x7b\x98\x8f\x38\xff\xec\x4e\x11\x8c\xd9\xec\x11\x6e\x9b\x18"
+ "\x5a\x4e\x2d\x9d\x77\x10\xcf\xc3\x5a\x3a\xf7\x32\x9f\x6a\xa0\xcb"
+ "\x51\xf0\x68\xcf\xec\xce\xf2\x01\x8b\x2f\x50\x1a\xd2\x62\x2d\x85"
+ "\xfb\xf1\xbe\x09\xf9\x9a\x25\xdf\xce\xb9\x10\xb5\x46\x6d\xf6\x9c"
+ "\xa8\xcf\xde\x36\xe7\x42\x8f\x68\x29\xac\xa5\x45\x9d\xe5\xa0\xd5"
+ "\x7e\x9a\x7d\x26\x9a\xde\x5a\xbc\x0c\x79\xba\x91\xbe\x57\xf2\xff"
+ "\xec\x33\x5d\x62\xce\xd3\xe2\xdc\x9c\x0b\x7f\x15\xb3\x0b\xc5\xfb"
+ "\x05\x6e\x1a\x7a\xed\x16\xa1\xb1\x5c\x34\xb7\xef\xa7\x6b\x4f\x04"
+ "\x89\x65\x62\xd6\x52\x4d\xcc\x3e\x73\x4e\x2c\x7e\x9a\x69\x33\x89"
+ "\x5a\x0a\x21\x3f\xee\x5a\xa6\x77\x5e\x4b\xe1\x61\xd4\x3f\x0d\x70"
+ "\x3d\x22\xe0\xde\x8d\xbc\x7e\xeb\xa2\x33\x36\x6a\x6e\xaf\xa5\xa8"
+ "\xdd\x9e\x13\xab\xb6\xcf\xd0\xec\xf6\x42\xad\xda\xee\x46\x3f\x1d"
+ "\x8d\x56\xdb\xdb\x62\x76\x3b\x78\x20\x73\x06\xfa\xe9\x1a\xee\xf3"
+ "\x4b\x5e\x72\xe2\xf9\xbe\x4b\xdc\xff\xbe\xcc\x3c\x61\xcb\x74\xc3"
+ "\xe6\x15\x8a\xf7\x33\xf3\x78\x6d\x41\xd8\x33\xdd\x3d\xf6\xcc\x42"
+ "\xe4\x73\x2b\xf9\xca\xac\x64\xbe\x44\x3e\x13\xd2\xbe\x87\x79\x4f"
+ "\x3a\xde\xd7\xe1\xb7\x0f\x3f\xd8\xa1\xc3\xa0\xbb\xc8\x2e\x79\xca"
+ "\x37\xcc\x22\xee\xf6\xc1\x86\xbe\x00\x38\xc3\x5c\x73\x63\xf7\x08"
+ "\xd0\x10\x72\x32\xcc\xa2\x55\x0f\x83\x7e\x1f\x36\x23\x22\x79\x7f"
+ "\xd8\xfd\x0c\xbb\x67\x93\x8b\xd7\x1c\xcc\x78\x9f\x87\xb4\xdf\x45"
+ "\x98\x57\x6d\xc3\x8e\x6a\xb6\x2c\x17\x60\xb5\x7d\xeb\x59\x11\x8a"
+ "\xf9\x86\x45\x34\xdf\xb0\x8e\xe8\x40\xd8\xe6\xee\xc3\xc4\xfa\x29"
+ "\xfa\x6b\x01\x1a\x7c\x08\x7a\xec\x95\xfd\x1f\x70\x43\x06\x36\xdc"
+ "\x50\xde\xd2\x09\x5e\x28\xfe\xa9\xd4\x4d\xad\xe1\xe3\x92\xa6\xc0"
+ "\xe3\x28\xf3\x14\xf7\xef\xe2\x62\x2a\x47\x5d\x6d\xc0\xa5\x23\x56"
+ "\x0d\xb8\x76\xd4\x93\x39\xfc\x89\x88\x94\xd7\xe1\xe0\xd7\xc3\x28"
+ "\xf3\x21\x29\x1e\x1f\x5e\xd8\x9f\x8e\x64\x5d\xc5\xfa\x69\x6e\x34"
+ "\xc2\x3c\xf3\x77\xd6\x6b\x4a\x4f\x51\x81\xa1\xa7\x58\x47\xf1\x7c"
+ "\x87\xf5\x94\xa6\xeb\x29\x4d\xd7\x53\xf2\xd9\x66\x63\x58\x11\xd6"
+ "\x47\x73\xdd\x4a\xcf\xcc\x8d\x65\x0b\xf0\x46\x06\x60\x44\x54\x5f"
+ "\x20\x4f\x8d\x6d\x80\xcc\x2f\xe9\x64\x73\x69\xd0\x37\xf8\xe5\x68"
+ "\x4a\xdf\xb8\x75\x7d\x63\x32\xf4\x4d\x0c\xe3\x1a\x64\x4a\x4b\xa5"
+ "\x6f\x34\x5d\xdf\xc4\x84\xd2\x37\x9a\xae\x6f\x38\x3d\xa6\xeb\x9b"
+ "\x58\x0a\x7d\xa3\xf9\x6c\xdc\xde\x74\x5d\xcf\x94\xb3\x9e\xe1\xf6"
+ "\x6a\xd5\xb6\x0e\x4d\xe9\x19\x0b\xe6\x3a\x26\xd6\x33\x31\x94\xd1"
+ "\x0c\x3d\xd3\x2d\xf5\x81\x8b\x75\x4d\xcf\x73\x04\xfd\xe9\x24\xd6"
+ "\x31\x52\x9f\x44\x47\x46\x59\x9f\x80\x7e\xf7\x24\xeb\x13\xc0\xcb"
+ "\xc1\xbd\x4d\xd7\x53\x85\x98\xe9\x46\xa1\x4f\x66\xcc\x75\x87\xd1"
+ "\xd7\x1f\x61\xee\x0f\xbd\xed\x2e\x29\x0f\xb8\xa3\x04\x3d\xe0\x16"
+ "\xad\xe5\x04\x9d\x03\xfe\x8d\x41\x57\x10\x41\x2e\x8f\x42\x3e\x23"
+ "\xa8\xbb\xad\xb5\xf8\x4f\x04\x79\xcf\x99\xdd\xd9\x15\x58\x1c\x76"
+ "\xd9\x66\x9f\x11\x21\xd0\x27\xb8\xb8\xb8\x1c\xfa\xc5\x15\x6a\xe9"
+ "\x7c\x8f\x66\xb5\x0b\x6d\xd6\x92\xa0\x13\x78\xb4\xcd\x5e\xe9\xb7"
+ "\x2e\x7e\xda\x06\x39\x13\x7e\xe8\xc5\xff\x67\xf6\x19\x9b\x35\xbf"
+ "\x9d\xbe\x34\x6b\xa9\xd0\x20\x4f\xa0\x3b\xe4\x0c\xf2\x08\xdc\x0b"
+ "\x21\x73\x6e\xc8\xd9\xd1\x68\x92\x9c\x41\x66\xee\xc3\xbd\x53\xd1"
+ "\x2f\xd3\x0d\x39\xcb\xd3\xe4\x78\xd6\x2e\xe7\x98\x90\x35\x37\xaf"
+ "\xc5\x41\xd6\xf2\xb4\x6a\x25\x6b\x9a\x2a\x57\xa9\x31\xfd\x4c\xba"
+ "\xac\xa1\x2f\xf0\xbe\x0e\xbf\x7d\xf8\xa5\x96\xb5\xe2\x38\x59\x7b"
+ "\x5a\x97\x35\xbb\x92\x35\xf4\x69\x7a\x6c\x93\x92\x37\x86\xcf\xf3"
+ "\xd0\x5e\x79\xcb\x1c\x76\x14\xf7\x69\x8a\x77\x58\xe6\x86\x61\x5c"
+ "\x19\x16\x81\xbc\x75\x68\xbe\x2c\xc0\x13\x21\xd6\x9b\xe0\xcd\xbf"
+ "\xf0\x58\x37\xa7\x58\xfc\xa5\x20\x76\x43\x39\xea\x8a\x40\x97\xfd"
+ "\x15\x7a\xf4\x2f\x8b\xc3\xb4\x07\xb0\x8e\xa2\xbe\x36\xc8\x53\x87"
+ "\x56\x2d\xe5\xa9\x30\xb6\x89\x61\x0e\x2f\xec\x85\x21\xc7\xca\x44"
+ "\x79\xea\x6f\x1d\xb4\xdb\xeb\x2c\x0d\xd2\xaf\xa4\xdd\x84\xfb\xca"
+ "\x20\x1d\x9e\xa6\xdf\xc3\xfe\xd9\xe3\x90\x76\x0c\x64\xb0\xb8\x8c"
+ "\xae\x3b\x4d\x23\x67\x80\xdf\x09\xf7\x19\xb8\x9f\x35\xf7\x96\xf7"
+ "\x61\x47\x54\xe6\xa0\xde\x6e\x96\x43\xe1\x9d\xc8\xf6\x59\x2e\xf8"
+ "\xd0\x22\xba\x5d\x19\xb0\x2f\x1b\x44\x8f\x83\xd7\xda\xac\x78\x1e"
+ "\x8a\xf6\x8f\xc2\x35\x73\xf7\x45\xca\xc2\xcf\xb1\xdb\xab\x95\xb3"
+ "\xed\x84\xfb\x6c\xb1\xde\x31\x78\xc7\x3a\x1a\x6b\x0d\x93\xa5\xd1"
+ "\xab\xe5\x59\xb7\xd8\x78\xcd\x29\x8b\xef\x85\x77\xef\xa4\xc6\x8b"
+ "\x64\xe6\x75\x01\xcd\x8e\xfa\xdc\x56\x21\xd6\xba\xa8\x71\x0d\xf4"
+ "\x83\x97\x1c\x8d\x5e\x71\x20\xd6\xcd\x34\xb0\xb6\x19\xb8\x30\x6e"
+ "\xc0\xf3\x46\xe0\x99\xff\xf0\x86\x5c\xfa\xd0\x4d\x29\xd7\x6a\xbb"
+ "\xbd\x23\x7b\xdb\xdf\xcf\xfb\x7a\x83\x26\xfd\xbc\x3f\x6c\xd0\xa9"
+ "\x9f\x75\x3d\x33\x8f\xd1\xb1\x75\x22\x54\xf5\x04\x31\x2d\x1c\x9e"
+ "\xa8\xf8\x1b\xe8\x58\x5e\x16\xa3\x1b\xe7\x6e\xf8\xb2\x08\x74\x0a"
+ "\x7f\xc0\x7d\x86\x1a\xf1\xbe\xac\x54\x68\x9a\xdd\x09\x99\x77\x96"
+ "\x76\xad\x13\x51\x5e\xcb\xe9\xf6\xde\xe4\x0c\xd2\x37\xfd\xaa\x2f"
+ "\xec\x79\x72\x0e\x69\x73\x96\x02\x96\x9d\x61\xb5\xa0\x7c\xac\xda"
+ "\xb9\x15\xf9\x66\x04\xe9\xb7\x79\x32\x9f\xcd\x9e\x57\xbc\x91\xbe"
+ "\x78\x9a\x6e\x92\x34\x16\x3e\x67\x2d\xeb\x03\xa4\xd9\x90\xb6\x0d"
+ "\xf0\xeb\x90\xdf\x1d\xa4\xb7\x6b\x95\x1d\x7b\xd3\x36\x23\x1f\xee"
+ "\x97\xf0\x7d\x02\xff\xa4\xc9\xc5\x74\xc0\x72\xf6\x6d\x56\xa5\xe9"
+ "\xcb\xeb\xc6\x9f\x0d\xbf\xdc\xd4\xaf\xfb\xf4\xb9\xbd\x0d\xb6\x16"
+ "\x79\x36\xd3\x08\xf4\x0f\xf0\xfb\x4a\x1a\xe6\x11\xa7\x84\xf7\xa6"
+ "\xba\xd7\x37\x46\x30\x4f\xf8\x4a\x46\x90\x5e\x68\xea\x8f\x9e\x82"
+ "\x6d\x9d\x8b\xa2\xa3\x6a\x5d\x2f\x2d\x3f\x9e\xbb\x41\x13\x7c\xcf"
+ "\xfa\xa8\x11\xe9\x4c\x37\xc0\x59\x60\xd0\xac\xff\x7e\x71\xfa\xd4"
+ "\x9c\xf3\x2b\x07\x85\x57\x90\xff\x4b\xbc\xc7\xf4\x95\xb7\x15\x1d"
+ "\x32\x0b\xbb\xa0\x47\x78\x9d\x18\x73\xb3\xf0\x5a\x87\x88\x00\xe6"
+ "\xbe\x20\x8d\x35\xd6\x58\xc3\x81\xe8\x74\xd6\x2d\x29\xc7\x2d\xde"
+ "\x13\xeb\x83\x3f\xea\x78\xeb\x08\xe8\x21\xa9\x9b\xf2\xf7\x96\x29"
+ "\xbc\x23\x0c\xd7\x5f\x76\x9e\xda\xf1\x7e\x6d\x58\x74\x08\x5f\x7e"
+ "\x1d\xcf\x23\xfc\xeb\x2e\x71\xda\x9f\xc0\xdb\xc2\xbf\x86\x71\x1a"
+ "\xf5\x27\xff\x97\x2e\xd1\x29\x37\xa5\x37\xf6\xae\xff\x8c\xf2\xf3"
+ "\x7a\x8f\x5a\xe7\x1a\x95\x1b\xa4\x71\x11\x03\x2f\xb6\x31\x40\x5f"
+ "\x0b\xdb\x1c\x6c\x6b\xf0\xde\xc3\xda\x52\x11\x61\x9b\x03\x79\x8b"
+ "\x8c\x36\x70\xfb\x54\xbb\x46\x95\xc7\xb7\x8b\xf7\xa8\xac\xa5\x8a"
+ "\x06\x6b\x37\x90\xc5\xa9\x68\x6d\xe1\xf6\x72\x5b\xb8\xcd\xb2\x2d"
+ "\x52\xc7\x62\x8c\x88\xde\x81\xf9\x98\x4c\x77\x03\x16\xe6\x3f\x63"
+ "\x75\x9e\x1a\x95\x9b\xcc\x47\xbd\xfd\x68\xb3\xbb\x30\x07\xfd\x92"
+ "\x47\x13\x27\x4f\xd1\xe8\x47\xd4\xda\xd9\xe8\x47\x34\xb6\xb3\x23"
+ "\xcc\xbf\x63\xdc\x3c\x26\x07\x4a\x59\xdf\xca\xbc\xc3\x90\xb7\x1d"
+ "\x79\x66\xea\x79\x67\xaa\x3d\x3b\x79\x1d\xc4\x57\x8c\x63\xa3\x83"
+ "\x34\x7a\x49\x48\x8e\xf7\xf9\x4b\x8c\x67\xcc\xdd\x31\xff\x1b\xed"
+ "\x10\xd5\x63\xdc\xa9\x71\xc9\x72\xf1\x78\x16\xbb\x28\x3a\x51\xcf"
+ "\xf5\xcc\x53\x9e\x0d\xf4\x05\xf0\xe5\xc7\x65\x9b\x69\x18\xf3\x93"
+ "\xb0\x3b\xeb\x15\xdd\x47\xef\x17\x5e\xd8\x9e\xd0\xa8\xc5\xeb\xe8"
+ "\x8b\x90\xa3\xda\xd3\x34\xfa\x83\x82\x52\x27\x70\x25\xaa\x3a\x4b"
+ "\x24\x75\x90\xdd\x59\x17\x88\x7e\x42\x8d\x67\x79\x6d\x67\x74\xd0"
+ "\xe0\x45\xdc\x77\x5e\x49\x5f\x80\xae\xfb\xd4\xda\xc3\x98\x47\x78"
+ "\x9f\xe1\x24\x8d\x99\xc6\xed\x55\x7b\x9c\x63\xee\x10\x17\x45\xbe"
+ "\x50\x63\x5a\x5d\x90\xc6\x14\xe3\xba\x4f\xfe\xbc\xb4\x44\x7f\xae"
+ "\x43\xbe\x51\xe2\xa2\xc6\x79\xc0\xaf\x63\x26\x09\x6f\x1a\xcb\xc4"
+ "\xe1\x6e\xef\x98\xc2\x20\xdd\xdd\xa6\xfa\x66\xcc\x44\x86\xd5\x0f"
+ "\x0e\x75\xe8\x5b\x62\xde\x04\xac\x3f\x38\xcb\x78\xed\x72\xcc\x1b"
+ "\x52\x2e\x00\xab\xd1\xa4\xf4\xb6\x06\x5c\x1b\xbc\x5a\x21\x74\x74"
+ "\xa1\x56\xe3\x8a\xc8\x7b\xfd\x9d\xd0\xc7\xd1\xd4\xf0\xf3\xf7\xfa"
+ "\x6f\x60\x1e\xbf\x79\xac\x82\x93\x5f\xe7\xbf\xe1\x34\x3f\x8f\xe3"
+ "\xe7\xb0\xed\x96\x48\xa0\x2e\x17\xf5\x9f\x46\xbd\x37\x8f\x55\xf3"
+ "\xf9\x9b\xc7\x75\xa1\x8e\x6e\xef\xcd\x63\x83\x34\xc1\xac\xf6\x5c"
+ "\x6e\x89\xf4\xb7\x97\xcc\xb2\xc3\x32\xa7\x64\xda\x75\xa6\x65\x8f"
+ "\x94\xbf\x4a\xf0\xfc\x3e\x5d\x6f\xf0\x3a\x4d\xc6\x49\x72\x75\xb6"
+ "\x38\x24\x7f\x9b\x84\xe9\xe6\x6d\x3f\xd3\x42\x26\xde\x17\x53\xea"
+ "\xcb\xd5\x79\xf9\xef\x66\x3f\x7e\xc7\xf0\x3b\xa1\x3f\x77\xe0\x17"
+ "\xc5\xfd\x2c\xfc\x4e\x48\xda\xed\x5a\x96\x16\xc4\xbb\x2e\xd8\xec"
+ "\xfc\x1c\xa4\x9b\x8f\x8a\x5d\xa3\x4c\xb0\x4b\xe4\x7d\xe3\x17\x78"
+ "\x9d\xe0\xe6\x30\xfa\xa0\x54\xf5\x85\x4b\xae\xa9\x00\x37\xa6\xbb"
+ "\xf0\xd4\x89\x48\x53\x59\x98\xf1\x1e\xd5\x54\x17\x26\xe7\x18\x6e"
+ "\xbf\xcb\xc5\x6d\x0a\x83\xfe\x7c\x5d\x5b\x27\x42\x47\xea\xa3\xc4"
+ "\xfb\x73\xdd\x5e\x17\xe4\x7f\xe5\x2c\xb5\xe6\x90\xef\x67\x78\x3a"
+ "\x4f\x08\xa3\xfd\x4a\xa7\xdd\x12\xe1\xbe\xc4\xf3\x33\x68\xbb\xf5"
+ "\x2c\xb9\xde\x16\x99\xae\xc8\x91\x42\xa2\xdd\xd0\x23\x18\x6b\xe4"
+ "\x5e\x41\xa3\xf4\x0f\x70\x61\x1c\x18\x73\xc2\xd8\x4f\xda\x8e\xf7"
+ "\x3b\xf0\x0e\x63\x4f\xa8\xa5\x30\x42\x0c\x2b\xc6\xed\x43\xf9\xf7"
+ "\xb4\x90\x19\x63\x35\xfa\xfc\x96\x48\x59\x31\xf4\x4c\xaf\xde\x72"
+ "\xe5\x6f\x3e\x23\x22\x46\xfb\x8e\xec\x61\x59\x70\x81\xff\x9f\x2c"
+ "\xec\x97\xff\x7b\x71\xbe\xf5\x9a\x23\xa3\x54\x9f\x69\xa0\x4b\x62"
+ "\x9f\xdd\x6a\x51\xfd\x75\xcb\xa4\xc4\xfe\xba\x15\xb6\xcd\x2d\x5b"
+ "\xf1\xab\xc7\x6f\xbf\x7a\x8e\xff\xdd\x52\x1c\x77\x7f\x18\x3f\xe8"
+ "\xce\x5b\x30\xfe\x8f\x8e\xa8\x7e\xe0\x74\xb4\x83\x79\xe4\x9f\x64"
+ "\xd1\x7a\xf2\x88\xf7\x6b\x39\x9d\xf9\x99\xd3\x35\xd8\x33\x41\xba"
+ "\xc5\x87\xf7\x36\x96\xd5\x2a\x8d\x12\xde\x07\x50\xbb\x7f\x23\x74"
+ "\x35\xdd\xf2\x31\xc3\xb2\x6e\xa9\xac\x64\x3e\x45\x99\x5a\x6b\xb4"
+ "\x12\xf3\x83\x5b\x3a\x0d\xba\x22\xed\x38\xbf\x67\x9e\xec\xf6\xde"
+ "\x6a\x06\x5d\xf6\xc9\xfd\x58\xcc\xf7\x52\xdb\x1a\xb7\xba\x7a\x6d"
+ "\x32\xdb\x30\x0b\xeb\xa3\x4e\xfa\xea\x44\xe8\x2c\xf4\xad\x2b\xa4"
+ "\xc6\x9a\xaf\xde\xc1\xcf\xd0\x95\x1f\xe3\x3e\xbb\x05\x3a\xe9\x52"
+ "\x8d\x93\xd7\x71\x06\x5d\x32\x51\x6e\xb4\xa6\x32\x3f\x9a\xe9\xc8"
+ "\x08\x74\x1c\xa4\xd6\xe8\xcf\xc9\xf9\x84\x84\x71\x4b\x00\x3c\xe0"
+ "\xd9\x20\x62\x6f\x5e\xda\x67\x0e\x44\xcf\xf9\x31\x36\x7f\xf9\x34"
+ "\x7d\x55\xd2\xe3\x85\x93\x18\xf5\x17\x4b\xd8\x3a\x7d\x2a\x73\x76"
+ "\xac\x10\xd1\x1d\xa7\x44\x18\xf6\xdd\xe0\xed\x97\x68\xec\xce\x8d"
+ "\x94\x5d\x7f\x89\x46\x35\x5c\x22\x97\xf8\xbb\xcb\x54\x0f\xbb\x6d"
+ "\xf1\x05\x1b\x41\x27\xe4\x0d\x2d\x26\x4b\xc3\x46\x92\x3c\x12\xab"
+ "\x86\xfd\x16\x85\xfd\x76\xce\xc5\xba\xb1\xd7\x7e\xeb\x91\x76\xf1"
+ "\x48\x9d\x8f\x46\x9a\x87\x14\x52\x5a\xc6\x12\xb2\x01\x3f\xcf\x59"
+ "\xba\x75\x65\x06\x06\x44\x6e\x73\x50\x6f\x2f\x68\x5e\x6a\x2d\xa4"
+ "\x41\xb2\xad\xd0\xd7\xa2\xda\x15\xea\x77\x1c\x36\x31\x4f\x85\x59"
+ "\x6e\xb8\x0d\x5b\x78\xcf\xf8\xe0\x0d\x11\xf3\xda\x7a\x11\xe1\xf4"
+ "\x92\x91\x22\x82\xf4\x42\xae\xfb\x00\xd2\xbb\xbd\x5f\xf5\x05\xcd"
+ "\xd7\x36\xf7\xc7\xa3\x98\x1f\xe9\x7a\x65\xac\x5d\x98\xca\xc1\xa3"
+ "\xc3\x66\x6c\x8e\xc2\xf6\x3e\xcb\x32\x3b\xd6\x36\xb7\x48\x44\x9d"
+ "\xab\x78\xff\x7e\x2c\xb1\x6f\x01\xef\x29\xfe\x0c\xb6\xcd\x67\xf9"
+ "\x13\xf0\x78\xc1\x73\x05\x6b\x11\x60\xd6\x0c\x9b\x21\x30\x3f\xff"
+ "\xbc\xfe\x0c\x68\x67\xc6\x8b\xc3\xd9\xcf\x66\xec\xac\x20\xcd\xda"
+ "\xcb\xb8\x4b\x5f\x1a\xe8\x4e\xd8\x5b\xc3\x80\x57\x65\x18\x74\xc0"
+ "\x7b\x8c\xff\x33\xdd\xfa\xfe\x6f\x88\xf7\x5e\x91\x86\xf1\xff\x81"
+ "\xc3\x9c\x56\x32\x92\x1c\x25\x4e\xd1\xd1\x9f\xcd\xc4\x7b\xd2\x80"
+ "\x87\xf9\xe6\xd8\x83\x06\x1c\x8c\x53\x3f\xee\x32\x3d\xfc\x30\xd2"
+ "\x8e\x1a\x70\x90\xe7\x3a\x3c\xb7\xf5\xe6\x51\x65\x3a\xe2\xca\x3c"
+ "\xdc\x65\xba\xf5\xc7\x48\x8b\x26\x96\x19\x97\x91\x58\x66\xdc\x88"
+ "\xb8\x32\xe5\xaa\x9e\x71\xd9\x49\x65\x72\x93\xca\xcc\xbb\x1c\xb7"
+ "\x71\xcb\x92\xca\x94\x24\x95\xd9\x7a\x39\x6e\xe3\xea\x92\xca\xec"
+ "\x4b\x2a\x73\x28\x8e\x96\xec\x57\x93\x8d\xb4\xe6\xa4\x32\x27\x92"
+ "\xca\x74\x1a\xcf\xfd\xd0\x38\x63\xed\x6e\x72\x80\x37\xd9\x77\x2b"
+ "\xf4\x22\xfa\xa7\xeb\x95\x27\xbb\x55\xd9\xf1\xae\xcb\xdb\x35\x7e"
+ "\x52\x62\x7d\xe3\x67\x25\xd6\x37\x3e\xff\xf2\x76\x8d\x2f\x4e\x2a"
+ "\x53\x9e\x54\xc6\x17\x57\x66\x8f\x5e\xcf\xde\xa4\x32\x07\x93\xca"
+ "\x34\x5d\xce\x57\xe3\xdb\x92\xca\x74\x24\x95\x89\x7c\x06\x2d\x78"
+ "\x1c\x57\x7e\x6d\xc3\xd9\x56\xbe\x17\x36\xc2\x84\xa5\xec\x1b\xc1"
+ "\xfb\xa0\xaf\x5f\x8a\x0c\xe0\xfd\x39\x1e\xaf\x8e\xb8\x23\x18\x5b"
+ "\x26\x60\xfe\x33\xd1\x6f\x8c\x59\xec\x37\xc2\x32\xad\x6c\xec\x09"
+ "\xae\xfe\x6c\x51\xe9\x7b\xa6\xfb\xaf\x71\x5d\x47\x46\xf0\x38\x35"
+ "\xa1\xb6\xd7\x26\x56\x3e\x68\xa4\xc3\xf9\x87\xb1\x0f\xdb\xa8\xfc"
+ "\x51\xd2\xd8\x26\x3f\xe2\x96\x65\x8e\xc6\xd9\xd1\x5c\x7f\xf8\xe0"
+ "\xc6\x88\x39\x09\x8f\x7d\x57\xc0\x23\x03\xb6\x51\x65\x2b\x46\x2f"
+ "\xde\x5f\x6f\xa9\x87\x0d\x04\xbb\x9f\x71\x3b\x49\xd9\xd9\xd2\x26"
+ "\x5b\x75\x89\xf8\x3e\x50\x7a\x97\xdc\x7f\x57\x36\x69\x76\x61\x13"
+ "\xea\x67\xdb\xbd\xa9\xf8\x3c\xfb\xa7\x60\xfc\x65\xdb\x2d\xfb\xa5"
+ "\x23\xa5\x21\xe0\x95\xbd\xc4\xf0\x53\x09\x52\x76\xad\xb4\x35\x7c"
+ "\xf9\xe5\xec\x1b\xc0\x3e\x34\x47\xc2\x39\x9c\x07\xfc\x3f\xa1\xc8"
+ "\x68\x2f\xc6\xfa\x10\xf2\x4e\xba\x12\xcd\x54\x1f\x66\x1f\x4e\xe4"
+ "\xc9\x01\xe0\x95\xec\x63\x89\xfd\x9e\x1d\x4c\xec\xf7\xec\x50\x22"
+ "\x4f\x9a\xc0\x93\xb7\x99\x13\xcb\xdc\x96\x95\x58\xe6\xb6\x51\x71"
+ "\x65\x7c\xaa\x9e\xdb\x72\x92\xca\xcc\x48\x2a\x93\x17\xf7\x8c\x36"
+ "\xde\x56\xd8\x3b\xf7\x91\x3e\x50\xb7\xb9\xe3\x9e\x4d\xb5\x52\x7f"
+ "\xde\xb6\xcd\x48\xe3\xb5\xa3\x86\x97\x95\x0f\x8e\x0e\x6f\x5f\x92"
+ "\xbc\x73\xfe\xc3\x49\x38\x34\x27\xe1\xd0\x2b\xff\xfa\xde\xfd\x6f"
+ "\x4e\xd1\xed\x07\xf5\xbd\xfb\x4e\x8c\xd9\x73\xf9\x19\xb0\xea\x90"
+ "\x1f\x74\xb8\x3d\x23\x11\xde\xed\x23\x12\xe1\xdd\x3e\x36\xee\xd9"
+ "\x86\xe7\x49\x71\x6d\xb0\xa5\x3b\x28\x0d\xfc\x02\xfb\xed\xf6\x05"
+ "\x46\x3a\xcf\x29\x81\x6f\x87\x47\x8e\x35\xb9\xec\x5b\x96\x79\x92"
+ "\x6e\x9f\xc2\xf3\x4f\x1d\x66\xbc\xfc\x93\x6a\xd7\xed\xb5\x49\x78"
+ "\xec\x4d\xc2\xe3\x60\x5c\xbb\xc2\xd6\x2d\xf4\xa0\x35\xfa\xd0\x23"
+ "\x6c\xfb\xb0\x3f\xa5\xf4\xf1\xda\x0c\x9b\xed\x02\xd9\xd8\xb7\xee"
+ "\x54\x09\xa5\x07\xdc\x1d\x98\xcb\x8d\x4c\xb9\x0e\x23\xf9\x29\x33"
+ "\xdf\xa7\x7c\xab\xc8\xd9\xed\xfd\x5a\x96\xc1\x8f\x5a\x4d\xbe\x4f"
+ "\xab\xbe\xb9\x09\x69\xd0\x7f\xd9\x7b\x94\x9d\x7b\xb3\x4d\x78\xf2"
+ "\xea\x40\x4f\xcc\x8b\x26\x5e\xa7\xcf\x23\xf6\xb2\x8f\x18\xfb\xb1"
+ "\x62\x8c\xcf\x50\xfb\xf0\x5f\xcb\x8f\xe3\xeb\xb0\x73\xe3\x3d\xe2"
+ "\x24\x4d\x1c\xc9\x36\x00\xcb\x28\xfb\x9a\x1d\x89\x86\x88\xe7\xde"
+ "\x81\xe8\x69\x69\xbb\xe1\xbd\x53\x2f\x5b\x17\x57\x36\xa4\xcf\x8d"
+ "\x3b\xf8\xdd\x84\x28\x99\x8f\x84\x43\x04\x38\x59\xca\xde\x9b\x38"
+ "\xf2\x08\xe4\x15\x65\x9a\x8d\x32\x3c\x8f\x96\x7b\xbc\x25\x64\x1e"
+ "\x5f\x4a\x66\xff\xc6\x93\x12\xb6\xe1\xb7\x01\x5b\xba\x33\x50\xda"
+ "\x41\x81\x70\x1b\xaf\x75\x99\x95\x8f\xce\x44\x67\x7a\x84\x2c\x5d"
+ "\xd5\xf9\xe8\x93\x89\xce\x58\x75\x7e\x25\x70\xdb\x13\xa4\xaf\x4d"
+ "\x63\x7d\x13\x4f\xbb\xe9\xd3\xe7\x3d\x34\x77\xf6\xb8\xef\x3c\x34"
+ "\x73\xc1\xf4\xbb\x9c\x0b\x56\x3e\xb5\x7c\xd9\xb8\xd5\xcf\x94\x38"
+ "\xd7\xaf\x59\x59\xb2\x72\xd5\x77\x9d\xd9\xee\xd1\x6e\xe7\xd2\x12"
+ "\x75\x75\x15\x2d\x5d\x5b\x32\x99\x6f\xc7\x3a\x8b\xd7\x2c\x5f\x27"
+ "\x6f\x6f\x19\x4c\x89\x40\x56\x96\x2c\x5f\xe3\x1c\xbd\x6c\xac\xf3"
+ "\xbe\xa5\x2b\x8b\x9e\x59\xb3\x3c\x25\xac\xbb\x9c\x6b\x96\xaf\x59"
+ "\xbe\x74\x99\x73\xb2\x33\x9b\x21\xc7\x83\x8b\xeb\xcf\x6c\x63\x1c"
+ "\xe3\xf1\xab\xca\x2b\x8e\xe9\xe3\x59\x50\xf1\xcf\xc4\xf0\xe5\x63"
+ "\xd9\x1d\x96\x44\x9e\xbb\xc3\x91\xc8\x73\x77\xb8\x2e\x1f\xcb\xee"
+ "\x48\x1a\xff\xee\x48\x1a\xff\xee\xc8\xbf\x7c\x2c\xbb\x23\x69\xfc"
+ "\xbb\x23\x69\xfc\xbb\xa3\x77\xfc\x03\x2f\x49\x3f\x3a\xa4\x25\x8d"
+ "\x7f\x77\x24\x8d\x7f\x77\x34\x25\x3d\x1f\x8f\x7b\x1e\x86\xe7\xf6"
+ "\xf8\xf1\x11\xcf\x61\x43\x3e\xfb\xf4\xcb\xd7\x2d\x46\x1e\xd6\xf5"
+ "\xd0\xcd\xed\x2a\xef\xd7\x9d\x71\x79\x3b\xf4\xbc\x13\x7b\xe5\x8f"
+ "\xf7\xb5\x91\xae\xe6\xeb\x5f\x7f\x95\x75\x3a\xfb\xe3\xf1\xd8\x04"
+ "\xf9\xf8\xf2\x59\xfa\xba\x9d\x61\x31\x0f\xb3\x7f\xa6\x78\x65\x61"
+ "\x77\x63\x26\x59\xb8\x4c\x63\x0d\xfb\xf5\x4e\x1c\xcb\xbe\xba\x48"
+ "\x63\xdf\x65\xe8\x94\xaf\xc3\xfe\xcd\xa8\x57\xe3\xc5\xd7\x83\xd2"
+ "\xe6\x47\x19\x1d\xbe\x9c\xd7\x00\x0e\xfb\x02\x5b\xaa\xd4\x58\xdc"
+ "\x8e\xfb\x0c\xe6\x69\x94\x37\x0b\xd3\xc4\xa7\xd9\x07\x1a\x69\x36"
+ "\xfc\xb2\x00\x2f\x68\xc0\xdb\x3a\x3c\xb5\x6d\x99\x6c\xe7\xf6\xce"
+ "\x07\x4d\x64\xad\xf2\x6a\x6d\x01\x8d\x6d\xeb\x6f\x64\xa9\xb5\x05"
+ "\xa7\x53\x78\xdf\xcf\x6b\x44\x7a\xea\x79\xd2\x37\x60\xff\x7d\xc3"
+ "\xa2\xd6\x5b\xbe\x81\xfe\x9f\x3d\x51\xad\x9d\x3a\x9d\xd0\xb7\x97"
+ "\x00\xe7\x02\xae\x3d\xb8\xfe\xa7\x01\xdf\x2f\xe7\xdb\xdf\x28\x11"
+ "\xde\xb4\xf9\x0c\x37\x29\x7d\x1b\xf4\xdb\x25\x6b\xb4\x3c\x2f\xc5"
+ "\x3b\xcc\xb3\xd3\x1f\x4a\x91\xee\x87\xcd\x70\x09\x78\x84\x19\xdf"
+ "\xb8\xf4\x36\xe1\x1d\xba\x80\xf3\x07\xb9\x3e\x94\xe9\xcf\xd6\x36"
+ "\xfc\x6f\x95\x0f\x7f\xce\xa8\xa4\x76\x7c\x7a\x8a\x72\x5e\x53\xed"
+ "\xc8\x89\x25\xd6\x9d\x33\x29\x75\x3b\x72\x16\xa0\x1d\x9f\xa6\x6e"
+ "\x47\x4e\xb1\xa4\xad\x09\x6d\x31\x5d\xf6\x6e\x1b\xda\xf2\xa9\xa4"
+ "\x7b\x62\xfa\x5e\xdd\x16\x0a\x63\x1e\x66\xc3\x3b\x59\x76\x7e\x69"
+ "\x5f\xbf\xe9\xf9\x9a\xad\x75\x34\x2f\x45\x9d\xed\xc2\x3b\x68\x7e"
+ "\x90\xee\x94\xe7\x1a\xe2\xd2\xa3\x0a\x17\xd0\xc9\xc4\x74\x42\x7b"
+ "\x50\xae\xbf\xfe\x36\xe6\x25\x6a\x2d\xe4\x4e\xc8\x7f\x0e\x19\x6b"
+ "\x99\x6b\x4b\x45\xc8\xa0\x23\xde\x15\x26\xbd\x8b\xc4\xbd\xdb\x9a"
+ "\xf0\x6e\x73\x6f\x7a\xbd\x91\xfe\xf9\xfa\xe9\xce\xe6\xa4\x7e\x42"
+ "\xff\xdc\xb5\x28\xb1\xdd\x77\x9e\x50\xed\x43\x1f\x5d\x46\xeb\x3b"
+ "\x23\xe8\xa3\x9e\xd4\x7d\x74\x57\x56\x6a\x5e\xbb\x4b\xae\xa3\x89"
+ "\x4c\x4a\x01\xef\xae\x19\xe8\xbb\x1e\xc9\x83\x7a\x3f\x5d\xde\x3f"
+ "\x77\x15\x19\xfd\xf3\xf9\xda\x78\xd7\x81\xa4\x36\xc6\x4e\xd1\x37"
+ "\xc7\xa9\xb6\x7e\x73\x73\x12\xec\xa3\xa9\x79\xf1\xae\x20\xda\x19"
+ "\xeb\xa7\x9d\xd1\xfe\x79\xf1\x9b\x0e\xb4\x27\x76\x39\x2f\x7e\x33"
+ "\x5b\x95\xa1\x54\x65\x66\x09\x6f\xaa\x7a\xbe\xb9\xcc\x13\x65\x3b"
+ "\xf7\x9b\xf5\xbc\xbe\x14\x97\x5e\x9a\xc8\x7f\x68\x03\x97\x63\xfa"
+ "\x45\x95\x9e\xe5\x7e\x38\xe5\x24\xd3\x67\xf1\x64\xb7\xf7\x9b\x27"
+ "\x92\x68\x75\xee\x14\x4d\x5a\xd4\x65\x4a\xdb\xab\xe8\x35\x79\x64"
+ "\x12\x4e\x91\xd4\xf4\x9a\x64\x03\xbd\xce\xa5\xa6\xd7\xa4\xb1\xfd"
+ "\xd3\x6b\x12\xf7\xff\xb9\xcb\xe9\x35\x69\x49\x3c\xbd\x60\xeb\xca"
+ "\xf6\x7d\xc5\x01\xde\xe8\x29\x10\x8d\xdc\xd6\x18\xd9\xac\xe0\x15"
+ "\x55\xa6\x93\xcb\xd4\x5a\x23\x8a\x4f\x60\x43\x5a\xce\xd2\xa4\x52"
+ "\x43\xfe\x87\xd6\xd1\x20\xd1\xb3\x90\xfd\x88\xd2\xb8\x5c\xc0\x7d"
+ "\xce\x1f\x88\x66\x13\xcf\x3f\x92\xea\x6d\x4b\xad\x0b\x26\x85\x40"
+ "\xd3\x9a\xcb\xd3\x27\x5b\x94\x1f\xd9\xe4\xdc\x44\x1d\x31\xd9\x99"
+ "\xd8\x47\xa0\x1b\xca\xe9\xdb\x4e\x9f\xf9\xbb\x72\x9f\x4d\xf6\x5d"
+ "\xde\x67\x77\xdf\xa6\xfa\xeb\x6e\x7b\x12\x7e\xfb\x52\xf7\xd7\x64"
+ "\x7f\xff\xfd\x35\xf9\x44\xff\xfd\x35\x99\xd7\x4f\xcf\x05\xe9\xee"
+ "\xec\xc4\x71\xe3\x6e\x5b\x62\x7b\x51\x2f\xca\x09\xd3\xc0\x61\xfc"
+ "\xfc\x79\xdb\x6d\xfc\x58\xc7\x71\x5f\xf1\xb9\x22\xe0\x3f\x92\x71"
+ "\xbc\x5a\x18\xfd\xc2\x06\x0d\x7d\x1b\x53\xef\xb7\xf2\x1c\xb7\xb5"
+ "\x8e\x88\xf7\x91\x9d\x5f\x62\xdb\xfd\x9e\x01\x9a\x89\xda\x70\x6f"
+ "\x3a\x45\xb9\x7f\xd0\x4c\xa6\x52\xde\xf3\x94\x7e\xeb\x72\x0d\xe1"
+ "\x9e\x11\xf1\x7d\xc1\x7b\x9f\x3c\x37\xdd\xa1\xe6\x4e\x7f\x45\xf9"
+ "\x37\x54\xbf\xe4\xbe\x95\x48\xc7\x7b\x72\x53\xf7\xcb\x3d\x79\xe8"
+ "\x97\xbf\xa6\xee\x97\x7b\x4a\xfa\xef\x97\x7b\x7c\xe8\x97\xbf\x5e"
+ "\x2e\x47\xf7\xec\xd3\xe5\xa8\x82\xcb\x38\x57\xf1\x7c\x3c\xf7\x0b"
+ "\x9c\x07\xf7\x90\x91\x5c\x49\x93\x71\x9d\x86\x1c\xc9\x32\x27\x00"
+ "\x4b\xd6\xaf\xf2\xdc\xd3\xa6\xc3\x88\x83\x9b\x4b\xd6\xce\x54\x72"
+ "\x92\xeb\xe0\xbc\xe3\x8b\xc9\x02\x1a\xe6\xed\x66\x18\x6b\x88\x50"
+ "\xcf\x53\x9c\x8f\xd3\xc7\x87\xe3\xe5\x24\x77\x86\x91\x8f\x75\x9d"
+ "\x9e\x37\x57\x74\x17\x12\xe7\x4b\x82\xad\xb7\x7f\x90\x1c\x47\x38"
+ "\x3f\xe7\x4b\xca\x53\xa7\xe4\x31\xf7\x44\xa2\x3c\xe6\x1e\x48\xe4"
+ "\x4f\xd0\x1f\xe5\x34\xe8\x39\xdc\x9b\x81\xc3\xe7\xe6\xaf\x2b\xcb"
+ "\xe6\x94\xb1\x49\xb2\x09\x1e\x98\xd2\xa2\x78\x60\xca\x4f\x13\x71"
+ "\x9d\x32\x2d\x35\x0f\x4c\xc9\xef\x9f\x07\xa6\xb8\xfb\xe7\x81\x29"
+ "\xb5\xcc\x03\x41\x9a\xd2\x9c\x28\x9b\x53\xf6\x27\xb6\x1d\xf5\x4a"
+ "\xd9\x24\xfb\xd5\xc8\x26\x6c\xa1\x61\xfd\xc9\x21\xcb\x14\xfb\x8f"
+ "\x34\x5e\x32\xf6\x3a\x3e\x17\xcd\x2c\x90\x2b\xe0\x77\xef\x12\x5e"
+ "\x53\x82\x8e\xcf\x61\x1a\x36\xc8\xf3\x98\xf7\x96\xc4\xd3\x71\x87"
+ "\x3a\x03\xe9\x41\xde\x4f\x79\x5f\x59\xd1\x73\xea\x07\x89\xed\xbf"
+ "\xb7\x36\x35\x3d\xef\xdd\x0f\x7a\x7a\x52\xd3\xf3\xde\xa3\xfd\xd3"
+ "\xf3\xde\x76\x3e\x23\x75\xb9\x4c\xdd\x1b\x75\xae\x93\x36\x8a\x2c"
+ "\x73\x96\xa6\x3e\xfc\xf9\xc6\xa7\xa9\x13\x13\xc7\xa7\xa9\x23\xae"
+ "\x7e\x7c\x9a\xea\x4e\x3d\x3e\x4d\xf5\xa5\x1e\x9f\xa6\xee\x53\xf2"
+ "\x30\x35\x98\x28\x0f\x53\xfd\x89\x3c\x01\xda\xfd\xaf\x8d\x4f\xd3"
+ "\xb2\x93\x64\xa0\xea\x14\x4d\x7b\x0b\x36\x45\xb9\xea\xb7\xe9\xcf"
+ "\x24\xe2\x38\x6d\x56\xea\x7e\x9b\xb6\x0c\xfd\x56\x95\xba\xdf\xa6"
+ "\x95\xf7\xdf\x6f\xd3\xea\xd1\x6f\x55\x97\xf7\xdb\xb4\x83\x57\x6f"
+ "\x53\x4c\xeb\x48\xec\xb3\x69\xc7\xae\xbe\xcf\xa6\x8f\x4d\xdd\x67"
+ "\xd3\xa7\xa5\xee\xb3\xe9\xba\x6f\xfa\xf4\xda\xc4\x3e\x9b\x5e\x92"
+ "\xd8\x67\xa0\xdb\xff\xb0\xcf\xd0\x3f\xa3\x94\x7f\xc2\xf4\x0b\x98"
+ "\xb7\x0f\xea\xf6\x4e\xef\x0c\xd2\x7d\x07\xd5\xdc\xfa\x3e\x35\x76"
+ "\xa8\x3e\x7c\x13\x79\x82\x97\x8f\x03\xf7\x59\xf4\xb4\xef\x5c\xde"
+ "\x0f\xf7\x8d\x82\x8e\xee\x6c\x2a\x95\x7b\x5b\xaa\x0f\x99\xe6\xc8"
+ "\xe7\xdf\xc8\xfb\x53\xf7\x4d\xe3\xb2\xe8\x63\x11\x88\x44\x89\xf5"
+ "\x3a\xf2\x87\x19\x0e\x9f\x0d\x4d\x82\x55\x7c\x35\x63\xfc\x15\x7c"
+ "\x6a\x46\xf9\xcb\x6e\x07\xbc\xfb\x9f\x55\xbc\x7a\x5f\xb2\xfd\xdb"
+ "\x88\x77\x8f\x28\x3e\x9d\x39\x3a\x09\x87\x70\x6a\x3e\xbd\x3f\x03"
+ "\x6d\x68\x4c\xcd\xa7\xf7\xbb\xfa\xe7\xd3\xfb\xd1\xff\xd4\x18\x37"
+ "\xf7\xc9\x5c\x1c\x0d\x26\xcd\x7d\xee\x2f\xb4\x86\x15\xef\x48\x9b"
+ "\xa8\xda\x39\xaa\xdb\x7b\x7f\xb2\xfd\x87\xbe\x99\x31\x44\xc7\x79"
+ "\x40\x52\xf9\x7e\xec\xbf\xfb\xd9\xfe\x7b\xb3\x1f\x9c\xaf\x60\xff"
+ "\xdd\xcf\xf6\xdf\x9b\x97\xcb\xd6\x0c\xdd\xfe\x4b\x35\xc7\x9b\x31"
+ "\x36\x75\xff\xcf\x48\xea\x7f\xca\x2b\xc1\x7c\x58\x96\x4f\xcc\x57"
+ "\x14\x9f\x8f\x7d\x93\x38\x2f\xf3\x48\x8a\xbc\x75\xc9\x30\xfb\xc9"
+ "\xe7\xbf\x8c\xf7\xd8\x97\x2a\x25\xef\xcd\xd0\xcf\x94\xcc\x9c\x96"
+ "\x28\x8f\x33\xcd\x89\xf2\x78\xff\xbe\xc4\x72\x33\x47\x25\xbe\xbf"
+ "\x2f\xfc\xbf\xa7\x63\x67\xd6\x26\xf1\xc0\xfb\xa7\xe8\x01\xbb\xe2"
+ "\x81\x07\x56\x26\xe1\xb1\x3f\x35\x0f\xcc\x6c\x42\xfb\xdf\x4f\xcd"
+ "\x03\x33\x83\xfd\xf3\xc0\xcc\x28\x68\xf9\x7e\x3c\xdf\xce\x2f\xcd"
+ "\x1d\x94\x98\xe7\x01\x67\x6a\x9d\xf7\x40\x4e\xea\x35\x82\x07\xe6"
+ "\x29\x1a\x3f\x50\x99\x48\xe3\x07\x0a\x13\x69\x88\xb6\xfc\xcf\x69"
+ "\xd8\x1b\x0f\xa2\xdb\xfb\x40\xb2\xfc\x07\x4e\xd1\xb7\x74\xf9\x9f"
+ "\xf5\x60\x12\x8e\x61\x85\x4b\xaa\x75\x91\x6f\xf1\xfc\x37\x90\x9a"
+ "\x96\xdf\x1a\x9b\xba\xcd\xdf\x9a\x86\x31\x28\xa0\x5d\x26\x4b\xdf"
+ "\xca\x47\xfa\x7c\x5e\x0f\xe5\xf5\x90\x06\xa4\xcf\x8f\x92\x45\x8e"
+ "\x57\xbd\xe3\xd2\xb7\xca\xd9\x17\x85\xe9\xcf\xfc\x6b\x1d\x41\xf3"
+ "\x78\x0c\x62\xbc\x0a\x4a\xa5\xdf\x82\x75\x2b\xf3\xfa\x4d\xcc\xeb"
+ "\xdf\x92\xf6\x1f\xef\xb3\xb0\x1f\xa1\xd5\x4d\xf3\x38\x2e\x85\xc1"
+ "\xef\x9c\x3f\x09\xf6\x09\x96\x0b\xce\x6f\xe4\x55\xeb\x66\xe5\x49"
+ "\xba\x69\x96\x39\x75\x1f\xcf\x1a\xd1\x3f\xef\xcc\xca\x51\xfd\x3c"
+ "\xab\x28\xb1\x9f\x67\xcd\xd3\xbc\x43\x17\x70\x5b\xc1\x03\x57\x25"
+ "\x27\x25\x4e\xd1\x9f\x6f\x85\x59\x54\x2c\x64\xdf\xe0\x2f\x9d\xa6"
+ "\x59\xc7\x65\x7d\x26\x11\xb1\x6e\x49\xa3\x26\xa9\x03\x66\xdf\x22"
+ "\xf1\x44\x9e\x82\x28\x99\x44\xc5\x93\x6d\xfc\xae\xd1\x2b\x22\xc8"
+ "\x77\x8c\xf7\x04\xf8\x6c\x35\x78\x61\xd8\x49\x9a\x75\x26\xa1\x3c"
+ "\x24\x3f\xa0\x60\xb8\x1a\xa5\x3c\xce\x1e\x65\xac\xe9\x6e\xc5\x73"
+ "\xea\x75\xdf\xd9\x33\x0c\xdf\x07\xe5\x33\x36\xbb\xdf\xfd\x4b\xc6"
+ "\x89\xcf\xca\x30\x4e\x57\xd6\x03\xb3\xeb\x0d\xfe\x55\xbe\x96\xb3"
+ "\xf7\xf7\xf9\xf2\xcd\x3e\x84\x77\x4b\xae\xb0\x36\x18\x27\x07\xb3"
+ "\xdb\xe3\xe1\xa8\x98\x28\xb3\x23\x86\x3f\x5e\xb7\x77\x8e\xf9\x33"
+ "\x60\xe9\xf8\xcc\x19\x9b\x88\xcf\x9c\x49\xb0\x53\xb2\x74\x18\x33"
+ "\xae\x04\x83\xfb\x5c\xf1\x2c\xf3\xc3\x9c\x25\x57\x5a\xf3\x4b\x77"
+ "\xd0\xbc\x17\x2f\xe3\xad\x39\xd2\x5e\x62\x18\x9f\x81\xe3\xb1\x84"
+ "\xb9\x85\xdc\xbb\xe7\xbd\xad\xb9\xbb\x95\xdc\xcf\x4d\x5a\x23\x9c"
+ "\xd3\x29\xfd\xa9\x74\xb9\x5f\x1c\x4d\x96\x83\xb9\x19\xc6\x18\x9d"
+ "\x94\x3e\xca\x90\x7b\xcc\x6b\x19\x6e\xd2\x3a\xeb\xdc\x69\x4a\x16"
+ "\xe6\xd6\x6b\xf6\xf8\xf9\xda\x5c\x69\xff\x19\xeb\xa5\x78\x3f\x2d"
+ "\xa9\x5c\xd2\xfa\xdf\x9c\x4e\xd1\xff\x3a\x7d\x06\xfa\x37\xcc\x7b"
+ "\x5b\x2a\x56\xc3\xdc\xe6\xa4\xf5\x8a\xd0\x0e\x79\xfe\xfe\xcf\x80"
+ "\x3b\x4f\xd7\x7b\x0f\x4e\x49\xaa\xaf\xd3\x73\xe6\x4a\xed\x9f\xd7"
+ "\x4f\xfb\xe7\xf5\xb5\x7f\x95\x84\x9b\xb4\x96\x38\x4f\xb6\x3f\x76"
+ "\x99\xfe\x9b\xc7\x3e\xa4\x06\xdd\x60\x73\xcf\x7b\xdb\xb0\xd5\x79"
+ "\xfd\xa0\x7f\x5b\x7d\x5e\xdf\xfa\x9f\x2a\xd7\xb7\xfe\x17\x4a\x65"
+ "\xab\x07\x49\xee\xad\x26\xd6\xdd\x66\xad\x4f\xd9\x96\x7e\xd6\xff"
+ "\x1e\xd4\xd7\xff\x1e\x5c\x92\xa8\xcf\x1e\x74\x26\xf6\xe1\xbc\xa4"
+ "\x3e\x7c\x30\x37\xb1\x0f\xe7\x76\xfe\x77\xc7\x35\x3c\x53\x7a\x7a"
+ "\xba\x29\x3d\xcd\x94\x96\x8e\xd7\x68\x22\x0d\x4a\x37\xa7\x0f\xc0"
+ "\x6f\xa0\x7e\x1d\x64\x4a\x37\x99\xf1\x1b\xa0\x5f\x07\x26\x3d\x0f"
+ "\xe2\xb2\xf8\x99\xf5\xeb\x80\xa4\xe7\x81\x9f\xf1\x7e\x90\x5e\xaf"
+ "\x51\xbf\x39\xe9\x79\xc0\x67\xbc\x1f\xf8\x3f\x2c\x4f\x97\x3d\x27"
+ "\xfa\xa1\xcd\x5c\xb5\x6e\x69\xd1\xca\x65\x72\xbf\x78\xb9\x73\xe9"
+ "\xe3\x8f\x2f\x5f\xbb\xd6\x59\xb2\xda\x79\xef\x94\x87\x6e\xbf\xcb"
+ "\xa9\xb6\x9d\x8b\x26\x8f\x5e\x36\x98\x66\xaf\x5f\xc3\x2f\x66\xcf"
+ "\x9f\x99\xe7\x9c\x77\xef\x94\xc4\x97\x06\x18\xb9\xbd\x7c\x25\x28"
+ "\x71\xf2\x97\xfb\xfc\x70\xa2\x6d\x2f\x4b\xdd\xd3\xce\x7e\xbe\x6a"
+ "\xcd\xe3\x3b\x1f\x34\xb3\xff\xe8\x25\x8f\xf0\xdf\xc4\x7b\xfa\xf3"
+ "\x97\x73\x23\xc6\xed\x29\xa7\xe2\xc7\xf8\xfc\xca\xfc\x2d\xe2\xd7"
+ "\x21\x72\x3e\x40\xa6\x93\x94\xff\x87\xa6\x19\xc8\x8b\xe7\x40\x30"
+ "\x4a\x4e\x0f\x59\x50\xfe\x69\xbc\x4b\x13\x77\x6b\x48\x0b\xeb\xbe"
+ "\xd0\xdf\xde\x22\xd3\x7e\x5d\x6e\xe4\xb3\x9e\xa2\x05\xa3\xc5\xaf"
+ "\x85\x7c\xe6\xf3\x41\x2a\xdf\xfc\x4f\x85\xe9\xa1\x43\xac\x1b\xea"
+ "\x33\xc9\xcc\x7b\xa1\xaf\x66\x92\xe5\xd5\xe1\x1c\xb3\x64\x7e\xa7"
+ "\xb1\x17\xfa\x3c\x9e\x83\x94\x7f\x8c\xeb\xe6\xbc\x9a\xe9\xa1\x93"
+ "\x9c\xbf\x21\x21\xff\x82\x11\x7d\x7b\xb1\xf3\x3b\x4d\xc8\x37\xf7"
+ "\x63\xb2\x5a\x63\xe2\x9f\x91\x4c\x07\x8d\x9f\x41\x69\x01\x74\x45"
+ "\x73\xb4\x9c\x94\xcf\xcf\x82\xe5\x1b\x62\x22\xca\xfe\xe9\xb3\x3b"
+ "\x3d\xa2\xea\x29\x32\x43\xa6\xd3\xfc\x6b\xd8\x47\x61\xc1\xac\xc6"
+ "\xe5\x64\x46\xfb\x47\x9c\xa6\x87\x4b\x9d\x73\x88\x3c\xb3\xc9\xfc"
+ "\x3b\x37\xfb\x1b\x3a\x1b\x76\xfc\x91\xcc\x3f\xb9\x54\x6e\xba\x24"
+ "\x1c\x54\x5a\x22\x3a\x04\xc7\x31\x0a\x8b\x08\xfb\xf8\x37\x2f\x89"
+ "\x71\x9e\x1d\xdd\x1e\x07\xb5\x96\x84\x69\xf3\x09\x11\xa9\xfc\xa3"
+ "\x3a\x1b\xd0\xd2\x19\x66\xff\x45\xcb\xe6\xd9\x94\x7e\x2a\x8f\x4c"
+ "\x2d\x85\x75\x14\xc8\x0f\x53\xe9\x09\xd1\xd1\xbc\xe4\x13\x6a\x2d"
+ "\x3c\x40\x05\x6d\x64\x6a\x6e\xff\x88\x64\x2c\x9e\x9a\xca\x79\x65"
+ "\x17\xc8\xb1\x79\x25\xa7\x5d\xa0\x8d\x9b\x69\xc8\xc6\x3f\x91\x35"
+ "\xd0\xd1\x86\x7a\xce\xd0\xa3\xc7\x29\x0d\xf0\x4c\x9b\x3e\x22\xc7"
+ "\xa6\x47\xd8\xcf\x37\x97\xea\xcb\xc8\x21\x3c\xae\x8c\x4b\x1e\x97"
+ "\xed\x92\x70\x65\x76\x7b\x5c\x59\xad\xc5\xc8\xdf\xfe\x1e\x0d\x6d"
+ "\xa3\xac\x5f\x9f\x6e\x33\xd5\x9d\xa7\x11\xdc\xa6\x53\x68\x5b\xfd"
+ "\x79\xe4\xaf\x59\x74\x4c\x43\xd9\xf8\x32\x51\xfb\xa2\x8e\x40\x5e"
+ "\x84\x34\xc0\xaa\xbb\x44\x23\xea\x2f\x91\x43\xab\x5e\x74\x8c\xcb"
+ "\x75\xd2\xb7\x37\x04\x9a\x89\x4a\x37\x8b\x58\x4f\x8d\x93\xd7\xcb"
+ "\x06\xbd\xf9\xd8\x21\x73\xa0\xb9\x93\x5a\xc2\x97\xa8\x95\xfe\x4c"
+ "\x01\xf7\xdf\xfd\x3f\x79\xec\x10\xaf\x59\xa7\xf9\x37\xb6\xa3\x2e"
+ "\xc5\x3b\x9e\x16\x3e\xab\x5c\x4e\x55\x65\x94\x51\xbc\x91\x06\x9d"
+ "\x46\xba\x9a\xdb\x0f\xb3\x04\xa2\x7f\xf7\x6f\x94\xfe\xb8\xf9\xc7"
+ "\xca\x5a\x28\xbd\x35\x5c\xc7\x7e\x9f\xa6\x58\x66\x25\x6c\xbf\x63"
+ "\x14\x28\xfe\xab\x5f\xb3\x55\xe6\x6c\xd3\xc8\xf2\xd3\x8b\xc7\x4c"
+ "\x01\xf3\x45\x0a\xe4\x85\xe9\x7d\xd4\x2d\x6a\x2a\xf3\xa1\xb7\x72"
+ "\x5b\xc3\x11\x3e\xef\x94\x2d\xba\x1c\x83\xab\xd6\xd0\xd8\x86\xf3"
+ "\x34\x6a\xf7\x79\x72\x89\x6e\x97\x89\x7d\x6c\xf9\x6c\xea\x6e\x5c"
+ "\x33\xda\xc9\x82\xb6\x2b\x3f\x5a\xbb\xee\x6b\xdb\xe3\xa2\xc6\x4b"
+ "\x7d\xbe\xb6\x97\xba\xfa\x7c\x6d\xc1\x53\x21\xf6\xb7\x0d\xd2\xc3"
+ "\x5b\xad\xcd\x34\x08\x72\xb2\x8f\xf9\xbb\xea\x2c\x99\x2b\xce\x12"
+ "\x8d\x2f\x37\x91\x73\x05\x9f\xb3\xf8\xce\xf2\x00\xfa\x86\xef\x4f"
+ "\xd2\x77\x46\xe0\x9a\x81\x5f\x1a\xd2\x65\xfc\x86\x76\x9d\x8f\x91"
+ "\x66\x42\xda\x00\x5c\xd3\x21\x2f\x31\x4f\xbd\x08\xa1\xae\xbc\x2e"
+ "\x13\x0d\x66\x7e\xd6\xfd\x7b\xf3\xba\xbd\xdf\x0e\x07\xe9\xa9\x4e"
+ "\x83\xaf\x95\x8e\x9f\x1f\x7a\xff\xe4\x19\x8e\x97\x15\x92\x78\xf5"
+ "\x14\xa6\x71\xec\x2c\x3d\x9d\x71\x58\xc4\xf5\xa2\xfe\x5c\x5c\xad"
+ "\xf8\x41\x4e\xbf\x7d\xdc\x28\xdb\xd5\x53\x88\x3a\xbf\xf3\x30\xd2"
+ "\x85\x91\x8e\x76\x9b\xf9\xdd\x2f\x4e\x9e\x31\xa9\x3c\x2e\x13\x60"
+ "\x46\x74\xf8\x90\xfd\xf9\xb5\x2c\xe3\x5d\x26\xab\x38\xb2\x64\x22"
+ "\xd5\xbf\x2c\x9a\x77\xbf\x2c\x9a\x94\xec\x7d\xa7\x2e\x48\xab\x7d"
+ "\x8c\x23\xc6\xf1\xa6\x6d\x78\x77\x04\xa3\x0e\xd3\xa5\x69\x19\xfb"
+ "\x93\x7d\x07\xf6\xdf\xb5\x87\xe3\xdb\x20\xbc\x0f\xd6\xf1\x58\xfa"
+ "\xb3\xb2\xa3\x03\xa0\x03\xea\x5a\xdb\x3b\xe9\x27\x97\x3a\x06\x78"
+ "\x7e\x4b\xa6\x40\xf4\x24\x4d\xc8\x22\x07\xdb\x83\x8d\x2f\x8b\xe0"
+ "\x8b\x1c\x9f\xef\x65\xd1\x09\x7e\xb9\xf1\x34\xe5\x0d\xf8\x6a\x16"
+ "\x65\xfd\xde\x4d\xba\x7e\xca\xbb\x31\x4e\x3f\xbd\xd1\x12\x3c\x14"
+ "\xa7\x9b\xf2\x1f\xbe\x5c\x37\x2d\x7c\x50\xe9\x26\xc8\xbe\xd4\x45"
+ "\xb1\xa0\x9e\x3e\x39\x29\x5d\xf7\x13\x59\x38\x32\x29\x3d\xa2\xa7"
+ "\x0f\x49\x4a\x0f\xa9\xf4\x47\x67\x1b\xba\xaf\x95\xf1\x58\xcf\xba"
+ "\xef\xd1\xdb\x58\xf7\xb5\x2e\xd1\x75\x9f\xd4\x3f\x8f\x5e\x27\xfe"
+ "\x0d\xba\x68\x1d\xeb\x9b\x47\xce\x30\xfe\xe2\xd7\x64\xe0\x7e\x0d"
+ "\xd2\x7e\xca\x69\xbe\x3f\x93\x19\x3f\x43\xef\x09\xd6\x7b\xac\xf3"
+ "\x58\xf7\xed\x1a\x2e\xda\x76\xbd\x2c\x8e\xd7\xcb\xd8\x3f\x8f\xf4"
+ "\xea\xbf\x17\x90\xb6\x0d\x69\x2f\xe0\x3d\xeb\x41\xa6\x49\x4b\xde"
+ "\x21\x62\xff\x13\xd8\x5a\xf5\x9a\x29\x9b\x76\xa0\xbf\xf9\xbc\xe1"
+ "\x56\xd0\xd7\x9a\x46\xc5\x81\x12\x3e\xc3\x1a\x63\x9f\xb4\xf6\xd6"
+ "\x92\x76\x96\xbb\xe1\x15\x90\xb3\x80\xfb\x13\x2a\x0b\x8b\xd3\x7c"
+ "\xee\x8e\x71\x28\xd8\xf0\x00\xc7\x4b\x4a\x6b\xc2\x6c\x98\xfd\xc2"
+ "\x59\x67\x03\x17\xb3\x0f\x38\xa9\xf8\x2c\x8f\xec\x0d\xd2\xde\x72"
+ "\xd5\xd7\xf9\xc7\x38\x2e\xdb\x49\xca\xeb\xc0\x7c\x2f\xc2\x6d\xb3"
+ "\xc6\xca\x89\xcf\xc1\x70\xac\x42\xbe\xee\x32\x69\x85\x3e\xe3\x2c"
+ "\x8c\x17\xba\x01\x79\x02\x6d\x11\x62\x9c\x83\xf4\xc8\xc4\x96\xd2"
+ "\x43\x5c\xbe\x8d\x69\x23\xbc\x1e\x03\x46\x9a\x84\x61\x92\xf3\xc6"
+ "\x42\xe4\x53\x6b\xe7\x99\x4e\x6a\xc9\x0f\x11\xeb\xfd\x40\x07\x60"
+ "\x94\x9e\x54\x30\x00\x4b\x60\x0c\x48\x78\xa7\xc3\x1f\xb2\x59\xfc"
+ "\x13\xf0\xf7\x72\x7f\xf1\xb9\x48\xde\x6f\x03\x5d\x32\xd8\x57\x5e"
+ "\xd9\xa2\x8f\x8c\x6b\xfc\x33\x91\x7e\xb6\x13\xfc\xf6\xc8\x58\x3e"
+ "\xb7\xc4\xe7\x39\xaf\x74\x96\x13\x34\x1a\x65\x9c\xe7\xd4\xd6\xff"
+ "\xef\x9e\xe5\x04\x6c\x47\x83\x49\x1c\x00\xfe\x63\xf9\x3c\x27\xf0"
+ "\xdf\xc6\x7c\xa8\xb7\x29\xfb\xa5\x47\x25\xcd\x4b\x38\x0d\x73\xc7"
+ "\xa3\x46\xff\x73\x7b\xb9\x2d\x78\x97\xa7\x6c\x44\x81\xf9\xc7\xc2"
+ "\x6c\x7e\x8f\xb4\x69\x9c\x7f\x02\xf4\x58\x00\x63\xd8\x9b\x27\x63"
+ "\xa6\xaa\x8d\x64\x56\x3a\x2d\x7f\x26\x97\x57\x3a\x2d\x9f\xfa\x74"
+ "\xda\xc2\x0b\x4a\xa7\x29\x1a\x2b\x9d\xb6\xf0\x1f\x4a\xa7\x2d\xfc"
+ "\x58\xee\x8b\x41\xa7\xf1\x3b\xd6\x6b\x86\x4e\xdb\x3d\x5c\x1c\x65"
+ "\xdd\xd1\xed\x5d\x78\xcc\xd0\x6d\xdb\x91\xc6\xba\x83\x71\x54\x7a"
+ "\xea\x51\x97\xf8\x7f\x5d\xa4\xfc\x0e\xf8\xbe\x90\xcf\x2f\x74\xe8"
+ "\xf7\x3c\x9e\x4c\x51\x3a\x2e\x7f\x54\x9f\x8e\x5b\xb8\xaf\xaf\x2c"
+ "\xeb\xb8\xfc\x3b\x95\x8e\x53\xe9\x8d\x8f\xb2\x8e\x7b\xd4\xc5\x34"
+ "\xd0\xe1\x9b\x78\x0d\x4f\xcf\xcf\x74\xcc\x8e\xd7\x71\x89\xf2\x95"
+ "\x5f\x6a\xe8\x38\xd6\x6d\x78\xde\x06\x9d\x26\xe7\x90\x2c\x67\xb5"
+ "\xa0\xb9\x21\x77\xdc\x07\xdc\x66\x8e\xbf\xc6\x74\x9b\x7a\x86\x06"
+ "\xe9\x67\x87\xf4\x76\xe7\x1f\x35\x7c\x1f\x41\xff\x63\xa9\xec\xe8"
+ "\xbe\x18\x89\xf4\x65\x3e\x3b\x1f\x28\x3f\x49\x81\x3a\x51\xde\x1a"
+ "\x3d\x41\x05\x25\xd0\x15\xe9\x4f\x7e\xcc\x7d\x8b\x79\xc7\x37\xf9"
+ "\xca\xba\xe7\x34\x2d\x1a\x52\x10\xa6\x81\x98\xab\x7f\x5c\x65\xc2"
+ "\x3b\x77\xc2\x3b\xb9\xc6\x30\x7e\x0d\xc7\xd7\x83\x20\xf4\x33\xdf"
+ "\xbf\xca\xfa\x36\x5f\xa1\xbe\x57\x65\x7d\xb0\xa9\x30\x07\xb2\x9f"
+ "\xa5\x45\x72\x5e\x22\xe3\xdb\x54\xa4\x84\xf5\x5b\xfd\xfd\x80\x7e"
+ "\xde\xff\xe3\xca\xe5\x17\x5f\x73\xe5\xf2\x8b\x6f\x61\x5d\x84\xf6"
+ "\x59\x63\xde\x44\x38\x43\xa3\x46\xbe\xd3\x9c\xef\x41\x7d\x2d\xe6"
+ "\x63\xcf\x48\x39\x47\x73\x18\x30\x99\xff\x76\x20\x9f\x8c\x19\x02"
+ "\x5d\x39\x6d\x03\x71\xbc\x96\xf8\xb2\xdb\xfb\x68\xbc\x38\xf7\x0a"
+ "\xeb\x7e\x19\x81\x3a\x92\x31\x63\x8f\xc0\x26\xe5\x98\x46\xb5\xbd"
+ "\xeb\x1f\x8b\xdb\xa1\x37\x83\x71\x7e\xb1\x3c\x1f\xfb\x32\xc7\x35"
+ "\x60\xfb\xb2\x4a\xcd\x37\xaf\x87\x7e\xce\xe4\xf3\x30\x7c\x36\xa6"
+ "\x20\x36\xcf\x74\x44\xc6\x32\x2b\x70\x1a\x65\xfb\x5b\x67\xe1\x7a"
+ "\xf5\x3a\xd9\xc7\x34\x8c\x32\x0b\x8c\x32\x0c\x9b\xfd\x14\x31\x2e"
+ "\x7f\x59\x9e\x29\x8d\x76\xb2\x2e\xbc\x1e\xb6\x68\xa6\xaa\x67\x09"
+ "\xe9\xf5\x54\x06\x69\xd1\xbc\x2b\x9d\xcd\xe8\xbf\x7d\x05\x4d\x57"
+ "\xdf\x3e\xd2\xdb\xb7\x84\x3e\xa3\x7d\x57\xa8\x77\xc9\xa4\xab\xaf"
+ "\xd7\x66\xd4\xeb\xbe\x7a\xba\x2e\xd9\xff\xf9\xe9\x9a\xad\xd3\x75"
+ "\x49\xf0\x33\xe8\x9a\xa2\x9e\xa5\x59\x9f\xbf\x1e\xa7\x5e\xcf\xd2"
+ "\x19\xa9\xea\x21\xf9\xd7\xef\xb9\x29\x8b\x11\x6b\xb3\x0b\xb2\xa3"
+ "\x62\xd5\x2d\xf5\xc5\xc7\x2f\xee\x92\x72\xb5\x74\x6f\x6f\xbc\x64"
+ "\xb5\x57\x0e\x5d\xbd\xf4\x83\x82\x3d\x3c\xbe\x0b\x2d\x48\x4b\x9b"
+ "\x38\x8e\xeb\xb4\xcd\xea\x4c\xb6\x5e\xa6\xed\x4a\x71\x93\x39\x46"
+ "\x17\xc7\xe4\x0b\x38\xd0\xf6\x3a\x8e\x5d\x92\x7f\x80\xfd\xef\x31"
+ "\xa7\x82\x8e\x7f\xec\x46\x8e\x39\x86\xfb\x41\xb8\x77\x29\x1d\xf0"
+ "\x98\x0b\xf5\xf4\x7f\x76\xb2\x26\xdf\xbf\xb7\x2c\x7b\x40\x7f\xfe"
+ "\xf5\x28\x0f\x9b\xe2\x69\xb9\x36\xa5\x65\xde\x6a\xc1\x5c\x42\x8f"
+ "\xf7\xb7\xec\x13\x19\x03\xce\x93\xc7\xe7\x49\x30\x2e\x2e\x1b\xa2"
+ "\x9f\x03\x00\x3d\xca\x41\xd7\xc7\xf6\x18\xf4\x30\xd2\x91\x76\xd0"
+ "\xa0\x07\xec\x9b\x8c\xc0\x9e\x28\x9f\xd3\x09\xab\x33\xd9\x8f\xfd"
+ "\xa7\xa8\xce\x3f\xa4\x60\x3f\xae\xf6\x68\xb8\xbe\x9e\x3c\xb3\x9c"
+ "\x37\x95\xf1\xbc\xe9\xf1\xc3\x21\x7b\xfe\x21\x03\x0f\xb1\xd6\x61"
+ "\xe2\xb3\xdf\x13\x30\x96\xee\x50\x31\xf7\xd2\xf8\x9c\x9c\x7c\xbf"
+ "\xd6\x65\x52\x34\x79\x7c\xb2\xe8\xe2\xd8\x31\x12\x76\x06\xf0\x6c"
+ "\x67\xb8\x41\x5c\x43\x9b\x5c\x1c\xf7\x42\x6f\xcf\xe3\xa3\xb5\x9a"
+ "\x5b\x2d\x5a\xb7\xc3\x64\xe0\xdb\x20\xcf\xb4\x3e\x8e\xf6\x2f\x51"
+ "\x71\x62\x25\x3e\x0e\x13\xfb\xf3\x6b\x99\xf9\x7e\xb1\xc9\x41\x07"
+ "\xd7\x74\xc8\x39\x11\xd7\x39\x01\xf5\x0b\x9e\x27\xc1\x36\x41\xb9"
+ "\x3d\xbd\x74\x03\x5c\xd1\x6d\xd0\xed\xf1\x59\x6a\x5c\x56\x6d\x0c"
+ "\x6f\x72\x98\x8e\x84\xe4\x79\x3b\x1a\xe5\xf4\x7c\xaa\x62\x61\x3f"
+ "\x7e\xc2\xa0\x5d\x2f\x4e\xc0\x87\xf3\x28\xff\xa6\xc7\xa3\x06\x4e"
+ "\x52\x76\x33\xf9\xfc\xee\x63\x21\x3e\x37\xa4\xe8\x7f\x24\xa3\xdb"
+ "\xbb\xcc\x79\x39\xfd\x97\x4d\x8c\xa3\x7f\x3a\xf3\x1e\xd3\x9f\xd7"
+ "\x3a\x40\x97\x45\xa0\xa5\x45\x9d\x77\x60\x7b\x66\xd9\x72\x3c\x67"
+ "\x30\x9e\x5a\xb5\x41\xf3\x3c\xb3\x5a\x27\x5b\x56\x17\xd7\x0f\x68"
+ "\xaf\x83\x6d\xb5\x34\xa3\xfd\x5c\x86\x69\xc0\x71\x25\xb9\x6e\xe0"
+ "\x73\x2d\xea\x3e\x90\xdc\xa6\x0a\x75\x96\x84\x94\x6f\xc9\xb2\x63"
+ "\x71\xb1\xc5\x43\x25\x4e\x11\x51\xe7\x92\x97\xb9\x0f\x96\x85\xcc"
+ "\xfd\xe9\x00\xe6\x41\x19\xa3\xd2\x24\xd7\x15\x60\x73\xad\xf8\x50"
+ "\x00\x37\xd5\xf7\x2b\x76\xab\xb4\xe5\xff\xc0\x15\x3c\xb6\x7c\x8a"
+ "\x40\xdd\x21\x8f\x8c\xb1\x82\xb6\xad\x08\x32\xcf\x19\x7c\xc6\xeb"
+ "\x90\xca\x67\x7c\xf9\x1b\xac\x53\x0c\x9a\x03\xff\xc1\xdd\xde\xe5"
+ "\xc5\x06\xfe\x46\x7e\xee\x3b\xce\xc3\x7b\x36\x4d\xce\x88\xd4\xb5"
+ "\xea\xcc\xd0\xf2\x7a\x43\x86\xb9\x0e\xee\x67\xd6\x35\x4c\x0f\x45"
+ "\x8b\xe5\x87\x13\x61\x39\x4c\x2a\x6e\x26\xf3\x3c\xe4\x71\x63\x64"
+ "\x00\xf2\x04\xfb\x60\x2c\xcf\x57\xef\x7a\xf1\x64\x3f\x7f\xe9\x8b"
+ "\xa7\xfa\x63\xc5\x4c\x6e\x57\x1f\xbe\x2c\x7f\x2b\x7a\xfb\x9f\xdf"
+ "\x85\x3d\x0e\x8e\xc1\x2b\x75\x4c\xc9\x48\xc6\x37\xc4\xb1\x6d\x25"
+ "\xaf\x03\xbe\x8f\x71\xe7\x3c\x46\x9f\xf5\xf1\xe2\x8a\xc2\x78\x38"
+ "\xc2\x23\x71\x95\x70\x94\xee\x08\xf1\xde\xb6\x53\xed\xb7\xac\xa8"
+ "\x8d\x6b\x77\x86\x81\x4f\x9f\x4e\x58\x71\x30\x99\x27\xb9\x6e\x8e"
+ "\xc5\xa7\xc3\x66\x5d\x62\x3b\x49\x2b\xf6\xe8\x78\x39\xb8\x1f\xfb"
+ "\x1b\xdf\x38\xce\x25\xc7\x3e\x7d\x51\xe9\x10\xf4\x73\xe1\xc8\x17"
+ "\xd5\x39\xa2\xb0\x8a\x7f\xfa\xdd\xd1\xc2\xf4\x1a\xd3\x8a\xd7\xd3"
+ "\x43\x32\x5e\x87\x3c\x63\xfe\x5d\xde\xe3\x17\x43\x8b\x5f\x93\xb1"
+ "\x6e\x75\xdf\xc0\x50\x53\x71\x54\xc6\xf2\xf3\x94\xf0\x99\xdb\x28"
+ "\xcf\xf5\xa4\xef\xdb\x91\x92\x28\xcd\x8f\xb0\x4c\x7c\xb7\x84\xcf"
+ "\xd2\xab\x38\xe2\xdf\x2d\x37\xce\xcf\x73\xec\x4c\x8e\xfb\x0a\x3d"
+ "\x94\xde\x17\xb7\xb5\x30\x8f\x6d\x2c\xbd\x7f\x69\x87\x49\x1c\x53"
+ "\xf2\xff\xdd\xdf\xf2\x79\x79\xb5\x8f\x75\x12\x3a\x21\xfd\xef\x27"
+ "\xe9\xbb\x1f\xab\x75\x1f\x43\x47\x15\x3e\xc2\x7b\x59\x41\x1d\x06"
+ "\xea\xea\x84\x7c\xcf\xbb\x5c\x97\x7c\xf7\xb7\xc6\xdc\x85\xcf\xdf"
+ "\xa9\x7d\xb1\x3e\x78\x41\xfa\xae\x9c\x0b\xf6\xf5\xc1\x6f\x00\xab"
+ "\x30\xe7\x72\xbd\x50\x38\xcb\x90\xbd\xe2\x9b\xf8\x0c\xf7\x77\x6d"
+ "\x5c\x7f\x7f\xe3\x85\xf0\x3c\xc2\xfd\x64\x39\xe5\x4c\xdd\x37\xa9"
+ "\xf7\xd9\x0a\x0f\x18\x6d\x30\x68\xa2\xda\xb0\xf2\x9a\xae\x4c\xe7"
+ "\xd8\xbe\xb6\xaf\x94\xb6\x6b\xdc\xfb\x29\x71\xb4\xe1\xe7\x5c\x35"
+ "\xae\xad\x04\x7d\x96\xe9\xb1\x6a\x55\x1a\x64\xe7\x57\x62\x53\x1e"
+ "\x29\x1c\x57\x92\x21\xeb\xc8\x3b\x36\x48\x17\x1c\x6a\xbf\x6b\x25"
+ "\xda\x5f\x58\xa9\xca\x15\x1e\x67\x5c\x52\xb6\x33\x11\xc7\x43\x6c"
+ "\x6b\xa8\x98\x0a\x2b\xdf\x65\x7c\x9d\x63\xb8\x8f\x57\x3e\x2b\x75"
+ "\x38\xc7\x57\xe8\x29\x1c\x10\xee\x71\x51\x57\x4f\x21\xf4\x82\xcb"
+ "\x84\x7a\xa0\xff\xbb\xc2\x7a\x9d\xfb\x0d\x5c\x19\x37\x19\x9f\x53"
+ "\xac\x4c\x4d\x5f\xae\x57\xc6\x7c\x2a\x1c\x84\x1f\x70\x28\x1c\xf8"
+ "\x79\xed\x12\xd8\xe9\x1d\xa1\xea\x31\x07\xb4\x75\xe2\x28\xc7\x17"
+ "\xc3\x5c\xa4\xa3\x0a\xfc\x3b\x74\x8b\x1f\xb6\xf9\x22\x53\xc1\x06"
+ "\xca\xc5\x9c\x99\xc4\x45\x91\xd3\xa0\xe1\xba\x4e\x4c\xe4\x38\xe3"
+ "\x78\xce\xd6\x9f\xc7\xf2\x73\xd7\x3a\x91\xdf\xed\x7d\x62\x89\xb1"
+ "\x47\xa8\x62\xe3\x3c\x51\xdc\x1b\x4f\x28\x7d\x21\x9f\x27\xe2\xb8"
+ "\x53\x1a\xe6\x42\x1d\x5c\x6f\x01\xcf\x67\x51\x1f\xf2\xd5\xc1\xde"
+ "\x68\xe7\x7c\xa1\xf4\x5b\x33\xf1\x73\xf5\xb3\x97\xda\xc1\x78\x75"
+ "\xd9\xc7\x1c\x30\x70\x1d\x1a\xce\x35\x7d\x4e\xdc\xa2\x06\x6e\x48"
+ "\x3f\x5a\xa5\xd2\xa3\x1c\xff\x90\x7d\x1d\xbb\xbd\x4f\x8e\x30\x70"
+ "\x35\x70\xe0\xfa\xf8\xfc\xa6\xc8\x74\xe6\x70\xec\x19\xae\x8f\xe3"
+ "\xa9\x22\xef\x0c\x03\xdf\xcf\xcb\xcb\x65\xf5\x42\xf0\xf8\xc9\xfa"
+ "\xd7\x79\x03\x51\x6b\x98\x75\xca\x93\xf5\x47\xea\xc3\xbc\xde\x7d"
+ "\x17\xea\xb8\xb3\x4b\x14\x92\xd6\x53\x98\xb2\x8f\xb9\x0c\xf2\xb7"
+ "\x49\xfd\x50\xe3\xbc\x53\x13\x33\xa0\x27\x50\xae\x67\x06\xaf\x35"
+ "\x41\x6e\x8b\xcc\x4d\xa5\x1d\x7c\xe6\x12\x3a\xa7\xc8\x8c\x3c\x39"
+ "\x6c\x67\x61\xbe\x15\x91\xdf\xaf\x80\x6e\xf2\xaf\x9b\x08\x18\x45"
+ "\x03\xcc\x6e\x32\x37\x25\xc5\xa9\xea\x8f\x3f\xba\x6c\xb7\xe6\x76"
+ "\xd5\xdc\x8a\x39\x5c\x11\xec\xff\xa7\xfa\xdd\xf3\xad\x18\x0e\x7a"
+ "\x22\x9f\xef\x06\x9e\xef\x15\x15\x5e\x29\xaf\xb1\x5f\xcd\x3a\x68"
+ "\x82\x83\x32\x84\xfd\xd6\x5c\xd6\xb7\x5d\x99\xb7\x3a\x78\x2c\x41"
+ "\xf9\x7d\x46\x79\x1e\xd7\x79\xec\x40\x7f\x39\xaa\x7a\xf5\x61\xd1"
+ "\x31\x25\xcf\x45\xc7\x0c\x19\x4d\x55\x4f\xc9\x5e\xa1\x79\x46\x93"
+ "\x29\x80\x71\x6b\x7c\x84\x32\x1a\x76\x12\xf9\x36\x8a\xc8\x8b\x1b"
+ "\x31\x87\xb9\x81\xbf\x77\x51\x34\x83\x65\x94\xf9\x7b\x07\xf8\x25"
+ "\x1d\xb8\xbc\x78\x11\x75\x96\xa9\x7c\xba\xdf\xba\x03\xf9\x4a\x70"
+ "\xcd\x12\x26\x13\xd5\x96\x91\xa5\x56\x23\xb3\xaf\x8c\x46\x20\x0d"
+ "\xb6\xee\x53\x0b\x0c\x99\x4d\x85\x43\x55\x03\x51\x0d\xea\xdd\x52"
+ "\x26\xa2\xbf\xc1\x78\xee\xd5\x44\xe4\xf3\xd0\x1d\xed\x3f\xa8\xda"
+ "\xf8\xd4\x41\xc3\x26\xc4\xbd\x3f\xd1\xef\xe0\xa9\xcb\xce\x78\x3f"
+ "\xb6\x7a\x75\x49\xc1\x9a\xe5\x7c\x71\x8d\x7e\xe6\x96\xc1\xf1\x6b"
+ "\x21\x3c\xfe\xa9\x38\x15\x4f\xb5\xf1\xba\xe3\x8b\x99\xc6\x3e\xfa"
+ "\x2a\x87\xb1\xf6\xa9\xfb\xeb\xdf\xc3\x73\x3a\x9e\xfb\xe0\xdd\xc4"
+ "\x0f\x4a\x37\x33\x98\xb4\x8f\x2d\x64\x4a\xae\x6f\xc5\xd2\x92\xa5"
+ "\x45\x77\xf1\x8e\xd9\xe0\x14\xf5\xac\x9a\x91\x54\x4f\x79\x6f\x3d"
+ "\x6a\xfc\x09\x9b\x38\x5f\x75\x43\x48\xd8\x2b\x7c\xea\xac\xf4\xaa"
+ "\xbd\xc6\x9a\x56\x3f\x7e\x8e\xee\x58\xcd\x62\x1b\xcb\x83\x67\x33"
+ "\x99\x7e\xb1\xb1\xcd\xc4\x76\x64\x19\xee\x79\x6d\x41\xae\x91\xe9"
+ "\xf1\xa2\x7e\x7d\xbe\x0d\xe3\xfb\xaa\x88\xa8\x76\x62\xfe\xb9\xaa"
+ "\xdf\x35\x9b\x78\x1f\x11\xf6\x29\x6c\xa7\xd5\xb6\x2b\xf9\x1c\x71"
+ "\x7e\x6e\x0f\xf3\x6c\x52\xb9\x67\x55\x9f\xad\x06\xff\x17\x39\x7b"
+ "\xcf\xf3\xea\x79\xaa\x86\x1b\x71\xb8\x56\xe7\xf7\xeb\x2f\xe2\xbb"
+ "\x75\x86\xe2\xf1\xd5\x1f\x36\x61\xbe\x86\x76\x7e\xef\x24\xad\xfe"
+ "\xc0\xec\x80\x8d\x70\x03\xfd\x10\xf7\x1f\x72\x59\x7e\x97\xc0\x47"
+ "\x37\x9e\xd9\x63\x86\x76\x81\x96\x49\x13\xea\x8f\xcc\xfa\x4d\x3a"
+ "\x7e\x26\x91\x26\x77\x53\xd3\xd1\x83\x83\x06\x9a\xc9\x3a\x34\xc3"
+ "\xf2\xe5\x2f\x8d\x70\xdc\x73\xf7\xa4\x1c\x4f\x59\x29\xb4\x72\x34"
+ "\x62\x15\xf1\xf1\xd3\x2a\x72\x1e\xbe\xa5\x9c\xa4\x3f\x4d\x75\x45"
+ "\x4e\x2a\x5c\xb7\x7b\x45\x31\x9f\x5d\xd7\x32\x77\x2e\xf1\x3c\x43"
+ "\xa6\x37\x2f\x05\x4d\x1c\xa3\x99\xed\x67\xfe\xd6\xc5\x49\x2a\x7e"
+ "\xf0\x7d\xa4\x81\x5e\x6e\xe1\xdb\xb9\x44\xd9\x9d\xc5\xd5\x5a\xcd"
+ "\xce\x25\x7d\xf0\xcd\xc4\xf0\x3d\xaf\x92\x69\x6f\x59\x87\x29\x60"
+ "\xbe\x9b\x02\xce\x30\xbd\x8f\xfb\x94\x7d\x85\x3a\xd9\x96\x65\x18"
+ "\x8d\x5e\xad\xd2\xf3\x29\x99\xf4\xf3\xa7\xa6\xb3\x54\xfc\xdb\x03"
+ "\xfd\x94\xe3\xf3\xde\x5d\x99\x63\xd6\x75\x7b\x9f\x36\x07\xe9\xde"
+ "\x69\xba\x2d\x83\x31\xf7\x69\xcc\xff\x57\xcb\x38\x4f\x78\xff\x0c"
+ "\x7f\x17\x06\x69\x2e\x23\x4f\xca\x3e\xfa\x3e\xaf\xc1\x0b\x3f\xf3"
+ "\x81\xb8\xf8\x8f\x0e\x3e\xdb\xd2\x8f\x1f\xcc\xa0\x80\xfb\x76\xde"
+ "\x8b\x1c\x30\x14\xfa\xc7\x73\x41\xf4\xc4\xbc\x94\x05\x71\x32\xc5"
+ "\x4c\xf4\xe5\xe8\x45\x91\xd7\xd2\x79\x5e\xc6\x34\x65\x5d\xf3\xb3"
+ "\x15\xbf\x31\x05\x22\xe7\xfc\x81\xad\x1a\xb5\xc2\xae\x0c\xd4\x9f"
+ "\xf3\xab\xd8\xa7\x31\x6a\xa1\x3f\x53\x8b\xfb\x3f\xca\x03\xe5\x7f"
+ "\x46\xba\x90\xb1\xb0\x7b\x2e\x8a\x05\x01\xf3\xff\x21\xfe\x4e\x11"
+ "\x8f\x71\xa0\xbb\xf3\x2c\x3d\xfd\xcf\x5f\x03\xce\x9b\x7f\x01\x2c"
+ "\x19\x33\x6d\x32\xbd\x8f\x7b\xb4\xa9\x77\xfc\x4b\x19\x6b\x26\xcd"
+ "\xbf\xdd\xea\x5e\x64\xd2\x30\x96\x72\x6c\x3b\x8c\xa1\x13\xb9\x5d"
+ "\x78\xce\xe6\x67\x5c\xc7\xf2\xd5\xba\xc5\xbf\xdb\x1a\x5d\xc4\x63"
+ "\x6b\x1e\x8f\x9b\x48\x5f\xd0\x78\x51\x8e\xb5\xf3\xf4\xe7\x59\xfa"
+ "\xf3\x0c\xfd\x79\x9a\xfe\x9c\xab\x3f\xf3\xba\xbc\x3e\x26\xaf\xf1"
+ "\xf5\xda\x0b\xa6\x41\xc7\xf0\xbc\xc7\xe8\x0b\xe0\x33\xc4\xea\xde"
+ "\x2c\xc7\x76\x1d\x8f\x89\x3a\x5e\xd9\xfa\xb3\x81\xcf\x8d\xd6\xe8"
+ "\xe6\xff\x25\x7c\xd6\x3a\x13\xf1\x59\x9b\x1d\x87\x0f\x59\xdd\xb9"
+ "\x9f\x07\x1f\x9b\x95\xbf\x13\xf1\x3f\xc0\x87\x71\xe1\x34\xd4\x7f"
+ "\x20\x09\x1f\xbf\x81\x4f\x4a\x7e\x5b\x27\x3a\xd8\xae\x59\xfb\x05"
+ "\x19\xd7\x79\x10\xdb\x2c\x8d\x97\x8c\x38\x85\x6b\xa3\x57\x8a\x53"
+ "\x08\x59\xc0\xb8\x5d\x82\xf6\xaf\x6d\xd6\xed\xb7\xc3\xca\xce\x2f"
+ "\x99\x68\xf8\x8e\xa1\xad\xfb\xaa\x54\x5b\xf7\x6f\xe5\x58\x7d\x1b"
+ "\xe8\x8b\x1e\xb7\xe8\xc0\xbc\xfb\x6f\x3c\x37\x8c\x87\x5b\x54\xb2"
+ "\x76\xed\x53\x77\x39\x8b\x96\xae\x5a\xee\x1c\xbd\xcc\xb9\xb6\x70"
+ "\xe5\x8a\x92\xe5\x89\xfe\x14\x36\xfd\xfb\x3d\xf2\x9c\x08\xcf\xa5"
+ "\xe4\x5c\x1a\xfc\x2f\xf5\xa4\xf4\xc9\x2b\xb9\x20\xbc\x25\x4b\x58"
+ "\xe7\x36\xd4\xa8\xef\x3c\x01\x9f\x26\x63\x0c\x31\xe6\xbf\x3c\x86"
+ "\x20\xfd\x04\xc6\xc9\xfc\xb8\x74\xce\x1b\x32\xd2\x18\xbe\xae\x9b"
+ "\x06\x9d\xa4\x92\x6a\xae\x33\x25\x0d\x2f\x8a\x3d\xb0\x9b\xf8\x1b"
+ "\x16\x26\xe8\x14\xc1\x71\xb7\xf8\xfc\x25\xca\x89\x53\xf4\x8c\x9c"
+ "\x57\x2c\xc0\xb3\x9a\xb3\x09\xe0\xf8\xcc\xc3\x28\xb3\x17\x69\x66"
+ "\xb6\x21\x30\x0f\xec\xe0\x72\x48\x7f\x8a\xe3\x60\x20\xdd\xa2\xc7"
+ "\x13\xe3\xb4\x2d\x1c\xa7\x02\x69\xb6\xb8\xb4\x97\x90\xe6\x40\x9a"
+ "\x53\x87\xf7\x06\xd3\x19\xcf\xb9\xfa\x3a\x19\xe7\x79\x57\xaf\xb7"
+ "\x3c\x1e\x67\xfe\x86\xcb\xed\xe3\xb3\x9d\x0b\xe6\x7f\x7d\xf2\xdd"
+ "\x8f\xaf\x5e\xb5\x62\x30\x49\xb2\xbb\x30\x1c\x67\xdf\xee\xbe\xe5"
+ "\x2e\x67\xf1\xf2\xe5\x6b\x9c\xeb\x97\xaf\x2a\x71\x2e\x5d\xbf\x74"
+ "\xc3\x60\x5a\xb1\x7a\xcd\xe3\x1c\x65\x81\xbb\x65\x6d\xc1\xe3\x2b"
+ "\xbe\xcb\x4e\x2f\x2a\xf7\xe0\x04\x3b\x61\x01\xeb\x36\x3d\x2e\xc9"
+ "\xd1\x2a\xb6\x21\xed\x5f\xb5\xe1\x9e\xe3\x75\x39\x70\x6d\xc2\xef"
+ "\x30\x7e\x87\xf0\x3b\x8e\xdf\xb1\xd3\xb4\x69\x2b\xae\x07\xbb\xbd"
+ "\xeb\x96\x19\xf6\x4a\x1f\x0f\xad\x73\x1b\x3c\x04\xfb\xe2\xa0\x1a"
+ "\xdf\xd6\xed\x6b\x8d\x4a\xf9\xe9\xe5\xa9\xaa\x8b\x7d\x3c\xc5\xf1"
+ "\x46\x5b\xd9\xa7\x6b\x1d\xde\x5f\x92\x6b\x95\xbc\x66\x72\x0d\xd3"
+ "\xed\x14\x6d\xd8\xdd\xf8\xb2\x68\xe6\x58\x39\xb8\x36\x81\x5f\x9a"
+ "\x55\x7c\x9a\xf5\xa3\x90\x6f\x24\xea\x38\xac\xea\xd0\x9f\x87\x8b"
+ "\xa3\xfc\x0d\x97\x93\xfa\x33\xc3\x02\x8c\x3b\xf8\x9e\xaf\xfa\xde"
+ "\xa9\x55\xff\xc6\x9b\xa9\xef\xdd\xfa\x16\xbd\x0e\x3f\x68\x51\xde"
+ "\xe0\x95\x73\x29\x39\x77\xe6\x35\x62\x6b\xda\x3d\x02\xf8\x9c\xd3"
+ "\xd2\x17\xb6\xc9\xf8\x97\xe5\x97\xa0\x23\xbe\xf6\xb5\x80\x5b\xe6"
+ "\x4f\xe3\x35\xe4\x39\xc5\x42\xe3\x38\xe4\x5a\xfa\x93\x6d\x5c\x4e"
+ "\xd8\xbe\x6a\xd3\x76\x0c\xc9\x55\x36\x03\xc7\x1d\x5c\xbf\x4f\x87"
+ "\x19\x61\xda\x9e\xa6\x75\x8f\xa8\x79\xf8\xa6\xad\xca\x96\x58\x7f"
+ "\xd0\xf0\xb5\x84\x8c\xba\xf0\xdc\x64\xe8\x80\x20\xad\xf7\xe9\x7e"
+ "\x71\x7e\xbd\xfd\x51\xfd\xf9\x90\x8e\x63\x1a\xc7\x42\x01\xfe\xc7"
+ "\xb8\xef\x60\xaf\x1c\xc2\xfd\x71\xd0\xa7\x59\xd1\xc7\x2d\xe3\x1c"
+ "\xc0\x6e\xe2\xf7\xc7\xf9\x7b\x37\x78\x77\x5c\xc5\x19\x59\x3f\x91"
+ "\xdb\xdc\xe7\x3b\x5b\x9f\x0b\x5c\xef\xe0\x3d\x66\xc8\xd2\xa1\xc0"
+ "\x45\x96\xcf\xf5\xd9\x80\x77\xc0\xd0\x3b\xac\x67\x0a\x62\x90\x53"
+ "\x39\x9f\x72\x17\x19\xfa\xa6\x8f\x0f\xdc\xe5\xa9\x74\x49\xaa\x7e"
+ "\x57\xf4\x77\xff\x43\x78\x9f\x69\x02\x4e\x07\x64\x1f\x70\x3c\xd6"
+ "\x8b\xbd\xf3\xb6\x1e\xa5\x23\xdd\xc7\x7b\xe7\x98\x3a\x1e\x1c\xdb"
+ "\x3d\xc8\xb8\x5d\x92\xfb\xfe\xba\xde\x70\x47\x0d\xbd\x61\xc0\xb1"
+ "\xa6\x09\xcd\xea\xc6\x3f\xdf\x48\x07\xef\x91\xf0\x78\x29\xed\x11"
+ "\xc0\x19\x7a\x41\x9d\x81\xd3\xaa\x47\x3a\x82\xe4\x3e\xc8\xdf\x7c"
+ "\x93\x36\xad\xf7\x99\xff\xe8\xd3\x45\x1b\xe6\xc5\xc3\x14\xb6\x91"
+ "\x0e\x86\xcb\xfa\x88\x6d\x92\x82\x98\x99\xe3\xd0\x38\xf4\xf1\x05"
+ "\x3a\x78\x43\xb9\x81\x2b\x68\x78\xd4\xc0\x57\xff\xe6\xd8\x51\xd4"
+ "\x13\x9c\x1b\xeb\x61\x5f\xf0\x26\xd5\x9f\x9b\xa4\xbe\xc1\xbb\xfd"
+ "\x28\x7b\x38\x48\xcf\xd8\x74\x19\x6a\x46\xf9\xfd\x47\xca\xa6\x21"
+ "\xcf\x86\x36\xdd\x9f\xf9\x18\xfa\xf7\x78\x1f\xef\xaf\x6b\x89\x5b"
+ "\xe7\x39\xae\xfa\xf0\xee\xf2\x93\xb4\xd1\x11\x97\xae\xf7\xed\x91"
+ "\x79\x48\x6f\x51\x6b\x26\xce\x36\x55\x7e\xa3\xf2\x5d\xd5\x71\x64"
+ "\x5d\xc0\xe7\xf5\x58\xc6\x25\xed\x65\x1f\x6f\x9c\x67\x8c\x17\x80"
+ "\x75\x50\xd2\x7c\xb8\x38\xcc\x74\x52\xf1\x3e\x9e\xb9\xa8\xe8\xb4"
+ "\xd1\x9d\x40\x7b\x1e\x37\x51\x0f\xd3\x69\xe8\x16\xa1\x0d\x0d\xa7"
+ "\x89\x82\x0d\x66\x62\x79\x61\x19\xe7\xbd\x41\xf0\x87\xb4\xab\x14"
+ "\xdd\x36\x1e\x32\xe8\x66\xf4\x1d\xd3\x29\x48\x1b\x5d\x4c\xdb\xc4"
+ "\x36\x0e\x3a\x76\xd2\x68\x3b\x68\xca\x31\x4d\xf1\xdc\xac\xcb\x45"
+ "\xb3\xff\x06\xf6\x1d\x59\xf7\x87\x23\xe6\xaf\xd3\x11\xf7\x44\x52"
+ "\xb4\xdd\x84\x3e\x2e\x71\xc7\xcd\x4b\x8e\x32\x7d\x59\x56\x84\x6f"
+ "\x64\x96\x1e\x7b\xeb\xa8\xf2\x63\x5a\xd7\x2c\xaa\x47\x66\x49\x59"
+ "\x5e\x27\x63\xa4\x70\xdc\xde\x63\x4c\x23\xd6\x8b\x2c\x4b\x2c\x03"
+ "\x2c\x4f\x8a\x46\x9b\x4a\xe2\x68\xd4\xc4\xf4\xd1\xe9\x74\x30\x49"
+ "\x97\x2f\x77\x16\x4d\x56\xba\xd8\xe9\x1a\xbd\x6c\x82\x0c\x74\xe3"
+ "\xbc\x6f\xea\x5d\xce\x79\x93\x47\xbb\x0b\xc7\xce\x51\x97\xa9\xf3"
+ "\x66\xf1\x75\x70\xe2\xbc\xce\x89\x7a\x4e\x24\xce\x0d\xb7\x14\x2a"
+ "\xfd\xb1\x29\x1c\x4c\xb3\x4a\xda\x71\xdc\xd9\xaa\x55\x44\x31\xe0"
+ "\xbd\xe3\x34\xfa\xd4\xe6\x3c\xc8\x71\x8e\xe7\xba\x89\xe3\xa2\x7f"
+ "\xda\x88\x77\x0d\x48\x1f\x5a\xcc\xdf\x47\xf8\xab\xd0\xec\xce\x83"
+ "\xbc\x66\x23\xaa\xed\xee\x90\xbd\x22\x07\x3f\x0a\xd9\xc7\x54\x4e"
+ "\xbf\xc5\x23\xba\xbd\xa5\xb3\x8c\x76\xf1\xda\x0e\xfa\xf3\xe0\x5c"
+ "\xb7\x88\x31\x8d\x0a\xdc\x1c\x8b\x1c\xb0\xd3\x79\x6d\xa7\x14\xed"
+ "\x2f\x3e\xa0\xe6\xaf\xa5\xe0\xff\x75\xba\x3d\x43\xf3\xf0\x0c\xfb"
+ "\xef\xeb\x72\x8d\x4b\xf3\x3a\x64\x0c\x73\xad\xe2\xd6\x87\x30\x1f"
+ "\x20\x03\x26\x60\x0d\x54\x7e\x0f\x0a\xde\xe7\xf5\xab\xd5\x6a\x46"
+ "\x36\x59\xd3\x54\x5c\x48\xc8\x78\x79\xa3\x49\xcb\xeb\xf5\x93\xc1"
+ "\xbb\xa1\x5b\x6c\xec\x47\x93\x07\xde\x2b\xe7\x3c\xc6\xbb\x2a\xaf"
+ "\x16\xac\x32\x69\x11\xf4\xa3\x4d\xd9\xcf\x9d\xac\x3f\x31\x77\xdd"
+ "\x3c\xc9\x18\xd7\xe4\x78\x68\xa2\x72\x35\x9f\xd9\xbc\x88\xcb\x9d"
+ "\xf7\x9a\x09\x3a\xbb\xf9\xa6\x2c\x39\x47\x89\x68\xde\x34\x52\xbe"
+ "\xcc\x9b\x6f\x33\x74\x2c\xef\x97\x5a\xb7\x88\x10\xaf\x11\x5b\xa3"
+ "\x22\x24\x63\xed\xf3\xd8\x41\xa7\x29\x50\xda\x5d\x1e\x90\xdf\xe0"
+ "\xe4\xef\x8a\x84\xf5\x71\x23\xa6\xc6\x0d\xd4\x1f\x4a\xbf\x75\x09"
+ "\xc6\x87\xb4\xd3\x04\x5b\x17\xf8\x33\x6d\x78\xaf\x45\x03\xad\x02"
+ "\x3c\x4e\x32\x7d\x32\xbf\x32\x8d\x7d\x60\xb8\xad\xd6\x28\xda\x1c"
+ "\xdf\x2e\x93\x16\xdc\xe1\x45\xbb\x4c\x68\x97\xfb\x0c\xcb\x4c\x84"
+ "\x7d\x93\x20\x6f\xc3\x65\x3c\x6b\x39\x3f\x2f\x73\xc6\xb7\x91\xf5"
+ "\xbf\x6a\x43\xd9\x94\x54\x6d\x14\x26\x6e\x23\xd3\xa0\xec\x3a\x5d"
+ "\xde\x24\x9e\xac\x3f\x3a\x69\xf3\xf1\xa1\x5b\xd8\x27\xc8\x79\x10"
+ "\xfa\x6d\x2a\xf7\x21\xc6\x4f\x1f\xe3\x99\xaa\xbf\x18\x9e\x0e\x2b"
+ "\x68\xdd\x52\xbe\x04\xb8\xec\x4f\x4d\xef\xb2\x96\x2b\xd3\xbb\xec"
+ "\x35\x2e\xcf\x78\xf0\xfe\x8e\x35\x6a\x82\x0e\xae\xe0\xf9\x5a\x65"
+ "\xaa\x7a\x87\x6e\xd9\xc3\x78\xa5\x7c\x27\x58\x5e\x74\x1d\x04\x3e"
+ "\x14\x90\x13\xc1\x3a\xa9\xdb\xeb\x99\x61\xe8\x23\x6b\x9a\x33\x5d"
+ "\xea\x07\x93\xf0\xa5\x82\x61\xdd\xe2\xe3\x7d\xae\xa9\xa8\x3f\xe5"
+ "\x7b\x8d\xbf\xdd\xe1\x73\xee\xd1\x2a\xbe\x7a\x93\x35\x8d\xee\x09"
+ "\xa5\x7f\x75\xb0\xd5\x1d\xe5\xb3\x9c\xe8\x47\xe1\x86\x1c\x3f\xcc"
+ "\xf3\x54\xb5\x36\xe2\x81\xfd\x5f\x2d\xe3\x33\x85\xec\xce\x3d\x6a"
+ "\xdf\xc8\x83\xf1\xaf\xce\x69\xac\xcd\xe3\xb9\x3d\x48\xff\x28\x54"
+ "\x72\xf9\xc5\x9d\xa2\x66\xcc\x02\xcd\x6b\x15\xce\x8d\x56\xd8\x91"
+ "\xe5\x9b\x35\xc1\xdf\x73\x18\xb3\xa0\x8f\x4f\x94\xbf\x94\xc1\x27"
+ "\xdd\xde\xf2\x51\xa9\x79\xa0\x7c\xfa\x95\x79\xa0\xfc\x0b\xfc\x9e"
+ "\xe9\xae\xe6\x2a\xe5\x45\x86\x9d\x22\x2a\xbe\xb8\xd3\x59\x26\xeb"
+ "\x27\x55\x37\xd3\x24\x97\xf7\x8c\x66\x81\x2e\xe5\xc8\x5b\x67\xe8"
+ "\x01\xe6\x17\x6b\x8c\xbf\x75\x41\x92\xa7\xf1\x0e\xe3\x4a\x89\x45"
+ "\xad\x83\xdf\x6c\x93\xdf\xaf\xf4\x6e\xf2\x85\x3c\x85\xbb\xf8\x3b"
+ "\xad\x61\xfb\xc8\x11\xc8\xd3\x16\xa4\x26\xb5\xdf\x6a\x1b\x99\x05"
+ "\x9d\xed\xa8\x55\xfe\xd0\x16\x19\x2f\x0a\x32\xcd\x31\xa2\x58\xae"
+ "\x91\xc6\xba\x9b\xe3\x45\x61\xbe\xb3\xc5\xd6\x3b\x2e\x79\x73\xa1"
+ "\x2b\x84\xb4\xc5\x30\x2e\x8d\xe8\x02\xed\x5e\x32\x69\xfb\x2e\x4e"
+ "\x70\x10\xb7\xf9\x62\xc5\x0d\xfb\xbe\x37\x9e\xcc\xff\x97\xe3\x31"
+ "\x2a\xbe\x9d\xb2\xb6\x7c\xdd\x4c\xff\x95\x43\x26\xa6\x43\x90\xb6"
+ "\x38\x15\xed\xb6\x2c\x31\xfa\x27\x48\x9e\xa3\x52\x77\x56\x2c\xec"
+ "\x98\x1b\x15\x9f\xaa\x75\xee\x2d\xd0\x7f\x4f\xd5\xa9\xf7\x9b\x3a"
+ "\x92\xd7\x80\xd8\x9e\x77\xae\x5c\xeb\x5c\xb6\x7a\xfd\xaa\x91\x23"
+ "\x13\xe6\x4a\x66\xf5\x5d\xdc\x2d\xb5\x6a\x3c\xdd\x72\xd4\xc0\x9b"
+ "\xed\x12\x3c\xa3\xfd\x9b\x2e\x8b\x65\x3f\xab\x40\x77\x73\x2f\xc8"
+ "\xa6\xbe\xfb\xdb\x68\xd6\x6d\x71\x8f\x5f\xa3\x59\xb7\x7f\xad\xe0"
+ "\xa1\xe5\x4b\x97\x6d\x88\x4b\xbd\x23\x7e\xdd\xb0\x6a\x27\xea\x4e"
+ "\xbf\xe1\x5e\xe8\x8a\xb4\x39\x9b\x78\x6c\xf1\xbe\x57\x16\x15\x7f"
+ "\x87\xbe\xce\x81\x8c\x15\xb4\x94\x44\xa9\x05\xba\x4c\x7c\x91\x75"
+ "\xf8\x20\x75\xb6\x13\xf6\x14\x78\xcb\x8a\xb6\x87\x60\xd7\x5d\xe0"
+ "\xf5\x19\x94\xfb\xb8\xb5\x8e\x63\x3a\x8f\xd1\xe3\xd5\x7b\x39\xd6"
+ "\xb9\x1d\xd7\x0f\x71\x1d\x88\xeb\x6f\x9d\xab\x30\xef\x61\x5f\xfa"
+ "\x75\xec\x4b\xef\x7d\x4b\xfa\x03\x85\xcb\x89\x7d\x82\xf0\x7e\x01"
+ "\xdb\x20\x41\xaa\x30\xf3\x3a\x38\xe7\x45\xda\x6e\xe7\x13\x94\xcd"
+ "\x57\x21\xf7\x06\xbd\xf5\xa2\x7a\x8c\x4f\xec\xca\xe3\xef\xad\x8d"
+ "\x3a\x45\x15\x69\xe9\x69\x1f\x53\xba\xc3\x92\xd1\xed\xad\x40\xd9"
+ "\x55\x0b\x98\x4e\xfd\x7d\x8b\x56\x7e\x03\x38\xc9\x3e\xec\xb3\x0d"
+ "\xbf\x4f\xd2\xbe\xd5\xed\xb9\x06\x39\x2e\x54\x2c\x88\xb3\xe9\x78"
+ "\x6f\x7a\xb0\xb2\x4f\x44\x4c\xd9\xa7\x15\x25\x86\x1c\xe0\xbe\xdc"
+ "\xe0\xd3\x84\xf8\x7a\xab\x4a\x96\xaf\x59\xbe\xcc\x39\x7a\xed\x60"
+ "\x8a\x8b\xae\x57\xb8\x7c\x95\x73\xcd\xf2\xa7\x9f\x59\xbe\x56\x46"
+ "\xc6\xe3\xb7\x09\x63\x7e\x96\xc8\x1c\xd5\x64\x9c\xfb\x72\xde\xc0"
+ "\xf4\xad\xf8\x84\x63\xb2\x89\x9a\xd1\x1c\xc3\xaf\x53\xcd\x37\x76"
+ "\xba\x13\xe7\x1b\xcf\xaa\xb8\x13\xbe\x31\xe5\x6a\xae\xf3\xac\xfc"
+ "\x8e\xf5\x49\xda\xea\xeb\x8b\xff\xbe\x75\x0a\x68\x69\xd2\xe9\x76"
+ "\xa1\xdb\xbb\x35\xc7\xa0\x5b\x90\x9e\xf5\xeb\xb6\x54\xa7\xd4\x1f"
+ "\x18\x63\xa1\xff\x12\xc6\x57\xf5\x0d\xda\xad\x1c\x97\x23\x5d\xae"
+ "\x27\xdb\xc7\x6c\xe5\xba\x18\x26\xea\xf3\xa3\x7f\xca\xa1\x37\x59"
+ "\xbf\x55\x1a\xf0\x50\xa7\x8b\xeb\xd3\xe7\x41\xd7\x9f\xa6\x67\xe5"
+ "\x9a\xb3\xe6\x1b\xb3\x95\x75\x0a\xc7\x10\xd1\xaa\x01\x47\xee\xd1"
+ "\x3e\xeb\x97\xeb\xb0\xfc\x0d\x02\xc0\xe2\x75\x60\xe8\xb9\x5a\xfe"
+ "\x5e\x31\xa7\xa9\xd8\x70\x15\xdb\x78\xed\x19\x75\x95\x02\xff\x48"
+ "\xdf\xd9\x86\x67\xfd\x6c\x77\x32\xdc\x20\x6d\x3d\xcc\xf0\x54\xec"
+ "\xbb\x67\x47\x80\x77\x46\xf5\xd9\x4f\xcf\x2e\x89\x9b\x97\x31\x3e"
+ "\x12\xcf\x30\x70\x91\x71\x56\x95\xaf\xa9\x6c\x37\xeb\xcf\x5a\xbd"
+ "\xed\x46\x7b\x00\x0f\xfa\xaf\xc2\x66\xf8\x4d\x04\xf5\x76\x33\x7e"
+ "\x8c\x7b\x3c\xce\x3a\xbe\x75\x8c\x2f\xca\xed\x8d\x93\x6d\x5e\x97"
+ "\x19\x80\xb4\x43\x7d\x3e\xec\x5b\x29\x59\x6f\xac\x5e\xe5\x2c\x5a"
+ "\xb9\xea\xc9\x82\xf5\x4b\x9f\x5c\x5e\xf0\x4c\xf1\x58\xe7\x33\xab"
+ "\x1e\x2b\x5a\xfd\xf8\x93\xcc\x35\x6b\x4b\x9e\x79\xfc\x49\x27\x6b"
+ "\x96\x82\x69\xb3\x66\x15\xdc\xfb\xf0\xfc\x47\x06\xd3\xbd\x4b\x91"
+ "\x86\x99\xff\xac\xec\xb1\xea\xd5\x43\xd3\xa7\x7e\xbb\x60\xea\xdc"
+ "\x87\xe7\x2c\x90\x87\x5e\x7a\xdf\x4f\x5b\x95\x3a\x43\x02\x1f\xda"
+ "\xc0\x4b\xa5\xe8\xdf\x01\x27\xe9\xf9\x49\x2a\x5e\xfa\x73\x45\x89"
+ "\xf1\xd2\x9f\x03\xd2\xcf\xed\xc1\xef\x30\xd1\xf7\x42\xf8\x41\xbb"
+ "\x3f\x9f\xad\xf8\xeb\x9a\xc5\xdd\xde\xe7\xea\xfa\xf8\xeb\x79\x79"
+ "\x96\x92\xfd\x94\xd4\xfa\xec\x73\xd0\xff\x15\x87\xe2\xdf\xf5\xcd"
+ "\x27\x9f\x3b\xd6\x3b\x9f\xec\xd5\x29\xcf\xf5\xce\x2d\x91\x56\x89"
+ "\x79\xe5\x35\x3c\xaf\x54\xeb\x49\xcf\x4f\x96\x3c\xd5\xaf\x7c\x5b"
+ "\xc8\x98\x57\xb2\x6c\xcb\x3d\x29\x39\xff\xf8\x5e\x4e\xbc\x8c\xcb"
+ "\x35\x7d\x5d\xc6\xb9\x9c\x5c\xbf\xb3\xed\x5c\xc6\x6b\xda\xb0\x8f"
+ "\x4b\x61\x2b\x60\xfc\xea\x16\xc2\xbe\x73\x99\xc2\xe9\x7b\x6e\x5e"
+ "\xe3\x66\xbb\x59\xe7\xa7\xa1\xa7\xe9\x7b\x6f\x0b\xef\xb3\xcd\x6a"
+ "\x4e\xf9\x6c\x8c\xf5\xba\xa8\xb8\xe1\x5e\xf6\x2d\xe2\xb9\x13\xea"
+ "\xdc\xdf\xc7\xb3\xcf\x4f\x62\x5e\xe8\x9b\xcb\x7e\x2f\x41\xff\x77"
+ "\xc9\xef\x12\x7e\xef\x84\x11\xef\xa1\x64\x24\x99\xcc\x23\x7d\x54"
+ "\x6b\x12\xd0\x37\xdf\xdb\xc6\x75\x30\x3d\x83\xf4\xdc\x3e\xe4\x35"
+ "\xf7\xd1\xaf\xd2\xd6\x4b\x3f\x7d\x9d\xc5\x58\x63\x51\x78\x3f\x3f"
+ "\xb9\x3f\x5a\xa5\xa6\x53\xe5\x92\xcf\xa4\x93\x97\x06\xb0\x4c\x1a"
+ "\xf4\xba\x9c\x56\x95\x7b\x2f\xa7\x55\xe5\x85\x3e\x5a\x3d\x77\xe3"
+ "\xe5\xb4\xaa\x6c\x8b\xdb\x57\xd2\xd7\x51\x9e\x9f\xcc\x34\x63\x1e"
+ "\x43\xbb\xb7\x81\xcf\xea\xfa\xe8\xf7\xbc\xe5\x72\xfa\x3d\x3f\x22"
+ "\x35\xfd\x2a\xf9\x7c\x55\x3c\x9c\x86\x54\xe3\xc6\xd0\x2d\x26\xfd"
+ "\x3c\xd8\xf3\xd5\xfc\xad\x7b\xc6\xe3\x45\x93\x56\xf8\xa2\x17\x3f"
+ "\x5c\x79\x1e\xd1\x67\x8b\x8b\x88\x4e\x5f\x5f\x13\xe6\xbc\xbc\xae"
+ "\x74\x85\xb1\xe8\x84\xb1\xe6\x81\xfb\x36\x9e\x3b\xf3\x37\xa1\x38"
+ "\x9d\xe9\xc9\xdf\x18\x03\xbf\xb7\x29\xbb\xf4\xf9\xde\xef\x7f\x74"
+ "\x8d\x1f\xed\x4f\xdf\x42\xce\x23\xf5\xb7\x73\x7a\x04\x3c\x34\x83"
+ "\xd3\xd9\x77\xab\x3f\x98\x05\xb1\x5c\x4a\x0d\xf7\xfb\xbd\xfc\xdf"
+ "\xdf\x99\xe8\x24\x7d\x54\xb8\x74\xd5\xb2\xd5\x2b\x56\x7c\xb6\x2a"
+ "\x8a\xdf\x57\xf3\x79\x35\xfe\xae\xd9\xc0\xee\x8a\x27\x36\xa2\x4e"
+ "\xd8\xff\xc5\x1d\x6a\xdc\xfc\x3e\xf4\xdf\xca\x26\x65\x4b\x2e\xec"
+ "\x50\xe7\xc0\x5f\xc8\x8a\xd3\xcf\xe0\x91\x17\x9c\xc2\xfb\xfd\xfc"
+ "\xbe\x3e\xfe\x7e\xe7\xe5\x7d\xfc\x02\xa5\xee\xe3\x17\x46\x69\xeb"
+ "\xf8\x1c\xce\x0b\x98\xff\xac\x91\xb6\x26\x3f\xb3\x1f\x04\xe6\xcc"
+ "\x1d\x98\x2f\x77\xce\xdd\xe0\xbf\xa7\x60\x43\x9a\xdc\x2b\xe6\x6f"
+ "\xaf\x44\x2f\x8a\x76\xf6\x45\xe0\xfd\x31\xfe\xf6\x0a\x7f\x73\x89"
+ "\xbf\xff\x29\xf3\xe0\xbe\xea\x14\xc9\xb9\x23\xde\x3b\x1b\x4f\xc9"
+ "\xef\x63\xc3\x56\x78\xa1\xdc\xb0\xad\xad\x30\x19\xf9\x7c\xfa\x0e"
+ "\xd5\x1f\x6d\xdc\x17\x5c\x5f\xc1\x06\xbf\xaa\xe3\x22\x7f\x57\x8d"
+ "\xac\xca\x86\x78\xe1\xd0\x15\xd7\xee\xed\x15\xce\xfe\xbf\x49\x50"
+ "\x3e\xa8\x77\xaf\x52\xff\x0e\x31\xcb\x3e\xfb\x8f\x76\x7b\xb7\xd9"
+ "\x92\xfd\x4f\x95\xef\xd0\x36\x97\xe1\x93\x55\x25\x7d\xa0\xc8\xca"
+ "\xfa\x93\xe7\x39\xa7\x68\xdb\xac\x46\x39\x5e\x6e\x9b\x15\xbf\xc7"
+ "\xe9\xdc\xb8\x65\xe0\x59\x7a\xe1\xc2\x15\xf6\x4d\x33\xfa\x7c\x5f"
+ "\xcb\x07\xa1\xfc\xb6\x5e\x1f\x31\x6f\xf9\xa0\xc6\x38\xdc\xf0\x6e"
+ "\x5f\x9c\xaf\x62\x88\xc7\x63\x9e\x3f\x36\xaa\xef\xaa\x86\x80\x43"
+ "\x0b\xd2\x30\x9f\xd8\x2e\xe3\x11\xae\x8f\xd2\x88\xe2\xbb\xf9\x9b"
+ "\x3d\xdb\x2e\xe8\xf3\xd0\x4e\x67\x19\xe3\xb3\xed\x25\x86\x1b\x44"
+ "\x3e\x21\xf7\x03\xb6\x53\x2f\xce\x71\xf5\x19\xb0\x15\x4d\xb6\x8f"
+ "\x32\xf0\x0a\xd2\x36\x19\x3f\x85\xbf\x73\x1d\xdf\x26\xf7\x8a\x95"
+ "\x05\xc5\x85\x1b\x0a\x56\xae\x5a\x59\x32\x98\xdc\x4b\x9f\x59\x39"
+ "\x01\x49\xce\xc7\x0b\x57\x16\x17\xac\x94\xd1\x8a\x65\x20\xe4\x92"
+ "\x0d\xc5\xbc\xf7\x71\xd9\x1e\xbc\x4d\xda\xf2\xa6\xed\x93\xd4\x78"
+ "\xbf\xbd\xd6\xe0\x53\xf9\xed\x6f\x91\x47\x7d\xbe\x57\xf2\x9b\xc1"
+ "\xe9\x68\xe7\x07\xcc\xc3\x2a\xbe\xcf\x8e\x36\x65\x5f\x6c\x6f\xbe"
+ "\xdc\x27\x6b\x7b\xd0\xf0\xc9\x02\x7f\xdb\x58\xd6\xe3\x60\x81\xff"
+ "\x77\xd0\xe5\x65\x76\x64\xf5\xfa\x77\xea\xdf\x1d\xe7\xbe\x92\xf1"
+ "\xee\x6b\x58\xdf\x6e\x7f\x20\xe0\x9e\xce\x31\x7b\x75\xb9\xda\x31"
+ "\x2d\x0e\x5f\xe9\xcb\xcb\xb0\xf8\x9c\xd4\x84\x48\xbc\x2f\xdb\x8e"
+ "\x0f\x31\xf6\x3a\x8c\x7a\x9c\x9b\x4c\xd0\x77\x3b\x5e\x0d\x9b\xfc"
+ "\xe9\xd2\xff\x18\xe5\x00\xcb\x67\xf8\xd1\x04\x7b\xdb\xb5\x63\x6f"
+ "\x32\x8e\xc0\x7d\x24\xd2\x0f\xf7\xf9\x09\xee\x28\x67\x18\x48\xc3"
+ "\xf8\x5f\x35\x36\x3e\x2d\xbe\x9f\xa6\x4c\x9f\x05\x03\x7a\xed\x72"
+ "\x74\xd2\xd4\xa5\x45\x45\xac\x83\x96\x2e\x2f\x7a\x66\xcd\xea\xb5"
+ "\x7a\xd7\x4d\x59\xc1\x61\xa8\x65\x96\xbb\xf4\x37\xce\x55\xcb\x97"
+ "\x2f\x53\x49\x7a\x47\x26\xee\x59\x29\x3f\x86\x2a\xcc\xff\xb7\x15"
+ "\xf6\xd9\x8a\x55\x7b\x84\x69\x47\x3b\x7e\xe7\xa4\xfe\x91\xfd\x5a"
+ "\x55\x94\x38\x47\xab\x2a\x35\x64\x5f\xf6\xb3\x87\x7d\xce\x9c\xf6"
+ "\x2e\x21\xf7\x78\xd0\xaf\xbe\x3f\xa0\x9d\x03\x82\xe4\xe3\x33\x5f"
+ "\x69\x71\x70\x0e\xf6\xd2\xbb\x62\x61\x5b\x85\xf2\x99\x30\xf3\x37"
+ "\x6b\x39\xa6\x04\xde\x63\xfe\xff\xc2\x09\xa5\x27\xab\x82\xbd\x7b"
+ "\x2f\xa6\x74\xcc\x37\xab\xc0\xfb\xab\xb3\x2f\x97\x6f\x9f\xe5\x72"
+ "\xb9\x67\x5f\x4b\x9f\xd3\xa0\x71\xdc\x37\xe8\xc1\x7f\xbe\xf7\x8c"
+ "\x35\xe3\x46\xfd\x9b\x08\x7c\xcf\x65\x79\x5e\x21\x86\x0e\xb9\x87"
+ "\xfd\x1a\x4e\x92\x6f\x9b\xe2\x29\x5f\x61\x9c\x6f\xa0\xed\x34\xf9"
+ "\x2a\x55\xdf\xfa\xca\x0d\xf9\x43\x3b\xa5\x2d\xc7\x30\xd4\xb8\x5e"
+ "\x35\x40\xf1\x97\x6f\xaf\x41\x5b\x9e\xc3\xe3\xf9\x60\x9f\x1d\x54"
+ "\xb5\x40\xfa\x8b\xa8\x98\x1a\x3d\xdc\x7e\xc0\x99\x68\xc0\x41\x5e"
+ "\xb4\xdf\x12\x32\x68\x65\xe4\x89\xe7\x89\xa9\x4b\x8b\x31\xc1\x5e"
+ "\xb9\x62\xc5\xf2\x35\x6b\x8d\x38\xe3\xae\xd5\x45\xcb\x54\x5c\xf1"
+ "\xbb\xd0\xfd\xeb\x21\xc3\x93\x39\x34\x39\x52\xd5\x6d\x92\xbd\x3b"
+ "\x96\xd7\x44\xa4\xff\xa8\x9c\x73\xbd\xf4\x5e\x83\x3e\xff\x3a\x49"
+ "\x35\xf3\x94\xff\x55\x8d\x5d\xd9\xb6\xd7\xbe\xde\xed\xad\x2e\x31"
+ "\x6c\x5b\x5e\x6b\xed\xa2\x9b\xf8\x5b\x9e\xf2\x2c\xc1\xee\x97\x45"
+ "\x3b\xaf\xad\x22\x4f\x9d\xf1\x2d\x3a\xb6\x9b\xb6\xbf\xac\x62\x68"
+ "\xfb\x57\xb1\xaf\xc8\x4b\x1f\x69\xd5\x4e\x9f\xc8\xb4\xfa\x61\x9f"
+ "\x65\xb0\x4c\x0c\xe9\x64\x1f\x5e\x8e\x7d\x55\xdd\xce\x76\x1d\xeb"
+ "\x32\xfe\x5e\x43\x3b\x55\x1f\x84\x8e\x86\x4e\x7f\x29\x18\xb2\x3b"
+ "\x7d\x5b\x37\x92\x85\xeb\x80\xbe\x0e\x36\xed\x61\xda\xd6\xd0\x07"
+ "\xd0\x65\xba\xce\x0e\x72\x3d\x41\xaa\x6e\xd6\xd7\xfd\xf7\xea\xeb"
+ "\xac\x7b\x91\x0f\xfa\x7f\x48\x9d\xe2\x55\xfb\x37\x6e\x2e\x27\x37"
+ "\x7f\x9b\x52\xc5\xad\xba\x75\x06\xda\xc1\xdf\x62\x0c\xc1\x16\xc4"
+ "\x7c\xa7\xba\x04\x6d\xc8\xd1\x7d\xc0\xc1\x2b\x35\x2d\xca\xb7\xbf"
+ "\x7a\x19\xd3\x00\x70\x0f\xe8\x70\x21\xaf\x35\xe8\xff\x1b\xf5\x78"
+ "\xd9\x35\xdb\x8c\x3a\x30\xfe\x85\x60\x37\xbb\xd9\x76\x06\xde\x95"
+ "\xf8\x6d\xab\x92\x7b\xe9\x41\xe8\x7d\xab\x60\xdf\xb5\xbe\xef\xed"
+ "\xd5\x34\x19\x63\x21\xd7\xad\xe3\xce\xb1\x84\x2c\xbc\xce\xa7\xd7"
+ "\xb5\x9f\xd7\x02\x0c\x98\x78\xae\xd4\x2e\x9e\xd9\x03\x98\x16\x8c"
+ "\xeb\x21\xfd\x3b\x6b\xdb\xaa\xce\xb3\x9f\x63\x10\xe3\xf6\x97\x45"
+ "\x41\xd4\xc6\x7b\x50\x43\x8c\xef\xd8\x35\x9e\x67\x7a\xbd\x98\xdd"
+ "\xb7\xb7\x84\xf2\xa0\x3f\xe4\xa1\xbc\x9d\x5e\x9c\xc9\xf5\xb2\x2c"
+ "\x70\x5f\x5e\x42\xdf\xa0\x7f\x8e\x8a\x8b\x67\x0e\x38\x57\xd1\x90"
+ "\x53\xf4\xe2\x53\xdc\x47\xbc\x1f\xcc\xfe\x87\x48\xb3\x72\xdc\xfd"
+ "\x93\xf4\xe2\x23\xdc\x3f\x8c\x8b\xf0\xd9\xea\xa2\xdd\x79\xf7\xf3"
+ "\x99\x6b\xd6\x99\x9b\x4b\x61\x73\xaf\x60\x5d\x52\xfb\x11\xcf\xe1"
+ "\xf9\x7b\x49\x7c\xef\x59\x26\x34\xd9\xbf\x1b\xb9\x7f\x6b\x3f\xda"
+ "\xdc\x21\xb4\x4f\xbd\x24\x8e\x86\x89\x3e\x35\x51\x34\x62\x4a\x63"
+ "\xbc\x4d\x9e\x33\x7c\x2e\x7c\x0f\x05\xdc\x95\xec\xcb\x66\xd9\xb1"
+ "\x91\x6c\x7c\xa6\x9e\xbf\x05\xd4\x1a\xae\xa7\xd6\xe2\x7a\xfa\x5d"
+ "\xb4\x96\xfc\xeb\x38\x3e\xca\x4b\x5b\x7f\xef\xae\xe5\x3d\xb6\x6b"
+ "\x70\x3f\xdd\xf9\x6d\x59\xd7\x88\xdf\x1f\xff\x23\xfd\xde\xff\x47"
+ "\x72\x3e\x2a\x9f\xc7\x36\xe7\xfd\x8e\x9a\x73\x7f\x47\x9e\x76\xa1"
+ "\xf1\xbc\xae\xec\x29\xae\xa3\x12\xb0\xf6\xf0\xf9\x73\x9b\xd6\xe5"
+ "\x18\x8c\xf6\x9b\x79\xff\xa0\x35\x1c\x22\xff\xaa\x7f\x67\x1c\x7f"
+ "\xda\x70\x9e\x2c\xfe\x55\xbf\x91\xf7\x6a\xbe\x75\x66\x4f\x60\x59"
+ "\x1b\xdb\x94\x51\x3e\x7b\xcf\x7b\x92\x98\x63\x68\x55\x8c\x63\x4c"
+ "\xe1\x0d\x7a\x99\x8d\xf2\xb0\x39\x8d\xf2\x32\x56\xdc\x6e\xa6\x07"
+ "\x70\x6a\x59\xa0\x68\xd2\x8c\x91\x42\xc7\xf9\x23\x4f\x5e\x3c\x7d"
+ "\x5e\x6c\x66\xfa\x70\xcc\x56\x0d\xfd\x05\xdc\x72\x41\x03\xcd\xa8"
+ "\x03\x38\x5b\xf4\x35\x5c\xcb\x8e\xf3\x94\xe1\x5f\xc5\xdf\x82\x7b"
+ "\xe9\x36\xeb\x3c\xb3\x45\xbb\x78\xf6\x40\xd5\x05\x32\x73\xbf\xf1"
+ "\xbe\x4d\x95\x7c\xcf\x30\x5f\xe2\xfd\x1f\x1b\x78\x92\xf0\x33\xe3"
+ "\x67\x61\xbe\xc3\x95\xcf\x70\x56\x02\x87\xfd\xe8\xab\x3d\x7c\x55"
+ "\xbc\x68\xcf\xe1\xb8\x24\xfa\x1c\xaa\x2f\x1d\x72\x14\x15\xf2\x7b"
+ "\xcb\x90\x99\xda\xfd\x1a\xe4\x88\xd7\x70\x1a\x6a\x28\x43\xf3\xfa"
+ "\x22\xbb\xa1\xeb\xea\x6b\xe4\xb9\x64\x1b\xaf\x6b\xee\x94\xdf\xd6"
+ "\x78\xe9\x80\xa1\xfb\xbe\x3f\x9c\xcf\x6e\xd6\x9e\x30\xf1\xba\x8f"
+ "\xcf\xb9\x4f\xe7\xf3\x7d\xc8\x03\xfd\x7f\xbd\x3e\x86\xd6\xc8\xf9"
+ "\x05\xcb\x7e\x7f\xf3\x09\xd8\xb2\xcd\x62\x57\x1e\xf1\xfe\x4f\xc6"
+ "\x16\x11\xca\x68\xb7\x8a\xd6\x70\xb3\x3c\xb3\xdb\x1a\x8e\xc9\xfd"
+ "\x1f\xbc\x4f\x9b\x13\x0e\x59\x61\xfb\x1e\x63\xda\x19\xe9\xbc\x77"
+ "\xc4\xeb\x6a\x73\xc2\x22\x34\x77\x83\x95\xbf\x85\x39\x42\xee\x1d"
+ "\xe8\xe9\xad\x0e\xcc\x1b\x36\x84\xac\x68\x7b\xb4\x17\x56\x57\x5e"
+ "\x3a\xcb\x1b\xf2\x66\xf5\xe6\xed\xca\x33\xf3\xb7\x9d\xb9\xce\xb8"
+ "\xb4\x01\x73\xdd\x28\xcb\x7d\xa5\xa7\x29\x9b\xf9\xe5\x83\xbd\x73"
+ "\x4a\x3e\xbf\xd0\x85\x71\x73\x6d\x5e\x9a\xd6\x95\x67\x8a\x01\x36"
+ "\x78\xdf\x26\xbf\xc9\x19\x0d\xe9\xdf\xb8\xea\x80\xfc\xb6\x91\xa8"
+ "\x6e\x28\x47\x3e\x33\xc3\xe5\x58\x10\xfc\x6d\x10\x61\x7f\x2d\xb5"
+ "\xdf\xb6\xaf\x32\xc7\x5f\xf6\x28\xf8\xe9\x95\xc3\x2c\xcf\x31\xdb"
+ "\xc8\x83\xce\x27\xd8\x86\x79\x45\xfa\x06\xc4\x20\x63\x31\xfb\xc8"
+ "\x83\x13\x3a\x28\xad\x0c\x7c\xab\xd6\xa0\x5e\x79\x38\x00\x19\xf4"
+ "\x68\x02\x76\xe8\x2b\x33\x98\x6f\xac\x9d\xec\x2b\x37\xf2\x90\xf4"
+ "\x4f\xcb\xdc\x9a\x1d\x88\x74\x50\x73\xf9\x9f\xa9\x39\x1a\x28\x3f"
+ "\x7c\x3e\x64\x56\x7e\x6a\x66\x86\xbb\x92\xdf\x79\xc0\xab\x05\xb1"
+ "\x3d\xd4\xdf\xde\x00\xcf\x8f\x31\x86\xfd\x55\xcd\x15\x5f\x39\x6c"
+ "\xcc\x8b\xaf\xdc\x86\xba\x2c\x8e\x9f\x21\x84\x83\xb4\x9a\xc7\xf8"
+ "\x5b\x3e\x1e\xd1\xed\xa2\x09\x1b\x79\x4d\xee\x95\x4e\xcc\x51\x72"
+ "\x75\xb8\xe7\x14\x5c\xe4\xbf\x02\x5c\xe6\x99\xe6\x3a\xb9\x2f\x85"
+ "\x36\x3d\xe6\x8c\x01\x76\x2c\xf3\xb1\x25\xd0\xf1\x1e\xcf\xa7\xbc"
+ "\x66\xfb\xea\x23\xa8\xc7\xd9\x1a\x3d\x46\x1c\x87\xa7\x41\xc3\xf8"
+ "\x78\xce\x41\xba\x4f\x9e\xe7\x2c\xd5\x4d\xd7\x84\xcb\x86\xf9\x3a"
+ "\xef\xc7\x78\x58\xc7\xf1\x5a\x40\x59\x8c\x06\x06\x30\x32\x72\xec"
+ "\x08\xc0\x98\xfd\x21\xef\x7d\x41\x4f\xc4\x84\xc3\xf4\xde\x45\x8c"
+ "\xf4\xd0\x9d\x32\x96\x44\xc5\x17\x77\x0e\xdd\x42\xf7\x08\x93\x55"
+ "\xfa\x74\x6a\xd5\xde\x1c\xf4\x6d\xa5\xf2\x01\x74\x1e\x8a\xf3\xff"
+ "\x4b\x47\x5d\xd2\xff\x4f\xd8\x9c\xa5\xf5\x72\xdd\x71\xe4\xc1\x6e"
+ "\x6f\x5d\x38\x48\xaf\xc8\xf5\xd7\x6d\x7c\xc6\x43\xea\xd8\x57\x97"
+ "\x86\xec\x8b\x65\x9b\xf8\x2c\xab\xb6\x2e\x76\xa0\xea\x9f\xd2\xbe"
+ "\xe6\x77\x53\x5a\x3b\xbb\xfd\xc2\xb7\x58\x7e\x93\x4f\x87\x6d\x3d"
+ "\x4b\xaf\xda\x45\xf5\x62\xd8\xcf\xaf\x2e\x51\x7d\x23\xef\xc7\xf2"
+ "\xfb\x68\x8f\x0b\xf7\x75\xfb\xea\x2f\xf1\x5e\x40\xdd\x02\xe1\xfd"
+ "\xb2\xbf\xcb\xb6\x98\xe6\x3b\xd8\xa6\x7a\xb5\x24\x68\xfa\x5d\x96"
+ "\xbe\x0e\x28\xe3\x62\xf4\x37\x47\x12\xbb\x1c\x83\x03\x00\x82\xf9"
+ "\x6c\xd6\x69\xda\xf5\xc9\x25\x2f\x99\x7a\x60\x0b\x5e\x32\x91\x0d"
+ "\xf2\x95\xb1\xe3\x06\xca\xc6\xbb\x1b\x4e\xd3\xab\xbf\x8d\x9a\x28"
+ "\x0b\x3f\x5b\xe8\x8b\x85\xd7\x00\x6e\x2e\xaf\x91\xb6\x9c\xe7\x35"
+ "\xae\x9d\xf2\x9c\x72\xd5\x4e\x1a\xa5\x01\x1e\xef\xf7\x54\xdd\x40"
+ "\xa3\x78\x9d\x12\x69\xae\x82\x98\xda\xf7\x34\xd6\x22\x2a\x6e\xa0"
+ "\xb1\x89\xf5\xbe\x7a\x40\xad\x63\xee\x6a\x97\x73\xab\x10\x7d\x09"
+ "\x73\xab\x93\x80\xbb\x57\x78\xd3\x85\xf8\xa2\xc3\xa4\x7c\x13\x76"
+ "\x6e\xb7\xd6\x29\xbe\x93\xfb\x7c\xe0\x37\xde\x47\xd5\xf7\x94\xd2"
+ "\x64\x3c\x90\xcc\x31\xd3\xf8\x3b\xd4\x71\xeb\xc4\x36\x89\x87\x7e"
+ "\x86\x3f\x56\x71\x2b\xc7\x06\x93\x67\xf7\x0b\x96\xaa\xfd\x28\x3e"
+ "\xdf\x1f\xa4\x9d\x32\x1e\xe3\xb6\x9d\x94\xf1\xc2\x4e\xb2\xb5\xac"
+ "\x90\xed\x3a\xac\x64\xd1\x4c\x8c\xaf\xe6\x63\x39\x03\x4f\x00\x6f"
+ "\xae\x8f\x79\xa3\x35\x7a\xce\xef\x29\x11\x9a\xff\x09\xb6\x45\x77"
+ "\xc6\xfc\x6b\xf6\xd3\xdc\xf6\xa8\x3a\x8b\x9a\x4f\xa1\x46\xc0\x6b"
+ "\xbc\x81\x6c\xa7\x68\xd7\x35\x81\x22\xe2\xfd\x8a\x9b\xfc\x6b\x0e"
+ "\x02\xf6\xae\x1b\x79\x2c\xd8\x0e\xfa\xa8\x31\x61\xd7\xb1\x40\xa4"
+ "\x8d\x5a\x20\xdf\x73\x8a\x85\x84\x83\x3c\x0f\xcb\xf6\xee\x72\x38"
+ "\x0b\x54\x0c\x06\xd9\xd6\xde\x7d\x3e\xbd\x1d\x81\xf3\x12\x5e\x61"
+ "\x00\x5c\x62\xb4\xc9\xa0\xb5\xe2\xaf\x5d\x6f\xf8\xd7\xec\x25\xee"
+ "\x1f\xce\x8f\xe7\xda\x40\x27\xf2\x9e\x49\xec\x17\xce\x83\x77\x1f"
+ "\x02\xee\x37\xfa\xf6\xaa\x79\x0f\xb5\x2f\x4f\xfd\x4e\x3e\x8f\xb6"
+ "\xd3\xb2\x0b\x34\x52\x6b\xfb\xbb\x6e\x63\x5c\xd1\x77\xd9\x81\x92"
+ "\x3f\xa7\xf6\x49\x85\xec\x83\xef\xb7\xb4\xca\x3d\xbb\xfa\x91\x73"
+ "\xa2\x9a\x50\xfa\xac\xfe\xb8\x06\x3d\x10\xc4\x95\x75\x81\xd4\x27"
+ "\xe3\xd9\x0f\xa8\xfe\x4f\xd6\x34\xd5\xbf\xdc\x16\xb6\x57\x52\xf5"
+ "\x71\xdc\x7e\xa2\x8d\x71\x35\xfa\x98\xbf\xe1\xa8\xf1\x9e\x30\xfb"
+ "\xdb\xf7\x38\x48\xf1\x9f\xf0\x01\xee\x87\xba\xed\x16\xd1\xc7\xb2"
+ "\x48\x97\x7d\xa4\x3c\x1f\x69\xf8\x06\x43\x7e\x0f\x17\x28\x7f\x6e"
+ "\x07\xeb\xa8\x46\x93\xd0\x79\xb3\xfe\xb8\x5e\x36\xac\x7c\x32\xea"
+ "\x6b\x51\x3e\xe5\xba\x94\x48\x87\xde\xf1\x42\x4d\xa3\x3d\x6c\x47"
+ "\x0a\xe8\x2a\x8c\x07\x03\x03\xe1\x4b\xfa\xf7\x33\x77\x3f\x08\x9b"
+ "\x7a\x20\x9f\x8f\x32\x70\xbb\xba\xbd\xbf\xdd\x23\xd4\xdc\x66\x77"
+ "\xbe\xb1\xb6\x24\x6c\xa0\xb1\xd7\x2a\xf8\xac\x24\x9f\x77\x09\xdb"
+ "\x2b\x73\x43\xf6\x9d\xc5\x4a\x6e\x76\x6f\x85\x9d\x2a\xf5\x6d\x41"
+ "\x84\xca\xb9\x5d\xbc\xb7\x8b\x79\xd3\x40\x6e\x33\xe0\x60\xfe\x53"
+ "\x3c\x49\x8d\xe7\x0a\x76\xbf\x6b\x3b\x46\xdb\xd0\x26\xd9\x36\xb4"
+ "\x51\xb6\x4d\xff\xbe\xd4\x29\x6a\x18\x29\xd7\xcb\xaf\xae\x3d\x2a"
+ "\xbe\x8c\xaf\x32\x97\xbf\x9d\x7b\x8a\x1a\xdf\x95\x67\x60\xd0\x27"
+ "\x6a\x1f\xa4\xa1\x44\x0c\x7e\x61\xf0\xd5\xc1\x6c\xc8\x55\x30\x77"
+ "\x16\xbf\xc4\xb1\x28\xf5\x6f\xd4\x01\xf6\x6b\xa2\x7a\x67\xb1\x3c"
+ "\x63\x88\xfa\xf8\x1b\x9f\x7d\x7a\xa8\x71\x14\xf7\xd5\xf8\xfd\x94"
+ "\xab\xf8\xb0\xf1\x0b\xbc\xd6\xac\xe6\x79\x0d\x47\xa1\x7b\xb7\xa9"
+ "\x39\x95\xe1\x47\x9e\x26\xfd\xc8\xe3\x75\xec\x55\xe2\x28\xf5\x9d"
+ "\xc8\xdc\x82\x39\x64\xc3\x21\x79\x56\x12\xf8\xae\x8f\x1a\xfa\xaf"
+ "\xe1\x10\xfb\x24\xf5\xfa\x03\x6c\x00\xaf\x94\xa9\x73\xe4\xdd\xde"
+ "\xc6\x3c\xc3\x46\x91\xdf\x24\xf3\x8a\xa3\x9c\x6f\xee\x86\x73\xd2"
+ "\x5f\xa0\x4a\xc6\x3c\x38\xad\x9f\xb3\x6b\x7c\x4a\x5f\xd7\x70\xb1"
+ "\x0f\x3f\xca\xd6\x06\xe9\x03\x79\x26\x90\x69\xc0\x75\x4b\xdc\xe5"
+ "\x77\xc1\x1a\x0f\xf4\xed\xfb\x34\xc8\xef\xa6\x2b\xbf\xd6\xc6\xa3"
+ "\x06\x8f\xa0\xbd\x03\x55\x6c\xd0\x86\xdb\x8e\x8c\x25\xc9\x03\x5d"
+ "\xc2\x31\xf8\x2b\xf5\xcc\x93\x8d\xa1\x78\x3a\xcd\x8d\x6a\x1e\xa5"
+ "\x83\x1a\xda\x84\x94\xf5\x86\xb6\xcf\xb6\x27\xf6\x4c\x37\x6c\x11"
+ "\x45\x67\x1b\xf4\xcb\xeb\x36\x49\x6b\x9f\xad\x8d\x63\xb4\x6c\x2a"
+ "\xe3\x98\x53\xaf\x0d\xe0\xd8\x5e\x51\x9f\x2d\x12\xe3\x33\x99\x18"
+ "\x67\x35\x9f\xdd\x72\xaa\x98\x4c\x05\xc5\xbc\xd7\xb5\xe8\x18\xcf"
+ "\xaf\x84\x07\xb6\x40\x26\xec\x13\xc8\xf9\xe6\x95\x64\x5d\x54\x08"
+ "\xd8\x1e\x57\x16\xc7\xde\xe2\xb8\x5b\x1c\x3b\x2f\xe6\x71\x65\xe2"
+ "\x7e\x38\xec\x39\x9b\xb0\xd9\x3a\xd8\x5f\x26\xe6\x15\xd0\xc7\x27"
+ "\x38\xfe\x97\x29\x10\x8a\xd0\xe6\x33\x64\xe1\xd8\x5e\xd1\xea\x45"
+ "\x1d\xad\xe1\x8f\xe4\xdc\x62\x68\x31\xec\x69\x4d\x9e\xcb\x71\x68"
+ "\xf6\x45\xc7\x42\xf6\x45\xc7\x55\xbb\xcf\x09\xd5\x6e\x85\x37\xe3"
+ "\xaf\x74\xdc\x30\x4b\x99\xc4\xfd\xdf\x7e\x14\x05\x7c\xcd\xe7\x30"
+ "\xc7\x7c\x0e\x52\x67\x39\x9b\xa9\xac\x44\x74\x04\x60\x1b\xb3\xff"
+ "\x26\x9f\xd7\x65\x7f\x1c\x6e\x23\xb7\x8f\xeb\xfe\xfd\xf9\x33\x32"
+ "\x56\x59\x14\xcf\x9e\x22\xbd\x4c\x27\xca\x74\x36\xd3\x25\x9f\x43"
+ "\xb6\xbd\x35\xac\xca\x16\xc8\x7b\x2e\x1f\x47\x07\xbd\xcd\xbd\x74"
+ "\x40\xdb\xb9\x7d\xdc\xfe\x28\xd3\x04\x34\xd0\xdb\xea\xe8\xd1\xdb"
+ "\xc9\x6d\xfc\x1d\x46\x9d\x9d\x68\x27\xda\x2a\xdb\xd9\x83\x76\x1e"
+ "\x2d\x24\x8a\xd4\x54\xce\xfb\x34\xd3\x41\x3c\x3f\xf4\xfc\x01\x76"
+ "\x74\xa9\x8f\x30\x0f\x34\xff\xb4\xcc\x67\xfa\x3e\x6c\x93\xb2\x10"
+ "\xe6\x83\x21\xd1\xc1\xf6\x7e\xa0\x18\xbf\x68\xbd\xb4\x71\xa4\x7d"
+ "\xcc\xdf\x88\x7d\x1a\x6d\xd2\x3e\xa1\xb2\x0e\xd1\x01\xdb\x34\x12"
+ "\x88\x22\x4f\x21\xda\x8f\xf9\xe3\x29\x1d\x7f\xce\xbb\xf9\x9f\xaa"
+ "\x5d\xd6\x22\xca\x7a\xff\xd1\x4a\x53\xa0\xad\x92\x8c\xb6\x2c\x46"
+ "\x3e\xb4\xc7\x01\x58\x43\xe4\x77\x19\xd0\xce\x5d\xc0\x33\x12\xd7"
+ "\xa6\x96\xce\x08\x60\xfe\x89\x06\xcf\xa3\xb4\x9d\x67\xd1\x8e\xb3"
+ "\xe4\xf0\x95\xc1\xfe\x7a\x88\xed\xc5\xd7\x3e\xbe\x36\x8f\x46\x05"
+ "\x69\x4f\x87\xe2\x3b\x19\x37\xe8\xba\xd3\xf4\xfa\x35\xbd\xb1\x81"
+ "\x38\xde\x9a\x7d\x51\x27\xf3\x91\x8c\x11\xc4\x63\x46\x37\x78\x86"
+ "\x7d\x69\xd6\xa3\x8e\x6e\xd7\x70\x89\x8f\x77\x22\xe1\x39\x03\xcf"
+ "\xfc\xcd\xa8\x2c\x5e\x13\x40\xb9\x0e\x01\x9a\x31\x7c\x51\xbd\xe8"
+ "\x38\x5f\x99\x86\x29\xcf\x9a\xfc\x8c\x72\x50\xc7\x21\x9e\xfb\x1e"
+ "\x28\x0b\x99\x9e\xfd\x19\x8d\xbd\x3a\x9d\xf2\x7a\x4e\x7f\xfa\x9b"
+ "\xf7\x2d\x18\x1e\xda\x96\x79\x9a\xf6\xde\x98\x28\x63\x4e\xa9\xcb"
+ "\x94\x1e\x7c\xbd\x9d\xf7\x0a\xae\xb2\x5e\xa9\xff\xd8\xe7\xe9\x2a"
+ "\xcb\x75\x18\x78\xe0\x7e\x6f\x7f\xb8\x5f\x3d\x1d\xf6\xe6\xf6\x07"
+ "\x6b\xfb\xcb\x32\x5e\x9c\x67\xc7\xcb\xec\x8f\x58\x99\x73\xc4\xc1"
+ "\x31\xbc\x31\x76\xee\x0d\xd3\xda\xdd\x64\xf1\x9c\xe1\x35\x99\xd9"
+ "\x74\xa4\x3e\x9b\x1a\x30\x27\x17\x5d\xae\xcc\x17\xcf\xb3\xef\x83"
+ "\xd2\x21\x6c\x93\xf2\x59\x4a\xb1\xd6\x65\xab\x7a\xd9\xb0\xe1\xdf"
+ "\xb8\xa6\xf4\x02\x99\xd4\x37\x52\xde\xb0\x4c\x73\x8a\x68\xad\x49"
+ "\x2b\xac\xe7\x98\x57\x99\x5e\xde\xb3\x2f\x34\xe2\x48\x49\xdb\xc7"
+ "\x0d\x99\xeb\x72\x0c\xde\xbe\x86\xc6\x72\xec\x3b\x6b\x48\xd9\x72"
+ "\x6a\xbc\x7e\x83\xc7\x14\x9b\xbe\xdf\x6f\x53\xb1\xa5\x5e\x2f\x6f"
+ "\x3c\x8f\xba\xd4\xfb\x95\x31\xcc\x61\x24\xdc\x35\x34\xaa\xfe\x3c"
+ "\xb9\xd8\x0e\x2a\xf8\x44\xd9\x6c\x3c\x2f\x9c\xdd\x69\x15\xb1\xff"
+ "\x72\xd1\xee\xd3\x7d\xb1\xf1\x42\x6b\x39\x9e\x9e\x70\xf4\xb7\x57"
+ "\x52\x35\x5c\xfa\xfc\xc8\x78\x2c\xea\x1b\x7a\x44\xb5\x35\x64\xe6"
+ "\x6f\xc6\xf2\x5a\x1e\xaf\x0d\xf3\xb9\x1f\x35\x86\xbc\xd1\x66\xc4"
+ "\x0c\xeb\x77\x1f\xd1\xa7\xe6\x3b\xda\x40\xcc\xbf\x42\xdd\x7e\xff"
+ "\x3a\x1e\x33\x7e\xe0\xe4\xb3\x46\x7d\x73\x9c\x1f\xa4\xf1\x3b\x4e"
+ "\x63\x5f\xf8\x5c\x49\xcb\x1f\xcc\xe0\x79\x8f\x3e\x67\x7c\xdf\xd9"
+ "\x9b\xa6\x6c\x18\x1e\xcb\x18\x87\x46\xb5\x8e\x3c\xb4\xdb\xfb\x83"
+ "\x65\xc6\x78\xc6\xe3\xba\xfa\x5e\xed\x0f\xdc\x41\x53\xf3\xac\x2b"
+ "\xe0\x67\xd3\xbf\xf7\xcc\xb1\x11\x72\x91\x7f\x9f\x31\xbe\xc9\xef"
+ "\x91\x54\xdc\x70\xef\xda\x0d\x34\x62\xfe\x17\x2c\x32\xf6\x06\x7f"
+ "\x77\x54\x8d\xbb\x3f\x38\xd6\xb7\x9f\x96\x2b\xe9\x2d\xbf\x35\xc8"
+ "\x73\x0c\x13\xc6\x60\x15\xff\xae\x53\x8d\xbf\xc6\x39\xf7\x1f\x9c"
+ "\xe9\xab\xe7\x87\xb6\xde\x71\x14\x75\xb0\x5f\x07\xc3\x57\xb6\xc9"
+ "\x0f\x9a\xb8\x0e\x9e\x5b\xa9\xf1\xf5\x07\x4d\x57\xb0\xc5\x5c\x4c"
+ "\x5f\x4d\x9f\x4f\x06\x3a\xff\xae\xe8\xeb\xa6\xf4\x09\xb5\xe4\x78"
+ "\xbf\x2c\x68\x1e\xaa\xe2\x38\x59\x4f\xd2\x0f\x97\xf2\x7b\xe6\x75"
+ "\xff\x78\x5e\x8b\xfb\xe1\x7b\x01\x1e\xb7\x7b\xf2\x32\xe6\xf0\x5c"
+ "\x5f\xda\xe2\x3f\xdc\x3f\x0e\xe5\x90\x96\xf9\xeb\xb3\x11\x73\xd5"
+ "\x46\x1a\xcb\xdf\xf4\x44\xba\x5c\x27\x08\x5d\xff\x64\xf7\x57\xb2"
+ "\xc8\xf1\x95\x5a\x3e\x0f\xf0\xc3\xe3\x98\x5f\xca\xb3\xe9\xb2\xfe"
+ "\x9a\x86\x3d\x1c\xfb\xef\xcd\x4b\xc1\x01\xaa\xaf\xf6\x3d\x8d\x67"
+ "\x57\xdc\xf3\x10\x63\x2d\x3f\x48\xfb\x8a\xe5\xde\x25\xfb\x3c\xaf"
+ "\xe2\xf1\xba\xc2\xd9\xe7\x27\xb4\xef\x69\x85\xcb\xbe\xa7\x8f\x14"
+ "\x13\xaf\x55\x1f\x6f\x90\x71\xbc\xf6\x4d\x0b\xd2\x0f\xb6\xea\xeb"
+ "\x31\xc7\x24\x5f\xb1\xbd\xfb\x1c\xcf\xc1\xfe\xee\xdf\x8e\x7c\x3c"
+ "\x4e\x14\xb8\x29\x57\xd9\xf0\x15\x39\x1a\xf8\x27\xae\xfd\x1f\xf1"
+ "\x5a\x5f\x4a\x9d\xb8\x93\x48\x96\xa9\xf6\x16\x4b\x9f\xb3\xea\xd7"
+ "\x78\x9e\x64\x11\xd5\x5b\x9d\xb8\x66\x80\xe7\xb2\x71\xe5\x31\xdc"
+ "\x85\x6b\x96\xa8\x6e\x08\x32\x5f\x62\x0e\xeb\xc0\x3c\xc1\xd2\x65"
+ "\xf7\x16\xf6\x77\x56\x91\x69\x13\xd8\xfa\x6d\x52\x3e\xb4\x3f\x5a"
+ "\xd0\x12\x82\x7d\xb6\x9b\x68\x6d\x54\x5c\x72\x7e\x89\xcf\x04\xfd"
+ "\x68\x81\x67\x37\xfb\xae\xfc\xc8\x95\xe8\xbb\xf2\xa3\x19\xf8\x55"
+ "\xe2\x77\x82\xe8\xc7\x19\xb8\x2e\xe8\xfb\xfd\x78\x46\xb7\xf7\x47"
+ "\x0b\x40\x47\x69\x63\x5d\x9d\x4e\xe4\xf2\xe8\x07\x9e\x17\xd9\x1f"
+ "\xb3\xa9\xf6\xee\x9c\x87\x67\x8b\xb0\x37\xf8\xf4\xf6\xe6\xe2\xd9"
+ "\xe6\xf4\x60\x5c\xb3\x83\x26\x37\xa0\xcd\xf6\xd7\x88\xdb\xcb\xf8"
+ "\x76\xd9\xb7\x3a\xe3\xcf\x69\x32\x4c\x6e\x7f\xc8\x8e\x72\xa0\xa5"
+ "\x18\x3f\xda\x6f\xd0\x53\xa7\x13\xef\x1b\x99\xba\x00\x43\xd9\x41"
+ "\xc8\x0f\x18\x46\xfe\x5e\xda\xdf\xc0\xdf\xd7\x40\x9f\x22\x1f\xe6"
+ "\xc4\x16\xe3\x0c\x68\xb7\xf7\xc7\xb9\x1f\x14\xa9\xfd\x03\x2e\x1b"
+ "\x8e\x2b\xcb\x31\x2f\x52\x95\x47\x9d\x16\x55\xe7\x56\xe7\x29\xfa"
+ "\xd1\xc3\xaa\xde\x1f\x4f\xec\x4f\x96\xca\x46\xc2\xbe\xab\x0f\x72"
+ "\x5c\x0c\xb6\x87\x26\x05\x46\x84\x29\x50\xaf\x61\xcc\xaf\x98\x97"
+ "\x5b\x26\xfc\xa7\xe8\xc7\x17\x5a\x23\x1d\x57\x39\x1e\xfe\x58\xfa"
+ "\x64\x89\x4b\xe5\x14\x28\xbd\x5d\x7e\xcb\xfa\x2c\xed\x1f\x1d\x08"
+ "\xc9\x98\xf0\x7c\x2f\x63\x8b\xb2\x9f\x06\x8f\x0d\x98\x63\xf7\xc6"
+ "\x54\xd4\x90\xb7\x81\xd3\x91\x16\x08\x87\x64\xec\xc5\x3e\x3f\x72"
+ "\xaf\x4b\xc9\xd4\x4f\x3e\x92\xf1\x17\x18\xdf\xe8\xfd\x7e\xc6\x59"
+ "\xf3\x79\x5d\xdc\x06\x0f\xe6\x7f\x81\x68\xb7\x9f\x65\xc2\xb9\x8e"
+ "\xd7\x0a\x7f\xf2\x2e\xf8\x4e\x68\xd5\x5e\xd7\xd5\xb5\xe1\x27\xf2"
+ "\x3c\x90\x27\x2a\xce\x86\xec\x5e\x17\xdb\x24\x55\x65\x03\x2c\x53"
+ "\xeb\x85\xbf\x2b\xb3\x62\x5e\xb7\xf7\x27\x27\x3e\x70\xab\xbe\xb9"
+ "\x4a\xb8\x27\x8c\xb6\x37\xe8\x6d\x47\x9a\xdc\x9b\x9b\x50\xa7\x62"
+ "\x4d\x06\x69\x7f\x56\xbf\x6b\x56\xe8\x67\xb6\x07\xd8\xc7\x55\xd1"
+ "\x62\xff\xb2\xde\xb1\xe1\xaa\xf0\xd8\xbf\xec\x73\xd4\xd1\xa3\xd7"
+ "\x71\xf4\xbf\x59\xc7\xd1\x2b\xd5\x01\xdd\x70\xe3\x69\xfa\xe9\x82"
+ "\xab\x9f\x3b\xfe\xd4\x29\x79\xc5\x57\x91\xab\x74\xe6\xcf\x3e\x8c"
+ "\x61\xfe\x16\xb5\xed\x9c\x27\xbf\x3b\x65\xa2\x72\x8e\xbb\x19\xf5"
+ "\x3d\x66\x6b\x71\x5f\x22\xff\xba\x3f\x52\x3b\xfd\x54\xc6\xba\x6b"
+ "\x29\xe1\x39\x5b\x83\xaf\xa7\xa6\x62\x4f\x8f\x69\xff\x5e\xa6\xf7"
+ "\x6e\xf4\xc3\xae\x38\x3e\x6b\x0d\xff\x91\x02\x4b\x78\x7d\xf5\x18"
+ "\xaf\x6b\xfb\x84\x7d\xe7\x3c\x0d\xba\x01\x36\x7a\x4c\xd2\x03\xf6"
+ "\x8b\x9a\x6f\x55\xe6\xc8\xf9\x56\x48\x9e\x4f\x1c\x22\xe3\x69\x7a"
+ "\x57\x87\x79\xed\x3b\xd6\x93\xe7\xec\xf6\xd2\x3c\x8e\xb3\xc9\xeb"
+ "\xce\xc2\xe6\xac\x9d\x1b\x4d\x17\x72\x3e\x05\xdb\x9f\xe3\x6c\x06"
+ "\xc2\x41\x8a\xc1\x8e\xae\xbf\x48\x59\xf5\xb0\x3d\xa1\xb3\x6d\xac"
+ "\xd7\x1b\xf5\x58\x9b\xdb\x2f\xf6\xc5\xda\x6c\xe0\xb5\x9e\x36\xdc"
+ "\x5f\x24\x73\xac\xba\x32\x67\xd7\x45\x1a\xb5\x7b\x1d\xb9\x76\xf1"
+ "\x5a\xde\x3f\x94\xed\xc3\x76\x85\x8c\xbb\xb9\xda\xc5\xeb\xf9\x7d"
+ "\xb6\xcf\x7a\x8e\x0b\xdc\xab\xb7\xcc\x72\x0d\xe4\xaa\xe8\xfd\x33"
+ "\x39\x0e\x46\x7d\xde\xe2\xa8\xed\x35\xea\xa9\xd9\xea\x44\x1f\x34"
+ "\x81\x7e\xb9\xa9\xfa\xd6\xf0\xc3\xaa\x8d\x8b\x95\xfa\xc1\x28\xa5"
+ "\xdf\x83\xf4\xa6\xa5\x3f\x9e\x88\xed\xca\xa3\x09\x9d\x94\xad\x7c"
+ "\x1a\xae\xc1\x98\xf8\x66\x11\xef\x9f\x97\x3d\x45\x8e\xd8\xae\xfc"
+ "\x34\xcf\x6b\x94\xce\xdf\x39\xe7\x5f\xd9\x3f\x45\xc7\x84\x22\xca"
+ "\xe6\xfd\x07\xf6\x7b\x70\x6e\x92\xf9\x27\x8f\x2a\xa5\xec\x78\xd8"
+ "\x33\x94\x63\xd4\x5d\xce\x99\xab\x1e\x5f\xfd\x54\xf1\xd2\x92\x95"
+ "\x8f\xad\x2c\x5a\x59\xb2\x41\x86\x50\x18\x2b\xff\xdd\x37\x7a\xd9"
+ "\x02\xb9\xe9\x1c\x67\x5f\x8c\xea\x5b\x8f\x7b\xf3\x42\x94\xd7\x0f"
+ "\xae\x8a\x5e\x6f\x4a\xfd\x57\x0f\x5b\xaa\x5e\xfa\xee\x1c\xb0\x04"
+ "\x4d\xbf\x97\xe7\x62\xb7\x21\x6d\x9b\xee\x63\x73\x4a\xcf\xa7\xf9"
+ "\x1a\x82\xe0\xe3\x49\x27\xe9\xe7\x51\xde\x0f\x41\x5f\x65\x07\x4a"
+ "\x4f\xf3\x5c\x72\x12\xaf\xf1\xb7\xf0\x5a\xc6\x1a\xce\x7f\x60\x33"
+ "\xfb\x30\xb0\x3f\x14\xf8\x70\xef\x49\xfd\x59\xff\x66\xfa\xae\xe8"
+ "\x6a\xc7\xde\xe8\x39\xc7\x0f\x84\xc8\xdb\x29\x56\x17\xee\x12\xe7"
+ "\x0a\x77\xc6\xc5\x7f\x1b\x88\xf2\xd5\x90\x93\x6f\xe0\x77\xbd\xf0"
+ "\xd9\x5d\x90\xbf\x11\xa7\xe9\xc0\x1b\x8c\xc3\xec\x42\x71\xae\x2f"
+ "\x16\xc2\x81\x77\xf1\xdc\x83\x9f\x26\x7c\x99\x33\xe2\xf6\xd7\xf8"
+ "\xdd\x47\x9c\xbf\x78\x05\xfb\x84\x1d\x38\xc3\x78\x89\x9a\xcc\xfb"
+ "\x43\x9e\xc2\x74\xe4\x8f\x29\x3c\xdf\xba\x26\xb0\xb5\x95\x9c\x8f"
+ "\xc9\x7b\x8b\xff\x09\xb6\xe7\xde\x7a\x4d\x98\x3c\x82\xf7\xe0\x02"
+ "\x1d\x51\x52\xe7\xd5\xde\x74\xb3\x0f\x42\x03\xec\xed\xfa\x4c\xb2"
+ "\xf9\x32\x29\xa3\xdb\xfb\xd6\xc4\x5e\xff\x0b\x9b\x1a\x6f\x79\xcc"
+ "\xe3\xd8\xd9\xd0\x47\xdd\x3c\x7e\x32\x1e\xcc\xc3\x80\xb9\x84\xf7"
+ "\xe7\xd4\xf9\xa8\xb7\x8a\x60\x5b\x3a\xae\x5e\x1f\xbf\x25\xbf\xa7"
+ "\x32\x61\x1b\x2d\xe1\x35\x6d\xde\x77\xe6\xd8\xd2\x90\xd7\x4a\x35"
+ "\xdf\xf8\xf9\x9f\xe4\xbe\x3a\x74\x0a\xef\x97\x34\x96\xc1\x4e\xb0"
+ "\x39\xb7\xb1\x7d\x13\xf5\x52\x39\xef\x6d\x6a\x17\xcf\x1c\xe0\xfd"
+ "\x68\x79\xb6\x50\xc6\x64\xff\x1d\x35\x5e\x20\x73\x3b\xbd\xc5\xdf"
+ "\xea\xb6\xf5\xd1\xf5\xe7\x77\x32\x0c\x51\x63\xf5\x5b\x4b\x4d\x95"
+ "\x0c\x43\xbb\x78\x36\xc7\x28\x07\xda\x0d\xe2\x72\xe0\x83\x1b\x65"
+ "\x39\xce\x2b\x63\xa2\xd8\xf2\x85\xcd\x5b\x2c\xeb\x54\xcf\xf3\x04"
+ "\xe4\x30\x7a\x31\x76\x00\xf7\x0b\x98\x4e\xb8\xe6\xc9\xb5\x5f\xcc"
+ "\xd7\x65\x2c\x1e\xdb\x62\x0a\x04\xff\xee\x97\xf8\xb0\x2f\x6e\x09"
+ "\x74\x96\xb4\x07\x7f\xfe\x74\xc3\x27\x64\x2e\x7e\x82\xfb\xef\x17"
+ "\x72\xdd\x1f\xfc\xb4\x4f\xe1\xf7\x8b\x01\x5d\x35\x0e\xea\xb2\x55"
+ "\x64\x87\x4d\x16\x3a\xe2\xe0\xb3\x03\x0d\xc1\x23\x8e\x4b\x98\x53"
+ "\xfc\xbc\x39\x68\xb6\xea\x67\x2d\x54\x39\xde\x27\x86\x9d\xda\x91"
+ "\xee\xb0\x79\xf0\xbe\xd3\xf0\xbb\x80\x4d\xda\xb1\x1d\xef\x40\xdb"
+ "\x26\xa6\x5b\x90\x0e\xe4\xb6\x16\xa9\xb3\x19\x78\x1e\xc8\xe7\xed"
+ "\x25\xad\x2b\x9e\xec\xb0\x6e\xf1\xf3\xf9\xcf\x1c\x6b\x34\xd7\xc4"
+ "\xfb\xc0\x7c\xee\x9f\x63\x21\xf0\xd9\x7f\x5e\xcb\xd3\xdf\x67\x27"
+ "\xbd\x1f\x6b\xbc\xef\xf6\xfe\x62\x99\x71\x66\x9f\x63\x2a\xb1\x8f"
+ "\x41\x4c\xf7\x15\x94\xb1\x86\xce\xab\x7d\x54\xf6\x15\xe4\x75\x44"
+ "\x3e\xf3\xc8\x7b\x9d\x28\x57\xdf\xeb\xbb\x29\xcf\xfa\xfc\x62\xbf"
+ "\xe1\x1b\x85\xfb\x43\xbd\x7e\x3d\xa0\x45\x97\xaf\xc2\x15\xb6\x35"
+ "\x04\xc3\x3e\x6f\x21\xde\x1d\x87\x3e\xec\x37\x16\x91\x9c\xfb\x71"
+ "\x4c\xe6\x67\xc8\xa4\x65\x3a\x0f\x71\x8c\x8e\x23\x61\xd2\xcf\x39"
+ "\x1f\xbc\x43\x3f\x13\x9f\x7e\x96\x7e\xf1\xcf\xbe\x3d\xc7\x98\xbe"
+ "\x5e\x76\x30\x5f\xd9\x6b\x07\xf3\xe5\x7a\x59\x4d\x85\xed\xf5\x8d"
+ "\x11\xd3\x81\x8d\x41\x93\x3a\xfb\x70\x70\x5e\x90\x0e\x6f\x35\xfc"
+ "\x56\x90\xcf\xd6\x5f\xec\x35\xe1\x1b\xb3\x4d\xc1\x7c\x5b\xae\x27"
+ "\xf6\xcd\x7f\xde\x96\xbe\x41\xbc\x3f\xa8\xf1\x58\x99\xf9\x98\x53"
+ "\xfa\x60\x14\x9f\xe7\x75\xb3\x81\x6a\x2e\xf6\xb6\xfe\x2d\x29\xe9"
+ "\xeb\x39\xec\x74\xe2\x73\x26\x3f\x2b\x9a\x1d\x0c\x1a\x6b\xf0\x3b"
+ "\x4c\x1a\xc7\xe5\x16\x9e\x3d\x22\x1c\x28\x0e\x13\xec\xb0\x50\x00"
+ "\x63\x2f\xea\x10\xc5\x6b\x38\x6e\xfe\xdb\xd7\x31\xed\x95\x4c\xbd"
+ "\xfd\xbc\xc4\xc9\x7b\x8f\xf0\xb0\xfd\x19\x62\x1f\x90\xf3\x84\x7c"
+ "\x76\xe4\x9b\xd2\x54\xda\xc9\x7e\x2c\xe5\x1c\xf3\xb0\x5d\xaf\x3b"
+ "\x64\x1f\xb3\xed\x2b\x19\xb4\xa4\xdb\xfb\x36\xec\xff\xe7\x72\xaf"
+ "\x5e\xce\xdf\x5e\x70\x25\x5b\x44\x8d\x8d\xb9\xd4\xdf\x7c\x86\xe7"
+ "\xab\xe3\x51\xff\x6c\xc1\xf8\xff\x72\x4a\xd4\x14\xa1\x1e\xd3\x20"
+ "\xf1\xd5\x72\x37\xf4\xc0\x20\x11\xdb\x88\xfe\xea\x72\xc0\xde\x6d"
+ "\xa6\xd6\x68\x93\xf4\x11\x81\x0c\x5b\xcb\xc2\xe2\x7c\x20\x7a\x50"
+ "\xfa\xf7\xaa\x73\xf0\xbf\xbc\x33\x10\x7d\x8f\x5a\x8b\x43\xe4\x5f"
+ "\xf3\x47\x8c\x59\xbf\x1c\xcd\x78\x8d\x2f\x2e\xa7\x71\x67\xf9\xfd"
+ "\xdb\xed\x6a\x9c\xfc\x65\xae\x7e\xb5\x71\x6c\xcc\x78\x9c\xee\x7b"
+ "\x66\xd5\xe3\x25\x2b\x57\xaf\x1a\x37\x6b\xf9\xba\xe5\x45\xce\x87"
+ "\x94\xcb\x5d\xc2\xf8\x65\xe9\x8b\xff\xfd\x4e\x06\x8f\x29\x6c\xab"
+ "\x70\x1c\xf0\x2b\xc5\x00\x37\xe2\x7f\xc3\x6e\x18\xc5\xeb\x7b\xff"
+ "\x9b\x31\xc0\x0d\x5b\x84\xe3\x7f\xf7\xad\x75\xbf\xd3\xdc\x2b\x03"
+ "\xda\xfb\xdd\xfc\xcc\x67\x3f\x35\xef\x2f\x67\xb1\x1c\x35\x48\xff"
+ "\xb4\x77\xa6\xc5\xc7\x4a\x62\x5f\x3c\x5e\x1f\x41\x7a\xbe\x71\xce"
+ "\x16\xbc\x88\x71\xe3\x9d\xa2\xbe\x73\x3f\xef\xb8\xd1\xdf\x87\x94"
+ "\xfc\xca\xbc\x95\xc6\x9e\xb0\xfe\xdd\x35\xb9\x87\xad\x79\x7b\x72"
+ "\xd5\x3a\xcc\x3b\xdb\x1b\xb4\x41\x16\xb5\x07\xf0\xce\x41\xe3\x4c"
+ "\x99\x92\xcd\xf7\x75\xd9\x7c\xa7\xf9\x4a\xfb\xf6\x7d\xb2\x71\xc8"
+ "\xd2\x27\xd7\x7f\xd5\xcb\x1e\xb2\x7c\xd6\x9e\xbf\x6e\x0f\x5f\x77"
+ "\x9a\xfe\xfd\x46\x5e\x9b\xc1\xfd\x97\x71\x3f\x40\x8e\xb5\xd2\xbf"
+ "\xfe\xdd\x8f\xf5\x7b\xd4\xf1\xee\x6f\xf5\xfb\x2f\xe2\xfe\x2d\xfd"
+ "\xfe\x06\xdc\xbf\xaa\xdf\x43\x66\xdf\xdd\xa2\xdf\x67\xe1\x7e\xa5"
+ "\x7e\x0f\x9d\xff\xee\x83\xfa\xfd\x70\xdc\xdf\xa9\xdf\x7f\x01\xf7"
+ "\x23\xf5\x7b\xc8\xe0\xbb\xd7\xe8\xfb\xa7\x16\xe0\x7e\xe1\xea\xed"
+ "\xf3\x43\x7e\xb5\x47\xf7\x2e\xc1\x16\xda\xab\xc6\x8c\xde\xb4\x2c"
+ "\xf0\xf4\x32\x83\xbe\x48\xe7\x98\x81\x16\xa4\x8f\x0d\xd2\x1b\xed"
+ "\x71\xe9\xfb\xf4\xfc\xd3\x30\xde\x04\xe3\xd2\xeb\xf5\xf4\x7c\xd8"
+ "\xa0\x96\xb8\x74\x9f\x9e\x5e\x02\xbd\x58\x18\x97\xae\xc7\x75\x78"
+ "\x77\x5b\x90\xf6\x38\xe2\xd2\xdd\x7a\xfa\x5e\xc3\x5f\x41\x4f\x2f"
+ "\xd2\xd3\x0f\x23\xfd\x68\x5c\xfa\x12\x3d\x1d\xfa\xff\x9d\xb6\xb8"
+ "\x74\xb5\xae\x20\xcf\xa2\x59\xc5\x91\x52\x96\xad\x77\x23\x41\xda"
+ "\x7d\x28\x2e\xcf\x0c\x55\xf6\xdf\x6d\x41\xaa\x8f\x6f\xcb\x24\x3d"
+ "\xdd\x15\xa4\x7f\xec\x89\x4b\xcf\xee\x4f\x57\xa5\xd5\xd1\x92\xfe"
+ "\xd6\x30\xf9\x3b\x55\xd2\x4f\x52\xda\x96\xbf\x5a\xce\xe7\xd4\xac"
+ "\xbb\xc5\x49\x67\x99\x10\x27\xe9\x57\xb3\x74\xff\xc0\x52\xf6\xd7"
+ "\x52\xe7\xfd\x7e\x35\x51\x9e\x01\x63\x9f\x73\x3e\x03\xb8\x91\xd3"
+ "\xfe\x5d\xc6\x3e\x99\xe0\x2e\x57\x31\x39\x95\xff\x69\xa7\x9c\xcb"
+ "\xeb\xfb\x9c\xc8\xf3\x31\xaf\x6d\x32\x1c\x5e\xef\x0b\x94\x5c\x92"
+ "\x3e\x91\x3c\x97\xe2\x34\x9e\xd3\xca\x73\x61\x71\x73\x2a\xa5\xf7"
+ "\x7f\xb5\x5c\xe3\x73\xfb\x5e\x35\xef\x67\x59\xe4\xfc\xec\x9b\x13"
+ "\x9f\x37\x48\xbf\x92\x73\xd3\x74\x87\xfd\xff\x74\x7b\x7f\x35\xad"
+ "\xef\xac\xd2\xbf\xd7\xeb\xe9\x7f\x42\x7a\x7e\x5c\x7a\x65\xff\xba"
+ "\x1d\xfa\xce\x66\xb3\xf4\x5c\x14\xe1\xe8\x45\x11\xd9\xf1\x17\xe0"
+ "\xbd\x42\x9e\xbb\xf9\x52\xcc\x67\x73\xe8\x31\x30\x3e\x8e\xae\x13"
+ "\x21\xe8\x6c\xfe\xc6\xc4\xb5\x73\xc2\x21\x9a\x53\xdc\x2d\xb6\x3f"
+ "\xc6\x7e\x76\x17\x64\x3c\x28\x4f\x27\xc7\xdf\x66\xdf\xad\x30\xef"
+ "\x0f\x65\xb4\x62\x8c\x6b\x58\xc1\xef\x3f\xa2\xd9\x85\x21\x6a\x29"
+ "\x8c\x51\x03\x60\xef\x7e\xcc\xf0\x9b\xfc\x55\x6f\xfc\x1f\xc6\x81"
+ "\xeb\xf3\xc8\x6f\xc5\x1c\x1e\xc7\xb8\xf2\xb7\xf0\x44\xf5\x6b\x36"
+ "\xf1\x1b\xb6\x65\xbd\xd9\xd6\x2d\x84\x39\xd5\xe1\x1c\xdc\x3b\xd5"
+ "\x0f\xef\x90\xde\x5f\x9b\x94\x2c\x1f\xd6\xfd\x31\x6d\x95\x4a\x5f"
+ "\x1c\x2e\x11\xff\xc6\xe7\x8e\x0e\xf3\xf9\x27\x0b\xec\xe6\x94\xfe"
+ "\x57\x9b\x77\x93\xa9\xa7\x06\xb6\xc9\xd9\x43\x26\xa5\x9f\xde\x5b"
+ "\xa6\x99\x2c\x5b\x78\x5d\x51\x7e\x27\xa2\xc6\x79\x74\xff\xaa\x88"
+ "\xa9\x65\x63\x3b\x6d\xfa\x02\x39\xf2\x23\xec\x4b\x7e\xf8\x93\xa1"
+ "\x25\x1c\x5b\xb4\xc2\x06\x3b\xd4\xf4\x0b\xbc\xff\xf5\xaa\x43\xa6"
+ "\xa8\xb4\x57\xde\x5b\x26\xd7\xa2\x7c\xce\x7a\x1e\x43\x02\x6d\x31"
+ "\x3e\x7b\x24\xed\x64\xe8\x7f\x4b\x6c\x7d\x61\x66\x74\x6d\xe1\xb5"
+ "\xbb\xd7\x50\x46\x6c\xad\x2b\xeb\xc5\x8b\x94\x63\x8c\x3f\x98\xc3"
+ "\x66\x8b\x6e\xc7\xe0\x2a\x8c\x29\x3c\xc7\x1d\x9a\x66\x93\x7b\x6e"
+ "\x7c\xaf\x99\x5e\x1f\xd5\xb0\xee\xca\xdf\xbc\x89\x61\x6e\xcb\xb1"
+ "\xa7\x19\x97\x54\x6d\xdd\xb6\x13\xf3\x65\xfd\x9c\x6c\xd9\x27\x34"
+ "\x1c\xf3\x16\xd3\xd0\x0b\xc2\x7f\xba\x88\x4c\xfc\x9d\x90\xb2\xe5"
+ "\x72\x1d\x69\x40\x4b\x61\x94\x02\xee\x3f\x53\xd9\x1a\xee\xa3\xf7"
+ "\xde\x65\x3b\x8d\xfd\x26\x91\xdf\x76\x9a\xde\xfb\xad\x35\x82\x31"
+ "\x23\x02\x5b\xfa\x09\x9e\x13\xbe\xf7\x51\x58\xc6\xbe\xfd\xb5\x93"
+ "\x7d\xc7\xfd\x6b\xee\xe5\xb4\x4f\x3d\x9f\x48\x1f\x89\x72\x25\x5b"
+ "\xef\x1d\xe7\x67\x0f\x9f\xdb\xcd\x1c\xdd\xf4\xb3\x4b\x91\x01\x6a"
+ "\xad\xe2\xff\x63\xef\x7b\xe0\x9a\xb8\xb2\xfd\x6f\x02\x5a\x6a\x51"
+ "\x02\x8d\x94\x2a\x6d\x63\xd7\x3f\xa9\xff\x4a\xf7\xd9\xb7\x6e\xab"
+ "\x5b\x6a\x75\xd7\xf6\xf9\xaf\x5d\xed\xc6\xfa\x0f\x2d\x6c\xd1\xf5"
+ "\x4f\x44\x44\x44\x04\x8c\x96\x47\xbb\x8a\xd1\xa2\x8b\x16\x11\xf7"
+ "\xe9\x2e\xed\xfa\x87\xdd\x67\xdf\xd2\xae\xd5\xd8\x62\x0b\x16\x08"
+ "\xb5\xd8\xa2\x05\x9b\x52\xb4\xc8\xa2\x8d\x10\x25\x60\x32\xf3\x3b"
+ "\xe7\xde\x99\x4c\x26\x24\x60\xac\xd6\xee\xef\x3d\x3e\x1f\x3e\x93"
+ "\x3b\x73\xe7\xce\x9d\x7b\xce\xfd\xde\x73\xce\x9c\x7b\xce\xfb\xa7"
+ "\x85\xf5\x81\x30\xfd\xeb\xfd\x6a\x5f\xbc\xcb\x19\xd5\x5a\x1e\x63"
+ "\xa3\xe7\x39\xc8\x14\x1b\x6f\xa1\xdf\x33\x31\x5e\x41\xf2\x53\x26"
+ "\xfe\x9a\x91\xb0\x3d\x76\x47\x77\x70\x5b\xd4\x5a\x16\xaf\xf2\xe8"
+ "\x16\xc2\x7c\x91\x60\x8d\x54\x8f\x66\xb6\x5c\xf5\x44\x66\xdb\x54"
+ "\xeb\xd6\xf7\x43\x5f\xe5\xa3\xb9\xad\xa1\xea\x78\x38\x2e\x6e\x0d"
+ "\x1b\x3a\xcd\xf7\x7a\x14\xaa\xd3\x3c\x48\xd4\x68\x53\x47\xbf\xe3"
+ "\xdd\xcc\xdf\x18\x9e\x71\x2c\x8f\xdf\x42\xaf\x3d\x54\xaf\x27\x01"
+ "\x4c\xdf\x3b\x7a\xf1\xd1\x3c\xa2\x81\xbe\xf6\xe6\x55\xea\x20\xea"
+ "\xe3\x65\x54\x47\x98\x9b\x79\x13\xfa\x16\xb2\x6f\x1f\xc7\x0a\xf9"
+ "\x50\x75\x10\xab\x7f\xec\xe7\x95\xcd\xf0\x0e\xaa\x7b\x6b\xcc\xf6"
+ "\x4b\x82\x4c\x78\x0c\x78\xff\xde\x1a\xde\x78\x6f\x23\xdb\xff\x7e"
+ "\xec\x35\x11\x57\x19\x8f\x1e\x5b\xcb\xc6\x2d\x54\xc7\xc6\xed\x58"
+ "\xa1\xb0\x5e\x3d\x84\xbf\x61\xed\x8e\x62\xdf\xea\x8f\x25\x8a\x32"
+ "\xb2\x45\xa8\x83\xf7\xc0\x6f\x1d\xc3\xda\x63\x39\xf0\xee\xc2\x1e"
+ "\x86\x63\xf4\x7b\x21\xbc\x1f\xac\x59\x47\xab\xf0\xbd\x7c\x61\x2b"
+ "\x1d\x8b\x54\x12\x00\x7d\xc6\x3d\xfa\xe8\x8b\x6c\x33\xdb\x9e\x32"
+ "\xb1\x5c\x96\xc7\x1f\xa3\xfb\x80\xe1\x39\x40\x1f\x25\xe2\x26\xee"
+ "\x5b\xc6\xf6\xa4\xfe\x9b\xfa\x8a\x7d\xc1\xe7\xe1\x35\x78\x57\xcc"
+ "\x89\x07\x63\x75\x2f\xd5\xad\x91\xae\x17\xf4\x68\xe3\xb8\x0a\x63"
+ "\x86\xfe\x42\xc7\xa3\x71\x4c\xd8\x98\x1d\x77\xe5\x3c\x67\xe3\x75"
+ "\x3c\x54\x3e\x1e\xac\xcc\xa9\x00\x1b\x12\xd0\x6f\xe4\x78\xb4\x30"
+ "\x7e\xcd\xc2\xf3\x69\x1e\x4e\x76\xcd\xb4\xcf\xed\xde\x07\x5c\x75"
+ "\x59\xde\x54\x25\x7e\x83\x45\x9b\x3c\xe3\x57\x53\x95\xdb\x7d\x55"
+ "\xf3\xae\xa0\x8c\x1c\x52\x83\x79\x2e\x71\xcc\xdb\x0c\xa6\x06\x69"
+ "\xbc\x59\x3b\x5e\x9e\xf1\xa0\xf8\x0c\x0b\x31\xed\x15\xfb\x09\xbf"
+ "\x85\x35\xf8\xb8\x56\xa2\x89\x69\xa2\x78\x5f\x3e\xdd\x4b\x74\xcc"
+ "\x86\x7b\x20\xbd\xe2\x20\x7e\xfb\x81\x51\xa9\x74\x3c\x65\xa2\xfc"
+ "\x48\x8e\x17\xa0\x4f\x2c\x8c\xab\x9d\xf1\xd0\xf1\x0d\x6c\x2d\x3c"
+ "\x5e\x80\x6d\xe2\x77\x15\x16\xef\xf4\x78\x2e\xb4\x2b\xe4\xea\x3e"
+ "\xbe\x5f\xe8\x03\xe8\x7f\x47\xf7\x7a\xea\x75\xe3\xe6\xc7\xd2\xcd"
+ "\xbe\x23\x56\xea\x3d\xf7\x15\x05\x49\xfb\x3a\x8f\x37\xba\xed\x8b"
+ "\x2d\x62\xe3\xfd\xc1\x28\xd0\x53\x0f\x67\xb3\xb8\xb8\xc5\xd9\x40"
+ "\xb3\xf4\xab\xa4\x1f\xe6\x87\x49\xd3\xf3\x4d\x95\x7a\xd0\xad\x55"
+ "\x1a\xcc\x6f\xd4\x98\x76\x95\xf4\x42\x9f\x0b\xc4\x1b\xb4\xf7\xf0"
+ "\xa1\x70\x7e\x8b\xa6\x51\xda\x7b\x57\x62\x01\xdd\xb6\x70\x13\xe8"
+ "\xb2\xe9\x97\x48\x3f\xe6\x43\xf1\xc1\x72\xc1\xee\xb3\x93\x33\x6a"
+ "\x9a\x71\x5f\x67\x25\x68\x84\x7c\x7a\xfc\x4e\x6e\x8b\x06\x78\x51"
+ "\xe3\x48\x5f\x42\xc2\x70\x7d\x43\x5f\x5d\xc6\x33\x25\x26\x68\x17"
+ "\xf7\xeb\x16\x70\xbc\x4e\xc1\xab\x06\x44\x73\xaa\xc1\x59\x9b\x38"
+ "\x42\x7d\xc4\x81\xcf\x94\xf5\xe4\x83\xe3\x7c\xe8\x80\x68\xcc\x5b"
+ "\x89\x36\x1f\xb3\x1d\xfa\xb9\x65\x40\x34\x5c\xeb\x03\xd7\xd0\xde"
+ "\xc3\x61\xfc\x35\x8c\xe7\x0e\xed\xd3\xf5\x93\x37\x0e\x88\x66\x7d"
+ "\xb7\xd2\xba\xf5\xe4\xc3\x01\x58\x47\x8c\xeb\xc6\xa5\xeb\x02\xf0"
+ "\x3a\xee\x13\x76\x62\x5e\x04\x90\xce\xd9\x3d\x35\xae\x7b\x04\xf9"
+ "\x19\xe6\x72\xc9\xbb\xfc\xd6\xa1\xf1\x50\xb7\x18\x7d\x52\x99\x2c"
+ "\x5b\x72\x58\x98\xeb\x20\x1f\x97\xbc\x23\xfc\x0e\x76\xd5\x4d\xd7"
+ "\x91\xb4\x76\x12\x41\xbf\xab\xae\x0a\x00\xec\x2d\x09\xc6\x1c\x0b"
+ "\x6e\x6d\x7e\x8d\xed\x6d\xc4\x78\x71\x71\x24\x18\x70\xf9\x1e\xe8"
+ "\x37\xe6\x47\xf9\x1a\x6d\xb5\xc2\xd8\x58\x80\x4e\x45\x9b\x59\x4c"
+ "\xc0\xc3\x9b\x80\xf7\xd3\xd6\x82\x3c\xb0\x96\x04\xaf\x75\x92\x48"
+ "\x7c\x4f\xa0\x5b\x23\xfa\x55\xa3\xee\x86\x63\xc3\x68\x38\x60\x36"
+ "\xbc\x4b\xec\xda\x78\xbe\x61\x6d\x33\xdf\x58\x11\x5f\x43\x60\x9d"
+ "\x09\xab\xd4\x57\x61\x6c\xf2\xaf\xf1\x5d\xd1\x46\x09\x63\x0a\xf2"
+ "\x0a\x3c\x63\xcb\x80\x58\xdc\x2b\x43\xed\x04\xca\xe3\xc5\xe2\xbe"
+ "\xa2\x7c\xba\xf7\xa8\x24\xca\x65\xfb\x4a\xe2\x4b\x84\xbe\x94\x72"
+ "\xf8\x3b\x89\xee\x4f\xec\x85\xfa\x0f\xda\x34\xe6\xad\x2e\x70\xed"
+ "\xd1\x60\xb6\x81\x92\xc5\x6e\x71\xb9\xe8\xbd\x68\x23\xc0\x7b\xa7"
+ "\x3a\xf8\xab\x9b\x85\xba\x78\xef\xd4\xd5\xf3\x78\xbc\x17\xee\x29"
+ "\x70\xdd\x23\xdb\xe3\xf3\x21\x93\x2b\x60\x6c\xf1\xb7\x15\xc6\x52"
+ "\xf0\xa1\xd2\xb0\xef\xdf\x25\x35\xe2\x37\x67\x0b\xf9\xc0\x88\xfc"
+ "\xe4\x3d\x9e\xf8\x09\x22\x8f\x91\x74\xa2\x0a\xe3\x37\xc1\xf9\x08"
+ "\x31\x96\x11\xfc\x1e\x08\x6d\x31\x39\xdb\x2d\x46\x59\xb6\x5b\xbc"
+ "\xc3\x74\x2b\xff\x0d\xf2\x09\xe0\x4a\x40\x13\x39\xa1\xe7\xb7\x0c"
+ "\xce\x62\xfb\xa4\x4e\x1c\xc7\x7e\xd6\x93\x13\xb8\x17\x3d\x84\xc5"
+ "\x52\x38\xb1\x4e\xc0\x8f\xe4\xa9\x4e\x47\x88\x05\x9e\x89\x7b\x7e"
+ "\xdc\xca\xc9\x80\x27\x2a\xa8\xf7\x57\x16\x0f\xf0\x84\xde\xa3\x3e"
+ "\x5e\xcf\xf0\x28\x47\x7b\x94\x35\x36\x98\x37\xbe\xbe\xad\x6f\xea"
+ "\x47\xed\x87\x79\x7d\xd6\x11\x7d\xfa\x45\x12\x00\xbc\x72\x1e\xfb"
+ "\x56\xd9\xd8\x8c\xef\x14\xc2\x1b\xa2\x08\xda\x40\xa9\x6c\x09\x6b"
+ "\x7a\xfd\x40\xa8\x73\x91\x84\xa3\xdf\x37\xe6\x48\x81\xfa\x4d\x2c"
+ "\x8e\xf9\xc7\x33\x67\xaf\xec\x45\xb8\x57\x74\xf7\xf0\xca\xe7\x73"
+ "\xf1\xdb\xde\x81\x0e\x4b\x0f\xfc\xce\x95\xb6\x03\x78\xd2\x49\xc2"
+ "\x81\xc7\x1a\x30\x1f\x1d\xdc\xd3\xfc\x5f\x1d\x8d\x3d\xcc\x8e\xb3"
+ "\x44\xbf\x88\x28\x9b\xc8\xc7\x93\x02\x53\x49\xe0\xe6\x0b\x44\x05"
+ "\x74\x75\x7c\xe8\x18\x4d\xc4\x58\x08\x79\x61\x6c\x1f\x77\x1e\xe0"
+ "\xeb\x8a\x08\xde\xde\x66\xf8\xa8\x10\x74\xaf\x1c\x51\xc7\xde\xc8"
+ "\xf2\xa0\x04\xc2\xf3\xfb\x2a\x85\xb8\x0f\x6c\x6c\x3f\x3a\xcf\xf6"
+ "\x59\xa9\x5f\x81\x7b\x6a\x25\xf9\xfb\x63\x96\x6b\xdc\x38\x78\x3f"
+ "\xc3\xbe\x8f\xe3\x3f\x04\x09\x7e\x03\xf3\x51\x50\xb7\x19\x3e\x0e"
+ "\x72\xf9\x28\x50\xbb\xd5\xc7\xf1\x40\xc3\xfd\x4c\x36\x1f\xbc\x7f"
+ "\x9e\x33\x48\x98\x83\x78\x3e\xa4\x06\xef\x85\xfb\x42\x6c\xd4\xc6"
+ "\xf4\xf1\x78\x89\xd7\x3e\x0e\x46\xcc\x87\x77\x0a\xb6\x90\x8f\x32"
+ "\xf0\xbd\x70\x4c\xa0\x5e\x20\x94\x37\x7c\xb8\xd7\x47\x5c\x58\x95"
+ "\x2a\xcb\x41\x6d\x20\xeb\x83\x80\x9f\x2e\x01\x0d\xee\xc5\xd8\x4f"
+ "\x66\x78\x4e\x45\x7e\x07\xa9\x88\x68\x25\x95\xf0\x1b\x7d\x91\x4d"
+ "\x8b\xbe\x21\x0d\x1a\xef\xeb\x0d\x07\x7a\x04\xc8\xda\x11\xd8\x16"
+ "\x62\x01\xfa\x6f\x99\x53\x61\xfd\xb1\x42\x5b\x0d\x84\xb6\x51\xc1"
+ "\x35\x92\x8a\x64\xd4\xb3\xf6\xa8\x2a\xf3\xcf\x92\xca\x88\xcf\xe8"
+ "\x73\x50\x26\x34\x25\xb4\x76\xd5\xb6\x16\xda\x1e\x2d\xb4\xdd\x0c"
+ "\x6d\xab\x7d\xb7\x6d\x88\xf2\xb3\x6d\x3f\xfa\x6d\xd0\xf8\xd3\x36"
+ "\xac\x33\x1b\x31\xcf\x0d\xee\xeb\x4a\xbb\x9f\xf4\x76\x5e\xc3\xb8"
+ "\x9f\x0f\xf1\xcc\x1f\xb6\x6c\x2c\xdd\xfb\x65\xa0\xfe\xc6\x59\x74"
+ "\x0f\xd8\x65\x42\x7d\x1a\xd9\xbe\xaf\xf3\x04\xfd\x21\xda\x0c\x65"
+ "\x5a\x49\x57\x72\x7d\xa7\x02\x59\xb5\x6c\x12\xf3\x7b\xd4\x64\x31"
+ "\xbe\x2a\xc3\xb8\x91\x3e\xf4\xbc\x01\x87\x99\xff\x6c\xd9\xab\xa2"
+ "\xfd\xa5\x35\x74\xc0\x61\xa1\x2d\x8d\xa7\x5d\x4f\x4c\x48\x1b\x97"
+ "\x9c\x28\xe6\xb6\x4d\x14\xb6\x9f\xbe\x10\xf7\x72\xdc\xc2\xa4\xb8"
+ "\x58\xcd\xf4\x95\x09\x4b\x47\x2c\xfb\xed\x6f\x35\x93\xe3\x56\xac"
+ "\x98\xff\x4a\x5c\x2f\x32\x3d\x61\xfe\xd2\x15\x0b\xd1\xf6\xa6\xd1"
+ "\x8c\xff\xb7\x79\xf1\xcb\x12\x47\xfc\x62\x7c\x94\x87\xed\x0d\xf7"
+ "\x2a\xd6\xa2\x0c\x0e\x6b\x47\x78\x9a\x93\x84\x62\x1c\x9f\x90\xd5"
+ "\xbc\x69\x0d\xe8\x7f\xc0\x7f\x4d\xb8\x4e\xe1\xda\x80\xba\x01\xc6"
+ "\x10\x04\xfc\x2e\x7f\x73\x3b\x5f\x75\x81\x7c\xe9\x04\xb9\xb2\x66"
+ "\x37\x8b\x87\x57\x0b\x3a\xb9\x95\xe5\x5b\xfc\xf2\x0c\xc6\xba\xfb"
+ "\x3d\x9c\xb3\x86\x0e\xde\xbf\xf9\x1c\x09\x84\x75\x0d\xf4\x92\x93"
+ "\xb9\xbc\xf2\x2e\x7e\x63\x38\x5f\xc2\x7f\x13\x41\x84\x18\xe2\x4a"
+ "\xb3\xc5\x8e\xdf\xf3\x83\xa6\x3a\xd2\x79\xc4\x53\x36\xb7\x4e\xee"
+ "\x60\xe3\xa2\xd6\x32\xbf\xe2\x2f\xdf\x45\x1d\x66\x3d\xcd\x87\x79"
+ "\x12\xe6\xff\xfb\x7a\x09\xa7\x3f\x2b\x11\x64\x47\x8c\x4d\xb8\xaa"
+ "\x1e\xca\x2c\xce\xc8\xc9\x6a\xb9\xaf\x46\x39\xac\xcb\x5f\x34\xb2"
+ "\x7f\xbc\xa7\x26\x88\xfd\xe3\x6f\xf7\xff\x2f\xf3\xd8\xbf\xe7\xf9"
+ "\xef\xfb\x2f\x3e\xff\x66\xef\xaf\x4e\xed\xfa\xff\x46\x9e\x8f\xc7"
+ "\x3b\xf9\xfe\xdf\xe7\xfe\xea\x0d\x5d\xfd\x23\xbf\x01\x6f\xd5\xfe"
+ "\xfe\x1c\x09\x02\xfe\xcc\xd9\xb4\x00\x78\xba\x8e\x44\xa4\x3a\xf8"
+ "\x86\xf4\x39\x24\x32\xed\x22\xc1\x7c\x84\x8d\x89\xc9\x7c\x43\xda"
+ "\x35\x94\x49\xab\x67\x00\xff\x16\x67\xd7\x93\xe0\x4d\xf5\x44\x55"
+ "\x99\x88\xb9\x8a\x31\xd6\x17\xe0\x4c\x33\xfc\x43\xb9\x3c\xc9\x4e"
+ "\x3e\xb1\x5e\x41\xff\x26\x53\x65\x0c\xe0\x4e\x2d\x21\xc8\xbf\xc1"
+ "\x31\x44\x9d\x17\xce\x1f\xe1\x0d\xcb\x60\x3d\x5b\x86\x79\x09\xab"
+ "\x0f\x71\xd1\x3d\x0e\xa5\x94\xf6\xd0\x2c\xc0\x35\xbe\x62\xa6\xc0"
+ "\x9b\x27\xd8\x9e\xa2\xcf\xe8\x7e\x06\x98\x27\xd5\xcc\xae\x5e\xfd"
+ "\x34\x5b\xcf\xab\x43\x05\x7b\x13\xfc\xfe\x8c\xca\x8a\xf0\x1e\xc5"
+ "\x98\xbf\x15\xdb\x3c\xc8\x15\xd3\xfc\xad\x87\x52\xa2\x7b\xa4\xce"
+ "\x27\xca\x4a\x4b\x13\xc1\xdc\x4e\x98\x0b\x14\xe6\xdd\x7e\x98\x67"
+ "\x45\xbb\xc2\x79\x23\xf4\x6f\x63\x7e\x38\x9f\x05\x7d\x2a\x6c\x33"
+ "\x54\x94\xc2\xda\x73\x44\xf8\xee\x62\x82\x79\xb1\x7f\x13\xd4\x99"
+ "\xba\x92\x3c\xb4\x09\xea\x65\x43\x3d\x94\x93\x59\xff\x3e\xdd\x04"
+ "\x63\x70\x18\x9e\x59\xa5\x99\x8b\x65\x33\xf5\xbd\xc1\x67\xc3\x7b"
+ "\x68\xea\x89\x39\x02\xd6\xb6\x40\x7c\x86\xf8\xdc\x36\x43\x25\xe0"
+ "\x5f\x69\x22\xfd\x76\x06\xe7\x59\x3b\x95\xd3\xd9\x7c\x1d\x80\xb1"
+ "\x01\xc4\xfc\xba\xc1\x9b\x52\x60\x4d\xef\xa0\x31\x30\x73\xd0\xde"
+ "\x82\x32\x06\x95\x2b\x9c\x24\x84\xd9\x07\x40\xb6\x88\x07\x1c\x00"
+ "\x79\x82\xfa\x42\x83\x2c\x01\x7d\xc9\xc1\x3c\x8f\x78\x1d\xf4\xb6"
+ "\xc3\xb0\x2e\x17\xa1\x1c\x30\xf7\xea\x73\x04\x6d\xec\x98\xa3\x75"
+ "\xc5\x6c\xde\xce\x72\xe6\x54\x1e\x16\x65\x01\xc4\x20\x5c\xff\x41"
+ "\x16\x0e\xbc\x0e\x34\x04\x1e\x28\x05\xd9\x22\xb4\x89\xae\x1c\x74"
+ "\xec\x4b\xe9\x9a\x9f\x44\x63\x36\x07\x30\x8c\xae\x74\xc2\xfb\x05"
+ "\xc3\x33\x60\xcc\x6a\xa9\x2d\x9c\x61\x8c\x39\x58\x5c\xc7\x51\xe7"
+ "\xb5\x40\x1b\x3c\x60\x99\x70\x0d\xde\xff\x84\x98\xeb\x0e\xe4\x8a"
+ "\xca\x23\xc2\x98\x95\xb3\x6f\xc8\x66\xaa\xfb\x83\xcc\xb5\x5f\x18"
+ "\x9b\x52\x94\x2b\x84\x7b\x5d\xfe\x8f\xa8\x97\x73\x20\x57\xe0\x78"
+ "\xe1\x38\x41\x3b\xa5\x02\x8e\x55\x33\xf9\xe5\xd3\x95\xc2\x77\x4b"
+ "\x23\xd0\x7a\x83\x34\xfe\xe6\x42\xf7\xf1\x87\xfb\x05\xbd\xf1\xd3"
+ "\x01\x6e\xb4\x03\xdd\xa8\xca\x8e\x76\x52\xe8\xe3\x11\x66\xe3\x31"
+ "\x7f\x8d\xb1\xd2\x30\x36\x33\x8c\xf1\x91\x8d\x18\x07\x18\xb0\x79"
+ "\xfd\x39\x82\xdf\xbe\x41\x7e\xaa\xfa\x9a\xc9\xa7\x55\x19\xc8\xc3"
+ "\x50\xa6\x76\xf8\x06\xe8\x17\xb6\x07\xe5\xe7\xe1\x08\x72\x6c\xd5"
+ "\xb3\xee\xf9\x94\xa5\x5c\xca\x55\xd1\xd2\x7e\x04\xf3\x62\xa6\x3f"
+ "\x9b\x17\xa3\x0d\x8c\xd6\xbf\x1e\x8f\x7d\xab\xc5\x79\x29\xbe\x2b"
+ "\xe6\x55\x86\xf3\x28\xfb\xd7\x22\xdd\xc4\xf3\x18\x43\x18\xe8\x14"
+ "\x0c\xcf\x3a\x23\xf4\xe9\x30\x94\x83\xa0\x3c\x90\xda\xf7\xaf\xd3"
+ "\xfd\xe6\xb5\x9b\xd2\xa4\x7b\x70\xde\x00\x0f\x87\x40\x9d\x4f\xe1"
+ "\xc8\x8b\x75\x59\xee\xe5\x2a\xdd\x1b\x1d\x68\x03\xab\xd2\x8b\xb9"
+ "\x97\x31\xef\x32\x62\xc6\xa6\xb9\xb2\xb1\xc7\xb1\x41\x3a\x53\xbe"
+ "\xfb\xd0\x51\x0c\xe3\xfd\x29\xc8\xff\xef\xe9\xd8\x7b\x55\xe9\x84"
+ "\xfe\x99\x58\xfc\x94\x32\x23\x8d\xf7\x4b\xf5\xa1\x4f\xa3\x5d\xfa"
+ "\x90\x4b\xb6\xac\xd2\x21\x4f\x42\x5b\xe5\x48\x7f\x94\x13\xa1\x5e"
+ "\xbc\x8b\xb7\xe8\x7e\xdf\xaa\x46\x94\x2f\x85\xfe\x23\xbf\x94\x09"
+ "\x63\x67\x74\x9f\x77\xee\xf3\x1c\xda\x00\xfd\xff\x63\x17\x0f\x88"
+ "\xf3\x9a\xf1\xc1\x29\x21\xf7\xd3\x7a\xcc\xbd\x56\x05\xed\x9a\x50"
+ "\x06\x67\xeb\xea\xa9\xc3\x1f\xd6\x3a\xd0\x86\x5e\x0d\x65\x98\xdf"
+ "\xa7\x8c\xad\x61\x43\xf5\x1b\x28\x6e\x9c\x82\xf1\x79\x94\xe6\x2a"
+ "\xc1\x71\x11\xe7\xeb\xe6\xb9\xa8\xfb\x45\xb1\x39\x9b\x0c\xdc\x60"
+ "\x6f\x26\x82\xaf\x3f\xcc\xd9\xf3\xf8\xed\xb4\x09\x78\x28\x08\xe7"
+ "\x2f\xd0\x17\xf9\x19\x31\xa7\x6a\xc3\x76\x3a\x6f\x83\x71\xde\x5e"
+ "\xc7\x18\x12\xf0\x9c\x92\x98\x68\xf2\x61\xb2\x89\xce\x63\x8c\x1f"
+ "\xf2\x26\x8c\x1d\xe6\x39\x86\x67\xa7\x8a\x3e\xca\xc8\x23\x18\x2f"
+ "\x44\xe0\x93\x12\x9c\xcb\xc2\xd8\x05\x42\xbd\xbd\xe2\xdc\x73\xa3"
+ "\x3f\xad\xe3\x31\xdf\x42\xd8\x7c\x3b\x55\x2d\x8e\xb5\x83\xce\xe3"
+ "\x2a\xbd\x03\xe6\xb1\xfb\x98\xe2\x78\xe2\xb8\xb6\x19\x3e\x83\xf7"
+ "\x2f\x8d\x10\xc7\x54\x1a\xcf\xcf\x96\x0b\x34\xaf\x62\x36\xa6\xcf"
+ "\x46\x09\xf6\x27\xd7\x18\x0a\xfc\x87\xeb\x40\xf1\x7a\x7c\x77\x58"
+ "\x1b\xf0\xf9\xc8\x23\x6f\x0a\x98\x55\x62\x45\x1e\xf9\x0c\xe6\xff"
+ "\xaf\xb5\x12\x76\x54\x25\x52\x9d\x05\xe8\xc4\xe8\xf3\xd9\x2e\x1a"
+ "\x6f\xc3\x0b\x76\x58\xc8\xa7\xb3\x25\x7c\xfa\x6c\xbf\x38\x0e\x22"
+ "\x4f\x8a\xf3\x1e\xda\x68\x97\xe3\xcf\x67\x75\xd0\x46\x18\xe2\x9b"
+ "\x24\x43\x7d\xd6\x2c\xc7\xb7\xcf\xaa\x11\xdf\x90\xaf\xf5\x49\x68"
+ "\x63\x63\xeb\x95\x85\x54\xa4\xca\x31\xa9\x62\x39\xf3\x0d\x60\x32"
+ "\x17\xf2\x96\x7e\x2e\xab\x8f\x6b\x18\xd4\xa7\xba\xb8\xb0\xe6\x95"
+ "\xe0\x1a\x07\xe7\xe2\x85\xf1\xaa\x85\xfa\x25\xb8\x6f\x12\x63\x25"
+ "\xdc\x53\xcb\x74\x3d\xc0\xe9\x23\x18\xbf\x1b\xea\x69\x2b\xe1\x69"
+ "\xd7\x33\x19\x76\x8b\x58\xc1\xbf\xac\xbb\x67\x55\x23\xb9\x5b\xff"
+ "\x0b\xfe\x9b\x0b\xe4\x34\xee\x67\xb5\x63\x0c\x49\x68\x5b\x73\x81"
+ "\x7c\xf1\x29\x3c\x57\x2d\x1c\x23\xe0\xf8\x2e\x1c\xef\x87\xe3\x1e"
+ "\x38\xf6\x87\xe3\x6b\x50\x9f\x13\xea\x47\x41\x79\x39\x9c\xff\x37"
+ "\xe1\x08\x7d\x3c\x8d\xf2\xe6\x34\x41\x76\xc4\xf3\x13\xb0\x0c\xc7"
+ "\xc7\x05\x9a\x97\x33\x9a\x9f\x1e\x01\xed\x24\x43\xff\x6b\xcc\xb5"
+ "\xb4\x2d\xfd\x05\xf2\xf9\x55\x6c\x1b\xf7\x31\xc3\xef\xb7\xdc\x64"
+ "\x50\x68\xe7\xf4\x69\x38\x8e\x82\xe3\x0e\x38\x26\xc2\x71\x89\x30"
+ "\x06\x55\x88\x0d\xb1\xc9\x74\xcc\xa9\x9e\xc0\x9e\xc7\xe6\x3c\xae"
+ "\xc3\x12\x76\x54\x96\xc6\xce\x66\xf4\xb6\x90\x53\x94\x0f\xa0\xee"
+ "\xd3\x58\x17\x8e\xcf\x08\xc7\x68\xe1\x38\x41\x38\xfe\x4a\x38\x8e"
+ "\x17\x8e\x13\x2d\xe4\xb4\x5e\x90\x31\x60\x5c\x4e\xd3\x7d\x86\x30"
+ "\xb7\x4b\xd8\x33\x3e\x37\xa2\x8e\x0c\x38\xfe\x38\xb4\x1f\xd0\x66"
+ "\xf8\x3c\x50\xb4\x8f\xa2\xcd\xe7\xba\xa1\xec\x2f\x6f\xd2\xef\xda"
+ "\x9f\x47\xba\x61\x5b\x6a\xb0\x22\x9a\x80\x0c\xd4\x37\x4f\xc9\x0b"
+ "\x71\xf5\x3e\x4f\x54\x0a\xdf\x85\x85\xdc\x00\x01\x18\x2f\x8f\xea"
+ "\x43\xa1\x3b\x93\x71\xae\x52\xdb\x31\xc6\x76\x0b\x1d\x9c\x01\xff"
+ "\x1b\x41\x37\x30\x8a\xf8\x8d\x7a\x0f\xd3\xd5\xef\xfa\x0c\x9e\x95"
+ "\x25\xe9\xea\x9f\x8f\x66\xdf\xd0\xee\x5b\x0e\xe7\x0b\xa4\xf3\xa7"
+ "\x71\x3f\xc0\xe3\x30\x9e\x35\xf0\x3e\xa3\xea\xc9\xe7\x18\xc3\xff"
+ "\xa7\x0d\xec\x9d\xa3\xc4\x77\x16\xe8\xa1\x17\xc7\xb7\x81\x9c\x4e"
+ "\x06\x2c\x4c\x40\x1e\xae\x77\xe1\xec\x69\x6a\xd7\x15\x78\x04\x68"
+ "\x79\xfa\x31\xa4\xa9\xdb\x1c\x74\xc7\x20\x75\x9b\xe1\x0b\xad\x1c"
+ "\x53\xcc\x5a\xc4\x14\xe4\x0d\xc0\x6f\xa4\x75\x90\xc7\xfc\xab\xc6"
+ "\xf9\xc7\xe6\xdd\x17\xb1\xf2\x7b\x3f\xab\x76\xb0\x79\x57\x03\x7c"
+ "\x06\xfc\x59\x8d\xf9\x21\x00\x87\xbe\x18\x2f\xcc\xe9\x1a\x98\xd3"
+ "\x8f\xc3\xf9\x2a\xd6\x57\x76\x5e\x78\x16\xf0\x59\x35\xbe\x77\x7f"
+ "\xf1\xbc\xf0\xbe\xd8\x0e\xc6\xfc\xbf\x5f\x3c\x2f\xb4\x0f\xfc\x58"
+ "\x5d\x8c\xf3\x44\x3c\x2f\xbc\x13\xc8\x51\x5f\x38\x44\x3c\xd9\xc8"
+ "\xf8\x6d\x83\x78\x1f\xd2\x0d\xe3\x63\x31\x1b\xff\x17\xb8\xb7\xa2"
+ "\x00\xd7\x87\xf5\x73\x49\xf0\xaa\x5c\xd2\x9b\xcd\xcb\x2f\x1a\xe5"
+ "\x18\x79\xb6\x8c\x37\x84\x38\x78\xd5\xe0\xe4\x0a\xc7\x28\x51\x5e"
+ "\xcd\x6b\x33\xd4\xc4\x8a\x79\xbe\xa5\x3c\x03\x35\x3b\x2a\x0a\x5c"
+ "\xe3\x0b\x7d\xa9\xc9\x12\xfb\xe2\xb6\x3e\x53\x1a\x60\xdf\xb0\xad"
+ "\xf5\x20\xaf\xdb\x00\x17\x18\x6e\xd7\x14\x5b\xc8\x3d\xa2\xbc\x4b"
+ "\xd7\xad\x10\x05\xd1\x67\x27\xd1\xef\xa3\x21\xb8\x36\xa2\x8f\x0f"
+ "\x87\x76\xac\x64\x27\xa9\xd4\x83\x2e\x9f\x7c\x9e\xcc\x5b\xdd\x0b"
+ "\x63\xaf\xe8\xa0\xaf\x07\xa0\x6f\x7b\x9d\x68\xfb\x5f\x8a\x7a\xea"
+ "\xd9\xf9\xce\x24\xde\x2e\x8c\x19\xcc\xa3\xb3\x13\x84\xb1\x45\xfc"
+ "\xda\x8b\x98\xbe\x3e\x8d\xe5\x0c\x42\x5b\x0e\xce\x8f\x37\x70\x1d"
+ "\x8b\xe0\xed\x25\x79\x38\x57\xce\x4c\x14\x65\x52\xe8\x6f\x01\x93"
+ "\x09\x4f\xed\xa3\xb1\x89\x8c\x83\x93\x99\x2d\xf0\xcc\x69\xf6\xee"
+ "\x67\x8e\xb0\xef\xdc\x34\x46\x26\x96\x0b\x03\x22\xc2\xbf\x60\x7e"
+ "\x59\x65\x1f\x31\x9f\x92\x33\xb9\x2e\x9f\x12\x49\x56\x34\xb1\xb8"
+ "\x51\x67\x0e\x4b\x73\xe2\xcc\x06\xbc\x0f\xee\x6f\x82\xf3\xe5\xd2"
+ "\xf9\x53\x7b\x05\x7b\x57\x6a\x9f\x75\xd1\xe8\x5b\xd6\x17\x63\x6d"
+ "\xb3\xe7\x9d\x1d\x4e\x9f\x4f\x6d\x1e\x30\x37\x85\xf9\x8b\xe3\x8c"
+ "\x6b\x36\x9d\xc3\x30\x7f\x71\x1e\x5f\xdf\x32\x38\x03\xfe\xd9\xbc"
+ "\x65\x6b\x33\xdd\x3f\xc0\xe6\xec\xd9\x31\x6e\xfd\xb0\x51\xbb\x17"
+ "\xd2\x73\x4d\x44\x30\x5c\xd3\xc1\xba\x5a\x25\x5c\x63\x39\x25\x9a"
+ "\x68\x8c\x3c\x2b\x7e\xdb\xc6\x6f\x9d\xb8\x47\x2b\x04\xb8\x1b\x63"
+ "\x82\x88\xdf\xaa\x27\x37\xa7\xf3\x4e\xfc\xee\x74\x8d\xb7\x19\x5d"
+ "\xb1\xfe\xcf\xee\x95\xe2\xfb\x9c\x09\x14\xde\x2b\x19\x9e\x95\xc7"
+ "\x7c\xc1\x6a\xae\x32\x99\xaa\xc6\x86\x7c\x6a\x06\xde\x83\x63\x2e"
+ "\xcb\xcb\x7c\xd6\x22\xf2\x1e\xcc\xcb\xd8\x0b\xe4\xcb\xe5\x39\xe1"
+ "\x7c\x2e\xd0\x34\x17\xe6\xd2\x62\x28\xcf\x81\x63\x2c\x3b\x2a\x54"
+ "\x78\x14\xe6\x48\x6e\x9b\xe1\xcb\x48\x31\x1f\x3d\x8e\x8d\x2d\xd4"
+ "\x90\x81\x7c\x96\x0d\xe3\x80\xbc\x46\xbf\x23\x43\xbf\x91\xbf\x90"
+ "\xcf\x90\xc7\x42\xd6\x3d\x47\xf9\x8c\xc6\x1f\x80\xf3\xd8\x5f\xe4"
+ "\x33\x68\x2b\x5e\x8c\xf3\x6b\x21\x5f\x06\xb3\xef\x39\x5f\xa6\x8a"
+ "\x3e\xb7\xf8\x2d\x29\x71\x00\xe9\x0b\xed\x02\x48\xd3\x58\x9a\x5f"
+ "\x99\x1d\x13\x08\xd6\xc5\xef\x70\x0c\x27\xef\x2b\x81\x7b\x8a\xa4"
+ "\x31\x37\xd3\xdc\xcc\x1f\xce\xa6\xb6\xc8\x7b\xe1\x5a\xb9\xbb\x9e"
+ "\x61\x21\x27\x73\x51\xd7\x40\xdf\xbe\x9f\xa8\x09\x7e\x07\x06\x1c"
+ "\xfb\xd2\x2a\xca\xb5\x8f\xaa\xf1\x7b\xfe\xc9\xf1\xd0\x3f\xd4\xa1"
+ "\xab\xe0\x77\x14\xe8\x92\xa5\x3e\x6c\xc6\xa3\xd0\xd6\x23\xe4\xe7"
+ "\xa9\x45\x3b\x16\xe6\x33\xb8\x40\xbe\x5a\x5e\x81\xb1\x40\x96\x75"
+ "\x8e\xf3\x9c\x96\xcc\x5f\xc5\x58\xcf\x9a\x04\x72\x6f\x3d\xf9\x6a"
+ "\x3a\xda\x8d\xd2\xaf\xa0\x8d\xa6\x36\x59\x6e\xa3\xa9\x2d\x15\xfe"
+ "\x41\xd3\xae\x8b\x76\xfb\xaf\x12\x8e\x93\xba\xf9\x6f\x14\xea\xc2"
+ "\x9b\x9e\x13\xd6\x94\x08\x98\x27\xb5\x2e\xfb\x2f\xf2\x25\xce\x6d"
+ "\xf4\xe3\x40\x9b\x93\xc2\x41\x30\xf6\x08\xd0\x09\xfa\xbd\x7e\xe8"
+ "\x0b\xa6\x14\xe4\xa3\x3a\xba\x0f\x0a\x63\x10\xfb\xe7\x4b\x54\x47"
+ "\xe9\xc9\xe2\x81\xd6\x56\xc1\xb3\xd5\x9b\x2f\x93\x40\x7d\x02\x79"
+ "\x00\xed\xdf\x21\x4e\xde\x84\x3a\xae\x10\x53\xb0\xaa\x89\xd4\x7d"
+ "\x9a\xb8\x96\x28\xe1\xfa\x43\xf0\xdb\x24\xca\x49\x70\x8f\x2a\xc0"
+ "\x4e\xd4\x28\x1f\x3d\xb3\x96\x3c\xd4\x66\xa8\xcb\x13\x69\x85\x32"
+ "\x04\xda\xe1\x04\x5b\x02\xf4\xb5\x96\xfa\x38\x63\x9c\x7a\x0b\x1d"
+ "\x37\x8a\xc3\xd8\x06\xe8\xb0\x75\x59\x01\x36\xa2\x62\x6b\x4f\x1d"
+ "\xf0\x7f\x99\x20\x33\xd6\xed\x05\xde\xaf\x76\xeb\xe7\x2f\xdd\x7e"
+ "\x67\xe2\xfd\x21\x36\x94\xcf\x7c\x8d\xcf\xb9\x11\xe2\xf8\xa0\xbf"
+ "\x6a\x08\xe8\x09\x94\xde\x0e\xbe\x19\xfa\x56\xae\x4f\x21\x41\x4d"
+ "\xe4\xab\x07\x76\x6f\xa7\xfb\xec\x4a\x99\x7d\xfe\xab\x50\x51\x0f"
+ "\x67\xfd\x3e\x57\x17\xb2\x2e\x80\xa0\x5d\x1d\xe3\x9d\x51\x5f\xbf"
+ "\xef\x22\xa8\x2d\xdd\xec\x18\x43\x4c\x69\x4f\x60\x1d\x51\xae\xaa"
+ "\x6d\x4d\x8f\x20\x1f\x46\x8c\x81\x79\x7c\xae\x10\xe6\x4a\x89\xff"
+ "\x3e\x95\xe7\x0a\x85\xf1\x2d\x67\xbe\x08\xe7\x56\xe3\x5a\x82\xba"
+ "\x3f\xac\x23\x25\xb8\x46\xb7\x19\xbe\x0a\x14\xe7\x0d\xac\x1b\x25"
+ "\x70\x8f\x10\x0f\x1b\xbf\xff\x9e\x4b\xc4\x18\x10\x54\x6f\x60\xf5"
+ "\x83\x99\xcd\xff\xab\xd1\x2e\x59\x1a\xea\xe1\x7d\xcc\x47\xed\xdc"
+ "\xa4\x79\x4e\x05\x8c\xe9\xb9\x49\xf8\x6e\x02\x2f\xc2\x7a\xf5\x55"
+ "\xbc\x34\x6f\xeb\x28\x36\x7f\xd8\xec\x3e\x2f\xbf\xca\x92\xf4\xcd"
+ "\xda\x31\x23\x72\x88\xd7\xf8\x9d\xfa\x3e\xb8\x56\x7d\xd5\xbe\x79"
+ "\x33\x5f\x60\x54\x72\xe3\xd6\x67\x93\x60\xc5\x46\x18\x36\x9c\x67"
+ "\x49\x31\x7d\x2f\x10\xcb\xdd\x21\xc1\xf7\x4d\x7b\x26\xf1\x2e\x3e"
+ "\x2d\x82\x28\x37\xb5\xdc\x15\x34\xc0\x7e\x5f\x01\x1f\x30\xf4\x85"
+ "\xc9\x89\x76\xa2\x59\x64\x24\xdf\x2e\x26\x01\xcf\x38\xe1\xd9\xc1"
+ "\x44\x6f\x21\xf5\x6a\xdc\x33\xfa\x61\x30\xca\x1f\xf5\x6a\x6c\x33"
+ "\x35\x8f\x04\xa5\x36\xf0\x8d\x1b\x7f\xdb\x23\x08\xd6\x03\xd5\x9b"
+ "\xc0\x63\xf7\x04\xdf\x57\x70\x1d\xda\x38\x1e\x43\xef\x2b\xf2\xdd"
+ "\x37\xcb\x36\xef\x7d\xd3\x87\x43\xdf\xf6\xf9\xd7\xb7\x6f\x0e\x4b"
+ "\x7d\xfb\xe6\xf0\xf7\xef\xdb\xd7\x8f\xb9\xf5\x4d\x25\xf5\x2d\x1e"
+ "\xfa\xf6\xf5\xd3\xfe\xf5\xed\xfc\x74\xa9\x6f\xe7\xa7\xdf\x60\xdf"
+ "\xf6\x77\xd1\xb7\x0a\xef\x7d\x4b\xbe\x0f\xfa\x56\xe7\x5f\xdf\x2e"
+ "\xd8\xa4\xbe\x5d\xb0\x7d\x9f\xbe\xa1\x2e\x9f\x16\xc9\x9f\xa7\xf1"
+ "\xe4\x13\x58\xbc\xd6\x0b\xe4\x9b\xb1\x69\x79\xb4\x1c\x76\x81\xd4"
+ "\xb7\x0b\xf3\xdb\x9a\x6e\xe3\xbf\x61\x72\x4e\x7d\xdc\x48\x3d\xfa"
+ "\xbb\xd6\xcf\x06\x5e\x56\x33\x9e\xfe\x86\xfa\x37\xa4\x5b\x79\xc1"
+ "\xdf\xb4\xfe\xd5\x7c\xea\x8f\x32\x2c\x42\x28\x97\xb6\x86\x0d\x3e"
+ "\x8c\xbe\x20\x1c\xcc\x67\x3e\x6c\xb0\x09\xf3\x77\x1e\x4a\xb0\x2a"
+ "\x79\x03\xc6\x0e\xc3\x78\x7f\x81\x84\xdf\x3a\xb8\xea\x50\x82\x9d"
+ "\xe6\x0e\x5f\x4f\xf7\xfb\xd6\x9b\xc4\x3d\x6e\xe2\x33\xac\xa1\xc3"
+ "\x22\xe0\x7c\x8d\x98\x07\x96\x57\xa2\x3c\x33\xb8\x18\xdb\x87\xf3"
+ "\x56\x31\x37\x2b\xf0\xfb\x06\x01\x1b\x6c\x21\xf6\xae\x70\xef\x9b"
+ "\x41\x22\xee\x3d\x93\x48\x42\x30\x2f\xe5\xe6\xb4\xbb\xf0\x9b\x23"
+ "\xb4\x55\x7f\x18\xc7\x7d\xaa\xed\x2e\x3e\x24\x95\x04\xe0\xde\x3e"
+ "\xf4\xd1\x33\x47\x58\xc9\xc0\x54\xd2\x63\x6a\x32\xb4\x69\x27\x31"
+ "\x21\xc9\xd0\x1e\x8c\x35\xd3\x0d\xbe\xa1\x36\xbe\x1c\x68\x0f\xbf"
+ "\x7f\x07\x24\x92\xe0\x67\x22\xd2\xf9\xf5\x3b\x48\x20\xee\x03\xc4"
+ "\xfd\x7c\x6c\x2f\x5f\xcf\xa0\x36\xc3\x37\x05\xe2\xfb\xdd\x00\x7d"
+ "\xfa\x30\xfa\x34\xd4\x49\xf4\x69\xd8\xd1\x99\x3e\x0d\x3d\x18\x7d"
+ "\xbe\x71\x48\xf4\x39\x1f\x2d\xa7\x4f\xc3\x20\x39\x7d\x1a\xe2\x6f"
+ "\x8e\x3e\x0d\x31\x12\x7d\xd8\x33\x18\x7d\x1a\x92\xbd\xd3\xa7\xc1"
+ "\x28\xd1\xa7\x61\xe0\x8d\xd1\xa7\xe1\x84\x6f\xfa\x34\x4c\xef\x82"
+ "\x3e\x3d\xbd\xd3\xe7\x7c\xdf\x1b\xa7\xcf\xf9\x68\x3f\xe8\xd3\x9b"
+ "\xd1\xe7\xc2\x5a\x89\x3e\x17\x7e\xde\x99\x3e\xe7\xf7\x31\xfa\x9c"
+ "\xcf\x93\xe8\x73\xc1\x22\xa7\xcf\xf9\x13\x72\xfa\x5c\x08\xba\x39"
+ "\xfa\x5c\x20\x12\x7d\xd8\x33\x18\x7d\x2e\x44\x78\xa7\xcf\x85\x28"
+ "\x89\x3e\xe7\x4b\x6e\x8c\x3e\x17\xe2\x7c\xd3\xe7\xbc\xcd\x7f\xfa"
+ "\x5c\x78\xc7\x83\x3e\x2a\xdf\xf4\xb9\x60\xf1\x83\x3e\x21\x8c\x3e"
+ "\x8d\x0f\x48\xf4\xf9\xf6\x4c\x67\xfa\x7c\x3b\x81\xd1\xe7\xdb\x31"
+ "\x12\x7d\x1a\x33\xe4\xf4\xf9\x36\x4e\x4e\x9f\x6f\x0b\x6f\x8e\x3e"
+ "\xdf\x16\x48\xf4\x61\xcf\x60\xf4\xf9\xb6\xd8\x3b\x7d\xbe\xad\x92"
+ "\xe8\xf3\x6d\xec\x8d\xd1\xa7\xb1\x87\x6f\xfa\x7c\x9b\xd3\x05\x7d"
+ "\xee\xf2\x4e\x9f\xc6\x19\x37\x4e\x9f\xc6\x8c\xae\xe8\xe3\x9f\xac"
+ "\xd7\x98\x83\xcf\xbd\x05\xed\xd4\xfa\x6a\x07\xc7\x0e\xfd\x0f\x39"
+ "\x43\x63\x6d\x3e\xd7\x33\x88\xed\xd1\x68\xcc\xd1\xa4\x90\xa7\xea"
+ "\xc9\xc5\x47\xf2\xb9\x1e\x41\xbc\xa1\x10\xf4\xa4\xb7\x73\xf9\x75"
+ "\x3d\x03\xb9\x75\x77\x05\xe2\xde\x6c\xdf\xf9\xdb\x2f\xbe\x16\x70"
+ "\x3f\x79\x10\xf7\xd1\xad\x07\x79\x19\x7f\xb7\x19\x2e\xe6\x80\x2c"
+ "\x18\xdd\xd5\xfe\x2d\xf4\x75\xfa\x70\x03\xea\xb7\x17\x4d\xae\xb8"
+ "\x18\x06\x3e\x19\xe3\x8b\xe9\x1f\xc6\x7d\x16\x17\x1b\x73\x68\xbc"
+ "\xaa\x01\xe3\xa3\x1f\xe6\xbf\x42\xdd\xe3\x02\x69\x3a\xcf\x6f\x19"
+ "\x30\x1e\xf9\x01\x64\xf5\x7b\x9b\x48\x53\x94\xcb\x3f\x8f\xd7\xed"
+ "\x14\x6c\x84\x56\x56\xb7\x79\x06\xbf\x45\x63\xc5\x3c\xa4\x2b\xd2"
+ "\x30\xbf\x66\xf3\x58\x90\x7d\x07\xe3\x33\x30\x76\xd2\x6e\x38\xa2"
+ "\x9f\x0c\xf3\xcd\x6c\x9a\x46\xe5\xe5\xf5\xfd\x77\x32\x5f\xb8\xe6"
+ "\x41\x22\xdf\xc1\x73\x7a\x41\xb9\xb7\x20\xcf\x63\xfd\x7b\x9a\xc8"
+ "\x3f\xaf\xba\x5d\x0f\x86\xf2\x19\x68\x3b\x54\xb8\xde\x1b\xca\xef"
+ "\xa3\x9c\x4d\xe3\x7c\x64\x67\x08\x3e\xc4\xff\x2c\x80\x73\x2a\xa1"
+ "\x4e\x28\xd4\x79\x15\x65\x77\xa1\x8d\x30\x28\x2f\x44\x1d\x58\xb8"
+ "\xae\x86\xf2\x64\xfc\x76\x20\x5c\xef\x0b\xe5\xc7\xa0\x3c\x84\xed"
+ "\x79\xb9\x2e\xcc\xd1\x26\xc7\xcd\xed\x19\x6f\xa2\x39\x35\x91\x06"
+ "\x4c\x17\xf8\xa7\x9b\xff\x4f\x53\x83\xc7\xb5\x18\xb7\x6b\xd5\xe2"
+ "\x35\xe6\xa3\xf6\xcf\x54\xb7\x6b\x25\x1e\xd7\x72\xdd\xae\x1d\xf6"
+ "\x68\xf3\xb0\xdb\xb5\xbd\x1e\xf7\x55\xb9\x5d\x33\x7a\x5c\x6b\x76"
+ "\xbb\x96\x21\x5c\x0b\x68\x33\x34\x07\x4a\xdf\xf0\x9a\xf4\xc2\x79"
+ "\x25\x9c\x8f\x74\x3b\x1f\x23\x9c\x87\xe7\x37\x8f\xb2\x90\x37\xad"
+ "\xc2\x79\x4a\x7b\xd6\x7e\xf3\x24\xb7\xf6\xa3\x98\x8d\xa3\x39\xc6"
+ "\xe5\x3b\x17\x36\x44\xc5\x5d\xd7\xed\x84\x6b\x11\xc8\x57\xee\xbc"
+ "\xbd\x34\x49\xb3\x60\xe5\x2b\x9a\x84\xb8\x44\x74\x5f\x59\xb2\x30"
+ "\x51\xb3\x64\x59\x6c\x9c\x2c\xce\xba\x1a\x63\x0e\x62\x4e\x35\x8c"
+ "\xdd\x42\xf3\x17\x6c\xe7\x1b\x5d\x39\x3f\x00\x57\xe1\x59\xe5\x16"
+ "\x32\x81\x3e\x2b\x87\xc5\x23\x2f\xc5\xd8\x2f\x2c\xce\x0b\x79\xae"
+ "\x9e\x34\x7f\x2a\xc4\x79\x31\x41\x5d\xbb\xef\x38\x2f\x97\xab\x69"
+ "\x7c\x43\xa8\xc7\xe2\xbc\x5c\xae\x81\x79\xfe\x0c\xdf\x8b\xe5\xf0"
+ "\x60\xb9\xcd\x2e\x89\xb2\x89\x75\x5e\x3b\x8d\x11\x98\xc1\x6c\x19"
+ "\x9e\xf1\x5a\x07\x0c\xc4\xfb\x84\xef\xa5\x03\xdd\xee\x8f\x65\xd7"
+ "\xc5\xf5\x41\x78\xa6\x71\x00\xc6\x8f\xe8\x55\x0f\x65\x6a\xbf\xa7"
+ "\xd7\x2e\x31\x5b\xde\x96\x01\xc3\xf1\x9d\xf0\xbd\xe5\xef\xa6\xfc"
+ "\x4d\x3d\xb9\x74\x40\x7a\xb7\x4b\xd5\x6e\xb1\xe0\x84\x77\xb8\xe4"
+ "\x60\x73\xb4\xd3\xbb\x52\xff\x44\x5e\x35\x60\x38\x3e\x1b\xf1\x8c"
+ "\xed\x65\x80\xf2\x96\x01\x5a\xb1\x3f\x6e\xfd\x1b\x8e\x7a\x3d\xf4"
+ "\xef\x0c\x1d\x13\xa0\x29\x0f\x34\x15\xde\x61\x07\x6f\x68\x4e\x65"
+ "\xb9\x0c\x60\x3d\xc1\x9c\x2c\x74\xad\xba\x1c\x2b\xda\x32\x71\x8d"
+ "\x62\x36\xcc\xcb\x92\xfc\x87\x31\xba\xb6\x88\xeb\xd7\x65\x37\xf9"
+ "\x8f\x3d\x13\xce\xed\x75\xe7\x21\xb7\xe7\x7d\x8a\xcf\x83\x7a\x93"
+ "\xd8\x7e\x80\x01\x5a\x9c\xef\x50\x56\xa1\x2f\x26\xde\x8b\x7d\xf4"
+ "\x95\x87\xcf\x57\x0c\x45\x69\x1c\xbf\x8b\x14\xc7\x31\x87\xee\x91"
+ "\xff\x6e\xb8\x68\xaf\x13\x72\x60\x98\x72\x5c\x79\xa9\xbf\xd3\xd1"
+ "\xdc\x6e\xc6\xfc\xc6\x47\x83\x49\x0c\x1b\xdb\xef\xe6\x23\xc6\xe3"
+ "\x9c\x61\x58\xff\x9d\x89\xd1\x7c\xa8\x95\xf5\xff\xbb\xd7\xf0\xbc"
+ "\xe4\x7f\xff\x9d\x45\xac\x27\xe2\x32\xfb\x5e\xf5\xdd\xbb\xb4\x1e"
+ "\xcd\xdd\x35\xd4\xce\x68\x3e\x44\x55\x4f\xbe\x2b\x17\xea\x5f\xa4"
+ "\xbc\x48\xe3\xf7\x7c\xd7\xc8\x6f\x19\x6a\x87\xbe\x82\xfe\xd3\x2c"
+ "\xe4\xac\x60\xcf\x85\x63\x39\xf6\x05\xc7\x08\xf7\x92\xf3\x5b\xf2"
+ "\x1b\xf9\xd0\xa1\xde\x73\x5e\x33\xbf\xee\x87\x9a\xc8\x15\x26\x43"
+ "\x28\x79\x3b\xda\x58\xd9\xbb\x5e\x89\x73\xf3\x7d\x0e\x16\xeb\x30"
+ "\xec\xa6\xd7\xa8\x4f\xb9\x3e\x09\xed\x41\xc2\xb5\x24\xdc\x5f\xeb"
+ "\xfa\xdd\xd3\xed\x77\x0f\xfc\x4d\xfd\x9a\x53\xe8\xda\x1a\x28\xed"
+ "\xe3\xbf\x12\x0b\xe5\x60\x8f\xb2\x5a\x56\x5e\xcd\xfc\x9e\x41\x36"
+ "\x6b\xa0\x3e\xe4\xc2\x79\xa1\xed\xbb\x69\x7f\x92\xf8\xd1\xc0\x1b"
+ "\xa3\x71\x4f\xb7\x30\x0f\x47\xe3\x9e\xed\x10\xc7\x1c\xba\x5f\x1b"
+ "\xae\x8f\x12\x8e\x51\xc2\x71\x38\xcb\xd3\x7a\x25\x52\xca\xb5\x8e"
+ "\x36\x9a\x2b\xc3\x7d\xe5\x7e\xc7\xfd\xe0\xc2\x31\x4a\x38\x0e\x17"
+ "\x72\xd5\xce\x86\xfb\x5c\xfb\xbf\xbd\xfb\x20\x5f\xd9\x20\xee\xe5"
+ "\x76\x1a\x35\xb5\x9c\x71\x48\x29\xe6\x05\xc5\x38\x61\xe9\xcd\x18"
+ "\x2b\xc6\x46\xcc\xa4\x83\x98\x13\xdb\x32\x30\x37\x68\x25\xcb\x09"
+ "\x8a\x7b\x60\x15\x68\x37\x47\xd9\xb1\x52\x7f\x89\xe6\x05\x5d\xd5"
+ "\x2c\xe6\x3d\xb9\xd2\xe8\xdc\xa2\xa9\x15\xe6\xcb\x0e\xe6\xa3\xdf"
+ "\x42\xed\xc5\x34\xaf\x75\x33\xfd\xee\x15\x74\x81\xb4\x24\x8b\x75"
+ "\xd8\xd8\xb5\x50\xdb\xd7\x6e\x83\x98\xfb\xb1\x45\x23\xe6\x9a\xb6"
+ "\x90\x96\xd4\xab\xa1\x73\x80\xb7\x5a\x46\xc9\x7d\xa6\x5b\x26\x63"
+ "\x9b\xd8\x77\x0b\xb9\x62\xc5\xb6\xa1\x8e\xce\x35\x67\xe1\xfc\x2a"
+ "\x07\xe9\x07\xfd\xba\x20\xb6\x0f\xd7\x61\xfe\x5b\xe9\x58\x62\x9b"
+ "\x57\xb7\x6c\xd0\xc2\xb9\x8d\x96\x80\xd6\x52\xe6\x73\xdd\x02\xeb"
+ "\xdf\x9f\xc7\x77\x25\x03\xf1\xaa\x61\x80\x4f\xc3\xa2\x38\xe3\x30"
+ "\x0d\x8b\xe5\x3d\x4c\xcb\x6c\x8c\x2d\xe7\xd1\x3b\x7c\xf3\x35\x12"
+ "\x88\x3e\x10\x8c\x67\x5b\x59\x0c\x64\x38\x07\x58\x5d\xc8\x6f\x19"
+ "\x46\xd7\x27\xff\xd6\xfd\x16\x1b\x6d\xa3\x1f\x8b\x6d\x86\x7b\x97"
+ "\xda\x0c\xad\xd1\xae\xfc\x09\xae\x79\xdc\xba\x10\xbf\x3d\xc0\xfc"
+ "\xa0\x7d\xf4\xec\x03\xf6\x17\xda\x6a\xf0\x29\x63\xaa\x86\x69\xe8"
+ "\xf7\x99\xad\x83\x2d\xcc\x47\xb5\xf5\xaf\x01\x11\xfd\x1b\xe1\x59"
+ "\xfb\x5d\x79\x23\xa0\x4e\x36\xfa\xde\x43\xfb\xae\xf7\x4c\xa0\xcf"
+ "\xa8\x66\x73\xbd\xb5\x91\xdb\x32\x4c\xb3\xb9\x83\x04\x0a\xe7\x1b"
+ "\x2b\x1d\x76\xcc\x3d\xe0\x35\xce\x16\xcd\x9d\x87\x3e\xe1\x5b\x87"
+ "\x69\x70\xdf\xd0\xa3\x76\xb1\xcf\xb6\x46\xdc\xaf\x82\x7d\x66\x63"
+ "\x6b\xab\x13\xc7\x71\x53\x0b\xb4\x9d\x76\x96\x34\x10\x5b\x1c\xfa"
+ "\xcd\xd1\x31\x49\x11\x7d\x39\x6d\x54\xe7\xa3\xcf\x67\x75\xa8\xee"
+ "\x4f\xf3\x18\x41\xfb\xf9\x34\x17\x1b\xbc\x03\xd0\xc2\x94\x86\x7b"
+ "\xfe\x6d\x34\x2f\xc0\x7a\x1a\xab\x03\xde\x9b\xfa\xc9\x5e\x15\xbe"
+ "\x93\xd8\xf6\x8a\x6b\x85\x45\x38\xb7\x19\x9f\x9d\xd4\x41\x2e\x13"
+ "\xdb\xab\x98\x63\x1d\xc6\x23\x0a\xe3\xd3\x55\xda\x60\x9e\x24\x77"
+ "\x20\x2f\x44\x61\xee\x4e\x0b\xb1\x6d\x60\xeb\x1b\x8e\xb9\x2d\x1e"
+ "\x9f\x8f\x63\x0b\xba\x99\x15\xc6\xf4\x5a\x9b\xe1\xaa\x2b\xff\x63"
+ "\x76\x38\xea\x3b\xb6\x2e\xe3\xeb\x3a\xa1\xcf\x95\xb9\xb0\x76\xf6"
+ "\x3b\x8b\xfd\x2b\xe3\xc2\x86\x69\xd0\x27\x1b\x7e\x2f\x11\xd6\x73"
+ "\x4a\x3b\xc6\x07\x57\xf7\x04\x44\x44\x0e\xa8\x64\xbc\x40\x63\xa8"
+ "\xc1\xb9\x89\xc2\xf8\xd1\x7c\x12\xc6\x24\x36\x0e\x42\x7d\x07\xb3"
+ "\x17\x47\x0e\x81\x7e\xb9\xe5\xbf\xbb\x4a\xd7\x6e\x8c\x7d\x9f\x4f"
+ "\x75\xc2\xab\x87\xdd\xfa\x6c\xa3\xfb\x5f\x5b\xd0\xd6\x77\x75\x36"
+ "\x3e\x6b\x13\xc6\x0f\x43\xbe\x68\x72\xe7\xff\xab\x63\xb1\x9f\xe8"
+ "\xf3\xeb\x0c\x1d\x6c\x81\xf5\xb6\x01\xc7\x19\xee\x49\x84\xb9\xe0"
+ "\x33\x57\x14\xae\x17\x98\x4f\xa4\xcd\x70\x4d\x2b\xae\x85\xa0\x5f"
+ "\xc0\xba\xd0\x36\x80\xea\x9d\x20\x4f\x9b\x39\x94\x67\xda\x28\xdf"
+ "\x00\xce\x6a\x04\x8c\xd5\xc0\x3d\xb3\xc5\x6f\x5e\x4e\xdc\x37\x71"
+ "\x99\x7e\xef\xb5\x89\xf9\xe4\x58\xbc\xbe\x6b\x19\xd2\x3e\x8b\x6b"
+ "\x1b\x3b\xed\xb3\xc0\xbd\x3f\xdb\x69\xde\xb1\xfd\xb8\xa6\x54\x34"
+ "\x37\xe0\x1a\x41\xef\xc7\xbd\x17\x69\xa0\x93\xb3\xfd\x43\x0d\x68"
+ "\x9f\xa7\x39\x4f\xb0\x2f\x2c\xf7\x44\x3d\xfd\x0d\x7c\x1b\x88\x47"
+ "\xc6\x4b\xd7\xac\xae\x9c\xe9\x40\x6f\xfc\xd6\xf6\x61\xe0\x2f\x89"
+ "\xe9\x61\x5c\xaf\xdb\x06\x60\xfe\xef\x36\x43\x9b\x5a\xcc\xfd\x4d"
+ "\x73\x7d\xb3\xf7\x51\xfb\x8c\xcb\x38\x92\x44\x61\xbc\x00\xdc\x5f"
+ "\x47\xc7\x40\x95\x9f\x85\xb1\x9e\x31\x6e\xa5\x29\x05\x73\xb2\xb4"
+ "\x7d\xfa\x46\x38\xdd\xa3\x6c\x33\x8d\x6c\x41\x3f\xac\xe6\x0b\xa9"
+ "\x34\x1e\x53\xd0\xd4\x64\x07\x8f\xf7\x51\x79\x22\x34\x3f\x0b\xaf"
+ "\xd1\x5c\x07\xd8\xe6\x4d\xc7\x2d\x6e\xcb\x13\x64\xd3\x66\xd0\x7d"
+ "\xee\x03\x5a\x51\xd9\x1d\x7e\x87\x37\x11\x7b\x3b\xcb\x41\xcb\x62"
+ "\xef\x0b\xfe\xd8\x3d\x59\x8c\x0d\x18\x33\x1a\xf3\xc0\xbe\x44\x33"
+ "\x14\xf3\x35\xdb\x97\xd3\x38\xd8\xc6\x01\x51\xc2\x18\x44\x6d\x66"
+ "\xfd\x0a\x99\x97\xac\xa4\x7d\xc4\xfe\xf9\xd7\x37\xfb\x68\x41\x8f"
+ "\xe8\xd9\x66\xb0\xa7\x8a\xb1\x39\x98\x3c\xc5\xe2\x63\x33\x5a\xd8"
+ "\x2f\x0a\xf2\xf3\x28\xe1\xd9\xa3\x6e\xc1\xb3\x0f\x0b\x6d\x06\xb1"
+ "\x18\xe1\x6d\x20\x03\x0d\x00\x0c\x6f\x0f\x14\xf5\x19\x61\x0f\xd1"
+ "\x70\xa6\x67\xb5\x47\x4a\xfa\x0c\x1b\x43\xd9\xbe\xbb\x65\xcb\x12"
+ "\x35\xb1\x0b\x57\xe8\xe7\x27\xbe\x1c\xaf\x89\x4b\x48\x58\x96\xa0"
+ "\xc1\x20\x4d\xee\xf3\x87\xe5\x31\x6a\x8f\x12\xf2\x13\x16\x4a\xf9"
+ "\x09\xdb\x93\xdd\x73\x7a\x5a\x48\x7b\xea\xad\xb1\x5d\xb4\xe7\xfa"
+ "\x6a\xc7\xa8\xe4\x8a\xe0\xbf\x18\xfe\x4d\xf0\x8f\x32\x06\x99\x67"
+ "\x27\xd1\xb0\xd6\x53\x3f\x13\x29\xe6\x44\xfb\x34\xf4\x31\xaa\x27"
+ "\xed\x57\xf3\xb9\x40\xd4\x83\x30\x6f\x78\x11\xd6\xdf\x0d\xf7\xc3"
+ "\xbf\x09\xfe\x4b\xe1\x9f\xde\xc7\x7d\x40\xf7\xcb\x17\xb9\x5f\x63"
+ "\xfe\x23\xeb\xf6\x63\x1d\x7e\x1d\x7e\xb2\xc7\xfc\xeb\xac\x9e\x47"
+ "\x1f\x94\xbc\xa1\x45\xac\x47\xbf\xed\xf7\x59\x47\x34\x5e\xea\x05"
+ "\xf0\x86\x8b\x85\x42\x3d\xea\x6b\x23\xbe\x0f\xe6\x1a\x80\xfa\x62"
+ "\xbd\x40\xde\xd0\x36\x4a\xa8\x47\xd7\x0a\xce\xa0\xf4\xf6\xdc\x1e"
+ "\xbc\xa1\x38\x52\xa8\xa7\x72\x6f\xcf\xad\x4e\x4f\xce\xf0\xd5\x5e"
+ "\xac\xc3\xad\x0b\x54\x33\xd9\xa9\x3d\x17\xea\x7b\x8d\xd1\xea\x1f"
+ "\x9d\xae\x47\x7b\xd2\x49\xff\xf2\xc2\xb8\x27\x16\x2e\x4d\xc2\x4c"
+ "\x53\x89\xcb\x56\x26\xe2\x71\xe9\xfc\xdf\xd1\xc3\xb2\x79\xbf\x7d"
+ "\x99\xfd\x48\x5c\x1c\x85\x3f\x16\x03\xbf\xe1\x31\x76\xa5\x1e\x0f"
+ "\x2f\x2f\xc3\x62\x72\xfc\xf0\x95\x2f\xe3\xc1\x73\x1f\x28\xc8\x56"
+ "\xd7\x1b\x81\x37\x6a\x18\xce\x5e\x07\x1d\xe9\x62\x24\x95\x63\xd7"
+ "\x59\xc8\x09\xad\x83\x88\x76\x2d\x79\xcc\x11\x87\x02\x63\x8e\x84"
+ "\xac\xd3\xbf\x1c\xe2\x58\x18\xc7\x6f\x19\x02\x32\xb0\x23\xca\x42"
+ "\x16\x11\x01\x1b\xa3\x69\x9c\x53\xc3\xf5\x0c\xc1\xb7\x33\x90\x33"
+ "\x6a\x6c\x18\xbf\x1f\xca\x34\xcf\x36\x07\xeb\x01\xd4\x1b\x03\x65"
+ "\xcc\xaf\xad\x86\xeb\x78\xdf\x78\x28\x47\x40\x39\x92\x33\xaa\x83"
+ "\x70\x8f\x31\x94\x35\x50\x1e\x08\xed\x1b\xc5\x79\xe1\x5d\x56\x76"
+ "\x14\x89\xb9\xbf\x59\x9e\x6f\x87\xc9\x95\xe7\x1b\xf3\x39\xa5\xa9"
+ "\x66\xd3\xf5\x97\xca\x20\x8e\x86\x80\x88\x07\x92\xa0\x4e\x83\xb8"
+ "\x5e\x32\x7b\x87\xc3\x26\xc6\x4f\x61\xf6\x0c\x67\xa0\x5b\xbe\x74"
+ "\x2c\xab\xc5\x7c\xe9\x68\xef\xa2\xf9\x1a\xe1\xc8\x1b\x30\x9e\x2c"
+ "\x5f\xe8\xd5\x96\x47\xf3\x7c\x3a\x57\x63\x6c\x5e\x6b\x7a\xac\xe2"
+ "\x27\xf9\x68\x43\x83\x32\x8b\x2d\xc9\x5f\x26\x4e\x9a\x1f\x4a\x8c"
+ "\x3b\xe7\x1e\x4b\xc2\xeb\x7e\xa8\x53\x20\x33\xd0\x7c\x57\x8b\x97"
+ "\x85\x38\xe6\xc7\x31\x39\xd0\x79\x86\xe1\xd7\x10\x21\xa6\xb1\xb3"
+ "\x84\x7f\x81\xe5\x44\xb1\x10\x6e\x22\x8b\x3d\xb5\x78\x19\x0f\xf7"
+ "\x86\x24\xcf\x8f\xa3\xe7\xa0\xde\x7a\x90\xd5\x84\xfe\xbd\x65\x8e"
+ "\xc4\x3d\xae\x9c\x10\x23\xc3\x59\x38\xf7\x81\x0c\x7c\x4e\x10\x95"
+ "\x43\x4e\x91\x60\xcc\xb7\x89\x7d\xcb\x77\x8b\x8b\xb7\x19\xce\xa1"
+ "\x0f\x69\xeb\x0b\x24\x18\xe3\x00\x0b\x7d\x29\x64\xf9\xc3\xb8\x68"
+ "\x31\xd6\x94\x05\xce\x79\xbe\xcf\x0b\xbf\xa6\x5c\x39\xe8\xe5\xe1"
+ "\xd3\x26\xc0\xaf\xe1\x42\xca\x6a\x77\xde\x8c\x6c\x0d\xd3\x5a\x5b"
+ "\x0f\x0e\xfa\x98\xe5\x25\xe5\x40\xff\x77\x52\x5d\x88\x43\x1d\xb8"
+ "\x4d\x97\xcb\x7c\x50\xb9\x32\x8c\xbb\xcb\x19\x50\x9e\xc4\x7d\xd3"
+ "\x1c\xcd\xa9\xc3\xab\x86\x04\xed\x5e\x8b\x31\x9e\x15\x30\xc6\xdc"
+ "\x01\xbc\x26\xc4\xf0\x52\xd2\x18\x57\x4e\x12\x41\xf7\x08\x83\x8c"
+ "\x82\x7b\x50\x2f\x28\x14\x15\x28\x77\xa0\x3d\x89\x33\x70\xd3\x91"
+ "\x6f\x81\xc6\x18\x43\xc4\xc6\x87\x69\x2c\x7c\xe8\x90\xfd\xc8\xc7"
+ "\x28\xeb\x9a\x55\x38\x66\x3c\xc6\x0c\x78\x06\xfe\x7f\xc3\x72\xcf"
+ "\xcc\x6a\x14\xdb\x84\x72\x30\xe8\xe9\x6a\x38\xaa\xda\x0c\xfc\x44"
+ "\xb7\x9c\x7c\xc2\x9e\x68\x7e\x21\xc6\x7e\xc3\xb6\xa9\xec\xac\x50"
+ "\xbc\xcb\x64\x10\x3e\xd1\x42\x54\xa3\xd8\x5c\xc4\x5c\xa3\xaf\x67"
+ "\x09\xbf\x41\xfe\xf9\xa9\xd5\xa3\x8d\xd3\xa2\xad\x94\xf1\x34\xac"
+ "\x79\x4a\xf2\x0c\xfc\xff\x06\xea\x1f\xb1\x90\x7f\xa7\xf5\xd7\x2b"
+ "\xe9\x3e\xc9\x0b\x01\x11\xb8\xdf\x9d\xaf\x16\xcf\xf7\x50\x44\xc3"
+ "\x98\x62\x4e\x37\x36\xf7\x5b\xc3\x06\x37\x43\xd9\x26\xda\x58\xa8"
+ "\xcd\x25\x13\xfd\xba\x5c\x65\x3b\x94\xd5\x62\x19\x7e\x6b\x44\xac"
+ "\x40\x9b\x44\x6b\xba\x6e\x07\xea\x9d\x2f\x47\x80\x5c\x08\xf2\x0d"
+ "\x5c\x07\xfa\xbf\x3e\x91\xdd\x6b\x88\x6e\x35\x6c\xd2\xdb\xc2\x76"
+ "\x66\xd8\x00\xff\xe0\x1a\xc8\x7f\x8b\x6b\x85\x76\xe2\x2d\x01\x57"
+ "\x33\xc4\x77\xe3\x0c\x01\x21\xdc\x96\x21\xa5\xf4\x1d\x15\x8a\xbd"
+ "\xf0\xbb\xdc\x1a\xaa\x29\x80\x7a\x40\x7f\x87\xb0\xbf\xf8\x52\xc1"
+ "\xc6\x0e\xd5\x74\x33\x48\xf0\xa6\xdf\x76\xe0\xf8\x51\x9f\xec\x4d"
+ "\x29\xaa\x69\x28\x77\x62\x1c\x10\x9a\x13\x0d\xe3\x5b\x3a\x48\x4f"
+ "\x9a\x53\x60\xcb\xfa\xd1\x34\x96\xfe\x2a\x6d\xb0\x18\xdb\x12\xf0"
+ "\x28\x87\x57\x2e\xb3\x61\xbc\x4b\x9a\x3b\xa4\x4d\xdb\x87\xc6\xb8"
+ "\x14\x62\x5b\xee\x4a\x22\xea\x3c\x8e\xc5\xb6\xa4\x31\x42\x7a\x82"
+ "\x9e\x92\xe4\x3d\xbe\x25\x6f\xd8\x3f\x51\x8c\x6f\xc9\x5f\x73\xda"
+ "\xe1\xf7\x40\x18\x0f\xcc\xff\xae\xa5\x65\x29\xde\x54\xa0\xd7\x78"
+ "\x97\x4a\xc0\x3d\x25\x8b\x77\xe9\xd7\x7a\xa1\x50\x50\xbb\x6c\x5b"
+ "\xa6\x02\xf0\x6f\x0d\xf5\x83\x71\x3b\x57\x02\x6f\x22\xc4\x37\xe0"
+ "\xe3\x85\x73\x35\x16\xf2\x9a\x18\x93\xca\x8a\x3a\x7e\x0e\xb5\x8d"
+ "\x71\xcd\xfc\xf5\xf8\x1d\xde\x30\xa7\x25\x6c\x0f\xf4\x03\xe6\x74"
+ "\xa6\x32\xc2\xa2\x50\xa6\xe2\xbd\x54\x97\x54\x28\x23\x3c\xe7\xf5"
+ "\x82\x97\x97\xc5\xc6\xcd\x5b\xb4\x44\xaf\x79\x61\xfa\x33\x34\x51"
+ "\xe2\x70\xcd\xc2\xc4\x38\xba\x24\x69\x5e\x98\x30\x6e\xea\xd4\xe9"
+ "\xf3\x7e\x3d\xfd\xe9\xe9\x33\x7e\x3d\x96\xed\x58\x9c\x9e\xb0\x1a"
+ "\x93\x6d\x26\x2e\xd3\xe0\x4d\x0b\x84\x6c\xe2\x29\x71\x09\xcb\x3c"
+ "\xf1\x40\x4d\xed\x5c\x4a\x6a\xd3\xb5\xe1\x6f\x6a\x4b\x53\x28\x0f"
+ "\x8b\x36\x2e\x8a\x7d\x0a\xe5\x3e\x1c\x5b\x9a\x6b\x3c\x53\x39\x1c"
+ "\xe5\x2b\x21\xcf\x3b\xae\x3b\x81\x38\xa7\x71\xfd\x81\x77\xb1\xb8"
+ "\xc7\xe6\x62\xf7\x06\x04\x2a\xf1\x3e\x61\x2e\x0b\xe7\xee\xe7\xfb"
+ "\xf5\x4b\xa7\xf1\xb5\x32\x03\xd4\xa2\xdd\x1b\xcf\x89\x7d\xa8\xc7"
+ "\x3a\x99\xca\x39\xae\x7c\xc2\x99\x01\x63\xa4\x3c\x94\xf4\x4f\x36"
+ "\x46\x84\xa0\x38\xd3\x03\x64\x95\x9e\xf0\x7f\x17\xfe\x4f\x74\xe1"
+ "\x7b\x12\x5f\x83\x3a\x5b\x88\x02\xd6\xe0\xe4\x00\x96\xc7\x2a\xb3"
+ "\x9a\xe6\x5e\x98\xea\x74\x04\xcc\x73\x2a\xe1\x18\xc0\xcf\x73\x06"
+ "\x52\x3d\x91\x4f\xe2\xab\xe9\x5e\xfb\x24\xbe\x0a\xf3\xb5\x01\x1f"
+ "\x67\x4d\x75\xa4\x65\x4d\x75\xf2\x8e\x79\x20\xbf\xc3\xf1\x5b\xdc"
+ "\x33\x3e\xd5\xf9\x2d\x4f\x73\xd6\xe0\xde\x7a\x16\x67\xb0\x14\x7d"
+ "\x28\xe7\x02\x0f\xe7\xb7\xb0\x9c\xc4\x53\x57\x7f\xf7\xd5\xbc\xd5"
+ "\x16\x96\x93\xf8\x32\xcb\xe3\xcd\x72\x9d\x93\x34\x68\xa7\x6c\x9e"
+ "\x33\x40\x33\xd5\x79\x9d\xa7\xfb\x5e\x33\x03\x35\x5d\xe5\x19\xf6"
+ "\x6a\xbf\xc8\x1e\x19\xcc\x6f\x1b\x9a\xc3\x67\x47\x35\xf2\xdb\x86"
+ "\xa9\x61\xbd\xaa\x45\x0c\xe7\xb3\xff\xad\x04\xca\x70\xfe\xdf\x0b"
+ "\xf8\x6d\xc3\xd5\x7c\xf6\xcf\x53\xe1\x08\xe5\x31\x3a\x7e\xdb\x08"
+ "\x28\xf7\x19\x0f\xf7\x19\xf9\xec\x90\xc3\x50\x4f\xc5\x67\x87\x0e"
+ "\x84\x23\x94\xc3\x72\xa0\x1e\x94\xd5\x81\x70\x84\x72\xdf\xc4\x0b"
+ "\x8a\xc0\x06\xb8\x07\xce\x3d\x35\x8a\x3d\x6b\x5c\x34\x7d\x56\xf6"
+ "\x84\x49\xec\x19\x13\x75\xec\x19\xff\x11\xcb\x9e\x31\x45\xcf\x9e"
+ "\x11\x0e\xf7\x0d\xcd\xe5\xb3\x23\xaa\xa0\x5e\x04\x9f\xdd\xef\x08"
+ "\x1c\xa1\x1c\x59\x08\xf5\xa0\xfc\x20\x3e\x0b\xca\x9a\x0c\xa8\x0f"
+ "\xe5\x87\x17\x43\xfd\x3c\x3e\x7b\xe0\x6c\xa8\x17\xc9\x67\x0f\xc6"
+ "\xf6\xa1\xac\x1d\x03\xf5\xa0\x3c\x74\x38\x1c\xa1\x0c\xbf\xb7\x8d"
+ "\x80\xf2\xf3\xf0\x4e\x43\x0b\xf8\xec\x5f\x47\x41\x3d\x0d\x9f\x3d"
+ "\x1d\x9e\x37\x0c\xca\x2f\xe6\x42\x3d\x28\xeb\xe0\xfe\xe1\x50\x7e"
+ "\x89\x40\x7d\x28\xcf\x82\x77\x1d\xba\x97\xcf\x9e\x03\xcf\x19\x36"
+ "\x90\xcf\x9e\x87\xef\x0c\xe5\x98\x5a\xa8\x07\xe5\x05\xd8\x1f\x28"
+ "\xc7\xc2\x7d\x23\xa0\xfc\x5b\x18\x83\xa1\x85\x7c\x76\x7c\x35\xd4"
+ "\xd3\xf2\xd9\xbf\xdb\x0b\x47\x28\x2f\x4d\x84\x7a\x50\x5e\x0e\x63"
+ "\x38\x1c\xca\x89\x6a\xa8\x0f\xe5\x24\x7c\xdf\xfd\x7c\xf6\xea\x62"
+ "\xa8\x37\x9c\xcf\x4e\xdd\x08\x47\x28\xa7\xc7\x40\x3d\x28\x1b\x60"
+ "\xfc\x86\x43\xf9\xd5\x20\xa8\x3f\xdc\x3b\x3d\xb3\x32\xf8\x75\x3d"
+ "\x09\x9f\xfd\x86\x83\x5f\x77\x17\x1c\xb7\xed\xe7\xd7\xf5\x80\xb6"
+ "\x77\xcc\x86\xf3\x70\xdc\x0e\x32\x71\x8f\xe1\x42\x19\x8e\x7f\xd8"
+ "\x00\xe5\x28\xa1\x0c\xc7\x5c\x3d\x94\x47\x09\x65\x38\xee\xc2\xf2"
+ "\x68\x3e\x3b\x1f\x8e\x3d\xe1\xb8\xcb\x0a\xe5\x31\x42\x19\x8e\x05"
+ "\x63\xe0\xe8\xe0\xb3\xdf\xd4\xc2\xf9\x68\x38\x36\x42\x19\x8e\x79"
+ "\x85\x50\x1e\x0f\xf5\x83\xa1\x3c\xde\x3a\xa8\x1f\xca\x03\x84\x0f"
+ "\xbb\x32\x8d\x0b\x7f\x54\x95\x7e\x95\x28\x31\x26\x52\x51\x9a\x05"
+ "\xe3\xc2\x3c\x54\xaf\xe8\x79\x1c\x73\x74\x60\x1d\xe7\xf6\xa1\x46"
+ "\x2e\x7c\x18\xc6\xa2\xec\x09\xf5\xee\xba\xa0\xb8\xeb\x34\x62\x8c"
+ "\x39\xd5\x42\x73\x03\x0a\x31\x2f\x7b\xc2\x3d\x17\x41\x66\xc2\xfc"
+ "\x0e\x4a\x18\xb7\x72\xde\xd0\xa3\x05\xc6\x6b\x12\x6f\xb8\xa7\x1e"
+ "\x8e\x50\x0e\x3d\x05\xe3\x05\xe5\x7f\x7f\x1d\x8e\x50\x9e\x35\x0e"
+ "\xc6\x6d\x52\x5b\xe6\x5d\x13\x2d\x8a\x40\xfa\xcd\x96\x3f\x38\xc8"
+ "\x14\xe2\xe0\xf9\xa9\x80\x9e\xfc\x9e\x99\xd1\x21\x0e\x13\xd0\x7a"
+ "\x2c\xc6\x07\x25\xfc\xbe\xfe\xd1\x7c\x58\x47\x0c\xed\xb7\x01\x74"
+ "\xeb\xeb\x03\x95\xec\xd9\xf7\xf0\xf5\x8a\xbb\x56\x62\x3e\x09\x3e"
+ "\x3c\xcc\xd7\xf5\x6d\xf4\xfa\xc3\x33\x4d\xec\xba\x8a\x48\xd7\x7f"
+ "\x83\xd7\xdf\x09\xc1\xb8\xec\x83\xef\x36\x59\x14\x77\xd5\x62\x1d"
+ "\x8b\xa2\xa7\x9d\x37\x04\x10\xb3\xad\x51\x78\xc7\xbb\xb0\x5e\x1d"
+ "\xde\xe7\xcb\xe6\xc3\xe5\x8c\x2b\xde\x04\x98\x87\x3a\x30\xac\x7d"
+ "\x4a\x4d\xda\xc0\xe2\x7a\xc5\xdd\xfb\x77\xa1\x8c\xa4\xd6\x65\x30"
+ "\x2c\x0c\x5a\x7e\x7d\xab\x56\xad\x49\x09\x81\xf6\xee\x3e\x90\x6e"
+ "\xe7\x6d\xa6\xb4\x71\x80\xa3\xf4\xfc\x34\xba\x5f\x88\xfd\x1e\x43"
+ "\xfd\x40\xd9\x6f\x2d\xb5\x39\x43\x5b\x78\xaf\xbb\xce\xe1\xcc\x2c"
+ "\x4d\xe4\xc2\x75\x46\xfa\x1d\x5d\x11\xb4\xf2\x7d\xce\xa2\x0c\x49"
+ "\x24\x3d\x34\x29\xc7\xa0\xfd\xa0\x23\x32\xfd\xd4\x55\x97\x5e\xdb"
+ "\x73\x14\xea\xbe\x89\xb6\xa4\xcc\xa0\x72\x57\x3e\x65\x78\x87\xdf"
+ "\xe3\xba\xa7\x24\xd1\xb8\x16\x53\x79\x57\x71\xf7\x24\xdc\xd9\xe4"
+ "\x50\x3f\x59\xe0\x30\x5e\x89\x76\xe6\xe8\x32\xf8\xed\x3a\x63\x1f"
+ "\x87\x82\xc5\x01\x56\xdc\xbd\xee\x51\x3b\xca\x97\x27\xb1\xee\xcf"
+ "\xb9\x9e\xa7\x46\x8f\x4c\x26\x4a\x53\xc2\x59\x2c\xaf\xe6\x33\xeb"
+ "\x86\x9b\x9b\x6b\x88\x29\x81\xb6\x95\xcc\x67\xb6\x9a\xb8\x9e\x8d"
+ "\xa3\xf3\x51\x4e\x4f\x46\x3b\xdb\x29\x1c\x17\x27\x8c\x33\xac\x21"
+ "\x77\xeb\xc4\xbe\xe0\xfa\xb1\x09\xc6\x0e\x65\x68\x8c\x7d\x31\xcf"
+ "\xe9\xc4\x58\x72\x59\x16\x18\x07\xb6\xbe\xde\x8d\x31\x29\x89\xf0"
+ "\xdc\x2d\x5c\x98\x96\x54\xce\xc6\x6f\x86\x2a\x8c\xcd\x65\xa3\xfb"
+ "\xe5\x31\xd3\x31\x87\x6b\x3e\xab\xeb\x4e\xbb\x85\x42\x9c\x80\x85"
+ "\x4b\x13\x13\x96\x6b\x56\x2c\x4c\x89\x1b\x3b\x68\xe5\x70\x4d\x42"
+ "\xb2\x26\x01\x97\x5c\x76\x02\x96\xe5\x15\x8b\x97\x25\x6a\x30\x03"
+ "\x79\xe7\xfc\xc5\x11\x20\x47\xd7\x50\xf9\x52\x11\x42\x65\x7e\xbe"
+ "\x60\xe6\xe8\xc4\x54\x9e\xd3\x3c\x7c\x17\x7f\x59\xd1\x6b\x52\x7b"
+ "\xcf\xbb\x8b\x71\xad\xe5\x0c\x1a\xaa\xe7\xc1\x3a\x1b\xbc\x23\x8c"
+ "\xe0\x9e\xbe\xa0\xb6\xcc\x5e\xae\xf8\x97\x16\x45\xc8\x46\x6a\x3b"
+ "\xc9\xec\xa5\x03\x1e\x74\x08\xdf\xce\x58\xbc\x3f\xe1\x1a\xfd\xb6"
+ "\x9c\xd9\x2b\x19\xf4\xc8\xfd\x94\x56\x05\x54\xc6\x87\xeb\xbd\x58"
+ "\x2c\x2c\xcd\xcc\xd1\xfc\xde\xfe\xd1\x20\xc7\x29\xe8\x77\x3c\xc7"
+ "\x43\xbc\x99\xb4\xd0\xd8\x01\xfc\xb6\x31\x45\x18\xb3\xc3\xb9\x7d"
+ "\x64\x14\x17\x3e\xa6\x88\xfb\x53\x24\x49\xdf\x43\x94\x87\x60\xce"
+ "\x07\x6a\x80\xbf\x1f\x26\x0f\x1d\x4b\x6b\x54\x42\x9f\xdf\x3d\x96"
+ "\x56\xa3\xe4\x73\x1e\x0d\x6a\x1d\xf8\x80\xc6\x2e\xe4\xb9\x36\x3b"
+ "\xec\xe4\xe3\xf1\x04\xf5\xb8\x62\x5b\xdf\x09\x13\x6d\x7d\x47\x46"
+ "\xd8\xb7\x4d\x2e\x32\x3d\xfc\x53\x32\xe1\x11\xfe\xbb\x8f\x4a\x08"
+ "\x69\x56\x84\x24\x7e\x34\x9e\xea\x16\x55\x76\xd5\x90\x6a\xdb\xf6"
+ "\x31\x51\x18\x2f\xab\x7d\xfb\x14\xd2\x11\x1e\x65\xfc\x10\xea\x9c"
+ "\x04\xdd\xe7\x13\x0d\xf0\xef\x00\xa2\x6c\x1f\xdc\xcf\x78\xa8\xc3"
+ "\xa8\x2c\x2d\x19\xc3\xec\xbe\x31\x30\x67\x28\x3f\xdd\x33\xe7\xa3"
+ "\xc3\x25\x04\x9e\x4d\x0e\x75\x4c\x54\x7e\x3c\xba\xd3\xf5\xb5\x1f"
+ "\x45\x95\x90\x36\x8c\xb1\x0c\xba\xe5\xd1\xb3\xb9\x84\xdf\xfe\x8c"
+ "\xfe\x40\x8a\x5d\x09\x82\xb3\xb2\xa2\x26\x97\xa4\x9e\x27\xbd\x1d"
+ "\xdf\x69\x03\xff\x02\xf7\xb7\x63\x0c\xd4\x4f\x22\x68\x2c\xc4\x34"
+ "\x13\xcd\x61\x1b\x52\x09\xf2\x02\xf7\x9d\xb6\x67\xe5\x74\x13\x81"
+ "\xeb\xd9\x8e\xff\x88\x20\x15\xf1\x56\x62\xd6\x15\x90\x76\x65\x34"
+ "\x79\xf7\xa5\x02\xf2\x26\xe8\x29\x6f\x5e\x26\xc1\x54\xf6\xbd\xae"
+ "\xed\xe9\xb8\xae\x0d\x74\xac\xd1\x62\x6c\x2a\x9e\xff\x4e\xdb\x0b"
+ "\x65\x61\xc7\x32\x6d\x50\xa5\xb5\x80\x3c\xda\x48\xb4\xed\x4a\x12"
+ "\xd2\xbe\x46\xdb\xab\x52\x9f\x0b\x6d\x81\x70\x0b\xe3\x8a\x71\xf1"
+ "\x30\x5e\x1e\x8e\xd3\x3d\x3a\x32\xbd\x59\x71\xcf\xe3\xbd\xaa\x49"
+ "\x5f\x8c\xcb\x8a\xf2\x25\xc6\x74\xe6\xd4\xcf\xe8\x9d\xea\x31\x51"
+ "\x69\x57\xa1\x5f\x18\x77\xe8\xe0\xa0\x02\x94\xcf\x41\xf6\x50\xe0"
+ "\x3b\x73\xbc\xb6\xd7\x3c\x3c\x6e\xd5\x64\xa3\x8c\xce\xb5\x45\x60"
+ "\x7e\xa8\x20\xec\x27\xe6\x6a\x5e\xfb\x35\x8c\x65\xba\x36\x10\xea"
+ "\x05\xc3\xf9\x3e\xe6\x66\x3b\x71\x8e\x18\x54\x34\x52\x4f\x73\xf0"
+ "\xaa\xf3\xd3\x88\xca\x98\x46\xd4\x9a\x7f\xa7\xbc\x34\xc3\x79\x60"
+ "\x50\x01\x9f\x19\x39\x10\xed\x31\xec\x5c\x9f\xc7\x35\xbf\x24\x44"
+ "\xf3\x53\xfc\xdd\xbb\x4e\xf3\x04\xd0\x50\x3d\xae\x8a\xea\x0f\xa8"
+ "\xb3\x2a\x7a\x7f\xca\x78\xbc\x77\x59\x7b\xcf\xdf\xc6\x73\x99\x3b"
+ "\x36\x70\xeb\x02\x23\x31\x3f\xf7\x65\x45\xef\x03\x7c\xf6\xdb\xfb"
+ "\xf9\x9c\xc9\x94\x17\xa1\xfc\x56\x7b\xcf\xfb\xca\xf9\xec\xbf\xa8"
+ "\xa0\xfd\x31\xed\x8a\xc0\x6a\xf8\x17\xe6\x48\xef\x02\x7c\x6f\xe7"
+ "\xde\xfe\x11\xf8\xde\x34\xa7\x10\xbc\xd7\x3c\xa0\x19\x1f\x3e\x2e"
+ "\x83\xc6\xd9\xbf\x0e\xe3\x2b\xe4\x5c\xc5\xf1\xc0\x31\xe0\xae\x6b"
+ "\x7b\xd1\x77\xbd\xae\x0d\x86\xf1\xc5\x18\xcc\x21\x69\xf3\xe1\x9e"
+ "\xed\xe3\x72\xe0\x5a\x9f\x76\xf5\xb8\x52\xcc\xed\x65\xd6\x5b\x89"
+ "\x73\xdb\x38\x23\xc6\x18\xdc\x91\x02\x73\xae\xef\x38\x90\x45\xc6"
+ "\xe5\x09\x73\x8b\x60\x3f\xb9\xec\xbf\xcc\x6e\xc7\xbd\x75\xd0\x37"
+ "\xe8\x5f\x35\xfc\xd7\x58\x14\xbd\x07\xb6\x0f\xea\xaf\xb5\x28\x82"
+ "\xed\xd0\xd7\x48\x3e\x73\xd4\x74\xfc\x0d\xd7\x22\x61\x6c\x7a\xe3"
+ "\x38\xe0\x78\xb0\xb1\xe8\xd3\x43\x1a\x8b\x18\x23\xd4\xb3\x71\x99"
+ "\x39\x70\x6f\xef\x6a\x3e\xf3\x51\xb5\x5b\xbd\x11\x52\xbd\xc5\xa3"
+ "\x58\xbd\xfc\x1a\x56\xef\xe7\x1b\xe1\x7a\x19\x1b\xef\x3e\xcb\x3b"
+ "\x8f\x77\x9f\x85\xd2\xbd\xd3\x6b\xd9\xbd\xaf\xc5\xb3\x7b\x07\xe2"
+ "\xbd\x7b\x3c\xfa\xb4\x43\xaa\x3f\x55\xc5\xea\x6f\x88\x60\xf5\x1f"
+ "\xd2\xb9\xd5\x3b\x2e\xd5\x7b\x29\x8f\xd5\xcb\x2e\x62\xf5\x1e\x29"
+ "\x86\xeb\x4e\x2f\x7d\xb9\x2a\xdd\x93\xac\x61\xf7\xbc\x55\xce\xee"
+ "\x19\x3f\x11\xf8\x69\x84\xbc\x2f\x21\x83\xa4\xfa\x09\xc2\x7b\xef"
+ "\x9d\xcd\xea\xff\xc2\xe6\x56\x6f\x32\xab\x87\xd7\x0f\x41\xbd\xde"
+ "\xa5\xed\x3d\xd3\x02\x59\xbd\x67\x73\x90\x1f\xa1\xce\x12\x2e\xf3"
+ "\x81\xc3\xed\x3d\xfb\x15\x40\x3b\x47\x80\x36\x11\x78\x04\xda\x45"
+ "\x70\xc6\x21\x55\xf0\x7b\x14\x7e\xd7\x41\xcc\xb5\x28\x7a\xa9\x01"
+ "\x77\x9d\x5e\x6d\x5f\x99\x21\xfb\x5d\xb6\x37\x0e\x64\x83\x6d\x43"
+ "\x7d\xc5\x59\x0d\xa4\x31\xfa\xb7\x0f\x2d\x32\x72\x2c\x37\x3c\xf0"
+ "\x28\xc8\x36\x21\xa7\x61\x2d\xcc\xa0\xb1\x96\x73\xc6\x46\x71\x03"
+ "\xfb\x63\x0c\xb5\x00\x73\x6a\x23\x29\xe2\x1a\x95\xc6\x0e\x12\x58"
+ "\x09\xeb\x0c\xd6\x2f\x82\x35\x55\xb3\x34\x00\xd6\xd7\x90\x4b\xc6"
+ "\x6b\x42\x7b\x05\x33\xa3\xd3\x97\xb0\x7c\xd8\x28\x57\x21\x36\xc3"
+ "\x7c\x0c\xa6\x79\xda\x96\xa2\x5c\xa1\x1a\x00\xbf\x31\xb6\x22\x69"
+ "\x1f\x7c\xbf\xa9\xfd\x8f\x33\xa3\x3b\xc2\x1f\x35\x76\xfc\x29\xb2"
+ "\xe0\x7a\xf8\xd8\xa8\xeb\xdb\x9f\x2c\x72\xfc\x51\x57\xe4\x18\xdc"
+ "\x3f\xda\x19\x1e\xa5\x82\x67\x03\x6e\xe7\x2a\x0f\x72\x45\xca\x83"
+ "\x69\x26\x25\xb6\x7b\x2c\xad\x40\x79\x34\xad\x4a\x79\x94\x2b\x56"
+ "\x1e\x4b\x33\xc2\xb1\x10\x73\x76\x81\x2c\xa7\x5a\x7e\x34\xad\x14"
+ "\xd6\x0d\x15\xd0\x39\x24\x57\xb4\x5d\xf2\xe3\x1c\xa4\xb2\xd0\x41"
+ "\x4e\x24\x5e\x25\xd6\xd0\x21\x35\xf0\x5f\x6b\xed\x3b\xae\xd8\xda"
+ "\x77\x72\x11\xed\x73\xf8\x78\xfa\x8e\xb8\x37\xf5\x28\xc7\xfa\x2c"
+ "\x8c\x07\xb6\x79\x26\x1f\xbf\xd1\x8a\x71\xa8\x15\xa1\x39\x9d\xe2"
+ "\x50\x2b\x59\xbe\x38\x57\x2c\xea\x1f\x22\x0e\xb5\x60\x23\xa0\x71"
+ "\xa8\x41\xdf\xa3\x7a\x1f\xac\x5f\x34\xc7\xa4\x03\xe4\xb3\x6d\x4f"
+ "\xaa\x50\xbf\x43\x79\xac\x2d\x33\xd4\x24\xea\x67\x28\x63\x38\xb7"
+ "\x0c\x69\x84\xff\x06\x38\x0f\x73\xf4\x9d\x28\xf1\x3c\xbf\xb5\x65"
+ "\x1a\xda\xd0\x9d\x7c\xfc\x2f\xda\x70\xbf\x25\x1f\xff\x94\x73\xdb"
+ "\x48\x8d\x73\xdb\x64\x23\x9c\x1b\x03\xff\x63\x9d\x5b\x5a\xa6\xc3"
+ "\xbf\x0e\xfe\x67\xc3\x7f\x0c\xfc\xc7\xc2\x7f\x3c\xfc\xeb\xe1\x3f"
+ "\x11\xfe\x93\xe1\x3f\x15\xfe\x33\xe0\x7f\x03\x1f\xda\xb2\x18\xe3"
+ "\x68\x42\xdb\x46\xa0\x7b\x84\xd8\xae\x34\xbe\x61\x63\xe1\x7d\x31"
+ "\x6e\x5e\x15\x97\xfd\x36\xfd\x26\x80\x3c\xcf\xef\xeb\x37\x11\x71"
+ "\x97\x1f\xf4\x80\xc6\x3a\x60\x66\x94\x75\x80\x2e\xd7\x1a\x3a\xcb"
+ "\x04\xff\xa5\xf0\x5f\x65\xdd\x36\xae\x0a\xe8\x97\x6b\xed\xfb\x4c"
+ "\x4c\x5b\x66\x18\xcc\x99\xfb\x53\x99\x0d\x29\x6c\x3f\xfc\xce\x13"
+ "\x7e\x17\x5b\x14\xe1\xd4\x7f\xc0\xda\x77\xbc\x06\xca\xa5\x16\xc5"
+ "\x7d\xb4\x5e\x6b\xf8\x38\x8b\xb0\x4f\x33\x03\xce\x83\xfe\xdf\xa7"
+ "\x98\xd5\x7b\x52\x16\x03\x6e\xc9\xcb\xfa\x79\x4b\xe6\x27\xcf\x5b"
+ "\xb1\x78\xe1\xcb\x71\x2b\x9e\xd0\x0c\x8a\xd5\x68\x17\x26\x2c\x9f"
+ "\xb7\x7c\x65\xdc\xca\x38\x2a\x36\xc1\xa9\x47\xe4\x3e\x68\x98\x67"
+ "\xc3\x01\xf2\x7d\x9f\x06\x9e\xc7\xf5\x6a\x92\x0d\x78\xec\xe1\x99"
+ "\xd1\x47\x2e\x5b\x95\x4e\x90\x5b\x82\x1b\x32\x60\xde\x8d\x8d\x3a"
+ "\x72\xd9\xae\x0c\x6e\xd0\x10\x1e\x78\x1d\xaf\x99\x1b\xaa\x04\x39"
+ "\xe6\x14\x29\x47\x39\x06\xea\x1c\x5c\x6a\x57\x4e\xc1\xfb\xff\xd4"
+ "\x3f\xfa\x10\xfc\xe6\xb7\x8f\x29\xc2\xfb\x78\x90\x6d\xe8\x11\x64"
+ "\x1b\x56\x7e\xd4\x78\x94\x1e\x9f\x2c\x3a\x4a\xeb\x45\xa9\x8e\xe1"
+ "\xf1\xda\x5a\xbe\x1c\xda\x45\xdb\x18\xff\xa7\xfb\x4d\x47\xd9\x3d"
+ "\x05\xb4\x0e\xcc\xb3\x7a\x85\x3a\x11\xeb\x51\x5d\x01\xfa\x78\x08"
+ "\xfa\x91\xbe\x92\x04\x8a\x73\x17\xf5\x01\xd7\xfc\x4d\x42\x39\xef"
+ "\xde\x3a\x9c\xbf\xd8\x1f\x1e\xe6\xeb\x01\xb8\xf7\xe0\x52\xa6\x3f"
+ "\x81\xce\x14\x80\xba\x12\x62\x04\x62\x83\x39\xb5\x8a\xde\x5f\xc4"
+ "\x55\x81\xae\x15\x00\xf7\xaa\x1f\xc0\x6b\x34\x9f\x08\x95\xc5\xd5"
+ "\x2e\xf9\x57\xcc\x27\x12\x1c\x03\x7c\xb1\x80\x3c\x04\xcf\x79\x0c"
+ "\xc7\x0f\xc7\x0b\xbf\x9f\xf2\x99\x61\x56\x8c\x95\xb0\x2b\x8c\x04"
+ "\x39\xfa\xea\xb2\x98\x6d\x45\xed\xda\xff\x6a\x53\xeb\x64\x71\xec"
+ "\x18\xbd\x34\x71\x4b\xe7\x2f\x58\x1c\x17\x4b\x3f\xb9\xcd\x5f\xb1"
+ "\x62\xe5\x92\x38\x4d\xdc\xfc\x97\xe3\x35\xf4\xb2\x66\xe5\x0a\xa8"
+ "\xb2\x30\x71\x85\x66\xd9\xaa\xa5\x9a\x25\x2b\x16\xa2\x74\x1c\x97"
+ "\x90\xb0\x52\x9f\xd8\x8b\xb0\x3b\x35\x4b\x56\x2e\x4e\x5c\xa8\x87"
+ "\x1f\x2b\xe2\x96\xc6\x6a\x28\xd5\x57\x40\x53\x8b\x17\x6b\x84\x27"
+ "\xac\x88\x9f\x9f\x80\x8c\xb0\xf4\x15\xa8\xe4\x76\xbf\x5c\x76\x0e"
+ "\xc6\x78\x78\xe8\x87\x75\x59\xd1\xb7\xbd\x24\x10\xc6\x3a\x47\x97"
+ "\x85\xfe\x0b\x50\xb6\x53\x7d\x2a\x53\x5d\x88\x76\xe6\x37\xe0\x1d"
+ "\x5b\x81\xe7\xdb\x32\xfb\x26\x8a\xef\x46\xed\xce\x18\x23\x14\xe3"
+ "\xcf\x2a\xfa\x9e\xa7\xfb\x85\x81\xff\xa9\x7f\x4b\xa6\xfa\x1f\x6c"
+ "\x2c\xfa\xee\x75\xb7\x61\x31\x9b\x69\xdf\xf7\xd1\x8f\xce\x02\xcf"
+ "\x40\x99\x40\xc8\xe9\xa0\x80\x7b\x2e\xe2\x3d\xdc\xb6\xc9\xb9\x70"
+ "\x5f\xad\x24\x97\xf7\xa5\x7e\x77\xb4\x5e\x66\xdf\x9e\x7c\xdf\x71"
+ "\xb0\xee\xf4\xcd\xc5\x7e\xf9\x58\x43\x34\xd7\xa0\xdd\x4f\x8a\x08"
+ "\x19\xa6\x26\xda\x6b\x5b\x87\x45\xb7\x85\x0d\xb1\x76\x18\xc8\x5d"
+ "\x1d\x30\x8f\xed\x4a\xf2\x50\x3b\xf0\xc5\xea\xc7\x48\xc0\xda\xc9"
+ "\x44\x59\xb4\xa8\x08\x63\x1c\x93\xf2\x89\xb9\xc4\x1c\x03\x3a\xb5"
+ "\x7d\x3f\x29\x37\xd5\x93\x0a\xc7\xdb\x2c\x6f\x48\x0a\xca\xd5\xf7"
+ "\xcd\xc1\x98\x76\xe9\x6b\x79\xe7\xa1\xf7\xac\x3d\x0e\x36\x15\x61"
+ "\xbe\x8f\x87\xcc\x8e\xaf\x4c\xe6\xd4\xbd\xc4\x9c\x6c\x36\x61\x3c"
+ "\x91\xcb\x8a\xf0\x67\x8f\xc2\xb5\xbb\xcb\xe1\xbe\x29\xe4\x2e\x28"
+ "\x8f\xc5\x67\x64\x6d\xe7\x6b\x5e\x0b\xe7\x6b\x5f\xdb\xce\x5b\x80"
+ "\xa7\x1a\x36\x0a\x39\x3c\xd0\x3f\x00\xfd\x20\x90\x4f\xf5\x49\x24"
+ "\xa2\x49\x11\x5e\x4d\x75\xfb\xf1\xb4\x7c\x3f\x94\xa9\xaf\x8d\x39"
+ "\x79\x3b\x96\xfb\x41\xd9\xc6\xca\xf9\x58\xee\xdf\xa4\xb8\x2f\x90"
+ "\x95\x3f\xc2\x72\x24\x94\xd5\xac\x5c\x49\x68\x5c\x0c\xc5\x7d\x03"
+ "\x59\xf9\x73\x2c\xc3\xd8\xdf\x37\xca\x94\x84\xfd\x3d\x07\x34\xbb"
+ "\xef\xe9\xf4\x3a\xd0\xcf\x92\x2f\xd0\xf9\x70\x2c\x2d\x1e\x6d\x0f"
+ "\x30\x1f\xc2\x4f\xdc\x53\x8b\xba\xdd\x7d\xb1\x3d\xa3\xf0\x18\x1e"
+ "\x1f\x62\x27\x77\x81\xac\x74\x0f\x5c\x7b\x1c\xc7\xce\xab\xad\xe5"
+ "\xe0\x03\xcb\xa6\x3a\x78\x13\xbf\xaf\xff\x68\x7e\xdb\xd8\x22\x7e"
+ "\x5f\x64\x06\x4f\xd7\xb1\xa1\xfa\xa2\x14\x3b\x8d\x33\x0d\xf2\x29"
+ "\xcc\xa1\xfb\xf6\x60\x9f\xac\x20\xef\xf9\x88\x3b\xab\xe2\xb7\x8d"
+ "\x2c\x02\x3d\x4a\x3b\x59\xeb\x40\x7f\x67\x90\x71\x23\x1e\x3f\x11"
+ "\x8f\x72\xc1\xf8\x9f\x70\x7b\x23\x33\xb8\x74\x1d\xe1\x07\xf6\x1f"
+ "\x3d\x39\x9e\x37\xc1\x1a\xa5\x60\xb6\x6a\xfe\x2b\x78\xfe\x57\xf4"
+ "\xb9\x83\xfa\x8f\xe6\x56\xc5\x63\x9e\x28\x8a\x2f\x69\xb8\x5e\x27"
+ "\x01\x9e\xac\xd1\x85\x38\xb7\x8d\xd7\x9c\x88\x3f\xef\x5f\xce\x21"
+ "\x45\x84\xcf\x1c\x6f\xd8\x27\x8c\xbb\xea\x80\xe7\x38\xe0\x5d\x51"
+ "\x36\x38\xc8\x95\x2a\x41\x46\x19\x7d\x60\x41\x4d\x0f\x7e\x95\x2e"
+ "\x04\xde\xe9\x31\xb3\xf6\x2a\xa9\xec\xc0\xb9\x12\x61\x3b\x91\x4c"
+ "\xc8\x84\x64\x87\x29\xc4\x4a\xe3\x63\xab\x30\x5f\x0c\xdf\x77\x64"
+ "\x51\x93\xe2\xfe\xf1\x53\x52\xe1\x1d\xe0\xdd\x8f\xd6\xd7\x04\x72"
+ "\xf0\x1e\x8f\xb2\x71\x83\xfb\xee\xd7\xc2\xd8\x6a\x45\xb9\xde\xcf"
+ "\xfe\x53\xbe\xe1\x56\xe8\x08\xee\x63\x3e\x04\xf2\x08\x77\x5d\x17"
+ "\xc2\xc1\xfa\x83\xd7\x4e\x68\x2f\x11\x7c\xa6\x30\xd6\xd4\xc7\x9d"
+ "\x1f\x08\xe3\x0c\xcf\xc7\xb8\xdc\xe2\xb8\xc2\x1a\xa6\x75\x5e\x8f"
+ "\xf7\x4e\xff\xed\xcf\x58\xa1\x7f\x1a\x7e\x4b\x8b\xd7\xbc\x55\xb0"
+ "\xd6\x3e\xc4\xf8\xa3\x9f\x0e\xfe\xe3\xf9\x3d\xba\x02\xeb\xa0\x7e"
+ "\xc9\x34\x8f\xe7\xf6\x27\x35\xa2\x8d\x04\xe6\x1b\xf0\xc8\xfd\x27"
+ "\x8a\x40\x17\xf6\x1e\x8b\xd0\xc0\xf2\xa7\xf5\xf8\x8a\x0f\x71\x62"
+ "\x5e\xe0\xab\x18\xe3\x7d\xf4\x09\xad\xcd\x4f\x9a\xf6\xf3\x99\x2b"
+ "\x0b\xdb\x07\x9d\xfa\xba\x9f\xed\xe9\x7c\xf2\xc8\x5e\x18\x17\x55"
+ "\x4b\x74\x07\x3f\x5e\xc1\x64\xef\xfe\x4e\x1c\x2b\x07\xac\x23\x29"
+ "\xa7\x89\xd2\x0e\xeb\xe5\xdb\x2f\x66\x29\x87\xc3\x3a\xe3\x84\xb5"
+ "\xbf\xac\xaa\x84\x4c\x9d\x44\xd2\x2b\xe2\x5b\x88\x98\x17\x8d\x0f"
+ "\x1f\x53\xf4\xd6\x8b\x56\x25\x7e\x33\xc2\x3c\x68\x54\x4f\xdd\xfe"
+ "\xb4\xf5\x2f\x9f\xdb\x51\x77\xb3\x1c\xf8\xdc\xaa\x74\xb4\xea\x34"
+ "\x34\xc6\x3c\xe8\xe4\xe9\xf1\x3c\xe7\xfa\x8e\x84\x79\x48\x8c\x9a"
+ "\x1c\xcc\x33\xfd\xc9\xb4\x2a\xba\xef\xff\x13\x5d\x09\xf9\xa4\x36"
+ "\x97\x94\x37\xd4\xe1\x7e\xe8\x3d\x9f\xe8\x8c\x28\x2f\xf6\x71\x80"
+ "\x4c\xf8\x26\xc8\x84\x30\x5f\xef\xe6\x54\x86\xd1\xe2\xb7\x24\xcc"
+ "\x9b\x26\xca\x83\x0e\x98\xa3\x79\x42\x6e\x34\x47\xe6\xfd\xcd\x79"
+ "\xc2\x77\x25\xcc\x99\xb6\x33\x89\x0c\xdc\xa9\xe4\x74\xde\xbe\x21"
+ "\xf5\x59\x4e\x7d\xa6\x23\xb8\x50\xc3\x68\x31\x77\xda\x94\xe5\x1a"
+ "\xf2\x0f\x78\xf7\x13\x5a\x7f\xe7\x64\x7f\x1a\x03\xcb\x01\x7c\xe7"
+ "\x00\x9e\x73\xc0\x78\x02\x0d\x8a\x81\x6e\x5e\x75\x10\x91\x06\xd7"
+ "\xd3\x45\x1a\x3c\xb0\x89\xd2\x00\x74\x97\x35\x33\x05\x1a\x9c\x05"
+ "\x1a\x34\x00\x0d\x0c\x24\xe3\xe4\xf4\x72\x32\x75\x1a\xd0\xa0\xb9"
+ "\x05\xf3\x13\xb0\xdc\x74\x89\x6c\xec\x29\x2d\xce\x5a\x95\x95\x36"
+ "\x46\x83\xfd\x2f\x31\x1a\x1c\x7c\xc9\x0a\x72\x4c\x3f\xe3\x5b\x50"
+ "\x76\xae\xd2\x69\x30\x67\x14\x6f\x88\xc1\x3c\xda\x8c\x16\xd7\x81"
+ "\x16\xd7\x19\x2d\xd2\x96\x03\x2d\xaa\x6b\x68\x6c\xaa\x4f\x6a\xcb"
+ "\x49\x79\x4c\x01\xa9\x00\x5c\x02\x5a\xcc\x47\xba\xa0\x5e\xed\x5c"
+ "\xa3\x0d\x03\x3d\x5a\x9d\x97\x42\x22\x44\x7a\x80\xde\xde\x6b\x53"
+ "\x0a\x41\x3f\xdf\x28\x98\x9b\x22\x3d\xd4\x94\x1e\x97\x04\x7a\x74"
+ "\xa0\xaf\x1c\xd0\xa3\x03\xe8\xd1\x01\xf4\x30\x30\x7a\x20\xce\x4f"
+ "\xb1\x85\xf0\xdc\x3f\xb5\x18\xbb\xa2\x33\x3d\xd6\x08\xf4\x38\x7b"
+ "\x33\xf4\x78\x40\xd7\x99\x1e\x91\x63\xba\xa3\x87\x34\x27\x1e\x7a"
+ "\x0c\xe9\x71\xbd\x40\x98\x13\x83\x71\x4e\x64\x28\x87\xc1\x5a\x84"
+ "\x63\x5a\x56\x75\x84\xce\x09\xcc\x0b\xf6\xd6\x8b\x76\x65\x79\x03"
+ "\xd0\x25\x16\xe8\x92\x22\xd1\x85\xd1\x63\x4c\x51\xe1\xe7\x6c\xfc"
+ "\x35\xcf\xe1\x9a\x81\x73\x03\xe9\x03\x74\x82\xf9\xe3\x2d\xaf\xa0"
+ "\xfb\xf7\x56\x68\x93\xc3\x79\x82\x73\x04\xe7\x43\x45\x7c\x1d\xcd"
+ "\xd3\xfe\xc9\xb4\x52\x82\xdf\x5d\x3f\xd1\x1d\x01\x5a\xe5\x12\xe7"
+ "\x2a\xa0\x4d\x12\xee\xed\x20\x03\x30\xbf\xe0\x27\xba\x2c\x94\x17"
+ "\x54\xc0\xf3\x77\x3b\x81\x4e\xce\xb6\x88\x5e\x1b\x41\x87\xc2\xef"
+ "\xb1\xee\xdf\x61\x31\x97\x32\xdf\xf3\xfe\x66\x38\x1f\xe8\x00\x1a"
+ "\xc1\xdc\x91\xcd\x19\x57\x8e\xe5\x6f\xb4\x64\x57\x3d\x09\xea\xbd"
+ "\x90\xd1\xc8\xe9\x36\x67\x26\x2f\xc4\x39\x93\x01\x34\x3a\xed\x27"
+ "\x8d\x1e\x64\x7b\x29\xc2\x01\xab\x43\x5b\xa2\x61\x9d\x04\x1a\x3d"
+ "\x50\xee\x8b\x46\xce\xbd\xfd\x74\x4e\xd5\x90\x6a\xcc\x93\xc0\x2d"
+ "\x9b\xae\xe0\x40\x5f\xea\x00\xbd\xf4\x13\xab\x83\xa4\xce\x21\xca"
+ "\x94\x3a\xd2\xd3\x3c\xfd\x14\x31\x5b\x8a\x69\x8c\x73\xb4\xf7\x62"
+ "\xee\x11\xb3\xa3\x18\xf0\x6a\x8a\x0a\xcb\xbb\x68\xd9\x4a\xd6\xcc"
+ "\x21\x01\x34\xef\xa8\xae\x80\x6c\x04\xfe\x3c\xf0\x52\x81\x92\xcb"
+ "\x79\x34\x88\x57\x61\xce\x24\x62\xaa\xd4\x3b\x30\x46\x5b\x70\x45"
+ "\x7c\x39\xc6\xb5\xfc\x0a\x63\x88\x57\xda\xa0\x4d\x2b\xdf\xe1\x84"
+ "\x35\x23\xdf\xc0\x17\x63\x1e\x89\x47\x71\x8d\xc0\xb8\x73\x0a\x4d"
+ "\x6f\x94\x45\xd0\xee\x65\x4a\xdb\x09\xb2\x97\x86\xc6\x6b\x80\x73"
+ "\x8a\x8a\x45\x36\xb8\xfe\x93\x75\xd8\x2f\x66\x83\x66\xc7\x47\x31"
+ "\x1e\x78\xf8\x94\x5f\xbf\x9f\x66\x0d\x34\x82\xbe\x0b\x32\x1a\xb6"
+ "\x33\x87\x67\xba\x60\x96\xb9\xda\x4e\xed\x8f\xd6\xf4\xf8\x9e\xc6"
+ "\x14\xf4\xc7\xc2\x9c\x14\xb8\x66\xff\xe4\x31\xf4\xe1\xe0\xf7\xc2"
+ "\x7a\x15\xfe\xa4\xa6\x68\x81\x55\x29\xad\xcb\x9a\x2c\x58\xcf\x92"
+ "\x27\x68\xf9\x74\xcc\xdd\x71\x14\xde\x0b\xf5\xa0\xb7\xeb\xed\x14"
+ "\x53\xfe\xb2\x20\x4b\x89\xf6\x11\x3b\xe0\x43\xf9\xe7\x7f\xa3\xb9"
+ "\x60\x2f\x28\x06\xec\x38\xa9\x73\x10\x7c\xfe\x8c\x47\xf0\x1b\x83"
+ "\xa6\xbc\x5d\xb9\x77\x54\x7b\xcf\x7e\x13\xd3\x1b\xa4\x3c\x98\xee"
+ "\xf9\x2e\x11\x67\x0e\x2c\x80\x36\x11\x67\xea\x33\x94\x0c\x5b\xa2"
+ "\xd1\x46\x17\xe4\x89\x2d\x15\xcd\x97\x48\x1a\xf0\x71\x45\x7c\x01"
+ "\xcd\xaf\xd2\x07\xf0\x9d\x5b\x03\x78\x72\x1d\xf4\x7d\xc0\x13\xc4"
+ "\x81\x7c\xc0\x0f\x6e\x0d\xe8\xf9\x1d\xa0\xe7\x0b\x38\x82\xb2\x17"
+ "\x1e\xe7\x00\x8f\x86\x94\xc2\x39\xa0\x13\x07\xb8\x0e\x78\xa2\x7d"
+ "\x33\x85\x0c\x7c\x13\x78\x74\x17\xe2\x08\xc8\xc5\x53\xf4\x80\x23"
+ "\xab\x00\x47\x92\x68\x3e\xe2\x88\x7c\x25\xc3\x8f\xf7\xea\xb3\x94"
+ "\x46\x31\x1f\x39\x1d\xdf\x87\x47\x54\x22\x7f\xc4\x64\x60\x5f\x95"
+ "\x4e\x5c\x9f\xd6\xe8\x02\x2a\x6d\xc0\x23\xdb\xa7\xd0\x73\x74\xde"
+ "\xae\x8a\xef\xc5\x31\x5e\x8b\xc6\x31\xd9\x7d\x99\x44\xd1\x9c\x9d"
+ "\xdf\x45\xf4\xda\xbc\x94\x0c\xcf\xbf\x4c\x06\xe6\x2f\x25\x5a\x98"
+ "\xaf\xca\x7c\xe8\xc3\xdc\xe5\x2a\x42\xf3\x98\xf4\xec\x37\x0d\xce"
+ "\x7b\xcd\x63\x02\x72\x75\x44\x3e\xce\x99\x65\x5a\x57\x9f\x1c\xc6"
+ "\x39\x55\x4e\x18\x3b\x1a\xf3\x4d\xf1\x30\x8b\x67\xac\xba\x37\x88"
+ "\xc9\xf9\x0f\x17\x33\x3f\xa5\x88\x60\xd0\x55\xee\x6a\x52\x3c\xbc"
+ "\x84\xdf\xaa\x21\xfa\x14\xa2\x68\x12\xaf\x81\xec\xc9\x01\xad\x46"
+ "\x66\x90\x0c\x2e\x34\x4b\x67\x4e\xbe\x84\x79\x01\xfc\x9c\x87\x0f"
+ "\x53\xdf\x6e\xa7\x71\x0e\x7d\x5f\x6e\xeb\x9c\xda\xdd\x4d\x24\x8a"
+ "\xff\x1d\xd0\x63\x11\xbc\x6b\x13\x19\x98\xd7\x04\xef\xba\x8a\xbd"
+ "\xab\x98\x7f\x9d\x33\xec\x1d\x03\xd7\xba\xcc\x01\x66\xfd\x1d\xe6"
+ "\x00\x0b\xa9\x01\x0c\xbb\x97\x7f\x18\xfd\x8e\x69\x4c\x9e\x36\xb3"
+ "\xa3\x8e\xe0\x73\xd1\x36\x64\x6e\xa1\x3c\x3d\x1f\x79\x99\x2b\xd0"
+ "\x15\xcc\xab\x05\xde\x6e\x8b\x27\x3c\xfc\x3e\x5a\x6f\xc5\x18\x38"
+ "\x54\xe6\xb3\x28\x34\x46\x94\xd3\x8e\xc1\x39\xe4\x7d\x37\x9e\x37"
+ "\x22\xcf\xe3\x75\xca\xf7\x70\x9f\xb9\xf6\x3c\xc1\xf6\xdc\xdb\x41"
+ "\xfa\x8b\x6d\x5d\x50\x0c\x9c\x80\x6d\x21\x2f\xa0\x4d\x07\xe7\x1a"
+ "\xa3\x7d\x31\xfa\x98\x47\xf0\xe1\x51\x46\x56\xb6\x62\x7e\x1b\x15"
+ "\xf2\x00\xe5\x15\xc0\x6f\x8c\xb9\xcc\xf3\xba\x00\xe0\x33\xec\x67"
+ "\x2f\xa0\x77\x94\xc8\x17\x70\x4e\xed\xc9\x1b\x7d\xd6\xa9\x50\xa7"
+ "\x51\xe3\xef\x1b\xe5\x0f\xff\xe8\x37\x70\xbc\x4f\xff\xb7\x81\xfd"
+ "\x70\x1e\x3d\x84\xb8\xe9\x6c\x75\xc3\xcc\x66\x86\x99\x88\x49\x22"
+ "\x6e\x52\x6c\xa2\xb9\x1d\x8a\xd1\x3f\x35\x9e\xf6\xd1\x4f\xdc\xac"
+ "\x68\x96\x70\x73\x8a\xde\x0d\x37\x9b\xf9\x0e\x6e\x90\x37\xdc\x1c"
+ "\x34\x41\x8e\x9b\x83\x9e\x95\xe3\xa6\xf6\x80\x27\x6e\x76\xc6\xcc"
+ "\x41\xaf\x79\xc3\x4b\xd0\x63\x1e\x6a\x52\x68\x67\xfb\xc6\xca\x41"
+ "\x87\xfd\xc7\xca\xc1\x27\xe4\x58\x39\xc8\xfe\xff\x2f\x56\x0e\x99"
+ "\x29\xc3\x4a\xd5\x0d\x62\x65\x13\xc5\x4a\x35\xff\x4f\x98\x13\x02"
+ "\x7e\xe4\x2f\xf2\x81\x95\x8b\xba\x99\x0b\xbf\xf3\x85\x95\x43\xfe"
+ "\x2a\xc7\xca\x21\x0d\x72\xac\x1c\xb2\x43\xc2\x4a\xe1\xda\x2d\xc1"
+ "\xca\x21\x45\x77\x06\x2b\x87\x14\x51\xac\xbc\x8c\x58\xa9\xdd\xd4"
+ "\x3d\x56\x0e\x3a\xe2\x1d\x2b\xe1\x3c\xc5\xca\x41\x47\x24\xac\xac"
+ "\xeb\x06\x2b\x1f\x59\xee\x07\x56\xaa\x29\x56\xaa\x7c\x60\xe5\x22"
+ "\x18\x2b\x81\x2f\x28\xef\x79\xf0\x86\x80\x95\x11\x2e\xac\xbc\x01"
+ "\xfe\xf0\x8f\x7e\x8f\xe8\xbb\xc2\x4a\xce\xc8\xe4\x4b\xc4\x4a\x3e"
+ "\x4c\xc0\xca\xc5\x0e\x92\x72\x06\x30\xb2\xba\x89\xe6\xb0\xa1\x7e"
+ "\xbd\xf0\x9f\x3a\x13\xb1\x68\x4c\xd4\x41\x18\x2f\xb3\xa5\x88\x62"
+ "\x13\xf5\x4f\x9d\x84\x58\x55\x04\x75\x73\x5d\x72\x27\xc5\xce\x33"
+ "\x02\x76\xce\x16\xb0\x73\xee\xf7\xc0\xce\x97\x90\x96\x43\xd7\xb5"
+ "\x2b\x45\xec\xdc\x0a\xd8\x39\x94\xca\x0f\xf8\x3d\x93\x61\xe7\x08"
+ "\xa7\xd8\x2f\xb4\x69\x9a\x13\x77\x12\xd6\xaf\x96\xce\x38\xfa\x1c"
+ "\x6d\xef\xb4\x69\x51\x33\x71\x61\xe9\x6c\x09\x4b\xa1\xad\x03\xbe"
+ "\x71\x74\xa8\xc3\x85\xa3\x06\xc0\xd1\x73\x6e\x38\x0a\x7a\xd3\x5f"
+ "\x10\xf3\x00\x47\xdb\x28\x8e\xbe\x27\xe0\xe8\xf0\xde\x27\x67\x03"
+ "\x8e\x3e\x27\xe2\xe8\xb0\x68\xbb\x61\xef\x28\x7b\x66\xf7\x38\xda"
+ "\x46\x71\x54\x7f\xfb\x71\xb4\xc4\x03\x47\x41\x77\xc5\x1c\xec\x5e"
+ "\x71\x54\xe4\x47\x8a\xa3\x19\x12\x8e\xd2\x71\x1d\xfe\x56\x65\x0c"
+ "\x8c\x7b\x8c\x9e\xea\x6e\x2e\x1c\xd5\x17\x31\x1c\x85\x73\xd4\x7e"
+ "\xb2\x02\x70\x14\xf8\x2f\xbd\x02\x63\xfb\x91\x68\xe8\xa3\x0a\xf1"
+ "\x75\x37\xcc\x19\x1c\x23\x17\x9e\x2e\x82\x39\x83\x18\xd3\x0a\x73"
+ "\x06\x70\x74\xee\x55\x15\xa1\xf3\x25\x13\xe6\x4b\x93\x8f\x1c\x7a"
+ "\xa2\xbf\xac\x4f\x3c\x1d\xa1\x90\xe3\xe9\x88\x51\x72\x3c\x1d\x7e"
+ "\x51\xc2\x53\xe1\x1a\xe2\x29\xd0\x0c\xc6\x47\x87\x98\x7a\x73\x78"
+ "\x3a\x82\xb8\xf0\x54\x29\xe0\xe9\xa2\xee\xf1\x94\x7e\xf7\xf3\x81"
+ "\xa7\xee\xd8\xe0\x1b\x4f\x47\x10\x09\x4f\x47\xd4\xb9\xf0\xb4\xc6"
+ "\x17\x9e\x0e\x0b\xf4\x8e\xa7\x70\x9e\xe2\xe9\xb0\x40\x17\x9e\xd6"
+ "\x78\xc1\xd3\xe7\xdc\xf1\x74\x64\x05\xc3\xd3\x22\x8a\xa3\x88\xa9"
+ "\x95\x36\xe0\x0f\x9c\x73\x89\xb9\x14\x53\x39\xc0\x54\xcc\x2b\x8c"
+ "\x39\xa5\xd0\x2f\xde\x1b\xa6\x32\xcc\xb5\x10\xc4\x55\x9c\x9b\xe9"
+ "\x93\x41\xdf\x85\xb5\x08\xc6\x84\xae\xbd\xe2\xf8\xed\x76\xc3\xd7"
+ "\x79\xab\x55\x28\xdb\xc9\x78\x85\x13\x79\xa5\x55\x8b\x3e\xb2\x32"
+ "\x5e\xf1\x8f\x96\x23\xcb\x7d\x61\xab\x2f\xdd\xfd\x24\xea\xee\x33"
+ "\x88\x72\xcd\x0c\xc0\x57\x1d\xea\xee\x85\x1e\xba\x7b\x61\x67\xdd"
+ "\xfd\x74\xd7\x38\xea\x97\xee\xfe\x22\xd2\xf0\xd1\x32\x39\x8e\x3e"
+ "\x5a\x21\xc7\xd1\x7f\x7b\x16\xfb\xc5\x70\xbc\xd0\xbb\xee\x4e\xe7"
+ "\x79\xd4\xfd\x2e\xdd\xbd\x46\x8e\x9f\x92\xee\xfe\xd3\x76\xdf\x38"
+ "\x1a\x35\x5e\x26\x8f\xce\x15\x70\x74\x81\x80\xa3\x0b\x24\x1c\xfd"
+ "\xe4\x94\x28\x8f\x3e\x36\xbf\xac\xc6\x1d\x47\xa3\xb2\x5c\x38\x5a"
+ "\xdb\x19\x47\x45\x0c\x45\x3c\xc5\x76\xd0\x96\xb5\x1f\x70\xfa\xd0"
+ "\x02\xbd\x92\xd9\x6a\x63\x70\xec\x82\x3c\x6d\xb5\x15\xcd\x57\x49"
+ "\xda\x6c\xc4\xd3\x5c\x8a\xa7\x21\x0a\x32\x1f\xb0\xaf\x0f\xfa\xfd"
+ "\xe7\xe1\x37\xfb\x24\x96\x93\x0d\xed\x4b\xdc\x2a\x96\xe3\x53\xb4"
+ "\x33\xc1\xfb\xd2\x6f\xf5\x73\xea\x04\x4c\xbd\x06\xe3\x01\x3c\xf7"
+ "\xe6\x35\xc0\xd4\x24\x2f\xb2\xe9\x1a\xc0\xd4\x14\x37\xd9\x14\xe6"
+ "\xfe\x7b\x0b\x3c\x31\xf5\xb1\xab\x95\xc8\x2b\x88\xa9\x32\x3d\xbe"
+ "\xf0\x47\xa0\xc7\xff\x74\xb2\x1c\x4b\x7f\x9a\x21\xc7\xd2\x9f\x3e"
+ "\x2e\x61\xa9\x70\xed\x96\xc8\xa6\x3f\x9d\x74\x67\x64\xd3\x9f\x4e"
+ "\x92\xf4\xf8\x7f\x7b\xc4\x85\xa5\xd5\xbe\xb0\x34\x6a\x92\x77\x2c"
+ "\x85\xf3\x14\x4b\xa3\x26\xb9\xb0\xb4\xda\x8b\x1e\x2f\xc3\xd2\x51"
+ "\xbd\x19\x96\x16\x32\xd9\xb4\x46\x94\x4d\x0b\xff\x05\xf5\xf8\x51"
+ "\xc1\xfe\xea\xf1\x27\x9b\x19\x7e\x22\x3e\x89\x18\x2a\xe9\xf1\x85"
+ "\xbe\xf5\xf8\x6e\x30\xd4\x2f\x59\x94\x62\xe8\xe3\xbd\xe5\x18\xfa"
+ "\x78\xa8\x1c\x43\x47\xaf\xf3\xc4\xd0\xce\xf8\xf9\xf8\xf3\xde\xb0"
+ "\x93\xe9\xf1\xa3\xa3\x7c\xe3\xe6\xe3\xa9\xfe\xe3\xe6\xbf\xef\x90"
+ "\xe3\xe6\xe3\xa6\xff\x1d\xb8\xf9\xb3\x11\x32\xdc\x54\xdd\x20\x6e"
+ "\xfe\x20\x3a\xfd\xcf\x3c\xec\x9f\x3f\xf3\xb0\x7f\xfe\xcc\xcd\xfe"
+ "\xf9\xb3\x5b\x68\xff\xfc\xd9\x1d\xb2\x7f\xfe\x6c\x83\x24\x83\x8e"
+ "\x9e\xdf\x3d\x6e\x3e\xbe\xc1\x3b\x6e\xc2\x79\x8a\x9b\x8f\x6f\x90"
+ "\x70\xb3\x3b\x19\xf4\xe7\x13\xfc\xc0\xcd\x1f\xb9\x4e\xff\xf3\x2e"
+ "\xed\x9f\xde\x74\x7a\xc4\x4d\x8a\x97\x35\x1e\x3a\xfd\x0c\x77\x9d"
+ "\xbe\x50\xd2\xe9\x27\x32\xdc\x32\x3b\x8c\x72\x9d\xfe\x96\xe3\xe8"
+ "\x13\x33\xec\x2e\x7b\xe8\xeb\x80\xa3\x4f\xcc\xc4\x77\xb3\xbb\xec"
+ "\xa1\x63\xeb\xc4\x7e\x31\x9d\x7e\x2b\x61\xfd\xf2\xa2\xd3\x53\x9f"
+ "\xd9\x27\xde\x72\xe9\xf4\x35\x9e\x3a\xfd\xd8\x4d\xbe\x31\xf5\x89"
+ "\x2a\xaf\x3a\x3d\xea\xdf\x14\x53\xf5\x14\x53\xaf\x6d\x77\xc7\xd4"
+ "\x27\x2f\x51\x4c\xfd\xa5\x88\xa9\x4f\xaa\xed\x30\x37\xed\x3d\xbb"
+ "\xc7\x54\x6c\x47\xc2\xd4\xf8\x1f\x06\x53\x4d\x37\x8e\xa9\xee\xfb"
+ "\x4d\xdf\x83\x77\x77\x61\x2a\x1d\xe3\x31\xaf\x55\xc6\x20\xa6\xc6"
+ "\x7b\xe8\xf7\x85\xde\xf5\xfb\x32\xa2\xc4\xf1\x11\xf5\x7b\xa4\x01"
+ "\xc5\x9b\xdb\xaa\xdf\x8f\xf9\x5a\x8e\xad\x63\xd5\x72\x6c\x1d\x53"
+ "\x26\x61\xab\x70\xed\x96\xe8\xf7\x63\x2c\x77\x46\xbf\x1f\x63\x91"
+ "\xb0\x75\xec\xfb\xdd\x63\xeb\x13\x35\xde\xb1\x15\xce\x53\x6c\x7d"
+ "\xa2\xa6\x4b\x6c\xfd\xa5\x3b\xb6\xfe\xe2\x80\x88\xad\x92\x7e\x0f"
+ "\xfc\x81\xf3\x2f\xd1\x78\xf3\xfa\xfd\xb3\x77\x5a\xbf\xff\xc5\x7e"
+ "\xbf\xf4\xfb\xed\x80\xb3\xa0\x8b\xaf\xf9\x14\xf4\xfb\xe7\x05\xfd"
+ "\xbe\xb6\xc0\x43\xbf\x2f\xe8\xa4\xdf\xa7\x3e\x2f\x60\x2a\xcc\x29"
+ "\x8a\xa9\x0b\x0a\x6f\x5e\xbf\x7f\x01\x69\xf8\xd4\x5b\x72\x4c\x7d"
+ "\xea\x80\x1c\x53\x9f\x19\x8b\xfd\x62\x98\x5e\xe0\x5d\xbf\xa7\xf3"
+ "\xfc\xa9\x76\x99\x7e\x0f\xfd\xeb\xac\xdf\x8f\xbb\x24\xc3\xd4\xb9"
+ "\xee\x98\x1a\x3d\x50\x26\xa7\xc2\x7b\x21\xa6\xbe\x75\x8e\x61\xea"
+ "\xdb\xe7\xdc\x30\x75\xca\xdb\x02\xa6\x3e\x3d\xa3\x6c\xba\x3b\xa6"
+ "\x46\xc7\x8b\x98\x4a\xf1\x72\xae\x5d\x99\xae\xeb\xec\x77\x42\xfd"
+ "\x7d\xd0\x17\x08\xda\xc6\x3d\x52\xd8\xe6\x81\x73\xf1\xdd\xfb\x9b"
+ "\xe8\xbc\xfb\x9b\x98\x13\x2d\xa4\xbc\xc1\x48\xfd\x4c\xf2\xd0\xcf"
+ "\x64\x1d\x19\x90\xd7\xc1\xf6\xfa\xd3\x7c\x1c\xd7\xbc\xef\xf3\x9f"
+ "\x33\x53\xc2\x59\xf4\xc9\x7a\x13\x7d\xb2\xae\x31\x1f\x20\xa0\x77"
+ "\xe7\x7d\xfd\xa2\xdc\x04\x78\xf0\xee\x39\x4f\x9c\x7d\xfa\x62\x25"
+ "\xf2\xcf\xec\x78\x0f\x9d\xbf\xe0\x47\xa0\xf3\x8f\x7b\x5a\x8e\xaf"
+ "\xe3\x12\xe5\xf8\x3a\xee\x11\x09\x5f\x85\x6b\xb7\x44\x76\x1d\x17"
+ "\x7d\x67\x64\xd7\x71\xd1\x92\xce\xff\xcc\x03\x2e\x7c\xad\x72\xc3"
+ "\xd7\x73\xee\xf8\x1a\x3d\x9c\xe2\xeb\x39\x4f\x7c\x85\xf3\x14\x5f"
+ "\xa3\x87\xbb\xf0\xb5\xca\x43\xe7\x3f\xe7\x89\xaf\xe3\x15\x14\x5f"
+ "\x81\x17\xe4\xb2\x6b\x41\xf7\x3a\x7f\xed\x8f\x4d\xe7\x1f\x4f\xfc"
+ "\xd2\xf9\x11\x53\x17\x33\x4c\x45\xcc\x12\x71\x55\xd2\xf9\x0b\x7c"
+ "\xea\xfc\xdd\xe1\xaa\x5f\xb2\x2a\xc5\xd5\x09\x0a\x39\xae\x4e\xe8"
+ "\x21\xc7\xd5\x89\xaf\x79\xe2\x6a\x67\x4c\x9d\x30\xc1\x1b\x9e\x32"
+ "\x9d\x7f\xe2\x68\xdf\x58\x3a\x41\xef\x3f\x96\xfe\x72\x8f\x1c\x4b"
+ "\x27\x1c\xfe\xdf\x8b\xa5\xbf\x7a\x5c\x86\xa5\xaa\x1b\xc4\xd2\x1f"
+ "\xc4\x0e\xf0\xab\x4d\x72\x2c\xfd\x95\x49\x8e\xa5\xbf\x5a\x29\x61"
+ "\xa9\x70\xed\x96\x60\xe9\xaf\x36\xde\x19\x2c\xfd\xd5\x46\x49\x56"
+ "\x9d\xb8\xb0\x7b\x2c\x9d\x90\xec\x1d\x4b\xe1\x3c\xc5\xd2\x09\xc9"
+ "\x12\x96\xd6\x75\x83\xa5\xcf\x4e\xf6\x03\x4b\xe5\x76\x00\x4f\x2c"
+ "\xbd\xe3\x76\x80\x67\x27\xf9\x65\x07\x10\xb1\xf4\xf9\xce\x76\x00"
+ "\xc4\x57\x6a\x07\x80\xf1\x12\x31\x8c\xda\x01\xc6\x33\x2c\x33\x3b"
+ "\xb2\x64\x76\x80\x5b\x8f\xad\xcf\xcd\xb1\xbb\xec\xa9\x06\xc0\xd6"
+ "\xe7\xe6\x53\x6c\x75\xd9\x53\x27\xb7\x8b\xfd\x62\x76\x80\xd7\x09"
+ "\xeb\x97\x17\x3b\xc0\x38\xda\xde\x5f\x65\x76\x00\x37\xac\x85\xb6"
+ "\xde\xf2\x8d\xb3\xcf\xd5\xc8\xec\x00\xf5\x12\xce\x5e\x43\x1f\x75"
+ "\xc0\x41\x8a\xb3\xe1\xee\x38\x3b\xe9\x6e\x8a\xb3\xe3\x44\x9c\xfd"
+ "\x8f\xc8\x36\x98\x9b\x6d\xfe\xe2\x2c\xee\x23\x38\x17\x73\x67\x70"
+ "\xb6\xd8\x0f\x9c\x75\xb3\x0d\xbc\x0b\xe3\xe1\xc2\x59\x3a\xee\x93"
+ "\xf6\x55\xce\x46\x9c\x8d\xf1\xb0\x0d\x14\x78\xb7\x0d\x9c\xb8\x13"
+ "\xb6\x81\x49\x4e\x39\xde\x4e\x8e\x92\xe3\xed\xa4\xf3\x12\xde\x0a"
+ "\xd7\x6e\x89\x6d\x60\x92\xe3\xce\xd8\x06\x26\x39\x24\xbc\x9d\x7c"
+ "\xa6\x7b\xbc\x7d\xce\xe2\x1d\x6f\xe1\x3c\xc5\xdb\xe7\x2c\x5d\xe2"
+ "\xed\x38\x77\xbc\x9d\x52\x26\xe2\xad\x64\x1b\x28\x10\x6c\x03\x59"
+ "\xdd\xdb\x06\x6a\x7d\xd8\x06\x26\xdc\x69\xdb\xc0\x94\x52\x7f\x6c"
+ "\x03\xed\xdb\x99\xdf\xfe\x1a\xf4\xdb\x9f\x03\xf8\x3b\xed\x14\x8c"
+ "\x41\xf7\x7e\xfb\xa9\xa2\xff\x69\x4c\xae\x80\xb3\xb9\x5e\x6d\x03"
+ "\x27\x1b\x7d\xdb\x06\x4e\x56\xbb\xfb\x9f\x4e\x3d\x21\xff\x6e\x35"
+ "\xb5\x4c\xfc\x6e\x75\xf2\x73\xc4\xd9\x5f\x7f\x8a\x65\x2e\xe7\x99"
+ "\x18\x16\x7b\xf0\xd7\x55\xd8\x4f\x6f\x7e\xfc\xef\x71\xee\xdf\xb2"
+ "\xa6\x0d\x72\xd9\x0a\xaa\x10\x6f\x73\x09\xc7\xc7\xf7\xc4\xb8\xe1"
+ "\xd4\x56\xf0\x22\xf2\xde\xaf\xd7\xb9\xe3\xee\xd1\xb3\xee\xb8\x3b"
+ "\x6d\x9a\x88\xbb\x4e\xc0\xdd\xf7\xeb\x73\x99\xfd\xf5\x25\xe6\x9b"
+ "\xba\xff\x25\x37\xdf\xd4\x53\x1f\x08\xb8\xfb\xfc\xe4\x32\x0b\xbc"
+ "\x7f\x57\xfe\x53\x70\xff\xc1\xb3\x37\xea\x83\x9a\xeb\xd5\x77\x4a"
+ "\xc0\x27\xaf\xfe\x53\xd0\x57\xd5\x2e\x61\xae\x3a\x61\x9e\xee\x72"
+ "\xf3\x9f\xca\x4b\x81\xf9\x2c\xec\x2b\xe9\xd2\x0f\xf5\x25\xc9\x0f"
+ "\x95\xcf\x19\x97\x87\xeb\x1b\xb7\xed\x99\x98\x0e\x3e\x3e\x80\x57"
+ "\x8f\xcb\xc3\xe7\x5f\xbf\x0e\xeb\xce\x33\xba\x00\x41\xaf\xcb\x00"
+ "\xec\xe9\xc3\xc6\xfd\xf9\x2c\x27\xac\x35\x4e\x58\x6b\xb8\x9c\x71"
+ "\x19\x0e\x94\x4d\xb6\x8f\xdb\x90\x07\x7a\x9e\xc3\x40\xf3\xab\xf6"
+ "\xca\x06\x5d\x6f\x37\xea\x79\x97\x61\x6e\xa4\x6b\x95\xd8\x1f\x11"
+ "\x47\x43\x1a\xe1\x3d\x2e\x77\x2d\xcb\x39\xbe\x93\x70\xd4\xf4\xdc"
+ "\x49\x78\xe6\x0b\x6b\x2b\x91\x77\x75\xd2\x9e\x02\x2a\x33\xfb\xf0"
+ "\x95\xc5\xbe\xb0\x18\x89\xc0\x0b\xb7\xc0\x26\xe1\xde\x1f\x39\xae"
+ "\xbf\x70\x5a\x8e\xeb\xbf\x0e\x92\xe3\xfa\x0b\xef\x4b\xb8\x2e\x5c"
+ "\x03\x5c\x07\xba\x51\x39\x1a\xd6\xbe\x9b\x94\xa3\x5f\xa8\x16\x71"
+ "\x9d\x13\x70\x3d\xff\x06\x70\xbd\x4b\x39\xda\x0d\x97\x7c\xe3\xfa"
+ "\x0b\xd5\x92\x4d\xe2\xd7\x7f\xf5\xea\x23\x7b\xd6\x1d\xd7\xa7\xe9"
+ "\x28\xae\x9f\xf5\xc4\xf5\x69\x3a\x86\xeb\xd3\x74\x3e\xf7\x13\x9c"
+ "\xf5\xfc\x9e\x36\x7d\x1b\xc5\xf5\x1a\xc1\x47\xb6\xca\x8f\xfd\x04"
+ "\x35\x0c\xd3\x45\x2c\x47\x7b\xd5\x9d\xb5\x49\x4c\xf7\x99\xff\xcb"
+ "\x9b\x4d\x82\x62\x79\x33\xc3\x72\xc4\x46\x11\xcf\x6f\x64\x3f\x41"
+ "\x77\x78\x2e\xca\xcd\x88\xe7\xbe\xe4\x66\x39\x9e\xcf\xd8\x26\xc7"
+ "\xf3\x19\x3b\xe4\x78\x3e\x73\x9b\x1c\xcf\x67\xe6\x78\xe2\x79\x67"
+ "\x2c\x9f\x71\xd1\x1b\x8e\xeb\x5f\x44\x1b\xc5\xcc\xf1\xbe\x31\xfc"
+ "\x45\xb5\xff\x18\xfe\x9b\xd0\xff\x75\x18\xae\xf2\xc4\xf0\xdf\x4c"
+ "\x42\x0c\x72\x66\x7a\x60\xf8\x22\x01\xc3\x05\x1c\xd9\xdd\x24\xc8"
+ "\xc2\x9e\x18\xde\x0c\xef\xd1\x8d\x3e\xee\xf8\xa7\x27\x86\xeb\x9e"
+ "\x96\x61\xb8\xaa\x1b\x0c\x5f\xc4\xec\x20\x32\xbf\x5c\x1f\xb6\x10"
+ "\x78\x8f\x69\xbb\x7c\xc8\xe6\xe2\x98\xb9\xf7\x47\x8e\xe1\xba\x1d"
+ "\x72\x0c\xd7\x95\xcb\x31\x5c\xb7\x4e\xc2\x70\xe1\xda\x2d\x91\xcd"
+ "\x75\xb9\xb7\x5c\x36\x17\xf9\xa3\x4b\x0c\xd7\xe5\x4a\xb2\xf9\xcc"
+ "\x95\xdd\x63\xf8\x8b\x91\xde\x31\x1c\xce\x53\x0c\x7f\x31\xd2\xe7"
+ "\x3e\x87\x4e\x18\xfe\xd2\x0c\x3f\x30\x5c\x6e\x0b\x11\x31\x5c\xb0"
+ "\x85\xec\x76\xb3\x85\x38\x0d\xcc\x16\xb2\xab\x89\xf1\x46\x1f\x05"
+ "\xe3\x53\xe0\x9f\x88\x7c\x65\xd7\xba\xdb\xae\x9b\xb2\x83\xbc\x34"
+ "\xdd\x1f\x3b\x08\xc5\x6f\xdc\xe3\x30\x13\x70\xbb\xea\x06\xf7\x38"
+ "\x4c\x14\xf7\x38\x18\x7d\xec\x71\x10\xf0\x7c\xee\xf7\xc0\x73\xba"
+ "\xc7\x61\x56\x9c\xdc\xc6\x3c\x6b\xa1\x68\x63\x66\x78\x3e\x6f\xb5"
+ "\x1c\xcf\xe7\x25\xbb\xf6\x3c\x00\xe6\x9b\xf5\x5b\x3b\xed\x79\x70"
+ "\x61\x3b\xb5\x83\xce\x2a\x33\xbd\xd8\x40\x5c\xf8\x3e\x5b\xc2\x77"
+ "\x68\xeb\x11\x19\xb6\xd7\xbb\x63\xfb\x2c\xab\x0c\xdb\xcf\xe5\xca"
+ "\xfd\x23\xea\xf5\x6e\xd8\x2e\xee\x79\x98\x7d\xa9\xac\xb6\x1b\x6c"
+ "\x87\xfb\x6f\x7c\x8f\xd8\xad\xc5\x76\x71\x7f\x83\x57\x6c\x77\xdf"
+ "\xdf\xe0\xe6\xff\x80\xd8\x4e\x73\x54\xf4\xf5\xc0\xf6\x35\xf1\x4a"
+ "\xe7\x87\x30\x1f\x00\xd7\x71\x8e\x38\x79\xc0\x76\x3a\xde\x73\xb4"
+ "\xee\xd8\x7e\xdd\xc0\xb0\xfd\xcd\xa6\xef\x8f\xed\x2e\x79\xd8\x1d"
+ "\xdb\x7f\x89\xd8\x3e\x77\x10\xdb\x7f\x91\x71\x63\xfb\x2f\x3c\xfc"
+ "\x33\xde\xbc\x01\xfb\x4b\x97\x18\xef\xa5\x5f\x72\x8c\x9f\xbb\x56"
+ "\x8e\xf1\x73\x8b\xe4\x18\x3f\x37\x4e\xc2\x78\xe1\xda\x2d\x91\xd3"
+ "\xe7\xa6\xde\x19\xfb\xcb\xdc\x54\x09\xe3\xe7\xcd\xec\x7e\xef\xc5"
+ "\x2c\xbb\x77\xdf\x0c\x38\x4f\x31\x7e\x96\xbd\xcb\xbd\x17\x32\x7b"
+ "\x77\xcc\xb3\x5e\xf7\x5e\x54\xfd\x70\xbe\x19\xee\xbc\xe2\x69\x7f"
+ "\xb9\x79\xdb\x77\xcc\x44\x7f\xed\x2f\xb8\xf7\x62\xcd\x69\xb7\xbd"
+ "\x17\xb5\xdd\xef\xbd\x48\x9d\x71\x83\xf6\x97\x2e\x7c\x33\x4e\x4e"
+ "\x73\xf7\x77\x9b\x3f\x41\x8e\xef\xf3\x9f\x75\xe1\xfb\x0b\x88\xef"
+ "\x71\x73\xe4\xf8\x1e\x37\x1b\xfb\xe9\x6d\x2f\xc6\x7b\xb2\xef\x8a"
+ "\xf3\xf7\xc9\x7d\x35\x3c\xec\x2f\x2f\x20\xef\xc5\xf5\x96\xe1\xfb"
+ "\x39\x77\x7c\x9f\x5f\xe5\x4d\x76\x47\xbb\x37\xf5\x29\x9e\xeb\xb6"
+ "\xa7\x6d\x8a\xe8\xff\xb6\xe0\x4c\x99\x0e\xde\xdf\xe2\xc3\xd7\x6d"
+ "\x2e\xf3\x75\xa3\xbe\x6d\x68\x07\x87\xb6\x0e\xcd\xd5\x2b\xd3\x62"
+ "\x78\x0e\x7d\xdd\x3c\xfd\xdc\xd0\xf7\x0d\x7d\xdd\x2a\xe2\x8d\x3e"
+ "\xfd\xdc\x90\x37\x7d\xf9\xba\x41\xbf\xd5\x14\xeb\xbf\x16\xb0\x5e"
+ "\xf0\x75\xcb\x4b\x92\x7c\xdd\x64\x58\xef\xc5\x7f\xf8\xdd\x73\x19"
+ "\xde\xe5\xf8\x74\x09\xeb\x3b\x50\x8e\x7f\xd2\xc3\x16\x43\x69\xf0"
+ "\xb2\xfa\x07\xb5\xc5\x50\xac\x8f\xbd\xbb\x12\xf9\x78\xb6\xde\x8b"
+ "\x2d\xa6\xb3\x8f\xf3\x0f\x67\x8b\x89\x9d\x2f\xc7\xf8\xd8\x1c\x39"
+ "\xc6\xc7\x3e\x2b\x61\xbc\x70\xed\x96\x60\x7c\x6c\xcc\x9d\xb1\xc5"
+ "\xc4\xc6\x48\xb6\x98\xb8\xb1\x5e\xfd\xef\x64\x36\xf6\xf9\x35\xde"
+ "\x6d\xec\xf3\x05\xff\xbb\xf9\x35\x3e\xf7\x84\x74\xfa\xa6\xf9\xdb"
+ "\x01\xcc\xc6\x7e\x13\x7b\x42\x6a\x7f\x6c\xb6\x98\xdf\x6a\xfc\xb5"
+ "\xc5\x50\xdf\xe6\xd3\xe8\x1f\xe2\xdf\x9e\x90\xee\xb0\xdd\x25\xbb"
+ "\x77\xf1\x0d\x53\x8e\xed\xaf\x0c\x90\x63\xfb\x2b\x83\xe4\xd8\xfe"
+ "\xbb\x11\x72\x6c\xff\xdd\x70\x4f\x6c\xef\x8c\xeb\xaf\xac\xf4\x86"
+ "\xe9\xfa\x17\xd0\x16\xb3\xa8\xd6\x37\x9e\xbf\x52\xe0\x3f\x9e\xc7"
+ "\xbf\xf5\xbf\x1a\xcf\x55\x9e\x78\x1e\xdf\xf0\x83\xda\x65\x28\x9e"
+ "\x2f\x3c\x23\xc3\x73\x55\x37\x78\xfe\x83\xd9\x65\x16\x3d\x26\xc7"
+ "\xf3\x45\xb1\x72\x3c\x5f\x74\xbf\x84\xe7\xc2\xb5\x5b\x62\x97\x59"
+ "\x14\x75\x67\xec\x32\x8b\xa2\x24\x99\xfd\x77\xbd\xbb\xc7\xf3\x57"
+ "\x0a\xbd\xe3\x39\x9c\xa7\x78\xfe\x4a\xa1\x4f\x7f\xea\x4e\x78\xfe"
+ "\xbb\x4b\x7e\xe0\xb9\x57\x1f\x95\x1f\x87\x5d\xe6\x77\xcd\xfe\xda"
+ "\x65\x7c\xed\x53\x41\x7c\x97\xfc\x53\xdc\xf6\xa9\x44\x8b\xfb\x54"
+ "\x32\xe4\xfe\x29\xb7\x1c\xdb\x17\x3b\xe5\xd8\xbe\x44\x21\xc7\xf6"
+ "\xe5\x0f\xc8\xb1\x7d\x79\xa4\xd8\x4f\x66\x97\x31\x74\xda\xb7\x22"
+ "\xc7\xf9\x25\xf3\x4d\x2f\x34\x10\x6f\x58\x7f\x41\xa1\xaf\xf0\x8d"
+ "\xf3\x4b\xb2\x7c\xe1\x3c\xfa\xab\xfc\x65\x6e\xbc\x17\x9c\x5f\xba"
+ "\xe5\xff\x07\x9c\xf7\xe5\x87\x42\xf5\x20\xc0\x78\xc4\x7b\x8a\xef"
+ "\x02\xd6\x23\xce\x3b\xff\xe1\xcd\x46\xb3\xb4\xfc\x76\xe1\xbc\x6f"
+ "\x1b\xcd\xb2\xb2\xca\xd9\x02\xce\xdf\xc8\x1e\x9a\xe3\x72\x1b\x4d"
+ "\xde\xa2\xdb\x6d\xa3\xd1\x0f\x90\xe3\xbd\x7e\xba\x1c\xef\xf5\x77"
+ "\x4b\x78\x2f\x5c\xbb\x25\xf2\xbb\x5e\x73\x67\x6c\x34\x7a\x8d\x84"
+ "\xf7\x7a\x67\xf7\x78\xbf\xc4\xe8\x1d\xef\x97\x08\xb1\xd9\x96\x18"
+ "\x6f\x1c\xef\x97\xbb\xf0\xbe\xf3\xfe\x99\x8c\x9b\xf7\x91\x79\xfa"
+ "\x4e\xdb\x68\x96\xfb\xc4\xff\xae\xe2\x63\xdc\xbc\x8d\x46\xd8\x93"
+ "\xb8\xc0\x7b\x7c\x8c\xb2\x2e\x7c\x64\xca\xca\xdd\xb1\x3e\xe1\xa2"
+ "\xdc\x17\x31\xe1\x92\xe8\x8b\x58\x56\x89\x58\xbf\xaa\xaf\x1c\xeb"
+ "\x57\xa9\x7d\xd9\x68\xde\xe5\xdc\x7d\x12\x57\x3c\x2b\xb7\xd1\x14"
+ "\xc8\x6d\x34\x53\x90\xf7\x92\x4e\xf8\xc6\xfa\x15\x89\x72\x1f\x70"
+ "\xb6\x47\xf1\xad\xb9\x82\x0f\xf8\x5c\x37\x1f\xf0\xe7\xfe\x28\x60"
+ "\x7d\xe2\x96\xd2\x2a\x07\xf1\xc7\x0f\xf1\xfb\xfb\x7a\x67\x79\xf5"
+ "\x41\xa4\x6b\x40\x17\x7e\x88\xf3\xce\xa8\xd0\xa7\x79\x4c\x7e\x92"
+ "\x9b\x1f\x62\x17\xf1\x8c\x65\xf8\x3f\x57\xef\x13\xff\xdb\x79\x09"
+ "\xff\xb9\x9f\x49\x76\x1b\x0e\xe5\x7c\x4a\x97\xc4\xf2\xdb\x65\xb7"
+ "\xf1\x66\x27\x31\x8d\x43\xfc\x5f\x79\x9c\xc9\xf9\xf1\x3f\x32\xbb"
+ "\x4d\xd2\xfd\x72\xdc\x4f\x9a\x24\xc7\xfd\x24\x85\x84\xfb\xc2\xb5"
+ "\x5b\xe2\x8b\x9e\x14\x71\x67\xe4\xfc\xa4\x08\xc9\x6e\x93\x74\xb5"
+ "\x7b\xdc\x5f\x91\xea\x1d\xf7\x57\xa4\x32\xdc\x5f\x91\xda\xa5\xdd"
+ "\x46\xe6\x1b\xb9\xea\xcc\xf7\xb6\xdb\x88\x72\xfe\x1d\xdf\xd7\xb3"
+ "\xaa\xc6\x1f\xbb\x8d\x6b\x4f\xfa\xf7\xb2\xdb\x78\xc7\x7b\x51\xb6"
+ "\x2f\xeb\xe2\x9b\xab\x1c\xef\x93\xcf\xc8\xf1\x3e\xb9\x4e\x8e\xf7"
+ "\xa9\xed\x72\xbc\x4f\xb5\x7b\xb3\xdb\xc8\xb1\x7e\xf5\x08\x6f\x38"
+ "\xaf\x9f\x82\x76\x9b\xd4\x42\xdf\x18\xbf\x5a\xe7\x3f\xc6\xa7\xac"
+ "\xfc\x3f\x8c\xf7\xc0\x78\x95\x27\xc6\xa7\x14\xfd\xa0\x32\x3e\xc5"
+ "\xf8\x35\xfb\x64\x18\x7f\x0b\x6d\x39\x37\xb2\x9f\xc4\xb7\x6c\xbf"
+ "\xc6\xc3\xff\x3d\xd5\xc3\xff\x7d\x8d\x9b\xff\x7b\x6a\xd4\xad\xc3"
+ "\xf8\x35\xb7\xde\xff\xfd\x86\x30\x7e\x8d\x9b\xff\x7b\xea\x99\xee"
+ "\x31\x7e\x75\x8c\x77\x8c\x87\xf3\x14\xe3\x57\xc7\x74\x29\xdb\xcb"
+ "\x30\x7e\xed\xfb\xb7\xc3\x96\x73\x67\xf6\x1b\xad\x3d\xe2\x8f\x3d"
+ "\xa7\xab\xb8\x23\x3e\xed\x39\xa3\x45\x7b\x8e\xde\x87\x3d\xe7\x56"
+ "\x61\x7e\x5a\x85\x1c\xf3\xd3\x3e\x95\x63\xfe\x7a\x85\x1c\xf3\xd7"
+ "\x13\xb9\x3d\x27\xa1\x93\x3d\x47\x8e\xff\xe9\x8f\x99\xa6\xb8\xdb"
+ "\x73\x0a\xdc\xec\x39\x86\xbf\xfa\xc6\xff\x74\x9f\xf8\x7f\x8d\xe2"
+ "\x7f\x8c\x17\xfc\xcf\xf8\x5f\x82\xff\x31\xdf\x03\xff\x33\xee\x00"
+ "\xfe\xaf\x3b\xc0\x6c\x3c\x37\x18\x27\xe5\x5d\xff\x6d\x3c\xdf\x6f"
+ "\x1d\x30\xf4\x90\xaf\x03\x86\xd1\xf2\x75\x60\xdd\x25\x69\x1d\x10"
+ "\xae\xdd\x92\x75\xc0\x10\x78\x67\xd6\x01\x43\xa0\xb4\x0e\x18\xbe"
+ "\xee\x7e\x1d\x48\xf7\xb1\x0e\xa4\x0b\xeb\x40\xba\x1f\xeb\xc0\xfa"
+ "\x4f\x7d\xdb\x78\xf4\x37\x6f\xe3\xf9\xf9\x9d\xde\x07\xb5\xbe\xca"
+ "\x2f\x1b\xcf\xf6\xf1\xd1\xe5\x18\x23\xe5\x6b\xa2\x5c\x33\x5f\xb4"
+ "\xf1\x98\x3c\x6c\x3c\xa6\x4e\x36\x9e\xd5\x5f\x0b\xf8\x3f\x49\xd8"
+ "\x6f\x3a\xe5\x7b\xc4\x48\xa1\x39\x94\x37\x54\xc8\xfd\xe6\x37\x50"
+ "\xfc\x97\xe2\xf7\x65\xcd\xc1\x7e\xb1\xf5\xc7\xd4\x45\x0c\xd4\x57"
+ "\x1f\x90\xd9\x74\x26\x79\x8b\x91\x92\x25\xf3\xbb\x91\xef\x37\x7d"
+ "\x75\xa2\x0c\xef\xa7\xb0\xfd\xa6\x6f\x7b\xfb\x4e\xeb\x8a\xc9\x9f"
+ "\x39\x93\xc6\xe4\x77\xc5\xf2\x7b\x75\xe3\x0d\xc5\x92\x9e\x2b\xc4"
+ "\x92\x3e\x77\x07\x62\x49\xdf\x68\x4c\xfe\x73\x9e\xf1\xfb\x32\xaf"
+ "\x9a\xcb\x4d\xa4\x12\x79\x64\xb6\x67\xec\x53\x93\xf7\xbd\xfb\x4a"
+ "\x61\xef\xfe\xd2\xdb\x13\x07\x05\xfb\x43\xd7\xfc\xb0\xac\x69\x07"
+ "\xd2\xac\xb4\x3f\x98\xaf\xfa\x82\xe2\x3f\x57\x97\x03\xaf\x72\x88"
+ "\xa7\x09\x88\xa7\xff\xb9\x9f\xd6\xfd\x1a\x78\x21\x2c\x82\xca\x3f"
+ "\xd9\x1c\x09\xd6\x27\x21\xb6\xfe\x27\xf5\xfb\x02\x31\x02\xb0\x95"
+ "\xd5\x5b\xfb\x35\xef\x74\x86\x69\x30\xa7\xf5\x5d\x07\x97\x56\xf5"
+ "\xa8\xb4\xd8\x60\x5e\x34\xe1\x9e\x58\x85\xd9\xd1\x66\x42\x5a\x1c"
+ "\x5d\x5a\x15\xc8\x03\xfe\xee\xfe\x2d\x09\xf2\x6f\x9e\xfe\x67\x32"
+ "\x95\x67\x70\xdd\x0b\xcb\x9a\x8d\x71\x40\x44\xd9\x8a\xfb\x4e\xb2"
+ "\x6f\xed\x82\xf1\xe1\x78\xb6\xf6\xcd\x5b\xc8\x70\x03\x9e\x37\x06"
+ "\xc6\x92\xfa\xd8\x22\x6e\xd0\x1c\x56\x80\x1b\xf9\x2d\xd2\x77\x6c"
+ "\x6c\x1f\xc7\x88\xd9\x51\xb2\x24\xff\x17\x8b\x2f\x6c\x7d\x75\x9a"
+ "\x77\x6c\x7d\x75\x1a\xc3\xd6\x57\xa7\xb9\xb0\xd5\xe2\xc5\x8e\x22"
+ "\xf3\x63\x7f\x4d\xf0\x7f\x31\x79\xc8\xd8\xa6\x7f\xc1\xf8\x28\xaf"
+ "\xf9\xe5\xff\x42\xf1\x74\x31\xc3\x53\xc4\x2b\x11\x53\x25\x3b\x8a"
+ "\xc9\xa7\x1d\xa5\x3b\x4c\xf5\x6b\x0f\x3f\xc5\xd4\xd7\x07\xc8\x31"
+ "\xf5\xf5\x41\x72\x4c\xdd\xb4\xcf\x13\x53\x3b\xe3\xe9\xeb\x71\xde"
+ "\xb0\x94\xc5\x47\xd9\x34\xdd\x37\x8e\xbe\x6e\xf4\x85\xa3\xd4\x3f"
+ "\x7d\xae\x9b\x7f\xba\x0b\x47\x7f\xbf\x47\x8e\xa3\xaf\x57\xdf\x28"
+ "\x8e\xd2\xdc\x26\xe7\x7e\x80\xdc\x26\x37\x8d\xa3\x7a\x0f\x1c\xdd"
+ "\x38\x56\xc2\x51\xcf\xfc\x26\xdd\xe0\xe8\xa2\xdb\x13\x03\x45\x86"
+ "\xa3\x9c\x95\xf6\x47\xb3\x94\xf6\xf5\xb8\x1c\x47\x37\xda\x7c\xe3"
+ "\xe8\xc6\x2d\x12\x8e\xb2\x7a\xb7\x17\x47\x37\x9a\x64\x38\xba\xc8"
+ "\x0d\x47\xff\x29\xe9\x10\xe8\x63\xe1\xc2\xd1\x25\x6e\x38\xba\xa8"
+ "\x3b\x1c\xdd\x68\xc2\x31\x62\x32\xea\xa6\x57\xbb\xc7\xd1\xd7\x73"
+ "\xbd\xe3\x28\x9c\xa7\x38\xfa\x7a\xae\x84\xa3\x5e\x64\x54\x19\x8e"
+ "\x66\x2f\xf4\x03\x47\x7f\xe4\xb1\x51\xb2\xe3\xfd\xb2\x55\x48\x7b"
+ "\x3a\x3b\xc7\x48\x9d\xe3\xbe\x27\xa8\xd8\x23\xef\x49\x71\xa7\xbc"
+ "\x27\xab\xc5\x3d\x9e\x13\x05\x5c\x7d\xee\x7b\xe0\x2a\xdd\xe3\xb9"
+ "\x79\xb5\xdc\xf7\x64\xf3\x5a\xd1\xf7\x84\xe1\xea\x1b\xa1\x62\xbf"
+ "\xa4\xbc\x27\xc5\x5d\xc4\x48\xdd\x5c\x21\x8b\x8d\x32\xd1\x3d\x36"
+ "\xca\xd6\xe3\xbe\x63\xa4\x6e\xb6\xc9\x62\xa3\x9c\x2c\x74\xe5\x3d"
+ "\xf1\x8c\x91\x2a\x61\xec\x96\x1e\x14\x63\x5d\x31\xa8\x8c\xa3\x5d"
+ "\x31\x52\xbb\xd9\x17\x84\xed\x1c\xac\x8f\xbf\xfd\x18\x6b\xf2\x03"
+ "\x63\x65\x79\x4f\x3c\x63\x4c\x6d\x79\xcb\x5c\x5a\x4c\x2a\x63\x8a"
+ "\xbd\xc4\x46\x2d\xbe\xa3\xb9\x4f\xb0\x5f\xde\xb1\x76\xeb\x08\x39"
+ "\xd6\x6e\x8d\xa1\x75\xeb\xbc\x61\xed\x16\xa7\x84\xb5\xac\xde\xda"
+ "\x3a\x0f\xac\xad\xf5\x81\xb5\xb0\xae\xee\xbe\xe0\x2f\xd6\x6e\x1d"
+ "\x4e\xb1\xd6\x20\x60\x6d\xd3\xad\xc6\xda\xad\xc3\x25\xac\xdd\x7a"
+ "\xa5\xfb\x1c\x53\x9b\x1d\xde\xf7\xe5\x6c\x76\x30\xac\xdd\xec\xe8"
+ "\x32\xc7\x94\xcc\xe7\xe3\x8d\xaf\xc5\x1c\x53\x92\x3d\xa0\x58\xb0"
+ "\x07\xfc\x2b\xe7\x44\x79\xc3\xe2\xaf\x3d\xe0\x13\xd0\xdd\x71\xdf"
+ "\xe5\x1a\xcc\x39\x35\x1b\x73\xa2\x14\x79\xd8\x03\x8a\x3a\xdb\x03"
+ "\x66\x76\x8d\xb1\x7e\xd9\x03\xe8\xbe\xcb\x9c\x3a\x39\xc6\xe6\x7c"
+ "\x2d\xc7\xd8\xdc\xd5\xe2\x3e\x4b\xec\x8f\xef\x98\xa9\xdb\x46\xb8"
+ "\xec\x01\xb5\x72\x6c\x95\xec\x01\xb9\x8f\xf8\xc6\xd8\x6d\x72\xfb"
+ "\xef\x73\x85\xb2\x7d\x96\x6f\xd7\xbb\xc7\xa1\x16\xe3\x4f\x6d\x5f"
+ "\x59\x56\xed\x8e\xb1\xdb\xf2\xfe\x95\xe2\x50\xbb\x62\x4d\x75\xe3"
+ "\xcb\xdd\x39\x0e\xf5\x1f\x42\xcd\xa5\x45\x04\xf7\xb6\x51\xbc\x95"
+ "\xd9\x06\x8a\xee\x8c\x6d\xa0\xb4\xc8\x87\x6d\xe0\x0f\xdb\xe4\x38"
+ "\xfb\x87\x52\x5a\xf7\x8c\x37\x9c\xfd\x43\x9c\x84\xb3\xac\xde\xda"
+ "\x33\x1e\x38\x5b\x73\x2b\x65\xda\x3f\xe4\xdc\x5e\xdb\xc0\x1f\x72"
+ "\x24\xdb\x40\xee\x0d\xec\x7f\xdc\x16\xe3\x1d\x67\xb7\x09\x76\xd7"
+ "\x6d\x92\xdd\xb5\xc6\x4b\xbe\x14\x19\xce\xee\x18\x2b\xee\x7f\xa4"
+ "\x32\x6d\xad\x28\xd3\x16\xfd\x0b\xe6\x4b\xd9\x31\xc6\x5f\xdb\x00"
+ "\xee\x73\x47\x6c\x45\xec\x12\xf1\x55\xb2\x0d\x14\xf9\xb6\x0d\x74"
+ "\x83\xaf\xfe\xe7\xee\xdb\x39\x56\x8e\xaf\x3b\x9f\x96\xe3\xeb\xae"
+ "\x0a\x4f\x7c\xed\x8c\xad\x3b\xd7\x79\xc3\x55\x66\x1b\xd8\x95\xea"
+ "\x1b\x53\x77\xee\xf7\x85\xa9\x34\xa6\x5f\xbd\xe4\x23\x2d\x61\xea"
+ "\x9b\x65\x72\x4c\xdd\x69\xbd\x51\x4c\xbd\x23\xf9\x52\x6e\x1a\x53"
+ "\xe3\x3d\x30\x35\x2f\x4e\xc2\x54\xcf\x9c\x29\xdd\x60\xea\xed\xb2"
+ "\x13\xb8\x63\xaa\x4c\x76\xcd\xbb\x28\xc7\xd4\x5d\x91\xbe\x31\x35"
+ "\xef\x5d\x09\x53\x59\xbd\xdb\x8b\xa9\x79\x8d\xb7\xd7\x4e\x90\xd7"
+ "\x28\xc9\xae\xbb\x0e\x74\x8f\xa9\x3b\x0f\x7b\xc7\xd4\x9d\x87\x19"
+ "\xa6\xee\x3c\x7c\xe3\x7b\xca\xf3\xb7\xf8\x81\xa9\x3f\xf2\x5c\x2a"
+ "\xf9\x46\xbf\xed\x04\x68\x6f\x45\x2c\xad\xfd\x7e\xb1\x43\x92\xc5"
+ "\xd8\x21\xe3\x05\x8c\xfd\xe5\xf7\xc5\xd8\xdd\x7b\xe4\x3e\x0d\xbb"
+ "\xf7\x89\x3e\x0d\x0c\x63\xff\x6b\x82\x3c\x3f\x6a\xe7\x58\x21\xf2"
+ "\x18\xaa\xbb\xaf\xba\xec\x04\x88\xb9\xe3\xdd\xed\x04\x7f\xbc\xea"
+ "\x1b\x6f\x0b\x22\x65\x76\x82\x8f\xbc\xe3\xed\x35\x19\xde\xee\xf9"
+ "\x39\xc5\x5b\x57\x0c\xd5\x82\x18\x31\x86\x6a\xb7\x32\xac\x0c\x6f"
+ "\x63\x7e\x18\xbc\x2d\xbe\x71\xbc\x95\xe7\x52\xf1\x8c\x97\xba\xa7"
+ "\xce\x5c\x02\x78\x4b\xe3\x75\x78\xc6\x4c\xbd\xb1\x78\x1d\xb7\x2b"
+ "\x66\x2a\xf6\xcb\x3b\xee\xfe\x71\xbe\x1c\x77\xff\x98\x43\xeb\x7a"
+ "\xc5\xdd\x3f\x3e\x26\xe1\x2e\xab\x77\xc3\xb8\x7b\x53\x36\x83\x3f"
+ "\xc6\xdc\x5e\x9b\xc1\x1f\x63\x24\xdc\xfd\xaf\x41\xdd\xe3\x6e\xc1"
+ "\x40\xef\xb8\x5b\x30\x90\xe1\x6e\xc1\xc0\x2e\x71\x57\xe6\x43\xb0"
+ "\xb7\xaf\xd7\x58\x1e\xb5\xff\xea\x79\x56\xf6\xaa\x6f\xc6\x66\x00"
+ "\x18\xac\x4c\xc5\x18\x4e\x31\xe8\x43\xd0\xbd\xcd\xa0\x3b\xbc\xf5"
+ "\xdf\x66\xb0\x2f\x54\x8e\xb7\xfb\xfa\xca\xf1\xb6\xf0\x38\xf6\xab"
+ "\x4b\x9b\x01\xc5\x80\x7d\xf3\x5d\x36\x03\x8b\x1c\x67\x25\x9b\x41"
+ "\xe1\x72\xdf\xdf\xbe\xf6\x6d\x94\xc9\xb7\xbf\xf4\x88\x59\x3d\x57"
+ "\xc2\xdb\x93\x95\xa2\xcf\xd8\x9f\xde\x2f\x9b\xe6\x8e\xb7\xfb\xaa"
+ "\x3a\xc5\xac\x9e\x7e\x0b\x63\x56\x4f\xbf\xc5\x31\xab\x67\xc8\x63"
+ "\x56\xef\xbc\x26\xf9\x91\xf9\x1f\xb3\xfa\xcf\x33\x29\x06\x23\x0f"
+ "\x61\xdc\xea\x1b\xb1\x23\xdc\xe6\x5c\x2b\x32\xec\x95\xd9\x11\xfe"
+ "\x5c\x27\xc7\xde\x42\x95\x6f\xec\xfd\xf3\x01\x09\x7b\x59\xbd\xdb"
+ "\x2b\xf3\xfe\xb9\xf6\xf6\xda\x11\xfe\x5c\x2b\xd9\x11\x0a\xf7\x78"
+ "\xc5\x5e\xd9\xb7\xb1\x7d\x39\xde\xbf\x8d\xc1\x79\x8a\xbd\xfb\x72"
+ "\x7c\xda\x11\x3a\xf9\x6f\xbd\xf5\x2a\xfb\x36\x26\xc8\xbc\x16\x3f"
+ "\xec\x08\x3f\x3a\x1f\x83\xb7\x36\xdc\x8c\x1d\x01\xf1\x16\xf1\x4c"
+ "\xc4\xdc\x1b\xb1\x23\xdc\x7a\x19\xf7\xed\x57\xe5\x98\xfb\xf6\x6b"
+ "\x72\xcc\x3d\xf8\x88\x27\xe6\x76\xc6\xdb\xb7\xcb\xbc\x61\x2d\xb3"
+ "\x23\x1c\xa8\xf1\x8d\xb3\x6f\xdb\x7c\xe2\xac\x87\x6f\xae\x84\xb3"
+ "\xfb\x07\xc9\x71\xf6\x2f\xa3\x6f\x0a\x67\x6f\x34\x07\xcb\x8f\x0a"
+ "\x67\x63\x3c\x70\x76\xff\x71\x09\x67\x3d\xf3\xb0\x74\x83\xb3\xb7"
+ "\x29\x0f\x8b\x6f\x19\xf7\xc0\x04\x39\xce\x1e\x48\xf6\x8d\xb3\x07"
+ "\xfa\x4a\x38\xcb\xea\xdd\x5e\x9c\x3d\x30\xfe\xf6\xda\x16\x0e\x8c"
+ "\x97\x64\xdc\x83\x77\x77\x8f\xb3\x6f\x3b\xbc\xe3\xec\xdb\xc2\x77"
+ "\xb1\xb7\x1d\x3e\x65\xdc\x4e\x38\x7b\xf0\x92\x1f\x38\xfb\x23\xf7"
+ "\x41\x38\xe8\x57\xfc\x0b\x37\x7b\x6d\x4f\xb3\xc5\x63\xbf\xc4\x19"
+ "\xf7\xfd\x12\x6e\xb6\x85\xf1\xa2\x6d\x41\x9e\x9f\x25\x59\xb4\xdf"
+ "\x46\x0b\xb8\x3b\xee\xfb\xe2\xee\x21\x67\x9b\x0b\x77\x13\x00\x77"
+ "\x8b\xe8\xfe\x88\x36\x17\xee\xfe\xf7\x3b\x62\xbf\xa4\xfc\x2c\x3e"
+ "\x6c\x0b\x4f\x60\x7b\x45\xcf\xbb\x6c\x0b\x88\xc3\xd1\xee\xb6\x85"
+ "\xff\x8e\xf3\x8d\xc1\x45\xc9\x32\xdb\xc2\x07\xde\x31\xd8\x26\xc3"
+ "\xe0\xbf\xbe\x45\x31\xf8\x09\x11\x83\x8b\x8e\x5c\x03\xdd\xf2\x5a"
+ "\xa6\x7f\x18\x6c\xa3\x18\x3c\xf1\xce\x60\xf0\xe1\x5b\x80\xc1\x74"
+ "\xdc\xff\x36\xd9\x6c\x02\x0c\x9e\x8d\x18\x3c\xf1\xc6\xec\x0d\x3f"
+ "\x50\x8e\x16\xec\x97\x77\x2c\xfe\xdb\xa7\x72\x2c\xfe\xef\x40\x5a"
+ "\xd7\x2b\x16\xff\x6d\x8f\x84\xc5\xac\xde\xed\xb5\x37\xfc\xad\xea"
+ "\xf6\xda\x1b\xfe\x56\x25\x61\xf1\x7f\x6f\xeb\x1e\x8b\x8b\x32\xbc"
+ "\x63\x31\x9c\xa7\x58\x5c\x94\xd1\x25\x16\x3f\xe1\x8e\xc5\x87\x5d"
+ "\x32\xaf\xcc\xde\x60\xf9\x57\xcf\xdd\x72\xd8\xa7\xfc\xab\x79\x90"
+ "\x64\xd4\x2b\x0e\xd7\x99\xf3\x08\x69\x35\x90\x0c\xb3\xe3\x09\x02"
+ "\xe7\x60\xfc\xde\xe9\x61\x8e\x18\x4d\xb8\xad\x5a\x8a\xc7\x6f\xe0"
+ "\x3f\xc8\xb8\x46\xa5\x30\xb7\xe8\x18\xbf\x43\xfd\x5d\xf1\x3c\x62"
+ "\xef\x6e\xb7\xeb\xde\x9e\xc5\x1b\x87\x34\x08\xf7\xc5\xb0\x7d\x37"
+ "\x43\x1a\xc5\x32\xf2\xa6\x45\xf1\x4e\x2c\xbf\x65\x88\xc5\x1a\x3a"
+ "\xc4\xe2\xed\xfe\x87\x55\x24\xa8\xcf\x3a\x9e\xcf\xdf\xce\xdb\x5a"
+ "\x07\x3f\x10\xd5\xfa\x3a\x21\xc6\xed\xbc\xb5\x2d\xf3\x9d\x3c\x78"
+ "\xc7\x92\x3f\x40\xbd\xd6\xb0\x3d\x51\xad\x86\x69\x04\xce\x15\x89"
+ "\xe7\x60\xdc\x08\x67\x08\xe0\x39\xb8\xc6\x6f\xbd\x12\xb9\x3b\x0d"
+ "\xb0\x2a\x95\x90\x91\xd7\x70\xce\xbc\x63\x02\x9e\x51\x67\x43\x9b"
+ "\x9b\xa1\x2d\xfe\xbe\xfe\x36\xe0\xc7\xc0\x4a\x18\x31\x78\xef\x2c"
+ "\x78\xaf\x82\x6c\x1c\xfb\x80\xa1\xb9\xbc\x32\x90\x70\xfb\x22\xb3"
+ "\xf8\xbe\x13\xa2\x81\x1e\xc4\x98\x40\x68\x4e\x8d\xcd\x50\x8f\x57"
+ "\xa6\xf3\xdc\xa0\xfe\x2a\xb3\xc3\xc6\xe6\x34\xf4\xef\x28\xe8\xb1"
+ "\x3c\x3c\x37\x3f\x81\xa8\xe0\x3f\x98\xdf\x36\x21\xba\x2d\xf3\x7f"
+ "\x26\xc2\x7b\x46\x61\xbf\x7c\xbd\xe3\xe6\x9d\xb0\xee\xf4\x8f\xc0"
+ "\xb5\x83\x3e\x1f\x9f\x4d\x9f\xa3\xe4\xb2\x9c\x70\x9e\x37\xa4\xf3"
+ "\xe6\x64\x07\x09\x81\xb1\xd8\x0d\xfd\x46\x7e\xe4\xfe\xf4\x40\xd4"
+ "\xfa\x7e\x84\x1c\x4c\x69\x54\x9a\xa1\xef\xce\x3f\xf4\xb7\x99\xd2"
+ "\x7e\x4a\xe0\xba\x15\x75\x96\x0b\x8a\xbf\x4f\x98\x7a\x91\x10\xc4"
+ "\x13\xf8\xfd\xbc\x0d\xd6\xb1\xc9\x50\xde\x0c\xef\xc1\xb5\x46\x04"
+ "\x62\xdd\x0b\x8a\xff\x71\x9a\x92\xce\x92\x10\x3d\x09\xca\x86\x77"
+ "\x63\x75\xff\xa7\x1c\xeb\x5a\x14\x7f\x9f\x86\x7d\x80\xb2\x05\xca"
+ "\x78\x1f\xfa\x90\x11\x7e\x6f\x64\x16\xe5\xcd\x9c\x09\xd1\xdc\xa0"
+ "\xc8\x2c\x8a\x7d\xf0\x9e\x9b\xe1\x9d\xa1\x4e\x30\xd4\x09\xa6\xc7"
+ "\x34\xa2\xca\x81\x73\xd8\x0e\x1c\x83\x4d\x4b\x3b\xb0\xed\x23\xd8"
+ "\xb6\x8f\x71\x08\xe4\xd5\x13\xa2\x79\xe0\x6d\x5c\x53\x35\x69\x8a"
+ "\x4f\xeb\x15\x7f\xb7\x86\x28\x78\x9e\xdf\xdb\x5f\xb5\x3e\x8d\x04"
+ "\x1b\x39\x42\x4c\xfd\xb0\x9d\xbf\x97\x41\xfb\x81\x38\x16\x6d\x99"
+ "\x7f\x2f\xb4\x28\xfe\x67\x3a\x8e\x2f\xd0\xd3\xa6\x79\x18\xdf\xa1"
+ "\x98\xe0\x73\xf0\x1e\xa1\x3e\x1d\x4f\xec\xb3\x26\x2d\x80\x87\xf2"
+ "\xc5\x00\xc5\xd7\x24\x20\xa2\xf7\x40\xb8\xbf\xd1\x42\x96\xd2\xfb"
+ "\x2d\xec\x3e\xe0\xa5\xbf\xc3\xef\x77\xf4\x78\x0e\xcb\x3e\xfa\x1b"
+ "\x2c\xd2\xad\x22\x02\x78\xc3\x93\x76\x22\x8f\x00\x5f\x88\x3c\x82"
+ "\xfd\x3d\x94\x66\x51\xd2\x75\x58\x51\x4c\xf5\xba\x6c\xa0\xa1\xf3"
+ "\xcd\x88\xc0\xcd\x30\xb6\xdc\x75\xa4\x4b\x3d\x5c\x7b\xf7\x69\xa4"
+ "\xcb\xe6\x14\x12\x24\xd4\x8d\x95\xfa\x8f\xe5\x77\x29\x3d\x39\xa0"
+ "\x05\xdb\xbb\xf9\x6e\x5f\x7c\x9f\xcd\xd7\x80\x8e\xe1\xbc\xad\x24"
+ "\x19\xfa\x85\x7c\x0b\x3c\x72\x30\xc1\xae\x44\xbf\x3e\x3c\x7f\xb4"
+ "\xc5\xae\xdc\xdc\x44\x50\xae\x24\x9b\x00\x97\x77\x25\xc1\x98\x43"
+ "\x9b\xfc\xc0\xfe\xaa\x47\x45\x3a\xa6\x00\xed\x92\x80\x77\x61\xcc"
+ "\x37\xc3\xf8\xe5\x03\xe6\xe1\xef\x7c\x58\x7f\x38\xa8\x67\x51\xbc"
+ "\x3b\x0d\xda\x53\xed\x0a\xe7\xad\xbb\xc3\xf9\x66\x18\xc3\xd1\x6d"
+ "\x99\xef\x0e\x17\xc7\x10\xfb\xb4\x19\xce\x6f\x82\xeb\x30\x9e\x85"
+ "\x8c\x87\x8a\x93\xc5\x77\xf6\x35\x9e\x1b\x0f\x92\xd1\x9b\x0e\x92"
+ "\xc8\xd7\x0f\x92\x31\x6b\x1a\x60\x5e\x1a\x9e\xe2\x3f\x99\xed\x80"
+ "\x35\xd1\x30\xba\x23\x7c\x64\x14\x7e\x7b\xe2\xd6\xf7\x2f\x78\xf5"
+ "\x20\x19\x8e\x7b\x63\xa7\x82\xe4\x89\x6b\xf8\xd4\x1e\x5f\xf1\x66"
+ "\xfd\x55\xc2\x85\x1a\x46\x3b\xd7\x0f\x0d\x9b\x72\x95\x90\x13\x5a"
+ "\x1b\x49\x4b\x84\xb5\xbc\xa5\x91\xa4\xd9\x78\x6b\x65\xc6\x45\x02"
+ "\xd8\x53\xc3\xc6\xee\xbd\xe6\xa9\x71\x84\xe0\x9e\x41\xee\x9f\x5a"
+ "\xd2\x3b\x9e\x04\xa6\x9e\x21\x11\xe9\x0d\x7c\xa3\x73\xfb\x93\x9a"
+ "\xb4\xb5\x44\x79\xb0\xa5\x86\xc9\x9e\x8a\xf7\xde\x7f\x1f\xf7\xa7"
+ "\xb6\xe9\xc8\x3c\x87\xb0\x1e\xe5\x4c\x98\x98\xbe\x90\xdc\x8f\xef"
+ "\x13\x42\x65\xaf\xf7\x66\xc2\xb8\x4d\xf4\x0f\x9f\xdf\x1b\x48\xe9"
+ "\xb9\x7d\x4c\xd1\xc1\x05\x76\x90\xb7\x5a\xa2\xd3\xe3\xf8\x46\x94"
+ "\xeb\x60\x7d\xa1\xb2\xa0\xb9\xd1\x01\xb2\x55\x2c\xac\xdf\x16\x72"
+ "\xac\xbe\x40\xc9\x6d\x69\x89\xf6\xf3\x19\x59\x74\xdd\xc6\xb5\x14"
+ "\xfa\x3e\x43\x4b\x32\x68\xff\x61\xcd\x0c\x49\x44\x79\x8a\xff\x0a"
+ "\xfb\x7f\x14\xde\x95\x1f\xa0\x2b\x80\xfa\xc1\xb8\x7e\x4e\xad\x35"
+ "\x91\x72\xbb\x93\xec\x6c\xa2\x63\xd4\x13\xc6\x28\x10\x68\x6e\x81"
+ "\x71\x0a\xf2\x46\x37\xa4\x19\x67\x34\x8c\xe6\x02\x18\x6d\x28\x5d"
+ "\x6c\x8c\x2e\x53\x96\x13\x58\x47\x81\x36\x5b\x18\x6d\xb8\xbe\xe3"
+ "\xa3\x90\x36\xfe\xbd\xc7\x3f\xa6\xf9\x5a\x5f\xf0\xd9\x3c\xf0\x07"
+ "\xf2\x05\xa7\x1e\x1f\x85\xcf\xc6\x3e\xe0\xf7\x33\xe4\x83\xa9\xaf"
+ "\x7e\xc5\x57\xea\x1b\x89\x19\xde\x87\x0f\x75\xef\x83\xc3\xdf\x3e"
+ "\x54\xfb\xea\xc3\xc6\x91\xc0\xb7\x23\x81\x6f\x47\x02\xdf\x5a\x18"
+ "\xdf\x9e\xac\x65\x7c\xeb\x84\x7e\xb5\x83\xec\xbe\x66\x06\x51\x62"
+ "\xbf\xf6\x9f\xc5\x18\x7d\xd0\xcf\x46\x89\x77\x27\x5f\x82\x31\x12"
+ "\xf9\x37\x60\x68\x18\x8e\x4f\xa5\xad\x86\xa4\x23\xff\x76\x78\xe3"
+ "\xdf\xf7\xf7\x4f\x9d\x0f\xb4\x79\x05\xf8\xf7\x5b\x2d\x09\x6e\x20"
+ "\x81\x6b\x67\x00\xff\x36\x7a\xe3\xdf\xf7\xd7\x1e\x81\x67\x76\xe2"
+ "\xdf\x38\x77\xfe\x7d\xff\x7e\xff\xf9\xf7\x48\x83\x8b\x7f\x5f\x12"
+ "\xf8\x77\xa1\x07\xff\x36\xb8\xf1\x2f\xbe\xb7\xdf\xfc\xfb\xfe\x44"
+ "\xff\xf8\xf7\x48\xb9\x8b\x7f\x41\x2f\xd9\xf9\x5b\x3a\x46\x3d\x61"
+ "\x8c\x80\x7f\x8f\x14\xc0\x38\x79\xe5\xdf\x1f\x9e\x7e\xc7\x16\xdf"
+ "\x38\xfd\x8e\x8d\xed\x9e\x7e\x47\xcf\xf8\x4f\xbf\xa3\x7b\x6f\x3f"
+ "\xfd\x8e\x05\xf9\x47\xbf\xa3\x1b\x7d\xd3\xef\x68\xcc\x8f\x87\x7e"
+ "\xc7\x87\xdf\x38\xfd\x4c\xce\xee\xe9\x67\xda\xe1\x3f\xfd\x4c\xb1"
+ "\xb7\x9f\x7e\xa6\x52\xff\xe8\x67\x9a\xe4\x9b\x7e\x26\x8d\x2f\xfa"
+ "\x3d\x73\x3f\xc7\x73\xe8\x37\x17\x3e\xd4\x88\x32\x10\x93\xd7\x8e"
+ "\xb7\xa3\xce\x08\xe5\x40\xb1\x4c\x65\x2a\xd0\xab\x3d\xca\xc1\x1e"
+ "\x65\x95\x47\x59\xed\x51\x8e\xf0\x28\x47\x8a\x65\xa0\x57\x8f\xcb"
+ "\x8a\xe3\x0b\x41\x67\xcb\xb0\x28\x3e\x08\x14\xae\x0f\x9c\xe7\xd4"
+ "\xa0\xde\x37\xd0\x5b\xdf\x37\x1b\x78\xbb\x3e\x8d\xf4\x6f\x52\x7c"
+ "\xa0\xa7\xf4\x58\xdf\x4f\xcb\xa7\x64\x10\xa0\x47\xe2\x94\xb5\xc8"
+ "\x57\x56\xc2\x5f\x8f\xe8\x09\xe3\x74\x1f\xe8\x9b\x56\xe4\x39\x4d"
+ "\xc2\x31\xbe\x5e\xf1\xc1\x1c\x7c\xbf\x91\x7a\x13\xe1\x02\x86\x6a"
+ "\x51\x17\x02\xfa\x24\x5a\x03\x86\xf6\xe3\xf7\xcc\x8c\xca\x56\x72"
+ "\x41\xd9\x06\x4e\xb3\xd6\xca\x5b\x27\x5d\x81\x75\x0c\xd6\x32\x73"
+ "\xb3\x1d\x78\x92\xb7\x9a\x12\x2e\x41\x7f\x3f\x38\x51\x91\x0a\x6d"
+ "\xc3\x73\xe0\x59\x7a\x5e\xd5\x32\xdd\xec\xa8\x22\x3c\xb4\x51\x69"
+ "\x2b\x05\xdd\xbf\x86\x08\x6d\xea\xf9\xd0\x96\xe9\xd8\xa6\x57\xfd"
+ "\x2c\x67\x68\x09\x3c\xf3\x89\x19\xda\x40\xc2\xaf\x0b\x54\xfb\xc7"
+ "\x1f\x1f\x34\xfa\xd4\xfb\x72\x86\x8d\x67\xed\x06\xdd\x44\xbb\x1f"
+ "\x46\x77\xd1\xae\xd0\x5f\xd5\xcd\xb4\x9b\xeb\xbb\xdd\xe1\x42\x7f"
+ "\x35\x37\xd3\xae\xb5\x8b\x76\x85\xfe\x46\xdf\x44\xbb\x25\x3e\xf3"
+ "\x7f\xf0\x39\x23\x84\xfe\x66\xdc\x4c\xbb\x05\xbe\xdb\x1d\x5a\x72"
+ "\x73\xbc\x50\x62\xeb\x8a\x17\x6e\x8e\x0f\x4e\x74\xf1\xfe\xc3\x4a"
+ "\x6e\x8e\x07\x4e\xe4\x75\xc5\x03\x37\x47\xff\x13\x5d\xd2\xff\xe6"
+ "\x68\xff\xd1\xf8\xae\x68\x7f\x73\x74\xff\xc8\x27\xff\xa3\x2e\x0b"
+ "\xb4\x8f\xe1\xc3\x75\x46\x6e\x6b\x47\x0c\x17\x3e\x74\xc1\x7a\x2e"
+ "\x9a\x3c\x03\x18\x16\x92\x4b\x42\xa3\xa9\x7d\xe8\xe3\xe1\x6b\xf3"
+ "\x88\xd2\xa8\xe4\x94\x07\x52\x6a\x94\x66\xc7\x68\x92\xee\xe0\x9d"
+ "\x7b\x93\xec\x8a\x9f\xc0\xf9\xe3\xf1\x84\xd8\x56\x68\x09\x6d\x27"
+ "\xac\x23\x26\x3b\x2d\x9a\x4c\x75\x12\xb4\x47\xd8\x3e\x4c\x05\x0c"
+ "\x03\x1c\x33\xe7\xda\x71\xcd\x0b\x85\xfb\x1c\xc0\xbf\xd0\x86\x9d"
+ "\x1c\xe2\xac\x8a\xe8\x04\x5a\xcf\x0a\x7a\xa3\x95\xdf\x3e\x74\x01"
+ "\x9f\xae\x25\x1b\xe0\x37\x3c\x73\x5b\x80\x95\x28\xf3\x41\x9f\x6c"
+ "\xcb\xfc\xd8\x68\x51\x94\x2e\x46\x1d\x13\x74\xd9\xe6\xf4\x2b\x68"
+ "\x73\xd7\x19\xd7\x83\x5e\x8b\x75\x0f\x72\x56\xe5\x48\x3d\x51\xe2"
+ "\x6c\x84\xba\x47\x8e\x27\x12\xd2\x85\xcd\x25\x90\x53\x8f\xdb\x8b"
+ "\xf7\x63\x3b\x68\xcb\xdc\xcc\xc1\xd8\xaa\x27\x4c\xc4\xfe\xf2\x39"
+ "\x23\x23\x4c\x29\xb8\x2e\x94\x8e\x9f\xf0\x08\xdf\x26\xe0\x7c\xbf"
+ "\x26\x28\x53\x9d\xdd\xc0\x57\xf1\xaa\x2b\x13\xf9\xec\xde\xd1\x95"
+ "\xb6\x16\x62\x4a\xea\x20\xf5\x8a\xd2\x09\xf8\xec\x56\xf5\xb8\x02"
+ "\x9b\x7a\x5c\x61\x5b\x66\x69\xb4\xd8\x5f\x7c\x96\x78\x1e\x6d\x14"
+ "\xac\x8f\xa5\x31\xc7\x53\x7d\xf7\x11\xd6\x92\xb0\xa9\x11\xbc\x15"
+ "\xc7\xd0\x94\xd6\x02\x7d\x29\x3b\x8d\xe3\xcc\xe7\x8c\xd3\xdb\xd2"
+ "\xb5\x0f\x32\x9b\x5d\xa9\x03\x6d\x3f\xb0\x0e\xc4\x52\x3b\xcc\x96"
+ "\x96\x58\xea\x67\x03\x78\x0f\x3a\xbb\x16\xe5\x95\xcb\x8a\x52\x9a"
+ "\xff\x78\x86\x56\xe9\xa7\xce\x53\x4a\xd7\x7f\xd3\x83\x38\x0e\x65"
+ "\xef\xc3\xf3\x9e\xac\x57\x94\x69\x98\x1d\xaf\x25\x19\x9f\x07\x75"
+ "\xf6\xc3\x33\x93\x79\xe3\x95\x68\xac\x07\xd7\xa3\x85\xeb\x19\x6e"
+ "\xd7\x33\xa0\xcf\xc5\xc2\x75\xc1\x0e\xd8\xb2\xc1\xed\xfa\x06\xfd"
+ "\x83\x68\x97\x2b\xcb\xc2\x77\x82\xb5\x2c\x06\xd7\x35\xb4\xf9\x33"
+ "\xbb\x7a\x4b\x8c\x50\x2f\xb1\x59\x51\xb6\xa7\x15\xf8\x0a\xae\xa7"
+ "\xba\xdd\x9f\xfa\x61\x72\x14\x79\x66\x17\x8e\x69\xd9\x61\x4b\xc0"
+ "\xd5\x1a\x66\xcb\x29\x2d\xa2\x63\xa1\x6a\xd1\xb9\xb7\x67\x51\x94"
+ "\x65\x40\x9b\x3a\x1b\xc8\x7a\x50\x27\x17\x9f\xe9\x3e\xfe\x71\x09"
+ "\x09\xcb\x12\x34\x83\x62\x35\xb1\x4b\xe6\x6b\x5e\x5e\xb6\x72\x69"
+ "\xe2\xd8\x41\xb1\xbd\x08\x71\xe3\x1d\x15\x6f\x08\xe1\xb9\x9c\xb1"
+ "\x8d\xe6\x5c\x90\xb1\x94\x2a\x58\x6f\x3b\x48\x0e\xd0\xd5\xb1\x7d"
+ "\xb2\xc9\x19\x3e\x79\x9a\x73\xfb\x48\x53\xfa\x55\xa2\x4c\x8b\xe0"
+ "\xbf\x36\xa5\x8c\x03\x1a\x9c\x9c\x8c\xeb\xbd\x19\x46\x6f\x23\xf0"
+ "\xab\x29\xe5\x03\x3c\x47\xf7\xc0\x98\x63\xd8\xb9\xff\x4e\x2b\x55"
+ "\x1e\x4b\xab\x51\x96\xc7\xb4\x90\x0f\x23\xac\xa4\x44\xd3\x42\xf2"
+ "\xf0\x3c\x57\x45\xbf\xcd\x40\xfd\x77\xf0\x59\x68\xdf\xc2\xdf\xcc"
+ "\x56\x77\xf2\xe7\xf8\x1c\x4d\x3f\xfc\x66\x70\x72\x2c\x3e\xcf\xa2"
+ "\x38\x39\x26\x20\x8f\x28\x40\x9e\x09\x86\x7a\xed\xdc\xb6\xb1\x8d"
+ "\x74\x7e\x67\x96\x35\x3b\x94\x61\x23\xf2\xb7\x92\xa0\xdd\x5b\x09"
+ "\xc9\x0b\x23\x81\x6d\x99\x27\x1b\x2c\x81\xc1\x79\x38\x5e\xd0\x74"
+ "\x70\xab\x92\x3c\x05\xe7\xec\x16\xb2\xa4\x19\xcf\xc1\xbc\xb2\xf9"
+ "\xc2\x0b\xfc\x56\x66\xdf\xdb\x6f\x1a\xa7\x1e\x5b\xc3\xc3\x58\xd8"
+ "\x07\xf6\xcb\x08\xd1\x03\xbf\xc0\xbc\xe1\xfb\x8e\xad\x69\x56\x94"
+ "\xdb\x3e\x2a\x26\x24\x0d\xe7\x29\x8c\xc7\x5f\xae\xd9\x61\xbe\x4e"
+ "\x36\xed\xbf\x66\x85\xf2\xe4\x69\x6f\x25\xd9\x95\x27\xc7\x17\x13"
+ "\xcd\x0b\x28\x0f\x7d\xb2\xe4\x3f\x62\x79\xc7\xd0\x69\x20\x3b\x36"
+ "\xfc\x8d\x7c\x52\x5b\x4a\x82\x67\x93\x00\x57\xfc\xf6\x44\xa2\x9c"
+ "\x6a\x81\xf2\x4a\xa2\xac\x04\x5d\x1e\xed\xed\x69\x4f\xa3\xcd\xbd"
+ "\x82\xa0\x1d\x9e\x57\x2e\xb3\x1d\x68\xb1\x03\x2e\x35\xf6\xc0\xfd"
+ "\xde\x9c\x2a\x6b\x34\xde\x33\xcf\x26\x7c\xbf\x6a\x15\xbe\x5f\xb5"
+ "\xd2\xef\x57\xb9\xf8\xed\x0a\xbf\x59\xa5\xc6\xf0\x9c\x73\x85\x36"
+ "\x6c\x6a\x4c\x00\x8f\x6d\xe2\xf7\xac\xde\x20\xf7\xf3\x2b\xb4\x7d"
+ "\x76\x24\x10\x75\xa5\xb5\x91\x98\x1b\x4b\xc9\x9b\x49\x44\xcd\xb7"
+ "\xc6\xdf\x5d\x5e\x72\x92\xf0\x5b\x37\x44\x1d\x4a\x33\xf5\x70\xa2"
+ "\xcd\xa3\x35\xa2\x57\xc8\x3a\x05\xda\xee\xfb\x6c\x4c\x20\xc3\x77"
+ "\xb7\x90\xa8\x79\xe7\x33\x68\x2c\x27\xcc\xbb\xe7\x68\xd5\x6a\xae"
+ "\xb7\x6a\x1f\xee\x58\xa1\x7d\x30\xc4\xca\xbe\x77\xcd\x59\xa8\x22"
+ "\xf8\x4d\x8b\xcf\xfc\x47\xee\x6e\xb4\x3b\xdb\xac\xc4\x11\x9a\x35"
+ "\x1a\xf9\x13\x9e\x1b\x89\xdf\x48\xd2\x57\x13\x15\xf7\x8d\x96\x54"
+ "\x34\xb7\x90\x47\x81\x6f\xf0\x7b\x40\x7e\x3d\xfb\x1e\xe0\xdc\x62"
+ "\x18\x8d\xdf\x04\xda\x56\x68\x95\x93\x2f\xc1\x7a\x95\xf9\x89\xaa"
+ "\x63\x50\xbf\x69\x27\xb4\x75\xb8\x26\xb8\xcd\xfb\xf2\xe3\x37\x37"
+ "\xef\xcb\x4d\x78\x1f\x7e\x23\x03\x3a\x99\xf6\xb7\x20\xdd\x80\x7e"
+ "\x2d\x56\xe5\x73\x0d\xbc\xa3\xa2\xe1\x6d\xa0\x4f\x8d\x8c\x3e\x94"
+ "\x9e\x09\x76\xe5\x85\x58\xa0\xcb\x79\x46\xab\x72\x1b\xd0\xe9\x38"
+ "\xb6\x31\xce\x72\x00\x68\x0d\x3a\x8f\xb2\xdc\x5e\x47\x63\x51\x20"
+ "\xbd\xf6\x77\x94\xf6\xe8\x50\x0f\x8d\xc1\x6f\x8d\x6d\x03\xfb\xe9"
+ "\xdb\x73\xc6\x16\x5f\x57\x8f\x2d\xed\xe2\xbb\x63\x2e\xd2\x6b\xed"
+ "\x42\x12\x54\xde\x70\x9a\x50\x9a\x2d\x17\x68\x86\xfe\x69\xab\xb4"
+ "\x7d\x1c\x6d\xda\xb0\x1d\x40\xab\xca\x44\x0b\xd9\xd9\x42\xd4\xe6"
+ "\xc6\x1a\xfc\x26\x73\xf7\x73\xcf\x13\xf2\xdc\x5b\x3c\x57\x51\x72"
+ "\x96\xd2\xef\x20\xd0\xcf\x01\xf4\xc3\x6f\x91\x2e\xfa\x25\x01\xfd"
+ "\xae\x01\xfd\x2e\x49\xf4\x73\xb6\x01\xfd\xda\x80\x7e\xab\x80\x7e"
+ "\x36\x4f\xfa\x1d\x89\xc4\xef\x95\xf8\x5d\x08\xe9\x87\x3e\xd1\xdc"
+ "\x2a\x6d\x24\xfd\x4e\xf9\xb2\x96\xec\x5e\x40\x82\x46\xd8\x89\x22"
+ "\xfd\x38\x51\x41\x3f\x55\x43\x60\x7c\xa1\x3d\xe0\xef\x7a\x62\x2e"
+ "\x76\x92\x35\x33\xc9\x83\x48\x4f\x87\x40\x4f\xb3\xe3\x1d\x72\xad"
+ "\x4d\xab\x84\x36\x47\xef\xb8\x46\xc6\x4c\x3a\xaf\x21\x27\xa6\x57"
+ "\x10\xa0\xc7\x7e\x6e\xdb\x38\xfd\xcd\xcf\xc3\xaa\xd4\x1b\x9f\x87"
+ "\x95\x57\xff\x6f\x1e\xde\xec\x3c\xac\xcc\xf5\x3e\x0f\xab\x9e\xbd"
+ "\xb9\x79\x58\x35\xf1\xff\xe6\xe1\x8f\x69\x1e\x56\x8d\xf2\x9c\x87"
+ "\x2e\x59\x21\x21\x6e\xc9\xfc\x85\x4b\x17\x2e\x7d\x45\xb3\x60\x75"
+ "\x62\xdc\x0a\x26\x31\xc8\x64\x06\xad\x93\x8b\x56\xbe\x01\xeb\xe9"
+ "\x27\x11\x35\xe4\x50\xbf\x1a\x25\x37\x2b\x22\x90\x37\xe6\x67\x70"
+ "\xc6\x3d\x41\x6f\x80\xec\x8b\xf3\x35\x07\xe4\xda\x0b\x8a\x5a\xdd"
+ "\xc7\x91\x20\xf3\x25\x34\x11\xfc\xcd\xe4\xa5\x59\xa5\xb8\xb7\x30"
+ "\x77\x3b\xdf\x88\x7b\x0b\x4f\x8e\xc7\xb5\xff\xd4\x99\x7b\x74\xb0"
+ "\xae\xcf\x8a\x20\xed\xb3\x74\xca\xd7\xcf\x92\xa0\x90\x1a\x32\x89"
+ "\xe3\x78\xde\x94\xd6\x04\xb2\xd6\x99\x02\xd3\x4b\x4d\x44\x93\x12"
+ "\x04\x75\x6b\x14\x9a\x94\x75\x70\xfc\xe2\xbc\x26\x25\xf3\x2b\x38"
+ "\xd2\x7d\x33\x20\x6f\x37\xf2\xdb\xc7\x46\x39\xff\x14\x59\x80\xdf"
+ "\x14\x77\x87\xf3\x0d\x07\x41\xb6\x3f\xd8\x61\x57\xae\x4f\x40\xdf"
+ "\xec\x87\x78\xfc\x36\x88\xdf\x1e\xd7\xb7\x80\xfc\xbe\x41\xb4\xcf"
+ "\x7c\x11\x8a\xf3\x65\xe3\x76\xbe\xe1\xe8\x85\x1a\x25\xce\x1f\x9b"
+ "\xea\x4a\xf4\x06\x78\x0f\xe8\xa3\x65\x67\x38\x5f\x6b\xed\x3b\xb6"
+ "\x31\x50\x43\x94\x6d\x99\x9f\x4d\x04\x99\x24\x10\xe5\x89\x2c\xb8"
+ "\xf6\x3a\x5c\x63\xdf\xe8\x3e\x2f\xe7\x7b\x9e\x8a\x40\xcc\x02\xde"
+ "\x55\x5c\x56\x7c\xb6\xad\x1d\xde\x71\x23\xd3\x03\x1a\xed\xdb\xc6"
+ "\x96\x3a\xf6\xf5\xd3\x3b\x50\x86\x1b\xd4\x2f\xa3\xa3\xef\xd8\x62"
+ "\xc7\xb6\xb1\x35\x33\x1e\xa1\xdf\xa2\xa1\xfe\xe9\xe7\xf1\x1d\xae"
+ "\xab\x47\x9a\xa0\xbe\xad\x55\x3d\xd9\xd4\x9a\x33\x79\xda\xc9\xe4"
+ "\x22\x01\xcb\x3e\x3b\xfe\x5c\xae\x80\x65\xb9\x30\x57\x74\x80\x65"
+ "\xba\xce\x58\xc6\xbe\xdd\x3b\x09\xc3\xb4\x0a\x02\x6d\x35\xe0\x5c"
+ "\x41\xb9\xf0\x00\x8c\x03\xce\x03\xe4\x77\x8a\x6d\x80\x6b\xe2\x9c"
+ "\xc0\xf9\x82\xf8\x45\xe7\xa7\xc7\xfc\xc0\x39\x71\x8f\x95\xa8\x70"
+ "\x4e\x20\xbe\xe1\x9c\x40\x9f\x98\x37\xae\xb1\x39\x11\x52\x4b\x54"
+ "\x74\x5e\x38\x4a\xe9\xbc\x40\x9d\xa0\xdc\xe1\x81\x69\x6e\x73\x62"
+ "\x93\x38\x27\x44\x4c\x03\xbe\x77\xe0\x9c\x58\x25\x9f\x13\xb3\xea"
+ "\x54\x84\xe2\x5d\xe6\x3f\x22\xf3\x60\x4e\x54\xea\xad\xc4\x29\x62"
+ "\x1a\xcc\x09\xdc\xb3\x43\x31\xed\x77\x02\xa6\x59\xe1\x3c\xcc\x85"
+ "\xfc\x45\x72\x4c\x6b\x6f\xeb\x4e\xb6\x38\xfd\xc0\xcd\x61\xda\xe9"
+ "\x48\xbc\x0f\x69\x85\x74\x43\x7a\x21\x8d\xfe\x95\xe8\x83\x98\xe5"
+ "\x54\xf9\xc0\x2c\x2f\xf4\x01\x7e\x6e\x86\xdf\x9d\x68\xc4\x67\xbe"
+ "\x1b\xeb\x8e\x5b\x88\x57\x88\x5d\x88\x59\x88\x5f\x38\x0f\x10\xb7"
+ "\x28\x66\x01\x9e\x43\xb9\xb1\x22\xbe\x9e\xe2\x59\xfa\x79\xa2\x4a"
+ "\x9f\x40\x1e\x44\xfc\x32\x3b\xae\x12\xc4\x33\x4a\xbf\x50\x89\x7e"
+ "\x88\x5f\x3b\x93\xc8\x98\xc9\x0b\x35\x04\x71\x0b\xc6\x3e\xe8\x84"
+ "\xf6\x34\xa1\xba\x80\x41\x7d\xff\xee\x30\xd0\xb9\xb7\x92\xc0\x9c"
+ "\x30\x12\xd4\x96\xf9\x79\x73\x67\x3d\xe0\x0b\x22\xea\x01\x38\x67"
+ "\x71\xee\x5a\x14\x9f\xcd\x66\xdf\xa1\x9f\x54\x31\x5b\x78\xdd\xdd"
+ "\xb4\x0c\x7a\xb3\xa4\x33\x7f\xf1\x34\xfb\xfe\x0d\x3a\x72\xdf\x91"
+ "\x11\xfc\x96\x2b\x13\x71\xfc\xf0\x7d\xe6\x3d\x02\x7c\xb6\x6d\x5c"
+ "\xc1\x66\x1c\x93\x6d\xa0\x7f\x6f\x1b\x57\x28\xf1\xd4\x17\xcb\x4f"
+ "\x24\x13\x32\x23\xd9\x5f\x9e\xfa\x82\xd9\x5e\xbf\xd4\xdd\xcb\xcf"
+ "\xd2\x05\x72\x5f\xea\x7a\x00\xfd\x23\x96\x39\x33\xc8\x35\xe3\x2c"
+ "\x53\xba\x83\x6f\xd4\xa4\x90\xa1\xd0\xaf\x4f\x4f\x82\xbe\x7d\x32"
+ "\x11\x70\x6c\xda\x62\xa0\xe5\xac\xe8\x43\x9c\x35\xd0\xa2\x38\x55"
+ "\x03\x3a\x7f\x23\x60\x69\xa0\x3b\x96\x32\xdc\x3c\x45\x63\xfe\xdb"
+ "\x8d\xb3\xaa\xb0\xad\xa9\xa5\x24\x44\xf3\x4b\xf4\xaf\x3b\xb3\x7c"
+ "\xf5\x5a\x82\x7b\x46\x7b\xc0\xef\xb1\xed\x5b\x87\x45\xc3\xfd\x7d"
+ "\xf8\x2f\xa7\x2b\xf4\xbf\x84\xf5\x64\xd6\x74\x05\x7e\xef\x7f\x3b"
+ "\x2d\x57\xc9\xc1\x39\xe6\x3f\x94\x4b\xf0\xfa\xc6\x8e\x40\x2a\x37"
+ "\x71\x50\xa7\xd2\x96\x4b\x36\x26\x05\x11\xac\xcf\x7c\xd2\x72\x09"
+ "\xd6\xdf\x94\xa0\xa2\xfe\x02\xf4\x3e\x47\x2e\xc1\x7b\x9d\x70\xfe"
+ "\xf7\x5c\x30\xc9\x4e\x51\x93\x93\xd3\x2a\x69\x1b\x27\xa7\x7d\x44"
+ "\xb0\x0d\xe0\x73\xf8\x7d\x94\x6c\x4e\x8a\x80\x79\x9d\x0b\xd7\x3f"
+ "\x27\x9b\x2f\x47\xc2\xf1\x02\xfc\x5f\x23\x4d\x8a\x1a\xcb\xc9\x69"
+ "\x1c\x09\x59\xf7\x14\x0f\xfc\xca\x9b\x71\x1f\x62\x1a\xe9\x09\xeb"
+ "\xc2\x45\x73\x8d\x11\xd6\xb6\x2f\xaa\x70\x9f\x3a\x9f\x3e\xab\x99"
+ "\xe3\x67\x5d\xe2\xd2\x67\x5d\xc6\x67\x3b\xf9\x59\xdf\xe1\xb3\x37"
+ "\xa5\x68\x04\x1f\xd5\x5c\xea\x3b\xb7\xf1\xda\x40\x82\x7d\xc5\xe7"
+ "\xe2\xf3\x36\x27\x68\x85\x67\x0e\xa7\x7d\xc3\x67\x62\x9b\xee\xcf"
+ "\xc4\x1c\xf0\x9a\x17\xf1\x99\x67\xe6\xc0\x31\x14\xe8\x51\x8d\x74"
+ "\xc0\xe7\x73\xbc\xae\x07\x9f\xae\x0b\xa0\xf7\x24\x37\x7a\xbb\x67"
+ "\x8b\x70\x0f\xf5\x45\xc3\x7b\x3a\x58\x7d\xda\x06\xac\x75\x74\x1f"
+ "\xc8\x30\x9d\x89\x74\xa6\xe1\xd9\x67\xd9\xda\x77\xf6\x7e\xb6\xf6"
+ "\x31\x9a\x52\x5e\x99\xa5\xeb\x01\x74\x53\xe1\x3a\x09\x6d\x5c\x71"
+ "\xb5\xf1\xa5\x2e\x00\xe9\x8d\x7c\x23\xf2\x12\xf2\x91\xc8\x43\xb4"
+ "\x9f\xc0\x75\xee\x3c\x03\xbf\x83\x58\x3b\x67\x7f\x2e\xb6\x03\x7d"
+ "\x20\x22\x1f\x0d\x83\xeb\x9d\xf9\xa8\x36\x54\xe2\xa3\x2f\xff\x6a"
+ "\x4f\xe3\x79\xe4\x23\xd3\x4b\x06\x6c\x67\x9d\xd4\x9f\xe9\x0a\xe4"
+ "\xb1\x7f\x31\xde\xb2\x20\x9d\x86\xa5\x12\x35\x7b\x9f\x2f\xe9\x7a"
+ "\x3d\x2c\xd5\xa4\xc6\xbe\x8a\xef\x81\x7d\xc8\xe6\x34\x44\x7c\x8f"
+ "\xcd\x1d\x03\xa1\xdd\xcb\x44\xb8\xe7\x55\x6c\x5b\x1c\x03\xa0\x19"
+ "\x11\xef\x11\xeb\x67\x73\x5a\xe8\xf7\x70\x7a\x0f\xe3\xb9\x0b\x5e"
+ "\xf8\xe7\xcb\x4f\x3d\x79\xee\x9e\x54\x02\x82\x2b\xc8\x4a\x2f\xb5"
+ "\xe0\x73\x2e\xb1\xbe\x1d\x73\x76\xc0\x33\x80\x06\x4a\x76\xbe\xb6"
+ "\x87\x1b\x4f\x08\xed\xdb\xbd\xb4\x5f\xfb\x98\xac\x7d\x1d\xb4\x9f"
+ "\x0c\xed\xa3\x2c\xf6\x12\xda\xbd\x6a\x27\xd3\x76\x92\x59\xfb\x22"
+ "\xdf\xf2\xc6\x21\x16\x7d\x0a\xfa\x74\xd6\xda\x18\x9e\x9e\xa2\x34"
+ "\xa7\xbe\x44\x4a\xae\x80\xf3\xf0\x25\x72\xf7\x35\x3b\x94\x66\x15"
+ "\xfc\x88\x6a\x4f\x63\x1d\xc0\x57\x1b\xca\x94\x07\x40\x1e\x93\x7c"
+ "\x89\xce\xe2\xf5\x3a\x53\x52\xbd\x9b\x2f\x51\x2d\xcd\x37\x6f\x51"
+ "\xd4\x05\x81\xee\xa8\x84\x72\x09\x3b\x7f\x2a\xc3\xfd\xbc\xe4\xab"
+ "\xc7\xce\xa3\x1f\xb4\x60\x6b\x6d\xfe\xb0\x18\x6d\x6d\x75\x1a\xd1"
+ "\xbe\xe9\x43\x37\xf5\x43\xe6\xfd\x36\x56\x92\x79\xbf\x8d\xf5\x2d"
+ "\xf3\xd6\x55\x74\x2d\xf3\x36\xec\x97\x64\xde\x6f\x7a\xb3\x79\x5f"
+ "\x7f\x85\xcd\xfb\xfa\xbf\x52\xdb\x2d\xb4\xe7\xf8\xa3\xae\x88\xff"
+ "\x53\xff\x68\xe4\xf3\x7c\x90\x61\x0f\x25\x95\x2a\x0f\x82\x6e\xe4"
+ "\x04\x79\x77\x7d\x0a\x09\xc4\x18\x6a\xeb\x61\x0c\xcd\x8e\x5a\x52"
+ "\x11\x88\x32\xef\x29\x6c\xe7\x81\x4a\xab\x9d\xc0\x3a\xa7\x61\xe3"
+ "\x72\xee\x11\xa0\x45\x80\xd9\x6e\xa7\xf5\xf0\x1a\xac\x6b\x0d\x28"
+ "\xf7\x1e\xe5\x4a\x95\xbb\xa0\x1d\x9b\x5a\x97\xe1\x2e\x13\xb7\x65"
+ "\x9e\x9b\xee\x5d\x16\xfe\xba\xc6\x91\xe9\x2e\x0b\x9f\xdb\x83\xb2"
+ "\x30\xda\xc3\x71\xdd\xe7\x98\x0c\xac\x07\x79\x38\x03\xe5\x62\x94"
+ "\x85\x39\x99\x2c\x6c\x99\xd3\xb5\x2c\x7c\xae\xe2\xff\x64\xe1\xef"
+ "\x2b\x0b\xfb\xd2\xef\x2d\x8f\xdc\x9c\x2c\x6c\xd1\xfe\x9f\x2c\x7c"
+ "\xa7\x64\x61\x8b\x5a\x94\x85\x39\x83\xba\x67\xde\x56\x42\xf2\x5d"
+ "\xb2\xf0\xd7\xf6\xce\xb2\x70\x7d\x70\x67\x59\xf8\x5c\xbc\x5c\x16"
+ "\x6e\xec\xdb\x59\x16\xae\x9f\xec\x4b\x16\x06\x1c\x6a\x46\x59\x18"
+ "\xf9\x08\xe5\x62\x94\x87\xa1\x6f\x85\x8c\xa7\xea\xd7\xde\x9c\x2c"
+ "\x5c\x9f\x7a\x63\xb2\x70\x7d\x9d\x77\x59\xb8\xae\xdc\xb7\x2c\x5c"
+ "\x57\xee\x5d\x16\x6e\x58\x2b\xc9\x30\x0d\xcf\xfe\xf8\x65\xe1\x6f"
+ "\x9a\xbd\xcb\x2b\xdf\x5c\xfd\x7f\xec\x7d\x7d\x5c\x14\xd5\xfe\xff"
+ "\x61\x16\x15\x0d\x64\x31\xf0\x22\xa9\xad\x25\x89\xb0\x24\x95\xd6"
+ "\x76\xd3\x42\xc3\xc2\x7b\x45\xb0\xac\x8b\xcf\x68\x60\x68\xa8\xf8"
+ "\x18\x1a\x22\x98\x76\xd1\x00\x97\x02\xaf\x1a\xf8\x70\xc3\x7e\x7a"
+ "\x53\xc3\xd2\xef\xc5\xae\x16\x16\xf6\xc3\x42\xc0\xbe\x76\x2f\x76"
+ "\xf1\xb6\x79\xd1\xd0\xd0\x56\x04\x79\xda\xdd\xf9\x7d\xce\x9c\x59"
+ "\x66\x67\x77\x66\xd9\x99\x45\x82\x7e\xfe\xb1\x2f\x74\xe6\xcc\x99"
+ "\x99\xcf\xfb\x7d\xce\x79\xbf\xcf\x9c\x07\xa2\x85\x2f\x55\x77\xbe"
+ "\x16\xbe\x54\x2d\xac\x85\x6b\x16\x12\xdd\x70\x49\x67\xab\x85\xe1"
+ "\x1a\x41\x2d\x5c\x93\xcf\x5e\x53\xcd\xd7\xc2\x24\x0f\x68\x03\x8f"
+ "\x8b\x6b\xe1\xcb\x2f\x91\x36\xf1\xb2\x3f\x69\x13\x09\xa6\xb6\x5a"
+ "\xb8\xc6\xd8\xb1\x16\x26\x1c\x62\x9e\x53\x54\x0b\x5f\x9e\x68\xab"
+ "\x85\x2f\x96\x09\x6b\xe1\x9f\x86\x70\x3c\xba\x72\x92\xaf\x85\x2f"
+ "\x67\xf6\x0c\x2d\x2c\xca\xad\x3a\xbe\x16\xbe\x32\x5b\xba\x16\xbe"
+ "\x92\x2d\x4d\x0b\x63\xce\x09\x69\xe1\x2b\x17\xad\x39\xc7\xd7\xc2"
+ "\x57\x5a\x84\xb5\xf0\x4f\x5e\x7c\x2d\x8c\xf3\x17\xd2\xc2\x3f\x8d"
+ "\xe3\xe5\x6f\xa3\x85\x7f\x9a\xce\xd7\xc2\x24\x1d\xa7\x85\x6b\x11"
+ "\xdb\xb7\xb0\x4a\xba\x16\xfe\xe9\x47\xfb\x5a\xf8\xa7\xab\x7c\x2d"
+ "\xfc\xd3\x09\xa2\x79\x6b\xbd\x89\x16\xfe\xa9\x92\x1c\xbf\xb8\xd2"
+ "\xf2\x38\xa7\x85\xc9\x71\x5b\x2d\x5c\xab\xee\x40\x0b\x6b\x1c\xd7"
+ "\xc2\xf5\x75\xa5\xed\x5a\xb8\xbe\xce\xac\x85\x4d\x14\xb4\x51\xd0"
+ "\xde\xc3\xaf\x16\xcf\x11\xc0\x65\x0e\xda\x9c\x8b\xf6\xf5\xb0\x3e"
+ "\x80\xd3\xc3\x37\xd6\x90\xb2\x7f\x63\x36\x29\xfb\x37\x86\xb4\xf7"
+ "\x01\x83\x16\xc6\x9a\x98\xed\x03\x3e\x9f\x05\xbf\x8f\xd6\x96\x32"
+ "\x7a\xf8\x70\x7d\x33\x85\x35\xf1\x66\x88\x23\xd6\xc5\x5f\xb2\x9a"
+ "\xb8\xa2\x41\xc3\xea\xe2\xeb\x9b\xa1\xcd\xd0\x65\xa5\x30\x73\x98"
+ "\xdc\xe0\xf9\xaa\x18\x3d\xbc\xb2\x19\xbd\x7f\x5b\x43\x41\x7b\x57"
+ "\x55\x9c\x42\xd2\xc1\x7b\x56\x73\xfa\xf9\xea\x42\x9e\x7e\x5e\xc9"
+ "\xe8\xe7\xf3\x58\x3f\x7f\x09\xb5\xd2\x67\x29\x44\x43\x63\xfd\x8c"
+ "\x75\x34\xe8\xe7\xca\xfc\x81\x74\x59\xd3\x5b\x57\xb7\x9b\x35\x74"
+ "\x26\xfc\x1f\xb0\xd6\xe1\x11\x4d\xf9\x0b\x90\x2b\x60\x52\xf5\x26"
+ "\xdc\x03\xa7\x87\x74\xc5\xe6\x74\xd0\x66\x57\x12\x9d\x7d\x3d\xdc"
+ "\xc4\xeb\x73\xbe\xe6\x81\xd7\xf3\x67\xda\x63\x88\x03\xd6\x53\xe6"
+ "\x3e\x67\x93\xbf\x5f\x2a\xed\x43\xb4\x36\xbf\xdf\xf9\xe7\x33\x66"
+ "\xad\x9d\xc5\x6a\xed\x16\xac\xb5\x13\xcd\x5a\xfb\xda\x93\x32\xb5"
+ "\xf6\x79\x46\xcb\x4d\xe9\x7c\x2d\xb7\xa3\x1b\x68\x6d\xac\xb3\xb1"
+ "\xb6\xc6\x3a\x1b\xeb\x6e\xac\xb5\xb1\xee\x36\xb1\x5a\x1b\xaf\xd7"
+ "\xd7\xf2\x3a\xab\xb5\x7b\x5b\x68\x6d\x17\x4b\xad\xfd\x73\xae\x3c"
+ "\xad\xfd\x73\x8e\xa5\xd6\xc6\xfc\x96\xaa\xb5\x31\xc6\x36\xdf\x38"
+ "\x01\x2b\x8c\x13\xc6\xc4\xee\xb7\x32\x16\x2f\x8c\x0f\xc6\x06\x63"
+ "\xe4\x10\x3e\xc0\xaf\xb2\xe6\x5f\x4f\x6b\x07\x58\x69\x6d\xac\xad"
+ "\x21\x76\x35\x58\x73\x57\x14\x43\x6c\x96\x81\xee\x06\xcd\xcd\xd3"
+ "\xdb\xaf\x0b\xe9\xed\x9f\x53\xdb\xfb\x9e\x29\xef\xde\xbb\x70\xdf"
+ "\xf3\x00\xb3\xde\xbe\x1e\x6f\xab\xb7\xaf\x27\x5b\xe8\xed\x4a\x9d"
+ "\xcb\xd5\x4a\xbe\xd6\xbe\x95\x6f\xab\xb5\xaf\x1f\x17\xd5\xda\x03"
+ "\x05\xb4\xb6\x8f\x59\x6b\x5f\xbf\x2a\x4f\x6b\x5f\xaf\x15\xd3\xda"
+ "\x4d\x4a\x4b\xad\x7d\x63\x12\xa7\xb5\x57\x5a\x68\xed\xda\x6a\x71"
+ "\xad\x5d\xcb\x68\x3b\x5a\x39\xb3\x12\xe7\x85\x35\x12\xfe\x36\xa7"
+ "\x62\xe6\x8e\xff\xd2\x82\x75\x12\xee\x6b\x80\xe7\x07\xad\xf4\xcb"
+ "\x69\x4b\xcd\x8d\xbf\xc9\xd9\xd3\x45\x89\x0b\xd0\x50\xac\x8d\xb0"
+ "\x2e\x32\xeb\x58\x9c\x1e\xeb\xa3\x3b\xab\x8d\x7e\x89\x15\xd6\x46"
+ "\xbf\x2c\x63\x74\x2f\x33\xe7\xf0\x46\x38\x6e\xe3\x3a\x57\x7b\xdf"
+ "\x08\x17\xd6\xde\xbf\x5c\x26\x3a\xe5\xc6\x64\x8c\x0b\x5f\x7b\xc3"
+ "\x35\x82\xda\x5b\x3f\x88\xbd\x26\x9c\xaf\xbd\x49\x1e\xd0\xde\x8e"
+ "\x11\xd7\xde\xfa\x73\xa4\xfd\xd5\xef\x25\xed\x2f\x8b\xb1\x8d\xf6"
+ "\xd6\xaf\xb1\xd4\xde\x18\x7f\x5b\xed\x4d\x38\xc5\x3c\xa7\xa8\xf6"
+ "\xd6\x9f\xb2\xd5\xde\xb5\xd5\x58\x7b\x0b\xf3\xaa\x7e\x1f\x9f\x57"
+ "\xf5\x13\x9b\x4d\x66\x0d\xbe\x05\xf2\xbb\xe9\x65\xad\xc1\x7b\x20"
+ "\xd7\x62\x39\x1d\xce\xbc\xd3\x65\x69\x3a\x1c\x5f\x53\x3f\x48\x9a"
+ "\x0e\xc7\xfc\x13\xd2\xe1\xf5\x71\xd6\xfc\xe3\xeb\xf0\xfa\x34\x61"
+ "\x1d\x5e\xbf\x83\xaf\xc3\x71\xfe\x42\x3a\xbc\xfe\x34\x2f\x7f\x1b"
+ "\x1d\x5e\xff\x23\x5f\x87\x93\x74\x9c\x0e\xbf\x95\xce\xf6\x6b\xc8"
+ "\xe8\x93\xbe\xb5\xd0\xbe\x0e\xbf\xb5\x8c\xaf\xc3\x6f\x85\x11\xbd"
+ "\x7d\x2b\xaf\x99\xd1\xe1\xb7\xa2\xc9\xf1\xda\x54\xcb\xe3\x9c\x0e"
+ "\x27\xc7\x9b\x2d\x75\x78\x31\xd6\xe1\xb7\x8e\x76\xa0\xc3\x43\x1d"
+ "\xd7\xe1\xa6\x13\x9c\x0e\x37\x9d\xb0\xaf\xc3\x1b\xe2\xec\xeb\xf0"
+ "\xb6\x66\x4e\x87\xb7\xb2\xdf\xa3\x5a\x83\x49\x3d\xd0\x72\xdd\xdc"
+ "\x2f\x8d\x75\xb8\xf1\x81\xe8\x42\xb6\x5f\xba\xf4\xf0\xea\x4a\xea"
+ "\x23\x73\xbf\xf4\x72\xd0\xd7\x7a\xe4\xb6\xb9\x1e\x21\xac\xc1\xf1"
+ "\x58\x8c\xb2\x66\x0d\x3b\x1e\xa3\x65\x7a\x1e\xd6\xe0\x57\x20\x4d"
+ "\x0d\x68\x70\xd0\xd1\xef\xb7\x6a\x28\x78\x9f\x2a\x5e\xda\xd5\xed"
+ "\x69\xab\xcd\x69\xb1\xf6\x86\xf4\x65\xe5\xa0\xc3\xf1\x35\x50\xfe"
+ "\xcb\xca\xf0\x38\x8f\x94\xaf\x99\xb4\x90\x47\x25\xa7\xd9\x1b\x87"
+ "\x30\x9a\x5d\xcf\x6a\x76\xb8\x06\x34\x4a\x69\xbb\x66\x6f\xad\xa4"
+ "\xb4\xf5\x3c\xcd\x5e\xd2\xf4\x56\x63\xfb\xf8\x8f\xad\xac\x56\xd7"
+ "\x9a\x18\xad\x7e\x1e\xb4\x7a\x15\xd1\xea\x8d\x09\xe6\x34\xc0\x99"
+ "\x6a\x26\xcd\x15\x26\x4d\x19\xa4\xa9\x64\xd3\x68\x2d\xf4\x7c\x09"
+ "\xd1\xf3\x2d\xbe\x7c\x3d\xdf\x78\x11\xeb\x79\x73\xbf\x39\xd6\x2a"
+ "\x96\x7d\xe7\x26\x1f\xa1\xbe\xf3\xa6\x1d\xd6\x7d\xe7\x2d\xbc\xbe"
+ "\xf3\xdb\x7d\xa5\xe8\x79\xb8\x67\xa9\x59\x33\xfe\x9a\x7a\xb1\x3b"
+ "\xe9\x79\x93\x45\xdf\xb9\x89\xd7\x77\xde\x14\x27\x4f\xcf\x37\xc5"
+ "\x5a\xea\xf9\x16\x79\x7d\xe7\xa5\xbf\xa6\xdf\xea\xd9\x7a\xbe\x29"
+ "\xca\xb2\xff\x1c\xeb\x79\xae\xff\xbc\x45\x63\xab\xe7\x5b\x26\x5b"
+ "\xe8\xf9\x12\x9d\x4b\xe3\x1e\xbe\x9e\xa7\x17\xdb\xea\xf9\x96\xcd"
+ "\xf2\xf4\x7c\xcb\x71\x79\x7a\xbe\xa5\xc8\x31\x3d\xdf\x3a\x48\x58"
+ "\xcf\x37\xc4\x8a\xeb\xf9\x06\x86\xaf\x26\x2d\xa7\xbb\xf0\x77\x47"
+ "\xd5\x6a\xac\xbb\xda\xce\x30\xba\x8b\xe8\x30\xd0\x5d\x6d\xb9\x3d"
+ "\x43\xcf\xb7\x8d\x16\xd6\x58\x6d\xe3\x39\x3d\xdf\xea\xdb\xf9\x7a"
+ "\xbe\xd5\x57\x58\xcf\xb7\x1d\x23\x7a\xa7\x75\xb0\xad\x9e\x87\x6b"
+ "\x04\xf5\x7c\xdb\x55\xf6\x1a\x5f\xbe\x9e\x27\x79\x5c\x72\x31\x70"
+ "\xdf\xff\x6d\x30\x35\xec\x25\xed\xb8\x61\x19\x69\xc7\x09\xc6\xb6"
+ "\x7a\xde\x30\xa9\x63\x3d\x4f\x38\xc5\x3c\xa7\xa8\x9e\x37\x64\xdb"
+ "\xea\xf9\x86\x58\xac\xe7\x85\x79\x65\x5a\xc5\xe7\x95\xc9\x87\xaf"
+ "\xe7\x0d\x3f\xf6\x1c\x3d\x2f\xca\xb5\xd1\x7c\x3d\x6f\x3c\x26\x5d"
+ "\xcf\x1b\xaf\x4a\xd3\xf3\x98\x7f\x42\x7a\xde\x34\xc6\x9a\x7f\x7c"
+ "\x3d\x6f\x9a\x2a\xac\xe7\x4d\x0b\xf9\x7a\x1e\xe7\x2f\xa4\xe7\x4d"
+ "\xb9\xbc\xfc\x6d\xf4\xbc\xe9\x08\x5f\xcf\x93\x74\x9c\x9e\xa7\xa3"
+ "\x49\x5d\xdb\xd0\x57\xba\x9e\xa7\x9f\xb4\xaf\xe7\xe9\xf1\x7c\x3d"
+ "\x4f\x7b\x13\xdd\x4e\x27\x10\x3d\x4f\x07\x90\xe3\x0d\x6e\x96\xc7"
+ "\x39\x3d\x4f\x8e\xdb\xea\x79\x7a\x63\x07\x7a\xde\xdd\x50\xe0\x97"
+ "\xd8\x3a\xdc\x2f\xb5\xcd\x3b\x62\x4f\x50\xcd\x33\xc6\xf6\xb5\xf4"
+ "\x63\xa0\xdd\xaf\x06\x1d\x30\x0f\x51\x78\x3e\x7a\xca\x39\x68\xdf"
+ "\xe7\x91\x71\xf0\xb8\x8d\xc7\xe3\x3d\x0e\xad\x2d\xee\x85\xd7\xfe"
+ "\x6b\xcd\x09\x8c\x31\xa8\x87\x68\x71\x5b\xdf\x52\xe0\x17\xd5\x9c"
+ "\x33\xae\xa8\x05\x8f\x81\x4f\x40\xd4\xdc\x3a\x61\x9d\xf6\x46\x35"
+ "\x6d\x02\xce\xbb\x45\xce\x22\x1a\xed\x6c\xfc\x65\x86\xc7\xb8\xfd"
+ "\xc7\xf3\x14\x2a\x1a\xaa\x18\x3d\xe0\x1e\x13\x8a\xf2\x52\x90\xb7"
+ "\x47\x1d\x52\x7a\xb8\xb8\xf4\xfe\xc3\x77\x08\x19\x41\x0b\x4c\x1c"
+ "\x49\x9b\x82\x62\x43\xf1\xfa\x33\xfd\x89\x1e\x28\xea\x65\x60\xf5"
+ "\xc0\xdb\xb7\x91\x3a\x7f\x35\xe8\x80\xb3\x9c\x0e\x68\x31\xeb\x34"
+ "\x0b\x0d\x30\xfb\xba\x12\xe5\x6f\xe0\x8f\x81\x6f\xcb\xe6\x34\x00"
+ "\x6e\xff\xe9\xb9\x01\x68\x54\x33\x19\xdb\xb0\x76\x2a\x19\x03\xaf"
+ "\xae\x41\xd4\xee\x39\xc8\xad\x2c\xe6\x12\x9e\x27\xee\x5b\x56\xb3"
+ "\x0f\xad\x99\x84\x86\x1a\x70\x9b\xbf\x81\x2e\x2c\xab\xc9\x45\x78"
+ "\x6d\x3d\xd0\x7e\x9a\xed\xb7\xd1\x58\xdc\xce\x4e\x9e\x47\xda\x7e"
+ "\xa6\x8d\xa5\x5c\x86\x9c\x0e\x38\x8d\x24\xeb\x36\xca\x85\x19\xff"
+ "\x2b\x3a\x07\xb5\xc0\x2f\xd5\x30\xdc\x2f\xca\x08\x58\x92\x35\x15"
+ "\x27\xe8\x4c\x7f\x9d\x5e\x7c\x18\x78\xf8\xe1\xa5\x5a\x17\xbc\x3e"
+ "\x34\xde\x2b\xd1\x74\x70\x88\x96\x87\x4d\x1b\x8b\x4d\x1b\xc1\x06"
+ "\xe3\x32\x27\x11\xe1\xb5\xf8\xfa\x63\x4c\x2a\x9a\xab\x90\xe9\x0d"
+ "\xf3\x7e\x89\x21\x68\x97\x89\xe0\x61\x6c\x8b\xef\x6b\x82\xd8\xe3"
+ "\x35\xa7\x80\x0f\x8c\x1e\xcb\xc0\x7b\x28\xa6\xb9\x78\x60\x3d\x06"
+ "\xfc\xee\xb7\xbb\x15\x70\xf8\x91\xe0\x40\x6f\x50\x32\x7f\x0d\x6f"
+ "\x04\xa8\x20\xef\x07\xda\xda\x00\x8b\x66\x6b\x2c\xfe\xb1\x1d\xef"
+ "\xb5\x88\xd7\x83\x33\x64\x93\x35\xef\x18\x2c\xde\x08\x18\x8c\xd7"
+ "\x8b\x60\xe6\x91\xb4\x05\xe0\xfa\x52\xb9\xeb\x0a\x9e\xff\x42\x30"
+ "\x30\xb2\xb1\xc7\xfb\x2e\xe2\x78\x63\xad\x55\x01\x1a\x8b\x99\xd7"
+ "\xf1\x16\xbd\xbd\x6d\x9f\x5f\x14\x1e\x77\x72\x83\xa2\x76\xc8\xd2"
+ "\x37\x14\x65\x7f\xfe\x6f\x97\xc4\x5e\xd5\xf3\x62\xbf\xc5\x25\x96"
+ "\x8b\xbd\xab\x8f\xbc\xd8\xbb\x8a\xae\xff\xdf\x75\xb1\x57\xf6\xc0"
+ "\xd8\x53\x3a\x2e\xf6\xbd\xb2\xe5\xc5\xbe\x97\xe8\xfe\x37\x38\xf6"
+ "\xb8\x3f\xc8\xdc\x17\x64\xee\x07\xc2\x6d\x1c\xe3\x41\x28\x8f\xf0"
+ "\xf6\x71\x89\xf0\x6f\xcb\x71\x89\xdf\x94\xe0\x3e\x12\x76\x5c\x22"
+ "\xd5\xdb\x7e\xff\x0f\xd5\x4f\xdb\xde\xff\x43\xb9\xdd\x64\x74\x23"
+ "\xe5\xf6\x1d\xa3\x1b\x29\x37\xe6\x9b\xd6\xba\x8b\x88\x32\x3c\x34"
+ "\x78\xcf\xe1\x25\xc5\x14\x9e\x93\x73\xf8\x46\x33\x95\x51\x0f\x3a"
+ "\x90\xba\x9f\xc6\xfd\x3e\x99\xcb\xf1\x78\xc4\x06\x04\x1a\xec\xfe"
+ "\x6b\x94\x9b\x07\x5e\x63\xeb\xb3\x1b\xc5\x4c\x7f\x0b\xfd\xc0\xf4"
+ "\xe2\x83\x7e\x7a\x17\xdc\xb6\x1d\x5e\xd2\x4c\x99\xf9\x62\x9e\x7b"
+ "\x07\x31\x4c\x35\xfa\x44\xec\xb9\xb5\xcf\x2f\xd1\x3c\x7e\xd0\x70"
+ "\x68\x88\x56\x90\x43\x78\x4e\x1f\xf0\x08\x73\x06\xcf\xc1\x33\xf3"
+ "\x09\xf3\xa8\xbc\xb9\x16\xe1\x3d\x64\x3c\x6b\xc1\xef\x03\x87\x66"
+ "\x1e\x00\x7c\x2d\x79\xa4\x15\xe1\xd1\x0e\x3e\x8f\x6e\xb1\x3c\x02"
+ "\x3e\x71\x3c\xe2\xe6\xe3\x0d\x96\xc4\xa3\x3a\x96\x47\xd9\x56\x3c"
+ "\xba\xae\x42\xdf\x54\x5f\x64\x79\xe4\x3a\xcb\xe0\x6f\xe6\x51\x9f"
+ "\x0b\xa7\x67\x01\x8f\x66\x49\xe5\x51\x9f\x2a\x9e\x67\xa5\x3c\x1a"
+ "\x6d\x3c\x2b\xe5\x36\xce\xda\xb3\x9a\x3d\xea\x2d\x9f\x09\x7b\x6e"
+ "\x81\x4f\x6d\x30\xfb\x54\xca\x6d\x9e\x3c\x3e\xbb\xc5\x38\x34\xc6"
+ "\x8b\x72\x3b\x65\x3d\xc6\xeb\x43\xec\x53\xa9\xde\xf1\x98\x6b\x82"
+ "\x3e\x95\x3d\x67\x33\x36\x87\xea\x37\xaf\x7d\x6c\x0e\xd5\x2f\xb8"
+ "\xdb\x8f\xf1\xa2\xfa\x56\x0a\xfa\x05\xaa\xef\x05\x66\x8c\x17\xe5"
+ "\x56\xdc\xe9\x63\xbc\x20\x4f\x41\x5f\x4a\xf5\x8b\x60\x74\x3b\xe5"
+ "\x56\x62\x33\xc6\x0b\x5f\x23\xe4\x4b\xa9\x7e\x69\xec\x35\xc5\x3c"
+ "\x5f\xca\xe6\x01\xf5\x49\xbe\xa8\x2f\xa5\xee\x79\x92\xd4\x2f\xf7"
+ "\xf4\x25\xf5\x0b\xc1\xd4\xc6\x97\x52\xfd\x7e\xb4\xf4\xa5\x82\x63"
+ "\xbc\x58\x0e\x31\xcf\x29\xe6\x4b\xa9\x7b\x46\xda\xf8\x52\xaa\x77"
+ "\xac\xe0\x18\x2f\xca\xc3\x85\xe3\x91\xfb\x5e\xde\x18\x2f\xea\x9e"
+ "\x65\x3d\x62\x8c\x97\x38\xb7\x2a\x79\x63\xbc\x28\xf7\xf1\x92\xc7"
+ "\x78\x51\xee\xab\x24\x79\x51\x86\x73\x02\x5e\x94\x72\x3f\x65\xcd"
+ "\x39\x9e\x17\xa5\xdc\x2f\x0a\x7a\x51\xca\xbd\x91\xe7\x45\x99\xfc"
+ "\x05\xbc\x28\xe5\x31\x8c\x97\xbf\xb5\x17\xa5\x3c\xc6\xf1\xbc\x28"
+ "\x9b\xae\xdd\x8b\x52\x1e\x3a\x52\x87\xf6\xf6\x90\xec\x45\x29\x0f"
+ "\xe6\xbb\xe6\xa1\x9d\xe4\xdb\x0d\xcf\x87\x52\x1e\x67\x78\x3e\x94"
+ "\xf2\x60\xd6\xfb\xd1\x51\x1e\x0d\xcc\xf8\x2e\xca\xa3\x90\x1c\xef"
+ "\xed\x6e\x79\xbc\xdd\x87\xb2\xc7\xf1\xf8\x2e\x66\x5c\xd7\x96\xfe"
+ "\xae\xd2\xfc\xe7\xa8\x6e\xe8\x3f\x43\xec\xf8\xcf\x90\x1e\xea\x3f"
+ "\x3d\xf3\xe5\xf9\x4f\x4f\xd1\xf5\x9f\xee\x7a\x20\x7b\x3a\xbc\xbf"
+ "\x2f\xa7\xc3\xbd\x06\xc9\xd3\x2d\x5e\xbe\xbf\x7e\xec\x7b\xa2\x07"
+ "\xf2\xac\xe1\x62\x3f\x20\x57\x5e\xec\x07\xe4\xc8\xf7\x40\x7e\x93"
+ "\x39\x0f\xe4\x37\x59\xdc\x03\xdd\xbb\xd0\xbe\x07\xfa\x5d\x0e\xe7"
+ "\x81\x7c\x1a\x89\x46\xf1\xb9\x40\x34\x8a\xcf\x0e\xe9\x1e\xc8\xc7"
+ "\xeb\xae\x07\x92\xe2\x81\xbc\x62\x38\x0f\xe4\x7d\x51\x9e\x07\xf2"
+ "\xae\xe6\x7b\x20\xbf\x16\x5b\x0f\xe4\x63\x33\xff\x5b\xdc\x03\xf9"
+ "\xc4\xc9\xe3\xb3\x4f\xac\x63\x1e\xc8\xe7\xb4\xb0\x07\xba\x37\x41"
+ "\xdc\x03\x91\x73\xb6\xda\xf5\x77\x71\x9c\x76\xfd\xdd\x23\xdd\xdf"
+ "\x03\x0d\x3c\x2f\xac\x53\x07\x5e\x24\x1e\xc8\xa7\xa4\xf3\x3d\x90"
+ "\x4f\x89\xb0\x07\xfa\xdd\x54\xa2\x17\x7d\x4a\x6d\x3d\x10\x5c\x23"
+ "\xe8\x81\x7e\xb7\x89\xbd\xa6\x84\xef\x81\x48\x1e\x50\x9f\xec\x15"
+ "\xf7\x40\xbe\xe3\x48\xfd\xe2\xeb\x41\xea\x17\x82\xa9\xad\x07\xfa"
+ "\xdd\xe5\x8e\x3d\x10\xe1\x10\xf3\x9c\xa2\x1e\xc8\x37\xd8\xd6\x03"
+ "\xdd\x1b\x2f\xec\x81\xfc\x7a\x71\x3c\x1a\xb4\x8f\xef\x81\x7c\x57"
+ "\xf5\x0c\x0f\x24\xca\xad\xf3\x7c\x0f\x34\x68\xa2\x74\x0f\x34\x68"
+ "\x8d\x34\x0f\x84\x39\x27\xe4\x81\x06\x9d\xb6\xe6\x1c\xdf\x03\x0d"
+ "\xfa\x51\xd8\x03\x0d\x6a\xe1\x7b\x20\x9c\xbf\x90\x07\xf2\xf3\xe7"
+ "\xe5\x6f\xe3\x81\xfc\xc6\xf3\x3d\x10\x49\xc7\x79\x20\x3f\xb2\x37"
+ "\x0a\x75\xaf\x97\x74\x0f\xe4\x77\x5a\xdc\x03\xf9\x9d\xe5\x7b\x20"
+ "\xbf\x3d\xc4\xeb\xf8\x35\x13\x0f\xe4\x77\x94\x1c\xbf\x57\x69\x79"
+ "\x9c\xf3\x40\xe4\x38\xe7\x81\xee\x73\x93\xe6\x81\xee\xef\x86\x1e"
+ "\x48\x65\xc7\x03\xa9\x7a\xa8\x07\x1a\xbc\x57\x9e\x07\x1a\xbc\xe7"
+ "\xae\x0e\x97\xa3\xc3\xef\x1b\xcc\xe9\xf0\xa1\x43\xe4\xe9\x96\xa1"
+ "\x76\xbf\x7f\xda\xd7\xe1\xfe\xe7\x39\x1d\xee\x7f\x5e\x5c\x87\x0f"
+ "\xbd\x69\x5f\x87\x3f\x38\x98\xd3\xe1\xc3\xd6\x91\x76\x72\xd8\x3c"
+ "\xd2\x4e\x0e\x1b\x26\x5d\x87\xab\x76\xdc\xd5\xe1\x52\x74\xf8\xe0"
+ "\x5a\x4e\x87\xab\xe2\xe4\xe9\x70\x55\x2c\x5f\x87\x3f\x94\x66\xab"
+ "\xc3\x55\x67\x1c\xd7\xe1\xaa\xeb\xf2\xf8\xac\xaa\x73\x4c\x87\x0f"
+ "\x8b\x10\xd6\xe1\x43\x1b\xc4\x75\x38\x39\x67\xab\x9f\x1e\xb8\xce"
+ "\xe9\xa7\x07\x8e\x77\x7f\x1d\xfe\xc0\x2c\x61\xad\xf4\x40\x1c\xd1"
+ "\xe1\xc3\x26\x77\xbe\x0e\x1f\x36\x59\x58\x87\x3f\x70\x81\x68\x96"
+ "\x61\x51\xb6\x3a\x1c\xae\x11\xd4\xe1\x0f\x7a\xb0\xd7\x4c\xe6\xeb"
+ "\x70\x92\x07\xd4\x27\x23\xc5\x75\xf8\x83\xa7\x49\xfd\xf2\x60\x2e"
+ "\xa9\x5f\x08\xa6\xb6\x3a\xfc\xc1\xc5\x1d\xeb\x70\xc2\x21\xe6\x39"
+ "\x45\x75\xf8\x83\xc7\x6c\x75\xf8\x50\xbd\xb0\x0e\xf7\xcf\xe4\x78"
+ "\xe4\x1f\xcc\xd7\xe1\x0f\x1a\x7b\x86\x0e\x17\xe5\xd6\x2c\xbe\x0e"
+ "\x1f\x7e\x56\xba\x0e\xf7\x77\x91\xa6\xc3\x31\xe7\x84\x74\xb8\x7f"
+ "\x84\x35\xe7\xf8\x3a\xdc\x7f\xa1\xb0\x0e\xf7\x4f\xe3\xeb\x70\x9c"
+ "\xbf\x90\x0e\xf7\x3f\xc4\xcb\xdf\x46\x87\xfb\x9f\xe1\xeb\x70\x92"
+ "\x8e\xd3\xe1\x0f\x25\x90\x3a\x74\xe8\x0e\xe9\x3a\xfc\xa1\x08\x71"
+ "\x1d\xfe\xd0\x4b\x7c\x1d\xfe\x50\x00\xd1\xdb\x0f\xa5\x12\x1d\xfe"
+ "\xd0\x58\x72\x7c\xe8\x76\xcb\xe3\x9c\x0e\x27\xc7\x39\x1d\xfe\x90"
+ "\x56\x9a\x0e\xf7\xec\x86\x3a\x5c\x69\x47\x87\x2b\x7b\xa8\x0e\x0f"
+ "\x18\x29\x4f\x87\x07\x04\xc8\xd7\x82\xa3\x74\x9c\x16\x1c\xa5\x13"
+ "\xd7\x82\x01\x46\xfb\x5a\x30\x98\x5b\x1f\x80\x0a\xda\x4c\xea\xea"
+ "\xa0\xc5\xa4\xae\x0e\x0a\x96\xae\x05\x03\xf7\xdd\xd5\x82\x52\xb4"
+ "\xe0\x43\x05\x9c\x16\x0c\x5c\x26\x4f\x0b\x06\x26\xf2\xb5\x60\x48"
+ "\xa6\xad\x16\x0c\xfc\xce\x71\x2d\x18\xd8\x22\x4f\x0b\x06\x36\x3b"
+ "\xa6\x05\x83\xa6\x0b\x6b\xc1\x91\x48\x5c\x0b\x92\x73\xb6\x6d\xb8"
+ "\xba\x85\x6b\xc3\xd5\xa7\xbb\xbf\x16\x54\xc7\x0b\xb7\xd7\xea\x65"
+ "\x44\x0b\x06\x45\x77\xbe\x16\x0c\x8a\x16\xd6\x82\x6a\x32\xff\x99"
+ "\x0a\x9a\x65\xab\x05\xe1\x1a\x41\x2d\x18\x3c\x88\xbd\x26\x9a\xaf"
+ "\x05\x49\x1e\x50\x9f\x88\xcf\x7f\xa6\x82\xc9\xfc\x67\x2a\x98\xcc"
+ "\x7f\x66\x31\xb5\xd5\x82\xc1\x6b\x3a\xd6\x82\x84\x43\xcc\x73\x8a"
+ "\x6a\xc1\x60\xdb\xf9\xcf\x54\x80\x41\x58\x0b\x8e\xda\xc1\xf1\x68"
+ "\xd4\x93\x7c\x2d\xf8\x70\xdf\x9e\xa1\x05\x45\xb9\x15\xcf\xd7\x82"
+ "\x0f\x5f\x90\xae\x05\x47\x79\x48\xd3\x82\x98\x73\x42\x5a\x70\xd4"
+ "\x74\x6b\xce\xf1\xb5\xe0\xa8\x55\xc2\x5a\x70\x54\x26\x5f\x0b\xe2"
+ "\xfc\x85\xb4\xe0\xa8\xe3\xbc\xfc\x6d\xb4\xe0\xa8\xef\xf8\x5a\x90"
+ "\xa4\xe3\xb4\x60\x48\x12\xa9\x43\x03\xf6\x49\xd7\x82\x21\xd3\xc5"
+ "\xb5\x60\xc8\x3c\xbe\x16\x0c\x19\x4d\x34\x5f\x48\x06\xd1\x82\x21"
+ "\xe1\xe4\x78\x40\x81\xe5\x71\x4e\x0b\x92\xe3\x9c\x16\x0c\xc9\xeb"
+ "\x48\x0b\xda\xd7\x0f\x1a\x0d\xa7\x1f\x34\x1a\x4b\xfd\x70\x86\xa7"
+ "\x1f\x1e\x19\x67\x5f\x3f\x8c\x49\xe5\xf4\xc3\x63\x3f\x92\xf2\xfd"
+ "\xd8\x69\x52\xbe\x1f\xdb\xc4\xe8\x87\x08\x68\xe7\x41\x3f\x1c\xba"
+ "\x56\x48\xf4\xc3\xb5\x66\xea\xed\x1b\xac\x7e\xa8\x43\x6e\x19\x4b"
+ "\x58\xfd\x30\x07\xeb\x87\x47\x8d\x58\x3f\xb8\xe7\x81\x56\xad\x61"
+ "\xb5\x6b\x22\x68\xd7\x1a\xf8\x3f\x94\x9d\xcf\x20\x8f\x72\xd0\x97"
+ "\x5a\x7c\x3d\xde\xcf\x00\xf2\x62\xe6\x65\x32\x73\x36\x75\xbd\xf0"
+ "\x3e\x39\x58\x5b\xe0\x7d\x27\x3a\xdc\x73\xa2\x86\xdd\x73\x22\x96"
+ "\xbf\xe7\x04\xde\x6b\x02\xef\x3b\x91\xb7\x1c\x79\xbf\xc7\x6a\x8a"
+ "\xfe\x69\x2e\xfd\xf1\xbe\x13\xfd\x1b\x88\x3e\x3d\x64\x2a\x25\xfa"
+ "\x74\x85\x6f\x3f\xd0\x42\xea\x5d\xf5\x9c\x96\x78\x17\xeb\x88\x15"
+ "\x01\xaa\x86\x15\x01\x43\x6f\xdd\x0a\x78\xc0\x76\xbf\x89\xe3\xb1"
+ "\x78\xbd\x7c\xbc\x47\x9f\x81\xd5\xa7\xf4\xab\x01\x68\xf7\x02\xe4"
+ "\x06\xba\xd8\xe5\x61\xd0\xa7\x23\x06\xc3\xb3\x9f\x45\x4a\xe3\xad"
+ "\x80\xc1\x96\x6b\x1b\xc2\xb3\x2b\x4d\xb7\x02\x50\x59\xcc\xf7\xcc"
+ "\x1c\x4d\x03\x3b\x47\x53\xbf\x22\x00\xaf\xc1\xaf\xd9\xb9\xdc\x42"
+ "\x9f\xfa\x98\xf5\xe9\xa3\x67\xe4\xe9\xd3\x47\x4b\xf9\xba\x42\x73"
+ "\xd9\x56\x57\x3c\x16\xec\xb8\xae\x78\x6c\xaa\x3c\x5d\xf1\x58\x94"
+ "\x63\xba\xe2\xb1\x23\xd6\xba\xe2\x00\xa3\x2b\x1e\x09\xc5\x1c\x14"
+ "\xd6\x15\xe4\x9c\x6d\x7b\x30\x66\x2a\xd7\x1e\x8c\x19\xd2\xfd\x75"
+ "\xc5\xe8\x62\xe1\xba\x7f\xf4\x19\xa2\x2b\x1e\x2b\xec\x7c\x5d\xf1"
+ "\x58\xa1\xb0\xae\x18\x43\xd6\x7f\xa3\x1e\x3b\x6a\xab\x2b\xe0\x1a"
+ "\x41\x5d\x31\x66\x19\x7b\x4d\x21\x5f\x57\x90\x3c\xa0\x9e\xc9\x14"
+ "\xd7\x15\x8f\x8f\x24\xf5\xce\x98\x16\x52\xef\x10\x4c\x6d\x75\xc5"
+ "\x98\x73\x1d\xeb\x0a\xc2\x21\xe6\x39\x45\x75\xc5\xe3\x83\x6c\x75"
+ "\xc5\x23\x63\x85\x75\xc5\x13\x37\x39\x1e\x3d\x91\xcd\xd7\x15\x8f"
+ "\xcf\xeb\x19\xba\x42\x94\x5b\xc5\x7c\x5d\xf1\xc4\x23\xd2\x75\xc5"
+ "\x13\x71\xd2\x74\x05\xe6\x9c\x90\xae\x78\xe2\x88\x35\xe7\xf8\xba"
+ "\xe2\x89\xb3\xc2\xba\xe2\x89\xcb\x7c\x5d\x81\xf3\x17\xd2\x15\x1a"
+ "\x2f\x5e\xfe\x36\xba\x42\x13\xcc\xd7\x15\x24\x1d\xa7\x2b\x34\x95"
+ "\xac\x37\xbb\x2c\x5d\x57\x68\x8e\x88\xeb\x0a\xcd\x71\xbe\xae\xd0"
+ "\x64\x10\xfd\xa0\xa9\x21\xba\x42\xb3\x87\xd5\x1b\x35\x96\xc7\x39"
+ "\x5d\x41\x8e\x73\xba\x42\xd3\x70\x77\xbe\x65\x77\xec\x63\xfa\x7d"
+ "\xa6\xbc\x36\xfc\xf7\x19\xbf\xfe\xb7\xde\x1e\x38\xdf\x72\xcb\x93"
+ "\x6e\xdc\xb7\xde\xb1\x7d\xe5\xe9\x96\xb1\x6e\xbf\x7e\xec\x7b\xe2"
+ "\x58\xe3\xdf\x9f\xe7\x62\x3f\x6e\x93\xbc\xd8\x8f\xdb\xf8\xeb\xc7"
+ "\xbe\x27\x8e\x71\x18\x1b\xc5\xc5\xfe\x19\x17\x79\xb1\x7f\x06\xc9"
+ "\xef\xd7\x7e\xce\x62\x8c\xc3\x73\xe7\xc5\x7d\xe9\x33\xdf\xd9\xf7"
+ "\xa5\x61\x16\x63\x1c\x26\xb0\x63\x1c\x26\xb0\x63\x1c\x26\x30\x63"
+ "\x1c\x52\xb0\x2f\xfd\x6b\x74\xe1\x47\xcb\x8b\x28\xbc\xee\xd6\xa1"
+ "\xe5\xcd\x14\x60\xe2\x6a\xc0\xbe\x14\x62\x9d\xc9\xec\xff\x50\xc2"
+ "\xf6\x6b\x8f\xdf\x51\x5e\x6b\xb1\xf7\x03\x15\xea\xcf\xad\x5d\x5b"
+ "\x82\xf0\xb9\xcf\xea\x8b\x28\x6d\xab\x55\x9f\x37\xe4\xa9\x5a\xc2"
+ "\xef\xf3\xc6\x7d\xdd\x2d\x16\xfb\x38\x18\x73\x23\xf6\x74\xd4\xe7"
+ "\x6d\xdd\xdf\x9d\xdf\x8a\xbc\x7b\x6e\x9f\xf7\xb8\x32\xae\xcf\x7b"
+ "\xbc\xcc\xf1\x0f\xe3\xad\xc6\x3f\x3c\x2f\x30\xfe\x61\xbc\x84\xf1"
+ "\x0f\xe3\x65\x8e\x7f\x18\xef\xe0\xf8\x87\x09\x36\xe3\x1f\x88\x37"
+ "\x7d\xa6\x2a\x45\xd4\x9b\x92\x73\xb6\x9e\xe2\x59\x8b\xf1\x0f\xcf"
+ "\xf6\x80\xf1\x0f\xcf\x8a\x7c\xa3\x7e\x96\x1d\xff\x30\xe1\x0e\x8c"
+ "\x7f\x98\x20\x32\xfe\xe1\x59\x76\xfc\xc3\x04\x81\xf1\x0f\x13\x44"
+ "\xc6\x3f\x84\xb1\xe3\x1f\x26\x58\x8d\x7f\x98\xc0\x8e\x7f\x08\xb3"
+ "\x33\xfe\x21\x8c\x1d\xff\x10\xc6\x8e\x7f\x20\x98\xda\x7a\xd3\x30"
+ "\x07\xc6\x3f\x4c\x60\xc7\x3f\x4c\xb0\x33\xfe\x21\x4c\x60\xfc\xc3"
+ "\x33\xe7\x85\xbd\xe9\x73\x16\xe3\x1f\x9e\xb3\x1a\xff\x10\xd6\x43"
+ "\xc6\x3f\x88\x72\xcb\x6a\xfc\xc3\x44\x19\xe3\x1f\x9e\x93\x38\xfe"
+ "\x61\x82\xc8\xf8\x87\xe7\x22\xac\x39\xc7\xf7\xa6\xcf\x89\x8c\x7f"
+ "\x78\xce\x6a\xfc\xc3\x04\x91\xf1\x0f\xcf\x1d\xe2\xe5\x6f\xe3\x4d"
+ "\x9f\xb3\x1a\xff\x30\xc1\x6a\xfc\xc3\xf3\xec\xf8\x87\x67\xd6\x49"
+ "\xf7\xa6\xcf\xdb\x19\xff\xf0\xbc\xd5\xf8\x87\xe7\xd9\xf1\x0f\xcf"
+ "\xb3\xe3\x1f\x9e\x67\xc7\x3f\x3c\x93\x6c\x79\x9c\xf3\xa6\xe4\x38"
+ "\xe7\x4d\x9f\x97\x38\xfe\xe1\xee\x5c\xcc\xae\xf1\xa6\x93\x64\x8e"
+ "\x7f\x98\x64\x77\xfc\xc3\x5d\x7f\x24\xa6\xd1\x9f\x2f\xe0\x34\xfa"
+ "\x1f\xf6\xc9\xd3\x2d\x7f\x28\xf8\xf5\x63\xdf\x13\xfd\xd1\xa4\x44"
+ "\x2e\xf6\x93\x87\xc9\x8b\xfd\x64\x95\x7c\x7f\xf4\x62\x03\xe7\x8f"
+ "\x5e\x6c\x10\xf7\x47\x93\x1b\xed\xfb\xa3\xa9\x63\x39\x7f\x14\x99"
+ "\x4f\x34\x4a\x64\x1a\xd1\x28\x91\xe3\xa5\xfb\xa3\x29\xc7\xf9\xfe"
+ "\x28\x62\xe2\x5d\x7f\x24\xd7\x1f\xfd\xa1\x8e\xf3\x47\x53\x36\xc9"
+ "\xf3\x47\x53\x36\xf2\xfd\xd1\xb4\xbd\xb6\xfe\x68\xca\x55\xc7\xfd"
+ "\x51\xa4\x87\x3c\xae\x47\xba\x3b\xe6\x8f\x22\x17\x0b\xfb\xa3\xc9"
+ "\xcd\xe2\xfe\x88\x9c\xb3\xd5\xb5\x53\x3d\x38\x5d\x1b\x75\xa1\xfb"
+ "\xfb\xa3\xa8\x64\x61\x0d\x1b\xb5\x89\xf8\xa3\xc8\x84\xce\xf7\x47"
+ "\x91\x09\xc2\xfe\x28\xaa\x85\x68\xc9\xc8\x44\x5b\x7f\x04\xd7\x08"
+ "\xfa\xa3\xa9\xc1\xec\x35\x09\x7c\x7f\x44\xf2\x80\xba\x66\x92\xb8"
+ "\x3f\x9a\x7a\x99\xd4\x3d\x53\x8f\x91\xba\x87\x60\x6a\xeb\x8f\xa6"
+ "\x66\x76\xec\x8f\x08\x87\x98\xe7\x14\xf5\x47\x53\xbf\xb3\xf5\x47"
+ "\x93\x1b\x84\xfd\xd1\x8b\x87\x38\x1e\xbd\x18\xc1\xf7\x47\x2f\x0c"
+ "\xe9\x19\xfe\x48\x94\x5b\xc9\x7c\x7f\xf4\xc2\x75\xe9\xfe\xe8\xc5"
+ "\x61\xd2\xfc\x11\xe6\x9c\x90\x3f\x7a\x71\xb1\x35\xe7\xf8\xfe\xe8"
+ "\xc5\xcd\xc2\xfe\xe8\xc5\xbd\x7c\x7f\x84\xf3\x17\xf2\x47\x2f\x9e"
+ "\xe5\xe5\x6f\xe3\x8f\x5e\xbc\xca\xf7\x47\x24\x1d\xe7\x8f\xa6\x65"
+ "\x90\x3a\x74\x72\xbe\x74\x7f\x34\x6d\xb1\xb8\x3f\x9a\xb6\x8a\xef"
+ "\x8f\xa6\x85\x13\x1f\x34\x6d\x0f\xf1\x47\xd3\x66\x91\xe3\x93\xf3"
+ "\x2c\x8f\x73\xfe\x88\x1c\xe7\xfc\xd1\xb4\xc2\xbb\xf3\x34\xbb\xa3"
+ "\x3f\x7a\x79\x92\x3c\x7f\xf4\x72\xf8\x5d\x8d\x2e\x47\xa3\x4f\x2b"
+ "\xe1\x34\xfa\x9f\x4e\xcb\xd3\x2d\x7f\x2a\x91\xaf\xd1\xe7\x6e\xe7"
+ "\x34\xfa\xdc\xed\xe2\x1a\x3d\x7a\x87\x7d\x8d\x3e\x4b\xc7\x69\xf4"
+ "\x99\xe3\x49\x3b\x39\x93\xec\xdb\x49\xcd\xb8\x2c\x5d\xa3\xcf\x98"
+ "\xcd\xd7\xe8\xd1\x57\xef\x6a\x74\xb9\x1a\xfd\x65\x2d\xa7\xd1\x67"
+ "\x8c\x94\xa7\xd1\x67\x04\xf0\x35\x7a\xcc\x44\x5b\x8d\x3e\x23\xd3"
+ "\x71\x8d\x3e\xe3\x88\x3c\xae\xcf\x28\x74\x4c\xa3\xcf\xf4\x12\xd6"
+ "\xe8\xd1\x79\xe2\x1a\x9d\x9c\xb3\xd5\x56\xb3\x8e\x70\xda\x6a\xd6"
+ "\xba\xee\xaf\xd1\x67\xa9\x84\x75\xd4\xac\x91\x44\xa3\xcf\x54\x76"
+ "\xbe\x46\x9f\xa9\x14\xd6\xe8\xb3\xc8\xfe\xbf\xd4\x4c\x6f\x5b\x8d"
+ "\x0e\xd7\x08\x6a\xf4\x59\xe7\xd8\x6b\x94\x7c\x8d\x4e\xf2\x80\xba"
+ "\xe6\xba\xb8\x46\x9f\xcd\xce\x0b\x9a\x3d\x9d\xd4\x3d\x04\x53\x5b"
+ "\x8d\x3e\xfb\x91\x8e\x35\x3a\xe1\x10\xf3\x9c\xa2\x1a\x7d\xf6\x1a"
+ "\x5b\x8d\x1e\xbd\x5d\x58\xa3\xcf\xb5\x18\xa7\x39\xe7\x26\x5f\xa3"
+ "\xcf\x3e\xd5\x33\x34\xba\x28\xb7\x54\x7c\x8d\x3e\x27\x5b\xba\x46"
+ "\x9f\x73\x5a\x9a\x46\xc7\x9c\x13\xd2\xe8\x73\xbd\xac\x39\xc7\xd7"
+ "\xe8\x73\x83\x85\x35\xfa\xdc\x89\x7c\x8d\x8e\xf3\x17\xd2\xe8\x73"
+ "\x97\xf1\xf2\xb7\xd1\xe8\x73\x33\xf9\x1a\x9d\xa4\xe3\x34\x7a\x4c"
+ "\x08\xdb\xa6\x8d\x97\xae\xd1\x63\xbc\xc4\x35\x7a\xcc\x20\xbe\x46"
+ "\x9f\x5b\x47\xb4\x78\x4c\x18\xd1\xe8\x31\x88\x1c\x8f\x0e\xb5\x3c"
+ "\xce\x69\x74\x72\x9c\xd3\xe8\x31\xd3\xee\xce\xe1\xec\x8e\x1a\x7d"
+ "\xde\x75\x79\x1a\x7d\x5e\x9d\x7c\x9d\xb8\xb0\x98\xd3\x89\x0b\x8b"
+ "\xc5\x75\xe2\xfc\x53\xf6\x75\xe2\xab\x6e\x9c\x4e\x8c\x5b\x48\xea"
+ "\xea\xb8\x08\x52\x57\xc7\x79\x48\xd7\x89\xb1\x9b\xf8\x3a\xf1\x15"
+ "\xaf\xbb\x3a\x51\xae\x4e\x8c\x89\xe7\x74\x62\xec\x54\x79\x3a\x31"
+ "\x36\x8a\xaf\x13\x17\xd9\xee\x95\x45\xc5\x1e\x73\x5c\x27\xc6\x5e"
+ "\x90\xa7\x13\x63\xab\x1c\xd3\x89\x71\x4f\x0a\xeb\xc4\xf9\x25\xe2"
+ "\x3a\x91\x9c\xb3\x6d\xdf\x17\x5c\xe0\xda\xf7\x05\xfb\xba\xbf\x4e"
+ "\x5c\x10\x2e\xdc\x96\x2f\x98\x4a\x74\x62\x9c\xa6\xf3\x75\x62\x9c"
+ "\x46\x58\x27\x2e\x60\xd7\x3f\x8b\x1b\x6b\xab\x13\xe1\x1a\x41\x9d"
+ "\xb8\x80\xed\xff\x8d\xd3\xf0\x75\x22\xc9\x03\xea\x1a\x1f\x71\x9d"
+ "\xf8\xea\x11\x52\xf7\xbc\xca\x7e\x47\x22\x98\xda\xea\xc4\x57\xa7"
+ "\x77\xac\x13\x09\x87\x98\xe7\x14\xd5\x89\xaf\xee\xb5\xd5\x89\xf3"
+ "\x8b\x85\x75\xe2\xc2\x35\x1c\x8f\x16\x0e\xe2\xeb\xc4\x57\xaf\xf6"
+ "\x0c\x9d\x28\xca\xad\x70\xbe\x4e\x8c\x3f\x2e\x5d\x27\xc6\x5f\x97"
+ "\xa6\x13\x31\xe7\x84\x74\xe2\xc2\x27\xad\x39\xc7\xd7\x89\x0b\x5f"
+ "\x12\xd6\x89\x0b\x17\xf3\x75\x22\xce\x5f\x48\x27\x2e\xdc\xc1\xcb"
+ "\xdf\x46\x27\x2e\x3c\xc6\xd7\x89\x24\x1d\xa7\x13\x17\x91\x3d\xb0"
+ "\xa8\xf9\x0b\xa5\xeb\xc4\x45\x4f\x8a\xeb\xc4\x45\xfc\xfd\xaf\xa8"
+ "\x45\x64\xff\x2b\x6a\x51\x02\xd1\x89\x8b\xc8\xfe\x57\xd4\xfc\x78"
+ "\xcb\xe3\x9c\x4e\x24\xc7\x39\x9d\xb8\x28\xd9\xb9\xf9\x9d\xcb\x47"
+ "\x73\xda\x62\xf9\x68\x71\x6d\xf1\xda\x10\xfb\xda\x62\x69\x32\xa7"
+ "\x2d\x16\x5f\x24\xe5\x7b\xf1\x29\x52\xbe\x17\x33\xe3\x93\xd6\x9d"
+ "\x05\x6d\xf1\x40\x74\xe1\xe1\x1b\x85\x8c\xb6\xf8\x68\x49\x33\x05"
+ "\x7a\xcf\xd5\x84\xb5\x05\xe8\xba\x8c\xd5\x58\x5b\xd4\xb0\xf3\x3b"
+ "\x13\x5a\xce\x26\x59\x6a\x8b\xd7\x96\x31\x73\x3d\xb1\xbe\x68\x68"
+ "\x66\xd2\xe1\xf3\x42\x73\x3f\x4f\x2e\x61\xe7\x7e\x42\xde\x96\x73"
+ "\x3e\x99\x79\xa0\x37\x40\x7b\xcc\x07\x3c\x2c\xb4\xc7\xdd\xb9\x9f"
+ "\xb8\xad\x4f\x38\x2d\x4f\xd7\x26\x94\xf0\x35\xc7\xf2\x1f\x6d\x35"
+ "\xc7\xe2\x91\x8e\x6b\x8e\xc5\x11\xf2\x34\xc7\xe2\xc9\x8e\x69\x8e"
+ "\xc5\x87\x84\x35\xc7\x6b\x2a\xcc\x4f\x61\xcd\x41\xce\xd9\xb6\x15"
+ "\x4b\x23\xb8\xb6\x62\xe9\xa0\xee\xaf\x39\x96\x9c\x10\x6e\x17\x96"
+ "\x9c\x26\x9a\x63\xf1\xc1\xce\xd7\x1c\x8b\x0f\x0a\x6b\x8e\xa5\x6c"
+ "\xfd\xbf\xb8\xd0\x56\x73\xc0\x35\x82\x9a\x63\x29\xfb\xfd\x6f\xf1"
+ "\x41\xbe\xe6\x20\x79\x40\x1d\xb4\x59\x5c\x73\x24\xfa\x93\x3a\x69"
+ "\x69\x23\xa9\x93\x08\xa6\xb6\x9a\x63\xe9\xd9\x8e\x35\x07\xe1\x10"
+ "\xf3\x9c\xa2\x9a\x23\xd1\xc7\x56\x73\xbc\x36\x58\x58\x73\x2c\xb3"
+ "\x18\xa7\xbd\x2c\x93\xaf\x39\x12\x67\xf7\x0c\xcd\x21\xca\xad\x13"
+ "\x7c\xcd\xb1\x2c\x58\xba\xe6\x58\x36\x4f\x9a\xe6\xc0\x9c\x13\xd2"
+ "\x1c\xcb\x0e\x59\x73\x8e\xaf\x39\x96\x9d\x11\xd6\x1c\xcb\x7e\xe4"
+ "\x6b\x0e\x9c\xbf\x90\xe6\x58\xee\xc1\xcb\xdf\x46\x73\x2c\x1f\xc9"
+ "\xd7\x1c\x24\x1d\xa7\x39\x96\x97\xb1\xbe\xed\xb4\x74\xcd\xb1\xfc"
+ "\x90\xb8\xe6\x58\x7e\x8c\xaf\x39\x96\xa7\x13\x6d\xb1\x5c\x47\x34"
+ "\xc7\xf2\x3c\x56\x8b\x94\x58\x1e\xe7\x34\x07\x39\xce\x69\x8e\xe5"
+ "\x7a\x09\x7d\x53\x05\x52\xe6\x7e\x1e\xba\xcd\xef\x9b\x32\xf7\x4b"
+ "\x19\xd4\x43\x72\xda\xfb\xa6\xa0\xad\x17\xdb\x13\x1d\xf7\x4d\xe1"
+ "\xb6\x9b\xeb\x9b\xba\xc8\xd4\x55\x5c\xdf\x94\x8e\xe9\x9b\xc2\xfd"
+ "\x52\xe0\xd9\xdb\xfb\xa5\x4c\xaf\xdb\xce\xfb\x3c\x64\x92\xde\x2f"
+ "\x35\x67\x99\x12\xed\x62\xda\xef\x93\xd5\xa4\x5f\xaa\xaa\xbd\x5f"
+ "\x0a\xb7\xdb\xc6\x26\xdb\x7e\x29\xdc\x5e\x73\xfd\x52\xdf\xcb\xec"
+ "\x97\x5a\xb9\x49\x5e\xfb\xbd\xb2\x1b\xcc\x7f\xeb\x89\xf3\x3e\x57"
+ "\xb8\x72\xdf\x8e\x57\xcb\x9c\xff\xb6\xda\xee\xfc\xb7\xbb\xe3\x9a"
+ "\xc5\x62\xbf\xb2\x8c\x8b\xfd\xeb\xeb\xe4\xc5\xfe\xf5\xe4\x5f\x3f"
+ "\xf6\x3d\x71\xcc\xc4\xea\x70\x2e\xf6\x49\x32\xd7\x7f\x4b\x6a\x96"
+ "\xdf\x17\x9e\xaa\xe7\xfc\x6a\xaa\xde\xd2\xaf\x96\x86\x59\xfa\xd5"
+ "\x35\x67\xed\xfb\xd5\x14\x0d\xe7\x57\x93\x77\x10\x6d\x98\xbc\x8e"
+ "\x68\xc3\x64\x66\x4f\xb2\x75\xe3\x11\xe3\x53\x0d\xd8\xb3\x2e\x6a"
+ "\xa6\x0e\x5f\x2b\xa6\x0c\x1b\x88\x57\xad\x30\x94\xa1\xb3\xfa\x66"
+ "\xf4\xf6\x6a\xe4\xba\xf9\x06\x72\xfd\x5b\x7d\x33\xe5\x99\x80\xdc"
+ "\xa0\x9d\x00\x2d\x55\x06\xda\x22\x1f\x25\xa6\x60\x1f\xfb\xc6\xb1"
+ "\x8a\x44\xbd\x85\x8f\x5d\x3b\x86\xf3\xb0\x90\x2e\xb1\x19\x7d\xbe"
+ "\xa8\x98\xc2\x5e\xb5\x2d\x37\x62\x4f\x5b\xf0\x10\x2d\xb3\x66\x91"
+ "\x65\x7f\x39\xdc\x5b\x35\x87\xdf\x5f\xde\x9a\x1b\x51\xd0\x72\x68"
+ "\x48\x0e\xb3\x1e\xa2\x3f\xd7\x6f\xee\x68\x7f\xf9\x7b\xad\xc8\xdb"
+ "\xbc\x1e\x22\x6e\x17\x7b\x5e\x7f\xf9\xeb\x25\x5c\x7f\xf9\x1b\x69"
+ "\xf2\xfa\xcb\xdf\x48\xe5\x7b\xd7\xb4\x7c\x5b\xef\xfa\xc6\x65\xc7"
+ "\xbd\x6b\xb2\xcc\xf9\xff\xc9\x6e\x8e\x79\xd7\xe4\x85\xd6\xde\x75"
+ "\x7f\x0a\xf6\xae\x6b\x2a\x31\x57\x85\xbd\x2b\x39\x67\xeb\x39\x52"
+ "\xfa\x72\x9e\x63\xdd\x77\xdd\xdf\xbb\xae\x4b\x12\xf6\x17\xeb\xd2"
+ "\x88\x77\x4d\x8e\xef\x7c\xef\x9a\x1c\x2f\xec\x5d\xd7\x35\x12\x9d"
+ "\x9f\x1c\x6f\xf6\xa1\x9c\x77\x85\x6b\x04\xbd\x6b\xca\x48\xeb\x6b"
+ "\x88\x77\x4d\x4e\x20\xde\x35\x65\xa2\xb8\x77\x4d\x61\xd7\x4b\x4b"
+ "\x39\x42\xea\x27\x82\xa9\xad\x77\x4d\xd9\xdc\xb1\x77\x25\x1c\x62"
+ "\x9e\x53\xd4\xbb\xa6\x9c\xb3\xf5\xae\x6b\xca\x84\xbd\x6b\xea\x01"
+ "\x8e\x47\xa9\x93\xf8\xde\x75\xfd\xa0\x9e\xe1\x5d\x45\xb9\x95\xc4"
+ "\xf7\xae\xeb\xaf\x4a\xf7\xae\xa9\x43\xa4\x79\x57\xcc\x39\x21\xef"
+ "\x9a\xba\x90\xe5\x4f\x82\xb0\x77\x4d\xdd\x24\xec\x5d\x53\xf3\xf9"
+ "\xde\x15\xe7\x2f\xe4\x5d\x53\xcf\xf0\xf2\xb7\xf1\xae\xa9\x97\xf9"
+ "\xde\x95\xa4\xe3\xbc\x6b\x5a\x3a\xa9\x43\xd7\xac\x92\xee\x5d\xd3"
+ "\x16\x8a\x7b\xd7\xb4\x65\x7c\xef\x9a\x16\x46\x3c\x6a\x5a\x1e\xf1"
+ "\xae\x69\xd1\xe4\xf8\x9a\x95\x96\xc7\x39\xef\x4a\x8e\x73\xde\x35"
+ "\xed\xa0\x04\xef\xba\xbf\x93\xbc\xeb\xf6\x9e\xe5\x5d\x3f\xcf\xeb"
+ "\x5a\xef\xfa\xe6\x78\x79\xde\xf5\xcd\x50\x07\x35\x7c\x41\x07\x1a"
+ "\x3e\xe7\xff\x2f\x0d\x9f\x56\xcc\x69\xf8\x8d\x27\xe5\x69\x96\x8d"
+ "\x27\x7e\xed\xd8\xf7\xbc\xb8\xbf\x99\xce\xc5\xfd\xad\x31\xf2\xe2"
+ "\xfe\xd6\xe8\xbb\xbe\x55\x4e\xec\x37\x59\xf4\xd7\xfc\x59\xe6\xf8"
+ "\xe7\x3f\x17\xca\xf7\xad\x5b\xcb\x38\xdf\xba\xb5\xcc\xd2\xb7\x7e"
+ "\xc5\xfb\xce\x9a\xbe\xc9\xbe\x6f\xcd\xf4\xe6\x7c\xeb\xdb\xab\x88"
+ "\x2e\x7c\x9b\x1d\x6f\xfb\x36\xa3\xb7\x92\x8f\x11\xdf\x7a\x1b\xfb"
+ "\xd6\x2b\xe0\x5b\x17\xc4\x50\x06\x76\x0d\x7e\x3c\x2e\xeb\x2c\x78"
+ "\x4f\xec\x55\x2b\x92\xe0\xdf\x2b\xf5\xe8\xed\xe5\xc8\x75\x0b\x78"
+ "\xce\x03\xd0\x7e\x1d\x58\xad\xa7\xd2\x17\x41\xdd\x5f\x75\x08\x79"
+ "\xc6\x83\x9f\xad\xc7\x7e\xb6\x04\xbc\xea\x26\xd6\xcf\x6e\xc9\xae"
+ "\x58\x69\xe9\x67\x37\xf7\x62\xfc\xac\x9e\x8c\xf9\xaa\x58\x09\x7e"
+ "\x16\xee\x87\xd7\xf4\xb7\xf4\xb3\x2d\xe0\x57\x5b\xc1\xaf\x6a\xaf"
+ "\x59\x79\xdb\x05\xb6\xde\xb6\xc5\x27\x62\x7f\x73\xf0\x90\xed\xd8"
+ "\xdb\xde\xde\xf7\xff\xa3\xb7\x7d\x2b\x99\xf3\xb6\x5b\x66\xcb\xf3"
+ "\xb6\x5b\x66\xf1\xbd\xad\x76\x8d\xad\xb7\xdd\x72\xca\x71\x6f\xbb"
+ "\xe5\xb2\xbc\x32\xb3\xa5\xc6\x31\x6f\xfb\xf6\x44\x6b\x6f\xfb\x01"
+ "\xf3\x5d\x36\x3d\x1d\xf3\x59\xd8\xdb\x92\x73\xb6\x9e\x24\xe3\x32"
+ "\xe7\x49\x32\x8e\x74\x7f\x6f\x9b\x31\x4d\xd8\x7f\x64\xcc\x26\xde"
+ "\xf6\xed\xb0\xce\xf7\xb6\x6f\x87\x09\x7b\xdb\x0c\x76\xfc\xff\xdb"
+ "\x61\xb6\xde\x16\xae\x11\xf4\xb6\x99\xbd\xac\xaf\x21\xde\xf6\xed"
+ "\x70\xe2\x6d\x33\x87\x89\x7b\xdb\xcc\x93\xa4\x0e\xcb\xcc\x24\x75"
+ "\x18\xc1\xd4\xd6\xdb\x66\xc6\x75\xec\x6d\x09\x87\x98\xe7\x14\xf5"
+ "\xb6\x99\x87\x6c\xbd\x6d\xfa\x46\x61\x6f\xbb\x75\x13\xc7\xa3\xad"
+ "\xfe\x7c\x6f\x9b\xd9\xd8\x33\xbc\xad\x28\xb7\xa6\xf1\xbd\x6d\xd6"
+ "\x69\xe9\xde\x36\xab\x45\x9a\xb7\xc5\x9c\x13\xf2\xb6\x5b\x27\xb2"
+ "\xfc\x09\x17\xf6\xb6\x5b\xe7\x09\x7b\xdb\xad\x6b\xf8\xde\x16\xe7"
+ "\x2f\xe4\x6d\xb7\xee\xe3\xe5\x6f\xe3\x6d\xb7\x9e\xe2\x7b\x5b\x92"
+ "\x8e\xf3\xb6\xda\x58\x52\x87\xa6\x07\x4b\xf7\xb6\xda\x89\xe2\xde"
+ "\x56\x1b\xc1\xf7\xb6\x5a\x15\xf1\xb0\xda\x24\xe2\x6d\xb5\xa3\xc9"
+ "\xf1\x74\xb5\xe5\x71\xce\xdb\x92\xe3\x9c\xb7\xd5\xa6\x4b\xfb\x2e"
+ "\xeb\xd4\xba\x47\x39\x5d\x3f\x67\xa0\xb3\xd6\x3d\x32\x7f\x9b\xed"
+ "\xaa\x39\x03\xef\x0c\x93\xe7\x6f\xdf\x51\xdd\xf5\x58\x52\x75\xbe"
+ "\x36\x8f\xd3\xf9\xef\xee\x90\xa7\x59\xde\xdd\x7e\xd7\x63\xc9\x89"
+ "\xfd\x3b\xf1\x5c\xec\x73\x7d\xe4\xc5\x3e\xd7\x5b\xbe\xc7\xca\x77"
+ "\xe7\x3c\x56\xbe\xbb\xf8\xb7\xc1\xdc\xab\xf6\x3d\xd6\xce\x69\x9c"
+ "\xc7\xda\x7e\x8c\xe8\x93\xed\x3b\x88\x3e\xd9\x3e\xbd\xf3\xbe\x0d"
+ "\xfe\xe5\x1c\xff\xdb\xe0\xb6\xa9\x77\xbf\x0d\x76\x86\x7f\x7a\x57"
+ "\xc7\xf9\xa7\xbf\xe4\xcb\xf3\x4f\x7f\xc9\xe3\xfb\xa7\xfc\xe3\xb6"
+ "\xfe\x69\xbb\x8b\xe3\xfe\x69\xbb\xbf\xbc\xf2\xb0\x7d\xb8\x63\xfe"
+ "\x69\xfb\x26\xe1\x6f\x83\xb9\x75\xe2\xdf\x06\xc9\x39\x5b\xdd\xbb"
+ "\xd3\x9f\xd3\xbd\x3b\x6e\x76\x7f\xff\xb4\x23\x47\x58\xe3\xee\xc8"
+ "\x27\xfe\x69\xfb\xc6\xce\xf7\x4f\xdb\x37\x0a\xfb\xa7\x9d\xec\xfc"
+ "\xd7\xed\x1b\x6d\xfd\x13\x5c\x23\xe8\x9f\x76\x4e\xb4\xbe\x86\xf8"
+ "\xa7\xed\xe9\xc4\x3f\xed\x9c\x27\xee\x9f\x76\x1a\x49\xfd\xb4\xf3"
+ "\x2c\xa9\x9f\x08\xa6\xb6\xfe\x69\xe7\xbe\x8e\xfd\x13\xe1\x10\xf3"
+ "\x9c\xa2\xfe\x69\xe7\x75\x5b\xff\x94\x5b\x2b\xec\x9f\xf2\x4e\x73"
+ "\x3c\xca\x8b\xe3\xfb\xa7\xf7\xc6\xf4\x0c\xff\x24\xca\xad\x1c\xbe"
+ "\x7f\xca\xeb\x25\xdd\x3f\xe5\x3d\x29\xcd\x3f\x61\xce\x09\xf9\xa7"
+ "\xbc\x4d\x2c\x7f\xd2\x85\xfd\x53\xde\x5e\x61\xff\x94\x77\x9c\xef"
+ "\x9f\x70\xfe\x42\xfe\x29\xef\x32\x2f\x7f\x1b\xff\x94\xef\xc2\xf7"
+ "\x4f\x24\x1d\xe7\x9f\xf2\x0b\x48\x1d\x9a\x9b\x2d\xdd\x3f\xe5\x6f"
+ "\x12\xf7\x4f\xf9\x99\x7c\xff\x94\x1f\x43\x7c\x52\x7e\x11\xf1\x4f"
+ "\xf9\x2b\xc9\xf1\x5c\xad\xe5\x71\xce\x3f\x91\xe3\x9c\x7f\xca\x2f"
+ "\x95\xe6\x9f\x1c\x5f\x17\xe9\xd7\x1f\xd7\xaa\xea\xa1\xe3\x5a\x77"
+ "\xcf\x96\xe7\x9d\x76\xcf\xba\xab\xe1\xe5\x68\xf8\xfc\x6a\x4e\xc3"
+ "\xef\x91\x39\xff\x77\x4f\x95\x7c\x0d\xbf\xbf\x92\xd3\xf0\xfb\x2b"
+ "\xc5\x35\xfc\xde\x43\xf6\x35\xfc\x07\xbe\x9c\x86\x2f\x58\x43\xda"
+ "\xc8\x82\xd9\xa4\x8d\x2c\x18\xd2\x79\x1a\xfe\xfd\x5c\xbe\x86\xff"
+ "\xab\xcf\x5d\x0d\xdf\x19\x1a\x7e\xb7\xc5\x7e\xc7\xef\xcf\x93\xa7"
+ "\xe1\xdf\x8f\xe1\x6b\xf8\x03\xeb\x6c\x35\xfc\xfb\xa7\x1d\xd7\xf0"
+ "\xef\x5f\x95\x57\x1e\xde\xaf\x75\x4c\xc3\x17\x4c\x12\xd6\xf0\x7b"
+ "\x0b\xc5\x35\x3c\x39\x67\xab\xbd\xf6\x5d\xe5\xb4\xd7\xbe\x63\xdd"
+ "\x5f\xc3\xef\x8b\x16\xd6\x59\xfb\xe6\x11\x0d\x5f\x10\xde\xf9\x1a"
+ "\xbe\x20\x5c\x58\xc3\xef\xfb\x8e\xe8\x9d\x82\x70\x5b\x0d\x0f\xd7"
+ "\x08\x6a\xf8\x0f\xfa\x5a\x5f\x43\x34\x7c\xc1\x64\xa2\xe1\x3f\xf0"
+ "\x17\xd7\xf0\x1f\x9c\x22\xf5\xd3\x07\xd9\xa4\x7e\x22\x98\xda\x6a"
+ "\xf8\x0f\x16\x76\xac\xe1\x09\x87\x98\xe7\x14\xd5\xf0\x1f\x1c\xb1"
+ "\xd5\xf0\x7b\x0f\x0a\x6b\xf8\xfd\x9b\x39\x1e\xed\x1f\xc9\xd7\xf0"
+ "\x1f\xb4\xf4\x0c\x0d\x2f\xca\xad\x68\xbe\x86\xff\x3f\x67\xa4\x6b"
+ "\xf8\xff\x63\x94\xa6\xe1\x31\xe7\x84\x34\xfc\xfe\x49\x2c\x7f\x26"
+ "\x0b\x6b\xf8\xfd\x71\xc2\x1a\x7e\xff\x3a\xbe\x86\xc7\xf9\x0b\x69"
+ "\xf8\xfd\x07\x78\xf9\xdb\x68\xf8\xfd\xa7\xf9\x1a\x9e\xa4\xe3\x34"
+ "\xfc\x81\x78\x52\x87\xee\x7d\x49\xba\x86\x3f\x30\x49\x5c\xc3\x1f"
+ "\x98\xca\xd7\xf0\x07\x86\x13\xad\x7e\x20\x99\x68\xf8\x03\x1a\x72"
+ "\x7c\xef\x34\xcb\xe3\x9c\x86\x27\xc7\x39\x0d\x7f\x20\xe3\xee\xba"
+ "\x49\xdd\x71\xdd\xa4\x0f\xfd\xe5\xe9\xf8\x0f\x87\xcb\xd7\x92\x1f"
+ "\x37\x73\x5a\xf2\xe3\x66\x4b\x2d\xc9\x5f\xdb\xe0\xc3\x16\xfb\x5a"
+ "\xb2\x30\x94\xd3\x92\x87\xf7\x92\xba\xfa\xf0\x26\x52\x57\x1f\x66"
+ "\xbe\xef\x49\x5b\x37\xe9\xd0\x49\xfe\xba\x49\x07\x27\xdd\x5d\x37"
+ "\x49\xae\x4e\x3c\xb0\x87\xd3\x89\x87\x36\xcb\xd3\x89\x87\xd2\xf9"
+ "\x3a\xf1\x93\x7d\xb6\x3a\xf1\xd0\x75\xc7\x75\xe2\x61\x2f\x79\x3a"
+ "\xf1\xb0\xd2\x31\x9d\x78\x78\x99\xf0\x1a\x06\x1f\x1a\xc4\xd7\x4d"
+ "\x22\xe7\x6c\xdb\xf7\x42\x2f\xae\x7d\xff\xe8\x62\xf7\xd7\x89\x1f"
+ "\xa5\x0a\xb7\xe5\x1f\x6d\x26\x3a\xf1\x70\x62\xe7\xeb\xc4\xc3\x89"
+ "\xc2\x3a\xf1\x23\x23\x69\x53\x0f\xaf\xb4\x5d\xc3\x00\xae\x11\xd4"
+ "\x89\x85\x8f\xb0\xd7\x24\xf2\x75\x22\xc9\x03\xea\x9a\x08\x71\x9d"
+ "\x58\x78\x95\xd4\x3d\x85\xc7\x49\xdd\x43\x30\xb5\xd5\x89\x85\xd9"
+ "\x1d\xeb\x44\xc2\x21\xe6\x39\x45\x75\x62\xe1\x05\x5b\x9d\xf8\x61"
+ "\xb3\xb0\x4e\xfc\xd8\x62\x9d\xd6\x8f\xa7\xf2\x75\xe2\x91\x61\x3d"
+ "\x43\x27\x8a\x72\x2b\x95\xaf\x13\x8f\xdc\x94\xae\x13\x3f\xf6\x97"
+ "\xa6\x13\x31\xe7\x84\x74\xe2\xc7\xcb\xac\x39\xc7\xd7\x89\x1f\x67"
+ "\x0a\xeb\xc4\x8f\xf7\xf1\x75\x22\xce\x5f\x48\x27\x7e\x7c\x8e\x97"
+ "\xbf\x8d\x4e\xfc\xf8\x3a\x5f\x27\x92\x74\x9c\x4e\xfc\x44\x4b\xea"
+ "\xd0\x0f\xf7\x4a\xd7\x89\x9f\x2c\x13\xd7\x89\x9f\xac\xe1\xeb\xc4"
+ "\x4f\x26\x13\x3d\xf8\x49\x01\xd1\x89\x9f\xc4\x90\xe3\x1f\xee\xb1"
+ "\x3c\xce\xe9\x44\x72\x9c\xd3\x89\x9f\x1c\x95\x36\x0f\xa4\x53\xfa"
+ "\x7a\xbb\x68\x1e\x48\x67\xf5\xf5\x76\xf5\x3c\x90\x63\x32\xd7\xbf"
+ "\x3f\xe6\xe8\xfa\xf7\x77\xc7\xc9\xb4\xf7\xf3\x7e\x52\xca\xf5\xf3"
+ "\xfe\xcf\x29\x79\x7a\xe5\x7f\x8a\xe5\x6b\xf3\xcf\x2c\xf6\xef\xfd"
+ "\x8c\xb7\x7f\x2f\x7f\x3c\xfc\xdf\x73\xed\x6b\xf3\x13\x16\xfb\xf7"
+ "\x7e\xca\xee\xdf\xfb\x29\xbb\x7f\xef\xa7\xc3\xe4\x8c\x87\xdf\x52"
+ "\x8f\x5c\xdf\xb6\x1e\x0f\x7f\xfe\x24\x19\x0f\xbf\xdc\x7a\x3c\xfc"
+ "\xf1\x1d\xfc\xf1\xf0\x45\x3e\x62\xe3\xe1\x71\xbf\x6f\xdb\xa1\x21"
+ "\x39\x78\x2c\xbc\xe0\x38\xf8\x19\x9d\x3b\x0e\x1e\x73\xf3\xbd\xb5"
+ "\x44\xdb\xef\xec\x91\xda\xfe\x98\xc5\xda\xf9\xc7\x65\xee\xff\x7b"
+ "\xdc\x6a\xff\xdf\xcf\x05\xf6\xff\x3d\x2e\x61\xff\xdf\xe3\x32\xf7"
+ "\xff\x3d\xee\xe0\xfe\xbf\x9f\xda\xec\xff\x4b\xc6\xc1\xff\x7d\xbb"
+ "\xf8\x38\x78\x72\xce\x56\x93\xfd\xc3\x62\x5d\xa9\x7f\xf4\x80\xfd"
+ "\x7f\xff\x21\xb2\x47\xeb\x3f\xd8\xfd\x7f\x3f\xbd\x03\xfb\xff\x7e"
+ "\x2a\xb2\xff\xef\x3f\xd8\xfd\x7f\x3f\x6d\xdf\xcb\x97\xd3\xf6\x9f"
+ "\x8a\xec\xff\x7b\xc2\xc3\xfa\x1a\xa2\xed\x3f\x65\xf7\xff\x3d\x61"
+ "\x67\xff\xdf\x13\xec\xfe\xbf\x27\xd8\xfd\x7f\x09\xa6\xb6\xda\xfe"
+ "\x84\x03\xfb\xff\x7e\xca\xee\xff\xfb\xa9\x9d\xfd\x7f\x4f\x08\xec"
+ "\xff\xfb\xf7\x1c\x61\x6d\xff\x99\xc5\xfe\xbf\x9f\x59\xed\xff\x7b"
+ "\xa2\x87\xec\xff\x2b\xca\x2d\xab\xfd\x7f\x4f\xca\xd8\xff\xf7\x33"
+ "\x89\xfb\xff\x7e\x2a\xb2\xff\xef\x67\xec\xfe\xbf\x9f\x8a\xec\xff"
+ "\xfb\x99\xc8\xfe\xbf\x9f\x59\xed\xff\xfb\xa9\xc8\xfe\xbf\x9f\x1d"
+ "\xe2\xe5\x6f\xa3\xed\x3f\xb3\xda\xff\xf7\x53\xab\xfd\x7f\x3f\x67"
+ "\xf7\xff\xfd\xfb\x38\xe9\xda\xfe\x73\x3b\xfb\xff\x7e\x6e\xb5\xff"
+ "\xef\xe7\xec\xfe\xbf\x9f\xb3\xfb\xff\x7e\xce\xee\xff\xfb\xf7\xb1"
+ "\x96\xc7\x39\x6d\x4f\x8e\x73\xda\xfe\x73\x29\xfb\xff\x16\x48\xe9"
+ "\x03\xfe\xf5\xc7\x71\x28\x7b\xe8\x38\x8e\x53\x32\xfb\x7f\x4f\x39"
+ "\xd1\xff\x7b\xc6\x9b\xd3\x98\x67\xbc\xc5\xc7\x12\x9c\xea\xa0\xff"
+ "\xf7\xab\x59\x9c\xc6\x2c\x61\xe7\x2b\x95\xec\x25\xf5\x74\xc9\x3c"
+ "\x47\xc7\x12\x6c\xb9\xcd\xea\x4a\xf3\x58\x82\xd5\xec\x58\x02\xd0"
+ "\x96\x44\x4b\x7e\x79\x81\x3f\x96\xe0\x8b\x79\x62\x63\x09\x04\xc7"
+ "\x10\x58\xe9\x47\xb3\xd6\x94\x3b\x86\xa0\xe7\xeb\xc7\xcf\x2d\xc6"
+ "\x10\x7c\xb9\x4f\x9e\x7e\xfc\xb2\x80\xaf\x1f\xcf\x9c\xb2\xd5\x8f"
+ "\x25\x7d\x1d\xd7\x8f\x25\xc1\xf2\xf4\x63\x89\xda\x31\xfd\x58\x92"
+ "\x29\x3c\x86\xe0\x94\x41\x7c\x0c\x01\x39\x67\xdb\xee\x7f\x15\xcc"
+ "\xb5\xfb\xa7\x5b\xba\xbf\x7e\x3c\x9d\x27\xdc\xc6\x9f\xde\x47\xf4"
+ "\x63\x49\x46\xe7\xeb\xc7\x92\x0c\x61\xfd\xf8\xd5\x20\xd2\xd6\x96"
+ "\x64\xd8\xea\x47\xb8\x46\x50\x3f\x7e\x15\x61\x7d\x0d\xd1\x8f\x25"
+ "\x5a\xa2\x1f\xbf\x5a\x28\xae\x1f\xff\x6f\x2f\x52\x2f\x7d\xf5\x1d"
+ "\xa9\x97\x08\xa6\xb6\xfa\xf1\xab\x43\x1d\xeb\x47\xc2\x21\xe6\x39"
+ "\x45\xf5\xe3\x57\x8d\xb6\xfa\xf1\x94\x48\xdf\x70\xe9\x59\x8e\x47"
+ "\xa5\x8b\xf9\xfa\xf1\xff\x8e\xeb\x19\xfa\x51\x94\x5b\x79\x7c\xfd"
+ "\x58\xea\x21\x5d\x3f\x96\x8e\x97\xa6\x1f\x31\xe7\x84\xf4\x63\x69"
+ "\x26\xcb\x1f\xad\xb0\x7e\x2c\x3d\x20\xac\x1f\x4b\x4f\xf1\xf5\x23"
+ "\xce\x5f\x48\x3f\x96\x5e\xe7\xe5\x6f\xa3\x1f\xcf\xf4\xe5\xeb\x47"
+ "\x92\x8e\xd3\x8f\x67\x0e\x92\x3a\xf4\x94\x8c\xbe\xe1\x33\x99\xe2"
+ "\xfa\xf1\x4c\x2e\x5f\x3f\x9e\x61\xd7\xce\x3f\x53\x4c\xf4\xe3\x99"
+ "\x64\x72\xfc\xd4\x1e\xcb\xe3\x9c\x7e\x3c\x65\xd5\x37\x7c\xa6\xd2"
+ "\x9e\x7e\xa4\xb5\xf5\xe9\x5a\xca\x54\x08\x3f\xdc\x96\x0e\x82\x76"
+ "\xac\x18\xfe\x5d\x0a\xed\x91\x12\xfe\x5d\x29\xa6\x57\xf4\x5e\xf5"
+ "\xe9\x26\xd0\x1e\x26\xb8\x4f\x85\xfe\x97\xe2\x62\x3f\x03\xdc\xfb"
+ "\x6b\xb2\x67\x0b\xe4\xe9\x69\xe8\x13\x6e\xa2\xe3\xa1\x0d\x87\x7f"
+ "\x27\xc1\x31\x48\xdf\x1f\xda\x3d\xd5\x6a\xd4\xff\x06\xf5\x75\xa2"
+ "\x39\x1d\x3c\x73\xff\x4b\xd4\xd7\xc1\x38\x8f\xa6\x2d\x5f\x27\xc3"
+ "\xfb\x54\x8b\x3e\x2b\xe4\x15\x79\x60\x28\x5a\x67\xa0\x7f\x2a\x5e"
+ "\x52\x8f\x6a\xa8\xaf\x4f\x7b\xd6\xf5\x09\x87\x7a\x08\x61\xbd\x57"
+ "\xe8\xa7\x77\xc5\x79\x16\x2f\x69\xc5\xe7\xf6\xe3\x73\x46\x78\xc6"
+ "\x94\xc5\x88\xca\xaa\xef\xe3\x06\xba\xaa\xd7\xfa\x06\xba\x76\xa9"
+ "\x01\x9e\x39\xc9\x80\x3e\x1f\x5a\xe5\xfa\xd1\xce\x2a\xa6\xed\x29"
+ "\x6f\x30\x32\x79\xa8\x96\x30\xcf\x73\x66\x17\xa4\x17\x7a\x86\x4d"
+ "\x87\x91\xba\xd7\x48\x5a\x27\xad\xbd\xfb\x66\xb0\x58\x1c\x3d\xd3"
+ "\x86\xa2\xe2\x40\x88\x9d\x0a\x51\x42\xe7\x25\xde\xc7\xde\xfa\xb7"
+ "\x6e\xef\x0e\xa4\x1b\xd6\xef\x40\xd4\x56\x53\x1f\xb7\x2f\xa1\x4e"
+ "\xdc\xbd\x8d\xd6\x37\x6d\xf9\x46\xaf\x73\x39\x35\x0d\xc7\xfc\x4d"
+ "\x38\xbf\x75\x20\xad\xbf\xb5\x01\xf3\xa6\xcc\xed\x14\xb4\xed\xd6"
+ "\x58\x2c\x8f\x5d\x3c\x4f\xb5\x72\xe1\xe2\xb8\xa5\xab\x56\xaa\xfc"
+ "\x63\xfb\xa1\x69\x4b\x97\xaa\x16\xcf\x5b\xb2\x46\x65\x79\xe6\xf7"
+ "\xaa\xd8\x85\x2b\xe6\xcd\x4f\x88\x0b\x5e\xfc\x4a\x62\x3f\x78\x26"
+ "\x64\xf1\x1c\xde\xf8\x59\x4c\x5b\xca\xbc\x77\xbd\x83\xd0\xbb\x03"
+ "\x90\x2b\x7e\x2e\xb8\x5f\x92\xce\xd5\x3d\x0f\xdf\x2f\x6b\x1b\xdd"
+ "\x40\x41\x9a\xf5\x50\xa7\x6d\x4d\xe9\x03\x69\xbf\xd9\xb8\x1b\x9e"
+ "\x6b\x17\x3c\x37\x3c\x23\x3c\x73\x59\x81\xf9\x99\xcd\x9c\x58\x8f"
+ "\x39\x91\x52\x0f\x1c\x2c\x3b\xed\xd9\xdc\xe7\x79\x9a\x8e\xc6\xef"
+ "\xd7\x00\x65\xc5\xe5\x0a\x75\x76\x36\xe3\x01\xb2\xeb\xd3\xe1\x5a"
+ "\x9d\x99\x63\xa6\x9c\xa7\x54\xf4\x3b\xf5\x51\xa0\x1d\x5d\x9a\xe8"
+ "\xf8\xa7\x81\x9b\x70\xfd\xd9\xe0\x51\x08\xa5\xd2\x4d\xd1\xcc\xfe"
+ "\x03\x74\x13\x70\x98\xf0\x14\xce\x95\xa3\x5b\x14\x7a\xa6\x69\xcb"
+ "\xd9\xe1\x3a\xb4\xb8\x0e\xe7\xa1\x83\x63\x38\xe6\xa6\x3d\xd1\x7b"
+ "\x5e\x0a\x40\xa9\x23\x52\x51\x6a\x13\xbe\xa6\xc0\x2f\xc9\x73\x25"
+ "\x72\x89\x4c\xa2\x7f\x80\x7a\xc7\x85\x1e\x16\xbd\x87\xde\xe7\x97"
+ "\xa4\xa3\xce\xba\x99\x72\x9f\x52\xc1\xfb\xd4\x41\x3e\x09\x3a\xd4"
+ "\x56\x89\xf3\xd9\xba\x8d\x89\x7d\x1d\x7e\x77\x88\x0f\x78\x19\xba"
+ "\x98\xde\xc0\x96\x21\xad\x67\x95\x49\x3b\x07\x55\xb8\xde\x46\x91"
+ "\x06\xba\x8d\xce\xf6\xac\x2a\x6f\x68\x80\x3a\x2d\xf1\x15\xba\x5f"
+ "\x99\xbf\xa7\x61\x61\xdc\xee\x01\x50\x16\xb3\xe7\x20\x3a\x7b\x84"
+ "\xf7\x4b\x23\x91\x12\xf2\x2e\x35\xc7\x13\x62\xe9\x2a\x8d\x47\x67"
+ "\x99\x35\x5d\x30\x1f\xe0\x79\x58\x3e\x94\xfb\x9e\x5a\x69\xcb\x87"
+ "\xf6\xb2\xb9\x2d\x50\x6b\xa0\xa3\x9f\x6f\xcb\x09\x2c\xa5\xbd\x03"
+ "\x8f\xa6\x5c\x46\xbd\x71\x6c\xcb\x41\xef\x67\xad\x46\xbe\x99\x73"
+ "\x90\x6a\xee\x1a\x25\xd2\xe7\x06\x16\x7a\xa6\xa5\xba\x40\x4c\x28"
+ "\xa8\x5f\x42\xa0\xce\x0c\x69\x1b\xf8\x94\x2a\x39\x0e\x51\x87\x2e"
+ "\x15\x52\x58\x27\xe3\x71\x21\x10\xeb\x0b\xbb\xe0\x3a\xfa\x97\x68"
+ "\x84\xf1\x60\xb0\xf8\x25\x1e\x45\x80\x6a\xc0\xdf\x38\xae\x50\x15"
+ "\x1e\xf9\x90\xa7\xb4\xf7\x2a\x67\xf4\xaf\x11\xb0\x1a\x05\x38\x55"
+ "\xd4\x18\x99\x3c\x19\xac\x12\x38\xac\x4e\xc2\x73\x70\x78\x95\xe7"
+ "\x60\x5c\x85\xdf\x39\x48\x49\xde\x39\x28\x9c\xf6\x0e\x1a\x2d\xfe"
+ "\xce\x41\x21\xe4\x9d\x7b\xd5\xdb\x7f\xe7\x8a\xb3\xf6\xdf\xb9\xd2"
+ "\x45\xfa\x3b\x57\x6c\x97\xfe\xce\x15\xe9\x76\xde\x99\xc5\x39\x08"
+ "\x70\x0e\xb2\x83\x73\x10\x8b\xf3\x3d\x97\xec\xbf\x73\xe5\xa9\x0e"
+ "\xde\xb9\x51\xfa\x3b\x57\x66\x48\x7f\xe7\xca\x64\xf1\x77\x56\xb3"
+ "\x38\xab\x01\x67\xb5\x1d\x9c\xd5\x2c\xce\x5e\xdf\xda\x7f\xe7\x73"
+ "\xc7\xec\xbf\xf3\xb9\xab\xd2\xdf\xf9\x5c\xaa\xf4\x77\x3e\x97\x68"
+ "\xe7\x9d\x59\x9c\xd5\x80\xb3\xda\x0e\xce\x6a\x16\xe7\xc7\xb7\xd8"
+ "\x7f\xe7\x6f\x0f\xd8\x7f\xe7\x6f\x2f\x4a\x7f\xe7\x6f\x57\x4a\x7f"
+ "\xe7\x6f\x63\xc5\xdf\x39\x98\xc5\x39\x18\x70\x0e\xb6\x83\x73\x30"
+ "\x8b\xf3\xcc\x09\xf6\xdf\xf9\x7f\xf3\xed\xbf\xf3\xff\x9e\x93\xfe"
+ "\xce\xff\x1b\x2f\xfd\x9d\xff\x37\x5a\xec\x9d\x5b\xa1\xde\x76\x87"
+ "\x77\x69\xfb\x57\xf4\xf3\x46\xef\xc0\x13\xee\x35\x88\xca\xdb\x60"
+ "\x8a\xf7\xac\x45\x7d\xe1\xdd\xe2\xe9\x6d\xe3\xf4\xf8\xaf\xc9\x3b"
+ "\xb0\xa8\xd5\x3b\xb0\xb4\x65\x40\x7d\xd4\x1b\xb3\x51\x6f\xac\xc7"
+ "\x37\x9b\x90\xaf\x29\x27\xf0\x68\xc6\x0b\x48\xb5\x5e\x8f\x94\xe5"
+ "\x29\x3a\x94\x92\x48\xeb\xcb\xd1\x8f\xc8\xa3\x16\x7b\xcf\xef\x51"
+ "\x59\x5d\x29\x5a\xb2\x9c\xa6\xaf\x50\xdf\x0d\xc1\xdf\x80\x41\x27"
+ "\xa7\x6a\xff\x89\x54\x70\x8f\x90\x5d\xf0\xc3\xf9\x78\x4e\x86\xf6"
+ "\x73\xdb\xb8\xfa\xdd\x29\xc8\xf7\xb3\x45\xb5\x08\x1f\xcf\x87\x9f"
+ "\x71\xdb\x53\xaa\x94\xd9\x88\x3a\x5c\x5f\x45\x91\xb6\xf9\xfc\x55"
+ "\xeb\xb6\x79\xf2\x3c\x88\xe5\x7c\x7c\xee\xbb\x31\x79\x2f\x48\x8d"
+ "\xe5\xf9\xa3\xe6\xb6\x9b\x89\x65\xb5\x91\xb4\xf7\x56\x6d\xf7\x67"
+ "\x70\x7f\x2e\x96\xe7\x0b\x70\x2c\xe9\x9c\xc0\xca\x8a\xda\x56\xec"
+ "\x9b\x94\x57\x92\x10\x05\xc7\xa7\x95\x27\xd6\x23\xe1\x18\x07\x29"
+ "\xb9\x18\x07\x8d\x75\xaf\xe9\x55\x2f\x1c\xe3\x20\x4d\xab\x77\x50"
+ "\xb8\x6d\x8c\x83\x46\x3b\x16\xe3\x7f\xa6\x39\x1f\xe3\x7f\x46\x88"
+ "\xc7\xf8\x9f\x3b\xa4\xc7\xf8\x9f\xbe\xd2\x63\xfc\x4f\x37\x12\xe3"
+ "\xa0\x28\x7e\x8c\xbf\x2b\xb2\x13\x63\x0b\x1e\x07\x01\x8f\xef\xb9"
+ "\x24\x12\x63\xe0\x71\x90\x00\x8f\x83\x1c\xe4\xf1\xbf\x2e\x3b\x1f"
+ "\xe3\x7f\x1d\x11\x8f\xf1\xbf\x8c\xd2\x63\xfc\xaf\x64\xe9\x31\xfe"
+ "\x57\x02\x1b\x63\x2b\x1e\xff\x6b\xb0\x78\x8c\xd5\x16\x3c\x56\x03"
+ "\x8f\xbd\xbe\x15\x8e\xb1\x1a\x78\xac\x16\xe0\xb1\xda\x41\x1e\x5f"
+ "\x98\xe4\x7c\x8c\x2f\xf8\x88\xc7\xf8\xc2\x3c\xe9\x31\xae\xd2\x49"
+ "\x8f\x71\x55\x25\x89\xb1\xda\x8a\xc7\x55\xa9\x76\x62\x6c\xc1\x63"
+ "\x35\xf0\xf8\xf1\x2d\x22\x31\x06\x1e\xab\x05\x78\xac\x76\x90\xc7"
+ "\xdf\x1f\x72\x3e\xc6\xdf\xaf\x11\x8f\xf1\xf7\xa7\xa5\xc7\xf8\xfb"
+ "\x30\xe9\x31\xfe\x7e\x34\x1b\x63\x2b\x1e\x5f\xa8\x11\x8f\x71\xb0"
+ "\x05\x8f\x83\x81\xc7\x33\x27\x08\xc7\x38\x18\x78\x1c\x2c\xc0\xe3"
+ "\x60\x07\x79\x5c\xed\xe5\x7c\x8c\xff\x7d\x51\x3c\xc6\xd5\x23\xa5"
+ "\xc7\xf8\xdf\xfb\xa5\xc7\xf8\xdf\xdb\x49\x8c\x83\xad\x78\xfc\xef"
+ "\x70\xb1\x18\xb7\x81\x07\xf4\x80\x18\x7b\xd4\x21\x2a\x1f\xc7\xb6"
+ "\x8a\xc4\xd6\x38\x70\x9c\x3e\x9f\x32\xc5\xe3\x98\x30\x7d\x40\x3f"
+ "\xfb\xf6\x37\xe6\x04\x9e\xa0\x29\x78\xa7\x14\xdc\xef\x5a\x9d\x6d"
+ "\xd8\x80\xfa\xab\x52\x70\xff\xef\x7f\x98\xf1\x01\xaa\x94\xb7\x2e"
+ "\xc2\xfd\x14\xb8\xdf\xcb\x90\x7d\x33\xc4\x08\x25\xfb\x0a\x75\xf1"
+ "\x0c\xed\x3f\x58\x0b\x7e\xb3\x92\x7e\xcd\xd7\xbb\xa2\xae\x10\xe2"
+ "\xf3\x35\x2a\xaf\xfa\x14\x99\x06\x8e\xab\x1f\x65\x40\x01\xf4\xcf"
+ "\x01\xde\x65\x2b\x75\xc8\xf8\x8a\xaf\x7b\x45\x52\x29\xaa\x48\xfa"
+ "\x18\x45\xd6\xd2\xb7\xe9\xff\x06\xb8\xb7\xf9\x84\x69\x8c\x3e\xe3"
+ "\x2a\x8d\xb9\x11\x45\x06\x9f\xb0\x80\x43\xab\x75\x94\x7b\x33\x0a"
+ "\x48\xa8\xa1\xe9\xac\xf9\xc8\x35\xeb\x12\x72\xdb\x3a\x1f\xb9\x6f"
+ "\xbd\x84\x94\x65\x35\x55\xe8\xec\xb5\x52\x74\xb6\xfe\x02\x3a\x7b"
+ "\x1b\x7e\xad\xf0\x33\xc1\x2f\xf5\x02\x60\x8d\x50\xc4\x75\x84\xf7"
+ "\x6e\xd4\x07\x55\x23\xef\x32\x43\x15\xc2\xf3\x5f\x6f\x50\x17\xe3"
+ "\xdc\x63\x90\x37\xfd\x5f\x5f\x44\xbf\xe2\x4b\xc1\x39\x57\x7c\xbc"
+ "\xc2\xa0\x47\x65\x35\xcd\xf8\x7c\x18\x9c\x77\x5d\x5f\x03\xf9\x9b"
+ "\x4a\xf1\xde\x8c\xfa\xb2\xd4\x33\xf0\x7e\x7b\x55\x34\xf6\xd0\x03"
+ "\x03\xb5\x5a\x08\xb5\x89\xf6\x7d\x80\xf0\xe0\x3f\xeb\x76\x99\xa4"
+ "\x62\x7d\x31\x87\x89\xf1\x6b\xbe\x03\x20\xce\x7e\xa6\xd7\xa2\x95"
+ "\x53\x2e\xfc\x40\x97\x37\x54\x31\x7d\x09\xe5\x0d\x5f\xa3\x8a\x8d"
+ "\x26\x14\xb9\x06\xa1\xc9\x46\x84\x70\x2c\x2a\x92\x6a\xd1\x94\x44"
+ "\xe4\x89\xfb\x9f\x4d\x3f\x07\x0c\xa8\xa8\xd1\xa3\x75\x06\x78\xc6"
+ "\x1b\xcd\xed\xcf\x58\xbe\xb1\x1c\xc1\x39\xbf\xf2\x78\x1d\x72\x4f"
+ "\x44\x4a\x1c\x5f\x43\x4e\x60\xd1\x14\x28\x3f\x4b\x1a\x68\x1a\xc7"
+ "\x16\xc7\x14\xc7\x17\xe7\x67\x8e\x79\x45\xac\x1e\xad\x6f\x46\xca"
+ "\x8a\x14\xf8\x9b\x44\xeb\x2b\xd0\x4d\x04\xcf\x98\x44\x7b\xed\x55"
+ "\x01\x2f\x1a\x30\x17\x74\x54\x75\x3a\xe0\x3f\x40\x98\x53\x41\xa3"
+ "\x09\xa7\x7a\xd5\x77\xcc\xa9\xa0\xb1\x1c\xa7\xfe\x73\x99\xe3\x94"
+ "\xee\x94\x38\xa7\x74\x43\x08\xa7\x82\xa2\xba\x27\xa7\x7e\x38\x6e"
+ "\x9f\x53\x3f\x6c\x17\xe7\x54\x50\x38\x3d\x30\x48\xc9\xe7\x94\xee"
+ "\x9c\x74\x4e\xfd\x50\xdb\x75\x9c\x0a\xd2\xc8\xe3\xd4\x0f\x65\x7c"
+ "\x4e\xfd\xa7\xda\x0e\xa7\xd8\x7a\xea\x9e\x4b\x0e\x70\xca\xa2\x9e"
+ "\xfa\xf1\x49\x8e\x53\xff\xf5\x11\xe7\xd4\xa5\x65\x2c\xa7\xba\x69"
+ "\x3d\x75\xc9\xc3\x3e\xa7\x7e\xac\xb3\xc3\x29\xa8\xa7\x82\xac\xea"
+ "\xa9\xff\xfa\x4b\xe7\xd4\xa5\xb1\x5d\xc8\x29\x99\xf5\xd4\x25\x15"
+ "\x9f\x53\x3f\x86\x88\x73\x4a\xcd\xd6\x53\x5e\xdf\x76\xcc\x29\xb5"
+ "\x45\x3d\xf5\xdf\x4c\x8e\x53\x97\x17\x8a\x73\xaa\xe6\x34\xe1\x94"
+ "\xba\x9b\xd6\x53\x35\xf3\xec\x73\xaa\x26\x54\x9c\x53\x6a\xa8\xa7"
+ "\xd4\x56\xf5\xd4\xe5\x35\xd2\x39\x55\xa3\xed\x3a\x4e\xa9\x65\xd6"
+ "\x53\x35\x2b\xf9\x9c\xfa\xef\x46\x3b\x9c\x62\xeb\xa9\xc7\xb7\x38"
+ "\xc0\x29\x8b\x7a\xea\xf2\x8f\x1c\xa7\x7e\x3a\x29\xce\xa9\x9f\x06"
+ "\xb1\x9c\xea\xa6\xf5\xd4\x95\x63\xf6\x39\x75\x25\xc7\x0e\xa7\xa0"
+ "\x9e\x52\x5b\xd5\x53\x3f\x9d\x95\xce\xa9\x2b\x35\x5d\xc8\x29\x99"
+ "\xf5\xd4\x95\x52\x3e\xa7\x2e\x57\x89\x73\x2a\x98\xad\xa7\x66\x4e"
+ "\xe8\x98\x53\xc1\x16\xf5\x54\xed\x18\x8e\x53\xd7\xbc\xc4\x39\x75"
+ "\x75\x31\xe1\x54\x70\x37\xad\xa7\xae\xf6\xb5\xcf\xa9\xda\x5a\x71"
+ "\x4e\x05\x43\x3d\x15\x6c\x55\x4f\x5d\x1b\x26\x9d\x53\x57\x35\x5d"
+ "\xc7\xa9\x60\x99\xf5\xd4\xd5\xc1\x7c\x4e\xd5\xaa\xc5\x38\xd5\x8a"
+ "\x7d\x9f\x0b\x70\x2a\x1e\x7c\x1f\x70\xc8\xb3\x92\x70\xaa\x0d\x38"
+ "\xf5\x9e\x25\xa7\xfe\x6d\xed\xfb\xae\x6d\x36\xb5\x73\xaa\x2e\xd7"
+ "\x9a\x53\x26\xe0\x54\x1b\xc3\xa9\x9f\x0f\x99\x7d\x5f\x45\xdd\x1e"
+ "\xc0\xea\x1a\xaa\x88\x02\x3e\x6d\x63\xf9\xf4\x6f\xe0\x13\xbc\x8f"
+ "\x09\xde\xb7\xac\xba\x0a\x45\xea\xc9\x7b\xb5\xc2\xfb\x9a\x2c\xb9"
+ "\xd4\x5a\x4b\x61\x0e\x61\xee\x98\x79\x74\x76\x09\xf0\x67\xf9\x39"
+ "\x74\x76\x35\xfc\xd6\xc2\x2f\x05\x7e\xe8\x1c\x2a\x03\xc5\x8b\xfb"
+ "\xec\x39\xfe\x54\xb2\xfc\xf9\x79\x92\x7d\xfe\xfc\x1c\x20\xcd\xe3"
+ "\xd5\xed\x93\xce\x9f\x9f\x93\xd8\xb1\x74\xca\xc8\xa9\x3f\xd0\x78"
+ "\x0c\x2c\xe1\xc8\x35\x14\x69\x40\x9e\xf4\xcc\x80\x01\xee\xd1\x48"
+ "\xf9\x86\x11\x51\x99\xf3\x91\x32\xf3\x7b\x78\x5f\x73\xd9\xb9\x84"
+ "\xdc\xbf\x6e\xfe\x14\x95\xd5\x57\xa1\xb2\xdb\x67\x50\x99\x09\x7e"
+ "\xd7\xe0\x07\xcf\x18\x19\x67\xf9\xbe\x7a\xf6\x7d\xeb\x9e\x84\xbc"
+ "\x86\x8b\xbf\x6f\x9d\x2f\xf3\xbe\xb1\xf0\xbe\xad\xdc\xfb\x56\x00"
+ "\x17\x01\x17\x3f\x13\xeb\x13\x23\xf5\xa8\xef\x52\x03\x4d\xb7\xb2"
+ "\x1c\xc4\xb8\x7c\x7d\xbe\x19\x45\x26\x02\x56\xaf\x00\x07\x6b\xf6"
+ "\xa3\xf5\xc9\xc0\xc1\xd6\x66\xfc\x5d\x5f\x5f\x91\xda\x02\x1c\xfc"
+ "\x79\x16\x0d\x71\x6b\xc3\x1c\xfc\x37\xe6\xe0\xb5\x54\x93\x28\x07"
+ "\xc1\x27\x32\x1c\x04\x9f\xd8\x21\x07\x2d\x7d\xe2\x75\x0f\x8e\x83"
+ "\xbf\x0c\x12\xe7\xe0\x8d\x47\xcc\x3e\xf1\xd7\xe7\xe0\xf5\xb3\xf6"
+ "\x39\x78\xfd\xa0\x34\x4f\xf8\xcb\x48\xe9\x1c\xbc\x6e\xe8\x3a\x0e"
+ "\xde\x38\x69\x9f\x83\x37\xf2\x3a\xe6\x60\x90\x46\x1e\x07\xaf\xeb"
+ "\xf8\x1c\xbc\xee\x6a\x87\x83\x6c\x3d\x08\xbe\xb2\x63\x0e\x5a\xd4"
+ "\x83\xbf\x64\x73\x1c\xbc\x99\x2f\xce\x41\xfd\x31\xb3\xaf\xfc\xf5"
+ "\x39\xa8\x9f\x6a\x9f\x83\xfa\x10\x69\x1e\xf2\xe6\x21\xe9\x1c\xd4"
+ "\xa7\x76\x1d\x07\x6f\x8e\xb7\xcf\xc1\x9b\x2a\x07\x38\x28\xb3\x1e"
+ "\xd4\xc7\xf2\x39\xf8\x4b\xba\x38\x07\xd5\x6c\x3d\x08\x3e\xb4\x43"
+ "\x0e\x5a\xfa\xd0\x7a\x1f\x8e\x83\x0d\xc3\xc4\x39\x78\xeb\x49\xb3"
+ "\x0f\xfd\xf5\x39\x58\xff\x9d\x7d\x0e\xd6\x1f\x95\xe6\x39\x1b\x1e"
+ "\x91\xce\xc1\x5b\xae\x5d\xc7\xc1\x5b\xa7\xed\x73\xf0\x56\x41\xc7"
+ "\x1c\x54\xcb\xac\x07\xeb\x6b\xf9\x1c\xac\x77\xb7\xc3\x41\xb6\x1e"
+ "\x04\xdf\xda\x31\x07\x2d\xea\xc1\x86\x1d\x1c\x07\x6f\xef\x13\xe7"
+ "\x60\xe3\x49\xb3\x6f\xfd\xf5\x39\xd8\x38\xdd\x3e\x07\x1b\x35\xd2"
+ "\x3c\xea\xed\x63\xd2\x39\xd8\x98\xde\x75\x1c\xbc\x3d\xc9\x3e\x07"
+ "\x6f\x07\x38\xc0\x41\x99\xf5\x60\x63\x02\x9f\x83\x0d\x5a\x71\x0e"
+ "\x06\xb3\xf5\x20\xf8\xdc\x0e\x39\x68\xe9\x73\x9b\x86\x70\x1c\x6c"
+ "\x19\x29\xce\xc1\xe6\xf1\x66\x9f\xfb\xeb\x73\xb0\xe9\xa2\x7d\x0e"
+ "\x36\x9d\x90\xe6\x69\x5b\x9e\x94\xce\xc1\x66\xf7\xae\xe3\x60\xf3"
+ "\x59\xfb\x1c\x6c\x3e\xd8\x31\x07\x83\x65\xd6\x83\x4d\x7a\x3e\x07"
+ "\x9b\xbc\xc5\x38\x68\x02\x5f\xdc\x56\x30\x58\x6b\xca\x09\xd3\x78"
+ "\xba\xa8\x90\xc1\x7b\x14\xaa\x58\xd9\x80\xa6\x34\x42\x7c\x12\x1b"
+ "\xd1\x9c\x46\x25\x32\xe6\x84\x05\x80\x2f\x2c\xb2\xf0\xcf\xcc\xd8"
+ "\x32\x83\x76\xaf\x6a\xeb\x12\xe4\x0a\xfe\x1b\xfb\x99\x90\x8a\x2b"
+ "\xcd\x08\xdf\x7f\x1d\x7e\x9e\x6b\xdc\xf3\xe0\x7e\x02\xfa\x97\x00"
+ "\x25\xf3\x8d\xb9\x55\x87\x6a\xc6\x22\x45\x59\x8d\x0e\xe2\xb0\x96"
+ "\xc1\x17\xc7\xe5\x0a\xd5\xea\xbe\xfb\x06\x72\x35\xfc\xd7\xd7\x0f"
+ "\xe2\xed\xed\xf1\x3a\x72\x19\x5c\x43\x9b\x70\x5c\x71\xbc\x70\x8c"
+ "\x55\x6b\xf1\xb7\xeb\xd6\xd9\xe5\xc0\x31\xc3\x7f\x03\xfc\x76\x41"
+ "\x3a\x61\xbf\xda\x1a\x27\x9d\x1b\xad\xec\x7c\xd8\x56\xd7\xb2\x6a"
+ "\x24\xf8\xed\xd8\x04\xfe\xcd\xb1\x58\x05\x69\x2c\x7c\xde\x1d\x88"
+ "\x55\x9b\xc6\xb1\x58\xb5\x6d\xe6\xc7\x4a\xc8\x57\xb5\x65\x4b\x8f"
+ "\x55\x1b\xbb\x4e\x64\x5b\x88\x9d\x58\x39\xc8\xab\xa0\x22\x0b\x3f"
+ "\x72\x07\x62\x65\x88\x75\x2c\x56\x86\x63\x56\xb1\x12\xd0\xff\x86"
+ "\x93\xd2\x63\x65\x48\x25\xb1\x32\xcc\x12\x8f\x95\xda\x41\x5e\xa9"
+ "\x35\x16\xba\xf9\x0e\xc4\xca\xa8\x75\x2c\x56\xc6\x1f\xf9\xb1\x12"
+ "\xd2\xa9\xc6\xab\xd2\x63\x65\x3c\x48\x62\x65\x4c\xb7\x13\x2b\x07"
+ "\x79\xa5\x2e\xb2\xd0\x77\x77\x20\x56\xa6\x13\x8e\xc5\x8a\xf6\xb0"
+ "\x8a\x95\x80\x9e\xa2\x7d\xa4\xc7\xca\x54\x45\x62\x65\x3a\x2a\x1e"
+ "\xab\x60\x07\x79\x15\xac\xb1\xd0\x21\x77\x20\x56\x74\xad\x43\xb1"
+ "\x52\xa0\x27\xf9\xb1\x12\x68\xf7\x15\x68\xbc\xe4\x58\x29\x90\x2b"
+ "\x89\x15\xad\x13\x8b\x95\x31\x27\xf0\xa8\x27\xc4\xa0\x65\x5b\xa0"
+ "\xd6\x33\x09\x51\xad\xc3\x21\x6e\xde\x10\xb7\x34\x15\x6a\xcb\x81"
+ "\xb8\xe9\x0d\x68\xca\xb2\x1f\xe8\xf2\x3a\x23\x6a\x85\x98\xb5\x78"
+ "\x07\x16\x55\xe8\x6b\xf1\x98\xa3\xa7\x2e\x29\xa8\x61\x33\x97\x29"
+ "\x11\x8e\x1b\x8e\x03\x8e\x1d\x0d\x71\x63\xe2\xe8\x1d\x51\x64\xf4"
+ "\x1e\x57\x19\x71\xfd\x07\x7a\xa9\x8e\xa6\xf1\xfb\xd2\xca\x9b\x21"
+ "\xf8\xbb\x40\x64\x2d\xea\xab\x7a\x01\xbf\x93\xcb\x39\x7c\xbc\x42"
+ "\x5f\x05\xfa\xa0\x1e\x31\xda\xec\x87\x00\x6f\xe3\x9f\x02\xdc\x8d"
+ "\x15\xd1\xcf\xd3\x03\xea\xa3\x0c\x03\x9f\x52\xad\xbf\x8e\x7a\x63"
+ "\xfd\x90\x65\x42\xbe\xeb\x16\x23\xea\xf0\xa2\x62\x8a\x99\xbb\xb6"
+ "\x9c\xc9\x23\x1f\xe2\xe2\x4b\xdf\xb2\x18\xd3\x7d\x2b\x1e\x55\x5c"
+ "\xd1\x32\xb8\x59\x6b\x04\x06\xb7\x7f\x05\x28\x41\x67\x86\xd0\xde"
+ "\x81\xa5\xda\x72\xa4\xa2\xdb\x20\xc6\x78\x3e\x91\x82\xda\xbc\xbb"
+ "\x55\x6a\x8c\x5d\x98\xf1\xdf\x26\x15\x3b\x7e\x0b\xe2\x84\xef\xcf"
+ "\x8c\xdf\x4a\xb4\x18\xbf\x05\xcf\xdc\x3e\x7e\x4b\xe1\xa2\xc6\xe3"
+ "\xb7\x4c\x3f\xf8\xfa\x99\xdf\x7d\x69\x02\x4d\xc3\xbb\x0f\x28\x6f"
+ "\xd0\x23\xfc\xfe\xe5\x0d\xc5\x68\xfd\x4a\xa4\x2c\x6f\xad\x45\x29"
+ "\x0d\xb4\xbe\x3c\xf5\x2a\x8a\x6c\xc4\x3a\x18\xf3\x85\x62\xfa\x42"
+ "\x01\xdf\x3a\xd3\x0f\x01\x7e\x3a\x05\xa5\x2c\xaf\x44\xc8\x62\x1e"
+ "\x4f\x3c\x68\x66\x37\xc0\x21\xbe\x22\xf5\x12\xa2\x07\x3e\x1d\x55"
+ "\x61\xf8\x1e\xe3\x14\x0f\xe7\xc7\xb6\xeb\xeb\x81\x4f\xbf\x80\x8f"
+ "\x61\xcc\xf0\xf7\x26\xbc\x3e\xc0\x6e\x0b\xfd\x8d\x79\xe1\x99\x94"
+ "\x8a\x2a\x92\x5a\x51\xb9\x01\x21\xb8\xdf\xf6\x6f\xa2\xab\x44\x78"
+ "\x14\x34\x9a\xf0\x28\x48\xe9\x99\xd4\xab\xbe\x63\x1e\x05\x69\x38"
+ "\x1e\xb9\x2e\x74\x8e\x47\xae\x83\x9c\xe7\x91\xe2\xb2\x7c\x1e\x05"
+ "\x85\xf3\x79\xe4\x7a\x4e\x3a\x8f\x14\x85\xd2\x79\xa4\x58\xe9\x1c"
+ "\x8f\x5c\xe7\x11\x1e\x29\x46\x13\x1e\xb9\x46\x73\x3c\x62\xe6\x46"
+ "\xdd\x21\x1e\x51\x3a\x3b\x3c\x62\xeb\xa3\x20\xa8\x8f\xee\xb9\xe4"
+ "\x00\x8f\x2c\xea\xa3\xde\x47\x9c\xe3\x51\xef\x79\xce\xf3\xa8\x77"
+ "\xb0\x13\x3c\xb2\xaa\x8f\xfa\x0c\x92\xce\xa3\x5e\xcd\xd2\x79\xd4"
+ "\xeb\x84\x73\x3c\xea\x7d\x80\xf0\xa8\x57\x32\xe1\x51\xef\x3d\x1c"
+ "\x8f\x98\xf9\x66\x77\x88\x47\xbd\x02\xc4\x79\xa4\x66\xeb\x23\x35"
+ "\xd4\x47\x5e\xdf\x76\xcc\x23\xb5\x45\x7d\xe4\xd6\xe2\x1c\x8f\xdc"
+ "\x0e\x38\xcf\x23\xb7\x55\xf2\x79\xa4\xb6\xaa\x8f\xfa\xce\x93\xce"
+ "\x23\xb7\x50\xe9\x3c\x72\x73\x75\x8e\x47\x6e\x37\x09\x8f\xfa\x94"
+ "\x10\x1e\xb9\xd5\x72\x3c\x62\xe6\xf0\xdd\x21\x1e\xf5\x49\xb4\xc3"
+ "\x23\xb6\x3e\x52\x43\x7d\xf4\xf8\x16\x07\x78\x64\x51\x1f\xdd\x33"
+ "\xde\x39\x1e\xf5\xbb\xe9\x3c\x8f\xfa\x9d\x74\x82\x47\x56\xf5\xd1"
+ "\x3d\x07\xa4\xf3\xa8\x5f\xba\x74\x1e\xf5\x9b\xec\x1c\x8f\xee\x79"
+ "\x92\xf0\xa8\x9f\x3b\xe1\xd1\x3d\x21\x1c\x8f\x98\x79\x91\x77\x88"
+ "\x47\x7d\x8b\xc4\x79\x14\xcc\xd6\x47\xc1\x50\x1f\xcd\x9c\xd0\x31"
+ "\x8f\x82\x2d\xea\x23\x8f\xcd\xce\xf1\xc8\xe3\x49\xe7\x79\xe4\xd1"
+ "\x4b\x3e\x8f\x82\xad\xea\x23\x8f\x9b\xd2\x79\xe4\x5e\x29\x9d\x47"
+ "\xee\x39\xce\xf1\xc8\x23\x8d\xf0\xc8\x7d\x1a\xe1\x91\x47\x12\xc7"
+ "\x23\x66\xae\xe9\x1d\xe2\x91\x3b\x12\xe3\x11\x5e\x8b\xe0\x5d\xb2"
+ "\x2e\x44\xc3\xd6\xb5\x48\xb3\x1b\xff\x6d\x45\x21\x4d\x59\xfd\x03"
+ "\x4e\x25\x93\xf5\x00\x74\x8a\xfe\x4c\x7f\xaf\xd0\xf5\xf7\x1c\x00"
+ "\x5c\xbc\x03\x0b\x23\x2f\x92\x35\x1a\xf0\xba\x20\xb7\xd6\xc7\xa3"
+ "\x51\x78\x5d\x06\x85\x67\x0c\x5e\xc7\xaa\x7d\xed\x00\x6f\x91\xb5"
+ "\x03\x66\x88\xaf\x1d\xd0\xba\xcd\x3c\xef\x76\x3f\x37\xef\x56\xe1"
+ "\x19\x6c\x77\xde\xad\xc2\xd3\x27\x7f\x86\x54\x3e\xf4\xd7\xe1\x77"
+ "\xbc\x35\x30\x50\xdb\x94\xe5\x39\x1c\xb0\x31\x90\x77\xf7\xdc\x83"
+ "\x1c\x9a\x8f\xbb\xdf\x82\x27\xfd\x2b\x5f\x9a\x85\x52\xe9\x2d\xe5"
+ "\xc3\x69\x9f\xc0\x42\x3a\x37\xb0\x58\xda\xb3\x40\xce\x76\xe3\x1d"
+ "\x14\x22\x1c\x6f\x65\x25\x89\x37\xbb\x6e\x81\xb7\xc8\xba\x05\x33"
+ "\xc4\xd7\x2d\x10\x8e\xb7\xd2\xfe\x3c\x67\x85\x72\x93\xf4\x78\x2b"
+ "\xa3\x48\xbc\x83\x94\x4d\x59\xca\x1c\x2e\xde\x5e\x4a\xe9\xf1\x56"
+ "\x86\x92\x78\x57\xf8\xd2\x3e\x41\x21\x74\x6e\x50\xa8\xc4\x67\xa9"
+ "\xee\x20\xde\x22\xfc\x1e\x10\xca\xc6\x9b\xe5\xb7\xc8\x9a\x09\x33"
+ "\xc4\xd7\x4c\x10\x8e\xf7\x00\x0f\xfb\xf1\xf6\x6a\x94\x1e\x6f\xaf"
+ "\x62\x36\xde\xc0\xef\x01\xae\x5c\xbc\x07\xa4\x4a\x8f\xb7\x57\x21"
+ "\x89\x77\xa5\x3b\xc4\x1b\xf8\x1d\x24\x91\xdf\x03\x26\xdb\x8f\xb7"
+ "\x5a\x84\xdf\xf7\x16\x92\x78\xb3\xeb\x35\x78\x8b\xac\xd7\x30\x43"
+ "\x7c\xbd\x06\xe1\x78\xdf\xbb\xce\x7e\xbc\xef\x8d\x93\x1e\xef\x7b"
+ "\x43\x48\xbc\xd5\xc0\xef\x7b\x57\x72\xf1\xbe\x57\x2f\x3d\xde\xf7"
+ "\xaa\x48\xbc\xcf\x21\xda\x47\x0d\xfc\x56\x4b\xe4\xf7\xbd\x27\x3a"
+ "\x88\xb7\x08\xbf\x7d\x54\x6c\xbc\x59\x7e\x8b\xac\x15\x31\x43\x7c"
+ "\xad\x08\xe1\x78\x7b\x5f\xb7\x1f\x6f\xef\xef\xa4\xc7\xdb\x7b\x0f"
+ "\x1b\x6f\xe0\xb7\x77\x0d\x17\x6f\x9f\x18\xe9\xf1\xf6\xd6\xb2\xf1"
+ "\x6e\x80\x78\x03\xbf\xd5\x12\xf9\xed\xa3\xb6\x1f\xef\x60\x11\x7e"
+ "\x0f\xd4\x92\x78\xb3\xeb\x54\x78\x8b\xac\x53\x31\x43\x7c\x9d\x0a"
+ "\xe1\x78\x0f\x9c\x6d\x3f\xde\x03\x27\x4a\x8f\xf7\x40\x25\x89\x77"
+ "\x30\xf0\x7b\xe0\x34\x2e\xde\x03\x2b\xa5\xc7\x7b\x20\x22\xf1\xfe"
+ "\xb6\x96\xf6\x09\x06\x7e\x07\x4b\xe4\xf7\xc0\x3c\xb1\x78\x7b\x42"
+ "\xbc\x4f\x83\x8e\x01\xdd\x51\x64\xca\x01\x9d\x62\xe4\xc7\xbd\x22"
+ "\x49\x83\x1e\xbe\x8d\x63\xef\x9b\x0c\x6d\x75\x51\x97\xad\x97\xa1"
+ "\xf0\x8d\x73\x7a\xee\xb0\xc2\xf7\x11\xd1\xb9\xc3\x0a\xdf\x41\x92"
+ "\xe7\x0e\x2b\x7e\x57\xc3\x69\x20\xdf\x00\x0e\x53\x5f\xa6\xfe\x90"
+ "\x34\xa7\x58\xf1\xbb\xf3\x82\xeb\x68\x28\x7e\xb7\x11\xcf\x29\xa6"
+ "\xb7\xfc\x6f\xb5\x29\x57\x8e\x36\xf2\x4d\xef\x18\xeb\x20\x8d\x29"
+ "\x07\x34\x92\x28\xd6\x7e\xf1\xd0\x6e\x69\xba\x6c\xdd\x0e\x85\xdf"
+ "\x54\xe7\xb1\xf6\x1b\x22\x8e\xb5\x5f\x2f\xe9\x58\x0f\xaa\xe4\xf4"
+ "\x97\x9f\x37\x87\xb5\x9f\xf4\xf9\xe3\x8a\x41\xc5\x82\xeb\x79\x28"
+ "\x06\x25\x12\xac\xbf\x0b\x35\xe5\xca\xd1\x65\x7e\x2b\x1d\xc0\x1a"
+ "\xca\x75\x90\x9d\x72\x3d\x78\x1a\x60\x5d\xd4\x65\xeb\x87\x28\x06"
+ "\x8f\x73\x1e\xeb\xc1\x7d\xc5\xb1\xbe\xef\xa6\x74\xac\xef\x3b\xc1"
+ "\x69\xbf\xc1\x88\xc3\x7a\x70\x8e\x74\xac\xef\x3b\x28\xb8\xae\x88"
+ "\xe2\xbe\x59\x04\xeb\x7f\x16\x00\xd6\x32\x34\xe1\xe0\x98\x8e\xb1"
+ "\x56\x43\xb9\x56\xdb\x29\xd7\x43\x43\xa1\xbd\xd6\x74\xd9\x3a\x26"
+ "\x8a\xa1\x23\x9d\xc7\x7a\x48\xa3\x38\xd6\x43\x2e\x4a\xc7\x7a\xc8"
+ "\x7e\x4e\x77\x0e\xa9\xe3\xb0\x1e\x9a\x2a\x1d\xeb\x21\xdb\x05\xd7"
+ "\x37\x51\x0c\x09\x27\x58\x57\xb9\x99\x72\xe5\xe8\xd1\xa1\xa2\xfa"
+ "\xdf\x02\x6b\x28\xd7\x6a\x3b\xe5\x5a\xa5\x06\xac\x8b\xba\x6c\x3d"
+ "\x15\x85\xca\xc7\x79\xac\xef\xff\x51\x1c\xeb\xfb\xcf\x48\xc7\xfa"
+ "\xfe\x1c\x4e\xf3\xde\x5f\xc5\x61\xad\x4a\x90\x8e\xf5\xfd\x1b\x05"
+ "\xd7\x59\x51\xdc\x3f\x9a\x60\x7d\x21\x01\xb0\x96\xa1\x85\x55\x9a"
+ "\x8e\xb1\x0e\x86\x72\x1d\x6c\xa7\x5c\x3f\x00\xbe\x3e\x58\xd3\x65"
+ "\xeb\xba\x28\x1e\x70\x71\x1e\xeb\x61\x67\xc5\xb1\x1e\x76\x4c\x3a"
+ "\xd6\xc3\x52\x39\xbd\x3d\xac\x84\xc3\xfa\x81\x68\xe9\x58\x0f\x4b"
+ "\x14\x5c\xef\x45\x31\x4c\x45\xb0\xfe\xbe\xd2\x94\x2b\x47\x87\x3f"
+ "\x20\xba\xff\x81\x3d\x1d\xbe\x22\x1f\xb9\xf1\xf1\x1e\xee\xd6\xb5"
+ "\x5a\xfc\xc1\x9b\xce\xe3\xfd\xe0\x49\x71\xbc\x1f\xdc\x27\x1d\xef"
+ "\x07\x13\x39\x2d\xfe\xe0\x51\x0e\xef\xe1\xe1\xd2\xf1\x7e\x30\x46"
+ "\x58\x8b\x3f\xa8\x74\x4e\x8b\x0f\xf7\x96\xa3\xc5\x6d\xf1\xf6\x6f"
+ "\xee\x5a\x3d\xee\xff\xa3\xf3\x78\xfb\x1f\x12\xc7\xdb\x3f\x57\x3a"
+ "\xde\xfe\x31\x9c\x1e\xf7\x2f\xe0\xf0\x7e\x48\x23\x1d\x6f\xff\x28"
+ "\x61\x3d\xee\x8f\x9c\xd3\xe3\x0f\xb9\xca\xd1\xe3\xb6\x78\x8f\xa8"
+ "\xed\x5a\x4d\x3e\xe2\x9c\xf3\x78\x8f\xc8\x17\xc7\x7b\xc4\x26\xe9"
+ "\x78\x8f\x88\xe2\x34\xf9\x08\x8b\xfe\xef\x80\x00\xe9\x78\x8f\x08"
+ "\x15\xd6\xe4\x0f\xe9\x9d\xd3\xe4\x23\x1a\xe4\x68\x72\x5b\xbc\x47"
+ "\x56\x75\xad\x2e\x1f\x79\xca\x79\xbc\x47\x66\x8a\xe3\x3d\x72\x95"
+ "\x74\xbc\x47\x86\x72\xba\x7c\xe4\x46\x0e\xef\x40\xe9\xeb\x67\x2a"
+ "\x46\x86\x08\xeb\xf2\x00\x9d\x73\xba\x7c\x64\x8d\x1c\x5d\x6e\x8b"
+ "\x77\x50\x69\xd7\x6a\xf3\xa0\x23\xce\xe3\x1d\xb4\x4e\x1c\xef\xa0"
+ "\x38\xe9\x78\x07\x85\x70\xda\x3c\xc8\xa2\xff\x5f\xed\x26\x1d\xef"
+ "\x20\x95\xb0\x36\x0f\xac\x74\x4e\x9b\x07\x9d\x97\xa3\xcd\x6d\xf1"
+ "\x0e\x2e\xea\x5a\x7d\x1e\xbc\xd7\x79\xbc\x83\x17\x8b\xe3\x1d\xfc"
+ "\x92\x74\xbc\x83\x55\x9c\x3e\x0f\x8e\xe5\xf0\x0e\x6e\x96\x8e\x77"
+ "\xb0\x52\x58\x9f\xab\x8b\x9d\xd3\xe7\xc1\x25\xce\xf7\x93\x87\xe4"
+ "\x60\x6d\x2e\x75\xfd\xc7\x8a\x95\xec\x9c\x3b\xc5\xc3\xdc\xfa\x8f"
+ "\x8a\x90\x4d\x48\x6c\x6d\x19\xc5\xa8\x1f\xbb\xf5\xfa\x8f\x8a\x51"
+ "\xf6\xd7\x7f\x54\x8c\x92\xb6\xfe\xa3\x62\xd4\x19\xe9\xe3\xf1\x47"
+ "\xe5\x70\x1e\x61\x94\x85\xff\x0f\x21\x7b\x14\x77\xe7\x75\x21\x15"
+ "\xa3\xf8\xeb\x42\x2a\x1e\x66\xd6\x85\xa4\xb7\x54\x8f\x96\xe7\x45"
+ "\x42\xf6\x38\xff\x5d\xe0\xb1\x44\xec\x43\xa4\xae\x43\xc9\x71\xfb"
+ "\x91\xc5\x1c\xb7\x1f\x9b\x27\xce\xed\x47\x4f\x76\xeb\x75\x28\x15"
+ "\x8f\x8e\xb7\xcf\xed\x47\x55\x92\xd6\x1c\x51\x3c\x2a\x7d\xdd\x1b"
+ "\xc5\xa3\x89\x9c\x1f\x7a\xd4\xc2\xff\x3e\x56\xd8\x75\xdc\x96\xb9"
+ "\x3e\xa5\xe2\xd1\x69\x7c\x6e\x3f\x12\x4b\xb8\xfd\x9f\x74\x79\xbe"
+ "\xeb\xb1\x64\xe7\xbf\x83\x3c\x3e\x19\x7b\x2e\xa9\xeb\x61\x72\xdc"
+ "\x1e\x3d\x89\xe3\xf6\xe3\xe3\xc4\xb9\x3d\x66\x47\xb7\x5e\x0f\x53"
+ "\x31\x66\x88\x7d\x6e\x8f\x36\x48\x5a\xcb\x44\x31\x26\x4d\x3a\xb7"
+ "\xc7\x4c\xe6\xbc\xdf\x18\x2d\xc7\xed\xc7\x33\xba\x90\xdb\x32\xeb"
+ "\xed\x31\x21\x7c\x6e\x8f\x0e\x25\xdc\xd6\x55\xcb\xf3\x98\x8f\x47"
+ "\x3b\xff\xdd\xe7\xc9\x00\xec\x2f\xa5\xae\xcb\xc9\x71\xfb\x09\x7f"
+ "\x8e\xdb\x4f\xda\xac\x0b\xc5\x71\x5b\xb3\xaa\x5b\xaf\xcb\xa9\x78"
+ "\xa2\xc5\x3e\xb7\x9f\xa8\x92\xb4\x46\x8a\x42\x33\x5b\x3a\xb7\x35"
+ "\x01\x9c\xcf\xd5\x24\x70\xdc\x7e\x32\xbe\xeb\xb8\x2d\x73\xbd\x4e"
+ "\x85\xc6\x9d\xcf\xed\x27\x06\x13\x6e\xff\x37\x44\x9e\x9f\x7e\x72"
+ "\xb4\xf3\xdf\xb9\xc6\xba\x62\x2f\x2d\x75\x7d\x50\x8e\xdb\xbf\x77"
+ "\xe1\xb8\xfd\x54\xa3\x38\xb7\x9f\x9a\xda\xad\xd7\x07\x55\xfc\xde"
+ "\xfe\xfa\x3f\x8a\xdf\xdb\x5b\xff\xc7\x76\xae\xb0\xe2\x29\xe9\xeb"
+ "\x5e\x28\x9e\x72\xe5\x3c\xfd\x53\xe1\x1c\xb7\xc7\x86\x75\x21\xb7"
+ "\x65\xd6\xdb\xbf\xaf\xe5\x73\xfb\xc9\x66\xc2\xed\xcb\x1b\xe5\xf5"
+ "\x1d\x8c\x55\x3a\xff\x5d\xef\x69\x1d\xee\x37\x90\xba\x4e\x29\xc7"
+ "\xed\xb1\x17\x39\x6e\x3f\x7d\x4e\x9c\xdb\x4f\x07\x77\xeb\x75\x4a"
+ "\x15\xe3\x8e\xd8\xe7\xf6\x38\xad\xa4\x35\x5d\x14\x4f\x4b\x9f\x07"
+ "\xaf\x18\xa7\xe3\xfa\x2f\x9e\xb6\x18\xff\xfe\x8c\xaa\xeb\xb8\x2d"
+ "\x73\xfd\x52\xc5\xb8\x12\x3e\xb7\xc7\x9e\x27\xdc\xfe\xa9\x4a\x5e"
+ "\x3f\xc9\xd3\x75\xce\xf7\x93\x8c\xaf\x63\xbe\x61\x4a\x5c\x2f\x95"
+ "\xe3\xf6\x33\xc7\xdb\xd7\x26\x52\x8c\xbf\x68\xcd\xed\xf6\xb5\x89"
+ "\x14\xa1\x8d\xdd\x66\xbd\x54\x45\xe8\x1a\xfb\x3c\x0e\x8d\x96\xd6"
+ "\x27\x12\x7a\x51\x3a\x8f\x43\xf7\x73\x7d\x22\xa1\x16\xe3\x5f\x26"
+ "\x98\xf7\x24\xbf\xf3\x6b\x16\x29\xc6\xa7\xd9\x5d\xb3\x48\x31\x3e"
+ "\xe6\x8e\xad\xa3\xaa\x08\xcd\xe0\xad\x59\xa4\x78\xa6\xd0\xc4\x94"
+ "\x85\x6b\x6a\x79\xfd\x2a\xe3\x9b\x9d\xef\x57\x09\x23\xdf\x77\x25"
+ "\xae\xdb\xca\x95\x85\x09\xa7\xb9\xb2\x10\x76\x55\xbc\x2c\x84\xb9"
+ "\x74\x9b\x75\x5b\x15\xcf\x6e\xb2\x5f\x16\x9e\x8d\x95\xd6\x87\xf2"
+ "\xac\xf4\x75\x60\x14\xcf\x1e\xe5\xfa\x50\x9e\x6d\xe6\xca\xc2\x44"
+ "\x4d\xd7\x95\x85\xb0\x4c\xfb\x65\x21\x2c\xe1\x8e\xad\xe7\xaa\x78"
+ "\x76\x3b\xbf\x2c\x4c\x38\x41\xca\x42\x5d\xa1\xbc\x7e\x98\x89\xb2"
+ "\xbe\x7f\xf3\xcb\x42\xb8\x2b\xf3\xed\x5b\xe2\xfa\xb1\x5c\x59\x98"
+ "\x78\x8e\x2b\x0b\xcf\xdb\xe8\x79\xae\x2c\x3c\xef\xd1\x6d\xd6\x8f"
+ "\x55\x3c\x97\x6d\xbf\x2c\x3c\x97\x28\xad\xcf\xe5\xb9\x46\xe9\x65"
+ "\xe1\x39\x8b\xf9\x4f\xcf\x5b\xcc\x7f\x0a\x0f\xeb\xba\xb2\xf0\xfc"
+ "\x0e\xfb\x65\xe1\xf9\xa4\x3b\xb6\xae\xac\xe2\xb9\x02\x7e\x59\x98"
+ "\x58\x4a\xca\xc2\x2f\xa3\xe5\xf5\xdb\x84\x3b\xa0\xff\x3b\xea\xb7"
+ "\xf9\xa3\x92\x19\x17\x20\x71\x1d\x5b\xae\x2c\x84\x5f\xe4\xca\xc2"
+ "\x1f\x5d\xc4\xcb\xc2\x1f\x06\x75\x9b\x75\x6c\x15\x93\xf2\xed\x97"
+ "\x85\x49\xc9\xd2\xfa\x68\xfe\xe0\x22\xbd\x2c\x4c\x2a\xe3\xfa\x68"
+ "\xfe\xa0\xe4\xca\xc2\x1f\xa3\xba\xae\x2c\xfc\x61\x9f\xfd\xb2\xf0"
+ "\x87\x8d\x77\x6c\x7d\x5b\xc5\xa4\x42\x7e\x59\x08\x3f\x4f\xca\xc2"
+ "\xcd\x22\x79\xfd\x3c\x7f\x1c\xec\x7c\x3f\xcf\x94\xc1\xcc\x98\x09"
+ "\x89\xeb\xe9\x72\x65\xe1\x8f\x57\xb9\xb2\x30\xc5\x43\xbc\x2c\x44"
+ "\xf8\x77\x9b\xf5\x74\x15\x93\x0f\xd8\x2f\x0b\x93\xd3\xa5\xf5\xe9"
+ "\x44\x78\x48\x2f\x0b\x93\xab\xb8\x3e\x9d\x88\xc1\x5c\x59\x98\x32"
+ "\xab\xeb\xca\x42\xc4\x11\xfb\x65\x21\x42\x7b\xc7\xd6\xd9\x55\x4c"
+ "\x3e\xc1\x2f\x0b\x7f\xd4\x91\xb2\xd0\x30\x56\x5e\xbf\xd0\x94\x00"
+ "\xe7\xfb\x85\xa6\x06\x30\xe3\x49\x24\xae\xeb\xcb\x95\x85\x29\x8d"
+ "\x5c\x59\x98\x2a\xbe\xcf\x83\x22\xea\x91\x6e\xb3\xae\xaf\x22\xd2"
+ "\xfe\xfe\x47\x8a\x48\x3b\xfb\x1f\x09\xf5\x01\x45\x0d\x92\x5e\x16"
+ "\x22\x6b\xb8\x3e\xa0\x28\x8b\xf9\x7f\x53\xe3\xbb\xae\x2c\x44\xd9"
+ "\xdf\xff\x41\x11\xe5\xc0\xfe\x0f\x32\xd7\xfb\x55\x44\x96\xf2\xcb"
+ "\xc2\x94\x3a\x52\x16\x6e\x17\xcb\xeb\x47\x9a\xda\x61\xff\x3f\xf6"
+ "\xf9\x6d\xde\xb6\xfd\x48\x65\x35\x1a\x14\x34\x03\x97\x85\x17\xaa"
+ "\x0d\xb9\x81\x45\x78\x7d\x61\xe3\x70\x76\x0d\xca\x34\x76\x8d\x97"
+ "\x06\x03\x59\x83\x52\x6f\x6c\x5f\x83\x92\xac\xfd\x81\x28\x3c\x17"
+ "\x18\xcf\x09\x36\x28\xc9\xfa\x93\x34\x1e\x13\x85\xc7\x48\x5d\x2a"
+ "\x65\xd6\x57\x49\x36\xc0\xbb\x5f\xe9\x60\xfd\xc9\x18\x1d\x2a\x8b"
+ "\x59\x8b\x0c\x5e\x7b\x55\x64\x9e\xf0\x0b\x09\xcc\xfa\x93\x73\x7d"
+ "\xfd\xb2\xfe\x83\xbc\x3d\xf1\xfa\x93\x31\xb4\x69\xbd\x8e\xd6\x97"
+ "\x37\x23\x48\x0b\xf1\x9d\x67\x5e\x83\xf2\x85\xef\xf0\xbb\x1b\xe6"
+ "\x06\xf8\xed\xfa\x8f\xc8\xfa\xc2\x8a\x17\xa4\xaf\x03\xab\x78\x21"
+ "\x9d\xeb\xdf\x79\xa1\x8c\xe3\xe8\x8b\x4c\x1b\x0c\xe7\x63\xcb\xa2"
+ "\xa1\x8e\xd9\xd2\x12\xd6\x26\x6b\xed\x8d\x17\x6a\x3b\xc6\x8c\x19"
+ "\x23\x62\x53\x7f\x71\x98\x4d\xd3\x1a\x72\x83\x34\x78\x9d\x63\xc7"
+ "\x31\xeb\x55\x7f\x67\x30\x9b\xa6\x72\x1c\xb3\x69\x9b\xf9\x98\x09"
+ "\xf5\x43\x4c\x5b\x26\x1d\xb3\x69\x63\xb9\x7e\x88\x69\xa9\x1c\x66"
+ "\xd3\x2a\x09\x66\xd3\x7c\x09\x66\xad\x89\x6d\xb2\xd6\xef\x98\xd6"
+ "\xe1\xfc\x6f\xec\x9b\xda\xbc\x6d\x7d\x39\x87\xd9\xcb\x61\x80\x59"
+ "\x11\x5e\x6f\xd9\x71\xcc\xee\xb9\x74\x67\x30\x7b\xe9\xbc\xe3\x98"
+ "\xbd\x3c\xce\x0a\x33\x01\xbf\xfc\xb2\xf4\x3d\x3b\x15\x2f\xe9\x39"
+ "\xbf\xfc\xf2\x68\x0e\xb3\x97\x37\x12\xcc\x5e\x2a\x23\x98\xb5\xe5"
+ "\xb5\xc9\x5a\x03\xe4\xe5\xa8\x8e\x31\x63\xbe\xe9\xdb\x29\x67\x7f"
+ "\x6a\x36\xe4\x82\xc7\x04\xff\xe8\x38\x66\x5e\xdf\xde\x19\xcc\xfe"
+ "\x94\xee\x38\x66\x7f\xba\xc9\xc7\x4c\xc8\xd7\xfd\xe9\x82\x74\xcc"
+ "\xfe\x54\xc0\xf9\xba\x3f\xd5\x72\x98\x45\x6b\x08\x66\x7f\x4a\x25"
+ "\x98\x19\x4a\xdb\x64\xad\x23\x12\xdd\x61\xff\x17\xd6\xa1\x6d\xde"
+ "\xb6\x3e\x87\xc3\x6c\xfa\x41\xc0\xac\x08\xaf\x3f\xed\x38\x66\x8f"
+ "\x6f\xb9\x33\x98\x4d\x1f\xeb\x38\x66\xd3\xf7\x59\x61\x26\xe0\x3f"
+ "\xa6\x67\x4a\xc7\x6c\x7a\x34\xe7\x3f\xa6\xe7\x71\x98\x4d\xaf\x23"
+ "\x98\x4d\x1f\x4d\x30\x33\x36\xb4\xc9\x5a\x8b\x64\x7a\x51\xc7\x98"
+ "\x31\xdf\x60\xed\x94\xb3\x99\x31\x86\x5c\xd0\xec\xa0\xc7\x1d\xc7"
+ "\x6c\xe6\x84\x3b\x83\xd9\x0c\xbd\xe3\x98\xcd\x9c\xce\xc7\x4c\x48"
+ "\x27\xcf\x94\xb1\x0e\xf6\x4c\x77\x4e\x27\xcf\x8c\xe2\x30\x9b\xb9"
+ "\x87\x60\x36\xa3\x96\x60\x46\xab\xda\x64\xad\x67\x32\x53\x74\xfd"
+ "\x2f\x7b\xba\xd1\x3c\x2e\x9f\xc3\x6d\xb6\x6f\xf7\xd1\x8e\xb3\xf6"
+ "\x3b\x8e\xdb\x6c\xaf\x8e\xb5\xe3\xac\x16\xe9\xb8\xcd\x2a\xe1\xb4"
+ "\xe3\x6c\x37\x0e\xb7\xd9\xd1\x04\xb7\x59\x7b\x9c\xd3\x8e\xb3\x3b"
+ "\x9c\xff\x2a\xa4\x1d\x6d\x71\x9b\x53\xd9\x7d\xf4\xe3\x9c\x18\xc7"
+ "\x71\x9b\x73\xa6\x63\xfd\x38\xe7\x88\x74\xdc\xe6\x24\x73\xfa\x71"
+ "\x4e\x31\x87\xdb\x5c\x25\xc1\x6d\x4e\xb4\x73\xfa\x71\x8e\xe8\xfa"
+ "\x6f\xf6\xf4\xa3\x2d\x6e\x31\xe9\xdd\x47\x43\xc6\xf8\x3a\x8e\x5b"
+ "\x4c\x5a\xc7\x1a\x32\x66\xa1\x74\xdc\x62\x46\x73\x1a\x32\x26\x89"
+ "\xc3\x2d\xa6\x94\xe0\x16\xa3\x74\x4e\x43\xc6\xe4\xc8\xd1\x90\xb6"
+ "\xb8\xcd\x0f\xed\x3e\x3a\x72\x5e\xa5\xe3\xb8\xcd\x7f\xb2\x63\x1d"
+ "\x39\x5f\xfa\x9e\xc5\x8a\x79\x75\x9c\x8e\x9c\x1f\xc2\xe1\x36\x3f"
+ "\x95\xe0\x36\xaf\xd4\x39\x1d\x39\xbf\xc3\xf5\x3f\x84\x74\xa4\x2d"
+ "\x6e\xaf\x34\x77\x1f\x2d\xf9\x8a\x04\xfd\xff\x8a\xb5\xfe\x17\xd0"
+ "\x92\xaf\xc8\xd0\xff\xaf\x98\xf5\x3f\x94\xb7\x57\x2c\xf4\x7f\x2c"
+ "\xab\xff\x5f\x49\x75\x4e\x4b\xc6\x3a\xa0\xff\x6d\xb5\xa4\x2d\x6e"
+ "\x71\x85\xdd\x47\x4f\xc6\x85\x3a\x8e\x5b\xdc\x81\x8e\xf5\x64\x9c"
+ "\xf4\x7d\xa0\x14\x71\xb3\x38\x3d\x19\xb7\x87\xc3\x2d\x4e\x4f\x70"
+ "\x8b\xd3\x38\xa7\x27\xe3\x44\xd7\x7f\x34\xe3\x66\xf4\x0e\x2c\xa2"
+ "\x05\xfa\x21\xcf\xc6\x6b\xd8\xb5\x09\xe3\x53\x8d\x3e\x81\x45\x52"
+ "\xf7\x77\x31\xaf\x39\x7d\x26\x1e\xa1\x4b\x8a\xf8\x41\xce\xad\x3b"
+ "\xfd\xea\x19\xe7\xd7\x9d\x7e\x35\xb7\xf3\xf6\x77\x79\x75\x9d\xf4"
+ "\x75\xa7\x5f\x0d\xe7\x34\xe8\xab\x19\x1c\xd6\xf1\xcc\xf8\x04\x69"
+ "\xeb\x51\xbf\xea\xee\xdc\x7a\xd4\xf1\x5e\x84\x5f\x0b\xca\xc8\x7a"
+ "\xd4\xf1\x6e\x5d\xb3\xef\xcb\x82\x24\xbc\x1e\x35\x9d\x85\x26\xcb"
+ "\x5b\x1f\x39\x3e\xa3\x63\x3e\x07\x69\x68\x81\x3e\x5a\x8e\xcf\xaf"
+ "\x45\x19\x7d\x82\x34\x52\xf7\x99\xe1\xf3\x79\xd1\x55\xe7\xf8\xbc"
+ "\x68\x87\xf3\x7c\x5e\x14\xd7\x79\xfb\xcc\x2c\x8a\x90\xce\xe7\x45"
+ "\xbe\x9c\x36\x5f\x34\x8b\xe3\xf3\x6b\x5a\xe9\x7c\x5e\x58\xed\x1c"
+ "\x9f\x17\xfd\x48\xf8\xbc\x30\x8f\xf0\x79\x51\x55\xd7\xec\x3f\xb3"
+ "\x30\x9c\xf0\x99\xca\x91\xb7\xfe\xf4\x6b\xb3\x1c\xe0\x73\x11\x2d"
+ "\xd0\x7f\xcd\xf1\x79\x89\x0a\xf8\x5c\x24\x75\xbf\x1b\x3e\x9f\x17"
+ "\x1f\x77\x8e\xcf\x8b\x17\x3a\xcf\xe7\xc5\x63\x3a\x6f\xbf\x9b\xc5"
+ "\x43\xa4\xf3\x39\xa1\x96\xf3\x2c\x8b\xd5\x1c\x9f\x97\xc4\x48\xe7"
+ "\x73\xc2\x41\xe7\xf8\xbc\xf8\x08\xe1\x73\x42\x02\xe1\xf3\xe2\xfd"
+ "\x5d\xb3\x0f\x4e\x82\x2f\xe1\xb3\x6b\xb5\xbc\xf5\xbd\x97\x88\xae"
+ "\x7f\xcc\xf1\x59\xad\xa1\x05\xfa\xf6\x39\x3e\x27\xea\x8d\x3e\x6a"
+ "\x8d\xd4\x7d\x77\xf8\x7c\x4e\x74\x72\x9f\x8b\xc4\x4e\xd8\xe7\x22"
+ "\xd1\x89\x7d\x2e\xac\xf7\xdd\x59\x7a\x5d\x3a\x9f\x97\x16\x71\x5e"
+ "\x6e\xa9\x81\xe3\xf3\xb2\x10\xe9\x7c\x5e\x9a\xec\x1c\x9f\x13\xd9"
+ "\xfd\x2f\x96\x8e\x25\x7c\x4e\x4c\xea\x9a\xfd\x78\x96\xd4\x12\x3e"
+ "\xf7\x19\x2e\x6f\xfd\xf4\x44\x83\x03\x7c\x2e\xa2\x05\xbe\x7b\x70"
+ "\x7c\x5e\x51\x0c\x7c\x2e\x92\xba\xff\x0f\x9f\xcf\x2b\xa6\x3b\xc7"
+ "\xe7\x15\x7d\x9d\xe7\xf3\xf2\xef\x3a\x6f\xff\x9f\xe5\x27\xa5\xf3"
+ "\x79\x79\x3a\xe7\x71\x97\x5b\x7c\xff\xc7\x4b\x05\x4b\xe5\xf3\x72"
+ "\x27\xf7\x05\x5a\x31\x95\xf0\x79\x39\xbb\x2f\xd0\x8a\xf0\xae\xd9"
+ "\x17\x68\x59\x11\xe1\x73\xdf\x04\x79\xeb\xd3\xaf\x28\xeb\x98\xcf"
+ "\xc1\x1a\x5a\xe0\x9b\x10\xc7\xe7\xd5\x5a\xa3\x4f\xb0\x46\xea\x3e"
+ "\x44\x7c\x3e\xaf\x1e\xe9\x1c\x9f\x57\x5d\x70\x9e\xcf\xab\xf6\x75"
+ "\xde\x3e\x44\xab\x32\xa5\xf3\x79\x55\x34\xe7\xfd\x57\x59\x7c\xff"
+ "\x5b\x2d\x63\x7f\xa2\x55\x83\x9d\xe3\xf3\xea\x61\x84\xcf\x2b\xab"
+ "\x09\x9f\x57\xfb\x76\xcd\xfe\x44\x2b\xd3\x09\x9f\xef\x39\x2a\x6f"
+ "\xfd\xff\xd5\x1d\x8e\xff\x10\xea\xdf\x30\xf7\x4b\x71\x9c\x5e\x13"
+ "\xeb\x7c\x1f\x47\x92\xd1\x39\x4e\x27\x1d\x72\x9e\xd3\x49\x6b\x3a"
+ "\xaf\x8f\x23\x49\xc6\x5e\x7f\x49\x6a\xae\x8f\x23\x29\x91\xe3\xf4"
+ "\x9a\x02\xe9\x9c\x7e\x5d\xef\x1c\xa7\x93\x1a\x09\xa7\x5f\x2f\x24"
+ "\x9c\x4e\xaa\xeb\x9a\x3e\x8e\xd7\x67\x39\xd7\xc7\xb1\x26\x51\x4e"
+ "\x1f\x87\x2d\xa7\x93\x35\xce\xf7\x73\xbc\x71\xce\x39\x4e\xbf\x91"
+ "\xe6\x3c\xa7\xdf\x88\xe8\xbc\x7e\x8e\x37\xc6\x48\xe7\xf4\x1b\x88"
+ "\xeb\xe7\x78\x23\x8c\xe3\x74\x72\x92\x74\x4e\xaf\x2d\x71\x8e\xd3"
+ "\x6f\x9c\x21\x9c\x5e\xbb\x91\x70\xfa\x8d\xe2\xae\xe9\xe7\x58\x1b"
+ "\xe2\x5c\x3f\x47\x72\x98\x9c\x7e\x0e\x5b\x4e\xaf\x77\x77\xbe\xaf"
+ "\x23\x65\x9f\x73\x9c\x4e\x79\xc9\x79\x4e\xa7\x0c\xeb\xbc\xbe\x8e"
+ "\x94\xbe\xd2\x39\xbd\xee\x3c\xd7\xd7\x91\xe2\xcb\x71\x7a\xfd\x64"
+ "\xe9\x9c\x5e\xb7\xdd\x39\x4e\xa7\xe4\x13\x4e\xaf\x8b\x26\x9c\x4e"
+ "\xc9\xe9\x9a\xbe\x8e\x75\xae\xce\xf5\x75\xac\xf7\x95\xd3\xd7\x61"
+ "\xcb\xe9\x34\x9d\xf3\xfd\x1d\x69\x6b\x9c\xe3\x74\xda\x48\xe7\x39"
+ "\x9d\xda\xd8\x79\xfd\x1d\xa9\x17\xa5\x73\x3a\xd5\x62\xff\x8b\x54"
+ "\x8b\xf9\xff\x1b\x54\xd2\x39\x9d\x9a\xe0\x1c\xa7\xd3\x96\x11\x4e"
+ "\xa7\xaa\x09\xa7\xd3\xe2\xbb\xa6\xbf\x63\x7d\x95\x73\xfd\x1d\x69"
+ "\x1d\xae\x7f\x21\xd4\xdf\x61\xcb\xe9\x8d\x47\x9d\xef\xf3\xd8\x18"
+ "\xe1\x1c\xa7\xdf\x34\x3a\xcf\xe9\x37\xcf\x74\x5e\x9f\xc7\x9b\x47"
+ "\xa4\x73\xfa\xcd\x64\xae\xcf\xe3\x4d\x8b\xf1\x4f\x1b\x1b\xa4\x73"
+ "\xfa\xcd\x50\xe7\x38\xbd\x71\x22\xe1\xf4\x9b\x88\x70\x7a\xe3\xd8"
+ "\xae\xe9\xf3\xd8\x70\xd0\xb9\x3e\x8f\x8d\xc5\x72\xfa\x3c\x6c\x39"
+ "\xfd\xe7\x74\xe7\xfb\x3d\xfe\x3c\xcc\x39\x4e\xbf\x75\xce\x79\x4e"
+ "\xbf\x95\xdf\x79\xfd\x1e\x6f\x6d\x92\xce\xe9\xb7\xa2\xb8\x7e\x8f"
+ "\xb7\x2c\xd6\xbf\xff\x73\xa9\x74\x4e\xbf\xe5\xed\x1c\xa7\xff\x3c"
+ "\x88\x70\x7a\xd3\x79\xc2\xe9\x3f\x2b\xbb\xa6\xdf\x63\x53\xaa\x73"
+ "\xfd\x1e\x7f\xb6\x19\xff\xb6\x22\x6e\x49\xac\x6a\xe9\x82\x05\x2b"
+ "\xe2\x56\xaa\x56\x24\x2c\x7c\x25\x6e\x9c\xbf\xf9\xff\xe3\x42\x92"
+ "\xfc\x93\xfa\xa1\xd8\xc5\xf3\xe6\xae\x7e\x94\x3b\x99\x10\xb7\x04"
+ "\xfe\xf4\x43\xf1\xf3\x56\xc4\xab\x56\xae\x49\x8c\x53\xe1\xff\x2d"
+ "\x7e\x25\x11\x92\x2c\x5d\xc9\x1d\x79\x21\x2e\x61\x5e\xd2\xc2\x25"
+ "\xaf\xaa\xe6\x25\x2c\x7c\x75\xc9\xe2\xb8\x25\x2b\x55\xcb\xe3\x96"
+ "\xad\x5a\xb8\x3c\x0e\xff\x7b\x85\x6a\xc1\xd2\xe5\x70\xe0\x95\xb8"
+ "\x85\xab\xe3\x54\xf3\x57\x2d\x58\x10\xb7\x7c\x45\x3f\x14\xb1\x2a"
+ "\x61\xe5\xc2\xc4\x84\x38\x55\x58\xc4\xf8\xe0\x69\x13\x5f\x9c\xf6"
+ "\xcc\x33\xfd\x90\xc5\xde\xd3\x2a\x3a\x27\xa2\x10\x38\xe4\x7a\x45"
+ "\xf1\xee\xa1\x72\x50\x52\x99\xc0\xcd\xad\xcb\x91\x72\xcb\x72\xe4"
+ "\xba\xb9\x1e\xb9\x65\xd6\x23\x77\xd3\x3b\x37\x35\xaa\x45\x28\x94"
+ "\xf6\x9a\xaf\xdc\x5a\x8f\xbc\x4d\xd9\xbb\xb4\x74\xf6\xce\x28\xbd"
+ "\xd7\x9b\xa1\x38\x2d\xed\xb5\x21\x11\x1f\x07\x2c\x5c\xe9\xec\xbd"
+ "\x50\xbe\xde\x4d\xd0\x7b\x6d\x54\xad\xbf\x8a\x28\xba\x7f\x7a\xc3"
+ "\x61\x93\x9e\x3a\xc5\x74\x0f\x23\x17\xa4\xd8\xe2\x8e\x14\x9b\x9b"
+ "\xe1\xef\x7e\xf8\x15\x21\xc5\xdb\xae\xf0\x53\xc3\x6f\x34\xfc\xf6"
+ "\xc0\xaf\x06\x29\x32\xbc\xe1\xa7\x82\x1f\x1c\xcb\x08\x87\x5f\x14"
+ "\xfc\xe0\x78\x26\xa4\xcd\x84\x73\x99\x6a\x92\x4f\x26\x9c\xcf\x3c"
+ "\x0a\xbf\x6a\xf8\x35\x20\x45\x16\xe4\x99\x55\x8a\x14\x5b\xa7\xc1"
+ "\x5f\x1d\xfc\xea\xe0\x07\xc7\xb7\x2a\xe1\x87\xd3\x6a\xc8\x39\x2d"
+ "\x82\xdf\x58\xf8\xcd\x82\x5f\x12\xfc\x0e\xc2\xaf\x18\x7e\x65\xf0"
+ "\x3b\x0f\x3f\x78\xbe\x6c\x48\x93\x0d\xf7\xca\x86\x73\xd9\x70\x8f"
+ "\xec\x2a\xa4\x78\x27\x04\x7e\x39\xf0\xab\x45\xf0\x8e\xec\x2f\xc4"
+ "\xe2\xdf\xf8\x17\x6b\xf5\x7f\xeb\xdf\x46\xcf\xb4\xfb\x75\xc5\x81"
+ "\x06\x28\xb7\x5b\x16\xd2\x1b\x90\x82\xce\xde\xa8\x4a\x0c\x44\x2e"
+ "\xd7\x14\x5b\xc6\x54\x6c\x44\x50\xdf\xec\x8c\x2a\x5e\xdb\x8a\xcf"
+ "\x8f\xc1\x31\x6b\xca\xda\x32\x5a\x87\x12\x7d\x71\xf9\x94\xc6\xcf"
+ "\x2d\xa3\xd9\xeb\x57\xea\x5c\x3c\x8b\xf1\xf5\xf4\x3b\x23\x94\xf4"
+ "\xfa\xe8\xf7\xf0\x3c\x5c\xc8\xdf\x1d\xcf\xd3\xa5\xb5\x0f\xa5\xd3"
+ "\xca\x61\x83\x71\x1d\x53\xbc\x96\x79\x2e\x0f\x52\x1e\xe1\x3c\x3c"
+ "\x9b\xde\xeb\xa6\x06\xca\x9f\x2b\xfe\x3f\x0d\x98\xd3\x7b\xa2\xb7"
+ "\x93\x7a\x67\x0b\xe3\x5f\x5a\x7d\xc6\xeb\xf1\xb9\x96\x7d\x7e\x5a"
+ "\xba\x60\x88\xaa\x78\x49\x2b\xaa\x51\x6c\xe9\x0b\xef\x46\x41\x1d"
+ "\x48\xd1\x0f\xf9\x69\x4d\xdb\xc6\xeb\x8f\x03\x0f\x70\xba\x4f\x53"
+ "\x6a\xf1\x5f\x37\x7c\x9e\xce\x99\x50\x84\xfb\x81\x8a\x53\xfe\x0a"
+ "\xbc\xd9\xe2\xd1\xea\x13\x9d\xaa\x7a\xc1\x93\xbe\x44\x9e\x0d\xa7"
+ "\xdb\x63\x7e\x96\x56\xaf\x9b\xa1\x38\x7f\x5a\x35\x3d\x14\xce\xb9"
+ "\x9a\xb2\xdf\x0c\x85\xe7\x70\xb9\x01\xd7\xd1\xf0\x8c\xc5\x2f\xe0"
+ "\xfb\xbe\xbd\x03\x9e\x95\x5a\x3f\x15\xf2\xfe\xeb\xf4\xd0\x8f\xd6"
+ "\x36\x53\xf8\x9c\x49\x7b\x53\x03\x7c\x77\xa7\xb3\xfe\x7c\x7e\xe7"
+ "\x00\xe4\xba\xfb\x1d\x84\x76\xbd\x83\xdc\x9a\xb2\xde\xd6\xea\x5c"
+ "\xdd\xf3\x48\xdd\xb7\xc5\x9d\x82\x34\x3a\xc5\xdb\x09\x34\xf0\x97"
+ "\xb9\x97\xf7\xb8\x10\x3b\xf7\xba\xd8\x7e\xaf\x6d\xe3\x42\xf0\xbd"
+ "\x48\x8c\x6e\x6a\xc8\x5f\x92\x87\xa9\xe0\xbe\x50\x1c\x3f\x1c\x3b"
+ "\x73\x1e\xa6\x6c\x73\x1e\x5b\x8c\xf8\x7a\xb8\x67\x25\xfd\xc1\x7d"
+ "\xa1\xa6\x6d\x61\xa1\x70\xed\x41\x7c\xde\x33\x0d\x35\xd0\xf0\x17"
+ "\xdf\x9f\x60\x01\xb1\xa7\x52\x11\xce\x9f\x66\x8f\xd1\x70\x4c\xa7"
+ "\xc8\xf0\x35\x81\xbc\xc6\x6d\x53\x9d\x22\x83\xe9\x9b\xa0\x95\x23"
+ "\xaa\x08\xc6\x19\xcb\xd6\x54\xd2\x26\xf8\x19\x47\x55\x22\x97\xe2"
+ "\x17\x30\xbe\x19\x5a\xd5\x94\x3e\x10\xe3\x8c\xec\xf6\xd8\x0e\x9b"
+ "\x8e\xe3\xa3\xdc\x3d\x00\xca\xfb\x5b\x7d\x8b\x68\x4a\x85\x30\x3e"
+ "\x38\x56\x10\x27\x04\xc7\xdd\x30\x4f\x9b\xb2\x32\x8a\xad\xe2\xa5"
+ "\xfc\xc3\xd4\xf5\xb4\x45\xde\x9b\x69\x82\x9b\x3b\x9b\x5e\xaf\x73"
+ "\xe9\xab\xc7\xe9\x55\x0f\x30\x9c\xf1\x60\x71\x65\xb8\x85\xe3\x47"
+ "\xfb\x44\x14\xe2\xff\xbf\x34\x12\x29\x3d\x2b\x11\xa5\x4a\x19\x5e"
+ "\x44\xb8\x30\xa1\xc8\xcc\x13\xe6\x1d\xb7\x8d\x72\x33\x6e\x80\xb6"
+ "\xb6\x9d\x7f\x99\x09\xc6\xec\x11\x95\xad\x3e\xcf\x26\xb6\xe4\x8e"
+ "\x0d\xa1\xb5\x23\x2a\xf1\xfc\xf3\x4b\x8a\xcc\x38\x26\x06\x1b\xdc"
+ "\x10\x79\x8e\x11\xe7\x53\x12\x68\x7d\xca\x4d\xb8\xd7\xc0\x67\x13"
+ "\x3f\x5d\xad\x07\xbc\xc6\x86\x60\x3e\x1c\xbf\xdd\x4c\xe1\x35\x01"
+ "\xe9\xfe\x7f\xbe\xbd\x0b\xde\x35\x1f\x38\x01\xef\x8a\x70\xbe\x4d"
+ "\x59\x99\x07\xb9\x77\xcd\x8c\xc2\xdc\x80\x7b\xd4\xb2\xdc\x77\x87"
+ "\xe7\x72\x81\xbc\x6b\x21\xdd\x79\x9d\xcb\xb1\x10\x73\x4c\x98\x7b"
+ "\x73\xe9\xd8\xb2\x94\x59\xaa\xf7\x1a\x51\xdb\xb6\x9a\xae\xdc\xfa"
+ "\x3d\xe4\xbf\x01\xd1\xad\xb7\xe9\xb2\xe4\x28\xba\x39\xeb\x65\x3c"
+ "\xce\xb1\x1a\xad\x9f\x87\x06\xdf\x93\x46\xeb\x23\x8d\xc8\xf3\x9e"
+ "\x6a\x4f\xfa\x6c\x54\x35\xb3\x37\x42\x72\x25\x5d\x5b\x9e\x78\x02"
+ "\x25\x5f\x46\xee\xeb\x16\x22\xef\xf5\x51\xf0\x2e\x65\x74\x73\x45"
+ "\x52\x35\x2a\x6f\x80\x5f\xe2\x59\x48\xf7\x1d\xfc\x4e\xa0\xf5\x6b"
+ "\x90\xeb\x14\x68\xf7\x52\x1a\x91\x7b\x79\x62\x23\x1c\xbb\x8e\x92"
+ "\x63\x68\xc3\xd9\x32\x9c\xee\x34\x8a\x34\xe8\x3d\xd7\x5d\x07\x4c"
+ "\x5f\xc6\x73\xba\x2f\xa2\xdd\xf0\x2c\xad\x5e\xbb\x52\x5b\xb2\xf7"
+ "\xba\xdd\x5a\x4d\x1b\x9a\xb2\xb2\xf6\xe8\xd0\x53\xc5\xbc\x77\xc1"
+ "\xcf\xdc\x8a\x10\xe0\xe6\x82\xd3\x98\x72\x9f\x52\xce\x35\xe0\xfa"
+ "\x25\x2b\x07\x74\x07\x32\x9f\xc7\xe7\xf4\x3e\x4f\x29\xe1\x78\x71"
+ "\xa4\x81\x6e\xc2\xf1\xc1\xef\x0d\x31\xaa\x61\xdf\xbf\x46\x91\x88"
+ "\x5c\x9b\xb2\xb6\xba\xea\x5c\x8a\xdc\xf1\x3d\x20\xcf\xde\x70\x9f"
+ "\xed\x98\x1b\xec\x39\x95\xce\xe5\x7f\xa6\x71\x7c\x79\xbb\x1a\x38"
+ "\xd2\xdb\xfc\x2c\x70\x3e\x54\xe7\xf2\xf7\x59\x16\x7c\xc2\xfc\x68"
+ "\x3f\xcf\xb6\x67\xf8\xf8\x1e\x13\xae\x5b\x95\x2a\xbd\xd1\x67\x42"
+ "\x31\x94\x99\x4a\xfa\x96\xaf\x3b\x4d\xd1\xcd\x53\x0c\x74\xb3\x29"
+ "\xf7\x61\xdc\x96\xb9\x57\x18\x1a\x10\x49\xbf\xf5\x32\x94\xb5\x2a"
+ "\x32\x86\x74\xeb\x59\x9c\x27\x68\x9b\x98\xac\x7a\xa4\x8c\xac\xa4"
+ "\x9b\x71\xf9\x35\x65\xb7\x46\x65\x2d\x47\xde\x74\xee\x84\x42\x93"
+ "\xcf\xb8\xe2\x96\xbd\xd1\x5a\x5c\xc7\x62\xfe\xd2\x5a\xb8\x96\xcd"
+ "\x07\xee\xdb\x4b\xa7\xd8\x5a\x60\x82\xeb\xe9\x9c\x87\x95\xec\xf3"
+ "\x30\xf5\x21\xa9\x47\xb7\x16\xd0\xfe\x70\x4e\xab\x6a\x80\x73\xbd"
+ "\x2e\x29\xb4\x21\x70\x1c\xd1\xda\x61\xea\xe2\x94\x7a\x48\xab\x1d"
+ "\x43\x38\xa4\xd2\xf3\xfe\x4f\xe1\x78\x66\x04\xe0\xf2\x4f\x74\xa8"
+ "\xf6\x25\xae\xdc\x31\xef\xcb\x94\xab\x56\x9f\x87\xa1\xdc\x69\xe3"
+ "\x75\x2e\xf7\xfa\xb2\x31\x76\x69\x20\x75\xd2\x41\xd3\xde\xe8\xed"
+ "\x5f\x82\xf2\xfb\xb2\x0c\x21\x48\x93\xa1\x73\xf1\x51\x73\xb1\xd4"
+ "\xee\xc3\x69\x99\xe7\x84\xb2\x69\xda\xc0\xb6\x01\x70\x0d\x94\x9b"
+ "\x18\x5c\xe7\x90\xba\x4d\xbb\x07\xd7\x3b\x50\x3e\x4b\x49\xbd\x7f"
+ "\x9f\x2f\x3c\x97\x86\x1e\x30\x33\x14\x9e\x2b\xf5\x12\xfb\x2c\x96"
+ "\xcf\x66\xae\x67\xe8\xec\x99\xc5\x24\xed\x08\x7d\x53\x56\xb6\xbb"
+ "\xce\x65\xa0\xab\x25\xd7\xc8\x7b\x65\xa7\x8d\x2a\x83\x7f\x83\x2e"
+ "\x31\xe7\x05\x65\xd5\x0d\xb4\x44\x7f\xcc\x29\x5c\x3e\x77\xbc\x83"
+ "\xb5\xc6\xcc\xd2\x96\xec\x99\x50\x4e\xb3\xa7\x99\xcb\xa9\x69\x35"
+ "\x5d\x05\xb8\x22\xd3\x6d\xfa\xfc\x56\xc0\x32\xd2\xa8\xa0\xe7\x1a"
+ "\xd5\x08\x74\xab\x61\x37\x1c\xdf\xbd\x1a\xeb\xbe\x2c\x2d\x94\x65"
+ "\x37\xe1\xb4\xae\x08\xa7\x63\xd2\xb3\x69\x5b\xbd\x66\x96\x32\xcf"
+ "\x4c\x29\x4c\xf0\x7c\x2e\xe6\x67\x6a\xf5\x1a\x51\x0d\xf7\xae\xd4"
+ "\xb9\xb8\x86\xf2\xca\xcb\x3b\x2a\x25\x4d\x47\x63\x5e\x29\xe0\x5d"
+ "\x1a\xe1\x6f\x1f\x96\xc7\xf7\x7c\x09\xba\x36\x2c\x02\xca\x0a\xe0"
+ "\xbd\x73\x20\x0d\x31\x78\x47\xa9\x43\x73\x73\xf0\xf5\x5b\xe0\xff"
+ "\xf8\x38\x4e\x03\xc7\x03\x74\x28\x66\x23\xc9\x37\x63\x2c\xc6\x8f"
+ "\x9f\xef\x3b\x11\x24\x5f\xe6\x59\xee\xc1\x79\xe2\xeb\x70\x9e\xf9"
+ "\xdb\xe8\x3a\x9c\x0f\xe4\x91\x60\xce\x3b\x13\x8e\x99\xf3\x0f\x5b"
+ "\xdc\x7e\x8f\x0c\xb8\x87\xbb\xe5\xb3\xef\xd8\x46\x37\xb0\xcf\xb5"
+ "\x5f\x87\xe2\x63\xf1\xb9\xcd\x70\x0c\x5f\x4b\x38\xf2\xce\x69\xcc"
+ "\x1f\x1d\x79\x1f\x05\xe1\xd1\x3b\xe7\x75\x68\x41\x9d\x65\x1d\x0f"
+ "\x38\x79\x98\xdb\x00\x36\xbf\x66\x73\x7e\x5c\x5e\x24\x0f\x5a\x3b"
+ "\xab\x88\x2d\x23\xb8\x2c\xbb\xe3\xfc\x9b\xb2\xde\x85\xf7\x9f\x3f"
+ "\x9a\x7d\xff\x80\x06\xc2\x79\x88\x3d\x73\x0d\xe1\x43\x56\xfa\x60"
+ "\x73\x5b\x0e\x58\x54\xc1\x35\xb3\xac\xda\x26\x37\xd2\x6e\x4c\xd0"
+ "\x61\xde\xb0\xf7\x18\x83\x9f\xc9\xfc\xbe\x90\x8f\x2b\xe4\xf3\x30"
+ "\xe6\x3a\xce\x07\xea\xb6\x3d\x90\x4f\x81\x55\x3e\xae\x38\x9d\x29"
+ "\x2b\xfd\x15\xdc\x16\xbe\x3b\x90\x86\x3a\xff\xdd\x52\x73\x1a\x7c"
+ "\x1e\xe2\xfa\x34\x1c\xab\xd6\xa1\xc5\x4c\x1c\xb2\x20\x8d\x4e\x91"
+ "\x2e\x3a\x3f\x26\x65\x18\xa2\x2a\xf2\x74\xd8\x3b\xe2\x72\x3d\xb6"
+ "\x62\x70\x03\xaa\xc8\x33\x21\xd3\x07\xf7\x15\x87\xa6\xd0\xc5\x57"
+ "\x14\x39\xd3\xcb\x9b\x6b\x91\x34\xbd\x97\xc3\xcc\x7f\xa3\x5b\xc1"
+ "\xe3\x24\x3f\x8a\x70\xfb\x7f\x43\x91\xbb\xb9\x42\x5f\xcf\xd4\x71"
+ "\xf0\xef\x55\xf8\xfc\xbb\xe0\x89\xb0\x2f\x02\xef\x1b\xaf\xa5\x88"
+ "\x37\x32\x41\xda\x5d\xf8\x38\xf6\x4d\xe0\xd9\x76\x5b\x9c\xa3\x3f"
+ "\xf0\x0b\x25\xb1\xcb\x1d\xcf\xb4\x79\xf8\x79\x0d\xcf\x17\xe3\x67"
+ "\x36\x15\xf8\x85\xe2\x77\x58\x9f\x44\x9b\x2a\x0c\x4d\xc5\xe5\x0d"
+ "\x46\xa4\x5a\x8d\x3d\x5d\xee\x90\xc8\x7c\x44\x43\x1d\x28\xd1\x53"
+ "\xe5\x30\xe3\xff\xc0\xf7\xde\xd0\xfb\xfb\x85\xae\x37\x22\x6a\x6b"
+ "\x4a\x2f\xb7\x67\xf3\xe8\xe2\x5b\x0f\xdd\x57\xdc\x94\x95\x1b\x7a"
+ "\x2a\x09\x21\xe9\x5a\x38\x37\xd4\xfc\xee\xbb\xd8\x77\x87\x7b\x31"
+ "\xf5\xd2\xa8\xed\xa9\xcc\xfb\x42\x9a\x24\x31\xbc\xe8\x0d\x9e\xf4"
+ "\x97\x79\x06\xb4\x22\x8f\x6e\x5d\x91\x8f\x28\xe3\xb6\x51\xda\x8f"
+ "\x76\x55\xe1\xfa\x3c\xd4\x1c\x4f\x26\x76\xe0\xf7\x13\x53\x90\xf2"
+ "\x9a\x62\xdb\xb0\xc8\xe4\x54\x66\x8f\xa4\xcf\x21\x9d\xc4\x67\x65"
+ "\xfa\xff\xca\xc1\x47\x47\x1a\xd6\xd3\xa4\x4d\xda\x36\x69\x0a\x9b"
+ "\x1f\x3e\x67\xc6\x6f\x17\xeb\x6f\xa5\xdf\x63\x9b\xe8\xfc\x7f\x3b"
+ "\xef\xaa\x14\x7e\xd7\xbf\x78\xc8\x7f\xd7\x6d\x55\xb6\xef\xfa\x97"
+ "\x31\x9d\xfb\xae\x7f\x19\x2b\xe3\x5d\x55\x22\xef\xda\x22\xff\x5d"
+ "\xff\x52\x62\xfb\xae\xdb\x87\x75\xee\xbb\x6e\x17\x5d\xff\xc9\xce"
+ "\xbb\x86\x08\xbf\xeb\xf6\xcb\xf2\xdf\x75\x7b\xa1\xed\xbb\xee\xf0"
+ "\xe8\xdc\x77\xdd\x21\xba\xff\x29\x4d\x79\xd2\xb8\x7e\x82\x7a\xa9"
+ "\x35\xa5\x05\xb4\xdc\xb6\x89\x51\xeb\xf6\x22\xaa\xac\xa1\x19\x95"
+ "\x0f\xae\xc2\x3a\x99\x7a\x38\x11\xea\xbd\x0d\x68\x2c\xfd\xce\xcd"
+ "\xa8\xf2\xbc\x3a\x38\x7e\x05\x9d\x4d\x6a\x46\xa1\xcb\x71\xfd\xbb"
+ "\xe3\x42\x45\xac\xd4\xfa\x77\x47\x41\x7b\xfd\x6b\x78\x94\xad\x73"
+ "\xdf\xeb\x55\x5e\xd7\x8a\xf0\xfb\xdf\x50\xec\xbc\xd9\x5e\xff\x6e"
+ "\x20\xf1\xb6\xae\x7f\x71\x3c\x2a\x9a\x9b\x79\xf5\x2f\x99\x27\xb5"
+ "\xf3\xa4\x75\xdd\x9b\x75\x0d\x21\xe1\xba\x77\xe7\x0e\x5c\xf7\xee"
+ "\x82\xf3\xd2\x9e\x7f\x67\xac\xb9\xee\xd5\xc2\x3d\x2d\xeb\xde\x2f"
+ "\x63\x71\x9b\xbc\xf3\x84\xbc\xba\x77\xe7\x09\xf3\x7b\xe7\xb3\xef"
+ "\x0d\xc7\x54\xfc\xba\x77\xa7\xe8\x5e\x97\x96\xbc\xa5\xb7\x05\x26"
+ "\x7e\x34\xb4\xb9\x97\xa9\x60\x70\x2a\x6e\xdf\x9a\x20\x26\x7f\xdf"
+ "\xd5\xec\x7a\x45\xf1\xde\x4a\xa6\x3f\xb3\x29\xd6\x85\x2e\xb8\x2f"
+ "\x20\x72\x25\xfd\x03\xed\x3f\x38\x15\xf7\x55\x62\xcf\x0d\xe7\x0f"
+ "\xd0\xfb\xee\x0b\x90\xf6\xdc\x24\x4f\xfa\x83\x41\xc5\x29\x50\x5e"
+ "\x3e\x5a\xdd\x4c\x99\xde\x88\xf6\x04\x1c\x94\x74\xee\xc3\x85\xf4"
+ "\x5b\xbe\xc9\xb7\x72\xc3\x54\xa7\x03\x2e\x23\x9c\x96\x4e\x73\x1d"
+ "\x2b\xff\xf9\xf3\x46\xdb\x7f\xfe\xbc\x85\xd2\x9f\x9f\xe4\xe9\xd8"
+ "\xf3\xe7\x8d\x76\xe8\xf9\x07\xc2\xf3\xb7\x6a\x7a\x81\xff\xa3\x3e"
+ "\x6f\xd5\xb8\x4a\x7c\x1e\xd1\xfd\xef\x3a\xef\x1e\xf9\x0e\xd7\x7f"
+ "\xf4\xc0\xa7\x0a\x3f\xda\xa5\xa7\xa0\x0e\x60\xda\x70\x5c\xf6\x48"
+ "\xfd\x57\x0b\x75\xd6\x0f\x34\xa9\x93\xf4\x12\xeb\xa4\xfc\xfd\x8e"
+ "\xdf\x3f\x44\xd9\xf9\xf7\xdf\x25\xfe\xfe\xd6\x75\xe2\xe1\x21\x7b"
+ "\x44\xeb\xc4\x6d\xa3\x94\xb6\x75\xe2\xae\xeb\xd2\xeb\xc4\x5d\x45"
+ "\xb6\x75\xe2\x9e\x41\x5c\x9d\xb8\xa7\x97\xfc\x3a\x71\xf7\x39\xc7"
+ "\xeb\xc4\xdd\x87\xe4\xd5\x89\xbb\x93\xec\xd7\x89\xbb\x2b\xe5\xd5"
+ "\x89\xbb\x2b\x6d\xeb\xc4\xdd\xa3\xf9\x75\xe2\x1e\x37\x51\x2c\xb5"
+ "\x9e\x55\xd0\x46\xbb\x5f\x53\xec\xa9\x32\x6c\x00\xdf\xa2\x4d\xd7"
+ "\x44\x1a\xe9\x26\x3a\xdb\xb3\xca\x44\x8d\xc6\xf5\x4a\x68\x53\x53"
+ "\xbc\x9b\xe9\xf5\x00\x77\x7a\x80\x6a\x17\xdd\xe6\x8b\x20\x4e\xc3"
+ "\xe1\xf9\x3d\xe9\xa6\x80\xfe\xf4\xeb\x01\x03\xf2\x6e\x23\x6f\xf8"
+ "\xf9\xe6\xb1\xed\x31\xfc\x3b\x84\x7e\xdd\xb7\x5f\xd6\x6a\xa4\xf6"
+ "\x6c\x40\x6e\xf0\x0c\xd1\x9e\x69\x4a\x04\x75\x90\x37\xfe\x37\xbd"
+ "\xa1\x60\xec\xee\xdb\xc8\xd5\x33\x09\xb0\xf1\x82\xfb\x25\x79\xd2"
+ "\xf4\x8a\x00\xb4\x7b\x39\x78\x69\x0a\xf9\xee\xa2\xe8\x42\x43\x53"
+ "\x00\x65\xf4\x9e\x50\x49\xf0\xd9\x9b\x41\x0f\x04\xef\x95\x33\x21"
+ "\xcf\x34\x70\xc2\x46\xe3\xfa\x78\x05\xfd\x46\xb4\x02\x3f\xab\x31"
+ "\x67\x42\x2a\xbd\x0d\x7e\xeb\xe3\xfb\x63\x0d\x0d\x5e\x3b\x84\x6e"
+ "\xf2\xed\x07\x3e\x5c\xbd\x6b\x35\x1a\x9e\x7f\x1b\x05\xd0\xb7\x02"
+ "\x28\xc0\x3f\x1a\xef\x35\x0a\x31\x8a\x36\x51\x05\x63\xe1\x9c\x2b"
+ "\xae\x13\x69\x7c\x7f\x03\xdc\xbf\x0d\xee\xdf\x8a\xb9\x8d\x7c\x77"
+ "\xc3\xfd\x8d\xaf\x07\x48\x2c\x2f\x7b\x99\xf1\xbf\xe6\xe7\x32\xa9"
+ "\xfd\xf7\xd0\x87\xe1\x87\x9f\x0b\x62\xb8\x1b\xc7\xe4\x61\xff\x02"
+ "\xfc\x6c\x99\xb7\x91\x1a\x9e\x73\x38\x3c\x43\x00\xdc\x17\xaf\xd3"
+ "\x12\x3d\x67\x99\x12\x73\x94\xf7\x6c\xc6\x6c\xf6\xd9\x7e\x81\x67"
+ "\xbb\xc1\x3d\x1b\xbe\x17\x8e\x8f\xd8\x37\xd0\xc8\x75\x43\x71\xd9"
+ "\xfc\xc9\x33\xa9\x4f\x38\xfe\x1e\x7a\xeb\x8d\x78\x89\x5c\xfd\xab"
+ "\xe8\xfa\x27\x5b\x0f\xa3\xc1\xb4\x72\x83\x66\xca\xa6\x1f\xe8\x48"
+ "\x03\x42\x9b\x0e\x23\x75\x05\x94\xeb\xf2\xe6\xeb\x88\xf6\xda\xa0"
+ "\x39\x1d\x50\x27\xf5\x5e\x5a\xb1\x7b\x6d\xd9\x40\x57\x9a\xbc\x27"
+ "\x14\xd3\xde\x61\xbe\x5b\x37\xd0\x49\x6d\xc3\xfd\x62\x5a\x87\xdf"
+ "\x17\x32\xd7\xa0\x04\x5e\xd3\x49\xaa\xe5\x48\x75\x45\xb1\xff\xbb"
+ "\xaf\xcf\x83\x2f\x9d\x81\xdc\x2e\x29\x0e\xb8\xaf\xbf\x80\xbf\x15"
+ "\xbd\xaf\xe2\x7f\x2b\x7a\x3f\x0c\x29\x0a\x8e\x22\xc5\xbe\x12\xa4"
+ "\xf8\xa0\x16\x41\x3a\xfe\x6f\xbf\x2b\xc9\xab\x20\x3b\xf2\xc0\x50"
+ "\x94\x62\xa0\x7f\xa2\xb5\xf5\xe9\x59\x14\xdd\x1c\x39\xd2\x45\x57"
+ "\xbc\x1a\x7f\x43\x29\xd8\x0c\x31\xfd\x19\xda\x5a\x4f\xf8\xf7\x4b"
+ "\x80\x29\x4a\x5c\x8e\xee\xbd\xa6\x28\x98\x86\xcb\x8d\x67\x43\x9f"
+ "\x70\xe3\xfa\x68\x64\x50\x45\x6b\xdb\x72\x26\x14\x1a\x73\x1e\x56"
+ "\x9a\x94\xe9\x9a\xf5\x57\xd1\x60\xfc\xed\x13\xca\x46\xf4\x5c\xa3"
+ "\x1b\x2e\x8f\xd1\xc5\xf3\xbf\x46\x57\x56\x22\x6a\x7d\x23\xf2\x00"
+ "\x6e\xb6\x97\xab\x88\x3a\xcf\xe6\x75\x75\xb4\x09\x97\x2d\xdc\xa7"
+ "\x0a\xe7\xfa\xa7\x34\x82\xbf\xd7\xd7\xa2\xbc\xe5\xc8\xdb\xb8\x22"
+ "\x7e\x80\xfe\x56\xfc\xbd\xef\x99\x90\x77\xff\x06\xa4\xcc\xab\x07"
+ "\x4e\xad\x00\x3e\xd5\x43\x39\xd3\x93\x72\x86\xe7\xda\xef\xc2\x65"
+ "\x6c\xcb\x37\xde\xbb\xeb\x49\x19\x63\x78\x84\xcb\xd8\x52\xe0\xd1"
+ "\x12\xdc\x7e\x00\x8f\x36\x40\x19\x83\x72\x41\x67\xfd\xd5\x35\x6f"
+ "\x03\x8d\xd6\x2d\x44\xd4\xee\x6b\x7d\xf0\x39\x97\x5e\x23\x29\xd5"
+ "\xd7\x51\xcd\x88\xeb\xeb\x38\xe0\xd1\xea\x7f\x5f\x88\xea\x05\xfa"
+ "\x97\x4b\x8a\x82\x54\x38\xee\xa6\x7a\x79\x84\x12\xe2\xcd\xf6\x49"
+ "\x1f\x70\xc7\x7d\x9c\x3a\x88\x05\x8e\x8b\xea\x05\x34\xe2\x92\xe2"
+ "\xfd\x97\x70\x1c\x5f\xdf\x8f\x14\x89\x4f\xd3\x35\x10\xb3\x59\xa4"
+ "\x1f\xf7\xfd\x69\xcc\x37\xd4\x34\x15\xfa\x86\xf9\x76\x45\xae\x31"
+ "\x42\xdc\x0c\xca\x9b\x55\x80\xb7\xae\x78\x51\x2b\x53\x0f\xe1\x38"
+ "\x5e\x49\x40\xd4\xdc\x3a\x88\x95\x11\x62\xd5\x14\xe0\x0e\xf5\x51"
+ "\x14\xae\x8f\x68\xad\x6a\x7b\xb2\x8e\x36\x45\xc6\x2a\xe8\x94\x65"
+ "\xc8\xad\x22\xc9\x88\xe6\x24\x22\x7a\xdd\x75\x88\x57\x43\x15\x82"
+ "\x7a\xa9\x3f\xd4\x59\x03\xf2\x57\x23\x6f\x1c\x2f\x8f\x3a\xd0\x2a"
+ "\xef\x6c\x0c\x39\x9c\x52\xda\xcb\x08\xfc\xc5\xf5\x93\x67\x9a\x4b"
+ "\x5f\x28\x67\xfd\x33\x70\x79\x84\xf2\xe9\x99\xc6\xd4\x97\xd1\x79"
+ "\x50\x0e\x0d\xaf\x07\x3c\xd0\xf6\x7a\x80\x0a\x7e\x43\xcd\x75\x98"
+ "\xb9\xfe\x80\x98\x25\xe0\xfa\xab\x22\x49\x87\x0c\x10\xdb\xfe\xb8"
+ "\xad\x7b\x3d\x60\x30\x13\xe3\x57\x03\xd0\xa8\x66\xe4\x02\xcf\xa4"
+ "\x84\xe7\x45\xbb\x17\x20\xb7\xb3\xf1\x97\x90\x11\xca\x86\x39\xee"
+ "\x11\x0b\x55\x08\xf2\xa5\x4e\x07\x7c\x87\xd8\x98\xb9\x88\xf3\xee"
+ "\x83\x1f\x39\xde\x7d\xc0\xcc\x8b\x25\xbc\xfb\x40\xf7\x5b\xe4\xdd"
+ "\x37\xd1\x0c\xef\x14\x6d\xfe\x0c\x9f\x66\x55\x18\x3e\x86\x18\x7d"
+ "\x50\x86\x39\x82\x39\x73\xe6\x6f\x98\x33\xff\xa7\xa1\xbb\x72\xa6"
+ "\xa5\x29\x40\x05\xbf\x3b\xc2\x19\xc8\x97\xe1\x0c\x8e\xd5\x37\xd1"
+ "\xad\xc8\x1c\x23\xa6\xac\x6a\x37\x68\x54\xeb\xd1\x33\x50\x56\xdd"
+ "\x3d\xd3\x86\xa2\xb3\x4c\x9c\x0e\xb8\xab\x5e\xa6\x4d\x97\x14\xfb"
+ "\x83\xd7\x9f\x43\xca\xd6\x0d\x34\x5d\x61\x38\x84\x4c\xde\xe3\x8a"
+ "\x99\xef\x81\xda\xd6\x28\xf0\xac\x1a\x1a\x7f\x87\xdf\x00\x98\x25"
+ "\xe2\xbe\xf0\x37\x43\x8d\xb9\x11\x85\xa6\xec\x0d\x89\xb4\xd7\x5e"
+ "\x64\x84\x72\x6d\xca\x9e\xaf\x34\x79\xed\x8c\x6a\xca\xda\xbf\x52"
+ "\x87\x4e\x95\x32\xdf\x7f\x73\x26\x14\x43\xdd\x80\xeb\x5f\x66\xbc"
+ "\x27\xfe\x4e\x0f\xe7\x73\xcc\xdf\x97\x71\x9d\xc0\x7e\x7b\x60\xbf"
+ "\x4d\xec\xc7\x18\xf6\xc3\xdf\x26\x48\x9d\xb2\x7f\x93\xf9\xdb\x84"
+ "\xf9\xff\xf8\xbc\x4e\xb1\x3f\x1d\xf7\xab\x72\xd7\x1d\x70\x25\xe9"
+ "\xcc\xd7\xbd\xdf\x17\xd7\xf5\xdc\x75\xe4\xff\x50\xaf\xb8\xb6\x51"
+ "\xc8\x4d\x50\xe3\x78\x47\x14\x42\xf9\x01\x6f\xf4\xb7\x4d\xf0\x97"
+ "\x82\xb8\xec\x83\xbf\x0a\xf8\xcb\xf4\x63\x4a\x6b\xaf\x0e\x84\x92"
+ "\xef\x43\x61\x61\x6c\xdd\x38\x9e\x29\x93\x81\xc8\xe3\x1a\xfb\xef"
+ "\xa6\xac\x03\x79\xe6\xef\xe4\xed\xe9\x39\x7c\x34\xf8\xde\x80\x91"
+ "\x2b\xf9\x76\x4f\xfe\x8f\xc7\xc5\xb0\xf9\x31\xff\x37\x0d\x1f\xa2"
+ "\x2a\x4e\xb9\x84\xea\x14\x7f\x73\xab\x80\x36\xdc\xb4\x2d\x2c\x6c"
+ "\xeb\x6d\x28\x03\x49\xed\x75\xf2\x78\x28\x8b\x6e\xc5\x6b\x71\x9a"
+ "\x03\xcc\x5e\x3a\xa6\x9c\xa7\x54\xf4\x3b\xf5\x51\xd8\x0b\x36\xd1"
+ "\xf1\x4f\xb3\x7f\xc7\xe1\xf2\x44\xfa\x4d\xfe\xf6\x12\x0d\xd8\xe2"
+ "\xbd\xd2\xdb\xc7\x0a\xe1\x3d\xcc\x53\x5d\x07\x9f\x4a\x26\x6d\xa5"
+ "\xf9\x79\xf1\x3e\xe7\x78\x2c\xce\x88\x54\x94\xda\x24\xb0\xcf\x39"
+ "\x37\x66\xe7\x6f\xa1\xa6\xdc\xa7\x00\xfb\xbf\x69\xa1\x2d\xaf\xb4"
+ "\x7c\x67\x21\x2c\x20\xfd\x41\xb1\x73\xd2\x70\xf8\x5b\xa9\x58\x3e"
+ "\x13\x03\x8c\xb4\xb4\xbc\x3e\x14\xef\xff\x19\x3e\xa8\x38\x72\xbf"
+ "\xb1\xd8\xd4\x16\xed\x79\x3a\xf9\xba\x44\x6d\xf3\xa1\xe8\xfa\x7f"
+ "\xc6\x9c\x71\xba\xb6\x87\x06\x15\xe3\xef\x14\xc6\xa5\xd1\xcf\x97"
+ "\xef\x37\xa0\x03\x4b\x6a\x29\x5c\x1f\x1e\xbc\x56\x48\x45\x8e\x64"
+ "\x35\x5c\x0d\x52\xe2\x7e\x2f\xac\xe5\xb2\x6e\xa0\xe1\xad\xeb\xa3"
+ "\x3d\x5b\xdb\xa2\xd1\xdb\x37\xd0\x58\xd3\xab\xbe\xfd\x32\x16\x20"
+ "\xd7\x16\xa8\x0b\x5b\x7e\x8a\xf7\xfc\xa6\xba\x16\x7d\x0e\xd7\x96"
+ "\x37\xe8\xd0\x2e\x48\x4b\xff\x14\xdd\xff\x8f\x31\x74\x73\x59\xcc"
+ "\xc7\x28\x32\xc0\x58\x9c\xf2\x23\xf2\x80\x3a\x51\x59\x91\xb4\x8f"
+ "\xf9\x9e\xdb\x6b\x0d\xa5\xaa\x30\x5c\x46\x99\x0b\xa0\x2e\x85\xba"
+ "\x73\xfd\x4b\xd0\x66\x00\x27\xde\xb3\x6c\x33\x16\xed\xe4\xda\x8c"
+ "\x5f\xa0\xcd\x78\x07\xda\x8c\xf5\xbe\xa8\x3c\xb1\x18\x41\x1d\xd6"
+ "\x67\x4a\xa2\x67\x73\x4a\x22\xb4\x1d\x6b\xa0\xed\x48\xba\x8c\x98"
+ "\x76\xa3\xae\x16\x41\x9d\xdf\x3f\x7f\x09\xf2\x6e\xfd\x05\xda\x8e"
+ "\x5f\xa0\xed\x48\x21\x6d\xc7\x8e\x1b\xd0\x76\x2c\x05\x6f\xb0\x04"
+ "\xda\x8e\x3a\x81\xb6\xe3\x86\xb0\x2f\x30\xd7\x83\x2d\xbf\x04\x50"
+ "\x3b\xa0\xdd\x58\xfb\x1d\xa2\x76\xbc\xdc\x47\x22\x67\x0e\x8a\xce"
+ "\xff\xa5\xb7\x85\x3d\x68\xa2\xa3\x11\x8e\xfb\xda\x66\x68\x87\x01"
+ "\x97\x8a\x00\x03\xf2\x3c\xdf\x27\xbc\x05\x8e\xb7\x0d\x0c\xd4\xee"
+ "\xff\x5e\x4f\xd1\x39\x0f\x17\xb6\x00\x6e\x6b\x57\x21\xaa\x0d\x30"
+ "\x3c\xf8\x82\x96\xc2\x3e\xd1\x94\x1b\x78\x9e\x78\xd2\x8f\x7c\x70"
+ "\x9f\x88\xa7\x8e\xe0\x66\xa0\xa3\x3d\xe9\x57\xa2\x3d\x32\xe7\x23"
+ "\x57\xe3\x7f\x7d\xfb\x99\x5e\xf1\x75\x4b\xf9\x0e\x29\xf5\xaf\xc4"
+ "\x43\xbc\xae\xa3\xcf\xbf\xd5\x52\xbb\x67\x20\x15\x5e\x17\x91\x7e"
+ "\xeb\x8b\xaa\xdd\x73\x90\x66\xf7\x7f\xd0\xe8\x5d\x33\x90\x3a\xff"
+ "\x7b\xbc\x7e\x3a\x60\x58\x4b\x37\x9f\x8d\xff\x14\x7f\x63\x0f\xa5"
+ "\xb7\x05\x6b\x69\x9f\x71\x3a\xf8\xb7\x46\x3b\x03\xfc\x03\x9c\x8f"
+ "\x0c\x68\x29\xae\x48\x3a\x8b\x32\x2e\x21\x94\x72\x95\xc5\xb8\x1d"
+ "\xdf\x8b\xc8\x40\x41\xfd\x81\x35\x41\x04\xc1\x17\x7f\xf7\xc2\x9e"
+ "\xa3\x1d\xe3\x05\x5f\xf0\x75\x01\x8b\xf1\xd9\xba\x4a\x04\x6d\x60"
+ "\x9f\x76\x7d\xc0\x60\x7c\x11\x99\xb5\x01\x60\xd3\x1f\xb4\x80\x77"
+ "\xcb\x2d\x2b\x7d\xb0\x5c\xa6\x3e\x60\xfd\x8d\x61\x45\x00\x95\x47"
+ "\xd1\x68\xfd\x59\x44\x6d\x37\x49\xc5\xf8\xb0\x8e\xa9\x6f\x0b\xee"
+ "\x0b\x20\x63\x64\x0e\xed\xc0\x58\xe8\x14\x87\xb6\xbf\x14\xe0\x82"
+ "\xe4\x61\x1f\xa4\xb4\x8f\x7d\xd0\x34\x82\xfd\x11\x2f\x79\xd8\x07"
+ "\x29\xe9\xb7\xbe\x0c\x91\x87\x7d\xa3\x44\xec\x99\xf5\x25\x7f\xa3"
+ "\xd8\x17\x56\xf3\xb1\xff\x28\x97\x60\xff\x51\x8e\x13\xd8\x77\x50"
+ "\xee\x83\xd8\x72\xff\x89\x87\x4c\xec\xa1\xdc\x7f\x99\x2e\x0f\xfb"
+ "\xeb\x12\xb1\x67\xd6\xa8\xfc\x8d\x62\xff\x71\x15\x1f\xfb\x23\xd9"
+ "\x04\xfb\x23\x5a\xf9\xd8\xab\x3b\x28\xf7\x6a\xb6\xdc\x1f\xeb\x2b"
+ "\x0f\x7b\x35\x2e\xf7\x3a\x79\xd8\x5f\x94\x88\x3d\xb3\xce\xe5\x6f"
+ "\x14\xfb\xa3\xe7\xf9\xd8\x7f\x92\x49\xb0\xff\x24\xc3\x09\xec\x3b"
+ "\x28\xf7\x6a\xb6\xdc\xff\xbd\x97\x4c\xec\xa1\xdc\x97\x68\xe4\x61"
+ "\x7f\x52\x22\xf6\xcc\x5a\x99\xbf\x51\xec\xff\xa7\x92\x8f\xfd\xb1"
+ "\xcd\x04\xfb\x63\xe9\xf2\xb1\x0f\xee\xa0\xdc\x07\xb3\xe5\xfe\xb8"
+ "\x8b\x3c\xec\x83\xa1\xdc\x97\x68\xe5\x61\xbf\x4e\x22\xf6\xcc\x7a"
+ "\x9b\xbf\x51\xec\x8b\xca\xf8\xd8\xff\x7d\x13\xc1\xfe\xef\x1b\x1d"
+ "\xc1\xfe\x0d\x4b\xec\xab\xfb\x84\x83\xb7\x62\x74\xfe\x81\x19\x2c"
+ "\xf6\x1f\x00\xf6\xf0\xfe\x07\x5f\xde\x6e\xa5\xf1\x3f\x6d\x64\x70"
+ "\x8f\x01\xdc\x93\x00\x77\xf0\x86\x66\xcc\x01\x23\x0f\x8c\x3b\xc6"
+ "\x3c\xe5\x22\x52\x7e\x0e\xd7\x62\x7c\x30\xc6\x80\xa3\x8a\xc1\xb9"
+ "\xf7\x17\x55\xb4\x8b\xab\x37\xc6\x13\xeb\x7e\x8c\x79\x47\xda\x1e"
+ "\x73\xa2\x43\xcc\xa7\xde\x19\x7d\xdf\x6a\xdd\xff\xd7\x59\x98\x9f"
+ "\x03\x0f\x97\x22\x15\xf3\x4f\x8b\xf9\x98\x1f\x5f\x87\x71\xd0\x29"
+ "\x8e\x27\xcb\xc7\x5c\xad\x14\xc7\xdc\xdc\xc6\x9f\xb8\xea\x1c\xe6"
+ "\x5f\xea\x38\xcc\xd5\x4a\xfb\x98\x5f\x94\x81\x79\xe7\xb6\xef\xdd"
+ "\x0b\xf3\x13\x47\xf9\x98\xff\x63\x19\xc1\xfc\x1f\x89\x62\x98\x9b"
+ "\xa0\xbe\xc6\x7d\xea\x78\xfe\x9f\xb1\x29\xfa\xf9\x36\xc0\x15\xcf"
+ "\x03\xc4\x7d\xbd\x87\x96\x14\x51\x6d\x80\xfb\xd6\xd5\x68\x78\xc6"
+ "\x6a\x34\xd6\xb3\x96\xd4\xdf\xad\x50\x7f\x6f\xbe\x8d\x5c\x4d\xaf"
+ "\xf9\xf6\xcb\xb8\x86\x5c\x5b\x21\xc6\xad\xaf\xc5\x7b\x96\xc5\xe8"
+ "\xd1\xe7\x37\x8a\x28\xdc\x77\x8b\xbf\xdb\xd1\x3f\x47\xf7\x9f\x14"
+ "\x4b\x37\x97\xd5\xbc\x43\xfa\x55\x2e\x9b\xfb\x55\x0e\xf1\xfa\x55"
+ "\xde\xbe\xc6\xf6\xab\x4c\x27\x18\xe5\x59\xe2\x33\xe7\xaf\x22\xfd"
+ "\x2a\xa5\x1d\xf6\xab\x30\xfd\x29\x37\x90\x77\xdb\xd2\xf8\x01\x3b"
+ "\xd8\x7e\x95\x9d\x4b\x9c\xeb\x57\x69\x5d\x1a\x40\xed\x04\x7c\xde"
+ "\x98\x0e\xf8\x7c\x2f\x15\x9f\xcf\xa6\x39\xda\xaf\x62\x6e\x63\xcd"
+ "\xed\x2a\x2e\x73\xb8\x6d\x6d\xce\x09\xcc\xb1\xee\x4b\xc1\xe5\xed"
+ "\x86\xa2\x38\x0e\xd7\xc9\xf2\xfa\x53\x4a\x6a\x7b\x5a\x7f\x0a\x2e"
+ "\x73\xe6\x76\xb6\x7b\xb4\xb1\xc5\x21\xfc\xb2\xf7\xd9\x55\xd2\xc6"
+ "\x7e\x56\xeb\xa8\xbe\x12\xc7\x3c\xc8\xdb\xba\x0f\x85\x60\xfe\xc5"
+ "\x74\xdc\xe7\x22\xaf\x1f\xe5\xf4\xd8\x9e\xd6\x8f\xd2\xfd\x30\xff"
+ "\x62\x38\x1f\xf3\xe2\x8b\x04\xf3\xe2\xea\x4e\xc0\x3c\xc7\xba\xef"
+ "\x84\x60\x5e\x12\x81\xfb\x5a\xe4\xf5\x9f\x9c\x96\xa9\xa5\x7f\xbd"
+ "\xfe\x93\xee\x87\x79\x89\x2f\x1f\xf3\x2f\xce\x11\xcc\xbf\xa8\x74"
+ "\x1e\x73\xb5\xb7\x75\x9f\x09\xc1\xfc\xab\xf1\x58\x7b\xc9\xeb\x37"
+ "\x39\x5d\xd3\xd3\xfa\x4d\xba\x1f\xe6\x5f\xb9\xf3\x31\x2f\x39\x4d"
+ "\x30\x2f\x29\xe9\x04\xcc\x73\xac\xfb\x4a\x08\xe6\xa5\x63\x70\xdf"
+ "\x8a\xbc\xfe\x92\xaf\x7a\x5c\x7f\x49\xf7\xc3\xbc\x14\xf1\x31\xff"
+ "\xea\x38\xc1\xfc\xab\x22\xe7\x31\x0f\xf6\xb6\xee\x23\x21\x98\x7f"
+ "\x3d\x12\xf7\xa9\xc8\xeb\x27\xf9\x2a\xa3\xa7\xf5\x93\x74\x3f\xcc"
+ "\xcf\x34\xf0\x31\x2f\x3d\x44\x30\x2f\x3d\xe8\xa8\x67\x36\x7b\x65"
+ "\xb3\x3f\x66\xbc\xb2\x37\x68\x76\xab\xbe\x11\x82\x77\x99\x0f\xa3"
+ "\xd9\x65\x7b\xe5\x92\xda\x9e\xd2\x3f\x62\xc6\x1a\xfb\xe5\xee\xe1"
+ "\x95\xbf\xb1\xfa\xfe\xf9\x75\x3e\xf1\xca\x5f\xe7\x89\x61\x2d\x34"
+ "\x16\xa1\x1c\xbc\xa6\x79\x2c\xc2\xe6\xd5\x80\x23\xf0\x00\x8f\x45"
+ "\xc0\x63\x12\x84\xc6\x23\xe0\x71\x08\xe6\x31\x09\x96\xe3\x11\xc2"
+ "\x75\x74\x33\x1e\x93\x80\x7d\x72\x59\xcc\x16\x64\x1e\x9b\x80\xc7"
+ "\x20\xac\xff\x11\x79\x60\x8c\xf0\xf8\x03\xec\x97\xef\xf4\x18\x84"
+ "\xed\xa6\xee\x30\x06\xe1\x6c\x6a\x47\x5e\x39\xe2\xc0\x50\x04\x7c"
+ "\x6b\xef\xa7\x6a\xdb\x16\xa8\xc5\x65\x0e\x63\xe4\x59\x47\xca\xe1"
+ "\xa1\x97\x0b\xa9\x8a\xa4\x22\xb4\x79\x2d\x52\x9a\xfb\x2f\x70\x19"
+ "\x84\x7a\xd9\xd3\x00\x78\x66\x2c\x22\xfd\x18\xa6\x9f\xa3\x3d\xf4"
+ "\xaf\xc5\xe3\xb9\xfa\xca\xcf\xff\x59\x48\xe1\xbe\xc7\xdd\x0b\xd0"
+ "\xe8\xf7\xae\x20\x4d\x79\xc3\x45\xc4\x94\xa9\xdc\xc0\x52\xb8\xb6"
+ "\xb0\x2d\x77\x9c\xce\xe4\x13\x78\x54\xef\x13\x58\x84\x71\xcb\xb8"
+ "\x86\x10\x2e\x5f\x18\xb7\x8a\xa4\xfc\x76\xbc\x18\xac\x28\xb6\x6f"
+ "\x43\xb4\x4c\x7d\x2b\x1b\xb3\xbc\x1b\x80\xd9\x52\x3e\x66\xf9\x72"
+ "\xfb\x37\xcc\xe3\xb9\x97\x06\x50\xf9\x50\xa6\xd6\x4e\x05\xcc\x5e"
+ "\x90\x8a\x59\x85\xe8\xfe\xef\xe2\x98\x05\x29\x1d\xc3\x2c\x68\x5a"
+ "\xc7\x98\x7d\x19\x62\x8b\x59\x50\x38\x5c\x1b\x42\x30\x0b\x1a\xad"
+ "\xf7\x09\xd2\x70\x98\x35\x3a\x88\x99\xb5\x87\xfd\x2d\x61\x56\x29"
+ "\xba\xff\xbb\x1d\xcc\x1c\x2c\x67\x41\x0e\x94\xb3\x2f\xd3\x05\x30"
+ "\x83\x72\x16\xc4\x96\xb3\x20\x28\x67\x41\x16\xe5\xec\xba\x83\x98"
+ "\x59\x7b\xd0\xdf\x12\x66\xdf\x8a\xae\xff\x2d\x8e\x99\xda\xc1\x72"
+ "\xa6\x76\xa4\x9c\xe9\x6c\x31\x53\x43\x39\x53\xb3\xe5\x4c\x0d\xe5"
+ "\x4c\x6d\x51\xce\x2e\x3a\x88\x99\xb5\x87\xfc\x2d\x61\x76\x5e\x7c"
+ "\xfe\xb7\x38\x66\x0e\x96\x33\xb5\x03\xe5\xac\x44\x23\x80\x19\x94"
+ "\x33\x35\x5b\xce\xd4\x50\xce\xd4\x16\xe5\xec\xa4\x83\x98\x59\x7b"
+ "\xc0\xdf\x12\x66\xff\x14\xdd\xff\x51\x1c\xb3\x60\x07\xcb\x59\xb0"
+ "\x03\xe5\xac\x44\x6b\x8b\x59\x30\x94\xb3\x60\xb6\x9c\x05\x43\x39"
+ "\x0b\xb6\x28\x67\xeb\x1c\xc4\xcc\xda\xc3\xfd\x96\x30\xfb\x97\xe8"
+ "\xfe\xef\x62\x98\x31\x78\x81\x76\x14\xc4\xac\x95\xaf\x1b\x0d\xa0"
+ "\xe3\xf1\x37\x2f\x41\xbc\xde\xfa\xa2\x8a\x4e\x73\xf5\xc6\x58\x61"
+ "\x3d\x88\xf1\xaa\x48\x3a\x8d\x84\x74\x23\xfe\x2e\x06\xb8\x23\xfc"
+ "\x6d\x6c\xfd\x65\x09\x7a\x71\xbe\x18\x56\x1d\x7f\x0f\xcb\x5b\xc2"
+ "\x61\x65\xfe\x1e\xd6\xa9\x58\x7d\x2b\x15\xab\x0b\xb1\xf2\xb0\x52"
+ "\x2b\x3b\xc6\x4a\x3d\xcd\x3e\x56\x5f\xea\x38\xac\x2e\x5a\x60\x65"
+ "\xdb\x8e\x39\x8e\x95\x55\xfb\xf5\x9b\xc2\xea\xdf\x4a\x31\xac\x0c"
+ "\xde\xe3\x74\x78\xce\xfb\x14\xf0\xbe\xf4\x2b\xd1\xcf\x67\x5d\x42"
+ "\xc3\xb7\x5c\x42\x63\xf1\xfc\xe6\x43\x6b\x9b\x29\x78\xc7\x9f\xbe"
+ "\x3e\x5f\x8b\xda\x7e\xf6\xed\x87\xe7\xcf\x30\xf5\xe4\x6b\xbe\x6e"
+ "\x15\x31\x7a\xa6\x4e\xcc\x04\x8c\xca\x1b\x8a\x20\x26\x7d\xc2\xcb"
+ "\x1b\x3e\x46\xad\x2b\xa2\xd1\x37\xd5\xd7\x00\x17\xba\xad\xa2\xae"
+ "\x08\xed\x86\xf3\xc5\xab\x3f\x46\xa6\x9f\x03\xfa\xcd\x4d\x42\xd4"
+ "\x0d\xc5\xbf\xcf\x63\xef\x3c\x2a\x09\x29\x27\xd7\xd1\xcd\xe5\x75"
+ "\x5f\xa3\xf7\xe6\xa3\xe1\xa7\x93\x10\xc2\xb1\x66\xbc\xf2\x22\xec"
+ "\x95\x4f\xf2\xf0\xd9\x69\xe1\x95\x99\xf9\xb2\x89\x80\xcd\x4d\x2b"
+ "\x6c\xc0\x8b\x43\xac\xfb\x4c\x69\x00\x6c\x1a\xcc\xd8\x5c\x47\x29"
+ "\xcb\x30\x36\x3a\xce\x2b\xb3\xd8\xe4\xe1\x3a\x2f\xd1\xc2\x2b\xdf"
+ "\xb0\xc0\x86\x9d\xab\xca\xc3\xc6\xdc\x97\xf1\x7a\x00\xfe\x46\x6e"
+ "\xe3\x95\xe5\xf5\x65\x54\x8b\xce\x15\x61\xca\x11\x94\x91\x29\x50"
+ "\x8e\x92\x57\x32\xe5\x88\xc4\x7f\x60\x20\xf0\xbd\x10\x79\xea\xfa"
+ "\x84\x6f\x01\x0c\x5a\xa1\xac\xe1\xb6\x68\x3d\xbc\x27\xc6\x12\xe3"
+ "\x36\x65\x7f\x5b\xdb\x9c\x06\x44\x41\x9d\x75\x1e\x63\x67\xfc\xd9"
+ "\xd7\x2d\x0b\xda\xaa\x8a\x59\xdf\x03\x3e\xf5\xa8\x42\xcf\x62\xb3"
+ "\xf6\x7b\x74\x43\x71\x31\x9e\x7e\x2d\xa0\xdf\xc3\xc0\x53\x68\x7b"
+ "\xf0\x7a\x75\x2e\x50\xef\x15\xbe\xb7\x00\x69\x26\x27\xd2\xcd\xcc"
+ "\x58\x1e\x28\x63\xb8\x3d\xc3\xf5\x61\x79\xe2\x17\xc8\x98\x1b\x78"
+ "\xb4\xcd\x67\x9c\xee\xf4\x4a\x84\x70\x9d\x88\xb1\xe8\xb5\x8a\xc3"
+ "\x0e\xcf\xdb\xb3\xec\xeb\xb0\xa9\x0b\x17\x7d\x2d\x5c\xbe\x66\xe9"
+ "\x24\xf5\x77\xe4\xb1\xe5\x2b\x4f\x6e\x7f\x87\xb9\x3f\x0a\x30\xc4"
+ "\x73\xf5\xd6\x7f\x87\xa8\x9d\x92\x31\xfc\x8f\xe8\xfe\x27\xe2\x18"
+ "\x06\x29\x3b\xc6\xb0\x89\xc5\x30\x68\x5a\xc7\x18\xfe\xa0\xb6\xc5"
+ "\x30\x28\x84\xc3\xf0\xcb\x10\x0e\xc3\xa0\x70\x82\x61\xd0\x68\x0e"
+ "\xc3\x20\x4d\xc7\x18\x5a\x79\xe9\xdf\x14\x86\x3a\xfb\xfd\x1f\xc2"
+ "\x18\x3a\x50\x0e\x7f\x31\x63\xe8\x40\x39\xd4\xe9\x05\x30\xb4\x28"
+ "\x87\x5f\xa6\x5b\x60\xc8\x96\xc3\x20\x8b\x72\x18\xe4\x40\x39\xb4"
+ "\xf2\xd6\xbf\x29\x0c\x7f\x6c\x96\x8e\xa1\xda\x81\x72\xf8\x03\x8b"
+ "\xa1\xda\x81\x72\x78\xe9\xa8\x2d\x86\x6a\xcb\x72\xa8\xe3\x30\x54"
+ "\xb3\xe5\x50\x6d\x51\x0e\xd5\x0e\x94\x43\x2b\xad\xf2\x9b\xc2\xf0"
+ "\xbf\xa2\xfb\xbf\xdb\xc1\xd0\x81\x72\xf8\xb9\x19\x43\x07\xca\x61"
+ "\x4d\x92\x00\x86\x16\xe5\xb0\x44\x63\x81\x21\x5b\x0e\xd5\x16\xe5"
+ "\x50\xed\x40\x39\xb4\xf2\xde\xbf\x29\x0c\x2f\xdb\xef\xff\x17\xc4"
+ "\x30\xd8\x81\x72\xb8\x9e\xc5\x30\xd8\x81\x72\x78\x65\xac\x2d\x86"
+ "\xc1\x16\xe5\xb0\x44\xcb\x61\x18\xcc\x96\xc3\x60\x8b\x72\x18\xec"
+ "\x40\x39\xb4\xf2\xe2\xbf\x29\x0c\x7f\x12\xdd\xff\xca\x12\x43\xd0"
+ "\xd9\xb6\xba\xb4\x81\xc3\xd0\x12\x3f\x6b\x2d\x1a\x09\x1a\x15\x63"
+ "\x37\xcb\x80\x28\x5b\xfc\x7e\x32\x60\xfc\xd4\xf8\x7b\x5c\x23\xa7"
+ "\x49\x19\xec\xd8\xef\x39\x18\xb3\xd3\xe0\x42\xb1\x3e\x35\xeb\x51"
+ "\xfc\x4d\xb5\x5d\x8f\xc6\xfd\xff\xaa\x47\xaf\x22\xe9\xd8\xb1\xed"
+ "\xa0\x28\x76\xfc\xb6\x2f\x12\xda\x44\x71\xec\xae\x16\xd9\x62\xa7"
+ "\x0e\xe1\xb0\x23\xed\x1e\xc1\xee\x4b\x9d\xb9\xfd\x23\xd8\xb1\xed"
+ "\x9f\x5d\xec\x7e\xcb\xed\xdf\x35\xd1\xf6\xcf\xb8\x01\x51\xf9\x1b"
+ "\x4c\x85\x5a\xca\x54\x04\xbf\x62\xf8\x95\xc2\xb1\x5e\x70\x8c\x99"
+ "\x1f\x04\xff\x67\xce\x99\xfa\x31\x6b\x81\x15\x7b\xba\xc4\xe0\x3d"
+ "\x3d\x70\x9a\xde\xe6\x34\x9e\x69\x28\x74\x37\x9b\x07\x1c\x4f\x85"
+ "\xe3\xc5\xfd\x5d\x42\x7b\x43\xfa\x52\x3a\xeb\x6f\x38\x6d\x1f\x9c"
+ "\x96\x4e\x73\x25\x63\xe5\x28\x0a\xe7\x61\x7d\x4f\x37\x36\xcd\x60"
+ "\xcb\xfb\x7a\xa4\x85\xe2\x75\x40\xcc\x69\xfa\x9a\xa8\x1f\x0a\x70"
+ "\x3a\x93\x8b\x2b\x5e\x1f\x5b\x65\x99\x96\x9e\x80\x70\xbe\xe6\xb4"
+ "\xfd\xd8\xfc\x86\x5b\xa6\x31\xfe\x15\xa1\xfe\x2e\x2a\x26\xcf\xfe"
+ "\x89\x14\x7e\x27\x9c\xf6\x1e\xba\xff\x01\x15\x93\xde\xc5\x35\x80"
+ "\x97\xfe\x2d\xc4\xa4\x65\xd3\xb9\xd3\xbd\xff\x6f\x25\x9b\x8e\xd9"
+ "\xe3\x13\x8e\xb9\x5a\xc6\x8f\x4d\xe7\x61\x8e\x0d\x5e\x6f\xdc\xf2"
+ "\x5d\x8d\x1b\x28\x9c\x1f\x4e\xd3\xdf\xd4\xfb\x2b\x1d\xfb\x2e\xa3"
+ "\x2d\xef\x89\xd3\xc1\x75\x8f\xb0\x71\xf6\x84\x77\xd0\xb4\xe7\xa7"
+ "\xad\x4f\x37\xa7\x5b\x6f\x44\x83\x76\x73\xb1\x51\xd2\x59\x1f\xce"
+ "\xc2\x6b\x08\x5a\x63\xd7\xdf\xc5\x45\x87\xb1\xab\xa8\x43\x08\xa7"
+ "\xa5\xfb\x7f\xa8\x84\xf4\x5e\xec\x7b\x84\x92\xf7\x60\xd6\x5b\x21"
+ "\x58\x53\x86\x7b\x77\x31\xcf\xea\xa2\x62\x9f\x75\x00\xa4\x0b\x33"
+ "\xe7\x6b\xa2\x98\x7e\x0c\x36\xad\x2b\x93\xb6\x3c\x01\xaf\xa9\xdf"
+ "\x9e\xfe\x5e\x9c\xd6\x98\x75\x5c\x6d\x4c\x73\x0d\xb7\xce\xdf\xb8"
+ "\xc1\x0d\x9f\xb7\xcc\xdf\x9b\xa4\x3f\x14\x06\xe9\x27\xdb\xa6\x57"
+ "\x5a\xa7\xf7\x21\xe9\x3f\x0a\x85\xf4\x51\xb6\xe9\x0d\x03\xac\xd2"
+ "\x0f\x24\xe9\x8f\x8c\x85\xf4\xd3\x6c\xd3\xab\xac\xd3\xff\x8e\xa4"
+ "\xff\x87\x0a\xd2\x47\xdb\xa6\x0f\xb5\x4e\xef\x4b\xd2\x7f\xa2\x81"
+ "\xf4\xb3\x6c\xd3\xa7\x5a\xa7\x1f\x44\xd2\x1f\x1b\x0d\xe9\x63\xac"
+ "\xd3\xef\x66\xd2\xa2\x07\xd8\xb4\x7e\x24\xed\xdf\x43\x20\x6d\xac"
+ "\xc0\xbb\x2a\xd8\xbc\x43\xd8\xf4\xf7\x91\xf4\x1f\x1e\x85\xf4\xf1"
+ "\xb6\xe9\x5d\xad\xd3\x0f\x26\xe9\xbf\x9e\x06\xe9\x13\x04\xb0\xb2"
+ "\x4e\x3f\x84\xa4\xff\x2c\x0f\xd2\x27\x0a\x60\x65\x9d\x7e\x28\x49"
+ "\x5f\xac\x85\xf4\x2b\x05\x62\x6f\x9d\xfe\x7e\x92\xfe\x8b\x8d\x90"
+ "\x3e\x49\x20\xf6\xfc\xf4\x59\x25\x49\x90\x2e\x79\x17\xcb\x4d\xab"
+ "\xb8\x5b\xe7\x3d\x8c\xe4\xfd\x55\x02\x5c\x93\x6a\x9b\x1e\xb9\x90"
+ "\xf4\xe8\x51\x36\xfd\x03\x24\x7d\x69\x0c\xa4\xdf\x28\x10\xfb\x07"
+ "\x71\xfa\xdd\x24\xed\x83\x24\xed\x49\x6f\x48\x9b\x2e\x10\x77\xcb"
+ "\xb4\xc3\x49\xda\x2a\x04\x69\x33\x04\x62\x6e\x99\xd6\x9f\xa4\x3d"
+ "\x5b\x0a\x69\xb5\x02\xf1\xb6\x4c\xfb\x10\x49\x5b\x91\x0c\x69\x73"
+ "\x04\x9e\xf7\x01\x8b\xb4\x23\x48\xda\x73\x98\x57\xdb\x05\x70\xb1"
+ "\x4c\x1b\x40\xd2\x5e\x38\x08\x69\xf3\x04\x30\xb1\x4c\x3b\x92\xa4"
+ "\xfd\xb6\x06\xd2\xee\x11\xc0\xc4\x32\x6d\x20\x9d\x75\x7e\x3b\x5b"
+ "\x4f\x17\x58\xa7\xdd\xc5\xd5\xbb\x41\xa6\xfe\xff\x9c\xcc\xd6\x95"
+ "\xcc\xfa\x9e\xf4\x06\xbc\x96\x5d\xfb\x7b\x3d\x66\x6e\x23\x4c\x14"
+ "\x52\xd3\x59\x65\xa1\x70\x1d\xce\xf3\xa0\x6d\xdd\xe6\xfa\xd8\x2e"
+ "\xae\x8d\x08\xa6\xb3\x7e\xca\x60\xef\x5f\x68\x9b\xd6\xcd\x32\xed"
+ "\xc3\x74\x56\x75\x03\x9b\xf6\xa8\x6d\x5a\xa5\x65\xda\x51\x74\xd6"
+ "\x7f\x8a\xd8\xb4\x45\x02\xf5\xeb\xa3\x16\x69\x43\xe8\x2c\x5d\x32"
+ "\xa4\x3b\x21\x54\xbf\xd2\x1b\x54\x8f\xe2\xfa\xc0\x5c\x77\x43\xfa"
+ "\x47\x48\x7c\xaf\x86\x43\x7c\x99\x39\x7d\xe6\xb4\x80\xc3\xa3\x16"
+ "\x6d\xe5\xa3\xa6\xfe\x97\x42\xd9\x98\x95\xd8\x3e\x43\xaa\xe5\x33"
+ "\x3c\x46\xf2\xac\x71\x85\x3c\x4b\xad\x9f\x81\xad\x8f\xb0\x4e\xc0"
+ "\xf1\x1d\x6d\xcc\xba\x5c\x8a\xe3\x0b\x69\xcb\x78\x1a\x81\x72\x51"
+ "\xe0\x3c\x59\x6c\xc7\xd0\x59\xff\x8e\x66\x63\xc0\x6b\x8f\xa0\x3c"
+ "\x32\xf5\x21\xe0\x5b\x4a\xbf\xf5\xbb\x32\x48\xfb\x38\x9b\xee\xbc"
+ "\x75\x3b\xc8\x3e\xdf\x13\x70\xae\xaa\xbd\x0d\x74\x71\xad\x16\xd2"
+ "\x32\x89\x81\xe8\x9e\x6b\x8a\x06\xa2\x31\xda\xf7\xd5\x6a\x64\xea"
+ "\x1c\x53\x81\x5f\x4c\x64\x03\x6d\xb0\x3c\xb6\x95\xa2\x2b\x47\x35"
+ "\x20\x57\xbc\x06\x1f\xed\x13\xe6\xab\x83\xe3\x7a\xff\xfb\x42\x9a"
+ "\xb2\x1a\x86\xeb\x5c\xbe\x50\xe2\x35\x99\xe0\xdf\x21\x3a\xf4\x1a"
+ "\xb3\x1f\xca\xd6\x0d\x74\x33\xde\xa7\xc0\xf8\x4e\x7d\x54\x85\xa9"
+ "\x0e\xaf\xa5\xd8\x0c\x79\x34\x5f\x49\x44\x0a\xbc\xa7\x1c\x5e\xd7"
+ "\xb5\x22\xa9\x0e\x5d\x51\x34\xac\xa2\x97\xc6\x8f\x85\x67\xd0\xc2"
+ "\xfd\x62\x2f\xc1\xff\x49\x4c\x41\xfb\x6a\xeb\x13\x8a\x97\xe3\xf5"
+ "\xe9\x1a\x4e\xea\x7d\x22\xb4\xf4\x9b\x33\x6b\x13\x53\xd0\xfd\xf0"
+ "\xdc\x27\xcc\x6b\x51\x31\xeb\x4f\xfd\x12\xff\x34\x59\x7b\xaa\x71"
+ "\xa2\xc9\xab\x3e\xc1\x66\xed\xa9\x3d\xd3\x43\xc8\x7a\x56\x8d\x4c"
+ "\xde\xf0\x6c\x95\xf4\x70\xbf\x70\x53\xeb\xc6\x54\xbc\xff\x5b\x71"
+ "\xca\x35\x74\x89\x3d\x87\xf3\x64\xf3\xf2\xc1\x79\xe0\xbc\xcc\xf9"
+ "\xe0\xeb\xf4\xc3\xa6\x87\xe0\x77\x87\x38\x84\x3b\xbe\x7e\x55\xa3"
+ "\x2b\x5e\xbf\xca\xf1\xf4\x0d\x27\x70\x7a\xe1\x75\x79\x41\xe3\x64"
+ "\xd7\xa7\x37\x65\x35\xe6\x81\x56\x35\x90\xb8\x37\xee\xd7\xb9\x28"
+ "\x62\xd9\x7f\x1f\xd5\xb9\xf4\x66\xf1\x68\x2c\xd6\xb9\x1c\x4b\x64"
+ "\xff\x5d\x66\x5e\x2f\x4c\x30\x5f\x65\xfd\x2c\x88\xf7\x4a\xd3\x7b"
+ "\xd1\x6e\x58\x5b\x93\x75\x4b\xeb\x67\xa9\x86\xe2\xf5\x9c\x6f\x47"
+ "\xc1\x3d\x57\x92\xb8\xdc\x1e\x09\x7f\x3d\xd9\xbf\x7a\xf6\x2f\x8d"
+ "\xd3\x30\x5c\xf2\x9e\x18\x4e\x6b\x83\x34\x64\x2f\x98\xdb\xcc\x5a"
+ "\x65\x0c\x76\x80\x2f\xed\x15\xa4\x61\xf2\xcd\x8d\xd0\x5a\x3e\x03"
+ "\x36\x4b\x21\x8f\x3c\xfa\xd8\xe8\x31\x8f\x3f\xa1\x79\x72\xde\xfc"
+ "\x57\x62\xe3\x16\xbc\x1a\xbf\xf0\xff\xb1\xf7\x3e\x70\x51\x56\xd9"
+ "\xc3\xf8\x99\x3f\xc8\xa8\x28\x03\x91\xa1\x99\x8d\x86\x85\x25\x3a"
+ "\xb5\xb6\x6b\x2e\x26\x25\x16\x26\x08\x29\x15\x25\x0a\x24\x28\x24"
+ "\xea\x04\xa8\x68\x28\x38\x6a\xd9\xa6\x32\x10\x19\x26\x02\x16\xbb"
+ "\x6b\xad\xfb\xcd\xfd\x7e\xdd\x77\xdd\xf7\x63\xdb\x14\x64\xd4\x0a"
+ "\xc3\xee\xd7\x3e\x2f\xbb\xaf\xbb\x4d\x7e\xc9\x25\xbf\xa8\x53\x8c"
+ "\xce\x24\x33\x73\xdf\x73\xee\x7d\x1e\x66\xe6\x61\xb0\x7a\xb7\xf7"
+ "\xfd\xfe\x3e\xbf\xb7\xd1\x87\xe7\x79\xee\x3d\xf7\xdc\x73\xcf\x39"
+ "\xf7\xdc\x73\xef\x73\xff\x3c\xb3\xa6\x78\xed\xba\xf5\xa6\x67\x4b"
+ "\x4a\xcb\x36\x6c\xdc\x54\xbe\x79\x0b\xc1\x0d\xd2\x7b\x30\x59\xe5"
+ "\x54\x03\xca\xee\x41\xca\xe7\xb7\x3c\x6f\x0c\x13\x72\xbe\xda\xa2"
+ "\x35\x84\xf6\xe1\x6d\xa8\xf1\x74\x9e\x47\x9f\xc6\xa5\xa2\xf3\x45"
+ "\x50\xcf\x54\xb6\x86\x87\xad\x74\x86\x59\x8f\xe6\xaa\xb3\xd3\xf1"
+ "\xb0\x95\xce\xdc\x6b\x8d\xed\x85\xb8\x29\x74\xce\xd9\x55\x3b\xc5"
+ "\x37\xdd\x0e\x40\xab\x57\x42\xe1\x9c\xa2\x87\xd8\x97\xc7\x31\x47"
+ "\xdd\x38\xd6\x47\xf8\xeb\xf6\xb3\x5e\xc7\x73\x85\xb0\x0f\xdf\x51"
+ "\xd7\xf5\xe7\x35\xae\xdf\xb6\x4e\xe4\x67\x12\x4d\x6c\xdc\xcf\x7a"
+ "\x76\x8e\x63\x3d\x3b\xf6\xb3\xbe\xa6\x71\xcc\x1e\x57\x07\x11\xae"
+ "\x7d\xae\x42\xbb\xe6\x2a\x97\x4d\x35\xc6\xfb\xc6\x5e\xcd\xad\xc6"
+ "\xb8\x99\x1e\xd0\x34\xe1\x3b\x86\x39\x5b\x0d\x82\xee\xb7\xbf\x72"
+ "\x87\x21\xbe\x54\x36\x50\xac\xda\x87\xf9\x08\x99\xb8\xfe\xd2\x86"
+ "\xad\x3f\xe6\xe7\xb0\xb9\xcf\x81\x5d\xe3\xea\x6e\xba\xca\xf3\x8b"
+ "\xb4\xd5\xf7\x01\xe1\xfb\x97\x12\x77\x58\xe9\x04\xe6\x41\xd8\x13"
+ "\xbe\xe7\x8a\x55\x08\x53\x87\xb8\x9d\x81\xe5\x89\x5f\xb5\xb6\xcc"
+ "\xb0\x6e\x43\x71\xf1\xb4\x51\x10\xcf\xef\x10\x78\xfe\x5e\x19\xe2"
+ "\x83\x97\xf7\xb3\x36\x2c\xa7\x15\xcb\xdb\xde\x81\xbd\x05\xd4\x0f"
+ "\xc0\x32\x59\xce\x6b\xdc\x09\x18\x7e\x12\x9f\x4f\x22\xed\xed\xfc"
+ "\x3c\x2f\xed\xc8\x27\xd9\x3e\x57\x0f\xd2\xd9\x4e\x67\x14\xd0\x7e"
+ "\x8a\xfd\x9b\x32\x55\x58\xee\x3a\x84\x6b\x37\x4c\x80\xa9\x98\xee"
+ "\xb7\x48\x47\x0b\x3e\x13\x7c\x1e\xc9\x11\xe1\xdb\x78\xb9\xb4\x23"
+ "\x17\xd2\x3b\xf2\xca\x7a\x68\x1c\xdb\xe3\xda\xe7\xb6\xd0\x7e\xab"
+ "\xfc\x8c\x18\x7c\x47\xbe\xb4\x23\xac\xa5\xbf\x32\x53\x45\x67\x55"
+ "\x36\xf9\x71\xe6\x12\x4d\x44\x07\xf5\x5d\xff\x88\x9e\xa0\x6f\x20"
+ "\x0b\x12\xdc\xa0\xfa\x63\x0f\x40\xc3\x7e\xd6\x8c\x57\x03\x5e\xf5"
+ "\x1f\x63\xdc\x47\x78\xb5\x63\xf8\x69\xbc\x7f\x8c\xf7\x8f\x7a\xf8"
+ "\xb7\xd0\x58\xa2\xbb\xb4\x82\xf5\xce\xac\x87\xdb\xf8\x59\x98\xdb"
+ "\xe0\x89\x73\x5a\xdd\x31\xa2\x9d\xf6\x56\x66\x63\xbf\x8e\x0b\xde"
+ "\x03\xf6\x5a\x3d\x60\x3c\xde\x8f\xf2\x7b\xe0\xa5\xb9\xe6\x04\xcd"
+ "\x40\x8c\x78\x1e\xc8\xc6\xf7\x9d\xd2\x33\x5a\xc4\x81\x8a\x6f\xbc"
+ "\x94\xf8\x86\xbb\x34\x03\xbd\xdf\x1a\xf6\x5b\x5d\x23\xe3\xbe\x5d"
+ "\xbe\xde\x66\xd0\x60\x5d\xd6\x82\x31\x38\x0e\x74\x22\x0c\xdb\x2b"
+ "\xfe\xae\xb5\x8b\x7b\x58\x04\x5e\xc8\xa7\x11\x88\x7f\x44\x8a\x08"
+ "\x1b\x91\x89\xf7\x06\xbc\x8e\x04\xe7\x3f\x12\xd3\x8f\x4c\x24\x79"
+ "\x0e\xa0\xbd\x27\x59\xda\x35\x6e\x27\xc9\xa8\x5a\xe8\x96\x8a\xe6"
+ "\x3b\x60\x98\x03\x75\xab\x61\x50\x7f\x34\xd7\x3e\x0f\xd6\x9f\x6b"
+ "\x5d\x0a\xfd\xb1\x90\x3d\xc2\x74\x89\x4d\x42\x5f\x4e\xf6\x3f\x97"
+ "\x8f\xef\xd7\xce\x20\x9e\x93\x86\x15\x84\x63\x80\xf7\xc9\xaa\x2f"
+ "\x00\x8c\x29\x04\x2d\xd9\x97\x3e\xcd\xc0\x54\xd2\x59\xca\x5b\xca"
+ "\x57\xd0\x82\xf4\x61\x58\x33\xd1\xb7\x1e\xf1\xe2\x7b\x0b\xc2\x35"
+ "\xdb\xe0\x2b\x99\x36\x9e\xe6\x67\xcf\xa0\x3e\x4a\xf4\x12\x4e\x4a"
+ "\xc7\xfc\xe5\x72\x50\x1a\x29\xef\xbf\x60\xb8\x11\x6d\x14\x54\x7e"
+ "\x09\x1a\x9b\xc7\x0e\xa4\x93\x74\xb7\x79\x8c\x58\x97\x52\xc0\x47"
+ "\x6d\x5d\x2c\x18\xb1\xbe\x8d\x3c\xa7\x19\x38\x39\xa3\x02\x8c\x84"
+ "\x8f\x6c\xb8\x5d\x33\x50\xd5\x44\x75\x51\xe0\xfa\x13\xf0\xbd\x17"
+ "\xdd\x8e\x8f\x4d\xc0\xf3\x69\x24\x7a\x30\x3e\x20\xdf\x3a\x1b\xf6"
+ "\x82\xaa\xb7\x88\xb2\x62\x5e\x2d\x98\xfe\x18\x95\x9d\xf8\x89\xf1"
+ "\x27\xce\x6b\x3c\xb1\x14\x47\xe7\xab\x48\xe5\x69\xa1\xb5\x19\xc4"
+ "\x0f\x82\xa7\x33\x21\xc5\x9e\xb2\xee\xb9\x9c\x6f\x98\x9e\xe4\xc1"
+ "\x30\x0f\xc2\x51\xe9\x61\x1e\x86\xf6\xe8\x8d\x2d\x74\x8e\x80\xb7"
+ "\x26\x58\x3e\x1e\x53\xa0\x7c\x30\xdd\x31\x4c\xdf\x46\x6d\x30\xd9"
+ "\x13\xcc\x33\x92\xce\x40\xc3\x30\x8b\x6f\x1f\xe2\xd8\xe8\xe6\xe3"
+ "\x40\x88\x67\x3b\xd2\x62\x21\x3c\x48\x4f\x9b\x84\xeb\x24\xed\x37"
+ "\x19\x28\x6b\x09\x5f\x0b\xc9\x9c\xd7\xe7\x2d\xbc\x4c\x68\xbb\xbc"
+ "\x8f\x36\x8a\xb8\x13\x08\x73\x82\xa1\xc8\xd9\x73\x59\xd2\x59\x6b"
+ "\x3c\xee\x78\xe5\xd7\x5c\xbe\x6d\xe2\x9c\x42\xef\xb3\xa5\x5b\x59"
+ "\xaf\x9f\x6e\x6f\xbc\xbc\xaf\xba\x44\xf7\x71\xca\x8f\x6d\xca\xe6"
+ "\xed\x28\xe5\x41\xe9\x25\x7c\x5a\xc2\x27\xf3\x6a\x06\xd2\x21\xf8"
+ "\xe5\x99\x8d\xe1\x2d\xa4\x8b\x9c\x6f\x68\x47\xfb\x2b\x49\x17\xbd"
+ "\xd3\x31\xfd\xc9\x7d\xf4\xbe\x89\xde\x3d\x56\x6e\x63\x07\xe3\x3d"
+ "\x65\x14\x6f\xeb\x45\xb9\xad\x41\x5d\xf2\x01\xdc\x16\x03\x46\xa7"
+ "\x99\x97\xed\xa8\xf3\xb9\x64\x55\xab\x07\x80\xe8\x44\x1e\x9d\x40"
+ "\x5a\xcf\xa0\xed\x8f\x21\x5a\xd1\x5e\x1f\x67\x6f\x64\x01\xd1\x8c"
+ "\xf6\x4c\xa2\xcf\xb7\x40\x92\xfd\x71\x2a\x23\xf1\x73\x86\xb0\x7d"
+ "\x18\xc7\xbe\x20\xda\xfd\xe5\xf6\x19\x02\x79\xcc\xcb\x8d\x72\x20"
+ "\x79\x91\x5c\xfc\x38\xbd\xa4\xfb\x16\xc4\x75\x54\xbc\x0b\xdd\x20"
+ "\x5e\x5b\xc6\xb1\xd3\x04\xef\x87\x65\x4f\x52\xdc\x36\xcc\x7b\xa6"
+ "\x89\x9f\xef\xa6\xa2\xbd\xf1\x11\xef\x51\x3a\xef\x13\x71\xd0\x19"
+ "\x9c\x28\x73\xf6\x6b\xd2\x47\x7c\x3f\x2d\xd1\x7d\x14\xdb\xf3\xe9"
+ "\x78\x25\xfa\xeb\x3f\x3b\x14\xac\x5f\x3e\x65\xfd\x27\x79\x5b\x7c"
+ "\x95\x29\x20\x9d\x75\x6c\xb8\xa4\x61\xf7\x49\x6d\x87\x24\x6b\xb6"
+ "\xb7\x15\xeb\x8b\x1f\x07\x8b\x51\xc8\xfa\x04\xd7\xc7\x4d\xa9\x2a"
+ "\x2a\x33\xa6\x3d\x21\xf0\xf8\x78\x99\xb9\x3e\x99\xb9\x0e\x9c\x66"
+ "\x9b\xb0\x9c\x83\x7a\xe0\x33\x49\x72\x3e\xad\xe0\x89\x6c\xbb\x4e"
+ "\xd2\x39\x5d\x64\x93\xd0\xc7\xbd\xdf\x35\xe0\xb7\x4b\x24\x7b\x1f"
+ "\x97\x3d\x8b\x6d\x12\xed\xad\x64\xb7\x7c\x22\x7e\x5c\x90\x0e\x53"
+ "\x99\xd2\xb8\xfe\x12\x2d\x95\xd9\x44\xcb\x09\x4e\x47\xa5\x01\x30"
+ "\xae\x8d\xf2\x47\x5c\x19\x52\x7d\x95\x71\xc5\x11\xae\x1d\x68\xab"
+ "\x88\x26\xcc\xfb\x18\xb7\x7f\x0f\x51\xbb\x0c\x53\x25\xda\xdb\xdd"
+ "\x66\x4a\x3b\x10\xfb\xb5\x9a\xa7\x6d\x47\xb8\x3d\x6e\x71\xce\xc1"
+ "\x28\x4c\x7f\xc4\xf0\x34\xc1\x6b\x77\x92\x8d\x36\x3c\xc5\x9f\xd7"
+ "\x1a\x1e\x47\x5d\xbd\x00\x5a\xc4\xa7\x23\x1d\x95\xf5\xa2\x4f\xab"
+ "\x5d\x4e\x7d\x06\xe4\xf5\x51\xf4\x91\x8e\x10\xbf\x49\x97\xd1\x47"
+ "\x9a\xe5\xaa\x85\x3d\xb2\xde\x62\x3e\x0d\xc4\x7b\xe1\x63\xc0\x9f"
+ "\x50\x8f\x4f\x0c\xea\x16\xbe\x4b\x7c\x3c\x82\x7c\xd4\x61\x7e\x8f"
+ "\x4a\xe5\x3a\x82\xf0\x7a\x7c\x7f\x40\xa2\xbd\x5e\x82\xbf\x28\xcb"
+ "\x41\xaa\xab\xa7\xf7\x91\xfd\xe5\xfe\x87\x6a\xa7\x94\xb6\x45\xe4"
+ "\xa5\xda\x25\xc3\x92\x8f\xc8\xcf\x2c\xc3\x30\xb2\x83\x33\x51\xf6"
+ "\xdc\xf6\xd1\x59\xb8\x52\x18\xd5\x1d\x91\x87\x36\x81\xeb\x21\xfa"
+ "\x3d\x83\x7a\x54\xab\xca\x56\xd8\x27\xb2\xc5\x96\xce\x9d\xe2\x4c"
+ "\x08\xd2\x25\xb2\xa9\xd4\x37\x41\x7c\xb3\xa4\xfa\x23\xd1\xac\xfa"
+ "\x28\xd8\x4f\xd2\x8e\x47\x5d\x49\x08\xc0\x7d\x22\x54\x3b\xd7\x24"
+ "\x6c\x60\x83\x48\xa3\x1e\x29\x95\xed\xa8\x28\x9b\xf4\x4e\x7c\xdb"
+ "\x46\x7c\xd3\x74\x04\xf0\x11\xf9\xa6\xb9\x4f\x82\x3f\x41\xb6\x7c"
+ "\xb0\xbe\x6a\xd5\x1b\xe4\xba\x3c\xc4\x5e\x68\x35\xd3\xa8\x3e\xf8"
+ "\xe9\x52\x67\x28\xec\xc5\x89\x90\xf6\x42\xab\x36\x48\xe5\x6d\x56"
+ "\xd4\x8d\x16\x51\x37\xa4\xb6\x05\xe5\xd0\xe9\x94\xcf\xe6\x70\xcf"
+ "\x25\xfb\x49\x79\x07\xb6\x41\x8d\x82\xaf\xa2\x2e\x6b\x35\x37\x0e"
+ "\x95\x83\xba\x27\xb0\x3e\x93\xac\xc9\x26\x10\x0e\x92\x29\xf7\x2b"
+ "\x31\x4c\xc8\x55\x4d\xfe\xad\x25\xd0\x46\x23\x6c\x9d\x8f\x61\x7d"
+ "\xd1\xaa\x7b\x83\xea\xa2\x56\x9d\x29\xd5\x45\x39\xef\xdf\xa3\x8c"
+ "\x8c\xfe\x7c\x35\xd9\x8a\x7c\x49\x36\x6d\x7c\xef\x65\x2e\x1f\xcd"
+ "\xcf\xe5\x36\x8d\xe0\x31\x6d\x39\xa6\xb1\x28\xda\x47\x0b\xd1\x87"
+ "\x79\xe9\xb8\xcd\xda\xcf\x6d\x45\xb9\x8b\xd3\xa3\xa9\x6b\x92\xda"
+ "\x09\x0c\x33\x4a\x61\xb9\x52\x5b\x22\xeb\x4d\x98\x82\x26\x47\x48"
+ "\xff\x08\xf1\xcb\xfe\x11\xc7\x35\xc0\x71\x39\xa5\xf2\x51\x58\x82"
+ "\x08\x53\x9d\xa4\xb0\x7d\x82\x0f\x75\x6c\x13\x0f\xcb\x95\xda\x2b"
+ "\xaa\x5f\x6a\xbb\x16\xba\xa8\x8e\xd1\xbb\x5d\xab\x4d\x21\xfc\xb6"
+ "\xaa\x6b\xd4\x87\xa8\xc7\xb8\x62\xb2\x07\x64\x2f\x0c\xab\x84\xdd"
+ "\x30\x2c\xe6\xf7\x57\xc8\xee\x90\x1f\x42\xf1\x08\x97\x4d\xb6\x08"
+ "\xc3\xdf\x34\x3c\x82\x7e\xc1\x7f\xea\x10\xaf\x76\x8f\x94\xf6\x1d"
+ "\xee\x2b\xfc\x67\x8a\x46\x0e\x93\xd3\x61\x5d\x5f\x4b\xe9\x28\xbd"
+ "\x6c\xbf\xc8\x76\x79\xc8\x36\xf1\xfc\xc2\x54\x92\x8e\xf3\x7e\x83"
+ "\xec\x17\x0d\xa8\x03\x60\xe9\xbc\x02\x6e\xd3\xc2\x52\x85\x3d\x0b"
+ "\x9b\x4b\x69\xb9\xfc\xd0\x56\x6e\xfb\x9a\x7d\xd6\x54\x02\xda\xc6"
+ "\xaf\xb8\x8f\x95\x28\xe8\x0c\xab\x17\xe5\x08\xcb\xe3\xe5\x10\x36"
+ "\xd5\xc2\x69\x41\x98\xc6\x6b\x3c\x6e\x2b\x95\x85\xe2\xaa\x03\xe2"
+ "\xe8\xcc\x10\x8c\x3b\xc0\xe9\x52\xa4\xf3\x0d\x14\x0e\x81\x6f\x12"
+ "\x67\xdf\x92\x3e\x48\xb6\x77\x44\xac\x44\xe7\x27\xb2\xdd\x45\xbe"
+ "\xe4\x93\xed\xe5\x71\xab\x24\x98\xc5\xd2\x9d\xdb\xf7\x11\x61\x82"
+ "\xaf\xb1\x6a\x89\xdf\xc5\xa2\x1c\x23\xc6\xf3\x7e\xf6\x7f\x66\x21"
+ "\x6f\xc3\x3c\x32\x6f\x03\x9f\xa9\xfe\x60\xfe\x7a\x7a\xe7\x7a\x5f"
+ "\xc1\xfb\xb0\x0d\x04\x43\x34\xf1\x36\x42\xab\x75\x2a\x7d\xea\xf3"
+ "\x5a\x5d\x0d\xb5\x4b\xdc\x57\xd5\xea\x9e\x95\xc6\x80\xc0\x5a\xf2"
+ "\x3a\xb6\x0b\x23\x4e\xca\x36\x86\xb9\x52\x80\xf6\x2c\x47\x5a\xde"
+ "\xa1\x30\xda\xe3\x3e\x10\x86\xec\xd3\xdb\xd7\xec\x12\xce\x11\xf5"
+ "\xb2\xdd\x20\x5b\xd2\xe9\x3c\x27\x7c\x3a\x6d\x78\x4a\xa3\x64\x4b"
+ "\x2e\x69\xc3\x17\x06\xf9\x61\xf8\x1e\x6c\x33\x74\xcb\x95\x36\x03"
+ "\xfd\xe6\x9d\xae\xda\xf0\x89\x41\x7e\x00\x86\x5d\xdf\x76\x8c\x70"
+ "\x50\x1d\xa5\x33\x8b\xb8\x7d\x2a\xe1\x79\xfd\x46\xa6\x99\xec\x66"
+ "\xff\x73\xd2\xf8\x85\x56\x97\x46\xbe\x9a\x22\xbf\x3d\x41\xb6\x93"
+ "\xf2\x93\xf1\x69\x81\xce\xbd\x41\x3e\x7c\x45\x38\xb3\x25\x3b\xdf"
+ "\x1c\x64\x2b\xa5\x36\x8c\xec\x64\x50\x5b\x85\xef\xc1\x6d\x95\xee"
+ "\xbe\xa1\x36\x52\xa7\xfb\xf6\x6d\x55\xb8\x9d\xec\x96\x6c\x23\x83"
+ "\x6d\x81\x2e\xa2\x31\xd0\x97\xd5\x86\xd7\xc9\xbe\xac\xdf\x8e\x86"
+ "\xc7\x91\x8d\xc2\xfc\x4f\x48\x79\xef\xb4\x6b\xae\xee\x96\xf3\xb6"
+ "\xa3\x9c\x3b\x0d\xa8\x9b\xfb\x5c\x0e\x7c\x2e\x94\x7c\x40\x5e\x37"
+ "\xaf\xd1\xd9\x1f\xda\xb0\x63\xa8\x7f\xa3\x48\xcf\xac\xeb\xbe\x82"
+ "\x1e\x7f\x5b\xd1\xd6\xbf\x5e\xe6\xef\xc8\x1b\x03\xfd\xc2\x43\xfb"
+ "\xd9\x6e\xcc\xa7\x2f\xb0\x8c\x7b\x31\xac\x5a\x1a\x43\xe0\xbc\x25"
+ "\x5c\x5a\x9d\xb5\x69\x7f\x70\xd9\x44\x39\x74\x4e\x2a\x07\xf5\x89"
+ "\x30\xff\xe3\xe4\xf7\xd0\xb9\x65\x58\x6f\x66\x37\xc9\x3a\x8f\x7e"
+ "\xd1\xd7\xe6\x40\xff\xca\x5d\x47\xb6\x52\xea\x7b\xb6\xa3\xbf\x13"
+ "\x34\x26\x96\x36\x3f\xc3\x60\x2a\x29\x5a\x57\xb6\xea\x1e\x43\xd1"
+ "\xba\xa2\xb2\xa2\xbc\xe2\xa2\x2d\x79\x65\x45\xeb\xd7\x4d\x5f\x9b"
+ "\xb7\xba\x68\xa5\x61\x53\x5e\xa9\xc1\x58\x3e\xb5\x7c\x14\xf8\x41"
+ "\xe7\x18\xf2\x4a\x4b\x37\xac\x2d\xc8\x37\xac\x2b\x5a\x99\x50\x52"
+ "\x50\x5a\x50\x66\xc8\x2b\x59\xbf\x61\x5d\xbe\x61\x6a\xfe\x8c\xa9"
+ "\xc6\x1f\xe7\x8f\x0a\x1c\x43\x9b\xa2\x87\x3e\xdf\xd5\x2f\x7a\xab"
+ "\xaf\x82\x2e\x52\x65\x2a\x89\x2c\x2f\x5a\xc7\xc7\xed\xb4\xa3\x96"
+ "\xcf\xac\x03\x13\x9d\x39\x4e\xe7\xcc\xb2\xda\x91\x26\xbc\x6b\x09"
+ "\x0e\xcb\x69\x68\xa2\x73\xc7\xc7\xb1\x89\xae\xda\x51\x06\xbb\x76"
+ "\xac\x8e\x9f\x21\x8b\xe1\x58\xb6\x89\xec\xea\x47\xbd\xe8\xb3\x99"
+ "\x68\x7e\x76\xd3\x55\x88\xb1\x6c\x04\x2d\x5e\x11\x78\xe9\xe9\x4c"
+ "\x72\x4c\x93\x69\xd7\x8e\xe6\x63\x92\x76\xed\x28\xa7\x23\x2a\xbe"
+ "\x97\x59\xe2\xc5\xf9\xe3\xda\x51\x5f\xca\x63\xcd\xe9\xbb\x20\x9d"
+ "\xf4\xf3\x9c\x76\x94\x83\xcb\x0a\x75\x99\xc6\x5f\xfb\xff\xf0\x60"
+ "\x12\xfa\x83\x67\xad\x13\x78\xdc\x97\x4e\x35\x44\x20\x5d\xda\xd6"
+ "\x0a\x23\xbc\x8c\x79\x95\xc6\x32\x86\x79\x9c\x90\xc7\xd3\xe8\x9c"
+ "\x78\x2c\x4b\xb7\x54\x8e\x83\xbc\x1c\xfb\x59\x5c\x5d\x34\xd2\x57"
+ "\xcb\xe9\xe9\x91\xcb\x80\x74\x77\x23\x4d\x29\x74\x4e\x3c\xd1\x15"
+ "\x6a\xac\x8f\xc6\xbb\xce\x6b\x47\x27\xf8\x36\x22\xdf\x26\x89\x73"
+ "\x8f\xaa\x1b\x45\xfd\xc3\x72\xe5\x37\xe1\xf3\xbe\xaf\x20\x62\x2f"
+ "\x9d\xbd\x6d\xbe\x95\x75\x38\x3d\x60\x2b\xec\x86\xc8\xcd\xcc\xc1"
+ "\xfe\xdb\x17\xbd\xa2\x4c\xa3\xb3\xc8\x36\xfc\xdb\x33\xdd\x5a\x2a"
+ "\x13\xb6\x15\x11\x74\x8e\xf3\x30\x63\x8b\xda\x97\xc7\x31\x27\x3b"
+ "\x18\xe8\x73\x8d\x7e\x8f\x78\x42\xfe\x56\x3f\xb6\x53\xae\xda\xd1"
+ "\x47\x30\x6f\x90\x7c\x63\x27\x1b\xc8\x0e\xf0\xa5\x46\x93\x9e\x39"
+ "\x87\xc1\xad\x93\x71\xd3\x99\xde\x94\x46\xc8\x3f\x22\x01\xd3\x38"
+ "\xfc\xf8\x23\x74\x4a\xfc\x84\x13\x9f\x1d\x72\x3e\xbc\x1f\xae\x1d"
+ "\x4d\x3e\x81\x03\x75\xd9\x31\x4c\x7e\x71\xb5\xfb\xd9\x19\x1b\x86"
+ "\x57\x7f\x0d\x5a\x84\x3d\xd3\xb4\x9f\xe3\x2f\xb4\x6b\x47\x9e\x26"
+ "\xfc\x3b\xc6\x01\xec\x44\x98\xfe\xda\xd1\x40\xe3\xbb\x18\x87\xf5"
+ "\xdf\xe5\x56\x8e\x5b\x4b\xfa\x3c\x47\xa1\xcf\x49\xb5\xe4\x13\xd6"
+ "\x21\x7e\xd4\xa1\xea\x2b\x40\x7d\xed\xd3\x33\xea\x20\x9e\xf2\xc1"
+ "\xe7\x2e\x1a\x0f\x41\x9c\xdd\x72\x7e\x0c\xf5\x7f\x9f\x4f\x8c\xc1"
+ "\x48\xba\x35\xdd\x56\xde\x4b\xdf\x27\x58\x2b\xda\x77\xa2\x91\x74"
+ "\xcc\x55\x3b\x26\x42\xd6\x29\xd4\xf5\x33\x5c\xaf\x62\x20\x9e\xd5"
+ "\x46\x58\xe8\x8c\x6f\xd2\xab\x46\xd4\x27\xd2\x2b\x84\x9d\x2d\xeb"
+ "\x14\xea\x5a\x17\xc1\x21\x0d\xa3\x8e\x6d\x49\xd2\x92\x8d\xec\xd1"
+ "\x8e\xf9\x35\xe9\x18\x7b\x75\x51\x37\xbb\x69\x99\x38\x8b\x1d\xc3"
+ "\x6c\x6e\x21\x03\x3f\xdf\xc7\x54\x05\xf0\xbd\x0b\xf5\x78\x14\xf1"
+ "\x99\x8f\x55\x23\x3c\xd2\xd6\xc5\x7d\xf1\xad\x28\x03\xde\x56\x8d"
+ "\x29\xa6\xf4\x12\x0f\x4f\xfb\x79\x38\xa6\x3d\x14\x0f\x15\xbc\xe3"
+ "\xe7\x46\xb3\xda\x31\x67\xa8\xae\x60\x1a\x8f\x7c\x66\x74\x28\x59"
+ "\x62\x1e\x5a\x6d\x1d\xe8\x28\x8f\xb6\x18\x82\x1f\x3b\x5d\xce\xa3"
+ "\x1a\x79\xed\xa8\x2c\xbc\xae\x3e\xb7\x35\x03\xd0\x98\x38\xa5\x8f"
+ "\x8b\x21\xfe\x8e\x2d\xf6\xa7\x67\x4e\x65\xfa\xa9\x2b\x83\x68\xe5"
+ "\x17\xab\x1d\x5b\xf5\xb2\x74\xa6\x36\xa6\x3f\x7a\x3d\x7a\xe3\x0c"
+ "\xa2\x9d\xb4\x4e\x21\xfd\x1e\xfb\xb9\x0d\x3d\x03\x0a\x93\xde\xcf"
+ "\xf4\x63\xdb\xa3\x1c\xdf\x1f\xf6\x7b\x83\x36\x72\x6a\xd0\xf7\x06"
+ "\x6d\x64\xcc\x70\xdf\x1b\x82\xf3\x8d\xcc\xa3\x7c\x7d\x4d\x99\x2a"
+ "\x7f\xde\x91\xa9\xbe\x10\x79\xcb\xe9\x67\x34\x07\xf4\x67\xb4\x91"
+ "\xbf\x21\x1a\x3a\xb1\x9d\x62\x37\x67\xaa\x18\xe2\x69\xe3\xbe\x45"
+ "\xe4\x31\xe1\xbf\x90\x5f\x14\x69\x21\x18\x65\x39\x06\x7f\xba\x18"
+ "\xb2\x1d\xf0\x35\x7f\x09\x7b\x08\x68\x65\x12\x18\x0a\xe5\x68\x75"
+ "\x10\x30\xb0\x10\x2f\x11\x00\x93\x39\x3c\xc3\x9f\x08\x92\xde\x1d"
+ "\xfc\x45\x3b\x08\x3f\x18\xff\x4f\xfc\x46\x0a\x7a\x39\x3e\x37\xa8"
+ "\xa4\xfc\x76\x07\x40\x24\x5f\x27\x35\x03\x39\x49\xa8\x1f\x79\x99"
+ "\x55\x99\x61\x88\xef\x08\x07\x66\xcc\x23\xe1\x97\xdf\x59\xe0\x3b"
+ "\x85\x04\xbf\xe3\x4f\x93\x1d\x90\xc1\xad\x9a\x7c\x3e\xcd\x2a\xce"
+ "\x3e\x18\xa4\x6e\xd6\x07\x66\xa9\x87\xaa\x30\xfe\x10\x49\x7f\xdc"
+ "\x88\x2f\x1e\xe3\x27\xb7\x0f\x02\xdc\xe0\xdc\x1e\x00\xfe\x47\x41"
+ "\xfe\x6d\xb1\xd7\x29\xe3\x77\xfd\x4d\x0a\x78\xbe\x55\xdc\xa6\x74"
+ "\x7f\x8f\xf8\xaf\xff\x33\x74\x8d\x94\x1f\xfd\xea\x71\x5b\x6e\x28"
+ "\x50\x3f\xff\x6f\xb3\xca\x41\x81\x1a\xea\x8f\xbf\x23\x31\xf8\x3d"
+ "\xde\x1d\xfc\x7e\x57\xca\x3f\x4f\x38\xd6\x41\xfa\x53\x69\x8f\x02"
+ "\xb8\x33\x66\x30\x30\x52\x51\x65\x22\x2d\x8a\x2a\xe4\xff\x49\xd4"
+ "\x68\x90\x9e\x86\x80\x60\x6d\x68\xe8\xff\x33\xbf\x09\xdb\xa5\x0a"
+ "\x71\xab\x43\x3f\x24\x72\x9e\x22\x8c\xde\x47\x18\xa4\xb0\xbb\xdf"
+ "\x1b\x02\xcf\xc3\x0c\x01\xef\xaa\x24\xfc\xd3\x0c\x30\xb5\xf8\xfb"
+ "\xa0\xf5\x87\xdf\xff\x83\x3f\x15\xd5\x8f\x1f\x7e\xff\x87\x7e\x4c"
+ "\xb4\xe2\x68\x89\xf8\x8d\xfe\xb1\x41\x43\xc9\xa4\x08\x26\x05\x30"
+ "\xe9\xe1\x7b\x69\xc7\x7f\xf8\xfd\xf0\xfb\xe1\xf7\xc3\xef\x87\xdf"
+ "\x0f\xbf\x1f\x7e\xff\x3f\xf8\xa9\x78\x3f\x82\x49\xbf\xc1\xe7\xc1"
+ "\x78\xea\x06\x15\x36\x30\xb5\x0a\x58\x40\x44\xd5\xbd\xa0\xd2\xc1"
+ "\x08\xed\xf7\xe7\xe5\x19\x06\x09\xfa\x96\x09\xe8\xac\x81\xbb\xf1"
+ "\xfa\x11\x5e\x37\x07\x84\x4f\xf9\xbe\x28\xfa\xa7\x7f\x2a\x64\x9e"
+ "\x06\xfb\x85\x61\x30\x02\xc2\x41\x07\x23\x61\x14\x8c\x86\x08\x18"
+ "\x03\x63\xb1\xbf\xa9\x87\x28\x88\x86\x1b\x20\x06\x6e\x84\x71\x70"
+ "\x13\xc4\xc2\x78\x98\x80\x25\x99\x08\xb7\x60\xdf\xfe\x56\x64\xc8"
+ "\xe4\xd0\x65\xa9\x82\xa4\x58\xfc\x83\xff\x33\x20\x89\xbf\xe7\xfe"
+ "\x10\xfe\x7f\x35\xdc\x2a\x85\x77\x49\xe1\xf6\x1f\xc2\xff\xaf\x86"
+ "\x1b\xfe\x8b\xef\x93\xff\x4b\xef\x2a\x34\xd9\xc2\x6a\xab\x42\xda"
+ "\x4a\x65\xa8\x4a\xfa\x0d\xbe\xc3\x37\xa4\x1f\x82\x2f\x38\xbd\xf2"
+ "\x97\x84\xd7\x2c\xf1\x58\x09\x20\xc6\x79\x59\xe0\xcf\x33\x5c\x4a"
+ "\xf9\xb7\xbd\x07\x2f\x07\x5e\x08\xb9\x1d\x5b\x18\xf3\x68\xbc\x6e"
+ "\x94\xf1\x08\x18\x1d\x5e\x97\x30\xfe\xd3\x16\x00\xfb\x59\xbc\x30"
+ "\xdb\xcf\xca\x01\xce\x45\x00\x7c\x9e\x0a\xf0\x1f\x47\x01\xce\xf7"
+ "\xf9\x71\xf6\x57\xf9\xa9\xfb\xd2\x24\x9e\x0d\x78\x5d\x25\x44\x60"
+ "\x57\x0d\x0e\xef\x59\x17\x64\xa6\x18\xee\x9e\x31\x6b\xc6\xbd\x3f"
+ "\xca\x33\x24\x24\x18\xee\x31\xde\x7d\xf7\x4c\xe3\x8f\x67\xde\xfd"
+ "\x13\xc3\x3d\xf7\xcc\xb9\xdb\x38\xc7\x68\x34\xac\xdd\x5c\x52\x74"
+ "\xb7\x71\x75\x81\x61\x5d\x7e\x51\xa9\x61\x55\x51\xc9\xda\x4d\x79"
+ "\x25\x05\xdf\x54\xac\xef\xfa\x23\xf2\x6e\xf1\x01\x97\x40\x30\xb7"
+ "\xe7\x01\x2d\x23\xd6\xc6\x3b\x60\xa8\x78\xe2\xa5\x2b\xe4\x6f\xed"
+ "\x53\x8f\xff\x75\xea\xb2\xb1\xef\x3f\xb0\x7a\xea\xdc\xf9\x6f\x54"
+ "\x1f\x03\xb5\x11\xaf\x78\x13\xa8\x27\xe5\x83\x3a\xfa\x2c\xa8\xc3"
+ "\xba\x41\xfd\x8c\x05\xd4\x4f\xcf\x02\x75\x56\x04\xa8\x53\x0b\x41"
+ "\x3d\x2f\x65\x68\xd8\xe6\x24\x11\xf6\xab\x62\x50\x1f\x36\x80\xfa"
+ "\x95\x6c\x50\xbf\xe0\x16\x61\xef\x61\xd8\xef\x74\xdf\x2f\x33\xfe"
+ "\xe9\xdf\xb7\xf5\x23\x86\xfc\xec\x5c\xd7\x30\xbd\xb6\xe0\x4c\x88"
+ "\xc1\xd2\x1f\x7e\x3f\xfc\x7e\xf8\xfd\xf0\xfb\xe1\xf7\xc3\xef\x87"
+ "\xdf\xff\xc7\x7f\x0e\x15\xcc\xfa\x4a\xad\x85\xf7\x2d\x00\x2e\xb3"
+ "\x6e\xa2\x5d\x75\xdf\x2c\x9a\x5b\x02\xb4\x86\x0a\x74\x7c\xdf\x15"
+ "\x71\x69\xf1\x16\x86\x0d\xff\x08\xbc\xc2\x75\x81\x73\x54\x68\x0e"
+ "\x52\x6b\xac\x11\x34\xb1\x20\xe6\x4b\x99\x59\x97\x58\x6f\x7c\x0f"
+ "\xf4\x81\x8e\xef\x39\x40\xeb\x46\x11\x7f\xb9\x1d\xde\x6a\x96\xe7"
+ "\x57\xc9\x70\x34\xbf\x8a\xe6\x63\x21\xec\x5a\x82\x1d\x66\x3e\x8d"
+ "\x9e\xbd\x1a\xab\x9e\x7f\x08\x80\xd6\x9f\xbe\xbc\x9f\x39\xda\x2a"
+ "\x00\x5a\x5b\xc4\x3a\x54\x9a\x6b\x83\xf8\xbb\xed\xb0\xbb\x45\xcc"
+ "\xaf\x62\xce\x1d\x18\x8e\x61\x7d\x76\x78\xb1\x4e\xca\xb3\x4f\x0e"
+ "\xb7\xed\xbc\x0a\x6d\x06\xbe\xce\xc6\xd1\x66\xf0\x42\xf2\x64\x2a"
+ "\xff\xc8\x58\x84\x9d\x38\xdc\xdc\x1a\x79\x1e\x19\xe5\x2d\xc1\xa7"
+ "\x28\xf2\xc3\x32\x8e\xcc\x96\xf3\x1b\x06\x47\x04\xa5\x95\xf1\x20"
+ "\xed\x7d\x98\xc6\x22\xe3\x41\x7a\x64\x1a\x1d\xc9\x5b\x79\x1e\x47"
+ "\x43\xd1\x64\xf8\x20\x31\xac\xe0\xc7\x33\x7b\x12\xcf\xac\x8a\x33"
+ "\xdc\x78\xf7\x82\x82\xb8\x3b\x98\x31\x72\xfa\x4b\xc6\xd1\x49\x23"
+ "\x93\xc6\xce\x5c\x62\x54\xeb\xd5\x53\xd4\xc6\x68\xbd\xfa\xf6\xa7"
+ "\xe9\x6f\xd7\xa4\x78\x7e\x37\x68\x13\x77\xe6\xff\xd8\x10\x3e\xef"
+ "\x85\xe7\x37\x26\xfd\xee\x97\x0f\x25\x3d\xfc\x78\xe9\xb4\xf7\x8d"
+ "\xea\x1b\xfe\xfc\xd2\x3b\xf1\x5f\x11\xc4\xe4\x29\xf4\x37\xbb\x55"
+ "\x13\x33\xcd\x4c\x58\xba\xc6\x1b\xde\xa7\x90\x3b\xb5\x89\x65\xf9"
+ "\xf7\xce\x6c\xa1\x1c\x1f\x5b\x99\x60\xa6\x34\x0f\xa5\x89\x34\x02"
+ "\x62\xe6\xf1\xc0\xb8\x19\xff\x4a\xa9\x0d\x9c\x06\xd0\x0a\x5c\x83"
+ "\xb8\x6f\x12\x14\x8a\xd0\x29\x1d\xc6\x5b\xa4\xbc\x5f\xa7\xbf\x4f"
+ "\xbd\x31\x43\x8d\x18\xa2\x13\x1e\xa4\xd8\x99\x2e\xa3\xcb\xd0\x96"
+ "\xa8\x5d\x1d\x17\x1f\x7e\xf7\x2f\xf1\x29\x6e\x75\x9c\x5e\x8d\xcf"
+ "\x2f\x88\x67\xe2\x41\xfe\x4f\x04\x84\x5e\x3d\x35\x26\x31\x3f\xff"
+ "\xc7\x9f\x3a\xf3\x7f\xac\x57\x27\xb5\xe4\x27\x26\x8d\xdb\x53\x7c"
+ "\x57\x5c\x62\x5c\xfe\xbd\x7a\x35\xbf\xcf\x49\x9a\xfa\xb3\xa7\xf4"
+ "\xea\x3b\xde\x33\x46\xe9\x55\x1f\x36\xab\xe0\x03\xf5\xd2\xa3\x1f"
+ "\x68\x3e\xf9\xe4\x14\xdc\xb9\xf6\x94\xea\xce\xd4\x53\x6a\x55\xd4"
+ "\xa9\x88\x27\xe1\x43\x7d\x38\x7c\x18\x8b\x97\xe1\x61\x68\x57\x55"
+ "\x66\xb4\xab\x37\xe5\xb6\x6b\x2a\x3b\xdb\xb5\x4f\x40\x7b\x58\x4e"
+ "\x54\xfb\x88\x87\x1f\x6d\x0f\x7f\xe2\xb3\x76\xdd\x1d\xd0\x3e\x12"
+ "\xa0\x7d\x32\xa8\xdb\xa7\x40\x4c\xfb\x3d\x51\xcf\xb7\x3f\x3c\x49"
+ "\x6d\xbd\xa1\xff\x01\xeb\x04\xed\x43\xd6\x38\x3d\x58\xa7\x8e\x02"
+ "\xeb\xed\x11\x11\xd6\x3b\xf0\x9a\x06\xcd\x56\x23\xbe\x27\xc2\x44"
+ "\x6b\xd8\x96\x11\x00\x82\x96\x53\x06\x80\x53\x93\x61\xde\xa9\x29"
+ "\x78\xbf\x0d\xaf\x38\xbc\xa6\xe2\x75\x07\x5e\xd8\x7f\x39\x45\x7b"
+ "\x0b\x41\xfc\x88\xc4\xff\xf6\x5e\x5e\xde\xac\xbc\x7b\x33\xe7\x6b"
+ "\x34\x05\x71\x30\x1a\xb9\xa6\x4d\x8c\x9b\x1c\x36\x3b\xac\x20\xee"
+ "\x53\x67\x12\xfe\xd5\xab\x97\xff\xbb\x66\xc4\x4c\xd7\x6c\x57\xee"
+ "\xef\x3e\xf5\xc2\x28\xe4\x3f\x28\x75\xb8\xdf\x0c\x2a\x27\xd2\xe8"
+ "\x34\xf7\x3f\xe0\x32\x47\xe8\xed\x30\xb2\x50\xd6\x63\x11\xf7\xbe"
+ "\xde\x69\xae\x42\xfd\x8b\x98\x1e\x3a\x6e\x3b\xc5\xa5\x5c\x27\x5d"
+ "\x7e\xe8\x38\xd2\xe9\x88\x2a\x39\xae\x5f\xdd\x9a\x81\xef\xa8\xff"
+ "\xba\xd9\xc1\xb0\x56\x8d\xd3\xac\xda\x8e\x71\x47\x87\xe2\xb1\x22"
+ "\x9e\xe4\x9f\x61\x5c\x7b\x88\xb8\x47\x9c\xe6\x25\x94\x47\x8f\x22"
+ "\x0f\xa7\x9c\x07\xad\xef\x6e\xc4\xfa\x45\x76\xc7\x67\x1e\x79\x82"
+ "\xd2\xda\xdc\x0e\x68\xf1\xf5\xaa\xb4\xe5\xa7\x81\xf0\xb8\xcc\x63"
+ "\xe2\xe4\xf4\x04\x47\xfb\x11\xd0\xba\x3c\x3e\xff\x13\xc6\x3c\x46"
+ "\xf3\x3f\xf7\x21\x0e\xc3\x46\xd5\x4d\xe7\x20\xc2\x4b\x69\xec\x30"
+ "\xa6\xd0\xa9\xfe\x18\xf3\x1e\x93\x2b\xdb\x39\x0c\xe3\x73\xa8\x29"
+ "\x0f\x2c\x7b\x15\xc6\x55\x0c\xa5\xf9\xe3\x68\xc1\x97\x31\xf5\x72"
+ "\xdc\xf5\xe6\x14\x8a\x34\x8c\x39\xcd\x1f\xfb\x30\xcd\xe9\xa1\xf8"
+ "\x58\x95\xd3\xac\x7e\x1e\xe3\x7a\x43\xc4\x6d\x17\x79\x8d\xd5\x86"
+ "\x88\x33\x63\x9c\x1a\xe3\x0c\xc3\xc4\x69\x30\x2e\x31\x54\x5c\x5b"
+ "\x03\xc7\x99\x35\xc8\xf3\xb1\x63\x92\xf0\xbd\x50\xe6\xf9\x37\x97"
+ "\x87\xe4\x7d\x37\xf2\x7d\x6c\x83\x12\x3f\xe1\x76\xaa\x3b\x08\xdf"
+ "\x89\xa1\x79\x9f\x56\x39\xcd\x29\xa8\x0b\x63\xcf\x0c\x8d\xfb\xe3"
+ "\xcd\xc8\x07\xa2\xcb\x11\x22\x6e\x22\x96\x07\xed\x75\x64\x44\x08"
+ "\x9c\x23\x30\xce\x8e\x71\xf1\xdf\x20\x0f\x3d\xb7\xe1\xb4\xff\xc1"
+ "\x24\x08\x3b\x0f\xd1\x73\xa9\x3c\x42\x2f\x60\xc4\x79\x88\xea\xe8"
+ "\x17\x73\xe1\x1d\x86\x2d\xa0\xc1\xf7\xc3\xcc\x6c\xbd\x11\xe3\xfb"
+ "\x50\x9f\x74\xb6\xab\x1e\x38\x0f\x91\x7b\x10\x46\x43\x6b\x57\xa9"
+ "\x7d\xc2\x70\x8d\xcd\xed\xa1\xf5\x1b\xa8\x67\x91\xbf\xc1\xbb\x1a"
+ "\xd3\xf1\x75\x31\x4b\x1b\x20\x8e\x68\xe4\xf3\x57\xcd\x56\x15\xcd"
+ "\x07\xa5\xf6\xd0\xa9\x86\x3b\x9c\x5c\x67\x23\xb1\xfd\xd3\x35\x4b"
+ "\x73\x77\x89\x06\x2d\xa6\xdd\xaa\xd6\xf3\xb9\xe0\x0e\xc4\x45\x34"
+ "\x3c\xea\x33\x5b\xd5\x83\x78\xd4\xd6\xd1\x34\xaf\xb7\xdf\xac\x5e"
+ "\xe8\x54\x47\x32\x81\x47\x6f\x90\xf1\x10\x1c\xe6\xc5\xe7\xc7\xf7"
+ "\x9b\xb5\xb5\x01\x30\xc9\x81\x79\xcd\x74\x82\x86\x68\x3e\x07\xfa"
+ "\x06\xca\x4f\x2a\x23\x9f\x6b\x6b\xdb\xe8\x01\x1b\xfa\x17\xe7\x41"
+ "\x5f\x8e\x65\x35\xb4\xba\x69\x8d\xb3\x35\xaa\x69\x1b\x00\xaf\x17"
+ "\x6a\x30\x48\x38\xeb\x65\x9c\x84\x23\xa0\xac\xd1\x22\x7f\x2a\xab"
+ "\x0e\x24\xd8\xb6\x40\x1a\x09\x2f\x96\xeb\xa6\x46\x84\x6b\x43\xaf"
+ "\x45\x82\xe9\x95\x61\x02\x64\x30\x59\xa2\x8f\xf8\x43\x32\xcb\x96"
+ "\xeb\xa7\xcb\x1c\x85\xed\xff\xe8\x5e\x51\x6f\xfd\xe1\x12\x0d\xb1"
+ "\x82\x06\x15\xd2\xa0\xb2\x0a\xfc\x51\x29\x32\x7e\x3b\xe8\xdd\x81"
+ "\x34\x37\x72\x58\xfd\x48\x51\x4f\x39\x6c\x99\x1f\x36\x32\x08\x16"
+ "\x79\xa1\x16\x32\x00\xb5\x1d\xa2\xf2\x91\x1f\x1a\x84\x39\x86\xf2"
+ "\x36\xc8\x30\x52\xf9\x63\x31\x6e\x9e\x84\xaf\x2d\x00\x5f\x19\xe1"
+ "\xa3\xf9\xb0\xc2\xf6\x46\xd9\xfd\xb6\x0f\xda\xf1\xdd\x31\xd4\xbe"
+ "\x52\x7d\x8d\xd6\x21\x5c\x1c\x85\x9b\xa6\x80\xfe\x02\x44\x7d\xde"
+ "\xaf\xd6\xf4\x0a\x5e\x44\xa3\xfd\x1b\x33\xe8\xdb\xe0\xfb\x2c\x3b"
+ "\x18\xdc\x52\x7e\xf9\xc4\x1b\xbf\xbd\xa5\x3c\xa3\x33\xe5\x3c\xe5"
+ "\xf8\xc0\x3a\x93\x34\x72\x26\xfa\x27\x49\x6f\x25\x4d\x4c\x9a\x24"
+ "\xfb\x2e\x73\xdb\x56\xc5\xcd\x74\xce\x6d\x33\xdc\x6b\xfc\x79\x41"
+ "\xdc\x74\xde\xf6\xdf\x71\xce\x38\x05\x5b\xf7\x3f\xf3\xbf\xb5\x14"
+ "\x12\xc7\x43\x30\x9c\x9e\xa7\xd0\xb3\xe4\x2f\xe0\xd3\x63\x4b\x35"
+ "\xe1\x53\x4b\xe8\x49\x78\x0e\x49\xe3\x56\xac\xd4\x24\x4b\xcf\x63"
+ "\x45\xcc\x5d\xdc\xe7\x88\x7f\x90\x9e\x6f\xe7\xb8\x66\xb6\x50\xce"
+ "\x33\x5e\x32\xfe\xf4\xf1\x7f\xd3\x9c\x7a\x7e\x4d\x52\xc4\x1d\x66"
+ "\x82\x99\xbe\xc8\x78\x10\x43\x5a\x29\x64\xca\xeb\x9c\x82\xc0\x54"
+ "\xc7\x29\x95\x14\x3f\x71\xfa\x02\xe3\x2b\xcb\x96\xde\xf6\x67\x63"
+ "\xf4\x0d\xef\x67\xb7\x52\xfa\x1b\xa2\x83\x72\x9a\xe2\xa7\xea\xe9"
+ "\xea\x69\xbb\x7e\xf4\x73\x81\xe5\xf1\xa5\x9a\x3f\x27\x4d\x5a\x5f"
+ "\x42\xa1\xb7\x71\x5f\x8c\x7c\x95\x99\x57\x8c\x61\xcf\x3f\xfe\xe9"
+ "\x7f\x7f\xfc\x8d\xae\xa7\xa6\x61\x49\x6f\xa8\xed\x7a\xea\xf1\x37"
+ "\x3e\xfd\xef\x9a\x1d\x04\x79\x67\xbe\x31\xc6\x10\x36\x77\x43\xdb"
+ "\xa3\xd3\x38\x55\x37\xed\x89\xad\x1f\xdf\x32\xe1\xd8\xcd\x27\x27"
+ "\xb6\xdf\xf2\xef\x93\xfe\x7e\xeb\x17\x06\xe7\x64\x86\x7e\xc4\x03"
+ "\xc6\xc9\x83\x7e\x04\xa0\x1f\x71\x0e\xfd\x88\x4a\xf4\x23\x3a\x03"
+ "\xfd\x88\x8f\x46\xcd\xa9\x10\xbe\x84\x80\x17\xfe\xcf\xf4\x7f\x47"
+ "\xff\x67\x1d\xfa\x3f\xd3\x4f\x85\x3d\xf6\xc4\xa9\x88\x4c\xe1\xff"
+ "\x44\x45\x8e\xe0\x3e\xd0\x78\xbc\xa3\x1f\xf4\xe1\x64\xbc\xc7\xe3"
+ "\xfb\xb4\xe8\xf0\x60\x9f\x68\xc9\xd8\xf6\xb0\x6c\xf4\x89\x12\xd1"
+ "\x27\x4a\xca\x6b\xd7\x2d\x7c\xaf\x7d\xe4\xec\xa4\xf6\x51\x83\x7e"
+ "\xd1\x43\xed\xc9\xb1\x33\xdb\x17\x6a\xa1\xfd\x11\x10\xbe\xd1\x4e"
+ "\x30\x7e\xa4\x8d\x51\xfd\x31\x02\xb4\x7f\x1c\xdb\x3c\xea\x8f\x91"
+ "\x56\xeb\x1f\xf5\x78\x45\x41\xf3\x1f\xa3\x21\xfc\xfd\x07\x9a\xe1"
+ "\xfd\xf9\x95\xf6\x53\x5a\x18\x7b\x6a\x24\x5c\x39\x15\x85\xf7\xdc"
+ "\xfd\x70\xea\x05\xd0\x9e\x1a\xa5\xbd\xe2\x2f\x6f\xcc\xe7\xa7\x26"
+ "\x7f\x30\xf7\xd4\x94\xc4\x3f\x9c\xba\x2d\x79\xc9\xa9\xb8\x0f\x3e"
+ "\x38\x35\xd5\x3e\x29\xd0\x6f\xa2\x32\x03\xdc\xb5\x93\x3c\x58\xe4"
+ "\xf7\xbd\xf1\x23\x8c\x23\x76\x15\x70\x7f\xf0\xc7\x92\x5f\xf8\xe3"
+ "\xa4\x05\xcf\x3f\xfe\xf8\x4a\x8d\x3a\x69\x12\xf7\x2e\x25\x4f\xd3"
+ "\xef\x7d\x06\xfb\x9c\x73\xdb\xfc\x3e\x67\x9c\xd3\xef\x73\x1a\x46"
+ "\xcc\xdd\x18\xe4\x9f\x0d\x60\xd8\x99\xc4\x38\xc3\x54\x23\xf7\xcc"
+ "\xba\xc6\x2b\xbd\xb5\x19\x7b\x8d\x73\xe3\x74\xf7\x76\xa3\xcf\x16"
+ "\xbe\xfb\x85\x95\xbf\xa4\x0b\xbd\xb6\xaf\xf5\xea\xe7\x9f\xc9\x9b"
+ "\x9d\xb5\xe3\x4e\x94\xf9\x0d\xe4\x05\x87\xbf\xb0\xeb\xc4\x0b\x2f"
+ "\x3c\x7f\xe2\xd4\x53\x4b\xa7\xfd\x2b\x86\xbd\x1f\x57\x86\xfa\xf3"
+ "\x3f\xf2\xff\xc7\xcc\x2b\x89\x61\x2f\x3c\x71\xe2\xf9\x57\x57\xaf"
+ "\x6e\x23\x7d\x21\xd9\xca\x6d\x54\xbf\x39\x1a\x7d\x12\xd5\xef\x5c"
+ "\xe6\x1b\xd1\xff\x19\xdf\xae\x6c\xcb\x7e\xa8\x97\x3f\xd4\xcb\x1f"
+ "\xea\xe5\x7f\x45\xbd\x1c\x07\xa2\x5e\x8e\xdf\x13\xaa\x5e\x2e\x5c"
+ "\xfc\x50\xfa\x1c\xc3\x86\x95\x06\x53\xc9\xfa\xd5\x25\x79\x6b\x0d"
+ "\xc5\xeb\xf3\xf2\x0b\xf2\x47\xc1\x60\x44\xde\xca\xb2\xa2\x8d\x79"
+ "\x65\x05\x43\xd6\x3a\xc6\xca\x3e\xe9\x50\xdf\x7a\xbc\x7b\x78\xdf"
+ "\x7a\x42\x4c\xe8\x7e\x89\x0a\xdb\xf6\x09\xc6\x10\x71\x53\xa4\xb8"
+ "\xd4\x10\x71\x0f\x4a\x71\x85\x21\xfa\x80\x63\x44\x1f\x63\xc2\xce"
+ "\x50\x71\x18\xde\x20\xfb\x24\xd8\x4f\x53\xb7\x4d\xe9\x03\xf2\x49"
+ "\xce\xc3\x84\x0f\xb0\x4c\xbd\x18\x7f\x52\xf6\x65\xec\x30\x61\xa7"
+ "\xec\xa3\x49\xfd\x90\x78\xa7\x39\x09\xcb\x39\xc1\x1e\xa2\x8f\x72"
+ "\xa7\x94\xaf\xc7\xef\x1b\x2d\x36\xb8\xcc\x37\x47\x0c\xf5\x8d\xba"
+ "\x40\xf4\x21\x6f\x8e\x57\xc0\xce\x96\x61\xd1\x9f\xa4\x3d\x20\xfa"
+ "\x68\x8d\x5a\x1f\xdc\x7c\x92\x99\xc7\xd7\x93\x4f\x49\xfd\x48\xc2"
+ "\x23\xfa\x92\xdd\xbc\x2f\x89\x7d\xc5\x1e\x4c\x5b\x16\xd0\x9f\xec"
+ "\x41\xdf\x38\x9c\xfa\x93\xe7\xe1\xe6\xc3\xd4\xa7\xdc\xc7\x71\x5d"
+ "\x20\x5c\x69\x84\xcb\x0e\x37\x5b\xb9\xdf\x27\xd2\x1e\x0b\x18\x37"
+ "\xc3\x7e\xed\xcd\x7c\x2f\x51\xd9\x2f\xc4\xf8\x2e\xbb\x36\x65\xd0"
+ "\x57\x23\x5f\x50\x2a\x47\x95\x90\xc3\xcd\x21\xfa\x3f\x5d\xb5\xa2"
+ "\x1f\x38\x71\xb0\xff\x43\xf8\x7c\xe6\xf1\xbf\x69\xe4\x38\x27\xc6"
+ "\xc9\x38\x03\xf5\x72\xe5\xfa\x75\xab\x8a\x56\x6f\x28\x29\x30\x94"
+ "\xa6\xa6\x1a\xd6\xae\xcf\x2f\x98\x31\x63\xc6\xa8\x20\xfd\x8b\x10"
+ "\x3e\xed\xc7\x49\xa4\x87\xe4\xd7\x4a\x7a\x98\x84\x3e\xa7\xe4\x37"
+ "\x4f\xac\x0a\xee\x5f\x7c\x9c\x24\xf9\xb7\x7a\x84\x31\x4a\x30\x2d"
+ "\x41\x30\x88\x4f\xf2\x91\xc9\xcf\x1d\x2b\xc1\xb4\x2b\xf1\x60\x1c"
+ "\xef\x17\xd1\xba\xbb\x7e\x51\xbe\x3e\x05\x9e\x07\xa4\xfe\x0e\xea"
+ "\xfd\x08\xa9\x9f\x70\x8b\x5e\x81\xe7\x01\x7f\x7f\x43\x25\xc3\xcc"
+ "\x0a\xec\x9b\xe0\x7b\xb2\x2c\x13\xbf\x1f\xdf\xda\x2b\x70\xab\xf4"
+ "\x7e\xbf\xff\x96\x62\x45\x5f\x6a\x9c\x1f\x37\xe8\x25\x18\x4b\x30"
+ "\x8d\xad\x17\xa4\xb2\xea\x02\xf0\x1c\x0f\xc6\xd3\xfa\x9f\x12\x1e"
+ "\x4d\x00\x4c\xb7\x82\xc6\xde\xa1\x34\x5a\xc7\x0a\xdc\xcd\x98\xbf"
+ "\x5d\x2a\xdb\x24\x45\xf9\x11\x86\xe3\x8e\x41\x98\x89\x32\xcc\xac"
+ "\xc0\xbe\x14\xf5\xe7\xf8\x5a\x4c\x98\x94\x4a\xfa\x84\xd7\x08\xa4"
+ "\xfb\x1f\x01\x7d\xba\x70\x29\x9d\xb2\xfc\x63\xfa\xb1\xbf\xd0\x14"
+ "\xd4\x4f\x9b\xa4\x28\x3f\xf6\x0d\xa3\x65\x1e\x69\x65\x18\x65\xf9"
+ "\xed\x82\xc6\xa8\x28\x7f\xf9\x27\x75\x2b\xf0\x8c\x23\x9d\x22\x5c"
+ "\x01\x79\x79\x14\x78\xce\x49\x7c\x0c\xe0\xf5\xad\x06\x85\x3c\xfe"
+ "\x43\xa2\x27\x80\xd7\xb7\x26\x2b\xf0\x5c\xa6\xf8\xe0\x72\xdd\x5a"
+ "\xa8\xc0\x73\xd9\x5f\x2e\xd4\x63\x01\xb3\x47\xd1\x8f\x55\x33\xf3"
+ "\xfb\x63\x14\x78\x8e\xc9\x30\xfd\x23\x9e\x6f\x16\xb2\xbd\xb5\x4d"
+ "\xb6\x45\x42\xae\x13\x8d\x84\x1b\xc3\xcf\x06\xda\x02\xa4\xab\x77"
+ "\x28\x9f\x0c\xa0\xe4\x53\x00\x5d\x52\x5f\xdc\x10\xa7\x28\xdf\x05"
+ "\x89\x4f\xa3\x02\xf0\xa4\x28\xca\xf7\x9f\x12\x9e\xb0\x00\x18\x85"
+ "\xfc\x5b\xfb\x24\x3c\xda\x00\x18\xa5\xfe\x5f\x94\xf0\x04\xe6\x75"
+ "\xfc\x9b\xf9\x64\x08\xd2\x7f\xe2\x15\x86\xf5\x7d\xc3\x18\x94\x4e"
+ "\x7c\x3b\x98\x8c\xed\xdf\x1b\x7c\x5d\x2d\x8b\x5e\x91\x4c\x7b\x4a"
+ "\xa1\x8d\x4e\xe2\x63\x83\xd7\xc8\x4e\x4f\x2e\x6f\x42\x7b\x26\xca"
+ "\x00\x46\x61\xbb\x27\xf3\x7d\x1c\x31\x6d\x86\x1d\xc6\x96\x05\x7e"
+ "\x07\xb0\xc3\xe4\x3d\x52\x1c\x96\xff\xc6\x6e\x39\x8e\xc2\xc5\xf8"
+ "\xe2\x64\x6c\xff\xc6\x8b\xfd\x01\x60\x72\xb1\x04\x8b\x76\x7f\x62"
+ "\x4a\xa8\xf5\xcb\xc3\x7d\x7f\x29\x8d\x65\xbe\xca\xf1\xb4\x9e\x79"
+ "\x51\xbb\xcf\xcc\xc0\x56\xee\x06\xc3\x04\xa8\x3c\x07\x53\x74\xd4"
+ "\xc7\xdf\xb7\x05\x74\x95\x26\xe6\xa6\x3d\x68\x3b\x1d\x7d\x50\xe9"
+ "\x60\xbd\xb4\xcf\xeb\xb6\x2b\xa0\xb3\x79\xf8\x99\x75\xb1\x6d\x15"
+ "\x9f\x87\x5c\x93\xeb\x53\x33\xa8\x9c\x48\x69\x7b\xa0\xb3\xa1\x07"
+ "\x2a\x1b\x82\xd3\x56\xde\x02\xb1\x1d\xb4\x67\xac\x19\x22\x89\x0e"
+ "\xfa\x9e\xe2\x89\x5e\xd4\x5e\x71\x00\xb4\x95\xe8\x5d\x76\xe4\x5b"
+ "\x65\x5a\xba\x88\x96\x9d\x17\x40\xf7\xc6\x2a\xab\x7a\xc7\x05\xa2"
+ "\x77\x69\xfb\xdb\x5b\xdc\xea\xd6\xd8\x54\x68\x8d\x3d\x0b\x6d\xb1"
+ "\x73\xa1\xad\x3c\x19\xf6\x5d\x80\x88\x56\x77\x22\xb4\x69\x1f\x82"
+ "\xb6\xb8\x64\xb0\xf5\xe1\xb3\xc1\x8b\x30\x4e\xbe\xff\xd1\x79\x98"
+ "\x62\xad\x7b\x06\x74\x76\x81\x13\x79\x36\xe5\xb4\xbc\x97\x0f\xbd"
+ "\x87\x2a\x47\xe9\x78\x88\x45\xfa\x7a\x91\x96\xfb\xce\xc1\x6d\x61"
+ "\x71\xb1\x60\xa4\xf6\xd7\x56\xef\x01\x6d\x05\x8c\x1c\x46\x2f\x62"
+ "\xf8\x3e\xa0\xe8\x47\x35\xee\xc7\xb6\x1e\xef\xfd\xa8\x13\x2e\xf3"
+ "\x6d\x89\x98\xf7\x59\x69\xdc\xab\xaf\xf2\x30\xea\xd9\xa6\x2c\xda"
+ "\x17\x04\xdb\xe9\xdb\xb2\xe4\x38\xda\xdf\x94\xf6\x2d\x9d\x19\x03"
+ "\x7a\x9b\x27\x09\xde\xbd\xd6\x4b\x6b\xef\xfb\x68\x3f\x04\xc2\x87"
+ "\x6d\xbe\x86\xc6\x9f\x90\x9e\x69\xd8\xc6\xf7\xdd\x86\x70\x98\x1e"
+ "\xe5\xdf\xc5\xf7\x15\x66\x37\x2d\x73\xfa\x6e\x5a\x76\xc5\xf7\xea"
+ "\xb2\x7e\xf6\xea\xb2\xaf\xbc\xaf\x2e\xfb\xb2\x72\x33\xe8\xbc\x37"
+ "\x2d\x73\x74\x9a\xb8\x0c\xf4\x9d\xa6\x8b\xb4\x8e\x5e\x47\xe7\x55"
+ "\xae\x78\x16\x65\xef\xf9\x1b\x6c\x2d\x82\x58\x5f\xd4\x92\x2a\x9b"
+ "\xe7\x13\x58\x51\x01\x0c\x9f\x2d\xa1\xca\xd7\x1f\x9d\xa9\x93\xc7"
+ "\xd3\x5c\xe6\x38\xbd\x5d\xfb\x08\x5f\xf3\xef\x88\xca\xd6\xe1\x15"
+ "\x81\x97\x1e\xaf\x18\x16\x9d\x19\x83\xbc\xaa\x1c\xbb\x5d\x05\xb4"
+ "\x7f\xcf\x4c\x1f\xa8\x2e\x40\xdc\x74\xa4\x5f\x3f\x0c\xdf\x26\xfa"
+ "\x6a\x0f\x1a\xee\xa8\x82\x6d\xb4\xf7\x2f\xf9\x00\x54\xbf\xc8\x1f"
+ "\xc5\x7c\xca\xed\xda\x45\x5c\x56\x58\x47\x9c\x2c\xfa\xa0\x81\x7c"
+ "\x3a\xe7\x73\x85\x2a\xc7\x73\x85\xea\xfe\xe8\x83\xb7\x21\x4c\x03"
+ "\xc2\xcc\x96\x78\xd8\x4b\xb8\xb0\xde\x38\xc6\x78\x40\x83\x38\x4d"
+ "\xbf\xbb\xda\xad\x3d\xb4\x9f\x9d\x45\xb8\xb6\x41\x5c\x88\xbb\x8e"
+ "\xfb\x49\x71\xdd\x72\x18\xf9\x49\x7b\x11\x8e\xd2\xdb\xdc\x49\xf4"
+ "\xcd\xd0\x6e\x2b\xee\xa5\xfd\x2b\x46\xb1\x01\x91\x1f\xf9\x70\x54"
+ "\x57\xc7\xb8\x61\x84\xcb\x0c\x19\x84\x9b\xd2\xd1\x99\x1d\x98\xee"
+ "\x36\x56\x59\x88\xfe\x22\x2c\x76\xb1\x42\x15\xed\x65\xdb\x8a\xe9"
+ "\x45\xde\x53\x93\x64\x1a\x29\x0f\xbe\x97\x2d\xd1\x89\xfa\xd0\x5a"
+ "\xec\x86\x31\xf5\x34\x4e\x0e\x4b\x09\x1f\xe1\x42\x3d\xb0\x63\x59"
+ "\x6f\x6b\x2d\x76\x80\x8f\x05\xe1\xb4\x4b\xf8\x2c\x41\xf8\x30\x9c"
+ "\x21\x3e\xd2\xbf\x36\x4c\x33\xa6\x99\xe3\x5b\xf2\x3b\x1f\xe1\x73"
+ "\x83\xd6\xc0\xe9\x7d\x9c\x70\xf0\x7d\xa1\x11\xa7\x75\xe3\x83\xe8"
+ "\x3b\x4e\x75\x3b\x2a\x0b\x35\x7c\xdd\x3c\xa6\x7f\x7b\x5b\x6f\x18"
+ "\xeb\xcf\xd2\x8c\xe5\x6b\xe6\x1f\x04\xfa\xd6\x8a\x30\x7f\x61\xfd"
+ "\x85\x9a\x31\x7d\xe8\xeb\x21\x0c\xed\xa3\x45\x74\x06\xca\x72\xc9"
+ "\x82\xc7\xe7\xc2\xe3\xc9\x0b\x93\xe7\x42\xda\x03\xf3\xe7\x82\xf1"
+ "\xbe\x04\xe3\xac\x1f\xfd\xe4\x47\xfc\xe1\x47\x3f\x99\xfd\x23\xc8"
+ "\x78\x62\xc9\x5c\xc8\x58\x3c\x17\x96\xe2\x95\xb1\x74\xc1\x92\xe4"
+ "\x05\x4b\xe7\x42\xd6\x43\x0b\xf1\x6d\xfe\xdc\xbb\x8d\x0f\x27\x64"
+ "\xcc\x5f\xb8\x00\x1e\xcd\xbc\xc7\x78\xcf\x3d\xf0\xc0\x82\xd4\xbb"
+ "\x8d\x46\xe9\x7e\xb7\x91\x40\x9e\x9a\xbd\x60\x69\x42\x46\xc9\xfa"
+ "\xb2\xf5\x09\x8b\x17\xce\xa7\x10\x58\xb0\x60\x6e\x46\x90\x1f\x19"
+ "\xef\xbd\xea\x25\x7e\x3b\xd9\xe5\x14\xda\xbf\x18\x1a\x51\x0f\xf0"
+ "\xea\xe3\xfb\x22\xc1\x1d\x7f\x6a\x24\xf9\xf1\xb6\xe0\xf6\x18\x6a"
+ "\x4f\x5d\xe6\xdb\x49\xfe\xe5\xc4\x47\xda\x43\xf8\x3c\xcc\x98\x8b"
+ "\x71\xe3\x25\x7f\x24\x0c\xe3\xdd\xc1\xf1\xd3\xb2\x31\xfe\x56\xda"
+ "\x67\xc7\x86\x17\xf2\xde\x89\xf6\x10\x79\xec\x80\xfe\xca\xac\x30"
+ "\xbe\xcf\x21\xca\x9d\xf6\x9f\x70\x99\xef\x98\x15\x50\xef\x7b\x68"
+ "\x9f\x0a\x1a\x4f\xbe\x04\x77\x8c\xe9\x2c\x4b\xa2\xbd\xa8\xc0\x56"
+ "\x26\xe1\xb8\x32\x88\x63\x94\xb4\x57\xa2\xbd\x91\xf6\x00\x11\x78"
+ "\x2a\x02\x6c\x84\x9d\xf0\xec\xc3\x38\x09\xd7\xa3\x9d\x68\x2b\xd0"
+ "\x96\xff\xd9\x57\x19\x0f\x2c\x7a\x51\x97\x6f\x20\x1e\xc4\xf8\xeb"
+ "\x1d\xc7\x03\x74\xdb\xd9\x56\x8e\x70\x6f\xa4\xa8\x68\x3f\x06\xbe"
+ "\x37\x03\xdc\x6e\x45\x1d\x77\x7a\x6b\xb3\xc7\xb3\xcb\x7c\x3f\xc4"
+ "\x11\x58\xbe\x04\x2c\x5f\x9c\xaf\x36\x3b\x96\xef\x2d\xca\xe1\xe2"
+ "\x63\x18\xbd\x47\x23\xdc\xc0\x60\xd8\x8d\x14\xe6\xa2\xef\x3b\xb4"
+ "\x5f\x37\xe3\xe1\x1a\x0c\xff\x04\xed\x5a\x37\xc2\xc6\x12\xec\x4c"
+ "\x0f\x84\xf3\x7d\x50\x2a\x55\x70\x0e\xe2\xb3\x7d\xd1\xd9\x13\x02"
+ "\xf2\x23\x3c\xd9\xa2\x1d\x43\x59\x5c\x46\x3c\xfd\x3c\x5c\x8d\xe1"
+ "\xbf\x47\xfc\x37\x93\xbd\x14\x36\x7c\x06\xdf\x6b\x4a\x1a\x93\xf7"
+ "\xbf\xd3\x3e\xcf\xdb\xc4\x7b\x2b\xf2\x92\xbe\x13\xd0\x37\x7e\x97"
+ "\x39\x1e\xfd\x9f\xb8\x14\xd1\x56\xce\xe0\x79\xd0\xbe\xb2\x4c\xff"
+ "\xf7\x0c\xc4\x3b\xd1\xba\xa5\x8f\x9f\xd3\x6a\x87\xf8\x62\x5f\x65"
+ "\x21\x28\x68\x8a\x27\xfa\xc9\x86\x20\x2f\x12\x50\x0f\x46\xba\xcc"
+ "\xd3\x40\xa1\x07\x13\x11\xcf\x78\xa4\xaf\x1b\xcb\x34\x1e\xf1\xc4"
+ "\xf9\xfa\x0b\x31\x5f\xec\x2f\xb2\x42\xf4\x95\xfc\x38\xa4\xf4\x49"
+ "\xc1\xe9\xef\xe8\xa1\x74\x08\x1f\xe6\xea\x27\xf8\x3b\x7a\x89\xe7"
+ "\x92\xde\xa1\x5e\x4e\x33\x29\xf4\x72\x32\xd2\xf2\xe3\x80\x78\x8b"
+ "\x22\x3e\x0c\xe3\x7f\x2a\xc5\x63\xdd\x9f\x76\x4c\x41\xef\x69\x8c"
+ "\x9f\x87\xf4\x3a\xb1\x6e\x6b\x30\xbf\x96\x46\xc9\x37\x91\xe0\xed"
+ "\x0a\x78\x0f\xc2\xcf\x27\xbd\xa1\x76\x87\xe0\x9b\xa4\xba\x83\xf0"
+ "\x3a\x97\xf9\x4e\x7d\x30\x7c\xc2\xe7\x08\x9f\xea\xa7\xef\x4e\x63"
+ "\x70\xfc\x9d\x6e\x8c\x7f\x94\x74\x1d\xef\xcb\xc9\xd7\x27\x7b\x42"
+ "\xb6\xac\xb5\x98\xe4\x75\x67\xae\x02\xbe\x0a\xe1\xf2\x25\x1e\xa9"
+ "\x25\x1e\xb5\x48\x7d\xf7\xb3\x12\x0d\x75\x8a\x34\xc7\x31\x4d\x31"
+ "\xf2\x71\xbc\xac\x97\x21\xd2\xb4\x2b\xd2\xf4\x92\x1c\x99\xc8\x47"
+ "\xeb\x1a\xf0\xa7\x91\xec\x64\x20\x0e\x2a\xdb\x68\x97\xf9\xae\x08"
+ "\x45\xd9\x93\x31\xdf\xb2\xbd\xc2\xee\x8c\x46\x1d\xba\x07\xc3\xee"
+ "\x45\x9c\xb7\x50\x1d\xd8\x47\xfe\xa0\xc3\x0d\xac\x32\x25\x42\xe8"
+ "\xee\x5d\x6b\xc7\x7a\x80\x9e\x13\xe8\x99\x70\x33\x57\xaa\x54\x27"
+ "\xef\x5a\x8b\x77\x0a\xe7\xe7\xcb\x90\x1d\x66\xae\x45\x3e\x81\xf3"
+ "\xae\x1a\x3a\x1b\x0c\xdf\xbd\x52\x1e\x09\xb4\x77\x28\xd2\x3f\x01"
+ "\xdb\x1d\x60\x9b\x10\x6e\x0b\xcc\xc7\xf0\x5b\x78\x5d\x15\x70\xfc"
+ "\x5d\xe4\x91\x42\xfa\x3d\x0b\xdf\x6f\x94\xd2\x8f\x21\x7c\xf8\x7c"
+ "\xb7\xf4\xac\xf2\x12\xae\xcb\x72\x1d\x4c\x08\xe3\xe9\xb0\x1e\x72"
+ "\xfc\x98\x9e\xf6\x69\x15\x38\xa7\x7f\x89\xf7\x85\x78\xff\x1b\xde"
+ "\x1f\xc5\xfb\xef\x69\xdf\xd4\x4a\x2f\xaf\x8f\xf4\xfe\x73\xbc\x2f"
+ "\xc1\x7b\x0d\xde\x97\xe2\x7d\x2b\xde\x1f\xc4\xfb\x93\x54\x2f\x68"
+ "\x0f\x78\xda\xcb\x06\xdb\x56\xa1\x5b\xf4\xed\xcf\x95\x42\x3c\x58"
+ "\x80\x30\xc9\xbc\xbe\x0a\xfb\xa2\x13\x72\x9c\xce\xf7\x9a\x46\x7d"
+ "\xa0\xb0\x70\xa1\x0f\x22\xcc\x2b\xdb\xa1\xcb\xfe\x30\xc9\x36\x49"
+ "\x75\x51\x0a\x13\xf8\x33\x10\xff\x44\xa2\x95\x09\x5c\x61\x42\xe6"
+ "\x12\x7e\x91\x4e\x1b\x22\x4f\x55\x60\x9e\x76\xb8\xcb\x41\xfb\x20"
+ "\xe1\xfd\x2c\xdf\x67\x12\x12\x22\x18\xd7\x7b\x6c\x67\x39\xbe\xbb"
+ "\x4e\x48\x70\x16\xe2\x31\x4f\x2f\xc2\xa7\x07\xe8\x52\xb4\xcb\x9c"
+ "\x90\xa5\xd0\x25\xf4\xf5\x6f\x7f\x9e\x74\x86\xf8\x4e\x65\x1b\x6b"
+ "\xe2\x6d\x39\x2f\x0b\xc7\x7f\x59\xe8\x64\xa3\x34\x37\x49\xd4\xdf"
+ "\x84\x66\x05\x9e\x93\x88\xe7\x67\x8a\xfa\xde\xe7\x6f\xd7\x12\xba"
+ "\x14\xf6\xa8\x05\xf3\xc3\x7e\xe5\x9d\xbd\x92\x5d\x75\x6a\x2a\xa8"
+ "\xbe\x24\xb8\xed\x70\x81\xef\xd7\x84\xf1\x93\x08\x8f\xb3\x92\xef"
+ "\xdf\xef\xd4\x98\xa8\xbc\x33\x62\xe5\x78\x1e\x17\x75\xb0\x99\xea"
+ "\x81\xa6\x98\xc7\x61\xfb\x77\x9b\x5e\x8e\x03\xb1\x2f\x9c\x53\x53"
+ "\xc6\xe3\x32\xfc\x78\x17\x39\x24\xbc\x9a\x90\xe7\x2f\x58\x16\xd9"
+ "\x13\x00\xd4\x77\x56\x41\x98\xcd\x73\x06\xd2\x3d\xcc\x9b\x50\x05"
+ "\x23\x6d\x9e\xa3\x30\x0d\x20\xca\xe6\x39\x0b\x77\x02\x4c\xb6\x79"
+ "\xea\xd0\x5f\x69\xa1\xf8\x77\xef\x00\x95\x0a\xef\x95\xb7\x57\xa9"
+ "\x55\x36\x4f\x19\xc4\x55\x69\xf1\x5e\x0c\x0f\x85\x31\x97\xcd\x93"
+ "\x8a\x70\xf9\x90\xee\x65\x97\x93\xc3\xd8\xa7\x39\x5e\xd0\xa7\xee"
+ "\x62\x95\x36\x0f\xf6\x1d\x3c\xa7\x31\xdc\xc7\xd2\xbd\x5f\xe3\xe5"
+ "\x62\x3e\xcb\x22\x47\xba\xf7\x32\x9b\xbf\xeb\x5d\x7c\xff\x94\xa1"
+ "\x2c\x99\xcd\x93\x08\x9d\x4e\x27\xc2\x55\x32\x56\xb3\xc8\xbe\xe2"
+ "\x8a\x1a\x06\xe8\xbc\x84\x9a\x45\x0e\x56\x9b\x0a\x03\x58\x0e\x6c"
+ "\x87\xd9\xc0\x73\x78\xaf\x5d\xe4\xe3\xef\x96\x54\x3d\xd3\xa7\xc2"
+ "\x0c\xec\x88\x51\x19\x6c\x9e\x1e\xc8\xc1\xae\x44\xfa\x66\x07\x23"
+ "\xfa\xc7\x6e\xa7\x7e\x58\x22\xed\xb5\x1c\x99\xbe\xb9\x92\x61\x9c"
+ "\x8e\x45\x11\x9d\x7d\xc0\x6a\x30\x6d\x74\xea\x18\x8e\xcf\x92\x6a"
+ "\x44\x58\x07\xc1\x05\xe2\x21\x1c\x04\x9b\xee\xa5\x33\x30\x52\x8d"
+ "\x03\x51\xa9\x06\xbc\x92\xf0\x32\x61\x5a\x33\x33\xc7\xbc\x47\xfb"
+ "\x65\x62\x7a\x0b\xbe\x37\xbb\xe9\x6c\x07\xe2\xa5\x17\xc2\x11\xde"
+ "\x82\x7a\x95\x8c\xfa\x89\xf4\xa6\x5a\x39\xbd\xb5\xa9\xef\xba\x79"
+ "\x39\x52\xff\x20\xca\x91\xfa\x0e\x85\xf7\xa3\xee\xe0\xb3\xbd\x5f"
+ "\xc4\x7d\x8a\xe9\x32\x79\x3a\x4b\xaa\x1d\xcb\xe7\x70\x63\x3d\x44"
+ "\xbe\x56\x11\x1f\x91\xaf\x55\xc4\x4b\xc4\x6f\xb7\x95\xef\x01\x2c"
+ "\x8f\x63\x20\x2a\x0d\x7d\x95\xb4\xe8\x01\xee\xab\xa4\x19\xdc\x1c"
+ "\x77\xda\xad\x88\x27\x1b\xf5\x5b\xc3\xf4\x69\x06\x66\x49\x33\x0e"
+ "\x98\x0d\x90\xbe\x99\xb9\xd3\x3d\xdb\x3d\x39\x9b\x41\x33\x1d\xaa"
+ "\x54\x74\xde\x9e\xad\x3c\x1f\xcb\xd9\x86\xf7\x64\x8c\x87\x1b\x30"
+ "\xaf\x77\x59\x54\x9a\x81\xf2\x63\x35\x69\x46\xc4\x99\x80\xb8\xf2"
+ "\x89\xa6\xaf\xe9\x2c\xb3\xe8\xb4\xa4\xaf\x39\x7d\x69\xb9\x3e\x4b"
+ "\x5a\x95\x4f\x9f\x66\x92\x75\x88\xf4\x47\xf0\xad\x0e\x16\x3b\x99"
+ "\xc7\xe6\x39\x84\xad\x0e\xf6\x91\x9c\x67\x29\x1e\xfb\x4a\x47\x51"
+ "\xce\xa4\x53\x65\x78\x6f\x01\xd2\x9f\x4e\xd3\x2e\x82\x7d\x97\x74"
+ "\x68\xb1\xc9\xb9\x3d\x01\x4c\x2a\x7c\xaf\xcc\xf1\xe8\x60\x85\x49"
+ "\x5b\xe5\xb5\xa4\x65\x74\x9a\x48\x2e\x67\x30\x0d\xa5\x2b\x86\x48"
+ "\x15\xf6\x17\x54\xcc\x13\x59\xee\xd0\x8e\x29\xac\x64\x9d\xce\x54"
+ "\x84\x35\xf1\xf3\x03\x49\x8f\x08\x3e\xad\x8f\xd9\xbd\xfa\xc5\xbc"
+ "\x6c\x6c\x6c\x15\x74\xf4\xdd\x0b\xd4\x67\xeb\xe8\x6b\x21\x3d\xf5"
+ "\x21\x5f\xba\x50\x47\x07\xd2\xfa\xaa\xc2\x56\x5c\x01\x15\x86\x79"
+ "\x3b\x0a\x8f\x62\x7c\x1b\xc2\x9d\xe6\x7a\xbb\xf8\x8a\x27\xd2\xa3"
+ "\x4f\x4b\xf2\x58\xd2\xec\x8b\xaf\x0c\xb0\x8e\xc2\x3a\x58\xde\x57"
+ "\x85\xbc\x3a\x0a\x69\x17\x3d\x9a\x4e\x53\x3e\xc2\xb8\x30\xbc\x85"
+ "\xeb\x7f\xda\xc5\x7e\xb6\xf8\x59\x76\x79\xf1\x95\x4f\x59\x5a\x21"
+ "\x7b\x37\xa7\x1c\xc6\x8e\xde\xce\x7c\x54\x2f\x4e\xf7\x1c\x85\xd1"
+ "\x67\x69\x2f\xfd\x64\x48\xcd\xf3\xb1\xb4\x8b\x97\xd9\x8a\x67\x89"
+ "\x37\x89\xd0\x51\x88\x7a\x59\x5e\x47\xfc\xce\xed\x28\x3c\x89\xf9"
+ "\x27\x23\xde\x4a\x66\x2b\x3f\x84\xb0\xd6\xc8\xe5\x17\xf5\x70\xba"
+ "\xa7\x0e\x3c\x51\x69\x49\xde\x9a\xb4\x0c\x5f\x54\x9a\xc9\x57\x93"
+ "\x56\x85\x72\xea\xf2\xd4\xa4\xd9\xbd\x51\x8b\x51\x07\x16\x67\xa0"
+ "\x9c\x46\x92\xcc\xaf\x99\xc1\x80\xef\x8b\xaf\x91\xfc\x2d\x8b\x73"
+ "\x99\x7e\x71\x15\xfa\xc6\x4c\xe8\xfe\xe2\x5c\x1a\x87\x60\x51\x8b"
+ "\xab\x06\xa2\x16\x9b\x10\xae\x4a\xd4\xaf\xc5\x16\xd2\x4b\x1a\xef"
+ "\xc7\xb0\x6a\xec\x23\x69\x30\xbe\x19\xaf\x63\x78\x59\x59\x6d\x3a"
+ "\xf6\x8d\x21\x8a\xeb\x94\x25\x5d\xcf\xee\xb7\xa0\xaf\x7d\x05\xf1"
+ "\xa4\x1b\xd3\xbd\xf3\x18\xf2\x10\xeb\x49\xba\xde\x57\x93\x6e\x60"
+ "\xd1\xe9\x19\x6e\xae\xfb\xe9\xe9\x84\x7b\xe0\xb9\x78\x1a\x9f\xd0"
+ "\x62\x7c\x2e\x86\xfd\xd9\x4d\xba\xaa\x4f\xef\xf2\xe9\x33\x8c\x88"
+ "\xcb\xbe\x68\x17\x73\x78\x2d\x19\xe0\xb3\xa4\x3b\x3c\x23\xd0\x87"
+ "\x2f\x3f\x09\x64\x9f\x3c\x7f\x60\xc8\x83\x0f\x90\x1f\x2d\x5c\xfe"
+ "\xb6\x72\xac\x03\x9b\x27\x54\x75\xf4\xa1\x2e\x98\x7e\xcd\x6d\x53"
+ "\xa7\xf3\x0c\xe7\x29\xd2\xd1\x45\x3a\x45\xf2\x5d\x61\x82\x2a\xcc"
+ "\xcb\x8e\xb4\x38\xbc\x35\x88\x37\x0a\xf3\x89\x5e\x52\xe2\xe6\xf5"
+ "\x75\x09\xea\xeb\x49\x4c\xf3\x01\x08\x1d\x5f\x62\x1a\xce\x46\x92"
+ "\xad\x22\xfb\x94\xee\x71\x93\xce\xfc\x83\xec\x9a\xb0\x53\x90\x23"
+ "\xdb\x29\xb2\x51\xd4\x2f\x22\x3b\xe5\x93\xec\x94\x4f\xb2\x53\xfc"
+ "\x5d\x8f\xb6\xc6\x92\xca\xed\x51\x7a\xb9\xb0\x33\xe9\x5e\x23\x43"
+ "\xdd\x88\xc0\x7a\x0c\x42\x16\x08\x53\x9b\x3a\x86\xc3\x73\x3e\xa5"
+ "\x1a\x7d\x68\x6f\xf0\x4a\xf2\x09\x7b\x53\x25\xd9\x1b\xb5\x6c\x6f"
+ "\xe8\x4c\x34\xac\x53\xbe\x50\xf6\xc6\x27\xd9\x1b\x2f\x13\xf6\xc6"
+ "\x27\xd9\x1b\x0a\xf7\x4a\xf6\xc6\x1b\xc2\xde\xf8\x2c\xa9\x54\x5e"
+ "\x8d\x64\x67\xaa\xc8\xce\x50\x79\x7d\x35\xa9\x0e\x9f\xb0\x33\x7a"
+ "\xec\x13\xa9\xc9\xce\x78\x31\x8d\x4f\xb6\x33\x2e\x6e\x0f\x8c\x64"
+ "\x6b\x06\x9e\x07\xb4\x9f\x06\x20\x1b\xc3\xed\x89\x67\xb2\x87\xec"
+ "\x09\xf2\x6f\x9e\xd2\x9e\x20\xbe\x24\x7c\xd6\x4b\x76\xca\x14\xb9"
+ "\x9d\x79\xd0\x9e\x64\xa4\x97\x3b\x91\x2f\x7f\x83\x48\x0f\xda\xed"
+ "\xf2\xb2\x2a\x5b\xb9\x07\xd0\x0e\x54\xb1\xce\x2a\xd4\x91\x34\xd4"
+ "\x5f\x2f\xda\x0a\x00\xac\x97\x5d\x1e\xac\xe3\x98\xb7\xbd\xd3\xf4"
+ "\x09\x78\xb1\xae\xa6\xf5\xf5\xdb\x56\x38\xe3\xf5\x69\x17\x99\x03"
+ "\xf9\x63\x5f\x61\xaa\x42\xfb\x12\xef\xe8\xe8\x7b\x07\x52\x7b\x98"
+ "\x2f\x35\xd7\x6e\x40\x3a\xec\x69\x45\xd6\xc8\x15\xcf\xea\xb1\x9e"
+ "\x31\x2b\xda\xc5\x7f\x4f\xbb\xa8\x8f\xcc\xee\x81\x49\xa9\x79\xcc"
+ "\xe7\xc5\x7a\x86\xe5\xcd\xc0\x3a\x96\x8b\xb4\x9b\xb0\xce\x55\x61"
+ "\x3d\xeb\xf2\x28\xea\x19\xd6\x99\xc5\xf8\x6c\x10\xfc\x5b\x5c\x85"
+ "\xf5\x2c\xd7\xc7\xdb\xb3\x1e\xde\x17\xc5\xba\x56\x45\xe3\x76\x58"
+ "\xd7\x72\x7d\x35\xa2\xae\xf9\x44\x3a\x8b\x8f\xf8\xa7\x96\xea\x1a"
+ "\xca\x02\xe3\x9b\xf1\x3a\x86\x57\xe8\xba\x66\x0a\xa8\x6b\xcf\x4a"
+ "\x75\x2d\x4a\xd4\x35\x94\xa9\xc6\xfb\x9c\xa8\x6f\x84\x9f\xfa\xab"
+ "\x83\xf5\x2d\x3a\xbd\x8b\xce\x04\x10\xba\x43\x75\x2e\x1d\xdb\x95"
+ "\x0c\xe4\x67\xba\xc3\x67\xc9\x40\x7c\xcc\x41\x76\x13\x75\xf3\xef"
+ "\xd4\xd6\x21\x95\x7f\xcf\xf1\x4e\x40\xdb\x92\x01\x68\xcb\x3e\x45"
+ "\x3b\xfa\xf7\x15\x4e\x68\x46\x5c\x5d\x98\x9f\xdd\x8b\x75\xca\x57"
+ "\xc3\xeb\x93\xc9\xfb\x1c\xe1\x5c\x62\x1a\xc4\xc1\xdb\xca\xe0\xfa"
+ "\x74\xbd\x71\x53\x97\xf9\x27\x5a\x3b\x7c\x2d\xce\x8c\x32\xff\x44"
+ "\x6f\x87\x6b\xc9\xd2\xf3\x44\x3b\xfc\x4f\x2d\xf7\x65\xb0\x1e\x9a"
+ "\xb6\xc1\x8d\x17\xe0\x27\x5d\xa8\xf3\x80\xcf\x11\xf8\x7c\x26\x7d"
+ "\xda\xbb\xe8\x4b\x7c\xb8\x1b\xf3\x76\x51\x5d\x64\xe6\x59\xe4\xcb"
+ "\x25\xa1\x2e\xea\x98\x2b\x3e\x82\x45\xe7\xdc\xc9\x06\x62\x69\x6c"
+ "\x2e\x12\xdf\xc7\x22\x0f\xe2\xf0\x1e\x7d\xe8\x2a\xc4\xe0\x45\xe7"
+ "\x42\x56\x91\xff\x84\xcf\x46\xb6\x29\x76\xd4\xbe\x8d\x30\x3d\xd2"
+ "\x29\xce\x7f\x8d\xdc\xae\xa7\x31\xaa\x18\x7a\x66\xe6\x4f\xe3\x9b"
+ "\xae\xca\x67\xc0\x62\x7e\x81\x67\xc0\x9a\x21\xb6\xc9\xcc\x8e\x79"
+ "\x5d\xc4\x87\x45\x76\x99\x16\xa2\x0d\xe9\xbc\x05\xe9\xec\x79\x6c"
+ "\x73\x12\x7c\x50\x1e\x7a\xbf\x45\x97\x79\xf6\x60\xf9\x87\x89\x8f"
+ "\x93\x79\x32\x4c\x7c\xb2\xcc\xa7\xe1\xe6\x76\x52\x3b\xed\xdd\xc8"
+ "\xfa\x68\xef\x6e\x1a\x37\xa8\xf4\xb0\xff\xa0\xb3\x60\xb7\x79\x41"
+ "\x97\x5e\xee\x66\xb6\x3e\x66\xb5\x95\x5f\x84\x26\xda\x4f\xbc\x82"
+ "\xf9\x7c\x51\x39\x68\x97\x72\x74\xfd\x1b\x99\x87\xc6\x7d\x30\x8f"
+ "\x23\x76\x58\xd6\x2c\x64\x91\x96\xcb\xfb\x9b\xfa\x1c\x1d\xe2\x8a"
+ "\x22\x5c\x1d\x98\xde\x5b\x93\x83\xfa\x3a\xbb\xcb\xae\xd2\x9d\xe0"
+ "\x70\xfa\xb4\x5c\xd3\x16\xb8\xf9\x02\xdc\xa7\xe3\xfd\x04\x4b\x8e"
+ "\x81\x6c\x02\x86\xe9\x31\x2c\x06\xf1\xc7\xb9\xcc\xf7\xa1\xcf\xdd"
+ "\x5f\x27\x7c\xd9\xfb\x62\x64\x38\x3b\xcc\xee\x55\xce\x5b\x93\x56"
+ "\x49\x56\x05\xed\xff\xa6\x82\xe0\xdd\xec\x68\xe7\xb8\xa4\xd0\xd1"
+ "\x7e\x9b\x9e\x66\xa7\x73\xb8\x2a\xb7\xc2\x44\x94\x0f\xd1\xf7\x22"
+ "\xf6\x39\xce\x33\xf3\x7d\x86\x37\xb6\xb8\xb1\x4f\x71\x5f\x9d\x1d"
+ "\x3e\x1e\x96\x9f\xbe\xab\xac\x07\x71\x54\x55\x6f\x04\x20\xfe\x10"
+ "\x3f\xb1\xde\xf8\x90\x0f\x9f\x91\x4d\x6a\xda\x48\xfd\xee\xfb\xba"
+ "\x65\x7e\x0d\x2f\x93\x9c\x89\xa2\x6f\x3a\x67\x36\x33\x33\xb0\x4e"
+ "\xa2\xef\x18\x73\xee\x13\x3c\x58\x6c\xea\x47\x3b\x42\x63\xca\x74"
+ "\x66\x56\x69\x2c\x73\xbb\xcc\x73\xa6\xdb\xe1\xc1\x76\x69\xbc\xca"
+ "\x69\xf3\x2c\x20\xdb\x12\xb2\xdd\xe2\x7b\x95\x0e\xe2\xff\x69\x56"
+ "\xe7\x44\xb4\x43\xdc\x36\x1d\xec\xd9\x26\xe4\xef\x26\xbc\xb4\xd6"
+ "\xa3\x07\xe3\x4b\x9d\xac\x97\x59\x0e\x76\x53\x3f\x82\xf6\xfd\xc4"
+ "\xb0\x27\x51\xaf\x99\xb5\x84\x68\xfa\xe9\x93\xd6\x49\xd7\xe0\x7c"
+ "\x39\x68\x9a\x06\xc7\x89\x7e\x9a\x4c\xe3\x42\x62\x3c\x6c\x4e\x9b"
+ "\x1d\x16\xe4\xcb\x74\x91\x8f\x81\xbc\xd5\x91\xcf\x41\xbe\x06\x7d"
+ "\xa7\x28\xad\x60\x6e\xf2\x39\x10\xd6\x21\x97\x81\xca\x27\xca\xf5"
+ "\x53\x6d\x60\xb9\xe8\xdb\x7d\x64\x85\xe0\x41\xe9\x66\xd0\xf1\x33"
+ "\x7c\xbc\xf4\x9d\x63\x01\x2f\x0b\x95\x99\x97\x85\xdb\x58\x6c\x23"
+ "\x3c\xf7\xa2\x0e\xf1\xf0\x2a\xc4\x85\xfd\x9f\xf9\x5d\x42\x9f\xe6"
+ "\xb4\x0d\xb7\x86\x05\x75\xd3\x88\x7d\xd5\x49\x95\x3e\x76\x0e\x71"
+ "\xfe\x4d\x8c\xb1\xfd\xf4\x6f\x3e\xf2\xb3\xdd\xa4\xbb\x05\x13\xa9"
+ "\x4d\xb6\x55\x90\xbd\xe5\xb0\x37\x20\x6c\x0f\xc2\x74\x48\xb0\x1d"
+ "\xfc\xac\x42\x71\x0f\xa7\x3b\xb6\x63\x09\x48\x47\x8f\x83\xb7\xf7"
+ "\x07\x9b\xe5\x77\xec\xe3\x63\x3f\xf1\xa7\x0d\xac\xa6\x60\x62\x68"
+ "\x5a\x32\x8c\xd4\x9e\x79\xaf\xb2\x3e\xcc\xe7\x26\xd2\xa3\xca\xcd"
+ "\x30\x1e\x75\xf2\xb3\x6d\x5b\xe1\x46\xd2\x31\x16\x95\x13\x2f\xf8"
+ "\x9e\x68\x64\x66\xf4\x3d\xd1\xa2\x9a\x36\xc2\xcd\x58\x87\x0c\x17"
+ "\x20\x71\x41\x4e\x85\x01\x69\x05\xa8\xbe\x04\xe4\xa3\x7c\x8a\xf0"
+ "\x71\x36\xcf\xe7\xd0\x74\x89\x74\x31\x31\x5f\xd6\x45\x7c\x36\x5d"
+ "\xcf\x56\x20\x5f\x8f\x89\x31\x8a\xc4\xbf\xd1\x37\x89\x73\x90\xd8"
+ "\x4e\xe5\x15\x73\xa0\x13\x7f\xcf\xae\xb2\x89\x4c\xb4\x69\xcd\x76"
+ "\x48\x74\xe2\xfd\x18\xbf\xd0\x96\x48\xef\xcd\x08\x77\x84\x5d\xf5"
+ "\x12\xcc\x31\x0c\xb3\x32\xb3\x8a\xea\x49\x03\xe6\xdd\x67\x87\x15"
+ "\x27\x84\x6c\x12\x4f\x10\xae\x61\x68\x68\x66\x7c\xdf\xdb\xaf\xb0"
+ "\xbc\x73\x1f\x33\x6c\xa3\x31\xce\xb9\xd3\x78\xbd\x40\x5c\x4d\x6a"
+ "\x61\xb3\x7d\x48\x6b\xa3\xd9\x57\x88\xf6\xb9\xd0\x57\xbb\xba\x97"
+ "\x3f\x4b\x71\x4c\x6a\x47\x43\xe3\x3f\xd8\x43\x7b\x79\xf7\xc0\xdc"
+ "\x63\x02\xcf\xc1\x6e\xeb\x84\x0b\xf4\xce\xf7\xc6\x77\xea\x0b\x7b"
+ "\x6d\xf5\x49\xe2\x8c\x46\x84\x11\xfd\xf8\xb9\xbf\xe9\xc7\x3c\x5c"
+ "\xe6\xb9\x58\xa6\x87\x9a\xc5\xf7\x99\xc2\x90\xfb\x75\xf3\xf5\x51"
+ "\x58\x07\xa8\xce\x89\x3a\x3d\x6f\x57\x47\x33\xaf\x7f\x16\xd4\xf9"
+ "\x63\x92\xfd\xa5\xf1\x9c\x88\x73\x30\x6f\x67\x47\x2c\xd7\x6f\x35"
+ "\x53\xdf\xaf\x0f\x3a\xdb\x0d\xe3\x86\x5e\xf7\x27\xe3\x95\x89\x57"
+ "\xae\xf4\x5e\x8c\x17\x96\xf9\xfe\x2e\x7c\x2f\xe3\xbc\x3b\x98\xaf"
+ "\xb2\x63\x5c\x3f\xfa\xec\xf4\x6e\x87\xfb\x53\xd9\xc1\x38\xb5\xfc"
+ "\xdc\x74\x80\xc6\x09\xee\x2f\xb7\xc3\x5c\x10\xb2\x98\xc7\xe7\xee"
+ "\x20\x6d\xc4\x77\x56\x59\xcf\xdc\x6d\xdb\x9c\x48\xf7\xfd\x47\xda"
+ "\xea\x9d\x60\xb8\x9d\xca\x7f\xff\x51\x2a\x13\xcd\x61\xa1\x7b\x69"
+ "\x3d\x73\xb4\x36\x78\x80\xbe\xe5\x21\x2e\xac\xff\x4d\x71\x62\xcc"
+ "\xa1\x41\x4f\xf8\x24\x9d\x60\x72\xf9\x05\x9f\x0b\x7b\x0d\x1b\x55"
+ "\xf4\x1e\xd5\xb8\x9f\x8f\xc3\xec\x61\x95\x59\xd2\xdc\x85\x79\x23"
+ "\xb1\x9e\xcf\xa3\x73\x1e\x2f\xc1\xbc\x34\x86\xbc\x6e\x2d\xe4\x67"
+ "\x48\x39\xb0\xfd\xe9\x6b\xe4\xf3\x8d\xe6\xa1\xfd\x9b\x9b\xcb\xbf"
+ "\xcd\x60\x38\xb7\x35\x88\x73\x1f\xc6\x61\x7b\xd4\xd7\x51\xe8\x06"
+ "\x2f\x95\x19\xd3\xbe\x73\xd5\xad\xa5\x73\x2e\xb7\xd1\xf9\xf3\x48"
+ "\x07\x43\x59\x09\x5b\x76\xbf\x7d\xeb\x45\xe6\x96\xcb\xdc\xda\x4c"
+ "\xf5\x63\xde\x4e\x3b\xbc\x79\x66\xd8\x3a\x31\x58\x8e\xa4\xc3\xad"
+ "\x71\x42\x8e\x3e\xe4\x55\xb0\x1c\x93\x9a\x85\x0c\xe7\x9d\x09\x96"
+ "\x61\x12\xe6\x90\x84\x9a\x90\x34\x0b\xaf\x64\xe9\x3d\xf0\xd2\x05"
+ "\x3c\xa3\x5c\x93\xf6\xb8\xcc\x49\x31\x58\x3f\x2a\x84\x6c\x28\x1c"
+ "\xf5\x99\xf4\xe6\x4b\x6c\x7b\x06\xe8\x6c\xd0\x8b\x40\xe1\xa4\xe3"
+ "\x14\xee\x43\xff\x06\xdf\xe3\x31\x5e\x4f\xf5\x97\xce\xe3\x0a\x8c"
+ "\x1f\x3c\x77\x01\x92\x36\x13\xae\xc8\xed\xbb\x77\x93\xee\x22\xcc"
+ "\xf4\x48\xcf\xee\xdd\x98\xdf\x4e\x99\xaf\x18\x56\x4c\xf1\xa4\xa7"
+ "\x18\xde\x60\x87\xb7\xf8\xf9\x47\x4e\xec\x03\x86\xf6\x3d\x92\xac"
+ "\x83\x3e\x9a\x3e\x5d\x4f\xb2\xec\x83\x07\x4e\xa3\x1d\x43\xfb\xbd"
+ "\xda\x2e\xda\x9f\x07\x3a\xe8\x1d\xed\xe7\x67\xf8\xdc\xde\x81\x76"
+ "\xea\x5a\x6d\xb6\x6e\x40\x0d\xe1\xd7\xd4\x90\xe4\xa9\xfd\xf0\xa8"
+ "\x27\x3a\x33\xc6\xd6\x7b\x1c\x3a\x3d\xff\x0a\x86\x67\x38\x8e\xf7"
+ "\xe8\x5c\xb8\xca\xcd\xcc\xfb\xf6\xb5\x23\x5a\x9b\xe7\xb2\x95\x9f"
+ "\xc3\x0a\x0f\x70\x7e\xbc\x74\x0e\xbd\x80\x15\x1c\xb7\xc4\x9f\x0f"
+ "\x77\xef\x5b\xc5\x3c\xfb\xce\xd3\x5e\xf1\xb1\xa3\xf6\x5e\x83\xe9"
+ "\xaf\x6d\x01\x63\xc3\x35\x88\x6b\xbc\x06\xf1\xec\x1f\xf1\xea\x06"
+ "\xf4\xe3\x56\x5c\xd1\x03\xda\x89\xac\xb1\x26\xd0\x35\x6e\x41\x7f"
+ "\xce\x03\x2a\x6f\x0d\xfa\x73\x1e\xf4\xe7\x2e\xc7\x93\xbd\x1c\xf4"
+ "\xe7\x06\xb8\xaf\x9c\x53\xc7\xcf\x0f\xad\xc9\xa9\x1b\x53\x08\xaa"
+ "\x88\x5c\xd0\x23\x7d\x95\x97\xe0\x01\x55\x44\x0f\xfa\x92\x58\x66"
+ "\xbb\x54\x5e\xbc\xc7\x44\x16\x42\x38\x2f\x2b\xda\x70\x56\xb3\xda"
+ "\x3e\x6c\xdb\xac\x26\x9d\x72\x52\x5d\xc2\x32\x3c\x38\x9e\xbe\x39"
+ "\x1f\x9f\xe0\xd6\x96\x36\x30\x37\x85\x97\x4d\x66\x6e\x0c\xe7\x7b"
+ "\xfc\x1f\xc3\x70\x97\xf9\xc1\x78\xbb\xf6\xe1\x61\x75\x14\xfb\x4c"
+ "\x92\xad\x79\xf0\x4d\xa6\xae\x42\x1d\x4d\xcf\xd8\xea\x41\x7f\xfc"
+ "\x12\xd5\xe3\x07\x8f\xa4\x17\x33\x8f\x61\x1d\x7d\xff\x7f\xb0\x9e"
+ "\xe6\x26\xd0\x37\xc9\x7f\x41\x5f\xe7\x9b\xe6\x23\x50\x1b\x42\xfd"
+ "\x87\xc8\x62\xc4\x59\x9b\x9e\xc1\xb0\xcf\xfe\x6d\xfd\x7a\x9a\x7f"
+ "\x26\xd6\x9a\x3e\xd8\x63\x87\x75\xfc\x9b\x2a\x5f\x9f\xc3\xed\xe9"
+ "\xfc\x36\x27\xf2\x20\xd8\x06\xcc\xaf\xa7\x7d\xcb\xfb\x2d\xd9\x75"
+ "\xd6\x49\x64\xfb\xe7\xd7\x08\x5f\x28\xdb\x22\xda\x82\xf9\xcf\x8a"
+ "\xef\x07\xf3\x67\xd9\x61\x09\x6f\xe3\x4d\x53\x48\x27\xe6\x17\xb3"
+ "\xe8\xec\x97\x09\x6e\x46\x15\x54\xad\xf7\x40\x2e\xab\xc9\xb6\x30"
+ "\x5e\x57\x2e\x01\x7b\x75\x8d\x8b\xd6\xdc\x38\x6f\x5a\xe6\x42\xdf"
+ "\xa0\x0d\xe3\xea\x28\x0f\x07\xc2\x20\xdf\x47\x8a\xb9\x0b\xf3\x77"
+ "\xdb\xe1\x51\xc9\x1e\xce\xcf\x16\x63\xcc\xf3\xb3\xfb\x31\x2d\xfa"
+ "\x8a\x37\x60\x3c\xfa\xbf\x6b\x22\xa4\x6f\xdc\x8e\x1d\x7c\xad\xe8"
+ "\xfc\x93\x76\x28\xce\xa0\xb0\xb2\xc9\x10\x5b\x66\x60\xc3\xb5\x07"
+ "\xda\xe0\x72\x2e\x78\x80\xcf\xc3\x53\xc3\x4d\x2e\x73\x32\xc8\x78"
+ "\xb1\xbd\x7d\xab\x5f\xfd\xd8\x63\x18\x16\x23\xe3\x45\x98\x1b\xf1"
+ "\x3d\x6e\x10\x46\xa4\x99\x15\x90\xe6\xb1\x7e\xf5\x9d\x6f\x61\x58"
+ "\x8a\x22\x4d\x96\x22\x4d\x61\x40\x9a\x2a\x29\x9f\x0a\x45\x9a\x3d"
+ "\x8a\x34\x0d\x21\x68\x3b\xa6\x48\x63\x55\xa4\xe9\x0a\x41\x5b\x8f"
+ "\x22\x8d\x33\x38\xcd\x02\x6d\x00\x6f\x69\x3e\x91\x11\xc3\x62\x83"
+ "\xd3\x2c\x88\x57\xa4\x99\x2d\xbf\xa3\xef\x99\x25\x7c\x03\xd4\x27"
+ "\x94\x29\xca\xb5\x0e\xe3\xb1\xfc\x8f\x15\x5f\xc7\xff\xc6\xbe\x61"
+ "\xf6\x9e\xca\x43\xe2\x1c\x5d\xb2\xab\x34\xff\x80\xec\x39\x7d\x33"
+ "\x21\x9d\x20\xbf\x93\xf2\x3a\x0f\x0f\xed\x22\x1d\x42\x9c\x47\x87"
+ "\xf2\x63\x81\x55\x41\x67\x97\x82\x4e\xfb\x50\x7e\x2c\x70\x06\xa7"
+ "\x79\x48\x1b\x9c\xe6\xa1\x98\x80\x34\xcd\x22\x9f\x87\xe2\x15\x69"
+ "\x66\x2b\xd2\xa4\x0c\xd5\xcf\x87\xb2\x15\x69\x8a\x15\x69\x2a\xfc"
+ "\x3c\x7c\x88\xaf\x0d\xa7\xfa\x80\xe1\xd8\xff\x59\x7a\xf2\x3a\xbc"
+ "\xd3\xcb\xfa\x2c\xaf\x9d\x16\x7a\xfd\xf0\xf8\x3a\xb1\x6e\x8e\x9f"
+ "\x59\xd0\x03\x0f\x27\xc8\xdf\x96\xdf\xb8\xe6\x0e\xa3\x6f\x9e\xc8"
+ "\xdb\xde\xd6\x72\x37\xb6\xb9\x0f\x61\x1b\x9c\x66\x94\xe7\x96\xd0"
+ "\x7c\x1c\x7e\xe6\x0d\xef\x8f\x3c\xd4\x2d\xea\xdf\xc3\xf2\x37\x1d"
+ "\x2a\x0f\xf6\x33\x1e\x9e\xfe\xbf\x49\x57\x07\xd1\x45\x67\x3f\x20"
+ "\x0e\xd3\x60\x5f\x63\x90\x56\xca\xf3\xe1\xbf\xc8\xb4\x36\x89\x39"
+ "\x41\x34\x57\xd8\x41\xe7\x71\x60\x9a\x96\x80\xfe\x09\xd1\xea\x3c"
+ "\xbe\xc5\xad\x0d\xa6\xf9\xe1\x9d\x12\xcd\xdd\xc2\x46\x3d\xdc\x2d"
+ "\xdb\x93\x61\xf5\xcf\x72\xb0\xbd\xb3\x01\x80\xe6\x3c\x74\x34\xa0"
+ "\xbf\x89\x7d\x2c\xa2\xfb\x1c\xa4\x18\xb8\xff\xbb\xee\x1a\xd0\xb3"
+ "\xad\x62\x0e\x9f\x13\x21\xca\x92\x92\x45\xe7\x2e\x93\xef\xd3\x66"
+ "\xfa\x8a\xe6\xe5\x31\x7e\x06\x13\xa4\xec\x6a\xad\x70\x20\xad\x29"
+ "\x19\xf2\xfc\x21\x3b\xa4\x08\xbf\xce\x72\xd0\x4a\xf3\x35\x68\x6e"
+ "\x53\xab\x73\x36\xc1\x94\x21\x9d\xf2\xdc\xe9\x3e\x3a\xc3\x19\x61"
+ "\xa7\x0f\xd7\x57\x0a\xe4\xab\xa0\xe1\x91\x2f\x85\xfe\xa4\x9c\x0c"
+ "\xae\x0f\x61\xa8\xa7\x29\x5d\xc1\x3a\x97\x62\x0f\xd6\xb9\x14\x47"
+ "\x70\x7d\x50\x63\x7d\x58\xa8\x0d\x4e\xb3\x30\x26\x38\xcd\xc2\xb8"
+ "\x80\x34\x16\x91\xcf\xc2\xd9\x8a\x34\x29\x8a\x34\x81\xf6\x0f\xcb"
+ "\xbc\xb0\x70\xb0\xdf\xc9\xed\xfd\xc2\xf2\x80\x77\x75\x1d\x6f\xa7"
+ "\x16\xee\x91\xc3\xa4\x75\xc9\x7c\xae\x94\x84\xef\x88\xc2\x46\x11"
+ "\xfc\x49\x05\x0d\xa7\x15\x34\x9c\x95\xdf\xa5\xf9\x15\xef\x23\xef"
+ "\x26\x4b\x7a\xe6\x8c\xdc\x0e\x8f\x46\x7a\x96\x3c\x49\xbe\x19\xb5"
+ "\x4f\x7c\x0e\xdb\x56\xf4\x29\xaf\x80\x9e\xe6\x0e\x9e\x2f\x03\x0d"
+ "\x9d\x0b\x63\x87\x45\x99\xd8\x9f\xa3\xb3\xf6\xfa\xd0\x9f\x4a\x3f"
+ "\x0f\x0b\xfb\x30\xff\x7a\xcc\x03\x79\xf7\x48\x52\x30\x0d\x8f\x64"
+ "\x04\xd3\xf0\x48\x6e\xc0\xbb\x1e\xdf\x4d\x01\xe5\xd6\xd3\x3e\x11"
+ "\x2f\x73\xdf\xfa\x91\xdd\x72\x38\x8d\x01\x60\x19\x7b\x2b\xb9\x1f"
+ "\x90\x44\xf3\x06\xa3\xcf\xc1\x23\x1b\x68\xbc\x40\xc2\x79\x3c\x90"
+ "\xb7\x82\x17\x8f\xb4\x2b\xe8\xe8\x56\xd0\xd1\xeb\xb7\x35\x0b\xfb"
+ "\x44\x1d\x79\x04\x9f\x1f\x8f\xa7\x30\xe4\x85\x21\xd2\x63\xb8\xc1"
+ "\x3a\x85\xfc\xd4\x45\x0b\x9d\x58\x5e\xf6\xbc\x3a\x5a\x7a\x4f\x63"
+ "\x53\xc8\xef\xce\xb1\xa0\x7d\xa6\xb5\xb3\xb7\x62\x58\xa6\x90\xeb"
+ "\x22\x2c\xff\xd2\x24\x81\x77\x11\xff\xb6\x4f\xb0\xf8\x6c\x60\x51"
+ "\x07\xbb\x87\xd3\xe7\xfe\xe8\x83\x5d\xf2\x1c\x5b\xc4\xb1\x53\xae"
+ "\x0f\xbe\xda\x83\x5d\xbe\x9a\x55\xe8\x13\x2f\xaa\xc7\x3a\x61\x11"
+ "\x7d\x9a\x82\x33\xa8\xfb\xf5\x28\x3f\xec\x03\xa7\x4a\x7d\x99\x83"
+ "\x3d\x34\x77\x90\xf6\xaf\x40\x9b\x19\x21\xe6\x66\x2c\x3a\x1d\x50"
+ "\xaf\x9c\x86\x2d\xf3\xd8\x39\x48\xad\x21\xdf\x8e\xec\x06\xcd\x41"
+ "\x6c\xf5\x38\x80\xc6\x59\x6c\x9e\x0b\xdc\x27\xc7\x78\x8b\x48\x9b"
+ "\xaa\x0b\x48\xeb\x90\xc6\x41\x7a\x29\x6e\xa6\x07\xb4\xad\x4e\x07"
+ "\x9d\xb1\x1b\x23\xfc\xf8\xd4\x9a\x56\xb4\x17\x98\x26\x51\x4e\x43"
+ "\x63\x26\xfc\xbb\x7f\x19\x68\x67\x54\x80\xd6\xba\xe5\x1c\xc7\x2d"
+ "\x7d\x73\xe6\xfd\x23\x5b\x45\x2f\xd8\x9c\xdd\xe4\x53\x6a\xc5\xbc"
+ "\xad\x54\x8b\xc6\x0d\xba\xfe\x9a\x83\xd8\x86\xa5\x5a\xbc\x35\x07"
+ "\xdb\x91\x36\xac\xaf\x8b\x8e\x93\x0d\x0c\xe4\xdd\x82\x05\x19\x4b"
+ "\xd2\xd3\x12\x9e\x58\xb2\x30\x73\xc1\x1c\x43\x66\xd1\xda\x82\xfc"
+ "\x84\xf5\x1b\xca\x0c\x9b\x4a\x8a\xca\x8a\xd6\xad\xe6\xc7\x82\x19"
+ "\xf2\xca\xc4\x3d\xbe\x38\xaf\xb4\x6c\x2e\x3d\x4e\x37\x98\x4a\x0a"
+ "\x36\xf2\xc7\x69\xa3\x20\x18\x49\x51\x59\x41\x89\x61\x6a\xfe\x74"
+ "\xc3\x43\x79\x45\xc5\xb4\x8a\x21\x14\xae\x39\x86\x92\x82\x92\x82"
+ "\xbc\x7c\xc3\x5c\x83\x91\x30\x07\xa2\x0b\x90\xa7\x51\xb6\x4f\xa5"
+ "\xd8\x9e\xa3\x0f\xdd\x4b\x76\x8a\xda\xf5\xf3\x90\xbe\x81\x7c\x38"
+ "\x7e\x8e\x17\xea\x21\xb6\x09\x76\x97\x39\xad\x6c\x68\x3b\x9e\xb6"
+ "\x3b\x58\x7f\xd3\xea\x83\xf5\x37\xed\xc8\xd0\x76\x3c\x4d\x51\xff"
+ "\xd3\x14\xf5\x3f\xed\xec\xd0\x76\x3c\xcd\x11\x9c\x66\x31\x04\xa7"
+ "\x59\xac\x1f\xb4\x33\x48\xeb\x0e\x6e\x97\x16\xc7\x29\xd2\xcc\x52"
+ "\xa4\x49\x56\xbc\x67\x06\xbc\xa3\xef\xba\x38\x3f\xd0\x37\xc0\xf7"
+ "\x32\xb9\xae\xfb\xed\xdb\xe2\xdd\x32\x0c\xb5\x3d\xb4\xd6\x45\x82"
+ "\x6d\x0e\x80\xed\x95\x60\x07\xeb\x3f\xd9\x24\x9a\xbb\x29\xfc\xf3"
+ "\xf4\xa9\x92\x6d\xeb\xa9\xf6\xb7\xa1\x3d\x28\x8b\x5b\x2f\xc1\x62"
+ "\x3a\x6b\x91\x60\x1d\x34\x9f\x97\xbd\xba\xcc\xd5\x14\x0d\x3a\x4a"
+ "\x4b\xe7\x58\x31\x73\x6a\x03\xcd\x1f\xc7\xb0\x08\xbc\xd0\x4e\xa5"
+ "\xc7\xca\x73\xe7\x77\x22\x8c\x1d\xd2\xb9\x2e\x53\xba\x9d\x7c\xde"
+ "\x21\xcf\xaf\x86\xd6\x58\xd1\xd9\x70\xd5\x62\x0f\x89\x1e\x3a\x5f"
+ "\x8d\xf2\x46\x1c\x5a\xa6\x4e\xfd\x4c\x3a\x27\x4b\x8f\x57\x0c\xe2"
+ "\x2c\x96\x71\x22\xbe\x58\x10\xe7\xf1\xd1\x3c\x32\xc9\xef\x49\xdf"
+ "\x23\xfb\x17\xd4\x57\x08\x65\x3b\x42\xcf\xcd\x86\xc8\x6a\xb3\xaf"
+ "\xdb\xba\xad\x87\x68\x3a\x49\x7e\xa8\x2d\xd6\x03\x9d\x0d\x1e\xec"
+ "\xbf\x82\x9e\xf7\xa7\xca\x2f\x82\xad\xd9\x03\x34\x3e\x9c\x53\x0e"
+ "\x55\x4d\x6a\x5f\x37\x1b\x4c\x47\x7d\xb4\x74\x7e\x3e\xe5\x4e\x0a"
+ "\xc7\xf4\xd8\x97\x70\xd0\x1c\xee\x61\xc6\x23\x22\x09\xce\x3a\x85"
+ "\xfa\x7b\x19\xd3\x25\xdf\x77\x77\x13\xe2\x0a\x39\xbf\x58\x0d\x36"
+ "\x97\x39\x03\xdb\xbf\x4d\x5d\xb2\xcd\x6e\xad\xe7\xb6\x4f\x8d\xe1"
+ "\x55\xc8\x8b\x63\xc3\xf9\x29\x92\x7d\x37\xd1\xbc\x32\x84\x3d\x7a"
+ "\x3d\x58\xa2\xbb\x15\xcb\x8d\x75\xb1\xfe\x8d\x6d\xc6\x30\xc9\xbe"
+ "\xea\x30\x5d\x8f\x9c\xee\xdb\x94\x8f\x7c\x23\x6a\x8f\xb1\xae\x3a"
+ "\x45\x5f\x71\xc9\x93\x2f\xf3\x39\xcb\x8f\xa2\xff\x97\x21\xd7\x83"
+ "\xd1\xf8\x8e\xf6\x2f\x83\x8f\x27\xf2\x79\x3d\xd8\x9f\x2c\x35\xa1"
+ "\xcf\x16\xeb\x44\xdb\xf8\x68\x96\x1c\xc7\xc7\x89\x28\xae\x82\xb9"
+ "\x5b\x63\x7b\x28\xae\x6c\x30\x4e\xac\x21\x60\xad\xe5\x1e\x0a\xdf"
+ "\x23\x87\x8b\xb6\xe5\xd1\x06\xc5\xfb\x51\xf9\x1d\x9f\x4f\xe0\xb3"
+ "\x41\xc2\xef\x40\x9b\xab\x12\x7b\x2e\x2c\x19\xdf\xc8\xeb\xcd\xa3"
+ "\xdd\x72\x3c\x1f\x53\x3b\x4c\xdf\xc6\x9c\xe0\x8b\xce\xae\xe7\x3e"
+ "\x17\xa6\x79\xfb\x2b\x77\x18\xf6\x31\x54\x8c\xce\x54\xc5\x30\xc2"
+ "\x43\x75\x86\x9f\x6d\x8f\xef\xe7\xe0\xd1\xd3\xb4\xce\x81\x74\x64"
+ "\x93\x07\x26\x9a\xee\xa7\xf1\xe7\x25\x5c\x6f\x29\x8c\xf0\x12\x3e"
+ "\x6a\x13\x09\x37\xe1\xdb\x47\x3e\x2d\x9f\x2f\xb9\x84\xca\xbf\x67"
+ "\x38\x59\x61\x7c\x79\x00\x2f\xc3\xf0\x7d\x77\x70\x59\x97\xd4\x2b"
+ "\xde\x8f\xc8\xef\x34\xd6\x2b\x74\x6f\x49\x83\x14\xd7\x76\xbd\xbc"
+ "\xa6\xf0\x35\x32\x4b\x7a\x15\xf9\xb9\x83\xf1\x2f\xd5\x29\xde\x63"
+ "\xe5\xf7\x3a\xfe\x8d\x61\x69\xbc\x9c\x47\xb5\x98\xc3\x55\xdf\xb2"
+ "\xcd\x11\x76\xbd\xbd\x4c\x30\x4d\x76\x40\x9e\x23\xf0\xbd\xd8\x2f"
+ "\xbf\xa5\xe5\x32\x3e\x7c\xde\x19\x00\x87\x7e\xc9\xd2\x3a\x19\x4e"
+ "\x7c\xdf\x58\xda\x12\x90\xee\xd8\x37\x94\x55\xa1\xbb\x99\x5e\xa1"
+ "\xbb\x4b\x7b\x15\xb4\xb8\xfd\x38\x33\xb5\x7e\x5a\x32\xf5\x01\x70"
+ "\x58\x3f\x33\x0d\x4a\x5d\x2d\x2d\x27\x1d\x27\x7d\xcd\x4c\x0c\x11"
+ "\xe7\x96\xe2\xb2\x42\xeb\x78\xa6\x29\x20\x5c\xea\x1f\x65\x7e\x22"
+ "\xf9\x09\x64\x9f\x9d\xfd\x95\x99\xf2\xf9\xaa\x5c\x27\x69\x1f\xb1"
+ "\x99\xe2\x2c\x6f\xd4\xeb\xcc\x63\x4a\xbc\x62\xfd\x8d\x84\xc3\x8f"
+ "\xb3\x4a\xf8\x78\x99\xf6\x80\xb2\xf5\xd9\x61\x89\xfc\x9d\xc8\x21"
+ "\xc6\x06\x97\x9e\x1d\xae\xdf\xe1\x32\x3f\x36\x31\x98\x67\x8f\x4d"
+ "\xf7\xf3\xec\xb1\xd9\x7e\xbc\x8f\x25\x07\xc0\x7d\x88\xef\x99\x01"
+ "\x70\xb9\xdf\xa4\x9b\x42\x57\x1e\xdb\xad\xc8\xab\x3e\x00\x47\x4b"
+ "\x40\x5e\xc7\x02\xe0\xba\xf1\xdd\x3a\xbc\x7c\x1e\x3b\x3b\xbc\x7c"
+ "\x1e\x73\x87\x96\xcf\xe3\x7a\x7f\xbe\x8f\x4f\xfc\xe6\x7a\xf5\x78"
+ "\x52\x00\x3d\x4d\xf8\x9e\x11\x5c\x8f\x1e\xcf\x55\xbc\x0f\xca\x9f"
+ "\xa1\xed\x68\xd9\x92\x44\xe7\x71\x43\xd9\x64\xd0\x8b\x7a\xf6\xb8"
+ "\x25\x30\xfe\xed\x6b\x22\x9e\x68\xe4\xdf\xe0\xe8\xfb\xa6\x80\x3b"
+ "\xa1\x84\x23\x98\x80\xf8\x6e\x99\x76\x6c\xaf\x43\x9e\x05\x2a\xb7"
+ "\x7f\x36\x1f\xb5\x7f\x8f\x3b\xc5\x77\x9b\xe5\xa7\x99\xf9\xdd\xac"
+ "\xe1\xda\x32\x97\xf9\x09\x23\xf6\x19\x7a\x05\x7f\x9e\x40\xfd\x5f"
+ "\xc7\x7d\x13\x66\x59\x7e\x1a\xf5\xe9\xda\x79\x78\xe2\x13\xbc\x0f"
+ "\xe0\xfd\xf7\xc1\xed\xeb\x13\x99\xcc\xac\x5a\xda\x64\x56\xb6\xbb"
+ "\x4f\x14\x63\xdf\xe3\x5a\xa4\xa7\x2a\x2b\x44\xdc\x6e\x66\xd6\x2c"
+ "\x09\x11\xde\x8c\xf2\xba\x66\x87\x27\xce\x10\xbd\x01\xe1\x27\x98"
+ "\x79\x6c\x26\xc1\xdb\x29\x3f\x4c\x33\x9c\xdc\xe4\x75\x50\x42\xf7"
+ "\xb2\xb4\x8a\x72\x7c\x7d\x1e\xb2\xb6\x8b\x72\x64\xfd\x2d\x38\xef"
+ "\xac\x89\xa1\xcb\x91\x35\x0b\xcb\xf1\x75\xe8\x72\x64\x65\x70\xde"
+ "\xaa\xb1\x2c\x43\xfc\x8e\xac\x62\x2c\xcb\xd7\x9c\xef\xc1\xe1\x3b"
+ "\xe5\x7e\x6a\xe5\xd7\xd8\xff\x57\x03\x4f\xbb\xb4\xc2\x2f\x37\x09"
+ "\xee\x68\x64\x3d\x64\x84\xc8\xb3\x8d\x99\xc3\x97\xda\x21\xcb\x23"
+ "\xb7\x57\x52\xf8\x59\x41\x0b\xf2\x49\x4d\x7c\xc2\xf2\x60\xba\xe1"
+ "\xe4\x2d\xd7\x4f\xf1\x9d\xe9\x49\xac\xff\x4f\xd8\xe5\x36\x1d\xdb"
+ "\x73\x87\xcc\x47\x8c\x4b\x51\xc4\xb9\x03\xe2\xf2\x83\xe2\xb6\x0e"
+ "\x86\x57\xc8\xe1\xdf\x4e\x4e\x4f\x1e\x55\xc8\x09\xe5\xf3\xd4\xdc"
+ "\xe0\x72\x3f\x79\x52\x94\x0f\x65\x34\x84\xd7\x4f\x76\xa3\x8c\x06"
+ "\x42\xcb\xe8\x49\x67\x68\x5d\x7b\x2a\x82\xe3\x8b\x86\x10\xf8\x9e"
+ "\x8a\x47\xd9\x0d\x70\x1d\x94\xe4\x34\x54\x3e\x4f\xa5\xca\xf2\xf9"
+ "\x76\x65\x7c\xca\xa2\x28\xa3\xf7\x3c\x2c\x1b\x23\xca\xba\x6c\xb9"
+ "\x02\xf7\x91\xd0\xba\xf8\x94\x15\xcb\xe9\x0d\x5d\xce\xa7\xce\x0e"
+ "\xaf\x8b\x4f\xd1\xb7\x3a\xef\x50\x5d\x5c\xa6\x17\x69\x20\x44\x9a"
+ "\x65\xd3\x99\x39\x54\x3e\xcb\x92\xc9\x2f\xb2\xc3\xb2\x0a\xfa\x4e"
+ "\x17\x10\x9e\x1d\xac\x7f\x58\x06\x4a\x47\xfc\xf3\x88\x7e\x0c\xc9"
+ "\xe1\xbc\x01\xd4\xdf\xa4\x93\x2e\xf3\xb2\x93\x0a\x5e\x5d\x3e\x0f"
+ "\xd9\x73\xfb\xd5\xea\x87\x04\xbf\x96\xab\x14\x34\x75\x87\xe6\xd7"
+ "\x32\x07\xf2\xeb\x72\x68\x7e\x65\x47\x0c\xcf\xaf\x6c\x92\xff\xe5"
+ "\xa1\xfc\xca\x4e\x0a\xe4\x97\xcf\x2c\xca\x77\x5b\x2c\xea\xc6\x40"
+ "\x0e\x6b\x12\xb6\x5c\x1f\x89\xba\x22\xd2\xf4\x51\x9a\xb2\x48\xb7"
+ "\xd0\x13\xc3\x04\xd0\x5d\x82\xec\x6c\xb9\xfe\x8f\xad\x87\x70\x36"
+ "\xb0\x8c\xe6\x68\xd3\x19\xcf\x7a\x5b\xf9\x65\xab\xcd\x63\x04\x1a"
+ "\x6f\x54\xe4\x7b\x22\xb4\x2d\xc8\xee\x42\x9e\xd6\x86\x08\xef\x15"
+ "\x63\xa6\xcb\x0d\xc1\x36\x62\x39\x04\xcb\x68\x19\x4f\x07\x83\xfb"
+ "\x9f\x5e\xff\xba\xbe\xcc\x96\x9b\x86\xca\x6c\x45\x94\x24\xaf\x2f"
+ "\x83\xe9\x5b\xbe\x3b\xb4\xbc\x96\x37\x0f\x2f\xaf\xe5\x27\x87\x97"
+ "\xd7\x72\xea\xfb\x5c\xb6\xc3\x0a\x7d\x70\xbb\xb1\xdc\x11\x5c\x5e"
+ "\xcc\x17\xd3\x31\xf5\x88\x1b\xe8\xfd\xdb\x96\x5b\xbe\xc8\xc6\x91"
+ "\xac\x68\xfd\x3f\xd2\x3f\x99\x68\xfc\xae\x38\x86\xc5\x8d\x3c\xb4"
+ "\x6c\x19\xf6\xdc\xf0\x88\x4e\xec\x57\xd2\xfc\x3c\xc3\x24\x1a\x2b"
+ "\x5b\xf1\xb9\x4f\xad\x9a\x83\xcf\xea\xf3\x90\xfb\x1b\x9f\x5a\x53"
+ "\x45\x73\xc9\xf8\xda\x41\xfe\x7d\x62\x85\x27\x50\x16\x34\xa7\x6c"
+ "\x9f\xd8\xcb\x91\xc6\x39\x3f\x3d\x0f\x39\xbb\x84\x5c\x72\x6b\x82"
+ "\xf9\x98\x63\x08\x2d\x97\x9c\xd9\x28\x97\x4f\x43\xcb\x25\x27\x73"
+ "\x78\xb9\xe4\x98\x50\x2e\x9f\x0e\xad\x47\x39\xbb\xa5\x7a\xb4\x83"
+ "\xd2\x18\xd6\x91\xbf\x9a\xf3\x35\xc1\xe0\x33\xd6\x91\x9c\xcf\x28"
+ "\x3e\xa1\x4f\xae\x47\x3c\x0d\xf5\xff\x79\xfe\x12\xcc\x09\x09\x47"
+ "\x20\x5e\x7b\x64\x5f\xa8\x7a\x92\x43\xdf\x53\x55\x33\x4c\xa0\x43"
+ "\x1e\x66\x1d\x22\x1c\x25\x00\x97\x20\x37\x8d\xe0\x28\x9c\xce\x5c"
+ "\xf6\xc3\xe7\xc6\xcb\x70\x7c\x5c\x54\xc0\x1a\x98\xab\x10\x08\x2e"
+ "\x18\x77\xae\x54\xfe\x70\xde\x8e\x10\x3c\xc1\x29\x60\xca\x45\x7d"
+ "\xcc\x3d\x19\x5c\x1f\x73\x2d\xc1\xfa\x99\x43\xdf\x27\x22\x7d\x68"
+ "\xe7\x50\x97\x7b\xbc\x66\xd5\x9c\xef\xa7\x6e\xe6\x45\x28\xea\x26"
+ "\xea\x40\xde\xaf\x85\x0e\xe4\xed\x0d\xa6\x35\x2f\x2e\xb4\x0e\xe4"
+ "\x25\x0e\xaf\x03\x79\x59\xc3\xeb\x40\x5e\x19\xe9\x80\x1d\xf2\x8e"
+ "\x06\xd7\xcd\xbc\x3d\xc1\x65\xc7\x7c\x79\xdd\x84\xa8\xef\x52\x37"
+ "\xd1\x17\xba\x61\xb8\x7a\x28\xf9\xff\xaa\xa6\x6b\x00\xdf\x81\x67"
+ "\x3a\xac\x57\x48\xdf\xd3\x49\xf4\x0d\x09\x6d\x7c\x21\xf1\xb0\x91"
+ "\xf7\xd1\x9e\xce\x0c\xe4\xe3\x3e\xd1\xd7\xaa\x44\xd8\xbf\xd0\x9c"
+ "\x3d\xc1\xcf\x95\x87\x83\xcb\xff\x74\x59\x68\x7e\x3e\xbd\x07\xf9"
+ "\x59\x19\x9a\x9f\x4f\x1f\x19\x9e\x9f\x4f\xb7\xd1\x5a\xf5\xa1\x75"
+ "\xea\xe9\xb3\x86\x8d\xdc\x47\xe1\x69\x2e\xc1\xca\x7b\xbf\x5d\xfb"
+ "\xb4\x32\x26\xb8\x7d\x7a\xda\xf3\xdd\xdb\xa7\x95\x59\xa1\xdb\xa7"
+ "\x95\xa6\xd0\xed\xd3\xca\xdd\xa2\x3e\xac\xb4\x06\xd7\x87\x95\xcd"
+ "\xc1\x3a\x81\xbc\xfb\xde\xda\xa7\x7c\xbd\xa2\x0e\x54\x9f\x87\xfc"
+ "\x1a\xf4\x29\x24\x5b\x58\xf0\x58\x30\x8d\xf9\xd3\x43\xcb\x2d\x3f"
+ "\x19\xe5\x56\x1d\x5a\x6e\xf9\xb9\xc3\xcb\x2d\xbf\x02\xe5\x56\x3d"
+ "\x54\x6e\xf9\x75\xdf\xdd\xa7\xc8\x6f\x0f\x96\x59\xfe\xb1\xef\x2e"
+ "\xb3\x82\x88\xd0\x32\x2b\x88\x0b\x2d\xb3\x82\x44\x21\xb3\x82\xb2"
+ "\x60\x99\x15\x64\x06\xcb\x0c\xf9\xf6\xbd\xc9\xac\xa0\x4d\x21\xb3"
+ "\xf5\xe7\x61\xd5\x02\x94\x59\x97\x90\xd9\xea\x91\x0a\x1a\xed\xa1"
+ "\x65\x56\xe0\x46\x99\xad\x0f\x2d\xb3\x55\x31\xc3\xcb\x6c\x15\xed"
+ "\xa1\xb1\x7e\xa8\xcc\x56\xa5\x7c\x77\x99\xad\xaa\x08\x96\xd9\xaa"
+ "\xfc\xef\x2e\xb3\x55\xd6\xd0\x32\x5b\xd5\x1d\x5a\x66\xab\x1c\x42"
+ "\x66\xab\xe3\x83\x65\xb6\x5a\x17\x2c\x33\xe4\xdb\x3f\x29\x33\x94"
+ "\x4f\x97\x98\xaf\xbb\xfa\xc5\x7e\x3e\xa6\xbd\xba\xca\x0e\x85\xd2"
+ "\x7a\xf6\x42\xae\x3b\x92\x0c\xdf\x46\x98\xb2\xa1\x6d\xf7\xea\x06"
+ "\x29\xec\x89\xa1\x72\x58\x7d\x02\xdb\xd5\xbe\xb6\x0a\x3e\xaf\x4b"
+ "\xc8\x90\x78\x8e\x70\x62\x8c\x6c\x35\xb7\xff\x28\x63\x46\xfb\x0a"
+ "\x53\x5b\x8c\xf0\x4e\xc2\x43\xfb\xaa\x04\xe3\x2a\xd4\x7e\x17\xbf"
+ "\x6c\xf8\x39\xe6\xcb\xbb\x68\xef\xff\xf3\x50\x34\x5e\xe8\x6a\xa1"
+ "\xd2\xff\x6d\xc2\xbc\x2e\x0a\x3d\x7d\x46\x31\x66\x52\x38\x8c\xff"
+ "\x5b\x48\xfe\x6f\x53\x68\x3d\x2d\xbc\x8e\xff\x5b\x48\xfc\x68\x0a"
+ "\xe8\xaf\x46\xa3\x07\xa8\xe8\xaf\x16\x7a\x22\x9d\x42\x77\xb8\x1f"
+ "\x5b\xb3\xbc\xcb\x65\x2e\x8a\x53\xd0\x8c\xb2\x29\x3a\x2c\xd1\x7c"
+ "\x20\x38\x7d\x51\x62\x68\x9a\x8b\x32\x91\xe6\xb7\x43\xd3\x5c\x64"
+ "\x1a\x9e\xe6\xa2\x3d\x48\xf3\xdb\x43\xeb\x56\x51\x8b\xa4\x07\x21"
+ "\xfa\xe5\x45\xd6\xd0\xf2\x2f\x52\xc8\x1f\xb2\xca\x2a\x98\x83\xa7"
+ "\x0f\x82\x7b\x06\x02\xe1\x68\xae\x3e\xc1\x92\x8e\x84\x80\x9d\xae"
+ "\xc4\x39\x0c\x5c\xe6\x10\xdd\xa3\xb5\x05\x21\x75\xef\x99\x2a\x51"
+ "\x1f\x9f\xe9\x0e\xae\x8f\xcf\xd4\x07\xd7\x47\xe4\x75\x70\xba\x13"
+ "\xc1\xf1\x85\xbb\xbf\x3f\x1b\xbb\x26\x5e\xa1\x03\xef\x9e\x87\x35"
+ "\x3f\x17\x3a\xb0\xc6\x1b\x4c\xc7\x9a\xa4\xd0\x3a\xb0\x26\x0b\xcb"
+ "\xff\x6e\x68\x1d\x58\x53\x36\xbc\x0e\xac\xb1\x20\x2f\xdf\x0d\xd4"
+ "\xdb\xa5\x15\x49\xe1\x0a\x98\xe3\xa1\x6d\xde\x9a\xd3\xa1\xc7\x75"
+ "\xd6\xf4\x08\x1e\x17\x4f\x0c\xe6\xf1\x1a\x4f\x30\x0f\xb1\x2c\xff"
+ "\x3c\x0f\x07\xcf\xca\x70\x99\x8b\x95\xf5\xdf\x76\x1e\x8a\xa5\xfa"
+ "\xbf\xf6\xf3\x60\x1a\x8b\xa5\xfe\x4f\xa8\xb1\xac\xe2\x16\xe4\xa5"
+ "\x2d\x34\x2f\x8b\xad\xa1\xcb\x5c\x4c\x6d\x90\xcd\x37\xa4\x2e\x15"
+ "\x3b\x30\x7c\x29\x7d\x3b\xa0\x31\xac\x46\x0c\x5f\xea\x01\x1d\x6f"
+ "\xaf\x06\xdb\xa5\xb5\xb4\xf7\x11\xe3\x63\xcc\xa8\xbf\x91\x13\x21"
+ "\x83\xda\x20\xa2\x2b\xa7\x42\xf9\x4d\x74\x6d\x12\xd1\x4d\xf3\x58"
+ "\x68\x5d\x4d\x64\x39\x64\xd8\x9c\x1e\x90\xf5\x9d\xe0\x15\xb8\x4d"
+ "\x54\x2f\x08\x5e\x86\x15\x63\x9d\x55\x0a\xdb\xb4\xb6\x3e\xb4\x8c"
+ "\xd7\x1e\x1b\x5e\x77\xd6\x9e\x16\x72\x5e\x07\xc1\x72\x5e\xdb\xe3"
+ "\x33\x8f\xcd\xa4\xb2\xa2\x0e\x7c\xa7\x7a\x42\xdf\x4e\x87\xb5\xf7"
+ "\x3b\x96\x75\x9b\xb6\xc1\xa4\x0b\xb0\xae\x90\xe7\xa7\x66\xe8\x53"
+ "\xa8\xa0\x8d\xdb\x80\x75\xef\x70\x3a\x11\x26\xc7\x03\x6a\xb6\x63"
+ "\x4d\x37\xc5\x35\x99\x99\x9b\xce\x8d\x91\xcf\x80\x41\x5d\xb8\xe1"
+ "\x1c\xac\xdb\x1e\x94\x1e\x5b\x23\x9b\xc0\x71\x52\x8c\xef\xaf\x3b"
+ "\x21\x8f\xc3\x0f\x37\xbe\x8f\x30\x67\xe5\x79\xbf\xe2\x5b\xd8\xba"
+ "\xae\x61\xdb\x65\xa4\x89\xd6\x8e\x13\x4d\xd7\xb7\x03\xeb\x8d\xb2"
+ "\xfe\x8a\x6f\x73\xeb\x93\xfc\x6b\x5b\xd6\xa7\x62\x9c\xf3\x3a\xe3"
+ "\xb9\x01\xf5\x60\x7d\x79\x20\x1e\x71\x5e\xcc\xfa\x3d\xf2\xfa\x14"
+ "\x7c\xae\xff\x06\x5c\x32\x3d\x56\x05\x3d\x5d\xd8\x5f\x70\x4a\x38"
+ "\xce\x7e\x03\x8e\x18\x5b\xcb\x1c\x98\xe1\x03\xcd\x05\x28\x99\x46"
+ "\xe7\xcf\xd8\x1a\x7a\x21\xc2\x03\x5a\xd1\xb7\x33\xdd\x4d\x6b\x43"
+ "\xa8\x6f\x68\xf3\xcc\xb3\xd2\x37\x38\x3e\x87\x20\x76\x9e\xb5\xa3"
+ "\xdc\x2b\xed\xc1\x66\x7a\x80\x78\xda\x51\x78\xd9\xda\xb0\x9f\xf5"
+ "\x1e\xe2\x7b\x6f\x99\x82\xfa\x7f\x7b\x68\xfe\x0f\xcd\xc3\xd8\x06"
+ "\xf3\x10\xfe\x2f\xa2\xae\x97\x28\x7c\x52\xd3\x30\xfd\x3f\x13\xf5"
+ "\xff\xe6\x85\xae\xe7\xa6\xeb\xf4\xff\x4c\xd4\xff\x9b\x17\xd8\x6e"
+ "\x8a\xef\x3c\xa6\xb3\x81\x3e\x29\xed\x8f\x65\x58\x45\x7e\xe6\xb3"
+ "\x8f\xde\x55\x07\x7a\x0f\x7d\xd3\xc6\xba\x69\xeb\x6d\xa3\xfa\xaa"
+ "\xef\x70\x9c\xa0\x7d\x18\x74\x63\x4d\xa4\x8b\xd4\x96\x51\x7d\x7d"
+ "\xd6\xc0\xdb\x32\x8f\xa8\x8b\x95\xe5\xcc\x31\xbd\x07\x75\x68\x7d"
+ "\xa1\x8c\x2b\x62\x6b\xa1\x58\xf7\x31\xb6\x07\xc2\x6d\xbd\xbc\x5d"
+ "\x54\x91\xbf\xca\xfd\x56\xcf\x15\x20\xbc\xad\x15\x1d\x40\x78\x7d"
+ "\x83\xed\x24\xc7\x5d\x41\x75\x9c\x70\x12\xee\x4e\x84\x23\xbc\x04"
+ "\x27\x97\x43\xac\x8d\x79\xb6\x25\xb0\xec\x7c\xfc\x05\xf3\xc6\xf0"
+ "\xcf\x68\x5c\xc5\x46\xe9\x2a\x97\xb1\x19\x3d\xf4\xcd\xec\xb2\x95"
+ "\x55\xae\x61\x33\x4a\x68\x4c\xac\x84\xce\x81\x56\xbd\xfd\x77\x7b"
+ "\x58\xd9\x64\xd0\x89\xb0\x67\xfb\xda\x0c\x6e\xb0\x43\x89\x31\xd8"
+ "\x46\x94\x28\xfc\x5f\x13\xef\x67\xe2\x5d\x4b\xf3\x13\xa5\xf9\xab"
+ "\x64\x0f\x98\xcd\xe3\xe2\xfa\x71\xbd\x39\x15\xf4\x4d\x9a\xe6\x44"
+ "\x89\xfd\xdf\x4a\xca\x15\x63\x6f\x8e\x7d\x7c\x5e\xcd\x5f\x31\xdf"
+ "\xd2\x30\xa1\x23\x65\x61\xc1\x32\x2d\xa9\xaf\xbc\x48\xdf\x82\x44"
+ "\x7b\xb0\xc2\xa3\xb4\x8f\x25\x27\x64\xdf\x4d\x11\xde\x25\xb7\x07"
+ "\x86\x75\x84\xb7\x54\xd1\xce\x94\x70\xff\xdf\x3b\xa4\x5d\x28\x25"
+ "\xbb\x1e\xa4\x93\x9d\x5c\x87\x4a\x0d\x1d\x4e\xd4\x9b\x12\xd2\xff"
+ "\xd2\x03\x08\xb3\x9d\xd6\x1c\xe2\x7b\xf8\x25\x28\xcd\xf0\x9a\x41"
+ "\xd7\xe1\xe0\x6b\xaa\xf4\xa8\x23\x5c\x6f\xa9\xdd\x98\x29\xe6\x23"
+ "\x39\x15\x79\x14\xcb\x3c\x27\x98\xce\x92\xbf\x82\x98\x4f\x41\xba"
+ "\x50\x9a\x44\x73\x33\xc6\xf6\xf1\xbd\xb6\xf4\xb2\x0e\xd9\x3c\xdd"
+ "\xd0\xe9\x51\xf6\x79\x4a\x8f\x87\x2e\x7b\x29\xb5\xff\xb5\x76\x28"
+ "\x8b\x0b\x96\x6d\x29\x6f\xff\xe5\xef\x3a\x28\x7b\x47\x70\xba\x32"
+ "\x6d\xb0\xec\x4b\xea\x29\x7e\xd8\x39\x3e\x96\xe5\x67\xb0\x3f\x93"
+ "\xe3\xe4\xf3\xbd\xca\xb0\xfe\x97\x64\x5e\xcf\x0e\x32\xfd\xf2\x33"
+ "\x3e\x84\x95\xe6\x05\xa3\xdd\x2a\xdb\x1d\x34\x66\x34\x8e\x8f\x19"
+ "\xe5\x9c\x87\x0d\xd2\xb7\x9f\x0d\x1d\x0a\xfa\x5a\x86\xf7\x0d\xca"
+ "\xe8\xfb\x4f\x4e\x68\x9b\x51\x76\x36\xb4\x6f\x50\xe6\x94\xec\x42"
+ "\x0e\x8b\x52\xea\xc1\x06\x5a\x4f\xc7\xd3\xc8\x7d\x58\x1a\x0b\x1d"
+ "\xbe\x0f\xbb\x21\x69\xb0\x0f\x5b\x42\xf6\x60\x43\xfc\x60\x1f\xd6"
+ "\x11\xaa\x0f\x6b\x0f\x21\xcf\x0d\x3b\x43\xcb\x73\x43\x43\xe8\x3e"
+ "\xec\x86\xe3\xa2\x9d\xdf\xd0\x1b\x2c\xe7\x0d\xa7\xfd\xdf\x84\xcb"
+ "\x5a\xbe\x3f\x7f\x78\xe3\xec\xa1\xfe\xf0\xc6\xdf\x0a\x59\x6d\xbc"
+ "\x12\x4c\xdb\xc6\x8c\xd0\xb6\x7d\x63\xe1\xf0\xfe\xf0\xc6\x9d\xc3"
+ "\xdb\xf6\x8d\xcd\x43\xfd\x61\xc3\x08\x05\x4c\xdb\xa0\xaf\x14\xe4"
+ "\x9b\x6d\x3c\x2b\xf8\xb4\x89\xfc\x39\x4d\x00\xbc\x33\x58\xdf\x91"
+ "\x66\xc4\x87\xb6\xed\x02\xd9\x34\x59\x67\x86\xe3\x09\xed\xbd\x74"
+ "\x5b\x1d\x8c\xc4\x3a\xf0\xae\xcb\xbc\x69\x50\xff\x69\x1e\x1f\xe5"
+ "\x43\x36\x72\xd8\xf9\x74\x6a\x99\x3e\xa2\x63\x53\xc5\xf5\xbe\x97"
+ "\x6a\x62\x21\xe3\xe5\x21\xfc\xd8\xc4\xfd\x3f\xc2\x71\x7d\x99\x6d"
+ "\xea\x53\xd4\x31\xa7\x98\x87\x5b\xfe\x7b\x21\xb7\x72\x45\x5f\xb6"
+ "\x5c\xc7\xd7\xf4\x0d\x6b\x6f\xcb\xe3\x43\xeb\x68\x79\xd2\xa0\xbd"
+ "\x2d\xe1\x78\x37\x2b\xe2\x73\x85\x0c\xca\x4f\xf8\xa2\x02\xc7\xba"
+ "\xcb\xcb\x83\x6d\x52\x79\xae\x22\x9d\xa2\xff\x57\xce\xe9\xf9\x76"
+ "\xed\x4d\x79\xef\xf0\xed\xcd\xe6\x0d\xa2\xfc\x5b\x14\xdf\x97\x37"
+ "\xeb\xae\xdf\xde\x6c\x1e\xa6\xfc\x9b\x93\x82\xdb\x9b\x2d\x8a\x6f"
+ "\xf4\x9b\x73\x43\xb7\x37\x9b\xcb\x65\x3b\x23\xec\xc6\xe6\x3f\x7d"
+ "\x3b\x7b\xb3\xf9\x58\xb0\xbd\xd9\x5c\xff\x4d\xf6\xa6\x75\x88\xbd"
+ "\xd9\xec\x8c\x6c\x08\x55\x96\x2d\x11\xa1\xed\xcd\x96\x38\x21\xc3"
+ "\x2d\x15\xc1\xf6\x66\x4b\x62\xb0\x0c\x37\x2b\x64\xb8\x45\xf1\xfd"
+ "\x7b\xb3\xee\x7f\xd7\x26\x69\x34\x1a\xb5\x46\xa5\x56\x69\x30\x0a"
+ "\x8b\x07\xe1\x1a\xad\x26\x0c\xaf\x11\xd2\x3d\x5c\xad\x51\x6b\xf1"
+ "\x0a\x93\xee\x23\x14\xef\xe1\x94\x16\x2f\xad\x74\x0f\x53\xbc\x8f"
+ "\xf8\x86\xf8\x70\x29\x5f\x39\x7f\xad\xe2\x3d\xec\x1b\xe2\x47\xfc"
+ "\x93\xe9\x61\xc8\x7b\xf0\x3a\xc8\x85\xeb\x36\xe6\x15\x17\xe5\xf3"
+ "\x79\xed\x05\x86\xbc\x95\x2b\x0b\x4a\x4b\x0d\x65\xeb\x0d\x0f\x3e"
+ "\xb0\xe4\x9e\x39\x06\x31\x3d\xbe\x78\xee\xd4\xfc\x51\x90\xb6\xa9"
+ "\x84\x22\xd2\x96\x2e\xcc\x32\x64\x3c\xf8\x40\x70\xa4\x8c\x86\x4f"
+ "\x83\xbf\x1e\x96\x80\xba\x97\xf4\xe2\x38\x80\x3d\xfb\xb9\xdd\xe9"
+ "\xa1\xb5\xe7\xa2\x3f\x51\xf5\x97\xd3\xb4\x7e\xf9\x5a\x25\xa3\x75"
+ "\x15\xe7\xa0\x62\x2b\x15\x22\xa1\xb9\x0a\x4c\x4f\xd3\x7e\x2a\x15"
+ "\x07\xd8\x1f\x1c\x60\x78\x04\xd4\xe7\x60\xd7\x17\x6d\x29\x08\x8b"
+ "\xef\x36\xbb\x07\x0c\x95\xe4\xdb\x56\xbd\x88\x71\x2a\x76\xbf\x0f"
+ "\xc3\x9c\xd2\xfa\xfc\xca\x03\x3c\xec\x0f\x55\x32\x5c\xe4\x79\xd8"
+ "\x3a\x97\xfd\x81\xf1\x77\xda\xb3\x46\xc0\x6d\x8d\x62\xea\xe7\xba"
+ "\xc8\x2e\x34\x44\x83\x96\xe6\x65\x1f\x88\x06\xdd\x81\x71\xb4\xe7"
+ "\xee\x56\xad\x3c\x2f\xfb\x45\x7c\xb7\xc3\xae\x5e\xca\x9b\x60\x7d"
+ "\xea\xe7\xae\x11\x7c\x63\x30\xfc\x2c\xff\x3c\xee\xad\x5a\x35\xc2"
+ "\xa5\x7f\x06\x91\x91\x5e\xf6\xa5\x3b\x3a\x53\x37\x23\x05\xfd\x34"
+ "\x14\xc5\x69\x4f\x15\x88\xb5\x51\x5b\xb7\x6e\xf6\x32\x0f\xed\x99"
+ "\x90\xd6\x57\xc9\xaa\xd7\x82\x16\xeb\xb3\xca\x5a\x42\x6b\x29\xb6"
+ "\xe6\x37\x15\x80\x16\xcb\x3f\xf1\x02\x6c\xab\x33\x2c\x46\xbf\x31"
+ "\x0d\xb4\x1f\x97\xd3\x7a\xd7\x9c\x3b\xf7\xfd\x19\xb4\xbf\xba\x56"
+ "\xa5\xbe\xc6\x62\xa1\xa2\x8c\xf5\x32\xda\x87\xdb\xc9\xdc\x34\xdf"
+ "\xf6\x74\xae\x97\x60\x26\xb8\x2a\x63\xa1\x13\xdd\x97\xad\x67\x99"
+ "\x7b\xf7\x9f\xc5\x7e\x15\x1d\x7d\x4e\x5a\x3f\xab\xdb\x9a\x06\x9a"
+ "\xf3\x59\xa0\xee\x28\xac\x07\x5b\xb6\x13\x2a\xce\xb2\xde\xd3\xb9"
+ "\x9f\x43\x67\xe1\x31\xc8\xe9\x06\xf5\xe9\x9e\xbf\x01\xdf\x4b\xba"
+ "\xf6\xc3\xe6\x6d\x57\x20\x76\x6b\x11\x85\x5d\x81\x2d\x5b\x61\xcc"
+ "\x96\x4f\xa8\x1f\xd4\x8d\xf9\x5c\x84\xa7\xce\x80\x0a\xf1\xa9\x9f"
+ "\xfb\x1b\xc4\x3e\xf7\x24\xad\x33\x4f\x82\x86\x6d\x10\xcb\x2a\xe3"
+ "\x23\xae\x55\xc6\xeb\xaf\xb1\xf8\x68\x57\x65\x7c\x4c\xa7\x09\xe1"
+ "\x7b\xde\x81\xb1\xdd\x10\xf3\x87\x0b\xdd\xea\xfa\xaf\x60\x22\x95"
+ "\xe9\x3c\x96\xad\xe1\x2b\x84\xaf\x3d\x64\xf0\x61\xda\xc0\x34\x9e"
+ "\xa8\x43\xb3\x6d\x59\x6e\xf0\x21\xae\xfa\x6b\x30\xb1\xe1\x1a\xc4"
+ "\xfa\x6a\x0e\x19\x28\x5d\x1f\x54\xd6\xd8\x4e\x03\x6a\x0a\xf3\x0e"
+ "\xd4\x66\xd3\xb8\x49\xf8\xdb\x4f\x9f\xd0\xda\x4e\xf7\x41\x87\xf3"
+ "\x1a\x74\xc2\x5f\xc1\x56\xfe\x0f\xeb\xaf\x9e\x3e\x11\x86\xfe\xa4"
+ "\xca\xba\x85\xe6\xc0\x0b\xdd\xa9\xec\xa0\xfd\xf3\xaa\xa0\x7a\x1b"
+ "\x44\x98\xb6\x40\xf8\x05\x0c\xe7\xb6\xc7\x92\x8e\x7d\xb0\x7f\x58"
+ "\xb7\xf0\xf5\xe0\xbb\x7a\xb7\x75\x80\xa6\xd3\x59\x4f\xeb\x8e\xd5"
+ "\xde\xe8\x0f\x9b\x6d\xce\x2e\xb0\x99\x3e\xb5\xfa\xf4\x1f\xee\xde"
+ "\xe3\x03\xdd\xaf\xaf\x76\xa9\x6d\xda\xab\x60\xcb\x72\xc2\xbb\x98"
+ "\x37\xab\xfd\xf0\x28\xda\xac\xa4\x4e\xa7\x9b\xf6\xdf\x31\xb2\xfe"
+ "\xd8\x51\xd5\x25\x30\xbd\xf1\x2b\x88\x3b\xf4\x15\xc4\x33\x57\xbc"
+ "\x9a\xd6\x78\xd3\x7e\x69\x87\xf0\x1e\x81\x7d\x30\x2c\x3b\x5f\xeb"
+ "\xcd\xa2\xa4\xb5\xde\x03\xf1\xd0\x74\xcd\xbf\xd6\xfb\x5a\xbf\x7f"
+ "\xad\x37\xea\x94\x8e\xd6\x7b\xdb\x61\x5b\x43\xe4\x69\x08\xc7\x7a"
+ "\x62\x25\xfd\xae\xbe\x04\xda\x1d\x97\x00\x66\x54\xa9\xa9\x9f\xa9"
+ "\xc5\xfa\xb0\xd5\x86\xb2\xa1\xe7\x73\x50\x35\x0b\xef\x11\x78\x61"
+ "\x7f\xae\x8a\xef\x55\xd1\x23\xe9\x31\x86\xa9\x31\xec\x16\xbc\x6b"
+ "\xf0\x7e\x63\x65\x03\x73\x60\x5e\xb4\x96\x62\x14\xe9\xb3\xb4\xbe"
+ "\xbc\xd7\x65\xae\x8a\xb0\xc3\xd1\x62\x59\xaf\x85\x7d\xdf\xaa\x7b"
+ "\xf7\xdc\x45\xda\xef\xdd\xc1\xe9\x1a\x28\x54\xd1\xde\xef\x52\x38"
+ "\xd1\xb0\x81\xf2\xc5\xfc\xb3\xf0\x1e\x29\xfa\xa0\x95\x7d\x72\xda"
+ "\xfe\x81\x42\xca\x73\x2d\x86\x33\x39\x1c\xcb\xad\xa5\xb8\x7f\x3b"
+ "\x77\x51\x2d\x60\xe2\xd5\x88\xd3\x2d\xe1\xc7\xba\x5f\x71\x94\xea"
+ "\x78\xbf\x3a\x92\xb5\xe6\xce\x82\x86\xfd\xec\xf4\xa1\xfd\xac\x4d"
+ "\xd4\xbd\xaa\x63\x76\xf8\x17\xbe\xf7\x24\xb6\xe1\x6d\x7b\x30\xae"
+ "\x15\x7b\xe3\xc4\x97\xb6\x7c\x9a\x5f\x5a\xd5\x65\x87\x29\x31\x81"
+ "\x65\x60\xe6\x2d\xc7\xa8\x1d\xfd\x97\x6d\xed\xd8\x9f\x7c\xee\x58"
+ "\x67\x4f\x1f\xfc\xea\x5a\x6f\x58\xe5\x47\xa0\xb6\x79\xce\xc1\xcc"
+ "\x18\x71\x4e\x4e\xd3\x7e\x66\x7f\x99\xce\x0f\xde\xcf\xfa\x50\x5f"
+ "\x6e\xb9\x00\xdb\x6f\xb9\x2b\x06\x62\xfe\x88\x5e\x89\xb0\x4f\xdb"
+ "\xef\x0d\xb0\x4f\xef\x74\xd8\x4f\x04\xd8\xa6\x5d\x6b\x87\xda\xa6"
+ "\x9d\x45\xc2\x36\x61\xdd\xe7\xb6\xc8\x6b\x97\xc2\x1f\x53\x84\x4b"
+ "\xeb\x57\x76\xde\xa7\x08\x77\x4b\xe1\x53\x15\xe1\x0e\x11\xbe\xa3"
+ "\x40\xb6\x7d\x9d\x44\xc7\x26\xb2\x7d\x3b\x16\x92\xed\xeb\xcc\x95"
+ "\x6c\x1f\xb7\x3f\x3b\x12\xd8\xeb\x68\x8b\x36\x92\xbd\xd9\x11\x46"
+ "\xf4\xb3\x3f\x80\x4c\xfb\xc8\xf3\x60\xfe\x80\xc2\x2c\x7f\x05\x2d"
+ "\x5e\x92\xdd\xab\xb8\x89\xec\x1e\xd9\x3c\xb2\x7d\x07\xc7\xb1\xee"
+ "\x83\xfb\xd9\x99\x06\xbe\x6f\xb5\x79\xd0\xfe\xbd\x84\x61\x7b\x30"
+ "\xec\x25\x8c\x27\x3b\x48\x3c\xe9\xc8\x3a\x01\xfc\x5c\x1b\x4b\x4e"
+ "\xbc\x4f\x6d\x84\x7d\x28\x6f\xda\xff\x6a\x27\xf2\x37\x52\x05\x26"
+ "\x5b\x99\x93\xaf\x43\xa1\xbd\xd2\x3b\xcb\x7a\xa8\xde\x8d\xdb\xe1"
+ "\xa3\x71\x8a\xcf\x61\x9b\x93\x5d\xa0\xb5\x2a\x44\x43\xce\xe6\x47"
+ "\x68\xaf\x6f\x55\x5b\x21\x00\xed\x4b\x40\x36\x1b\x69\xd1\x5a\x90"
+ "\x26\xb1\xb7\xb0\xf9\xa4\x1d\x3e\x95\xf4\x75\x17\xad\x55\xc3\x36"
+ "\x05\x3b\xe2\x66\xb4\x8f\x58\xb6\x48\x6f\x15\xd0\xde\x2c\x74\xbe"
+ "\x26\xdd\x0f\xaa\x7d\x85\x16\x79\x7f\x16\x33\xda\x06\x84\xb1\x75"
+ "\xbb\x81\x68\xb6\x83\x39\xb5\xa3\xe2\x04\xa6\xdf\xee\x20\xde\x30"
+ "\x73\xa5\x8c\x43\xc5\x71\xa8\xf9\xd8\x6d\x21\xc2\xd9\x85\x7f\x93"
+ "\xad\xeb\xc8\x76\x00\xd9\x7d\x5b\x2f\xe2\xa8\x38\x27\x70\x20\x2e"
+ "\x86\x6d\x40\x50\x9c\x84\x7f\xcc\x56\xf6\x25\xe2\x3f\x49\xf2\xa2"
+ "\x7d\xba\x68\x9e\x12\xf2\x25\x82\xf6\x6a\x10\x7e\xa8\x79\x41\xd3"
+ "\x5f\x01\xa4\xbd\xc6\x50\xdf\xcc\xc9\xb4\x97\x17\xed\x2f\x76\xbd"
+ "\xbd\xc5\x90\x47\x71\xf2\xfe\x62\xbe\x4d\xdf\xef\xde\x62\x88\x3b"
+ "\xb6\x51\xcd\xb0\xce\x99\x93\x69\x7f\x31\xa4\xbf\x85\xf4\x50\x2a"
+ "\x53\xca\x2b\x4f\x11\xcf\xb7\xef\xa1\xb0\x6a\x33\x6b\x97\xe5\x4f"
+ "\xe5\xa5\xb2\x60\x9c\x49\xf8\x87\x0c\xeb\xe5\xce\x14\x8a\xc7\xb0"
+ "\x6c\x82\x9f\x89\x76\xcc\x86\x6d\xd8\xdb\xe7\xbc\xea\xea\x2d\xa0"
+ "\x15\x36\x6d\x57\x1e\xa5\x17\x36\x6d\x57\xac\xdf\xa6\xed\x1a\x23"
+ "\x6c\x9a\xe0\xb1\xb0\x69\xbb\x54\xc2\xa6\xed\xfc\x9a\xcf\x27\x42"
+ "\x9b\x46\x71\x64\xd7\x64\x9b\x76\x68\x1c\x6b\x27\xdb\xe1\x32\xef"
+ "\xec\x95\x6d\xdb\x5e\x0c\x23\xdb\x41\x34\x0a\x3b\xb5\x23\x89\xfd"
+ "\xcf\x78\x10\xf3\x35\xe9\xb9\x90\xf6\xcf\xe8\x95\x9e\xa9\x3d\x79"
+ "\x52\xd8\xb8\x5d\x89\x7e\x1b\xb7\xd3\xea\x4f\x4b\x36\x6e\xd7\xa3"
+ "\xc2\xc6\x89\xf0\xa6\xa7\xc8\xc6\xed\x48\x22\x1e\x48\xf8\xd5\xf4"
+ "\x1d\x4d\x82\x27\x3e\xa6\x04\xda\xb8\xe0\xfa\xb5\xab\x4e\xb6\x71"
+ "\x64\xdb\xf0\xbd\xc5\x0e\x93\xf9\xb8\x30\xd5\xb3\x3a\xe4\xb9\x5c"
+ "\xef\x48\x06\x54\x66\x3a\x3f\x80\xf8\x36\xff\x22\x84\x4b\xfb\xd6"
+ "\x48\xe5\xde\x65\x97\xd7\x68\x22\xff\x87\xee\x69\x06\xfe\x7d\xc9"
+ "\x50\xd6\xb7\xd2\x7e\x8e\xb6\xaa\x73\x60\xab\x67\x55\x9d\x9e\xb3"
+ "\xe0\xdb\xb1\xe6\x33\x92\x2b\xf6\x37\x7e\x4a\x77\xb2\x3b\x17\xe0"
+ "\xf9\xc9\x39\x4e\x3e\x7e\xff\x59\xb5\x1a\xe3\xca\x83\xe2\xe6\x52"
+ "\x1e\x34\xae\x88\xcf\xba\xe1\xc6\x11\xbe\x43\x5e\x7b\xaf\x93\xd7"
+ "\x9b\x3c\x2f\xf4\xa5\xb0\xdf\x13\x75\x09\x9e\xe7\xdf\xd0\xf8\x9e"
+ "\xcc\xa1\x71\xfd\x45\x8a\xd7\x0c\x13\xff\xf5\xf5\xd3\xbf\x30\xfe"
+ "\xfa\xe9\x5f\xb8\x8f\x6c\x10\xad\xc7\xf3\x9a\x83\xf1\x8c\xf5\xc8"
+ "\x70\x17\x08\x2e\x4f\xfa\x0e\xf2\x59\xe5\x64\xde\x2f\x8b\x95\x71"
+ "\x92\xde\xed\x43\x38\xbe\x7f\x2d\xda\xc8\xe4\xcd\x40\x7b\x07\x07"
+ "\xa6\x3d\xe4\xe7\xef\x0b\x19\xd7\x19\xa7\x89\xb0\x61\x2f\x90\xce"
+ "\x97\x6f\xc5\x56\x90\xd6\xd2\xd4\x0d\x7e\x7b\x78\xc1\x89\xf6\x92"
+ "\x9f\xdf\x2a\xad\xdb\xed\x43\xfb\x76\x2b\xed\xb1\x49\x7e\xa5\xb4"
+ "\xd6\xe2\x26\xb4\xcb\xd1\xb4\x0f\x0b\x8d\x57\xe7\x78\x33\xd4\xad"
+ "\x7c\xff\xfd\xdd\x46\x39\xed\x70\x63\x7b\x94\xaf\x94\x27\x5f\x87"
+ "\x84\x69\xf2\xe5\x34\x84\x9b\xd6\xde\x60\x7b\x7c\x2b\xdf\xdf\xcc"
+ "\xd3\x47\x36\xf0\x26\xf4\x41\xa3\x45\x3e\xb9\x20\xe5\x53\x6f\x87"
+ "\xe7\xf3\xaf\xb7\xce\x69\xf8\xf2\xed\x3e\xf3\xdd\xcb\x07\x52\xf9"
+ "\x5e\xd4\x7f\x43\xf9\xae\x93\xef\x8b\xa9\xdf\x3d\x5f\xbd\x9c\xef"
+ "\xee\xef\xce\xd7\x17\x4f\x7e\x7b\xbe\x1a\x25\xbe\xbe\xe8\xf8\x06"
+ "\xbe\x86\xc8\xe7\x67\x71\xdf\x3e\x1f\x83\x94\xcf\xcf\xb2\x42\xe5"
+ "\x03\xfc\x37\xec\x7e\x3d\x3a\xf9\x8c\x18\xe9\x5c\xe2\x91\x88\xa7"
+ "\xd9\x0e\xbb\x07\xcf\xb0\x12\xe7\x25\xfd\xec\xb8\x1d\x5e\xac\x0b"
+ "\x5e\xc7\xf5\xb3\x3f\xe5\x34\x53\xbb\xce\x7c\x76\xf8\xd9\x19\x1a"
+ "\x6b\x4b\xde\x2a\xf6\x07\x94\xd2\xa0\x3d\x7f\x71\xe2\xf5\xbe\xa7"
+ "\xf1\xb3\x30\xa4\xbd\x3b\x68\x7d\x2a\xab\x6d\x80\xfe\xca\x42\x10"
+ "\x67\x45\xbf\x74\x37\xad\x43\xc2\xe7\x70\x7c\x16\xe3\x50\x74\xbe"
+ "\x80\xd8\x93\x62\x04\x86\x6d\xa7\xf3\x27\xc4\xfa\xbd\x97\x32\x91"
+ "\x06\xbe\x07\xbb\xd8\x63\x9f\xef\xed\xe2\x44\x38\x35\xa5\x15\x7b"
+ "\x7a\xbc\x54\x2e\xc3\xd8\x65\x7c\x83\xfb\x5b\xbc\xb4\x50\xb4\x2d"
+ "\x2f\xa5\xf4\x0f\x73\x8e\x11\xed\x73\xd6\xb2\xcd\x18\xb4\xfe\x70"
+ "\x41\x49\xc9\xfa\x92\x39\x86\xd2\xb5\x4f\x27\x94\x96\xe5\x95\x6d"
+ "\x28\xe5\x0b\xd5\x47\x01\x06\x18\xca\x8a\xd6\x16\xac\xdf\x50\x16"
+ "\xbf\x29\xaf\x48\x2c\x6c\x9f\x86\x80\x81\x40\x10\x7c\x6e\x24\xda"
+ "\xa0\x2e\xa6\xe6\x7b\x50\xf0\xb3\x23\x69\x2f\x12\x79\xdd\x6e\x5b"
+ "\x2c\x3f\x63\x0b\x6d\xd6\x9e\x44\x3b\xac\xef\x95\xe5\x40\xfb\x23"
+ "\xa2\xdf\x12\x7b\x01\xf6\x3c\x49\xba\x93\x8e\x2e\x68\x93\xd8\x57"
+ "\x82\xef\x0d\x60\x2b\xc3\x80\x4e\xd0\x59\x37\xd2\x38\xec\x9e\x2e"
+ "\x9f\xf9\x25\x2b\xdf\xef\x71\xcb\x05\x7a\xbf\x22\xfb\x09\xf4\x5d"
+ "\x49\x7c\x07\xbe\x75\xde\x39\xd8\x33\x95\xf2\xa5\x7a\xd7\x58\x2b"
+ "\xce\xea\x66\xe6\x97\xba\x69\xad\x36\xbe\xeb\x90\x06\xab\xec\x8b"
+ "\x22\xbd\x11\x2c\xaa\x41\x67\x87\x3d\xce\xf7\xf5\x0e\x90\xd6\x7a"
+ "\xeb\x1a\xc5\xba\x6e\x2d\xc2\xf6\x0d\xc2\x9a\x69\xdf\xe3\x06\x1d"
+ "\xb6\x9b\x21\xbf\x65\xb3\xe8\x22\xda\xeb\x2c\x2c\xb0\xcc\xd8\xaf"
+ "\x46\xf9\xed\xfd\x39\x96\x3d\x46\xd6\x15\x21\xfb\xbd\x7b\xc5\xde"
+ "\xcb\x45\x3a\x0c\x1b\x81\x77\x43\x3f\xc6\xd1\x1e\x08\x18\x97\x4b"
+ "\xdf\xc8\x3a\x2b\x2e\x5b\x5b\x63\xcf\xa1\xdc\xf7\x9a\xec\xb0\x71"
+ "\xa2\x58\xb7\x86\xf0\x98\x87\xad\xea\x1a\xb4\x19\x98\x95\xc6\xe8"
+ "\xec\xb0\xf7\x64\x9b\xc1\x09\x4c\xb3\xec\x33\x4a\x87\xf5\x2a\xb6"
+ "\xb2\x9c\x7c\x11\x0c\xe7\xeb\xf3\xf6\x1e\x93\x79\x5e\x66\x60\x17"
+ "\x09\x66\xb8\x71\x65\x6a\x2f\xab\x79\x5b\xf2\x15\xd0\x1c\xac\x1e"
+ "\xd8\x7b\x46\xd9\x5e\x4c\xcd\x9f\x63\xc8\xcf\x2b\x33\x14\x17\xad"
+ "\x2b\x30\xe4\x17\xe5\x1b\xd6\xad\x2f\x33\xac\x5e\x4f\x03\x3c\x34"
+ "\xa4\x13\xa4\x13\x3e\x2a\xdf\xa6\xac\x30\xf9\x1b\x76\xff\xa6\xc2"
+ "\x11\x42\xa7\xab\x13\xfa\x5d\x85\xe1\xc1\x3c\xa9\x8e\x12\x6d\xe5"
+ "\xbe\x5c\xa4\x5d\x2b\xd6\xff\x69\xb0\x8f\xb9\x0f\xcb\xbf\xb7\x3d"
+ "\xb8\xee\x56\x2f\x97\x60\xf7\xc8\xb0\x5c\x2f\xa6\x5c\x18\x8c\xab"
+ "\x96\xf4\xb1\x49\xac\x53\xe6\xfb\xde\x34\xf1\x39\xfc\xfb\xac\xc3"
+ "\xa6\xa1\xbd\xbe\xb6\xc0\xca\x4b\xb0\xef\x4d\x66\xde\xeb\x94\x74"
+ "\x48\xe7\xb3\x14\xc5\x4a\xfa\x83\x3a\x51\x0d\x43\xf5\xa7\x3a\x9b"
+ "\xf4\x87\xb9\xb2\x74\x7c\xbe\x87\xc7\x8d\x76\x0e\xdf\xb1\x7d\xb6"
+ "\xc3\xbe\x7c\x2a\x87\x73\x53\x96\xae\xf2\x00\xdf\x7f\xef\x0b\xfa"
+ "\x76\x4a\xe7\xd3\xa0\xae\x8c\x14\xe7\x68\x56\x67\xca\x32\x92\xe1"
+ "\x43\xd7\x61\xae\x2f\xc1\x3a\x26\xf8\xf9\x6b\xae\x63\xe8\x1f\x20"
+ "\x4d\x6a\x79\x9f\x3f\x6a\x43\x90\xb6\xb6\xb2\xad\x8c\x61\x1e\x27"
+ "\x02\xf4\xe0\x52\x28\x3d\x40\xd9\xae\x2c\x5e\xbf\x72\x0d\x56\xf4"
+ "\x92\x82\xb2\x95\x85\xb4\xb7\x05\xd9\x01\xbe\x71\xc6\xd4\x7c\xc3"
+ "\x86\xd2\x82\x95\xa3\x20\x14\xd4\x60\x64\xa0\xfc\xf5\x3e\xd4\xd7"
+ "\xfe\xfe\xac\x30\x5a\x63\x21\xd6\x54\xd4\x6c\xed\x2f\xc5\xbe\x48"
+ "\x90\xdc\x6b\x9e\xb5\xc5\x1a\xd1\xa7\x33\xf2\xbd\xe3\x88\x67\x62"
+ "\x9e\x40\xcd\x6f\x89\x0f\xfd\x6a\x15\xb6\x27\x96\x32\x59\x07\xf0"
+ "\xb9\x0a\xcb\x54\xe8\x9f\xa3\x51\x73\xbc\x5f\x1d\x76\x96\xec\x8f"
+ "\x98\x0f\x72\x01\xed\x40\x64\xd3\x39\xb0\xf0\xb9\x60\x8d\xbc\x3d"
+ "\xb2\x1c\x97\xd3\xec\x1b\x5c\xe7\x5c\x33\x51\xd6\x93\x80\x34\x3f"
+ "\xa7\x30\xbe\xd7\x91\xb9\xba\x8b\x64\xce\x84\xec\xb5\x32\x1c\xf2"
+ "\x95\x35\x71\x3b\x52\xa3\x53\xda\x86\xf7\xf5\xf4\x4d\x5c\xd0\xc3"
+ "\xf5\x4f\x5f\xe8\xe0\xfb\xa6\xa0\xaf\x77\x0e\x6a\x6e\x94\xe6\xa7"
+ "\xf0\x31\x45\x5b\x39\xe2\x72\x0b\x5c\x98\xd7\x55\x39\x2f\x16\x55"
+ "\xe8\x68\xe2\x7a\x56\x53\xe8\x1f\x33\xac\x89\xa1\xbe\x32\xeb\xcf"
+ "\x1a\x61\x07\x4b\x26\xd7\x2d\x7c\x2e\x1b\x2f\xf6\x70\x23\x7d\xa3"
+ "\x72\x92\x5e\xf9\x75\xaa\xe6\x88\x2c\x6f\x2a\x33\xa6\xcb\x36\xf0"
+ "\x7d\x7e\x6b\xac\x32\x2f\x87\xdb\x6b\x86\xd7\x5b\x7d\x11\x9d\xfb"
+ "\xc4\xeb\x2e\xef\xe7\x89\xfd\x85\x68\x9d\x8b\x86\x45\x15\xc5\x9e"
+ "\x87\xda\x3f\xd1\xdc\xfd\x48\x37\xf5\x9b\x8a\x62\x69\xef\x04\xd1"
+ "\x96\xd5\x1a\x50\x87\x63\xfc\x6b\xd3\x6b\xd1\xff\xb3\xc4\x08\xd9"
+ "\xd5\x26\x06\xd4\x3d\x87\x34\x1f\x20\x9c\x78\x44\xf6\xcc\x56\xbe"
+ "\x80\xd7\x57\xb1\xee\xb7\xb6\x50\x4e\xc7\xf7\x19\x40\xdd\xa0\x79"
+ "\xb0\x97\xa0\x76\x37\xb5\x11\x44\x9f\x1d\x6a\x75\x94\x3f\x95\x8f"
+ "\xda\x6c\xae\x37\xb1\x74\x06\x4a\x6d\x8b\x82\x86\xe3\x32\x2e\x09"
+ "\x77\x9b\xfc\x4e\xfb\x8e\xd9\xa1\x2e\x83\xce\x81\x6c\x75\xf2\x32"
+ "\x8c\x6e\xc3\x5e\x41\x9b\x93\xc3\xf5\xc9\x3c\xc4\xf0\x2a\x7c\x47"
+ "\x59\xec\x01\xf1\x4d\xa8\x41\x27\x6c\x51\x1d\x9d\x61\xca\x2a\x0d"
+ "\xb4\x2f\x61\xa2\xb0\x37\x7c\x2f\x1d\x1e\x37\x52\xaa\xb3\x23\x69"
+ "\x8d\x10\x9f\x17\xe3\xf4\x70\xdb\x20\xf6\x5e\xc0\x78\xac\x23\x2e"
+ "\x3a\xd3\x65\xa0\x70\xa4\xa0\xed\xe5\xdc\xc1\x3c\xe8\x7c\x4a\xfe"
+ "\x0d\xf2\xe5\x0c\xb1\x97\x49\x38\xf6\xf5\x5e\xae\x92\xe5\xb7\x73"
+ "\x3f\x86\xd1\xf9\xa9\x6a\xd0\xb5\xf1\xbd\xc2\x5e\x6e\x90\xe9\x95"
+ "\xe2\xd4\x5c\x1f\x38\x0f\x5e\x1e\xac\xff\xfd\xfc\xac\xcf\x97\xdb"
+ "\xe5\x7c\x38\x2c\xc2\x11\x7c\x5b\x1c\x8f\xeb\x19\xc4\x23\xf6\x50"
+ "\xd1\xf1\xf3\x9e\x9b\x29\xae\x0e\xfc\xb6\xaa\x96\xef\x57\xcc\xe7"
+ "\xad\x61\x39\x1c\xcf\x15\x8e\xe4\x32\x30\x00\x9d\x0f\x42\xe7\x08"
+ "\xab\x85\x2e\xd6\xcd\x92\xd3\x68\x54\xc4\xc7\xba\x64\x39\x6f\x19"
+ "\x07\xd1\x7f\x5d\x9b\x27\xca\xa2\xa5\x3a\x22\x9d\xd9\xc9\xed\x85"
+ "\xf0\xb5\xea\x3a\xb8\x0e\xf2\x72\xd6\x35\x07\xca\x5a\xf8\x72\x75"
+ "\xc7\x03\xf4\x81\xe8\x19\x94\x3f\xca\xde\x29\xda\x92\xba\xee\x00"
+ "\x1a\x93\xf0\xbd\xd7\x2f\x07\x2e\x23\x3a\x03\x2a\xe4\x79\x8f\xbc"
+ "\xae\x20\x8c\x8f\x71\x3a\x49\x1e\xd8\x17\x9b\x0d\x6d\xe4\x13\x62"
+ "\x5d\x41\x9e\x20\x8d\xaf\xac\x25\xbd\x72\x99\x5f\x49\x0a\xd6\xcd"
+ "\x57\x32\x02\xe8\x55\x91\x5d\xc7\xb0\x7c\x19\xc6\x0e\xaf\xf0\xb5"
+ "\x4c\x32\x3f\x31\xae\x6a\x50\x8e\xf7\x70\x58\x8b\x4c\xe7\x37\xb4"
+ "\x19\x12\xaf\x5e\xf9\x48\xca\xa3\x5d\xce\x03\x9f\xb1\xff\x53\x97"
+ "\xad\xc4\xf1\xf4\xe6\xb2\x02\xb1\xb9\x11\x35\xf2\x79\x2b\xd7\x14"
+ "\xe4\x4f\x37\xe4\xad\xa2\x6d\x90\x4a\x8b\x0b\x0a\x4c\xfc\x23\x4e"
+ "\xb0\x1f\x18\xc3\xf3\x43\x3e\x88\x3d\xa7\x5f\x7d\xf4\x65\x31\x7f"
+ "\x85\xea\x05\xd5\x77\x07\xd5\xf7\xd6\x8a\xaf\x78\xdf\xc6\x56\x75"
+ "\x0f\xd8\xdc\xac\x8a\xfc\x7f\x6e\xfb\xa8\xfc\xb1\x4e\xd1\x0e\xa0"
+ "\x3c\xa9\x8d\x74\x99\xf7\x9b\x82\xf9\xb5\xbf\x2a\xb8\x2e\xef\xb7"
+ "\x84\xb6\x13\xfb\xef\xe6\x76\xc2\x22\xf4\x82\xec\x13\xcd\xfd\x27"
+ "\xbc\x98\xa6\x4d\x81\xf3\x8c\xdf\x46\xed\xb7\xcb\x36\x4a\xb4\x13"
+ "\xaf\x6a\xb1\x0d\xb2\x48\x79\x79\xfc\x7a\xf3\x6a\x85\xd0\x9b\x57"
+ "\xb1\xff\xf7\xeb\x9d\x72\x5f\x47\xb4\x1d\xaf\xd8\xc9\x7f\x14\xe7"
+ "\x6b\xbf\x6a\x94\xf1\xd5\x45\x53\xbb\xf1\x6a\xd2\x50\xff\x61\x7f"
+ "\x1f\xf9\x0f\x34\x2f\x91\x78\xc1\xcf\x13\xe6\xf5\xe6\xd5\xe2\x00"
+ "\xfb\xa3\xc7\xf7\x8a\x50\xb2\x7e\x9a\x9a\xe3\x04\xfa\xdc\x96\xb0"
+ "\x72\x5d\xd9\x5c\xda\xa2\xaa\xa0\xdc\x54\xb0\xb2\xac\x20\x5f\xf9"
+ "\x9d\x2d\x5e\xf6\xc5\xe8\x1b\x77\x1d\xd6\x7b\x47\x14\xf1\xe3\x55"
+ "\x2c\xff\x01\x8f\x5c\x06\x6e\xa7\xd0\x77\x94\x6c\x5c\xc4\x79\x38"
+ "\xf0\x91\x38\x4b\xfc\x55\x8f\xac\x27\x04\x37\xbf\x9c\xf9\x5c\xe6"
+ "\x7a\x2c\xff\x7e\x9d\xd4\xdf\xc2\x3e\x6d\xbd\x41\x7e\xf7\xa7\xaf"
+ "\x2f\xe0\x6d\xdf\x7e\x3e\xa7\x0f\x79\x5a\xdf\x13\xe0\x6f\xd1\xfb"
+ "\x49\xe9\x9d\xef\xc3\x24\xce\x45\xaf\xdf\x2c\xf8\x5b\x8f\xf2\x7f"
+ "\x45\xb2\x15\x07\xda\x05\x1e\x80\x37\xb6\x39\xc2\x9a\xf8\xf8\x7e"
+ "\xbd\x45\xce\x0f\xd3\x9f\x0d\xcc\x93\xda\x2d\x25\x3e\x3b\xd4\xf3"
+ "\xf5\x21\x3b\xf8\x1e\x72\xf5\xa7\x43\xd0\x9a\x11\x08\x87\x30\xd8"
+ "\xff\x7d\xa5\x41\x2e\xf3\xd2\x72\x0a\x3b\xa0\xbd\x4e\x19\xfb\x44"
+ "\x19\x0f\x54\x91\x6e\x51\xfe\xa4\xff\x12\x0d\xf9\xd2\xbe\x24\x76"
+ "\x3a\xbf\x91\xe8\xe7\xfb\xa3\xc5\x52\xbd\x3e\x80\xfd\xdf\x9a\xd3"
+ "\x72\x39\xa8\x8c\xc7\xb7\x39\xb4\xf2\xbe\x54\x22\xfd\x81\xb9\xc1"
+ "\xb4\x1d\xd8\x13\x90\xa6\xd7\x3a\x85\xc6\xee\x0f\x4c\x65\xe6\x57"
+ "\x77\x93\x1e\xd2\x7e\x55\x75\x83\x7a\x78\xe0\xc4\x50\xbd\x3b\x10"
+ "\x47\x7a\x17\xa8\x4b\x45\xf7\xac\x44\x4d\x2a\x2d\x28\x9b\xc3\xbd"
+ "\x7b\x74\xec\x68\xdb\xb3\xbc\xb2\xa2\xf5\xeb\x4a\xa7\x1b\x4a\xf3"
+ "\xf3\xa4\x4a\x1f\x54\xe7\xcd\xbc\xef\xef\x94\xeb\x99\xcb\xfc\x5a"
+ "\x9c\xdf\xb6\xbc\xe6\xd7\x7f\x9a\xa3\x35\x85\xc6\x66\x5f\xdb\x2c"
+ "\xea\xd3\x6b\xa9\x01\x75\x97\xa7\xa7\x3a\xda\xc4\x7d\xb6\xd7\x02"
+ "\xdb\x7f\x27\xf2\x74\xe4\x25\x78\xed\x46\x89\xa7\x4e\xc1\xe3\xd7"
+ "\xde\xe3\xe5\xe4\xfb\x71\x1d\x38\x43\xe5\xe4\xfb\xbf\x70\xff\xec"
+ "\xb5\x23\x72\x79\xfd\xfd\x86\xd7\xac\xdc\x8f\x92\xfc\xb5\x6f\xea"
+ "\xd7\x0b\xff\xf4\x60\xb6\x34\xf6\xd6\x2d\xf7\xf1\x64\xff\x1a\x69"
+ "\xc9\x17\xbe\xea\xc1\x1b\xd3\x2b\xd8\x40\x4e\x39\xed\x53\x47\x32"
+ "\x38\xf8\x80\xec\x5b\xf2\xf9\x7b\x35\x85\x6e\x97\xf9\xe0\xec\x40"
+ "\x3b\xc1\x34\x6b\xba\x25\x1f\xd1\x2d\xfa\xae\xa3\x7f\x77\x0e\xf3"
+ "\xa2\x6f\x0f\xd7\xa1\x0d\xcb\x75\x10\xed\xdf\xdb\xc7\x09\x0f\xf9"
+ "\xd7\xac\x3f\x56\x3a\xab\xb2\x81\x7f\xc3\x6b\x44\xdc\x0e\x94\x2d"
+ "\xc2\xa1\xff\xf7\x1a\xd7\x0d\x1f\xea\x28\xcd\xdd\x71\xca\x3e\x12"
+ "\x1c\xfc\x84\xda\x22\x7c\x46\xbd\x6d\x88\x17\x3a\xd5\x10\xef\x28"
+ "\x8d\x87\xfe\xfe\x58\x75\x7f\x69\x96\x96\xc6\x0b\x88\x17\xb6\x06"
+ "\x37\x08\xfd\x39\xe8\x46\x9b\x77\x24\x10\x9f\x84\x8b\x78\xaa\x25"
+ "\x3a\x58\x69\xac\x9a\xf4\x9b\xf4\x95\xf5\xc7\xa3\x9f\x70\xd0\xca"
+ "\x4a\xe3\xd5\xc3\xec\xbd\x75\xbd\x72\x46\xd0\x79\x8f\x74\x06\x28"
+ "\xd9\x2b\xb1\xbf\xff\xa1\x5d\x2f\x8b\xb1\x01\x29\xdf\x86\x17\x99"
+ "\xfa\x30\x6f\x57\xf6\xf1\x76\x85\x81\xd8\x2f\xbd\xe1\x08\x9f\x47"
+ "\x6b\x3a\xcc\xcf\x7c\x95\xd6\x67\x3b\xda\x4c\x1e\x7e\x56\x5d\x65"
+ "\x19\xf9\x69\x1e\xfa\x6e\xc4\xd7\x1f\xb7\x96\x79\x60\xa9\x9b\x74"
+ "\xb2\xa1\x9b\xf6\x8a\x17\x67\x81\x37\xf4\xc8\xfb\xc3\xd3\x19\x92"
+ "\x74\xfe\x29\x96\x4b\xe3\x3f\xbf\xf4\xd0\x49\x1a\xb7\x15\xfd\xf1"
+ "\x58\xd8\x87\x3e\xbd\x90\xc1\xa1\x04\x3a\x8b\x4f\xf4\x15\xce\xa1"
+ "\x5c\x34\xff\x40\xd8\x05\xe2\x1b\xb2\x6c\x27\x0e\xbd\x43\x73\xd3"
+ "\xed\x12\x0e\x97\xf9\x10\xb6\xff\x07\x0b\x45\x5e\x88\xcf\x25\xcb"
+ "\xf3\x50\xc2\xd0\xf1\x0d\x3f\x3e\x4c\x3f\x5d\xf2\x0b\x40\x8c\x7d"
+ "\xbd\x4f\xb8\x1a\xe4\xb1\x2f\xbf\xef\x73\xe8\x98\x3c\xf6\x25\xf6"
+ "\x9e\x6e\x28\xa3\xfc\x87\x1b\x23\x62\x95\x4f\x92\xde\xeb\xc8\x87"
+ "\x1b\xd6\x9f\xc0\xf6\x9d\x68\x97\xfd\x42\x21\x9f\xc6\x85\xe4\x1f"
+ "\xd2\x99\xab\xb2\x2f\x29\x7c\x80\xc6\x4c\xd1\x96\x35\xce\x96\xdb"
+ "\x32\x4c\x7b\x5c\xb2\x15\x52\x3b\xd7\x38\xd8\xff\x0d\x3d\x2f\xbf"
+ "\xb1\x4c\xe6\x91\xcc\x73\xc1\xa3\xc6\x8e\xfe\xe8\x15\x29\x7e\xde"
+ "\x36\x76\x70\x5e\x0f\xc6\x37\x85\x05\xf0\x9e\xde\xb5\xc2\x6e\x36"
+ "\x62\xfb\xdf\x30\x4b\xb4\x29\x22\x8c\x45\x37\x8c\xe6\xe7\xb6\x73"
+ "\x1e\x14\xf1\xb1\x19\x47\x65\x3c\xd1\xe6\xb0\xab\x8c\x06\x61\xcb"
+ "\x1a\x11\xfe\x50\x9f\x48\xd7\x58\x4f\xb4\x04\xd2\xfb\xd8\xba\x35"
+ "\xeb\xd6\x6f\x5a\x47\x03\x6a\x1b\x4a\x0d\x2b\xd7\xe7\x17\x8c\x0a"
+ "\x31\x1e\x12\x4b\xe7\x5a\x3b\xeb\x06\xf7\x9d\x7a\x5d\x47\xf3\xe8"
+ "\xc5\x99\x05\xaf\x8f\x34\xdc\x4e\xfa\xd5\xb4\x96\xc6\x0a\xf8\xd9"
+ "\x11\xb4\xc7\xaa\x18\x37\xe8\xa5\xf4\x82\xd7\x87\xaf\xf4\x6f\x2a"
+ "\x94\x7c\xac\xc3\xbf\x21\x3e\x4a\x7d\x0e\x86\x65\xfc\x42\x6e\x87"
+ "\x88\x3e\xee\x9b\x0f\xc4\x73\xbb\xe8\x1b\x28\xd4\x72\x7e\x0d\xc4"
+ "\x63\x7b\xd3\xd4\x6e\x57\xcd\xf0\x88\x72\x35\x9d\x91\xf9\x41\xe5"
+ "\x77\xd1\x59\x9b\xac\x08\x75\xf4\x75\x9d\x84\x8b\xec\x27\xe1\x6e"
+ "\x90\xe7\x71\xd3\x5e\xa2\xd6\x8d\xb4\x8f\x70\xf3\x27\xbe\x1a\xb2"
+ "\x37\xcd\xb1\xb2\x5d\xa2\xb6\xc8\x87\x78\xde\xbe\xea\x08\xc3\x7a"
+ "\xf3\x00\xa6\x1d\x77\x0e\x0e\xe7\x8b\xf3\x06\x9a\x93\x83\xcf\x1b"
+ "\x38\x6c\xc0\x2b\x5f\xba\x76\x06\x3c\x5f\xef\x92\xd3\x64\xf8\xc3"
+ "\x9a\x9b\x15\x30\x3b\x91\xa6\xa3\x83\xfe\x8a\xd8\xcf\x54\xda\xff"
+ "\x98\xce\xce\x68\xfe\x82\xf6\x0c\xf5\xeb\x46\xf3\x18\xc9\x07\xe9"
+ "\x25\xde\x51\x7b\xdb\x03\x87\xc5\x5e\x26\xb5\xa8\x1b\x2c\x0b\xa8"
+ "\x4c\xcc\x55\x84\x3a\x71\x58\xeb\xd7\x03\xc1\x23\x0c\x8b\xf5\xfb"
+ "\x29\xcd\x7d\x94\x26\x90\x0f\x98\xc7\x03\xa2\x6f\x7a\x38\x49\x6e"
+ "\xb3\x69\xbf\x54\x71\xfe\x44\xf3\xd1\xe3\xdb\x7a\xb1\xcf\x7f\x38"
+ "\x3b\x00\xc7\x51\x69\x2c\x42\xcb\xd4\x4d\xfa\x26\xde\x67\x3b\x5c"
+ "\xe1\x1f\x13\x68\x3e\x4a\x76\x97\xe3\x88\x6e\xd0\xdb\x9c\xfc\xcc"
+ "\x68\x95\x7c\x46\x3c\xc2\x1e\x91\x7d\x14\x19\x57\x9b\x18\x73\xe2"
+ "\x7b\x5c\x62\x1d\xb4\x20\xcc\xe9\xc1\xf1\x58\x0c\x1b\xec\x03\x96"
+ "\x63\x3d\xe6\xbe\xf7\xe1\x3e\x7f\x5f\xaf\x89\xef\x2b\xc0\xfb\x81"
+ "\x02\x0f\xfa\x0f\x87\xed\xca\x7e\x1b\xfa\x0f\x86\xa2\x75\x45\xe8"
+ "\x3e\xac\x36\xad\x9f\x8b\x5d\x87\xd5\xa6\xa2\xb9\x34\xe5\x2b\x2d"
+ "\x79\x21\xbf\x63\xe5\x98\x1b\x62\xfc\x98\xc6\xbd\xf9\xb9\xcc\x34"
+ "\x66\x84\xfd\x5c\x1a\x3b\x75\x89\xb3\x52\xc3\xa5\xbb\x4e\xba\x8f"
+ "\xc0\x76\xcf\x80\x75\x65\x2f\x9d\x7d\x83\xfc\x6f\xf6\x99\xc5\x39"
+ "\xaf\x52\x9b\x8d\xb6\xfc\xf5\x5d\xf2\xf7\x32\x3e\x07\x9e\xf6\x31"
+ "\xec\x2f\xe4\xe3\x71\x2e\xf3\xeb\x83\xe3\x1f\x62\x7c\x51\x7c\x73"
+ "\xc3\xf0\x6e\x39\x5c\x1e\x8f\xc5\xb0\x3e\x79\xec\x55\xc0\xbe\xee"
+ "\xf1\xa7\x0d\x1a\xdb\x8e\x91\xbf\xc7\xb9\xcc\x6f\x18\x64\x9e\xc9"
+ "\x78\x2a\x0d\xec\x92\xe4\x27\x69\xb8\x5f\x6d\x7e\x3d\x86\xef\x1d"
+ "\x4a\xbe\x38\x1f\x67\x7e\x23\x53\xce\x87\xfa\x08\x44\xb7\xf4\xed"
+ "\x87\xd7\x7b\xda\x23\x54\xec\x31\xfa\xc6\xa0\xfc\x15\x3c\x8f\xff"
+ "\xd1\x34\x3e\x2e\x1f\x5f\x8a\xfe\xd9\x34\xc5\x38\x1c\xe9\xd0\xcc"
+ "\x3a\x18\xc9\xc7\x98\x44\x3f\x3d\x8c\x7c\x04\x2c\xc3\x61\x94\xa7"
+ "\x86\x6c\xb9\x68\xf7\xde\x38\x3b\xd8\xc6\xeb\x1b\x74\x2c\x7a\x45"
+ "\x32\xed\x33\x2f\xd6\x2d\xbc\xf1\x35\xe9\x9b\xe3\xa6\x35\x2e\x46"
+ "\x73\x94\x5f\x5d\xe6\x12\xe3\xf0\x2d\xf7\xfa\xc7\xcc\xde\xd8\x2d"
+ "\xed\x89\x4a\xf3\xdf\x50\x5e\x2d\xd3\x07\x7d\x4e\x84\xe7\xbe\x17"
+ "\xe2\xa4\x35\x0a\x94\xff\x77\xf8\xce\x83\xfd\xfe\xf7\x8e\x88\x7a"
+ "\xda\x62\xe5\x38\xd0\x56\x8b\x75\x00\x2d\xe8\xff\xbf\xd1\x20\xda"
+ "\x06\xc2\x9d\x05\xfd\xd1\xef\x59\xfa\xcd\x1f\x4f\x27\x1e\x3a\xa3"
+ "\xff\xd2\x25\xf6\x20\x6e\x79\xcf\x69\xd6\xa2\x4c\x5b\x50\xfe\xbf"
+ "\x1a\xd2\xd7\x95\xf3\x1a\xd8\xc8\xda\x3c\x57\xd9\x89\x7d\x7f\x45"
+ "\x3b\xb7\x0a\xc0\xb3\x91\x1d\x1b\xb8\xca\x8e\xf3\x33\xc8\x9f\x06"
+ "\xd8\xfb\x77\x00\xaf\x66\xd9\x17\xd7\x50\x57\x17\x5f\xf1\x5d\xa2"
+ "\xf3\x02\x9b\x10\x6e\xb1\xf3\x32\x6b\xc4\x34\x8b\x4d\xec\x52\x23"
+ "\xc2\xa5\x5d\xbc\xc4\x0e\x21\x6c\x5a\x21\xea\xca\x46\xe6\xf1\x6a"
+ "\xd6\x7c\x61\x78\x9c\x6c\xf7\xcf\x93\x1d\x35\x05\x99\xcc\xac\xae"
+ "\x66\x3b\xee\xba\xd3\x65\xfe\x79\xc6\xe0\x39\x65\x88\x97\xf4\x2a"
+ "\xbd\x9c\x9e\xd7\x7c\x81\x7a\xf0\x45\x0e\xfa\x1d\xa8\xb7\x5f\x20"
+ "\x1c\x7d\xff\xe1\x6b\xb3\x1c\x9a\x3b\xa3\xf1\x8a\x0f\x49\xff\x55"
+ "\xd6\xe6\xdd\xc8\x4e\x54\xaf\x40\xfa\x2f\x20\xfd\x57\xd9\x31\x2c"
+ "\xc3\xf1\x7d\xe7\x01\x88\x7e\x2f\xe1\xf4\x82\x26\x67\xb3\x2a\xaa"
+ "\x09\xe3\x73\xca\xf5\xd0\x84\xb0\x2b\x9c\x10\xd5\x88\x30\x2b\x9e"
+ "\x8d\x02\x4e\x7f\x1f\xd2\x1d\x55\x90\xe9\xc5\xbc\x89\x7e\xcc\xdf"
+ "\x2d\xd3\x29\xe7\x4f\xf4\xca\xf5\x36\x87\xc6\x08\xa3\x57\xec\x21"
+ "\xba\xc5\x77\x8f\x5f\xe4\x39\x4a\x51\xce\x9a\xbb\xee\x14\x7d\xec"
+ "\x5f\xcc\x96\xe9\x0f\xfe\x0e\xf6\x8b\x2a\x61\x3f\x7f\x81\xfd\x9f"
+ "\x16\xe9\x4c\x17\x11\x46\xe5\x77\x60\xbd\x95\xd6\xfe\x7d\x21\xf3"
+ "\x0c\xe3\xa7\x2b\xbf\x73\x65\xac\x2f\xe1\x63\xd4\x79\x2b\xcb\x8a"
+ "\x36\xe6\x61\xcf\x77\x14\x98\x28\x88\xf7\x8d\x0b\xf2\x0d\xeb\xd7"
+ "\x19\x56\xe5\x15\x15\xaf\xdf\x58\x50\x32\x9d\x0f\x67\x94\x16\xac"
+ "\xcb\xa7\xa1\xeb\x92\xbc\x12\xd3\x28\x45\x7f\xc6\x52\x90\xd9\x49"
+ "\x67\xd0\x6c\x23\xfd\x7e\xf3\x23\x69\xdc\xd6\xcd\xcc\x49\xbc\x5f"
+ "\x2c\x6c\xcc\x2f\xef\x35\x6c\x49\xa2\xf8\x77\x44\x3b\xfe\x66\x3b"
+ "\xab\x5d\xb1\x97\x31\x7e\xb6\xb6\xea\x12\xbc\xf9\x5b\xce\x8f\xfe"
+ "\x14\x19\x0f\xef\xbb\x92\xce\x9a\xb6\x90\x1f\xf6\xcb\x6c\x46\xf1"
+ "\x41\xbc\x78\x73\xaf\xf0\x45\x30\x7c\x20\x05\xfc\xf3\xed\xdf\xfc"
+ "\x88\xa9\xb1\xec\xc8\x4b\xd1\x67\x28\x8a\x97\xd6\x3d\x7e\x78\x0e"
+ "\xde\xa4\xbe\x14\x7d\xb7\xe9\xe2\x3e\x39\x5f\x9f\xf5\x66\x11\xab"
+ "\x29\x8a\x67\xe6\x11\x11\xc4\xaf\x7d\xa2\x4f\xaf\x8e\x54\xd1\xd9"
+ "\xb9\xe7\x68\xad\xa8\x91\xbe\xef\x36\x99\x7d\x46\xff\xfc\xa6\x5f"
+ "\xec\xa1\xfe\x05\xff\xce\xc1\x6d\xd2\x2f\x7b\xe5\xba\xab\xa6\xf5"
+ "\x37\x3b\x26\xcc\x11\xf5\xef\x97\x17\x09\x1e\xe5\x3f\x47\x94\x8f"
+ "\x9f\x03\x8e\xbe\xc1\x9b\x61\x58\xfe\x7d\xac\x32\x45\xfa\x26\xf9"
+ "\x66\x98\x2f\xfa\x6f\x5d\xde\x52\xec\x17\xe8\xff\x9e\x81\x71\xbf"
+ "\xf0\xd5\xae\xd8\xef\x45\x9f\xca\x87\xfd\x04\x56\xfb\xf7\xa5\xde"
+ "\xda\x15\x16\xdf\xa6\x78\x35\xb5\xad\x95\xe5\xc8\xdf\xf5\x85\xa3"
+ "\xd8\xe5\xc2\xd1\xde\x4d\xf1\xe8\x7f\xad\xa8\x67\x0c\xd3\x46\xaf"
+ "\x38\xc2\xcf\x2b\xae\x5d\xf1\x9a\xf4\xfe\x16\xbd\xfb\xd0\x4f\xc6"
+ "\xb0\x63\xf8\xfe\xaf\x3e\x16\x00\x1f\x0c\x7b\x9c\xde\x23\x55\x7c"
+ "\x5e\xa5\x11\xfb\x25\x89\x54\x76\xb9\xcc\xbc\x7f\x46\x63\x44\x83"
+ "\x65\x7b\x13\xe4\x70\xea\x37\x08\x1f\x1e\x56\x22\x8f\xc5\x5e\x16"
+ "\x83\x70\x47\xfe\x22\xf3\x40\x9c\xcf\xbd\x02\xfb\xe1\x6f\xb6\xfb"
+ "\xe8\x6c\xf4\x1d\x37\xdf\xc9\xd4\xbf\x68\x22\x9b\x95\xee\xe5\xb6"
+ "\x10\xc4\x77\xa7\x37\x67\xcb\xfc\xa4\x75\x04\x64\x4b\x51\x6e\xf1"
+ "\x39\x0e\x18\x25\xec\xc0\x9b\x59\x01\xfd\xc3\x3e\x92\xb5\x1d\x8e"
+ "\x48\xfb\x6c\xe9\x76\x88\xf7\x5f\x1e\x11\x75\xe5\xcd\x9d\x32\x2c"
+ "\x86\x89\xfd\x7e\x2c\x39\xc5\x9b\x3c\x30\xc1\x74\x3f\x3b\x8f\x32"
+ "\xca\x92\xe0\x8e\xfa\xeb\x94\xd0\x37\xbc\xcf\xa6\xfe\x35\x7d\x7f"
+ "\xa4\xe7\xc6\x61\xd6\xc2\x6e\x6b\x60\x8c\xda\x2b\x6a\x3f\x0d\x13"
+ "\x00\x3a\x9d\xd4\xb7\x7a\x4b\xd7\xda\xe0\x04\x2e\xe7\xe8\x15\x7b"
+ "\xfb\x59\x21\xa0\x4f\x19\xb2\x2f\x41\x69\x10\x3e\x99\xf7\x93\xb0"
+ "\x5e\xf8\xb0\x5e\x60\x9a\x7d\xa4\xd7\xdb\xae\x50\xff\xe5\xad\x9d"
+ "\x6d\x15\xbd\xb4\x57\x3f\xea\xeb\x5b\x3b\x89\x87\x54\x0f\xf6\x99"
+ "\xf9\x3a\x48\xde\x4e\x5a\x37\xce\x22\x1c\xcf\x8e\x75\x83\xb6\x13"
+ "\x5b\x08\x94\x8b\xdb\xb4\x0d\xa2\x2e\x20\xbc\xb6\x0c\x74\xd4\x87"
+ "\x0d\x6e\x43\x42\xb7\x1f\xfd\xfa\xa2\xac\xfe\xda\x22\xa3\xcb\xfc"
+ "\xd6\x49\xb4\xfd\xc3\xee\x9f\xb8\x63\x1c\xfa\x35\x08\x67\x99\x40"
+ "\xdf\xaa\xdf\xea\xbd\x1e\xac\xbc\x36\x97\x74\x65\x66\x2c\x8d\xa7"
+ "\x14\x65\xf1\x6f\xde\xd1\x45\x46\x31\x6e\xf9\xab\x78\x39\x3d\x8d"
+ "\x7b\xd2\xbc\x82\xea\x6b\x10\x5b\x3d\xd8\x57\xfc\x55\x86\x90\xd1"
+ "\xaf\x32\xe4\xfe\x45\xa8\x7c\xca\x5a\x98\xaf\x72\x2a\xa8\x6d\x06"
+ "\x07\xcc\x70\x43\x44\xe3\x6b\x00\x96\xff\x45\xdc\xdb\x80\x47\x55"
+ "\x5d\xfb\xc3\xfb\x4c\x86\x10\x30\x64\x26\x31\xe0\x88\x41\x06\x0d"
+ "\x36\x6a\x80\xa8\xd8\xa2\x7f\xac\x51\xa0\xc5\x0a\x26\xb5\xd8\xc6"
+ "\x16\x3b\x41\x12\x4c\x90\x8f\x31\x04\x18\x62\xc8\x17\xdc\xfc\x53"
+ "\x0b\x61\xc0\xc0\x45\x09\x10\x7b\xb1\x2f\xde\x8b\x10\x5b\x6c\x63"
+ "\x8b\x30\x40\xd4\xa8\x21\x93\xda\x68\x83\x17\x75\x88\x01\x23\x0d"
+ "\x30\x92\x81\x0c\xc9\xcc\xd9\xef\x6f\xed\x7d\x4e\x66\x82\x09\x2d"
+ "\xbd\xf7\x79\xdf\x3c\xcf\xe4\x9c\xbd\xcf\xfe\x5c\x7b\xef\xb5\xd7"
+ "\x5a\x7b\xed\xb5\x0a\xb8\xff\xc5\x02\xcc\x23\xc0\x98\x1b\xfe\xb3"
+ "\x81\xf4\x2f\x76\x62\x8f\xae\x54\x19\x8b\x40\x5b\x5e\xbc\x84\x3a"
+ "\x8b\x64\x3a\x2e\xed\xaa\x59\x90\xce\x87\x67\x3c\xf0\x08\xab\x2a"
+ "\x62\x51\x55\x2a\x33\x3a\x8b\x58\x02\xe2\x40\x57\xfc\x57\x8b\xce"
+ "\x0b\x0c\x78\x2e\xbc\x03\xf8\x11\xf5\x96\x16\xf1\xc0\x11\xf0\x77"
+ "\x65\x2a\xf7\xff\x33\x70\xf7\xb0\x3d\x93\x65\x1f\xf7\x4c\xd6\x79"
+ "\x03\xbc\xa7\xf6\xbf\x63\xbd\x27\xe9\xca\x33\xe6\xa7\x97\x2e\xcd"
+ "\xb7\xe5\x65\xd3\x23\x69\xfc\xf2\xdb\xaf\xa4\x15\xa3\xa5\x3f\xaa"
+ "\x3d\x19\xb4\xb6\x88\x7e\x92\x77\x95\xf6\x6c\x0d\x93\xf7\x90\xcc"
+ "\xf9\x41\xa2\xfb\x48\xd7\x04\xdf\xf6\x1f\x16\x57\x07\x98\x72\x32"
+ "\x8a\x19\xae\xac\x6f\xc1\xbc\xfc\x79\x8b\xee\x97\x6a\x0d\x03\xd4"
+ "\xd3\xd0\xbf\x9e\xd7\xfb\xce\x7f\x35\xde\xdc\x27\xf0\xe3\xc6\xcf"
+ "\x53\x79\xec\x11\x8f\xdc\xeb\x5e\x4f\xd4\x75\x07\x07\xb6\xe9\x62"
+ "\x33\x06\x37\x6d\xcf\xa4\x35\x52\xbc\x9a\x19\x7e\x5f\xd0\x6a\x20"
+ "\xbe\xa4\x08\xef\xa4\xcb\x25\xe4\xdf\x9a\xaf\xc8\x83\x17\x5a\xb1"
+ "\x97\xbe\xee\xe0\x1b\x6d\xe0\x39\x5e\xb7\x0f\xa6\xbf\x15\x7e\x1f"
+ "\x5e\x9e\xdd\xbf\xee\xbc\x8a\xae\x97\x48\xaf\xeb\x69\xf4\xcf\xb7"
+ "\x77\x88\x1c\xb3\xd7\x31\xff\xff\xb3\x46\x9f\xbf\x7a\x9a\x0d\xa3"
+ "\x74\x1f\x9c\xaf\x0f\x6a\x07\x99\x3b\x73\x33\xe5\x1c\xdf\x3b\x43"
+ "\x9c\x51\x8f\x66\xff\xb7\x8d\xed\x7d\xc8\x68\x61\x16\xbc\xff\x3f"
+ "\x78\x17\x32\x0c\xfa\xd6\x6f\x1e\x8d\xe9\xac\x31\x02\xe3\x00\xf3"
+ "\x28\x5c\xfe\x81\xf0\x93\x7f\x11\xf8\x19\xb8\x22\x6e\xad\x44\x60"
+ "\x04\x87\x46\x1a\x99\x29\x26\x3a\x6a\xec\xcd\x09\x96\x07\xbf\x3f"
+ "\x75\x4a\x71\x51\xa1\x83\xab\x01\xbf\x89\x87\xfb\x4d\x3d\x52\xf1"
+ "\xc4\xed\x25\x92\x7e\xd8\x78\xa4\x62\xa0\xb6\xae\x2f\xe3\x76\xe2"
+ "\x69\xd5\xb8\xe3\xb5\xc5\xcb\x99\x61\x5f\x8f\xc7\x40\x3c\x14\xd1"
+ "\x30\xee\xc0\x67\xe0\xc5\xf7\xfe\xe5\x10\xe2\x00\x2f\x07\x77\x1e"
+ "\xaf\x95\x77\x92\xf6\xc5\xaa\x9b\x8e\xd7\x86\xca\x37\x32\x2a\x1f"
+ "\x7c\xba\x61\x57\x51\x87\xc1\x6d\xfc\x3e\x73\x5b\x7d\xec\x10\xde"
+ "\x07\x1c\x2b\xd4\x49\x32\x61\x2a\x03\x7b\x70\x45\xf1\x65\xec\xcd"
+ "\x0e\x71\x3e\x63\x38\xc7\xf6\x3d\x52\x3b\x48\x3e\x71\xc6\x1a\x97"
+ "\x1d\xd9\x5d\xb6\x0f\xf8\xff\xe9\x44\x8d\x0f\x01\x9f\xb4\xaf\x4a"
+ "\xdf\x0f\xf0\x7d\x88\x3c\x27\xda\xb7\x5b\x4f\x33\xe0\x18\xbd\x40"
+ "\xba\xce\xdc\x45\xf3\x80\x5f\xea\xe8\x20\xdb\x8b\x83\xcc\x95\xe9"
+ "\xa0\x51\xc6\x10\x6e\x1e\x51\x6a\x8e\x8c\x29\x4d\x59\xdc\x08\xda"
+ "\x68\x44\xe7\x48\x16\xe3\x7b\x8a\xda\x4c\xfa\xf6\xcd\xdb\xc1\x73"
+ "\xd2\xf9\xb0\x49\x49\xc9\x35\x95\xa6\xcc\x0b\x96\x4d\xbd\x87\x68"
+ "\x28\x93\xe3\x11\xc5\x14\x78\x48\x09\x94\x4d\xbe\x67\xa7\xf4\x55"
+ "\xe4\x73\x8e\xe2\xad\xc8\x73\x02\x79\x3c\xf8\x91\x5f\x92\xc6\xd3"
+ "\xac\x36\x17\xcf\x06\x93\xc2\x77\x9a\x30\x92\x93\x4a\x84\xef\x56"
+ "\xda\x9f\x1b\x79\x1c\x78\xbb\x5e\x21\x83\x1b\x12\x92\xc1\xd5\xae"
+ "\xc3\xb8\x45\xce\xfa\x37\x7e\x08\x65\x35\x04\x2f\xa9\x0d\x3b\xce"
+ "\x11\x3e\x14\x7c\x55\x0b\x70\x40\x4b\x72\x15\xb3\x68\x3a\xd3\x86"
+ "\xc6\x40\x03\xed\xc3\x64\x73\xa0\x1e\x75\x1e\xc0\xaf\xce\xba\x84"
+ "\x45\x9c\x63\xb5\x9f\xe9\x3a\x57\x92\xae\xfb\xdd\x13\x9a\x1c\xc0"
+ "\x35\x11\xf9\x57\x2f\xa6\x39\xd1\x61\x08\xa0\x7c\xf0\xda\x0d\xee"
+ "\x9c\x06\xa1\xc3\x46\x77\x12\x28\x0d\xea\x48\x72\xfb\x1b\x98\xca"
+ "\x2d\x06\x84\xeb\xe8\x7e\x01\x47\xda\x26\x47\x2b\x6b\xb2\xfb\xb1"
+ "\x6f\x36\x82\xf7\x4c\x4a\x44\x7b\x44\x79\xf8\xde\xb2\x0f\xe3\x6b"
+ "\x05\xcf\x80\xf2\x9a\x49\x27\x8e\xee\xee\xf3\x65\x49\xb7\x21\x7f"
+ "\x3d\xef\xb5\x18\xa8\xfc\x73\xec\x8d\x53\xbc\x2b\x29\x69\x52\xa7"
+ "\xf4\x65\xda\xc6\xde\x38\x80\x76\xde\x1c\xd6\xce\x19\x68\xbf\x11"
+ "\x7b\xa5\x0b\x65\x1e\xe0\x2b\x50\x67\x3b\xea\xf4\x79\x49\xff\x33"
+ "\x91\xaf\xb4\x18\xa9\xcd\x4d\xd4\x5e\x47\x90\xf1\x95\x49\xc6\x0d"
+ "\x17\x98\x11\x6b\xc1\xb5\x13\x4f\xf4\x7f\x3f\xe8\xfa\x84\xee\xb2"
+ "\x37\xfa\xec\x3f\x10\x1d\x89\xb0\x47\x9f\x4b\xeb\x91\x06\x6d\xac"
+ "\x43\xbb\x0e\x8c\xe8\x64\x24\x5b\x18\x82\x79\x3a\x04\xf5\x0e\xc5"
+ "\x58\xd5\x01\x76\x87\x01\xeb\x03\xd4\x27\xf5\x92\xda\xa1\xa2\xbc"
+ "\x0d\x97\xd0\xa6\x65\x16\x63\x74\x3b\xf9\x79\xef\xe6\x80\x77\x4b"
+ "\x9a\xa3\x9b\x93\xbe\x38\xe9\x5e\x23\xcf\x76\xf4\x15\xb8\xec\x77"
+ "\x85\xc4\xe7\x9f\x66\x6f\xac\x95\xbe\x58\xdf\xa8\xd0\xce\x92\x5b"
+ "\xa4\x7c\xb7\xf6\x33\x82\x3d\xf5\x2b\xba\xd4\x5c\xee\xee\xf0\xb2"
+ "\xe8\xf6\x91\xa0\x59\xde\x60\xd5\x2a\xd1\xa7\xbf\xab\xd0\xdb\x39"
+ "\xc8\x1a\xf3\xbb\x81\x5f\xd4\x4b\xbc\x83\xf8\x17\xa9\x67\xf6\xbb"
+ "\x03\x36\x47\x44\x2a\x78\x15\x03\xda\x49\xf7\x98\x46\x81\x46\x7b"
+ "\x90\xf4\x10\xd1\x3e\xec\xd9\xbf\x3b\x71\x35\x1f\xc8\x80\x0f\xe8"
+ "\x82\xdf\xa3\x0d\xbf\x13\xf2\x54\xf2\x11\x2b\x65\xac\xbf\x8f\xd7"
+ "\xed\x70\xf0\x4b\xbc\x90\xf6\x5e\xd4\x5b\xb2\x76\x85\xa8\x83\xfc"
+ "\xe2\x76\xe4\x5b\xf9\xc9\x7a\xab\x77\x50\x5b\x07\x61\xfa\x73\x5e"
+ "\xcd\xd7\x9e\xd0\x25\xe8\xaf\x3f\xf7\xfb\xc2\x30\x79\x0d\xe9\x13"
+ "\x94\x90\xce\x84\xb4\x97\xf4\x7b\xa1\x13\x98\xe6\x90\x76\x61\xdc"
+ "\xfe\x4e\x8d\xef\xf8\xfd\xfb\xc2\xff\x16\xd1\xb4\x42\xe7\xee\x8c"
+ "\xa6\x27\xf7\xfb\x79\x54\x47\xfd\x15\x3e\xbe\xb3\x97\xcc\x7b\x7a"
+ "\x51\xb6\x14\x61\x4e\x58\x98\x3f\xef\x99\xfe\xbc\x91\x51\xf0\xe2"
+ "\x65\xbf\x6f\x91\x67\x02\xfb\xa3\xc3\x78\x04\x63\x9f\x4c\xd7\xc0"
+ "\xf6\x4b\xb9\xee\xfe\xe4\x81\xe4\xba\x8f\x3c\xb3\x64\x69\x9e\xa8"
+ "\x43\xa8\x14\x66\xcb\x5b\x81\xc3\xd9\x13\xd3\x1f\x99\x3e\x61\x59"
+ "\x76\xbe\x70\xaa\x23\x85\xa8\xf3\xb2\xb2\xf2\x34\x85\xc3\x5c\xca"
+ "\x45\x5f\x16\xac\x14\x59\xed\xcf\xe6\x4b\x55\xc5\x65\x8b\xe6\xad"
+ "\xc8\xd6\x8a\x08\x6f\x6b\x02\xe1\xcb\xfa\x6a\x21\xab\x1a\x2e\xf5"
+ "\x23\xf6\x1f\x08\x3b\x4f\x0d\x97\xdf\xdc\x88\x6f\x7d\xe7\xff\xf6"
+ "\x5b\x68\xae\xbc\x99\xdb\x54\x23\x6c\x99\x18\x8f\xfe\x86\xe0\xfb"
+ "\xe6\x0c\xf2\x03\x81\xbd\xad\x84\xfc\x16\x6b\xba\x07\xc0\xd7\x6f"
+ "\x8e\x03\xaf\x55\x02\xf8\x3a\xd2\x82\x2a\x07\x4e\x05\x9f\xfe\x56"
+ "\xbc\x26\x13\x89\x52\x0d\xfb\xa7\x90\xde\xd8\x0e\x21\xbf\x7b\x73"
+ "\x6a\x48\x7e\xf7\x16\xe9\xf4\x44\x61\xbc\xdb\xa9\x6d\xd4\x4e\x7c"
+ "\x9f\x1b\xa6\xb3\xd3\xee\x01\x18\xa9\x1c\xd2\x2d\x11\x3e\x5a\x40"
+ "\x13\x6b\xf6\x20\x0c\x4d\xbf\xa1\x7d\xe8\x8f\x6b\x09\xe7\xaa\xce"
+ "\x5c\x87\x5c\x33\x7f\xd8\xce\x37\x65\x0f\x9d\xe4\x63\xf1\x12\x67"
+ "\xbc\x49\xbc\xf8\xf5\x68\x63\x3d\xe2\xa3\x80\x77\x86\x10\x6d\x24"
+ "\xcf\xa8\xde\xfc\x5a\x93\xe7\x11\x7c\x86\x84\xb5\xc1\x13\x92\xf9"
+ "\xbd\x15\xef\x8d\xcd\x75\xac\x95\x3a\x39\x42\xff\x40\xea\x80\xfc"
+ "\xc1\xd8\x27\xe3\x42\xdd\xda\x99\x7b\xfc\x69\xa4\x07\x2c\x1c\xda"
+ "\x39\x38\xf5\x3d\x9d\xfa\x2d\x75\x29\xff\xd0\x8f\xff\x91\x3e\x31"
+ "\xb2\x87\xaa\x52\x5f\x96\xda\x9e\x2d\xe8\x28\x92\x2f\xf6\x10\xbc"
+ "\xff\xb0\x0a\xdf\xb1\xd7\xfd\xc1\xee\x61\xbf\xef\x6b\x0f\xb5\x39"
+ "\xdf\x01\x62\x00\xf9\x68\xef\x43\x9b\x86\x22\x4d\x55\xa8\xcd\x7f"
+ "\x10\x67\xa3\xc4\x53\x4a\x1a\xe4\x8f\x51\x52\xce\x9b\x5b\x11\x36"
+ "\x6e\xc6\x73\xec\x0f\x5f\xa3\xad\x15\x6b\xa4\xee\xcb\x10\x5d\xa7"
+ "\x04\x65\xf5\xeb\x7f\x48\x06\xbb\x7f\x89\x94\xc1\xfe\x91\x85\xc6"
+ "\xf0\x0f\xf5\x34\xef\x49\x6f\x48\xd7\x19\xa2\xf1\x94\xfe\x42\xfe"
+ "\x98\xa4\x97\xa3\xc6\xe5\xe6\x10\x9f\x5c\x29\xcf\xbf\x31\x2e\x7f"
+ "\xcc\x8d\x50\x4e\x0a\x5a\x6a\x92\x9f\xd5\x20\x2e\x12\x71\x4f\x51"
+ "\x3a\xaa\x53\xc8\x2a\x01\x1b\xea\x8b\x0a\x1e\x2b\xc2\x12\x99\x86"
+ "\xf2\x30\xaf\xf6\xb4\x84\xe6\xc6\x1f\x53\x05\xbe\xd4\x60\xcd\xcb"
+ "\xf6\xaf\x09\xf1\xee\x7f\xdc\xd5\x27\x77\x43\x39\xa1\x3d\xe3\x8f"
+ "\xef\x13\x8c\x37\xf4\xc9\x20\xea\x02\xa2\x1d\xf2\x3c\xf5\xc8\x69"
+ "\x56\x77\x96\x83\xbe\xa0\xbd\x96\xf8\x43\x1a\x7b\x41\xef\x09\xf9"
+ "\x59\xdd\xab\x3b\xe4\x99\xc5\x16\xbc\xbf\xa6\x1a\x06\x9a\x3b\x75"
+ "\x09\xe1\xfa\xbd\x12\xfe\x75\x59\x2a\x95\x89\xfe\x53\x59\xd8\x7f"
+ "\x14\x5d\xae\xa9\x95\xfb\x04\xca\xfc\xf7\xd3\x1a\xac\xc5\x59\xde"
+ "\x26\x0d\x0e\x34\xc6\x02\xe6\x75\xf9\x98\x03\xc2\x67\x5a\x71\x0d"
+ "\x3f\xbb\x14\x65\x48\xdf\xba\x75\x55\x9c\x60\xab\xa5\xf7\x12\xff"
+ "\x8d\xb6\xcb\x3b\x91\x98\x8b\xe0\x4d\xa9\x9d\xea\xa6\x5c\x3b\xb5"
+ "\x9d\xce\xf1\x42\x32\x95\xba\xf7\x29\xaf\xf7\x79\x99\x67\x83\x3c"
+ "\x67\xc4\xd8\xd4\x29\x7c\x65\x0e\xd3\xce\xb7\x30\xcf\xff\x40\x7e"
+ "\xd7\x0c\x54\x8e\x4f\xf0\xcc\x75\x1e\x15\x70\xc1\x98\xc4\x75\x97"
+ "\xbd\x15\xad\x8f\x09\xc6\xa3\xe1\x2a\xf4\x36\xc6\xe4\xad\x29\xba"
+ "\x6d\x25\xda\x9b\xb0\x86\x4b\x24\x2d\xf9\xd6\x65\x53\xe9\x83\xdc"
+ "\x14\xb8\xe7\x1e\xa2\x8d\x76\x1a\x84\x2c\x54\xd7\x5f\x1d\x0b\x38"
+ "\x9d\xd7\xef\x02\xa8\x6b\x7e\xd1\x4a\xba\xbf\x6e\xbf\xd4\xfd\xa5"
+ "\xf8\xc7\x7c\x5c\x6d\xf2\x05\xe9\x2e\x4c\x2b\xea\xa8\xd6\xf9\x2c"
+ "\xc2\x6f\x11\xa5\x0a\x60\xf7\x16\xdd\x7f\x3c\xa0\xe1\xb5\xa1\x67"
+ "\xd8\x5b\xc7\xb5\xf2\xc3\xdb\x30\x47\x9e\x29\xbe\xe5\x97\xb4\xff"
+ "\x5b\x84\x7b\xaa\x24\xbf\xf6\x96\x57\x6f\x37\xbe\x1f\xb8\xb2\x8f"
+ "\xe9\xd3\x1e\xc9\xb6\x2e\x22\x14\x9d\x72\xb7\xc3\x9a\x34\x3e\x6b"
+ "\x92\x50\x16\xb7\xfe\x60\xda\xfd\xd6\xf4\x07\xc6\x3b\x72\x92\x1f"
+ "\x93\x8f\x69\xe9\xb3\xe8\x79\x85\xee\x80\xb5\xbb\xec\x4f\xe9\xfd"
+ "\xf9\xc1\x43\x5a\x1b\xfe\x94\xe3\x51\x7e\x24\x64\x17\xdc\x6c\x4b"
+ "\xe5\xce\xd9\x25\xd8\x53\x3b\x89\x4e\x4e\x0b\x7e\xc1\xf9\xc6\xd9"
+ "\x25\x3c\xd6\x96\xea\x8d\x3d\x52\x81\x5f\xba\x37\x36\x3b\x79\x03"
+ "\x70\xa0\xa9\x94\xfb\x4d\x81\xa1\x12\x57\x22\x0c\x9a\xa4\x03\x74"
+ "\x0f\x8d\x25\x9b\x71\x7b\x31\x4f\x0b\x72\x37\xe8\x1f\xc0\xe5\x4f"
+ "\x0d\xfa\x3e\x2e\xe4\x98\x4e\x5b\x6a\x9a\x83\xf7\xd2\xdc\x01\x7d"
+ "\x40\xf7\x69\x53\x49\x96\x89\x74\xe8\xff\xbe\x14\x09\x8b\x3f\x11"
+ "\x0c\xac\x1a\x7c\xd3\xbb\xcb\xfe\x8c\xf1\x4f\x13\xb2\x67\xb5\xcc"
+ "\x22\xf6\x0a\x75\xcd\x1d\x8f\x83\x17\x48\xd7\xcb\x44\x59\xd1\xda"
+ "\xdd\x32\x51\x1e\x0b\xb3\x4d\x70\xb5\x9f\xba\x29\x73\x0e\xc9\xad"
+ "\xe8\x5e\xb0\xc9\xa1\x90\xff\xad\x8c\x3e\x59\x1d\xbe\xc5\x94\x9a"
+ "\x49\x7e\x97\x11\xe3\x53\x4a\x28\x4d\x48\xa6\xa5\x7a\x36\x18\x54"
+ "\x3f\xe8\x09\x33\xcd\x0f\x41\xab\x0a\x7d\x8a\x3f\xd7\xf5\x9d\xcf"
+ "\xf5\x1b\xfb\x3f\x8b\xf9\x70\xa1\xcc\x88\xb9\xfd\xa7\xd4\x5b\xe2"
+ "\x25\xed\xa4\x96\x29\x4c\xda\x8a\xf8\xf3\xeb\x62\x5d\x6a\xf3\x11"
+ "\xf0\xf5\xd2\xd9\xb9\x29\xc0\xbd\x74\x4f\x45\x8d\xc0\x9c\x64\x67"
+ "\x98\xbb\xb0\xbb\x84\xee\xab\xf7\xcd\x4b\x3b\xe6\xa5\x1d\xf3\x92"
+ "\xf4\x1c\x50\xbf\x37\xe2\x8e\x4c\xac\x59\xe5\x0c\xfb\x73\x21\xb5"
+ "\x9f\x60\x03\xfa\x3d\x5a\x05\xac\x84\x3e\x2b\xc1\x27\x6e\x5e\x0b"
+ "\xdd\x33\xa4\xbe\x9a\x02\xe8\x73\x78\xbf\x0c\xaa\xa7\xb2\x0c\xfd"
+ "\x32\xa0\x5f\x8e\xb3\x42\x16\x44\xf7\x3f\x81\x4b\x46\x85\x7c\xb8"
+ "\x1c\xa8\x0e\xef\xa3\x4a\x7e\x9f\x44\x1f\x0e\xbc\x3d\x50\x1f\xb9"
+ "\x81\xfa\x48\x30\x38\xb0\x51\x3b\xe7\x14\xed\x24\xbc\xd5\xc9\x0e"
+ "\xa4\xc7\x94\xd2\xbd\x4b\x5b\x2a\xe8\xde\x69\x34\x86\x3b\xca\xb8"
+ "\x93\xda\x39\xd0\x78\x51\x79\xb2\xac\xb7\xe7\x9a\x4a\x4b\x32\xbb"
+ "\xcb\xde\x4e\x1a\x18\xde\x6f\x3f\x72\x75\x78\xbf\x3d\x86\xf2\x53"
+ "\x3b\xe8\x0e\xa9\x89\x0c\x8c\x61\x7e\x83\xae\xa8\x18\xa8\xde\x98"
+ "\xd2\x1a\x6a\xd7\x80\xdf\x30\xf7\x3b\x37\xe4\xf5\x5f\x13\xea\x0e"
+ "\x3f\x23\xf8\x91\xbc\x48\xca\xf5\xdf\x6e\xee\x3b\x7f\x70\xda\x72"
+ "\x4c\x8a\x35\x82\xd6\x98\xa0\x89\xd1\xdf\x81\xca\x35\x29\x4e\xb2"
+ "\x51\x38\x0d\xb8\x6a\xc0\xef\x58\x07\x56\xbe\xe6\xce\x5b\x50\x5e"
+ "\x72\x4c\xa9\xc2\xbd\x11\x77\x0e\x8f\xf1\x05\x12\x09\xae\x68\xab"
+ "\x03\x6b\xfc\x94\xd8\xbb\x85\xac\xe4\x20\xd6\xff\x87\xc2\xef\x8e"
+ "\x37\xd6\x96\x2c\xf5\x82\x0e\x66\x79\xd8\x5f\xc3\x7c\xa1\x1e\xcc"
+ "\xf7\x28\xdf\xa9\x90\x6b\xf5\xa6\x97\xf9\xa6\xac\x76\xb5\xcc\xc4"
+ "\xad\x05\x26\x8e\xb2\x46\xa8\x3c\xc9\xc0\xe3\xb2\xda\x43\x73\x47"
+ "\xde\x53\xd5\xe7\x0e\xf2\xef\x1f\x78\x5e\x1c\xfc\xf8\xea\xf3\xe2"
+ "\xe0\x6b\x9a\x9c\x37\x53\xea\xde\x1e\x0c\xe8\x3c\x07\x5f\x73\xd3"
+ "\xcb\xd6\x22\xaa\xff\xa0\x53\xd6\x0d\x98\x04\x52\x09\xcf\xcc\x02"
+ "\xdc\x4a\xba\xcb\x0e\x25\xe9\xb8\x81\xe6\x90\x29\x48\xfc\x10\x13"
+ "\xf3\x1c\xdf\xa6\x03\xf7\x68\x67\x84\xd9\x2d\x44\xab\xaa\x65\x7f"
+ "\x32\x62\xff\xda\x46\x77\x4f\x7c\xb1\xb6\x3d\x48\x03\xfc\x67\x9c"
+ "\xa9\xe1\xbf\x5d\x28\x63\x77\x95\xb4\x43\x11\x25\x7c\x06\x62\x9d"
+ "\x93\x9f\x40\x5a\xeb\x88\x8b\x47\xbb\xc9\x67\x20\x78\x84\x43\x35"
+ "\xfa\xde\xaf\x96\xa5\x12\xbc\x85\xcc\xd8\x40\xf4\x30\x60\xb7\xd9"
+ "\xa0\xee\xbe\x34\xc9\xc2\xa8\xcf\x97\xd6\x8c\xde\xfd\x7f\x27\x32"
+ "\xe3\xbb\x96\xa7\x99\xfd\x6e\x16\x5f\xfa\x5d\x23\xfb\xfb\x14\x66"
+ "\x20\x38\x78\xd8\xa1\x5a\x09\xbb\x43\x5e\x7d\x7c\x3c\xec\x60\x06"
+ "\x8d\x07\x9d\xcb\xa4\x05\x78\x97\x3c\x97\x72\x99\xb1\x07\x5a\xe4"
+ "\xf7\x3f\xcd\x1d\x60\x7f\x98\x61\xcd\x5d\x66\xcd\x5a\xba\x72\xc9"
+ "\xb8\x71\xc3\x07\xe0\x25\x5c\x89\x92\x97\x70\x65\x84\xf3\x12\x08"
+ "\x63\x4f\xff\xd3\x94\x2b\x79\x87\x59\x36\xcd\xbc\x88\x2d\x85\x85"
+ "\xde\xef\x62\xb3\xee\x0a\x0b\xde\xc3\x66\xdd\x7d\x8f\xed\xf1\xec"
+ "\x79\x59\xab\xc2\x62\xef\x0d\x97\x23\x6e\x78\x19\x75\x47\x8c\x7e"
+ "\x18\xf8\x43\x79\xec\x79\xda\x77\x0e\xcf\x2e\x0a\xf0\xaf\x30\x77"
+ "\xa7\x90\x4d\xaf\x63\xf9\x01\x76\x0c\xf8\x8d\xdf\x44\x78\x7d\xa8"
+ "\xb4\x6b\x1b\x64\x24\xa7\x33\xa1\xef\x5e\xf0\x74\x17\xe5\xdd\x8b"
+ "\xc3\xcf\x35\x6d\xf5\x03\x4f\x64\x4f\x96\xf4\xce\xe1\x64\xc4\xc7"
+ "\xe2\xf9\x84\x3c\xd3\x39\xfc\x24\xf8\xe5\x54\x61\xc3\x64\x05\xd9"
+ "\x30\x39\x2c\x74\xc3\x26\xfa\x4a\x98\xb4\xa5\xe7\x6a\x27\x1b\xf7"
+ "\x1e\x76\xb8\x8a\xe8\x0b\x4a\x8b\x3c\x13\xac\x0b\x59\x0a\x3d\x89"
+ "\x1e\xc6\xb7\x64\xbe\x31\x7b\x32\xdf\x96\x41\x3a\x35\x89\x88\xdf"
+ "\x48\x74\x5b\x84\x25\x2a\xba\xbb\xec\xb0\x53\xa7\x41\x7c\x83\xdc"
+ "\xfd\x22\x38\xeb\xfb\x60\x0c\xf0\x77\x8c\xcf\xc4\x6d\x64\x13\x48"
+ "\x61\x89\xb4\x3f\x98\x1c\xe9\xe2\x6e\x21\xed\x8b\x84\x13\x76\x08"
+ "\x5c\x7a\xb8\x43\xc7\x0b\x95\x92\x1f\x1d\x4e\xf9\xb1\x7f\x9e\x97"
+ "\xfb\xe7\x91\x28\x7d\x2d\xe0\x3d\x5e\x9f\xab\xfd\xee\x97\x2d\xc9"
+ "\xcf\xce\xcb\xce\xb2\x8e\x5f\x36\x9c\x85\x79\x60\xcd\xc9\x5e\x62"
+ "\xcd\xcb\x7e\x6e\x79\xf6\x32\xc1\xe8\xd1\xd7\xfe\xe7\x6f\xc0\x41"
+ "\x21\x7f\xd8\xa3\x09\xc6\x47\x56\x11\x2f\x6c\x2a\x1d\x27\xce\x52"
+ "\xe4\x19\xd8\xf1\x06\xb5\x72\x44\xaa\x94\x5b\x9e\x01\x5c\x8f\x4a"
+ "\x7b\x5c\xce\x6c\xc2\x33\x80\xeb\xd1\xf5\x52\x57\xe6\xc8\x3b\x1a"
+ "\xac\xaa\xd0\xce\x03\x21\x7a\xad\x5e\xd8\x1d\x92\x3a\xab\x47\x5a"
+ "\x3c\xcc\xb5\x3f\x44\x83\xd4\x3f\x40\x78\x50\xe0\xc3\x7f\x80\x0b"
+ "\x35\xda\x19\xf5\x1c\x2d\xe5\x2b\x78\xfb\x86\x1e\x26\xe4\x81\xe4"
+ "\x1b\x41\xe2\xd7\xa3\x29\x3a\x1c\x41\xbf\xb4\x93\xdc\x41\xe7\x8f"
+ "\xd2\x02\x97\x79\xd1\x2a\x66\x20\xd9\x03\xe8\xee\x29\x7b\xf3\xbc"
+ "\x06\x5e\x76\xc4\x0a\x5a\x26\x91\xd2\xec\xd0\x74\x37\x79\x6c\x36"
+ "\xe8\xa4\xa3\x8e\x10\xdf\x51\x3f\x55\xd0\xf1\x3d\x34\x6f\x8e\x26"
+ "\xd8\x68\x8f\x90\xb8\xfb\xba\x7f\xd4\x5e\x3e\x5c\x9e\xa3\x48\xfc"
+ "\x76\xb4\x4e\xeb\x43\x27\xe1\x2c\x4d\xf7\xd7\x20\xe7\x75\xfd\x54"
+ "\xcc\xb9\x44\x1a\x0b\xe0\xf9\x0a\x1d\x5e\xd4\x5f\x6a\x3b\xc9\xad"
+ "\x81\xbb\xa6\xec\x2b\xf0\x1b\xa4\xef\xd2\x23\xc9\x92\x3f\xaa\xb7"
+ "\x86\x9f\x1b\x4a\x5e\xa8\x7e\x72\xc8\x4e\xc8\x91\xaa\x2b\x71\xc4"
+ "\xd2\x25\x74\x9d\xec\x59\xdb\xca\x79\xcf\x66\xdb\x96\xdb\x93\xad"
+ "\xcb\x97\x88\x63\x5b\x21\x06\xc8\x5f\x3e\xff\x59\x2b\x61\x11\xdb"
+ "\xf4\x59\xb3\x6c\x0f\x3f\xf1\x93\x27\x87\xb3\x87\xe7\x21\x2e\x7f"
+ "\xa9\x75\x56\x4a\xb2\xfc\xf4\xf8\x8c\x69\x3f\xb5\x4d\x4b\x7b\xe2"
+ "\xb1\x39\x03\xe8\xa4\x47\x63\x4e\x58\x31\x46\x43\xda\xd8\xbb\xeb"
+ "\xa4\x0e\x52\x7d\x43\x7f\x1d\xa4\x7a\x0f\x7e\xc0\xce\xef\x58\x18"
+ "\x7b\x17\xb1\xef\xae\xc3\xaf\x44\xce\x9b\x61\x66\xb4\xdf\x17\x9a"
+ "\x37\xef\x8a\xf3\x36\x92\x1d\x48\xd9\xeb\x3b\xc0\x7f\x47\x66\x85"
+ "\x7f\x0b\xe1\x82\x77\x82\x02\x5f\x6a\xf3\x82\xe6\x83\x2d\x10\x25"
+ "\xe6\x86\xa4\x57\xde\x99\xa5\xcf\x8d\x0d\xf2\x7c\x88\x91\xcc\x8c"
+ "\xbe\x63\x7e\xef\x27\xf9\x32\xe6\x82\x95\xce\xd6\x29\x9e\xc7\x1e"
+ "\xdf\xaf\x95\xbb\x96\xe4\xcd\x44\xcf\x6a\x67\x62\x31\x67\xd8\x3b"
+ "\x87\x79\x59\xfd\x4c\xc9\x0b\xd6\xaf\x12\xf3\x66\xcd\xe8\x87\xc5"
+ "\x19\xa4\xb8\x4f\xf4\x4e\x5d\x68\xfe\xbc\xbb\x8e\xc6\x86\xf0\x82"
+ "\xc4\xbd\xef\xb4\x5c\x21\xc7\x89\x40\x5c\x87\x6e\x67\x3e\x7f\x1c"
+ "\x33\x18\xc7\x39\x59\x95\x81\x97\x78\xd8\x3b\x5b\xa5\x1e\xea\xbb"
+ "\x51\x3a\xfd\x8c\xf7\x78\x0f\xe3\xad\x57\xca\xbf\x2a\xc3\xe4\x5f"
+ "\x45\x76\x7e\xb2\xc9\xee\x25\x1a\xd9\xe5\xf6\x0a\xfb\xa6\x0f\x36"
+ "\xd9\x7d\xa4\x5b\x32\xfc\x34\x7b\xf7\xa9\xe2\x20\xef\xc1\xfb\x68"
+ "\xf4\x4d\xec\x21\x93\xa4\x4c\x01\xfc\xd8\xbb\xeb\x25\x6f\x22\xe3"
+ "\x09\xee\x78\xa7\x36\x1a\x69\x7c\x30\x2f\x3b\x30\x46\x69\x03\xe1"
+ "\xbd\x98\x52\x83\x66\x47\xea\xdd\x93\xc4\xa3\x12\xac\x5e\x34\xa8"
+ "\x39\x2f\x96\xe1\x87\x27\xe1\xbe\x10\x7d\xc9\xfd\x12\xb6\xef\x7a"
+ "\xea\x1d\x9d\xb4\x6f\xfa\x07\xc3\xa5\x18\xcf\x13\xfa\x78\xa6\x05"
+ "\xbd\x0f\xd2\x78\x75\x97\xbd\x67\xd1\xc7\xb2\x6b\xe2\x7c\xf0\x5e"
+ "\xcc\x7a\xb4\xfa\x6e\x8a\xc7\xfa\x7f\x77\xab\xd0\xed\xa1\xf5\x75"
+ "\x45\x5e\xe0\xe1\x54\x2d\x7f\x86\x9e\xff\x4a\xfb\xc4\xe2\x82\x2e"
+ "\x09\xb9\xee\x97\x3a\x3e\x9a\x3b\xe9\x7e\x3a\x3e\x74\x06\x58\x2f"
+ "\xe7\xa4\x2e\x83\x33\xcb\xfe\x34\xfc\x58\xdd\x04\xfe\x7b\xd3\xdc"
+ "\xd1\x9a\x1c\x00\x6b\xfb\xbd\x8b\x13\x19\x5b\xe4\x5b\x99\xd1\x27"
+ "\x43\x21\xd9\x07\xd9\x1c\x44\x3b\x3c\x61\x32\xb2\x3e\x1d\x4d\x0f"
+ "\x6b\x48\x27\x9d\x31\xba\xb3\x4c\xe5\xd0\xba\x92\x72\x9b\x06\xb3"
+ "\x1b\x98\x17\xe5\x2d\x11\xe7\xdf\x65\xef\xe5\x88\xb9\x07\x5e\x5b"
+ "\xf0\xf9\x85\xfc\x2b\x4d\x87\x49\xd0\x2e\xf2\x3e\x5e\xc3\xf4\x3e"
+ "\x59\x90\xb8\x9b\xf6\x9e\xd0\xcb\x46\xfc\xdc\x81\xe4\x85\xc0\x0f"
+ "\x39\xf3\x96\x64\x2d\x5d\xb0\xe0\x1f\xa3\x86\xf0\x33\x2e\x67\x99"
+ "\x5a\x81\x32\xc1\xff\xee\xcb\x91\xf3\xb4\x01\xf8\xff\x37\xa9\x92"
+ "\x7e\xfb\xc5\xd7\x58\x37\x63\xce\xb0\xf7\x2d\x3a\xfd\x2e\xd7\xd1"
+ "\xfb\x89\xbc\xac\x21\x27\xb4\x36\x1a\xbc\xdf\x5e\x1b\xef\x1b\x07"
+ "\x5e\x1b\xef\x27\x61\x9f\x3d\x81\xef\x89\xa8\xf3\x84\xc0\xf9\x34"
+ "\xde\x92\x06\x77\x99\x02\x0f\x0a\x1a\xdc\xb6\x8a\x29\x44\x7f\x93"
+ "\x6c\x9a\xf6\x83\x20\xf8\xda\x20\x70\x84\x2d\xc0\xcc\xb4\x17\x6c"
+ "\x58\x42\x72\xc7\xb1\x3c\x70\x89\x7b\x6c\xab\x80\x2f\x10\xae\x3c"
+ "\x23\xcf\xe0\x7f\x79\x11\x7c\x08\xde\x37\x9c\x26\x5c\xa1\x92\x33"
+ "\x04\x26\xf7\xeb\xf7\xb7\xea\x34\xae\xa9\xd4\x2a\x6c\x64\xd3\xbe"
+ "\x1d\x94\xfa\x4c\xb5\xb4\x77\xa3\x9e\xfd\x02\x07\x05\x4d\x74\x06"
+ "\xc0\x36\x2c\x44\xb9\xa4\x17\xb4\x84\xda\x17\x71\x8f\x29\x90\x22"
+ "\xce\x0a\x76\x2e\x14\xfa\x40\xf7\x48\x7d\xa0\x7b\xd8\x8e\x25\x04"
+ "\x87\xf7\xfd\x57\x95\x8d\xc7\x1e\xb1\x87\xc7\x3b\x16\xe4\xda\xec"
+ "\x39\xab\x6c\xa4\x0b\x78\xc5\xfe\x2e\xd7\x50\xd9\x07\x09\x12\xbe"
+ "\x1f\xa4\x87\x64\x55\x52\x87\x8f\x70\xe6\x24\xbf\xb0\x61\xab\x9d"
+ "\xf5\x7c\x38\x99\x60\x5f\x7c\x99\xc2\x51\x98\x73\x1f\x4e\xa0\xb3"
+ "\x9f\x2e\xd2\x9d\xd9\x99\xc1\x9c\x65\xdc\x45\x32\x34\xc4\x8f\xd4"
+ "\xef\xd4\x77\x21\x1e\x6b\x9f\xe2\x86\x89\xb3\xc6\x7c\x21\x9b\x03"
+ "\x9c\x3e\x70\x79\x98\x49\xd3\x75\x9d\x7b\x13\xe9\xe7\x09\x9d\x72"
+ "\x41\x67\x7c\x70\x56\xde\xd1\xfa\xa0\x5d\x87\x25\x68\xdf\x29\x74"
+ "\xaf\x9f\xf4\x74\xba\x38\xe9\x04\x7e\xc8\xf4\xfc\x1e\xf6\x81\xb8"
+ "\x63\xfa\x98\x4f\xbc\xef\xf9\xa5\x2f\xfc\x4e\xfe\x07\x5b\x25\xde"
+ "\xfa\xa0\x1a\xf1\xc0\x95\x1f\x94\xa0\xcd\x31\xd2\x46\x80\x28\x67"
+ "\xa6\xae\x0f\x15\x0e\xb7\x69\xf3\xec\x20\x96\x73\x17\x2c\xc8\xce"
+ "\x5b\xa6\xfb\x94\x4f\x5a\xba\x28\xeb\x01\xed\x0e\xfe\x92\xec\x95"
+ "\xb6\xdc\x2c\x71\xc7\x07\xb1\xf2\xf5\x0a\xf8\x26\x13\x7f\x23\xf4"
+ "\xe6\x45\x9f\x9a\xc7\xef\xd0\xe8\xa8\x36\xd6\xb8\x5f\xea\x5b\x34"
+ "\x2e\x96\x7b\xdb\x75\xff\x81\x76\x34\xeb\x7b\x1b\xc9\x58\xba\xd8"
+ "\x7d\x56\x3a\x33\x23\xbb\x0c\x74\x36\x47\x72\x16\xa4\xc1\x1a\xfd"
+ "\xa0\xef\xce\xf4\x7a\xc4\xd3\x99\xb0\x6b\x09\x9d\x03\x37\xcf\x50"
+ "\x37\xda\x12\x78\xdc\xa3\x0d\xc0\x6b\xd1\x34\x76\x74\x56\x24\x7d"
+ "\x78\x34\xa6\x12\xbe\x26\x59\xa0\x6b\x09\xe9\xd3\x36\x9a\x41\x9f"
+ "\x60\xbf\x6c\x9e\x09\x5e\x2f\x61\x6d\x01\x8b\xa2\x3a\xb0\x17\x7a"
+ "\xa4\x5c\xb9\x71\xee\xe1\x42\xc6\xb4\xfd\xd0\xb3\x5e\xc8\x39\x1b"
+ "\x93\xe4\x9e\x6a\x4b\xd1\xe4\x28\x29\x48\xb7\xd6\xc3\x6e\xf5\xca"
+ "\x36\x3f\xea\x15\xf3\x44\xe0\xba\xc6\xdd\x7c\xd3\xac\x12\xa1\xf3"
+ "\xbc\xe9\x51\xaf\xca\x73\x22\x28\x8c\xbd\x66\x38\xc6\xb1\x99\x17"
+ "\x27\x31\x4d\x4f\x3a\xe2\x34\x3b\x76\x17\xc9\x81\x31\x3f\x5c\x04"
+ "\x0b\x94\x3f\x55\x2b\x7f\x2a\xca\x47\xbd\xf7\x68\xfe\x73\x1b\xbd"
+ "\x7a\x5d\x58\xaf\x5e\xec\xc7\x09\xb4\x27\xa3\xfd\xf1\xf8\x59\xa4"
+ "\xcc\xc9\x0f\xde\x6f\x6c\x9f\xcc\x49\xd2\x7d\xc7\x92\xf4\xf5\x42"
+ "\x75\x6b\x7d\x98\xa2\x96\x09\xfb\xad\x8a\x56\xd7\x14\x92\x7f\xe8"
+ "\x65\x72\x94\xc9\x2f\x75\xd6\x60\xff\x8c\x02\xde\xf0\xc6\x94\x62"
+ "\x9f\xa4\x3a\x88\x6e\xf7\x8d\xe5\xd8\x47\x83\xb6\xa0\x51\xda\xd0"
+ "\x58\xc5\x46\x84\xd3\xec\xa8\x6f\x6b\x88\xce\x44\x19\x97\x80\x9f"
+ "\x8b\x58\x49\x3b\x3b\xf6\x06\xd5\x4d\x7a\x4e\x34\xae\x3d\x18\x27"
+ "\x8c\x55\x33\xea\xa9\x05\xaf\x31\x02\x70\xf8\x98\xc6\x8b\x74\x47"
+ "\x76\xf4\x08\xfe\xc3\x84\xb6\x19\xdb\xd8\xb1\xc3\x34\x56\x54\x16"
+ "\x77\xce\xaa\x09\x74\x67\xfc\x90\x6c\xd8\x11\xac\x57\x17\xf2\x0e"
+ "\x3a\xbf\x3c\xcd\xdc\x33\x88\x2e\x07\xaf\x22\xde\x8b\xb3\xb8\x2a"
+ "\xc6\x5a\xe8\x4e\xbb\x67\xac\xee\xe0\xea\xe5\x32\xc6\x1b\xb0\x3f"
+ "\x5c\x36\xb0\x80\x1f\x7c\x35\xda\x6d\x28\x3e\x4b\x76\xf6\x6a\x80"
+ "\x6b\x2a\x48\x67\x25\xaa\xb2\x80\x99\xc9\x46\x61\xb1\x9d\xfb\x9b"
+ "\x7c\xd5\xac\xc9\x5e\xcd\x3e\x08\x54\x31\xd7\x0a\x92\xd3\xba\x3b"
+ "\x3f\x74\x54\xd1\x5d\x95\x61\x78\x7f\xdd\xfa\x53\xaa\xab\x69\xed"
+ "\x87\x2d\x1f\x61\xe4\x3e\x62\xd6\x9f\x8b\x70\x55\x63\xc6\x07\x98"
+ "\x6d\x1f\xb0\xe2\x76\xae\x12\x8d\x57\xb4\x98\xea\xa8\x40\x59\x35"
+ "\x64\xcf\xcf\xac\x76\x59\x86\xa3\xff\xc6\x34\x07\x13\x67\xa4\xae"
+ "\x25\x7f\xa2\x36\x8e\xdc\x71\x81\x45\xb9\x96\x1c\x11\xef\x42\x66"
+ "\x82\xfe\xba\xb3\x5a\x85\x0e\x26\xd9\x32\x74\x3b\x3a\xe8\xce\xb7"
+ "\xba\x81\xda\x18\x94\xed\x06\xbc\x8c\x7a\xfe\x9d\x45\x7a\xfe\x26"
+ "\x81\x0b\xb6\x13\x3c\xd0\xa6\x63\x73\x24\x4c\x1a\x11\x2b\xdb\x0c"
+ "\xf8\x64\x84\xc3\xa7\x69\x32\xc1\x87\x74\xd2\xd5\x15\x9d\x35\x68"
+ "\x5b\x2a\x60\xa0\xea\x75\xd0\x1c\xa0\xb3\x3c\x2a\xbf\xf2\x02\x8b"
+ "\x76\x2d\x21\x9d\x75\xf7\x4b\xa6\x74\x63\x94\x7a\xe9\x6c\xed\x86"
+ "\x8b\xcc\x48\xe3\x46\xb4\xc3\x06\xf1\x5d\xc0\xbc\x90\xc6\xcc\x1b"
+ "\x3b\x37\x0a\xbf\x68\xfc\xcc\x34\xf7\xf0\x8c\xc7\x78\x55\xa0\x0d"
+ "\xf1\x18\xab\x1a\x7a\xca\xf9\x38\x9b\xc6\xd3\x4c\xfb\x33\xe6\x4a"
+ "\x28\x7e\xd3\xec\x07\x03\x58\x3b\xaa\xe0\x3d\xdd\xf1\xea\xc6\xdc"
+ "\x4c\xa9\xbf\xfc\xe1\x9c\xed\xa0\xf5\xab\x37\x09\x1b\x19\xd1\xe0"
+ "\x4f\x48\xe6\xc0\x5e\x16\x77\xe9\x9a\x2d\x3a\x1e\x7f\x61\x14\xd9"
+ "\x9f\x70\x4f\x37\x08\x5d\x4a\xdb\x64\x6d\xae\x4f\x46\x9a\xa9\x1e"
+ "\x36\x31\x47\xae\x89\x46\x71\x07\x90\xf0\xc0\x60\x74\x16\xf6\xae"
+ "\x46\xd2\x61\xe5\x37\x65\xb0\x68\x85\x7b\xa3\x33\x4d\xdc\x1d\xa8"
+ "\xa7\x39\x14\x2d\xe6\xbe\xfc\x06\xda\xd8\x6b\xc2\xde\xd6\x8c\x78"
+ "\xa3\x1e\x4f\x7b\xa8\x0a\x7e\x99\x78\xf5\xb4\x55\x26\x5e\x74\x91"
+ "\x25\x08\xb9\x97\x1e\xbf\xca\x6b\x6a\xc2\xce\x5f\x04\xdc\x4d\xb6"
+ "\x75\x28\x0f\xe2\x23\xb0\x57\x1e\x40\xbd\x2e\xa4\x8f\xd7\xd3\xf3"
+ "\xae\x0c\xa3\xdb\x51\x2f\xd6\x19\xd9\x5f\x13\x7b\xa4\x8c\x1f\x92"
+ "\xe6\xf0\x9a\xc4\x98\xe9\x71\xcb\x32\xc4\xde\x4c\x76\x38\x40\x7b"
+ "\x73\xd1\x9e\xd3\x22\x5e\x01\xef\x4c\xf1\xe6\xb0\x38\x03\xd9\x3c"
+ "\x21\x7b\x9a\x61\x71\x11\x68\x33\xeb\x0b\xa3\x6e\xda\xa7\x69\xdd"
+ "\xa5\xad\xa2\x33\x40\xb9\x3f\x8b\xba\x57\x71\x26\x6d\xf4\xca\x38"
+ "\x49\x07\xfc\xa5\x26\x9c\x6f\xa7\x73\x17\xaa\x5b\xed\xca\x30\x04"
+ "\xbb\x32\x22\xa8\x7e\x2a\x8b\x64\xae\xe8\x23\xea\xed\x60\x64\x1f"
+ "\x9e\x6f\xfc\xac\x99\xd3\xbd\x2f\x94\x2b\xda\xe3\xf0\x03\xf7\x7c"
+ "\x9e\x3e\xb0\x7e\xcf\x7b\x15\xae\xa2\x9f\x63\x4e\x7f\xb4\x9b\x70"
+ "\x4a\xd0\x9c\x39\xdd\xba\x90\xf6\xe9\x8f\xc6\xd1\x98\x06\xb1\xce"
+ "\x83\xb1\x99\xd3\x27\x75\x30\xa5\x08\x6b\x47\x9e\x4d\x7e\xf4\x10"
+ "\xd1\x89\xc5\x2a\xe7\x78\x9f\x4c\x73\xd7\xd4\x49\x7a\x39\x99\x33"
+ "\x85\x2e\x4c\xdc\xd1\x12\xb7\xbf\x83\x35\x96\x7c\xca\x1a\x03\xee"
+ "\x92\x03\x17\xbc\x46\xa9\x13\x63\xa4\x72\x9f\xa0\x6f\xc5\x58\x2f"
+ "\xb6\x60\xcd\xe0\xbc\x2d\xf8\x25\xc0\xee\x0b\xb9\x17\x7c\xb4\x5b"
+ "\xe7\x91\xae\xde\x87\xbf\x0a\x9b\xa8\xa4\x2f\xaa\x6e\x7a\x85\xf6"
+ "\x8a\x62\xde\x9d\xc4\x26\x15\x90\xac\xfa\xa3\xd6\x18\x1f\x4b\xd5"
+ "\xca\x3d\x2f\xcb\xfd\x2b\xbb\x5a\xb9\x34\x6f\x1b\xb7\x4a\x3d\x14"
+ "\x35\xee\x15\x7b\x10\x65\x07\xe3\x5e\xa9\xc5\x5e\x53\x0c\xfa\x05"
+ "\xf4\x48\xcb\x0c\xd4\x63\x6f\x0a\x34\x33\xb2\xab\xbc\x43\xc5\x7e"
+ "\x7d\xde\xc2\x34\xfd\x9f\xe2\x73\xec\xaf\x77\xa9\x3c\xc9\x0c\xde"
+ "\x8d\xe4\xbf\xc5\x84\x67\x49\x9e\x5e\x14\x64\x91\xee\x7c\x70\x59"
+ "\xb1\xef\x61\x1d\xb7\xdc\xf7\x0e\xc9\xda\x81\xab\x82\xdc\x62\x78"
+ "\xfb\x92\x87\x6d\x00\xfe\x16\xf6\x41\xd7\xdc\xf4\x72\x4c\x29\x7b"
+ "\x90\x1b\x4c\x42\x7f\x4c\xdd\x78\xb8\x02\x63\xdb\x2a\xf5\x8d\x6c"
+ "\xd3\xc3\x74\x8d\x22\x50\xd7\x9b\xa4\x6b\xc4\xcd\xb6\xa8\x6a\xda"
+ "\x33\x31\x66\xdd\x65\x7f\x05\xfd\xff\x17\xb1\xdf\xad\x23\xba\x48"
+ "\xe0\xf9\x96\xd9\xde\xd8\xed\x64\xdf\x9c\x7c\xa5\x2a\xea\x8a\x40"
+ "\xed\x86\x6f\x98\x51\xc2\xa3\x65\x42\x53\x67\xb7\x8b\x3b\xb7\xa7"
+ "\xd3\x3a\xd2\xca\x36\xa1\xec\x20\xdf\x48\x77\xdb\x5a\x66\xc9\xb1"
+ "\x11\xef\x16\xfa\x1e\xe8\xa5\xbb\x81\x7f\xad\xaa\xee\x21\xba\xe8"
+ "\xaf\xa9\xa0\x75\x5d\x5d\xe6\xed\xe9\x3f\xb1\x94\x80\x06\x68\xc9"
+ "\xf4\x44\x0c\x11\xe7\x2d\xba\xad\xd3\xc1\xce\xd5\xf8\x36\xcb\x70"
+ "\x37\x0a\x01\xdd\x1e\x7f\x86\x7d\xf2\x97\x9e\x32\x66\xe8\xc5\xde"
+ "\xda\x03\xde\x87\x6f\xcb\x88\xae\x1c\xcd\x52\xf0\x6d\xf4\x19\xd6"
+ "\xf2\x66\xc0\xc0\xe2\xf1\x33\x7b\x6f\xca\x19\x86\x72\x53\x49\xa6"
+ "\x7b\xec\x02\x9d\x33\x7f\x2c\xed\x72\xbc\xcc\x12\x55\x94\x47\xb2"
+ "\xe4\x0d\xa3\x59\x22\xc9\x91\x11\x97\x64\x0b\xca\x73\x16\x9d\x4f"
+ "\x5c\x33\x9a\x25\xf7\xaf\xb7\xa5\x5a\xd2\x79\x9f\x88\x3d\x7e\xa5"
+ "\x97\xdd\x6c\xff\x3e\x6f\x43\xb9\x4e\x5e\x16\xc1\xf9\x4d\x16\x83"
+ "\xa4\x07\x3f\x5e\x65\xda\x2a\xe7\x9d\x38\x57\xc0\x7c\xa3\x73\x1b"
+ "\x4d\x5e\xad\x08\x1b\xaf\x71\x59\x2d\x74\x37\x4b\xc4\x29\x66\x82"
+ "\xa5\x59\xb4\x43\xb3\xcb\x18\x5c\x73\x47\x26\x95\x41\xed\xb1\xcd"
+ "\x93\xb2\x6e\xb2\xd9\x08\xb8\x0a\x3d\xe1\x75\x2f\xb3\xe8\x5f\xbf"
+ "\xcc\xcc\xc7\x16\x88\x7e\xed\x96\x6b\xd1\xc8\xa8\xbd\xaa\x93\xd6"
+ "\x19\xe6\x04\xda\x4d\xf5\xd1\xdc\x68\x0a\x9c\x77\x15\xe7\x73\xd5"
+ "\xb5\x90\xec\x93\x7c\xfc\xb5\x2b\x6f\x0f\x4b\x6b\x0f\x48\x3b\x63"
+ "\x73\x99\x77\x27\xca\xdb\x39\x9a\x99\x51\xd6\x45\xf7\x22\xc2\xb5"
+ "\x96\x5b\x5c\x79\xfb\x51\xf6\x27\xc3\x68\x3f\x5a\x0f\xf8\xc8\x7d"
+ "\xe9\x93\x03\x6e\x7f\x2b\x23\x1f\x17\x8f\xd9\x79\x90\xca\x41\x9a"
+ "\x87\x44\x7f\xb7\x59\xac\x36\x69\x57\x53\xf4\xb5\xef\x0c\x41\xeb"
+ "\x87\xfb\x82\x28\x6f\x8e\x3b\x13\x34\xa7\xd6\x27\x1d\xd6\x72\x7e"
+ "\x7d\xb2\xd1\x95\xb7\x8b\xd1\xf8\x50\x7a\x84\x4b\xdc\x9d\x48\x7b"
+ "\xb6\xff\xb8\x50\x1a\x7c\x7b\x03\xe5\x7e\x2f\x74\x36\x46\x67\x36"
+ "\xa1\x34\xd5\xe8\x0f\x60\xe5\xdb\x06\x18\x49\x99\xe1\x27\x63\xa8"
+ "\xad\x18\xbb\x04\x77\xfe\xa7\x03\xdf\x89\xc4\xda\xc7\xbc\x2f\x6d"
+ "\x12\xf2\xb2\xbf\x8d\x78\x2c\xa0\x72\x89\xcf\xfe\xe6\x02\xed\x56"
+ "\xe1\xc1\x93\x70\x81\xc0\x27\x13\xe9\x3c\xfb\x6f\x87\x4d\x8a\x1c"
+ "\x5f\xea\x0b\xd1\x4c\x03\x8d\x71\xd8\x59\x85\x99\xda\xaa\x8f\x31"
+ "\x37\xbf\x57\xa1\xd2\x19\x14\xe9\xf6\xf6\x5a\x98\x9c\x7f\xdc\x89"
+ "\x72\xdf\xd0\x68\xc8\x0a\x6d\x3f\xad\xe8\x8a\xcd\x4c\xe7\xcf\x5b"
+ "\x98\xae\x87\x88\xf5\x3b\xcb\x26\x75\x47\x2d\x84\xa3\x76\x1a\xe4"
+ "\xda\xa1\x36\x6a\x79\xd7\xca\xb3\xf1\xbf\x95\x20\xff\xda\x01\xfb"
+ "\x1b\x31\x9a\xec\x4f\x15\x93\x0d\x51\x71\x57\x09\xb8\x0a\xfb\x41"
+ "\xa4\xdb\xd7\xc3\xe4\x79\x7d\xeb\x03\xa0\xf1\x23\xe9\x9e\xaa\xde"
+ "\xb6\x6b\x3b\x57\x68\xd5\xee\xcb\xb5\xce\xd4\x79\x68\x6e\x06\x8c"
+ "\xcb\x4c\xc2\xdf\x01\xe8\x2e\xd5\x17\xfb\x9e\xd3\x1b\x7b\xdc\x25"
+ "\xd7\x4d\xab\x9d\xc7\x4a\x7c\x6b\xf3\xb3\x12\xea\x97\x26\x97\x88"
+ "\xa4\x3e\xa3\x1c\xa7\x7e\xbe\xad\x97\x3d\xa8\x0f\x11\xbd\x6f\xe8"
+ "\x93\xb4\x6f\xf0\x5e\x85\xe8\x1b\xd9\xe8\x11\x7d\x3b\x2e\xee\x00"
+ "\x5e\x63\x7f\x5a\x25\x6c\xdf\x73\xba\x46\x53\x19\x9f\xbe\x4a\xed"
+ "\xa3\x31\x01\x7e\xb8\xe1\x0c\x3b\x9e\xc9\x87\xff\x7a\xf8\xb5\x95"
+ "\x79\x3c\x59\x96\x79\xdc\xb5\x19\x38\x58\xde\x59\x24\x9d\x9d\x4f"
+ "\xd7\xf3\x8d\xc7\x5d\xc4\xc3\x74\xa1\x3e\xcc\x8f\x30\x3c\xf4\xa9"
+ "\x99\xc6\x6a\xe2\x1e\x96\x2a\xe7\xe1\xa7\x43\x88\xdf\x95\x3e\x9e"
+ "\x8e\xef\xc7\xbc\x97\xf6\xe5\xfa\x74\x56\x15\xb1\x8f\x85\xe3\xd8"
+ "\x6b\x6c\xa3\xe4\x69\xe2\x0e\xa7\xe0\x7d\x97\xd0\x4b\x42\x7b\x57"
+ "\x06\x74\xfc\x77\x7c\x17\x27\x79\x77\x91\x26\xf7\x24\x5c\x56\x24"
+ "\x6d\x04\x76\x97\x7d\x3a\xbd\x4f\xee\x49\x77\xba\xcb\x78\x03\xa5"
+ "\xc3\xd8\x9f\xa7\x34\xd2\x06\xd9\x19\xed\xbe\xf3\xa7\x4f\x6a\x77"
+ "\x99\x93\x48\x57\x0b\x79\x81\xef\xb8\x90\xb7\x12\x0c\xa8\x6e\xd1"
+ "\x76\x03\xc9\x38\x3f\xad\x0e\xc9\x99\x8f\x0b\xdf\x10\xd2\x1e\xc1"
+ "\xa7\xfb\xf5\x39\x82\xfe\x46\x4a\xbf\x1e\xc7\xc7\x1c\x4d\x66\x62"
+ "\x0e\x74\x71\xcb\xf0\x5b\xab\x69\x4e\x7e\x7a\x22\x1c\x4e\x69\x01"
+ "\xb5\x58\xe2\xa0\xe3\xf5\x5c\xac\xf5\xe3\xf5\xff\x98\x9e\xf8\xef"
+ "\xbb\x74\x5a\x44\xc2\xd9\x0c\xfc\xf2\x59\x40\xc0\xda\x39\xcb\x43"
+ "\x76\x77\x9f\x2f\x22\x3b\xe2\xff\xfd\x0d\xd9\x6b\x0f\x38\x67\xb3"
+ "\x60\xb1\x85\xec\xd3\x32\xd5\x39\xdb\x7c\xda\xce\x0c\x36\x3b\xc9"
+ "\xd6\xb7\x5b\x89\xc7\x03\xcf\x6a\xe6\x71\xa0\x4f\xb0\xce\x57\xe7"
+ "\x32\xd3\x53\x39\x24\x63\x48\x8a\x27\x7b\xea\x64\x4b\x9d\x7c\x21"
+ "\x04\x8b\x93\xe2\xf0\x3e\x0a\xf4\x9c\x99\x9b\x67\x89\xf3\xf9\x60"
+ "\x19\x07\x3e\x3e\x41\x36\xdd\x0d\x6e\xaf\x9f\xad\x3e\xcb\xa2\xc8"
+ "\x5e\x7b\x60\xe3\xf6\x29\x4d\xbe\xcf\x04\x7f\x13\x63\x67\xf1\xa0"
+ "\x3f\xe8\x0e\x80\x45\x8d\xdd\x0e\x9e\x76\x7b\xa2\xec\xf7\x79\x2e"
+ "\xfb\x2d\xdb\x4d\xed\x97\x38\x2e\xcd\x5c\x24\xda\xfe\xd9\xe6\x00"
+ "\xca\x57\x9d\x73\xa2\x83\xce\x39\x51\xf2\x4e\x7d\x23\x2b\xca\xe7"
+ "\x1d\x6e\x5f\x23\x78\xae\x8b\xc2\x77\x1d\x9d\xff\x53\x1f\xa9\x7f"
+ "\x54\xf7\x87\x17\xce\x0a\x5a\x2b\x80\x70\xf1\x22\x2d\x4f\x27\xf2"
+ "\x74\x36\xb2\x1e\xe7\x1c\xd1\xf7\x26\x9f\xcc\x6b\x13\xef\x94\x3f"
+ "\x0c\x0e\x5a\x9f\xfb\xe0\x80\xbe\x53\xff\xa8\xff\x01\x82\x09\x60"
+ "\xa0\xf5\xd5\xd2\xab\xf5\x93\xfa\xf8\x01\x76\x9d\x97\xd1\x4f\xf4"
+ "\x55\xf4\xb3\x17\xfd\x6c\xc8\x61\xcc\xbf\xe9\xbd\x9a\xcb\x71\x73"
+ "\xa2\x88\x47\x2d\xfe\x0b\x68\xf8\x42\x27\x03\x2f\x6a\x7c\xbd\xc8"
+ "\x69\x78\x01\xb4\x49\x91\x17\x3c\xa9\x97\x77\x90\x0e\xaf\xdb\x8e"
+ "\x5f\xa0\x9a\x11\x8d\xa3\xd3\xeb\xa8\xdb\xf2\xa1\x7a\x8a\x15\x75"
+ "\xf0\x0e\xd0\xa6\x7e\x77\x00\x69\x72\xd0\x7f\xf0\xb0\xa7\xb5\xf6"
+ "\x53\xda\xd5\xdf\xc8\x7e\x99\x16\xb1\xf8\x43\x3f\xaf\x30\xb8\x5b"
+ "\x2b\x98\xde\x97\x5f\x22\x1d\xfa\x63\x41\x59\x23\xa8\x3f\x2a\xfa"
+ "\xb9\x0d\xed\xf4\x87\xf5\xe9\x58\x27\xe9\x11\x7f\xcc\x86\xa7\x33"
+ "\xe5\xe5\x73\xe8\xc7\x39\x66\x71\x16\x81\xfe\x7a\x9c\xe8\xc5\x13"
+ "\xc7\xae\xcb\x60\x89\x1e\xf6\xdf\x2d\x72\xde\x09\x5b\xd0\x23\xcf"
+ "\xb0\xcf\x2e\xf6\xd9\x7b\x26\x1b\xfa\xb1\xdb\xa7\xd2\x3c\x12\x76"
+ "\x9f\x69\xcf\xe8\xc6\x9c\xa1\x73\xfa\x95\xa8\xa3\x3b\x69\x94\x68"
+ "\x4f\xd9\x64\xd2\x13\x8e\x46\x98\x7c\x47\xd1\x7d\x55\x05\xf9\xa6"
+ "\x70\xc0\x8c\xca\x07\x3d\x27\xea\x21\x18\x0e\xa8\x73\xbb\x97\x4d"
+ "\x41\x1d\xd3\x89\xff\xae\x2d\xf2\x1a\xfe\x6d\x2f\x4b\xbe\x36\x9c"
+ "\xf2\x79\xe2\x60\xf8\x9b\xe4\xb3\x54\x1e\xfa\x16\x77\x86\x7d\x31"
+ "\xac\xff\x1a\xb3\x0a\x5c\x26\xf1\xe0\xe7\xcd\x24\xff\xbc\xc6\x7a"
+ "\x05\x0d\x47\x3a\x16\xd7\x98\xaf\x45\x6f\x07\xde\x07\xbd\x6f\x71"
+ "\xed\x70\xf8\x22\x79\xb0\xb2\xd6\x6f\x11\x3a\x92\xc5\x95\x5b\x80"
+ "\x2f\x40\x2b\x1c\xb5\xd0\x59\x0a\xf6\xce\x5d\x3e\xb6\x6c\x3b\x23"
+ "\xff\x33\x23\xdc\x81\xd9\xec\x68\x75\x0a\xdb\x71\x81\x6c\xc6\x25"
+ "\xc5\xbd\x78\x01\x63\xa9\xe1\x10\xa2\x49\x49\x8e\xcc\x97\x25\x99"
+ "\x37\x6c\xd1\x69\xf8\x2f\x2e\x16\x5e\x64\x06\xeb\x12\xf1\xee\x9b"
+ "\x6e\xe5\x81\x2a\x83\x9a\x53\x4d\x76\xcc\xe3\x0e\x37\x93\x1d\x73"
+ "\xdd\x36\xb8\xa0\x7d\x1c\x58\x73\x5d\x96\xe1\xeb\xf3\x58\x32\xf9"
+ "\x33\x30\x79\x25\x2d\x27\xf7\x6b\x4f\x22\xda\x67\xd6\xec\x85\x9b"
+ "\xa5\xbd\xf0\xcf\x17\x91\xce\xb9\xf6\xfd\x89\x20\x78\x18\x51\x6e"
+ "\x1e\x4b\xac\xbe\xc0\x92\x88\x0e\xb2\x9d\x92\x34\x1b\xf1\x85\xb3"
+ "\x3b\x4d\x3c\xf8\xf7\x24\xb6\xfd\x4c\xc8\xdf\x81\x77\x19\xf9\x48"
+ "\xe0\x96\xc1\xf4\xa7\x37\x8c\x12\xfa\x04\xc2\xd6\x2e\x9d\x33\x20"
+ "\xcc\xaa\x36\x31\xe3\x51\xd2\x4d\xac\x91\xf7\xf0\x8e\x06\xa4\xbe"
+ "\x6f\x77\x99\xa7\x5e\xb7\x03\x3f\xe8\x79\xb9\x53\xf2\x3b\x6a\x24"
+ "\xf8\x2f\x6f\xb7\x4b\xda\x20\x3d\x19\xed\x5e\xab\x86\xf1\x38\x9e"
+ "\xb3\xf4\x8d\xe2\xc8\xae\x5b\xaa\x80\xe5\xc9\xc9\xc4\xf7\x68\x3c"
+ "\xe3\x21\x6b\x5f\x9c\xa4\x61\x84\xce\xb5\x45\x9e\xff\x61\x6f\x8a"
+ "\xe9\x2e\x3b\x99\xae\xef\x67\xb4\xaf\x4b\x5b\xaf\x27\xb3\x3c\x11"
+ "\x43\x73\xae\xd2\x3e\xb3\xa6\x23\x4e\x67\x37\xa9\x48\x5f\xa5\xef"
+ "\x6f\xe2\x0c\x77\xcd\xe8\x87\x97\xad\x62\x09\x3f\xb9\x31\x8a\xd1"
+ "\xf9\x1f\xd2\x76\xc8\x7d\xf7\xe4\x81\xd0\x19\x41\xaa\x80\x37\xd9"
+ "\x28\x10\x3c\x06\xd9\xfe\x94\x3e\x0d\x3a\x75\x1b\xa0\x72\xff\x3d"
+ "\x79\x3c\xac\x9e\x40\xdf\x3e\x8a\x3a\x48\x07\x9d\xca\x97\xb4\xc9"
+ "\xc9\x5a\x71\x97\x12\xe9\xe4\xfe\x7a\x72\x50\xbe\x8d\xec\x50\x11"
+ "\x7c\x55\x8d\x9f\x74\x77\x7e\x25\xe1\xeb\x60\x11\x93\xaa\x98\xe5"
+ "\x50\x91\xc7\x18\x23\x6d\x74\x9b\xda\x58\xdb\x6c\xfa\x4e\x73\xdd"
+ "\x35\x91\xe4\x81\x6d\xaf\xb9\x69\xdf\xee\xcd\x88\x7e\x8c\x78\x7d"
+ "\x41\x8b\xb7\x6d\x9d\x80\x7c\x88\x8b\x3b\x78\xce\x6f\xdc\x50\xc0"
+ "\x92\xa5\x2d\xd5\x36\x61\xa3\x8b\xee\xac\xdf\x1a\xcf\x2c\xb7\x56"
+ "\xb1\xa4\xee\xb2\x36\x17\xf8\x4b\xa9\x1f\x43\xf5\x6f\xfa\xcc\x4b"
+ "\xfe\x1c\xf6\xf5\x78\x86\xc8\xb1\xfa\xf2\x29\x84\x93\x42\xe1\xb6"
+ "\xcb\xda\xf9\x50\xb3\x87\x7d\x39\x77\xe7\x39\xa9\x4b\x2f\xe4\x4b"
+ "\xce\x23\xf6\x90\xfe\xc1\x97\x4f\xc9\xb6\x7c\xf9\xd4\x51\x3b\x23"
+ "\xd9\x79\xcb\x0e\x61\x9b\xfd\x4b\xd0\x47\x27\xed\x9a\x3c\xa6\x59"
+ "\xcc\x2b\xa2\x77\xcb\x89\x07\xfb\xca\xb5\x1e\xe9\x68\x9f\x00\x7d"
+ "\x94\x2a\x69\xf8\x23\x15\x2a\xe6\x4f\x58\xff\xdf\x27\x79\xe3\x80"
+ "\x38\xf1\x65\xc6\x44\x9e\x8d\x87\x5d\x42\x9f\x65\xe3\xe7\x33\xf1"
+ "\x8c\xe2\x1b\x8f\xda\xf1\x8c\xc6\x9c\x2b\xc1\xd3\x8c\xa7\x03\xcf"
+ "\x78\x7c\x4f\xa1\x79\x09\x1e\xd6\x42\x3e\x2a\xbb\x62\x0f\xd7\x0d"
+ "\x76\x2f\x8a\x60\xe3\x5e\xfb\x53\x26\x75\xf6\xda\x53\xc9\x3f\x61"
+ "\xda\x76\xc6\x96\x05\x78\x8f\xf5\x66\xf2\x31\xd2\x9e\x5a\xbc\x9d"
+ "\xce\xd2\xdb\xe3\xfb\x9f\xa5\xb7\x4f\xc6\x0f\xa1\xf6\x06\xfc\xfc"
+ "\xf8\xa5\x86\x7e\xa7\x26\x77\x97\xb5\xa7\x02\x8e\x82\xc6\xba\x36"
+ "\x9c\x48\xf9\x31\x0e\xc4\x17\xc5\xbe\x92\x29\xfb\x7b\xbc\x06\xe1"
+ "\x28\x1e\xfb\x99\x47\xeb\xaf\x13\x61\xb3\xb5\x18\xfb\x5a\x2c\x60"
+ "\x32\x1a\x7d\x8e\xfd\x7c\x26\xf5\x97\xda\xdb\x15\x7b\xd4\x1e\x7e"
+ "\x27\x8c\xca\xa4\xfe\x7b\x63\x91\x0f\xb0\xe4\x13\xe7\xf7\xc1\x53"
+ "\x83\x13\xdd\x97\x31\x74\xa1\x0c\x49\x07\x21\x3d\xca\xd0\xd3\xf7"
+ "\xc1\x7e\x34\xd9\x27\xc0\x98\x22\x1d\x78\xe2\x28\xfd\xbe\x59\x77"
+ "\xd9\xa9\xe4\xc3\x8b\x98\x66\xcf\xa3\x3d\xd5\x17\x96\x97\x6c\x2a"
+ "\x0c\x94\x1f\x75\x46\xc9\x3a\x8f\xda\x4f\xb3\xf6\x87\x64\xbd\xa7"
+ "\xac\x83\xad\xa5\xa2\x71\xa0\xef\x40\xf5\x4e\x92\x7c\xdf\x54\x77"
+ "\x82\x8f\xb9\xab\x55\xec\xf9\x47\x6a\x52\x8b\xb8\xeb\x34\x3b\x75"
+ "\xb2\xc9\xdf\x71\x8d\xfb\xe1\x29\x61\x2f\x84\xf7\x94\x30\x77\xe1"
+ "\xdd\xe2\x3c\xeb\x1c\xfb\x2a\xd6\xed\x15\x77\xce\xf1\x7e\x3a\x48"
+ "\xdf\xe9\x0c\x9d\xf6\x06\xf0\xd8\x7d\x7e\x32\x54\xa4\xdd\x41\xf1"
+ "\x88\x23\x9b\x24\x3b\xc3\xbe\xf1\x4d\x87\x1d\x72\x4d\x9d\x7e\x9f"
+ "\x68\x0b\xd1\xde\xc0\x0f\x5d\xd4\x66\xd5\x79\xd8\x41\x7d\x28\x06"
+ "\xff\x47\xbe\x41\x69\x4d\x58\x57\x90\xac\xf0\xf4\xab\x98\x77\x5c"
+ "\xdd\x78\xd8\x71\x6d\x7d\x38\x2d\xee\x4a\x16\x07\xf8\x39\x6f\xec"
+ "\x61\x07\xd1\x24\x1b\x8a\x86\x44\x4d\xab\xe6\xae\xae\xb8\x23\x35"
+ "\xdd\x65\xa7\x1b\x0e\x3b\xe4\xd8\x5c\x63\xb9\x0d\x7a\xdf\x77\x68"
+ "\x7d\x47\x9c\x38\xa3\x9a\xb4\x55\xfa\x0f\xf1\xb0\xaf\xd8\xa0\x32"
+ "\x2b\x8c\x33\xd1\x03\xd8\x1b\x2e\x4b\x58\x7c\x95\xde\xb7\x37\x5c"
+ "\x53\x3b\xbe\x1a\xd4\x96\x7f\x58\x1d\xbd\x5a\x1d\xfb\xff\xc5\x3a"
+ "\xf6\x5f\xad\x0e\x79\x7e\xde\x91\x7a\xed\xbc\x63\x87\xb0\xab\x03"
+ "\xfc\xe9\x94\x38\xf3\xeb\x37\x82\xe0\xdf\x02\xe6\xe3\xe4\xa7\xb1"
+ "\x98\x74\x65\xc9\x97\x4a\xc0\xf9\x4a\xe6\x31\x47\x0f\x73\xad\xf8"
+ "\x88\xb5\xb3\x0e\x61\xbf\xef\x58\x3e\xf1\x6c\x9f\x79\x7a\x37\x1d"
+ "\xf1\xf6\x1a\xbe\x72\x12\xbc\xb7\x63\x1c\xb6\x85\xcd\xb3\x26\xdf"
+ "\x47\xcc\x9d\x49\xf2\xd5\x66\x92\x6b\x7b\x78\xec\xf1\x1a\x15\xb8"
+ "\x01\x34\x7a\x50\xc0\x03\xf4\x8b\xe4\xb7\xde\xab\x10\xfc\x96\x57"
+ "\xd8\x4c\x1e\x21\x7c\xa4\x94\xed\xcd\x27\xd9\x77\xb0\x37\xc3\xda"
+ "\x5d\xc6\xd2\xc9\x77\x0a\xc9\x9d\xb9\xd9\x66\x4d\x0b\x44\x70\xc1"
+ "\x4f\x81\xf6\x27\xdf\x29\x6e\x9f\x87\x05\x41\x47\x57\x5f\x62\xf1"
+ "\xd5\xa0\x3d\x81\xb3\xcd\x84\xd7\x77\x6a\xfe\x53\xd6\x5f\x0a\xf9"
+ "\x4f\xd9\x41\xb2\x9e\x56\xbc\x5f\x62\xc6\xe0\xc6\xf7\x2a\xb6\x5d"
+ "\x62\x89\xdb\x57\xb0\xa4\x6d\x24\xcb\xfb\x5a\xd2\x3e\x42\xb7\x9d"
+ "\x7c\xa9\x2c\x4d\xa2\xb3\x84\x10\xed\x43\x36\x12\x42\x78\xcb\x28"
+ "\x64\x20\xd7\x04\xef\xaf\xc5\x3e\x18\x70\x1e\x76\x05\xcc\x9f\xcf"
+ "\xec\xdd\x74\xd4\x8e\x31\xa8\x05\xfc\x92\x07\x1a\x5b\x5d\x47\xa6"
+ "\x2a\xcc\xff\xcd\xe1\x44\x89\xdf\x51\x96\x6f\xb0\x39\x11\xdc\x96"
+ "\xc1\x26\x75\xb2\x14\x79\x6e\x3f\x0c\x7b\xe2\x99\x0c\xd2\x69\x2c"
+ "\x5a\xcc\x2c\xc1\x6d\x73\x95\xe2\x57\x58\x84\x3b\x90\xca\xe8\x57"
+ "\xf4\x0d\xef\x98\xb4\x88\xa5\xd0\xf9\x03\x9d\x95\x58\x9f\x17\xe9"
+ "\x6f\x4f\x2c\x64\x29\xe1\x65\x2f\x5e\x95\x97\x7b\x57\xca\x33\xd9"
+ "\xd6\x05\xb9\x79\x8b\x57\xce\xcb\xcb\x66\x33\xa5\x2a\x88\x30\x47"
+ "\xbf\x8a\xf4\x40\x56\xe6\xe6\xe7\x58\xe7\x2f\xcf\xcb\xcb\x5e\x92"
+ "\x6f\x9d\x3d\x2d\xfd\xdb\x36\x49\xb7\x59\x76\xd1\x59\x8f\xd4\x0b"
+ "\xec\x1c\xc6\xff\xfd\xce\x4b\x95\xe4\x5f\xab\x74\xc6\x1c\x53\x60"
+ "\xa6\x55\xfa\x39\xea\x9c\x4b\xba\xb8\xbc\x38\x63\xab\xa4\x53\x3b"
+ "\x9f\x92\xb4\x7d\x76\xab\xbc\x47\xd7\x29\xed\x00\x76\xcd\x4c\x90"
+ "\x6b\xea\xef\x0f\x44\xd8\x19\xbd\x2f\xa6\x77\x93\x9d\x55\xb8\x46"
+ "\xd3\x79\xf8\xdf\x85\x8d\x46\xbe\x6d\x96\xa2\xa7\xd3\xd3\x68\xdf"
+ "\x85\xdd\xe9\x1d\x64\x57\xb7\xec\x4c\x16\xe0\x13\xd7\x5d\xf6\xf7"
+ "\x39\x1e\xe3\xa3\x0e\x8d\x46\xe8\x90\x3a\x88\x9d\x73\xc9\x46\x27"
+ "\xff\xf7\x9b\x2e\x69\xe5\xac\x43\x7d\xd7\x21\x6d\x89\x87\x9d\x89"
+ "\xd2\x74\x15\xc7\xb6\x69\xed\x92\x3a\x15\x67\x56\x48\x9d\x8a\xbf"
+ "\xef\x0a\xbb\x0b\x2f\x6c\x4d\xd0\xde\xa8\xd1\xa4\xdd\x5a\x79\x0d"
+ "\x3a\x4e\x40\xfa\x16\xd0\x75\x5b\xaf\x1d\x17\xfe\x5d\xf2\x3f\xfd"
+ "\x6c\x2f\x75\xce\xe8\x6f\xd3\x44\x87\x9b\xe5\xb7\x52\x16\x2f\xe1"
+ "\x8a\x3e\x1c\x90\x70\x12\xf1\x09\x67\x10\xa6\x7c\x1e\xd6\x99\x70"
+ "\xe5\xfc\xea\x1b\xf1\x47\x96\xcc\x5f\xba\xd8\x3e\x2f\x3f\xf7\xe9"
+ "\xdc\x45\xb9\xf9\xab\xc4\x95\xfd\x64\xf1\xef\x07\xe3\xb3\xe6\x5c"
+ "\x69\x7f\x3e\x89\x64\x32\x9a\xdd\x6a\x1f\xe9\x40\x48\xb9\x58\xe7"
+ "\x37\x81\x32\xf6\xe0\xb5\xf5\xb3\x53\xb4\xb5\x5a\xd8\xf1\x38\xcb"
+ "\x3c\x11\x91\x0e\xed\x7c\xa4\x53\x1b\x2b\xf1\xbd\xcb\xfc\x79\x8a"
+ "\x75\x34\x9b\xda\xc6\xbc\xfb\xe9\x5c\x0c\xf0\x2e\xa1\xfd\x73\x7d"
+ "\x01\xed\x73\xcd\xec\x58\x00\x7b\xa9\x38\x2b\x3f\x37\x82\x60\x46"
+ "\x34\x24\x60\xb4\xab\x8d\x9d\x5d\x2e\x60\x71\xde\xb2\x4b\xd8\xe6"
+ "\x38\x6f\xf9\x2d\xcd\x45\x6a\xb3\xca\x33\xb6\x71\x9e\xf1\xb2\x7a"
+ "\x3e\x67\x1b\x3f\x9f\xf3\x72\xc8\xf6\xe5\x59\x0f\xf2\xee\x41\xde"
+ "\x53\xe4\xdb\xaa\xf2\x1c\xdb\x43\x78\x92\xc2\xa6\x7c\x33\x78\xc3"
+ "\x23\x0e\x6a\x8f\xdb\x9b\xc2\xe4\x7d\xfd\xb3\x1e\xb7\xef\x6e\x06"
+ "\xda\x53\xe8\x47\xc8\xf3\x3d\xd0\x87\xc8\xe7\x46\xbb\xdc\xde\x1e"
+ "\xe2\xa1\x1d\x2a\x68\x44\x0f\x3b\x6b\xc6\x7e\x5b\x47\xe5\x52\x9f"
+ "\xb7\x63\x4e\x92\x9e\x06\xfa\x0e\x3a\xe6\x4c\xb5\x76\x37\xb8\x7d"
+ "\x3d\xe2\x09\x06\xfd\xc7\xff\xdc\x38\x1a\x47\xc0\xf8\x7b\xa1\x39"
+ "\x70\x4e\xd8\x88\x9a\xd5\xce\xbf\xe0\xce\xd9\x29\x72\xbc\xcf\x3d"
+ "\xa2\xc5\x9d\x0f\xd9\x0b\x38\xf7\x14\xc2\xbd\xf8\xa9\xdc\xf9\x58"
+ "\x7a\xd8\xd9\x34\x7d\x13\x36\xbd\x48\xef\xc4\x5e\xc0\x6e\x46\xfe"
+ "\x8d\x72\xee\x3d\x96\xe6\x2d\xce\x89\x40\x9e\x20\xdd\x6f\xd5\xe0"
+ "\xfb\x86\x7b\xed\x39\x5d\xd7\x03\x6d\x3a\xff\x63\xd7\x82\x00\x13"
+ "\xfe\xeb\xdb\x03\x42\x1f\x52\xb3\x11\xa1\xa8\x65\x9d\xa4\xaf\x46"
+ "\xf6\xd5\xa2\xb7\xc7\x49\xdf\x0f\xdd\x65\xe7\xda\xfb\x74\x92\xcc"
+ "\x92\x66\x24\xba\x8d\x7c\xfa\xd1\xfa\x21\x1a\x90\xda\x44\xeb\x07"
+ "\x65\x9b\xe9\x9c\x5b\xae\xa3\xf3\x09\xff\xda\x3a\x3a\x2f\xe6\x3c"
+ "\xda\x5d\xcb\x0d\xc5\x7c\xd2\x3a\x96\x29\xf4\x10\x02\x3e\xba\x97"
+ "\x6c\xc4\xde\x13\x2f\x71\x92\x77\xbd\xd0\x55\x59\xd1\x49\xfb\x64"
+ "\xc9\xce\x1e\x16\xad\x3a\x6d\x16\xa2\xd5\x8f\x15\x0a\xfd\x8d\x28"
+ "\xe4\xab\x25\xfd\x0e\xd2\x31\x8c\x11\x3e\x23\x3f\x62\x3b\x2f\x32"
+ "\x63\x3b\x3b\x5f\x4d\xe7\x49\x21\x58\x9f\xff\x86\xce\x0f\xf9\xa6"
+ "\x47\x1b\x4c\x85\x86\x0a\x2a\x43\xbd\x74\x76\x8a\x9e\x8f\x7c\x93"
+ "\x53\xbe\x36\x76\xfe\x63\x91\x8f\xd2\x0a\x5b\x22\xe6\xb9\xa0\xd5"
+ "\x5c\x94\x3e\x80\xf0\x0e\xd5\x0c\x7e\xe6\xf3\x99\xc1\x15\x81\x5a"
+ "\x7c\x9b\xa3\x3a\x8f\xda\x11\x97\x21\xce\x31\x7a\x2d\x74\xbe\x89"
+ "\x39\xb7\x3d\xdd\xed\xf9\xca\x25\xda\x43\x77\x95\xf3\xb1\xff\x0a"
+ "\xde\xc6\x7b\xfb\x8e\xaf\x99\xd1\xbe\x80\xc6\xd3\x2b\x6d\x00\x9f"
+ "\x63\x9a\x9d\x2f\xef\xdb\x5d\x9b\xe6\x44\x75\x61\xbe\xfa\x0c\x51"
+ "\xec\xa8\x85\x74\xec\x3f\x4f\x39\x6a\xe9\xc1\xf8\x78\xd7\x02\x5f"
+ "\x6a\x3e\xaa\xbc\x7d\x6b\x93\xe6\x68\x84\xc5\x5c\x8c\xef\xbb\x74"
+ "\x9d\x26\x9a\xa7\xeb\x84\x8d\xf7\xf3\x85\x04\x37\xcc\xed\xc9\xc7"
+ "\x16\x85\x6c\x2c\x77\xc9\x7b\x7d\x66\xe4\xe9\xbb\xff\x1b\xbc\xa4"
+ "\x36\xa2\x1d\x64\x8b\xc6\x11\x5c\xa1\x9e\xa0\xf3\xf7\xc7\x2e\xaa"
+ "\x9c\xee\x3c\xd0\xfd\x15\xe2\x9d\xd2\x1c\xbc\x8b\x78\x41\xba\x2b"
+ "\x46\x67\xef\x74\x97\x3e\xb4\x4e\xbe\x49\xd4\xef\xd4\xd3\x1a\xa1"
+ "\x36\xd0\x7d\xb0\xca\x85\x62\x9d\x92\x0e\x6c\xb4\x38\x7f\x88\x78"
+ "\xf6\xeb\xc7\x7c\x28\xf3\x9c\x38\x37\xeb\xda\xa1\x95\x43\x36\xb3"
+ "\x50\x46\x8e\x5e\x86\x4a\xfa\xc3\x79\x42\x7f\xcf\x23\xf3\x4b\x5d"
+ "\xa3\xc7\x7c\xaa\xb8\xc7\x43\xf9\xa5\x0e\xd0\x37\xd5\x7d\x3a\xa8"
+ "\xe2\x6e\xcd\x37\x7b\x74\x1d\x33\xbc\xf7\xdd\xff\x22\x98\x76\x39"
+ "\x8f\x38\x7c\xc0\x0f\x3e\xe7\xe1\x3a\x7c\x03\xfe\xff\xba\xf9\xaa"
+ "\xf2\x10\xb2\xa3\xb0\x9c\x19\xd4\x38\xdb\x74\xb2\x91\x41\xda\xf6"
+ "\x52\xef\xfd\xc2\xbd\x9a\xbd\x8c\x88\x73\xec\x9b\x6f\x42\xe7\xf0"
+ "\x41\x4d\x86\x7c\x61\xae\xe4\x61\x2e\xcc\x15\x32\xe4\x4d\x47\x32"
+ "\xff\xa3\xc0\x6f\xa8\x2d\xf0\x18\xa4\x3e\xde\x85\x74\x0f\xeb\x59"
+ "\x1b\xd2\x05\xbd\x60\xa6\xb2\x06\xa6\x39\xb3\x53\x64\x99\x5d\xc2"
+ "\x7e\x48\x48\x26\xd0\x25\xee\x3f\xd1\x99\xb9\x4a\xf4\x63\xdc\x2b"
+ "\x76\xd2\x91\x72\xdb\x2f\x90\x2c\x39\x52\xca\x27\x64\x1a\x4d\xcf"
+ "\xf3\xfa\x33\xfd\xc3\x71\x14\x96\x30\xbb\xe0\xd1\xcf\xa5\x2a\x0d"
+ "\x2a\xf9\x1f\xe4\xc5\x35\xc0\x97\x76\x9f\xb0\xd3\xe0\x06\x3d\x8a"
+ "\x3a\xb8\x3d\x8f\xee\x52\x76\x8d\x24\xfb\x0d\x72\x6d\x76\xfd\x4a"
+ "\xb4\xa9\xec\x41\x5e\x4c\x3c\x99\x97\x7c\x1d\x5d\x60\x48\x17\x8b"
+ "\x74\x0f\xd5\x17\x76\x92\x8e\x59\x34\xf9\xb1\x6d\xd7\xea\xf6\xc6"
+ "\x66\xa7\xdc\x1a\xcd\x32\xbb\xcb\xba\xe6\x78\x58\x7d\xf5\xb5\xe3"
+ "\x8d\xae\x39\x57\xa3\xcf\x25\xbd\x98\xca\x06\xe3\xf1\x49\x86\x33"
+ "\x11\xf5\xcf\xe6\xd4\x7e\xdf\x43\x01\x83\x9f\xf5\x1a\x86\xf2\x3b"
+ "\x4b\x1c\x2c\x50\x36\x94\x07\x0b\x30\x5e\x5d\x16\xf0\x80\x8d\xac"
+ "\x49\xea\xdd\x90\xee\x80\xa9\xc8\xc7\x2f\xb8\x03\xfb\xe9\x0c\xc1"
+ "\x8b\xb1\x02\xde\xf2\xdd\xe7\x0e\xbc\xcd\x48\xbf\x9b\xf0\x4d\x1b"
+ "\xf3\x8d\xa7\x76\x4d\xb4\x97\xb0\x09\xe7\xe8\x7b\x57\xbb\xdc\xf3"
+ "\x7d\xa9\xda\xd3\x4c\xf6\x81\xc3\xdb\xf4\x83\xe5\x4b\xe6\x93\x91"
+ "\xe9\x09\xb3\xb2\x57\x64\x2f\xb2\x3e\x4e\x26\xa8\xaf\xd4\x1b\x0d"
+ "\xf9\x39\xbc\x18\x4d\xfb\x2b\xd1\xef\xe4\xef\xf0\x6a\xbe\x0e\x75"
+ "\x3f\x87\x58\x73\x89\x24\xf3\xfe\xdf\xf4\x75\xa8\xd3\xe7\xe4\xe7"
+ "\x30\x74\xfe\x73\xb1\xb1\x6f\x0d\xa8\x87\xba\x29\x2c\xf6\xf4\x32"
+ "\xdf\x2c\x5a\x47\x72\x7f\xb9\x38\x3d\xdc\x56\x91\xa4\xcf\xb6\xa7"
+ "\x23\x7e\xae\x7e\xe7\x15\x73\x31\x1a\xe1\x45\xa1\x3b\x36\x17\x1d"
+ "\x18\xef\x3a\xb9\x7e\x45\xda\x0a\x5d\x4f\x42\xf3\x69\x2f\xf4\x3a"
+ "\xd4\xf2\x7b\x0b\xa5\x6c\xf2\xe2\xfa\x1d\xea\xd0\x28\x79\x2e\x76"
+ "\x71\xbf\x7e\x87\x4b\xae\xcd\x43\xda\xda\xbc\xd8\x78\x35\x5d\x96"
+ "\xd0\xda\xb8\x14\x15\x5a\xd7\x5f\x68\x79\x2f\x45\xfd\x23\x3d\x18"
+ "\x8d\x47\x1c\x79\x86\xf9\xc7\x90\xbc\x52\xde\xd9\xf6\x0b\xfb\x42"
+ "\xd2\x1e\x47\xf7\x49\xed\x1d\x75\x74\xbf\xaf\xbd\xdf\x84\xf7\x37"
+ "\xb4\x77\xd0\x8b\xdd\x2f\x69\xef\x58\xb3\xdd\xa5\xda\x7b\x3c\xde"
+ "\x73\xb5\x77\xec\x1d\xdd\x3f\xd6\xde\x47\xe1\xfd\x3e\xed\xfd\x46"
+ "\xbc\x8f\xd3\xde\xb1\x06\xbb\xc5\x99\x01\xda\x1e\x85\xb6\x5f\xbc"
+ "\x76\x9e\xf5\x92\x4b\x9e\x5b\x77\x33\xd0\x83\x55\x72\xef\xe9\x8b"
+ "\x8b\xc7\x9c\xce\xd2\xe1\x8b\xf8\x3a\xaa\x07\xf1\xc9\x1e\xe6\x69"
+ "\x0e\x8b\xd7\xec\xb7\x75\x4f\xf7\xb0\x6f\x3c\x61\xf1\xd5\x5a\xfc"
+ "\x5c\xf0\xdc\xbe\xb0\x78\xa7\x16\x9f\x0f\xbc\x98\x13\x16\xbf\x56"
+ "\x8b\x5f\xe7\x61\xff\x6d\x0c\x8b\x77\x68\xf1\xbb\x74\x1d\x1e\x2d"
+ "\x7e\x91\x16\x7f\xc0\xc3\x3e\xda\x1f\x16\x9f\xa9\xc5\x03\xff\x5f"
+ "\x6c\x0d\x8b\x17\x78\x45\xda\x64\x37\xf1\xa3\x85\xb4\xb6\xba\xfd"
+ "\x1e\xd6\xba\x2b\x2c\xcd\x4c\x99\xd7\x6f\xf6\xb0\xbf\x35\x86\xc5"
+ "\x4f\xd5\xe2\x93\x3c\xca\x77\xc2\xcb\x4c\x19\x0c\x57\x29\x5b\x59"
+ "\xe6\x60\x72\x7d\xe2\x81\x84\x2e\xb3\xa0\xb3\x2f\x67\xd3\x9d\x30"
+ "\xd3\x76\xde\x66\x2d\xe2\xbc\x8d\x5d\x9e\xa5\xe9\xee\x92\x9d\xe3"
+ "\x4e\x79\xbf\xee\xf2\x64\xcd\xb6\x82\x57\xdc\xb9\x2b\xa0\x38\xff"
+ "\x5b\x42\x3e\xe3\x28\x91\xf6\xc2\x75\xdf\x33\x24\xdf\xd2\xce\xfe"
+ "\x91\x86\x6c\xc5\x92\x2e\x78\x27\xc9\xc0\xdd\xf9\x3d\xd2\x96\x3c"
+ "\xf8\x60\x8a\x23\x39\x0f\xc1\x23\x5c\x9e\x25\xf1\xfe\xe5\x6c\xb5"
+ "\x87\xee\xb5\x4a\x59\x18\xad\x45\x4a\x4f\xfa\x6a\xe1\x69\x3d\xec"
+ "\xb2\xb0\x4b\x11\x61\x89\xfd\xa4\xbb\xec\xf2\xf4\xd0\x7d\x22\x7f"
+ "\xb5\x16\xff\x31\xe2\xe7\x86\xc5\x57\x0c\x8e\xdb\x81\xef\xcc\xb3"
+ "\xcc\xbd\x97\xb8\x2f\x70\x89\xfb\x2b\x3f\x47\xbb\x17\x08\x1d\xc1"
+ "\x9b\x83\xce\x59\x56\xba\x6f\x43\x3e\x62\x03\x2b\xb8\x97\x74\x22"
+ "\x11\x7f\xdd\x63\x3e\x2f\x68\x8c\x6e\xbe\xfe\x69\xd2\x7f\xbd\xc8"
+ "\xe8\x6c\xb6\xb8\x93\xfc\x0d\x9a\x38\xdd\xe3\x5e\x7d\x96\x45\xd3"
+ "\x7d\x9c\x1d\x0b\xe8\xfb\x67\x6c\x76\x8e\x97\x1d\xcb\x09\xb2\x1d"
+ "\x28\x7b\xfb\xd3\x3a\x7d\x71\x39\x10\xba\x2b\xfc\x28\x9d\x65\xdf"
+ "\x5c\x2c\x7c\x62\xf7\x08\x5b\xe5\xa6\x52\xd2\x29\xf8\x3c\x83\x1f"
+ "\x21\xda\xf8\x70\x89\xa9\x94\x59\xb1\xb7\x4f\xc1\xbb\x5d\xfe\xf0"
+ "\x0d\xf1\x83\xf5\x49\xae\xe5\x9e\x7c\x89\x6b\x66\x39\x25\xbe\xe8"
+ "\xc9\xe7\xbf\xa1\xfb\x27\x3d\x0e\xe0\x9b\x0c\xd0\xe1\x19\x03\xe5"
+ "\x5f\xbd\x9d\x19\x7a\x37\x81\x36\x39\x57\x67\x90\xf8\xa9\x37\x4b"
+ "\x35\x44\x95\x92\xac\x5d\xf8\xc3\xdd\x64\x9b\xb3\x67\x89\xdf\x70"
+ "\xac\xa0\x9d\x3d\x7f\x23\xb3\xcc\xf5\x1b\x90\xa6\xe7\x54\x4c\x3e"
+ "\xd9\x34\x3f\x92\x09\x7a\xd6\xf0\x7b\x7c\x3f\xb8\xa4\xce\x10\x10"
+ "\xf4\x4a\x6f\x96\x90\xcf\x3a\x6d\x49\xb4\x87\xb8\x5b\x83\x44\x8b"
+ "\x47\x83\x16\xb7\x00\xff\x47\x05\x57\xe6\xc4\x05\x96\xe5\x5c\xb7"
+ "\x3d\x8f\x45\x07\x97\x25\xc5\xbf\x78\x89\x4d\xd1\xf7\x9f\xed\x2b"
+ "\xb0\xa7\x74\x5b\x86\x6f\xc0\x9e\x42\x72\x9f\x18\xc5\x2c\xce\xa1"
+ "\xe9\x5d\x35\x7c\x6e\xde\xb1\xe2\xea\xbe\xbd\x83\x2b\x93\x84\xbd"
+ "\x09\x6a\xcb\x40\x7d\x5d\xf7\x32\x33\x06\xb5\x7b\xa9\x45\xa7\xd8"
+ "\x28\xd0\xcf\x86\x98\x8b\xdc\x75\x66\x11\x33\x90\x3f\xe4\xa2\x6c"
+ "\x21\x5b\x1d\x72\x2c\x27\xc0\xdc\x8e\x4f\x59\x51\x1e\x8d\x51\xef"
+ "\x5b\x44\xa7\x91\x3e\x33\xd2\x9b\xcf\xb0\xde\xf7\x4d\x7e\xec\x19"
+ "\x7e\xd0\xe4\x0b\x89\x2f\xee\xfd\x4c\xda\xb7\x08\x58\xe9\x1e\xa9"
+ "\x2b\xef\x61\x8a\xbb\x5c\x7c\x4a\xe8\x0d\x45\xcb\xb5\xd5\xdb\x42"
+ "\xe1\x62\xba\x27\x1b\x97\x35\x67\x6f\x8f\x7f\x88\x94\xdf\xf5\x7e"
+ "\xac\xed\x0f\xe9\x92\xb7\xeb\x6d\x19\x6c\xee\xaa\xce\xf4\x14\x4e"
+ "\xbe\x20\xab\x89\x7e\xe5\x1e\x71\xc6\x4f\x36\x03\x1c\x0f\xba\x38"
+ "\xd0\x9d\xb4\x65\x14\x78\x49\xdd\x98\x9e\x22\x6d\x48\x06\xe4\xdd"
+ "\x7c\x21\xef\x4f\x4f\x95\xe7\x1b\xe9\xe9\x52\xde\x9f\x9e\xb9\x66"
+ "\x34\xdd\x27\x08\x6c\xed\x8a\x4d\xb7\xe3\xb9\xa8\x2b\x2e\xd7\x39"
+ "\xf8\x7e\x34\x3b\xd3\x7a\x33\x8b\xa7\x73\x26\x5b\x50\xda\x62\x95"
+ "\x6b\x38\x58\xcd\x37\x8a\x6f\x63\xdb\xec\x2c\x42\xda\x3b\x0e\x7c"
+ "\x3d\xa9\x9a\x59\xd1\xd6\x11\xdc\x9c\x6e\x16\x7a\x8f\xce\x74\xab"
+ "\xbb\x93\xfc\x54\x05\x99\x3c\x0f\x0c\xee\xe6\xb1\xe9\x66\x99\x3e"
+ "\x78\x5f\x53\x27\xfa\x60\x4e\xf3\xb8\xfd\x67\x35\x9a\x30\x88\xb9"
+ "\x9f\xe6\xe1\xce\x34\xaf\xbc\x6f\x1e\xfc\x95\x8e\x57\xe5\x1c\x0d"
+ "\xae\x96\x70\x9b\x9d\x29\xe1\x16\xdc\xad\xed\x57\x63\xe9\x1d\x7b"
+ "\x77\x8a\xd4\x5f\x09\xe6\xeb\x34\xb2\x47\x4b\x43\x79\xf0\xae\xd9"
+ "\xf9\x0c\x56\xa1\xef\xc9\xda\xf7\x29\x14\x87\xfe\x61\xcf\x0a\x34"
+ "\x53\xbf\x06\xc3\xad\x02\x16\x85\x2c\x02\xfd\x23\x9a\x96\xee\x08"
+ "\xf8\xdc\xbe\x07\x5d\x6e\x31\x06\xfc\x2e\xd2\xed\xa7\x7a\xc8\xde"
+ "\x10\xe1\x4d\x94\x69\xa4\xf2\x42\xed\x57\x47\xea\x6d\xa1\xfa\xe8"
+ "\x1b\xfa\xea\x11\x7c\x35\xfa\x4c\x69\x68\x5c\x4f\xdb\x49\xee\x77"
+ "\x11\x30\x23\x1d\x3a\x9e\x4a\x30\x91\x30\xe3\x09\x1a\x4f\xaf\x8d"
+ "\x03\x8f\xed\x0f\x0f\x19\x56\xcd\xc0\x0d\x79\xa4\x4b\xc5\x53\x35"
+ "\xf8\x69\x3e\x56\x54\x61\x8b\x56\x7e\x53\x5f\x0d\xcb\x3b\xa6\x2f"
+ "\x2d\xda\x4d\xb4\x11\xe9\x25\xd0\x39\x95\x9c\xaf\x6a\x73\x58\xbe"
+ "\x66\xdb\x37\x44\x23\x3f\xea\x59\xb3\x45\xf8\xac\x4c\xe9\x2e\x53"
+ "\xdb\x43\xf0\x96\xe5\x0c\x50\xc7\xcd\x7a\x1d\x1e\xa6\xee\xd2\xdb"
+ "\x89\x77\x6d\x0f\xe6\x49\xa1\x31\x51\x67\xea\xf9\x48\xa6\x83\x31"
+ "\xf2\x91\xff\xd8\x41\xfc\x62\x28\x6e\x40\xa5\x29\xf0\xa0\x4b\xcc"
+ "\x47\xc6\x6b\x48\x76\xc9\x9d\xe9\x9a\x7d\x08\xbe\x56\xee\x85\xbc"
+ "\x86\xca\xa4\xb3\x46\x69\x6f\x94\x6f\x45\xb9\xda\x9d\x25\xbe\x47"
+ "\x6b\x03\xf8\xbf\xc0\xb7\xec\x85\x3f\x3c\x2f\xcb\x9a\x7e\x97\xb8"
+ "\x73\x3b\x61\xb9\x9d\xae\xd3\x66\x85\x02\xfd\x69\x6e\x73\xc8\xc6"
+ "\x19\xf9\xa2\xd6\x6c\x9c\x39\xb3\xe7\x08\xf8\x2b\x6c\x3a\xbf\xc4"
+ "\xab\xe8\xee\x08\x5f\xc1\xb7\x56\x62\x0c\x8b\x2f\xb2\x1b\xc8\x2f"
+ "\x76\x91\x9d\x7f\x45\xf6\xef\x80\x2f\xf3\x81\x3f\x1c\x45\x17\xd9"
+ "\x50\xd2\x4b\x22\xfc\x43\x7a\xcf\x3c\x16\xf1\x1b\x6d\x8e\xbe\x7b"
+ "\x78\x8a\x71\x2a\xdd\x1d\xe5\xc5\x19\xa0\xa5\x6d\xeb\x68\x3e\x90"
+ "\x8e\xfa\x69\xc5\x98\x80\x74\xeb\xf0\x2d\x7f\xbd\x90\x25\xd8\x9a"
+ "\x83\xe6\xec\xe4\xe2\xb3\x2c\x52\xf8\x38\x74\xf8\x49\xa6\x66\x68"
+ "\x53\xd8\xab\x28\xb3\x19\xf1\x31\x22\xde\xef\x27\x5b\x0b\xcd\xf8"
+ "\x16\x83\x6f\x27\xf1\x54\x51\x86\xa3\x12\xed\x2e\x3a\xcb\x6e\x46"
+ "\x5b\x3a\x50\x4f\x33\xda\x79\xba\x78\x31\x1b\xd5\x64\xef\x20\xfe"
+ "\x0e\xe5\x79\x98\x66\x8f\xa4\xb9\x4d\x51\xee\x45\xbf\x1c\x24\x13"
+ "\xc1\xb3\x70\x3d\x9e\x45\x41\x16\x53\xb4\x1a\xfb\xde\x6a\xd4\x4f"
+ "\xf7\x5a\x51\x0e\xd9\x20\x91\x6d\x41\xdf\x48\xae\x86\x72\x57\x77"
+ "\xf2\xd3\x28\xbb\xe3\x58\x27\xca\x73\xb4\xf6\x95\xa9\xd1\xd4\x63"
+ "\xd1\xdf\x91\x7c\x53\xee\x6e\xb4\x69\x2b\xe9\x6e\x23\xce\x8c\x38"
+ "\x73\x1f\x3d\xac\x18\x63\xb5\xf7\x61\x7d\x69\x8b\x33\x58\xd1\x65"
+ "\x26\x74\xa8\xad\x2b\x23\x58\x9b\x12\x51\x43\x76\xb0\x42\x65\x1a"
+ "\xc6\x50\x79\xeb\x50\x5e\x71\x36\x1b\x06\x5c\x1d\x85\x36\x92\x8f"
+ "\xe8\x93\x02\x4e\xb4\xc6\x14\x43\x02\xfa\xe2\xa4\x3e\xa9\x18\xbb"
+ "\xf5\x58\x0f\xe8\x8f\x82\xfe\x0c\x5b\x1d\xec\xbb\xab\x4b\x7d\x8a"
+ "\x25\x7e\x8e\xfa\xa5\x8d\x23\x70\x81\xcd\xb7\x3a\x87\x9f\x44\xdf"
+ "\x3a\x8e\xe5\xb4\x32\xec\x3d\xa6\x26\x7b\x33\xdd\xa1\x38\x29\xe1"
+ "\xd6\x41\xe3\xda\x89\x7e\xfa\xfa\x6c\xf5\x2a\x11\x2f\xa1\xed\xb5"
+ "\x68\xd7\x3a\xad\x9f\x14\x57\xd5\x47\xd3\x2b\x11\x9b\xb5\xf7\xe1"
+ "\x7d\x69\xbf\xdd\xcf\xa8\xb0\x7e\x22\xbf\xf1\x01\x2a\x4f\xeb\xe7"
+ "\x70\xf4\x73\xd8\xb7\xfb\x89\xf9\xb4\x82\xaf\xd5\xfa\x59\xa1\xf5"
+ "\xd3\x80\x7e\x0e\x47\x3f\x47\x87\xf5\x33\xee\x8a\x7e\x92\x5f\x78"
+ "\x3f\xfa\xd9\x16\xd6\x4f\xf3\x00\xfd\xf4\x7a\xa8\x8e\x8d\x36\xbf"
+ "\xb4\x0f\xc6\xeb\xc4\xfd\xf7\xf2\x88\xbe\xfb\xef\x2a\xdd\xbb\xbc"
+ "\x24\x6c\x10\xed\x27\xf9\x0d\xc9\x8d\x88\xd7\xa3\x3b\x9e\xb6\x55"
+ "\x15\x25\x42\x76\x33\x4a\xca\xa6\x05\x7d\x55\x1e\x31\xb7\xef\xee"
+ "\xc6\x16\xe1\xbb\xc6\x47\xf1\xc2\x66\x40\x1e\x13\xb2\xc7\xb4\x55"
+ "\x2b\x8b\x29\x3f\xe5\x45\xfa\x75\x7d\x77\xcc\x14\x83\x5d\xca\x43"
+ "\x73\x6b\xe9\x9d\x6c\x61\xc9\x33\x01\xde\x20\xce\x04\xca\x23\x42"
+ "\xfe\x9f\x56\xf0\x7a\x82\x8b\xb8\xcf\x2a\xee\x83\xb2\x0a\x5b\xa0"
+ "\x42\xbf\x97\xde\x89\xb4\xed\x61\xf7\xd2\x3b\x45\x1b\x7a\x84\xed"
+ "\x87\x95\x69\x81\x95\xe2\x7e\x7a\x77\xb9\x31\x2a\x54\xb7\x52\xa1"
+ "\xd5\xbd\x9b\xde\xbd\xd2\x36\x1b\xc9\xd8\xac\x42\xdf\xa6\xdc\x38"
+ "\x59\xd7\x71\xf1\x28\xcc\x4e\x6b\x79\x40\x3f\x2f\xe5\xc6\xb9\xfd"
+ "\x6c\x41\x29\x43\xc8\x1e\x0c\xc5\xe7\xf7\xdd\x35\x2f\x37\x96\xfc"
+ "\xa3\xbb\xe6\xc5\x5e\x8c\x13\xd6\x9b\x9d\x7c\x9e\x2b\x46\xf0\xb8"
+ "\xd9\xc9\xc2\x57\x8a\x32\x64\x0c\xb5\xb3\x4d\x31\xd2\xfe\x61\x12"
+ "\xe7\x41\x8a\xf1\x33\x0d\x37\x97\xa4\x05\x03\x26\x0f\xea\x14\xb6"
+ "\xa5\xfa\xc2\xc6\x16\xb2\x95\x81\xbc\x23\x84\x9d\x73\x94\xd7\x3f"
+ "\xbd\xf8\x7e\x65\xfa\xd4\x2b\xc2\x56\x1f\x70\xd6\x60\xba\x3c\xeb"
+ "\x47\x0b\x19\x6f\x52\x4c\x29\xb3\x17\x7f\xcd\x22\x30\x17\x4f\x51"
+ "\xdb\x9a\x3a\xc4\x3d\x3f\x13\x2f\x4b\x61\xee\x8e\x80\xa4\xdb\x41"
+ "\x2f\xb5\x25\x22\xcd\xd7\x6c\x14\xdd\x33\x21\x5f\x32\x48\x7f\x46"
+ "\xf8\x8f\x51\x22\xdf\x9c\xbb\x7c\x38\x53\x9f\xc9\xb8\x8e\x1b\x0a"
+ "\x6a\x49\x97\xe0\xf5\x1e\x0f\xf9\x60\x51\x8a\x5e\x62\x09\x84\xa7"
+ "\x30\x87\xdb\xb9\xe1\xf9\x5a\xe4\xe9\xfc\x8f\x9e\x8e\x21\xee\xc0"
+ "\xa7\xcc\x0e\xfc\x79\x46\x89\xdc\x6d\x2c\x64\xc6\x0d\xa7\x99\x19"
+ "\xf3\x2c\x70\x34\x30\x85\xe9\xb6\x1e\xaa\xe3\xa4\x0d\x81\x6a\xcc"
+ "\xc9\x65\x16\xee\xef\x2e\x8f\x34\x82\xaf\x2d\xd1\xe5\x17\xeb\xa4"
+ "\xad\x37\x23\xea\x7f\x4e\xd8\xa5\x90\xf4\x01\x60\x1b\xf9\x90\xbc"
+ "\x67\x1a\xff\x0c\xf2\x4c\xe9\xe3\x6d\x94\xc8\x7a\xed\x6c\x2d\x5d"
+ "\xee\x23\x91\xf5\x47\xc1\x1d\xad\x95\x3a\x51\xf1\x48\x9b\xd5\xa7"
+ "\x13\x45\x32\x41\x7c\xc7\x18\xa6\x4b\xbe\x27\x3b\xdd\x16\x8c\xd2"
+ "\xd6\x38\xc5\x3f\xea\xa1\xbc\xc8\x67\x12\x7e\x2e\xcb\x23\x6b\x42"
+ "\x73\x2d\x32\x87\xf6\x53\xf4\x29\x1a\xe3\x7a\x82\xfa\x45\x30\xf1"
+ "\x91\x5d\x37\x65\x88\xe7\xe8\xae\x41\xfc\x20\x99\x67\x39\x03\x42"
+ "\xbe\x74\x24\x03\xf3\xe9\x2c\xc6\xe0\x7a\xb2\x6d\xe5\x46\x3d\xc7"
+ "\x76\xf4\xb0\x63\x96\x2e\xd6\x84\x77\xba\xfb\xe0\x5a\xf8\x25\x6b"
+ "\xb7\x0e\xbc\x97\xab\xe0\xd1\xc0\xc7\x58\xa9\x2c\xc2\x35\xa4\x2f"
+ "\x4a\x36\x08\x9b\xbc\x28\xab\x9d\x89\x32\x8e\xa9\x1d\xec\x98\x83"
+ "\x78\xd8\xcf\x33\x9a\x76\x7c\xca\x9a\x2c\x7f\x15\xf5\x10\xbd\xed"
+ "\xca\xeb\xba\x5a\xd9\x29\x28\x3b\x55\x2b\xbb\x13\x65\xc7\x0f\x5e"
+ "\xf6\xe1\x92\x6b\x2c\xfb\x1a\xda\x7d\xd8\x7e\x2d\x65\x17\x6f\xe5"
+ "\x41\xe0\xe1\x11\xc0\xb1\x16\xb2\xcf\x4a\x77\x5c\x83\x97\xc8\x26"
+ "\xcd\x58\xc1\xab\x9f\x56\xa2\xb6\x13\xbe\x11\xfa\x21\x1b\x6d\xf1"
+ "\xe2\xfe\x2b\xc9\xd9\xb5\x7b\xaf\xee\xc0\x29\x46\x72\xf7\xee\xf2"
+ "\xa8\x8a\x10\x2f\xda\x77\x36\x6e\xf6\x28\x51\x7b\xa4\xae\xb5\x2d"
+ "\x5e\xce\xad\xa8\x79\x54\xd6\xc0\x3c\x67\xe6\x74\xa1\xb3\xaf\x44"
+ "\x9d\xd2\xe5\x5b\x5d\xb1\x99\xd3\xb5\xb2\xac\x57\xca\x4d\x35\x43"
+ "\x42\xd6\x6c\x47\xbe\x75\x65\x5e\x6e\x7e\xb6\x7e\x41\x7b\x38\x7b"
+ "\x3c\x7b\x7e\x76\xee\x8a\xec\x2c\xeb\x9c\xe5\x79\x4b\x26\x2c\x5d"
+ "\xb0\xc0\x3a\x3b\x7b\xd9\xb2\x79\xcf\x64\x0f\x67\x73\xf2\xe6\x2d"
+ "\x59\x96\x4b\xb2\x4d\xab\x75\xfa\x3d\xb6\x9c\xa5\xf9\x13\xbe\x3f"
+ "\x3d\xe5\x0a\xd9\x26\xdd\xd7\x3e\x41\x3c\x0e\xf6\xa7\x51\xa0\x31"
+ "\x62\xc9\x2e\x91\x69\x15\x77\x3d\x0f\xfe\x1a\x73\xf0\x0c\xed\x85"
+ "\xb4\xff\x10\xef\x45\xf6\x8d\xc9\x66\xf2\xb6\x2d\xbc\xf9\xb4\x72"
+ "\xd3\x76\xd0\xed\xad\x88\x23\xfb\xc4\x27\x78\x4f\xb1\x57\x9c\x67"
+ "\x2b\x37\xad\x42\x9a\xfa\x5f\x23\xce\x1b\x9b\x9d\xbe\xe1\x73\x66"
+ "\x94\x34\xc6\x30\x3f\x37\x0c\xe5\xeb\xc8\xd6\xf0\x97\x16\xa6\xd9"
+ "\x48\x37\xb8\x3d\x7e\xd2\x21\x8a\x4a\x0b\x14\x73\xc2\xa9\x72\x7d"
+ "\x0d\xbb\x2c\xe1\x92\x9e\x22\xee\x32\x28\x37\x3d\x49\x3c\xe2\x1a"
+ "\xf2\xbb\x58\x3e\x1c\xf8\xbf\xd7\x1e\xc2\xd5\xd7\xeb\xb4\x79\x2b"
+ "\xe0\xbe\xb2\x0d\x61\x61\x6b\x25\x72\xf8\xe4\x7e\xfa\x61\x4a\x74"
+ "\x3c\x53\x6e\x28\x94\x3f\xe4\x51\x6e\xa8\x90\x3f\x7a\x0f\xff\xdd"
+ "\x34\x55\xfe\xae\x8c\xff\x9f\xfe\xf4\xfa\xff\xe5\x32\xfc\xff\xe0"
+ "\xf7\x4f\xd4\x2f\xfa\xfd\xff\x63\xff\xff\x27\xf9\xb1\x18\xae\xf2"
+ "\xa3\xf9\x86\xb9\x75\xe2\xd7\x9f\xb3\x28\xcc\xcf\xaa\xf5\x4f\x63"
+ "\x4e\x7f\xc6\x2c\x85\x01\xde\x5e\xfc\x14\x4b\x28\xfa\x1a\x34\x18"
+ "\x68\xad\x7c\x07\x6f\x2f\xba\xc4\x4f\x62\xde\xfc\x05\xf3\xb7\xae"
+ "\xb2\x8d\x45\xaf\x6f\x03\x9d\x95\x2f\x7d\xcf\xd0\x79\x13\xdd\xf3"
+ "\x72\x23\xdc\xb8\xc2\xcf\x3e\xf4\x7e\x43\x3a\x95\xae\xa6\x4c\xe0"
+ "\x9e\x13\x8c\xd1\xfc\x8d\xce\x64\xf1\xd5\xa3\xf8\x01\x5e\xb6\x37"
+ "\x8b\x1b\xf6\xce\x41\x5c\xcb\x3e\x35\x75\xc8\xbe\x82\x86\x21\xd6"
+ "\xa7\x69\x9f\x8f\x7e\x4b\x9b\x9b\x0f\x89\x7b\x8c\x78\xd2\x1c\xd4"
+ "\x6c\x4c\x63\x7f\xba\xfe\x6d\xb9\xa7\x5f\xbf\x5e\x93\xe7\xd1\xbb"
+ "\xb8\xbf\x81\x7e\xd4\xf1\xb2\x82\x5a\x2a\x73\xaf\x5a\x37\x84\xf6"
+ "\xcc\x7d\x05\xa9\x43\x0a\xe7\x31\x43\x93\xe7\x0c\x3b\x0a\x5c\x48"
+ "\xe7\xe3\x58\x77\x7b\xb0\xce\x6a\xb7\x8f\xe2\x4e\xb4\x6f\x1d\xe8"
+ "\xb9\x0a\xb4\x69\x77\x77\xf9\x88\x24\x8f\x32\xd4\xa2\xd1\x72\x2e"
+ "\xac\x8b\x3d\xeb\x91\x26\x6d\x39\x1b\xbb\x1e\xe9\x40\xdb\x55\x10"
+ "\x8f\x22\xdb\x17\x3b\x0e\x30\xd8\x8f\x3a\x9b\xad\xbf\xa4\x70\x8c"
+ "\xa0\x31\xa8\x6e\xf4\xc3\xda\xa6\xc4\x08\x9e\x9f\xea\xd0\xeb\x45"
+ "\xf9\x15\x28\xbf\x59\x3b\x63\x74\xca\x72\x46\xec\x97\xeb\xd5\x56"
+ "\x4d\x3e\x44\xb5\x7b\x62\xd5\xeb\x0b\xb0\xaf\xf7\x30\xb2\x83\x5b"
+ "\x85\x3a\x5c\xa6\x52\xc6\x4d\x74\xc7\xf8\x44\x00\x7c\x8d\x2a\xf5"
+ "\x77\x95\x98\x97\xb4\xbc\x82\x0e\x11\xb4\x47\x10\xf4\xbd\x90\xcf"
+ "\x80\xfe\xc8\x01\x9e\x00\xcd\x21\xee\x67\x80\xde\xa0\x78\xd4\x51"
+ "\x85\x7e\x35\x83\x6f\xde\x8f\xbd\xbb\x96\x68\x85\x5f\x5e\xfc\x11"
+ "\xa3\x33\x0e\xa2\x17\x96\x39\xb8\x5f\xf8\x95\x2a\x8f\x99\xac\xd3"
+ "\x0b\x34\x3f\x88\x46\x58\xff\x4b\x66\xec\xc5\x18\x63\x8e\x34\x80"
+ "\xfe\x00\x4d\x1f\x63\xd7\xc6\xa6\x41\xd0\x05\x9a\x1f\x69\x89\xc3"
+ "\x63\x56\x63\x7f\x8f\x46\x1d\x0d\x1e\xe5\x26\x01\x0b\x89\x83\x62"
+ "\xd6\xe9\x7b\x3d\xc9\x1c\x3c\x28\x83\x03\xd7\x01\x6e\xfb\x93\x33"
+ "\x15\xe6\x51\x46\xb4\x60\x2c\xf6\x53\x5a\xe4\x37\x22\xfd\x01\xec"
+ "\xfb\x53\xb5\x31\x39\x01\x9e\x00\x74\x40\xcc\x74\x6a\x07\xf2\x34"
+ "\x02\xd6\xa8\xcb\xec\xd3\xf0\x58\x8b\xa4\x61\xcc\x9f\xe9\xb0\xc7"
+ "\x58\xaf\x0d\xc1\xdf\x14\x15\x0e\x7f\xc0\x42\xf2\xe5\x8a\xf9\x57"
+ "\x61\x63\x07\xbe\xd4\x9c\x49\x72\x68\xd4\x77\x40\xc8\xd0\x14\xd3"
+ "\x43\x64\xfb\x0d\x73\xe6\x00\x60\x71\x00\xe9\xea\x08\x37\xaf\xf9"
+ "\x1c\x38\xf7\x69\xa2\xa1\xcc\x8f\x48\x1a\xd5\xd4\x41\x73\xf8\xb4"
+ "\x62\xfa\x0b\x85\xdb\x95\x98\x99\x54\x1e\xc2\x6f\xe1\x09\x5a\xd6"
+ "\xf4\x46\x71\x35\xf9\x37\xb6\x91\xfd\xe2\xe1\xda\x58\x77\xa0\x5d"
+ "\x35\xfa\x1d\x28\x9a\x03\x34\xf6\xe8\xa3\x90\x3f\x78\x14\x53\x0d"
+ "\xc9\x1a\x45\xbe\xde\x1c\x6a\xe3\x09\x5a\x9f\xfa\x77\xc4\x77\x90"
+ "\xcd\xdc\x30\xd8\xcc\xd4\xc6\xa4\x4e\xf8\x0a\x55\xcc\x0f\xc9\xb6"
+ "\x99\x13\x10\x8e\x42\x1b\xc4\x39\x44\x57\x6f\x4e\xc4\x06\xca\x53"
+ "\x14\xca\x43\xeb\x07\x73\xd9\x84\x3c\xf7\xe1\xc9\xf5\xb4\x64\x37"
+ "\x1f\xed\x70\xbd\x48\xb6\xcb\x14\x53\x6b\x57\x6f\x92\x01\xf5\xfa"
+ "\x51\xaf\x81\xe6\x06\xcd\x0b\xbd\x8c\x0d\x12\x46\x7b\x30\x7e\x62"
+ "\x7e\x1d\x0d\xd4\x01\xee\x66\xd0\xff\xfe\x0c\x49\xdf\x99\x5c\x5a"
+ "\xfb\x5c\xe2\x7c\x30\x32\xca\xbb\x43\xda\x19\xa2\x74\x7d\xfe\x5f"
+ "\x43\x74\xa6\x89\xec\x0c\x45\xa1\xac\x46\x6d\x4e\x98\x90\xae\xb9"
+ "\x6f\x0e\x91\xbd\x03\xc5\x9c\x4e\xb4\xa6\xd6\x7e\x9a\x7b\x8f\x48"
+ "\xd8\xc5\x78\x69\x0e\x80\x8e\x4f\x97\xe3\x1c\x33\x93\x68\x55\x39"
+ "\x0f\x63\xe3\xf5\x32\x84\xcd\x04\xc0\x59\x45\x19\xfa\x5c\x09\xc7"
+ "\x0d\x48\x9b\x0a\xba\xb4\x6f\xde\xe8\xb8\x40\x96\x19\xb7\x4a\xa3"
+ "\x43\x32\x30\x36\x64\xaf\xdd\x25\xec\x60\x89\x79\x19\x37\xeb\xa8"
+ "\x2f\x40\xf8\xb5\x05\xed\x02\x4e\x88\x7d\xad\x2b\x2e\xb7\x2e\x34"
+ "\xb7\x63\xb7\xea\x73\x3b\x6c\x5c\xc5\xdc\x5e\x2b\xf0\x51\x6c\x9d"
+ "\x87\xfd\xb0\x5d\x9f\xfb\xb4\xce\x55\xac\xeb\x0d\x2b\xc4\xf9\x80"
+ "\x89\xe4\x81\x62\xdd\xfb\x3b\x05\x8f\x41\xe3\xd9\xe4\x68\x17\x36"
+ "\xf2\xd7\xa8\x2c\xaa\xc9\x77\x8a\xe4\x23\x67\x68\xfd\xeb\x6b\x9c"
+ "\xc6\x06\x75\xb9\xc8\x8f\xc1\x5a\xe0\x40\x5a\x83\x3e\xb4\x09\xdf"
+ "\xa2\xc8\x26\x5c\xfd\xdc\x54\xb6\x0c\x63\x7b\x34\x93\xc6\x2d\x6e"
+ "\x8a\x7e\xe7\x62\x83\xc4\x01\xd1\xda\x7c\x11\x6d\xbc\x02\xae\x26"
+ "\x09\xd7\xb8\x45\xfd\xd7\xb7\x39\x9a\xd6\x77\x38\x5c\x09\xa6\x04"
+ "\x5b\xa4\x45\xff\x87\xe6\xeb\x70\x0d\xc1\xf4\xfa\x61\xda\x7c\xd4"
+ "\x70\x6b\xdc\x80\xb8\x75\x83\xf4\x19\x51\xb7\x86\xfa\x82\x3d\x85"
+ "\xea\x17\xfe\xb0\x34\xde\xa7\xde\x4b\x73\x2a\x2e\xe0\x61\x85\xa9"
+ "\x3a\x1e\x43\x7b\xe6\xd0\x7c\xa2\xb1\xd2\x71\x07\xc9\xca\x64\xdb"
+ "\xaf\x4f\xd2\xc7\x83\xda\x1d\x8e\x13\xd0\x26\xa1\xef\x15\xea\xf3"
+ "\xf5\x4f\x22\x5f\x1c\xe1\xb6\x10\x7d\x75\x7d\x4e\xff\xbe\x5f\x9f"
+ "\x4e\x7d\xa7\x39\x61\x5f\x41\xf2\x32\xb9\x97\x79\x94\xe8\x13\xfd"
+ "\xf1\x55\xf4\x5f\x84\x5e\x86\x46\x8f\x11\xbe\xb7\xff\x52\xa6\xa7"
+ "\xfd\x0d\xe9\x85\x6c\x5e\xdb\x0f\x53\x69\xff\x43\x5c\x83\x06\x83"
+ "\x13\x48\x5f\x4f\xf7\xb8\xc9\x96\xcf\x75\x27\x24\x2f\x08\x1c\x7d"
+ "\x80\x7c\x67\x20\x5d\x45\x13\xf8\x80\x40\x24\x63\xd5\x1a\xbd\x49"
+ "\x78\x82\xaf\xcc\xb8\x6e\x65\x07\x1b\x66\xff\x3e\xff\xf2\xb4\x12"
+ "\xff\x6f\x58\x47\x7e\xb2\x97\x89\xb2\xad\xa7\x95\x1b\xb2\x51\x6f"
+ "\xbc\xf6\xb4\xe0\x39\x1b\xcf\x1b\xf1\xbc\x17\xcf\x9b\xf0\x1c\x83"
+ "\xf4\xaa\x96\x3e\x05\xe1\x21\x88\xbf\x47\x7b\xa2\x8d\xf1\x74\x9e"
+ "\x4d\xeb\xb1\x15\xe3\x87\xf8\x51\xc7\x29\x8c\xe7\xfb\x5a\xbf\x1b"
+ "\xe5\xda\x8e\x7f\x0d\xe5\x38\x28\x1d\xed\x6b\x88\xb3\x23\xcd\x7a"
+ "\x2a\x9b\xec\x2a\xe0\xfd\xa1\x30\xfa\x14\xe5\x8c\x5c\x8c\xe7\x64"
+ "\x3c\xef\xc2\x33\x1f\xf9\xc9\x9e\x67\x3a\x60\xd0\x1c\xc2\x17\x31"
+ "\x33\xb3\x1c\x72\x3c\x31\x86\xf5\xb4\xde\x75\x7c\x40\xf3\xa9\x5f"
+ "\xba\xb9\x32\x9d\xe4\x5f\x47\x26\xea\x63\x17\x10\x63\x67\x6a\x0d"
+ "\x60\xec\x50\xfe\x43\x94\x1f\xcf\x69\xda\x33\x55\x7b\xce\xd0\x9e"
+ "\x3f\xd4\x9e\xd3\xb5\xe7\x4c\x8f\x12\xef\xd3\x68\x13\xc0\x2c\x5e"
+ "\xc8\xc9\xb1\x76\xb5\x7a\x47\x25\x11\x7f\x0d\xfc\x7f\x2f\xf9\x71"
+ "\x44\xbd\xd5\xba\xdc\x9a\x64\x3f\xbd\xe5\xc3\xae\xdb\x26\x64\x3f"
+ "\x23\xf7\x87\xe1\x42\x6b\xb4\x92\xca\x40\x3b\x45\x56\x1b\x40\x37"
+ "\xc8\x72\xa2\x0d\xda\x79\x3d\xf9\x83\x21\xbf\x9a\x64\xa7\x50\xf0"
+ "\x51\xb1\xc7\xe9\x5e\xd0\x09\x21\xd3\xdf\x48\x36\x8a\xb2\x13\xf1"
+ "\x4b\x01\x4f\x31\x59\xc7\xf7\xc4\x2f\x49\x3e\x7f\xe8\x5f\xbb\xcb"
+ "\x47\x59\x43\x7c\xfe\xc8\x66\x79\xb6\x79\xc3\x73\x88\x0f\xe3\xff"
+ "\x47\xae\xa3\x36\x03\xd6\xad\xe8\xcf\xe4\x36\x65\x54\x26\x9e\x77"
+ "\xb7\xcb\x3e\xa7\xe8\x7d\xd6\xc6\xca\xae\xc3\xbc\x5d\x89\x0f\x00"
+ "\x1f\xe6\xd1\xfc\x6e\xeb\xc3\xcb\xf1\x01\x7a\x6a\xf3\x07\xe3\x1c"
+ "\xff\x3a\x8d\x77\x18\x3e\x49\x0d\xe1\xe9\x51\x07\xfa\x8f\x4b\xcc"
+ "\x81\x80\xa4\x17\x5a\xb1\x2e\x69\x0e\xac\xbd\x62\x5d\xa6\xd3\xba"
+ "\xd4\xf2\xfa\xfb\xe3\xf8\xeb\xd3\x09\xc7\x6b\x6d\xc4\xbc\x8d\xcf"
+ "\xa2\xb1\xf1\x28\xa3\x5a\xb5\x3d\xa9\x15\x7b\xe4\xbd\x88\x9f\x25"
+ "\xdb\x29\xe3\xb5\xba\x30\xff\xe2\xa7\xd3\xfc\xd7\xe3\xb5\xf9\x4d"
+ "\xe5\x4c\xa5\xb1\xd6\xe3\xb5\xf2\x31\x4f\xe3\x27\xd3\xfa\xd1\xe3"
+ "\xe5\x9c\x8c\x5d\x47\xf8\x86\xf2\x06\x84\x2e\x23\xf8\xef\x5f\xd6"
+ "\xa3\xdd\x37\xd4\x81\xbe\xa8\xa1\xf5\xbc\xa6\x80\x45\xaf\xdc\xca"
+ "\x46\xc8\xb5\x79\xc3\x71\x3d\xaf\x90\xe9\x97\xdf\xd0\xa8\xe3\xa8"
+ "\x0d\x02\x9f\xc5\xa5\xf6\xc7\x95\xa3\x73\x79\x99\x29\x10\x30\x67"
+ "\x27\x1c\x0b\x4c\x16\x38\x17\xeb\xbe\xba\xbb\xdc\x62\xf4\xb0\xbd"
+ "\x66\x6d\x2f\x69\x14\xb4\x9a\x62\xb9\xef\x58\x8d\xc4\x5d\xb2\x6c"
+ "\x4b\x1f\xfe\x0b\xa3\x43\x04\xae\xa7\xba\xa8\x2c\xec\x2b\x66\x5f"
+ "\x71\xc6\x75\x12\x7f\x5b\x32\x3c\xec\x96\x78\x1d\xb7\xd2\xfe\x64"
+ "\x52\x98\xbd\xf2\x97\x72\x7f\x52\x49\x06\x66\xf7\x09\xfb\x74\x4d"
+ "\xf6\x4e\x46\xfb\x26\xd9\xff\xb6\xad\x1a\x4e\x36\xab\x32\xd0\xd6"
+ "\xd9\xa0\xcf\x76\x69\x67\x33\xe0\x73\x6f\x0c\x12\x2f\xab\xc1\x15"
+ "\xeb\xe9\xc6\x93\xda\xb8\x9c\x40\x7b\x76\x11\x6e\x5f\xb3\x42\xfa"
+ "\x54\x22\x79\x90\xf0\xf1\x45\x34\xab\x85\xfb\x85\x2f\x83\x72\x4b"
+ "\x47\x98\x8c\xab\x46\xae\x93\x1b\x8e\x09\x1f\x15\xce\xec\x04\x29"
+ "\x4f\xbc\x71\xb9\x8c\xbf\x31\x43\xea\x21\x08\x3b\xa3\x14\x9e\x1e"
+ "\x61\x19\xf5\x37\x21\x7f\x8d\x1c\x76\x9b\xa4\x47\x6e\x9c\x12\xa6"
+ "\xf3\x23\x60\x2d\xec\x1c\x97\xdf\x98\x1e\x5a\x17\x37\x26\x52\x1e"
+ "\xe4\x3d\x83\xf8\x1c\x3d\x5e\xee\x35\x31\x53\x35\x99\x99\xf5\xba"
+ "\xd2\x54\x06\xdc\x1c\xb9\xad\x4c\x5f\xbf\x37\x36\xc8\xfa\xe5\xfa"
+ "\xa5\x3e\xd2\x7c\xa0\x35\x1c\x10\x76\xc5\x8e\x0b\x5d\x6f\xbc\x27"
+ "\x06\xf4\xb5\x2b\xe9\x3b\x71\xe7\x4c\xae\xdb\x1b\x5b\xc3\xda\xe1"
+ "\xd4\xe6\xea\x89\xae\xf9\x96\x68\x7c\xf3\x79\x94\x28\x79\x96\xa5"
+ "\x58\x24\x8f\xb1\x71\x76\xa6\x7a\x89\xfb\x49\x36\x4d\xf2\x04\x92"
+ "\xd9\x68\xfa\xaa\x74\x56\xe2\x23\x5b\x69\x4e\xac\x87\x90\x7d\x34"
+ "\x33\xd3\xed\xa3\x75\x97\x8f\x9e\x1e\x92\x1d\x5b\x76\x69\xfd\x4a"
+ "\x40\x7d\xd5\xae\xa2\x23\x34\x97\x36\xcb\x35\x66\xa9\xa2\x79\xec"
+ "\xc6\xdc\xc3\xfe\xb3\xf5\x68\xa1\xc8\x5b\xa2\xcf\x3d\xac\xd1\xac"
+ "\xd3\xca\x4d\xb1\x55\xa3\xf8\x56\x8c\x29\xe9\xed\x2f\xc2\x3c\x08"
+ "\xe2\x99\x25\x9f\x8a\x99\x9e\xda\x9c\xdf\x8a\xbc\x58\xff\xe3\xea"
+ "\xf4\x31\xf0\xc5\x1e\x6e\x16\x73\xac\x88\xf4\x1b\x53\xc4\x59\x3f"
+ "\xcd\x31\x9a\x5f\xe2\xcc\x1f\x73\xcd\x54\xfa\x23\x46\xf3\x4c\xd8"
+ "\x4c\x41\x98\xda\x4b\xf3\xac\xbb\xfc\xa6\x28\xdd\xe6\xb1\x47\x19"
+ "\x2d\xcf\xdb\xca\x6f\x4a\xd0\x75\xc3\x69\x1e\xe6\x8f\x63\x23\x51"
+ "\xbe\xb5\xde\xea\x23\xd9\xf9\x17\xee\xc0\x0c\x46\x69\x09\x76\x12"
+ "\x5f\xde\x50\x8f\x3c\x61\xe3\x1f\x23\x74\x59\x8f\xce\x15\xf2\xcc"
+ "\xeb\xf1\x6d\x51\x7f\x9c\x33\xcc\x2f\xe8\x4a\x60\xc7\x5b\xe3\x19"
+ "\x9d\xd3\x63\xaf\xb9\xc9\xa9\xd3\xc3\x93\x10\x87\x34\xd4\x3e\xe2"
+ "\xc1\x9b\xf1\xee\xa4\x7d\x7a\x10\xb9\xf3\x64\x92\x15\x11\xce\x20"
+ "\xd9\x13\xc9\xc1\x00\xeb\x96\xd3\xca\xd8\xd8\x63\x64\xbf\x68\xe9"
+ "\xb7\xed\x5e\x17\x39\xf8\x45\xb2\xa7\x65\xcd\x63\xd7\xb7\x29\x37"
+ "\xfb\x48\xee\x54\xfc\x0d\xc9\x78\x12\x2c\xfd\x65\x3c\x09\x39\xda"
+ "\xaf\x10\x3f\x4f\xe8\x37\xc6\xae\xbd\x77\x5e\xfd\x37\xa6\x42\xa6"
+ "\x1d\x53\x85\x5f\x8d\x84\x95\x05\x6b\x25\xa1\x50\x87\x15\xe1\x14"
+ "\xc2\xb1\xa4\x67\x43\xeb\x5c\x09\x30\x3a\xa7\xc6\x38\xa1\xdd\x6b"
+ "\xee\x78\xdc\x55\x40\x3c\x6d\x82\xf0\x5d\x40\xf6\x8b\xaf\x49\xd7"
+ "\x4b\x49\x10\xe3\x29\xec\xcb\x2a\x09\x76\xd4\x1d\xbf\xe1\x1c\x33"
+ "\xda\xf3\xd8\x18\x92\xa1\x9b\x82\xdc\x45\x3c\x30\xcd\x09\xc0\xa0"
+ "\xf9\x8c\x32\xe6\xb9\xfc\xd5\xcc\x80\xef\x63\xf1\x9e\xa9\xd3\x52"
+ "\xc8\x63\x8e\xf0\xb3\x78\xa2\xa1\xa6\xad\x66\x63\xbb\xcb\xc7\x4c"
+ "\xd5\xc7\x8a\xe8\x0c\x92\xe3\xf5\xf9\xbb\x52\x12\x84\x2e\x00\xd9"
+ "\xf2\xf7\x10\xdc\x74\x5c\x75\x8e\x64\xd7\x63\x92\x22\x7c\xcc\x2c"
+ "\xf7\xa1\x31\x25\x18\xd7\x54\x39\x5f\xc6\x4c\xc7\xdc\x6f\x09\x6b"
+ "\xe7\x0f\xc2\xde\xcb\x29\xbf\xc9\x47\x34\xdc\x60\xf0\x19\x73\x4c"
+ "\x87\xcf\x06\x61\x03\x94\xd9\xc5\x78\x07\x78\x27\xda\xd6\x68\x2f"
+ "\x60\x51\x67\x94\x9b\xdf\x46\x1f\x89\x06\x68\x90\x32\xfe\x9b\xdf"
+ "\xd0\xf9\x74\xd9\xee\x9b\x57\x9b\x4a\x23\x18\xc9\xe6\xc9\x66\xa4"
+ "\xd0\xc5\x3c\x6f\x11\xf2\x78\x77\x60\x2a\x73\x15\xdd\x4f\x69\x1e"
+ "\xd1\xf6\xb2\x13\x5d\xc5\x16\x76\xd4\x32\x15\xeb\xf8\xe6\x99\x58"
+ "\x2b\x9e\x6b\xd6\x79\x55\x6e\x9e\xa9\xc1\xb7\x51\xe8\x8a\x28\x37"
+ "\xdf\x48\x7b\x09\xc9\x06\xb0\x8f\x10\x8d\x16\x87\xb2\x77\xe9\xeb"
+ "\x06\xfb\x44\x3d\xf2\x58\x24\x8e\x79\xd4\x83\xf7\x78\xb2\x5b\x23"
+ "\xf8\x07\x99\x3e\x5a\x9e\x1b\xdc\xdc\xda\x47\x6f\x23\x1d\xe5\x13"
+ "\x3a\x84\xca\x98\x4e\x5b\x90\x64\x09\x63\x3a\xa9\x6f\xda\x5c\xc4"
+ "\x7e\x35\x36\x2a\xb4\x6e\xc7\x4c\x17\xeb\xb6\x33\x7c\x5d\x8e\x4d"
+ "\x0a\xf1\xa9\x37\x9d\x98\x50\xc5\x06\xb4\x99\x60\x8f\xa1\xbd\x6a"
+ "\xec\x4b\x1b\x36\xf0\x1a\xa7\x41\x7d\x78\x4d\x25\x8b\x56\xd6\x01"
+ "\x6c\xb4\xce\x56\x64\x8e\xc4\x7a\x7c\xcd\x14\x7d\x43\xfa\xb4\xfc"
+ "\xa1\xbc\xc8\xc2\x0c\xeb\x2f\x0c\x8d\x1a\xe7\xbf\xa1\x86\x47\xdc"
+ "\xf1\xf8\xec\x7c\x3a\xfb\x76\xb2\xaf\x16\xb1\x88\x69\xc0\x72\xb7"
+ "\x46\x33\xbb\x47\x19\xb7\x9f\xee\xb9\x1f\x8d\x26\x5a\x64\xdc\x7e"
+ "\x2a\xb3\xb0\x9a\x45\x15\xb6\xf3\x8e\x75\x0b\x86\x44\x61\xff\x35"
+ "\x63\xdf\xa8\xb8\x2e\xfa\x86\x9a\x5e\x94\x71\x38\x53\xe4\xab\x1d"
+ "\xbc\x6d\xd6\x7b\x07\x6e\x9b\x7d\xd4\x69\xc5\x3a\xe3\xda\xda\x76"
+ "\x8b\x2f\xd4\xb6\x5b\x7c\xff\x0b\x6d\xfb\x4b\x58\xdb\xcc\xa1\xb6"
+ "\xe5\x50\xdb\x4e\x5e\x5b\xdb\x12\x27\x87\xda\x96\x38\xf9\x9f\x6c"
+ "\xdb\x9e\xc1\xdb\x36\x6e\xf1\xc0\x6d\x73\xdc\x70\x5a\x19\xb7\xfa"
+ "\xda\xda\x36\x3e\x3f\xd4\xb6\xf1\xf9\xff\x93\xb6\x15\x55\xf3\x53"
+ "\x4d\x09\x8c\xec\x69\x46\x13\x9e\x3f\xad\xdc\x52\xba\x3a\x41\xe8"
+ "\x71\xc7\xe1\xfd\xde\xe2\x6a\xfe\xa5\xa4\x6d\xc6\x5d\x96\x7b\xda"
+ "\x38\x2f\xe6\xaf\xd4\x2b\x51\x6e\xf1\x08\x3d\x97\x88\xd1\xbb\x79"
+ "\x19\x0f\x4c\xf4\x91\xce\x60\x80\x6c\xbb\x90\x2d\xf8\x8c\x7d\x97"
+ "\xfc\x06\x1e\x97\x9d\xb3\xf3\x82\x91\xed\xbb\xe4\x35\x74\x97\xdf"
+ "\x92\xac\xdb\x73\xd5\xf3\x9a\xb6\x5e\x0d\x1f\xdd\x32\x6f\x5a\x0e"
+ "\x33\x11\x3e\xa2\x27\xf9\xd3\xdc\x50\x34\x34\x6a\xda\x37\xb4\xef"
+ "\xdf\xe2\xd0\xef\xeb\xea\x65\xa5\x75\x0c\xe5\xa6\x42\x16\x41\x77"
+ "\x86\x85\xed\x47\x8b\x97\x25\x16\xb2\x21\x69\x0e\x94\xef\x67\x99"
+ "\x26\x07\xca\x06\x3c\x24\x2d\x7f\xcb\xdb\x11\x8b\x58\x74\x15\xca"
+ "\xa6\xe7\x34\x4b\x31\x5f\xf3\x12\x33\xd2\xdd\x62\xba\x23\x2c\xef"
+ "\x07\x47\x46\xa1\x1e\x8f\x5e\xcf\x3f\x80\x5f\x8c\x84\xdf\xad\x87"
+ "\x43\xf0\xbb\x75\x79\x08\x7e\xb7\xde\x27\xe1\x77\x6b\x4a\x08\x7e"
+ "\x89\xd6\x6b\x83\xdf\xad\x8b\x42\xf0\x93\x79\xaf\x0e\xbf\x5b\x5f"
+ "\x19\x1c\x7e\xb7\xd6\x85\xe0\x27\xcb\x1a\x04\x7e\x91\x03\xc3\xef"
+ "\xd6\xe0\x3f\x07\xbf\x44\xeb\x3f\x09\xbf\x11\x12\x7e\xe3\x95\x10"
+ "\xfc\x12\xdf\x0c\xc1\x2f\x71\x95\x84\x5f\xa2\x3d\x04\xbf\xf1\x99"
+ "\xd7\x06\xbf\xc4\x3d\x21\xf8\xc9\xbc\x57\x87\x5f\xe2\xc9\xc1\xe1"
+ "\x97\xe8\x0f\xc1\x4f\x96\x75\x6d\xf0\x1b\xff\x00\xe0\x66\xd6\xe0"
+ "\x67\x1e\x1c\x7e\xe3\x33\xff\x49\xf8\x99\x24\xfc\x6e\x7b\x28\x04"
+ "\xbf\xf1\x17\x43\xf0\x1b\xff\x96\x84\xdf\xf8\xda\x10\xfc\x6e\xab"
+ "\xb9\x36\xf8\x8d\xef\x0c\xc1\x4f\xe6\xbd\x3a\xfc\x6e\x1b\x37\x38"
+ "\xfc\x6e\x9b\x12\x82\x9f\x2c\x6b\x10\xf8\x0d\x1d\x18\x7e\xb7\xad"
+ "\xfe\xe7\xe0\x77\x5b\xcd\xd5\xe0\x77\x6d\xb4\xc6\x6d\x83\xde\x7f"
+ "\xbf\xc6\x72\x02\x83\x95\x43\x30\x24\xfd\x44\xb5\xfc\xb6\xc0\x0e"
+ "\x35\x32\x4a\xde\xe1\xb8\x6d\x3f\x78\x98\x07\xdb\x94\xef\x3c\xb2"
+ "\x43\x1d\x12\xc5\xcb\xbe\x3c\xa1\x96\x9d\x5a\xcb\x4b\x23\x8d\x6a"
+ "\xe9\x50\x23\xd9\x33\x18\xd4\xe7\xba\xf2\x9d\xd7\x22\x6e\x64\x37"
+ "\xd3\x7d\xbd\x35\xa0\xd7\xe8\xbd\xbb\xfc\x3b\xfb\x41\x8b\xa4\x5e"
+ "\x09\x93\xac\xdc\x65\xc2\xd9\x67\x5e\x76\xd6\xf2\x25\x59\xf3\x96"
+ "\xe4\x5b\xe7\xcd\x7f\x76\x59\x7f\x1b\xfa\xc2\x4f\xe6\x5a\x1a\xbf"
+ "\xef\xf8\xfb\x6c\xcc\x94\x71\x07\xd9\xea\xb3\xdf\x42\xba\x69\x49"
+ "\x53\x84\x5f\x83\xb8\xec\x16\xde\x9b\xf1\x72\xea\xad\xfc\x90\xb0"
+ "\x41\xd8\x9b\xf3\x32\xf8\xa9\x42\xb2\x2b\xa3\x9d\x4d\x14\x9e\x56"
+ "\xee\xf8\x31\x8f\x5d\x98\x41\x3a\x1d\xe2\x6e\x87\x92\xa4\xdf\xc1"
+ "\x6a\xe0\x66\x5b\x8b\xea\x5c\x98\xc1\x37\x2e\x4c\x27\x18\x34\x91"
+ "\xfd\xb7\x15\x11\x63\xdb\x94\x64\xd2\x01\x68\x41\x59\xad\x5a\x39"
+ "\xad\xa4\x2f\x9a\x5a\xc0\xbf\xa0\xf2\x34\x5a\x90\xfc\x96\xb8\x24"
+ "\x3d\x98\x74\xcc\x54\x6a\x8d\xa0\xb4\x64\x87\x91\xec\x13\xea\xbe"
+ "\xaa\xa8\xdd\x94\x16\xf4\xf8\x83\xc8\xff\x20\xf9\xea\xec\x2b\x43"
+ "\xb6\xe9\xfa\x33\xca\xed\x46\xd1\x17\xa7\xad\xa4\xeb\xf9\x8c\x97"
+ "\x85\xbf\x48\x01\xd7\x3b\x2f\xa3\x6e\xe9\xe7\x33\x70\x5e\xf8\xf9"
+ "\xd4\xf2\x8c\x41\x1e\x81\x4f\xc9\xf6\xaa\x2c\xe3\xce\x93\x7a\xbb"
+ "\x40\x43\x0f\x47\xf8\xfd\xb0\x3a\xae\x43\xf8\x8d\xb0\xef\xd1\x08"
+ "\x6f\x06\x1d\x1a\xab\x7d\x1f\x81\xf0\x2a\xa2\x4b\x45\xbf\x2a\x4b"
+ "\xa4\x4e\xb4\x72\xe7\x5c\xc4\x99\xb5\x34\xb1\x48\xf3\x10\xd1\xba"
+ "\x5a\x19\x71\x08\x8f\x27\x9e\x51\xfb\x1e\x8f\xf0\x30\x3a\x17\xd0"
+ "\xbe\x8f\x3c\xa3\xdc\x71\x16\xe1\xef\x68\xdf\x41\xd7\xdf\x21\x6c"
+ "\x6d\x01\xee\x8d\xd4\x27\xc0\x7e\x0a\xc1\x1d\xb0\x6e\x44\x5c\x21"
+ "\xf8\xd5\x62\x1a\x47\xea\xa7\xab\xe0\x0c\x6b\x53\xee\xb8\x91\xee"
+ "\xe5\xc9\xb1\x5a\x98\x21\xed\x03\x19\x32\x10\x6f\xa1\x78\xd2\x2d"
+ "\x57\x37\x2e\x9c\x42\xef\x80\xe9\x1b\x04\x43\xad\x2e\xf0\x44\x77"
+ "\xa4\x6a\xe3\x0c\xd8\x91\x0d\x5f\x56\xb2\x53\x1b\x0b\xb4\x6d\x28"
+ "\xbe\x6f\xd7\xce\x3d\x2a\xd2\x02\xbd\xf2\x7e\x91\x72\x47\xce\xbf"
+ "\x64\xb3\x02\xf9\x24\xde\xbb\x63\xb7\xee\xc3\x10\x71\xc2\x56\x06"
+ "\xcd\x4f\x92\xaf\x78\x63\x6d\x39\xc2\x46\x0b\xe6\xa8\x3e\x57\x68"
+ "\x9e\xf0\xc8\xef\xb8\xa4\xac\xe6\x8e\xbe\xfb\xbf\xc8\x6b\xd5\xfc"
+ "\x3e\x30\xc9\x27\xdc\xc9\x42\xfa\x45\xb7\x0b\xfc\x10\xf6\x2d\x21"
+ "\xec\x9b\x6e\x97\x50\xda\x9c\x2a\xbf\x73\x4a\xd8\xb7\xaa\x2b\xbe"
+ "\xcd\x09\xfb\xb6\xf6\x8a\x32\xed\x61\xdf\xf2\xaf\xc8\xb7\x2e\xec"
+ "\x5b\xe6\x15\xdf\x76\x87\x7d\x4b\xd7\xbe\x45\x20\xde\xd5\x67\x23"
+ "\x51\xb9\x3d\x55\x8b\x07\xae\xbf\xb3\x35\x2c\x3e\x45\x8b\xa7\xfa"
+ "\xbd\x1e\xf6\xc9\x09\x2d\x5e\xcc\x73\xcc\xa3\xdb\x64\x1d\xc9\xd1"
+ "\x61\x75\x30\x39\x86\xb6\x1c\x39\x7e\x49\x0e\x93\x62\x1d\x4a\x73"
+ "\xca\x54\x5a\x42\x3e\x84\x9c\xd2\x1e\x98\x5c\x87\xc2\x0f\x35\xf9"
+ "\xca\x45\xba\xc1\x70\xe3\xc0\x3a\x82\xc9\x25\xfa\x3d\xd6\xa0\xd3"
+ "\xb6\x48\x75\x2e\x58\x47\x7e\x09\xc9\x6e\x58\x71\x27\xd9\x8e\xd1"
+ "\x7d\x12\xf6\x30\x77\x7e\x77\x49\x93\x5f\xdc\xb7\xa5\xfb\x10\x31"
+ "\x64\xf7\xac\x49\xc8\x77\xce\x4a\xbf\x84\x74\xbf\x77\xa3\x6d\xd1"
+ "\xca\x4e\x96\x60\xff\x3e\x6f\x27\x3e\x4f\xe2\x84\x64\xc2\x27\x26"
+ "\x0d\xa7\xbd\x24\x74\xbd\x95\x09\x74\x6f\xc1\xe4\xee\x14\x72\xe6"
+ "\xa8\xd3\xca\x84\x12\xfd\xbb\xec\xef\x84\x12\xc1\x4b\x6b\xf7\x0a"
+ "\xbb\xcb\x27\x24\xf5\xf9\xcd\x54\x26\xac\xbd\x18\xbb\x7d\x26\xe2"
+ "\xa6\xf6\xd7\x6f\x9c\xf0\x04\x95\x49\xfd\xf0\x28\xc9\x7e\x2a\x1b"
+ "\x69\x32\xfb\xf4\x1b\x11\xbf\x32\xc0\x46\xa3\x6d\xa7\xf5\xf2\xf1"
+ "\x1d\xfc\x7f\xb2\xe0\x2b\xa9\xcc\x8b\x1b\x8f\x3a\x10\x57\xe5\x31"
+ "\x4e\xda\x2d\xf5\x23\x27\xd4\x78\x58\x5b\xca\x60\xfb\x9f\x90\x49"
+ "\x9a\x17\xda\xb9\x73\x21\xad\xf9\x1c\x69\x07\x60\xa1\x5d\xf2\xf2"
+ "\x13\xce\x92\x2f\x32\xf2\xe1\x4d\xe7\x8e\x12\xef\x4c\x14\xfa\x10"
+ "\x14\x07\xd8\xec\x06\x7e\x96\x76\x35\xaf\x69\x4d\x4e\x10\xfb\x1f"
+ "\xd9\x6e\xa2\x3b\x17\x74\x87\xa3\xbb\x7c\xe2\xcc\x3e\x5f\x0f\xfa"
+ "\x7d\x02\x65\xe2\x73\x24\xe3\xdb\xa0\xca\x36\x5e\xd9\x06\x6a\x2f"
+ "\xca\xea\x1c\x74\x2f\x35\x2f\xcc\x11\x72\xd0\x4d\xd9\x0e\xa9\x4b"
+ "\x36\xf1\xad\x08\xcb\x4d\x1d\xa8\x6b\x7f\x9f\x8f\x0b\xa4\xa9\x24"
+ "\x9d\x60\x94\xdf\xd7\xcf\x3c\x51\xc7\x09\x29\xa7\x9f\xe8\x05\x1e"
+ "\xcb\xd9\xd0\xc3\x8c\x5a\xbc\xb7\x29\xe0\xa7\xbb\xf5\x03\xda\xe0"
+ "\xa2\x3d\x52\xd8\x6f\xda\xb4\x30\x87\xee\x4f\x4c\xf2\xeb\x6d\x9e"
+ "\xe4\x25\xbd\x7d\x6a\xb3\x84\xed\xa4\x53\x3a\x1c\xd7\x5f\x40\xd9"
+ "\x45\x9f\xb2\x76\x65\xd2\x62\xd2\x6f\x11\x30\x29\xd0\x75\xae\x26"
+ "\x2d\x16\xe9\x7a\xfa\xd2\x08\x79\x07\xe9\xfb\x12\x9c\x76\x90\xdd"
+ "\x01\x94\x59\x89\xb1\x10\x7e\x6c\x95\x49\x6f\x0a\xf9\x26\xbe\x8b"
+ "\x7e\x0b\x7d\xb6\x94\x78\x39\x57\x26\xed\xf1\x28\x29\x56\x39\x07"
+ "\x65\x1c\xf9\x80\x27\x3d\x84\x73\xca\xa4\xf5\xe4\x4b\x16\xf0\x70"
+ "\x90\xed\xba\x26\x1f\xd6\x8b\xa3\x87\xe6\x82\x83\x7c\x06\x7a\x94"
+ "\x49\xd2\x97\x95\x99\x60\x3e\xc9\x4e\xf5\x13\x6c\xc9\x8f\x2e\x60"
+ "\x7a\xa9\xbb\x3c\xa5\x4f\xfe\x41\x3e\x7b\x91\x66\x50\xdb\x8d\x04"
+ "\xa3\x20\xda\xdc\x04\x7a\xd5\x35\xfa\x53\x6a\xdf\x5f\xd4\xb8\x85"
+ "\x39\xa4\x3f\x89\x77\x69\xfb\xc2\x29\xc7\x4e\xce\x83\x94\xd7\x22"
+ "\x2c\x09\xe3\x9a\xe4\x5c\x90\x7e\xcc\x95\x94\x74\x0d\x7e\xc2\xe7"
+ "\x85\x73\x85\x84\x83\x4c\x7f\x97\x51\xca\x65\x12\xbe\x83\x76\xd5"
+ "\x84\xe4\x32\x77\x19\x85\x4c\x4d\xd3\xb1\xc6\xb7\x03\x61\x6d\xf6"
+ "\x89\x7b\x80\x17\x88\xa7\x4e\xc9\xa2\xba\xd6\x93\x6d\x31\x9a\x17"
+ "\x67\xc2\xe7\x7f\xca\x0c\x6a\x27\xe9\xe6\x05\x63\xb3\x1d\x7c\x63"
+ "\x76\x21\xc1\x19\x79\x0a\xb1\x16\x72\x06\xf1\x13\x2f\xfc\x54\x75"
+ "\x97\xdf\x95\x1c\xe6\x7b\x17\xfb\xe0\x5d\x4f\xe9\xfb\x1c\xed\xd1"
+ "\x64\xe7\xa1\x2f\x6e\xe3\xe7\x53\xb0\xde\x6b\x35\x1a\x67\x40\x99"
+ "\x87\xb0\x73\x38\x91\xa5\xd0\x5d\x63\xd2\xd3\xa6\xf9\xc6\xcd\x9f"
+ "\xb5\x92\xed\x64\xb2\x03\xe9\x2a\xb8\x1b\xed\xbd\x7b\xc4\x8b\xa3"
+ "\xc4\xfd\x46\x9f\x6b\xe2\x05\xd2\xd1\xe9\x3c\x5d\x28\xec\x1b\x45"
+ "\xa5\x39\x02\x7c\xa7\xf4\xbd\xed\xe5\xb1\x9f\x11\x1d\xd5\x29\x7c"
+ "\x07\x50\x99\xff\xaa\x1d\x60\xe5\xae\x56\x8d\x96\xe9\xc4\x5e\x7e"
+ "\x03\xfa\x23\xee\x33\xe2\x7d\xd4\x19\xe5\x9e\x7b\xa5\xbf\x48\x69"
+ "\xcb\x5e\xd3\x35\x8c\x94\xf7\xf3\xbd\x4c\xdc\x97\x56\xee\x7e\xcd"
+ "\x7a\x07\x63\x9d\xca\xdd\xaf\x0b\xbb\xd2\x4e\x9b\x4b\x83\x81\x6b"
+ "\x83\x6c\x97\xc9\xe6\x30\x88\x36\x52\xfb\xae\xad\x6d\x77\xeb\xfb"
+ "\x65\x64\x77\xf9\xdd\x75\xfa\xbd\x7e\xd1\x7f\xcd\xde\xb4\xeb\x16"
+ "\xe2\x5b\xee\x19\xaf\xed\x5d\xf5\x5a\xdd\xf5\xff\x0b\x75\x7b\xb5"
+ "\x32\xb7\x0a\x9b\xdb\x80\x0b\xca\xdd\xda\x5d\x7e\x4f\xaa\xbe\x9f"
+ "\x6a\x3a\xf2\xc9\x72\x9f\xbf\x27\x23\xb4\x97\x4a\x18\xf6\xbb\xb3"
+ "\xb3\x74\x69\xbe\x15\x04\xbb\x7d\x5e\xfe\xfc\x1c\x6b\x76\x5e\xde"
+ "\xd2\x3c\x2b\x19\xbc\xb9\xc2\xaf\x52\x14\x2f\xbf\x67\x91\xe6\xfb"
+ "\x6d\x77\x9f\xef\xb7\xf2\x7b\xf6\x87\xfb\xe4\xf3\x28\xf7\xd4\xfd"
+ "\xef\xf0\x35\xf7\x0c\x7a\xcf\xcf\x69\x50\x6b\xf1\xab\xc3\xcf\x85"
+ "\x5f\x03\xf1\x39\x36\x3f\x4b\xc5\xfe\x28\xce\x84\x43\xf7\xd5\xef"
+ "\xa1\xbb\x3e\xa9\x6d\xca\xe4\xbb\x76\xa8\x46\x26\xec\x9a\x94\xa9"
+ "\xa4\x4b\x42\xf6\xd1\xeb\xf0\x73\xe1\xd7\x80\x9f\xc8\xa7\x1e\x11"
+ "\x77\x6d\x6b\xc3\xbf\xd1\xd9\x34\x2f\x73\x4d\xa5\x34\xbc\xd4\x28"
+ "\xe8\x10\x75\x93\x4c\x77\x45\x1b\x0c\xbc\x7c\xc2\x7e\x2d\x9d\xc0"
+ "\x0d\x31\xa5\xcc\x3a\x40\xba\x08\x5e\xfe\x1d\x8f\x96\x4e\xdc\x7d"
+ "\xd7\xfb\x43\xb6\xfb\x91\x5e\x4f\x67\xe4\xe5\x77\xd9\xb5\x74\xd2"
+ "\xa6\x59\x99\x61\xa0\x7a\x87\xf0\xb2\x4b\x09\x5a\x3a\x73\x78\x79"
+ "\x61\x69\x22\xd5\xf2\xb1\xd3\x29\x8d\x5a\x6a\x94\x7e\x58\xca\xef"
+ "\x69\x41\xfa\x01\x6d\x9e\x5e\xdb\x38\xdd\x5b\x78\xe5\x38\xd9\xe7"
+ "\xe7\x66\xdf\x9f\xbb\x64\x05\x79\x92\xca\x5f\xba\x3c\x9f\x9e\x4b"
+ "\xe6\x3d\x2b\x1e\x4b\x6d\x0b\xe6\xcb\x97\xfc\x45\x29\xf4\xb2\x08"
+ "\xf3\x8d\x9e\x59\xcb\xed\xf4\x98\xbf\x94\x82\x8e\x9c\xe4\xe5\xf3"
+ "\x75\x97\xde\xfd\xec\x2e\x75\x97\x7f\x37\xd1\xa3\x4c\x8e\x97\xf4"
+ "\xc8\x77\x53\x3c\xca\x77\xc4\x39\xb0\xa9\xd4\xc3\xde\x49\x12\xbe"
+ "\xff\xd8\xb7\xec\x15\x28\xdf\x7d\x80\xec\x15\x98\x4a\xed\xf3\x4d"
+ "\x81\xdc\x6c\xe0\xd9\x56\xe4\x5d\xe4\x61\xbb\xb4\xbb\xe5\xb6\x66"
+ "\x61\x37\xb4\xfc\xde\x03\xba\x7e\xa1\xea\xb4\xad\x25\x7b\xf8\x42"
+ "\xdf\x68\x93\xb0\x85\x53\x8b\x70\xe3\x8e\x4d\xc2\x2f\x4d\x3c\xc2"
+ "\xeb\x10\x6e\x41\xd8\x82\x70\x82\xea\x4c\x37\xd3\xfd\x44\x84\xad"
+ "\x08\x27\xa2\xfc\x46\x7d\x5d\x84\xc3\x46\x73\x36\x77\xff\x80\xfc"
+ "\x71\x7f\x1b\x53\x58\x5b\xdf\x33\xeb\xbe\x7c\x85\xdf\xde\xf2\xef"
+ "\x59\xfb\xfc\xf6\x0a\x5f\x4e\xe6\xb9\x62\x5f\x13\x7b\xfb\xf7\xb6"
+ "\x47\x58\xc6\xac\x90\x74\xf8\xf7\x66\xea\x36\x19\x24\x9d\xfd\xbd"
+ "\x8c\x30\x9f\xc7\x14\xce\xe9\xf3\x79\x2c\xed\x92\xbd\x2c\xec\x1e"
+ "\x29\xdf\xab\xe5\xe5\xdf\x6d\xed\xf3\x4f\x57\xfe\x3d\x67\xb8\x7f"
+ "\x3a\x0f\xbe\x13\x7f\x83\xf8\xdd\xa1\x7d\xf0\x7b\x53\xa9\xce\x81"
+ "\xfc\x3b\x83\x3f\x77\xd8\x56\x81\x16\xc7\x53\xd0\xe5\x1a\x0d\x4c"
+ "\xf1\xbc\x2c\x95\xec\xdb\x58\xe9\x1b\xd1\x7e\x03\xca\x1c\xc8\xbf"
+ "\xa2\x32\xe5\x21\xb2\xbb\xeb\x2d\xce\x52\x6e\xdd\x41\x3a\x48\x08"
+ "\x4b\xbb\x91\xfc\x9c\x32\x45\xdc\x63\xd3\x6d\xca\x85\xdf\x89\x1f"
+ "\xf0\xee\xc1\x47\xfa\x99\xf1\xa2\xa5\xa6\xc0\xbc\x6c\x49\xc7\x4d"
+ "\x79\x45\xe2\xd2\xec\x6a\xb9\xdf\x4f\x59\xc7\x1f\x97\xfe\x4e\x3c"
+ "\xca\x7d\x66\xba\x8f\x64\x52\x16\x2d\xe5\xc8\x6b\x72\xcc\xcb\x16"
+ "\x71\x48\xb7\x06\xb4\x96\xd6\xbe\xe7\xdc\x09\x1d\x8c\x5f\x0a\xca"
+ "\xbb\xfe\xca\x14\xfb\x2f\xc7\x94\x50\x3d\x51\x82\x8e\xf8\x88\x45"
+ "\x93\xaf\x40\x6a\xdb\x8e\x30\x9b\x77\x1b\x10\x47\xfa\x58\x5d\x8f"
+ "\x33\x61\xf7\x57\x6b\x8b\x5d\xf8\x2a\x2b\xbf\x2f\x4a\xb7\x99\xe3"
+ "\x41\xdc\x95\xfd\x79\xfc\x27\x62\x85\x8c\x9f\x9f\x9c\x3e\x03\x6f"
+ "\xc9\x9a\x9b\xdb\xf0\xb9\x93\xd0\x15\xf7\x8c\xa7\x6b\xef\xfc\xa1"
+ "\xc2\x4f\x64\xf9\x7d\x19\x18\xa7\x80\x18\xef\x35\xbf\xf8\x9a\x70"
+ "\x8b\xf0\x9f\x48\xf7\x0a\x55\x1f\xea\x9d\xfa\x88\xb0\xaf\x6b\x90"
+ "\xf4\xa2\xb0\x6b\x57\x7e\x5f\x02\x8f\xb3\xd9\xa5\x8f\xd8\x05\x76"
+ "\x8c\x9f\xd8\xf7\x69\x6d\x88\xfb\x93\x66\xea\xfb\x7d\xb5\xc0\xa9"
+ "\xd3\xf0\xfb\x99\xf4\x0f\xf3\x8b\xaf\xf5\x72\xc9\x7e\x14\xe6\x56"
+ "\x2b\x9e\x66\xd4\xdf\xda\xa7\x23\xd4\x77\x27\xf3\xbe\xcb\x64\xdb"
+ "\xaa\xef\x7e\xae\x32\xf5\x5e\x49\x57\xde\x6f\xf4\xb0\xdb\x9c\x72"
+ "\x7d\xdf\x8f\xf9\xdf\xa0\xdd\xcd\xba\x1f\xfc\xef\xa3\x99\xfd\xcb"
+ "\xb8\x3f\x5b\x97\x7d\xc8\xb1\xbb\x3f\x15\x73\x71\x1a\x7e\x3f\x43"
+ "\xfa\x59\xba\x8f\xec\x35\x06\x71\xb7\xe8\x74\x84\x85\xa5\x20\x3e"
+ "\x4b\x8f\x1f\xa2\xa4\x02\x36\xf7\xe7\xeb\xf8\xa4\x2b\x2e\x7b\x2d"
+ "\xc2\x6b\x41\xa7\x07\xb4\xb0\x13\xe1\x2a\x3d\x8c\xf7\x1a\x1d\xdf"
+ "\x10\x7f\xd6\xf5\x7c\xc6\x4b\xc4\xff\xcd\xb7\x80\x26\xb3\x10\x7f"
+ "\x75\x3f\xf8\xdf\xf7\x4a\x64\xde\xc3\xce\xae\xb2\x0f\x92\x7d\x71"
+ "\xc7\x9b\x7d\xc0\xa1\xf8\x76\xc2\xc3\xfe\x6b\xae\x56\x4e\x87\xc7"
+ "\x78\x57\x45\x68\x3c\x22\x4c\x80\xf1\x3a\xd9\xa7\xa9\x56\xbc\x3b"
+ "\xc9\x5f\x79\x77\xf9\xff\x31\x7b\x94\xef\xfa\x45\xba\x15\x9d\x35"
+ "\xeb\x7a\xcc\x73\xdc\xe0\xe0\x5d\x0b\x68\xae\xfc\x1f\x71\x3f\x79"
+ "\x7d\x81\x59\xd8\x83\x26\x3b\x04\xc2\x3e\x19\xd9\x9c\x0c\xb0\x48"
+ "\x61\xe7\x7f\xe3\x91\x0a\x61\xdf\x7e\x65\x52\xb4\x6e\x6f\x12\xeb"
+ "\xd4\xca\x0d\x7b\xf3\xc9\x06\xa5\x90\xa5\x75\x27\xc5\x08\xbb\x93"
+ "\x9a\xbd\xc9\xed\x2b\x58\x7c\xb5\x2a\xed\x4d\x0a\x1b\x05\x57\xb1"
+ "\x39\xc9\xcb\xbe\x9a\xac\xdb\x9c\x04\x1c\xe8\xee\x61\x12\xbf\x14"
+ "\xf0\xe3\x99\x18\x66\xeb\xc6\x38\xa0\xfd\x49\x03\xf0\xa6\x41\xda"
+ "\x9f\xbc\xb6\xfd\xe6\xff\x74\xca\x79\x32\x35\x59\xf7\xe1\x1d\x16"
+ "\x97\x8a\xf5\xa2\xd1\x39\xf7\xf9\xb5\xb8\x39\x1e\xf6\x6e\x67\x1f"
+ "\x6d\x06\x7c\x47\x32\x45\x7c\x2f\xe4\xc5\x39\x2f\x85\xaf\x2b\x26"
+ "\xfe\x68\xeb\x1e\x82\x7d\x39\x12\xbf\xa1\xf4\x9b\xd9\x87\x3f\x2e"
+ "\xf1\x56\xe2\x11\x4c\x0a\xf6\x1b\x47\x04\x4f\x0b\x04\x22\x6c\x01"
+ "\xa5\x85\x68\x4f\xba\x73\x9d\x16\x0c\xd0\xdd\x7f\x63\x5a\xb0\x8b"
+ "\xfc\x6b\xb6\xd0\x5d\xb2\x0d\x0b\xe8\x6e\xe3\x58\x4e\x7e\x6a\xd2"
+ "\x82\xe7\xf9\x4e\x79\x67\xb3\x59\xf3\x99\xd9\x18\x5c\xc1\x1b\x30"
+ "\x0e\xd1\xc4\x77\x90\xfd\xad\x18\xc5\xcf\x62\xec\x11\x87\x1e\xbb"
+ "\x78\x88\x93\xed\x2d\xf2\x51\xa6\x96\xfb\x81\x2b\xad\x8a\x2d\x10"
+ "\x51\xe2\x0e\xb4\x0b\x3f\x01\x69\xc1\xa1\x3c\xcd\xf1\x00\x17\xbe"
+ "\xc5\x56\xf0\x7a\xe0\xd9\x08\xe1\x43\x7b\x15\xef\xc2\x7b\x54\xda"
+ "\xaa\x2e\x4e\xfe\x3d\x51\x76\x43\x5a\x40\xed\x49\x73\xa8\xc5\x36"
+ "\x87\x82\x7c\x5f\x22\xdf\x97\x68\x4f\x0a\xca\x34\x23\xfc\x20\xdf"
+ "\xb9\x80\xee\x40\x95\x08\xde\x07\x7d\x74\x69\xf7\x4a\xeb\xc8\xa7"
+ "\x27\xd9\x19\xb7\x05\x5c\x25\x3b\xb5\x7b\xa2\xc2\xb7\xac\xa3\x97"
+ "\x6b\xf5\x4c\x49\x5b\xc5\x1e\xb4\xad\x1a\x2b\xee\x9b\xd2\x5d\xaa"
+ "\xb4\x80\x15\x75\x96\x10\x3c\xa2\x85\x3f\x6f\x71\x9f\xea\x81\xd6"
+ "\xab\xf9\xf7\x1c\x90\xdf\xae\xcc\x4d\xe2\x9b\x9f\x69\xe1\x95\x8b"
+ "\x8c\x7c\x73\xce\x1c\xee\x5c\x40\x7a\x52\x0a\xaf\x5c\xe2\x41\x18"
+ "\xf1\xcf\x1d\xe0\x9b\x73\xe7\xf0\xca\xfc\xad\x78\x22\xbc\x32\x9f"
+ "\x6f\x5e\x88\xf0\x23\x99\xc8\xd7\xcc\x2b\x7f\xd4\x8c\x74\xe9\xbc"
+ "\x72\x56\x2a\x9e\x08\xcf\xae\x45\x3a\x84\xd3\xac\x78\x22\x9c\xee"
+ "\x3c\xad\x7c\xbf\x1a\x79\x10\x57\x90\x2e\xeb\x5a\x3d\x57\xd4\x55"
+ "\x59\x92\x23\xeb\x58\x93\x2f\xeb\x28\x2f\x91\x75\xfc\x6a\x9d\xac"
+ "\xe3\x71\x86\xf4\xad\xbc\xf2\x27\x9d\x48\x97\xc1\x2b\x9f\x68\xc5"
+ "\x13\xe1\x9f\xd5\x23\x1d\xc2\x4f\x52\x5d\x08\xff\x82\xca\x47\xf8"
+ "\xa9\x0a\xa4\x3f\xc1\x2b\x6d\x0e\xa4\x9b\xcb\x2b\xe7\x51\xf9\x08"
+ "\xcf\xcf\x40\x3a\x84\xb3\x67\xe2\x89\xf0\x33\x53\x90\x1e\xe1\x75"
+ "\xe8\xd3\x33\x1e\x5e\x59\x39\x0b\xe9\x32\x79\xa5\x13\xf5\xe5\x20"
+ "\xbc\x71\x3f\xd2\x21\xfc\x22\xf2\xe7\x22\xbc\x39\x01\xe9\x11\xde"
+ "\x82\xbe\x3e\xd3\xce\x2b\xb7\xa2\x9e\x9c\x2c\x5e\xf9\x32\xf5\x19"
+ "\xe1\x6d\x7e\xa4\x43\x78\x3b\xb5\x07\xe1\x9d\xc8\xb7\x10\xe1\x57"
+ "\x00\x83\x67\x3a\x78\xe5\x7f\x78\x91\x2e\x87\x57\xfe\xd6\x85\x27"
+ "\xc2\xaf\x39\x91\x0e\xe1\x3d\x80\x61\x2e\xc2\xfb\x52\x90\x1e\xe1"
+ "\xdf\x51\x7f\x3b\x79\xe5\xfe\x16\xa4\x5b\xc4\x2b\xff\xb8\x1b\x4f"
+ "\x84\xff\x54\x88\x74\x08\xbf\x0d\xf8\xe5\x22\xec\x4a\x44\xfa\x45"
+ "\x03\x8f\xe7\xd1\x6a\x5e\x1a\xc9\x78\xa5\xbb\x96\x97\x0e\xc5\xf3"
+ "\x2f\x99\xbc\x74\x48\x12\xaf\xfc\xd8\x8c\x78\x3c\x3f\x9a\x85\x70"
+ "\xb2\x16\xc6\xf3\xaf\x53\x10\x4e\xd1\xc2\x78\xb6\x24\x22\x3c\x59"
+ "\x0b\xe3\x79\x9c\xc2\x53\x78\xe5\xa7\x78\x46\xe2\x79\x7c\x17\xc2"
+ "\x53\xb5\x30\x9e\xff\xed\xc5\x33\xc0\x2b\x3f\x39\x81\xf8\x54\x5e"
+ "\xf9\x37\xaa\x1f\xcf\xd6\xb9\x08\x4f\xc7\xd3\x85\xf0\x74\xef\xf8"
+ "\x9f\x91\xef\x54\xc6\x47\x4d\x74\xaa\xa3\x16\xa5\x17\x5f\x64\x06"
+ "\x92\x37\xd7\x16\x79\xc8\x9e\xc3\xd8\x36\x25\x75\x15\xf9\x9b\xa0"
+ "\x34\xc1\x2d\xcf\x34\xab\xa3\x72\xe8\xfe\x48\x24\xd2\x0d\x3d\xad"
+ "\x3c\xb4\x9e\xf6\x4c\x77\xa1\x47\xf8\xb9\xd3\x6c\xd5\x45\x22\xcf"
+ "\x2b\xa0\x11\xa6\x90\xbf\x73\xc0\x29\x9a\x97\x0d\xb9\x80\xe7\x3a"
+ "\x5e\x76\x5d\x1b\xe0\x84\x70\xec\x47\x78\x22\xfc\xdd\x17\x00\x2f"
+ "\x84\x7f\xf1\x30\x9e\xeb\xba\xcb\x1f\x62\x1e\xe5\x01\x89\xef\xf7"
+ "\xce\x07\xee\xe4\xc0\x31\x68\xdb\x2b\x5b\x4a\x4c\x01\x17\xc6\xa0"
+ "\xc0\x6e\x22\x9b\x6b\xaf\x66\x94\xf0\x51\xdf\xab\x11\xed\x2e\x03"
+ "\x5f\xdb\x9b\x68\x90\x75\x5f\xc7\xdb\x94\x87\x26\x90\x2c\x94\x8f"
+ "\x4a\x1b\xec\xfb\x6c\xf1\xfd\x96\x7f\x67\xf2\xbb\x99\x85\xbe\xff"
+ "\x8c\xbe\x2f\x36\x91\xfc\xfa\xb6\x1f\xa2\x2d\x0f\x55\x51\x1a\x8f"
+ "\x92\x8a\x7d\x3e\x82\xb9\x7d\x1d\x5a\x1f\x87\x52\xba\xcd\x94\x6f"
+ "\x30\x99\x8c\x5a\x55\xec\x5f\x5f\xc6\x9b\x89\xff\xc4\x9e\x61\xb0"
+ "\x16\x25\xd6\xb5\x29\xd3\xb2\xb6\x93\x5c\x21\x7e\xb3\x8b\xee\x05"
+ "\xb5\x29\x0f\xdf\xde\xbb\x69\x41\x8b\xb5\xc0\x84\xf2\xa6\x65\x17"
+ "\xfb\xb9\xcf\x55\xf4\x30\xf6\x36\x8a\x7f\xc6\x2c\x75\xcd\x45\x9a"
+ "\x80\xd4\x0f\x12\xef\x1d\x52\x46\x3a\x2d\x8b\xf2\x86\xd3\xfb\xc1"
+ "\x17\x22\x30\x86\x9b\x9b\xe5\xf9\xd6\xc3\x13\xde\x56\x3d\x06\x53"
+ "\x3e\x1b\x62\x2d\x38\x84\xf2\x1f\xce\xef\xc7\x1b\xf6\xa5\x15\xdf"
+ "\x9e\x3c\x88\xb4\xdb\x84\x1c\xe7\xe1\xb5\xba\x0c\x98\xa3\x0f\xbf"
+ "\x96\x74\x51\x2a\xed\x63\x92\xbe\x9b\x66\x24\x7b\x98\x81\x78\x87"
+ "\x27\x50\x35\xb1\x24\x58\xb5\xd9\xc5\xb7\x6c\x6e\x8e\x09\x28\x4c"
+ "\xea\xe9\x4f\xbb\x6f\x92\x9f\xe4\x6b\x1f\x50\xff\xbe\x51\x87\x8f"
+ "\x98\x33\xd1\xc1\x0c\xae\xbc\x4f\x29\xef\x5d\xfc\x05\xcb\x4c\x77"
+ "\x67\x2b\x73\xe5\x89\xb2\x52\xf8\x0b\x13\x4f\xa8\xc3\x6f\x9d\xb3"
+ "\x83\xe8\x52\x07\xc9\x85\x3e\xa2\x7c\x6f\x02\xce\xa0\xff\xa7\x99"
+ "\xf5\xb6\x90\x5f\x80\xf5\x80\x1d\xd1\x8c\x74\xaf\xda\x16\x0c\x92"
+ "\x0d\xa8\x0a\x0f\xe0\x20\x65\x8b\x0f\xfb\x08\x47\xcb\x7a\xa7\x3d"
+ "\xa2\xc6\x2d\x70\x35\xcd\xa5\x33\x54\x33\xd9\xd4\xf1\x89\x7b\x98"
+ "\x01\xf2\xe5\x47\x7b\xa3\x4c\x1b\x3e\x76\xb9\xda\xfd\xd3\xdc\x25"
+ "\xf9\x79\xcf\x59\x97\xe5\x16\x64\x3f\x30\x7e\x79\xb2\x35\xcf\x61"
+ "\xcd\x13\xfe\xb0\x45\x44\x56\xb2\x75\xd9\xa2\xa5\xf9\xd6\xfc\x55"
+ "\xf6\xec\x6f\xfb\x06\xb6\x70\xf3\x82\x6a\x49\xcb\x3d\x22\xec\xc4"
+ "\xf0\x9a\x2d\x8e\xfc\x42\xae\x5a\x6f\x19\x0a\x5a\x7d\xba\xf1\x72"
+ "\xe4\x34\x3b\xdd\x49\x57\xcb\xac\x4c\xf3\xd9\x1d\xfd\x52\x1c\xa3"
+ "\xfb\x1e\x51\xe8\x6b\x20\x74\x2e\xf2\xc8\x74\x29\xb7\x98\x0e\xfa"
+ "\xe7\x21\xd1\xff\x2a\xdd\x4e\x97\xf6\x4d\x9e\x2b\x4c\x4f\xf1\xb0"
+ "\x57\xa5\xed\xb9\x9a\xcd\xad\x92\x06\x9c\x2e\xce\x2a\xb8\x75\x8b"
+ "\x83\xef\xca\x28\x01\xfd\xa3\x90\x3c\x48\xf8\xd0\x65\x17\xc4\x9d"
+ "\x54\xbe\x79\x95\x97\xee\x83\x07\xb7\x3c\x6b\x57\x47\xad\xf2\xaa"
+ "\xbf\x7d\x32\xb5\xf8\x15\x66\xd8\x87\x35\x6f\xb4\x62\x7e\xdf\xc2"
+ "\xc6\x1e\x2a\xea\x30\xa0\xcd\xcf\x1d\x2a\x6a\x35\xf0\xaa\x45\x33"
+ "\xbb\x12\x7f\x9e\xe9\x2f\x13\xf6\x3c\x51\x86\x9f\xbd\x37\x9d\x11"
+ "\x2f\x53\xe7\x1b\x59\x56\xe1\x1b\xf9\x6c\x86\x7f\xf3\x0b\x5e\xd7"
+ "\x2d\x77\xb3\x19\xb7\xf3\xf3\xef\xd6\x93\xcc\xe9\x91\xe4\x77\xa7"
+ "\x93\xcc\x6f\x41\x95\xdf\xbc\x60\xab\x6f\xcb\x2a\x3b\xd9\xb9\xb9"
+ "\xbc\xe5\xd7\xa9\x3d\xa3\x16\x37\x1f\x45\x9a\x0f\x40\xeb\x7f\x68"
+ "\xc5\xfc\x1d\xc7\x0c\x97\x6f\xfb\x59\xf3\xbe\x1e\xa7\xa1\xa1\x7e"
+ "\xaa\x94\x53\x66\x62\xcd\x88\xf9\x34\x63\xe4\xbb\xfb\xeb\x19\xea"
+ "\x66\xfb\x7a\x66\x1a\xde\x9b\xf2\xad\xef\xf7\xbe\x9b\x52\xcf\xba"
+ "\xc9\xc6\x2a\x78\xaa\x83\x9f\x6e\x65\x7c\x4b\x49\xed\xeb\x05\x7e"
+ "\xc3\x5c\x0f\x33\x1c\x6b\xdd\xca\x0a\x4f\xb1\x11\x81\xf3\x49\xc6"
+ "\xff\x42\xfe\xcb\x64\xbb\xf0\x43\x8b\xb0\x61\x56\xe4\x12\x3e\x61"
+ "\x4d\x4d\xa0\x27\xd4\xf3\x49\x91\x4d\x73\x5c\x0c\xdf\x47\x07\x1e"
+ "\xb5\xb0\x63\x39\x5e\xe6\xce\xa8\x61\x97\x0d\xa9\xec\xad\x9f\xd7"
+ "\xb0\x6d\xa0\xe7\xb7\x9d\x63\xd1\xf2\xfc\x35\x29\x32\xd0\x9b\x64"
+ "\x0c\x3c\x9f\x44\x36\x65\x38\x3f\x9f\x34\x9c\x68\xc8\xc0\xd2\xa4"
+ "\xa8\x26\x6f\x0d\x9b\xd4\xc1\x92\x2e\x1b\x98\xe9\xf2\xf3\x49\xc3"
+ "\x9b\xec\x5b\x51\x16\x88\x43\xc0\x95\xec\x59\x91\x9d\x2b\x82\xd3"
+ "\x75\x19\x6c\x4e\xa7\x32\xfd\xec\xf0\x16\x36\x92\xec\x29\x92\x3d"
+ "\x34\xb2\xe9\xaa\xc6\x97\xd4\x06\xe3\x57\xd9\x8b\x2e\x92\xfd\x0f"
+ "\x3f\xe3\x7b\x9f\xf6\x58\xa5\xcf\x70\x85\xfa\xac\xf2\xa4\xe1\x36"
+ "\x7a\x6e\xb2\x8d\x26\xda\x56\xed\xb6\x90\xaf\xa3\x28\x6a\x27\xd6"
+ "\x69\xd4\xea\x93\x80\x65\x71\x92\x11\xe9\xa2\x11\x1f\xe3\xee\xf4"
+ "\xb3\xe0\x84\xa7\xbd\x13\xed\xc2\xa7\x6d\xfc\x8e\x22\x66\x76\x16"
+ "\xb1\x78\xeb\x77\xc5\x5c\x1a\x11\x7c\xfd\x69\x0f\x2f\xff\x69\x3b"
+ "\x2f\x35\x26\xc8\xb8\x1f\x9e\xb5\xfe\x80\x31\xeb\xdd\xe2\x7d\xb3"
+ "\xf5\x7e\x8c\x61\x7c\x89\x59\xd0\xdd\x82\x47\xfb\xe1\xaf\xe4\x1c"
+ "\xff\x61\xe9\xe5\xc8\x57\x92\xd4\xf2\x96\xe9\x6a\xa9\xd1\x4a\xbe"
+ "\xaf\xcf\x29\x3f\xcc\xe6\x95\xa7\x33\x79\xd5\x0b\x62\x2e\x22\x3c"
+ "\xef\x72\xe4\xe3\xeb\x10\x57\x8f\xf2\x53\x2f\x2b\xc6\x56\xfc\x4e"
+ "\x68\xf9\x33\xa8\xdf\xc1\x5d\x19\x19\xd4\x6f\xe1\x1f\x07\xfd\xb2"
+ "\x61\xcc\xf8\xa8\x62\x97\xb0\x19\xdf\x0b\xf8\x6a\xfe\x43\x09\x1e"
+ "\x04\x03\xb5\x37\x69\xb8\xe8\x6b\x6f\x52\x34\xe0\x4b\xb6\x53\x4d"
+ "\x45\xf3\x90\x67\x4b\x71\x0b\xbe\xc5\x5c\x8e\x2f\x89\x22\x3f\x55"
+ "\x6e\xbb\x97\x05\x37\x17\x37\x93\x6d\xb0\x97\x0a\xb0\xe6\x46\x16"
+ "\x63\x8f\x2f\x3e\xa1\xad\x2d\x46\xed\x54\x2b\xbf\x32\x5f\x26\xdd"
+ "\x7e\xb4\x0d\xed\x6b\xc5\x0f\xdf\x7f\x70\xe2\xf2\xf8\x8c\x1c\x3c"
+ "\x6b\xd1\x56\x2b\x2f\x5f\x1a\x4f\xef\xf8\x66\x45\x9b\xdf\x21\x38"
+ "\x10\x3c\x34\x58\xbc\x1d\x82\xc5\xb6\x74\xa4\xdb\xa3\x96\x37\x75"
+ "\x78\x94\x1f\xae\xe3\xe5\xa0\x97\x42\xe9\x4e\x85\xd2\xfd\xd6\x27"
+ "\xd3\x1d\xdf\x2a\xd3\xe5\xcf\x3a\xad\xcc\x2c\x95\xf0\x9e\x79\xfb"
+ "\xb7\xe1\x3d\x73\x5c\x28\xef\x86\x6a\x99\xb7\x3e\x49\xe6\xb5\x51"
+ "\xde\x27\xfb\xb7\x69\xe6\x8f\x43\xe9\x7f\xd5\x2c\xd3\x1f\x6c\x95"
+ "\xe9\x7f\x6e\x09\x4b\xb7\x2a\x94\x6e\xf3\x5c\x99\xee\x7d\xbb\x4c"
+ "\x97\xe5\xc0\xf7\x37\x07\x68\xcb\xeb\xa1\x3c\xbf\xf3\xc8\x3c\xed"
+ "\xeb\x64\x9e\x62\xec\x49\x33\x4f\x5d\xd1\x96\xcf\x42\xe9\xf7\x68"
+ "\xfd\xfe\x22\x41\xa6\x5f\xb5\x3f\x94\xee\x11\xed\x3e\x12\x7d\xff"
+ "\x1a\xe9\x7e\x58\x72\x39\xb2\xae\x5e\xa6\x5b\x3b\x87\xe6\x23\xd2"
+ "\x8c\x57\xcb\x33\xf2\x2f\x47\x3e\x91\x89\x72\xf2\x31\x36\x09\xf4"
+ "\xc4\xd8\x25\xa8\xce\x05\xe0\x51\x67\x74\xd2\x39\x04\xe1\x5c\xec"
+ "\x09\x8d\xc0\xbb\xc1\x81\xcf\x38\x1f\xc9\xea\x93\x7b\xa9\xa0\x0d"
+ "\x36\x3f\x53\x33\x20\xbd\xb6\xe9\x97\xeb\x48\x37\x81\x70\x0a\xea"
+ "\xfe\x98\x6c\xc6\xf1\xe2\x99\x9a\xac\xe9\x11\x71\xaf\x8d\x6c\x36"
+ "\x90\x3c\x52\x8b\x13\xfa\xe5\x2a\xe6\x26\x78\xc3\x3a\xb2\xd3\x47"
+ "\xf2\x47\xec\x51\x0d\x98\x73\x1d\xc0\x13\x43\x5e\x34\xa8\xb5\xf8"
+ "\xd5\xe1\xe7\x7a\x91\xe4\x92\x65\x6c\x86\x2e\xb3\x1d\xb8\xad\x3f"
+ "\xc2\xfe\xf7\xdb\xc6\x90\xdc\xea\x47\x56\x94\x75\xed\xfe\x5d\x94"
+ "\x1f\x59\xaf\x72\x7e\x64\x14\xf6\xd4\xb7\x3c\xe3\x75\xaa\xd2\xbf"
+ "\x3c\xd6\x22\x68\xb8\x1f\x2d\xc7\x9e\x5f\x22\x6c\xc1\x56\x15\xd8"
+ "\xd5\x44\xec\x25\x67\x59\x84\xbb\xb0\x83\xd5\xaa\x1d\x06\x67\x0f"
+ "\x33\x36\x61\x3f\xa5\xf4\xb5\xa0\x1d\xac\x4b\x22\x40\x47\xfc\x68"
+ "\xbd\xf3\x92\x56\x5e\xcd\x96\x92\xe2\xc5\xd2\x8f\x36\xd1\x8f\xb4"
+ "\x07\x01\xef\x44\x0b\xdf\x6a\x4b\x88\x7e\xfa\xd1\x61\xbc\x47\x51"
+ "\x5a\xe0\x7e\x76\xf9\x37\x5b\x4a\x7a\xb6\x2c\x6a\xee\xb9\xed\x49"
+ "\x4f\xef\xa8\x02\x7b\xef\x16\x87\x37\xf0\x9b\xcd\xde\xc0\x6d\x19"
+ "\x25\xc1\x51\x8b\xd3\x51\x37\xf6\xa7\xad\x86\xbd\x6a\xad\x61\x6f"
+ "\x91\xcb\x40\xe5\x1e\x2a\xda\x6d\x38\x58\xd4\x6c\x38\xa8\xd6\x19"
+ "\x0e\x15\x39\xf1\xac\x21\x3f\x5b\xa0\x59\x1f\x8d\x3d\x58\xd4\x80"
+ "\xfd\xf1\x51\xac\xc9\x47\xd2\x75\xf9\x28\x7f\x38\xc0\x9a\x76\x07"
+ "\xd8\x3b\xf9\x17\x99\x37\x76\x41\x35\x7e\x35\xde\x91\xc5\x7e\xef"
+ "\xc8\x17\x84\xff\x76\x3e\xaa\x54\xf4\x91\xee\x68\x1d\x54\x65\x9b"
+ "\x35\x78\x50\x99\xab\x76\xd0\xd9\xa9\x6e\x27\x57\x99\x35\xf9\x5b"
+ "\x76\x72\x0d\xd2\xc7\x5b\x9f\xad\xdc\xff\x2f\xec\xe4\x6a\x72\x04"
+ "\xb2\x93\x0b\xde\xb5\x59\xe3\x5d\x5d\x9a\x4d\xa4\x68\xe2\x57\x85"
+ "\x4d\x24\x87\x4b\xd8\x35\x12\xe7\xf5\x9b\x1d\xe9\x44\x87\x76\x97"
+ "\xcf\xb2\xeb\x7c\x29\xd1\x56\xc1\x8d\x0b\xf6\xe0\xb7\x1b\xf1\xa0"
+ "\xab\xce\x7b\xf5\x78\xbe\x65\x92\x93\x60\x12\xe4\x39\xdf\xef\xa6"
+ "\xfb\x47\x3c\xe7\xc1\xe0\xe6\x67\x33\x83\x9b\x5f\x68\x46\xdc\x54"
+ "\xfc\x1e\x08\x6e\x9e\x54\x85\xdf\x56\xfc\xaa\xf1\xab\xc1\x6f\x17"
+ "\x7e\xbb\xf1\xab\xc5\x6f\x3f\x7e\x75\xf8\x1d\xc0\xcf\x85\x5f\xbd"
+ "\xba\x79\xd2\x1e\xb2\xfb\x87\xb2\x9b\x31\x0f\x2c\x7a\xb9\x21\x78"
+ "\xcf\x3a\x8b\xfe\xa7\x12\xdd\xc7\x63\x4e\x17\x72\xb2\x55\xf6\xea"
+ "\xcf\x2a\x44\xfb\x09\x2f\xbf\xfa\xf3\x4c\xef\xb8\x2d\x76\xef\xb8"
+ "\xcd\xad\xde\xd8\x6d\x51\xf8\x99\xf1\xb3\x78\x37\x97\x98\x31\x9e"
+ "\xad\xde\x91\x25\x35\xdd\xe5\xb3\x31\xfe\x73\xa6\x4a\x99\xd3\x6c"
+ "\xe0\xb8\x39\x9a\xfc\x69\x36\xf0\x7b\x7a\x3d\xbd\x7b\x47\x96\x66"
+ "\x22\x0c\x9c\xf1\xb8\x48\xd7\x35\xaa\xc4\xaa\xdd\x5b\x2a\x41\xbc"
+ "\xd3\x63\xfc\x91\x4b\xa6\x73\x78\xe8\x4c\x09\x71\xbb\xf4\x35\xd8"
+ "\xcf\x97\xc6\x7c\xbb\x6d\xf1\x3c\x87\x6d\xd9\xa2\xdc\xf9\xd9\xcb"
+ "\xee\xb7\x8e\xcf\xb2\x26\xe5\xe6\x3d\x67\x7b\x6e\x79\xf6\xf2\x6c"
+ "\x41\x3e\x22\xea\xf6\x7e\x67\x4a\xe4\x33\x99\x05\xc0\xe7\xc4\xb4"
+ "\x73\x4e\xfb\xf6\x2c\x1f\xc6\xe7\x96\x2d\x25\x07\xce\x79\x0d\x41"
+ "\xd0\x6f\xd1\xed\x25\x58\x97\x05\xf6\x03\xe7\xfc\x86\xe8\x76\x2b"
+ "\xe3\x58\x0b\xf4\xcd\xdd\xde\xac\xd1\x73\x1f\xb1\x46\xa2\xe7\x90"
+ "\x66\xef\x12\xbf\xe1\x31\xca\xff\xdb\x8c\x92\x7d\x78\xe7\x5b\x56"
+ "\x79\x29\x1f\x07\x8d\x27\x9e\xa0\xf1\x64\x78\x51\xf3\x41\xf1\x74"
+ "\x78\x0f\x8a\x74\x8b\xd3\x0f\xd1\xf3\x52\x21\x6f\x44\xb9\x24\x5b"
+ "\xe3\xbf\xfd\x19\x3b\x28\xf3\x78\x44\x1a\xac\xc3\x36\x25\x6d\x32"
+ "\xa5\x13\x3c\x13\xda\xb8\x0f\xed\x28\x5e\xce\x8c\xfa\xda\x26\xbe"
+ "\xa8\x6f\x7d\xaf\x20\x7a\xf7\xb1\xed\xb4\xbe\xa9\x3d\x1c\xeb\xf9"
+ "\x75\xe4\xdd\xbb\x44\xf2\x91\xe0\x1d\x23\x88\x67\x24\x1c\x42\xb8"
+ "\xc3\x5d\xd8\x2c\xf2\xd7\xaa\xcd\xe0\x39\x23\x28\xef\x67\xf4\xad"
+ "\x1a\x34\x6a\xb5\xe0\x49\xd2\x2c\x3a\x1f\xb0\x6e\x94\xb4\x89\x14"
+ "\x9d\xc9\xe8\xee\xf6\xd8\x73\xca\xec\x6f\x08\x7e\x04\x2f\x3a\xc3"
+ "\xe5\xe5\xb3\x6b\xab\xe3\x98\x91\xfc\x0d\x04\x46\x6e\xd6\xec\x73"
+ "\xa5\x65\xe8\xb4\xb5\x2f\x7e\x73\xbf\x3b\x3b\x72\xbc\xac\xd9\x4b"
+ "\xe8\x34\x22\x4b\x1c\xfb\xcd\x5b\xb6\x6c\xf9\xe2\x6c\x6b\xf6\xbc"
+ "\xf9\x39\x56\xf1\xd9\xba\x7c\x19\x92\xe4\xe6\x2f\xb3\x2e\x5d\xb9"
+ "\xc4\xba\x78\x59\x2e\x71\x09\xd9\x79\x79\xcb\xed\xf9\xc3\x99\xcc"
+ "\x69\x5d\xbc\x7c\x51\x7e\xae\x1d\x2f\xcb\xb2\x97\x64\x59\xc5\xa8"
+ "\x2f\x43\x51\x8b\x16\x59\xb5\x1a\x96\xe5\xcc\xcb\xa3\x89\xb0\xe4"
+ "\x19\x24\x0a\xcb\xdf\x9f\x87\x88\x26\x9b\x53\xb4\xef\x9c\x53\xd2"
+ "\xdf\xaa\x37\x02\xd6\x55\x9b\x1b\x48\xef\x00\xe1\x3a\xc1\x57\x96"
+ "\xa7\xe5\xd0\x19\xcd\x8b\xe8\x63\xd7\xf8\x9f\x63\xee\xa6\x4f\xd6"
+ "\xfb\x46\x36\xde\x85\x8d\x43\xb2\x9f\xa9\xa4\xbf\x2a\xee\xd3\x61"
+ "\x3d\x08\xbd\x94\xf2\xb4\xe7\x25\x2c\xd2\xb3\xc2\xed\x63\x4b\xfd"
+ "\x9b\xf4\xd5\xf2\x7c\x23\xbd\x8e\x68\x23\xcd\x26\xbd\x82\x3c\xaf"
+ "\x51\x1e\x75\xf3\x0b\xad\xc8\x57\x1d\xe2\x4f\xd2\xf3\x29\xbd\x48"
+ "\x57\x9e\xf6\x2e\x1f\x59\x02\x3e\x25\x3d\x83\xda\x35\xc8\x1e\x63"
+ "\xbd\x84\x72\x3f\xac\x65\xec\xce\x78\x96\x74\x69\xd3\xc2\x8a\xee"
+ "\xb8\x05\xb5\x3d\x65\x6c\x68\x0f\xf6\x35\xbf\x81\x8d\xbd\x8c\x79"
+ "\xb1\xea\x2e\x16\xb1\x7a\x36\x33\xd4\x2e\xac\x25\x1b\xad\xac\x71"
+ "\xe6\x56\xe6\xce\xf4\x30\xb7\x7f\x0f\x6b\x74\xb5\xb1\x63\x81\xff"
+ "\x94\xfe\x13\x0a\x88\xbf\x78\x7c\x0c\xd9\x8d\x2a\x5e\xcd\x83\xfb"
+ "\xfe\xe4\x1d\xb2\xf7\x4c\x2d\xf9\x3d\x18\xeb\x0e\x7c\xe1\x72\x17"
+ "\xee\x62\x6e\x87\xdb\x45\xf7\xe9\xcf\x29\x3f\x1e\x76\x10\xdf\x86"
+ "\x35\x22\xdf\x63\x6c\x28\xe0\x18\xa4\x3a\x2a\xb6\xf0\xd6\x5f\x8d"
+ "\xe2\x27\x7e\xb5\x85\x7b\x30\xa7\xc8\x8f\x41\xc7\xfa\x51\xbc\x73"
+ "\xbd\x66\x1b\x8e\xe6\xa9\x7d\x05\xb3\x9c\x51\x7e\x5c\x25\x64\x1c"
+ "\xd3\x45\xf8\x46\x84\x85\xee\x99\xdb\xb1\x85\xc2\xa3\x11\xde\x2f"
+ "\xc3\x3b\x28\x7c\x13\xc2\xf5\x32\xfc\x2e\x85\x13\x10\x6e\x91\xe1"
+ "\x26\x26\xef\x96\xff\xb8\x5d\x86\x3f\xa1\x30\x60\xff\x63\x9f\x6b"
+ "\x05\xb5\xf7\x73\x8c\xd9\xe3\x4a\xf1\x67\xe0\x53\x1d\xa7\xc5\x7a"
+ "\x38\x54\x94\x43\x32\x18\xac\x87\x1f\xff\xdb\x75\x27\x88\xc7\x7d"
+ "\x3c\x31\x32\x85\x9e\x3f\x4e\x32\xf9\xd9\x50\xd0\x8c\xd7\xa1\x3f"
+ "\x17\x09\x76\x03\xd2\x30\x7b\x7f\xbe\x2f\x2d\xc0\x5d\xfc\xd5\x0c"
+ "\x07\xdf\x5c\xe0\xe5\xaf\x3e\xe9\xe2\x62\x9f\x7b\xa6\xb6\xb6\xc0"
+ "\x2f\xec\xe4\x82\x4e\xc7\x1a\x7a\x7c\x1e\xb5\xc9\x0b\xba\x77\x10"
+ "\xbb\x99\x66\xbe\xf9\x59\x2f\xf8\xc9\x9c\xd9\x49\x01\xd2\x21\x04"
+ "\xad\xff\xf8\xc5\x77\x72\x88\x6e\x28\x9d\xaf\xee\x7a\xd2\xa5\x16"
+ "\x67\x30\x9e\x98\xe1\x98\x9d\xc3\x5d\xd8\xc3\x14\x29\xef\xe6\x5f"
+ "\xa0\xfe\x2f\x44\xbd\xe3\x33\x1c\xea\xca\x1c\xf2\xfd\x24\xf0\x4b"
+ "\x11\xed\xe7\x2b\x80\x4f\x9e\xcf\x30\x05\x37\x97\x66\xbe\x93\x73"
+ "\xea\xda\xfc\xa8\x29\x8f\x0f\xea\x2b\x89\xda\x14\xe4\x19\x2c\x80"
+ "\x7a\x02\xe8\x2b\xd1\x0e\x7b\xd5\x06\x03\x68\x18\xc7\xeb\x4f\xb7"
+ "\x0e\xe1\x2b\x33\x4c\xe8\xd3\x5d\xee\xa4\x8b\xac\xa9\x87\xd6\xca"
+ "\x4f\xf6\xbf\xe3\x60\x6c\x86\x23\xe0\x32\x79\x85\x3e\x9b\xd9\xbe"
+ "\x90\xdd\xcc\x47\x3e\xeb\x3d\xa3\xcc\x31\x3e\x56\x88\x3e\xa0\xef"
+ "\x07\xdb\x5a\x8d\x2a\xfa\x31\x49\xc2\x8d\xf2\x75\x00\xb6\x39\x3a"
+ "\x7f\x73\x6d\xed\xff\x89\x98\x37\xea\xb2\x0c\x46\xf7\xfc\xf6\x81"
+ "\x5e\x51\x7b\x33\x4c\x2a\xf6\x23\xfa\xf6\x4e\xd2\x59\x46\x75\x4a"
+ "\x58\xff\x44\xe8\x21\xf1\x44\xc0\x19\xf5\x93\x5d\x61\x1d\xae\x48"
+ "\xdb\x11\xec\xcd\x19\x78\xfc\xb7\x94\xa6\xa0\x7d\x99\x7c\xf3\xa4"
+ "\x81\xed\x42\x6f\x99\x64\x93\xf3\xe3\x67\x5b\xf1\xdb\xcd\x5f\xd9"
+ "\xec\xf1\x8e\xff\x59\x9d\xf0\xcd\xb9\xc5\x91\xa9\xcb\x8a\xb0\xde"
+ "\x30\x47\xe6\xfc\x5b\x6d\x51\xc7\xc0\x76\x55\x9d\x87\xa5\x4f\xb4"
+ "\x21\x5f\x70\x53\x90\x7c\xfd\x5e\x24\x1b\xd5\x15\xef\x24\xf9\xae"
+ "\x71\x4c\xe7\x34\x0c\x36\xa6\x54\xfe\x8c\xdb\x79\xef\xb5\x95\xf7"
+ "\x84\x65\xd0\x39\xb2\x0b\x70\x89\x9f\x54\xd2\xc3\xa7\x2b\x92\x07"
+ "\xf9\xe9\xdb\x04\xab\x00\xf6\x91\x82\x8f\x99\xc1\x8f\xfd\xf2\x3f"
+ "\x7f\x5a\x61\x48\xc6\x3e\x13\x04\x2d\xf0\x7e\x73\x3d\x4b\x9b\xc5"
+ "\x8a\x8f\xe5\x5c\x60\xba\xaf\x33\x3e\x6a\x95\xf7\xb5\x9f\x7a\x0d"
+ "\x74\xe6\x44\xbe\xcd\x04\xbf\xbe\xa5\x38\xe5\xbf\x3e\xc1\x9e\x09"
+ "\x3a\xe2\xf5\x4f\xbc\x86\x40\x57\x86\x55\xd8\xc8\x06\x1f\x51\x9c"
+ "\xc3\xd5\xbe\x73\x28\xf2\xa3\xe0\xb4\x59\xc9\x77\xf4\x87\xe9\xcd"
+ "\xe2\xee\xf5\x87\x19\xf5\xec\xc3\x13\x5b\x59\x63\xfb\x67\x74\x5f"
+ "\xf0\x95\x0f\x33\x9c\x44\x4f\xc6\x04\x40\x33\x6e\x03\xcd\x88\xf5"
+ "\x3a\x4c\x35\x1f\xae\xd0\xcf\xa2\xe8\x5c\x4a\xa7\x17\x03\x58\xa3"
+ "\xd5\x9a\xbf\xb3\x40\xf9\x9c\x3d\xd5\xda\xb9\x14\xf9\x41\x7b\x79"
+ "\x05\x4b\x7c\xd9\xa0\x66\x0c\x74\x0e\x15\xf3\x9c\xb0\xcd\x62\x51"
+ "\x63\x0f\x57\xe8\xfe\xd0\x1e\x7b\xce\xca\xfe\x8c\xbe\xbf\x93\x74"
+ "\xad\x6b\xf2\xa7\x42\xe7\x3c\x80\x79\x17\xc0\x9c\x0b\x00\x9e\x18"
+ "\x03\x07\xc6\x6d\x40\x5e\x4c\x1f\x83\xde\x62\x7d\x0c\x32\x66\x8b"
+ "\x31\x00\x0f\xf7\xfc\x93\xda\x18\x7c\x8a\x31\x68\xc7\x18\x94\xb1"
+ "\x92\x0f\xe6\x34\xb2\xb4\x74\x8c\x41\xe7\x05\xb2\xaf\x2e\xfd\xcd"
+ "\xe5\x4b\xd8\x8b\xb1\xf8\xd4\x6b\x68\xf2\xc9\x31\xd8\xf3\x73\x39"
+ "\x06\x7b\x7f\xee\x05\x1d\xf3\xb3\xe6\xd7\x10\x0e\xae\xcc\xb0\x92"
+ "\xef\x1c\x5e\x96\x49\xbe\xb1\xe5\x58\xf4\x62\x2c\x7a\xe5\x58\x14"
+ "\x3d\x87\xb1\x68\x69\x15\x36\x5a\x3e\x3c\xd1\xc8\x1a\x33\x6b\xd8"
+ "\x31\xe0\x25\x8c\xc5\x3c\x1a\x17\x92\x2f\x04\x9f\x4f\x8a\x7b\xa9"
+ "\x80\xc5\x57\x17\x30\x8b\x3e\x1e\x6a\x2f\xc6\xa3\x00\xe3\xd1\x83"
+ "\xf1\xf0\xf7\x8d\x47\xbc\x18\x8f\xb3\xda\x78\xf4\x90\x8e\x1b\xc6"
+ "\xa3\x07\xe3\xd1\x83\xf1\x28\x93\xe3\x41\x78\xfe\x31\x9f\x89\xab"
+ "\x7f\x4f\x62\x3b\xce\x0c\x30\x1e\xcf\x6b\xe3\xf1\xe9\xbf\x32\x1e"
+ "\x19\x96\x6f\x8f\xc7\x4f\x03\xff\x68\x3c\x42\x6b\xe2\xc9\x6f\x68"
+ "\x3c\x7a\x6b\xb4\x35\x71\x1b\xad\x89\x12\xc3\x9d\xff\x2f\x7b\x5f"
+ "\x1f\x17\x55\x95\xff\x7f\x18\xa0\xb0\x50\x47\x17\x0c\x4b\x0b\x4d"
+ "\x77\xb1\x7c\xaa\xaf\x96\xb6\xf6\x4d\x4b\x4b\x5b\x1f\xb0\x24\x51"
+ "\xd1\xd0\x7c\x18\x48\x8d\x14\x0d\x1f\x78\x4c\x5b\x24\x1f\xb0\xc0"
+ "\x50\x41\xb1\x2f\xee\x17\x4b\x8c\xf6\xab\x1b\xb6\x5a\xb8\x69\xa1"
+ "\xf1\x64\xe9\x86\x2e\xea\x68\xe8\xa2\xa1\x4d\x88\x32\xe0\xcc\xdc"
+ "\xdf\xe7\x73\xcf\x1d\xee\x3d\x33\xf7\xce\xcc\x1d\x51\xe4\xb7\xfe"
+ "\xc1\x4b\xe7\xde\x3b\x67\xce\xfd\x7c\xde\xf7\x7d\xde\x9f\xcf\xfd"
+ "\x9c\x73\x60\x2c\x42\x9b\x1e\x2e\xdf\xc7\x3f\x13\x70\xaf\x09\x3b"
+ "\x5e\x33\x6a\x8a\xab\xc0\x2f\x33\x39\x33\x1f\x0f\x0b\x7e\xa1\xfe"
+ "\x58\x62\xc8\xfd\x27\xb5\x7f\xe0\xcb\x38\x66\xe0\xb3\x81\xfe\x01"
+ "\x3f\xc1\xf3\x23\xb7\x57\xa0\xf4\x7d\x2d\xb4\x69\xc1\xe7\x04\x9f"
+ "\x11\x7c\x1e\x4a\x74\xa7\xf8\xbd\xd7\xbf\x0f\x2e\x22\xf8\xde\xf6"
+ "\xfb\xd0\x7d\xe0\xab\x0c\x62\x7e\x07\x7c\xb3\x18\x9e\x13\x0f\xd2"
+ "\x0d\xf7\x0c\xfc\x3e\x34\x19\xf5\x82\x16\x30\xdf\xc6\x0c\x7e\x32"
+ "\xd7\x07\xdc\xb7\x1a\x62\xac\xad\x8b\xc5\xe7\x66\x8b\xb0\x3f\x32"
+ "\x77\xcf\x84\x9d\x70\xdc\xcb\x04\x3e\x82\x67\x87\x79\x66\x9a\xf6"
+ "\x4d\xfe\x39\x88\x64\x9d\x23\x3e\x6d\x23\xa8\x8f\xcc\x92\x67\x66"
+ "\x4c\x04\x3e\x33\x09\xe0\xa3\xe3\x2a\x7d\x34\x89\xee\xd5\xd6\x09"
+ "\xb8\xda\xbf\x5f\x02\x8c\x93\xe0\xa3\xd0\xd5\x4a\x3e\x32\xe7\x4c"
+ "\xcc\x30\x6b\x67\x67\xe0\x3a\xef\x96\xb7\x26\x78\x58\x20\x7e\x6a"
+ "\x84\xb8\xf5\x7b\x83\x89\x2c\x9f\x4a\x34\x4b\x4f\x91\x7b\xca\x26"
+ "\xfc\x40\xca\xf4\x05\x04\xd7\x4c\xc6\xbc\x37\xee\x9d\x50\x66\x2a"
+ "\x00\xbe\x7a\x1f\xf7\xfd\xd2\x64\xf1\x9f\x0d\x64\xd9\x54\xe2\xc9"
+ "\xef\x25\x1a\x9a\x4d\x56\x03\x3e\xf3\x26\x67\x6b\x2c\x69\x73\x47"
+ "\x72\x5a\xdc\xf3\x85\x14\xe2\xfc\xa5\xf8\x25\xc4\xb7\x44\x57\x8c"
+ "\xeb\xc6\x9d\xc1\x75\x80\x4b\xeb\xa0\x4d\x03\xd7\x68\x86\x31\x63"
+ "\x4b\x12\x57\x80\xeb\xe0\xf7\xc3\x31\x82\x5f\xd3\x62\x72\x09\x6a"
+ "\x11\xcc\xff\x15\xc6\x6d\x02\xed\x35\x99\x5f\x5f\x0b\x8e\x79\x94"
+ "\x44\x62\x9d\xc5\xb4\x61\xd8\x2f\x9a\x8b\xa7\xff\xf6\xc3\x3d\x17"
+ "\x3b\xbd\xff\xe1\xfe\x38\x83\x57\x2a\xc4\xc3\xa0\xd1\xe0\xba\x29"
+ "\x5d\x39\x1a\x1b\x16\x95\x1d\x33\xf2\x79\x58\x43\xbc\xee\x9e\xd4"
+ "\xa5\xb8\xe6\x2e\xae\xa9\x8f\x63\xf6\xd4\xdf\x70\x3f\x64\x2e\x07"
+ "\xc6\xab\x4e\x31\xe1\xf9\x33\x0c\x1a\x71\x5c\x9e\x32\x12\xc6\xb3"
+ "\x82\x11\x41\x5c\x3c\xee\x3d\xf0\x15\xdc\x17\xc6\x41\x9f\x9c\x33"
+ "\xf2\x9c\xf2\xe9\x8c\x64\x0d\xe6\x89\x8c\xc0\x0f\xc5\xff\xfc\x2b"
+ "\xbf\xbf\xeb\x05\x8f\xb0\x49\x47\x42\x4d\x04\x7f\x3f\xa4\x17\xbe"
+ "\x6b\x99\xb2\xba\x41\x73\x26\xb0\xe1\x9e\x10\x9f\xf8\x2a\x71\x6f"
+ "\x4b\xe9\x1e\x96\xc8\x33\x79\x33\xa0\x4d\xe4\x99\x73\x09\x1a\xca"
+ "\x2d\x43\x31\x57\xe9\x63\xcb\x2d\x25\x35\x97\x49\x1c\xe0\xb8\x44"
+ "\x97\xcd\xef\x0f\xd1\x0e\xf8\xdd\xb2\x0c\xf8\xe4\x46\x50\xc7\x2c"
+ "\xe0\x13\xe4\x81\x2d\xc0\x1f\x96\x65\x01\xf7\xad\x6d\x24\xbd\xad"
+ "\x3c\x82\xda\x0b\xff\x9d\x0a\x18\x6d\x5f\x04\xc7\xc0\x4f\x16\xe0"
+ "\x75\xe0\x93\xa0\xcd\x4b\x49\x8f\xcd\x80\xd1\x2c\xe4\x11\xd0\xc5"
+ "\x63\xa3\x80\x47\xde\x01\x1e\x59\xcc\xef\x31\x1c\xb0\x45\x43\xf9"
+ "\xe3\xcb\x73\xc9\x9a\x54\xeb\x1e\xe3\xbc\x7d\xc3\x2e\x97\x22\x3e"
+ "\xc2\x13\xf8\xf9\x69\x66\x1c\x9f\x96\x85\x7a\x96\xd6\x01\x46\x36"
+ "\xbc\x3f\x14\x8f\xf1\xcf\xed\x3b\xba\xfb\x2c\x14\x6b\x43\xd1\x26"
+ "\x5b\xaf\x90\xfe\xfc\x3e\x9c\xbf\x06\xdc\xb7\x6e\x3e\xe9\xbd\xe5"
+ "\x0a\xe9\xb1\x65\x3e\x09\x82\xe7\x55\xb3\x05\xfa\x30\xed\x6d\x2d"
+ "\xe1\xf7\x61\xb8\x27\x44\x0b\xc7\x65\xf7\x61\x00\x5d\x1d\xb0\x05"
+ "\x9f\x99\xb7\x82\x9a\xfa\x64\x4a\xcd\x0a\x34\x83\xed\xe8\xba\x49"
+ "\x53\x47\xd0\xda\xe8\x71\x5a\xaa\xf3\xa7\xc6\xd0\xfa\xa4\x09\x7e"
+ "\x10\xab\xdc\x7b\xc9\x63\x6a\x1f\xee\x83\x30\x9f\xa8\xa5\xb8\xfe"
+ "\xb0\x70\x0e\xb4\xa7\x05\x7c\xd5\x37\x81\x24\x58\x3a\x7c\x97\x5b"
+ "\x16\x03\xda\x09\xd7\x49\x56\xf5\x1c\x4e\xe5\xe7\x99\x9b\x53\xb3"
+ "\x70\x8f\xf5\xa1\x96\x0f\xb2\x7a\x6f\xbd\x44\xfa\x73\x6f\x82\x3f"
+ "\x22\xe1\x5e\x2f\x91\x1e\x99\x97\xe0\x5e\xdf\xa1\xf7\x6a\xdd\x53"
+ "\xdd\x92\x74\x26\x08\xce\x39\xdc\xc3\xc8\xf0\x26\xee\x61\xf4\x27"
+ "\x3d\x70\xd8\xef\xb8\xee\x84\x94\xd4\xf0\x6b\x56\xd4\x97\x99\x4e"
+ "\x11\xfc\x5d\xcc\x1d\x95\xd5\x22\xa6\xa7\x75\x43\x2c\x5b\xb2\xd3"
+ "\xf5\xaf\x57\x02\xb6\xeb\x75\x84\x83\xff\x7f\x75\xce\x80\x6b\x44"
+ "\xf0\x9a\x4f\xef\x31\x25\x18\x75\xda\xd7\x70\x0c\xb1\x2f\xc1\x7c"
+ "\x30\x62\x1e\xcf\xf3\xb8\x87\xef\x95\x55\x9e\x27\xd8\x9e\xb4\x1d"
+ "\xf4\xbf\xb5\xad\x0b\x1e\xaf\x7b\x63\x5b\x88\x05\xcc\xf1\xe0\xb3"
+ "\x46\x7d\x5f\x80\xb5\xe1\x01\x5c\xa7\x79\xe5\xf4\xb3\x01\xd7\x1e"
+ "\xd1\x22\x06\x78\xac\x00\x7f\xe3\x9a\xa6\x1c\x17\xea\x09\x38\xc3"
+ "\x7e\xde\x07\xfe\xee\x6f\xc5\x05\x1c\xf3\xb3\xc5\x46\xbb\x44\x2d"
+ "\xc6\x34\x7e\xf8\x7f\x57\xf1\xa1\xce\x7f\xaf\x7b\x29\xd6\xbd\xf5"
+ "\x98\xc8\xf3\x25\xf2\xa6\xf9\xaa\x84\x33\x6b\x28\x67\x22\x27\x59"
+ "\x79\x93\xe7\x26\x7e\x1d\xfd\x02\xac\x91\xd5\xf1\x7d\x54\xc9\x9b"
+ "\x25\x35\x22\x6f\x8e\x8d\x92\xf0\x66\x0d\xd7\x68\xe9\x29\xc7\x9b"
+ "\xe1\xde\x2c\x6f\x86\xb7\x61\x79\xf3\x8d\x79\xb6\xbc\x69\xcf\x99"
+ "\xe1\xa3\xe4\xf8\x12\xe2\x98\x47\x2e\x79\xbc\xd1\x45\x99\x2b\xc3"
+ "\xa3\xd5\x73\xe5\xf4\x95\x2c\x57\x86\x17\xfc\xff\xcb\x95\x33\x3a"
+ "\x33\x5c\xa9\x75\x91\x2b\x2f\xf1\x5c\xe9\xc7\xfd\x02\xcf\x84\xc0"
+ "\x1f\x5b\x22\x15\xb8\x32\xd2\xc9\xb3\xf0\xa6\x12\x57\xce\x78\x9b"
+ "\xe5\xca\x19\x39\x2c\x57\xce\x98\x24\x72\xa5\x70\xae\x59\xb8\x72"
+ "\x46\x54\xcb\x70\xe5\x8c\x28\x9e\x2b\xaf\x20\x57\xbe\x31\xc6\x39"
+ "\x57\x86\x2f\x97\xe7\x4a\x38\xce\x73\x65\xf8\x72\x91\x2b\x4f\x39"
+ "\xe1\xca\x99\x4f\xa8\xe0\x4a\x3f\x9e\x2b\xb5\x0a\x5c\x19\x09\xb6"
+ "\x12\x70\xc1\x63\xcf\x06\x1b\x02\x57\x06\x34\x71\xa5\x0b\xf8\x50"
+ "\xe7\xbf\x99\x8a\xfb\x85\x21\x57\x5a\x52\xa9\xbe\x44\xae\xe4\x3a"
+ "\x09\x5c\x39\xd7\x44\x96\x9e\x00\x8e\x3c\x76\x89\xdf\x6f\x83\xaf"
+ "\xe7\x85\xbf\xe5\x93\x90\x8b\x96\x44\xed\x02\x7b\x95\xe9\xf3\x79"
+ "\x6e\xe2\xe7\x64\x8d\x46\xae\xca\x87\x6b\x33\x9a\x74\x27\xcf\x9d"
+ "\x27\x04\xee\x0c\x13\xb8\x73\xda\x4d\x70\xe7\x64\xf4\xe5\xac\x61"
+ "\x0d\x1a\x2b\x77\x7e\x00\xdc\x39\x8b\xd7\x0f\xf8\x5e\x97\x72\xa7"
+ "\x6e\xbf\xb5\x5f\x98\xd3\x2c\x8b\xde\x44\x68\xbf\x6a\xed\x79\xf4"
+ "\x65\xbe\xbd\xf4\xc2\xc8\x1a\xd2\xc4\xa5\x61\x22\x97\x42\x5b\xf3"
+ "\x94\x79\x74\xd6\xbe\x26\x1e\x4d\x02\x1e\x3d\x2d\xe1\x51\x88\x9b"
+ "\x3e\x45\xce\x03\x1e\xad\xe7\x79\xf4\x4b\x81\x47\x67\x97\x1c\x09"
+ "\x03\x1e\x7d\xd9\xca\xa3\xb3\x89\x31\xe9\x4c\xa0\xf1\x3d\xe7\x3c"
+ "\x5a\xcf\xf3\x68\xd4\xad\xe7\xd1\x83\x36\x3c\x0a\xb1\x2b\xee\xab"
+ "\x2e\xcb\xa3\x56\x3c\xf2\x3c\x9a\x20\xf2\x28\x6f\xd7\x39\x11\xa5"
+ "\xe1\x60\xf7\xf0\x28\x3e\x76\x6b\xe2\xd1\xa8\x7c\xca\xa3\x70\x8c"
+ "\xcf\x9f\x2c\x04\x1e\x05\xfc\xc5\x97\xc0\x7d\xc3\xf3\x02\x7d\xd4"
+ "\x22\xbf\x6e\x85\x67\x06\x6d\xd4\xc4\xa7\x91\xf0\xcc\x20\xc7\x5c"
+ "\x85\x67\x06\x78\x74\xda\x35\x2d\xe1\x9f\x97\xf7\xe0\x79\xb9\xa4"
+ "\xb0\x07\x98\xb5\xe6\x56\x91\x4f\xe7\x1c\x60\xf9\x74\x4e\x1d\xcb"
+ "\xa7\x73\x76\x88\x7c\x2a\x9c\x43\x3e\x05\x9f\x81\x7d\x72\x91\x53"
+ "\xdd\xe3\xd3\x39\x85\x4d\x7c\xaa\x11\xf8\x34\xd2\x39\x9f\xf2\xef"
+ "\x05\x15\xf8\x54\xca\x0d\xca\x7c\x3a\xa7\x50\xe4\x53\x5d\x56\x13"
+ "\x9f\x56\x28\xf1\xe9\xac\x83\xf2\x7c\x0a\xc7\x79\x3e\x9d\x75\xb0"
+ "\x89\x4f\x2b\x64\xf8\xf4\x65\x29\x9f\x46\xac\xa1\x7c\x9a\x4f\xd7"
+ "\xc8\x00\x4e\x2d\xad\x03\x7c\xe0\x33\x17\x9d\xc1\x73\xaa\x05\x38"
+ "\x15\xf7\x45\xc5\x7d\x61\xb0\x8e\x5e\x8e\x53\x29\xe7\xea\x09\xf2"
+ "\x2a\x3e\x9b\xf1\x63\x20\xde\x85\xb1\x08\x6c\xc2\x8f\xbd\x56\xfb"
+ "\x6d\x95\xf0\xeb\xeb\x4b\xb4\xa8\xed\x18\xac\x58\xac\x58\xb9\x1a"
+ "\x84\x75\xc0\x0c\x56\xd4\xf9\x32\x62\xb5\x12\xb7\x2a\xc5\xee\x47"
+ "\x30\x76\x0f\x21\x9a\x65\x21\xc0\xaf\xa1\x18\xbb\xe7\xda\xc4\xee"
+ "\xb9\xf6\xb1\xfb\x71\xc7\x3c\xaa\x2a\x76\x7f\x0d\x7d\x18\xb9\x8a"
+ "\xe5\xd1\xc8\x35\x2c\x8f\xce\x6f\x83\xfd\xa2\x3c\x9e\x2b\x1f\xbb"
+ "\xf3\xcf\x79\xe4\x89\xa6\xd8\xbd\x82\xe5\x4f\x31\x76\x9f\xb7\x57"
+ "\x99\x47\xdf\xf4\x62\xf4\xe8\x34\x81\x47\x67\x08\x3c\x3a\x43\xe4"
+ "\xd1\xef\x7f\xb0\xea\xd1\xb9\xdd\x0e\x57\x48\x79\xf4\xcd\x91\x4d"
+ "\x3c\x5a\x69\xcf\xa3\x56\x0e\x45\x3e\xc5\x76\x30\x97\xb5\x13\x78"
+ "\xfa\xb3\x19\x51\x1a\x9a\xab\x0d\x47\xdb\xf9\xd8\xe6\x6a\x4b\x6a"
+ "\xae\x91\xb8\x30\xe4\xd3\x0c\x9e\x4f\xdb\x7b\x90\xe9\xc0\x7d\xed"
+ "\x70\xde\x40\x26\xbe\xd3\x5f\x4c\xf7\x55\xc2\xfc\x92\xe5\x1d\xba"
+ "\x47\xa1\x35\xcf\x04\xf7\xcb\xbf\xcb\x9f\x7a\x4a\xe0\x54\xdc\x7b"
+ "\x1c\x30\xb7\xf9\x3a\x70\xea\x62\x19\x6d\xba\x0c\x38\x75\xa9\x44"
+ "\x9b\xc2\xb3\xff\xe5\x0c\x5b\x4e\x9d\xbb\xa7\x14\xb1\x82\x9c\xca"
+ "\xc4\xf1\xb9\x77\x40\x1c\x3f\xaf\x2d\xcb\xa5\xf3\x86\xb2\x5c\x3a"
+ "\xf7\x9a\xc8\xa5\xc2\xb9\x66\xd1\xa6\xf3\x7c\x5b\x46\x9b\xce\xf3"
+ "\x15\xe3\xf8\x79\x17\x9b\xb8\xf4\x98\x12\x97\xbe\xe9\x2b\xcf\xa5"
+ "\x70\x9c\xe7\xd2\x37\x7d\x9b\xb8\xf4\x98\x4c\x1c\xcf\x70\xe9\xfc"
+ "\x12\xca\xa5\xb9\x54\x9b\x56\x58\xb5\x69\x6e\x2b\x8c\xe3\xe7\x17"
+ "\xab\x8d\xe3\x8f\xd4\x50\xfe\x44\x7e\xb2\x72\xa8\x18\xc7\xe7\x2a"
+ "\xc7\xf1\x4e\x38\x54\x95\x16\xe5\x39\xf4\xad\x12\x96\x43\xdf\x3a"
+ "\xca\x72\xe8\xc2\x61\xb6\x1c\x6a\xcf\x9f\x51\x1d\xe4\xb8\x93\xc6"
+ "\xf1\x0b\x0c\xca\xbc\x19\x35\x44\x3d\x6f\xbe\x3d\x89\xe5\xcd\xa8"
+ "\x84\xff\x0c\xde\x7c\xfb\x32\xc3\x9b\x5a\x17\x79\xf3\xb6\xc4\xf4"
+ "\x0b\x6c\xf2\x9f\x0b\x6c\xf2\x9f\x0b\x24\xf9\xcf\x05\xcd\x98\xff"
+ "\x5c\xd0\x42\xf9\xcf\x05\xc3\x45\x0d\xba\xb0\x9b\x73\xde\x8c\x1a"
+ "\x2e\xcf\x9b\x70\x9c\xe7\xcd\xa8\xe1\x22\x6f\x3a\xd3\xa0\xd1\xde"
+ "\x2a\x78\xf3\x0e\x8f\xe9\xa3\x1d\xe6\x3f\xe5\x62\x7a\xe4\x4d\x9e"
+ "\x2f\x2b\x6c\x62\xfa\x10\x69\x4c\x9f\x2b\xc6\xf4\x23\x29\x6f\x95"
+ "\x99\x52\xd9\x98\xbe\xd9\x79\x74\x91\xbf\xb1\x29\x1f\x9a\x02\x3c"
+ "\xba\xa8\x33\xde\x9b\xb1\x29\x1f\x1a\x93\x65\xed\x17\x8d\xe9\x3f"
+ "\x20\xb4\x5f\x32\x31\x3d\x5f\x3b\xbc\x28\xa2\x29\xa6\xaf\xb0\x8d"
+ "\xe9\x63\xc6\x28\x73\xea\xa2\x54\xd9\x98\x1e\xe3\x6f\x9e\x53\xa3"
+ "\x78\x4e\xbd\xbe\x41\xca\xa9\x8b\xf3\x78\x4e\x7d\xd1\xca\xa9\x8b"
+ "\x8e\x19\xe1\xd9\x34\xde\xe3\x9c\x53\xb1\x1d\x91\x53\x75\xb7\x87"
+ "\x53\x0b\x5d\xe7\x54\xe9\x9c\xd5\x2f\xe1\xde\x9b\x38\x95\xb7\xf1"
+ "\x3b\xa3\x4a\xc3\x91\x53\x75\x36\xf1\x7d\xae\x7c\x7c\x7f\x98\x68"
+ "\xd0\x3e\xd6\xf8\x1e\x7d\xc0\xf3\xcd\x2d\x8d\xef\xdf\xd9\xc6\x72"
+ "\xeb\x3b\xc7\x58\x6e\x7d\x67\x95\xc8\xad\xc2\xb9\x66\x89\xef\xdf"
+ "\xc9\x6e\x99\xf8\xfe\x9d\x6c\x91\x5b\x63\x62\x9d\x73\xeb\xa2\x0c"
+ "\x79\x6e\x5d\x94\x41\xb9\x75\x51\x86\x43\x6e\x7d\x51\xca\xad\x4b"
+ "\xe6\x59\xb9\x55\x8c\xef\x01\x1f\xf8\xfc\x45\xa7\xba\x1f\xdf\x8f"
+ "\x6a\xe9\xf8\x7e\xc9\x5c\x55\xf1\xfd\x06\xe0\x59\x88\xc5\x97\x1d"
+ "\x85\xf8\x7e\xbc\x10\xdf\x57\x66\xdb\xc4\xf7\xd9\x76\xf1\xfd\xf2"
+ "\xf1\x02\xa7\xc2\x33\xc5\x73\xea\x8c\x5c\xf7\xe3\xfb\x57\xd0\x87"
+ "\x4b\x23\x58\x4e\x5d\x3a\x8f\xe5\xd4\x58\x33\xf6\x8b\x72\x7a\xb6"
+ "\x7c\x7c\xcf\x3f\xe7\x4b\xf7\x32\xf1\x3d\xf4\xcf\x3e\xbe\x8f\xcd"
+ "\x63\x38\x75\x9a\x94\x53\x97\x56\x31\x3a\x15\xee\x0b\x39\x75\xc7"
+ "\x69\xca\xa9\x9f\x9c\x96\x70\xea\xd8\x4f\x04\x4e\x5d\xee\x7f\x78"
+ "\x82\x94\x53\x97\x05\x59\x39\x95\xe7\xcb\x69\x46\x4d\x7c\xa8\x7d"
+ "\xdd\x09\x5f\xef\x83\xb5\x40\xd0\x36\xce\x15\xc3\x36\xf3\x4e\xeb"
+ "\x9c\xd7\x9b\x84\xca\xd7\x9b\x94\x45\xeb\x49\x71\x55\x2a\x5f\x67"
+ "\x92\x89\x75\x26\x89\xa4\x5b\x66\x23\x5d\x2b\x80\x5f\xe7\x50\x61"
+ "\x9d\x80\xa9\x93\x44\x9e\xc5\x9a\xac\xcd\x58\x93\x75\x9d\xd6\x00"
+ "\x81\xbf\xed\xd7\x06\xb0\xea\x26\xe0\x83\xbd\xa7\x6d\x79\x76\xf9"
+ "\x8e\x52\xc4\x4f\x98\xce\x26\xe6\xcf\xbe\x03\x62\xfe\x58\x0f\x96"
+ "\x5f\x63\x07\xb0\xfc\xba\xfc\xa2\xc8\xaf\xc2\xb9\x66\xd1\xae\xb8"
+ "\xbc\x7f\x4b\x68\xd7\x58\x22\xc6\xfc\xb1\xa7\x9a\xf8\xb5\x5c\xc2"
+ "\xaf\xa7\xa5\xfc\xba\xb4\x86\xe7\xd7\xd3\xb6\xfc\x0a\xc7\x79\x7e"
+ "\x5d\x5a\xd3\xc4\xaf\xe5\x36\x31\xff\x69\x5b\x7e\x8d\x3b\xc0\xf3"
+ "\x6b\x65\xb6\x8d\x76\xcd\x76\x1e\xf3\x57\xde\x69\x31\x7f\x5c\xa1"
+ "\xaa\x98\x1f\x39\x75\x2e\xe5\x54\xe4\x2c\x2b\xaf\x8a\x31\x7f\xb6"
+ "\x62\xcc\xef\x8c\x57\x55\x69\x55\x9e\x57\xe3\x0f\xb0\xbc\x1a\x7f"
+ "\x88\xe5\xd5\x77\x47\xd9\xf2\xaa\x3d\xa7\x26\x78\xcb\xf1\x29\x8d"
+ "\xf9\x93\x8c\xca\x5c\x9a\xd0\x5f\x3d\x97\x26\x4e\x67\xb9\x34\x21"
+ "\xfa\x3f\x97\x4b\x13\xaf\x31\x5c\xaa\x75\x91\x4b\x6f\x4b\x1e\x20"
+ "\x69\x0c\xcb\xa5\x49\x09\x2c\x97\x26\x0d\x14\xb9\x54\x38\xd7\x2c"
+ "\x5c\x9a\x34\xba\x65\xb8\x34\x69\xb4\xa8\x55\xdf\xed\xe5\x9c\x4b"
+ "\x13\x06\xc9\x73\x29\x1c\xe7\xb9\x34\x61\x90\xc8\xa5\xa7\x9c\x70"
+ "\xe9\x8a\xb6\x2a\xb8\x94\xcd\x03\xd8\x72\x69\x8b\xe7\x01\x56\xf8"
+ "\xaa\xca\x03\x58\xb9\x74\xbc\x7d\x1e\x00\xf9\x95\xcf\x03\x80\xbd"
+ "\xac\x1c\xc6\xe7\x01\x86\x53\x2e\x2b\x33\x25\x33\x79\x80\xe6\xe7"
+ "\xd6\x95\x5d\x8d\x4d\xf9\xd4\x24\xe0\xd6\x95\xdd\x78\x6e\x6d\xca"
+ "\xa7\x26\xef\xb5\xf6\x8b\xe6\x01\x52\x08\xed\x97\x4c\x1e\xe0\x79"
+ "\xbe\xbd\xb7\x99\x3c\x80\x84\x6b\xa1\xad\x08\x65\x9e\x5d\x99\xc1"
+ "\xe4\x01\xce\x89\x3c\x7b\x1d\x6b\xd4\x81\x07\x79\x9e\xed\x24\xe5"
+ "\xd9\xf7\x0e\xf3\x3c\xfb\xbc\x95\x67\x57\x56\xd6\xc3\xb3\x59\xaf"
+ "\x96\x67\x71\x1e\xc1\xe9\xf0\x96\xe1\xd9\x02\x15\x3c\x2b\xc9\x0d"
+ "\xec\x05\x7b\x34\xf1\x2c\x6f\xf7\x3f\xcf\x2a\x0d\x43\x9e\x0d\xb7"
+ "\xc9\x0d\x64\xcb\xe7\x06\x0e\xb5\x44\x6e\xe0\xcf\xfb\x59\xbe\xfd"
+ "\xb3\x81\xe5\xdb\x3f\x6f\x17\xf9\x56\x38\xd7\x2c\xb9\x81\x3f\xef"
+ "\x6b\x99\xdc\xc0\x9f\xf7\x89\x7c\x9b\xbc\xd1\x39\xdf\xae\xcc\x96"
+ "\xe7\x5b\x38\xce\xf3\xed\xca\x6c\x87\x7c\xfb\xbc\x94\x6f\x57\xad"
+ "\xb2\xf2\xad\x98\x1b\xc8\x16\x72\x03\xc9\xce\x73\x03\x95\x0a\xb9"
+ "\x81\x11\x2d\x9d\x1b\x58\x95\xac\x26\x37\xd0\xb0\x81\xd6\xed\x2f"
+ "\xc3\xba\xfd\xa9\xc0\xbf\xc1\x3f\x80\x0d\x9c\xd7\xed\x2f\xb7\xd6"
+ "\x9f\x86\x67\x08\x3c\x9b\x21\x9b\x1b\x38\x52\xad\x9c\x1b\x38\x72"
+ "\x4c\x5a\x7f\x9a\xb2\x92\x7d\x6f\x95\xb2\xca\xfa\xde\xea\xc8\x3f"
+ "\x91\x67\xd7\xae\xc7\xcf\x96\xb4\x84\x6c\xba\xde\xf6\xda\x54\xec"
+ "\xa7\x5c\x1d\xff\x97\x16\xe9\xbb\xac\x94\xf3\x4d\xb9\x82\x72\xe4"
+ "\xdb\x0c\x62\xe1\x74\xf7\xe0\x7a\xdf\x7c\xae\xe0\x35\xc4\xde\xda"
+ "\x61\x52\xde\xfd\xea\xa4\x94\x77\xdf\xd7\x5a\x79\xd7\x0c\xbc\xbb"
+ "\xff\x5c\x06\xcd\xbf\x4e\xa6\xb5\xa9\x3b\x27\x4b\x6a\x53\x7f\xf8"
+ "\x87\xc0\xbb\xab\xdb\x1e\xd6\xc3\xfd\x3b\xaa\x9f\x82\xef\xef\x3a"
+ "\xe9\x6a\x0d\x6a\x86\x6c\xed\x94\xc0\x4f\xb2\xf5\x53\xd0\x57\x6d"
+ "\x96\xf0\xac\x9a\xe1\x39\xcd\x92\xd4\x4f\x65\x2e\x85\xe7\x59\x98"
+ "\x57\xe2\xb0\x0e\x75\xb2\x58\x87\xca\xa5\xc5\x57\xe2\xf8\x66\x49"
+ "\x4f\xc8\x6e\xe4\x74\x9e\x9c\x5f\x7c\x25\xfe\xfe\x8d\x1b\x30\xee"
+ "\xbc\x10\xea\x49\xe3\xba\xf8\x42\xe0\x9e\x76\xd4\xee\xab\x47\x9a"
+ "\x61\xac\x31\xc3\x58\x63\x49\x8b\x2f\x34\xa1\x36\xd9\x10\x7f\x30"
+ "\x13\xe2\x3c\x53\x12\xbf\xff\xe0\x7d\x6b\x21\xd6\xdb\x8a\x71\xde"
+ "\x15\x78\x36\xe2\x83\x34\xd8\x1f\x2b\x8f\xb6\xaf\x86\xfb\xb8\xe2"
+ "\x58\xcb\x99\x7e\x15\x79\xb4\xf0\xe5\x23\xf0\x9b\x6b\x9e\x2d\x45"
+ "\xec\x86\x8a\x73\x0a\x78\xcd\xac\x50\x2b\x8b\x7d\xa1\x6b\x2c\x02"
+ "\x16\x9a\x21\x27\x21\xed\x0f\xcb\xeb\x6b\xd2\x59\x5e\x5f\x53\xc4"
+ "\xf2\xfa\x9a\x58\x91\xd7\x85\x73\xc0\xeb\xe0\x37\x5e\x47\xc3\xd8"
+ "\xe7\xa6\x8e\x5e\x93\x66\xe5\x75\x8b\xc0\xeb\x5b\x5c\xe0\x75\x87"
+ "\x3a\x5a\xc2\x4b\xca\xbc\xbe\x26\x4d\xcc\x49\xac\x7d\x5b\xb6\x46"
+ "\xf6\xa4\x94\xd7\xdf\x0f\xe0\x79\xfd\xa4\x2d\xaf\xc3\x71\x9e\xd7"
+ "\xdf\x0f\x50\x9c\x4f\x70\xd2\xf6\x7d\xda\xba\x10\x9e\xd7\x2b\x84"
+ "\x1a\xd9\x72\x15\xf3\x09\x2a\x28\xa7\x5b\xb9\x1c\xf3\x55\x2d\x9b"
+ "\x93\x58\x37\x41\x4d\x4e\x82\xe7\xf2\x1a\xca\xe5\xc8\x8d\x56\x3e"
+ "\x77\x65\x3e\x81\x33\x3e\xb7\xea\x66\xe4\x73\x25\xdd\xcc\xf2\x79"
+ "\x6a\x08\xcb\xe7\xa9\x93\x58\x3e\x4f\x0b\x61\xf9\x3c\x6d\x82\x2d"
+ "\x9f\xdb\x73\x79\xea\x0e\x39\x1e\x8f\x7a\x0d\x73\x14\x69\x5e\xca"
+ "\x1c\x9e\x7a\x4c\x3d\x87\xaf\x3f\xfa\x1f\xc7\xe1\x5a\x5b\x0e\xff"
+ "\xc0\x17\x39\xc8\xfc\x9e\x0d\x87\x47\x0a\x1c\x2e\xf0\xc8\xd6\x4b"
+ "\x82\x16\xb6\xe5\xf0\x1a\xb8\x0f\x27\xf1\xb8\xe9\x17\x5b\x0e\xff"
+ "\xd0\x83\xe1\x70\xad\x13\x0e\x8f\xa4\x79\x10\xa6\x2e\x57\x21\x17"
+ "\x02\xf7\xa1\xcd\x52\xd0\xe6\x56\x9b\x49\xfb\xc3\x72\xf8\x87\x93"
+ "\x58\x0e\xff\x70\x35\xcb\xe1\x1f\x0e\x13\x39\x5c\x38\xd7\x2c\xda"
+ "\xfc\xc3\xd0\x66\xd7\xe6\x56\x7c\x38\xe4\xf0\x0f\x43\x45\x6d\x9e"
+ "\x36\xd0\x39\x87\xa7\x56\xca\x73\x38\x1c\xe7\x39\x3c\xb5\x52\x71"
+ "\x9e\x83\x1d\x87\xa7\xfb\xab\xe0\x70\x36\x17\x62\xe5\x70\x21\x17"
+ "\xb2\x55\x92\x0b\x31\x27\xd1\x5c\x48\xd6\x25\x8a\x8d\x76\x1e\x14"
+ "\xa7\x80\x9f\x80\x2d\x1a\xc7\xb1\x5b\x96\x5b\x79\x90\x74\x3f\x35"
+ "\x79\x10\x9e\xbf\x71\x8e\xc3\x24\xe0\xed\x72\x17\xe7\x38\x8c\xb4"
+ "\xce\x71\x48\x55\x98\xe3\x20\xf0\xf9\xb4\x9b\xe0\x73\x7e\x8e\xc3"
+ "\x86\x9e\x6c\x8e\x79\x43\x2f\x6b\x8e\x99\xf2\xf9\xa6\xc1\x2c\x9f"
+ "\x6f\x1a\xd4\x34\xe7\x01\x38\xbf\x2c\xea\x03\xbb\x39\x0f\x4d\xdc"
+ "\xce\xe7\x41\x37\xac\x2a\x7c\xad\x8a\x34\xf1\x7b\x98\xc8\xef\x17"
+ "\x3c\x36\x5e\x64\xb8\xfd\x9c\x94\xdb\x37\xe4\x33\xdc\x7e\x3a\x83"
+ "\xad\x8f\x38\x17\x25\xe1\x76\xeb\x9c\x87\x8f\xf2\x0e\x57\x3a\xe1"
+ "\x76\xf8\xbe\xeb\x73\xc4\x9a\x97\xdb\xad\xf3\x1b\x64\xb9\x5d\x3a"
+ "\xbf\x41\x52\xff\x80\xdc\xce\xef\x93\xe1\x6f\xc3\xed\xcb\x74\x1a"
+ "\xf3\x37\xf0\x3c\x00\xaf\xe3\x33\x62\xe6\x80\xdb\x79\x7b\x7f\x54"
+ "\x2d\xe5\xf6\x1b\x49\x94\xdb\x37\x5f\xba\x79\x6e\x6f\xd2\xc3\x52"
+ "\x6e\x7f\x11\xb9\x3d\xe3\x3c\x9d\x7f\x91\xe0\xda\xfc\x0b\x9b\xfa"
+ "\x8c\xcd\x2e\xe4\x5f\x1c\x72\xbc\x4c\xbf\x58\x8e\xdf\xf8\x2c\xcb"
+ "\xf1\x1b\xa3\x58\x8e\xdf\xd8\x53\xe4\x78\xe1\x5c\xb3\xe8\xf4\x8d"
+ "\x43\x5a\x26\xff\xb2\x71\x88\xc8\xf1\x9b\x3a\x3b\x9f\x7b\xb1\xa1"
+ "\x40\xbe\x36\x03\x8e\xf3\x1c\xbf\xa1\xc0\xe1\xdc\x0b\x26\xdf\xbd"
+ "\xb9\x8d\xec\xdc\x8b\xf2\xdb\x57\x9b\x21\xc5\x8a\x6d\xfe\xc5\xfd"
+ "\xdc\xf7\x66\x1f\xb5\xf9\x17\x9c\x7b\xb1\xec\xb8\x64\xee\x45\xa5"
+ "\xf3\xb9\x17\xcb\x43\x5c\xcc\xbf\x38\xa8\xcd\x38\x12\x2c\xad\x77"
+ "\xcb\xf4\x66\xf9\x3d\xb3\x4d\x13\xbf\xbf\x82\xfc\x9e\xdd\x95\xe5"
+ "\xf7\xec\x2e\xd8\x4f\xb9\xb9\x18\x5f\x32\xef\x15\x33\x67\xb1\xb5"
+ "\x1a\x36\xf9\x97\x57\x10\x7b\x5b\x4b\x18\x7e\x3f\x2d\xe5\xf7\xcc"
+ "\x54\x39\xed\x8e\x79\x6f\xbe\xa6\x78\x9a\x64\x4e\xdb\x58\x6b\xfd"
+ "\x5b\xd6\xc6\xc3\xa1\x70\xff\x7a\x85\x5a\xb7\x69\xb4\xd6\x8d\xaf"
+ "\x6d\xc3\x3c\x38\xb4\xf5\xd9\xb4\x28\x4d\x5c\x38\x67\xc1\x5a\x37"
+ "\xdb\x3a\x37\xac\x7d\xc3\x5a\xb7\x12\x5d\xaa\x62\x9d\x1b\x62\x53"
+ "\xa9\xd6\x0d\xfa\xed\xc7\x73\xfd\x59\x81\xeb\x85\x5a\xb7\xcc\xc5"
+ "\x62\xad\x1b\xc3\xf5\x32\xf5\xc3\x7b\x4f\x27\xc8\xeb\xf8\x78\x91"
+ "\xeb\x1b\x51\xc7\xff\xd1\x26\x17\xc3\xfb\x20\xeb\xd8\x6d\xcd\xc5"
+ "\xf0\x5c\xbf\xe5\x70\x29\xe2\x38\x2c\x4a\x26\x17\x63\x5f\xe3\x7c"
+ "\xfb\x72\x31\x5b\xbb\xb1\x1c\xbf\x75\x02\xcb\xf1\x5b\xdb\x88\x1c"
+ "\x2f\x9c\x6b\x16\x8e\xdf\x1a\xd8\x32\xb9\x98\xad\x81\x62\x2e\x66"
+ "\xab\x59\xb6\xfe\x8e\xc9\xb1\x67\x66\xc8\xe7\xd8\x33\x85\xfa\xbb"
+ "\xcc\x0c\xc5\x39\x21\x76\xef\x34\xb3\xcf\xd2\x1c\xbb\x1b\x73\x42"
+ "\x2a\xef\xb4\x5c\x4c\xb6\x5e\x6d\x2e\x86\xaf\x6d\x3e\x8e\xf5\x21"
+ "\xea\xe6\x84\x38\xe3\xf6\x26\xed\xee\xe0\x1d\x26\xcb\xed\xdb\xce"
+ "\xb2\xdc\xbe\xed\x3c\xcb\xed\xdb\x2f\xb3\xdc\xbe\xbd\xc6\x96\xdb"
+ "\xed\x79\xfd\xe3\x81\x72\x9c\x1e\xf5\x0a\xe6\x62\xb6\x67\x2a\xf3"
+ "\xf9\xc7\xe1\xea\xf9\xfc\x7f\x22\xfe\xa3\xf9\x5c\x6b\xcb\xe7\xff"
+ "\x93\x73\x5b\xf3\x32\x3c\x9f\xe7\x6c\x64\xf8\x5c\xeb\x84\xcf\x6f"
+ "\x5b\x5e\x26\xe7\x37\x96\xcf\xb7\xf7\x60\xf9\x3c\xe7\x84\xc8\xe7"
+ "\xc2\xb9\x66\xc9\xcb\xe4\x18\x5a\x26\x2f\x93\x63\x10\x35\xfb\xf6"
+ "\x12\xe7\x7c\xfe\xb1\x4e\x9e\xcf\xe1\x38\xcf\xe7\x1f\xeb\x14\xeb"
+ "\xa9\xed\xf8\xfc\x2f\x79\x2a\xf8\x5c\xb6\x46\xe5\xce\xc8\xcb\xfc"
+ "\x65\xa7\xda\xbc\x8c\xd2\x3c\x15\xe4\x77\xb1\x3e\x45\x32\x4f\x65"
+ "\xa8\x75\x9e\x4a\x02\x5b\x9f\xd2\xec\xdc\xfe\xbf\xfb\x59\x6e\xff"
+ "\xdf\x03\x2c\xb7\x7f\x7a\x8a\xe5\xf6\x4f\x2b\xad\xfd\xa4\x79\x99"
+ "\x24\xbb\x79\x2b\x2c\xcf\xe7\x76\x2b\x7c\xa5\x8a\xc8\x71\x3d\xb4"
+ "\xb5\x46\x99\xe7\x73\x47\x2a\xf1\x3c\xd6\xab\x7c\x3a\x4d\x27\xc3"
+ "\xf3\x3b\xc6\xff\xff\xc0\xf3\x4a\x75\x28\x7c\x1c\x04\x1c\x8f\x7c"
+ "\xcf\xf3\xbb\xc0\xf5\xc8\xf3\xe6\xbf\xcb\xe5\x68\x76\xac\xbe\x55"
+ "\x3c\xaf\x9c\xa3\xf9\x64\x55\x69\x98\xc0\xf3\xae\xcc\xa1\x39\xc0"
+ "\xe6\x68\x32\x23\x6f\x75\x8e\xe6\x93\xb3\x2c\xdf\x7f\xea\xc7\xf2"
+ "\xfd\x27\x87\x45\xbe\x17\xce\x35\x8b\x7e\xff\x44\xdf\x32\x39\x9a"
+ "\x4f\xf4\x22\xdf\x7f\xba\xdf\x39\xdf\xe7\x06\xcb\xf3\x7d\xae\xb0"
+ "\x36\x5b\x6e\xb0\xeb\x7c\xbf\xb3\x89\xef\xed\xe7\xcf\x24\xb8\x5f"
+ "\x23\x33\xac\xa5\x73\x34\x3b\x15\xf9\xdf\xd1\xfa\x18\xee\xe7\x68"
+ "\x84\x39\x89\x33\xe4\xd7\xc7\x38\xec\xa0\x46\xe6\x70\xb1\x94\xeb"
+ "\xf3\x76\xb0\xb5\x88\x79\x79\xd6\x5a\xc4\xc3\xa5\xc8\xf5\x9f\x1f"
+ "\x67\xb9\xfe\xf3\x63\x4a\x39\x9a\xbd\x16\x69\x4d\xe2\xae\x36\x6c"
+ "\x8e\x26\x9b\xcd\xd1\x8c\x45\xec\x7d\xbe\x52\x99\xeb\x77\x0d\x60"
+ "\x6b\xc0\xe9\x1c\xc5\x1d\xd3\x84\x1a\xf0\x69\x92\x1a\xf0\x97\x3f"
+ "\x16\xb8\xfe\xb3\xf1\x45\xe5\x26\xa2\xa6\x0e\xf1\xe6\x6b\xbd\x93"
+ "\x65\x6b\x10\xf9\x31\xc0\x41\x1d\xe2\xeb\x27\xb4\x58\xd3\x1c\xb4"
+ "\x65\xb1\xa4\x0e\xd1\xc1\x7a\xc6\x0c\xff\x4f\x8b\x52\xe4\xff\x06"
+ "\x4e\xe4\x7f\xcb\xd3\x62\xde\xc6\x82\x3a\x9f\xf7\xcb\x67\xab\x6f"
+ "\x55\xde\x46\x2e\x4f\x52\xf8\x3c\xf2\x7f\x7e\x22\xd5\xf9\xba\x3b"
+ "\x2c\x6f\x93\x7f\x82\xe5\xfd\xcf\x7d\x59\xde\xcf\x3f\x20\xf2\xbe"
+ "\x70\xae\x59\x6a\xd1\xf3\x2b\x5a\x46\xe7\xe7\x57\x88\x79\x9b\xcf"
+ "\xf7\x38\xe7\xfd\x5d\x43\xe4\x79\x7f\xd7\x10\xca\xfb\xbb\x86\x38"
+ "\xcc\xdb\x30\xb5\x91\x7f\xdd\x78\xd3\x79\x1b\xab\xce\x6f\xf1\x79"
+ "\x3d\x7f\xcd\x50\x93\xb7\x69\x9a\x93\x7e\x53\x79\x1b\x79\xbe\xb7"
+ "\x6a\xfb\xc3\x0e\xde\xb9\xb2\x7c\xff\x7f\x1b\x59\xbe\xff\xbf\x2c"
+ "\x96\xef\xbf\xd8\xcb\xf2\xfd\x17\x05\x72\x79\x1b\x96\xeb\xff\xef"
+ "\xb2\x1c\xcf\x47\x8d\xc5\xbc\xcd\x17\x3a\x65\x8e\xdf\x1d\xa0\x9e"
+ "\xe3\xf7\x0c\xbc\xcb\xf1\x36\x1c\xaf\xb5\xe5\xf8\x3d\x51\xb7\x55"
+ "\xe3\xf3\x1c\xff\xb7\x59\x0c\xc7\x37\x63\x2e\xc7\x95\xf9\x24\xca"
+ "\xda\xfe\x6f\x36\xf5\xef\x7f\xb3\xa9\x7f\xff\x9b\xa4\xfe\xfd\x6f"
+ "\x86\xe6\xe3\xf8\xbf\x35\x7f\xfd\xbb\x4b\x1c\xff\x37\x49\xfd\xfb"
+ "\x17\x1b\x9d\x73\xfc\xee\x40\x79\x8e\x87\xe3\x3c\xc7\xef\x0e\x74"
+ "\xa8\xed\x19\x8e\x2f\x88\xbd\x15\xb9\x9c\x96\x99\x6f\x54\xb0\x5c"
+ "\x4d\x3e\xc7\xd1\xba\x23\x8a\xf9\x9c\x41\xd6\x7c\x4e\x94\x42\x3e"
+ "\xa7\xb9\x38\x7f\xef\x1a\x96\xf3\xf7\xae\x67\x39\x7f\xff\x01\x96"
+ "\xf3\xf7\x17\xb2\xf9\x9c\x05\x76\xf9\x1c\x96\xff\xf7\xfe\x56\x38"
+ "\x56\x9a\xcf\xc9\x96\xe4\x73\xf6\xbf\xad\xcc\xff\x5f\x2a\xf2\xff"
+ "\x75\x9e\xff\xc3\x65\xf8\xff\xef\xff\x21\xfc\x1f\x7e\x13\xfc\xff"
+ "\xf7\x16\xe0\xff\x7d\xf3\x68\x8e\xc7\xc5\x75\x52\xf6\xaa\xcf\xf1"
+ "\xdc\xdc\x38\xb0\xef\x10\x3b\x0e\xec\x33\xb2\xe3\xc0\xbe\x3c\x71"
+ "\x1c\x10\xce\x35\xcb\x38\xb0\xef\x60\xcb\x8c\x03\xfb\x0e\x8a\xe3"
+ "\xc0\xfe\x6d\xce\xc7\x81\x2f\x15\xc6\x81\x2f\x85\x71\xe0\x4b\x15"
+ "\xe3\xc0\x57\xeb\x95\x73\x3c\x51\xee\xe7\x78\x06\xb7\xf4\x3c\xa8"
+ "\xaf\x52\x55\xe5\x78\x36\x24\x26\x14\xe3\x1a\x29\x67\x89\x66\xd9"
+ "\x74\x6b\x8e\xa7\xd0\x26\xc7\x53\x68\x97\xe3\x59\x72\x56\xe0\xff"
+ "\xd1\xc2\x7c\xd3\xb1\x37\xb1\x46\x0a\xbf\x97\xf4\xd7\x6b\xd8\xba"
+ "\xf9\xaf\x79\xfe\x17\xd7\xef\xfb\xa6\x2b\xf6\x8b\x8e\x3f\x85\x0e"
+ "\xd6\x40\xfd\xfa\x14\x93\xd3\x19\x2d\xb7\x46\xca\x3f\x98\xba\x1b"
+ "\x76\xbe\x69\xa1\x0f\xc3\xf7\x63\xe9\x7c\xd3\x4f\xe4\xde\xd3\x36"
+ "\xad\xc9\x7f\xa0\x33\xbf\x26\x7f\xd3\x5a\x7e\x85\xa3\x5d\x5a\x4b"
+ "\x7a\x9a\xb0\x96\xf4\xe9\x16\x58\x4b\xda\xd5\x35\xf9\x4f\xdb\xae"
+ "\xdf\x77\x60\x4f\x59\x71\x21\x29\x45\x8c\x84\xd9\xae\x7d\x5a\x28"
+ "\x3f\x77\x5f\x23\xcc\xdd\x9f\x7f\x6b\xd6\x41\xc1\xfe\xf0\x63\x7e"
+ "\xc7\xef\xb2\xf3\xe2\x0c\x7c\x7f\x70\xdf\x6e\xf0\xf3\xe0\x62\xc0"
+ "\xaa\x05\xf9\x74\x01\xf2\xe9\x3f\xe6\xf2\xd7\x9e\x05\x2c\x74\x9c"
+ "\xe0\x83\x38\x5e\x6b\x21\xbe\x51\x8b\x91\x5b\xff\xc1\xd7\x7d\x81"
+ "\x8c\x00\x6e\xa5\xd7\xc5\x9e\xe5\xcc\xe6\x8e\x61\xf8\x2c\xde\xbb"
+ "\x6b\x7e\xb9\x77\xa9\xbe\x0e\x9e\x8b\x4b\xfc\x3e\xae\x65\xa6\xfa"
+ "\x42\xf4\xc5\x57\xf3\xcb\xbd\x38\xe0\xdf\xad\xb3\x89\x8f\xba\xe7"
+ "\xf4\x1f\xfc\x3e\xf5\xfc\xdc\xf5\x8e\xdf\xed\xc4\x75\x40\xac\xda"
+ "\xca\xf2\xab\x98\xdf\xca\x02\xfb\x58\x38\x3a\xf6\xbd\x1e\x41\x79"
+ "\x03\x7e\x2f\x08\x6c\xc9\xd7\xd8\x22\x6f\xf0\x7b\x58\x01\x6f\x6c"
+ "\xa9\x15\xdf\x63\x63\xfb\x68\x23\x9a\x47\xf9\x87\x58\xff\xa2\x57"
+ "\xe2\xd6\x42\xad\x3c\xb7\x16\x6a\x29\xb7\x16\x6a\x9b\xb8\x55\x2f"
+ "\x93\x47\x61\xea\xd8\xbf\x11\xea\x5f\x0a\x6d\x34\x76\x61\x2b\x5c"
+ "\x1f\xe5\x1b\x55\xf5\x2f\x3c\x9f\xce\xa5\x7c\x8a\x7c\x65\xe5\x54"
+ "\x31\x8f\x52\xa8\x98\x47\x71\xc6\xa9\xaa\xe6\xf0\xf3\x9c\x7a\xf0"
+ "\x2c\xcb\xa9\x07\xcf\xb3\x9c\x5a\x34\xcb\x96\x53\xed\xf9\xf4\x50"
+ "\x4f\x39\x2e\xa5\xeb\xa3\x14\xf9\x29\xf3\xe8\xa1\x60\x25\x1e\xe5"
+ "\xeb\xd3\xa7\x49\xea\xd3\x9b\x78\xf4\xdb\xe9\x2c\x8f\x1e\x4a\x73"
+ "\x95\x47\xf9\xbd\x4d\x4e\xdf\x86\xbd\x4d\xdc\xe6\xd1\x28\x1b\x1e"
+ "\xfd\xd6\x2c\xf2\xa8\xed\xfe\x26\x4e\x78\x34\xf2\xd6\xac\x81\xc2"
+ "\xf0\xa8\xc5\xc0\xf7\x27\x70\x3e\xf6\xf5\xbb\x44\x96\x47\xbf\xdb"
+ "\xad\xcc\xa3\xdf\x8d\x17\x79\x94\x5e\x77\x6b\x79\xf4\xbb\x04\x86"
+ "\x47\x23\x25\x3c\xfa\x8b\x18\x43\x60\x8d\x45\x13\x8f\xce\x93\xf0"
+ "\x68\xa4\x33\x1e\xfd\x2e\x01\x6d\x44\x35\x6a\xd1\x08\xe7\x3c\x7a"
+ "\x28\x54\x9e\x47\xe1\x38\xcf\xa3\x87\x42\x45\x1e\x95\xd1\xa8\x0c"
+ "\x8f\x1e\xee\xa5\x82\x47\xef\xf0\xb5\x51\x0e\x07\xa9\xca\x55\x88"
+ "\x73\x3a\xed\xd7\x48\x9d\x2a\x9d\x13\x54\x60\xb3\xef\x49\x81\xdd"
+ "\xbe\x27\x4b\xac\x73\x3c\x47\x0a\xbc\xfa\xf2\x4d\xf0\x2a\x3f\xc7"
+ "\xf3\xc8\x60\xb6\xf6\xe4\xc8\xb3\xd6\xda\x13\xca\xab\x25\x47\xad"
+ "\xfd\x12\xf7\x3d\x29\x70\xb0\x46\xea\x91\x35\xcc\xda\x28\x23\xa5"
+ "\x6b\xa3\x94\x24\x2a\xaf\x91\x7a\x64\x37\xb3\x36\xca\x91\xdc\xa6"
+ "\x7d\x4f\x6c\xd7\x48\x15\x39\xf6\xfb\x43\x3c\xc7\x36\xad\x41\x75"
+ "\xc4\xd8\xb4\x46\xaa\x93\x79\x41\xd8\xce\xae\x73\xba\x5b\xcf\xb1"
+ "\x85\x2a\x38\x96\xd9\xf7\xc4\x76\x8d\xa9\xe2\x88\xb2\xa2\x02\x52"
+ "\x1a\x5e\x20\xb3\x36\x6a\x41\x8b\xee\x7d\x82\xfd\x92\xe7\xda\xe2"
+ "\xcb\x2c\xd7\x96\x04\xf2\xd7\x9e\x92\xe3\xda\xe2\xfd\x22\xd7\xd2"
+ "\xeb\x62\x4f\xd9\x70\x6d\xa5\x02\xd7\xc2\xb8\xba\xf5\x82\x5a\xae"
+ "\x2d\xae\xe1\xb9\x36\x49\xe0\xda\x4b\xcd\xcd\xb5\xc5\x35\x22\xd7"
+ "\x96\x7c\xee\x7c\x8f\xa9\x23\xfb\xe4\xe7\xe5\x1c\xd9\x47\xb9\xf6"
+ "\xc8\x3e\x87\x7b\x4c\x31\x35\x1f\xa5\xdb\xac\x7b\x4c\x89\xf9\x80"
+ "\x02\x21\x1f\xd0\x9a\xf7\x44\x29\xcd\x56\x9b\x0f\xf8\x1e\x62\x77"
+ "\x9c\x77\xb9\x0c\xf7\x9c\x0a\xc3\x3d\x51\xf2\x6d\xf2\x01\xf9\xf6"
+ "\xf9\x80\x49\x8e\x39\x56\x55\x3e\x80\x9f\x77\x59\x96\xc5\x72\x6c"
+ "\xd9\x36\x96\x63\x7f\x1c\x6c\x9d\x67\x89\xfd\x51\x5e\x33\xb5\xec"
+ "\x72\x53\x3e\xa0\x92\xe5\x56\x31\x1f\xf0\xc3\x45\x65\x8e\x2d\x67"
+ "\xf3\xbf\x2f\xe7\x32\xf3\x2c\x3f\x39\x27\x5d\x87\xda\xba\xfe\xd4"
+ "\xd1\x81\x87\x8f\x49\x39\xb6\x3c\xac\x35\xad\x43\xdd\xb4\xd6\x94"
+ "\x93\x5a\x6e\xfb\x75\xa8\x8f\x1e\x2d\x2b\xca\x27\x38\xb7\x8d\xe7"
+ "\x5b\x26\x37\x90\xdf\x32\xb9\x81\xa2\x7c\x85\xdc\xc0\x0f\x21\x2c"
+ "\xcf\xfe\x90\xcc\x5f\x7b\x42\x8e\x67\x7f\xe8\x29\xf2\x2c\xbd\x2e"
+ "\xf6\x84\x0d\xcf\x56\x34\xa7\xa6\xfd\x61\xc2\xad\xcd\x0d\xfc\x30"
+ "\x41\xcc\x0d\xfc\xe8\xc2\xfc\xc7\xf2\x40\x79\x9e\x2d\x17\xf2\xae"
+ "\xe5\x62\xde\xb5\x42\x66\xbf\x14\x86\x67\x7f\x34\x5b\xe7\x3f\xf2"
+ "\x9a\xb6\xd2\xaa\x69\xf3\x5b\xe1\x7e\x29\x3f\x9a\xd4\xe6\x06\x70"
+ "\x9e\x3b\x72\x2b\x72\x97\x95\x5f\xc5\xdc\x40\xbe\x72\x6e\xc0\x09"
+ "\xbf\xaa\xdf\xbb\xef\x98\x99\xe5\xd7\xe3\x1e\x2c\xbf\x56\xac\xb1"
+ "\xe5\x57\x7b\x6e\x3d\x3e\x4c\x8e\x57\x69\x6e\xa0\x62\x88\x32\xa7"
+ "\x1e\x9f\xab\xc4\xa9\xfc\x9a\x7e\xe7\xc4\x1a\x69\x91\x53\xff\xb9"
+ "\x8a\xe5\xd4\xe3\xf9\xae\x72\x6a\x8b\xec\x97\xe2\x36\xa7\xea\x6c"
+ "\x38\xf5\xa7\x9e\x22\xa7\xda\xee\x99\xe2\x84\x53\x6f\x55\x9e\x40"
+ "\xca\xa9\x8c\x76\xfd\x69\x07\xcb\xa9\x3f\x55\x2a\x73\xea\x4f\x4b"
+ "\x44\x4e\xa5\xd7\xdd\x5a\x4e\xfd\x29\xf7\xd6\xe6\x09\x7e\xca\x15"
+ "\xb5\x6b\xc5\x3c\xe7\x9c\x7a\x3c\x5a\x9e\x53\x8f\x47\x53\x4e\x3d"
+ "\x1e\xed\xfa\x9c\xf2\x13\xe3\x55\x70\xea\x1d\xbe\x97\xca\x89\x60"
+ "\xd5\x79\x02\xcc\xb7\x22\x97\x56\xde\xdc\xda\x21\x31\xd6\xb5\x43"
+ "\x86\x0b\x1c\xfb\xe2\xcd\x72\xec\xc9\xe9\x6c\x4d\xc3\xc9\x59\xd6"
+ "\x9a\x06\xca\xb1\xa7\xbd\xd9\xfd\x51\xed\xd7\x0a\x61\xd7\x50\x3d"
+ "\xb9\xa7\x29\x4f\x80\x9c\x3b\x5c\x9a\x27\x38\xb5\x47\x99\x6f\x4f"
+ "\x56\x32\x79\x82\x6f\xe5\xf9\xf6\x3a\xc3\xb7\xff\x6a\xe0\xf9\xb6"
+ "\x69\x0d\xd5\x7f\x05\x5a\xd7\x50\x75\xaa\x61\x19\xbe\x0d\xbf\x3d"
+ "\x7c\x5b\xe0\x3a\xdf\xb2\x7b\xa9\xd8\xae\x97\x5a\x99\x55\x76\x10"
+ "\xf8\x96\x5f\xaf\xc3\x76\xcd\x54\xd7\xd6\xeb\xb8\x55\x6b\xa6\x62"
+ "\xbf\xe4\x79\xf7\x54\x37\x96\x77\x4f\x4d\xe0\xaf\x95\xe5\xdd\xca"
+ "\xdf\x44\xde\xa5\xd7\xb9\xcc\xbb\x6e\xe5\x0c\x4e\x05\xde\xda\x9c"
+ "\xc1\xa9\x40\x91\x77\x4f\x9d\x77\xce\xbb\x27\xab\xe4\x79\xf7\x64"
+ "\x15\xe5\xdd\x93\x55\x0e\x79\x97\xa9\x21\x38\x7d\x5c\x76\x2d\x8f"
+ "\xca\xd6\xbe\xcf\xca\xe9\x63\xee\xe4\x0c\x80\x83\x35\xcb\x71\x0d"
+ "\xa7\x70\xac\x21\x70\x9e\x33\x70\xc6\xb7\xea\x73\x06\x67\x8e\xb2"
+ "\x7c\x7b\xe6\x38\xcb\xb7\x3f\x27\x62\xbf\x1c\xe6\x0c\x78\x0e\xd0"
+ "\x77\x6b\xca\x19\xe8\x59\x9e\x15\x73\x06\x3f\x3f\xa1\xfc\xee\x4b"
+ "\x3f\x9a\xd1\xb7\x2f\xda\xac\x59\x3d\x4d\xe4\xdb\x23\xa5\xd6\x9a"
+ "\xb1\xb3\xb1\x87\x83\xa5\x7c\xab\x4f\xb5\x5b\xb3\x7a\x42\x33\xae"
+ "\x59\x3d\xa1\x99\xd7\xac\x0e\x61\xd7\xac\xde\x74\x5d\xac\x23\x53"
+ "\xbf\x66\xf5\xb9\xce\x3c\x07\x23\x86\x70\xdd\x6a\x57\xf2\x08\xb7"
+ "\x78\xaf\x15\x86\x7b\x99\x3c\xc2\xb9\x2c\x96\x7b\xcf\x95\x2b\x73"
+ "\xef\xb9\x79\x22\xf7\xd2\xeb\x6e\xad\xe6\x3d\x97\x79\x6b\xf3\x08"
+ "\xe7\x32\xc5\x3c\xc2\xcf\xd3\x65\xb9\x97\x79\x37\xa6\x9f\x20\xff"
+ "\x6e\x0c\x8e\xf3\xdc\xab\x9f\xa0\x98\x47\xb0\xab\xdf\xaa\x1a\x41"
+ "\xdf\x8d\x09\x9a\x57\xaf\x22\x8f\x70\xc7\xd5\x18\x54\x0d\x77\x27"
+ "\x8f\x80\x7c\x8b\x7c\x66\xe5\x5c\x57\xf2\x08\xcd\xaf\x71\xcf\x8f"
+ "\x60\x39\xf7\xfc\x28\x96\x73\xab\x2f\xda\x72\xae\x3d\xdf\x9e\x5f"
+ "\x25\xc7\xb5\x34\x8f\x50\x9d\xa1\xcc\xb3\xe7\x77\x2b\xf2\xac\x4d"
+ "\x6d\xae\xc8\xb3\x17\xce\xb3\x3c\x7b\xde\xe8\x16\xcf\xba\xba\x07"
+ "\xcb\x1d\xc5\xb3\xe1\x36\x3c\xfb\xef\x44\x91\x67\x6d\xf7\x61\x71"
+ "\xc2\xb3\xb7\x68\x1f\x16\x65\x8d\x5b\xed\xcd\xf2\x6c\xf5\x20\x65"
+ "\x9e\xfd\xf7\x71\x91\x67\xe9\x75\xb7\x96\x67\xab\xbd\x6e\x6d\x6e"
+ "\xa1\xda\x4b\xd4\xb8\xd5\x87\x9d\xf3\xec\xf9\x7d\xf2\x3c\x7b\x5e"
+ "\x78\x2f\x76\x7e\x9f\xa2\xc6\xb5\xe3\xd9\x8b\x79\x2a\x78\xf6\x0e"
+ "\xaf\x41\xb8\xa8\x6a\xfd\x0b\x49\xbe\xf6\x9e\x32\xbd\xcd\x7c\x89"
+ "\x13\xd2\xf9\x12\x92\xdc\xc2\x70\x6b\x6e\x81\xdd\x9f\x25\xc6\x9a"
+ "\xbf\x1d\x2a\xf0\xee\xf3\x37\xcb\xbb\x97\xf6\xd7\x37\xf1\xee\x02"
+ "\xe0\xdd\x4b\xfc\xfc\x88\xfa\x26\xde\xbd\xb2\xc8\xda\x2f\x71\x7f"
+ "\x16\x85\xdc\xc2\x33\xd8\xde\x2f\x1d\x9a\x72\x0b\xc8\xc3\x43\xa5"
+ "\xb9\x85\x2b\x3d\x95\x39\xf8\x97\x41\x4c\x6e\xe1\x1f\xf2\x1c\x5c"
+ "\xc7\x70\x70\x4d\x04\xcf\xc1\xcf\x58\x39\xf8\x97\xe5\xd7\x21\xb6"
+ "\xbc\xfe\x9e\x3a\x0e\xae\xe3\x39\x78\x64\xcb\x70\xf0\xee\x66\xe0"
+ "\x60\xde\xee\x97\xdb\x96\x15\x02\x07\x87\x21\x07\x8f\x74\x2d\xdf"
+ "\x70\x9b\xf6\x68\xc1\x7e\xc9\x73\xf1\xe5\xf5\x2c\x17\x5f\x3e\xc8"
+ "\x5f\x2b\xcb\xc5\x97\xa7\x8b\x5c\x4c\xaf\xbb\xb5\xf9\x86\xcb\xa9"
+ "\xb7\x36\xdf\x70\x39\x55\xe4\xe2\x2b\x21\xce\xb9\xf8\x97\xa1\xf2"
+ "\x5c\x0c\xc7\x79\x2e\xfe\x65\xa8\x43\x2e\x7e\x46\xca\xc5\xbf\x36"
+ "\x69\x5e\x26\xdf\xa0\x6f\xed\x7b\xb7\xfc\xaa\xa8\x7f\x03\x1f\x26"
+ "\x09\xe7\x3c\x7e\xcd\x2a\x83\x48\xe6\x6a\x12\x49\x28\x33\x3d\x43"
+ "\xe0\x18\xd8\xef\xd7\x43\x65\x01\x83\x88\xe5\x83\x39\x41\xc8\xc7"
+ "\x1f\xe2\x1f\x68\xdc\x54\x8d\xf0\x6c\xf1\x36\xfe\x95\xaf\x77\xc5"
+ "\xe3\xc8\xbd\x5b\x25\xe7\xe5\x7e\x8b\x4b\x9d\x9d\x4b\xbf\x67\x08"
+ "\xa4\xf3\x6e\x66\xef\xb4\x7e\x46\x6c\xea\x3d\x0c\x3d\xb8\xf5\xb3"
+ "\x73\x0c\x1d\x66\xe7\xc8\x7d\xbf\xbb\x96\xf8\xb4\x4b\xe4\xb8\x2d"
+ "\x1b\xb8\xba\xab\xbf\x9f\x1c\x75\x35\x85\x90\xd4\x0d\x9c\xa1\xfe"
+ "\x3d\x43\x18\xdc\xe3\x8a\x8f\xe0\xba\xab\x1d\x4f\x47\x5d\x4d\x0a"
+ "\x26\x70\x2c\xca\x7a\x0c\xec\x46\x2c\x49\x9e\x9c\x05\xce\x71\x1b"
+ "\xfa\x86\x6d\x8d\x03\xae\x5a\x4e\x48\xdf\xeb\xf8\xcc\x18\x12\x00"
+ "\x33\x7e\x6b\xa1\xcd\x75\xd0\x16\xf7\xc0\x43\x75\x80\x47\xaf\xd2"
+ "\x15\x04\x9f\xe9\x64\xb8\xaf\xec\xb5\x68\x7b\xcf\xc7\x32\x38\x8d"
+ "\x17\xb1\x6c\x9f\x54\xc4\xf9\x27\x25\x80\x3f\x48\xea\x02\xc2\xaf"
+ "\xc9\xba\x0e\xae\xe3\x34\xf1\x9c\xa5\x67\x68\x70\x99\xa9\x8e\x3e"
+ "\xd3\xd0\xbf\xaf\x20\x8e\xe5\xe0\x77\xb7\x2c\x20\x5a\xf8\xf3\xe5"
+ "\xd2\x93\x12\xea\xdf\xfb\x0d\xfd\x61\xc0\x7e\x29\xdd\xe3\xba\x4d"
+ "\x30\xee\x3c\x14\x80\x63\x07\xff\xfb\xf8\xdb\xfc\xef\x68\x2c\xc9"
+ "\x66\x38\xce\x25\xc5\x73\x65\x31\x26\xd2\x1e\x6c\xb1\x15\xfa\x8d"
+ "\x78\xb4\xfc\x65\x72\xd4\xbb\x0f\x12\xb2\x6b\x69\xb5\xa6\x0c\xfa"
+ "\x6e\xfe\xe8\xa1\xba\xc2\xb8\x27\x09\x9c\x37\x60\xcc\x72\xc1\xa3"
+ "\xd6\x7b\xdc\x45\x42\x90\x4f\xe0\xff\x1d\xea\x60\x1c\x1b\x03\x9f"
+ "\xd7\xc1\x7d\x58\xae\x06\x78\xe1\xb5\x17\x3c\x7e\xdb\x5f\xb8\xf8"
+ "\x24\x69\x1f\x45\x7c\xd6\xc2\xbd\xd1\x6b\x7f\x5b\x8d\xd7\xea\x3d"
+ "\x6a\xb5\xd8\x07\xf8\x9c\x0d\x9f\xf1\x7b\x58\x43\x46\xb8\x9c\x49"
+ "\x45\x3c\x36\xd3\x92\x12\x2c\x3d\x27\x15\xf1\xdc\x07\xf7\xb9\x0e"
+ "\xee\x19\xae\xf1\x85\x6b\x7c\xf9\x7f\xe3\x88\x36\x0d\x8e\x61\x3b"
+ "\xf0\xaf\x6f\xe1\xfc\x46\x6c\x7b\x39\xb6\xad\x60\x07\x2f\xce\x2f"
+ "\x29\x81\x03\x6c\xe3\x98\x1a\x18\xe7\x71\xf4\x9c\x47\x6d\x7e\x7b"
+ "\x0f\x8e\xe3\x72\x42\x83\xdf\x8d\x23\xbe\xa9\x16\x42\x0a\x1f\xc4"
+ "\x76\x6a\x57\x41\xfb\x5e\x68\x8b\xfa\xf7\x6a\x75\x7a\x8f\xdf\xfc"
+ "\xd0\xbe\xe0\xcf\xba\xc0\xee\xfc\xfd\x16\xe2\xef\xe0\x77\x84\xeb"
+ "\xf9\xb5\xef\xb1\xcf\x81\x71\x9e\x1c\x7c\xde\xe1\xe9\x71\x96\x78"
+ "\x06\xb4\xed\x01\xdf\xcf\xd5\x93\x9d\xc7\xf0\xfb\x7a\xfa\x3d\xc0"
+ "\x52\xed\x3e\xc0\x66\x7f\x3c\x86\x9f\x15\xfa\xeb\x6b\xf5\x5b\x49"
+ "\x00\x60\xc3\xd6\x77\x56\x8c\x00\x2e\xac\x18\xc1\xfe\x7e\x16\xa7"
+ "\xd7\xf0\xe3\xb0\xc7\x55\x3e\xae\x5b\x0b\x3e\x34\x6f\x0e\xf0\x5a"
+ "\x07\xb6\xb5\xdc\x40\xbf\x9c\x83\x73\x75\x1e\xe8\x97\x75\x4b\xc1"
+ "\x27\xf4\xda\x1e\x62\xff\xf1\x73\x1d\xef\x4f\x0b\xf8\x82\xce\xdd"
+ "\xbc\x7a\x1c\xef\x67\xdd\x75\xf0\x63\x27\xae\xee\x60\x0c\xf4\x0b"
+ "\x71\x0b\x18\xd9\xb5\xc0\xa8\xc1\xba\x3e\x3c\xfe\x55\xad\x51\xb3"
+ "\xee\x12\x41\x5d\x49\xd6\x00\x2f\x67\x2d\x06\x9b\x43\x9b\x5c\x8f"
+ "\xd0\xe0\x7e\x56\x3f\x2e\x05\xdf\x2d\x06\xec\x82\xcd\xd7\x81\xfd"
+ "\xb6\x00\xe7\xe1\xff\xb7\xc0\xf8\x63\x81\xeb\xf4\x1e\x75\x5a\x68"
+ "\x4f\x9b\xd5\x89\x33\x6c\xed\xc4\xd5\x80\x0d\x07\xd5\xbf\x77\xb5"
+ "\xc6\x6a\x43\xec\xd3\x3a\x38\xbe\x06\xce\xeb\x3d\xae\xea\x28\x86"
+ "\xae\x0e\xb2\xde\xb3\x92\x3d\x57\xef\x22\x83\xd6\xec\x22\x5d\x52"
+ "\x76\x91\x21\xcb\xaa\xe0\xb9\x4c\x7a\x8e\xfb\x3e\xcc\x04\x63\xe2"
+ "\x81\xe4\xc6\x4e\x6f\x46\xe1\xbb\x27\xcb\xbb\x0f\x65\xaf\xdc\x45"
+ "\x7a\xe3\xdc\xd8\x71\x35\x84\xe0\x18\x3e\xce\xfb\x0c\x57\x16\x75"
+ "\x8d\x58\x3a\x1c\x48\x36\xbf\xfb\x58\xc7\xb1\xd7\x08\x39\x14\x54"
+ "\x47\xe2\xa2\x61\x2c\xaf\xad\x26\x71\x75\x9c\xa1\x34\xe1\x22\x01"
+ "\xee\xc9\xa4\xb6\xbb\xb6\x73\xdc\x2c\x42\x70\xce\xa0\xe5\x97\x20"
+ "\xd2\x56\x47\xbc\x96\x9f\x20\x01\xf1\x55\x5c\xb5\x79\x43\x4c\x78"
+ "\x5c\x2c\xd1\xec\xaa\xad\xa0\xda\xd3\xe3\x5a\xec\x7e\x9c\x9f\x5a"
+ "\x1f\x4a\x5e\x37\x09\xe3\x51\x5a\x52\x72\x7c\x04\xe9\x8c\xf7\xd3"
+ "\x9e\xd7\x5e\xd7\x3a\x83\xdd\x92\xd5\xf1\x73\x5d\x15\xef\xcf\x0d"
+ "\x4b\x0c\xbb\x66\x18\x41\xb7\xf6\x4b\x88\x9f\xc5\x55\xa3\xae\x83"
+ "\xf1\x85\xd7\x82\x65\xd5\x26\xd0\x56\x33\x61\xfc\xd6\x93\xaf\xcf"
+ "\x65\x6b\x2c\xe9\xfd\x12\xd4\xfd\xc6\xb5\x91\xfc\xb8\x8d\x63\x29"
+ "\xf4\x3d\x24\x88\x24\xf0\xfd\x87\x31\xb3\x7d\x34\xea\x29\xee\x0c"
+ "\xf6\xff\x2b\xb8\x57\xae\x5b\xba\x1e\xfa\x54\x8c\xe3\xe7\xb8\xca"
+ "\x42\x52\x6c\x34\x93\x4d\x97\x78\x1b\xdd\x03\x36\xf2\x82\x73\xd9"
+ "\x60\x27\x1f\x39\xbf\xa1\xcf\x2c\xa9\x07\x92\x2d\x9e\xd4\x37\xbc"
+ "\x5f\xea\xa8\x5f\xc6\xbe\x4d\x60\x1c\x05\xdf\xac\xa7\xbe\xb1\xf8"
+ "\x27\x46\xa1\x6f\xd4\xdd\xc7\x75\xad\xd2\xf8\x82\xbf\xcd\x01\x3e"
+ "\x10\x17\x16\xbf\xc4\x28\xfc\x6d\xec\x03\xbe\x3f\x43\x1c\x8c\x5b"
+ "\x79\x86\x2b\x8d\xaa\x26\x65\x70\x3f\x5c\x07\x69\x1f\x4c\x6a\xfb"
+ "\x90\xa6\xd4\x87\xd5\x7d\x01\xb7\x7d\x01\xb7\x7d\x01\xb7\x7a\x8a"
+ "\xdb\x23\x95\x14\xb7\x66\xe8\x57\x03\x68\xf7\x65\x21\x44\x83\xfd"
+ "\xda\x79\x12\xd7\xe8\x83\x7e\x56\x8b\xd8\x1d\x73\x19\x6c\x64\xc5"
+ "\xaf\xe7\x63\x1d\xd1\x3e\xa5\x75\x15\x24\x1e\xf1\xdb\x28\x87\x5f"
+ "\xe3\xdc\x71\xa0\x00\x4d\x73\x00\xbf\xff\x0e\x22\xbe\x55\xc4\x2b"
+ "\x36\x04\xf0\x5b\x2d\x87\x5f\xe3\xb3\xfb\xe0\x37\xed\xf0\x3b\x4b"
+ "\x8a\xdf\xfa\x13\xea\xf1\x5b\x9f\xd3\x84\xdf\xc9\x02\x7e\x23\x6c"
+ "\xf0\x5b\x25\xc1\x2f\xde\xb7\x6a\xfc\x1a\x7d\xd4\xe1\xb7\x7e\x75"
+ "\x13\x7e\x21\x2e\xd9\x34\x9b\xb7\xd1\x3d\x60\x23\xc0\x6f\x7d\x38"
+ "\xd8\x49\x16\xbf\xb7\xdf\x7f\x8d\xbd\x5d\xf7\x5f\x83\xd9\xb9\xff"
+ "\x1a\x36\xaa\xf7\x5f\xc3\xcc\x5b\xef\xbf\x86\x22\x75\xfe\x6b\x18"
+ "\xad\xec\xbf\x86\xc0\x3b\xc7\x7f\x37\x6a\x5c\xf7\xdf\x8d\xfd\xce"
+ "\xfd\x77\x63\x92\x7a\xff\xdd\xe8\x71\xeb\xfd\x77\x23\x59\x9d\xff"
+ "\x6e\xf8\x2a\xfb\xaf\x51\xaf\xe4\xbf\x17\x3a\x5b\x38\x0b\xd6\xcd"
+ "\x75\x9a\x53\x8e\x1a\x88\xea\x35\xd3\x5e\x8c\x19\xe1\xb3\x97\xf5"
+ "\x33\xaf\xa9\x20\xae\xb6\xf9\xec\x6b\xf3\x59\x6b\xf3\xd9\xcf\xe6"
+ "\x73\x80\xcd\xe7\x2e\xd6\xcf\xe0\x2f\xef\x2b\x1e\xa6\x5e\x10\xb3"
+ "\x25\xe8\x3d\x4c\x07\x85\xf3\x3d\x5e\x37\x07\x62\xdc\xd7\x43\xae"
+ "\xef\xeb\x92\x38\x63\x5b\x0f\xc2\xdd\xd0\x70\x24\x2a\x8e\x3c\x74"
+ "\xc9\xc3\x3c\xa8\x31\x09\x42\x42\xcf\x07\x83\xb8\xc6\x04\x02\x7e"
+ "\xd9\x3d\x76\x09\xe0\xcb\x00\x71\x62\x7c\xc0\x3d\xd0\xf6\x03\x60"
+ "\x37\x43\x69\x94\x01\x74\xf9\xd7\xdc\x39\x0f\x73\x4f\xbc\xcf\xbe"
+ "\x51\x85\xc4\xe2\xf9\x58\x10\xc7\xaf\xdd\xdc\x6f\xb7\xc1\xf3\xb1"
+ "\x07\xb9\x6d\x1b\xa2\xd6\x24\x59\x7c\xca\x6a\x8e\x91\xb5\x1a\x4b"
+ "\xe0\xf2\xe5\xa0\xeb\x6b\x76\x93\x65\x35\x5c\xf5\x72\x13\x67\x2c"
+ "\x0b\x2b\xc4\xf7\xb6\xd5\x65\x31\x45\xa4\xd4\x70\x8c\xe0\x98\x87"
+ "\x58\x2d\x33\xec\xa6\xef\x89\xf1\x1a\x38\x56\x6a\xd8\x49\x4a\xe0"
+ "\x73\xe1\xfc\xf3\x70\x9f\xe6\xe3\x65\x35\x3b\x89\x39\xad\x5f\xbe"
+ "\xc5\xaf\x5f\x1a\xe7\xd7\x2f\xa3\xa4\x06\xfa\x96\xd6\x2f\x13\xfb"
+ "\x5a\x0a\xfd\xe0\xf7\xe8\x4c\xef\x97\xc9\xb7\x5b\x57\xce\xe7\x10"
+ "\xcc\xe9\x70\xbd\x3f\x5c\xef\xdf\x2f\x03\xfb\x87\x7d\x93\x8d\xf7"
+ "\xd2\x74\x5e\xd0\xf7\x67\x42\x82\xbc\x08\x97\xe8\x15\xa0\x0e\x6f"
+ "\x66\xa3\x62\x1c\x99\xa6\x5b\x41\xdb\xf5\x71\xa3\x5d\x8b\x62\xfd"
+ "\x13\x97\x16\x21\xf4\x57\xeb\x4e\xbb\xb9\x0e\xda\x15\xfa\x1b\xe8"
+ "\x46\xbb\x1c\x51\x6e\x37\x52\xe8\xef\x50\x77\xda\x0d\x75\xd0\xae"
+ "\xd0\xdf\x04\x77\xda\xcd\x77\xe0\x37\x2f\xb7\xb0\xa0\x21\x5e\x8e"
+ "\xb0\xe0\x16\x0e\x34\xc4\xc1\xfd\x47\x78\xb9\x85\x01\x0d\x51\xcc"
+ "\x7f\x23\x06\xdc\xf2\xbf\xc6\xc3\xa1\xff\xdd\xf2\xbd\xc6\x43\x71"
+ "\xff\x47\xf4\xbd\x5b\x7e\xd7\x78\x28\xe2\x1f\x63\x63\x2e\x6d\x4e"
+ "\x36\xd7\x29\xbd\xdc\xb2\xe1\xe9\x6c\x4b\xa7\x39\x1f\xbf\x6b\x19"
+ "\x4a\x5e\x88\x85\x31\x2f\x83\x74\x78\x21\xeb\x0c\x37\x14\x73\x4e"
+ "\x1a\xcd\xd0\xd8\x4c\xa2\x49\xd5\x58\x34\x79\x4b\x2b\x34\x65\xa6"
+ "\x41\xc8\x5b\xe6\x9c\xc5\x46\x8f\x47\xe1\xf8\x01\x88\x1e\xeb\x16"
+ "\x06\x11\xda\xd6\xd3\xd9\x6b\xe3\x86\x92\x71\x66\x82\x39\x8e\xba"
+ "\xb1\x6f\x9f\xe1\xbe\x59\x0e\x1a\xff\x37\xe0\xd7\x0c\x23\x8e\xa5"
+ "\x1d\xe0\xbb\x26\xc0\x31\xb4\x63\x24\x9f\x59\x0c\x1e\x63\x0d\xfc"
+ "\xb5\x06\x88\x47\x0d\xdc\x86\x39\x1f\xe3\x98\xcc\xc5\x07\x91\x15"
+ "\xf0\x19\x7e\xfb\x73\x4f\x03\xd1\x6c\x81\x58\xb5\x3e\x45\xb3\x53"
+ "\xaf\xf1\x4c\xc6\xf8\x15\xe2\xe4\x9a\xf8\xdf\x30\x9f\x9f\x5e\xbe"
+ "\xcb\x62\xd0\xbc\x0b\x71\x33\x5e\xdf\x37\x8a\x68\xbe\x81\xf6\xe0"
+ "\xda\x8a\x03\xd1\x84\x38\xc8\xe7\x78\x59\xfc\x20\x9a\x84\xef\x63"
+ "\x3b\x98\x27\x5d\x67\x01\x3b\xfb\x25\x25\x63\xbf\xb9\xb4\x37\x43"
+ "\x0b\x97\xc2\x98\xa3\xf1\x0c\x1f\xd1\x8b\xab\xc7\x31\x04\xc6\x8e"
+ "\x07\x2f\xc1\x67\x3e\x1f\x90\xc4\x95\x73\x7e\x7d\x93\xb9\xb5\x6d"
+ "\x87\x96\xd6\xd5\x92\xc2\xc5\x8d\xe4\x9c\xc6\x73\x3a\xfe\xf6\x55"
+ "\xbf\x78\x7d\x9d\x5f\x7c\x75\x7d\x8a\x67\x98\xb5\xbf\xf8\x5b\xd6"
+ "\xe3\x98\xff\xa0\x7d\xf4\x5c\x7e\x60\xb9\x72\x1f\xb9\x77\x1f\xec"
+ "\x38\x2e\x80\x33\xa0\x2d\x0b\xe3\x6a\xa1\x2f\x5e\xbf\xa1\xbd\xb9"
+ "\xb4\xf8\xfc\xba\xf8\xa0\x87\xf9\x7c\xa0\xc6\x2b\x00\xf3\x4a\x30"
+ "\x36\xe4\xd0\x1c\x4f\xbf\x1c\xbe\x86\x07\xb8\x9f\xcb\x09\xd5\xa1"
+ "\x16\xba\xa2\xf1\xe4\xf3\x81\x21\x41\x1a\x75\xf1\x94\xc6\x93\x8f"
+ "\x7f\x0b\x1f\x46\x3b\x78\x9d\x80\xdf\xfb\xe3\x39\x8d\xd7\x10\x9a"
+ "\xe3\xe8\x57\x80\xbf\x07\xd7\x14\xc1\x6f\x16\x70\x69\x7d\x13\xf0"
+ "\x3a\x38\x1f\x26\x9c\x2f\x94\x9c\x2f\x84\x3e\x1b\x85\xf3\xcb\x85"
+ "\xf3\x07\x25\xe7\x0f\x46\x3d\x4c\x3c\x2e\x69\xbc\x72\xf0\x9e\x60"
+ "\xbc\xcb\x86\xf3\xbb\xf1\x7d\x02\x7f\x4f\xfe\xfd\xb2\x85\xeb\x76"
+ "\xd7\x68\xbc\xf6\x5f\x05\x7c\xc1\xf9\x7d\x92\xef\xef\xfb\x26\xa6"
+ "\x3f\x79\x21\x0b\x6d\xea\x55\xae\xf7\x7a\x42\xcf\xe7\x89\x34\x9e"
+ "\xc5\xbc\x2d\x60\xfc\x94\xb6\xa7\xd7\x78\x65\xe2\x18\x59\x07\x3a"
+ "\x12\xae\xd9\x8d\xbf\x29\xb5\xff\xac\x05\x0b\xde\x5a\x10\xd8\x73"
+ "\x66\xe0\xcc\x79\xd3\x03\xdf\x78\x6b\xd1\xfc\xe8\x67\x7b\xce\xbc"
+ "\x8f\x10\x09\x76\xb4\x5c\x52\x7b\xce\x92\xb6\x2c\xa8\x2c\x03\xf4"
+ "\x9b\x46\x0b\x63\x79\x23\x49\x03\xbf\x9a\x36\xbc\x4f\xcc\x9d\x52"
+ "\x52\xcd\x1b\xe6\x92\xf8\x6b\x44\x13\x17\xc0\x9d\x2d\x5c\xfa\x3c"
+ "\xf8\xc0\x3b\x02\x35\x44\x59\x20\x21\xab\x01\xab\x85\x4b\xff\x81"
+ "\xc7\x12\xf9\xf7\x0d\xe1\xf4\xd8\xff\xc5\x15\x69\xbe\x8e\xab\xd0"
+ "\x14\x87\xd7\x92\x6f\x02\x0c\xe4\x60\x60\x2d\xc9\xc4\xe3\x96\x72"
+ "\xfe\xbd\x0f\x5c\x7f\x14\x7f\x0b\x73\x67\xf8\x7f\x3e\x0f\xa8\xf1"
+ "\x0e\xc1\xdf\x09\x7c\x90\x90\x1a\x8d\xf7\x24\xfc\x3d\xbd\xc6\x3b"
+ "\xd4\x33\x93\x78\xc0\x73\xe4\x7b\x45\x73\x8f\xbf\x25\x7d\x59\x10"
+ "\xff\xac\xa7\x78\xfb\x98\x34\x1d\xfb\x6c\xf9\x80\xf8\x6c\xfd\x80"
+ "\x90\xcc\x8e\xc4\xab\x3e\xe5\x1e\xa2\xf7\x1a\x99\x83\xf6\x82\xa6"
+ "\x7d\xaf\x6a\xc8\x73\x70\xcc\x4f\x4f\x76\xce\xc5\x63\xf0\x4c\xd5"
+ "\x29\x71\x07\xbe\x87\x33\xe6\x4c\x4c\xb5\xf8\x2d\x0b\xe0\xc0\x16"
+ "\xc6\x1e\x13\x0b\xdb\x47\x01\x5e\xe0\xb9\xe1\xfc\x97\x05\xd4\x68"
+ "\x7c\xb4\xdf\x16\x10\x12\x87\xcf\x29\xd8\xe3\xd3\xeb\x46\x7c\xff"
+ "\x46\x76\x5e\x37\xc0\xe7\x94\xd4\x1d\x8b\x8d\x9a\x23\xc3\x0b\x48"
+ "\xe0\x2b\xa0\xb1\x34\xf7\xac\xfa\xd3\x4c\xce\xf4\x58\x30\xe8\xd2"
+ "\xaa\xbf\x92\xef\x2b\x8b\x88\x6f\x18\xf1\x6c\x5a\x1b\x3e\x9a\x68"
+ "\xc6\xe9\xe1\xf3\x22\xa2\x29\x35\x9a\xf9\xf7\x00\x71\xc3\x30\x9f"
+ "\x5f\x42\x30\xc7\xcf\x69\x76\x45\xe7\xd5\x1a\x81\x9f\xaa\xbd\x71"
+ "\x2e\xb9\x45\xfb\x5d\x32\x7e\xe7\xf5\x3a\xe1\xdd\xd8\x55\xe1\xdd"
+ "\xd8\x55\xfe\xdd\x58\x0f\x7c\x2f\x86\xef\xc3\x96\x87\x73\x16\xf3"
+ "\xc2\xa0\x8e\xe3\xc2\x3d\x39\x6c\x13\xdf\x95\xb5\x85\x98\x82\x5b"
+ "\x18\xd4\x6e\xe3\x02\xe2\x57\x6a\xa8\x26\x65\xd5\x45\x64\xf3\x62"
+ "\xe2\xc7\x5d\xd5\xb5\x29\x3e\x78\x84\x70\x1f\x7c\x93\xf0\x59\x5c"
+ "\xa1\xb7\x19\xf3\x29\x57\x03\xee\x6b\x9f\xe8\x81\xef\x05\xda\xad"
+ "\x5e\x40\x7a\x6f\xad\x25\xfd\x5f\x3f\x9f\xc0\xaf\x13\x85\x7b\xfa"
+ "\x99\xae\x06\x05\xde\xb8\x1a\xd4\xbd\x71\x61\xd0\xc3\xed\x0d\xf4"
+ "\x5d\xda\xd4\x08\x2d\xc1\xf7\x65\xdc\x7b\xd7\x43\xb7\x62\x4e\xbb"
+ "\xce\x40\x4c\x1d\xbe\x4b\x46\x7c\xc2\xef\x76\xc1\xf7\x2f\xf1\x4b"
+ "\x88\xd6\xf2\x73\x10\x29\xa9\xa9\x25\xfd\x00\x37\xf8\xae\x61\xcb"
+ "\x39\xfa\xae\xc1\xbc\xfe\x40\x32\xbe\x6f\xa8\x5f\x18\xa4\x19\x73"
+ "\x19\xc6\xae\x94\x7b\x7a\x37\xf6\x9c\x98\x7a\x28\xe8\x14\x8e\x0f"
+ "\x03\xc4\xe7\xfe\xde\x53\xee\x3d\xf7\xf7\x56\xe2\xf7\xf0\xfd\x1b"
+ "\x07\x78\xde\x59\x8b\x7e\x03\xff\xd5\x1a\x34\x2f\x57\x71\xa6\x92"
+ "\xaa\x4f\xc0\x3f\x15\x8c\x7f\x78\x7f\x2e\x30\x6a\x2e\xcc\x04\xbf"
+ "\x9c\xa7\xbe\x2a\xae\x03\x3f\x1d\xc0\x36\x12\x02\xf3\xc0\xd7\x10"
+ "\x4f\x69\x8a\x8d\xa7\xf8\x75\x2e\xd0\x5f\x3b\x1b\x8b\xbc\x1b\xfd"
+ "\xe6\x64\xe3\x7b\xcc\xfa\x1e\x13\xf3\x1b\xd2\x96\x1a\x6f\xf8\x2d"
+ "\xf3\x71\xf0\x4e\xb3\x07\xfa\x2b\x36\x82\xf8\x14\x57\x1d\x27\xbc"
+ "\xcf\xde\x16\x7c\x86\xb5\x6f\xef\x04\xb5\x33\xd5\x07\x75\xdc\x08"
+ "\xbe\x2a\x8d\xd6\x93\x4d\xb5\xc4\xaf\xac\xba\x02\xdf\xf7\xb4\x79"
+ "\x79\x3c\x21\x2f\xef\xe0\x2c\x25\x07\x4f\xf2\xfe\xdb\x05\xfe\x33"
+ "\x81\xff\xf0\x3d\x67\x93\xff\x16\x83\xff\xae\x83\xff\x2e\x8b\xfe"
+ "\x33\xd7\x83\xff\xea\xc1\x7f\xef\x80\xff\xea\xec\xfc\x57\x89\xef"
+ "\x42\xf1\x9d\x13\xfa\x0f\xeb\xad\x2d\xef\x04\x75\xe1\xdf\x81\xbe"
+ "\x11\x44\xb6\xce\x20\x3e\x7d\x8c\xc4\x23\xfe\x00\xd1\x42\x3f\xb5"
+ "\x7f\x00\xfb\x42\x7b\x80\xef\x73\xa4\xac\xc0\x4c\x96\x4d\x22\x0f"
+ "\xa3\x3f\x4d\x82\x3f\xcb\x4c\x7b\xc8\xf5\xfa\x20\x0d\xb4\x39\x68"
+ "\xe3\x75\x32\x64\xf4\xf9\x40\x72\x68\x42\x09\x01\x7f\x14\x59\xd2"
+ "\xe3\xf3\xdd\x7f\x0e\xef\xcf\x70\xfd\x39\xbc\xaf\xc3\xdd\xe7\xd0"
+ "\xdd\xe7\xb0\xcd\x6e\xf9\xe7\xf0\xfe\x59\xee\x3d\x87\xf7\xcf\xbc"
+ "\xfb\x1c\xde\x49\xcf\xe1\xfd\xc1\xb6\xcf\x61\x93\x56\x58\x30\x6b"
+ "\xde\xf4\x88\xf9\x11\xf3\xe7\x04\xce\x58\x12\x3d\x6b\x21\x55\x0c"
+ "\x8c\x66\x08\x32\x5b\x86\x6a\x3e\x84\xf1\xf4\xfb\x80\x0a\xf2\xd9"
+ "\x83\x15\x1a\xcb\x94\x00\x2f\x2e\xf5\x54\xb9\x25\xf5\x74\xf0\x87"
+ "\xa0\x7f\xf1\x79\x4d\x03\x5d\x7b\x41\xf3\x40\xf4\x77\x5d\x40\xf3"
+ "\x2d\xb8\x44\xf0\xff\xf4\x9d\xec\x66\x2d\xce\x5b\xcc\xd8\xc0\x55"
+ "\xe3\xbc\xc5\x23\xc3\x71\xec\x6f\x7b\xed\xfe\x50\x18\xd7\xa7\x04"
+ "\x90\x86\x29\xa1\x9a\x94\x93\xc4\xa7\x7d\x05\x19\x6d\xb1\x70\x5c"
+ "\x61\xdc\x25\xd0\x5a\x7e\xfb\x0a\x27\x5f\x22\x81\x4b\x7d\xe0\xda"
+ "\xdf\x75\x0d\x5c\x9a\x88\xff\x7a\x04\x2e\x7d\xef\xcc\x05\x4d\x47"
+ "\xbe\x6e\x06\x34\x77\x35\xb7\x61\x69\x94\xf9\x2f\x93\xf4\xf8\xbe"
+ "\x72\x6b\x27\xae\x6a\x17\x68\xfc\x5d\x8d\x46\xcd\xbb\x0b\xb0\xee"
+ "\xfb\x11\x0e\xdf\x3b\xe2\x7b\xcd\x77\x6b\x41\xc3\xaf\x10\x72\x3f"
+ "\xa0\x23\xf0\x79\x59\xbd\x81\xab\xfa\xea\x42\x85\x06\x9f\x9f\x3a"
+ "\xbf\xbe\x09\x2b\xe0\x3e\xa0\x8f\xfa\x4d\x9d\xb8\x4a\x83\xff\xb2"
+ "\x20\xaf\x40\xa2\xa9\x4f\x69\x37\x13\x34\x49\x20\xea\x89\x64\x38"
+ "\x97\x02\xe7\xf8\xf7\x7f\x9a\x0e\xd5\xdc\x7d\x6d\x07\x20\x67\x01"
+ "\x76\x3d\xae\x68\xda\x7d\xde\x00\xf7\xb8\x9a\xc6\x02\xd5\xc6\xf4"
+ "\x65\x3e\xa6\xed\x13\xf3\x4d\xa8\xe1\x7a\x4e\x2c\x6c\xf4\x5f\x6a"
+ "\x34\xa5\x2f\xc3\x3d\x5c\x3c\xe8\xf5\x5a\xbe\xae\xf8\x86\xdf\x5c"
+ "\x02\xd7\xd7\x5d\xf5\x7b\x9f\x5c\x4d\x4b\x49\x3d\x12\x93\x2f\x70"
+ "\x59\xbb\x53\x2f\x67\x08\x5c\x96\x01\xcf\x4a\x28\x70\x59\xa8\x3d"
+ "\x97\xd1\xba\x00\x33\xa1\x9c\x56\x82\x6d\x55\xe1\xb3\x82\xba\x30"
+ "\x0f\xec\x80\xcf\x01\xe2\x9d\xe7\x36\xe0\x35\xeb\x33\x81\xcf\x0b"
+ "\xf2\x17\xff\x7c\xda\x3c\x1f\xf8\x4c\xdc\x6f\x20\x5a\x7c\x26\x90"
+ "\xdf\xf0\x99\xc0\x7a\x9b\x0f\xaf\xd3\x67\xa2\x7d\x25\xd1\xf2\xcf"
+ "\x85\xa9\x88\x7f\x2e\x30\x26\x28\x36\xd9\x70\x9a\xe4\x99\x58\x63"
+ "\x7d\x26\xac\x9c\x06\xb8\x37\xe1\x33\xf1\x0e\xfb\x4c\x4c\x39\xa5"
+ "\x25\x3c\xdf\xbd\x77\xad\x32\x13\x9e\x09\xcc\x61\x99\xad\x9c\x06"
+ "\xcf\x04\xce\x07\xe2\x39\xed\x4d\x81\xd3\x0c\x70\x1c\x9e\x85\x2d"
+ "\x91\x2c\xa7\x35\xd4\x3b\xd3\x16\xda\xc1\xee\x71\x9a\x96\x5f\xff"
+ "\x0d\x7d\x85\x7e\x43\x7f\xa1\x8f\x5a\x93\x7f\x90\xb3\xcc\x5a\x05"
+ "\xce\x92\xf1\x0f\xe0\xb9\x06\xfe\x6f\xe7\x23\xee\xbd\xba\x1e\x52"
+ "\xde\x42\xbe\x42\xee\x42\xce\x42\xfe\xc2\xe7\x00\x79\x8b\xe7\x2c"
+ "\xe0\x73\xf8\x5c\x5d\xa2\x3b\xc7\xf3\x59\xfc\x79\xa2\x8d\x1f\x41"
+ "\x1e\x46\xfe\x2a\x33\x5d\x23\xc8\x67\xbc\xff\x3a\x88\xfe\x43\xfe"
+ "\xda\xb4\x98\x0c\x19\x13\x11\x48\x90\xb7\xc0\xf6\x3d\x0e\x05\x1d"
+ "\x27\x7c\x2c\x90\xe4\xd7\x79\x6b\x47\x88\xbb\x3f\x20\x5e\x69\x1d"
+ "\x89\x4f\x7d\x4a\x47\x1f\xfb\x38\xa0\x63\x17\x6b\x1c\x80\xcf\x2c"
+ "\x3e\xbb\x7a\x4d\xbb\x18\x1a\xbf\xc5\x04\xf3\x3e\xd2\x04\xf0\x6b"
+ "\x04\x60\xdc\x2c\xc6\xcc\x1d\xa7\xd2\x77\xeb\x10\x23\xfb\xbf\x19"
+ "\xca\xa5\xf7\x4d\x46\xfb\xe1\xfd\xbc\xde\x0b\x70\x96\x1e\xaf\x5f"
+ "\x87\x36\x49\x87\xf8\x3b\x3d\xbe\x5a\xc4\x54\xc7\x35\x87\xa0\xf5"
+ "\x90\x18\xb5\x98\xea\xb8\x9a\xef\xc3\xbf\x42\x7f\xc7\x4d\x09\xf5"
+ "\xb2\xfc\x2b\xd4\x1b\xfc\x1f\xf0\x96\x39\x81\x5c\x4f\xdd\xec\x13"
+ "\x6f\xe2\xaa\x03\x97\x92\xc7\xa0\x5f\x97\x8f\x40\xf4\x79\x04\x18"
+ "\xb5\x2c\x78\x2e\xf8\x72\x53\xf2\x67\x16\x83\x97\x5e\xd3\xb6\x0e"
+ "\x62\xfe\x6a\xe0\x52\x2f\x29\x97\x52\xde\x6c\x5b\xc7\xd7\x75\xa7"
+ "\x6e\x0e\xc0\xb6\xc6\x15\x91\xf6\x81\x2f\x12\xaf\x0b\x1a\xbf\x35"
+ "\x4b\x62\x09\xce\x47\xf5\x86\xff\x4f\x6a\xf8\x20\x32\x19\xbe\xdf"
+ "\x8e\xfb\xd7\x04\x8f\xa8\x17\x61\x3c\x99\x32\xc1\x03\x6b\x09\x3e"
+ "\x89\xcb\xd0\x58\xe0\x18\xad\x4d\xca\x20\x78\x7e\x75\xa3\x17\xaf"
+ "\x9b\x2c\x70\x4d\x69\x5d\x06\x59\xbd\xd8\x87\xe0\xf5\xb4\xde\x2d"
+ "\x83\xe0\xf5\x6b\x16\x68\xf9\x5a\x04\xfe\x7b\xa6\x0c\x82\xdf\x35"
+ "\xc3\xf1\xf7\x2d\xbe\x64\xed\x52\x3f\x72\x24\xb8\x94\x6f\xe3\x48"
+ "\xf0\xb7\x04\xdb\x00\x9c\xc3\xff\xbf\x22\xeb\x16\x07\xc0\x73\x9d"
+ "\x01\xe7\xff\x49\xd6\x5d\xe9\x02\xff\x5e\x80\xbf\xeb\xe4\x92\xe6"
+ "\x77\xa6\x23\xc1\x16\xd2\x3e\xf1\x39\x0e\xf0\xca\x95\xe1\x1c\xc7"
+ "\x38\x72\x0f\xf4\xdd\xbb\xac\x22\x15\xc6\xb6\x8e\x35\x38\x07\x9e"
+ "\x8b\x9f\x52\x63\xe1\xa6\x5c\xb6\xc4\x4f\xb9\x82\xbf\x6d\xe6\xa6"
+ "\xfc\x8a\xbf\xbd\x66\x69\xa0\x50\xff\x9a\xc1\xd7\xea\xad\xbe\xde"
+ "\x83\x60\x5f\xf1\x77\xf1\xf7\xd6\x2d\x08\x12\x7e\xb3\x37\xdf\x37"
+ "\xfc\x4d\x6c\x53\xfa\x9b\xb8\xbf\x7c\xe0\x6b\xfc\x6f\x2e\x81\x7f"
+ "\x3b\x80\x3f\x0c\xe8\x07\xfc\x7d\x0b\x17\xea\xcd\xc5\x87\x7a\xf2"
+ "\xdf\x89\xa9\x96\xfb\x4e\x9e\xf0\x1d\x7e\x2d\x1e\xfc\x4e\x23\xbd"
+ "\x9e\x6f\x03\xc6\xba\xc3\x78\xfc\xf1\xd0\x42\x62\xef\x43\xff\x59"
+ "\x74\xec\xf3\x1f\x48\xc7\x3e\xea\x53\x1e\x2b\x53\x42\xbd\xc1\x6f"
+ "\x5a\x1c\x27\xcf\x69\xfc\xdb\x36\xb5\xf1\xaf\x50\x4f\xf4\x37\xe2"
+ "\xc6\x8a\x25\xc4\x91\x15\x43\x7c\x3f\xa3\x08\x91\x62\x06\xfe\xef"
+ "\x23\xb4\x13\x62\x6d\x07\xfa\x40\xac\x38\x7a\x1c\xce\xdb\xe3\xe8"
+ "\x81\x3e\x22\x8e\x3a\x95\x18\xe3\x38\x0e\x71\x54\x38\x39\x09\xdb"
+ "\xc9\x12\xfb\x33\xc1\x03\x31\xd6\xba\xb0\xf5\x3b\x13\xfa\xe9\xf1"
+ "\xe5\xc4\x8f\xde\x4f\x27\x7e\xbc\x7e\x7c\x79\xa1\x1f\xf6\xd5\x7a"
+ "\x1f\xd8\x87\xb5\x96\x40\x62\xbd\x8f\x75\x8d\x3d\xa0\xdd\x2b\x44"
+ "\xf8\xce\x36\x6c\xdb\x6a\x03\xf0\x19\xb1\x7e\xc7\x7a\xfd\x5a\x4b"
+ "\x10\xf4\xbb\x37\xff\x1d\x8a\xb9\x0b\x32\xf8\xe9\x74\xd9\x16\x73"
+ "\xf7\x2f\x27\x20\x5c\x41\x2b\x4d\xae\x85\xdf\x79\xa0\x0d\xed\xdb"
+ "\xd7\xe6\x46\xf8\x0d\xf0\x81\x46\x38\xde\x4d\x82\x09\xa1\x7d\xa3"
+ "\x4c\xfb\x0f\x8c\x61\xda\x0f\x85\xf6\x63\xa0\x7d\xd4\x62\x93\x31"
+ "\xef\xf5\x40\x04\xdf\x4e\x0c\x6d\xdf\x8a\x5b\x2e\x75\x76\x4e\xd4"
+ "\x52\x72\xef\x25\x4d\x80\x96\xf2\x69\x5b\xde\xe7\x7c\x9d\x92\xc6"
+ "\x92\x6d\xb1\xa9\x53\x92\xd6\xb1\x7d\x16\x67\xa0\x35\x4a\x9a\x07"
+ "\xf8\xb9\xad\xc0\xaf\x75\xa8\x29\xf3\x40\x8f\x89\x75\x4a\x27\xf1"
+ "\x7c\x43\xe1\xe2\x73\x62\x9d\x92\xe6\x81\x62\xbc\x5e\xaf\x09\xe8"
+ "\x01\xb1\xa3\x06\x3e\xeb\xe9\xf1\xb6\x99\xd2\xe3\x4d\x75\x80\xc2"
+ "\x71\xac\xb1\x16\xf2\xac\x35\xdf\x14\x60\xae\x2d\x60\x88\x35\xbf"
+ "\xa9\x10\x9b\xaa\xd0\xbc\xdd\x13\x44\xcd\xdb\x3d\x41\x59\xf3\x06"
+ "\x5c\x74\xac\x79\x1f\x29\x12\x35\xef\xc3\xbd\xe8\x73\xff\x70\x5b"
+ "\xfa\xdc\x77\x2d\xe1\x73\xb7\xd0\x9e\xe9\xe3\x74\x03\xf7\x97\xd0"
+ "\x04\xc4\xf9\x16\xd0\xb0\x9f\x2d\x2e\xd2\xec\x82\xd8\xc8\x0c\x7a"
+ "\xf7\xdd\xa5\xc4\x0b\xd7\x67\x7b\x17\x6c\x58\x66\xaa\x24\x25\x5e"
+ "\xa8\x79\x7f\x80\x76\xba\x0e\x2e\xc5\x77\x84\x69\x6f\x86\x53\xbb"
+ "\x74\x1e\x01\xbe\xf0\x2c\x33\x1a\xf9\xeb\xf0\x1c\x8c\x6b\x55\xa8"
+ "\x7b\xbf\xb2\x14\x69\xb2\x96\xa2\x26\x4e\x2f\x94\x6a\xe2\xfa\x94"
+ "\xce\x51\xf2\x5a\xb8\x4b\x9d\x29\x45\xaa\x85\x3b\xef\x47\x2d\x8c"
+ "\x39\x71\x1c\xf7\x2d\x54\x03\xe7\x83\x1e\x2e\x44\x5d\x8c\x5a\xd8"
+ "\xc2\x68\xe1\x87\x96\x38\xd6\xc2\x9d\x2f\xde\xd5\xc2\x37\xab\x85"
+ "\x95\xe2\xfb\x87\x46\xb8\xa7\x85\x1f\x1a\x7e\x57\x0b\xb7\x94\x16"
+ "\x7e\xa8\xbf\x55\x0b\x5b\x92\xfc\xee\xc9\xfc\x80\x90\x2d\x4d\x5a"
+ "\xb8\xab\x9f\xbd\x16\xee\x1a\x64\xaf\x85\x3b\xaf\x60\xb5\xf0\xa3"
+ "\x4f\xd8\x6b\xe1\xae\x11\x4a\x5a\x18\x78\xa8\x06\xb5\x30\xe2\x08"
+ "\x75\x31\xea\x61\xe8\x5b\x35\xc5\x54\xd7\x8d\xee\x69\xe1\xae\x19"
+ "\xae\x69\xe1\xae\x0d\xf2\x5a\x38\xa0\x5a\x59\x0b\x07\x54\xcb\x6b"
+ "\xe1\x47\x36\x8a\x1a\xe6\x91\x59\x77\xbe\x16\x7e\xc4\x47\x5e\xaf"
+ "\x3c\xd2\x81\x6a\xe1\xae\xc6\xe6\xd7\xc2\x5d\x8d\xf2\x5a\xf8\x91"
+ "\x95\x54\x37\x74\x35\xd9\x6b\x61\xf8\x8e\xac\x16\x7e\x64\xaf\xf0"
+ "\x1d\x23\xab\x85\x69\x1b\x30\x06\x1e\x57\xd6\xc2\x81\x6f\xd3\x31"
+ "\x31\x70\x18\x1d\x13\xa9\x4f\xed\xb5\x70\x60\x67\xe7\x5a\x98\x62"
+ "\x88\xef\xa7\xa2\x16\x0e\x9c\x6e\xaf\x85\x03\xaa\xe5\xb5\x70\xf7"
+ "\xc1\x22\x8e\xba\x9d\x60\xb5\x70\xe0\x8e\xd6\xa1\x85\x15\xb1\xe5"
+ "\xc3\x6a\xe1\x6e\x4b\xd4\x6b\xe1\x6e\x79\xea\xb4\x30\x62\x4e\x4e"
+ "\x0b\x77\x6b\xb0\xc5\x1c\xab\x85\xbb\xfb\xcb\x6b\xe1\xee\x7d\x58"
+ "\x2d\x8c\xed\xcb\x69\xe1\xee\x93\x98\xf6\xed\xb4\x70\xf7\x45\xac"
+ "\x16\xa6\xd7\x89\x5a\xf8\xd1\x2e\x42\x6e\x61\xbd\x7a\x2d\xdc\xdd"
+ "\xec\x58\x0b\x3f\xea\xcd\x6a\xe1\xee\x15\x54\xf3\x3e\xda\x9f\x6a"
+ "\xe1\xee\x35\xf4\x78\x40\xaa\xf4\xb8\xa8\x85\xe9\x71\x7b\x2d\xfc"
+ "\xe8\x48\x27\x5a\x78\x90\xeb\x5a\xb8\xaf\x4f\x51\x93\x16\xee\xeb"
+ "\x63\xd5\xc2\x16\x0d\x8c\x51\x30\xde\xc3\x5f\x35\xce\x3f\xc0\x67"
+ "\x0e\xee\xa7\xc1\xb1\x1e\x7e\x7c\xb8\xa8\x87\x7b\xa5\xd3\x67\xbf"
+ "\xd7\x12\xfa\xec\xf7\x1a\xdc\x94\x03\x06\x2d\x8c\x9a\x58\xc8\x01"
+ "\x1f\x5b\x0b\x7f\x9f\x2d\x2d\xe2\xf5\xf0\xae\x5a\xa3\x06\x35\xf1"
+ "\x2a\xb0\x23\xea\xe2\x6f\x04\x4d\x5c\x56\x37\x48\xd0\xc5\x41\xdb"
+ "\x61\xcc\xd0\xaf\x8d\xe3\xe7\x47\xf9\x40\xff\x2a\x78\x3d\x1c\x6d"
+ "\x24\xff\x73\x7d\x90\x06\xc6\xbb\x8a\xc2\x38\x7a\x1d\xdc\x67\xa5"
+ "\xa8\x9f\x7b\xac\x64\xf4\x73\x34\xaf\x9f\x8f\xa1\x7e\xfe\x06\x22"
+ "\x94\xaf\xe2\xa8\x86\x46\xfd\x8c\x3a\x1a\xf4\x73\x79\x56\x27\xae"
+ "\xb8\x3e\xa5\xc7\x6e\xab\x86\x5e\x03\x9f\xc1\xd7\xfa\x83\xd9\x84"
+ "\x64\xcd\x26\x5e\xe0\x93\x8a\x77\xe1\x37\xf0\x7a\xb8\xae\xd2\x7a"
+ "\x1d\x8c\xd9\xe5\x54\x67\x07\xcd\xb4\x30\x39\xe7\x9e\xbd\x70\xaf"
+ "\x00\x7e\x3c\x06\x3b\xa0\x9e\xb2\xe6\x9c\x2d\x3d\x27\x16\x72\xfe"
+ "\x54\x6b\xb3\x79\xe7\xdf\x9f\xb7\x6a\xed\xb5\x82\xd6\x6e\x40\xad"
+ "\x1d\x65\xd5\xda\x3d\x43\xdc\xd4\xda\xc7\x78\x2d\x37\xb6\xf9\xb5"
+ "\xdc\xc6\x3b\x40\x6b\xa3\xce\x46\x6d\x8d\x3a\x1b\x75\x37\x6a\x6d"
+ "\xd4\xdd\x16\x41\x6b\xe3\x5a\x80\x0d\xef\x08\x5a\xfb\x3e\x89\xd6"
+ "\xf6\x90\x6a\xed\xdf\x7f\xee\x9e\xd6\xfe\x7d\xbe\x54\x6b\x23\xbe"
+ "\xd5\x6a\x6d\xf4\xb1\xdd\x3b\x4e\xf0\x15\xfa\x09\x7d\xe2\xf0\x5d"
+ "\x99\xe0\x2f\xf4\x0f\xfa\x06\x7d\xe4\x92\x7f\x00\x5f\xc5\xc6\x96"
+ "\xd3\xda\x41\x36\x5a\x1b\xb5\x35\xd8\xae\x0a\x35\x77\x59\x21\xd8"
+ "\xe6\x6d\xd0\xdd\xa0\xb9\x19\xbd\xfd\x8e\x9c\xde\xfe\x7d\x66\x53"
+ "\xee\x59\xe3\x77\xcf\x16\xcc\x3d\x77\xb4\xea\xed\xa0\x15\xf6\x7a"
+ "\x3b\x28\x43\xa2\xb7\xcb\xf5\x9a\x1e\x35\xac\xd6\xee\xbb\xd7\x5e"
+ "\x6b\x07\x1d\x57\xd4\xda\x9d\x64\xb4\xb6\xbf\x55\x6b\xf7\xf2\x76"
+ "\x4f\x6b\xf7\xf2\x52\xd2\xda\xf5\x5a\xa9\xd6\xee\x35\x4b\xd4\xda"
+ "\xd1\x12\xad\xfd\xa8\x51\x59\x6b\x3f\x4a\xf7\x39\xd3\x6e\x0e\xc0"
+ "\xb6\x50\x23\xe1\xbb\xb9\x40\x9c\x97\xae\x79\xdc\x1f\x75\x12\xe6"
+ "\x1a\xa0\xff\xa0\x95\x1e\x3b\x2b\xd5\xdc\xf8\x4e\xce\x91\x2e\x8a"
+ "\x9a\x4d\x1e\x46\x6d\x84\xba\xc8\xaa\x63\xf1\x7a\xd4\x47\xb7\x56"
+ "\x1b\x3d\x96\x20\xaf\x8d\x1e\x5b\xc3\xeb\x5e\x9c\xcf\xa8\xe9\x35"
+ "\x13\xc7\xb8\xe6\xd5\xde\xbd\x66\xca\x6b\xef\xc7\x3d\xa8\x4e\xe9"
+ "\xa5\x43\xbf\xb0\xda\x1b\xbe\x23\xab\xbd\x1f\x1f\x28\x7c\x67\x26"
+ "\xab\xbd\x69\x1b\x30\xde\x8e\x57\xd6\xde\x8f\x5f\xa6\xe3\xef\xe3"
+ "\xfb\xe9\xf8\x2b\xf8\xd8\x4e\x7b\x3f\x9e\x2e\xd5\xde\xe8\x7f\x7b"
+ "\xed\x4d\x31\xc5\xf7\x53\x51\x7b\x3f\x7e\xca\x5e\x7b\x3f\x6a\x44"
+ "\xed\x2d\x8f\xab\x3e\x07\x58\x5c\xf5\x99\x6e\xb4\x58\x35\x78\x0a"
+ "\xb4\xd7\xbb\x8f\xad\x06\x6f\x85\x58\x4b\x10\x75\x38\xde\x53\x1f"
+ "\x0f\x75\x3a\x9c\xff\xce\x40\x75\x3a\x1c\xf1\x27\xa7\xc3\xfb\x24"
+ "\xda\xe2\x8f\xd5\xe1\x7d\xb2\xe4\x75\x78\x9f\x3d\xac\x0e\xc7\xf6"
+ "\xe5\x74\x78\x9f\xb3\x4c\xfb\x76\x3a\xbc\x8f\x99\xd5\xe1\xf4\x3a"
+ "\x51\x87\xf7\xcd\x11\xf2\x1a\x6e\xe4\xa4\xfb\xae\x74\xac\xc3\xfb"
+ "\xae\x61\x75\x78\xdf\x70\xaa\xb7\xfb\x16\x18\x79\x1d\xde\x37\x9a"
+ "\x1e\x7f\x34\x53\x7a\x5c\xd4\xe1\xf4\xb8\x51\xaa\xc3\x0b\x51\x87"
+ "\xf7\x2d\x77\xa2\xc3\x87\xba\xae\xc3\x07\x57\x88\x3a\x7c\x70\x85"
+ "\x63\x1d\xde\x2f\xd1\xb1\x0e\x7f\xda\x4f\xd4\xe1\x03\x85\xf7\x51"
+ "\x03\x47\x51\x1e\x18\xd8\xc6\x9a\x97\x46\x1d\x6e\xee\x9e\x6e\x10"
+ "\xf2\xd2\x45\xbb\x16\x97\x6b\x3e\xb3\xe6\xa5\x17\x80\xbe\x36\x10"
+ "\x9f\x55\xb5\x84\xa0\x06\xc7\x5a\x8c\x62\xe3\x20\xa1\x1e\x63\xc0"
+ "\xa2\x4c\xd4\xe0\x17\xe0\x9a\x2a\xd0\xe0\xa0\xa3\xff\xa7\x71\x90"
+ "\x06\xee\xa7\x82\xb9\x76\x71\xd3\xb5\x95\xd6\x6b\x51\x7b\xc3\xf5"
+ "\xc5\xa5\xa0\xc3\xf1\x3b\xf0\xfc\x17\x17\x63\x9d\x47\xdc\x11\xfe"
+ "\x5a\x68\xa3\x5c\xd4\xec\xfd\x07\xf3\x9a\xdd\x20\x68\x76\xf8\x0e"
+ "\x68\x94\xa2\x26\xcd\xde\x58\xae\x49\xad\x65\x34\xfb\xc1\xfa\x94"
+ "\xfe\x4d\xf5\x1f\xeb\x04\xad\x9e\x6a\xe1\xb5\xfa\x31\xd0\xea\x15"
+ "\x54\xab\xf7\x4f\xb6\x5e\x03\x98\xa9\xe4\xaf\xb9\xc0\x5f\x53\x0c"
+ "\xd7\x94\x0b\xd7\xec\x94\xe8\xf9\x83\x54\xcf\x0f\x18\xc0\xea\xf9"
+ "\xfe\x0d\xa8\xe7\xad\x79\x73\xd4\x2a\xd2\xdc\xb9\xc5\x5f\x2e\x77"
+ "\xfe\xe4\x1e\xdb\xdc\x79\x03\x93\x3b\x7f\xa2\xa7\x1a\x3d\x0f\xbf"
+ "\x59\x64\xd5\x8c\x2d\xa9\x17\xef\x24\x3d\x6f\x91\xe4\xce\x2d\x4c"
+ "\xee\xfc\xc9\x44\xf7\xf4\xfc\x93\x09\x52\x3d\xdf\xe0\x5e\xee\xbc"
+ "\xa8\x25\xe3\xad\xd6\xad\xe7\x9f\x9c\x2b\xcd\x9f\xa3\x9e\x17\xf3"
+ "\xe7\x03\x26\xd8\xeb\xf9\x01\x3a\x89\x9e\x3f\xa8\xd7\xf4\xdf\xc7"
+ "\xea\xf9\x67\x56\xd9\xeb\xf9\x01\xdb\xdd\xd3\xf3\x03\x8e\xbb\xa7"
+ "\xe7\x07\x1c\x73\x4d\xcf\x0f\x1c\x28\xaf\xe7\xfb\x25\x28\xeb\xf9"
+ "\x7e\x3c\x5e\x2d\xa9\xa2\xee\xc2\xf7\x8e\x81\x8b\x51\x77\x3d\x75"
+ "\x9e\xd7\x5d\x54\x87\x81\xee\x7a\xea\xf3\xd6\xa1\xe7\x9f\x0a\x96"
+ "\xd7\x58\x4f\x4d\x15\xf5\xfc\xc0\x01\xcd\xaf\xe7\x07\x0e\x90\xd7"
+ "\xf3\x4f\x1d\xa5\x7a\x67\xe0\x20\x7b\x3d\x0f\xdf\x91\xd5\xf3\x4f"
+ "\x7b\x0b\xdf\x19\xc0\xea\x79\xda\x06\x8c\xdb\xe2\xfb\x7f\x3b\x9f"
+ "\x3e\xbd\x9f\x8e\xe3\x4f\xaf\xa1\xe3\x38\xf5\xb1\xbd\x9e\x7f\x7a"
+ "\x96\x73\x3d\x4f\x31\xc5\xf7\x53\x51\xcf\x3f\x9d\x67\xaf\xe7\xfb"
+ "\x25\xa0\x9e\x97\xc7\xd5\xe0\xf5\x2c\xae\x06\x3f\xc1\xea\xf9\xa7"
+ "\xcd\xad\x47\xcf\x2b\x62\x2d\x98\xd5\xf3\x83\x8e\xaa\xd7\xf3\x83"
+ "\xbd\xd5\xe9\x79\xc4\x9f\x9c\x9e\x1f\x3c\xde\x16\x7f\xac\x9e\x1f"
+ "\x3c\x4f\x5e\xcf\x0f\x5e\xc9\xea\x79\x6c\x5f\x4e\xcf\x0f\xfe\x9c"
+ "\x69\xdf\x4e\xcf\x0f\x2e\x61\xf5\x3c\xbd\x4e\xd4\xf3\xcf\x44\x53"
+ "\xae\xed\xd7\x53\xbd\x9e\x7f\x26\xc4\xb1\x9e\x7f\x66\x2a\xab\xe7"
+ "\x9f\xe9\x4f\x75\xfb\x33\xc9\x54\xcf\x3f\x33\x9c\x1e\xef\xd7\x43"
+ "\x7a\x5c\xd4\xf3\xf4\xb8\xbd\x9e\x7f\x26\xdb\x89\x9e\xf7\x35\xe5"
+ "\x4c\xcc\x6f\xec\x31\xb1\xf0\x86\x5f\x8a\xfe\xf1\xaa\xe7\xcc\x4d"
+ "\xeb\xf4\x87\xc3\xb8\x5f\x09\x3a\x60\x3a\xd1\xe0\x5c\xf7\xb8\xa3"
+ "\x30\xbe\x4f\xa7\x75\xf0\x38\xc6\x63\xbd\x47\xde\xd2\x42\x6f\x5c"
+ "\x57\xb0\x31\x6d\x4e\xb6\xa9\xf7\xe4\x72\x1c\xeb\x1b\x72\x26\xa6"
+ "\x1a\xd3\x96\x1a\x1b\xb0\x06\x7e\x2e\xd1\xbc\x5e\x23\xaf\xd3\x96"
+ "\x55\x72\x16\xc0\xbc\xcf\xb8\x30\xaa\xd1\x4a\x74\xe7\x79\x1c\xe3"
+ "\xf8\x8f\xf3\x14\xca\xea\x2a\x78\x3d\xe0\x1b\x3e\x94\x64\xc6\x11"
+ "\xbf\xb6\x35\x44\xdb\xd6\xc3\xe3\x9e\x97\x8f\x13\x62\x06\x2d\x30"
+ "\xa2\x17\x67\x79\x7c\xe6\x50\x5c\xdb\xa6\x1d\xd5\x03\x05\xde\x26"
+ "\x41\x0f\xbc\x7f\x9d\xf4\xce\x5a\x0c\x3a\xa0\x44\xd4\x01\x0d\x56"
+ "\x9d\x26\xd1\x00\x53\x2f\x6b\x49\x56\x12\x5b\x03\x7f\x63\xbd\xa8"
+ "\x01\x70\xfc\xe7\x5e\x0f\x22\xfd\x8c\xb4\xb6\x61\xe9\x78\x5a\x03"
+ "\xdf\xbb\x8a\x68\xb6\x4e\x23\x3e\xc5\xe1\xe7\x70\xee\x78\x40\x71"
+ "\xd5\x76\xb2\x64\x14\x79\xd8\x84\x63\x7e\x12\x97\x5f\x5c\x95\x4e"
+ "\x70\xdd\x3e\xd0\x7e\x83\x32\xae\x93\x21\x38\xce\x8e\x9e\x4e\xc7"
+ "\x7e\x3a\xc6\x0e\x19\x7c\x28\xe8\x10\x51\xaf\xdb\x86\xf0\xf5\xbf"
+ "\x8a\xf3\x51\x73\x26\x16\x9a\x7a\x4c\x4c\x35\x83\x2f\xe9\x7a\x8d"
+ "\x09\x81\x96\x8f\x3f\x22\xbb\x00\x87\x9f\x9e\xab\xf6\xc0\xb5\xa7"
+ "\x71\x1f\x46\xcb\xce\xc9\xe5\x8c\x6f\x6e\x08\xbe\xb9\x41\x7d\x83"
+ "\x7e\x99\x16\x45\x70\x9d\xbf\x76\xe8\x93\x32\x63\x05\xb1\x2c\xb3"
+ "\xee\xc5\xd8\x9f\x6c\xb1\x50\x7f\x98\x6f\xe8\xda\x58\xc0\xf6\xb8"
+ "\x9e\x15\xe0\x81\xd7\x63\xab\x71\x7f\xc6\x44\x8f\xb6\xa8\xc7\x00"
+ "\xdf\xf7\x6d\x6d\x04\x3f\x9c\xa5\x7e\xe0\x92\xb4\xfc\xbf\x26\x08"
+ "\x37\xa0\xed\xee\x37\x6e\x80\x2f\x8c\x76\xbe\x08\xc5\x7d\x1c\x71"
+ "\xad\x39\xd3\x7a\xba\x9e\x1e\xef\x8b\x65\x41\x5d\x70\x2d\x0a\x7e"
+ "\x1e\xc9\x8d\x20\xe4\x4b\xed\x96\x0b\x38\xff\x85\xfa\xc0\x2c\xd8"
+ "\x1e\xf7\x74\x44\x7b\xa3\xd6\x2a\x03\x8d\xc5\xcf\xeb\x48\x79\x66"
+ "\xf7\x8d\xed\x13\x53\xb1\xee\xe4\x8a\xe6\xd9\x3d\xee\xe9\x9b\x67"
+ "\x77\xb7\xbc\xed\x03\x5b\xa1\xed\x87\x24\x88\xb6\x7f\xee\x09\xf7"
+ "\x6c\xff\x5c\xff\x96\xb7\xbd\xb6\x15\xda\xfe\x59\x93\x68\xfb\xa1"
+ "\x79\xee\xd9\x7e\xa8\xe2\xfc\x7f\xb4\x3d\xe6\x83\xac\xb9\x20\x6b"
+ "\x1e\x08\xc7\x38\x1a\x83\x8c\x9c\x29\xd6\x25\x8e\x9c\x29\xad\x4b"
+ "\xfc\xfe\x20\xe6\x48\xac\x75\x89\xc3\x9c\xe4\x7f\x46\xec\x14\xf3"
+ "\x3f\xc3\xdb\x52\xdd\xf8\xc2\x6f\x54\x37\xbe\xc0\xbf\xd3\x8a\x3d"
+ "\x45\x34\xa6\xdf\x4f\xd2\xef\x9a\x5f\xa8\xc1\x39\x39\xbb\xae\x18"
+ "\x35\xab\x6b\x41\x07\x6a\x1e\xe1\x30\xef\xb3\x66\x01\xd6\x23\xd6"
+ "\x11\xd0\x60\x8f\x5c\xd2\xbc\xd0\x0b\xd7\xef\xfa\xea\x4a\x21\x9f"
+ "\x6f\xe1\xba\x7f\x44\x76\x3e\x68\xf0\xc0\xb1\x6d\xd7\x7c\xa3\xc6"
+ "\x8a\x17\xeb\xdc\x3b\xb0\x61\xa1\xd9\x3f\x45\x7f\x75\xfb\xc4\x7c"
+ "\x6b\xfd\xa0\x29\x6f\x72\xb9\x2c\x86\x70\x4e\x1f\xe0\x08\x31\x83"
+ "\x73\xf0\xac\x78\x42\x1c\x95\x1a\xab\x09\xee\x4f\xd3\xbe\x1a\xe2"
+ "\x7d\xc0\xd0\x94\x1d\xe0\x5f\x29\x8e\x52\x15\x70\xb4\x91\xc5\xd1"
+ "\x55\x01\x47\x80\x27\x11\x47\x4d\xf3\xb9\xae\x55\xaa\xc2\x51\x8d"
+ "\x80\xa3\xf5\x36\x38\xba\x1c\x48\xbe\xaf\x3c\x25\xe0\xe8\xb9\x18"
+ "\x53\x4f\x2b\x8e\x9e\xbf\x76\x28\x0c\x70\x14\xa6\x16\x47\xcf\xd7"
+ "\xb1\x31\xeb\xa8\x0e\xf6\x31\xeb\x0b\x93\x6c\x63\x56\x6b\x8c\x7a"
+ "\xd5\x3f\x5e\x7f\x15\xe2\xd4\xba\xa6\x38\xf5\x85\x58\xf7\xf0\xfc"
+ "\xc2\x72\xd7\x6a\xbc\x5e\x38\x65\x5b\xe3\xf5\x29\x1f\xa7\x0e\x5b"
+ "\x81\x58\x93\x8f\x53\xe9\x39\xfb\xda\x9c\x11\xb1\x62\x6d\xce\x88"
+ "\x51\x77\x7e\x8d\xd7\xf0\x1a\xf9\x78\x61\xf8\x35\x5a\xe3\xf5\x42"
+ "\x65\xf3\xd7\x78\xbd\x50\x29\x1f\x97\x8e\x88\xa0\xba\xfd\x05\xbd"
+ "\x7d\x8d\x17\x7c\x47\x36\x2e\x1d\x91\x25\x7c\xa7\x92\x8d\x4b\x69"
+ "\x1b\xc0\x27\x7b\x95\xe3\xd2\x17\x43\x28\xbf\xbc\xd8\x93\xf2\x0b"
+ "\xf5\xa9\x7d\x5c\x3a\xc2\x2c\x8d\x4b\xe5\x6b\xbc\x28\x86\xf8\x7e"
+ "\x2a\xc6\xa5\x2f\x8e\xb0\x8f\x4b\x87\x25\xc8\xd7\x78\x8d\xec\x2a"
+ "\xe2\xe8\xa5\xfd\x6c\x8d\xd7\x8b\x6b\x5a\x47\x8d\x97\x22\xb6\x6a"
+ "\xd8\x1a\xaf\x97\xa6\xaa\xaf\xf1\x7a\x69\xbd\xba\x58\x14\x31\x27"
+ "\x17\x8b\xbe\x74\xca\x16\x73\x6c\x2c\xfa\x52\x83\x7c\x2c\x3a\xb2"
+ "\x03\x1b\x8b\x62\xfb\x72\xb1\xe8\xc8\x67\x99\xf6\xed\x62\xd1\x91"
+ "\x93\xd8\x58\x94\x5e\x27\xc6\xa2\x23\x4d\x94\x43\x87\xf5\x52\x1f"
+ "\x8b\x8e\xe4\xdf\x6b\xe6\x6d\xa2\xef\x6e\xd8\x38\x74\xe4\x79\x36"
+ "\x0e\x1d\x59\x40\xe3\xcd\x51\x5a\x5a\xdf\x35\xb2\x98\x1e\x1f\x16"
+ "\x24\x3d\x2e\xc6\xa1\xf4\x38\xd6\x77\xd1\xba\xae\x51\x81\xea\xe2"
+ "\xcf\x7e\x77\x60\xfc\xd9\xdf\x41\xfc\xd9\xbf\x95\xc6\x9f\x2f\xef"
+ "\x75\x2f\xfe\x7c\xb9\xa0\xe5\x75\x78\x6b\x8c\x81\x46\x0d\x10\x75"
+ "\xf8\xe8\x81\xee\xe9\x96\xd1\x03\x5a\xde\xf6\xad\x31\x06\xfa\x13"
+ "\x11\x6d\x3f\xe6\x73\xf7\x6c\x3f\x46\x71\xfd\x37\xe7\x31\x50\x88"
+ "\x4e\x8c\x81\x42\x74\xca\x31\xd0\xd8\x95\x8e\x63\xa0\x57\xf2\xc5"
+ "\x18\x68\x7c\x07\xaa\x51\x82\xaf\x51\x8d\x12\xbc\x47\x7d\x0c\x14"
+ "\xdc\xe7\x6e\x0c\xa4\x26\x06\x1a\xbd\x5c\x8c\x81\xc6\x35\xb8\x17"
+ "\x03\x8d\x33\xb2\x31\xd0\x6b\xfe\xf6\x31\x50\xb0\xdd\xfc\x6f\xe5"
+ "\x18\x28\x38\xd1\x3d\x3c\x07\x27\xb8\x16\x03\x05\x9f\x95\x8f\x81"
+ "\xc6\x26\x2b\xc7\x40\xf4\x9c\xbd\x76\x7d\x25\x51\xd4\xae\xaf\x8c"
+ "\xb9\xf3\x63\xa0\xf1\x06\x79\x9d\x3a\xbe\x81\xc6\x40\xc1\xfa\xe6"
+ "\x8f\x81\x82\xf5\xf2\x31\xd0\x2b\xf3\xa8\x5e\x0c\xae\xb2\x8f\x81"
+ "\xe0\x3b\xb2\x31\xd0\x2b\xdb\x84\xef\xe8\xd9\x18\x88\xb6\x01\x7c"
+ "\xb2\x5f\x39\x06\x7a\x75\x12\xe5\x97\x57\x7b\x51\x7e\xa1\x3e\xb5"
+ "\x8f\x81\x5e\xf5\x70\x1e\x03\x51\x0c\xf1\xfd\x54\x8c\x81\x5e\x1d"
+ "\x65\x1f\x03\x8d\x5d\x21\x1f\x03\x85\x74\x13\x71\x34\xe1\x00\x1b"
+ "\x03\xbd\xba\xbe\x75\xc4\x40\x8a\xd8\x32\xb0\x31\xd0\x84\xe9\xea"
+ "\x63\xa0\x09\xe9\xea\x62\x20\xc4\x9c\x5c\x0c\x34\xe1\xac\x2d\xe6"
+ "\xd8\x18\x68\x82\x59\x3e\x06\x0a\xf1\x67\x63\x20\x6c\x5f\x2e\x06"
+ "\x0a\x19\xc6\xb4\x6f\x17\x03\x85\x4c\x65\x63\x20\x7a\x9d\x18\x03"
+ "\xbd\x46\x28\x87\x8e\xed\xa3\x3e\x06\x0a\x39\xab\x1c\x03\x85\x5c"
+ "\x64\x63\xa0\x90\x7d\x34\xd6\x79\xcd\x8f\xc6\x40\x21\xe5\xf4\xf8"
+ "\xd8\xde\xd2\xe3\x62\x0c\x44\x8f\x8b\x31\xd0\x6b\x3d\xd4\xc5\x40"
+ "\x8f\xdc\x81\x31\x50\xa0\x83\x18\x28\xb0\x95\xc6\x40\x13\xf7\xbb"
+ "\x17\x03\x4d\xdc\x77\x57\x87\xbb\xa3\xc3\x5f\x1b\x24\xea\xf0\x49"
+ "\x83\xdd\xd3\x2d\x93\x1c\xbe\xff\x74\xac\xc3\xc3\x0d\xa2\x0e\x0f"
+ "\x37\x28\xeb\xf0\xc9\x6d\x1d\xeb\xf0\x69\x83\x44\x1d\x1e\xb6\x91"
+ "\x8e\x93\x61\xb1\x74\x9c\x0c\x7b\x56\xbd\x0e\x9f\xb2\xe7\xae\x0e"
+ "\x57\xa3\xc3\x43\xbd\x44\x1d\x3e\x25\xd1\x3d\x1d\x3e\x25\x81\xd5"
+ "\xe1\xd3\xb3\xec\x75\xf8\x94\xf3\xae\xeb\xf0\xb0\x36\xee\xe1\x39"
+ "\xcc\xc7\x35\x1d\x1e\x16\x21\xaf\xc3\x27\x6b\x95\x75\x38\x3d\x67"
+ "\xaf\x9f\xa6\xb5\x11\xf5\xd3\xd4\xe3\x77\xbe\x0e\x9f\x1a\x23\xaf"
+ "\x95\xa6\x26\x52\x1d\x1e\xa6\x6b\x7e\x1d\x1e\xa6\x93\xd7\xe1\x53"
+ "\xaf\x51\xcd\x12\x36\xd7\x5e\x87\xc3\x77\x64\x75\xf8\xb4\x5e\xc2"
+ "\x77\x74\xac\x0e\xa7\x6d\x00\x9f\x8c\x50\xd6\xe1\xd3\xce\x52\x7e"
+ "\x99\xf6\x39\xe5\x17\xea\x53\x7b\x1d\x3e\x6d\x95\x73\x1d\x4e\x31"
+ "\xc4\xf7\x53\x51\x87\x4f\x3b\x6a\xaf\xc3\x27\xfb\xca\xeb\xf0\xf0"
+ "\x1d\x22\x8e\xc2\x47\xb1\x3a\xfc\xf5\xce\xad\x43\x87\x2b\x62\x2b"
+ "\x86\xd5\xe1\xaf\x5f\x54\xaf\xc3\xc3\xbb\xaa\xd3\xe1\x88\x39\x39"
+ "\x1d\x1e\x1e\x61\x8b\x39\x56\x87\x87\xaf\x94\xd7\xe1\xe1\x59\xac"
+ "\x0e\xc7\xf6\xe5\x74\x78\xf8\x61\xa6\x7d\x3b\x1d\x1e\x7e\x9e\xd5"
+ "\xe1\xf4\x3a\x51\x87\x4f\x4f\xa6\x1c\x3a\x69\x8f\x7a\x1d\x3e\x3d"
+ "\x42\x59\x87\x4f\x7f\x9b\xd5\xe1\xd3\x87\x53\xbd\x3d\x3d\x93\xea"
+ "\xf0\xe9\xa1\xf4\xf8\xa4\xdd\xd2\xe3\xa2\x0e\xa7\xc7\x45\x1d\x3e"
+ "\x7d\xa7\x3a\x1d\xde\xfe\x0e\xd4\xe1\x5a\x07\x3a\x5c\xdb\x4a\x75"
+ "\xf8\x1b\x23\xdc\xd3\xe1\x6f\x28\xee\xff\xe9\x5c\x0b\x46\x9a\x44"
+ "\x2d\x18\x69\x52\xd6\x82\x33\x3b\x3b\xd6\x82\x3a\xc9\xfa\x00\xb3"
+ "\xb7\x53\xae\x9e\xbd\x8a\x72\xf5\xec\x51\xea\xb5\xe0\xac\x03\x77"
+ "\xb5\xa0\x1a\x2d\x38\xbd\x50\xd4\x82\xb3\xd6\xb8\xa7\x05\x67\xad"
+ "\x66\xb5\xe0\x9b\x3b\xec\xb5\xe0\xac\xdf\x5c\xd7\x82\xb3\xfd\xdd"
+ "\xd3\x82\xb3\xfd\x5c\xd3\x82\xb3\x17\xc9\x6b\xc1\x99\x5d\x94\xb5"
+ "\x20\x3d\x67\x3f\x86\xeb\xfc\xc5\x31\x7c\xce\xd9\x3b\x5f\x0b\xce"
+ "\x59\x21\x3f\x5e\xcf\x59\x43\xb5\xe0\xec\xe8\xe6\xd7\x82\xb3\xa3"
+ "\xe5\xb5\xa0\x4e\x98\xff\x3c\x3b\xc6\x5e\x0b\xc2\x77\x64\xb5\xa0"
+ "\x4e\x98\xff\x3c\x3b\x9a\xd5\x82\xb4\x0d\xe0\x13\x07\xf3\x9f\x75"
+ "\xc2\xfc\x67\x9d\x30\xff\x99\xfa\xd4\x5e\x0b\xea\xd2\x9d\x6b\x41"
+ "\x8a\x21\xbe\x9f\x8a\x5a\x50\x27\x33\xff\x79\x66\x80\xbc\x16\x8c"
+ "\xdc\x23\xe2\x28\x32\x84\xd5\x82\x11\x3d\x5b\x87\x16\x54\xc4\xd6"
+ "\x0a\x56\x0b\x46\x5c\x53\xaf\x05\x23\x7b\xa9\xd3\x82\x88\x39\x39"
+ "\x2d\x18\xb9\xc8\x16\x73\xac\x16\x8c\x5c\x2f\xaf\x05\x23\x77\xb0"
+ "\x5a\x10\xdb\x97\xd3\x82\x91\xc7\x99\xf6\xed\xb4\x60\xe4\x6f\xac"
+ "\x16\xa4\xd7\x89\x5a\xf0\xcd\x34\xca\xa1\x6f\x1c\x50\xaf\x05\xdf"
+ "\x5c\xa4\xac\x05\xdf\x8c\x65\xb5\xe0\x9b\xc1\x54\xf3\xbd\x99\x4b"
+ "\xb5\xe0\x9b\x33\xe9\xf1\x37\x0a\xa5\xc7\x45\x2d\x48\x8f\x8b\x5a"
+ "\xf0\xcd\x02\x67\x5a\xd0\xb1\x7e\x58\x38\x41\xd4\x0f\x0b\x27\x48"
+ "\xf5\xc3\x61\x46\x3f\xcc\x9d\xe4\x58\x3f\x44\x65\x8a\xfa\x61\xbe"
+ "\x99\x3e\xdf\xf3\xcf\xd2\xe7\x7b\xfe\x36\x5e\x3f\x8c\x81\x71\x1e"
+ "\xf4\x43\xde\xa5\x7c\xaa\x1f\x2e\x19\x35\xef\x5f\x11\xf4\x43\x0d"
+ "\xf1\x59\x3d\x5f\xd0\x0f\xd3\x50\x3f\xcc\xef\x8c\xfa\xc1\x37\x13"
+ "\xb4\x6a\x95\xa0\x5d\xa3\x40\xbb\x56\xc1\x67\x78\x76\xbe\x82\x36"
+ "\x4a\x41\x5f\xa6\xe2\xf7\x71\x3f\x03\x68\x8b\x9f\x97\xc9\xcf\xd9"
+ "\xd4\x7b\xe3\x3e\x39\xa8\x2d\x70\xdf\x09\xa7\x7b\x4e\x54\x09\x7b"
+ "\x4e\xcc\x64\xf7\x9c\xc0\xbd\x26\x70\xdf\x89\xcc\x05\xc4\x6f\xb3"
+ "\xa0\x29\xda\x25\x7a\xb4\xc3\x7d\x27\xda\xd5\x51\x7d\x9a\x67\x29"
+ "\xa2\xfa\x74\x61\xc0\x7d\xa0\x85\x7a\x6f\xa9\x15\xb5\xc4\x87\xa8"
+ "\x23\x16\x06\x05\xd6\x2d\x0c\x7a\xf8\xea\xd5\xa0\xee\xf6\xfb\x4d"
+ "\xd4\xf5\xc0\xf5\xf2\xcb\x62\x2a\x78\x1d\xc1\xef\x53\x30\x27\x88"
+ "\x6c\x9d\x4d\x7c\x40\x17\x7b\xf4\x05\x7d\xfa\x87\x2e\xd0\xf7\x12"
+ "\xa2\x35\x5f\x0d\xea\x22\x5d\xdb\x10\xfa\xae\xb5\x5c\x0d\x22\xc5"
+ "\xe1\x27\xf9\x39\x9a\x26\x61\x8e\xa6\x61\x61\x10\xae\xc1\x3f\x68"
+ "\xd3\x02\x89\x3e\xf5\xb7\xea\xd3\x79\xe7\xdd\xd3\xa7\xf3\xaa\x58"
+ "\x5d\x11\xed\x61\xaf\x2b\xe6\x8f\x72\x5d\x57\xcc\x9f\xe7\x9e\xae"
+ "\x98\x3f\xd7\x35\x5d\x31\xbf\xc4\x56\x57\xec\xe0\x75\xc5\xdc\x30"
+ "\xc4\xa0\xbc\xae\xa0\xe7\xec\xc7\x83\xa8\x79\xe2\x78\x10\x35\xf8"
+ "\xce\xd7\x15\x6f\x55\xca\x73\xff\x5b\xe7\xa9\xae\x98\x5f\xdc\xfc"
+ "\xba\x62\x7e\xb1\xbc\xae\x88\x12\xd6\x7f\x9b\x5f\x6e\xaf\x2b\xe0"
+ "\x3b\xb2\xba\x22\x6a\x8d\xf0\x9d\x62\x56\x57\xd0\x36\x80\x67\x76"
+ "\x28\xeb\x8a\xb7\x47\x50\xde\x79\xdb\x9f\xf2\x0e\xf5\xa9\xbd\xae"
+ "\x88\xba\xec\x5c\x57\x50\x0c\xf1\xfd\x54\xd4\x15\x6f\x0f\xb4\xd7"
+ "\x15\x73\x43\xe5\x75\xc5\xc2\xb6\x22\x8e\x16\xe4\xb1\xba\xe2\xed"
+ "\xd8\xd6\xa1\x2b\x14\xb1\x55\xc9\xea\x8a\x05\x63\xd4\xeb\x8a\x05"
+ "\x89\xea\x74\x05\x62\x4e\x4e\x57\x2c\x28\xb1\xc5\x1c\xab\x2b\x16"
+ "\x5c\x94\xd7\x15\x0b\x3d\x58\x5d\x81\xed\xcb\xe9\x8a\x85\x7d\x98"
+ "\xf6\xed\x74\xc5\xc2\x51\xac\xae\xa0\xd7\x89\xba\x62\x61\x0d\xe5"
+ "\xd0\xb9\x1e\xea\x75\xc5\xc2\x12\x65\x5d\xb1\xf0\x38\xab\x2b\x16"
+ "\xe6\x52\xfd\x10\x4d\xa8\xae\x58\xb8\x8f\x1e\x47\x0a\x15\x8f\x8b"
+ "\xba\x82\x1e\x17\x75\x45\xb4\xf6\xee\x7c\xcb\x3b\x31\xc7\xb4\x68"
+ "\x87\x7b\x63\xf8\x22\xc7\xfb\x7f\xde\x9d\x6f\xa9\xf0\xae\x37\xba"
+ "\x87\xf8\xae\xf7\x9d\x9e\xee\xe9\x96\x77\x7a\xb4\xbc\xed\x5b\x63"
+ "\xad\xf1\x22\x83\x68\xfb\x98\x6d\xee\xd9\x3e\x26\xbb\xe5\x6d\xdf"
+ "\x1a\x6b\x1c\xde\x99\x2b\xda\x7e\x69\x57\xf7\x6c\xbf\xb4\x8b\xfb"
+ "\x79\xed\x44\x49\x8d\x43\xa2\x41\x39\x2e\x5d\xfa\x9b\xe3\xb8\x34"
+ "\x5e\x52\xe3\x10\x2b\xd4\x38\xc4\x0a\x35\x0e\xb1\x7c\x8d\x43\x1c"
+ "\xc6\xa5\x1f\xa7\x1b\x3e\x5b\x50\xa0\xc1\x75\xb7\xf2\x16\x18\x35"
+ "\xe0\x13\x2f\x13\xc6\xa5\x60\xeb\x35\xfc\xfe\x0f\x07\x85\xbc\xf6"
+ "\xf2\x3d\xa5\xd5\xd2\xbd\x1f\x96\x0d\x13\xd7\xae\x3d\x48\xf0\xdc"
+ "\x57\xb5\x05\x9a\xd4\x46\x9b\x9c\x37\xb4\x19\x38\x9f\xcd\x79\x63"
+ "\xae\xbb\x41\xb2\x8f\x83\x39\x3d\x45\xef\x2c\xe7\x6d\x9b\xef\xce"
+ "\x6a\x24\x7e\xad\x37\xe7\x1d\x53\x2d\xe6\xbc\x97\xbb\x59\xff\xb0"
+ "\xdc\xa6\xfe\x21\x49\xa6\xfe\x61\xb9\x8a\xfa\x87\x58\x37\xeb\x1f"
+ "\x62\x5d\xac\x7f\x88\xb5\xab\x7f\xa0\xb1\xe9\xd2\xba\x38\xc5\xd8"
+ "\x94\x9e\xb3\x8f\x29\xe2\x25\xf5\x0f\x71\xad\xa0\xfe\x21\x4e\xe1"
+ "\x1d\x75\x9c\x50\xff\x10\x7b\x0b\xea\x1f\x62\x15\xea\x1f\xe2\x84"
+ "\xfa\x87\x58\x99\xfa\x87\x58\x85\xfa\x87\x78\xa1\xfe\x21\xd6\xa6"
+ "\xfe\x21\x56\xa8\x7f\x88\x77\x50\xff\x10\x2f\xd4\x3f\xc4\x0b\xf5"
+ "\x0f\xd4\xa7\xf6\xb1\x69\xbc\x0b\xf5\x0f\xb1\x42\xfd\x43\xac\x83"
+ "\xfa\x87\x78\x99\xfa\x87\xa5\x06\xf9\xd8\x34\x51\x52\xff\x90\x68"
+ "\x53\xff\x90\xd0\x4a\xea\x1f\x14\xb1\x65\x53\xff\x90\xe0\x46\xfd"
+ "\x43\xa2\xca\xfa\x87\x58\x85\xfa\x87\xc4\x08\x5b\xcc\xb1\xb1\x69"
+ "\xa2\x42\xfd\x43\xa2\x4d\xfd\x43\xac\x42\xfd\x43\xe2\x61\xa6\x7d"
+ "\xbb\xd8\x34\xd1\xa6\xfe\x21\xd6\xa6\xfe\x21\x49\xa8\x7f\x58\xba"
+ "\x51\x7d\x6c\x9a\xe4\xa0\xfe\x21\xc9\xa6\xfe\x21\x49\xa8\x7f\x48"
+ "\x12\xea\x1f\x92\x84\xfa\x87\xa5\x19\xd2\xe3\x62\x6c\x4a\x8f\x8b"
+ "\xb1\x69\x92\xca\xfa\x87\xbb\x73\x31\x6f\x4f\x6c\xba\xc2\xcd\xfa"
+ "\x87\x15\x0e\xeb\x1f\xee\xc6\x47\x4a\x1a\x3d\xa9\x50\xd4\xe8\x2b"
+ "\x0f\xb8\xa7\x5b\x56\x16\xb6\xbc\xed\x5b\x63\x7c\xb4\x62\xb5\x68"
+ "\xfb\x3f\x3f\xeb\x9e\xed\xff\x3c\xc4\xfd\xf8\x68\x9d\x56\x8c\x8f"
+ "\xd6\x69\x95\xe3\xa3\xe4\x0e\x8e\xe3\xa3\xd5\xa1\x62\x7c\x94\xb2"
+ "\x97\x6a\x94\x94\x2c\xaa\x51\x52\xa6\xaa\x8f\x8f\x56\x1d\x67\xe3"
+ "\xa3\xe4\xe9\x77\xe3\x23\x77\xe3\xa3\xf7\x7c\xc4\xf8\x68\xd5\x36"
+ "\xf7\xe2\xa3\x55\xd9\x6c\x7c\xb4\x6e\xbf\x7d\x7c\x94\xe2\xed\x7a"
+ "\x7c\x94\xd2\xcb\x3d\xac\xa7\x04\xb9\x16\x1f\xa5\xac\x92\x8f\x8f"
+ "\x92\xfd\x94\xe3\x23\x7a\xce\x5e\xd7\xae\xee\x25\xea\xda\xf7\xaf"
+ "\xdd\xf9\xf1\xd1\xfb\x19\xf2\x1a\xf6\xfd\x6d\x34\x3e\x4a\x49\x6e"
+ "\xfe\xf8\x28\x25\x59\x3e\x3e\x5a\xed\x4f\xb5\x64\xca\x6a\xfb\xf8"
+ "\x08\xbe\x23\x1b\x1f\xad\x1e\x25\x7c\x27\x99\x8d\x8f\x68\x1b\xc0"
+ "\x35\xb3\x94\xe3\xa3\x35\x1e\x94\x7b\x56\x1f\xa5\xdc\x43\x7d\x6a"
+ "\x1f\x1f\xad\xde\xe1\x3c\x3e\xa2\x18\xe2\xfb\xa9\x18\x1f\xad\xfe"
+ "\xcd\x3e\x3e\x4a\xd6\xca\xc7\x47\x6b\x0f\x8b\x38\x5a\x1b\xc1\xc6"
+ "\x47\x6b\x06\xb7\x8e\xf8\x48\x11\x5b\x19\x6c\x7c\xb4\xb6\x8d\xfa"
+ "\xf8\x68\xed\xb3\xea\xe2\x23\xc4\x9c\x5c\x7c\xb4\x76\x95\x2d\xe6"
+ "\xd8\xf8\x68\xed\x76\xf9\xf8\x68\xed\x7e\x36\x3e\xc2\xf6\xe5\xe2"
+ "\xa3\xb5\x17\x99\xf6\xed\xe2\xa3\x75\xde\x6c\x7c\x44\xaf\x13\xe3"
+ "\xa3\x75\xb9\x94\x43\xff\xbc\x57\x7d\x7c\xb4\x6e\x95\x72\x7c\xb4"
+ "\x6e\x3d\x1b\x1f\xad\x9b\x49\xe3\xa0\x75\xfb\x68\x7c\xb4\x2e\x86"
+ "\x1e\xff\x73\x81\xf4\xb8\x18\x1f\xd1\xe3\x62\x7c\xb4\xae\xf8\xee"
+ "\x3c\xcd\x3b\x31\x3e\x5a\x3f\xcb\xbd\xf8\x68\xfd\xcc\xbb\x1a\xdd"
+ "\x1d\x8d\xbe\x4e\x2f\x6a\xf4\x0f\xce\xba\xa7\x5b\x3e\xd0\xbb\xaf"
+ "\xd1\x37\xed\x16\x35\xfa\xa6\xdd\xca\x1a\xfd\xc3\x3d\x8e\x35\xfa"
+ "\x47\x26\x51\xa3\x6f\x98\x4a\xc7\xc9\x0d\xc2\xbe\x9d\x1b\x3c\xd4"
+ "\x6b\xf4\xf4\x25\xac\x46\x4f\xf3\xbe\xab\xd1\xdd\xd5\xe8\xeb\x77"
+ "\x8a\x1a\x3d\x7d\x84\x7b\x1a\x3d\x7d\x38\xab\xd1\x37\x4f\xb7\xd7"
+ "\xe8\xe9\x3b\x5c\xd7\xe8\xe9\x25\xee\x61\x3d\xbd\xd8\x35\x8d\xbe"
+ "\xa1\x8f\xbc\x46\xff\xb0\x40\x59\xa3\xd3\x73\xf6\xda\xea\xa3\x12"
+ "\x51\x5b\x7d\xb4\xf1\xce\xd7\xe8\x1f\x0d\x91\xd7\x51\x1f\x8d\xa0"
+ "\x1a\x7d\x43\xef\xe6\xd7\xe8\x1b\x7a\xcb\x6b\xf4\x8f\x84\xfd\x7f"
+ "\x37\xf4\xb7\xd7\xe8\xf0\x1d\x59\x8d\xfe\xd1\x65\xe1\x3b\xbd\x59"
+ "\x8d\x4e\xdb\x38\xa7\xc9\x68\xa3\xac\xd1\x33\x84\x79\x41\x19\x8b"
+ "\x28\xf7\x50\x9f\xda\x6b\xf4\x8c\x31\xce\x35\x3a\xc5\x10\xdf\x4f"
+ "\x45\x8d\x9e\x91\x6e\xaf\xd1\x3f\xdc\x2d\xaf\xd1\x37\x49\xea\x34"
+ "\x37\xb5\x65\x35\x7a\xc6\xa9\xd6\xa1\xd1\x15\xb1\x35\x84\xd5\xe8"
+ "\x1b\xf3\xd4\x6b\xf4\x8d\x67\xd5\x69\x74\xc4\x9c\x9c\x46\xdf\xd4"
+ "\xc7\x16\x73\xac\x46\xdf\x34\x4a\x5e\xa3\x6f\x9a\xce\x6a\x74\x6c"
+ "\x5f\x4e\xa3\x6f\x5a\xc3\xb4\x6f\xa7\xd1\x37\xed\x60\x35\x3a\xbd"
+ "\x4e\xd4\xe8\x9b\x47\x53\x0e\xfd\x70\xaa\x7a\x8d\xbe\xb9\x8f\xb2"
+ "\x46\xdf\x3c\x90\xd5\xe8\x9b\x7d\xa8\x16\xdf\x1c\x4e\x35\xfa\xe6"
+ "\x2e\xf4\xf8\x87\x61\xd2\xe3\xa2\x46\xa7\xc7\x45\x8d\xbe\x39\xea"
+ "\xee\x1c\xce\x3b\x51\xa3\x67\xb5\x71\x4f\xa3\x67\xf9\xb8\xaf\x13"
+ "\x73\x2a\x45\x9d\x98\x53\xa9\xac\x13\xb3\x4e\x39\xd6\x89\x1f\xf7"
+ "\x10\x75\x62\xf6\x4a\xca\xd5\xd9\x11\x94\xab\xb3\x7b\xa9\xd7\x89"
+ "\x5b\xb7\xb1\x3a\x71\x4b\x9f\xbb\x3a\xd1\x5d\x9d\xb8\x79\x85\xa8"
+ "\x13\xb7\xce\x73\x4f\x27\x6e\x9d\xcb\xea\xc4\xed\x32\x7b\x65\x6d"
+ "\x3d\xea\xba\x4e\xdc\x7a\xcd\x3d\x9d\xb8\xb5\xce\x35\x9d\x98\x1d"
+ "\x22\xaf\x13\xb3\xf4\xca\x3a\x91\x9e\xb3\x1f\xdf\xb7\x5d\x13\xc7"
+ "\xf7\x6d\x07\xee\x7c\x9d\xb8\x6d\xa6\xfc\x58\xbe\x6d\x1e\xd5\x89"
+ "\xd9\x13\x9a\x5f\x27\x66\x4f\x90\xd7\x89\xdb\x84\xf5\xcf\xb2\x43"
+ "\xed\x75\x22\x7c\x47\x56\x27\x7e\x2c\xe4\x7f\xb3\x27\xb0\x3a\x91"
+ "\xb6\x01\x5c\xf3\x84\xb2\x4e\xfc\xb8\x84\x72\xcf\xc7\xc2\x7b\x24"
+ "\xea\x53\x7b\x9d\xf8\xf1\x22\xe7\x3a\x91\x62\x88\xef\xa7\xa2\x4e"
+ "\xfc\x78\xbf\xbd\x4e\xcc\xaa\x94\xd7\x89\x39\xe9\x22\x8e\x72\x06"
+ "\xb2\x3a\xf1\x7f\xbc\x5b\x87\x4e\x54\xc4\xd6\x4c\x56\x27\xfe\xcf"
+ "\x71\xf5\x3a\x31\xa7\x8d\x3a\x9d\x88\x98\x93\xd3\x89\x39\x21\xb6"
+ "\x98\x63\x75\x62\xce\xdb\xf2\x3a\x31\x67\x15\xab\x13\xb1\x7d\x39"
+ "\x9d\x98\xb3\x87\x69\xdf\x4e\x27\xe6\x1c\x65\x75\x22\xbd\x4e\xd4"
+ "\x89\xdb\x85\x3d\xb0\xb2\x56\xaa\xd7\x89\xdb\x43\x94\x75\xe2\x76"
+ "\x9b\xfd\xaf\xb6\x0b\xfb\x5f\x6d\x4f\xa6\x3a\x71\xbb\xb0\xff\x55"
+ "\xd6\x0a\xe9\x71\x51\x27\xd2\xe3\xa2\x4e\xdc\x9e\x71\x73\xf3\x3b"
+ "\xf3\x82\x45\x6d\x91\x17\xac\xac\x2d\xfe\x32\xd8\xb1\xb6\xf8\x24"
+ "\x43\xd4\x16\xb9\x0d\xf4\xf9\xce\x3d\x45\x9f\xef\x5c\xbe\x3e\x29"
+ "\xb6\x04\xb4\x45\xf7\x74\xc3\xae\x2b\xf9\xbc\xb6\xf8\x6c\xbe\x51"
+ "\x03\x7a\xcf\xcb\x82\xda\x02\x74\xdd\xea\xc5\xa8\x2d\xaa\x84\xf9"
+ "\x9d\xb9\xfe\x25\x31\x52\x6d\xf1\x97\x35\xfc\x5c\x4f\xd4\x17\x75"
+ "\x46\xfe\x3a\x3c\x2f\x37\xf7\x73\xff\x7c\x61\xee\x27\xb4\x2d\x9d"
+ "\xf3\xc9\xcf\x03\xbd\x02\xda\x63\x06\xf8\x43\xa2\x3d\xee\xce\xfd"
+ "\xc4\xb1\xfe\x7f\xcf\xba\xa7\x6b\xff\x57\xcf\x6a\x8e\x3c\xb3\xbd"
+ "\xe6\xc8\x1d\xe1\xba\xe6\xc8\x8d\x70\x4f\x73\xe4\xea\x5c\xd3\x1c"
+ "\xb9\x87\xe5\x35\xc7\x5f\x86\x20\x3e\xe5\x35\x07\x3d\x67\x3f\x56"
+ "\x7c\x12\x21\x8e\x15\x9f\x0c\xbc\xf3\x35\xc7\x8e\x0a\xf9\x71\x61"
+ "\xc7\x59\xaa\x39\x72\x8b\x9a\x5f\x73\xe4\x16\xc9\x6b\x8e\x4f\x04"
+ "\xfe\xcf\x2d\xb6\xd7\x1c\xf0\x1d\x59\xcd\xf1\x89\xf0\xfe\x2f\xb7"
+ "\x88\xd5\x1c\xb4\x0d\xe0\xa0\xed\xca\x9a\xe3\xd3\x61\x94\x93\x3e"
+ "\xed\x40\x39\x89\xfa\xd4\x5e\x73\x7c\x72\xd1\xb9\xe6\xa0\x18\xe2"
+ "\xfb\xa9\xa8\x39\x3e\x7d\xc2\x5e\x73\xfc\x65\x90\xbc\xe6\xc8\x93"
+ "\xd4\x69\xef\xdc\xc1\x6a\x8e\x4f\x97\xb4\x0e\xcd\xa1\x88\xad\x0a"
+ "\x56\x73\xec\x1c\xa5\x5e\x73\xec\x8c\x55\xa7\x39\x10\x73\x72\x9a"
+ "\x63\xe7\x61\x5b\xcc\xb1\x9a\x63\xe7\x79\x79\xcd\xb1\xd3\xcc\x6a"
+ "\x0e\x6c\x5f\x4e\x73\xe4\xf5\x62\xda\xb7\xd3\x1c\x79\x23\x58\xcd"
+ "\x41\xaf\x13\x35\x47\x5e\xb5\x10\xb7\x9d\x55\xaf\x39\xf2\x0e\x2b"
+ "\x6b\x8e\xbc\xa3\xac\xe6\xc8\xcb\xa1\xda\x22\xcf\x44\x35\x47\x5e"
+ "\x81\xa0\x45\xf4\xd2\xe3\xa2\xe6\xa0\xc7\x45\xcd\xb1\xcb\x57\x45"
+ "\x6e\xaa\x4a\xcd\xdc\xcf\xbc\xeb\x6c\x6e\xca\x9a\x97\x32\xf5\x9e"
+ "\x7c\xac\x29\x37\x05\x63\xbd\xd2\x9e\xe8\x98\x9b\xc2\xb1\x5b\xcc"
+ "\x4d\x9d\xe2\xb9\x4a\xcc\x4d\xe9\xf9\xdc\x14\xe6\xa5\x20\x66\x6f"
+ "\xca\x4b\x59\xde\xb1\x9f\xf7\x99\x67\x51\x9f\x97\x9a\xf6\xb6\x96"
+ "\x6c\xe1\xc7\x6f\x63\x26\xcd\x4b\x55\x34\xe5\xa5\x70\xdc\x36\xd7"
+ "\xdb\xe7\xa5\x70\xbc\x16\xf3\x52\x27\xdd\xcc\x4b\x7d\xb6\xcd\xbd"
+ "\xf1\xfb\xb3\x3b\x60\xfe\x5b\x6b\x9c\xf7\xb9\x2b\x50\x7c\x77\xfc"
+ "\xb9\x9b\xf3\xdf\x3e\x77\x38\xff\xed\x6e\x5d\xb3\x92\xed\x3f\xab"
+ "\x16\x6d\xff\xd7\x8d\xee\xd9\xfe\xaf\x19\x2d\x6f\xfb\xd6\x58\x33"
+ "\xf1\xf9\x4c\xd1\xf6\xbb\xdd\x5c\xff\x6d\xb7\x9f\xfb\xb9\xf0\x7d"
+ "\xbe\x62\xbc\xba\xcf\x57\x1a\xaf\x16\x0d\x97\xc6\xab\xbb\x2f\x3a"
+ "\x8e\x57\xf7\x4e\x10\xe3\xd5\x2f\xf6\x50\x6d\xf8\xc5\x46\xaa\x0d"
+ "\xbf\xe0\xf7\x24\x8b\x1d\x46\xf8\x38\xd5\x84\x31\x6b\xa4\x51\xb3"
+ "\xeb\x52\xa1\xc6\x94\x44\x63\xd5\x32\x53\x31\x29\x31\x18\xc9\xfb"
+ "\x8b\x89\xd7\xaa\x2b\xc4\xeb\x93\x5a\xa3\xa6\xfd\x5c\xe2\x03\xe3"
+ "\x04\x68\xa9\x62\xd0\x16\x59\x24\x2a\x0e\xe3\xd8\xbf\x1d\x2d\x8b"
+ "\x32\x48\xe2\xd8\x3d\xe3\xc5\x18\x16\xae\x8b\x32\x92\xaf\x23\x0b"
+ "\x35\x18\xab\xde\x48\x4f\xd1\xdf\xe8\x33\xb9\x9c\x5f\xb3\x48\x9a"
+ "\x2f\x87\xdf\x0e\x9c\xc6\xe6\xcb\x1b\xd3\x53\xaa\x1a\xf2\x26\x1f"
+ "\xe3\xd7\x43\xec\x29\xe6\xcd\x5d\xcd\x97\x6f\x6e\x24\x7e\xd6\xf5"
+ "\x10\x71\x5c\x6c\x7d\xf9\xf2\xbf\xea\xc5\x7c\xf9\xdf\xb2\xdc\xcb"
+ "\x97\xff\x2d\x93\x8d\x5d\xf7\xed\xb5\x8f\x5d\xbf\xf0\x70\x3d\x76"
+ "\xfd\xc2\xcd\xf9\xff\x5f\xf4\x70\x2d\x76\xfd\x62\xa5\x6d\xec\x9a"
+ "\x1b\x87\xb1\xeb\xee\x1a\xc4\xaa\x7c\xec\x4a\xcf\xd9\xc7\x1c\x7b"
+ "\x7b\x8a\x31\x47\xc1\x6f\x77\x7e\xec\x5a\x90\x26\x1f\x5f\x14\x64"
+ "\xd1\xd8\xf5\x8b\x15\xcd\x1f\xbb\x7e\xb1\x42\x3e\x76\xdd\xdb\x81"
+ "\xea\xfc\x2f\x56\x58\xe3\x50\x31\x76\x85\xef\xc8\xc6\xae\x7b\x47"
+ "\xd8\x7e\x87\xc6\xae\x5f\x24\xd3\xd8\x75\xef\x74\xe5\xd8\x75\xaf"
+ "\xb0\x5e\xda\xde\x12\xca\x4f\xd4\xa7\xf6\xb1\xeb\xde\xed\xce\x63"
+ "\x57\x8a\x21\xbe\x9f\x8a\xb1\xeb\xde\xcb\xf6\xb1\xeb\xee\x6a\xf9"
+ "\xd8\xf5\xef\x87\x44\x1c\xfd\x7d\x16\x1b\xbb\x7e\x39\xb0\x75\xc4"
+ "\xae\x8a\xd8\x4a\x63\x63\xd7\xbf\x7b\xab\x8f\x5d\xff\x3e\x58\x5d"
+ "\xec\x8a\x98\x93\x8b\x5d\xff\xbe\x52\xc0\x4f\xb2\x7c\xec\xfa\xf7"
+ "\x6d\xf2\xb1\xeb\xdf\xf7\xb2\xb1\x2b\xb6\x2f\x17\xbb\xfe\xfd\x3c"
+ "\xd3\xbe\x5d\xec\xba\xcf\x83\x8d\x5d\xe9\x75\x62\xec\xba\x2f\x87"
+ "\x72\xe8\xee\xf5\xea\x63\xd7\x7d\x2b\x95\x63\xd7\x7d\x6b\xd8\xd8"
+ "\x75\x5f\x38\x8d\x51\xf7\x15\xd0\xd8\x75\x5f\x34\x3d\xbe\x3b\x55"
+ "\x7a\x5c\x8c\x5d\xe9\x71\x31\x76\xdd\x57\xa4\x22\x76\xad\x6e\xa6"
+ "\xd8\xb5\xa2\x75\xc5\xae\x8d\x61\xb7\x37\x76\xfd\x6a\xaa\x7b\xb1"
+ "\xeb\x57\x61\x2e\x6a\xf8\x2a\x27\x1a\xfe\xd8\x7f\x96\x86\xdf\x57"
+ "\x29\x6a\xf8\xaf\x4f\xb8\xa7\x59\xbe\xae\x68\x69\xdb\xb7\x3e\xbb"
+ "\x7f\x95\x23\xda\xfd\xc0\x78\xf7\xec\x7e\x20\xf8\x6e\xdc\xea\x8e"
+ "\xed\x0b\x25\xf9\x9a\x7f\xb8\x59\xff\xfc\x8f\x62\xf7\xe3\xd6\x23"
+ "\xd5\x62\xdc\x7a\xa4\x5a\x1a\xb7\x7e\xcb\xbc\x67\xfd\x66\x9b\xe3"
+ "\xb8\xb5\xa8\xbf\x18\xb7\x7e\xbb\x9e\xea\xc2\x6f\x85\x7a\xdb\x6f"
+ "\x79\xbd\xb5\x7c\x0f\x8d\x5b\xaf\x63\xdc\x7a\x01\xe2\xd6\xd9\xe1"
+ "\x1a\x93\xb0\x06\x3f\xd6\x65\x95\x40\xec\x89\xb1\x6a\x59\x0c\xfc"
+ "\x3f\xda\x40\xde\x5f\x40\xbc\x52\x20\xe6\xdc\x01\xe3\xd7\x8e\xc5"
+ "\x06\x4d\x72\x24\x70\x7f\x45\x1e\x69\xaf\x83\x78\xb6\x16\xe3\xd9"
+ "\x83\x10\xab\xae\x14\xe2\xd9\x43\x79\x65\xd1\xd2\x78\xf6\x60\x37"
+ "\x3e\x9e\x35\xd0\x9a\xaf\xb2\x68\x88\x67\xe1\xf7\x70\x4d\x7f\x69"
+ "\x3c\xdb\x00\xf1\x6a\x23\xc4\xab\xa9\x97\x6c\x62\xdb\xd9\xf6\xb1"
+ "\x6d\x83\x7f\x4a\xb5\xb1\xcf\xe4\x0a\x8c\x6d\xaf\x6f\xff\x4f\x8c"
+ "\x6d\x0f\x64\x88\xb1\xed\xa1\x25\xee\xc5\xb6\x88\x70\x69\x6c\xfb"
+ "\x7d\xba\x7d\x6c\x7b\xe8\x94\xeb\xb1\xed\xb7\x1e\xee\x3d\x33\xdf"
+ "\x12\xd7\x62\xdb\x6f\xa7\xdb\xc6\xb6\x7f\xe1\xdf\xcb\x7e\x93\x83"
+ "\x78\x96\x8f\x6d\xe9\x39\xfb\x98\xa4\xc8\x43\x8c\x49\xbe\x2b\xb9"
+ "\xf3\x63\xdb\xef\xa2\xe4\xe3\x8f\xef\x96\xd0\xd8\xf6\xdb\xf0\xe6"
+ "\x8f\x6d\xbf\x0d\x97\x8f\x6d\xbf\x13\xea\xff\xbf\x0d\xb7\x8f\x6d"
+ "\xe1\x3b\xb2\xb1\x6d\x51\x37\xdb\xef\xd0\xd8\xf6\xdb\x99\x34\xb6"
+ "\x2d\x7a\x56\x39\xb6\x2d\x3a\x41\x39\xac\x68\x07\xe5\x30\xea\x53"
+ "\xfb\xd8\xb6\x28\xd1\x79\x6c\x4b\x31\xc4\xf7\x53\x31\xb6\x2d\x3a"
+ "\x6c\x1f\xdb\x7e\x93\x2d\x1f\xdb\x1e\xd9\x26\xe2\xe8\xc8\x30\x36"
+ "\xb6\x3d\xdc\xa1\x75\xc4\xb6\x8a\xd8\x8a\x62\x63\xdb\xc3\x67\xd5"
+ "\xc7\xb6\x47\xfc\xd5\xc5\xb6\x88\x39\xb9\xd8\xf6\xc8\x74\x01\x3f"
+ "\x33\xe5\x63\xdb\x23\xb1\xf2\xb1\xed\x91\x74\x36\xb6\xc5\xf6\xe5"
+ "\x62\xdb\x23\x07\x98\xf6\xed\x62\xdb\x23\xa7\xd8\xd8\x96\x5e\x27"
+ "\xc6\xb6\xdf\x27\x50\x0e\xfd\x66\x94\xfa\xd8\xf6\xfb\xe9\xca\xb1"
+ "\xed\xf7\x11\x6c\x6c\xfb\xfd\x10\x1a\xc3\x7e\x9f\x46\x63\xdb\xef"
+ "\x83\xe9\xf1\x6f\x46\x4a\x8f\x8b\xb1\x2d\x3d\x2e\xc6\xb6\xdf\xe7"
+ "\xa8\x7b\x2f\x7b\x53\xeb\x1e\x1d\xbb\xfd\x73\x06\x9a\x6b\xdd\x23"
+ "\xeb\xbb\xd9\xdb\x35\x67\xa0\xe4\x59\xf7\xe2\xdb\x12\x87\xeb\xbf"
+ "\xdc\x8d\xb1\xe4\x74\xfe\xf7\x05\xa2\xce\x2f\xdd\xe3\x9e\x66\x29"
+ "\xdd\x7d\x37\xc6\x72\xc7\xf6\x25\x2b\x44\xdb\x97\x3f\xe1\x9e\xed"
+ "\xcb\xfb\xbb\x1f\x63\x55\x04\x89\x31\x56\x45\x90\xf2\xbb\xc1\xa3"
+ "\xde\x8e\x63\xac\xe3\x51\x62\x8c\xf5\xe3\x51\xaa\x4f\x7e\xdc\x43"
+ "\xf5\xc9\x8f\x8b\x9a\xef\xdd\xe0\x0f\x97\xd9\x77\x83\x47\xe7\xdd"
+ "\x7d\x37\xd8\x1c\xf1\x53\xa9\x49\x8c\x9f\x7e\xd8\xeb\x5e\xfc\xf4"
+ "\x43\x01\x1b\x3f\x55\x1c\xb7\x8f\x9f\x7e\xec\xea\x7a\xfc\xf4\xe3"
+ "\x30\xf7\x9e\x87\x1f\x87\xba\x16\x3f\xfd\xb8\x4d\xfe\xdd\xe0\x51"
+ "\x1f\xe5\x77\x83\xf4\x9c\xbd\xee\x3d\x3e\x4c\xd4\xbd\xc7\xdb\xde"
+ "\xf9\xf1\xd3\xb1\x7c\x79\x8d\x7b\x6c\x2f\x8d\x9f\x7e\xcc\x6e\xfe"
+ "\xf8\xe9\xc7\x6c\xf9\xf8\xe9\xb8\x30\xff\xf5\xc7\x6c\xfb\xf8\x09"
+ "\xbe\x23\x1b\x3f\x1d\x9f\x6e\xfb\x1d\x1a\x3f\xfd\x98\x43\xe3\xa7"
+ "\xe3\xb1\xca\xf1\xd3\x3f\x3b\x53\x7e\x3a\x7e\x91\xf2\x13\xf5\xa9"
+ "\x7d\xfc\x74\xfc\x80\xf3\xf8\x89\x62\x88\xef\xa7\x62\xfc\xf4\xcf"
+ "\x36\xf6\xf1\xd3\x51\x2f\xf9\xf8\xe9\xa7\xb3\x22\x8e\x7e\x4a\x64"
+ "\xe3\xa7\x7f\x8e\x6f\x1d\xf1\x93\x22\xb6\xf2\xd9\xf8\xe9\xa7\x6e"
+ "\xea\xe3\xa7\x9f\x42\xd4\xc5\x4f\x88\x39\xb9\xf8\xe9\xa7\x6d\x02"
+ "\x7e\x72\xe4\xe3\xa7\x9f\xf6\xcb\xc7\x4f\x3f\x1d\x67\xe3\x27\x6c"
+ "\x5f\x2e\x7e\xaa\xf0\x60\xda\xb7\x8b\x9f\x2a\xba\xb2\xf1\x13\xbd"
+ "\x4e\x8c\x9f\x2a\x0a\x29\x87\x96\xe7\xa9\x8f\x9f\x2a\xb6\x29\xc7"
+ "\x4f\x15\x3b\xd8\xf8\xa9\x62\x39\x8d\x93\x2a\x8e\xd1\xf8\xa9\x22"
+ "\x95\x1e\x2f\xdf\x29\x3d\x2e\xc6\x4f\xf4\xb8\x18\x3f\x55\x54\xa9"
+ "\x8b\x9f\x5c\x5f\x17\xa9\xe5\xeb\x5a\x03\x5b\x69\x5d\xeb\xc9\x25"
+ "\xee\xc5\x4e\x27\x63\xee\x6a\x78\x77\x34\x7c\x85\x51\xd4\xf0\xff"
+ "\x72\x73\xfe\xef\xbf\xea\xdc\xd7\xf0\x3f\xd7\x88\x1a\xfe\xe7\x1a"
+ "\x65\x0d\x5f\x79\xd8\xb1\x86\x3f\x3b\x40\xd4\xf0\x67\xd2\xe9\x18"
+ "\x79\x66\x09\x1d\x23\xcf\x0c\x6e\x3e\x0d\x7f\xfa\x73\x56\xc3\x9f"
+ "\x7a\xe2\xae\x86\x6f\x0e\x0d\x7f\x52\xb2\xdf\xf1\xe9\x58\xf7\x34"
+ "\xfc\xe9\xe5\xac\x86\xaf\xda\x68\xaf\xe1\x4f\x9f\x75\x5d\xc3\x9f"
+ "\xf1\x76\xef\x79\x38\xe3\xe5\x9a\x86\x3f\x33\x4b\x5e\xc3\x57\x16"
+ "\x2b\x6b\x78\x7a\xce\x5e\x7b\x9d\xf5\x16\xb5\x97\xfe\xe8\x9d\xaf"
+ "\xe1\xf5\xd1\xf2\x3a\x4b\x1f\x4b\x35\xfc\x99\x99\xcd\xaf\xe1\xcf"
+ "\xcc\x94\xd7\xf0\xfa\xdf\xa8\xde\x39\x33\xd3\x5e\xc3\xc3\x77\x64"
+ "\x35\xfc\xd9\x9e\xb6\xdf\xa1\x1a\xfe\x8c\x8e\x6a\xf8\xb3\xc3\x94"
+ "\x35\xfc\xd9\x53\x94\x9f\xce\xe6\x51\x7e\xa2\x3e\xb5\xd7\xf0\x67"
+ "\x57\x3a\xd7\xf0\x14\x43\x7c\x3f\x15\x35\xfc\xd9\x12\x7b\x0d\x5f"
+ "\x59\x24\xaf\xe1\x7f\xde\x2e\xe2\xe8\xe7\x11\xac\x86\x3f\xe7\xdf"
+ "\x3a\x34\xbc\x22\xb6\xa2\x59\x0d\x7f\xee\xbc\x7a\x0d\xff\x73\x67"
+ "\x75\x1a\x1e\x31\x27\xa7\xe1\x7f\x9e\x25\xe0\x47\x27\xaf\xe1\x7f"
+ "\x4e\x94\xd7\xf0\x3f\x6f\x64\x35\x3c\xb6\x2f\xa7\xe1\x7f\x3e\xc4"
+ "\xb4\x6f\xa7\xe1\x7f\x3e\xcb\x6a\x78\x7a\x9d\xa8\xe1\xab\x56\x50"
+ "\x0e\xad\x7c\x5b\xbd\x86\xaf\x9a\xa5\xac\xe1\xab\xe6\xb1\x1a\xbe"
+ "\x6a\x28\xd5\xea\x55\x19\x54\xc3\x57\x4d\xa0\xc7\x2b\xa3\xa4\xc7"
+ "\x45\x0d\x4f\x8f\x8b\x1a\xbe\x2a\xf7\xee\xba\x49\x77\xe2\xba\x49"
+ "\x17\x86\xb9\xa7\xe3\x2f\x0c\x75\x5f\x4b\x5e\xf1\x13\xb5\xe4\x15"
+ "\x3f\xa9\x96\x64\xd7\x36\xf8\xb7\xbf\x63\x2d\xf9\x4b\x98\xa8\x25"
+ "\x2f\xee\xa7\x5c\x7d\x71\x1b\xe5\xea\x8b\xfc\xfb\x3d\x75\xeb\x26"
+ "\x55\x9f\x60\xd7\x4d\xfa\xf7\xac\xbb\xeb\x26\xb9\xab\x13\xab\xf6"
+ "\x89\x3a\xb1\x7a\xbb\x7b\x3a\xb1\x3a\x87\xd5\x89\x57\x0e\xd8\xeb"
+ "\xc4\x8b\x6d\x5c\xd7\x89\x17\xfb\xb8\xa7\x13\x2f\xf6\x76\x4d\x27"
+ "\x5e\x5c\x23\xbf\x86\xc1\xbf\x03\x94\xd7\x4d\xa2\xe7\xec\xc7\xf7"
+ "\x5f\xfa\x88\xe3\xfb\xa5\x86\x3b\x5f\x27\x5e\xca\x94\x1f\xcb\x2f"
+ "\x6d\xa7\x3a\xf1\xe2\xea\xe6\xd7\x89\x17\x57\xcb\xeb\xc4\x5f\x3a"
+ "\xd3\x31\xf5\x62\xaa\xfd\x1a\x06\xf0\x1d\x59\x9d\xf8\xcb\x18\xe1"
+ "\x3b\xab\x59\x9d\x48\xdb\x00\xae\x89\x50\xd6\x89\x35\xde\x94\x7b"
+ "\x7e\x39\x4e\xb9\x87\xfa\xd4\x5e\x27\xfe\x92\xe7\x5c\x27\x52\x0c"
+ "\xf1\xfd\x54\xd4\x89\xbf\x5c\xb3\xd7\x89\xff\xf6\x93\xd7\x89\x97"
+ "\x25\xeb\xb4\x5e\x9e\xc7\xea\xc4\x9a\x67\x5b\x87\x4e\x54\xc4\x56"
+ "\x26\xab\x13\x2f\xb7\x55\xaf\x13\x2f\x0f\x53\xa7\x13\x11\x73\x72"
+ "\x3a\xf1\xf2\x1a\x5b\xcc\xb1\x3a\xf1\xf2\x0e\x79\x9d\x78\xf9\x00"
+ "\xab\x13\xb1\x7d\x39\x9d\x78\xf9\x32\xd3\xbe\x9d\x4e\xbc\xd2\x86"
+ "\xd5\x89\xf4\x3a\x51\x27\x5e\x11\x74\xd9\x85\xfd\xea\x75\xe2\x95"
+ "\x35\xca\x3a\xf1\x4a\x3a\xab\x13\xaf\xe8\xa8\x1e\xbc\x52\x48\x75"
+ "\xe2\x95\xe5\xf4\xf8\x85\x7d\xd2\xe3\xa2\x4e\xa4\xc7\x45\x9d\x78"
+ "\xa5\x5c\xdd\x3c\x90\x66\xc9\xf5\xde\xa6\x79\x20\xcd\x95\xeb\xbd"
+ "\xdd\xf3\x40\x0c\x6e\xae\x7f\x6f\x70\x75\xfd\xfb\xbb\x75\x32\x4d"
+ "\x79\xde\x2b\x55\x62\x9e\xf7\xb7\x53\xee\xe9\x95\xdf\x2a\xdd\xd7"
+ "\xe6\x0d\x92\xfd\x7b\x1b\x98\xfd\x7b\xd9\x7a\xf8\xda\xcf\x1d\x6b"
+ "\xf3\x7a\xc9\xfe\xbd\xd7\x84\xfd\x7b\xaf\x09\xfb\xf7\x5e\x7b\xd6"
+ "\x9d\x7a\xf8\x94\x5a\xe2\xf5\xbe\x6d\x3d\xfc\xb1\xfd\xb4\x1e\x7e"
+ "\x81\x6d\x3d\x7c\xdd\x1e\xb6\x1e\xfe\xea\x13\x4a\xf5\xf0\x98\xf7"
+ "\xbd\x91\x37\xf9\x18\xd6\xc2\xcb\xd6\xc1\x4f\x6e\xde\x3a\x78\xc4"
+ "\xe6\xe6\xa5\x54\xdb\x6f\x6a\x95\xda\xde\x20\x59\x3b\xbf\xce\xcd"
+ "\xfd\x7f\xeb\x12\x58\x6d\xdf\x28\xb3\xff\x6f\x9d\x8a\xfd\x7f\xaf"
+ "\xb9\xb9\xff\xef\x35\x17\xf7\xff\xbd\x66\xb7\xff\x2f\xad\x83\xaf"
+ "\xdd\xad\x5c\x07\x4f\xcf\xd9\x6b\xb2\x7a\xc9\xba\x52\xd7\x5b\xc1"
+ "\xfe\xbf\xd7\x15\xf6\x68\xbd\x2e\xec\xff\x7b\xed\x16\xec\xff\x7b"
+ "\x4d\x61\xff\xdf\xeb\xc2\xfe\xbf\xd7\x9a\xf6\xf2\x15\xb5\xfd\x35"
+ "\x85\xfd\x7f\xeb\x7b\xd9\x7e\x87\x6a\xfb\x6b\xc2\xfe\xbf\xf5\x0e"
+ "\xf6\xff\xad\x17\xf6\xff\xad\x17\xf6\xff\xa5\x3e\xb5\xd7\xf6\xf5"
+ "\x2e\xec\xff\x7b\x4d\xd8\xff\xf7\x9a\x83\xfd\x7f\xeb\x65\xf6\xff"
+ "\xad\xcd\x97\xd7\xf6\x0d\x92\xfd\x7f\x1b\x6c\xf6\xff\x35\xb6\x92"
+ "\xfd\x7f\x15\xb1\x65\xb3\xff\xaf\xd1\x8d\xfd\x7f\x1b\x54\xee\xff"
+ "\x7b\x4d\x61\xff\xdf\x06\x61\xff\xdf\x6b\x0a\xfb\xff\x36\x28\xec"
+ "\xff\xdb\x60\xb3\xff\xef\x35\x85\xfd\x7f\x1b\x0e\x33\xed\xdb\x69"
+ "\xfb\x06\x9b\xfd\x7f\xaf\xd9\xec\xff\xdb\x28\xec\xff\x5b\x3b\x49"
+ "\xbd\xb6\x6f\x74\xb0\xff\x6f\xa3\xcd\xfe\xbf\x8d\xc2\xfe\xbf\x8d"
+ "\xc2\xfe\xbf\x8d\xc2\xfe\xbf\xb5\xa1\xd2\xe3\xa2\xb6\xa7\xc7\x45"
+ "\x6d\xdf\xa8\x66\xff\xdf\x2a\x35\x39\xe0\x96\xaf\xe3\xd0\xb6\xd2"
+ "\x3a\x0e\x93\x9b\xf9\x5f\x93\xfb\xf9\x5f\x4f\xaf\xfe\x4d\x1a\x13"
+ "\xfe\xaf\x5c\x4b\x60\x76\x9c\xff\xf5\xf4\x88\x11\x35\x26\x27\xcc"
+ "\x57\xe2\xf6\x53\x9e\xe6\x62\x5d\xad\x25\x48\xb9\x2e\xe8\x4a\x6b"
+ "\x2d\xc1\x62\xa1\x96\x00\xb4\x25\xd5\x92\x96\x6b\x6c\x2d\x81\x39"
+ "\x56\xa9\x96\x40\xb6\x86\xc0\x46\x3f\x5a\xb5\xa6\xbb\x35\x04\xad"
+ "\x5f\x3f\x36\x4a\x6a\x08\x2c\x07\xdc\xd3\x8f\x96\x42\x46\x3f\x7a"
+ "\x7a\x9d\xb2\xd7\x8f\x5c\x4f\xd7\xf5\x23\x37\xca\x3d\xfd\xc8\x8d"
+ "\x74\x4d\x3f\x72\x3b\xe4\x6b\x08\xcc\x01\xca\x35\x04\xf4\x9c\xdd"
+ "\xb8\xef\xe9\x31\xaa\x69\xdc\xf7\xf4\xf0\xbf\xe3\xf5\xa3\x27\x29"
+ "\x90\x1d\xe3\x3d\xc9\x01\xaa\x1f\xb9\xdc\xe6\xd7\x8f\x5c\xae\xac"
+ "\x7e\xf4\xf4\x18\x48\xc7\x5a\x2e\xd7\x5e\x3f\xc2\x77\xe4\xf4\xa3"
+ "\xa7\x47\x84\xed\x77\xa8\x7e\xe4\x76\xf2\xfa\xd1\xd3\x63\xa5\xa2"
+ "\x7e\xf4\xd4\x74\xe3\x79\xc9\xd3\xe3\x37\xca\x4b\xd4\xa7\x76\xfa"
+ "\xd1\xd3\xe3\xb0\x73\xfd\x48\x31\xc4\xf7\x53\x49\x3f\x7a\x6a\x3a"
+ "\xd8\xeb\x47\xb3\x7c\x6e\xd8\xd3\xf3\xa2\x88\x23\xcf\x55\x8c\x7e"
+ "\xf4\xd4\x4c\x6a\x15\xfa\x51\x19\x5b\x05\x8c\x7e\xf4\xf4\xec\xa5"
+ "\x5a\x3f\x7a\x7a\x4e\x55\xa7\x1f\x11\x73\x32\xfa\xd1\xd3\x73\x87"
+ "\x80\x9f\x9d\xb2\xfa\xd1\xd3\xf3\x90\xac\x7e\xf4\xf4\x3c\xc5\xea"
+ "\x47\x6c\x5f\x46\x3f\x7a\x7a\xb5\x61\xda\xb7\xd5\x8f\x9e\x5e\x3d"
+ "\x59\xfd\x48\xaf\x6b\xd2\x8f\x9e\x5e\x45\x74\x5c\x33\xa9\xcf\x0d"
+ "\x7b\x7a\xed\x50\xd4\x8f\x9e\x5e\x9f\x33\xfa\xd1\xd3\x8b\xae\x9d"
+ "\xef\xe9\x55\xc9\xeb\x47\x4f\xaf\x0c\xaa\x1f\x4d\xfb\xa4\xc7\x45"
+ "\xfd\x68\x62\x73\xc3\x6b\xbd\x6a\x1c\xe9\x47\x2e\xad\x5f\x51\xaa"
+ "\xc6\x92\x0f\x7f\x05\xd0\xcf\xce\x30\x8e\x15\xc2\xff\x8b\x60\x3c"
+ "\xea\x00\xff\x2f\x57\xd2\x2b\x06\xff\x7e\x45\x16\xd0\x1e\x16\xf8"
+ "\x9d\x32\xc3\xaf\x85\x85\x0f\x9a\xa0\xaf\xde\xc2\x9e\x2d\xfd\x8a"
+ "\xda\x9b\xee\x1d\x69\xe1\x74\x84\xf3\x83\xff\xc7\xc0\x31\xb8\xbe"
+ "\x1d\x8c\x7b\x81\x8b\x49\xbb\x2b\x9e\xde\xab\xad\xd7\x41\x9f\xdb"
+ "\x9d\xf3\xf4\x1e\x85\x6d\xd4\xaf\xf5\xce\x80\xfb\x31\x2a\xf6\x15"
+ "\xda\x1a\xb7\xe3\x61\x12\x6b\xe2\xfe\x5d\x38\xbf\x96\x54\x79\x7a"
+ "\x9f\x6d\x5f\x73\xef\x48\xe0\x21\x82\x7a\x2f\xff\x41\x83\x17\xb6"
+ "\x59\x38\xbf\x11\xcf\x1d\xc4\x73\x66\xe8\x63\xdc\x3c\xa2\x59\x5b"
+ "\x7b\xaf\x0f\xe8\x2a\xef\xf8\x3a\xae\xfa\x2d\x13\xf4\x39\xc6\x44"
+ "\xbe\x7e\xb8\xc2\xeb\xb3\x4d\x15\xfc\xd8\x53\x5a\x67\xe6\xdb\x08"
+ "\x9c\xcf\xf7\xe7\xfc\x16\xb8\x5e\xae\x0f\x2b\x77\x91\xde\xde\xbd"
+ "\x38\xbd\xaa\xf1\xce\xf3\x9e\x41\x4a\x76\x6c\x9f\xf8\x30\x29\x7c"
+ "\x0c\x6c\x17\x48\x34\x72\xe7\x55\xfe\x4e\xb6\x03\x7d\xe9\xf3\x61"
+ "\x27\xae\x2e\x7e\x23\xd1\xac\xb3\xdc\xeb\xf3\x0d\x70\xe2\xd6\x0d"
+ "\x9c\xa1\x7e\xed\xbd\xbe\x7a\x0f\x93\x1f\xda\xfc\x5d\x38\xbf\xae"
+ "\x13\x67\xb8\x9a\x84\xb8\xb9\xb7\xc7\x01\x18\xdb\x6d\x7d\xb1\x60"
+ "\xe6\xbc\xe9\x81\xd1\x11\xf3\x66\xbd\xb5\x28\x3a\xb0\xe7\xcc\xfb"
+ "\xc8\x84\xb7\xde\x0a\x9c\x37\x7d\xfe\x92\x40\xe9\x99\x67\x02\x67"
+ "\x46\x2c\x9c\x3e\x63\xee\xac\x3e\xf3\xde\x88\xba\x0f\xfa\x44\x24"
+ "\xfd\xf0\xc3\xbe\x58\xd6\xde\xdb\x7f\xcb\x07\x84\x7c\xd8\x91\x78"
+ "\x61\xbf\xe0\xf7\xd2\xf4\x5e\x23\x73\xf0\xf7\xd6\x6e\xe0\xea\x34"
+ "\x70\x4d\x3c\x70\xda\xba\xb8\x7b\xe1\xda\x7b\xb2\xb7\x42\xbf\xb6"
+ "\x40\xbf\xa1\x8f\xd8\xe7\x42\x6b\x9f\xad\x98\x88\x47\x4c\xc4\xd5"
+ "\x02\x06\xef\x3d\xdb\xde\x78\xef\x4b\x1c\x17\x8a\xf7\x57\x07\xcf"
+ "\x8a\xc7\x05\x4f\x9f\x25\x7c\x0c\x90\xde\xaf\x08\xbe\x6b\xb2\x62"
+ "\xcc\x92\x16\x13\xce\x6d\xe8\x97\x0a\xda\xd1\xa3\x9e\xd3\xfd\x37"
+ "\x60\x13\xbe\xef\x33\xaa\x1f\x21\x09\x5c\x7d\x28\xbf\xff\x00\x57"
+ "\x0f\x18\xa6\x38\x85\x73\x6d\xba\x5c\xd5\x90\xe7\xea\xd7\xfa\x0c"
+ "\xd5\x93\x9d\x73\xb1\x0d\x3d\x1c\x43\x9b\x5b\xb2\xd3\xf5\x21\x41"
+ "\x24\xe1\x0f\x09\x24\xa1\x1e\xbf\x93\x33\xb1\xa0\x7d\x34\xf1\x18"
+ "\x17\xc3\x9d\x01\xde\xf1\xe0\xba\xa5\xeb\xb9\xed\x13\x0b\xf4\x9e"
+ "\x3e\x3d\x2c\xe9\x31\xe1\x70\x3f\x35\xd0\x4e\xb2\xde\xe3\x29\x5f"
+ "\x6c\x67\xdd\x06\xde\xf6\x35\x78\xef\x60\x1f\x88\x65\xb8\x42\x2e"
+ "\x49\x78\x86\x52\xff\xa4\xb7\xa4\x66\x05\x97\x79\x5d\x27\xe3\x4c"
+ "\xdc\x0d\x6e\xfd\x9f\xf4\xa5\x75\x75\xc0\x69\x51\x6f\x70\xed\xee"
+ "\x1d\xd6\xde\x14\x31\x6b\x6b\x47\x78\x16\xd7\x67\x05\x73\xeb\x67"
+ "\x55\x84\xf4\x22\x5a\x68\xbb\xca\x6a\x4f\xb0\xa5\x97\x3a\x1c\xf9"
+ "\xf0\x6b\xba\x20\x1e\xa0\x3f\x02\x1e\xda\x0c\x38\x10\x6d\x8f\x87"
+ "\xa6\x67\x73\xc3\x9c\x72\x13\x17\xfa\xd2\x8d\x34\xd0\xe0\x7e\x73"
+ "\xea\xe2\xce\x93\x7b\xd0\xb6\xa5\xa0\xf7\xd7\x2e\x26\x01\x6b\xa6"
+ "\x91\xc0\xd7\x97\x68\x89\x21\x7d\x8e\xa1\x7d\x62\x82\x07\xd8\x44"
+ "\x03\xfc\xd2\x1f\x38\xb3\xff\x8d\x4e\x31\xe1\xcb\x67\x11\x4d\xde"
+ "\xb9\x7c\x0d\xea\x64\xac\x0b\x01\x5b\x5f\xdb\x02\xdf\xe3\x7e\x0d"
+ "\x25\xe8\x0f\xde\x17\xbf\xea\xc8\x18\x88\xbc\xf1\x1d\xc7\x05\xcf"
+ "\xfb\x7a\x65\x41\x9b\xea\xee\xab\x0d\xaf\x7f\xcd\xe0\xab\x7e\xe0"
+ "\xa7\xb2\x2a\x33\xdf\x26\xef\xab\xb9\xa2\xaf\xf6\x43\x3f\x44\x7f"
+ "\xb5\xc9\x47\xbf\xca\xdf\xb3\x2e\x58\xb8\xe7\x64\xce\x4f\x17\xad"
+ "\x7c\xcf\xba\x28\x7a\xcf\xde\xb5\x8e\xef\xf9\xbe\x8b\x8e\xef\xf9"
+ "\xfe\xae\xea\xef\xf9\xbe\xdd\xea\xef\xf9\xbe\x1c\x07\xf7\x2c\xf8"
+ "\x39\x02\xfc\xac\x73\xe0\x67\x9d\xe0\xe7\xfb\xcf\x39\xbe\xe7\xfb"
+ "\x4f\x39\xbe\x67\xdf\x0e\xea\xef\xf9\xfe\x5c\xf5\xf7\x7c\x7f\x86"
+ "\xf2\x3d\x47\x08\x7e\x8e\x00\x3f\x47\x38\xf0\x73\x84\xe0\xe7\x0e"
+ "\x3f\x38\xbe\x67\xdf\xa3\x8e\xef\xb9\xad\xb7\xfa\x7b\xf6\xcd\x54"
+ "\x7f\xcf\xbe\xab\x1d\xdc\xb3\xe0\xe7\x48\xf0\x73\x84\x03\x3f\x47"
+ "\x08\x7e\x7e\x2a\xc5\xf1\x3d\xb7\x3d\xe4\xe4\x9e\x1b\xd4\xdf\x73"
+ "\xdb\x54\xf5\xf7\xdc\x36\x41\xf9\x9e\x23\x05\x3f\x47\x82\x9f\x23"
+ "\x1d\xf8\x39\x52\xf0\xf3\x94\xe7\x1d\xdf\x73\xbb\xbd\x8e\xef\xb9"
+ "\xdd\x65\xf5\xf7\xdc\x6e\x85\xfa\x7b\x6e\x17\xad\x74\xcf\x8d\xc0"
+ "\xdb\xbe\x70\x2f\x37\x7e\x0a\x7d\xc9\xec\x37\xc7\xe4\x5b\x45\x34"
+ "\x99\x49\x16\x5d\xfb\x6a\xd2\x06\xee\x4d\xc7\x6d\x58\xd6\x1f\xff"
+ "\xb5\xf8\xcd\x31\x36\xfa\xe9\x7c\x1a\x3a\xf5\x4b\x5d\x36\x95\xdc"
+ "\x83\x7a\x7c\x95\x85\x04\x58\xd2\xe6\xd4\xad\x7e\x85\x04\xc6\x1b"
+ "\x88\xb6\x34\x4e\x4f\xe2\xa2\x38\x43\x29\x39\x4b\xda\x56\x63\xec"
+ "\x79\x92\x14\xd7\x14\x91\xf9\x0b\x38\xee\x82\xa7\x76\x30\xbe\x03"
+ "\x06\x9d\x9c\x90\xfa\x4f\x12\x08\xbf\xd1\x7f\x0b\xfc\x61\x3b\xed"
+ "\x47\xc3\xf8\xb9\x61\xd9\x93\x5b\xe3\x48\xc0\x57\x91\xd5\x04\x8f"
+ "\x67\xc1\x9f\x79\x43\x4c\x78\xdc\x54\xa2\xd9\x55\x5b\xa1\xa1\x63"
+ "\xb3\xd6\xdb\x76\x6c\x1e\x3d\x1d\x6c\x39\x83\x3f\x37\x3e\xf3\x15"
+ "\xb5\xb6\x6c\x5f\x6e\x1d\xbb\x79\x5b\x56\x9a\xe9\x78\x6f\x33\x76"
+ "\x7f\x05\xbf\x2f\xda\xb2\x7d\x21\xda\x92\x4b\xd3\x69\xcb\xaa\x1b"
+ "\x31\x6e\xd2\x5e\x88\x21\x1a\x38\x1e\x55\x1a\x55\x4b\xe4\x6d\xac"
+ "\x0b\x16\x6d\xac\x5b\xee\x5b\xe5\x5d\x2b\x6f\x63\x5d\x0c\xd8\x38"
+ "\xd9\xde\xc6\xba\x68\xd7\x6c\xdc\x21\xeb\xe6\x6d\xdc\x21\x42\xd9"
+ "\xc6\x1d\xf6\xa8\xb7\x71\x87\x01\xea\x6d\xdc\xa1\x87\x60\xe3\x54"
+ "\xd6\xc6\xda\x63\x0e\x6c\x2c\xc1\xb1\x0e\x70\x7c\xff\x39\x05\x1b"
+ "\x03\x8e\x23\x64\x70\xac\x73\x11\xc7\xbf\xf3\xb8\x79\x1b\x77\x2c"
+ "\x51\xb6\xf1\xef\x3a\xab\xb7\x71\xc7\x0c\xf5\x36\xee\x98\x4c\x6d"
+ "\x1c\x61\x83\xe3\x8e\x83\x94\x6d\x1c\x21\xc1\x71\x04\xe0\xb8\xc3"
+ "\x0f\xf2\x36\x8e\x00\x1c\x47\xc8\xe0\x38\xc2\x45\x1c\xfb\xcd\xba"
+ "\x79\x1b\xfb\x3d\xa1\x6c\x63\xbf\x58\xf5\x36\xfe\x9d\x49\xbd\x8d"
+ "\x7f\x57\x23\xd8\xd8\x06\xc7\xbf\xcb\x74\x60\x63\x09\x8e\x23\x00"
+ "\xc7\x4f\xa5\x28\xd8\x18\x70\x1c\x29\x83\xe3\x08\x17\x71\xec\x7f"
+ "\xf8\xe6\x6d\xec\x9f\xae\x6c\x63\xff\xb3\xea\x6d\xec\x1f\xae\xde"
+ "\xc6\xfe\xc1\xd4\xc6\x91\x36\x38\xf6\x27\xca\x36\x8e\x94\xe0\x38"
+ "\x12\x70\x3c\xe5\x79\x79\x1b\x47\x02\x8e\x23\x65\x70\x1c\xe9\x22"
+ "\x8e\x1f\xe8\x73\xf3\x36\xee\xd4\xa0\x6c\xe3\x07\x46\xa8\xb7\x71"
+ "\xa7\x83\xea\x6d\xdc\x69\xb7\x60\x63\x1b\x1c\x77\x9a\xa9\x64\xe3"
+ "\x1b\x10\x03\xb6\x05\x1b\xb7\xad\x21\x9a\x2c\xb4\x6d\x05\xb5\xad"
+ "\xb9\xd3\xb2\xfe\x59\x1a\x8b\x0e\x6d\xc2\xe7\x80\x7e\x09\x68\x67"
+ "\x4e\x9b\x63\xe2\x34\x70\x4f\x71\x98\xfb\x7d\x20\xcf\x94\x44\xda"
+ "\x05\xc6\x61\xfe\xb7\x33\x5f\x1f\x10\x18\xf7\xde\x29\xf8\x3d\x4f"
+ "\xcc\x7b\x99\xd2\xfb\x46\x99\xfd\xe7\x0e\xbd\xe0\x19\x70\x9e\xeb"
+ "\x39\xa9\x1c\x62\x2f\x2d\xf7\x66\x80\x5f\x59\x4d\x3e\xd8\xe7\x08"
+ "\x29\xad\xf8\x92\x58\x3a\x2d\x7b\xb2\x9f\x89\x04\x71\xbf\x04\xf9"
+ "\x15\x47\xeb\x89\xf9\x8d\x00\xdf\xb2\x98\x22\x52\x16\xf3\x57\x32"
+ "\xae\x9a\xbb\xce\xfd\x1c\xe4\x7b\xc3\x3f\x31\xc6\xec\xbf\x4c\x6b"
+ "\x4e\x4f\x31\x9a\xfc\x13\x75\x79\x8b\xf5\x1a\x5f\x23\x09\x9a\x5b"
+ "\xc5\x71\x6b\x67\x10\xaf\xb5\xe7\x88\xcf\xba\x19\xc4\x77\xdd\x39"
+ "\xa2\x2d\xae\xaa\x20\x25\x97\x8a\x48\x49\xed\x09\x52\x72\x1d\xfe"
+ "\x1a\xe1\xcf\x02\x7f\x09\x27\xc0\xd7\x84\x8c\xb9\x4c\x70\xef\x46"
+ "\xc3\xe3\x95\xc4\xaf\xd8\x54\x41\x70\xfe\xeb\x15\xcf\x80\x44\xdf"
+ "\x70\xe2\xc7\xfd\x1c\x40\xb8\x37\x02\x34\x70\xce\x0b\x8f\x97\x99"
+ "\x0c\xa4\xb8\xca\x88\xe7\xc3\xe1\xbc\x57\x7c\x15\xb4\x6f\x29\xc2"
+ "\xbd\x19\x0d\xc5\x09\x87\x89\x69\xfd\xe9\x70\x0e\x63\xe8\x4e\x73"
+ "\xca\x53\xc1\xd4\x16\x2e\xa0\x3b\xc5\x41\xe7\x8d\x5b\x2c\x6a\x7d"
+ "\x1d\x90\xcf\xdb\xf8\xcd\x80\x8e\x60\xe7\x07\x2d\x6f\x86\x6a\xc7"
+ "\x9e\x38\xc3\x95\xd6\x55\x10\xcc\x25\x94\xd6\x1d\x21\x65\x2b\x2c"
+ "\x64\xdc\x12\x42\x46\x9b\x09\x41\x5b\x94\xc5\x54\x93\xb1\x51\xa4"
+ "\x3d\xe6\x9f\x2d\xbf\x04\x75\x2c\xab\x32\x90\x58\x13\xf4\xf1\x8a"
+ "\xb1\xa9\x8f\xa5\x2b\x4a\x09\x9c\x7b\xb0\x54\xa7\x27\xbe\x51\x44"
+ "\x8b\xf6\x35\xa5\xcd\x31\x8e\x85\xe7\x67\x7e\x1d\xc7\xa1\x6d\xd1"
+ "\xa6\x68\x5f\x6c\xcf\x6a\xf3\xb2\x99\x06\x12\x6f\x24\xda\xb2\x38"
+ "\xf8\x37\x86\x33\x94\x91\xdf\x08\xf4\x31\x8d\xeb\x70\x3a\x1c\x70"
+ "\x31\x00\xb1\xa0\xf7\x7c\x20\x07\xfc\xdf\x51\x1e\x53\xba\x68\x8a"
+ "\x29\xef\x5a\xe7\x98\xd2\x2d\x17\x31\xf5\xa0\x87\x88\xa9\x87\x4e"
+ "\x29\x63\xea\xa1\xc1\x02\xa6\x52\xef\x4c\x4c\x3d\x78\xdc\x31\xa6"
+ "\x1e\xdc\xed\x00\x53\xc9\x5c\x27\x5d\x30\x8b\xa9\x87\x2e\xab\xc7"
+ "\xd4\x43\x5e\xb7\x0f\x53\xba\x18\xf7\x30\xf5\x60\x35\x8b\xa9\xce"
+ "\x46\x07\x98\x12\x78\xea\xfe\x73\x2e\x60\x4a\xc2\x53\x5d\x42\x44"
+ "\x4c\x3d\xfc\x84\x32\xa6\xba\xae\xa1\x98\x8a\xb8\x43\x79\xaa\x6b"
+ "\x2f\xc7\x98\xea\xea\xa3\x8c\xa9\x08\xe0\x29\x9d\x0d\x4f\x3d\x3c"
+ "\x4c\x3d\xa6\xba\x86\xde\x46\x4c\xb9\xc9\x53\x5d\x87\xb0\x98\xea"
+ "\x32\x5a\x19\x53\x11\x02\x4f\x75\xf8\xc1\x39\xa6\x22\x24\x3c\xf5"
+ "\xf0\x0e\x11\x53\x81\x2b\x95\x31\xf5\xc8\x59\x01\x53\x77\x28\x4f"
+ "\x3d\x12\xeb\x18\x53\x8f\x84\x39\xc0\x14\xf0\x54\x84\x0d\x4f\x05"
+ "\xa6\xab\xc7\xd4\x23\x3b\x6f\x1f\xa6\x22\xdc\xe4\xa9\x47\x52\x59"
+ "\x4c\x3d\x9c\xed\x00\x53\x02\x4f\x3d\x95\xe2\x02\xa6\x24\x3c\x15"
+ "\x68\x16\x31\xd5\xfd\x84\x32\xa6\xba\x0f\xa4\x98\x8a\xbc\x43\x79"
+ "\xaa\xdb\x51\xc7\x98\xea\x96\xaf\x8c\xa9\x48\xe0\xa9\x08\x1b\x9e"
+ "\xea\x7e\x51\x3d\xa6\xba\x93\xdb\x88\x29\x37\x79\xaa\x5b\x15\x8b"
+ "\xa9\xc0\x3a\x65\x4c\x45\x0a\x3c\x35\xe5\x79\xe7\x98\x8a\x94\xf0"
+ "\xd4\xa3\xe3\x45\x4c\xf5\xec\xa3\x8c\xa9\x1e\xab\x04\x4c\xdd\xa1"
+ "\x3c\xd5\xa3\xa7\x63\x4c\xf5\xf0\x72\x80\x29\xe0\xa9\x48\x1b\x9e"
+ "\xea\xf9\xac\x7a\x4c\xf5\x98\x70\xfb\x30\x15\xe9\x26\x4f\xf5\x18"
+ "\xc4\x62\xea\xd1\x91\x4a\x98\x6a\xc4\xb8\xcf\x03\x30\xa5\x83\xb8"
+ "\x0f\x30\xd4\xbe\x9c\x62\xea\x06\x60\x6a\xb3\x14\x53\xff\xb2\x8d"
+ "\xfb\x7a\x6e\xb7\x34\x61\xea\x0f\x9f\xdb\x62\xca\x02\x98\xba\xc1"
+ "\x63\xea\xf7\x87\xad\x71\x5f\x59\x4d\x36\xf8\xea\x12\x29\x0b\x06"
+ "\x3c\x6d\x10\xf0\xf4\x2f\xc0\x13\xdc\x8f\x05\xee\xb7\xb8\xb2\x82"
+ "\x8c\x33\xd0\xfb\x6a\x84\xfb\xb5\x48\xb1\xd4\x58\xad\x41\x0c\x21"
+ "\x76\xac\x38\x2a\x99\x0f\xf8\x59\x70\x94\x94\x2c\x86\xbf\xa5\xf0"
+ "\x17\x07\x7f\xe4\x28\x29\xae\x26\x7c\xce\x5e\xc4\x4f\xb9\x80\x9f"
+ "\xdf\xcf\x72\x8c\x9f\xdf\x0f\x57\x17\xe3\xfd\xe1\x80\x7a\xfc\xfc"
+ "\x3e\x4d\xa8\xa5\xd3\x8e\x1b\x7f\x86\xc3\x1a\x58\x8a\x91\x4b\x64"
+ "\x9c\x89\xb4\xe7\xa6\x04\x75\xf4\x0d\x25\xda\x65\x66\xa2\x59\x33"
+ "\x83\x68\xd7\x9c\x84\xfb\xb5\x3e\x3b\xe7\x88\xef\x11\xe3\x97\xa4"
+ "\xb8\xb6\x82\x14\x5f\x3f\x4c\x8a\x2d\xf0\x77\x09\xfe\xa0\x8f\xe3"
+ "\x66\x49\xef\xd7\x20\xdc\xef\x1f\x42\xa0\xad\x1e\xca\xf7\xfb\x87"
+ "\x01\xfc\xfd\xce\x84\xfb\x6d\x14\xef\xb7\x0c\xb0\x08\x7e\x79\xd0"
+ "\x22\xc4\x89\xe3\x0c\xa4\xcd\x5b\x26\x8e\x6b\x14\x30\x88\x7e\x39"
+ "\x72\xcc\x48\xc6\x45\x81\xaf\xde\x00\x0c\x56\xe5\x92\xf8\xe5\x80"
+ "\xc1\x46\x23\xbe\xd7\x37\x94\x25\x34\x00\x06\x7f\x1f\xc3\x81\xdd"
+ "\x6e\x20\x06\xff\x85\x18\xec\x99\x69\x51\xc4\x20\xc4\x89\x3c\x06"
+ "\x21\x4e\x74\x8a\x41\x69\x9c\x18\xd4\x4b\xc4\xe0\x63\x03\x95\x31"
+ "\xd8\x6b\x8c\x35\x4e\x6c\x79\x0c\x06\x5d\x74\x8c\xc1\xa0\x22\x75"
+ "\x31\xe1\x63\x23\xd4\x63\xb0\x57\xc0\xed\xc3\x60\xaf\x13\x8e\x31"
+ "\xd8\xab\xc0\x39\x06\x75\x31\xee\x61\x30\xc8\xc4\x62\x30\x28\xd0"
+ "\x01\x06\x05\x1e\x84\xb8\xd2\x39\x06\x25\x3c\xf8\x58\x9e\x88\xc1"
+ "\xde\x7b\x95\x31\xf8\xf8\x51\x6b\x5c\xd9\xf2\x18\x7c\x7c\x9e\x63"
+ "\x0c\x3e\x3e\x5a\x5d\x0c\xd9\xfb\xb0\x7a\x0c\x3e\x9e\x79\xfb\x30"
+ "\xd8\x7b\xaa\x63\x0c\xf6\x1e\xe2\x02\x06\xdd\xe4\xc1\xc7\x13\x58"
+ "\x0c\x3e\x96\xa3\x8c\xc1\x08\x81\x07\x21\x0e\x75\x8a\x41\x69\x1c"
+ "\xda\xe7\x09\x11\x83\xfd\x9e\x55\xc6\x60\xdf\x10\x6b\x1c\xda\xf2"
+ "\x18\xec\xf3\x9b\x63\x0c\xf6\x29\x57\x17\x73\xf6\x1b\xa3\x1e\x83"
+ "\x7d\x03\x6f\x1f\x06\xfb\x9e\x75\x8c\xc1\xbe\x85\xce\x31\x18\xe1"
+ "\x26\x0f\xf6\xf5\x62\x31\xd8\x27\xc8\x01\x06\x05\x1e\x84\xb8\xd5"
+ "\x39\x06\x25\x3c\xd8\x6f\x8f\x88\xc1\x27\x0e\x28\x63\xb0\xff\x09"
+ "\x6b\xdc\xda\xf2\x18\xec\xbf\xc8\x31\x06\xfb\x4f\x50\x17\xa3\x3e"
+ "\x71\x54\x3d\x06\xfb\xe7\xdc\x3e\x0c\x3e\x31\xcb\x31\x06\x9f\x18"
+ "\xee\x02\x06\xdd\xe4\xc1\xfe\xc9\x2c\x06\xfb\xed\x54\xc6\x60\xa4"
+ "\xc0\x83\x10\xe7\x3a\xc5\xa0\x34\xce\x7d\x72\xb0\x88\xc1\x01\x23"
+ "\x94\x31\xf8\x5f\x53\xad\x71\x6e\xcb\x63\xf0\xc9\x06\xc7\x18\x7c"
+ "\xb2\x42\x5d\x4c\x3b\x20\x44\x3d\x06\xff\x2b\xe8\xf6\x61\xf0\xbf"
+ "\x2e\x3a\xc6\xe0\x7f\x15\x39\xc7\x60\xa4\x9b\x3c\xf8\x5f\xbe\x2c"
+ "\x06\x9f\xec\xaf\x84\x41\x0b\xc4\xc5\x37\x72\x26\x95\x5b\xd2\x12"
+ "\x63\xda\x7b\x04\x12\x93\xdf\xdc\xa1\x65\xd1\x75\x64\xec\x35\xb0"
+ "\x4f\xd4\x35\x32\xed\x9a\x96\x98\xd3\x12\x75\x1c\xc4\x47\x92\xf8"
+ "\x99\xaf\x2d\x33\xa5\x9e\x0e\x5f\x37\x9f\x78\x41\xfc\xfd\x24\x1e"
+ "\x2b\xbb\x60\x24\xf8\xfb\xb1\xd8\x9f\x4b\x62\x7f\x30\x4f\xc0\xfd"
+ "\x1a\xa4\xe5\xdf\x31\x37\xea\x49\xd5\x10\xe2\x59\x5c\xa5\x07\x3b"
+ "\x2c\xe5\xfd\x8b\x76\xb9\xe0\x39\x30\x68\xeb\x15\xe2\x65\xfa\x39"
+ "\xe0\x41\xb0\xb7\x5f\xdb\x77\x88\x47\x97\x2a\xce\x82\x76\x45\x7b"
+ "\xa1\x8d\x03\x97\xe2\xbb\xeb\x81\x4b\x4a\x01\x63\xa6\x9f\x83\x1e"
+ "\xdc\x02\xd7\xc9\xc7\xab\x03\x13\xd5\x63\x63\x20\x9d\x0f\xeb\x39"
+ "\x30\xb0\xb8\x92\xc8\xbe\x3b\xb6\x40\xfc\xe6\x9a\xad\x74\x31\x92"
+ "\x38\xef\x16\xd8\xea\xa9\x09\xae\xd9\xea\xa9\xed\x36\xb6\x92\x89"
+ "\xab\x9e\xca\x53\x6f\xab\xa7\xe8\x3a\x91\x9e\x4f\x8d\x76\x60\x2b"
+ "\x17\x71\xa5\x33\x4a\xe2\x91\x5b\x60\xab\xa7\x13\x5c\xb3\xd5\xd3"
+ "\x47\x59\x5b\xc9\xe9\xff\xa7\x4f\xa8\xb7\xd5\xd3\x99\xd4\x56\x4f"
+ "\xc7\x28\xdb\x2a\xc2\x45\x5c\x45\xc4\x48\x74\xf3\x2d\xb0\xd5\xa0"
+ "\x9d\xae\xd9\x6a\x90\xd9\xc6\x56\x32\x3a\x75\xb0\xb7\x7a\x5b\x0d"
+ "\x2a\xa2\xb6\x1a\x94\xe3\xc0\x56\x2e\xe2\x2a\xc2\x28\xd1\x77\xb7"
+ "\xc0\x56\x83\x2b\x5c\xb3\xd5\x33\xbd\x58\x5b\xc9\xe9\xa9\x67\x9e"
+ "\x50\x6f\xab\xc1\x75\xd4\x56\x83\xcb\x95\x6d\x15\xe9\x22\xae\x22"
+ "\x63\x24\x3a\xe4\x16\xd8\xea\x8f\x5e\xae\xd9\xea\x8f\x21\x36\xb6"
+ "\x92\x19\xf7\xff\x38\x55\xbd\xad\xfe\x18\x48\x6d\xf5\x8c\x49\xc9"
+ "\x56\xe6\xb4\x39\x75\xed\xc1\x06\x0d\x1b\xe6\x94\xb7\x8f\x21\x9a"
+ "\xc6\x1e\x60\x37\x3f\xb0\x5b\x62\x20\xb9\x91\x06\x76\x33\x98\xc8"
+ "\xd8\xb7\xcf\x70\xa5\x35\x66\xd2\x08\x36\x6b\xf0\x9b\x63\x2c\x33"
+ "\x54\x63\xcd\xd1\x1f\xcf\x79\x3e\xfb\xec\x94\xb7\xb5\x04\xed\x86"
+ "\x76\x40\xdb\x71\x60\x37\xde\x8e\x7e\x29\x46\xb3\xdf\x32\xed\x98"
+ "\xcb\x67\xb8\xb7\xf4\x1c\x87\xf7\xcb\xf9\xf5\x8d\xc2\xf7\x02\xe3"
+ "\xaa\x49\x9b\xc0\x57\xf0\x9e\x86\x5c\xc6\xe3\x65\x86\x0a\xd0\x07"
+ "\xb5\x84\xd7\x66\x67\x82\xfc\xcc\x13\x83\x7c\xcd\x65\xa1\x2f\x71"
+ "\x9d\xfa\xa5\x9a\x3a\xc5\x84\xc7\x5f\x26\xf7\xa0\x7e\x58\x6b\x21"
+ "\x01\xb1\xf3\x88\x66\x57\x64\xa1\x86\x9f\xbb\xb6\x80\x6f\x63\x2f"
+ "\xd8\x25\x80\xbb\x2a\xa9\xe9\xbe\xaa\x23\x65\x17\x52\x79\xbf\xd9"
+ "\x6a\x04\xde\x6f\x3f\x05\x69\x41\x67\xf6\xe7\xfc\x74\x3e\xa9\xa5"
+ "\x24\x90\xbb\x01\x36\xe6\xe7\x13\x3d\xbb\x7d\x6b\xa3\x5a\x1b\x0f"
+ "\xe1\xeb\xbf\x2d\x81\x42\xfd\x16\xd8\x09\x7f\x9f\xaf\xdf\x8a\x92"
+ "\xd4\x6f\x41\x9f\xc5\xfa\xad\x21\x23\xb1\x7e\xcb\x72\x26\xe0\x41"
+ "\xeb\xbd\xbf\x35\x97\xe3\xe0\xde\x3b\x96\xd6\x19\x08\xde\x7f\x69"
+ "\x5d\x21\x89\x8f\x26\xda\xd2\xc6\x6a\x12\x57\xc7\x19\x4a\x13\x2e"
+ "\x92\x71\xd7\x50\x07\x23\x5e\x9e\x1d\x48\xfd\x3a\xc4\xc7\x72\x26"
+ "\xe8\x41\xbd\xe7\xb3\xbd\x4b\xcb\x09\x91\xcc\xe3\xd1\x81\x66\xf6"
+ "\x01\x3f\xe8\xca\x12\xce\x11\xf0\x49\x6a\x99\xe9\x24\xfa\x49\x07"
+ "\xe7\x87\x34\xe9\xeb\x4e\xcb\x3e\xc0\x63\xe8\x33\x7c\xdf\x84\xeb"
+ "\x03\x6c\x95\xe8\x6f\xc4\x45\xfb\x98\x04\x52\x16\xd3\x48\x4a\x4d"
+ "\x04\xf4\xd5\x1f\x77\x7f\x1f\x5a\xa1\x80\x23\x5d\x34\xc5\x91\x2e"
+ "\xb8\x7d\x8c\x77\xad\x73\x1c\xe9\x62\x44\x1c\x3d\xb7\xf2\xe6\x70"
+ "\xf4\xdc\xc0\x9b\xc7\xd1\x73\x1e\x37\x81\xa3\x64\x16\x47\xcf\x5d"
+ "\x56\x8f\xa3\xff\x2e\x56\x8f\xa3\xff\x4e\xbd\x39\x1c\x3d\x17\x4b"
+ "\x71\xf4\xdf\xc1\x14\x47\xcf\x45\x8b\x38\xe2\xe7\x46\xdd\x22\x1c"
+ "\x3d\x6b\x72\x80\x23\x81\x8f\x74\xc0\x47\xf7\x9f\x73\x01\x47\x12"
+ "\x3e\x1a\x56\x72\x73\x38\x1a\x16\x7b\xf3\x38\x1a\x36\xca\x7d\x1c"
+ "\x45\xd8\xf0\xd1\xf3\x03\xd5\xe3\x68\x98\x9f\x7a\x1c\x0d\xad\xb8"
+ "\x39\x1c\x0d\x3b\x44\x71\x34\x34\x83\xe2\x68\xd8\x3e\x11\x47\xfc"
+ "\x7c\xb3\x5b\x84\xa3\xa1\xc3\x95\x71\x14\x21\xf0\x51\x04\xf0\x51"
+ "\x87\x1f\x9c\xe3\x28\x42\xc2\x47\xc3\xfd\x6f\x0e\x47\x2f\x1c\xba"
+ "\x79\x1c\xbd\xb0\xfe\x26\x70\x64\xc3\x47\xc3\x63\xd5\xe3\xe8\x85"
+ "\x30\xf5\x38\x7a\x21\xf0\xe6\x70\x34\xbc\x2d\xc5\xd1\xf3\x7a\x8a"
+ "\xa3\xe1\x5e\x22\x8e\xf8\x39\x7c\xb7\x08\x47\xcf\xaf\x76\x80\x23"
+ "\x81\x8f\x22\x80\x8f\x9e\x4a\x71\x01\x47\x12\x3e\x7a\x71\xea\xcd"
+ "\xe1\xe8\xc5\xb6\x37\x8f\xa3\x11\x27\xdc\xc7\x51\xa4\x0d\x1f\xbd"
+ "\x78\x48\x3d\x8e\x46\xe4\xa8\xc7\xd1\x08\xdd\xcd\xe1\xe8\xc5\x10"
+ "\x8a\xa3\x11\x41\x14\x47\x2f\x8e\x16\x71\xc4\xcf\x8b\xbc\x45\x38"
+ "\x1a\x7e\x4c\x19\x47\x91\x02\x1f\x45\x02\x1f\x4d\x79\xde\x39\x8e"
+ "\x22\x25\x7c\x34\x72\xfb\xcd\xe1\x68\x64\xc8\xcd\xe3\x68\x64\xb7"
+ "\x9b\xc0\x91\x0d\x1f\x8d\x6a\xab\x1e\x47\x2f\xd5\xa8\xc7\xd1\x4b"
+ "\xf9\x37\x87\xa3\x91\x59\x14\x47\x2f\x45\x51\x1c\x8d\x4c\x13\x71"
+ "\xc4\xcf\x35\xbd\x45\x38\x7a\xa9\x8b\x12\x8e\x70\x2d\x82\x0f\xe9"
+ "\xba\x10\x75\xeb\x96\x92\x41\x5b\xf1\xdf\x46\xd2\xbf\x7e\xed\xa8"
+ "\xe1\x07\x96\xd3\xf5\x00\xf4\x9e\xa3\xf8\x7c\xaf\xdc\xf7\xef\xdf"
+ "\x01\x7e\xf1\x9b\x63\x18\x77\x8a\xae\xd1\x80\xeb\x82\x5c\x8d\xd7"
+ "\x91\x7e\xfc\xba\x0c\x2f\x2f\xc7\x75\xac\x9a\xd6\x0e\xf0\x53\x58"
+ "\x3b\x60\xb2\xf2\xda\x01\x8d\x1b\xac\xf3\x6e\x73\x25\xf3\x6e\x5f"
+ "\x1e\xe5\x78\xde\xed\xcb\x4f\x64\x4d\x56\x8b\x87\x51\xfc\xfc\xaf"
+ "\xab\x9d\xe6\x94\xd7\xaf\x7d\x79\x28\x7c\x0e\xa0\xf7\xfe\x32\xbf"
+ "\xde\x8a\xf3\xf9\xb8\xb9\x12\x9c\x8c\xaa\x09\x09\x23\x09\xdc\xda"
+ "\x36\x43\x39\xff\x39\x06\x2e\x5d\xa7\x6e\xfd\x2c\xcf\x97\x93\x1d"
+ "\xdb\x5b\x17\x25\x6f\xef\x3f\xd5\x50\x7b\x0b\xeb\x16\xf8\x29\xac"
+ "\x5b\x30\x59\x79\xdd\x02\x79\x7b\xff\xc9\xc9\x3c\xe7\x3f\x6d\x53"
+ "\x6f\xef\x3f\xcd\xa5\xf6\xd6\x05\xd7\xaf\xfd\x53\xbe\x68\xef\xd1"
+ "\xbd\xd5\xdb\xfb\x4f\x61\xd4\xde\xf7\x0d\xe0\xfc\x75\x51\x60\xef"
+ "\x04\x95\x7d\x31\x3a\xb1\xb7\x02\xbe\xc7\x84\x09\xf6\x16\xf0\xad"
+ "\xb0\x66\xc2\x64\xe5\x35\x13\xe4\xed\x3d\xa6\x97\x63\x7b\x8f\xe9"
+ "\xa0\xde\xde\xa3\x2b\x05\x7b\x03\xbe\xc7\x04\x8a\xf6\x1e\xe3\xe2"
+ "\xba\x02\x52\x7b\x8f\x2e\xa6\xf6\xbe\x3f\x08\xec\x0d\xf8\x8e\x50"
+ "\x89\xef\x31\x3a\xc7\xf6\x8e\x50\xc0\xf7\xd8\x62\x6a\x6f\x61\xbd"
+ "\x06\x3f\x85\xf5\x1a\x26\x2b\xaf\xd7\x20\x6f\xef\xb1\x1b\x1d\xdb"
+ "\x7b\x6c\xa2\x7a\x7b\x8f\x1d\x4d\xed\x1d\x01\xf8\x1e\x9b\x2a\xda"
+ "\x7b\x9c\xaf\x7a\x7b\x8f\x1d\x42\xed\xed\xdb\x85\xf3\x8f\x00\x7c"
+ "\x47\xa8\xc4\xf7\xd8\x0a\x27\xf6\x56\xc0\x77\xf0\x10\xc1\xde\x02"
+ "\xbe\x15\xd6\x8a\x98\xac\xbc\x56\x84\xbc\xbd\x83\xdb\x38\xb6\xf7"
+ "\xb8\xdf\xd4\xdb\x7b\xdc\x3e\xc1\xde\x80\xef\x60\x22\xda\x3b\x78"
+ "\xb9\x7a\x7b\x8f\xdb\x49\xed\xdd\x56\x0b\xf6\x06\x7c\x47\xaa\xc4"
+ "\x77\xf0\x48\xc7\xf6\x8e\x54\xc0\xf7\xf8\x9d\xd4\xde\xc2\x3a\x15"
+ "\x7e\x0a\xeb\x54\x4c\x56\x5e\xa7\x42\xde\xde\xe3\x97\x38\xb6\xf7"
+ "\xf8\xe9\xea\xed\x3d\xbe\x37\xb5\x77\x24\xe0\x7b\x7c\x94\x68\xef"
+ "\xf1\x35\xea\xed\x3d\xbe\x0b\xb5\x77\x3b\x2f\xce\x3f\x12\xf0\x1d"
+ "\xa9\x12\xdf\xe3\x0b\x94\xec\xdd\x1e\xec\x7d\x08\x10\x00\xba\xc3"
+ "\x68\x49\x03\x9d\x62\x66\xed\x5e\x16\x33\x88\xf4\xbd\x8e\xb6\x7f"
+ "\x35\x03\xc6\x6a\xe3\xed\x5b\x2f\xe3\xd5\xc4\x9b\x9f\x3b\xfc\xea"
+ "\x18\xe5\xb9\xc3\xaf\x0e\x54\x3f\x77\xf8\x55\x22\x6a\xa0\x57\x87"
+ "\x8b\x3e\x7d\x95\xe7\x0f\x75\x73\x8a\x5f\x31\xc8\xaf\xa3\xf1\x4a"
+ "\x36\xce\x29\x06\x5f\x1b\x2d\xe9\xee\x68\xa3\x57\x73\x9c\xfb\x5a"
+ "\x17\x63\x49\x03\x8d\xa4\xe8\xeb\x90\x15\x30\x6e\xc5\xdc\xbe\x75"
+ "\x3b\x42\xe6\xdd\xbc\xaf\x43\x06\x2b\xfb\x3a\xa4\x9b\x7a\x5f\x4f"
+ "\xa8\x11\xf5\x57\x48\x7f\xd1\xd7\x21\x6e\xcc\x1f\x9f\x50\x29\xbf"
+ "\x9e\xc7\x84\xd5\xd4\xd7\xda\x30\x4b\xba\x3b\xba\x2c\x24\xd5\x05"
+ "\x5f\xc3\x73\xad\x73\xf0\x5c\x4f\x8c\x02\x5f\x1b\x6f\xdf\xfa\x21"
+ "\x13\x27\xdd\xbc\xaf\x27\xf6\x54\xf6\xf5\xc4\xb6\xea\x7d\xfd\x5a"
+ "\x85\xa8\xfd\x26\x76\x11\x7d\x3d\x31\x5f\xbd\xaf\x5f\x2b\x92\x5f"
+ "\x57\xe4\xb5\x18\xea\xeb\x0e\x85\xe0\x6b\x37\x34\xe1\xc4\xe5\xce"
+ "\x7d\x1d\x01\xcf\x75\x84\x83\xe7\x7a\x52\x18\x8c\xd7\x31\xb7\x6f"
+ "\x1d\x93\x49\x23\x6e\xde\xd7\x93\x3a\x28\xfb\x3a\xb4\x41\xbd\xaf"
+ "\x43\x0f\x8a\xba\x73\x92\x8f\xe8\xeb\x49\x99\xea\x7d\x1d\xba\x5b"
+ "\x7e\x7d\x93\xd0\x99\xd4\xd7\xbf\xeb\x61\x49\x77\x47\x8f\x4e\x52"
+ "\xd4\xff\x12\x5f\xc3\x73\x1d\xe1\xe0\xb9\x9e\x32\x12\x7c\x6d\xbc"
+ "\x7d\xeb\xa9\x4c\x79\xe2\xe6\x7d\x3d\xd9\xac\xec\xeb\xc9\xe7\xd5"
+ "\xfb\x7a\x72\xbe\xa8\x79\x27\xd7\x89\xbe\x9e\x92\xac\xde\xd7\x93"
+ "\xb3\xe5\xd7\x59\x99\x1c\x4c\x7d\xed\x97\x0c\xbe\x76\x43\x0b\x4f"
+ "\x99\xe0\xdc\xd7\x91\xf0\x5c\x47\x3a\x78\xae\xa7\x42\x5c\x1f\x19"
+ "\x73\xfb\xd6\x75\x99\xda\xf5\xe6\x7d\x1d\x76\x51\xd9\xd7\x61\x47"
+ "\xd5\xfb\x3a\x2c\x53\xd4\xdb\x61\x7a\xd1\xd7\x53\xa3\xd5\xfb\x3a"
+ "\x6c\xb5\xfc\x7a\x2f\x61\x43\xa8\xaf\xfd\x6b\x2c\xe9\xee\xe8\xf0"
+ "\xa9\x43\xdd\xd1\xe1\x0b\xb3\x88\x0f\xeb\xef\xd7\xff\x5f\x7b\xdf"
+ "\x03\x10\x55\x95\xfd\x7f\xe7\x8f\x89\x86\x32\x1a\xb8\xd4\x5a\x4d"
+ "\x2d\xee\x52\x5f\x52\x34\x4a\x2c\x4d\x54\x4c\x2c\x4d\xda\xaf\x5b"
+ "\xd4\xba\x89\x8a\x38\x83\xa8\xa8\xa8\xa3\x22\x20\x69\x4b\x86\x80"
+ "\x04\x2c\x26\xff\x2c\x6c\x69\xc3\xa2\xcd\x5a\xdc\xb5\x1a\x15\x37"
+ "\x54\x04\x6a\xad\xaf\x95\xd6\xe4\xa2\x91\xa1\x4d\x8a\x32\xc0\xcc"
+ "\xdc\xdf\x39\xef\xbe\xc7\x9b\xbf\x30\x7f\x94\x75\xfd\x35\xfa\x98"
+ "\x79\xf7\x9d\xfb\xf7\x73\xce\xb9\xe7\x9e\xf7\xde\xb9\x41\x7d\x6b"
+ "\x8b\xcf\x1d\xe4\x3d\xde\xcf\x7d\xe1\x1c\xef\xe7\xf6\xbb\x8f\xf7"
+ "\x73\x59\xa2\x2d\xfe\x5c\x93\x88\xf7\xdc\x38\xf7\xf1\x7e\x2e\xc5"
+ "\xb1\x2d\xfe\x5c\x88\x77\xb6\xf8\xdc\x50\x4f\x6c\x71\x7b\xbc\xe7"
+ "\xf9\xf7\xad\x3d\x1e\x6b\xf2\x1e\xef\xd8\xc3\xce\xf1\x8e\x7d\xc7"
+ "\x7d\xbc\x63\x53\x44\x7b\x3c\x56\x2b\xe2\x3d\x6f\xb6\xfb\x78\xc7"
+ "\x26\x3a\xb6\xc7\x63\x87\x7b\x67\x8f\xcf\x53\x7a\x62\x8f\xdb\xe3"
+ "\xbd\x40\xde\xb7\x36\xf9\xfc\xf3\xde\xe3\x3d\x7f\xaf\x73\xbc\xe7"
+ "\xef\x74\x1f\xef\xf9\x89\xa2\x4d\x3e\xdf\xc2\xff\xbd\x20\xd2\x7d"
+ "\xbc\xe7\xcf\x71\x6c\x93\xcf\xf7\xf5\xce\x26\x5f\xa0\xf0\xc4\x26"
+ "\xb7\xc7\x3b\xae\xad\x6f\xed\xf2\xb8\x53\xde\xe3\x1d\xf7\x86\x73"
+ "\xbc\xe3\xb6\xb9\x8f\x77\xdc\x1c\xd1\x2e\x8f\x2b\x17\xf1\x5e\xe8"
+ "\x41\xfc\xcc\xb8\x19\x8e\xed\xf2\x05\x46\xef\xec\xf2\x85\xc4\x13"
+ "\xbb\xdc\x1e\xef\xf8\xe6\xbe\xb5\xcd\xe3\x8f\x79\x8f\x77\xfc\x76"
+ "\xe7\x78\xc7\x6f\x74\x1f\xef\xf8\x19\xa2\x6d\x1e\x6f\xe1\xff\x5f"
+ "\x14\xe4\x3e\xde\xf1\xe3\x1d\xdb\xe6\x0b\x5b\xbd\xb3\xcd\xe3\xf5"
+ "\x9e\xd8\xe6\xf6\x78\xab\x8e\xf7\xad\x7d\xae\xfa\xc0\x7b\xbc\x55"
+ "\x2f\x3a\xc7\x5b\xb5\xdc\x7d\xbc\x55\xe3\x45\xfb\x5c\x95\x2e\xe2"
+ "\xad\xf6\x77\x1f\x6f\x55\x88\x63\xfb\x7c\xd1\x49\xef\xec\x73\x95"
+ "\xce\x7b\x3f\xf9\xe2\x6a\xb4\xcd\xdd\x8d\xff\xd8\x98\x2c\xbc\x73"
+ "\xa7\xb6\x88\xff\xb8\x78\x27\x71\x1a\x5b\x26\xc1\x74\x7d\xc7\x7f"
+ "\x4c\xe8\x25\xfe\x63\x82\x9b\xf1\x1f\x13\xce\xb8\xff\x3c\x7e\x42"
+ "\xb5\xb8\x46\x48\xb0\x58\xff\x2f\x66\x7b\x14\x5f\xd7\x71\x21\x13"
+ "\x6c\xe2\x42\xaa\xb9\xb8\x90\x34\xfb\x17\xd1\x9e\xad\x45\x16\xef"
+ "\xf3\xfe\xbe\xc0\xd2\x2c\x5c\x87\xb8\x1b\x87\x52\xe4\xed\xc4\x17"
+ "\x45\xde\x5e\xba\xc1\x39\x6f\x2f\xf9\xe2\xfa\x8e\x43\xb9\xe4\x0f"
+ "\x3d\xf3\xf6\x92\xf1\xee\xc5\x1c\x59\xe2\x41\xdc\x9b\x25\x59\xe2"
+ "\x7a\x68\x89\xc5\xfa\x77\x69\x7d\xdf\xf1\xb6\xa7\xf1\x29\x97\x24"
+ "\x59\xf3\x76\x62\x3a\xe3\xed\x5b\x2b\x3c\x5b\x77\x2d\x2d\xf2\xfe"
+ "\x3e\xc8\x72\x15\xae\xb9\xdc\x8d\x87\x29\xf2\xf6\xb2\x85\x22\x6f"
+ "\x2f\x7f\xc6\x39\x6f\x27\xbd\x77\x7d\xc7\xc3\x4c\x1a\xd7\x33\x6f"
+ "\x27\x05\xba\x17\xcb\x24\xa9\xc4\x7d\xde\x4e\x52\x89\x6b\xbf\xa4"
+ "\x2a\x91\xb7\x97\x57\xf6\x21\x6f\x7b\xa8\xb7\x93\x66\x58\xf3\xf6"
+ "\xb2\x39\x8c\xb7\x7f\x69\xf0\x6c\x8d\xb9\x3c\xd9\xfb\xfb\x3e\xc9"
+ "\x91\xb8\xbe\x74\x37\x2e\xa7\xc8\xdb\x2b\x26\x89\xbc\x9d\x6c\x17"
+ "\x17\x4a\xe4\xed\x95\xdb\xae\xef\xb8\x9c\x2b\x03\x7a\xe6\xed\x15"
+ "\x6d\xee\xc5\x48\x59\xb9\xd6\x7d\xde\x5e\x19\x29\xae\x73\x57\x66"
+ "\x8a\xbc\x9d\xbc\xa9\xef\x78\xdb\xd3\x78\x9d\x2b\x83\xad\x79\x7b"
+ "\x45\x38\xe3\xed\x3b\x66\x78\xb6\x9e\x4e\x8e\xf6\xfe\x3e\xd7\x1a"
+ "\x25\xae\xa5\xdd\x8d\x0f\x2a\xf2\xf6\xaa\xdb\x45\xde\x5e\x33\xc4"
+ "\x39\x6f\xaf\x5e\x72\x7d\xc7\x07\x5d\xd5\x4b\xfc\x9f\x55\x3d\xc4"
+ "\xff\x71\xf4\xae\xf0\x6a\x0f\xe2\x5e\xac\x56\x8a\x6b\xfa\xd5\x71"
+ "\x22\x6f\xaf\x89\xed\x43\xde\xf6\x50\x6f\xaf\x96\x5b\xf3\xf6\x2a"
+ "\x7f\xc6\xdb\xca\x72\xcf\x7c\x07\x6b\x42\xbc\xbf\xaf\xb7\xd6\x88"
+ "\x7e\x03\x77\xe3\x94\x8a\xbc\xbd\xa6\x43\xe4\xed\xb5\xe7\x9d\xf3"
+ "\xf6\xda\xe9\xd7\x77\x9c\x52\xcd\xb1\x9e\x79\x5b\x53\xe5\x5e\x4c"
+ "\x97\xb5\x1e\xbc\x07\xaf\x31\x8a\xfe\x8b\xb5\x16\xcf\xbf\xaf\x1b"
+ "\xdf\x77\xbc\xed\x69\xfc\x52\x8d\xce\x9a\xb7\xd7\xe8\x19\x6f\xdf"
+ "\xdd\xe6\x99\x9f\x64\x9d\x8f\xf7\x7e\x92\x0d\x3e\xdc\x3d\x4c\x37"
+ "\xe3\xa5\x8a\xbc\xbd\xee\x33\x31\x36\x51\x4a\x87\x2d\x6f\x8b\xb1"
+ "\x89\x52\x86\x5c\x3f\xf1\x52\xd7\x17\xf4\xcc\xc7\xeb\x93\xdd\xf3"
+ "\x89\xac\xef\x70\x9f\x8f\xd7\xd7\x8a\x3e\x91\x14\x8b\xe7\x5f\x36"
+ "\x08\x7b\x92\xf7\x41\xcc\xa2\x94\x92\x9e\x63\x16\xa5\xa4\x5c\xbb"
+ "\x38\xaa\xeb\x2b\xad\x63\x16\xad\xab\x37\x73\xb2\x30\x22\xca\x33"
+ "\xbf\xca\x06\x7f\xef\xfd\x2a\xe9\xec\xfe\xae\x9b\x71\x5b\x45\x59"
+ "\xd8\xf0\xad\x28\x0b\xe9\xfd\x9c\xcb\x42\xda\xed\xd7\x4f\xdc\xd6"
+ "\xd4\x9d\x3d\xcb\x42\x6a\xba\x7b\x3e\x94\x34\x0f\xe2\xc0\xa4\x36"
+ "\x89\x3e\x94\x34\x7f\x51\x16\xd2\x67\xf7\x9d\x2c\xa4\xbd\xd1\xb3"
+ "\x2c\xa4\x65\x5e\xbb\x78\xae\xa9\x7b\xac\x65\x61\xc3\x09\x26\x0b"
+ "\xbf\xa9\xf7\xcc\x0f\x93\xee\xd1\xfd\x6f\x6b\x59\x78\x5e\xc9\xdd"
+ "\xfb\x76\x33\x7e\xac\x28\x0b\xe9\xe7\x45\x59\x78\xde\xce\x9e\x17"
+ "\x65\x21\xe3\x9e\xeb\x27\x7e\xec\xc6\xdd\x3d\xcb\xc2\xc6\x2c\xf7"
+ "\x7c\x2e\x19\x43\xdc\x97\x85\x8d\x16\xef\x3f\x65\x58\xbc\xff\xf4"
+ "\x7c\x6c\xdf\xc9\x42\xc6\x7b\x3d\xcb\x42\x46\xfe\xb5\x8b\x2b\xbb"
+ "\x51\x6b\x2d\x0b\xe9\xcd\x4c\x16\xee\x8d\xf6\xcc\x6f\xf3\xbc\x0b"
+ "\xf6\x7f\x6f\x7e\x9b\x17\x42\xb8\xe7\x02\xdc\x8c\x63\x2b\xca\xc2"
+ "\xf3\x1d\xa2\x2c\xbc\x70\xbb\x73\x59\xd8\xfc\xc0\xf5\x13\xc7\x76"
+ "\xd3\xde\x9e\x65\x61\x53\x91\x7b\x3e\x9a\xcd\xb7\xbb\x2f\x0b\x9b"
+ "\x5a\x44\x1f\xcd\xe6\x10\x51\x16\x5e\x48\xec\x3b\x59\xd8\xbc\xbf"
+ "\x67\x59\xd8\x5c\x7e\xed\xe2\xdb\x6e\xaa\xb7\x96\x85\xe7\xf5\x4c"
+ "\x16\x42\x8e\x7b\xe6\xe7\x79\x21\xdc\x7b\x3f\xcf\x8b\xe1\xdc\x33"
+ "\x13\x6e\xc6\xd3\x15\x65\xe1\x8f\xfd\x44\x59\x78\xf1\x1e\xe7\xb2"
+ "\x90\x39\xe9\xfa\x89\xa7\xfb\xc7\x43\x3d\xcb\xc2\x1f\x2b\xdc\xf3"
+ "\xe9\x64\xde\xe3\xbe\x2c\xfc\xb1\x4d\xf4\xe9\x64\x86\x8b\xb2\xf0"
+ "\xa2\xa6\xef\x64\x21\xf3\x58\xcf\xb2\x90\x59\x75\xed\xe2\xec\xfe"
+ "\xf1\x84\xb5\x2c\xbc\x60\x64\xb2\x30\x2a\xc6\x33\xbf\xd0\x8b\x91"
+ "\xde\xfb\x85\xb2\x22\xb9\xe7\x49\xdc\x8c\xeb\x2b\xca\xc2\x96\x21"
+ "\xa2\x2c\x64\xf5\xb0\xcf\xc3\x4b\x33\xaf\x9f\xb8\xbe\x5b\x7a\xd9"
+ "\xff\x68\x4b\x4f\xfb\x1f\x39\xf0\x01\xbd\xf4\x80\xfb\xb2\xf0\x12"
+ "\x11\x7d\x40\x2f\x59\xbc\xff\x97\xb5\xa9\xef\x64\xe1\xa5\x5e\xf6"
+ "\x7f\x78\xc9\x85\xfd\x1f\x3c\x8d\xf7\xbb\xa5\xd9\x5a\x16\xb6\xf8"
+ "\x30\x59\x18\x7d\xd2\x33\x3f\x52\x56\xaf\xfe\x7f\x5c\xe7\x77\xf9"
+ "\xdb\xfb\x91\xea\x9b\xc3\xc9\xff\x3c\x8b\xb2\xb0\xd5\x60\x2c\x58"
+ "\x64\xc0\xf8\xc2\xa6\x20\x3e\x06\xe5\x46\x3e\xc6\x4b\x9b\x91\xc5"
+ "\xa0\xd4\x9b\xba\x63\x50\xb2\xd8\x1f\x44\x8a\xef\x02\xe3\x3b\xc1"
+ "\x46\x05\x8b\x3f\x49\xf1\x99\x28\x7c\x46\xea\x74\x1d\x17\x5f\x25"
+ "\xc5\x08\x7d\x3f\xdb\x4b\xfc\xc9\x58\x1d\xa9\x8f\x5d\x47\x8c\x43"
+ "\xbe\x8e\x65\xef\x09\x6f\xcd\xe4\xe2\x4f\xce\x0d\xbc\x2d\xfb\x6b"
+ "\xe2\xef\x87\xf1\x27\x63\xa9\x39\x4d\x47\xf5\x0d\x06\x02\xb4\x30"
+ "\xbe\xf3\x84\x18\x94\x5b\x7f\xc2\xbe\x1b\xe7\x06\xdf\x56\xfa\xb5"
+ "\xb3\xf8\xc2\x5b\x3d\x88\x03\xbb\xb5\x42\xf4\xef\x6c\x6d\x11\x79"
+ "\x34\x9b\x9b\x83\xe1\x7a\x7a\x7d\x0c\xe8\x98\xec\xb0\xd8\x2e\x8f"
+ "\x62\x6f\x64\xcb\x7b\xc7\x8c\x7b\x46\xc4\x4e\x7f\x89\x98\xe5\x54"
+ "\x19\x0b\x54\x1a\x8c\x73\xec\x3a\x66\xfd\x2e\x5e\x1b\xcc\x72\xc6"
+ "\xbb\x8e\x59\xce\x2e\x1b\xcc\x1c\xf8\x21\x72\xb6\xba\x8f\x59\x4e"
+ "\x8c\xe8\x87\xc8\x29\x16\x31\xcb\x69\x65\x98\xe5\x84\x31\xcc\x1e"
+ "\xc8\xea\xf2\x28\x7e\x47\x4e\xaf\xef\x7f\xe3\xba\xa9\xcb\xdf\x7e"
+ "\x5d\x2e\x62\xb6\x2d\x16\x30\x33\x60\xbc\x65\xd7\x31\xbb\xf9\xf4"
+ "\xb5\xc1\x2c\x57\xef\x3a\x66\xdb\x9e\xb1\xc6\xcc\xd1\x7a\x79\x9b"
+ "\x07\x7b\x76\x6e\xf3\x15\xd7\xcb\xdb\xa2\x45\xcc\xb6\x95\x33\xcc"
+ "\x72\x5b\x18\x66\x0f\xd6\x74\x79\x14\x03\x64\x5b\x62\xef\x98\x71"
+ "\xf7\xf4\x7b\x90\xb3\x97\xfd\x8d\x05\xb0\xc6\x84\xf5\xa3\xeb\x98"
+ "\x0d\xf9\xf4\xda\x60\x96\x57\xe1\x3a\x66\x2f\x0f\xb2\xc1\xcc\xc1"
+ "\xba\x2e\xef\xb2\xfb\x98\xe5\x69\xc5\x75\xdd\xcb\x72\x11\xb3\x97"
+ "\x67\x33\xcc\xf2\x8a\x19\x66\x63\x9b\xbb\x3c\x8a\x23\xf2\x72\xaf"
+ "\xfe\x2f\xb4\x43\xbb\xfc\xed\xd7\x39\x22\x66\xf9\x75\x80\x99\x01"
+ "\xe3\x4f\xbb\x8e\xd9\x83\x5b\xae\x0d\x66\xf9\x31\xae\x63\x96\xbf"
+ "\xdf\x1a\x33\x47\xeb\x8f\xfc\x37\xdc\xc7\x2c\x3f\x59\x5c\x7f\xe4"
+ "\xd7\x88\x98\x15\xf8\x30\xcc\xf2\xa3\x19\x66\xe3\x14\x5d\x1e\xc5"
+ "\x22\xc9\x3f\xde\x3b\x66\xdc\x3d\xd8\x1e\xe4\xac\x30\xc5\x58\x00"
+ "\x36\x3b\xd8\xe3\xae\x63\xf6\xfb\xc9\xd7\x06\xb3\x42\x5f\xd7\x31"
+ "\x2b\x5c\x65\x83\x99\x03\x3b\xb9\xd0\x83\x38\xd8\x85\xc1\xa2\x9d"
+ "\x5c\x98\x28\x62\x56\xb8\x8f\x61\x56\x28\x67\x98\x3d\x34\xbe\xcb"
+ "\xa3\x78\x26\x85\x4e\xe3\x7f\xf5\x64\x37\x0a\xcf\xe5\x8b\xb8\x15"
+ "\x85\x5d\x3f\xb6\xe3\x9f\x6a\x5d\xc7\xad\xe8\xbe\xde\x6d\xc7\xa2"
+ "\x00\xf7\x71\xfb\x93\x4e\xb4\x1d\x8b\x82\x44\xdc\x8a\x92\x19\x6e"
+ "\x7f\xda\xe7\x9d\xed\x58\x14\xe1\x89\xed\x68\x8f\xdb\xf6\xd6\xeb"
+ "\xc7\x7e\xdc\x9e\xe2\x3a\x6e\xdb\xcf\xf4\x6e\x3f\x6e\x3f\xe6\x3e"
+ "\x6e\xdb\x8b\x44\xfb\x71\xfb\x49\x11\xb7\x57\x42\x18\x6e\xdb\x93"
+ "\xbd\xb3\x1f\xb7\x3b\x8d\xff\xd6\x93\xfd\x68\x8f\xdb\x8e\x8a\xeb"
+ "\xc7\x86\xdc\x11\xe6\x3a\x6e\x3b\x4a\x7a\xb7\x21\x77\x6c\x76\x1f"
+ "\xb7\x1d\xd1\xa2\x0d\xb9\x23\x5f\xc4\x6d\x47\x33\xc3\x6d\x47\x88"
+ "\x77\x36\xe4\x8e\x6a\x4f\x6c\x48\x7b\xdc\x4a\xe6\x5c\x3f\x76\x64"
+ "\x71\xab\xeb\xb8\x95\xfc\xae\x77\x3b\xb2\xc4\x83\x3d\x8b\x4b\x7c"
+ "\x44\x3b\xb2\x64\x86\x88\x5b\x09\xbf\x07\x4b\x71\xb3\x77\x76\x64"
+ "\x49\xaf\xf1\x3f\x1c\xd9\x91\xf6\xb8\x95\xf9\x5f\x3f\xb6\x64\xa9"
+ "\x1b\xf6\x7f\xd9\xa0\xde\x6d\xc9\x52\x0f\xec\xff\x52\xc1\xfe\x07"
+ "\x79\x2b\xb3\xb0\xff\xcb\x78\xfb\xbf\xb4\xd8\x3b\x5b\xb2\xcc\x05"
+ "\xfb\xdf\xde\x96\xb4\xc7\xad\xbc\xfe\xfa\xb1\x27\xcb\xe7\xb8\x8e"
+ "\x5b\xf9\xa1\xde\xed\xc9\x72\x0f\xf6\x81\x2a\xd7\x88\xf6\x64\xf9"
+ "\x3e\x11\xb7\x9d\xbe\x0c\xb7\xf2\xd9\xde\xd9\x93\xe5\x4e\xe3\x3f"
+ "\x0a\xb8\x99\xfc\x17\x19\xa8\x03\x3f\xe4\x31\x55\x38\x1f\x9b\xf0"
+ "\xb5\x62\x53\xc0\x22\x83\xbb\xfb\xbb\x08\x31\xa7\x0f\x83\xc4\x9f"
+ "\x96\xbd\xf6\x80\x77\x71\xa7\x5f\x3d\xe3\x7d\xdc\xe9\x57\xdf\xb9"
+ "\x7a\xfb\xbb\xbc\xba\xdd\xfd\xb8\xd3\xaf\xc6\x89\x36\xe8\xab\x95"
+ "\x22\xd6\xaf\x71\xcf\x27\xb8\x17\x8f\xfa\xd5\x60\xef\xe2\x51\xbf"
+ "\x76\x1f\xe3\xaf\x9d\x2d\x2c\x1e\xf5\x6b\x41\x7d\xb3\xef\xcb\xce"
+ "\x7c\x8c\x47\x4d\xb3\x1f\x56\x79\x16\x1f\xf9\xb5\xca\xde\xf9\x59"
+ "\xa5\xa1\x0e\x7c\xb4\x22\x3f\xbf\x9e\x68\x0a\x50\x69\xdc\xdd\x67"
+ "\xc6\x9a\x9f\x5f\xef\xe7\x1d\x3f\xef\x7a\xcf\x7b\x7e\xde\xb5\xf1"
+ "\xea\xed\x33\xb3\x4b\xed\x3e\x3f\xef\x0a\x13\x6d\xf3\x5d\x1a\x91"
+ "\x9f\x5f\xaf\x72\x9f\x9f\x2b\x0c\xde\xf1\xf3\x2e\x13\xe3\xe7\x8a"
+ "\x1a\xc6\xcf\xbb\xda\xfa\x66\xff\x99\x8a\x38\xc6\xcf\x13\xaa\x3d"
+ "\x8b\x3f\xfd\xba\xc6\x05\x7e\x36\x50\x07\xfe\x6b\x91\x9f\xdf\x18"
+ "\x0f\xfc\x6c\x70\x77\xbf\x1b\x6b\x7e\xae\xfc\xcc\x3b\x7e\xae\xdc"
+ "\xec\x3d\x3f\x57\x3e\x79\xf5\xf6\xbb\xa9\x1c\xe7\x3e\x3f\x57\xca"
+ "\xc5\x35\x4b\x65\x94\xc8\xcf\x6f\xa4\xb8\xcf\xcf\x7f\xae\xf3\x8e"
+ "\x9f\x2b\x8f\x31\x7e\xfe\x73\x26\xe3\xe7\xca\xda\xbe\xd9\x07\xe7"
+ "\xcf\x61\x8c\x9f\x27\x1a\x3c\x8b\xef\xfd\x86\xd3\xf8\xc7\x22\x3f"
+ "\xab\x35\xd4\x81\x6f\x5f\xe4\xe7\x2a\x5f\x53\x80\x5a\xe3\xee\xbe"
+ "\x3b\xd6\xfc\xfc\xa6\x97\xfb\x5c\xbc\x79\x15\xf6\xb9\x78\xd3\x8b"
+ "\x7d\x2e\x6c\xf7\xdd\x79\x73\x80\xfb\xfc\xfc\x97\xe3\xe2\x5a\xee"
+ "\xcd\x40\x91\x9f\xab\x66\xb8\xcf\xcf\x7f\x29\xf2\x8e\x9f\xdf\xe4"
+ "\xf7\xbf\xf8\x4b\x0c\xe3\xe7\x37\xf3\xfb\x66\x3f\x9e\xbf\xc8\x19"
+ "\x3f\x4f\x8e\xf0\x2c\x7e\x7a\x55\xa0\x0b\xfc\x6c\xa0\x0e\xee\x7b"
+ "\x88\xfc\xfc\xd6\x49\xe0\x67\x83\xbb\xfb\xff\x58\xf3\xf3\x5b\xab"
+ "\xbc\xe3\xe7\xb7\x46\x78\xcf\xcf\xbb\x7f\xba\x7a\xfb\xff\xec\xfe"
+ "\xc2\x7d\x7e\xde\x5d\x21\xae\x71\x77\x5b\xdc\xff\x7f\x7b\xb8\xfb"
+ "\xfc\xbc\xdb\xcb\x7d\x81\xde\x5a\xc2\xf8\x79\x37\xbf\x2f\xd0\x5b"
+ "\x71\x7d\xb3\x2f\x50\xd5\x71\xc6\xcf\x91\x99\x9e\xc5\xa7\x7f\xab"
+ "\xa5\x77\x7e\x4e\xd0\x50\x07\xf7\x84\x44\x7e\x7e\xa7\xca\x14\x90"
+ "\xa0\x71\x77\x1f\x22\x6b\x7e\x7e\x67\xaa\x77\xfc\x5c\x7d\xd9\x7b"
+ "\x7e\xae\xde\x7f\xf5\xf6\x21\xaa\x7e\xc3\x7d\x7e\xae\x4e\x16\xd7"
+ "\xfe\xd5\x16\xf7\xff\xde\xf1\x60\x7f\xa2\xea\x70\xef\xf8\xf9\x9d"
+ "\x09\x8c\x9f\xdf\x36\x30\x7e\x7e\x27\xac\x6f\xf6\x27\x7a\xbb\x82"
+ "\xf1\xf3\xa3\x4d\x9e\xc5\xff\x7f\xa7\xd7\xe7\x3f\x1c\xf9\x37\x04"
+ "\xbf\x94\xc8\xd3\x7b\xd2\xbd\xf7\x71\xec\xb9\xd5\x3b\x9e\x7e\xf7"
+ "\xb0\xf7\x3c\xfd\x6e\xc1\xd5\xf3\x71\xbc\xeb\xc1\x5e\x7f\xef\x46"
+ "\x89\x3e\x8e\x77\xb3\x44\x9e\xde\xa3\x75\x9f\xa7\xdf\xf5\xf5\x8e"
+ "\xa7\xf7\x0c\x61\x3c\xfd\xd7\x7a\xc6\xd3\x7b\x7c\xfa\xc6\xc7\xf1"
+ "\x57\x8d\x77\x3e\x8e\x3d\x59\x9e\xf8\x38\xec\x79\xfa\x6f\xb3\xbd"
+ "\xf7\x73\xbc\x7f\xde\x3b\x9e\x7e\xbf\xc4\x7b\x9e\x7e\x5f\x7d\xf5"
+ "\xfc\x1c\xef\x3f\xe9\x3e\x4f\xbf\x3f\x5c\xf4\x73\xbc\x1f\x2b\xf2"
+ "\xf4\xdf\xf2\xdd\xe7\xe9\xf7\x74\xde\xf1\xf4\xfb\x67\x18\x4f\xbf"
+ "\x57\xce\x78\xfa\xfd\x93\x7d\xe3\xe7\x78\x6f\x86\x77\x7e\x8e\xbf"
+ "\xc5\x7a\xe2\xe7\xb0\xe7\xe9\xbf\x07\x7b\xef\xeb\xd8\xbb\xdf\x3b"
+ "\x9e\xde\xbb\xdc\x7b\x9e\xde\x3b\xe1\xea\xf9\x3a\xf6\x8e\x70\x9f"
+ "\xa7\x6b\xf4\xa2\xaf\x63\x6f\x98\xc8\xd3\x7f\x57\xb9\xcf\xd3\x35"
+ "\x7b\xbc\xe3\xe9\xbd\x7b\x19\x4f\xd7\x24\x33\x9e\xde\x5b\xdd\x37"
+ "\xbe\x8e\x1a\xa5\x77\xbe\x8e\xbf\x87\x79\xe2\xeb\xb0\xe7\xe9\x7d"
+ "\x46\xef\xfd\x1d\xfb\x0a\xbc\xe3\xe9\x7d\x53\xbd\xe7\xe9\x7d\x43"
+ "\xae\x9e\xbf\xe3\x1f\x1d\xee\xf3\xf4\x3f\x2c\xf6\xbf\xd8\x67\xf1"
+ "\xfe\xff\x07\xe3\xdd\xe7\xe9\x7f\x64\x7a\xc7\xd3\xfb\xb6\x32\x9e"
+ "\xfe\x47\x14\xe3\xe9\x7d\x9b\xfa\xc6\xdf\xf1\xf7\x36\xef\xfc\x1d"
+ "\x1f\xf4\x1a\xff\xc2\x91\xbf\xc3\x9e\xa7\x3f\x6a\xf2\xde\xe7\xf1"
+ "\x91\xda\x3b\x9e\xfe\xe8\x56\xef\x79\xfa\xc3\x33\x57\xcf\xe7\xf1"
+ "\xe1\x31\xf7\x79\xfa\xc3\x22\xd1\xe7\xf1\xa1\xc5\xf3\x4f\x5a\x85"
+ "\xfb\x3c\xfd\xe1\x1c\xef\x78\xfa\xa3\x79\x8c\xa7\x3f\x1c\xce\x78"
+ "\xfa\xa3\x98\xbe\xf1\x79\x7c\x50\xe7\x9d\xcf\xe3\xa3\x93\x9e\xf8"
+ "\x3c\xec\x79\xfa\x40\x85\xf7\x7e\x8f\x03\x13\xbc\xe3\xe9\xfd\xe7"
+ "\xbd\xe7\xe9\xfd\x7b\xaf\x9e\xdf\x63\xff\x4e\xf7\x79\x7a\x7f\xa2"
+ "\xe8\xf7\xd8\x6f\x11\xff\xfe\x40\xb3\xfb\x3c\xbd\x3f\xd4\x3b\x9e"
+ "\x3e\xf0\x00\xe3\x69\xad\x9e\xf1\xf4\x81\x90\xbe\xf1\x7b\x68\x8b"
+ "\xbd\xf3\x7b\x1c\xb0\x7b\xfe\x6d\xe5\xc2\xa5\x71\xca\x65\xf1\xf1"
+ "\x2b\x17\x26\x2b\x57\x26\xaa\x17\x2c\x9c\x30\x42\x38\x9f\x10\xaa"
+ "\x19\xa1\x19\x48\xe2\x96\xcc\x9b\xbb\x7a\x8c\x78\x31\x71\xe1\x52"
+ "\xf8\x1a\x48\x54\xf3\x56\xaa\x94\xc9\x6b\x93\x16\x2a\xf1\x6c\xc9"
+ "\x82\x24\x20\x59\x96\x2c\xa6\xfc\x76\x61\xe2\x3c\x8d\x7a\xe9\x22"
+ "\xe5\xbc\x44\xf5\xa2\xa5\x4b\x16\x2e\x4d\x56\xae\x58\xb8\x7c\x95"
+ "\x7a\xc5\x42\xfc\xbd\x52\x19\xbf\x6c\x05\x24\x2c\x58\xa8\x5e\xbd"
+ "\x50\x39\x7f\x55\x7c\xfc\xc2\x15\x2b\x07\x92\x99\xab\x12\x93\xd5"
+ "\x49\x89\x0b\x95\x91\x33\x27\xdd\x37\x7b\xea\xff\xce\x9e\x38\x71"
+ "\x20\xb1\xd8\x7b\x5a\x49\xf3\xb7\xe8\x81\x87\xe4\x67\x65\x8d\xf3"
+ "\x1a\x02\x09\xd9\x0a\xbc\x99\xb3\x82\x28\x5e\x5c\x41\xe4\x99\x17"
+ "\x89\xcf\xd6\x8b\xc4\x57\x99\x40\x22\xe8\x90\x9d\xb1\x39\x17\x89"
+ "\x3f\x1d\x36\x52\x43\xb7\x7d\x51\x4e\x87\x9c\xd2\xe9\x87\x1c\xc8"
+ "\x85\x34\x05\xdd\xb6\x5f\x8b\xd7\x00\x0b\x39\xdd\xf6\x75\xd4\x69"
+ "\x59\xa3\x52\x3f\xe4\x60\x52\xda\xf7\x44\x4a\x07\xd7\x2a\xde\x32"
+ "\xeb\xa5\xfb\xd1\xcb\x06\x63\x45\x64\x87\x82\xe1\xf0\x87\xa3\x16"
+ "\x8e\xe3\x44\xf6\xcf\xe1\x70\x44\xc2\x31\x03\x8e\x1a\x22\xfb\x98"
+ "\xc0\x11\x0a\x07\xa4\x7d\x1c\x03\x47\x1c\x1c\x89\x44\x56\x07\xe9"
+ "\x75\x4a\x38\xe0\x5a\x5d\x14\x2b\xa7\x2e\x1a\x8e\x26\x22\x3b\x1c"
+ "\x08\x07\xe4\x3f\x02\xe9\x47\x92\x89\xec\x28\xd0\x1d\xc9\x87\xa3"
+ "\x1a\x0e\x28\xf3\xc8\x49\x48\xc3\xfc\xb3\xd9\xb5\xa3\xf5\x44\x56"
+ "\xef\x03\x07\x94\x51\x0f\xf5\xd4\x6b\xe0\xc8\x82\xa3\x08\x8e\x72"
+ "\x38\xa0\x6d\xf5\x48\xa3\x23\xb2\x63\xd0\x86\x63\xb1\x70\x6c\x82"
+ "\x03\xca\x69\x80\x3a\x1a\x8a\x09\xf4\x91\x1d\x0d\xcd\xe2\x6f\xee"
+ "\x08\xb4\x39\xb7\x3d\xc2\xfd\x36\xde\xa9\xd3\xde\x6b\x04\xb9\x3d"
+ "\xb4\xd9\x94\x41\x64\xa6\x6d\x07\x93\x92\xee\x25\x92\x73\xb2\x43"
+ "\x4f\x36\x6e\x22\x84\x2a\xbe\x28\xd7\xae\xeb\xc4\xeb\x4f\xe2\x98"
+ "\xb5\x67\x1f\x8a\xd6\x91\xb7\x8a\x50\x3e\xdd\xe3\xcf\x43\xd1\x7c"
+ "\xfe\x5c\x9d\xe4\xb1\x58\xcc\x4f\xf3\x16\x1e\xa7\x69\x31\x3b\xf0"
+ "\x3d\xdc\xb3\x38\x86\x28\x37\xb9\x0b\x43\xa8\x62\x6e\x15\xea\x18"
+ "\xed\x3a\xae\x5d\xf7\x80\xbc\x0d\x86\xfc\xc1\x14\x70\xd4\x07\x00"
+ "\xe6\x19\x44\xce\x9d\x6f\x3b\x90\x4b\xcb\x0b\x4e\x30\xbd\x73\x88"
+ "\x5b\xbf\x74\x04\xa4\x85\xe2\x35\xc3\xae\xa7\x9b\x68\xc5\xb3\xb1"
+ "\xda\xa5\x9d\xa4\x59\xf6\xcf\x00\xd0\x7f\x52\xfa\xeb\xa7\x9b\xcc"
+ "\x85\x69\xa1\x35\xc0\x03\x48\xb3\x37\xb5\x05\xbf\x83\xa0\xdf\x52"
+ "\x9a\x9f\x66\x40\x1f\x90\x36\x35\x0f\x74\xf2\xa1\x7b\x3a\x02\x0a"
+ "\xb4\xca\xc7\xfc\xe8\x69\xac\x47\x8a\xf1\xd6\x0f\xf1\xcf\xf3\x1f"
+ "\x0a\xee\x08\x18\x99\x8e\x65\x9b\xca\x0b\xd3\xe1\x9a\x9c\x02\xef"
+ "\x41\x1b\x24\x17\x20\x9f\xa9\x60\xa4\x46\xfb\x18\x57\xe7\x3b\xd0"
+ "\x4e\x69\xda\x74\x28\xfb\xd5\xc2\xf4\xb7\xd7\x19\xa4\x14\xdb\xee"
+ "\x3f\x52\x03\xbc\xee\x6b\xca\x3e\xa0\xdf\x3e\x94\xc8\x4b\xf2\x08"
+ "\x29\x1b\x4a\x7c\xda\xb3\xff\x59\xa9\x93\x47\x55\x30\xbd\x77\x28"
+ "\x58\x0a\x34\x3a\xd9\x3f\x37\x51\xc0\x83\xab\x2b\x7f\x5d\x52\x0f"
+ "\x75\x75\x74\xd7\x55\xb8\x2e\x09\xeb\xe2\xc6\x87\x8d\x15\xfb\x2d"
+ "\x94\x53\x11\xd3\x53\x9b\x2f\x63\x19\x50\x6f\x0b\x7d\x3d\x26\xdd"
+ "\x54\xb8\x31\x1d\xaf\x21\x3d\x1b\xff\x03\xb9\x7e\x1b\x49\x1b\x85"
+ "\x34\x13\x8f\x81\x09\x31\x90\xa6\x83\xfe\x3a\x54\x87\xf5\xe9\x64"
+ "\x1f\x87\x99\x32\x94\x44\xf9\x18\x21\xad\xb2\x8f\x39\xdf\x04\x55"
+ "\xc4\x17\x33\x8c\x3f\xde\xaa\xa9\xa3\x66\x38\x4c\xa3\xea\x88\x44"
+ "\xfb\x18\xe2\xfb\x71\x95\xf2\xd1\xfe\x30\xce\x1f\xef\xee\x1e\xdf"
+ "\xbb\x0a\x71\x8c\x14\x30\x2e\xbe\xa6\x17\xa6\x40\xbf\x95\x04\xfb"
+ "\x61\x39\x5e\xd8\x9f\xf6\xec\x8f\x4f\xda\x8c\x99\x62\xfa\xf4\x34"
+ "\x6a\x51\xf6\x2e\xcb\xfe\xb7\x67\xd7\xf9\xea\x24\x53\x2a\x91\x5e"
+ "\x79\x37\xc7\x33\xf7\x98\xf8\xeb\xc8\xf7\x88\x33\x0d\xd8\xa2\xc7"
+ "\xf3\xdf\xdd\x43\x14\x7e\x75\x44\xaa\x4c\x0d\xaa\x61\xfc\x90\x66"
+ "\x80\x71\x31\xb0\xf2\xa0\x8f\x85\x89\x51\x90\x37\x58\xe4\xbf\xba"
+ "\x4c\xd3\xb6\xf8\xfc\x8e\x80\xf4\x6a\x43\xc1\xda\x24\x9a\x1b\x9f"
+ "\x8f\xef\x9f\x9f\x96\xd5\x6d\xe4\xc6\x20\xc3\x87\xb0\x76\xc4\x17"
+ "\xa5\x26\x52\x7d\xea\x4f\x50\xd7\xb0\xf4\xea\xbd\xab\xf5\x80\xd9"
+ "\xda\x24\xe4\x89\x9a\x2b\x06\x29\xc6\x04\xa4\x83\x0f\x0e\x2d\x65"
+ "\x7d\xf5\x81\xbe\x12\x2c\x17\xda\x5e\x27\xf6\xb5\x2e\x11\xf9\x03"
+ "\xea\xa8\xe2\x79\x3f\x18\xda\x25\x81\xb2\xab\x80\x4e\xaf\x93\xfc"
+ "\xa8\xe7\xe4\x6b\x35\x3d\x9e\xd3\x49\xc8\xa5\xd5\xd4\x38\xcb\xf8"
+ "\x8d\x19\xe6\x65\xd2\x9e\x7d\x58\xa1\x23\xbf\x2f\x17\xc6\x8c\xc9"
+ "\x5c\x77\x39\x5c\xac\x08\xfd\x10\x2c\xe7\x70\xb8\xa3\x72\x74\xb2"
+ "\xc3\x64\xae\x51\x29\xe9\xbc\x42\x9b\x72\x9e\x82\xb6\x65\x10\xda"
+ "\xb9\x9a\xd6\x6f\x88\xa2\x86\xec\x4f\x09\xd8\x46\x27\x09\xe8\xda"
+ "\xe1\x83\x25\x54\x3f\x6b\x2d\xf1\x1b\x9c\xe4\x47\x0f\xd7\x9d\x24"
+ "\xeb\xa3\x68\x4b\xa3\xc6\x44\x1a\xda\x9a\x49\xca\x17\xc4\x37\xed"
+ "\x18\xf1\x4f\x89\xa2\xfa\xfa\xd8\x93\x84\xa5\x1f\x23\x69\xdf\x12"
+ "\xf9\xfa\x5a\x6a\x78\x02\xe6\xe9\xa3\x27\x31\xbd\x19\xd2\x4d\x24"
+ "\xad\x85\x1a\x53\xff\x40\x7c\xf1\xf7\xb1\x5a\x4c\x3f\x43\x40\x9e"
+ "\xe5\xb3\x34\x7a\xbf\x52\xa8\x13\xf3\x97\x41\x5b\xcc\x57\xe8\xbe"
+ "\x9c\x2b\x84\xac\x7f\x86\x04\xa6\xcc\x23\x8a\x59\x60\x2e\x34\x1a"
+ "\xdf\x23\xb3\x4c\x14\xec\x80\x43\x64\x83\x9a\xf8\xcc\x32\xe2\xfb"
+ "\xe3\x9f\xc1\x51\x42\xca\x80\x16\xfa\xa6\xc5\xbe\xad\x3f\x05\x76"
+ "\xd1\x79\x21\xcf\x07\x7c\x9e\x53\x04\xc7\xac\x63\xc8\xa9\x26\xc3"
+ "\xb6\xaf\xa3\xa1\xef\x72\x1c\x03\xa8\xa7\xc9\x8c\xf9\xae\x70\xf3"
+ "\x13\x8e\x81\x64\xae\x11\x78\xb5\x40\x13\x3d\x57\xa3\xe5\xca\xd5"
+ "\xc9\x8e\x44\x94\xad\xe0\xda\x64\x45\x3b\xcb\x48\x2f\xe9\x03\x34"
+ "\x50\xd6\x11\xd5\x2c\xcd\x44\xca\xe3\x56\xd9\x9e\x7d\xa4\x52\x18"
+ "\x6f\x01\x17\xa0\x29\x06\x2c\x2a\x65\x49\x44\x0e\xd7\xeb\x74\x92"
+ "\x8b\xf5\x16\xbc\x8b\x7a\xeb\x26\x81\x96\xa7\x69\xd5\x49\x7e\xf2"
+ "\xb7\xa0\xd9\x07\x3c\xdd\x4d\xd3\x9e\x7d\x14\xf8\xff\xe2\x70\xf1"
+ "\x3a\xc7\xcf\xdd\xd7\xf9\xf9\x57\x28\x5b\x06\x7a\x38\xdd\x14\x90"
+ "\x4e\x68\xc0\x28\x05\xbd\x14\xe8\x4b\xa5\x80\x8d\x91\x1a\xcc\x05"
+ "\x8b\xa3\x61\x8e\xf5\x6d\x34\xb6\x11\x46\x7f\xf4\x1d\x5a\x30\x2a"
+ "\x90\x3d\xf3\x7a\x74\x3b\x96\x09\xb6\x58\x39\xcc\xd7\x8a\x59\x75"
+ "\xd4\x80\xfa\xc3\x54\x30\x36\x37\x7b\x05\xcc\xd9\x05\x69\x7a\x73"
+ "\xc0\x7a\x62\xd8\x59\xd0\x84\x73\x02\xca\x1b\xcd\x87\xbc\x7c\x39"
+ "\x50\x6f\x3f\x9d\xec\x68\x92\x09\xf2\xd3\xfc\xc5\xd1\x2c\x9d\xe9"
+ "\x37\xa6\x87\x8e\x26\xd1\x11\x70\x2d\x77\xee\x26\xb8\xd6\xef\xb4"
+ "\xec\xa8\x11\xd2\x09\x9c\xef\xd3\xa6\x5e\x04\xda\x7a\x09\xe3\xe9"
+ "\xb9\xe9\x56\xe7\x52\x1c\xcf\x8f\x67\xa0\x8e\x42\xdd\x04\xe9\x77"
+ "\x89\x7a\x82\xcd\x01\x4c\xb7\x2f\x8e\x6d\xcf\xae\x0f\xd3\x49\x66"
+ "\x9e\xc0\x71\x42\x6c\xdb\x98\x5e\x0b\x37\xed\x2c\x38\x71\x30\x8a"
+ "\x90\x83\xb5\x28\x47\xf5\x31\x3a\xc9\xac\x56\x71\x2c\xeb\x97\x23"
+ "\x2d\xd7\x4e\xd0\x25\xf8\x9b\xd3\x2b\x90\x07\xe4\xbc\x1c\xe7\x2c"
+ "\xa6\x1f\xeb\x13\x71\xde\x02\x3d\xe1\xc3\xe6\xa9\x98\x18\x28\x7b"
+ "\x0e\x1d\xfa\x4a\x26\xb4\x2b\xfd\x34\xdf\x16\xcb\xb6\x09\x7a\x91"
+ "\x6e\xdb\xe1\xc3\x68\xe3\xab\xa1\xfe\x13\x3a\x49\x74\xad\x25\xbf"
+ "\xb0\x7e\x1d\x9b\x04\x3c\x7d\x62\x54\x2d\x9c\x83\x2d\x25\x94\x07"
+ "\xfa\xc5\x07\xf4\xca\xbd\xc8\x6f\xa8\x53\x8a\xf2\xd0\x3e\xda\xa1"
+ "\x30\x6c\xdb\x11\xd8\x9e\x7d\x2c\x48\xd0\x2d\x98\x17\xe5\x01\xf4"
+ "\x8b\x0f\xa7\x37\x4c\x46\x19\x27\xf3\x26\x12\xd2\xad\x4b\x20\xad"
+ "\x63\xc8\x0e\x05\x9f\x2e\xe7\xda\x24\x95\x99\xa1\x7e\x89\x50\x5f"
+ "\xc7\x90\xf8\x72\x28\x37\x45\x27\x99\x60\xb0\xd2\x35\x79\x73\x02"
+ "\x29\x8d\x41\xbe\x91\x41\x5b\x77\xc2\x77\x7f\x9e\x4f\x6f\x3e\x08"
+ "\x66\x55\xe4\x54\xa8\x03\xf0\xdc\x3e\x8c\xea\x21\xff\x3e\x1d\xc9"
+ "\xe4\xda\xf5\x22\x9c\x63\x3a\xd2\x40\xfa\x71\x1d\x79\x31\x9f\x2f"
+ "\xb7\x0e\xf1\xb1\x2e\xb7\x41\xc2\xca\x6d\xe8\x87\xe5\xf1\x73\xfc"
+ "\xcd\xf8\x1b\xf3\x63\xd9\x25\x85\xb4\x15\xcb\x6b\xcf\x6e\x50\x0a"
+ "\x75\x6c\x85\x34\xa1\x9e\xc8\x25\x42\x5d\x0d\x11\x50\xd7\x70\xcb"
+ "\x3e\x14\x15\xd2\x36\xd6\xbe\x86\x39\x3a\x52\x52\x87\xd7\x32\x21"
+ "\x0d\xf3\x32\x5e\x68\x58\x8b\x7c\xa2\x63\xfd\x92\x31\x7e\x69\xc8"
+ "\xd4\x91\xe2\x68\xcb\xb9\x07\xb0\x18\x24\xcc\x4d\x7c\x79\x55\x42"
+ "\x79\x62\x59\xac\x0c\x9a\x5b\xec\xc3\xcb\x02\xca\xac\x2f\x96\x0f"
+ "\xf4\x27\x75\xe4\x25\x7e\x4e\xf8\x78\x46\x1b\xe3\x6d\xc4\x00\xf3"
+ "\x30\xcc\xb3\x0f\x86\xe3\xbc\x59\x96\x87\x7a\x2c\xbe\xb8\x3d\xbb"
+ "\x51\x61\x33\x67\xfa\xb0\xf9\x2c\x5d\x89\xbc\xc1\xcb\xff\x93\xd8"
+ "\x26\xa1\xbf\x50\x8e\x1c\xca\x79\x0c\x79\x1a\xcb\x01\x3d\xa7\x83"
+ "\x72\x62\x6c\xca\x91\x23\x9d\x29\xfb\x60\x1a\xce\xd1\x2f\x0f\xa3"
+ "\x2d\x40\x93\x22\xd0\xe0\x75\x18\xd7\x47\x20\x2d\x57\x47\xaa\x12"
+ "\x31\x2d\x1b\x68\x74\xb2\x83\x4e\xdf\xdb\x49\xbd\x8b\x48\x1b\x8b"
+ "\x75\xb8\xa6\x45\xf9\x1d\xdf\x38\xbc\x8d\x34\x16\x9b\x89\xf9\xf5"
+ "\x67\x48\x44\x2a\xd5\x9e\x95\x35\x0d\x6a\x30\xb4\xb8\xb9\xf6\x6f"
+ "\xe4\x9e\x7f\xa7\x9d\xb0\xf6\x4a\x19\x43\xd0\x2e\xb9\x20\xfb\x64"
+ "\x42\xa3\xfe\x22\xa7\xcb\xe0\x37\x37\x07\xbe\x0c\x6b\x35\x5c\xaf"
+ "\xc1\x9a\x5c\x95\x2b\x65\x6b\x36\x33\xd0\x96\x62\x3a\xae\xe7\x60"
+ "\x8e\x2a\xb3\xb8\x46\x5f\x7f\x3a\x9d\x8d\x5d\xd3\x65\x4e\xa7\x63"
+ "\x7b\x8d\xd3\xb4\xd8\x66\x73\xc5\xd3\xe9\xd8\x87\x34\x0d\x35\x37"
+ "\x1a\xdb\xb5\x38\x8f\x29\x57\xe3\x5a\xb3\xe9\x93\x59\x25\x84\x9a"
+ "\x77\x3d\xed\xe6\x5a\xaf\x89\x7b\xf7\x06\xd6\xe3\x17\xf4\x23\x9e"
+ "\x4e\x4f\x33\x11\x69\x4e\x6a\x3f\x9f\x29\xc5\x54\x7b\xe9\xd7\xcf"
+ "\x00\x5f\x34\xb5\xed\xd7\x10\xe2\xbe\x8d\xde\xd4\x26\xf4\xbd\x94"
+ "\xef\x3b\xa4\x71\xef\x8b\x8c\x2a\x4a\xe7\xfa\xab\x93\x7d\xe2\x34"
+ "\xd6\x1b\xcd\xf0\xa3\x07\x8b\x8d\x64\x65\x31\xed\x5c\x59\x42\xa4"
+ "\x60\x23\x35\xbd\x5d\x7a\x02\xf5\x76\x84\x30\x9e\xdc\xd8\x19\xf5"
+ "\x24\x29\x95\x28\xce\xc9\x3e\xf9\x6c\x56\x4a\x3a\xb7\x77\xd3\x47"
+ "\x40\xe7\x5e\x5b\x3f\x29\xc7\x76\x34\xc0\xfa\x7e\x96\x31\x8d\xb2"
+ "\xb9\xe7\x13\xd3\x13\x7c\x79\x78\x4d\xc0\xaf\x94\x5f\x77\xbb\x5f"
+ "\xc7\xa7\x4e\xe3\x7f\xf4\xd0\x57\x85\xe3\xbe\x7e\xba\xdf\xf3\xbe"
+ "\x7e\x9a\x65\xdf\xd7\x4f\xbf\xbf\xca\x7d\x75\xba\xff\x57\x0f\x7d"
+ "\x55\x3a\xee\xeb\xbf\x76\x7b\xde\xd7\x7f\x69\xec\xfb\xfa\xaf\xcf"
+ "\xae\x6e\x5f\xff\xe5\xd4\xff\xd7\x43\x5f\x43\x1d\xf7\xf5\xf8\x76"
+ "\xcf\xfb\x7a\x3c\xce\xbe\xaf\xc7\xf7\x5f\xdd\xbe\x1e\xaf\x73\xda"
+ "\x57\xa9\x1f\x45\xfd\x04\x7a\xa9\x33\xb5\x03\x6c\xb6\xc2\x8c\xdc"
+ "\x0d\x3b\x89\xb4\xbe\xcd\x40\x1a\x86\x9f\x20\x69\x6b\x89\x74\x64"
+ "\x12\xe8\xbd\x0c\x32\x9e\x16\x8e\xcc\x6d\x28\x6e\x85\xf4\xb3\xe4"
+ "\x98\xc6\x40\x22\x56\xa0\xfe\xfd\x6c\x6b\x63\x9c\xbb\xfa\xf7\xb3"
+ "\x98\x6e\xfd\x6b\x1c\xc3\xeb\xdc\xcf\xf7\x36\xb4\x76\x12\xec\x3f"
+ "\xfc\xde\xd5\xad\x7f\x33\xd8\x78\xdb\xea\x5f\x1c\x8f\x46\x83\xc1"
+ "\x4a\xff\xb2\xf7\xb7\x3e\x5f\x6e\xab\x7b\xb3\xcf\x11\xe2\x58\xf7"
+ "\x7e\x3e\x13\x75\x6f\x29\x5c\x77\xaf\xfd\x9f\x07\x0a\xba\x37\x17"
+ "\xea\xb4\xd4\xbd\x07\xe3\x70\x4e\xfe\x3c\xc9\x33\xdd\xfb\x79\x92"
+ "\xd0\xef\x12\xbe\xdf\x30\x56\xc7\xad\x75\xef\xe7\x4e\xdf\x75\xb1"
+ "\xe4\x5b\x5a\xb8\xa8\xfa\xed\x3b\x0c\xfd\xcc\x15\xcf\x68\x71\x7e"
+ "\x6b\x87\x31\xf9\x5b\xa9\x41\x7e\x56\xf6\x7f\x2c\x56\x41\x7b\x9c"
+ "\x84\x56\xc4\xa8\x66\x25\xd3\x6f\xe8\x88\x67\xb4\xe8\x43\x45\x5f"
+ "\x00\x5c\xff\x03\xdd\x15\xa3\x72\xaf\xdd\xac\x4c\x98\xff\x48\x2a"
+ "\xc8\xcb\xdb\xab\x0d\x52\xf3\xfa\x18\x3f\xc0\x41\x41\x0b\x16\xeb"
+ "\xe9\x0b\xff\x3b\xfe\x52\xc1\xc6\xd8\x43\xc1\x67\x08\xd2\xd2\x8d"
+ "\xf2\x08\x2f\xda\xdf\xd2\x73\xfb\x4f\xdc\xee\x41\xfb\x5b\xdc\x68"
+ "\x7f\x8b\x4b\xed\x1f\x06\xed\xef\x0c\xef\x07\x6b\x42\xe9\x47\x9d"
+ "\xe1\x72\xf7\xda\x73\xc2\xe9\xfb\x1f\x57\xb1\x0e\x97\xf5\x1f\x1d"
+ "\xa6\xd1\xbf\x5d\xaa\x97\x82\x0e\xe0\xe6\x70\x94\x3d\xa6\xff\x5a"
+ "\x40\x67\x7d\x43\x99\x4e\xd2\xbb\xa9\x93\xbe\x98\xe3\x7a\xfd\x4b"
+ "\xa2\xaf\x41\xfd\xce\xfb\x6f\xab\x13\xdf\x7a\x56\xe7\x5c\x27\x26"
+ "\x46\xdb\xeb\xc4\x2f\x77\xba\xaf\x13\xbf\x4c\xb4\xd7\x89\x5f\x1d"
+ "\x13\x75\xe2\x57\x7b\x3d\xd7\x89\x5f\x6d\x76\x5d\x27\x7e\x35\xcf"
+ "\x33\x9d\xf8\x55\x48\xcf\x3a\xf1\xab\x4d\x9e\xe9\xc4\xaf\x36\xd9"
+ "\xeb\xc4\x2f\x5b\xac\x75\xe2\x57\x4e\xf7\xfa\xa3\xb9\x8f\xeb\x60"
+ "\x8e\xf6\x3d\x27\x3b\x99\x65\xcc\x20\xc4\x9c\xfb\x71\xe6\x2c\x13"
+ "\x6d\xa7\xdb\x1e\xd7\x99\xa5\x61\xa8\x57\x22\xda\xdb\x55\x3e\xe6"
+ "\x35\xc1\xbe\x74\xe8\xdc\x7b\x69\x57\x20\x81\x71\x0a\x82\xf6\xfb"
+ "\xd1\xf6\xe0\xc1\x74\x4d\xf0\xd0\xe2\x2b\xc4\x1f\x8e\xc0\x62\x7e"
+ "\x3e\x86\xdf\xa1\x74\x4d\xe0\xc0\xec\xd5\x24\xc4\xaf\x8d\xf8\x40"
+ "\x1b\x62\xfc\x36\x2a\x08\xe8\x20\x7f\xfc\x4d\x33\xbe\x09\x2e\xbb"
+ "\x42\xe4\x7e\x1a\xc0\x66\x08\xd4\xa7\xf1\xa3\x74\x65\x30\x29\x5b"
+ "\x41\x7c\xcc\x52\x12\x58\x2a\xa5\xd5\xc6\xf6\x60\xa9\xc9\x3f\x5d"
+ "\xc1\xf0\x39\x15\x41\x87\xc1\xda\x2b\x3f\xed\xa4\x79\x58\x5a\xad"
+ "\x29\x4d\x25\xa3\xeb\x63\x64\xd8\x56\x53\x7e\x9a\x96\x16\xc2\x91"
+ "\xa6\x1a\x8c\x36\x74\xd9\x6a\xa8\xbb\x3d\x70\x60\x0e\xd4\x5d\xba"
+ "\x9a\x04\x95\x5c\x21\xc1\xf4\x52\xb0\x14\xf0\x8f\xc1\x3d\x50\x61"
+ "\x8c\x62\xcc\xd2\x6f\x82\xe1\x9a\x1c\x75\x22\xc5\xfa\x8d\x50\x7f"
+ "\x57\x30\xfa\xb1\x80\xb7\x49\x60\x19\xd4\x6f\x5a\x13\xec\xa6\xbc"
+ "\x9c\xe2\xde\x3d\x16\xda\x65\x0e\x99\xaf\xa3\x6f\xc1\x81\xed\x82"
+ "\x31\x2c\xc3\x31\x19\x39\xbf\x19\xdb\xb6\xf5\x0a\x09\x81\x76\x06"
+ "\x41\x1b\x82\xa1\x5e\x8c\x1f\x13\xf3\xdc\x72\x05\xf2\xa8\x55\xdb"
+ "\x4c\xdb\xf8\xb6\xfd\x08\x6d\xbb\x20\xb6\x0d\xeb\xc2\xf1\x71\x76"
+ "\x6f\x76\xd6\x86\x3b\x50\x36\xbf\xf3\xd3\xf4\x8f\xc2\xfb\xb4\x97"
+ "\xd6\xbb\xfb\x2c\xe5\x29\xa7\xef\x3f\xe7\xbc\x45\x86\x53\xc5\xfe"
+ "\xcc\x27\x36\x7f\x43\xd1\x4f\xb8\xf9\x2d\x12\xd2\x08\x72\xdd\x60"
+ "\x38\x4f\xe8\x90\xfd\x99\x87\x82\x5b\xdd\xac\xeb\x6b\xa7\xf1\x4f"
+ "\xb7\x64\xd0\x26\xb3\x7f\x3a\xa1\xfe\x1b\x63\x72\x32\xa8\xa6\x2b"
+ "\xe8\xe9\xf2\xce\xa0\x98\xa4\xb9\x46\x05\xf0\x35\xd5\x28\x57\x10"
+ "\xe5\x59\x59\xf3\x8b\x47\x8e\xc3\xba\xf4\x59\xe2\x73\x5a\xd6\xac"
+ "\x4d\xfb\x02\xef\x61\x7d\x7d\xdc\xfa\x1e\xd6\xd7\x06\x22\xd3\xa9"
+ "\x88\xec\x5b\x0d\x91\x9d\x2e\x26\x40\x67\x7d\xfc\xbb\x86\x95\xa5"
+ "\x9b\x3a\xeb\x8d\x3b\x48\xaa\x91\x7e\x47\xf3\x47\xd5\x65\x4b\xa9"
+ "\x61\xd6\x3d\x12\x9d\x76\x35\xde\xdb\xd1\x4d\x80\x31\xfd\x01\xe6"
+ "\x5a\x3f\xf8\x3d\x00\x30\x25\x49\x2b\xc8\x2d\xe7\x64\x3a\x1f\x94"
+ "\x1b\xbf\xb6\xfe\x51\xa6\xb4\x18\x62\x54\x16\x34\x75\xe5\xa7\xe9"
+ "\x4d\xf9\x8b\xa3\xcd\x8a\x8f\x33\xd1\xcf\x8b\xf7\x64\x41\x36\x62"
+ "\xe6\x9a\x7c\x50\x1e\x63\xb4\xf3\x8f\x90\xb3\xc9\x44\x9a\x76\x99"
+ "\x0c\x02\xde\xec\x96\xab\x99\xad\x7e\x86\x0d\xad\xd4\x8c\xb2\x85"
+ "\x7e\x55\xb8\x36\x38\xf5\x32\xac\xef\xf5\x2d\xa4\x78\x05\xf1\x37"
+ "\xad\x54\x0d\xd5\x5f\x52\xdd\xb2\xc3\x4c\xfc\x07\xb7\x11\x45\xf1"
+ "\x45\xe0\xa9\x95\xc0\x4f\x17\x41\xce\xf4\x4c\xce\x30\x06\x40\x29"
+ "\xca\x58\xf6\x4d\xa1\x65\x17\x99\x8c\x71\x7c\x84\x32\xb6\x0c\xf8"
+ "\x68\x29\xce\x1f\xc0\x47\x19\x20\x63\x20\x17\x34\xfb\x54\x4d\x71"
+ "\x06\x45\xbf\xaf\xb4\xec\x5c\x7f\xbc\x26\xe9\x77\x8f\x54\x79\x24"
+ "\xda\x40\x44\x5f\x47\xf3\xfe\xce\x11\x31\x49\xca\xdf\xd2\x1f\x4f"
+ "\xcb\x74\x61\x90\xee\xa3\x7c\xea\x37\x0a\x18\xef\xfd\xcc\xef\xd6"
+ "\xac\x45\x5f\xa6\x0e\xc6\x02\xc7\x45\xf9\x5b\xf2\x9b\xd3\xb2\x6f"
+ "\x06\xe0\x38\xae\xa9\x24\xb2\xa4\x47\x68\x33\x8c\x99\x82\x72\xfe"
+ "\xbe\x6f\xb8\x67\x65\xf0\xbe\xff\x51\xee\x9e\x1a\xcb\x63\x82\x71"
+ "\x33\xfa\x8f\x0a\x04\xbc\x95\xda\x84\x4e\x4e\x0f\xe1\x38\x9e\x4d"
+ "\x24\xd2\xb9\xad\x30\x56\x26\x18\xab\xf6\x60\x5f\xd0\x47\xd1\xa8"
+ "\x8f\x68\xee\xdc\xa0\x14\x1d\x35\xcf\x8a\x93\xd1\xd4\xe5\xc4\x07"
+ "\xfd\xdb\xcf\x25\x11\xba\xe1\x3c\x8c\x57\xdb\x09\x02\x7a\x69\x30"
+ "\xe8\xac\xa1\x25\xab\x89\x3f\x8e\xd7\xa0\x56\xb0\x55\xf2\x0e\xa6"
+ "\xbf\x95\x5a\xd7\xcf\x04\xfc\x8b\xfa\xc9\x6f\xa3\x64\x00\xc8\xd9"
+ "\xe0\x2c\x94\x47\x90\x4f\xbf\x8d\x9c\xbe\x8c\x29\x06\x39\x34\xae"
+ "\x09\xbe\xbb\x6b\x4d\xb0\x12\x8e\x3b\x04\x1d\x26\xe8\x0f\x9a\xfd"
+ "\xb5\x12\xf5\x57\xa3\x46\x47\x8c\x30\xb6\x83\x71\xae\x5b\x13\x3c"
+ "\x9c\x1b\xe3\x45\xc1\x64\x94\x81\x48\xa0\x4d\x0a\x68\x2f\x29\x8b"
+ "\x27\x3e\xc7\x54\xa7\x89\x09\x64\x43\x18\xf7\x99\x6a\x25\x81\x72"
+ "\xa5\x87\x82\x3f\x23\xfc\x98\x49\x9c\xf3\xdd\xe9\x02\x91\xef\x4e"
+ "\x17\xe0\xd8\x31\xbe\x3b\x9d\x7f\x23\xf2\xdd\xd1\x18\x8e\xef\x64"
+ "\x5d\x23\x38\x7e\x52\x34\x1a\xff\x0a\x63\x74\x3a\x1d\x79\x04\x79"
+ "\xe6\xf0\x5f\x90\x67\xfe\x5d\x79\xbd\xf2\x4c\x47\x7b\xb0\x12\x8e"
+ "\x6b\xc2\x33\x50\x2e\xc7\x33\x38\x56\x47\x63\x3a\x89\x30\x46\x9c"
+ "\xac\xe6\xee\xcf\x54\xa6\x91\x89\x20\xab\x5a\xbf\x8d\x77\x90\x63"
+ "\xdc\x38\x35\x6b\x95\x4f\x51\xf3\x69\xd9\xbf\xbf\x4d\xfb\x84\x28"
+ "\x3a\x33\x28\x6d\x34\xee\x26\x66\xff\xf5\x04\xef\x4f\x9a\xf3\xc7"
+ "\xe6\xc2\x9a\x55\x43\xb7\x9d\xd2\xa1\xef\xdd\x2f\x09\xfd\xdd\x07"
+ "\x72\x4d\x05\x5b\xf4\xe6\x6d\xfb\xb5\x74\xc8\xd7\x51\x78\x8f\xc1"
+ "\xbc\x6d\x67\xac\x79\xc8\x17\xe5\xed\xd9\xcd\xc1\x3a\x42\x39\x9f"
+ "\x3f\xcd\x4f\x47\x1b\x0c\xf5\xef\x93\xec\x7e\x18\xde\x3b\x6c\x8e"
+ "\x12\xee\x7b\xa3\x4e\xe0\xef\x31\xf0\xf7\x20\x9a\x11\xc3\x81\x78"
+ "\x0f\x82\xd7\x29\xe3\x84\x7b\x10\xc2\x39\x5e\x87\x7c\xe3\xb9\xfb"
+ "\xb0\x62\xbe\x1a\x9e\x8e\xcf\xf7\xf5\x07\xa8\xeb\xc5\x7c\xec\x1c"
+ "\xe6\x91\x9a\x2e\x29\xf1\x71\x68\xe3\xf8\x6f\xd1\x83\xfc\xc0\xda"
+ "\xe8\xec\x38\xf8\x96\x9e\x95\x9d\x79\x06\xbe\x65\xf0\xcd\xf9\x31"
+ "\xdd\x9b\xaf\x9a\xdb\xd8\x7d\xa0\x8d\x9b\xf8\x76\x5f\xe6\x64\xf2"
+ "\x5e\x32\xe8\x1c\xff\xbb\x3d\xfb\x4c\xb4\x70\xff\xbe\x9b\x5e\xc4"
+ "\xa7\x15\xeb\x06\x8c\xe4\xec\x99\x02\x76\x8e\xcf\xeb\xf0\xe5\x71"
+ "\xe7\xe6\xa0\x67\x63\xb5\xa9\xa7\x49\xab\xec\xcc\xbe\x46\x98\xc3"
+ "\xcd\x85\x1b\x37\xe1\xfd\x31\x94\x2b\xa1\x5e\x90\x45\x1f\xed\x3a"
+ "\x8e\x86\x7b\x4f\xd4\x9c\xaf\x89\xa5\x85\xa3\x72\x71\x2d\xd8\x4e"
+ "\x55\x8f\xf0\xdf\x13\x50\x9e\x98\xdf\xe4\xec\x00\x0a\xd8\xe2\x1e"
+ "\xee\xdd\xcf\x30\xe1\xde\xea\xe9\x72\xe5\xfe\x14\x36\x57\x0a\xed"
+ "\xc5\xfd\xd7\xf1\x19\xa1\xdf\xa4\x93\xf4\x76\x07\xfb\xaf\x8b\xcf"
+ "\x12\x9d\x69\x33\x17\x68\x62\xdb\xb3\xcf\x46\x02\x06\x9b\x2c\xfb"
+ "\xec\x08\x0b\x9d\xec\x6c\xac\xb3\x6b\xee\xe1\x70\x36\xc5\x59\x39"
+ "\x53\x83\x4d\xd4\xcd\xb2\x9c\xfb\x7f\x82\x9e\x26\xb3\x2a\x4d\x5a"
+ "\x73\x57\x8c\xdf\xa1\x94\xf3\x6e\xda\x36\xdf\x29\x9d\x95\x6b\xca"
+ "\x5f\xaf\xec\xfa\xf5\xd3\x28\xcb\xbe\xa6\x65\x31\xd3\x1a\x2a\x8d"
+ "\xe4\x8d\xa5\x2d\x52\xd4\x87\x55\xe7\xaa\xa5\xb3\xee\xe1\x6d\xb8"
+ "\x66\xa2\x40\xbf\x17\xda\x72\xd9\x17\x48\x50\x67\x5a\x8c\x5f\x67"
+ "\x57\x0c\x79\xe9\x02\x19\x6f\x5e\x14\x38\x30\x2b\x9e\xc8\x3b\x40"
+ "\x17\x76\x7c\xa7\xf2\x3b\x7a\xb2\x85\x7c\x04\x79\x1b\xda\x74\xa4"
+ "\x14\x68\xe9\x77\x31\x83\x1f\x8f\xa5\x86\xfa\xd8\xbf\x92\x59\xc1"
+ "\x26\x6d\xea\xb7\x64\x10\xe8\x44\x45\xa3\x66\x17\xac\xa1\xce\x93"
+ "\x7e\x6b\xa5\xca\x46\xe3\x19\xb2\x35\x1e\x74\x29\xe8\xce\xb4\xdf"
+ "\xc1\x9c\x01\x3c\xb1\xc3\x72\xce\x48\x78\x45\x9c\x33\x7e\x84\x39"
+ "\x23\x0f\xe6\x8c\xb4\x40\xd2\x90\xa4\x25\xa0\xc3\xfa\x3f\x91\xe4"
+ "\x67\x48\x4d\x82\xb9\x63\x2d\xcc\x1d\x9a\x33\x84\x9b\x37\x5a\x5b"
+ "\x08\xe8\xfc\xc1\x25\x4b\x89\x7f\xe7\x8f\x30\x77\xfc\x08\x73\x47"
+ "\x2a\x9b\x3b\xb6\x5f\x80\xb9\x63\x19\xac\x0d\x96\xc2\xdc\xd1\xea"
+ "\x60\xee\xb8\xe0\x78\x5d\x20\xe8\xc1\x8e\x1f\x83\xa5\xdb\x61\xde"
+ "\x58\xf7\x19\x91\x6e\x7f\xaa\xbf\x9b\x3c\xd3\xe2\xf4\x3e\x0a\x2d"
+ "\xdc\xb8\xc0\x4c\x63\x08\x8e\xfb\x3a\x03\xcc\xc3\x80\x4b\x63\xb0"
+ "\x91\xf8\x1d\xef\x1f\xd5\x01\xe9\x5d\xc3\x16\x35\x55\x7e\xa9\x97"
+ "\xd2\xfc\xc5\xfa\x0e\xc0\x6d\xdd\x2a\x22\xed\x02\x0c\xab\x7e\x9b"
+ "\x2b\xc5\x75\xa2\xb9\x40\xe5\xcf\xd6\xa4\xe7\x0e\xa3\x4f\xc4\x4f"
+ "\xc7\x70\x33\xd2\x18\x3f\xba\x20\x66\xd0\xd6\xf9\x44\x6e\xfa\x77"
+ "\xe0\x40\xf3\x82\x40\x9f\xd4\xcf\x88\x42\xbf\x40\x05\xe3\x75\x9e"
+ "\x7c\xf4\x69\xae\xb4\xec\x59\xa2\xc4\x78\x8d\xf4\x05\x53\x4b\xd9"
+ "\x73\x24\xbc\xec\x6b\x12\x56\xfa\x2c\x09\x29\xf9\x12\xe3\xba\x03"
+ "\x86\x2d\xd4\x70\x4c\xf5\x77\x52\xf6\x25\x89\xa0\x85\x09\x4d\x34"
+ "\x60\xbd\x12\x7e\x87\xe7\x3e\x0b\xeb\x07\xb8\x3e\x2b\xb8\x43\xdb"
+ "\xa8\x39\x46\xb2\x4e\x13\x92\xfa\x3d\x8f\x71\x37\xbe\xa7\x88\x51"
+ "\x0a\xfa\x03\x6d\x82\x99\x0c\x5f\xbc\xef\x85\x6b\x8e\x6e\x8c\xe3"
+ "\x0f\x58\xdb\x05\x3c\xc6\xc7\x5a\x9b\x08\xcc\x81\xfd\xbb\xed\x03"
+ "\x0e\xe3\x53\x44\xb0\x0d\x00\x9b\xc1\x60\x0b\xf8\x77\x5c\xb2\xb1"
+ "\x0f\x56\x78\x68\x1f\xf0\xeb\x1b\xe3\xca\x60\x69\xb1\x94\x92\xb4"
+ "\x63\x44\x5a\x64\x76\x17\xe3\x73\xdc\xfb\x45\xe8\xfb\x62\xcf\xee"
+ "\x7c\x3f\x13\xb1\xd0\xc9\xbe\x9f\xf1\xbb\x60\x09\xf1\x0c\x7b\x55"
+ "\x74\x2f\xd8\xe7\x33\xec\x5b\x0f\x79\x86\xbd\x2a\x9a\xbe\x60\x8e"
+ "\xf0\x0c\xfb\xcb\x6e\x62\xcf\xc5\xbd\xbc\x41\xb1\x6f\xcd\xb5\xc6"
+ "\xfe\x87\xe9\x0c\xfb\x1f\xa2\xbc\xc0\xbe\x17\xb9\x57\xf3\x72\x7f"
+ "\x61\xbf\x87\xd8\x83\xdc\x9b\x8b\x3c\xc3\xfe\xbc\x9b\xd8\x73\xb1"
+ "\x33\x6f\x50\xec\x2f\x64\x59\x63\x7f\x7e\x2a\xc3\xfe\x7c\xa4\xe7"
+ "\xd8\xab\x7b\x91\x7b\x35\x2f\xf7\xfa\x0f\x3c\xc3\x5e\x8d\x72\xaf"
+ "\xf7\x0c\xfb\x53\x6e\x62\xcf\xc5\xdf\xbc\x41\xb1\xd7\x67\x5a\x63"
+ "\xff\xe3\x24\x86\xfd\x8f\x11\x5e\x60\xdf\x8b\xdc\x27\xf0\x72\x7f"
+ "\x71\xaf\x87\xd8\x83\xdc\xd3\x28\xcf\xb0\xff\xc0\x4d\xec\xb9\x18"
+ "\x9e\x37\x28\xf6\x17\x37\x59\x63\xff\xd3\x04\x86\xfd\x4f\xe3\x3d"
+ "\xc7\x3e\xa1\x17\xb9\x4f\xe0\xe5\xbe\xed\x3d\xcf\xb0\x4f\x00\xb9"
+ "\xa7\xe5\x9e\x61\xbf\xc1\x4d\xec\xb9\x38\xa0\x37\x28\xf6\x6d\xe9"
+ "\xd6\xd8\x5f\x1a\xc7\xb0\xbf\x14\xee\x0a\xf6\xeb\x2d\xb1\x3f\xd9"
+ "\x3f\x0a\xd6\x56\x9c\x9d\xff\xc6\xb3\x3c\xf6\xaf\x03\xf6\xd0\xff"
+ "\xaa\xa7\x8a\x6c\x6c\xfc\x2b\x6f\x70\xb8\xc7\x02\xee\x1a\xc0\x1d"
+ "\xd6\x86\x02\xe6\x80\xd1\x20\xc4\x1d\x31\x4f\x3d\x45\x14\x1f\x41"
+ "\x5e\xc4\x07\x31\x06\x1c\x95\x1c\xce\x37\x99\x5a\xa8\x44\x1e\x88"
+ "\x78\xa2\xdd\x8f\x98\xf7\x66\xdb\x23\x4f\xf4\x8a\xf9\x93\xd7\xc6"
+ "\xbe\xef\xb4\xf5\xff\x5d\x2d\xcc\x3f\x81\x35\x5c\xaa\xbb\x98\x5f"
+ "\x49\xb6\xc6\xfc\xf2\x68\xc4\x41\x27\xbb\x1c\xea\x39\xe6\xea\x68"
+ "\xe7\x98\x0b\x73\xbc\xa1\xc4\x3b\xcc\xcd\x7a\x11\x73\x75\x74\xcf"
+ "\x98\x9f\xf2\x00\xf3\xab\x3b\xbf\x5f\x5f\x98\x1b\x54\xd6\x98\xb7"
+ "\x8f\x60\x98\xb7\x07\x39\xc3\xdc\x0c\xfa\x1a\x7d\xea\xf8\x5e\xa2"
+ "\xa9\x3d\x66\x5a\x17\xe0\x8a\xef\x27\xa2\xaf\x77\xf7\xd2\x1a\x69"
+ "\x17\xe0\x9e\xb3\x9a\x04\x65\xad\x26\xe3\xfd\x5a\x98\xfe\xee\x04"
+ "\xfd\xfd\xe2\x15\x22\x37\x2f\x0e\x1c\x98\x75\x8e\xc8\x3b\x61\x8c"
+ "\x3b\x17\xab\xfc\xea\x63\xf5\xe4\xa3\x0b\x35\x52\xf4\xdd\xe2\x7d"
+ "\x3b\xfa\x43\xcc\xe0\xe9\x71\xd4\x50\xdf\x9c\xc7\xfc\x2a\x67\x04"
+ "\xbf\xca\x6e\x2b\xbf\xca\x4b\xe7\x78\xbf\xca\x33\x0c\xa3\x62\x4b"
+ "\x7c\x9e\x7b\xd5\x89\x5f\xa5\xae\x57\xbf\x0a\xe7\x4f\xb9\x40\xfc"
+ "\xbb\x96\xa9\x86\x6e\xe7\xfd\x2a\xaf\x2c\xf5\xce\xaf\xd2\xb9\x2c"
+ "\x58\xfa\x0a\xe0\xb3\xfe\x19\xc0\xe7\x4b\x77\xf1\xe9\x74\xfa\xfe"
+ "\xb3\xed\x5c\x2b\xcc\xb1\xc2\xbc\x8a\x32\x87\x73\xab\x21\x7f\xd1"
+ "\x71\x5b\x5f\x0a\xca\xdb\x05\x99\xf1\x56\xd4\xc9\x9e\xf9\x53\x40"
+ "\xc6\xfe\xcb\xfc\x29\x28\x73\xc2\x3c\x7b\x7d\xcc\xb1\x5d\xcd\xd6"
+ "\xb2\xd7\x59\xc2\xe6\xd8\xce\x62\x57\xed\x2b\xe7\x98\xab\x66\xdb"
+ "\xfa\x50\x18\xe6\xe6\x41\xe8\x73\xf1\xc8\x8f\xb2\x85\xcc\xf8\x6f"
+ "\xf3\xa3\x5c\x7f\x98\x9b\x4e\x58\x63\x6e\xdc\xc6\x30\x37\xe6\x5e"
+ "\x05\xcc\x8f\xdb\xfa\x4e\x38\xcc\xe5\x44\x82\xbe\x16\x8f\xfc\x27"
+ "\x5b\x88\x87\xb6\xf4\x7f\xce\x7f\x72\xfd\x61\x4e\xeb\xad\x31\x37"
+ "\x6f\x66\x98\x9b\x37\x79\x8f\xb9\x7a\xb6\xad\xcf\x84\x61\x2e\xb9"
+ "\x8c\xb6\x97\x47\x7e\x93\x2d\xa4\xed\xbf\xcd\x6f\x72\xdd\x61\x2e"
+ "\x97\x68\xad\x30\x97\x93\xb5\x1c\xe6\x72\xa2\xb9\x0a\x98\x1f\xb7"
+ "\xf5\x95\x30\xcc\x65\xdf\xa3\x6f\xc5\x23\x7f\xc9\x16\xc9\x7f\x9d"
+ "\xbf\xe4\xfa\xc3\x5c\xb6\xc7\x1a\x73\xe9\x12\x86\xb9\x34\xd1\x7b"
+ "\xcc\x13\x66\xdb\xfa\x48\x18\xe6\xfd\x4e\xa1\x4f\xc5\x23\x3f\xc9"
+ "\x16\x49\xf1\x7f\x9b\x9f\xe4\xfa\xc3\xbc\x5f\xa5\x35\xe6\xf2\x79"
+ "\x0c\x73\x79\xac\xab\x6b\x66\x61\xad\x2c\xac\x8f\xb9\xb5\xb2\x3f"
+ "\xd8\xec\x36\xbe\x11\x86\x77\xff\xc3\x9c\xcd\xee\xf1\x5a\x99\x1a"
+ "\xfe\x5b\xfc\x23\x02\xd6\xb8\x5e\xbe\x2e\xd6\xca\xf2\xfe\xd6\xf7"
+ "\x3f\xe5\x37\x3d\xc9\xad\x95\xe5\x37\x45\x3b\xc3\xda\xd1\xb3\x08"
+ "\x0d\xb0\xd6\x14\x9e\x45\x78\x71\x35\xe0\x08\x7c\x80\xcf\x22\xe0"
+ "\x33\x09\x8e\x9e\x47\xc0\xe7\x10\x84\x67\x12\x2c\x9f\x47\x88\xd2"
+ "\x51\x03\x3e\x93\x80\xeb\xe4\xfa\xd8\x2d\x44\x78\x36\x01\x9f\x41"
+ "\x48\xfb\x96\x0c\x42\x8c\xf0\xf9\x03\x5c\x2f\x5f\xeb\x67\x10\x8a"
+ "\xcc\xd7\xc1\x33\x08\xf2\x01\x4e\xe3\xdf\x09\x32\x37\xf3\x8d\x3b"
+ "\x08\xf0\x5b\xb7\x9f\xaa\xab\x70\x51\x13\xca\x1c\x62\xe4\xd7\xca"
+ "\xe4\x70\xf7\x53\xd5\xd2\x46\x4d\x0d\x79\x71\x1d\x51\x08\xfe\x0b"
+ "\x94\x41\xd0\xcb\x7e\x46\xc0\x33\x2b\x81\xf9\x31\xcc\x3f\xc4\x0c"
+ "\xd2\x2f\x56\xf9\xe1\x7b\xfb\x1f\x7d\x5e\x2d\x45\xdf\x63\x59\x3c"
+ "\x09\xdb\x71\x96\x84\x37\xb4\x9d\x22\x9c\x4c\x15\xa8\x7c\xcc\x05"
+ "\x8b\xf4\x5d\x05\xeb\x95\xe6\x80\x45\x6d\xfa\x80\x45\x06\xc4\x2d"
+ "\xeb\x1c\x21\x28\x5f\x88\x5b\xa3\xa6\xa4\x1b\x2f\x0e\x2b\x29\xef"
+ "\xdb\x70\x2a\x53\x9f\x7a\x8c\x59\xf1\x05\xc0\x6c\x99\x35\x66\x25"
+ "\x9e\xfa\x37\x84\xe7\xb9\x97\x05\x4b\x4b\x40\xa6\xd6\x3d\x09\x98"
+ "\xfd\xd6\x5d\xcc\x06\x3a\x8d\xff\xed\x1c\x33\x55\xb4\x8b\x98\xe5"
+ "\xf7\x8e\x99\x39\xc2\x01\x66\x99\x90\x37\x89\x61\xa6\x4a\xd6\x07"
+ "\xa8\x34\x22\x66\x97\x5d\xc4\xcc\x76\x0d\x7b\x23\x61\xe6\x5b\xec"
+ "\x01\x66\x2e\xca\x99\xda\x05\x39\x33\x17\xd9\x63\xa6\x06\x39\x53"
+ "\xf1\x72\xa6\x02\x39\x53\x59\xc8\xd9\x79\x17\x31\xb3\x5d\x83\xde"
+ "\x48\x98\x0d\x8e\x76\x1f\x33\xb5\x8b\x72\xa6\x76\x45\xce\xf4\x0e"
+ "\x30\x03\x39\x53\xf3\x72\xa6\x06\x39\x53\x5b\xc8\xd9\x29\x17\x31"
+ "\xb3\x5d\x43\xde\x48\x98\x29\x9c\xbf\xff\xed\x1c\x33\x17\xe5\x2c"
+ "\xc1\x05\x39\xa3\x51\xf6\x98\x25\x80\x9c\xa9\x79\x39\x53\x83\x9c"
+ "\xa9\x2d\xe4\xec\x03\x17\x31\xb3\x5d\x03\xde\x48\x98\x0d\x71\x1a"
+ "\xff\xdf\x39\x66\x09\x2e\xca\x59\x82\x0b\x72\x46\xcb\x1d\x60\x06"
+ "\x72\x96\xc0\xcb\x59\x02\xc8\x59\x82\x85\x9c\x6d\x70\x11\x33\xdb"
+ "\x35\xdc\x8d\x84\xd9\x2d\x89\xee\x62\xc6\xe1\x05\xb6\xa3\x43\xcc"
+ "\x3a\xad\xed\x46\x23\xd8\xf1\x78\xcf\xcb\x21\x5e\x2f\x98\xf0\x9d"
+ "\xde\x40\xc4\x0a\xed\x41\xc4\xab\x51\x73\x88\x38\xb2\x1b\xf1\xbe"
+ "\x18\xe0\x4e\xf0\xde\x58\xda\x19\x37\xec\xc5\xf9\xce\xb0\xea\xfd"
+ "\x7e\x58\xf1\x52\x11\x2b\xe1\x7e\xd8\x55\xc5\xea\x53\x77\xb1\x0a"
+ "\x70\xba\xff\x51\xcf\x58\xa9\xa3\x7b\xc7\x4a\x9d\xdf\x33\x56\x66"
+ "\xbd\x88\xd5\x29\x0b\xac\xec\xe7\x31\xd7\xb1\xb2\x99\xbf\x6e\x28"
+ "\xac\x86\xd5\x3a\xc3\xca\xe8\xbf\x5e\x89\xef\xbc\x3f\x01\x6b\x5f"
+ "\xba\x20\x66\x5a\xf6\x69\x12\xb4\xe5\x34\x19\x8f\xef\x37\xef\x5e"
+ "\x67\x90\x42\x1f\xbf\x3b\x72\xbc\x85\x74\xfd\x10\x38\x10\xdf\x9f"
+ "\xe1\xf4\xe4\xe2\x40\x9f\xc6\x58\x3d\xa7\x13\xb7\x02\x46\x0d\x6d"
+ "\x35\x30\x26\xfd\xa3\x1a\xda\xfe\x4a\x3a\x57\xc6\x90\xa3\x27\xcf"
+ "\x01\x2e\xb4\xab\xb1\xb5\x86\x94\xc1\x75\xed\xea\xbf\x12\xf3\x0f"
+ "\xc1\x03\xe7\x6a\x88\xf4\x82\xfc\x17\x99\xb8\x76\x1e\xa5\x21\x8a"
+ "\x19\xad\xd4\xd0\xd0\x7a\x84\xec\x98\x4f\x82\x0e\x69\x08\xc1\xb1"
+ "\xe6\xd6\xca\x09\xb8\x56\xfe\xc0\x0a\x9f\x57\x2c\xd6\xca\xdc\xfb"
+ "\xb2\x49\x80\xcd\x4f\x36\xd8\xc0\x5a\x1c\xc6\xba\xff\x13\x6d\x80"
+ "\x4d\x9b\x80\xcd\x79\x92\xba\x1c\xb1\xd1\x89\x6b\x65\x1e\x9b\x62"
+ "\xd4\x79\x49\x16\x6b\xe5\x0b\x16\xd8\xf0\xef\xaa\x5a\x61\x23\xf8"
+ "\x32\xd6\x04\xe3\x3d\x72\xbb\xb5\xb2\x67\xbe\x8c\x40\xa7\xef\x8a"
+ "\x70\x72\x04\x32\xf2\x04\xc8\x51\x4a\x32\x27\x47\x6c\xfc\x87\x2d"
+ "\x02\x7e\xaf\x26\x7e\xba\xfe\x51\x5b\x00\x83\x4e\x90\x35\x9c\x8b"
+ "\xd2\xa0\x9f\x88\x25\xe2\xf6\x44\x65\x57\xd7\x73\x6d\x44\x0a\x36"
+ "\xb8\x3f\x62\x67\xfa\x21\xd0\x27\x1b\xe6\xaa\xc6\x39\x5f\x02\x3e"
+ "\x17\x49\xa3\x9e\xc7\x66\xdd\x97\xe4\x82\xfc\xd6\xe1\x74\x71\xf0"
+ "\xc0\x91\xc0\xa7\x30\xf7\x28\xe6\xe2\xbb\x2f\xa0\xf3\x76\xc4\x93"
+ "\xf0\x19\x49\xd4\xc0\x3d\xcb\x03\x32\x86\xf3\x19\xea\xc3\x86\xa4"
+ "\x03\xc4\x54\xb0\xa8\xad\x2b\x60\xbd\xf2\x50\x32\x21\xa8\x13\x11"
+ "\x8b\x7e\xab\x44\xec\xf0\xbd\x3d\x4b\x5f\x87\x9d\x2e\x4c\x38\xe2"
+ "\x58\xbe\xe6\xe8\xdc\xf2\x77\x14\xf3\xf2\x55\xec\xa9\xbf\x43\xf0"
+ "\x47\x01\x86\xf8\xae\x5e\xda\x67\x44\xfa\x8a\xdb\x18\xde\x16\xe4"
+ "\x3e\x86\xaa\xe8\xde\x31\x6c\x17\x30\xcc\xef\x1d\xc3\xdb\x74\xf6"
+ "\x18\xaa\x92\x44\x0c\xcd\x11\x16\x18\x66\x32\x0c\x55\xc9\x22\x86"
+ "\x2a\x4d\xef\x18\xda\xac\xa5\x6f\x28\x0c\x7f\xd9\xb3\xff\xc3\x31"
+ "\x86\x2e\xc8\xe1\x8f\x3c\x86\x6a\x17\xe4\x70\x78\x85\x03\x0c\x2d"
+ "\xe4\xd0\x5c\x24\x62\xa8\xe6\xe5\x50\x65\x21\x87\x2a\x17\xe4\xd0"
+ "\x66\x6d\x7d\x43\x61\x78\x7b\x95\xfb\x18\xaa\x5d\x90\xc3\x6f\x04"
+ "\x0c\x5d\x90\xc3\x3b\x54\xf6\x18\xaa\x2d\xe5\x50\x6f\x81\x21\x2f"
+ "\x87\x6a\x0b\x39\x54\xbb\x20\x87\x36\xb6\xca\x0d\x85\xe1\x9d\x49"
+ "\x1e\x60\xe8\x82\x1c\x7e\xc4\x63\x98\xe0\x82\x1c\x2a\x43\x1c\x60"
+ "\x68\x21\x87\x34\x4a\xc4\x30\x81\x97\x43\xb5\x85\x1c\xaa\x5d\x90"
+ "\x43\x9b\xb5\xf7\x0d\x85\xe1\x5d\x3d\xfb\xff\x1d\x62\x98\xe0\x82"
+ "\x1c\xa6\x09\x18\xba\x20\x87\x77\xe9\xed\x31\x4c\xb0\x90\x43\x5a"
+ "\x6e\x81\x21\x2f\x87\x09\x16\x72\x98\xe0\x82\x1c\xda\xac\xc5\x6f"
+ "\x28\x0c\xef\x36\xb8\x82\x21\xd8\xd9\xf6\x76\x69\x9b\x88\xa1\x25"
+ "\x7e\xb6\xb6\xe8\x2c\xb0\x51\x11\xbb\x39\x46\x22\xb5\xc7\xef\x57"
+ "\xd5\x88\x5f\x08\xde\x8f\xbb\x2c\xda\xa4\x1c\x76\xfc\xfd\x1c\xc4"
+ "\xec\x50\x1c\x21\x68\x9f\x0a\xf6\x28\xde\x53\xed\xb6\x47\x17\xfe"
+ "\xff\x6a\x8f\x06\xed\x71\x1f\x3b\x7e\x1e\x74\x8a\x9d\xf5\xdc\x37"
+ "\x0b\xe6\x44\xe7\xd8\x8d\x48\xb4\xc7\x4e\x9d\x24\x62\xc7\xe6\x3d"
+ "\x86\x9d\x59\x2f\xcc\x7f\x0c\x3b\x7e\xfe\xeb\x11\xbb\x1b\x79\xfe"
+ "\xfb\xb5\xd3\xf9\x2f\x57\x6a\xae\x86\xa3\x06\x0e\x2d\x1c\x75\x26"
+ "\x29\x99\x5a\x22\x35\x37\x11\x16\xd7\x1a\xf9\xd9\xf6\xfa\x4d\xf4"
+ "\x85\xc7\xe4\x48\x43\x37\xca\xfd\x91\x4e\x28\xc3\x34\x90\x10\x48"
+ "\xd7\xfa\x49\x62\x71\x3f\x12\xa4\xed\x2f\x94\xe5\xb7\x91\x44\x40"
+ "\x9f\x19\x9d\x94\xa4\x33\xba\x88\x9b\x90\x8e\x66\x9f\x4d\x81\x34"
+ "\x1f\xbe\x4c\x6e\xff\x43\x93\x54\x8a\x65\xd9\xd6\x3d\x80\xa7\x51"
+ "\x9a\x32\x88\xd2\xb2\x6e\x28\x0b\xeb\x14\xe8\x06\x22\x9d\xe9\xa6"
+ "\x3b\x23\x4d\x12\x79\x90\x25\x1d\x9d\x4c\x2c\xe9\x6e\xe6\xcb\x0b"
+ "\xb6\xea\xc7\xdd\x84\xf8\x49\x94\xac\x2f\x1a\xa9\xd0\x17\x5f\xae"
+ "\xcc\xc1\xcd\xc7\xa1\xcc\x10\xab\x32\x6f\x22\x64\x10\xd0\x63\xb9"
+ "\x83\x54\x5c\xbb\x91\x7e\x10\x1d\x28\x6d\xe5\xca\x97\xc8\x43\xcd"
+ "\x52\x12\xca\xfa\x45\xe4\x25\xdd\x6d\x56\x92\x5c\xeb\x3a\x06\x0b"
+ "\xe3\x65\x49\x87\x34\x54\xda\x4d\xe3\xc7\xb5\x63\xa0\x44\x0f\xed"
+ "\x08\xb7\x6c\x07\xa3\x23\xa3\x79\x3a\x05\xf4\x6b\x7c\x37\x96\xf9"
+ "\xa3\xea\x04\xba\x34\x13\xb9\x15\xb0\xd0\x36\xaa\x08\xe1\xc7\x61"
+ "\x08\xcd\xfe\x4e\xc1\x8f\x45\x84\x65\x99\x83\x24\x12\x5d\x09\x3f"
+ "\x5e\xe6\xec\xb3\xb5\x40\x3b\xd4\xbc\x51\x1e\xd9\x5d\x6e\x06\xc6"
+ "\x94\xe2\xc7\x21\xc3\x78\x0b\x57\x2e\xac\x7a\x4c\x52\x89\x92\x1f"
+ "\x87\x5b\x90\x16\xf2\x44\xb1\x7e\x29\xba\x71\x35\x49\xe5\x78\x4d"
+ "\x6b\x41\xeb\xcf\xc6\xb8\x4d\x07\x7d\x9b\x61\x4f\xef\x63\x4b\x1f"
+ "\xc0\xe8\x5b\x0c\x40\x1f\x6d\x4f\xaf\xb0\xa5\x1f\xc6\xe8\xcf\xb5"
+ "\x01\xfd\x6c\x7b\x7a\xe3\x50\x1b\xfa\x5f\x30\xfa\x56\x1c\xeb\x18"
+ "\x7b\x7a\xa5\x2d\x7d\x20\xa3\xbf\x82\x3c\x32\xc7\x9e\x3e\xc2\x96"
+ "\xfe\x56\x46\x7f\xa1\x15\xe8\x63\xed\xe9\xd3\x6d\xe9\x6f\x63\xf4"
+ "\xfa\x16\xa0\x8f\xb3\xa5\x2f\xe3\x68\xc9\xdd\x3c\xed\x2f\x19\xed"
+ "\xc5\x66\xa0\x55\x39\xe8\xab\x8c\x2f\x3b\x94\xa7\x1f\xce\xe8\xbf"
+ "\x53\x01\x7d\xa2\x03\xac\x6c\xe9\x6f\xe7\xe8\x87\xde\xe4\x03\xf4"
+ "\x49\x0e\xb0\xb2\xa5\xbf\x83\x95\xdf\x19\x0d\xf4\xc9\x0e\xb0\xb2"
+ "\xa5\xbf\x93\xd1\x1b\x51\x86\x35\x0e\xc6\xde\x9a\x7e\xb0\x39\x1c"
+ "\xe8\x52\x4a\x32\x04\xf9\xb1\x1a\x77\xdb\xb2\xef\x62\x6d\x27\x21"
+ "\x90\x27\xdd\xc1\xb8\xdb\xd2\xdf\xcd\xe8\xa5\x4a\xa0\xdf\x64\x4f"
+ "\x4f\x24\x8c\x9e\x8c\xe1\xe9\x7f\xc5\xe8\xe5\xfe\x40\x9f\xe9\x60"
+ "\xec\xf1\xba\x96\x97\xd3\x20\xd6\x4f\x43\x1d\xd0\x66\x39\x18\x77"
+ "\x4b\xda\x11\xac\xdc\x5b\xf6\x00\x6d\xae\x83\x31\xb7\xa4\xfd\x35"
+ "\xa3\x1d\x90\x02\xb4\xf9\x0e\xc6\xdb\x92\xf6\x37\x8c\xf6\xe6\x50"
+ "\xa0\x2d\x72\xd0\xde\xbb\x2d\x68\x83\x19\xad\x2f\xf2\x55\xb1\x03"
+ "\x5c\x2c\x69\xef\x61\xb4\x01\xb1\x40\x5b\xee\x00\x17\x4b\xda\x7b"
+ "\x19\xed\xe0\x22\xa0\xad\x70\x80\x89\x25\xed\xff\xd0\xa1\x8a\x19"
+ "\xbc\x6e\xad\xb4\xa5\x05\x1e\xd0\x82\x1e\xaa\x03\x5d\x18\x42\xf3"
+ "\x86\xa2\xde\x44\xbd\xc6\xad\xe3\x05\x1a\x2a\x35\xde\x6f\x31\x0f"
+ "\xdc\x47\xf3\xfa\xb7\xf1\xfa\xaf\xda\xb6\x3c\x2a\x95\x5b\xd2\x8e"
+ "\xa4\x79\xbf\x8a\xe0\x69\xf7\xd8\xd3\xfa\x58\xd2\x8e\xa2\x79\x81"
+ "\x95\x3c\x6d\x8d\x3d\xad\xa2\x9b\x96\xe6\xdd\x96\x08\x34\xfb\x4a"
+ "\x79\xbd\x6a\xd1\xce\x31\x16\xe5\x8d\xa6\x79\xc3\x43\xf9\xf2\xb4"
+ "\xf6\xe5\x29\x2d\x69\xc7\xd0\xbc\x20\x23\x4f\x5b\x6b\x4f\x1b\x61"
+ "\x49\x7b\x3f\xcd\xbb\x5d\xe8\x7f\x9d\x3d\x6d\xba\x25\x6d\x18\xcd"
+ "\xbb\xb3\x86\xa7\xad\xb7\xa5\x2d\x65\x73\x90\x94\xc7\xe9\x01\x9a"
+ "\x77\x57\x0a\x4f\xdb\x64\x35\xc7\x4a\x25\x9c\x8c\x95\x32\xba\x07"
+ "\xe9\xd0\x5f\xf8\xf2\x78\x1e\xb7\x9a\x5b\x33\x24\x43\x71\x4e\x29"
+ "\x41\x3c\x5f\xf8\x6d\x16\xd0\x8e\xe5\xcb\x3b\x61\x3b\xf7\xf1\xed"
+ "\x0b\x87\x6b\x27\x85\xf9\x09\xe6\x1d\x9d\x23\xbb\x27\xe9\x5e\x72"
+ "\xf3\x39\xf9\x28\x03\x9b\x1b\xf9\xbd\xc1\xe4\xa3\xb9\xd8\x48\xe6"
+ "\x8a\xa7\xcb\x67\xb5\x51\xa3\x65\x5a\x8e\x94\x36\x8d\x6a\x23\x72"
+ "\x8c\xd7\x47\x03\x36\xc6\xe8\x20\x5d\x3f\x22\x26\xa9\x3d\x2f\x54"
+ "\xae\x93\x18\x9b\x30\x7e\x13\xfc\x56\xe8\xc8\xeb\xdc\x3e\x2a\x39"
+ "\x19\xb8\x37\x49\x84\xc4\x54\x38\x2a\x17\xf7\x32\x29\x83\xf3\x6c"
+ "\x38\xb8\x7d\x43\x92\xc0\x06\x7e\x81\x44\x68\x57\x1b\xc9\x59\x0d"
+ "\x91\x72\xfb\xe4\xc9\x43\xff\x40\x97\xa9\xc6\x43\x5b\x9a\xa0\xde"
+ "\xb8\xd3\x70\xce\xb5\x05\xf7\x0d\xca\x1f\x55\xa5\x5d\xd1\x89\x34"
+ "\xef\xe8\x03\xb6\x34\xd1\xe7\x7f\xff\x7d\x52\x2a\xb9\xf3\x9c\x3c"
+ "\xb4\x5a\x88\x5f\xc5\xc5\xac\xfa\x51\xf5\x08\x17\xaf\x4a\x3e\x7a"
+ "\xa6\x39\x60\x54\x95\x6d\xbc\x2a\x56\xcf\xe8\xf0\x4b\xa0\xaf\x68"
+ "\x79\x61\x12\x17\x0f\x4b\x3e\x7a\x03\xd7\xbf\x0c\xda\x44\x83\x9e"
+ "\xce\x34\x77\x6e\x4a\xc7\x7d\xed\xb4\xa9\xe7\xc8\x69\xfe\x1a\x96"
+ "\xcf\x97\x3b\x00\xcb\xc3\x72\x85\x32\x31\x9f\xfe\xae\xc2\x24\x1c"
+ "\x0f\x18\x9b\x4c\x97\xe3\x5f\xc9\x43\x0d\x5c\xfc\xab\xbc\xd1\x91"
+ "\x3a\xc9\x74\x0d\x17\xff\x4a\xe8\x8f\xeb\x65\x54\x60\x19\x8e\x63"
+ "\xfd\x12\x3f\x5a\x30\xaa\x0e\xca\xaf\x00\xfb\xb7\x9a\xe1\x33\xba"
+ "\x5a\x27\x19\x9f\xc5\xff\xde\xa7\x93\x4c\xac\xe3\x7f\xd7\xe9\x24"
+ "\xfa\x50\xfe\xf7\x71\x21\x06\x99\xe3\x98\x68\xa3\x8a\x01\x8f\x3d"
+ "\xe6\x1d\x31\x3e\x68\xaf\x73\xed\x09\x18\x55\xac\xbc\x83\x48\xce"
+ "\xca\xc7\xc4\x40\x9d\x7b\xd8\x58\x8d\x19\x0d\xdf\x7e\xfc\xb7\x9e"
+ "\xff\xa6\x48\xc3\xf1\x9c\x7f\x46\x26\xcd\x4d\x60\xfb\xc8\xc8\xc7"
+ "\x4c\xc7\x34\x0e\x5b\xc0\x9f\x0e\x49\x48\xe7\xca\x2d\xd8\xd2\x64"
+ "\xd9\x06\x0c\x34\x16\x3a\x7a\xcc\xfd\x61\x0f\x3c\x38\x36\x7c\xdc"
+ "\xbc\xf9\x0b\xe2\x16\xc6\x2f\x52\xa9\x13\x16\x27\x2e\x59\xba\x2c"
+ "\x69\xf9\x8a\x95\xc9\xab\x56\xaf\xd1\xac\x5d\x87\x74\xdd\xed\xdd"
+ "\x11\x29\x69\x93\x12\xc0\x73\x32\xd6\xf3\x01\x57\x37\xa4\x31\xec"
+ "\xc7\x54\xc9\x95\x8e\xd7\x05\x8d\x81\x84\xe0\x1e\x21\xad\xf2\xfb"
+ "\x07\xe0\x9e\x25\xc0\x87\x92\xc6\xe2\x69\x5a\xdc\xaf\xad\x59\x3e"
+ "\xc6\xd8\xa0\x9f\xa6\xc5\xfd\x05\x0f\x06\xb6\x90\xa0\xbb\x89\xe4"
+ "\x9c\x7c\x4c\x0b\x5e\x2f\xfb\x35\x21\xb5\x90\xd7\x51\x99\x77\x2b"
+ "\x48\xe0\xcb\xc3\xa8\x3e\x7f\x18\x6d\xc5\xf2\xf3\x0b\x69\x8b\x7e"
+ "\xbd\x8a\x64\xc3\x39\xf0\xa6\xe2\xac\xfc\xfe\x0f\x0e\x82\xf5\x6f"
+ "\xce\x20\xc3\x4b\x0b\x69\xf3\xa6\x61\xb4\xf9\xf9\x42\xda\x5a\x36"
+ "\x8c\xea\x82\xf2\x89\x6f\x7b\xde\xfd\xc0\x67\x63\x38\xcc\x72\xe0"
+ "\xba\x79\xe8\x18\x55\x0e\x5c\x1b\x65\x24\xb2\x32\x38\x87\xb4\xb6"
+ "\x83\x4a\xd6\xee\xb7\x2f\x1a\xfa\x41\x79\xb3\x69\x57\xa2\x24\x1b"
+ "\xea\x61\x98\xdc\xff\x6d\x2d\x58\x12\x50\x9f\xbe\xd1\x70\x9a\xe8"
+ "\xe4\xf7\xeb\x70\x3f\x25\xa8\xcf\xaf\xb1\xa8\x95\x60\x79\x6f\xad"
+ "\x30\xf4\x5b\x79\x1b\x35\x02\xad\xd6\xbc\x3e\x51\x02\x34\xc5\x50"
+ "\x76\x9b\x65\x7f\x82\xe3\x97\x24\x2b\x97\xae\x4a\x4c\xbc\x67\x20"
+ "\x09\xe6\xbe\x89\xe5\x5e\x83\xc9\x50\x1e\x79\xb9\x90\xd6\x42\x3f"
+ "\xb5\xd0\xdf\xba\x63\xb0\x02\x01\xfe\x20\xd0\xa7\xdc\xb3\xf2\xb0"
+ "\x07\x20\x7d\x1f\xfc\xde\x07\x6d\xaf\xe3\xf6\x2e\x93\x4f\x9d\x47"
+ "\xf3\xee\x6f\x85\x76\xe2\x9c\x85\x7b\xa5\x90\x4b\x6b\x66\x4b\xa0"
+ "\xdf\xf9\x40\x57\xa7\xbc\x8d\x8c\x80\x7c\x1f\x40\x3b\x2a\xe0\x37"
+ "\xd2\xab\x11\x47\xa0\xaf\x65\xfd\x9a\xca\xc5\x12\x84\xb1\xd2\x96"
+ "\x0c\xa3\x59\xed\x79\x61\x45\x18\xc3\x95\xdb\x77\x06\xce\x61\x5c"
+ "\xea\x80\x36\xf7\x52\xda\x6c\x09\xee\xcb\x59\x26\x96\xa9\xc2\x36"
+ "\x61\x3b\x70\x3d\x7c\x14\x2c\x4a\x73\x57\x0c\xb9\xcf\x40\x24\x47"
+ "\x9b\x09\x29\x2e\xa4\xe5\x70\x14\xc3\x51\x74\x04\xae\x1d\x86\xa3"
+ "\x0e\xd2\xeb\xe1\xfb\x08\x7c\x1f\x6e\xe6\xee\xaf\x06\x62\xbb\x57"
+ "\xa6\xd0\x96\x51\x45\xe4\x57\xdc\xbe\x9f\xa9\xe4\xe9\xd3\xf2\xc8"
+ "\x1a\x6c\x3b\xc6\x6b\xa6\x43\x1f\x08\xb1\x8a\x2b\x2b\x7f\xb0\x9c"
+ "\xc0\x75\xf8\xde\xc3\xbe\x2d\x8f\x07\x8d\x44\x3e\x76\x38\xfb\x3d"
+ "\x36\x0e\xce\xb3\xf8\xdf\x1a\x38\x36\xf5\x7e\xd8\x96\xe7\xec\x18"
+ "\xab\x77\x9d\xd6\x95\x63\x6a\x88\x6b\x74\xe3\x2a\x89\x7c\x3c\x81"
+ "\x23\xdc\x3a\x7d\xbc\x82\xa5\x45\x9c\x64\xe7\x11\x2d\xec\x7b\x92"
+ "\x3f\x1c\x30\x4e\x93\xa1\xfc\xc9\xd1\x2c\x6d\xf2\x1c\xf8\xae\x80"
+ "\xa3\xda\xba\xfe\xa9\x90\x7f\x6a\x24\xe2\xd9\x05\xf3\x01\x62\xa9"
+ "\x93\x87\x19\x11\xa3\x1c\xc6\x5b\x12\x7c\x86\x02\xd2\x0c\xc0\x5b"
+ "\xc5\x22\xff\x3c\x78\xde\x9a\x7f\x1e\x3c\x61\xc3\x3f\xb9\xa8\x8f"
+ "\x20\x5f\x64\x19\xe3\x97\x7d\x97\xd6\xc7\xc1\xf9\x83\x27\xa1\x9c"
+ "\x7d\xca\xe7\xb0\x8c\xb1\xdc\xfa\x2b\xe7\x1c\xac\x85\x55\x44\x8e"
+ "\xfa\xa5\x55\x3e\xf6\x3e\xe4\x59\xac\x9b\xaf\x97\xb5\x05\xda\x07"
+ "\x69\xe5\xd8\xbe\x65\x50\x2e\x9c\x57\x00\x5d\x79\x23\xb9\x28\xb4"
+ "\x8d\xcb\xb3\x25\x01\xf8\x91\x6f\x2f\x96\x89\xf9\xa8\xd8\x2f\x03"
+ "\xe6\xe1\xeb\xfe\x16\xd2\x71\x8d\x4d\xd2\x7e\x22\xb2\x46\xa3\x8e"
+ "\x20\x4f\xe2\x77\xa3\x31\x14\x64\x29\x8a\x98\x71\x2e\x0c\x24\xa1"
+ "\x20\x6f\x03\x4e\xcb\xc7\xd6\x8e\x4c\x21\xa1\x58\x1e\xea\x70\x9d"
+ "\x7c\x6c\x66\x19\xca\x22\x2b\xeb\x0b\xec\x07\x96\x7f\x04\x56\x35"
+ "\xf8\x5d\x8a\xed\x81\xeb\x16\xf5\xe6\xe3\xda\x39\x67\x1d\xeb\x2b"
+ "\xd4\x55\x01\xf9\xab\xb1\xef\x38\x9e\x70\xbd\xe6\xac\x3c\x5c\x89"
+ "\xd7\x70\xcf\x16\xbe\x3f\x15\xf8\xbe\x07\x8e\x07\xd2\xe3\xfe\x97"
+ "\x5c\x9c\x5a\x79\xd8\x54\x6e\xdc\x20\x3f\xe2\x41\xa1\x0e\x2c\x23"
+ "\xcd\x48\x8d\x14\xf4\xd1\x6b\xeb\x0c\x60\x83\x8c\xdb\x6e\x8d\x4f"
+ "\xb8\xc6\x12\x1f\xc8\x57\x0d\xf9\x6b\x71\x5e\x46\x7d\x02\x75\xfa"
+ "\xa1\xcd\x01\x69\xb9\xe6\x3c\x28\x63\xb5\x81\xf3\x2d\x41\x39\x2f"
+ "\x42\x5b\x72\xb1\x1c\x68\x4f\x2d\x5f\x56\x2d\xc6\xb0\xb4\xc4\x9a"
+ "\x2f\xaf\x02\x31\xe7\xe4\x79\x1d\xd7\x27\xd0\x5d\xe3\x9e\x29\x65"
+ "\xd7\x6a\x80\xa6\x86\x76\x45\x11\xba\x3e\x86\xed\xd3\xc6\xae\xed"
+ "\x49\xeb\xe0\xf0\xad\x65\x7a\x6d\xdc\xda\x95\x1b\x68\x8b\xd8\xee"
+ "\x71\xa1\x42\xac\x76\xbe\xdd\x7b\xb0\x3e\xba\x66\x0e\x37\x8f\x62"
+ "\x1d\x98\x9f\x2f\xcf\x17\xcb\x13\xc6\x6a\x24\xb4\x83\x8d\x57\x78"
+ "\x04\xa4\x57\x20\x2f\x72\xe3\x06\x7a\xf4\x52\x1a\xf2\xe2\xb8\x30"
+ "\xc8\xbf\x2f\x1b\xcf\xd7\xe0\x79\x78\x1d\xa7\x63\xbb\xaf\x87\xa7"
+ "\xe0\x75\xf4\x4d\xe4\x2c\x06\x5e\x32\x13\xf2\x2b\x7f\x12\xda\x96"
+ "\xc1\xf5\xad\xaa\x6d\x7d\xa4\xe4\xa0\x91\x10\x6c\x27\x8c\x51\x0d"
+ "\xb4\xf5\x24\xe8\x7e\x6e\x6f\x2e\xd0\xd7\x7b\xe8\x6b\x31\x04\xdb"
+ "\x0c\xfa\x8c\x6f\xdf\x43\x33\x79\xec\xf7\x60\x1f\x71\x3c\x47\x32"
+ "\xdd\x07\xd7\x1e\xfe\x09\xdb\x2e\xf6\xfb\xa1\x60\xcb\x31\xe6\xfa"
+ "\x0d\x38\x20\x5e\x88\x8b\x58\xe6\x38\xe4\xfd\x5c\x28\x8b\xed\x99"
+ "\xc8\xf3\x06\x8e\x75\xee\x30\x5a\x8f\xf4\x22\xed\xc3\xdc\xfe\xd8"
+ "\xa9\x50\xf7\xa8\x24\x6e\x6f\x38\x09\xc6\xdb\x87\x72\xab\x70\x6f"
+ "\x53\x28\xa3\x06\xc7\x14\xe8\xde\x43\x7e\x84\xf3\x7a\xbe\xdd\x7b"
+ "\x60\x3e\x0f\x81\x63\xbc\x28\xff\x0f\xef\xb2\xe6\xaf\x87\x6c\xe5"
+ "\x1f\xf1\xce\x35\xa7\x45\x11\x7e\x5f\x67\xe5\x05\xf9\xc3\x93\xf8"
+ "\xb9\x83\xc7\xfa\xe1\x82\x83\x20\x2f\x62\x19\x0f\x0f\xb7\xc1\xba"
+ "\x86\xe3\xc7\x35\x33\x24\xd8\x67\xc8\x5b\xc3\xca\x79\x88\xeb\x33"
+ "\xc7\x4f\x19\x1c\x0f\xd4\xd3\x35\xd0\xcf\x6e\x3e\x78\x48\xc3\xe3"
+ "\x5c\x6f\x33\x26\x82\xee\xaa\xc5\xbd\xbf\x50\x27\x81\x0d\xfc\x48"
+ "\x7b\x97\xa8\x97\x10\x7b\x33\x87\xfd\xc3\xca\x32\x36\xdf\xf2\x7a"
+ "\xeb\x21\x76\x7d\x98\x15\x0f\x63\x9f\x7e\xc7\xf1\x2f\xb6\x25\x6d"
+ "\x0e\xb6\xa5\x86\x6b\x47\x9a\x92\xc0\x35\xae\x7e\x28\x2b\x86\x97"
+ "\x57\xa1\xac\x10\x2c\xeb\x79\xd0\x55\xd8\x26\xa8\xbb\x86\xd3\x7f"
+ "\x8f\x62\xdb\xc6\xdf\xc7\xb7\xbd\xce\x90\x81\x79\xc7\x2a\x3b\xa4"
+ "\x5c\xde\x3a\xa0\xcb\x37\xb0\xbd\x13\x06\x42\xfe\x4a\xe5\x7c\xa4"
+ "\x8f\xc8\x42\x1d\xad\x7c\x96\xfb\xbd\x4a\xf9\x14\xf0\xea\x39\x22"
+ "\x87\xf2\x7c\x90\x47\x05\xbe\x68\x95\x47\x2c\x04\x1b\x03\xf1\xaa"
+ "\x02\x1b\xa9\x12\xc7\x1b\x79\x19\x6c\xa4\xb0\xf6\xbc\xf1\xf9\x02"
+ "\xdf\x42\x3d\xc5\x38\xf6\x0c\x9f\xf1\x5f\x00\x1f\xd7\x88\xbc\x35"
+ "\xfe\x0b\x7e\x1c\x2b\x61\x1c\x7d\xa0\xbe\x67\xf8\x7e\x55\x02\x3d"
+ "\xd8\x62\x11\xd3\xf9\xb6\x17\xf1\xf4\x97\x05\x1c\x78\x59\xad\xcf"
+ "\x46\xfd\xcb\x61\x30\x21\x8b\xcf\x5b\xc1\xea\x9a\xb0\x55\xa0\x45"
+ "\x1b\x91\xdb\x07\x0d\xd2\x50\x0f\x8e\x02\xec\x39\xdd\x87\xfb\xfe"
+ "\xf2\x69\x28\x3b\xac\x8e\x08\x6e\x7f\xec\xe7\xc1\xee\x11\xf9\x68"
+ "\x42\x9c\x8d\x7e\x42\x5d\x9c\xdb\xb0\x89\xed\x33\x81\xbc\x84\x3a"
+ "\x15\xd7\x2b\x50\xde\x78\x5e\x7e\xf8\x36\x4f\xf8\xc4\x9a\x57\x22"
+ "\xee\x02\x5e\xb9\xcf\xa2\x6c\xad\xa3\x79\xae\x8c\xe9\xc0\x62\x96"
+ "\xe7\x91\x21\x7c\xdf\xaa\x58\xdf\xf8\x73\x1c\xb7\x54\x1c\xb7\x89"
+ "\x9f\x59\x8c\x23\x8c\xdb\xc4\x49\x3c\x7d\x0d\xea\x72\x51\x5e\x1f"
+ "\xd9\x20\xc8\xb2\xbd\xbe\x98\x38\x1a\xe5\x41\x6c\xd7\x23\x31\x36"
+ "\xfa\xa2\xc6\xb1\xbe\x78\x24\x98\xef\x6f\xb9\x8d\x6c\x54\xb0\xb6"
+ "\xf3\x73\x0b\xe0\xd0\xd0\xc6\xef\xf7\x01\x69\xa8\x3f\xb1\x6e\xcb"
+ "\x39\xa8\x94\x8d\x2b\x2f\xcb\x13\x6f\xb7\xc7\xe1\x91\x56\x4b\x79"
+ "\x46\xac\x51\x27\x60\x19\x88\x29\x67\x57\x42\x1a\xc3\xf5\x91\x5a"
+ "\xd4\x0d\x96\x3a\x1a\x68\xf3\xcd\x14\xe5\xe5\x11\xbd\xb5\x2c\x3e"
+ "\x32\x87\x97\x45\xa1\xee\xfd\x80\x51\xa8\x58\xef\xc4\x38\x9b\x7a"
+ "\x11\x9b\x5a\x2e\x9e\x33\xd7\xc7\x89\xbb\x85\x39\x0d\xe9\x21\xaf"
+ "\x06\xf2\x14\xd9\xcc\x8f\xb9\xd8\x3e\xa8\x4b\xc1\xe9\xac\x42\x4e"
+ "\x57\x68\xda\xb9\xf6\x4c\x2c\x2e\xe3\xe7\x09\x48\x0b\xe5\xd3\x54"
+ "\xfc\x5c\x22\xf0\xcd\x20\x9b\x36\x19\x1c\xdb\x47\x8f\x28\x04\xfb"
+ "\x88\x2b\x8b\xd3\x45\x13\x8d\x7c\xff\x30\xed\x3e\x96\x36\xa1\x16"
+ "\xd3\xb2\xd9\x38\xe4\x53\x6e\xbe\x9a\xa0\xe2\xe7\x2b\x94\x2f\xa9"
+ "\x4e\x3e\xfe\x04\xca\x18\x9e\xeb\xe4\x11\xd1\x58\x7e\x63\x7a\x27"
+ "\xae\x21\x8a\xe0\x5a\x32\xea\x03\xd4\x17\xca\x78\xa6\x37\x94\x4f"
+ "\x70\xdf\x25\xa8\x77\xd0\x0e\xc1\xeb\x40\x17\x87\xba\x08\xd2\xdf"
+ "\xc1\xfd\x3b\xe9\x0f\x3e\x50\x6e\x44\x3e\x9f\xf7\x10\x67\x2b\xfc"
+ "\x10\x25\x13\xd2\x84\x7c\x20\xeb\xab\x30\x1f\xe6\x17\xf4\x17\xea"
+ "\x2e\x23\xea\x26\xae\xbe\x49\x03\x78\x1e\xe7\xd6\x0d\x82\x5d\xd4"
+ "\x25\xb5\xa0\xc5\x3d\x10\x38\x9d\x36\x69\x36\xd3\x67\x93\xa6\x62"
+ "\x5e\x0e\x3f\xd0\x95\xa9\x1d\xf4\xdb\xb2\x15\x44\x5e\x7a\x91\xb3"
+ "\xb1\x22\x59\x3b\x27\x95\xb3\x7e\x4c\x52\x73\xfd\x60\x3a\x35\x97"
+ "\xb5\x25\x2c\xb2\xb4\x93\xbb\xb6\x19\xfb\x82\xd7\x72\x2c\xae\xe1"
+ "\x3e\x24\x70\x6d\x27\xd7\x2e\x9b\x7c\xe6\x2e\x95\x1d\x3d\xee\xbd"
+ "\x0b\x3a\xd4\xa7\xb4\x50\xd0\xbd\x93\x95\x7c\x3b\x4f\x09\x7a\x17"
+ "\xc6\x25\x11\x75\x2f\x77\x2d\x9e\xa7\x79\x82\xff\xe6\xf4\xfb\xe4"
+ "\x41\x6c\x5c\x03\xa5\xfc\x78\x27\xb3\x7e\x4c\xbe\x8b\x5b\x67\xff"
+ "\x10\x03\x63\x3b\x59\x2e\x8c\xad\xe5\x6f\x94\x1f\xa8\x1f\xf9\x85"
+ "\xe9\x95\x14\x6e\x0d\x5b\x8c\x34\xd8\x26\x36\x47\x44\x18\x6d\x6d"
+ "\xea\xb3\xf2\xc8\xed\x38\x2f\x31\x5b\x35\x72\x2d\xef\x23\x22\xda"
+ "\x15\xaf\xc2\xbc\x30\xb9\x56\xd0\x31\xb4\x3d\x8a\x60\x1c\x74\x68"
+ "\xcb\x21\x4c\xc3\xb8\xf9\x96\x34\xa8\x9f\xde\xee\xd4\xf1\x65\x4e"
+ "\x2e\x17\xf4\x06\xea\x92\x86\xb6\xd3\xbc\x4d\x37\x25\xba\x94\xd7"
+ "\x25\x17\xe4\x53\x9e\xb4\xb6\xc3\xa6\x3c\x69\xad\x33\x22\x17\xda"
+ "\xea\x0c\xb0\x9b\x37\xb5\xe7\x4d\x09\xb2\xb2\x03\x20\xad\x67\xdd"
+ "\x31\xd9\x80\x32\x8a\xfb\x20\x71\xfa\x89\xf3\x7b\x4d\xd9\x2b\xb4"
+ "\x19\xf5\xe6\xa5\xf5\x82\xff\x22\xf2\x77\x68\xab\xd9\xd4\x97\x6f"
+ "\xa5\x3b\xb1\x3e\xa1\x3c\x39\xc1\xbd\x74\x60\x1c\xd0\xe7\x32\x25"
+ "\x8e\xd7\xf3\xe5\x56\xba\x92\x9f\xc3\x50\x4f\x5a\xcf\x55\x61\x53"
+ "\xad\xe7\xaa\xc8\x49\xf6\x3a\x32\x52\xe1\xfa\x5c\x35\xa5\x05\xf5"
+ "\x96\xa0\x23\xad\x75\x41\xa4\x7f\xa9\x95\x2d\x3b\xa5\x58\xb0\x65"
+ "\x45\x3d\x3a\x25\x04\x75\x14\xd4\x5f\xc3\xd7\x9d\xa5\x93\x8f\xc9"
+ "\x15\xea\x06\x3e\xaa\x6d\x50\x02\x6f\xe6\xdd\x6f\x80\xdf\x49\xbc"
+ "\x0d\xc8\xc9\x66\x27\xee\x27\x22\x9f\x54\x03\xfc\x37\x10\xf9\x4c"
+ "\xbb\xf4\x22\x69\x16\xe7\x8a\xda\x4b\xcb\x84\xf1\x9d\x7a\xbb\xa5"
+ "\x5d\x58\x52\x48\x33\xa1\x9e\x36\xcb\x3e\x6e\x85\xb4\x1c\xde\x87"
+ "\xc0\x8d\x2d\x57\x56\x64\x5d\x59\xa1\x75\xdf\x58\x3f\x22\x8d\xd8"
+ "\x0f\x5c\x13\x41\xfd\xfb\xd0\xee\xc1\xbd\xd0\x40\x6e\x22\xca\xba"
+ "\x79\xfe\xc1\xfc\x8e\x0c\x4b\xfb\x2a\xac\x18\x75\x25\xbf\xf6\xac"
+ "\x03\x7b\x27\xd7\xd2\x17\x33\x73\x4a\xb4\x32\x69\x85\x7a\x69\x72"
+ "\xfc\x18\xa5\x7a\xa9\x3a\x59\x3d\x2f\x51\xbd\x6e\x5e\xb2\x7a\xd9"
+ "\xd2\x90\x25\xf3\x16\xa9\x17\x28\xd7\xcc\x5b\xa9\x0c\xd5\x8c\xd0"
+ "\x0c\x24\x22\xe9\x43\xca\x79\x2b\x57\xae\x5a\xb2\x30\x4e\xb9\x54"
+ "\xbd\xe0\xbe\x15\x0b\x57\x2e\x4c\x56\xce\x5b\xb1\x6c\xd5\xd2\x38"
+ "\xe5\x88\xb8\x91\x23\x42\x1f\x8c\x1b\x68\xe9\x43\xbb\x5b\x41\x5a"
+ "\xcd\x57\x5a\x5a\x72\xae\x10\x1f\x3f\x49\xd2\x0a\x3f\x8d\x7a\x29"
+ "\xf3\xdb\x3d\xba\x70\x54\x3e\xe1\xf6\x57\xc7\xbd\x6b\x69\xde\x54"
+ "\x0d\x7c\xcb\x91\x0e\xfa\xa9\x2c\xc3\x3d\xd6\x87\xd1\xe1\xed\x79"
+ "\x8f\x06\xeb\xe4\x8f\x29\xb8\x7d\x69\x21\x1d\xfa\x36\x9c\x5e\xa9"
+ "\x6b\x01\x9b\x2d\x09\x9f\xf9\x2e\xbb\x42\xfc\x73\x57\x13\x39\x1c"
+ "\xbe\x70\x28\x70\xff\x75\xc8\x33\x47\x27\x9f\xc6\xfb\x45\x1f\x35"
+ "\xea\x87\x2c\x3a\x49\x73\x17\x9d\x64\xb8\x3c\xda\x21\xf8\xa4\x67"
+ "\x6d\x26\xb3\x90\x3f\x4f\xcb\x1f\xe5\x7c\xd9\xcf\x03\x2f\xa3\x4f"
+ "\xf6\xd2\x87\x93\x23\xc0\x1e\x3c\xa9\xbd\x8d\xbb\xd6\xd1\x26\x25"
+ "\xbe\xd0\x2e\xf9\xc1\x94\x50\xf2\x32\xd4\xb5\x32\x90\x52\xa8\x43"
+ "\x2b\xf8\xd3\xa0\x0f\x0a\xe8\xcb\x09\xbe\x1f\xaf\x71\xfd\x28\xa4"
+ "\x41\xf9\x43\xa1\x7d\x79\x5c\x7b\x5a\x85\x3e\x40\xbb\x4f\x40\x9b"
+ "\xa2\xa1\x9d\x0a\x6c\x97\x23\x5f\x1f\xfa\xbb\xce\xca\xa7\x3d\x60"
+ "\x5e\x0d\xe3\x76\x07\xdb\x4b\x29\xa7\x94\xc9\x1f\xf4\x2b\xb1\x0c"
+ "\x7e\x67\x5f\x24\xbe\x5b\x71\xdf\xee\x8c\x3b\xe9\xb1\x36\x23\x69"
+ "\x54\x9d\x20\x7e\x6b\xa9\x9e\xbe\xdf\xd2\xc2\xfa\x34\x2d\x16\x75"
+ "\xc3\xbb\x09\x27\xe4\xd8\x27\x98\x2b\x7c\xcb\x2e\x3a\xf5\x2d\xca"
+ "\x5f\x1e\x46\xdb\xe8\x0e\x4b\x9b\x6b\xda\x61\x1c\x13\xb4\xb7\x2e"
+ "\xc1\x3c\xd5\x9e\x37\xad\x1a\xea\xf6\xe1\x6d\xe3\x36\xda\x35\xc7"
+ "\xc2\x96\x9a\x86\x7c\xd6\xe6\xa4\x6c\x1f\xa1\x6c\xdc\x0f\x1c\xf3"
+ "\x30\xfc\xa3\x1e\x80\x3c\x7a\xb1\xfc\x28\x85\x6d\xf9\x58\x26\xfc"
+ "\xd6\x0b\xf5\xb0\x75\xf8\x34\xb4\x09\xf4\xc0\xcb\x7a\x27\xf5\x05"
+ "\xe5\x15\xd2\xe3\x8d\x90\x9e\xd3\x41\xe4\x40\x7b\xbc\xac\x90\x2b"
+ "\x3f\x49\x27\x9f\x7a\x1c\xcb\x7f\x7e\x18\x21\x9b\x80\xe6\x52\xde"
+ "\x34\x1f\xf4\xef\xc2\x35\x90\xf9\x30\x62\xeb\xb7\xe6\xf9\xf9\x21"
+ "\x1b\x7e\x8e\xc8\x43\x9b\x30\x1f\xca\x07\x1e\xca\xb9\x4c\x70\xce"
+ "\xa9\x1f\x99\x4f\x82\xb1\x1e\xf8\xdd\x84\xfe\x10\x28\x53\x27\xd4"
+ "\x47\x81\xff\xb3\xcd\xcc\x07\xc3\xf3\x56\x48\xa3\xa6\x05\xf7\x5a"
+ "\xa0\x07\x41\xbf\x63\x1b\x91\xc7\xda\xf3\xa6\xfb\x0b\x3c\x05\xbc"
+ "\x7e\x9c\xe3\x2b\x7f\x12\x4c\xf3\xa2\x8a\x70\x6f\x70\xe4\xab\x52"
+ "\xe0\x27\xe4\x2b\xa0\x8d\x10\x78\x0a\x78\xad\x09\xe9\xa0\x0d\x03"
+ "\xab\xd7\x45\xc8\x51\x47\x36\xcb\xa7\xbf\x87\x3c\x46\xff\xf4\xf8"
+ "\x09\xfa\x8b\xdf\x9f\x60\x38\x4d\x7f\xaf\xd1\xc0\x30\x10\xc7\x7d"
+ "\x7a\xa6\xc5\xb8\x37\x01\x1f\x0f\xc4\x71\x66\xbe\xea\xe9\xef\x41"
+ "\xdb\x9a\x38\x5b\x7c\x03\x60\xc0\xcd\x55\xd3\x93\x31\x3f\x3f\x86"
+ "\xf5\xe2\x18\x4e\x6f\x72\x34\x86\x36\x63\xc7\xed\x45\x4d\xf3\xa6"
+ "\x9f\x44\x59\x69\xcf\x7b\x4c\x2e\xec\x43\xed\x08\x4b\xa8\x43\x2e"
+ "\xcf\x27\x3e\x58\x47\xad\x3f\x47\x1f\x26\xd4\x91\x03\x63\xad\x4f"
+ "\x53\xf5\xc8\xcf\xb5\x30\x33\xa3\x4f\x1c\xf3\x07\xf9\xe3\xf8\x3e"
+ "\x96\x2c\xe6\xa7\x6d\xb6\xf9\x47\x2c\xb0\x6a\x2b\x77\xd0\xbc\xc7"
+ "\x32\x5f\xe6\xf7\xe9\x86\xfc\x7b\x7a\x6a\x6f\x90\x92\xcd\x93\xda"
+ "\xbb\x91\xbf\x1f\x3b\xdf\x58\x44\x08\xa6\xf1\xe7\x27\x2f\xc1\xdc"
+ "\x63\xeb\xdf\x77\x7e\xbf\xe1\xf1\xfb\xac\xef\x37\x3c\x3e\xdc\xd9"
+ "\xfd\x06\xeb\x7a\x1f\x57\x63\xbd\xe6\xb2\xd9\x12\xb1\xee\xc7\x67"
+ "\x9b\x1d\xd4\x2d\xe4\x1f\x59\x6e\xb9\x9e\x79\x7c\x2f\xb6\xa1\x01"
+ "\xe6\x29\xfa\xcb\xd9\x12\x0a\xe5\xd4\x72\x73\xf8\xe3\x35\xcc\x7e"
+ "\x41\xbb\xe8\xf1\x22\xa4\xb1\xed\x47\xf7\xc7\xc7\x1f\xf7\xe8\x22"
+ "\x1d\xdc\x49\xbf\x47\x89\x02\xbf\x1f\xd4\x0b\x97\xa5\x56\xc4\x84"
+ "\x3a\x38\xf1\x25\x64\x2c\x47\x4f\xe1\xc3\x92\xf8\x73\x56\x8a\xbc"
+ "\x9b\xbe\xfb\xba\x17\x9f\x01\xac\xbd\x5c\x79\x06\x22\x61\xbf\xc2"
+ "\x15\x16\x14\x91\x3d\xe4\xa6\x44\xc8\xe2\xe8\xb3\x1c\x8e\xf4\xd9"
+ "\xfd\xa0\xbc\x50\x8e\x98\x52\x23\x5f\xbe\x70\x4e\x2d\xcf\x31\xc5"
+ "\xfa\x1c\x3e\xb2\x39\x16\x15\xdc\x29\x8b\xe3\x1e\xdf\x7a\x38\xae"
+ "\x3b\x49\x5a\x6e\xd9\x56\x18\xee\xf4\x7e\xdc\x0f\x3f\xfc\x63\x80"
+ "\xf2\x82\xe1\x7a\x78\x74\x37\xc1\x2d\x6d\x1b\x2d\xc8\x8f\xb2\xe6"
+ "\x8f\x2b\xef\xa1\x8f\xee\x7e\xee\xb0\xf8\x7d\x27\xfb\x1a\x17\x7b"
+ "\x15\xcb\xef\xf9\xa3\x6c\x1a\x20\xfc\x14\xd9\x63\x5c\xb3\x23\x52"
+ "\x71\xfc\x1f\x12\x30\xa6\x96\x1c\x2a\x5e\x9f\xa0\xb5\x3e\x9f\x98"
+ "\x6b\x7d\x3e\x49\x77\x15\x5a\x4e\xb8\x4a\xd2\x74\x43\x08\x89\xa8"
+ "\xea\x4e\xf4\xb3\x11\x19\xbf\x5c\x1b\x11\x12\x3f\x7c\x6b\x64\x84"
+ "\x4c\x0e\xb3\x48\x96\x3b\xa6\xbe\x36\x9f\xdb\x36\xf2\x02\x71\xa7"
+ "\x5e\x61\x77\x71\xa2\x4d\x1a\x9e\xdf\xa4\xe4\xd3\x46\xef\xb7\xa3"
+ "\xe7\xd2\x94\x16\xe7\x92\x08\xf8\x53\x0e\xfc\xaf\xb7\xa7\xfd\xf9"
+ "\xf3\xf3\xc7\x85\x8f\x04\xe5\xe3\xe7\xcf\x35\xfa\x50\x36\x8b\x83"
+ "\x26\xe2\xbe\xf0\x1f\xed\x56\x94\x94\xbf\x40\xf9\x04\xca\xff\xb8"
+ "\x2a\xf3\xf8\xcf\x9f\x9f\x3f\x3f\x7f\x7e\xfe\xfc\xfc\xf9\xf9\xf3"
+ "\xf3\xe7\x06\xf8\x48\x2c\x17\xd6\xb8\xdf\x43\x7f\xfe\xdb\x72\xfd"
+ "\x23\xe1\x0f\xcb\x34\xa9\x37\xf9\x28\xff\x21\xe9\x11\x5a\x65\x79"
+ "\xac\x4e\x91\x1b\xdd\x14\x5a\x9d\xa4\xf7\xc9\x8c\xaa\x0b\xae\x54"
+ "\xb5\x04\x16\xc5\x9c\x08\xaf\xd1\x18\xe4\x9b\x22\x6b\x83\x2a\xe2"
+ "\x9a\xfd\xf3\x67\x1f\x0f\xdb\x93\xdc\xe6\x9b\x35\xa3\x3e\xa4\x2a"
+ "\xb1\x75\x78\xf1\x9c\x93\xe3\xf7\xa5\x18\xa5\x19\x93\x0f\xdc\xfd"
+ "\xea\xfc\xd3\x43\xf3\x7e\xfb\xe9\x98\xbf\xae\xb8\x38\x70\xcb\x63"
+ "\x47\xee\xfd\x4b\xc2\xb9\xdb\x5e\x79\xf6\xcb\x87\xfe\xbe\xae\xf3"
+ "\xa6\x17\x1e\xfd\xe7\xaf\x5f\x8f\x3f\x3b\xac\xf0\xa9\xcf\x1f\x7c"
+ "\x7f\xf5\x95\xc1\xd9\x4f\x34\x8c\x7c\x6b\xe9\x85\x3b\x4a\x9f\xfb"
+ "\xfa\x91\x0f\x53\xcd\x92\x8d\x93\xf6\xdf\xb5\x73\xde\xb7\x43\xb6"
+ "\x3d\xf9\xc9\xe8\x77\x96\xff\x34\xe0\xc5\xe9\x87\xef\x79\x43\xfd"
+ "\xfd\xad\xdb\x9f\xf9\x62\xdc\xde\xb5\x1d\xfd\x36\x4f\x3d\x34\x62"
+ "\xd7\xc2\x33\x01\x05\xbf\xfb\xec\x81\xf7\x56\x5d\x1e\xb4\x75\xe6"
+ "\xb1\xfb\x76\x2f\x39\x7f\x7b\xc9\x1f\x4e\x4d\xf8\x60\x83\x49\xf6"
+ "\xfc\x94\x83\xbf\x7a\x6d\xc1\xbf\x6f\x79\xf9\x7f\xff\x75\xff\xbb"
+ "\x2b\x2f\xdd\xfc\xd2\xe3\x47\xff\xe7\xcd\xc5\x3f\xfc\x72\xc7\xef"
+ "\xbf\x7a\xf8\x1f\xeb\xbb\xfa\xff\x71\xda\xc7\xbf\xf9\xf3\xa2\xef"
+ "\x7e\xf1\xa7\xa7\xff\x6f\xec\xdf\xd6\xb4\xfb\xe5\xcc\x6a\x1c\xf5"
+ "\xf6\xb2\x1f\xef\x2c\x9b\xfb\xcd\xc4\x8f\xd2\xa8\x37\xe3\x47\xe4"
+ "\x3b\x2e\xf5\x25\x6e\xa2\xf1\x88\xc9\xa5\xb1\x1e\x97\x23\x95\xf0"
+ "\xf8\xb3\x84\xf4\x07\x88\xc4\x87\xdc\x24\xf7\x60\xc5\xe0\x69\xbf"
+ "\x9d\x7c\x94\x96\xf9\x5d\xf9\xa0\xff\x68\x34\x1c\xf7\xc3\xf1\x4b"
+ "\x2e\x45\xf4\x02\xdc\xed\x62\x19\xd7\xfe\x23\x81\xbe\xcb\xa0\x65"
+ "\xfd\xc8\x4d\x30\x5a\x3e\x64\x00\x19\x48\x6e\x26\xbe\x64\x10\x19"
+ "\x4c\xfc\x88\x82\x0c\x21\x43\xc9\x2d\xc4\x9f\x04\x90\x61\xe4\x17"
+ "\x24\x90\xdc\x4a\x6e\x83\xde\x0c\x27\xb7\x93\x3b\xc8\x9d\x30\x28"
+ "\x77\x39\xee\x4b\x3a\x89\x08\x84\x3f\xf0\x3f\x9a\x44\x70\xe7\xb1"
+ "\x3f\xa7\xf7\x69\xba\x96\x4f\x6f\xe2\xd3\x75\x3f\xa7\xf7\x69\xba"
+ "\xf2\x3f\xfc\x7d\xd7\x7f\xf4\x5b\x02\xa6\x03\xb3\x1e\xac\x6c\x88"
+ "\xee\x8f\x6d\xaa\x84\xff\x74\x9f\x93\x5e\xf2\xdb\x95\x67\x9d\xdf"
+ "\xf6\x13\x01\x07\xef\x90\x4d\x23\x84\xdd\x6f\xa0\x96\x1f\x63\xa1"
+ "\xe4\x80\x7c\x48\x3a\xde\x3a\xf1\x21\xfe\xdc\xdf\xde\x3f\xda\x64"
+ "\x38\xd2\xe1\xc8\x82\x23\x07\x8e\x1d\x70\xec\x12\xca\x26\x92\x3b"
+ "\x23\x89\x44\x99\x02\xdf\x3a\x22\xb9\x2b\x10\x8e\x2a\x22\x09\x0a"
+ "\x21\x92\xbb\x5b\x89\x64\x44\xa2\xd8\xf8\x91\x99\xdd\xad\x94\x84"
+ "\xf0\xe9\x4a\xf8\x3d\xda\xd2\x57\xeb\xee\x7c\xa6\x9d\x3a\x3b\x4a"
+ "\x39\x7a\x64\xd8\xc8\x07\xee\x9f\xa7\xbc\xef\x3e\xe5\x98\xd0\xd1"
+ "\xa3\x47\x85\x3e\x38\x6a\xf4\x58\xe5\x98\x31\x0f\x8d\x0e\x7d\x28"
+ "\x34\x54\xb9\x64\xed\x0a\xf5\xe8\xd0\x45\x0b\x95\x4b\xe3\xd4\x2b"
+ "\x95\xf1\xea\x15\x4b\xd6\xcc\x5b\xb1\xd0\x85\x9e\xbb\xf5\x81\xae"
+ "\x90\xdb\x4d\xac\x99\x96\x08\x49\xc8\x44\x22\x9f\xed\x43\xe4\x8b"
+ "\x74\xc4\x1e\xd2\x60\xfe\xb0\xfb\x2c\x79\xf6\xa9\x2f\x47\xfc\x7e"
+ "\xf0\x81\x49\x8b\x46\x4c\x98\xf2\x5a\x4e\x35\x91\x2e\xae\x27\xd2"
+ "\x05\x59\x44\xfa\x4c\x3a\x91\xce\x34\x10\x69\x44\x1b\x91\xee\xaa"
+ "\x22\xd2\x92\x68\x22\x7d\x39\x98\x48\xff\xb8\x89\x48\xd7\xc5\xd9"
+ "\xa7\xed\x99\xc3\xd2\xce\x66\x12\xe9\xc9\xf1\x44\xda\xa4\x21\xd2"
+ "\x83\xfe\x2c\xcd\x08\x69\x17\x83\xae\xf6\x50\x5c\x85\x8f\xbb\x7c"
+ "\x20\xf9\x7f\xee\x2b\xa9\x0f"
;
diff --git a/sys/dev/mxge/rss_ethp_z8e.h b/sys/dev/mxge/rss_ethp_z8e.h
index 6b0ecc7..34b0e9e4 100644
--- a/sys/dev/mxge/rss_ethp_z8e.h
+++ b/sys/dev/mxge/rss_ethp_z8e.h
@@ -1,6 +1,6 @@
/*******************************************************************************
-Copyright (c) 2006-2010, Myricom Inc.
+Copyright (c) 2006-2011, Myricom Inc.
All rights reserved.
Redistribution and use in source and binary forms, with or without
@@ -28,9744 +28,9944 @@ POSSIBILITY OF SUCH DAMAGE.
$FreeBSD$
***************************************************************************/
-static unsigned int rss_ethp_z8e_uncompressed_length = 563868 ;
-static unsigned int rss_ethp_z8e_length = 155786 ;
-static unsigned char rss_ethp_z8e[155786 + 1] =
- "\x78\x9c\xec\xbd\x7f\x78\x54\xd5\xb5\x37\xbe\x32\x19\x64\xc0\xc0"
- "\x4c\x62\xc4\x11\x51\x07\x08\x35\x58\x7e\x24\x88\x12\x11\x34\x0a"
- "\xd8\x58\xf9\x91\x2a\xda\xa8\x68\x40\x03\x0e\x1a\x20\x92\x00\x03"
- "\x86\x4c\x18\xd0\xc6\xca\x8f\x49\x88\x1a\x20\x90\x68\xb1\x97\x5e"
- "\xa2\xd2\x8a\xb7\xd8\xa2\xa6\x25\xfd\x3e\xdc\x7b\x49\x86\xf6\x8b"
- "\xef\x9b\xf6\x4b\x6f\x47\x6e\xa4\x91\x37\xc0\x48\x06\x32\x26\x33"
- "\xb3\xdf\xcf\xda\xfb\x9c\x64\x66\x98\xa0\xdc\x7b\x9f\xe7\xfb\x4f"
- "\xf3\x3c\x93\x73\xce\x3e\x7b\xaf\xbd\xf6\xda\x6b\xad\xbd\xf6\xde"
- "\x6b\xaf\x43\x74\xf5\x7f\x5e\x32\xf1\x25\x81\x8c\x59\x19\xbf\xfb"
- "\x2f\x94\xff\xc7\xdf\x3f\xfe\xfe\xf1\xf7\x8f\xbf\x7f\xfc\xfd\xe3"
- "\xef\x1f\x7f\xff\xff\xfe\xf9\x12\x68\xf2\x05\x83\x91\x7e\xef\x26"
- "\xea\x72\x99\x46\x78\xa9\xbb\xe8\xad\xed\x22\x88\x57\x09\x18\xe7"
- "\x47\xf0\x95\x7f\x55\x48\x33\xb8\xc9\x34\xca\x42\x49\x33\x76\x13"
- "\x55\x0f\x13\x1d\xdb\xdf\x14\xbe\x8d\x6f\x8a\x8e\x99\xef\x12\x35"
- "\xa5\x11\x6d\x1f\x26\xfc\x80\xb1\xc0\x4b\xcf\xcc\x67\x18\x1b\xf1"
- "\xcc\xef\x37\x0d\x13\x3e\xa4\x97\x20\xfd\x18\xa7\x6f\x18\x06\x58"
- "\xa9\x44\xae\x37\x45\x20\x02\xae\x89\xcb\x33\xcc\x99\x23\x25\x2e"
- "\x7b\x63\xe0\x30\x8c\x43\x5e\xca\x9f\x79\x05\x18\x49\x3a\x5e\x7e"
- "\x03\x25\x30\xbc\x4e\x17\x59\xfd\xae\xc6\xeb\x51\xd6\x8f\xf6\xa4"
- "\x73\xd9\x6d\xc8\x23\x5c\x94\xd8\xe4\x08\x92\x6d\x14\x25\x9c\xa6"
- "\xc1\x6f\xe3\x6a\xc0\xf5\x0d\x6e\xeb\x46\x55\x2e\x8d\x61\xa0\x6c"
- "\x42\x97\x6b\x50\x46\x6f\x59\xc0\xb6\x95\x91\x11\x79\x97\xfa\x0d"
- "\x8d\x06\x95\xd7\x32\x48\xcb\x6b\x40\xde\x05\x7a\x5e\xf5\xce\xf0"
- "\x90\xf6\xee\x5a\xbc\x73\x44\xbf\x33\x56\x69\xef\x92\xf0\xae\x3a"
- "\x06\x3f\xa3\xa7\x3b\x48\xa7\x69\x50\x03\x70\xb1\x1d\x41\x8f\x70"
- "\x19\x2d\x7f\x32\xf2\x37\x45\xc3\x22\xd2\xde\xa5\xe0\x9d\x37\xfa"
- "\xdd\xa7\x19\xda\xbb\x1b\xf0\x2e\x18\xfd\x2e\x41\x2f\x67\xed\x72"
- "\x0d\xb6\xc6\x69\x27\xd7\x9f\xa0\xea\xe6\x36\x0c\x9e\x86\x3c\xe5"
- "\x9c\x67\xbe\xad\x9c\xb8\xaf\xf8\xdd\x91\xfa\xde\xfa\x39\xcf\x42"
- "\x1d\x8e\x17\xe5\x23\x68\x0a\x5a\x0e\x2e\xd5\xcb\xcf\xb4\x31\x0c"
- "\x92\x34\x64\x38\x5e\x1a\x94\xc3\x70\xf8\x19\xf7\x23\xb8\xdd\xda"
- "\xbd\x8d\xdb\x17\xd9\xe7\x44\x46\x80\x1d\x00\x43\xf4\x1a\xfc\x06"
- "\x9a\x74\x1e\x28\xb6\x8a\xb0\xf3\x46\x32\x8a\x2a\x9b\x37\xec\x12"
- "\xe4\x71\x04\xc8\x36\x9c\x9c\xa7\xe8\x5a\x2b\xf0\xa3\xad\xeb\xc8"
- "\xe4\x2c\x12\x01\x8f\xa3\x83\x5a\x7c\x1d\xe4\xf4\x89\x76\x4f\xf0"
- "\x22\x95\x5d\x24\x93\x27\x78\x96\xca\x5e\x22\x6b\x53\xe9\x97\x14"
- "\x8f\xbf\xc2\x06\x41\xce\x11\x5c\xb6\x8d\x5a\x6a\xdb\xc8\x59\x1b"
- "\x5d\xd6\x79\x33\x59\x9b\xf1\x8c\xbe\x33\x33\x1e\x4d\xb6\x20\x05"
- "\x53\x6c\xde\xd2\x1d\x64\x74\x8e\x24\x43\x73\x41\xa3\x8e\x8b\x97"
- "\x71\xd9\x74\x86\x4c\x3f\x5b\x02\x1e\x3a\xc3\xf8\xa6\x7b\x3f\x58"
- "\x17\x30\x1c\xb1\xce\xa6\x23\xd6\x93\xd4\x64\x9d\x4e\x4d\x8e\x99"
- "\xb4\xf5\x0c\x25\x1d\x09\x4c\xa3\x26\xe3\x83\x90\xb1\x99\xe4\xe9"
- "\xc0\xbd\x2d\x84\x3c\x7e\xb2\xad\x26\xf0\xc7\xb5\xc7\xab\x5f\x20"
- "\x93\x57\xc1\x04\x7d\xaf\x3d\xf9\xbb\x12\x22\xa6\x2f\x3f\xc7\x6b"
- "\x47\xf1\x8d\x64\x05\x7e\xed\xc0\xe5\xee\x53\x94\x74\x7d\x9a\x95"
- "\x32\x80\xf3\x40\x4f\x4d\x90\x8c\xa5\x34\xa8\x1f\xd9\x4a\x0d\xbb"
- "\xa4\x8c\x77\xec\x79\x53\xb4\x33\x8f\x76\xbe\x9c\x07\x39\x4d\x9a"
- "\x8d\xba\x3b\xb8\xbe\xad\x90\x75\xe7\xdb\x64\xec\x5c\x93\x97\x50"
- "\xf7\xa6\x68\xc3\x3b\xbb\xfe\x0e\xfc\xd4\x86\xf7\xed\x13\x53\xc9"
- "\xe2\x09\x66\xd3\x67\xdd\xed\x46\x86\x31\xd4\x4f\x09\x0c\xcf\xec"
- "\xa0\x44\xb4\x67\x00\xf0\xb9\xbb\x0e\xe9\xa3\x91\x0f\xe5\xf7\x79"
- "\xa9\xca\xca\xe5\xc5\x0d\x4f\xf9\xc3\x37\x3c\x75\x31\xfc\xd6\x53"
- "\x9d\xe2\xad\xa7\x2e\x84\xde\x7a\xea\x6b\xe7\x5a\x32\x85\x6e\x78"
- "\xca\xd7\x52\x24\xfb\xc0\xd2\x52\x84\x3e\x08\x91\x69\xfd\x59\xb2"
- "\x3c\xf3\x12\xfa\x3e\xf8\x57\x5a\xbf\x94\xac\xe1\xe4\xdb\x6a\x3c"
- "\xc1\xcf\xe9\x99\x52\x12\xb8\xdf\x17\xaf\x7d\x9d\x29\x63\x6d\x4a"
- "\x86\x4c\x68\xd3\x10\x9b\xd7\x78\x6b\x2b\xd7\xeb\x4b\xce\xb4\xe1"
- "\x97\x86\x5f\x3a\x7e\xe3\x44\xca\xd8\x71\xa0\x95\x73\xe8\x86\x04"
- "\xda\xd3\x4d\x34\x31\x4c\x09\x67\x68\xc8\x34\xe0\x6f\xe9\x87\x6e"
- "\x23\xc2\x55\x85\xde\xdb\xca\xa9\xac\xab\xcb\x4e\xac\x9b\x58\x2f"
- "\xb1\x9e\x42\x3d\x15\x5e\xa3\x4d\xb6\x0f\xfa\xcd\x2f\x52\x0a\xbd"
- "\x48\x6f\xf7\xbf\x6c\x4f\xf0\xbd\x6c\x37\x74\xa6\x14\xfe\x27\xf2"
- "\x34\x20\x4f\xae\x46\xc3\x76\x86\x05\x99\xf0\x0d\x09\x52\x22\x60"
- "\x16\xfd\xfa\x52\xab\x71\xf7\x9b\xe2\x24\xf2\x9d\xe8\x85\x05\xd8"
- "\x80\x03\xfa\x0f\x69\xd7\xd3\x40\xeb\xb6\x2d\xc8\xc7\xe5\x3d\x81"
- "\x6c\xd6\xdf\x5e\x4f\x61\x3b\x99\x83\x34\x58\xf4\xa8\xfa\x90\xa7"
- "\x9d\xf5\xec\x90\x00\x5d\xd3\xe5\xa2\x5c\x86\xcd\xe5\x3c\x1d\xed"
- "\x84\x72\xff\x29\x9c\x76\xe8\x37\x9a\xdb\x25\xec\x09\xd0\xe9\x6d"
- "\x47\x50\x5e\xd5\x3d\x34\x57\xc7\x91\xeb\xe0\xbe\x96\x78\x82\x1f"
- "\x8e\x14\x06\x68\x48\x0d\x25\xa2\xdc\xa3\x0c\x8f\x61\x81\x0f\xbc"
- "\x68\xeb\x7f\x1e\x29\xf4\x51\x58\x44\xc1\xf4\x6a\xf0\xea\xa3\xe0"
- "\x21\x5d\x00\x1e\xf3\x5f\x13\xca\x0c\xa9\x97\xf0\x1e\xf9\x75\x98"
- "\xe1\x05\xc8\x68\x93\xf8\x3e\xce\x30\xba\x58\xc7\x00\x66\xe3\xea"
- "\x07\xa8\x83\xcc\x26\x9f\xd3\x9e\xd8\x52\x4a\xc4\xe5\x3f\x28\x6b"
- "\x1f\x20\x3a\xf3\x12\x99\xe7\xf8\xbd\x27\x78\x01\x79\x86\x7e\x25"
- "\x3a\xed\x89\x43\x3a\xc8\xc8\x38\xa3\xbc\x83\xf1\x8c\xec\xcb\x47"
- "\x66\x3d\x3e\x9d\x1e\x9f\xf9\xd0\xcc\xe9\x34\xe7\xfe\x19\xd3\x29"
- "\xe3\xee\xf1\x19\x77\x4c\xc9\xba\x83\x72\x7f\xfc\xc8\x74\xca\x9d"
- "\x3b\x9d\x1e\xc5\x2f\xf7\xd1\x59\x8f\xcc\x9c\xf5\xe8\x74\xca\x7b"
- "\xf0\x21\x3c\xcd\x98\x9e\x99\xf1\x83\xf1\xb9\x33\x1e\x9a\x45\x3f"
- "\x9a\x3f\x29\x63\xd2\x24\xba\x7f\xd6\xec\xcc\x8c\x0c\xed\x9a\x99"
- "\xc1\x59\x9e\xcc\x9a\xf5\xe8\xf8\xdc\x95\x2b\x4a\x56\x8c\x9f\xfb"
- "\xd0\x0c\x4e\xe1\x31\x39\x82\x77\xd2\x43\x97\xc2\x4c\x63\xbf\x38"
- "\x9f\x43\x61\xe8\x8c\x3d\xe8\x7b\xfc\x3a\x1a\xcb\x4e\x41\xf6\x2d"
- "\x9f\xef\xe1\x3e\x93\xba\xd5\xcc\xe3\x95\xb1\xcb\x65\x3e\x09\xda"
- "\xb9\x99\x76\x18\xd3\x90\x67\xd8\x5a\xbc\x1b\xab\x8d\x1d\x03\xf0"
- "\x3e\x18\xfd\x3e\x05\x7a\xd6\x3c\xb1\xc5\x46\xe4\xc1\x0f\xf4\xf6"
- "\x43\x07\x82\xae\x3e\xea\x74\xe6\x0d\x00\x5f\x27\xa0\x8e\x36\xc8"
- "\xe4\xf1\x2e\x97\x25\x2b\x42\xd6\xdb\xd0\x2f\xc7\x6d\xeb\x28\xf1"
- "\x1c\x59\x92\x5b\x4a\xb2\x89\xfb\xc7\x53\xa2\xc1\xb8\xd8\x0b\x63"
- "\xb0\x84\x81\x3e\x07\x9c\x13\x1a\x9c\xf2\x08\xbd\xe0\x65\x38\x5b"
- "\xf1\x4e\x83\xf5\x58\x0b\xf4\x03\xf4\xf7\x99\xb0\x33\x9d\x44\x8a"
- "\xad\x3d\xdc\x93\x2e\xc7\x04\x94\x3b\xa4\xf3\x33\xea\xf7\x37\xa1"
- "\x4e\xf1\xb3\x9c\x04\xf4\x7f\x02\xc6\x2a\xb4\xc5\xdc\x04\xbe\x86"
- "\x1c\x65\x66\x88\x9e\x3c\x52\x69\xc9\xc6\x50\x15\x9e\xab\x32\x33"
- "\x85\x13\x69\xeb\x64\xda\x00\x3c\x67\xa0\xaf\x13\xc1\x2b\x14\x3a"
- "\x8f\xf4\xe5\x94\x88\xf4\x3f\x80\xd6\xad\x32\xff\x79\x59\x7e\x20"
- "\xd2\xde\x05\xbc\xcc\x70\x4a\xe6\x24\xf0\x0e\xa7\xc1\x4e\x48\x7e"
- "\x0d\xe5\xef\x60\x7d\xa7\x74\xf0\xb0\x1d\x3c\xc6\xa1\x1d\x3e\x05"
- "\x5f\x7b\x86\xbc\x2a\x1c\x86\xed\x38\x02\xba\x1c\xc1\xa8\xd5\x54"
- "\xca\xb6\x4d\x32\xda\x3f\x24\x4f\x8d\x8f\xc3\x6a\x38\x6f\x58\xe4"
- "\x91\xb0\xbc\xd7\x0a\xb8\x93\x1b\xd7\x75\xd0\xe9\x22\x32\x78\x29"
- "\x79\x5a\xd8\x69\xa7\x88\xb6\xa4\x33\x1e\xc0\xdb\xd8\xd5\x63\xc7"
- "\x78\x99\x3c\x4e\x96\x05\x7e\x1a\x6e\x9c\xc7\xca\xf8\xb3\x8e\x40"
- "\xbf\x4e\x46\x9f\x0f\x42\x7d\xbe\x98\x3e\x4f\x62\x7a\x00\xdf\xd6"
- "\x30\xae\x80\x93\x2a\xd6\xd8\x81\x17\x19\x98\x1e\xde\x3e\x18\x7e"
- "\xc5\x53\x29\x19\x31\x3c\xf5\x34\x60\x4f\x8f\x78\x9f\x1b\xf3\xfe"
- "\x7e\xbc\x7f\x40\x7b\x0f\x59\x4d\x29\x8a\xa9\x7f\x33\xde\x3f\xc8"
- "\x7d\x08\x59\x4c\xf4\x92\x65\xdf\x1e\xb6\x25\xfb\xf2\xd7\xc7\xe4"
- "\x3f\x8c\xfc\x3f\x04\xbe\x7e\x1e\x27\x38\x7f\x9d\xc6\xf7\xc8\x6f"
- "\x42\xfe\xe3\x31\xf5\x8f\x44\xfe\x47\x23\xf0\x8b\x69\xff\x75\x87"
- "\xf0\x3e\x8f\xf9\x14\xd7\x02\xe4\x19\xc8\xf2\xcf\xba\xe7\x48\x21"
- "\xf7\xcf\x75\xb6\x98\xfc\xd9\xc8\xf7\x22\xd3\x59\xd2\xa8\x93\x69"
- "\x64\xd9\xa7\xd9\x35\x27\x15\x0e\xd7\xcd\x8f\x29\x53\x82\x32\xc5"
- "\x4c\x5f\xc9\x67\x5d\x71\xcb\x54\xc4\x94\xd9\x27\xf9\x54\xd5\xa3"
- "\xf5\xb1\x2a\xa3\xe9\xb5\x48\x18\xdc\x36\xd8\x5a\xd7\x1d\x8b\x86"
- "\x71\xfd\x3e\xd4\xfb\xf2\x16\xa5\x33\xae\x05\x4f\x4c\x42\xda\x0e"
- "\xc0\xbc\x93\xf9\x08\x72\xe6\xf7\xf8\x02\xd0\xbb\x39\x49\x8a\x77"
- "\x53\xc7\x9b\x4b\x89\xef\xc7\xf3\x3d\xc3\x16\x3d\xb3\x35\x79\x4a"
- "\x1d\x8f\x2b\xa7\xa7\x72\x3a\xcb\xb1\xe8\x79\x38\xac\x60\xa6\xfe"
- "\x08\xf2\x6e\xc0\x73\x48\xab\xa3\x12\xcf\x09\xc0\x7f\x12\x74\x3a"
- "\x78\x36\x87\xf9\x71\x32\xd2\x5f\xd3\xde\x6f\xe0\xfc\xb8\xcf\xd4"
- "\xee\x13\xc0\x63\x93\x34\x39\x83\x4c\x5d\xbf\x56\xd6\x0d\xb9\xd2"
- "\xcb\x87\x15\xdf\xcf\xc0\xbb\xc5\xb8\x3e\x84\xeb\x8f\x70\xfd\x11"
- "\xae\xe3\x9d\x17\xc9\xea\x0c\x49\xf9\xe2\xe7\x1b\x71\x7d\x04\xd7"
- "\x01\xb8\x3e\x0a\xdc\xbe\x06\xdd\x33\x7c\xe0\xe9\x18\x9e\xe9\x40"
- "\x1f\xb2\xdc\x0f\x54\x7d\x98\xea\xe5\x3a\x43\xba\x2e\x38\xdf\x97"
- "\xa6\xe9\x07\x4d\x1e\xb4\xb4\x9e\x1c\xa6\x4b\x2e\xe0\x1f\xe6\xfa"
- "\x85\x82\x35\x40\xf5\x93\xca\x13\x56\xe5\x8c\xaa\xbf\xb5\x34\x95"
- "\x2f\x21\xb2\x4e\x5c\xdd\x65\x7e\x21\x70\x2d\x65\xba\x7a\xe9\xfa"
- "\x72\xd0\xc4\x88\xe7\x5c\xa6\x93\xcc\x2f\xe1\x5e\xd7\x11\xd1\xdf"
- "\xb0\xed\xaf\x3f\x1c\xd3\xdf\x2c\xe7\x5b\x64\x7f\x83\x76\x3a\xce"
- "\x8c\x3f\x78\x9a\xc7\xc9\x6b\x74\xbe\x01\x7f\x77\xf4\xc9\xd8\x30"
- "\x63\x34\x1c\xc5\x57\xcc\x1f\x43\x8b\x34\x99\x04\xbd\xa0\xc3\xfc"
- "\x89\xa5\xcc\xab\xc3\x26\x7b\x69\x7f\x8e\xb4\xc5\xaa\x32\xef\xe2"
- "\xf7\x7e\xe8\x26\xce\x9f\x58\xc4\x32\x36\x6c\xbe\xfe\x5e\xbe\x4b"
- "\x5e\xb6\x90\x71\x4a\x2c\x94\xef\x8a\xbc\x60\x31\xfd\x9d\xac\x87"
- "\xdf\x95\xc8\x77\x9b\xfb\xe0\x8e\x34\x69\x70\x13\xe3\xd9\x52\xc2"
- "\x6d\x0b\x80\x41\x0d\xb7\x97\xd3\x00\x4f\xf0\x04\xcd\x0b\x8a\xd0"
- "\xf8\x72\x1a\xe4\x09\x36\xd0\x58\xa2\x64\x4f\xf0\x24\xdd\x4e\x34"
- "\xd2\x13\xac\xc6\xd8\xbe\x97\xdf\x7f\x76\x1b\x25\x24\xe0\xea\xfc"
- "\x5e\xb9\x21\xc1\x13\x2c\xa1\xb4\x72\x23\xae\x85\xf4\xe0\x00\xd1"
- "\xe5\x09\xce\x46\xbe\x02\x9a\x17\x12\xe7\x67\x0e\x10\x7f\xcb\x0f"
- "\x91\x65\xf6\x2b\xc2\xe9\x09\xc2\xce\x0e\x1e\x43\x7a\x58\xcc\x0b"
- "\x7d\x83\x5f\x97\x08\xbb\x47\x9a\xe6\x85\xce\x8b\x19\xaf\x7c\x86"
- "\xe7\xbf\x09\x61\x20\xe1\x09\x4e\xa3\x16\xbf\x1f\xf9\x9c\x42\x54"
- "\xda\x02\xcf\x5c\x34\x50\x0f\xc6\xe8\x70\xe5\x48\x13\xda\x62\xed"
- "\x41\x3b\x44\xca\xc8\x1b\x7a\x5e\xc6\xb5\x6a\xe4\x30\xf9\xec\x1e"
- "\x99\x2e\x2c\x23\xad\x13\x30\x69\xe1\x36\x78\x82\x6d\x94\x0f\xb3"
- "\x7b\xde\x5a\x9f\x60\xfc\x87\x6e\xe0\x39\xcb\x34\x82\x5e\x34\xcf"
- "\x5b\xeb\x14\x78\x67\x12\xc9\x23\xad\x9e\x60\x07\x89\x4a\x94\x4d"
- "\x19\x39\x46\xc2\x73\x8f\xcc\x41\x5e\x1f\xe7\x8b\x84\xc3\x30\x38"
- "\xef\xbc\x10\x99\x91\x3f\xa7\x27\x79\x64\x16\x7e\x79\xf8\x55\xa0"
- "\xec\x4e\xe1\x4a\xfd\x9d\xc0\x78\x8a\xf2\xfb\xf0\x7c\x28\x80\x39"
- "\x82\xa4\x65\x88\x06\x22\xff\x3e\xf0\xcb\x4c\xf0\x1d\xe3\xdb\x2a"
- "\xf1\xad\x1a\xf9\xbf\x03\xaa\x1d\xff\x4b\x6b\xc7\xe7\x9c\xde\x09"
- "\x5b\x02\xf7\x81\x4e\xf5\xae\x0b\xe5\xe6\xcb\x72\xee\x91\x01\x61"
- "\x19\x65\x0a\x40\x9e\x40\xd7\x72\xa6\x23\xe8\x5a\xce\xb4\x04\x7c"
- "\xcc\x9d\x36\x93\x48\x1e\x65\xea\x49\x1e\x65\x15\x55\xa3\x6e\xef"
- "\x91\x63\xfc\xa8\xac\x80\x84\x3d\x6a\x0a\xe0\x2c\x00\xbf\x26\x02"
- "\x46\x96\x70\x8f\xca\xe9\x71\xd9\x68\xde\x5a\x11\x98\x17\xdc\x10"
- "\xcc\x5f\x4b\x89\xe3\xa8\x1c\xf8\x7e\x02\x1a\x15\xa0\x9d\x4d\xb8"
- "\xce\xc4\x7b\xba\x0e\x75\x7d\x06\xb8\x59\x5c\x9f\xa8\x1c\x95\x03"
- "\x98\xb3\x00\xab\x80\x71\xfa\xc6\x45\x16\x3c\xe7\x7d\x23\xf1\x1b"
- "\xe5\x08\xbb\x47\xd5\x84\x2d\xa3\x2a\x74\x1e\x62\xfe\x51\x74\xab"
- "\xa6\xb9\x7e\x11\xf4\x04\x77\x13\x78\xcc\xd2\xe2\x3f\xc9\xef\x31"
- "\xaf\x68\x40\x3f\x33\x4f\x95\xe0\xba\x97\x98\x7f\x5a\x8a\x5e\xe1"
- "\xbc\x9f\x31\x0f\xcd\x2d\xf2\x6f\x18\x4f\x45\x09\x78\x76\xe6\x07"
- "\x4d\xf4\x4c\x91\xb1\x3c\xe4\x1e\x65\x6f\x29\xe2\x7e\x39\x81\x32"
- "\x5c\xae\x90\xcc\x09\xb0\xad\x13\x44\xd0\xec\xf0\x19\x87\xd8\x9d"
- "\xa2\xc5\x3f\x1b\x79\x8b\x88\xdb\xc3\x7c\xc4\xf9\xe7\x74\x08\x6f"
- "\xc8\x32\xda\xca\x6d\x13\x43\xcb\xa9\xb9\xe3\x4e\xe2\xf9\x4d\x73"
- "\xc7\x5e\xe6\xd3\x30\xe8\xd2\x0e\x1e\xed\x99\xd3\x51\x3e\xe0\x99"
- "\x8b\x94\x80\xb4\x50\xb3\xbd\x01\xef\x9b\x90\xef\x98\xe4\xdb\xb9"
- "\x17\x83\xe6\xa0\x65\x54\x5e\xd0\x3d\x2a\x30\xf7\x62\x8f\x68\xb6"
- "\x57\xd3\xd3\x1d\xe5\xa0\x55\x03\xcd\x39\x1b\x4c\x6c\x29\x2a\x40"
- "\x9e\x2e\xa4\xef\x95\xfc\x3f\xe7\x6c\xa7\x98\xfb\x92\x38\x3f\xf7"
- "\xe2\xdf\xc4\x1c\xbb\xf8\x2c\xdf\x41\x43\xaf\xdd\x20\xc2\x2c\x17"
- "\xc7\xda\x1a\xe8\xda\x93\x5e\x62\x99\x98\xbd\x28\x2c\xe6\x9c\x3d"
- "\x2f\x9e\x79\x89\x69\x33\x8d\x9a\xed\x90\x1f\x47\x35\xd3\xdb\xd1"
- "\x6c\x3f\x8c\xfa\x67\x02\xae\x53\x78\x1c\xbb\x91\xb7\xd1\xfc\xf4"
- "\x59\x0b\x1d\x6b\xab\xa6\x60\xf2\xa8\xbc\x50\xe5\x28\x7b\x38\x79"
- "\x54\x45\xb8\x72\x54\x0d\xfa\xa9\x3d\x58\x39\x2a\x10\x4a\x1e\x0d"
- "\x1e\x18\x6d\x47\x3f\x0d\xe2\x3e\xef\xc6\x7c\x1f\xcf\x4b\xba\xb9"
- "\xff\xdd\xa3\x1d\xc2\x32\xba\x06\xba\x50\x28\xde\x1f\xed\xe0\x39"
- "\xbb\x48\x1e\x5d\xd3\x93\x3c\xba\x02\xf9\x6a\x94\x7c\x8d\xde\xc7"
- "\x7c\x29\xc7\xa2\xaa\xd1\xff\x84\xb1\x23\x11\xef\x0f\xe1\x77\x14"
- "\x3f\xd8\x53\x69\xe9\x80\x9f\x2c\x79\xca\x9d\x96\x2e\xee\x75\xc3"
- "\x46\xc5\x1c\x3d\x39\x2d\x67\x5e\xe8\x3e\x01\x1a\x42\x4e\xd2\xd2"
- "\xc3\x95\x69\x59\x22\x25\xcd\x1e\x90\xbc\x9f\xf6\x3c\xc3\xee\x79"
- "\x39\x9d\xe7\xf2\x46\xbc\x77\x20\xed\x4c\x80\x79\xd5\x92\xd6\x1e"
- "\xb6\x8c\xc9\x01\xac\xc0\xc3\xaf\x08\x5f\xc8\x3d\xc6\x1a\x76\x8f"
- "\x31\x05\xaf\x81\xed\xeb\x38\x4c\xac\x9f\x82\x9f\x0a\xd0\xe0\x0f"
- "\xa0\xc7\x5e\xd9\xff\x1e\x07\x64\x60\xed\xf0\xf2\xe6\x0e\xf0\x42"
- "\xd1\x7b\x52\x37\xb5\xf8\x4f\x48\x9a\x02\x8f\x76\xe6\x29\xee\xdf"
- "\x67\x8a\xa8\x1c\x75\x05\xc2\x95\x63\x4c\xa1\x4a\xc0\x4d\x46\x3d"
- "\x29\xb7\xfd\x34\x20\xe5\xf5\x36\xf0\xeb\x61\x94\xf9\x03\x29\x1e"
- "\xbf\xad\xa2\x3f\x1d\xc9\xba\x8a\xf5\xd3\xbc\x60\x80\x79\xe6\xef"
- "\xac\xd7\x94\x9e\xa2\x7c\x5d\x4f\xb1\x8e\xe2\xf9\x04\xeb\xa9\xb0"
- "\xa6\xa7\xc2\x9a\x9e\x92\xcf\x16\xe8\x1a\xf7\x48\x2b\xeb\xa3\x79"
- "\x0e\xa5\x67\xe6\x85\x32\x04\x78\x23\x09\x72\x6c\x55\x7d\x81\x3c"
- "\x55\x23\xc7\xc8\xfc\x92\x4e\x23\x73\xc2\xd0\x37\xf8\xe5\x85\x95"
- "\xbe\xa9\xd1\xf4\x8d\x41\xd7\x37\x21\x8c\x6b\x90\xa9\x70\x3c\x7d"
- "\x13\xd6\xf4\x4d\x48\x28\x7d\xa3\xe1\xf3\x39\xa7\x87\x34\x7d\x13"
- "\x8a\xa3\x6f\x20\xcf\xdc\xde\x44\x4d\xcf\x94\xb3\x9e\xe1\xf6\x82"
- "\xd7\x4c\x61\xa5\x67\xd2\x31\x97\x30\xb0\x9e\x09\xa1\x4c\x58\xd7"
- "\x33\x5d\x52\x1f\xe4\xb0\xae\xe9\x79\x95\xa0\x3f\x6d\xc4\x3a\x46"
- "\xea\x93\xe0\xc8\x20\xeb\x13\xd0\xef\xbe\x58\x7d\x02\x78\x79\xb8"
- "\xb7\x68\x7a\xaa\xc2\xbc\x41\x04\xa1\x4f\xec\xf3\x1c\x7e\xf4\xf5"
- "\x5f\x31\xa7\x86\xde\x76\x94\x94\x7b\x1c\x41\x82\x1e\xa8\x11\x2d"
- "\xe5\x04\x1c\xc1\xbf\x21\xe8\x0a\x22\xc8\x65\x7b\x10\x32\x8e\xba"
- "\x03\x2d\x45\x9f\x53\x08\xb2\x3a\xa7\xa3\xd3\xf3\x8c\x3f\xdd\x32"
- "\xe7\xac\xf0\x81\x3e\xde\x67\x8a\xca\xa1\x5f\xd2\x7d\xcd\x1d\x9f"
- "\xd0\xec\x36\x11\x9e\xbd\xd0\x6b\x03\x1e\x81\x39\x4b\x1b\xcd\xcf"
- "\xbc\x64\x81\x9c\x89\x46\xe8\xc5\xff\x77\xce\x59\x8b\x79\x41\x1b"
- "\xdd\x32\x7b\x91\x08\x87\x20\x67\x68\xaf\x1d\xed\x76\x00\xf7\x0a"
- "\xc8\x5c\x0d\xe4\xac\x3d\x18\x23\x67\x90\x99\x25\xb8\xb7\x29\xfa"
- "\x8d\xae\x81\x9c\x39\xc2\x72\x3c\x6b\x93\x73\x38\xc8\x5a\x0d\xaf"
- "\x71\x41\xd6\x1c\xe1\x4a\x25\x6b\x61\x55\x6e\x5f\x98\xe9\x67\xd0"
- "\x64\x0d\x7d\x81\xf7\x87\xf0\x3b\x8a\x5f\x7c\x59\x2b\x8a\x90\xb5"
- "\x97\x34\x59\x4b\x56\xb2\x86\x3e\x4d\x0c\xbd\xac\xe4\x8d\xe1\xf3"
- "\x3c\xaf\x57\xde\x52\xd2\xda\x05\xdb\x93\x92\x77\x58\xe6\xd2\x30"
- "\xae\x8c\xb1\x42\xde\x4c\x90\x37\xc0\x13\x3e\xd6\x9b\xe0\xcd\xff"
- "\xe0\xb1\x6e\x6e\x91\xf8\x8f\xfc\xd0\xf0\x72\x91\x3c\xc6\x0a\x5d"
- "\xf6\x37\xe8\xd1\xff\x78\xc6\x4f\xf5\x80\xd5\x8e\xfa\x02\x90\x27"
- "\x13\xe4\x8a\xe5\xa9\x22\xf4\x32\xc3\xbc\xad\xa2\x17\x86\x1c\x2b"
- "\xa3\xe5\xa9\xbf\xf5\xc5\x2e\xd7\xad\xd3\xbc\xf4\xeb\x12\xb6\x57"
- "\x70\x9f\xe3\xa5\x43\x39\xda\x3d\xec\x9f\x5a\xb9\x36\xcd\x32\x58"
- "\x54\x46\xd7\x9f\x21\x9b\x09\xfc\x4e\xb8\x4f\xc2\x7d\xd2\xbc\xb1"
- "\x9f\xc1\x8e\xd8\x01\x3b\x42\x74\xb1\x1c\x0a\xd7\x64\x9e\x73\x65"
- "\x83\x0f\x4d\xa2\x2b\x3d\x09\xf6\xe4\xa7\xa2\xc7\xca\x6b\x58\x66"
- "\x3c\x0f\x45\xfb\xd3\x70\x4d\xd9\x7d\x89\x52\xf1\xb3\xee\x76\x85"
- "\xcb\xd9\x76\xc2\x7d\x86\x58\x63\x1d\xbc\x75\x35\x8d\x33\xfb\xc9"
- "\x54\xe7\x0a\xe7\x99\x37\x58\x78\x2d\x27\x95\xef\x85\xab\xde\x5e"
- "\x77\x89\x8c\x6c\x57\x86\x93\x51\x9f\xc3\x2c\x44\x71\x3a\xd5\xad"
- "\x84\x7e\x70\x91\xb5\xce\x25\x0e\x84\xba\x98\x06\xb6\x80\x8e\x0b"
- "\xe3\x06\x3c\x6f\x06\x9e\x23\x1e\x5b\x9b\x4d\x7f\x70\x50\xdc\x35"
- "\xd0\x2e\x97\xad\xb7\xfd\xfd\xbc\x5f\xa0\xd3\xa4\x9f\xf7\xa5\x3a"
- "\x9d\xfa\x59\x2f\x33\xf2\x18\x1d\x5a\x2d\x7c\xdb\x5e\x20\xa6\x85"
- "\xd5\x19\x14\xff\x09\x3a\x96\x97\x85\xe8\xe6\x79\x6b\x6f\x15\x9e"
- "\x0e\xd1\xe8\x71\x9c\xa5\x3a\xbc\x2f\x2b\x15\xe1\x70\x72\x26\xfa"
- "\x39\xb3\xb6\x73\xb5\x08\xf2\x5a\x09\xea\xf0\x7a\x69\x6a\xb9\xea"
- "\x8b\x51\x0e\x39\xcf\xb3\x64\xd6\x02\x56\x32\xc3\x6a\x46\xf9\x50"
- "\x65\xe6\xde\x2e\x17\xdb\x9b\x7f\x58\x20\xf3\x59\x46\x39\x8a\xd6"
- "\xd1\x4d\x67\x68\x64\xb6\xb4\xf5\xdd\x99\x07\x59\x1f\x20\xcd\x82"
- "\xb4\xd9\x80\x7f\x08\xf9\xb3\xbc\xf4\xcb\x1a\x65\xc7\x8e\x9c\xad"
- "\xe7\xc3\xbd\x8d\xef\xa3\xf8\x27\x41\x6e\xaf\xa0\xbf\x6c\x7d\x9b"
- "\x2d\x9c\x66\x8c\xd8\x7c\xb1\xe0\x97\x1d\xff\x75\x9f\x3e\x1f\x15"
- "\x80\xad\x45\xce\xf5\x34\x02\xfd\xc3\xf8\xfd\xce\xe9\x10\xa7\x85"
- "\x6b\x64\xde\xcf\xd6\x05\x30\x4f\x18\x79\xcc\x4b\x15\xb5\xfd\xd1"
- "\x53\xb0\xad\x73\x49\xb4\x6f\x5b\xdd\x4b\xcb\x2f\xe6\xad\x0d\x0b"
- "\xbe\x67\x7d\x54\x87\x74\xa6\x5b\x97\x6b\x54\xaa\x4e\xb3\xfe\xfb"
- "\x25\xf3\x80\x9a\x17\x8e\x2a\x11\x2e\x41\x8d\xb7\xf0\xfe\xc4\xa8"
- "\x55\x8a\x0e\xa3\x2b\x3a\xa1\x47\x78\xfd\xb5\x0e\xf4\x2e\xb6\x8a"
- "\x00\x60\xda\xbd\x74\xbb\x4f\x5b\xe7\xf1\x7b\x82\xb3\x58\xb7\xc4"
- "\x1d\xb7\x78\xff\xa7\x0f\xfe\xe8\xea\x96\x11\xd0\x43\x52\x37\x2d"
- "\xdb\x5b\xa6\xf0\x0e\x30\xdc\xc6\xb2\x0b\xd4\x86\xf7\xc5\x7e\xd1"
- "\x2e\xdc\xcb\x6a\x78\x1e\xd1\xb8\xba\x9b\xd3\xde\x00\x6f\x8b\xc6"
- "\x95\x8c\xd3\xe8\x37\x1a\x6f\xe9\xa6\xd3\x98\xf7\xd5\xf5\xae\xc9"
- "\x8c\x2e\xe7\x35\x18\xb5\x8e\x34\x1a\xf3\xa1\x71\x87\x74\xbc\xd8"
- "\xc6\x00\x7d\x4d\x6c\x73\xb0\xad\xc1\x6b\xfa\xc5\xa5\x22\xc0\x36"
- "\x07\xf2\x8e\xd3\xdb\xc0\xed\x53\xed\x1a\x9d\x1d\xd9\x2e\xe0\xe0"
- "\xc3\x1c\x5a\xd2\xa0\x78\x2d\x99\x6c\x8a\xd6\x26\x6e\x2f\xb7\x85"
- "\xdb\x2c\xdb\x22\x75\x2c\xc6\x88\xe0\x9d\xa8\x5f\xa6\xd7\x00\x16"
- "\xe6\x3f\xdf\x9f\xaf\x78\x6a\x34\xc5\xf2\x51\x6f\x3f\x5a\x46\xe5"
- "\x38\xbf\xa1\x5b\x9c\x61\x71\xea\x34\xa5\xf1\x7c\x37\x91\xaf\x61"
- "\xb6\xb3\x03\xcc\xbf\x53\x6a\x78\x4c\xf6\x94\xb2\xbe\x95\x79\xaf"
- "\x43\xde\x36\xe4\x19\xa4\xe5\x1d\xa4\xf6\x73\xe4\x75\x20\x5f\x31"
- "\x8e\xcd\xf2\x52\x9a\xcd\x27\xc7\xfb\x65\x0b\xf5\x67\x81\x67\xe0"
- "\xd2\x2a\x2a\xa7\xd4\xc4\xc7\x65\x4c\x0e\x8f\x67\xa1\x4b\xa2\x03"
- "\xf5\xdc\xc0\x3c\xe5\x5c\x4b\x37\x82\x2f\xbf\x28\x5b\x4f\xd7\x31"
- "\x3f\x89\xe4\xcc\xc3\x8a\xee\x69\x85\xc2\x05\xdb\x13\x1a\xb5\x68"
- "\x35\xdd\x04\x39\x3a\x78\x86\xd2\x36\xe4\x97\xda\x80\x2b\xd1\xb6"
- "\x73\x44\x52\x07\x25\x67\x1e\xf2\x04\xbf\xa4\xba\x73\xbc\xfe\x92"
- "\x56\xaf\xf3\x22\xee\x1b\xae\xa4\x2f\x40\xd7\xa3\x6a\xfd\x60\xcc"
- "\x8d\xbc\x7e\x7f\x8a\xc6\x18\xb9\xbd\xf8\x25\xa0\xee\x8b\xe2\x92"
- "\x58\x20\xd4\x98\x76\xc8\x4b\x63\x32\x70\x3d\x2a\x7f\x2e\x5a\xa8"
- "\x3d\x1f\x42\xbe\x36\x71\x29\xcc\x79\x8e\xa2\xfd\x41\xe1\x4a\x60"
- "\x99\x38\xdc\xe5\x1a\x93\xee\xa5\xe9\x9a\xbc\xa7\xf9\x19\x56\x3f"
- "\x38\x1c\x42\xdf\x12\xf3\x26\xf0\xa8\xb4\x95\x25\x30\x1e\x8b\xa5"
- "\x5c\x00\x56\x9d\x41\xe9\xed\x30\x70\xdd\xe3\x0a\xdb\xa1\xa3\xed"
- "\xe1\xaa\xa9\x56\x79\xaf\xbd\x13\xda\x38\x1a\x1f\xfe\xb2\xbd\x8d"
- "\xc3\x99\xc7\xc7\x74\x28\x38\xcb\x6a\x1a\x87\x9f\xe1\xe7\xb3\xfc"
- "\xec\xb7\xdc\x63\xf5\xd4\x64\xa3\xfe\x33\x5c\x6f\x87\x9a\xcf\x8f"
- "\x39\xdb\x89\x3a\xd0\x86\x0e\x2f\x8d\x6f\x52\x7b\x19\xf7\x58\xfb"
- "\x91\x3d\x0b\xcb\x0e\xcb\x9c\x92\xe9\xdb\xde\x6b\xae\x97\xf2\xb7"
- "\x0f\x3c\x7f\x54\xd3\x1b\xbc\xd6\x92\x74\x8a\x6e\x6b\x68\xb6\x4a"
- "\xfe\x36\x08\xc3\xf7\x66\xbf\x1f\xf6\x19\x78\xbf\x49\xa9\xaf\xdb"
- "\x1a\x2e\xff\x7d\x0f\xed\xfb\x9e\x1b\xbf\x5a\xed\x19\xf3\xff\xef"
- "\x1d\xc6\x7d\x12\x7e\xb5\x92\x76\xbb\x0a\x12\xbc\x78\xd7\x09\x9b"
- "\x9d\x9f\xbd\xf4\xbd\x0a\xb1\x2b\xcd\x00\xbb\x44\xde\xd7\xdd\xc8"
- "\xeb\x04\xdf\x83\x9e\x1d\x33\x4d\xf5\xc5\x6d\x72\x4f\x11\xb8\x31"
- "\xdd\x85\xb3\x46\x04\x9a\xca\xfc\xc0\xfb\x7b\x6d\x4d\x35\x7e\xb2"
- "\x7d\x8f\xdb\xff\x3d\xb6\x1f\x84\x1f\xf4\xe7\x6b\x71\x8d\xf0\x1d"
- "\xa9\x0d\x12\xef\x7b\x75\xb9\x6e\x83\xfc\xd9\x49\xad\x39\x2c\x6b"
- "\x64\x78\x1a\x4f\x08\xbd\xfd\x4a\xa7\xdd\x63\xe5\xbe\xc4\xf3\x9d"
- "\x68\xbb\xf9\x1c\xdd\xb6\x4a\xa4\x4c\xb5\x1e\xb1\x13\xed\x86\x1e"
- "\xc1\x58\x23\xd7\xe2\xa1\x97\x18\x26\xc6\xff\x31\xb5\xfa\x3e\xcd"
- "\x16\xbc\xdf\x8a\x77\x18\x7b\x7c\xcd\xf6\x00\x31\xac\x10\xb7\x0f"
- "\xe5\x3f\x09\xfb\x8c\x18\xab\xd1\xe7\xf7\x58\xcb\x8a\xa0\x67\x7a"
- "\xf5\xd6\x6d\x23\xd6\x9f\x15\x01\xbd\x7d\xbc\x17\x0a\xb8\xe0\xff"
- "\x17\xac\xfd\xf2\x7f\x2f\xce\xe9\xff\x7a\x24\x4d\xf5\x59\x18\x74"
- "\x89\xee\xb3\xf4\xa3\xaa\xbf\x6e\x0b\x46\xf7\x57\xfa\x51\xfc\x66"
- "\xe2\xb7\x00\xbf\x42\xed\x39\xf2\x97\x11\x71\x0f\x69\x4d\x3f\xd8"
- "\xe5\x4a\xc7\xf8\x9f\x76\x48\xf5\x03\xa7\xa3\x1d\xcc\x23\x5f\x93"
- "\x89\xd7\xeb\x78\x1f\x94\xd3\x99\x9f\x39\x3d\x0c\x7b\x06\xcf\xb9"
- "\x78\x6f\x61\x59\xdd\x16\xa6\xa8\xf7\x9e\x4d\xe0\xb9\x75\xdd\x8c"
- "\xff\xdb\x72\x8d\x71\x43\x45\x05\xf3\x29\xf2\xcc\x37\x07\x2b\x2a"
- "\x50\x5f\x83\x4e\x57\xa4\x55\xf3\x7b\xe6\x49\xa4\x37\x81\x2e\x72"
- "\x0d\xdd\x8f\xf9\x5e\x7c\x5b\x23\xbd\xbd\xd7\x26\xb3\xa4\xa5\xb3"
- "\x3e\xea\xa0\xb1\x7e\xe8\x2c\xf4\xed\x54\x8b\x1a\x6b\xc6\x5e\xe4"
- "\x67\xe8\xca\x2f\x70\xef\x6b\x46\x2b\xbb\xab\x32\x6d\x3d\x06\x1a"
- "\xd8\x6d\xa0\xec\x60\xd5\x8e\x71\xc1\x94\xb1\xe3\x3c\xed\x07\xa9"
- "\x25\xf8\x2b\xb2\xbd\x20\x61\x7c\xe5\x01\x0f\x38\xd7\x8a\xd0\x07"
- "\xdd\xfb\x8c\x9e\xe0\xf9\x46\x8c\xcd\xb7\x9e\xa1\xb1\x92\x1e\xaf"
- "\x9f\xc2\xa8\xff\x8c\x84\xad\xd1\x67\x87\x69\xeb\x12\x11\xdc\x7a"
- "\x5a\xf8\x61\xdf\x0d\xde\xd2\x4d\xe3\x76\xae\xa3\x8c\xda\x6e\x4a"
- "\xdb\xd3\x4d\xe9\xe2\xef\xe9\x86\x5a\xd8\x6d\xcf\x5c\xb4\x10\x74"
- "\x42\xde\xd0\x22\x32\xed\x59\x47\x92\x47\x42\x95\xb0\xdf\x82\xb0"
- "\xdf\xce\xa7\xb3\x6e\xec\xb5\xdf\x7a\xa4\x5d\x3c\x29\x4d\xf1\xd1"
- "\xa4\xb4\x21\x76\x4a\x48\x5a\x48\x16\xe0\xe7\x3c\x47\x63\xc7\x26"
- "\xb5\xc1\x76\x44\x9b\xbd\x5a\x7b\x71\x9d\x66\xb6\xd3\x40\xd9\x56"
- "\xe8\x6b\x51\x39\xb5\xbf\xfd\x4a\x39\x77\x6c\xbc\xc5\xcf\x72\x83"
- "\x36\xdc\x7e\x3f\xef\xc5\x1e\x1c\x1e\x30\x16\xd7\x8a\x00\xa7\x97"
- "\x8c\x14\x01\xa4\xa7\x73\xdd\x07\x90\xde\xe5\xba\x3d\xd7\x6b\x1c"
- "\xd1\xd1\x1f\x8f\x62\x7e\xa4\xe9\x95\xdb\xff\x28\x0c\xe5\xe0\xd1"
- "\x34\xfb\xfa\x20\x6c\xef\x73\x2c\xb3\xb7\x1f\x9f\x57\x28\x82\xb6"
- "\xe5\xbc\x2f\x7e\x7b\x23\xef\xd9\xf3\x5e\xdd\xfb\xb0\x6d\xbe\x6d"
- "\x9f\x9e\xc7\x0b\x9e\x2b\x98\x0b\x01\xb3\x2a\xcd\x2e\x30\x3f\x8f"
- "\xb6\xe1\x89\xfa\xb3\xe3\xd9\x57\x64\xbb\xf4\x4b\xf9\x7e\x92\x97"
- "\x1e\x2e\x60\xdc\x79\x4f\x96\x75\x27\xec\xad\xeb\x4e\xd3\xf7\x73"
- "\xfc\xa0\x03\xde\x63\xfc\xcf\xc9\xd2\xf6\x55\xa5\xbf\x0b\xd2\x30"
- "\xfe\x3f\x54\xca\x69\x25\x23\xc9\x5a\x62\x13\xed\xfd\xd9\x4c\xd2"
- "\x07\xc5\x40\x37\xa0\x4c\x89\x0e\x07\xe3\xd4\x3f\x77\x1a\x1e\x7b"
- "\x0c\x69\x15\x3a\x1c\xe4\xb9\x1e\xcf\x35\xbd\x79\x54\x99\x7d\x11"
- "\x65\x1e\xeb\x34\xdc\xfe\xcf\x48\x3b\x1c\x53\xe6\x58\x4c\x99\x93"
- "\x11\x65\xca\xb5\x7a\x7c\xd1\x65\xc6\x51\x74\x99\x71\x96\xcb\x71"
- "\x1b\x97\x16\x53\x66\x72\x4c\x99\x99\x97\xe3\x36\x2e\x2f\xa6\x8c"
- "\x3d\xa6\x8c\x23\x82\x96\xec\x0f\x92\x81\xb4\xcd\x31\x65\x6a\x63"
- "\xca\x34\xe8\xcf\xfd\xf9\xfc\x14\xef\x26\x2b\x78\xb3\x9d\xfb\x73"
- "\x3b\xfa\xa7\xf3\xad\x17\xbb\xb4\xb2\xed\x71\xda\x15\x8c\xae\x6f"
- "\x7c\x52\x74\x7d\xe3\x47\x5c\xde\xae\xf1\x19\x31\x65\xb2\x63\xca"
- "\xe4\x46\x94\xa9\x57\xf5\x8c\x2f\x88\x29\x53\x12\x53\x66\xd3\xe5"
- "\x7c\x35\xbe\x26\xa6\xcc\xbe\x98\x32\x87\xbe\x85\x16\x3c\x8e\x2b"
- "\xdf\xac\x61\x6c\x2b\x3f\x00\x1b\x61\xc2\x48\xf6\x39\xe0\xbd\xc9"
- "\x9f\x75\x07\x06\xf0\x7e\x08\x8f\x57\x47\x1c\x01\x8c\x2d\x13\x30"
- "\xff\xb9\xa3\x5c\x1f\xb3\xd8\x1f\x83\x65\x5a\xd9\xd8\xe3\xdb\xfb"
- "\xb3\x45\xb9\x1e\xdd\x57\x8b\xeb\x3a\x32\x82\xc7\xa9\x09\xf3\x7b"
- "\x6d\x62\xe5\xbf\x44\x0a\xce\x84\x5f\xe8\x7b\xa3\x75\xca\xcf\x23"
- "\x81\x6d\xf2\x23\x0e\x59\xa6\x22\xc2\x8e\xe6\xfa\xfd\x07\xd7\x05"
- "\x8c\xd1\x78\x4c\xb0\x5f\x01\x8f\x24\xd8\x46\x15\x2d\xb0\x2c\x78"
- "\xff\xba\xb9\x16\x36\x10\xec\x7e\xc6\xed\x14\x4d\xf0\x49\x9b\x6c"
- "\x79\x37\xf1\xbd\xa7\x74\xaa\xdc\xdf\x56\x36\xe9\xc4\xf4\x26\xd4"
- "\xcf\xb6\x7b\x53\xd1\x05\xea\x94\xe3\x2f\xdb\x6e\x13\x1f\x3b\x52"
- "\xea\x03\x5e\x13\x7b\xfd\x3f\xbc\x34\x71\xbe\xb4\x35\xdc\xcb\xca"
- "\x79\xef\x9d\xf7\x90\x8e\xf8\xb3\x38\x0f\xf8\x7f\xc2\x38\xbd\xbd"
- "\x18\xeb\x21\x63\x13\x82\x57\xa2\x99\xea\xc3\x89\xa5\xd1\x3c\x39"
- "\x00\xbc\x32\xd1\x1d\xdd\xef\x13\xeb\xa3\xfb\x7d\xe2\x81\x68\x9e"
- "\x34\x80\x27\x27\x36\xc5\x94\x39\x11\x53\xa6\x2d\xa2\x8c\x5b\xab"
- "\x27\x10\x5d\x26\xc3\x14\x5d\x26\xc3\x1a\xf1\x8c\x36\x66\xa4\xf7"
- "\xce\x7d\xa4\x6f\x51\x46\x56\xc4\xb3\xa1\x5a\xea\xcf\x8c\xd9\x7a"
- "\x1a\xaf\x1d\xed\x79\x53\xf9\xb6\x68\xf0\xec\x31\xf2\xce\xf9\x4b"
- "\x63\x70\xd8\x1c\x83\x43\xaf\xfc\x6b\xfb\xe9\xbf\x3f\x4d\x99\x25"
- "\xda\x7e\x7a\x07\xc6\xec\x79\xfc\x0c\x58\x35\xc8\x0f\x3a\x64\x1c"
- "\x8b\x81\x77\x32\x06\x5e\x47\xc4\xb3\x05\xcf\xc1\x88\x36\x58\x12"
- "\xad\xd2\x4f\x10\xf6\x5b\x66\xaa\x9e\xce\x73\x4a\xe0\xdb\xee\x94"
- "\x63\x4d\x36\xfb\x6c\xa5\x9c\xa2\x4c\xf6\x69\xd2\x74\x79\x66\xa4"
- "\xfc\x93\x6a\x57\xe6\xfc\x68\x3c\x32\x0b\xa2\xf1\xc8\x2c\x89\x68"
- "\x97\xdf\xbc\x81\x7e\x64\x0e\x3e\xf2\x04\xdb\x3e\xec\x6b\x27\x7d"
- "\xa7\xd6\xc3\x66\xbb\x48\x16\xf6\x59\x3b\x5d\x42\x89\x1e\x47\x3b"
- "\xe6\x72\x93\x6c\xfd\xf2\x53\xca\x32\xb7\xe6\xf7\x67\x03\xfc\x13"
- "\x3a\x3f\x86\xab\x96\xb9\xc3\x95\x59\x6d\x48\x83\xfe\x9b\xb8\x50"
- "\xd9\xb9\x59\x19\xc2\x99\x57\x03\x7a\x62\x5e\x34\xe9\x73\x6d\x1e"
- "\xb1\x97\x7d\xaf\xa0\x7b\xda\x31\xc6\x27\xa9\xbd\xf2\x49\x23\x22"
- "\xf8\xda\x6f\x5b\x77\x9f\x38\x45\x93\xbe\x60\x1b\x80\x65\x94\x7d"
- "\xb8\x8e\x04\x7d\xc4\x73\x6f\x4f\xf0\x8c\xb4\xdd\xf0\xde\xab\x95"
- "\xcd\x8b\x28\xeb\xd3\xe6\xc6\xed\xfc\x6e\x62\x90\x8c\x47\xfc\x3e"
- "\x02\x9c\x54\x65\xef\x4d\xfa\xe2\x08\xe4\x15\x65\x36\xeb\x65\x78"
- "\x1e\xcd\x65\xcc\x25\x64\x9c\x50\x4a\xc6\xc6\x75\xa7\x24\x6c\xdd"
- "\x97\x02\xb6\x74\x87\xa7\xb4\x9d\x3c\xfe\x56\x5e\xeb\x32\x2a\x1f"
- "\x98\x49\xde\xc4\x00\x99\x3a\x2b\x97\x95\x7b\x71\x1f\xaa\x5c\x86"
- "\xb9\xf6\x32\xc8\xcf\x24\x23\xeb\x9b\x48\xda\xcd\x9a\x95\xfb\xc8"
- "\xbc\x39\xe3\x7f\xfc\xc8\x43\xf3\x67\x4d\xb5\xcd\x5f\xba\x6c\x71"
- "\xc1\xf8\x15\xab\x4a\x6c\x6b\x56\x2e\x2d\x59\xba\xfc\x79\x5b\x86"
- "\x63\x8c\xc3\xb6\xa8\x44\x5d\xd3\x0b\x17\x15\x97\x4c\xe7\xdb\x71"
- "\xb6\xa2\x95\x8b\x57\xcb\xdb\xb1\x83\x29\x1a\xc8\xd2\x92\xc5\x2b"
- "\x6d\x63\x0a\xc6\xd9\x1e\x5c\xb4\xb4\x70\xd5\xca\xc5\x71\x61\x4d"
- "\xb5\xad\x5c\xbc\x72\xf1\xa2\x02\xdb\x74\x5b\x06\x43\x8e\x04\x17"
- "\xd1\x9f\x19\xfa\x38\xc6\xe3\xd7\x36\x97\x38\xae\x8d\x67\x5e\xc5"
- "\x3f\x77\x1c\xbc\x7c\x2c\xbb\xe3\x68\x34\xcf\xdd\xd1\x1a\xcd\x73"
- "\x77\xb4\x5f\x3e\x96\xdd\x11\x33\xfe\x4d\x8e\x19\xff\x26\x8f\xb8"
- "\x7c\x2c\x9b\x1c\x33\xfe\x4d\x8e\x19\xff\x26\xf7\x8e\x7f\xe0\x25"
- "\xe9\x9f\x86\xb4\x98\xf1\x6f\x72\xcc\xf8\x37\x79\x53\xcc\x73\x75"
- "\xc4\xf3\x75\x78\xde\x1b\x39\x3e\xe2\xf9\xa0\x2e\x9f\x7d\xfa\x65"
- "\xf2\x51\x3d\x0f\xeb\x7a\xe8\xe6\x36\x2d\xaf\x37\x22\x6f\xbb\x96"
- "\xd7\xdf\x2b\x7f\xe0\x23\xf6\x75\x53\xf3\xf5\x3b\x9f\x60\x9d\xce"
- "\x7e\x6e\x3c\x36\x41\x3e\x6e\x3d\x47\x93\xff\xc8\xb0\x98\x87\xd9"
- "\xef\x51\xbc\xf5\x54\x57\x5d\x0a\x99\xb8\x4c\x5d\x15\x19\x85\x6b"
- "\x52\x07\xae\x84\xb4\x24\xfc\xa0\x53\xee\x84\xfd\x7b\xf3\x61\x35"
- "\x5e\xdc\x59\x2f\x6d\x7e\x94\xd1\xe0\xcb\x79\x0d\xe0\x58\x51\xc6"
- "\xb4\x4d\x8d\xc5\x6d\xb8\x4f\x62\x9e\x46\x79\xa3\x30\xdc\x91\x89"
- "\x2b\x21\xcd\x82\x5f\x2a\xe0\xd5\xeb\xf0\x36\x0d\x8b\x6f\x5b\xc6"
- "\xda\xb9\xbd\xf3\x41\x03\x99\xb7\xb9\xc2\xad\x9e\x30\xdb\xd6\x77"
- "\x9e\x50\x6b\x0b\x99\xd9\xc2\xf5\x59\x5e\x1d\xd2\xe3\xcf\x93\xee"
- "\x82\xfd\x77\xe7\x51\xb5\xde\x72\x17\xfa\xff\x61\xbf\x5a\x3b\xcd"
- "\xcc\x86\xbe\xed\x3e\x4d\x77\x7d\x84\x6b\x0f\xae\x3b\x74\xf8\x8d"
- "\x72\xbe\x7d\xd7\x64\xe1\x4a\x78\x94\xe1\xc6\xa4\xcf\x86\x7e\xeb"
- "\x36\x07\xcb\xf3\xe2\xbc\xb3\x0b\x57\xe2\x23\x71\xd2\xcb\x61\x33"
- "\x74\x7b\xe9\xae\x83\x8c\x6f\x44\x7a\x8d\x70\x0d\x9d\xcf\xf9\xbd"
- "\x5c\x1f\xca\xf4\x67\x6b\xeb\x7e\xad\xca\x0f\xfd\xae\xb6\x98\x76"
- "\x7c\x73\x9a\xa6\x2c\x52\xed\x98\xf2\x49\x4c\xdd\xc1\xf8\xed\x98"
- "\x92\x8a\x76\x7c\x13\xbf\x1d\x53\x32\x24\x6d\x0d\x68\x8b\xe1\xb2"
- "\x77\xb3\xd1\x96\x6f\x24\xdd\xa3\xd3\x0b\x34\x5b\x88\xe7\x64\x16"
- "\xbc\x93\x65\x1f\x2d\xed\xeb\x37\x2d\xdf\x66\x73\x0d\xe5\xc6\xa9"
- "\x73\xaf\x70\x0d\x7c\xd4\x4b\x53\x4e\x4a\x38\x7d\xe9\x87\x15\x2e"
- "\xa0\x93\x41\xd2\x89\xe5\xc1\xdc\x5f\x7f\xeb\xf3\x12\xb5\x16\x92"
- "\x05\xf9\xbf\xab\x51\x5f\xcb\x2c\x2e\x15\x3e\x9d\x8e\x78\x97\x1e"
- "\xf3\x2e\x10\xf1\x6e\x66\xd4\xbb\xf5\xbd\xe9\x0b\xf4\xf4\xef\xd6"
- "\x4f\x59\x9b\x63\xfa\x09\xfd\x73\xf7\xcd\xd1\xed\xce\xaa\x55\xed"
- "\x43\x1f\x5d\x46\xeb\xac\x43\xe8\xa3\x9e\xf8\x7d\x94\x75\x22\x3e"
- "\xaf\x65\xc9\x75\x34\x91\x42\x71\xe0\xdd\xcd\x73\xec\x1e\xc9\x83"
- "\x5a\x3f\x5d\xde\x3f\x77\x8f\xd3\xfb\xe7\xbb\xb5\xf1\xee\xa2\x98"
- "\x36\x86\x00\xe3\xac\x6a\xeb\xd4\xe9\x31\xb0\x2b\xe2\xf3\xe2\xdd"
- "\xf5\x68\x67\x28\x7e\x3b\xef\x3e\xdc\x3f\x2f\xde\xdd\x8a\xf6\x84"
- "\x2e\xe7\xc5\xbb\x7d\xaa\x0c\xc5\x29\x33\x35\x49\xb8\xe2\xd5\x33"
- "\x35\xcd\x19\x64\x3b\x77\xea\x02\x5e\x5f\x8a\x48\x9f\x16\xcd\x7f"
- "\x68\x03\x97\x63\xfa\x05\x95\x9e\xe5\x7e\x38\x6d\x23\xc3\xb7\xf1"
- "\x64\x97\x6b\x6a\x6d\x0c\xad\xce\x9f\xa6\x7b\x6e\xee\x34\x24\xec"
- "\x55\xf4\xba\xe7\x8b\x18\x9c\x0e\xc5\xa7\xd7\xd4\xe3\xa0\xd7\xf9"
- "\xf8\xf4\x9a\xda\xd1\x3f\xbd\xee\xe1\xfe\x3f\x7f\x39\xbd\xee\xb1"
- "\x45\xd2\x0b\xb6\xae\x6c\xdf\x68\x2b\x78\xa3\x27\x5f\xd4\x71\x5b"
- "\x43\x64\x31\x83\x57\x54\x99\x0e\x2e\x33\xdf\x1c\x50\x7c\x02\x1b"
- "\xd2\x74\x8e\xee\x99\xa6\xcb\xff\xd0\x1a\x1a\x28\x7a\x9e\x62\x3f"
- "\xa2\x04\x2e\xe7\x71\x9c\x6f\xf4\x04\x33\x88\xe7\x1f\x31\xf5\xd6"
- "\xc4\xd7\x05\xf7\x1c\x00\x4d\xab\xe2\xa4\x1f\x55\xfe\x65\xd3\x28"
- "\x5a\x47\xdc\xe3\x8d\xee\xa3\xa9\xbc\x76\x6a\xd6\xb6\x9d\xbe\xf5"
- "\x77\xe5\x3e\x9b\x96\x7b\x79\x9f\x4d\xfb\x5a\xf5\xd7\xb4\x3f\x46"
- "\xe3\x37\xcd\x1e\xbf\xbf\xa6\x95\xf7\xdf\x5f\xd3\x6a\xfb\xef\xaf"
- "\x69\x87\xb8\xbf\xd0\x5e\x5f\xf4\xb8\x31\xed\x78\x74\x7b\x51\x2f"
- "\xca\x09\xc3\x35\xd7\xf1\xf3\x77\x6d\xb7\xfe\x63\x1d\xc7\x7d\x55"
- "\x57\x46\xe0\xe5\x84\x91\x8c\xe3\xd5\xc2\xe8\x17\x36\x68\xe8\x5e"
- "\x17\x7f\xbf\x95\xe7\xb8\x2d\x35\x44\xbc\x8f\x6c\xbb\x85\x6d\xf7"
- "\xe9\x7f\x08\x1b\xa8\x15\xf7\x86\xd3\x74\x5f\x65\xd8\x60\x28\xe5"
- "\x3d\x4f\xe9\x17\x2e\xd7\x10\xa6\x9f\x8c\xec\x0b\xde\xfb\xe4\xb9"
- "\xe9\x56\x35\x77\xfa\xdb\x69\xba\x77\xb1\xea\x97\xfb\x5e\x8a\xa6"
- "\xe3\xbd\x14\xbf\x5f\xee\xb5\xa2\x5f\xfe\x16\xbf\x5f\xee\x9d\xdc"
- "\x7f\xbf\xdc\x9b\x8b\x7e\xf9\xdb\xe5\x72\x74\xaf\x5d\x93\xa3\x8d"
- "\x5c\xc6\xb6\x9c\xe7\xe3\xf7\xfe\x99\xf3\xe0\x1e\x32\x72\x2f\x1f"
- "\x29\x4f\x18\xdf\xa1\xcb\x91\x2c\x53\x0b\x58\xb2\x7e\x2d\x4f\x8d"
- "\x06\x23\x12\x6e\xa3\xb9\x23\x9e\x9c\xdc\x2b\xfb\x69\x42\x11\xf1"
- "\x5e\x7c\xde\x6e\x86\xb1\x92\xe8\x1c\xdd\x37\x9e\xf3\x71\xfa\x04"
- "\x7f\xa4\x9c\xdc\xd7\x9b\x8f\x75\x9d\x96\x97\x44\x97\x9d\x38\x5f"
- "\x34\xec\xfb\xb4\xf6\x0f\x94\xe3\x08\xe7\xe7\x7c\x31\x79\xf2\x94"
- "\x3c\xde\x57\x1b\x2d\x8f\xf7\x15\x45\xf3\xe7\xbd\xb2\x5c\x18\x7a"
- "\xce\x4b\xd3\x9b\x80\xc3\x77\xe6\xaf\x2b\xcb\xe6\x7d\x1d\x31\xb2"
- "\x09\x1e\xc8\xde\xa2\x78\x20\x7b\x59\x34\xae\xd9\xc6\xf8\x3c\x90"
- "\x3d\xa2\x7f\x1e\xc8\xce\xea\x9f\x07\xb2\xe7\x33\x0f\x78\x29\x7b"
- "\x73\xb4\x6c\x66\x17\x46\xb7\x1d\xf5\x4a\xd9\xa4\xe4\xab\x91\x4d"
- "\xd8\x42\xd7\xf5\x27\x87\x2c\x53\xec\x3f\x52\xd7\xad\xef\x75\x7c"
- "\x27\x9a\x99\x20\x57\xc0\xef\x7e\x1b\xaf\x29\x41\xc7\x67\x31\x0d"
- "\xf7\xc8\xb3\x87\xf7\x4f\x8e\xa4\xe3\x56\x75\x3e\xce\x89\xbc\x1f"
- "\xf3\xbe\xb2\xa2\xe7\x03\x1b\xa2\xdb\x7f\xff\xfc\xf8\xf4\xbc\xbf"
- "\x10\xf4\x74\xc6\xa7\xe7\xfd\x15\xfd\xd3\xf3\xfe\xbd\x7c\xf6\xe8"
- "\x72\x99\xba\xff\xb0\x6d\xb5\xb4\x51\x64\x99\x73\xf4\xc0\xf5\xdf"
- "\x6d\x7c\xba\xdf\x1f\x3d\x3e\xdd\x7f\xf2\xea\xc7\xa7\x07\xb2\xe2"
- "\x8f\x4f\x0f\xe4\xc6\x1f\x9f\x1e\xb0\x2b\x79\x78\xa0\x3e\x5a\x1e"
- "\x1e\x28\x8f\xe6\x09\xd0\xee\x7f\x6c\x7c\x7a\xc0\x17\x23\x03\xdb"
- "\x4e\xd3\x8c\x97\x60\x53\x94\xab\x7e\x9b\x79\x67\x34\x8e\x33\x92"
- "\xe2\xf7\xdb\x8c\x34\xf4\xdb\xb6\xf8\xfd\x36\x23\xbb\xff\x7e\x9b"
- "\xc1\x7b\xd0\xdb\x2e\xef\xb7\x19\x25\x57\x6f\x53\xcc\xd8\x17\xdd"
- "\x67\x33\xdc\x57\xdf\x67\x33\x3a\xe2\xf7\xd9\x4c\x63\xfc\x3e\x9b"
- "\x39\x42\xf5\xd9\xcc\xf9\xd1\x7d\x36\x73\x72\x74\x9f\x81\x6e\xff"
- "\xcd\x3e\x43\xff\xcc\x54\xfe\x09\x33\x3f\xc2\xbc\x7d\x60\x97\x6b"
- "\x66\x83\x97\x66\x95\xa8\xb9\xf5\x2c\x35\x76\xa8\x3e\xfc\x00\x79"
- "\xea\x2f\x1f\x07\x66\x1e\xd5\xd2\x7e\x7c\x79\x3f\xcc\x6c\x83\x8e"
- "\xee\x68\x2a\x95\x7b\x5b\xaa\x0f\x99\xe6\xc8\xd7\xb8\x8e\xf7\xa7"
- "\x66\xf1\x66\x51\x02\xfa\x58\x78\x02\x41\x62\xbd\x8e\xfc\x7e\x86"
- "\xc3\x67\x2e\xa3\x61\xcd\xca\xb8\x9a\x31\xfe\x0a\x3e\x35\x33\x1b"
- "\xcb\x26\x01\xde\x83\xb3\x14\xaf\xce\x8a\xb5\x7f\xeb\xf0\xee\x46"
- "\xc5\xa7\x3f\xf8\x32\x06\x87\x83\xf1\xf9\x74\xd6\x31\xb4\xa1\x2e"
- "\x3e\x9f\xce\x6a\xef\x9f\x4f\x1f\x44\xff\x53\x5d\xc4\xdc\x27\xe5"
- "\x99\xa0\x37\x66\xee\xf3\x60\xba\xd9\xaf\x78\x47\xda\x44\x95\x99"
- "\x33\xbb\x5c\x0f\xc6\xda\x7f\xe8\x9b\x07\x9b\x35\x9c\xff\x10\x53"
- "\xbe\x1f\xfb\xef\x41\xb6\xff\x3e\x88\x8f\xf3\x83\x57\xb0\xff\x1e"
- "\x64\xfb\xef\x83\xcb\x65\xeb\x41\xcd\xfe\x8b\x37\xc7\x7b\xb0\x23"
- "\x7e\xff\xff\x20\xa6\xff\x29\xaf\x04\xf3\x61\x59\x3e\x3a\xdf\xb8"
- "\xc8\x7c\xec\x9b\xc4\x79\x99\x47\xe2\xe4\xcd\x8b\x85\xd9\x4f\xbe"
- "\xf2\xcb\x78\x8f\x7d\xa9\xe2\xf2\xde\x0f\x1a\x94\x3c\xe6\x18\xa3"
- "\xe5\xf1\x07\x4d\xd1\xf2\xf8\xa0\x3d\xa6\x5c\x5b\xf4\x7b\xf0\xcf"
- "\xff\x98\x8e\xcd\x99\x1f\xc3\x03\x9f\x9d\xa6\x9c\x3f\x2a\x1e\x78"
- "\x68\x6c\x34\x1e\x39\x85\xf1\x79\x20\x67\x13\xda\xff\x59\x7c\x1e"
- "\xc8\xa9\xef\x9f\x07\x72\x0e\x83\x96\x9f\x45\xf2\xed\xa3\xa5\xd9"
- "\x03\x63\xf2\x78\xe3\xeb\xbc\x9c\x40\xfc\x35\x82\x87\x2c\x8a\xc6"
- "\x0f\xe5\x44\xd3\xf8\xa1\xf4\x68\x1a\xa2\x2d\xff\x7d\x1a\xf6\xc6"
- "\x3e\xe8\x72\x3d\x14\x2b\xff\x9e\xd3\xf4\x43\x4d\xfe\x1f\x4e\x8e"
- "\xc1\xf1\xa0\xc2\x25\xde\xba\xc8\x43\x3c\xff\xf5\xc4\xa7\xe5\x43"
- "\x1d\xf1\xdb\xfc\x43\x23\xc6\x20\x4f\xf8\x32\x59\xfa\xe1\x08\xa4"
- "\x3f\xca\xeb\xa1\xbc\x1e\xb2\x07\xe9\x8f\x06\xc9\x24\xc7\xab\xde"
- "\x71\xe9\x87\xd9\xec\x8b\xc2\xf4\x67\xfe\x35\x8f\xa0\x5c\x1e\x83"
- "\x18\xaf\xfc\x52\xe9\xb7\x60\xde\xc4\xbc\x3e\x8a\x79\xfd\x87\xd2"
- "\xfe\xe3\x7d\x16\xf6\x23\x34\x3b\x28\xd7\xe3\x0f\x92\xce\xef\x9c"
- "\x3f\x06\x76\x2d\xcb\x05\xe7\xd7\xf3\xaa\x75\xb3\xf2\x18\xdd\xf4"
- "\xc3\xa6\xf8\x7d\xfc\xc3\x93\xfd\xf3\xce\x0f\x03\xaa\x9f\x1f\x1e"
- "\x17\xdd\xcf\x0f\x5b\xc2\xae\xa1\xf3\xb9\xad\xe0\x81\xab\x92\x93"
- "\x12\x9b\xf0\xf5\xab\xef\x37\x3e\xd5\x5a\x54\x46\xb7\x9c\xa1\x87"
- "\xab\x65\x7d\x06\x11\x30\x6f\x48\xa0\x26\xa9\x03\x1e\xfe\x4a\xe2"
- "\x89\x3c\xf9\x41\x32\x88\x8d\x2f\xb6\xf2\xbb\x3a\x97\x08\x20\xdf"
- "\x71\xde\x13\xe0\x33\xcb\xe0\x85\xeb\x4e\xd1\xc3\xef\x45\x95\x87"
- "\x26\xf0\x28\x18\xed\x75\x52\x1e\x1f\x6e\xd3\xd7\x74\x37\xe1\x39"
- "\xfe\xba\xef\x6c\x93\xee\xfb\xa0\x7c\xc6\x1e\xee\x77\xff\x92\x71"
- "\xe2\xb3\x32\x8c\xd3\x95\xf5\xc0\xec\x05\x3a\xff\x2a\x5f\xcb\xd9"
- "\x85\x7d\xbe\x7c\xb3\x1d\x5e\x9a\x6d\xbb\xc2\xda\x60\x84\x1c\xcc"
- "\xde\x1b\x09\x47\xc5\xff\x98\x7d\x48\xf7\xc7\xc3\x7d\xd3\xb7\xc0"
- "\xd2\xf1\xe9\x88\xc1\x07\x76\xc4\x03\x27\x14\x8c\x39\xa6\x2b\xc1"
- "\xe0\x3e\x57\x3c\xcb\xfc\x30\xc7\x76\xa5\x35\xbf\x44\x2b\xe5\x6e"
- "\xbf\x8c\xb7\xe6\x48\x7b\x89\x61\x5c\x19\xc7\x39\xee\xa8\xb9\x85"
- "\xdc\xbb\xe7\xbd\xad\xb9\x4f\x2b\xb9\x9f\x1b\xb3\x46\x38\xa7\x41"
- "\xfa\x53\x69\x72\xff\x4c\x30\x56\x0e\xe6\x1c\xd3\xc7\xe8\x98\xf4"
- "\x36\x5d\xee\x31\xaf\x65\xb8\x31\xeb\xac\x73\x8d\x4a\x16\xe6\x2e"
- "\x08\x27\x47\xce\xd7\xe6\x4a\xfb\x4f\x5f\x2f\xc5\x7b\x63\x4c\xb9"
- "\x98\xf5\xbf\x39\x0d\xa2\xff\x75\xfa\x24\xf4\xaf\x9f\xf7\xb6\x54"
- "\x0c\x84\xb9\x9b\x63\xd6\x2b\x7c\x5b\xe5\xf9\xf6\xbf\x00\xee\x3c"
- "\x4d\xef\xe5\xc6\xd8\x78\x73\x1b\x9c\x67\xaf\xd4\xfe\xb9\xfd\xb4"
- "\x7f\x6e\x5f\xfb\x97\x33\xdc\x79\x31\x6b\x89\xf3\x64\xfb\x43\x97"
- "\xe9\xbf\x79\x23\xa0\xbf\x74\xba\xc1\xe6\x9e\xb7\x4a\xb7\xd5\x79"
- "\xfd\xa0\x7f\x5b\x7d\x5e\xdf\xfa\x9f\x2a\xd7\xb7\xfe\xe7\x8b\x67"
- "\xab\x7b\x49\xee\xad\x46\xd7\x5d\x63\xae\x8d\xd7\x96\x79\xfd\xac"
- "\xff\xcd\xd3\xd6\xff\x72\x6d\xd1\xfa\x6c\x9e\x37\xba\x0f\xe7\xc5"
- "\xf4\x61\x2e\x45\xf7\xe1\xdc\x86\xff\xea\xb8\xc6\x80\x12\x13\x13"
- "\x0d\x89\x09\x86\x84\x44\xbc\x46\x13\x69\x60\xa2\x31\x71\x00\x7e"
- "\xd7\x68\xd7\x81\x86\x44\x83\x11\xbf\x01\xda\xf5\x9a\x98\xe7\x81"
- "\x5c\x16\x3f\xa3\x76\x1d\x10\xf3\x7c\xcd\xb7\xbc\x1f\xa8\xd5\xab"
- "\xd7\x6f\x8c\x79\x1e\xf0\x2d\xef\xaf\xf9\x6f\x96\xa7\xcb\x9e\xa3"
- "\xfd\xd0\x1e\x5a\xbe\x7a\x51\xe1\xd2\x02\xb9\x5f\xbc\xd8\xb6\xe8"
- "\xb9\xe7\x16\x17\x17\xdb\x4a\x56\xd8\x1e\xb8\xff\x91\x49\x53\x6d"
- "\x6a\xdb\xb9\x70\xfa\x98\x82\xc1\x34\x67\xcd\x4a\x7e\x31\xe7\xd1"
- "\x87\xf2\x6c\xb9\x0f\xdc\x1f\xfd\x52\x07\x23\xb7\x97\xaf\x04\x25"
- "\x42\xfe\xb2\x5f\x1b\x46\xb4\xf9\x4d\xa9\x7b\xda\xd8\xcf\x57\xad"
- "\x79\x3c\xbe\xe1\x18\xfb\x8f\x76\x3b\x45\xe3\x28\xde\xd3\x7f\x64"
- "\x0c\x37\x62\x7c\x7d\x39\x15\x3d\xcb\xe7\x57\x1e\xb9\x5f\x7c\xea"
- "\x23\xdb\x0f\xc9\x70\x8a\x9e\xaa\x6c\x82\x55\xc4\xcf\x1e\x6f\x90"
- "\x6c\x4e\x32\xa1\x7c\x26\xde\x25\x88\x7b\xc3\x48\xf3\x6b\xbe\xd0"
- "\x8f\xdd\x2f\xd3\x3e\x2d\xd7\xf3\x99\x4f\xd3\x23\x5f\x8a\x4f\x85"
- "\x7c\xe6\xf3\x41\x2a\xdf\x23\x1f\x0b\xc3\x8f\x1c\xac\x1b\x6a\x53"
- "\xc8\xc8\x7b\xa1\x3b\x52\xc8\xb4\x63\x18\xc7\x02\x79\xa4\x41\xdf"
- "\x0b\x7d\x0d\xcf\x5e\x7a\xca\xcd\x75\x73\xde\xb0\xe1\x47\xef\x70"
- "\xfe\x3d\xd1\xf9\x4f\xf6\xed\xc5\x3e\xd2\x60\x40\xbe\x79\x5f\x90"
- "\xd9\x1c\x12\x5f\x07\x52\xc6\xda\x26\xe4\x50\x82\x07\x5d\x71\x2c"
- "\x58\x4e\xca\xe7\xe7\xd1\x31\x6b\x43\x22\xc8\xfe\xe9\x73\x3a\x9c"
- "\x62\xdb\x32\x32\x42\xa6\x13\x1a\x57\xb2\x8f\xc2\xa3\x49\x75\x8b"
- "\xc9\x88\xf6\x8f\x38\x43\xf3\xa7\xd9\xe6\x12\x39\xe7\x90\xf1\xdf"
- "\x1c\xec\x6f\x98\xf9\xe9\xd6\x3f\x91\x71\x7f\x77\xb9\xa1\x5b\x58"
- "\xa9\xb4\x44\xb4\x0b\x8e\x0f\xe4\x17\x01\xf6\xf1\x3f\xb6\x30\xc4"
- "\x79\xde\xef\x72\x5a\xa9\xa5\xc4\x4f\xeb\x4f\x8a\x40\xc5\x9f\xd4"
- "\xd9\x80\xe6\x0e\x3f\xfb\x2f\x9a\xd6\xcf\xa1\xc4\xd3\x79\x64\x68"
- "\xb6\xd7\x90\x67\x81\x9f\x4a\x4f\x8a\xf6\x63\x0b\xbf\xa4\x16\xfb"
- "\x01\xca\x6f\x25\xc3\xb1\xb6\xbf\x92\x8c\x71\x53\xb5\xc3\x56\x76"
- "\x91\xac\xeb\x97\x72\xda\x45\x5a\xb7\x9e\x86\xac\xfb\x9c\xcc\x9e"
- "\xf6\x56\xd4\x73\x96\x9e\x3c\x41\x09\x80\x67\x78\xf9\xaf\x64\x7d"
- "\xf9\x09\xf6\xf3\xcd\xa6\xda\x32\xb2\x0a\x67\x7a\x52\xb7\x33\xdd"
- "\xd2\x2d\xd2\x53\xba\x9c\xe9\xa9\x2d\x45\xc8\xdf\xf6\x09\x0d\x6d"
- "\xa5\xd4\x4f\xcf\xb4\x1a\x6a\x2e\xd0\x08\x6e\xd3\x69\xb4\xad\xf6"
- "\x02\xf2\x57\x2d\x3f\x1e\x46\xd9\xc8\x32\xc1\xe4\xe5\xed\x9e\xbc"
- "\x00\x85\x01\xab\xa6\x9b\x46\xd4\x76\x93\x35\x5c\xb9\xfc\x38\x97"
- "\xeb\xa0\xc7\xee\xf6\x1c\x23\x2a\x5d\x2f\x42\x3d\x55\x99\x36\xe8"
- "\xc4\x81\x1f\x3c\x7b\xc8\xe8\x39\xd6\x41\xcd\xfe\x6e\x6a\xa1\xbf"
- "\x90\xc7\xf1\xf7\xc6\xfd\xcf\x1e\x1a\x10\x86\x10\x34\xae\x6b\x43"
- "\x5d\x8a\x77\x9c\xcd\x7c\x56\xb9\x9c\xb6\x95\x51\x52\xd1\x3a\x1a"
- "\x78\x06\xe9\x6a\x6e\x9f\x96\xee\x09\xfe\xbd\x71\x9d\xf4\xc7\x7d"
- "\xca\x5d\xd6\x4c\x89\x2d\xfe\x1a\xf6\xfb\x34\x84\x52\x76\xd8\x3c"
- "\xfe\xe3\xe4\x29\xfa\x5b\x63\xd8\xb2\xc3\xb4\x39\x4c\xa6\xf7\x2e"
- "\x1d\x37\x78\x8c\x97\xc8\x93\xe7\xa7\xcf\x50\xb7\xa8\xda\x31\x0e"
- "\x7a\x2b\xbb\xc5\x1f\xe0\xf3\x4e\x19\xa2\xd3\x3a\x78\xdb\x4a\x1a"
- "\xb7\xe7\x02\xa5\xed\xbe\x40\xe9\xa2\x2b\xdd\xc0\x3e\xb6\x7c\x36"
- "\x75\x37\xae\x49\x6d\x64\x42\xdb\x95\x3f\x76\xb2\xe6\x6b\xdb\x93"
- "\x4e\x75\xdd\x7d\xbe\xb6\xdd\x9d\x7d\xbe\xb6\xe0\xa9\x03\xec\x6f"
- "\xeb\xa5\xf9\x33\xcd\xc7\x68\x20\xe4\xc4\xce\xfc\xbd\xed\x1c\x19"
- "\x37\x9e\x23\x9a\x50\x6e\x20\xdb\x12\x3e\x67\xf1\xf8\x18\x0f\xfa"
- "\x86\xef\x4f\xd1\x63\x27\x71\x4d\xc2\x2f\x01\x32\xf1\x47\x6e\x67"
- "\x9b\xc6\xc7\x48\x33\x20\xed\x0f\xb8\x26\xe2\xfa\x89\xb3\x56\xf8"
- "\x50\x97\xa3\xd3\x40\x83\x99\x9f\x35\xff\x5e\x47\x97\xeb\xb1\x83"
- "\x5e\x7a\x31\x4d\xe7\x6b\xa5\xe3\x1f\x39\xf0\xd9\xa9\xb3\x1c\x87"
- "\xca\x27\xf1\xea\xb1\x27\x70\x4c\x2a\x2d\x9d\x71\xb8\x99\xeb\x3d"
- "\x45\x8f\x73\x3d\x66\xfc\x20\xa7\x8f\x55\xeb\x65\x3b\x7b\xec\xa8"
- "\xf3\xf1\xeb\x91\x2e\xf4\x74\xb4\xdb\xc8\xef\x3e\x3c\x75\xd6\xa0"
- "\xf2\xa4\x1b\x00\x33\xa0\xc1\x87\xec\x3f\x32\x9f\x65\xbc\xd3\x60"
- "\x16\x47\x16\x4e\xa6\xda\x37\xc5\xb1\xdd\x6f\x8a\x26\x25\x7b\x8f"
- "\xe7\x79\xa9\xd0\xce\x38\x62\x1c\x6f\xda\x8c\x77\x47\x30\x0a\x31"
- "\x5d\x9a\x0a\xd8\x9f\xec\x71\xd8\x7f\xd7\x46\xb5\x41\xb8\x72\xf3"
- "\x78\x2c\x7d\xbf\xec\xe8\x00\xe8\x80\xbc\x96\xb6\x0e\xda\xdf\xdd"
- "\x3e\xc0\xf9\xaf\x64\xf0\x04\x4f\xd1\xc4\x54\xb2\xb2\x3d\x58\xf7"
- "\xa6\xf0\xe2\xda\xce\xfe\x9d\xe0\x97\x9b\xcf\xd0\xe3\x7f\xf8\x7e"
- "\x2a\xa5\xfe\xbb\x83\x34\xfd\xf4\xf8\x5f\x23\xf4\xd3\xe2\x66\xef"
- "\xa1\x08\xdd\xf4\xd4\xf5\x97\xeb\xa6\x27\x93\x95\x6e\x82\xec\x4b"
- "\x5d\x14\xf2\xaa\xf4\x27\x42\x31\xe9\x9a\x9f\xc8\x13\x5f\xc4\xa4"
- "\x07\xb4\xf4\xe6\x98\x74\x9f\x96\x3e\x44\xd7\x7d\x2d\x8c\xc7\x1a"
- "\xd6\x7d\x79\x5f\xb3\xee\x6b\x59\xa8\xe9\x3e\xa9\x7f\xf2\x3e\x17"
- "\xef\x40\x17\xad\x66\x7d\x93\xf7\x1e\xe3\x2f\x3e\x25\x1d\xf7\x41"
- "\x48\x5b\xc6\x69\xee\xbf\x90\x11\x3f\x5d\xef\x7d\xc6\x7a\x8f\x75"
- "\x1e\xeb\xbe\x5d\xc3\x44\xeb\xae\x37\xc5\x89\x5a\x19\x5b\xe7\xc7"
- "\xbd\xfa\xef\x75\xa4\x6d\x46\xda\xeb\x78\xcf\x7a\x90\x69\xd2\x9c"
- "\x77\x88\x63\x62\xb4\xc1\xd6\x3a\x1c\x36\x64\xd0\x56\xf4\x37\x9f"
- "\x37\xdc\x04\xfa\x9a\x13\xa8\xc8\x53\xc2\x67\x58\x43\xec\x93\xd6"
- "\xd6\x52\xd2\xc6\x72\x37\x6c\x23\xe4\xcc\xe3\xf8\x92\xca\xfc\xe2"
- "\x0c\x9f\xbb\x63\x1c\xf2\xd7\xfe\x90\xe3\x11\x25\x34\xd9\x89\xd8"
- "\x2f\x9c\x75\x36\x70\x31\xba\x81\x93\x8a\xa1\x92\x57\xe0\xa5\xfa"
- "\x06\xd5\xd7\x4f\xb9\x39\xde\xd9\x29\xfa\xf1\x3e\xcc\xf7\x02\xdc"
- "\x36\x73\xa8\x9c\xf8\x1c\x0c\x64\x8c\xcf\x2f\xda\x77\x19\xc2\x76"
- "\xb7\x7e\x16\x86\x63\xdf\x21\x8f\xa7\x35\x40\x8c\xb3\x97\x7e\xec"
- "\x6f\x2e\x3d\xc4\xe5\x6b\x98\x36\xc2\xe5\xd4\x61\x24\x48\x18\x06"
- "\x39\x6f\xb4\x7b\x29\x4f\xad\x9d\xa7\x64\xda\x9a\x17\xf8\x88\xf5"
- "\xbe\xa7\x1d\x30\x4a\x4f\x29\x18\x80\x25\x30\x06\x44\xbd\xd3\xe0"
- "\x0f\x59\x2f\xbe\x06\xfc\x02\xee\x2f\x3e\x17\xc9\xfb\x6d\xa0\x4b"
- "\x12\xfb\xca\x2b\x5b\xf4\xc7\x67\xeb\xfe\x42\xa4\x9d\xed\x04\xbf"
- "\xfd\xb8\x83\xcf\x2d\xf1\x79\xce\x2b\x9d\xe5\x04\x8d\xd2\xf4\xf3"
- "\x9c\xe1\x35\xff\xb3\x67\x39\x01\xdb\xba\xc7\x20\x0e\x00\xff\x0e"
- "\x3e\xcf\x09\xfc\x67\x33\x1f\x6a\x6d\xf2\xbd\xf1\xa4\xa4\xf9\x64"
- "\x4e\xc3\xdc\xf1\xa8\xde\xff\xdc\x5e\x6e\x0b\xde\x59\x95\x8d\x28"
- "\x8e\x7b\xe9\x09\x1f\xbf\x47\x9a\x91\xf3\x4f\x84\x1e\xf3\x60\x0c"
- "\xfb\xe0\x54\xc8\xb0\x6d\x1d\x19\x95\x4e\x7b\x6a\x10\x97\x57\x3a"
- "\xed\xc9\xc6\x3e\x9d\xf6\xe4\x47\x4a\xa7\x29\x1a\x2b\x9d\xf6\xe4"
- "\x2f\x94\x4e\x7b\xf2\x6d\xb9\x2f\x06\x9d\xc6\xef\x58\xaf\xe9\x3a"
- "\x6d\xf7\x30\x71\x94\x75\x47\x97\xeb\x49\xb7\xae\xdb\xb6\x20\x8d"
- "\x75\x07\xe3\xa8\xf4\x54\x5e\xbb\xf8\xff\xd2\x49\xf9\x1d\xf0\xbd"
- "\x9d\xcf\x2f\xb4\x6b\xf7\x3c\x9e\x24\x28\x1d\xf7\x64\x5b\x9f\x8e"
- "\x7b\xd2\xde\x57\x96\x75\xdc\x93\xdf\x28\x1d\xa7\xd2\xeb\x9e\x64"
- "\x1d\x97\xd7\xce\x34\xd0\xe0\x1b\x78\x0d\x4f\xcb\x0f\x3a\x3e\xee"
- "\x8b\xd4\x71\xd1\xf2\xf5\xd4\x34\x5d\xc7\xb1\x6e\xc3\xf3\x6c\x2f"
- "\x0d\x96\xf3\x6c\x96\xb3\x6a\xd0\x5c\x97\x3b\xee\x03\x6e\x33\xc7"
- "\x35\x63\xba\xcd\x38\x4b\x03\xb5\xb3\x43\x5a\xbb\x9f\xaa\xd0\x7d"
- "\x1f\xbd\xf4\xa4\x3b\x9e\x1d\xdd\x17\x7b\x90\x6e\xe5\xb3\xf3\x9e"
- "\xf2\x53\xe4\xa9\x11\xe5\x2d\xc1\x93\x94\x5f\x02\x5d\x91\xf8\xe2"
- "\x17\xdc\xb7\x98\x77\xdc\xc3\x57\xd6\x3d\x18\x4b\x9b\xf3\xfd\x74"
- "\x0d\xe6\xea\x5f\x6c\x33\xe0\x9d\x23\xea\x9d\x5c\x63\x98\xb0\x92"
- "\xe3\xd6\x3d\x75\xa0\xbf\xf9\xfe\xd5\xd5\xb7\x60\x7a\xff\xf5\x2d"
- "\x78\x42\xd6\x07\x9b\x0a\x73\xa0\xe4\x73\xb4\x40\xce\x4b\x64\x7c"
- "\x9b\x8d\x71\x61\xbd\xa6\xbd\x1f\xd0\xcf\xfb\x5f\x7c\x4b\xf9\x7f"
- "\xfd\x96\xf2\x5f\xb1\x2e\x42\xfb\xcc\x21\x57\x34\x9c\xa1\x41\x3d"
- "\xdf\x19\xe4\x7b\x3a\x59\x5b\x8b\xf9\xc2\x39\x52\xce\xd1\xac\x3a"
- "\x4c\xe6\xbf\xad\xc8\x27\x63\x86\x40\x57\xce\x5c\x4b\x1c\xaf\x25"
- "\xb2\xec\x9c\x3e\x1a\x3f\x4d\x57\x58\xf7\x4b\xf2\xd4\x90\x8c\xa1"
- "\x79\x04\x36\x29\xc6\x38\x8e\xdb\xa7\xad\x7f\x3c\xbd\x17\x7a\xb3"
- "\x3e\xc2\x2f\xb6\x03\x7a\xee\x56\x8e\x6b\xc0\xf6\xe5\x36\x35\xdf"
- "\xbc\x01\xfa\x39\x85\xcf\xc3\xf0\xd9\x98\xfc\x50\xae\xe1\x88\x8c"
- "\x2f\xf6\xb4\x57\x2f\xdb\xdf\x3a\x0b\xd7\xab\xd5\xc9\x3e\xa6\xfe"
- "\x2e\xd7\x33\xa9\x7a\x19\x86\xcd\x7e\x8a\x18\x97\x6f\x95\x67\x4a"
- "\x83\x1d\xac\x0b\x6f\x80\x2d\x9a\xa2\xea\x59\x48\xaa\x9e\x67\x72"
- "\xbc\xb4\xc0\x72\xa5\xb3\x19\xfd\xb7\xef\x99\x4d\x57\xdf\x3e\xd2"
- "\xda\xf7\x4c\xe3\xb7\xb4\xef\x4a\xf5\x06\xaf\xbe\x5e\x8b\x56\x6f"
- "\x7e\xd6\xd5\xd3\x35\xbf\xf0\xbb\xd3\x35\x43\xa3\x6b\x7e\xfd\xb7"
- "\xd0\x35\x5e\x3d\x27\xbe\x7b\x3d\x36\xad\x9e\x85\xa6\x78\xf5\x90"
- "\xfc\xeb\xf7\xdc\x94\x49\x8f\x61\xc9\xf1\x5c\x55\x7c\xb9\x85\xb9"
- "\x91\xb1\x7a\x55\x9c\xd7\x85\x05\x7a\xac\x5e\x2d\x96\x2c\x74\xf5"
- "\xc2\x0d\xf9\xf5\x3c\xbe\x8b\xb0\x97\x16\x6e\xe2\xf8\xa8\x33\xd7"
- "\xab\x33\xd9\x5a\x99\x9a\x2b\xc5\x08\xe6\x98\x56\x42\xe4\xd1\x91"
- "\x1a\xb9\xdf\x0e\xbd\xbe\xf0\x8f\xec\x7f\xaf\xf6\x0b\x17\x9e\x54"
- "\x72\xbf\x10\x73\xc4\x85\xe9\xfd\xc3\x58\xd6\xb8\xb7\x2c\x63\x40"
- "\x7f\x3e\xf5\x5d\xae\x45\x23\xbc\xb4\x3c\x49\xfa\xd1\xa7\xdc\x93"
- "\x8e\xf9\x83\x16\x57\xef\xb9\x1d\x11\x31\x04\x31\x16\x3e\xfb\x3b"
- "\xcd\xf7\x1f\x34\x28\x07\x2d\x17\xcd\xd7\x69\xa0\xa7\x23\xcd\xae"
- "\xd3\x00\x36\x4d\x92\xa7\x3e\xc8\x67\x73\xfc\xea\x1c\xf6\xa2\x2d"
- "\xa2\x72\x99\x76\xde\x7d\x51\xab\xb2\x5b\x50\x5f\x4f\x9e\x51\xce"
- "\x95\xca\x78\xae\xf4\x6c\x91\x2f\x79\xd9\x01\x1d\x0f\x51\x6c\x35"
- "\xf0\x79\xef\x89\x41\x15\xa7\x8b\x6d\x02\x3e\x1b\x27\xdf\x17\xa7"
- "\x1b\x30\xb7\x04\x4d\x16\x7d\x2d\x3a\x39\x5e\x8c\x84\x9d\x04\xbc"
- "\x6b\x18\xae\x17\x57\xdf\xcb\xe9\x1c\xeb\x42\x6b\xcf\xa2\x3f\x87"
- "\xab\xee\x49\x0f\x77\x59\x0d\x3a\xbe\x7b\xe4\x39\xd6\x67\xd1\xfe"
- "\x7c\x69\xb7\x29\x7c\xac\x06\xf6\xe1\x0f\xa7\x2c\x6b\x14\x2f\x5b"
- "\xe9\xe0\xca\x76\x39\x57\xe2\x3a\x27\x72\x3c\x38\x9e\x1b\xc1\x1e"
- "\x41\xb9\xf9\xbd\x74\x03\x5c\xd1\xa5\xd3\xed\x59\x52\x63\xb1\x6a"
- "\xa3\xff\x65\xab\xe1\x88\x4f\x9e\xb1\xa3\x34\x9b\xf3\x1b\x15\xeb"
- "\xf9\x59\xb7\x4e\xbb\x5e\x9c\x80\x0f\xe7\x51\x3e\x4d\xcf\x1e\xd0"
- "\x71\x92\xf2\x9a\xc2\x67\x76\x17\xed\xe5\xb3\x42\x8a\xfe\x47\x92"
- "\x90\xe7\xc4\xe5\xf4\x7f\xb6\x3d\x82\xfe\x89\xcc\x6f\x4c\x7f\x5e"
- "\xdf\x00\x5d\x92\x41\x4b\x93\x3a\xe3\xc0\x36\xcc\x73\x7c\x96\x3e"
- "\x89\xf1\x0c\x57\xea\x34\xcf\x33\xaa\xb5\xb1\xe7\x66\x47\xf4\x03"
- "\xda\x6b\x65\xfb\x2c\x41\x6f\x3f\x97\x61\x1a\x70\x7c\x47\xae\x1b"
- "\xf8\x5c\xdb\xe5\x7a\xae\x20\xb6\x4d\x1b\xd5\xf9\x11\x52\xfe\x24"
- "\xcf\x6d\xea\x95\x8f\x61\xc2\x57\x62\x13\x01\x75\x16\xf9\xb9\x71"
- "\x07\xcb\x7c\xc6\xfe\xe4\x9e\x79\x50\xc6\x8a\x34\xc8\xb5\x04\xd8"
- "\x59\x8b\xd7\x0a\xe0\xa6\xfa\x7e\xf1\x8f\x54\x5a\xc1\x6e\x5c\xc1"
- "\x63\xcf\x5d\x14\xa8\xdb\xe7\x94\x71\x55\xd0\xb6\xc5\xd5\xcc\x73"
- "\x3a\x9f\xf1\xda\xa3\xf2\x13\x2f\x78\x82\xf5\x88\x4e\x73\xe0\x3f"
- "\xb8\xcb\x55\x90\xa6\xe3\xaf\xe7\xe7\xbe\xe3\x3c\xbc\x4f\xd3\x64"
- "\x0b\x48\xfd\xaa\xce\x09\x15\xe4\xea\x72\xcb\x75\x70\x3f\xb3\x7e"
- "\x61\x7a\x28\x5a\x14\x14\x45\xc3\xb2\x1a\x54\x7c\x4a\xe6\x79\xc8"
- "\xe3\xba\xc0\x00\xe4\xa9\xee\x83\x51\x60\x51\xef\x7a\xf1\x64\xdf"
- "\x7e\xe9\x7f\xa7\xfa\xa3\x20\xc4\xed\xea\xc3\x97\xe5\xaf\xa0\xb7"
- "\xff\xf9\x9d\xdf\x69\xe5\x78\xb6\x52\xaf\x94\x8c\x64\x7c\x7d\x1c"
- "\x27\x56\xf2\x3a\xe0\xcf\x64\xdc\x39\x8f\xde\x67\x7d\xbc\xb8\x78"
- "\x44\x24\x1c\xe1\xb4\x1a\x74\xfd\xa4\x74\x87\x0f\xf3\x54\xb2\xa9"
- "\x3d\x96\xc5\x39\x11\x38\x37\xea\xf8\xf4\xe9\x84\xc5\xf6\x58\x9e"
- "\xe4\xba\x39\xfe\x9e\x06\x9b\x75\x89\xe5\x14\x2d\x9e\xaf\xf0\x7a"
- "\xee\x18\xf7\x63\x7f\x63\x9a\x1e\xe7\x73\xbb\xd2\x21\xe8\xe7\x25"
- "\x9f\x6f\x57\x67\x87\xfc\x2a\x96\xe3\xe2\x3f\x0b\xc3\xdb\x4c\x2b"
- "\x5e\x43\xf7\xc9\x18\x1d\xf2\x5c\xf9\x62\x79\xc6\x7c\x68\xd1\xdb"
- "\x32\x7e\xac\xe6\x0f\xe8\x6b\x2a\x0a\xca\xf8\x7d\xce\x12\x3e\x67"
- "\x1b\xe4\xf9\x9d\xf4\x77\x3b\x52\x12\xa4\x47\x03\x2c\x13\x4b\xd2"
- "\xf9\xfc\xbc\x5f\xca\xd2\x92\xc9\xfa\x99\x79\x8e\x69\x29\xba\xf2"
- "\x08\x7a\x28\x91\xed\x22\x9b\x93\xe3\x1d\x3c\xcf\xe7\x87\x48\xeb"
- "\x5f\xda\x6a\x10\xc7\x95\xfc\x2f\x59\x2f\xe3\x08\xca\xbd\xab\x53"
- "\xd0\x09\x89\x7f\x3f\x45\x4b\xde\x50\x6b\x3d\xba\x8e\x7a\x7e\x08"
- "\xef\x5f\x79\x35\x18\xa8\x0b\xe3\xdf\x22\xe3\xe5\xba\x64\xc9\x7a"
- "\x7d\xbe\xc2\x67\xee\xd4\x5e\x58\x1f\x3c\x2f\x2d\x29\xe5\x6b\x5f"
- "\x1f\xfc\x9e\x61\x75\x5c\xae\x17\x9e\x27\x5d\xf6\x8a\x46\xf1\xb9"
- "\xed\xc5\x4d\x5c\x7f\x7f\xe3\x85\x70\x3e\xc1\xfd\x64\x3a\x6d\x8b"
- "\xdf\x37\xf1\xf7\xd6\x9e\x2f\xd0\xdb\xa0\xd3\x44\xb5\xe1\xf9\x4f"
- "\x3a\x53\x32\x73\x22\xda\xfe\x89\xa4\x45\xdf\xfb\x8b\x11\xb4\xe1"
- "\x67\xbf\x1a\xd7\x9e\x3f\x08\xfe\xd8\xab\x78\x4d\xa5\x41\x76\x3e"
- "\x14\x2f\x43\x17\x48\x1c\x97\x92\x2e\xeb\xc8\x0b\xfb\xef\xeb\x11"
- "\x6a\x8f\xeb\x79\xb4\xff\x79\x2d\x6e\xc2\xf3\x15\x8c\x4b\xdc\x76"
- "\x46\xe1\x68\x2f\x64\xfb\x42\xc5\x51\xb0\x2f\x63\x7c\x6d\xdf\xe3"
- "\x3e\xb6\xdf\x2d\x75\x38\xc7\x54\xe8\xb1\x0f\xf0\xf7\xa4\x53\x67"
- "\x8f\x1d\x7a\x21\xdd\xd0\xe5\xb2\x43\xff\x9f\x0f\xa8\x3a\xed\x0b"
- "\x75\x5c\x19\x37\xd8\xcd\xa6\x2e\xb1\x34\x3e\x7d\xb9\x5e\x19\xe7"
- "\xc9\x3e\x10\x3f\x13\x7e\xd7\x7c\x97\x38\x4c\xb0\xcb\xdb\x7d\x95"
- "\x53\x8e\x87\x57\x8b\xa3\x1c\x4f\x0c\x73\x8f\xf6\x6d\xe0\xdd\xa1"
- "\x1b\x1a\x61\x8b\x3f\x6d\xc8\x5f\x4b\xd9\x98\x23\x93\xb8\x24\xb2"
- "\xf6\x84\x71\x5d\x2d\x26\x73\xbc\x6e\x3c\x67\x68\xcf\xe3\xf8\xb9"
- "\x73\xb5\x58\xd0\xe5\x5a\x6a\xd1\xf7\x04\x55\x2c\x9c\xa5\xb6\xde"
- "\xf8\x41\x89\x4f\xf1\xf9\x21\x8e\x33\x15\xc6\xdc\xa7\x9d\xeb\xcd"
- "\xe7\xf9\x2b\xea\x43\x3e\xc8\xff\x42\xd9\x4e\x5f\xe2\xed\x29\xf8"
- "\xc5\xa7\x2d\xca\x30\x5e\x9d\xc9\x53\x8e\xeb\xb8\x0e\xf5\x67\x1b"
- "\xbe\x23\x6e\x0d\x3a\x6e\x48\x3f\xba\x4d\xa5\x07\x39\xde\x21\xfb"
- "\x36\xe2\xfd\x31\x1d\x57\x1d\x07\xae\x8f\xcf\x6b\x8a\x94\xcc\x3c"
- "\x8e\x35\xc3\xf5\xf9\x5e\xe6\xf8\xbe\x4b\x03\x3a\xbe\xdf\x95\x8f"
- "\xcb\x6a\x85\xe0\xb1\x93\x75\xaf\x6d\x38\x51\x8b\x9f\xf5\xc9\x0b"
- "\xb3\x8f\xd4\xfa\x79\x7d\xfb\x49\xd4\xf1\x44\xa7\xb0\x53\xb8\xc7"
- "\x1e\xb7\x7f\xb9\x0c\xf2\x57\x48\xdd\x50\x95\xf9\x44\x58\xe4\x40"
- "\x47\xa0\x5c\x4f\x0e\xaf\x2d\x41\x66\x5f\x38\xd8\x54\xda\xce\x67"
- "\x2c\xa1\x6f\x5e\x38\x88\x3c\x79\x6c\x63\x61\x7e\xc5\x3a\x2b\x91"
- "\xf5\x52\xe3\xea\xc9\x0c\xe3\x23\xa3\x83\x8c\x4d\x8e\xef\xf6\x1d"
- "\x00\xc0\xed\x50\x72\xf3\x42\x87\x6e\x97\xe0\x3e\x10\xbd\xdf\xfd"
- "\x82\x37\x76\x6e\xf6\xec\x8a\x15\x25\xf9\x2b\x17\xf3\x25\x7d\xcc"
- "\xaa\xb1\x83\x23\xe7\xe0\xac\x83\x55\x7c\x84\x17\x2d\xbc\xde\xb5"
- "\x3d\x45\xdf\xbf\x7d\xb1\xf7\xfc\x97\xe6\x27\x7e\x1f\xcf\x25\xd8"
- "\xe6\xc6\xbb\xc2\xdf\x95\xae\x97\x36\xd0\x17\x26\x32\xc4\xd6\xb7"
- "\x64\x51\xc9\xa2\xc2\xa9\xbc\x53\x33\x38\x5e\x3d\xe5\x31\xf5\x1c"
- "\xea\xad\x47\xe9\x40\xbf\x81\xf3\x55\xee\x6f\x14\xc9\xd5\x0b\xd5"
- "\x19\xdd\x17\x4f\xea\x6b\x29\xfd\xf8\xd7\xd5\x84\xaa\x56\x58\xb8"
- "\x5f\x9c\xeb\xc9\xf0\xe1\xba\x56\x03\xdb\x32\x65\xb8\xe7\x39\xad"
- "\x5c\x9b\xd1\xe2\x14\x7d\x7a\xa1\x15\x63\x4c\x61\x86\xa8\xcc\x84"
- "\x5d\x5e\x98\xde\xdf\x3c\x36\xd2\x37\x81\x7d\xd9\xda\xa8\x30\xa7"
- "\x5f\x3f\x02\xf7\x3d\x59\x4a\xc7\x14\xee\x6e\xb2\x12\xf7\xfb\x4f"
- "\x4e\x51\xe1\x0e\xa3\x15\xe3\xc8\x70\xfa\x27\xdc\xef\xe6\xb2\xfc"
- "\x2e\xaa\x9f\x6f\x3e\x5b\x6f\x04\x17\x82\x1b\x13\x84\xfa\x23\xa3"
- "\x76\x93\x88\x9f\x41\x24\xc8\x5d\xb6\x44\x50\x78\xe0\x35\x46\x32"
- "\x0f\x4d\x32\xdd\x7a\xcb\x08\xeb\x7d\xf7\x4e\xcb\x72\x96\x95\x42"
- "\x7a\x83\x01\xb3\x88\x8c\xab\x55\x6d\x7a\x6c\x6c\x39\x49\x3f\x8b"
- "\xca\xea\xb8\xbc\xbf\xc5\x25\x8a\xf8\x4c\x73\x38\x65\x7f\x86\x73"
- "\x15\x19\x3e\xe8\xf6\x1a\x38\x76\x3c\xdb\x58\xfc\x6d\x81\x53\xb4"
- "\x6c\xec\x67\x48\x43\xfb\x1d\xc2\xbd\x3f\x43\xd9\x26\xcb\x96\x86"
- "\xab\xf6\x67\xf4\xc1\x37\x12\xc3\x77\xee\x20\xc3\xde\xb2\x76\x83"
- "\xc7\x78\x2f\x79\x6c\x7e\xfa\x0c\xf7\x71\x69\x89\x3a\xd9\xde\x61"
- "\x18\x75\xae\x70\x85\xf3\x1b\x32\x68\xe7\x12\x0d\xe7\x68\xd9\xdb"
- "\x07\xfa\x29\xc7\xe7\x80\x3b\x53\xa6\xbc\xd9\xe5\x5a\x86\xfe\xbf"
- "\xdf\xa8\x8d\x77\xd0\xcb\xcb\xc0\xff\x85\x52\xff\xe3\xfd\x1b\x9d"
- "\x32\xb6\xf0\x72\xd2\xf3\xc4\xed\xa3\x9f\xf2\xda\xac\x68\xe4\x7e"
- "\x15\x97\xbe\x6a\xe7\x33\x0f\xfd\xf8\x47\x0c\xf4\x38\x26\xf1\x1e"
- "\xd5\x80\xa1\x01\x4a\x72\x5e\x14\x3d\x21\x17\xa5\x82\xdd\x0d\x21"
- "\xcc\xa9\x83\x97\x44\x5e\x73\xc7\x05\x19\xeb\x92\xf5\xc7\xfb\x4b"
- "\x7e\x6f\xf0\x04\xce\x37\x7a\x36\x85\xa9\x05\xb6\x87\xa7\xf6\x7c"
- "\xa3\x8a\x89\x19\xa2\x66\xfa\x0b\x35\x3b\xfe\x77\xb9\xa7\xfc\x2f"
- "\x48\x17\xe5\x4c\xe7\x9e\x4b\x62\xbe\xc7\xf8\xbf\x88\xbf\x7d\xc2"
- "\xba\x10\x74\xb7\x9d\xa3\xe5\xff\xfa\x29\xe0\x7c\xf0\x1f\x80\x25"
- "\x63\x69\x4d\xa7\xcf\x70\x8f\x36\x9d\xd0\xf5\x64\xdc\x18\x24\x09"
- "\x8d\x5b\xcc\x8e\xa7\x0d\x61\xe8\x5c\x8e\x79\x06\x5d\x3b\x99\xdb"
- "\x85\xe7\x0c\x7e\xc6\x75\x1c\x5f\xcd\x1b\x1a\x77\x9b\x83\x4f\xb3"
- "\x0e\xce\x63\xfd\x8a\xf4\xf9\x75\x97\xa4\x4e\xce\xd5\x9e\x67\x6b"
- "\xcf\x39\xda\xf3\x4c\xed\x39\x5b\x7b\x9e\xc6\xcf\x4a\x77\xaf\xb0"
- "\xf7\x8e\x2b\x86\x81\xc7\xf1\xec\xd0\xfb\x02\xf8\x0c\x31\x3b\xd6"
- "\xcb\x31\x40\xc3\x63\xb2\x86\x57\x86\xf6\xac\xe3\x73\xb3\x39\xb8"
- "\xfe\x7f\x0a\x9f\x40\x34\x3e\x45\xa6\x08\x7c\xc8\xec\xc8\xfe\x2e"
- "\xf8\x58\xcc\x1c\x9f\xff\xbf\x81\x0f\xe3\xc2\x69\xa8\xbf\x22\x06"
- "\x9f\x1a\x1d\x9f\xb8\xfc\xb6\x5a\xb4\xf3\xf8\x57\x7c\xa3\x8c\xf7"
- "\x3b\x90\xc7\xb6\xba\x6e\x3d\x7e\x5d\xd1\x89\x2b\xc5\xaf\x83\x2c"
- "\x58\x91\x07\xed\x2f\xda\xab\x8d\xf3\x87\x95\x2d\xf8\x52\x92\xee"
- "\x53\x84\xb6\xee\xdb\xa6\xda\xda\xb0\x89\x63\xb8\xad\xa5\x9b\x9c"
- "\x0e\xd1\x8e\xb9\xd9\x7f\xf2\xfc\x21\x12\x6e\x61\x49\x71\xf1\xb2"
- "\xa9\xb6\xc2\x45\xcb\x17\xdb\xc6\x14\xd8\x8a\xed\x4b\x97\x94\x2c"
- "\x8e\xde\x67\xb7\x68\xdf\x4b\x91\xe7\x07\xd8\xde\x96\xf3\x2d\xf0"
- "\x3f\xeb\x6d\xe5\xf3\xf9\x52\xb3\x70\xbd\x94\xc5\xba\x7e\x4f\x15"
- "\x19\xf9\x4c\x31\xf0\xa9\xd5\x75\xbc\x3e\x47\x62\x1d\x8f\x74\xd8"
- "\x7f\xcb\x27\x47\xa4\x73\xde\xa3\x7a\x1a\xc3\xd7\x74\xd3\xc0\x53"
- "\xf4\xd2\x52\xae\x33\x2e\x0d\x2f\x89\x7a\x8c\xaf\xfc\xbd\x01\x03"
- "\x74\x8a\xe0\x78\x4c\x7c\x2e\x0f\xe5\xc4\x69\x5a\x79\x23\xeb\x5e"
- "\xfe\x26\x8f\xb2\xeb\x05\x70\x5c\x39\x1e\x65\xf6\x22\xcd\xb8\x15"
- "\x79\x31\x57\x68\xe7\x72\x48\x9f\xc5\xf1\x11\x90\x6e\xd2\xe2\x4c"
- "\x71\xda\x13\x1c\xbf\x00\x69\x96\x88\xb4\x65\x1c\x2b\x1d\x69\x36"
- "\x0d\xde\x7a\xa6\x33\x9e\xb3\xb5\xb5\x14\xce\x53\xa9\xd5\x5b\x1e"
- "\x89\x33\x7f\x3c\x63\xd2\x84\x0c\xdb\xfc\x47\xef\x9a\x7e\xef\x73"
- "\x2b\x96\x2f\x19\x4c\x92\xec\xe9\x18\x2e\x33\x26\x39\xc6\x4e\xb5"
- "\x15\x2d\x5e\xbc\xd2\xb6\x66\xf1\xf2\x12\xdb\xa2\x35\x8b\xd6\x0e"
- "\xa6\x25\x2b\x56\x3e\xc7\xa7\xef\xb9\x5b\x8a\xf3\x9f\x5b\xf2\x3c"
- "\x3b\x43\xa8\xdc\x83\xa3\xc6\xf1\xf9\xac\xdb\xb4\x78\x15\x47\xb7"
- "\xb1\xad\x91\x3c\x8d\xef\x39\x8e\x93\x15\xd7\x26\xfc\x0e\xe3\x77"
- "\x08\xbf\x13\xf8\x1d\x3f\x43\x8e\x05\xb8\x1e\xec\x72\x15\x4f\xd3"
- "\xed\x89\x3e\x1e\x2a\xce\xd5\x79\x08\xe3\xff\x41\x35\xbe\x15\x97"
- "\xb7\x04\xa5\xfc\xf4\xf2\xd4\xb6\x4b\x7d\x3c\xc5\x71\x28\x5b\xd8"
- "\xd7\x67\x35\xde\x83\x87\x41\x7f\x9e\x57\x0f\x62\xba\x9d\xa6\xd5"
- "\xab\x30\x1f\x3f\xc6\x31\x54\x70\x6d\x02\xbf\x1c\x53\x71\x4b\x8a"
- "\x83\xc8\x37\x12\x75\x1c\xd6\xea\x50\xcf\xc3\xc4\x51\xfe\x76\xc6"
- "\x29\xed\x99\x61\x01\xc6\x10\xbe\xe7\xab\xb6\xa7\x66\x66\xbf\x49"
- "\x35\x6f\xd4\xdf\x95\xbc\xab\xd5\xd1\x08\x5a\x94\xef\x71\xc9\xb5"
- "\x3f\x39\xbf\xe2\xb5\x43\x73\xc2\x7d\x02\xf8\x9c\x0f\x27\x3e\xd5"
- "\x2a\xe3\x22\x96\x77\x43\x47\xdc\x71\x87\xc7\x21\xf3\x27\xf0\xda"
- "\xe2\xdc\x22\x11\xe6\xf8\xd4\xe1\xc4\x17\x5b\xb9\x9c\xb0\x4c\xa3"
- "\xf0\xd6\x21\xd9\xca\x16\xe0\x78\x74\x25\xe5\x1a\x4c\xde\x37\xb3"
- "\x9e\xa1\xe2\x4c\x35\x57\x73\x2c\x50\xf6\x59\xc9\x66\xdd\x07\x0f"
- "\x32\x9a\x8e\xe7\x5a\x5d\x07\x78\xa9\xc4\xae\xf9\x4b\x35\xaa\xf6"
- "\x97\x9c\xd0\x9e\x0f\x69\x38\x26\x70\x8c\x0c\xe0\x7f\x9c\xfb\x0e"
- "\xf3\xde\x43\xb8\x3f\x01\xfa\x1c\x53\xf4\x29\x91\x36\x20\xec\x1a"
- "\x7e\x7f\x82\xbf\x33\x82\x77\x27\x54\xfc\x89\x92\x24\x6e\x73\x9f"
- "\x4f\x65\x6d\x36\x70\x1d\xc2\x7b\x8f\x90\xa5\x43\x9e\x4b\x2c\x9f"
- "\x25\x1c\xcb\xf2\x80\xae\x77\x58\xcf\xe4\x87\x20\xa7\xd2\xee\x5e"
- "\x35\x53\xd7\x37\x7d\x7c\xb0\x2a\x2f\x9e\x2e\x89\xd7\xef\x8a\xfe"
- "\xab\x7e\x27\x5c\x2b\x6b\x81\xd3\x01\xd9\x07\x1c\xa7\xf3\x52\xaf"
- "\x7d\xdf\xa3\x74\xe4\xaa\x86\xde\xb9\x88\x86\x07\xc7\xfc\xf6\x32"
- "\x6e\xdd\x72\x3f\x58\xd3\x1b\xab\x4e\xe8\x7a\x43\x87\x63\x4e\x10"
- "\x61\xb3\x03\xff\xdc\x93\xb2\x78\xed\x9c\xc7\x4b\x69\x8f\x00\xce"
- "\xd0\x8b\xea\x6c\x54\xb8\x72\x52\x96\x97\x56\x6d\x86\x8e\x31\x4a"
- "\x9b\xd3\xb5\xf2\x83\x3e\x5d\xb4\x3a\x3d\x12\xa6\xb0\x4c\xca\x62"
- "\xb8\xac\x8f\xd8\x26\xc9\x0f\x19\x39\x3e\x49\x96\x36\xbe\x40\x07"
- "\xaf\xce\xd3\x71\x05\x0d\x8f\xea\xf8\x6a\xdf\x78\x82\xae\x5a\x75"
- "\x68\x5e\xa8\x87\x7d\x84\x9b\x54\x7f\x3a\xa4\xbe\xc1\xbb\x06\x94"
- "\xad\xf6\xd2\x4b\xed\x9a\x0c\x1d\x43\xf9\x86\x23\x65\x33\x91\x67"
- "\xf5\x01\xcd\xcf\xf5\x38\xfa\xf7\x44\x04\xef\xbf\x1b\xb1\x16\x70"
- "\x42\xf5\xe1\xbd\xe5\xa7\x68\xb5\x2f\x22\x5d\xeb\xdb\x23\xb9\xa7"
- "\x68\xcd\xbb\x6a\x5e\x9d\x19\x50\xe5\xd7\xa8\xb3\x2b\x1a\x8e\xac"
- "\x0b\xf8\x1c\x17\xcb\xb8\xa4\xbd\xec\xe3\x35\xe9\xfa\x78\x01\x58"
- "\x07\x25\xcd\x87\x89\xc3\x4c\x27\x15\x07\x62\x65\x8b\xa2\xd3\x9a"
- "\xdc\x28\xda\xf3\xb8\x89\x7a\x98\x4e\x43\x37\x88\xf0\x50\x7f\x82"
- "\xc8\x5f\x6b\x24\x96\x17\x96\x71\xde\x33\x02\x7f\x48\xbb\x4a\xd1"
- "\x6d\x8d\x5b\xa7\x9b\xde\x77\x4c\x27\x2f\xad\x21\xa6\x6d\x74\x1b"
- "\x07\x1e\x3f\xa5\xb7\x1d\x34\xe5\x75\x70\x3c\xef\xd5\xe4\xe2\x58"
- "\xe3\x70\xf6\x29\x28\xfe\xc5\x11\xe3\x5d\x74\xc4\x31\x99\x14\x6d"
- "\xd7\xf8\x40\xdb\xdc\x88\x79\xc3\x51\xa6\x2f\xcb\x8a\x70\x4f\x9a"
- "\xac\xc5\x64\x3a\xaa\xfc\x5b\x8a\xf7\x8a\xca\x49\x93\xa5\x2c\xaf"
- "\x96\xb1\x33\x58\x06\x8e\x33\x8d\x58\x2f\xb2\x2c\xb1\x0c\xb0\x3c"
- "\x29\x1a\x39\x66\x47\xd0\xa8\x89\xe9\xa3\xd1\xe9\x60\x8c\x2e\x5f"
- "\x6c\x2b\x9c\xae\x74\xb1\x2d\x7d\x4c\xc1\x44\x19\x00\xc5\xf6\xe0"
- "\x8c\xa9\xb6\xdc\xe9\x63\x1c\xf6\x71\x73\xd5\x65\x46\xee\x6c\xbe"
- "\x0e\x8e\x9e\x77\xd9\x50\xcf\xc1\xe8\xb9\x5b\x59\xb6\xd2\x1f\x8e"
- "\x63\xde\x84\x24\xb9\x2e\xc5\xf1\x48\xb7\x2d\x27\x0a\x01\xef\xad"
- "\x67\xd0\xa7\x96\xcc\x13\x1c\xff\x76\x1e\xe6\x8c\x73\x2f\x8a\x6f"
- "\xea\xf0\x6e\x0f\xd2\x87\x16\x71\xdc\xfc\xbf\x89\x70\x72\xe6\x09"
- "\x9e\xdb\x8b\xca\x51\x35\xbe\xe4\x6a\x93\x2f\x79\xfb\x71\x5f\xf2"
- "\x94\x7d\xb3\xc6\x3a\x45\x97\x6b\x6d\x9a\xde\x2e\x5e\x03\x40\x7f"
- "\x9e\x98\xe7\x10\x21\xa6\x51\xbe\x83\x63\x54\x03\x76\x22\xaf\x01"
- "\xac\x45\xfb\x97\x55\xa8\xf9\xe5\x5a\xf0\xff\xca\x0e\x4d\x97\xe5"
- "\xe2\x19\xf6\xdf\x9d\x07\x64\xbf\xba\xac\x32\xb6\x75\x78\xe3\xed"
- "\x8f\x88\xca\xed\xc7\x75\x98\x80\x75\x8d\xda\x0f\x57\xf0\xbe\xab"
- "\xbf\x65\xb8\x6a\x52\x9b\x39\x41\xc5\x0b\x84\x8c\x97\xd7\x19\xc2"
- "\x79\xbd\xfe\x13\x78\x37\x74\x83\x85\xfd\x2b\xf2\xc0\x7b\xe5\x9c"
- "\x47\x7f\xb7\xcd\x15\xf6\x6e\x33\x84\x03\xe8\x47\x8b\xb2\x9f\x3b"
- "\x58\x7f\x62\x6e\xb9\x2e\x55\x1f\xd7\xe4\x78\x68\xa0\x72\x35\x9f"
- "\x59\x77\x27\x97\xbb\xe0\x32\x62\xce\xe0\xd8\x3b\x2a\x55\xce\x51"
- "\x02\x61\x57\x02\x29\x1f\xd7\x75\x83\x74\x1d\xcb\xfb\x68\xe6\x0d"
- "\xc2\xc7\xeb\x88\xe6\xa0\xf0\xc9\x18\xec\x3c\x76\xd0\x19\xf2\x94"
- "\x76\x95\xb3\x8f\x9d\xb4\x81\x50\xaf\x1a\x37\x42\x6a\xdc\x40\xfd"
- "\xbe\xc4\xdb\x17\x62\x7c\x48\x38\x43\x6b\x5b\x19\x7f\xa6\x0d\xaf"
- "\xc7\x87\x41\x2b\x0f\x8f\x93\x4c\x9f\x94\xc9\x05\xec\x1b\xc1\x6d"
- "\x35\x07\xd1\xe6\xc8\x76\x19\xc2\xde\xad\x2e\xb4\xcb\x80\x76\x39"
- "\xce\xb2\xcc\x04\xd8\x67\x05\xf2\x36\x4c\xc6\x39\x96\xf3\xe7\x75"
- "\x81\xc8\x36\xb2\xfe\x57\x6d\x78\xf9\xc6\x78\x6d\x14\x06\x6e\xa3"
- "\xa4\xc1\x59\x4d\xde\x24\x9e\xac\x3f\x3a\x68\x5d\xc3\xd0\x0d\xec"
- "\x2b\x92\x79\x02\xfa\x6d\x06\xf7\x21\xc6\x4f\x37\xe3\x19\xaf\xbf"
- "\x18\x9e\x82\xf5\xf2\x21\xf3\x86\xf2\x85\x5d\xae\x97\x37\xc5\xa7"
- "\xf7\xcb\xef\x5e\x99\xde\x2f\xaf\xe5\xf2\x8c\x07\xef\x01\x98\x83"
- "\x98\xac\x83\x6f\x31\x5f\xab\x88\x57\xef\xd0\x0d\xf5\x8c\x57\xdc"
- "\x77\x82\xe5\x45\xd3\x41\xe0\x43\x01\x39\x11\xac\x93\xba\x5c\xa5"
- "\xbd\xeb\x5f\xe6\x04\x5b\xa2\xd4\x0f\x06\xe1\x8e\x07\xc3\xbc\xc1"
- "\xcd\x7b\x21\x33\x50\x7f\xdc\xf7\x61\xfe\xa6\x83\x3b\xb3\x31\xbc"
- "\xf1\xfb\xa3\xcc\x09\x74\x9f\x2f\xf1\xfb\x83\xcd\x8e\x60\x1a\xd3"
- "\x10\x30\x1d\x90\xe3\xf1\x3c\x4f\x55\x6b\x17\xa5\xb0\xff\xb7\xc8"
- "\x78\xdc\xbe\xe4\xcc\x46\xb5\xb7\x50\x8a\xf1\xaf\x7a\xb6\xbe\x7e"
- "\x8b\x67\xe8\x97\x2f\x0b\x95\x5c\xde\xb4\x53\x54\x4d\x29\x09\xbb"
- "\xcc\xc2\xb6\xce\x0c\x3b\x72\xfd\x63\x61\xc1\x71\xfe\xa7\x94\xf4"
- "\xf1\x89\xf2\xa3\xd1\xf9\x04\xe5\x83\xf1\x79\x60\xfd\xcd\x57\xe6"
- "\x81\xd2\xaf\xf9\x3d\xd3\x5d\xcd\x55\xd6\xcf\xd4\xed\x14\xb1\xf1"
- "\xa6\x9d\xb6\x32\xae\xbf\xb4\x55\xd5\xcd\x34\xc9\xe6\x7d\x85\xd9"
- "\xa0\x4b\x39\xf2\x16\xe9\x7a\x80\xf9\xc5\x1c\xe2\x6f\x20\x90\xe4"
- "\x69\xbc\x83\xfd\x53\xe4\x55\x6b\xa5\x59\x19\xf2\x7b\x81\x2e\x87"
- "\xdd\xe7\xb4\xef\xc2\x38\x4c\xfe\xe4\x49\xd3\x90\xe7\x80\x97\x1a"
- "\x65\x3c\x23\x8c\xc1\x93\xa1\xb3\xb3\xaa\x95\x9f\xac\x49\xc6\x11"
- "\x82\x4c\x73\xec\x20\x96\x6b\xa4\xa5\x02\x6f\x8e\x23\x84\xf9\xce"
- "\xfa\xf6\xde\x71\xc9\x95\x0d\x5d\x21\xe4\xb7\x77\x30\x2e\x8d\xe8"
- "\x04\xed\xde\x30\x84\xf7\x5d\x9a\x68\x25\x6e\xf3\xa5\x8d\xc3\xf7"
- "\xfd\x64\x02\x19\xff\x1f\xeb\xb3\x54\x34\x89\x52\x37\xdc\x65\xa4"
- "\xff\x93\x45\x06\xa6\x83\x97\xd6\x07\x14\xed\xca\xb2\xf4\xfe\xf1"
- "\x52\x69\xbd\xd4\x9d\x1b\x9f\x6a\x9f\x17\x14\xdf\xa8\xf5\xd0\x32"
- "\xe8\xbf\x17\x8e\xab\xf7\x8e\xc6\xd8\x35\x20\xb6\xe7\x6d\x4b\x8b"
- "\x6d\x05\x2b\xd6\x2c\x1f\x39\x32\x6a\xae\x64\x94\x67\x63\x5c\x65"
- "\x85\x6a\x3c\x2d\xeb\x8d\x7f\xc4\x76\x09\x9e\xd1\x7e\xc7\x65\x31"
- "\xce\x67\xe7\x6b\xee\xcf\xf9\x19\xd4\x77\x9f\x49\xb3\x33\x23\x1e"
- "\xef\xa0\xd9\x93\xee\xc8\x7f\x64\xf1\xa2\x82\xb5\x11\xa9\x77\x46"
- "\xae\xeb\x6d\xdb\x89\xba\x13\x87\x3f\x00\x5d\x91\x30\xf7\x65\x1e"
- "\x5b\x9c\x6f\x94\x05\xc5\xdf\xa1\xaf\xb3\x20\x63\xf9\xcd\x25\x41"
- "\x6a\x86\x2e\x13\x37\xb1\x0e\x1f\xa8\xce\xfc\xc1\x9e\x02\x6f\x99"
- "\xd1\x76\x1f\xec\xba\x8b\xbc\x3e\x83\x72\x1f\xb7\xd4\x70\xac\xdf"
- "\x29\xda\xda\xbd\xb3\x04\xe9\xc9\xb8\xee\xc6\xf5\x1a\x5c\xdf\xb6"
- "\x2d\xc7\xbc\x87\x7d\xac\x57\xb3\x8f\xb5\x53\xfa\xba\x4c\xf0\x97"
- "\x13\xfb\x8a\xe0\xfd\x38\xb6\x41\xbc\xe4\xe4\xef\x83\xf1\x37\xe9"
- "\xb2\x91\xb6\xca\xf6\x02\x65\xf0\x55\xc8\xfd\x23\xcc\xc0\x2a\xa7"
- "\x1c\x10\xbb\xf2\xf8\x5b\x5a\x69\x48\xff\x73\x62\xc2\x17\x94\x68"
- "\x1d\x18\xea\x72\x39\x5b\xbd\xf4\xe2\x66\xa6\x53\x7f\xdf\xfe\x64"
- "\x3a\xc7\xda\x87\x7d\xb6\xe1\x4f\x49\xda\xb7\x9a\x3d\xb7\x47\x8e"
- "\x0b\xe5\xe3\x22\x6c\x3a\xde\xbf\x1c\xac\xec\x13\x11\x52\xf6\x69"
- "\xf9\x6c\x5d\x0e\x70\x9f\xa7\xf3\x69\x54\xdc\xb5\xe5\x25\x8b\x57"
- "\x2e\x2e\xb0\x8d\x29\x1e\x4c\x11\x51\xd7\xec\x8b\x97\xdb\x56\x2e"
- "\x7e\x69\xd5\xe2\x62\x19\x31\x8d\xdf\x46\x8d\xf9\xa9\x22\xe5\xce"
- "\x36\xfd\x3c\x90\x6d\x38\xd3\xb7\xfc\x13\x8e\xd5\x25\xaa\xee\x2a"
- "\x60\x9f\x0e\x35\xdf\xd8\x9f\x13\x3d\xdf\x70\xe5\x2a\x3b\x6f\x4a"
- "\xbd\x9a\xeb\x6c\xf8\x92\x9f\x4f\xd1\x06\x7b\x5f\x5c\xf0\x0d\x37"
- "\x82\x96\x06\x45\x37\xd3\xe9\x2e\xd7\x06\x8b\x4e\x37\x2f\xb9\x6a"
- "\x34\x5b\xaa\x43\xea\x0f\x8c\xb1\xd0\x7f\x51\xe3\xab\xfa\xe6\xe7"
- "\x06\x2b\x78\x23\x51\xae\xf7\x26\x4f\xe1\xd8\x34\x06\x86\x79\x1a"
- "\xe5\xd1\x3f\xf5\xd0\x9b\xac\xdf\x2a\x74\x78\xa8\x93\xb8\x3e\x6d"
- "\x1e\x74\x03\xca\xcb\xfd\xf0\xb0\x7b\xca\x5e\xd6\x29\x1c\x5b\x22"
- "\x5c\x09\x38\x72\x1f\xcf\x55\xc3\x36\xa6\x8c\x4d\x0f\x58\xbc\x4e"
- "\x0b\x3d\x77\x90\xbf\x0f\xcb\x69\x2a\x66\x58\x79\x01\xaf\x0d\xa3"
- "\xae\x5a\xe0\x7f\xbc\xcf\xe7\xdd\x55\xc3\x76\x27\xc3\xf5\xd2\x86"
- "\x6a\x86\xa7\x62\xa2\x6d\xf0\x7b\xa9\x2c\xd8\x67\x3f\xb9\xb2\x22"
- "\xe6\x65\xc0\x47\xe1\xe9\x07\x2e\x32\xfe\xa6\xf2\x41\x94\xed\x66"
- "\xfd\x59\xad\xb5\x5d\x6f\x4f\x97\xcb\x05\xfd\xe7\x6c\xd7\xf7\xd6"
- "\xbd\x5a\xbb\x19\x3f\xc6\x3d\x12\x67\x0d\xdf\x22\xc6\x17\xe5\x4a"
- "\x23\x64\x9b\xd7\x65\x06\x20\xcd\xdd\xe7\xdb\x5c\xde\x1a\xab\x37"
- "\x56\x2c\xb7\x15\x2e\x5d\xfe\x62\xfe\x9a\x45\x2f\x2e\xce\x5f\x55"
- "\x34\xce\xb6\x6a\xf9\xb3\x85\x2b\x9e\x7b\x91\xb9\xa6\xb8\x64\xd5"
- "\x73\x2f\xda\x58\xb3\xe4\xcf\x9c\x3d\x3b\xff\x81\xc7\x1e\x7d\x62"
- "\x30\x3d\xb0\x08\x69\x98\xf9\xcf\xce\x18\xa7\x5e\x3d\x32\x6b\xc6"
- "\xe3\xf9\x33\xe6\x3d\x36\x77\xbe\x3c\x0c\xd1\xfb\x7e\xe6\xf2\xf8"
- "\x19\xa2\xf8\xd0\x02\x5e\xaa\x45\xff\x0e\x38\x45\xaf\xa6\xaa\x38"
- "\xda\x1b\x67\x46\xc7\xd1\xde\x88\xb9\xec\x46\x58\x99\x1b\xab\x89"
- "\x36\x1d\xc5\x0f\x36\xc0\xab\x26\xc5\x5f\x83\xe6\x75\xb9\x36\x16"
- "\xf5\xf1\xd7\xab\xa9\x72\x7f\xbc\x46\xee\x3b\x1b\xf0\x0e\xfa\xbf"
- "\xdc\x1d\xf9\xae\x6f\x3e\xb9\x71\x5f\xef\x7c\xb2\x57\xa7\x6c\x3c"
- "\xa1\xcf\x2d\x91\xb6\x0f\xf3\xca\x41\x3c\xaf\x54\xeb\x49\xaf\x5e"
- "\x2f\x79\xaa\x5f\xf9\x36\x91\x3e\xaf\x64\xd9\xe6\x7d\x62\x35\xff"
- "\xd8\x64\x89\x94\x71\x19\xbb\x51\x93\x71\x2e\x27\xd7\xef\x2c\xfb"
- "\x27\xf3\x9a\x36\xec\xe3\x5a\xd8\x0a\x18\xbf\xba\x84\x48\xde\x3f"
- "\x59\xe1\xb4\x29\x97\xd7\xb8\xd9\x6e\xd6\xf8\x69\xe8\x19\xda\xb4"
- "\x45\xb8\x5c\x7b\xd5\x9c\xd2\xf5\x39\xeb\x75\xb1\x71\xf8\x03\xec"
- "\x7f\xc2\x73\x27\xd4\xb9\xa9\x8f\x67\x5f\x4d\x65\x5e\xe8\x9b\xcb"
- "\x6e\x8a\xd2\xff\x9d\xf2\x7b\x75\x9b\x0e\xea\x71\x00\x4a\x46\x92"
- "\xc1\x38\xd2\x4d\xd5\x06\x51\xee\xa5\x4d\x05\x5c\x07\xd3\xd3\x4b"
- "\x1b\xcb\x91\xd7\xd8\x47\xbf\x4d\xed\xbd\xf4\xd3\xd6\x59\xf4\x35"
- "\x16\x85\xf7\xab\xd7\xf7\x47\xab\xf8\x74\x7a\x25\xeb\x5b\xe9\xe4"
- "\xa2\x01\x2c\x93\x3a\xbd\x2e\xa7\xd5\x2b\xa5\x97\xd3\xea\x95\xe6"
- "\x08\x5a\x5d\xbc\x9c\x56\xaf\x1c\x88\xd8\xf7\xd1\xd6\x51\x5e\xbd"
- "\x9e\x69\xc6\x3c\x86\x76\x17\x80\xcf\x5e\xeb\xa3\xdf\x2b\xde\xcb"
- "\xe9\xf7\x8a\x3f\x3e\xfd\x5e\x71\x8f\x8a\x86\xb3\x2d\xde\xb8\x31"
- "\x74\x83\x41\x3b\x27\xf4\xea\xd2\xa6\x11\x72\x4e\x1a\xd8\x6e\x08"
- "\xdb\xb7\xbb\xf0\xc3\x95\xe7\x11\x7d\xb6\xb8\xd0\xe6\xd8\xaf\xda"
- "\x9b\x30\xe7\xe5\x75\xa5\x2b\x8c\x45\x27\xf5\x35\x0f\xdc\xb7\xf2"
- "\xdc\x99\xbf\x15\xc4\xe9\x4c\x4f\xfe\xf6\x14\xf8\xbd\x55\xd9\xa5"
- "\xaf\x1e\xea\x5d\x73\x99\xf0\x40\x7d\xe2\x06\xb2\x1d\xa9\x9d\xc4"
- "\xe9\xc7\xc1\x43\x72\x0d\x89\xfd\x7b\xfa\x83\x99\x1f\xca\xa6\xf8"
- "\x70\x7f\xd2\xcb\xff\xfd\x9d\x95\x8d\xd1\x47\xf6\x45\xcb\x0b\x56"
- "\x2c\x59\xf2\xed\xaa\x28\xd2\x77\xc7\xed\x0a\x57\x74\xf1\xf7\x18"
- "\x37\xbe\xb0\x0e\x75\xc2\xfe\x5f\xd6\xa8\xc6\xcd\x9f\x40\xff\xd9"
- "\x1d\xca\x96\x7c\xaa\x5d\x9d\x0f\xfe\x49\x47\x84\x7e\x06\x8f\xfc"
- "\x24\x20\x5c\x3f\x99\xdc\xd7\xc7\x3f\x69\xba\xbc\x8f\x7f\xd2\x1a"
- "\xbf\x8f\x7f\x12\x0c\xaf\xe6\xf3\x19\x3f\xe1\xf9\x8f\xb4\x35\xf9"
- "\x99\xf7\xcb\x31\x67\x6e\xc7\x7c\xb9\x63\xde\xda\xc6\xfb\xf2\xd7"
- "\x26\xb0\x5f\xb9\xfc\x26\x47\xf0\x92\x68\xe3\x3d\x6b\xde\x1f\xe3"
- "\x6f\x72\xf0\xb7\x78\xf8\x5b\xad\x32\x0f\xee\xb7\x9d\x26\x39\x77"
- "\xc4\x7b\x5b\xdd\x69\xf9\x5d\x62\xd8\x0a\x15\x79\xba\x6d\x6d\xde"
- "\x60\x93\xe7\x96\xb7\xaa\xfe\x68\xe5\xbe\xe0\xfa\xf2\xd7\x36\xaa"
- "\x3a\x2e\xf1\xf7\xb6\xc8\xac\x6c\x88\x0a\xf7\x15\xd7\xee\x93\xb7"
- "\xf7\x77\x9e\x1a\xf2\x52\x3e\x70\xbb\x8a\x69\xcd\xbe\x9c\x3e\xdd"
- "\x57\x87\xfd\x0a\x01\xb7\x3d\xd6\x2f\x51\xf9\x97\xbc\x46\xba\xdf"
- "\x0e\xee\x93\x7a\xe7\x03\xfc\x1d\x17\xcc\xe3\x6c\x65\x1b\xae\x39"
- "\x47\x15\xcd\x75\xfd\xac\xa1\xeb\xe7\x94\x35\x3f\x9f\x81\x80\xd1"
- "\xeb\xff\x88\x71\x6e\x20\xeb\x8b\x3e\x9f\xc6\xd7\x0a\x23\x7c\xd7"
- "\x7c\x3c\xf6\xf2\xb7\x62\x4e\xd3\x6b\x5b\xe4\xb7\x69\x46\xf1\xfa"
- "\xf7\x6b\x0d\xea\xbb\xc0\xaf\xd5\x44\xe2\xa2\xf0\x78\xed\x09\x5e"
- "\xa3\xe5\xf7\x91\xb8\x38\x16\xad\x5a\x3a\xd1\xb1\x64\xa9\xed\x39"
- "\xfb\xd2\xa2\xfc\xa5\x32\xb6\xac\x0c\x5b\x5b\xb2\xb6\x88\x77\x24"
- "\xc6\x0e\x8e\x19\xc3\x34\xdf\x49\xdd\x07\x46\xf9\x4f\xfe\x34\x19"
- "\xf4\x30\x28\xff\xc9\xd7\x8d\x6a\x5c\xff\xe9\x88\xcb\xfd\x65\x7e"
- "\x9a\xa1\xfb\xcb\x80\xaf\x2c\xd5\x2a\xa6\xbd\xe6\x63\xc3\x7c\xf7"
- "\xd3\xdc\x38\x65\x7a\xfd\x3f\xf9\x7b\xb6\xfc\xed\x59\xde\xd7\x96"
- "\xf1\xc7\xab\xb8\xdf\x5e\x3b\xe4\x71\xcc\xe2\x18\xaa\x1a\x3f\xff"
- "\xb4\x5a\xe7\x67\xdd\xcf\x92\x61\xf1\xb9\x95\x89\x81\x48\x3f\xa3"
- "\x9f\x7e\x83\x31\xcf\xda\xdb\x8e\x97\x0d\xc4\xb8\xfb\x0d\x8d\x8c"
- "\x47\x6b\x2c\x1e\xc0\x6f\x24\xd2\x7d\x7d\x7e\x5a\x7a\x3b\x5f\x37"
- "\xe2\x3e\x2f\x96\xe7\xee\x9f\x35\x1b\x46\x69\xf1\xe2\x92\xc1\x34"
- "\x63\x51\x61\x21\xcb\xf5\xa2\xc5\x85\xab\x56\xae\x28\xce\x5f\xba"
- "\x7c\x29\x52\xef\x5f\xc2\x21\x7f\x65\x96\xa9\xda\x1b\xdb\xf2\xc5"
- "\x8b\x0b\x54\x92\xd6\x0d\xd1\xfb\x40\x6a\xef\xfe\xf5\x12\x2f\xbd"
- "\x36\xae\xcf\xfe\x7a\xfd\x98\x30\xbc\x6e\xc1\xef\x26\x29\xd3\xd2"
- "\x36\x7a\xbd\x26\x7a\xde\xf3\xfa\x3e\x9d\x1f\x64\xff\x39\xd9\xd7"
- "\x27\x33\xb3\x53\xc8\x7d\x13\xf4\xd9\xe6\x10\x7f\xd3\xdb\x4b\x9b"
- "\xa5\xbd\x1f\x01\xa7\x57\xff\xf3\xb9\xfd\x8d\xca\x4f\xc0\xc8\xdf"
- "\x07\xe5\xf3\xfb\x5d\xae\xcd\xe0\xff\x8a\x83\x8a\xff\x37\xf7\xf2"
- "\x7f\xa7\x21\x11\x73\xb8\xcd\x23\x74\x7b\x3e\x5a\x66\x36\x4f\xbe"
- "\x5c\x96\xd8\xc7\x6d\xf3\x6c\x9d\xb6\x7a\x3f\x2b\xde\xda\xfc\x95"
- "\xbe\x0e\x5b\xa7\xc5\x9f\xe7\x7b\x2e\xcb\xb6\xba\x18\x3a\xe4\x3e"
- "\xf6\xc7\x3f\x45\x9b\x0f\x29\x7e\xd9\x5c\x1d\xe1\x93\x65\x39\x43"
- "\x9b\x0f\xaa\x7e\xda\xdc\xa0\xe3\x87\x76\xca\xfd\x00\x86\xa1\x64"
- "\xff\xf5\x4c\xc5\x3b\x9b\x8f\xeb\xb4\xe5\x79\x31\x9e\xbd\x7d\xb6"
- "\xc5\xeb\xe5\xd2\x47\x42\xc5\x2f\xe8\xe1\xf6\x03\xce\x42\x1d\x4e"
- "\x97\x6b\x0b\xda\x6f\x6a\xd2\x69\xa5\xe7\x89\xe4\x89\x19\x8b\x8a"
- "\x30\x69\x5d\xba\x64\xc9\xe2\x95\xc5\x7a\x4c\xe7\xf4\x15\x85\x05"
- "\x2a\x86\xf3\x54\x74\xff\x1a\x48\xe0\x74\x0e\x03\x8d\x54\x75\x1b"
- "\x63\x43\x8e\xe3\x75\x06\xe9\xb7\x27\xe7\x31\x95\x5f\xed\xd1\xe6"
- "\x34\xa7\x68\x6b\xa9\xf2\x7d\xd9\x3a\x5d\xd9\x8b\xd7\xae\x01\x4e"
- "\xf5\xba\xbd\xc8\xeb\x97\x9d\x34\x32\x8f\xcf\x23\xb1\xdf\xf6\xee"
- "\x37\x45\x1b\xaf\x57\x22\x4f\x93\xfe\xdd\x2f\xb6\x45\xb6\xa8\xef"
- "\xb1\xfb\x1a\x97\x73\xcc\xfc\xaa\x41\xe1\xca\xcc\x03\x22\xc5\xe6"
- "\x85\xcd\x93\xc4\xb2\x30\xa4\x83\x7d\x27\x39\xce\xd0\x56\x0b\xdb"
- "\x4a\xac\x5f\x38\x36\x7e\x1b\x6d\xf1\x62\x7e\x83\xf1\xaf\x2a\xc9"
- "\x97\x9c\x79\x60\xd3\x3a\x32\x71\x1d\xd0\x4d\xde\xa6\x7a\xa6\xed"
- "\xd6\x71\xbf\x83\xee\xd1\xd6\x77\xbd\x5c\x8f\x97\xb6\x04\xb4\xb5"
- "\xf4\x26\x6d\xed\xb2\x09\xf9\xe6\x7b\x69\x88\xf6\x4d\x9d\x51\x3f"
- "\xbe\xad\x9c\x1c\xfc\x1d\x40\x15\x23\xe8\x1e\xfe\x96\x6b\x1e\x7f"
- "\x6f\x0f\xf6\x15\xe6\x10\x5b\xea\xd1\x86\x3c\xcd\xf7\x16\xbc\xb2"
- "\xf5\x1b\xe5\x53\xbd\xc5\xcd\x34\x00\xdc\xe3\x1a\xdc\xe3\x80\x8b"
- "\xfe\xbf\x49\x8b\x4d\xbc\xf5\x90\x5e\x07\xc6\x14\x1f\x6c\xd1\x1a"
- "\xb6\x47\x81\xf7\x3e\xfc\x1a\xb6\xc9\xfd\x69\x2f\xe6\x2d\x66\xc1"
- "\x7e\x43\x7d\xdf\x36\xdb\xea\xd3\xc7\x17\xae\x5b\xc3\xfd\x18\xaf"
- "\x9f\xf1\xda\x99\x56\x17\xef\xb7\x25\xe8\x30\xf1\xbc\x2f\x7c\xe9"
- "\x6c\x3d\x60\x9a\x30\x56\xfa\xb4\x6f\x5a\x35\x6c\xbb\xc0\x3e\x66"
- "\x5e\x8c\x85\xb7\x8a\xfc\xa0\x85\xf7\x75\x86\xe8\xdf\x0c\xab\xbb"
- "\xc0\xf4\xda\xb6\xa0\x6f\xbf\x06\xe5\x41\x7f\xc8\x43\x79\x1b\x6d"
- "\x93\xdf\x49\x63\x59\xe0\xbe\xec\x46\xdf\xf0\xb7\xed\xc5\xa5\xb3"
- "\x07\x30\xcf\x1f\x72\x9a\xb6\xed\xe0\x3e\xe2\x3d\x56\xf6\xfd\x42"
- "\x9a\x99\x63\x9c\x9f\xa2\x6d\xaf\x70\xff\x30\x2e\xc2\x3d\xf2\x50"
- "\xb0\x2b\xef\x07\x7c\xbe\x95\xf5\xe1\xfa\x52\xd8\xb1\x4b\x58\x97"
- "\x54\x0e\xe2\x79\x31\x7f\x9b\x86\xef\x9d\x05\x22\x2c\xfb\x77\x1d"
- "\xf7\x6f\xe5\xa0\xf5\xed\x22\xfc\x8d\x8b\xc4\x51\x3f\xd1\x37\x06"
- "\x0a\x06\x0c\x09\x8c\xb7\xc1\x79\x96\xcf\xe0\xd6\x93\xc7\x51\x41"
- "\xa8\xd7\xb4\x75\x1d\x59\xf8\xfc\x32\x7f\x77\xa5\xc5\x5f\x4b\x2d"
- "\x45\xb5\xf4\x6f\xc1\x6a\x6a\x5c\xcd\xb1\x28\x2a\x0f\xfc\xbb\xa3"
- "\x9a\xf7\xad\x06\xe1\xfe\x25\xdb\xe3\x5c\x97\x3b\xe7\xdf\x4f\xfc"
- "\x89\xfe\xbd\xf1\x4f\x64\x7b\x52\x3e\xe7\x1d\xcb\xfb\x37\x3a\x96"
- "\xfd\x6f\xe4\x6c\x13\x61\x9e\x2b\x95\x2d\xe3\x3a\x2a\x00\xab\x9e"
- "\xcf\xfa\x5a\xc2\x9d\xd6\xc1\x68\xbf\x91\xd7\xe4\x5b\xfc\x3e\x6a"
- "\x5c\xfe\x1b\xe0\xe8\xfe\xf3\x9e\x0b\x64\x6a\x5c\xfe\x7b\x79\xaf"
- "\xe6\x30\x67\xeb\x3d\x05\xad\x6c\xa7\x05\xf9\x9c\x33\xef\xf3\xc1"
- "\x6e\x0f\x6f\x63\x1c\x43\x0a\x6f\xfe\x66\xbb\x5e\x1e\x76\x9c\x5e"
- "\x5e\xc6\x8a\xda\xcd\xf4\x00\x4e\xcd\xf3\x15\x4d\x8e\x61\x56\xa9"
- "\x70\x06\x7d\xf2\x22\xe9\xb3\x2d\xc0\xf4\xe1\xf8\x98\x61\xf4\x17"
- "\x70\xcb\x06\x0d\xc2\x7a\x1d\xc0\xd9\xa4\xad\x8b\x9a\xb6\x5e\xa0"
- "\xa4\xc6\xe5\xfc\xdd\xad\xca\xa7\xcd\xb9\x46\x53\xf8\xd2\xb9\x03"
- "\xdb\x2e\x92\x91\xfb\x8d\xf7\x42\xb6\xc9\xf7\x92\xe6\xd9\xdc\x67"
- "\xe0\x49\x1b\x7e\x69\xf8\xa5\x33\xdf\xe1\x3a\x0e\xfd\x55\x01\x3a"
- "\xb5\xa2\xaf\xea\xf9\xaa\x78\x71\x54\x1e\xc7\x80\xd0\xe6\x25\x7d"
- "\xe9\x90\xa3\xa0\x90\xdf\xb6\x85\xcc\xb8\x5b\xc3\x90\x23\x5e\x17"
- "\xd9\x53\x45\x49\x61\xd7\x96\xb4\xdd\xd0\x75\xb5\x55\xf2\x0c\xa8"
- "\x85\xd7\x0a\x77\xca\xef\x18\x54\xf6\x9e\xff\xfc\xe9\x30\x3e\x27"
- "\x57\x69\x32\xf0\x5a\x8a\x3b\xf3\xa8\xc6\xe7\x47\xbb\x5c\x55\xd0"
- "\xff\xc3\x34\x5f\xd2\xad\xf2\x1c\x2e\xcb\x7e\x7f\x36\x3a\xec\xc3"
- "\x63\x62\x57\x1e\xf1\x9e\x4a\xd2\x06\xe1\x4b\x6a\x33\x8b\x16\xff"
- "\x31\x79\x3e\xb2\xc5\x1f\x92\x7b\x2a\x78\x9f\x30\xd7\xef\x33\xc3"
- "\x9e\x3c\xce\xb4\xd3\xd3\x79\x3f\x86\xd7\xaa\xe6\xfa\x85\x6f\xde"
- "\x5a\x33\x7f\x77\x70\x84\x5c\x8f\xd7\xd2\x5b\xac\xb0\xc5\xd7\xfa"
- "\xcc\x68\x7b\xb0\x17\x56\x67\x5e\x22\xcb\x1b\xf2\xa6\xf6\xe6\xed"
- "\xcc\x33\xf2\x77\x74\xb9\xce\x88\xb4\x01\xf3\x1c\x28\xcb\x7d\xa5"
- "\xa5\x29\x3b\xb4\xaa\xf7\xfb\x8f\x6c\x7f\xb2\xcf\xb4\x28\xce\x4b"
- "\x08\x77\xe6\x19\x42\x80\x0d\xde\xb7\xc8\xef\x1f\x06\x7d\xda\xf7"
- "\x84\xda\x21\xbf\xad\x24\x2a\xf7\xe7\x22\x9f\x91\xe1\xf2\xb9\x7b"
- "\xfe\x0e\x83\x48\x7e\x2f\x6e\xec\x16\xe1\xde\x61\x6a\x2c\x7b\x12"
- "\xfc\xb4\xbd\x9d\xe5\x39\x64\x99\x74\xc2\xf6\x02\xdb\x27\xdb\x17"
- "\x31\x3d\x43\x90\xb1\x50\xf2\xa4\x13\x13\xdb\x29\xa1\x0c\x7c\xab"
- "\xd6\x75\xb6\x6f\xf0\x40\x06\x9d\x61\x01\x9b\x6f\x7b\x09\xf3\x8d"
- "\xb9\x83\xfd\xcf\x26\xb5\x4a\x9f\xaf\x94\x37\xc8\x13\x68\xa7\x63"
- "\xe5\x7f\xa1\x63\x41\x4f\xf9\xe1\x0b\x3e\xa3\xf2\xfd\x32\x32\xdc"
- "\x37\xf8\x9d\x13\xbc\x9a\x1f\xaa\xa7\xfe\xd6\xdb\x79\xce\x89\x31"
- "\xec\x6f\x6a\xfe\xb5\xbd\x5d\x9f\x6b\x5e\xb9\x0d\xd5\xd9\x1c\xab"
- "\x40\x08\x2b\x85\xab\x8a\x33\x80\x8b\x53\x74\xa5\xd3\xc4\x75\xbc"
- "\xce\x55\x6d\x85\xdd\x9f\xad\xc1\x3d\xaf\xe0\x22\xff\x15\xe0\x32"
- "\xcf\x1c\xab\x91\x7b\x3d\x68\x53\xb1\x2d\x04\xd8\xa1\x94\xe2\x85"
- "\xd0\xf1\x4e\xe7\x37\xbc\x0e\xfa\xc6\x2b\xa8\xc7\xd6\x12\x3c\x4e"
- "\x1c\xf3\x64\x4f\x18\xe3\xe3\x79\x2b\x69\x7e\x6e\xce\x73\x54\xfd"
- "\x52\x58\xa4\x5b\x30\x07\xe6\x3d\x0e\x27\xeb\x38\x9e\x5f\x97\x85"
- "\xe8\x1a\x0f\xac\x28\x3e\xa7\x0f\x18\x6b\xff\xc0\xfb\x49\xd0\x13"
- "\x21\x61\x35\x7c\x72\xc9\x4b\xec\xcb\x22\xcf\xed\x6f\xbc\x69\xe7"
- "\xd0\x0d\x74\x9f\x30\x98\xa5\x1f\x63\xb8\x72\x7b\x16\xfa\x36\x4f"
- "\xf9\xd5\x65\xb6\x46\xf8\xd4\x25\xa2\xae\x8b\xec\x53\x27\x2c\x99"
- "\xb5\xb5\x72\x2d\x6f\xd2\x89\x2e\xd7\x1b\x36\x2f\x6d\xcf\x60\xfe"
- "\xd9\xcc\xbe\xf5\x52\xc7\xbe\xb1\xc5\x97\xbc\x42\xb6\x89\xcf\x0d"
- "\x86\x57\x87\x0e\x6c\xfb\x9a\x8c\x8a\x1e\x6f\x2c\x6b\xe9\xe8\x6a"
- "\x14\xee\x15\xf2\xfb\x67\x1a\x6c\xf3\x39\x7a\x63\xba\xa8\x5c\x01"
- "\x59\x7b\x63\xb3\xea\x1b\x79\x9f\xc7\xef\x83\x3d\xe9\xb8\xaf\x3e"
- "\x51\xdb\xcd\xeb\xeb\xd5\xe5\xc2\x75\x6b\x63\xa7\x65\x05\x3d\x6a"
- "\x65\x9b\xea\x8d\x7a\xaf\xa1\x25\x43\x5b\x5b\x93\x31\x08\x62\xd7"
- "\xc4\x7a\xfb\x70\x97\x75\xb0\x07\x40\x30\x47\x4c\x3d\x43\x35\xc9"
- "\xdd\x2e\x32\xf4\xc0\x16\xec\x36\xc0\xe6\xdf\x95\x97\xb4\x75\x38"
- "\x65\xe0\xdd\xf0\x33\xf4\xc6\xc5\xa0\x81\x52\xf1\xb3\xf8\x6e\xb2"
- "\x0f\x02\xdc\x6c\x5e\x77\x6c\xbe\xc0\xeb\x46\x6f\x3e\x26\x6d\xb5"
- "\x9d\x94\x16\x06\x3c\xde\x43\xd9\x36\x9c\xd2\x78\xed\x0f\x69\xe9"
- "\xf9\x21\xb5\x97\xa8\xcf\xef\x37\x0e\xa7\x71\xd1\xf5\xbe\x71\x52"
- "\xad\x0d\xd6\xc8\x98\x69\x6b\x7c\x74\x4b\xd1\xbd\xfc\x9d\xca\x37"
- "\x8f\x0b\x57\xa2\x10\x37\x59\x0d\x6a\xbf\xff\xcd\x8f\xcd\x35\x8a"
- "\xef\xe4\xde\x19\xf8\x8d\xf7\x26\xb5\x7d\x9a\x04\x19\x7b\x21\x65"
- "\x4a\x01\x7f\xf3\x37\x62\xed\xd5\x22\xf1\xd0\xce\x4b\x87\x36\xde"
- "\xbe\x90\x61\x30\x3e\xf9\x8b\xd4\x1e\x0f\x9f\xa5\xf6\xd2\x9b\x32"
- "\x1e\xe3\xe6\x9d\x94\xf4\xfa\x4e\xb2\x34\x2f\x91\xed\x6a\x57\xb2"
- "\x68\x24\xc6\x37\xec\x66\x39\x03\x4f\x00\x6f\xae\x8f\x79\xa3\x25"
- "\x78\xbe\xd1\x59\x22\xc2\x8d\x2f\xb0\x2d\xfa\xd6\xd8\xc6\x95\x0d"
- "\x34\xaf\x2d\xa8\xce\xfd\x2d\x20\x5f\x1d\xe0\xd5\x0d\x27\xcb\x69"
- "\x7a\xeb\x4e\x4f\x21\xf1\x1e\xc0\xa8\xc6\x95\x07\x01\xfb\xad\x87"
- "\x78\x2c\xd8\x02\xfa\xa8\x31\xe1\xad\xa0\x27\xd0\x4a\xcd\x90\xef"
- "\xb9\x45\x22\xc4\x70\x90\x67\x83\x6c\xef\x2e\xab\x2d\x5f\x9d\x77"
- "\x97\x6d\xed\xdd\x3b\xd3\xda\xe1\xb9\x20\xe1\x55\x7b\x60\x95\xea"
- "\x6d\xd2\x69\xad\xf8\xeb\xad\x3f\x36\xae\xdc\x4b\xdc\x3f\x9c\x1f"
- "\xcf\x8d\x9e\x0e\xe4\x3d\x1b\xdd\x2f\x9c\x07\xef\xbe\x06\xdc\x29"
- "\x7d\xfb\xbf\xbc\x2f\xd9\x97\xa7\x76\x27\x9f\x03\x7a\x73\xf2\x2e"
- "\xd0\x48\xad\x97\xbf\xf5\x34\xe3\xea\xa5\xb7\x16\x78\x4a\xfe\x12"
- "\xdf\xcf\x13\xb2\x0f\xbe\xdf\xd0\x22\xf7\xc1\x6a\xe6\xcc\x0d\x86"
- "\x85\xd2\x67\x3b\x20\x5b\xd5\xe0\xdf\x1d\xc4\xba\x40\xea\x93\x09"
- "\xec\x5b\xb3\x23\xc1\x9c\xa0\xfa\x97\xdb\xc2\xf6\x4a\xbc\x3e\x8e"
- "\xd8\xa3\xb3\x30\xae\x7a\x1f\xf3\xf7\xf2\xc2\xbc\xcf\x3a\x1c\xf4"
- "\xee\xb1\x92\xe2\x3f\xe1\x46\xdd\x5f\x2b\x39\x9a\x64\xd5\xce\x90"
- "\x5b\x3b\x93\x27\x79\xf9\x5c\x9a\xee\x6f\x0b\xf9\x3d\x99\xaf\x7c"
- "\x98\xad\xac\xa3\xea\x0c\x4a\x76\x18\x47\xad\x6c\xaa\xf2\x73\xa8"
- "\x69\x44\xf9\xd4\xb8\xed\x4d\x84\xde\x71\x41\x4d\xa3\x3d\x6c\x47"
- "\x0a\xe8\x2a\x8c\x07\xd7\x78\xfc\xdd\xda\xb7\x0a\x77\xac\x87\x4d"
- "\x7d\x0d\x9f\x4b\xd1\x71\xbb\xba\xfd\xb4\x1d\x39\x6a\x6e\xb3\xa3"
- "\x42\x5f\xaf\x11\x16\xd0\xd8\x65\x16\x7c\x46\x8d\xcf\x1a\xf8\x93"
- "\x77\xc0\x7e\xd8\x9f\xad\xe4\x66\xc7\x01\x91\xac\xf4\x6d\x7e\x80"
- "\xbf\x11\x5f\xcd\xeb\xe6\x09\x98\x37\x5d\xc3\x6d\x06\x1c\xcc\x7f"
- "\x96\xa5\xaa\xf1\x7c\x47\xbf\xbe\xd7\x72\xce\xa4\xb7\x0d\x6d\x92"
- "\x6d\x43\x1b\x65\xdb\xb4\x6f\xf9\x9c\xa6\x9d\xf2\xec\xf2\xd5\xb5"
- "\x67\xa7\x55\xd1\x76\x87\x85\xbf\x53\x7a\x9a\x76\x7d\x29\xcf\x1f"
- "\xa0\x4f\xd4\xde\xc2\xce\x7a\x31\xf8\xf5\xc1\x57\x09\x53\xc5\x88"
- "\x76\xef\xcf\x7e\x83\xe3\xfe\x69\xdf\x03\x03\xec\x66\xe8\x72\x19"
- "\xe7\xb1\x13\xf5\xf1\xf7\x14\xfb\xf4\xd0\xae\x5c\xee\xab\x09\x0d"
- "\x94\xad\xf8\x70\xd7\x2c\x5e\xbf\x55\xf3\xbc\x9d\x7e\xe8\xde\x43"
- "\x6a\x4e\xa5\xfb\x66\x27\x48\xdf\xec\x48\x1d\x7b\x75\x38\xee\x92"
- "\xfa\x4e\xa4\xb0\xbd\xb1\xb3\x4d\x9e\x51\x03\xbe\x6b\x82\xba\xfe"
- "\xdb\xd9\xc6\x7e\x3e\xbd\x7b\xec\x6b\xc1\x2b\x65\xea\xcc\x6e\x97"
- "\x6b\xd7\x26\xdd\x46\x91\xdf\x7f\x72\x89\xa3\x9c\x6f\xde\xda\xf3"
- "\x72\x0f\x7e\x9b\x3c\x5f\x7e\x46\x3b\xdf\xb4\x6b\x87\xb6\x9e\x91"
- "\xce\x7e\xf1\x28\xdb\xe8\xa5\x4f\xa4\x3f\x0f\xd3\x80\xeb\x96\xb8"
- "\xcb\x6f\x30\xed\x3a\xd9\xb7\x97\xb2\xf3\x90\x4c\x97\xbe\xa2\xbb"
- "\xfc\x3a\x8f\xa0\xbd\xd7\xa8\x38\x8c\x3b\x9f\x3e\x32\x8e\x24\x0f"
- "\x74\x0a\xeb\xe0\xd1\xb5\xcc\x93\xb5\x23\x22\xe9\x34\x2f\x18\x76"
- "\x2a\x1d\xb4\xcb\x28\xa4\xac\xef\x32\x7e\xbb\x3d\x51\xfb\x92\x6e"
- "\x8b\x28\x3a\x5b\xa0\x5f\xea\xa6\x49\x5a\xbb\x47\x06\x38\x1e\xc6"
- "\xcb\x65\x1c\xdf\x67\x77\x26\xc7\x51\x0a\xba\x47\x59\x43\x7c\x16"
- "\x0e\xe3\x6c\xd8\x3d\x2a\xfd\x74\x11\x19\xf2\x8b\x78\xff\x68\xf9"
- "\x71\x9e\x5f\x09\x27\x6c\x81\x14\xd8\x27\x90\xf3\xf5\x4b\xc9\xfc"
- "\xb4\x1d\xb0\x9d\xe9\xa9\x1c\xe7\x88\x63\x1c\x71\x9c\xb2\x90\x33"
- "\x3d\x05\xf7\xc3\x60\xcf\x59\x84\x65\x94\x89\x7d\x50\x42\x2e\x01"
- "\x7d\x7c\x92\x63\x2d\x19\x3c\xbe\x00\xad\x3f\x4b\x26\x8e\xa3\x14"
- "\xac\x5c\xde\xde\xe2\xff\xab\x9c\x5b\x0c\x2d\x82\x3d\x1d\xa6\x11"
- "\xa0\xb9\x35\x9c\xbc\xfc\xb8\x2f\x79\xf9\x09\xd5\xee\xf3\x42\xb5"
- "\x5b\xe1\xcd\xf8\x2b\x1d\x97\x96\x5e\x26\x71\xdf\xf3\x79\x10\xf0"
- "\xc3\xee\xb1\x69\x21\xf7\x58\x9b\x3a\x43\x77\x8c\xca\x4a\x44\xbb"
- "\x07\xb6\x31\xfb\x44\xf2\x39\x49\xf6\x71\xe1\x36\x72\xfb\xb8\xee"
- "\x7f\xbf\x70\x56\xc6\x85\x0a\xe2\xd9\x59\xa8\x95\xe9\x40\x99\x8e"
- "\x63\xd4\xed\x1e\x2b\xdb\xde\xe2\x57\x65\xf3\xe5\x3d\x97\x8f\xa0"
- "\x83\xd6\xe6\x5e\x3a\xa0\xed\xdc\x3e\x6e\x7f\x90\x69\x02\x1a\x68"
- "\x6d\xb5\xf6\x68\xed\xe4\x36\xfe\x1b\x46\x9d\x9d\x68\x27\xda\x2a"
- "\xdb\xd9\x83\x76\x1e\xb5\x13\x05\xaa\x76\xd8\xbe\x49\x19\x6b\xe3"
- "\xf9\xa1\xf3\x8f\xb0\xa3\x4b\xdd\x84\x79\xa0\xf1\xbd\x32\xb7\xe1"
- "\xa7\xb0\x4d\xca\x7c\x98\x0f\xfa\x44\x3b\xdb\xfb\x9e\x22\xfc\x82"
- "\xb5\xd2\xc6\x91\xf6\x31\x7f\x8f\xf3\x25\xb4\x29\xfc\x25\x95\xb5"
- "\x8b\x76\xd8\xa6\x01\x4f\x10\x79\xec\x68\x3f\xe6\x8f\xa7\x35\xfc"
- "\x39\xef\xfa\xaf\x55\xbb\xcc\x85\x94\xfa\xd9\x93\x15\x06\x4f\x6b"
- "\x05\xe9\x6d\x79\x06\xf9\xd0\x1e\x2b\x60\x0d\x91\x31\xf0\xd1\xce"
- "\x5d\xc0\x33\x10\xd1\xa6\xe6\x8e\x00\x60\x7e\x4e\x83\x73\x29\x61"
- "\xe7\x39\xb4\xe3\x1c\x59\xdd\x65\xb0\xbf\x1e\x61\x7b\x71\xcf\x90"
- "\x6b\xf3\x28\xcd\x4b\xbb\x53\x15\xdf\xc9\x18\x2d\xd7\x9f\xa1\xba"
- "\x3b\x7b\xe3\xb0\x70\x6c\xab\xe4\xe5\x1d\xcc\x47\x32\x1e\x0b\x8f"
- "\x19\x5d\xe0\x19\xf6\x4f\x59\x83\x3a\xba\xd2\x87\x49\x7c\x5c\x93"
- "\x09\xcf\x49\x78\xe6\xef\xf3\xa4\xf2\x9a\x00\xca\xb5\x0b\xd0\x8c"
- "\xe1\x8b\x4a\x3e\x67\xb0\x3b\x95\x69\x18\xf7\xfc\xc6\xfb\x94\x85"
- "\x3a\x5a\x79\xee\x7b\xa0\xcc\x67\x78\xe5\x7d\x1a\x77\x75\x3a\xa5"
- "\xae\xa0\x3f\xfd\xcd\x7b\x01\x0c\x0f\x6d\x4b\x39\x43\xf5\x0f\x45"
- "\xcb\x98\x4d\xea\x32\xa5\x07\xeb\x2d\xbc\xfe\x7e\x95\xf5\x4a\x1b"
- "\x8e\xfd\x88\xae\xae\x5c\x7d\xaa\x8e\x07\x60\x1c\xef\x0f\xf7\xab"
- "\xa7\x43\x7d\x61\x7f\xb0\xb6\xbc\x29\x63\x73\x39\xb7\xbe\xc9\x3e"
- "\x7e\x3b\x4c\x47\xac\x1c\x2f\x19\x63\xe7\x5e\x3f\x15\xef\x26\x93"
- "\xf3\x2c\xaf\xc9\xcc\xa1\x23\xb5\x19\xb4\x07\x73\x72\xd1\x99\x9e"
- "\xb2\xfd\x02\xfb\x13\x28\x1d\xc2\x36\x29\x9f\x63\x13\xc5\xe9\x96"
- "\x6d\x6f\xea\x36\xfc\xdb\x77\x96\x5e\x24\x83\xfa\x1e\xc5\xdb\x93"
- "\x67\xda\x44\xb0\xda\x10\xb6\xd7\x72\x7c\xa1\x94\xed\xb9\x1c\x5f"
- "\x48\x8f\xd9\x23\x6d\x1f\x07\x64\xae\xd3\x3a\x78\xcb\x4a\x1a\xc7"
- "\x71\xc6\xcc\x3e\x65\xcb\xa9\xf1\xfa\xed\x02\xe0\x67\xd1\xf6\xd0"
- "\x2d\x2a\x8e\x4f\x5d\x43\xdd\x05\xd4\xa5\xde\xbf\x11\xc2\x1c\x46"
- "\xc2\x5d\x49\x69\xb5\x17\x28\x9d\xed\xa0\xfc\x2f\x95\xcd\xc6\xf3"
- "\xc2\x39\x1d\x66\x11\xfa\x3f\xe9\xb4\xfb\x4c\x5f\x1c\x32\x5f\x31"
- "\xc7\x2e\x13\xfd\x7d\xc3\x3b\x69\xdb\x30\xe9\x47\x23\x63\x5f\xa8"
- "\xef\x95\x11\x55\x57\x91\x91\xbf\xcf\xc9\x6b\x79\xbc\x36\xcc\x67"
- "\x69\xd4\x18\xf2\x8e\x51\x8f\xcf\xd4\xef\xde\x9c\x5b\xcd\x77\xc2"
- "\xd7\x60\xfe\xe5\xeb\x6a\x6c\x5c\xcd\x63\xc6\x3b\xb3\xf9\xfc\x4e"
- "\xdf\x1c\xe7\x9d\xf1\xfc\x8e\xd3\xd8\xbf\x3c\x5b\xd2\xf2\x9d\x12"
- "\x9e\xf7\x68\x73\xc6\xcf\x6c\xbd\x69\xca\x86\xe1\xb1\x8c\x71\xa8"
- "\x53\xeb\xc8\x43\x81\x8b\x5b\x1f\xcf\x78\x5c\x57\xdf\x06\x7d\x67"
- "\xaf\xd7\x70\xdc\x7e\x05\xfc\x2c\xda\xb7\x75\xf9\x4c\x7a\x36\xf2"
- "\x9f\xd0\xc7\x37\xf9\xed\x87\x8d\xc3\x1f\x28\x5e\x4b\x23\x1e\xbd"
- "\xd1\x24\x63\x1e\xf0\x37\x1e\xd5\xb8\xfb\x4e\xb0\x6f\x8f\x2a\x5b"
- "\xd2\x5b\x7e\xd7\x8d\xe7\x18\x06\x8c\xc1\x2a\xd6\x58\x87\x1a\x7f"
- "\xf5\xf3\xc5\x3f\xbb\xb1\xaf\x9e\x9f\x4d\xeb\x1d\x47\x51\x07\xfb"
- "\x4a\x30\x7c\x65\x9b\xbc\xc3\x65\x7d\x3c\xb7\x52\xe3\xeb\x3b\xbe"
- "\x2b\xd8\x62\xe9\x4c\xdf\xb0\x36\x9f\xf4\x74\xfc\x5d\xd1\xd7\x41"
- "\x89\x13\xab\xc9\xfa\x59\x99\xd7\x38\x54\xc5\xcc\x31\xa3\xfe\x2d"
- "\xfc\x9e\x79\xbd\x71\x02\xaf\xc5\xfd\xec\x2b\x0f\x8f\xdb\x3d\x79"
- "\x49\x73\x79\xae\x2f\x6d\xf1\x9f\xb5\x8e\x47\x39\xa4\xa5\x7c\x7a"
- "\x2e\x60\xdc\xb6\x8e\xc6\xf1\xf7\x13\x91\x2e\xbf\x0d\xe5\xbb\xe1"
- "\xc5\xae\xd1\xa9\x64\x1d\x5d\xcd\x3e\xf6\x7b\x09\xf3\x4b\xb9\xfe"
- "\x23\xeb\xaf\xda\x5f\xc4\x71\xd6\x3e\xe8\xf6\x0e\x50\x7d\xb5\x77"
- "\x37\x9e\xd3\x23\x9e\xef\xd6\xd7\xf2\xbd\xb4\xb7\x56\xee\x07\xb2"
- "\x1f\xf1\x72\x1e\xaf\xb7\xfb\xfa\x7c\x6f\xf6\xee\x56\xb8\xec\xdd"
- "\x7d\xa4\x88\x78\xad\xfa\xc4\x1e\x19\x33\x69\x6f\x91\x97\xde\x39"
- "\xa0\xad\xc7\x1c\x97\x7c\xc5\xf6\xee\xab\x3c\x07\xfb\x7b\xe3\x16"
- "\xe4\xe3\x71\x22\xdf\x41\xd9\xca\x86\xaf\x36\x85\xc1\x3f\x7d\xed"
- "\xdf\x3b\x88\xd7\xfa\xe2\xea\xc4\x9d\x44\xb2\x4c\xe5\xf6\x1c\xe9"
- "\xc7\x55\xf9\xde\x71\x5c\x4d\xe0\x35\x1f\xae\x49\xb8\xf2\xbc\xc9"
- "\x82\xf7\x01\x5c\xa1\xbf\xf7\x1f\x60\xbe\xc4\x1c\xd6\x8a\x79\x02"
- "\xef\x2d\x66\xf7\x77\xfe\x8f\x69\xe3\xd9\xf4\x38\x29\xbf\xd4\x77"
- "\xcb\x9b\xd1\x9b\xf3\x76\x13\x15\x07\x45\xb7\xed\x16\x3e\x67\xf3"
- "\x6e\xb9\x73\x37\xfb\x83\xbc\x3b\x3f\xda\x1f\xe4\x5d\xdc\xbd\x7b"
- "\x90\xe8\xe7\x26\xfc\xb2\x70\x5f\xde\xf7\xfb\x79\x49\x97\xeb\x5d"
- "\xcc\x57\xf7\x4a\x1b\xeb\xea\x74\xe2\xbb\x6a\x7f\x9d\xe7\x45\xc9"
- "\xc5\x16\xd5\xde\xfd\x36\x3c\x9b\x44\xf2\xfe\x85\x5a\x7b\x2d\x78"
- "\xb6\xd8\x9c\x18\xd7\x92\x41\x93\xe1\x68\x73\xf2\x7b\xc7\xb9\xbd"
- "\x8c\x6f\x67\x72\xb5\x2f\xf2\xec\x23\xc3\xe4\xf6\xfb\x92\xab\x19"
- "\x1e\x89\x09\x0f\xd4\xeb\xf4\xd4\xe8\xc4\xfb\x46\x86\x4e\xc0\x50"
- "\x76\x10\xf2\x03\x86\x9e\xbf\x97\xf6\xc3\xf9\x5b\x06\xe8\x53\xe4"
- "\xc3\x9c\xd8\xa4\x9f\xab\xec\x72\xfd\xbc\xf0\x77\x85\x6a\xff\x80"
- "\xcb\xfa\x23\xca\x72\xac\x81\x78\xe5\x51\xa7\x49\xd5\x59\xed\x3b"
- "\x4d\xef\x6e\x50\xf5\xfe\x7c\x61\x7f\xb2\x54\x36\x12\xf6\x5d\xad"
- "\x97\xe3\x11\xb0\x3d\x34\xcd\x33\xc2\x4f\x9e\xda\x30\xc6\xfc\x6a"
- "\x5b\x76\x99\x68\x3c\x4d\xff\x34\xb2\x25\xd0\x7e\x95\xe3\xe1\xcf"
- "\xd5\x37\xc2\xba\xcb\xc9\x53\x3a\x49\x7e\x37\xf8\x1c\xed\xfb\x91"
- "\xc7\x27\xe3\x6f\xf3\xfd\x74\x7e\xcf\xbe\x0f\x3c\x36\x60\x8e\xdd"
- "\x1b\xbf\x2e\x8c\xbc\x7b\x38\x1d\x69\x1e\xbf\x4f\xc6\xb9\xeb\xf3"
- "\xcd\xde\x9e\xae\x64\x6a\xdf\x20\x79\xee\x9d\xf1\x0d\xfe\xa0\x91"
- "\x71\x86\x2c\xa5\x73\x1b\x9c\x98\xff\x79\x82\x5d\x8d\x2c\x13\xb6"
- "\xd5\xbc\x56\xf8\x4f\x5f\x82\xef\x44\xb8\x72\x7b\xfa\xd5\xb5\xe1"
- "\x9f\xe4\x9c\xc6\x19\x14\xe7\x7c\xc9\xdb\xd3\xd9\x26\xd9\x56\x36"
- "\xc0\x34\xa3\x56\x34\x76\xa6\x54\xdb\xba\x5c\xfb\x4c\xbf\x73\xa8"
- "\xbe\xb9\x3a\xb8\xfb\x4c\x7a\xdb\xf7\x68\x6d\x47\x5d\x72\x6f\x6e"
- "\x62\x8d\x8a\xeb\x87\x3c\xd9\xfd\xae\x59\xa1\x9f\xd9\x1e\x60\xbf"
- "\x51\x8d\x16\xee\xde\xb1\xe1\xea\xf0\xb8\x2c\x66\x5a\x9c\x3a\x7a"
- "\xb4\x3a\xfc\xff\xc5\x3a\xfc\x57\xaa\x03\xba\xe1\xe6\x33\xf4\x8b"
- "\xf2\xab\x9f\x3b\xfe\x62\xb6\xe4\x15\x77\xb5\x45\xe9\xcc\x7f\xfe"
- "\x3a\x84\xf9\x5b\xd0\xb2\xdf\x26\xbf\xf1\x63\xa0\x72\x8e\x71\x18"
- "\x74\x17\x5b\x9a\x1d\xdd\xd4\xb8\xfa\x4f\xd4\x46\xbf\xf8\x98\xcb"
- "\x34\x97\xf0\x9c\x6d\xff\xc2\x9e\xaa\xea\xa2\x1e\xc3\xbe\xe3\x4c"
- "\xef\xdd\xe8\x87\x5d\x11\x7c\xd6\xe2\xff\x13\x79\x16\xf2\xfa\xea"
- "\x71\x5e\xd7\x5e\x08\xfd\x60\x0b\x43\x37\xc0\x46\x0f\x49\x7a\xc0"
- "\x7e\x51\xf3\xad\x1d\x26\x39\xdf\xf2\xc9\x33\x7f\x43\x64\xec\x42"
- "\x57\xe1\x31\x5e\xfb\x0e\xf5\xe4\x81\x47\x28\x97\x63\x1a\xf2\xba"
- "\xb3\xb0\x64\x1e\x9c\x17\x4c\x14\x72\x3e\x05\xdb\x9f\x63\x1a\x7a"
- "\x30\xab\x0c\xc1\x8e\xae\xbd\x44\xa9\xb5\xb0\x3d\xa1\xb3\x2d\xac"
- "\xd7\xeb\xb4\xb8\x86\x5b\x2e\xf5\xc5\x35\xdc\xc3\x6b\x3d\xad\xb8"
- "\xbf\x44\xc6\x50\xe5\x0e\xd3\xae\x4b\x94\xb6\x7b\x35\xa5\xef\xe2"
- "\xb5\xbc\xaf\x94\xed\xc3\x76\x85\x8c\x71\xb8\x22\x9d\xd7\xf3\xfb"
- "\x6c\x9f\x35\x1c\x83\xb5\x57\x6f\xc9\xb9\xe8\xd5\xd1\xfb\x9f\xe5"
- "\x38\x18\x74\x6f\xcf\x09\x5a\xde\x3b\x0e\xda\xf9\xd0\x07\x3e\xd0"
- "\xaf\x30\x5e\xdf\xea\xbe\x4d\xd5\x11\x71\x29\x7f\x97\xa6\xf4\xbb"
- "\x97\xf6\x4f\xee\x8f\x27\x42\xbb\xf2\x68\x62\x07\x65\x28\x7f\x85"
- "\x41\x18\x13\xf7\xd7\xf0\xfe\x79\xd9\x32\xb2\x86\x76\x2d\x48\x70"
- "\xbe\x4d\x89\xfc\x4d\x69\xfe\x95\x7d\x2d\xda\x27\x16\x52\x06\xef"
- "\x3f\xb0\x4f\x83\xed\x65\x99\x7f\x69\x5a\x29\x65\x44\xc2\xce\x51"
- "\xce\x46\x53\x6d\x0f\x2d\x7f\x6e\xc5\xb2\xa2\x45\x25\x4b\x9f\x5d"
- "\x5a\xb8\xb4\x64\xad\x0c\x1b\x30\x4e\xfe\x7b\x70\x4c\xc1\x7c\xb9"
- "\xe9\x1c\x61\x5f\xa4\xf5\xad\xc7\x35\x8c\x0c\xf1\xfa\xc1\x55\xd1"
- "\x6b\x7f\x87\xb6\x8f\xe6\xdb\x2d\xf7\x95\x1a\x26\x7b\x0d\x1e\xe9"
- "\xa3\xb4\x45\xc5\x90\x69\x57\x7e\x0c\x2a\x5f\xd8\xbd\x9f\x63\x10"
- "\x4d\x3b\x45\x1f\x58\x78\x3f\x04\x7d\x05\xbd\x79\x86\x60\x87\x4c"
- "\xe3\x7d\x96\x66\x5e\xcb\x90\xb6\x6f\xc3\xdb\x72\x0c\x3b\x27\xe3"
- "\x50\xed\x3d\x85\x67\xf6\x7b\x0f\x8b\xbc\x5d\xa1\x15\xd6\xbd\xe1"
- "\x15\xd6\x9f\x0b\x91\xb7\x33\x7c\xde\xbe\x4b\x9c\xb7\xef\x14\xee"
- "\x51\x39\x90\xb1\x11\x67\xa8\xe1\xa3\xa0\x8b\x6e\xc0\x6f\x60\x5f"
- "\x0c\x81\x86\x7f\x9d\xdd\x26\x7a\xf0\x0b\x0b\xf7\x68\x7b\xc4\x1e"
- "\x1a\xbf\x93\x67\x36\x8a\x56\xb2\x2f\x55\x43\x88\xeb\x16\x55\xa3"
- "\x9f\xf7\x39\xed\x89\xc8\x1f\x52\xb8\xbc\x77\xa3\x67\xd3\x69\x52"
- "\xfb\xa6\xef\x59\x1b\xe5\x9a\xf1\x7b\xbf\xe4\x72\xbc\xcf\xc6\x36"
- "\xb4\xa7\x8d\xe7\x16\xfb\xf7\xb2\x1f\x1e\xdb\xcf\xbb\x53\xc8\xe2"
- "\x4e\xa1\xa4\x2e\xd7\x7b\x33\x7b\x7d\x2c\x2c\x6a\x4c\xe5\x71\x8d"
- "\x63\x11\x43\xe7\x74\xf1\x18\xc9\x78\x30\x9f\x02\x66\x11\xef\xc1"
- "\xa9\x73\x45\xef\x95\x7a\xa9\xd0\x77\xf5\x3a\xf7\x3d\x19\xdb\x46"
- "\x18\x9c\x62\xe2\x66\x5a\x28\xf7\x47\x95\xcf\xa1\x11\x72\xb9\x4f"
- "\xb5\xe7\xfd\xaf\xe4\xfe\xf9\xea\xb3\xf5\x90\x9b\xf2\xba\x6e\x4a"
- "\x0a\xbb\x33\x1b\xd8\x8e\x69\x2e\x95\xfb\xca\x26\x94\x63\xbf\x00"
- "\x75\x2e\x4f\xc6\xb9\xfe\x13\xd5\x5d\x24\x63\x1b\xbd\x17\xe0\xb5"
- "\xf6\x3e\xda\xbe\x3f\x87\xf7\x56\x44\x95\xcd\x6b\x2e\x35\x54\x30"
- "\x8c\xf0\xa5\x73\x59\x7a\x39\x8c\xdd\x03\xb9\xdc\x29\x7a\x3f\x53"
- "\x96\xe3\xbc\xf2\xfb\x88\x96\x05\x18\xc7\x72\x38\x7f\x10\xcf\x7b"
- "\xc2\x96\x5c\x01\x79\x0b\xad\x0e\x1d\xc0\xbb\xf9\xd0\x77\x3e\xa4"
- "\xe5\xc9\x35\x5e\xcc\xcb\x65\xbc\x13\xcb\x0a\xf2\x78\xff\xde\x28"
- "\xf1\x61\x3f\xd6\x12\xe8\x26\x69\xf7\xbd\xff\xca\x9e\xaf\xc8\x58"
- "\xb4\x84\xfb\xf0\x03\xab\xc6\x37\xfb\x14\x7e\x1f\xdc\xd8\x59\x35"
- "\xd6\xd6\x69\xa9\x26\xbf\xc1\x44\x47\xac\xec\x77\xbf\xff\xc0\x11"
- "\x6b\x37\xe6\x0e\xef\x7b\xbd\x46\x5b\xae\xb2\x39\x54\x39\xde\xdb"
- "\x81\x3d\xda\x91\x68\xb5\xcc\xed\x72\x7d\x40\xba\x7f\x05\x7f\x53"
- "\x9c\xf7\x78\x40\xdf\x56\xa6\x9b\x97\x1a\x0a\xe5\x3a\xff\xc6\xa7"
- "\xda\xd1\x9e\x6b\xd8\x07\x8e\xe9\xcc\xe7\x1b\xcc\xb8\x17\xab\x45"
- "\x96\x39\x98\x6d\xa8\x93\xe7\x1a\xe5\x79\xf9\xc9\x5a\xcc\x96\x0c"
- "\x2d\x86\xcb\x38\x7e\x56\xe7\xed\x3f\xe8\x3d\xff\xcf\x71\x6a\xd8"
- "\x77\x20\xa4\xf9\xd5\xc9\xf8\x2d\x17\xd4\xfe\x28\xfb\xd5\xf1\xfa"
- "\x20\x9f\x0f\xe4\x3d\x4c\x94\xab\xef\xf5\x73\x94\xe7\x62\x3e\x38"
- "\xa0\xc7\x6d\xc1\xfd\xe1\x5e\x7f\x1d\xb4\xbd\xd3\xbd\x3d\xe0\xb7"
- "\xec\x3f\xe0\x77\x6f\xc7\xdc\xe4\x83\x56\xc8\xed\x95\xe2\x06\xf2"
- "\xf7\x5d\x88\x63\x59\x84\x53\x32\x5b\x39\x9e\xc5\x11\x3f\x69\x67"
- "\x82\x0f\xdc\xad\x9d\x1f\x4f\x3c\x47\x1f\x5c\xec\xdb\x4b\x0c\x69"
- "\xeb\x60\x07\x16\x2a\x3b\xec\xc0\x42\xb9\x0e\x56\xb5\xdd\xfb\xb3"
- "\x75\x01\xc3\x81\x75\x5e\x83\x3a\x27\x70\x60\xbe\x97\x0e\x55\xe8"
- "\xfe\x28\xc8\x97\xda\x5f\x2c\x2b\xe1\x9e\xd2\xa0\x60\xfe\x52\xae"
- "\x61\xf4\xcd\x6b\x7e\xa9\xf6\xc9\x36\x0e\x5f\x18\xe6\x31\x30\xa5"
- "\xd8\x26\x7d\x2b\x8a\x2e\xf0\x7a\xd8\x35\x6a\x8e\xa5\xf2\x68\x7e"
- "\x91\xd7\x9d\x89\x7e\x4e\xe1\x67\x45\xb3\x03\x6d\xfa\xda\xfa\x56"
- "\x43\x98\x63\x1b\x0b\x67\xbd\xf0\x7b\x8a\xfc\x04\xfb\xca\xe7\xc1"
- "\x98\x8a\x3a\x04\xf4\xc3\x40\x94\xb9\x91\x69\xaf\x64\xe8\x97\x5b"
- "\x24\x4e\xae\xfb\x84\x93\xed\x4a\x1f\xfb\x76\x5c\x20\xe4\x4b\x46"
- "\xbe\x59\x4d\xa5\x1d\xec\x9f\x52\xcf\x31\xe4\xda\xb4\xba\x7d\xc9"
- "\x53\x1a\x46\x27\xd1\xc2\x2e\xd7\x2f\xf3\xbc\xb4\xd1\x7a\xf5\xb2"
- "\xfd\xcb\xbc\x2b\xd9\x18\x6a\xcc\xcb\xa6\xfe\xe6\x29\x3c\x0f\x9d"
- "\x80\xfa\xe7\x08\xc6\xff\x57\xb3\x82\x86\x00\xf5\x18\x06\x8a\xef"
- "\x97\x3b\x28\xe8\x1a\x28\x42\xeb\xd0\x5f\x9d\x56\xe8\xe3\x63\xd4"
- "\x12\x6c\x92\xbe\x1f\x90\x59\x73\x99\x5f\x5c\xf0\x04\x0f\x4a\x5f"
- "\x58\x75\x66\xfc\x57\xd3\x3d\xc1\x4f\xa8\xa5\xc8\x47\xac\x17\x4e"
- "\xd1\xaf\xc6\x32\x5e\x13\x8a\xca\x69\xfc\x39\x7e\xff\xcb\x76\x35"
- "\xfe\xfd\x6a\xa6\x76\x4d\xe5\x58\x83\x91\x38\x3d\xb8\x6a\xf9\x73"
- "\x25\x4b\x57\x2c\x1f\x3f\x7b\xf1\xea\xc5\x85\xb6\x47\x94\x2b\x5d"
- "\xd4\xb8\x64\xea\x8b\xa1\xfc\xa1\x1c\x2b\xd8\x06\xe1\x58\xca\x57"
- "\x8a\xa3\xac\xc7\x50\x86\x5e\x4b\xe3\x75\xbb\xff\xc9\x38\xca\xba"
- "\x8d\xc1\x31\x94\xfb\xd6\xb0\x3f\x3c\xde\x2b\x03\xe1\xcf\xba\xf8"
- "\x99\xcf\x49\x86\x5d\xbf\xca\x65\x39\xda\x23\xfd\xce\x3e\xcc\x89"
- "\x8c\xfb\xc3\x3e\x76\xbc\xee\x81\xf4\x85\xfa\x99\x54\xf0\x22\xc6"
- "\x8a\x0f\x8b\xfa\xce\xc8\x7c\x08\xfd\xff\xcb\xc3\x4a\x7e\x65\xde"
- "\xcd\xfa\x5e\xaf\xf6\xed\x2a\xb9\x37\x1d\x76\x75\xcd\x54\xeb\x2b"
- "\x1f\x56\xee\x09\x0f\x34\xa9\xb5\xfd\x0f\x0f\xe9\xe7\xaf\x94\x6c"
- "\x7e\xa6\xc9\xe6\x87\xc7\xaf\xb4\x1f\xdf\x27\x1b\x07\x93\xfa\xe4"
- "\xfa\x6f\x5a\xd9\x83\x49\xdf\xb6\x97\xaf\xd9\xb9\xd7\x9f\xa1\x7f"
- "\x19\xc9\x6b\x2e\xb8\xbf\x15\xf7\xf2\xdc\xa7\xf2\x45\xff\xe8\x4b"
- "\xed\x1e\x75\x7c\xd4\xac\xdd\xdf\x84\xfb\x8f\xb4\xfb\xe1\xb8\xdf"
- "\xad\xdd\x43\x66\x3f\x7a\x45\xbb\x4f\xc5\xfd\x32\xed\x1e\x3a\xfe"
- "\xa3\xc7\xb4\xfb\x61\xb8\x9f\xae\xdd\xdf\x88\xfb\x31\xda\x3d\x64"
- "\xf0\xa3\x21\xda\xbe\x28\xc6\xd5\x83\xdf\x5c\xbd\xdd\x7d\xb0\x49"
- "\xed\xbd\x7d\x64\x84\xae\xd4\xce\xaa\xf5\xa6\x59\xc1\xd3\x76\x9d"
- "\xbe\x48\xe7\xb3\xe6\x98\xc3\x7e\x94\xe1\xa5\x77\x2c\x11\xe9\x0d"
- "\x5a\xfe\x1c\x8c\x2f\x6d\x11\xe9\xf5\x5a\xfa\x42\xd8\x96\x93\x23"
- "\xd2\xab\xb5\x74\x07\xf4\x62\x61\x44\x7a\x85\x96\xee\xf6\x52\xed"
- "\xcc\x88\xf4\x52\x2d\x7d\x9f\xee\x87\xa0\xa5\x17\x69\xe9\x8d\x48"
- "\xf7\x47\xa4\x17\x68\xe9\xd0\xff\x1f\x9e\x8c\x48\x97\x7a\x65\x9b"
- "\x3c\xb7\x65\x16\x47\x4a\x59\xb6\x3e\xe2\x3d\xc2\x48\x9c\x67\xab"
- "\xb2\xff\x92\x8a\xf4\xa4\x88\xf4\x6c\x2d\x7d\x9c\x97\xbe\xdc\x1b"
- "\x91\xde\xaf\xed\x9b\x50\x43\x0b\xfb\x5b\x9b\xe4\x6f\xfd\x48\xff"
- "\x47\x69\x33\xfe\x7a\x29\x9f\xe9\x32\xef\x16\xa7\x6c\x65\x42\x9c"
- "\xa2\x5f\xe7\x6a\x7e\x7f\xb5\xec\x87\xa5\xce\xc6\xfd\x3a\x4b\x9e"
- "\x97\xe2\x38\x86\x7c\x5e\x6e\x1d\xa7\xfd\x8b\x8c\x95\x37\xd1\x51"
- "\xae\x62\x1c\x2a\xbf\xd2\x0e\x39\x47\xd7\xf6\x2f\x91\x87\xbf\x91"
- "\x48\x0c\x87\xd7\xf1\x3c\x25\xdd\xd2\xd7\x91\xe7\x48\x9c\xc6\x73"
- "\x55\x79\x86\x2a\x62\xae\xa4\xf4\xfe\xaf\x97\x86\xf9\x8c\xbb\x4b"
- "\xcd\xe7\x59\x16\x39\x3f\xfb\xdc\x44\xe6\xf5\xd2\xaf\xe5\x3c\x37"
- "\xd1\x9a\xfc\x6e\x97\xeb\xd7\x39\x7d\xe7\x7a\xfe\xa5\x5e\x4b\xdf"
- "\x8b\xf4\x85\x11\xe9\x9b\xfb\xd7\xed\xd0\x77\x96\x91\xe9\x3d\x97"
- "\x84\x3f\x78\x49\x04\xb6\xfe\x07\xf0\x5e\x22\xcf\xa8\xdc\x12\x72"
- "\x8f\xcc\xd2\xe2\x45\x7c\x11\x5c\x2d\x7c\xd0\xd9\x1c\xa7\xff\xda"
- "\xb9\x7e\x1f\xcd\x2d\xea\x12\x5b\x9e\x65\xff\xb9\x8b\x32\x76\x92"
- "\xb3\x83\x63\x18\xb3\x4f\x96\x9f\xf7\x7d\x92\x5a\x30\xc6\xed\x59"
- "\xc2\xef\xff\x4a\x73\xec\xb0\xbd\xed\x21\xda\x03\xd8\xbb\x9f\xd5"
- "\xfd\x21\x39\x06\xbc\xe6\xa3\x08\x1c\xb8\x3e\xa7\xfc\xde\xc6\x21"
- "\x19\x9b\x83\xbf\x27\x26\x2a\xdf\xf3\x8a\xdf\xb3\xfd\xba\x3d\xc3"
- "\xbc\x81\x6c\x18\xdb\xa7\xe1\xde\xa6\x7e\x78\x87\xf4\xfe\xda\xa4"
- "\x64\xf9\x90\x43\xe9\x9a\x91\xfb\x94\xbe\x38\xe4\x10\xef\xf0\x19"
- "\x9d\x43\xa5\x28\xdb\xea\x4b\xde\x1e\xd7\xaf\x6a\xfd\x6e\x32\xf4"
- "\x54\xc1\x36\x39\x77\xc8\xa0\xf4\xd3\xc7\xf6\xb0\xc1\xb4\x81\xd7"
- "\x0b\x65\xac\xfd\xaa\xcc\xf6\x86\xe5\x01\x43\xf3\xba\x36\x3e\xb5"
- "\x6d\x5d\x10\x60\xff\xef\x43\x5f\x0d\x2d\xe1\x58\x8d\xdb\xbd\xb0"
- "\x3b\x0d\x1f\xe2\xfd\xa7\xcb\x0f\x19\x82\xd2\x5e\xf9\xd8\x2e\xd7"
- "\x98\xdc\x99\x87\x79\x0c\xf1\xb4\x86\xd8\x66\x4e\x82\xcd\xdc\x00"
- "\xfd\x6f\x0a\xad\xb1\xa7\x04\x8b\xed\xd7\xee\x5e\x49\x49\xa1\xe2"
- "\xf4\xd4\xed\x97\x28\x4b\x1f\x7f\x30\x37\xcd\x10\x5d\xd6\xc1\xdb"
- "\x30\xa6\xf0\xdc\x75\x68\x82\x45\xee\xa5\xf1\x7d\xd8\x50\x97\xbb"
- "\x67\xf5\x95\xbf\x1b\x12\xc2\x9c\x95\x63\xf9\x32\x2e\xf1\xda\xba"
- "\x79\x27\xe6\xc1\xda\x99\xd2\xb2\x2f\x69\x18\xec\x5c\xc3\xd0\x8b"
- "\xa2\xf1\x4c\x21\x19\xf8\x5b\x0b\x65\x8b\xe5\xfa\xd0\x80\x66\x7b"
- "\x90\x3c\x8e\xbf\x50\xd9\x4a\xee\xa3\x8f\x3f\x61\x3b\x8d\xfd\x21"
- "\x91\xdf\x72\x86\x3e\x6e\x36\x07\x30\x66\x04\x60\x3b\xbf\xc0\x73"
- "\xbd\x8f\xbf\xf0\xcb\x58\xa2\xbf\x49\x63\x9f\xf0\xc6\x95\x0f\x70"
- "\x5a\xc8\xf9\xa5\xf4\x79\xad\x57\xb2\xf5\x71\x2b\x3f\x3b\xf9\x8c"
- "\x6b\xca\x5d\x6d\xef\x77\x07\x06\xa8\x35\x88\x8f\xff\xac\xfa\x6c"
- "\xfb\x71\x35\xe7\xfa\xf8\xb2\xb3\x78\xbd\x6b\xa3\xee\x31\x39\x82"
- "\xe3\x4b\xd7\x06\x69\xae\x5f\x78\xe5\x3e\x25\x9f\xed\x77\xdc\xd7"
- "\x28\x2e\xb9\x49\x9d\x47\xfb\xcd\xee\x70\xe5\x98\x1c\x15\x03\xf0"
- "\x37\x32\x46\xa7\x5a\xb3\x1c\x93\xa7\xd6\x68\xc7\xd8\xd5\x9a\xe5"
- "\x18\xc7\xc6\xe1\xec\x83\xfc\x9b\xda\xce\xe4\x31\x15\xb8\x16\x75"
- "\xa6\xdc\x93\xdd\xff\x78\x34\xca\x61\xbb\x85\x52\x79\xad\x9c\xfd"
- "\x89\xeb\x94\x1f\x31\xea\xf8\x2d\xfb\x15\xf3\xbb\x5b\x4f\x15\x51"
- "\x22\xaf\x2f\xa2\xde\xb3\x13\x6b\x89\xd7\x54\x86\x08\xcb\x98\x74"
- "\xe9\xbb\xe5\x1e\x93\xe5\xe9\x10\x8d\xec\x33\xa8\xf6\x34\x7e\xdb"
- "\x20\x92\xc7\xa4\xab\xfc\xbf\x9d\xde\xd2\x81\x36\x58\xd2\x02\x9e"
- "\xc0\x59\xcd\x26\xfc\x2d\x78\x3f\x2d\x20\xdc\x63\x4c\xea\xac\xf8"
- "\x6f\xb7\xe8\x7a\x55\xf1\xe8\x6f\x37\x28\xba\x8d\x72\x28\xba\xfd"
- "\xb6\x41\x1b\xaf\x6e\xe5\x7b\x8c\xdd\x19\x6a\x0f\xfe\xb7\x0e\xdd"
- "\x46\xf6\x6a\x79\xb8\x0c\xee\xb5\x58\x38\xbf\xad\x41\xdb\x33\xb4"
- "\xf7\xf2\x5b\x61\x68\x1f\x78\xf8\x37\x27\xb8\x5d\xfd\xe9\x56\x49"
- "\x8b\x52\x4a\x44\xfb\xac\xec\x2b\xca\x76\x8a\xc7\x7f\x5f\xa3\xfa"
- "\x1e\xe0\x27\x77\xca\x33\xb3\xa8\x07\xfd\x63\x60\xbd\xc9\x67\x7c"
- "\x19\x5e\x1f\xfe\x87\x6f\xd4\x71\xe1\xfa\xf8\x9d\x70\xa7\x71\x4c"
- "\x02\xa6\x95\x89\xf3\x70\xbf\x9e\x2e\xe2\xb5\x8b\x8b\xa0\x19\xfb"
- "\x01\x7d\x32\x93\x69\xa2\x68\xf6\x89\x4d\xd2\xa3\xb7\x1f\x3e\xb9"
- "\x3e\x9a\x1e\xea\x39\x6c\x81\x6e\x58\xc9\xfe\x20\x9f\xcc\xd4\xe8"
- "\xd7\xa1\xd5\xff\xb5\x36\x57\xc7\xbb\xc3\xbf\x88\x28\x7b\x73\x6f"
- "\x5e\xf5\xed\x49\x03\xef\xad\xf2\x5a\xbb\xe2\xd7\xc3\x27\x22\xca"
- "\x9d\xc8\xff\x9a\x6d\x64\x5b\x80\xbf\x15\xc8\x34\xef\x72\x1d\x6e"
- "\xef\xa3\xb7\x82\x13\xa7\x8e\x5b\xf4\x3a\xbc\x74\x78\x9f\x8e\x27"
- "\xee\xb5\x31\xf8\x93\x71\x7d\x7d\x72\x78\xb6\x5e\x8e\xfd\xf7\xd1"
- "\x47\x01\x3e\x2f\x18\x57\x0f\xf2\x9e\xce\x08\xe8\xe0\xe0\x7d\x8d"
- "\x92\x1f\xe9\x93\xbd\xec\xeb\x0a\x1e\xb2\x2a\x1e\xfa\xa4\x42\x8d"
- "\x85\x9f\xc8\xd8\x2d\xbc\x5f\xc2\xb1\x88\x51\x5f\x2d\xe0\x1e\xd2"
- "\x70\x3e\xa0\xe1\x80\xf9\xdf\x6f\xf6\xc5\xce\xeb\x1e\x58\x54\x20"
- "\x0f\xc6\x8e\x5f\x55\x14\x1b\xa7\xd2\xd4\x77\x06\xf2\x93\x8e\x88"
- "\x33\xa4\x5a\x4c\xde\x4f\xb3\x30\x4f\x3d\xb8\xf5\xff\xb2\xf7\x3d"
- "\x70\x51\x1d\xd7\xfe\xb3\x0b\x12\x34\x44\x16\x83\x74\x93\x90\x64"
- "\x4d\x31\xae\xa9\x49\xd0\xda\x8a\x86\xb4\x98\x68\xaa\x3e\x13\xd0"
- "\xa7\x2d\x31\x46\xf1\x0f\x16\x2c\xea\x06\x11\x11\x11\x10\x0d\x4f"
- "\x5b\x45\x54\xe4\x61\x82\x48\xfa\x4c\x8a\x89\xff\xf2\x6a\xde\xc3"
- "\xd6\x98\x4d\x45\x8b\x0a\x2c\x49\x31\x45\x83\xba\x12\xb4\xc4\xa0"
- "\xd9\x08\xca\x82\xbb\x77\x7e\xe7\xcc\xdc\xbb\x77\xef\xb2\x0b\xae"
- "\xd1\x98\xfe\xfa\xf8\x7c\xf8\xdc\x9d\x7b\xe7\xce\x9d\x3b\xe7\xcc"
- "\x77\xce\x39\xf7\xcc\x39\x5c\x6f\x2d\xcf\x03\x9a\x65\x5d\x23\x0f"
- "\x62\x8e\x8d\x4c\x03\xbd\x54\x63\x00\x5d\x5a\x33\x0c\xe6\xd9\x30"
- "\xf4\x97\xe8\x83\xbe\x14\x88\x37\xe8\xab\x49\x83\xe0\xfc\xc6\x61"
- "\xfe\xf2\x3e\x35\x63\x13\xe8\xb6\x65\xeb\x41\x97\xcd\xba\x4c\x1e"
- "\xe4\xbe\x11\x87\x96\xa0\x4d\x87\x66\xc5\xbe\x21\xe4\x0f\x0b\xc0"
- "\x3d\x90\x35\xa0\x11\xd2\xac\x84\x37\x84\x8d\xc3\x02\xa0\xdd\xd0"
- "\xac\x05\xa4\x1f\xae\x6f\x68\x1b\xe2\x3c\x63\xac\x80\x76\x43\x31"
- "\x3e\x99\x40\x63\x55\xf0\xfc\x38\x41\x33\xa2\x6c\xbd\x40\x98\xef"
- "\x37\xf0\x99\xba\x91\x1c\x3a\x02\xcf\x8f\xc3\xdc\x7f\x68\xe7\x31"
- "\x59\xa1\x9f\x1b\x87\xc5\xc1\xb5\xbe\x70\xed\x1b\x38\x0a\x18\xab"
- "\x0c\xe3\x63\x43\xfb\x5a\x6c\x1f\x9e\x15\xc7\xfb\x6e\x61\x75\x1b"
- "\xc9\x47\x03\xb1\x8e\x14\x03\x4d\xc8\x8a\xf5\xc1\xeb\xb8\xa7\xd6"
- "\x0e\xf7\x99\x60\x36\xf2\x7b\xea\x1d\xf7\x88\xf2\x33\xcc\x65\xe3"
- "\x87\x74\xd3\x33\xb1\x50\xb7\x1c\x7d\x4d\xb9\x2c\x6b\x2c\x17\xe7"
- "\x3a\xc8\xc7\xc6\x03\xe2\xef\x00\x47\xdd\xac\x58\x92\xd9\x41\xb4"
- "\xec\x7b\xe9\x52\x1f\xc0\x5e\xa3\x06\xc6\x81\x38\xb5\x79\x01\xdb"
- "\x5b\x87\xb1\xd5\xe2\x49\x00\xe0\xf2\xbd\xd0\x6f\xcc\x31\x71\x1e"
- "\x6d\xb0\xe2\xd8\x34\x01\x9d\xf6\x6d\xe0\xf1\xf3\xf6\xaf\x07\xde"
- "\xcf\x5c\x01\xf2\xc0\x0a\x12\xb0\xc2\x4e\x42\xf1\x3d\x81\x6e\xcd"
- "\xe8\x2f\x8d\xba\x1b\x8e\x8d\x48\xc3\x0c\x78\x97\xd5\x2b\x12\x68"
- "\xd3\x8a\x16\xda\x5c\x9d\x50\x4f\x60\x9d\xe9\x57\x63\xa8\xc5\x58"
- "\xcf\xe7\xf1\x5d\xd1\xf6\x08\x63\x0a\x3a\x09\x3c\x63\xe3\xb0\xd5"
- "\xb8\x07\x86\xd9\x09\xd4\x1f\x1e\x94\xf6\x0b\x95\xb0\x3d\x45\xc6"
- "\xe1\x0e\x7b\x57\x2a\xad\x10\xfb\x52\x29\xe0\xef\x54\xb6\x97\xaf"
- "\x0f\xea\x3f\x68\xd3\x98\xb9\xac\xd4\xb1\xf7\x82\xdb\x06\x8c\x06"
- "\xa7\x18\x56\xec\x5e\xb4\x11\xe0\xbd\xd1\x36\x7a\x6d\x83\x58\x17"
- "\xef\x8d\x5e\x36\x93\xe2\xbd\x70\xcf\x0e\xc7\x3d\x8a\xbd\x3b\x1f"
- "\x71\xb9\x02\xc6\x16\x7f\x5b\x60\x2c\x45\xdf\x28\x1d\xff\xae\x6d"
- "\x6c\x90\xbe\x25\x9b\xc9\xa1\x02\xe4\x27\xf7\xf1\x99\x3f\xf6\x55"
- "\xc6\x13\xfa\x18\x63\x01\xe1\xf9\x50\x29\xee\x0f\xfc\xd6\x43\x5b"
- "\x7c\x6f\x93\x53\x3c\xaf\x3c\xa7\xd8\x80\x59\x16\xfa\x05\xf2\x09"
- "\xe0\x8a\xcf\x25\xf2\x31\xc6\x66\x28\xe3\xfb\x9f\x3e\x3e\x82\xfd"
- "\x6c\x24\x1f\x17\x40\x39\x90\xc7\x1d\xf8\xf8\x75\x11\x3f\x8a\xa2"
- "\xed\xb6\x40\x33\x3c\x13\xf7\xf2\x38\x95\x33\x00\x4f\x34\x50\xef"
- "\x03\x1e\x3b\x8f\x7d\x51\x54\xb9\x5c\xcf\x76\x29\x47\xb9\x94\x75"
- "\x6d\x30\x6f\x3c\x7d\x33\x5f\xff\x20\xb3\x17\x1e\xec\xbb\x92\x18"
- "\xb2\xbe\x24\x3e\xc0\x2b\x17\xb0\x6f\x35\xcd\x2d\xf8\x4e\x81\x34"
- "\x27\x9c\x98\x9a\x6d\x5c\xb6\x84\x35\xbd\x31\x0c\xea\x7c\x49\x42"
- "\xd0\x9f\x1b\xf3\x4c\x40\xfd\x4b\x3c\x2e\xf4\xe1\x57\xa7\x2f\xe9"
- "\x43\x84\x5f\xc7\xde\x4b\xd5\x31\xb1\xf8\xcd\x6e\x77\xa7\xb9\x17"
- "\x7e\xbf\xca\xdc\x0a\x3c\x69\x27\x21\xc0\x63\x4d\x98\xd3\x0b\x73"
- "\xae\xff\x57\x67\x73\x2f\x93\xed\x34\x31\xcc\x27\xea\x4b\xe4\x70"
- "\x8c\x6f\x06\xf1\xdd\x70\x91\x68\x80\xae\xb6\xc3\xb6\x08\x22\xc5"
- "\x0d\x28\xee\xc7\xf7\x3c\x17\x03\xbe\x2e\xd6\x52\x6b\x7b\xce\x5f"
- "\x76\x99\xc9\x5b\x46\x49\xc7\x5e\xc7\x73\x49\xf8\xc2\xf3\x1f\x50"
- "\x8b\x31\x12\xf8\xd8\xfe\xe5\x4b\xbe\x7f\x2a\xf8\xa7\x70\x8f\x59"
- "\x96\xbf\x0f\x8b\x7e\x84\x23\xc4\x98\x70\x87\x93\x0e\x83\xb6\xb4"
- "\x9a\xfb\x1e\x04\xb7\xe7\x1c\x0e\x70\xf8\x1e\x30\xbb\xd5\xe1\x24"
- "\xa0\x61\x15\x97\xcd\x47\x54\xcd\xb4\xfb\x8b\x73\x10\xcf\xeb\xac"
- "\x78\x2f\xdc\x17\xd8\xc6\x6c\x4c\x87\xc7\xc9\xbc\x76\x58\x83\x98"
- "\x0f\xef\x04\xed\xfd\x65\x35\xbe\x17\x8e\x09\xd4\x03\x3e\xfb\xcb"
- "\x9a\xc3\x3b\x3c\xc4\x50\xd5\x0c\x28\xb3\x31\x1b\xc8\xe6\x7a\xe0"
- "\xa7\xcb\x40\x83\xfb\x31\x4e\x92\x09\x9e\x53\x5d\xd2\x49\xaa\xb5"
- "\xad\xa4\x06\x7e\xa3\x8f\xb1\x71\xfe\x17\xa4\x49\xe7\x7e\xbd\x11"
- "\x40\x8f\x00\x59\x3b\x02\xdb\x42\x2c\x40\xbf\x2c\x13\xac\x60\x35"
- "\x16\x68\xab\x89\xb0\x36\xaa\x85\x66\x52\x9d\x86\x7a\xd6\x6e\x73"
- "\x4d\xc9\x69\x52\xa3\xfd\x1b\x7b\x0e\xca\x84\xc6\xe4\xd6\xee\xda"
- "\x1e\x07\x6d\xc7\x8a\x6d\xb7\x40\xdb\xc1\x9e\xdb\xde\x1c\xee\x65"
- "\xdb\x5e\xf4\x7b\xb3\xce\x9b\xb6\x41\xde\xdd\x65\xd2\xf2\xfd\x5a"
- "\x99\x0f\x90\xfb\xec\xd7\x31\x46\xe6\xa3\x94\xfb\xb9\x1e\x19\xcd"
- "\xf6\x74\xe5\xb0\x3d\x31\x65\x6c\x6f\xd7\x15\xc2\x7c\x15\xf9\x7e"
- "\xae\x0b\x04\xfd\x1c\xda\x73\x8e\x0c\x91\x75\x25\xc7\xf7\x27\x90"
- "\x55\x8f\xc4\x70\x7f\xc6\xa1\xa2\x3d\xfa\x48\x2f\x6c\xcb\x7d\x3f"
- "\x86\xd5\x71\xbf\xd8\x23\x6b\x25\xfb\x4b\x6b\xd0\xb0\x3a\xb1\x2d"
- "\x9d\xab\x5d\x4f\x4a\xea\x19\x9f\x96\x22\xe5\x07\x4d\x11\xb7\x95"
- "\x4e\x8e\x9f\x13\x9f\x98\x1a\x3f\x57\x37\x65\x49\xf2\xc2\x27\x17"
- "\xcd\x9b\xa7\x7b\x31\x7e\xf1\xe2\x59\xbf\x8e\xef\x43\xa6\x24\xcf"
- "\x5a\xb8\x38\x11\x6d\x6f\x3a\xdd\x98\x1f\xcf\x4c\x58\x94\xf2\xe4"
- "\xcf\xc6\x84\xbb\xd8\xde\x70\x0f\x62\x03\xca\xe0\xb0\x76\x84\x64"
- "\xda\x49\x10\xc6\xbc\x09\x5c\x46\x8d\xcb\x41\xff\x03\xfe\xbb\x84"
- "\xeb\x14\xae\x0d\xa8\x1b\x60\xbc\x3d\xc0\xef\xaa\x37\x0b\x69\xed"
- "\x45\x52\x8f\x72\x65\xfd\x76\x1e\x3b\xae\x01\x74\x72\x0b\xcf\x59"
- "\xf7\xf7\x33\x18\x17\xee\x77\x70\xce\x12\x34\xa2\x6a\xc3\x59\xe2"
- "\x0b\xeb\x1a\xe8\x25\x47\x8b\xa9\xfa\x1e\xba\x2e\x84\x56\xd0\x2f"
- "\xb4\x44\x8c\x87\xad\x36\x99\xad\xf8\x9d\x1e\xf4\xa5\x2c\x8a\x78"
- "\xca\xe7\xd6\xd1\x6d\x7c\x5c\x06\x8e\xe3\xfe\xc2\x7f\xff\x10\x75"
- "\x98\x55\x2c\xa7\xe0\x51\x98\xff\x07\x52\x64\x9c\x36\x55\x8a\xb2"
- "\x63\x3d\x8c\xfb\xd2\x46\x28\xf3\x98\x1c\x47\xeb\x95\x3e\x18\x95"
- "\xb0\x2e\xff\xad\x85\xff\xe3\x3d\x75\x01\xfc\x1f\x7f\x3b\xff\xff"
- "\xbd\x94\xff\xbb\x9e\xff\xb6\xff\xd2\xf3\x6f\xf5\xfe\xda\xec\xee"
- "\xff\x6f\xe6\xf9\x78\xbc\x9b\xef\xff\x6d\xee\xaf\x5d\xd3\xdd\x3f"
- "\xf2\x1b\xf0\x56\xc3\xef\xce\x12\x7f\xe0\xcf\x82\xf5\xb3\x81\xa7"
- "\xcf\x10\x6d\x86\x8d\x36\x65\xbd\x4a\x42\x33\xbf\x24\x98\xd3\xad"
- "\x39\x25\x8d\x36\x65\x5e\x47\x99\xb4\x16\x73\x9c\x94\xe7\x35\x92"
- "\x80\xf5\x8d\x44\x53\x93\x82\xf9\x5e\x31\x2e\x16\x3c\x0d\x47\x08"
- "\xca\x55\xa9\x56\x72\xc2\xf2\x0d\xfa\x2d\x19\x6b\xe2\x00\x77\x1a"
- "\x08\x41\xfe\x0d\x88\x23\xc1\xc5\x21\xf4\x20\xcd\x49\x3a\x48\xd5"
- "\x49\xbb\xe0\x5c\xdd\x5e\x21\xaa\xd7\xde\xf4\xca\x5e\xba\xd9\xb8"
- "\xc6\x1f\x7b\x55\xe4\xcd\x63\x7c\xaf\x90\x89\xe5\x20\x83\x79\x52"
- "\xc7\xed\xea\xb5\x63\xf9\x7a\x5e\xdb\x5f\xb4\x37\xc1\x6f\x13\x93"
- "\x15\xe1\x3d\xca\x31\x07\x26\xb6\xb9\x47\x28\x67\x39\x30\xf7\xa6"
- "\x47\xf5\xca\x98\x45\xd4\x35\x66\x58\x29\x01\x07\x71\x05\x83\x79"
- "\xb7\x0b\xe6\xd9\xbe\x6d\x21\x34\x1f\xfa\xb7\xae\x24\x84\xae\x81"
- "\x3e\x95\xb5\xe7\x1c\xab\x82\xb5\xc7\x28\x7e\x77\x31\xc2\xbc\xd8"
- "\xb5\x1e\xea\x44\x2f\x21\x8f\xae\x87\x7a\x79\x50\x0f\xe5\x64\xde"
- "\xbf\xea\x8d\x30\x06\xfb\xe1\x99\xb5\xba\x19\x58\x3e\xc1\x62\x00"
- "\xe1\xb3\xe1\x3d\x74\x8d\xe4\x44\x28\xac\x6d\xbe\xf8\x0c\xe9\xb9"
- "\xed\x39\xc7\x01\xff\x2a\xa4\xef\xbe\xf9\xbc\x9d\xe3\xb1\x7c\xbe"
- "\x0e\x1b\xb2\x41\xce\x51\x3a\x64\x7d\x3a\xac\xe9\x9d\x2c\x5e\x64"
- "\x01\xda\x5b\x50\xc6\x60\x72\x85\x9d\x04\x72\xfb\x00\xc8\x16\x09"
- "\x80\x03\x20\x4f\x30\x1f\x67\x90\x25\xa0\x2f\x05\x98\x2b\x0f\xaf"
- "\x83\xde\xb6\x1f\xd6\xe5\x7d\x28\x07\xcc\xb8\x36\x81\xa0\x8d\x1d"
- "\xf3\x5c\x2e\x9e\x4e\xad\x3c\x07\xc9\xf1\x72\x49\x16\x40\x0c\xc2"
- "\xf5\x1f\x64\x61\xdf\x1b\x40\x43\xe0\x81\x4a\x90\x2d\x82\x2e\x91"
- "\xe3\x6d\xe2\xd8\x57\xb2\x35\x3f\x95\xc5\x37\xf6\xe1\x18\x7d\x02"
- "\x7d\xe1\x03\xe0\x19\x95\x66\x52\xcf\x6c\xe1\x1c\x63\x4e\x68\xa4"
- "\x75\x1c\x75\x5e\x33\xb4\x41\x01\xcb\xc4\x6b\xf0\xfe\x1f\x37\x49"
- "\xcf\x84\x6b\x46\x71\xcc\xaa\x60\xcc\xb0\x4d\xa6\xfb\x83\xcc\x55"
- "\x25\x8e\x4d\x15\xca\x15\xe2\xbd\x09\x52\xbb\xa8\x97\x0b\x20\x57"
- "\xe0\x78\xe1\x38\x41\x3b\x55\x22\x8e\xd5\x71\xf9\xa5\x7a\x19\xe1"
- "\xdf\xdb\xf3\x81\xd6\xab\xe5\xf1\x3f\xb1\xcb\x79\xfc\xe1\xfe\xd5"
- "\x22\x2d\x07\x3a\xd1\x0e\x74\xa3\x2a\x1b\xda\x49\xa1\x8f\x07\xb9"
- "\x8d\xe7\xc4\x05\x8c\x2b\x86\x71\x8c\x61\x8c\x0f\xae\xc3\x98\xb9"
- "\x80\xcd\xab\xce\x02\xe6\xce\x46\xf9\xa9\x4a\x8c\x8b\x55\xb5\x1a"
- "\x79\x18\xca\xcc\x0e\xdf\x04\xfd\xc2\xf6\xa0\x3c\x15\x8e\x20\xc7"
- "\x56\xbd\xe8\x9c\x93\x56\xce\x47\x5b\x35\x46\xde\x67\x70\xc2\xc0"
- "\xf5\xe7\x13\x06\xb4\x81\xb1\xfa\x37\x12\xb0\x6f\x0d\x38\x2f\xa5"
- "\x77\xc5\xdc\xb4\x70\x1e\x65\xff\x06\xa4\x9b\x74\x1e\xe3\xed\x02"
- "\x9d\x02\xe0\x59\x67\xc4\x3e\x61\xd9\x1f\xca\x2c\xe7\x00\xe6\xa9"
- "\xdd\x80\xf7\x64\xca\xf7\xe0\xbc\x01\x1e\x0e\x84\x3a\x27\xe1\x48"
- "\xa5\xba\x3c\x7f\x6d\xd5\xf4\xcd\x9d\x68\x03\xab\x4a\x91\xf2\xd7"
- "\x62\xee\x5a\xc4\x8c\xf5\x33\x14\x63\x8f\x63\xb3\x0b\x68\xc5\xf8"
- "\xee\xb0\xad\x1c\xc6\xbb\x1a\xe4\xff\xff\x11\x63\xdc\x55\x4d\x17"
- "\xfb\x67\xe4\xf9\x18\x8e\x14\x94\x6c\x92\x62\x2c\x54\xcb\xdf\xff"
- "\x1d\xb2\x65\xd5\x74\xe4\x49\x68\x8b\xf1\x0e\xca\x89\x50\x2f\xc9"
- "\xc1\x5b\x6c\x1f\x6f\x55\x0b\xca\x97\x62\xff\x91\x5f\xaa\xc5\xb1"
- "\x2b\x70\x9e\x77\xce\xf3\x1c\xda\x00\xfd\xff\xb0\x83\x07\xa4\x79"
- "\xcd\xf9\xa0\xe6\x82\x68\xb3\xab\xc7\x78\xb7\xd0\xae\x11\x65\x70"
- "\xbe\xae\xd6\x94\x1f\x6e\xb0\xa1\x0d\xbd\x0e\xca\x30\xbf\x6b\x0a"
- "\x5a\xfb\x3d\x13\xb7\x9a\xe1\x46\x0d\x8c\xc3\x53\x2c\x06\x04\x8e"
- "\x8b\x34\x5f\x37\xcc\x40\xdd\x2f\x9c\xcf\xd9\xb4\x26\x52\x63\x6d"
- "\x21\xa2\x0f\x3f\xcc\xd9\x0b\xf8\xed\xf4\x12\xf0\x90\x3f\xce\x5f"
- "\xa0\xef\x2e\x8c\xcd\x0c\xe3\x58\xbb\xba\x90\xcd\xdb\x00\x9c\xb7"
- "\x37\x30\x36\x04\x3c\xa7\x22\x2e\x0a\x7a\x6d\x64\xf3\x18\x63\x7e"
- "\xbc\x09\x63\x87\xb9\x62\xe1\xd9\xd9\x92\xef\x31\xf2\x08\xc6\xf8"
- "\x10\xf9\xa4\x12\xe7\xb2\x38\x76\xbe\x50\xaf\x4c\x9a\x7b\x4e\xf4"
- "\x67\x75\x5c\xe6\x5b\x20\x9f\x6f\x35\xf5\xd2\x58\xdb\xd8\x3c\xae"
- "\x4a\xb1\xc1\x3c\x76\x1e\x53\x1c\x4f\x1c\xd7\xf6\x1c\x13\xb4\x55"
- "\x11\x2a\x8d\xa9\x3c\x9e\xa6\x25\x22\xcd\x6b\xb9\x8d\xc9\x14\x21"
- "\xda\x9f\x1c\x63\x28\xf2\x1f\xe6\xf8\x2c\x5f\x85\xef\x0e\x6b\x03"
- "\x3e\x1f\x79\xe4\x4d\x11\xb3\x2a\x2c\xc8\x23\x26\x98\xff\x93\x9a"
- "\x65\xec\xa8\x4a\x63\x3a\x0b\xd0\x89\xd3\xc7\xf4\x16\x8b\xa3\xe1"
- "\x06\x3b\xcc\xa4\x3a\x4e\xc6\x27\xd3\x3e\x69\x1c\x24\x9e\x94\xe6"
- "\x3d\xb4\x61\x57\xe2\x8f\xe9\x3c\xb4\xd1\x0f\xf1\x4d\x96\xa1\x4c"
- "\x16\x25\xbe\x99\xea\x11\xdf\x90\xaf\x0d\xa9\x68\x63\xe3\xeb\x95"
- "\x99\x1c\xcb\x56\x62\xd2\xb1\x25\xdc\x37\x80\xcb\x5c\xc8\x5b\x86"
- "\x19\xbc\x3e\xae\x61\x50\x9f\xe9\xe2\xe2\x9a\x87\xb1\x88\xf1\x5c"
- "\x92\x38\x5e\x0d\x50\xbf\x02\xf7\x43\x62\x0c\x84\x7b\x1b\xb8\xae"
- "\x07\x38\x7d\x10\x63\x5d\x43\xbd\x21\x35\x20\xe7\xdf\xc8\xe5\xd8"
- "\x2d\x61\x05\x9d\x13\x7b\xef\xd2\x66\xd2\xdb\xf0\x33\xfa\xc5\x45"
- "\xf2\x09\xc6\xe3\xb6\x62\xbc\x45\x68\x5b\x77\x91\xfc\xed\x24\x3c"
- "\x37\x58\x3c\x6a\xe1\xf8\x21\x1c\x1f\x80\xe3\xdb\x70\x7c\x08\x8e"
- "\xeb\xa1\xbe\x20\xd6\x0f\x87\xf2\x12\x38\xff\x63\xf1\x08\x7d\xfc"
- "\x04\xfd\xef\x63\x44\xd9\x11\xcf\x8f\xc7\x32\x1c\x47\x8a\x34\xe7"
- "\xeb\x05\xf9\x64\x28\xb4\x93\x06\xfd\xaf\x37\x35\xb0\xb6\x0c\x17"
- "\xc9\xa7\x1d\xd8\x36\xee\x4f\x86\xdf\xbb\x9d\x64\x50\x68\xe7\x93"
- "\x53\x70\x1c\x0e\xc7\x6d\x70\x4c\x81\xe3\x6b\xe2\x18\xd4\x22\x36"
- "\xcc\x4d\x63\x63\xbe\x4e\xc7\xe5\xdd\x18\x69\xce\xe3\x3a\x2c\x63"
- "\xc7\xf1\xaa\xb9\xd3\x39\xbd\xcd\xa4\x86\xf1\x01\xd4\x1d\x8d\x75"
- "\xe1\xf8\xbc\x78\x8c\x12\x8f\x63\xc5\xe3\x2f\xc4\xe3\x18\xf1\x08"
- "\xfa\xe8\x27\x29\xa2\x8c\x01\xe3\xf2\x49\x0a\xf3\x7b\xca\x1f\xda"
- "\xc4\x9f\xf1\x69\x01\xea\xc8\x80\xe3\x3f\x81\xf6\x7d\xda\x73\x3e"
- "\xf5\x97\xec\xa3\x68\xf3\xb9\x91\x73\x64\xef\x9b\xec\xbb\xf6\xa7"
- "\x3a\x27\x6c\x2b\x0e\x50\x45\x11\x90\x81\xfa\x17\xab\x61\xfd\xe7"
- "\xed\xa4\xa9\xc5\xef\xc2\x62\x1c\x7d\x1f\x8c\x2d\xc7\xf4\xa1\xa0"
- "\xf7\xc6\xe1\x5c\x65\xb6\x63\x8c\x83\x16\x34\xa2\x14\xfe\x77\x81"
- "\x6e\xb0\x4f\xc2\x6f\xd4\x7b\xc4\x98\x95\x15\xf0\xac\x75\xb2\xae"
- "\xfe\x69\x24\xff\x86\xf6\x83\x28\x38\xbf\x43\x3e\xff\x89\x15\xfb"
- "\x0c\xe3\x59\x0f\xef\x33\xbc\x91\x7c\x8a\xf1\xf0\x87\x35\xf1\x77"
- "\x0e\x97\xde\x59\xa4\x87\x41\x1a\xdf\x26\xf2\x49\x06\x60\x61\x32"
- "\xf2\x70\xa3\x03\x67\x3f\x61\x76\x5d\x91\x47\x80\x96\x9f\xfc\x04"
- "\x69\xea\x34\x07\x9d\x31\x28\xb8\x3d\xe7\x6f\x43\x94\x98\x72\x62"
- "\x08\x62\x0a\xf2\x06\xe0\x37\xd2\x3a\xc0\x65\xfe\xd5\xe3\xfc\xe3"
- "\xf3\xee\x6f\x09\xca\x7b\x4d\xf5\x36\x3e\xef\xea\x81\xcf\x80\x3f"
- "\x6b\x5b\x90\x3e\x66\xf2\xb7\x71\xe2\x9c\xae\x87\x39\xfd\x13\x38"
- "\x5f\xc7\xfb\xca\xcf\x8b\xcf\x02\x3e\xab\xc5\xf7\x7e\x48\x3a\x2f"
- "\xbe\x2f\xb6\x83\xf1\xd4\x1f\x90\xce\x8b\xed\x03\x3f\xd6\x1e\xc4"
- "\x79\x22\x9d\x17\xdf\x09\xe4\xa8\x3a\x22\xe1\xc9\x3a\xce\x6f\x6b"
- "\xa4\xfb\x90\x6e\x18\x6f\x8a\xdb\xf8\xff\x86\xdf\x50\x4b\x71\x7d"
- "\x58\x35\x83\x04\x2c\x2d\x22\xf7\xf1\x79\xf9\xb7\x16\x25\x46\x7e"
- "\x56\x4d\x73\x02\x6d\x54\x33\xa2\xa8\xda\x36\x5c\x92\x57\x8b\xe1"
- "\x39\x09\x52\xae\x64\x39\x26\x7f\xdd\xb6\xea\x52\xc7\xf8\x62\x5f"
- "\xd6\x49\x7d\x71\x5a\x9f\x19\x0d\xb0\x6f\xd8\xd6\x2a\x90\xd7\xdb"
- "\x00\x17\x38\x6e\xd7\x1d\x94\x72\xc8\xe7\x89\xeb\x16\xe6\x2d\xcf"
- "\x4b\xe5\x79\xcc\x71\x6d\x44\x1f\x1f\x01\xed\x58\x69\x76\x52\x63"
- "\x00\x5d\x3e\xed\x02\x99\xb9\xac\x0f\xc6\x54\x89\x85\xbe\xbe\x0f"
- "\x7d\xdb\x61\x47\xdb\xff\x42\xd4\x53\x3f\x8b\xb7\xa7\x52\xab\x38"
- "\x66\x30\x8f\x3e\x1b\x2f\x8e\x2d\xe2\x17\x8b\xc9\xb7\x2a\x93\xe7"
- "\xd7\x41\x5b\x0e\xce\x8f\xcd\xb8\x8e\x69\xa9\xb5\xa2\x18\xe7\xca"
- "\xc9\x89\x92\x4c\x0a\xfd\x2d\xe5\x32\x61\xcd\x4e\x16\x73\x28\x7f"
- "\x44\x11\xb7\x05\x9e\x3c\xc5\xdf\xfd\xa4\x91\x7f\xe7\x66\xf1\x24"
- "\xb1\xbc\xcb\x47\x1b\xf2\x0e\xf7\xcb\x3a\x72\x9c\xfb\x94\x9c\x74"
- "\xe4\xff\x70\x92\x15\x2b\x78\x3c\xa8\x93\xe5\xf2\x9c\x38\xb9\x06"
- "\xef\x83\xfb\x0f\xc0\xf9\x5a\xf9\x7c\x4d\x99\x68\xef\x2a\xee\xbb"
- "\x32\x0a\x7d\xcb\xfa\x63\x5c\x6a\xfe\xbc\xcf\xc2\xd9\xf3\x99\xcd"
- "\x03\xe6\xa6\x38\x7f\x71\x9c\x71\xcd\x66\x73\x18\xe6\x2f\xce\xe3"
- "\x1b\x1b\x47\x94\xc2\x3f\x9f\xb7\x7c\x6d\xae\x60\xf3\x96\xcd\xd9"
- "\xcf\xa2\x9c\xfa\x61\x65\x76\x2f\xa4\xe7\x72\x6d\x00\x5c\x9b\x0e"
- "\xeb\x6a\x9d\x78\x8d\xf9\xde\x61\xdc\x10\xdb\x75\x6a\xc1\x6f\xdb"
- "\xf8\xad\x13\xf7\x5e\x05\x02\x77\x63\xac\x0f\xe9\x5b\xf5\x8b\x2d"
- "\x59\xd4\x8e\xdf\x9d\xae\xd3\xb6\x7c\x47\x5c\xfc\xcf\xca\xe4\xb8"
- "\x3d\x27\xfd\xc5\xf7\x2a\x82\x67\x15\x73\x5f\xb0\xba\x0e\x2e\x53"
- "\xd5\x59\x91\x4f\x4d\xc0\x7b\x70\x2c\xe2\xb9\x6d\x3f\x6b\x92\x78"
- "\x0f\xe6\xe5\xdc\x8b\xe4\xef\x4b\x0a\x42\x68\x11\xd0\xb4\x08\xe6"
- "\x52\x12\x94\x67\xc1\x71\x2e\x3f\xaa\x34\x78\x14\xe7\x48\x51\x7b"
- "\xce\xdf\x75\x52\x4e\x6f\x1c\x9b\xb6\xa0\xcd\x31\xc8\x67\x79\x30"
- "\x0e\xc8\x6b\xec\x3b\x32\xf4\x1b\xf9\x0b\xf9\x0c\x79\x2c\x70\xe5"
- "\x04\xc6\x67\x2c\xae\x00\x9c\xc7\xfe\x22\x9f\x41\x5b\x49\x52\x4c"
- "\x5c\x33\xf9\xbb\x86\x7f\xcf\xf9\x7b\xb6\xe4\x4b\x8b\xdf\x92\x52"
- "\x06\x90\xfe\xd0\xae\xae\x42\xc7\xe2\x4e\x9e\x33\xd9\xc6\x12\xac"
- "\x8b\xdf\xe1\x38\x4e\xfe\x60\x33\xdc\xb3\x5f\x1e\xf3\x13\x43\xd8"
- "\x37\xa3\xe9\xcc\x16\x79\x3f\x5c\xab\x75\xd6\x33\xcc\xe4\x68\x31"
- "\xea\x1a\xe8\xdb\xf7\xc3\x60\xa2\x03\xbe\x05\x1c\xfb\x7b\x9b\x24"
- "\xd7\x3e\x1d\x8c\xdf\xf3\x8f\x8e\x83\xfe\x35\xf0\x3c\xe5\x47\x87"
- "\x83\x2e\x59\xe9\xc1\x66\x3c\x1c\x6d\x3d\x62\x2e\x9b\x06\xb4\x63"
- "\x61\xec\xff\x8b\xe4\xf3\x25\xd5\x18\xe3\x63\x51\xd7\x98\xc8\x99"
- "\x69\xf4\x1a\xc6\x45\xd6\x25\x93\xfb\x1b\xc9\xe7\xb1\x68\x37\xca"
- "\xfa\x06\x6d\x34\xf5\x19\x4a\x1b\x4d\x7d\x95\xf8\x6f\x26\xe4\xd4"
- "\x18\xa7\xff\x3a\xf1\x18\xd3\xc3\x7f\x8b\x58\xd7\x4a\xc8\x69\x5f"
- "\x71\xac\xfe\xd6\x9e\x53\xef\xb0\xff\x22\x5f\xe2\xdc\x46\x3f\x0e"
- "\xb4\x39\xa9\x6c\x04\x63\x8a\x00\x9d\xa0\xdf\xab\x9e\x98\x6c\x4c"
- "\x47\x3e\x3a\xc5\x72\x7d\x63\xbc\x5e\xef\x7c\x89\x4e\x31\x7a\xf2"
- "\xd8\x99\xf5\x75\xf0\xec\x2f\x36\x5c\x21\xbe\x86\x64\xf2\x30\xda"
- "\xbf\x03\xed\xd4\x88\x3a\x2e\xf2\xc4\x76\x96\x43\xe6\xd4\xc9\x94"
- "\x15\x44\x0d\xd7\x1f\x85\xdf\x15\x92\x9c\x04\xf7\x68\x7c\xac\x24"
- "\x18\xe5\xa3\xe7\x57\x90\x47\xdb\x73\x4e\x95\x4a\xb4\x42\x19\x02"
- "\xed\x70\xa2\x2d\x01\xfa\x5a\x7f\x1e\xef\xc3\x98\xee\x66\x36\x6e"
- "\x0c\x87\xb1\x8d\x00\xe8\xcf\x3a\x9f\x36\xa2\xe1\x6b\xcf\x29\xe0"
- "\xff\x23\xa2\xcc\x78\xaa\x0c\x78\xbf\x4e\xee\xa7\xb6\xbf\xd3\xef"
- "\xa9\x78\x7f\x60\x1b\xca\x67\x9e\xc6\xe7\xf4\x50\x69\x7c\xd0\x5f"
- "\x35\x10\xf4\x04\x46\x6f\x1b\x6d\x81\xbe\x55\x19\xd2\x89\xff\x25"
- "\xf2\xf9\x80\xed\x85\x6c\xff\x5c\x25\xb7\xcf\x7f\xde\x5f\xd2\xc3"
- "\x79\xbf\x4f\x9f\x0f\x5c\xe9\x43\xd0\xae\x8e\x71\xcc\x98\xaf\xdf"
- "\xd7\x5a\x66\x4b\x37\xd9\x22\x89\x31\x73\x14\xd6\x91\xe4\xaa\x86"
- "\xd6\x2c\x2d\x39\xac\x8d\x84\x79\x7c\x7a\x17\xcc\x15\xb3\xf7\x3e"
- "\x95\xa7\x77\x89\xe3\x5b\xc5\x7d\x11\x4e\xaf\xc0\xb5\x04\x75\x7f"
- "\x58\x47\x2a\x70\x8d\x6e\xcf\xf9\xdc\x5f\x9a\x37\xb0\x6e\x54\xc0"
- "\x3d\xdc\xc7\x3a\x1f\xbf\xff\x9e\x4e\xc3\xd8\x0e\x4c\x6f\xe0\xf5"
- "\x03\xb8\xcd\xff\xf3\x48\x87\x2c\x0d\xf5\xf0\x3e\xee\xa3\x76\x3a"
- "\x66\xa6\x5d\x05\x63\x7a\x3a\x06\xdf\x8d\xf3\xa2\xf6\x15\xa8\x9f"
- "\x24\xcf\xdb\x53\x0c\x9b\x0f\xb7\x38\xcf\xcb\xcf\xd7\xc9\xfa\x66"
- "\x7d\xd4\x93\x05\x44\xe7\x6e\x1e\x1a\xfa\xe2\x5a\xf5\xb9\x7d\xc3"
- "\x06\x5a\x9a\xaf\x16\x9e\x5b\x95\x47\x02\x54\xeb\x60\xd8\x70\x9e"
- "\xa5\xc6\xf5\xbf\x48\x1a\xee\x0b\x0c\xf8\x41\xcc\xf3\x29\xf7\xd0"
- "\x4c\x2d\x51\xaf\xbf\x7a\x8f\xff\x00\xeb\x0f\x4a\xa9\xcf\x13\x93"
- "\x5f\x4c\xb1\x12\xdd\xfc\x7c\xf2\x8f\x24\xe2\xf3\x3c\x68\x0b\x3f"
- "\x0c\x20\x06\x33\x39\xab\xc5\xbd\xa0\x87\x03\x50\xfe\x38\xab\xc5"
- "\x36\x33\x8a\x89\x7f\x46\x13\x6d\x5e\x37\xaf\x97\x3f\xac\x07\x9a"
- "\x37\x81\xc7\xee\x0d\xf8\x41\xe9\x0d\x68\xe3\xe3\x38\x76\x9f\xdb"
- "\x18\x51\xbc\x6f\x0d\x5b\xdd\xf7\xcd\x10\x02\x7d\xdb\xe9\x5d\xdf"
- "\xce\x95\xcb\x7d\x3b\x57\xfe\xed\xfb\x76\xe6\x27\x4e\x7d\xd3\xc8"
- "\x7d\x4b\x80\xbe\x9d\x19\xeb\x5d\xdf\xce\xc7\xca\x7d\x3b\x1f\x7b"
- "\x93\x7d\xdb\xd5\x4d\xdf\x3e\x71\xdf\xb7\xb4\x1f\x40\xdf\xce\x7b"
- "\xd7\xb7\x46\xab\xdc\xb7\x46\xeb\xb7\xe9\x1b\xea\xf2\x99\xa1\xf4"
- "\x02\x8b\xbd\x9e\x4c\x02\xd0\x77\xef\x22\x39\x37\x3a\xb3\x98\x95"
- "\xfb\x5d\x24\x67\xed\xe2\xfc\xb6\x64\xb5\xd1\x2f\xb8\x9c\x73\x36"
- "\xf1\x29\x03\xfa\xbb\x9e\x8d\x03\x5e\xd6\x72\x9e\x3e\xc7\xfc\x1b"
- "\xb2\x2c\x54\xf4\x37\x3d\xbb\xb6\x84\xf9\xa3\x44\xfa\x8b\xe5\xaa"
- "\xd6\x7e\x23\x30\xaf\x4f\x8b\x00\xf3\x99\xf6\x1b\x61\xc6\x5c\x94"
- "\x7b\x93\x2d\x6a\x9a\x83\x31\xc1\x30\x8e\x9f\x2f\xa1\x9b\x46\x58"
- "\xf6\x26\x5b\x59\x2e\xe6\x55\x6c\x1f\xef\xd9\x0a\x69\xef\x9a\xf4"
- "\x0c\x4b\x50\xa4\x3f\x9c\x6f\x90\x72\xdf\x52\x35\xca\x33\x23\xea"
- "\xb1\x7d\x38\xdf\x26\xe5\xa7\x05\x7e\x5f\x23\x62\x43\x5b\xa0\xb5"
- "\x3b\xdc\x3b\x37\x58\xc2\xbd\xe7\x53\x48\x20\xe6\x70\xdc\x90\x79"
- "\x0f\x7e\x73\x04\x7d\xfa\x6c\x39\x8e\x7b\x74\xdb\x3d\x34\x30\x83"
- "\xf8\xe0\x9e\x3d\xf4\xd1\x33\x69\x2d\x24\x2c\x83\xf4\x8a\x4e\x83"
- "\x36\xad\x24\x2e\x30\x0d\xda\x83\xb1\xe6\xba\xc1\x39\x66\xe3\x2b"
- "\x80\xf6\xf0\xfb\xb7\x4f\x0a\x09\x78\x5e\x9b\x45\x57\x6d\x25\xbe"
- "\xb8\xbf\x0f\xf7\xe9\xf1\x3d\x7a\x7e\xf0\x1e\xe7\x76\x48\xef\x77"
- "\x13\xf4\xe9\xcb\xe9\x63\x3e\x2f\xd3\xc7\xbc\xad\x2b\x7d\xcc\xbd"
- "\x39\x7d\xcc\x44\xa6\xcf\xf9\x31\x4a\xfa\x98\x07\x2b\xe9\x63\x4e"
- "\xba\x35\xfa\x98\xe7\xca\xf4\xe1\xcf\xe0\xf4\x31\x67\xb8\xa7\x8f"
- "\xb9\x40\xa6\x8f\x59\x7f\x73\xf4\x31\x1f\xf3\x4c\x1f\x73\x6c\x37"
- "\xf4\xf1\x73\x4f\x9f\xf3\x0f\xdc\x3c\x7d\xce\x8f\xf1\x82\x3e\xf7"
- "\x71\xfa\x34\xae\x94\xe9\xd3\xf8\x6c\x57\xfa\x9c\xdf\xc9\xe9\x73"
- "\xbe\x54\xa6\x4f\x63\x93\x92\x3e\xe7\x8f\x29\xe9\xd3\x18\x70\x6b"
- "\xf4\x69\xf4\x95\xe9\xc3\x9f\xc1\xe9\xd3\x18\xea\x9e\x3e\x8d\xc3"
- "\x65\xfa\x9c\xaf\xbc\x39\xfa\x34\x26\x7a\xa6\xcf\x79\xab\xf7\xf4"
- "\x69\x3c\xe0\x42\x1f\x8d\x67\xfa\x34\x36\x79\x41\x9f\x40\x4e\x9f"
- "\xa6\x01\x32\x7d\xbe\x38\xd3\x95\x3e\x5f\x8c\xe7\xf4\xf9\x22\x4a"
- "\xa6\x4f\xd3\x6a\x25\x7d\xbe\x48\x54\xd2\xe7\x8b\x5d\xb7\x46\x9f"
- "\x2f\x76\xc8\xf4\xe1\xcf\xe0\xf4\xf9\xe2\xa0\x7b\xfa\x7c\x51\x27"
- "\xd3\xe7\x8b\x84\x9b\xa3\x4f\x53\x6f\xcf\xf4\xf9\xa2\xa8\x1b\xfa"
- "\xdc\xe3\x9e\x3e\x4d\x2f\xdf\x3c\x7d\x9a\x56\x77\x47\x1f\xef\x64"
- "\xbd\x26\x96\x93\xe2\x36\xb4\x63\xf6\xd4\x0e\x8e\x1d\xfa\x1f\x0a"
- "\x39\x4d\xe6\x12\xc1\xcf\x9f\xef\xd1\x68\x2a\xd2\xa5\x93\x9f\x37"
- "\x92\x0b\x4f\x96\x08\xbd\xfc\x69\xce\xdb\xa1\x42\xce\x3b\x15\x74"
- "\xa5\x9f\xaf\xb0\xf2\x1e\x5f\xdc\x73\xed\x39\x27\xf6\x85\xf5\x3e"
- "\x0f\x90\x47\x70\xdf\xdc\x2a\x90\x97\xf1\x77\x7b\xce\x85\x22\x90"
- "\x05\xc7\x74\xb7\x7f\x0b\x7d\x9d\x0e\xaf\x46\xfd\xf6\x42\x85\x23"
- "\xde\x45\x0e\x4d\xc3\xb8\x61\x86\xc7\x70\x9f\xc5\x85\x96\x02\x16"
- "\x87\x6a\xd8\xdc\xa8\xc7\xe8\x39\xd4\x3d\x2e\x92\x8b\x5f\xd2\x8d"
- "\xc3\xe6\x22\x3f\x80\xac\x7e\xff\x25\x72\x71\xb8\xc3\x3f\x8f\xc6"
- "\xbe\xc1\x6d\x84\xc3\x34\xbc\x6e\xf3\xcb\x50\x57\x83\x39\x3b\x17"
- "\x67\x62\x2e\xca\xe6\xd1\x20\xfb\x3e\x8e\xcf\xc0\x98\x48\xdb\xe1"
- "\x88\x7e\x32\xdc\x37\xf3\xe2\x14\x26\x2f\xaf\x7a\xe8\x0d\xee\x0b"
- "\xd7\x3c\x58\xe2\x3b\x78\x4e\x1f\x28\x07\x89\xf2\x3c\xd6\xbf\xf7"
- "\x12\xf9\x47\x87\xd3\xf5\x00\x28\x9f\x81\xb6\x83\xc4\xeb\xf7\x41"
- "\xf9\x63\x94\xb3\x59\xfc\x8e\xbc\x6c\xd1\x87\xf8\x1f\x3b\xe0\x9c"
- "\x46\xac\x13\x04\x75\xd6\xa2\xec\x2e\xb6\xd1\x0f\xca\x0b\x50\x07"
- "\x16\xaf\x07\x43\x79\x12\x7e\x3b\x10\xaf\xf7\x87\x32\xda\x3a\x07"
- "\xf1\x3d\x2f\x37\xc4\x39\xfa\x0f\x72\x6b\x7b\xc1\xff\xc1\xf4\x56"
- "\xa4\x01\xd7\x05\xfe\xe1\xe4\xff\x73\xb1\xd9\xe5\xda\x5c\xa7\x6b"
- "\xf5\xd2\x35\xee\xa3\xf6\x8f\x6c\xa7\x6b\x95\x2e\xd7\x8a\x9d\xae"
- "\x95\xbb\xb4\x59\xee\x74\xad\xcc\xe5\xbe\x3a\xa7\x6b\x05\x2e\xd7"
- "\x2c\x4e\xd7\x56\x8b\xd7\x7c\xda\x73\x9a\xfd\xe5\x6f\x78\x17\x53"
- "\xc4\xf3\x6a\x38\xaf\x73\x3a\x3f\x57\x3c\x0f\xcf\x6f\x8e\x30\x93"
- "\xa2\x50\xf1\x3c\xa3\x3d\x6f\xbf\x39\xc6\xa9\xfd\xe1\xdc\xc6\xd1"
- "\x3c\xd7\xe1\x3b\xd7\x2f\x22\x5c\xb8\x11\xfb\x06\x5c\x0b\x45\xbe"
- "\x72\xe6\xed\x85\xa9\xba\xd9\x4b\x7e\xad\x4b\x8e\x4f\x41\xf7\x95"
- "\x05\x89\x29\xba\x05\x8b\xe6\xc6\x2b\xe2\xa7\x07\x63\x2c\x41\xcc"
- "\x3f\x86\x31\x59\xc4\x58\xff\xcd\x8e\xfc\x18\x80\xab\xf0\xac\x5a"
- "\x33\x19\xc3\xec\xd8\x05\x3c\xce\x78\x25\xc6\x74\xe1\xf1\x5b\xc8"
- "\x84\x46\xd2\x7c\x52\x8c\xdf\x62\x84\xba\x36\xcf\xf1\x5b\x2e\xd5"
- "\xb3\xb8\x85\x50\x8f\xc7\x6f\xb9\xd4\x00\xf3\xfc\x79\xda\x87\xe7"
- "\xbb\xe0\x79\xc0\xbe\x94\x64\x13\xcb\xcc\x0e\x16\xfb\x2f\x9b\xdb"
- "\x32\x5c\xe3\xb0\x0e\x1b\x83\xf7\x89\xdf\x4b\xc7\x38\xdd\x9f\xc0"
- "\xaf\x4b\xeb\x83\xf8\xcc\xfc\x61\xe3\xa0\xdc\xa7\x11\xca\xcc\x7e"
- "\xcf\xae\x7d\xc9\x6d\x79\x1b\x87\x4d\xc4\x77\xc2\xf7\x56\xbe\x9b"
- "\xfa\x57\x8d\xe4\xcb\xf7\xe5\x77\xfb\xb2\xde\x29\xc6\x9b\xf4\x0e"
- "\x84\xcf\xd1\x2e\xef\xca\xfc\x13\xa9\x66\xd8\x44\x7c\x36\xe2\x19"
- "\xdf\xcb\x00\xe5\x8d\xc3\xc6\x49\xfd\x71\xea\xdf\x44\xd4\xeb\xa1"
- "\x7f\x67\xd8\x98\x00\x4d\x29\xd0\x54\x7c\x87\x6d\x34\xa7\x39\x9b"
- "\xf9\xe6\xe3\x1e\x60\xcc\x5f\xc2\xd6\xaa\x4b\x09\x92\x2d\x13\xd7"
- "\x28\x6e\xc3\xbc\x24\xcb\x7f\x18\x7b\x6b\xa3\xb4\x7e\x5d\x72\x92"
- "\xff\xf8\x33\xe1\x5c\x99\x33\x0f\x39\x3d\xef\x24\x3e\x0f\xea\xc5"
- "\xf0\xfd\x00\xc3\xc6\xe1\x7c\x87\x72\x30\xfa\x62\xe2\xbd\xd8\x47"
- "\x4f\x39\xeb\x3c\xc5\x46\x94\xc7\xf1\x2b\x9d\x34\x8e\x05\x2c\x77"
- "\xd2\x57\xe1\x92\xbd\x8e\xed\x47\x82\x3a\x05\x8e\x1c\xce\x5f\x4d"
- "\x67\x79\xd0\xf2\xdf\x2b\x7f\x3a\x80\xc4\xf1\xb1\xfd\x2a\x1e\x31"
- "\x1e\xe7\x0c\xc7\xfa\xaf\x2a\x38\xcd\x9f\x31\xf3\xfe\x7f\xb5\x1e"
- "\xcf\xcb\xfe\xf7\x5f\x35\x49\xf5\x24\x5c\xe6\xdf\xab\xbe\xfa\x90"
- "\xd5\x63\x79\xae\x9e\x11\x69\x3e\x48\xd3\x48\xbe\xaa\x15\xeb\xf3"
- "\xbc\x84\x2c\x2e\xcf\x57\x2d\x74\xe3\x33\xcd\xd0\x57\xd0\x7f\x9a"
- "\x8b\xf8\x38\xf2\xe7\xc2\xb1\x16\xfb\x82\x63\x84\x7b\xc7\xe9\xc6"
- "\xf7\xca\x69\xd0\x33\x66\xf7\x7b\x49\x99\x5f\xf7\xa3\x97\xc8\x65"
- "\x2e\x43\xa8\x29\xb3\xef\xf2\x77\xbd\x9c\xe8\xe4\xfb\x1c\x20\xd5"
- "\xe1\xd8\xcd\xae\x31\x9f\x72\x43\x2a\xda\x83\xc4\x6b\xa9\xb8\xbf"
- "\xd6\xf1\xdb\xcf\xe9\x77\x2f\xfc\xcd\xfc\x9a\xd3\xd9\xda\xea\x2b"
- "\xef\xdd\xbf\x9c\x00\xe5\x00\x97\x72\xb0\xa2\xbc\x8c\xfb\x3d\x83"
- "\x6c\xd6\xc4\x7c\xc8\xc5\xf3\x62\xdb\xbd\x59\x7f\x52\x69\x04\xf0"
- "\x46\x2c\xee\xc5\x16\xe7\x61\x2c\xee\xe1\x0e\xb4\xbd\xca\xf6\x6f"
- "\xc3\xf5\xe1\xe2\x31\x5c\x3c\x0e\xe1\x39\x4d\x2f\xeb\xe4\xbc\xe4"
- "\x68\xa3\xb9\x1c\xee\x29\x4f\xba\x94\x47\x5e\xca\x93\x8e\xfb\xbf"
- "\xc5\xbc\xae\xd3\xe1\xbe\x84\xee\x72\xd2\xc3\xf5\x35\xd2\x5e\x6e"
- "\x7b\xfe\x50\x9b\x90\x5f\x80\x39\xc5\x1e\xc5\xf8\x5f\x59\x2d\x18"
- "\x03\xa6\x8d\x98\x48\x27\x31\xa5\xb4\x67\x63\x1e\xcd\x1a\x9e\x3f"
- "\x13\xf7\xc0\xaa\xd0\x6e\x8e\xb2\x63\x8d\xe1\x32\xcb\xa1\xb9\xb4"
- "\x85\x84\x1a\x7e\x46\x9b\x60\x0c\x5a\xec\x1b\x87\xda\x44\x3e\xda"
- "\x0a\x6b\xe0\x23\x97\xc8\x15\x66\x2f\x66\x39\xa0\x5b\xd8\x77\x2f"
- "\xff\x8b\xe4\x4a\x06\xab\x43\x63\xb7\xf2\xb1\xbb\xc2\x6c\x5f\xdb"
- "\x73\xa4\x3c\x89\x57\xc2\xa4\xbc\xcc\x66\x72\x25\xfb\x5a\xd0\x42"
- "\x2b\x9c\x8b\x50\xfa\x4c\x5f\x99\x84\x6d\x62\xdf\xcd\xe4\x72\x1b"
- "\xb6\x0d\x75\xa6\x3b\xe6\x2c\x9c\x5f\x6a\x23\x0f\x42\xbf\x2e\x4a"
- "\xed\xc3\x75\x98\xff\x2d\xfe\x78\x1d\xdb\xbc\xb6\xb1\x00\xdb\xcd"
- "\x37\xfb\xfa\x1a\xb8\xcf\xf5\x15\x58\xff\xfe\xcb\xd0\x9d\x0c\x44"
- "\x35\x91\x5a\xc0\x4f\x9d\x90\x1f\xa9\xe1\x31\xba\x23\xb5\xdc\xc6"
- "\x78\xe5\x4b\xf4\xeb\xda\x70\x9d\xf8\xa2\x0f\x04\xe7\xd9\xaf\x9f"
- "\x64\x7c\x0c\xe7\x00\xab\xcb\xe8\xc6\x48\x1d\x5b\xcf\xbc\x5a\xf7"
- "\xaf\xf0\xbc\xd8\x57\x89\x7f\x5e\xb2\x14\x63\xfc\xeb\x31\x4e\x79"
- "\x11\xc4\x7d\x2f\x5f\x2f\xa8\x49\x63\xdf\xbb\x59\x1f\x5d\xfb\x80"
- "\xfd\x85\xb6\x9a\x3d\xca\x98\x9a\x48\x0d\xfb\x3e\xb3\x29\x42\x8c"
- "\xc5\xfa\xf5\x07\x3e\xda\x87\xca\xe1\x59\xfb\x1c\xf9\x20\xa0\x4e"
- "\x1e\xfa\xde\x43\xfb\x8e\xf7\x4c\x66\xcf\xa8\xe7\x73\xfd\xeb\x16"
- "\x61\x63\xa4\x06\xfb\x20\x9e\x6f\xa9\xb1\x59\x31\xf6\x83\xdb\xf8"
- "\x59\x2c\xcf\x1c\xfa\x84\x6f\x8a\xd4\xe0\xbe\xa1\xa7\xad\x52\x9f"
- "\x2d\x2d\xb8\x5f\x05\xfb\xcc\xc7\xd6\x72\x5e\x1a\xc7\xf5\x57\xa1"
- "\xed\xcc\xd3\xa4\x89\x58\x12\xd1\x6f\x0e\xf7\x5f\xe1\x1c\xe6\x63"
- "\x60\x61\x3a\x1f\x7b\x3e\xaf\xc3\x74\x7f\x96\xf3\x07\xda\x2f\x61"
- "\x79\xcb\xe0\x1d\x80\x16\xc6\x4c\xdc\xf3\x6f\x61\xf1\x36\x56\x25"
- "\x13\xfe\xde\xcc\x4f\xf6\x1b\xf1\x3b\x89\xa5\x4c\x5a\x2b\xcc\xe2"
- "\xb9\x0d\xf8\xec\xd4\x4e\x72\x85\x58\xd6\x62\x3e\x72\x18\x0f\x1d"
- "\xc6\x9d\xab\x69\x83\x79\x92\xd6\x89\xbc\xa0\xc3\x3c\x97\x66\x62"
- "\x59\xc3\xd7\x37\x1c\x73\x4b\x12\x3e\x1f\xc7\x16\x68\x67\x81\x31"
- "\x3d\xda\x9e\xf3\x8d\xaf\x34\xa6\x79\x21\xa8\xef\x58\x74\xdd\xad"
- "\x0d\x76\xe8\x73\x0d\x68\x19\xc6\x07\x4f\x63\xff\xaa\x85\x7e\x91"
- "\x1a\xf4\xc9\x86\xdf\x62\xac\x53\x4e\x3b\x3e\x97\xbe\x79\x1b\x9e"
- "\xf1\x0d\xfa\x37\x20\x56\x62\x6c\x34\x38\x37\x51\x1c\x3f\x96\x27"
- "\x22\x3f\x95\x8f\x03\xaf\x7f\x55\xfc\x1e\xfe\x50\x3b\xf4\xab\x58"
- "\xb6\x17\x5f\x65\x6b\x37\xf2\x5b\x09\xd3\x09\xbf\x29\x77\xea\x73"
- "\x1b\xdb\xff\x7a\x15\x6d\x7d\xdf\xc4\xe1\xb3\xd6\x63\x5c\x30\xe4"
- "\x8b\x4b\xce\xfc\xff\xcd\x68\xec\x27\xfa\xfc\xda\x83\x22\x40\xee"
- "\x8d\xf0\xc5\x71\x86\x7b\xd2\x60\x2e\x68\xba\x59\x0b\x59\x8e\xba"
- "\xf6\x9c\xab\x43\xa4\xb5\x10\xf4\x0b\x58\x17\x5a\x07\x32\xbd\x13"
- "\xe4\x69\x93\x80\xf2\x4c\x6b\x18\xf2\x0d\xe0\x6c\x94\x88\xb1\x51"
- "\x70\x4f\x9c\xf4\xcd\xcb\x8e\xfb\x26\xae\xb0\xef\xbd\x6d\x52\xee"
- "\x35\x1e\x87\xef\xea\x6a\x79\x9f\xc5\xd5\xfc\x2e\xfb\x2c\x70\xef"
- "\x4f\x21\xcb\xd1\xb5\x0b\xd7\x94\xea\x96\x26\x5c\x23\xd8\xfd\xb8"
- "\xf7\x22\x13\x74\x72\xbe\x7f\xa8\x09\xed\xf3\x2c\x97\x09\xf6\x85"
- "\xe7\x94\x68\x64\xbf\x81\x6f\x7d\xf1\xc8\x79\xe9\x6a\x9b\x23\xbf"
- "\x38\xd0\x1b\xbf\xb5\x1d\xf6\x7d\x81\x18\x1f\xc3\xf5\xba\x75\x20"
- "\xe6\xca\x6e\xcf\x69\xd5\x4a\x79\xb2\x59\x5e\x6c\xfe\x3e\xc3\x3d"
- "\xc6\x5b\x7c\x8a\x84\x63\xbc\x00\xdc\x5f\xc7\xc6\x40\xf3\x5e\x2c"
- "\xc6\x70\xc6\x78\x94\xc6\x74\xcc\xb5\xd2\x7a\x72\x73\x08\xdb\xa3"
- "\xdc\x66\x7c\xea\x2a\xfa\x61\xb5\x5c\xcc\x60\x71\x96\xfc\xa3\xd3"
- "\x6c\x14\xef\x63\xf2\x44\xd0\x7b\x18\x83\xb0\x85\xe5\x30\xc0\x36"
- "\x6f\x39\x1e\x71\x6b\xa9\x28\x9b\xb6\x00\xee\xff\x00\x68\xc5\x64"
- "\x77\xf8\x1d\x72\x89\xb4\xd9\x79\xbe\x56\x1e\x53\x5f\xf4\xc7\xf6"
- "\xe3\x31\x36\x60\xcc\x58\xcc\x83\xb6\xd7\x74\x4f\x60\x6e\xe3\xb6"
- "\x25\x2c\xbe\x75\xfe\xb0\x18\x71\x0c\x62\x36\xf0\x7e\x05\xce\x4c"
- "\x53\xb3\x3e\x62\xff\xbc\xeb\x5b\x5b\xa4\xa8\x47\xf8\xb5\xe7\xb4"
- "\x65\x4b\xb1\x39\xb8\x3c\xc5\xe3\x5e\x73\x5a\xb4\x5d\x16\xe5\xe7"
- "\x29\xe2\xb3\xa7\xdc\x86\x67\x97\x8b\x6d\xea\x79\xec\xef\xd6\xb9"
- "\xd0\xae\xbe\x3d\xe7\x9a\xbf\xa4\xcf\x88\x7b\x88\x86\x70\x3d\xeb"
- "\x9a\x4e\xd6\x67\x5a\xbb\xc4\x63\x7d\x6e\xd1\xa2\x14\xdd\xdc\xc4"
- "\xc5\x86\x59\x29\x73\x12\x74\xf1\xc9\xc9\x8b\x92\x75\x18\x7c\xc9"
- "\x79\xfe\xf0\xfc\x44\xd7\x86\x8b\xb9\xfc\xca\xe4\x5c\x7e\xd7\x14"
- "\xf9\x2f\xcd\xe4\x5a\xf6\xed\xb1\x5d\x5c\x2b\xf6\xd4\x4e\xbe\x5a"
- "\xd8\x07\xff\xf8\x1d\xc5\x08\xff\x95\x68\xcb\x98\x69\x25\x51\xb0"
- "\xd6\xb3\x18\x17\x72\xcc\x89\x6b\x53\xd0\xc7\xa8\x91\x5c\xeb\x28"
- "\x11\x7c\x09\x8b\x21\x94\x23\xec\xc3\xfa\xdb\xe1\x7e\xf8\x37\xc2"
- "\x7f\x25\xfc\xb3\xfb\x84\xbf\xb0\xfd\xf2\xfb\x9c\xaf\x71\xff\x91"
- "\xcc\xd5\x58\x87\xae\xf4\x65\xf8\x25\x6c\xe2\xf5\x5c\xfa\xa0\xa6"
- "\x39\x57\xf6\x89\xf5\x58\x4e\xae\xbe\x2b\x89\xce\x4d\x3d\x1f\x9a"
- "\x73\x61\x97\x58\x8f\xf9\x00\x48\xef\x83\x39\x04\xa0\xbe\x54\xcf"
- "\x97\xe6\xb4\x46\x88\xf5\x98\x4f\x8e\x90\xa3\x76\xf7\xdc\x5e\x34"
- "\x67\xbf\x4e\xac\xa7\x71\x6e\xcf\xa9\x8e\x9f\x90\xf3\x79\x19\xd6"
- "\x11\x56\xfa\xf2\xf8\xb6\x39\xd7\x8a\xa1\xbe\xdb\xd8\xab\xde\xd1"
- "\xa9\x7d\x8c\x2b\x9d\x0c\x73\x12\xe3\x47\x25\x2e\x4c\xc5\x0c\x52"
- "\x29\x8b\x96\xa4\xe0\x71\xe1\xac\xdf\xb0\xc3\xa2\x99\xf3\xe6\xf0"
- "\x1f\x29\x49\xe1\xf8\x23\x09\xf8\x0d\x8f\x73\x97\x18\xf0\x30\x67"
- "\x11\x16\xd3\x12\x86\x2c\x99\x83\x07\xd7\x7d\xa0\xc0\xe3\xed\x2d"
- "\xc0\x1b\x0d\x1c\x67\xdb\xad\x66\x72\x81\xc9\x74\x98\x27\xe9\x88"
- "\xde\x46\x24\xbb\x96\x32\xe6\x88\xb5\x17\xc6\x1c\x09\x5c\x69\x98"
- "\x13\x68\x4b\x8c\x87\x35\x63\x78\x7b\x8e\x75\xb8\x99\x24\x88\x39"
- "\xac\x87\xc5\xb1\xf8\xa5\x39\xed\xab\x45\xdf\x4e\x5f\x21\x7f\x58"
- "\x30\xc6\xe5\x87\x32\xcb\x49\x0d\xe5\x28\x28\x4f\x87\x32\xe6\xa2"
- "\x0e\x86\x72\x28\xda\xa4\xa0\xac\x85\x72\xa8\x90\x3f\x50\x8f\x7b"
- "\x8c\xa1\xac\x83\x72\x18\xb4\xef\xc8\xff\xe6\x5e\x56\xb6\xee\x97"
- "\xf2\x64\xf3\x9c\xd8\xd6\x0a\x47\x4e\x6c\xcc\xd3\x94\xa9\x99\xce"
- "\xd6\x5f\x26\x83\x58\x9b\x7d\xb4\x0f\xbf\x00\x75\x9a\xa5\xf5\x92"
- "\xdb\x3b\xac\x56\x29\x7e\x0a\xb7\x67\x74\xf8\x3b\xe5\x16\xc7\xb2"
- "\x56\xca\x2d\x8e\xf6\x2e\x96\xdb\x10\x8e\x34\x07\xe3\xc4\x52\xb7"
- "\x7b\xea\x78\x4e\xcc\x8e\x15\x18\x73\xd7\x92\x35\x57\xf5\xc3\x12"
- "\xb4\xa1\x41\x99\xc7\x8c\xa4\x57\x48\x07\x8b\xa7\x2f\xc5\x93\x73"
- "\x8e\x25\xe1\x76\x3f\xd4\xa7\x20\x33\xb0\x3c\x56\x49\x8b\x02\x6d"
- "\xb3\xe2\xb9\x1c\xd8\x71\x86\xe3\x57\x44\x18\x97\x17\x3a\x2a\xe9"
- "\x64\x9e\xeb\xc4\x4c\x3a\x27\xa2\xce\x12\xa8\x4a\x5a\x44\xe1\xde"
- "\xc0\xb4\x59\xf1\xec\x1c\xd4\x5b\x05\xb2\x9a\xd8\xbf\xdd\xa6\x50"
- "\xdc\xe3\x2a\x88\x31\x32\x3a\x76\xcd\x78\x38\x1b\x9f\xe3\xcf\xe4"
- "\x90\x4f\x49\x00\xe6\xa6\xc4\xbe\x95\x38\xc5\xbb\xdb\x00\xe7\xd0"
- "\x87\xb4\x75\x32\x09\xc0\xf8\xbe\x62\x5f\x76\xf1\xbc\x60\x9d\x63"
- "\xa4\x58\x53\x66\x38\xe7\xfa\x3e\x93\xff\x9d\x71\xe5\xc0\x39\x43"
- "\x62\xc6\xc2\xaf\x21\x62\x7a\x67\x67\xde\x0c\x6d\xed\x37\x4a\xd3"
- "\xba\xe7\xb9\x3f\xf0\x1c\x9e\x9d\xa0\xff\x77\x44\x30\x1f\x16\xd4"
- "\x4b\xda\x63\x8b\xb8\x0f\x6a\x67\x35\xc6\xd3\x15\x72\x50\x9e\xc4"
- "\x7d\xd3\x9d\x07\x91\x67\xa9\x26\x42\xbf\x7d\x05\xc6\x6e\x56\xc1"
- "\x18\x77\xbe\x8f\xd7\xc4\x98\x5d\x6a\x16\xe3\xca\x4e\xb4\x6c\x8f"
- "\x30\xc8\x28\xb8\x07\xf5\x22\xb1\x7f\x88\x72\x07\xda\x93\x84\x9c"
- "\xce\x58\xe4\x5b\xa0\x31\xc6\x10\x69\xa3\xfd\x86\x81\xdc\x18\x51"
- "\x85\x7c\x8c\xb2\xae\x49\x83\x63\x76\x23\x0c\x9e\xfb\x3c\xfc\xff"
- "\x8a\xe7\x94\x79\xa5\x59\x6a\x13\xe3\xaa\x81\x0c\x85\xba\xa3\xa6"
- "\x3d\xe7\xc6\x44\xa7\x5c\x7b\xe2\x9e\xe8\x1b\x0b\x30\xde\x1b\xb6"
- "\xcd\x65\x67\xfb\x4e\x2e\x83\xdc\x48\x33\x93\xc0\x02\x3e\x17\x6f"
- "\x80\xfc\xf3\x1f\x71\xe2\x6f\x90\x7f\x86\xee\x73\x69\xe3\x94\x64"
- "\x2b\xe5\x3c\x7d\x63\x3f\xf0\xe8\xf3\xf0\xff\x2b\xa8\x6f\x94\xf2"
- "\xc9\xaf\x52\xb3\x7d\x92\x17\x7d\xb4\xb8\xdf\xfd\x46\xbd\x74\xbe"
- "\x97\x2a\x0a\xc6\xf4\x46\xb3\x34\xf7\x5b\xfb\x45\x04\x40\xd9\x2a"
- "\xd9\x58\xb8\xcd\xc5\xe6\x2f\x97\x23\xb4\x50\xd6\x4a\x65\xf8\x1d"
- "\x26\x61\x05\xea\x89\xad\xa0\x4b\xa2\xde\x39\x47\x0b\x72\xa1\x16"
- "\xf5\x3c\x1b\xd0\xff\x3f\x74\x62\xdd\x18\x33\x59\x2b\x62\x8c\x6d"
- "\xba\xd9\xd7\x6f\x87\xf4\x2e\x42\x8e\x4f\x20\x7f\x1f\x7b\x81\xb0"
- "\xb1\x40\x6b\x09\x1a\x6a\x84\x3a\xb0\xfe\x5b\x4b\x59\x9d\xd4\xcb"
- "\xa5\xeb\x3a\x35\x53\x4c\xab\x41\x4e\x9e\x87\xfc\x65\x67\x7e\x58"
- "\xeb\xd3\x35\x31\x28\x63\x62\xcc\x0f\x16\x9f\x0f\x63\x54\xda\x88"
- "\x1f\xcb\x0b\xb0\xb1\xc0\x9f\xc5\xc3\x5f\xaa\x0f\x90\xe2\x53\x82"
- "\xae\xb9\x9f\xaa\x93\xaa\x30\x66\x25\xcb\xff\xd1\xae\xef\xcb\xe2"
- "\x54\x8a\xf1\x29\xb7\xa5\x92\xe0\x62\x81\xc7\xa7\x64\xf1\x40\xfc"
- "\x40\x27\x49\x75\x1f\xa3\x92\xe6\x94\xa5\x48\x31\x2a\xe9\x75\xbb"
- "\x15\x7e\x23\x2f\x60\x5e\x74\x3d\x2b\xcb\xb1\xa5\x7c\xdd\xc6\xac"
- "\x54\x03\xc6\xa9\x79\xcc\x4a\xef\xd6\x06\x7b\x1c\xe7\x13\x7b\xa9"
- "\x94\xef\xde\xe9\x1c\xe0\x5f\x87\x18\xcb\xe0\x46\x92\x78\xae\xd2"
- "\x4c\x72\x53\x44\xff\x4a\x0b\xda\xc8\x0a\x98\x1d\xac\x13\xf7\x5f"
- "\x6c\x75\x87\x2f\x57\xfb\xed\xae\xbd\xca\x62\x51\x08\xf0\x3c\x81"
- "\x61\x1d\xd7\x1b\x05\x7f\xd7\x39\x3c\x7b\xce\xa2\xb9\xf1\x33\xe7"
- "\x2f\x30\xe8\x26\x4f\x79\x9e\x25\x3b\x1c\xa2\x4b\x4c\x89\x67\xcb"
- "\x8f\x6e\xf2\xd8\xe7\xa2\xa3\xa7\xcc\xfc\xf7\x29\xa3\xa7\x4c\xfd"
- "\xf7\x67\xf9\xee\xc4\x29\xc9\xcb\x30\x61\x66\xca\x22\x1d\xde\x34"
- "\x5b\xcc\xb2\x9d\x1e\x9f\xbc\xc8\x75\xee\x07\x33\x9b\x96\x9a\xd9"
- "\x6f\xdb\xf0\x37\xb7\x9b\x09\x3b\x24\x7b\x16\xc7\x39\x61\x0b\x8e"
- "\x2d\xcb\x5f\x9a\x23\x84\xa2\x2c\x25\xe6\x3f\xc7\x35\xc6\x17\xe7"
- "\x2f\xae\x35\xf0\x2e\xb5\xce\x71\xb8\xc4\x7b\x31\x1e\x97\x46\x9a"
- "\xb7\xfc\x1c\xed\x4d\x1f\x7c\x30\x8b\xc7\xd2\xa2\xbe\x92\x8d\x1b"
- "\xcf\x49\x7d\x68\xc4\x3a\x39\xc2\x8b\x72\x9e\x5d\x3a\x44\xce\x25"
- "\xc9\xfe\x14\x63\x44\x08\x8a\x2e\xbd\x60\xec\xfc\xe0\xff\x1e\xfc"
- "\x1f\xe7\xc0\xf2\x54\x5a\x8f\xfa\x59\xa0\x0a\xd6\xdb\x34\x1f\x9e"
- "\x8b\x2a\xb7\x8e\xe5\x4f\x88\xb6\xdb\x7c\x66\xda\xd5\x70\xf4\xa1"
- "\x33\xed\xbe\x4c\x27\xa4\xa9\xb4\x8e\xed\xab\x4f\xa5\xb5\x98\x73"
- "\x0d\xf8\x78\x4d\xb4\x2d\x73\x4d\xb4\x9d\xda\x66\x82\xac\x0e\xc7"
- "\x7f\xe0\xfe\xf0\x68\xfb\x3f\x28\xcb\x3b\x83\xfb\xe8\x79\x4c\xc1"
- "\x4a\xf4\x97\x9c\x01\x3c\x5c\x72\x95\xe7\xea\x8d\x5e\xf6\xf5\xb9"
- "\x99\xcb\xcc\x3c\x57\xef\x15\x9e\xdf\x9a\xe7\x00\x27\x99\xd0\xce"
- "\xb1\x99\x76\x1f\x5d\xb4\xfd\x06\x65\x7b\x5c\x73\x89\xa6\xbb\xfc"
- "\xbb\x88\xa7\x8b\x1f\x20\x6a\xb4\xad\xd8\xdf\x79\x82\xc5\x0f\xcc"
- "\xb2\x50\x2b\xc6\xa1\xf9\xa8\xb3\x5e\xad\x4b\xf5\x25\x8d\x2a\xf2"
- "\x93\x1a\x43\xb8\xfb\x3d\xce\x79\xc3\xf4\x74\xcb\x88\xb9\x34\xef"
- "\x27\xbe\x70\x6c\x82\x75\xcc\x86\xd8\x4e\xf3\x46\x98\xe9\x96\x08"
- "\x38\x3f\xea\x20\x1c\x9b\x68\xde\xb3\x45\x74\xcb\x48\x28\x47\xa5"
- "\xc0\x11\xca\xfd\xe2\xa0\x7e\x1c\xcd\xbb\xbf\x16\x8e\x66\x9a\xd7"
- "\x3f\x0a\xea\x41\x39\x64\x1f\x1c\xa1\xac\xd5\x41\x3d\x28\x3f\x90"
- "\x7f\x51\xa5\x22\xf0\x1b\xce\x3d\x1f\xc3\x9f\xf5\xc2\x74\xf6\xac"
- "\xbc\xf1\x09\xfc\x19\x13\x53\xf8\x33\xa2\xb3\xf9\x33\x26\xaf\xe3"
- "\xcf\x78\x08\xee\x1b\x91\x40\xf3\x42\x5b\xe0\xd8\x4c\xf3\x1e\xa9"
- "\x87\x7a\x50\xd6\x55\xc0\x11\xca\x8f\xc1\xb3\x46\x42\x39\xac\x18"
- "\x8e\x50\x7e\x7c\x0d\xd4\x4b\xa2\x79\xfa\x34\x38\xb6\xd0\xbc\x27"
- "\xb0\x7d\x28\x0f\x89\x85\x23\x94\x9f\x1a\x07\xf5\xa0\x1c\x1e\x01"
- "\x47\x28\x4f\x85\x77\x1a\x61\xa0\x79\xbf\x9a\x08\x47\x0b\xcd\x7b"
- "\x19\x9e\x17\x01\xe5\x69\xfb\xe1\x08\xe5\xe9\x70\xff\x48\x28\xcf"
- "\x08\x85\x23\x94\x67\xe2\xbb\xa6\xd0\xbc\x59\xf8\x9c\x36\x9a\x37"
- "\x07\xdf\x19\xca\x73\xad\x70\x84\xf2\x3c\xec\x0f\x94\x13\xf0\x3e"
- "\x28\xcf\x87\x31\x18\x91\x46\xf3\x92\x2c\x70\xb4\xd2\xbc\x45\x46"
- "\xa8\x07\xe5\xe4\x7c\x38\x42\x79\x09\x8c\xe1\x48\x28\xa7\x85\xc3"
- "\x11\xca\xcb\xf1\x7d\x33\x68\xde\x8a\x3a\x38\xda\x68\x5e\x76\x19"
- "\xd4\x83\xf2\xaa\x0c\x38\x42\x39\x17\xc6\x6f\x24\x94\xd7\x86\xc1"
- "\xd1\x2d\x3f\xd0\xbc\x75\x20\x0b\xfb\x11\x9a\x57\x34\x9c\xae\xbc"
- "\x07\x8e\x5b\x9b\xe8\xca\x5e\x7a\x9a\xb7\xad\x00\xce\xc3\xf1\x0d"
- "\x90\xad\x7b\x0d\x11\xcb\x70\x7c\xf3\x20\x94\xc3\xc5\x32\x1c\x8b"
- "\xcb\xa0\x3c\x5c\x2c\xc3\xf1\x2d\x2c\x47\xd0\xbc\xdf\xc3\xd1\x0f"
- "\x8f\x7a\x28\x47\x8a\x65\x38\xee\x48\x81\x23\xf4\x6d\x7b\x1c\x9c"
- "\x8f\xa2\x79\xa5\x3a\x28\xe3\xd1\x0c\xe5\x31\x70\xff\x18\x28\x8f"
- "\xb1\x0c\x1c\xa4\x43\x5e\x15\xfa\x09\x3a\x1a\xf2\x8c\x39\xeb\x1a"
- "\x51\x23\x8f\x62\x1e\x0e\x58\x87\x1f\x6d\x54\xa9\xcf\xec\xcb\x34"
- "\x33\xf9\xc0\x5e\x38\x22\x4e\x08\x19\x61\x86\xf3\x7e\x50\xef\x9e"
- "\x8b\x2a\xdf\xde\x88\x47\xa6\x0c\x33\xcb\x05\x28\xc6\xc2\xf4\x6b"
- "\x54\xf9\xf4\x02\x59\x2a\x02\xf0\x5f\x0d\xe3\x55\x4c\x73\x7a\x5d"
- "\x85\x71\x0a\xa5\x39\xf7\x36\xc2\x11\xca\x41\x9f\xc2\x38\x41\xf9"
- "\xa7\xbf\x85\x23\x94\x5f\x79\x8e\x6e\x19\x15\xda\x9e\xeb\x33\xd7"
- "\xac\x22\x3c\x56\xdf\x9e\xe7\x4a\x03\x6d\x94\x46\x03\xd2\xd2\xb7"
- "\xe6\xe9\x02\x6d\x46\xa0\xc1\x04\x58\x3f\xa2\x08\x7d\x5b\x0f\x7d"
- "\xbd\x27\x1c\xfb\x84\x79\x79\xe8\x8d\x30\x35\x7f\xf6\xbd\x14\x9e"
- "\xbd\x11\xf3\x47\xd0\x90\x47\x3d\x5d\x7f\x9f\x5d\x7f\x6c\x5e\x29"
- "\xbf\xee\x4f\xe4\xeb\xaf\xe0\xf5\x4f\x02\x31\x0e\xfb\xe3\x8f\xb0"
- "\xeb\xa6\xb6\x66\xf1\xbd\x7c\xf0\xda\x65\xac\x6b\x56\x71\x1d\xc8"
- "\xac\xf2\x09\xa6\x39\x3e\xa4\x55\x13\xd1\xdc\x9e\xeb\xab\x83\xbe"
- "\x87\x8a\xb2\x7e\x30\xd5\x0c\xd3\xf2\x58\x28\x91\x11\x9e\xec\x45"
- "\x42\x41\xf4\x9a\xf5\x80\xa1\xa8\x3f\xc3\x5a\xaa\xd6\x65\x86\x95"
- "\x37\xaa\x7a\xb5\x6c\x43\xf9\x2a\x38\x9e\x7d\x17\x69\x54\xf9\xbe"
- "\x7f\x63\xd3\xc8\xe1\xba\xf4\x40\x78\x7e\xaf\xcb\x59\x56\x7a\xcd"
- "\x98\xf9\x1c\xb9\xc8\xcf\x1b\xd8\x5e\x23\xfe\x7b\x3a\xf3\x21\xe5"
- "\xbf\xc7\x31\x7b\x35\xb4\x85\xf7\x3a\xeb\x2b\xf6\xdc\x8a\x72\x21"
- "\x24\xde\xc0\xbe\xc1\xab\x7c\x3f\xf8\x50\x30\xab\x03\x53\x48\x2f"
- "\x5d\xfa\x47\xd0\xbe\xaf\x4d\xa1\xdb\x3a\xea\xb2\x6b\xe7\x0f\x41"
- "\xdd\x37\xd1\x0e\x95\xdb\xcb\x91\xff\x98\xc2\x3b\xfc\x0e\xd7\x51"
- "\x35\x41\x5b\x96\x2f\x93\x95\x55\xbd\xd6\x61\xec\x5c\x5b\xf0\x38"
- "\x83\x2d\x5f\xd0\xd8\x0b\xe2\xe3\x68\x61\xbc\xa1\xaf\x4d\x45\x98"
- "\xaf\xbf\xaa\xd7\xc7\x4f\x5b\x51\x36\x3d\x8e\x75\x97\x09\x7e\x26"
- "\xff\xa7\xd2\x88\xda\x98\x7c\x1a\xcb\x07\x68\xee\xe9\x48\x53\x4b"
- "\x3d\x31\x26\xb3\xb6\xca\x69\xee\x37\xf9\x82\xdf\x85\x35\x25\x28"
- "\xe3\xa7\xa1\x8d\xee\x53\x3c\xff\x2c\xd0\xc5\x17\xfa\x22\xe7\xff"
- "\x86\xb1\x5c\x0f\x63\x87\xf2\x37\xc6\xcd\x98\x69\xb7\x63\x1c\xba"
- "\x35\x66\x18\x07\x4e\xaf\x5e\x19\x98\x3b\x5d\x7c\xee\x27\x42\xbf"
- "\x91\xba\x9a\xe9\xf8\xbd\xd1\x1f\xe3\x7a\x5d\x63\x7b\xed\x6d\x98"
- "\x13\x11\xd6\x2d\xb1\xae\x33\xed\x12\xc5\x18\x03\x89\x0b\x53\x92"
- "\x5f\xd3\x2d\x4e\x4c\x8f\x7f\x76\xe0\x92\x21\xba\xe4\x34\x5d\x32"
- "\xcb\x65\xcf\x4e\xc0\x32\xbf\x38\x69\x51\x8a\x0e\x73\x8a\x77\xcd"
- "\x69\xac\x05\x19\xdc\xca\x64\x53\xd5\xbd\x46\xa6\x9f\x94\xce\xd3"
- "\xa6\x64\x50\x41\xf7\xd8\x3d\xf4\x8a\xca\x6f\x5d\x87\x5f\x2f\x2b"
- "\xae\xdd\x42\x8e\x8e\x88\xf1\x93\x03\xb6\xf6\x23\xb8\x1f\xd0\xbf"
- "\x3d\xd7\x6f\xb5\x63\x5d\x55\xdd\x5b\xc5\xec\x2e\xb9\x7e\x45\xc0"
- "\x8f\x91\xe2\x77\x37\x1e\x2b\x50\xbc\xc6\xbe\x4b\xe7\xfa\x95\x9b"
- "\x49\x22\x9f\x53\xa5\xf1\x69\x6c\x4d\x57\xf9\x31\x7b\x3a\xd5\xcd"
- "\xd3\xd2\x1d\x7a\xcc\xd3\xa6\x62\xdf\x00\x6d\x8f\x52\x13\xb9\xca"
- "\x63\xf7\x6e\x19\x9f\x8d\xf1\x3e\xec\x85\xcf\x10\x21\x64\x7c\xb6"
- "\xf0\x8e\xde\x9c\xf5\x16\x51\xef\x05\x2c\xf0\xd5\xc1\x7c\x78\x8c"
- "\x3c\xfa\x51\x66\xb3\x1a\xfa\xdc\xf1\x51\x66\xbd\x9a\x16\x3c\x53"
- "\xdf\x1a\x36\xca\xdf\x2a\xe6\xbe\x36\xd9\xac\xe4\xaf\xa0\xb5\x83"
- "\x0e\x58\xde\xd6\x7f\xb2\xbe\xad\xff\xa8\x66\xeb\x96\x69\xf9\xc6"
- "\xc7\x86\x91\xb1\x83\xe9\xd7\x47\x2b\x08\x69\x51\xdd\xbb\xff\xe8"
- "\x18\xa6\x97\x58\xac\x9a\x88\xb6\xb6\xc2\xf1\x2c\x46\x61\x47\xe1"
- "\x34\x73\x67\xc8\xb3\x71\x87\xa1\xce\x71\xd0\x9b\x4e\xe8\x80\x7f"
- "\x07\x10\x75\xc7\xe3\x83\x0c\x7b\x3b\xf3\xd5\x95\x15\x91\xdc\x66"
- "\x1c\x07\x73\x86\xf1\xd3\x3d\xdb\x8e\xee\xaf\x20\xf0\x6c\xb2\xb7"
- "\x73\x9c\xfa\xaf\x11\x5d\xae\x7f\x78\x34\xbc\x82\xb4\x63\x3c\x66"
- "\xd0\x4b\x0f\x9d\x2e\x22\xb4\x30\x26\x6a\x77\xba\x55\x3d\xdd\x4c"
- "\xd4\xd5\xf5\x45\x24\xe3\x02\xb9\xcf\xf6\xb5\xde\xf7\x3d\xb8\xbf"
- "\x03\xe3\xa7\x9e\xd0\xb2\x38\x8a\x99\x46\x96\xd7\x36\xb0\x06\xe4"
- "\x0f\xe1\x6b\xbd\x5f\xcd\x14\x23\x81\xeb\x7b\x6c\xff\xa6\x25\xd5"
- "\x09\x16\x62\x8a\x2d\x25\x1d\xea\x28\x72\x60\x5a\x29\x79\x13\x74"
- "\x9c\x37\xaf\x90\x00\x26\x4b\xdf\xd0\xfb\xd9\x6e\xe8\x7d\x6d\xcb"
- "\xf5\x18\xd7\x8a\xd2\xaf\xf5\x7d\x50\xb6\xb6\x2d\xd2\xfb\xd7\x58"
- "\x4a\xc9\xd3\xcd\x44\xdf\xa1\x26\x81\x1d\xcb\xf5\x7d\x6a\x0c\x45"
- "\xd0\x16\x08\xcb\x30\xae\x18\x53\x0f\x63\xed\xe1\x38\xdd\x1b\x4b"
- "\xa6\xb4\xa8\xee\x59\xd2\xa7\x8e\xf4\xc7\x98\xae\x28\xaf\x62\xfc"
- "\x67\x21\x38\x26\xca\x1e\x3c\x1e\x73\x63\x05\xb2\x98\x45\x7b\x9e"
- "\xcb\x46\x79\x1f\x64\x19\x15\xbe\xb3\x40\xf5\x7d\x66\xe2\x71\xd3"
- "\xd0\x3d\x28\xf3\x0b\xed\x5a\xcc\x19\xe5\x8f\xfd\xc4\xfc\xcd\x2b"
- "\xce\xc3\x58\x66\xe9\x7d\xa1\x5e\x00\x9c\xef\x6b\x6a\xb1\x12\xfb"
- "\x93\xcf\xe5\x3f\x65\x60\x79\x79\x83\x4b\x32\x89\x26\x3f\x93\x04"
- "\xeb\x7e\xca\x78\x69\x8b\x7d\xf7\x73\xd9\x34\x57\x9b\x80\xb6\x1c"
- "\x7e\xae\xcf\x12\xdd\x0b\x84\xe8\x86\xb1\xdf\x0f\xeb\x46\x01\x0d"
- "\x83\xa3\x4b\x99\x3e\x82\xfa\xae\xaa\x4f\x10\xe7\xf1\x3e\xbd\x3b"
- "\xfc\x66\xef\x12\x72\xb7\x54\x0a\x2b\x7d\x43\x31\x67\xf7\x15\x55"
- "\xef\xcb\x34\x6f\x6f\x28\x2d\x98\xc6\x78\x11\xca\x5f\x76\xf8\x05"
- "\x6b\xe0\x5c\x36\xb4\x1f\xd9\xa1\xf2\xad\x83\xff\x7a\x7e\x7f\x6f"
- "\x33\xbe\xb7\x7d\xc7\x20\x2b\xbe\x37\xcb\x33\x04\xef\x35\x13\x68"
- "\x46\x43\xa2\x63\x58\xec\xfd\x1b\x7a\x7f\x29\x0f\x2b\x8e\x07\x8e"
- "\x81\x70\x43\xdf\x87\xbd\xeb\x0d\x7d\x00\x8c\x2f\xc6\x6f\x0e\xcc"
- "\x9c\x05\xf7\x14\x46\xcf\x85\x6b\x7d\x3b\x82\xa3\x8b\x30\xdf\x97"
- "\xc9\x60\x21\xf6\x2d\xd1\x71\x18\x9f\x70\x6b\x3a\xcc\xb9\xfe\xd1"
- "\xb0\x8e\x47\x27\x89\x73\x8b\x60\x3f\x85\xbc\xbd\x55\x1d\xb8\x2f"
- "\x0f\xfa\x06\xfd\xab\x83\xff\x7a\xb3\xaa\xf7\xdc\x8e\x81\x7a\x7f"
- "\x38\x46\x40\x5f\x43\x69\x6e\x78\x11\xfe\x86\x6b\xa1\xf0\xce\x2f"
- "\xe2\x38\xe0\x78\x88\x63\x31\x56\x1e\x8b\xe9\x75\x50\x6f\xb8\x90"
- "\x9b\x0f\xcf\xe8\x13\x4c\x73\x7f\x14\xeb\x54\x6f\x81\x5c\x2f\x21"
- "\x8d\xd7\x7b\x33\x94\xd7\xfb\x49\x2d\xd0\xa1\xb7\x38\xde\xef\xbb"
- "\x19\xef\x9d\xf2\xbd\x93\x74\xfc\xde\xd7\x77\xf1\x7b\x75\x70\x6f"
- "\x9f\xf3\x2e\x7d\x3a\x25\xd7\xff\xb7\x29\xbc\x7e\xf6\x74\x5e\xff"
- "\xa1\x62\xb9\xde\xbd\x2a\xb9\xde\x2f\xcd\xbc\xde\x6f\xdb\x78\xbd"
- "\x81\x36\xb8\xfe\x6c\xd7\xbe\xdc\xfb\x13\xf9\x9e\x94\xb9\xfc\x9e"
- "\x77\x34\xfc\x9e\xa8\x75\x70\x7d\x81\xb2\x2f\xf7\xc6\xcb\xf5\x17"
- "\x8a\xef\x5d\x5a\xca\xeb\x3f\x13\xe1\x54\x6f\xbd\xc8\x13\x70\xfd"
- "\x3d\xa8\xd7\xc7\xbf\xc3\x2f\x7d\x1c\xaf\x37\xb6\x1e\xf9\x11\xea"
- "\xec\x16\x72\x1f\xb0\x76\xf8\x85\x34\x99\x55\xfe\x36\xa0\x8d\x16"
- "\x8f\x40\x3b\xad\x90\x1f\x61\x81\xdf\x29\xf8\x4d\x08\x31\xd7\xac"
- "\xf2\x9b\x02\xb8\x6b\x77\x6b\x37\xcb\xbd\xb7\xc5\x61\xb7\x13\x40"
- "\x7e\xd8\x32\xc2\x6d\xdc\x4e\x96\xe7\x19\x65\x88\xc2\x11\xd9\xf9"
- "\x02\xcf\x17\x0f\x3c\x0a\xf2\x4f\x40\x7f\x58\x0b\xb3\x59\x9c\xe6"
- "\x82\x09\x44\x08\x03\x8c\xbd\x4c\x7c\x4c\x19\xcd\x64\x9f\xd0\xac"
- "\xce\xef\x24\xbe\x35\xb0\xce\x60\xfd\x7d\xb0\xa6\xea\x16\xa2\x6c"
- "\x11\xf0\x64\xfe\x75\xb1\xbd\xd2\x79\xba\xac\x05\x3c\x47\x36\xca"
- "\x61\x88\xcd\x30\x1f\x03\x58\xee\xb6\x85\xf7\x60\xdd\x59\xf0\xdb"
- "\x1f\xeb\x76\x3c\xfe\x78\x69\xc7\xef\xe7\xe9\x3a\x43\x22\xe3\x3a"
- "\xdf\x19\x9c\x7d\x23\x64\x02\xb9\x51\x38\x2e\xdb\xf6\xfb\xf8\x7c"
- "\xdb\xe3\x7a\x9d\x3d\x24\xd2\x0c\xcf\x06\xdc\x2e\x52\xef\x11\xf6"
- "\xa9\xf7\x64\x1a\xd5\xd8\xee\x47\x99\xa5\xea\x43\x99\xb5\xea\x43"
- "\x42\xb9\xfa\xa3\xcc\x7c\x38\x96\x61\x1e\x2f\x90\xf7\x02\xde\x3f"
- "\x94\x59\x09\xeb\x46\x00\x8c\xd7\xbd\xf5\x92\xdd\x93\x3e\x67\x23"
- "\x35\x65\x36\x72\x24\xe5\x1a\xb1\x04\x45\x58\xe1\xdf\x66\xe9\x1f"
- "\xbd\xc6\xd2\x7f\x5a\x3e\xeb\x73\xc8\x24\xf6\x8e\xb8\xaf\xf5\x90"
- "\xc0\xfb\x2c\x8e\x07\xb4\x79\xdf\x03\x25\x02\xfa\x9c\x88\x31\xac"
- "\x55\xf7\xd5\x75\x89\x61\xad\xe6\x39\xe4\x1c\x71\xac\xbf\x8b\x18"
- "\xd6\xa2\xcd\x81\xc5\xb0\x06\xfd\x91\xe9\x91\xb0\x7e\xb1\xbc\x93"
- "\x36\x90\xcf\xb6\xfc\xc2\x8c\xfa\x22\xca\x63\xed\xb9\x7d\x1d\xf1"
- "\x5f\x51\xc6\xb0\x6f\x1c\xe9\x0f\xff\x20\x7f\xf4\x05\x5e\x7a\x3f"
- "\x45\x3a\x4f\x37\x51\x1d\xda\xdf\xed\x34\xe1\x67\xed\xb8\x57\x93"
- "\x26\xfc\xdc\xbe\x65\x94\xc5\xbe\x65\x9a\x01\xce\x45\xc2\xff\xb3"
- "\xf6\x8d\x34\x0c\xfe\xf5\xf0\x3f\x04\xfe\xc3\xe1\x7f\x38\xfc\x47"
- "\xc0\x7f\x14\xfc\x8f\x81\xff\x71\xf0\x3f\x11\xfe\x63\xe0\x7f\x0a"
- "\x0d\xa2\x91\x18\x83\x13\xda\x8e\x03\xba\x6b\xa5\x76\xe5\xf1\xed"
- "\xbb\x02\xde\x37\x0a\xe5\x1f\xc0\xab\x08\xca\xf1\x4a\x4b\xdf\x1e"
- "\xa4\x47\xdc\xa5\x03\x47\xf9\x5b\x06\xcc\xd3\x58\xfa\x4f\xd2\x58"
- "\x06\xc4\xa7\x59\x82\x92\x8c\xf0\x5f\x09\xff\xb5\x96\x2d\xd1\xa5"
- "\x40\xc3\x34\x4b\xff\x98\x70\x78\x17\x98\x37\xfd\xd9\xbe\x4c\xf8"
- "\x0d\xf4\xef\x6f\x16\x7f\x83\xbc\xd1\x6f\x1c\xfe\x86\x7a\x20\xff"
- "\x05\x06\x98\x55\xf7\xb3\x7a\xad\x21\xd1\xfb\xc4\x7d\x9e\xd9\x70"
- "\x3e\xcc\xec\xfb\x68\x3d\xaf\x37\xce\xe0\x3c\x67\x16\xcc\x31\xcc"
- "\x5c\x30\x2b\x6d\xe6\xe2\xa4\xc4\x39\xf1\x8b\x47\xe9\x06\xce\xd5"
- "\xe9\x13\x93\x5f\x9b\xf9\xda\x92\xf8\x25\xf1\x4c\x74\x82\x53\x83"
- "\x95\x3e\x6c\x36\xcc\x87\x00\x7a\x40\xdf\x26\x4a\x71\xcd\x9a\xd8"
- "\x06\x7c\xf6\xd8\x3c\xdd\xc1\x2b\x16\xb5\x1d\x64\x97\x80\xa6\x6c"
- "\x98\x7b\x13\xc8\xc1\x2b\x56\x75\x40\x93\x8e\x50\xe0\x77\xbc\x66"
- "\x6a\xaa\x15\x65\x99\x4f\x49\x15\xca\x32\x50\x67\xcf\x42\xab\xfa"
- "\x25\xbc\xff\x1d\xbd\x6e\x2f\xfc\xa6\x85\xe3\xb3\xf1\x3e\x0a\xf2"
- "\x0d\x3b\x82\x7c\xc3\xcb\x91\x71\x87\xd8\x71\x5c\xf6\x21\x56\x2f"
- "\xd2\xfc\x11\x1e\xaf\xaf\xa0\x55\xd0\x2e\xda\xdb\xe8\x3b\x8f\x97"
- "\xb2\x3a\x30\xdf\x58\x1d\x98\x6b\x8d\x2a\x4d\x39\xd6\x63\x3a\x05"
- "\xf4\x71\x2f\xf4\x03\x74\x7e\x5f\x69\xfe\xa2\x0e\xe1\x98\xc3\xa9"
- "\x28\xeb\x69\x06\xe0\x1c\xc6\xfe\x50\x98\xb3\xbb\xe1\xde\x3d\x0b"
- "\x2d\xdc\x0e\x7b\x0d\xb1\xc2\x4c\x10\x27\x10\x1f\x4c\x19\xb5\xec"
- "\xfe\x7d\x42\xad\x1a\xf5\x10\xb8\x77\x16\x5e\x2b\x06\xf9\xac\x98"
- "\xc9\xe3\x9a\x62\x49\x06\x5e\x17\xc2\xe3\xbd\x05\xc4\x01\x6f\xcc"
- "\x26\x8f\x5e\x51\x05\x2e\xc1\xf1\xc3\xf1\xc2\xef\xaf\x34\x37\x70"
- "\x38\xc6\x5a\xd8\xd6\x8f\xf8\xdb\xfa\xc7\x27\x30\x7b\x4d\xae\xa6"
- "\x41\x92\x2b\xdb\x82\xe3\x13\x9c\xe9\xc6\xe9\xa5\x8b\x5f\x38\x6b"
- "\x76\x52\xfc\x5c\xf6\xc9\x6e\xd6\xe2\xc5\x4b\x16\xc4\xeb\xe2\x67"
- "\xcd\x49\xd0\xb1\xcb\xba\x25\x8b\xa1\x4a\x62\xca\x62\xdd\xa2\xa5"
- "\x0b\x75\x0b\x16\x27\xa2\x84\x1c\x9f\x9c\xbc\xc4\x90\xd2\x87\xf0"
- "\x3b\x75\x0b\x96\x24\xa5\x24\x1a\xe0\xc7\xe2\xf8\x85\x73\x75\x8c"
- "\xea\x8b\xa1\xa9\xa4\x24\x9d\xf8\x84\xc5\x09\xb3\x92\x91\x11\x16"
- "\xfe\x1a\x2a\x39\xdd\xaf\x94\x9f\x03\x30\x9e\x1e\xfa\x71\x5d\x51"
- "\xf5\x7b\xb6\xc2\x17\xc6\xba\x20\x3e\x01\xfd\x1f\xa0\x1c\xc9\x74"
- "\xaa\x5c\x4d\x0b\xda\xa9\x37\xc3\x3b\xb6\x02\xdf\xb7\xe7\x06\x95"
- "\x4b\xef\xc6\xec\xd6\x18\x63\x14\xe3\xd7\xaa\xfa\x0d\x66\xfb\x8d"
- "\x81\xff\x99\x7f\x4c\xae\x86\xf2\xb1\x08\x6a\x76\xb6\x8b\x31\x3b"
- "\xac\xaa\x9f\x0a\xfd\xf0\x60\x0e\x44\xa2\x5c\x20\xe6\x84\x50\xd1"
- "\xdc\xa0\x27\xf1\x1e\x61\xcb\xb4\xb4\xf6\xdc\x7e\x3a\x59\x36\x0f"
- "\xb2\x62\x7d\x56\x2f\x37\x68\x02\xed\x1f\x0d\xeb\x59\x50\x03\xf6"
- "\xcb\xc3\x3a\xa2\xbb\x0e\xed\x9e\xd8\x47\xc8\x8f\x82\x89\xfe\xfa"
- "\xa6\xc8\xa8\xf6\x7e\x23\x35\x9d\x39\xe4\x9e\x4e\x98\xcb\x56\x35"
- "\x79\xb4\x03\xf8\x62\xd9\x50\xe2\xb3\xe2\x45\xa2\xde\x37\x7f\x1f"
- "\xc6\x48\x26\x55\xe3\x8a\x88\x29\x0e\x74\x6f\xeb\x2e\x52\x65\x6c"
- "\x24\xd5\xb6\x77\x79\x9e\x91\x74\x94\xad\xef\x7f\x0b\x63\xe2\x65"
- "\xad\xa0\xf6\xbd\x7f\xb2\xf4\xda\x73\x69\x1f\xe6\x07\x79\xd4\x64"
- "\x3b\x67\x34\x65\xec\x20\xa6\x34\x93\x11\xe3\x91\xc0\xb8\xad\x3f"
- "\x04\xd7\x7a\x57\xc1\x7d\x2f\x91\x7b\xa0\xbc\x12\x9f\xb1\xa6\x90"
- "\xd6\xaf\x0d\xa1\x0d\x6b\x0b\xa9\x19\x78\xaa\x09\x78\xaa\x79\x7d"
- "\x08\x6d\x41\xff\x02\xf4\xa3\x40\x3e\x35\xa4\x12\xed\x25\xd5\xfd"
- "\x5a\x66\x03\x18\xc3\xca\x0f\x40\x99\xf9\x7a\x9a\xd2\x0a\xb1\xfc"
- "\x20\x94\x23\x78\xb9\x04\xcb\x0f\x41\x79\x1c\x2f\x1f\xc5\x72\x28"
- "\x94\x63\x79\xb9\x86\xb0\xb8\x1a\xaa\xfb\x13\x78\xf9\x33\x2c\xc3"
- "\xd8\xdf\x9f\x66\x4c\xc5\xfe\x9e\x05\x9a\xdd\xff\x7a\xd6\x19\xd0"
- "\xd1\xd2\x2e\xb2\xf9\xf0\x51\x66\x02\xda\x28\x60\x3e\xdc\xdf\xfb"
- "\xde\x06\xd4\xef\xee\x2f\xf3\x0b\xc7\x63\xbf\x5d\x81\x56\x72\x0f"
- "\xc8\x4b\xf7\xc2\xfb\x2c\xc3\xb1\x73\x6b\x93\xd9\x33\x2a\x3a\xda"
- "\x46\x8d\xf4\x6d\xbd\x96\x6e\x99\x90\x4d\xdf\x1e\x8c\x79\x9e\x61"
- "\x2d\x1b\x11\xb5\x2f\xdd\xca\xe2\x54\x83\x8c\x0a\x73\xe8\x7e\x16"
- "\x2f\xc6\x02\x32\x9f\x87\xb8\xb5\x1a\xba\xe5\x99\x6c\xd0\xa5\xfc"
- "\x5f\xd4\xdb\xd0\x5f\x1a\xe4\xdc\xe0\x65\x47\x12\x50\x36\x88\x69"
- "\x15\x76\x0c\x8e\x13\xb2\x62\x09\x0d\xd3\x6b\x5f\x4c\xa0\x46\x58"
- "\xa7\x54\xdc\xfe\x4d\xcf\xc1\xf3\xcf\xb1\xe7\x0e\xd4\x6b\x85\xa5"
- "\x09\x98\x3f\x8a\xe1\x4b\x26\xae\xd9\xa9\x80\x27\xcb\x63\x03\xed"
- "\x5b\x62\x2c\x47\x12\x2e\x78\x97\x8b\x48\x15\x9c\xe6\xd1\x67\x0a"
- "\xfa\x84\x71\x5b\x6d\xf0\x1c\x1b\xbc\x2b\xca\x07\x7b\x84\x4a\x35"
- "\xc8\x29\xda\xdd\xb3\xeb\x7b\xd1\xa5\xb1\x81\xf0\x4e\x43\x4d\xfa"
- "\x6b\xa4\xa6\x13\xe7\x4a\xff\x88\x23\xd0\xda\xd8\x34\x9b\x31\xd0"
- "\xc2\xe2\x6b\x6b\x0c\xf3\xc9\x23\xb4\xff\x33\xd9\x97\x54\xfd\xd7"
- "\xbc\x94\x01\xef\x00\xef\x7e\xa8\xb1\xde\x57\x80\xf7\x78\x9a\x8f"
- "\x1b\xde\x97\x04\x63\xeb\x2f\xc9\xf6\xde\xf5\xbf\x3f\xe3\x1b\x61"
- "\x71\x2c\xc1\x7d\xd0\x7b\x41\x26\x11\x6e\xc4\x06\x0a\xb0\xfe\xe0"
- "\xb5\x23\xfa\xcb\x04\x9f\xc9\xc7\xba\x3f\x8b\x45\x42\xc3\x60\x9c"
- "\xe1\xf9\x18\xd7\x5b\x1a\x57\xa8\x9b\x64\xbf\x91\xe0\x9e\xfe\x85"
- "\x31\x48\x7b\x42\x37\x52\xb7\x3e\x3d\x74\x93\xf0\x35\xe7\x8f\x41"
- "\x11\xf0\x3f\x8e\xbe\x15\x9f\x6d\x19\x38\x28\x96\xe5\xf7\x2c\xfc"
- "\x85\x45\xb2\x93\xc0\x7c\x03\x1e\x09\xe9\xbd\x0f\xf4\x61\xf7\xb1"
- "\x0c\x37\x47\xb0\xbc\x6a\xbd\xce\xd1\x40\x3b\xe6\x0b\xbe\x86\x31"
- "\xe2\xe1\x1d\xda\xbc\xa4\x69\xc8\x44\x4f\x34\xc5\xf6\x41\xaf\xbe"
- "\xe1\x65\x7b\x1e\xfd\x1f\x60\x6c\x41\x2f\xa7\x9a\x4e\x3a\x46\xc5"
- "\xe5\x6f\xed\x68\x1c\x2b\x1b\xac\x23\xe9\x27\x89\xda\x0a\xeb\xe5"
- "\xbb\xbf\x5c\xa3\x1e\x02\xeb\x8c\x1d\xd6\xfe\x63\xb5\x15\x24\x7a"
- "\x22\xc9\xaa\x4e\xb8\x4a\xa4\x7c\x69\x34\x64\x7c\xf6\xce\x5f\x5a"
- "\xd4\xf8\x1d\x0a\xf3\xa3\x31\x5d\xb5\xf0\x25\xe3\x7b\x9f\x59\x51"
- "\x7f\xdb\xb7\xfb\x33\x8b\xda\xd6\x1a\xab\x63\x31\xea\x41\x2f\xcf"
- "\x4a\xa0\x82\xe3\xdb\x14\xe6\x31\xc9\x1f\xba\x1f\xf3\x4f\x9f\x88"
- "\xa9\x65\x71\x03\x4e\xc4\x56\x90\x13\x0d\x45\xa4\xaa\xe9\x0c\xee"
- "\xa7\x7e\xeb\x44\x6c\x3e\xca\x8c\x7d\x6d\x20\x17\xbe\x09\x72\x21"
- "\xcc\xd7\xde\x82\x66\x73\x84\xf4\x7d\x0a\xf3\xa9\x49\x32\xa1\x0d"
- "\xe6\x68\xb1\x98\x33\xcd\x96\x1b\x12\x5e\x2c\x7e\xab\xc2\x5c\x6a"
- "\x6f\xa4\x92\xb0\x37\xd4\x42\xac\xbb\xef\x52\x7d\x5f\x63\x3e\xd7"
- "\x5a\x21\x68\x73\x84\x94\x53\xed\xa5\xd7\x74\xe4\xcf\xf0\xee\x47"
- "\xf4\xde\xce\x49\x2d\xf3\xb1\xb0\x01\xdf\xd9\x80\xe7\x6c\x30\x9e"
- "\x40\x03\x1b\xd0\xcd\xad\x1e\x22\xd1\xe0\x46\x96\x44\x83\x07\x3e"
- "\x61\x34\x00\xfd\x65\xf9\xcb\x22\x0d\x4e\x03\x0d\x9a\x80\x06\x39"
- "\x24\xfb\xf8\x94\x2a\x12\x1d\x03\x34\x68\xb9\x8a\xf9\x0d\x78\xce"
- "\xba\x14\x3e\xf6\x8c\x16\xa7\x2d\xea\x9a\x36\x4e\x83\x5d\xd3\x38"
- "\x0d\xf6\x4c\xb3\x80\x1c\x33\xc8\xb0\x13\xca\xf6\xa5\xb1\x3a\xcc"
- "\x31\x45\x73\xe2\x30\xbf\x36\xa7\xc5\x0d\xa0\xc5\x0d\x4e\x8b\xcc"
- "\xd7\x80\x16\x75\xf5\x2c\xb6\xd5\x89\x86\x2a\x52\x15\x57\x4a\xaa"
- "\x01\x97\x80\x16\xb3\x90\x2e\xa8\x5b\xdb\x97\xeb\xfb\x81\x2e\x1d"
- "\x5c\x9c\x4e\xb4\x12\x3d\x40\x77\xef\xb3\x3e\x9d\xa0\x9f\x70\x38"
- "\xcc\x4d\x89\x1e\xc1\x8c\x1e\x97\x45\x7a\x74\xa2\xaf\x1d\xd0\xa3"
- "\x13\xe8\xd1\x09\xf4\xc8\xe1\xf4\x40\x9c\x7f\xa9\x2d\x90\x0a\x5f"
- "\xe9\x31\xf6\x45\x57\x7a\x2c\x17\xe9\x71\xfa\x56\xe8\xf1\x40\x71"
- "\x57\x7a\x68\xb3\x7b\xa2\x87\x3c\x27\x1e\x5a\x82\xf4\xb8\x51\x2a"
- "\xce\x89\xc7\x71\x4e\x64\xab\x7f\x04\x6b\x11\x8e\xe9\xb1\xda\x83"
- "\x6c\x4e\xc0\xbb\xc2\x3c\xb0\xaa\xab\x9a\x80\x2e\x73\xc5\x3c\x6a"
- "\x22\x5d\x38\x3d\xc6\x67\x97\x7d\xc6\xc7\x5f\x37\x01\xd7\x0c\x9c"
- "\x1b\x48\x1f\xa0\x13\xcc\x1f\x77\xf9\x06\x9d\xbf\xe1\x42\x9b\x02"
- "\xce\x13\x9c\x23\x38\x1f\xaa\x13\xce\xb0\xfc\xed\x27\x62\x2a\x09"
- "\x7e\xcb\x3d\x11\x7b\x10\x68\x55\x44\xec\x4b\x81\x36\xa9\xb8\x37"
- "\x84\x0c\xc0\xbc\x83\x27\x62\xd7\xa0\xbc\xa0\x01\x9e\xef\x6d\x07"
- "\x3a\xd9\xdb\xb5\x7d\xd6\x81\x1e\x85\xdf\x78\x9d\xbf\xed\x62\x8e"
- "\x65\xea\x17\x12\x0e\xe7\x7d\x6d\x40\x23\x98\x3b\x8a\x39\xe3\xc8"
- "\xbd\xfc\x85\x9e\x6c\x6b\x24\xfe\xf7\x25\x72\x1a\xd9\x9d\xe6\xcc"
- "\x8b\x89\x38\x67\xb2\x81\x46\x27\xbd\xa4\xd1\x43\x51\x0c\xdb\x43"
- "\x00\xab\x83\x60\xf4\x07\x22\x8d\x1e\xd4\x78\xa2\x91\x7d\xc7\xa0"
- "\x08\xbb\x26\x02\xe5\xbc\x47\x85\x45\x53\x54\x02\xe8\x4c\x9d\xa0"
- "\x9b\x9e\xb0\xd8\x48\xc6\xab\x44\x9d\x7e\x86\xf8\x99\xa6\x7c\x4a"
- "\x4c\xe6\x72\x16\x23\x1d\x6d\xbe\x98\xbb\xc4\x64\x2b\x07\xbc\x9a"
- "\x66\xc1\xf2\x36\x56\xb6\x90\xe5\xaf\x12\x1f\x96\x8f\x34\xb6\x94"
- "\xac\x03\xfe\xdc\x3d\xad\x54\x2d\x14\x3c\x53\x4f\x35\x98\x73\x89"
- "\x18\x6b\x0c\x36\x8c\xf1\x16\x50\x9d\x50\x85\x71\x31\xcf\x61\x0c"
- "\xf2\x9a\x36\x68\xd3\x42\x3b\xed\xb0\x66\x94\xe4\xd0\x72\xcc\x43"
- "\xf1\x34\xae\x11\x18\xb7\x4e\x15\x3a\x09\x65\x11\xb4\x7d\x19\x33"
- "\xdf\x00\xd9\x2b\x94\xe5\xee\x81\x73\xaa\xea\xf9\x6d\x70\xfd\xd1"
- "\x23\xd8\x2f\x6e\x87\xe6\xc7\xa7\x31\x9e\x78\xc8\x2b\x3f\xfe\x30"
- "\xd3\xe2\x9b\x0f\x3a\x2f\xc8\x68\xd8\xce\x5b\x94\xeb\x83\xb1\xa6"
- "\x3a\x2b\xb3\x41\x5a\xb2\x12\xfc\xf2\xd3\xd1\x9f\x0b\x73\x5a\xe0"
- "\x9a\xfd\xe8\x12\xf4\x01\xa1\x3b\x60\xbd\x0a\xf9\x85\x65\xdf\x6c"
- "\x8b\x5a\x5e\x97\x43\xab\x60\x3d\x8b\x1d\xab\xa7\x59\x98\xfb\xe3"
- "\x10\xbc\x17\xea\x41\xef\x36\x5a\x19\xa6\xbc\x37\x7b\x8d\x1a\x6d"
- "\x24\x56\xc0\x87\xaa\xcf\xfe\x9b\xe5\x88\xbd\xa8\x7a\xf8\xcc\xf1"
- "\x58\x1b\xc1\xe7\x4f\x1d\x8c\xdf\x19\x1e\xd6\x74\xa8\x4b\xe3\x3a"
- "\xfc\x42\xd6\x65\x35\xc9\xf9\x31\x9d\xf3\x60\x22\xce\xec\x9e\x0d"
- "\x6d\x22\xce\x34\x66\xab\x39\xb6\x44\xa1\x9d\xce\xdf\x15\x5b\xaa"
- "\x5b\x2e\x93\x4c\xe0\xe3\xea\x84\x52\x96\x9f\xa5\x2f\xe0\xbb\xb0"
- "\x1c\xf0\xe4\x06\xe8\xfc\x80\x27\x88\x03\x25\x80\x1f\xc2\x72\xd0"
- "\xf5\x3b\x41\xd7\x17\x71\x04\x65\x2f\x3c\xbe\x0a\x3c\x1a\x58\x09"
- "\xe7\x80\x4e\x02\xe0\x3a\xe0\x89\xfe\xcd\x74\x12\xf6\x26\xf0\xe8"
- "\x36\xc4\x11\x90\x8b\x5f\x32\x00\x8e\x2c\x05\x1c\x49\x65\x79\x8a"
- "\xb5\x25\x6a\x8e\x1f\x7f\x6a\x5c\xa3\xce\x97\xf2\x94\xb3\xf1\x7d"
- "\xe4\xb5\x1a\xe4\x8f\xb8\x6c\xec\xab\xda\x8e\xeb\xd3\xf2\x58\x9f"
- "\x9a\x36\xe0\x91\xc2\x69\x66\x3c\xc7\xe6\xed\xd2\x84\x3e\x02\xe7"
- "\xb5\x28\x1c\x93\xed\x57\x48\x38\xcb\xe5\xf9\xb5\xb6\xcf\x86\x85"
- "\x64\x48\xc9\x15\x12\x56\xb2\x90\xe8\x61\xbe\xaa\x4b\xa0\x0f\x33"
- "\x5e\xd3\x10\x96\x07\xc5\x2f\xa4\x00\xce\xbb\xcd\x83\x02\x72\xb5"
- "\xb6\x04\xe7\xcc\x22\xbd\xa3\x4f\xb6\xfc\x85\xb5\x76\x18\x3b\x16"
- "\x33\x4e\xf5\xc8\x31\xee\xa3\x1d\xa6\xe7\x72\xfe\x23\x36\xee\xe7"
- "\x34\x18\x73\xdc\xdf\x73\x49\xf5\xc8\xfb\x74\xd3\x50\x9d\x21\x9d"
- "\xa8\x2e\x49\xd7\x40\xf6\x14\x80\x56\x4f\x65\x93\x6c\x21\x68\xab"
- "\xde\x94\x76\x19\xf3\x0a\x78\x39\x0f\x1f\x61\x7b\xee\xec\xf9\x0b"
- "\xeb\x98\x6f\xd1\xa6\x85\x0d\xdb\x2f\x91\x70\xfa\x1b\xa0\xc7\x7c"
- "\x78\xd7\x4b\x24\xac\xf8\x12\xbc\xeb\x52\xfe\xae\x52\x5e\x76\x21"
- "\xa7\x34\x01\xae\x75\x9b\x43\xcc\xf2\x1b\xcc\x21\xa6\xb3\x02\x86"
- "\xdd\x4f\x1f\x43\xbf\x65\x16\xd3\xa7\xdd\x64\x3b\x43\xf0\xb9\x68"
- "\x1f\x32\x5d\x65\x3c\xfd\x36\xf2\xb2\x50\x1a\x9f\x3d\xb3\x01\x78"
- "\xbb\x3d\x81\x50\xf8\x7d\xa8\xd1\x82\x31\x74\x98\xcc\x67\x56\x85"
- "\xd6\xa1\x9c\xf6\x11\x9c\x43\xde\x77\xe2\xf9\x3a\xe4\x79\xbc\xce"
- "\xf8\x1e\xee\x33\x35\x5c\x20\xd8\x9e\x73\x3b\x48\x7f\xa9\xad\x8b"
- "\x2a\xdd\x5a\x6c\x0b\x79\x01\xed\x3a\x38\xd7\x38\xed\xcb\xd1\x47"
- "\x5d\x4b\x43\x9e\x8d\xe3\x65\x0b\xe6\xc7\xd1\x20\x0f\x30\x5e\x01"
- "\xfc\xc6\x98\xcd\x94\xc6\xfa\x00\x9f\x61\x3f\xfb\x00\xbd\xc3\x25"
- "\xbe\x80\x73\xc1\xae\xbc\xd1\x77\xa5\x06\x75\x9a\x60\xfc\x7d\xb3"
- "\xfc\xe1\x1d\xfd\x74\x6b\x3c\xfa\xcf\x85\x0d\xc2\x6f\xb5\x8f\x22"
- "\x6e\xda\x5b\x9d\x30\xb3\x85\x63\x26\x62\x92\x84\x9b\x0c\x9b\x58"
- "\x6e\x88\x72\xf4\x6f\x4d\x60\x7d\xf4\x12\x37\xab\x5b\x64\xdc\x7c"
- "\xc9\xe0\x84\x9b\x2d\xb4\x53\x18\xe8\x0e\x37\x07\xac\x55\xe2\xe6"
- "\x80\xf5\x4a\xdc\x0c\xfb\xc6\x15\x37\xbb\x62\xe6\x80\x6a\x77\x78"
- "\x09\x7a\xcc\xa3\x97\x54\x61\xa5\x9e\xb1\x72\x80\xd5\x7b\xac\xfc"
- "\x61\x6f\x25\x56\x3e\x16\xf9\xff\x2f\x56\xfe\x70\x9b\x02\x2b\x35"
- "\x37\x89\x95\x97\x18\x56\x06\xd3\xaf\x60\x4e\x88\xf8\x51\x32\xdf"
- "\x03\x56\xce\xef\x61\x2e\xfc\xc6\x13\x56\xfe\xf0\x9a\x12\x2b\xc3"
- "\xf4\x4a\xac\xfc\xe1\x19\x19\x2b\xc5\x6b\xb7\x05\x2b\x7f\xd8\x76"
- "\x77\xb0\xf2\x87\x6d\x0c\x2b\xaf\x20\x56\x86\x7d\xd2\x33\x56\x3e"
- "\x46\xdc\x63\x25\x9c\x67\x58\xf9\x18\x91\xb1\xf2\x4c\x0f\x58\x39"
- "\xf0\x03\x2f\xb0\x32\x98\x61\xa5\xc6\x03\x56\xce\x87\xb1\x12\xf9"
- "\x82\xf1\x9e\x0b\x6f\x88\x58\xa9\x75\x60\xe5\x4d\xf0\x87\x77\xf4"
- "\x1b\xb8\xbf\x3b\xac\x14\xf2\xb9\x7c\x89\x58\x49\xfb\x89\x58\x99"
- "\x64\x23\xe9\xa7\x00\x23\xeb\x2e\xb1\x1c\x38\xcc\x2f\x18\xfe\x33"
- "\x5e\x46\x2c\x1a\x4f\xf6\xc0\x78\x99\xcc\xfb\x18\x36\x31\xff\xd6"
- "\x89\x88\x55\xfb\xa0\x6e\x91\x43\xee\x64\xd8\x79\x4a\xc4\xce\xe9"
- "\x22\x76\xce\xf8\x16\xd8\x39\x0d\x69\xf9\xf8\x91\x0e\xb5\x84\x9d"
- "\x9b\x00\x3b\x1f\x67\xf2\x03\x7e\xd3\xe4\xd8\xf9\xc4\x68\xa9\x5f"
- "\x68\xd3\x34\xa5\xbc\x41\x78\xbf\xae\x76\xc5\xd1\x09\xd8\xde\xa0"
- "\x07\x8c\xf3\x5b\x88\x03\x4b\xa7\xcb\x58\x7a\x51\x35\xf8\x1b\xcf"
- "\x38\x3a\x28\xca\x81\xa3\x39\x80\xa3\x67\x9d\x70\x14\xf4\xa6\xf7"
- "\x10\xf3\x00\x47\xdb\x19\x8e\xfe\x49\xc4\x51\xfd\xa4\xe3\xd3\x01"
- "\x47\x27\x48\x38\x3a\x68\xb5\x35\xa7\x34\xce\x9a\xdb\x33\x8e\xb6"
- "\x33\x1c\x35\xdc\x79\x1c\xad\x70\xc1\x51\xd0\x5d\x31\x37\xbb\x5b"
- "\x1c\x95\xf8\x91\xe1\x68\xb6\x8c\xa3\x6c\x5c\xf5\x97\x6b\xe2\x60"
- "\xdc\xe3\x0c\x4c\x77\x73\xe0\xa8\x61\x1f\xc7\x51\x38\xc7\xec\x27"
- "\x8b\x01\x47\x81\xff\xb2\xaa\x31\x36\x20\x89\x82\x3e\x6a\x10\x5f"
- "\xb7\xc3\x9c\xc1\x31\x72\xe0\xe9\x7c\x98\x33\x88\x31\xad\x30\x67"
- "\x00\x47\x67\x5c\xd3\x10\x36\x5f\x72\x61\xbe\x5c\xf2\x90\x83\x4f"
- "\xf2\xc1\xf5\x88\xa7\x83\xc7\x2a\xf1\x74\x70\x9a\x12\x4f\x07\x3f"
- "\x29\xe3\xa9\x78\x0d\xf1\x14\x68\x06\xe3\xa3\x47\x4c\xbd\x35\x3c"
- "\x1d\x3c\xc6\x81\xa7\x6a\x11\x4f\xe7\xf7\x8c\xa7\xec\xdb\x9f\x07"
- "\x3c\x75\xc6\x06\xcf\x78\x3a\x78\x8c\x8c\xa7\x4f\x0c\x70\xe0\x69"
- "\xbd\x27\x3c\xe5\x36\xc2\xae\x78\x0a\xe7\x19\x9e\x0e\x1a\xe7\xc0"
- "\xd3\x7a\x37\x78\x3a\xc1\x19\x4f\x7f\x14\xc4\xf1\x74\x1f\xc3\x51"
- "\xc4\xd4\x9a\x36\xe0\x0f\x9c\x73\x29\x45\x0c\x53\x05\xc0\x54\xcc"
- "\x4b\x8c\x39\xa9\xd0\xaf\xde\x1d\xa6\x72\xcc\x35\x13\xc4\x55\x9c"
- "\x9b\x59\x2f\x82\xbe\x0b\x6b\x11\x8c\x09\x5b\x7b\xa5\xf1\xdb\xee"
- "\x84\xaf\x33\x97\x69\x50\xb6\x53\xf0\x8a\x20\xf1\x4a\xab\x1e\xfd"
- "\x6e\x15\xbc\xe2\x1d\x2d\x7f\xa4\xf1\x84\xad\x9e\x74\xf7\xe3\xa8"
- "\xbb\x4f\x25\xea\xe5\x53\x01\x5f\x63\x51\x77\x2f\x73\xd1\xdd\xcb"
- "\xba\xea\xee\x27\xbb\xc7\x51\xaf\x74\xf7\x5f\x22\x0d\x87\xdc\xa7"
- "\xc4\xd1\x21\x41\x4a\x1c\x7d\x7a\x3d\xf6\x8b\xe3\x78\x99\x7b\xdd"
- "\x9d\xcd\xf3\x21\xaf\x3a\x74\xf7\x7a\x25\x7e\xca\xba\xfb\xd3\xcf"
- "\x7a\xc6\xd1\x21\x6b\x14\xf2\xe8\x0c\x11\x47\x67\x8b\x38\x3a\x5b"
- "\xc6\xd1\x13\x9f\x4a\xf2\xe8\x93\x6f\x1f\xab\x77\xc6\xd1\x21\x55"
- "\x0e\x1c\x6d\xe8\x8a\xa3\x12\x86\x22\x9e\x62\x3b\x68\xcb\xda\x05"
- "\x38\xbd\x77\xb6\x41\xcd\x6d\xb5\x71\x38\x76\xfe\xae\xb6\xda\xea"
- "\x96\x6b\x24\x73\x3a\xe2\x69\x11\xc3\xd3\x40\x15\x99\x05\xd8\xd7"
- "\x17\xf7\x12\x14\xe3\x77\xfb\x54\x9e\xd3\x0d\xed\x4b\xc2\x52\x9e"
- "\x23\x54\xb2\x33\xc1\xfb\xb2\xef\xf5\xaf\x9e\x11\x31\xf5\x3a\x8c"
- "\x07\xf0\xdc\x9b\xd7\x01\x53\x53\xdd\xc8\xa6\xcb\x01\x53\xd3\x9d"
- "\x64\x53\x98\xfb\x7f\x9a\xed\x8a\xa9\x4f\x8d\xac\x41\x5e\x41\x4c"
- "\x55\xe8\xf1\x65\xdf\x03\x3d\xfe\xa9\x8d\x4a\x2c\x7d\xaa\x42\x89"
- "\xa5\x4f\x2d\x93\xb1\x54\xbc\x76\x5b\x64\xd3\xa7\xf2\xef\x8e\x6c"
- "\xfa\x54\xbe\xac\xc7\x3f\xbd\xc0\x81\xa5\x75\x9e\xb0\x74\x48\xbe"
- "\x7b\x2c\x85\xf3\x0c\x4b\x87\xe4\x3b\xb0\xb4\xce\x8d\x1e\xaf\xc0"
- "\xd2\xf0\x49\x1c\x4b\xcb\xb8\x6c\x5a\x2f\xc9\xa6\x65\xff\x84\x7a"
- "\x7c\x78\x8c\xb7\x7a\xfc\xf1\x16\x8e\x9f\x88\x4f\x12\x86\xca\x7a"
- "\x7c\x99\x67\x3d\xbe\x07\x0c\xf5\x4a\x16\x65\x18\x3a\x74\x92\x12"
- "\x43\x87\x4e\x55\x62\xe8\xf0\x23\xae\x18\xda\x15\x3f\x87\x6e\x71"
- "\x87\x9d\x5c\x8f\x1f\x9e\xe2\x19\x37\x87\x1a\xbd\xc7\xcd\x61\x67"
- "\x94\xb8\x39\xcc\xf7\x5f\x03\x37\x7f\xfc\x9a\x02\x37\x35\x37\x89"
- "\x9b\xdf\x89\x4e\xff\x63\x17\xfb\xe7\x8f\x5d\xec\x9f\x3f\x76\xb2"
- "\x7f\xfe\xf8\x36\xda\x3f\x7f\x7c\x97\xec\x9f\x3f\xae\x94\x65\xd0"
- "\xe1\x6f\xf7\x8c\x9b\x43\x2b\xdd\xe3\x26\x9c\x67\xb8\x39\xb4\x52"
- "\xc6\xcd\x9e\x64\xd0\x9f\xac\xf5\x02\x37\xbf\xe7\x3a\xfd\x4f\xba"
- "\xb5\x7f\xba\xd3\xe9\x11\x37\x19\x5e\xd6\xbb\xe8\xf4\x53\x9d\x75"
- "\xfa\x32\x59\xa7\x1f\xc7\x71\xcb\x64\xcb\x57\xea\xf4\xb7\x1d\x47"
- "\x7f\xba\xd5\xea\xb0\x87\xfe\x16\x70\xf4\xa7\x2c\x6e\xad\xd5\x61"
- "\x0f\x1d\x35\x40\xea\x17\xd7\xe9\x37\x11\xde\x2f\x37\x3a\x3d\xf3"
- "\x9b\xfd\xe9\x65\x87\x4e\x5f\xef\xaa\xd3\x8f\xfc\xc4\x33\xa6\x8e"
- "\x08\x76\xab\xd3\xa3\xfe\xcd\x30\xd5\xc0\x30\xf5\x7a\xa1\x33\xa6"
- "\x46\x0c\x65\x98\xfa\x82\x84\xa9\x23\x62\xad\x30\x37\xad\x7e\x3d"
- "\x63\x2a\xb6\x23\x63\x6a\xc2\x77\x83\xa9\xc6\x9b\xc7\x54\xe7\x3d"
- "\xac\x7f\x82\x77\x77\x60\x2a\x1b\xe3\x88\xea\x9a\x38\xc4\xd4\x04"
- "\x17\xfd\xbe\xcc\xbd\x7e\x7f\x8c\xa8\x71\x7c\x24\xfd\x1e\x69\xc0"
- "\xf0\xe6\x8e\xea\xf7\x23\x07\x2a\xb1\x75\x64\xac\x12\x5b\x47\xde"
- "\x27\x63\xab\x78\xed\xb6\xe8\xf7\x23\xc3\xee\x8e\x7e\x3f\x32\x4c"
- "\xc6\xd6\x51\xaa\x9e\xb1\x75\x44\xa8\x7b\x6c\x85\xf3\x0c\x5b\x47"
- "\x84\x76\x8b\xad\x2f\x38\x63\xeb\xa8\x6f\x24\x6c\x95\xf5\x7b\xe0"
- "\x0f\x9c\x7f\x29\xf9\xb7\xae\xdf\x8f\xbf\xdb\xfa\xfd\x28\x8b\x57"
- "\xfa\x7d\x21\xe0\x2c\xe8\xe2\xcb\x3f\x01\xfd\x7e\x92\xa8\xdf\x37"
- "\x94\xba\xe8\xf7\xa5\x5d\xf4\xfb\x8c\x49\x22\xa6\xc2\x9c\x62\x98"
- "\x3a\xbb\xec\xd6\xf5\xfb\xc9\x48\xc3\x67\x2e\x2b\x31\xf5\x99\x6f"
- "\x94\x98\xfa\xf3\x95\xd8\x2f\x8e\xe9\xa5\xee\xf5\x7b\x36\xcf\x23"
- "\x9f\x55\xe8\xf7\xd0\xbf\xae\xfa\xfd\xcf\x87\x2a\x30\x75\x86\x33"
- "\xa6\x46\x26\x28\xe4\x54\x78\x2f\xc4\xd4\x9d\x67\x39\xa6\xbe\x7b"
- "\xd6\x09\x53\x5f\x7a\x57\xc4\xd4\x67\xb7\x1e\x9b\xe2\x8c\xa9\x91"
- "\xbb\x24\x4c\x65\x78\x39\xc3\xaa\xce\x8a\xed\xea\x77\xc2\xfc\x7d"
- "\xd0\x17\x08\xda\xc6\x7d\x52\xd8\xe6\xee\xb3\x09\x3d\xfb\x9b\xc4"
- "\xba\xf7\x37\x31\xa5\x98\x49\x55\x53\x3e\xf3\x33\x29\x46\x3f\x93"
- "\x95\x64\x40\x71\x27\x8f\x1f\xc0\xf2\x79\x5c\x77\x1f\x3b\xe0\xd5"
- "\x97\x65\x9c\x45\x9f\xac\x37\xd1\x27\xeb\x3a\xf7\x01\x02\x7a\x77"
- "\x8d\x15\x20\xc9\x4d\x80\x07\x07\xce\xba\xe2\xec\xcf\x9e\xac\x41"
- "\xfe\x99\x9e\xe0\xa2\xf3\x97\x7e\x0f\x74\xfe\x9f\xbd\xae\xc4\xd7"
- "\x9f\x95\x2b\xf1\xf5\x67\x0b\x64\x7c\x15\xaf\xdd\x16\xd9\xf5\x67"
- "\xab\xef\x8e\xec\xfa\xb3\xd5\xb2\xce\xff\xf3\x59\x0e\x7c\xad\x75"
- "\xc2\xd7\xb3\xce\xf8\x1a\x69\x60\xf8\x7a\xd6\x15\x5f\xe1\x3c\xc3"
- "\xd7\x48\x83\x03\x5f\x6b\x5d\x74\xfe\xb3\xae\xf8\x1a\x35\x96\xe1"
- "\x2b\xf0\x82\x52\x76\x2d\xed\x59\xe7\x6f\xf8\xbe\xe9\xfc\x51\x5d"
- "\xe2\x1f\x75\xab\xf3\x23\xa6\x26\x71\x4c\x45\xcc\x92\x70\x55\xd6"
- "\xf9\x4b\x3d\xea\xfc\x3d\xe1\xaa\x57\xb2\x2a\xc3\xd5\xd1\x63\x95"
- "\xb8\x3a\x7a\xbc\x12\x57\xc7\x54\xbb\xe2\x6a\x57\x4c\x1d\xbd\xd6"
- "\x1d\x9e\x72\x9d\x7f\x4c\x86\x67\x2c\x1d\xbd\xdf\x7b\x2c\x7d\xee"
- "\x82\x12\x4b\x47\x5b\xff\x75\xb1\xf4\xf9\x65\x0a\x2c\xd5\xdc\x24"
- "\x96\x7e\x27\x76\x80\xe7\x3f\x51\x62\xe9\x18\x5f\x25\x96\x3e\x7f"
- "\x40\xc6\x52\xf1\xda\x6d\xc1\xd2\xe7\x6b\xef\x0e\x96\x3e\x5f\x2b"
- "\xcb\xaa\x63\x76\xf7\x8c\xa5\xa3\x0f\xba\xc7\x52\x38\xcf\xb0\x74"
- "\xf4\x41\x19\x4b\xcf\xf4\x80\xa5\x63\x37\x7a\x81\xa5\x4a\x3b\x80"
- "\x2b\x96\xde\x75\x3b\xc0\xd8\x7c\xaf\xec\x00\x12\x96\x4e\xea\x6a"
- "\x07\x40\x7c\x65\x76\x00\x18\x2f\x09\xc3\x98\x1d\x60\x0c\xc7\x32"
- "\x93\x6d\x8d\xc2\x0e\x70\xfb\xb1\xf5\x85\xb7\xac\x0e\x7b\x6a\x0e"
- "\x60\xeb\x0b\x6f\x33\x6c\x75\xd8\x53\x27\x3c\x2b\xf5\x8b\xdb\x01"
- "\x7e\x4b\x78\xbf\xdc\xd8\x01\x9e\x63\xed\x5d\x53\xd8\x01\x9c\xb0"
- "\xf6\xa2\x6a\xfc\x65\xcf\x38\xfb\x8b\x50\x85\x1d\xa0\x51\xc6\xd9"
- "\xeb\xe8\xa3\x0e\x38\xc8\x70\x36\xc4\x19\x67\xc7\xbd\xc8\x70\xf6"
- "\x39\x09\x67\x7f\x11\xd7\x0e\x73\xb3\xdd\x5b\x9c\xc5\x7d\x04\x67"
- "\xe3\xee\x0e\xce\x96\x7b\x81\xb3\x4e\xb6\x81\x03\x30\x1e\x0e\x9c"
- "\x65\xe3\x3e\xee\xcb\x9a\xe9\x88\xb3\x71\x2e\xb6\x81\x52\xf7\xb6"
- "\x81\x23\x77\xc3\x36\x30\x7e\xb4\x12\x6f\xc7\xa7\x28\xf1\x76\xfc"
- "\x60\x19\x6f\xc5\x6b\xb7\xc5\x36\x30\x3e\xea\xee\xd8\x06\xc6\x47"
- "\xc9\x78\x3b\xe1\xe1\x9e\xf1\xf6\x17\x61\xee\xf1\x16\xce\x33\xbc"
- "\xfd\x45\x58\xb7\x78\xfb\x9c\x33\xde\xfe\xdb\x7d\x12\xde\xca\xb6"
- "\x81\x52\xd1\x36\xb0\xa6\x67\xdb\x40\x83\x07\xdb\xc0\xd8\xbb\x6d"
- "\x1b\xf8\xb7\x00\x6f\x6c\x03\x1d\x85\xdc\x6f\x7f\x39\xfa\xed\xbf"
- "\x0a\xf8\x1b\xf3\x29\x8c\x41\xcf\x7e\xfb\x19\x92\xff\x69\x5c\x91"
- "\x88\xb3\x45\x6e\x6d\x03\xc7\x9b\x3d\xdb\x06\x8e\xd7\x39\xfb\x9f"
- "\x4e\xec\xad\xfc\x6e\x35\xf1\x3e\xe9\xbb\xd5\xf1\xcf\x10\x67\x63"
- "\x58\xde\x46\xa1\x20\x26\x9c\xe1\xbf\x2a\x26\x18\xfb\xe9\xce\x8f"
- "\xff\x4f\x82\xf3\xb7\xac\x89\x89\x0e\x5b\x41\x2d\xe2\x6d\x11\x11"
- "\x68\x82\x1f\xc6\x1d\x67\xb6\x82\x5f\x22\xef\x45\x1f\x71\xc6\xdd"
- "\x43\xa7\x9d\x71\x77\x62\x81\x84\xbb\x76\xc0\xdd\x0f\x1b\x8b\xb8"
- "\xfd\x75\x1a\xf7\x4d\xdd\x35\xcd\xc9\x37\xf5\xd3\xbf\x88\xb8\xfb"
- "\xe2\xc6\x63\x66\x78\xff\xee\xfc\xa7\xe0\xfe\x3d\xa7\x6f\xd6\x07"
- "\xb5\xc8\xad\xef\x94\x88\x4f\x6e\xfd\xa7\xa0\xaf\x9a\x6d\xe2\x5c"
- "\xb5\xc3\x3c\xdd\xe6\xe4\x3f\x55\x9c\x0e\xf3\x59\xdc\x57\xd2\xad"
- "\x1f\xea\x34\xd9\x0f\x95\x16\x44\x27\xe1\xfa\x26\x6c\x89\x09\xef"
- "\xa4\x09\x3e\x34\x38\x3a\x09\x9f\x7f\xe3\x06\xac\x3b\xcf\xc7\xfa"
- "\x88\x7a\x5d\x0c\x60\x4f\x5f\x3e\xee\x2f\x56\xd9\x61\xad\xb1\xc3"
- "\x5a\x23\x14\x44\xc7\xd8\x50\x36\x29\x8c\x9e\x52\x0c\x7a\x9e\x2d"
- "\x87\xe5\x67\xed\x93\x07\xba\xde\x76\xd4\xf3\xae\xc0\xdc\xc8\xd2"
- "\xab\xb1\x3f\x12\x8e\x06\x36\xc3\x7b\x5c\xe9\x5e\x96\xb3\x7d\x2d"
- "\xe3\xa8\x71\xc2\x71\x78\xe6\x4b\x1f\xd7\x20\xef\xc6\xca\x7b\x0a"
- "\x98\xcc\xec\xc1\x57\x16\xfb\xc2\xe3\x2e\x02\x2f\xdc\x06\x9b\x84"
- "\x73\x7f\x94\xb8\x1e\xfd\x80\x12\xd7\xa3\x27\x2a\x71\x3d\x5a\x25"
- "\xe3\xba\x78\x0d\x70\x1d\xe8\xc6\xe4\x68\x58\xfb\x6e\x51\x8e\x8e"
- "\xd6\x4a\xb8\x2e\x88\xb8\x5e\x72\x13\xb8\xde\xad\x1c\xed\x84\x4b"
- "\x9e\x71\x3d\x5a\x2b\xdb\x24\xa2\xaf\xb9\xf5\x91\x3d\xed\x8c\xeb"
- "\x13\x8b\x19\xae\x9f\x76\xc5\x75\x38\xcf\x70\x7d\x62\xb1\xc7\xfd"
- "\x04\xa7\x5d\xbf\xa7\xc5\x9c\x62\xb8\x5e\x2f\xfa\xc8\xd6\x7a\xb1"
- "\x9f\xa0\x9e\x63\xba\x84\xe5\x68\xaf\xba\xbb\x36\x89\x98\x7a\x6f"
- "\x6c\x12\x0c\xcb\x5b\x38\x96\x23\x36\x4a\x78\x7e\x33\xfb\x09\x7a"
- "\xc2\x73\x49\x6e\x46\x3c\xf7\x24\x37\x2b\xf1\x7c\xd2\x29\x25\x9e"
- "\x4f\x3a\xa3\xc4\xf3\xa9\xa7\x94\x78\x3e\xb5\xde\x15\xcf\xbb\x62"
- "\xf9\xe4\x27\xdd\xe1\xb8\xe1\x97\x68\xa3\x98\xba\xc6\x33\x86\x4f"
- "\x8e\xf5\x1e\xc3\xff\x7d\xea\xbf\x1c\x86\x6b\x5c\x31\xfc\xdf\xf3"
- "\x11\x83\xec\xb9\x2e\x18\x3e\x5f\xc4\x70\x11\x47\xb6\x5f\x12\x65"
- "\x61\x57\x0c\x6f\x81\xf7\xe8\x41\x1f\xb7\x7d\xe5\x8a\xe1\x53\x5e"
- "\x57\x60\xb8\xa6\x07\x0c\x9f\xcf\xed\x20\x0a\xbf\x5c\x0f\xb6\x10"
- "\x78\x8f\x82\x6d\x1e\x64\x73\x69\xcc\x9c\xfb\xa3\xc4\xf0\x29\x67"
- "\x94\x18\x3e\x55\xa3\xc4\xf0\x29\x47\x64\x0c\x17\xaf\xdd\x16\xd9"
- "\x7c\x4a\xc3\x6d\x97\xcd\x25\xfe\xe8\x16\xc3\xa7\x34\xc8\xb2\xf9"
- "\xd4\x03\x3d\x63\xf8\xe4\x38\xf7\x18\x0e\xe7\x19\x86\x4f\x8e\xf3"
- "\xb8\xcf\xa1\x0b\x86\xff\x72\xab\x17\x18\xae\xb4\x85\x48\x18\x2e"
- "\xda\x42\xb6\x3b\xd9\x42\xec\x39\xdc\x16\xb2\xed\x12\xe7\x8d\xbe"
- "\x2a\xce\xa7\xc0\x3f\xda\x12\x75\xf7\xba\xdb\xb6\x5b\xb2\x83\xfc"
- "\xd2\x63\xfe\x47\x77\x76\x10\x86\xdf\xb8\xc7\xe1\x65\xc0\xed\xda"
- "\x9b\xdc\xe3\x30\x4e\xda\xe3\x90\xef\x61\x8f\x83\x88\xe7\x33\xbe"
- "\x05\x9e\xb3\x3d\x0e\xbf\xda\xa9\xb4\x31\xff\x6a\xb7\x64\x63\xe6"
- "\x78\xfe\xca\x87\x4a\x3c\x7f\xe5\xa0\x63\xcf\x03\x60\xbe\xc9\xb0"
- "\xa9\xcb\x9e\x07\x07\xb6\x33\x3b\x68\xec\x7d\xc6\x5f\x36\x11\x07"
- "\xbe\x4f\x97\xf1\x1d\xda\x5a\xa0\xc0\xf6\x46\x67\x6c\x8f\x1d\xae"
- "\xc0\xf6\xb3\x45\x4a\xff\x88\x46\x83\x13\xb6\x4b\x7b\x1e\x5e\x1e"
- "\x7a\xac\xa1\x07\x6c\x87\xfb\x6f\x7e\x8f\xd8\xed\xc5\x76\x69\x7f"
- "\x83\x5b\x6c\x77\xde\xdf\xe0\xe4\xff\x80\xd8\xce\x72\x5c\xf4\x77"
- "\xc1\xf6\xe5\x09\x6a\xfb\x61\x98\x0f\x80\xeb\x38\x47\xec\x14\xb0"
- "\x9d\x8d\xf7\xcb\x49\xce\xd8\x7e\x23\x87\x63\xfb\x9b\x97\xbe\x3d"
- "\xb6\x3b\xe4\x61\x67\x6c\x7f\x01\xb1\x7d\x5a\x22\xdf\x7f\x91\x7d"
- "\x73\xfb\x2f\x5c\xfc\x33\xde\xbc\x09\xfb\x4b\xb7\x18\xef\xa6\x5f"
- "\x4a\x8c\x9f\xf6\xb1\x12\xe3\xa7\xb5\x29\x31\x7e\xda\x4e\x19\xe3"
- "\xc5\x6b\xb7\x45\x4e\x9f\x66\xbc\x3b\xf6\x97\x69\x46\x19\xe3\x5f"
- "\xd9\xd6\xf3\xde\x8b\xd8\x48\xf7\xbe\x19\x70\x9e\x61\x7c\x6c\x64"
- "\xb7\x7b\x2f\x14\xf6\xee\xe9\xeb\xdd\xee\xbd\xa8\xfd\xee\x7c\x33"
- "\x9c\x79\xc5\xd5\xfe\x72\xeb\xb6\xef\xe9\xeb\xbc\xb5\xbf\xe0\xde"
- "\x8b\xe5\x27\x9d\xf6\x5e\x34\xf4\xbc\xf7\x22\x63\xea\x4d\xda\x5f"
- "\xba\xf1\xcd\x38\x1e\xe3\xec\xef\xf6\xea\x5a\x25\xbe\xbf\xba\xde"
- "\x81\xef\x93\x11\xdf\x67\xbd\xa5\xc4\xf7\x59\xa5\xd8\x4f\x77\x7b"
- "\x31\xfe\xa4\xf8\xae\xf8\xea\x97\x4a\x5f\x0d\x17\xfb\xcb\x64\xe4"
- "\xbd\x59\x93\x14\xf8\x7e\xd6\x19\xdf\x67\x04\xbb\x93\xdd\xd1\xee"
- "\xcd\x7c\x8a\x67\x38\xed\x69\x7b\x49\xf2\x7f\x9b\xf9\xf0\xb1\x58"
- "\x78\x7f\xb3\x07\x5f\xb7\x19\xdc\xd7\x8d\xf9\xb6\xa1\x1d\x1c\xda"
- "\xda\x3b\xc3\xa0\xce\x8c\xa3\x02\xfa\xba\xb9\xfa\xb9\xa1\xef\x1b"
- "\xfa\xba\x55\x27\xe4\x7b\xf4\x73\x43\xde\xf4\xe4\xeb\x06\xfd\x0e"
- "\x66\x58\x7f\x5e\xc4\x7a\xd1\xd7\xad\x38\x55\xf6\x75\x53\x60\xbd"
- "\x1b\xff\xe1\x03\x67\xb3\xdd\xcb\xf1\x59\x32\xd6\x77\xa2\x1c\xff"
- "\x8c\x8b\x2d\x86\xd1\x60\x66\xec\x77\x6a\x8b\x61\x58\x1f\xf7\x62"
- "\x0d\xf2\xf1\x74\x83\x1b\x5b\x4c\x57\x1f\xe7\xef\xce\x16\x13\xf7"
- "\xb6\x12\xe3\xe3\xea\x95\x18\x1f\xb7\x5e\xc6\x78\xf1\xda\x6d\xc1"
- "\xf8\xb8\x1d\x77\xc7\x16\x13\xb7\x43\xb6\xc5\xcc\x5a\xe9\xd6\xff"
- "\x4e\x61\x63\x9f\x11\xea\xde\xc6\x3e\x43\xf4\xbf\x9b\x11\xea\x71"
- "\x4f\x48\x97\x6f\x9a\xb3\xe3\xb9\x8d\xfd\x16\xf6\x84\x34\x7c\xdf"
- "\x6c\x31\xb3\xbb\xe4\x5b\xeb\xc9\x16\xc3\x7c\x9b\x4f\xa2\x7f\x88"
- "\x77\x7b\x42\x7a\xc2\x76\x87\xec\xde\xcd\x37\x4c\x25\xb6\xcf\x89"
- "\x57\x62\xfb\x9c\x44\x25\xb6\xff\xfa\x35\x25\xb6\xff\xda\xe0\x8a"
- "\xed\x5d\x71\x7d\xce\x01\x77\x98\x6e\x98\x8c\xb6\x98\x5f\xeb\x3c"
- "\xe3\xf9\x9c\x26\xef\xf1\x7c\xee\xe5\x7f\x69\x3c\xd7\xb8\xe2\x79"
- "\xbc\xfe\x3b\xb5\xcb\x30\x3c\x9f\xf7\xb0\x02\xcf\x35\x3d\xe0\xf9"
- "\x77\x66\x97\x99\xb7\x44\x89\xe7\xf3\xca\x94\x78\x3e\xef\x55\x19"
- "\xcf\xc5\x6b\xb7\xc5\x2e\x33\x2f\xe5\xee\xd8\x65\xe6\xa5\xc8\x32"
- "\xfb\xaf\x27\xf5\x8c\xe7\x73\x5a\xdc\xe3\x39\x9c\x67\x78\x3e\xa7"
- "\xc5\xa3\x3f\x75\x17\x3c\x4f\x18\xea\x05\x9e\xbb\xf5\x51\xf9\x7e"
- "\xd8\x65\x12\xc2\xbd\xb5\xcb\x78\xda\xa7\x82\xf8\x2e\xfb\xa7\x38"
- "\xed\x53\x89\x92\xf6\xa9\x64\x2b\xfd\x53\x6e\x3b\xb6\x27\x8e\x56"
- "\x62\x7b\xe2\x58\x25\xb6\x2f\x98\xa5\xc4\xf6\x05\x71\x52\x3f\xb9"
- "\x5d\x26\xa7\xcb\xbe\x15\x25\xce\x27\xbe\x6d\x9c\xdc\x44\xdc\x61"
- "\x3d\xb4\x15\xe4\x19\xe7\x13\xab\x3c\xe1\x3c\xfa\xab\xbc\x37\x23"
- "\xc1\x0d\xce\xcf\x3f\xf9\xff\x03\xce\x7b\xf2\x43\x61\x7a\x10\x60"
- "\x3c\xe2\x3d\xc3\x77\x11\xeb\x11\xe7\xed\x7f\x76\x67\xa3\xf9\x8d"
- "\xe6\x4e\xe1\xbc\x67\x1b\x4d\xd2\x7d\x35\xd3\x45\x9c\xbf\x99\x3d"
- "\x34\x1f\x2b\x6d\x34\xc5\xf3\xef\xb4\x8d\x26\x29\x5e\x89\xf7\x49"
- "\x45\x4a\xbc\x4f\x7a\x51\xc6\x7b\xf1\xda\x6d\x91\xdf\x93\xe6\xde"
- "\x1d\x1b\x4d\xd2\x5c\x19\xef\x17\x8c\xee\x19\xef\x13\xeb\xdc\xe3"
- "\x7d\xa2\x18\x9b\x2d\xb1\xee\xe6\xf1\x7e\xa1\x03\xef\xbb\xee\x9f"
- "\xc9\xbe\x75\x1f\x99\xd1\x77\xdb\x46\xb3\xd0\x23\xfe\x77\x17\x1f"
- "\xe3\xd6\x6d\x34\xe2\x9e\xc4\xd9\xee\xe3\x63\x1c\xeb\xc6\x47\xe6"
- "\x58\x95\x33\xd6\x2f\x7a\x52\xe9\x8b\xb8\x68\xa8\xe4\x8b\x78\xac"
- "\x06\xb1\x7e\xf1\xcb\x4a\xac\x5f\x1c\xeb\xc9\x46\x73\x40\x70\xf6"
- "\x49\x5c\xb4\x5e\x69\xa3\x29\x55\xda\x68\x5e\x42\xde\x5b\xdc\xdb"
- "\x33\xd6\x2f\x2a\x57\xfa\x80\xf3\x3d\x8a\x3b\x67\x88\x3e\xe0\x33"
- "\x9c\x7c\xc0\x27\xfc\x5e\xc4\x7a\xc3\xc9\xca\x5a\x1b\xf1\xc6\x0f"
- "\xf1\xdb\xfb\x7a\xaf\x71\xeb\x83\xc8\xd6\x80\x6e\xfc\x10\x67\x9e"
- "\xd2\xa0\x4f\x73\x42\x49\xaa\x93\x1f\x62\x37\xf1\x8c\x15\xf8\x3f"
- "\xc3\xe0\x11\xff\x3b\xa8\x8c\xff\xc2\x08\xd9\x6e\x23\xa0\x9c\xcf"
- "\xe8\xf2\x9a\xe6\x4e\xd9\x6d\xdc\xd9\x49\x8c\xcf\x21\xfe\x27\xf7"
- "\xe2\x72\x7e\xc2\xf7\xcc\x6e\x93\xfc\xaa\x12\xf7\x93\xf3\x95\xb8"
- "\x9f\x3c\x56\xc6\x7d\xf1\xda\x6d\xf1\x45\x4f\x9e\x7e\x77\xe4\xfc"
- "\xe4\xe9\xb2\xdd\x66\xf1\xc8\x9e\x71\x7f\x91\xd1\x3d\xee\x2f\x32"
- "\x72\xdc\x5f\x64\xec\xd6\x6e\xa3\xf0\x8d\x4c\x79\xf8\x5b\xdb\x6d"
- "\x24\x39\xff\xae\xef\xeb\x49\x09\xf5\xc6\x6e\xe3\xd8\x93\xfe\xad"
- "\xec\x36\xee\xf1\x5e\x92\xed\x8f\x75\xf3\xcd\x55\x89\xf7\x4b\x1e"
- "\x56\xe2\xfd\x92\x01\x4a\xbc\x5f\xf6\xac\x12\xef\x97\x45\xba\xb3"
- "\xdb\x28\xb1\x7e\xc9\x6b\xee\x70\xde\xf0\x12\xda\x6d\xd2\x5a\x3c"
- "\x63\xfc\x92\x62\xef\x31\x3e\xf5\xc0\xff\x61\xbc\x0b\xc6\x6b\x5c"
- "\x31\x3e\xb5\xed\x3b\x95\xf1\x19\xc6\x2f\xfd\x52\x81\xf1\xb7\xd1"
- "\x96\x73\x33\xfb\x49\x3c\xcb\xf6\x69\x2e\xfe\xef\x69\x2e\xfe\xef"
- "\x69\x4e\xfe\xef\x69\x29\xb7\x0f\xe3\xd3\xa2\xee\x0e\xc6\xa7\x39"
- "\xf9\xbf\x2f\x7b\xb8\x67\x8c\x5f\xb2\xc3\x3d\xc6\xc3\x79\x86\xf1"
- "\x4b\x76\x74\x2b\xdb\x2b\x30\x3e\x5d\x75\x27\x6c\x39\x77\x67\xbf"
- "\x11\x30\xcb\x6d\x8a\x3b\xe2\xd1\x9e\x13\x21\xd9\x73\x0c\x1e\xec"
- "\x39\xb7\x0b\xf3\x97\x07\x29\x31\x7f\x79\x7f\x25\xe6\x67\x8d\x55"
- "\x62\x7e\xd6\x18\xa5\x3d\x27\xb9\x8b\x3d\x47\x89\xff\xcb\x97\x18"
- "\x5f\x72\xb6\xe7\x94\x3a\xd9\x73\x32\xaf\x79\xc6\xff\xe5\x1e\xf1"
- "\xff\x3a\xc3\xff\x38\x37\xf8\x9f\xf1\x2f\x82\xff\x71\xdf\x02\xff"
- "\x33\xee\x02\xfe\xaf\xf8\x86\xdb\x78\x6e\x32\x4e\xca\x01\xef\x6d"
- "\x3c\xdf\x6e\x1d\xc8\x1c\xaf\x5c\x07\x32\x33\x94\xeb\x40\xe6\x50"
- "\x79\x1d\x10\xaf\xdd\x96\x75\x20\x73\xdc\xdd\x59\x07\x32\xc7\xc9"
- "\xeb\x40\xd6\xc0\x9e\xd7\x81\xe5\x1e\xd6\x81\xe5\xe2\x3a\xb0\xdc"
- "\x8b\x75\x20\xbb\xbf\x67\x1b\x8f\xe1\xd6\x6d\x3c\x23\xef\xf6\x3e"
- "\xa8\xec\x60\xaf\x6c\x3c\x85\x93\x74\x55\x18\x23\xe5\x3c\x51\x2f"
- "\x9f\x25\xd9\x78\x8c\x2e\x36\x1e\x63\x17\x1b\xcf\xb2\xf3\x22\xfe"
- "\x4f\x14\xf7\x9b\xbe\xf4\x2d\x62\xa4\xb0\x3c\xca\x2b\x83\x94\x7e"
- "\xf3\x2b\x19\xfe\xcb\xf1\xfb\x56\xbf\x85\xfd\xe2\xeb\x8f\xb1\x9b"
- "\x18\xa8\x2b\x67\x29\x6c\x3a\x13\xdd\xc5\x48\x59\xad\xf0\xbb\x51"
- "\xee\x37\x5d\xb9\x4e\x81\xf7\x2f\xf1\xfd\xa6\xef\xba\xfb\x4e\xeb"
- "\x88\xc9\x9f\xb3\x8d\xc5\xe4\x77\xc4\xf2\x5b\x59\x7b\x53\xb1\xa4"
- "\x67\x88\xb1\xa4\xcf\xde\x85\x58\xd2\x37\x1b\x93\xff\xac\x6b\xfc"
- "\xbe\x55\x23\x4d\x55\x46\x52\x83\x3c\x32\xdd\x35\xf6\xa9\xd1\xfd"
- "\xde\x7d\xb5\xb8\x77\x7f\xe1\x9d\x89\x83\x82\xfd\x61\x6b\x7e\xbf"
- "\xad\xba\xdd\x99\x16\xd6\x1f\xcc\x59\x0d\x7d\xfd\xb0\x0a\x78\x55"
- "\x40\x3c\x4d\x46\x3c\x5d\x65\x61\x75\xcf\x03\x2f\xf4\x1b\xac\x43"
- "\x3e\xce\x13\x48\x80\x21\x15\xb1\x75\x15\xf3\xfb\x02\x31\x02\xb0"
- "\x95\xd7\x5b\x71\x9e\xda\xed\xfd\x86\x62\xce\xd5\x7b\xf6\x2c\xac"
- "\xed\x55\x63\x6e\x83\x79\x71\x09\xf7\xc4\xaa\x4c\xb6\x76\x23\xd2"
- "\xe2\xd0\xc2\x5a\x5f\x0a\xf8\xbb\x7d\x1e\xf1\xf7\x6e\x9e\xae\x3a"
- "\xc8\xe4\x19\x5c\xf7\xfa\x6d\x1d\x82\x71\x40\x24\xd9\x4a\xf8\x5a"
- "\xb6\x6f\x6d\x83\xf1\x11\x28\x5f\xfb\x66\x26\x72\xdc\x80\xe7\x25"
- "\xc0\x58\x32\x1f\x5b\xc4\x0d\x96\xc3\x0a\x70\xa3\xe4\xaa\xfc\x1d"
- "\x1b\xdb\xc7\x31\xe2\x76\x94\xd5\xb2\xff\x8b\xd9\x13\xb6\xae\x2c"
- "\x70\x8f\xad\x2b\x0b\x38\xb6\xae\x2c\x70\x60\xab\xd9\x8d\x1d\x45"
- "\xe1\xc7\xfe\xba\xe8\xff\x62\x74\x91\xb1\x8d\xff\x84\xf1\x51\x5e"
- "\xf7\xca\xff\x85\xe1\x69\x12\xc7\x53\xc4\x2b\x09\x53\x65\x3b\x8a"
- "\xd1\xa3\x1d\xa5\x27\x4c\xf5\x6a\x0f\x3f\xc3\xd4\xdc\x78\x25\xa6"
- "\xe6\x26\x2a\x31\x75\xed\x97\xae\x98\xda\x15\x4f\x73\x77\xba\xc3"
- "\x52\x1e\x1f\x65\x6d\x91\x67\x1c\xcd\xad\xf3\x84\xa3\xcc\x3f\x7d"
- "\x86\x93\x7f\xba\x03\x47\xff\xe3\x82\x12\x47\xff\x43\x7b\xb3\x38"
- "\xca\x72\x9b\x9c\xfd\x0e\x72\x9b\xdc\x32\x8e\x1a\x5c\x70\x74\xcd"
- "\x4a\x19\x47\x5d\xf3\x9b\xf4\x80\xa3\xf3\xef\x4c\x0c\x14\x05\x8e"
- "\x0a\x16\xd6\x1f\xdd\x42\xec\xeb\xda\x5e\x4a\x1c\x5d\x1b\xe1\x19"
- "\x47\xd7\x9c\x94\x71\x94\xd7\xbb\xb3\x38\xba\xd6\x57\x81\xa3\xf3"
- "\x9d\x70\xf4\x2b\x59\x87\x40\x1f\x0b\x07\x8e\x2e\x70\xc2\xd1\xf9"
- "\x3d\xe1\xe8\x5a\x5f\x1c\x23\x2e\xa3\xae\x3d\xd6\x33\x8e\xe6\x36"
- "\xb8\xc7\x51\x38\xcf\x70\x34\xb7\x41\xc6\x51\x37\x32\xaa\x02\x47"
- "\x7f\xbb\xdb\x0b\x1c\xfd\x9e\xc7\x46\xf9\xed\x2e\xaf\x6c\x15\xf2"
- "\x9e\xce\xae\x31\x52\x5f\x75\xde\x13\x54\xee\x92\xf7\xa4\xbc\x4b"
- "\xde\x93\x65\xd2\x1e\xcf\x71\x22\xae\x4e\xf8\x16\xb8\xca\xf6\x78"
- "\xfe\xee\x43\xa5\xef\xc9\xef\x3e\x96\x7c\x4f\x38\xae\x6e\x98\x2a"
- "\xf5\x4b\xce\x7b\x52\xde\x4d\x8c\xd4\x75\x41\x8a\xd8\x28\xe3\x9c"
- "\x63\xa3\x6c\xe8\xe5\x39\x46\xea\xba\x08\x45\x6c\x94\xe3\x65\x8e"
- "\xbc\x27\xae\x31\x52\x65\x8c\x5d\x3f\x9e\x61\xac\x23\x06\xd5\xba"
- "\x0c\x47\x8c\xd4\x1e\xf6\x05\x61\x3b\x7b\x1a\x13\xee\x3c\xc6\x1a"
- "\xbd\xc0\x58\x45\xde\x13\xd7\x18\x53\xeb\x2f\x9b\x2a\xcb\x49\x4d"
- "\x5c\xb9\x9b\xd8\xa8\xe5\x77\x35\xf7\x09\xf6\xcb\x3d\xd6\xe6\xbd"
- "\xa6\xc4\xda\xbc\x1d\xac\xee\x19\x77\x58\x9b\x37\x5a\xc6\x5a\x5e"
- "\x6f\xc5\x19\x17\xac\x6d\xf0\x80\xb5\xb0\xae\x6e\xbf\xe8\x2d\xd6"
- "\xe6\x19\x18\xd6\xe6\x88\x58\x7b\xe9\x76\x63\x6d\x9e\x41\xc6\xda"
- "\x0d\x3f\xe9\x39\xc7\xd4\xba\x28\xf7\xfb\x72\xd6\x45\x71\xac\x5d"
- "\x17\xd5\x6d\x8e\x29\x85\xcf\x47\xfe\x40\x29\xc7\x94\x6c\x0f\x28"
- "\x17\xed\x01\xff\xcc\x39\x51\xf2\xc3\xbc\xb5\x07\x9c\x00\xdd\x1d"
- "\xf7\x5d\x2e\xc7\x9c\x53\xd3\x31\x27\xca\x3e\x17\x7b\xc0\xbe\xae"
- "\xf6\x80\x97\xbb\xc7\x58\xaf\xec\x01\x6c\xdf\xe5\xc6\x01\x4a\x8c"
- "\xdd\x38\x50\x89\xb1\x05\x1f\x4a\xfb\x2c\xb1\x3f\x9e\x63\xa6\x6e"
- "\x7c\xcd\x61\x0f\x68\x50\x62\xab\x6c\x0f\x28\x58\xe0\x19\x63\x37"
- "\x2a\xed\xbf\x13\xca\x14\xfb\x2c\xdf\x6d\x74\x8e\x43\x2d\xc5\x9f"
- "\xda\x74\xe0\x58\x9d\x33\xc6\x6e\x34\xff\x33\xc5\xa1\x76\xc4\x9a"
- "\xea\xc1\x97\xbb\x6b\x1c\xea\xcd\x53\x4d\x95\xfb\x08\xee\x6d\x63"
- "\x78\xab\xb0\x0d\xec\xbb\x3b\xb6\x81\xca\x7d\x1e\x6c\x03\x9b\x4f"
- "\x29\x71\xb6\x20\x80\xd5\x3d\xe5\x0e\x67\x37\xef\x94\x71\x96\xd7"
- "\x5b\x71\xca\x05\x67\xeb\x6f\xa7\x4c\xbb\xb9\xfe\xce\xda\x06\x36"
- "\xd7\xcb\xb6\x81\x82\x9b\xd8\xff\xb8\x71\x87\x7b\x9c\xdd\x28\xda"
- "\x5d\x37\xca\x76\xd7\x7a\x37\xf9\x52\x14\x38\xbb\x65\xa5\xb4\xff"
- "\x91\xc9\xb4\x0d\x92\x4c\xbb\xef\x9f\x30\x5f\xca\x96\x6c\x6f\x6d"
- "\x03\xb8\xcf\x1d\xb1\x15\xb1\x4b\xc2\x57\xd9\x36\xb0\xcf\xb3\x6d"
- "\xa0\x07\x7c\xf5\x3e\x77\x5f\xe1\x4a\x25\xbe\x16\xbe\xae\xc4\xd7"
- "\x37\x82\x5c\xf1\xb5\x2b\xb6\x16\x1e\x71\x87\xab\xdc\x36\xb0\xd5"
- "\xe8\x19\x53\x0b\x2d\x9e\x30\x95\xc5\xf4\x6b\x94\x7d\xa4\x65\x4c"
- "\x2d\xba\x4f\x89\xa9\xff\x39\xfc\x66\x31\xf5\xae\xe4\x4b\xb9\x65"
- "\x4c\x4d\x70\xc1\xd4\xa2\x9d\x32\xa6\xba\xe6\x4c\xe9\x01\x53\xef"
- "\x94\x9d\xc0\x19\x53\x15\xb2\xeb\xd6\x27\x95\x98\xba\x35\xce\x33"
- "\xa6\x16\xd9\x65\x4c\xe5\xf5\xee\x2c\xa6\x6e\x1d\x72\x67\xed\x04"
- "\x5b\x87\xc8\xb2\xeb\xd6\x6f\x7a\xc6\xd4\x42\xab\x7b\x4c\x2d\xb4"
- "\x72\x4c\x2d\xb4\xde\xfc\x9e\xf2\x37\x4e\x7a\x81\xa9\xdf\xf3\x5c"
- "\x2a\x6f\xd4\x79\x6d\x27\x40\x7b\x2b\x62\x69\xc3\xb7\x8b\x1d\x92"
- "\x26\xc5\x0e\x19\x23\x62\xec\x0b\xdf\x16\x63\xdf\xbc\xa0\xf4\x69"
- "\x78\xf3\x4b\xc9\xa7\x81\x63\xec\xf6\xb5\xca\xfc\xa8\x5d\x63\x85"
- "\x28\x63\xa8\x16\x8f\x74\xd8\x09\x10\x73\xc7\x38\xdb\x09\xb6\x8f"
- "\xf4\x8c\xb7\xc5\x71\x0a\x3b\xc1\x51\xf7\x78\x7b\x5d\x81\xb7\xdb"
- "\x56\x30\xbc\x75\xc4\x50\x2d\xde\x21\xc5\x50\xed\x51\x86\x55\xe0"
- "\x6d\xdc\x77\x83\xb7\xe5\x37\x8f\xb7\xca\x5c\x2a\xae\xf1\x52\x4b"
- "\x06\x98\x2a\x00\x6f\x59\xbc\x0e\xd7\x98\xa9\x37\x17\xaf\xe3\x4e"
- "\xc5\x4c\xc5\x7e\xb9\xc7\xdd\x92\xb7\x95\xb8\x5b\x52\xcf\xea\xba"
- "\xc5\xdd\x92\x25\x32\xee\xf2\x7a\x37\x8d\xbb\xb7\x64\x33\x28\xd9"
- "\x71\x67\x6d\x06\x25\x3b\x64\xdc\xdd\x9e\xd8\x33\xee\x16\x27\xb8"
- "\xc7\xdd\xe2\x04\x8e\xbb\xc5\x09\xdd\xe2\xae\xc2\x87\xa0\xf4\x65"
- "\xb7\xb1\x3c\x1a\xfe\xd9\xf3\xac\x94\xc6\xde\x8a\xcd\x00\x30\x58"
- "\x9d\x81\x31\x9c\xe2\xd0\x87\xa0\x67\x9b\x41\x4f\x78\xeb\xbd\xcd"
- "\xe0\xad\xa9\x4a\xbc\x7d\xeb\x65\x25\xde\xbe\xdd\x0b\xfb\xd5\xad"
- "\xcd\x80\x61\xc0\x5b\x6f\x3b\x6c\x06\x66\x25\xce\xca\x36\x83\x1d"
- "\x1f\x78\xfe\xf6\xf5\x56\xad\x42\xbe\x7d\xc1\x25\x66\xf5\x0c\x19"
- "\x6f\x8f\xd7\x48\x3e\x63\xff\xa5\x3a\x16\xe3\x8c\xb7\xbf\x0f\xee"
- "\x12\xb3\x7a\xca\x6d\x8c\x59\x3d\xe5\x36\xc7\xac\x9e\xaa\x8c\x59"
- "\xfd\xc6\x75\xd9\x8f\xcc\xfb\x98\xd5\xff\xb5\x8d\x61\x30\xf2\x10"
- "\xc6\xad\xbe\x19\x3b\xc2\x1d\xce\xb5\xa2\xc0\x5e\x85\x1d\x61\xc7"
- "\x00\x25\xf6\xee\x98\xe2\x19\x7b\xff\xeb\x1b\x19\x7b\x79\xbd\x3b"
- "\x2b\xf3\xee\xd0\xdd\x59\x3b\xc2\x0e\x9d\x6c\x47\xd8\x71\xc1\x2d"
- "\xf6\x2a\xbe\x8d\xbd\x55\xef\xfe\xdb\x18\x9c\x67\xd8\xfb\x56\xbd"
- "\x47\x3b\x42\x17\xff\xad\xb7\x8f\xf1\x6f\x63\xa2\xcc\x6b\xf6\xc2"
- "\x8e\xf0\xbd\xf3\x31\x78\xbb\xf2\x56\xec\x08\x88\xb7\x88\x67\x12"
- "\xe6\xde\x8c\x1d\xe1\xf6\xcb\xb8\xef\x1c\x53\x62\xee\x3b\xd5\x4a"
- "\xcc\x7d\x77\x81\x2b\xe6\x76\xc5\xdb\x3f\xdc\xe7\x0e\x6b\xb9\x1d"
- "\xe1\xdd\x50\xcf\x38\xfb\x87\x08\x8f\x38\xeb\xe2\x9b\x2b\xe3\x6c"
- "\x59\xa2\x12\x67\xff\x90\x71\x4b\x38\x7b\xb3\x39\x58\xbe\x57\x38"
- "\x1b\xe7\x82\xb3\x3b\x7b\xc9\x38\xeb\x9a\x87\xa5\x07\x9c\xbd\x43"
- "\x79\x58\x3c\xcb\xb8\x3b\xd7\x2a\x71\x76\xe7\x41\xcf\x38\xbb\xf3"
- "\x65\x19\x67\x79\xbd\x3b\x8b\xb3\x3b\xd7\xdc\x59\xdb\xc2\xce\x35"
- "\xb2\x8c\xfb\xee\x8b\x3d\xe3\xec\x1f\xa2\xdc\xe3\xec\x1f\xc4\xef"
- "\x62\x7f\x88\xf2\x28\xe3\x76\xc1\xd9\xf7\x86\x7a\x81\xb3\xdf\x73"
- "\x1f\x84\xf7\xbc\x8a\x7f\xe1\x64\xaf\xf5\x33\x99\x5d\xf6\x4b\x9c"
- "\x72\xde\x2f\xe1\x64\x5b\x18\x23\xd9\x16\x94\xf9\x59\xd2\x24\xfb"
- "\x6d\x94\x88\xbb\xcf\x7d\x5b\xdc\xdd\x35\xba\xdd\x81\xbb\xc9\x80"
- "\xbb\xbb\xd8\xfe\x88\x76\x07\xee\xee\xed\x90\xfa\x25\xe7\x67\xf1"
- "\x60\x5b\x18\xc5\xda\xdb\xe2\xb0\x2d\x20\x0e\x47\x39\xdb\x16\xf6"
- "\xee\xf4\x8c\xc1\xbb\x0e\x2a\x6c\x0b\x7f\x71\x8f\xc1\x6d\x0a\x0c"
- "\xde\x7d\x99\x61\xf0\x28\x09\x83\x77\x93\xeb\xa0\x5b\x5e\xcf\xf5"
- "\x0e\x83\xdb\x18\x06\x8f\xbb\x3b\x18\xbc\xff\x36\x60\x30\x1b\xf7"
- "\x3d\x1b\x4d\x46\xc0\xe0\xe9\x88\xc1\xe3\x6e\xce\xde\xf0\x1d\xe5"
- "\x68\xc1\x7e\xb9\xc7\xe2\xbd\xfd\x95\x58\xbc\x77\x1c\xab\xeb\x16"
- "\x8b\xf7\x5c\x90\xb1\x98\xd7\xbb\xb3\xf6\x86\xbd\xc1\x77\xd6\xde"
- "\xb0\x37\x58\xc6\xe2\xbd\xa7\x7a\xc6\xe2\x5d\x15\xee\xb1\x18\xce"
- "\x33\x2c\xde\x55\xd1\x2d\x16\x8f\x72\xc6\xe2\x7d\x0e\x99\x57\x61"
- "\x6f\x30\xff\xb3\xe7\x6e\xd9\xe7\x51\xfe\xd5\x3d\x42\xb2\x1b\x55"
- "\xef\x0f\x30\x15\x13\xd2\x9a\x43\xb2\x4d\xb6\x51\x04\xce\xc1\xf8"
- "\xbd\x3f\xde\xa4\x8d\x20\xc2\xa6\x91\x6b\x10\x8f\x37\xe3\x3f\xc8"
- "\xb8\xf9\x6a\x71\x6e\xb1\x31\x7e\x9f\xf9\xbb\xe2\x79\xc4\xde\xed"
- "\x4e\xd7\xdd\x3d\x8b\xe6\x8f\xf4\x15\xef\xdb\xc1\xf7\xdd\x8c\xf4"
- "\x97\xca\xc8\x9b\x66\xd5\xfb\x65\x74\xe3\x48\x62\x09\x1a\x49\xdc"
- "\xdd\xff\x98\x86\xf8\xf7\x5d\x49\x69\x49\x21\x6d\x6b\x7d\x7c\x94"
- "\xa6\xf5\xb7\x84\xe4\x17\x52\x4b\x7b\xee\xfb\x66\xb8\xd7\xff\x3f"
- "\xa1\x5e\x6b\xbf\x3d\xf0\x1e\x31\x04\xce\xb5\x49\xe7\x60\xdc\x88"
- "\x90\xe3\x43\x05\xb8\x46\x37\xd9\x5b\xb6\x67\x02\x56\x65\x10\xf2"
- "\xd4\x75\x9c\x33\xff\xed\x0b\x3c\x13\x9c\x07\x6d\x6e\x80\xb6\xe8"
- "\x0f\x1e\x6a\x03\x7e\xf4\xad\x59\x4d\x70\x4e\xaf\x81\xf7\x2a\xcd"
- "\xc3\xb1\xf7\x79\xa2\x88\xaa\x7d\x89\xf0\xf6\xe0\x04\xda\x7f\xb2"
- "\x0e\xe8\x41\xf2\x93\x89\x3f\xbe\xc7\x06\xa8\x47\xd5\x59\x14\xd6"
- "\x11\x8b\xc9\xd6\xc6\xe7\x34\xf4\xef\x10\xe8\xb1\x14\x9e\x5b\x92"
- "\x4c\x34\xf0\x1f\x40\xb7\x4c\xd6\xb5\xe7\xfe\xf7\x3a\xe8\x57\x0a"
- "\xf6\xcb\xd3\x3b\x6e\x78\x03\xd6\x9d\x87\xb4\xb8\x76\xb0\xe7\xe3"
- "\xb3\xd9\x73\xd4\xc2\x1a\x3b\x9c\xa7\x39\x59\xd4\x94\x66\x23\x81"
- "\x30\x16\xdb\xa1\xdf\xc8\x8f\xc2\x3b\xa3\x34\xab\x1e\x24\x64\x4f"
- "\x7a\xb3\xda\x04\x7d\xb7\xff\xe7\x43\x6d\xc6\xcc\x61\x04\xae\x5b"
- "\x50\x67\xb9\xa8\xfa\xe3\xda\xe8\x2f\x09\x41\x3c\x81\xdf\x5b\xda"
- "\x60\x1d\x7b\x11\xca\x1b\xe0\x3d\x84\x56\xad\x2f\xd6\x85\xf3\xa3"
- "\x8d\xa9\xa7\x49\xa0\x81\xf8\xe7\xc1\xbb\x89\x75\x35\x58\xd7\xac"
- "\xfa\x63\x01\xf6\x01\xca\x61\x50\xc6\xfb\xd0\x87\x8c\xd0\x1d\x83"
- "\x13\x18\x6f\x16\x4c\xd6\x09\x03\x07\x73\x9d\x08\xde\x73\x03\xbc"
- "\x33\xd4\x09\x80\x3a\x01\xec\x98\x49\x34\x05\x70\x0e\xdb\x81\x63"
- "\x80\x71\x61\x27\xb6\x4d\xb0\x6d\x0f\xe3\xe0\x4b\x83\x27\xeb\x28"
- "\xf0\x36\xae\xa9\xba\x4c\xd5\x27\x8d\xaa\xfd\xc3\x03\x55\x94\xc2"
- "\x3c\xb7\xac\xca\x24\x01\xf9\x02\x21\xc6\x07\xb1\x9d\xfd\xf7\x41"
- "\xfb\xbe\x38\x16\xed\xb9\x7f\x6c\x31\xab\xfe\xbb\x08\xc7\x17\xe8"
- "\xd9\xa6\x7b\x0c\xdf\x61\xff\x18\x7c\x0e\xde\xc3\xeb\xff\x91\xc5"
- "\xbe\xc7\x3e\xeb\x32\x7d\x28\x5c\x7f\xd2\x47\x75\x9e\xf8\x68\x03"
- "\xf2\xda\x73\xf7\x0f\x31\x93\xdf\xac\xc3\xfb\xcd\xfc\x3e\xe0\xa5"
- "\xfd\x51\x40\xb3\xfd\x78\x0e\xcb\x1e\xfa\x1b\x20\xd1\xad\x5a\x0b"
- "\xbc\xe1\x4a\x3b\x89\x47\x80\x2f\x24\x1e\xc1\xfe\xee\xcd\x34\xab"
- "\xd9\x3a\xac\xda\xcf\xf4\xba\x3c\xa0\xa1\xfd\x4d\xad\xef\x06\x18"
- "\x5b\xe1\x06\xd2\xa5\x11\xae\x7d\xf0\x3a\xd2\x65\x43\x3a\xd0\x84"
- "\xd7\x2d\x93\xfb\x8f\xe5\x0f\x18\x3d\x05\xa0\x05\xdf\xbb\xf9\xc1"
- "\xcb\xf8\x3e\x1b\xae\x03\x1d\x43\x68\x5b\x45\x1a\xf4\x0b\xf9\x16"
- "\x78\x64\x4f\xb2\x55\x8d\x7e\x7d\x78\xfe\xd0\x55\xab\x7a\xc3\x25"
- "\x82\x72\x25\x59\x0f\xb8\xbc\x2d\x15\xc6\x1c\xda\xa4\x61\x83\x2c"
- "\x4f\x4b\x74\x4c\x07\xda\xa5\x02\xef\xc2\x98\x6f\x80\xf1\x2b\x01"
- "\xcc\xc3\xdf\x25\xb0\xfe\x80\x4c\x67\x31\xab\x3e\x28\x80\xf6\x34"
- "\xdb\x42\xa8\x65\x7b\x08\x6d\x81\x31\xfc\x7d\x7b\xee\x07\x06\x69"
- "\x0c\xb1\x4f\x1b\xe0\xfc\x7a\xb8\x0e\xe3\xd9\xc2\x79\x68\xff\x41"
- "\xe9\x9d\x3d\x8d\xe7\xba\x3d\x24\x62\xfd\x1e\x12\xfa\xdb\x3d\x24"
- "\x72\x79\x13\xcc\xcb\x9c\x9f\xd3\x13\xd3\x6d\xb0\x26\x6e\x8e\xe8"
- "\x0c\x79\x86\x7d\xe3\x17\x56\x3d\x54\xfa\xfa\x1e\x32\x04\xf7\xc6"
- "\x46\x43\xcb\xb8\x86\x47\xf7\x3a\x47\x4d\x86\x6b\x44\x08\xda\x1c"
- "\x61\x5f\xf5\x44\xbf\x97\xae\x11\x72\x44\xdf\x46\x32\x53\x60\x2d"
- "\xbf\xda\x4c\x32\xdb\xa8\xa5\x26\xfb\x4b\x42\xf3\x23\xac\x7c\xec"
- "\xfe\x37\x3c\x3a\x9e\x10\xdc\x33\x28\x7c\xa5\x27\xf7\x25\x10\xdf"
- "\x8c\x53\x44\x9b\xd5\x44\x9b\xed\x85\xbf\xb0\x64\xae\x20\xea\x3d"
- "\x57\xeb\xb9\xec\xa9\xfa\x5f\xd5\x87\xb8\x3f\xb5\x3d\x96\xcc\xb4"
- "\x89\xeb\x51\xc1\x64\x7d\x56\x22\x79\x00\xdf\x27\x90\xc9\x5e\xff"
- "\xb3\x0d\xc6\x4d\xef\x1d\x3e\xff\x4f\x02\xa3\x67\xe1\xf8\xec\x3d"
- "\xb3\xad\x20\x6f\x51\x4d\x56\x3c\x6d\x46\xb9\x0e\xd6\x17\x26\x0b"
- "\x9a\x9a\x6d\x20\x5b\xcd\x85\xf5\xdb\x4c\x3e\x6a\x2c\x55\x0b\x1b"
- "\xa9\xc6\xcb\x67\x54\xb1\x75\x1b\xd7\x52\xe8\xfb\x54\x3d\xc9\x66"
- "\xfd\x87\x35\x33\x30\x05\xe5\x29\x7a\x0e\xfb\x7f\x08\xde\x95\x0e"
- "\x88\xcf\x86\xfa\x31\xb8\x7e\x46\x37\x18\x49\x95\xd5\x4e\xde\xb8"
- "\xc4\xc6\xc8\x0f\xc6\xc8\x17\xae\x85\xc1\x38\xf9\xbb\xa3\x1b\xd2"
- "\x4c\xc8\xdf\x1c\x21\xf8\x70\xda\x30\xba\xb4\x71\xba\xbc\xf4\x1a"
- "\x81\x75\x14\x68\xb3\x91\xd3\x46\xe8\x3f\x89\xd1\xc6\xbb\xf7\xf8"
- "\xdf\x02\x4f\xeb\x0b\x3e\x9b\x02\x7f\x20\x5f\x08\xc1\x93\x08\x3e"
- "\x1b\xfb\x80\xdf\xcf\x90\x0f\xa2\x5f\x3f\x47\x6b\x0c\xcd\xc4\x04"
- "\xef\x43\x83\x9c\xfb\x60\xf3\xb2\x0f\xe5\x5a\x4f\x7d\x58\xf7\x14"
- "\xf0\xed\x53\xc0\xb7\x4f\x01\xdf\x9a\x39\xdf\x1e\x6f\xe0\x7c\x6b"
- "\x87\x7e\x75\x80\xec\xbe\x7c\x2a\x51\x63\xbf\x76\x9d\xc6\x18\x7d"
- "\xd0\xcf\x66\x99\x77\x5f\xbc\x0c\x63\x24\xf1\xaf\xcf\x13\xfd\x70"
- "\x7c\x6a\xda\xea\x49\x16\xf2\x6f\xa7\x3b\xfe\x3d\x60\x89\x9e\x05"
- "\xb4\xf9\x35\xf0\xef\x3f\xf4\x24\xa0\x89\xf8\xae\x98\x0a\xfc\xdb"
- "\xec\x8e\x7f\x0f\x7c\x7c\x10\x9e\xd9\x85\x7f\xe3\x9d\xf9\xf7\xc0"
- "\xab\xde\xf3\xef\x01\xbd\x83\x7f\xa7\x89\xfc\x9b\xe8\xc2\xbf\x4d"
- "\x4e\xfc\x8b\xef\xed\x35\xff\x1e\x58\xe7\x1d\xff\x1e\xd0\x38\xf8"
- "\x17\xf4\x92\x37\xe6\xb1\x31\xf2\x83\x31\x02\xfe\x2d\x6f\x82\x71"
- "\x72\xcb\xbf\xdf\x3d\xfd\xfe\xbc\xef\xe6\xe9\xf7\xe7\x95\x3d\xd3"
- "\xef\xcf\x0f\x7b\x4f\xbf\x3f\x35\xdf\x79\xfa\xfd\x79\xa2\x77\xf4"
- "\xfb\x53\xad\x67\xfa\xfd\x69\xc7\xf7\x87\x7e\x1f\x1a\x6e\x9e\x7e"
- "\x1f\x8e\xee\x99\x7e\x07\xcf\x78\x4f\xbf\x83\x65\x77\x9e\x7e\x1f"
- "\x06\x78\x47\xbf\x83\xf9\x9e\xe9\x77\x70\xae\x27\xfa\x3d\xff\x80"
- "\x40\x05\xf4\x9b\x0b\x19\x11\x87\x32\x10\x97\xd7\x0e\x3d\x8b\x3a"
- "\x23\x94\x7d\xa5\x32\x93\xa9\x40\xaf\x76\x29\x07\xb8\x94\x35\x2e"
- "\xe5\x60\x97\xb2\xd6\xa5\x1c\x2a\x95\x81\x5e\xbd\xae\xa8\x3e\xdc"
- "\x0d\x3a\x1b\xbc\xcb\xa1\x71\xe2\xf5\xb0\x99\x76\x1d\xea\x7d\x61"
- "\xee\xfa\xbe\x21\x87\x5a\x0d\x99\xe4\xa1\x4b\xaa\x43\xfb\x19\x3d"
- "\x56\x3d\xa8\xa7\xe9\xd9\x04\xe8\x31\xe6\xa5\x15\xc8\x57\x16\x42"
- "\x6f\x68\xfd\x60\x9c\x7e\x00\xfa\xa6\x05\x79\x4e\x97\xfc\x11\x6d"
- "\x54\x1d\x7a\x0b\xdf\xef\x29\x83\x91\x08\x3e\x4f\xe8\x51\x17\x02"
- "\xfa\x8c\xb1\xf8\x3c\xf1\x20\x7d\x6b\x9e\x26\x4f\x2d\xf8\xe7\xe5"
- "\x08\xba\x15\x16\x6a\x99\xf8\x0d\xac\x63\xb0\x96\x99\x5a\xac\xc0"
- "\x93\xd4\x62\x4c\xbe\x0c\xfd\xfd\xa8\x77\x75\x06\xb4\x0d\xcf\x81"
- "\x67\x45\x51\x0d\x0d\x33\xd9\x6a\x09\x85\x36\x6a\xda\x2a\x41\xf7"
- "\xaf\x27\x62\x9b\x51\x34\x88\x86\x61\x9b\x6e\xf5\xb3\x82\x11\x05"
- "\xf0\xcc\x51\x53\xf5\xbe\x84\xae\xf4\x0d\xf6\x8e\x3f\x3e\x1a\xe2"
- "\x51\xef\x2b\x88\x08\xe6\xed\xfa\xdf\x4a\xbb\xab\xbb\x69\x57\xec"
- "\xaf\xe6\x56\xda\x6d\xf0\xdc\xee\x48\xb1\xbf\xba\x5b\x68\xd7\x38"
- "\xbc\x9b\x76\xc5\xfe\x46\xdd\x4a\xbb\x1e\xf3\x7f\xd0\x82\x51\x62"
- "\x7f\xb3\x6f\xa5\xdd\x26\xcf\xed\x8e\x28\xb8\x35\x5e\xf8\x38\xa2"
- "\x3b\x5e\xb8\x35\x3e\xf8\xb8\x9b\xf7\x8f\x28\xb8\x35\x1e\xf8\xd8"
- "\xdc\x1d\x0f\xdc\x1a\xfd\xff\xd2\x2d\xfd\x6f\x8d\xf6\x7f\x59\xd3"
- "\x1d\xed\x6f\x8d\xee\x7f\xf1\xc8\xff\xa8\xcb\x02\xed\xc3\x69\x48"
- "\xbc\x41\x28\xbc\x27\x5c\x08\x19\x31\x6c\x95\x10\x45\x9e\x07\x0c"
- "\x0b\x2c\x22\x41\x51\xcc\x3e\x74\xd8\xb0\xa2\x98\xa8\xf3\xd5\x82"
- "\x7a\x77\x7a\xbd\xda\x64\x8b\x20\x59\x36\x6a\xdf\x91\x6a\x55\xfd"
- "\x10\xce\x7f\x0c\x1a\x4d\xdb\x62\x3d\xe1\xed\xdc\x13\x9e\x97\x19"
- "\x45\xa2\xed\x04\xed\x11\x6d\x87\x33\x00\xc3\x00\xc7\x4c\x45\x56"
- "\x5c\xf3\x82\xe0\x3e\x1b\xf0\x2f\xb4\x61\x25\x7b\x05\x8b\x2a\x2a"
- "\x99\xd5\xb3\x80\xde\x68\xa1\x85\x23\x86\xd1\x2c\x3d\x59\x0d\xbf"
- "\xe1\x99\xa7\x7c\x2c\x44\x5d\x02\xfa\x64\x7b\xee\xe1\x3a\xb3\xaa"
- "\x62\x1f\xea\x98\xa0\xcb\xb6\x64\x7d\x83\x36\xf7\x78\xc3\x2a\xd0"
- "\x6b\xb1\xee\x1e\xc1\xa2\x7e\xca\x40\xd4\x87\x2d\xa8\xbf\x57\x90"
- "\x8f\x53\x08\xe9\xc6\xe6\xe2\x2b\x04\x47\xa7\xe0\xfd\xd8\x0e\xda"
- "\x32\x37\x08\x30\xb6\xc1\x93\xf5\xd8\x5f\x18\xe3\x66\x63\x3a\xae"
- "\x0b\x15\x6b\xc6\x0e\xa6\xed\x22\xce\x3f\x78\x09\xca\x4c\x67\xcf"
- "\xa1\xb5\x54\x23\x68\x69\xde\x7d\x51\x35\x6d\x57\x89\x31\xb5\x93"
- "\x34\xaa\x2a\xd6\xe2\xb3\x5b\x83\xa3\x0d\x6d\xc1\xd1\x69\xd0\x87"
- "\xd5\x52\x7f\xf1\x59\xd2\x79\xb4\x51\x88\x7d\xdc\xf1\x71\x86\xe7"
- "\x3e\xc2\x5a\xd2\x2f\x5a\x4b\x2d\x38\x86\xc6\xcc\xab\xd0\x97\xa3"
- "\x0f\xe0\x38\xd3\x82\xe8\xa8\xb6\x2c\xfd\x23\xdc\x66\x77\x24\x0a"
- "\x6d\x3f\xb0\x0e\x0c\x67\x76\x98\x8d\x74\x38\xf3\xb3\x01\xbc\xa7"
- "\x3b\xf4\xcc\xd6\x76\x45\x75\x84\xe5\x3f\x9e\xaa\x57\x7b\xa9\xf3"
- "\x1c\x61\xeb\xbf\xf1\x11\x1c\x87\xa3\x2a\x78\xde\x33\x8d\xaa\x23"
- "\x73\xb9\x1d\x8f\x8e\xc3\xe7\xc1\xfb\x59\xe0\x99\xe3\x68\xbe\xa0"
- "\xc1\x7a\x70\x7d\xb5\x78\x3d\xc6\xe9\x7a\x0c\xf4\x79\x8d\x78\x5d"
- "\xb4\x03\xd2\x29\x4e\xd7\xa7\x18\x1e\x41\xbb\xdc\x91\x2a\x7c\x27"
- "\x58\xcb\xc2\x71\x5d\x43\x9b\x3f\xb7\xab\xd3\x70\xb1\xde\x98\x16"
- "\xd5\x91\x0b\xad\xc0\x57\x70\x7d\xa2\xd3\xfd\x13\x0f\xa7\x85\x93"
- "\xe7\xb7\xe1\x98\x1e\xb1\x9a\x7d\xfd\x6c\xdc\x96\x53\xd1\xc6\xc6"
- "\x42\x43\xf5\xce\xed\xc1\x7b\x55\x40\x9b\xfa\x36\x90\xf5\xa0\x4e"
- "\x03\x3e\xd3\x79\xfc\xe3\x93\x93\x17\x25\xeb\x06\xce\xd5\xcd\x5d"
- "\x30\x4b\x37\x67\xd1\x92\x85\x29\xcf\x0e\x9c\xdb\x87\x10\x27\xde"
- "\xd1\xd0\x9c\x40\x2a\x14\x4c\x28\x37\x15\x81\x8c\xa5\xd6\xc0\x7a"
- "\xdb\x49\x0a\x80\xae\xf6\x90\x69\xa5\xf6\xc2\x69\x30\x7f\x9e\xc9"
- "\x37\xa6\x3f\x07\x63\x7f\x74\x2d\xb3\xfb\xeb\x08\x59\x07\xd7\x8d"
- "\xe9\xc7\xf1\xdc\x36\x76\x0e\x46\x92\xd9\xab\xd2\xfd\x49\x85\xee"
- "\x2a\xb3\x79\xc1\xb5\x93\xcc\xbe\x77\x8d\xa8\x6d\x39\xfe\xe4\x8f"
- "\x99\xb5\xea\x83\x82\x59\xfd\x47\xa1\x5e\x8d\xf2\xc2\x61\x6d\x25"
- "\x79\x3a\xcd\x9f\xe0\xf5\x8f\x32\xe1\x3c\x5c\xc7\x6b\xac\x1d\x46"
- "\xeb\xbf\x0e\xc4\x7a\x68\x03\xc3\xdf\x59\x45\xf4\xfc\x61\xad\x85"
- "\x70\xb9\xf5\xe8\x32\xec\xab\xee\x41\xfc\xbe\x70\x74\x05\xf6\xcf"
- "\xac\x3a\x9a\xe1\x53\x0c\xf5\x53\x49\x00\xd4\x4f\x14\xb6\x4c\x28"
- "\x47\x2c\xb0\xe5\x1e\x0d\xa7\x39\x41\x0b\x4b\x36\x11\xff\xe2\x4d"
- "\x30\x37\x37\x11\xdf\xf6\xdc\xbf\x4e\x31\xfb\x3e\x7c\x10\xc7\x16"
- "\x9a\x09\x68\x55\x93\x9f\xc3\xb9\x04\x33\xf9\x4d\x18\x9e\x83\x39"
- "\xd8\xe6\x09\x5b\xae\x83\x7c\x67\x0d\x1b\x14\x2e\x04\x4f\x28\xa3"
- "\x30\x6e\xed\x61\x83\xe2\x02\x0d\xc0\x5b\x30\xc7\x68\xff\x09\x65"
- "\x2d\xaa\x63\x19\x47\x01\x45\x33\x71\x4e\x17\x3e\x93\xff\xee\x75"
- "\x2b\xcc\xed\x69\xa5\xbb\xae\x5b\xa0\x3c\x2d\xbc\x0c\xca\xc7\x8c"
- "\x65\x44\xf7\x12\xca\x4e\x7f\x3d\xf3\x6f\x73\xa9\x6d\x70\x15\xc8"
- "\x99\x4d\xff\x4d\x4e\xd4\x55\x92\x80\xe9\xc4\xc7\x11\xeb\x3d\x85"
- "\xa8\xa3\xcd\x50\x5e\x42\xd4\x35\xa0\xf7\xa3\x6d\x3e\x73\x24\xda"
- "\xe7\xab\x09\xda\xec\xa9\x3a\xa9\x6a\xf7\x55\x2b\x60\x58\x73\x2f"
- "\xf4\xf9\x16\x34\x5b\xfd\xf1\x9e\x99\x6d\xe2\xb7\xae\x56\xf1\x5b"
- "\x57\x2b\xfb\xd6\x55\x9e\x11\xc7\xbf\x75\xe1\x37\xae\xe8\x38\x1f"
- "\x8a\xed\xe1\x77\xaf\xfb\xda\x80\x0f\x16\xeb\xfb\xda\x17\xeb\xfb"
- "\x15\x5d\x25\xc1\x35\x96\x66\x90\xd1\x2a\xc9\x9b\xa9\x24\x98\xb6"
- "\x26\xf4\xae\x32\x1e\x27\x74\xd3\x16\xb2\x37\xd3\xd8\xcb\x8e\x36"
- "\x8a\x56\x6d\x9f\xc0\x95\x2a\xb4\xf3\xf7\x5d\x97\x4c\x86\x6c\xbf"
- "\x4a\xc2\x67\x5e\xc8\x66\x71\x9f\x30\x47\x9f\xad\x55\xaf\xbb\xd1"
- "\xaa\x7f\xac\xa3\x55\xff\x48\xa0\x85\x7f\x1b\x7b\xf5\xb2\x86\xa0"
- "\xbf\x2d\xcd\xfd\xdf\x86\xed\x68\xa3\x6e\xb3\x10\x5b\xd0\x56\x7f"
- "\xe4\x65\x78\x76\x28\x7e\x4f\xc9\x5a\x46\x34\xc2\x17\x7a\x52\x9d"
- "\x70\x95\x3c\x0d\xb4\xc7\x6f\x07\x25\x8d\xfc\xdb\x81\x1d\x74\x1a"
- "\xfc\x7e\x70\xbd\x55\xaf\xa6\xc1\x93\x34\x2f\x26\xea\x48\xc7\xdb"
- "\x83\xc2\x4d\x69\xef\x92\xac\x0e\x7a\xde\xb4\x5a\x20\x68\x57\xa6"
- "\xb9\x7f\xcd\xa6\xfd\x27\x69\x8e\xe8\x4f\xe2\xba\x12\x2e\x63\xc7"
- "\xb1\xf1\xb7\x86\x1d\xc7\x98\xfc\x8c\xdf\xd9\x80\x7e\xa5\xbb\xae"
- "\x22\x3d\x81\xae\x57\x2d\xea\x09\x40\xbb\xea\xa6\xdf\x03\xdd\xea"
- "\x15\x74\x63\x74\x86\x7a\x17\xe7\x02\xbd\x2e\x70\x1a\x56\xb5\x01"
- "\xfd\x0e\x60\x1b\xd1\xfb\x76\xa7\x5a\xd5\xa0\x37\xa9\xab\xac\x67"
- "\xd8\x9e\x15\xa4\xe3\xae\xce\xca\x5e\x1d\xb0\xde\xe0\xf7\xca\xeb"
- "\x3b\x06\xc5\x74\x04\x4f\x58\x73\x23\x78\x42\x51\x37\xdf\x2e\x39"
- "\x3d\x13\x89\x7f\x55\xd3\x49\x4e\xcf\xd7\x44\x7a\xa2\x8f\xdb\x52"
- "\x7d\x5f\x5b\x3b\xd0\xf3\x3a\xd0\x33\xc5\x4c\xde\x48\x26\xc1\xa6"
- "\xe6\x7a\xfc\xae\xd3\x7b\x7c\x35\x21\x13\x06\x53\xa1\xda\x78\x9a"
- "\xd1\x75\x0f\xd0\xd5\x96\xbf\x39\x02\xbf\x67\x3a\xe8\x9a\x0a\x74"
- "\xbd\x0e\x74\xbd\x2c\xd3\xd5\xde\x0e\x74\x6d\x07\xba\xb6\x03\x5d"
- "\xc5\x6f\x9e\xaf\x26\x02\x5d\xf1\xfb\x58\x6e\x79\x1c\x7e\xf3\xc4"
- "\x6f\x4b\x48\x57\xf4\xab\x16\x96\xea\x43\xd9\xb7\xce\x39\x7a\xb2"
- "\x7d\x36\xf1\x7f\xd2\x4a\x54\x59\x07\x88\x06\xfa\xa9\x79\x7c\x3f"
- "\x51\x43\x7b\xc0\xf7\x8d\x04\xe9\x6b\xda\x6f\x27\xcb\x5f\x26\x8f"
- "\xd8\x36\x72\x3a\x9b\x6c\x1f\xa0\x6d\x37\xe2\xfa\x52\xbd\x7a\x6b"
- "\x2a\x89\x44\x9a\x4f\xbc\xa0\x23\x47\x62\xaa\x89\x2b\xcd\x85\x2d"
- "\xd1\x51\x40\xa7\xe1\x48\xf7\x5b\x9f\xb7\xd5\xc3\x6f\x7e\xde\x9e"
- "\xd8\xf2\x7f\xf3\xf6\x76\xcf\xdb\x13\x11\xee\xe7\x6d\xb5\xea\xd6"
- "\xe6\x2d\x7e\x92\xf8\xbf\x79\xfb\xfd\x9f\xb7\x55\x2d\xae\xf3\xd6"
- "\x21\xb7\x24\xc7\x2f\x98\x95\xb8\x30\x71\xe1\xaf\x75\xb3\x97\xa5"
- "\xc4\x2f\xe6\xd2\x8b\x42\x7e\xd1\xdb\x85\x28\xf5\x66\x58\xaf\x4f"
- "\x68\xeb\xc9\xde\x07\xeb\xd5\xc2\x2b\x5a\x5f\x9a\xff\x5e\x8c\x90"
- "\xbf\xbb\x7e\x33\xc8\xe1\x38\xbf\x0b\x40\xc6\xbe\xa8\x3a\x95\xf0"
- "\xd7\x50\x90\x3f\x93\x2f\x11\xfc\xcd\x65\xb7\xa4\x4a\xdc\xe7\x58"
- "\x54\x48\x9b\x71\x9f\xe3\xb1\x0a\x94\x2d\x4c\x3b\xef\x8d\x05\x1d"
- "\xe2\x15\x2d\xe9\x78\x25\x56\xfd\xdb\xd3\xc4\x3f\xb0\x9e\x4c\x14"
- "\x04\x4a\x8d\x99\x97\x40\xee\xfb\x6c\x9f\x71\xda\x25\x82\xb2\xce"
- "\x45\xd5\xc9\x20\x5d\xfa\x4a\x38\xd6\x5d\xd3\xa5\xe7\x9e\x83\xe3"
- "\x07\xcc\xd6\x12\x42\x9b\x69\xe1\x04\x62\x7f\x67\x70\x36\x7e\xdf"
- "\xdc\x1e\x42\x9b\xf6\x80\x9e\xb1\xa7\xd3\xaa\x5e\x75\x15\xf8\x26"
- "\xe7\x51\x8a\xdf\x29\x71\x0c\x56\x25\xc3\xd8\x83\xa4\xc9\x65\xd3"
- "\xba\xfe\x38\xbf\x40\xbe\x6a\x3a\x74\xb1\x5e\x8d\xdf\x69\x71\xce"
- "\xb5\x69\x04\xcd\x6a\x78\x17\xe8\xa7\x79\x6b\x21\x6d\xb0\xf4\x9f"
- "\x50\xee\xab\x23\xea\xf6\xdc\xda\x50\x90\x7b\xc6\xa1\xcc\xb2\x06"
- "\xae\xad\x85\x6b\xfc\x9b\xe1\xdf\x6a\xa9\x5f\x4d\x33\xe2\x1c\xf0"
- "\xb5\xea\x8a\xaa\x36\x11\x63\x3d\xad\xe3\x7a\x49\xb3\x75\xcb\x84"
- "\x22\xdb\xdb\x83\x62\x6c\x28\x53\x0e\x1c\x14\xd7\xb1\x65\xc2\x1a"
- "\xdb\x96\x09\x65\x53\x07\xb3\x6f\xe3\x50\xff\x53\x66\x53\xea\x28"
- "\x78\x26\x1f\xea\xb7\xb5\x06\x4f\x2b\x6d\x2d\x98\x16\x7e\x3c\xad"
- "\x88\xe8\x26\x23\xfe\xd5\x42\x0b\xd4\xf6\x44\x0c\xe0\x5f\xd1\xbb"
- "\xe4\xc4\x44\xc0\xbf\xd8\xae\xf8\xc7\x7d\x09\xec\x84\xe3\x60\x35"
- "\x81\xb6\x9a\x70\x1e\xa1\x9c\xba\x1b\xc6\x02\xe7\x08\xce\x05\x86"
- "\x87\x80\x85\xd2\x7c\xc1\xb9\x84\x78\xc7\xe6\xae\xcb\xdc\xc1\xf9"
- "\x72\xaf\x85\x68\x70\xbe\x20\x1e\xe2\x7c\x41\x1f\x9d\xcd\xe2\x7c"
- "\x09\x6c\x20\x9a\x37\x00\x0b\x4d\xb6\x4a\x36\x67\x50\x9e\xac\xb2"
- "\x39\xe1\x20\x7e\xdf\x71\x9a\x2f\xeb\xa5\xf9\x22\xe1\x20\xcc\x09"
- "\x1b\xce\x97\xa5\xfa\xc7\x3a\x97\xca\xf3\xe5\x95\x33\x1a\xc2\x30"
- "\x32\xf7\x7f\xe3\x8a\x61\xbe\xd4\x18\x2c\xc4\x2e\xe1\x20\xcc\x17"
- "\xdc\x43\xc4\x70\xf0\x37\x80\x83\x2d\x80\x83\x16\x38\x0f\xf3\xa4"
- "\x64\xbe\x88\x83\xe2\xfc\xe8\x58\x2a\xe2\xe0\x65\x1d\xe9\x1c\x88"
- "\x38\xf8\x86\x07\xf9\xe5\x8c\x0b\x0e\x7e\xda\xfb\xd6\x70\xf0\x53"
- "\xf6\x9d\x1f\x69\xd8\x09\xf4\x44\x3a\x4e\xd0\x52\x5b\x55\x11\xe0"
- "\xdf\x94\xef\x19\xdd\x92\xdd\xd3\x6d\x8f\xb8\x7e\xb9\xc5\x39\x37"
- "\x74\x03\x3e\x6f\xb1\xb5\x77\xa5\x1d\xcd\xfd\xa0\xcc\x19\xeb\x10"
- "\xe3\x10\xef\x10\xe7\x10\xf3\x70\x7e\x20\xd6\x21\xce\x0d\x82\x35"
- "\x00\xca\xcd\xd5\x09\x8d\x0c\x03\xb3\x2e\x10\x4d\xd6\x58\xf2\x88"
- "\xa9\xdc\x0e\xfa\xcd\x35\x82\x18\xe8\xbc\xbe\x21\xe6\x21\x6d\xb7"
- "\x5e\xe7\x98\x87\xeb\x1c\xe2\x5b\x97\x75\x0e\x68\x6b\x56\x7d\xd2"
- "\x86\xeb\x1c\xb3\x55\xe4\xdc\xff\x8b\xed\xfd\xb8\x5e\x52\xd0\x8f"
- "\xf8\xb7\xe7\xfe\xcd\xd2\x55\x37\xa9\xf3\x95\x74\x13\x9c\xe3\x38"
- "\xd7\xcd\xaa\x5a\xe6\xaf\x68\x7c\x70\x14\x62\x16\xff\x06\x52\xf0"
- "\x0b\x33\xd7\x8f\x4e\x3f\xc0\xca\xc1\x93\xf5\xb2\xfe\x5f\x37\x89"
- "\x7f\xcb\x07\x7d\xbf\xff\xa8\x66\xba\x51\xd0\xe2\x18\xe3\x3b\xcf"
- "\x1c\x0c\x3c\xba\x25\xda\xb0\x01\xc7\x6d\x4b\x74\x0a\xfc\x4e\x93"
- "\xf9\xae\x6e\xe5\x91\x34\x42\xa6\xa6\x79\xcb\x77\x75\xcc\x97\x86"
- "\x7e\x1e\x7b\x3f\x7d\x25\xd6\x57\xf8\x3c\xb6\x17\xf0\x88\x76\x91"
- "\x3d\x9b\x5c\xcf\x4f\x32\x66\xd9\x68\xb3\x2e\x9d\x3c\x01\xfd\x3a"
- "\x7f\xcc\x46\xc8\xb1\x36\x42\x4c\x13\x93\x80\xde\x49\x51\x7b\x05"
- "\x8b\xaf\x59\x65\x2a\x03\xfd\xb1\x19\xb0\xd8\xd7\x19\x8b\x39\xee"
- "\x9a\xd8\x37\x03\x6b\x7e\x52\x2d\xb6\x15\x5d\x49\x02\x61\x3d\xf6"
- "\xbd\xa8\xfa\x6c\xe5\xb2\x15\x04\xf7\xbf\xf6\x82\xdf\x2f\x76\xf6"
- "\x8b\x8c\x82\xfb\xfb\xd2\xcf\xa7\xa8\x0c\x2f\x90\x47\xe8\x2b\x53"
- "\x54\xe8\xbb\xb0\x53\x28\x55\x0b\x70\x8e\xfb\x42\x95\x12\xbc\xbe"
- "\xae\xd3\x97\xc9\x69\x02\xd4\xa9\x69\x2b\x25\xeb\x52\xfd\x09\xd6"
- "\xe7\xfe\x75\xa5\x04\xeb\xaf\x4f\xd6\x30\xdf\x07\x76\x9f\xad\x94"
- "\xe0\xbd\x76\x38\xff\x3b\x21\x80\xe4\xa5\x07\x93\x63\x55\x35\xac"
- "\x8d\x63\x55\x47\x09\xb6\x01\x73\x01\x7e\x1f\x22\x1b\x52\xb5\x80"
- "\x09\xa5\x70\xfd\x33\xb2\xe1\x4a\x28\x1c\x2f\xc2\xff\x75\x72\x49"
- "\x75\xd2\x72\xac\x4a\x20\x81\x2b\x7f\x4e\x81\xa7\xa9\x09\xf7\x54"
- "\x66\x12\x3f\x58\x57\x3a\x4c\xf5\xf9\xa0\xd3\xd6\x99\x71\xcf\x3d"
- "\xcd\x7a\xa5\x45\xa0\xaf\x5c\x16\xb2\x5e\xb9\x82\xcf\xb6\xd3\x57"
- "\xbe\xc6\x67\xaf\x4f\xd7\x89\xfe\xb6\xa5\xcc\x37\x70\xdd\xf5\x30"
- "\x82\x7d\xc5\xe7\xe2\xf3\x36\x24\xeb\xc5\x67\x0e\x61\x7d\xc3\x67"
- "\x62\x9b\xce\xcf\xc4\x7c\xf6\xba\x5f\xe2\x33\x3f\x5b\x00\xc7\x20"
- "\xa0\x47\x13\xd2\x01\x9f\x2f\xd0\xd8\x5e\x34\x2b\xd6\x87\xdd\x63"
- "\x6d\x76\x77\xcf\x5b\xe2\x3d\xcc\x16\x89\xf7\x74\x50\x56\x9f\xb5"
- "\x01\x6b\xe5\x87\x78\xfe\x47\xb1\x46\xd2\x95\x86\x7f\x7f\x99\xaf"
- "\x9d\x7f\x1f\xcc\xd7\x4e\x4e\x53\xc6\x2b\xaf\xc4\xf6\x02\xba\x69"
- "\x70\x9d\x6d\x54\xfd\x5d\xe5\x68\xe3\xf3\x58\x1f\xa4\x37\xf2\x8d"
- "\xc4\x4b\xc8\x47\x12\x0f\xb1\x7e\x5a\x08\x71\xe6\x19\xf8\xed\x2f"
- "\xb6\x33\x5e\x6a\x07\xfa\x40\x24\x3e\xfa\x11\x5c\xef\xca\x47\xa7"
- "\x06\xc8\x7c\x54\xff\xb1\x35\x93\x52\xe4\x23\xe3\xb4\x1c\x6c\x67"
- "\xa3\xdc\x9f\x29\x2a\xe4\xb1\x7f\x32\xde\xb2\x20\x9d\x7e\x94\x41"
- "\x82\xf9\xfb\xd4\xb3\x5c\x78\x3f\xca\x30\x06\x63\x5f\xa5\xf7\xc0"
- "\x3e\xe4\x09\x3a\x22\xbd\xc7\x86\xce\x30\x68\xf7\x0a\x11\xef\xd9"
- "\x82\x6d\x4b\x63\x00\x34\x23\xd2\x3d\x52\xfd\x3c\x41\x0f\xfd\x1e"
- "\xc2\xee\xe1\x3c\x77\xd1\x0d\xff\xd4\x9f\x77\xe5\xb9\x7b\x33\x08"
- "\x08\xc4\x20\x6b\x4d\xbb\x8a\xcf\xb1\xf3\xbe\x7d\x64\xef\xf8\x3c"
- "\x16\xe9\xaa\xe6\xe7\x4f\xf5\x77\xe2\x09\xb1\x7d\xab\x9b\xf6\x4f"
- "\x8d\x56\xb4\x1f\x0b\xed\xa7\x41\xfb\x28\xcb\x4d\x43\x1b\xde\x29"
- "\x96\x3f\xe7\x47\x69\xbc\x7d\x89\x6f\x69\xfe\x48\x62\x48\x47\xff"
- "\xd4\xd3\xa2\xcf\x9f\x89\x61\x27\xf3\x8b\x52\x0b\xa5\x82\x8b\x5f"
- "\x94\xb3\xdf\xdc\xde\x4c\x8b\xe8\x13\x75\x8a\xf9\xb6\xa2\xad\x0c"
- "\x65\xd2\xdd\x20\xcf\xc9\x7e\x51\xa7\xf1\xfa\x65\x63\x6a\xa3\x93"
- "\x5f\xd4\x29\x23\xd6\x37\xab\x4e\x6b\xdb\xd5\x44\x0d\xe5\x3a\x7e"
- "\xde\x14\xe3\x7c\x5e\xf6\x3b\xe4\xe7\xd1\xa7\x5b\xb4\x1b\xb7\x1c"
- "\x2e\x47\xbb\xe1\xe9\x70\xc9\x56\xeb\x41\x17\xf6\x42\x66\x6e\xda"
- "\x2f\xcb\xcc\x4d\xfb\x3d\xcb\xcc\xa7\xcf\x74\x2f\x33\x9f\xb7\xc9"
- "\x32\xb3\xf9\x55\x3e\xef\xcd\xa3\xf9\xbc\x37\xb3\xf9\x9d\x07\xed"
- "\xd9\x7e\x1f\x9f\x4f\xdf\xd1\xeb\x90\xcf\x4b\x40\x06\xde\x9b\x5a"
- "\xa9\xde\x0d\x7a\xb7\x5d\xfd\x28\x5d\x05\x63\x87\xf1\xe0\x56\xa5"
- "\xc3\xfa\x6d\xab\x23\x35\xbe\x28\x33\xa3\x7f\xd9\xb9\x59\x35\x2d"
- "\x56\x02\xeb\x9c\x85\x8f\xcb\xe7\x23\x81\x16\x3e\x26\xab\x95\xb0"
- "\x7a\x70\x0d\xd6\xb5\x26\x94\x99\x0f\x09\x95\xea\x12\x18\x53\xf8"
- "\xf7\x6d\x0b\x8e\x8f\x73\x96\xa9\xdb\x73\x3f\x4f\x70\x2f\x4b\x9f"
- "\x0b\xb5\xe5\x3a\xcb\xd2\x9f\x7f\x80\xb2\x34\xda\xf7\x51\x3e\x10"
- "\xb8\x0c\x1d\x03\xf2\x74\x1c\xca\xd5\x28\x4b\x0b\x0a\x59\xfa\xcc"
- "\xda\xee\x65\xe9\xcf\xcf\xff\x9f\x2c\x7d\xa7\x64\x69\xc9\xa6\xe0"
- "\x2a\x4b\x9f\x99\x7a\x6b\xb2\xf4\x99\x29\xff\x27\x4b\x7f\xdf\x64"
- "\xe9\x33\x51\x92\x2c\x2d\xe4\xdc\x3f\x0c\x6d\xfc\x25\x0e\x59\xfa"
- "\x5c\x64\x57\x59\xfa\x5c\x4c\x57\x59\xfa\xf3\x0c\x59\x96\xfe\x3c"
- "\x54\x29\x4b\x5f\x88\xef\x2a\x4b\x9f\xdb\xe6\x49\x96\x06\x1c\x6b"
- "\x41\x59\x1a\x79\x0d\xe5\x6a\x94\xa7\xa1\xef\x69\x9c\xef\xce\x55"
- "\xdf\x9a\x2c\x7d\xae\xea\xe6\x64\x69\xf3\x93\xee\x65\xe9\xd3\x0d"
- "\x9e\x65\xe9\xd3\x0d\xee\x65\xe9\xf3\xd5\xb2\x0c\x74\x7e\xeb\xf7"
- "\x5f\x96\x3e\x1f\xe9\x5e\xde\x39\x3f\x96\xcb\xd2\xe6\x21\xb7\x5f"
- "\x96\x36\x0f\x71\x2f\x4b\x9f\x3f\xc0\xe5\x0e\x73\x78\x57\x59\x1a"
- "\xee\x71\x2b\x4b\x9f\xbf\x2c\xde\x33\x44\x29\x4b\xf3\x36\x1a\x55"
- "\x8d\xbd\x3d\xcb\xd2\x8d\x6f\xf3\x35\xb5\x71\x09\x5f\x53\x39\x4d"
- "\xbb\xca\xd2\x8d\x2f\xf6\x2c\x4b\x73\x1e\x62\xfd\xf4\x28\x4b\x37"
- "\x6e\xe9\x2a\x4b\x9f\x6e\x70\x2f\x4b\x37\x2d\x90\xf9\xa8\xe9\x3e"
- "\xa5\x2c\xdd\x78\xe6\x9f\x43\x96\xf6\xc8\x5b\x91\x4a\x59\xfa\x8b"
- "\xdd\xde\xcb\xd2\x5f\x9c\xf7\x4e\x96\x46\x9e\x73\x27\x4b\x37\x3d"
- "\xe9\xca\x73\x4a\x59\xba\x69\xbc\x7b\x59\xba\x69\x96\x52\x96\xc6"
- "\xf6\xdd\xc9\xd2\x4d\xeb\x15\xed\x77\x91\xa5\x9b\x76\x2a\x65\x69"
- "\x5e\x4f\x96\xa5\x2f\xc4\x88\xb6\x89\xd7\xbd\x97\xa5\x2f\x0c\xed"
- "\x5e\x96\xbe\x30\x52\x29\x4b\x5f\x08\xe0\x32\xf3\x85\xb9\x5c\x96"
- "\xbe\xa0\xe3\xe7\x4f\xaf\x76\x3e\x2f\xcb\xd2\xfc\x7c\x57\x59\xfa"
- "\x42\x46\x0f\xb2\x74\xd4\xcd\xcb\xd2\x96\x83\x95\x0e\x59\xda\x72"
- "\x50\x92\xa5\x31\x9f\x51\x31\xc8\xa7\xc5\x4c\x9e\x3e\x4e\x8e\x35"
- "\x61\x7f\x2e\x3e\xd9\xbd\x3c\x7d\xb9\x45\x96\xa7\x5b\x9e\xe5\x73"
- "\xbf\x65\x00\x9f\xfb\x5f\x9d\x77\xd8\xa0\x41\x96\x46\x99\x5a\xb4"
- "\x41\xd7\xad\x83\xff\xbd\xe9\x95\x4c\x9e\x46\x5f\x7d\x94\xa9\x51"
- "\x9e\x46\xb9\x1a\x65\xe5\x6a\x18\x85\x1a\x8b\x15\xfd\x57\x6a\x8d"
- "\x8f\xe0\xb8\x7e\x55\x0d\x72\xb8\x19\xd6\xb6\x5a\xb8\xd7\xbc\xf7"
- "\xaa\x15\xf7\x7d\x34\xe4\x35\xc2\x3d\x66\x7e\x0f\x5c\xaf\xc7\x7b"
- "\xa0\x4e\x03\xa7\xc5\x57\x83\xf9\xfa\x29\xc9\xe3\x17\x8f\x29\xe4"
- "\x71\x5e\xb7\x4e\x92\xc7\xb7\x41\x1f\xe0\xdf\x17\x65\x71\x94\xc9"
- "\x41\x16\xaf\xda\x56\x48\x2b\x4b\x42\x68\x45\x7b\xee\x45\x9b\x24"
- "\x93\xff\x3f\xf6\xbe\x3f\x2e\x8a\xe3\xfc\x7f\xd8\x3b\xf4\x34\x28"
- "\x87\x05\x83\x7e\xd5\x9e\x06\xe2\x91\x68\xd5\x44\xc3\x1d\xd5\xc6"
- "\xa4\x5a\x7f\x54\x05\x53\x4d\xd1\x68\x44\x83\x14\x14\x15\x15\x0d"
- "\x1a\x04\x34\x9a\xa2\x51\x04\x03\x7e\x30\x82\x92\x7e\x48\xa2\x8d"
- "\x18\x4d\x4d\xaa\xad\x26\x98\x68\x3f\x68\xf8\x65\xaa\x2d\xa6\x98"
- "\x9c\x16\x0d\x1a\xd4\x53\x51\x0e\xb8\xbb\xfd\x3e\xb3\xb3\xc7\xee"
- "\xde\xed\x1e\xb7\x77\x48\xd1\xfa\xc7\xbd\xc4\xdd\xd9\xd9\xd9\xe7"
- "\x79\xcf\x33\xef\xf7\xb3\x33\xb3\x5b\xe0\x58\x06\x1c\x83\x76\x54"
- "\x9e\x28\x40\xe8\xd8\xed\x62\xcc\x29\x0c\xf9\x57\x90\x12\x7c\x56"
- "\xf5\x26\xdc\x1f\x5f\xdf\xf0\xd6\x0f\x43\x6d\xd7\xc0\xf8\x5e\x4a"
- "\x38\xfc\xb5\x5a\xab\x20\x1f\xfe\xc3\x9a\x16\x0e\x0f\x76\xc2\xf9"
- "\x76\xfc\x9d\x30\x86\xc7\x07\x0f\x8c\x32\xdb\x78\x7c\x00\x9f\xc7"
- "\x5f\x9d\x6a\xe3\xf1\x78\xbd\x55\x0b\x8f\x4f\xb4\xf1\xf8\x1f\xf6"
- "\xba\xc9\xe3\xcf\x76\x14\x1e\xef\xe3\xe5\xa5\xf4\x89\x22\x3c\x3e"
- "\x6f\x65\xdb\xf0\x78\xcc\xe1\x31\x6f\xc7\x1c\x1e\x73\x7a\xcc\xe3"
- "\x31\xa7\xb7\xb2\x3c\x7e\x97\x1d\x8f\xb7\x02\x67\xb7\xe7\xf1\x98"
- "\xdb\xdb\x78\xbc\x55\xc0\xe3\xaf\xf6\x75\x8f\xc7\x5f\xed\xd3\x06"
- "\x3c\xbe\x7d\xfc\xd6\x81\x78\xbc\xd6\x8e\xc7\x63\xde\x0e\x7d\xb2"
- "\x06\xf3\xf9\x8a\x62\xb0\xcd\x52\xe0\xf4\xc0\xe7\xdd\xe7\xf2\x57"
- "\x55\x7c\x2e\xbf\xab\x07\x9f\xcb\xff\xa8\x72\xe4\xf2\x3f\xf6\xe1"
- "\x71\xf9\x52\x83\xd7\x0f\xa3\x99\x71\x02\xe2\x41\xf1\x3c\xcc\xd3"
- "\xaf\xec\x13\x72\xf9\x5b\x8b\x1c\xb9\xfc\x8f\x71\xa2\x5c\x9e\xe8"
- "\x7b\x21\x97\x0f\x08\x4f\x34\xb7\x70\xf9\x1f\x77\xb8\xc7\xe5\x7f"
- "\xcc\xe5\xb4\xc6\x95\x24\x32\x1e\xfd\xa8\x93\xe2\xf7\x0d\x6a\x3e"
- "\xbf\xaf\xeb\xc6\xf1\xfb\x44\x1e\xbf\xbf\x32\x48\x9a\xdf\x5f\x21"
- "\x7b\x5b\xaa\xe3\x2b\x71\x5d\x98\x97\x41\x6c\xad\xd1\x2c\xc3\xdc"
- "\xec\xfa\x31\xcc\xcd\x20\x9e\xd5\xe0\x39\xe3\xf0\xff\x8d\x36\x9e"
- "\xcf\xe8\x54\xcc\xf5\x57\x77\x44\x3e\x76\x5d\x2b\xce\xc7\xae\x8f"
- "\xc0\xbc\x87\xac\xc7\xad\xf3\x01\x9b\xd4\xb4\x2d\xdf\xaf\xf3\x11"
- "\xe7\xfb\xd7\xf7\x12\x6e\x54\xa7\xc6\x7e\x11\xf2\x7d\xb8\x46\x94"
- "\xef\x5f\xbf\xc0\x5e\xe3\x23\xe4\xfb\xa4\x0e\x18\xe3\x1b\xa5\xf9"
- "\xfe\x8d\x1c\x32\xe6\xdf\x98\x4f\xc6\x7c\xe2\x63\x47\xbe\x7f\x63"
- "\x14\x9f\xef\x63\xff\x3b\xf2\x7d\x82\x29\xa6\x9d\x92\x7c\xff\xc6"
- "\x06\x47\xbe\x7f\x65\x10\xe6\xfb\x66\x1e\xae\xf2\x30\xae\xe6\x61"
- "\x5c\x19\x57\x60\x5c\xe1\x71\x55\x13\x83\x71\x65\x0c\x30\x59\x6d"
- "\xbc\x7f\x13\xae\xef\x9c\x3d\xef\xc7\x71\xc4\x19\xce\x12\x96\xa1"
- "\x7e\x18\x6b\x18\x67\x36\xbf\xe1\xf2\x18\x6f\xf7\x17\x6b\x37\xb3"
- "\xc5\xb1\x76\xf3\x3d\xc6\xcf\x2c\xd6\x70\xbe\x92\xe8\x00\xfc\x7c"
- "\x37\x3f\x95\xa7\x03\x98\x6b\xae\xca\xd3\x01\x18\x8b\x62\x3a\xc0"
- "\x38\xc2\x1e\x8b\x42\x1d\x60\x9c\x2a\xae\x03\x8c\x71\x42\x1d\x80"
- "\xeb\x17\xd3\x01\xc6\x1c\x41\xfd\x0e\x3a\xc0\x78\x50\xa8\x03\x48"
- "\x39\x4e\x07\xdc\x8a\x64\xf3\x2a\x67\xe4\xeb\x80\x5b\x7a\x36\xbe"
- "\x13\x1d\x70\xc9\x5e\x07\xdc\x7a\x41\xa8\x03\x6e\xf9\x93\xf8\x7a"
- "\x2b\xde\xc4\xe8\x80\x5b\x5a\x56\x1f\x54\xf2\x8f\x73\x3a\x80\x1c"
- "\x37\xf1\x75\x40\x31\xd6\x01\xb7\xd6\xb7\xa2\x03\x22\x5c\xd7\x01"
- "\x96\xe1\x9c\x0e\xb0\x0c\x77\xae\x03\x6e\x8f\x70\xae\x03\x9a\x12"
- "\x38\x1d\x60\x3a\x4e\x62\x82\xe9\x7d\x12\x13\x4c\x4c\xde\x0a\xfa"
- "\x15\x97\x57\x5f\xca\xcc\x3f\x2f\xd9\x7f\xbb\x84\xfa\x78\x19\x9b"
- "\x57\xbf\x07\x1a\x60\x25\xf0\xf9\x7a\xc2\xe7\x21\x66\x9e\xc0\x3a"
- "\x00\xf3\x75\xa2\x01\x4c\x53\xe1\x98\x01\x6c\x7e\x02\xea\x32\xec"
- "\x5b\x5d\x4c\xe1\xb9\x61\xb8\x2c\xf4\xf7\xaa\xcd\x30\x8e\xc0\xf1"
- "\x2a\x28\x53\x8c\xaf\x81\x63\x67\x8b\x97\x31\xd7\x8d\xc2\x5a\x01"
- "\xae\x2b\x86\xf3\xd5\x76\xd7\x55\xe2\xeb\xca\x93\x18\x2d\x50\x49"
- "\x7c\xd7\x90\x0f\xc7\x4b\x39\xdd\x70\xc7\x8b\xd1\x0d\xf5\xac\x6e"
- "\x80\xb2\x50\x57\x09\xa3\x1b\xe6\x81\x6e\x80\x76\xc3\x8f\xaf\x1b"
- "\x8e\x82\x6e\x38\x0c\x3a\xe7\x50\xc3\x5b\x77\x86\xf3\x74\xc3\x61"
- "\xac\x13\xb0\x66\xc0\x5a\x01\xc6\xb5\x43\x58\x47\x1c\x6b\x32\x50"
- "\xe0\xe3\xb3\xa0\x1b\xaa\xf0\xf5\xbc\x6b\x13\xf8\xd7\xe2\xf2\xd0"
- "\xc6\x62\x46\x73\x00\xcf\x83\x36\x54\xe7\x5f\x62\x34\x47\x29\x5c"
- "\x5b\x49\x34\xc7\x9d\x42\x9e\xe6\x38\x4a\x34\x47\xc3\x2c\xe1\x7b"
- "\x83\x3b\xb7\xe4\x6b\x8e\xbb\x27\x9d\xbf\x3b\xa8\xef\x2b\x47\x73"
- "\xc0\x73\x97\xd8\xf8\xab\xc3\x3c\x44\x3c\x07\x1f\x38\x2c\xe6\xab"
- "\x4e\xe7\xad\xb1\x5c\x16\x73\x57\xcc\x5b\x31\x7f\x75\x49\x73\x40"
- "\xfb\x4b\x4d\x6d\xf8\xee\xa0\x13\x68\x8e\x95\xd2\x9a\x83\xaf\x37"
- "\xb0\xfe\xc0\x9a\x03\xfa\x18\xa3\x39\xf2\xd6\xd9\x69\x8e\x4e\xad"
- "\x68\x0e\x2f\xbe\xe6\xb8\x9b\xe5\x9e\xe6\xb8\x9b\xd9\x06\x9a\xa3"
- "\xe4\x91\xe6\x68\x6b\xcd\x71\x37\xb9\x45\x73\x50\xec\xfb\x83\x1e"
- "\x36\xcd\xd1\x90\xec\xa8\x39\x1a\x32\x79\x9a\xe3\xa8\xc1\xeb\x0e"
- "\xf3\x5e\x94\xe8\x8d\xdb\x35\x42\xbd\x61\xb9\xec\xa8\x37\x1a\xce"
- "\xbb\xa7\x37\x4c\x5d\xdc\xd3\x1b\x26\x15\x69\x1f\x7e\x57\x7a\xfb"
- "\x10\x19\xf7\x1a\xf6\x70\x1a\xe4\x76\x32\xff\x58\xeb\x1a\xc4\x94"
- "\x25\xae\x41\x6e\x0f\x97\xd6\x20\xb7\x87\x4b\x6b\x90\xa6\x17\x30"
- "\x57\xc4\x7a\x03\xea\x07\xae\xd8\xd4\x8d\xff\xae\x61\x73\x2b\xbc"
- "\xd0\x5e\x7f\x24\xcc\x23\x7a\xe5\xfe\xf3\xc2\xc6\x7d\xe2\xbc\xb0"
- "\xf1\x08\xe6\x5c\x66\x86\x17\x9a\x32\xf3\xda\x5c\x83\x98\x32\xc5"
- "\x35\x48\x13\x9b\xff\x35\x65\x3b\x6a\x10\xb8\x46\x54\x83\x34\xcd"
- "\x65\xaf\xc9\x14\x6a\x10\x52\x07\xf0\x8b\x35\xd2\x1a\xa4\xb9\x17"
- "\xe1\x1b\x4d\x57\x09\xdf\x20\x3e\x76\xd4\x20\x4d\xc7\x5b\xd7\x20"
- "\x04\x53\x4c\x3b\x25\x35\x48\x73\xcb\xfb\x0f\x4e\x83\xdc\x1e\x8e"
- "\x35\x88\x38\xae\xcc\xd7\x85\xb8\x32\x6f\x11\x6a\x90\xe6\x19\xf6"
- "\x1a\xe4\x01\xc4\xda\x3e\xee\xfd\x03\x7e\x26\xf3\x60\xf9\xba\xc3"
- "\x3c\x57\x9e\xee\xc0\xf8\x13\xd3\x1d\xe6\x22\x7b\xfc\x09\x75\x87"
- "\xf9\x94\xb8\xee\x30\x5f\x14\xea\x0e\x5c\xbf\x98\xee\xb0\x74\x13"
- "\xd4\xef\xa0\x3b\x2c\x21\x42\xdd\x41\xca\x71\xba\xc3\x52\xc9\xe6"
- "\x80\xce\xcb\xd7\x1d\x96\x83\xce\x75\x87\xe5\x88\x50\x77\x58\x36"
- "\x93\x98\x6a\xa9\x21\xba\xc3\x52\xc0\xea\x91\x2a\xfe\x71\x4e\x77"
- "\x90\xe3\x8e\xba\xc3\x62\x6e\x45\x77\xf8\x98\x0b\x07\x46\x34\x05"
- "\x0d\x8c\x6a\xca\x9e\x99\xf6\x74\xcd\x4f\x2d\x2d\xdf\x5f\x88\x02"
- "\x0e\x51\x0d\x9c\x62\x2e\xa2\xf0\x1e\x06\x29\x67\x80\x2b\xcc\x25"
- "\xeb\x18\x30\x5f\xd8\xbf\x12\xf3\xbe\x62\x6f\xb0\x29\x6a\xf6\x0f"
- "\x1d\x6a\x1e\x14\x96\x80\x79\x43\x63\xe1\xc0\xa1\xa6\xec\x89\xe9"
- "\x8d\x78\x0d\x43\x3c\xa2\xe6\xd4\x89\x73\xc1\x37\xaa\x69\x2b\x60"
- "\x5e\x15\x3e\x8b\xf0\xc0\xb2\xd8\xcb\x0c\x8e\x31\x97\x78\x17\xb8"
- "\x44\x45\x7d\x15\xc3\x2d\x7c\xa2\x34\x28\x2f\x05\xf9\x77\xab\x43"
- "\xea\x6e\x5e\x5e\x9d\x7e\x0d\xbd\xce\x02\xbc\x62\x6c\x08\x6d\x7d"
- "\xaa\x46\x83\xf7\x2c\xea\x4e\xb8\xc5\x61\x6f\x33\xcb\x2d\xde\xbe"
- "\x87\x06\xe5\xe3\xfc\x73\x19\xe1\x14\xf8\x5b\x0d\x8d\x84\x53\xf4"
- "\x6b\x6a\xd0\x0e\x68\x59\xc3\xd0\xb2\x36\x85\x5b\xc3\xd0\x9c\xc5"
- "\xf1\x09\xcc\x25\xe8\x39\xc0\x05\x4d\x64\xfe\xc8\xea\xa9\x64\x0d"
- "\xc3\xa0\x1a\x44\xed\x7e\x15\xa9\x4a\xa3\x2e\xe1\x5c\x51\x60\x69"
- "\xcd\xfb\x68\xd5\x04\xd4\xcf\x8c\xf9\x03\x70\xc3\xd2\x9a\x1c\x84"
- "\xf7\x63\xcc\x03\x1e\x91\xcb\x72\x88\x49\x73\x25\x38\x04\x8c\xd5"
- "\x98\x47\x90\x31\x9a\x2e\x3a\xa9\x3d\x89\xe4\x73\x43\x5a\xf2\xfb"
- "\xa7\xcc\x1c\xe1\x42\xd0\x07\x41\x03\x87\x5a\xfc\x67\xa6\x91\xfd"
- "\x39\xc3\x0f\x58\xff\x10\x53\x80\xf7\x5d\xfc\xe8\x52\xad\x17\xde"
- "\x6b\x1c\x7f\x77\xd3\xba\x2f\x2c\x41\xb0\xee\xa4\x99\xf5\x59\x33"
- "\xf1\x19\xe6\x84\xb3\xeb\x10\x3d\xc7\x4c\x21\x38\xd7\x9d\x59\x77"
- "\x62\x32\x20\xee\xfb\x9b\x81\x68\x97\x95\xec\x71\x69\x7d\x23\xb6"
- "\x8b\x15\xfc\x42\xaf\xa3\x50\xd1\x3d\x13\xc3\xfb\x36\xe3\x6f\x72"
- "\xae\xf5\xea\x86\x79\x1f\x60\xbf\xeb\xee\x26\xf0\xd1\x45\xe2\x23"
- "\x7a\x9d\x8a\xf9\xd7\xfc\x86\x56\x03\x75\x0f\x68\x6e\x06\xde\xc7"
- "\x7e\xbf\xd3\xb6\xdf\x2f\xb3\x86\xa8\x09\xaf\x21\xaa\x42\xe6\x2c"
- "\xb2\x87\x22\xe0\xc2\x0b\xef\x3d\x02\x6d\xe8\xc3\xac\x1d\x6a\xd6"
- "\x62\x1c\xa9\x77\x5d\xc1\xeb\x9d\xbe\x65\xfc\x63\x61\xfd\x82\xbf"
- "\xe3\x69\xe3\x73\xe5\x7b\xce\x91\xf5\xa3\x76\xbe\x68\x7e\x9f\xf0"
- "\x76\x66\x3d\xcf\x5b\x56\x35\x9e\xf7\x73\x83\xf2\x1a\x7b\x32\x11"
- "\xb8\x53\xa2\x4c\xbf\x50\x5e\x63\x3a\x86\x5f\xd4\x0f\x99\x5f\xe8"
- "\x7a\xe2\x17\xea\x82\x7b\x7e\xa1\x9c\xaf\xff\x6f\x37\xbf\xa8\x1e"
- "\x2e\xbf\x6c\xf2\xda\x4c\xfc\xa2\x5c\xe1\x9e\x5f\x94\x89\xce\xfc"
- "\x82\x73\x64\xb6\xfc\x98\x2d\x37\x86\xc7\x53\x46\x17\x51\x3e\xe3"
- "\x5b\xe6\x9a\xc2\xdf\xfc\xb9\xa6\x5f\x9f\xc0\xfb\x06\x6c\x42\xa7"
- "\xa1\x37\x5e\xa1\xbc\x27\x38\xcd\x89\x51\x5d\x32\x5b\x72\x62\x54"
- "\xe7\x5b\x0c\x47\xa5\x3a\x9f\x63\x38\x2a\xd5\x99\x99\xb7\xb2\xe6"
- "\x02\xa2\xcc\x4f\x86\xa4\xed\x5f\x5c\x4c\xe1\x75\x5a\xfb\x6f\x98"
- "\xa8\xcd\xb7\x81\x73\x52\x3f\xa5\x71\x8e\x6a\xcb\x32\xd0\x36\xc0"
- "\x03\x12\x62\xd0\x4f\xaf\x51\x9d\xbb\xe1\x3d\xe0\x3e\xbf\x51\x4c"
- "\x65\xe2\x32\x03\x62\x0a\xf6\xf5\x36\x7a\xe1\x71\x74\xff\x62\x13"
- "\x65\xc3\x92\x6d\xfd\x26\xd8\x33\xea\xce\xfb\x03\x23\xf0\x5c\xd0"
- "\xa6\x80\x89\xe9\x96\x80\x99\x69\xe6\xa2\xb0\x04\x31\x7c\x31\xeb"
- "\x42\x61\x0c\xc5\xeb\x38\x5f\x4d\xe0\x70\x66\x7d\x83\xe0\xab\x1c"
- "\x38\x3b\xfe\xce\x91\x2f\x8c\x9d\x74\x73\x6c\x97\x57\xf6\x82\xef"
- "\x59\x8c\xc1\xf8\x2d\x8d\xb1\x1d\x42\x8c\xdd\x61\x31\x06\x58\x6b"
- "\xc1\x18\x6f\x5d\x67\x14\xc1\x98\xa1\x05\x63\xcc\xd8\xf9\x86\xb6"
- "\x0f\xc6\x99\x0d\x63\x78\xdc\x24\x18\xbb\x24\x89\xb1\xaf\xab\xc5"
- "\x31\x66\x0e\xe6\x63\x4c\x11\x44\x30\xd6\xe9\xfc\xc9\x59\x80\xb1"
- "\x59\x72\x31\xd6\xa9\x4a\xa0\xb1\x29\x9f\xbb\x0e\x1a\x9b\xea\x3c"
- "\xca\x5e\x63\xdb\x34\xf5\x9d\x80\xf0\x84\x3b\x39\xe1\x89\xf5\x01"
- "\xac\xae\xa6\x3a\xcf\x75\x4b\x57\x53\x9d\xa3\x5c\x9a\x93\x47\x75"
- "\x3e\x7e\x1a\x14\xf6\x69\xe8\x19\x15\x11\x64\x4e\xde\x47\x58\x2f"
- "\x53\xde\x93\x30\x0e\x45\xf5\x32\x7b\xce\x61\x2e\x15\xd5\x65\x6e"
- "\xcb\x5c\x2a\xaa\xcb\xe0\xc6\x6d\xe2\x73\xf2\xfe\x98\x92\xcb\xd3"
- "\x2e\xb9\x22\xda\x25\xd7\xee\x3d\x5d\xae\x88\x6e\xc9\x45\xf8\x5a"
- "\xbe\x6e\x39\x1d\x41\x74\xcb\xe9\x08\xac\x5b\x72\x19\xbe\x77\x3a"
- "\xc2\xa6\x5b\x72\xe1\x3c\xd1\x2d\xa7\x23\xae\xc0\x0f\x74\x0b\xa5"
- "\xaa\x3c\x1d\x21\xa2\x5b\x28\xd5\x79\x66\x4e\x1e\xd5\xb9\x58\x7a"
- "\x4e\x5e\x2e\x4f\x1f\xe7\xf2\xf4\x71\x2e\xab\x8f\x73\x19\x7d\x4c"
- "\xee\x39\x88\x69\x1b\xbe\x27\xae\x93\x7f\xcf\x16\xfd\x40\x75\x99"
- "\xcc\xe8\x07\xaa\xf3\x09\xec\x07\x81\x3e\xc6\xd7\x24\x89\xe8\x63"
- "\xaa\xcb\x5a\xf6\x9a\x62\x9b\x3e\x6e\x22\xe5\x99\x3a\x20\xd6\xe4"
- "\x4b\xea\x63\xaa\xab\x9e\xc4\x9e\xae\x5d\x48\xec\x21\x3e\x75\xd0"
- "\xc7\x54\x17\xbe\xfe\x11\x9f\x93\xc7\x62\x88\x69\x67\x82\x84\x3e"
- "\xa6\xba\x86\x38\xe8\x63\xca\x7b\xbc\xe8\x9c\x3c\xca\xc7\x8b\xc3"
- "\xd1\x63\xef\x09\xe6\xe4\x51\x5d\x97\xf2\x75\x31\xc6\xd8\x03\x86"
- "\xad\x4a\xc1\x9c\x3c\xea\xb1\x17\xc4\x35\x71\x2e\x4f\x13\xe7\x32"
- "\x9a\xf8\x74\x04\x3b\x27\x8f\x7a\x6c\x05\xae\xdb\x51\x13\xe7\xb6"
- "\x94\xb7\x69\x62\x7c\x0d\xc1\x9c\x88\x26\xa6\x1e\x3b\x6e\x8f\x39"
- "\x81\x26\xa6\x1e\xbb\x60\xd3\xc4\x4d\xaf\xf0\x34\x31\xf5\xd8\x5d"
- "\x81\x26\x66\xea\x17\xd1\xc4\x94\x4f\x7f\x41\xfd\xf6\x9a\x98\xf2"
- "\x19\x65\xd3\xc4\xb8\x7e\x1b\x6e\x5b\x34\x31\xe5\xc3\xc6\x50\xe5"
- "\x2d\xd9\x9a\x98\xf2\x61\xf2\x3a\x45\xef\x92\x77\x5d\x02\x3d\x4c"
- "\xf9\x9c\x12\xe8\x61\xca\x27\x8f\xd1\xbd\x94\x4f\x3d\x33\x1f\x8f"
- "\xf2\x39\x40\x8e\x2b\x8d\xfc\xe3\x2d\x7a\x98\x3d\x8e\xe7\xe3\x31"
- "\xf3\xf0\x36\x75\x53\xca\xd3\xc1\x8f\x77\x40\x1d\x1c\xe8\x44\x07"
- "\x07\x3e\x5c\x3a\x98\xea\xfe\xa9\x5b\x3a\x98\xea\x7e\xa8\x63\xf0"
- "\xfa\x87\x4c\x6f\x6d\xea\x16\x48\x38\x97\x7a\xb2\x7b\xbc\x5e\x3d"
- "\xa9\x63\xf8\xe5\x61\xd3\x5b\xdd\xcd\xc4\x2f\x7e\x97\xdd\xf3\x8b"
- "\x9f\xe4\xfe\x87\xad\xeb\xad\x5e\x87\x39\xbd\xd5\xeb\xb0\xb4\xde"
- "\xea\x71\xc4\xb9\xde\x7a\x1c\x71\x7a\x2b\x60\x2e\xe1\x3c\x01\x63"
- "\x09\xe7\x09\xf0\x96\xaf\xb7\xfc\xd7\x3c\xd2\x5b\x6d\xa9\xb7\xd4"
- "\xd9\x04\x63\xfe\x13\xdc\xd3\x5b\xfe\xe3\x85\x7a\xab\xb7\xe3\x7a"
- "\x28\xca\xbf\xc8\x75\xbd\xe5\x7f\xc6\x3d\xbd\xe5\x5f\xe9\x9a\xde"
- "\x0a\x18\x26\xae\xb7\x7a\x1c\x95\xd6\x5b\xe4\x9c\x23\x4f\xee\x79"
- "\x86\xe3\xc9\x3d\xf3\x3b\xbe\xde\xea\x39\x5a\x9c\x13\xf7\x9c\x40"
- "\xf4\x56\xc0\xd0\xb6\xd7\x5b\x01\x43\xc5\xf5\x56\xcf\x63\x84\x9b"
- "\x06\x0c\x77\xd4\x5b\x70\x8d\xa8\xde\xea\x79\x8b\xbd\x66\xa8\x50"
- "\x6f\x91\x3a\x20\xd6\x74\x93\xd6\x5b\x8f\xef\x25\xb1\xe7\xf1\x55"
- "\x24\xf6\x10\x9f\x3a\xea\xad\xc7\xa7\xb6\xae\xb7\x08\x86\x98\x76"
- "\x4a\xea\xad\xc7\x77\x38\xea\xad\x1e\x87\xc5\xf5\x56\xaf\xa5\x1c"
- "\x8e\x7a\xf9\x09\xf5\xd6\xe3\x17\x1f\x0c\xbd\x25\x89\xad\xd1\x42"
- "\xbd\x15\x78\x50\xbe\xde\x0a\xbc\x2c\x4f\x6f\x61\xcc\x89\xe9\xad"
- "\x5e\xc3\xec\x31\x27\xd4\x5b\xbd\x26\x8b\xeb\xad\x5e\xf3\x85\x7a"
- "\x0b\xd7\x2f\xa6\xb7\x7a\x65\x09\xea\x77\xd0\x5b\xbd\x8a\x84\x7a"
- "\x8b\x94\xe3\xf4\x56\x6f\xb2\x06\x8a\xea\x31\x57\xbe\xde\xea\x3d"
- "\x4c\x5a\x6f\xf5\x16\xae\x7f\xa2\x7a\x93\xf5\x4f\x54\x6f\xb2\xfe"
- "\x89\xea\x4d\xd6\x3f\x51\x3d\xa2\xf8\xc7\x39\xbd\x45\x8e\x73\x7a"
- "\xab\x77\xa2\x3c\xbd\xe5\xdb\x01\xf5\x96\xda\x89\xde\x52\x3f\x64"
- "\x7a\xab\x4f\xb0\x7b\x7a\xab\x4f\xd0\x23\x5e\x7f\x3f\x78\x7d\xef"
- "\x74\xc2\xb9\xfa\x1e\x73\x8f\xd7\xf7\x3d\xea\x3e\xaf\x0f\xce\xe4"
- "\x78\x7d\x70\xa6\x34\xaf\xef\x97\xe5\x9c\xd7\x0f\xa8\xe2\x78\x7d"
- "\x7f\x36\x97\xd9\xbf\x2f\x19\x5b\x35\x17\xe4\xf3\x7a\xcd\xf4\x47"
- "\xbc\xbe\x2d\x79\x7d\x9f\x78\x82\x31\x4d\x7f\xf7\x78\xbd\x46\x23"
- "\xe4\xf5\x4f\x8e\x72\xe4\xf5\x9a\x0d\xae\xf3\x7a\xcd\x5e\xf7\x78"
- "\xbd\x46\x72\xde\xa1\x90\xd7\xf7\xef\x22\xce\xeb\xfb\x65\x4b\xf3"
- "\x7a\x72\xce\x91\x8f\x0d\xd8\xcb\xf1\xb1\x01\x2b\x3a\x3e\xaf\x1f"
- "\x10\x28\xce\xbd\x06\xf4\x27\xbc\xbe\xbf\xaa\xed\x79\x7d\x7f\x95"
- "\x38\xaf\x1f\x40\xd6\x7f\x50\xfd\x7d\x1c\x79\x3d\x5c\x23\xca\xeb"
- "\x07\x9c\x62\xaf\x51\x09\x79\x3d\xa9\x03\x62\xcd\x65\x69\x5e\xff"
- "\xc4\x5a\x12\x7b\x9e\x98\x4a\x62\x0f\xf1\xa9\x23\xaf\x7f\x22\xa4"
- "\x75\x5e\x4f\x30\xc4\xb4\x53\x92\xd7\x3f\xb1\xd4\x91\xd7\xf7\xcb"
- "\x14\xe7\xf5\xc1\x13\x38\x1c\x05\x5d\x15\xf2\xfa\x27\x8e\x3c\x18"
- "\xbc\x5e\x12\x5b\x81\x42\x5e\x1f\xb4\x51\x3e\xaf\x0f\x3a\x26\x8f"
- "\xd7\x63\xcc\x89\xf1\xfa\xe0\x2e\xf6\x98\x13\xf2\xfa\xe0\x60\x71"
- "\x5e\x1f\x3c\x4a\xc8\xeb\x71\xfd\x62\xbc\x3e\x38\x4e\x50\xbf\x03"
- "\xaf\x0f\xde\x20\xe4\xf5\xa4\x1c\xc7\xeb\x9f\xd4\x92\x18\xda\x4f"
- "\x2f\x9f\xd7\x3f\xd9\x45\x9a\xd7\x3f\xe9\x27\xe4\xf5\xc1\x35\x84"
- "\xbf\x3f\x39\x92\xf0\xfa\x60\x13\x39\xde\x4f\xc7\x3f\xce\xf1\x7a"
- "\x72\x9c\xe3\xf5\x4f\x4e\x92\xc7\xeb\x3b\x77\x40\x5e\xaf\x72\xc2"
- "\xeb\x55\x0f\x19\xaf\x1f\x68\x71\x8f\xd7\x0f\x34\xbb\xcf\x1f\x87"
- "\x54\x72\xfc\x71\x48\xa5\x34\x7f\xd4\x9e\x71\xce\x1f\x07\x07\x72"
- "\xfc\xf1\xe9\x55\x24\x86\x3f\x3d\x9b\xc4\xf0\xa7\xfb\xca\xe7\x8f"
- "\x4f\xe5\x3c\xe2\x8f\x6d\xc9\x1f\x9f\x8c\x22\xfc\xf1\xa9\xb9\xee"
- "\xf1\xc7\xa7\xa2\x84\xfc\x71\xe8\x1a\x47\xfe\xf8\xd4\x49\xd7\xf9"
- "\xe3\x53\x57\xdd\xe3\x8f\x4f\xd5\xba\xc6\x1f\x9f\x9e\x20\xce\x1f"
- "\xb5\x67\xa5\xf9\x23\x39\xe7\x38\xee\x0f\xba\xca\x8d\xfb\x83\x3e"
- "\xed\xf8\xfc\x71\x50\xa4\xf8\x18\x3f\x68\x2e\xe1\x8f\x4f\x8f\x6f"
- "\x7b\xfe\xf8\xf4\x78\x71\xfe\x38\xe8\x1c\x19\x6b\x9f\x9e\xe4\xc8"
- "\x1f\xe1\x1a\x51\xfe\x38\x98\x1d\xff\x9f\x1e\x2f\xe4\x8f\xa4\x0e"
- "\x88\x35\xc1\xd2\xfc\x71\x30\x59\x17\x4b\x0d\xce\x22\xb1\x87\xf8"
- "\xd4\x91\x3f\x0e\x8e\x6b\x9d\x3f\x12\x0c\x31\xed\x94\xe4\x8f\x83"
- "\x0f\x3a\xf2\x47\x6d\xa5\x38\x7f\x1c\xb2\x91\xc3\xd1\x90\x10\x21"
- "\x7f\x1c\xdc\xf8\x60\xf0\x47\x49\x6c\x45\x0a\xf9\xe3\xcf\x4e\xc9"
- "\xe7\x8f\x3f\xb3\xc8\xe3\x8f\x18\x73\x62\xfc\x71\xc8\x04\x7b\xcc"
- "\x09\xf9\xe3\x90\xf9\xe2\xfc\x71\xc8\x1a\x21\x7f\xc4\xf5\x8b\xf1"
- "\xc7\x21\x7b\x05\xf5\x3b\xf0\xc7\x21\x27\x85\xfc\x91\x94\xe3\xf8"
- "\xe3\xd0\x58\x12\x43\xb5\xab\xe4\xf3\xc7\xa1\x13\xa4\xf9\xe3\xd0"
- "\xa9\x42\xfe\x38\x34\x88\xf0\xc4\xa1\xc9\x84\x3f\x0e\xd5\x91\xe3"
- "\xda\x24\xfe\x71\x8e\x3f\x92\xe3\x1c\x7f\x1c\xba\xb9\x35\xfe\xe8"
- "\x9c\x5b\xe8\x46\x73\xdc\x42\x37\x9a\xcf\x2d\x4e\x09\xb8\xc5\x30"
- "\xe7\xfb\x5f\x51\x23\xd2\x39\x6e\xf1\xec\x55\xd2\xbf\x9f\x2d\x23"
- "\xfd\xfb\xd9\x2d\x0c\xb7\x98\x0c\x1c\x00\xb8\x45\xd1\xb5\x03\x84"
- "\x5b\x5c\x33\x51\x6f\xdf\x60\xb9\x45\x1d\x52\x6d\x5e\xcc\x72\x8b"
- "\x57\x31\xb7\x78\xd6\x1b\x73\x0b\x9f\x3c\xe0\xb7\x35\x2c\xdf\x4d"
- "\x00\xbe\x5b\x03\xff\x87\xbe\xf3\x39\xd4\x51\x0e\x9c\x34\x13\x5f"
- "\x8f\xbf\x03\x02\x75\x31\x6b\x6b\x99\x75\xb7\x06\x6f\xcd\x3c\xb2"
- "\x66\x17\x7f\xc7\x45\xea\x1b\x2e\xb6\xef\xb7\x24\xd7\xd0\x56\xfc"
- "\xbd\x96\xf0\x68\xde\x77\x5c\xf0\xf7\x59\x8d\xb5\x08\x7f\xcb\x25"
- "\x6f\x19\xf2\xdf\x89\xb9\x46\x2d\x52\x77\x5f\xeb\xd5\x1d\x7f\xc7"
- "\xa5\x7b\x3d\xe1\xb4\x45\xd6\x12\xc2\x69\x97\x07\x76\x05\x9e\x34"
- "\x68\xd7\x6d\x8e\x63\xbc\x83\xf9\xc5\x72\xad\xa6\x7e\xb9\xb6\xdf"
- "\x9d\x3b\xc0\x69\x8d\xf6\xdf\xf9\xf8\x74\x0f\xfe\x96\x04\xfe\x9e"
- "\xa6\x99\xe5\xb4\xf4\xef\xb4\x68\x77\x0c\xf0\x9e\x3a\xe4\xf5\x33"
- "\xfc\x8d\x8f\x32\xa4\x1e\xd8\x07\xe2\xfe\x1d\x6d\x1f\xfe\xfe\x9c"
- "\x38\x2f\x6a\xbd\xa3\x45\xa5\x51\xdf\x32\xeb\x6c\xcd\xb6\x75\xb6"
- "\xb7\x91\xce\xb8\x5c\x4b\xbd\xbb\x8c\xc7\x69\x03\x30\xa7\x0d\x73"
- "\xc2\x69\x9f\x39\xe3\x1e\xa7\x7d\xa6\x52\xc8\x37\x74\xd7\x1d\xf9"
- "\xc6\xb3\x23\x5c\xe7\x1b\xcf\xce\x70\x8f\x6f\x3c\x1b\xe9\x1a\xdf"
- "\x78\xf6\x88\x3d\xdf\xd8\xcb\xf0\x8d\x61\x43\x31\x36\xc5\xf9\x06"
- "\x39\xe7\x38\x4e\x8c\x98\xc1\x8d\x13\x23\x82\x3b\x3e\xdf\x18\x5e"
- "\x22\x3e\x26\x0c\x3f\x43\xf8\xc6\xb3\x87\xdb\x9e\x6f\x3c\x7b\x58"
- "\x9c\x6f\x8c\x18\x4b\x62\xf3\xb3\x47\x1d\xf9\x06\x5c\x23\xca\x37"
- "\x46\xac\x62\xaf\x39\x2c\xe4\x1b\xa4\x0e\x88\x3f\x39\xd2\x7c\xe3"
- "\xb9\x61\x24\x1e\x3d\xe7\x45\xe2\x11\xf1\xa9\x23\xdf\x18\x71\xbe"
- "\x75\xbe\x41\x30\xc4\xb4\x53\x92\x6f\x3c\xd7\xdf\x91\x6f\x0c\x1b"
- "\x24\xce\x37\x42\x1b\x39\x1c\x85\xee\x10\xf2\x8d\xe7\xe2\x1e\x0c"
- "\xbe\x21\x89\xad\x12\x21\xdf\x08\xd5\xcb\xe7\x1b\xa1\x8b\xe4\xf1"
- "\x0d\x8c\x39\x31\xbe\x11\x7a\xc4\x1e\x73\x42\xbe\x11\x7a\x4e\x9c"
- "\x6f\x84\x5e\x17\xf2\x0d\x5c\xbf\x18\xdf\xd0\xf5\x12\xd4\xef\xc0"
- "\x37\x74\x23\x84\x7c\x83\x94\xe3\xf8\x86\xae\x8a\xd5\x6c\xe7\xe4"
- "\xf3\x0d\xdd\x11\x69\xbe\xa1\x3b\x2e\xe4\x1b\xba\x6c\xc2\x2b\x74"
- "\x75\x84\x6f\xe8\xf6\xb0\x3c\xe4\x2c\xff\x38\xc7\x37\xc8\x71\x8e"
- "\x6f\xe8\x1e\xad\x7f\x7d\xa0\xf2\x55\x61\xee\xad\x7f\xa5\xc2\x1e"
- "\xad\x7f\xbd\x2f\xef\xa1\xf5\xec\xfa\xd7\x91\x6e\xae\x7f\x1d\xf9"
- "\x68\xfd\xeb\x7d\xf1\x4b\x18\xbb\xfe\x75\x94\x9b\xeb\x5f\x47\x3d"
- "\x5a\xff\x7a\x5f\xfc\x32\x92\x5d\xff\xfa\xbc\x9b\xeb\x5f\x9f\xf7"
- "\x60\xfd\xeb\xb8\x68\x4e\x1b\x8f\x8b\x96\xd6\xc6\xa3\x5b\x59\xff"
- "\x3a\x66\x1f\xa7\x8d\x7f\xd9\x8d\x70\xd1\x17\x6f\x11\x2e\xfa\x22"
- "\x93\x9b\x4a\xc1\xda\xf8\x0f\xf3\x33\x3f\x5e\x76\x98\xc2\xfb\xc2"
- "\xe1\x6f\x63\x6e\x59\x8d\x94\x66\xac\x8d\xc1\x07\x5b\x9a\xb0\x36"
- "\x3e\x81\x12\x16\x60\x6d\xfc\x62\x48\x79\x0d\xef\xfb\x2a\xd4\xe8"
- "\x1d\xdc\x7e\xce\x27\x10\x3e\xf7\xf9\xed\xc3\x54\x66\x93\x5d\x4e"
- "\x7e\x99\x89\xd2\x2c\x16\xe6\xe4\x2d\x39\x33\xd3\x70\x4e\xbe\x91"
- "\xfd\x56\x0a\x93\x97\x1f\xec\x3c\x27\x9f\xdf\x04\x63\xa7\x48\x5e"
- "\x1e\xe7\xe4\x61\x8c\x7c\xc8\x72\xf2\xbf\x60\xd7\xc6\xbe\x70\xd7"
- "\xbd\x9c\xfc\x0b\xf5\x42\x8d\x3c\xde\xcf\x51\x23\xbf\x38\xc3\x75"
- "\x8d\xfc\xe2\x1a\xf7\x34\xf2\x8b\xc9\xae\x69\xe4\x17\x2f\x88\x6b"
- "\xe4\xd1\x93\x52\x24\x35\x32\x39\xe7\xa8\x6d\xc6\xac\xe1\xb4\xcd"
- "\x98\x09\x1d\x5f\x23\xff\xb2\x4e\x5c\xc7\xfc\xf2\x2e\xd1\xc8\x2f"
- "\x56\xb7\xbd\x46\x7e\xb1\x5a\x5c\x23\x8f\x61\xdf\x7f\xbf\x68\x70"
- "\xd4\xc8\x70\x8d\xa8\x46\x1e\x93\xcf\x5e\x53\x2d\xd4\xc8\xa4\x0e"
- "\x88\x43\x47\xa4\x35\xf2\xd8\xe9\x24\x2e\x8d\x0d\x26\x71\x89\xf8"
- "\xd4\x51\x23\x8f\xb1\xb4\xae\x91\x09\x86\x98\x76\x4a\x6a\xe4\xb1"
- "\x63\x1d\x35\xf2\x68\x89\xb5\xb1\xe3\xfa\x72\x38\xfa\xd5\x31\xa1"
- "\x46\x1e\xbb\xe5\xc1\xd0\xc8\x92\xd8\xaa\x13\x6a\xe4\x5f\xcd\x96"
- "\xaf\x91\x7f\x95\x25\x4f\x23\x63\xcc\x89\x69\xe4\x5f\x5d\xb0\xc7"
- "\x9c\x50\x23\xff\xaa\x51\x5c\x23\x8f\xf3\x13\x6a\x64\x5c\xbf\x98"
- "\x46\x1e\x37\x4a\x50\xbf\x83\x46\x1e\x37\x43\xa8\x91\x49\x39\x4e"
- "\x23\x8f\x33\x93\x18\xfa\xbc\x1b\x6b\x63\xc7\x5d\x90\xd6\xc8\xe3"
- "\x2e\x0b\x35\xf2\xb8\xc3\x44\x0b\x8f\x57\x13\x8d\x3c\xae\x94\x1c"
- "\x7f\xde\xc8\x3f\xce\x69\xe4\xe7\xed\xd6\xc6\x8e\xd7\x3c\x5a\x1b"
- "\xfb\x20\x69\xe4\x09\x6e\xe6\xbf\x27\x54\x76\x0c\xce\xff\xb0\x69"
- "\xb1\xf1\xc3\x09\xe7\xfa\x75\x9c\x7b\x9c\xff\xd7\xb1\x1d\xc3\x2f"
- "\x0f\x9b\x16\x9b\xc8\xae\x59\x9e\xec\xe5\x9e\x5f\xf0\x52\x1f\x77"
- "\xb5\xd8\x34\x23\xa7\xc5\xa6\x19\xa5\xb5\xd8\xe4\x73\xce\xb5\xd8"
- "\x4b\x3a\x4e\x8b\x45\xec\x20\x9c\x27\x62\x0d\xe1\x3c\x11\xa3\xe4"
- "\x6b\xb1\xf0\x4f\x85\x5a\x6c\x4a\xf0\x23\x2d\x76\xbf\xb4\xd8\xaf"
- "\x0f\x10\xfc\x85\xaf\x75\x4f\x8b\x85\xa7\x09\xb5\xd8\xf4\x7c\x47"
- "\x2d\x16\x7e\xd9\x75\x2d\x16\xe1\xde\xfe\xbf\x54\x84\xca\x35\x2d"
- "\x16\x11\x27\xae\xc5\x26\x57\x49\x6b\x31\x72\xce\x91\x43\xbf\xd4"
- "\x85\xe3\xd0\x53\xcf\x75\x7c\x2d\x36\x35\x49\x9c\x2f\x4f\x5d\x4b"
- "\xb4\x58\x44\x6c\xdb\x6b\xb1\x88\x58\x71\x2d\x36\xf5\x2e\xe1\xad"
- "\x11\xf1\x8e\x5a\x0c\xae\x11\xd5\x62\x2f\x85\xb0\xd7\xc4\x0a\xb5"
- "\x18\xa9\x03\xe2\xd0\x58\x69\x2d\xf6\xd2\x45\x12\x97\x5e\x3a\x48"
- "\xe2\x12\xf1\xa9\xa3\x16\x7b\x69\x63\xeb\x5a\x8c\x60\x88\x69\xa7"
- "\xa4\x16\x7b\xe9\x8c\xa3\x16\x9b\x7c\x56\x5c\x8b\x4d\xe3\xad\xd3"
- "\x98\x36\x41\xa8\xc5\x7e\xd3\xeb\xc1\xd0\x62\x92\xd8\x4a\x12\x6a"
- "\xb1\xdf\x5c\x95\xaf\xc5\xa6\xf5\x95\xa7\xc5\x30\xe6\xc4\xb4\xd8"
- "\xb4\x38\x7b\xcc\x09\xb5\xd8\xb4\x0d\xe2\x5a\x6c\x5a\xbe\x50\x8b"
- "\xe1\xfa\xc5\xb4\xd8\xb4\x53\x82\xfa\x1d\xb4\xd8\xb4\xcb\x42\x2d"
- "\x46\xca\x71\x5a\x6c\x7a\x3a\x89\xa1\x93\xd7\xc8\xd7\x62\xd3\xe3"
- "\xa4\xb5\xd8\xf4\xa5\x42\x2d\x36\x7d\x0c\xd1\x5c\xd3\xf3\x88\x16"
- "\x9b\x1e\x49\x8e\x4f\x4e\xe6\x1f\xe7\xb4\x18\x39\xce\x69\xb1\xe9"
- "\xfb\x1e\xad\x9b\x7d\x90\xb4\xd8\x6f\x67\xbb\xa7\xc5\x7e\x3b\xeb"
- "\x11\xe7\xbf\x1f\x9c\x7f\x7a\x31\xe1\x5c\x91\x77\xdd\xe3\xfc\x91"
- "\xf5\xee\x73\xfe\xa8\x1a\x8e\xf3\x47\xd5\x48\x73\xfe\x19\xa7\x9c"
- "\x73\xfe\x57\x07\x71\x9c\x7f\xd6\x16\x32\xb6\xce\x5a\x4a\xc6\xd6"
- "\x59\xc3\xe4\x73\xfe\x57\xf6\x0a\x39\xff\xcc\x5e\x8f\x38\xff\xfd"
- "\xe2\xfc\xbf\x2d\x24\xf8\x7b\x65\x85\x7b\x9c\xff\x95\x44\x21\xe7"
- "\x9f\x9b\xe5\xc8\xf9\x5f\x71\xf8\xfe\x87\x34\xe7\x7f\xc5\xe2\x1e"
- "\xe7\x7f\xc5\xec\x1a\xe7\x9f\x35\x5b\x9c\xf3\xcf\x28\x95\xe6\xfc"
- "\xe4\x9c\x23\x57\x9b\x6d\xe1\xb8\xda\xec\x53\x1d\x9f\xf3\xcf\x8e"
- "\x17\xe7\x65\xb3\x57\x10\xce\x3f\x6b\x56\xdb\x73\xfe\x59\xb3\xc4"
- "\x39\xff\xec\xab\x84\x1f\xcd\x8a\x72\xe4\xfc\x70\x8d\x28\xe7\x7f"
- "\xb5\x2f\x7b\xcd\x2c\x21\xe7\x27\x75\x40\x1c\xd2\x4b\x73\xfe\x57"
- "\xcf\x91\xb8\xf4\x2a\xf9\x56\x18\xeb\x53\x47\xce\xff\xea\x9a\xd6"
- "\x39\x3f\xc1\x10\xd3\x4e\x49\xce\xff\xea\x49\x47\xce\x3f\xa3\x44"
- "\x9c\xf3\x47\xe5\x73\x38\x8a\x1a\x25\xe4\xfc\x73\xba\x3d\x18\x9c"
- "\x5f\x12\x5b\xf1\x42\xce\x3f\xe7\x82\x7c\xce\x1f\xe5\x27\x8f\xf3"
- "\x63\xcc\x89\x71\xfe\xa8\xd9\xf6\x98\x13\x72\xfe\xa8\x55\xe2\x9c"
- "\x3f\x2a\x4b\xc8\xf9\x71\xfd\x62\x9c\x3f\xea\x98\xa0\x7e\x07\xce"
- "\x1f\x75\x5e\xc8\xf9\x49\x39\x8e\xf3\xcf\x4d\x26\x31\x74\xc6\x52"
- "\xf9\x9c\x7f\xee\x6c\x69\xce\x3f\x77\xbe\x90\xf3\xcf\x65\xd7\xce"
- "\xce\xcd\x24\x9c\x7f\xee\x24\x72\x7c\x46\x02\xff\x38\xc7\xf9\xc9"
- "\x71\x8e\xf3\xcf\x2d\x78\xb4\xa6\xf6\x41\xe2\xfc\xaf\x4d\x75\x8f"
- "\xf3\xbf\x16\xe1\x3e\xb7\x5c\xc8\x5b\xf7\xb2\xd0\xc9\xba\x97\xe8"
- "\x60\xe7\xdc\x32\x96\xb7\xee\x25\x86\x5d\xf7\x12\xc3\xae\x7b\x89"
- "\xd9\x22\x9f\x5b\xc6\x78\x0b\xb9\x65\xf4\x8a\x47\xdc\xf2\x7e\x71"
- "\xcb\xb9\x87\x08\xb7\x9c\x7f\xc6\x3d\x6e\x39\xdf\x6e\xfd\xcb\x42"
- "\x91\xf5\x2f\x31\x32\xd6\xbf\xc4\xb8\xb9\xfe\x25\xc6\xc5\xf5\x2f"
- "\x31\x12\xeb\x5f\xa2\xb5\xd2\xdc\x92\x9c\x73\xe4\x04\xb1\xbc\xf5"
- "\x2f\xb1\x0f\xc0\xfa\x97\xdf\x49\xac\x51\xf8\x1d\xbb\xfe\x25\xe6"
- "\x3e\xac\x7f\x89\x91\x58\xff\x12\xcb\xae\x7f\x89\x11\x59\xff\x12"
- "\x23\xb1\xfe\x25\x96\x5d\xff\x12\x63\xb7\xfe\x25\x86\x5d\xff\x12"
- "\xeb\x64\xfd\x4b\x1c\xbb\xfe\x25\x8e\x5d\xff\x42\x7c\xea\xc8\x2d"
- "\x63\x5d\x58\xff\x12\xc3\xae\x7f\x89\x71\xb2\xfe\x25\x4e\x64\xfd"
- "\x4b\x74\x90\x38\xb7\x5c\xc0\x5b\xff\xb2\xc0\x6e\xfd\x4b\xdc\x03"
- "\xb2\xfe\x45\x12\x5b\x76\xeb\x5f\x16\xb8\xb1\xfe\x65\x81\xcc\xf5"
- "\x2f\x31\x12\xeb\x5f\x16\x1c\xb1\xc7\x9c\x90\x5b\x2e\x90\x58\xff"
- "\xb2\xc0\x6e\xfd\x4b\x8c\xc4\xfa\x97\x85\xbd\x04\xf5\x3b\x70\xcb"
- "\x85\x76\xeb\x5f\x62\xec\xd6\xbf\x2c\x64\xd7\xbf\xbc\x56\x26\x9f"
- "\x5b\x2e\x74\xb2\xfe\x65\xa1\xdd\xfa\x97\x85\xec\xfa\x97\x85\xec"
- "\xfa\x97\x85\xec\xfa\x97\xd7\x4a\xf9\xc7\x39\x6e\x49\x8e\x73\xdc"
- "\x72\x61\xab\xeb\x5f\x9c\xf3\x8e\xe5\xa5\x1c\xef\x58\x5e\x2a\xcd"
- "\x3b\xe2\xf3\x9d\xf3\x8e\xa5\xfe\x1c\xef\x58\xb2\x82\xf4\xef\x25"
- "\x33\x48\xff\x5e\xc2\xbc\x87\x59\x53\x06\xbc\x63\xc0\xfc\xcc\xfd"
- "\x37\x0e\x30\xbc\xe3\xe3\xc5\x26\x0a\x38\xa2\xd2\x8a\x79\x07\x70"
- "\xc1\xcd\x2b\x31\xef\xa8\x61\xd7\xdb\x2e\xce\x2a\x4b\xe2\xf3\x8e"
- "\xf8\x5b\xcc\xda\xdb\x96\xef\x3d\xd7\x20\x7c\x5e\x6c\x2d\xee\xb1"
- "\xc5\xec\x5a\x5c\xa8\x9b\xbf\x06\x97\x59\x97\x7b\x03\x78\xc9\x3c"
- "\xf0\x07\x8f\x97\x3c\x5a\x8b\xeb\x6c\x2d\xee\x62\x37\xf3\xdf\x8b"
- "\x67\x09\xb9\x48\xe2\x2a\x47\x2e\xb2\xf8\xb8\xeb\x5c\x64\xf1\x65"
- "\xf7\xb8\xc8\xe2\x1a\xd7\xb8\xc8\x92\xb1\xe2\x5c\x24\xbe\x00\xe3"
- "\x56\x9c\x8b\x90\x73\x8e\x63\x48\xc2\x65\x6e\x0c\x49\x38\xd8\xf1"
- "\xb9\x48\xc2\x34\xf1\xf1\x22\x61\x36\xe1\x22\x4b\xc6\xb4\x3d\x17"
- "\x59\x32\x46\x9c\x8b\x24\x9c\x21\x71\x7b\xc9\x78\x47\x2e\x02\xd7"
- "\x88\x72\x91\xa5\xde\xec\x35\x63\x84\x5c\x84\xd4\x01\xb1\xa9\xbf"
- "\x34\x17\x59\x7a\x8c\xc4\xaa\xa5\x5b\x48\xac\x22\x3e\x75\xe4\x22"
- "\x4b\xe7\xb7\xce\x45\x08\x86\x98\x76\x4a\x72\x91\xa5\x45\x8e\x5c"
- "\x24\x3e\x4f\x9c\x8b\x2c\xdf\xc0\xe1\x68\x79\xb0\x90\x8b\x2c\xbd"
- "\xfb\x60\x70\x11\x49\x6c\x4d\x13\x72\x91\x65\x27\xe5\x73\x91\x65"
- "\x8d\xf2\xb8\x08\xc6\x9c\x18\x17\x59\x3e\xd6\x1e\x73\x42\x2e\xb2"
- "\x7c\xae\x38\x17\x59\xbe\x4a\xc8\x45\x70\xfd\x62\x5c\x64\xf9\xfb"
- "\x82\xfa\x1d\xb8\xc8\xf2\xe3\x42\x2e\x42\xca\x71\x5c\x24\x31\x9a"
- "\x1d\x03\xc7\xca\xe7\x22\x89\x63\xa5\xb9\x48\xe2\x64\x21\x17\x49"
- "\xd4\x10\xce\x91\x98\x44\xb8\x48\xe2\x70\x72\x3c\x7e\x0c\xff\x38"
- "\xc7\x45\xc8\x71\x8e\x8b\x24\xa6\xcb\xc8\x73\xad\x97\xb3\x16\xb7"
- "\xe8\x9e\x30\xcf\x65\xcb\x71\x99\x07\x85\x25\xb6\xe4\xb9\xf8\xef"
- "\x49\x45\xf2\x5c\x78\x4c\xe7\xf2\x5c\x17\x98\x58\xc5\xe5\xb9\x0c"
- "\x4c\x9e\x0b\xe7\xb8\xf0\xbb\x52\x5b\x8e\xcb\xfa\xba\xe3\x3a\xdc"
- "\x22\xab\xfc\x1c\x17\xf7\xbe\xf4\x2f\x1a\x92\xe3\xaa\x6a\xc9\x71"
- "\xe1\xf1\xdc\xd2\xe0\x98\xe3\xc2\xe3\x38\x97\xe3\xfa\xb6\x8d\x73"
- "\x5c\x2b\x47\xb8\x37\xae\xaf\x1c\xde\x31\xde\x6b\x3f\x6c\xeb\x70"
- "\x13\xf3\x48\xee\xe7\xf5\x32\xf7\xde\x6b\xbf\x5e\xda\x31\xfc\xf2"
- "\xb0\xcd\xfd\x5e\x99\x4c\xfc\xb2\x6a\xbe\x7b\x7e\x59\x15\xdd\x31"
- "\xfc\xf2\xb0\xcd\x03\x49\xf2\x27\x7e\x59\x6d\x71\xcf\x2f\xab\x3d"
- "\xd8\xff\xf2\x4d\x35\xa7\x99\xdf\x54\xf3\x35\x73\xc9\x18\xbe\x66"
- "\x7e\xa3\x95\xfd\x2f\xd3\x22\x39\xcd\x9c\x72\x84\xf0\xd0\x94\x7c"
- "\xc2\x43\x53\x98\xf7\x53\x6b\x5e\x40\x8c\x56\x36\x63\xdd\xbc\xc0"
- "\x44\xed\xbf\x56\x4c\x99\xd7\x11\xbd\x5c\x61\x2e\x45\x65\x46\x13"
- "\x7a\x7b\x25\x52\x6e\xbc\x81\x94\x7f\xbc\x6d\xa2\x7c\xe3\x91\x0a"
- "\xc6\x24\xb0\x59\x29\xf0\x98\x7c\x94\x90\x82\xb5\xf4\x9a\x73\x15"
- "\x09\x46\x9e\x96\x4e\xd6\x73\x3a\x1a\xca\x25\x98\xd0\x17\x0b\x8a"
- "\x29\xac\x97\x9b\x73\x66\xa6\x35\x0f\x0e\x4b\x60\xf6\xb1\xe2\xe7"
- "\xf3\xe1\xde\x9a\x57\x85\xf9\xfc\xa6\x9c\x99\xeb\x1b\x8b\xc2\x12"
- "\x99\x3d\x34\x83\xb9\x9c\xbe\x9c\xfd\x33\x77\x36\x21\x7f\x5b\x3e"
- "\x7f\xe7\x43\x97\xcf\x5f\xb5\x8f\x60\x74\xcd\x7b\xee\xe5\xf3\xd7"
- "\x14\x08\x35\xf4\x9b\xc7\x1c\x35\x74\x8a\xb7\xeb\x1a\x3a\x25\xc4"
- "\x3d\x0d\x9d\xa2\x75\x4d\x43\xa7\x6c\xb4\xd7\xd0\x7b\x52\xb0\x86"
- "\x7e\xe3\x2c\xc6\xb1\xb8\x86\x26\xe7\x1c\xb5\x4f\x5a\x08\xa7\x7d"
- "\x52\xef\x76\x7c\x0d\x9d\x9a\x2b\xae\x73\x52\xdf\x23\x1a\x3a\x25"
- "\xbd\xed\x35\x74\x4a\xba\xb8\x86\x4e\x0b\x20\x7a\x23\x25\xdd\xa6"
- "\x87\x39\x0d\x0d\xd7\x88\x6a\xe8\xb4\x09\xf6\xd7\x10\x0d\x9d\xb2"
- "\x99\x68\xe8\xb4\xf9\xd2\x1a\x7a\xad\x17\x89\x5d\x69\x67\x48\xec"
- "\x22\x3e\x75\xd4\xd0\x69\x7b\x5b\xd7\xd0\x04\x43\x4c\x3b\x25\x35"
- "\x74\xda\x2d\x47\x0d\xfd\x86\xc4\xfe\x99\xeb\x4e\x71\x38\x5a\x17"
- "\x27\xd4\xd0\x6b\xf5\x0f\x86\x86\x96\xc4\x56\xae\x50\x43\xaf\xeb"
- "\x22\x5f\x43\xaf\x1b\x25\x4f\x43\x63\xcc\x89\x69\xe8\x75\x1b\x59"
- "\xfc\x6c\x16\xd7\xd0\xeb\xde\x17\xd7\xd0\xeb\x8e\x09\x35\x34\xae"
- "\x5f\x4c\x43\xaf\xbb\x2a\xa8\xdf\x41\x43\xbf\xe9\x2d\xd4\xd0\xa4"
- "\x1c\xa7\xa1\xdf\xdc\x43\x62\xe8\x1b\x6e\xec\x9f\xf9\xe6\x46\x69"
- "\x0d\xfd\x66\x96\x50\x43\xbf\x19\x4d\xb4\xf2\x9b\x47\x89\x86\x7e"
- "\x33\x89\x1c\x7f\x23\x89\x7f\x9c\xd3\xd0\x6f\xd8\xed\x9f\xf9\x66"
- "\xa9\x0c\x0d\x9d\xde\x46\x1a\x3a\xe9\xc1\xd2\xd0\x7f\x35\x74\x0c"
- "\x0d\xbd\x61\x95\x7b\x1a\x7a\x43\x92\x8b\x9a\x60\x7d\x2b\x9a\x20"
- "\xf1\x91\x26\xe0\xf3\xad\x37\x0d\x84\x6f\xfd\xde\xcf\x3d\x4d\xf0"
- "\x7b\x75\x47\xf0\xcb\xc3\xe5\x93\x0d\xec\x7c\xfd\xf4\xf7\xdd\xf3"
- "\x49\x7a\xe1\x23\xfd\x7c\x3f\xfc\xf2\xfb\x48\xe2\x97\x4d\xa3\xdc"
- "\xf3\xcb\xa6\x91\xee\xeb\xe7\x6d\x89\x9c\x7e\xde\x96\xc8\xd7\xcf"
- "\x7f\x13\xbc\x73\x7e\xdb\xcf\xb9\x7e\xde\x7a\x94\xd3\xcf\x19\x7d"
- "\x09\x07\xcd\x60\xe7\x94\x6c\x61\x72\xea\xc9\x9f\x12\xfd\x7c\x0f"
- "\xeb\xe7\x2b\xa0\x9f\x63\xa2\x28\x33\xfb\xed\x08\x3c\x7f\xad\x0c"
- "\x34\x30\xd6\xcc\x15\x49\xf0\x77\xa2\x11\xbd\xbd\x0c\x29\x37\x81"
- "\xf6\xdd\x0b\x63\xe5\xde\x95\x46\x2a\x7d\x01\x8c\x33\x55\x45\xc8"
- "\x37\x16\x74\xf5\x6d\xac\xab\x4f\x80\x66\xde\xc0\xea\xea\x2d\xfa"
- "\x8a\x44\xbe\xae\x7e\x3b\x8b\xd1\xd5\x46\x32\x37\xae\x22\x11\x74"
- "\x35\xdc\x0f\x7f\x8b\x82\xaf\xab\x1b\x41\x37\x37\x81\x6e\xce\xbc"
- "\x66\xa7\xb1\x63\x1c\x35\x76\x63\xc0\xcc\x74\xd3\xe0\xb0\x24\xac"
- "\xb1\xef\xbd\xff\x48\x63\x3b\x6a\xec\xf4\x3a\x82\xe3\x2d\xde\xee"
- "\x69\xec\x2d\x4a\xa1\xc6\x7e\xa7\xbf\xa3\xc6\xde\x12\xe7\xba\xc6"
- "\xde\xb2\xc5\x3d\x8d\xbd\x65\xb3\x6b\x1a\x7b\xcb\x75\x7b\x8d\xfd"
- "\x01\xf3\x9e\xfa\x6d\x7f\x8c\x75\x71\x8d\x4d\xce\x39\x6a\xa3\xad"
- "\x5b\x38\x6d\xb4\x75\x46\xc7\xd7\xd8\x19\x66\x71\x1d\xb4\xd5\x9b"
- "\x68\xec\x2d\x75\x6d\xaf\xb1\xb7\xd4\x89\x6b\xec\xad\xec\xfc\xb7"
- "\x2d\x75\x8e\x1a\x1b\xae\x11\xd5\xd8\x5b\x8b\xec\xaf\x21\x1a\x7b"
- "\x8b\x91\x68\xec\xad\xa7\xa4\x35\x76\xe6\x7c\x12\xdf\x32\x47\x90"
- "\xf8\x46\x7c\xea\xa8\xb1\x33\xbb\xb5\xae\xb1\x09\x86\x98\x76\x4a"
- "\x6a\xec\xcc\xe9\x8e\x1a\xfb\x6d\xb5\xb8\xc6\xde\x36\x98\xc3\x51"
- "\x56\x99\x50\x63\x67\xe6\x3f\x18\x1a\x5b\x0a\x5b\x19\x66\xa1\xc6"
- "\xce\x5a\x24\x5f\x63\x67\xbd\x27\x4f\x63\x63\xcc\x89\x69\xec\xac"
- "\xeb\x2c\x7e\x8c\xe2\x1a\x7b\x5b\x17\x71\x8d\xbd\xad\xbf\x50\x63"
- "\xe3\xfa\xc5\x34\xf6\xb6\xc9\x82\xfa\x1d\x34\xf6\xb6\x38\xa1\xc6"
- "\x26\xe5\x38\x8d\xfd\x8e\x0f\x89\xa1\x9b\x8e\xc8\xd7\xd8\xdb\xae"
- "\x4b\x6b\xec\x6d\x77\x85\x1a\x7b\x5b\x09\xd1\xd2\xef\x68\x88\xc6"
- "\xde\x56\x4d\x8e\x6f\x3a\xcc\x3f\xce\x69\x6c\x72\x9c\xd3\xd8\xef"
- "\x0c\x95\xf7\x9e\xda\xa3\xfd\xb0\x12\xdb\x7f\x3d\x46\x5b\xed\x87"
- "\x65\x7b\x57\xfd\x9f\x5e\x8f\x91\x7d\xd1\x3d\x9d\x9d\x6d\x78\xa4"
- "\xe7\xda\x5a\x37\xbc\x33\x86\xf0\xad\xed\x6e\xee\x7f\xbb\xdd\xe9"
- "\xfe\xb7\x8f\xf4\x9c\xbb\x7e\xc9\xd1\x12\xbf\xe4\x76\x73\xcf\x2f"
- "\xb9\x3e\xee\xeb\xb9\x02\x0d\xa7\xe7\x0a\x34\xd2\xef\x43\x73\x2f"
- "\x3a\xd7\x73\xf9\xb1\x9c\x9e\xdb\x79\x8a\xf0\x9d\x9d\x45\x84\xef"
- "\xec\x5c\xd4\x76\xef\x43\xdf\xbd\x2c\x7c\x1f\xba\x63\xc2\xa3\xf7"
- "\xa1\xed\xa1\xd5\xb6\x1f\x25\x18\x7d\xf7\xa0\x7b\x5a\xed\xdd\x03"
- "\x42\xad\x56\x50\xe6\xa8\xd5\x76\x06\xb8\xae\xd5\x76\xea\xdd\xd3"
- "\x6a\x3b\x75\xae\x69\xb5\x9d\x3b\xc4\xdf\x87\xe6\xd6\x48\xbf\x0f"
- "\x25\xe7\x1c\x39\x76\xbe\x9e\xe3\xd8\xf9\xde\x1d\x5f\xab\xe5\xed"
- "\x11\xe7\xd3\x79\x07\x89\x56\xdb\x99\xdb\xf6\x5a\x6d\x67\xae\xb8"
- "\x56\xcb\x0f\x26\xbc\x76\x67\xae\xa3\x56\x83\x6b\x44\xb5\x5a\xfe"
- "\x0c\xfb\x6b\x88\x56\xdb\x99\x47\xb4\x5a\xfe\x0a\x69\xad\xb6\xcb"
- "\x8f\xc4\xae\xfc\x8b\x24\x76\x11\x9f\x3a\x6a\xb5\xfc\x23\xad\x6b"
- "\x35\x82\x21\xa6\x9d\x92\x5a\x6d\x97\x97\xa3\x56\xcb\x35\x88\x6b"
- "\xb5\xdd\xe7\x39\x1c\xed\x5e\x25\xd4\x6a\xbb\x26\x3c\x18\x5a\x4d"
- "\x12\x5b\x7b\x84\x5a\x6d\x77\x2f\xf9\x5a\x6d\xf7\x64\x79\x5a\x0d"
- "\x63\x4e\x4c\xab\xed\xde\xc1\xe2\x27\x4f\x5c\xab\xed\xfe\x54\x5c"
- "\xab\xed\x2e\x13\x6a\x35\x5c\xbf\x98\x56\xdb\xdd\x28\xa8\xdf\x41"
- "\xab\x15\x04\x08\xb5\x1a\x29\xc7\x69\xb5\x82\xc3\x24\x86\xe6\x6e"
- "\x94\xaf\xd5\x0a\x76\x48\x6b\xb5\x82\xf7\x84\x5a\xad\x20\x91\x68"
- "\xb2\x82\x52\xa2\xd5\x0a\xd2\xc9\xf1\xdc\x74\xfe\x71\x4e\xab\x91"
- "\xe3\x9c\x56\x2b\xa8\x96\xa7\xd5\x5c\xdf\x2f\xeb\x3f\x3f\xa7\x58"
- "\xfd\x90\xcd\x29\xfe\xc3\x46\xf7\x74\xda\x1f\xd2\x1f\x69\x82\xfb"
- "\xa1\x09\x0a\x8c\x84\x6f\x15\xf6\x77\x4f\x13\x14\x6a\xdc\xd7\x04"
- "\xfb\x86\x73\x9a\x60\xdf\x70\x69\x4d\x50\x78\xd7\xb9\x26\xd8\x9b"
- "\xcc\x69\x82\x0f\x2f\x90\x71\xf5\xc3\xe3\x64\x5c\xfd\x70\x6d\xdb"
- "\x69\x82\x0f\x1a\x85\x9a\xe0\xfd\xd9\x8f\x34\x41\x7b\x68\x82\x3f"
- "\x54\x12\x8c\x7e\x70\xd2\x3d\x4d\xf0\xc1\x09\xa1\x26\xd8\x77\xd1"
- "\x51\x13\x7c\x18\xe2\xba\x26\xf8\x70\xb2\x7b\x9a\xe0\xc3\x49\xae"
- "\x69\x82\x0f\x8b\xc4\x35\x41\xa1\x49\x5a\x13\x90\x73\x8e\x5c\x6e"
- "\xef\x64\x8e\xcb\xed\xed\xd5\xf1\x35\xc1\x9e\xa3\xe2\xbc\x6d\xcf"
- "\x49\xa2\x09\x3e\xdc\xd7\xf6\x9a\xe0\xc3\x7d\xe2\x9a\x60\xaf\x9e"
- "\xf0\xa7\x0f\xf7\x39\x6a\x02\xb8\x46\x54\x13\xec\x5d\x64\x7f\x0d"
- "\xd1\x04\x1f\x1e\x20\x9a\x60\xef\x46\x69\x4d\xf0\xc7\x60\x12\xbb"
- "\xf6\xde\x25\xb1\x8b\xf8\xd4\x51\x13\xec\x2d\x6b\x5d\x13\x10\x0c"
- "\x31\xed\x94\xd4\x04\x7f\x0c\x70\xd4\x04\x85\xf5\xe2\x9a\xe0\xa3"
- "\xeb\x1c\x8e\x3e\xda\x22\xd4\x04\x7f\x9c\xfd\x60\x68\x02\x49\x6c"
- "\x1d\x15\x6a\x82\x8f\x06\xcb\xd7\x04\x1f\xcd\x95\xa7\x09\x30\xe6"
- "\xc4\x34\xc1\x47\xec\xfb\x3f\x82\x17\x47\x4d\xf0\xd1\x29\x71\x4d"
- "\xf0\xd1\x45\xa1\x26\xc0\xf5\x8b\x69\x82\x7d\xdd\x04\xf5\x3b\x68"
- "\x82\x7d\x21\x42\x4d\x40\xca\x71\x9a\x60\x5f\x29\x89\xa1\x85\xf9"
- "\xf2\x35\xc1\xbe\x22\x69\x4d\xb0\xef\x53\xa1\x26\xd8\xc7\x72\xff"
- "\x7d\x06\xa2\x09\xf6\xe5\x91\xe3\x85\x79\xfc\xe3\x9c\x26\x20\xc7"
- "\x39\x4d\xb0\xcf\xf8\x68\x3f\xad\x07\x69\x3f\xad\xfd\xef\xb9\xa7"
- "\x0b\xf6\x17\xb8\xcf\x3f\x3f\xcb\xe4\xf8\xe7\x67\x99\x7c\xfe\x29"
- "\xdc\xd7\xe2\xe3\x15\xce\xf9\xe7\x9f\xaa\x38\xfe\xf9\x89\x9e\xc4"
- "\xf0\x4f\xfa\x92\x18\x7e\x90\xd9\x9b\x4f\xde\x7e\x5a\x07\xa7\x0b"
- "\xf7\xd3\xfa\xf8\xe4\xa3\xfd\xb4\xee\x17\xb7\x2c\x52\x12\x6e\x79"
- "\xb0\xbf\x7b\xdc\xf2\xa0\x46\xc8\x2d\xff\x3c\xca\x91\x5b\x1e\xdc"
- "\xe0\x3a\xb7\x3c\xb8\xd7\x3d\x6e\x79\x70\x8f\x6b\xdc\xf2\x93\x2e"
- "\xe2\x7b\x58\x7c\x9c\x24\xbd\x9f\x16\x39\xe7\xc8\x09\xfe\xc4\xdb"
- "\x57\xff\x4f\x2b\x3a\x3e\xb7\xfc\x53\xa0\xf8\xf8\xff\xa7\xfe\x84"
- "\x5b\x7e\xa2\x6a\x7b\x6e\xf9\x89\x4a\x9c\x5b\xfe\x29\x87\x8c\xc3"
- "\x9f\xf8\x38\xee\x61\x01\xd7\x88\x72\xcb\x3f\xb1\xfb\xdf\x7f\xa2"
- "\x12\x72\x4b\x52\x07\xc4\xa1\xcb\xd2\xdc\xf2\xd0\x5a\x12\x97\x0e"
- "\x4d\x25\x71\x89\xf8\xd4\x91\x5b\x1e\x0a\x69\x9d\x5b\x12\x0c\x31"
- "\xed\x94\xe4\x96\x87\x96\x3a\x72\xcb\x8f\x13\xc5\xb9\xe5\x67\x13"
- "\x38\x1c\x7d\x7a\x55\xc8\x2d\x0f\x1d\x79\x30\xb8\xa5\x24\xb6\x02"
- "\x85\xdc\xf2\xd3\x8d\xf2\xb9\xe5\xa7\xc7\xe4\x71\x4b\x8c\x39\x31"
- "\x6e\xf9\x59\x17\x7b\xcc\x09\xb9\xe5\x67\xc1\xe2\xdc\xf2\xb3\x51"
- "\x42\x6e\x89\xeb\x17\xe3\x96\x9f\xc5\x09\xea\x77\xe0\x96\x9f\x6d"
- "\x10\x72\x4b\x52\x8e\xe3\x96\x7f\xd6\xb2\xe3\x5d\x5f\xf9\xdc\xf2"
- "\xcf\x5d\xa4\xb9\xe5\x9f\xfd\x84\xdc\xf2\xb3\x1a\xc2\x21\xff\x3c"
- "\x92\x70\xcb\xcf\x4c\xe4\xf8\xc7\x7d\xf8\xc7\x39\x6e\x49\x8e\x73"
- "\xdc\xf2\xcf\x93\xe4\xad\xbf\x69\x93\x7c\x73\x3b\xad\xbf\x69\xab"
- "\x7c\x73\x47\x59\x7f\x73\xb8\xd1\x3d\x5e\x79\xd8\xf4\x68\x5e\x50"
- "\x5b\xe7\x9a\xff\x1c\x45\xb8\xd6\x5f\xb6\xb8\x97\x6b\xfe\xcb\x66"
- "\xf7\xb9\xfe\x97\x47\x39\xae\xff\xe5\x51\xe9\xf5\x04\x7f\x9d\xeb"
- "\x9c\xeb\x17\x2b\x39\xae\xff\x39\x3b\xdf\xf6\xf3\x09\x64\x4c\xfd"
- "\xbc\x8b\x3b\xeb\x09\x36\xdd\x46\xca\xb7\xed\xd7\x13\x9c\x3d\x46"
- "\xd6\x13\x2c\xb3\x5f\x4f\x70\x6c\xad\x70\x3d\xc1\x5f\x2f\x4a\xad"
- "\x27\xc0\xb9\xe7\xe6\xa2\xb0\x44\xbc\x96\x40\x74\x1d\xc1\xcc\xb6"
- "\x5f\x47\x80\x75\xc2\x4e\xc0\x2d\xd6\x0a\x38\xde\x3c\x5c\x5a\xe1"
- "\xc8\x68\x82\xdf\x63\x93\xdd\xd3\x0a\xc7\x26\x09\xb5\xc2\x57\x71"
- "\x8e\x5a\xe1\xd8\x41\xd7\xb5\xc2\xb1\x73\xee\x69\x85\x63\x67\x5d"
- "\xd3\x0a\x9f\x8f\x10\x5f\x47\xf0\xd7\x68\xe9\x75\x04\xe4\x9c\x23"
- "\xc7\xfb\xe2\x1c\xc7\xf1\xbe\x78\xaf\xe3\x6b\x85\x2f\xc6\x88\xf3"
- "\xb9\x2f\x26\x13\xad\xf0\xf9\xf0\xb6\xd7\x0a\x9f\x0f\x17\xd7\x0a"
- "\x5f\x1c\x27\xbc\xea\xf3\xe1\x8e\x79\x68\xb8\x46\x54\x2b\x7c\x71"
- "\xd7\xfe\x1a\xa2\x15\x3e\xd7\x11\xad\x50\xec\x27\xad\x15\x8a\x8b"
- "\x48\x5c\x2b\x66\xbf\x31\x49\x7c\xea\xa8\x15\x8a\xa7\xb7\xae\x15"
- "\x08\x86\x98\x76\x4a\x6a\x85\xe2\x7c\x47\xad\xf0\xd7\x28\x71\xad"
- "\xf0\xe5\x0a\x0e\x47\x5f\x06\x08\xb5\x42\xf1\xe5\x07\x43\x2b\x48"
- "\x62\x6b\x8c\x50\x2b\x1c\xff\x54\xbe\x56\x38\x7e\x55\x9e\x56\xc0"
- "\x98\x13\xd3\x0a\x5f\x8e\x60\xf1\xa3\x13\xd7\x0a\x5f\x4e\x15\xd7"
- "\x0a\x5f\xc6\x09\xb5\x02\xae\x5f\x4c\x2b\x7c\x99\x23\xa8\xdf\x41"
- "\x2b\x7c\x79\x50\xa8\x15\x48\x39\x4e\x2b\x7c\x35\x8d\x1d\xff\xba"
- "\xc8\xd7\x0a\x5f\x8d\x90\xd6\x0a\x5f\x8d\x12\x6a\x85\xaf\xd4\x44"
- "\x13\x7c\x15\x4b\xb4\xc2\x57\x41\xe4\xf8\x5f\x55\xfc\xe3\x9c\x56"
- "\x20\xc7\x39\xad\xf0\x55\x92\xbc\xb9\x29\xae\xe7\xa1\xff\xf3\x73"
- "\x53\x54\x0f\xd9\xdc\x94\x93\xc1\xee\x69\x85\x93\x41\xee\xf3\xd2"
- "\xb2\xa1\x1c\x2f\x2d\x1b\x2a\x3d\x07\xe2\x64\xa3\x73\x5e\x7a\x3a"
- "\x89\xe3\xa5\x25\xe7\x49\xfc\x2e\x39\x46\xe2\x77\xc9\x1a\x57\xe7"
- "\x40\x6c\xba\xc7\x72\x51\xdb\x1c\x88\x95\xec\x1c\x08\xe0\xa3\x84"
- "\x7f\xfe\xdf\x5d\xe1\x1c\x88\xbf\xcd\x95\x9a\x03\x21\x3a\xf7\xc1"
- "\x8e\x73\xda\xf8\xa9\x27\x73\x1f\x1e\x6e\xce\xf9\xd5\x66\xc2\x39"
- "\xff\xef\xb8\x7b\x9c\xf3\xff\x8a\x85\x9c\xb3\xec\x82\x23\xe7\x2c"
- "\x09\x76\x9d\x73\x96\x4c\x70\x8f\x73\x96\x8c\x77\x8d\x73\x96\xec"
- "\x15\x9f\xfb\x70\xd2\x2c\x3d\xf7\x81\x9c\x73\xe4\x0a\xa7\x79\x79"
- "\xc5\xd3\x01\x1d\x9f\x73\x9e\x3a\x2c\xce\x0b\x4e\x1d\x27\x9c\xb3"
- "\x64\x4f\xdb\x73\xce\x92\x3d\xe2\x9c\xf3\x34\x3b\xfe\x97\xec\x71"
- "\xe4\x9c\x70\x8d\x28\xe7\x3c\x1d\x67\x7f\x0d\xe1\x9c\x25\xfb\x08"
- "\xe7\x3c\xbd\x41\x9a\x73\x7e\xdd\x9f\xc4\xac\xd3\xb7\x48\xcc\x22"
- "\x3e\x75\xe4\x9c\xa7\x4f\xb5\xce\x39\x09\x86\x98\x76\x4a\x72\xce"
- "\xaf\xfd\x1c\x39\xe7\x49\x93\x38\xe7\x2c\xbd\xca\xe1\xa8\x74\xa3"
- "\x90\x73\x7e\x3d\xe3\xc1\xe0\x9c\x92\xd8\x3a\x2c\xe4\x9c\xa5\x21"
- "\xf2\x39\x67\xe9\x6c\x79\x9c\x13\x63\x4e\x8c\x73\x96\xee\x65\xf1"
- "\xb3\x4f\x9c\x73\x96\x9e\x14\xe7\x9c\xa5\x17\x84\x9c\x13\xd7\x2f"
- "\xc6\x39\xcb\xba\x08\xea\x77\xe0\x9c\x65\xc1\x42\xce\x49\xca\x71"
- "\x9c\xb3\xac\x84\xc4\xd0\x93\xef\xc9\xe7\x9c\x65\x7b\xa5\x39\x67"
- "\xd9\x41\x21\xe7\x2c\x5b\x4f\xb8\x65\x59\x35\xe1\x9c\x65\xb9\xe4"
- "\xf8\xc9\x02\xfe\x71\x8e\x73\x92\xe3\x1c\xe7\x2c\xab\x73\xc6\x39"
- "\xe9\x4c\x3a\x32\x93\xb2\x1e\x80\xdf\x61\x68\x67\x2f\x18\xdf\x8a"
- "\xe1\xef\x12\x18\xa7\xd4\xf0\x77\xa5\x14\x97\x31\xfa\xd1\x91\x56"
- "\xe0\x25\x56\xb8\x4f\x85\xf1\x66\x71\x71\x6f\x33\xdc\xbb\x3c\x9e"
- "\x70\x16\x3a\xd2\xd7\xdc\x79\xbc\x95\x8e\x85\xf1\x1d\xfe\x4e\x82"
- "\x63\x50\xbe\x3b\x8c\x87\x9a\x95\xa8\xfb\x0d\xaa\x7c\xb3\xad\x1c"
- "\xb4\xb9\xfb\x25\xaa\x7c\x02\xae\xa3\x61\x53\x79\x2e\x3c\x8f\x49"
- "\xb2\xad\x50\x57\xf8\xde\x7e\x68\x8d\x99\xfe\xa1\x78\xf1\x6d\x54"
- "\x43\x95\x5f\xf4\xad\xeb\x3c\x1e\xe2\x10\xc2\x1c\xf1\x40\x6f\xa3"
- "\x12\xd7\x59\xbc\xb8\x09\x9f\x3b\x81\xcf\x59\xa0\x8d\x29\x8b\x10"
- "\x95\x71\xbb\xb3\x0a\x38\x97\x77\x6a\x3d\x5d\xbb\xc4\x0c\x6d\x86"
- "\xf1\xf5\x8b\x7e\x55\xca\x8f\xdf\xad\x62\xc6\x9e\xf2\x7a\x0b\x53"
- "\x87\x66\x31\xd3\x9e\xcb\xbb\xa0\xbc\x58\x1b\x36\xec\x47\x83\xbc"
- "\x43\x68\x83\xbc\xf1\xae\x42\x27\x65\x47\xdf\xb5\xfd\x50\xf1\x53"
- "\x60\x3b\x0d\xa2\xc4\xce\xcb\xbc\x8f\xb3\xf9\x0f\xaa\x77\x7a\xd2"
- "\xf5\xa9\x3b\x10\xb5\xd5\xda\x59\xf5\x15\xc4\xc4\xdd\xdb\x69\x63"
- "\xc3\xa6\x4a\x1f\x83\xd7\xb1\x5c\x6c\xf3\x37\xe1\xfc\xd6\x9e\xb4"
- "\xf1\xce\x3a\x8c\x9b\xca\xa0\xe3\x30\xb6\xdb\xfb\x62\x59\xf4\xa2"
- "\xb9\x9a\xc4\xb8\x45\xf3\x97\xac\x48\xd4\x04\x47\x77\x45\xd3\x96"
- "\x2c\xd1\x2c\x9a\xbb\x78\x95\x86\x7f\x26\x4c\x13\x1d\xb7\x7c\xee"
- "\xbc\xf8\xf9\x83\x17\xbd\x96\xd0\x15\xda\x84\x78\xed\xf0\xc7\x6d"
- "\xb1\x6e\xaa\x1c\xba\x6b\x1b\x42\xef\xf4\x40\x4a\xdc\x2e\xb8\x5f"
- "\xb6\x41\xd9\xf7\x28\xbe\x5f\xc6\x76\xba\x9e\x82\x32\xa9\x10\xd3"
- "\xb6\xa6\x74\x86\xb2\x15\x05\xbb\xa1\x5d\xbb\xa0\xdd\xd0\x46\xdc"
- "\xe6\x62\x5b\x9b\x6d\x98\x48\xc5\x98\x48\xb9\x0d\x18\xac\xbc\xe8"
- "\x6b\xea\x3c\x8e\xa6\x23\xf1\xf3\xd5\x43\x5f\xf1\xba\x42\x9d\x59"
- "\xc5\xe8\x86\x2c\x3a\x12\xae\x35\xdb\x30\x66\xcd\x1e\x67\xa4\xb7"
- "\xd1\x1a\xe0\x95\x5e\x0d\x74\xec\x2f\x00\x9b\x70\xfd\x99\x09\x43"
- "\x10\x4a\xa3\x1b\x22\x99\x6f\x63\xd0\x0d\x80\x61\x82\x53\x38\xf7"
- "\x4d\x9f\x3b\x14\x7a\xbe\x61\xd3\x99\xd1\x06\xb4\x30\x08\xd7\x61"
- "\x80\x63\xd8\xe6\xd6\x82\xf9\x69\xd3\xb5\x28\x6d\x60\x1a\x4a\x6b"
- "\xc0\xd7\x14\x0e\x8c\xf4\x4d\x44\x5e\xe1\x49\xf4\xf7\x10\x77\xbc"
- "\xe8\xfe\xf3\xd3\xe8\xf7\x07\x46\x1a\xa8\x33\x41\xd6\x9c\x71\x46"
- "\x78\x9e\x3a\xa8\x27\xdd\x80\x1a\xce\xe2\x7a\xb6\x6e\x67\x6c\x5f"
- "\x87\x9f\x1d\xec\x03\xfa\x87\x2e\xa6\xd7\xb1\x7d\x28\x53\x63\xb2"
- "\x66\x2e\x41\x15\xca\x7b\x28\xdc\x4c\x37\xd3\x59\x1a\x53\x79\x7d"
- "\x3d\xc4\xb4\x84\xd7\xe8\xae\x95\x2f\xf8\x9a\xe3\xe6\xef\xee\x01"
- "\x7d\x31\x6b\x09\xa2\xb3\x74\xc3\xa7\x87\x20\x35\xd4\x5d\x63\xb3"
- "\x27\xd8\x52\x29\x0f\x47\x67\x6a\xf1\x33\x61\x3c\x40\x7b\x58\x3c"
- "\x7c\x33\xfc\x78\xa2\x23\x1e\x5a\xfa\xe6\xf6\xd0\x28\x33\x1d\x39"
- "\xae\x39\x3b\x34\x97\xf6\x0f\x5d\x9f\x72\x19\x75\xc2\xb6\x2d\x07"
- "\x2d\x90\xb1\x12\x05\x6e\x79\x15\x69\xe6\xac\x52\x23\x63\x4e\x68"
- "\x9a\xef\xda\x34\x2f\xb0\x09\x05\xf1\x65\x28\xc4\xcc\xa1\xcd\x3d"
- "\xc7\x19\x93\xe7\x23\xaa\xe8\xd2\x01\x0a\xf3\x67\x3c\x6f\x05\x6c"
- "\x7d\x77\x17\x5c\x47\xdf\x8c\x44\xd8\x1f\x8c\x2f\x6e\xc6\xa2\xc9"
- "\x71\x30\x3e\x2f\xc0\xe7\xff\x1e\x92\x0f\x75\xca\x7b\xae\x6f\x18"
- "\xfe\x6b\x01\x5f\x0d\x01\x3f\x55\xd4\x58\x98\x3a\x19\x5f\xc5\x73"
- "\xbe\x3a\x06\xed\xe0\xfc\xf5\xcd\x01\xec\x57\x89\x67\x36\x90\x67"
- "\xd6\x05\xd2\xfe\x3a\xa5\xf4\x33\xeb\x10\x79\x66\xef\xdb\xce\x9f"
- "\xf9\xef\x57\x9d\x3f\xf3\xd9\xbe\xf2\x9f\xf9\xef\x87\xe4\x3f\xf3"
- "\xdf\x0b\xa5\x9f\x59\xc7\xfa\x59\x07\x7e\xd6\x39\xf1\xb3\x8e\xf5"
- "\xf3\x63\x97\x9c\x3f\xf3\xd9\x0b\xce\x9f\xf9\x9c\x9f\xfc\x67\x3e"
- "\xbb\x47\xfe\x33\x9f\xcd\x75\xf2\xcc\xac\x9f\xf5\xe0\x67\xbd\x13"
- "\x3f\xeb\x59\x3f\xfb\x7d\xe3\xfc\x99\xcf\x9d\x71\xfe\xcc\xff\xf0"
- "\x96\xff\xcc\xe7\xf2\xe4\x3f\xf3\xb9\xcd\xd2\xcf\xac\x67\xfd\xac"
- "\x07\x3f\xeb\x9d\xf8\x59\xcf\xfa\xf9\xb9\x4d\xce\x9f\xf9\x1f\x27"
- "\x5b\x79\xe6\x46\xf9\xcf\xfc\x8f\x4c\xf9\xcf\xfc\x8f\x34\x27\xcf"
- "\xcc\xfa\x39\x0c\xfc\x1c\xe6\xc4\xcf\x61\xac\x9f\x5f\x79\xd1\xf9"
- "\x33\xff\xf3\x88\xf3\x67\xfe\xe7\x75\xf9\xcf\xfc\xcf\xf5\xf2\x9f"
- "\xf9\x9f\x89\x52\xcf\xdc\x04\x71\xdb\x07\x9e\xa5\xf9\x9f\x91\xe3"
- "\x2c\xfe\xa1\x9b\x7d\x6a\x10\x95\xb7\xce\x1a\xeb\x5b\x8b\xba\xc0"
- "\xb3\xc5\xd2\xdb\x27\x16\xe3\x7f\xad\xfe\xa1\xe9\x4d\xfe\xa1\xb9"
- "\x8d\x3d\x68\xcd\x1b\xb3\x51\x27\xcc\xc7\x37\x5a\x51\xa0\x35\x3b"
- "\x74\xfd\xe6\x97\x90\x26\xd5\x88\xd4\xe5\x29\x06\x94\x92\x40\x1b"
- "\xcb\xd1\x45\xd4\xad\x16\x6b\xcf\x6f\x51\x69\x5d\x09\x5a\xbc\x8c"
- "\xa6\xaf\x50\xe7\xf5\x38\x6f\x02\x3c\x39\x2d\xf3\x1f\x48\x03\xf7"
- "\x18\xba\x0b\x7e\xb8\x1e\xdf\x49\x30\x7e\x6e\x9f\xf8\xe5\xee\x14"
- "\x14\xf8\xf9\x82\x5a\x84\x8f\xe7\xc3\xcf\xb2\x7d\x9c\x31\x65\x36"
- "\xa2\xf6\xdf\xae\xa2\xc8\xd8\x7c\xde\xdb\x7e\x6c\x9e\x34\x17\x6c"
- "\x39\x8f\x39\x37\x35\xef\x25\xb9\xb6\xac\xaa\xb4\x8d\xdd\x8c\x2d"
- "\xab\x2d\x64\xbc\xb7\x1b\xbb\x3f\x87\xfb\x73\xb6\xac\x2a\xc6\xb6"
- "\xa4\xb3\x43\x0b\x2a\x6a\x9b\xb0\x6e\x52\x5f\x49\x42\x14\x1c\x4f"
- "\x28\x4f\xb8\x8d\x24\x6c\x6c\xe0\x6c\xac\xf3\xf1\xa9\xf1\xbe\x2d"
- "\x6e\x63\x9d\xaa\xc9\x5f\x17\xe8\x68\x63\x9d\xd2\x35\x1b\x7f\x9b"
- "\xef\xb9\x8d\xbf\x8d\x93\xb6\xf1\xb7\x9f\xca\xb7\xf1\xb7\xc3\xe5"
- "\xdb\xf8\xdb\x20\x62\x63\x9d\x46\x68\xe3\xf3\x67\xa5\x6d\xac\xe3"
- "\xe1\x58\x07\x38\x7e\xec\x92\x84\x8d\x01\xc7\x3a\x11\x1c\xeb\x5c"
- "\xc4\x71\xb5\x97\xe7\x36\xfe\x57\x99\xb4\x8d\xab\x7b\xc9\xb7\xf1"
- "\xbf\x72\xe5\xdb\xf8\x5f\xe9\xac\x8d\xed\x70\xfc\x2f\x9d\x13\x1b"
- "\xf3\x70\xac\x07\x1c\xfb\x7d\x23\x6e\x63\x3d\xe0\x58\x2f\x82\x63"
- "\xbd\x8b\x38\xbe\x30\xdf\x73\x1b\x5f\x18\x26\x6d\xe3\x0b\x6b\xe4"
- "\xdb\xb8\xda\x2c\xdf\xc6\xd5\x75\xc4\xc6\x7a\x3b\x1c\x57\xe7\x49"
- "\xdb\x58\xcf\xc3\xb1\x1e\x70\xfc\xdc\x26\x09\x1b\x03\x8e\xf5\x22"
- "\x38\xd6\xbb\x88\xe3\xef\x4e\x79\x6e\xe3\xef\x72\xa4\x6d\xfc\xdd"
- "\x45\xf9\x36\xfe\x2e\x4a\xbe\x8d\xbf\x8b\x60\x6d\x6c\x87\xe3\xef"
- "\x90\x13\x1b\xf3\x70\x1c\x06\x38\x7e\xe5\x45\x71\x1b\x87\x01\x8e"
- "\xc3\x44\x70\x1c\xe6\x22\x8e\x0d\x83\x3d\xb7\xf1\xf7\x8d\xd2\x36"
- "\x36\x8c\x95\x6f\xe3\xef\x4f\xc8\xb7\xf1\xf7\x87\x88\x8d\xc3\xec"
- "\x70\xfc\x7d\xb4\x94\x8d\x9b\x41\x03\x76\x03\x1b\x77\xab\x43\x54"
- "\x3e\xb6\x6d\x15\xb1\xad\xa5\xe7\xc4\xe2\x7c\xca\x1a\x8b\x6d\xc2"
- "\xe4\x80\x7e\x0c\xec\x6e\xc9\x0e\xdd\x4c\x53\xf0\x4c\x29\x38\xef"
- "\x6a\x28\x32\xaf\x43\xdd\x35\x29\x38\xff\x7b\x89\x99\x1f\xab\x49"
- "\x79\xeb\x02\xdc\x4f\x81\xf3\x5e\xe6\x2c\x2b\xb2\x04\xfc\xbc\xf2"
- "\x0a\x75\xf1\x32\x1d\x1c\x92\x00\x7a\xb3\x80\x5e\x18\xe8\x5f\x51"
- "\x77\x00\xec\x73\x1a\x95\x57\xfd\x05\x59\x7b\x4e\xfc\x72\x88\x19"
- "\x69\xe9\x1f\xb5\xfe\xa5\x89\x06\x64\x79\x2d\xd0\xa7\x22\xa9\x04"
- "\x55\x24\x7d\x82\xc2\x6b\xe9\x7b\xf4\xbf\xb5\x3e\xcd\x01\x53\x55"
- "\x96\x80\x89\x05\x96\x9c\x99\xb9\xe6\x80\x08\x53\xd1\x4a\x03\xe5"
- "\x63\x42\xda\xf8\x1a\x9a\xce\x98\x87\x94\x19\x97\x90\x6a\xeb\x3c"
- "\xe4\xb3\xf5\x12\x52\x97\xd6\x54\xa1\xb2\x6b\x25\xa8\xec\xf6\x79"
- "\x54\x76\x0f\x7e\x4d\xf0\xb3\xc2\x2f\xed\x3c\xf8\x1a\xa1\xc9\xd7"
- "\x11\xfe\xae\xa8\xf1\xe9\x6a\xe4\x5f\x6a\xae\x42\x78\x4d\xef\x0d"
- "\xea\xe2\x5a\x9f\x28\xe4\x4f\xff\x3b\x10\xd1\xaf\x05\x52\x70\x4e"
- "\x89\x8f\x57\x98\x8d\xa8\xb4\xc6\x84\xcf\x47\xc1\x79\x65\x6a\x0d"
- "\xd4\x6f\x2d\xc1\xdf\x0d\x35\x96\xa6\x9d\x82\xe7\x2b\x32\xd2\x58"
- "\x43\xf7\x0c\x8d\xca\x04\x53\x5b\xe9\xc0\x01\x04\x07\x97\x76\xec"
- "\xb2\xca\xf5\xf5\x45\xb2\xff\xcd\xc2\xc0\x1e\x60\xe7\xde\xd6\x85"
- "\x91\xea\x29\xe7\xbf\xa7\xf1\x1c\x3f\x9c\x4b\x28\xaf\x3f\x8d\xf0"
- "\xbb\xa6\xf0\x55\x08\x4d\xb2\x20\x84\x6d\x51\x91\x54\x8b\xa6\x24"
- "\x20\x5f\x9c\x7f\xb6\xfe\xa8\xed\x51\x51\x63\x44\x6b\xcc\xd0\xc6"
- "\x1b\xa6\x96\x36\x96\xaf\x2f\x47\x70\xae\x77\x79\xac\x01\xf9\x24"
- "\x20\x35\xb6\xaf\x39\x3b\x34\x7d\x0a\xf4\x9f\xc5\xf5\x34\x8d\x6d"
- "\x8b\x6d\x8a\xed\x8b\xeb\xb3\xd9\xbc\x22\xda\x88\x52\x4d\x48\x5d"
- "\x91\x02\xff\x26\xd1\xc6\x0a\x74\x0b\x41\x1b\xb3\x69\xbf\x22\x23"
- "\xe0\xe2\x04\xc6\x82\x81\x32\x14\x82\xff\x7b\x88\x63\x4a\xa7\x24"
- "\x98\xf2\xbe\xdd\x3a\xa6\x74\x3e\x1c\xa6\xfe\xed\xc5\x61\xaa\xe6"
- "\x82\x34\xa6\x6a\xf4\x04\x53\x3a\x4d\xc7\xc4\xd4\xbf\xcf\x39\xc7"
- "\xd4\xbf\x0f\x49\x63\x4a\x17\x08\x98\x32\x08\x31\x55\x73\x5d\x3e"
- "\xa6\x6a\x94\xed\x87\x29\x9d\xca\x3d\x4c\xfd\xbb\x56\x88\xa9\x4b"
- "\x26\x27\x98\x62\xe3\xd4\x63\x97\x5c\xc0\x14\x2f\x4e\x5d\x9e\xce"
- "\x61\xea\x87\x61\xd2\x98\xba\xb2\x85\xc5\x54\x07\x8d\x53\x57\x42"
- "\x9c\x63\xea\x8a\xca\x09\xa6\x20\x4e\xe9\xec\xe2\xd4\x0f\x2f\xc8"
- "\xc7\xd4\x95\xc8\x76\xc4\x94\x9b\x71\xea\xca\x48\x21\xa6\x2e\x4f"
- "\x92\xc6\x94\x9e\x8d\x53\x7e\xdf\xb4\x8e\x29\x3d\x2f\x4e\xfd\xb0"
- "\x97\xc3\xd4\xd5\x0d\xd2\x98\xaa\xbd\x48\x30\xa5\xef\xa0\x71\xaa"
- "\x76\x8d\x73\x4c\xd5\xce\x92\xc6\x94\x1e\xe2\x94\xce\x2e\x4e\x5d"
- "\xcd\x91\x8f\xa9\xda\x7d\xed\x87\x29\xbd\x9b\x71\xaa\x36\x53\x88"
- "\xa9\x1f\x0a\x9c\x60\x8a\x8d\x53\xcf\x6d\x72\x01\x53\xbc\x38\x75"
- "\xd5\xc2\x61\xea\xc7\xf3\xd2\x98\xfa\x71\x04\x8b\xa9\x0e\x1a\xa7"
- "\xae\x9d\x71\x8e\xa9\x6b\x07\x9c\x60\x0a\xe2\x94\xde\x2e\x4e\xfd"
- "\x78\x55\x3e\xa6\x7e\x44\xed\x88\x29\x37\xe3\xd4\xb5\x1a\x21\xa6"
- "\xae\xd6\x4b\x63\x2a\x8c\x8d\x53\xaf\xbc\xd8\x3a\xa6\xc2\x78\x71"
- "\xaa\x6e\x2a\x87\xa9\x1b\x83\xa5\x31\x75\x7d\x23\xc1\x54\x58\x07"
- "\x8d\x53\xd7\x83\x9d\x63\xea\xba\x52\x1a\x53\x61\x10\xa7\xf4\x76"
- "\x71\xea\xc6\x28\xf9\x98\xba\x3e\xad\xfd\x30\x15\xe6\x66\x9c\xba"
- "\xae\x13\x62\xaa\x6e\xbc\x14\xa6\x9a\xb0\xee\xf3\x02\x4c\xc5\x82"
- "\xee\x03\x0c\xf9\x56\x12\x4c\x35\x03\xa6\x76\xf2\x31\xf5\x2f\x7b"
- "\xdd\x77\xe3\x7d\x6b\x0b\xa6\x8c\x07\xed\x31\x65\x05\x4c\x35\x33"
- "\x98\xba\x79\xca\xa6\xfb\x2a\xea\x0a\xc0\x57\xd7\x50\x45\x04\xe0"
- "\x69\x3b\x8b\xa7\x7f\x01\x9e\xe0\x79\xac\xf0\xbc\xa5\xd5\x55\x28"
- "\xdc\x48\x9e\xab\x09\x9e\xd7\xca\xc7\x52\x53\x2d\x85\x31\x84\xb1"
- "\x63\xc3\x51\xd9\x62\xc0\xcf\xb2\x33\xa8\x6c\x25\xfc\x56\xc3\x2f"
- "\x05\x7e\xe8\x0c\x2a\xad\x45\x4c\xce\x9e\xc3\x4f\x25\x8b\x9f\x9b"
- "\xf3\x9d\xe3\xe7\xe6\x18\x79\x1a\xcf\x78\x5c\x3e\x7e\x6e\x66\xb3"
- "\x73\xe9\xd4\xe1\x53\xbf\xa7\xf1\xbc\x59\x82\x91\x6b\x28\xdc\x8c"
- "\x7c\xe9\x57\xb4\x3d\x7c\x22\x91\xfa\x0d\x0b\xa2\xb6\xcc\x43\xea"
- "\x2d\xdf\xc2\xf3\xda\xfa\xce\x25\xe4\x73\xda\xf4\x17\x54\x7a\xbb"
- "\x0a\x95\xde\x3b\x85\x4a\xad\xf0\xbb\x06\x3f\x68\x63\xf8\x7c\xfe"
- "\xf3\x1a\xd9\xe7\x35\x4e\x87\xba\x82\xa4\x9f\xd7\x38\x9c\x79\xde"
- "\x68\x78\xde\x26\xee\x79\x2b\x00\x8b\xe0\x97\xde\x56\x56\x27\x86"
- "\x1b\x51\x97\x25\x66\x9a\x6e\x62\x31\x88\xfd\x72\xfa\xac\x09\x85"
- "\x27\x80\xaf\x5e\x03\x0c\xd6\xec\x41\xa9\xc9\x80\xc1\x26\x13\x7e"
- "\xaf\x6f\xac\x48\x6b\x04\x0c\xde\x4c\xa2\xc1\x6e\xcd\x18\x83\xff"
- "\xc2\x18\xbc\x91\x67\x95\xc4\x20\xe8\x44\x06\x83\xa0\x13\x5b\xc5"
- "\x20\x5f\x27\xde\x0a\xe1\x30\x78\x67\x84\x34\x06\x6f\x4f\xb6\xe9"
- "\xc4\xff\x3c\x06\x6f\x5d\x75\x8e\xc1\x5b\x25\xf2\x34\xe1\x9d\xb1"
- "\xf2\x31\x78\x3b\xb0\xfd\x30\x78\xfb\xbc\x73\x0c\xde\x3e\xdc\x3a"
- "\x06\x75\x2a\xf7\x30\x78\xcb\x2c\xc4\xe0\x2d\x8d\x13\x0c\xb2\x71"
- "\x10\x74\x65\xeb\x18\xe4\xc5\xc1\x3b\x45\x1c\x06\xef\x1e\x91\xc6"
- "\x60\xfd\x19\x9b\xae\xfc\xcf\x63\xb0\x7e\x91\x73\x0c\xd6\x4f\x92"
- "\xa7\x21\xef\x9e\x92\x8f\xc1\xfa\xbc\xf6\xc3\xe0\xdd\xd9\xce\x31"
- "\x78\x77\xa4\x0b\x18\x74\x33\x0e\xd6\xa7\x09\x31\x78\xa7\x50\x1a"
- "\x83\x7a\x36\x0e\x82\x0e\x6d\x15\x83\x7c\x1d\x7a\x6f\x18\x87\x41"
- "\xd3\x28\x69\x0c\x36\x4c\xb7\xe9\xd0\xff\x3c\x06\xef\xdd\x72\x8e"
- "\xc1\x7b\x95\xf2\x34\xa7\x69\xb2\x7c\x0c\x36\x68\xda\x0f\x83\x0d"
- "\x17\x9d\x63\xb0\xa1\xb8\x75\x0c\xea\xdd\x8c\x83\x0d\x4a\x21\x06"
- "\xef\x69\x9d\x60\x90\x8d\x83\xa0\x5b\x5b\xc7\x20\x2f\x0e\x9a\x3e"
- "\xe5\x30\xd8\x74\x5c\x1a\x83\x8d\xe7\x6d\xba\xf5\x3f\x8f\xc1\xc6"
- "\x15\xce\x31\xd8\x38\x4d\x9e\x46\x6d\x3a\x23\x1f\x83\x8d\x85\xed"
- "\x87\xc1\xa6\xf9\xce\x31\xd8\x34\xc6\x05\x0c\xba\x19\x07\x1b\xd3"
- "\x85\x18\x34\xed\x93\xc6\x60\x18\x1b\x07\x41\xe7\xb6\x8a\x41\xbe"
- "\xce\x6d\xd6\x73\x18\xb4\x8c\x95\xc6\xa0\x79\xb6\x4d\xe7\xfe\xe7"
- "\x31\xd8\xdc\xe8\x1c\x83\xcd\x55\xf2\x34\xad\x65\xba\x7c\x0c\x9a"
- "\xb5\xed\x87\x41\xf3\x55\xe7\x18\x34\x97\xb4\x8e\xc1\x30\x37\xe3"
- "\xa0\xd9\x47\x88\xc1\xe6\xa1\x52\x18\xb4\x82\x2e\x6e\x2e\x0c\x49"
- "\xb0\x66\x4f\x55\xf9\x7a\x69\x90\xd9\xff\xe7\x95\x15\x89\xf5\x68"
- "\xca\x5d\xb0\x4f\xc2\x5d\xf4\xea\x5d\x35\xb2\x64\x47\x98\x40\x17"
- "\xa6\xf3\xf4\x33\x33\xb7\xcc\x9c\x59\x64\xdc\xba\x18\x29\x41\x7f"
- "\x7f\x89\x8f\x55\x5c\x31\x21\x7c\xff\x35\xb8\x3d\xd7\xb8\xf6\xe0"
- "\x3c\x01\x7d\x53\xab\x66\xde\x31\x37\x19\x50\xcd\x48\xa4\x28\xad"
- "\x31\x80\x1d\x56\x33\xfe\xc5\x76\xb9\x42\x59\xb5\xbb\x6f\x20\xa5"
- "\xf9\xdf\x81\xbd\xc1\xde\xfe\xdd\x5e\x47\x5e\x7d\x6a\x68\x2b\xb6"
- "\x2b\xb6\x17\xb6\xb1\x66\x35\x7e\x77\x6d\x5d\x55\x0e\x18\x33\xff"
- "\x5b\xdb\x7b\x17\x94\x13\xd7\xab\xd6\xb5\xf2\xb1\x61\x1d\x43\xd6"
- "\x2d\x58\x35\xa5\xd5\x48\xf4\xdd\xb1\x15\xf4\x9b\x6b\xb6\xd2\xa9"
- "\x78\x3a\xef\x3e\xd8\x8a\x9e\xe6\x9a\xad\xe8\xf7\x85\xb6\x12\xd3"
- "\x55\x74\x91\x7c\x5b\xd1\x09\xc4\x56\xf4\x24\x27\xb6\x72\x11\x57"
- "\xba\x74\x9e\x1e\x69\x7b\x5b\x29\x50\x9a\x4b\xb6\x52\xa0\x33\x76"
- "\xb6\x72\xe4\xff\x0a\x74\x5e\xb6\xad\x14\x88\xec\x05\xaa\x40\x49"
- "\xd2\xb6\xd2\xbb\x88\x2b\xbd\x8a\xc7\x9b\xef\x83\xad\xbc\xf6\xb9"
- "\x66\x2b\x2f\x8b\xd0\x56\x22\x3c\x55\x41\x79\xcb\xb7\x95\x17\xf9"
- "\x1e\x9e\xc2\xab\xd0\x89\xad\x5c\xc4\x95\x3e\x9d\xc7\xef\xee\x83"
- "\xad\xa8\x2a\xd7\x6c\xa5\x08\xb1\xb3\x95\x23\x9f\x52\x28\x86\xc9"
- "\xb7\x15\x55\x4f\x6c\x45\x55\x4a\xdb\x2a\xcc\x45\x5c\x85\xa9\x78"
- "\x3c\xe4\x3e\xd8\x4a\xa9\x74\xcd\x56\xca\xe9\x42\x5b\x89\x8c\xfb"
- "\x0a\xe5\x6c\xf9\xb6\x52\x6a\x88\xad\x14\x66\x29\x5b\x59\xb2\x43"
- "\xd7\xfb\x82\x0d\x1a\xb7\x87\x46\xf9\x26\x21\xaa\x29\x08\xec\xe6"
- "\x0f\x76\x5b\xab\x41\xcd\xd9\x60\x37\xa3\x19\x4d\x59\xfa\x3d\x5d"
- "\x5e\x67\x41\x4d\x60\xb3\x46\xff\xd0\xf4\x0a\x63\x2d\x9e\x73\xf4"
- "\xf3\x4b\x8a\x4e\xa3\x5e\x59\xaa\x46\xd8\x6e\xd8\x0e\xd8\x76\x34"
- "\xd8\x8d\xb1\xa3\xff\xcc\x5c\x8b\xff\xc4\x82\xc9\xd7\xbf\xa7\x97"
- "\x18\x68\x1a\x3f\x2f\xad\xb6\x22\xfc\x5e\x20\xbc\x16\x75\xd1\xbc"
- "\x84\x9f\xc9\xfb\x3a\x3e\x5e\x61\xac\x02\x7e\x70\x1b\x31\xdc\xec"
- "\x7b\xad\xbf\xe5\xb7\x5a\x1f\x4b\x45\xe4\x38\xba\x07\xad\x31\xf7"
- "\x1c\x67\x4c\xbd\x8e\x3a\x61\xfe\x90\x61\x45\x81\x6b\x16\x21\x6a"
- "\xff\x82\x62\x8a\x59\xbb\xb6\x8c\xa9\xe3\x08\xd8\x25\x90\xbe\xc3"
- "\x9b\xd3\x7d\x27\x16\x55\x5c\xc9\x64\xfc\x66\xcf\x11\x18\xbf\xfd"
- "\x53\xab\x06\x9e\x39\x94\xf6\x0f\xcd\xcd\x2c\x47\x1a\xba\x19\x6c"
- "\x8c\xd7\x13\x29\x3a\xbd\xbf\xbb\x49\xae\x8d\xbd\x99\xf9\xdf\x56"
- "\x0d\x3b\x7f\x0b\xec\x84\xef\xcf\xcc\xdf\x4a\xe0\xcd\xdf\x82\x36"
- "\xb7\xcc\xdf\x52\x78\x8f\xc7\xf3\xb7\xac\xdf\x07\xf6\xb6\x3d\xfb"
- "\x92\x78\x9a\x86\x67\xef\x51\x5e\x6f\x44\xf8\xf9\xcb\xeb\x8b\x51"
- "\x6a\x22\x52\x97\x37\xd5\xa2\x94\x7a\xda\x58\x9e\x76\x15\x85\xdf"
- "\xc5\x3c\x18\xe3\xa5\xd3\x08\xe2\x57\x6f\x95\xf5\x7b\x6d\x6f\x83"
- "\xa2\xd3\xa0\xf2\x4a\x84\x78\xeb\x78\x62\x81\x33\xab\xc0\x0f\xb1"
- "\x15\x69\x97\x10\xdd\xf3\xd7\x9a\x0a\xf3\xb7\xd8\x4f\xb1\x70\x7e"
- "\x64\x0b\xbf\xee\xf9\xeb\x01\xf8\x18\xf6\x19\x7e\xdf\x84\xf7\x0e"
- "\xd8\xcd\xe3\xdf\x18\x17\xbe\x49\x69\xa8\x22\xa9\x09\x95\x9b\x11"
- "\x02\x3c\x1d\xfa\x3a\xb2\x4a\x02\x47\x3a\x25\x8b\x23\x83\x6f\x92"
- "\xf7\xed\xd6\x71\xa4\x53\x71\x38\x52\x6d\xf0\x0c\x47\xaa\x11\x9e"
- "\xe3\x48\xe5\xe5\x3e\x8e\x74\x81\x42\x1c\xa9\xae\xcb\xc7\x51\xe7"
- "\x52\xf9\x38\xea\x9c\xe9\x19\x8e\x54\x6b\x08\x8e\x3a\x47\x10\x1c"
- "\xa9\x12\x39\x1c\x31\x6b\xa3\xee\x13\x8e\x3a\x99\x9d\xe0\x88\x8d"
- "\x47\x3a\x88\x47\x8f\x5d\x72\x01\x47\xbc\x78\xd4\xb5\xcc\x33\x1c"
- "\x75\x5d\xe3\x39\x8e\xba\x4e\xf0\x00\x47\x76\xf1\xe8\xb1\x11\xf2"
- "\x71\xd4\xd5\x5f\x3e\x8e\xba\x54\x79\x86\xa3\xae\x27\x09\x8e\xba"
- "\xe4\x12\x1c\x75\x3d\xca\xe1\x88\x59\x6f\x76\x9f\x70\xd4\x65\x8c"
- "\x34\x8e\xf4\x6c\x3c\xd2\x41\x3c\xf2\xfb\xa6\x75\x1c\xe9\x79\xf1"
- "\xa8\x5b\x80\x67\x38\xf2\x39\xe9\x39\x8e\x7c\xb2\xdc\xc7\x91\xde"
- "\x2e\x1e\x75\x5b\x23\x1f\x47\x3e\xb3\xe4\xe3\xc8\x47\xe3\x19\x8e"
- "\xba\x75\x23\x38\x7a\xcc\x40\x70\xd4\x4d\xc9\xe1\x88\x59\xc3\x77"
- "\x9f\x70\xf4\xd8\x66\x27\x38\x62\xe3\x91\x1e\xe2\xd1\x73\x9b\x5c"
- "\xc0\x11\x2f\x1e\xf9\xce\xf6\x0c\x47\xbe\xdd\x3c\xc7\x51\xf7\xf3"
- "\x1e\xe0\xc8\x2e\x1e\xf9\x9e\x94\x8f\xa3\xee\x85\xf2\x71\xd4\x3d"
- "\xd6\x33\x1c\xf9\x4e\x27\x38\xea\xae\x25\x38\xf2\x9d\xc4\xe1\x88"
- "\x59\x17\x79\x9f\x70\xd4\xed\xac\x34\x8e\xc2\xd8\x78\xa4\x87\x78"
- "\xf4\xca\x8b\xad\xe3\x28\x8c\x17\x8f\xfc\xde\xf7\x0c\x47\x7e\xd3"
- "\x3d\xc7\x91\x5f\x7f\xf7\x71\x14\x66\x17\x8f\x7a\x74\x93\x8f\x23"
- "\x75\x9d\x7c\x1c\xa9\x0f\x78\x86\x23\xbf\x7c\x82\x23\x75\x02\xc1"
- "\x91\x5f\x36\x87\x23\x66\xad\xe9\x7d\xc2\x91\xba\x8f\x14\x8e\xf0"
- "\x5e\x04\xef\x90\x7d\x21\xea\xb7\xae\x46\xba\xdd\xf8\xdf\x26\x34"
- "\xb4\x21\xa3\xc7\x98\xe3\xc9\x64\x3f\x00\x83\xa2\x07\x93\xef\x15"
- "\xbb\xfe\xb1\xbd\xe0\x17\xff\xd0\xb4\xf0\x0b\x64\x8f\x06\xbc\x2f"
- "\xc8\x9d\xd4\x58\x34\x04\xef\xcb\xa0\xf8\x49\x32\xde\xc7\xaa\x65"
- "\xef\x00\x7f\x89\xbd\x03\x66\x4a\xef\x1d\xd0\xb4\xdd\xb6\xee\x76"
- "\x0f\xb7\xee\x56\xf1\x93\x09\x4e\xd7\xdd\x2a\x7e\x32\x2c\x7f\xa6"
- "\x5c\x3c\xf4\x60\xd6\x7f\xdd\xe9\x19\x1a\xd5\x90\xf1\x93\xd1\xf0"
- "\xff\x40\xf2\xec\x3f\x61\xf6\x0f\x6e\x7d\x3d\xee\x1e\x1e\x4e\x7a"
- "\xd4\x4d\x9f\x85\xd2\xe8\x4d\xdf\x8c\xa6\x03\x42\xd3\xe8\x9c\xd0"
- "\x4c\x79\x6d\xf9\x89\xe4\xf7\x0f\x89\xbd\x75\x48\xdc\xde\xfe\x75"
- "\xac\xbd\xc9\x3a\x67\x7f\x89\x7d\x0b\x66\x4a\xef\x5b\x20\x6e\x6f"
- "\x7f\xe7\xeb\x9c\x15\xfe\xef\xc9\xb7\xb7\x7f\x3c\x6b\x6f\x43\x43"
- "\x86\xff\x01\xce\xde\x01\x83\xe4\xdb\xdb\x7f\x16\xb1\xf7\xdf\x87"
- "\xd3\x01\x3a\x44\xe7\xe8\xd4\x32\xdb\x22\xb9\xff\x37\x6b\x6f\x09"
- "\x7c\xf7\x9c\x45\xec\xcd\xee\x99\xe0\x2f\xb1\x67\xc2\x4c\xe9\x3d"
- "\x13\xc4\xed\xdd\x33\xc4\xb9\xbd\x7b\xfa\xc9\xb7\x77\x40\x35\xb1"
- "\xb7\x0e\xf0\xdd\x53\xc3\xd9\xbb\xa7\x8b\xfb\x0a\xf0\xed\x1d\x50"
- "\x4a\xec\x7d\x56\x0b\xf6\x06\x7c\xeb\x64\xe2\xbb\x67\xac\x73\x7b"
- "\xeb\x25\xf0\xfd\x78\x29\x6b\x6f\x16\xdf\x12\xfb\x35\xcc\x94\xde"
- "\xaf\x41\xdc\xde\x8f\xef\x70\x6e\xef\xc7\xd7\xca\xb7\xf7\xe3\x93"
- "\x58\x7b\x03\xbe\x1f\xcf\xe4\xec\x1d\xe8\x23\xdf\xde\x8f\x8f\x24"
- "\xf6\x3e\xd7\x87\x0e\xd0\x03\xbe\xf5\x32\xf1\xfd\x78\x55\x2b\xf6"
- "\x96\xc0\x77\xaf\x91\xc4\xde\xec\x5e\x11\xfe\x12\x7b\x45\xcc\x94"
- "\xde\x2b\x42\xdc\xde\xbd\xba\x38\xb7\x77\xe0\x2d\xf9\xf6\x0e\x3c"
- "\x4a\xec\xad\x07\x7c\xf7\x42\x9c\xbd\x7b\x25\xcb\xb7\x77\xe0\x3e"
- "\x62\xef\x7f\xa8\xc1\xde\x80\x6f\xbd\x4c\x7c\xf7\x1a\xef\xdc\xde"
- "\x61\x12\xf8\xee\xbd\x8f\xb5\x37\x8b\x6f\x89\x7d\x2a\x66\x4a\xef"
- "\x53\x21\x6e\xef\xde\xab\x9c\xdb\xbb\xf7\x5c\xf9\xf6\xee\x3d\x88"
- "\xb5\x37\xe0\xbb\x77\x02\x67\xef\xde\x75\xf2\xed\xdd\xbb\x0f\xb1"
- "\xf7\x3f\x95\x74\x40\x18\xe0\x3b\x4c\x26\xbe\x7b\x1f\x96\xb2\xb7"
- "\x2f\xd8\xfb\x24\x20\x00\x78\x47\xba\x35\x1b\x78\x8a\x45\x68\xf7"
- "\x8a\x24\x1d\xfa\xd9\x3d\x6c\xfb\x3e\xb9\x30\x56\xa7\xb7\xdb\x7e"
- "\x19\x8a\x3e\x6b\x3d\x5e\x3b\xac\xe8\x33\x59\x72\xed\xb0\xa2\xcf"
- "\x08\xd9\x6b\x87\x15\x7d\x10\xc7\x81\xfa\x8c\xe1\x7c\xda\x87\x89"
- "\x1f\xb2\xd6\x14\x2b\xfe\x9f\x51\x74\x1f\x0d\xc5\xff\x2b\xc0\x6b"
- "\x8a\xc1\xd7\x26\x6b\x8e\x3b\xdc\xa8\x4f\x61\xeb\xbe\xd6\xa9\xac"
- "\xd9\xc0\x91\x24\x7d\xdd\x6f\x3d\x8c\x5b\xed\xb7\x6f\x87\xa2\xdf"
- "\x22\xcf\x7d\xdd\x4f\x2f\xed\xeb\x7e\xfd\xe5\xfb\xba\x6f\x1d\xc7"
- "\xbf\xfa\x0d\xe5\x7c\xdd\x4f\xfe\xfa\x71\x45\xdf\x6a\xd1\xfd\x3c"
- "\x14\x7d\x37\x13\x5f\x9f\x9f\x65\xcd\x71\x87\x97\xf5\xcb\x74\xc1"
- "\xd7\xd0\xaf\x75\x4e\xfa\xb5\x26\x01\x7c\x9d\xde\x6e\xfb\x87\x28"
- "\x34\x33\x3c\xf7\xb5\x26\x58\xda\xd7\x9a\x6e\xf2\x7d\xfd\xd3\x2a"
- "\x8e\xfb\x69\xfa\x70\xbe\xd6\x1c\x90\xef\xeb\x9f\x96\x88\xee\x2b"
- "\xa2\xf8\x69\x12\xf1\xf5\xb7\xc5\xe0\x6b\x37\x38\xa1\x26\xb9\x75"
- "\x5f\xeb\xa1\x5f\xeb\x9d\xf4\xeb\x01\xb3\x60\xbc\x6e\xbf\x7d\x4c"
- "\x14\x03\xc6\x7a\xee\xeb\x01\x7e\xd2\xbe\xee\xdf\x28\xdf\xd7\xfd"
- "\x4f\x70\xbc\x73\x80\x8a\xf3\xf5\x80\x3c\xf9\xbe\xee\x7f\x48\x74"
- "\x7f\x13\x45\xff\x68\xe2\xeb\xea\x20\x6b\x8e\x3b\x7c\x74\x80\x24"
- "\xff\xe7\xf9\x1a\xfa\xb5\xde\x49\xbf\x0e\x1a\x0f\xbe\x4e\x6f\xb7"
- "\xfd\x54\x14\x41\xc3\x3c\xf7\xf5\x13\x16\x69\x5f\x3f\x71\x59\xbe"
- "\xaf\x9f\x38\xc0\x71\xde\x27\xea\x39\x5f\x07\xa5\xcb\xf7\xf5\x13"
- "\x05\xa2\xfb\xac\x28\x9e\x88\x20\xbe\xbe\x90\x0e\xbe\x76\x83\x0b"
- "\x07\x4d\x6b\xdd\xd7\x61\xd0\xaf\xc3\x9c\xf4\xeb\x27\x41\xd7\x87"
- "\xb5\xdf\xbe\x2e\x8a\x27\xfb\x7a\xee\xeb\xe0\xab\xd2\xbe\x0e\x3e"
- "\x23\xdf\xd7\xc1\x79\x1c\xdf\x0e\x36\x70\xbe\x7e\x32\x51\xbe\xaf"
- "\x83\x37\x8b\xee\xf7\xa2\x08\x1e\x49\x7c\xfd\x5d\x9d\x35\xc7\x1d"
- "\x1e\xfe\xe4\x68\x77\x78\xf8\xf2\x7c\xa4\x12\xfa\x5b\x1b\xd4\xbe"
- "\x5c\x5c\xdb\xcd\x73\x7f\x0f\x3c\x2f\xed\xef\x81\xc7\xe5\xfb\x7b"
- "\xe0\x66\x8e\x8b\x0f\xac\xe4\xfc\xad\x8d\x96\xef\xef\x81\xc9\xe2"
- "\x5c\x7c\xe0\x20\xcf\xb8\xb8\x76\xa8\x3b\x5c\xdc\xd1\xdf\x4f\xf9"
- "\xb7\x2f\x1f\x0f\xb1\x78\xee\xef\x90\x53\xd2\xfe\x0e\x39\x28\xdf"
- "\xdf\x21\xc9\x1c\x1f\x0f\x29\xe6\xfc\xfd\xd4\x34\xf9\xfe\x0e\x89"
- "\x17\xe7\xe3\x21\x7d\x3c\xe3\xe3\x4f\x69\xdc\xe1\xe3\x8e\xfe\x1e"
- "\xa4\x6c\x5f\x4e\xfe\xf4\x75\xcf\xfd\xfd\xf4\x11\x69\x7f\x3f\xfd"
- "\x9e\x7c\x7f\x3f\x1d\xcf\x71\xf2\xa7\x79\xf9\xef\x41\x63\xe4\xfb"
- "\xfb\xe9\x59\xe2\x9c\xfc\x69\x1f\xcf\x38\xf9\x20\xb5\x3b\x9c\xdc"
- "\xd1\xdf\x83\xeb\xdb\x97\x97\x0f\xbe\xe0\xb9\xbf\x07\xef\x95\xf6"
- "\xf7\xe0\x2c\xf9\xfe\x1e\x3c\x8b\xe3\xe5\x83\x0b\x38\x7f\xff\x4c"
- "\xfe\xfe\x99\x8a\xc1\x93\xc4\x79\xf9\x20\xb3\x67\xbc\xfc\x67\xc8"
- "\x1d\x5e\xee\xe8\xef\x21\x35\xed\xcb\xcd\x87\x94\x79\xee\xef\x21"
- "\x3b\xa4\xfd\x3d\x64\xad\x7c\x7f\x0f\x99\xc4\x71\xf3\x21\xbc\xfc"
- "\xff\xd0\x20\xf9\xfe\x1e\x32\x52\x9c\x9b\xff\xac\xce\x33\x6e\x3e"
- "\xc4\xe8\x0e\x37\x77\xf4\xf7\xb0\xb3\xed\xcb\xcf\x87\x1d\xf3\xdc"
- "\xdf\xc3\x36\x4a\xfb\x7b\xd8\x52\xf9\xfe\x1e\x36\x92\xe3\xe7\xc3"
- "\xd2\x38\x7f\x3f\xe3\x2f\xdf\xdf\xc3\x06\x89\xf3\xf3\xa1\xd5\x9e"
- "\xf1\xf3\x61\x06\xcf\xf3\xe4\xc3\x0f\x60\x6e\x2e\x77\xff\xc7\x8a"
- "\x44\x76\xcd\x9d\xe2\x19\x6e\xff\x47\xc5\x70\xe6\xdb\x2a\xa2\x7b"
- "\xcb\x28\x9e\xb5\x74\xe8\xfd\x1f\x15\xcf\x3a\xdf\xff\x51\xf1\xac"
- "\xbc\xfd\x1f\x15\xcf\x5e\x96\x3f\x1f\xff\xd9\x03\x9c\x46\x78\x96"
- "\xa7\xff\x87\x33\xfd\xba\x43\xef\x0b\xa9\x78\x56\xb8\x2f\xa4\xe2"
- "\x19\x66\x5f\x48\x7a\x93\x21\xc2\x3d\x2d\x32\xfc\xa8\xe7\xef\x05"
- "\x42\x37\x63\x1d\x22\x77\x1f\x4a\x0e\xdb\x23\x36\x72\xd8\x0e\x5d"
- "\x23\x8d\xed\xe7\xce\x77\xe8\x7d\x28\x15\xcf\xcd\x76\x8e\xed\xe7"
- "\x46\xca\xda\x73\x44\xf1\x9c\xfc\x7d\x6f\x14\xcf\x6d\xe6\xf4\xd0"
- "\x73\x3c\xfd\x1b\x5a\xda\x7e\xd8\x76\x73\x7f\x4a\xc5\x73\x09\x42"
- "\x6c\x8f\x48\x23\xd8\xbe\x54\xe8\x9e\xee\x0a\xcd\xf5\xfc\x3d\x48"
- "\x58\x2c\xd6\x5c\x72\xf7\xc3\xe4\xb0\xad\x9b\xcf\x61\x3b\x6c\x86"
- "\x34\xb6\xf5\x9f\x76\xe8\xfd\x30\x15\x7a\xbd\x73\x6c\xeb\x03\x65"
- "\xed\x65\xa2\xd0\xe7\xcb\xc7\xb6\x3e\x96\xd3\x7e\xfa\x7d\x1c\xb6"
- "\xc3\xf6\xb4\x23\xb6\xdd\x8c\xdb\xfa\x49\x42\x6c\xeb\x66\x11\x6c"
- "\xd7\x98\xdc\xd3\x98\x61\x89\x9e\xbf\xf7\x19\x35\x06\xeb\x4b\xb9"
- "\xfb\x72\x72\xd8\xfe\xf9\x0b\x1c\xb6\x47\x39\xec\x0b\xc5\x61\x7b"
- "\x64\x56\x87\xde\x97\x53\x31\x32\xc0\x39\xb6\x7f\x5e\x2f\x6b\x8f"
- "\x14\xc5\xc8\x55\xf2\xb1\x3d\x72\x0c\xa7\x73\x47\xa6\x73\xd8\x1e"
- "\xb5\xbe\xfd\xb0\xed\xe6\x7e\x9d\x8a\x91\x5a\x21\xb6\x7f\xae\x23"
- "\xd8\xfe\x61\x92\x7b\x7a\x7a\x54\x84\xe7\xef\xb9\x46\x6b\xb0\x96"
- "\x96\xbb\x3f\x28\x87\xed\x5f\xf4\xe5\xb0\x3d\xda\x4f\x1a\xdb\xcf"
- "\x2f\xea\xd0\xfb\x83\x2a\x7e\xe1\x7c\xff\x1f\xc5\x2f\x9c\xed\xff"
- "\x23\xb2\x56\xf8\x79\xf9\xfb\x5e\x28\x9e\xd7\x70\x9a\xfe\xf9\x68"
- "\x0e\xdb\xa3\xa3\xda\x11\xdb\x6e\xc6\xed\xe7\x95\x42\x6c\xff\xc2"
- "\x9f\x60\xfb\x6a\x81\x7b\xb9\x83\xd1\x83\x3c\x7f\xaf\xf7\xa2\x19"
- "\xe7\x0d\xe4\xee\x53\xca\x61\x7b\x74\x23\x87\xed\x17\xaf\x4b\x63"
- "\xfb\xc5\x09\x1d\x7a\x9f\x52\xc5\x0b\x65\xce\xb1\xfd\xc2\x3e\x59"
- "\x7b\xba\x28\x5e\x74\x63\x1d\xfc\x0b\x66\x2e\x7f\xf1\x22\x6f\xfe"
- "\xfb\x2f\x47\xb6\x1f\xb6\xdd\xdc\xbf\x54\xf1\x82\x41\x88\xed\xd1"
- "\x46\x82\xed\x1f\xeb\xdd\xcb\x93\xfc\x52\xe5\x79\x9e\xe4\x57\x2a"
- "\xe6\x1d\xa6\xcc\xfd\x52\x39\x6c\xff\xf2\x5c\xcb\xde\x44\x8a\xb1"
- "\x8d\xf6\xd8\x6e\xd9\x9b\x48\x31\xd6\xaf\xc3\xec\x97\xaa\x18\x93"
- "\xe3\x1c\xc7\x63\x12\xe5\xe5\x44\xc6\x34\xca\xc7\xf1\x98\x13\x5c"
- "\x4e\x64\x2c\x6f\xfe\xcb\xaf\x6c\xdf\x24\xbf\xff\x7b\x16\x29\xc6"
- "\xe6\x3b\xdd\xb3\x48\x31\x36\xf9\xbe\xed\xa3\xaa\x18\xb3\x47\xb0"
- "\x67\x91\xe2\x97\xa5\x56\xa6\x2f\xdc\x18\xef\x5e\x5e\xe5\x57\xfe"
- "\x9e\xe7\x55\x26\x90\xf7\xbb\x32\xf7\x6d\xe5\xfa\xc2\xaf\x2e\x72"
- "\x7d\x61\x82\xb7\x74\x5f\x18\xdf\xb7\xc3\xec\xdb\xaa\x18\xf7\x9e"
- "\xf3\xbe\x30\x2e\x4d\x5e\x0e\x65\xbc\x1b\xfb\xc0\x8c\xab\xe4\x72"
- "\x28\xe3\xfd\xb9\xbe\x30\x61\x5a\xfb\xf5\x85\xf1\x7b\x9d\xf7\x85"
- "\xf1\xe9\xf7\x6d\x3f\x57\xc5\xb8\x43\xc2\xbe\xf0\xab\x2a\xd2\x17"
- "\x8c\xa5\xee\xe5\x61\x26\xb8\xf5\xfe\x5b\xd8\x17\x26\x69\x98\x77"
- "\xdf\x32\xf7\x8f\xe5\xfa\xc2\x84\xeb\x5c\x5f\x98\xe4\xc0\xe7\xb9"
- "\xbe\xf0\xeb\x90\x0e\xb3\x7f\xac\x62\x62\x91\xf3\xbe\x30\x71\xb3"
- "\xbc\x9c\xcb\xaf\xfd\xe4\xf7\x85\x89\xbc\xf5\x4f\xbf\xe6\xad\x7f"
- "\x9a\x14\xd5\x7e\x7d\xe1\xd7\x9f\x3a\xef\x0b\xbf\xce\xbe\x6f\xfb"
- "\xca\x2a\x26\x16\x0b\xfb\xc2\x84\x1a\xd2\x17\xee\x44\xb8\x97\xb7"
- "\x99\xe4\x02\xff\x6f\x2d\x6f\x13\x3e\x88\x99\x17\x20\x73\x1f\x5b"
- "\xae\x2f\x4c\x6a\xe4\xfa\x42\x78\x5f\xe9\xbe\x30\x65\x44\x87\xd9"
- "\xc7\x56\x31\xf9\x88\xf3\xbe\x30\x39\x57\x5e\x8e\x66\x4a\x5f\xf9"
- "\x7d\x61\x72\x2d\x97\xa3\x99\x32\x88\xeb\x0b\xe1\xf1\xed\xd7\x17"
- "\xa6\x1c\x77\xde\x17\xa6\x14\xdc\xb7\xfd\x6d\x15\x93\x4b\x85\x7d"
- "\x61\x92\x91\xf4\x85\xbb\x67\xdd\xcb\xf3\x84\xeb\x3c\xcf\xf3\xbc"
- "\xa4\x63\xe6\x4c\xc8\xdc\x4f\x97\xeb\x0b\x11\xde\x5c\x5f\x78\x29"
- "\x44\xba\x2f\x4c\x7d\xa1\xc3\xec\xa7\xab\x88\x38\xe9\xbc\x2f\x44"
- "\x14\xca\xcb\xe9\x4c\x0d\x91\xdf\x17\x22\xea\xb9\x9c\xce\x54\x1d"
- "\xd7\x17\x5e\x4a\x6a\xbf\xbe\x30\xb5\xcc\x79\x5f\x98\xba\xef\xbe"
- "\xed\xb3\xab\x88\xa8\x12\xf6\x85\x70\x33\xe9\x0b\xa6\x48\xf7\xf2"
- "\x42\x2f\x8d\xf1\x3c\x2f\x34\x7d\x0c\x33\x9f\x44\xe6\xbe\xbe\x5c"
- "\x5f\xf8\x8d\x1f\xd7\x17\xa6\x4b\x7f\xe7\x41\x31\x6d\x72\x87\xd9"
- "\xd7\x57\xf1\x1b\xe7\xdf\x3f\x52\xfc\xc6\xc9\xf7\x8f\xc4\x72\x40"
- "\xd3\x46\xc8\xef\x0b\xd3\x10\x97\x03\x9a\xc6\x5b\xff\x37\x7d\x7d"
- "\xfb\xf5\x85\x69\xce\xbf\xff\xa0\x98\xe6\xc2\xf7\x1f\xdc\xdc\xef"
- "\x57\xf1\x9b\x1a\x61\x5f\xf8\x8d\x8a\xf4\x85\xa6\x6a\xf7\xf2\x48"
- "\xd3\x5b\xcd\xff\x63\x9d\xdf\xec\xef\x98\x47\x2a\xad\xd1\xa1\xa7"
- "\x67\xe2\xbe\xf0\xb2\xc9\x9c\x13\x9a\x8e\xf7\x17\xb6\x04\xb1\x7b"
- "\x50\xae\x65\xf7\x78\xa9\x37\x93\x3d\x28\x8d\x96\x96\x3d\x28\xc9"
- "\xde\x1f\x88\xc2\x6b\x81\xf1\x9a\x60\xb3\x9a\xec\x3f\x49\xe3\x39"
- "\x51\x78\x8e\xd4\xa5\x12\x66\x7f\x95\x64\x33\x3c\xfb\x95\x56\xf6"
- "\x9f\x8c\x32\xa0\xd2\xa8\xd5\xc8\xec\x57\x64\x24\xeb\x84\x5f\x4e"
- "\x67\xf6\x9f\x9c\x13\xd8\x3b\xe3\x3b\xe4\xef\x8b\xf7\x9f\x8c\xa2"
- "\xad\xa9\x06\xda\x58\x6e\x42\x50\x16\xec\x3b\xd7\xb6\x07\xe5\xcb"
- "\xb7\xf0\xb3\x9b\xe7\x68\x7b\xef\xfa\x4e\x62\x7f\x61\xc5\xcb\x6e"
- "\xec\x03\xfb\x72\x21\x97\xdf\x79\xb9\x96\xc3\xe8\x6f\x99\x31\x18"
- "\xce\xa7\x95\x46\x42\x8c\xd9\x64\x89\x6a\x76\x6b\xef\x8d\xdf\x2a"
- "\x5b\xf7\x19\x33\x47\xc4\x21\x7e\x71\x3e\x8b\xdc\x67\xce\xd1\x31"
- "\xfb\x1c\xbb\xee\x33\xef\xdb\xf7\xc7\x67\x91\x23\x5d\xf7\x59\xe4"
- "\xfb\x42\x9f\x89\xe5\x21\x22\xb7\xc8\xf7\x59\x64\x24\x97\x87\x88"
- "\xcc\xe3\x7c\x16\x59\x47\x7c\x16\x39\x9c\xf8\xcc\xba\xb9\xd9\xad"
- "\xfd\x3b\x22\x5b\x5d\xff\x8d\x75\x53\xb3\xbf\xa3\x2e\xe7\x7c\x36"
- "\x33\x0a\x7c\x96\x8e\xf7\x5b\x76\xdd\x67\x8f\x5d\xba\x3f\x3e\x9b"
- "\x61\x74\xdd\x67\x33\x67\xd8\xf9\x4c\x44\x2f\xcf\x94\xff\xcd\x4e"
- "\xc5\x4c\x1f\x4e\x2f\xcf\x8c\xe0\x7c\x36\xb3\x80\xf8\x6c\x46\x2d"
- "\xf1\x19\x7d\xb8\xd9\xad\x3d\x40\x66\xc6\xb7\xee\x33\xe6\x9d\xbe"
- "\x93\x7e\x36\xcb\xdf\x9c\xa3\x67\xf6\x7d\x76\xdd\x67\x7e\xdf\xdc"
- "\x1f\x9f\xbd\x52\xe8\xba\xcf\x66\x75\x13\xfa\x4c\x4c\xd7\xbd\x72"
- "\x57\xbe\xcf\x5e\x29\xe6\x74\xdd\x2c\x25\xe7\xb3\x59\xd3\x88\xcf"
- "\x5e\xc9\x63\x7c\x96\x81\x6a\x9a\xdd\xda\x47\x64\x56\xab\xf9\x2f"
- "\xcc\x43\x9b\xfd\x1d\x75\x0e\xe7\xb3\xd9\x25\xe0\xb3\x74\xbc\xff"
- "\xb4\xeb\x3e\x7b\x6e\xd3\xfd\xf1\xd9\xec\x48\xd7\x7d\x36\xfb\xb8"
- "\x9d\xcf\x44\xf4\xc7\xec\xbd\xf2\x7d\x36\x3b\x91\xd3\x1f\xb3\x0f"
- "\x73\x3e\x7b\x55\x45\x7c\x36\x3b\x82\xf8\x8c\x52\x37\xbb\xb5\x17"
- "\xc9\xec\xb3\xad\xfb\x8c\x79\x07\xeb\xa4\x9f\xcd\x49\x36\xe7\x84"
- "\x31\xfb\x60\xbb\xee\xb3\x57\x5e\xbc\x3f\x3e\x9b\xe3\xe3\xba\xcf"
- "\xe6\xac\x10\xfa\x4c\x8c\x27\xcf\x71\x63\x1f\xec\x39\x5a\x8e\x27"
- "\xcf\x89\xe7\x7c\x36\xe7\x28\xf1\xd9\x1c\x25\xf1\x99\x62\x64\xb3"
- "\x5b\xfb\x99\xcc\x91\xdc\xff\xcb\x19\x6f\xb4\xcd\xcb\xe7\xfc\x36"
- "\x77\x78\xc7\xe1\x8e\x51\x27\x5c\xf7\xdb\xdc\xc1\xad\x73\xc7\xb9"
- "\x01\xf2\xfd\x16\x65\xe0\xb8\xe3\xdc\x20\xce\x6f\x73\x13\x89\xdf"
- "\xa2\x8e\x7a\xc6\x1d\xe7\x8e\x76\x87\x3b\x3a\xfa\x6d\x5e\x5d\xc7"
- "\xe1\x8f\xf3\x92\x5d\xf7\xdb\xbc\xcb\xad\xf3\xc7\x79\x65\xf2\xfd"
- "\x36\x2f\x97\xe3\x8f\xf3\xaa\x39\xbf\xbd\x36\x88\xf8\x6d\x5e\xa2"
- "\x67\xfc\x71\x9e\xe4\xfe\x6f\xce\xf8\xa3\xa3\xdf\xa2\x0b\x3b\x0e"
- "\x87\x8c\x1e\xee\xba\xdf\xa2\xf3\x5b\xe7\x90\xd1\x1b\xe4\xfb\x2d"
- "\x3a\x82\xe3\x90\xd1\xd9\x9c\xdf\xa2\x6b\x88\xdf\xa2\x07\x79\xc6"
- "\x21\xa3\x0f\xb8\xc3\x21\x1d\xfd\x16\x33\xab\xe3\xf0\xc8\xf9\x75"
- "\xae\xfb\x2d\x66\x7a\xeb\x3c\x32\x46\xfe\x37\x8b\x15\x31\x2a\x8e"
- "\x47\xc6\x4c\xe2\xfc\x16\xc3\x7e\x83\x65\x7e\x8d\x67\x3c\x32\xa6"
- "\xd5\xfd\x3f\xc4\x78\xa4\xa3\xdf\x62\xfd\x3b\x0e\x97\xfc\x9d\x0c"
- "\xfe\x1f\x6b\xcf\xff\x45\xb8\xe4\xef\xdc\xe0\xff\xbf\x2b\xe6\xb8"
- "\x64\x2c\x8f\xff\xc7\xb2\xfc\xff\x77\x79\x9e\x71\xc9\x58\x17\xf8"
- "\xbf\x23\x97\x74\xf4\x5b\x5c\x69\xc7\xe1\x93\x71\xb3\x5c\xf7\x5b"
- "\xdc\xc9\xd6\xf9\x64\x9c\xfc\xef\x40\x29\xe2\x92\x38\x3e\x19\x77"
- "\x94\xf3\xdb\x02\x1f\xe2\xb7\xb8\x69\x9e\xf1\xc9\x38\xc9\xfd\x1f"
- "\x6d\x7e\xb3\xf8\x87\xa6\xd3\x22\x79\xc8\xb2\x58\x1d\xbb\x37\x61"
- "\x7c\x9e\x25\x20\x34\x5d\xee\xf7\x5d\x6c\x7b\x4e\x9f\x82\x1e\x7f"
- "\x49\x11\x3f\xc2\xb3\x7d\xa7\x17\x5e\xf6\x7c\xdf\xe9\x85\x07\xdb"
- "\xee\xfb\x2e\x0b\x77\xc8\xdf\x77\x7a\x61\x34\xc7\x41\x17\xee\xe1"
- "\x7c\x1d\xcf\xcc\x4f\x90\xb7\x1f\xf5\x42\xad\x67\xfb\x51\xc7\x0f"
- "\x26\xf8\x5a\x50\x4b\xf6\xa3\x8e\x0f\x6a\x9f\xef\xbe\x2c\xc8\xc6"
- "\xfb\x51\xd3\x19\xca\x58\xf7\xf6\x47\x8e\xdf\xd3\x3a\x9e\x75\x2a"
- "\x5a\x24\x47\xcb\xe1\x79\x49\xbc\x25\x40\x27\xfb\x3b\x33\x42\x3c"
- "\x2f\xf1\xf6\x0c\xcf\x8b\x3f\xf5\x1c\xcf\x8b\xd7\xb6\xdd\x77\x66"
- "\x16\xc7\xc9\xc7\xf3\xe2\xe1\x1c\x37\x5f\x9c\xc4\xe1\x79\xc9\x3e"
- "\xf9\x78\x5e\x64\xf2\x0c\xcf\x8b\x2d\x04\xcf\x8b\x0e\x13\x3c\x2f"
- "\xae\x6f\x9f\xef\xcf\x2c\x8a\x26\x78\xee\x74\xc0\xbd\xfd\xa7\x97"
- "\x24\xb9\x80\xe7\x74\x5a\x24\x7f\xcd\xe1\x79\xd9\x48\xc0\x73\xba"
- "\xdc\xef\xdd\x08\xf1\xbc\xf4\x9c\x67\x78\x5e\xba\xc1\x73\x3c\x2f"
- "\x9d\xda\x76\xdf\xbb\x59\xaa\x97\x8f\xe7\xa5\x4a\x4e\xb3\x2c\x1d"
- "\xcf\xe1\x79\x59\xb2\x7c\x3c\x27\x94\x78\x86\xe7\xa5\x65\x04\xcf"
- "\x09\xe9\x04\xcf\x4b\x4f\xb4\xcf\x77\x70\x12\x86\x13\x3c\xab\x4c"
- "\xee\xed\xef\xbd\x4c\x72\xff\x63\x0e\xcf\x7a\x15\x2d\x92\xdb\xe7"
- "\xf0\xbc\xc2\xc7\x12\xa0\x97\xfd\xdd\x1d\x21\x9e\x13\x3d\xfc\xce"
- "\x45\x62\x1b\x7c\xe7\x22\xd1\x83\xef\x5c\xd8\x7f\x77\x27\xb1\x8b"
- "\x7c\x3c\x2f\x3f\xcb\x69\xb9\xc4\x40\x0e\xcf\x2b\x26\xc9\xc7\xf3"
- "\xf2\x5c\xcf\xf0\x9c\xc8\x7e\xff\x62\x79\x24\xc1\x73\x62\x76\xfb"
- "\x7c\x8f\x67\xb9\x92\xe0\xf9\xb1\xd1\xee\xed\x9f\xbe\x22\xd0\x05"
- "\x3c\xa7\xd3\x22\xef\x3d\x38\x3c\xbf\x5e\x0d\x78\x4e\x97\xfb\xfd"
- "\x1f\x21\x9e\x5f\x5f\xe1\x19\x9e\x5f\x0f\xf6\x1c\xcf\x2b\x6f\xb5"
- "\xdd\xf7\x7f\x56\x9e\x97\x8f\xe7\x95\x85\x9c\xc6\x5d\xc9\x7b\xff"
- "\x9f\xd4\x47\x3e\x9e\x57\x7a\xf8\x5d\xa0\xd7\x17\x11\x3c\xaf\x64"
- "\xbf\x0b\xf4\x7a\x74\xfb\x7c\x17\x68\xc5\x59\x82\xe7\x6e\xe9\xee"
- "\xed\x4f\xff\x7a\x6d\xeb\x78\x0e\x53\xd1\x22\xef\x84\x38\x3c\xaf"
- "\xde\x67\x09\x08\x93\xfd\x1d\x22\x21\x9e\x57\x8f\xf5\x0c\xcf\xab"
- "\xee\x7a\x8e\xe7\x55\xc7\xdb\xee\x3b\x44\xab\xf6\xca\xc7\xf3\x2a"
- "\xdb\xfb\x3f\x88\xcf\xab\x78\xef\xff\x56\xbb\xf1\x7d\xa2\x55\x3a"
- "\xcf\xf0\xbc\x7a\x14\xc1\x73\x92\x89\xe0\x79\xf5\xf0\xf6\xf9\x3e"
- "\x51\x52\x21\xc1\xb3\x6f\xa5\x7b\xfb\xff\xaf\x6e\x75\xfe\x87\x58"
- "\x7e\xc3\x96\x97\xe2\x30\xbd\x26\xcd\xf3\x1c\xc7\x9a\x5e\x9e\x61"
- "\x3a\xf9\x94\xe7\x98\x4e\xce\x69\xbb\x1c\x47\xb2\x1b\xdf\xfa\x4b"
- "\x1e\xcf\xe5\x38\x92\x37\x73\x98\x5e\x53\x2c\x1f\xd3\xc9\x3e\x9e"
- "\x61\x7a\x8d\x1f\xc1\xf4\x1b\xa5\x04\xd3\x6b\x54\xed\x93\xe3\x78"
- "\x23\xc9\xb3\x1c\xc7\x9a\xcd\xee\xe4\x38\x1c\x31\x9d\x36\xcd\xf3"
- "\x3c\x47\xea\x75\xcf\x30\x9d\x9a\xef\x39\xa6\x53\xe3\xda\x2e\xcf"
- "\x91\x3a\x55\x3e\xa6\x53\xfb\x70\x79\x8e\xd4\x28\x0e\xd3\x69\xd9"
- "\xf2\x31\x9d\x62\xf0\x0c\xd3\xa9\x97\x09\xa6\x53\x0a\x08\xa6\x53"
- "\xab\xdb\x27\xcf\x91\x32\xc9\xb3\x3c\x47\x5a\x94\x3b\x79\x0e\x47"
- "\x4c\xbf\xa9\xf5\x3c\xd7\xb1\xee\xb8\x67\x98\x5e\xb7\xd4\x73\x4c"
- "\xaf\x1b\xd5\x76\xb9\x8e\x75\xc1\xf2\x31\xbd\xd6\xc8\xe5\x3a\xd6"
- "\x0d\xe7\x30\xfd\x66\xac\x7c\x4c\xaf\x3d\xe4\x19\xa6\xd7\x1d\x21"
- "\x98\x5e\x9b\x48\x30\xbd\xee\x40\xfb\xe4\x3a\xd6\x6a\x3c\xcb\x75"
- "\xbc\x39\xdc\x9d\x5c\x87\x23\xa6\x37\x98\x3d\xcf\x77\x6c\xc8\xf1"
- "\x0c\xd3\x1b\xc6\x7a\x8e\xe9\x0d\x7e\x6d\x97\xef\x58\xdf\x28\x1f"
- "\xd3\xeb\x79\xdf\xbf\xd8\xc0\x5b\xff\xff\xd6\x48\xf9\x98\x5e\x9f"
- "\xee\x19\xa6\x37\x6c\x21\x98\x5e\x3f\x9e\x60\x7a\xc3\xfa\xf6\xc9"
- "\x77\xbc\x59\xef\x59\xbe\xe3\xad\x56\xf7\xbf\x10\xcb\x77\x38\x62"
- "\x3a\xbd\xd2\xf3\x9c\x47\x7a\x9c\x67\x98\x4e\xef\xe5\x39\xa6\x7f"
- "\x7f\xb9\xed\x72\x1e\xbf\x2f\x93\x8f\xe9\xdf\xe7\x72\x39\x8f\xdf"
- "\xf3\xe6\x3f\x6d\x54\xcb\xc7\xf4\xef\x67\x79\x86\xe9\xf4\xb9\x04"
- "\xd3\xbf\xef\x43\x30\x9d\x1e\xd9\x3e\x39\x8f\xb7\x4a\x3c\xcb\x79"
- "\xa4\x57\xbb\x93\xf3\x70\xc4\xf4\xdb\x85\x9e\xe7\x3d\xde\x1e\xe5"
- "\x19\xa6\x37\x5d\xf7\x1c\xd3\x9b\x8e\xb4\x5d\xde\x63\xd3\x7b\xf2"
- "\x31\xbd\x29\x9e\xcb\x7b\x6c\xe2\xed\x7f\xff\x76\x8d\x7c\x4c\x6f"
- "\x1a\xea\x19\xa6\xdf\x1e\x41\x30\xbd\xd1\x48\x30\xfd\xf6\xa0\xf6"
- "\xc9\x7b\x6c\xcc\xf3\x2c\xef\xf1\xb6\xc3\xfc\xb7\xe5\xf3\x17\x47"
- "\x6b\x96\xc4\xc4\x2c\x9f\x9f\xa8\x59\x1e\x1f\xf7\xda\xfc\x51\xc1"
- "\xb6\xff\x8f\x1a\x9a\x14\x9c\xd4\x15\x45\x2f\x9a\x3b\x67\xe5\x33"
- "\xdc\xc9\xf8\xf9\x8b\xe1\x9f\xae\x28\x76\xee\xf2\x58\x4d\xe2\xaa"
- "\x84\xf9\x1a\xfc\xbf\x45\xaf\x25\x40\x91\x25\x89\xdc\x91\x97\xe6"
- "\xc7\xcf\x4d\x8a\x5b\xfc\x3b\xcd\xdc\xf8\xb8\xdf\x2d\x5e\x34\x7f"
- "\x71\xa2\x66\xd9\xfc\xa5\x2b\xe2\x96\xcd\xc7\x7f\x2f\xd7\xc4\x2c"
- "\x59\x06\x07\x5e\x9b\x1f\xb7\x72\xbe\x66\xde\x8a\x98\x98\xf9\xcb"
- "\x96\x77\x45\x93\x57\xc4\x27\xc6\x25\xc4\xcf\xd7\x8c\x99\xfc\xc2"
- "\xe0\x69\x63\x7f\x33\xed\xf9\xe7\xbb\x22\xde\xb7\xa7\x35\x74\xf6"
- "\xcc\x4c\xc0\x90\xf2\x8a\xe2\x7f\x2e\x97\x07\x22\xb4\x05\xb0\xb9"
- "\x75\x19\x52\x6f\x5a\x86\x94\x1b\x6f\x23\xd5\x96\xdb\xc8\xc7\xba"
- "\xcd\xaa\xd2\x2c\x40\xa3\x69\xbf\xe5\xea\xad\xb7\x91\xbf\x35\xeb"
- "\xa3\x28\x3a\xeb\x23\x8d\xd1\x2f\x5b\x8d\xcb\xd2\x7e\xef\x8c\xc7"
- "\xc7\xc1\x17\x4a\x3a\xab\xa8\xf2\x92\xe2\x7f\x0a\xe1\x9c\x31\xf5"
- "\x2a\xa2\xe8\xee\x5b\xd4\xfb\xad\x46\xea\x38\xce\xb2\x81\xad\x90"
- "\x22\x43\x0b\x3f\x7f\xf8\x9d\x80\xdf\x59\xa4\xd8\xaa\x81\xdf\x78"
- "\xf8\x45\xc0\xef\x28\x52\x64\x22\xf8\x0d\x85\xdf\x48\xf8\xc1\xb1"
- "\xcc\x68\xf8\xc5\x23\x45\x16\x1c\xcf\x82\xb2\x59\x70\x2e\x6b\x3c"
- "\xa9\x27\x0b\xce\x67\x55\xc2\xcf\x84\x14\xdb\xd4\xf0\x83\x3a\xb7"
- "\xd5\x20\xc5\x3b\x09\xf0\xaf\x19\xfe\x55\xc1\x0f\x8e\xbf\x33\x08"
- "\x7e\xb8\xec\x34\x72\x2e\xbb\x0f\xfc\x22\xe1\x97\x04\xbf\x6c\xf8"
- "\x95\xc0\xaf\x1a\x7e\xb5\xf0\x33\x22\x45\x0e\xb4\x2f\x07\xca\xe4"
- "\xc0\xbd\x72\xe0\x5c\x0e\xdc\x23\xa7\x1e\x29\xb6\x4f\x82\xdf\x01"
- "\xa4\xf8\x1f\x25\xfc\x0a\xd9\x1f\x1c\xfb\x9f\x34\xde\xff\xf3\x78"
- "\x7f\x8b\xfd\x8e\xfa\xae\xfd\xa9\xa1\xf8\x29\x33\xf4\xdb\x8c\x0d"
- "\xf4\x3a\xa4\xa0\xb3\xb2\x8d\x09\x4f\x21\xaf\x6b\x8a\x8c\xa9\x15"
- "\xeb\x11\xc4\x9b\x8f\x34\xc5\xab\x9b\xf0\xf9\xa9\xd8\x66\x0d\x19"
- "\x19\x11\x06\x14\x6f\xc4\xfd\x53\x1e\x3e\x33\x22\xd8\xeb\x33\x0d"
- "\x5e\x3e\xcc\xb7\xc4\xe9\x6d\xba\xa1\x74\x6a\xe4\x4e\xbc\x0e\x17"
- "\xea\xd7\xe2\x75\xba\x74\x66\xe8\x1e\x5a\xfd\xcc\x48\x1c\x63\x8a"
- "\x57\x33\xed\x0a\x21\xfd\x11\xce\x43\xdb\x8c\x7e\x56\x15\xf4\x3f"
- "\x25\xfe\x3f\x0d\x3e\xa7\x0b\xe6\x27\x91\xb8\x93\xc1\xe8\x97\xa6"
- "\x80\x29\xc5\xf8\x5c\xe3\xfb\x03\x13\xe8\xc2\x30\x55\xf1\xe2\x26"
- "\x54\xa3\xc8\x08\x86\x67\xa3\x20\x06\x52\xf4\x93\x03\x13\xac\xdb"
- "\xa7\x14\x1f\x01\x1c\xe0\x72\x7f\x49\xa9\xc5\xff\x06\xe1\xf3\x74"
- "\x76\x78\x3a\xce\x03\x15\xa7\xfc\x01\xe2\x72\x46\x48\x53\xc0\xfc"
- "\x28\xcd\x4b\xbe\xf4\x25\xd2\x36\x5c\xee\xa8\xad\x2d\x4d\x7e\x56"
- "\x35\xae\x9f\xd6\xc4\x68\xe0\x9c\x12\xda\xa6\x86\x76\x78\xdd\x80"
- "\xeb\x68\x68\x63\xf1\x4b\xf8\xbe\x5b\x3f\x85\xb6\x52\xa9\x53\xa1"
- "\xee\x3f\xc4\x68\x3e\x5e\x6d\xa2\xf0\x39\x6b\xa6\x15\xe3\xdd\x87"
- "\xce\x78\xdb\xf8\x6e\x0f\xa4\xdc\xbd\x0d\xa1\x5d\xdb\x90\xaa\x21"
- "\x63\xeb\x3e\x83\xb2\xef\x51\x12\xfb\x32\xb4\x14\x94\x31\x28\xb6"
- "\xa6\xc3\x73\x1a\x99\x7b\xf9\x4f\x44\x4e\xee\xd5\xd8\x72\xaf\xed"
- "\x13\x11\xbe\x17\xb1\x91\x55\xc5\xda\x8a\xa9\xc3\x5a\xa8\xd5\x60"
- "\xfb\x61\xdb\xd9\xea\xb0\x66\xb5\xd4\xd1\x0b\x5f\x0f\xf7\xac\xa3"
- "\x3f\xd0\x6a\xac\xdb\xa7\x6a\xe0\xda\x12\x7c\xde\x77\x2d\xaa\xa7"
- "\xe1\x5f\x7c\x7f\xd6\x17\x6a\x9a\x4a\x43\xb8\x7e\x9a\x3d\x06\xd8"
- "\x51\x1b\x14\x99\xc3\xad\xeb\x34\x08\x8f\x4d\x75\x8a\x4c\x26\x37"
- "\x41\xab\x75\x26\xe2\xe3\xcc\x2d\xab\x2a\x69\x2b\xfc\x2c\x43\x2a"
- "\x91\x57\xf1\x4b\xd8\xbf\x99\xfb\x34\x53\x3a\x83\x8d\x33\x8b\x5a"
- "\x6c\xdb\x3f\x26\x10\xec\xa3\xde\xdd\x03\xfa\xfb\x5b\xde\x26\x9a"
- "\xd2\x20\xec\x1f\x6c\x2b\xb0\x13\x82\xe3\x2a\x8c\xd3\x86\x8c\xcc"
- "\x6a\x3b\x7b\xa9\x27\x4e\x4d\xa5\x79\x75\xbf\x4f\x13\xbf\x69\x49"
- "\xf9\x2c\x1f\x83\x57\xa7\xa1\xb8\xbc\x66\x00\x83\x99\x10\xd6\xaf"
- "\x0c\xb6\xb0\xfd\xe8\x80\x99\x99\xf8\xff\xd3\x43\x90\xda\xb7\x12"
- "\x51\x9a\x94\xa0\xc3\x04\x0b\xe1\xe9\x36\x9c\x30\xcf\xb8\xfd\xe7"
- "\x55\x96\x75\x30\xd6\xb6\xe0\x2f\x2b\xdd\x92\xa5\x33\x36\x05\x44"
- "\x8c\x6e\xcc\x99\x80\xe8\x4c\x9d\x11\xaf\x3f\xbf\xa4\xc8\x5a\xcb"
- "\xd8\x60\x9d\x0a\x91\x76\xe8\xea\x53\xe2\x69\x63\xca\x2d\xb8\x57"
- "\xcf\x88\xd1\x7f\x59\x69\x04\x7f\x4d\x40\x18\x0f\x47\xee\x99\x28"
- "\xbc\x27\x20\xdd\x7d\x73\x8f\x5d\xf0\xac\xf9\x80\x09\x78\x56\x84"
- "\xeb\x85\xb6\x97\x70\xcf\x9a\x15\x8f\xb1\x41\x67\xea\x55\x2c\xf6"
- "\xb5\xd0\x2e\x2f\x3a\x4b\x0f\x18\xca\x32\x1a\xbc\x0e\x26\xda\x6c"
- "\xc2\xdc\x9b\x2b\xc7\xf6\xa5\xac\x1a\xa3\x9f\x5e\xd5\xbc\x92\xae"
- "\xdc\xfa\x2d\xd4\xbf\x0e\xd1\x4d\xf7\xe8\xd2\xe4\x08\xda\x94\xf1"
- "\x32\x9e\xe7\x58\x8d\x52\xe7\xa2\x3e\x8f\xad\xa5\x8d\xe1\x16\xe4"
- "\xfb\x58\xb5\x2f\x5d\x16\x51\xcd\x7c\x1b\x21\xb9\x92\xae\x2d\x4f"
- "\x38\x8a\x92\x2f\x23\x9f\x35\x71\xc8\x3f\x35\x02\x9e\xa5\x94\x36"
- "\x55\x24\x55\xa3\xf2\x7a\xf8\x25\x94\x41\xb9\x73\xf0\x3b\x8a\x52"
- "\x57\x21\xe5\x14\x18\xf7\x52\xee\x22\x9f\xf2\x84\xbb\x70\xec\x3a"
- "\x4a\x8e\xa2\xcd\x65\xa5\xb8\xdc\x49\x14\x6e\x36\xfa\xae\xb9\x0e"
- "\x3e\x7d\x19\xaf\xe9\xbe\x80\x76\x43\x5b\x9a\xfc\x3e\x8a\x68\xcc"
- "\x2a\xaa\xba\xb3\x92\x36\x37\x64\x6c\x3b\x6a\x40\x61\x69\x82\x67"
- "\xc1\x6d\x6e\x42\xb8\x1f\x78\xe1\x32\xd6\x9c\x71\x86\x39\x66\x1c"
- "\x5f\xb6\x1d\x00\xde\x81\x6c\xe7\xf1\x39\x63\xc0\x38\x03\x1c\xaf"
- "\x0e\x37\xd3\x0d\xd8\x3e\xf8\xb9\xc1\x46\x4a\xf6\xf9\x95\x8a\x04"
- "\xa4\x6c\xc8\x78\x47\x63\xf0\x3a\x14\x81\xef\x01\x75\x76\x82\xfb"
- "\x1c\xc2\xd8\x60\xcf\x8d\x34\x78\x7d\x92\xcb\xe1\x65\x2b\x60\x91"
- "\x29\xa3\x25\xb1\xec\x9d\x59\x06\xaf\x3f\x15\xf0\xf0\x84\xf1\xd1"
- "\x72\x9e\x1d\xcf\xf0\xf1\xa3\x56\x1c\x5b\xd5\xcf\xa8\x2d\x01\xe1"
- "\x99\xd0\x67\x0a\xe8\x3b\x81\x3e\x34\x45\x9b\xa6\x98\x69\x93\x35"
- "\x27\xcc\x00\x63\x96\x4f\x85\xb9\x1e\x91\xf2\xd9\xe0\x4b\xeb\x1e"
- "\x32\x87\xf4\x9d\xab\xb8\x4e\xe0\x36\xa3\x33\x6e\x23\x75\x78\x25"
- "\x8d\xdb\xa0\xb4\xe6\x74\xd6\x64\x2c\x43\xfe\x74\x4e\x78\x9a\x35"
- "\x60\x62\x66\xe3\x7b\xf3\x13\x70\x8c\xc5\xf8\xa5\x33\xe1\x5a\xb6"
- "\x1e\xb8\xaf\xb7\x41\xf1\x4e\xb1\x15\xae\xa7\xb3\xc3\x0c\x6c\x7b"
- "\x98\x78\x48\xe2\xe8\x3b\xc5\x74\x30\x9c\xcb\x7c\xc6\x1f\xce\x79"
- "\x5f\x52\x64\x4f\x82\xe3\x80\xdf\x67\x26\x15\xa7\xdc\xc6\x75\x4c"
- "\x25\x18\x7a\x46\x2d\xf8\x3f\x85\xed\x99\x39\x06\xf7\x7f\xc2\x43"
- "\xb3\x97\x72\xfd\x8e\x79\x5e\xa6\x5f\x35\x05\x84\x01\x76\xb3\xd7"
- "\x1b\xbc\x7c\x67\xb1\x36\xf6\xaa\x27\x31\xa9\xc4\xfa\xde\xfc\xa4"
- "\xaf\x60\x54\xf8\xaa\x14\x21\x28\xb3\xc7\xe0\xe5\x97\xc0\xd9\x32"
- "\xfb\x38\x2e\xcb\xb4\x13\xfa\xa6\x75\x1d\x3b\x06\xc0\x35\xd0\x6f"
- "\x86\xe2\x98\x43\x62\x5b\xf6\x51\x1c\x77\xa0\x7f\xe6\xb2\x71\xdf"
- "\x04\xed\x9a\x46\xf7\x88\x1f\x0d\xed\x4a\xbb\xc4\xb6\x85\xdf\x36"
- "\x5b\x9c\xa1\xb3\xe2\x8b\x49\x59\xbd\xba\x21\x23\x47\x6b\xf0\xea"
- "\x31\x9e\x8f\x35\xf2\x5c\x39\xf9\x43\x4a\xe1\x6f\xe0\x25\xb6\xba"
- "\xa0\xaf\xaa\xa0\x8f\x3e\x85\x31\x85\xfb\xe7\x8e\x6d\x98\x6b\xc4"
- "\x97\x34\x66\xc5\x57\x42\x3d\x09\xb6\x7e\x6a\x5d\x49\x57\x81\x5f"
- "\x91\xf5\x1e\x7d\x76\x2b\xf8\x32\xdc\xa2\xa0\xe7\x58\x06\x21\xe0"
- "\xad\xe6\xdd\x70\x7c\xf7\x4a\xcc\xfb\xb6\xed\x83\xbe\xac\x12\x2f"
- "\xab\x44\xb8\x1c\x53\x9e\x2d\xdb\xe4\x17\x5f\xc2\xb4\x99\x52\x58"
- "\xa1\x7d\x5e\xb6\x36\x35\xf9\xe9\xa0\xbf\xe4\xd4\x19\xbc\xd0\x2c"
- "\x41\x7f\xd9\x36\x6c\x28\x4d\x47\x62\x5c\x29\xae\x28\xb6\xfb\xc1"
- "\xbf\x9d\x59\x1c\x3f\xf6\x15\xf0\xda\x31\x93\xa1\xaf\x80\xbf\xdf"
- "\xed\x49\x83\x9f\xb6\x0f\x32\xa0\x57\xa7\xe1\xeb\x37\xc1\xff\xf1"
- "\x71\x5c\x06\x8e\x8f\x31\xa0\x39\x63\x48\xbd\x99\x91\xd8\x7f\x76"
- "\xf5\xc6\x91\x7a\x99\xb6\x3c\x86\xeb\xc4\xd7\xe1\x3a\xf3\xb7\xd3"
- "\x75\xb8\x1e\xa8\x23\xdd\x56\xf7\x16\x38\x66\xab\x7f\xcc\xa2\x96"
- "\x7b\xec\x81\xf3\xa5\xfc\xb6\xef\xd8\x4e\xd7\xb3\xed\x3a\x61\x40"
- "\xbf\x63\x34\xc1\x46\x38\x86\xaf\x25\x18\xd9\x7e\x11\xe3\xc7\x40"
- "\x9e\x47\x41\x70\xb4\xdd\x68\x40\xf3\xf9\x7d\x32\x04\xfc\xd4\xcd"
- "\x36\x06\x90\xfa\xfe\xc7\xdf\x56\x1f\x57\x17\xa9\x83\xce\x5c\x74"
- "\x80\xed\x23\xb8\x2f\xfb\xe0\xfa\xa1\x3c\x3c\x7f\x54\x2d\xfb\xfc"
- "\x63\xea\x09\xe6\xc1\xf6\xcc\x35\x04\x0f\x19\x9b\x75\xb6\xb1\x1c"
- "\x7c\x61\x82\x6b\x92\xec\xc6\x26\x15\x1c\xaf\x65\xeb\xcb\x06\x3f"
- "\xf5\xe1\x3f\x2b\x19\x53\xc2\x0f\x60\x4c\xb1\xf7\x9f\x8a\xdb\x6b"
- "\x3b\x0f\xf7\x50\xc2\x3d\x26\xe2\x7e\x80\xef\x61\xcd\x19\x9f\x00"
- "\xf5\xd8\x8f\x7f\x4a\x5c\xce\x9a\xb1\x39\x15\x8f\x93\xef\xf4\xa4"
- "\x6b\x1b\x32\x72\x91\xad\x0c\x3e\x0f\x36\xff\x05\x1c\x83\xe7\x5f"
- "\x18\x84\x8f\x65\x40\x19\x83\x62\xb3\xe4\xda\x99\x94\xfe\x88\xaa"
- "\xc8\x33\x60\x5d\x89\xfb\xfc\xc8\x8a\x3e\xf5\xa8\x22\xcf\x8a\xac"
- "\x1f\x68\x0b\x46\xa7\xd0\xc5\x57\x14\xb9\x59\xe5\xa6\x5a\x24\x8f"
- "\x0b\xe6\x32\xdf\xbf\xa2\x9b\x40\xff\x24\x3f\x83\x30\x37\xb8\xa1"
- "\xd8\x71\xbc\xc2\x78\x9b\x89\x7f\xf0\x37\xc3\x05\xde\x01\xbd\x84"
- "\x35\x13\xe8\xe2\xd8\x4c\x8a\xe8\x26\x2b\x94\xdd\x85\x8f\x63\x4d"
- "\x05\x7a\x6e\x37\xef\x1c\xfd\xc1\x40\x0d\xb1\xdd\x8e\x55\xcc\x78"
- "\x88\xdb\x6b\x1e\x57\x8c\xdb\x6c\x2d\x1c\xa8\xc1\xcf\x90\x9a\x44"
- "\x5b\x2b\xcc\x0d\xc5\xe5\xf5\x16\xa4\x59\x89\xf5\xde\x8e\xe9\xe1"
- "\xf9\x88\x86\xf8\x28\x53\xb3\xee\xd0\xe0\x7b\x82\x26\xbe\x61\x0c"
- "\x1e\xa8\x49\xb5\x20\x6a\x6b\x8a\xb7\xea\x97\x79\x74\xf1\x9d\x27"
- "\xb5\x05\x0d\x19\x3b\x92\x8e\x27\x21\x24\x9f\x27\xef\x48\xb2\x3d"
- "\xfb\x2e\xf6\xd9\xc1\x5e\xcc\x9c\xfd\x21\xb9\x69\xcc\xf3\x42\x19"
- "\x49\x7f\xd1\xeb\x7c\xe9\xaf\xf2\xcc\x68\x79\x1e\xdd\xb4\x3c\x1f"
- "\x51\x96\xed\x23\xa3\x3e\xde\x55\x85\x63\xfd\x68\x9b\x3d\x19\xdb"
- "\x99\x8d\x28\x21\x05\xa9\xaf\x29\xde\x9d\x11\x9e\x9c\xc6\x7c\x3f"
- "\xe9\x0b\x28\x27\xaf\xad\xef\x32\xdf\xaf\x2a\x07\x8d\x1d\x6e\x4e"
- "\xa5\xc9\x78\xf5\xee\xda\x29\x6c\x7d\xf8\x9c\xcd\x7f\xbb\x58\xed"
- "\xeb\xc6\x3d\x24\xd7\xbf\x3a\x79\x56\xb5\xf8\xb3\xee\x1c\xeb\xfe"
- "\xb3\xee\x54\x3b\x3e\xeb\xce\x45\x6d\xfb\xac\x3b\x25\xbf\x7f\xe0"
- "\xe4\x59\x35\xe2\xcf\x9a\x37\xcc\x83\x67\x35\x3b\x3e\x6b\xde\x8c"
- "\xb6\x7d\xd6\x3c\xc9\xf7\x7f\x4e\x9e\x75\xa8\xf8\xb3\xe6\xf7\x75"
- "\xff\x59\xf3\x6a\x1d\x9f\x35\x7f\x6c\xdb\x3e\x6b\xfe\x24\xc9\x67"
- "\xa5\x7c\x69\x1c\x9f\x20\x2e\x35\xa5\x34\x02\xcf\xdb\xfe\xd2\xd0"
- "\x35\xef\x21\xaa\xb4\xde\x84\xca\xfb\x54\x61\x0e\x4d\xfd\x2c\x01"
- "\x61\x1e\x37\x92\xde\x66\xd5\x94\xe7\xd5\xc1\xf1\x2b\xa8\x2c\xc9"
- "\x84\x46\x2f\xc3\xf1\x77\x97\x5f\x45\xb4\xdc\xf8\x9b\x5f\xdd\x12"
- "\x7f\xcd\xcf\xb0\x31\x77\xf7\xa8\xf2\xba\x26\x84\x9f\x1f\xfe\x0e"
- "\x69\x89\xbf\xeb\x88\xbd\xed\xe3\x2f\xb6\x47\x85\xc9\x24\x88\xbf"
- "\x64\x0d\xd5\xae\xbb\xf6\xb1\x37\xe3\x1a\x42\xe2\xb1\x77\xd7\x19"
- "\x1c\x7b\x77\xc1\x79\x79\xed\xdf\x95\x67\x8b\xbd\x99\x70\x4f\x7e"
- "\xec\xfd\x2a\x1a\x8f\xaf\xbb\xea\xdd\x8b\xbd\xbb\xea\x6d\xcf\x9d"
- "\xcf\x3e\x37\x1c\x8b\x14\xc6\xde\xdd\x92\x7b\x5d\xf2\x71\x4b\x6f"
- "\x0f\x1d\xfd\x71\x3f\x93\xb7\xb5\x30\x24\x0a\x8f\x6f\x0d\x60\x93"
- "\x3f\xef\x32\x29\xaf\x28\x76\x33\x6b\x21\xee\x34\x44\x7b\xd1\x85"
- "\x5a\x55\x78\x22\xfd\x3d\x1d\x1c\x12\x85\xf3\x98\x58\x8f\xc3\xf9"
- "\x8b\xf4\xfb\x5a\x95\xbc\x76\x93\x3a\xe9\x0f\x9e\x2c\x48\x81\xfe"
- "\xf2\xf1\x4a\x13\x65\x7d\x23\xd2\x17\xfc\xa0\xa6\x73\x7e\x9e\x46"
- "\xbf\xe5\x5f\x7c\x27\x27\xc2\x78\x52\x7b\x19\xe1\xb2\xf4\x5a\xe5"
- "\x48\xf7\xdb\x5f\x10\xef\xbc\xfd\x05\xef\xc9\x6f\x3f\xa9\xd3\xb5"
- "\xf6\x17\xc4\xbb\xd4\xfe\x9e\xd0\xfe\x26\x9d\x37\x68\x43\xea\x8b"
- "\x26\x9d\x52\x66\x7b\xcc\x2e\xf9\xd8\xa3\x7b\xbc\xe7\x72\xfc\xa3"
- "\x7b\x8e\x4f\xfb\x78\x97\x91\x82\x18\xc0\x8c\xe1\xb8\xef\x91\xf8"
- "\x57\x0b\x31\xeb\x7b\x9a\xc4\x24\xa3\xcc\x98\xf4\x9e\xc1\xf5\xfb"
- "\x8f\x34\xb4\xfd\xfd\xff\x20\xfd\xfc\xf6\x31\x71\x7f\x58\x9a\x64"
- "\x4c\xdc\xfe\x73\x83\x63\x4c\xfc\xdf\x60\xf9\x31\xf1\x0f\x46\xc7"
- "\x98\x58\x38\x95\x8b\x89\x85\xa3\xdc\x8f\x89\x85\x5d\x5c\x8f\x89"
- "\xff\x7b\xd9\xbd\x98\xf8\xbf\x07\x9c\xc7\xc4\x42\x95\x7b\x31\xb1"
- "\x50\xe5\x18\x13\xff\x37\x5e\x18\x13\x0b\x47\x4b\xfa\x32\x53\x63"
- "\x82\x31\xda\xe7\x9a\xe2\x7d\xb5\x79\x1d\xe8\x96\xcc\x1d\xaa\x70"
- "\x0b\xdd\x40\x67\x69\x4c\x56\x6a\x38\x8e\x2b\xa3\x1b\x1a\x62\x55"
- "\xd6\xd7\xb5\x3e\x74\x8f\x61\x9f\xd3\xcd\x81\x08\xec\x14\x04\xed"
- "\xf7\xa5\x1b\xb4\xdd\xe9\xd7\xb5\x3d\xf2\xee\x21\x7f\xf8\x05\xe6"
- "\xb1\xe3\x31\xfc\x3d\x94\x7e\x3d\xb0\x6b\xc6\x4a\x34\xc8\xb7\x1e"
- "\xa9\xa0\x0d\x91\xbe\x6b\xd5\x08\x62\x90\x3f\xfe\x9b\x5e\x57\x10"
- "\xbb\xfb\x1e\x52\xfa\x26\x81\x6f\xfc\xe0\x7e\x49\xbe\x34\xbd\x5c"
- "\x8b\x76\x2f\x03\x9d\x4d\xa1\xc0\x5d\x14\x7d\xc0\xdc\xa0\xa5\x2c"
- "\xfe\xe1\x05\xc4\x3f\xef\x9f\xa0\x7b\x82\xf6\xca\x0e\x8f\xb7\xf6"
- "\x0c\x9f\x66\x49\x8d\x55\xd0\x6f\x44\x2a\x70\x5b\x2d\xd9\xe1\x11"
- "\xf4\x76\xf8\xa5\xc6\x76\xc7\x1c\x1a\x74\xf8\x50\xba\x21\xb0\x2b"
- "\x68\xf4\x41\xbb\x56\xa2\xa0\xfc\x7b\x48\x4b\xdf\xd1\x52\xe0\xff"
- "\x48\xfc\x1d\x52\xb0\x51\xa4\x95\x2a\x88\x85\x73\x4a\x1c\x13\x69"
- "\x7c\x7f\x33\xdc\xbf\x19\xee\xdf\x84\xb1\x8d\x02\x77\xc3\xfd\x2d"
- "\xaf\x6b\x65\xf6\x97\xf7\x33\x19\x7c\xb2\xed\xb2\x0e\x7a\x31\x8d"
- "\xde\x0f\x3f\xdc\x2e\xb0\xe1\x6e\x6c\x93\x9f\xbd\xb8\x1e\xb7\x6d"
- "\xcb\x3d\x34\x08\xda\x19\x04\x6d\xd0\xc2\x7d\xf1\x1e\x2e\x91\xaf"
- "\x2e\x55\x63\x8c\x0a\xda\x66\xc9\x62\xdb\x76\x13\xda\x76\x83\x6b"
- "\x1b\xbe\x17\xb6\x8f\xd4\xfb\xd1\xf0\x35\xfd\x70\xdf\xfc\xc1\x37"
- "\xa9\xf3\x78\xfc\xae\xf4\xce\x1b\xb1\x32\xb1\xfa\xc1\x2c\x29\xbc"
- "\x6c\xdd\x8f\xfa\xd0\xea\x77\x74\x53\x36\x7c\x4f\x87\x43\x14\xde"
- "\xb0\x1f\x0d\xaa\x80\x7e\x5d\x6e\xba\x8e\x68\xbf\x77\x74\x27\xb5"
- "\x75\x72\xef\x55\x22\x75\xaf\x4d\xeb\xe8\xca\xe6\x20\x9c\x17\x8b"
- "\xa8\xdd\x4a\xd1\x49\x4d\x41\x5a\xf5\xe9\xb3\x4d\x68\x4e\x12\x7e"
- "\x1f\x4b\x27\x69\x66\x22\xd5\x25\x45\x51\x72\xea\x79\xfc\xee\xe8"
- "\xc3\x49\xc2\x77\x47\x1f\x26\x20\xc5\x5e\x7f\xa4\xf8\xe3\x18\xa4"
- "\xf8\xa8\x14\x41\x39\xbb\x9f\x32\x7c\x6f\x3f\x94\x62\xa6\x7f\xa0"
- "\x33\xe9\xc8\x0c\x8a\x36\x85\x87\x78\x19\x8a\x57\xe2\x77\x29\x7b"
- "\xbb\x81\xfd\x7e\x84\x71\xd5\x17\xff\x8d\xeb\x4b\x58\x86\x7e\x72"
- "\x4d\xb1\xd7\xc7\xb7\xbe\xf3\x78\xb3\xff\x54\xb5\x99\x8e\x44\xcd"
- "\x9a\xf9\x09\x8d\xd9\xe1\x69\xcd\x38\x6f\x37\x0f\xc7\xa0\x3d\xde"
- "\xbe\x5e\x69\x88\x06\xff\xd3\x74\x20\x7e\x9f\x18\x99\x07\x3f\xec"
- "\x4b\xc6\x8f\x3d\x42\xa3\xb1\xbf\x71\x5f\xd8\x4d\x8e\xab\x71\x7f"
- "\xd8\xca\xf6\x1b\xa3\xe2\xa9\x28\x0b\x85\x90\x05\xae\x4f\xbd\x8c"
- "\xfa\xe0\xef\xcf\xe6\x43\xb9\x39\x16\x15\xee\xc7\x91\xc5\x33\xbf"
- "\x41\x57\x12\x10\x95\x7a\x0b\x75\x03\x4c\x30\xfd\xd1\x0a\xfd\x31"
- "\xbc\xda\xd7\x04\x71\xc5\x9a\x72\x17\xf9\xe2\x38\x85\xbf\xe5\x52"
- "\x51\x67\x40\xd6\x9b\xda\xee\x3b\x17\x23\x7f\xf3\xcd\xd8\x1e\xc6"
- "\x9b\xb1\x3f\xd9\x61\x45\xfe\xdd\x13\x90\x3a\x7f\x31\x60\x71\x09"
- "\xf4\xcf\x1b\xd0\x3f\xeb\x48\xff\xb4\xe1\x8f\xde\x54\x31\x14\xaf"
- "\xb1\x67\xfa\x66\x16\xdb\x37\x5f\xd7\xe2\x5c\x58\x0b\xfe\xcc\x4b"
- "\xb4\x54\x3e\x45\x23\x68\x23\xd8\xfd\x83\x91\xbb\x53\x3a\xab\x70"
- "\xee\x92\x7e\xf2\x29\x26\xef\x1b\x6e\xa6\xcd\x1f\x83\x2f\xbc\x43"
- "\x28\x0d\x9d\x33\x55\x7d\x3a\xa2\x16\x71\x79\x93\xa2\x35\x4d\xc1"
- "\x5a\xb5\xe6\x25\xfa\xe6\x25\xc5\x5e\x25\x1c\x57\x69\x5e\x1e\xa8"
- "\x06\x3f\xae\x21\x79\x96\xa2\x64\x9c\x4b\x35\x28\xf6\xe0\xfd\xff"
- "\x11\x7e\x47\xff\x35\xf3\xfe\xeb\x8f\x23\xa1\x2c\xb2\x80\xcd\xcd"
- "\x6a\xeb\x1e\xab\x7f\xf8\x81\xe2\x05\x4d\x4c\xbc\x6a\x06\x1f\x5c"
- "\x89\x47\xd4\x9c\x3a\xb0\x8d\x05\x6c\xd3\xa0\xf5\x81\xb8\x15\x81"
- "\xe3\x16\x9d\x39\xec\x70\xb2\x81\xb6\x86\x47\x2b\x68\xb0\x8b\xaa"
- "\x22\xc9\x82\x5e\x4d\x40\xf4\x9a\xeb\x60\xa3\xfa\x2a\x04\xcf\xd6"
- "\x1d\x62\x5b\x8f\xfc\x95\xc8\x7f\x27\xd8\xa7\x5b\x1d\x70\x9a\x6d"
- "\x39\x68\x7f\x4a\x89\xb7\x05\x70\x8e\xe3\x98\xef\x5a\xaf\x2e\xe0"
- "\xab\xee\x9b\x71\xbf\x85\x7e\xec\xbb\x96\x89\xab\x8c\x6f\xcd\xaf"
- "\x6b\x07\x34\xbf\xae\xd5\xc0\xaf\x9f\x2d\xd6\xd9\xe2\x0c\x9d\xf1"
- "\x41\x21\x8e\x73\x15\x49\x06\x64\x06\x5b\x76\xc7\x63\xe2\xeb\xda"
- "\x3e\x8c\x4d\x7f\x07\x36\x8d\x41\xaa\x21\x26\xe4\x05\xed\x52\x43"
- "\x9b\x51\x59\xec\x25\x1c\x5b\x03\x2d\xd0\x8f\xb0\x9d\xa1\x4e\x8a"
- "\x06\xac\x59\x33\xad\x7b\x26\xc7\x69\xd0\x49\xed\x39\x84\xf7\x71"
- "\x4d\x6d\xa4\x2f\xe2\xf7\x6f\x15\x49\x66\x44\x07\x4c\x55\x93\xdc"
- "\xf9\x9e\xea\xd3\x11\x26\x24\x8d\xe9\x8f\x4e\x72\x98\xfe\xe8\x24"
- "\x87\xe9\x8f\x98\x39\x58\x7c\x5c\x37\x16\x00\xae\xfd\xf9\xb8\xfe"
- "\xe3\x85\xfb\x8a\xeb\x29\xf2\x71\xbd\xe3\x06\x0f\xd7\x29\xff\x19"
- "\x5c\x7f\x1d\xc9\xe0\x5a\xd1\x1c\xcc\xe0\xd5\x50\x61\xfe\x04\xf8"
- "\xef\x47\x07\x6c\xb8\x3d\xf5\x47\x8c\xdb\x7d\xf5\x1d\x15\xb7\x8d"
- "\x0d\x5a\x0d\xfc\xda\x1c\xb7\x50\xa7\xcb\xb8\xfd\x3a\xb2\x09\xd9"
- "\xec\x87\xf1\x4b\x67\xbe\xa3\xd3\xa4\xa2\xe7\x21\x4e\x24\xfb\xae"
- "\xed\x87\xca\x18\x1b\x16\x25\x6b\x5e\xa6\xad\x10\x23\x98\x3d\x10"
- "\x9a\xd6\xd1\xb4\xd5\x7f\x62\x66\xea\x19\xa4\xb6\x66\x77\xd6\x54"
- "\x98\x8b\x90\x6f\x02\xce\xf1\x5b\x55\xb4\x5f\x51\x25\xe8\x70\xe6"
- "\x1d\xb4\x35\xeb\x9d\xf1\x96\xac\x6c\xa3\x05\xe2\x89\x25\x67\x66"
- "\xa6\x35\x6b\xb9\xda\xea\xf7\x91\x86\xc6\x73\x12\xfc\xb2\xd5\x0d"
- "\x19\x45\xc9\xb6\x77\xe5\xa2\xdc\xc8\x7f\x66\x26\xf4\x17\xd0\x54"
- "\xfb\xef\xc2\xbf\x14\xfc\x1b\x00\xff\x2a\xa0\x3d\xcc\x7b\x53\x79"
- "\xe3\x5c\xd1\x01\xf2\xce\x69\x6a\x10\x1b\x07\x0f\x32\x7d\xf0\x29"
- "\xd4\xed\x1a\xfb\x77\x43\xc6\x7e\x1f\xdb\xbb\xf7\x96\xf2\x9c\x3d"
- "\xf6\xe0\x7b\x83\x4d\x94\x64\x3e\x00\xf9\x3f\x9e\x6b\xc3\xd6\xc7"
- "\xfc\xdf\x1a\x14\xa6\x2a\x4e\xb9\x84\xea\x14\xfb\x93\x2a\x60\xec"
- "\xb7\x6e\x9f\x1a\xb4\xf5\x1e\xe0\x31\xa9\x25\xfe\x1e\xec\x0e\xfe"
- "\x2e\x5e\xcd\x94\x61\xf6\x23\xb5\x66\x8f\x33\xd2\xdb\x68\x0d\xd6"
- "\x90\x0d\x74\xec\x2f\xd8\x7f\x47\x61\x6c\x93\x7c\xcb\xfe\x93\x34"
- "\xd8\x0f\x7f\x7f\xbd\x65\xfe\x11\xfe\x2e\x7a\x9a\xb2\xcf\xf1\x64"
- "\x32\xde\xda\xda\x8b\xbf\x9d\x8e\xe7\xf7\x0c\x4c\x43\x69\x0d\x22"
- "\xdf\x4e\xe7\xe6\x01\xed\x3f\x60\xcd\x19\x67\x6c\xc8\xf8\x18\xfa"
- "\xcc\x87\x2a\xfe\x33\x8b\xf9\xc2\xa0\xf8\xb8\x8f\xd4\x39\x79\x7e"
- "\xf8\x58\x72\xff\xff\xb1\x5a\x0b\x2d\xb3\xae\xf5\x92\xbc\x3a\xe8"
- "\xc9\x82\xf0\x3d\x96\x62\x6b\x73\xa4\xef\xc9\xe4\xeb\x32\x39\xd1"
- "\xc7\x92\xf3\xdf\x2c\xd9\x13\x0f\x98\x9f\x84\xba\x43\xfa\x21\xcb"
- "\x92\xc8\x71\xf8\x1d\x08\xe6\x7a\x6b\xe2\xc8\x9c\xb1\xd2\x3d\x66"
- "\x84\x79\xdf\xde\xc5\x25\x54\x53\x73\x24\xea\x6e\x44\xea\x29\xf5"
- "\xa9\xf4\xd6\x1b\x28\x88\x7e\x3d\xd2\x77\xf3\x0d\x34\xb2\xf9\x4e"
- "\x60\xd7\xb7\x97\x21\x65\x13\xc4\xe4\xa6\xe5\xb1\xbe\x78\x7e\xda"
- "\xe7\xd7\x8a\xa9\x0a\xf3\x61\xcc\x33\x83\xf0\x38\x80\xdb\x6e\xb9"
- "\x13\xd9\x7d\xe3\x6d\xc4\xbc\x57\x2e\x9e\xf7\x07\x18\x07\x0e\x5c"
- "\xf5\x5e\x03\xb1\x0f\x62\x17\x33\x1e\xb8\x31\x16\x34\xc1\x58\x30"
- "\x39\x92\x36\x95\x57\x7d\x83\x52\xaf\x23\x75\xea\x0a\xd4\x0d\xd7"
- "\x5f\x61\x3e\x46\xc6\x87\xe9\x30\x3e\xc0\xff\x41\x4b\xb4\x8c\x0f"
- "\x9a\x29\xc8\x61\x7c\xc0\x3a\xa4\xbc\xba\x16\x01\x96\x3b\x4f\xa9"
- "\xf7\x35\xa5\xd4\xd3\x56\xac\x49\xf0\x3b\x6c\x28\xd3\xdd\x36\x56"
- "\xe0\x71\xa2\x89\x1d\x27\xf2\xd9\x71\xe2\xdd\x36\x18\x27\xde\xc5"
- "\xe3\xc4\x39\x44\xed\xc0\x63\x04\x8c\x0f\x1f\x7d\x67\xa4\x9a\x61"
- "\x4c\x90\xe7\xe7\x83\x27\x24\xf1\xb3\x3d\xe2\x8e\x15\xc6\x62\xec"
- "\xe7\x37\xc0\xbf\xd8\xcf\x15\x5a\xf0\x6d\x55\xe7\xf1\x8d\x70\xdc"
- "\xbc\x3d\x34\x6a\xcf\x15\x23\x45\x67\xff\x3c\xad\x11\xf0\xb0\xfa"
- "\x2e\xa2\xcc\xfe\x13\x0f\x14\xbd\x9c\x49\x61\xdd\x6a\xcd\x09\x2d"
- "\x24\x1a\xf9\x90\x1e\xe7\x68\x7c\x6b\x91\x1a\xe7\x4f\x2d\x74\xa4"
- "\xaf\xf5\xc7\xc8\x6e\xd6\x85\x81\xaa\xe6\x1f\x03\xbb\x6e\x5a\x80"
- "\x94\xc6\x85\xb1\xbe\xa9\x33\x90\xfa\x8b\x7f\x64\x52\xe5\xf5\xd0"
- "\xb7\x3b\x7d\xd1\x87\x86\xfa\x77\x5f\x42\xba\xdd\xf3\xd0\xf0\x5d"
- "\x57\x90\x66\x57\x0c\x1a\xb4\xf3\x0a\x60\x68\x61\x64\xf7\x66\x06"
- "\x1f\x8d\xc5\xcc\x9c\x80\x18\x34\x9a\xee\x19\x16\x05\xff\xea\x32"
- "\x63\x40\xcf\xf4\x0c\x8d\xa2\x03\x26\x1e\xb0\x42\xb9\xcd\xa0\xdd"
- "\x80\xa3\x43\x1b\xfe\xd4\x5f\x0c\x37\x3b\x65\x72\x88\xc9\x11\x80"
- "\x9b\x4a\xc0\xcd\x2d\x21\x6e\xb0\x6e\x65\xb0\x33\x99\x60\x07\xbf"
- "\xf3\xdb\xcd\xe7\x17\xf3\x4e\xbb\x8d\x9f\x3c\xe0\xcf\x8d\x76\xf8"
- "\xc9\xbb\xe1\x19\x7e\x9a\x01\x3f\x79\xeb\x00\x3f\x65\x88\xca\xb5"
- "\x7a\x82\x9f\x43\xcc\xfe\x17\x38\xcf\x47\xe6\x0a\x7d\x32\x17\xfb"
- "\xd9\xa0\xf8\x24\x6a\xba\xd6\x0b\xb9\x89\x2b\x83\x73\x5c\xe9\x82"
- "\x08\xae\x3e\xcb\x72\x03\x57\x89\x80\x2b\x83\x73\x5c\xdd\x95\xc2"
- "\x95\xc1\x11\x57\x9f\xae\x6a\x5f\x5c\x31\xfb\x76\xfe\x17\xe0\xea"
- "\xb3\x59\x42\x5c\x1d\x3a\x42\x70\x75\xe8\xb0\xfb\xb8\xd2\xb5\x12"
- "\xaf\x74\x6c\xbc\x3a\x7c\xd5\x0d\x5c\x95\xd2\x50\xbf\x73\x5c\x5d"
- "\x97\xc0\x95\x4e\x24\x5e\xfd\xf9\x4c\xfb\xe2\x8a\xd9\x57\xf4\xbf"
- "\x00\x57\x87\x0f\x09\x71\xf5\x67\x3f\x82\xab\x3f\xab\x3d\xc0\x55"
- "\x2b\xf1\x4a\xcf\xc6\xab\xbf\xbe\x20\x1f\x57\xc5\x41\x80\xab\x56"
- "\xe2\xd5\x05\x29\x5c\x89\xc4\xab\xbf\x84\xb4\x2f\xae\x98\x7d\x4f"
- "\xff\x0b\x70\xf5\x57\x1f\x21\xae\x8e\xc4\x11\x5c\x1d\x89\x75\x1f"
- "\x57\xfa\x56\xe2\x95\x9e\x8d\x57\xc7\x76\xb8\x81\xab\x64\x1a\xea"
- "\x77\x8e\xab\x63\x12\xb8\xd2\x8b\xc4\xab\xa3\x6b\xdb\x17\x57\xcc"
- "\xbe\xac\xff\x05\xb8\x3a\x16\x2d\xc4\xd5\x5f\x8f\x13\x5c\xfd\xb5"
- "\xd8\x03\x5c\xb5\x12\xaf\xc2\xd8\x78\xf5\xc5\x2d\x37\x70\x75\x16"
- "\x70\xd5\x4a\xbc\x5a\x23\x85\x2b\x91\x78\xf5\xf9\xf9\xf6\xc5\x15"
- "\xb3\x6f\xec\x7f\x01\xae\xbe\x38\x2a\xc4\xd5\xe7\xbd\x08\xae\x3e"
- "\x0f\x74\x09\x57\x26\x1e\xae\xaa\x3b\x8f\x6f\x4a\x25\x7a\x70\x6f"
- "\x0c\x8b\xab\x0f\x9e\x2c\x78\x63\x05\xa2\x8a\x66\xe6\xda\x69\xc1"
- "\x2f\x47\xd9\x63\x0a\x70\xc1\x60\xca\xbc\x10\x30\x75\x8d\x60\x2a"
- "\xe5\x02\x60\xea\xdb\x5c\xaa\x22\xe9\x3a\xc6\x09\x83\xa1\xbc\x18"
- "\xc0\x10\xd6\x85\x5e\x4a\x7f\x39\x1a\xf0\xed\x6b\x36\x2c\x1d\x0f"
- "\x6e\x13\x2c\x4d\x03\x2c\x9d\xb5\xc7\xd2\x49\x0e\x4b\x53\x25\x34"
- "\xe0\xab\x12\x58\x32\xb4\x8e\xa5\x9d\x38\x87\xb0\xe4\x3e\x61\xe9"
- "\x0c\x97\x43\xd8\x37\xcf\x48\x99\x03\xe4\x62\xe9\x4b\x95\x10\x4b"
- "\xc5\x8b\x08\x96\x8a\xe3\xdd\xc7\x92\xce\x20\x8d\x25\x1b\x9f\x3a"
- "\xb1\xd1\x33\x2c\x01\xb7\x12\x60\xa9\x75\x1e\xc5\x61\xe9\xab\xa5"
- "\xed\x8b\x25\x3b\x1e\xf5\xd0\x62\xe9\xc4\x34\x21\x96\xbe\x64\x75"
- "\xdf\x97\x92\xba\xcf\x0a\x63\x17\x7e\xe7\x84\xd7\xe0\x5a\xee\x44"
- "\x8e\xb3\xc0\x98\x86\xd7\xe2\xe2\xf7\x14\x1f\x2f\xae\xa4\x30\x9e"
- "\x32\x6e\xa3\xa0\xcd\xcb\xd0\x48\x5f\x13\xc1\x8a\x19\xb0\x92\x7e"
- "\x1b\x29\x9b\x9b\x01\x27\x4d\x48\xd9\x08\xf6\x6e\x6c\x8e\xf5\x2d"
- "\x8d\xaa\x45\x5f\xdc\xa8\x84\xb1\xec\x30\xda\x05\xd7\x34\xb3\x79"
- "\x48\xeb\x1b\x91\xdd\x37\xae\xc6\x79\xc8\x32\x54\x3c\xf3\x5d\xf0"
- "\xff\x49\x8f\xfd\xdf\xf8\xa6\x94\xff\x8f\x09\x7c\x9f\xc7\xf3\xbb"
- "\x66\xa2\xfb\x79\x48\xe6\x3d\xd5\x62\xe2\x7b\x9b\xdf\x77\xb4\x81"
- "\xdf\x77\xb0\x7e\xf7\x6c\x3c\xfa\x9b\xf4\xfc\x47\x5e\xac\x60\xe6"
- "\x14\x98\x48\x8c\xb0\xc5\x05\x1c\x23\x30\x7f\x69\xf4\x0f\x8d\xb6"
- "\x1f\x6f\x70\x7c\xb8\xa1\x28\x39\x82\xc7\x26\x49\x1e\xc3\xc6\x89"
- "\xd4\x55\x24\x4e\x10\x1e\x73\x7c\x50\xdb\xe6\x1f\xff\xef\xbd\xfb"
- "\x17\x2f\x8e\xb5\x3e\xf6\x78\xc0\x63\x30\x6e\xf2\xec\x70\x73\x3f"
- "\xe2\x85\x7b\xb8\x29\x59\x2f\x8c\x17\x7f\xbb\x48\xe2\xc5\xdf\x0c"
- "\xae\x8c\x3d\xad\xe0\xa9\x86\xc3\x13\xc9\x39\x12\x3c\x7d\xdd\x05"
- "\xe7\x28\x65\xe2\x29\xad\x6d\xf3\x8e\xa7\x6e\xb5\x2f\x9e\xda\x2e"
- "\xef\xd8\xb1\xf1\x74\xfa\xac\x10\x4f\xa7\x86\x11\x3c\x9d\x1a\xea"
- "\x39\x9e\x74\xbc\xf8\xa4\xe3\xc5\xa7\xb2\x19\x38\x37\x29\x13\x4f"
- "\x67\xdb\x36\xdf\x58\xfa\x42\xfb\xe2\xa9\xed\xf2\x8d\x1d\x1b\x4f"
- "\x65\x41\x42\x3c\x7d\xbd\x96\xe0\xe9\xeb\xb4\x36\xc0\x53\x8d\x3d"
- "\x27\x26\x78\xaa\xd8\x8b\xf9\xb3\x3c\x3c\x7d\xa9\x6d\xdb\x3c\x63"
- "\x79\x56\xfb\xe2\xa9\xed\xf2\x8c\x1d\x1b\x4f\x15\x89\x42\x3c\x95"
- "\x9d\x21\x78\x2a\xab\xf4\x1c\x4f\x7a\x5e\x7c\xd2\xf3\xe2\xd3\x99"
- "\x46\x9c\x8b\x94\x89\xa7\x36\xce\x2f\x56\x5e\x6c\x5f\x3c\xb5\x5d"
- "\x7e\xb1\x63\xe3\xe9\xcc\x09\x21\x9e\x2a\xfb\x13\x3c\x55\x6a\xda"
- "\x00\x4f\xbc\xf8\x14\xc6\x8b\x4f\x67\x27\xe0\x1c\xa4\x4c\x3c\x55"
- "\xb6\x6d\x5e\xf1\xef\xc3\xda\x17\x4f\x6d\x97\x57\xec\xd8\x78\x3a"
- "\xeb\x2f\xc4\xd3\x37\x4b\x09\x9e\xbe\x49\x70\x35\x17\x64\xcb\x01"
- "\xf1\xf1\x24\xad\xed\xfe\xb1\xc5\x5e\xdb\xc9\xcb\x01\x81\xce\x73"
- "\x3b\x9f\x78\x6e\xc5\x83\x9a\x4f\xc4\x18\xb2\xe5\x81\x3a\x5e\x0e"
- "\xe8\x1f\x91\x42\x0c\x9d\x3d\x46\x30\x74\xf6\xa8\x14\x86\xcc\xfc"
- "\x39\x69\x3f\xf0\xe6\xa4\x5d\x47\x54\xd1\xe2\x62\xaa\x9c\x9d\x93"
- "\x86\xe7\xa3\x95\xd7\xd4\xa2\x8d\xf7\x90\xba\x7b\x2c\x52\x4f\x49"
- "\x48\xa5\xb7\xe2\x18\xb2\x3c\xd2\xf7\xed\x2b\x68\x64\x33\x60\x26"
- "\xe3\x1a\x3b\x2f\x0d\x70\xf3\x75\xb5\x09\x7d\xbe\x18\xcf\x4b\x3b"
- "\x80\x76\x43\x39\x73\x36\xc9\x07\xe1\x38\xc2\xcc\x49\x8b\xc1\x73"
- "\xd2\xfe\xb9\x46\x74\x4e\xda\x3a\x99\x73\xd2\x12\x01\x07\xf5\x80"
- "\x83\xbb\x18\x03\x9f\x0a\xe6\xa2\xed\x5c\xc7\xcb\x01\xcd\x93\xc8"
- "\x01\x55\xb9\xf6\x4e\xa2\xcd\xe7\xa2\xdd\xe4\xcd\x45\xb3\xe5\x80"
- "\x66\x42\xec\x90\xed\xf7\xaa\x08\x67\x39\x20\x0b\xc4\x84\x29\x78"
- "\x6e\x79\x3d\x97\x2f\x4e\x8e\xc3\x6b\x7f\x43\xa3\xcc\x10\x2b\xf0"
- "\xfc\xf1\xfd\xf3\x4a\x98\x7c\x5f\x45\x52\x15\xda\xd8\x84\xd4\xbe"
- "\x46\x36\x2e\x04\x84\x16\x36\x43\x6c\xb0\xc0\xb8\x04\xbe\xee\xd6"
- "\xbc\x1c\x62\xc3\x6d\x88\x0d\xcb\x21\x36\xdc\x85\xd8\x70\xa9\x84"
- "\x89\x0d\xf4\x5b\x5f\xf4\xc1\xfb\x6f\xef\xbe\x86\x86\xe7\x5f\x43"
- "\x3a\x1c\x03\x2c\x39\x13\x0f\x34\x07\x84\xae\x37\x06\x84\xa6\xc3"
- "\xb9\x5c\x82\x81\xc6\xe2\xcd\xcb\x10\x13\xeb\xb1\xef\x35\x31\x38"
- "\x1e\x9c\xdf\xd0\xbc\x0e\x21\x4f\x70\xd0\xcc\xcf\x09\xf2\x71\x20"
- "\x11\x03\x3c\xc6\x82\x5d\x1e\x78\xa7\x87\x31\x00\x63\x61\xa7\x2d"
- "\x06\x78\x84\x85\x6f\x25\xd7\xff\xb4\x82\x05\x43\xeb\x58\xd0\x05"
- "\xb9\x88\x85\x44\xbc\x6f\xb5\x23\x16\x74\x4a\x63\x80\x4e\x05\xe7"
- "\x02\x09\x16\xee\x8a\x60\xe1\x5f\x59\xf7\x1f\x0b\xc2\x9c\xcc\xc3"
- "\x8b\x85\x6a\xc9\xef\xbf\x3a\xc7\x82\xce\x85\xb8\xa0\x73\x35\x2e"
- "\x94\xe2\xfd\x9e\x45\xb0\x00\x71\x41\x07\x71\x41\xc7\xc6\x85\xeb"
- "\x22\x58\xb8\x90\x7f\xff\xb1\x20\xcc\xa7\x3c\xbc\x58\xf8\x4e\x7a"
- "\xff\x0b\xe7\x58\x70\x21\x2e\xe8\x5d\x8c\x0b\xc5\x41\x78\x9f\x64"
- "\x47\x2c\xe8\x21\x2e\xe8\x21\x2e\xe8\xd9\xb8\x70\x41\x04\x0b\xdf"
- "\xef\xbd\xff\x58\x10\xe6\x42\x1e\x5e\x2c\x18\xd2\xdc\xc3\x82\xde"
- "\x85\xb8\xa0\x77\x31\x2e\x14\x27\xe3\xfd\x85\x45\xb0\x00\x71\x41"
- "\x8f\xf7\x1e\x66\xe3\xc2\x31\x11\x2c\x5c\xfc\xf4\xfe\x63\x41\x98"
- "\xc7\x78\x78\xb1\x70\x49\xf2\xfb\x27\xad\x60\xc1\x85\xb8\x10\xe6"
- "\x6a\x5c\x38\x8b\xf7\xe5\x75\xc4\x42\x18\xc4\x85\x30\x88\x0b\x61"
- "\x6c\x5c\x58\x23\x82\x85\x7f\x1f\xbf\xff\x58\x10\xe6\x20\x1e\x5e"
- "\x2c\xd4\xe4\x3a\xc5\x02\xed\x88\x05\x9c\x43\xc0\xfa\x11\xef\x7b"
- "\xcd\x60\x61\x41\x31\xd5\x44\x63\x2c\x94\xa0\x4d\xab\x79\x58\xc8"
- "\x21\x3a\xc2\x86\x83\x2d\x7c\x1c\xe0\xf5\x4b\x18\x07\xa0\x1f\xcc"
- "\xe0\x77\x7a\x7b\x58\x14\x33\x5f\x29\x27\x34\x17\xeb\x07\x9c\x67"
- "\xc0\x1a\x42\x5a\x3f\x5c\x3e\xd9\x26\x18\x88\x07\x0c\xd4\x89\xeb"
- "\xc8\x36\xd7\x0f\x37\xef\x13\x06\x40\x4b\xbe\x9b\xe2\x09\x06\xae"
- "\xe4\xc9\xc7\x00\x70\x04\x97\x30\x40\x78\x82\x73\x0c\xe8\x11\x87"
- "\x01\xe0\x0b\x39\xfa\x40\xcc\x0f\x08\x06\xf4\x2a\x69\x7e\xf0\xc3"
- "\xa9\xfb\x8f\x81\x36\xe6\x07\x1d\x16\x03\xb5\x05\x92\x6b\x18\x71"
- "\x2c\x87\xb8\x3f\x25\xa4\x1f\xa2\x17\x46\x8e\xcb\xb8\x86\x82\xde"
- "\x5e\x80\x46\xe2\x7d\x63\x8a\x9a\x4c\x54\x4a\x02\xfd\x03\x5e\x5b"
- "\x6d\x86\xe7\xc0\xfb\x88\x32\xf8\xb8\x19\xa8\xaa\x88\x35\xa2\x8d"
- "\x80\x85\xb7\xe1\x19\xf0\x1e\xf1\xdd\x13\x3a\x8f\x2f\xaf\x3f\x8d"
- "\x9a\xee\x44\xa2\xd2\xa8\x6b\x28\x5c\x4b\x37\x57\x54\x17\xe3\x35"
- "\x8c\xca\xe2\x95\xa7\xf1\x3a\xf1\xae\x73\x92\x10\x75\x43\x71\x35"
- "\x1a\xe7\x94\x86\x24\x21\x75\xde\x35\x92\x47\xda\x78\x03\xa1\x93"
- "\x49\x08\x11\xbf\x5f\x3d\xee\xbd\xaa\x0d\x72\x48\xb3\xc0\xef\xd5"
- "\x36\xbf\x9f\x14\xe6\x90\x28\x17\xd6\x33\xba\x90\x3b\xbc\x2f\xeb"
- "\x19\x6f\x3a\xae\x67\x74\x2f\x77\x78\x2d\xdb\xe9\x3c\x22\x96\x07"
- "\xbc\x91\xc8\xf4\x7b\xc6\xaf\xcd\x10\xfb\x2b\x92\x0e\x33\xf3\xa3"
- "\x71\x3f\xc7\x7d\x1e\xe3\x23\x15\x9e\x17\x63\x04\xe3\x61\xca\x9e"
- "\xe6\xe6\x57\xeb\x11\x65\x0d\x08\x2d\xc4\x98\xb0\x2e\x09\x54\x6d"
- "\x86\x67\xaa\x88\xba\x04\x7e\xbf\x8d\x2a\x6a\x58\x9f\xaf\xbe\x04"
- "\xbe\xfc\x31\x82\x5e\xa2\xed\xfa\xb3\x7a\xa4\x4e\x3d\x8f\xd4\x73"
- "\xf0\x9a\x63\x18\x07\x76\x02\x27\xd8\xbd\x00\x0d\x87\xf1\x20\xad"
- "\x99\x8d\x0d\x56\x5b\x5e\x09\x8f\x11\x80\x89\xb7\x17\x03\x26\x40"
- "\xe1\x68\x5e\xc5\x98\xf8\xf1\x9c\xf7\x0a\x91\xfc\xb2\x0c\x4c\x30"
- "\xf9\xe5\x68\xc0\x44\x0d\x87\x89\x96\xbc\xb2\xc4\x98\x50\x3c\xd3"
- "\x83\xb9\x85\x22\xf1\xc0\xe3\xbc\xf2\x4d\x36\xaf\xcc\x8b\x07\xee"
- "\x61\xa3\x4e\x7a\x4f\x4c\x69\x6c\x18\x5a\xc7\x46\x03\x8b\x0d\x5d"
- "\x50\xeb\xd8\xb8\x1e\x2f\x82\x8d\x44\x0e\x1b\x3a\xc4\x61\x83\xcd"
- "\x33\xe5\xe8\x02\x1d\xb1\x71\xfd\x56\xfb\x60\xc3\x6e\xde\xcf\x43"
- "\x8b\x8d\x1b\xa5\xf2\xb1\xa1\x73\x21\x6e\xdc\xb4\x61\xc3\x85\xb8"
- "\x71\x33\x5d\x04\x1b\xa5\x3c\x6c\xf0\xe2\x06\x9b\x77\xca\xd1\x89"
- "\xc4\x0d\x63\xb7\xf6\xc1\x86\xdd\x1c\x9e\x87\x16\x1b\x46\xc9\xef"
- "\x1f\x3b\xc1\x86\x0b\x71\xe3\x7b\x16\x1b\x7a\x17\xe2\xc6\xad\x42"
- "\x47\x6c\x14\x07\x71\xd8\xd0\xf3\xe2\x06\x9b\x87\xc2\x9c\xd3\x01"
- "\x1b\xb7\x43\xda\x07\x1b\x76\xf3\x71\x1e\x5a\x6c\xdc\x51\xca\xc7"
- "\x86\xde\x85\xb8\xf1\x85\x0d\x1b\x2e\xc4\x8d\x3b\xc5\x22\xd8\x48"
- "\xe6\x61\x83\x17\x37\xd8\xbc\x54\x8e\x5e\x24\x6e\xd4\x8f\x6d\x1f"
- "\x6c\xd8\xcd\xad\x79\x68\xb1\x71\x57\xe3\x06\x36\x5c\x88\x1b\xa9"
- "\x2c\x36\xc2\x5c\x88\x1b\x77\xab\x45\xb0\x71\x96\xc3\x46\x18\x2f"
- "\x6e\xb0\x79\xaa\x9c\x30\x91\xb8\x71\x6f\x6e\xfb\x60\xc3\x6e\x9e"
- "\xcc\x43\x8b\x8d\x86\x91\xae\x60\x23\xb9\x5e\x44\xa7\xd4\x10\x6c"
- "\x34\x43\x19\x3e\x2e\xf8\xda\x04\x9e\x4f\x19\x0e\x9a\x05\x63\x62"
- "\x76\x32\xa2\x18\x5c\xd4\xf3\x71\xd1\x50\x8f\x71\x31\x38\x16\x70"
- "\x71\x99\xc5\x85\x4d\x97\x30\x7b\xaf\x10\x6d\x62\xcb\x59\xd9\xf4"
- "\xc9\x26\xac\x59\x63\x6d\x98\x30\xad\xf0\x8e\x6b\x03\x4c\x08\xe6"
- "\x3d\xf0\x30\x31\x43\x42\x9f\xbc\xec\x3e\x26\xde\x05\xed\xda\xdc"
- "\xd6\x6b\x9f\x6c\x98\x38\xef\x29\x26\x1a\x9d\xce\x7f\x10\xc7\x04"
- "\xcb\x33\x24\x31\xc1\x71\x0b\x82\x89\xef\x9d\x60\xa2\x49\xe5\x88"
- "\x09\x96\x57\x30\xfb\x10\x10\x6e\x61\xcb\x61\xd9\xf8\x85\x10\x13"
- "\x4d\x1b\xdb\x07\x13\x76\xfc\xe2\xa1\xc5\x44\x73\xb4\x64\x0e\x6b"
- "\x1d\xa2\xf2\xd7\x59\x0f\x64\x52\xd6\xc3\xf0\x2b\x86\x5f\x09\x1c"
- "\xf3\x86\x63\x95\xf8\x1a\xf8\x3f\x73\xce\xda\x95\xd9\x7b\xb8\xd8"
- "\xd7\x2b\x0a\xdb\x1b\x97\xe9\x64\x2b\xe3\xbb\x16\x8d\xde\xcd\xd6"
- "\x01\xc7\xd3\xe0\x78\x71\x77\xaf\xd1\x9d\xa0\x7c\x09\x9d\xf1\xb1"
- "\x0e\x8e\x75\xc6\x65\xe9\xb5\xca\x40\x66\x4e\x16\x45\xe1\x3a\xec"
- "\xef\xa9\x62\xcb\xf4\xe1\xdf\xb7\xdb\xda\xd1\x78\x2f\x3f\x5b\x99"
- "\x2e\x56\xea\x5f\x7b\x70\x39\xab\x97\x12\x7f\x0f\x4d\xc3\x2f\x4b"
- "\xbf\x88\x70\xbd\xb6\xb2\x5d\xd9\xfa\x82\xf8\x65\x2c\x7f\x40\xa8"
- "\xbb\x97\x86\xa9\xb3\x7b\x02\x85\x9f\x09\x97\x7d\x8c\xee\x5e\x94"
- "\xc9\x94\xf7\x52\x6a\x05\xe5\xdf\x42\x4c\x59\xb6\x9c\x0f\xdd\xe9"
- "\x84\x3f\x5b\x8e\xd9\x9f\x1d\x8e\x29\xf9\xf6\x63\xcb\x75\xb3\xd9"
- "\x06\xef\xdf\xc7\x7f\x56\xcb\x3a\x0a\xd7\x87\xcb\x74\xb7\x76\xfa"
- "\x2a\x88\x7d\x96\xe1\xfc\x7b\xe2\x72\x70\xdd\x30\xd6\xce\xbe\xf0"
- "\x0c\xba\x96\xfa\x32\xe9\x48\x5b\x39\xc0\x61\xaf\xdd\x9c\x6d\xd4"
- "\x60\xeb\x52\xbc\x67\xb9\xbd\xef\xba\x7b\x79\x19\xb0\xef\x2a\xea"
- "\x10\xc2\x65\xe9\xee\x1f\xa7\x41\x79\x3f\xf6\x39\x46\x93\xe7\x60"
- "\xf6\x4c\x24\xbe\xa6\xcc\x3f\xd9\xc5\xb4\xd5\x4b\xc3\xb6\xb5\x07"
- "\x94\x1b\x63\xab\xd7\x4a\x31\x18\x66\xcb\x2a\x99\xb2\xe5\xf1\xf8"
- "\xfb\x5e\x2d\xe5\x7f\x82\xcb\x5a\x32\x8a\xfb\x58\xd6\x2a\xc7\xdb"
- "\xd7\x6f\x59\xa7\xc2\xe7\xf9\xf5\xfb\x93\xf2\x9f\xf8\x40\xf9\x49"
- "\x8e\xe5\xd5\xf6\xe5\x03\x48\xf9\x43\xd1\x50\x3e\xc2\xb1\xbc\xb9"
- "\x87\x5d\xf9\x9e\xa4\xfc\x67\x47\xa1\xfc\x34\xc7\xf2\x1a\xfb\xf2"
- "\x8f\x93\xf2\x5f\xc6\x42\xf9\x48\xc7\xf2\xa3\xed\xcb\x07\x92\xf2"
- "\x47\xfc\xa1\xfc\x2c\xc7\xf2\x69\xf6\xe5\x7b\x91\xf2\x7f\x8d\x87"
- "\xf2\x51\xf6\xe5\x77\x33\x65\xd1\x00\xb6\x6c\x6f\x52\xf6\xd8\x09"
- "\x28\x1b\x2d\xf2\xac\x0a\xb6\xee\xa1\x6c\xf9\xff\x47\xca\x1f\x08"
- "\x82\xf2\xb1\x8e\xe5\x95\xf6\xe5\xfb\x90\xf2\x67\x13\xa1\x7c\xbc"
- "\x88\xaf\xec\xcb\xf7\x25\xe5\xff\x96\x0d\xe5\x13\x44\x7c\x65\x5f"
- "\xbe\x1f\x29\x5f\x52\x03\xe5\x13\x45\x6c\x6f\x5f\xfe\xa7\xa4\xfc"
- "\xd7\xc3\xa1\x7c\x92\x88\xed\x85\xe5\x33\xca\xd6\x43\xb9\xe4\x5d"
- "\x2c\x36\xed\xec\x6e\x5f\x77\x7f\x52\x77\xc5\x59\xb8\x26\xcd\xb1"
- "\x3c\xf2\x22\xe5\xd1\x33\x6c\xf9\x01\xa4\xfc\x37\xd8\x96\xeb\x45"
- "\x6c\xff\x04\x2e\xbf\x9b\x94\x7d\x82\x94\x3d\x71\x08\xca\xa6\x8b"
- "\xd8\x9d\x5f\x36\x88\x94\xad\x31\x40\xd9\xcd\x22\x36\xe7\x97\x0d"
- "\x26\x65\xab\x72\xa1\x6c\xa6\x88\xbd\xf9\x65\x9f\x24\x65\xbf\x2d"
- "\x84\xb2\xd9\x22\xed\x1d\xc0\x2b\x3b\x90\x94\xad\x3e\x00\x65\x73"
- "\x45\xfc\xc2\x2f\xab\x25\x65\xaf\x60\x1f\xe6\x89\xf8\x84\x5f\x36"
- "\x84\x94\xfd\x0e\xf7\xb5\x02\x11\x9f\xf0\xcb\x3e\x45\x67\x18\x4a"
- "\xd8\x38\x5d\x68\x5f\x76\x17\x17\x77\x9f\xb6\x76\xbf\x74\x96\x8d"
- "\x95\x7b\x98\x38\x08\xe5\xb8\x31\xc7\xfc\xac\x6d\x8c\xb0\x52\x68"
- "\x10\x9d\xf1\x8f\xc3\x70\x1d\xae\x73\x9f\x63\x6c\x53\x3e\xbb\x8b"
- "\x1b\x23\x06\xd3\x19\x0d\xeb\xd9\xfb\x1f\x70\x2c\xab\xe2\x97\xfd"
- "\x19\x9d\x71\xad\x9a\x2d\x7b\xc8\xb1\xac\x9a\x5f\x76\x08\x9d\x51"
- "\x67\x62\xcb\x1e\x16\x89\xaf\xcf\xf0\xca\x0e\xa5\x33\x6e\xfa\x43"
- "\xb9\xa3\x62\xf1\x95\x5e\xa7\x79\x06\xc7\x03\x5b\xec\x86\xf2\xc3"
- "\x88\x7d\x1b\x31\x1e\x8a\x71\x79\x5b\x59\xf0\xc3\x33\xbc\xb1\xf2"
- "\x19\x6b\xf7\x5b\x43\x59\x9b\x9d\x70\x6c\x43\x1a\xbf\x0d\xcf\x92"
- "\x3a\xef\x4c\x82\x3a\x4b\xec\xdb\xc0\xc6\x23\xcc\x13\xb0\x7d\x87"
- "\x5b\x32\xee\xe2\x6f\xd4\x54\x42\xd9\x52\x01\x47\xa0\xbc\x14\xb8"
- "\x4e\xd6\xb7\x23\xe8\x8c\xda\x5a\xd6\x06\x82\xf1\x08\xfa\x23\x13"
- "\x0f\xc1\xbf\x25\xf4\x5b\xfe\x6a\x28\xfb\x1c\x5b\xee\xac\xfd\x38"
- "\xc8\xb6\x2f\x14\xce\x55\xb5\x8c\x81\x5e\xca\x6a\x31\x2e\x93\xf0"
- "\x14\x7a\xec\x9a\x92\xd8\xa4\xe5\x1b\xbf\xca\x4e\x0c\xb6\xad\x85"
- "\x03\x47\x87\xd7\xd3\x66\xfe\xb1\xad\x14\x5d\x39\xa4\x1e\x29\xf1"
- "\x3e\xdd\x74\x40\x44\xad\x01\x8e\x1b\x83\xb5\xea\x86\x6d\xca\x52"
- "\x83\xd7\xe7\xcc\x37\xe4\xe0\xef\x2a\x03\x5a\xa0\xc4\x7f\x6f\x5d"
- "\x47\x9b\xf0\xfe\xc9\x96\x6d\xb4\xa6\xc2\x5a\x07\xf8\xa3\x4d\x50"
- "\x87\x09\x38\xa3\x02\x7f\xdf\x1a\x7f\x47\xa2\x22\xa9\x0e\x5d\x51"
- "\x7a\xf7\xa5\x97\xc4\x8e\x84\x36\x24\xc0\xfd\xa2\x2f\xc1\xff\x89"
- "\x4d\x81\x53\x67\xd2\x23\x8b\x97\x35\xe1\x32\xf3\x8d\x01\x33\x13"
- "\xe8\x37\x5f\xa9\x4d\x48\x41\x3f\xbd\xa6\xf4\x66\x62\x3b\xde\xc3"
- "\xd6\xea\x47\x8f\x64\xf6\xae\xbd\x19\xfb\x0b\x66\xdf\x5a\x65\xa7"
- "\x38\xbc\x5f\x2d\xde\xb7\xb6\x65\xcf\xda\x82\x18\x35\xb3\x0f\xae"
- "\xd2\xfb\x08\xf3\x2c\xeb\xe8\x4a\x3a\x68\xa0\xd6\xda\xb4\x3e\x0d"
- "\x7f\x8b\xba\x38\xe5\x1a\xba\xc4\x9e\xc3\x75\xb2\xf5\xe8\xed\xeb"
- "\xc1\xd7\x19\xfb\xc7\xa8\xc1\x06\x5a\x4b\xe6\x33\x81\x56\xf5\x33"
- "\xfe\x74\xe6\x48\x5d\x45\xbc\x01\x31\xdf\x61\x54\x76\xda\x41\x77"
- "\x9f\x51\x61\xcd\x1c\x66\x86\xe3\xda\x8a\xfa\x26\xe6\xf8\x25\x65"
- "\x27\x25\xe6\xbd\x77\xd4\xba\xff\xcf\xde\xdb\xc0\x47\x59\x5d\xfb"
- "\xc2\x6b\x26\x13\x08\x18\xc8\x24\x04\x1c\x29\xea\xa0\xc1\x46\xe5"
- "\x23\x7c\x68\x91\x82\x44\x49\x20\xd4\x00\x51\x40\xa2\x7c\x06\x13"
- "\x4d\x4a\x80\x48\x22\x0c\x10\x32\xc3\x80\x16\x5b\x3e\x86\x18\x31"
- "\xd6\x90\xc4\x4a\x7f\x2f\xe7\x1e\x5a\xd3\x5b\x7a\x4f\xee\xb9\xb4"
- "\xa6\x25\xe7\x5e\xda\x42\x86\xd3\x97\xfe\x6e\x4e\x2f\xb6\x23\x37"
- "\xa5\x91\x13\x70\x34\x03\x19\xc8\x64\xf6\xfb\x5f\x7b\x3f\x4f\xe6"
- "\x23\x13\xd4\x7b\xbc\xf7\xbc\xbf\xf7\x35\xfa\xf0\xcc\xb3\xf7\xda"
- "\x6b\xaf\xbd\xd6\xda\x6b\xaf\xfd\xdd\x29\x5c\x33\xbb\x5a\xc6\xde"
- "\xa2\x0e\xd3\x10\x79\x77\x15\x87\x8b\xc3\xb3\x67\x32\x3f\x83\x87"
- "\x67\xa7\xc7\x59\xc8\xd4\x9d\x3c\xb3\xb3\xa7\x7a\x48\x9a\x7e\x1f"
- "\x9d\x9e\x17\xe3\xf5\x68\xb8\xbe\xf0\x99\xbb\xa6\xf8\x13\x7c\xe6"
- "\xee\x97\x80\x2f\x64\xf8\xd8\x77\x90\xc0\xbf\x3a\x2c\xf2\x41\x5b"
- "\x0b\xfc\xe4\x63\x4a\xe6\x43\xce\xa2\x04\x9a\xfc\x87\xb4\x7b\x0c"
- "\xc6\x89\xda\xef\x0e\x8f\xe1\x67\x27\xb5\xdf\x5e\xfd\x8c\xe3\x98"
- "\x78\xcd\x62\x22\x64\x9d\x15\x7c\x27\x3f\x81\x7d\x7c\x75\x47\x83"
- "\x98\x68\xbd\x87\x0c\x97\x4d\x43\x2b\x90\x67\x96\x92\xc9\xd0\x45"
- "\x78\x27\x69\x6f\xaf\xf6\x16\x0c\x23\xf5\x38\xf5\x99\x74\xf0\x3d"
- "\x43\xc9\x62\x68\x91\xec\xdb\xb0\xde\x40\xb7\x44\xf2\xec\x0c\x89"
- "\xf7\xcd\xe7\xcb\xc2\x69\xc8\x98\x3a\x6d\xfa\x8c\x47\x1e\xfd\xd6"
- "\xcc\xc7\x0a\xd6\xbf\x50\x58\xf4\xe2\x4b\xc5\x25\xdf\xdd\x50\xba"
- "\x71\xd3\xe6\xb2\x97\xb7\x94\x57\xbc\xb2\x75\x9b\x6d\xfb\x0e\xe0"
- "\xe9\xbf\x13\x5b\xbc\x93\x65\xf0\x19\x09\x72\x7d\x92\xf3\xf8\xa3"
- "\xcc\x17\x61\x4a\xbf\x86\xb6\x9a\xac\xb1\xfb\x0e\x6e\x78\xf3\x7c"
- "\xa7\x61\x97\x29\x61\x3c\xdf\xb1\x08\xfd\x36\xb8\xeb\x16\xb4\xf0"
- "\x3d\xce\x1d\xa6\x84\xd4\x36\xef\x82\x16\xbe\x77\xfc\xb4\xa5\x93"
- "\xd2\xee\x23\xc3\x15\x53\x02\x71\x7c\xc3\x03\x44\xad\x48\x1b\x0b"
- "\xe7\x7d\x66\xb2\xbc\x31\x46\x78\x6b\xc6\x88\x2e\xc6\x5f\x73\x44"
- "\x74\x7a\x77\x16\xd3\x41\x7c\xa3\x8e\x99\x2f\x9b\x12\xfe\x78\x7a"
- "\x9c\xbc\x97\x75\x5c\xfd\x11\xd1\xb1\x77\x8c\xe8\xd8\x73\x44\x74"
- "\x35\x8c\x11\x9e\xb4\x1a\x4a\xec\xa9\x4e\xd8\xe7\x31\x0d\xf5\xc8"
- "\xfa\x8a\xf8\x60\xca\x50\xc7\x21\xc4\x4d\x09\x50\x5c\x03\xbe\x11"
- "\xe6\x3b\x6d\x55\x74\xbf\xff\x99\x3f\x1e\xf8\x4a\x45\x6f\xa9\xe1"
- "\x20\xf2\x51\xf2\x48\xb8\xd9\x0a\xaf\x03\xf9\x79\xdd\xfe\x4b\xe4"
- "\x31\x25\xf8\x1b\x6e\xc8\xfc\x92\xdc\xb5\x5d\xc4\xf8\x7e\xba\xc5"
- "\x1f\x5f\x3e\x56\x04\x00\xdb\x1e\xdc\x59\x6a\x00\xcc\x49\xe0\xf6"
- "\x85\x97\x27\xfd\xc5\x8d\x15\xd6\x4d\xaf\x94\x96\x3e\x38\x9c\xd2"
- "\xe5\x9b\xc2\xef\x20\xaf\xe0\xb3\xd5\xdf\x38\x22\x5a\x51\xce\x16"
- "\x94\xf7\x0c\xef\xf0\x85\x6e\x10\xca\xe4\xba\x6c\x1a\xb6\x08\xe1"
- "\xa7\xf0\xfb\x14\x68\x3f\x23\xef\x34\x36\x8d\xdd\x2e\xaa\x87\x99"
- "\x40\xe7\x19\xbe\x8b\x8d\xcf\x62\xef\xde\xb6\xcc\x80\x72\xd7\x00"
- "\xee\x8c\x75\x2c\x4d\x40\xba\x3f\x82\x8e\x63\xf8\xcd\xf0\xf2\x3e"
- "\x60\xc0\xb7\xaa\x72\x8d\x2d\xe1\x6f\xf0\xaa\xe5\xe8\x18\xb1\xbf"
- "\xa7\x7a\x58\x13\xdf\x31\x21\xef\xc9\xc4\x37\xf8\x72\x06\xb0\xae"
- "\x6e\xfb\x32\x03\xfa\xba\x86\x86\x10\x4e\x07\xd3\xc4\x74\x70\xff"
- "\xf9\xf7\xb0\x52\xc1\xde\x7c\x9a\xe4\x27\xc3\xef\x3b\x88\xea\x8e"
- "\x88\x46\x3c\x75\x78\x6a\x7f\x87\xb8\xdf\xe2\x39\x83\xf0\xb3\x78"
- "\xff\x0e\xef\xdf\xe2\x41\xff\xdb\xc2\x74\x97\x57\x8a\xce\x29\xb5"
- "\x74\x3f\xe3\x87\x6e\xad\xb8\x64\xba\xeb\x3c\xd3\xce\x77\xc8\x88"
- "\x94\xe1\x59\x11\xf7\x5e\x98\xee\x68\x26\xc4\xe3\x7d\x56\xbd\xc3"
- "\x9f\xc4\x54\x3c\x33\xb4\xdf\x95\x80\x39\xa6\xfd\x76\xe1\xa9\xfb"
- "\xfc\x27\x1a\xdf\x60\xcf\x88\x84\x2f\x0e\xfb\x45\x9e\xb1\x59\x5f"
- "\x0c\x6e\x64\x0b\x99\x92\x61\x35\x93\xf3\x22\xc3\x93\xd3\x55\xd8"
- "\x68\x9f\xfa\x1e\x43\xda\x7b\x22\x1e\xf0\xe9\x4e\xe0\xbf\xb3\x58"
- "\x85\xdd\x59\x81\xf7\x29\x3c\x67\x22\xf3\x1f\x8b\xf4\x63\x57\xb1"
- "\x3c\x7b\xd1\xc6\xb0\x2c\x3d\xa6\xe1\xa9\x2c\xa3\x43\x4a\xb7\x0c"
- "\xbc\x8f\x0e\x61\x66\xe8\x56\x5d\x48\x7f\x12\xe3\x23\xf5\xe7\x0e"
- "\x6f\x94\xfe\xb8\xd8\x16\x79\x4c\xc3\x56\x35\x28\x7d\x39\xd5\xbd"
- "\xb3\x10\xdf\x77\xf8\x80\xe7\x14\x8f\xeb\x00\x87\xec\x8f\x1c\xba"
- "\x42\x34\x02\x54\xb2\x7d\xe9\x32\x25\x66\xb3\xce\x72\xde\x5a\xbe"
- "\x8a\x16\xd0\x87\xb0\x46\xa6\x6f\x33\xf0\xe2\xfb\x18\xe0\x1a\xdd"
- "\xf4\x99\x4e\x9b\x4c\xf3\xfd\xef\x42\x1f\x35\x7a\x19\x27\xa7\x13"
- "\xa1\x72\x99\x39\x8d\x96\xf7\x4d\x84\x67\xc0\x46\xf1\x1e\xb9\x38"
- "\x77\xc0\x43\xac\x93\xfc\x76\x07\x32\x50\x97\x72\x28\xc8\xe7\xc2"
- "\x5b\x28\x03\xf5\x6d\xd8\x25\x53\xe2\xc5\xc9\x95\x94\xc1\xf8\xd8"
- "\x7e\x7b\x4c\x89\x8d\x0d\x5c\x17\x15\xae\x4f\xb9\x1c\x8c\xff\x77"
- "\xe8\x01\xf1\xbb\x9e\xe9\x41\x7c\x58\xbe\x35\x6e\x94\xf6\xd0\x0e"
- "\x55\x56\xe4\x75\x0c\xe9\x9b\xb8\xec\xcc\x4f\xc4\x37\x5f\x36\x8d"
- "\x98\xc9\x71\x7c\x8f\xa4\x56\x9e\x63\xbc\x37\x91\xf9\xc1\xf0\x6e"
- "\xf4\x38\xe4\x9d\x17\xa6\x61\xab\x25\xdf\x90\x9e\xe5\x21\x90\x07"
- "\xe3\xb0\x07\x44\x40\xc0\x1e\xbd\xb7\xc3\x0f\x9f\x66\xe4\xcf\x22"
- "\xe5\x33\xc2\x15\x2e\x1f\xa4\x6b\x42\xfa\x56\x6e\xfb\xd9\x9e\x20"
- "\xcf\x24\xbe\x07\x1a\x61\xae\x60\x35\x70\x6c\xf5\xcb\xb1\x28\xe0"
- "\x79\x17\xb4\xb8\x18\x0f\xe8\x69\xd5\x70\x5d\xe4\xf3\xf1\xc3\x65"
- "\xad\xe1\x3b\xc6\x32\x97\xf5\x79\x87\x2c\x13\x6c\xd7\xc8\x97\xeb"
- "\x55\x5c\x33\x60\x9a\x45\x6f\x0e\x89\x9d\xf9\xea\xbe\x69\x15\x77"
- "\xd2\x7e\x53\xca\xb7\x55\xd9\xb5\x91\x87\xcb\x77\x89\xce\x10\xdd"
- "\x23\x73\xf4\xfb\xa3\x34\xba\x4f\x72\x7e\x62\xdb\x2a\xd9\x86\x72"
- "\x1e\x9c\x5e\xc3\x97\xc6\xf8\x74\x5e\x4d\x06\x1d\x8a\x5f\x23\xf2"
- "\x11\x7e\x8c\x75\x51\xf2\x0d\x76\xb4\xdb\xce\xba\x38\x32\x17\xe9"
- "\x4f\x1d\xe4\xef\x6d\xfc\x3d\xc2\x23\x6d\x6c\x7f\xfc\x88\x1a\x8e"
- "\x77\x77\x42\x6e\x1b\xa0\x4b\x41\xa2\xfb\x53\x29\xc3\xe7\x94\x65"
- "\x3b\xe1\xdb\x99\x65\x38\x1d\x20\x62\x3a\xc1\xa3\x66\xd0\xea\x83"
- "\xed\x9f\xc1\xb4\xc2\x5e\x9f\x14\xef\xe5\x13\xd3\x0c\x7b\xa6\xd1"
- "\x97\x54\xa4\xc9\xfe\x24\x97\x91\xf9\x39\x59\xd9\x3e\xc4\x25\x0f"
- "\x63\xda\x43\xe5\x4e\xca\x0c\xe7\xb1\x2c\x37\xe4\xc0\xf2\x62\xb9"
- "\x84\xe1\x64\x5d\x71\x01\xd7\x09\xf5\xad\x74\x83\x79\xed\x1a\x23"
- "\xce\x32\x7c\x08\xd6\xbc\x9d\xe3\xaa\x90\xf7\x94\x32\x79\xc7\xb5"
- "\x81\xef\x00\x03\xde\x13\x2d\x3b\x02\x04\x1c\xcd\xcc\x53\xc0\x9d"
- "\x63\x7d\xc4\xf7\x59\x2d\x8f\xb3\x68\xcf\x27\xe2\x99\x1d\xaa\xff"
- "\xe6\x5f\x46\xea\x57\x52\x74\xfd\x67\x79\xbb\x82\xf6\x1c\x92\xfa"
- "\xb0\x85\xac\xd7\x4c\xe6\xe7\xb4\xb6\x43\x93\xb5\xf9\x27\xa7\x51"
- "\x5f\x42\x38\xcc\x33\xa2\x64\xdd\x2c\xf5\x71\x5b\xae\x81\xcb\x8c"
- "\xb4\xcd\x1a\x1e\x59\x66\xa9\x4f\x4e\xa9\x03\x67\xc5\x36\x94\xb3"
- "\x5f\x0f\x92\x5c\x9a\x9c\xcf\x46\xf1\x44\xa3\xfd\x8e\x8b\x7c\x1f"
- "\x31\xdb\x24\xf8\xd5\x8f\xf7\xf4\x86\xec\x12\xcb\x3e\x28\x65\x6f"
- "\x9e\xd9\xa0\xda\x5b\xcd\x6e\x25\xa9\xf8\x31\x11\x3a\xcc\xb4\x6c"
- "\x94\xfa\xcb\xb4\xd8\x57\x31\x2d\xcd\x92\x0e\xbb\x95\x10\xd7\xc1"
- "\xf9\x03\x57\x99\x56\x5f\x75\x5c\x59\x8c\x6b\x0f\x6c\x15\xd3\x84"
- "\xbc\xcf\x4b\xfb\x37\x5f\xea\x41\xb6\x46\xfb\x19\xbf\x93\xd3\x26"
- "\xce\xbc\x69\x94\x69\xcf\x00\xee\x84\x5f\xdd\xe7\x36\x1c\xe9\x8f"
- "\xcb\x35\x96\xa6\xd1\xc7\xd8\x46\xf3\xde\x61\xfc\x3e\x60\x7d\x16"
- "\xba\x7a\x05\x2d\x55\x31\x25\xb0\x8e\xea\x7a\xd1\x65\x1a\xbd\x8b"
- "\xfb\x2a\xe0\xf5\x09\xf8\x48\xc7\x99\xdf\xac\xcb\xf0\x91\x66\xf4"
- "\x54\x27\x9f\xd0\xf5\x16\xf9\xd4\x31\xef\x95\x7c\x92\x3f\x85\x1e"
- "\x37\x87\x74\x2b\xf9\x53\x8d\x8f\x7c\x47\x7c\x02\xf2\x7b\x59\x2b"
- "\x17\xdf\xd1\x01\x5f\x6c\x74\x81\x46\x7b\xad\x82\x4f\x19\xa1\xcb"
- "\x41\xab\xab\x67\x0f\xb2\xfd\x95\x32\x48\x39\xa6\xa5\x3d\xa6\xf2"
- "\x4a\xf9\xb1\x0e\xcb\x3e\xa2\xbc\x9b\x19\x61\x6c\x07\xa7\x40\xf6"
- "\xd2\xf6\xed\xb8\x25\xe1\x34\xdb\xd8\xaa\xf2\x18\xbd\x48\xea\x21"
- "\xfc\x9e\x90\x1e\xa5\x54\x46\xd9\x27\xb6\xc5\xae\xb6\xbd\xea\xee"
- "\x3b\xd6\x25\xb6\xa9\xdc\x27\x02\xbe\x65\x5a\xfd\xd1\x69\xfe\x38"
- "\x52\x57\x46\x3f\x06\x5d\x99\x14\x86\xbb\x3d\x56\x3b\xd7\xa0\x6c"
- "\x60\x9d\x4a\x33\xea\x41\xad\x6c\x27\x54\xd9\xb4\x6f\xe6\x5b\x15"
- "\xf3\x2d\xf5\x6a\x18\x1f\xc1\xb7\xd4\xe7\x34\xf8\x66\xb6\xe5\xa1"
- "\xfa\x3a\xea\x4d\xbd\x2e\x0f\xb4\x17\xa9\x0b\xb9\x3e\x84\xe8\x1a"
- "\x55\x16\x65\x2f\x9a\x63\xdb\x8b\x51\x99\x5a\x79\x1b\xa3\xea\xc6"
- "\x31\x45\xbb\xd6\xb6\x40\x0e\x6d\x3e\xed\x0e\x42\x84\xb1\xfd\xe4"
- "\xbc\xc3\xdb\xa0\x7a\xc5\x57\xad\x2e\xa7\x3e\x32\x50\x0e\xa9\xa6"
- "\xf0\xfa\xcc\xb2\x66\x9b\xc0\x38\x58\xa6\xd2\xaf\x44\x98\x92\xeb"
- "\xa8\x8b\x6c\x1b\xc2\x6d\x34\x60\x6b\x82\x82\xeb\x4b\x6a\x42\x64"
- "\x5d\x1c\x55\xa1\xd5\x45\x3d\xef\x7f\x81\x8c\x32\xc2\xf2\xad\x8c"
- "\xca\x97\x65\xd3\x2a\xef\x8a\x91\x65\x4c\xfd\x27\xbd\x4d\x63\x78"
- "\xa4\xb5\x21\x4d\x53\x54\xfb\xe8\x62\xfa\x90\x57\xba\xb4\x59\x47"
- "\xa4\xad\xb0\xf5\x28\x7a\x4e\x36\x68\xed\x04\xc2\x32\xb4\x30\x87"
- "\xd6\x96\xe8\x7a\x33\x21\x92\xa6\xd1\xe6\xd8\xfe\xd1\xa8\x74\xdd"
- "\x3f\x92\xb8\xa4\x2d\x1a\x9d\xaa\x95\x8f\xc3\x26\xa9\xb0\x94\x8b"
- "\x1c\x76\x50\xf1\xa1\x46\xc8\xf6\x2a\xc5\xa1\xb5\x57\x5c\xbf\x8c"
- "\x1e\x53\xb2\x97\xeb\x18\x7f\x03\x47\x31\xe3\x77\x3b\x6e\x71\x1f"
- "\xa2\x16\x71\xfb\xd9\x1e\xb0\xbd\xe0\xb5\xc1\xf2\xbd\x58\xbe\x7f"
- "\xc1\x76\x87\xfd\x10\x8e\x07\x5c\x25\xdb\x22\x84\xff\x96\xcf\x05"
- "\x14\xff\x9a\x00\xbc\xa3\x4f\x68\x69\x3f\x94\xbe\xc2\xbf\xe6\xc4"
- "\xe9\x61\x7a\x3a\xd8\x86\x03\x9c\x8e\xd3\xeb\xf6\x8b\x6d\x57\x80"
- "\x6d\x93\xcc\x6f\xcc\x78\x4d\xc7\x65\xbf\x41\xf7\x8b\x7a\x8d\x61"
- "\xb0\x7c\x97\x9a\xb4\x69\x63\x4a\x95\x3d\x1b\xb3\x9a\xd3\x4a\xf9"
- "\xc1\x56\x56\xdd\x14\x1f\x35\x6c\x21\x53\xfd\x67\x6c\x17\x87\xad"
- "\x52\x74\x8e\x69\x56\xe5\x18\xb3\x5b\x96\x43\xd9\x54\x97\xa2\x65"
- "\xd8\xaa\xfa\x5b\x32\xee\x28\x97\x85\xe3\x0e\x85\xc5\xf1\xdd\x88"
- "\x88\x53\xe3\x25\x51\xe9\x82\xbd\xc5\x03\xe0\x1b\x6e\xc9\x7e\x5f"
- "\x42\xfd\x11\xdd\xf6\xde\x39\x53\xa3\xf3\xba\x6e\x77\xc1\x97\xbd"
- "\x6c\x7b\x65\xdc\x8b\x1a\xcc\x62\xed\x2d\xed\xfb\x9d\x13\x14\x5f"
- "\x2d\x46\x8d\xdf\xfb\x55\x39\xee\x7c\x4c\xf6\xb3\xff\x35\x1f\xbc"
- "\xbd\x73\x9c\xce\xdb\xf0\xdf\x5c\x7f\x90\x3f\xfb\x92\xca\xae\x54"
- "\xca\x3e\x6c\x1d\xc3\x30\x4d\xaa\x8d\x18\x93\x1a\xed\x53\x5f\x36"
- "\xdd\xf5\x33\x6e\x97\x94\xaf\x7a\xd7\x61\x6d\xec\x89\x5a\xb6\xfc"
- "\x08\xed\xc2\x9d\x17\x75\x1b\x23\x7a\x72\x88\xef\x58\x02\x2d\x1f"
- "\x72\x18\xdf\x8f\x15\x0e\xc3\xf6\xe9\xfd\x5b\x1e\x0d\xe7\x9d\xcd"
- "\xba\xdd\x60\x5b\xd2\xe6\xbb\xa4\xf9\x74\x96\xe2\x7a\xcd\x96\x5c"
- "\x33\x59\x4a\x22\xfd\x30\x4b\x49\xa4\xcd\xb8\x6b\x57\xb4\xcd\x80"
- "\xdf\xbc\xb7\xa7\xda\x32\x3b\xc2\x0f\x40\xd8\xed\x6d\x87\xc5\xcc"
- "\x75\x94\xef\x66\x95\xf6\x49\x8e\xa7\x59\xfe\x59\xa7\x99\xed\x66"
- "\xf7\x4e\x7d\xfc\xe2\xae\x8d\xec\xab\x45\xe5\x77\x22\xc2\x76\x72"
- "\x7e\x3a\x3e\x13\xf1\xfd\x9e\xe0\x03\x8f\xb7\x58\x2a\x35\x3b\xdf"
- "\x18\x61\x2b\xb5\x36\x8c\xed\x64\x64\x5b\x35\x6c\x75\x64\x5b\x75"
- "\xd7\x73\x03\x6d\xe4\x5d\xe9\x5f\xbc\xad\xba\x8b\xd8\x6e\xe9\x36"
- "\x32\xd2\x16\xdc\x35\xb1\x3e\xc2\x97\xb5\x9c\xd4\x7d\xd9\x90\x1d"
- "\xb5\x64\xb1\x8d\x42\xfe\xcd\x5a\xde\xf0\x89\x87\x1e\xd7\xf3\x86"
- "\x1e\x5d\x6c\xb3\x42\x37\xab\x87\x99\xf1\x7b\x9f\xe6\x03\xca\xba"
- "\x79\x8b\xef\xe2\x33\x8d\x39\x0f\xfd\x1b\xce\x7a\xd6\xb2\xe9\x33"
- "\xea\x08\xb5\x15\xad\xdd\x9b\x75\xfe\x8e\x7d\x24\xdc\x2f\x3c\x7a"
- "\x44\xec\xeb\xa9\x1e\x9b\x18\x5e\xc6\x03\x08\x3b\xa4\x8d\x21\x48"
- "\xde\x4a\x5c\x77\x79\x1a\x8e\x44\x96\x4d\x95\x63\x6c\x2a\x97\x83"
- "\xfb\x44\xc8\xff\x02\xfb\x3d\x7c\x3f\x33\xea\x4d\x7e\x43\xbf\xce"
- "\xdf\x71\xe2\xa6\x33\xdc\xbf\x1a\x76\x92\x6d\xa5\xd6\xf7\x3c\x03"
- "\x7f\xc7\x15\x3e\x16\xb3\x68\x5e\x9e\xb5\x6c\x4b\xc9\xa6\x8a\x17"
- "\xa7\x59\x4b\x36\x95\x54\x94\x14\x94\x96\xec\x28\xa8\x28\xd9\xbc"
- "\x69\xe2\xc6\x82\x97\x4a\x5e\xb0\x6e\x2b\x28\xb7\x66\xd8\x26\xd8"
- "\x86\x53\x08\x74\x96\xb5\xa0\xbc\xfc\x95\x8d\x45\x85\xd6\x4d\x25"
- "\x2f\x4c\xda\x52\x54\x5e\x54\x61\x2d\xd8\xb2\xf9\x95\x4d\x85\xd6"
- "\x09\x85\x93\x27\x64\x3c\x5a\x38\x3c\x7c\x0c\xed\x3e\x33\x75\x05"
- "\x6f\x7c\xdc\x79\xe8\x06\x25\x24\x19\xca\xb6\x24\xd9\x4a\x36\xa9"
- "\x31\xbb\x6f\xec\x9a\x52\x43\x65\x88\x4f\x6c\xa8\x66\x5e\x8f\x75"
- "\xe1\x6d\x62\x38\x94\xd3\x8a\xdf\x09\xa0\x7d\x5c\x4f\xf5\x37\x32"
- "\x3d\xa6\x7b\xd3\x99\x67\xe0\x85\x15\x65\x1b\x27\x6e\xfc\xb6\x13"
- "\x3e\x5b\x19\xaf\x09\x68\xb8\x41\xa9\xae\xad\x64\xc2\x93\x88\xc7"
- "\x6c\x34\xf3\x58\xd7\x37\x2a\x3c\xa6\x71\x2e\x79\xe7\x98\x69\x5c"
- "\xaa\x37\x79\x56\x82\x70\xcd\x4a\x50\x72\x19\x97\xac\x8f\x71\x2f"
- "\x79\x95\x96\xb0\x7e\x5e\x32\x8d\x93\xe3\xb3\x7b\xa0\xcb\x3c\xee"
- "\xdb\xfd\xab\x27\x33\xe1\x0f\x5e\xe4\xb1\x5b\xc4\x25\xfb\x8c\x94"
- "\x08\xba\x4c\xa7\x2b\x33\xe8\x0d\xe4\x55\x6e\x11\x02\x79\xb4\xeb"
- "\xe3\x69\x28\x83\x19\x65\x69\xd7\xca\xf1\x5f\x64\x39\x8e\x88\xb4"
- "\x9a\x14\xd0\x57\xcd\xf4\x8c\x33\xe9\x65\x00\xdd\x48\xf7\x8d\x62"
- "\xd0\x69\x66\xba\x62\x8d\xf5\xf1\x78\x17\xe8\x5c\x14\xdc\x0a\xbe"
- "\xdd\xa3\xee\x77\x3d\x54\xaf\xea\x1f\xca\xb3\xb7\x01\xbf\x0f\x7e"
- "\x46\x89\x07\xb6\x50\xaa\x70\xde\x2b\xce\xf9\x02\xe4\x2e\x6e\xa7"
- "\xa4\xed\xc2\x2b\xfe\xd3\xc7\x9d\x5a\x99\x6c\x6c\x1b\x7e\xfe\xdd"
- "\x76\x13\x97\x09\x6d\x45\x62\xc3\x67\x83\x8e\x2d\x9a\xde\x18\x23"
- "\x7c\xe2\x9d\x70\x9f\x6b\xdc\x47\xcc\x13\xf6\xb7\xba\xd1\x4e\xa1"
- "\x0c\xd0\xaf\x71\x56\xcd\x37\xf6\x89\xde\x55\x61\xbe\xd4\x38\xd6"
- "\x33\xdf\x20\xb8\x13\x74\xdc\xc2\x28\xef\x45\xb6\x28\xf9\xdf\xbd"
- "\x08\x69\xbc\x21\xfc\x77\xa7\x47\xe3\x67\x9c\xf8\xed\xd5\xf3\x51"
- "\xfd\xf0\xbb\xd9\x27\xf0\x42\x97\x63\x8e\x5b\x23\xbf\xb4\xea\x23"
- "\xe2\x82\x1b\xe1\x87\x6e\x92\x09\xb0\x17\x1a\x8e\x48\xfc\xfb\x50"
- "\x87\xba\x18\xff\x9e\x31\x44\x7b\x01\xd3\x5d\x3d\xce\xca\xe3\xbb"
- "\x88\xe3\x3e\xb1\x25\x7a\xcc\x5a\xd3\xe7\x59\x51\xfa\x9c\x59\xcd"
- "\x3e\x61\x0d\xf0\x43\x87\x0e\x5d\x47\x3b\x8c\xef\xc9\x35\x94\xce"
- "\xf9\xe0\xf7\x79\x1e\x0f\x01\x4e\xbf\x9e\x9f\x80\xfe\x1f\x0c\xaa"
- "\x31\x18\x4d\xb7\x26\xba\x6d\x9d\x3c\x2f\x22\x4e\xc3\xbe\x33\x8d"
- "\xac\x63\x3d\xd5\xf7\x4c\xd4\x75\x0a\xba\x7e\x41\xea\x55\x2a\xa5"
- "\x8b\xea\xbb\x9b\x1a\x52\x00\x07\xbd\xaa\x87\x3e\xb1\x5e\x01\x36"
- "\x5f\xd7\x29\xe8\xda\x79\x86\x03\x0d\xc3\x9b\x76\x64\x9a\xd8\x46"
- "\x76\x98\xee\x39\xc7\x3a\x26\xde\x7a\xaa\x5d\xdc\xb9\xb2\x5d\xc9"
- "\xe9\x9e\x73\x6e\xbf\x92\x41\x88\xef\xf7\x34\x86\xf1\xfd\x3c\xf4"
- "\x78\x38\xf3\x59\x8d\x55\xdf\x73\x0e\xb4\x9d\x97\xbe\xf8\x2e\xc8"
- "\x40\xb6\x55\xf7\xc8\x7e\xbc\xc6\xc3\xb3\x21\x1e\xde\xd3\x19\x8b"
- "\x87\x51\xbc\x33\xf1\x23\xaa\xef\xf1\x71\x5d\xe9\xa9\xbe\x77\x9c"
- "\xc7\x74\xf7\xa9\xc1\xe6\x0a\x90\x87\xc9\x54\x43\x09\x9c\x47\x6b"
- "\xaa\x84\xcf\xd5\xf3\x38\x04\x5e\x7b\xed\xc5\xb7\xd5\xe7\xd6\x46"
- "\x22\x1e\x13\xe7\xf4\x69\xa9\xcc\xdf\x7b\xf7\x87\xd2\x0b\x5f\x74"
- "\xfa\x09\x2f\x44\xd0\x2a\x1f\x51\x7d\x6f\xe3\x1b\x29\xd0\x23\x45"
- "\xef\xd9\xdb\xd1\x9b\x66\x55\xed\x64\xcb\x7d\xac\xdf\xd6\x78\x77"
- "\x2d\x11\x87\xa9\xef\x7b\x7d\xdd\x68\x7b\xa2\xc7\xf7\x07\x9f\x6f"
- "\xb0\x66\x47\xce\x37\x58\x67\x0c\x36\xdf\x10\x95\xef\x6e\xce\x37"
- "\xd8\xb0\xcc\x10\xca\xdb\x5a\x1a\x8c\x91\xb7\x9e\x7e\x72\x63\x78"
- "\x7f\xc6\xfa\xcf\x4c\x43\x1b\xda\x29\xf1\x8d\x65\x06\x01\x3c\xad"
- "\xb2\x0d\xb7\x9e\x57\xfe\x0b\xfb\x45\xd6\x26\x86\x89\x2e\x47\xff"
- "\x5f\x42\xea\xaf\xf9\x75\x53\x7e\xc4\xcf\x27\xb6\xae\x74\x6f\xba"
- "\x1e\x6d\x8c\x00\x26\x11\xe3\x23\x91\xc8\x2a\xe1\x05\xfe\x54\x90"
- "\xf6\xed\x95\x1f\xa6\x7e\xf8\xfe\xf8\x7f\xc3\xdf\x30\x45\xaf\xc4"
- "\xe7\x27\x83\x96\x5f\x4e\x18\x44\xd6\x6d\x52\x0b\xd2\x93\xc4\xfa"
- "\xe3\x91\x01\xc7\xb2\x78\xe0\x2b\x96\xc0\x42\x04\x34\xfc\xfa\xb7"
- "\x08\xff\xe6\x90\xc8\x6f\xfc\xc5\xad\x0a\xcb\xe0\xde\xb8\x42\xb9"
- "\xbc\xeb\xfe\xc6\xfe\x20\x63\xa3\x39\x3c\x4b\x33\x39\xe2\xe5\x8f"
- "\x24\xfe\xc7\x0f\x7c\xe9\x88\xb7\xee\xeb\x07\x18\xe5\xdb\x1d\x06"
- "\xfe\x7b\x45\xfe\xf8\xf6\xdb\x94\xf1\xcb\xfe\xdd\x13\xf6\xfb\x5e"
- "\xf5\x1a\x5f\xfb\x15\xe2\xbf\xfd\x9f\xf5\xfc\x30\xfd\x67\x48\x3d"
- "\xee\xb3\xc6\x02\x0d\xf1\xff\x3e\x87\x1e\x14\xae\xa1\xa1\xf8\x09"
- "\x81\xc8\xef\x6f\x36\x47\x7e\x3f\x94\xf0\x15\x50\x4e\x2d\xfc\x8f"
- "\xdd\x03\x1f\x25\xfd\x42\x7f\x60\x52\x54\x95\x49\x72\x45\x55\xa1"
- "\xd0\x9f\x46\x4d\x1c\xe8\x59\x15\x16\x6c\x8a\x0d\xfd\xbf\xe7\x6f"
- "\xec\x6e\xad\x42\xdc\xeb\x35\x0f\x88\x9c\x1b\x15\xc6\xdf\x43\xac"
- "\x5a\xd8\xd4\x5f\x0f\x80\x97\x61\xd6\xb0\x6f\x43\x26\xfe\x69\x84"
- "\x65\x9d\xf8\x55\xd0\xfa\xf5\xdf\xff\x0f\xff\x0c\x5c\x3f\xbe\xfe"
- "\xfb\xdf\xf4\x27\x54\x2b\x0e\x4b\x24\x5f\xfc\x9f\xe8\x37\x94\x42"
- "\x8b\x10\x5a\x80\xd0\x7e\x7c\x25\xed\xf8\xd7\x7f\x5f\xff\x7d\xfd"
- "\xf7\xf5\xdf\xd7\x7f\x5f\xff\x7d\xfd\xf7\xff\x81\x3f\x83\xec\x47"
- "\x08\xed\x4f\xff\xad\xe2\xb8\x0b\xf4\x52\x9e\x0c\x33\x1a\x28\x04"
- "\x81\xee\xf6\x23\x64\x48\xa0\x21\xa6\xaf\xce\xcb\xb3\xf6\x13\xf4"
- "\x05\x13\x64\xe0\x99\x8a\x67\x3a\x9e\x6f\x84\x85\xdf\xf7\x55\x51"
- "\xf4\x6f\xfe\x33\x80\x81\x71\xe8\x17\xc6\xd3\x10\x1a\x4a\x09\x34"
- "\x8c\x86\xd3\x1d\x94\x48\x23\x68\x24\xfa\x9b\x66\x4a\xa6\x14\x1a"
- "\x45\xa9\x34\x9a\xc6\xd0\x9d\x64\xa1\xbb\x68\x2c\x4a\x32\x8e\xee"
- "\x46\xdf\xfe\x5e\x30\x64\x7c\xec\xb2\x38\x28\xd3\x82\x7f\xf0\x7f"
- "\x1e\x65\xca\xef\x75\x5f\x87\xff\x1f\x0d\x6f\xd1\xc2\xcf\x6b\xe1"
- "\x9e\xaf\xc3\xff\x8f\x86\x5b\xff\x9d\xdf\xe3\xff\x5d\xdf\x06\x98"
- "\x6c\x65\xb5\x0d\x31\x6d\x65\x74\xa8\x41\xfb\xeb\xff\xa6\xcf\x49"
- "\x3f\x00\x5f\x64\xfa\xe8\xbf\x4c\x3c\x33\xd4\x4f\x3b\x91\x1a\xe7"
- "\x15\xe1\x7f\x81\xc1\x52\xea\x7f\x55\xa7\xf0\x9c\xc1\x73\x01\xcf"
- "\x7f\xc7\xf3\x3f\xf1\x5c\xd5\xf1\x28\x18\x1e\xfa\xfb\x57\x3c\xff"
- "\xe3\x38\xd1\x45\x0f\x9e\x2c\xa2\x0f\x2b\x89\xfe\x6c\x26\xfa\x08"
- "\x6d\xd4\x5f\x9a\x88\x2e\x79\x43\x38\x3f\xd9\x1b\xa2\xee\xaa\x5a"
- "\xd9\x2d\xe5\xf7\x19\xdf\x73\x0e\x4d\xea\xd3\x61\x9b\xb3\x97\xe5"
- "\x58\xa7\x4e\x9e\x31\xf9\x91\x0c\xeb\xa4\xbc\x49\xd6\x69\x19\x53"
- "\x33\xa6\x64\xcc\x98\x32\xf5\x51\xeb\xd4\xe9\xb3\xa6\x67\xcc\xca"
- "\xf8\x96\x75\xe3\xf6\x2d\x25\x53\x33\x5e\x2a\xb2\x6e\x2a\x2c\x29"
- "\xb7\xbe\x58\xb2\x65\xe3\xb6\x82\x2d\x45\x9f\x57\xac\x2f\xfb\xc7"
- "\xe4\xdd\x1d\x24\x29\x81\x48\x6e\xdf\x4b\xa6\x07\xad\x64\x9a\x65"
- "\xa6\xfe\x18\x83\x4b\x1b\x43\x4d\xd7\x9e\x98\x7f\x1b\x9f\x7f\xf6"
- "\x4f\x13\x56\x8e\xfc\xcd\x13\x2f\x4d\x98\x33\xef\xbd\x43\x4d\x64"
- "\xcc\x68\x24\x63\x7a\x16\x19\xef\x31\x91\x31\x65\x22\x19\x4d\xa7"
- "\xc8\x58\x6a\x26\xe3\x0b\xb5\x64\x7c\x6e\x36\x19\x17\xe5\x90\x71"
- "\x6e\x8c\xb0\x9d\x59\x2a\xec\xa7\x9d\x64\x3c\x56\x4c\xc6\xda\x65"
- "\x64\xfc\xfe\x5e\x15\xf6\x4f\xa5\x64\xfc\xc7\x0b\x83\xd1\xf0\xef"
- "\xf4\xf7\x45\xfd\x88\x01\x7f\x1e\xa9\x6b\xbc\x0f\x60\x4d\x65\x8c"
- "\xc1\xd2\xaf\xff\xbe\xfe\xfb\xfa\xef\xeb\xbf\xaf\xff\xbe\xfe\xfb"
- "\xfa\xef\xff\xe5\x7f\x5e\x03\xcd\xf8\xcc\x68\xa2\xdf\xc0\x5b\xea"
- "\x71\x26\x8c\xf3\x18\xc6\x9d\xe5\xb5\x25\xc4\x7b\xa8\x28\x41\x9e"
- "\xf7\xc2\x4f\xd8\x9a\x94\xc4\x79\x47\x89\x78\x0f\xe8\x1b\x47\x84"
- "\x97\xf7\x77\x66\xfd\x98\xa8\x35\x8d\x88\xd7\xbb\x00\xc7\x2a\x0f"
- "\xbd\x9c\xa8\xd6\x38\x09\x1f\xc7\xf3\x3a\x29\x84\x57\x20\x7c\xef"
- "\x60\xeb\x56\xf4\x35\x5a\x8c\x33\x6b\xbc\xa4\xe5\x58\x14\x1e\xc6"
- "\xd1\x8c\xb0\xc0\x6d\x70\x24\xea\x74\xf9\x8c\x64\x60\x7c\xdd\x4e"
- "\xb2\xf8\x9c\x2d\xa3\x91\xd6\x87\xf2\xa4\x6b\x6b\x8c\xba\x84\x93"
- "\xe2\x5a\x6d\x01\xde\x6b\x6a\xb8\x4c\xc3\xdf\xc5\xdb\x88\xb7\x5c"
- "\xe3\xbf\x47\xa5\x4b\x63\x1c\x48\x6b\xe8\x71\x0e\xcb\xe8\x4f\x0b"
- "\xdc\x72\x9f\x3a\x0d\x2f\xf1\x19\x5b\x8c\x0a\xd6\x3c\x4c\x83\x35"
- "\x02\x76\x95\x0e\xab\xe2\x8c\x0b\xb5\xb8\x3b\x10\x67\x8b\x8c\x33"
- "\x55\x6b\x71\x89\x88\xab\x89\xa2\xcf\xe4\xbe\x15\xa0\xcb\x34\xec"
- "\x04\x68\xb1\xf2\xde\x26\x4e\xa3\xc1\x27\x03\xbe\x35\x12\x17\x91"
- "\x16\x97\x82\x38\x4f\x64\xdc\xaf\x32\xb4\xb8\x3b\x11\x17\x88\x8c"
- "\x33\xe8\xe9\x2c\x3d\xce\xe1\x96\x18\xe5\xe4\xfc\x0d\x2a\x6f\x2e"
- "\xc3\xf0\xd9\x80\x71\x30\xcc\x32\xab\x83\x58\x56\x1c\x77\xba\xb1"
- "\x3f\x7f\x86\x59\xa7\xe3\xf1\x20\x7d\x18\x4f\xc1\xcb\xe1\x95\x7a"
- "\xfa\x2c\x2b\xe3\x20\xc9\x43\xc6\xe3\xa1\x61\x39\x8c\x87\xbf\xf1"
- "\x7b\x1c\x97\x5b\xfb\x6d\xe5\xf2\x45\xae\xf5\x31\x01\x6d\x3c\x1c"
- "\xd1\x21\x78\x86\x26\xe8\x3a\x50\x6e\x11\x41\xfb\x5d\xbc\xbe\x2b"
- "\xcb\x16\x74\x0a\x72\xdb\xfc\x64\x1d\x4b\xf6\x4b\x74\x87\x85\xd7"
- "\x0b\x1d\xdc\x41\x09\xf6\x32\xe1\xe7\xb3\x00\xda\xbc\x5d\x64\xf7"
- "\x8a\x4e\xde\x6f\x5f\x75\x9d\x12\xf8\xdc\xa8\xaa\x97\xc9\xd2\x5a"
- "\xf9\xd7\x98\x6b\x94\x82\x7c\x7e\xf5\x38\x4e\xdb\x41\x6d\x75\x1d"
- "\x64\xaf\x8b\x4c\x6b\xbf\x9b\x2c\xe7\x78\xef\xbe\x93\x92\x98\x8e"
- "\x56\x6b\x80\x02\x29\x59\xb6\xca\xb7\xc9\x64\x1f\x4f\xc6\x73\x85"
- "\x2d\x3a\x2d\x1e\xa6\x65\xef\x15\x4a\x78\xef\x45\xe8\xd0\x15\xa6"
- "\x37\xd7\xf6\xfe\x0e\xbf\xf1\xb4\x25\x97\x4e\x5b\x2e\x52\xab\x65"
- "\x0e\xb5\xda\xb2\xe8\xe0\x15\x4a\x3c\xed\x9f\x4d\xad\xa6\xf9\xa8"
- "\x63\x59\xe4\xee\xc2\x6f\x6b\x1f\x60\x7c\x72\x3f\xc8\x65\xba\xe3"
- "\x7c\xcd\x77\x29\xc1\xa3\x70\x82\xbf\x77\x5c\xd4\xf7\x36\xf0\x77"
- "\xac\x72\x94\xdf\x45\x16\xd0\xd7\x09\x5a\x1e\xbb\x44\x89\xa3\xd3"
- "\x2c\x94\x01\x9a\x87\xba\x6b\x03\x64\xaa\xa4\x61\x83\xd4\xad\x54"
- "\xb9\x2f\x1a\xba\x59\x7f\x44\x74\xb2\x8e\x76\xef\xcc\x47\x3d\x4d"
- "\xcc\x45\xde\x5d\xda\x7a\xc1\x2e\xfb\xbb\x64\xea\xde\x96\xcf\xeb"
- "\xa4\x3b\x10\x57\xac\xc7\xf1\x7e\x6f\xde\xc7\x3d\x25\x95\xcc\xee"
- "\x40\x26\x7d\x70\xab\x93\xd7\x22\x76\xf1\xfa\x50\xc6\x97\x64\xa3"
- "\x38\x94\x27\x1e\xf4\x3c\xd6\x80\xf0\xfb\x01\x87\xf4\xc7\x3d\x74"
- "\x32\x43\xae\x5f\xbc\x73\xa5\x2f\x78\xe7\xca\xeb\xc1\xb7\x56\x76"
- "\x8b\xb7\x56\x7e\xd6\xf7\xd6\xca\x4f\xed\xdb\x29\xa1\xef\xce\x95"
- "\xde\xb6\x32\x29\x03\x73\x5b\xd9\x55\x5e\x57\x98\xb0\xeb\x2a\x99"
- "\xd7\xbc\x0c\xd9\x07\x3e\xa4\x5d\x25\x64\x09\x26\x3f\x95\xe1\x0e"
- "\xfc\x91\xd6\x54\x92\xc0\xef\xcc\x58\xe5\xeb\x4e\xc9\x6d\x56\x75"
- "\x28\x01\x65\x1a\x61\xf5\x98\xe6\x95\x71\xbe\xde\xe4\x65\xcd\x78"
- "\x4e\xe1\x69\xc1\xd3\x2a\x52\x72\x5b\xc1\x2b\xfb\xc8\xdd\x06\xe2"
- "\xfd\x0c\x53\x82\x64\xb8\x42\x23\x66\x83\x7e\xf3\x20\x7c\x1b\x17"
- "\xac\x7e\xa3\xe9\x9b\x0e\xaa\xe2\x73\x10\xd8\x36\xb1\x5d\x62\x3b"
- "\x85\x7c\xf6\x21\x9f\x26\x59\x17\x8f\x08\x9f\x48\x79\xa3\x09\xe1"
- "\x9d\xbe\x9d\xc5\x06\xef\xce\x62\x63\x77\xca\x1b\x3f\x07\xcc\x09"
- "\xc0\x74\x6a\x3c\xec\x64\x5c\xa8\x13\xde\x11\x01\x8a\x03\xce\xb2"
- "\x7f\xb8\xd1\x6e\x3a\x7a\x44\x5c\x04\xdc\x85\x7e\x5c\xc0\x0d\x3c"
- "\xe0\xff\x88\x4e\x3d\x0c\xbc\xee\x38\x00\x38\x4e\xef\xf6\x67\xb2"
- "\xfd\xf6\xb8\x4b\x3b\x79\x3d\xef\x70\xd1\xab\xf2\x03\x0c\xef\xf5"
- "\xf4\x8e\xf0\xd3\x90\x1e\x27\xe5\x31\x6e\x4e\xe7\xee\xea\x24\xa4"
- "\xfb\xb9\xb0\x17\xc3\xbe\xd1\xe2\x1e\x51\x6c\xe0\xbd\xfd\xa7\x91"
- "\x5e\xe5\x3d\x32\x4f\xa7\x91\xf3\x90\x7b\xfb\x99\x4e\xe8\xc3\xe9"
- "\x52\x3f\x8d\xa8\xa5\x38\xa4\x5b\xca\xf8\x18\x17\xf4\xc0\x83\xb2"
- "\xfe\xfc\x74\xa9\x97\x82\x22\x02\xa7\x47\xc3\xd7\x18\x81\x0f\xe1"
- "\x02\xf8\x58\xff\x5a\x91\x66\x44\xa3\xc4\xf7\xcc\x3f\x04\x19\x9f"
- "\x9f\x4c\x56\x49\xef\xb3\x8c\x43\x9e\xcd\x01\x9c\x2d\x5b\x9f\xa4"
- "\x2e\x4a\x4a\xf0\xda\x8b\xe3\xe4\x3a\x42\xa4\x7f\xbf\xaa\x33\x5e"
- "\x74\xe7\xc7\x8d\x94\x6b\x08\x9f\x24\x3e\x8b\xa3\x8b\x46\x7e\x2c"
- "\xba\x8b\xe3\x46\x74\x91\x89\x69\xe6\x7d\x45\x4c\x67\xb8\x2c\x9f"
- "\xc9\x7e\x76\x0e\x3d\x9b\xb5\x30\x6b\x0e\x2d\x7a\x62\xde\x1c\xca"
- "\x78\x6c\x52\xc6\xf4\x6f\xcd\x9c\x4e\x79\x2b\x9e\x99\x43\x79\x8b"
- "\xe7\xd0\x52\x3c\x79\x4b\xb3\x9f\xc9\xca\x5e\x3a\x87\xf2\xe7\x2f"
- "\xc4\xd7\xbc\x39\x53\x33\x16\x4c\xca\x9b\xb7\x30\x9b\x9e\x5e\x36"
- "\x2d\x63\xda\x34\x7a\x22\x3b\x77\x6a\x46\x86\xf6\x9e\x9a\xc1\x20"
- "\xcf\xcf\xcc\x5e\x3a\x29\x6f\xcb\xe6\x8a\xcd\x93\x16\x2f\x9c\xc7"
- "\x21\x94\x9d\x3d\x87\x27\x14\xc2\xf4\x27\xbd\xef\x46\x1f\xf3\xd9"
- "\x27\x3e\xc9\xe1\x73\x1c\xa8\x1e\xf2\xc7\xd3\x25\xf7\x87\x90\xf9"
- "\x5f\xea\x59\x6e\xd2\xbe\x26\x71\x9b\x65\xea\x71\x26\x79\x3c\xa6"
- "\x2c\x69\x7f\xf9\x2c\x85\xcb\x34\xe6\xc7\x88\x7b\x50\x6b\x3f\xe2"
- "\x7b\x9c\x66\x8a\x8c\x4f\x81\x7d\x4d\x9a\xc2\xfb\x0d\xdc\x78\xc0"
- "\x73\x1f\xec\x20\x78\xeb\xa5\x6e\x7b\x7e\xbc\xdc\xef\x09\x79\xf3"
- "\x3a\x5c\xa4\x9d\x1d\x56\xdf\x3b\x78\xbd\xae\x75\x07\xc5\x5d\x23"
- "\xf3\xe8\xb6\x8a\x4c\xde\x93\x43\x7c\x83\xb5\xc4\x71\xbd\x1f\xc7"
- "\x70\x6d\xcf\xa8\xa7\x9e\xd7\x42\x2b\x3c\x7b\xc3\x6c\x83\x87\xf1"
- "\x1c\x44\x9c\x86\xeb\xb9\x36\xd8\x08\xd8\x70\x67\xd0\x9e\x4e\x22"
- "\x25\xcb\x11\xec\x4d\x97\xed\x02\xd2\x9d\xd2\x75\x1a\xf9\xfb\x5a"
- "\x91\xa7\x78\x2f\xc7\xc0\xeb\x52\xe5\x1a\x55\x4a\x3a\x53\xc3\x6b"
- "\xb7\x53\x96\x9d\x91\x7b\xb1\x65\x58\x72\x42\x5f\x35\xbe\xab\x97"
- "\xfd\x56\xd8\xd5\x1e\x6b\x84\x0d\xc3\xf7\x19\xc8\x3b\x0e\xfa\x42"
- "\x7d\x9f\x20\x7c\x13\xc5\x21\xfc\xb7\xe0\x75\xbb\x84\xff\x44\xa6"
- "\x1f\x8a\xb0\xbf\x03\xbe\xdf\x06\x53\x96\xfd\x0e\xfa\xc3\x61\xf0"
- "\x15\x92\x0f\x20\xfd\xef\xd9\xe6\x29\x3b\x3c\xe6\x9f\x48\xed\x3f"
- "\xf1\x2a\xfc\xda\x37\x9f\x5d\x51\xa5\xbe\x4f\x83\x2f\xa7\xd1\x72"
- "\xb5\x56\xb2\x7f\x93\x8c\xf2\x8f\xc8\x57\x6d\xe4\x98\x56\x86\xe5"
- "\xbd\xf2\xc2\xfc\x87\x26\xe0\x3d\xdb\xb2\xa3\x4b\x9e\x77\xe8\xa1"
- "\xe4\xcc\xa0\xbd\x98\xc2\xca\x32\x91\xe9\x00\xdd\xa6\x9e\xde\x62"
- "\xb4\x99\xc9\x19\x32\x2d\xe8\xd3\x68\x63\x98\x71\x4c\x3f\xdb\x09"
- "\xc8\x75\x06\x64\x3e\x0c\xf9\xf9\xa2\x64\x6e\x66\x7e\x80\xde\xf6"
- "\x20\xde\xc0\x63\x11\xdb\x8a\x41\x17\x19\x99\x1f\x9e\x10\x0e\x9f"
- "\xd2\xa9\x94\x19\x51\x3a\xf5\x3a\x70\xcf\x09\x8b\x5f\x16\x15\xbf"
- "\x11\xf1\x4f\x6a\xf1\xa8\xaf\x29\x15\x51\xf9\xbb\x10\x3f\x9f\x65"
- "\x88\xfa\x18\xe7\x21\xf3\x89\x7a\xf6\x27\x43\xf0\xc7\xa2\xe0\x5b"
- "\x00\xff\x1d\x5e\x97\xcf\x6d\x05\xc3\x37\x68\x7a\x0f\xf8\x04\xc0"
- "\x5f\x88\xca\x7f\x11\xe0\x97\x86\xd1\x17\x55\xfe\x51\xa7\x10\x9f"
- "\xcf\x7a\x8a\x77\x21\x60\x86\xb2\x0d\x60\xfb\x73\xba\x94\xe5\x33"
- "\x2a\x2d\x0a\x3e\x0b\x70\x1b\x98\xcf\x92\x47\xdd\xcc\x23\xb3\xee"
- "\xdb\x5c\x54\x34\x8c\xca\x8f\x4a\x63\x43\x9a\x72\xe6\xaf\xd4\xb3"
- "\x9e\x98\x69\xf6\x47\xa5\x39\x21\xf5\x54\xe5\xa3\xc9\x58\xa5\xd1"
- "\x6c\x5b\x38\x0e\x2e\x1b\xfc\xad\x51\xe7\x23\x71\x8c\x86\xcf\x96"
- "\xb4\xf3\x80\xb2\x19\x77\x40\x27\xa6\x21\xec\x28\x70\x9e\x63\x3d"
- "\x42\x3d\xf3\xb9\xbd\x7e\xd8\xde\x9c\x44\xa5\xbb\xa9\x53\x93\x2a"
- "\x89\x7f\x4f\xe2\xdf\x8c\x5b\xf4\xe6\x6a\xf5\x29\x75\x2a\xde\x1c"
- "\x2e\xcf\x87\xe4\x7a\x2c\x7a\x9f\x0a\x2a\x9c\xa9\xcb\x51\xdf\x8d"
- "\xf8\xee\xd3\xf2\x78\x93\xf7\x35\x83\xfe\xdf\xc1\xae\x13\xef\xcd"
- "\x46\xf8\x0c\x84\x1f\xd0\xe2\x5f\x65\x78\xfc\x9e\xaa\xfd\x36\x40"
- "\xc7\x7e\xa7\xd5\x33\xd4\xa9\xd1\x72\x0f\x1a\xd7\x2b\x3d\x7d\x50"
- "\xe9\xfd\x3c\xc4\x95\xe0\xbd\x10\xef\xe5\x78\x3f\x8d\xf7\x54\x3e"
- "\x8b\xc2\xde\x27\xeb\x17\x7f\xdf\x8d\xf7\x33\x78\x0f\xc3\x7b\x29"
- "\x68\xbb\x0e\xbe\x9f\xf1\x42\xa7\xa3\x74\xa6\x0b\x32\xe4\x7a\x3f"
- "\x54\xc9\x30\xb5\x83\xf3\xec\xd3\x6d\xc1\x27\xa1\x30\xcd\x3e\x68"
- "\xf5\x41\x0b\xeb\xcd\x61\xbe\xe4\x01\x7f\x0b\xe7\x2f\x14\xae\x78"
- "\x25\x27\x05\x13\x54\xe9\x4c\x4a\xde\x5a\x98\x82\x33\x84\xe7\x89"
- "\x77\x4d\x95\x4f\x08\xbc\x1d\xf2\x1c\x0b\x1a\xbd\x17\x3c\x31\xe1"
- "\x7b\x19\xf3\x49\xc2\x4b\xbc\xa3\xbc\x61\xf2\x86\x7f\x3f\xba\x25"
- "\x4a\xde\xac\xc3\x07\xa4\xbc\xc1\x3b\x9d\x66\xa6\x1f\x3a\xcd\x6d"
- "\xe5\x10\x5d\x6f\xa0\xdf\x5d\xa1\x3a\x36\x26\x21\xaa\xce\xa4\x01"
- "\xcf\x61\xd6\x8f\x91\x65\x5a\x9d\x1c\xd3\x0f\x8f\x76\x63\xcc\xcc"
- "\x48\x78\x33\x74\x75\x39\xda\x83\x51\x27\x34\x5b\xe7\x8b\xab\x64"
- "\x9d\x1e\x03\xff\xff\x5c\x87\xf4\xdb\xaa\x97\xb5\x31\x1e\x9f\x5d"
- "\x9e\x13\xe4\x8b\x2b\xe3\xba\x38\xc6\xa1\xc7\xcb\xb8\xe4\x9a\x0c"
- "\xa6\x3d\xae\x54\xc6\xd5\x79\xa0\x8a\x7a\x1c\xa9\xfd\x67\xbe\xb8"
- "\x0a\x19\xd7\x1c\xc2\x9b\xd5\xa8\xe1\x8d\x8b\x79\xc6\x93\x2b\xcb"
- "\x35\x89\xc8\xf8\x90\x83\xe2\xdd\x81\x0b\xb4\x24\x20\xfa\x26\x39"
- "\x68\x98\x3b\x70\x82\x1e\x24\x4a\x76\x07\x2e\xd2\x43\x44\xe3\xdd"
- "\x81\x1a\xf8\x01\xc7\x38\xfe\x83\x6f\x92\xc1\x80\xb7\xfd\x01\x87"
- "\xd1\xe0\x0e\x54\x50\x9a\xc3\x84\x77\x29\xcd\x8f\x17\x3d\xee\x40"
- "\x2e\xe0\x0a\x69\x49\x9f\xf8\x24\x2b\x5e\xfc\x65\x6d\x1f\x99\x73"
- "\x5f\x15\x76\x77\x00\x3e\x79\xe0\x2c\xc2\x83\x62\x49\xdf\x4d\x3c"
- "\x3d\x22\xe8\xca\x6a\x5c\xd2\xf7\x89\x98\xf7\xea\x07\xf8\xfe\x8b"
- "\x10\x46\x12\xee\xc0\x6c\x6a\xf3\xf9\x00\x67\x17\xe2\x70\x96\x6b"
- "\xcd\x75\x23\xf5\xf2\xb9\x4c\x87\xb3\x1a\x51\x96\xa6\x5e\x94\x03"
- "\xed\xdc\xfb\xbd\x3b\xf1\xae\xce\xfa\xa9\xfc\x76\x65\xb5\x08\x73"
- "\x56\xd3\x64\x74\x70\xb8\x0c\xee\x40\x07\xad\x85\x8b\xbe\x64\xbb"
- "\x57\x30\xfd\x23\x77\x73\xff\x66\x36\x9f\xe9\x90\xb4\x64\xbb\x5d"
- "\x20\x2e\x41\x24\x67\x35\xb9\x03\x5d\x84\x3c\x5a\x80\xef\x97\x12"
- "\x9f\x2b\xcb\x03\x58\x2f\xc3\x85\xe3\x61\x1c\x0c\xbb\xa4\x8f\xcf"
- "\xd9\xca\xf2\xf4\x26\x67\x9d\xc7\xe3\xed\x4d\xce\xb6\x8a\x94\xec"
- "\x69\xc2\x99\xfa\x6b\xde\x97\x2b\x5c\xd9\x99\xf8\xce\xf3\xf3\x19"
- "\x52\xcc\xcb\x3e\x1a\x2a\x0e\x67\x67\x42\xaf\xb2\xa0\x9f\xa0\x37"
- "\xbb\x4c\xd2\x5b\x9d\xbd\xd9\x2f\xcb\x91\xbd\x49\x95\x23\x7b\x23"
- "\x87\x77\x43\x77\xf0\xdb\xd5\xad\xe2\x0e\x21\xdd\x32\x99\xce\x95"
- "\xed\x12\xe6\xec\x46\x3f\xea\x1d\xf8\xea\x60\x3e\x82\xaf\x0e\xe6"
- "\x25\xf0\xbb\xdc\xb6\xfd\x24\x92\xb3\x1b\x41\x0f\xda\xc4\xec\xdf"
- "\xf4\x4a\x5f\x20\xfb\xbc\x5f\xe1\x76\x03\xcf\x2a\xe8\x75\x1c\x70"
- "\x9c\x07\x2e\x4f\xaf\xd3\x4a\x4b\xb6\x0b\xff\x92\xc0\xee\xc0\xda"
- "\xed\x14\x37\x91\x1c\x06\xbe\x7b\xcb\x6d\x2b\x44\x39\x5b\xf1\xce"
- "\x42\x3c\x8d\x42\x5e\x1f\x00\xef\x79\xce\x0f\xf9\xc0\x17\xcd\xfe"
- "\x10\xb8\x0a\x99\xa6\x9b\x7c\x56\x6b\x4a\xb6\xf7\xa6\xa4\x6f\xbe"
- "\x39\xe8\x9a\x9f\x11\x34\xcf\xb7\xea\x3a\xc4\xfa\xa3\xf8\x56\x43"
- "\x8b\x7d\x22\xe0\x0e\x1c\x25\xe8\x98\xb9\xcd\x77\x91\xe3\xd1\x07"
- "\x39\x01\x39\xb3\x4e\x55\xe0\x7d\x8c\x58\x7f\xda\xca\x5e\x65\xd8"
- "\x0f\x58\x87\x16\x97\xf9\x76\x4f\xa2\x32\x03\xbe\xed\x6b\x03\x09"
- "\xb4\xa6\xcc\xe4\xe8\x73\xcd\x07\x0c\xcb\xe5\x02\xd2\x70\xba\x52"
- "\x4a\x32\xc0\x0f\x37\x88\x40\x92\xcd\x6b\x1a\x51\x6c\x17\x6d\xbe"
- "\x5c\xc0\x96\xc9\xbb\xc4\x58\x8f\x18\x7e\x51\x97\xf0\xf4\x99\xe7"
- "\x37\x71\xd9\xc4\x48\x07\x9d\xeb\x7a\x84\xb8\x2f\x74\xae\xeb\x18"
- "\xeb\x69\x50\x98\xe7\x3b\xa0\xa3\xbd\x8b\xba\x1c\xf1\x6b\xae\x93"
- "\x01\x61\x7d\xe7\x8a\x4f\x20\xbe\x15\x70\x67\xa5\xde\x2e\xbe\x1e"
- "\x48\x0a\x98\xb3\xbd\x01\xd7\x7c\xd7\xe2\xeb\xbd\xe2\x5c\x71\x0d"
- "\xad\xee\x72\x80\x57\x27\x68\xd1\xd5\x40\x5c\x5b\x59\x21\x60\x7a"
- "\x10\x7e\x4c\xea\xff\xa2\xab\xdd\x62\xf1\xcb\xe2\x93\xc5\xd7\xff"
- "\x22\x16\x15\x8b\x0f\xd6\xda\x68\xe4\x1d\xbb\x45\x90\xeb\xc5\xd9"
- "\x8e\x13\x74\xc7\x45\x3e\xb3\x27\x8b\x72\x0b\x82\x62\xd1\xd5\x4f"
- "\xc4\x9a\x97\x99\x37\xb3\xe9\x5c\x31\xea\x8f\xad\x06\xfc\x9e\x6f"
- "\x3e\x57\x7c\x0a\xf9\x67\x01\xaf\x5d\xb8\x6d\x47\x01\xdb\x92\xb4"
- "\xfa\xaa\x99\xce\x76\xd4\x50\x20\x39\xdb\xdb\x77\x78\x3e\x05\x93"
- "\xe7\x5b\x83\x87\xe7\x67\x88\xe4\xf9\x8e\xc0\xe1\xf9\xae\xbe\xe4"
- "\xf9\xd0\x81\x05\xec\x9f\x0c\x63\x99\xdf\x72\x92\x55\x54\xcf\x0f"
- "\xde\x62\xf9\xbb\x16\x98\x85\x79\x41\x06\x6c\xa6\x50\xba\xbf\xc0"
- "\xcc\xfd\x7b\x91\xbc\x20\xa3\x37\x79\x01\xe0\xf0\x96\xba\xb7\x20"
- "\x93\xf5\x52\xb6\x59\xd5\x0b\xe6\xa2\x8d\x89\x43\x7c\x1e\x9e\x75"
- "\x78\xca\x10\xd6\x02\xfc\xc9\x3d\x0a\x67\x8b\x78\xdc\x05\x5f\xf6"
- "\x3a\xe3\xf1\x2c\xe9\x9b\x2b\xc0\x43\xd4\x93\x05\x2d\xc1\xc3\x0b"
- "\xce\x8b\x94\x1c\xf2\x4b\xdd\x5f\x20\x18\x77\xef\xce\x74\xee\xf7"
- "\x9b\xc4\xe1\x1c\xf8\x55\x39\x4e\x3f\xeb\xaa\x39\xc7\x11\x34\xe7"
- "\x78\x84\x2b\xc7\xf5\xd4\xab\xc2\xdb\xe7\xca\x69\x0a\xba\x72\x1a"
- "\x03\x43\xe0\x23\xdb\x4e\x11\xdb\xa7\xc0\xaf\x04\x78\xf0\x4f\xe0"
- "\xc7\x31\x29\x7f\xb7\x0d\x75\x60\xfb\x58\xc7\xb9\x2e\xe8\x42\xd9"
- "\x4f\xa4\x6d\x6a\xf3\x5d\x90\x3c\x15\xc9\x39\x0e\xd6\x29\x96\xef"
- "\x9a\x32\x72\x20\x2f\x57\xf0\x70\x4e\x63\xdf\x61\xe0\x4d\x46\x3e"
- "\x29\x4f\xdd\xe7\x97\xf5\xf5\x29\xe8\xeb\x29\xe2\x73\xb5\x95\x8e"
- "\x3f\x65\x1d\xcc\x46\xb2\xad\x62\xfb\xb4\x24\xe0\x67\x9d\xf9\x1b"
- "\xdb\x35\x65\xa7\x68\xad\x6e\xa7\xd8\x46\x71\xbf\x83\xed\x54\x50"
- "\xb3\x53\x41\xcd\x4e\xc9\x6f\x33\x6c\x8d\x2b\xab\x89\xed\xd1\x12"
- "\x9b\xb2\x33\x4b\xfa\x32\x04\x74\x23\x11\x38\x9a\x94\x2c\x00\x53"
- "\x9d\xf5\x4b\x09\x2f\xf9\x94\xe5\x09\xc2\xde\xe0\xf1\x06\x95\xbd"
- "\xc9\xd0\xec\x8d\x51\xb7\x37\x7c\xe6\x2b\xea\x54\x30\x96\xbd\x09"
- "\x6a\xf6\xa6\x4f\x28\x7b\x13\xd4\xec\x0d\x87\xf7\x69\xf6\xa6\x2f"
- "\x86\xbd\x09\xba\xb2\xb9\xbc\x71\x9a\x9d\x71\xb0\x9d\xe1\xf2\x06"
- "\x0f\x67\x37\x06\x95\x9d\x69\x41\x9f\xc3\xc8\x76\xa6\x0f\x69\x82"
- "\xba\x9d\xe9\x91\xe9\x3d\x6c\x6b\x7a\x5f\x23\xd8\x4f\x2b\xb1\x8d"
- "\x91\xf6\x24\x30\x3e\xc0\xf6\x04\xfc\x9b\x1b\x6d\x4f\x80\xcf\x8b"
- "\xdf\x66\x65\xa7\xe6\x5b\x93\x76\x8b\x00\xec\x09\xf8\xe4\x83\xac"
- "\x3f\x44\xff\x1b\x76\xdb\x56\xe1\x70\xdb\x02\x04\x3b\x90\x21\xda"
- "\x1c\x04\x9b\x03\xfd\xed\x83\xad\x20\x42\xbd\x74\x04\x50\xc7\x61"
- "\x8b\x5c\x6d\x65\x7f\xa4\x3e\xd4\xd5\x45\x5d\xdd\xee\x35\xbe\x74"
- "\xf3\xa2\xab\xc2\x0b\xfe\x78\xd6\x94\x39\x60\x5f\xd2\xbd\xe7\xba"
- "\x7e\x49\xb9\x1d\x22\x98\xbb\xce\x63\x45\x3d\x73\x2d\x2a\x69\x49"
- "\xe2\x33\xcd\x17\x5f\x17\x2d\xb0\x8b\xff\xf7\xa2\xab\xe6\xa4\x55"
- "\x1d\x74\x4f\x6e\x81\x08\xf6\xa1\x9e\xa1\x8e\xa1\xdc\xf3\xcd\xa8"
- "\x63\x56\xd4\xb9\x0c\xd4\x33\x47\x20\xaa\x9e\x89\x94\xf9\x41\xfc"
- "\xb6\x2a\xfe\x2d\xc8\x40\x3d\x33\x07\x65\x7b\xd6\x21\xfb\x7a\xa8"
- "\x0f\x19\x3c\x1e\x86\x3a\x62\x46\xbd\x90\x75\x2d\x28\x54\x5d\x0b"
- "\x32\xff\x8c\x5a\x5d\x83\x2c\x10\x9f\x87\x67\x1d\x9e\xd8\x75\xad"
- "\x2c\xac\xae\xbd\xac\xd5\xb5\x64\x55\xd7\x20\xd3\xb8\xbe\x9d\xaa"
- "\xbe\x31\x7e\xee\x0f\xf6\xd7\xb7\x94\x1c\x07\x9f\x3d\xa4\x74\x47"
- "\xd6\x39\xb4\x2b\x39\x4d\xa8\x6f\x8d\xa8\x6f\xc0\x27\xbc\x6c\x37"
- "\xa1\x9b\x7f\xe6\xb6\x6e\x71\x99\xf8\xf3\xda\xbe\xb1\x0e\xd4\xa7"
- "\x26\xd8\xb2\xbf\xc0\x8e\xfe\x79\x8d\x8f\x1a\x81\xcb\x81\x7a\xe4"
- "\x42\x7d\x6a\x44\xbd\xe2\xfa\x64\xed\xdb\xc9\x38\x9f\xb2\xf6\xe3"
- "\x90\x6d\x65\x64\x7d\x52\x23\xe9\xb1\xc7\x23\x7b\x9c\xf7\x96\x7a"
- "\xe8\xc3\x04\x79\x2e\xa5\xf3\x5e\x1b\x7e\x5f\xd4\x7e\xa3\xff\xf7"
- "\x2b\xb9\xcf\x96\xeb\x61\x59\x15\x8d\xbe\x42\x56\x3e\x8f\x9d\xf0"
- "\x3b\x11\xbf\x67\x2f\x79\xf0\x03\xf8\x12\x1f\x74\x22\xef\x1e\xae"
- "\x8b\xc2\x39\x83\xe5\x92\x09\x5d\x4c\x10\x3d\x7c\x06\xfe\x8a\x3f"
- "\xf0\x19\xf8\x7c\xe6\x3d\xbe\x47\x82\x07\x69\x78\xa7\x1c\xbd\x41"
- "\xa9\x78\xf8\xdc\x6b\x07\xfb\x4f\xf8\x9d\x21\xb6\x59\x86\x1f\xdc"
- "\x4a\x13\x93\x7c\xea\xac\x7b\x3e\x9b\x3f\x29\x40\xa9\xfc\x5b\x38"
- "\x4f\x9b\x1a\x6e\x68\xe7\xdd\x27\x23\x3f\x3e\xef\xbe\x3c\x9d\x1a"
- "\xb6\xc8\x33\x38\x2d\x0d\x4e\xd1\xd4\xd7\xc3\x7c\xc8\x72\xe9\xb4"
- "\x30\x6d\xa0\xf3\x6e\xd0\x99\xbb\x7c\x7b\xa6\xbc\xe7\x30\x96\x8d"
- "\xe9\x71\x5a\xfb\xcb\x3f\x48\xfc\x7e\x9d\x27\x83\xc4\x9f\xd0\xf9"
- "\x34\xd8\x3e\x5b\x6e\xa7\xfb\xb6\x8a\x2e\x3e\x23\x84\xf7\x05\xdb"
- "\x03\xe2\x7f\xf2\x59\xf7\x55\x7d\x94\xb0\xc4\xe6\x17\xee\x2e\xd1"
- "\xc2\x77\x76\x36\xf0\xb9\x25\x95\x22\x18\x4c\x5e\x71\x52\x1c\x5e"
- "\xd1\xd4\xbd\x55\x04\x78\x5c\xa5\xc7\x39\xde\xec\xa1\xac\x04\x25"
- "\x8b\xf9\x66\xd9\x27\x34\xaf\x68\x02\xae\x64\xc6\x75\x0e\xe9\xfb"
- "\x0e\xaf\x68\x06\xdc\x4c\x0f\x75\xe5\x49\x38\xf3\x7c\x73\xd9\x0e"
- "\xfa\xc6\x15\x1a\x2f\xcf\x93\x12\xae\x15\x67\xd8\x26\x20\xcc\x8c"
- "\xb0\x4a\xe0\x3f\x0b\xf8\x62\x0f\xfd\xf7\x89\xca\x97\x1d\x5f\xa9"
- "\xc3\xe1\xf7\x80\x7b\x20\xb4\xd5\x18\x8e\x88\x7d\x66\x06\x8a\xdc"
- "\x35\xc7\xab\x5b\x32\x63\x47\x87\x6c\xfa\x7c\x17\x9f\xf7\x69\xdf"
- "\x45\xe3\x20\x1f\xa6\xef\x53\xbb\x4d\x5c\x16\xce\xf1\xfb\xde\xdb"
- "\xe1\x47\x9f\x62\x3c\x68\xf9\x69\xe5\x60\xfc\x0c\xde\x10\x1d\xc0"
- "\x91\x71\x08\xfd\x42\xe6\x0f\xf3\x13\xf5\x26\x08\x3e\x7c\xc4\x36"
- "\xa9\x61\x2b\xf7\x8d\xef\xcb\xd4\xf9\x35\xb8\x4c\x56\xa8\x73\x36"
- "\xe8\xbe\x46\xe1\x14\xd4\x72\x0f\xcf\x65\xdc\xf7\xae\xe2\xc1\x02"
- "\x6b\x37\xec\x08\x8f\xd5\xf2\xd9\x9c\xe5\x16\xe1\x07\xce\x1a\x0f"
- "\x3d\x9c\xa1\xef\x8b\x76\x07\xb2\xd9\xb6\xc4\x6c\xb7\xe4\x9e\xe8"
- "\x7e\xfc\xf7\xb7\xb4\x8d\xe3\xfb\x54\xd9\x36\xd5\x54\x54\x29\xf9"
- "\xfb\x19\x2f\xef\xf1\xef\x40\x7c\xb9\x4f\x74\x0a\x57\x4d\x31\xf7"
- "\x23\x78\x7f\x31\xc2\x7e\x0d\xbd\x16\x2d\x5b\x98\xa6\xfb\x7f\xdd"
- "\x72\xcf\x2d\xba\x8c\xfe\x61\x43\xff\xd8\xcd\xfd\x27\x78\xac\x46"
- "\x8d\x37\xdd\x3f\xd1\x43\x93\xce\xea\x74\xb1\x8f\x01\xde\x26\xb0"
- "\xcf\xc1\xbe\x06\x8f\xff\x97\x57\x0a\x3f\xfb\x1c\x80\xcd\xd7\xcb"
- "\xc0\xe5\x53\xe5\xba\xbf\x34\xbc\x5c\xa0\xc1\x8b\xbe\xb6\xe4\x41"
- "\xf9\x76\x4a\x90\x67\x05\xf6\xf1\xfc\x41\xb6\x2c\x0b\x97\x59\x96"
- "\x45\xda\x58\xb4\x11\x81\x47\xd0\x6f\x93\xe1\x19\xc0\x85\xfe\xcf"
- "\xc4\x99\x4a\x9f\xee\x9f\x18\xad\x43\xa1\xf3\x6d\xb3\x3d\xf6\x9b"
- "\x74\x8f\x3d\x28\x2e\x5d\xa6\xb4\x6c\xf0\x29\x8e\xdf\x41\xf6\xb3"
- "\xfd\xac\xbb\xab\x5b\xb9\x4d\x76\x57\xb2\xbd\x95\xb0\xa3\x00\xdb"
- "\x01\x98\x47\x34\xd8\x47\xd4\xdc\x8f\x7c\x0f\xe5\x37\xda\xb1\x0f"
- "\x3d\x94\x96\xeb\x95\xed\x7d\x4d\x86\xfe\x2d\xf0\x8d\x37\xec\xf0"
- "\xea\xd6\xd8\xb4\xe4\x78\xb8\x3d\xeb\xbb\x21\xba\x90\xcf\x9d\xac"
- "\x47\xf6\xed\x74\x17\x74\xf2\xa3\xaa\x5d\x34\x9a\x75\x4c\x24\xaf"
- "\x38\xaf\xf8\x9e\x56\x2b\x9c\xf0\x3d\x61\x51\xcb\xb6\xd2\x37\x50"
- "\x87\xce\x5c\xa1\xb4\x9f\xac\xad\xb4\x82\x56\xa2\x43\xd7\x88\x7d"
- "\x94\xbf\x00\xfe\xac\x3b\xf0\x57\xbe\xd7\x04\xba\x98\x76\x56\xd7"
- "\x45\xfc\x6e\xbf\x9d\xad\x00\x5f\xd7\xa9\x71\x86\x09\xd9\x3c\xd6"
- "\x7f\x89\x26\x64\x70\x79\xf1\x18\x10\x36\x5e\xdc\x10\xe3\x84\x6a"
- "\xd3\xf2\x3c\x34\x61\x15\xde\xeb\xe4\x03\x5b\xa2\x7d\xa3\xdf\x3f"
- "\xc1\x2c\x6e\xf4\x31\x0c\xfa\xb8\x13\xd2\x85\xd3\xc0\xf5\xa4\xae"
- "\xc7\x39\x61\x99\x87\x16\x68\xfd\xd6\x09\x56\xc6\x35\x08\x0d\x79"
- "\x42\xee\xaf\xff\x0c\xe5\x9d\xf0\x4b\x6b\x95\x81\xe9\x90\xe7\x00"
- "\x31\xae\x06\xa3\xb2\xd9\x41\xd0\x5a\xef\x0c\x16\xc3\x3e\x17\x07"
- "\xab\xd7\xb9\xe4\x6f\x2d\x4e\x68\xed\x68\x6c\xfc\x35\x15\xf2\xbc"
- "\x67\x7a\xc0\xa2\xf0\xd4\x14\xb7\x8c\xbd\xc2\xdf\x77\xf1\xb7\xcf"
- "\x5c\xe0\x72\xd7\x66\xaa\x33\xa8\x01\xa3\xfa\xf1\x0f\xdc\xd5\x8d"
- "\x3c\x7a\x9c\x0f\x58\x3c\x34\x25\x41\xcd\x7b\x14\xb8\x06\xa9\x7b"
- "\x66\xae\x3b\x5c\xe7\x54\x9d\xfe\xe6\xd5\x73\x8d\xb2\xfe\x65\x42"
- "\xe7\xd7\x69\xf6\x97\xc7\x64\x12\x2f\xd1\x37\xbb\xce\x59\xa4\x7e"
- "\x1b\x85\xf1\x01\x5b\xc4\x19\xb2\x88\x1b\xf8\x3c\x80\xfe\xfe\x03"
- "\xa7\xf0\x9c\xd1\xbe\x2f\xe0\xe9\xc4\xef\x99\x78\x2e\x4a\xde\xbd"
- "\x53\x68\xf0\x20\xae\x1b\x3e\x3b\x7f\x7b\xe8\x81\x93\xe2\x9d\x34"
- "\xa3\xfe\xbb\xe1\x6d\x1e\x27\x78\xc0\x03\x19\x14\x2b\x59\x30\x1e"
- "\x32\x80\x36\xe6\xbb\xb0\xd7\x0a\x7f\x6b\x95\x8f\xe9\x36\xb7\xd6"
- "\xfa\xc8\xfa\x00\x97\xff\x9b\xa9\x5c\x26\x1f\xf8\xcf\xef\xf2\x5a"
- "\xe1\x3d\x5d\x17\x20\x9e\x23\xeb\x71\x7e\x13\xf5\xff\x7b\xb9\x6a"
- "\xcc\xa1\xa6\x91\xf1\x69\x3a\x21\xf4\xf2\x2b\x3e\x17\xb8\xac\x5b"
- "\x0d\xfc\xbd\xbd\x5e\x8e\xc3\x2c\x9f\x1d\x1a\x6b\xfe\xe6\xcb\xa8"
- "\xe7\x73\xf9\x2c\xe9\x6b\xf4\xcd\x5f\x08\xf0\xfa\x74\xb1\x3c\xab"
- "\xd2\xcb\xe3\x31\x3c\x7e\x8f\x7c\x60\xff\x26\x9c\xd1\xce\xe5\xf1"
- "\x4a\x5b\x03\x9c\x07\x11\x87\xf6\xa8\xeb\x5c\xb1\x9f\xfa\xb8\xcc"
- "\x48\xfb\xcb\x1b\x7e\x13\x9f\xa5\x5d\x55\x06\xbb\x03\x3a\x04\x64"
- "\xa5\x6c\xd9\x37\x73\x76\x5d\x15\x7e\xbd\xcc\x3c\x97\x0a\xbc\x5d"
- "\x1e\x72\xe5\x0f\x5a\x27\xfa\xcb\xf1\xe0\xb0\xd3\x69\x4a\x8e\x41"
- "\xf0\x2a\x52\x8e\x0f\x26\x28\x19\xa6\xcf\x8e\x94\xe1\x83\xf0\x75"
- "\xd2\xf7\xe2\xa9\xc3\x73\x42\x7d\x87\x3f\xe9\x65\x61\xbf\x21\xd7"
- "\x74\xd8\xd3\xf4\x4a\xd8\x0b\x6d\xec\x87\xc3\xa1\xcf\xac\x37\x9f"
- "\xa2\xed\xe9\xe5\xb3\xcf\xaf\x12\x87\xb3\x8e\x73\x78\x10\xfe\x8d"
- "\x87\xd2\x5d\x88\x37\x73\xfd\xe5\x73\x3f\xc3\xe3\xfb\xcf\x77\xa2"
- "\x74\x79\x56\x4c\xd2\xee\x7d\xfb\x58\x77\x91\xa6\x26\x29\xb0\x6f"
- "\x1f\xf2\xeb\xd2\xf9\x8a\xb0\x0b\x1c\xcf\x7a\xda\xe3\x7c\xd0\x04"
- "\xbe\xd4\xca\x79\x52\xf4\x01\x63\xfb\x1e\x0f\xa6\xf7\xfb\x68\xe6"
- "\x05\x2d\x2c\xcb\x2e\x7a\x68\x06\xec\x18\xec\xf7\xba\x7d\xaa\xfd"
- "\x79\xe8\x11\xfe\x86\xfd\xfc\x08\xbf\x33\xce\xc1\x4e\xdd\xaa\x5e"
- "\xd6\xdc\x6b\xa4\xa1\xb7\x8c\x94\x19\xa8\x6e\x49\x0c\xa4\xe4\xb6"
- "\xba\x3b\x4f\x52\x5b\xe0\x3f\x92\xf5\xbb\x12\xc7\x83\x7c\xfe\xac"
- "\x7d\xbb\xe8\x7b\xff\xd6\x71\x93\x3b\xf0\x49\x8b\x3c\x67\x5e\xed"
- "\xdf\x37\xfc\xe0\x92\xba\x6b\xe9\xb2\xf6\x2d\xcc\x1f\x74\x1e\x7c"
- "\x51\x04\x0e\x5e\xe6\x33\x69\x2c\xc3\x0f\xdc\xa2\x89\x3f\xdc\x41"
- "\x19\x75\xb7\x28\xad\xfe\x16\xa5\x8b\xbf\xf1\x5d\x44\xc1\xfc\x35"
- "\xd7\xcd\x04\x3b\x91\x3f\xb2\x8c\x12\xea\x77\xc0\x9f\x0b\x90\xa1"
- "\xef\x30\xfc\x39\xbe\x93\xe9\x93\x74\xb6\x97\xfd\xfe\x5c\xaf\xf4"
- "\x95\xf3\x67\xcb\x33\xca\x0f\xe7\xcf\x1e\x51\x4c\x86\xc4\x75\x64"
- "\x06\x7d\xf6\x6b\xf4\x60\x49\x62\x07\x7c\x49\x94\xd9\xa3\x95\x17"
- "\x3c\xaf\x4c\x2a\xa6\xa1\xb2\xac\xb0\xe1\xe2\xf0\xba\x7d\x83\xb6"
- "\xcd\x46\xd6\x29\x1f\xd7\x25\x2e\xc3\x6e\x9e\xcb\x3d\x39\xd6\x6f"
- "\x2a\xaf\x13\x7e\x0e\xaf\x18\x2f\xfc\x08\x97\x67\xe2\x35\x21\xbc"
- "\xc7\xf9\x90\xcb\x63\xca\x1c\x74\x6d\x08\xfa\x4c\x9a\xad\x79\x38"
- "\x59\x18\x1d\xd0\xd1\x1c\xda\x15\x80\x3f\x7e\x8d\xeb\xf1\xc3\xe6"
- "\x25\xa5\x22\x60\xdd\xc4\xf3\xea\x0f\x13\xcf\xf9\xf3\x5c\xdf\x4f"
- "\xe1\xeb\x7c\xde\x3c\x3f\xb7\x21\xdc\x7f\x48\x2a\x05\xce\xea\x1c"
- "\x18\x87\xf4\x18\xe7\x89\xc4\xf6\xeb\x79\xad\xc9\x1b\x72\x5d\xcb"
- "\xc3\xb9\x1e\x7a\xb6\x51\x3b\x67\xb6\x4b\xd9\xd3\x89\x13\x7d\xe0"
- "\x41\xa4\x0d\x98\x48\x7c\x3e\x4a\xb7\x6b\x79\x56\xcb\x3d\x6c\xfb"
- "\x1f\xbe\xa9\x7c\xa1\xe5\x99\xaa\x2d\x78\xf8\x5f\xd4\x18\xff\xc3"
- "\x75\x1e\xfa\xb6\x6c\xe3\xcb\xee\x63\x9d\x78\xf8\x82\x48\x59\x3e"
- "\x8f\xe1\x26\x3b\xc8\xb1\x39\x40\x68\x93\x96\x67\x0a\x59\x57\xae"
- "\x91\x78\x6b\x43\x0f\xaf\xd5\xf0\xdd\xb9\xb2\x07\xbe\xc1\x44\xc4"
- "\x65\x71\x1e\x5e\xc0\x80\xef\xc3\xd4\x9a\x80\x87\xbd\x1e\x7a\x4c"
- "\xb3\x87\x0f\xb7\xaa\xb1\xe7\x87\x5b\xbb\x91\x16\xbe\xe2\xa8\x1e"
- "\xe7\x44\xf8\xbf\x4b\x2b\xb4\xb9\x63\xb9\xa6\x07\x61\x69\x1e\x5a"
- "\xd6\xcc\x61\x15\xe3\xc9\x52\x61\x15\x9d\x83\xfa\x7a\x11\xe5\x9c"
- "\xf4\x77\x72\xdd\x8d\x91\xee\x04\x8e\x62\x1d\x2f\xda\xdb\xff\xd0"
- "\x6d\x5c\xbe\x1c\x61\x95\x3a\x5e\xc0\x8c\xc6\xf7\xfe\x7e\x18\x95"
- "\xa6\x2e\x2c\xcd\xf2\x6e\xe3\x43\xff\x01\x61\x4d\x51\x69\x5a\xa2"
- "\xd2\x9c\x0f\x4b\xe3\xd0\xf2\xe9\x88\x4a\xe3\x8b\x4c\x33\xc9\x34"
- "\x90\xb6\x49\x96\xc8\x34\x93\xd2\xa3\xd2\xcc\x1c\x48\xdb\xa4\xdc"
- "\xa8\x34\xab\xa2\xd2\x94\x86\xf1\x96\xd7\xc0\xc0\x8f\x9b\xe4\x88"
- "\x4a\xe3\x8a\x4a\xd3\xa8\x7f\xc3\xf7\x6c\x51\xbe\x01\xf4\x09\x32"
- "\x85\x5c\xb3\x10\x8f\xf2\xcf\xb9\x70\xbb\x75\x50\xd0\x99\xd9\xf6"
- "\xa3\xea\xbc\x7e\xb6\xab\x3c\xaf\xcf\xf6\x1c\x7e\x71\x17\xeb\x04"
- "\xfb\x9d\x9c\xd7\x65\x9a\x7c\x95\x75\xa8\xc7\x39\x39\x75\x20\x3f"
- "\x26\xa7\x47\xd2\x39\x79\x66\x24\x9d\x93\x73\x06\xf2\x63\xf2\xaa"
- "\xa8\x34\xa5\x51\x69\x2a\xc3\xd2\x34\x6a\xf9\xb8\xa2\xd2\x34\x46"
- "\xa5\x69\x1a\xa8\x9f\x93\x5b\xa3\xd2\x5c\x88\x4a\xd3\x11\xe2\xe1"
- "\x64\xb9\x9e\x8d\xeb\x03\xc2\xf1\x3d\x3b\xed\x36\xbc\x33\xeb\xfa"
- "\xac\xaf\x47\x53\x7a\x3d\x65\x77\x8d\x5a\x97\x25\xcf\x46\xea\xa0"
- "\x29\x6f\xea\xf3\xbd\xef\xdd\xf2\xc7\xf3\x1c\x13\x78\xdb\x79\xda"
- "\xe6\x47\x9b\x3b\x05\xbe\xe1\x23\xb5\xfa\x9a\x0d\x5e\xe7\x22\xcf"
- "\xd6\x93\xfd\x91\x29\x99\xaa\xfe\x4d\xa9\xd1\xe6\x74\xb8\x3c\x68"
- "\x17\xa7\xd4\xfc\xaf\xd1\x95\xf1\x08\xd3\xc5\x67\x4c\x01\x47\x7b"
- "\x7f\x5f\xa3\x9f\x56\xce\x33\xe3\x09\x9d\xd6\x06\xb5\xd6\x86\xcf"
- "\x35\xf3\xf2\xb9\x5f\x3d\xce\x8c\xc4\xb0\xfe\x09\xd3\xea\x3b\xb9"
- "\xc3\x6f\x8a\xa2\xb9\x4b\xd1\x9c\x91\xa9\x6c\x54\x46\xa6\x6e\x4f"
- "\x06\xd5\x3f\x57\x4d\x7e\x1b\xbc\x02\x5e\x53\x70\xae\x0e\xfe\x26"
- "\xfa\x58\x4c\xf7\x25\xca\xd8\x27\xfd\xdf\x4d\xb7\x88\x7f\xbb\x2b"
- "\x67\xc9\x35\x07\x5a\x59\x5a\xf8\x7e\x07\xf6\x7d\x5a\xcb\x3e\xa3"
- "\x6e\xd9\x47\x63\xdb\x98\x71\xf5\x74\xa5\x97\x69\x6d\xd6\xd7\xe5"
- "\x80\x16\xe5\xd7\xb9\x6a\xf2\x78\x3d\x04\xcf\xeb\x9d\xf6\xcd\x64"
- "\x98\x8b\xe0\x6d\xa3\xce\x03\xbe\x2b\x02\xb0\x35\x83\xf5\x95\xc2"
- "\xf9\xaa\x68\x98\xfe\x9c\xd2\x9f\xa9\x69\x91\xf5\x21\x1e\x7a\x3a"
- "\x75\x66\xa4\xce\x4d\xcd\x89\xd4\xb9\xa9\xf9\x91\xf5\xc1\x88\xfa"
- "\x30\xb5\x34\x2a\x4d\x65\x54\x9a\xfd\x61\x69\x5c\x5a\x3e\x8d\x51"
- "\x69\x9a\xa2\xd2\x84\xdb\x3f\x94\x79\xea\xf9\xfe\x7e\xa7\xb4\xf7"
- "\x53\x3d\x61\xdf\xc6\x1a\xd9\x4e\x4d\xf5\xe9\x61\x3c\x6e\xc7\x3e"
- "\x2a\xeb\x8d\xc2\x37\xcd\x1c\x65\xa3\x00\x3f\x2d\x2d\x92\x86\x69"
- "\x33\x22\x69\x98\x96\xa5\x7f\x6b\x6b\x1e\x7e\x73\x99\xa6\xbd\xae"
- "\xe9\x99\x2f\x69\x37\x3d\x9d\x14\x78\xe6\x39\xf6\xcd\xb8\x7d\x92"
- "\x6b\xc3\x76\xc1\xa7\xbc\x4e\x66\x5e\x93\x77\xb9\x82\xe2\xf8\xfc"
- "\x39\x0f\x4d\x3f\x25\x92\xf3\x67\x1e\xe2\x75\x14\x55\xb4\x04\x38"
- "\x96\x21\xff\x5a\xe4\x01\xde\x4d\x3b\x1e\x45\x43\x73\x14\x0d\x67"
- "\xc2\xbe\xd1\xff\x9e\xd6\x1e\x56\x6e\x73\x9c\x45\xae\x01\x85\x6f"
- "\x3d\xcd\xab\x87\xf3\x18\x00\xca\xd8\x69\x97\x7e\x40\x26\xaf\xc7"
- "\x4b\xb9\x44\xd3\x3e\xe4\xf1\x02\x85\x73\xfa\xb8\x70\xde\x2a\x5e"
- "\x4c\xcf\x88\xa4\x63\x7a\x66\x24\x1d\xd3\xf3\x42\xb6\x66\xda\x32"
- "\x55\x47\xa6\x17\x7a\xe8\x71\x79\xfe\x23\x78\x61\x4d\x0a\x58\x47"
- "\xb5\xdc\xc7\x7e\xea\xf4\x9f\xf9\x50\x5e\xf1\x9a\x31\x45\xfb\xfe"
- "\x85\xb8\x8f\xfd\xee\xfc\x99\xb0\xcf\xbc\xe6\xf2\x5e\x84\x9d\x52"
- "\x72\x9d\x8e\xf2\x7f\xfb\xb8\xc2\x3b\xfd\x94\x6c\x07\xee\x63\xff"
- "\x77\xfa\x3e\x91\x5c\x53\x3c\x98\x3e\x77\xa7\xd4\xac\xd3\xd6\x83"
- "\x5a\x81\xa3\x4b\xaf\x0f\xc1\xea\x9a\x75\xc1\xc3\x6b\xd1\xfe\xcc"
- "\x00\x8e\x0c\xbf\xea\xd3\xac\xa9\x84\xee\xd7\x42\x7e\xe8\x03\xcf"
- "\xd0\xfa\x32\x35\x15\xbc\x26\x0f\x76\x89\xcf\xb8\x4c\x54\xeb\x27"
- "\x66\xcc\x08\xab\x57\x3e\xeb\x8e\xb9\xe2\x12\xcd\xb8\xc9\xbe\x1d"
- "\xdb\x0d\x5e\xdb\x77\x3a\xe0\x25\x1e\x67\x71\x07\xae\x48\x9f\x1c"
- "\xf1\x7e\x2d\x6d\x59\x58\x5a\xaf\x36\x0e\xd2\xc9\x71\x53\x02\x64"
- "\x3a\xed\xf3\xf2\x59\xfe\xa9\xca\x8f\x9f\x71\xf3\x34\xec\x05\xd2"
- "\x1c\xd3\xd3\xf0\x98\x09\xa7\x41\x9f\xc7\x34\xb9\x52\xdd\x65\xca"
- "\xb8\xf5\xf5\x35\xdc\x3f\x72\x57\x76\x92\xdb\xd7\xce\x63\x9a\x26"
- "\xb5\x2e\x6a\x86\x3f\xce\x4f\x09\xdd\x87\x6b\x20\x9b\x19\xfe\xbe"
- "\xc3\x35\xf9\xa0\x0d\x74\xcc\xe0\x33\x7c\x23\x7c\x99\xec\xec\xbc"
- "\x67\x96\x2c\x9a\xb4\xe2\x99\x85\xcb\xb2\x67\x59\x97\x95\x6c\x2c"
- "\x2a\x9c\xb4\xf9\x95\x0a\xeb\xb6\x2d\x25\x15\x25\x9b\x5e\x92\xc7"
- "\x8f\x5a\x0b\x2a\xd4\x3b\xbd\xb4\xa0\xbc\x62\x0e\xff\x9c\x68\x2d"
- "\xdb\x52\xb4\x55\xfe\x7c\x70\x38\x45\x22\x29\xa9\x28\xda\x62\x9d"
- "\x50\x38\xd1\x3a\xbf\xa0\xa4\xf4\x95\x2d\x45\x31\x71\xcd\xb2\x6e"
- "\x29\xda\x52\x54\x50\x68\x9d\x63\xcd\x60\xcc\xe1\xe8\xc2\xe4\x99"
- "\xa1\xdb\xa7\x72\xb4\xe7\xf0\xa1\x3b\xd9\x4e\x71\xbb\x7e\x99\xbe"
- "\xf5\x21\xfb\x70\xf2\xbc\x50\xe8\x21\xda\x04\x4f\x8f\xf3\x91\x8b"
- "\x03\xdb\xf1\x47\xbc\x91\xfa\xfb\x28\x45\xea\xef\xa3\xe6\x81\xed"
- "\xf8\xa3\x51\xf5\xff\xd1\xa8\xfa\xff\x68\xd6\xc0\x76\xfc\xd1\xfc"
- "\xa8\x34\xc5\x51\x69\x6c\xfd\x76\x06\xb4\xee\x91\x76\xe9\xd1\xfd"
- "\x51\x69\xea\xa2\xd2\x9c\x88\xfa\x3e\x15\xf6\x0d\xdf\xf5\xd1\xb3"
- "\xe1\xbe\x01\xbe\x2f\xea\x75\x3d\x64\xdf\x1e\xf5\xea\x30\xdc\xf6"
- "\x34\xf0\xbd\x44\x12\xf6\x5b\x09\x61\xb0\x9d\x0a\xf6\x5b\xfd\xf5"
- "\x9f\x6d\x12\xaf\x89\x54\xfe\xf9\xb7\x0e\x68\xb6\x8d\xef\x29\xd2"
- "\xdb\xd0\x0e\xc8\xe2\xde\x6b\xf4\xe8\xcd\x06\x05\xeb\xe5\x75\xb2"
- "\xe2\xad\x95\x3d\x0d\x29\x94\xc0\x69\xf9\xbc\x4c\xe1\x7c\x44\x9e"
- "\xdd\x88\xb0\x44\x3c\xb0\x53\xdf\x72\x78\x4c\x4f\xc8\x3b\xac\xf6"
- "\x02\xc6\x43\xdf\x92\xba\xcc\xe9\xf6\xca\x75\x7d\x32\xbf\x9b\x7c"
- "\xdf\x12\x9f\x41\xcb\xf6\x93\xf3\xe5\x73\x5c\x39\x6f\xe0\x30\x09"
- "\xe3\x23\x0b\xb5\xf3\x38\xcd\x78\x52\x81\xf3\x82\x8e\x13\xf8\xe4"
- "\x38\xd1\x1e\x6d\x1d\xbc\xf2\x7b\xbe\xe5\xd3\xfd\x0b\xee\x2b\xc4"
- "\xb2\x1d\xb1\xd7\x3c\x53\xd2\x21\x67\xb0\xbd\xa5\xaa\x03\x34\xcd"
- "\x4c\x63\x3f\xd4\x6d\x09\x50\x5b\x5d\x00\xfd\x57\x32\xcb\xfe\x94"
- "\xed\x2a\xb9\x1b\x03\xc4\xe3\xc3\x6b\x6d\xe4\x68\x30\x06\xdb\x45"
- "\x7f\x3a\xee\xa3\xcd\x94\xe7\x08\xef\xe5\x70\xa4\x47\x5f\xc2\xcb"
- "\x6b\xa3\x07\xbb\xf3\x8b\xe1\x5a\xee\xe3\xfe\xde\xcc\x1a\xcd\xf7"
- "\xdd\xd7\x00\x5c\x31\xd7\xed\x1a\xc9\xdd\xe3\x9c\x89\xf6\x6f\xdd"
- "\x4c\xdd\x66\x9f\xae\x95\xb6\xcf\x88\x70\xf0\x76\xe6\x80\xf3\x40"
- "\xc3\xd2\xb2\x7d\x2f\xe3\xb5\x5f\x3d\xce\xc7\x52\x6f\x07\xcb\x74"
- "\x9f\x46\xb9\x51\x17\x73\xde\xab\xca\x88\xd7\xec\x6b\x02\xd2\xe5"
- "\xea\xe9\xbe\x48\xf9\xb4\x3d\x0a\x5e\xd4\x55\x9f\xea\x2b\xce\xfa"
- "\xf5\x1b\x72\x2d\xf0\x63\xf0\xff\x66\xea\xf5\xe0\x0e\x7c\xc3\xfe"
- "\x3d\x26\xc7\x13\x79\xdd\x0c\xf7\xa9\xcb\xcb\xe0\xb3\x59\x7c\xb0"
- "\x8d\x8f\xb5\xe8\x71\x72\x9c\x88\xe3\x2a\x85\xff\xb4\xa5\x83\xe3"
- "\x2e\xf6\xc7\x71\x3a\xa6\xdb\x16\xe0\x70\x9f\x1e\xae\xda\x96\x59"
- "\xa6\xa8\xef\x54\xfd\x1b\xbf\xad\xa0\x65\x9f\x86\xdf\x0b\x9b\xcb"
- "\x6b\x9e\x0c\x97\x68\xd6\xee\x7a\x59\x6f\x66\x65\xea\xf1\x72\x4c"
- "\xed\x5d\x9e\x1b\xf3\x51\x30\x65\x79\x8e\xf4\xb9\x90\x86\xef\xef"
- "\x42\x1f\xc3\x20\x7a\xe5\xfa\xab\x2e\xc6\xc3\x75\x46\xde\xa1\x83"
- "\x6f\xe0\x9a\xd1\xc0\x7a\x0d\xb9\x6e\x0b\xd0\xb8\xb2\xc7\x79\xfc"
- "\x79\x96\xd4\x5b\x0e\x63\xbc\x8c\x8f\xdb\x44\xc6\xcd\xf8\xf8\x9e"
- "\x31\xd1\xcd\x6b\x14\x67\xa1\xfc\x33\x7d\x83\xc9\x0a\xf1\x9e\x30"
- "\x5e\xc6\xe3\xdb\x1b\x59\xd6\x6f\x53\xd4\xb7\x59\xff\xe6\xb1\x5e"
- "\xa5\x7b\xdf\x36\x69\x71\x13\x6f\x97\x17\xf7\x7f\x01\x93\x17\x99"
- "\xdf\xb7\xd7\x45\xe1\x2f\x8b\xfa\x76\xe8\xdf\x35\x72\x8e\xe1\xdb"
- "\x2e\x3d\x0f\x29\x33\xe8\xd8\xb1\x2a\x6f\xfc\xed\xce\x95\x45\x9a"
- "\xd6\xb0\x3c\x87\xe0\xfb\x42\x48\x7e\xdf\xf6\xe8\xf8\xf0\xbb\x2b"
- "\x0c\x0e\x7e\xc9\xb7\x03\x3a\x9c\x9a\xdf\x98\x9d\x18\x4a\x37\xdb"
- "\xf2\x39\x65\x8d\xd2\xdd\x39\x45\x4a\x77\x67\xe7\x45\xd2\x32\x7b"
- "\x5d\x18\xce\xd2\x10\x2d\xb3\x6d\x61\x70\xa8\x9f\xb3\xf7\x45\xeb"
- "\x6a\xb9\x8d\x75\x9c\xf5\x75\xf6\xb1\x18\x71\x7e\x2d\xae\x25\xb6"
- "\x8e\xcf\x6e\x0f\x0b\xd7\xfa\x47\x73\xe6\x68\x7e\x02\xdb\x67\x1f"
- "\xdf\xa1\xa6\x9d\xe3\x2e\x75\x92\xcf\x77\xd6\xee\x75\x82\x5e\xcf"
- "\xb1\x44\xe3\xe5\xbb\x78\xfa\x71\xf4\xe3\x9c\xdd\xa9\x7c\xbc\x39"
- "\x39\xa1\xb2\xcd\x59\xe6\xa1\x59\xfa\x3c\x91\x57\x8d\x0d\xce\xce"
- "\x1a\xac\xdf\x01\xf8\xbd\x91\x3c\x9b\x53\x13\xe2\xd9\x9c\xc6\x30"
- "\xbc\x27\xc2\xe0\xfe\x1b\xbe\x4f\x85\xc1\x9d\xf9\x3c\xdd\x54\xba"
- "\x32\xc7\x1b\x99\xd7\xe3\x14\xc2\xf1\x78\x62\x28\xaf\xc7\x2d\x61"
- "\x70\xed\xf8\x4e\x1f\x5c\x3e\x8f\x67\x0d\x2e\x9f\xc7\xd7\xc5\x96"
- "\xcf\xe3\xb6\xb0\x7c\xf7\x7e\x7e\xbd\x7a\xfc\x78\x18\x3d\x0d\xf8"
- "\x6e\x8e\xac\x47\x8f\x9f\x89\xfa\xee\x97\xbf\x80\xed\x38\xb6\x23"
- "\x33\x9e\xc3\x2b\xc6\x93\x59\xd5\xb3\xc7\xfd\xe1\xf1\xef\xdf\x52"
- "\xf1\x4c\xa3\x9c\x83\xe3\xf9\x4d\x09\x37\xd7\x1a\x0d\xc7\x30\x61"
- "\xf1\x99\x3a\xed\x7b\x07\x39\x73\x5c\x6f\xff\xdc\x41\x6e\xff\xe6"
- "\xae\x52\xf3\x36\xcf\x56\x0a\xe7\x07\xf9\x83\xb5\x65\xc0\x5b\xeb"
- "\xa1\xb9\x79\x8a\x3f\x73\xa1\xff\x2b\xd4\xde\x17\xd7\xb3\x95\xd0"
- "\xa7\x5b\x97\x29\x73\x0e\xde\xbd\x78\x8f\x8f\x6c\x5f\xe7\x9e\x12"
- "\x4e\xc3\xd2\x06\x67\x74\xbb\x3b\xf7\x02\xfa\x1e\xb7\x92\x02\x8e"
- "\xfc\x18\x71\x5e\xe1\x8c\x7b\x66\x60\x78\x26\xb7\x75\xb7\x3c\x94"
- "\x39\x9b\xe9\x0d\x0b\xb7\x0a\xe7\xc8\x65\x0c\xef\xe1\xfc\x90\x66"
- "\x30\xb9\xe9\xfb\x8b\x94\xee\x65\x96\x46\x95\xe3\x26\x70\x7d\xac"
- "\xca\xf1\x44\x76\x54\xde\x7b\x63\x97\x23\xb3\x0e\xe5\xb8\x19\xbb"
- "\x1c\x99\xf2\xee\x0b\x61\x44\x59\x06\xf8\x1d\x99\x17\x50\x96\x9b"
- "\x92\xef\x91\xe1\x5d\x7a\x3f\xd5\x7e\x13\xfd\x7f\x23\xc9\xb4\x4b"
- "\x2b\x43\x72\x53\x70\x4f\xa4\x26\xd5\x52\xde\xc0\x3c\x9f\x98\x28"
- "\x9c\x43\x97\x7a\xe8\x89\x42\xbd\xbd\xd2\xc2\xb3\x14\x2d\xe0\x93"
- "\x91\xf9\x84\xf2\x20\xdd\x60\xf2\xd6\xeb\xa7\x9a\x67\x7a\x02\xf5"
- "\x3f\x33\x47\x6f\xd3\xd1\x9e\x7b\x75\x3e\x22\xae\x29\x2a\xce\x1f"
- "\x16\x77\x36\x22\x6e\x57\x7f\x78\x87\x1e\xfe\xc5\xe4\xf4\x64\x6a"
- "\x94\x9c\x20\x9f\x27\x7f\x1c\x59\xee\x27\xd3\x54\xf9\x20\xa3\x01"
- "\xbc\x7e\x32\x13\x32\xea\x8d\x2d\xa3\x27\x57\xc5\xd6\xb5\x27\xd5"
- "\x3d\xaa\x29\x14\x0b\x9f\x0b\xb2\xeb\x95\x3a\xa8\xc9\x69\xa0\x7c"
- "\x9e\x3c\xa9\xcb\xe7\x0b\x96\xd1\x1f\x55\xc6\xbe\xcb\x34\xef\x15"
- "\x55\xd6\x79\xff\x14\x89\x7b\x9e\x39\xb6\x2e\xce\x4b\x47\x39\xfb"
- "\x62\x97\x73\x5e\xd6\xe0\xba\x38\x8f\xe7\x0c\xfb\x06\xea\xe2\x3c"
- "\x9b\x4a\x43\xb1\xd2\xd4\x08\x67\xcc\x7c\x4e\xb0\x5f\xe4\xa1\x79"
- "\x1d\x3c\x4f\x17\x16\xde\x1a\xa9\x7f\xf3\xcc\x32\x1d\xf3\x2f\xa0"
- "\xfa\x31\x2c\x87\xcb\x56\x32\x7e\x9e\x4e\xf6\x38\xb3\xd2\xa2\x78"
- "\xf5\xc9\x65\xca\xfa\x71\xb7\xd1\x38\x5f\xf1\x2b\xbb\x24\x92\xa6"
- "\xac\xcc\xd8\xfc\xca\xca\x07\xbf\x3e\x89\xcd\xaf\xac\x8a\xc1\xf9"
- "\xc5\xeb\x9d\xe8\x93\x81\xfc\xca\x3a\x1e\xce\x2f\xbe\xfb\x95\xcb"
- "\x77\xbf\x05\xba\xd1\xbb\x56\x34\x28\x5b\x6e\x4e\x82\xae\xa8\x34"
- "\x5d\x9c\xe6\x62\x92\x5f\xe9\x89\x75\x2c\x25\x5c\xa3\xac\x56\xbd"
- "\xfe\x8f\xac\xa5\xa1\xa2\x77\x25\xaf\xd1\xe6\xbb\x24\xcc\x6e\xdb"
- "\x27\x2d\x7c\xe7\x24\x8f\x37\x46\xe6\x9b\x6d\x8d\x6d\x0b\xb2\x67"
- "\x82\xa7\xd5\x31\xc2\xf3\xd4\x98\x69\xf6\xbe\x48\x1b\x91\x5d\x1c"
- "\x29\x23\xf0\xcd\x28\x4f\x49\x37\x7c\x91\xe7\xf6\x32\xcb\x6e\x1f"
- "\x28\xb3\xf9\xdb\x95\xbc\xe6\x3f\x17\x45\x9f\x37\xb6\xbc\xe6\x27"
- "\x0c\x2e\xaf\xf9\x69\x83\xcb\x6b\x7e\x26\xcb\xcb\x43\xf3\x6d\x91"
- "\xed\xc6\xfc\xfc\xc8\xf2\x22\x5f\xa4\x13\xc6\x21\xa3\xf8\xfb\x8b"
- "\x96\x5b\x7f\xd8\xc6\xb1\xac\x1a\xe0\x5f\x81\xfe\xf1\x4c\xe3\x97"
- "\xc5\x31\x28\x6e\xf0\xd0\xb5\x63\xd0\xfb\x49\x12\xdb\xd0\xaf\xe4"
- "\xf5\x79\xf2\x9e\x68\x5a\xb0\x28\x68\x34\xcc\xc2\x6f\xe3\x65\x5a"
- "\x78\x57\xd0\x18\xe7\xe0\xb5\x64\x72\x6f\x9e\x9c\x9f\x58\x50\x18"
- "\x2e\x0b\x5e\x53\xc6\x63\xd1\x07\xd5\x38\xe7\x5f\x90\xfe\xaa\x92"
- "\x4b\xce\xcd\x48\x3e\x2e\xd8\x17\x5b\x2e\x0b\x1a\x21\x97\xbf\xc4"
- "\x96\xcb\x82\x53\x83\xcb\x65\x01\xf7\x49\xff\x32\xb0\x1e\x2d\xf0"
- "\x6a\xf5\x68\x0f\xa7\xb1\x6e\x62\x7f\x35\xa7\x80\x61\xf0\x1b\x75"
- "\x24\x67\x21\xc7\x4f\xea\xd2\xeb\x11\xa7\xc9\xe1\xfe\xbf\xcc\x5f"
- "\x83\xb1\x6a\x38\xc2\xf0\xe6\xe4\x24\x75\xc5\xaa\x27\x39\xeb\x18"
- "\x76\x72\x19\x25\x80\x87\xf9\x47\x19\xc7\x16\x22\xe0\xf8\x05\xc3"
- "\x71\x38\xdf\xed\x10\x06\xef\xd2\xe1\xe4\xb8\xa8\x82\xdd\xc7\xf7"
- "\xa2\x33\x5c\x14\x6e\xad\xfc\x43\x65\x3b\xc2\xf0\xf2\x1e\xf6\x48"
- "\x18\x8f\xaa\x8f\x0b\xd3\x22\xeb\x63\x8e\x3f\x52\x3f\x17\xf0\xfc"
- "\x44\x52\x10\x76\x0e\xbf\x73\xfb\x9c\x86\x59\x5f\x4d\xdd\x5c\x58"
- "\x11\x55\x37\xa1\x03\xdf\x19\xad\x74\x60\xe1\xf5\x48\x5a\x17\xee"
- "\x8f\xad\x03\x0b\x8f\x0d\xae\x03\x0b\x5b\x06\xd7\x81\x85\x17\x59"
- "\x07\x3c\xf4\x9d\xd4\xc8\xba\xb9\xd0\x17\x59\x76\xe4\x2b\xeb\x26"
- "\x25\x7f\x99\xba\x09\x5f\x68\xd4\x60\xf5\x50\xf3\xff\x0d\x7c\x5f"
- "\xdb\x97\xe0\x99\xba\x7f\x88\xbe\x73\x9c\xe7\x90\x60\xe3\x8b\x99"
- "\x87\xf5\xb2\x8f\xf6\x9d\x53\xe1\x7c\x3c\xa8\xfa\x5a\xf6\xcb\xf4"
- "\xd4\x13\xbc\x66\x4f\xf1\x33\x77\x58\x64\xf9\xbf\x73\x31\x36\x3f"
- "\xbf\xc3\xf3\x14\xf6\xd8\xfc\x7c\xca\x3c\x38\x3f\x9f\x9a\xc8\x7b"
- "\xc0\x07\xd6\xa9\xa7\xf8\xde\xf8\x04\xbd\x6d\xba\x46\x4f\x1d\xfd"
- "\x62\xed\xd3\x53\x95\x91\xed\xd3\x53\x85\x5f\xbe\x7d\x7a\xaa\x25"
- "\x76\xfb\xf4\x54\x7b\xec\xf6\xe9\x29\xaf\xaa\x0f\xb9\xe9\x91\xf5"
- "\x21\x37\x21\x52\x27\xc0\xbb\xaf\xac\x7d\xca\xb5\x45\xd5\x81\x43"
- "\xc8\xef\x26\x7c\x8a\x57\x95\xdc\x16\xfd\x32\x92\xc6\xdc\x9a\xd8"
- "\x72\xcb\x3d\x01\xb9\x1d\x8a\x2d\xb7\xdc\x33\x83\xcb\x2d\xb7\x03"
- "\x72\x3b\x34\x50\x6e\xb9\x81\x2f\xef\x53\x2c\xca\x88\x94\xd9\x22"
- "\xcb\x97\x97\xd9\xa2\x8a\xd8\x32\x5b\xb4\x3f\xb6\xcc\x16\x1d\x53"
- "\x32\x5b\x74\x31\x52\x66\x8b\x4e\x45\xca\x0c\x7c\xfb\xca\x64\xb6"
- "\x78\x62\x94\xcc\x36\x5f\xa6\xc5\x3f\x81\xcc\xce\x2b\x99\x2d\x79"
- "\x39\x92\xc6\xc5\x39\xb1\x65\xb6\x78\x1d\x64\xb6\x39\xb6\xcc\x16"
- "\x57\x0e\x2e\xb3\xc5\xb5\x90\xd9\xe6\x81\x32\x5b\xdc\xf4\xe5\x65"
- "\xb6\xb8\x23\x52\x66\x8b\xcf\x7e\x79\x99\x2d\x49\x8f\x2d\xb3\x25"
- "\x99\xb1\x65\xb6\x24\x5f\xc9\x6c\x89\x2b\x52\x66\x4b\xca\x22\x65"
- "\x06\xbe\xfd\x1b\x65\x06\xf9\x38\xd4\x7a\xdd\x25\x9f\x76\xcb\x31"
- "\xed\x25\x9d\x1e\xca\x6b\x52\x73\x02\x79\x52\x77\x34\x19\xbe\x0f"
- "\x98\x8b\x03\xdb\xee\x3c\x93\x16\xb6\x62\xa0\x1c\xf2\xac\x68\x57"
- "\xbb\x5a\x2b\xe5\xba\x2e\x25\x43\xe6\x39\xe0\xd4\x18\x59\x5e\x26"
- "\xa7\x85\x8c\x85\xdb\x1f\x20\x6e\x8b\x01\xef\x63\x3c\x7c\x5e\x49"
- "\x14\xae\xd2\x2f\xe3\x97\x0d\xbe\xc6\xfc\x59\x47\x4b\xd5\x34\xe0"
- "\x7b\x7a\xb7\xd2\xd5\xbc\x68\xff\xb7\x01\x71\xcb\x95\x9e\x2e\x8d"
- "\x1a\x33\xc9\x1b\xc4\xff\x7d\x9a\xfd\xdf\x86\xd8\x7a\xfa\xf4\x6d"
- "\xfc\xdf\xa7\xd9\xff\x6d\x08\xeb\xaf\xa6\xac\x09\x78\xa2\xfa\xab"
- "\x4f\x17\x26\xf9\x94\xee\x48\x3f\xf6\xf0\xb3\x8e\x1e\xe7\xd3\xfb"
- "\xa3\x68\x86\x6c\x9e\x19\xa6\xd1\x1c\x25\x9f\xa7\x8f\x0d\x42\xf3"
- "\x29\xd0\xfc\xfe\x20\x34\xb7\xdf\x86\x66\x6e\x9b\xdf\x1f\x58\xb7"
- "\x9e\x49\xd4\xf4\x20\x46\xbf\xfc\x99\xf4\xd8\xf2\x7f\x26\x4a\xfe"
- "\x94\x5f\x51\x29\xbc\x32\x7d\x24\x5c\x71\x38\x1c\xaf\xd5\x67\x58"
- "\xd6\x91\x18\xb0\x35\xd1\x38\x07\x81\x3b\x35\x40\xf7\x78\x6f\x41"
- "\x4c\xdd\x7b\xa6\x53\xd5\xc7\xa5\x99\x91\xf5\x71\x29\x45\xd6\xc7"
- "\xa7\x8f\x45\xa6\x5b\x6a\x8d\x8c\xcf\xf3\x7e\x75\x36\x76\xa9\x2b"
- "\x4a\x07\x3e\xb8\x4c\xcb\x46\x28\x1d\x58\x56\x14\x45\xc7\xf1\xd8"
- "\x3a\xb0\xb4\x05\xe5\xff\x20\xb6\x0e\x2c\xbd\x38\xb8\x0e\x2c\xe5"
- "\x35\xc4\x1f\x84\xeb\xed\xd2\xca\xcc\xa1\x91\x30\xcb\xc6\xc5\xb6"
- "\x79\xcb\x66\xc4\x1e\xd7\x59\x96\xab\x78\xbc\x6c\x6f\x24\x8f\x97"
- "\x15\x46\xf2\x10\x65\xf9\xb7\xf3\xb0\xff\xdc\xb0\x1e\xe7\xb2\xe8"
- "\xfa\xef\xbe\x4c\xcb\xb5\xfa\xff\xec\xa2\x28\x1a\xb5\xfe\x4f\xac"
- "\xb1\xac\xe5\x89\xe0\xa5\x3b\x36\x2f\x97\xa7\xc7\x2e\xf3\xf2\x4c"
- "\xb4\x41\xee\xe0\x80\xba\xb4\x3c\x1f\xe1\x4b\xe5\x1d\x92\x37\xc9"
- "\x5c\x8f\xf0\xa5\x01\x4a\x90\xed\x55\x7f\xbb\xb4\xbc\x92\xc7\xc8"
- "\xe5\x18\x33\xf4\x37\x69\x1c\xf1\xfa\x6b\x33\xd3\xb5\xb6\x32\x7a"
- "\x4e\x74\xb9\x1c\xff\xe0\x75\x2c\xbc\xaf\x26\xc9\x46\x79\x6e\x5f"
- "\x80\x74\x7d\x67\xf8\x28\xdc\xed\x5c\x2f\x18\x5e\x87\x55\x63\x9d"
- "\x8e\x28\xdb\xf4\x2c\xc5\x96\xf1\xb3\x96\xc1\x75\xe7\xd9\x19\x4a"
- "\xce\xcf\x16\x47\xca\xf9\xd9\xdc\xa0\x73\xe4\x32\x2e\x2b\x74\xe0"
- "\x4b\xd5\x13\x9e\x3b\x1d\xd4\xde\xef\x59\xd9\x5e\x56\x45\xf7\x5c"
- "\xa1\x67\xcf\xcb\xfc\x8c\xc2\x9f\xb4\xdb\x40\xad\xd2\x06\xac\x98"
- "\x20\xe9\x04\xcc\xda\x00\x19\xc5\x9e\x0d\xed\x1c\xd7\xe0\x14\x7e"
- "\x79\x47\xa6\x53\x9c\xe7\xf3\x7e\xa0\x0b\xa3\x2e\xd1\xb3\x1f\x47"
- "\xa4\x47\xab\xe7\x56\x38\xd2\xd4\xf8\xfe\x0a\xab\x3e\x0e\x3f\xd8"
- "\xf8\x3e\x60\xb2\xf4\x75\xbf\x6a\x2e\x6c\xc5\xcc\x41\xdb\x65\xd0"
- "\xc4\x7b\xc7\x99\xa6\xdb\xdb\x81\x15\xb5\xba\xfe\xaa\xb9\xb9\x15"
- "\xc7\x43\x7b\x5b\x56\x9c\x44\xdc\xaa\xdb\x8c\xe7\x86\xd5\x83\x15"
- "\x9e\x70\x3c\xea\xec\xbc\x15\x3e\x7d\x7f\x4a\x8f\x33\x9f\x3e\x07"
- "\x97\x46\x4f\x7e\x7a\x24\x3d\xf9\x33\xe1\x5b\xae\xd2\x70\x64\x7d"
- "\x0e\x8e\x54\xf7\xb1\x59\x34\x39\x48\x71\x57\xe8\xf9\xc3\x35\xbc"
- "\x46\xa7\xae\x93\x12\x03\x64\x52\x7d\xbb\xfc\xb7\x79\x6f\x08\xf7"
- "\x0d\xdd\x81\xb9\x2d\x3c\x07\x27\xd7\x10\x58\xe6\xb6\x9c\xb3\xf5"
- "\x69\x67\x9b\xe5\xff\x1d\xf3\xf4\x5c\xf1\x27\x2d\x75\x47\x44\xe7"
- "\x51\x79\xa6\x55\x7e\x44\xff\x6f\x3f\xaf\xff\xe1\x75\x18\x55\x34"
- "\xf7\x32\x3d\xf7\x84\xaa\xeb\xcf\x47\xf9\xa4\xf9\x83\xf4\xff\xf2"
- "\xb9\xff\x37\x37\x76\x3d\x7f\xee\x36\xfd\xbf\xe7\xb8\xff\x37\x37"
- "\xbc\xdd\x54\xf3\x3c\xcf\x65\x85\xfb\xa4\x7c\xee\x94\xf5\x45\xf6"
- "\x33\x9f\xfb\xcf\x0f\xd7\x90\x39\xc0\x73\xda\xa8\x9b\xee\xce\x56"
- "\xae\xaf\xe6\x73\xde\x66\x3e\x87\x21\x81\xef\xf6\x56\x6d\x19\xd7"
- "\xd7\xe7\xe4\x78\x61\x52\x40\xd5\x45\xbb\x4d\x78\x27\x76\x40\x87"
- "\x36\x17\xeb\xb8\x2a\x76\x15\xab\x7d\x1f\x23\x3b\x68\xa8\xbb\x53"
- "\xb6\x8b\x06\xf6\x57\xa5\xdf\x1a\xb8\x4e\x8c\xf7\x74\xe5\x39\x62"
- "\xbc\xc1\xfe\x76\x52\xe2\xee\xe0\x3a\xce\x38\x19\x77\x1b\xe0\x18"
- "\x2f\xc3\xe9\xe5\x50\x7b\x63\x9e\x4f\x0c\x2f\xbb\x1c\x7f\x41\xde"
- "\x08\x5f\xc8\xe3\x2a\x6e\x4e\x67\x5f\x29\x26\x77\xf0\x9c\xd9\x27"
- "\x2d\xc2\xbe\x41\x4c\xde\xc2\x63\x62\xcf\xbf\xcd\xe9\xde\xff\xb3"
- "\x27\xbe\x62\x3c\x25\x68\x61\xcb\x5a\xad\x7e\xe8\xdb\xf3\xb5\x91"
- "\x36\xe2\xf9\x28\xff\x37\x5f\xf6\x33\xf1\x2e\xe5\xf5\x89\xda\xfa"
- "\x55\xb6\x07\xc2\x1d\xe8\x91\xfa\x71\xbb\x35\x15\x3c\x27\xcd\x6b"
- "\xa2\xd4\xb9\x6a\xcf\x7b\xa2\xc6\xde\xbc\x07\xe5\xba\x9a\x3f\x21"
- "\xdf\x95\x1b\x95\x8e\xac\xda\x18\x29\xd3\x95\x64\xbf\xca\x73\x41"
- "\xaa\x3d\x58\x13\x88\xb6\x8f\x2b\xad\xba\xef\x16\x15\x3e\x53\x6f"
- "\x0f\xac\x9b\x24\xde\xa8\x76\x66\xa5\xf4\xff\xfb\x06\xb4\x0b\x2b"
- "\xcb\x50\xbe\x08\x9d\x6c\x93\x3a\xb4\x72\xdf\x39\x1f\xf4\x66\x0b"
- "\xeb\xff\x2a\x5e\xfb\xb2\x9b\xf7\x1c\xe2\x7b\xe8\x35\x5a\xd9\xdc"
- "\xe7\xa4\x84\x73\x5e\xb9\xa7\xca\x0c\x1d\x91\x7a\xcb\xed\xc6\x14"
- "\xb5\x1e\xc9\x17\x95\xc7\x05\x9d\xe7\x0c\xd3\xb6\xe5\x4f\xa4\xd6"
- "\x53\xb0\x2e\xac\x3c\xce\x6b\x33\x46\x76\xd1\x50\xc6\xa5\xeb\x90"
- "\x3b\xd0\x4e\x6d\x81\xe8\x3e\xcf\xaa\x71\xb1\xcb\xbe\x8a\xdb\xff"
- "\x6a\x0f\xad\xda\x1f\x29\xdb\x55\xb2\xfd\xd7\xe7\x75\x3c\xe0\x41"
- "\x54\xba\xd2\x48\xd9\xaf\x94\xf9\x0d\xba\xc6\xc7\xf5\xec\x5e\xf4"
- "\x67\xd6\xfa\xe4\x7a\xaf\x55\xa8\xff\xcf\x0f\x7a\xff\xad\xdc\x7f"
- "\x62\x7e\x76\x6f\x10\xb0\xda\xba\x60\xd8\xad\x55\xde\x88\x31\xa3"
- "\x31\x72\xcc\x68\xed\x65\x5a\xad\xcd\xfd\xac\x79\x24\x92\xbe\xd5"
- "\x89\x83\xfb\x06\xab\x79\xfe\x67\x6d\x6c\x9b\xb1\x3a\x2b\xb6\x6f"
- "\xb0\x7a\x95\x66\x17\xd6\x8a\xe4\x68\x3d\x58\x6d\x83\x8c\x65\x1a"
- "\xbd\x0f\xcb\x63\xa1\x83\xf7\x61\x57\x1f\xef\xef\xc3\x6e\x61\x7b"
- "\xb0\xda\xd5\xdf\x87\xf5\xc6\xea\xc3\x7a\x62\xc8\x73\x75\x57\x6c"
- "\x79\xae\x31\xc5\xee\xc3\xae\x19\xa7\xda\xf9\x35\x79\x91\x72\x5e"
- "\x33\x23\x34\x27\xbc\x3a\xf1\xab\xf3\x87\xd7\x34\x0e\xf4\x87\xd7"
- "\xde\xad\x64\xb5\x76\x75\x14\x6d\xcd\xb1\x6d\xfb\x9a\xf3\x83\xfb"
- "\xc3\x6b\xba\x06\xb7\xed\x6b\x13\x06\xfa\xc3\xd6\x21\x51\x30\x13"
- "\xfb\x7d\xa5\x08\xdf\x6c\x6d\x96\xe2\xd3\x5a\xf6\xe7\xe2\xc2\xe0"
- "\x57\x45\xea\x3b\x68\x06\x3e\xd8\xb6\x2b\x6c\xd3\x74\x9d\x19\x8c"
- "\x27\x7c\xf6\xd2\xfd\x35\x34\x0c\x75\xe0\x83\x1e\xe7\xda\x7e\xfd"
- "\xe7\x75\x7c\x9c\x0f\xdb\xc8\x41\xd7\xd3\x19\x75\xfa\x24\x1d\x1d"
- "\xb7\x9b\x2f\x8d\xb3\x50\xde\x1b\x03\xf8\xb1\x4e\xfa\x7f\x8c\xe3"
- "\xf6\x32\x5b\xb7\x2c\xaa\x8e\xf9\xd4\x3a\xdc\x82\xf1\x4a\x6e\x05"
- "\x51\x7d\xd9\x75\x65\x72\x4f\xdf\xa0\xf6\x76\x9d\x2b\xb6\x8e\xae"
- "\x3b\xde\x6f\x6f\xb7\x30\xde\x75\x1f\x45\xc5\x9f\x51\x32\x28\xb0"
- "\x06\x93\xc3\xc7\xba\xd7\x79\x22\x6d\xd2\xba\x33\x91\xe9\x0a\xa2"
- "\xfa\x7f\xeb\xca\x38\xfe\x8b\xb5\x37\x05\x79\x83\xb7\x37\x05\x1f"
- "\xaa\xf2\xaf\x8f\x9a\x5f\x2e\x28\xbb\x7d\x7b\x53\x30\x48\xf9\x0b"
- "\x8e\x47\xb6\x37\xeb\xa3\xe6\xe8\x0b\xce\xc4\x6e\x6f\x0a\x3c\xba"
- "\x9d\x51\x76\x63\xfd\x63\x5f\xcc\xde\xac\xb7\x44\xda\x9b\xf5\xf4"
- "\x79\xf6\xe6\xf4\x00\x7b\xb3\x7e\x55\x52\x5d\xac\xb2\xac\xaf\x88"
- "\x6d\x6f\xd6\xef\x57\x32\x5c\xdf\x11\x69\x6f\xd6\x1f\x8b\x94\x61"
- "\x41\x94\x0c\xd7\x47\xcd\x7f\x17\x94\xfd\xaf\xda\xa4\xb8\xb8\x38"
- "\x63\x9c\xc1\x68\x88\x23\xbe\xa4\xca\x40\x43\xe3\x4c\x71\xf1\x78"
- "\x86\x68\xef\xa1\xc6\x38\xa3\x09\x4f\xbc\xf6\x1e\x12\xf5\x3d\x94"
- "\xd3\xe2\x31\x69\xef\xf8\xa8\xef\x21\x9f\x13\x3f\x54\xcb\x57\xcf"
- "\xdf\x14\xf5\x1d\xff\x39\xf1\x43\xfe\x8d\xe9\x69\xc0\x77\xe4\x3e"
- "\xc8\x85\x9b\xb6\x16\x94\x96\x14\xca\x75\xed\x45\xd6\x82\x17\x5e"
- "\x28\x2a\x2f\xb7\x56\x6c\xb6\x3e\xf9\xc4\x33\xd3\x66\x59\xd5\xf2"
- "\xf8\xd2\x39\x13\x0a\x87\xd3\xa2\x6d\x5b\x38\x62\xd1\xd2\x85\xf9"
- "\xd6\xbc\x27\x9f\x88\x8c\xd4\xd1\xc8\x65\xf0\xb7\xc3\x12\x56\xf7"
- "\x32\x5f\x1f\x43\xb4\xff\x88\xb4\x3b\x1d\xbc\xf7\x5c\xf5\x27\x4a"
- "\x9e\x38\xcb\xfb\x97\x6f\xd9\x05\xef\xab\xb8\x44\x85\x7f\xe5\x42"
- "\x4c\x6a\x74\x50\xd9\x7a\x3e\x4f\xa5\xc8\x20\x7e\xe5\x25\xeb\x77"
- "\xc8\x78\x89\x36\x3d\xdd\x9a\x03\x58\x7c\xbb\x3d\x01\xb2\xda\xd9"
- "\xb7\x2d\xfe\x14\x71\x06\xf1\x78\x10\x61\x3e\x6d\x7f\x7e\xb1\x41"
- "\x86\xfd\xca\xa1\xc3\x25\x5d\xa6\xa2\x1f\x8b\x5f\x09\xf9\xcd\x67"
- "\xd6\x28\xb8\xa2\xed\xc2\x58\x38\x93\xed\x42\x5d\x0a\x99\x78\x5d"
- "\xf6\xdb\x29\x94\xf0\xf6\x18\x3e\xcb\xb6\xa8\x54\x5f\x97\xfd\x3a"
- "\xbe\x3d\xb4\x29\x8f\xf3\x66\xd8\xa0\xb1\x70\x3d\xc3\xd7\x47\xc2"
- "\xd7\x85\xd6\x71\x17\x95\x1a\x01\xb7\xe4\x23\x4a\x4a\xea\x13\x9f"
- "\xfa\x53\x72\x9b\x27\xe7\xc0\x4f\x83\x28\xce\x06\x1c\xa4\xf6\x46"
- "\x15\xfd\x75\x7b\x9f\x08\xf0\x99\x09\x8b\xba\xec\xe2\xd0\x46\x32"
- "\xa1\x3e\x1b\x5a\xb6\xf0\x5e\x8a\xa2\xb3\x0d\x45\x64\x42\xf9\xc7"
- "\x5d\xa1\x17\x03\xd6\xc5\xf0\x1b\x17\x91\xe9\x77\x36\xde\xef\xba"
- "\xe2\x0f\x07\xff\x40\xa6\xbf\xbf\xe5\x30\xde\x12\x16\xaa\xac\x10"
- "\x9d\x82\xcf\xb7\xf6\x09\x3f\xaf\xb7\x3d\xbb\xae\x8f\x61\x7e\xd3"
- "\x63\xb7\x50\x5b\x85\x8f\x76\x5d\x14\xfe\x7d\x7f\x50\xe7\x55\x9c"
- "\xeb\xf2\xf1\xfe\xd9\x84\x5d\x8b\x28\xee\x72\x3e\x19\xcf\x15\xd7"
- "\x92\x7b\x95\x8f\x2a\x2f\x8a\xce\xb3\xeb\xfe\x4a\x6d\xc5\x4d\xb4"
- "\xb6\x9d\x8c\x67\x3b\x3e\x24\x79\x46\x73\x75\x0b\xef\xbb\xb5\xec"
- "\x2a\xe1\xb0\xeb\xb4\x63\x17\x8d\xd8\xf1\x47\xee\x07\xb5\x23\x9f"
- "\xab\xf4\xfc\x05\x32\x00\x9f\x71\xe7\x87\x64\xd9\xf9\x1c\xef\x33"
- "\xcf\xa4\xba\x2a\xb2\x08\x7b\x7a\xe2\x2d\x7b\xba\xf9\x96\x48\x4f"
- "\xe9\xb1\xa7\xa7\xb6\x95\x01\xbe\xe3\x97\x34\xb2\x9d\x52\x7f\x75"
- "\xa5\xdd\x58\xfb\x19\x8d\xe3\x32\x5d\x46\xd9\xea\x3e\x03\x7c\xf5"
- "\x9b\x4d\x41\xa4\x0d\x4f\x13\x48\x7e\xf3\x8c\x3b\xdf\x4f\x41\xe0"
- "\xaa\xbd\x45\xe3\xea\x6e\x91\x25\x78\xf8\xcd\x26\x4e\xd7\x45\x2f"
- "\xdd\x74\x9f\x25\xaa\xdc\x25\xfa\x7a\xab\x97\x35\xc3\x1e\x0e\x7d"
- "\x7f\x7d\xb3\xc9\x7d\xb6\x8b\xce\xf9\x6e\x51\x1b\xfd\x89\xdc\xb6"
- "\xbf\xb5\xfc\xfd\xfa\xe6\x78\xf8\x93\x86\x96\x1d\xbc\x06\x5e\xe9"
- "\x8e\xfd\x1c\x9f\x9f\xe7\xa0\x43\x55\x94\x58\xb6\x83\x86\x5e\x41"
- "\xb8\xb4\x3d\xae\x05\xb0\x81\x7f\x6b\xd9\x21\xf7\x83\x6f\xca\xab"
- "\x3a\x47\x71\x6d\xbe\x5a\x2e\xbf\xb1\x2f\xa5\x85\xdc\xbe\xf3\xe4"
- "\x2e\xfb\x4b\x4b\xd0\xfc\x41\xe7\xfe\x20\x25\xfc\xe4\xc6\x79\xa3"
- "\xdb\x74\x83\xdc\xf9\x3e\xfa\x00\x79\x8b\xea\x16\xf6\xa3\x32\xdb"
- "\x7c\x7e\x3e\x7f\x27\x43\x74\x5b\x86\x1f\xda\x42\x13\xeb\x3f\xa3"
- "\xb4\xa3\x9f\x51\xba\xe8\x49\x37\xf2\x1e\x6f\x3e\x2f\xed\x28\xde"
- "\x89\xe8\x83\xa1\xec\x72\xaf\xb7\x48\xd6\xf6\x7a\xf7\xa6\x53\xc3"
- "\xad\xd0\x5e\xef\x5b\xdd\xa1\xbd\xde\xd0\xa9\x32\xde\xef\xed\xa1"
- "\x97\x4c\x49\x67\x69\xe8\x25\x2a\x4a\x67\xfd\x3e\x74\x8d\x4c\x7b"
- "\xae\x11\x4d\x76\x18\xb9\x9f\x69\x82\xee\xff\xd5\x0d\xd9\xf0\xef"
- "\x4b\x54\x5c\x87\x77\x22\x1e\xf4\xe7\x8a\xe5\x59\x15\x1d\x9a\x1e"
- "\x23\xcc\x88\xb0\x57\xf1\x8e\xc3\x7b\x97\xbd\x4e\x78\x91\x17\x9f"
- "\x41\x33\x9c\xf5\x59\xdb\x5f\xee\xea\x71\x16\x57\x78\xe8\x70\xa5"
- "\xae\xd7\xca\xbe\x17\x95\x7d\x70\xe9\x2a\x9f\xa3\xee\x95\x74\xf5"
- "\x16\x1b\xf8\x4c\x75\x2d\x9c\x69\xf8\x90\xf3\x45\xfe\x2d\x78\x27"
- "\xa9\x3e\x68\xf1\x32\x3d\x6d\x77\x6f\x31\xe7\xf9\x47\x84\x0b\x3d"
- "\x1c\xe5\x36\x71\xdc\xcf\x2f\x5d\x35\x2a\x98\x74\x23\x70\xfa\x35"
- "\xfc\xa8\xfb\x45\xa9\x5c\xc7\xbb\x8d\x49\xe2\xf4\xba\x19\x54\x77"
- "\x44\x9c\x3d\x7a\x44\xb4\xaa\xba\x57\x62\xf1\x50\x75\x0b\xd3\x88"
- "\x36\xbc\x75\x3f\xe2\x4e\x5b\x89\x98\x2f\xad\x85\xbc\xbe\xb4\x64"
- "\xa6\x87\xee\x48\x0b\x2f\x83\x70\xbe\x60\xe1\x76\xf4\xa7\x55\x67"
- "\xe2\x61\x03\x2c\x6d\x1d\x5d\xf4\xf7\xb7\x3a\xe3\xed\xbf\x25\xa3"
- "\x3b\x70\x89\xa6\xa4\x92\x85\xc7\x64\x1a\x8e\x08\x0f\xde\x9d\x78"
- "\xba\xa0\x2f\x77\x5f\xa1\x92\x57\x1f\x4e\xa5\xd4\xdf\xdb\x48\xb3"
- "\x4f\x25\x47\xc3\xec\xd3\x84\x73\x9e\xe6\x30\xdb\xb4\xf1\x8f\x03"
- "\x6d\x53\xe9\x3f\x2b\xdb\x84\xba\x2f\x6d\x51\x9f\x47\x0b\xff\x65"
- "\x54\xb8\xb6\x7f\xa5\xf4\xdd\xa8\x70\xbf\x16\x7e\x20\x2a\xdc\xab"
- "\xc2\x37\x9c\xd3\x6d\x5f\x1b\xd3\xb1\x8d\x6d\xdf\x86\x9f\xb1\xed"
- "\x6b\x5b\xa7\xd9\x3e\x69\x7f\x36\xbc\x29\x7e\x04\x5b\xb4\x95\xed"
- "\xcd\x86\x8d\x4c\xbf\xf8\x15\xe9\xb4\x0f\x43\xd8\x24\x0e\x73\xfd"
- "\x89\x4c\x78\x74\xbb\x67\x67\xbb\xc7\x36\x8f\x6d\xdf\x3b\x63\x44"
- "\xfb\x3b\x47\xc4\x85\x3a\x79\x2e\xf4\x77\xfb\xed\xdf\x0f\x10\xb6"
- "\x1f\x61\x3f\x40\x3c\xdb\x41\xe6\xc9\xb9\xfc\x66\x1e\x1b\xe8\x10"
- "\xae\x15\xe7\x83\xc6\x0c\x3a\x08\x79\xf3\xf9\x57\x7b\xc1\xdf\x24"
- "\x03\x95\xb9\x2b\x7c\x72\x1f\x0a\x9f\x41\xde\x56\xd1\xc1\xf5\x6e"
- "\xcc\x9e\x20\x8f\x53\xfc\x95\xaa\x7c\xe2\x0a\xef\x55\x61\x1a\xd6"
- "\x6e\xff\x0e\x9f\xa5\x6d\x68\x2d\x26\xe2\x73\x09\xd8\x66\x83\x16"
- "\x93\x0b\x34\xa9\xf3\x7f\x37\xa4\xc1\x93\xc9\x51\xb2\xde\x94\xc7"
- "\xe7\xf5\x5f\xa2\xef\x16\x0b\x27\xec\x23\xca\x96\xd4\xe7\x20\x3e"
- "\x9b\x05\x75\x8c\xcf\xd3\x2a\x7e\xc7\x18\x2c\x76\xe9\xe7\xb3\xf0"
- "\xdd\x0d\x80\x71\xb7\xfb\x89\x69\xf6\xd0\x77\x4f\x9e\xab\x6c\xe6"
- "\xf4\xf9\xcc\x1b\xe1\xb4\xeb\x38\x0c\x12\x87\x51\x8e\xdd\x16\x7b"
- "\x68\x43\x8e\xf2\x6f\x96\x35\x9f\x5b\xe5\x25\xb6\xfb\xee\x4e\xe0"
- "\xa8\xbc\xa4\x70\x00\x97\x40\x1b\x10\x11\xa7\xe1\x1f\xb1\x4b\x7c"
- "\x0a\xfc\x69\x2c\x2f\x3e\xa7\x8b\xd7\x29\x81\x2f\x89\x7c\x56\x83"
- "\xf2\x43\xbf\xfb\x93\x86\x3f\x11\x69\x67\x8d\x41\xdf\xbe\x7b\x82"
- "\xcf\xf2\xe2\xf3\xc5\x6e\x77\xb6\x18\x78\x94\xa6\x9f\x2f\x16\xdc"
- "\xf6\xd5\x9e\x2d\x06\xdc\x96\x7a\xa3\x68\x02\xfd\x27\xf8\x7c\x31"
- "\xd0\x9f\xc8\x7a\xa8\x95\xa9\xe9\xcd\xe7\x99\xe7\x25\x3e\x0e\x3b"
- "\xe4\x14\x67\x74\xf9\x73\x79\xb9\x2c\x88\x6b\x57\xfe\xa1\x38\xef"
- "\xa1\xd2\x26\x8e\x47\x58\x2b\xc3\x4f\x81\x1d\x73\xa3\x0d\x7b\xff"
- "\x52\x9f\xf1\xd0\x0e\x32\x29\x9b\xb6\xf1\xb7\x9c\x5e\xd9\xb4\x8d"
- "\x8e\x90\x4d\xdb\xf8\x8a\xb2\x69\x8a\xc7\xca\xa6\x6d\x2c\x51\x36"
- "\x6d\x63\x81\x5c\x4f\x04\x9b\xc6\x71\x6c\xd7\x74\x9b\x76\x74\x8c"
- "\x38\xc3\xb6\xa3\xc7\xb9\x31\x4f\xb7\x6d\x07\x10\xc6\xb6\x83\x69"
- "\x54\x76\x6a\xc3\x71\xf1\x3f\xd2\x49\xad\xd7\xe4\xdf\xc5\x7c\x7e"
- "\x46\xa7\xf6\x1b\x72\xd9\xf8\x6b\x65\xe3\x36\x1e\x0b\xd9\xb8\x8d"
- "\xe9\xa1\xb4\x6c\xe3\x36\xfe\x67\x65\xe3\x54\x78\xc3\xf3\x6c\xe3"
- "\x36\x1c\x67\x1e\x68\xf8\x8d\x3c\x8f\xa6\xc1\x83\x8f\x25\x4d\xe1"
- "\x36\x2e\xb2\x7e\x6d\x0c\xe8\x36\x8e\x6d\x5b\x8f\x73\x53\xa2\x87"
- "\x86\xcb\xf3\x51\xb8\x9e\xd5\x80\xe7\x7a\xbd\x63\x19\x70\x99\xf9"
- "\x5c\x7e\xe6\xdb\xbc\xab\x34\x54\x3b\xb7\x46\x2b\xf7\xa6\x1c\x7d"
- "\x8f\xa6\x87\x36\x0e\x3c\xd3\x8c\x42\xe7\x92\x41\xd6\xf7\xf2\x79"
- "\x8e\x6e\xc7\x25\x72\xd7\x0a\x47\x5b\xe0\x22\x05\xf7\x6c\xf8\x88"
- "\xe5\x8a\xfe\xc6\xb7\xf9\xcd\x76\x07\xed\xe8\xeb\x6b\x7d\x72\xfc"
- "\xfe\xa3\x43\x46\xc4\xd9\x22\xe2\x7e\xcc\x79\xf0\xb8\x22\x7e\x97"
- "\x0d\x36\x8e\xf0\x25\xf2\xba\x3e\x78\x5e\x9b\x93\x65\x5e\xf0\xa5"
- "\xd0\xef\x49\xbe\x46\x9b\xe4\x1c\x9a\x3c\x93\x39\x26\xae\xcd\x4f"
- "\x68\xf1\x71\x83\xc4\x17\x7c\x4e\xfa\xdd\x9f\x93\xfe\x5d\xb6\x41"
- "\xbc\x1f\xaf\xcf\x19\x89\x67\x64\x40\x87\xbb\xc2\x70\xbf\xd5\xe6"
- "\x41\x3e\xb2\x8f\x97\xfd\x32\x8b\x8e\x93\xf5\xee\x20\xe0\xe4\xf9"
- "\xb5\xb0\x91\x59\xdb\x89\xcf\x0e\x0e\x4b\x5b\x16\x1f\xe2\xef\xe6"
- "\xe6\xdb\x8c\xd3\x24\xba\x6b\x49\xde\xfd\x72\x1a\xbe\x28\xef\xa5"
- "\xa9\xe9\x9f\x7b\x28\x5b\x05\x7b\xb9\x4e\xee\x5b\x53\xfb\x76\xbb"
- "\x60\xdf\xee\xe5\x33\x36\xd9\xaf\xd4\xf6\x5a\xdc\x09\xbb\x9c\xc2"
- "\xe7\xb0\xf0\x78\xf5\xda\xbe\x3c\xe3\x69\x79\x26\x7e\x59\xad\x9e"
- "\x76\xb0\xb1\x3d\xce\x57\xcb\x53\xee\x43\x42\x9a\xb3\x7a\x1a\xc6"
- "\xcd\x7b\x6f\xd0\x1e\xdf\x2b\xcf\x37\x0b\x74\xb1\x0d\xbc\x13\x3e"
- "\x68\x8a\xca\x67\x1d\xa9\x7c\x5e\x46\xbd\xd9\x74\xf6\x76\xfb\x9c"
- "\x06\x2f\xdf\xcb\xb3\xbf\x7c\xf9\x48\x2b\xdf\xcb\xb6\xcf\x29\xdf"
- "\xed\xf2\x3d\xf9\xe5\xf3\x35\xeb\xf9\x7a\xbf\x3c\x5f\xb7\xa4\x7d"
- "\x71\xbe\x66\x68\x7c\xdd\x92\xff\x39\x7c\x8d\x95\xcf\xfe\x2f\x9e"
- "\x8f\x55\xcf\xa7\x25\x56\x3e\x24\xff\x06\x3d\xaf\x27\x41\xbf\x7b"
- "\x85\xef\x21\x52\x77\x22\x94\x27\x84\xdf\x31\xa5\xee\x27\x2a\x1f"
- "\xa7\xdf\x31\x15\xda\xc7\x55\xfe\xd8\xda\x46\x6e\xd7\x45\xd0\x43"
- "\xe5\xb3\x79\xac\x2d\x6b\x97\x3a\x1f\x50\x4b\x93\xf7\x39\x77\x5b"
- "\x99\xf8\x2c\x76\xce\x5b\x08\x79\x16\x8b\x4f\x9d\xb3\x57\x7e\x98"
- "\xf7\xe4\xa9\x35\x3b\xe5\x2d\xaa\xfe\x97\xd7\x79\x68\x8b\x3a\x73"
- "\xaa\x7a\xd9\xef\xbb\xed\x1a\xfc\x58\x6e\x93\xfa\x61\x5a\x74\x98"
- "\x98\x63\x7e\xd5\x35\x8d\xc7\xaa\x32\x22\xf6\x0f\x66\x6f\xd9\xb2"
- "\x79\xcb\x2c\x6b\xf9\xc6\xf5\x93\xca\x2b\x0a\x2a\x5e\x29\x97\x1b"
- "\xcd\x87\x13\x02\xac\x15\x25\x1b\x8b\x36\xbf\x52\x91\xbe\xad\xa0"
- "\x44\x6d\x4c\x7f\x10\x80\xe1\x40\x14\x71\x1f\x89\x05\x36\xe4\xbc"
- "\x30\xca\x33\x24\xba\xb8\x4c\x7c\x96\x88\xbe\xef\xb6\xd5\x42\xe4"
- "\x73\xb2\xcd\xa9\x28\xf4\x50\x7e\x9e\xce\x47\x3e\xdf\x10\x7e\x87"
- "\xe5\x0a\x55\xec\x66\xd9\x2f\x81\x0b\xd9\xa0\xce\x85\x90\x7b\xfb"
- "\xdd\x15\x08\x68\xa3\x84\x96\xad\x3c\x8e\x5a\xe1\x0f\x3a\xcb\x3b"
- "\xe5\x79\x8d\x3b\xae\xe0\xfb\x95\xbb\xf5\x76\x9e\xe7\x85\xd4\x3c"
- "\xee\xbd\x73\x2f\x51\xc5\x22\xce\x97\xeb\x4d\x7d\x35\x99\x18\x97"
- "\x70\x56\xf0\x9e\x68\xc2\x77\x02\x68\xe8\xd4\x7d\x49\xd0\x9b\x28"
- "\x92\x6b\x5c\x1e\x7a\x65\xdc\x6f\xcc\x5e\xd2\xf6\x6a\x27\xd4\xab"
- "\x7d\xd9\xa6\x1e\xe7\x2b\xa9\xfd\xb0\x4e\x3e\xb7\xb8\xc6\xc5\xf7"
- "\x96\xc5\xe4\x6f\x4a\x41\x53\xb0\x37\x3f\x3e\xbc\xcc\xe8\x17\x43"
- "\x3e\xaf\x9c\x43\xd9\x53\x59\xd6\xda\x79\x22\x43\x10\xf6\x0b\x75"
- "\x76\x72\x41\x13\xc2\x86\xe0\x7d\x86\x65\xca\x67\x18\x20\x6e\x1f"
- "\xcf\x71\xb5\x55\x7e\xd2\x72\xda\x72\x09\x7a\xfd\x0a\xec\xdf\x9a"
- "\xbd\x6a\xdf\x19\xe0\x91\x87\xdb\x71\x8b\x5a\xad\xa2\x85\xc7\xd8"
- "\x40\x7b\x47\xab\xd5\x47\x22\x6e\xe5\x47\x9c\x0e\xf5\xc2\x62\xb7"
- "\xb1\x2f\x81\x70\xb9\xbf\xee\x95\x76\x9d\xe7\x15\x56\x71\x95\x61"
- "\x06\x1b\x17\xe6\xf6\xee\x90\x6c\x0b\x3e\x23\x5e\x43\xd5\x41\xaf"
- "\x04\xa2\xed\xfd\x84\xc2\x59\xd6\xc2\x82\x0a\x6b\x69\xc9\xa6\x22"
- "\x6b\x61\x49\xa1\x75\xd3\xe6\x0a\xeb\x4b\x9b\x79\x80\x86\x87\x64"
- "\x22\x74\x22\xc8\xe5\xdb\x96\x1f\xaf\xcf\x41\x77\x6f\x2b\x1e\x82"
- "\xf2\x83\x27\xdb\x96\x77\xf7\x14\x0f\x8d\xe4\xc9\xb6\xc7\x94\x1e"
- "\x6f\xdd\x07\xda\x27\xaa\xfd\x7b\x71\x9d\xf8\x46\xf9\x5f\xf1\x46"
- "\xd6\xbd\x6d\xaf\x6a\xb0\x27\x75\x58\xa9\x17\xf7\x5d\xe9\x8f\x3b"
- "\xa4\xe9\x63\x83\xda\x67\x2c\xcf\xad\x69\x90\x6b\xf0\xb7\x76\x0e"
- "\x9a\x86\xcf\xea\xda\x41\x2f\x5c\xa3\xad\xff\x2c\x9c\x5b\xc7\x69"
- "\x3a\x94\x10\x74\x15\xb4\x68\xfa\x03\x9d\xd8\x96\x3e\x50\x7f\xb6"
- "\xed\x65\xfd\x11\x3d\xf9\x09\x72\xbd\x46\xc0\x0f\x3b\x85\x6f\xb4"
- "\xaf\x1e\xda\xba\x9f\xcb\xe1\xdb\x96\x9f\x60\x7f\x5b\x9e\x9f\xf7"
- "\x31\xcf\x7d\xf2\x9d\x2f\xd0\x95\x61\xd0\x0d\xc8\x68\x5b\xa5\x2e"
- "\x23\x1d\x3e\x76\x1d\x96\xfa\x12\xa9\x63\x8a\x9f\x7f\x94\x3a\x86"
- "\xf6\x1d\x34\x19\xf5\x73\xfa\xb8\x0d\x00\x6d\x5d\x15\xbb\x84\x40"
- "\x1e\x9e\x30\x3d\xb8\x16\x4b\x0f\x20\xdb\x17\x4a\x37\xbf\xb0\x01"
- "\x15\x7d\x4b\x51\xc5\x0b\xc5\x7c\x36\x05\xdb\x01\x79\xf0\xc5\x84"
- "\x42\xeb\x2b\xe5\x45\x2f\x0c\xa7\x58\x50\xfd\x91\xe1\xf2\x37\x07"
- "\xa1\xaf\xdd\xdd\xf9\xf1\xbc\x47\x42\xed\x89\xd8\xfe\xe3\xee\x72"
- "\xf4\x25\x22\xe4\xbe\xfd\x6d\xb7\x25\x03\x3e\x59\x06\x49\x1f\x1a"
- "\x3c\x53\xf3\xfc\xdb\x3f\x64\x3e\x74\x1b\x0d\x68\x0f\x6c\x75\xba"
- "\x0e\xe0\xf7\x71\x94\xc9\x15\x5a\x63\xb1\xfd\x62\xb7\x31\xfe\x22"
- "\xdb\x1f\xb5\x9e\xe3\x0a\xec\x40\x52\xc3\x25\xda\x2e\xc7\xa4\xeb"
- "\x65\x7b\x62\xbb\xa8\xa7\x39\xd8\xbf\x4f\x79\x7b\x96\xae\x27\xa1"
- "\x34\xb6\x73\x1c\x26\xcf\x2a\x72\x6e\xf3\xb3\xcc\x85\x92\xbd\x49"
- "\x87\x03\x5f\x45\x83\xb4\x23\xdb\x33\xa2\x6d\xc3\x6f\xcc\x3c\xa7"
- "\xad\xe8\x91\xfa\x67\x2e\xa8\x95\xe7\x9e\xc0\x57\x03\x3d\x73\xb4"
- "\xf5\x25\xe7\x65\x9b\x6e\x03\x2e\xbf\xc2\x25\x9c\xb6\x7b\xf4\xbc"
- "\x44\x72\x41\x6d\x83\xd4\xb3\xed\xae\xd0\x98\xdf\xf6\xd9\xdc\xd7"
- "\x15\xdd\xf9\x43\x3c\x64\xab\x94\xba\x85\xdf\x15\x77\xa9\x33\xd8"
- "\x58\xdf\xb8\x9c\xac\x57\x21\x9d\xda\x7e\x5e\x97\x37\x97\x19\xe9"
- "\xf6\x5a\xe5\x39\xbd\xdb\x3b\x75\x5e\x0e\x76\x56\x8c\xac\xb7\x66"
- "\xd0\xd2\xa3\xea\xae\xec\xa7\xa9\xf3\x81\x78\x9f\x4a\x1c\x68\x6c"
- "\xb9\x4c\x3b\x6e\xf2\xda\xfb\x24\x3f\xf7\x7b\x0a\x5a\xf8\xec\x03"
- "\xb5\x97\x7c\x07\xfc\xff\xad\xb3\x43\x7b\xcb\x77\xa0\xfd\xb7\xcd"
- "\x56\xb2\xdb\x51\x18\x56\xf7\xbc\xda\x7c\xfe\x50\xe6\x11\xdb\x33"
- "\xb7\x2d\x5b\xd6\x57\xb5\x6f\x77\x87\x4b\x4f\x27\xcf\x09\x08\xa8"
- "\x36\xf1\x1a\xed\x68\xe2\x36\x82\xe9\xf3\xd0\x0e\x5e\x6f\x2d\xd7"
- "\x3d\x71\x9b\x2b\xf5\xc6\xc2\x77\x98\xec\x38\x1b\x45\xc3\x45\x1d"
- "\x97\x86\xbb\x4b\xff\xe6\x73\xc3\x3c\x54\x69\x6b\x1d\x87\x3a\xe5"
- "\x93\x65\xb8\xa3\xb5\x02\x75\xcb\xc7\x70\x3b\x53\x75\x1e\x22\xdc"
- "\x81\x6f\xf8\x3f\x15\xe9\x6a\x4e\xa7\xc6\xa5\x6c\x51\x65\x05\x9f"
- "\x49\x65\xb7\xf2\xb9\x82\xb3\x95\xbd\x91\x67\xe1\xc8\xb8\xa9\x5a"
- "\x9d\x1d\xc6\x7b\x7c\xe4\xba\x16\x5f\x40\xda\x06\x75\x76\x02\xe2"
- "\x51\x47\x7a\xf8\x6e\x96\xde\xe2\x61\x8a\xb6\x9d\xfb\xfa\xf3\x80"
- "\x4e\xb4\xca\x39\xc4\x9d\x36\x75\x16\xc9\x50\xf4\xd5\x76\x1e\xd7"
- "\xe5\xb7\xf7\x08\xc2\x80\x13\xe9\x12\x5a\xe5\x59\x5f\x3b\x5b\x75"
- "\x7a\xb5\x38\xa3\xd4\x07\xc9\x83\x9d\xfd\xf5\xbf\x3b\x45\xc2\x7a"
- "\xf5\x7c\x24\x2c\xe0\x18\x9e\xef\xec\xec\x71\x56\x26\xf6\xe3\x51"
- "\x67\xa0\x24\x70\x3e\xad\x8d\x32\x2e\x3d\x64\xab\x76\xc8\x39\x53"
- "\xb9\xee\x0c\xe5\xf0\xee\x2c\x1e\x26\x65\x60\x25\xbe\xdf\xc3\xc4"
- "\xf8\x94\x2e\x56\xae\xd2\xd3\xc4\x19\x98\x8f\x95\xa5\x7a\xde\x3a"
- "\x0e\xa6\xff\xb6\x36\x4f\x95\xc5\xc4\x75\x84\x61\x19\xaf\xd4\x89"
- "\x1d\xec\x33\x55\x5e\x97\x3a\x28\xcb\x59\x79\x26\x5c\xd6\xca\x17"
- "\xab\xbc\x18\xa6\x0f\x4c\x4f\xbf\xfc\x3d\xb4\x6b\x9c\x6a\x4b\x76"
- "\x51\x18\x8d\x99\xf8\x36\x87\xe4\x20\x65\xc4\xf7\x2c\xc5\xbc\x07"
- "\x51\xd6\x15\xc0\x04\x85\xa4\x93\xe5\x81\xbe\xd4\x4c\x6a\x85\xdd"
- "\xe3\xba\x02\x9e\x80\xc6\x5d\x6f\xb2\x5e\x01\x6f\x71\xa4\x6e\xee"
- "\xb2\x85\xd1\x6b\x60\xbb\x8e\xb0\xfd\x3a\x0c\xe8\x93\x7d\x2e\x9d"
- "\x9f\x88\x3b\xde\x2f\xc7\x69\x12\xb6\x59\xa7\xf3\x73\xda\x0c\x8d"
- "\x57\xbb\x3e\xd5\xf2\xf0\xea\x79\xe0\x37\xf2\xa9\x1c\xe0\xab\xae"
- "\xdf\x5e\x51\xa4\x0e\x27\xe2\x46\xbe\xe0\x85\x0d\x45\x85\x13\xad"
- "\x05\x2f\xf2\x31\x46\xe5\xa5\x45\x45\x65\x72\x12\x26\xd2\x0f\x4c"
- "\x95\xf9\x81\x0f\xca\x97\xb5\x6f\x7f\x43\xad\x3f\xe1\x7a\xc1\xf5"
- "\xdd\xcb\xf5\xfd\x74\xe5\x67\xb2\x6f\xe2\x76\x4c\x23\xb7\x5f\x38"
- "\xd8\x7f\x97\xb6\x8f\xcb\x6f\xf1\xa9\x76\x00\xf2\xe4\x36\xb2\xc7"
- "\x59\x55\x1b\xc9\xaf\xaa\xe3\x91\x75\xb9\xaa\x39\xb6\x9d\xa8\x7a"
- "\x4e\xda\x09\x97\xd2\x0b\xb6\x4f\xbc\x76\x9f\xf1\x22\x4d\x57\x14"
- "\xce\x40\xc8\x46\xd9\x13\x74\x1b\xa5\xda\x09\xfb\x44\xb4\x41\x2e"
- "\x95\x97\x3d\x2d\xa4\x37\xf6\x63\x4a\x6f\xec\x33\x3d\x54\x5d\xa3"
- "\xf7\x55\x54\xdb\x51\x95\xc0\xfe\x23\xdb\x74\xc4\xe7\xeb\xf8\x6a"
- "\x52\xb8\xdd\xb0\x17\x0f\xf4\x1f\xec\xa9\xec\x3f\xf0\xba\x42\xe6"
- "\x05\x68\x4d\x50\xf5\xc6\x5e\x13\x66\x7f\xcc\xf8\x3e\x16\x4b\xd6"
- "\xeb\xb9\x39\x9e\xc4\xd3\x65\x93\x5e\xd8\x54\x31\x87\x8f\x98\x2a"
- "\xb2\x95\x15\xbd\x50\x51\x54\x18\x3d\x4f\x96\xae\xfb\x62\x3c\x47"
- "\x5d\x83\x7a\xef\x4d\x66\x7e\xd8\x51\x1e\x67\x9a\x5e\x06\x69\xa7"
- "\xe0\x3b\x6a\x36\x2e\xf1\x32\xed\xfe\xb4\x41\xae\xb3\x73\xa4\xe9"
- "\x7a\xc2\x70\xf3\x6c\x22\x88\x30\x94\xbf\x4a\x5f\x0f\x88\x3e\xa9"
- "\x23\x47\xff\x0e\xa5\x77\xa8\x73\x92\x8e\xc8\x35\x79\xe0\xe9\xee"
- "\xc4\x30\x7f\x0b\xdf\x8e\x0e\xed\x5b\x9e\xa3\xc4\x67\x7e\x75\x91"
- "\xe3\x5d\xc5\x5f\x07\xe4\xbf\x4b\xb3\x15\xbb\xbd\x0a\x0f\xd1\x7b"
- "\x55\xde\xf8\x06\x39\x3e\xef\x68\xd6\xf3\x43\xfa\x8b\xe1\x79\x72"
- "\xbb\x15\x8d\xcf\x43\x0e\x39\x8f\xbc\x47\x9e\x01\xe7\xf0\xc5\xa0"
- "\xd5\x16\x0e\xd7\xe3\xdc\x6d\x41\xfe\xad\x7a\x99\x97\xda\x64\xd8"
- "\xc4\xdb\x94\xb1\x4b\x2b\xe3\x71\xd6\x2d\xce\x9f\xf5\x5f\xa3\x61"
- "\xbf\x76\xae\x88\x87\xef\x37\x64\xfa\xe5\xf9\x66\x16\xae\xd7\xbb"
- "\x1d\x68\xe7\xf5\xf3\x5e\x2e\x72\x19\x4f\x56\x79\x4d\xfa\xb9\x52"
- "\x2a\xfd\xee\xa2\x28\xda\x4e\x86\xa5\xe9\x6c\xb9\x8f\xc7\xde\x77"
- "\x2f\x12\x4e\x7b\x13\xeb\x21\x9f\x37\x55\xd3\xaf\x87\xbb\x3d\x03"
- "\xf5\x6e\x77\x2e\xeb\x5d\xb8\x2e\x95\x4c\x7b\x01\x9a\x54\x5e\x54"
- "\x31\x4b\x7a\xf7\x70\xec\xf8\xd8\xb2\x82\x8a\x92\xcd\x9b\xca\x27"
- "\x5a\xcb\x0b\x0b\xb4\x4a\x1f\x51\xe7\x9d\xb2\xef\xee\xd3\xeb\x59"
- "\x8f\xd3\x99\x1b\xb2\x2d\xce\x90\xfe\xf3\x1a\x2b\x79\xb7\xb2\xf3"
- "\x5d\x55\x9f\x9c\x15\x61\x75\x57\xa6\xe7\x3a\xda\x20\x7d\x36\x67"
- "\x78\xfb\xcf\x7d\xe3\x61\xd7\xc8\x39\x47\xe3\xa9\x4f\xf1\xd8\xf9"
- "\xb1\x2c\xa7\x3c\x4f\x6b\x77\x80\xcb\x29\xcf\x6f\x91\xfe\x99\xf3"
- "\xbc\x5e\xde\x50\xbf\xc1\xd9\x29\xfd\x28\xcd\x5f\xbb\x5d\xbf\x3c"
- "\xe4\x9f\xee\xd9\xab\x8d\x9d\xb5\xeb\x7d\x3c\xdd\xbf\x06\x2d\x85"
- "\xca\x57\xdd\x33\x67\x49\xa5\xe8\x5d\x6b\xe3\x73\xe6\x58\x06\x7b"
- "\x4a\x74\xdf\x52\xae\xbf\x3b\x5c\xd0\xd8\xe3\xdc\xb3\x2e\xdc\x4e"
- "\x88\xb8\x0d\xed\x9a\x8f\xd8\xa8\xfa\xae\x77\xfc\xc3\x25\xe4\xc5"
- "\x73\x07\xb7\xa1\x0d\xe5\xda\x03\xfb\x57\x53\xc8\x78\xd8\xbf\x16"
- "\xdd\x16\xed\x7e\xc7\xbd\x72\xae\xb1\x1e\xb8\xbd\x90\x2d\xe0\xe0"
- "\xff\x39\xa5\x6e\x04\xa1\xa3\xbc\xf6\xc6\xa7\xfb\x48\xb4\xa7\x8f"
- "\xdb\x22\xfc\x86\xde\xee\xd5\xf6\xa4\xef\xcd\xf3\x96\xa7\x53\x77"
- "\xb7\xc5\xd8\x5d\x9e\x6f\xe2\xf1\x02\xe6\x85\xbb\xce\x4f\x4a\x7f"
- "\xf6\x5a\x61\xa7\xce\x87\xe3\xd3\x70\x31\x4f\x4d\x4c\x87\x28\xb7"
- "\x18\x59\xbf\xe5\x7d\x80\xdd\xe9\x68\x4f\xf7\x74\x8a\xf2\x74\xe3"
- "\x20\x67\x67\xdd\xae\x9c\x89\xfa\xdd\x95\x6c\xaf\xd4\xf9\xfc\xaf"
- "\xfe\xe4\x0d\x35\x36\xa0\xe5\xbb\xf7\x67\xc2\xf8\xae\x6c\x57\x0e"
- "\xca\x76\x45\x90\x3a\xef\x7c\xef\x79\xb9\x0e\xb6\xec\x5d\x79\x27"
- "\xaa\xb6\xbf\xda\xdb\x5a\x16\x90\x77\xcd\xd9\x2b\xd8\x4f\x0b\xf0"
- "\xbc\x8f\xdc\x3f\x7c\xba\x22\x40\x4b\xfd\xac\x93\xaf\x12\x9f\xf5"
- "\xee\x93\xfe\xc2\xab\x89\xfa\xf9\xee\x7c\x4f\x23\xfc\x60\x42\xb9"
- "\xe2\x58\xee\x56\x3b\x9f\xcd\xff\x6a\x07\x8f\xbb\xaa\xfe\xb8\x85"
- "\x0e\xc2\xa7\x57\x32\x78\x75\x39\xdf\x8d\xa7\xfa\x0a\x97\x20\x97"
- "\xb8\xbf\x01\x76\xa3\x9a\x03\xd6\xed\xc4\xab\x7f\xe5\xb5\xe5\x1e"
- "\x0d\x07\xf2\x42\xfb\xbf\xc7\xa5\xf2\x02\xbe\x1e\x5d\x9e\xaf\x2e"
- "\x1f\x38\xbe\x11\xc2\x87\xf4\xcb\x34\xbf\x80\xd4\xd8\xd5\x6f\x18"
- "\x57\xab\x3e\x76\x15\xf2\x7d\x5e\x6d\xd7\xc7\xae\xd4\xd9\xd1\x7b"
- "\xeb\x38\xff\xc1\xc6\x88\x84\xfd\x39\xd6\xfb\x04\xf6\xe1\x06\xf5"
- "\x27\xd0\xbe\x33\xed\xba\x5f\xa8\xe4\xf3\xda\xcb\xec\x1f\xf2\x3d"
- "\xa6\xba\x2f\xa9\x7c\x80\xd7\x2a\x55\x5b\xf6\xda\x3a\xbd\x2d\x43"
- "\xda\x93\x9a\xad\xd0\xda\xb9\xd7\xfa\xfb\xbf\xb1\xd7\xd5\xbf\x56"
- "\xa7\xf3\x48\xe7\xb9\xe2\xd1\x6b\xd7\xbb\x53\x9e\xf5\x85\x78\xfb"
- "\xda\x75\xc9\xeb\xfe\xf8\xef\x4d\x0a\xe3\x3d\x7f\x4f\x54\x76\xf3"
- "\x35\xb4\xff\x7b\x57\xa9\x36\x45\x85\x89\x94\x9a\x37\xc4\xce\x7c"
- "\x52\x3c\x28\x91\x63\x33\x5e\x7b\x3a\x68\xfb\x9e\xc5\x63\x18\xd5"
- "\xac\x6c\xd9\xf7\xd0\xfe\xbd\x96\xaa\xd2\xbd\xd6\xc2\xb4\x84\xd3"
- "\xbb\x7c\xd3\x86\x4d\x9b\xb7\x6d\xe2\x01\xb5\x57\xca\xad\x2f\x6c"
- "\x2e\x2c\x1a\x1e\x63\x3c\xc4\xc2\xf7\x3d\xfb\x6a\xfa\xcf\x8d\xfa"
- "\x7e\x06\xaf\x83\x57\x77\x0e\x7c\x7f\xaa\xf5\x01\xd6\xaf\xef\xbd"
- "\xc9\x63\x05\xf2\xee\x07\x3e\x23\x55\x8d\x1b\x74\x72\x7a\xc5\xeb"
- "\xef\xdf\xdd\xbd\xad\x58\xf3\xb1\x5e\xff\x17\xe6\xa3\xd6\xe7\x10"
- "\x97\x69\x5f\xb2\xde\x0e\x31\x7d\xd2\x37\xef\x4d\x97\x76\x31\xd8"
- "\x5b\x6c\x92\xfc\xea\x4d\x47\x7b\xf3\x3d\xaf\xc7\x90\x52\xa3\x95"
- "\x2b\xa0\xf3\x83\xcb\x0f\x5f\x37\xa1\x47\x94\x40\x47\xbf\x9f\xa1"
- "\xe1\x62\xfb\x09\xdc\xdf\x6b\xd5\xd7\x61\xf3\x59\xa0\x2d\x5b\xf9"
- "\x1c\xe0\x7d\x7d\xc1\xc3\x6c\x6f\xf6\x65\xea\x76\x89\xdb\xa2\x20"
- "\xf0\xbc\x7f\xc3\x1b\x8f\x7a\xc3\xeb\xef\xc7\x5c\xa2\xd7\xf7\xab"
- "\xfb\x02\xf6\x95\x46\xde\x17\xf0\x7a\x0e\x9e\xfd\xda\x73\x22\xec"
- "\xf7\xed\x1e\x3d\x8d\x2d\x14\xb6\xef\x4c\x14\xcc\x09\xd0\x74\xa1"
- "\xdf\x5f\x51\xe7\x91\x6a\xe7\x17\xf3\xdd\x17\xaf\x27\xf3\x99\x9f"
- "\x21\xdd\xd8\xf7\x88\xe6\x83\x74\x32\xef\xb8\xbd\x05\x8c\xdc\xcb"
- "\x02\x9e\xbc\xc1\x63\xb4\x5c\x26\xd1\x53\x02\x9d\x78\x7d\x62\x48"
- "\x0f\x14\x8f\x10\x96\x19\xf2\x53\x5e\x4f\xe5\x34\xe1\x7c\x40\x1e"
- "\x4f\xa8\xbe\xe9\xeb\xc5\x7a\x9b\xcd\xe7\x9d\xaa\xfb\x23\xf6\x5d"
- "\x38\x59\xd5\x89\x3e\xff\xeb\x7b\x43\x38\xf6\x5d\xd0\xc6\x22\x4c"
- "\xc2\xf8\xbd\x99\x0d\xb2\xcf\xf6\xfa\xb1\xd0\x98\xc0\xbe\x0b\x6c"
- "\x77\x25\x8e\x94\x9a\x46\xb7\x4f\xde\xa9\x6c\xd0\xef\x4e\x07\xec"
- "\x79\xdd\x47\xd1\x71\xb5\xaa\x31\x27\x79\x46\x25\xea\x20\x64\xf6"
- "\xba\xaf\x7f\x3c\x16\x61\xfd\x7d\x40\x70\xb5\x55\xfa\xde\xdf\x4f"
- "\x0d\xf5\xf5\xbe\x27\xe7\x2e\x65\x3f\x50\xe1\x81\x9f\xfc\xfd\x84"
- "\xe8\x7e\x1b\xfc\x07\x6b\xc9\xa6\x12\xb8\x0f\x2f\x95\x6d\x9e\x83"
- "\xae\xc3\x4b\x65\x25\x73\x78\xc9\xd6\xa2\xac\x85\xf2\x8d\xca\x31"
- "\x27\xc6\xf8\xb1\xba\xdf\x35\x5f\xda\x54\xee\xe7\xf2\xd8\x69\x8f"
- "\xba\xeb\x74\xa8\xf6\x4e\xd0\xde\x43\xd0\xee\x9d\x41\x1d\xf8\x05"
- "\xdf\x5d\x03\x1a\xce\x68\xf7\xcb\xea\x6d\x36\x6c\xf9\xf7\x7f\xa2"
- "\xcf\x77\xc9\x35\xec\x7c\x0e\x61\x77\xb1\x1c\x8f\x43\x99\xfa\xc7"
- "\x3f\xd4\xf8\xa2\x9a\x33\xeb\x71\xfe\x80\xf4\x70\x7d\x3c\x16\x61"
- "\xa9\xfa\xd8\xab\x82\xfd\x41\x5a\x28\x6d\xc4\xd8\x76\xaa\x3e\x9f"
- "\x06\x98\x1c\x9d\x67\x3a\x1e\xbb\x55\x5c\xd3\xfc\xa4\x38\xe9\x57"
- "\x3b\xbf\x3f\x5b\x9e\xfd\xc9\xbe\xb8\x1c\x67\xfe\x41\xa5\x9e\x0f"
- "\xf7\x11\x98\x6e\x6d\xee\x46\xd6\x7b\x3e\xe3\x53\x9d\x11\xfa\x83"
- "\x7e\xf9\x47\xce\x71\xc4\x9e\xdf\xe8\xdd\x2a\x5a\x03\x37\x44\xf3"
- "\xc1\x3f\xa1\xce\xbe\x48\x14\xd8\x2a\x9a\x7a\x6f\x88\x93\xf2\x8e"
- "\xea\xf5\x44\x07\xfe\x4c\xd4\x17\xb7\xf2\xe3\x5b\xe0\xfb\xe2\xeb"
- "\xc1\x6b\x7c\x77\x5d\x03\xe0\x16\xfb\x3e\x11\xf5\x48\xb3\xb8\x4c"
- "\x5c\xab\x07\xdc\xa2\xab\xd7\xc4\x51\xc0\x2e\x2a\x46\xb9\xb7\x8a"
- "\x40\x5f\xdc\x86\x8f\xad\xcf\xb2\x1d\xda\x3f\xd3\x7b\x78\x75\x40"
- "\x38\x8d\x87\xc4\x9e\x87\x1f\xea\x71\xee\xcf\xea\xbf\x33\x0b\x78"
- "\x99\x47\x4b\x6c\xfc\x7b\xc3\xc7\x28\xd3\xc7\x6b\xd1\x86\x42\x06"
- "\x1f\x03\x0e\xfd\xff\x72\x69\x6f\xbc\x71\x0f\xa5\xe0\x49\x8f\x65"
- "\xf7\x41\x6b\x6b\xdf\x56\xd1\x7c\x68\x0d\xe8\xbf\x02\xfa\x6f\x88"
- "\x26\x94\xe1\xe4\xc1\xcb\x44\x4c\x7f\x1f\xe3\xec\xa3\xb8\xb5\xdb"
- "\x0d\xc9\x0d\x88\x5f\x6b\x33\x53\x03\x60\xd7\xf8\x28\xb9\x1e\x30"
- "\x6b\x5e\x4e\x26\x49\x7f\x17\xe8\x4e\x5e\x1d\xe8\x43\xde\x4c\x3f"
- "\xf2\xef\xd2\xe9\xd4\xf3\x67\x7a\x75\x1d\x5c\xcb\xe3\x5d\x29\x2b"
- "\x66\x30\xdd\x6a\x0c\xff\xc0\x04\x6f\x79\x31\x79\xe3\x1e\x7e\xc8"
- "\x43\x07\x32\xb9\x0e\x71\x79\xbc\xd0\x29\x6d\x5f\xd9\xc7\x3a\x0f"
- "\x54\x7f\xf2\x40\xae\x5e\xbe\xf0\x72\xe5\x6d\xde\x22\xc7\x51\x0b"
- "\x5e\xa8\x28\xd9\x5a\x80\xde\xd9\x70\x2a\xe3\x20\xd9\x7f\x2b\x2a"
- "\xb4\x6e\xde\x64\x7d\xb1\xa0\xa4\x74\xf3\xd6\xa2\x2d\x13\x65\x97"
- "\xbb\xbc\x68\x53\x21\x0f\xaf\x6e\x29\xd8\x52\x36\x3c\xca\xe7\x76"
- "\xad\x0e\xb4\xf1\x3d\x27\x55\x3c\x7e\xed\x5a\xa4\x8d\x2d\xfa\x85"
- "\x33\x53\xf6\xdd\x54\x3d\x38\x88\x3e\x7f\x26\xc7\x3f\xa1\xda\x1a"
- "\x57\xae\xa8\x5e\xf1\x88\x10\xf2\x0e\x66\xc3\x35\x72\x3d\x26\xcb"
- "\xd9\x9d\xa3\xe3\x91\x7b\x34\xa4\xcf\xca\xe1\xbd\x39\x14\x5a\xb3"
- "\xed\x5a\x24\x8c\x28\x23\x78\xa0\xf9\xad\xfa\xde\xb9\xff\x76\x89"
- "\x5c\x13\x50\x6e\x9e\x3b\x38\x2f\xfd\x42\xb9\xc7\xc7\x35\x1a\x7e"
- "\x2f\x7c\xb1\x21\x89\xcc\x97\x83\xaa\x5f\x69\x4c\x32\xf0\xfd\xab"
- "\x97\x78\xbf\x61\x06\xcf\x11\x36\x38\x83\x19\xa1\x35\x32\x07\xf2"
- "\xd9\xc7\x95\x63\xed\xb2\x5e\x1c\xac\xd1\xf5\xdd\xc8\x7b\x38\xf6"
- "\x8c\x9d\xa5\x6c\xf5\x41\xb9\xa7\x08\x72\x9b\xa5\xe8\x97\xf7\x41"
- "\xa3\x7d\x3a\xf4\x33\x94\xef\x51\x61\xcf\xd1\xce\x6d\x3f\xf4\xb3"
- "\x60\xca\x1f\x32\xfa\xca\x2d\xda\x1d\xea\x2b\x16\x07\xab\x57\x3c"
- "\xde\x87\x76\x3d\x08\x5f\x55\x54\xff\xe1\xe7\x7d\xd5\x2b\x66\x06"
- "\xb7\xa5\x1b\xd9\xbe\xdb\x6d\xe0\xdf\xe6\xe2\xe1\xe2\x93\xe2\x3b"
- "\xfa\xb6\xa5\xf3\x5a\xc7\x4c\x21\x90\x36\x65\x45\x9e\xbc\xf3\xb6"
- "\x7a\xc5\x93\xda\xf7\x33\xfc\x1d\x84\xaf\x86\xb0\x7c\x7c\x3f\x1f"
- "\x14\x61\xf0\x91\xb0\xab\xf8\x3b\xc9\x20\xd7\xe6\x65\xc0\x37\x9e"
- "\xcd\x65\xd7\xcb\x2c\xfb\x08\x3c\x4e\xd1\x5f\xb6\x43\x27\xf4\x70"
- "\xf6\x5d\x95\x1f\x49\x2f\x5c\xa2\x43\x2d\xca\xa6\xf5\xc3\xbd\xaa"
- "\xf3\x40\xf2\xb6\x7a\xc5\x0c\x0f\xe4\x27\xef\x85\xdf\xf3\x8d\x87"
- "\x84\xf1\xc0\x06\x6e\x3b\x96\xf4\xc9\xb9\x2c\x52\x73\x1f\x87\x3a"
- "\x74\x7e\xf2\x5a\x74\x6e\x3f\x20\xb7\xf4\xb5\x5e\x1a\xae\xea\xaf"
- "\xcb\x14\xd6\x47\xe9\x12\x52\xdf\x0f\xd5\xc9\x7c\x8d\x09\x7b\xd4"
- "\xf7\x41\xed\x2c\x73\x57\x86\x0e\x8b\xb0\x99\xca\x27\x3d\x68\xe2"
- "\xbe\x1b\xcf\x6d\xf1\xef\xfa\x41\xf6\x49\x56\xd5\x09\xc1\xb6\x90"
- "\x6d\xb3\x75\x2c\x51\x9b\x8f\xfd\x76\xd7\xfe\xd3\x75\x3e\x92\xf2"
- "\x4b\x59\xf1\x48\xb7\x28\x26\xf8\x2b\x31\xfd\x54\x4e\x03\xf8\x33"
- "\xd2\x07\x87\x3e\x07\xa1\xcf\x48\xf3\x28\xeb\x6b\xd5\x75\xa6\xe3"
- "\x70\x42\x6b\x65\x27\x9f\xe3\x0e\x3d\x3c\x9c\xc0\xbc\xe1\xb6\xe1"
- "\xa0\x53\xee\x91\x93\x36\xb8\x65\xeb\x0c\xc6\x71\x7d\xa4\x9f\x4c"
- "\x6d\xb0\xa0\xe0\xb7\xbf\xac\x8a\x92\xaf\x00\xde\x54\x41\x09\xdc"
- "\x3f\xfa\xa2\xf3\xc8\xc8\x2f\x4b\xf1\xe4\x70\x96\xee\x03\xe1\x77"
- "\x5e\xe4\x5e\xd0\xc3\x03\xf6\x82\xae\xdf\xbc\xb9\x62\xed\x96\x22"
- "\x7e\xa5\x4f\x78\xe5\xc1\xe8\x36\x31\x51\xdd\x9b\x73\xb8\x98\xe5"
- "\xc7\xed\x84\xda\x53\x71\xf8\x78\x58\xbf\x96\xc7\xd6\xe6\x72\xfb"
- "\xc6\x73\xe2\x88\x6b\xfd\x75\xe5\x2e\xe9\x57\x7d\x94\x40\xc6\xe8"
- "\xfc\x5e\x2c\xa8\x28\x28\x9d\xa5\xa6\x6f\x63\xe4\xd3\x1e\x99\x4f"
- "\xb5\xb9\x3f\x1f\xd5\x07\xf1\xc9\x3a\x78\xf8\x0f\x8d\x22\xf9\xbf"
- "\x64\x2a\x3b\x57\x3d\x43\x5f\xe3\x14\xfb\xec\x89\x15\x27\xfa\xaa"
- "\xdf\xf4\xb2\xbc\xec\xbb\xc8\xf8\xf3\x1d\xed\x46\xf6\xbf\xaa\xf0"
- "\x9b\xd7\x9c\xc8\x71\x3e\xed\x4e\xbb\x5f\x7d\xd6\x0e\x3b\x5b\xbd"
- "\x4f\x1c\x5e\x71\x02\x7a\xe5\x18\x6c\x9d\x49\xf8\xbe\x5d\x35\x47"
- "\x59\xdd\x38\x18\xac\x70\x15\xb4\xab\xba\x52\x7d\x5d\xce\x95\x8d"
- "\xa5\xef\x5d\xa2\xea\x4f\x4d\x16\xf4\xe3\xc6\xd2\xff\x85\xdf\xb2"
- "\xbf\xc0\x71\x11\xb2\xbe\xbb\xab\xd1\x04\xed\x84\x96\x1a\x84\xfa"
- "\x83\x13\xa6\xfe\xe2\xf0\x18\x85\x41\xae\x7e\x8f\x03\x87\x87\x0e"
- "\x31\x51\xd2\xc8\xc4\x84\x7b\xef\x19\x67\x99\xfb\xf8\xec\x99\xf6"
- "\xaa\x4a\x9b\x08\x06\xfc\x49\x22\xfc\xfe\xc5\x7f\xec\x5c\xfe\xa0"
- "\x43\xb5\x15\x87\xff\x31\xe6\xdc\xde\x01\xa7\x28\x63\xdf\x1a\xf6"
- "\xca\x6c\x7f\x85\x8c\xef\xdf\xf2\x18\xd9\x97\xe3\xf6\xc7\x1d\xf8"
- "\x10\x7d\x82\x37\x76\x7f\x80\x30\x94\xdf\x26\x5c\x7f\x30\xab\xbd"
- "\x0d\x6f\xfc\x3a\x58\xfd\x07\x73\x08\xbf\x89\x18\x3f\xfa\x0b\xc6"
- "\x63\x55\x9d\x46\xb7\xe9\x71\x72\x5b\x7d\xf4\x01\x7e\xc7\xe4\x25"
- "\xf2\xe4\xb1\x29\xc6\x01\x3b\xbc\xcf\x7e\x13\xf6\xd9\x26\xc7\x89"
- "\x8d\xd7\xe8\x8d\x9b\x4d\x83\xa4\x93\x73\x3d\x29\xab\x7f\xda\xe3"
- "\xac\x81\xfc\xbf\xb3\x5f\xf3\x87\xe0\xaf\xd5\x64\xe9\x36\x01\xf1"
- "\x3f\x51\xe3\xd5\x35\xf9\x3a\x4c\x4c\x19\x7d\x9f\xd7\x4c\x8a\x16"
- "\x96\xab\xb8\xd1\xd9\xc9\x67\xb8\x0d\x32\x26\x90\x85\xf6\xf9\x1c"
- "\xd7\xe3\x11\xbb\xcd\x43\x46\xee\xce\xd8\x78\x16\xed\xdf\x88\xae"
- "\xd1\x34\xd2\xb7\x9a\x69\xe6\x75\xbb\xe7\x8f\xc2\xf7\xe5\x79\xaa"
- "\x24\x43\x46\x49\xd2\xee\x8c\x82\x3e\xe7\xec\xe9\xdc\x4e\x26\xd9"
- "\x16\x1a\x92\x02\x4f\x18\x02\xce\x19\xd3\x1b\xd4\x9d\x27\x3e\xd7"
- "\x18\xd1\x8e\x34\x17\x91\xc6\x83\xa7\x03\xe9\xce\x5e\xa6\x37\xef"
- "\xc2\xfb\x4c\x92\x41\x34\x24\x41\x92\x53\x1c\xf2\x0e\x48\xb6\xd1"
- "\x67\x45\x0a\x7c\xcc\x5e\x39\x16\x10\x1f\x1a\x0b\x78\x73\x36\xe4"
- "\x36\x24\xf7\x55\xf1\x01\x70\x9d\xe9\xbb\x11\x3c\x53\x7f\x8d\x48"
- "\x1b\xf3\xbe\x80\x3a\x7a\x61\x62\x0d\x59\xb4\xb5\x97\xc6\xb3\x81"
- "\x33\x6c\x8b\x79\xef\x72\x2b\xf2\x3c\x85\xa7\xd9\xba\x89\xe2\xae"
- "\xd1\x9b\x07\xd8\xff\x08\xf9\xb0\x6f\xc5\x6b\xfd\x91\x96\xc9\x48"
- "\xbf\x6b\x23\xeb\x44\xa7\x31\x00\xfc\xf0\xf9\xcf\xb8\x8b\xcf\xc8"
- "\xb5\x30\xbc\xb6\x99\x61\x90\x47\xba\xdb\x7f\x86\x82\xc2\x62\xc4"
- "\x77\x33\xaf\x53\x16\x80\x6d\xb3\xb5\x53\x5b\x99\x1f\x36\xf6\x2c"
- "\x7c\xe0\xf4\x34\xd0\x23\xf1\x21\xfe\xc2\xfb\x90\xaf\x15\xfe\x1e"
- "\xf0\x9d\xe7\xb5\x35\xbc\x07\x58\x94\xa7\x3f\x80\xf4\xad\xe8\x43"
- "\x1b\x19\xff\x35\x3a\xf2\xa6\xe8\x4e\x4f\x9f\xd2\xa5\xee\x44\xbc"
- "\x44\x47\x4a\x41\x67\x5b\x88\xce\x23\xd7\x41\xbf\x09\x76\xb5\x05"
- "\x38\x4f\x89\xad\xc8\xb3\x03\x79\xa2\x3f\x02\xfd\x4d\x43\x7f\xd7"
- "\xc4\x34\xb7\x31\xbd\xb6\x3e\x12\xdb\xd2\x4d\x87\x3e\x23\x13\xea"
- "\x42\x4b\x03\xde\x28\xff\x49\xf8\x64\xe3\x7a\x9c\x47\x1c\xfa\x3e"
- "\x72\xf6\x25\xf0\xed\xd2\x75\xe9\x00\x60\x40\x63\x33\xe8\x3a\x35"
- "\xa2\x8b\xb8\x8f\x13\x0f\x3d\x8d\x47\xbe\x43\x21\xab\x66\xf0\xee"
- "\x65\xf0\xfa\x14\x97\x29\x78\x23\xd8\x19\x04\xbe\x43\x37\x40\x53"
- "\xb9\xc5\x94\xd8\xc1\xf7\x45\xf7\x08\xf0\xfb\xc2\x12\x5b\x8f\xe0"
- "\x75\xa7\xbc\x86\x13\x69\x16\xa1\xac\x68\xef\xde\x9a\xc8\xfd\x0d"
- "\x94\x63\x86\xba\xd3\xf1\xc8\x4c\x6d\x4e\xeb\x82\x1a\x67\x7a\xf3"
- "\x00\xf3\x9e\xcb\x95\xb8\xdb\xfc\x9a\xbb\xd3\x4b\x89\x1d\xa3\xd1"
- "\xbe\xbd\xd9\x54\x17\x64\x1f\xe5\xad\xfe\xf1\xff\x41\xea\x98\xdf"
- "\x0d\xfb\x12\xbc\x21\x3a\xd9\xf7\x54\xeb\x5d\xde\x2a\x5d\x6b\x8b"
- "\xcb\x84\x9f\x69\x04\x9d\xbc\x1f\x62\x0c\xda\xe9\xb9\xbc\x9e\x09"
- "\xf4\xa1\xdf\xf1\xd6\xfe\xdb\xdd\xa5\x0a\xfe\x58\x00\xd3\x04\xda"
- "\xb3\x24\xbf\xb6\x8a\x3a\x35\xd6\xf3\x56\xab\xbe\x9f\x5f\xdc\x10"
- "\x95\x87\xaa\x64\xbe\x8e\xbd\x5b\x65\x1e\x7c\xbf\x66\x67\x85\x55"
- "\x7c\xd4\x6a\xf5\x0e\xba\x67\x3a\x6c\x1d\x8f\x57\xbb\xb3\x4b\xce"
- "\x69\x46\xae\xe3\xa9\x9d\x18\xd6\x6f\xe4\x79\x4d\x07\xcf\xdd\xaa"
- "\x73\x57\x6a\xe5\x7a\xe5\x25\x36\x75\xbe\x84\xdb\xdf\xa5\xf9\x96"
- "\xb5\xdb\xe5\x3d\x3e\xec\xd7\xc8\xb5\x3f\x57\xb4\xf5\x3a\xb5\xc9"
- "\x9c\x47\x6b\xd4\x5d\xc1\x45\x9b\x0a\xd6\x97\x16\xa9\xa1\x94\x49"
- "\xdf\xad\x28\x78\x29\xd2\xff\x35\xc9\x7e\xb1\xb3\x76\xaf\x1a\x9b"
- "\xac\x3d\x15\xe6\x27\x9a\xfa\xc7\x96\x8c\x74\x52\x8d\x2f\xd5\x5e"
- "\x8c\x35\xbe\xb4\xf0\xa5\x4d\x9b\xb7\xc8\x3c\xe4\xd2\xa6\x22\xb5"
- "\xbb\x68\x38\x2d\xcf\x5a\x98\x35\xa9\xbc\xa8\x42\x5e\xce\xa1\x06"
- "\x73\x0a\x0a\x0b\xb7\x68\x0b\x9f\x4a\x38\x15\xc7\xbc\xb8\x4d\x26"
- "\x2d\xdb\x50\xa1\x96\x4c\x95\x97\x16\x6c\x2d\xd2\x50\x84\xd3\x3a"
- "\x8e\xed\x65\x6b\x9d\xec\x33\x0f\x57\xf3\xb4\x6f\x97\x86\xcd\xeb"
- "\x84\xf7\x23\xef\x42\xdc\x3e\x3d\xae\xec\x3e\xd6\x95\x1f\xde\xd5"
- "\xd6\x28\xcf\x44\x30\x9d\xfe\x11\xf3\xf7\xed\xeb\x7c\x9e\x3c\xda"
- "\x36\x3f\xdf\x7f\xaa\xcd\x81\xc2\x5e\xbf\xfd\xcf\xf0\xb7\xfd\xe0"
- "\xaf\x6d\x49\x5f\x50\xc0\xa6\xda\x3c\x74\xb4\x55\x1b\x43\x48\x08"
- "\x1a\x6b\x3b\x79\xfd\x4a\xbd\x1c\x47\x78\xbb\x2b\x34\x8e\x70\xb4"
- "\x95\xdb\x75\xc8\xbb\x83\x69\x63\x3a\x7b\x9c\x3f\x4c\x0c\x5b\x3b"
- "\xd0\xe1\xa1\xb7\xe5\x5c\x17\xcf\x71\xcb\xbb\x1e\xe0\x3f\x69\xfb"
- "\xca\x8d\x6d\x3f\xe2\x76\xa8\x6e\x06\xdb\xdc\xa0\xab\xc0\xab\xea"
- "\xcc\x3b\x8b\x44\xf5\xea\xf7\xa7\xf8\x28\x55\xd9\x8c\x1f\xbe\x8d"
- "\xf0\x51\xd7\xe8\x87\x15\x08\x6f\x82\xdd\x89\x67\xdf\x45\x8d\x95"
- "\xff\xf0\x6d\x6d\x5c\x81\xf9\x13\x1f\x46\x83\x2b\x34\xf6\x70\xb4"
- "\xd5\x9b\x5c\xe0\xdd\xab\xd6\x06\xc8\x79\x50\x35\x17\xfd\xc3\x93"
- "\xfd\x7d\x6d\xe4\xad\xcd\xfd\xa5\x5e\x06\x3c\x78\xe1\xd5\xe6\xe3"
- "\x50\xf6\xb7\xb9\x3f\xa1\xad\xe9\xfa\x61\x67\xb8\x0f\xac\xce\xd6"
- "\x5f\xfd\x3e\xfb\xcd\xaa\xcf\xf0\xce\x68\xe9\xe7\xf0\x38\xc7\x2d"
- "\xe6\xf7\x3b\x0f\x22\x1e\x6d\xdd\x3b\x56\x0f\xd5\xd6\xea\xf4\x30"
- "\xcd\x15\x36\x38\x03\x48\xc7\x6d\x1f\x68\x1a\x0a\x98\xac\x10\xcd"
- "\xef\xa4\x4a\xbf\x59\xe4\x6b\x63\x91\xef\x34\xab\xf1\xa6\xf5\x14"
- "\x26\x37\xd3\x35\x7a\xe7\x6d\x71\x78\x3d\xaf\xe7\xeb\xd4\xcb\xaf"
- "\x74\xf6\x9d\x88\xf2\x87\xc6\x82\xde\xbe\x47\x8d\x05\xbd\xd3\x14"
- "\x92\xe1\x3b\x15\xac\xf7\xbc\x7e\x41\x5f\xbb\xc0\xf2\x54\xf7\x0e"
- "\xbc\xd3\xbf\xfe\x2b\x98\x52\xe0\xe1\xbe\xd2\x41\x35\x0f\x07\xb9"
- "\xd4\xdd\x15\x67\xf8\x48\xce\xc5\x4e\xf1\x53\x23\xc2\x86\x20\x6c"
- "\x04\xc3\x71\x9e\x72\xcc\x04\xbc\xe1\xb2\x04\xe1\x8f\xc7\x59\x86"
- "\x3c\xd1\xe3\xac\x4b\x87\xcf\xd7\x11\xd2\x8d\x77\xe4\x9c\xdc\x41"
- "\x8d\xd7\xc2\xf9\xf6\xf4\x50\xff\xad\x6e\x59\xff\x9c\x13\xf0\x84"
- "\xda\x8c\xba\xed\xcc\x63\xce\xb7\x6c\x07\x8f\x49\x1f\x3d\x21\xe9"
- "\x50\xf3\x3a\xbf\x81\xfc\x8e\x0a\xf8\x17\xdc\xd6\x72\x5f\x82\x65"
- "\xcf\xb0\xea\x2e\xa0\xa3\x3c\xc6\xce\x63\xa7\x47\xf0\xfb\xb9\xa0"
- "\x31\x96\xee\xd4\x9d\x0d\x5f\x67\xa8\xf8\x7f\x34\x35\xc8\x38\x51"
- "\x7e\xc6\x85\xf6\xc7\xa0\x8f\xaf\x68\x78\xe3\x81\xf3\xad\xcb\x1a"
- "\xaf\xe5\x9c\x42\xb5\xc6\x07\x96\xb1\xe4\xf9\xd1\x34\xd8\x5c\x39"
- "\xfe\x63\x6f\x14\x57\x37\x03\x87\xba\xa3\xf3\x68\x96\x60\xde\x6a"
- "\xf0\x5e\xee\x83\x81\x76\xb5\xb7\x0a\xba\x88\x7e\x0c\xd3\x19\xac"
- "\x2e\xe8\x64\xda\x79\x3e\x21\xd4\xaf\x3e\xba\x9d\xd3\x7a\x77\xaa"
- "\x34\x87\xd4\x7c\x07\xcb\xe6\x67\x62\x5b\x31\x69\xe3\xec\x68\xa7"
- "\xde\x71\xb0\xde\x33\x1e\x9f\xec\x5f\x1d\x75\x05\xc1\x17\xc8\x04"
- "\x7c\x3e\x7a\x4a\x97\x89\x87\xea\x6c\x83\xf9\xc3\xea\xfc\xfc\xa3"
- "\x9d\xfa\x19\x2d\xdc\x36\xa1\x0e\x3b\x94\x2f\x59\xff\x77\x49\xbb"
- "\xe7\x8a\xa4\xc0\xf4\xe9\xec\x1b\x35\x18\x85\x3f\x6c\x1d\xdd\xbd"
- "\xe0\xd3\x27\xfa\x9a\xe2\xe0\x9e\x95\xed\xbc\x06\xd1\xed\x57\x6b"
- "\x10\x39\x7c\xb1\x4f\x04\xdb\x7c\x7d\xbc\xa6\xbe\xbd\xc7\x59\x9f"
- "\xab\xf7\x83\xd8\xbe\xc5\xed\x36\x80\x77\xf5\xeb\x3c\xf4\x46\xa9"
- "\x66\xd7\x86\x5e\xa1\xfa\xd7\x35\xfc\xe1\x34\x98\x54\x3f\xb2\xfe"
- "\xb8\xea\x4f\xd5\xd7\xc0\xf6\x64\xa9\xfe\x54\x7d\xa3\x4e\x37\xe2"
- "\x4b\xa3\xcb\x98\x37\x6f\x61\x91\xb5\x94\x4d\x74\xc6\x34\x9b\x35"
- "\x7d\x42\xe1\x14\xb9\x68\xd5\x3a\x7f\xde\x2c\x6b\xde\x9c\x09\xb6"
- "\xe2\x89\x8b\xd5\x6b\x5e\x5e\x2e\xbf\xa3\xe6\x30\xad\x3d\xce\x06"
- "\x8a\xec\xaf\x1d\xd3\x68\x68\xb0\x78\x0c\x93\xd5\x5c\xaf\x79\x45"
- "\x27\xdf\x83\x8e\x36\xb5\x8b\xfd\xe4\x25\x7d\x7f\x11\xe2\xf0\xfc"
- "\x0c\x91\xbc\xa2\xd3\x9b\xfc\x8f\xfc\x34\x79\x93\x57\x5f\xe0\x7b"
- "\xd2\x93\x76\x0b\x7f\x52\x60\xa8\xb2\x95\xf8\x86\x4f\xd2\x09\xbf"
- "\x87\x65\x49\xd9\x0f\xda\xc5\x92\x3e\xe1\x86\xff\x03\xbe\x34\xd8"
- "\xf4\x76\x5c\x8e\x41\xb9\x56\x74\x2e\xb1\x89\x5e\xd6\x1d\xf8\x07"
- "\xe8\x6f\x21\xcf\x38\x1e\x33\x6b\x40\xf9\xdf\xf0\x28\x5e\x34\xa0"
- "\x8f\x74\xf4\xbc\xc6\xdf\x3c\x7c\x43\xfe\x33\x4d\xb2\x8e\x3b\x2d"
- "\xb2\xad\x08\xee\x79\xe8\x19\xf4\x05\x9a\x74\x9c\xc0\x95\xa8\xd6"
- "\x55\x28\x7c\xf4\x05\xf7\x3f\x07\xab\xf3\x03\x3c\x76\xc1\xfb\x0b"
- "\x93\x6c\x06\xbe\xc7\x27\xbf\x7f\xbc\x06\x71\x23\x77\x9b\x79\x0c"
- "\x27\x7f\xa4\xcf\xe0\x60\x98\xd0\xb8\x46\xd0\x73\xc8\x18\xf4\xc3"
- "\x9f\x30\xab\x3b\xcb\xbb\xb4\x79\xdd\xc6\xe2\xfe\x79\x82\x08\xd9"
- "\x37\x4a\x7d\xf8\xcc\x69\x82\x1c\xea\xbd\xf7\xa5\x2a\xdf\x29\xe8"
- "\x34\x90\xda\x73\xde\xb8\x5a\xd6\x4b\x4d\x1f\xc1\x5f\x2f\xcf\xe1"
- "\x25\x05\x84\x97\xd7\xbb\x07\xe3\xa0\x93\x74\x05\xb6\xb5\xc7\xc1"
- "\xfb\x5e\xfb\xf5\xb2\x0c\x7a\x59\x06\xbd\xe4\xf9\x56\xe4\xef\x8d"
- "\x7b\x68\x1d\xea\xac\xe1\x0a\x35\x4e\x64\xfa\x99\x37\xf0\xdf\x13"
- "\x83\xe0\x95\x5c\x57\xc7\xfc\x49\x79\xbe\x92\xf7\x2b\x71\x59\x93"
- "\x02\x28\x73\x78\xb9\x8c\x41\xcf\x41\x27\xca\x65\x44\xb9\x6c\x57"
- "\xe5\xb8\x01\xef\x23\x83\x2d\x19\x13\xba\x0b\xe2\xdd\xdc\xf0\x32"
- "\x06\xf9\xfe\x18\x59\x86\x77\x37\xc6\x2a\xa3\x30\x72\x19\x99\x07"
- "\xef\x3e\xa1\xcd\xb7\x48\x3a\xd9\x6e\x75\xd1\xbb\x34\x72\x37\xef"
- "\xdf\x5a\xd1\x09\xbf\x77\x1e\xcb\xb0\xde\x29\x5c\x4c\x67\x2c\x79"
- "\x31\x3e\x85\xeb\x47\x89\x49\xbb\x1d\xeb\x40\x4b\x7b\x6c\x7e\xbf"
- "\x7b\xf3\xf6\xfc\x7e\xf7\x1c\xa7\x67\x3a\x78\x2f\x5a\x12\x1f\x54"
- "\x04\xfd\x86\x5f\xb1\x2f\x56\xbe\x23\x77\x37\x32\x5d\x31\xe3\xa0"
- "\xfb\x5d\x87\xb6\x44\xd6\x89\x60\xbd\x9f\x98\x7f\x0d\x08\x57\x63"
- "\xb2\x3f\x72\xf4\x8f\x1d\xbb\xf2\xcd\x49\x06\x6b\x1c\xd7\x31\xe9"
- "\x13\xa3\xbc\xb1\xf0\x26\x19\x5c\x7c\xd6\xd9\x3c\xd8\xaa\x98\xf1"
- "\xa8\x07\x56\xb1\xe7\xe1\xfb\xc0\xbb\x0b\x23\x77\x1b\x84\x37\xee"
- "\xe1\xe1\x23\x7d\x81\x34\xe6\x2b\x68\xb5\xa1\x8e\xbf\x29\xdb\x6e"
- "\x39\x96\xf1\x1e\xf8\xf0\xbe\xbc\xbf\xd2\x9b\xbc\xe2\x82\x5a\x9f"
- "\xf0\x5e\xaa\x87\xfe\x53\x67\x68\xad\xd1\x7b\x69\x1e\xc3\x1d\xca"
- "\xbf\x8e\xfb\xc6\x0f\xd1\xa6\xed\x0f\x3a\x93\x84\x75\x47\x92\xb8"
- "\x4c\xef\xfd\x32\x28\xd2\x8d\x68\xb7\xf6\x87\x74\x47\xed\x77\xd3"
- "\x75\x07\xe9\x0b\x63\xeb\xc5\x7b\xaf\xde\x5e\x2f\xde\x7b\x4e\x1b"
- "\xeb\x5b\xa7\xd6\x00\xbe\x77\x42\xef\x73\x88\x3d\xdf\xf8\xa1\xb5"
- "\x4a\xe6\x9f\xa9\xf2\x06\x4f\x02\x99\x6c\x67\x72\xc1\x37\x07\x60"
- "\xdb\x75\xdb\xc0\x3a\x94\xd4\xc7\xfd\x21\x92\x7a\x8e\x38\x1f\x6c"
- "\x4f\xad\x6a\x9f\xd7\x54\xb2\xaf\x1a\x74\xd6\x9f\x44\xfb\xf5\x0e"
- "\xaf\x81\xf7\x25\xe7\x2f\xeb\x71\x1e\xb3\x78\xe8\x6f\xda\x7d\xd7"
- "\xf9\xb9\x90\x4d\x5e\x8d\xda\xcf\x9e\x20\xef\x1e\x43\x3d\xe7\xfb"
- "\xc6\xb8\xae\x23\x2c\x15\x74\xf3\xdd\x63\xe8\x23\x1c\xcb\xd3\xdb"
- "\xfe\xa0\x33\x93\xf9\x2d\xed\xa9\x91\xfd\x61\xf0\xee\x4d\x63\xf0"
- "\xf8\x8d\x29\x16\xe2\x32\xdf\xd8\x33\xf6\xf8\xf7\x26\x93\xe9\xbf"
- "\x5a\xd6\x53\xd9\x34\x4a\xdd\xfd\xa8\x89\xfe\x75\x26\x19\x99\x0f"
- "\x1e\x3a\xb6\x4e\xf1\xee\x58\xa3\x2e\x1f\x0f\xbd\x27\xef\xe9\xe2"
- "\x31\xf8\x25\x01\xd1\xad\xe6\x14\x8e\xb5\xa0\x0d\xd4\xe6\xce\x1a"
- "\x12\x63\xb4\x0f\xd9\xd6\x92\x72\x6b\xe1\xe6\x6d\x9b\xc6\x8f\x1f"
- "\x1e\xa3\x2f\x71\xec\x82\xea\x4b\xfc\x38\x21\xbc\x2f\x81\x6f\x94"
- "\xbf\xbe\x33\xba\xef\x90\xbb\x56\x3b\xa6\x60\x6d\x06\x85\x7e\x4f"
- "\xa5\xdc\xa9\x61\x9f\xd3\x29\x77\xda\xf4\xb5\xcf\x14\x15\xfc\x3f"
- "\xe4\xbd\x7f\x40\x54\x55\xfa\x3f\x7e\x66\x40\x1c\x15\x9d\x81\x90"
- "\x26\xb3\x1c\x8b\x8a\x76\xad\x68\xb3\x5d\x77\x3f\xb6\x51\x69\x6b"
- "\x1b\x29\xb5\x96\x53\xa9\xe0\xcf\xb0\x10\x27\x44\x44\x45\x06\xc9"
- "\xe5\xeb\xba\x8a\xa3\xa9\x1f\x52\x34\xf6\xfd\xb6\x96\x36\x2d\x76"
- "\xd7\xdd\x37\x99\x3f\xa6\xc4\x96\x12\x18\x72\x6d\x17\x5b\xaa\x91"
- "\xc8\x88\x45\x1b\x05\x65\x84\x99\x7b\x3e\xaf\xe7\x9c\x7b\x67\x06"
- "\x04\x8d\x7d\xf7\x79\xf7\xfe\x7e\xde\x7f\xc0\x9d\x7b\xee\xb9\xe7"
- "\x9e\xf3\x9c\x73\x5e\xe7\x79\x9e\xf3\x9c\xe7\x99\xbb\x2c\x24\xf5"
- "\xee\x50\x3d\xdf\x86\x6d\xf8\x76\xd8\x88\xfb\x81\x1f\xba\xc9\x2b"
- "\x68\xdd\x79\xc5\x9f\xe7\xe3\x5f\x62\xec\x8e\x23\xdf\x40\x35\x59"
- "\x3e\x56\x03\x7c\xe3\xd7\x12\xae\x0f\x94\xfe\x31\xfd\x8c\xf4\x68"
- "\x46\xb4\xdd\x03\x99\xee\xbc\xb4\x01\x7f\x75\x74\x6d\xb1\x17\x38"
- "\x31\xa3\x41\xf2\x3b\xaf\x34\x20\x3d\x0a\xe9\x03\xa4\x1d\xcb\xab"
- "\x83\x20\x2f\x27\x0a\x5f\x08\xd9\xe4\x0b\xe1\x95\xb3\x44\xa3\xdb"
- "\xdb\xf3\x99\xf4\xc9\xf5\xca\x66\xf2\x95\xed\x66\xaf\x4e\x20\xfe"
- "\x82\xf2\x22\xed\x13\xcb\xb3\x2c\x81\xae\xc4\x0f\xbb\x51\x26\xdf"
- "\x38\xa3\x81\x6f\xb7\xd2\xde\x7e\x1c\xca\xbc\x8f\xf8\xb6\x30\xf3"
- "\x40\x7f\x47\xc1\xab\x89\x1a\x0f\x42\xf6\xa6\x7d\xf1\x1f\xda\x3a"
- "\x38\x0c\xf8\x3d\xac\xdd\xc8\x53\xc8\xb7\x88\x8e\xc5\xd1\xfa\x60"
- "\xcc\x49\x16\x67\x94\x68\x5d\x24\x4c\xd8\x29\xb0\xf4\xd5\x62\x0d"
- "\x17\x8a\xa4\x3c\x3a\x98\xde\xc7\xfa\xf9\xb5\x5c\x3f\x5f\xad\xd0"
- "\xe6\x02\x7e\x57\x6a\x63\xb5\xdb\x39\x97\x8c\xac\x79\x99\xf3\xe6"
- "\x5a\x6e\x5a\x3c\x98\x85\x44\x72\x4c\x9b\x97\x61\xc9\x9c\xf7\xfc"
- "\x92\x79\x8b\x85\xa0\x47\x4f\xbb\xef\xb1\x00\x83\x82\x71\x75\xc5"
- "\x59\x9b\xdf\xde\x4a\xb2\xb0\x71\xd5\x68\xa1\x4f\x97\xfb\x20\xc7"
- "\xe2\x95\xa2\xa1\x89\x52\x1f\xd9\x02\xba\x96\xa9\x3e\x75\x67\x54"
- "\x13\x1f\x77\x8a\x95\xdd\x23\xf7\xec\x7f\xbb\x44\xd2\xca\xf0\xcb"
- "\x8e\x82\xdf\xa6\x07\xf9\xb5\x32\x61\xff\x2a\x6d\xe7\x7e\xbb\x1a"
- "\x34\x9e\x1b\xe4\x41\xca\x4e\x13\x0e\x0a\x3c\xbc\x02\x16\xaa\xbc"
- "\x33\xbe\x53\x76\x27\xcf\xe6\x4d\x1b\x3a\x99\xd0\x07\x92\x8f\x75"
- "\x89\xaf\xbf\x75\x6b\x74\x04\xff\xd2\x44\x7a\x07\x4d\x3e\x9a\xe2"
- "\xbb\xc8\xf3\x96\x31\x3d\xe9\x1e\x80\x21\xee\x37\x32\x3d\x7a\x5e"
- "\xf0\x6a\x1d\x78\x99\x6a\xca\xb3\x53\xb5\x21\xe3\x51\x33\xaa\x3a"
- "\x0a\xca\xe2\x83\x72\x47\x59\xab\xe0\xe3\x3b\x69\xdc\xfc\xb6\x3a"
- "\x85\xd6\x08\x89\xdd\x43\xae\x54\x5f\x3e\x58\xea\xdc\x25\xbe\x95"
- "\xa5\xa9\x6d\x68\x25\xcc\x52\x6d\x10\xf5\x72\x5c\x97\xb5\x62\xcc"
- "\x55\x53\x5f\x00\xe7\xd7\x68\xf4\xa2\xf6\x52\xdd\x49\xaf\x0c\x1c"
- "\x76\xbf\xb9\xdc\xab\x97\x31\x10\x5f\x6d\x90\xf2\x51\x59\x5d\xe8"
- "\xde\x91\x94\x85\xca\x9a\x82\xfe\x06\x7e\x7b\x49\x1c\xae\x45\x19"
- "\x74\xac\xe5\xb9\x94\xa5\xb3\x9e\x9b\x97\xb2\xc4\x36\xc6\xb2\x24"
- "\x43\x6c\xcd\x09\x35\x40\xd6\x92\x39\xcf\x59\x08\x45\x52\x26\x24"
- "\x25\xa5\xdc\xff\xf8\x2f\x9e\x1c\xcc\xee\x9f\x85\xb4\xac\x45\x96"
- "\xa4\x84\x31\xf2\xd1\x63\x13\x1f\x78\x22\xe5\x81\x29\x8f\x4f\x9e"
- "\xda\x8b\x6d\x6c\x24\xc6\x44\x15\xfa\x68\x40\x23\x7b\x7d\xbc\xb4"
- "\x85\x78\x2d\xa7\xbb\x2d\xc4\x6b\xa0\xd5\x6b\xbb\xf1\x57\xc5\xd8"
- "\xeb\x71\xf8\x1b\x8f\xbf\x04\x39\x6e\x06\x01\x03\x5f\xdb\x15\x1c"
- "\x37\xf4\x4c\xda\x0b\x4b\xdd\xeb\x6b\xc0\xbf\x57\x7d\xa1\xcf\x82"
- "\x58\xf0\xbb\x3d\x02\x2f\xd5\x71\x41\xe3\x21\xc5\x67\x10\x63\x43"
- "\xf2\x2b\xaf\xf9\xb4\xb1\x21\xce\xdb\x21\x9d\x74\x66\xf4\x1c\xe3"
- "\x3b\x86\xf4\xcb\x18\x0b\x55\xb4\x2f\x4a\xe9\x3c\xea\x58\x8c\x5a"
- "\xee\x58\xd2\x37\x13\x3f\xab\xee\x9f\x0c\x6b\x61\xbf\x7b\x9e\x17"
- "\x94\x79\xa5\x2c\xf8\xda\xad\x62\xdc\xbc\x30\xe2\x7e\xb1\x0f\x25"
- "\xce\x35\xfc\x2e\x2d\x38\x7e\x5e\xa7\x73\x0d\x02\x17\x24\xf6\xfe"
- "\x6e\x75\x0f\x3d\x4e\x18\xd2\x8a\x35\x7f\xd5\x59\xa3\x99\x3e\x7c"
- "\xb4\x83\x6d\xd6\x73\xf0\x0a\xbf\x9b\x24\xed\xe1\x7e\x57\xa1\xf1"
- "\xcf\xf8\x8d\xf9\xff\xb9\xad\xa7\xfe\xab\x28\x44\xff\x95\x67\xe3"
- "\x27\x6b\x6d\x1e\xe2\x91\x9d\x2e\x8f\xf0\x93\x78\x6f\xad\xad\x9d"
- "\x7c\xeb\x0d\x3e\xc5\x5e\x1f\x6a\xf7\xf3\x4e\xfc\x1e\x81\xb6\x89"
- "\x35\xe4\x0e\xa9\x53\x80\x3c\xf6\xfa\x3d\x52\x36\x91\xe9\x44\x77"
- "\x37\x7b\x8d\xec\x98\xc2\xa9\x7f\xf0\xbb\x18\x7d\x94\xd8\x1b\xee"
- "\x0d\x5b\xa5\x57\xfd\xd1\xbc\xbe\x91\x64\x54\xa2\xd5\x8b\x7a\x25"
- "\xed\xc5\x02\xfc\xe1\x4a\xd8\x17\xe4\x2f\xb9\x57\xd2\xf6\x75\x47"
- "\x65\x4e\x2b\xad\x9b\xde\x3e\xed\x14\xb3\x79\x83\xd6\x9f\x53\xfc"
- "\x9e\x7b\xa9\xbf\x3a\x0a\x5e\xaf\xd2\xfa\xb2\xed\xf6\x67\x6c\x61"
- "\xab\x98\xe5\x70\xc9\x0f\x28\x1d\xf3\xff\xf5\x49\xaa\x1d\x66\x7b"
- "\xcf\x77\x81\xc3\x89\xf2\xfd\xdd\x06\xed\xfd\x9e\x7e\x4e\xc5\x41"
- "\x41\x52\x72\xfd\x44\xa8\xc2\xe2\xd5\xb0\xb4\xdd\xce\xfc\xd0\x59"
- "\xce\x4a\x39\x26\x35\x1d\x9c\x49\xb6\x67\x0f\x64\x09\xc8\xdf\x9b"
- "\xa6\x7e\xa0\xea\x01\x30\xb7\x77\xbf\x72\x3b\x63\xe9\xed\x4b\xad"
- "\x01\x1d\x0a\xe9\x3e\xc8\x77\x19\xea\xe1\x08\xd1\x91\x05\x6c\xc5"
- "\xdc\x6c\x0f\xc9\xc4\x0e\x94\x53\x4d\xe5\xd0\xbc\x92\x7a\x9b\xdd"
- "\x4e\x57\x3b\x63\x28\x2f\x43\xec\x81\x16\xec\x36\x8b\xb1\x07\x59"
- "\x5b\xc8\xf9\xb9\xfc\x4b\xd5\x96\x42\xf0\x2e\xf2\x5c\xd0\xee\xf6"
- "\x80\x2e\x48\x9c\x91\xd9\x6d\x23\xfb\xd0\x8e\x82\x3d\x91\xbd\xe9"
- "\x0b\x81\x0f\x69\xb3\x32\xe6\x2e\x9a\x3f\xff\xca\xd0\x10\x6a\xb3"
- "\xe9\x28\x50\xd6\xa0\x4c\xc8\xbf\x9b\xcd\x72\x9c\xee\x01\xfe\xaf"
- "\x4d\x93\xfc\xdb\xd3\x5f\x61\xde\x5c\xd7\xc2\xf6\x54\x69\xfc\xbb"
- "\x9c\x47\x7b\x8e\xf3\x82\x3d\xe6\xe0\xdc\xd8\x53\x7a\xe9\xdc\xd8"
- "\xb3\xb7\xf7\xb9\xb1\xa7\x1e\xeb\x6c\x03\x9e\x1f\xc7\x37\xc5\xde"
- "\x0b\xdd\xab\x3c\xb8\xd3\xe8\xbb\x57\xf0\xe0\x29\xcb\x98\x8e\xf8"
- "\x6f\xd2\x4d\xd3\x7a\xe0\x87\x5c\xeb\x07\x46\xa4\xf8\x98\x89\xd6"
- "\x82\x0d\x19\xa4\x77\x1c\xc5\x7d\x17\xb8\x3b\x65\x19\xf0\x02\xf7"
- "\x45\x2d\x72\xbf\x76\xe6\x79\xc8\x21\xf8\xbd\xe1\x14\x61\x85\x42"
- "\x4e\xd5\x99\x5c\xaf\xdf\x98\xa4\xf1\xb8\xc6\x55\x16\xe1\x6b\x57"
- "\xac\xdb\x18\x67\xb4\x6e\xa7\xf8\x8d\x4e\xb9\x6e\xbf\x61\xbb\xac"
- "\x8e\x3b\x6a\x5f\x5d\x6f\xe9\xa8\x63\x25\xd5\x0b\xf5\x2c\x47\xbd"
- "\xf6\x52\x7d\x8a\xe6\x53\xbb\xc2\xee\x32\xfa\x12\xc4\x1e\x03\xd5"
- "\x73\x66\x3b\xbb\x8b\xea\x37\xf3\xf9\xbb\xd8\xce\xf9\xb4\x4f\x2c"
- "\xed\x83\xd4\xb1\x14\x8e\x31\x33\xf0\x14\x7b\x33\xae\x5d\xc4\x3e"
- "\x7c\x03\x58\x64\xa8\x94\x7c\xb0\xdc\x83\xa1\x3c\xf4\x4c\x8e\xd3"
- "\x37\xe3\x0e\xe7\x50\x9d\xdf\x8c\xd3\xf2\x85\xd6\xed\x81\x59\x36"
- "\x30\x96\x0b\xe6\xcf\x9f\x97\xb9\x58\x8b\xe3\x1c\xbf\x28\x7d\xee"
- "\x3d\xea\xb9\xd9\x8c\x79\x4b\x53\x16\xcc\x15\x76\xf9\x48\x95\x3f"
- "\x7b\xf0\x1a\x63\x48\x16\x10\xb6\xae\x82\xcf\xd8\x4b\x36\x5c\x82"
- "\xe7\x68\x64\xe5\x0e\xb9\x8f\x5d\xfe\x90\x5c\x07\x86\x2c\x45\x3d"
- "\x76\x6b\xeb\x00\xe9\x23\xda\xd8\xe8\x35\xb4\xbf\x44\x67\xa1\x69"
- "\x1f\x8b\x74\x12\xc8\x53\xe7\x66\x6f\xe4\x6a\x63\x7b\x3d\xd2\xe9"
- "\xfc\x85\x33\x83\x6c\xf6\xf6\x8e\x56\x36\x4e\xab\xe4\xd1\x13\x72"
- "\x80\x01\x91\xb4\x36\xd0\xbe\x8a\xf4\x9b\x5f\x3e\x92\xb0\x8d\xf4"
- "\x66\xce\x0c\xb2\x81\x7b\x93\x74\x1d\x26\x37\xdb\x1b\x07\xb9\xa8"
- "\x72\xf5\x72\x66\xa0\x6f\x60\xdd\x70\x4b\x1d\x6c\xf9\xb8\x77\x72"
- "\x19\x53\xd7\x0e\xf7\x7a\xa1\x13\x2c\x97\x31\x03\x1c\xd3\xea\x55"
- "\x9d\x43\x3d\xf2\x61\xfc\x0f\x65\xb2\xce\x13\x4a\xc5\xfe\x99\xc0"
- "\x85\xf2\xd5\x7c\xd3\xc4\x04\x61\xa7\xb8\x69\x42\xa9\xc2\xd3\xc2"
- "\xe8\x1e\xb8\x3c\x18\xfc\xfe\x6e\x6e\x8f\x67\xaa\x6d\x63\xd8\x29"
- "\xf6\xfb\xa1\xa4\x33\x45\x7f\x94\x10\x2d\x50\x7e\x93\x5a\x7e\x13"
- "\xca\xc7\xfa\x77\xad\x1a\xb3\xb2\xbc\x5a\xfb\x16\xc6\xb6\x07\x6b"
- "\x57\x25\xad\x5f\xa8\xff\x7e\xfc\x39\xa5\x7e\xc6\x0b\x39\x69\x54"
- "\x40\x3f\x23\x79\xa4\xdf\x87\x6b\x63\x92\xbe\xad\xb6\xc1\xad\x14"
- "\x08\x9f\x89\x3a\xf5\x5b\x6e\xd2\x15\x68\x65\x72\x94\xc9\x2f\xb4"
- "\x96\x62\xad\x31\x60\x8e\x79\x86\xad\xc2\x9a\x42\xdf\x20\x1e\xb7"
- "\x7d\x14\xc7\x9a\xe3\x4f\xf1\x87\xcb\x73\xeb\xcb\xd8\xd0\x50\xfe"
- "\x16\xdf\xcb\x0a\xf2\x64\x28\xe3\x02\xb0\x2c\x8f\x0e\x43\xfc\x5e"
- "\x9c\x25\x20\xbb\x10\xea\xd7\x4e\xf4\x13\xfa\x2a\x1f\xdf\x29\x07"
- "\x5f\x3e\x14\x74\xf8\x3d\xf5\x57\x91\x82\x39\xd7\x29\x78\x75\x23"
- "\xc5\x38\x6f\x64\xbf\xdf\x41\x7d\x45\x65\x71\xc7\xc4\x64\x5f\x87"
- "\xf5\x67\xe4\x37\x8a\x68\xbd\x32\x97\x37\xd3\x5e\xdf\x29\xf6\xc7"
- "\xd1\xc4\xc3\x82\xaf\x17\xbf\xed\x73\xb9\x22\xfa\x5a\xd8\x3b\xfe"
- "\x71\xf4\xca\x66\xae\x5c\x2c\x60\xbc\x0a\x58\x7a\x51\xcf\x7c\x5e"
- "\xc8\xa0\xa8\xb7\xde\x7e\x9a\x7c\x5b\x95\x62\x7e\xad\x61\xf8\xae"
- "\xa1\x68\x39\x33\x91\x5f\x30\xbb\x8d\x7b\x6b\xdb\x4b\x58\xad\xad"
- "\x84\x7d\xe0\xdb\xcc\x9c\xd9\xa4\xd3\xfc\x63\xd5\xd1\x9c\xcd\x64"
- "\x5f\x3e\x08\xbf\x7f\x65\x79\x82\xbe\xf5\x87\xd4\xa3\xc7\x8f\xb1"
- "\xa3\xce\x63\xcc\xf2\x94\xb8\xb7\x55\x5b\x3f\x60\xd5\x89\x1f\x30"
- "\x7b\x13\x57\x88\x1f\xca\x5b\x48\xdf\x58\x83\xb2\x4a\xc9\x87\x96"
- "\x49\x69\x33\x0f\x46\xfb\xc3\xa7\xe4\x30\xb1\x9f\xe8\xcc\xd8\x87"
- "\x3a\xfe\xe1\xec\xce\x73\xcc\xe0\xcc\x78\x57\xfc\x16\xfa\x05\xb4"
- "\xd7\x35\xb7\x5e\xd8\x9a\x91\xff\x30\x57\x4e\x33\x9d\xd3\x54\x36"
- "\x50\x1d\xfd\xb2\xde\xa0\x57\xb8\xf6\xfe\xcb\x79\x81\xf7\x85\x4d"
- "\xe3\x0e\xa2\x07\xea\x54\x33\x55\xd2\xa4\xba\x1e\x34\x7d\x42\xa5"
- "\x8f\x35\x94\x3e\x7f\x30\x11\x7d\xc8\x8e\x54\xc9\x6e\x2d\x45\xdd"
- "\x12\x41\x03\x45\xfb\x06\x8d\x01\xda\xf7\xa2\xf2\x8b\xce\xb1\x48"
- "\x67\x06\xd9\x99\xfe\x71\x89\x31\x39\xdc\xa0\x5c\x38\x5d\xbe\xe1"
- "\x3c\x0b\xa7\x7e\xa3\x75\x76\x83\x78\x2e\x68\x6e\xa5\x3e\xf3\x44"
- "\x4d\xad\xc0\x1f\xc6\xe7\x54\x27\x8d\x3d\x5c\x2b\xd1\x5f\x6b\x40"
- "\x27\x0f\xfa\xaa\x94\xae\x72\x3c\x4e\xf4\x90\x5f\x45\x5a\xcb\x30"
- "\x56\x82\xe9\x9b\x26\x7e\xed\xc3\xdc\x51\x84\x9c\xf6\x07\x8f\xb2"
- "\x71\x56\xbd\xb4\x39\x7c\x33\x61\x07\xf8\xe2\x92\x4d\xe2\x5c\x7b"
- "\x24\x78\x79\x92\xcf\xd9\x36\x71\xfe\xe5\x8f\x81\xf5\x6f\xad\x88"
- "\x39\xfe\x47\x8b\x5e\xd8\x96\x4d\x53\x7d\x74\x4d\xc3\x1a\xb2\x17"
- "\xf2\x6f\x6c\x9d\x9c\x13\xe5\x4e\xa1\x87\x00\x0e\xf4\xc5\x93\x00"
- "\x97\xab\xc9\x56\x8f\x5f\x6b\x65\x91\x3a\xee\x89\x4c\x35\x72\x97"
- "\xaf\x92\xc6\x50\xa4\x18\xfb\xf2\x19\xf8\x48\x8f\x11\x58\x5e\x87"
- "\xf4\x70\x2d\x9d\x70\x5d\x81\x6c\x49\x72\xed\x94\x65\x46\x9e\x77"
- "\x9e\x8d\x14\x3a\x22\x2d\x7d\x99\xc7\x58\x6b\x66\x64\xbb\xef\x23"
- "\x7f\x16\xf4\x0e\xd2\xc3\xb0\x0e\xec\xc7\x77\x9d\xc8\x1f\xa3\xe5"
- "\xe7\x6d\xd6\x70\x57\x4e\xa5\x98\x67\xe4\xf3\x48\x5b\x17\x90\x3e"
- "\x60\x4a\x8e\xc7\x28\xfa\x4c\x4b\x5b\x6c\x15\xeb\x18\x9d\x9d\x07"
- "\x9f\xca\x45\x7d\x4e\x89\x74\x1d\xe4\x4c\x11\xd3\x3c\x24\x4d\x4f"
- "\x7e\x0a\xc8\x87\x5d\x48\x5a\x18\xea\xcc\x02\xf7\xf8\xf6\x86\x67"
- "\xc5\x7e\xbf\x79\xca\x32\xda\x2f\xc3\x77\x9e\x55\xbf\xbd\x8c\x33"
- "\xe9\x17\x53\xa6\xc9\x35\xf3\x4f\xb9\xa1\x32\x2e\xed\x51\xd0\xb7"
- "\x95\x36\xab\xde\xdf\x66\x0d\xa3\xef\x53\x59\xa4\x9f\x14\xb1\xd5"
- "\x7d\xcd\x8c\x7c\x32\xf3\x8d\xc7\x12\x38\x9d\xd5\x40\xb9\xa2\x3e"
- "\x39\x90\xff\xa3\x8e\x95\xf7\x6e\x0b\x73\xa8\xd9\x99\xf7\x14\xc6"
- "\xf4\x9f\x57\x13\xa6\xf8\x4d\x56\x60\x00\xd9\x2f\xfc\xc9\x4f\x7d"
- "\xea\xc7\x3c\xf7\x47\x59\x5b\xef\x68\x66\xba\x3c\xcc\x1d\xb9\x8f"
- "\xf7\xe7\xeb\x88\xa7\xb2\x2b\x9c\xe3\xb7\x89\xc6\xae\xb1\x95\x6c"
- "\x58\xac\x1e\x61\x37\x12\xfd\xb6\xdb\xe5\x6d\x66\xd5\xf9\x1f\xb3"
- "\x6a\x9f\x2b\x7f\xff\x39\x4f\xb8\xb4\x1f\x09\x47\xb9\x7f\xbe\x93"
- "\x9e\xd9\x31\x5f\x52\xfc\xa5\x7d\xcb\x81\x90\x2d\x40\xbb\xcf\xe4"
- "\x5a\xf0\xe7\xd5\x9a\x3c\x71\x85\x36\x34\x90\x1f\x42\xb2\xaf\x53"
- "\x36\x6d\x23\x3f\xd5\x76\xde\x11\xcf\xee\x58\x4e\x7a\xdd\x3f\xef"
- "\x1d\xd6\xce\x12\xd5\x72\xbf\x56\xcb\x6d\xb8\x5c\xb9\x34\x6e\xab"
- "\x8b\xa5\xcd\x86\x12\xbd\x8d\xf9\x51\xb6\x3f\x7a\x5b\x22\xd6\x1a"
- "\xbb\xfd\x22\xe9\x4e\x2a\x46\xe3\x3b\xac\xd6\x57\xc7\xc8\x97\xe9"
- "\x4e\x05\xeb\xf5\xd7\x66\xa6\xda\xca\xd8\xcf\xb0\xff\x18\xaa\xf0"
- "\x78\x13\xe4\x1c\xd2\x95\xda\x09\x67\x49\xf7\x9c\xe7\x67\x11\x2e"
- "\x20\x3c\xf9\xe0\x43\x19\xc3\x8f\x90\x5e\x1a\x58\xe5\xe7\x66\xfd"
- "\x81\x0b\x6e\xb6\x01\xf8\x2d\x7c\xf2\xbd\x70\xed\xb6\x61\xab\xd8"
- "\xbd\x5c\x6f\x14\xb6\x50\x58\x5f\xcc\xe8\xdb\x71\xd2\x36\x67\x5a"
- "\x6b\x88\x5d\x4e\x18\xbe\xb5\x91\xec\x72\xb8\x69\x5a\x79\x09\xad"
- "\x99\xe8\xb3\x8e\x82\xff\xd8\xef\x66\x7f\x12\xbe\x4f\xd6\x91\x1e"
- "\x40\xe0\x7c\xc5\xad\x9e\xa8\x2d\x6e\x2a\x83\x7c\x03\x29\xd9\xbe"
- "\xf2\x0d\x67\xc1\xf7\x08\x7a\x54\x0c\xaa\x6d\xed\x70\x72\xc7\x16"
- "\x37\xcd\x23\xb5\x6c\x23\xca\x3e\xc1\x37\x6e\x81\x9c\x50\x11\x2f"
- "\xfb\x86\x7e\xff\x87\x38\xff\xed\xeb\xa2\xf3\x3c\xff\x61\x2b\xe9"
- "\x24\x9d\xdc\x7f\x8c\x04\x5f\xe8\x6c\x33\x6d\x71\xff\xc2\x9c\x0f"
- "\x1e\xa0\x62\xbc\x5b\xef\x69\x10\x6b\xbb\xea\x5f\xb0\xaf\x3d\x28"
- "\xbe\xdd\x3c\xd8\x85\x42\xc0\xe3\xc6\xb4\xb0\x7d\x7b\x3a\x21\xe7"
- "\x77\x61\x6d\xed\x84\x9c\xc0\xb7\x5b\x23\x8b\x46\xb0\x04\x3c\x1b"
- "\xd1\xc2\x2a\x36\xfa\xf4\x2c\x06\x7f\x26\xcf\xb5\x69\x83\x50\x6e"
- "\x22\xe9\x3f\x6b\xce\xd1\x9e\x6c\x85\xc0\xfd\x0d\xdb\x58\x9c\x82"
- "\xf2\x48\xef\xba\x61\x04\x8b\x23\x9d\x2b\xd2\xe2\x53\xfc\x72\x4f"
- "\x42\x93\xa9\x5e\x18\xc1\xc6\x74\xff\x6e\x85\x7a\xc6\x6f\x9f\x58"
- "\xe3\x97\x7a\xd8\xf5\xb6\x9f\xf2\xc6\x53\xec\xad\x74\x5e\x10\xc6"
- "\xf9\xb5\x66\xbd\x94\x29\xde\x7a\xdc\x58\x2c\xc7\x9d\xd0\xc1\x63"
- "\xbc\xd1\x1e\x87\xaa\xdb\xd5\x09\xbf\x8a\xd1\x33\x72\xe9\x3c\x85"
- "\x48\xd3\x99\x88\x96\x26\x51\x0f\xd5\x17\x9a\xff\x85\xef\xa5\x52"
- "\x19\x54\x9f\x94\x59\x52\x2f\x4c\x7e\xd2\x40\x63\x11\x67\x6a\xdd"
- "\x36\x16\xf9\xeb\x6d\xcc\x54\x33\x9f\xda\xf5\xd6\x6a\x39\x17\xc3"
- "\x19\xd5\x57\x71\xd0\x3c\xc3\x98\x40\xbd\xe9\x7b\x34\x36\x6a\x7d"
- "\x5f\x3b\xed\x59\x5c\x71\x3e\x4b\x3e\x05\xde\x3a\xe2\xcc\xdc\xcd"
- "\xa6\x34\xf9\xa4\x6f\x9f\xe9\xcc\xf3\x32\xca\x7b\x79\x04\x33\xa1"
- "\xac\x0f\x5d\xe9\x84\xb5\xe6\x1b\x9c\x99\x7b\xa9\xec\x2f\x68\x3d"
- "\x5a\x0f\xfa\xc8\x75\x69\x5f\xb1\xcb\x5b\xcf\xc8\xaf\xfc\x64\x1b"
- "\xf7\x53\x39\xa7\xd8\xbe\xeb\x44\x7b\xb7\x9b\x2d\x29\xd2\x97\x9d"
- "\x68\x6b\x40\xdf\xae\xb6\xc3\x75\x8e\xca\xdb\x97\xe0\x4a\x05\xcf"
- "\xa9\xb6\x49\xa3\xb5\x1c\x5f\xfb\x16\x3a\x33\x77\x31\xea\x1f\xca"
- "\x8f\xfb\xe9\xae\x56\xe4\x3d\xdd\xbd\x5f\x28\x0f\x9e\xad\x47\xb9"
- "\x3f\x0a\xee\x23\xd1\xfe\x46\x30\x4f\x09\xda\x03\x5a\xd5\x6d\x07"
- "\x8d\xa4\x7e\xed\xad\x8b\x54\x57\x37\x7b\xcb\xeb\xca\xfa\xb8\xf7"
- "\x73\x4c\x98\xfb\x18\xf7\xab\x6a\x85\x6e\x69\xdf\x57\x93\x7d\x0a"
- "\x97\x78\xf6\x76\x09\xe6\x16\xd6\xb9\xb7\x4b\x08\x0b\x04\x9e\xdc"
- "\x4e\x7b\xbf\x6f\xef\x30\xea\x64\xff\x52\x5b\x88\x67\xea\xad\x8f"
- "\x43\xf4\xfa\x64\x2f\x17\xe8\x63\x6e\x3a\xd4\xac\xd0\x7e\xcd\x08"
- "\xd0\xbb\xcb\xcc\xe4\xf8\xe3\x0e\x94\xbb\x5e\xce\x23\x6b\x82\xea"
- "\x1f\x2e\xa1\x2d\xca\xea\xe5\x2b\xcc\x4c\xb3\xd9\xc3\xfc\x15\x7b"
- "\xd1\xf8\xa6\x99\x30\xea\x65\xbd\x9c\x3b\x54\x47\xf5\xdd\x31\x72"
- "\x1f\xf9\xed\xe9\x78\x7f\x4c\xaf\xed\x0d\x1b\x41\x71\x84\xed\xe4"
- "\xb7\x4f\x9c\x2f\x00\x56\x61\x3d\x88\x70\xb5\x77\x32\xb9\xb7\xbd"
- "\xff\x1a\x8a\xf1\x4e\x67\xcb\xb4\xba\xf5\x4f\x07\xff\x76\x93\xd4"
- "\xc1\xef\x8f\xd3\xe4\x4d\x6e\x02\x8d\x0b\x8c\xc2\xc7\x38\xf8\x2e"
- "\xa5\x3d\xea\x10\xf8\xec\x63\x16\x39\x6f\xf6\x27\xf1\x28\x89\xb7"
- "\x29\x5e\x96\x4f\xed\x52\xe5\xae\x08\x6a\x33\xca\x49\xd7\xf6\x82"
- "\xb5\xb2\xfb\xf4\xdb\xaf\xb5\x0d\x6d\x92\x67\x92\x0f\x35\x8b\xb6"
- "\x91\x5f\x0d\xd9\x36\xb1\x97\xd9\xbf\xf6\xec\xdf\x2b\x69\x7b\xc8"
- "\xe3\x1c\x41\x65\x1c\x5c\x25\x6c\xfa\xd1\x27\xc0\x87\xab\x5b\xd8"
- "\x81\xf1\x7c\xf0\xaf\x07\xf7\xaf\xcc\x03\x32\x46\xa2\xe3\x98\x65"
- "\x0b\x30\x58\x9e\x33\x22\xfb\x96\x83\x0b\x80\xe5\x16\x92\x61\xda"
- "\xf0\x3d\x8c\x8f\x10\x1c\x3a\xd0\x4a\x7d\x75\xfb\x6e\x96\x28\xc7"
- "\xe1\x81\x93\xa4\x97\x90\x71\x55\x0e\x38\x30\xee\xa5\xed\x44\xc0"
- "\xbe\x53\x27\xec\x3b\x43\x31\xb6\x9f\x75\x94\x32\x4d\xf4\x5b\xe0"
- "\x31\x0f\xe4\x0b\x1b\x1e\xd4\x77\xa9\x4f\xc3\xbf\x03\x90\x31\x20"
- "\x27\xe6\xa9\x3a\x42\xc2\xb2\x3c\xe9\x97\xab\xa3\xe0\xa0\x25\xa0"
- "\x23\xa4\x73\x98\x05\xbc\x8a\xf2\xa1\xef\xbf\xa6\x3c\xd2\x6f\x50"
- "\x8b\x7a\x46\xf1\xe0\xdd\xea\xf9\xc3\x78\xb2\x6b\xc2\xbb\xd3\xdd"
- "\xac\x51\xc8\xab\x44\x03\xfa\xb6\xa8\xbb\x9e\xf4\x81\x07\x73\x82"
- "\x3a\xd9\x03\xf2\x4c\xa3\xb0\x7f\x39\xe8\xd0\xc6\x08\xda\x1b\x21"
- "\x7d\xe9\xef\xbf\x78\x78\x0c\x13\x63\xa0\x8d\x9b\x07\xdf\x58\x42"
- "\x63\xf2\x60\x45\x28\x9d\xa6\xf8\x14\xbb\xc4\xa0\x03\xa5\x5c\xcc"
- "\xf5\x03\xa5\x57\xe6\x27\x0e\x0d\xd5\x78\x11\x49\x67\x13\xf0\xe5"
- "\x9d\x7a\x41\x6b\xc7\x44\x07\xf9\xba\x5c\x91\x47\xbe\x7b\x0f\xd5"
- "\x90\x8f\x64\x9f\x63\x62\xb9\xdf\x6e\x26\x9f\x90\x4c\x71\x4c\x74"
- "\x9e\xb2\x31\x7d\x8a\x8d\xf4\xd0\x5b\xca\x49\xc6\x83\xcc\x6a\xe2"
- "\xd1\xe0\x4f\x30\xcf\x57\x2e\x60\xc6\x19\x69\x28\xdb\x1e\x1f\x43"
- "\x3e\x8c\xc9\x7f\x31\xf9\x1f\xf7\xdb\xe3\xa3\xf1\x3b\x16\xfc\x9c"
- "\x89\x9b\x26\x96\xd2\x5e\xb6\xbf\x80\x03\x8f\x1b\xc8\x8f\xb2\xde"
- "\xe5\xf1\xb2\x95\xa7\x99\x81\x7c\x24\xfb\x36\x6e\xa9\xaa\x6d\xff"
- "\x44\xc8\x37\xc3\x6c\x2c\x06\xfc\xc7\x48\xd0\xdc\xac\x44\x6d\x81"
- "\x1c\xba\x65\xaf\x6c\xf7\xd7\x5c\xb6\x5b\xd6\x9b\xea\x2f\x31\xee"
- "\x67\xce\x3c\x51\xf7\x77\x9e\xf7\xa1\x7c\xc5\x91\xb4\xdf\xef\x48"
- "\xaa\x90\xe7\x60\xab\x59\x5e\x16\x6f\x76\xb5\x57\x43\xe6\x3a\x2f"
- "\xe2\x45\xd1\x5e\x39\xb5\x91\xda\x47\xdf\x3e\x7a\xee\xb4\xf0\xf9"
- "\xec\xc3\xbd\x3d\x5d\x7d\xa7\x15\xef\xb4\x56\xb3\x4e\x47\x92\x68"
- "\x7b\x6d\xbb\x7c\x37\x45\xfc\xa6\xf7\x43\xe8\xa0\xb6\x39\x40\x07"
- "\xb4\x9d\xda\x47\xed\xf7\x11\x4d\x40\x03\xb5\xad\xe6\x2e\xb5\x9d"
- "\xd4\xc6\x0f\xb0\xea\x6c\x43\x3b\xd1\x56\xd1\xce\x2e\xb4\xb3\x2a"
- "\x8d\x31\xef\x26\x27\xbb\x18\x9d\x54\x41\x32\xaa\xfd\x43\xf0\xf0"
- "\xb9\x0e\x06\x59\x34\x7c\x4f\x9e\x43\xbf\x16\xbc\x49\x9e\x07\x32"
- "\xa9\x87\x37\x93\xbd\xab\xcb\x86\x3f\x5f\x09\x23\x1e\x47\xe3\xd7"
- "\xf1\x6d\xf3\x51\xe5\x0b\x96\xd7\xcc\x9b\xc1\x9b\x7a\x5d\x3e\xe4"
- "\x49\x43\xfb\x21\xc3\x9e\x52\xeb\x4f\x79\x57\x9e\x95\xed\x32\xa6"
- "\xb3\x98\x43\x4f\xad\xd1\xbb\xea\xd7\x30\xad\x2d\x33\x91\x0f\xed"
- "\x31\xa3\xac\xa1\xd4\x1e\x05\xed\xdc\x8e\x7a\x7a\x43\xda\x54\xd3"
- "\x4a\x36\xb7\x1f\xb1\xc1\xc9\x4c\xb7\xed\x0c\xda\x71\x86\x99\x1d"
- "\x79\xe0\xbf\x1e\x23\x7e\xd1\xf9\xda\x10\x2b\x03\x96\x1e\x92\xf1"
- "\x2a\xa5\xff\xd5\xe1\x2d\xec\x9d\x0f\x03\x3e\x56\xc9\x6f\x75\xd4"
- "\x96\x6a\x1a\x47\xc2\xd7\x2a\xad\x19\x1d\x18\x33\xb4\xa7\xbd\x14"
- "\xdf\xe8\x88\x8f\x15\xf5\x29\x18\x4b\x36\xb5\x91\xb8\x27\x3e\x98"
- "\xce\x98\xe9\xf0\x5e\x15\x07\xcd\xa8\x7c\xf0\x73\x7b\xe9\x4a\x34"
- "\xec\xd5\x3e\xf5\x0d\x36\x0e\xdf\x68\x25\xf9\xbb\x3c\xcf\xa3\xff"
- "\xe5\x1b\x6c\x4c\xff\x30\xe5\x5d\xd6\x17\x7e\x93\x2e\x93\xca\x43"
- "\xdb\xa2\x5b\xd8\xbb\x5f\x74\x9f\x63\x16\x81\x65\x12\x07\xdf\xdd"
- "\x4d\xba\xc2\x7e\x7e\x57\xf0\x70\x64\x8f\xd0\xcf\xf7\xca\xb5\x7a"
- "\xe0\xf7\x25\x76\x44\x5a\xdd\xfb\x4f\x87\xc3\x86\xbe\xca\x5a\xbf"
- "\x55\xd8\x13\xda\x8b\xb6\x02\x2f\xc0\x2b\x1c\x36\xd3\xbe\x03\xd6"
- "\xce\x5d\xed\x6c\xf1\x0e\x66\xb0\x9f\x26\xbd\xd0\x23\xec\x70\x49"
- "\x02\xdb\x79\x8e\xfc\x3c\xc5\x47\xbf\x78\x0e\x7d\xa9\x62\x08\xf1"
- "\xa4\xa4\x73\xe5\x8b\xe3\x4d\x1b\xb6\x6a\x3c\xfc\xe1\x0f\x73\xcf"
- "\x33\xbd\x8c\xd1\x7d\xb8\x6e\x82\x85\xfb\x36\xeb\x95\xb4\x12\xf2"
- "\x1d\x1c\xbd\x2f\x81\x7c\x07\x6b\xfe\x78\x05\xef\x93\x83\x39\xd7"
- "\x66\x1e\xbc\x3e\x93\x8d\x21\x1f\xe2\x46\x8f\xe4\xe5\xe4\x7a\x5d"
- "\x49\xfb\x21\x26\xd5\x47\xaf\x49\xfa\xe8\x7d\x77\x12\xd9\x67\xab"
- "\xcf\xef\xf4\x43\x86\x11\xe5\x66\xb2\xb8\x92\x73\x2c\x9e\xf8\xa0"
- "\x94\x2f\x24\xcf\x46\x72\xe1\x23\xad\x46\xee\xff\x67\x3c\xdb\xd1"
- "\x12\xf4\x31\xee\x59\x4c\x7e\xc9\xb9\xb9\x2f\x5b\xe3\x0d\xb1\x62"
- "\xef\x5d\xf8\xb7\x24\x9d\x3c\xee\xd9\xe6\x4d\x2c\xfc\x30\xd9\xf1"
- "\x95\xca\x73\x4b\x87\x7d\xd2\x36\xb6\xa3\xa0\xb2\x54\xf3\xbd\xdc"
- "\xe7\xde\xb2\x43\xca\x3b\x4a\x04\xe4\x2f\x4f\x87\x53\xfa\x0d\xac"
- "\x6c\x76\xad\x56\x42\x64\x9c\xca\xf7\xe9\x19\xa5\x91\x2f\xa6\x44"
- "\x41\xcb\x23\x26\x92\x7b\x54\x99\xf1\x90\x25\x90\x26\x79\x18\x61"
- "\x9f\x6c\x96\x7b\x65\x58\x9b\x86\x75\x14\x1c\x19\xa3\xad\x67\xb4"
- "\xae\x4b\xdd\xf0\x91\x44\xb7\xbe\x2d\xe6\x32\xf5\x33\xa9\xf6\xd4"
- "\xb4\xcf\x91\x88\xfc\x36\x6d\x7d\x13\xfb\x9d\x2f\x8c\xb8\x7f\xf1"
- "\x32\x36\xf2\x17\xd7\x18\x18\xed\x95\x21\x6f\xb3\x5c\x77\x8f\x14"
- "\x07\xf5\xe9\x89\x82\xde\x74\xae\x58\xc8\x18\xe4\xaf\x4f\xfa\x11"
- "\x6f\xd5\xfc\xf6\xc9\xf5\xf7\xc8\x9f\x42\xbe\x53\x1f\x58\x47\xf1"
- "\x0d\xb2\xd7\xa6\xf2\x25\x6f\x72\x64\x9d\x38\x7b\x86\x7c\x72\x7d"
- "\x3d\xb2\xee\x32\xbc\x58\x3c\xd1\x57\x51\xe5\x49\x57\xeb\x97\x92"
- "\xbe\x39\x2c\xec\x8e\xcd\xcc\x7c\x28\xcf\x1d\x3e\x4c\xfa\xc5\x35"
- "\x36\xb2\xf7\x6e\xa5\xe7\x34\xd6\x9d\xb7\x93\x3e\xf0\xbd\x5f\xba"
- "\x68\xdd\xee\xb2\x46\x4e\x26\x59\x5f\xf0\xe2\xef\x65\xdd\x86\xf7"
- "\x90\x16\x7d\xf0\x8c\x37\x7c\xc3\x72\x36\x46\xfa\x3f\x7c\x4f\xc8"
- "\x1b\x9e\xab\x9f\xeb\xb8\x31\x86\x99\x6f\xdc\xcc\xe2\x3b\x0a\xde"
- "\x2b\x71\xeb\xcf\x4a\x1b\x56\xfa\xfe\xa6\x63\xc9\xe4\x43\xfd\xcd"
- "\x4e\xf7\x00\xd9\x57\x7f\xf9\x31\xee\xe3\x83\xf7\xef\x7d\xa4\xee"
- "\xa5\xd4\xb9\xd9\x5f\xc6\xbd\x7c\x46\xda\x9d\x0b\xfd\x92\x63\x5f"
- "\x5d\x70\xaf\xfe\x2f\x3f\x96\x75\xf9\xcb\x8f\x0f\xdb\x18\xe9\xce"
- "\x8f\xef\x14\xfe\x90\xff\x02\x99\xe3\x48\x92\xaa\x8f\xa9\x13\xe3"
- "\x8a\xf8\xdd\x42\x92\xc1\xbe\x74\xae\x47\x3e\x5a\x27\xc0\x1f\x25"
- "\x4a\x1e\x7e\x5f\xb3\x82\xf1\x13\xd2\xfe\x57\x48\xdf\xd8\x2b\x26"
- "\x6e\x63\x4c\xbc\xb3\x71\x5f\xbc\xb0\xfd\xd8\x78\xac\x0c\x57\x03"
- "\xdf\xf8\x76\x1d\xae\x91\x48\x77\xe3\x4a\x63\xaf\x1e\xd7\x18\x3c"
- "\x77\xd0\xb8\x84\x0c\x6b\xa6\xb8\x70\x6d\x51\xfb\x2c\x7d\x9d\x21"
- "\x22\xda\xb8\x56\x3f\xc1\xa4\x7d\x5b\xd5\x48\x8a\x09\x36\x65\x07"
- "\x63\x8b\x7d\xbc\xd3\x72\x3d\xf9\xf5\xaf\x1a\x69\xdf\x41\xfb\xce"
- "\x7f\xf1\x74\xdf\x77\xae\x32\xe1\x2f\x19\x7f\xbb\xf0\x77\x1c\x7f"
- "\x23\x83\x7f\xef\x9b\x3a\x0a\xaa\x46\x82\x8e\x82\xc7\xea\x1f\x26"
- "\x56\x09\xdf\x5a\x1b\x48\x2e\x8a\x7a\xc9\xa3\xb6\x97\xe1\xde\xc0"
- "\xa3\x8e\x25\xaa\xed\xf5\xe0\xde\x64\xb1\x63\x5d\x8b\x02\x4d\x46"
- "\xa0\xcd\x51\xc7\xca\xa8\xbd\x54\xdf\xb6\xa8\xb7\xeb\x42\xcf\x4f"
- "\x51\x99\xd4\x7e\x4f\xd4\x3e\x2a\x8f\xf1\xdb\x9f\xb1\x69\xf4\x54"
- "\xe9\x44\x67\x4b\xf4\x6d\x28\x43\xf2\x41\xc8\x8f\x32\xb4\xfc\x01"
- "\xda\x8f\x20\x5f\x62\xe8\x53\xe4\x83\x4c\x6c\xd0\xce\x66\x75\x14"
- "\xbc\x6f\x78\x27\x5d\xee\x67\xd0\xbb\xed\x21\xef\x92\xbf\x90\xde"
- "\xde\xc7\x37\x0d\xf2\x9b\x6f\xd7\x9d\x62\x55\xd7\xa9\xdf\xbd\xc4"
- "\x77\x66\xe0\xfc\xe3\x68\xf0\x77\x25\x6e\x3a\x47\x44\xfc\xd0\x78"
- "\xd7\xc8\x76\xe6\x2a\x51\xb0\xe6\xbf\x0d\x3c\xe2\xce\x53\xec\xfd"
- "\x03\xb5\xde\xe6\x7e\xae\x87\xef\x0b\xdb\x3b\xde\x99\xcf\x5c\xb9"
- "\x3f\x10\xb6\xec\x67\xd8\x07\xa7\x5d\x1e\x71\x46\x97\x7e\x9f\xa0"
- "\xe7\xb4\xdf\x4c\x6b\x03\x64\xec\x80\x6f\x7a\x05\x79\x77\x52\x3a"
- "\xd2\xc8\x8f\xc0\xcb\x21\xcf\xf8\xa6\x7d\x06\x39\xa7\x3e\x78\x85"
- "\x78\x0b\x51\x5f\xdf\xcf\x9c\x54\x67\xcc\x25\x03\xb5\xc1\x0e\xf9"
- "\x8f\xe2\xf1\xd1\x9c\xb0\x64\x93\xae\xf0\x83\x55\x18\x77\x1c\xb2"
- "\xb6\xa1\x7f\x6d\xf8\x40\x9c\x3f\xb6\xfb\xf8\x19\xd0\xdc\x40\x3c"
- "\xc9\x86\xbc\x01\x86\x07\x4a\xb8\xb3\x2d\xfa\x6d\x60\xec\x07\xbb"
- "\xde\xc9\x91\x7d\xd3\xcf\x72\x77\x69\x6d\xdf\xa9\xb6\x1d\x69\x62"
- "\x8f\xea\x8e\x62\xe9\xb3\x1f\xf7\x0d\x7d\xea\xac\xd0\xcf\xc4\x0f"
- "\x60\x6d\xb8\x28\x69\x71\x74\x4c\x60\x6d\xe8\x57\x3d\x8e\x8e\xf9"
- "\x06\xdf\xe8\x52\xbf\xe1\xf8\x17\xbf\xe1\xb8\xdc\x37\xe4\x5e\x73"
- "\xf5\xc8\xfe\xcb\x8e\x47\x85\xbd\x29\xfa\x5c\x3d\xe3\x51\xb3\xde"
- "\x0f\xf9\xcd\x67\x3a\x46\xbc\x83\x9d\xec\x4a\x29\x7e\x81\xcf\xf1"
- "\x92\xa7\x26\xa7\x93\x39\xb3\x8f\xb1\x26\x56\x2d\x7c\xd8\xd4\x64"
- "\x91\xcc\x76\x2c\xb1\x6b\xd3\xdb\xc9\x5d\xfa\xa3\xe9\x44\xef\x1d"
- "\xe8\x87\xed\x21\xe3\xac\xb6\xfd\x18\x73\xa5\x92\x7e\xb5\x8e\xf4"
- "\xda\x89\x98\x57\xa4\x07\xf5\x80\x47\xf7\x0b\x7a\x80\x7f\x91\xf2"
- "\xd6\xa1\x66\x21\x6f\x79\x84\x9f\xd3\xa1\x22\x2e\x41\xc1\x8b\x71"
- "\xa4\xfb\xf6\x77\x59\x2d\x1d\x05\x2c\x99\xe2\x15\x90\xde\x99\x9b"
- "\xa6\x55\x4d\xf1\x85\x71\x21\x4f\x81\xf7\xa7\x78\x05\xae\x76\x37"
- "\xf3\x83\x8f\x2e\xb9\xc0\x62\x4a\xc0\x7b\x02\xb3\x4d\x84\xeb\x2f"
- "\xab\x31\x0b\xd6\x5f\x08\xc6\x2c\xd8\x49\xba\x9e\x7a\xfc\xbe\xc0"
- "\xc2\xfd\x1b\x0f\x35\x6f\xbf\xc0\xe2\x76\x64\xb3\xf8\xed\xa4\xcb"
- "\xfb\x4a\xf2\x3e\xc2\x0e\x9c\xe2\x17\x2c\x8a\xa7\xbd\x84\x20\xef"
- "\x43\x67\xca\x83\xb8\x15\x2e\x74\x20\xfd\xa2\x77\x8d\x58\x07\x7d"
- "\x8e\x7d\xf1\xa0\x71\x19\x68\x87\xb5\xac\x7a\x1d\xe8\x67\xe8\xad"
- "\x6f\x35\x7b\x92\xcd\x21\x31\x27\xde\x89\x93\xf8\x8e\xb2\xea\xfa"
- "\x1a\x13\xfe\xed\x56\x76\x47\x2b\x4b\x90\xe7\x19\x07\x61\x4d\xac"
- "\x1d\x4b\xf6\x7f\x79\x0b\x99\xd9\xbf\x7d\xba\xce\xfe\x1b\x16\xe6"
- "\xf2\x25\x32\xfa\xcb\x3b\xcb\x9b\xef\x48\x67\x09\xb4\xff\x40\x7b"
- "\x25\x96\x15\x22\xff\x80\xb8\x5c\x96\x10\x5a\xf6\xc2\x65\x99\x0b"
- "\xee\x4c\x78\x66\x9e\x65\xfe\x82\xcc\x85\x4b\x67\x65\xce\x63\x93"
- "\xa4\xd9\x84\x70\x21\xbd\x8c\x6c\x26\x96\x2e\xc8\x4a\xb3\xcc\x59"
- "\x92\x99\x39\x2f\x23\xcb\xf2\xc8\x03\xc9\x97\xfa\x11\xdc\x6e\xde"
- "\x25\xfc\xc6\x0a\x1b\x3a\xd7\x17\xfc\x7f\x7f\xff\x42\x51\x36\x0b"
- "\x37\xae\x9a\x38\xd5\xe8\x9b\x64\x91\xb1\x8c\xea\x0c\x64\xb7\xca"
- "\xed\xd6\x62\xc9\xa7\xd6\x0d\x92\xbc\xfd\xcc\x7c\x79\xb6\xa2\x4e"
- "\xea\x64\x3a\x26\x8d\x94\x73\xca\x75\x4d\x58\x16\xa3\xdf\x0b\xe9"
- "\xb7\x31\x8b\xad\x71\x8e\xa0\xfd\x70\xd7\x35\x22\xdf\xf6\x24\x9d"
- "\x96\x4f\xcb\x23\x9f\xd7\x8a\xb3\x10\x3b\x85\x4f\xcd\xda\x44\xd0"
- "\x27\xba\xa3\xc0\x95\xe0\x0e\x9f\x10\xaf\xee\xaf\x37\x4b\x7b\xbd"
- "\x3a\x03\xf9\xd5\xe3\xff\xfb\xda\x0b\x6a\x39\x69\xf8\xde\x10\xe4"
- "\x9d\x8e\x3e\x68\x52\xed\xfa\x46\x35\xaa\xf5\x92\x76\xa7\xb5\x8f"
- "\x49\xfb\x0e\x57\x7e\xc8\xb9\x6e\x71\x36\x9f\xd6\x46\x95\x27\xed"
- "\x50\xcb\xdb\xa5\x61\x02\xf2\x43\xbe\x7b\x71\x52\xff\xb1\xd0\x25"
- "\xe5\x9f\x6e\xfe\x52\x54\x3a\x6d\x37\xbf\x0a\x7c\x18\xd9\xc2\x6a"
- "\x8b\x7b\x8e\x97\x40\x0f\x3e\x94\x31\x67\xd1\x42\xdb\xac\xac\x05"
- "\xb3\x17\xa4\x2f\xc8\x5a\x26\x8e\x93\x8f\x11\xff\x1e\xbc\x69\xee"
- "\xd4\x9e\x3e\xa0\xc7\x90\x8e\x45\xf5\x1d\xdb\x4e\x36\x0d\x52\xcf"
- "\x55\xb7\xc3\x57\xc0\x46\xf5\xaf\xde\x75\xc2\x46\xb0\x44\xf8\x31"
- "\xa8\xdb\xed\xd6\x9f\x8b\x53\xf7\x3b\x5a\x55\xda\x8b\xe7\x6d\xa6"
- "\x63\x64\x2f\x31\xbe\x91\x1d\x4f\xa2\x7d\x2e\xd0\xcf\x4d\xeb\x61"
- "\xd1\x72\x5a\xb7\xd0\x0b\xbe\x1f\xa8\x71\x54\x3f\x7c\x8b\x68\x40"
- "\x3c\x21\x68\xb0\xab\x91\x7d\x38\x5a\xd0\xe0\x6b\xf3\x2e\xe1\xc3"
- "\xe0\x6b\xf3\xab\x34\xb6\xa8\xce\x0a\xb7\x6e\xe7\xdc\xba\x4d\xf9"
- "\x3a\x6d\x3b\xff\x3a\x6d\x5b\xd0\xff\xdc\x87\xeb\xf0\xee\x6e\xbc"
- "\xbb\x91\xe2\xc3\x14\x9d\x61\xbb\x69\xff\x9b\xee\x8d\x59\x26\xe6"
- "\x37\xed\xab\xa7\xfa\xb8\x9a\x13\x04\xbf\xdd\x84\xfc\xae\xf6\x1f"
- "\x30\xf0\x92\x6e\x71\x36\x52\xec\xd7\x81\xdf\xc3\x7b\x2e\xd4\xcb"
- "\xd5\xdc\x49\xbc\x45\xbd\x02\x9e\x0f\xed\xdd\x0f\xfc\xb3\x50\xb9"
- "\xd4\x66\x71\x3e\x39\x96\xbb\x3b\x0a\x3e\x2c\x73\xb3\xda\x1c\x95"
- "\x37\x15\xf6\x16\x44\x83\xee\xfd\xf9\xa1\xf0\x63\x0c\x1a\x5f\xcd"
- "\x1d\x13\xdd\xb2\x4f\x3f\x3c\x49\x69\x49\x4d\xfc\xeb\xe0\xb9\xf8"
- "\x0f\xcf\xe3\xbe\x0b\x7f\x0a\x77\xfc\x8c\x85\xec\x2b\xe3\xd9\x31"
- "\xe9\x5f\x3d\x96\x7b\x6c\xcb\x29\xbe\xf6\xb1\x5b\xe5\xb8\x79\x90"
- "\x7b\xec\x69\x61\x78\xc7\x4f\xe7\x38\x25\x2d\x8f\x3d\xe4\x5a\x7d"
- "\x46\xb3\xd3\xc0\xf7\x8f\x7d\xe5\x9c\xef\x63\x22\xde\x73\x93\x4f"
- "\xd8\xfd\xa9\xbe\x0a\x74\x4a\x41\x5d\x0c\xd9\x8b\x43\xb6\xa3\xbd"
- "\x68\xe1\x6b\xbd\xa3\xe0\x58\x6e\xe0\x9c\x98\x49\xf2\x7b\xc4\x73"
- "\x51\x0c\x2c\x1a\xfb\xc4\xbf\x51\x9d\x68\xec\xa3\xec\x32\xda\xa3"
- "\x96\x73\xe0\xd8\xde\x7f\x6d\x0e\x1c\x13\xfa\x5f\x94\x35\x89\xeb"
- "\xed\xfc\x8e\x75\x2c\x55\xd8\x10\xf8\xda\xe9\xfc\x6d\x38\xd6\x8d"
- "\xfd\x12\x4f\x8e\xdf\x24\xec\x4c\xb2\x5b\x4b\xe9\x8c\xeb\xcb\x9d"
- "\x2c\x52\x71\x4c\x73\x12\x9f\x5d\x93\x2b\x6c\x2f\x0c\x78\xaf\x9c"
- "\x6c\x33\xc8\x96\x6e\x98\x88\xb1\x76\x8c\xbd\x7c\x9e\x85\x37\xb1"
- "\xbf\x8e\xa5\xbd\xa0\x20\xad\xff\xfa\x2b\xda\xfb\xe3\x9b\x26\xe4"
- "\x18\x73\xf5\x6b\xa8\x0c\xe5\xc2\xe9\x71\xda\x7b\x14\xcb\x97\xde"
- "\x6b\x64\x7f\x5d\x28\xde\xa3\xbc\xe4\xab\x29\xcf\x34\x1d\x6b\x6e"
- "\x3c\xe5\xf7\xe1\x7e\xa7\x62\x4a\xe6\x58\x0f\xfc\xd9\xbe\x72\x3c"
- "\x9b\xaa\x38\xde\xae\x43\x9a\x55\xec\x41\x74\x99\x69\x6f\x12\xe3"
- "\x6b\x8b\xdb\xe5\xfe\xd2\x29\xea\x43\x67\x72\xb3\xb0\x76\x0a\xb9"
- "\xe4\xaf\xef\xec\xfc\x8a\x85\xdb\xe6\x53\x7f\x1e\x17\xba\x56\x8c"
- "\xbd\x32\x59\xbf\xe3\x8f\xb7\x6d\x4a\xaa\x68\xc3\xd8\x6c\xd7\x1b"
- "\xd8\x61\x33\xd9\x92\x1f\x73\x1c\x36\x77\xa2\x7f\x8e\x8f\x74\x87"
- "\x3f\xd0\x2c\x79\x62\xf9\x9e\x36\x26\xc3\xcc\xa6\xc9\x78\x3e\x5e"
- "\xb3\x47\xd2\xc6\xa3\x9b\xfd\x35\x86\xe8\x86\x71\xec\xae\x4d\x0f"
- "\xfa\x34\x6d\x93\xe7\xd7\x20\x53\x1c\xb7\x69\x36\x76\xfe\x0b\x4a"
- "\x35\xea\x41\xfe\x39\x72\xfc\xd9\x4a\x03\xed\x9d\x4f\x3e\xaf\x70"
- "\xb2\xed\xa7\x73\x1a\x24\xf7\x4c\xc9\xe1\x6d\x24\xc7\xd1\x99\x28"
- "\xda\x37\xa7\x33\xe3\x3b\x20\x07\x53\x1d\x50\xd6\x7e\xed\xec\xf8"
- "\x7a\xa4\x51\x1d\xe8\xdc\x53\xd1\xb3\x62\x4e\x12\x7f\x12\x29\xf6"
- "\x0e\xc2\x9e\xfb\x6a\x72\x3b\xca\x3c\x23\xf6\xbc\xda\x76\xaa\xe5"
- "\x90\x5f\x9f\x8e\x82\x8f\x98\x56\x86\x42\x76\xb2\x99\xc2\x1e\xce"
- "\x2d\xdf\x97\x76\x42\x93\xdb\x15\x71\x5e\x85\xde\x97\xf6\x3b\x1f"
- "\x8d\x0d\xd8\x5a\x8a\x33\x24\x1f\x4d\xd0\xfc\xfe\xe0\x77\x72\xe0"
- "\x0c\x1c\x68\xda\xe6\xd8\x57\xdf\x0e\x2c\x68\x77\xec\x03\x8f\xf2"
- "\x51\x3a\x90\x68\xf7\x65\x75\x19\xe4\x2f\x60\x09\xd3\x2b\xd1\xd3"
- "\x5a\xc9\x17\x04\x9d\xed\x94\xf6\xdd\x1f\xd5\xa8\x7e\x21\xc2\xce"
- "\xb0\x8f\x7e\x15\xdc\x43\xf7\xab\xfa\xdf\x8f\xda\xa5\xfc\xf1\x51"
- "\xbb\xd0\xff\x6e\xda\xe7\xfc\xf7\xe5\x5e\x7d\xf9\x72\xb7\x5e\xda"
- "\x3c\x7e\x84\x67\x9f\x8e\x0c\xda\x3c\x7e\x54\x46\x65\xf5\xce\x2f"
- "\xce\x50\xc7\xee\xdf\x3e\x11\xbc\x5f\x40\x9e\xff\xbb\x45\x7c\xf7"
- "\x85\x11\xa9\x0a\xf1\x7e\xd1\xdb\x84\x7d\x93\xcb\x76\x8e\x30\x24"
- "\x42\xea\x16\x64\x1e\xd5\x9e\xf1\xaa\x96\xee\xf7\xd1\x74\x2f\x69"
- "\xf6\xb7\x1c\x6d\x4f\xa9\x48\xaf\x50\xbc\x2e\x6e\x2f\x05\x36\xda"
- "\xda\x85\x3f\x02\x17\x78\x49\x8a\x75\x6d\xcb\xa4\x33\x83\x7f\xdb"
- "\x43\x7e\x0a\xe4\xdc\xfc\xbb\xc0\x6b\xa5\xe0\x5e\x6e\x27\x79\xca"
- "\x43\xb1\x41\xce\x31\xe4\x8b\x42\xbe\x13\x95\xb9\xad\x64\x1f\xb6"
- "\x97\xe2\x3e\x36\xa9\xdf\xf6\x44\xcd\xa8\xbf\x31\x92\xa5\xe2\x9b"
- "\x18\x9f\xaf\x25\xf5\x1f\x37\xfe\xd6\x7a\x39\xde\x5a\xf2\x7a\x89"
- "\xac\x2f\xf9\x9c\xf4\x2f\xb7\xe3\xfb\x8f\x70\x51\xff\x13\x3e\xbd"
- "\x97\x75\xe9\x07\xf2\xef\xe7\xe7\x30\x5f\xc1\x40\xee\x5f\x8e\xfe"
- "\x6a\x33\x43\x7e\xab\x66\xb5\xd2\x66\x86\xf6\xfd\x8d\x79\xed\xfc"
- "\x9c\xcb\xb7\x97\xf4\xff\xc4\x7b\x03\xb7\xfe\xfe\xa1\xcb\x77\x80"
- "\x91\x1d\x33\xe1\x4d\x23\xfb\xfb\x01\xaa\xd7\xed\xb6\x7c\x76\xdb"
- "\x19\xf1\x3c\x57\xf2\x7d\x7f\xaf\x57\xaf\x65\xe4\x8f\x33\xb4\x4e"
- "\x0f\x2e\xc9\x98\x43\x4e\x5d\x6f\x4b\x9a\x97\x3d\x2f\xdd\xf2\x18"
- "\xb9\x7c\xed\x61\x93\x68\x08\xc6\x05\xab\xdf\x45\x6b\x29\xf1\xde"
- "\x14\x1f\xec\x72\xb1\xc1\xb4\xb8\x60\x98\x73\x71\xa4\xaf\xfe\x36"
- "\x63\x83\x69\xbc\x35\xc5\x05\x0b\xee\xdd\x9c\x98\x1b\x98\x03\xca"
- "\xa1\x0e\xba\x17\xeb\x77\xc1\xdf\x9b\x68\x1e\xc9\xf5\xa5\xbe\x21"
- "\xd4\x67\x8e\xe4\xad\xb6\x60\x2d\xad\x6f\xd7\xce\x76\x62\x2c\x46"
- "\x76\x14\x9c\x08\x0f\x9e\x25\x39\x61\x02\xdd\xa4\xfd\xb1\x89\xf2"
- "\x9e\xb0\x68\x36\x0e\x6a\x0c\x68\x61\x93\xa1\x14\x5e\x13\x23\xf5"
- "\x8a\x27\x6e\xda\xa9\x0c\x34\xc8\x3d\xad\x13\x49\xda\x59\x25\x39"
- "\x37\x0f\xa9\x73\xf3\xc4\xdc\xcb\xd9\xa1\x04\xe7\xc6\x89\xd2\xe0"
- "\xbc\xfe\x4c\x7b\xb7\xf4\x4a\x36\x2c\xaa\x7c\x37\xbc\x85\xfd\xe3"
- "\x4f\xa4\x6b\x94\x67\x93\xff\xb1\x83\xca\x92\x7e\x27\xfe\xb1\x4c"
- "\xfd\x8d\x6f\xfc\x63\x96\xfa\xfb\x5a\xfc\x7e\x48\xfd\x3d\x02\xbf"
- "\xef\x54\x7f\x63\xce\xfe\xe3\x1a\xf5\x77\x0c\x7e\xeb\xd4\xdf\x58"
- "\x3b\x3e\xfe\x4a\xfd\x1d\x8b\xdf\x1f\xaa\xbf\xaf\xc1\xef\xb7\xd4"
- "\xdf\x98\x83\x1f\x0b\x7f\xcb\xa8\xbb\xe1\x14\xfb\x78\x7d\xff\xe5"
- "\xcd\x8f\xad\x72\xcf\xf9\xe3\x62\xac\x21\x89\x72\xed\x09\xa4\xed"
- "\x46\xdf\xf8\x34\xfa\x22\x3d\x99\xbe\x83\xf4\x4a\x37\xab\xdc\x1d"
- "\x92\x9e\xa8\xe6\x6f\x00\xce\xe5\x84\xa4\x8f\x55\xd3\x81\x7f\x47"
- "\xeb\x42\xd2\xe3\x65\xfa\x3f\x22\x31\xd7\x59\x48\xba\xea\x23\xfe"
- "\x1f\x71\x6e\x76\xd0\x1d\x92\x6e\x52\xd3\xc7\x6b\xf6\x37\x6a\x7a"
- "\xb8\x9a\x3e\xd5\xcd\xfe\xec\x08\xa6\x9f\xf0\xaa\xe9\xc0\xff\x13"
- "\xb6\x90\xf4\xc0\x99\x16\x11\x9f\x2d\x97\xe6\xd6\x3f\xc0\x03\xee"
- "\xcf\x0f\xc9\xe3\x56\xdf\x05\xff\xf7\x76\x59\x48\xfa\x71\x35\xdd"
- "\xe9\xd6\x0d\x09\x2d\xb3\xaa\x2f\xac\xd2\x15\xb3\xd4\xbe\x74\xf2"
- "\x24\xbf\x08\x3b\x64\xc1\x53\x37\xf8\xe9\xec\x93\x71\x07\x6f\xb4"
- "\xe4\x71\xde\xc8\x1a\x9a\x54\xbb\x5b\xf2\x2b\xda\x2a\xcf\x91\x35"
- "\x54\xab\x3e\x04\x3c\xe2\x6c\xd9\x72\x91\x26\x7c\x11\xdf\x91\x93"
- "\x2f\xfd\xf3\x6a\xb1\x1e\x48\x37\xa5\xee\xdb\x23\xcf\x32\xd2\xd5"
- "\x53\x39\xa4\xbf\x76\x65\x75\x4a\xdf\xcd\x90\x61\x29\x8d\x74\x34"
- "\x44\x8f\x50\x5d\x94\xc4\xfd\x06\xbf\xd2\x49\xe7\x37\xa5\x1e\x8b"
- "\xe6\x22\xe5\x27\x5b\xb3\xd0\xbc\x6e\xd6\x20\xf4\x6f\x61\xe6\xa8"
- "\x57\x3a\x0a\x1a\x1a\x82\xe7\x66\x1a\xc6\xaa\xe9\xbb\x90\xde\x1e"
- "\x92\x6e\xe9\x1b\xdb\x81\x77\xa6\x09\xce\xae\x0b\xbc\xdd\x77\x81"
- "\x7b\x8b\x3e\x95\x36\xe7\xc0\xba\xeb\xfd\x8e\x09\x75\x74\xae\x84"
- "\x62\x2a\xfa\xb2\xc1\x1a\x2f\x13\xb1\x27\x87\x4c\x6e\xf7\x80\xc7"
- "\xe8\xe0\xeb\x67\x93\xed\xea\x79\x46\xfb\xaa\xf6\x56\x8a\xcf\x65"
- "\xe4\x74\x5e\x79\xe5\x69\x16\x49\xe7\x4e\xc8\x36\x9d\xf6\x3c\x1f"
- "\x49\xf3\xb0\x9a\x34\x3f\xdb\x89\xb2\x77\xcc\xd6\xf8\x8b\x4f\x36"
- "\x07\xcf\xc4\x4e\xa0\x7d\xe8\xeb\xed\x22\x86\xec\x27\x47\xa8\xae"
- "\xc6\x55\x64\x0f\x70\xac\x82\xbf\x2b\x78\x63\x93\x71\x15\xb3\xb8"
- "\xd9\x27\x75\xf8\xcd\xe4\x1f\x9e\x21\xbd\xaf\x36\xc9\xb9\xfc\x69"
- "\xa4\xc4\x9a\x89\x89\x12\x2f\x3e\x8d\xe4\xff\x46\xe7\x2c\x3e\x25"
- "\x1d\x74\x05\xf8\xf0\x8a\xde\xde\x5f\xb9\x83\xe9\xbb\x36\x81\x37"
- "\x39\x53\xa1\x97\xf8\xf4\xa9\x4f\xd1\x1b\x56\x91\x9e\x5c\xc4\x8f"
- "\xdc\x34\xcd\xb7\x3b\xc3\xab\xaf\x59\xde\xc4\x56\x5c\xc3\xcc\xd3"
- "\xbd\x7a\xca\xb3\x72\x58\x16\xf9\x10\xde\x47\x3c\xb4\xfe\x8f\x78"
- "\x7e\x30\xa3\x42\xef\x13\xfc\xca\xa7\x3e\xa1\x5b\x75\x4c\xab\xa3"
- "\x35\xc4\x55\xef\x27\x5e\x3c\x12\xbc\xb8\x13\xf8\x6f\xf0\x2f\x4d"
- "\x8b\xf6\x2d\x4e\x1b\xb2\x23\x93\x45\xfa\x17\xc7\xc7\xbc\x78\x81"
- "\x8d\xd3\xd6\x9f\x1d\xd9\x58\x53\x3a\xcc\x83\x37\x60\x4d\x21\x9d"
- "\xcd\x30\x9d\x49\xec\x21\xd3\x6f\x45\xff\x4e\xeb\xce\xec\xcb\xc7"
- "\xc2\xf5\x2f\x8d\x17\x7e\x15\xa8\x2e\xbd\xb5\x75\xdd\x36\x16\xee"
- "\x57\xcf\x5f\xe6\x7d\xc1\x62\xc1\x3f\xeb\x87\x9d\xe7\xce\x96\x74"
- "\xa6\xa7\xf8\xa1\x79\xf3\x84\x5e\x74\x40\x4d\x9a\x8f\xb9\x72\x3e"
- "\x66\x79\x99\xd4\x47\x9f\x3d\x4a\x7c\x1a\xd9\x22\x23\xbf\xa9\x85"
- "\x7d\x36\xcb\xe8\xc5\x9a\xe1\x05\x4f\xfe\x2c\xc9\xc0\x9f\x2d\x91"
- "\x7e\x1c\x3e\xab\xa0\xf3\x92\xce\xcc\xfb\x29\x6d\xa3\xfd\x0b\x61"
- "\x73\xbe\x57\xce\xad\xcf\xd2\xe9\xde\x4e\xe7\x41\xa3\xa7\xfb\xde"
- "\xe8\xf4\x0e\x90\xba\xb7\xcf\x54\x9f\xd2\xfb\xca\xa5\x6c\xf7\x59"
- "\x9f\xfb\x98\x8a\x63\x12\xc5\x78\x1f\xe5\x2a\x21\xfe\x95\xbb\xc5"
- "\xfe\x3c\x9d\x8d\xcf\xb9\xd7\xc9\x2f\x38\x54\x9f\x3d\xee\x3b\x95"
- "\x8d\x93\xdc\xd2\xaf\x9e\x5b\xc8\x79\x52\x57\x3f\xc9\x23\xf7\x26"
- "\x1e\x62\x52\x57\xff\x90\xe9\x85\x11\x74\x16\xc0\x9d\xd0\x16\xf5"
- "\x10\xc6\x9a\x3b\xbc\x2d\x7a\x76\xaf\xfa\x28\xb9\x1e\x3d\x68\xb2"
- "\x5c\xcf\x62\x68\x8f\x28\xc5\x2f\xfd\x4a\xca\x39\x7c\x72\x2c\xdf"
- "\x28\x9e\x8d\x6a\xb4\xb1\x30\x29\x43\xba\x57\xdd\x51\xc2\x2c\xa8"
- "\xeb\x50\x6e\x9a\xe4\x14\x36\x8b\x8e\x49\x75\xae\x56\x8a\x0b\xe3"
- "\x67\x72\x2f\xef\x64\x22\x8f\x9a\xe4\x54\xf3\x7f\x58\xdb\x8a\x36"
- "\x98\x26\x39\x5c\xde\xd3\x2a\x4f\xe8\xc6\xd8\x9f\xe4\xe0\x8e\x49"
- "\xa5\xf2\x5c\xf5\xc9\xd1\x1a\xae\xca\x31\x7a\x72\xb8\xa4\xdb\x83"
- "\x26\x49\xb7\x93\x89\xea\x7a\x35\x8a\x7e\x63\xed\x4e\x90\xb6\x27"
- "\x27\x23\x35\x1e\xd9\xad\xe6\xa1\x77\xd0\x5e\x8f\xc4\xda\x93\x63"
- "\xd0\x6f\x95\xf2\xb9\x5b\xe8\xd6\xd0\x3e\xac\x59\xee\x34\x6a\x57"
- "\x5f\xd8\x2a\x68\x91\xcb\xc2\x50\xe7\x72\xb2\xd3\x26\x3e\xc5\xd5"
- "\x7e\xaf\xd3\x25\xfa\xa0\xf1\x7d\xb2\xcb\xa7\xef\x90\x5f\x1d\xc2"
- "\x4d\x94\x19\x4e\xe5\x85\xd4\x7f\x8f\x56\x17\xfa\x1e\x3d\x43\x5b"
- "\x1d\x42\xae\x46\x9b\x29\x0f\xf5\xeb\x29\x1b\xe9\xec\xce\x83\x66"
- "\x64\xff\xd6\x58\x4f\x34\x91\x34\x6b\xdc\xab\xca\xf4\x6a\x3f\x34"
- "\xbe\xd6\x9d\x1e\xf2\x5e\x31\x01\x1b\x32\xc9\x0e\xaa\xb1\x5e\xa5"
- "\x9f\x1a\xd3\xa0\x51\x9c\x53\x57\x9f\xdd\x13\xf2\xee\x75\x81\xbc"
- "\xa8\x37\xf1\x46\x64\x53\x40\x7b\x4c\x72\xbc\x36\xa6\x85\xbc\x97"
- "\x96\x72\x96\x78\xe4\x09\x8e\x17\xb6\x8a\x18\x71\x09\x1d\x05\x8d"
- "\xb9\x41\x7a\xcb\x72\x7a\xf9\xc6\xf5\xda\x37\x90\x67\xbc\x56\x4f"
- "\xfc\x56\xd7\xe0\x46\x67\xb0\x4f\x4e\xba\xb5\xf7\x48\x7f\x83\xfb"
- "\x75\x14\x6f\xb1\x0f\x3f\xf4\x3a\x17\x56\xf7\x5a\xdf\xbd\x4e\x31"
- "\x1e\xd9\xe7\xe3\xc8\xc6\x1c\x74\x2d\x97\x63\xe8\xf3\x91\x72\x2d"
- "\xfc\x5c\xf8\x05\xa3\x7d\x42\x19\x97\xe4\xf3\x04\x94\x9b\x24\xbf"
- "\xf7\xb9\xea\xff\xf1\x73\xc8\x7f\xee\xf1\x3d\xe5\xba\xfb\x67\xcd"
- "\xb5\x24\xdf\x29\xce\x96\xde\xb6\xc4\x46\xc7\x46\xe7\x06\x6f\xba"
- "\xf3\xdc\xa6\xa0\x2f\xaf\xcf\x1d\x01\x5f\x5e\x8e\x19\x3e\x49\xff"
- "\xcf\x1b\xf8\x05\xbe\x99\xce\x7d\xf0\x6c\x5e\x5c\x84\x3e\xb4\x9f"
- "\x67\x57\x53\x1c\xd9\x3c\x1b\xff\x92\xfc\xbc\x71\x93\x75\x24\x77"
- "\x58\x2d\x79\xe7\xd9\x40\xb2\x29\x22\xfc\x21\xbd\x17\x8f\x42\xfa"
- "\x46\xab\x25\x78\xde\xec\xcb\xe3\x74\x46\x92\xdb\xad\x14\x07\x7c"
- "\x2c\x8d\x07\xb2\x2f\x3f\xc5\xbe\xdc\x8b\x7c\x63\xf1\x2c\x6b\xbd"
- "\xd0\x25\x58\x73\xfc\xa6\x19\xc7\xed\xa7\x59\x84\x88\x29\x96\xe3"
- "\x65\x96\x67\xe9\x5c\x52\xd3\x3d\x28\x33\x07\xe9\xc3\x44\xba\x17"
- "\xdf\xde\x68\xcd\xc1\xb3\x61\x78\xb6\x0c\x57\x05\x65\xe4\x14\xa1"
- "\xde\x79\xa7\xd9\xf5\xa8\x4b\x33\xbe\x93\x83\x7a\x9e\xb2\x2f\x64"
- "\xb1\xb5\xb6\x66\x92\xef\x50\x9e\x5b\xc6\x4a\xc3\xbb\x78\xaf\x06"
- "\xed\xa2\x33\x49\xd4\xbe\xdc\xf5\xb8\xe6\xf9\xd9\xb0\xbc\x95\x58"
- "\xf7\x56\xe2\xfb\x74\x7e\x13\xe5\x90\xaf\x0d\x59\x17\xb4\x8d\x74"
- "\x68\x28\x77\x65\x2b\x3f\x85\xb2\x9b\x6b\x20\xd9\xb9\x72\xea\x03"
- "\x65\xaa\x3c\x35\xe6\xf7\x97\x7b\xf8\xa6\xd9\x16\xd4\xa9\x98\xec"
- "\xae\x91\x06\x4c\xfe\xb2\x2c\xc8\x0f\x7f\xf9\x9a\xfa\x7b\x50\x20"
- "\xaf\xdd\xca\xf2\x2e\x32\xb3\xb0\x1d\x58\x1a\x06\x3c\xfe\x72\x1c"
- "\xf9\x7b\x0a\x96\xf9\xc5\x9f\xa8\xbc\x75\x28\xcf\x3e\x8f\x0d\x02"
- "\x56\x1b\x50\x47\x8a\xa9\x7a\x52\xd0\x49\xcc\xb1\x2f\xf6\xa2\x2d"
- "\x0e\x6a\x93\x82\xbe\x5b\x8f\xf9\x80\xf6\xe8\xd0\x9e\x41\x2b\xfd"
- "\x81\x33\xa9\xd4\xa6\x28\x92\xe7\xa8\x5d\x6a\x3f\x6e\x46\xbb\x4a"
- "\x56\xa6\xf1\x93\x68\x5b\x73\x4d\x5a\x3d\xc3\xda\x63\xac\xb5\xd5"
- "\xd1\xf9\x87\x93\x92\x6e\xcd\xd4\xaf\x9b\xd1\xce\x92\xa0\xff\xd2"
- "\x2f\xef\x44\xdd\xe3\x51\xaf\x75\x6a\x3b\x29\x6d\x4c\x90\xa7\xff"
- "\xf2\x36\xf5\xf7\xe0\x40\xde\x4b\xda\x79\xaa\x34\xa4\x9d\xf4\xfe"
- "\x47\x54\x9e\xda\xce\xc1\x68\xe7\xa0\x4b\xdb\x89\xf1\x94\xcd\x57"
- "\xab\xed\x5c\xa3\xb6\x53\x8f\x76\x0e\x46\x3b\x47\x84\xb4\x33\xba"
- "\x47\x3b\x8b\xd1\xce\x52\xb4\xb3\x31\xa4\x9d\xa6\x5e\xda\x09\x39"
- "\x00\xdf\xd8\x68\x2d\x95\x7e\xb0\x3e\x4f\x96\xe7\xbc\x4f\x55\x04"
- "\xfc\x4c\x5c\xe0\xe5\x74\x8e\x51\xc9\xe6\x7b\x49\x7f\x43\x7a\x23"
- "\x92\xf5\xe8\x2c\x63\xca\xb2\x35\xf9\x42\x77\x13\x2b\xf5\xd0\x92"
- "\xbf\x3a\xd5\x1e\x38\x77\xb1\x55\xc4\x8a\x90\xe7\x14\xe9\xec\x63"
- "\x26\x13\xba\xc7\x29\xcb\x96\xda\xe9\x7d\x7a\xb7\xa3\xe0\xcb\xb8"
- "\xe0\xf9\xb0\x53\x52\x67\x0e\xfa\xd1\x6f\xf2\xf9\x24\xf5\xf9\x9f"
- "\xa7\x4a\x7d\xfe\x97\x01\xff\x17\xa0\x4b\x25\xd1\x45\x9c\xdb\x24"
- "\xbb\x4a\x3f\x5b\x93\xe2\x5b\xa3\x9d\xbf\x6e\x45\xde\xdc\x90\xf3"
- "\xd7\xad\xa2\x0e\x9d\xc2\xc7\xc1\xd2\x29\xbe\xa5\x5c\x9e\xcb\xfd"
- "\xb2\x34\xf8\xed\x2f\x2c\xea\xb7\x2d\xf4\xdb\x23\x7d\x90\x91\x8e"
- "\xcd\x22\x6d\x65\xbe\xac\xd6\xec\x53\xdc\xac\xc9\x40\x73\xb9\xf7"
- "\xb8\x0a\x5f\xb6\x77\xf7\x79\xd4\x5c\x49\x7e\xdd\x3b\x0a\x9a\x23"
- "\x83\x67\xaa\x9b\xcd\x57\x3a\x53\x6d\xf7\xa0\x9f\x30\xdf\x6c\x22"
- "\x46\x70\x33\x64\xdc\x19\xc7\x65\x6c\x82\xe6\x3f\x51\x3d\x1b\x59"
- "\xf3\x6a\xdc\x1b\xe5\x5e\x4e\xf3\x12\x15\x9b\x13\xa6\xf8\x7d\x46"
- "\x37\xbe\x29\x7c\x28\x05\xef\xd3\xc9\x27\x04\xf2\xbd\x22\x7d\x3a"
- "\x37\xcf\xed\x91\x9f\x9e\xe7\xf7\xb8\x4f\xec\x71\x6f\x69\x07\x66"
- "\xf5\x65\x87\xb3\x7e\x84\xd0\xf1\xd6\x0d\x5b\xc5\x6c\xf6\xaf\x58"
- "\x18\xc6\xe2\x17\x54\xb7\xda\x66\x71\x46\xcf\xc8\x0b\x12\x98\xab"
- "\xd9\x27\xf9\x76\xf0\x4b\x8d\x71\xc8\xf3\x15\x8b\xa5\x33\x22\x14"
- "\xbb\x01\xf9\x5b\x64\xbc\x86\x96\x47\xa6\x2f\x19\xcc\x94\x67\xac"
- "\x43\xb8\x7e\x8e\x99\xec\x00\xf6\x74\xba\x29\xe6\x81\x2e\xef\x25"
- "\x36\x92\x70\x0a\x63\xb8\x89\xeb\xe7\x92\x9f\xb1\xd6\x7f\xef\x6c"
- "\x1e\xe0\xf2\x7d\xcc\x6c\xc0\xcf\x16\xd6\x92\x18\x9e\xcb\xc2\x37"
- "\x9c\x62\x26\x8c\x33\xdf\x61\xdf\x38\xa6\xf9\x34\x28\x89\x96\x67"
- "\xe5\x4b\x30\x26\x17\x9b\xb9\xb7\xa3\xe0\xab\x12\xc8\xb5\xd3\x35"
- "\xfd\xc5\x3a\xe9\xd3\x2c\x1c\xdf\x1f\x24\xfc\x2f\x48\xfe\x00\xb4"
- "\xfd\xea\x84\x3c\x23\x1a\xf3\x43\xbc\x53\x17\x94\x6d\x5a\xa6\x4b"
- "\x1a\xce\x50\xcf\x96\xb7\x4c\x3f\x0c\xaa\xae\x96\xf6\x4c\x31\xc8"
- "\xeb\x0b\xd8\x33\x09\x9d\x60\xcb\x74\xf4\xa1\x57\xca\x3d\x33\xbc"
- "\x29\x7e\x83\x3a\xc7\x29\x7d\x82\x83\xde\xc5\x7b\x46\x19\x57\xae"
- "\x65\x5c\x70\xac\xb5\x90\xae\x55\x87\x36\x61\xfc\x7c\x95\x45\xed"
- "\x22\x9a\xb4\x0b\xff\x65\x5f\xe5\x1c\xde\xd5\x47\xdc\x11\xd3\xc4"
- "\x44\x9f\xd0\x2f\xed\xab\xc0\x78\x3a\x8d\x3e\xb8\x8a\x7c\x38\xb9"
- "\xf0\x9d\x9a\x9d\x9d\xac\xc6\xdc\xc6\x6a\xf1\x9b\xce\x2d\x38\x9f"
- "\xfd\x9c\x35\x59\x7a\x5f\xcb\xc1\x0f\x38\x51\xe7\x3a\x2a\x8b\xb0"
- "\x86\x6c\x3d\xc9\xd7\x5e\x2d\xb8\x36\x57\x13\x13\x65\xd4\x28\xcd"
- "\xac\x26\x87\x64\xd8\x63\x15\xb5\x3b\x3f\x66\xb5\xe6\xbf\x8a\xef"
- "\x10\xbf\xed\xcc\x6c\xbb\x5c\xd9\x6e\x94\xed\x51\xcb\x6e\x45\xd9"
- "\x31\x7d\x97\xbd\xcf\xd4\xcf\xb2\xfb\x51\xef\x7d\xac\x3f\x65\xdb"
- "\x8b\xb9\x1f\x38\x3c\x14\x32\x85\x93\xfc\x90\xd2\xf9\x54\xff\x05"
- "\xf2\xbd\x32\x8a\x4b\xfb\xf9\xd6\xbb\x09\x6f\x84\x6d\xc7\xc6\x69"
- "\xfb\xc5\xd9\x55\xd2\xb3\xab\x67\x56\x5d\xbe\x2f\x18\xe9\xdd\x3b"
- "\x0a\x5a\x2d\x41\x59\x34\xb0\xaf\x0d\x9e\xb8\x75\x82\xb4\x93\x9e"
- "\xb6\x5f\x8e\xad\x7f\x5e\xa4\xb2\x7a\x97\x39\xad\xad\xd2\xde\xbe"
- "\x75\xa5\xa6\xdf\x6a\x8b\xb2\xb6\xaa\x65\x5d\x62\xd7\xa4\x3a\xcc"
- "\xb1\xcc\xcb\xc9\xb2\x2c\xcd\x5c\x90\x35\x4f\x3b\x5c\x3d\x98\x3d"
- "\x36\x6f\xce\xbc\x05\xd9\xf3\xe6\x5a\xa6\x2e\xc9\xcc\xb8\x6d\xd1"
- "\xfc\xf9\x96\x47\xe6\x2d\x5e\x3c\xeb\x99\x79\x83\xd9\xd4\xcc\x59"
- "\x19\x8b\x17\x90\x6e\xd3\x62\x99\x70\x57\x4a\xda\xa2\xac\xdb\x7e"
- "\x3a\x21\xa1\x87\x6e\x93\xce\x5a\x37\x90\x8c\x83\xf5\x29\x16\x3c"
- "\x46\x14\xf9\xdf\x31\x2e\xe3\xce\x15\x90\xaf\x31\x06\x5b\x68\x2d"
- "\xa4\xf5\x87\x64\x2f\xf2\xe3\x4b\xbe\x81\xb7\x6f\xe5\x75\xa7\x18"
- "\xbf\x1b\x7c\x7b\x3d\xd2\xc8\x0f\x6f\x03\xef\xb4\x7b\xa8\x0f\x90"
- "\x1e\x85\x3c\x95\xbf\x46\x9a\x27\x6a\x86\x77\xc3\xa7\x2c\x5c\xf2"
- "\x18\xa7\xc1\x9f\x0f\xe4\xeb\xc8\xa7\xee\xe7\x66\xa6\xfa\xea\xd6"
- "\xbb\xdc\x5e\xb2\xff\x31\x4c\xf1\xd9\x39\x61\xaa\x9c\x5f\xa7\x37"
- "\x4a\xba\x4c\x72\xcb\x73\x08\xca\x59\x92\x11\x5f\x10\x71\xce\x4e"
- "\x03\xff\x3f\x33\x04\xb1\xfa\x82\xc6\x9b\x93\x8e\x7e\x69\x23\xee"
- "\xa5\x4f\x91\xd3\xd5\xdd\x6d\xbb\xbe\xde\xcd\x58\x57\x8c\xfc\xa3"
- "\x77\xba\x2c\xf2\x8f\x7e\x87\xfe\x29\xc7\xe5\x5f\xcf\xf4\xff\xec"
- "\x9f\xf6\xfd\x7f\xf5\xfd\x0e\xc7\xe5\xff\xbe\xc9\xf7\x45\xbb\xbf"
- "\xc3\xf6\xff\x67\xde\xef\x28\xbe\xdc\x1f\x8d\x37\x8c\xad\x86\x5f"
- "\x7f\xca\x0c\x18\x9f\x9b\xd7\xcf\xc6\x98\xfe\x84\x99\x73\x7d\xbc"
- "\xc9\x3e\x83\x8d\xcc\xfb\x0a\x3c\x18\x78\xad\xac\x1c\xde\x94\x77"
- "\x81\xf4\x12\x1d\x0b\x30\x7e\x2b\x8a\x1a\x59\xe4\xfa\x46\xf0\x59"
- "\x59\x32\x3e\x06\xed\x37\xd1\x19\x2d\x17\xee\xab\xb3\xbd\xec\xa8"
- "\xe7\x2c\xd9\x43\x3a\x6b\x53\x81\x3d\x0d\x8c\xd1\xf8\x8d\x4c\x65"
- "\x31\x25\xb1\x7c\x3f\x2f\x78\x31\x86\xeb\x5f\x0c\x47\xda\xf1\x37"
- "\x95\xc4\x01\x6f\x2e\xaf\x1a\x60\x99\x4d\xeb\xbc\xe7\x51\x75\x6c"
- "\x9e\x90\x67\x10\x2f\x08\x9b\x33\xd5\x97\x32\xd6\xa7\x8e\xc7\xe5"
- "\x9a\xde\x71\x93\xaa\xcf\xc3\xef\x0b\xef\xd3\x6f\xb4\xa3\x82\x17"
- "\xcc\x31\x53\x99\x6f\x28\x15\x03\x68\xcd\x7c\x73\x79\xe2\x80\xdc"
- "\x59\x4c\x5f\xeb\x6e\x61\x87\x81\x85\xb4\x17\x8e\x79\xb7\x1b\xf3"
- "\xac\x7c\x47\x2c\x77\xa0\x7e\xeb\xc0\xcf\xad\x41\x9d\xca\x3a\x0a"
- "\x3c\x90\xff\x5a\xca\x55\x5e\xce\x89\x79\xb1\x7b\x3d\xf2\x4c\x59"
- "\xc2\x46\xad\x47\x3e\xf0\x76\x6b\x48\x46\x91\xf5\x6b\x7f\x0b\x34"
- "\xd8\x8b\x6f\xd6\x59\x66\xd2\xfd\x39\xc1\x63\xd0\xb7\xd1\x0e\x4b"
- "\x23\x3b\x27\x64\x7e\xfa\x86\xf6\xdd\x8e\x82\xb3\xc0\xbf\x7f\xa6"
- "\xa9\x7b\x8c\x0e\x59\xce\xd9\x24\x39\x5f\xad\x13\x28\x66\x9f\x7a"
- "\xc6\x6b\xc2\xfa\xe5\x58\xd7\x3b\x99\x01\xdf\xd8\x8c\x6f\x38\x8d"
- "\xab\x18\x37\xd2\xf9\xe0\x06\x1f\xe4\x1a\x45\xb5\xbd\x3d\x77\xa7"
- "\x7c\x57\xf2\x21\x82\xf7\xf0\x83\xbf\x17\xfa\x19\xf0\x1f\x69\xc0"
- "\x09\xf0\x1c\xe2\x6c\x05\xf8\x0d\x4a\xc7\x37\x36\xa3\x5d\x75\x90"
- "\x9b\xf7\x62\xed\xa6\x18\x7f\x86\x99\xe7\x7f\xce\x44\xbc\x72\xf0"
- "\x0b\x8b\x73\xb8\x57\xc6\x2f\x3b\x5b\xad\xf1\x0b\x34\x3e\x88\x47"
- "\x58\x3f\x93\x85\x77\xa1\x8f\x31\x46\xaa\xc0\x7f\x80\xa7\x3f\x67"
- "\x50\xfb\xa6\x4a\xf0\x05\x6a\xdc\x56\x89\xe1\xe7\x86\x63\x7d\x8f"
- "\xc4\x37\xaa\x20\x39\x0a\x5a\x48\x0c\x3a\x17\xa7\xad\xf5\x32\xf6"
- "\xf8\x39\x03\x07\xd6\x81\x6e\x7b\xc7\xa4\xea\x98\x9b\x9d\x4d\x47"
- "\x5f\xec\xa5\xbc\xe4\x3f\x03\xf9\xa7\x82\x1f\x3b\xae\xf6\x49\x03"
- "\x64\x02\xf0\x01\x67\x1b\xa8\x1e\x78\xa7\x1a\xb4\xa6\xbe\x58\xa7"
- "\xe2\xd8\x71\xc9\xc3\xb4\x2f\xd1\x68\x8f\xbe\x5e\x1d\xa4\xff\xb9"
- "\xd2\x50\xfa\x83\x16\xab\xd5\xbe\x1c\x1d\xd2\x77\x90\x4b\xdb\xbc"
- "\xa4\x87\xc6\xf7\xf6\x4b\x1d\xda\xb9\x13\xe4\xe3\x0c\x63\x66\x3f"
- "\x68\xb1\x1f\xf9\x2a\x08\x9b\x5f\xf8\x14\x98\x3b\x9b\x78\xa8\xb6"
- "\x93\x92\x47\x6d\xcb\xa7\x31\x8c\x7b\x11\xbb\xaf\x89\x9d\x75\x53"
- "\x79\xb8\x7f\x14\x57\xf0\xb2\x6d\x0f\xd9\x4b\x28\x9e\xa8\x95\x62"
- "\x81\x0e\x56\xfb\xda\xd1\x51\xd0\x36\x4e\x3b\xbf\x44\x63\x80\xfa"
- "\x1e\x6d\x74\x4b\x3d\x45\xdb\x38\xd2\x35\x8a\xf7\xba\xd2\xa8\x8e"
- "\x0d\x34\x3f\xb5\xe7\x48\x6f\x26\xdf\xb0\x21\xb4\x71\xab\x7d\x52"
- "\x21\x63\xf3\xb5\x9d\x50\xeb\xb6\x17\xf7\x06\xdc\x4b\xbb\xbd\xae"
- "\xb4\xb0\x0d\xf4\x4e\x5e\xf0\x1d\x9a\x3f\x18\xcb\x46\xe4\xf9\x10"
- "\x57\xae\xe5\x25\xff\xf0\xa8\x87\xf5\x45\xe1\xa3\xab\xcd\xd6\xd6"
- "\x15\xaf\xc7\x77\xbd\xf8\xae\x9e\xc6\x06\x8d\x0b\xad\x8c\x0d\x92"
- "\x46\xbb\xd1\x7f\x62\x7c\x1d\xf6\x55\x80\xee\xed\xe0\xff\xff\xe1"
- "\x91\xfc\x5d\x9b\x55\xad\x9f\x53\xc6\x8c\x68\x5d\xb3\x53\xfa\xd3"
- "\xa1\x7c\x89\x01\x79\x27\xc0\x67\xb6\x59\x69\xec\xa1\xac\x6a\x75"
- "\x4c\x18\x91\x2f\x2d\x30\x86\x84\xaf\x82\xb6\x66\xe2\x35\xd5\xfa"
- "\xd3\x9c\x3a\x29\x69\x77\x6e\x0d\x8d\x01\xf0\xf1\x5e\x75\xae\xb9"
- "\x89\x57\x95\xe3\xb0\x7d\xb7\x56\x86\xf4\x77\xd0\x36\x4e\x41\x19"
- "\xda\x58\x09\xc5\x06\xe4\xad\x07\x2e\x04\xc6\x8d\x86\x05\x2a\x4e"
- "\x45\xa9\x7c\x48\x05\xfa\x86\xfc\x92\x3b\x85\xbf\x27\x31\x2e\xcf"
- "\x37\x1d\x6e\xf7\xb1\x5f\xd3\xb8\x9c\x49\x98\x70\xfe\xbe\xb6\xe8"
- "\xd9\x09\xc1\xb1\x7d\x3e\x41\x1b\xdb\x21\xfd\x2a\xc6\xf6\x6a\x81"
- "\x47\xe7\x93\xdd\x2c\x21\x49\x1b\xfb\x34\xcf\x15\xcc\xeb\x0d\xd9"
- "\x62\x7f\xc0\x48\xfa\x40\x31\xef\xbd\xad\x42\xc6\xa0\xfe\xac\xcd"
- "\x69\x12\xbe\xe0\x5f\x50\x98\xa1\xb6\xfd\x0b\xd2\x8f\xb4\xd0\xfc"
- "\xd7\xe6\x38\xf5\x0d\xbe\xe5\x24\x7f\xfd\xab\x81\x81\x34\x07\xdb"
- "\x51\x27\x8a\x51\x4f\xbe\xcf\x2a\xa7\x27\xb2\xc5\xe8\xdb\xc3\xa9"
- "\xd4\x6f\xe7\xeb\xb4\xf3\x12\x1b\x24\x06\x44\xaa\xe3\x45\xd4\xb1"
- "\x07\x5d\x8d\x92\xae\x17\xc2\xbb\xcf\xef\xb6\x5d\x34\xbf\x43\xe9"
- "\x4a\x34\x25\xda\x22\x2f\xda\xff\xcf\x48\x8d\xae\x21\x34\xfd\x8d"
- "\x3a\x1e\x55\x6c\xbd\xd0\x2b\xb6\x6e\x90\xb1\x11\x2a\x5e\xa0\xb6"
- "\x60\x4d\xa1\xef\x8b\xd8\x3f\xaa\xec\x53\xe9\xa1\x31\x75\x61\xb3"
- "\x9b\xcd\x2d\xd3\x70\x0c\xf5\x11\xfe\xe6\xa8\xaf\x34\xec\x20\x5d"
- "\x99\x5a\x77\xa7\xd6\x1f\x54\xef\x50\x4c\xc0\x7a\x23\xce\xf7\x05"
- "\xdb\x7c\xe1\x2c\xde\x8b\x26\x6c\x0b\xf2\x57\x1d\xac\x7b\xdb\x2f"
- "\x34\x53\xdb\x69\x4c\xd8\xb2\x49\x5f\x26\xd7\x32\x37\xf3\x64\x75"
- "\xc7\x2b\xcf\x02\x69\x97\x21\xf9\x31\xc2\x7b\xdb\x4c\x99\x9f\xd6"
- "\x37\xe4\x17\xba\x79\x75\x3d\x24\x5e\x8d\xd2\x52\x55\x1a\x34\x20"
- "\x7f\x25\x9d\xc1\x26\x3f\x3c\x43\x1a\xa4\x2c\x08\x8c\xde\x4f\x31"
- "\x22\x90\xcf\x52\x0b\x39\xc0\x17\xc1\x58\x89\xca\x6f\x12\x4e\xf0"
- "\xa5\xd6\x21\x4b\x9b\xd9\x20\xdb\x4f\xf9\xe7\xa7\x98\xf7\x3a\xcc"
- "\x23\x2f\xf9\x85\x44\xd9\x96\x53\xac\xd3\x8f\xef\xc6\xa8\x57\x33"
- "\xae\x5f\xe0\x7a\x0d\xae\x35\xb8\x5e\x8b\xeb\x9f\x90\x5f\x51\xf3"
- "\x27\xe0\x7e\x07\xd2\xef\x52\xaf\xa8\xa3\x97\xf6\xb3\x93\x7f\x4d"
- "\x7c\xe5\x4c\x91\xfe\x3c\xdd\xe3\x3a\x4b\x6d\x77\xb5\x9c\xdb\xde"
- "\xfb\x50\x4e\x0e\xe5\xa3\x75\x0d\x69\x36\xe4\xb9\x89\xca\x26\x9f"
- "\x08\xa7\xd8\xc5\x13\x21\xfc\x29\xca\xb9\x48\x67\x33\xc6\xe2\xbd"
- "\xf7\x71\xcd\xc2\x75\x3d\x95\x0b\x1a\xd4\x05\xf1\xe2\xac\x7b\x6e"
- "\x8e\xec\x4f\x37\x6b\x9f\x4e\xf3\x5d\xc3\x03\x1a\x4f\xdd\xf2\x4d"
- "\x97\xf9\xa4\xfc\xea\xdd\xaf\xf5\x9d\x4f\x8e\x5b\x9b\x0f\x7d\x87"
- "\xf2\xef\xa3\xf7\x71\x7d\x40\xbd\x26\xaa\xd7\x89\xea\xf5\x67\xea"
- "\x75\x82\x7a\x9d\xe4\x66\xde\x75\x2a\x6f\x02\x9a\x79\xc9\xbe\x8f"
- "\xf6\xa4\xd4\xef\x5e\x74\x92\x7c\x0d\xfc\xbf\xbb\x8d\xe2\xbd\x15"
- "\x5c\x1c\xab\xe9\xad\x49\xf7\xd3\x55\xd0\xfa\xef\xdb\x85\xee\xe7"
- "\x62\x52\x08\x16\x56\x45\xea\x12\x19\x78\xa7\x88\x12\x3d\x57\x63"
- "\x0d\x5e\xdc\xa5\x57\xf7\xeb\x29\xee\x09\xc5\xb1\x23\x7f\x7c\x42"
- "\x8e\x8a\x3a\x16\x4f\xf3\x55\xe8\xf4\x37\x92\x7f\xa1\x19\xd5\xf8"
- "\xab\x87\x4c\x11\xc0\x7b\x92\x97\x54\xbf\x9b\x95\xf8\x56\x45\x50"
- "\xce\xbf\x98\x26\xf7\x36\xaf\x4e\x44\x7a\x88\xfc\x7f\x31\x8e\xea"
- "\x0c\x5a\xd7\xa3\x3d\x63\x1b\xd9\x45\xa2\xcd\x0f\x9a\x64\x9b\x13"
- "\xb4\x36\xab\x7d\x65\xd3\x68\xde\xc4\xbc\x9b\x81\x87\x99\x34\xbe"
- "\x1b\x03\xb8\xec\xdd\x4c\x57\x75\xfc\xa0\x9f\xbd\x13\xa9\xbf\x43"
- "\xf0\xa4\x3e\x88\xd3\x9d\x53\xbb\xf7\xcb\xb9\xa9\x3e\xc9\x2f\xd4"
- "\x63\x5e\xd2\x18\x18\xd9\x63\x5e\x52\xcc\xfa\x68\xf5\x5d\x47\x77"
- "\x8c\xbf\xd0\x4c\x18\xaf\xd6\x11\xe3\xb6\xc3\x47\x7d\xe3\x66\x9d"
- "\x36\x75\x4d\xaa\xc7\x1a\x79\x37\xd2\x9b\x64\x3d\x65\xba\xfa\x2d"
- "\x8c\xbf\x0e\xf2\x87\x7a\xad\x96\xae\x8e\x6f\x2a\xe7\x38\xf5\xb5"
- "\x96\xae\x96\x8f\x71\xda\x51\x4d\xf3\x47\x4b\x97\x63\xf2\x7c\x1c"
- "\xe1\x0d\xbd\xeb\x13\xb6\x8c\x90\xbf\x67\x56\xa2\xde\x5d\xc9\xe0"
- "\x2f\x4a\x69\x3e\xbf\xb0\x9c\x45\x2e\x2d\x66\x43\xe5\xdc\xec\x7a"
- "\x5e\x7b\x57\xea\xf4\xbb\xe6\x6a\x18\xb5\x41\xe0\xd9\xf9\xfa\xee"
- "\x58\xa9\xe8\x78\x81\xd1\xe7\x33\xcd\xa8\xac\xf1\x8d\x15\x98\x8b"
- "\x79\x5f\x82\xf7\x4a\xdc\x6c\x93\x53\x5d\x4b\xaa\xe5\x9e\x4a\xd7"
- "\x87\x35\xa5\x12\xbb\xd4\xb2\x03\xf8\x17\xc2\x87\x08\xac\xa7\x6f"
- "\x51\x59\x58\x57\x4c\xed\x76\xeb\x10\x89\xdf\x5d\x1e\x37\x1b\x12"
- "\xa7\x61\x2b\xad\x4f\x46\x1d\xb3\x15\xcd\x94\xeb\x93\x42\x3a\x30"
- "\x5b\xbb\xf0\xa7\x56\x6b\x6b\x65\xb4\x6e\x92\x9f\xeb\x94\x65\x83"
- "\xc9\xdf\x94\xf5\x14\xf3\x7f\x01\xfe\x6c\x97\xba\x37\x03\x39\xd7"
- "\xbf\x85\x64\x59\x95\xae\x98\x4f\xfe\x65\x6a\xbf\x34\xa0\x3e\xbb"
- "\x08\xdb\x5f\xc8\x96\xb1\x83\x48\x1f\x24\x62\x4d\x11\xcf\x6a\xe6"
- "\x5e\xe9\xb3\xdf\x97\x1f\xa2\xe3\x2a\x95\xf3\xa4\x6b\x9e\x88\xc5"
- "\xe0\x98\x51\x29\xf5\x89\xfe\xa1\x32\xdd\xe7\x91\x76\x08\xc2\x9f"
- "\x26\xdd\x37\x84\x99\x63\x5f\x95\x7a\xe1\xd6\x83\x92\x1f\xf1\x85"
- "\xc6\x7f\x16\xb4\x96\xfe\x7c\x7d\xcd\xc1\x79\xe1\xdb\x4f\xef\xe0"
- "\xdd\xb7\x3a\x0a\xfc\x4c\x4b\x97\x6b\xcd\xd9\xe3\xaa\xce\xac\x6a"
- "\xc8\xaa\x44\x06\x6c\x8e\xd8\x5e\xa0\xcd\x5f\x7f\xaa\xfc\xbe\x9c"
- "\xbf\xd4\x46\x1a\x0f\x34\x87\x7d\xc2\x27\xd8\xb1\x78\x9a\xcb\xf8"
- "\x5d\xed\xd3\xe6\xae\xe4\xef\xea\xc5\xdc\x15\xf3\xd6\x6f\x0b\xd6"
- "\xc3\x1f\xaf\x8e\xd5\x86\xb6\x39\xe6\x48\x3c\x5b\x87\xb5\x55\xdd"
- "\xcb\xf2\x49\x19\x63\xe3\x83\x26\xe5\x02\xf7\x92\x6e\x9a\xf4\x09"
- "\xa4\xb3\x51\xed\x55\x69\xaf\xa4\x9d\xfc\x9c\x39\x30\x1f\x82\xbe"
- "\xcd\x4c\x4c\xf3\x6d\x86\xf2\x1a\x82\xba\x63\x9f\xe6\x1b\xb4\x12"
- "\xdf\x2b\x71\xe6\xbd\x4b\xf4\xbb\x4d\xce\x31\xdf\x18\x1a\xc7\x2e"
- "\x8c\x3d\xac\x3f\xc5\x14\x8b\xbe\xa3\x40\x31\x6b\x63\x0f\x73\x74"
- "\x2e\xc6\xe8\x6b\x9b\x63\x79\x31\xfa\x94\x6c\xee\xd3\x71\xbf\x05"
- "\xd7\xb9\xf2\xaa\x33\xd1\x55\x1d\xf3\xc5\x78\x17\xf3\x7f\x70\x95"
- "\xd6\x07\xed\x51\xfb\x12\xc4\x18\xcb\x23\xfb\xc6\x04\xb1\xd7\x4f"
- "\x63\x8c\xc6\x97\xd8\xf3\xc7\x58\x33\xae\xfa\x39\xa3\x71\x26\xfc"
- "\x9d\xe4\x50\x9f\xf8\xc6\xd3\x38\x43\x59\xa5\x9a\x6f\x5f\x37\x53"
- "\xd4\xfd\x36\x65\xaf\x66\x07\x4e\xe3\x30\x6b\x34\x1b\x8e\xf2\x2d"
- "\x95\x96\x76\xd2\x9d\x7f\xe6\xf2\x4d\x64\x94\x97\x68\x27\xf1\xf2"
- "\xea\x17\xf1\x4e\x48\xff\x9f\x13\xb6\xac\x87\xa7\x0b\x7d\xe6\x55"
- "\x1d\x05\x3c\xbc\x3b\xe6\x9c\x76\x08\xbe\x12\xeb\xf3\x8d\x31\xcc"
- "\x82\x71\x8b\xb5\x86\xc7\x6b\xfc\xf0\x1d\x31\x64\x6f\x71\x9a\xea"
- "\x47\x32\x38\xf0\xf6\x74\x3c\xad\xd3\x7d\xe8\x9d\xc7\x92\xae\x88"
- "\x30\x83\x74\x4f\xa4\x07\x03\xad\x8f\x9f\xd2\xe9\x5f\xab\x81\x24"
- "\xcf\x17\x5d\xea\xdf\x39\x2f\x87\x9f\x27\x5f\x58\x96\x4c\x76\x55"
- "\xa3\x4e\x4f\x67\x35\xeb\xed\x67\x49\xc7\xc3\xcb\xbb\xe9\x78\x82"
- "\x1e\x95\x62\xf0\x97\x13\xfc\xd3\x19\xd4\xdf\xab\x2f\xff\xa7\xb3"
- "\xc8\xbc\xba\x31\xf8\x1b\xa7\xd2\xea\xaf\x1d\x85\x2c\x46\xa3\x15"
- "\x61\x0a\x61\x2c\xd9\xd9\xd0\x3c\xd7\xf9\x18\xf9\x3a\x42\x3f\xa1"
- "\xde\x2f\x7c\xef\x31\xe7\x72\xc8\xb4\x3a\x36\x51\xc8\x1c\xfa\x7e"
- "\x9e\xc9\xd6\x31\xd1\x9f\xc2\x8f\xaa\x8e\x19\xf0\xed\xcf\x37\x9c"
- "\x61\xe1\xb6\x4c\x76\x1d\xe9\xd0\x8d\x7e\xee\x24\x19\x98\xc6\x04"
- "\x68\x50\xd7\xa2\xd3\x0d\xca\x5a\xc9\xf4\x78\x3e\xaa\x45\xc7\xbc"
- "\x1a\x2f\x85\x77\x4c\x61\x5e\x16\x43\x3c\xd4\x03\x2b\xd9\x28\xd4"
- "\xff\xb8\xd6\x57\xc4\x67\x90\x1e\x2f\x10\xd7\x49\xc7\x84\x2d\x00"
- "\xf9\xac\x77\x13\xdd\x34\xac\x3a\xc3\x22\x71\xef\x0c\x6b\x67\x26"
- "\xb1\x0e\x15\xea\x30\xfe\x5b\xeb\xc5\x78\xd1\xb1\x06\x8c\xfd\xe3"
- "\xc1\x7a\x9a\x87\x87\xfc\x7e\x9c\xde\x37\xb6\x13\x0f\xd7\x17\x7d"
- "\x74\xf3\x34\xfa\xd0\xb9\x03\x23\xf8\x7f\xd1\xdf\x3e\xde\x8a\xba"
- "\x55\xdb\x96\x33\x43\x8b\x4e\xff\x38\xda\x48\xe7\x7a\xab\x84\x8e"
- "\x5f\xa7\x7f\x48\x93\xd3\x65\xbd\xf5\xc3\x8d\xab\xc2\x18\xe9\xe6"
- "\xc9\xdf\xa3\xb0\xc5\xfc\xda\x2c\xf4\xf1\x2e\x4c\x6d\x67\xde\x4f"
- "\xe8\x3b\x27\xd5\xb5\xac\xa1\xcd\x6e\x66\x87\xcd\xe3\x19\xda\xe1"
- "\xc6\x5c\x59\xd7\x6f\x9b\x57\x9d\xce\xad\xd2\xb7\x5a\xd8\x8a\xe8"
- "\x74\xbf\xa7\xb5\x84\x74\x03\x58\x47\x2a\x69\xbd\xee\x28\xd4\x8f"
- "\xd7\xe6\x0d\xd6\x89\x4a\xbc\x13\xf0\x6b\x80\xdf\xbb\xc9\xe7\x8c"
- "\x90\x1f\x64\xfe\x48\xb1\x6f\x50\xa8\xb7\x05\xf8\x6d\xe4\xa3\xf7"
- "\x84\x0d\xa1\x4e\xb7\x3a\xc5\xaf\x03\x4d\x75\xab\xa9\x6d\x72\x2c"
- "\x9a\x9f\x46\xfe\xd2\xc0\xbc\x45\x3f\x88\x79\xdb\x1a\x32\x2f\x0b"
- "\xf5\xce\xa0\x9c\xca\xe9\x6c\xb1\xa5\xb7\x79\x68\x1b\x86\xb5\x4a"
- "\x17\x76\xe7\x86\x0d\xbc\xd4\xa1\x57\xee\x7f\xa1\x88\x45\xea\xd6"
- "\x81\x6c\x34\xcf\xb2\x53\x87\x9f\xd2\x85\xdd\x67\x8c\xbc\x3a\xf9"
- "\x81\xac\x81\x3c\xcf\xcc\xf4\xeb\xcf\x0d\x34\x8c\xf6\x5e\x5d\xca"
- "\xc3\xbe\xf7\xd8\x23\x59\xb4\xf7\xed\x60\x5f\xa6\xb3\xb0\x07\xfc"
- "\xf8\x76\x24\xb3\xb9\x75\x03\x92\xe8\x8c\xfa\xe1\x48\xf0\x22\xf8"
- "\x4d\x65\xe6\x96\x30\x43\x6e\x13\x6f\x5e\x37\x7f\x80\x01\xeb\xaf"
- "\x09\xeb\xc6\x9a\x21\x91\x57\x97\x76\xa1\x8c\x77\x52\xc5\x7b\xbd"
- "\xfa\x62\x50\xeb\x56\xd3\x7b\xdd\x6c\xb1\xa8\xdb\x27\xfd\xab\x5b"
- "\xc4\xba\x60\xdd\x22\xd6\xfd\xe7\xeb\x16\xbe\x20\xa4\x6e\xa6\x60"
- "\xdd\xd2\x50\xb7\xf0\x65\xfd\xab\xdb\xc0\xea\x60\xdd\x06\x56\x7f"
- "\xc3\xba\xed\xee\xbb\x6e\x03\x06\xf4\x5e\xb7\x9c\xab\x4f\xe9\x06"
- "\x0c\xef\x5f\xdd\x06\x45\x06\xeb\x36\x28\xf2\x3f\x53\xb7\xbc\x12"
- "\xfe\x45\x2d\xb8\x5c\xd2\xe7\x10\xce\x9f\xd2\x45\x5c\xb3\x72\xa4"
- "\xb0\xe3\x8e\x46\xbd\x6a\xec\x25\xfc\x73\xc1\xdb\xe8\x06\x08\xdd"
- "\x7f\x47\xe1\x80\x35\x18\xbf\xd2\xae\x44\x17\x91\x43\x69\x4a\xd8"
- "\x88\x32\x5e\xc0\x7d\xb7\xb7\x93\xcd\xa0\x8f\xfc\xb2\xe8\xf9\xa6"
- "\x99\xec\xcd\x0b\x5e\x3d\x8f\x9e\x69\x7a\xf9\x5c\x38\x7e\x7b\xf4"
- "\x78\xb7\x52\xf3\xc5\xaa\xbd\x6b\x2c\xbe\x1c\x1e\x0d\xb8\xf8\x40"
- "\x1a\x33\x12\x1e\xd1\x95\xe2\x46\x6e\xc8\x1b\x68\x78\xe0\x2c\xd6"
- "\xfd\xc2\x08\x93\x76\xd6\x56\x2b\x6b\x4a\xf3\x40\x6e\xcc\x65\x61"
- "\x74\xde\x57\xf8\x6d\x34\x7b\x58\x5c\x2e\x1b\x30\x25\x07\xe5\x7b"
- "\x59\xaa\x31\x07\x65\x83\x1e\x82\x97\xd7\x45\x3c\x1e\x96\xce\x22"
- "\x37\xa3\x6c\xba\x3e\x60\xb6\xf3\x17\x5e\x62\xe1\x74\x2e\x98\xce"
- "\xf7\xca\xb3\xbd\x11\x06\x7c\x27\x47\xfb\xce\x15\xe8\x37\x4c\xd2"
- "\x6f\xe0\x93\x41\xfa\x0d\x1c\x1a\xa4\x5f\xc4\x87\x92\x7e\x11\x55"
- "\x41\xfa\x0d\xac\xe8\x1f\xfd\x06\x86\x07\xe9\x27\xdf\xbd\x3c\xfd"
- "\x06\xfe\xb8\x6f\xfa\x0d\x4c\x0e\xd2\x4f\x96\xd5\x07\xfd\x22\x7a"
- "\xa7\xdf\xc0\x2d\xdf\x8c\x7e\x03\x2b\xbe\x21\xfd\x86\x4a\xfa\x19"
- "\x5e\x0a\xd2\xcf\xf0\x48\x90\x7e\x86\x28\x49\x3f\x83\x21\x48\x3f"
- "\x83\xb7\x7f\xf4\x33\x4c\x08\xd2\x4f\xbe\x7b\x79\xfa\x19\x96\xf5"
- "\x4d\x3f\x83\x23\x48\x3f\x59\x56\xff\xe8\x67\xf8\x08\x74\x33\xa9"
- "\xf4\x33\xf5\x4d\x3f\x83\xf7\x1b\xd2\xcf\x28\xe9\x37\xe8\x44\x90"
- "\x7e\x83\xd6\x07\xe9\x37\xe8\x51\x49\xbf\x41\x93\x82\xf4\x1b\x3c"
- "\xae\x7f\xf4\x1b\xb4\x3a\x48\x3f\xf9\xee\xe5\xe9\x37\xe8\xad\xbe"
- "\xe9\x37\xa8\x2e\x48\x3f\x59\x56\x1f\xf4\x1b\xd8\x3b\xfd\x06\x0f"
- "\xff\x66\xf4\x1b\x3c\xee\x72\xf4\xeb\x1f\xaf\x31\x58\xc8\x3a\xdf"
- "\x42\x39\x9b\xfb\x2a\x87\x68\x48\xf6\x89\x4a\xe1\xe0\xcd\x3b\x95"
- "\x08\x83\x3c\xc3\x31\x38\x09\x32\xcc\xbd\x8d\xba\xc1\x27\x77\x2a"
- "\x03\x0c\xbc\xe0\x2f\x15\x4a\xc1\xfb\xa9\x7c\x55\x44\xb8\xb2\x6a"
- "\x60\x38\xf9\x22\xe8\x33\x0e\xb5\x6e\xc8\x7d\x61\xd7\xb0\xeb\xe9"
- "\xbc\xde\x0b\xe0\xd7\xe8\x77\x47\xe1\x90\x24\xf0\x22\xf5\x3d\x69"
- "\x32\x77\xc1\x62\x11\xd4\x32\x73\xde\xdc\x25\x19\x73\x67\x65\x64"
- "\x59\x66\xcd\x79\x6e\x71\x77\x5f\xf1\x22\x1e\xe4\x6a\xea\xbf\x21"
- "\x01\xff\x67\x14\xd3\x91\xfc\xec\xd9\x6e\x60\x83\x5a\x74\x43\xea"
- "\x84\xff\xfe\xe8\x99\xb9\xbc\xcb\xba\x2d\xf1\x46\x7e\x48\xf8\x0f"
- "\xec\x4a\xdb\xc6\x1d\xd6\x38\xf2\x09\xa3\xee\x4d\xc4\x9d\xd2\x0d"
- "\xfd\x8a\x47\xcd\xae\x23\x9b\x0e\x71\xb6\x43\x17\x69\x11\xbc\x5c"
- "\x01\xaf\xe2\x26\x6b\xae\xe2\x98\x5d\xc7\x37\xce\xae\x22\x1a\xd4"
- "\x92\xef\xb6\xec\xb0\x51\x8d\x3a\xe3\x6e\x1e\x65\xcd\x45\x59\xf9"
- "\x6a\x39\x22\x1e\x47\xe2\x72\xfe\x19\x95\xa7\xf2\x82\x14\x9f\xc3"
- "\x29\xf9\xc1\xc8\x79\xc6\x55\x96\x30\xca\x4b\x3e\x14\xc9\xb7\xa0"
- "\x16\x93\x89\xea\x4d\x79\xc1\x8f\xdf\x8b\xf7\xef\xa5\x98\x94\x81"
- "\x32\x64\x9d\xae\x42\x9d\x4a\x44\x5b\x1c\xd6\xf8\xb6\x15\xd6\x6d"
- "\x22\x2e\xa2\xa0\xab\x71\x23\xbe\x1d\x2f\xe2\x59\xfa\xbe\x16\xf1"
- "\x2c\xd5\x77\xae\xc3\x3b\x02\x4f\xc9\x6f\xaa\x2c\xc3\xb8\x4c\xab"
- "\x17\x78\xe8\xc1\xb8\x9f\x15\xf2\x8d\x21\xb8\x7f\x28\xe4\x79\x24"
- "\xee\x6f\x03\x1f\x1a\xa5\x3e\x1f\x8a\xfb\x28\xe2\x4b\x45\xbb\x8a"
- "\xf2\xa5\x4d\xb4\x6e\x18\xd9\xc6\x98\xd4\x3c\x51\x2d\xba\x61\x27"
- "\x88\xd7\x55\xcb\x88\xc6\xfd\x01\x92\x19\xd5\xe7\x31\xb8\xff\x0d"
- "\xed\x0b\xa8\xcf\x87\xe3\xfe\x97\xb8\xbf\x45\x7d\x0e\xbe\x7e\xe8"
- "\x7e\x51\x67\x93\x35\x8b\xda\x04\xda\x97\x13\xdd\x41\xeb\x2c\xa4"
- "\xc5\x41\x5e\xb5\x53\x3f\x52\x3b\x9d\xcb\x5b\x58\xa3\x6e\xe8\xef"
- "\xe9\x5c\x9e\xec\xab\xd9\x75\xd2\xb7\x8f\xde\x8a\xf4\x72\x4a\x27"
- "\xdb\x72\x65\xe3\x6c\xf1\x1b\x75\x7d\x88\x68\xa8\x7e\x0b\x32\xd1"
- "\xd0\x7a\xb5\x9f\x41\x3b\xf2\xbf\xcb\xf2\x5f\x56\xfb\x02\x75\x1b"
- "\x88\xba\xdd\xad\xee\x7b\x34\x4f\xf1\x75\xc9\xf3\x45\xba\x61\xec"
- "\x5f\xf2\x37\x81\xf7\x24\xee\x0d\x4b\xd4\x62\xf5\xb9\x75\x43\x85"
- "\xaf\x08\x1a\x9f\xa4\x5f\xf1\x44\x59\x4d\xc2\xbf\x0a\xc6\xa8\x36"
- "\x56\x68\x9c\xf0\x88\x21\x56\xa1\xab\x29\x1c\x16\x38\xff\x8b\x77"
- "\x2b\xd4\xf8\x06\x4c\xca\x09\xc3\x8a\x03\xf6\x45\xba\xa1\x02\x1f"
- "\x42\x9e\xed\x0d\x79\x36\x5e\x7b\x26\x6c\xe0\x0a\x87\xd5\x85\x3c"
- "\x1b\xd3\xe3\x59\x6b\xc8\xb3\x91\xdd\xcb\x34\x1a\x42\x9e\x45\x76"
- "\x7f\xcf\x18\x17\x7c\x16\xe9\xed\xf1\x2c\x31\xe4\x59\xb3\xfa\x2c"
- "\x0c\xe9\xd6\x80\x7f\x43\x5d\x64\xbd\x9a\x0e\xac\x37\xda\x42\xd2"
- "\xab\xd4\x74\xfa\x3e\xf8\xbf\x7d\x15\x6a\xba\x18\xe7\x18\x47\x37"
- "\xab\xdf\xd8\x15\xf2\x8d\x62\xd9\x87\x56\x19\x5f\x43\x17\x49\x71"
- "\x77\x06\xd2\x98\x32\xae\xca\xa7\x58\x39\x0e\xe9\xcb\x4b\xce\x43"
- "\x11\x6f\x99\x62\xc2\x22\x5f\x5f\xd8\xd8\xab\x8d\x60\xa1\xc9\xac"
- "\x9d\x63\xf5\x3b\xac\x31\x8a\x63\x1f\xc5\x90\x1b\x45\x3e\xbf\xec"
- "\xad\xe4\xf7\x45\x8b\xbd\xd7\xc9\x5c\x59\x1d\xf9\xe4\x29\x41\xf5"
- "\x13\x33\x8c\x7c\x96\xd5\x0a\xfd\xce\x69\x19\x7f\x8f\xce\xf7\x6e"
- "\xb4\xc6\x2c\x6d\x65\x23\x6d\x3f\xe5\x4d\x24\xe7\x49\x4c\x30\xad"
- "\xc3\x3b\x46\xd5\x97\xc3\x4b\xe2\xbc\xb9\xce\x54\x45\x69\xae\x56"
- "\xa1\x67\x36\x9c\xd2\x45\x99\xc5\x73\x6e\x7d\x49\xb6\x37\xca\x2c"
- "\x64\x69\xf5\x5c\x21\xea\xe9\x0c\xc4\x87\xd4\x45\x8d\x3c\x1f\xb5"
- "\xa5\x1e\x69\xc7\xbb\xd9\x37\xea\x4c\xa7\xa9\x4c\x6a\x87\x5b\x67"
- "\x72\x50\xd9\xc8\xe3\x0d\xd8\x37\x22\x7d\xa9\x8f\x8d\x40\xdd\x4e"
- "\x69\xe5\x77\x14\x46\x99\xdd\x3a\xa3\x90\x2b\xa9\xcc\xf3\x1b\xdf"
- "\x46\xb9\x51\x63\xdc\xe1\xb7\xc8\x58\x8c\x85\x51\xe3\xdc\xec\xbd"
- "\xc8\xbe\xd6\x3f\xa1\x93\x34\xcd\xa6\xb8\xaf\x1e\xcc\x79\xb7\x3c"
- "\xf3\x3f\xbb\x59\xca\xf2\x51\xbf\x24\xfb\x0b\x8a\x55\x4d\xfb\x8e"
- "\x12\x77\xa2\x84\x3d\x04\xa5\x81\x36\x65\xc0\x67\x71\xe6\xa0\x7f"
- "\x73\x32\x4a\xac\x7f\x1b\xce\x31\x43\x91\x6a\xf3\x8a\x7a\xba\x43"
- "\xe2\x34\x48\xfb\x7f\x5d\xf4\xa0\xda\x1c\xb1\xf7\x24\xea\xd8\xb3"
- "\x0e\x54\x5f\x94\xb5\xba\xcf\xb5\xd4\x34\xdb\x2d\xf4\xa0\x9b\x66"
- "\x5a\x84\x2d\x99\x2e\xfa\xd1\x30\xf3\xb5\x15\x1d\x85\xd1\x49\x81"
- "\xf8\x14\xc8\x53\x44\x36\xc1\x28\x3f\xd0\xce\x4c\xfa\x46\xb4\xd8"
- "\x47\x73\xeb\xa2\xd7\x00\xc7\xdc\x54\x07\x35\x7d\x4d\xad\xcf\x4b"
- "\x67\xeb\x7b\xf5\x9f\x45\x6b\xa4\xf0\xbd\xb4\x69\xb6\x9b\xce\x4f"
- "\xdc\xe1\xd5\xea\x7c\xd5\x1a\xb2\xdb\xa7\x3a\x4b\xda\x5e\xb5\x52"
- "\xa3\xe3\xfa\x73\x28\x3b\xef\x63\xd6\xa4\xbb\x6a\x00\xd9\xb7\xd0"
- "\x39\x94\x0d\xcb\x55\x9b\x2b\xa4\x89\x7c\x9d\x5a\x9e\x68\xa1\xef"
- "\x20\x7b\x5f\xc2\xd3\x9d\xe4\x77\x00\x65\x16\xa1\x2f\x84\x4f\x11"
- "\xdd\x55\x8f\x08\xfd\x66\x26\x93\xed\x26\x7b\x36\xdd\x55\xbb\xe5"
- "\x58\xb9\x6a\x82\x5b\x77\x95\x3a\x77\x65\x1a\xc5\x3a\x27\x3b\x84"
- "\x33\xba\xab\x6e\xa2\x98\xa9\xa0\x87\x87\xfc\xce\xd5\xb6\x63\xbe"
- "\xe4\x74\xd2\x58\xf0\x50\x6c\x3c\xe4\x8f\x93\xeb\x03\xd1\xfc\x2a"
- "\x03\x7d\x9f\x68\x4b\xf1\x62\x41\xd3\xf7\x50\x76\x40\xff\x41\xb1"
- "\x69\x41\xb7\xfd\x7d\xf5\x0b\xd1\xc8\x8f\x3a\x93\x17\x0f\xe7\x88"
- "\x8f\x51\xbf\x98\x05\x4a\xf4\x6c\x37\xd9\x4f\xe2\xb7\xea\xeb\x54"
- "\xf6\x9d\x9c\x4b\x31\xf7\xe1\x1b\x67\x69\xaf\x91\x6c\xc6\x45\xbc"
- "\x6e\xdd\x55\xcd\x2a\xfd\x44\xbc\x0a\x47\xb6\xa4\x83\x9a\xbf\x44"
- "\xea\x65\xae\xed\xe8\x28\x8c\x19\x17\xd4\xcb\xc4\x08\x9f\xc5\x9a"
- "\x8d\x35\x9e\x4d\x0d\xa9\x73\xbb\x38\x07\x78\x8e\x64\xea\xab\x7c"
- "\xf4\xad\xf5\xe4\x17\x8c\xc6\x45\x4b\xe8\xf8\xbf\xea\x13\xaa\x27"
- "\xd9\xe6\xf9\xa3\x66\x5a\xf8\xc6\x99\x71\x44\x67\x94\x1d\x83\xb9"
- "\xe0\xee\x23\x1e\xba\x88\xc7\x84\xef\x55\x86\xc4\x98\xc5\x3a\x18"
- "\x73\x5e\x5b\xe7\x68\x8d\x26\x3f\x0f\x81\xb4\x8d\xc7\xc8\xee\xdc"
- "\xaa\xf2\x38\xd6\x3e\x7d\x14\xde\xce\x12\xe8\xac\x31\xd9\x69\xd3"
- "\x78\xe3\xa6\x63\xe3\xc8\xef\x31\xf9\x70\x74\x2e\xff\x01\xea\x3b"
- "\xfc\x95\x17\x63\xb9\x8c\x4f\x7c\xfb\x39\xb2\xd1\x69\x3d\x95\x2b"
- "\x7c\x13\x19\xa6\xe4\xf8\xf8\xcb\x32\xc6\xb4\x87\x47\x1d\x1b\x47"
- "\xcf\x84\xdf\x7f\x2a\xf3\x5f\xf5\xe1\xab\x1b\x6e\x53\x79\x99\x56"
- "\xe0\xe4\xd5\x2d\xba\xe1\xe2\x3c\x23\x7e\xc7\xb6\xe8\x62\x6b\x64"
- "\x5c\x44\xe9\x87\x5e\xb5\x35\x8c\x90\xe7\xf3\x3d\x4c\x9c\x97\xd6"
- "\xc5\xde\x67\xf9\x1e\x63\xad\xba\xd8\x89\xc2\x27\xb4\xc3\x9a\xa6"
- "\xd2\x20\x6d\x83\xac\x97\x31\x25\x47\x2f\xea\x48\xf5\xeb\x5f\xdd"
- "\x62\xb5\xf5\x32\xa2\xa3\x30\x36\x59\x3b\xd7\x2f\xda\xaf\xfa\x8a"
- "\x76\xde\x40\x72\x4b\xec\x01\x75\xed\x4a\x57\xbf\x9d\xfe\x2d\x7c"
- "\x7b\x8d\x5a\x66\xa2\xf0\x97\x0d\xba\xa0\xdc\x44\xd4\xa3\x5e\x5b"
- "\x4f\x55\x1b\xf9\x31\x72\x9d\x8f\xf5\x04\xd7\x52\x49\xc3\x6e\x67"
- "\x76\x16\x2d\xca\xb2\x80\x61\xb7\xcd\xca\x9a\x93\x66\x99\x97\x99"
- "\xb9\x28\xd3\x42\xce\x6d\x42\xe7\x98\xb0\x81\x29\xbc\x3a\x5c\x8d"
- "\x71\x56\x16\x88\x71\x56\x78\x75\x52\x68\xec\x39\xb7\xee\xea\xe4"
- "\x6f\x47\xae\xb9\xba\xcf\x73\x7e\x0e\xbd\x52\x8e\xbf\x0a\xfc\x39"
- "\xf1\x57\x45\x72\x4e\x8a\x97\x25\x62\x7d\x14\xe7\xd3\x82\xe7\xd5"
- "\xaf\x8e\xa3\x7d\xf0\x46\xdd\xd5\xef\xef\x54\xc2\x99\xf0\x6b\x52"
- "\xa0\x90\x2d\x09\xf9\x36\xaf\xc0\x9f\x13\x7f\x55\xf8\x13\xef\x29"
- "\xef\x8a\xb3\xb6\xe5\xa1\xcf\x68\x6f\x9a\x17\xec\x6a\xa5\x3c\x7c"
- "\x55\xb8\xe0\xff\x94\x4d\x32\x5f\x8f\x3a\xe8\x79\x61\x54\x92\x9a"
- "\x4f\x9c\x89\x1e\xb6\x8a\x59\x7a\xc9\x17\xc6\x0b\x87\xe4\xa8\xf9"
- "\x84\x5d\x9a\xd6\x1e\xf2\xbb\x8f\xfc\x5a\xbe\x70\x5e\x38\xdc\xa0"
- "\xe6\x13\x63\x4d\x29\xd0\xf7\xf6\xdd\x01\xbc\xe0\xc4\x5e\x35\x9f"
- "\x29\xb4\xbc\x90\x3c\x11\x4a\xa1\xbe\x81\xf2\x28\xab\xc2\x85\xfe"
- "\x1f\x7d\x99\x8e\xfc\xbd\xfa\x2b\xed\x5f\x3f\x5d\x13\xd3\xb3\x9f"
- "\x6c\x73\x16\xcc\xfb\xc9\x82\x8c\x6c\x8a\x02\x95\xb5\x68\x49\x16"
- "\x5d\x33\x66\x3d\x27\x2e\x8b\x52\xe6\xcf\x91\x3f\xb2\xd2\x13\xe8"
- "\x47\x3a\xc6\x1b\x5d\xe7\x2e\xb1\xd1\x65\xce\x22\xba\xcd\x49\x1b"
- "\xb3\x64\x8e\x16\xba\x3a\x74\x1c\xc6\x77\x14\x5e\xb3\x1f\x63\x63"
- "\xb7\xe4\x47\xae\xa9\x82\xfc\x2b\xf6\x81\x8d\xab\xdc\xec\x48\xbc"
- "\x88\x71\xc7\x2e\xf1\x57\xa0\xbb\xe6\x23\xf2\x57\x60\x5c\x65\x9b"
- "\x63\xf4\x2d\x98\x07\x9c\xcd\xef\x28\x1c\x11\xee\x66\xbf\x76\xaa"
- "\xbc\x50\x8e\xf0\xf9\x59\x78\xcd\x54\xcd\xbe\x50\x71\x58\xc7\x90"
- "\x2f\x7b\x61\x6f\xb4\x89\x7c\xe1\x58\xad\xb8\xcf\xda\xb9\x49\xc4"
- "\x94\x01\x6f\x68\x1d\x8b\xfb\x5c\xdc\x53\xec\xb5\x91\x8a\x63\x92"
- "\x93\xce\x27\xe2\xde\x82\xfb\x38\x94\x3f\x57\x9b\x17\xa1\xb4\x51"
- "\x83\xaa\xfd\xa4\x57\xf9\xb8\xbb\x3f\x29\xcc\xad\x11\x65\x5a\xcc"
- "\x5a\x11\x9f\xb6\x70\x44\x45\x20\x3e\xad\x88\xc3\x64\x9a\x2e\xd6"
- "\x35\xb1\xb6\x5f\x7b\x77\x98\xf9\xba\x07\x25\x1f\x3e\xc2\xad\xf9"
- "\x64\x90\x7c\xf6\x08\x4f\x48\x6c\x5f\xdc\x5f\xcb\x02\xb1\x7d\x25"
- "\x1f\xba\x4d\xf2\xa1\xd7\x4e\xe2\x85\x23\x6c\x81\x38\x6c\x85\xd7"
- "\xc6\x87\xc6\x61\x73\xe3\x39\xc9\x37\x48\x4f\x0c\xae\x83\x23\x28"
- "\x7e\x70\x58\x6f\x71\x8c\x21\x9f\xe7\xa4\x2c\x03\x2f\x8e\xab\xe0"
- "\xcb\x55\x1e\x98\xd2\x79\x41\x22\xf9\xb7\xb1\xd0\x33\xe2\xfd\x7a"
- "\xd5\x39\x5c\x2f\xda\x75\x82\x7c\xe6\x7a\xec\x73\x75\x37\xee\x64"
- "\x3a\x71\x2f\x7d\x3e\xf2\x33\xba\x6b\xc5\x39\x36\xcd\x1f\x5c\xe8"
- "\x99\xf8\x5e\xcf\x1e\x1c\xd3\xf6\x8c\xd3\x17\x19\x7d\xb3\xe6\x49"
- "\x3e\x6e\xe4\x8f\x25\x96\xce\x9c\x20\xd7\xfb\x91\x71\xfc\x31\x19"
- "\xab\xc4\xad\x1b\x59\x46\xe7\x91\x8c\xba\xf4\x45\x1c\xef\x1a\x73"
- "\x66\xcd\x13\x69\xc8\xf7\x02\x78\x2d\x59\xbf\x91\x83\x5c\x23\x9b"
- "\x19\xbf\xe0\x97\x67\xfd\x75\x23\x0d\x33\xaf\xcb\xa7\xef\x18\x04"
- "\x1f\x71\x8c\x45\x52\x4c\x3c\xaa\xdb\xce\x10\x7f\x75\x1b\x90\x26"
- "\xe2\xdd\x3f\xc6\x22\xc9\x3f\xaf\x5a\x17\x83\x88\x33\x56\x38\xb2"
- "\x54\xf3\x99\x83\xef\x5d\xe2\x6b\xf9\xb1\x5f\x88\x19\x72\xd3\x9c"
- "\x31\xc9\x13\xf1\x6b\x8c\x1a\xce\x35\x74\xec\x8c\x6c\x8b\x4e\x5d"
- "\xd3\xf6\xc6\x33\x4b\x45\x3c\xc4\xc2\x91\xe0\xa1\xae\x55\x63\x28"
- "\x3f\xfd\x15\x61\x8b\x88\x13\x48\xe7\x0a\x95\x76\x7c\x77\x54\x8d"
- "\xf0\x8d\xab\x97\xfc\xa2\xf0\x49\x57\x38\x72\x2f\x8f\xb6\xca\xb8"
- "\x82\x51\x29\x66\xf4\x9f\x58\xf7\x69\x6e\x88\xf3\x93\x26\x6a\xfb"
- "\x75\x93\x80\xa9\x0f\xe0\x6f\x9a\x8c\xed\xf2\xf4\x57\x5a\xb9\xe4"
- "\x3f\x0a\x63\x8b\xfc\x48\x61\xbc\x5c\x67\x0b\xd8\x08\x69\x67\x32"
- "\x75\xd7\x6d\x24\xdf\x56\x41\xfe\x7c\xd4\x5b\x92\xaf\xbc\xae\xc4"
- "\xcd\x8c\xc5\x72\x7e\x5f\x87\xf1\xbf\x67\x82\xfa\x1b\xf2\xef\x5d"
- "\x55\x3d\xca\xf0\x6b\xba\x0f\xd9\x77\xd7\xd5\x63\x2c\x3e\x80\xbf"
- "\x69\xc8\xdf\xa4\xc5\x82\x7e\x41\x2f\xce\x16\x9d\x0a\x33\xb3\x04"
- "\xa4\xfb\xb4\xf4\x01\xba\x44\xd0\xe6\xfa\x48\x0d\x4f\xda\xa2\x67"
- "\x8e\xc1\xfd\x48\xf0\x9b\x9b\xd5\xfb\x71\xb8\x1f\xa3\xdd\xe3\xf7"
- "\x38\x0d\x6f\x48\x07\xd1\xb6\xc2\xfa\x12\xc9\x7f\x73\xcc\xe0\xc9"
- "\xcc\x24\x5f\x5d\x0f\xf9\x77\x77\x82\x9a\x77\xae\x9b\xbd\xa1\xbd"
- "\x87\xf6\x7f\x6f\x7c\x90\xfe\x61\x46\x59\xff\x51\xbb\x78\xd4\x3e"
- "\x2f\xc5\xe0\x46\x9e\xcd\x98\x4b\xd2\x7f\x46\x76\x6b\xe9\xba\x4e"
- "\xd3\x54\x17\xa4\x11\xe7\x7c\x1a\x17\xa3\x84\x6d\xcd\xfa\xe5\xa6"
- "\x64\xe2\xef\xc8\xe7\x80\x88\x69\x46\xbe\x21\x7d\x2c\x42\xf8\xe3"
- "\xdf\xb8\xaf\x59\xf8\xa1\x5f\x1a\x1f\xa9\xf9\x85\xe4\x8e\x69\xc0"
- "\xfe\x17\xe3\xc8\x57\xa4\xd0\x9b\x75\xc4\x0f\x13\xfe\x21\x55\xbf"
- "\x90\x3b\xb2\x59\x4c\x89\x22\xfd\x42\x0a\x7f\x04\x97\xf1\x0d\xc9"
- "\x0b\x8e\x9a\x34\xdf\x90\x68\x33\x9d\x33\x8c\xe7\x17\x7c\x5e\x5c"
- "\xe3\x42\xfc\xda\x84\xf7\xea\x27\x52\x0f\x8c\xd4\x4b\x3f\x91\xfd"
- "\x5b\x5b\x46\xd9\xe4\x98\x18\x55\xae\xc5\xa5\x0e\x49\xab\xc4\x98"
- "\x56\x31\xe8\x3a\x87\x9a\x06\xfe\xe7\xf5\x92\x00\x1f\x06\x6c\x23"
- "\xfd\x21\x9e\xc7\x70\x7b\xda\x4b\xa1\x73\x88\x31\x5a\xa2\x07\x60"
- "\x6e\x45\xe0\x6f\x20\xfd\x4d\x0a\xe0\xc4\x05\x5e\x4f\xb2\x80\x51"
- "\x87\x75\x25\x27\x8c\x4f\xf1\xf9\xc2\x52\x7c\xba\xe3\xc4\x63\xd2"
- "\xd9\xea\x29\x7e\x1f\x9d\xf1\x0f\x9f\xe2\x6f\xa3\x78\x91\xc7\xe9"
- "\xcc\xd8\x86\xf9\x74\x86\x71\x14\xa7\x58\x32\x53\xfc\x5f\xf3\x97"
- "\xe5\xd9\xcc\x3a\x92\x01\xfc\x17\x78\xb5\x3f\x9b\x57\xa1\x0f\x22"
- "\x49\xbe\x20\x3f\x5b\xc3\x74\x5e\x36\xcc\x16\x76\x68\xf2\xf9\x43"
- "\x9c\x7c\x6c\x51\x1c\x31\xa5\xd0\x0b\x4c\xb4\xe8\x52\x7c\x61\xf9"
- "\x2e\x5f\x93\xf0\xe5\x3f\xc5\x3f\x90\x4f\xc9\xb9\x87\x8b\xf8\x5f"
- "\xd9\xbc\x12\x78\x1a\x26\x62\x42\x2f\xe3\x6d\xf8\x6d\x98\xb2\xac"
- "\x8d\x53\xbc\x4a\x94\x5d\x35\xc5\xa7\x74\x4e\xc9\x51\xec\x29\x39"
- "\x3a\xbc\xf7\x39\xde\xfb\x1c\xf5\x49\x40\x99\x26\xdc\xdf\xcb\x5f"
- "\x9e\x4f\x67\x9d\xf2\x85\x8c\x83\x36\x3a\xd5\xf3\xa3\x15\xa8\xdf"
- "\x5e\xf2\x05\x9e\xe2\x73\xe6\xbf\xac\x9e\x07\x15\xb1\x52\x73\xba"
- "\xb8\xfa\x9d\x71\x53\x96\xb1\x7b\x53\x96\x8d\x12\xe7\x4a\xe9\xcc"
- "\xd4\x14\x9f\x05\xdf\xcc\x27\x7a\x44\x8a\xf8\xd4\x74\x6e\xaa\x70"
- "\xb4\xf5\x72\x71\x2e\xc9\x1e\x64\xf1\x35\x4c\x4f\x7a\x00\xff\xab"
- "\x93\xeb\xc8\xe7\x97\xdd\xc3\xbd\xa4\xdf\x3b\xd4\x59\xaf\xb7\x64"
- "\x87\x03\x3f\x47\xaf\xac\xb5\x25\xf4\x7e\x76\xae\x68\xea\x71\xbe"
- "\x65\xfa\x58\x5e\x34\xad\x1c\xd7\xbd\xdc\x91\x32\x89\xec\x52\x79"
- "\xd1\x53\xeb\xf8\x96\x19\x48\x9f\x91\x86\xeb\x5e\x5e\x94\x3a\x81"
- "\x6f\x99\x89\xfb\x39\x16\x5c\x71\x7f\x77\x24\xf2\x27\xf0\xa2\x1f"
- "\xe6\xe2\x5a\xce\x8b\x7e\xd4\x8a\x7c\xb8\xff\xf1\x74\x5c\x71\xff"
- "\x93\x6a\xe4\xc3\xfd\xf8\xf1\xa7\x74\x37\x4c\xc2\x6f\xa4\xcd\xf3"
- "\xc9\x6f\x2d\x30\x88\x6f\x15\xa5\xc7\xc8\x6f\x2c\xb2\xc8\x6f\x64"
- "\x8e\x91\xdf\x58\x32\x4e\x7e\xe3\x9e\xdd\xc8\x37\x8e\x17\xdd\x5b"
- "\x8c\x6b\x05\x2f\xba\x6f\x35\xf2\xe1\xfe\x01\x1b\xae\xb8\x9f\x88"
- "\x6f\xcd\xc4\xfd\xcf\xa8\x7c\xdc\x3f\x34\x16\xf9\xc6\xf3\xa2\x87"
- "\xe3\x70\xdd\xcf\x8b\x1e\xa1\xf2\x71\x3f\x25\x1c\x57\xdc\x27\xb7"
- "\x23\x1f\xee\x1f\x6b\xc2\x15\xf7\x39\x68\xd3\xf4\x44\x5e\xb4\xcc"
- "\x8b\xab\x93\x17\xad\xc0\xf7\x66\xe0\x7e\x65\x2a\xae\xb8\xb7\xe3"
- "\xfd\x99\xb8\xcf\xaf\xc2\x15\xf7\x05\xd4\xd6\x09\xbc\x68\x35\x7d"
- "\xa7\x92\x17\xfd\x92\xda\x8c\xfb\xff\x6f\x17\xae\xb8\xff\x15\xd5"
- "\x07\xf7\xbf\xa6\xf7\x70\xbf\x0e\x34\x98\x3e\x89\x17\x6d\x28\xc1"
- "\xb5\x8a\x17\x6d\x4a\x47\x3e\xdc\x6f\x19\x8f\x2b\xee\x8b\x41\xc3"
- "\x99\xb8\xdf\xd6\x80\x2b\xee\x77\x50\x7b\x93\x78\x51\x69\x3e\xae"
- "\xd5\xbc\xe8\xdf\xa7\x22\x1f\xee\x5f\x8d\xc7\x15\xf7\x65\xa0\xdf"
- "\x4c\xdc\xbf\x5e\x87\x6b\x75\xef\xfd\xf9\xe6\x24\xbe\x2a\x82\xf1"
- "\xa2\xb7\x73\xf8\xaa\x81\xb8\x1e\x88\xe7\xab\x06\xc4\xf3\x22\x67"
- "\x3d\xd2\x71\x3d\x18\x83\xfb\x31\xea\x3d\xae\x87\x18\xee\x13\xd4"
- "\x7b\x5c\x0f\xb5\xe2\x7e\xac\x7a\x8f\x6b\x25\xdd\x83\xc6\x47\x70"
- "\x8d\xa0\x2b\x78\xdc\x01\xe3\xd5\x7b\x5c\xff\x52\x81\xab\x8f\x17"
- "\xbd\xbb\x0b\xe9\xa0\xd5\xe1\xb9\xb8\xc7\xb5\x32\x0e\xf7\xa0\x45"
- "\xe5\x1a\xdc\x4f\xf0\xdc\xf4\xb0\xb0\x5d\x52\x62\x6f\xf0\xf0\xd8"
- "\xd4\x72\xfb\x79\xa6\xa7\x31\x4a\x31\x23\x2c\xd9\x6c\x54\xa3\x2e"
- "\xee\xa6\xf2\x3c\xb7\x9e\xf2\xf8\xb7\x4e\x4f\x50\x62\xa7\x93\x6e"
- "\x3a\x02\xf9\x06\x9e\xd2\xdd\xf4\x28\xad\xa3\xae\x5c\xb7\x88\x5b"
- "\xa7\xfa\xaf\x8b\xc0\x3b\x8f\x80\x6f\x18\x47\xb1\xbe\x41\xaf\x74"
- "\x5e\x30\xe0\x1c\xae\xad\xbc\x60\x48\x23\xe8\x85\xfb\xa8\x63\xb8"
- "\xe2\xfe\x87\x6b\x41\x2f\xdc\x3f\x7d\x3f\xae\xad\x1d\x85\x71\xbb"
- "\xdd\xba\xd1\xbb\xc4\xba\xf0\xc6\x33\x36\xa3\x8f\x03\x8f\xb0\x26"
- "\xff\x66\xad\xc7\xe8\x73\x32\xbe\x25\xa3\xce\x48\x7e\xd8\x5e\x49"
- "\x42\x5d\xc7\x90\xff\x38\x92\x73\x22\x78\x57\x9c\x5e\x7e\x7b\x08"
- "\xc7\xb7\x4f\x90\x7e\x94\xc7\x4e\xe8\xeb\xf9\x45\xf1\xfc\x86\x5f"
- "\xdb\xe4\x73\x03\x0b\x3e\x7f\x1a\xcf\x6f\xba\xc6\x48\x3a\xed\x9b"
- "\x1f\x10\xcf\x5d\xed\xcd\x6a\xbb\xc2\xe8\xd9\xdd\x94\xd7\xad\xbb"
- "\xc9\x2a\x75\x5c\x71\xd3\x79\x41\x18\x6b\x33\xa5\x8c\xed\x28\xbc"
- "\x29\x0d\x75\x9f\xab\xf2\xd8\x63\xb8\xc9\x9a\x20\x7d\x15\xcc\xe9"
- "\xcb\x8f\x8a\x41\xd9\x9c\x65\x5d\x5f\xc0\xeb\x48\x6e\xc5\xfa\xa3"
- "\xb7\xe4\xc5\x55\x34\xea\x6e\x19\xbb\x83\xf4\x11\x31\x6b\x13\xe8"
- "\x3c\x11\xbe\x79\xb1\x6b\x53\x4a\xae\x65\xb9\x11\xdf\xbf\xe5\x6e"
- "\xbb\x97\x9f\x77\xe6\xdd\x8f\x75\x52\xa4\x57\x08\x1b\x75\xf9\x7b"
- "\x97\xb4\x2b\x12\xbf\x1d\x52\xb7\x7a\xcb\x58\x7a\x37\x54\x4e\xf0"
- "\x17\x7e\x39\x57\x89\x5d\x9b\x28\xf7\xc5\x6e\xf2\x1f\x50\xdc\x7a"
- "\x63\x16\x1b\x60\x59\x7e\x08\xe5\xdf\x3c\xa1\xbb\x4c\xa9\xe5\x15"
- "\xcf\x6e\x3d\x88\xbc\xdb\x85\xfe\xe7\xe6\xa9\x9a\xee\x98\xa3\x0d"
- "\xbf\x96\xfc\x14\xc9\xe7\xe1\x92\x2f\xbc\xf9\x38\xf9\xd1\xf4\xc5"
- "\x2c\x4c\xf4\x6d\xbe\xc1\xed\xdf\xbc\x36\x81\x6f\x5d\x9b\x38\xcc"
- "\xa7\x63\xc2\xbe\x5f\x77\xcb\xa0\x3b\xbc\xa4\x97\xfb\x80\xf2\xbe"
- "\xa3\x44\x9c\xdd\x7b\x7b\x0e\xd3\x3b\x33\x3f\xc6\xfd\x2d\x90\xd7"
- "\x7c\xcd\xae\xd6\x7a\x46\xbe\x80\x71\xcf\xf8\xda\x98\xf1\xca\x60"
- "\xc3\xd8\x9d\xc4\xcf\xe6\x90\x3e\xe9\x18\xbd\xf7\x4b\xf4\x0b\xe4"
- "\x86\x9b\xdd\x5a\x5d\x28\x16\xc0\x7a\xd0\x8e\x78\x4d\x3a\x8f\x9d"
- "\xe2\xf7\x93\xef\xa8\x35\x6e\xd0\x41\xf6\xd7\xcd\x95\x84\xf9\xf2"
- "\xbb\xb7\x5c\xa3\x44\xa7\xa4\xd5\x4e\xa7\xbd\x57\x03\xf9\xe2\x39"
- "\x2f\xce\x6f\xfa\x28\x7e\x1f\xad\xb3\x32\x6f\x68\xdf\x2d\x50\xcf"
- "\xad\x2e\xc8\xc8\xca\x7c\xde\xb2\x78\xc1\xf2\x79\xf7\xdc\xb4\x64"
- "\x8c\x25\x33\xc7\x92\x29\xe2\x45\x8b\x84\xb9\x63\x2c\x8b\xd3\x17"
- "\x65\x59\xb2\x96\xd9\xe6\x5d\x1a\x0f\xd8\xcc\x4d\x29\x13\x24\x0f"
- "\x78\x9b\xf4\x33\x50\xba\xb6\x39\x2b\x97\x2b\x96\x1b\x06\x82\xc7"
- "\xbf\xe5\xf8\xc5\x88\x5b\x12\xe9\x2c\xbb\x52\x60\x61\x6a\x4c\xeb"
- "\xc8\x97\xa2\x19\x9d\x13\x31\x74\x14\xde\x52\x1d\xdc\x4f\xb9\x2d"
- "\x46\xea\x3b\x6e\x71\x63\x3c\xae\xa6\xb4\xcd\x9a\x7f\x2f\xf5\x99"
- "\xdc\x8f\xa0\xf8\x7e\xeb\xa4\xbf\xb1\xd2\xb5\x93\x24\xef\x18\x9f"
- "\x20\xbe\x6d\x59\xdb\xcc\x77\x25\x91\x6f\x2b\x1d\x8d\x55\x11\x37"
- "\x97\x9d\x13\x67\x59\x31\xd7\x92\xe9\x1c\xb9\x7f\x6b\x4a\x9d\x12"
- "\x9b\x91\xac\xbc\xfa\x48\xb9\xfd\x37\x4c\xff\x26\xb0\x20\xdc\x82"
- "\xf9\x70\x03\x1b\x75\x28\xaf\x59\x7f\x46\x17\x7f\xdf\xa1\xbc\x7a"
- "\x3d\xdf\x9c\x5a\xd6\x16\x37\xb3\xde\x5b\x20\xfc\x80\xa2\x0c\x2f"
- "\xfb\x0b\x46\x13\xe4\x9d\x8a\xf6\xe1\xd9\xde\xf6\xe1\x29\x15\xde"
- "\x2d\xf6\x54\xe7\x0d\x3f\x60\x13\x6f\xe5\x5f\xbf\x57\x49\xba\xaa"
- "\x31\xbe\xf7\x26\x90\xae\x30\x65\xbc\xd7\x94\x92\xd8\xbe\x75\x21"
- "\xd9\xf2\x79\x2e\x6e\xb5\x97\x77\xc6\xce\x4e\x38\x8c\x3c\x1f\x40"
- "\x46\x38\x6a\xc1\xf8\x1d\xcd\xf4\x17\x6f\x4e\x4a\x7c\xb3\xd3\xa1"
- "\xaf\xaa\x1c\x2f\xf5\x9b\xa9\x98\x33\x62\x3c\xc5\x7f\xf1\xde\xde"
- "\x4a\x86\x6f\xb3\x37\x3b\x27\xe9\xff\x32\xae\xe7\xf3\x5b\x07\xbc"
- "\x97\x50\xc9\x3a\xc8\x37\x2b\x64\xb1\x83\x1f\x17\x33\xbe\x75\x89"
- "\x69\xcf\x72\xaf\x7e\xba\x9b\xe9\x6b\xea\x8b\x59\xee\x17\x6c\xa8"
- "\xef\xeb\xf8\xf0\xd7\xf1\xfe\x45\xf2\x79\x78\xd4\x2c\x7c\x9f\xe5"
- "\x39\x45\x1c\x58\x63\x2d\xf8\x13\xe5\xeb\xf8\x88\xda\xa9\x14\xa7"
- "\x68\xda\xbb\xbe\x87\xcd\xac\x26\xcd\xc3\x5c\xd6\x52\x76\x51\x9f"
- "\xc8\xde\x7a\xaa\x94\x6d\x87\x1c\xb0\xfd\x0c\x8b\x94\xfb\xb6\xf1"
- "\x11\xbe\xae\xf8\x70\xdf\x8a\x78\xf2\x45\xc3\xf9\xd7\xf1\x83\x89"
- "\x1f\xf5\x2d\x8a\x37\xd4\x7a\x4a\xd9\x1d\xcd\x2c\xfe\xa2\x9e\x19"
- "\x2f\xae\x88\x1f\x5c\x6b\x2b\x46\x59\x14\xbc\x9a\xe9\xc8\x0f\x16"
- "\xf9\xc7\x22\x3a\x0d\xb1\xb2\xa9\xad\xba\xf8\x03\x83\x8f\xb3\xe1"
- "\xe4\x87\x91\xfc\xa8\x91\x2f\x58\x25\x66\x89\xc9\x1f\xb3\xb0\x2e"
- "\xef\x3c\xf9\x0d\xf1\x32\x60\x65\x32\xf1\xc8\x33\x81\x53\xd4\x66"
- "\x85\xc7\x0f\x4e\xa1\xeb\xa6\x69\xef\x12\x9f\xac\x74\x98\x29\xbe"
- "\x91\x81\xea\x89\x79\x6a\x58\x79\x12\xb4\xb4\xc7\x87\x23\x5f\x24"
- "\xd2\x87\xb9\x5a\xbd\xcc\x7f\xdb\x33\xa9\xb7\xdb\x44\x1c\xdb\x98"
- "\x9d\x79\xcc\xe4\xc8\x63\x31\x96\x1f\x12\xed\xc6\x7c\xe2\xdf\xf3"
- "\x4c\x32\x2f\xfc\x09\xd6\x93\xf0\x91\x32\xed\xfb\x07\x2c\x0f\x32"
- "\x66\xf9\x81\xf8\x3d\xcf\xf2\x13\xf4\x61\x4c\x96\x4d\xf0\xf0\x42"
- "\xb6\xfb\xfe\x93\x72\x8c\x7f\xff\xd1\x8b\x11\xab\x7d\x4a\x61\x85"
- "\x59\x59\x15\x6e\xa1\x78\xd7\x67\x74\xdf\xbf\x9b\x17\x1d\x4b\xe5"
- "\x9b\xed\x62\x2c\xe2\xfe\xce\x8b\x11\x3f\x4c\x45\x5a\x25\xca\x4f"
- "\xbc\xa8\x0b\xaf\xc7\x5f\x83\xfa\x7e\x3c\xb5\xdb\xbf\x2b\xa9\x8a"
- "\xda\x2d\x62\xe2\xa0\x5d\x29\xe8\x33\x1e\x9b\x65\x11\x7e\xe2\xbb"
- "\x40\x5f\x35\x66\x28\xd1\x83\x68\xa0\x74\xc5\x0f\x16\x6d\xed\x8a"
- "\x8f\x04\x7d\xc9\xe7\xaa\x31\x6f\x16\xde\xd9\x9a\x35\x16\xcf\x86"
- "\x5d\x8c\xc9\x4a\xa3\xd8\x54\x2e\x9b\x87\xf9\xb7\x64\x25\x90\x4f"
- "\xb1\x97\x96\x63\xce\x0d\xcf\x02\xbf\x93\x35\x5e\x9d\x5b\x8c\xea"
- "\xa9\x14\xfd\xd5\x74\x91\xce\x04\xa0\x6e\xa8\x1f\xd6\xde\xf0\x06"
- "\xb7\xee\x7b\xbb\x2f\xde\x94\x54\x8f\x6b\x3e\xea\x6a\xe1\x85\x8f"
- "\x35\xd3\x6f\x3c\xb3\xa0\xce\x5b\x88\x0e\x44\x0f\x95\x16\xeb\x83"
- "\xb4\xb0\xc7\x21\x5f\xae\x52\xf8\x87\xfd\x6e\xdd\xf7\xa7\xf3\xc2"
- "\x47\xca\x42\xf2\xfd\x29\x98\x6f\x6d\x95\xcc\x77\x20\x5d\xe6\xb3"
- "\xa2\xdc\x31\x8f\xaa\xf4\xbe\xd8\x0b\xbd\xcf\x06\xdf\x5d\x6c\x93"
- "\xef\xfe\xd6\x27\xdf\x7d\x80\xde\xbd\xb5\x7b\x9d\xc6\x8c\x0e\xe6"
- "\x5f\xb8\x4b\xe6\xff\xb7\xdd\x32\xff\x3d\xad\x21\xf9\x1e\x0a\xe6"
- "\x5b\x96\x20\xf3\xed\x99\x20\xf3\x4d\x4a\xc2\xf3\x5f\x5e\x5a\x97"
- "\x31\x2b\x83\xef\x6c\xdd\x2b\xdf\xa9\x4a\x95\xef\xcc\x6e\xc0\xf3"
- "\x3f\xf5\xa8\xcb\x9e\x60\x7e\x87\xda\xee\x77\x3d\x32\xff\x8c\x35"
- "\x21\xf9\x3e\x92\xf9\xe8\x79\x0d\xf2\x7d\x3f\xf9\x62\x44\x49\xb1"
- "\xcc\x97\x16\x4f\xe3\x11\x79\xce\x2b\x85\xe3\x27\x5d\x8c\xf8\xf1"
- "\x58\x94\x33\x01\x7d\x33\x92\xae\xe8\xbb\x91\x8a\x23\x05\xfd\x7a"
- "\xeb\x7e\xda\xbf\x20\xcc\xc5\x9a\x50\x02\xdc\xf5\xf7\xbe\x37\x7a"
- "\xdb\xd8\x80\xbe\x4c\x01\xff\xb0\x65\x7a\xef\x3c\xfa\xa6\x69\x63"
- "\xc9\xa6\x81\x30\x05\x98\xfb\x0a\xf9\x9a\xe3\xf6\x49\xaa\x8e\xea"
- "\x36\x61\x5b\x47\xbe\x1e\x48\x8f\xa9\xa6\x89\xf3\x38\x0a\xc6\x26"
- "\xe4\x4c\xe1\xdf\x8f\xf4\x96\x58\xa3\xd0\x9e\xdb\x2a\x80\x13\x03"
- "\x5e\xd4\x2b\xe5\xf8\xab\xc0\x9f\xf3\x45\xd2\x67\x16\xb0\x89\x9a"
- "\xae\xb7\x8f\xba\x62\xfd\x5b\x5f\x1c\xd4\x77\xdd\x06\xda\xdd\xd6"
- "\x7f\xdf\xd9\xba\xdb\x3c\x97\xd9\x77\x0a\x17\x3e\xd7\xb7\x4e\x4f"
- "\x76\x28\x32\xa6\x3c\xe6\x22\xf8\xbc\xdb\x27\x62\xcd\xcf\x17\x3e"
- "\x64\x37\x67\xd4\x29\x71\x58\x4b\x4e\xb3\x30\x57\x6e\x33\x2b\x57"
- "\x9a\xf5\x8e\x4e\x16\x5e\x8b\xf5\x94\xf2\x97\x83\x77\xb0\x64\x10"
- "\x0f\x75\xfb\x0c\xc7\x05\xb5\xbc\xd2\xb5\x1e\xfb\x42\x19\x3b\x9b"
- "\xf8\x4d\x5a\x83\x80\x3b\x91\x22\x9e\x5a\xc6\x40\xca\xbb\x11\xbf"
- "\x0d\x94\xf7\xe2\xcd\x0f\xdb\x2e\xfe\xdb\x5a\x4f\xe7\xd6\x59\x09"
- "\x9d\x37\x4f\x4e\xee\x8a\xcd\xa8\xeb\xda\xba\x30\xd9\xf7\x6f\x6b"
- "\x53\x7d\x37\x27\x79\xfc\xb1\xb3\xca\xf1\x6d\xac\x4f\xc5\xfa\x37"
- "\x94\x72\xfd\x1b\x79\x4e\x3d\x95\x7b\x28\xaf\x4c\x7f\x30\xaf\x4e"
- "\x7f\x50\xa9\xd0\x1f\xca\x73\xe0\x5a\x4a\xb1\xb5\xc0\xd7\xde\x7e"
- "\xf2\x60\x5e\x15\xd6\xc7\x3b\x2c\x68\xbb\x45\xd3\xab\xf2\xfb\x7d"
- "\xac\xb6\xcc\xc7\x8e\x64\x9d\x67\x9e\xa8\x94\x09\xf8\x9b\xe4\x19"
- "\x9e\x65\xf5\x0c\xb7\xa7\x8a\x3a\xc7\x2e\x11\x6d\xa4\xb3\x5d\x07"
- "\x15\x59\x67\x95\x1e\x28\xf3\x8e\x87\x76\x2a\x74\xfe\x4b\xf5\xaf"
- "\xab\x4b\x08\xbf\xc4\xbf\xae\x5e\xc6\x75\x0b\xf8\xd8\xfd\xaf\xf0"
- "\xaf\xab\xea\x24\xc8\xbf\x2e\x64\xe1\x3a\x55\x16\x76\xaa\xbe\x94"
- "\x22\x49\xfe\x15\xbe\x94\x72\x9c\xc2\x1f\x92\xd8\xe7\xdf\x92\x5e"
- "\x4e\x7c\x68\x47\x61\x42\xa2\x26\xe7\x12\x6f\xe5\xdf\x98\x32\x15"
- "\x7f\xc9\x48\xb7\xba\x75\x7f\xad\xd4\xd2\xf9\xd6\x1b\x49\x8e\x08"
- "\xf3\xf3\xb4\x9f\x76\xd0\xb9\x25\x9e\x76\xaf\x7f\x4b\x8a\xd3\xbf"
- "\xc5\x9e\x88\xb4\xf1\xf8\xbb\xc7\xbf\xe5\xc6\x76\xfc\x79\xf1\xe7"
- "\xf3\x6f\x89\x03\xf6\xc6\x85\xe3\xcf\x80\x3f\x13\xfe\x62\xf0\x67"
- "\xc6\xdf\x48\xfc\x59\xf0\x17\xa7\x6c\x89\x8b\x24\x7f\x81\x7c\x6b"
- "\x5c\x02\xc6\x81\x59\x2b\x37\x48\xef\x84\x03\x68\x7f\x22\xf1\x7d"
- "\x7c\xd8\xb1\x5c\x8e\xf9\xce\x5f\x79\xd8\x2b\xea\x4f\xb8\xfc\xca"
- "\xcc\x7a\xcf\xe8\xb5\x6e\xcf\xf0\x25\x6e\x5c\x27\x79\xa2\x5e\x74"
- "\xe0\xaf\x18\x7f\xa5\x9e\x2d\x59\x36\xf4\x29\xfa\x76\x09\x64\xf9"
- "\x3b\x81\xcb\xe3\x4c\x52\x7f\x75\x27\x70\x6e\x9c\xaa\xd7\xba\x13"
- "\x98\x31\x56\xcc\x2d\xe4\x73\xe2\x3e\xc9\xad\xfb\xa1\xc8\xd7\x16"
- "\x9b\x95\xaf\x9e\x79\xca\x47\xfa\x5c\x77\xf8\x03\x36\x99\x6f\x21"
- "\xf9\x1b\xa4\x32\x73\xb4\x79\xd8\x2d\x86\xc6\x1c\x5b\xca\xc2\x59"
- "\x39\x29\x8b\xd3\x17\xcc\x99\xb7\xf8\x27\x96\x9b\xe6\x5a\xe2\x17"
- "\x64\x3e\x9f\xf2\xfc\x92\x79\x4b\xe6\x09\x16\x12\x49\xb7\x76\xdb"
- "\x8f\xa2\x58\xc9\xcc\x07\x79\x68\x58\x13\xe7\xb4\x76\x27\xb5\xa3"
- "\x8f\x6e\x58\xeb\xd9\x7f\xc6\xa3\xf7\x83\x87\x8b\x6c\xca\xc7\xdc"
- "\xcc\xa8\xdb\x7f\xc6\xab\x8f\x6c\xb2\x30\x8e\xf9\x40\xcf\x5c\x4d"
- "\x75\x2a\x4f\x77\x8c\x55\x13\x4f\x87\x3c\x6f\x64\x78\xf5\x93\xe9"
- "\xfd\x57\x93\x3c\x6f\xe2\x37\xd2\x92\xe9\x3d\x0e\x3e\x4f\x5c\xc1"
- "\xe7\xc9\xfb\x59\x09\x07\xc5\x75\x61\xf2\x41\x91\x6f\x56\xf9\x21"
- "\xba\x5e\xc8\xe5\xd5\x28\x97\x74\x75\xfc\xd5\x87\x6d\x22\xcf\xab"
- "\x93\x65\x1e\xcc\xc5\x46\xdd\x5d\x06\xca\x27\x64\x2b\xd4\xf1\x4d"
- "\xd4\xc3\xbe\x84\x85\x6b\xf3\x9b\x64\xa9\xc0\x1c\xcf\x26\x9e\xf7"
- "\x07\xcf\xd3\x1c\xa7\xfa\x70\xcc\xe9\x3d\x78\xf7\x8d\x0c\x8f\x78"
- "\x1f\x32\x66\x18\xc9\x96\x84\x23\x84\x1f\xae\xdc\x3a\xf1\x7e\xb9"
- "\x52\xa7\x27\x79\x0c\xef\xfe\x9e\x9e\x95\x80\x4f\x2d\x11\x72\xc9"
- "\x0f\x5a\x35\x59\x60\x5d\xac\xf4\xa7\x14\x99\xca\xe8\xdc\xf7\xa8"
- "\x33\xba\x3b\x8f\x10\xfd\x88\x5e\xb4\xff\xcb\x0b\xef\x5c\x5d\x12"
- "\xcd\xc2\x77\x44\x33\x83\x6f\xf8\xda\x71\x72\x0f\xe0\xae\x31\x1a"
- "\x7f\xdd\x1e\xb3\x76\x5c\x68\xbf\xc9\xfe\xb2\xcc\xcb\xa0\x9d\x8c"
- "\xb9\x62\xcb\x70\xd6\xe2\xc5\x4b\x16\xce\xb3\xcc\x9b\x35\x27\xcd"
- "\x22\x1e\x5b\x96\x2c\x46\x96\x05\x59\x8b\x2d\x8b\x96\x66\x58\x16"
- "\x2e\x5e\x40\x92\xc2\xbc\xcc\xcc\x25\xb6\xac\xc1\x4c\xbe\x69\x59"
- "\xb8\x24\x3d\x6b\x81\x0d\x3f\x16\xcf\xcb\x98\x6b\x11\xbd\xbe\x18"
- "\x45\xa5\xa7\x5b\xd4\x2f\x2c\x4e\x9b\x95\x49\x03\x21\xe3\x19\x64"
- "\x0a\x79\xbf\xbb\x1c\x11\x49\xfe\xaa\x68\xed\x39\xa3\x1b\xbb\xbe"
- "\x32\x1c\xb4\xde\xbc\x76\x1c\xd9\x2c\xe0\x7e\x9d\x90\x2d\x0b\xef"
- "\x1a\x4f\xfb\x3b\x2f\xa2\x8d\x6d\x37\xcd\xac\xef\x28\x1c\x6b\xd0"
- "\xda\x46\xfe\xe1\x85\x7f\x44\xf2\xbd\xa9\x1b\xbb\x4c\x9c\xc5\xc3"
- "\x7c\x10\x36\x2d\x85\x77\x4d\x91\xb4\x18\x3b\x2e\xd4\xb7\xb6\xf0"
- "\xd3\xa8\x1b\xfb\xa8\xdc\x1b\x19\xbb\x8e\xf8\x23\xd5\x9f\x3d\xe4"
- "\xb5\xbb\x56\xd2\x3b\xca\x16\xfb\x24\xbc\x67\x0b\xca\x28\x63\x27"
- "\x51\x7e\x91\xaf\xf0\xae\x6d\x7c\x78\x16\x78\x93\xb1\x63\xa8\x5e"
- "\x7d\xac\x33\x96\x0b\x28\xf7\x68\x39\x63\xdf\x8f\x61\xf1\x17\x36"
- "\xcd\x31\x75\x44\xa7\x58\x3b\x0b\xd8\xc0\x4e\xac\x6d\x5e\x3d\x1b"
- "\x75\x11\xe3\x62\xd9\x9d\x2c\x6c\xe5\x23\x4c\x5f\xfe\x6c\x39\xf9"
- "\x77\x65\xd5\x93\x8a\x99\x2b\xd5\xcd\x5c\xde\xdd\xac\xda\xd9\xc8"
- "\x6a\x7c\xbf\x93\xb1\x17\x96\x93\x8c\x71\xf7\x59\xf2\x39\x65\x5f"
- "\xc9\xfd\x6f\xee\xf3\x0c\x78\xa3\xa5\x9c\x62\x26\x8c\x72\xf9\x3e"
- "\x73\xba\x72\x77\x31\x57\x8e\xcb\x49\x67\xf1\x41\xb7\x4f\x0e\xe2"
- "\xd9\xa0\x6a\xbc\x37\x99\x0d\xc4\xfd\x87\xf4\x8d\x35\x5b\x79\xfd"
- "\xaf\x62\x79\xc3\xaf\xb6\x72\x37\xc6\x14\xc5\x40\x68\x5e\x1f\xcb"
- "\x5b\xd7\xab\x7e\xe5\x68\x9c\xda\xb2\x99\xb9\x45\x77\x77\x9a\xd0"
- "\x85\x4c\x10\xf7\xd7\xe0\x5e\xac\xff\xae\x9c\xad\x74\x3f\x02\xf7"
- "\x6b\xe4\xfd\x4e\xba\xbf\x16\xf7\xc5\xf2\xfe\x3d\xba\x1f\x89\xfb"
- "\x32\x79\x5f\xcb\xc4\xb9\x74\xdd\xdd\x15\xf2\xfe\x6f\x74\x0f\xda"
- "\xdf\x5d\xe5\xcc\xa6\xfa\x7e\x8a\x3e\xbb\xfb\x23\xfb\x27\x90\x55"
- "\x73\x4e\x89\xf9\x70\x28\x2f\x8d\x74\x35\x98\x0f\x77\x3f\x39\xa4"
- "\x81\xe4\xdc\xbb\xbd\x11\x09\x74\x1d\xeb\x33\x7a\xd9\x40\xf0\x8d"
- "\x43\xd0\x9e\xf7\x89\x76\xbd\xf2\x31\x6f\xa4\x8c\x9a\xe2\xe3\x4e"
- "\xfe\x4a\x52\x33\xdf\xb2\x28\x99\xbf\x32\x99\xf6\xec\xb1\xd6\x4d"
- "\x37\x95\x2f\xf7\x0a\x1f\xbb\xe0\xd5\x31\x87\x7e\x28\xec\x0b\x3d"
- "\xe0\x7d\xfb\xf0\xb9\x69\xe2\x5b\x52\x93\x21\x53\xd6\x3f\x12\xef"
- "\x23\xfb\x43\xf0\xfb\x3f\x7c\xff\x48\x1a\xf1\x0e\x4b\x0e\x2b\xbb"
- "\x26\x27\x28\x76\x2b\xe3\x71\x49\xcd\x8f\xa4\x71\x27\xd6\x31\x9d"
- "\xd4\x9f\xf3\xcf\xf0\xfd\xcf\xc4\x77\x6f\x4a\x6a\x56\x96\xa6\x51"
- "\xcc\x27\x81\x2f\x79\xb4\xa6\x67\x03\x4f\x56\x58\x8d\xfe\x2d\x4b"
- "\x9c\x47\xd2\xbe\xe8\x5f\xfc\x34\xdd\x0f\xfb\xf4\x97\x4d\x75\xf2"
- "\x73\x2b\xf3\xe1\x3b\x3e\xb4\x95\xf8\x87\x37\x94\x2a\x3d\xf8\x98"
- "\xe6\x3d\xb3\xeb\x07\xf0\xa5\x56\x23\xda\x74\xa7\x2b\xfe\x3c\xab"
- "\xed\xa4\xb9\xf2\xa3\x35\x47\xd0\xab\x13\x73\x7c\x4e\xa3\x47\xd8"
- "\xc2\x99\x6c\xcf\xb2\xeb\xf9\xf0\xd4\xe4\x16\xdd\x8f\xea\x27\xe7"
- "\xa2\x0d\x68\xfb\xc1\xc6\xfa\x70\x05\xed\xb8\x43\xd2\x8d\xde\xdb"
- "\x0f\xda\xd6\x6b\x32\x4e\xff\xea\xff\x23\x31\x6e\x94\xc5\x56\x46"
- "\x67\x04\xdf\x04\xcf\xa2\x74\x59\x8d\x0a\xd6\x23\x7a\x76\x24\xfe"
- "\x34\xa3\x6f\x4a\x5a\xff\x48\xc6\x8d\x88\x03\x9d\xf1\x7d\xf2\x49"
- "\xac\xd1\x15\x79\xf7\xfb\xbb\xd2\x7a\xef\xff\xad\x4b\x1c\xa8\x5f"
- "\x1d\xdf\x72\x63\xaf\x76\x38\x58\xdb\x0f\xa9\xe3\xc3\x80\x3f\x33"
- "\xff\xcd\xda\x64\x8c\x81\x78\x11\x93\x73\x6b\xba\x53\xd3\x17\x61"
- "\xbe\x61\x8c\x8c\x7b\xb2\x3c\xaf\xb9\x77\x9f\xac\x8e\x7d\x66\x11"
- "\x0b\x6d\xc0\x67\xdc\xe8\xa7\x18\xbf\xe7\xc9\x36\xd5\x7c\x24\xbe"
- "\xbd\x9f\x7d\x3a\xae\xa4\xaf\x3e\xa5\xf2\x27\xde\xca\xbb\xfa\x59"
- "\x5e\xdf\xf1\x1f\x76\x81\x2e\x31\x37\xba\x3b\xf9\x04\x9d\x94\x43"
- "\x7e\xb2\x91\x68\xe5\xc3\x3a\xb2\xfc\x23\xa6\xf7\x62\xbd\xfc\xdd"
- "\x13\x6b\xf4\x63\xb0\xce\xf8\xc1\x0b\xbc\x5f\x57\xc9\xa6\x24\x31"
- "\x7b\x4d\xda\x39\xa6\xc5\x38\xc3\xba\x96\xfc\xda\x13\x1e\x3d\xed"
- "\x61\x51\x4c\x33\x21\xb3\x6f\x5d\xec\x78\xfd\x6f\x5e\x92\x63\xf3"
- "\xf7\xfc\xcd\xa3\xf7\xb5\x59\x2d\xc2\xbf\x36\x64\x09\x7b\x1a\x57"
- "\x02\xfb\x5a\x14\x83\xc1\x31\xad\x8a\x62\x46\x1f\x4d\xae\x13\xe7"
- "\xb6\x8f\x5a\x2b\xd9\xd1\x86\x62\x56\xdd\xf4\x09\x9d\x35\xfc\xcd"
- "\x51\xab\x83\x78\xca\x61\x3e\xf0\x8d\xdb\xc1\x37\x62\xbe\x0e\x52"
- "\x4c\xfb\xcc\xda\xde\x16\xed\x73\x69\x3c\xa3\x0f\x73\xb4\x44\x8d"
- "\x73\xe6\x2b\x1c\x97\x5f\xa2\xee\x73\x51\xfc\xb3\x6d\xd9\x2c\x6e"
- "\x9b\x5e\xb1\xf6\xb6\xaf\x35\xec\x79\xe1\xd7\xc5\xac\x44\xed\x0b"
- "\xc4\x41\x9b\xfc\xbc\x85\xbd\x8d\xb6\x1f\x89\xef\xef\x9c\xfc\x89"
- "\xf0\x5b\xe8\xc3\xb8\xf3\x61\xcc\xf9\x40\x4f\xb7\xee\xc7\x49\xe8"
- "\xb7\x5e\xe5\x31\xad\x0f\xba\xec\x5a\x1f\x8c\x1f\x2d\xfa\x00\x72"
- "\xdc\x8a\x27\xd5\x3e\xf8\x18\x7d\xd0\x84\x3e\x28\x60\xf9\x1f\x4c"
- "\xad\x66\x53\x92\xd1\x07\xad\xe7\xc8\x37\xbb\x8c\x33\x97\x25\x69"
- "\x2f\xfa\xe2\x63\x8f\xbe\xb6\x5d\xf6\xc1\xee\xa7\x64\x1f\xbc\xf1"
- "\x94\x07\x7c\x4c\x52\xe2\x6b\xb8\xf7\x2f\xb5\x5a\x28\xee\x0e\x2f"
- "\x48\xa5\x98\xd8\xb2\x2f\xba\xd0\x17\x5d\xb2\x2f\xf2\x9e\x47\x5f"
- "\x1c\xaf\x17\xfe\x5d\x8e\x36\x54\xb3\xea\xd4\x52\x56\x03\x5c\x42"
- "\x5f\xcc\xa2\x7e\x21\x1d\x83\x7f\x45\x7c\xf4\x4b\xcb\x59\x4c\xc9"
- "\x72\x66\xd6\xfa\x43\xe9\x42\x7f\x2c\x47\x7f\x74\xa2\x3f\xbc\x81"
- "\xfe\x88\x11\xfd\x71\x5a\xed\x8f\x4e\xb2\x8f\x43\x7f\x74\xa2\x3f"
- "\x3a\xd1\x1f\x05\xb2\x3f\x08\xe7\x27\xb7\x1b\xb9\xf2\xcf\x78\xb6"
- "\xb3\xa5\x97\xfe\x58\xa1\xf6\xc7\xc7\xff\x4a\x7f\xfc\xaf\xd6\x4b"
- "\xfb\xe3\x27\x75\x57\xea\x8f\xe0\x9c\xb8\xe7\x08\xf5\x47\x57\xa9"
- "\x3a\x27\x6e\xa6\x39\x91\xaf\xff\x3e\xd6\x22\xa2\xe9\xfb\x75\xfb"
- "\xc5\x9c\x40\x5b\xf3\x5f\x7b\xc2\xab\xaf\x6e\x42\xbf\xcc\xe5\x7e"
- "\x21\x13\xab\xfd\x22\xfb\x23\x23\xb9\xec\x6f\x92\xfe\x96\x9f\xd3"
- "\x9a\x41\x73\x83\xfa\x07\xfd\x84\xf9\xd3\x5b\x8c\xc0\xd0\xfd\x5f"
- "\x94\xa9\xd0\x3c\xa1\x39\x42\xf3\xa1\x26\xed\x13\x11\x73\xfd\x68"
- "\x72\x15\xa3\x7d\xe0\xa3\xd6\xfd\xe8\xab\x62\xe6\x5f\x8a\xbe\xc9"
- "\xc6\x3c\xd1\xb1\xd1\x14\x2b\xf0\xa8\x75\x0d\xf1\x0b\x26\x8c\xf9"
- "\x41\x7e\xf4\x93\xbf\xc3\x3c\x78\x1d\xe4\xac\x97\xb3\x83\xf3\x66"
- "\xa7\x1a\x17\x99\x47\x8c\xcb\x47\x7a\xb8\x0f\x7d\x84\xb9\xd3\x6d"
- "\xce\x04\xe2\x25\x7f\x1e\xcf\x76\x34\x32\xc3\xd0\x05\xb2\x8f\xfc"
- "\x21\x73\xe6\x91\x05\x34\x67\xf2\xd1\x47\x1f\xf5\xb3\x8f\xee\x11"
- "\xfb\xbe\x90\x3f\x1d\x7c\xf8\x8d\x6e\xac\x93\xe8\xa3\xf1\xa9\x7d"
- "\xf5\x91\x7f\x57\x92\xc1\x6f\x4a\x49\x24\x1f\xf1\xca\xa2\xa9\x3a"
- "\x05\x32\x54\x27\x64\xd7\xa3\x1e\x1f\xcb\x9d\xc1\xf4\xcb\x3f\x61"
- "\x11\xae\xa9\xc7\x98\xcb\x5d\xc1\xc8\xdf\x32\xe9\xbe\x29\xee\x82"
- "\xcb\x57\x01\xbc\xb2\x3b\xe9\x7e\x87\xb8\xf7\xb0\x15\x33\x58\x98"
- "\x88\x21\x6a\x2d\x65\xeb\x30\x3e\xf7\x3c\x55\xaa\x57\x36\xa7\x96"
- "\x71\x13\xc5\x8b\x61\x4e\x3a\xfb\x64\x5f\xc6\x22\x6b\xd2\xaa\xc9"
- "\xe7\xdc\x67\xe4\x43\xb8\xb6\x1d\x65\x7a\x78\xa7\x1f\x6b\xc6\xce"
- "\x02\x5e\x41\x3e\xf4\xef\xa0\x35\x82\xfc\x61\xe8\x7e\xfa\x1b\xe2"
- "\x45\x48\x07\xe8\xcc\xdb\x06\xde\xeb\xa7\xaf\x50\xdb\x90\xa6\xab"
- "\x79\x96\x6c\x34\xee\x1f\x4e\xf5\x92\xfa\x78\x79\xbd\x83\x62\x2d"
- "\xc6\xe6\x87\x1d\xc8\xf3\x84\x3b\x20\x13\x83\x47\xa3\x72\xce\x72"
- "\x29\x1f\xc6\xbb\x8e\x7b\x85\x2e\xd6\x63\x4f\x8b\x70\x2c\x27\x7f"
- "\xbd\xe4\x8f\x9f\xd6\xec\xfb\x8e\x50\x1c\x64\x8c\xd9\x78\x1e\x9b"
- "\xee\x2c\x9f\xed\xd1\x07\xd7\xe5\x7b\x21\x2f\x26\xc5\x4f\x8c\xe7"
- "\x76\x8a\x5b\x70\x10\xed\x22\x39\xe8\x77\x8d\x5e\x81\x29\xaf\xcf"
- "\x5e\xa3\x27\x5d\x91\x17\xf8\x50\xfd\xb7\x3f\x88\xb8\xae\xa7\x74"
- "\x89\xb7\x7d\x60\xf5\x31\xfa\xfe\xe3\xb7\xd2\x7e\xcb\xbd\xa9\x17"
- "\xf5\xef\xfa\x2e\x46\x8c\x6b\xb0\x37\x05\x63\x5a\x86\xc6\xae\x24"
- "\x9c\xd9\x33\x1b\x65\x12\xce\x34\xe6\xeb\x25\xb6\x24\x92\xbe\xd2"
- "\xd0\x13\x5b\x6a\x5a\x4f\xb3\x3c\x8c\xe3\x9a\xb4\x52\x11\x5b\x62"
- "\x18\xf0\x5d\x59\x01\x3c\xe9\x8a\x8f\xde\x01\x3c\x21\x1c\xd8\x09"
- "\xfc\x50\x56\x98\x07\x17\x75\xb2\x31\x1a\x8e\x10\xef\x45\xd7\x19"
- "\x18\xa3\xc6\x2a\xa4\xa1\x9f\x14\xe0\x3a\xf0\x24\x7e\xfb\x72\x16"
- "\xb7\x1d\x63\x74\x07\xe1\x08\xf8\xe2\xc9\x36\xe0\xc8\x52\xe0\x48"
- "\xb6\x88\x2d\x6c\xde\xa9\x97\xf8\xb1\xaf\x71\x8d\xde\xa1\xc5\x16"
- "\x17\xf4\x4d\x7c\xa7\x96\xc6\x47\x6a\xbe\x38\xdb\xe6\xa7\xf5\x69"
- "\x85\x35\xac\xb6\x1d\x63\x64\xab\xbd\x9c\xd2\xc4\xbc\x5d\x9a\x36"
- "\x58\x91\x63\x2d\x91\x68\xf2\xf2\x19\x96\x20\xe2\x6f\x7e\x6d\x1e"
- "\xbc\x21\x83\x8d\xd9\x79\x86\xc5\xed\xcc\x60\xf1\x98\xaf\xfa\x9d"
- "\xa8\xc3\xcc\xe7\x4d\x4c\xc4\x70\x88\x18\xd7\x84\xf4\x5e\x63\x38"
- "\x80\xaf\x36\xef\xa4\x39\xb3\x28\x3e\x50\x27\x9f\x63\x4b\xb9\x1f"
- "\xb4\x13\x3e\x97\x74\xf7\xc9\xd8\x8e\xa6\x9f\x39\x25\x9f\x7f\x9f"
- "\xea\xb3\x2f\x89\xce\x9b\x0f\x6c\xd1\xdd\x47\xb1\x10\x2b\x6c\xcb"
- "\x99\xae\x45\x7b\x06\xde\x53\x41\x5f\xdd\x9e\xcf\xf2\x95\x28\x27"
- "\x70\x02\xbc\x13\xf9\x58\xee\xd7\x3c\xbc\x4f\x9c\x1f\xf0\x3b\xb6"
- "\xec\xa5\xf6\x2a\x9b\xb6\xec\x7f\xb9\x85\x25\xf0\xe7\xd0\x1f\xcf"
- "\xa2\xad\x2d\x2c\xae\xa4\x05\x6d\x5d\x2a\xdb\xaa\xc5\x52\x57\x0a"
- "\x0e\x87\xe3\xd9\x65\xe3\x1f\x79\x9e\xa3\xf8\x47\x13\x1c\xc0\xb0"
- "\xab\xf8\x0d\x8c\xd5\xb4\x0a\x7f\x17\x1d\x2e\xdf\x27\x8c\xbe\x4b"
- "\xfa\x23\xd7\x39\x31\xa6\xcf\xd3\x58\x56\x4a\xd7\x26\xa7\x34\x60"
- "\x6c\x77\xa4\x91\x2e\x2d\xf9\x60\xa3\x87\xfc\x4b\x08\x9e\xcf\xad"
- "\xbb\x37\x8e\xf8\xb4\x43\x48\xa3\xb1\x1f\x32\xe6\xe3\x68\xcc\xd3"
- "\x73\x31\xee\xf1\x9e\xab\xe1\x0b\x46\xe5\x85\x96\x43\xfd\xaf\x95"
- "\x85\xf9\x78\x82\xca\xa2\xb1\x40\x7a\x1e\x9a\x6b\xb2\xef\x2b\xc8"
- "\xae\xdc\xcc\x63\x67\x27\xc8\x7b\x0f\xf9\x2d\x31\xd1\x18\x10\x63"
- "\x05\xf8\x4d\xfe\x50\x39\xb7\x86\x61\x9c\x51\x3d\x07\xa3\xbf\x13"
- "\xb4\x71\x81\xb4\x98\x9e\x63\x63\xd8\x2a\x13\xc9\x34\x31\xf4\xfb"
- "\x9b\x8e\x8f\xfe\xf5\xdf\xfd\xf5\x7d\xda\xcc\xc5\x25\x51\x5f\x8c"
- "\x22\xdc\xf4\xb7\x85\x60\x66\xab\xc4\x4c\xc2\x24\x0d\x37\x05\x36"
- "\x09\x1f\xfc\x15\x64\x5f\x2b\x6d\xad\xfb\x89\x9b\x35\xad\x41\xdc"
- "\x9c\x6c\x0b\xc1\xcd\x56\xde\x09\xfe\xbd\x17\xdc\x7c\xe0\x44\x77"
- "\xdc\x7c\xe0\x93\xee\xb8\xf9\xb3\xfb\x7a\xe2\xe6\xa5\x98\x39\xe1"
- "\xba\xde\xf0\x12\x72\xcc\xa8\x16\xdd\x83\x9e\xbe\xb1\x72\xc2\xa4"
- "\xfe\x63\xe5\xc4\x27\xbb\x63\xe5\x84\x75\xff\xef\x62\xe5\xc4\xd3"
- "\xdd\xb0\xd2\xf4\x0d\xb1\xb2\x45\x60\x65\x0c\xff\x27\xe6\x84\x8a"
- "\x1f\x3b\x9f\xed\x03\x2b\x9f\xbd\xc2\x5c\x78\xae\x2f\xac\x7c\x70"
- "\x62\x77\xac\x7c\x30\xa7\x3b\x56\x3e\x78\x5b\x10\x2b\xd5\x67\xdf"
- "\x0a\x56\x3e\x38\xe1\xbb\xc1\xca\x07\x27\x08\xac\x3c\x43\x58\xf9"
- "\xb3\xd1\x57\xc6\xca\x09\xc9\xbd\x63\x25\xd2\x05\x56\x4e\x48\x0e"
- "\x62\xe5\x27\x57\xc0\xca\x49\x03\xfa\x81\x95\x31\x02\x2b\x4d\x7d"
- "\x60\xe5\xb3\xa0\x95\x3a\x2e\xc4\xd8\xeb\x31\x36\x54\xac\x34\x07"
- "\xb0\xf2\x1b\x8c\x8f\xfe\xf5\xdf\xa4\xf0\xcb\x61\xa5\xe2\x90\xfc"
- "\x25\x61\x25\x8f\x55\xb1\x32\xdd\xc7\x96\x9f\x00\x46\x1e\x6f\x11"
- "\x67\x53\x84\x2d\x30\xfe\x72\x9f\x24\x2c\x5a\x58\xf7\x06\xe8\xe5"
- "\x72\x97\x0b\x6c\x12\xe7\xb9\x92\x08\xab\xca\x91\xb7\x38\xc0\x77"
- "\x0a\xec\x3c\xa1\x62\xe7\x74\x15\x3b\x67\xfe\x27\xb0\xf3\x29\xea"
- "\xcb\x87\x86\x5f\xd4\x6b\xd8\xb9\x09\xd8\xf9\x90\xe0\x1f\x68\x6f"
- "\x57\x62\x67\xd2\x46\xad\x5e\xa4\xd3\x74\x65\xd1\xd9\x9a\x72\x11"
- "\x7b\xf2\x12\x1c\xfd\xb9\x28\x6f\x81\xf3\xd9\x56\x16\xc0\xd2\xe9"
- "\x41\x2c\x45\x59\xf7\xf5\x8d\xa3\x0f\x39\x02\x38\x5a\x00\x1c\xfd"
- "\x34\x04\x47\x21\x37\xbd\x4e\x98\x07\x1c\xed\x10\x38\xba\x4f\xc5"
- "\xd1\x9f\xff\xe6\x83\xe9\xc0\xd1\x9f\x6b\x38\xfa\xd0\x71\x6f\xc1"
- "\xbb\x3e\x6f\xe1\x95\x71\xb4\x43\xe0\xa8\xed\xff\x3e\x8e\x56\xf6"
- "\xc0\x51\xc8\xae\x14\x4f\xbd\x57\x1c\xd5\xc6\xa3\xc0\xd1\xfc\x20"
- "\x8e\x0a\xba\x3e\x7c\x4f\x6d\x2a\xe8\x9e\x6a\x13\xb2\x5b\x00\x47"
- "\x6d\xe5\x12\x47\x91\x26\xf4\x27\x8b\x81\xa3\x18\x7f\xf6\x1a\xf2"
- "\x9b\xc5\x12\x51\x47\x13\xe1\xeb\xcb\x98\x33\x44\xa3\x00\x9e\x3e"
- "\x8b\x39\x43\x18\xd3\x86\x39\x03\x1c\x9d\x79\xde\xc4\xc4\x7c\x29"
- "\xc4\x7c\x69\xe9\x23\x7e\x98\x66\xc3\xdb\x27\x9e\x3e\xbc\xa5\x3b"
- "\x9e\x3e\x5c\xd5\x1d\x4f\x1f\x5e\x19\xc4\x53\xf5\x19\xe1\x29\xfa"
- "\x4c\xd9\xe8\x34\x10\xa6\xfe\x6b\x78\xfa\xf0\xe6\x00\x9e\xea\x55"
- "\x3c\x7d\xf6\xca\x78\x2a\xf6\x06\xfb\xc0\xd3\x50\x6c\xe8\x1b\x4f"
- "\x1f\xde\x1c\xc4\xd3\xa4\xe7\x03\x78\x5a\xdf\x17\x9e\x3e\x54\xdc"
- "\x3b\x9e\x22\x5d\xe0\xe9\x43\xc5\x01\x3c\xad\xef\x05\x4f\x7f\x1e"
- "\x8a\xa7\x8f\xcc\x92\x78\x5a\x2e\xfd\x6b\x00\x53\x6b\xdb\x31\x3e"
- "\x68\xce\x65\x15\x0b\x4c\x55\x80\xa9\x14\x53\x95\x62\xca\x90\x0d"
- "\x7e\x6f\x98\x2a\x31\xd7\xcd\x08\x57\x69\x6e\xda\x1f\x81\xbc\x8b"
- "\xb5\x08\x34\x11\x6b\xaf\x46\xbf\x97\x43\xf0\x35\x65\x99\x89\x78"
- "\xbb\x6e\x63\x45\xd1\xc6\x4a\x5b\x3c\xd9\x16\x77\x1b\x2b\xfd\xeb"
- "\xcb\x47\x52\xfb\xc2\xd6\xbe\x64\xf7\x0f\x48\x76\x7f\x9c\xe9\x57"
- "\x3c\x0e\x7c\xb5\x92\xec\x5e\xd6\x43\x76\x2f\xbb\x54\x76\xff\xe8"
- "\xf2\x38\xda\x2f\xd9\xfd\x09\xea\xc3\xc9\x33\xba\xe3\xe8\xe4\x59"
- "\xdd\x71\xf4\xd1\x4f\xa8\x5e\x12\xc7\xcb\x7a\x97\xdd\xc5\x3c\x9f"
- "\xbc\x27\x20\xbb\xd7\x77\xc7\xcf\xa0\xec\xfe\xe8\xfa\xbe\x71\x74"
- "\x72\x7d\x37\x7e\x74\xa6\x8a\xa3\xb3\x55\x1c\x9d\x1d\xc4\xd1\xa3"
- "\xc7\x34\x7e\x74\xca\xf9\xf7\xeb\x43\x71\x74\xca\xc8\x00\x8e\x36"
- "\x5c\x8a\xa3\x1a\x86\x12\x9e\x52\x39\xa4\xcb\xda\x0d\x9c\x7e\x73"
- "\xb6\x4d\x2f\x75\xb5\xa9\x44\x3b\x43\x4f\x5d\x6d\x4d\xeb\x79\x96"
- "\x37\x9d\xf0\xb4\x58\xe0\xa9\x51\xc7\x66\x01\xfb\x86\xd1\x39\x84"
- "\x12\xda\xd7\xcf\x96\x31\x99\x48\xbf\xa4\x2c\x95\xf1\x0d\x35\x3d"
- "\x13\xda\x2b\xf6\xf3\x67\x7c\xa2\x62\x2a\xc5\x2d\xc7\x98\xdb\x7e"
- "\x01\x98\x9a\xdd\x0b\x6f\xba\x02\x98\xba\x3c\x84\x37\xc5\xdc\xdf"
- "\x37\xbb\x27\xa6\x26\xff\xaa\x96\xc6\x0a\x61\x6a\x37\x39\xbe\xec"
- "\xbf\x81\x1c\x9f\x7c\xb2\x3b\x96\x3e\x1a\xd3\x1d\x4b\x93\xdf\x0f"
- "\x62\xa9\xfa\xec\x5b\xe1\x4d\x93\xdd\xdf\x0d\x6f\x9a\xec\x0e\xca"
- "\xf1\x8f\x1e\x08\x60\xe9\xf1\xbe\xb0\x74\xb2\xbb\x77\x2c\x45\xba"
- "\xc0\xd2\xc9\xee\x00\x96\x1e\xef\x45\x8e\xef\x86\xa5\x8f\xfd\x46"
- "\x62\x69\x99\xe4\x4d\xeb\x35\xde\xb4\xec\xff\x87\x72\xfc\x63\xa5"
- "\xfd\x95\xe3\x3f\x68\x95\xf8\x49\xf8\xa4\x61\x68\x50\x8e\x2f\xeb"
- "\x5b\x8e\xbf\x02\x86\xf6\x8b\x17\x15\x18\xfa\x8b\xdf\x74\xc7\xd0"
- "\x5f\xbc\xd2\x1d\x43\xa7\x0d\xef\x89\xa1\x97\xe2\xe7\x2f\xbe\xe8"
- "\x0d\x3b\xa5\x1c\xff\x44\x65\xdf\xb8\x39\xd5\xd4\x7f\xdc\x7c\xfc"
- "\xb6\xee\xb8\x39\x75\xea\xff\x0c\xdc\x7c\xfc\x9d\x6e\xb8\x69\xfa"
- "\x86\xb8\xf9\x5f\x22\xd3\x3f\xd1\x43\xff\xf9\x44\x0f\xfd\xe7\x13"
- "\x21\xfa\xcf\x27\xbe\x45\xfd\xe7\x13\xdf\x91\xfe\xf3\x09\x73\x90"
- "\x07\x7d\xe2\xfc\x95\x71\x73\xaa\xb9\x77\xdc\x44\xba\xc0\xcd\xa9"
- "\xe6\x20\x6e\x5e\x89\x07\x9d\x76\xa2\x1f\xb8\xf9\xdf\x5c\xa6\x9f"
- "\x76\x59\xfd\x67\x6f\x32\x3d\xe1\xa6\xc0\xcb\xfa\x1e\x32\xfd\xe3"
- "\xa1\x32\x7d\x59\x50\xa6\x9f\x24\x71\xcb\xe5\x73\x74\x97\xe9\xbf"
- "\x75\x1c\xb5\x7e\xe5\x0d\xe8\x43\xd7\x02\x47\xad\xa7\xa9\x6d\xde"
- "\x80\x3e\x74\xfa\xf3\x5a\xbd\xa4\x4c\xbf\x89\xc9\x7a\xf5\x22\xd3"
- "\x0b\xfb\xe1\x27\xef\x09\xc8\xf4\xf5\x3d\x65\xfa\xe9\xa3\xfb\xc6"
- "\xd4\x27\xe7\xf6\x2a\xd3\x93\xfc\x2d\x30\xd5\x26\x30\xf5\xc2\xd6"
- "\x50\x4c\x7d\x6a\x95\xc0\xd4\x07\x35\x4c\x7d\xb2\xcc\x8b\xb9\xe9"
- "\x8d\xb8\x32\xa6\x52\x39\x41\x4c\x4d\xfb\xaf\xc1\x54\xe7\x37\xc7"
- "\xd4\xd0\x33\xb0\xfb\xd0\xf6\x00\xa6\x0a\x1a\x3f\x7d\x5d\x6d\x2a"
- "\x61\x6a\x5a\x0f\xf9\xbe\xac\x77\xf9\xfe\x7d\xa6\x27\xfa\x68\xf2"
- "\x3d\xf5\x81\xc0\x9b\xff\xab\xf2\xfd\xd3\x4b\xba\x63\xeb\xd3\x65"
- "\xdd\xb1\xf5\xe9\x19\x41\x6c\x55\x9f\x7d\x2b\xf2\xfd\xd3\x59\xdf"
- "\x8d\x7c\xff\x74\x56\x10\x5b\xa7\x3f\x7a\x65\x6c\x7d\x32\xbd\x77"
- "\x6c\x45\xba\xc0\xd6\x27\xd3\x2f\x8b\xad\x0f\x86\x62\xeb\x8c\xfb"
- "\x34\x6c\x0d\xca\xf7\x18\x1f\x34\xff\xb2\x1c\xff\xba\x7c\xff\xd0"
- "\x77\x2d\xdf\xcf\x48\xec\x97\x7c\xbf\x15\x38\x0b\x59\x7c\xc5\x87"
- "\x90\xef\x1f\x55\xe5\xfb\x86\xd2\x1e\xf2\x7d\xe9\x25\xf2\x7d\xee"
- "\xa3\x2a\xa6\x62\x4e\x09\x4c\x9d\x5d\xf6\xaf\xcb\xf7\x8f\x51\x1f"
- "\xce\xbc\xa7\x3b\xa6\xce\xbc\xaf\x3b\xa6\xce\xfa\x90\xea\x25\x31"
- "\xbd\xb4\x77\xf9\x5e\xcc\xf3\x99\xeb\xbb\xc9\xf7\xa8\xdf\xa5\xf2"
- "\xfd\xac\x55\xdd\x30\x75\x66\x28\xa6\xce\xac\xe8\xc6\xa7\xa2\x5d"
- "\x84\xa9\xaf\x7d\x2a\x31\xf5\x77\x9f\x86\x60\xea\xe4\xdf\xa9\x98"
- "\x9a\xf2\xd5\xfb\x53\x43\x31\x75\xa6\x4f\xc3\x54\x81\x97\x33\xbd"
- "\x7a\xbb\xf5\x52\xbb\x13\x61\xef\x43\xb6\x40\x28\x9b\xce\x8b\x51"
- "\x99\x7b\x3e\x4d\xbb\xb2\xbd\x89\xb5\x77\x7b\x13\x57\x96\x9b\x55"
- "\x37\x39\x84\x9d\x49\x09\xd9\x99\xac\x62\xa3\x4b\x3a\xa5\xef\x01"
- "\xe1\x23\xb1\x0f\xbf\x03\x33\x9e\x0c\xe2\x2c\xd9\x64\x6d\x27\x9b"
- "\xac\x0b\xd2\x06\x08\xfd\x7d\xa9\xaf\x01\x8d\x6f\x02\x1e\xbc\xf5"
- "\x69\x4f\x9c\x4d\x5d\x59\x4b\xe3\x67\x7a\x5a\x0f\x99\xbf\xf4\xbf"
- "\x81\xcc\x9f\xfa\x51\x77\x7c\x9d\x65\xe8\x8e\xaf\xa9\x07\x82\xf8"
- "\xaa\x3e\xfb\x56\x78\xd7\xd4\xe3\xdf\x0d\xef\x9a\x7a\x3c\x28\xf3"
- "\xcf\xfa\x7d\x00\x5f\xeb\x42\xf0\xf5\xd3\x50\x7c\x9d\xe9\x14\xf8"
- "\xfa\x69\x4f\x7c\x9d\xe9\x94\xf8\x3a\xd3\x19\xc0\xd7\xba\x1e\x32"
- "\xff\xa7\x3d\xf1\x75\xf6\x16\x81\xaf\x0d\xa5\x3d\x78\xd7\xd2\x2b"
- "\xcb\xfc\x0d\xff\xdd\x64\xfe\xd9\x7d\xfa\xff\xed\x55\xe6\x27\x4c"
- "\x4d\x97\x98\x4a\x98\xa5\xe1\x6a\x50\xe6\x2f\xed\x53\xe6\xbf\x12"
- "\xae\xf6\x8b\x57\x15\xb8\x3a\x67\x4b\x77\x5c\x9d\xf3\x52\x77\x5c"
- "\x7d\xe6\xba\x9e\xb8\x7a\x29\xa6\xce\x39\xd1\x1b\x9e\x4a\x99\x7f"
- "\x7e\x75\xdf\x58\x3a\x37\xbc\xff\x58\x3a\xef\xee\xee\x58\x3a\x77"
- "\xd2\xff\x5c\x2c\x9d\xf7\x7e\x37\x2c\x35\x7d\x43\x2c\xfd\x2f\xd1"
- "\x03\xcc\x1f\xdd\x1d\x4b\xe7\x4f\xed\x8e\xa5\xf3\x07\x05\xb1\x54"
- "\x7d\xf6\xad\x60\xe9\x7c\xcb\x77\x83\xa5\xf3\x2d\x41\x5e\x75\xbe"
- "\xff\xca\x58\x3a\x37\xb2\x77\x2c\x45\xba\xc0\xd2\xb9\x91\x41\x2c"
- "\xfd\xe4\x0a\x58\xfa\xcc\xc9\x7e\x60\x69\x77\x3d\x40\x4f\x2c\xfd"
- "\xce\xf5\x00\xcf\xb8\xfb\xa5\x07\xd0\xb0\xf4\xd1\x4b\xf5\x00\x84"
- "\xaf\x42\x0f\x00\x7a\x69\x18\x26\xf4\x00\x13\x24\x96\xb9\x7c\x6b"
- "\xba\xe9\x01\xbe\x7d\x6c\x4d\x3b\xeb\x0d\xe8\x53\x0b\x80\xad\x69"
- "\xc2\x17\xa8\x37\xa0\x4f\x4d\x5f\xaf\xd5\x4b\xea\x01\xd6\x32\x59"
- "\xaf\x5e\xf4\x00\xf7\x53\x79\x0b\x26\x76\xd3\x03\x84\x60\x2d\xca"
- "\xba\xa7\x6f\x9c\x5d\x90\xde\x4d\x0f\xd0\x18\xc4\xd9\x0b\x64\xa3"
- "\x0e\x1c\x14\x38\x1b\x1b\x8a\xb3\xcf\xee\x10\x38\x7b\xbf\x86\xb3"
- "\x0b\xca\x3b\x30\x37\x3b\xfa\x8b\xb3\x74\x8e\xe0\xd3\xd4\xef\x06"
- "\x67\x2b\xfa\x81\xb3\x21\xba\x81\xb7\x40\x8f\x00\xce\x0a\xba\x3f"
- "\xf7\xe3\xda\xe9\x84\xb3\xa9\x3d\x74\x03\xa5\xbd\xeb\x06\x8e\x7c"
- "\x17\xba\x81\xe7\x36\x76\xc7\xdb\xe7\x2a\xbb\xe3\xed\x73\xcb\x82"
- "\x78\xab\x3e\xfb\x56\x74\x03\xcf\x39\xbe\x1b\xdd\xc0\x73\x8e\x20"
- "\xde\xa6\x2f\xbc\x32\xde\x2e\xc8\xea\x1d\x6f\x91\x2e\xf0\x76\x41"
- "\xd6\x65\xf1\xf6\xfe\x50\xbc\x5d\x38\x43\xc3\xdb\xa0\x6e\xa0\x54"
- "\xd5\x0d\xac\xb9\xb2\x6e\xa0\xa1\x0f\xdd\xc0\xc4\xef\x5a\x37\xb0"
- "\x70\x7a\x7f\x74\x03\x17\xb7\x4a\xbb\xfd\x15\x64\xb7\x3f\x03\xf8"
- "\x9b\x7c\x0c\x34\xb8\xb2\xdd\x7e\xae\x66\x7f\x9a\x5a\xac\xe2\x6c"
- "\x71\xaf\xba\x81\x0f\x9a\xfb\xd6\x0d\x7c\x70\x3c\xd4\xfe\x34\xe3"
- "\xc9\xee\xfb\x56\x19\x33\xb4\x7d\xab\x0f\xfe\x46\x38\x9b\x29\xe2"
- "\xa0\x29\x9b\x97\x30\xe9\xab\x3b\x73\x2e\xd5\xb3\x37\x3b\xfe\x7d"
- "\x4a\xe8\x5e\x56\xc6\x5b\x01\x5d\x41\x1d\xe1\x6d\x31\x53\x78\x5a"
- "\x04\xf9\x0a\x17\xba\x82\x27\x68\xec\x65\x0e\x0f\xc5\xdd\x83\x1f"
- "\x87\xe2\x6e\x46\x93\x86\xbb\x7e\xe0\xee\x81\xc6\x62\xa9\x7f\x7d"
- "\x4a\xda\xa6\xee\x7e\x2a\xc4\x36\xf5\xd8\xbb\x2a\xee\x2e\x3a\xf9"
- "\xbe\x1b\xed\xbf\x9c\xfd\x14\xde\x7f\xe3\xe3\x6f\x6a\x83\x5a\xdc"
- "\xab\xed\x94\x8a\x4f\xbd\xda\x4f\xa1\xae\xa6\x1d\xea\x5c\xf5\x63"
- "\x9e\xee\x08\xb1\x9f\x2a\x59\x8e\xf9\xac\x9e\x2b\xb9\xac\x1d\xea"
- "\x53\x41\x3b\x54\xbe\x39\x6b\x3c\xad\x6f\xca\x96\x25\xac\x93\xa7"
- "\x85\xf1\x98\xac\xf1\xf4\xfd\xae\x2e\xac\x3b\x0f\x58\xc3\x54\xb9"
- "\xce\x02\xec\x19\x26\xe9\x6e\x1b\xe9\xc7\x5a\xe3\xc7\x5a\xa3\x6c"
- "\xce\xb2\xf8\x88\x37\xd9\x9a\x15\x57\x02\x39\xcf\x57\x20\x62\x17"
- "\x0e\x2e\x82\xac\xf7\x32\xc9\x79\x67\x30\x37\xec\xf1\x7a\xaa\x8f"
- "\x86\xa3\xc6\x66\xb4\xe3\xcc\xe5\x79\x39\xdf\xd7\x41\x1c\x75\xfe"
- "\xfc\x03\x7c\xf3\xf9\xa8\x5a\x1a\xbb\xd6\xe0\x99\x02\xc1\x33\xf7"
- "\x61\x2b\x4b\x75\x91\x3e\x1b\x31\x16\xbe\x05\x9d\x44\x68\x7d\xba"
- "\xe3\xfa\xf3\x0b\xba\xe3\xfa\xf3\x25\xdd\x71\xfd\xf9\x47\x83\xb8"
- "\xae\x3e\x03\xae\xfb\x0b\x24\x1f\xed\xdf\xf8\xaf\xf2\xd1\xcf\xa7"
- "\x69\xb8\xae\xa8\xb8\xbe\xf3\x1b\xe0\xfa\x65\xf9\xe8\x10\x5c\xea"
- "\x1b\xd7\x9f\x4f\x0b\xea\x24\x32\x27\xf6\x6a\x23\xfb\x71\x28\xae"
- "\x67\xb4\x0a\x5c\xff\xb8\x27\xae\x23\x5d\xe0\x7a\x46\x6b\x9f\xe7"
- "\x09\x3e\xee\xb9\x9f\xb6\xf8\x56\x81\xeb\xf5\xaa\x8d\x6c\x5d\x3f"
- "\xce\x13\xd4\x4b\x4c\xd7\xb0\x9c\xf4\x55\xdf\xad\x4e\x62\x71\x7c"
- "\x7f\x74\x12\x02\xcb\x5b\x25\x96\x13\x36\x6a\x78\xfe\x4d\xce\x13"
- "\x5c\x09\xcf\x35\xbe\x99\xf0\xbc\x2f\xbe\xb9\x3b\x9e\x67\xdd\xda"
- "\x1d\xcf\xb3\x6e\xeb\x8e\xe7\x39\xb7\x76\xc7\xf3\x9c\xf8\x9e\x78"
- "\x7e\x29\x96\x67\xad\xec\x0d\xc7\x6d\x4f\x90\x8e\x62\x69\x7d\xdf"
- "\x18\x9e\x55\xd6\x7f\x0c\x5f\xf2\xca\xff\x38\x0c\x37\xf5\xc4\xf0"
- "\x25\x6e\xc2\x20\x7f\x61\x0f\x0c\x7f\x56\xc5\x70\x15\x47\x5e\x6e"
- "\x51\x79\xe1\x9e\x18\xde\x8a\x76\x5c\x41\x1e\xf7\xfd\xb3\x27\x86"
- "\xff\x1f\xf6\xbe\x3f\x2e\x8a\x3a\xff\xff\xcd\x80\x85\x85\x8a\xb6"
- "\x78\x64\x56\x9b\xe1\xb5\x96\x96\xdd\x47\x2f\x2d\xbd\xc3\xc2\xc2"
- "\x0e\x95\x3c\xed\x50\x01\xd1\xa0\xd0\xf3\x07\x22\x22\x2a\x02\xfe"
- "\x3c\x21\x40\x48\x30\x34\x50\x2c\xe9\xb4\xc4\xa8\xf4\x4e\xaf\xb4"
- "\xb5\xf4\x0e\x8c\x5f\x76\x58\x58\x58\xab\x87\x86\x86\xb5\x22\xea"
- "\x02\xbb\x3b\xdf\xd7\x7b\xde\xb3\xcc\xcc\xee\xcc\xee\xce\x2c\x20"
- "\xf6\xf5\x0f\x1e\xc0\xec\xcc\x7b\xdf\xf3\x7e\x3d\xdf\xcf\xf7\xf3"
- "\xf9\x9a\xf7\xfb\x3d\xf1\xa7\x04\x1c\xee\xed\x80\xc3\xe7\x91\x3c"
- "\x88\x60\x5e\xae\x44\x2e\x04\xee\xa3\xbe\x40\x42\x9b\x5b\xda\x8c"
- "\x5f\x1f\x21\x87\x2f\x1b\x26\xe4\xf0\x65\x11\x42\x0e\x5f\xe6\xc3"
- "\x71\x38\xfb\x59\x87\x68\xf3\x65\x43\x3b\x5c\x9b\x5b\xf0\x61\x97"
- "\xc3\x97\x0d\xe5\xb4\x79\x42\x4f\xc7\x1c\x1e\x57\x22\xce\xe1\x70"
- "\x9c\xe1\xf0\xb8\x12\xc9\x75\x0e\x36\x1c\x9e\x70\x51\x06\x87\x0b"
- "\x73\x21\x16\x0e\x67\x73\x21\x3b\x78\xb9\x10\xd3\x1a\x92\x0b\x29"
- "\xb8\x44\xb0\xd1\xdb\x8d\xe0\x14\xf0\xe3\xbb\x9d\xb2\xef\xdd\x0a"
- "\x14\xe5\x41\x12\x1a\xe4\xe4\x41\x18\xfe\xc6\x6b\x1c\xa6\x03\x6f"
- "\x57\x3b\xb9\xc6\x21\xd0\xb2\xc6\x21\x4b\x62\x8d\x03\xcb\xe7\xe1"
- "\x2e\xf0\x39\xb3\xc6\x61\x79\x8b\x30\xc7\xbc\xdc\x64\xc9\x31\x13"
- "\x3e\x4f\xea\x25\xe4\xf3\x24\xaf\xf6\x35\x0f\xc0\xf9\x55\x31\x6f"
- "\xd8\xac\x79\x68\xe7\x76\x26\x0f\xba\x22\x4c\xfb\x72\x3d\x6a\xe7"
- "\xf7\x50\x8e\xdf\x2f\xb8\xad\x3a\x2c\xe0\xf6\x73\x7c\x6e\x5f\xb1"
- "\x4e\xc0\xed\xdf\xe7\x09\xe7\x47\x9c\x8b\xe1\x71\xbb\x65\xcd\xc3"
- "\xca\xd5\x65\x75\x0e\xb8\x1d\xae\x77\x7e\x8d\x58\xc7\x72\xbb\x65"
- "\x7d\x83\x28\xb7\xf3\xd7\x37\xf0\xe6\x3f\x60\x6e\x67\xde\xb1\xe1"
- "\x63\xc5\xed\x2b\xa3\x29\xd3\x17\xd0\x1f\x80\xd7\x71\x1f\x31\xd1"
- "\xc0\xed\x4c\x7b\xaf\xfc\x94\xcf\xed\x6d\x6b\x08\xb7\xbf\x75\xc9"
- "\x75\x6e\x6f\xd7\xc3\x7c\x6e\x7f\x1e\x73\x7b\xe2\x21\xb2\xfe\x22"
- "\xc5\xb9\xf5\x17\x56\xf3\x33\xde\x72\x22\xff\x62\x97\xe3\x45\xea"
- "\x25\xe4\xf8\x55\x7d\x85\x1c\xbf\x2a\x40\xc8\xf1\x89\x2d\x1c\xc7"
- "\xb3\x9f\x75\x88\x4e\x5f\xe5\x7d\x73\xf2\x2f\xab\xbc\x39\x8e\x5f"
- "\x75\xd9\xf1\xda\x8b\x15\xe9\xe2\x73\x33\xe0\x38\xc3\xf1\x2b\xd2"
- "\xed\xae\xbd\x10\xe4\xbb\x93\xce\x88\xae\xbd\xa8\xee\xba\xb9\x19"
- "\x7c\xac\x58\xe7\x5f\x94\xe7\xbe\x93\xea\xe4\xe6\x5f\xf0\xda\x8b"
- "\x95\xa7\x78\x6b\x2f\xea\x1c\xaf\xbd\x48\x9c\xe6\x64\xfe\xc5\xce"
- "\xdc\x8c\x13\xc1\xfc\xf9\x6e\xc9\xa7\x85\xfc\x9e\x7c\xa6\x9d\xdf"
- "\xa7\x60\x7e\x5f\x7b\x45\xc8\xef\x6b\xf5\xb8\x9e\x62\x6b\x31\xfe"
- "\x25\x78\xae\x98\x32\x5a\x38\x57\xc3\x2a\xff\x32\x05\x63\x6f\xed"
- "\x4e\x01\xbf\x7f\xcf\xe7\xf7\x94\x48\x31\xed\x8e\xf3\xde\xcc\x9c"
- "\xe2\x70\xde\x9a\xb6\x49\x96\xf9\x6f\xab\x17\x94\x85\xc0\xfd\xeb"
- "\x24\xe6\xba\x85\x93\xb9\x6e\xcc\xdc\x36\x9c\x07\x87\xb2\x3e\x08"
- "\x8f\xa1\x92\x22\x68\x33\x9e\xeb\x66\x3d\xcf\x0d\xcf\x7d\xc3\x73"
- "\xdd\x2a\xa2\xb3\x24\xe7\xb9\x61\x6c\x4a\xcd\x75\x83\x7a\xab\x18"
- "\xae\x3f\xcb\x72\x3d\x3b\xd7\x2d\x3f\x9e\x9b\xeb\x26\xe0\x7a\x91"
- "\xf9\xc3\x87\xbe\x4f\x11\xd7\xf1\xc9\x1c\xd7\xb7\x62\x1d\xff\x8c"
- "\x55\x2e\x86\x89\xc1\xea\xdd\x5d\x9a\x8b\x61\xb8\x7e\x4d\x41\x25"
- "\xc6\x71\x68\x8c\x48\x2e\xc6\x76\x8e\x73\xd7\xe5\x62\xd6\x5c\x13"
- "\x72\xfc\x5a\x8d\x90\xe3\xd7\x9c\xe1\x38\x9e\xfd\xac\x43\x38\x7e"
- "\x4d\xf3\xcd\xc9\xc5\xac\x69\xe6\x72\x31\x6b\x4f\x8a\xce\xbf\x13"
- "\xe4\xd8\x53\xe6\x8b\xe7\xd8\x53\xd8\xf9\x77\x29\xf3\x25\xd7\x84"
- "\xd8\x3c\xd3\x5c\x77\x80\xe4\xd8\x15\xac\x09\xa9\xeb\x6e\xb9\x98"
- "\x75\xfb\xe5\xe6\x62\x98\xb9\xcd\xa7\xf0\xfc\x10\x79\x6b\x42\x1c"
- "\x71\x7b\xbb\x76\xb7\xf3\x0c\x53\xc8\xed\xeb\x0f\x08\xb9\x7d\xfd"
- "\x21\x21\xb7\xa7\x1e\x15\x72\x7b\xaa\xd6\x9a\xdb\x6d\x79\x7d\x43"
- "\x4f\x31\x4e\x8f\x99\x82\x73\x31\xa9\x31\xd2\x7c\xbe\x61\x84\x7c"
- "\x3e\xff\xdb\xd8\xff\xaf\xf9\xdc\xdb\x9a\xcf\xff\x96\xd0\xa5\x79"
- "\x19\x86\xcf\x37\x2e\x10\xf0\xb9\xb7\x03\x3e\xef\xb2\xbc\xcc\xc6"
- "\xe3\x42\x3e\xdf\x68\x10\xf2\xf9\xc6\x62\x8e\xcf\xd9\xcf\x3a\x24"
- "\x2f\xb3\xf1\xd8\xcd\xc9\xcb\x6c\x3c\xc6\x69\xf6\xd4\x9d\x8e\xf9"
- "\x7c\xc3\x18\x71\x3e\x87\xe3\x0c\x9f\x6f\x18\x23\x39\x9f\xda\x86"
- "\xcf\xd3\x56\xcb\xe0\x73\xd1\x39\x2a\xdd\x23\x2f\x93\x96\x22\x37"
- "\x2f\x23\xb5\x4e\x05\xf3\x3b\x37\x3f\x85\xb7\x4e\xc5\xdf\xb2\x4e"
- "\x25\x45\x38\x3f\xa5\xc3\xb9\xfd\xf5\x6c\x21\xb7\xbf\x9e\x2b\xe4"
- "\xf6\x4d\x1f\x0a\xb9\x7d\x53\x89\xa5\x9e\x24\x2f\xb3\xc6\x66\xdd"
- "\x8a\x90\xe7\x5f\xbf\xa6\x9d\x52\x8f\xc4\xb8\x1e\xca\x9a\x2d\xcd"
- "\xf3\xe9\x03\xa5\x78\x1e\xcf\x57\x79\x3f\x3c\x5a\x84\xe7\x33\x06"
- "\xff\x1a\x78\x5e\x6a\x1e\x0a\xe3\x83\x80\xe3\x31\xdf\x33\xfc\xce"
- "\x72\x3d\xe6\x79\xd3\x27\x62\x39\x9a\x8c\x88\xce\xe2\x79\xe9\x1c"
- "\x4d\x66\x58\x65\x28\xcb\xf3\xce\xac\xa1\x39\x2a\xcc\xd1\xe4\xcf"
- "\xeb\xec\x1c\x4d\xe6\x01\x21\xdf\x67\x36\x08\xf9\x3e\xb3\x80\xe3"
- "\x7b\xf6\xb3\x0e\xd1\xef\x99\xfb\x6f\x4e\x8e\x26\x73\x3f\xc7\xf7"
- "\x9b\xb2\x1d\xf3\x7d\xba\x9f\x38\xdf\xa7\xb3\x7b\xb3\xa5\xfb\x39"
- "\xcf\xf7\x59\xed\x7c\x6f\xbb\x7e\x26\x45\xf9\x1c\x99\x71\x37\x3b"
- "\x47\x93\x25\xc9\xff\xf6\xf6\xc7\x50\x9e\xa3\x61\xd7\x24\xce\x11"
- "\xdf\x1f\xa3\xcc\xce\x1c\x99\xb2\x72\x3e\xd7\x67\xaf\x12\xce\x45"
- "\xcc\x5e\x6d\x99\x8b\x58\x56\x89\xb9\x3e\x77\x8f\x90\xeb\x73\x77"
- "\x4b\xe5\x68\x0e\x99\xf9\x73\x12\xb3\xcf\x08\x73\x34\x85\xc2\x1c"
- "\xcd\x24\x8c\xbd\xdc\xe9\xd2\x5c\xff\x86\xa7\x70\x0e\x38\x59\xa3"
- "\xb8\x27\x9c\x9d\x03\x1e\xce\x9b\x03\xfe\xe2\xdb\x2c\xd7\x6f\x1e"
- "\x5c\x5a\x6d\x44\x72\xe6\x21\xba\x3e\xd7\x7b\xa3\xe8\x1c\x44\x66"
- "\x0c\xb0\x33\x0f\x71\xd6\x69\x6f\x64\xa6\xc0\x87\xc7\xf3\xe6\x21"
- "\xda\xd9\xcf\x58\xc0\xff\xe1\x31\x92\xfc\xdf\x42\x73\xfc\x6f\x7e"
- "\x8a\xcb\xdb\x98\xb1\xce\x67\xe2\xb2\x39\xa2\xb3\xf2\x36\x62\x79"
- "\x12\xed\xb3\x98\xff\x73\xa6\x11\x9d\x1f\xdd\xcd\xf2\x36\x39\xc5"
- "\x42\xde\xcf\xd1\x09\x79\x3f\x27\x97\xe3\x7d\xf6\xb3\x0e\x99\x8b"
- "\x9e\xb3\xf7\xe6\xe8\xfc\x9c\xbd\x5c\xde\x26\x37\xd5\x31\xef\xbf"
- "\xe1\x2d\xce\xfb\x6f\x78\x13\xde\x7f\xc3\xdb\x6e\xde\x46\x30\x37"
- "\x72\xcb\x02\x97\xf3\x36\x16\x9d\x7f\xd3\xd7\xf5\x6c\x99\x2f\x27"
- "\x6f\xd3\xbe\x26\xdd\xa5\xbc\x8d\x38\xdf\x5b\xb4\x7d\x99\x9d\x67"
- "\xae\x42\xbe\x7f\x73\x81\x90\xef\xdf\x5c\x2c\xe4\xfb\xb7\x32\x84"
- "\x7c\xff\x56\xba\x58\xde\x46\xc8\xf5\x6f\x1e\x15\xe3\xf9\x98\x49"
- "\x38\x6f\xf3\xd6\x18\x69\x8e\x7f\xb3\x51\x3e\xc7\x6f\xed\x79\x9b"
- "\xe3\xad\x38\xde\xdb\x9a\xe3\xb7\x06\x74\xa9\xc6\x67\x38\x7e\xdb"
- "\x68\x01\xc7\x77\x60\x2e\xc7\x99\xf5\x24\xd2\xda\x7e\x9b\xd5\xfc"
- "\xf7\x6d\x56\xf3\xdf\xb7\xf1\xe6\xbf\x6f\x3b\xd6\x71\x1c\xbf\xad"
- "\xe3\xe7\xbf\x3b\xc5\xf1\xdb\x78\xf3\xdf\xdf\x5a\xe0\x98\xe3\xdf"
- "\x6c\x16\xe7\x78\x38\xce\x70\xfc\x9b\xcd\x76\xb5\xbd\x80\xe3\xf3"
- "\x5f\xea\x8c\x5c\xce\xcd\x59\x6f\x94\x1f\x2c\x27\x9f\x63\x6f\xdf"
- "\x11\xc9\x7c\xce\x28\x4b\x3e\x27\x46\x22\x9f\xd3\x51\x9c\x5f\x30"
- "\x5b\xc8\xf9\x05\x51\x42\xce\xdf\x99\x2b\xe4\xfc\x9d\x39\xc2\x7c"
- "\x4e\xac\x4d\x3e\x47\xc8\xff\x05\xc7\xb5\x93\xf8\xf9\x9c\x42\x5e"
- "\x3e\x67\xe7\x78\x69\xfe\x2f\x90\xe4\xff\xeb\x0c\xff\x47\x88\xf0"
- "\xff\x8e\xff\x4f\xf8\x3f\xc2\x05\xfe\xdf\x71\x13\xf8\xbf\x70\x1c"
- "\xc9\xf1\x38\xb9\x4f\xca\x21\xf9\x39\x1e\xd7\xc6\x81\xc2\xad\xc2"
- "\x71\xa0\xb0\x5c\x38\x0e\x14\xae\xe6\xc6\x01\xf6\xb3\x0e\x19\x07"
- "\x0a\xf3\x6e\xce\x38\x50\x98\xc7\x8d\x03\x3b\x97\x3a\x1e\x07\x0a"
- "\x24\xc6\x81\x02\x76\x1c\x28\x90\x31\x0e\xbc\x1d\x25\x9d\xe3\x89"
- "\x51\x9e\xe3\x19\x7d\xb3\xd7\x41\xbd\x1d\x29\x2b\xc7\xb3\x65\xa9"
- "\xbe\x1c\xef\x91\x72\x16\x51\x2b\x67\x5b\x72\x3c\x5a\xab\x1c\x8f"
- "\xd6\x26\xc7\xb3\xfc\x2c\xcb\xff\x41\xec\x7a\xd3\x49\x2e\xec\x91"
- "\xc2\xbc\x4f\xfa\x9d\xd9\xc2\x79\xf3\xef\x30\xfc\xcf\xed\xdf\xf7"
- "\xee\x15\x5c\x2f\x32\xfe\x68\xed\xec\x81\xfa\xce\x87\x82\x9c\x4e"
- "\x90\xd8\x1e\x29\xef\x0a\xe6\xdd\x08\xd7\x9b\xbe\x53\x27\xe0\xfb"
- "\x49\x64\xbd\xe9\x7b\x62\xcf\x69\xdb\xf7\xe4\xdf\x75\x99\xd9\x93"
- "\xbf\x7d\x2f\xbf\x5d\x6a\xa7\xf6\x92\x0e\x67\xf7\x92\xfe\xfe\x26"
- "\xec\x25\xed\xec\x9e\xfc\xdf\x5b\xef\xdf\x57\x94\x5a\x55\xae\x45"
- "\x95\x18\x23\xa1\xd6\x7b\x9f\x6a\xc5\xd7\xee\x53\xec\xda\xfd\x85"
- "\x9d\xb3\x0f\x0a\xae\x0f\x33\xe6\xf7\xd3\xa2\xe2\x24\x3d\x53\x1f"
- "\xfc\xee\x6e\x88\x73\xaf\x72\xc0\xaa\x19\xf3\x69\x2c\xe6\xd3\x77"
- "\xfd\x99\x73\xcf\x02\x16\xfa\x05\x1d\xc4\x38\xce\x34\x23\xaf\x98"
- "\x78\xcc\xad\x45\xcc\xbc\x2f\x90\x11\xc0\xad\xe4\xbc\x55\x67\x69"
- "\x93\xa9\xdf\xd4\x83\x50\xff\x3b\xf7\x2d\xac\xee\x51\xa9\x6b\x86"
- "\x7e\x71\x89\x79\x97\x6b\x95\xf1\x86\x16\xc7\xe2\xc8\xc2\x6a\x0f"
- "\x1a\xf8\x77\xc7\xab\xc8\x53\x5e\x3f\x7d\xd7\x8b\xd1\x33\x78\xdc"
- "\xeb\xa7\xf5\xc2\xfb\x80\x58\xb4\x95\xf9\x17\x2e\xbf\x55\x00\xed"
- "\x63\xa6\xc9\xd8\x37\x6b\x2e\xe1\x0d\x1a\xc6\x6b\x68\x4b\x66\x8e"
- "\x2d\xe6\x0d\xe6\x1d\x56\xc0\x1b\xdb\x9b\xb8\xe7\xd8\xb8\x7c\xdc"
- "\x46\x24\x8f\xf2\x2e\x37\xff\x45\x27\xc5\xad\xef\xd4\x8b\x73\xeb"
- "\x3b\xf5\x84\x5b\xdf\xa9\x6f\xe7\x56\x9d\x48\x1e\x45\x30\x8f\xfd"
- "\xef\xec\xfc\x17\xad\x95\xc6\xd6\xde\x82\xfb\xa3\xfc\x5d\xd6\xfc"
- "\x17\x86\x4f\xe7\x13\x3e\xc5\x7c\x65\xe1\x54\x2e\x8f\xa2\x95\xcc"
- "\xa3\x38\xe2\x54\x59\x6b\xf8\x19\x4e\xdd\x7d\x40\xc8\xa9\xbb\x0f"
- "\x09\x39\x75\xef\x68\x6b\x4e\xb5\xe5\xd3\xdd\x2d\x62\x5c\x4a\xf6"
- "\x47\x79\xbf\x41\x9a\x47\xf7\xf8\x49\xf1\x28\x33\x3f\x3d\x9c\x37"
- "\x3f\xbd\x9d\x47\xdf\x1b\x29\xe4\xd1\x3d\xd1\xce\xf2\x28\xf3\x6e"
- "\x93\xef\xbb\xe0\xdd\x26\x8a\x79\x34\xc6\x8a\x47\xdf\x3b\xc9\xf1"
- "\xa8\xf5\xfb\x4d\x1c\xf0\xe8\xbc\xce\xd9\x03\x45\xc0\xa3\x66\x3d"
- "\x53\x1f\xf5\x42\x5c\xd7\xf7\xa7\x09\x79\xf4\xfd\x8d\xd2\x3c\xfa"
- "\xfe\x60\x8e\x47\xc9\x79\x9d\xcb\xa3\xef\x4f\x15\xf0\xe8\x3c\x1e"
- "\x8f\xfe\xc4\x79\x08\x3c\xc7\xa2\x9d\x47\x17\xf0\x78\x74\x9e\x23"
- "\x1e\x7d\x7f\x2a\x6e\x23\xa2\x51\xf7\xde\xeb\x98\x47\xf7\x0c\x15"
- "\xe7\x51\x38\xce\xf0\xe8\x9e\xa1\x1c\x8f\x8a\x68\x54\x01\x8f\xee"
- "\x35\xc9\xe0\xd1\x6e\xbe\x37\xca\x5e\xa3\xac\x5c\x05\xb7\xa6\xd3"
- "\x76\x8f\xd4\x30\xfe\x9a\xa0\x83\x56\xef\x3d\x39\x68\xf3\xde\x93"
- "\xe5\x96\x35\x9e\x81\x2c\xaf\xbe\xe8\x02\xaf\x32\x6b\x3c\xf7\xf5"
- "\x12\xce\x3d\xd9\xd7\xd7\x32\xf7\x84\xf0\xea\x87\x45\x96\x7a\x71"
- "\xef\x3d\x39\x68\x67\x8f\xd4\x7d\xb3\x05\x7b\xa3\x04\xf2\xf7\x46"
- "\xf9\x70\x9a\xf4\x1e\xa9\xfb\x36\x0a\xf6\x46\x39\xb1\xbb\xfd\xbd"
- "\x27\xd6\x7b\xa4\x72\x1c\xfb\xc1\x56\x86\x63\xdb\xf7\xa0\xda\x57"
- "\xde\xbe\x47\xaa\x83\x75\x41\xb8\x9c\x7d\xe7\xa2\x3b\x9f\x63\xb5"
- "\x32\x38\x56\xf0\xde\x13\xeb\x3d\xa6\x4a\xc6\x56\x95\x1e\x44\x95"
- "\x11\x07\x45\xf6\x46\x3d\x78\x53\xdf\x7d\x82\xeb\x25\xce\xb5\x25"
- "\x47\x85\x5c\x5b\xd2\xcc\x9c\x7b\x46\x8c\x6b\x4b\xb2\x39\xae\x25"
- "\xe7\xad\x3a\x63\xc5\xb5\x75\x12\x5c\x0b\xe3\xea\x8e\x0b\x72\xb9"
- "\xb6\x44\xcb\x70\xed\x1a\x96\x6b\x2f\x75\x34\xd7\x96\x68\x39\xae"
- "\xfd\x70\xbd\xe3\x77\x4c\xed\xcb\x12\x5f\x97\xb3\x2f\x8b\x70\xed"
- "\xbe\x2c\xbb\xef\x98\x12\xcc\xf9\xf8\x68\xa9\xe5\x1d\x53\x5c\x3e"
- "\xe0\x20\x9b\x0f\xb8\x95\xdf\x89\xf2\x51\x9c\xdc\x7c\xc0\x97\xe0"
- "\xdd\xf1\xba\xcb\x95\xf8\x9d\x53\xa1\xf8\x9d\x28\x25\x56\xf9\x80"
- "\x12\xdb\x7c\xc0\x74\xfb\x1c\x2b\x2b\x1f\xc0\xac\xbb\xfc\x78\xb1"
- "\x90\x63\x3f\x5e\x2a\xe4\xd8\x7f\xf6\xb2\xac\xb3\xc4\xf5\x91\xde"
- "\x33\xf5\xe3\xa3\xed\xf9\x80\x3a\x21\xb7\x72\xf9\x80\x7f\x1c\x96"
- "\xe6\xd8\x8f\x85\xf9\xdf\x17\x77\x0b\xd6\x59\xbe\x77\x8e\xbf\x0f"
- "\xb5\x65\xff\xa9\x03\x3d\xcb\x6a\xf8\x1c\xbb\x7f\xf8\xad\xb4\x0f"
- "\x75\xfb\x5e\x53\x0e\xe6\x72\xdb\xee\x43\x7d\xa0\xa8\xaa\xb4\x04"
- "\xe1\xb5\x6d\x0c\xdf\x0a\x72\x03\x25\x37\x27\x37\x50\x5a\x22\x91"
- "\x1b\xf8\xc7\x10\x21\xcf\xfe\x23\x94\x39\xf7\xb4\x18\xcf\x1e\x68"
- "\xe1\x78\x96\x9c\xb7\xea\xb4\x15\xcf\xd6\x76\xa4\xa6\xfd\x87\xa6"
- "\x73\x73\x03\xff\xd0\x70\xb9\x81\x7f\x38\xb1\xfe\xf1\xe3\x66\x71"
- "\x9e\xfd\x98\xcd\xbb\x7e\xcc\xe5\x5d\x6b\x45\xde\x97\x22\xe0\xd9"
- "\x7f\x9e\xb4\xac\x7f\x64\x34\x6d\x9d\x45\xd3\x96\xdc\x82\xef\x4b"
- "\xf9\x67\xb5\xdc\xdc\x00\x5e\xe7\x8e\xb9\x15\x73\x97\x85\x5f\xb9"
- "\xdc\x40\x89\x74\x6e\xc0\x01\xbf\xca\x7f\x77\xdf\xc1\x93\x42\x7e"
- "\x3d\x78\x4a\xc8\xaf\x9f\xce\xb6\xe6\x57\x5b\x6e\x3d\xe4\x23\xc6"
- "\xab\x24\x37\xf0\xa9\xb7\x34\xa7\x1e\xf2\x97\xe2\x54\x66\x4f\xbf"
- "\x73\xdc\x1c\x69\x8e\x53\xff\x15\x26\xe4\xd4\x43\xeb\x9c\xe5\xd4"
- "\x9b\xf2\xbe\x14\xc5\x9c\x1a\x6d\xc5\xa9\xff\x6a\xe1\x38\xd5\xfa"
- "\x9d\x29\x0e\x38\xb5\xb3\xf2\x04\x7c\x4e\x15\x68\xd7\x4f\x56\x09"
- "\x39\xf5\x93\x12\x69\x4e\xfd\x64\x22\xc7\xa9\xe4\xbc\xce\xe5\xd4"
- "\x4f\x12\x3b\x37\x4f\xf0\x49\x22\xa7\x5d\x3f\x1d\xe7\x98\x53\x0f"
- "\x05\x8a\x73\xea\xa1\x40\xc2\xa9\x87\x02\x9d\x5f\x53\x7e\x78\xb0"
- "\x0c\x4e\xed\xe6\xef\x52\x39\xec\x27\x3b\x4f\x80\xf3\xad\x98\x4b"
- "\xeb\x5c\xdb\x3b\x24\xc1\xb2\x77\x48\x00\xcb\xb1\xcf\xbb\xca\xb1"
- "\x47\x46\x0a\xe7\x34\x1c\x19\x6d\x99\xd3\x40\x38\xf6\xe8\x69\xe1"
- "\xfb\x51\x6d\xf7\x0a\x11\xee\xa1\x7a\x24\xb5\x3d\x4f\x80\x39\x37"
- "\x80\x9f\x27\x38\x9a\x2a\xcd\xb7\x47\x4a\x04\x79\x82\x7f\x8b\xf3"
- "\xed\x75\x01\xdf\x7e\x56\xc1\xf0\x6d\xfb\x1e\xaa\x47\x9a\x2d\x7b"
- "\xa8\x3a\xd4\xb0\x02\xbe\x8d\xe8\x1a\xbe\x3d\xe8\x3c\xdf\x0a\xdf"
- "\xa5\x62\xbd\x5f\xaa\x76\x71\xd5\x31\xe0\x5b\x66\xbf\x0e\xeb\x3d"
- "\x53\x9d\xdb\xaf\xa3\xb3\xf6\x4c\xc5\xf5\x12\xe7\x5d\xed\x35\x21"
- "\xef\x1e\xd5\x30\xe7\x8a\xf2\xae\xf6\x38\xc7\xbb\xe4\x3c\xa7\x79"
- "\x57\x51\xce\x40\xdb\xdc\xb9\x39\x03\x6d\x33\xc7\xbb\x47\x0f\x39"
- "\xe6\xdd\x23\x07\xc5\x79\xf7\xc8\x41\xc2\xbb\x47\x0e\xda\xe5\x5d"
- "\xc1\x1c\x82\xcf\xf7\x88\xee\xe5\x51\x77\xab\xbf\x67\xe5\xf3\xdd"
- "\x4a\x72\x06\xc0\xc1\x54\x22\xde\xc3\x29\x02\xcf\x21\x70\x9c\x33"
- "\x70\xc4\xb7\xf2\x73\x06\x5f\x14\x09\xf9\xf6\x8b\x3d\x42\xbe\xfd"
- "\xcf\x34\x5c\x2f\xbb\x39\x03\x86\x03\xbe\xb8\xd6\x9e\x33\xd0\x09"
- "\x79\x96\xcb\x19\xfc\xa7\x87\xf4\xb3\xaf\x63\x6a\x81\xbe\x7d\xde"
- "\x6a\xcf\xea\x70\x8e\x6f\x4f\x54\x5a\xe6\x8c\x1d\x7f\xa9\x2c\x98"
- "\xcf\xb7\xc7\x22\x6d\xf6\xac\x9e\xda\x81\x7b\x56\x4f\xed\xe0\x3d"
- "\xab\xa7\x09\xf7\xac\xde\x76\x9d\x9b\x47\x26\x7f\xcf\xea\xe3\x97"
- "\x19\x0e\xc6\x18\xc2\xfb\x56\x3b\x93\x47\xe8\xe4\x77\xad\x08\xb8"
- "\x57\x90\x47\xf8\xf7\x62\x21\xf7\xfe\x7b\x97\x34\xf7\xfe\x7b\x1c"
- "\xc7\xbd\xe4\xbc\xce\xd5\xbc\xff\x8e\xe9\xdc\x3c\xc2\xbf\x63\xb8"
- "\x3c\xc2\x7f\x46\x8a\x72\xaf\xe0\xd9\xd8\x31\x8d\xf8\xb3\x31\x38"
- "\xce\x70\xef\x31\x8d\x64\x1e\xc1\x66\xfe\x56\xe9\xbd\xe4\xd9\x18"
- "\xab\x79\x75\x32\xf2\x08\xdd\x6e\x8e\x41\xa9\xaf\x92\x3c\x02\xe6"
- "\x5b\xcc\x67\x16\xce\x75\x26\x8f\xd0\xf1\x1a\xb7\xec\x5e\x21\xe7"
- "\x96\xdd\x2f\xe4\xdc\xf2\xc3\xd6\x9c\x6b\xcb\xb7\x65\x61\x62\x5c"
- "\x4b\xf2\x08\xe5\xf3\xa5\x79\xb6\x6c\xa3\x24\xcf\x5a\xcd\xcd\xe5"
- "\x78\xf6\xc4\x21\x21\xcf\x96\x95\x2b\xe2\x59\x67\xdf\xc1\xd2\xad"
- "\x78\x36\xc2\x8a\x67\xbf\x9c\xc6\xf1\xac\xf5\x7b\x58\x1c\xf0\x6c"
- "\x27\xbd\x87\x45\x5a\xe3\x7e\x79\x5a\xc8\xb3\xe5\x5e\xd2\x3c\xfb"
- "\xe5\x1e\x8e\x67\xc9\x79\x9d\xcb\xb3\x5f\xd6\x76\x6e\x6e\xe1\xcb"
- "\x5a\x4e\xe3\x96\x17\x38\xe6\xd9\xb2\x2c\x71\x9e\x2d\x63\x9f\x8b"
- "\x95\x65\x49\x6a\x5c\x1b\x9e\xad\x58\x2d\x83\x67\xbb\xf9\x1c\x84"
- "\x8a\x14\x25\xb9\x05\x86\x5f\x75\x56\xeb\x25\x4e\xf3\xd7\x4b\xf0"
- "\x72\x0b\x01\x96\xdc\x82\xf0\xfd\x2c\x09\x96\xfc\xad\x3f\xcb\xbb"
- "\xcf\xba\xca\xbb\x95\xd9\x37\xda\x79\x37\x16\x78\xb7\x92\x59\x1f"
- "\x71\xa3\x9d\x77\xbf\x9a\x60\xa9\x17\xf7\x7e\x16\x89\xdc\xc2\xd3"
- "\x4c\x79\xe7\xdb\x73\x0b\x98\x87\xfd\xf9\xb9\x85\x93\x2d\xd2\x1c"
- "\x5c\xe5\x25\xc8\x2d\x7c\x2e\xce\xc1\xcd\x02\x0e\xae\x1e\xcb\x70"
- "\xf0\xd3\x16\x0e\xae\x0a\xbe\x0e\xde\xf2\xfa\x06\x79\x1c\xdc\xcc"
- "\x70\x70\xe0\xcd\xe1\xe0\xfd\x1d\xc0\xc1\x4c\xbb\x57\x9f\xad\xd2"
- "\x02\x07\x87\x62\x0e\x0e\x74\x2e\xdf\xd0\x45\xef\x68\xc1\xf5\x12"
- "\xe7\xe2\x93\x51\x42\x2e\x3e\x99\xc7\x9c\x2b\xca\xc5\x27\x47\x72"
- "\x5c\x4c\xce\xeb\xdc\x7c\xc3\xc9\xc8\xce\xcd\x37\x9c\x8c\xe4\xb8"
- "\xf8\xab\x21\x8e\xb9\xb8\x4a\x25\xce\xc5\x70\x9c\xe1\xe2\x2a\x95"
- "\x5d\x2e\x7e\x9a\xcf\xc5\xff\x6d\xd7\xbc\x82\x7c\x83\xee\x56\x7f"
- "\x77\xcb\x7f\x25\xf5\xaf\xfa\x01\x94\x72\xce\xed\xbf\x8b\xab\xf2"
- "\x11\xba\xba\x06\xa5\x54\x19\x9f\x46\x70\x0c\xda\xef\xbf\x5b\xab"
- "\x7c\x47\x21\xf3\x1b\xb3\xaa\x31\x1f\x6f\xc6\x3f\xa0\x71\xb3\x28"
- "\xb6\x6f\x31\x6d\xfc\x5f\x66\xbe\x2b\x3e\x8e\xb9\x77\x07\xef\x73"
- "\xb1\xef\xa2\xb3\x66\x05\xb3\xd7\x35\x93\x75\x37\xb3\xa6\x5a\xfe"
- "\xc7\xd8\x84\x7a\x1a\xe8\xec\x59\x41\xfa\xbe\xb3\x82\xc4\xae\x1f"
- "\xe4\x8d\x3c\x7b\xaf\xa6\xe9\xed\x5b\xe8\xe6\xab\xbf\x0d\xd7\x5d"
- "\x4d\x43\x28\x6b\x0b\xad\xbf\xb1\xa1\x66\x38\x5c\x1b\xf2\x26\x9c"
- "\x77\xb5\xdf\x57\xd5\x57\xd7\x04\x23\x38\x16\x60\x39\x06\xed\x86"
- "\xcc\x6b\xdc\x69\x33\x7c\x46\x6f\x19\xf4\xe9\x8e\x24\xe0\xaa\x44"
- "\x84\x1e\xbf\x8e\xfb\x4c\xcd\x54\xc0\x8c\x2a\x13\xca\xdc\x04\x65"
- "\xd1\xbf\xb9\xaf\x19\xf0\xe8\x51\xb9\x0e\xe1\x3e\xbd\x11\xee\xab"
- "\x30\x13\xb7\xbd\xfb\xa3\x79\x34\xe5\x81\xcc\x45\x93\x46\xd1\x3e"
- "\xf1\x7a\x88\x07\xca\x8a\x45\xcc\x7b\x3e\x37\xc1\x79\x34\x95\x4c"
- "\xc3\x38\xa2\xad\x32\x36\x93\x3e\x0d\xf5\x3b\x02\x3e\x96\x86\xef"
- "\xdd\x1e\x8b\xbc\xe1\xc7\x8b\xce\x8d\xc7\x75\xad\x83\x7a\x1d\xc3"
- "\xf5\x92\xba\xc7\x4d\xdb\x60\xdc\xb9\xcf\x17\x8f\x1d\xcc\xf7\xe3"
- "\xef\x66\xbe\x87\x32\x6f\x34\xc1\x71\x7a\x4d\x32\x5d\x95\x60\x44"
- "\x7d\xa0\x2d\x76\x40\xbd\x31\x1e\xcd\xef\x86\xeb\xd6\x0e\x40\x68"
- "\xdf\x8a\x06\xaa\x0a\xea\x6e\x7a\xf3\xbe\x66\x6d\xd2\xef\x10\x7c"
- "\xae\xc7\x9e\xe5\x82\xdb\xa9\xd3\x93\x2f\x22\x84\xf9\x04\xfe\x3e"
- "\xdf\x0c\xe3\xd8\x44\xf8\x7f\x13\xdc\x87\xf9\xaa\xaf\x07\x3e\x17"
- "\x8e\x67\x6b\xe3\xbf\x45\x7d\x62\x90\x67\x26\xdc\x1b\x7b\x6e\x04"
- "\x3e\x57\xe7\x76\xaa\x1e\xd7\x01\xfe\x8f\x83\xff\xf1\x75\x78\x0e"
- "\x19\xa2\x77\x4d\x1a\xc5\x60\x33\x27\x5e\x6f\x1e\x3c\x69\x14\xc3"
- "\x7d\x70\x9f\x9b\xe0\x9e\xe1\x1c\x2f\x38\xc7\x8b\xf9\x9d\x84\xbc"
- "\x73\xe0\x18\x2e\x07\x7e\x7b\x69\x17\xb6\xe2\xb2\x83\x71\xd9\x12"
- "\xed\xe0\x41\xab\xe2\xf5\x34\x60\x1b\x8f\xa9\xea\x24\xb7\x93\xe7"
- "\xdc\xbe\x5e\xd7\xc7\x8d\xa6\xa1\x9f\x6b\xd7\x26\x21\xaf\x2c\x33"
- "\x42\xda\x01\xb8\x9c\xaf\xc3\xa0\x7c\x0f\xdc\x16\x37\x36\x7c\x3d"
- "\x46\xe7\x56\xd3\x80\xdb\x17\xe2\xd9\xac\x1e\x84\xef\xe1\xeb\x1c"
- "\xfc\x3d\xf8\x1a\xf6\x7c\x66\xef\x7b\x5c\x67\x75\x92\x3b\x0d\xff"
- "\xaf\x72\x77\x3b\x8b\xdc\x7d\xbd\x32\xe1\xfa\x44\x1d\xca\xae\xc7"
- "\xd7\xeb\xc8\x75\x80\xa5\xaf\xb3\xa0\x4c\x0f\x7c\x0c\xff\x2f\x51"
- "\x5f\x2f\x4b\xdc\x2a\xa0\xb7\xd9\xc4\xce\x82\x11\xc0\x85\x05\x23"
- "\xb8\xbe\x1f\x24\xe9\x28\x66\x1c\x76\xfb\x86\xf1\x75\x99\x10\x43"
- "\xd3\x5b\xbe\x1e\x9b\xa0\x6d\xcd\x6d\x38\x2e\xe7\xf0\x67\xa7\x70"
- "\x5c\x36\xad\x80\x98\x30\xe7\x7e\x6d\xe0\xea\xcf\x5c\xcb\xc4\xd3"
- "\x0c\xb1\x20\x6b\x37\xbf\xd9\x83\xef\x67\xd3\x75\x88\x63\x7f\xba"
- "\xf9\x58\x02\xd4\x0b\xe3\x16\x30\xb2\x2f\xd6\x40\xe1\x79\x7d\xf8"
- "\xf8\x91\x26\x03\xb5\xe9\x12\xc2\xba\x12\x65\x00\x2f\x17\xc4\x43"
- "\x9b\x43\x99\xb4\x5f\x90\xf6\x09\x4b\x1c\x57\x40\xec\xe2\x01\xbb"
- "\xd0\xe6\x9b\xa0\xfd\xb6\x03\xe7\xe1\xbf\xb7\xc3\xf8\x03\x9a\x4e"
- "\xab\x73\xfb\xa6\x1e\xca\xf3\x2e\xe8\x4f\xeb\x77\xf4\xa7\x1b\xa1"
- "\x0d\xdf\xbe\xb1\xe1\x1b\xad\xa5\x0d\x71\x9d\x36\xc1\xf1\x0c\xf8"
- "\x1c\xce\x1d\x43\x30\xf4\x8d\x97\xe5\x9e\xa5\xda\x33\x7d\x1f\x1a"
- "\x95\xb1\x0f\x0d\x4c\xdb\x87\xc6\xac\xac\x87\x7e\xb9\xe6\x8f\xf4"
- "\x97\xa1\x46\x18\x13\xff\xe5\xdb\xda\x7f\x56\x35\x7e\xf6\x64\x5e"
- "\x7b\x5f\xe1\xfa\x7d\x68\x28\x5e\x1b\x3b\xb9\x11\x21\x3c\x86\x4f"
- "\xee\xf1\x03\x5d\x15\x73\x0d\x99\xfb\xfe\xcb\xd7\xb4\xf6\xd1\x7e"
- "\x93\xae\x21\x74\x5c\xd3\x8c\x92\xe2\x60\x2c\x6f\x6a\x40\x49\xcd"
- "\xb4\xbe\x32\xe5\x22\x02\xee\x09\x20\x6d\x77\x3a\x65\x72\x14\x42"
- "\x78\xcd\xa0\xf9\x27\x0d\xea\x15\x8d\x3c\x12\x4f\x23\xdf\xe4\x7a"
- "\xba\xc1\xb4\x65\xbe\x36\x69\x15\xa2\xf6\x35\xd5\x12\xed\xe9\x76"
- "\xfa\xa5\xc3\x78\x7d\xea\x8d\x10\x34\xcb\xc8\x8e\x47\x39\xf1\x86"
- "\xe4\xb9\xe8\x5e\x7c\x3f\x7d\x18\xed\x55\x7b\x19\xda\xcd\x20\x8f"
- "\x9f\x6b\x0f\x32\xf1\xdc\xb2\x30\x78\xdf\x1c\x03\xe8\xd6\x87\x75"
- "\xc9\x51\x74\x03\xd6\x75\x30\xbe\x30\x5a\xb0\xaa\xc1\x08\xda\x2a"
- "\x12\xc6\x6f\x1d\xfa\xec\x5c\x21\x65\xce\x7d\x58\x27\xef\x3b\x4e"
- "\x0f\x64\xc6\x6d\x3c\x96\x42\xdd\xa7\x69\x50\x0a\x53\x7f\x18\x33"
- "\xfb\xc4\x61\x3d\x45\xff\x80\xeb\x7f\x04\xee\x95\x7e\x28\x2d\x18"
- "\xea\x54\x88\xc7\xcf\xc9\x75\x5a\x54\x6e\x30\xa1\x6d\x97\x98\x36"
- "\xba\x03\xda\xc8\x03\x3e\x8b\x83\x76\xf2\x14\x8b\x1b\x8e\x99\x39"
- "\xeb\x5f\xbe\x66\x77\x12\x1b\x26\x2e\xcd\x24\x2e\x93\x16\x23\x18"
- "\x47\x21\x36\xd9\x24\x36\x66\x9f\xa5\xd5\x38\x36\x32\xef\xa3\x5e"
- "\x6a\x7c\xc1\xdf\x4d\x03\x3e\x30\x2e\xcc\xaa\xa5\xd5\xf8\xbb\x71"
- "\x1d\xf0\xf3\x33\x8c\x83\xc9\xeb\x7f\xa0\x2b\x63\x1a\x50\x15\xdc"
- "\x0f\xdd\x97\x5f\x07\xa3\xcc\x3a\x7c\x1b\x2d\x55\x87\xf4\xc7\x01"
- "\xb7\x8f\x03\x6e\x1f\x07\xdc\xea\x08\x6e\x4f\xd4\x11\xdc\x9a\xa0"
- "\x5e\x2d\xa0\xdd\x57\x4e\x43\x14\xae\xd7\xde\x6f\xf1\x1e\x7d\x50"
- "\xcf\x06\x0e\xbb\x13\x2f\x43\x1b\x59\xf0\xeb\xfe\x68\x3f\xdc\x3e"
- "\x95\xcd\xb5\x28\x19\xe3\xb7\x55\x0c\xbf\x75\xfe\x93\x67\x43\x6c"
- "\x5e\x03\xfc\xfe\xa8\x41\x5e\xf5\xc8\x63\xd5\x34\xc0\x6f\x83\x18"
- "\x7e\xeb\xfa\x7e\x0a\xdf\x69\x83\xdf\x28\x3e\x7e\xbf\x2b\x96\x8f"
- "\xdf\xef\x12\xda\xf1\x3b\x83\xc5\xef\x5c\x2b\xfc\xd6\xf3\xf0\x8b"
- "\xef\x5b\x36\x7e\xbf\xab\x93\x87\xdf\xef\x22\xda\xf1\x0b\xbe\x64"
- "\xdb\xab\x4c\x1b\xdd\x01\x6d\x04\xf8\xfd\x6e\x04\xb4\x93\x28\x7e"
- "\xbb\x3e\x7e\xdf\x23\xe7\xe3\x77\xe6\xa4\xe3\xf8\x9d\x59\x20\x3f"
- "\x7e\x67\x46\x75\x7e\xfc\xce\xe4\xcb\x8b\xdf\x19\xb5\x74\xfc\xea"
- "\x9a\xbb\x4f\xfc\x7e\xd0\x3a\x1f\xbf\x1f\xb2\x1d\xc7\xef\x87\x61"
- "\xf2\xe3\xf7\xbd\xa1\xf3\xe3\xf7\x43\xa8\xbc\xf8\x7d\xaf\x93\x8e"
- "\xdf\xf7\xfb\xa5\xe2\xf7\xdc\xbd\x66\xda\x8c\xe7\xcd\xf5\x0f\x1d"
- "\x8e\x35\x10\xd1\x6b\xba\x0c\xec\x19\xe1\x7f\x0f\xcb\xff\x8c\xa6"
- "\x02\x5f\x6d\xf5\xbf\x97\xd5\xff\xde\x56\xff\xab\xac\xfe\xf7\xb5"
- "\xfa\x7f\xa0\xe5\x7f\x88\x57\x8f\x9f\xdd\x7e\x30\x81\x67\x4b\xd1"
- "\xb9\xe9\xf2\xd8\xcf\xfd\x66\x99\xd4\xd8\xf7\xf9\x89\xd5\x7d\xd3"
- "\x1a\xda\xd0\xcb\x0d\xd1\x6d\x14\x8d\x62\x92\xd0\x7d\x97\xdc\xce"
- "\x7a\xb5\xae\x01\x4b\xe8\x3e\x40\x43\xb7\xa6\x20\x73\x8e\x9f\x6a"
- "\xd2\x72\xc0\x97\x1e\x7c\x62\xb2\xef\x1d\x50\xf6\x6f\xa0\xdd\xf4"
- "\x95\x31\x7a\xd0\xe5\x9f\xd1\xe7\xdc\x74\x2d\xf8\x3e\x1f\x8f\xd1"
- "\x22\xb3\xfb\xa3\x1a\x9a\xd9\xbb\xd9\x4f\xa5\x77\x7f\x74\x00\xf8"
- "\x52\x5d\xc6\x1a\xb3\x67\x55\x63\x0d\xca\xa4\xcc\xea\xc4\x44\xd0"
- "\xf5\x8d\xfb\xd1\xca\x46\xba\x21\xd1\x48\x1b\xaa\x42\xb5\xf8\xb9"
- "\x6d\x43\x55\x42\x29\xaa\xd4\xd7\x20\x3c\xe6\x61\xac\x56\xe9\xf7"
- "\x93\xe7\xc4\xf8\x1c\x38\x56\xa9\xdf\x8b\x2a\xe0\x7f\xed\xc2\xf3"
- "\x70\x9f\x67\xf7\x54\x35\xee\x45\xa6\x1c\x3f\x6f\xb3\xea\xe1\x66"
- "\x5a\xf5\xb0\xa1\xa2\x11\xea\x96\xf3\xb0\x11\xd7\xb5\x12\xea\xc1"
- "\xbc\xa3\x33\xf7\x61\x23\x53\x6e\x73\x35\x93\x43\x30\xe5\xc2\xf9"
- "\x3e\x70\xbe\xcf\xc3\x06\x5c\x3f\x5c\x37\x51\xbf\x97\x13\x1a\x09"
- "\x75\x7f\x7a\x9a\xc6\x03\xd1\xab\x3d\x7c\xe5\xe1\xed\x6c\xb9\xa4"
- "\x8f\xcc\x09\xad\x27\xe5\x7a\x2a\x28\xf7\x9c\xe4\xfc\x27\x3a\x27"
- "\x8c\xad\xaf\xb7\x92\x72\x13\xed\x94\xcb\xd6\x57\xad\xa4\xdc\x1a"
- "\xe9\x72\xc3\xd9\xfa\xfa\x2b\x28\xf7\x7f\x43\xed\x94\xcb\xd6\x37"
- "\x45\x49\xb9\xeb\xec\xc4\x2d\x52\x19\x16\xfe\x57\x6b\x0f\x0b\xca"
- "\x70\x50\x6f\xe7\xfe\xc3\x22\x95\x61\xa0\x5e\x3a\xf7\x01\x18\x50"
- "\x16\xff\x7a\xbb\xf1\x57\x16\xfb\xf3\x92\xef\x7f\xc4\xb1\x57\x16"
- "\xf7\xf3\x92\xf8\xc7\xde\x18\xe2\x04\x9c\x9e\xe6\x6f\xde\x32\x14"
- "\x99\xfb\x87\x52\x6b\xcd\xfe\xe8\xb9\x55\x30\xe6\xe5\xa1\xbe\xcf"
- "\x15\xfc\x40\xfb\x33\x39\xa7\x0b\xaa\x55\xf9\x88\xca\xa2\xcc\x54"
- "\xf1\x8a\x5a\xaa\xca\x38\x0a\xf3\x96\x69\x57\xbc\xc1\xed\x61\x38"
- "\x7e\x14\x54\x77\xf3\x12\x0d\x22\x65\x0d\x45\x99\x49\xfe\x68\xb2"
- "\x09\xe1\x1c\x47\xf3\xa4\xc5\x3f\xd0\x5f\x40\x0d\x26\x5f\x01\x7e"
- "\xcd\x33\xe0\xb1\xb4\x2f\x5c\x6b\x04\x1c\x43\x39\x06\xf4\x81\x59"
- "\xef\x36\x49\xcf\x9c\xab\x07\x3f\xaa\xa7\xb7\x84\x32\x63\x32\x9d"
- "\xac\x41\xeb\xe0\x7f\xf8\xee\xf5\xee\x7a\x44\x6d\x07\xaf\x7a\x63"
- "\xc3\x05\xe0\xfc\x1f\x43\xb1\x7f\x05\x9f\xdc\x98\x7c\x05\xe7\xf3"
- "\xd3\xfc\xf7\x99\xf5\xd4\x5a\xf0\xcd\xf8\xfc\xc7\x63\x10\xf5\x85"
- "\x1e\xe7\x06\x2e\xec\x3d\x1a\x87\x90\x9d\x7c\x8e\x87\x59\x15\x17"
- "\x80\xaf\xc7\xe5\xe0\x3c\xe9\x26\x33\xb4\xb3\x2a\xde\x80\xeb\x4d"
- "\xe7\xcc\x3a\xa8\x5d\x81\xc7\x9c\x1f\x47\x8c\x1f\x42\xdf\xc0\x63"
- "\x08\x8c\x1d\x03\x2e\xc1\xff\x4c\x3e\x60\x0d\x5d\x4d\xab\x06\x35"
- "\xd0\x99\xbd\xfc\x2b\x9b\x9b\x90\x36\xbe\x15\x9d\x73\xfb\x71\x24"
- "\xfe\xee\xab\xaa\x38\xff\x66\x55\x5c\xe0\x8d\x0d\x3f\x0e\xb7\xd4"
- "\x17\x7f\x97\xe5\x38\xce\x7f\x90\x3a\xfe\x18\x7c\x34\x51\xba\x8e"
- "\xf4\xda\x01\xfd\x26\xfb\xd2\x7a\xdc\x96\xda\xa4\x26\xa8\x4b\xc3"
- "\x71\xdc\xde\x74\x4e\x9c\x77\x73\xb2\xe6\x01\x92\x0f\xfc\xb1\x11"
- "\xe7\x95\xe8\x1c\x3f\x92\xdf\xce\xf5\x63\xe6\xea\x60\xee\x07\x0d"
- "\x50\x8b\xb5\xd0\xcf\x6e\x3f\x32\xf9\xc0\x69\x1a\x4a\xa6\x9f\xfa"
- "\x91\xf1\xbf\xda\x07\x70\x3b\x34\x14\xc3\xf7\x3d\x73\xce\xad\xc1"
- "\x9b\xe4\x38\xfc\x7c\xf1\xf7\xc1\x39\xf9\xf0\x9d\xbe\x74\xce\x20"
- "\x1d\x3e\x0f\x3e\x1f\xce\x7e\xae\xe6\x7d\xae\x86\x3a\x87\xb0\x9f"
- "\x07\xb3\x9f\xfb\xf1\x3e\xf7\x8b\x79\x00\xe7\xfc\x1a\x12\xf0\x3d"
- "\xd1\x2a\x3f\x7c\x3f\x2a\xfc\x3c\x81\xb9\x27\x1f\x3f\xc4\x9e\xa7"
- "\x6a\x74\x6b\xc8\xbe\x0a\xf8\x82\xcf\x07\xf2\xae\x1f\xf8\x45\xc2"
- "\x70\xf4\x5c\x01\x6e\xd3\x86\x5d\x3a\x8f\x47\x73\x48\x9e\xe8\xc7"
- "\x42\xa6\x2d\x60\xfc\xe4\x97\xa7\x73\x6b\x88\xc1\x63\x64\x33\xe8"
- "\x48\x38\x67\x23\xfe\x4e\x7e\xfb\x47\xc5\xc6\x2e\x8a\x55\x0f\x8e"
- "\x54\x47\x2e\x98\xad\x7e\x65\xd1\xd2\x85\x71\x63\x07\x47\xde\x85"
- "\x10\x0f\x3b\xde\xf4\x9a\x3e\xb4\x39\x67\xd1\xc6\xaa\x3c\xd0\x6f"
- "\x94\x37\x8c\xe5\xad\x28\x07\xe2\x6a\xea\x9f\x1c\x63\xda\x92\x0c"
- "\x7d\x29\x22\x42\xbb\xe2\x59\x68\xfb\x8b\xcc\x73\x80\x2a\x35\x42"
- "\xe9\xf0\xb9\x76\xc5\x09\x7c\x6c\x02\x73\x2c\x12\x21\x26\x17\xb6"
- "\xc2\x13\x1d\x53\x37\x31\xf9\x34\xf8\x6c\x35\x93\x3b\xbc\x86\x28"
- "\xe3\x1a\x4f\xf4\x71\x52\x35\xf5\xa9\x59\x47\x7d\x6c\xae\xa5\xb0"
- "\x06\xf9\xc2\xb7\x14\x3d\x91\xe0\x89\xf0\xe7\x9f\x25\xc1\x71\xf8"
- "\x1c\x7f\xc6\x94\xc3\xc4\xfa\xe2\x49\x7c\x1e\xce\xaf\xe1\xbf\x93"
- "\xf3\xe8\xb3\x5f\xf8\x82\x8e\x61\x34\xf1\xc5\xc1\xb8\xae\xea\x01"
- "\xf8\xd9\xc5\xc5\x21\xb8\x7e\x3a\xb7\x8b\x1a\xf7\x7c\x38\x3f\x1e"
- "\x79\xfd\xec\x76\xc9\xc7\x9c\xbb\x68\x23\xe6\x05\xe3\x86\x86\x3a"
- "\x7a\x4d\xdf\x85\xdb\xdf\x40\x9e\xf9\x6f\x40\xff\x7c\x03\x79\xdc"
- "\xd8\x70\x09\xe9\x3c\xc6\x4d\xc5\x6d\x0b\xc5\x78\x5d\xa5\xd0\x1f"
- "\xe1\x98\x4a\x87\xb2\x13\xf1\x31\xe8\x7f\xcd\x52\x3c\x73\x1d\xb4"
- "\xa3\xc1\x2f\x08\x99\x55\x8b\x12\x68\x68\xb7\x1b\x7e\x41\xc3\xfb"
- "\xc4\x00\xb6\xa0\x8f\xd1\x3e\x8b\x12\x1a\xdd\x1a\x35\xff\x86\x9e"
- "\x95\x84\xfb\xf4\x96\x88\x88\xf7\xae\x1b\xa0\x6f\x27\xc7\xec\xbd"
- "\xae\x87\xff\x93\xd1\x6e\xf8\xbf\x4c\xbb\x1b\xa9\x27\x61\x3d\x76"
- "\x29\xf5\x4f\x91\xb4\x71\x48\x39\x68\xd8\xfa\x8f\xd0\x97\x35\xa5"
- "\xc8\x2b\x14\xb9\xb7\xef\x23\x1f\x87\xa8\xc9\x3a\xf8\x7f\x29\xa2"
- "\x2a\x0d\x26\xe6\x99\x41\xd2\x68\x9c\xfb\xaf\x40\xf8\x79\x00\x4d"
- "\x6d\xf6\x2b\x6e\x32\x00\x97\x35\xf4\xc0\xf3\xc9\xcd\xde\x9f\x35"
- "\xe0\x6b\x66\x35\xb3\xcf\xd1\xae\xb2\xcf\xd1\xae\x32\xcf\xd1\xca"
- "\x13\x23\xc8\x73\x34\xfc\xfc\x6c\x72\x84\x3b\x8d\xcb\xc3\xcf\xd4"
- "\x7a\x35\x03\x0e\x96\x68\x7a\x9b\x96\x68\xfa\xe5\x35\x21\x55\xa5"
- "\xbe\x01\x55\x35\x96\xa2\xb7\xe2\x91\x8a\xbe\x1a\xdd\xb3\x5c\x7b"
- "\x02\xd1\x6f\x7c\xa2\xfb\x20\x49\xdb\xc3\x84\xf3\x1f\x57\x7d\xef"
- "\xea\xb3\xda\x0d\xf7\xd3\xde\xe9\xb1\x68\xe8\x8e\x26\x34\x7c\xd6"
- "\xf9\x14\x66\x4f\x29\xfc\xfe\x3f\xe3\x55\x8d\xba\xed\xaa\x66\x50"
- "\xcb\x55\xcd\x03\x7d\xf4\xe4\xb9\x5b\xd8\x65\x6f\x84\xe7\xf2\xd2"
- "\x1b\xbe\xc5\xe7\x7b\xe0\xe7\xcd\xc6\xbe\x9f\x35\x60\x2c\xc3\x77"
- "\x0f\xc4\xcf\x6a\x92\x97\x23\x6f\xf3\xff\x34\xa8\x22\xba\x09\x3d"
- "\x01\xb1\xc7\xcf\x25\xb6\x9f\x23\xcf\x25\x4c\xe0\x97\xf0\xb3\x89"
- "\xeb\x57\x35\x14\xad\x5a\xaa\x9b\x38\x57\x8d\x5a\x8a\x82\x00\xaf"
- "\xef\xa1\xe4\x16\xfa\x6c\xd5\x3a\x33\xc2\x39\x6b\x7a\xc3\xa5\xa1"
- "\xb4\xcf\x52\xdd\x71\xcd\x29\x3c\xc6\x8c\xe0\xb8\xe3\xa7\x6b\xca"
- "\xb8\xe3\x27\xe6\x59\x02\x7e\x86\x07\xf1\x8b\xd9\xdb\x84\xe3\x09"
- "\x71\x6d\xd2\x53\x2f\x42\xec\x2a\xea\xdf\x86\xb8\xd5\x0a\xe2\xc6"
- "\xc4\x19\xce\xbb\x10\x09\xf1\x3a\x4f\x62\x58\xde\x0c\xf1\x3b\x84"
- "\xcb\x88\x4b\x29\x8e\x37\x50\xe0\xc9\xa8\x72\xc3\x19\x66\x3d\x0c"
- "\x8e\xe3\xde\xd6\xd2\x1e\x2d\x30\xee\xe0\x67\xa1\xd7\x77\x05\xa9"
- "\x5b\x54\x8b\x42\xda\x54\x8b\xa2\xed\x3c\x17\x25\xf1\x9c\x8b\x3c"
- "\xcb\xeb\x4f\x91\x78\x2e\x66\xe3\x89\xe7\xcf\x2d\xd3\xf4\x36\xde"
- "\x80\x78\x5e\x87\x78\xc6\xe9\xd0\xb6\x58\xa4\xaa\x6a\xa8\xc5\xcf"
- "\x8c\x7a\x4e\xa8\x40\xe8\xc5\x21\xb4\xb9\x42\xfb\x2d\x13\xd7\x7d"
- "\x10\x57\x63\xd6\xbf\x7c\xf1\xb3\xd2\xf6\xb8\xc6\x43\x5c\xaf\x43"
- "\x5c\x2f\x73\x71\x35\xdd\x80\xb8\xde\x80\xb8\xde\x80\xb8\xb2\xcf"
- "\x53\xc3\xe6\x42\x5c\x29\x26\xae\x25\xf8\x79\x2a\x7e\x6e\x85\xe3"
- "\x8a\xe7\x6c\x9b\x97\x69\x06\x32\xcf\x51\x5f\xd1\xa0\x1d\x73\x90"
- "\xe7\x30\x03\x72\x4b\x3e\x84\xbc\xa1\x9e\xde\xbf\xdd\x8f\x28\x28"
- "\x0f\x70\x7f\x0e\xe1\xf8\x56\xed\x37\xa1\x95\xd3\xd1\x03\xc6\x6c"
- "\x12\xe7\x2a\xe3\x01\x9c\x37\x1e\x75\x7d\x99\x86\xda\x1a\x8f\xc6"
- "\xe0\x98\x07\x9d\x57\xa3\xe3\xc1\x15\x36\x31\x37\xe7\xc6\x79\x43"
- "\x9c\x74\x38\xee\xca\xfb\xed\x2f\x3a\xe7\xfb\xed\xcf\xe3\x6e\xf7"
- "\xdb\x8e\xee\xb7\x97\xeb\xc5\xfb\xed\x2f\xc5\xca\xfa\xed\x2f\x7b"
- "\x6f\xf7\xdb\x5b\xa1\xdf\xfe\x92\x67\xdd\x6f\xdb\x75\x4b\x6c\xd4"
- "\x82\xd9\x73\x17\xce\x5d\xf8\x9a\x7a\xce\xf2\xb8\xa8\x25\x44\xbd"
- "\x08\xf4\x8b\xc6\x64\xf6\xa7\x36\xc3\x78\xfd\xa5\x6f\x2d\xfa\x60"
- "\x40\x2d\x65\x9e\xe9\xeb\x41\x67\x7d\x35\xdc\x9c\xf5\x55\xc9\x66"
- "\xd0\xe2\xb8\x7f\xe7\x80\xc6\xbe\xe0\x66\x54\xfd\x67\x20\xe8\xcf"
- "\xd8\x4b\x08\xff\x4d\x9e\x0f\x6f\xce\xc3\x6b\x28\xf3\xb6\xd0\x0d"
- "\x78\x0d\x65\xd9\x31\xac\x2d\x9a\xa6\xdd\x1d\x02\x7e\x62\xa6\x2f"
- "\x6a\x99\x19\x42\xa5\x7d\x8b\x3c\xfb\xd4\xa2\x20\xb3\x99\xa6\xb5"
- "\x49\x97\x40\xf7\xb5\x84\x6a\x67\x5c\x42\x58\xeb\x5c\x70\xbb\x71"
- "\x58\xbd\x62\x35\xfe\xbd\x53\xbd\x62\xc3\x0f\xf0\x7b\x36\x93\xc7"
- "\xe9\x4f\x37\xd0\x5b\x16\x56\x9b\xde\x9d\x14\x8c\x9f\x9d\xee\xe8"
- "\x4f\xd7\xef\x03\xbf\xb1\xaf\xd5\x40\xad\x6d\x02\xdc\xac\x79\x90"
- "\xc6\xcf\x40\x71\x1b\xac\x8d\x85\xb6\x07\xdd\x4b\xb4\xe9\xf5\xa3"
- "\xb8\x7f\x81\xbe\xaa\x3f\x72\xa1\x96\xc2\xcf\x80\x71\x9f\x6b\x56"
- "\x0d\xd2\xad\x83\x7b\x81\x7a\xea\xb6\x6e\xa1\xeb\xf4\x3e\x8b\x36"
- "\x7a\xa8\x11\x75\x63\x43\x53\x29\x68\xc0\x66\xac\x59\x36\xc2\x67"
- "\xa9\xf0\x19\x79\x1e\x79\x3d\x91\xbe\xe3\x4a\x0e\xe6\x39\xc0\xb5"
- "\xdb\xcf\x6e\x57\x7d\xf0\x3e\x52\xe9\xc4\x9b\x34\x18\x72\x17\x45"
- "\x1b\x8b\x82\xd4\x46\xac\x29\x07\x07\x0d\x6f\xc9\x5d\x14\x62\xcc"
- "\x5d\x94\x30\x6d\x08\xf3\xdc\x1d\xce\x6f\xbe\x88\xef\xa3\x25\x27"
- "\x22\x02\xce\x6f\xbe\xaa\x4a\x8e\xb9\x9a\x93\x8c\x4e\x24\xe4\x21"
- "\xf5\x14\xcc\x7f\x57\xc7\xbd\x98\x47\x1b\x1f\x0d\x06\xfe\xcb\x7b"
- "\x0f\x7d\x19\x04\xfc\x17\x62\xcb\x7f\x64\x9e\x82\x09\x11\x1e\xac"
- "\x40\x50\x56\x3d\xee\x47\x58\xa7\x16\x43\x5b\xe0\x3e\x82\xfb\x02"
- "\xc3\x87\xc0\x85\x96\xfe\x82\xfb\x12\xe6\x3b\xa6\xef\x5a\xf5\x1d"
- "\xdc\x5f\xee\xd6\x23\x6f\xdc\x5f\x30\x1f\xe2\xfe\x82\xe7\xff\x6c"
- "\x66\xfb\x4b\x9f\x3a\xe4\xbd\x0d\xb8\xb0\xca\x58\xca\xf4\x19\xac"
- "\x27\xcb\x8d\x3c\x1e\xc4\xcf\x8e\x78\xfd\x25\xc3\xd2\x5f\x2c\x3c"
- "\x08\x7d\xc2\x88\xfb\xcb\x32\xcd\xa0\xd6\x65\x5c\x7f\x99\x79\xc6"
- "\x1b\x31\x1c\xb9\xe1\x74\x49\x3e\xf4\x17\x9c\x53\x33\x59\x78\x10"
- "\xfa\x0b\x5e\x9f\xc4\xf0\xe0\x5f\x81\x07\x1b\x81\x07\xf5\x70\x1c"
- "\xfa\xc9\xf6\x79\x2c\x0f\xb2\xfd\xa3\x65\x19\xcb\x83\x97\xd5\xa8"
- "\x75\x30\xe6\xc1\x6d\x12\xfa\xe5\x8c\x15\x0f\x36\x1f\x50\xc6\x83"
- "\xcd\xcc\xfe\x67\x38\x86\xad\x10\x4f\x1c\xc7\x17\x7d\x69\x63\x79"
- "\x1e\xf0\xdf\xd4\x6e\x16\xb7\x58\xf1\xb8\xed\x63\xc7\x2f\x51\x9e"
- "\x13\x89\x1b\xe0\xbc\xd1\x78\xc3\x36\x76\xf4\x86\x6f\x0c\x7c\xae"
- "\xc3\x1c\x87\xf9\x0e\xf3\x1c\xe6\x3c\xdc\x3f\x30\xd7\x61\x9e\x7b"
- "\x04\xc6\x00\xf8\xbf\xa1\x22\xfa\x1c\xc3\x81\xc9\xe7\x91\x77\xf2"
- "\x78\xf4\x40\xd5\x41\x13\xf8\x9b\x6b\x08\x73\x20\x7f\x7c\xc3\x9c"
- "\x87\x63\xbb\xf5\x3a\xe1\x3c\x3c\xce\x61\x7e\xb3\x19\xe7\x20\xb6"
- "\x10\x93\x42\x3c\xce\x31\x79\x8b\x35\xf7\xbc\xb0\xa3\x1f\xf1\x25"
- "\x39\xfd\x90\xe7\x8d\x0d\xd7\xf3\x6d\xbd\xc9\xf5\x12\x8b\x37\xc1"
- "\x7d\x1c\xf7\x75\x9d\x5b\x13\xf3\xbc\x4a\x3b\xe0\x69\xcc\x59\x39"
- "\xc4\x8b\xce\x2f\x21\xfe\xc8\x48\xde\x2d\xa7\x8a\x37\x70\xfe\xff"
- "\xba\x89\xcc\x13\x00\xbf\xef\x33\xeb\x20\x9d\x3b\xa8\x01\xb7\x31"
- "\xbe\xe7\x59\x43\x00\xa3\xb9\x71\xfe\x9b\x70\xbb\xe5\xc6\x05\xc0"
- "\xdf\x81\x1c\xee\x6e\x0c\x3b\x9e\x80\xd0\xb4\x04\xb9\xb8\xbb\x41"
- "\xe6\x40\x7c\x17\x72\x0f\x3d\x33\xc4\xc3\xfc\x5d\x48\x0f\xc0\x88"
- "\xef\x22\x53\x0a\xba\x9e\xb5\x39\x2b\xd9\x48\x37\xa8\x57\xa0\x47"
- "\x81\x33\x33\xca\x8c\x08\x95\x81\xca\xae\x0a\x9a\x0f\xf1\xde\xec"
- "\xfd\x81\x59\xef\x01\xf7\x37\x15\xfc\x63\x03\x70\xb1\x07\x9f\x8b"
- "\x09\xef\x36\x31\x7b\x86\x19\xb2\x36\x17\xe2\xb2\x26\x97\xa2\x3e"
- "\x30\x1e\x7b\x5c\x70\x6b\x19\xb6\x7c\x15\xc2\x6b\x6b\x7b\x5c\x70"
- "\x33\xb4\xb4\xf6\x7b\xc5\x1b\xae\xef\x4d\x7f\x37\xd5\x2d\xe6\x79"
- "\xf4\x00\x3d\x73\xaa\x1b\x9e\x17\xb1\xc7\x5c\x48\x99\xe1\x18\x99"
- "\x67\x55\x88\xf0\xe7\xe9\xad\x1e\x8c\x4e\x33\xc3\x39\x95\xcd\x85"
- "\x28\x3d\xde\x13\xe1\xf3\xc9\xdc\xbd\x42\x84\xcf\xcf\x88\xf5\x66"
- "\xe6\x55\x30\xd7\x19\x0b\x11\xbe\xd6\x04\xc7\x5f\x37\x7b\xa1\xcc"
- "\x15\x2a\x54\x56\x5e\xc9\x94\x51\x56\xfe\x6f\x84\xcb\x80\xbe\x00"
- "\x7f\x1f\x41\x9b\xe2\x7d\x81\x13\x0a\xe1\xf3\xaf\xd1\xa6\x9f\x07"
- "\xc2\xef\x0b\xf0\x73\x1d\x5d\x72\x33\xe4\x97\x95\x9b\x51\x9f\xd5"
- "\x7f\xa4\x01\xd3\x74\x15\x5e\xaf\x99\x84\xee\x80\xba\x17\x55\xd5"
- "\x66\x81\xa7\xbd\x91\x8e\xd7\xf3\xd3\xc9\x33\x1b\xcd\xf4\xcc\xcb"
- "\xe6\xe4\x99\x3f\xe3\xef\x36\xd1\x33\x7f\xc1\xdf\x9d\xb1\x42\xcd"
- "\xce\xe5\x2d\x64\xe6\x1d\xa6\x5f\xf7\x43\xb8\xae\xf8\x7b\xf1\xf7"
- "\x6d\x8a\xd5\xb0\xdf\x39\x94\xa9\x1b\xfe\x4e\x5c\x26\xff\x3b\x4f"
- "\xe0\xef\x7c\x19\x7f\x67\xcb\xbd\xf0\xbb\x2f\xc4\x23\x0b\xc7\x01"
- "\x7f\xbf\x99\x0e\xe9\x41\x27\x87\xb8\x33\xd7\x18\x1a\xc4\xae\x99"
- "\xc8\x5e\x93\xce\xe4\x01\xe0\x9a\x16\x9a\x39\x9f\x29\x03\xc6\xca"
- "\xb9\xf8\xf8\x63\x21\x5a\x64\x1b\xc3\xd6\x1e\x64\xec\x6c\x39\x45"
- "\xc6\x4e\x12\x53\x06\x2b\x33\x43\x7a\x40\xdc\xbc\xf1\x38\x0b\x65"
- "\x14\xb7\x97\xf1\x5d\x88\x3b\x8e\x37\xc6\x8d\x05\x4b\x18\x47\x16"
- "\x0c\x31\xf5\xd4\x23\xc4\xc7\x0c\xfc\xed\xc9\x96\x73\xcd\x52\x0e"
- "\xd4\x01\x59\x70\xf4\x18\x7c\x6e\x8b\xa3\xb6\x0a\x0e\x47\x6d\x0b"
- "\x0c\x49\x34\x8d\x71\xa4\x9d\xb1\x06\xca\x69\x1d\xcb\xd5\x67\xaa"
- "\x1b\xc6\xd8\x2d\x86\xad\x7c\x1c\xa7\xc7\x12\x91\x8a\xdc\x4f\x5b"
- "\x2f\xe6\x7e\x12\xb5\x2a\x5c\x57\xcb\x7d\xe0\x3a\x64\x9a\xd5\xc8"
- "\x72\x1f\x9b\x5a\xfd\xa0\xdc\x9f\x11\x7b\xcd\x38\x5c\xb6\xa5\x0d"
- "\x20\x66\xc8\x72\x8d\xe5\xfc\x4c\xb3\x06\xea\x3d\x94\xb9\x86\x60"
- "\xee\x82\x08\x7e\xda\x32\xac\x31\x77\x77\x22\x02\x41\x0c\x5a\x6b"
- "\x46\x13\xfe\x9e\x3d\xa4\x6e\x9f\x99\x5a\xbe\x0b\xc1\x71\xa5\xd8"
- "\xe3\x47\x79\x98\x60\xcb\x37\x88\x95\x7f\x59\x50\x7e\x08\x94\x9f"
- "\x00\xe5\x63\x2d\x37\x03\xe7\xf0\x8c\x3d\x99\x72\x12\x48\xf9\x16"
- "\xdc\xd2\x59\xb3\x82\x62\x56\xe0\xb9\xaf\x46\x96\x4f\xaf\x30\xdc"
- "\xc9\xcc\xb9\xa2\xcc\x85\x66\xab\x39\x57\xfc\x39\x79\x1f\x24\xe9"
- "\xd9\xf9\x56\x46\x66\x6f\x2f\x9c\x2b\xc3\x9a\xb4\x18\xf4\x1c\x37"
- "\xe7\xea\x5b\xfc\xf9\x56\x6d\xfc\x39\xde\x9c\x2b\x23\xf3\xbe\x17"
- "\x9d\x9b\xf1\xd8\x0d\x0a\x51\xf0\x7f\x0a\x39\x7e\xc5\xc8\x3f\xce"
- "\xcd\x69\x24\xc7\xf1\x7c\x71\x36\x67\xdc\xf8\xc5\x41\x9c\x37\x34"
- "\xd6\x59\x72\xb5\x12\x5e\xd8\x79\xcd\x4c\xdd\x19\xd1\xae\x99\xe1"
- "\x6f\x69\xcd\x6c\x4a\xb5\xab\x99\x29\x8f\xdd\xed\x9a\x99\x72\xef"
- "\xc9\xf4\x7b\x8a\xba\xcc\xf4\x7b\x8a\x62\xfa\x77\x26\x94\x67\x7c"
- "\x3b\x2d\x82\x7e\x37\x48\x8f\x71\xbe\x1d\x34\xf0\x07\xf1\xa5\x54"
- "\x31\xf8\x6e\x13\xf5\x20\xbd\x16\xda\x0e\xef\x35\xb7\x76\x05\x8c"
- "\xdf\xc6\x1a\x54\xe9\x81\x35\xf3\x39\x5c\x4e\xaf\x4a\xe6\x99\xe2"
- "\x2c\x2d\x69\x17\xd3\x79\x88\x85\x7b\x95\xc1\x80\x98\xf3\xe0\x33"
- "\x18\xd7\xea\xb1\x66\x3e\x62\x2e\xa5\xb6\x43\x9b\xc2\x0f\x68\xea"
- "\xb4\xe1\x7c\x4d\x7d\x63\x83\x59\x25\xaa\xa5\x29\xb7\x52\xe3\x06"
- "\xbe\x96\x36\x33\xfb\x5c\xe3\x1c\x3f\xd6\x07\x66\xa2\xa1\xd5\xa0"
- "\xa7\x87\x63\x5d\x8d\xb5\xb4\x99\xaf\xa5\x29\x34\xd2\xbe\x96\x36"
- "\x67\xdc\xd6\xd2\x9d\xa5\xa5\x2d\x39\x05\x2b\x2d\x0d\x7d\x46\x91"
- "\x96\xa6\xb0\xfb\xbc\xad\xa5\xbb\x97\x96\xa6\x1b\x2d\x5a\xda\xbc"
- "\xe6\x9e\xdf\xe1\x1c\xff\x76\x8b\x96\x4e\x73\x6b\xb0\xd1\xd2\x69"
- "\x6e\x46\x5b\x2d\x6d\xd6\x70\x5a\xda\x54\x2a\xd0\xd2\x94\x67\x5f"
- "\x1b\x2d\x4d\x51\x13\xa4\xb4\x34\xf0\x58\x23\xd6\xd2\x18\x6b\x58"
- "\x57\x63\x3d\x0d\x75\x0f\x24\xb8\xa3\x96\x2b\xd2\xd2\x14\x95\xe0"
- "\x94\x96\xa6\xa8\xd3\xe2\x5a\xda\xb4\x51\x5a\x4b\x9b\x36\x8a\x6a"
- "\x69\xca\x63\x79\xbb\x06\xa2\x3c\xc6\x77\x7b\x2d\x4d\xb9\x37\x88"
- "\xea\x1d\xca\xfd\x0a\xa3\xa5\x29\xaa\xb6\xc3\xb5\x34\x94\x29\xaa"
- "\xa5\x29\x8f\x28\x46\x77\x50\x54\x9d\x8d\x96\xc6\xd7\x88\x69\x69"
- "\xca\x63\x2b\x7b\x4d\xad\x40\x4b\xb3\x65\xc0\x18\x7a\x40\x52\x4b"
- "\x53\x3d\x5e\x22\x63\x6a\x8f\x87\x88\x96\x26\x31\xb5\xd1\xd2\x94"
- "\x47\x8b\x43\x2d\xcd\x62\x88\xa9\xa7\x94\x96\xa6\x7a\x8c\xb3\xd5"
- "\xd2\xa6\x8d\xa2\x5a\x9a\xba\xf3\x5e\x0e\x47\x77\x1c\x12\x68\x69"
- "\xaa\x47\xea\x2d\xa1\xa5\xa5\xb1\xd5\x20\xd0\xd2\xd4\x1d\xd3\x65"
- "\x6b\x69\xea\x8e\x0c\x59\x5a\x9a\xc1\x9c\x88\x96\xa6\xee\x38\x6d"
- "\x8d\x39\x81\x96\xa6\xee\xb8\x26\xaa\xa5\xa9\x3b\x7b\x09\xb4\x34"
- "\x53\xbe\x88\x96\xa6\xee\x1c\x2d\x28\xdf\x5a\x4b\x53\x77\x4e\x13"
- "\x68\x69\xf6\xbc\x76\x2d\x4d\xdd\x69\x64\xf5\xd9\x93\xb2\xb5\x34"
- "\x75\xe7\x19\xbb\x5a\x9a\xba\xf3\xbc\x40\x4b\x53\x77\x32\xcf\xfb"
- "\x75\x94\xa7\x37\xa3\xa5\xa9\x3b\xcb\x89\x96\x36\x0d\xe7\x1f\xe7"
- "\xb4\x34\x39\x6e\xa3\xa5\xd3\x3c\x35\x0e\xb4\xb4\xbf\xf3\x5a\xfa"
- "\x9e\xe8\xd2\x76\x2d\x7d\x4f\xb4\x45\x4b\xe3\x77\x25\xe5\x83\x3e"
- "\xcd\x67\xf4\xf4\x09\x54\x56\xcf\x8c\x39\xa7\xed\xeb\x69\xef\x3c"
- "\x4e\x4f\xf7\xbe\x48\xfa\x7e\xef\x0a\xa2\xa7\x7b\x67\xb4\xe7\xa0"
- "\x41\x4b\x63\x4d\xcd\xe6\xa0\x6b\xd2\xe1\xe7\x83\x15\xa5\x8c\x9e"
- "\xc6\xeb\x00\xb0\xa6\xc6\x7a\x1a\xeb\x6a\xac\x95\x2b\xd6\x21\x54"
- "\xa9\x37\xe0\x39\x2c\xd5\xda\x07\x70\xbb\xf6\x5e\x0e\x3a\x5c\x07"
- "\x63\x5b\x35\x5c\xab\xfb\xa0\xc9\x80\xd7\x94\xd4\x65\x9e\x83\x6b"
- "\x74\xe4\x1a\xf8\xbc\x16\x5f\x03\xe7\xd4\x91\x58\xf4\x3a\x45\xc6"
- "\x4f\x56\x8f\x53\x3d\x97\x0a\xf4\x38\x39\xb7\xc6\xa2\xc7\x0b\xa0"
- "\x0e\xf0\xe3\x81\xb5\x38\xd6\xe4\xa0\xc5\xcb\x0b\xb6\xd0\xa5\xdb"
- "\xfb\xd3\xc7\x6e\xa4\xf5\xdc\x6d\xd1\xe4\x19\x70\x2c\x13\x8e\x41"
- "\x3d\xaa\x8f\x15\x22\x74\xb8\x49\x8b\x35\x85\xae\xe0\x02\xf2\x80"
- "\x98\xd5\xae\x85\xef\xc7\xd7\xc3\x35\x75\x96\x6b\x60\x7c\x2f\x27"
- "\x1a\xbe\x57\x8e\x99\x9f\x0f\xa7\xee\x1a\xd2\xae\xe1\xa1\x9d\x70"
- "\xbe\x1d\xbf\x83\x8c\xd1\xf1\x83\x83\x86\x1b\x2d\x3a\xde\x87\xaf"
- "\xe3\xef\x36\x59\x74\x3c\x5e\xcb\xd5\xae\xe3\xe3\x58\x1d\x4f\xdd"
- "\x35\x4d\xa1\x8e\xaf\xe9\x2e\x3a\xde\xcb\xcd\xcd\xc3\x2b\x82\xe8"
- "\xf8\xfc\xf8\x8e\xd1\xf1\x58\xc3\x63\xdd\x8e\x35\x3c\xd6\xf4\x58"
- "\xc7\x63\x4d\x6f\x66\x75\xfc\x76\x2b\x1d\x6f\x06\xcd\x6e\xad\xe3"
- "\xb1\xb6\xb7\xe8\x78\xb3\x40\xc7\xdf\x5d\xa6\x4c\xc7\xdf\x5d\xda"
- "\x01\x3a\xbe\x6b\xe2\xd6\x8d\x74\xbc\xc6\x4a\xc7\x63\xdd\x0e\x7d"
- "\xb2\x1e\xeb\xf9\x2a\x2d\xb4\xcd\x62\xd0\xf4\xa0\xe7\x15\x6b\x79"
- "\xea\xee\xfd\x7c\x2d\xbf\xbd\x1f\x5f\xcb\xf7\xda\x6f\xab\xe5\x7b"
- "\x95\xf2\xb4\x7c\xb9\x8e\xea\xd9\xc8\x8c\x13\xc0\x07\xda\x39\x58"
- "\xa7\xf7\x0c\x11\x6a\x79\xd5\xbd\xb6\x5a\xbe\xb7\x8f\xa8\x96\x27"
- "\xfe\x5e\xa8\xe5\x7d\xe2\x02\x8c\xed\x5a\xbe\xf7\x78\x65\x5a\xbe"
- "\x77\x40\xbb\xd7\xa0\x7a\xfa\x91\xf1\xa8\x57\xbd\x94\xbe\xbf\xe1"
- "\xcd\xd7\xf7\xbd\x0f\x71\xfa\x3e\x8e\xd3\xf7\x94\x67\xad\xa4\xbe"
- "\x87\xcf\x98\x79\xf5\xde\x9b\x0b\x71\x59\x58\x97\x01\xb7\xd6\xab"
- "\x63\xb1\x36\xf3\x9e\x8b\xb5\x19\xf0\x59\x3d\x9e\x8f\x0e\xff\x8f"
- "\xb4\xe8\x7c\xc6\xa7\x62\xad\xbf\xa2\x3b\xea\xb1\x3e\x35\xe2\x7a"
- "\xac\xcf\x59\xac\x7b\x98\xb5\xbe\x54\xef\x83\xd0\x26\xf5\x1d\xab"
- "\xf7\x7b\x1f\x14\xd7\xfb\xde\xd3\x88\x36\xea\xfd\x29\x8e\x8b\x50"
- "\xef\xc3\x35\xa2\x7a\xdf\x3b\x95\xbd\xe6\xa0\x50\xef\x93\x32\x60"
- "\x8c\x2f\x92\xd6\xfb\x7d\xc7\x91\x31\xbf\x6f\x5f\x32\xe6\x93\x18"
- "\xdb\xea\x7d\xef\x8b\x7c\xbd\x8f\xe3\x6f\xab\xf7\x09\xa6\x98\x7a"
- "\x4a\xea\xfd\xbe\x4f\xda\xe8\x7d\xf8\x4e\xac\xf7\x8d\x3c\x5c\xe5"
- "\x63\x5c\xcd\xc1\xb8\xba\xe7\x21\x8c\x2b\x3c\xae\xaa\x5f\xc5\xb8"
- "\xea\x77\xd4\x60\xb6\xe8\xfe\x34\x5c\xde\x6a\x6b\xdd\x8f\x79\xc4"
- "\x1e\xce\x62\x62\xd1\x03\x18\x6b\x18\x67\x96\xb8\xe1\xf3\x31\xde"
- "\x3a\x17\x6b\xfd\xfc\xc5\xb1\xd6\x6f\x22\x13\x67\x16\x6b\x38\x5f"
- "\x49\x7c\x00\xbe\xbf\x7e\xb3\xe5\xf9\x00\xe6\x9a\x5c\x79\x3e\x00"
- "\x63\x51\xcc\x07\xf4\x3b\x6b\x8d\x45\xa1\x0f\xe8\x67\x12\xf7\x01"
- "\xf7\xf8\x08\x7d\x00\x2e\x5f\xcc\x07\xdc\x33\x4e\x50\xbe\x8d\x0f"
- "\xb8\x27\x4c\xe8\x03\xc8\x79\x9c\x0f\x50\x79\xb0\x79\x95\x55\xf2"
- "\x7d\xc0\x3d\xe7\x59\x7e\x27\x3e\xe0\x9c\xb5\x0f\xb8\xe7\xb2\xd0"
- "\x07\xdc\xa3\x25\xfc\xaa\xf2\x35\x30\x3e\xe0\x9e\x1a\x72\xdc\x33"
- "\x91\x7f\xbc\xdd\x07\xb0\xc7\x0d\x7c\x1f\xa0\xc5\x3e\x40\x35\xdc"
- "\x81\x0f\x08\x76\xde\x07\x3c\xa8\xe3\x7c\xc0\x83\x3a\xfb\x3e\x40"
- "\x75\xd6\xbe\x0f\xb8\x7f\x20\xe7\x03\xee\x5b\x40\x38\xe1\xbe\x97"
- "\x08\x27\xdc\xc7\xe4\xad\xa0\x5f\x71\x79\xf5\xc5\xcc\xfc\xf3\xd2"
- "\x7d\x4d\xa5\xd4\x07\xb1\x6c\x5e\xfd\x3a\x78\x80\x78\xd0\xf3\xcd"
- "\x44\xcf\x03\x67\x1e\xc3\x3e\x00\xeb\x75\xe2\x01\x06\x98\xe0\x98"
- "\x0e\xda\xfc\x18\x94\xa5\xdb\xbb\x42\x4b\xe1\xb9\x61\xf8\x5c\xe8"
- "\xef\xb5\xe9\x30\x8e\xc0\x71\x3c\xfe\x68\xf1\x35\x70\xac\x46\x1b"
- "\xcb\x5c\x77\x11\x7b\x05\xb8\x4e\x0b\x9f\xd7\x59\x5d\x57\x8d\xaf"
- "\xab\x4c\x60\xbc\x40\x35\x89\xdd\x80\x09\x70\xbc\x9c\xf3\x0d\x3e"
- "\xc5\x8c\x6f\x68\x66\x7d\x03\x9c\x0b\x65\x95\x32\xbe\x61\x0e\xf8"
- "\x06\xa8\x37\xfc\xf0\x7d\xc3\xa7\xe0\x1b\x0e\x82\xcf\xd9\x7f\x23"
- "\xcd\x47\xc7\xf3\x0d\x07\xb1\x4f\xc0\x9e\x01\x7b\x05\x18\xd7\xf6"
- "\x63\x1f\x71\xb8\x55\x87\xe7\xda\xd7\x80\x6f\xa8\xc5\xd7\x73\xd7"
- "\xf6\x1f\xc8\xbf\x16\x9f\x0f\x75\xd4\x32\x9e\x03\x74\x1e\xd4\xa1"
- "\xae\xe0\x1c\xe3\x39\xca\xe1\xda\x6a\xe2\x39\xfa\x07\xf3\x3c\xc7"
- "\xa7\xc4\x73\x0c\xf0\x14\x3c\x37\xa0\xfa\x17\xc8\xf7\x1c\xbe\x8b"
- "\xed\x3e\x3b\xa0\xfa\x97\xc9\xf1\x1c\x70\xdf\xa5\x16\xfd\x6a\x33"
- "\x0f\x11\xcf\xc1\x07\x0d\x8b\xf5\xaa\xdd\x79\x6b\xac\x96\xc5\xda"
- "\x15\xeb\x56\xac\x5f\x9d\xf2\x1c\x50\xff\x72\x43\x07\x3e\x3b\xb8"
- "\x03\x3c\x47\xbc\xb4\xe7\xe0\xfb\x0d\xec\x3f\xb0\xe7\x80\x3e\xc6"
- "\x78\x8e\xfc\x35\x56\x9e\xe3\x0e\x07\x9e\xc3\x8d\xef\x39\x7c\xc7"
- "\x2a\xf3\x1c\xbe\x63\x3a\xc0\x73\x94\xde\xf6\x1c\x1d\xed\x39\x7c"
- "\x35\xed\x9e\x83\x62\x9f\x1f\xf4\xb3\x78\x8e\x01\x1a\x5b\xcf\x31"
- "\x60\x0c\xcf\x73\x7c\xaa\xa3\xfa\x33\xcf\x45\x89\xdf\xf0\xc9\x12"
- "\xfa\x0d\x75\xb6\xad\xdf\x18\xb0\x5e\x99\xdf\x18\x70\x40\x99\xdf"
- "\x18\xb0\x9f\xd4\x0f\x3f\x2b\xf5\x89\x20\xe3\xde\x80\xa9\x9c\x07"
- "\xf1\xd1\xf0\x8f\x39\xf6\x20\xf7\x8d\x15\xf7\x20\x2a\x9d\xb4\x07"
- "\x51\xe9\xa4\x3d\xc8\xc0\xcb\x58\x2b\x62\xbf\x01\xe5\x83\x56\x1c"
- "\x78\x88\xff\xac\x21\xdd\x81\x2e\xb4\xf6\x1f\x31\x73\x88\x5f\xe9"
- "\x7c\x5d\x38\x30\x44\x5c\x17\x0e\x8c\xc2\x9a\xcb\xc8\xe8\xc2\xfb"
- "\xc6\xe4\x77\xb8\x07\xb9\x6f\x8c\xb8\x07\x19\xc8\xe6\x7f\xef\xf3"
- "\xb7\xf5\x20\x70\x8d\xa8\x07\xb9\xbf\x17\x7b\xcd\x18\xa1\x07\x21"
- "\x65\x80\xbe\x18\x22\xed\x41\xee\x3f\x4e\xf4\xc6\xfd\xb9\x44\x6f"
- "\x90\x18\xdb\x7a\x90\xfb\x17\x38\xf6\x20\x04\x53\x4c\x3d\x25\x3d"
- "\xc8\xfd\xed\xcf\x3f\x38\x0f\xa2\xd2\x61\x0f\x22\x8e\xab\x07\xb7"
- "\x0a\x71\xf5\xe0\x68\xa1\x07\x79\xa0\x87\xb5\x07\xb9\x05\xb1\x16"
- "\xc2\x3d\x7f\x60\xee\xe9\xb4\x7c\xdf\xf1\x60\x2f\x79\xbe\x03\xe3"
- "\x4f\xcc\x77\x3c\x38\xdd\x1a\x7f\x42\xdf\xf1\xe0\x52\x71\xdf\xf1"
- "\x60\x86\xd0\x77\xe0\xf2\xc5\x7c\xc7\x83\x87\x04\xe5\xdb\xf8\x8e"
- "\x07\x4f\x09\x7d\x07\x39\x8f\xf3\x1d\xea\x44\x36\x07\xb4\x5e\xbe"
- "\xef\x50\x87\xd9\xf7\x1d\xea\x28\xa1\xef\x50\x8f\x22\x9c\xaa\xce"
- "\x22\xbe\x43\x1d\x44\x8e\xab\xd6\xf1\x8f\x73\xbe\x83\x1c\xb7\xf5"
- "\x1d\xea\xdd\x0e\x7c\x87\x97\x71\x57\x90\xba\xd5\x2f\x68\x78\x6b"
- "\x4e\x72\xf0\x63\xf5\x0f\x9a\xda\xdf\xed\x10\x01\x1a\xa2\x0e\x34"
- "\xc5\x6c\x44\xe1\xfd\x11\x92\x4e\x82\x56\x98\x4d\xd6\x31\x60\xbd"
- "\xb0\x2f\x1e\xeb\x3e\x6d\x0f\x68\x53\xd4\xa6\x0a\x45\xc6\xa1\xb3"
- "\xfc\xb1\x6e\x68\xd9\x15\x84\x0c\x39\x8b\x42\x5a\xf0\x1a\x86\xf9"
- "\x88\x9a\xd5\x28\xae\x05\x57\xd6\xd1\x66\xc0\xbc\xe7\xe4\x50\xa2"
- "\x03\x2b\xa2\xcf\x33\x38\xc6\x5a\x62\x1b\x68\x89\xaa\xe6\x5a\x46"
- "\x5b\x78\x45\xa8\x51\x7e\x12\x52\xf5\x6a\x44\xde\xbd\xdc\xdc\xee"
- "\xf8\xd3\x74\x84\x4c\xa0\x2b\xc6\x0f\xa1\xcd\x8f\xd6\xab\xf1\x7e"
- "\x48\xbd\x89\xb6\x38\xd8\xc3\xc8\x6a\x8b\xd7\xaf\xa3\xa1\x05\x38"
- "\xff\x5c\x41\x34\x05\x7e\x0f\x44\x0b\xd1\x14\x0f\xb4\xde\xd0\x0c"
- "\x6a\x5f\xc3\xc0\xad\x4d\x69\x5f\xc3\xd0\x96\xcd\xe9\x09\xac\x25"
- "\xe8\x59\xa0\x05\x0d\x64\xfe\xc8\x8a\x97\xc8\x1a\x86\xa1\xf5\x88"
- "\xda\x11\x8e\x3c\xcb\x23\xce\xe1\x5c\x91\x6f\x79\x7d\x11\x5a\x3e"
- "\x01\x3d\x60\xc4\xfa\x01\xb4\x61\x79\x7d\x2e\xc2\x7b\x3d\xe6\x83"
- "\x8e\xc8\x63\x35\x44\xd0\x6c\x09\x0d\x01\x63\x35\xd6\x11\x64\x8c"
- "\x1e\x34\xfd\xb8\xe6\x38\x92\xaf\x0d\x07\x31\x79\x4a\xc9\xb5\xcd"
- "\xbb\xc0\x1f\xf8\x05\x21\x93\x2a\x39\x98\xec\xfd\x19\x97\x62\x7e"
- "\xfb\xf5\x18\xbc\xa7\xe3\xfb\xe7\x1a\xdc\xf0\x3e\xe6\xf8\x9d\x9e"
- "\xe6\xbd\xb3\xfc\x05\xeb\x4e\xda\xd8\x98\xb5\x91\x98\x61\x4d\x18"
- "\xd6\x88\xe8\x59\x46\x0a\xc1\x67\xbd\x99\x75\x27\x06\x1d\xe2\xde"
- "\xed\xe9\x8b\xb6\x9b\xc9\xfe\x99\xe6\x95\xd1\x3d\xcd\x10\x17\x7a"
- "\x0d\x85\x8a\xaf\x1b\x18\xdd\x97\x8e\xdf\xf7\xb9\xda\xad\x17\xd6"
- "\x7d\x80\xfd\xbb\x76\xb4\x42\x8c\xce\x92\x18\xd1\x6b\x3c\x99\xdf"
- "\xc6\x95\x1a\x35\x94\x3d\xa8\xad\x0d\x74\x1f\xfb\x6e\x50\xcb\x5e"
- "\xc2\xcc\x1a\xa2\x56\xbc\x86\xa8\x16\x19\xb3\xc9\xfe\x8c\x80\x0b"
- "\x37\xbc\xaf\x09\xd4\x61\x20\xb3\x76\xa8\x4d\x83\x71\xe4\xbd\xfd"
- "\x02\x5e\xef\xf4\x2d\x13\x1f\x13\x1b\x17\xfc\x8e\x50\x8b\x9e\xab"
- "\xdc\x7d\x8a\xac\x1f\xb5\x8a\x45\x5b\x11\xd1\xed\xcc\x7a\x9e\x34"
- "\xf5\xa7\x78\xde\xcf\xcf\xd4\xc3\x57\x8e\xc7\x81\x76\x8a\x93\x1b"
- "\x97\x87\xf5\xdd\x23\x2e\xde\xbf\xb2\xb8\x0c\x2a\x24\x71\x19\x9c"
- "\xaa\x2c\x2e\x83\x37\x76\x8f\xb8\x78\xfe\xca\xe2\xe2\x37\x8a\xc4"
- "\xe5\x91\x87\x94\xc5\xe5\x11\xb5\xbd\xb8\xe0\x1c\x99\x25\x3f\x66"
- "\xc9\x8d\xe1\xf1\x94\xf8\xa2\xc7\x9b\xb9\xb9\xa6\x8f\x37\xf3\xe7"
- "\x9a\x7e\x79\x0c\xef\x1b\x90\x86\x4e\x04\xe0\xb1\xf2\x91\x6b\xf6"
- "\x73\x62\x43\xc7\x70\x39\xb1\x47\x0b\x88\x46\x7d\x74\x35\xd1\xa8"
- "\x8f\x32\xf3\x56\x56\x9d\x41\x94\xf1\xb7\x93\x82\xf7\x2d\xd4\x52"
- "\x78\x9d\xd6\xbe\x9f\x0d\x54\x7a\x13\x68\x4e\xea\x41\x1a\xe7\xa8"
- "\x32\x62\xc1\xdb\x80\x0e\x88\x79\x15\x3d\x78\x89\x1a\x72\x08\xef"
- "\x2f\x77\xe4\x67\x2d\x95\x85\xcf\x19\xf4\x7a\xcc\xde\x01\x7a\x37"
- "\x3c\x8e\xee\x5b\x68\xa0\x2c\x58\xb2\xac\xdf\x84\xf6\x1c\x7e\xb5"
- "\x28\x48\x8d\xe7\x82\xb6\xfa\x2c\x0a\x31\xf9\x24\x07\x1b\x8b\x67"
- "\xf9\x8b\xe1\x8b\x59\x17\x0a\x63\x28\x5e\xc7\x19\x1e\xc3\xe1\xcc"
- "\xbc\x92\xe0\xab\x12\x34\x3b\x7e\x87\x52\x1f\x18\x3b\xe9\xb6\xe8"
- "\x9e\x33\xf7\x40\xec\x59\x8c\xc1\xf8\x2d\x8d\xb1\xad\x42\x8c\x5d"
- "\x65\x31\x06\x58\x6b\xc7\x18\x37\x76\x9e\x2e\x21\x18\xd3\xb5\x63"
- "\x8c\x19\x3b\x57\x6a\x06\x62\x9c\x59\x30\x86\xc7\x4d\x82\xb1\x73"
- "\x92\x18\xfb\xb2\x4e\x1c\x63\xc6\xc1\x7c\x8c\x0d\xae\x26\x18\x1b"
- "\xb2\xfe\x78\x28\x60\x2c\x54\x2e\xc6\x86\xac\x13\x7a\xec\x27\x76"
- "\xda\x7a\xec\x21\x17\xad\x3d\xb6\xc5\x53\x5f\xf5\x89\xf3\xbf\x9a"
- "\x1b\x17\xd0\xec\x63\xf1\xd5\x8f\xf6\x52\xe6\xab\x1f\xf5\x72\x6e"
- "\x4e\xde\xa3\x0b\x4e\x24\x22\x74\x02\xfa\x53\x55\x30\x99\x93\xf7"
- "\x3e\xe3\x97\x1f\x31\x60\x1c\x8a\xfb\x65\xf2\x99\xed\x5c\xaa\xa1"
- "\xbd\xb8\xb9\x54\x8f\x9d\x6e\x79\x43\x7c\x4e\xde\x7b\x49\x79\x3c"
- "\xef\x92\x27\xe2\x5d\xf2\xac\x9e\xd3\xe5\x89\xf8\x96\x3c\x84\xaf"
- "\xe5\xfb\x96\x13\xc1\xc4\xb7\x9c\x08\xc6\xbe\x25\x8f\xd1\x7b\x27"
- "\x82\x2d\xbe\x25\x0f\x3e\x27\xbe\xe5\x44\xf0\x05\xf8\xc1\xbe\xe5"
- "\xb1\xc4\x13\xc1\x62\xbe\xe5\xb1\xf5\x64\x4e\xde\xa3\xf3\xa5\xe7"
- "\xe4\xe5\xf1\xfc\x71\x1e\xcf\x1f\xe7\xb1\xfe\x38\x8f\xf1\xc7\xe4"
- "\x3b\x87\x32\x75\xc3\xdf\x89\xcb\xe4\x7f\x27\xe7\x1f\x1e\x6b\x21"
- "\xfe\xe1\xd1\x18\x1c\x07\xa1\x3f\x86\x6b\x12\xc4\xfc\xf1\xd0\x61"
- "\xec\x35\xf3\x2d\xfe\xb8\x95\x9c\xcf\x94\x01\x5c\x33\x41\xda\x1f"
- "\x0f\x3d\x4f\xb8\x67\xe8\x01\xc2\x3d\x24\xa6\xb6\xfe\x78\x28\xdf"
- "\xff\x48\xcc\xc9\x23\x18\x62\xea\x19\x23\xe5\x8f\x87\x9e\xb2\xf5"
- "\xc7\x8f\x34\x8b\xcf\xc9\x7b\xbc\x98\xc3\xd1\xe3\x13\x85\x73\xf2"
- "\x86\xdd\xcf\xf7\xc5\x18\x63\xb7\x18\xb6\x12\x85\x73\xf2\x86\x5d"
- "\x16\xf7\xc4\x79\x3c\x4f\x9c\xc7\x78\xe2\x13\xc1\x96\x39\x79\x8f"
- "\x3f\x84\xcb\xb6\xf5\xc4\x79\xed\xe7\x5b\x3c\x31\xbe\x86\x60\x4e"
- "\xcc\x13\x3f\xbe\xc0\x1a\x73\x42\x4f\xfc\x78\xaa\xc5\x13\xb7\xce"
- "\xe4\x7b\xe2\xc7\x77\x0a\x3d\x31\x2e\x5f\xcc\x13\x3f\x5e\x21\x28"
- "\xdf\xc6\x13\x3f\x7e\xd1\xe2\x89\x71\xf9\x16\xdc\x72\x9e\xf8\x89"
- "\x74\xc2\xa1\x8f\x14\xc8\xf7\xc4\x4f\x30\x79\x9d\xe2\x6d\xe4\x59"
- "\x97\xd0\x0f\x3f\xb1\x54\xe8\x87\x9f\x08\x24\xbe\xf7\x89\x42\x32"
- "\x1f\xef\x89\x50\x72\xfc\x91\x7c\xfe\x71\xce\x0f\x93\xe3\x78\x3e"
- "\x1e\x99\x87\xf7\x44\x89\x3c\x1f\xfc\x9b\x6e\xe8\x83\x7d\xed\xf8"
- "\x60\xdf\x5f\x99\x0f\x7e\x72\xb6\x32\x1f\xfc\x64\x44\xf7\xd0\xf5"
- "\xbf\x36\xbf\xf5\xc4\x31\xa2\xb9\x7e\xd7\xa2\x4c\xd7\xff\xce\xd0"
- "\x3d\xe2\xf2\x6b\xf3\x5b\x4f\xee\x26\x71\x19\x91\xad\x2c\x2e\x23"
- "\xb2\x94\xfb\xad\x31\x91\x9c\xdf\x1a\x13\x29\xed\xb7\x46\x46\xd9"
- "\xf7\x5b\xa3\xf7\x72\x7e\x6b\x54\x2f\xa2\x79\x9e\xba\x42\x34\xcf"
- "\x53\x1f\xca\xf7\x5b\x4f\x0d\xb9\xed\xb7\x3a\xd2\x6f\xfd\x9f\x3f"
- "\xc1\xd8\xef\xaf\x29\xf3\x5b\xbf\x6f\x16\xfa\xad\xb1\x22\xeb\xa1"
- "\x9e\x9a\xee\xbc\xdf\x7a\x6a\x95\x32\xbf\xf5\x54\xa2\x73\x7e\xeb"
- "\xa9\x33\xe2\x7e\x6b\x64\xb4\xb4\xdf\x22\x9f\xd9\xea\xe4\xd1\xab"
- "\x38\x9d\x3c\x7a\x42\xf7\xf7\x5b\xa3\x1a\xc5\x35\xf1\xa8\x6b\xc4"
- "\x6f\x3d\x55\xd7\xf1\x7e\xeb\xa9\x3a\x71\xbf\x35\x7a\x2e\xd1\xa6"
- "\x4f\xe9\x6c\xfd\x16\x5c\x23\xea\xb7\x46\x17\xb0\xd7\xd4\x09\xfd"
- "\x16\x29\x03\xb8\xe6\x90\xb4\xdf\x7a\x7a\x1a\xe1\x9e\xa7\x07\x13"
- "\xee\x21\x31\xb5\xf5\x5b\xa3\x4d\x8e\xfd\x16\xc1\x10\x53\x4f\x49"
- "\xbf\xf5\xf4\x78\x5b\xbf\x35\x32\x52\xdc\x6f\x8d\xb9\x9f\xc3\xd1"
- "\x33\x87\x85\x7e\xeb\xe9\x8c\x5b\xc3\x6f\x49\x62\xab\x51\xe8\xb7"
- "\x9e\x09\x93\xef\xb7\x9e\xc9\x96\xe7\xb7\x30\xe6\xc4\xfc\xd6\x33"
- "\x67\xac\x31\x27\xf4\x5b\xcf\xb4\x88\xfb\xad\x31\x7d\x85\x7e\x0b"
- "\x97\x2f\xe6\xb7\xc6\x8c\x15\x94\x6f\xe3\xb7\xc6\x4c\x17\xfa\x2d"
- "\x72\x1e\xe7\xb7\xc6\x90\x35\x50\xd4\xc8\x5e\xf2\xfd\xd6\x98\x33"
- "\xd2\x7e\x6b\x8c\xd5\xfa\xa7\x31\xec\xfa\xa7\xb1\xec\xfa\xa7\x31"
- "\x64\xfd\x13\x35\xd2\x8b\x7f\x9c\xf3\x5b\xe4\x38\xe7\xb7\xc6\xaa"
- "\xe5\xf9\xad\x3e\xdd\xd0\x6f\x79\xdb\xf1\x5b\xde\xbf\x32\xbf\xf5"
- "\x87\x93\xca\xfc\xd6\x1f\xaa\x6f\xeb\xfa\xce\xd0\xf5\x63\x47\x10"
- "\xcd\xe5\x3f\x57\x99\xae\xf7\x97\x7c\xff\x8b\x63\x5d\x1f\x38\x86"
- "\xd3\xf5\x81\x63\xa4\x75\xfd\xb8\xb1\xf6\x75\xfd\xf8\x75\x9c\xae"
- "\x7f\x8e\xcd\x65\x3e\x57\x46\xc6\xd6\xe7\x52\xe5\xeb\xfa\xe7\xdc"
- "\x6e\xeb\xfa\x8e\xd4\xf5\x7f\xf4\x25\x18\x7b\xb6\x42\x99\xae\x7f"
- "\xb6\x5c\xa8\xeb\x03\x2f\xda\xea\xfa\xe7\x9e\x74\x5e\xd7\x3f\x37"
- "\x4d\x99\xae\x7f\x4e\x72\xde\xa1\x50\xd7\x3f\x77\x40\x5c\xd7\x8f"
- "\xf3\x97\xd6\xf5\xe4\x33\x5b\x3d\x36\x7e\x1a\xa7\xc7\xc6\x3f\xd4"
- "\xfd\x75\x7d\xc0\x31\x71\xed\x15\x50\x41\x74\xfd\x73\xfb\x3b\x5e"
- "\xd7\x3f\xb7\x5f\x5c\xd7\x8f\x67\xd7\x7f\x3c\x77\xd0\x56\xd7\xc3"
- "\x35\xa2\xba\x7e\xfc\x52\xf6\x9a\xfd\x42\x5d\x4f\xca\x00\xae\xc9"
- "\x96\xd6\xf5\xcf\x0f\x23\xdc\x33\xde\x44\xb8\x87\xc4\xd4\x56\xd7"
- "\x8f\x3f\xe5\x58\xd7\x13\x0c\x31\xf5\x94\xd4\xf5\xcf\xdf\x6f\xab"
- "\xeb\xc7\x8d\x11\xd7\xf5\x2f\x5c\xe3\x70\xf4\x42\xae\x50\xd7\x3f"
- "\x1f\x75\x6b\xe8\x7a\x49\x6c\x1d\x13\xea\xfa\x17\x46\xca\xd7\xf5"
- "\x2f\xcc\x95\xa7\xeb\x31\xe6\xc4\x74\xfd\x0b\x07\xac\x31\x27\xd4"
- "\xf5\x2f\x9c\x14\xd7\xf5\x2f\x5c\x14\xea\x7a\x5c\xbe\x98\xae\x0f"
- "\xf4\x11\x94\x6f\xa3\xeb\x03\x9f\x14\xea\x7a\x72\x1e\xa7\xeb\x03"
- "\x6b\x08\x87\xfa\x9f\x97\xaf\xeb\x03\x0f\x48\xeb\xfa\xc0\xc3\x42"
- "\x5d\x1f\x98\x45\xf4\x7b\x60\x03\xd1\xf5\x81\xbb\xc8\x71\xff\x7a"
- "\xfe\x71\x4e\xd7\x93\xe3\x9c\xae\x0f\x34\xc8\xd3\xf5\x77\x76\x43"
- "\x5d\xef\x69\x47\xd7\x7b\xfe\xca\x74\xfd\x8b\x7b\x94\xe9\xfa\x17"
- "\x77\x2b\xd7\x8f\x53\x12\x39\xfd\x38\x25\x51\x5a\x3f\xfe\x69\x95"
- "\x7d\xfd\x38\xf9\x18\xa7\x1f\x27\x0d\x26\x1c\x3e\xa9\x27\xe1\xf0"
- "\x89\x65\xf2\xf5\xe3\xc4\x71\xb7\xf5\x63\x47\xea\xc7\x09\x5e\x44"
- "\x3f\x4e\xec\xa5\x4c\x3f\x4e\xf4\x12\xea\xc7\x3f\x0f\xb1\xd5\x8f"
- "\x13\x17\x3b\xaf\x1f\x27\xe6\x2a\xd3\x8f\x13\x73\x9c\xd3\x8f\x13"
- "\xaf\x89\xeb\xc7\x3f\xa5\x48\xeb\x47\xf2\x99\xed\xb8\x3f\x39\x97"
- "\x1b\xf7\x27\xcf\xee\xfe\xfa\x71\xb2\x87\xf8\x18\x3f\xb9\x17\xd1"
- "\x8f\x13\x9b\x3b\x5e\x3f\x4e\x6c\x16\xd7\x8f\x93\x57\x93\xb1\x76"
- "\xa2\xc1\x56\x3f\xc2\x35\xa2\xfa\x71\x32\x3b\xfe\x4f\x6c\x16\xea"
- "\x47\x52\x06\x70\xcd\x49\x69\xfd\x18\xcc\xae\x8b\x0d\x1e\x4b\xb8"
- "\x87\xc4\xd4\x56\x3f\x06\xfb\x38\xd6\x8f\x04\x43\x4c\x3d\x25\xf5"
- "\x63\x70\x98\xad\x7e\xfc\x53\xa2\xb8\x7e\x9c\x32\x92\xc3\xd1\x4b"
- "\xa7\x84\xfa\x31\xb8\xe8\xd6\xd0\x8f\x92\xd8\xf2\x10\xea\xc7\x97"
- "\x96\xca\xd7\x8f\x2f\xed\x91\xa7\x1f\x31\xe6\xc4\xf4\xe3\x4b\xd7"
- "\xac\x31\x27\xd4\x8f\x53\xfa\x8a\xeb\xc7\x29\x43\x84\xfa\x11\x97"
- "\x2f\xa6\x1f\xa7\x4c\x13\x94\x6f\xa3\x1f\xa7\x2c\x16\xea\x47\x72"
- "\x1e\xa7\x1f\xff\xac\x22\x1c\xfa\xa7\xc1\xf2\xf5\xe3\x94\x6b\xd2"
- "\xfa\x71\x8a\x49\xa8\x1f\xa7\x54\x13\x9d\xf8\x67\x0d\xd1\x8f\x53"
- "\xea\xc9\xf1\x3f\xf9\xf1\x8f\x73\xfa\x91\x1c\xe7\xf4\xe3\x9f\x47"
- "\x39\xd2\x8f\xf6\xb5\xc5\x8c\x46\x4e\x5b\xcc\x68\xe4\x6b\x8b\x32"
- "\x81\xb6\xf8\xb3\x83\xfd\xaf\x42\x46\x70\xda\xe2\xe5\x5c\xd2\xbf"
- "\x5f\x5e\x4e\xfa\xf7\xcb\xa3\x19\x6d\x31\x11\x34\x00\x68\x8b\xe2"
- "\x4b\x25\x44\x5b\x5c\x32\x50\xaf\xff\xcc\x6a\x8b\x46\xe4\x99\xbe"
- "\x90\xd5\x16\xe1\x58\x5b\x4c\xfb\x10\x6b\x0b\xaf\x7c\xd0\xb7\xf5"
- "\xac\xde\x8d\x01\xbd\x5b\x0f\xff\x43\xdf\x39\x02\x65\x54\x82\x26"
- "\xcd\xc2\xd7\xe3\xf7\x80\x40\x59\xcc\xda\x5a\x66\xdd\xad\xae\x87"
- "\x7a\x0e\x59\xb3\x8b\xdf\xe3\x22\xf5\x0e\x17\xcb\xfb\x5b\x12\xeb"
- "\x69\x33\x7e\x5f\xcb\xe4\x48\xde\x7b\x5c\xf0\xbb\x5f\xf5\x0d\x08"
- "\xbf\xcb\x25\x3f\x16\xa9\xde\xc2\x5a\xa3\x01\x79\xf7\x5e\xed\xd6"
- "\x1b\xbf\xc7\xa5\x77\x33\xd1\xb4\xc5\xe6\x52\xa2\x69\x97\xf8\xde"
- "\x05\x3a\x69\xe8\xf6\x26\x4e\x63\x6c\xc6\xfa\x62\x89\x46\xdd\xbc"
- "\x44\xf3\xc0\xd5\xab\xa0\x69\xf5\xd6\xef\xf9\xf8\xc6\x80\xdf\x25"
- "\x51\x95\x40\x72\xa0\xcc\xfb\x3d\x5e\xd3\xa0\x1d\xaf\x82\xee\x69"
- "\x44\x6e\x8f\xe3\x77\x7c\x54\x20\xef\x47\x06\x02\xef\x5f\xd5\x0c"
- "\xe4\xef\xcf\x89\xf3\xa2\xe6\xab\x1a\x54\x1e\xf1\x2d\xb3\xce\xd6"
- "\x68\x59\x67\xdb\x84\x46\xe9\x97\x68\xa8\x6d\xb1\x3c\x4d\xeb\x83"
- "\x35\xed\xd3\x76\x34\xed\xb4\x55\xca\x34\xed\xb4\x44\xa1\xde\x98"
- "\xb9\xd5\x56\x6f\x4c\x3b\xeb\xbc\xde\x78\xb9\x87\x32\xbd\xf1\xb2"
- "\x87\x73\x7a\xe3\xe5\x28\x6b\xbd\xb1\x87\xd1\x1b\x7f\xae\xc3\xd8"
- "\x14\xd7\x1b\xe4\x33\xdb\x71\x22\xa4\x07\x37\x4e\xfc\xe5\x64\xf7"
- "\xd7\x1b\x7f\x89\x13\x1f\x13\xfe\xb2\x8a\xe8\x8d\x97\x23\x3b\x5e"
- "\x6f\xbc\x1c\x29\xae\x37\xfe\x72\x85\x70\xf3\xcb\xd1\xb6\x7a\x03"
- "\xae\x11\xd5\x1b\x21\x83\xd9\x6b\x22\x85\x7a\x83\x94\x01\xfc\x33"
- "\x4e\x5a\x6f\x84\x9c\x21\x7c\x14\x52\x4c\xf8\x88\xc4\xd4\x56\x6f"
- "\x84\xac\x77\xac\x37\x08\x86\x98\x7a\x4a\xea\x8d\x90\x0a\x5b\xbd"
- "\xf1\xe7\x5a\x71\xbd\x31\xa3\x88\xc3\xd1\x8c\xf1\x42\xbd\x31\xdd"
- "\xe7\xd6\xd0\x1b\x92\xd8\x8a\x13\xea\x8d\xe9\xe7\xe5\xeb\x8d\x19"
- "\xf7\xca\xd3\x1b\x18\x73\x62\x7a\x63\x46\x94\x35\xe6\x84\x7a\x63"
- "\xc6\x6a\x71\xbd\x31\x63\xab\x50\x6f\xe0\xf2\xc5\xf4\xc6\x8c\xe3"
- "\x82\xf2\x6d\xf4\xc6\x8c\xb3\x42\xbd\x41\xce\xe3\xf4\xc6\xcc\x75"
- "\xac\x67\x5b\x2d\x5f\x6f\xcc\x8c\x92\xd6\x1b\x33\x17\x08\xf5\xc6"
- "\x4c\x7f\xa2\x2b\x66\xe6\x11\xbd\x31\x73\x2a\x39\xfe\xe7\x14\xfe"
- "\x71\x4e\x6f\x90\xe3\x9c\xde\x98\x79\x7b\xfd\xeb\x2d\x95\xaf\x0a"
- "\x53\xb8\xfe\x35\xec\xf6\xfa\xd7\x4e\x79\x0e\x3d\x93\x5d\xff\x1a"
- "\xae\x70\xfd\x6b\xf8\xed\xf5\xaf\x9d\x12\x97\x30\x76\xfd\x6b\x84"
- "\xc2\xf5\xaf\x11\xb7\xd7\xbf\x76\x4a\x5c\x66\xb1\xeb\x5f\xe7\x28"
- "\x5c\xff\x3a\xc7\x85\xf5\xaf\xf3\xbc\x39\x6f\x3c\xcf\x5b\xda\x1b"
- "\xcf\x71\xb0\xfe\xf5\xb5\x10\xce\x1b\x47\x1d\x22\x5a\x34\xaa\x80"
- "\x68\xd1\x28\x26\x37\x95\x84\xbd\xf1\xdb\x69\x11\x1f\xc4\x1e\xa4"
- "\xf0\xbe\x70\xf8\xdd\x98\x19\x2b\x90\x87\x11\x7b\x63\x88\x41\x46"
- "\x2b\xf6\xc6\xc7\x50\xcc\x3c\xec\x8d\x23\x4f\x55\xd6\xf3\xde\xaf"
- "\x42\xbd\x32\x9e\xdb\xcf\xf9\x18\xc2\x9f\x1d\x69\x3a\x48\x65\xb5"
- "\x5a\xe5\xe4\x63\x0d\x94\x7a\xa1\x30\x27\x6f\xca\x4d\x0e\xc6\x39"
- "\xf9\x16\xf6\x5d\x29\x4c\x5e\x7e\x98\xfd\x9c\x7c\x41\x2b\x8c\x9d"
- "\x22\x79\x79\x9c\x93\x87\x31\xf2\x57\x96\x93\x8f\x60\xd7\xc6\x46"
- "\xee\x54\x96\x93\x8f\x2c\x14\x7a\xe4\x79\x87\x6d\x3d\x72\x54\x0f"
- "\xe7\x3d\x72\xd4\x10\x65\x1e\x39\x4a\xe3\x9c\x47\x8e\x4a\x15\xf7"
- "\xc8\x73\x0c\x49\x92\x1e\x99\x7c\x66\xeb\x6d\x5e\x1b\xc2\x79\x9b"
- "\x57\xaf\x75\x7f\x8f\xfc\x6a\x9e\xb8\x8f\x79\x75\x27\xf1\xc8\x51"
- "\x1b\x3b\xde\x23\x47\x6d\x14\xf7\xc8\xaf\xb1\xcf\xbf\xa3\xd2\x6d"
- "\x3d\x32\x5c\x23\xea\x91\x5f\x9b\xc0\x5e\xb3\x51\xe8\x91\x49\x19"
- "\xc0\x43\x51\xd2\x1e\x39\xda\x8d\xf0\xd2\x6b\x27\x09\x2f\x91\x98"
- "\xda\x7a\xe4\xd7\xf6\x38\xf6\xc8\x04\x43\x4c\x3d\x25\x3d\xf2\x6b"
- "\x57\x6c\x3d\xf2\x1c\x89\xb5\xb1\x73\xcb\x38\x1c\xcd\x9d\x2b\xf4"
- "\xc8\xd1\xa3\x6f\x0d\x8f\x2c\x89\xad\x3c\xa1\x47\x9e\xdb\x53\xbe"
- "\x47\x9e\x3b\x56\x9e\x47\xc6\x98\x13\xf3\xc8\x73\x53\xad\x31\x27"
- "\xf4\xc8\x73\x8b\xc4\x3d\xf2\xdc\xc3\x42\x8f\x8c\xcb\x17\xf3\xc8"
- "\x73\x2f\x0a\xca\xb7\xf1\xc8\xf3\x7a\x08\x3d\x32\x39\x8f\xf3\xc8"
- "\xf3\x76\x13\x0e\x9d\xa3\x60\x6d\xec\xbc\x54\x69\x8f\x3c\x2f\x5b"
- "\xe8\x91\xe7\x45\x12\x2f\x3c\xef\x53\xe2\x91\xe7\x25\x90\xe3\x73"
- "\xf2\xf9\xc7\x39\x8f\x3c\xc7\x6a\x6d\xec\xbc\xf2\xdb\x6b\x63\x6f"
- "\x25\x8f\x3c\x5f\x61\xfe\x7b\x7e\x62\xf7\xd0\xfc\xbf\x36\x2f\x36"
- "\x4f\x47\x34\xd7\x42\x1f\x65\x9a\x7f\xa1\xaa\x7b\xc4\xe5\xd7\xe6"
- "\xc5\xe6\xb3\x6b\x96\x17\x15\x2b\x8b\xcb\xa2\xbd\xca\xbd\xd8\xb2"
- "\x7c\xce\x8b\x2d\xcb\x97\xf6\x62\x31\xab\xed\x7b\xb1\xb8\x7a\xce"
- "\x8b\x2d\x19\x4f\x34\xcf\x92\x21\x44\xf3\xc4\x5e\x94\xef\xc5\x62"
- "\x67\x0b\xbd\x58\xcc\xc9\xdb\x5e\xac\xb3\xbc\xd8\xc2\x50\x82\xbf"
- "\xd8\x61\xca\xbc\x58\xec\x50\xa1\x17\x4b\x98\x60\xeb\xc5\x62\xb3"
- "\x9d\xf7\x62\xb1\x0a\xf7\xff\x8d\xdd\xef\x9c\x17\x5b\xe2\x23\xee"
- "\xc5\x62\xd6\x49\x7b\x31\xf2\x99\xad\x86\x8e\x3b\xc0\x69\xe8\xb8"
- "\xd5\xdd\xdf\x8b\xc5\xf9\x89\xeb\xe5\xb8\x61\xc4\x8b\x2d\x51\x75"
- "\xbc\x17\x5b\xa2\x12\xf7\x62\x71\x3b\x89\x6e\x5d\xe2\x6b\xeb\xc5"
- "\xe0\x1a\x51\x2f\x16\x77\x8a\xbd\x46\x25\xf4\x62\xa4\x0c\xe0\xa1"
- "\x2b\xd2\x5e\x6c\x69\x06\xe1\xa5\xa5\x61\x84\x97\x48\x4c\x6d\xbd"
- "\xd8\xd2\x91\x8e\xbd\x18\xc1\x10\x53\x4f\x49\x2f\xb6\x74\x95\xad"
- "\x17\x8b\x49\x11\xf7\x62\xcb\x78\xeb\x34\xe2\xaf\x09\xbd\xd8\xd2"
- "\xe3\xb7\x86\x17\x93\xc4\x96\x9f\xd0\x8b\xc5\xe7\xca\xf7\x62\xf1"
- "\x65\xf2\xbc\x18\xc6\x9c\x98\x17\x5b\xe6\x63\x8d\x39\xa1\x17\x5b"
- "\xf6\xa4\xb8\x17\x5b\x36\x41\xe8\xc5\x70\xf9\x62\x5e\x6c\xd9\x52"
- "\x41\xf9\x36\x5e\x6c\x59\xb6\xd0\x8b\x91\xf3\x38\x2f\x96\x30\x82"
- "\x1d\xef\x86\xc8\xf7\x62\x09\x3e\xd2\x5e\x2c\xe1\x7e\xa1\x17\x5b"
- "\xa6\x27\x9e\x2b\x21\x90\x78\xb1\x04\x0f\x72\x3c\x46\xc3\x3f\xce"
- "\x79\x31\x72\x9c\xf3\x62\x09\x21\xb7\xd7\xcd\xde\x4a\x5e\x6c\x45"
- "\x4f\x65\x5e\x0c\x48\xeb\xb6\xe6\xef\x04\xcd\x9f\x30\x9f\x68\xae"
- "\x95\x3b\x95\x69\xfe\x95\x85\xca\x35\xff\xda\x2c\x4e\xf3\xaf\xcd"
- "\x92\xd6\xfc\x89\x4b\xed\x6b\xfe\x94\x5a\x4e\xf3\x27\x8f\x26\x63"
- "\x6b\xf2\xfd\x64\x6c\x4d\x3a\x23\x5f\xf3\x27\x4d\x13\x6a\xfe\xc4"
- "\xe3\xb7\x35\x7f\x67\x69\xfe\x15\xc1\x04\x7f\x49\x0f\x29\xd3\xfc"
- "\x49\x6a\xa1\xe6\x5f\x37\xd6\x56\xf3\x27\xd9\xbc\xff\x43\x5a\xf3"
- "\x27\xed\x51\xa6\xf9\x93\x76\x3b\xa7\xf9\x93\x7b\x8a\x6b\xfe\xc4"
- "\x04\x69\xcd\x4f\x3e\xb3\xd5\x6a\x29\x7b\x38\xad\x96\xb2\xb4\xfb"
- "\x6b\xfe\x14\x5f\x71\x5d\x96\xf2\x10\xd1\xfc\xc9\x9e\x1d\xaf\xf9"
- "\x93\x3d\xc5\x35\x7f\x4a\x2e\xd1\x47\xc9\x5e\xb6\x9a\x1f\xae\x11"
- "\xd5\xfc\x29\x65\xec\x35\x9e\x42\xcd\x4f\xca\x00\x1e\x3a\x2f\xad"
- "\xf9\x57\xaf\x26\xbc\xb4\x9a\x7d\x57\x18\x89\xa9\xad\xe6\x5f\x3d"
- "\xc4\xb1\xe6\x27\x18\x62\xea\x29\xa9\xf9\x57\x2f\xb6\xd5\xfc\x89"
- "\x71\xe2\x9a\x7f\xed\x04\x0e\x47\x6b\x2e\x0a\x35\xff\xea\x43\xb7"
- "\x86\xe6\x97\xc4\x96\xaf\x50\xf3\xaf\x49\x95\xaf\xf9\xd7\x1c\x96"
- "\xa7\xf9\x31\xe6\xc4\x34\xff\xda\x9e\xd6\x98\x13\x6a\xfe\xb5\x83"
- "\xc5\x35\xff\xda\xb1\x42\xcd\x8f\xcb\x17\xd3\xfc\x6b\xe7\x0a\xca"
- "\xb7\xd1\xfc\x6b\xd7\x0b\x35\x3f\x39\x8f\xd3\xfc\xeb\x34\xec\x78"
- "\x77\xbf\x7c\xcd\xbf\xae\xa7\xb4\xe6\x5f\xd7\x57\xa8\xf9\xd7\xb2"
- "\x6b\x67\xd7\x8d\x21\x9a\x7f\xad\x81\x1c\x4f\x1c\xc8\x3f\xce\x69"
- "\x7e\x72\x9c\xd3\xfc\xeb\x82\x6e\xaf\xa9\xbd\x95\x34\xff\x7a\x93"
- "\x32\xcd\xbf\xde\xa8\x5c\x5b\x66\xf0\xd6\xbd\x64\xd8\x59\xf7\xb2"
- "\xe1\xa4\x7d\x6d\xf9\x3a\x6f\xdd\x4b\x2a\xbb\xee\x25\x95\x5d\xf7"
- "\x92\x3a\x5a\xbe\xb6\xdc\xf8\xa1\x50\x5b\xfe\xed\xa1\xdb\xda\xb2"
- "\xb3\xb4\xe5\xba\x08\xa2\x2d\x37\xae\x52\xa6\x2d\x37\x5a\xad\x7f"
- "\xc9\x14\x59\xff\xb2\x51\xc6\xfa\x97\x54\x85\xeb\x5f\x52\x9d\x5c"
- "\xff\x92\x2a\xb1\xfe\x65\x43\x8d\xb4\xb6\x24\x9f\xd9\x6a\x82\xd7"
- "\x79\xeb\x5f\xd2\x6e\x81\xf5\x2f\x69\x12\x6b\x14\xd2\xd8\xf5\x2f"
- "\xa9\x9d\xb0\xfe\x25\x55\x62\xfd\x4b\x1a\xbb\xfe\x25\x55\x64\xfd"
- "\x4b\xaa\xc4\xfa\x97\xd7\xd9\xf5\x2f\xa9\x56\xeb\x5f\x52\xd9\xf5"
- "\x2f\xaf\xdb\x59\xff\xf2\x3a\xbb\xfe\xe5\x75\x76\xfd\x0b\x89\xa9"
- "\xad\xb6\x7c\xdd\x89\xf5\x2f\xa9\xec\xfa\x97\x54\x3b\xeb\x5f\x5e"
- "\x17\x59\xff\xb2\xa1\x5a\x5c\x5b\x66\xf0\xd6\xbf\x64\x58\xad\x7f"
- "\x49\xbf\x45\xd6\xbf\x48\x62\xcb\x6a\xfd\x4b\xba\x82\xf5\x2f\x19"
- "\x32\xd7\xbf\xa4\x4a\xac\x7f\xc9\x88\xb2\xc6\x9c\x50\x5b\x66\x48"
- "\xac\x7f\xc9\xb0\x5a\xff\x92\x2a\xb1\xfe\x25\xe3\xb8\xa0\x7c\x1b"
- "\x6d\x99\x61\xb5\xfe\x25\xd5\x6a\xfd\x4b\x26\xbb\xfe\x65\xc3\x72"
- "\xf9\xda\x32\xd3\xce\xfa\x97\x4c\xab\xf5\x2f\x99\xec\xfa\x97\x4c"
- "\x76\xfd\x4b\x26\xbb\xfe\x65\x43\x02\xff\x38\xa7\x2d\xc9\x71\x4e"
- "\x5b\x66\x3a\x5c\xff\x62\x5f\x77\x6c\x49\xe0\x74\xc7\x96\x04\x69"
- "\xdd\xb1\x69\x82\x7d\xdd\xb1\x59\xcb\xe9\x8e\x37\x1e\x22\xfd\xfb"
- "\x8d\x1e\xa4\x7f\x67\x33\xcf\x61\x56\x55\x80\xee\x18\x94\x16\xb1"
- "\xef\xe7\x12\x46\x77\x7c\xb0\xd0\x40\x81\x46\xf4\x30\x63\xdd\x01"
- "\x5a\x30\x3d\x1e\xeb\x8e\x7a\x76\xbd\x6d\xf6\xd8\x8a\x04\xbe\xee"
- "\xd8\x54\xc0\xac\xbd\x6d\x7f\xdf\x73\x3d\xc2\x9f\x8b\xad\xc5\x3d"
- "\xbc\x90\x5d\x8b\x0b\x65\xf3\xd7\xe0\x32\xeb\x72\x7f\x06\x5d\x32"
- "\x07\xe2\xc1\xd3\x25\xb7\xd7\xe2\xda\x5b\x8b\x9b\xad\x30\xff\x9d"
- "\xed\x29\xd4\x22\x6f\x0e\xb6\xd5\x22\xd9\x0b\x9c\xd7\x22\xd9\xd9"
- "\xca\xb4\x48\x76\x96\x73\x5a\x24\xfb\x8a\xb8\x16\xd9\x14\x84\x71"
- "\x2b\xae\x45\xc8\x67\xb6\x63\xc8\xe6\x6c\x6e\x0c\xd9\x1c\xd6\xfd"
- "\xb5\xc8\x66\x24\x3e\x5e\x6c\xee\x49\xb4\x48\xb6\xbe\xe3\xb5\x48"
- "\xb6\x5e\x5c\x8b\x6c\x5e\x45\x78\x3b\xbb\xd9\x56\x8b\xc0\x35\xa2"
- "\x5a\x64\xf3\x87\xec\x35\x7a\xa1\x16\x21\x65\x00\x37\x55\x48\x6b"
- "\x91\x9c\xb9\x84\xab\x72\x46\x13\xae\x22\x31\xb5\xd5\x22\x39\x7d"
- "\x1d\x6b\x11\x82\x21\xa6\x9e\x92\x5a\x24\x67\xba\xad\x16\xd9\x14"
- "\x28\xae\x45\xb6\x3c\xc9\xe1\x28\xf7\xa4\x50\x8b\xe4\xec\xbc\x35"
- "\xb4\x88\x24\xb6\x90\x50\x8b\xe4\x2e\x96\xaf\x45\x72\x8b\xe4\x69"
- "\x11\x8c\x39\x31\x2d\x92\x7b\xc5\x1a\x73\x42\x2d\xb2\xa5\x97\xb8"
- "\x16\xd9\x32\x58\xa8\x45\x70\xf9\x62\x5a\x64\xcb\x4b\x82\xf2\x6d"
- "\xb4\xc8\x96\x05\x42\x2d\x42\xce\xe3\xb4\xc8\x9b\xde\xac\x9f\xbb"
- "\x22\x5f\x8b\x6c\xb9\x22\xad\x45\xb6\xb4\x08\xb5\xc8\x96\x72\xa2"
- "\x39\xde\xf4\x23\x5a\x64\x8b\x8e\xd5\x28\x7a\xfe\x71\x4e\x8b\x90"
- "\xe3\x9c\x16\x79\x73\x84\x8c\x3c\xd7\x54\x39\x6b\x71\x8b\xaf\x0b"
- "\xf3\x5c\x96\x1c\x97\x71\xe8\xac\x80\xf6\x3c\x17\xff\x39\xa9\x48"
- "\x9e\x0b\x8f\xe9\x5c\x9e\xeb\x0c\xc3\x55\x5c\x9e\x4b\xc7\xe4\xb9"
- "\x70\x8e\x0b\x3f\x2b\xb5\xe4\xb8\xcc\xcb\x6c\xd7\xe1\x16\x9b\xe5"
- "\xe7\xb8\xb8\xe7\xa5\x75\x31\x24\xc7\x55\xdb\x9e\xe3\xc2\xe3\xb9"
- "\xe9\x86\x6d\x8e\x0b\x8f\xe3\x5c\x8e\xeb\xdb\x0e\xce\x71\xe5\x9d"
- "\x55\x36\xae\xe7\xe9\xba\xc7\x73\xed\x5f\xdb\x3a\xdc\x37\x03\x49"
- "\xee\x67\xdb\x72\x65\xcf\xb5\xb7\x25\x74\x8f\xb8\xfc\xda\xe6\x7e"
- "\x6f\xd5\x90\xb8\xe4\xf7\x55\x16\x97\x7c\xef\xee\x11\x97\x5f\xdb"
- "\x3c\x90\x6d\x5a\x12\x97\x82\x3d\xca\xe2\x52\xe0\xc2\xfe\x97\x45"
- "\x9f\x72\x9e\xb9\xe8\x53\xbe\x67\x2e\x0d\xe0\x7b\xe6\xed\x0e\xf6"
- "\xbf\x7c\xc7\x83\xf3\xcc\x3b\xa3\x88\x0e\xdd\x39\x81\xe8\xd0\x9d"
- "\xcc\xf3\xa9\x55\xe3\x10\xe3\x95\x8d\xd8\x37\xcf\x33\x50\xfb\x2e"
- "\x69\x29\xe3\x1a\xe2\x97\xab\x8c\xe5\xa8\x42\x6f\x40\xaf\xc7\x23"
- "\x8f\xd4\x9f\x91\xc7\x7b\x4d\x06\xaa\xcf\x7c\xe4\x09\x63\x12\xb4"
- "\x59\x39\xe8\x98\x02\x14\x93\x84\xbd\x74\xe1\xea\xaa\x18\x3d\xcf"
- "\x4b\x6f\x3f\xcf\xf9\x68\x38\x2f\xc6\x80\x3e\x9b\xa7\xa5\xb0\x5f"
- "\x6e\xcb\x4d\x0e\x6e\x1b\x36\xcb\x9f\xd9\xc7\x8a\x9f\xcf\x87\xef"
- "\x56\x87\x0b\xf3\xf9\xad\xb9\xc9\x53\x5b\x8a\x67\x05\x30\x7b\x68"
- "\x0e\xe6\x72\xfa\x72\xf6\xcf\x7c\xab\x15\xa9\x2c\xf9\xfc\xb7\x7e"
- "\x75\xf9\xfc\xfc\x10\x82\xd1\xc2\x89\xca\xf2\xf9\x85\x41\x42\x0f"
- "\xfd\xee\x5c\x5b\x0f\x5d\xf8\xa1\xf3\x1e\xba\xf0\x94\x32\x0f\x5d"
- "\x58\xe3\x9c\x87\xde\x39\xd2\xda\x43\xef\x4e\xc2\x1e\x7a\x7b\x0a"
- "\xc6\xb1\xb8\x87\x26\x9f\xd9\x7a\x9f\xb7\x4f\x71\xde\xe7\xed\x9d"
- "\xdd\xdf\x43\xbf\x1d\x20\xee\x73\xde\x9e\x48\x3c\xf4\xce\x11\x1d"
- "\xef\xa1\x77\x8e\x10\xf7\xd0\x6f\x1f\x25\x7e\x63\xe7\x08\x8b\x1f"
- "\xe6\x3c\x34\x5c\x23\xea\xa1\xdf\xbe\x66\x7d\x0d\xf1\xd0\x3b\x47"
- "\x11\x0f\xfd\x4e\x5f\x69\x0f\xfd\x4e\x31\xe1\xae\x77\x56\x11\xee"
- "\x22\x31\xb5\xf5\xd0\xef\x4c\x73\xec\xa1\x09\x86\x98\x7a\x4a\x7a"
- "\xe8\x77\x0a\x6c\x3d\xf4\x76\x89\xfd\x33\x8b\x96\x72\x38\x2a\xf2"
- "\x11\x7a\xe8\x77\xce\xdf\x1a\x1e\x5a\x12\x5b\x01\x42\x0f\xbd\xeb"
- "\x80\x7c\x0f\xbd\xeb\xa2\x3c\x0f\x8d\x31\x27\xe6\xa1\x8b\x46\xb2"
- "\xf8\x19\x25\xee\xa1\x8b\x5e\x12\xf7\xd0\x45\x73\x85\x1e\x1a\x97"
- "\x2f\xe6\xa1\x8b\x72\x05\xe5\xdb\x78\xe8\xa2\x0f\x85\x1e\x9a\x9c"
- "\xc7\x79\xe8\x77\x59\xcf\xba\x5d\xc1\xfe\x99\xef\x8e\x94\xf6\xd0"
- "\xef\x8e\x15\x7a\xe8\x77\xbd\x89\x57\x7e\x37\x9a\x78\xe8\x77\xfd"
- "\xc8\xf1\xed\x7e\xfc\xe3\x9c\x87\xde\x6e\xb5\x7f\xe6\xbb\x09\x32"
- "\x3c\x74\x48\x07\x79\xe8\xc0\x5b\xcb\x43\x7f\x3f\xbc\x7b\x78\xe8"
- "\xdd\x83\x95\x79\xe8\xdd\x7e\x4e\x7a\x82\xa9\x0e\x3c\x41\xc0\x6d"
- "\x4f\xc0\xd7\x5b\xef\xa6\x13\xbd\xb5\xe7\xb0\x32\x4f\xb0\xe7\xd3"
- "\xee\x10\x97\x5f\x57\x4c\x76\xb3\xf3\xf5\xdf\x7f\x49\x59\x4c\xde"
- "\x0f\xbe\xed\x9f\x3b\x23\x2e\xef\x79\x90\xb8\xec\xbd\xa8\x2c\x2e"
- "\x7b\x1b\x94\xfb\xe7\x03\x6a\xce\x3f\x1f\x50\xf3\xfd\xf3\xbf\x05"
- "\xcf\x9c\x8b\x0f\xdb\xf7\xcf\x1f\x45\x73\xfe\xb9\xa4\x8c\x68\xd0"
- "\x12\x76\x4e\x49\x09\x93\x53\x4f\x3c\x40\xfc\xf3\x75\xec\x9f\x2f"
- "\x80\x7f\x7e\x35\x82\x32\xb2\xef\x8e\xc0\xf3\xd7\x2a\xc0\x03\x63"
- "\xcf\x5c\x95\x00\x7f\xc7\xe9\xd1\xeb\xb1\xc8\x23\x0d\xbc\xef\x1e"
- "\x18\x2b\xf7\xc4\xeb\xa9\x8d\xf3\x60\x9c\xa9\x2d\x46\x7d\xa2\xc1"
- "\x57\x37\x61\x5f\x7d\x0c\x3c\xf3\x7a\xd6\x57\x7f\x70\xbe\x2a\x8e"
- "\xef\xab\xf7\x8d\x65\x7c\xb5\x9e\xcc\x8d\xab\x8a\x03\x5f\x0d\xdf"
- "\x87\xdf\x45\xc1\xf7\xd5\x2d\xe0\x9b\x5b\xc1\x37\x67\x5d\xb2\xf2"
- "\xd8\xaf\xda\x7a\xec\x16\x9f\xe4\x10\xc3\xb0\x59\x81\xd8\x63\x5f"
- "\x2f\xba\xed\xb1\x6d\x3d\xf6\xfb\x79\x04\xc7\x1f\x7c\xa8\xcc\x63"
- "\x7f\x50\x22\xf4\xd8\x07\x2a\x6c\x3d\x76\x89\x8f\xf3\x1e\xbb\x64"
- "\xb4\x32\x8f\x5d\x32\xca\x39\x8f\x5d\xb2\xd5\xda\x63\xbf\xcb\x3c"
- "\xa7\x2e\xd6\x62\xac\x8b\x7b\x6c\xf2\x99\xad\x37\xfa\x68\x34\xe7"
- "\x8d\x3e\xea\xd1\xfd\x3d\xf6\x87\xbb\xc5\x7d\xd0\x87\x1f\x12\x8f"
- "\x5d\x92\xd7\xf1\x1e\xbb\x24\x4f\xdc\x63\x7f\xc4\xce\x7f\x2b\xc9"
- "\xb3\xf5\xd8\x70\x8d\xa8\xc7\xfe\x68\xba\xf5\x35\xc4\x63\x97\xe4"
- "\x13\x8f\xfd\xd1\x52\x69\x8f\xfd\x71\x5f\xc2\x6f\x1f\x9d\x25\xfc"
- "\x46\x62\x6a\xeb\xb1\x3f\x3a\xe4\xd8\x63\x13\x0c\x31\xf5\x94\xf4"
- "\xd8\x1f\xbb\xd9\x7a\xec\xe2\x4f\xc5\x3d\xf6\xfe\xd3\x1c\x8e\xf6"
- "\x2f\x17\x7a\xec\x8f\x27\xdc\x1a\x1e\x5b\x12\x5b\xbb\x85\x1e\x7b"
- "\xff\xbd\xf2\x3d\xf6\xfe\x89\xf2\x3c\x36\xc6\x9c\x98\xc7\xde\xbf"
- "\x95\xc5\x4f\xbe\xb8\xc7\xde\x7f\x40\xdc\x63\xef\xaf\x10\x7a\x6c"
- "\x5c\xbe\x98\xc7\xde\xdf\x22\x28\xdf\xc6\x63\x1f\xf0\x11\x7a\x6c"
- "\x72\x1e\xe7\xb1\x0f\x1c\x24\x1c\x5a\x1c\x25\xdf\x63\x1f\xd8\x2a"
- "\xed\xb1\x0f\xec\x14\x7a\xec\x03\x71\xc4\x4b\x1f\x28\x27\x1e\xfb"
- "\xc0\x46\x72\xbc\x38\x92\x7f\x9c\xf3\xd8\xe4\x38\xe7\xb1\x0f\xd4"
- "\xc9\x7b\x4e\xed\xd2\x7e\x58\x01\x5d\xbf\x1e\xa3\xa3\xf6\xc3\xb2"
- "\x3c\xab\xbe\xd9\xeb\x31\xfe\x99\xa1\xcc\x67\xff\x33\xfd\xb6\x9f"
- "\xeb\x68\xdf\x70\x40\x4f\xf4\xd6\x21\x85\xfb\xdf\x1e\x52\xdf\xf6"
- "\x73\x9d\x11\x97\x7f\xd6\x90\xb8\xfc\xeb\x90\xb2\xb8\xfc\xeb\xa0"
- "\x72\x3f\xf7\x79\x39\xe7\xe7\x3e\x2f\x97\x7e\x1e\xfa\x49\x86\x7d"
- "\x3f\xa7\x55\x71\x7e\xee\xc8\x52\xa2\x77\x8e\x4c\x27\x7a\xe7\xc8"
- "\xbd\x1d\xf7\x3c\xf4\x70\xb6\xf0\x79\xe8\x27\xd7\x6e\x3f\x0f\xed"
- "\x0a\xaf\x76\x28\x9a\x60\xf4\x70\x98\x32\xaf\x76\x38\x54\xe8\xd5"
- "\xbe\x58\x6e\xeb\xd5\x0e\x1f\x75\xde\xab\x1d\x3e\xaf\xcc\xab\x1d"
- "\xae\x77\xce\xab\x1d\x19\x2f\xfe\x3c\xf4\x93\x2c\xe9\xe7\xa1\xe4"
- "\x33\x5b\x8d\xfd\xd9\x79\x4e\x63\x7f\xf6\x61\xf7\xf7\x6a\x9f\x4d"
- "\x15\xd7\xd3\x9f\x85\x11\xaf\x76\x24\xa0\xe3\xbd\xda\x91\x00\x71"
- "\xaf\xf6\xd9\x49\xa2\x6b\x8f\x04\xd8\x7a\x35\xb8\x46\xd4\xab\x31"
- "\x1a\x4e\x70\x0d\xf1\x6a\x47\x02\x89\x57\xd3\x3e\x24\xed\xd5\xb4"
- "\x87\x09\x77\x69\x33\x08\x77\x91\x98\xda\x7a\x35\x6d\x94\x63\xaf"
- "\x46\x30\xc4\xd4\x53\xd2\xab\x69\x8b\x6d\xbd\xda\x27\xe9\xe2\x5e"
- "\xed\xf3\xf5\x1c\x8e\x3e\x1f\x2c\xf4\x6a\xda\x6b\xb7\x86\x57\x93"
- "\xc4\xd6\x54\xa1\x57\x3b\x7a\x5c\xbe\x57\x3b\xda\x22\xcf\xab\x61"
- "\xcc\x89\x79\xb5\xcf\xc7\xb3\xf8\x09\x14\xf7\x6a\x9f\xcf\x16\xf7"
- "\x6a\x9f\x2f\x17\x7a\x35\x5c\xbe\x98\x57\xfb\xbc\x48\x50\xbe\x8d"
- "\x57\xfb\xfc\xa8\xd0\xab\x91\xf3\x38\xaf\xf6\x45\x24\x3b\xf6\x8d"
- "\x94\xef\xd5\xbe\x18\x2f\xed\xd5\xbe\x98\x28\xf4\x6a\x5f\xa8\x89"
- "\x27\xfb\x22\x81\x78\xb5\x2f\x46\x90\xe3\x9f\x8c\xe0\x1f\xe7\xbc"
- "\x1a\x39\xce\x79\xb5\x2f\x36\xca\xf3\x6a\xce\xef\x97\x75\xf3\xe7"
- "\x14\x7b\xff\xca\xe6\x14\x1f\x1f\xa9\xcc\xa7\x1d\x1f\x71\xdb\x13"
- "\x74\x86\x27\xf8\x22\x9f\xe8\xad\x7f\x57\x28\xf3\x04\xff\x2e\x57"
- "\xee\x09\x2a\x75\x9c\x27\xa8\xd4\x49\x7b\x82\xff\xec\xb4\xef\x09"
- "\xca\x35\x9c\x27\x38\x91\x4a\xc6\xd5\x13\x0b\xc8\xb8\x7a\x62\x58"
- "\xc7\x79\x82\xb2\x22\xa1\x27\x28\xed\x79\xdb\x13\x74\x85\x27\x38"
- "\x9e\x48\x30\x5a\xb6\x58\x99\x27\x28\x8b\x11\x7a\x82\xaa\x0c\x5b"
- "\x4f\x50\x76\xca\x79\x4f\x50\xd6\xa2\xcc\x13\x94\x19\x9c\xf3\x04"
- "\x27\xa6\x8b\x7b\x82\xff\xec\x92\xf6\x04\xe4\x33\x5b\x2d\xf7\x65"
- "\x0b\xa7\xe5\xbe\x3c\xde\xfd\x3d\xc1\x97\xd1\xe2\xba\xed\xcb\xc5"
- "\xc4\x13\x9c\x08\xe9\x78\x4f\x70\x22\x44\xdc\x13\x7c\x79\x9e\xe8"
- "\xa7\x13\x21\xb6\x9e\x00\xae\x11\xf5\x04\xe5\xf7\x5a\x5f\x43\x3c"
- "\xc1\x89\x50\xe2\x09\xca\x47\x4a\x7b\x82\xf2\x93\x84\xbb\xca\x77"
- "\x12\xee\x22\x31\xb5\xf5\x04\xe5\xcb\x1d\x7b\x02\x82\x21\xa6\x9e"
- "\x92\x9e\xa0\xfc\xa8\xad\x27\xf8\x4f\xa1\xb8\x27\xa8\xdc\xca\xe1"
- "\xa8\x72\xb4\xd0\x13\x54\xf4\xbc\x35\x3c\x81\x24\xb6\xa2\x85\x9e"
- "\xa0\xe2\xb4\x7c\x4f\x50\xd9\x4b\x9e\x27\xc0\x98\x13\xf3\x04\x95"
- "\xec\xf3\x3f\x82\x17\x5b\x4f\x50\xb9\x54\xdc\x13\x54\x66\x08\x3d"
- "\x01\x2e\x5f\xcc\x13\x54\x1e\x12\x94\x6f\xe3\x09\x2a\x4f\x09\x3d"
- "\x01\x39\x8f\xf3\x04\x55\x09\x84\x43\xff\x33\x41\xbe\x27\xa8\x9a"
- "\x2e\xed\x09\xaa\x66\x0b\x3d\x41\x15\xab\xfd\xab\xd2\x89\x27\xa8"
- "\x0a\x24\xc7\xff\x13\xc8\x3f\xce\x79\x02\x72\x9c\xf3\x04\x55\xf9"
- "\xb7\xf7\xd3\xba\x95\xf6\xd3\x3a\x39\x51\x99\x2f\x38\x19\xa4\x5c"
- "\x7f\x9e\x1e\xc3\xe9\xcf\xd3\x63\xf8\xfa\x53\xb8\xaf\xc5\x57\x0f"
- "\xd9\xd7\x9f\x5f\xaf\xe3\xf4\x67\xcd\x79\xc2\xe1\x35\x65\x84\xc3"
- "\x6b\x98\xbd\xf9\xe4\xed\xa7\x55\xe3\x26\xdc\x4f\xeb\xab\xc5\xb7"
- "\xf7\xd3\xea\x2c\x6d\x59\x55\x42\xb4\xe5\x7f\x2b\x94\x69\xcb\xff"
- "\x96\x0b\xb5\xe5\xe9\x8b\xb6\xda\xb2\xe6\x49\xe7\xb5\x65\xcd\x34"
- "\x65\xda\xb2\x66\xaa\x73\xda\xb2\xe6\x80\xf8\x1e\x16\x5f\xf9\x49"
- "\xef\xa7\x45\x3e\xb3\xd5\x04\x5f\xf3\xf6\xd5\xff\xfa\xa1\xee\xaf"
- "\x2d\x4f\x1d\x13\x1f\xff\x4f\x55\x10\x6d\x59\xb3\xbf\xe3\xb5\x65"
- "\xcd\x7e\x71\x6d\xf9\xf5\x38\x32\x0e\xd7\x1c\xb4\xdd\xc3\x02\xae"
- "\x11\xd5\x96\x5f\xb3\xfb\xdf\xd7\xec\x17\x6a\x4b\x52\x06\xf0\x50"
- "\xb6\xb4\xb6\xfc\x66\x18\xe1\xa5\xaf\x4d\x84\x97\x48\x4c\x6d\xb5"
- "\xe5\xd7\xa7\x1c\x6b\x4b\x82\x21\xa6\x9e\x92\xda\xf2\x9b\xfb\x6d"
- "\xb5\xe5\x57\x6a\x71\x6d\x59\x7b\x8d\xc3\x51\x6d\xae\x50\x5b\x7e"
- "\x13\x75\x6b\x68\x4b\x49\x6c\x1d\x13\x6a\xcb\xda\x91\xf2\xb5\x65"
- "\xed\x5c\x79\xda\x12\x63\x4e\x4c\x5b\xd6\x1e\xb0\xc6\x9c\x50\x5b"
- "\xd6\x9e\x14\xd7\x96\xb5\x17\x85\xda\x12\x97\x2f\xa6\x2d\x4f\xfb"
- "\x08\xca\xb7\xd1\x96\xa7\x9f\x14\x6a\x4b\x72\x1e\xa7\x2d\x4f\xd7"
- "\x10\x0e\x3d\x59\x26\x5f\x5b\x9e\x3e\x20\xad\x2d\x4f\x1f\x16\x6a"
- "\xcb\xd3\x59\x44\x43\x9e\x6e\x20\xda\xf2\xf4\x2e\x72\xfc\x64\x29"
- "\xff\x38\xa7\x2d\xc9\x71\x4e\x5b\x9e\x36\xc8\x5b\x7f\xd3\x21\xf9"
- "\xe6\x2e\x5a\x7f\xd3\x51\xf9\xe6\xee\xb2\xfe\xe6\xbb\x22\x65\xba"
- "\xf2\xbb\x5d\xb7\xe7\x05\x75\x74\xae\xf9\x5b\x2f\xa2\xb5\xce\x8c"
- "\x56\x96\x6b\x3e\x33\x4a\xb9\xd6\x3f\x1f\xcd\x69\xfd\xf3\xd1\xd2"
- "\xeb\x09\xbe\xef\x65\x5f\xeb\x9f\x2b\xe1\xb4\xfe\x59\x76\xbe\xad"
- "\xee\x1a\x19\x53\x75\x07\x94\xac\x27\x48\x6b\x42\x1e\xaf\x5b\xaf"
- "\x27\xa8\x39\x4c\xd6\x13\xc4\x5a\xaf\x27\xd0\x0d\x13\xae\x27\xf8"
- "\x3e\x43\x6a\x3d\x01\xce\x3d\xb7\x15\xcf\x0a\xc0\x6b\x09\x44\xd7"
- "\x11\xcc\xe8\xf8\x75\x04\xd8\x27\xbc\x05\xb8\xc5\x5e\x01\xf3\xcd"
- "\xaf\xcb\x2b\x7c\xd7\x48\xf0\xfb\x43\x8b\x32\xaf\xf0\x83\x41\xe8"
- "\x15\x2e\xf8\xd8\x7a\x05\x5d\x98\xf3\x5e\x41\xb7\x5a\x99\x57\xd0"
- "\xa5\x38\xe7\x15\x74\x67\xc5\xd7\x11\x7c\xef\x2d\xbd\x8e\x80\x7c"
- "\x66\xab\xf1\xce\xad\xe6\x34\xde\xb9\x89\xdd\xdf\x2b\x9c\xd5\x8b"
- "\xeb\xb9\xb3\x2d\xc4\x2b\xe8\x74\x1d\xef\x15\x74\x3a\x71\xaf\x70"
- "\x6e\x01\xd1\x55\x3a\x9d\x6d\x1e\x1a\xae\x11\xf5\x0a\xe7\x76\x5a"
- "\x5f\x43\xbc\x82\xae\x9e\x78\x85\x73\x87\xa5\xbd\xc2\xff\xa6\x13"
- "\x5e\xfb\x1f\xfb\x8e\x49\x12\x53\x5b\xaf\xf0\x3f\x37\xc7\x5e\x81"
- "\x60\x88\xa9\xa7\xa4\x57\xf8\xdf\x04\x5b\xaf\xf0\xbd\x97\xb8\x57"
- "\x38\xff\x10\x87\xa3\xfa\xa3\x42\xaf\xf0\xbf\xec\x5b\xc3\x2b\x48"
- "\x62\x4b\x2f\xf4\x0a\xf5\xb3\xe5\x7b\x85\xfa\x5c\x79\x5e\x01\x63"
- "\x4e\xcc\x2b\xd4\x9f\x65\xf1\x53\x2f\xee\x15\xea\x4d\xe2\x5e\xe1"
- "\xbc\x8f\xd0\x2b\xe0\xf2\xc5\xbc\xc2\xf9\x71\x82\xf2\x6d\xbc\xc2"
- "\xf9\x30\xa1\x57\x20\xe7\x71\x5e\xe1\x02\x22\x1c\x7a\xe6\x80\x7c"
- "\xaf\x70\xfe\xac\xb4\x57\x38\x7f\x51\xe8\x15\xce\x7f\x4a\x3c\xc1"
- "\x05\x15\xf1\x0a\xe7\xab\xc9\xf1\x33\xfb\xf9\xc7\x39\xaf\x40\x8e"
- "\x73\x5e\xe1\x82\x9f\xbc\xb9\x29\xce\xe7\xa1\x6f\xfe\xdc\x14\xcf"
- "\x5f\xd9\xdc\x94\x1f\x4f\x2a\xf3\x0a\x3f\x56\x2b\xd7\xa5\xbf\xd4"
- "\x71\xba\xf4\x97\x3a\xe9\x39\x10\x0d\x45\xf6\x75\xe9\x65\x3f\x4e"
- "\x97\xfe\xb4\x9e\xf0\xf7\x4f\x73\x09\x7f\xff\x34\xc4\xd9\x39\x10"
- "\x69\xd7\x59\x2d\x6a\x99\x03\x11\xcf\xce\x81\x00\x3d\x4a\xf4\xe7"
- "\xa5\x9d\xc2\x39\x10\x17\x7b\x49\xcd\x81\x10\x9d\xfb\x60\xa5\x39"
- "\x2d\xfa\xd4\x95\xb9\x0f\xbf\x6e\xcd\x79\x61\x14\xd1\x9c\x97\x16"
- "\x28\xd3\x9c\x97\xe6\x0b\x35\xa7\x3e\xd5\x56\x73\x5e\x3a\xe9\xbc"
- "\xe6\xbc\x74\x4d\x99\xe6\xbc\xd4\xec\x9c\xe6\xfc\x69\x9a\xf8\xdc"
- "\x87\x86\xdd\xd2\x73\x1f\xc8\x67\xb6\x5a\xa1\x91\x97\x57\x6c\x3c"
- "\xda\xfd\x35\x67\x63\xa4\xb8\x2e\x68\x5c\x40\x34\xe7\x4f\x53\x3b"
- "\x5e\x73\xfe\x34\x55\x5c\x73\x36\xb2\xe3\xff\x4f\x53\x6d\x35\x27"
- "\x5c\x23\xaa\x39\x2f\xfb\x58\x5f\x43\x34\xe7\x4f\x21\x44\x73\x5e"
- "\x7e\x52\x5a\x73\x5e\xae\x20\x9c\x75\xb9\x80\x70\x16\x89\xa9\xad"
- "\xe6\xbc\xbc\xd4\xb1\xe6\x24\x18\x62\xea\x29\xa9\x39\x2f\x1f\xb6"
- "\xd5\x9c\x0d\xbb\xc4\x35\xe7\x2f\xb9\x1c\x8e\x7e\x19\x29\xd4\x9c"
- "\x3f\xf7\xb8\x35\x34\xa7\x24\xb6\x22\x85\x9a\xf3\xe7\x53\xf2\x35"
- "\xe7\x2f\x3d\xe5\x69\x4e\x8c\x39\x31\xcd\xf9\xcb\x34\x16\x3f\x21"
- "\xe2\x9a\xf3\x97\xc5\xe2\x9a\xf3\x97\x54\xa1\xe6\xc4\xe5\x8b\x69"
- "\xce\x5f\x0e\x08\xca\xb7\xd1\x9c\xbf\x9c\x14\x6a\x4e\x72\x1e\xa7"
- "\x39\xf5\x71\x84\x43\x1b\x26\xca\xd7\x9c\xfa\x69\xd2\x9a\x53\x1f"
- "\x26\xd4\x9c\xfa\xe1\x44\x5b\xea\x37\x12\xcd\xa9\x0f\x20\xc7\x1b"
- "\x82\xf8\xc7\x39\xcd\x49\x8e\x73\x9a\x53\x9f\x67\x4f\x73\xd2\x39"
- "\x7e\x9a\x2c\xca\x5c\x02\x3f\x07\xa1\x9e\xf7\xc2\xf8\xa6\x85\xbf"
- "\x4b\x61\x9c\xea\x0b\x7f\x4b\x6a\x19\xbd\x8f\x9f\xc6\x0c\xba\xc4"
- "\x0c\xdf\x53\xa5\xff\x45\xab\x1d\x60\x84\xef\xbe\xe2\x4b\xc6\x17"
- "\x3f\x4d\x1f\xe3\x9d\x81\x66\x3a\x1a\xd1\x2a\xf8\x3b\x01\x8e\xc1"
- "\xf9\xbd\x61\x3c\x54\xc7\xa3\xde\x3f\x53\x57\x46\x59\xce\x83\x3a"
- "\xf7\x3e\x47\xe9\xaf\xe1\x32\x6e\xa4\x5d\x09\x80\xfb\xd9\x25\x59"
- "\x57\x28\x6b\xf2\x9e\x07\xd0\x2a\x23\xfd\xa3\x76\x61\x13\xaa\xa7"
- "\xae\x64\xf4\x69\xbc\x33\x10\x78\x08\x61\x8d\x58\x32\x40\xef\x81"
- "\xcb\xd4\x2e\x6c\xc5\x9f\xc5\xe0\xcf\x4c\x50\xc7\xa4\x05\x88\xca"
- "\x6c\xba\xd3\x13\x34\x57\x8f\xe4\x66\xba\x61\x91\x11\xea\x0c\xe3"
- "\xeb\x67\x0f\xd4\x7a\x7c\xb0\xad\x96\x19\x7b\x2a\x9b\x4d\x4c\x19"
- "\xea\x85\xb8\x3e\x57\xb2\xb7\xc3\xf9\x62\x75\x58\xbf\x0f\x0d\xed"
- "\x31\x84\xd6\xc9\x1b\xef\xae\xd4\x4b\xb5\x63\x9f\xd5\x0f\x20\xed"
- "\xa3\xd0\x76\x6a\x44\x89\x7d\x2e\xef\x7b\x9a\xec\xcd\x7f\xf0\xdc"
- "\xdc\x9f\x6e\x4e\xde\x8a\xa8\x4d\xe6\x3b\x3d\xbf\x00\x4e\xdc\xb1"
- "\x85\xd6\xdf\x48\x6b\x3a\xa8\x73\xfb\xa1\x01\xb7\xf9\x5a\xf8\x7c"
- "\x53\x7f\x5a\x7f\x75\x0d\xc6\x4d\x53\xf5\x51\x18\xdb\xad\x63\x11"
- "\x1b\xb9\x60\xb6\x3a\x6e\xee\x82\xa8\x45\x4b\xe3\xd4\x83\x23\xef"
- "\x42\x53\x17\x2d\x52\x2f\x98\xbd\x70\xb9\x9a\xff\xc9\xd3\xea\xc8"
- "\xb9\x4b\x66\xcf\x99\x1f\x35\x6c\xc1\x2b\x31\x77\x41\x9d\x10\xaf"
- "\x1e\x2a\x5c\x17\x73\x5a\x53\xdd\xf6\x37\x10\xda\xdc\x0f\x79\xe0"
- "\x7a\xdd\x48\xbb\xea\xaf\xf3\x18\x37\x15\x7f\x5f\xe6\x16\xba\x99"
- "\x82\x73\x92\x81\xd3\x36\x25\xdd\x89\xcf\x0d\xda\x01\xf5\xda\x0e"
- "\xf5\x86\x3a\x42\x9d\xaf\xce\xb7\xd4\xd9\x82\x89\x64\x8c\x89\xa4"
- "\x26\xc0\xe0\xd5\x8c\x3e\x86\x3b\x5f\xa0\xe9\x10\x7c\x7f\xcd\xd0"
- "\x57\xdc\x2e\x50\xcd\x83\x19\xdf\x90\xeb\xa7\x81\x6b\x77\x5b\x30"
- "\x66\xce\x99\xaf\xa5\xb7\x3c\xac\x07\x5d\xe9\x76\x83\x8e\xfe\x03"
- "\x60\x13\x5f\x7f\xed\x09\x84\x52\xe8\x1b\x21\xcc\xbb\x31\xe8\x1b"
- "\x80\x61\x82\x53\xf8\xac\xb9\xf4\x2a\x85\xfe\x08\x65\x34\xea\x50"
- "\x76\x22\x2e\x43\x07\xc7\x70\x9b\x9b\x0b\xd3\x82\xa7\x69\x50\xca"
- "\x23\x29\x28\xe5\x06\xbe\x66\x57\x90\xa6\x4f\x1c\x72\x9b\x9c\x40"
- "\xff\x00\xbc\xe3\x46\x3f\x94\x16\x4c\x17\x05\x69\x74\xd4\xd5\x6a"
- "\x73\xee\x7c\x2d\xdc\x4f\xe3\x8d\xb4\xe6\x11\x3a\xb7\x7b\x99\xba"
- "\x6c\xda\xc2\xb4\x7d\x23\xbe\x77\x68\x1f\xf0\x3f\xb4\x96\x5e\xc3"
- "\xf6\xa1\xac\x80\x2c\x73\x56\xae\xae\xca\xe3\x3a\x9a\x6c\xa4\xdb"
- "\xe8\xec\x80\xac\xca\xe6\x66\xe0\xb4\x98\x57\xe8\xbb\x9a\x2e\xf7"
- "\x31\xce\x8d\xda\xd1\x0f\xfa\x62\x76\xae\x8e\xce\x0e\x4f\x99\x36"
- "\x04\x79\x43\xd9\x59\x96\xf6\x84\xb6\xf4\x90\x87\xa3\xe6\x1c\x7c"
- "\x4f\x18\x0f\x50\x1f\x16\x0f\xcd\xba\xa3\x71\xb6\x78\x68\xef\x9b"
- "\x5b\x42\x87\x1b\xe9\x90\x17\xda\x72\x42\xa3\x69\x55\xe8\xd4\xa4"
- "\xf3\xe8\x0e\xdc\xb6\x95\xe0\x05\x32\xe3\x91\x6f\x46\x38\x52\xcf"
- "\x5a\xee\x8d\xf4\xb9\xa1\xc1\x7d\x56\xa7\xb8\x41\x9b\x50\xc0\x2f"
- "\xc3\x81\x33\x87\xb7\xf5\x9f\xaf\x4d\x8c\x42\x54\xf1\xb9\x12\x0a"
- "\xeb\x67\x3c\x6f\xe5\x02\x75\x6d\xe7\x76\xb8\x8e\xfe\x25\x04\xe1"
- "\x78\x30\xb1\xf8\x25\x1a\x4d\x9c\x0b\xe3\xf3\x3c\xe6\xf3\x53\x05"
- "\x50\xa6\xbc\xfb\xba\xc6\xe8\x5f\x13\xc4\xea\x09\x88\x53\x55\xbd"
- "\x89\x29\x93\x89\xd5\x7c\x2e\x56\x87\xa1\x1e\x5c\xbc\xae\x85\xe2"
- "\xb8\x4a\xdc\x73\x09\x7b\xcf\x0d\x70\xcf\x35\x76\xee\xb9\x9a\xdc"
- "\x73\x8f\x26\xfb\xf7\x7c\x3d\xd7\xfe\x3d\x5f\x2f\x93\x7f\xcf\xd7"
- "\x23\xe4\xdf\xf3\xf5\x60\xe9\x7b\x0e\x63\xe3\x1c\x06\x71\x0e\xb3"
- "\x13\xe7\x30\x36\xce\x77\x9f\xb3\x7f\xcf\x37\x52\xed\xdf\xf3\x8d"
- "\xc3\xf2\xef\xf9\xc6\x54\xf9\xf7\x7c\x23\xc0\xce\x3d\xb3\x71\x0e"
- "\x83\x38\x87\xd9\x89\x73\x18\x1b\xe7\xbe\x5f\xd9\xbf\x67\xc3\x2a"
- "\xfb\xf7\x6c\xf8\x50\xfe\x3d\x1b\x02\xe5\xdf\xb3\x61\x94\xf4\x3d"
- "\x87\xb3\x71\x0e\x87\x38\x87\xdb\x89\x73\x38\x1b\xe7\xdf\xa7\xd9"
- "\xbf\xe7\x96\xc5\xf6\xef\xb9\xa5\x48\xfe\x3d\xb7\x8c\x91\x7f\xcf"
- "\x2d\x43\xed\xdc\x33\x1b\xe7\x70\x88\x73\xb8\x9d\x38\x87\xb3\x71"
- "\x9e\xf9\xac\xfd\x7b\x6e\x8d\xb2\x7f\xcf\xad\x5b\xe5\xdf\x73\xeb"
- "\x70\xf9\xf7\xdc\xaa\x96\xba\xe7\x56\xe0\x6d\x2f\xb8\x97\xb6\x6f"
- "\x42\x5e\x30\xa9\x42\x43\xbd\xea\x11\x95\xbf\xc6\x1c\xdd\xa7\x01"
- "\xf5\x84\x7b\x8b\xa6\xb7\x2c\xca\xc2\xbf\xcd\xaa\xd0\x90\x56\x55"
- "\x68\x74\x4b\xff\x87\xf5\x2b\xc3\xd0\x1d\x58\x8f\xa7\x9a\x91\xaf"
- "\x39\x27\x74\x6a\xfa\x14\xa4\x4e\xd6\x23\xef\xca\x24\x1d\x4a\x8a"
- "\xa1\xf5\x95\xe8\x2c\xea\xd5\x80\xbd\xe7\xb7\xa8\xbc\xb1\x14\x2d"
- "\x8c\xa5\xe9\x0b\x54\xdb\x79\x9c\x37\x01\x9d\x9c\x92\xf5\x35\x52"
- "\xc3\x77\x0c\xdf\x0e\x3f\xb8\x9c\x3e\x41\x30\x7e\x6e\x59\xf4\xc6"
- "\x8e\x24\xe4\x7b\x64\x5e\x03\xc2\xc7\x0b\xe0\xc7\xb4\x65\xbe\x36"
- "\x29\x0c\x51\xfb\x9a\x6a\x29\x32\x36\xb7\x7d\x68\x3d\x36\x07\xcd"
- "\x86\xb6\x9c\xc3\x7c\x66\xca\x9f\x22\xb7\x2d\xdb\x12\x2d\x63\x37"
- "\xd3\x96\x75\x26\x32\xde\x5b\x8d\xdd\x47\xe0\xfb\xb9\xb6\x6c\x9b"
- "\x8f\xdb\x92\xce\x09\x8d\xa9\x6a\x68\xc5\xbe\xc9\xfb\x42\x02\xa2"
- "\xe0\xf8\xc0\xca\x98\x26\x24\xd1\xc6\x25\xbc\x36\xae\xf3\xaa\xef"
- "\xd1\x24\xd1\xc6\xb5\xd0\xc6\x0d\x22\x6d\x5c\xe3\x5c\x1b\x9b\x26"
- "\xb8\xde\xc6\x26\x1f\xe9\x36\x36\xcd\x96\xdf\xc6\x46\x9d\xfc\x36"
- "\x36\x56\xb3\x6d\xac\x17\xb6\xb1\x31\x45\xba\x8d\xc3\x78\x38\x0e"
- "\x03\x1c\xdf\x7d\x4e\xbc\x8d\xc3\x00\xc7\x61\x22\x38\x0e\x73\x12"
- "\xc7\xe6\x62\xd7\xdb\xd8\xbc\x5c\xba\x8d\xcd\xc7\xe5\xb7\xb1\x39"
- "\x40\x7e\x1b\x9b\x47\x90\x36\x0e\xb3\xc2\xb1\xa9\xde\x4e\x1b\xf3"
- "\x70\x1c\x06\x38\xee\xfb\x95\x44\x1b\x03\x8e\xc3\x44\x70\x1c\xe6"
- "\x1c\x8e\xdd\x51\x5f\xd7\xdb\x98\x3e\x23\xd9\xc6\xee\x68\x88\xfc"
- "\x36\xa6\x77\xcb\x6f\x63\x3a\x8f\x6d\x63\x2b\x1c\xd3\x81\xd2\x6d"
- "\x1c\xce\xc3\x71\x38\xe0\xf8\xf7\x69\xe2\x6d\x1c\x0e\x38\x0e\x17"
- "\xc1\x71\xb8\x73\x38\x76\x77\x5b\xea\x72\x1b\xbb\xbb\x8d\x93\x6e"
- "\x63\xb7\x0c\xd9\x6d\xec\xee\xe6\x25\xbb\x8d\xdd\x91\x91\xb4\x71"
- "\xb8\x10\xc7\xee\x68\xaf\x9d\x36\xe6\xe1\x38\x1c\x70\x3c\xf3\x59"
- "\x89\x36\x06\x1c\x87\x8b\xe0\x38\xdc\x49\x1c\x53\xa7\x5d\x6f\x63"
- "\xaa\x48\xba\x8d\xa9\x2b\xf2\xdb\x98\x8a\x91\xdf\xc6\x54\x04\xdb"
- "\xc6\x42\x1c\xbb\x53\xde\x52\x6d\xdc\x06\x1e\xb0\x17\xb4\x71\xaf"
- "\x46\x44\x15\xe0\xb6\xad\x25\x6d\x6b\xea\xbf\x28\xab\x80\x32\x47"
- "\xe3\x36\x61\x72\x40\x3f\xf9\xf6\x36\xe5\x84\x86\xd2\x14\xdc\x53"
- "\x92\x27\xdc\x93\xfb\x74\xe3\x1a\xd4\x5b\x9d\xb4\x1a\xfe\xee\xc1"
- "\xcc\x8f\x55\x27\x6d\x38\x03\xdf\xe7\x8e\xf3\x5e\xc6\xdc\x41\xd5"
- "\x26\x9f\x88\xc2\x0b\xee\x1e\xd9\xf4\xe0\x49\xfe\xe0\xbd\x62\xe8"
- "\xbf\xfa\xaa\xaa\x1a\x4b\xa0\x7d\x4e\xa0\xca\xda\x7f\x21\x73\xff"
- "\x45\x6f\x3c\x61\x44\x1a\xfa\x27\x8d\xaa\x3c\x4e\x87\x4c\xaf\xf8"
- "\x7a\x55\x25\x94\xa2\xaa\x84\x8f\xd0\xe4\x06\xfa\x3a\xfd\x3f\x8d"
- "\x57\x9b\xcf\xd2\x5a\x93\xcf\xa2\x18\x53\x6e\x72\xb4\xd1\x67\x69"
- "\x69\x71\xbc\x8e\xf2\x32\x20\xcd\xfc\x7a\x9a\xce\x9c\x83\x3c\x32"
- "\xcf\x21\xcf\x4d\x73\x90\xd7\xa6\x73\xc8\xbb\xbc\xbe\x16\x55\x5c"
- "\x2a\x45\x15\x4d\xa7\x51\xc5\x75\xf8\x69\x85\x1f\x33\xfc\xa4\x9c"
- "\x86\x58\x23\x34\xf1\x32\xc2\xef\x15\xd5\x3f\x56\x87\x54\xe5\xc6"
- "\x5a\x84\xd7\xf4\xfe\xec\xee\x31\xcc\x2b\x02\xa9\xe8\xff\xf9\x22"
- "\xfa\x15\x5f\x0a\x3e\xf3\xc0\xc7\xab\x8c\x7a\x54\x5e\x6f\xc0\x9f"
- "\x7b\xc1\xe7\x1e\xc9\xf5\x50\xbe\xb9\x14\xbf\x37\x54\x5f\x9e\x52"
- "\x86\x8c\xd9\x5f\x69\x69\xec\xa1\xfb\x87\x0e\xcf\x82\xa6\x36\xd3"
- "\xbe\x83\x08\x0e\x7a\x8c\xdf\x6e\x96\x1b\x6b\x0f\xb2\xff\xcd\x5f"
- "\x7d\xfb\x41\x3b\x0f\x30\xff\x35\xc4\x7b\xd2\xe9\x1f\x68\x3c\xc7"
- "\x0f\xe7\x12\x2a\x9b\x4f\x20\xfc\xac\x69\xf2\x72\x84\x82\x4c\x08"
- "\xe1\xb6\xa8\x4a\x68\x40\x93\x62\x50\x1f\x9c\x7f\x36\xff\xa4\xe9"
- "\x57\x55\xaf\x47\xab\x8c\x50\xc7\x9f\x0d\xed\x75\xac\x5c\x57\x89"
- "\xe0\xb3\x01\x95\xd1\x3a\xe4\x15\x83\xbc\x71\xfb\x1a\x73\x42\x43"
- "\x26\x41\xff\x59\xd8\x4c\xd3\xb8\x6d\x71\x9b\xe2\xf6\xc5\xe5\x59"
- "\xda\xbc\x2a\x52\x8f\x92\x0d\xc8\xbb\x2a\x09\x7e\x27\xd0\xfa\x2a"
- "\x74\x05\x41\x1d\xfd\xe9\xbe\x5f\x69\x01\x17\x39\x18\x0b\x3a\x77"
- "\xf7\x60\x88\x7f\x3f\x09\x4c\xd5\x10\x4c\xf5\x68\x72\x02\x53\x75"
- "\x1c\xa6\x7a\x14\x73\x98\xba\x33\x55\x1a\x53\x77\x9c\x67\x31\xa5"
- "\xef\x9e\x98\xba\x63\xb5\x7d\x4c\xdd\x11\x61\x07\x53\x0d\x80\xa9"
- "\x12\x21\xa6\xee\xdc\x2a\x1f\x53\x77\x94\x74\x21\xa6\x6a\x95\x61"
- "\xea\x8e\x1c\x21\xa6\x7a\xec\x92\xc6\x54\x18\xcb\x53\x77\x9f\x73"
- "\x8c\xa9\x30\x1e\x4f\x79\xba\x71\x98\xea\x79\x46\x1a\x53\x3d\x47"
- "\x13\x4c\x85\x75\x53\x9e\xf2\x3c\x65\x1f\x53\x9e\xfb\xa5\x31\x15"
- "\x06\x3c\x15\x66\xc5\x53\x3d\x2f\xcb\xc7\x54\x4f\x8f\xae\xc3\x54"
- "\x98\x42\x9e\xf2\x6c\x10\x62\xea\x4e\x83\x1d\x4c\xb1\x3c\xd5\xf7"
- "\x2b\x27\x30\xc5\xe3\xa9\xbb\xa6\x71\x98\xf2\x7a\x52\x1a\x53\x77"
- "\x67\xb0\x98\xea\xa6\x3c\x75\xf7\x10\xfb\x98\xba\xdb\xd3\x0e\xa6"
- "\x80\xa7\xc2\xac\x78\xca\x6b\x9c\x7c\x4c\xdd\x1d\xd2\x85\x98\x52"
- "\xc8\x53\x77\x8f\x11\x62\xea\xae\x20\x69\x4c\x85\xb3\x3c\xf5\xfb"
- "\x34\xc7\x98\x0a\xe7\xf1\x94\xd7\x1e\x0e\x53\xbd\xd7\x4b\x63\xaa"
- "\xd7\x59\x82\xa9\xf0\x6e\xca\x53\xbd\x56\xd9\xc7\x54\xaf\x50\x69"
- "\x4c\x85\x03\x4f\x85\x5b\xf1\x54\xef\x5c\xf9\x98\xea\xb5\xb7\xeb"
- "\x30\x15\xae\x90\xa7\x7a\x65\x09\x31\xe5\x55\x68\x07\x53\x2c\x4f"
- "\xcd\x7c\xd6\x09\x4c\xf1\x78\xaa\xb7\x89\xc3\x94\xf7\x69\x69\x4c"
- "\x79\x8f\x64\x31\xd5\x4d\x79\xaa\xcf\x49\xfb\x98\xea\x53\x62\x07"
- "\x53\xc0\x53\xe1\x56\x3c\xe5\x7d\x51\x3e\xa6\xf0\xeb\x9f\xba\x0c"
- "\x53\x0a\x79\xaa\x4f\xbd\x10\x53\xbd\x9b\xa5\x30\xd5\x8a\x7d\x9f"
- "\x1b\x60\x2a\x1a\x7c\x1f\x60\xa8\x4f\x35\xc1\x54\x1b\x60\xea\x2d"
- "\x3e\xa6\xbe\xb3\xf6\x7d\x7d\x5f\x32\xb7\x63\xea\x9e\x30\x6b\x4c"
- "\x99\x01\x53\x6d\x0c\xa6\xfa\x2d\xb5\xf8\xbe\xaa\xc6\x42\x88\xd5"
- "\x25\x54\x15\x0c\x78\xda\xc2\xe2\xe9\x3b\xc0\x13\xdc\x8f\x19\xee"
- "\xb7\xbc\xae\x16\x4d\xd6\x93\xfb\x6a\x85\xfb\x35\xf3\xb1\xd4\xda"
- "\x40\x61\x0c\x61\xec\x58\x70\x54\xb1\x10\xf0\x13\x7b\x12\x55\xc4"
- "\xc3\xcf\x0a\xf8\x49\x82\x1f\x74\x12\x95\x37\x20\x26\x67\xcf\xe1"
- "\xa7\x9a\xc5\x4f\xbf\xbe\xf6\xf1\xd3\x57\x2f\xcf\xe3\xdd\xb3\x40"
- "\x3e\x7e\xfa\xf9\xb3\x73\xe9\xbc\x27\xbf\xf4\x03\x8d\xe7\xcd\x12"
- "\x8c\x5c\x42\x93\x8d\xa8\x0f\x3d\x53\xd3\xcf\x2b\x04\x79\xaf\x34"
- "\x21\x2a\x63\x0e\xf2\xce\xf8\x16\xee\xd7\xd2\x77\xce\x21\xaf\x13"
- "\x86\x7f\xa1\xf2\xa6\x5a\x54\x7e\xbd\x0c\x95\x9b\xe1\xe7\x12\xfc"
- "\x40\x1d\x27\x47\xf1\xef\x57\xcf\xde\xef\x3d\x6e\x50\x96\x9f\xf4"
- "\xfd\xf6\xd3\x31\xf7\x1b\x09\xf7\xdb\xca\xdd\x6f\x15\x60\x11\xe2"
- "\x32\xc0\xcc\xfa\xc4\xc9\x7a\xd4\x73\x91\x91\xa6\x5b\x59\x0c\xe2"
- "\xb8\x9c\xa8\x31\xa0\xc9\x31\x10\xab\x57\x00\x83\xf5\xbb\x51\x72"
- "\x22\x60\xb0\xd5\x80\x9f\xeb\xeb\xab\x52\x5a\x00\x83\xfd\xfc\x68"
- "\x68\xb7\x36\x8c\xc1\xef\x30\x06\xfb\x06\x9a\xa5\x31\x58\x43\x30"
- "\x08\x3e\xd1\x31\x06\x79\xbc\x76\xcf\x29\x0e\x83\x3e\x67\xa5\x31"
- "\xa8\x6a\xb1\xf8\xc4\x9b\x8f\x41\x55\xae\x7d\x0c\xaa\xe2\xe4\x79"
- "\x42\x9f\x2b\xf2\x31\xa8\x3a\xd6\x75\x18\xf4\x59\x6f\x1f\x83\x3e"
- "\x91\x4e\x60\xb0\x56\x19\x06\x55\xbb\x85\x18\xbc\xa7\x5c\x1a\x83"
- "\x61\x2c\x0f\x82\xaf\x74\x88\x41\xbe\xaf\xec\x3f\x9d\xc3\xa0\x6f"
- "\x94\x34\x06\x7f\xb3\xca\xe2\x2b\x6f\x3e\x06\x7f\x73\xaf\x7d\x0c"
- "\xf6\x37\xc8\xf3\x90\xbe\x4b\xe5\x63\xf0\x37\x81\x5d\x87\x41\xdf"
- "\x9e\xf6\x31\xf8\x9b\x06\xc7\x18\x0c\x53\xc8\x83\xbf\x19\x2a\xc4"
- "\x60\xff\x60\x3b\x18\x64\x79\x10\x7c\xa8\x63\x0c\xf2\x78\xd0\xf7"
- "\x0c\x87\xc1\x01\x17\xa5\x31\x38\xc0\xcd\xe2\x43\x6f\x3e\x06\xef"
- "\x2d\xb0\x8f\xc1\x7b\x13\xe5\x79\xce\x01\x2d\xf2\x31\x78\x6f\x79"
- "\xd7\x61\x70\x40\x86\x7d\x0c\x0e\x98\xef\x04\x06\x15\xf2\xe0\xbd"
- "\x25\x42\x0c\xfa\xd6\x48\x63\x30\x9c\xe5\x41\xf0\xad\x0e\x31\xc8"
- "\xf7\xad\xf7\xcd\xe6\x30\x78\xff\x02\x69\x0c\x0e\x5c\x6f\xf1\xad"
- "\x37\x1f\x83\x03\x1f\xb2\x8f\xc1\x81\x48\x9e\x47\xbd\x7f\x95\x7c"
- "\x0c\x0e\x0c\xee\x3a\x0c\xde\xdf\xd7\x3e\x06\x07\xea\x1d\x63\x30"
- "\x5c\x21\x0f\x0e\x1c\x21\xc4\xe0\x7d\x21\x76\x30\xc8\xf2\x20\xf8"
- "\x5c\xc7\x18\xe4\xf1\xe0\xfd\xe7\x39\x0c\x3e\x78\x45\x1a\x83\x0f"
- "\xf6\xb4\xf8\xdc\x9b\x8f\xc1\x07\x8a\xec\x63\xf0\x81\x75\xf2\x3c"
- "\xad\xda\x4d\x3e\x06\x1f\xa8\xe9\x3a\x0c\x3e\x98\x6b\x1f\x83\x0f"
- "\xc6\x39\x81\x41\x85\x3c\xf8\xc0\x41\x21\x06\xef\xaf\x93\xc2\xa0"
- "\x19\x7c\x71\xdb\xae\x49\xfe\xe6\x9c\xa5\xb5\x7d\xdc\xd4\xc8\xa8"
- "\x8a\x28\xac\x8a\x6b\x46\x93\xae\x41\xfb\xc4\x5c\x43\xe1\xd7\xbc"
- "\x91\x29\x67\x69\x29\x68\xf2\x10\x9e\x7f\x66\xe6\x96\x19\xb3\xbe"
- "\xd2\x6e\x5a\x88\x3c\xc0\x7f\xbf\x81\x8f\x55\x5d\x30\x20\xfc\xfd"
- "\xab\x70\x7d\x2e\x71\xf5\xc1\x79\x02\xfa\x17\x8d\x37\xf3\x8c\xb9"
- "\x55\x87\xea\xc7\x20\xf7\xf2\x7a\x1d\xb4\xc3\x0a\x26\xbe\xb8\x5d"
- "\x20\x9e\x35\x3b\x7e\x46\x1e\xc6\xff\xf9\x0e\x80\xf6\x56\xf5\x5a"
- "\x86\xdc\x06\xd6\xd3\x66\xdc\xae\xb8\xbd\x70\x1b\xab\x57\xe0\x67"
- "\xd7\x0f\x0d\xae\x04\x8c\x19\xff\xa7\x19\xb0\x1d\xce\x13\xf7\xab"
- "\x0f\x0d\x93\x8f\x0d\xb5\x9e\x59\xb7\xe0\xae\x2e\x2f\xaf\x43\xa2"
- "\xcf\x8e\xa1\xad\x6a\x9c\x6c\xab\x5a\x9e\xcf\xeb\x84\xb6\x1a\x84"
- "\x9c\x6b\xab\x41\x2f\x59\xb5\x95\x88\xaf\x1a\x34\x5d\x7e\x5b\x0d"
- "\x1a\x48\xda\xea\x21\x83\x74\x5b\x85\x39\x89\xab\xb0\x10\x9e\x1f"
- "\xe9\x84\xb6\x7a\x78\xa8\x73\x6d\xf5\xf0\x2a\x61\x5b\x89\xe9\xff"
- "\x87\xd7\xcb\x6f\xab\x87\xc9\x5e\xa0\xee\x0f\xfb\xd9\x69\x2b\x27"
- "\x71\x15\x56\xcb\xd3\xcd\x9d\xd0\x56\x7e\x21\xce\xb5\x95\xdf\x1e"
- "\xab\xb6\x12\xd1\xa9\x7e\x1f\xca\x6f\x2b\x3f\xf2\x3e\x3c\x77\xbf"
- "\x60\xe9\xb6\x0a\x77\x12\x57\xe1\x21\x3c\x7d\xd7\x09\x6d\x35\x78"
- "\x9d\x73\x6d\x35\xf8\x94\xb0\xad\xc4\xf4\xd4\xe0\x33\xf2\xdb\x6a"
- "\x70\x21\x69\xab\xc1\x89\x76\xda\xca\x49\x5c\x85\xd7\xf2\x74\x48"
- "\x27\xb4\xd5\x6f\x4b\x9c\x6b\xab\x47\xdc\xac\xda\x4a\x64\xdc\x7f"
- "\xa4\xa7\xfc\xb6\xfa\x6d\x39\x69\xab\xdf\xee\x96\x6a\x2b\x53\x4e"
- "\xe8\xd4\x3e\xd0\x06\x2d\x5b\x42\x87\xf7\x49\x40\x54\xab\x1f\xb4"
- "\x9b\x0a\xda\x6d\xb5\x1a\xb5\xe5\x40\xbb\xe9\x8d\x68\xd2\xe2\x1f"
- "\xe8\xca\x46\x13\x6a\x85\x36\x6b\x51\x85\x86\x54\xe9\x1b\xf0\x9c"
- "\xa3\x67\xce\xb9\x6b\x2e\xce\x5c\xec\x8d\x70\xbb\xe1\x76\xc0\x6d"
- "\x47\x43\xbb\x31\xed\xa8\x4a\x8e\x36\xa9\x16\xc5\x4c\xbc\xfc\x03"
- "\xbd\x48\x47\xd3\xf8\x7e\x69\xd5\xa0\x6a\xfc\x5c\x60\x72\x03\xea"
- "\xa9\x9e\x82\xef\x49\xb3\x15\x1f\xaf\xd2\xd7\x82\x3e\x68\x42\x8c"
- "\x36\xfb\x41\xa3\x32\xfd\x45\xe3\x65\xaa\x0a\x79\x81\xee\xff\xb0"
- "\xde\xd8\x7f\xbe\x36\xf9\x32\xba\x03\xeb\x87\x4c\x33\xf2\x5d\xb5"
- "\x00\x51\xfb\xe6\x69\x29\x66\xed\x5a\x2c\x53\x46\x14\xb4\x8b\x2f"
- "\x7d\x95\x37\xa7\xfb\x6a\x34\xaa\xba\x90\xc5\xc4\xcd\x5a\x23\x30"
- "\x71\xfb\x46\xe3\x0d\x3a\x73\x38\xad\x0a\x8d\xce\xaa\x44\x6a\xba"
- "\x0d\xda\x18\xaf\x27\x72\x1f\xf2\xd2\x8e\x56\xb9\x6d\xac\x61\xe6"
- "\x7f\x9b\xd5\xec\xfc\x2d\x68\x27\xfc\xfd\xcc\xfc\xad\x18\xde\xfc"
- "\x2d\xa8\x33\x37\x7f\xeb\x91\x66\x3c\x7f\xcb\xfc\x83\xef\x00\xcb"
- "\xbd\x2f\x9a\x4f\xd3\x70\xef\xfd\x2a\x9b\xf5\x08\xdf\x7f\x65\xb3"
- "\x16\x25\xc7\x21\xef\xca\xd6\x06\x94\xd4\x4c\xeb\x2b\x53\x2e\xa2"
- "\xc9\xd7\xb0\x0e\xc6\x78\xd1\x9c\x25\x71\x7d\x64\xbf\xf9\x07\xcd"
- "\x00\xa8\x43\x6d\x65\x35\x42\xbc\x75\x3c\xd1\xa0\x99\x3d\x21\x0e"
- "\xd1\x55\x29\xe7\x10\xc4\x44\x5f\x65\xfc\x16\xc7\x29\x1a\x3e\x1f"
- "\xd3\xae\xaf\xfb\x2f\x6a\xc2\xc7\x70\xcc\xf0\xf3\x26\xbc\x77\xc0"
- "\x0e\x9e\xfe\xc6\xb8\xe8\x93\x90\x82\xaa\x12\x5a\x51\xa5\x11\x81"
- "\xbe\x7a\x24\xe2\xcb\x90\x5a\x29\x1c\xd5\xb0\x38\x2a\xe9\x93\xd0"
- "\xa3\xc9\x09\x1c\xd5\x72\x38\x7a\xec\x49\xd7\x70\xf4\xe8\x59\xd7"
- "\x71\xf4\x68\xb1\x0b\x38\x6a\x10\xe2\xe8\xb1\xad\xf2\x71\xf4\x68"
- "\x82\x7c\x1c\x3d\x3a\xc6\x35\x1c\x3d\x36\x84\xe0\x68\x88\x91\xe0"
- "\xe8\x31\x35\x87\x23\x66\x6d\x54\x27\xe1\x68\xc8\x6e\x69\x1c\x85"
- "\xb1\x7c\x14\x06\x7c\x74\xf7\x39\xc7\x38\x0a\xe3\xf1\xd1\xb0\xe5"
- "\xae\xe1\x68\xd8\x10\xd7\x71\x34\xf4\x9a\x72\x1c\x85\x59\xf1\xd1"
- "\xb0\xb3\xf2\x71\x34\x54\x2b\x1f\x47\x43\xd7\xb9\x86\xa3\x61\x8b"
- "\x09\x8e\x86\x06\x10\x1c\x0d\x8b\xe6\x70\xc4\xac\x37\xeb\x24\x1c"
- "\x3d\xa6\xb7\x83\x23\x96\x8f\xc2\x80\x8f\xfa\x7e\xe5\x04\x8e\x78"
- "\x7c\xf4\xc4\x51\xd7\x70\xf4\xc4\x62\xd7\x71\xf4\xc4\x58\x17\x70"
- "\x64\xc5\x47\xc3\x87\xc8\xc7\xd1\x13\x9e\xf2\x71\xf4\x78\xb9\x6b"
- "\x38\x7a\xe2\x10\xc1\xd1\xe3\xe9\x04\x47\x4f\x94\x70\x38\x62\xd6"
- "\xf0\x75\x12\x8e\x1e\x1f\x25\x8d\xa3\x70\x96\x8f\xc2\x81\x8f\x7e"
- "\x9f\xe6\x18\x47\xe1\x3c\x3e\xfa\x5d\x4f\xd7\x70\xf4\xe4\x21\xd7"
- "\x71\xf4\xe4\x7a\xe5\x38\x0a\xb7\xe2\xa3\xdf\x2d\x96\x8f\xa3\x27"
- "\x83\xe5\xe3\xe8\x49\x95\x6b\x38\xfa\x9d\x1b\xc1\xd1\xf0\x1a\x82"
- "\xa3\x27\x0d\x1c\x8e\x98\x75\x91\x9d\x84\xa3\xe1\x29\x76\x70\xc4"
- "\xf2\x51\x38\xf0\xd1\xcc\x67\x9d\xc0\x11\x8f\x8f\x46\xbc\xe4\x1a"
- "\x8e\x46\xb8\xb9\x8e\xa3\xff\xab\x70\x01\x47\x56\x7c\x34\xe2\x90"
- "\x7c\x1c\xfd\x5f\x9e\x7c\x1c\xfd\x5f\xa8\x6b\x38\x1a\x31\x81\xe0"
- "\xe8\xff\x06\x12\x1c\x8d\xf0\xe7\x70\xc4\xac\x35\xed\x24\x1c\xfd"
- "\xae\x54\x0a\x47\x78\x2f\x82\xcd\x64\x5f\x88\xe6\x4d\x2b\xd0\xa8"
- "\x1d\xf8\x77\x2b\x1a\x7e\x23\x73\x84\xfe\x68\x22\xd9\x0f\x00\xea"
- "\xc9\xe4\x7b\xc5\xae\xbf\x7b\x0f\xc4\x45\x15\x1a\x3c\xf9\x0c\xd9"
- "\xa3\x01\xef\x0b\x72\x35\x39\x1a\x3d\x81\xf7\x65\x70\xff\xbd\x06"
- "\xef\x63\xd5\xbe\x77\x80\x4a\x62\xef\x80\x19\xd2\x7b\x07\xb4\x6e"
- "\xb1\xac\xbb\xdd\xcd\xad\xbb\x75\x1f\x79\xcd\xee\xba\x5b\xf7\x91"
- "\x67\x0a\x66\xc8\xc5\xc3\x48\x66\xfd\xd7\xd5\xfe\xa1\x70\xef\x23"
- "\x1b\xe1\x9e\x8f\x91\x7b\xff\x3d\xb3\x7f\xb0\xe3\xf5\xb8\xbb\x79"
- "\x38\x19\x99\x37\x2d\x14\xa5\xd0\x69\xcd\x8d\xb4\x4f\x68\x30\x9d"
- "\x1b\x1a\x21\xaf\x2e\xbf\x97\x7c\xff\x21\xdb\xde\xd5\xe2\xed\xfd"
- "\x54\x1e\xdb\xde\x25\x6c\x7b\x8b\xef\x5b\x30\x43\x7a\xdf\x02\xf1"
- "\xf6\x7e\xca\xfe\x3a\x67\xf7\xa7\x26\xca\x6f\xef\xa7\x7c\xd9\xf6"
- "\x2e\xb9\x91\xf9\x54\x28\xd7\xde\x4f\xd5\xca\x6f\xef\xa7\x3c\x49"
- "\x7b\x5f\xd3\x41\x7b\x57\x43\x7b\xcb\xdb\xbf\xc5\xfd\x29\xc9\xfd"
- "\xbf\x49\x7b\x87\x49\xe0\x7b\xb4\x27\x69\x6f\x76\xcf\x04\x95\xc4"
- "\x9e\x09\x33\xa4\xf7\x4c\x10\x6f\xef\x51\xa7\xec\xb7\xf7\xa8\xc3"
- "\xf2\xdb\x7b\xd4\x46\xd2\xde\x61\x80\xef\x51\xe5\x5c\x7b\x8f\x76"
- "\x72\x5f\x01\x7e\x7b\x8f\x4a\x20\xed\x7d\xbd\x86\xf6\x09\x03\x7c"
- "\x87\xc9\xc4\xf7\x68\x95\x83\xf6\x96\xc0\xf7\xd3\x09\x6c\x7b\xb3"
- "\xf8\x96\xd8\xaf\x61\x86\xf4\x7e\x0d\xe2\xed\xfd\xf4\x78\xfb\xed"
- "\xfd\xf4\x30\xf9\xed\x3d\xda\xc0\xb6\x37\xe0\xfb\xe9\x31\x5c\x7b"
- "\x3f\x7d\x50\x7e\x7b\x8f\x6e\x20\xed\x7d\xa3\x14\xda\x1b\xf0\x1d"
- "\x26\x13\xdf\x4f\xaf\xb3\xdf\xde\xe1\x12\xf8\x7e\xa6\x81\xb4\x37"
- "\xbb\x57\x84\x4a\x62\xaf\x88\x19\xd2\x7b\x45\x88\xb7\xf7\x33\x07"
- "\xec\xb7\xf7\x33\x05\xf2\xdb\xfb\x99\x68\xd2\xde\xe1\x80\xef\x67"
- "\xf6\x72\xed\x3d\x46\x23\xbf\xbd\x9f\x09\x21\xed\x6d\xf8\x94\xf6"
- "\x09\x07\x7c\x87\xcb\xc4\xf7\x33\xcd\x0e\xda\x5b\x02\xdf\x63\x43"
- "\xd8\xf6\x66\xf1\x2d\xb1\x4f\xc5\x0c\xe9\x7d\x2a\xc4\xdb\x7b\xec"
- "\x60\xfb\xed\x3d\xb6\x97\xfc\xf6\x1e\x53\xcb\xb6\x37\xe0\x7b\xec"
- "\x40\xae\xbd\xc7\xe6\xc9\x6f\xef\x31\xa5\xa4\xbd\x5b\x4a\xa0\xbd"
- "\x01\xdf\xe1\x32\xf1\x3d\x36\x52\xaa\xbd\xfb\x40\x7b\x1f\x07\x1d"
- "\x03\xe3\x60\x88\x39\x07\x74\x8a\x49\xd8\xee\x55\x09\xa3\xd0\xe3"
- "\xd7\x71\xdb\xff\x31\x00\xc6\x8e\x90\x2e\xdb\x2f\xc3\xfd\x8f\xc3"
- "\x5c\x5f\x3b\xfc\x87\x16\xe9\xb5\xc3\x7f\x38\x2b\x7f\xed\xf0\x1f"
- "\xf6\x72\x1a\xe8\x0f\x7a\x2e\xa6\x7f\x64\xf8\x43\xde\x9a\xe2\x3f"
- "\xe4\x8b\xee\xa3\xe1\xfe\x87\x20\xbc\xa6\x98\x4e\x6b\xdd\x65\xce"
- "\x55\xa2\x8d\xfe\x18\xec\x44\xac\x6b\x21\x0e\xd5\xd2\xb1\x1e\x37"
- "\x1c\x62\x5d\xdb\x65\xfb\x76\xb8\x8f\xbb\xd7\xf5\x58\xfb\x9f\x97"
- "\x8e\xb5\x7f\x85\xfc\x58\xfb\xe7\x71\xfa\xcb\xbf\x8e\x8b\xf5\x38"
- "\x05\xeb\xc7\xfd\x37\x8a\xee\xe7\xe1\xee\x3f\x8a\xc4\xda\xe8\x09"
- "\xb1\x56\xa0\xcb\xc6\x8d\x71\x1c\xeb\x30\xe8\xd7\x61\x76\xfa\xf5"
- "\x73\x03\x61\xcc\x0c\xe9\xb2\xfd\x43\xdc\x9f\xeb\xe1\x7a\xac\x9f"
- "\x3d\x29\x1d\xeb\x67\x0f\xc9\x8f\xf5\xb3\xeb\x38\xed\xf7\x6c\x29"
- "\x17\xeb\xe7\x42\xe5\xc7\xfa\xd9\x38\xd1\x7d\x45\xdc\x9f\xf5\x23"
- "\xb1\x36\xcd\x37\xe7\x2a\xd1\x84\xcf\x69\x9c\x88\x35\xf4\xeb\x30"
- "\x3b\xfd\x7a\xbc\x27\xc4\xba\xb6\xeb\xf6\x31\x09\xb8\xe2\x7a\xac"
- "\x03\x0e\x4b\xc7\x3a\xa0\x48\x7e\xac\x03\x62\x38\xdd\x19\xb0\x9f"
- "\x8b\xf5\xf8\x40\xf9\xb1\x0e\x88\x10\xdd\xdf\xc4\x3d\xc0\x9b\xc4"
- "\xda\x5c\x0d\xb1\x56\xa0\x47\xc7\x4b\xea\x7f\x2e\xd6\xe1\xd0\xaf"
- "\xc3\xed\xf4\xeb\xe7\x9b\x41\x2b\x84\x74\xdd\x7e\x2a\xcf\x9f\x71"
- "\x3d\xd6\xcf\xef\x91\x8e\xf5\xf3\xd9\xf2\x63\xfd\x7c\x28\xa7\x79"
- "\x9f\x2f\xe4\x62\xfd\xc2\x08\xf9\xb1\x7e\x3e\x48\x7c\x9f\x95\xf1"
- "\x46\x26\xd6\x99\x68\x84\x39\x57\x89\x16\x7e\x01\x39\x11\x6b\xe8"
- "\xd7\xe1\x76\xfa\x75\x20\xf8\xfa\xf0\xda\xae\xdb\xd7\x25\xb0\xcc"
- "\xf5\x58\x07\xe6\x4a\xc7\x3a\x70\x95\xfc\x58\x07\x06\x72\x7a\x3b"
- "\x30\x9d\x8b\xf5\x04\xb5\xfc\x58\x07\x8e\x12\xdf\xef\xe5\x85\x06"
- "\x12\x6b\xb7\x3c\x88\xb5\x02\x1d\x1e\xd8\xa8\x44\x87\x2f\x29\x40"
- "\x9e\xc2\x78\xbf\x58\xdd\xb5\x5a\xfc\xc5\x43\xae\xc7\xfb\xc5\xf5"
- "\xd2\xf1\x7e\x71\x81\xfc\x78\xbf\x38\x8a\xd3\xe2\x2f\x26\x72\xf1"
- "\xfe\x93\xb7\xfc\x78\xbf\xa8\x11\xd7\xe2\x13\x6a\x5d\xd3\xe2\x2f"
- "\xd6\x29\xd1\xe2\xb6\xf1\x0e\xd2\x76\xad\x1e\x0f\xda\xe3\x7a\xbc"
- "\x83\x96\x4a\xc7\x3b\x28\x4c\x7e\xbc\x83\x34\x9c\x1e\x0f\x9a\xcf"
- "\xc5\x7b\x22\x92\x1f\xef\x20\x5f\x71\x3d\xfe\xa7\x52\xd7\xf4\x78"
- "\x50\xb9\x12\x3d\x6e\x1b\xef\x49\x25\x5d\xab\xc9\x27\x6d\x75\x3d"
- "\xde\x93\xa2\xa4\xe3\x3d\x69\xa2\xfc\x78\x4f\xf2\xe5\x34\xf9\x24"
- "\x5e\xfe\x7b\x92\x5e\x7e\xbc\x27\x79\x8a\x6b\xf2\x89\x07\x5d\xd3"
- "\xe4\x93\x3e\x55\xa2\xc9\x6d\xe3\x1d\x5c\xd8\xb5\xba\x3c\x38\xd5"
- "\xf5\x78\x07\x4f\x93\x8e\x77\xf0\x58\xf9\xf1\x0e\xf6\xe4\x74\x79"
- "\x70\x10\x17\xef\x60\x9d\xfc\x78\x4f\x36\x88\xeb\xf2\xc9\xbb\x5d"
- "\xd3\xe5\xc1\x7b\x95\xe8\x72\xdb\x78\x4f\xc9\xea\x5a\x6d\x3e\x65"
- "\xb9\xeb\xf1\x9e\x32\x5e\x3a\xde\x53\x86\xc9\x8f\xf7\x4b\x06\x4e"
- "\x9b\x4f\xe1\xe5\xff\xa7\x54\xcb\x8f\xf7\x4b\x0d\xe2\xda\xfc\xa5"
- "\x3c\xd7\xb4\xf9\x94\x7c\x25\xda\xdc\x36\xde\x53\x53\xba\x56\x9f"
- "\x4f\x9d\xeb\x7a\xbc\xa7\x8e\x94\x8e\xf7\xd4\xfb\xe5\xc7\xfb\xcf"
- "\x0d\x9c\x3e\x9f\x3a\x94\x8b\xf7\x54\xad\xfc\x78\xff\xb9\x56\x5c"
- "\x9f\xff\x79\xa3\x6b\xfa\x7c\x6a\xba\xeb\x79\xf2\xbf\x84\x62\x6d"
- "\x2e\x77\xff\xc7\xaa\x38\xcb\x9a\xbb\x69\xbc\xfd\x1f\xff\xc2\xbc"
- "\x5b\x45\x7c\x6f\x99\x97\xf7\x74\xef\xfd\x1f\x5f\x76\xb0\xff\xe3"
- "\xcb\x32\xf7\x7f\x7c\x39\x5b\xfe\x7c\xfc\x97\x43\x39\x8f\xf0\x32"
- "\xcf\xff\xff\x85\xe9\xd7\xdd\x7b\x5f\xc8\x97\xad\xf6\x85\x9c\xc6"
- "\xec\x0b\x49\x67\x52\x46\x65\x5e\xe4\x2f\xd1\xae\x3f\x17\x98\x31"
- "\x0a\xfb\x10\xb9\xfb\x50\x72\xd8\x0e\x19\xc9\x61\x7b\xc6\x10\x69"
- "\x6c\x4f\x5f\xdf\xbd\xf7\xa1\x9c\xde\xd3\x3e\xb6\x43\x1a\xe4\xed"
- "\x39\x32\x5d\xc1\xbe\x37\xd3\x47\x71\x7e\x68\x3a\xcf\xff\xce\x48"
- "\xe8\x42\x6c\x2b\xdc\x4f\x69\xfa\x40\x21\xb6\x43\x86\x12\x6c\xf7"
- "\x08\x56\xe6\xbb\x66\x04\xb8\xfe\x1c\x24\x4c\x85\x3d\x97\xdc\xfd"
- "\x30\x39\x6c\xcf\xec\xcb\x61\x3b\xac\x87\x34\xb6\x43\x67\x77\xef"
- "\xfd\x30\x67\x9e\xb7\x8f\xed\x99\xc7\xe4\xed\x65\x12\x3a\x41\x3e"
- "\xb6\x43\x55\x9c\xf7\x0b\x0d\xe1\xb0\x1d\x36\xb5\xeb\xb0\xad\x74"
- "\x9f\xcc\x99\x06\x21\xb6\x67\x7a\x12\x6c\xdf\xb9\x4b\x99\xc7\x0c"
- "\x53\xbb\xfe\xdc\x67\x96\x1e\xfb\x4b\xb9\xfb\x72\x72\xd8\x0e\xbb"
- "\xcc\x61\x7b\x96\xcd\xbe\x50\x1c\xb6\x67\x8d\xed\xde\xfb\x72\x86"
- "\x1f\xb5\x8f\xed\xf0\x42\x79\x7b\xa4\xcc\x1a\x2c\x1f\xdb\xe1\x7a"
- "\xce\xe7\xce\x1a\xc1\x61\x3b\x62\x78\x17\x62\x5b\x21\x6f\x87\xd7"
- "\x08\xb1\x1d\x56\x4f\xb0\xdd\xd3\xa0\xcc\x4f\xcf\x32\xba\xfe\x9c"
- "\x6b\x4e\x39\xf6\xd2\x72\xf7\x07\xe5\xb0\x1d\x51\xc6\x61\x7b\xce"
- "\x61\x69\x6c\xcf\xb9\xb7\x7b\xef\x0f\x3a\xdb\xc1\xfe\x3f\xb3\xed"
- "\xec\xff\x23\xb6\x56\x78\x8e\x82\x7d\x2f\x66\x97\x73\x9e\x7e\x8e"
- "\x37\x87\xed\x57\xbc\xba\x0e\xdb\x4a\xf7\x0d\x9d\x5d\x22\xc4\x76"
- "\x84\x96\x60\xdb\x2b\x48\x59\xee\x60\x4e\xad\xeb\xcf\xf5\xa2\x76"
- "\xe3\xbc\x81\xdc\x7d\x4a\x39\x6c\xbf\x52\xc4\x61\x3b\x6a\xab\x34"
- "\xb6\x23\xaf\x75\xef\x7d\x4a\x23\x97\xdb\xc7\x76\x64\x88\xbc\x3d"
- "\x5d\x22\x15\xac\x83\x8f\xdc\xcd\xe5\x2f\x22\x79\xf3\xdf\xa3\x1a"
- "\xba\x10\xdb\x0a\x79\x3b\x32\x5d\x88\xed\x57\xf2\x09\xb6\x7b\x17"
- "\x2a\xcb\x93\x44\xed\x77\x3d\x4f\x12\xbd\x9f\x79\x86\x29\x73\xbf"
- "\x54\x0e\xdb\xaf\xae\xe6\xf6\x26\x8a\x2e\xb2\xc6\x36\xb7\x37\xd1"
- "\x6b\x87\xbb\xcf\x7e\xa9\xaf\x8d\xb3\x8f\xe3\xd7\xd4\xf2\x72\x22"
- "\xaf\x15\xc9\xc7\xf1\x6b\x31\x5c\x4e\xe4\x35\xde\xfc\x97\x68\xcb"
- "\x3b\xc9\xbb\x60\xcf\xa2\xe8\x09\xf6\xf7\x2c\x8a\xd6\x74\xde\x3e"
- "\xaa\xaf\x4d\x15\xee\x59\xf4\x6a\x82\x99\xe9\x0b\xde\xcd\xca\xf2"
- "\x2a\xd1\x5a\xd7\xf3\x2a\x7f\x25\xcf\x77\x65\xee\xdb\xca\xf5\x85"
- "\xb9\x19\x5c\x5f\xf8\xeb\x87\xd2\x7d\x61\x5e\x59\xf7\xd9\xb7\x75"
- "\xde\x44\xfb\x7d\x61\xde\x50\x79\x39\x94\x79\x0a\xf6\x81\x99\x97"
- "\xc8\xe5\x50\xe6\x69\xb9\xbe\x30\x1f\x75\x5d\x5f\xf8\xeb\x34\xfb"
- "\x7d\xe1\xaf\x23\x3a\x6f\x3f\xd7\x79\x11\xc2\xbe\x30\x77\x1d\xe9"
- "\x0b\xf7\x24\x28\xcb\xc3\xfc\x55\xd1\xf3\x6f\x61\x5f\x58\x58\xce"
- "\x3c\xfb\x96\xb9\x7f\x2c\xd7\x17\xe6\x6f\xe5\xfa\xc2\x42\x1b\x3d"
- "\xcf\xf5\x85\x05\xa7\xba\xcf\xfe\xb1\x0b\xa6\xdb\xef\x0b\x0b\x46"
- "\xc9\xcb\xb9\x2c\x38\x2c\xbf\x2f\x2c\xe0\xad\x7f\x5a\xc0\x5b\xff"
- "\xb4\xc8\xab\xeb\xfa\xc2\xc2\xd9\xf6\xfb\xc2\x42\xff\xce\xdb\x57"
- "\x76\xc1\x7c\x61\x5f\x98\x9f\x45\xfa\x82\x8f\x51\x59\xde\x66\xa1"
- "\x13\xfa\xdf\x51\xde\x66\x71\x2d\x33\x2f\x40\xe6\x3e\xb6\x5c\x5f"
- "\x58\x54\xc4\xf5\x85\xc5\x65\xd2\x7d\x21\xe6\x6c\xf7\xd9\xc7\x36"
- "\x26\xca\x7e\x5f\x88\x09\x90\x97\xa3\x89\x29\x93\xdf\x17\x62\x72"
- "\xb8\x1c\x4d\x4c\x2d\xd7\x17\x62\x7d\xbb\xae\x2f\x2c\x5e\x60\xbf"
- "\x2f\x2c\x0e\xea\xbc\xfd\x6d\x63\x12\x84\x7d\x61\x51\x3e\xe9\x0b"
- "\xbe\x29\xca\xf2\x3c\x8b\xeb\x5d\xcf\xf3\xc4\xd5\x33\x73\x26\x64"
- "\xee\xa7\xcb\xf5\x85\xd8\x0f\xb9\xbe\x10\x77\x4a\xba\x2f\x2c\xb9"
- "\xdc\x7d\xf6\xd3\x5d\xb2\xd8\x7e\x5f\x58\x12\x2c\x2f\xa7\xb3\xe4"
- "\x94\xfc\xbe\xb0\xa4\x90\xcb\xe9\x2c\xa9\xe7\xfa\xc2\x52\xbf\xae"
- "\xeb\x0b\x71\xcb\xed\xf7\x85\xb8\x90\xce\xdb\x67\x77\xc9\x3a\x61"
- "\x5f\x88\xdd\x4d\xfa\xc2\x7d\x1e\xca\xf2\x42\x71\x7a\xd7\xf3\x42"
- "\xcb\xf4\xcc\x7c\x12\x99\xfb\xfa\x72\x7d\x61\xe9\x61\xae\x2f\x2c"
- "\xb3\xf3\x9e\x87\xf8\x96\xee\xb3\xaf\x6f\xbc\x83\xf7\x1f\xc5\xdb"
- "\x7b\xff\x91\x48\x0e\x28\xfe\xac\xfc\xbe\x10\xbf\x97\xcb\x01\xc5"
- "\xf3\xd6\xff\x25\x0c\xef\xba\xbe\xb0\xcc\xc1\xfb\x1f\x96\x39\xf1"
- "\xfe\x07\xa5\xfb\xfd\xc6\x67\x09\xfb\xc2\xd2\xfd\xa4\x2f\xdc\xbf"
- "\x51\x59\x1e\x69\x99\xc3\xfc\x3f\xf6\xf9\x6d\x2a\xdb\x3c\x52\x79"
- "\xfd\x28\xf4\xd8\x0c\xdc\x17\x96\xef\x32\xe6\x86\x86\xe0\xfd\x85"
- "\x4d\x7e\xec\x1e\x94\xab\xd9\x3d\x5e\x9a\x8d\x64\x0f\x4a\xbd\xa9"
- "\x7d\x0f\x4a\xb2\xf7\x07\xa2\xf0\x5a\x60\xbc\x26\xd8\xe8\x4d\xf6"
- "\x9f\xa4\xf1\x9c\x28\x3c\x47\xea\x5c\x29\xb3\xbf\x4a\xa2\x11\xee"
- "\xfd\x82\x83\xfd\x27\x23\x74\xa8\x3c\x62\x05\x32\xf6\xfd\x4a\x4b"
- "\xd6\x09\x2f\x1f\xc1\xec\x3f\x39\xcb\x77\x40\xe6\xf7\x48\xd5\x07"
- "\xef\x3f\x19\x41\x9b\x93\x75\xb4\xbe\xd2\x80\xe0\x5c\x68\xdf\xd9"
- "\x96\x3d\x28\x97\x17\xe0\x7b\x37\xce\xd2\x0c\xd8\xfe\xbd\xd4\xfe"
- "\xc2\xcb\x15\xec\x03\xbb\x3c\x98\xcb\xef\x2c\xcf\xe1\x30\xba\x9c"
- "\x19\x83\xe1\xf7\xd0\xf2\x10\xe0\x98\x4c\xb5\x57\x9b\xa2\xbd\x37"
- "\x96\x97\x38\x11\x33\x3c\x47\xc4\x86\xbf\xb8\x98\xad\x0c\x81\x98"
- "\xd5\xe2\x7d\x8e\x9d\x8f\x59\x8f\xa6\xce\x89\xd9\x8a\x06\xe7\x63"
- "\xb6\xf2\x25\xab\x98\x89\xe4\x21\x56\x8e\x96\x1f\xb3\x95\x1e\x5c"
- "\x1e\x62\x65\x20\x17\xb3\x95\x79\x24\x66\x2b\x74\x24\x66\x0f\x8d"
- "\x6a\x53\xb4\x7f\xc7\x4a\x87\xeb\xbf\xb1\x6f\x6a\x53\xd9\xfa\x72"
- "\x2e\x66\xab\xbc\x8c\xb9\xe0\xdd\xc1\x97\x3b\x1f\xb3\xbb\xcf\x75"
- "\x4e\xcc\x12\xf3\x9d\x8f\xd9\xaa\x1e\xc2\x98\x89\xf9\xe5\x44\x05"
- "\xef\xec\x4c\x3c\xc8\xf9\xe5\x44\x23\x17\xb3\x55\x41\x24\x66\x89"
- "\x39\x24\x66\x83\x22\xdb\x14\xed\x01\xb2\xca\xd7\x89\x98\xe1\x67"
- "\xfa\x76\xfa\x59\x92\x16\x62\x56\x8b\xf7\x7d\x76\x3e\x66\x7d\xbf"
- "\xea\x9c\x98\x25\x05\x3b\x1f\xb3\xa4\x43\x56\x31\x13\xf1\x75\x49"
- "\x3b\xe5\xc7\x2c\x69\x3e\xe7\xeb\x92\x4a\xb8\x98\x25\x23\x12\xb3"
- "\xa4\x40\x12\xb3\x87\xb3\xda\x14\xed\x23\x92\xe4\x30\xff\x85\x75"
- "\x68\x9b\xca\xd6\xe7\x70\x31\x4b\x89\x33\xe6\x82\x17\x02\x9f\xe3"
- "\x7c\xcc\x7e\x9f\xd6\x39\x31\x4b\xf1\x70\x3e\x66\x29\x0b\x84\x31"
- "\x13\xf3\x1f\x29\xd3\xe4\xc7\x2c\x45\xcd\xf9\x8f\x94\x48\x2e\x66"
- "\x29\xfb\x49\xcc\x92\x8d\x24\x66\x7e\x9f\xb6\x29\xda\x8b\x24\x25"
- "\xc5\x89\x98\xe1\x67\xb0\x76\xfa\xd9\x1a\x0d\xc4\xac\x16\xef\x83"
- "\xed\x7c\xcc\x66\x3e\xdb\x39\x31\x5b\x7d\xd0\xf9\x98\xad\x79\xc8"
- "\x2a\x66\x22\x3a\x79\x8d\x82\x7d\xb0\x57\xd7\x70\x3a\x79\x8d\x2f"
- "\x17\xb3\x35\xd1\x24\x66\xab\x4b\x48\xcc\x06\x37\xb4\x29\xda\xcf"
- "\x64\x8d\xe4\xfe\x5f\xf6\x74\xa3\x65\x5e\x3e\x17\xb7\xb5\xba\xee"
- "\xa3\x1d\xd7\xc6\x38\x1f\xb7\xb5\xa7\x1d\x6b\xc7\xb5\x47\xe5\xc7"
- "\x6d\x6d\x3a\xa7\x1d\xd7\x56\x73\x71\x5b\xa7\x26\x71\x5b\x1b\xed"
- "\x9a\x76\x5c\xeb\x70\xfd\xab\x98\x76\xb4\x8d\xdb\xfa\xbc\xee\xa3"
- "\x1f\xd7\x6b\x9c\x8f\xdb\xfa\x6c\xc7\xfa\x71\xfd\x72\xf9\x71\x5b"
- "\x1f\xc0\xe9\xc7\xf5\x1b\xb9\xb8\xad\xaf\x25\x71\x5b\xaf\x76\x4d"
- "\x3f\xae\x97\xdc\xff\xcd\x9e\x7e\xb4\x8d\xdb\xdf\x82\xbb\x8f\x86"
- "\xdc\xa0\x73\x3e\x6e\x7f\x9b\xe0\x58\x43\xfe\xed\x49\xf9\x71\xdb"
- "\x60\xe4\x34\xe4\xdf\xfc\xb9\xb8\xfd\x2d\x8b\xc4\x6d\x43\xad\x6b"
- "\x1a\xf2\x6f\xa1\x4a\x34\xa4\x6d\xdc\x52\x3d\xbb\x8f\x8e\xdc\x98"
- "\xe7\x7c\xdc\x52\xdd\x1c\xeb\xc8\x8d\x0a\xde\x59\xbc\x71\x3f\xa7"
- "\x23\x37\x1a\xb8\xb8\xa5\xb2\xef\x60\xd9\x98\xe5\x9a\x8e\x4c\x75"
- "\xb8\xff\x87\x98\x8e\xb4\x8d\x5b\x9a\xb6\xfb\x68\xc9\x34\x19\xfa"
- "\x3f\xcd\x4a\xff\x8b\x69\xc9\x34\x05\xfa\x3f\x6d\x3e\xa7\x25\xd3"
- "\x78\xfa\xff\x75\x56\xff\xa7\x05\xba\xa6\x25\xd3\x9c\xd1\xff\x36"
- "\x5a\xd2\x36\x6e\xe9\x09\xdd\x47\x4f\xa6\x7b\x3a\x1f\xb7\xf4\xc5"
- "\x8e\xf5\x64\xba\x82\xf7\x40\xa5\xfb\x71\x7a\x32\x3d\x9a\x8b\x5b"
- "\xfa\x41\x12\xb7\x74\xe4\x9a\x9e\x4c\x97\xdc\xff\xd1\x12\x37\x93"
- "\x2a\x34\x84\x16\xc9\x43\x56\x44\x8f\x62\xf7\x26\xdc\x14\x68\xf2"
- "\x09\x0d\x91\xfb\x7e\x17\xcb\x9e\xd3\x65\xa0\x8c\xcf\xb9\x67\x9e"
- "\x75\x6d\xdf\xe9\xcc\x6c\xd7\xf7\x9d\xce\x0c\xeb\xb8\xf7\xbb\x64"
- "\x8e\x97\xbf\xef\x74\xa6\x37\xa7\x41\x33\xa7\x72\xb1\xde\xc4\xcc"
- "\x4f\x90\xb7\x1f\x75\x46\x8d\x6b\xfb\x51\x67\x9e\x26\xf8\xca\xc8"
- "\x21\xfb\x51\x67\x56\x77\xcd\x7b\x5f\x32\xfc\xf1\x7e\xd4\x74\xe6"
- "\x23\x2a\x65\xfb\x23\x6f\x9a\xea\x04\x9e\x6b\x69\x91\x1c\x2d\x87"
- "\xe7\x37\x7c\x01\xcf\xb5\x72\xdf\x33\x23\xc4\x73\xf6\x87\xae\xe1"
- "\x39\x7b\xb6\xeb\x78\xce\x1e\xd6\x71\xef\x99\xc9\xf6\x91\x8f\xe7"
- "\x2c\x1d\xa7\xcd\xb3\xfd\x38\x3c\xbf\x11\x22\x1f\xcf\x59\xbb\x5c"
- "\xc3\x73\xf6\x1e\x82\xe7\xac\x48\x82\xe7\xec\xc2\xae\x79\xff\x4c"
- "\x96\x37\xc1\xf3\x90\x50\x65\xfb\x4f\xbf\xe1\xe7\x18\xcf\x61\x21"
- "\xb4\x48\xfe\x9a\xc3\x73\x4e\x83\xc9\x27\x2c\x44\xee\xfb\x6e\x84"
- "\x78\xce\x59\xed\x1a\x9e\x73\x9e\x74\x1d\xcf\x9b\x4d\x1d\xf7\xbe"
- "\x9b\xcd\xe7\xe5\xe3\x79\x73\x09\xe7\x59\x36\x37\x73\x78\xce\xd5"
- "\xc8\xc7\xf3\xe6\x38\xd7\xf0\x9c\xb3\x9c\xe0\x79\xf3\x08\x82\xe7"
- "\x9c\x98\xae\x79\x0f\xce\x1b\x3a\x82\xe7\xc7\x76\x29\xdb\xdf\x3b"
- "\x47\x72\xff\x63\x1e\x9e\x6b\x69\x91\xdc\x3e\x87\xe7\x37\x0f\x02"
- "\x9e\x6b\xe5\xbe\x77\x47\x88\xe7\x37\x5d\x7c\xcf\xc5\x9b\x1d\xf0"
- "\x9e\x8b\x2d\x2e\xbc\xe7\xc2\xfa\xbd\x3b\x5b\x0e\xc8\xc7\xf3\x96"
- "\x14\xce\xcb\x6d\x39\xc6\xe1\xf9\x4d\x83\x7c\x3c\x6f\x09\x70\x0d"
- "\xcf\x6f\xb2\xef\xbf\xd8\xe2\x41\xf0\xfc\xa6\x7f\xd7\xbc\x8f\x27"
- "\xb7\x84\xe0\x79\x58\xa3\xb2\xfd\xd3\xdf\x3c\xe6\x18\xcf\xe1\x21"
- "\xb4\xc8\x73\x0f\x0e\xcf\xdb\x36\x9a\x7c\xc2\x43\xe4\xbe\xff\x47"
- "\x88\xe7\x6d\x0f\xb9\x86\xe7\xad\x27\x5d\xc7\xf3\xd6\x82\x8e\x7b"
- "\xff\xcf\xd6\xf5\xf2\xf1\xbc\x35\x98\xf3\xb8\x5b\x79\xcf\xff\xb7"
- "\x95\xca\xc7\xf3\x56\x17\xdf\x0b\xb4\xed\x5e\x82\xe7\x3c\xf6\xbd"
- "\x40\xdb\xbc\xbb\xe6\xbd\x40\x79\x29\x04\xcf\xc3\x47\x28\xdb\x9f"
- "\x7e\x5b\x8e\x13\x78\xae\xa5\x45\x9e\x09\x71\x78\x2e\x08\x01\x3c"
- "\xd7\xca\x7d\x0f\x91\x10\xcf\xf9\x57\x5c\xc3\x73\xfe\x4e\xd7\xf1"
- "\x9c\xbf\xa0\xe3\xde\x43\x94\x3f\x4d\x3e\x9e\xf3\x2d\xcf\xff\x80"
- "\x9f\xf3\x79\xcf\xff\x0a\x14\xbc\x9f\xe8\xad\x7a\xd7\xf0\x9c\x7f"
- "\x91\xe0\xf9\xad\x5d\x04\xcf\xf9\xba\xae\x79\x3f\xd1\x5b\xc1\x04"
- "\xcf\xbf\x4b\x54\xb6\xff\x7f\x81\xc3\xf9\x1f\x62\xf9\x0d\x4b\x5e"
- "\x8a\xc3\x74\xe1\x50\xd7\x73\x1c\x3b\x8e\xbb\x86\xe9\x1d\x4b\x5d"
- "\xc7\xf4\x8e\x71\x1d\x97\xe3\xd8\xa1\xe0\x5d\x7f\xdb\x9b\xb9\x1c"
- "\xc7\x8e\x51\x1c\xa6\x0b\xe7\xcb\xc7\xf4\xf6\x83\xae\x61\x7a\xc7"
- "\x61\x82\xe9\xed\x09\x04\xd3\x3b\xf6\x77\x4d\x8e\x63\xbb\x9f\x6b"
- "\x39\x8e\xc2\x51\x4a\x72\x1c\xb6\x98\x7e\x07\xb9\x9e\xe7\x78\x7b"
- "\xab\x6b\x98\x7e\x7b\x82\xeb\x98\x7e\xdb\xa7\xe3\xf2\x1c\x3b\x4d"
- "\xf2\x31\xbd\xb3\x94\xcb\x73\xbc\xed\xc5\x61\xfa\x1d\x7f\xf9\x98"
- "\xde\x99\xee\x1a\xa6\xdf\xce\x26\x98\xde\x19\x44\x30\xfd\xf6\xc6"
- "\xae\xc9\x73\x14\x1a\x5c\xcb\x73\xbc\xe3\xa5\x24\xcf\x61\x8b\xe9"
- "\xa2\x1a\xd7\x73\x1d\x45\x0b\x5c\xc3\x74\xd1\xfd\xae\x63\x7a\xd7"
- "\xc5\x8e\xcb\x75\xec\x3a\x29\x1f\xd3\xbb\xf2\xb9\x5c\xc7\x2e\x1d"
- "\x87\xe9\x77\x55\xf2\x31\xbd\x2b\xc2\x35\x4c\x17\x45\x11\x4c\xef"
- "\x52\x13\x4c\x17\x85\x76\x4d\xae\xe3\x9d\x72\xd7\x72\x1d\x45\x3a"
- "\x25\xb9\x0e\x5b\x4c\xef\xde\xed\x7a\xbe\x63\xf7\x38\xd7\x30\xfd"
- "\xf7\x2b\xae\x63\xfa\xef\x87\x3b\x2e\xdf\xf1\xf7\x22\xf9\x98\xfe"
- "\x3b\xef\xfd\x17\x7f\xe7\xad\xff\xdf\xdd\x20\x1f\xd3\x7f\x1f\xe1"
- "\x1a\xa6\x77\x8f\x26\x98\x7e\xb7\x99\x60\x7a\xf7\xf0\xae\xc9\x77"
- "\xbc\x5b\xe8\x5a\xbe\x63\xb7\xc3\xfd\x2f\xc4\xf2\x1d\xb6\x98\x7e"
- "\x3f\xd1\xf5\x9c\xc7\xfb\x3e\xae\x61\xfa\xbd\xe3\xae\x63\xfa\xbd"
- "\xec\x8e\xcb\x79\xbc\xb7\x5c\x3e\xa6\xdf\x0b\xe0\x72\x1e\xef\xf1"
- "\xe6\x3f\xbd\xff\xa9\x7c\x4c\xbf\xe7\xe9\x1a\xa6\xdf\xef\x45\x30"
- "\xbd\xa7\x94\x60\xfa\x7d\x8f\xae\xc9\x79\xec\x89\x73\x2d\xe7\xf1"
- "\xfe\x46\x25\x39\x0f\x5b\x4c\xef\x0b\x76\x3d\xef\x51\x7c\xd1\x35"
- "\x4c\x17\x6f\x75\x1d\xd3\xc5\x51\x1d\x97\xf7\x28\x9e\x28\x1f\xd3"
- "\xc5\xbe\x5c\xde\xa3\x98\xb7\xff\xfd\xbe\x2c\xf9\x98\xde\x5b\xe7"
- "\x1a\xa6\x8b\xcf\x12\x4c\xef\xcd\x27\x98\x2e\xae\xed\x9a\xbc\xc7"
- "\xde\x40\xd7\xf2\x1e\xfb\x6c\xe6\xbf\x2d\x89\x5a\x18\xa9\x5e\xf4"
- "\xea\xab\x4b\xa2\xe2\xd4\x4b\xe6\xcf\x7d\x25\x6a\xec\x60\xcb\xff"
- "\x63\x87\x27\x0c\x4e\xb8\x0b\x45\x2e\x98\x3d\x2b\xfe\x77\xdc\x87"
- "\xf3\xa3\x16\xc2\xaf\xbb\x50\xf4\xec\x25\xd1\xea\xb8\xe5\x31\x51"
- "\x6a\xfc\xdf\x82\x57\x62\xe0\x94\x45\x71\xdc\x91\x29\x51\xf3\x67"
- "\x27\xcc\x5d\xf8\x9a\x7a\xf6\xfc\xb9\xaf\x2d\x5c\x10\xb5\x30\x4e"
- "\x1d\x1b\xb5\x78\xe9\xdc\xd8\x28\xfc\xf7\x12\xf5\xab\x8b\x62\xe1"
- "\xc0\x2b\x51\x73\xe3\xa3\xd4\x73\x96\xbe\xfa\x6a\x54\xec\x92\xbb"
- "\xd0\xc4\xa5\xff\xaf\xbd\xaf\x01\x88\xaa\x4a\xfb\x3f\x73\xe7\xa2"
- "\x68\xc8\x8c\x04\x2e\xb5\x66\x93\x62\x8d\x8a\x8a\x8a\x8a\x86\x49"
- "\x45\x1b\x6d\x2a\xec\xbb\xd6\x4e\xad\x7c\x58\x6a\x58\x7e\xb0\x88"
- "\x4a\x7e\x00\x92\xf5\x57\x33\x40\x04\x5e\x5b\xf9\x70\x77\x6d\xff"
- "\xec\xfb\x5a\x62\x59\xa1\x69\x8d\x89\x1b\x19\x0a\xb9\xba\x4b\xbb"
- "\xb4\x4d\xa4\xc6\x1a\xea\x24\xa3\x0c\x30\x33\xe7\xff\x3c\xe7\xdc"
- "\x0b\x77\x86\x19\x05\x44\xb7\xbf\xdb\xd5\xc3\xbd\xf7\x9c\xe7\x3c"
- "\xe7\x39\xe7\xfc\xce\xef\x7c\xdc\x3b\xf7\x2c\x4a\x59\x98\xb4\x68"
- "\xbe\x2e\x72\xe6\x83\xa3\x67\x3f\xf2\xcb\xd9\xd3\xa7\xf7\x27\x8a"
- "\xbd\xa7\x75\x34\x2f\x3d\x01\x30\x24\x9e\x55\x7f\x30\xe2\x38\x20"
- "\xe2\x35\xc0\x66\x76\x32\xd1\x6e\x4c\x26\xe2\x86\x4b\xc4\xfb\xb5"
- "\x4b\xc4\x47\xf7\x3c\x89\xa0\x03\x5f\x37\x67\x5f\x22\xfe\x74\xd0"
- "\xd0\x5a\xba\xe5\x04\xa1\x03\x4f\x44\x98\x07\xee\x47\x3f\x2d\xdd"
- "\xb2\x5f\x8f\x61\x50\x17\x22\x84\x95\xd6\xab\xf7\x37\x98\x07\x7e"
- "\x50\x93\xfe\x2f\x22\x50\xdf\xdd\x07\xde\x72\x98\x85\x43\x29\x04"
- "\x0f\x15\x51\x97\x9d\x04\x67\x24\xea\x3d\x49\xe0\x32\xc0\x55\x82"
- "\x33\x83\xb3\x12\xf5\xdb\xf3\xc0\xed\x02\x57\x07\x0e\xfc\xde\x11"
- "\xc1\x69\xc1\x05\x82\x03\xff\x77\xaa\xc0\x41\xd8\x3b\x16\xae\xe7"
- "\x1d\x1b\x51\xef\x5d\x03\xae\x02\x1c\xc4\x7f\x17\xfc\xdf\xd3\x81"
- "\x03\xb9\xf7\x22\xc0\xcd\x01\x07\x3a\xdf\xdb\x00\x0e\xe2\x43\xb7"
- "\xca\xc2\xde\x4f\x05\xb7\x17\x1c\xe8\x78\x1f\xd2\x29\x0f\x02\x17"
- "\x06\x2e\x12\xdc\x0c\x70\x60\x5b\x39\xc8\x94\x6f\x26\xea\x7d\x60"
- "\xc3\x3e\x1f\x70\x21\xe0\x40\xcf\x3e\x48\x63\x7f\x14\xb8\x06\xc9"
- "\xe5\x80\xab\x50\xdc\x9b\x14\xd7\x6e\xdc\x07\x80\xeb\xbb\x4d\xc6"
- "\x91\x36\x68\xb7\x7b\xc6\xd9\x33\x89\xda\xbe\xe5\x83\x9a\xa4\x91"
- "\x44\x75\x4e\x5d\x66\xaf\x5e\x4f\x08\xd5\x9e\x20\xc6\x55\xad\x10"
- "\x5e\x66\xc7\x32\x6b\xce\x2a\xb3\x99\xc8\xd6\x28\x6c\x9f\xdd\xc3"
- "\x67\x99\x8d\xc7\xdf\x13\x6e\x52\x8d\x09\xc1\xf8\x34\x37\x6e\x0d"
- "\x4d\x37\x6c\xc7\xdf\xe1\x9e\xc5\x32\xc4\x76\x93\x13\x7b\x92\x6a"
- "\x0d\xb3\x91\x63\x8c\xab\xd0\xae\xb2\x53\xd0\xde\x7c\x21\xfe\x49"
- "\x0a\xf5\x68\x0e\x80\x3a\xcf\x24\x22\xbb\xdf\xb2\xdf\x4c\x77\x6c"
- "\x8a\xe2\xbc\xb3\x87\xcd\x5f\x5a\x02\x96\xe5\x60\x98\xf5\x8d\x19"
- "\x11\x74\x67\x5c\xad\x71\x49\x2b\x39\xad\xde\x73\x08\xf8\x4f\xa0"
- "\xf7\xce\x88\x70\x14\x2c\xcb\x29\x07\x0c\xa0\xcc\xbe\xb4\x06\x3c"
- "\xd7\x40\xbe\x05\x9a\x97\x62\xc0\x35\x20\x63\x5a\x2e\x70\x72\xd9"
- "\xa9\x96\x80\x4d\x21\xba\x9f\x6b\x68\x3d\xa6\x23\xe0\xf7\xd6\xf7"
- "\x48\xef\xf3\x97\x9d\x6c\x09\x18\x6a\x42\xdd\xf6\x1d\x9b\xcc\x10"
- "\x26\x52\xc0\x1e\xd8\xa0\xba\x00\xf1\xec\xf9\x43\x6b\x8d\x3f\xc7"
- "\x34\xdf\x8e\x05\x3b\x85\xf4\xc7\x40\xf7\xef\x37\x99\x77\xaf\xb2"
- "\x0a\x14\x6d\xf7\x1f\x5a\x0b\x58\xf7\xb1\x67\xbd\x55\xf8\xba\x1f"
- "\x11\x8b\x72\x09\x29\xf1\x23\xde\xcd\x59\x6f\xcf\x36\x89\x0f\xce"
- "\xe6\xbc\x57\x76\x52\x00\x19\x93\xfa\xed\x10\x0a\xf5\xc1\xd2\xca"
- "\x5b\x52\x73\x95\xb4\xde\x68\x4f\xab\x60\x49\x0d\xa6\xc5\xca\x87"
- "\x97\x15\xbf\x96\xf5\xec\x9c\x71\x35\x9b\x7f\x87\x3a\x20\xdd\x3c"
- "\xfa\xc7\x19\x66\x7b\xc1\x72\x33\x86\xa1\x3c\x2f\xff\xfd\x66\xcd"
- "\x3a\x62\xa1\xe0\x67\x97\xea\xc0\x8e\x75\x20\x64\x00\x7f\xed\x49"
- "\xc1\xf4\x20\xae\xc9\x9e\xa9\x23\xba\x9f\x13\xd2\xa8\x7e\x87\xad"
- "\x4d\x50\x6d\x7c\x24\xaf\xe3\x77\xa6\xa4\x56\x52\x07\x38\xfb\xd8"
- "\x4a\xa2\x32\xfe\x1c\xeb\xf7\x1d\x83\xee\x67\x7d\xa1\x9c\xdf\x79"
- "\xaa\xbd\x7c\xef\xd9\xd4\x00\x65\xa4\x85\x72\xf1\xb1\xbf\x72\x5f"
- "\x04\x15\x74\x04\xf3\xa1\x2c\x2f\xcc\x4f\x73\xd6\x3b\x1b\x5c\xca"
- "\x4c\xfb\xd8\x63\xe9\x54\xa1\xfb\x17\xca\xfc\x83\x7c\xb9\x49\x75"
- "\x5f\x2a\xca\xeb\x86\x32\xcc\x9d\xb2\x4b\xe1\x88\x7b\xac\x67\x1a"
- "\x90\x9e\x80\xf7\x4f\x8c\x20\x5a\x4d\x25\x11\x74\x69\x41\xe5\x1c"
- "\x0f\x29\x06\xc8\xdb\x4e\xae\x0f\xf2\x58\x90\x50\x0a\x71\xf5\x1d"
- "\xf8\xdb\x1b\x6a\xdf\x12\x1f\xde\x12\xb0\x5c\x6b\xcd\x5f\x5c\x43"
- "\x73\xe2\xc3\xf1\xf7\xe7\xf5\xea\xbd\xa3\x59\x19\x64\x7a\x13\x6e"
- "\x47\x7c\x44\xda\x22\x6a\x4e\xfb\x1e\xd2\x1a\xb4\x5c\xbb\x6f\x85"
- "\x19\xea\x6c\x71\x0d\x62\xa2\xfc\x8a\x55\xc0\x6f\x02\x52\xdf\xb7"
- "\x3e\x2c\xe6\x79\xf5\x86\xbc\x12\xd4\xdb\x9c\xb5\x37\xa5\x23\xaf"
- "\x7b\x03\x11\x1f\x90\xc6\x6c\x9e\x36\xe8\xcd\x84\x34\xb6\xc4\xcf"
- "\x06\xb9\x42\x93\xea\x2f\xac\xff\xa4\x2b\xe8\xc9\xec\x56\x42\x9a"
- "\x56\x50\x5b\xb4\xed\x2b\x07\xf4\xcb\x04\xc2\x0f\x98\x48\xa4\xb7"
- "\x5c\x66\xbc\xcd\xb5\xeb\x61\xdf\x8a\x30\x0f\x64\x7a\x4e\xbb\xd3"
- "\x03\x69\xef\x8a\xb7\xe9\x54\xad\x57\x68\x4d\xf6\x93\x60\x5b\x26"
- "\xa1\xad\x2b\x68\xd5\xda\x28\x6a\xcd\x3a\x41\x60\x6c\x54\x47\x80"
- "\x6b\x07\xfb\xaa\xa8\x39\xfa\x45\xa2\xf1\x4d\xd2\xd0\x4f\x2b\xeb"
- "\xc8\xea\x28\xda\x50\x9d\x6a\x27\xc7\x2d\xa7\xc9\x9a\x2f\x88\x4f"
- "\xfa\x31\xe2\xbf\x26\x8a\x9a\xab\x12\xea\x08\xf7\x3f\x46\xd2\xbf"
- "\x26\xe2\xea\x0a\x6a\x9d\x05\xfd\xf4\x67\x75\xe8\x7f\x1a\xfc\xed"
- "\x24\xbd\x81\xda\xd2\x62\x89\x0f\x5e\x1f\xab\x40\xff\x33\x04\xda"
- "\xb3\x18\x9d\x6a\xd6\x14\x43\x9a\x18\xbf\x04\x6c\x71\x5c\xa1\x07"
- "\xb2\xaf\x10\xb2\xfa\x29\x12\xb8\x66\x2e\xd1\x46\xc3\x70\xa1\xda"
- "\xf6\x2e\x89\xb6\x53\x18\x07\x1c\x21\x6b\x17\x12\xef\x68\x1b\xfe"
- "\x7e\xfc\x14\xb8\x22\x52\x02\xb2\x90\x37\x23\xe6\x6d\xf5\x97\x30"
- "\x2e\x3a\x2f\xc7\x39\x28\xc5\xf9\x92\x60\x99\xb5\x0c\x3c\x11\x62"
- "\xdd\x72\xa2\x0c\xf2\x5e\x86\x65\x00\xe9\xd4\x38\x30\xde\x15\xd6"
- "\x3f\x61\x19\xa8\xe2\x6d\x80\xd5\xfc\x45\x65\xf1\xa9\x46\xa6\xd7"
- "\xa4\x7e\xb7\xb1\x24\x99\xd9\xe4\x24\x1b\x6d\xa3\x4d\xe6\x80\x45"
- "\xa0\xeb\x3d\xff\xe8\xd4\xe9\x54\xaa\xb7\x98\xe6\xac\xf7\x66\xcb"
- "\xe5\x2d\xd7\x0b\xc8\x44\x41\x5d\xc4\xa8\x93\x88\x08\xe1\x29\x26"
- "\xd5\x5f\x77\x28\xb0\x8b\xbc\xd5\x47\x96\x95\x64\xb6\x99\x54\x27"
- "\x1b\x3a\x64\xf6\xe0\x58\xa5\x5d\x06\xc2\x01\xff\xa7\xcc\x1d\xe1"
- "\x0c\xcf\xed\xe1\x52\xff\x2b\xeb\x56\x03\x0f\xeb\xed\x01\x29\x09"
- "\x34\x60\x58\x12\x6d\x0a\xf4\xa1\x02\xd4\x8d\x8d\x5a\x1d\xf9\xf1"
- "\x65\xd0\xc7\xfa\x54\xdb\x2c\x84\xcb\xbf\x1f\x4b\xf3\x87\xa5\xf2"
- "\x77\x5e\xdf\x7f\x04\x75\xc2\x58\x4c\x0b\xfd\xb5\x36\xba\x92\x5a"
- "\x91\x3f\xec\xf9\xa3\xcc\x59\xc9\xd0\x67\xe7\xa7\xc4\x38\x02\x96"
- "\x26\x58\x7f\xb7\x29\x02\xfb\x04\x6c\x6f\x34\x0f\xe2\x4a\x7a\x20"
- "\x5d\x2f\x93\xfa\xfd\xc1\x76\x88\x4f\xf3\xe2\xcb\xb8\x3f\xe7\x37"
- "\xce\x43\xef\x0f\xa6\xc3\x21\x2c\xc7\x10\x0c\x61\x5e\xf5\xea\xf7"
- "\x4b\xc1\x9f\xc0\xfd\x3c\x63\xda\x25\xd4\xf1\x26\xc7\xb4\x41\xef"
- "\x74\x2f\x60\x79\xbe\x6d\x45\x8e\x42\x6e\x02\xff\x63\x1d\x3c\xc1"
- "\xfb\x00\xce\xed\xf1\xc6\xe6\xac\xf7\x4d\x26\xd5\xb8\x5d\x58\x4e"
- "\x58\xb7\x16\xce\x6b\xa7\xed\xbf\xdb\x14\x75\x38\x8a\x90\xc3\x15"
- "\xd8\x8e\xca\x45\x93\x6a\x82\xb1\xa3\x2c\xcb\xef\x42\x59\x66\x27"
- "\x70\x09\x5e\x33\x5e\x81\x38\xd0\xce\x91\xbf\x44\xce\x8f\xe5\x81"
- "\xd8\x6f\x01\x9f\x24\x4a\xfd\x54\xa5\x49\xfd\x8e\x37\xf5\xdb\xaa"
- "\x05\xbb\x32\xea\x25\x5b\x94\xb6\xc9\xbc\x48\xb7\x6c\xcd\xe1\xb2"
- "\xf1\x06\x48\x7f\xbd\x49\x15\xba\x4d\x89\x17\x9e\xaf\xf2\xf3\x80"
- "\xe9\xda\xb1\x15\x70\x0f\x63\x29\x59\x1f\xf0\x8b\x37\xf0\xca\x5f"
- "\x11\x6f\xc8\x29\xdb\x72\x71\x7c\xb4\x75\x9b\x75\xcb\xd6\x1d\xa0"
- "\xab\x46\xe6\x16\x8c\x8b\xed\x01\xf8\xc5\x9b\xf1\x86\xdd\xa6\x66"
- "\x6d\xde\x4e\x82\xdb\xb9\x04\xfc\x5a\x06\x6e\xdd\x26\xf9\x8b\xcc"
- "\x26\x41\xed\x80\xf4\x55\x72\x7a\x2d\x03\xe3\xa3\x9a\xb3\xf6\xe9"
- "\x4d\xaa\x7b\x76\x3a\x71\x4d\xee\xec\x4a\x4a\x0d\x88\x1b\xf5\x59"
- "\xf5\xbe\x99\x70\xee\x2b\xe1\xf4\xb6\xc3\x95\x84\x44\x3e\x02\x69"
- "\x40\x7d\xbe\x3e\x88\x9a\x21\x7e\xa2\x89\xfc\xc6\x07\xe3\x6f\x84"
- "\x7b\xf4\x47\x19\xf0\xcf\x00\x7f\x1b\xd7\xbb\x27\x05\xeb\xc7\x45"
- "\xef\x9b\x5c\xef\xbe\x3d\xa8\x4f\xea\xe3\x6f\xc3\x6b\x8c\x8f\xba"
- "\x8b\x0a\x68\x23\xea\x03\x5d\x55\x72\x1a\xaf\x81\x9f\x9c\x4e\xe4"
- "\xe2\xf6\xb4\x1a\x21\x7c\xbd\x32\x0f\xdb\x0a\xa8\x85\xdb\xb7\xdf"
- "\xdb\x44\x5e\x66\xed\x69\x03\xf8\x61\x5c\x8e\x85\xfd\xc3\x11\x27"
- "\x26\x9e\x2f\x35\xc7\xcb\xfe\x50\x13\x59\xef\xd4\xf7\x40\x5d\x0c"
- "\x90\xfb\x26\x49\x9f\x41\xd6\xd7\xa1\x8b\xeb\xa0\x39\x79\x39\x52"
- "\x5b\xc0\x36\xeb\x83\xfa\x41\x7e\x83\x89\x2c\xab\xe2\xb6\xbd\x6d"
- "\xb5\x70\x6c\x43\x1d\xb0\x38\xbc\xce\xb3\xde\x3a\x8d\xfd\x66\x49"
- "\x2e\xf2\x58\x7c\x24\xc4\x39\xe0\xd2\x67\x7a\x83\x7f\xa8\xa4\xaf"
- "\x16\xea\x6b\x9e\x33\x07\x61\x5f\x97\x92\x81\xb8\x91\xb8\xc1\x8e"
- "\xf6\xca\xe1\x90\x86\x08\x69\x5c\x41\xbc\x63\x1a\xf6\xfc\xc5\x11"
- "\xcd\x59\x1f\xe8\x5c\xd2\x10\x51\xce\x9e\xb5\x7b\x14\xf6\xdf\x5b"
- "\x07\xd1\x06\x90\x89\x94\x65\x30\x1c\xca\xfc\x01\xf0\x83\xfc\x6f"
- "\x59\x83\x7e\x59\x20\x63\x52\xef\xf6\xf8\x9b\x9e\xb4\x7b\x88\x50"
- "\x5d\x68\xc2\xf9\x2e\xb6\xed\xf0\xea\xc1\x16\x52\x5d\xe8\x20\x8e"
- "\x3f\xce\x4c\x8a\x48\xa3\x46\x98\x43\x9c\x3a\x6e\x6d\x20\xdd\x1b"
- "\xa3\x7e\xb0\x83\x61\xb4\x15\xe6\x65\x6b\xc6\x13\x1c\xb3\x5c\x50"
- "\x1f\xf4\xaa\x36\x5f\x62\x3c\x77\x41\x7d\xe0\x7b\x0c\xdf\x0a\xf3"
- "\x38\x9c\xcb\xc1\x7c\x3d\x31\x47\xe0\xf3\x39\x07\xc8\x16\xa3\x3f"
- "\xce\xf5\xa0\xff\x2a\x51\x84\xd1\x3f\x3e\x6e\xe6\x65\x77\xe0\x20"
- "\xe3\x7b\xb4\xd7\xf6\xa8\x11\x6d\x76\xec\x7c\xdc\x8c\x79\x48\x4f"
- "\xa5\x8e\x6a\x5b\xb3\x11\xfb\x38\xdd\x0a\x9c\x87\x1e\x78\x3d\xba"
- "\x88\x50\xc7\x1b\x8f\x9b\xbb\x97\x87\x03\xec\xf9\x37\xcc\xd5\x2f"
- "\x98\x87\x3f\x6e\x4e\xb7\x13\x21\x3b\xcd\xcb\xfb\xe1\x42\x6a\x6c"
- "\xba\x77\x66\x52\x73\xd6\x81\x03\x87\x52\x09\xe9\xfe\xf8\xfd\xc0"
- "\x01\x39\xef\xc5\x52\xde\xc1\x6f\x30\xfa\x8d\xdd\x96\xc1\xf2\x0b"
- "\xf7\x1e\xdf\xf5\xa3\x99\x1a\x7a\xb8\xd0\x46\x96\x15\xd2\xd6\x65"
- "\x45\x44\xb0\x17\xcc\x0d\xd9\x5d\x5c\x8b\x9c\x1e\x21\x97\x27\x2b"
- "\x3b\x9b\x99\x24\xa5\x11\xed\x39\xf5\xc1\xa2\xe8\x35\x19\x6c\x5f"
- "\xa7\x8f\x40\xae\x7b\xb6\x1e\x64\x63\xf5\xe3\x30\xf7\x8f\xb6\xa5"
- "\x53\xde\x2f\x1d\x3c\x32\x4b\xd2\x87\x61\x72\xfd\x15\x4b\x73\xf2"
- "\x1e\xa4\xe1\xf1\xf7\x2f\x57\xc9\xab\xd6\x7d\x5e\x3f\xdc\xd8\xf3"
- "\xbc\x7e\x38\xbb\x73\x5e\x3f\xdc\xd3\xbb\x79\xfd\xb0\xbc\x07\x79"
- "\xd5\xb9\xcf\xeb\x47\xcb\x7b\x9e\xd7\x8f\x22\x3a\xe7\xf5\xa3\xa2"
- "\xde\xcd\xeb\x47\x1e\x7f\xff\x79\x95\xbc\x86\xb8\xcf\xab\x71\x6e"
- "\xcf\xf3\x6a\x0c\xee\x9c\x57\xe3\xc6\xde\xcd\xab\x31\xc7\x63\x5e"
- "\x05\x0d\x45\x7e\x02\x5e\x6a\x4d\x6b\x81\xf1\x5c\xc1\x4a\xb2\xf6"
- "\x77\x44\xa8\xb2\x58\xc9\xf1\xc1\xb5\x24\xfd\x45\x22\x8c\x49\x02"
- "\xde\xcb\x24\xe1\xb4\x60\xa8\xf9\x78\x61\x23\xf8\x9f\x25\xc7\x52"
- "\xad\x24\x22\x19\xf9\xf7\xd0\x13\xd5\xf3\xba\xcb\xbf\x87\x74\xed"
- "\xfc\x6b\x1b\x2f\x71\xee\xc7\xeb\x8e\x37\xb6\x12\xcc\x3f\x5c\x2f"
- "\x6e\xe7\xdf\x4c\x5e\xde\xae\xfc\x8b\xe5\x51\x6d\xb5\x3a\xf1\x2f"
- "\xff\x6d\xd7\xc7\x53\x5c\xb9\x37\xeb\x1c\x21\xee\xb9\xf7\xe3\x00"
- "\xe4\xde\x62\x08\xef\xa6\xfd\x26\x99\x7b\x73\x20\x4d\x25\xf7\x1e"
- "\x9e\x87\xfd\xeb\xc7\x61\x3d\xe3\xde\x8f\xc3\xe4\x7c\x17\x49\xf9"
- "\x86\xb4\x0a\x9d\xb9\xf7\xe3\xa4\xae\xe0\x96\x16\xcc\xd1\xee\x1e"
- "\x62\xf5\x72\xec\x9c\x15\x82\xfd\x5b\x33\x94\xc9\xfb\xc5\x56\x11"
- "\xf2\xcc\xf7\xea\x68\x9e\xa7\xa2\x3b\x67\xd4\x46\xa7\xd0\xaf\xe8"
- "\xf0\x59\x21\xb8\xbe\x8a\xeb\x04\x67\xd5\x87\x87\xc3\x98\xbe\xb6"
- "\x9b\x76\x9b\xa5\xfe\x2f\x29\x0d\xda\xcb\xee\x15\x56\xc1\xb1\xda"
- "\xa0\x81\x7a\xd0\xd2\xfc\x84\x18\xfa\xca\x64\x6d\x53\xfe\x72\xe3"
- "\x11\xfd\x19\x82\xb2\x74\x9d\x18\xd1\x73\xfb\x0f\x97\x5d\xc3\xfe"
- "\x33\xdd\xb7\x9f\xeb\xec\x9a\xfd\x87\xcb\xba\x64\xff\x20\xb0\xbf"
- "\x35\xcc\x0b\xe6\x8b\xc2\x47\xad\x61\x62\xf7\xec\xa9\x88\xe8\x52"
- "\x1d\x5f\x5f\x1a\x5d\xe6\x3f\x3a\x68\x71\xcc\xee\x62\xb3\x00\x1c"
- "\xc0\xfa\x70\x6c\x7b\x9c\xff\x1a\x80\xb3\xbe\xa2\x9c\x93\xcc\xdd"
- "\xe4\xa4\x23\x1e\x7f\xff\xd2\x39\xfd\xb9\x65\x37\x20\x7d\xcf\xf9"
- "\x77\xe5\xc4\xb7\xe2\x63\x3c\x73\x62\x42\x59\x67\x4e\xfc\xf3\xc2"
- "\xee\x73\xe2\x9f\x43\x3b\x73\xe2\x27\xf9\x1d\x9c\xf8\xc9\xba\x9e"
- "\x73\xe2\x27\x33\xbb\xce\x89\x9f\x8c\xe8\x19\x27\xfe\xd9\x72\x75"
- "\x4e\xfc\x64\x46\xcf\x38\xf1\x93\x19\x9d\x39\xf1\xcf\x65\xce\x9c"
- "\xf8\x89\xc7\xdf\xba\xd2\x9c\xc8\x1c\xe8\xa3\x7d\xce\xa9\x2b\x67"
- "\xdb\x32\x09\x71\xe4\x7c\xd4\x10\x6d\xa7\xcd\x74\x4b\x64\x8e\x43"
- "\x08\x45\x5e\x89\x68\x6e\x4e\xf4\x76\xac\xd4\xfb\x50\xbf\x5f\x9d"
- "\xa0\x6d\x81\x04\xca\x29\x08\xec\xd7\xd0\x66\xbd\x2f\x5d\xa9\xf7"
- "\x2b\xbc\x42\xfc\xc1\x05\x16\x4a\xfd\x31\x5c\x87\xd0\x95\x81\xfd"
- "\xb3\x56\x90\x60\x8d\x85\x78\x83\x0d\x06\xcd\x3a\x2d\x01\x0e\xf2"
- "\xc7\x6b\x9a\x79\x58\x2c\xb9\x42\x44\x4d\x2a\xd4\xcd\x40\x48\x2f"
- "\x55\x43\xe9\x32\x3d\x29\x49\x26\xde\x0e\x81\x04\x16\x0b\xb4\xcc"
- "\xd6\xac\x17\xec\xfe\x29\x49\xbc\x7e\x3e\xf5\xa6\x83\x60\xee\x95"
- "\x97\x12\xee\x18\x94\x12\x64\x4f\x4f\x54\xd3\xd5\x06\x35\xda\x6a"
- "\xcf\x4b\xd1\xd1\x02\x70\xe9\x89\xbe\x38\x86\x2e\x59\x01\x69\x37"
- "\x07\xf6\xcf\x86\xb4\x8b\x57\x90\xa0\xa2\x2b\x44\x4f\x9b\xf4\x02"
- "\xd4\xbf\x01\xf7\x47\x85\x32\x32\x38\x84\xc3\x22\x84\x89\xc8\x89"
- "\x14\xd3\xb7\x41\xfa\x6d\x7a\x5c\xe3\x02\x6c\x93\xc0\x12\x48\xdf"
- "\xbe\x52\xdf\xcd\xf6\x52\xc9\xe7\xf5\x92\x5d\x8e\xe0\xe7\x62\xe8"
- "\x5b\xe0\xd0\x2e\x28\xc3\x12\x2c\x93\x31\xcf\xcd\x46\xdb\x5e\xbb"
- "\x42\x82\xc1\xce\x20\xb0\x41\x0f\xe9\xe2\xb7\x65\x0c\x71\xbf\xd1"
- "\x22\x46\x9d\x6c\xb3\x6f\x91\x6c\xbb\x08\xb6\x5d\xe8\xb0\x0d\xd3"
- "\xc2\xf2\xf1\xf4\xdc\x36\x7a\xed\x10\x6c\x9b\xdf\x6a\x52\xfb\x46"
- "\xe1\x33\xdc\xa6\xd5\x89\xdd\xc4\xea\xa7\x3b\x3c\xe1\x25\xfb\x2d"
- "\x32\x98\x6a\xf7\x07\xce\x7a\xf9\x2b\x8a\x6b\x88\x2f\xbf\x45\x82"
- "\xab\xa1\x5d\x1f\xb7\x9e\x27\x74\xe0\xfe\xc0\x23\xfa\xc6\x6e\xa6"
- "\x75\xd4\xe3\xfb\x6f\x9b\x32\x69\x4d\x5b\x10\xae\x7f\x2d\x2f\xcf"
- "\x16\x68\x6a\x6b\xd0\x0c\xd3\xd1\x93\xad\x24\x3e\x15\x9f\x13\xd3"
- "\x54\xdd\xd3\xc4\xbb\x5e\x5d\x63\x4c\xff\x02\x9f\x69\x1d\xcd\x71"
- "\x7e\xa6\x75\x74\x2f\x51\x57\x19\x88\xfa\xd8\x06\xa2\xae\xd6\x12"
- "\x90\x73\x71\x51\xd1\x7f\x1a\x42\xd2\x6c\xf4\x5b\x9a\x17\xa4\xcf"
- "\x12\xa8\x35\x7a\x84\xca\x64\x5c\x81\xcf\x78\xaa\x7e\x01\xe5\xf7"
- "\x1d\xf4\xab\x1a\xbc\x46\x7d\x49\xc9\xe4\xf6\x73\xea\xaa\x18\x8d"
- "\xa5\x6f\x94\xcd\x7f\xb9\xc9\x46\x0d\xa4\x4d\xb7\x29\xa2\x25\x2f"
- "\x25\xa6\x0d\xd7\xe7\x9e\x41\x0e\xfa\xec\x31\x8d\x2a\x83\x50\xa8"
- "\x7f\x4a\x03\xf1\x39\xa7\xa1\x10\x1c\xd6\x25\xab\x47\xbf\xd8\x35"
- "\x58\xdf\xd8\x16\x4a\xb8\xbf\x16\xdb\x43\xb6\xd4\x6e\xcc\xea\x91"
- "\x09\x76\x81\x10\x3b\xc4\x4f\x3f\x43\x06\xe3\xbe\xb8\x45\x20\x17"
- "\x6f\xf7\xc6\x76\x6c\x30\x3e\x7d\x82\x9c\x4d\x22\x42\xfa\xf7\x64"
- "\x00\x60\x82\xb5\x47\x07\xb4\xc7\xe8\x3a\x8d\x15\x78\xc5\x91\x76"
- "\x99\x68\x90\xa7\x70\x8f\x99\xea\x46\x13\x71\x5c\xd4\xfb\x6e\x5f"
- "\x42\xfc\x6d\x17\x13\xfd\xcc\x17\x13\x6f\x7f\xdd\x41\xfc\x7d\x93"
- "\x88\xb6\x68\x09\x60\x71\x29\xb4\xcf\x0b\xd0\x3e\x1b\x79\xfb\x94"
- "\xf1\x47\x37\x7d\x5f\x87\xbf\xfd\x67\x6d\x73\x8b\xd4\x36\x57\x02"
- "\xfe\x56\x74\xe0\xcf\xb6\x54\x2f\x14\x09\x94\x80\x8d\x50\xee\x9f"
- "\x66\x94\xa4\xf5\xf5\xc6\x35\x4a\x7a\xef\xac\x1a\xe0\x7c\xc8\x2b"
- "\xb5\xed\x86\xba\xf0\x1a\x21\xe8\x68\xfe\x72\xd3\xd1\x98\x06\xd2"
- "\xb1\x6e\x52\x73\xa8\x75\xf8\x0c\x93\xee\xbf\xe8\xc5\x7a\x75\x55"
- "\x14\xf8\x7b\xeb\x9e\xbc\x4f\x0b\xf5\x78\x88\xaf\xb3\xd4\x18\x71"
- "\xcd\xd4\xa4\xae\x1a\x0c\xba\x08\xbe\x3b\xf0\x19\x7b\x2e\x77\x0c"
- "\xd7\x5e\x88\x1d\xca\xdc\xe6\x3f\x2c\xd5\xe1\x9f\x92\x61\x7c\xbe"
- "\x95\xf1\x55\x1b\xd4\xc1\xd9\x45\x44\x88\x6f\x84\xb2\xb1\x43\xd9"
- "\x34\xeb\x7d\x80\xb7\x62\x90\xb7\x68\xce\xaf\xaa\xd6\x98\xa8\x23"
- "\x7a\x9e\x9a\x42\xb9\x78\xe3\x1a\x79\x5c\x12\xa1\x6b\xcf\x43\x19"
- "\x59\x6a\x09\xe4\xcd\x17\xb8\xcd\xaf\x68\x05\xf1\xdf\x0e\xe5\x33"
- "\xa0\x11\xc6\x34\xb9\x1f\x98\xde\x4a\xab\xf4\xb2\x03\xce\x91\xc7"
- "\x34\xeb\x54\xfd\xa0\xae\x7c\x37\x63\xbb\x85\x76\xac\x59\xc7\x78"
- "\x95\xd5\xad\x6d\xa5\x7e\x68\xdb\x4a\xbd\x0e\xdc\x10\x99\xeb\x64"
- "\x9e\xa1\x59\x9f\x36\x20\xcf\x55\xa7\x9a\x88\x0d\xca\xd2\x17\xfb"
- "\xc4\x95\xfa\xc1\xac\x4c\x9f\x83\x32\x5d\x40\xbc\xc7\x5a\x89\x0a"
- "\xec\xd2\x82\xcd\xe4\x58\x62\x3d\x72\x6b\xa0\x1d\xda\x11\x96\x33"
- "\xe8\x14\x28\x60\xcd\x91\x37\x2c\x75\xe6\x42\x1d\x39\xa2\x3f\x45"
- "\xf0\xfb\xb2\xe9\x2d\xf4\x6b\x7c\x2e\x58\x9d\x6a\x23\x34\x60\xb9"
- "\x89\xb2\x35\xd6\x2a\xdd\xd1\x18\x2b\xf1\x8c\xe9\xea\x7e\x1d\x98"
- "\xae\xee\xd7\x81\xe9\x6a\xb6\x07\xbb\x12\xd7\x2d\x3b\x00\xd7\xfe"
- "\x4a\x5c\x1f\xbf\xe7\x86\xe2\x7a\x56\xf7\x71\xfd\xfa\x05\x05\xae"
- "\xd3\xfe\x3d\xb8\xfe\xcc\xc0\x70\xad\x6e\x1b\xce\xf0\x1a\x54\x6d"
- "\x7b\x1b\xc6\xbf\xc7\x2d\x32\x6e\x3f\xfd\x1f\xc4\x6d\x4d\xd8\x0f"
- "\x15\xb7\x2d\xcd\x7a\x1d\xb8\x5e\xc7\x2d\xe8\xec\x32\x6e\x3f\x33"
- "\xb4\x12\xb9\xfc\x10\xbf\x34\x67\x7f\xa0\x2e\x9d\x4c\x87\x72\x33"
- "\x6a\xd6\x0d\x21\xc7\x78\x19\x1a\x75\x4f\x52\x07\x70\x04\xfb\xd6"
- "\x48\x6b\x26\xa5\x0e\xff\xa5\x09\xe9\x9f\x13\xad\x23\x6f\x94\xb9"
- "\xda\xf6\x26\xd1\x24\x11\x11\x9f\xc7\xd2\x81\x27\x4a\x61\x1e\xce"
- "\x9e\xd5\x3a\xb6\xec\xd7\xe3\xf3\x4c\x7c\x86\x62\xcf\x4f\x4f\x70"
- "\x6c\x79\xdd\xec\x18\x78\x82\xd0\x2d\x27\x22\xf0\x19\x6e\x73\x56"
- "\x8d\x51\x7e\x86\xef\x76\x6c\xe4\x9f\x9e\x00\xed\x05\xe6\x54\x27"
- "\xa6\xc0\x59\x38\xab\xfe\xfc\x29\x38\xab\xe1\xcc\xf6\x31\xee\x5e"
- "\x3f\x57\xc3\xf7\x5a\xca\x5b\x6e\x91\x78\xf0\x32\x6b\x83\x23\xc9"
- "\x80\x73\xd2\x75\x73\xd6\xe7\x31\xf2\x3b\x01\xed\xf2\x1d\xe5\xd1"
- "\x88\x69\x43\x99\x88\xfc\x3d\x05\x7e\x8f\xef\x00\x49\xfa\xd8\xbd"
- "\x23\x28\xae\xd6\x98\x56\x4f\x1a\xd5\x9f\x1f\xa8\x86\xbe\xdf\x51"
- "\xb0\xdc\x82\xcf\xdc\x10\xf7\x72\xba\xbe\x50\xdf\xc6\x55\x4c\x86"
- "\x7d\x8f\xd8\x91\xb7\xc8\x48\x0b\x86\x99\x71\x0e\xd9\x4c\x13\x1f"
- "\x90\xce\xd3\x10\xdb\x7c\xbd\xe5\x44\x3f\x0a\xe5\x87\xfb\xc2\xb7"
- "\xbf\x17\x85\xfb\xb5\x67\x88\xba\x43\x6b\x78\x7f\x2b\xdb\x8b\x7b"
- "\xba\xe3\x7b\x47\xf7\x65\x90\x8c\x66\x37\x7b\xba\x77\xbc\x9f\xf4"
- "\xb9\xc5\x91\xbf\xc8\xd8\x9c\x75\x22\x12\xc6\x00\x33\x94\x79\x76"
- "\x57\x17\x26\xf5\x89\x04\x4f\x61\xdd\xab\x87\x13\x6b\x3c\xe9\x79"
- "\x44\x6f\xa7\xdd\xd4\x55\xe9\x71\x5c\x1d\xf4\x78\x52\x74\xa9\xdd"
- "\xe8\x68\x33\x68\x8e\xac\x39\xdf\xcd\x31\xd1\x5f\x74\x9e\xf4\xda"
- "\xf3\x96\x66\xd8\xee\x05\xdd\x23\x86\x10\xfb\x52\xc3\xa3\xf8\x0c"
- "\x04\xc7\x7a\x6b\x17\xf2\x77\xd9\xaa\x4a\x6d\x04\xc7\x7d\x7f\x5a"
- "\x52\x29\xb4\xb6\x19\x88\xaf\x99\x68\x67\x59\xd2\x69\xf6\x05\x12"
- "\x44\x57\x1a\x34\x9b\x2f\x90\xf0\xb6\xa6\xc0\xfe\xaf\x26\x13\xb1"
- "\x15\x38\xb9\x75\x59\xa2\x06\xdf\x9b\xfb\xf0\x9c\x51\xa8\xb6\x95"
- "\xe3\x38\x33\x08\xfb\x01\xb4\xdd\xde\x64\xf0\xdd\x78\x09\x9f\x13"
- "\x5f\x26\xc6\x67\x7e\x0f\xfd\xc0\xc9\xd1\x5e\x6b\x81\xfb\x80\xbb"
- "\x58\x7f\xd0\x83\xbe\xa0\x15\xfa\x82\x99\x06\x6a\x3d\x5e\x7b\x02"
- "\x9f\x5d\x6b\xd3\x97\x93\x01\xa8\x1f\x9f\x35\xb3\xfe\xe1\x09\xe8"
- "\x1f\xe0\x1e\xe6\x12\xed\xfd\x83\x6e\x16\xe9\xd4\x3f\xe0\x3c\xe4"
- "\x78\x5d\x03\x01\x2c\xf7\x9d\x65\xd1\x58\xd3\x2c\xd4\x81\x73\x92"
- "\x6a\xdb\x79\xfc\xbe\x91\xaf\xdc\x57\x60\x3f\xd1\x2a\xf5\x13\x45"
- "\x52\x3f\xf1\xdb\x5e\xe8\x27\x7e\x8b\xfd\xc4\x29\x22\xbc\x8e\x7d"
- "\x04\xf4\x0f\xff\xfb\x4f\xb3\xd0\x06\x7d\x42\xf7\xea\xf9\x94\xb7"
- "\x47\xfc\x14\x2c\x3f\xec\x80\xbe\x18\xeb\x79\x35\xd4\x2f\xd6\x73"
- "\xb5\x1e\xea\xb6\xb6\x6f\x54\x0b\xf8\xdb\x0a\xe6\x84\x94\x9e\x35"
- "\x0b\x34\x2f\x21\xa6\x05\xf0\xb0\xea\x32\x11\x6c\xfe\x4b\x33\xde"
- "\x7c\x32\x47\xc0\x79\xab\x23\x7f\x4e\x0a\x9f\x23\xff\x6d\x2d\xae"
- "\xd1\x68\x1a\x88\x16\xd7\x4f\xed\xd4\xa0\x71\x7c\x67\x18\xe0\x78"
- "\x21\xd0\xbb\xed\xbb\xc0\xfe\x9b\x9e\x27\xa2\xf9\x85\x44\x4d\xfa"
- "\x53\x44\xfb\xd1\x5f\x73\x84\xe3\x16\x68\xdb\x7d\xbe\x3e\x40\x41"
- "\x7f\x49\x3d\x09\x2b\x79\x86\x84\x16\x9f\x25\xba\xe2\x05\x24\x78"
- "\xfb\x59\xc0\xd0\x0b\x06\xdf\x36\x86\x8f\x16\x23\x7b\x2f\x60\x01"
- "\x89\xa0\x83\xe2\x43\xe0\x1c\x96\xb3\x00\xe6\x33\x83\xe6\x84\xd0"
- "\x80\xa5\x19\x0e\x90\xdb\x0c\x73\x37\x18\xa3\x83\x0d\x7f\x9d\xef"
- "\x0e\x37\xdb\xbb\x39\x86\x98\x19\x03\xb8\xa9\x01\xdc\x7c\xef\x8c"
- "\x1b\x9c\xb7\x32\xec\xcc\xe4\xd8\xc1\x67\x7e\x25\xca\xf1\xc5\x33"
- "\x47\x7b\x8c\x9f\x42\x18\x3f\xb7\xb8\xe0\xa7\xf0\xc2\xf5\xe1\xa7"
- "\x0d\xf0\x53\x98\x09\xf8\x39\x46\x84\x6d\x8e\xeb\xc1\xcf\xdf\xd8"
- "\xb7\xe7\x70\x9d\x8f\xbf\xc3\x74\xea\x0d\xac\x67\xc0\xd5\xce\x27"
- "\xf4\x2a\xd2\x43\x5c\x95\x5d\x03\x57\x16\x8e\xab\x2f\x4e\x75\x1f"
- "\x57\xf5\xfe\x80\xab\xb2\xab\xe3\xea\xb2\x27\x5c\x95\x75\xc6\x55"
- "\xed\xc1\x9b\x8b\x2b\xf6\x3d\xd1\xff\x00\x5c\x7d\xb1\xc3\x19\x57"
- "\x7f\xb3\x73\x5c\xfd\xcd\xd6\x73\x5c\xc5\x5e\x83\xaf\x62\x25\xbe"
- "\xaa\x1b\xdd\x03\x5c\x2d\xa2\xa0\xff\xea\xb8\x3a\xef\x01\x57\xb1"
- "\x6e\xf8\xea\x1f\x01\x37\x17\x57\xec\x7b\xa7\xff\x01\xb8\xfa\x87"
- "\xd5\x19\x57\x7f\x7f\x82\xe3\xea\xef\xb3\xaf\x03\x57\xd7\xe0\xab"
- "\x58\x89\xaf\xfe\xf9\x72\x0f\x70\x55\x01\xb8\xba\x06\x5f\x7d\xe9"
- "\x09\x57\x6e\xf8\xea\xcb\xc5\x37\x17\x57\xec\x7b\xac\xff\x01\xb8"
- "\xfa\x67\x8c\x33\xae\xea\xde\xe4\xb8\xaa\xdb\xd5\x73\x5c\xc5\x5d"
- "\x83\xaf\xe2\x24\xbe\x32\x7d\xd9\x7d\x5c\x7d\x33\x98\x82\xfe\xab"
- "\xe3\xea\xa0\x07\x5c\xc5\xb9\xe1\xab\xaf\x8e\xdc\x5c\x5c\xb1\xef"
- "\xc5\xfe\x07\xe0\xca\x54\xea\x8c\xab\xaf\xbc\x38\xae\xbe\x12\xaf"
- "\x03\x57\xd7\xe0\xab\x38\x89\xaf\xbe\x99\xd8\x03\x5c\xa5\x00\xae"
- "\xae\xc1\x57\x6b\x3d\xe1\xca\x0d\x5f\xd5\xdf\x75\x73\x71\xc5\xbe"
- "\x67\xfb\x1f\x80\xab\x6f\x88\x33\xae\xbe\x8e\xe5\xb8\xfa\x7a\x4e"
- "\x97\x70\x65\x55\xe0\xaa\xae\x6f\x54\x6b\x3a\x9f\x0f\xfe\x69\x81"
- "\x84\xab\x3f\x3e\x9e\xb4\x7a\x39\x11\xde\x7c\x7a\x9b\xcb\x5c\xf0"
- "\xcc\x3a\x57\x4c\x01\x2e\x18\xa6\x6c\x2f\x00\xa6\xce\x71\x4c\xa5"
- "\x7d\x09\x98\xfa\xfb\x36\xa1\x3a\xf5\x3c\xe2\x84\x61\xa8\x70\x01"
- "\x60\x08\xe7\x85\x2a\x31\xb0\x3b\x73\xc0\x57\xcf\xc9\x58\x3a\xbd"
- "\xb0\x57\xb0\x34\x1b\xb0\x74\xd2\x15\x4b\x47\x3a\xb0\xf4\x0b\x0f"
- "\x73\xc0\x38\x0f\x58\x32\x5d\x1b\x4b\xdb\x71\x0d\x61\xe9\x0d\xc2"
- "\xd2\xe7\x1d\x6b\x08\xbb\x9e\x31\x0b\xb6\x80\xee\x62\xe9\xcc\x0c"
- "\x67\x2c\x7d\xb3\x87\x63\xe9\x9b\xb2\x9e\x63\x29\xb6\xcc\x33\x96"
- "\xe4\xf1\xd4\xb7\xc7\xae\x0f\x4b\x30\xb6\x72\xc2\xd2\xb5\xc7\x51"
- "\x1d\x58\x3a\xfb\xee\xcd\xc5\x92\xcb\x38\xea\x96\xc5\xd2\xb7\xdb"
- "\x9c\xb1\x74\x46\x9a\xf7\x9d\xf1\x38\xef\x73\x40\xdf\x85\xcf\x9c"
- "\xf0\xb7\xc1\xf6\x26\xc3\xa3\x76\xe8\xd3\xf0\x37\xc2\xf8\x9c\x62"
- "\xf7\x92\x1a\x01\xf1\x94\x75\x89\x04\x6d\x4e\x26\xe1\x1a\x2b\xc7"
- "\x8a\x0d\xb0\xb2\xe1\x12\x11\xdb\xda\x00\x27\xad\x44\x6c\x81\xf2"
- "\x6e\x69\x4b\xd4\x54\x25\x34\x90\x8f\x2e\xd4\x40\x5f\x56\x4e\x8a"
- "\x21\x4e\x9b\xb4\x0e\xe9\x58\x6d\xf0\xdd\xb8\x0a\xd7\x21\x8f\x11"
- "\xe3\xd3\xbf\x85\xfa\x6f\xb8\xee\xfa\x6f\x79\xc9\x53\xfd\x1f\x74"
- "\xaa\xfb\x42\x45\xbd\xb3\xdf\x15\xf4\xb0\x3f\x62\xcf\xa9\x96\xf0"
- "\xba\x97\xeb\xfd\xf5\x5e\xa8\xf7\xd7\xa5\x7a\xbf\xbe\xfe\xe8\x5f"
- "\x9e\xdf\x7f\x54\x70\x05\x7b\xa7\xc0\xca\x39\x42\xe6\x05\xe4\x08"
- "\x1c\xbf\xb4\xf8\xcf\x09\x75\xed\x6f\x90\x1f\x2e\xa8\xbf\xb3\x63"
- "\xdf\xe4\x71\x1c\x23\xf1\x44\xfa\x8b\x9c\x27\xa4\x71\x4c\x55\xef"
- "\xae\x3f\x9e\x3b\x73\xe3\xf8\xe2\xe0\xb5\xfb\x9e\xeb\x18\xc7\x20"
- "\x6e\x0a\x5d\x70\x73\x23\xf8\xa2\x67\xb8\xf9\xae\xd2\x99\x2f\xce"
- "\x0d\xe7\x7c\x71\x2e\xa8\x2b\x7d\xcf\x35\xf0\xb4\x57\x81\x27\x4b"
- "\x07\x9e\x2e\xcc\xc4\x35\xca\xee\xe1\xe9\xb4\xae\x77\xd7\x1d\xcf"
- "\x4f\xbc\xb9\x78\xea\xbd\x75\xc7\x1f\x36\x9e\x2e\x04\x3a\xe3\xa9"
- "\x71\x39\xc7\x53\x63\xca\xf5\xe3\x29\x56\xc1\x4f\xb1\x0a\x7e\x32"
- "\x17\xe1\xda\x64\x37\xf1\x94\xd2\xbb\xeb\x8d\x17\x5f\xbe\xb9\x78"
- "\xea\xbd\xf5\xc6\x1f\x36\x9e\xcc\x89\xce\x78\xba\x70\x84\xe3\xe9"
- "\x42\x45\x2f\xe0\x69\xaf\xeb\x98\x98\xe3\xe9\xd2\x79\x1c\x3f\x77"
- "\x13\x4f\x95\xbd\xbb\xce\xf8\xfd\xa9\x9b\x8b\xa7\xde\x5b\x67\xfc"
- "\x61\xe3\xe9\x52\xb9\x33\x9e\xbe\x0f\xe0\x78\xfa\xde\xff\xfa\xf1"
- "\x14\xa7\xe0\xa7\x38\x05\x3f\x5d\x9e\x86\x6b\x91\xdd\xc3\xd3\x99"
- "\x5e\x5e\x5f\xb4\x0c\xbf\xb9\x78\xea\xbd\xf5\xc5\x1f\x36\x9e\x2e"
- "\x7b\x3b\xe3\xa9\x69\x3e\xc7\x53\xd3\xbc\x5e\xc0\x93\x82\x9f\xe2"
- "\x14\xfc\xd4\xfc\x1a\xae\x41\x76\x13\x4f\x49\xbd\xbb\xae\x78\x65"
- "\xf9\xcd\xc5\x53\xef\xad\x2b\xfe\xb0\xf1\xd4\x6c\x70\xc6\xd3\xe5"
- "\x77\x39\x9e\x2e\xef\xed\xea\x5a\x90\xbc\x06\xa4\xc4\x93\xe7\xb9"
- "\x5d\xcb\xe7\xae\x73\xbb\xee\xad\x01\xc1\x3c\xaf\xc7\xeb\x89\xd6"
- "\x7d\xff\xbf\xae\x27\x22\x86\xe4\x75\xa0\x1f\xde\x1a\x50\x4b\xa1"
- "\x33\x86\xac\x2a\x8e\x21\x2b\xf1\x84\x21\x9b\xf2\x9d\xb4\x6f\x15"
- "\xef\xa4\x9d\x27\xc2\x9b\x4b\x8c\xc2\x71\xe9\x9d\x34\x7c\x1f\xed"
- "\xf8\xe9\x06\xb2\xf1\x0a\xd1\xfa\x26\x12\xed\xac\xa4\x74\x9a\x8d"
- "\x1c\xb2\xcc\xa0\x79\xf5\x2c\x09\x6f\x03\xcc\x64\x9d\x93\xde\x4b"
- "\x03\xdc\x7c\x56\x67\x25\x1f\x2e\xc1\xf7\xd2\xca\x48\x09\xc8\xd9"
- "\xf2\xf8\x7a\x10\xf2\x08\x7b\x27\x6d\x01\xbe\x93\xd6\x7a\xc8\xed"
- "\x3b\x69\x99\xdd\x7c\x27\x2d\x05\x70\x60\x01\x1c\x5c\x46\x0c\xbc"
- "\xeb\xf4\x2e\xda\xf6\x4c\xc5\x1a\xd0\x33\x1e\xd6\x80\x6a\xbb\xf6"
- "\x4c\xa2\xd7\xdf\x45\xbb\xa8\x78\x17\x4d\x5e\x03\x7a\x1a\xb8\xa3"
- "\xdb\xf5\xde\xe6\x71\xff\x03\xe4\x08\x3b\x70\xc2\x2c\x7c\xb7\xdc"
- "\xd2\xb1\x5e\xbc\x66\x21\xfe\xf6\x77\x4e\x88\x0d\xb8\x02\xdf\x1f"
- "\x7f\xeb\x99\x4a\xb6\xde\x57\x9d\x5a\x4b\x36\xb6\x12\xad\xc6\x2c"
- "\xf1\x42\xc0\x9c\x94\x36\xe0\x06\x3b\xf4\x4b\x50\xd7\x03\xda\x96"
- "\x01\x37\x5c\x02\x6e\x58\x06\xdc\x70\x19\xb8\xa1\xbe\x92\x71\x03"
- "\x7d\xe5\xeb\x03\xf8\x5d\xf0\x92\x73\x24\xb4\xe8\x1c\x09\x43\x0e"
- "\xb0\xe7\x2f\xcd\x68\x0b\x98\x33\xdb\x1c\x30\xc7\x00\x61\x89\x1c"
- "\x03\x2d\xc6\xcd\xc9\x84\x71\x3d\xd6\xbd\x6e\x01\xf2\x81\xed\xd3"
- "\xb6\x4c\x42\xae\x07\x07\x6d\xca\x35\x41\x25\x0e\x3c\x70\xc0\x75"
- "\x63\xc1\x65\x1d\x78\xfb\x75\x72\x00\x62\x61\xbb\xcc\x01\xd7\x85"
- "\x05\xbb\xc7\xdf\xff\x5c\x03\x0b\x65\x5d\xc0\x82\xa5\x6b\x58\xa8"
- "\xc7\x6f\xc4\xd7\xb8\xc1\xc2\x49\xc0\x42\x2d\x84\x35\x70\x2c\x5c"
- "\x76\x83\x05\xc7\xa9\x1b\x8f\x05\xe7\x35\x99\x5b\x17\x0b\x74\x57"
- "\xcf\xb0\x10\xdb\x05\x5e\x88\xed\x22\x2f\xd4\x2f\xc2\xef\x50\x77"
- "\xc6\x42\x2c\xf0\x42\x2c\xf0\x42\xac\xc4\x0b\xe7\x3b\x63\x41\x24"
- "\x5f\xdf\x78\x2c\x38\xaf\xa7\xdc\xb2\x58\x10\x55\x9e\xbf\x7f\x71"
- "\x75\x2c\x74\x81\x17\x62\xbb\xca\x0b\x15\xf8\xfd\x66\x37\x58\x00"
- "\x5e\x88\x05\x5e\x88\x95\x78\xe1\x4b\x37\x58\x10\xce\xdf\x78\x2c"
- "\x38\xaf\x85\xdc\xba\x58\x50\x7b\xdc\xff\xeb\xea\x58\x88\xeb\x02"
- "\x2f\xc4\x75\x91\x17\xbe\x19\x8c\xdf\x3d\xee\x8c\x85\x38\xe0\x85"
- "\x38\xe0\x85\x38\x89\x17\x0e\xba\xc1\x82\xd8\x72\xe3\xb1\xe0\xbc"
- "\x8e\x71\xeb\x62\xc1\xab\xa6\x87\x58\xe8\x02\x2f\xc4\x75\x91\x17"
- "\xbe\x49\xc1\xef\x05\xbb\xc1\x02\xf0\x42\x1c\xf0\x42\x9c\xc4\x0b"
- "\x6b\xdd\x60\xa1\xaf\xd7\x8d\xc7\x82\xf3\x1a\xc4\xad\x8b\x85\xbe"
- "\x75\x57\xc5\x02\xed\x8c\x05\x5c\x43\xc0\xf9\x23\x7e\x8f\x9b\x61"
- "\xe1\x79\xa3\xd0\x4a\x11\x0b\x95\x64\xd3\x2a\x05\x16\xf2\xf9\x3c"
- "\x42\xc6\xc1\x6b\x4a\x1c\xe0\xef\x97\x10\x07\x30\x7f\xb0\x41\xbd"
- "\xd3\x82\xf8\x10\xf6\xbe\x52\xfe\x9c\x44\x9c\x3f\xe0\x3a\x03\xce"
- "\x21\x3c\xce\x1f\xc4\x7e\xfd\x7a\x05\x03\x8b\x00\x03\x8d\xee\xe7"
- "\x91\xbd\x3e\x7f\xb8\x78\x83\x30\x00\x73\xc9\xdf\xa6\x5d\x0f\x06"
- "\xfa\x99\xba\x8f\x01\x18\x23\x74\x09\x03\x7c\x9c\x70\x75\x0c\xc4"
- "\xd6\x74\x60\x00\xc6\x0b\xf9\xb1\x0d\x38\x3e\xe0\x18\x88\xad\xf5"
- "\x3c\x3e\xb8\x6d\xc0\x8d\xc7\x40\x2f\x8f\x0f\x7e\xb0\x18\xb8\xed"
- "\xb4\xc7\xdf\x30\x22\x97\x03\xef\xcf\x1a\x31\x84\xd0\x17\x0c\x8f"
- "\x66\x9d\x23\x41\xaf\x3e\x4f\xc2\xf1\xbb\x31\x6f\xb6\x5a\x85\xb4"
- "\x24\xfa\x2d\xfe\xb6\xda\x06\xf9\xc0\xef\x85\x32\x7c\x5c\x0c\xf4"
- "\xae\x4e\x34\x93\x8d\x80\x85\x57\x21\x0f\xf8\xed\x7a\xdf\xa4\xbe"
- "\x51\xc7\x2d\x47\x49\x6b\x93\x81\x54\x25\x9c\x23\xd1\x7a\xda\x56"
- "\x5d\x67\xc4\xdf\x30\x8a\xc6\x15\x47\xf1\x77\xe2\xfd\xe3\x53\x89"
- "\x70\x41\xf4\x29\xc5\x35\xa5\xb1\xa9\x44\x5b\x78\x8e\xaf\x23\x6d"
- "\xbc\x40\xc8\x91\x54\x42\x78\xbd\x0f\xf0\xf2\x7a\xb1\x17\xd6\x90"
- "\xe6\x40\xbd\xd7\xc9\xf5\x7e\xc4\x79\x0d\x49\xe8\xc2\xef\x19\xbb"
- "\xb0\x76\x78\x43\x7e\xcf\x78\xb1\xf3\xef\x19\x7b\xb4\x76\x28\x0e"
- "\xa8\xbd\xea\x7b\x44\xd2\x38\x60\x75\x0a\x6b\xf7\xac\x5e\xdb\x80"
- "\xfb\xab\x53\xcb\xd9\xfb\xd1\xd8\xce\xb1\xcd\x23\x3e\xd2\x21\xbf"
- "\x88\x11\xc4\xc3\xac\xd2\xb6\xb6\x38\x0b\x11\x1c\x01\x73\x52\x10"
- "\x13\x8e\xa5\x81\xde\x9b\x21\x4f\xd5\x09\xf5\x50\xef\x97\x48\xf5"
- "\x69\xa9\xce\x57\xd5\x43\x5d\xfa\xe6\xd1\xa5\xfa\xfe\x63\x2c\x44"
- "\x9b\xfe\x05\xd1\xc6\xe3\x6f\x8e\xa1\x1f\xd8\x0e\x63\x82\x92\xe7"
- "\x49\x28\xf4\x07\x31\x6d\x12\x37\x38\xe4\x75\x25\xec\x23\x00\x13"
- "\xaf\x2e\x01\x4c\xa4\x00\x26\xe2\x10\x13\x9a\x3b\xbc\x96\xbb\x59"
- "\x5f\xee\x06\x26\xd8\xfa\xf2\x3c\xc0\xc4\xe9\x0e\x4c\xb4\xaf\x2b"
- "\x7b\xe8\x13\x8c\x4f\x5f\xc7\xbb\x85\x6e\xf8\xe0\xba\xd7\x95\x2f"
- "\x4a\xeb\xca\x0a\x3e\xe8\x19\x36\x34\x9e\xbf\x89\xe9\x19\x1b\x65"
- "\xd7\xc6\x46\xb3\x8c\x0d\xcb\xb5\xb1\xa1\x2d\xeb\x8c\x8d\x7a\x7f"
- "\x05\x36\x6a\x14\xd8\xe0\xeb\x4c\xf9\x73\x1a\x3a\x63\x63\xe0\xc4"
- "\x9b\x83\x0d\x97\xf7\x7e\x6e\x59\x6c\xf8\x69\xbb\x8f\x8d\xd8\x2e"
- "\xf0\xc6\x45\x09\x1b\xb1\x5d\xe0\x0d\xbf\x2a\x37\xd8\x58\xd4\x81"
- "\x8d\x58\x05\x6f\x48\xeb\x4e\xf9\xb1\x6e\x78\xe3\xf6\x5f\xdc\x1c"
- "\x6c\xb8\xbc\xc3\x73\xcb\x62\xc3\x3f\xb8\x07\xd8\xe8\x02\x6f\x7c"
- "\x25\x63\xa3\x0b\xbc\xe1\xdf\xe0\x06\x1b\x15\x0a\x6c\x28\x78\x43"
- "\x5a\x87\xc2\x31\x67\x27\x6c\x04\x2c\xbe\x39\xd8\x70\x79\x1f\xe7"
- "\x96\xc5\xc6\xa0\xa8\xee\x63\x23\xae\x0b\xbc\xf1\x91\x84\x8d\xb8"
- "\x2e\xf0\xc6\x4f\xc4\xce\xd8\xf8\x66\x70\x07\x36\xe2\x14\xbc\x21"
- "\xad\x4b\xe5\xc7\xb9\xe1\x8d\x9f\x6c\xbc\x39\xd8\x70\x79\xb7\xe6"
- "\x96\xc5\x46\xa0\xc7\xfd\xaf\xaf\x82\x8d\x2e\xf0\x46\xba\x8c\x8d"
- "\x2e\xf0\xc6\x1d\x3a\x37\xd8\x48\x51\x60\x43\xc1\x1b\xd2\x3a\x55"
- "\x7e\x9c\x1b\xde\xb8\xe3\x8d\x9b\x83\x0d\x97\xf7\x64\x6e\x59\x6c"
- "\xdc\x99\xd1\x15\x6c\xac\xb1\xb8\x99\xa7\x9c\xe6\xd8\x68\x03\x19"
- "\x25\x2e\x94\x73\x13\xc8\x9f\x18\x0d\x73\x16\xc4\x44\xec\x1a\x22"
- "\x30\x5c\x58\x94\xb8\xf8\x69\x18\xe2\x62\x74\x22\xe0\xe2\x8c\x84"
- "\x0b\x79\x5e\xc2\xbe\xbd\xc2\xe7\x26\xf2\x9a\x95\x3c\x3f\xd9\x84"
- "\x73\xd6\x44\x19\x13\x3f\xdd\xe7\xb5\xb0\x17\x30\xe1\xf4\xde\x83"
- "\x02\x13\x4f\x79\x98\x9f\x3c\xd9\x73\x4c\xfc\x16\xe6\xae\x6d\xbd"
- "\xfd\xdb\x27\x19\x13\x5f\x5c\x2f\x26\x06\x5f\xf5\xfd\x07\xf7\x98"
- "\x90\xc6\x19\x1e\x31\xd1\x31\xb6\xe0\x98\xf8\xea\x2a\x98\xb8\x6b"
- "\x46\x67\x4c\x48\xe3\x0a\xf6\x1d\x02\x3e\xb6\x90\xd7\xb0\xe4\xf1"
- "\x85\x33\x26\xee\x3a\x76\x73\x30\xe1\x32\xbe\xb8\x65\x31\x31\xa4"
- "\xd4\x13\x26\x72\x04\x47\x19\xb8\x72\x70\x46\x70\x95\x76\x81\x3c"
- "\x52\x24\x38\xd8\x73\x10\xa9\xcd\xb8\x86\xf7\xa1\xaf\x8c\x3e\x89"
- "\x32\x74\x9d\xc8\xf6\x92\x96\x75\xd8\xfb\x13\xfc\x1e\xa2\x51\xa3"
- "\x4a\xc0\x3a\x41\xd9\xbe\xb2\x2e\xcd\x3a\x12\x01\xf9\xe7\x72\x02"
- "\xc9\xe0\x72\x11\x7d\x50\x8e\x66\x9d\x58\x03\x7e\xde\x92\x4e\xb6"
- "\x07\x85\x5d\x10\x50\x97\x6b\xda\xfd\x24\x19\x9d\x3d\x93\xe8\x94"
- "\x69\x83\x2e\x4c\x53\x96\xeb\x8f\x72\xf6\x3e\x42\x9d\x5d\x25\x06"
- "\x29\xe5\xe8\x43\x44\x29\x77\x9b\xa4\x4f\xef\x94\x8f\xa1\x84\x68"
- "\x54\x3a\x9e\x97\x54\x41\xce\x8b\x0f\xd3\xe9\x5b\x73\x12\x74\x06"
- "\x3b\xe9\xec\x43\xc8\x00\x90\x47\xbd\x03\x12\x99\xdd\x28\x3f\x80"
- "\xf6\x39\x6b\x64\xfa\x55\x62\x88\x43\x20\x21\x3c\x5f\x44\x2c\x6a"
- "\xb7\x59\x47\x72\x9c\xd3\xf0\x95\xcb\x4b\x29\x87\x32\x54\x68\x97"
- "\xd1\xf0\xbc\x9d\xa9\x00\x3b\xc2\x94\x76\x70\x39\x32\x4e\x92\xd3"
- "\x42\xbe\xc2\xdb\xeb\x32\x2f\x48\x2f\xcb\x01\x7e\xef\x80\xba\x30"
- "\x56\x43\x7b\x93\xca\x61\x20\xcd\xfa\x8b\x56\x2a\x8b\x08\xa5\xce"
- "\x01\x2a\x95\xa9\x48\x2a\x2f\x47\xd6\x89\x0a\x90\xf5\x73\xac\x13"
- "\x23\xdb\xf5\x66\x6a\x89\x5c\xaf\x34\xd3\x76\x3b\xd3\xdb\x00\xed"
- "\x4c\x50\xe9\xa4\x72\xb8\x1d\x65\x21\x4e\x14\xcf\x97\xb6\xbd\x5e"
- "\xed\x82\x88\x61\x46\x85\xac\x3f\x2f\xe3\x6f\x12\x20\x6f\x33\x3a"
- "\xcb\x7b\xbb\xca\x07\x70\xf9\x53\x31\x20\x1f\xd3\x59\x5e\xeb\x2a"
- "\x3f\x88\xcb\xff\xad\x14\xe4\x67\x77\x96\xb7\xf9\xb9\xc8\xff\x84"
- "\xcb\xff\x9d\x80\xbc\xa1\xb3\xbc\xce\x55\x3e\x90\xcb\x9f\xd9\x05"
- "\xf2\x73\x3a\xcb\x47\xb8\xca\xdf\xc1\xe5\xeb\x0c\x20\x9f\xd0\x59"
- "\x3e\xc3\x55\xfe\x4e\x2e\xff\xcf\x32\x90\x9f\xe7\x2a\x5f\xc2\x64"
- "\xc9\x50\x49\xf6\xa7\x5c\xf6\x6b\x6f\x90\x4d\x74\x93\x57\xb5\xa4"
- "\x3b\x44\x92\x1f\xcc\xe5\xff\x92\x08\xf2\x8b\xdc\xd4\x95\xab\xfc"
- "\x5d\x5c\xbe\xb9\x1c\xe4\x93\xdc\xd4\x95\xab\xfc\x10\x2e\xff\xaf"
- "\x5a\x90\x4f\x71\x53\x57\xae\xf2\x77\x73\xf9\x46\x3d\xc8\xa7\xba"
- "\x29\x7b\x67\x79\xdf\x0b\xa9\x20\xb7\xa6\x28\x53\x6e\x3f\x4e\xe5"
- "\xee\xaa\xfb\x1e\xae\xdb\x5c\x09\x71\x32\xdc\x94\xbb\xab\xfc\x50"
- "\x2e\xdf\x14\x08\xf2\xeb\x3b\xcb\x13\x15\x97\x27\xe3\x25\xf9\x61"
- "\x5c\xfe\x32\x96\xe5\x06\x37\x65\x8f\xe1\x46\xa9\x9d\x06\x71\xd9"
- "\x6f\xad\x20\xbb\xd9\x4d\xb9\x2b\x65\x87\x33\x59\x3f\xef\x20\x90"
- "\xcd\x71\x53\xe6\x4a\xd9\x7b\xb9\xde\x36\xe4\xc0\x3c\x37\xe5\xad"
- "\x94\xbd\x8f\xcb\xda\x1b\x40\x76\x9b\x1b\x7b\x87\x2a\x64\xf5\x5c"
- "\x96\x5a\x40\xb6\xd0\x4d\xbd\x28\x65\x47\x70\x7b\xfb\x63\x1d\xee"
- "\x70\x53\x2f\x4a\xd9\x91\x5c\x56\xc0\xb6\xb6\xd3\x4d\x9d\x28\x65"
- "\x47\x51\x3f\xd1\x47\xe2\xd6\x52\x57\x59\xc0\x80\x11\x78\xa8\x12"
- "\xb8\x30\x98\xe6\xf6\x81\xbe\x94\xf1\x1a\x7b\xff\x4b\x96\xa1\x82"
- "\x6d\x82\xa2\x1f\x18\x4d\xb3\x5a\x6c\x12\xff\x95\xb9\xea\xa3\x82"
- "\xa8\x94\x1d\x43\x73\xef\xac\x94\x64\xf7\x76\x96\xf5\x56\xca\x8e"
- "\xa5\xb9\xbe\x3a\x49\xb6\xbc\xb3\xac\xb6\x5d\x96\xe6\x6a\xc3\x41"
- "\xe6\x40\xb1\xc4\xab\x0a\x3b\xc7\x2b\xf4\x8d\xa3\xb9\x7e\x06\x49"
- "\x9f\xb1\xb3\x3e\x9d\x52\x76\x3c\xcd\x1d\x5c\x27\xc9\x56\x74\x96"
- "\x8d\x50\xca\x4e\xa0\xb9\xfe\x29\x92\x6c\x65\x67\xd9\x0c\xa5\x6c"
- "\x28\xcd\x1d\x94\x23\xc9\x56\xb9\xca\x16\xf3\x3e\x48\x90\xea\x69"
- "\x22\xcd\x0d\xdc\x25\xc9\xd6\x38\xf5\xb1\x82\x8a\xb5\xb1\x62\x2e"
- "\x37\x89\xfa\xf9\x04\x4b\xf5\x79\xd2\xa9\x6f\xcd\x54\xf9\x61\x9f"
- "\x52\x84\xf5\xf9\xca\x24\xfc\xfe\xf2\x64\x49\x5f\xad\x6b\xdf\x27"
- "\xd9\x17\x06\x61\x75\x72\xff\x04\xfd\x8e\xc9\xdd\xb8\x27\x69\x24"
- "\xb9\xed\x9c\xa8\x0f\xe1\x7d\xa3\xb4\x4f\xb1\x38\x92\xdd\x3b\x76"
- "\xce\xd0\x46\x5b\xa8\x4d\xe9\x97\x2d\xd0\x9a\xb1\x16\x22\xe2\x37"
- "\xbd\x69\xc0\xf2\x72\x13\xf8\x9b\x87\xcf\x30\x35\xe7\xea\xc3\x4d"
- "\x2a\x13\xdb\x13\x0f\xae\xa3\x4c\xe4\x35\xb6\x87\x5f\x76\x26\xee"
- "\x93\x18\xa1\xb2\x17\x0c\x33\xe3\xbe\x8a\x25\x70\x9f\x05\x8e\xed"
- "\x61\x08\x63\x4c\xfa\x0a\x89\x30\xae\xb0\x91\xb3\xa9\x44\x60\x7b"
- "\x76\x8b\xfa\x7c\xba\x34\x31\x1c\x6c\x89\x80\x74\xe7\xd5\xc3\x3d"
- "\xb3\x05\xf7\x30\xcd\x0b\xf2\x31\x26\xb7\xa2\xcc\xbf\xcc\x01\xe9"
- "\x11\xf4\xa5\x5f\xff\x2b\x29\x8d\xdc\x0d\xf6\x37\x30\x99\xbc\x45"
- "\x46\x47\x40\x90\x0f\xfb\xde\xed\xc5\xc4\x07\xd8\xb7\x6e\xc5\x91"
- "\x2a\xfc\xc6\x2d\x7e\xeb\x56\xfe\xce\x2d\x4f\x67\x04\xee\x93\xa7"
- "\xa2\x3b\x36\x99\xd8\x77\x74\xc5\x11\xd3\x58\xfe\x32\x69\x0d\x0d"
- "\x7a\xdc\xea\x68\x5d\x9f\x81\x7b\x6c\x1b\xd3\xce\x91\x7a\x29\x0c"
- "\xf5\x73\x9d\x23\x0e\xba\xea\xc4\x78\xe6\x7b\x36\x99\xe8\x1b\x8f"
- "\x5b\xed\x39\x86\x10\x87\xd6\x10\x4c\x73\x9e\xf5\xae\x5e\x64\x22"
- "\x2c\xaf\xe2\xc8\x71\xd4\xf7\xa9\x6a\x47\x8e\xc1\x9f\xe6\x3c\x63"
- "\xad\xb6\xb4\x32\x7f\xd0\xbd\x01\xc7\xcd\x4d\xda\xf8\x50\x9a\x13"
- "\x1f\x66\xbc\xb3\x95\x9c\x16\x47\x30\x9e\x42\x7f\xba\xe5\x59\x6f"
- "\x2c\x63\xc7\x96\x67\xac\xea\x40\x22\x36\x0d\x8c\x0f\x6d\xce\x1d"
- "\x51\x6a\x92\xf6\xb3\x93\xd3\x42\xbd\x26\x49\x57\x97\xbf\xd9\x2b"
- "\x8e\x08\x61\xdf\xec\xcd\x1d\x61\x35\xa9\x46\xb3\xef\x26\x9b\xe4"
- "\xb2\xec\xb2\x0e\x7d\x1d\xea\x70\xbf\xaf\x09\xd1\xd0\xfc\x20\x7d"
- "\x73\xee\x48\x03\x8c\xbd\x1b\x38\x36\x46\xce\x33\xa9\x74\x3e\xd2"
- "\x75\x92\x49\x35\x2c\x45\xba\x5e\x63\x52\x9d\x14\xa5\xeb\x0d\xf2"
- "\x77\x93\xdd\x7f\xc7\x79\x98\x0d\xb0\xe0\xef\xd8\x6e\xf0\xc6\x79"
- "\x03\xb3\x27\x60\x98\x4d\x37\x84\xa8\xce\x8a\xa3\x7c\x20\x4d\x7f"
- "\xa9\xee\xcf\xc0\x59\x23\x9d\xcd\xd2\x99\xa2\x0c\xc3\xbb\xff\x0a"
- "\x2b\xd4\x91\x5c\x3f\x6c\x1f\x68\x86\x2b\xc0\x1e\x1d\xf8\x2c\x61"
- "\x7a\xf3\xd3\x9d\xf6\xbe\x09\x19\x37\x7e\x42\xe8\xc4\x49\x93\xc3"
- "\xa6\xcc\x7d\xe6\xd9\x79\xf3\x17\x3c\x97\xb8\xf0\xf9\x17\x16\x2d"
- "\x5e\xb2\x34\xe9\x37\xc9\xcb\x52\x96\xaf\x58\x99\xfa\xe2\x2a\xd0"
- "\xd3\xbe\xff\x37\xdd\x1e\xa9\xb2\x08\x04\xd2\x78\x08\xd2\x18\xc5"
- "\xf6\x79\x42\x3f\x8e\xb9\x51\x73\x44\x9d\xfb\xf9\x48\x75\x20\xcc"
- "\x01\x61\xfc\xdd\x28\x8e\xda\x87\xfb\x36\x02\xfe\x55\xd5\x85\x8f"
- "\x1a\x71\xcf\xea\xd3\xe2\xa8\x5d\xc7\xcd\x8f\x1a\x71\x8f\xf5\xc3"
- "\x81\x0d\x24\x68\x28\x51\x9d\x13\x47\x6d\xc3\xf0\x92\x7b\x09\xa9"
- "\x80\xb8\xee\x74\x0e\xd5\x92\xc0\xad\x83\xa8\x39\x6f\x10\x6d\x44"
- "\xfd\x79\x05\xb4\xc1\xbc\x3a\x91\x64\xc1\x3d\xb4\x09\xed\x59\x31"
- "\x78\xf1\x61\x98\x75\x38\x32\xc9\xe0\xe2\x02\x7a\x7a\xfd\x20\x7a"
- "\xfa\xa5\x02\xda\x58\x32\x88\x9a\x82\xf2\x88\x4f\x73\x6e\xb0\xce"
- "\x24\x8e\x62\x7b\x3d\x66\x43\xb8\xc3\x6f\x54\x60\x36\x84\x8d\xb5"
- "\x11\x75\x09\xdc\x83\x9f\xe5\xb0\x8e\xdb\xbd\xfb\x92\xd5\x0b\xf4"
- "\x89\xb4\x6d\x91\x2a\x0b\xd2\xe1\xf5\x11\xbc\xa5\x02\x46\x30\x90"
- "\x9e\xb9\xda\x5a\x4f\x4c\x62\x70\x0e\xee\x29\x0b\xe9\x69\xaa\xb7"
- "\x35\x12\xd4\xf7\x56\xb2\xd5\x6b\xd9\x9d\xd4\x06\xb2\x49\x8e\xd5"
- "\x8b\x54\x20\x33\x03\x74\x5b\x94\xf9\xd1\x2f\x58\x9c\xa2\x5b\xb2"
- "\x7c\xd1\xa2\x11\xfd\x89\x9e\x9d\x89\x72\xbf\xf5\x14\xfc\x5e\xfb"
- "\xd6\x02\x5a\x01\xf9\x34\x42\x7e\x2b\x8f\xc1\xcc\x07\xb0\x41\x20"
- "\x4f\x39\xa0\xf7\x0c\xf8\x1f\x80\xeb\x03\x60\x7b\x25\xdb\xbf\x59"
- "\x7c\x60\x20\xcd\x0d\x2e\x04\x3b\xb1\xaf\xd4\xe1\xf7\xdd\x9b\x56"
- "\xce\x56\x41\xbe\xf3\x40\xae\x52\x77\x27\x19\x7e\x56\x1c\xbd\x18"
- "\xec\xd8\x09\xd7\x28\x7f\x07\xd6\x23\xc8\x57\xf0\x7c\x3d\xa0\xc2"
- "\x7b\x28\x2b\x63\xd1\x20\xba\xb9\x39\x77\x74\x14\xee\x5b\xc1\xf6"
- "\xde\x84\x7b\x28\x97\x4a\x90\xcd\x69\x4a\x9f\xad\x82\xf9\xb3\xaa"
- "\xa4\x43\x67\x20\xda\x84\x76\xe0\x9c\xfc\x33\x18\xc9\x3a\xda\x0c"
- "\x64\xb4\x95\xa8\x3e\x3b\x4d\x48\x61\x01\xdd\x01\xae\x10\xdc\xb6"
- "\xa3\x10\xf6\x29\xb8\x4a\xf0\xaf\x82\xf3\x51\x38\x7f\x0a\x0e\xe6"
- "\xf4\x81\x68\xf7\xb2\x35\xb4\x61\xec\x36\x32\x0c\xf5\x03\xb6\x7e"
- "\x55\x2f\x4e\x4b\x44\xdb\x71\x5f\x1a\xea\x37\xba\xce\x69\x2f\x0d"
- "\x71\x6c\x0c\x81\x70\x38\xcf\xe3\x67\xa5\x1b\xbb\x0b\x5c\x15\xbf"
- "\x0e\xf1\x87\xeb\x70\xe9\x5a\x0f\x2e\xf4\xda\xce\x55\x9f\x27\x17"
- "\xb2\xa3\xeb\xb2\x5d\x72\x75\x5d\x93\x1b\x6f\x20\x62\x68\x19\xb8"
- "\x06\x67\xff\x50\x23\xf7\x9b\xb2\x99\xdf\x4f\xd9\x26\x9d\x2b\x88"
- "\x38\x15\xca\x69\x2a\xe8\xbf\x9f\x70\xbf\xfb\x7d\xe0\x3c\x1b\x5c"
- "\x82\x4b\xfa\xa8\xd3\x82\xf5\xd9\x06\x7d\x10\xd6\xa5\x49\x1c\xbd"
- "\x0b\xeb\x28\x9b\x63\x4b\x85\xbf\xcd\x03\xbf\x52\xc0\x56\x61\x07"
- "\x7e\xc6\x16\x39\xe3\x67\xec\x06\x17\xfc\xe4\x20\x17\x41\x5b\xb0"
- "\x94\x70\xbc\x1c\x68\x5a\x3d\x0f\xee\xc7\x6e\x06\x3d\x07\x70\xad"
- "\xe8\xac\x18\xc2\xea\x36\xfb\x1c\xcc\xc1\xc1\x1a\xe4\x97\x46\x71"
- "\xec\x97\x88\x59\x4c\x5b\x4a\x97\xdb\x02\xf6\x81\xdf\x0e\xb4\x6f"
- "\x29\xe8\x85\xfb\x9d\x20\xb7\xa3\x9a\x5c\x92\x6d\x63\x71\x36\x3d"
- "\x0f\x78\x94\xec\x45\x9d\x18\x8f\x76\xe4\xab\x14\xe3\x48\x69\x6f"
- "\x01\x7f\x9c\xdb\xe3\xef\xee\xd4\xd5\x36\x13\x41\x4c\xe2\xb9\xda"
- "\x16\x02\x6d\x29\x8a\x38\xf0\x5b\xf3\x81\x04\xf7\x36\xeb\x57\x2f"
- "\x86\xa4\x8c\x59\x43\x42\x50\x1f\xf2\xb7\x49\x0c\x09\x2b\xc1\xb6"
- "\xc8\x75\x6d\xc4\x7c\xa0\xfe\xa3\x30\x9b\xc2\x73\x31\xda\x03\xe1"
- "\x8a\x74\xf3\x70\xce\x9e\xbd\x8a\xe7\x15\xd2\xda\x09\xf1\xcb\x30"
- "\xef\x58\x9e\x10\x5e\x0e\x7a\x6a\x30\x0c\xf7\xa6\x94\xf2\xb3\x13"
- "\x7f\xef\x88\xe5\x81\xf2\xd5\x30\x7b\x61\xfb\x68\x88\xc1\xec\x5b"
- "\xfd\xa0\xbf\x0c\xeb\x83\x42\x1a\xa8\x23\xdd\x46\x6d\x14\xf8\xe8"
- "\x0f\xab\xac\x30\xf6\x19\xff\x98\x73\xfd\x8c\xd3\x2b\xeb\x07\xe2"
- "\x95\x41\xfc\x0a\x1c\x0f\x20\x9f\x40\x9a\x1a\x1c\xeb\x80\x5f\x8e"
- "\x23\x17\x74\xac\xb0\xb2\xf5\x2d\xd0\x33\x05\x6c\xc9\x41\x3d\x60"
- "\x4f\x85\xa4\x2b\x05\xbf\xb9\xaf\xac\x6b\x49\xdf\x4e\xac\x73\xd6"
- "\x9e\x57\xb1\x3c\x01\x77\x8d\xef\x57\xcc\xc3\xca\x41\xa6\x9c\xb6"
- "\x45\x11\xba\xda\xc0\xf7\xaa\xe6\x61\x7b\xd3\x5b\x58\xfd\x56\x70"
- "\x5e\x1b\x3f\x62\xd9\x5a\xda\xa0\xb0\xdb\x24\xef\x49\x25\xd9\xbd"
- "\x17\xd3\xa3\x2b\xe7\xb0\x3e\x14\xd3\xc0\xf8\x5c\xdf\x38\xe4\xc8"
- "\xbd\x72\x59\x8d\x01\x3b\x78\x79\x85\x98\xc1\x7f\x27\x62\x91\x95"
- "\x1b\xf0\x68\x53\x3a\x62\x71\xdc\x69\x88\x7f\x20\x0b\xef\x57\xb2"
- "\xfb\x54\xc6\xb1\x1d\xe1\xc1\x18\x8e\x6b\x22\xd9\x2f\x00\x96\x1c"
- "\x84\x0c\xf3\x27\x21\x96\x4c\x96\xb7\x5d\x96\xd5\x91\xaa\xc3\x36"
- "\x42\xd0\x4e\x28\xa3\xf2\xe6\xdc\xf1\x9b\xa1\xaf\x61\x7b\x00\x03"
- "\x5f\xef\xa5\x7f\x30\x10\xb4\x19\xf8\x4c\xb2\x6f\xbc\x5d\xaa\xfb"
- "\xbd\x98\x47\x2c\xcf\x31\x9c\xfb\x20\x2c\xf4\x77\x68\x7b\x47\xbe"
- "\xc7\xd7\x2a\xcb\x98\xe5\x1b\xea\x01\xeb\x0b\xeb\x45\xa1\x13\xb1"
- "\x9f\x03\xba\x76\xf1\x7b\x8e\x0d\x2c\xeb\x9c\x41\xb4\x0a\xe5\x3b"
- "\x64\x43\x07\x62\x58\x1a\xa4\x3d\x36\x89\xed\x8f\xad\xc2\x7d\xc5"
- "\x40\xef\x2e\xe3\x2a\x1b\x01\x1d\xe5\x58\xa6\x20\x37\x1f\xf1\x08"
- "\xf7\x55\x3c\xde\x84\x79\xd0\x9f\x07\x83\x0b\xef\x68\xff\xa1\x4f"
- "\x38\xe3\x6b\x82\x6b\xfb\xc7\xfa\xce\x71\xa4\x47\x11\x86\x87\x64"
- "\xa2\xbb\x20\x4e\xf8\x5e\xea\x3b\xa4\xba\x0e\x7d\xe4\x30\xb4\x17"
- "\x85\x8e\x2a\x97\xba\x2e\x67\x78\x5c\x39\x43\x85\x79\x86\xb8\xe5"
- "\x92\x1e\x96\x67\x86\xa7\x4c\x86\x81\x2a\xba\x12\xf2\xd9\x8e\x83"
- "\x09\x7a\xa9\x9e\xab\x5c\xca\x44\xe6\xae\x14\xdc\xe3\x18\x39\x09"
- "\xc6\xdd\x0f\x34\xb7\x75\xf0\x12\xd6\xbd\x83\xd5\xfd\x84\x9a\x12"
- "\xde\xdf\x4a\xbc\x35\x81\x87\x0f\x72\xc2\x30\xd8\x12\xea\xc5\xf0"
- "\x8b\xb6\xa4\xcf\x41\x5b\xca\x99\x1d\xe9\x3a\x02\x61\x6b\x30\x7d"
- "\x93\x18\xea\x2d\xb5\x57\x49\xd7\xf8\x3a\xd4\xf5\x12\x70\x15\xda"
- "\x04\x69\x27\x32\xfe\xfb\x19\x2b\x93\x2f\x25\xdb\x2b\xad\x99\x18"
- "\x77\x6c\x4d\x8b\xc0\xe2\x56\xc2\x75\xa4\x95\xef\x11\xd7\x1f\xe2"
- "\x97\xb2\xf7\x36\xc5\x29\xe1\xc8\xd1\xf8\x7b\x64\xb8\x1e\xae\x7b"
- "\x12\xb0\x7a\x8e\x88\xa0\xcf\x1b\x31\x2a\xe3\xa2\x51\x9c\x12\x80"
- "\xfb\xc7\x40\x59\xef\x82\x31\x52\x29\x96\x37\x62\x19\xc6\x48\x30"
- "\x36\x9f\x18\x29\xe3\x16\xd2\x29\xc4\xb2\xe7\xf5\x33\x71\x23\xe0"
- "\xb8\xbc\x03\x5b\x13\x37\x4a\xe5\x58\x0a\xe5\xe8\x0d\xe9\xf5\x93"
- "\xf2\x55\x0a\xf2\x30\x16\x0b\x6b\x91\x6c\xdf\x26\xc9\xbf\x21\xd7"
- "\x83\xd4\x56\xab\xb2\x90\x7f\x59\x1d\x4c\x0a\x97\xe2\xee\xe4\x69"
- "\x4d\x9a\x26\xcb\xe2\x18\x91\xed\xf7\x0c\x7e\xc8\x83\x63\xa1\xee"
- "\x19\xf7\xad\x6a\x65\x72\x12\x37\x56\xf0\x34\xc2\xce\x30\x1c\xc2"
- "\xb8\xa7\x03\x47\x93\xfc\x5d\xf8\x09\xb9\x38\xe7\xf8\x7a\xbe\x9f"
- "\x1e\x62\x09\x39\x15\xe7\x49\x60\x63\xa3\xd4\x7e\x24\x9b\x27\xad"
- "\x73\xc6\x4a\xd8\xe7\x80\x95\xd1\x0a\xdd\x49\xee\xfa\xb9\x12\xce"
- "\x81\x85\x52\xde\x0e\x49\x79\xdb\x25\xe5\xed\x90\x94\xb7\x52\x48"
- "\x03\xca\x2d\xec\x65\x45\x39\x42\xb9\x4d\xfe\x5e\x92\x2f\x47\x2e"
- "\xef\x68\xaf\x93\x47\xcb\x6d\xb9\x33\x5f\x4c\xfe\x1a\xdb\x43\x87"
- "\x5d\x93\xbd\x5d\xf8\xa2\xdc\x3d\x5f\x4c\xaa\x95\xf2\xbb\xc3\xa5"
- "\x6d\xec\x94\xc6\xbb\x97\xe5\x7a\x38\x6e\x91\xf6\x35\x04\x3f\xe4"
- "\x4f\x4c\x5b\xd9\x07\x15\xf3\x72\x95\xda\xf2\xe4\x63\x9d\xeb\x61"
- "\x72\xa1\xb2\x3d\x63\x5d\x23\x27\xa0\x0e\xac\x53\x36\xae\x04\x3f"
- "\x5e\xaf\x93\x53\x90\x1b\x94\x1c\x0d\xb2\x79\x0e\x8a\xed\x65\xf2"
- "\x0e\xe7\xb6\x38\xd9\x47\x6a\x8b\x52\xda\x61\xbf\x81\x3a\x0a\xe9"
- "\x48\x37\xcc\xdf\x25\x5d\xac\x9b\x0a\xb6\xff\x0c\xaf\xd3\x58\xb9"
- "\x4f\x43\x79\x88\x9b\x0a\x71\xa2\x5c\xfa\xc7\x1c\xb4\xcf\x24\x4e"
- "\x32\x32\xce\x2a\x60\x5c\x91\xda\xcc\xec\x09\x9b\x51\x22\xf5\x13"
- "\xe0\x17\x22\xf9\x05\x4a\x7d\x89\x8c\x9b\x83\x2e\x36\x95\xba\x1f"
- "\x1f\x4d\x32\xca\xe3\x23\xa6\x8b\x71\x51\xd8\x2e\x29\x7f\xe8\x37"
- "\x9a\xfb\x4d\x4a\x41\xbf\x2c\x5e\x0e\x79\x94\xf5\x57\x93\x02\xa5"
- "\xfe\x0a\xdb\x97\x60\x12\x27\x6e\xc0\x36\x86\xf7\x26\x71\x0a\x9b"
- "\x0b\x56\x67\xb4\xe2\x1c\x62\x1b\x84\x05\x21\x1f\x20\x5f\xe0\xfb"
- "\xc6\xec\x3c\x8b\x9d\x67\x22\xef\xe0\x38\x04\xc3\x41\xce\x1f\xb9"
- "\x08\xfc\xe7\xe2\xb7\x06\xe9\x77\xde\xa0\x77\x4a\xa4\x14\x77\x39"
- "\x1b\x2b\x7c\x17\xa5\x96\xfd\xe4\x78\xd0\x8e\x86\x63\x3c\x8c\x2f"
- "\xf3\x17\x72\x97\x0d\xb9\x89\xa7\xb7\x4f\xc2\x38\x9b\x37\xc8\xe3"
- "\xa2\x36\x41\x21\x8b\xfb\xb3\x31\x4e\x9b\x2a\x4a\x7c\x76\x19\xe3"
- "\xb2\xfa\x03\xae\x4c\x6b\xa1\x5f\x97\x24\x13\xb1\xf8\x12\xf2\x62"
- "\xb0\x85\xdb\x39\x35\x86\xe7\x63\xea\x1d\x2c\x1f\x9c\x53\x73\xb8"
- "\x2d\xc1\x96\xe2\x56\x16\x36\x11\xf3\x82\x61\xd9\x8a\x30\xdc\x6f"
- "\x11\xc2\xd8\xde\x7a\xae\xf1\x1c\x6d\x89\x9d\xe4\x4b\x5a\xd9\xbc"
- "\xcf\xbb\xb8\x40\xe6\xde\xa9\x35\xdc\xce\xa9\xaf\xc9\xbc\x0b\xe5"
- "\x32\x18\xb9\x97\x85\x2d\x90\x64\x66\x49\x67\xc6\xef\x53\x0f\xf2"
- "\x72\x0d\x14\xa4\xf2\x0e\x92\xf2\xf1\x39\x9b\x67\x7f\x67\x80\xb2"
- "\x9d\xba\x57\x2e\x5b\xe5\x35\xb6\x1f\x48\x5f\x8b\xf7\x0c\xf7\x6b"
- "\xd8\x1c\xb6\x10\x65\xd0\x26\xde\x47\x4c\xd9\xe5\x3a\xa6\x3e\x2b"
- "\x4e\x7b\x0c\xfb\x25\x3e\x56\x9d\x36\x42\x5a\x9b\x22\xc6\xe4\xdf"
- "\x43\xbf\x70\x7f\x8a\xcc\x31\xb4\x39\x8a\xe0\xbe\x4d\x67\xc5\xfb"
- "\x97\xa3\x1f\xee\xb9\xa5\x94\x41\x7e\xda\xdd\x6a\x92\x74\xde\x1f"
- "\x23\xf3\x06\x72\xc9\x71\x4b\xbd\x34\xa6\x0b\x47\xbc\xed\xe4\xbc"
- "\x11\xae\x72\x1e\x87\x85\xab\x9c\x39\x63\x5a\x80\x2b\x67\xc0\xb8"
- "\x79\x7d\x73\xee\xfd\x27\x9d\xc6\x01\xe0\x77\x75\xee\xb8\xbf\x14"
- "\xdb\x28\xee\xf7\xca\xf8\x89\xad\xb7\x85\x2f\x94\x6d\x46\xde\x6c"
- "\x5a\x2d\xaf\x5f\x4c\xf3\xc2\xb1\x9a\x73\x7a\xe1\x91\x4e\xdc\x89"
- "\xe9\xc9\xfa\x44\xc2\xda\x91\x31\x19\xd7\x5b\xc2\xfd\x25\x9e\xdf"
- "\xe1\xc4\x95\x52\x1f\x86\x3c\xe9\xdc\x57\x05\x5f\x76\xee\xab\xc2"
- "\xbf\xef\xcc\x91\xe1\xc6\xae\xf7\x55\xe1\xdb\x90\xb7\x64\x8e\x74"
- "\xe6\x82\xf0\x8a\x62\xa7\xb1\x6c\xf8\x0c\x79\x2c\xdb\xc1\xa3\xf7"
- "\xd7\x21\x47\x41\xfa\xe5\x3c\xed\x69\xe1\xd0\xef\x47\xc8\x69\x43"
- "\x78\xca\x71\x1d\x60\x33\x37\xb8\x14\xae\x75\xd2\x18\x90\xb5\xcd"
- "\x56\xdc\xdf\x4f\x9c\x9a\x08\xf8\xeb\x8f\x38\x33\x2e\xb9\x44\x4e"
- "\x77\xf4\x15\x15\x4d\x4b\xdb\xcb\xf7\x98\x72\x5c\x58\x54\x40\x37"
- "\x40\x3a\x3b\x95\x79\x7c\x0d\xfc\xb2\xa5\x35\x04\x56\xb6\x4c\xd7"
- "\xb4\xd4\x92\x02\xe7\xbc\xf1\x7c\x4c\xdb\x85\xf9\xc0\x39\x11\xa4"
- "\xbf\x08\xc7\x3d\xb8\xe7\x33\x8c\xa9\xcc\x25\xed\x98\x1f\x1b\xd9"
- "\x92\xa9\x1c\x5f\x8d\x9e\x81\x5c\x29\xcd\x3d\x2b\x61\xbc\x93\xa3"
- "\x5c\x8b\x99\xf9\x70\x8c\x2e\x29\x79\xe1\x92\x94\x05\xe3\x75\x0b"
- "\x97\x2c\x4c\x59\x38\x77\xd1\xc2\x55\x73\x53\x16\x2e\x5d\x12\xbc"
- "\x78\xee\x73\x0b\x9f\xd5\xad\x9c\xbb\x4c\x17\x92\x3a\x3c\xb5\x3f"
- "\xe9\x10\x9d\xaa\x9b\xbb\x6c\xd9\xf2\xc5\xf3\xe7\xe9\x96\x2c\x7c"
- "\x76\x74\xf2\xfc\x65\xf3\x53\x74\x73\x93\x97\x2e\x5f\x32\x4f\x37"
- "\x7c\xde\x98\xe1\x21\x93\xe6\xf5\x57\xae\xa1\x0d\xd5\x92\x46\xc7"
- "\x95\x86\x86\xec\x2b\xc4\x5b\xa3\x4a\x4a\xd6\xa4\x2e\x5c\xc2\xd7"
- "\xec\xa6\x07\x8c\xcd\x23\x49\x10\xee\x53\x92\x8b\x65\xfd\x80\x1e"
- "\xce\x22\xca\x41\x3e\x75\x70\xed\x0d\xb6\x0f\x6e\xce\x7d\xa0\xd6"
- "\x24\x3e\x64\xc4\x32\x83\xb2\xd0\x41\xde\x06\xd3\x2b\x95\x0d\x30"
- "\x66\x4b\xc2\xf7\x0c\x4a\xae\x10\xff\x9c\x15\x44\x04\xe7\x03\x4e"
- "\x2b\x68\x71\xad\x6b\xba\x8f\x49\x8c\xd0\xf3\x35\xd1\xe9\xbb\xcc"
- "\x03\x13\xd6\xd3\x9c\x84\xf5\xbc\x5e\xa6\xff\x49\x5e\x0b\x8f\x7e"
- "\x99\x44\x23\x3e\xeb\xc5\xe9\xec\xf9\xcb\x4b\x80\x65\x5c\x0b\x6e"
- "\xfa\xf0\xa1\x08\x18\x0f\xd6\xe1\x7a\x2e\x84\xfd\xc9\x22\x10\x1f"
- "\xb0\x4b\x3c\xbc\x26\x84\x6c\x85\xb4\x96\x05\x52\x0a\x69\x24\xc9"
- "\xeb\x69\x90\x07\x2d\xe4\xa5\x56\xca\xc7\x2f\x59\x3e\x0a\x68\x50"
- "\x9e\x1f\xd8\x97\xcb\xec\x29\x94\xf3\x00\x76\x43\x7e\xa6\x13\xb0"
- "\x53\x8b\x76\xb9\x5b\xeb\xc3\xf5\x2e\xb0\xf3\x8c\x63\x05\x94\xdb"
- "\x10\xbe\x67\x6c\x76\x31\x6f\x7f\x90\xaf\xc1\x25\x70\x9d\x75\x89"
- "\xf8\xbc\x96\x4c\xfc\x69\xe6\xdd\xf4\x98\xc5\x46\xaa\x13\x6b\x89"
- "\xe6\x45\x6a\xa6\xef\x35\x34\xf0\x3c\x45\x68\x91\x1b\xde\x79\xbe"
- "\x56\xc4\x3c\x41\x5f\xe1\x53\x72\xc9\xe3\xda\xa2\xb8\x75\x10\xb5"
- "\xd0\xed\xca\x31\x57\xc4\x8b\x58\x26\x38\xde\x6a\x82\x7e\xaa\x39"
- "\x37\x22\x01\xec\x2e\x97\xc6\xc6\xd0\x67\xcc\x51\x8c\xa5\x22\x10"
- "\x67\x16\x0f\xba\xbd\x65\xdd\x54\x60\x7b\x2d\x07\xf2\xfa\x8f\x38"
- "\x03\x71\xcc\x0a\xfd\x46\x57\xfd\xa8\x13\xae\xcd\x72\x3a\x7c\x1e"
- "\x1e\x81\x63\x02\x33\x60\xd9\xec\x21\xbd\xa0\xdc\x02\x7a\xb2\x1a"
- "\xfc\xb3\x5b\x88\x08\xb2\x27\x4b\x0a\x50\xff\x83\x3a\x93\xf8\xc0"
- "\x7a\xd4\xff\xd2\x20\x42\xd6\x83\x4c\x53\xee\xf4\x72\x5c\xdf\x85"
- "\x30\x68\xff\xc1\x65\xae\x6b\xd6\x12\x9e\xa7\xba\xe0\x39\x22\x17"
- "\xc7\x84\x79\xa0\x1f\x30\x94\x7d\x19\xfa\x61\xb8\x1f\x93\x47\xf4"
- "\x98\x0e\x5c\xd7\xe0\x7a\x08\xe8\xcc\x91\xd3\xa3\x80\xff\x2c\x07"
- "\x5f\x83\x91\xb0\x15\x5c\x9d\xda\x80\xdf\x0c\xa3\x87\x81\xdf\xd1"
- "\x46\xc4\x18\xc4\xa9\x90\x31\x05\x58\x3f\xc9\x70\xe5\x4f\xf4\x34"
- "\xf7\xc1\xa8\x12\x3f\x90\x03\x5c\x15\x03\x9e\x10\x57\x20\x6b\x96"
- "\x31\x05\x58\xab\x41\x39\xb0\xa1\x7f\xd9\xaa\x08\x11\x39\xf2\xb4"
- "\xf8\xd0\x7c\xc4\x18\xfd\xef\xc7\x6b\xe9\x4f\x7e\x5d\xcb\xeb\xe9"
- "\xa1\xf9\xd5\x56\x5e\x07\x1d\xe5\xfe\x50\x98\xa2\xdc\x6b\x00\xc7"
- "\xfd\xb1\x9c\xf9\x5a\xf5\x43\xf3\xc1\xb6\x1a\x36\x16\x5f\x0b\x75"
- "\xc0\xfa\xaa\x87\x70\xbf\xe9\x40\xa9\x0c\xab\x3a\xca\xf0\xa1\x0c"
- "\x77\x65\xe8\x52\x76\x22\x3a\x9a\xfb\xd0\x66\x6c\x2b\x10\x67\xaf"
- "\x49\x7c\x70\xb6\xa7\x67\x05\x90\x86\x28\xe6\x11\x6f\x4c\xa3\xc2"
- "\x9f\xc9\x9f\x96\xd3\xc8\x86\xb2\x36\xa7\x27\x5e\x15\xcf\x15\x3b"
- "\x08\xc1\x35\x71\x8c\x1f\xe4\x8f\xe5\xfb\x70\x50\x47\x7c\x6a\x71"
- "\x8d\x3f\xfc\x59\x27\x5b\x99\xa3\xb9\x0f\x87\x6d\xf5\x03\x1c\x31"
- "\x7b\x1f\x9e\x77\x35\x7b\x83\x74\xbc\x9f\x34\x0e\x45\x7c\x3f\x5c"
- "\x54\xbd\x8d\x10\xf4\x93\xee\x37\x37\x41\xdf\xe3\xba\xbe\xef\xf9"
- "\x79\xc3\xc3\x5f\x3a\x3f\x6f\x78\xb8\xca\xd3\xf3\x06\xe7\x74\x23"
- "\xef\xc0\x74\x1d\x25\xb3\x55\x1d\x69\x47\x8a\x0e\x37\x69\xcb\xf1"
- "\xc7\xec\x50\xce\x67\x22\x17\xa2\x0d\xc7\xa1\x9f\xa2\x3f\x9d\xad"
- "\xa2\xa0\xa7\x82\xf5\xe1\x91\x89\x7c\xfc\x82\xe3\xa2\xc8\x28\x94"
- "\x71\xcd\x47\xfb\xe1\xed\x8f\xf3\x3c\xd2\xc2\x6e\xbc\x7e\x46\xf0"
- "\x17\x25\xe4\x6e\x83\x1c\x2c\x38\x09\x13\xea\xe6\xc6\x87\x10\x1d"
- "\x93\xa7\x70\x70\x2f\xe9\xde\xcc\x6e\xc4\x76\xf9\xf6\xf0\xeb\x38"
- "\xfa\x71\x7b\x99\x3e\x2b\x51\x49\xe9\xa5\x2a\x24\x22\xaf\x12\x9b"
- "\x12\x39\x8a\xbb\x03\x77\x49\xcd\x98\xed\x05\xfa\xb6\x31\x61\x4a"
- "\x6d\x92\x7e\xf9\x9e\x2a\xef\xd1\xc7\xf9\x1e\x0e\xf5\x1c\x45\x02"
- "\x77\xab\xe7\xb1\xd7\xc6\x86\x55\xb5\x7b\x09\x3b\xb4\xca\x24\xb5"
- "\x24\xc3\x8b\x5d\x68\xf0\x8f\x15\xf4\xe9\x21\x5c\x57\xde\x2e\x70"
- "\xbb\x65\x9d\x42\xfc\x33\x6e\xfe\x50\xef\xab\xe4\xb1\xbb\xc7\x10"
- "\xc5\xf5\xdd\xfc\x74\x4f\x65\x2f\xea\xbf\xfa\xa1\xab\xe9\x27\x5f"
- "\x76\xc0\x63\xe8\x0c\x77\xa2\x1d\xe5\x3f\x74\x97\xec\xa5\x44\x68"
- "\x47\xf8\xbd\x7a\xe7\xfb\xfb\xac\xce\xf7\x23\xa3\x7a\xc3\x74\x23"
- "\xfe\x49\x37\x0d\x24\x64\x84\x7f\xbb\xa7\xc6\xa5\xc9\x68\x72\x5c"
- "\x9a\x50\xc7\x21\x59\xa3\x06\x7b\x0a\x15\xde\xa2\x7b\xe9\x1b\x73"
- "\xdc\xb9\x4e\x6a\x10\x77\x9b\xb5\x9d\x02\xa7\xbb\xf8\xe1\x7d\x1f"
- "\x9d\xe4\x37\xee\x50\x27\x79\xe6\xa7\x53\xdc\xab\x22\xe0\xcf\x0e"
- "\x60\x56\x43\x67\xd9\x1f\x8f\x1f\x8f\x2e\x1c\x2a\x6c\x1f\x3f\x1e"
- "\x37\xe8\xa0\xbc\x17\x07\x26\x62\x27\xfc\x47\xdb\x89\x92\x4a\x01"
- "\x54\xf2\xa0\xd2\x45\xaf\xf4\xe3\x3f\x1e\x3f\x1e\x3f\x1e\x3f\x1e"
- "\x3f\x1e\x3f\x1e\x3f\x1e\xb7\xc0\xa1\x52\x4e\xac\x71\x7e\xda\x57"
- "\x3a\x2b\xe7\x3f\x2a\xc9\x29\xfd\x84\xeb\x89\x47\xa5\x83\x64\x44"
- "\x18\x75\x3b\x12\x4c\xda\x9c\x98\x9a\x90\xb2\x24\xb3\xf7\x86\xa8"
- "\x4a\x7d\x69\x62\x43\xe0\x36\x43\x6d\x58\x79\xaa\x55\x5c\x1f\x59"
- "\x11\xb4\x73\xde\x69\xff\xbc\xd9\x27\x43\xf7\xa6\x58\x7c\x36\xcf"
- "\xa8\x0a\xde\xb5\xa8\x71\x70\xe1\x9c\xba\xf0\x03\x6b\x6c\x42\xe6"
- "\x43\x1f\x0f\xfd\xfd\x33\xf5\x7e\xb9\xff\x75\x62\xfc\xdb\xc9\x97"
- "\xfa\x6f\xfa\xf9\xd1\x91\xff\xf3\xfc\xb9\x3b\x7f\xfb\xf4\xdf\xa7"
- "\xee\x5f\xd5\xda\xe7\x95\x9f\xfd\xf9\xde\x3f\x2e\x38\x3b\xa8\xe0"
- "\xc9\xbf\x4e\x7a\x6f\xc5\x15\xdf\xac\x59\xc7\xc7\xbc\xb5\xe4\xc2"
- "\x90\xe2\xb8\x7f\x3e\xf0\x61\x9a\x43\xb5\xee\xc1\x43\xf7\xfc\x6e"
- "\xee\xd7\x03\xb7\xfc\xe2\xf3\x71\x7b\x7e\xf3\x7d\xbf\x8d\x8f\x7d"
- "\x3a\xe2\x4f\x0b\xff\x75\xc7\xeb\x4f\x7d\x31\x65\xdf\x8b\x2d\x5e"
- "\x2f\x3f\x72\x64\xf8\x1b\xf3\xcf\x04\xe4\x3f\x71\x6a\xe2\xbb\xcb"
- "\x2f\x0f\x78\x6d\xe6\xb1\xd1\x6f\x2e\x3e\x7f\x57\x51\xec\x97\xd3"
- "\x0e\xae\xb5\xab\x5f\x7a\xf8\xf0\xb0\x3f\x3c\xfb\xcd\xed\x5b\x7f"
- "\xf9\x97\x09\xef\x2c\x6b\xba\xed\xd5\xc7\x3f\x1b\xf5\xbf\x2f\x7c"
- "\xf7\xd3\xed\xbf\xfe\xc7\xfd\x1f\xac\x6e\xeb\xfb\x7f\x1e\xfd\xe4"
- "\xbe\xff\xfb\xdc\xb7\x3f\xf9\xef\x5f\xfd\x6d\xf2\xfb\x2b\x9b\x35"
- "\xd9\xd1\xd5\x63\x77\x2f\xbd\x78\x77\x49\xfc\x57\xd3\x3f\x4a\xa7"
- "\xd7\x53\x7e\x44\xcc\x7b\xe9\x66\xd7\x1b\x3f\xbd\xb2\xa1\x27\xf1"
- "\xa9\xa0\x92\xea\x9d\x7b\x64\x4c\x24\x2a\x6f\xd2\x47\xec\xc1\x4c"
- "\xa1\xa7\xf9\xf5\x70\xe8\x94\xf1\xbb\x72\xe0\xcb\x84\xe3\xc0\x4d"
- "\x00\xf7\x53\xe6\xd3\x31\xfb\x1f\xda\x45\x1d\x37\xfe\x50\x41\xde"
- "\xd5\x60\x99\x17\xe9\x03\xa5\xe5\x4d\xfa\x91\xfe\xe4\x36\xe2\x43"
- "\x06\x10\x5f\xa2\x21\x5a\x32\x90\xf8\x91\xdb\x89\x3f\x09\x20\x83"
- "\xc8\x4f\x48\x20\xb9\x83\xdc\x09\xb9\x19\x4c\xee\x22\x43\xc8\xdd"
- "\x50\x28\xf7\xb8\xcf\x4b\x06\x89\x08\x84\x3f\xf0\x3f\x86\x44\xb0"
- "\xfb\x84\x1f\xfd\x6f\xaa\xbf\x51\xf2\xaf\x91\xfc\x4d\x3f\xfa\xdf"
- "\x54\x7f\xdd\xbf\xf9\x7c\xcf\xbf\xf5\xac\x82\x21\x03\x1f\x35\x38"
- "\x8d\x1d\xda\x0f\x57\x5f\x95\x74\xb4\xdf\x93\x6b\xc4\xef\xa4\xcf"
- "\x39\xbe\xeb\x11\x01\x2e\x94\x5f\xa6\x13\xc2\x9f\x33\x50\xe5\x61"
- "\x2b\x50\x7d\x2c\x0e\xcc\xc0\x47\x26\xde\xc4\x9f\xfd\xbd\xf6\xf1"
- "\x46\x10\x38\xe0\xf9\x37\xc2\xc1\x4d\x07\xf7\x38\xb8\x27\x64\xdd"
- "\x44\x25\xd4\x11\x95\xe8\x4f\x54\xea\x54\x38\x97\x11\x95\x57\x24"
- "\x51\xf5\xad\x20\xaa\x3e\xeb\x89\xaa\x9f\xd8\x61\xbc\x9f\xae\xdd"
- "\x4a\x95\x56\xf2\x07\x2f\x95\x7f\xa9\x22\xb1\xee\xf6\x67\xe5\x8f"
- "\xcc\x8e\xd2\x8d\x1b\x13\x3a\x66\x62\x88\x6e\x74\xcc\x68\xdd\xf8"
- "\x90\x71\x21\x63\x43\x42\xc7\x8e\x9b\xa4\x1b\x37\x61\xea\x84\x90"
- "\xa9\x21\x93\x75\x8b\x5f\x4c\x5e\x38\x2e\xe4\xb9\xf9\xba\x25\xf3"
- "\x16\x2e\xd3\x2d\x58\x98\xbc\x78\xe5\xdc\xe4\xf9\x5d\xc8\x79\xb7"
- "\x0e\xcc\xdd\x5d\x76\x6e\xa6\xb2\x86\x54\xd0\x83\x88\x33\xca\x89"
- "\x98\xb0\x81\xb4\x87\xa8\x72\xa4\xac\xe8\x25\xd7\xe9\x58\xfc\xf4"
- "\x93\x7f\x1f\xfe\x6b\xdf\x8f\x1f\x7c\x6e\xf8\xb4\x87\xff\x90\x5d"
- "\x46\x84\x5f\xce\x20\xc2\xcf\xcd\x44\x88\x80\xeb\xd0\x5a\x22\xdc"
- "\x97\x48\x84\xac\x03\x44\x78\x25\x92\x08\xab\x1b\x88\xb0\xd4\x42"
- "\x84\x67\xdc\xf8\x15\x99\xb9\xdf\xe7\x79\x44\xf8\xc4\x9f\x08\x1f"
- "\x40\xd2\x6f\x86\x70\xbf\x86\x40\x22\x7c\x99\xd1\xdb\x45\xd1\x0b"
- "\x47\x77\x71\xa0\xfa\x7f\x04\x22\x5e\xcf"
+static unsigned int rss_ethp_z8e_uncompressed_length = 571764 ;
+static unsigned int rss_ethp_z8e_length = 158985 ;
+static unsigned char rss_ethp_z8e[158985 + 1] =
+ "\x78\x9c\xec\xbd\x71\x7c\x94\xc5\xb5\x37\x7e\xb2\x59\x20\x62\x60"
+ "\x37\x31\xe2\x96\x62\x5d\x34\x81\x68\x03\x44\x1b\x2c\x52\xc0\x20"
+ "\xa0\xc1\x06\x88\x82\x6d\x54\x34\x41\x81\x06\x8d\xb0\x40\x84\x00"
+ "\x21\xbb\x2c\x68\xb1\x02\xd9\x44\x84\x28\x21\x49\xaf\xd8\xd2\x96"
+ "\x6a\xac\x78\x8b\xb7\xa8\x6b\x89\xbf\x1f\xed\x4d\xb2\x69\x5f\x7a"
+ "\xdf\xdc\xfe\xf0\x76\xe5\x46\x9a\xf2\x06\xd8\x92\x85\xac\x64\x77"
+ "\xe7\xfd\x9e\x99\xe7\x49\x76\x97\x0d\xca\xbd\xf7\xf3\xf9\xfd\xd3"
+ "\x7c\x3e\x9b\xe7\x79\xe6\x99\x39\x73\xe6\xcc\x39\x67\xce\xcc\x9c"
+ "\x39\x0f\xd1\xb5\xff\x79\x29\x89\x2f\x09\x64\xfc\x4e\xe1\xc7\xff"
+ "\x85\xf2\xff\xf8\xfb\xc7\xdf\x3f\xfe\xfe\xf1\xf7\x8f\xbf\x7f\xfc"
+ "\xfd\xe3\xef\xff\xdf\x3f\x5f\x02\xe5\x5c\x30\x18\xe9\xb7\x2e\xa2"
+ "\x5e\x67\xd2\x18\x2f\x85\x4b\xf7\xbe\x22\x82\x78\x95\x80\x71\x7e"
+ "\x0c\x5f\xf9\x57\x83\x34\x83\x8b\x92\x6e\x35\x93\x59\xec\xb5\x18"
+ "\x66\xed\x27\xda\x3d\x4a\x74\xbf\xb2\x47\xf8\x9a\x2b\x88\x8e\x1d"
+ "\xc0\xf3\x1e\xd1\xf5\xca\x28\xe1\x07\x9c\x62\x2f\x15\xed\x66\x38"
+ "\x5b\xf1\xbc\x15\xe9\x48\x2b\xf3\x52\xf1\x36\x4e\xab\x42\x39\x3d"
+ "\xdd\xb3\xed\x12\x35\x5b\x83\x54\xc5\x70\xac\x21\x9a\x3d\x56\xe2"
+ "\xd1\x88\xbc\xc9\x9c\x77\xcb\x28\xd4\x9b\x46\xe4\xdc\x23\x02\x11"
+ "\x38\x24\x71\x3d\x5c\xb7\x96\xbf\x3d\xa6\x3e\x1f\xd2\x3a\xf5\xfa"
+ "\x06\x81\x61\xe6\xf2\xdc\x06\xeb\x37\x28\xf1\x34\x5d\x7f\x23\xc3"
+ "\x64\xdc\x84\x93\x92\x3c\x97\x83\x74\x9a\xae\xcb\xec\x71\x52\xe2"
+ "\x31\x50\x63\xd7\x1e\x99\x9e\xe8\xf1\x07\xc9\x5a\x49\x09\x78\x37"
+ "\x0f\x57\x03\xca\x8d\x60\xfa\x2c\xac\xa3\x74\xae\x1b\x70\x8d\xc2"
+ "\xe0\x4e\x68\x48\x25\x62\x1a\xf9\x0d\x34\xde\xef\xa4\x84\x5e\xe7"
+ "\x75\x68\x7f\x52\xa6\x6c\x3f\xea\x45\x59\xe3\x69\x1a\xfe\x77\x03"
+ "\xf2\xa3\x4e\x9f\x75\x23\xe3\x30\xfc\x13\xe1\x74\x1b\x74\x38\x61"
+ "\xa7\xfb\xfa\xfa\x1a\xa2\x1e\xa7\x61\xae\xdf\x60\x12\x1a\x9c\xa3"
+ "\x3a\x1c\xce\x87\xba\x92\xb9\xae\x1e\xa7\xb1\x26\x22\x8f\x57\xcf"
+ "\x03\xbc\x7d\x93\xfc\x94\xc8\x38\x9f\xa2\xe1\x53\xb8\x3e\xad\x2d"
+ "\x46\xae\xc3\xb3\x2e\x48\x1e\xf4\x3d\xea\x4e\x43\x5b\xad\xc7\x02"
+ "\x44\x80\x99\xd2\x50\x49\xc4\xf0\x81\xbf\x55\xc1\x1c\x9e\xa3\xc3"
+ "\x64\x18\xfd\x6d\x75\xba\x53\x1b\x24\x8e\xdc\xd6\x24\xd2\xf2\x16"
+ "\x47\xe2\xc8\x70\xd1\x96\x9b\xb8\x2d\xcd\xe0\x28\x2d\xcf\xb6\x7e"
+ "\x7a\xf4\xb7\xff\xfa\xdc\x18\xd8\x16\x05\x3b\x01\xb0\x13\xdc\x5a"
+ "\xb9\xfe\xf6\x7b\x63\xf2\xab\xbc\xe6\xeb\xfc\x06\xa1\xd1\x61\x78"
+ "\xd7\x40\xde\xeb\x76\x47\xe6\x05\x3e\x06\x45\x5b\x32\x78\x69\x78"
+ "\x07\xda\x99\x88\x3c\xf9\xe8\x47\xab\xf6\xfe\x46\xed\xbd\x05\xef"
+ "\xee\x55\xf0\xae\x9f\x12\x01\xcf\xcc\xf0\x22\x79\x4b\x49\x94\x11"
+ "\xbf\x21\x30\x90\x87\xe2\x37\x2c\x49\xe7\xb7\xb5\x16\x11\xb6\x7f"
+ "\x0d\x6d\xaa\x49\x4f\x0a\x3b\x05\x79\xca\x03\x64\x1d\x4d\xf6\x53"
+ "\x74\x7d\x13\xe0\xd3\xae\x8d\x94\x64\xb7\x89\x80\xa7\xbc\x9b\xda"
+ "\x7c\xdd\x64\xf7\x41\x36\x82\x17\xa9\xf2\x22\x78\x31\x78\x96\x2a"
+ "\x57\x93\xa5\xb9\xe2\x73\x8a\xc7\xcb\x61\x83\x20\xfb\x18\x2e\xdb"
+ "\x49\x6d\x75\x9d\x64\xaf\x8b\x2e\x6b\xbf\x99\x2c\xad\x78\x46\x9f"
+ "\x9b\x18\x0f\x96\xb7\x60\x6a\x7a\x52\xc5\x6b\x64\xb4\x8f\x25\x43"
+ "\xeb\x52\xb7\x86\x4b\x72\x39\xe3\xb2\xed\x0c\x25\xbd\xb1\x1c\x7c"
+ "\x78\x86\xf1\xcd\x4a\x7a\x7b\x63\xc0\x70\xcc\x92\x4f\xc7\x2c\x27"
+ "\xa9\xd9\x32\x9d\x9a\xcb\x67\xd3\xae\x33\x94\x7c\x2c\x30\x8d\x9a"
+ "\x8d\xf7\x53\x73\xfa\x6c\xf2\x74\xe3\x1e\xf2\x7b\xcc\xe2\x27\xeb"
+ "\x3a\xe6\xa7\xe4\x92\xdd\xcf\x50\x92\x57\xc1\x04\xed\x92\xcb\x3e"
+ "\x2e\x23\x62\xda\xf1\x73\xbc\x76\xac\xfd\x1a\x59\x80\x5f\x17\x70"
+ "\xb9\x07\xb8\xfc\x32\xdd\x42\xd9\xc0\x79\x98\xa7\x36\x48\xc6\x0a"
+ "\xba\x6e\x10\x39\x4e\x0b\x83\xf7\x20\xbb\xdd\xf5\xd0\x27\x2c\xbf"
+ "\x3d\x9b\x0a\xa1\x13\x92\x21\xff\xc9\xdb\x34\x19\xe8\xb6\xff\x98"
+ "\x8c\x3d\xeb\x0b\x13\x1a\xf6\x88\xce\x5e\xe7\x08\xd2\xdf\x41\x16"
+ "\x3b\xf1\xbe\x6b\x52\x1a\x99\x3d\xc1\x5c\xfa\xe8\x72\x17\xcb\x63"
+ "\xf7\x48\x3f\x25\x30\x3c\x53\x39\x64\x67\x1d\x0d\x01\x3e\x7f\x68"
+ "\x40\xfa\x6d\xc8\x87\xf2\xb9\x5e\x7a\xb5\x9b\xcb\x8b\x9b\x1e\xf7"
+ "\x87\x6f\x7a\xfc\x62\x78\xef\xe3\x3d\x62\xef\xe3\x17\x42\x7b\x1f"
+ "\xff\xbb\x7d\x03\x25\x85\x6e\x7a\xdc\xd7\x66\x93\x7d\x60\x6e\xb3"
+ "\xa1\x0f\x42\x94\xb4\xf9\x2c\x99\x9f\x5c\x8d\xbe\x0f\x7e\x4a\x9b"
+ "\x57\x90\x25\x9c\x72\x87\xdb\x13\xfc\x13\x3d\x59\x41\x02\xf7\xed"
+ "\xf1\xda\xd7\x93\x9a\x95\xa7\xcb\x16\xea\x3d\xe2\x35\xde\x26\x69"
+ "\xe8\x4b\xc9\xc9\xc3\x2f\x1f\xbf\x02\xfc\x16\x89\xd4\xac\x45\xa0"
+ "\x95\x7d\xe4\x96\x04\xaa\xbf\x4c\x34\x29\x4c\x09\x67\x68\xc4\x09"
+ "\xe0\x6f\x1e\x84\x6e\x63\xc2\x35\xb6\xdc\xf1\x0e\xaa\xec\xed\x2d"
+ "\x21\xd6\x85\xac\xff\x58\x1f\xf6\x3a\x47\x5a\x51\x4f\xae\x94\xdf"
+ "\x3d\xd0\x31\xa9\xb6\x5c\xa4\x77\xf9\x37\x95\x24\xf8\x36\x95\x18"
+ "\x7a\x52\x6d\xb3\x90\x67\x36\xf2\x94\x6b\x34\xec\x62\x58\x90\x2d"
+ "\xdf\x88\x20\x25\x02\xa6\xed\xd7\x97\x3a\x8c\xfb\xf7\x88\x93\xc8"
+ "\x57\xda\x0f\x0b\xb0\x01\x07\xf4\x1f\xe9\xd0\xd3\x40\xeb\xce\x9d"
+ "\xc8\xc7\xe5\x3d\x81\x5c\x1e\x53\xbc\x9e\xd2\x2e\x32\x05\x69\xb8"
+ "\xe8\x53\xf5\x21\x4f\x17\xeb\xf4\x11\x01\x1a\xda\xeb\xa4\x02\x86"
+ "\xcd\xe5\x3c\xdd\x5d\x84\x72\xb3\x84\xbd\xc4\x80\xf4\xf9\xbd\xa2"
+ "\x24\x61\x1b\xd2\x8f\xa1\xbc\x56\x77\x97\x8e\x23\xd7\xc1\x7d\x2d"
+ "\xf1\x04\x3f\x1c\x2b\x0d\xd0\x88\x5a\x4a\x44\xb9\x85\x0c\x8f\x61"
+ "\x81\x0f\xbc\x68\xeb\xac\x63\xa5\x3e\x0a\x8b\x28\x98\x5e\x05\xcf"
+ "\x34\x25\x0a\x1e\xd2\x05\xe0\x31\xff\x35\xa3\xcc\x88\x46\x09\xef"
+ "\xe1\x5f\x87\x19\x5e\x80\x8c\x56\x89\xef\xf7\x18\x46\x2f\xeb\x0f"
+ "\xc0\x74\xaf\xbb\x8f\xba\xc9\xd4\xe8\xb3\x97\x24\xb6\x61\xdc\xe4"
+ "\xf2\x6f\x57\x76\x0d\x11\x3d\x85\x89\xcc\x73\xfc\xde\x13\xbc\xc0"
+ "\x79\xb6\x88\x9e\x92\xc4\x11\xdd\xd0\x45\xc8\x83\xf2\xe5\x8c\x67"
+ "\x64\x5f\x3e\x3c\xe7\x7b\xd3\xe9\x7b\xb3\xe7\xce\x9e\x4e\xf3\x66"
+ "\xce\x9a\x4e\xd9\xf7\x4c\xc8\xce\xf9\xd6\xb7\xbf\x25\x6f\xbe\xf5"
+ "\xed\x29\xdf\xa2\x82\xef\x3f\x3c\x9d\x0a\xe6\x4f\xa7\x85\xf8\x15"
+ "\x2c\x9c\xf3\xf0\xec\x39\x0b\xa7\x53\xe1\xfd\x73\xf1\x34\x6b\xfa"
+ "\x9d\xd9\x0f\x4c\x28\x98\x35\x77\x0e\x3d\xb4\xe8\xae\xec\xbb\xee"
+ "\xa2\x99\x73\xf2\xef\xcc\xce\xd6\xae\x77\x66\x73\x96\xc7\xa6\xcc"
+ "\x59\x38\xa1\x60\xcd\xaa\xb2\x55\x13\xe6\xcf\x9d\xc5\x29\xd0\x6e"
+ "\x11\x3c\x94\x19\xba\x14\x66\x5a\xfb\xc5\xf9\x3c\x0a\x43\x77\xd4"
+ "\x83\x07\xf0\xeb\x76\x57\x9e\x82\x0e\x48\x79\xbe\x9e\xfb\x4e\x8e"
+ "\x01\xa6\xa3\x90\x7b\x63\xaf\xd3\x5c\x01\x1a\x1e\x61\x1a\x5a\x6f"
+ "\x65\x3d\x71\xd3\xfb\x78\xf7\xb1\x36\xd6\x0c\xc1\xfb\xba\xe8\xf7"
+ "\x37\x40\x07\x9b\xfe\xdf\x36\x2b\x91\x07\x3f\xd0\xdd\x0f\x5d\x08"
+ "\xfa\xfa\xa8\xc7\x5e\x38\x04\xfc\x9d\x80\x3a\x3a\x21\x9b\xed\x28"
+ "\xdb\x11\x21\xf3\x9d\xe8\x9f\x76\x1e\x57\xce\x91\xf9\x9d\xb6\xb2"
+ "\x5c\xe2\x7e\xf2\x94\x69\x30\x2e\xf6\xc3\x18\x2e\x61\xa0\xef\x01"
+ "\xe7\x84\x82\x93\x62\x8d\xd0\x0f\x5e\x86\xb3\x0b\xef\x34\x58\x17"
+ "\xdb\xa0\x27\xa0\xc7\x53\xc3\xf6\x4c\x12\xa9\xe9\xe6\x70\x5f\xa6"
+ "\x1c\x2b\x51\xae\x30\x82\xaf\xfd\xcd\xe5\xc8\xf7\x46\x5e\x02\xf8"
+ "\x20\x01\xe3\x2f\xda\x62\x5e\x0a\xfe\xf6\x87\x6a\x72\x1e\x15\xe7"
+ "\x0b\xd9\x8e\x18\x7a\x9a\x52\xff\x80\xf6\xb5\x84\x6b\x72\x0a\x45"
+ "\xaf\x4c\x63\xba\x1d\x11\xfc\x9c\x8a\x7c\x7d\xfd\x69\xef\x73\x1a"
+ "\xf8\x20\x91\xe5\x55\x08\x99\x8e\x31\x33\x75\x03\x74\x5a\x07\xf2"
+ "\x16\x72\xde\x49\x41\x1a\x06\x5d\x63\xb1\xda\x13\xe8\x14\xa5\x52"
+ "\x38\x35\xe7\xb1\x88\xfa\x00\x27\x95\x07\x29\xe6\x47\x63\xef\x79"
+ "\xc0\xe9\x91\xe9\xb0\x63\x52\x9f\x00\xfc\xc7\x59\x57\x2a\xfd\x7d"
+ "\xd3\xbf\x73\x3e\x6d\x6c\x1e\x78\x86\xac\x2b\x38\x37\xfd\xfb\x31"
+ "\xd0\x92\xed\x05\xb6\xff\x7a\x9d\xa9\x8b\xbc\x34\xc2\xa7\xc6\xc6"
+ "\x9b\x3a\x38\x6f\x18\x38\x0a\xf3\x7b\x25\x80\xbb\xd8\xbd\xb1\x9b"
+ "\x4e\xdb\x78\xac\x4d\x35\x87\xed\x25\x14\x8d\x53\x4a\x0b\xe3\xcf"
+ "\xfa\x03\xb4\xf8\x13\xf8\xe0\x3a\xc0\x3b\x10\xcd\x07\xa9\x6e\xc0"
+ "\x79\x14\xf8\x75\xa0\x4d\x8f\x7a\x29\xe5\x78\xb8\xa7\x04\xf5\x92"
+ "\x01\x72\x05\x7d\x3e\x00\x43\x2b\xdf\x19\x5d\x3e\x65\x3b\x97\x43"
+ "\xfe\x21\xbd\x3d\x32\xff\x0e\xa6\xb9\xc6\x77\xe0\xcb\x1b\xd2\x62"
+ "\xf8\x72\x3f\x70\xf9\x8f\x88\xf7\x39\x31\xef\xb7\xe0\xfd\x7f\x6a"
+ "\xef\x21\xf7\x37\x2c\x8a\xe1\x5b\x1b\xde\xff\x15\xf8\xfa\x21\xd7"
+ "\xb0\x2d\x52\xf2\xc0\x63\xbe\x88\xfc\xdb\x62\xf2\x37\x22\xff\xff"
+ "\x61\xbe\xe1\x31\x87\xf3\x37\x68\xb2\x83\xfc\x49\xc8\x7f\x38\xa6"
+ "\xfe\x25\xc8\xef\x8f\xc0\xef\x44\xf4\xfb\xb4\x3a\xbc\xff\x82\x79"
+ "\x1d\x36\xd1\x10\xe4\x19\xc6\xba\x84\xf5\xd8\xb1\x52\xee\xaf\x34"
+ "\x63\x4c\xfe\x74\xe4\x4b\xd6\x68\x64\xd0\x68\x94\xc7\xfd\x88\x3a"
+ "\x4e\x2a\x1c\xd2\xa6\xc4\x94\x29\x44\x99\x34\xd0\xf1\x51\x9d\x2f"
+ "\xe3\x94\x29\x8d\x29\xb3\x83\xfb\x51\xa8\x7a\x8c\xbd\x7d\x03\x65"
+ "\x34\x1d\x19\x09\x83\xdb\x76\x3d\x60\x34\x45\xc3\x18\xd5\x85\x7a"
+ "\xc7\xec\x54\x7a\xe7\x7a\xf0\xd0\x5d\x48\xfb\x77\xc0\x7c\x82\x65"
+ "\x00\xb2\xea\xf7\xf8\x02\x24\xec\x79\xc9\x8a\x77\x6f\x4c\x19\x19"
+ "\x24\xbe\x9f\xc0\xf7\x0c\x5b\xf4\xe6\x6b\x32\x79\x63\x0a\xae\x48"
+ "\x4f\x63\xfb\x2d\x81\x75\xb0\xe8\xfd\x6e\x58\xc1\xbc\x71\xb2\x30"
+ "\x90\x01\xcf\x21\xad\x8e\x3f\xe0\x39\x01\xf8\x3f\x86\x31\x87\xc4"
+ "\x7a\xe4\xdb\x48\xb3\x90\xfe\xb1\x94\x55\x95\x4f\x3e\xab\x3a\xf2"
+ "\x98\xbf\x73\xf0\xfc\xbe\x56\xfe\x1d\x86\x87\xfb\x3b\xb5\xfb\x84"
+ "\x10\xc3\x3a\xaf\xcb\xe0\xa8\x9f\xc9\x72\x90\x43\x09\x1f\xe5\xc5"
+ "\x7a\xf9\x8e\x61\xbe\x8a\xeb\x5c\x5c\xb7\xe0\xfa\x10\xae\x4f\xd8"
+ "\xbf\x20\x8b\x3d\x24\xe5\x91\x9f\xe7\xe2\xfa\x30\xae\x93\x71\x5d"
+ "\x88\xeb\x58\x5c\xef\x43\x1b\x42\x2c\x17\x18\x47\x79\x8e\xe5\xc7"
+ "\xb8\xaa\x78\x8b\xe7\x00\xbd\x79\x4c\x83\x39\xc8\xd3\x25\xe5\x55"
+ "\xe9\x97\x24\xd5\x8f\x37\x76\xcb\xb4\x54\x99\x36\x4c\xf1\x83\x4a"
+ "\x0b\xe9\x7a\xe8\xfc\x40\x9a\xa6\x9b\x34\x59\xd4\xd2\x14\xfc\x02"
+ "\xc0\x77\x33\xae\x42\xc1\x1a\xa2\xfa\x5c\x83\xaf\xca\x19\xe3\xd4"
+ "\x99\x10\x59\x27\xae\xbb\xed\xe5\x42\xe0\xea\xe0\x3e\xf2\xd2\xa8"
+ "\x26\x21\xf9\x1e\x63\xac\x82\xb7\x58\xcb\x97\xc3\x34\x96\xe5\x65"
+ "\x7a\x5a\x7b\x04\x2f\xa5\xf6\x3a\x47\x05\x63\xe4\x28\x1b\xbc\x34"
+ "\x91\x79\x86\xe9\xce\x6d\x1b\x69\x93\xe3\xb8\x6c\x8b\x84\x7f\x5e"
+ "\xf1\x64\xbd\x36\x6f\x55\xf2\x7b\xd3\xec\x18\xfd\x22\x79\x36\x46"
+ "\xde\xbb\x99\xe6\x89\x15\x2c\x07\x37\x61\xfe\xf7\xf6\x18\x69\x33"
+ "\xd6\xe4\x3c\xc9\xef\xfd\xe8\x63\xae\x37\xd1\xc6\xed\xb8\x69\xb7"
+ "\xfe\x5e\xbe\x4b\xb1\xb9\x99\xbf\x13\x4b\xe5\xbb\x26\x8c\x47\x47"
+ "\xf4\x77\x7a\x3d\x89\x65\xf2\x5d\xcb\x00\xdc\xf4\x6c\x0d\x6e\x62"
+ "\x3c\x9b\x4f\xb8\xd2\xad\x13\x88\x0c\x77\x38\x68\x88\x27\x78\x82"
+ "\x16\x04\x45\x68\x82\x83\xae\xf3\x04\x0f\xd1\xed\x44\x29\x9e\xe0"
+ "\x49\xba\x83\x68\xac\x27\xb8\x1b\x36\xc8\x01\x7e\xff\xd1\x78\x4a"
+ "\x48\xc0\xd5\x3e\xce\x61\x48\xf0\x04\xcb\x28\xdd\x61\xc4\xb5\x94"
+ "\xee\x1f\x22\x7a\x3d\xc1\x7c\xe4\x5b\x4a\x0b\x42\xe2\xfc\xec\x21"
+ "\xe2\x2f\x45\x21\x32\xe7\xbf\x20\xec\x9e\x20\xe6\x03\xc1\x16\xa4"
+ "\x87\xc5\x82\xd0\x17\xf8\xf5\x8a\xb0\x2b\x3d\x7b\x41\xe8\xbc\x98"
+ "\xf5\xc2\x47\x78\xfe\x8b\x40\x1f\x09\x4f\x70\x1a\xb5\xf9\xfd\xc8"
+ "\x67\x17\xa2\x3a\xdd\xfa\xe4\x45\x03\xf5\xc1\x86\x08\x57\xa7\x67"
+ "\xa3\x2d\xb9\x7d\x68\x07\xc6\xd7\x7b\xfb\x36\xe1\x5a\x93\x3e\x43"
+ "\x3e\xbb\xd2\x0b\x84\x39\x3d\x77\x22\x26\x57\xdc\x06\x4f\xb0\x93"
+ "\x8a\x30\x3d\x58\xb0\xc1\x27\x18\xff\x91\x5b\x78\x6e\x35\x8d\xd0"
+ "\x07\xa6\x05\x1b\xec\x02\xef\x92\x44\x4a\x7a\xae\x27\xd8\x4d\xa8"
+ "\xa3\x00\xf0\xe6\x49\x78\xae\x74\x1b\xf2\xfa\x38\x5f\x24\x1c\x86"
+ "\xc1\x79\x17\x84\xc8\x84\xfc\xb6\xbe\x94\xf4\x62\xfc\x1c\xf8\x35"
+ "\xa1\xec\x6f\x85\x33\xed\x63\x81\xf1\x1e\xe5\xdb\xf1\xec\x0d\x40"
+ "\x86\x25\x2d\x43\x34\x0c\xf9\x61\x3b\xd0\x6c\xf0\x1d\xf0\xcd\x20"
+ "\x89\x6f\x4d\xba\x08\xa8\x76\x84\xb5\x76\x84\x38\xbd\x07\xb6\x0e"
+ "\xf2\x58\x7b\xe4\xbb\x8c\x5b\x50\x6e\x91\x2c\xe7\xca\xb0\x0a\x73"
+ "\x46\x76\x00\xf2\x05\xba\x3a\x98\x8e\xa0\xab\x83\x69\x29\xaa\x33"
+ "\xac\x9e\xf2\x1d\x24\x52\x32\xb2\xfb\x52\x32\x72\x51\xfe\xe1\x3e"
+ "\x69\x83\x64\x14\x07\x24\xec\x8c\x22\xc0\x59\x0c\xbe\x4d\x04\x8c"
+ "\x62\xc0\xb2\xf5\x39\xad\xb4\x60\x83\x08\x2c\x08\x6e\x09\x16\x6d"
+ "\xa0\xc4\x2c\x72\x00\xdf\x0f\x40\xa3\xa5\x68\x67\x33\xae\xb3\xf1"
+ "\x9e\x6e\x40\x5d\x1f\x01\x6e\x31\xd7\x87\x7a\x6c\x80\xf9\x1c\x60"
+ "\x2d\x65\x9c\xbe\x70\x92\x19\xcf\x8e\x2f\x14\x7e\x8d\x61\x57\x86"
+ "\x3b\x6c\xce\x68\xd2\x79\x88\xf9\x47\xd1\x6d\x37\xcd\xf7\x8b\xa0"
+ "\x27\xb8\x9f\xc0\x63\xe6\x36\xff\x49\x7e\x8f\xf9\xcf\x21\xf4\x33"
+ "\xf3\x54\x19\xae\x07\x88\xf9\xa7\xcd\xf6\x02\xe7\xfd\x88\x79\x68"
+ "\xbe\xcd\xbf\x65\x02\xd9\x12\xf0\x6c\x2f\x0a\x26\xd1\x93\x36\xa3"
+ "\x23\xe4\xca\x70\xb5\xd9\xb8\x5f\x4e\xa0\x0c\x97\x2b\x25\x53\x02"
+ "\xe6\x00\x09\x22\x68\x2a\xf7\x19\x47\x94\xd8\x45\x9b\x3f\x1f\x79"
+ "\x6d\xc4\xed\x61\x3e\xe2\xfc\xf3\xba\x85\x37\x64\x1e\x97\xcb\x6d"
+ "\x13\x23\x1d\xd4\xda\x3d\x99\x78\x1e\xd6\xda\x7d\x80\xf9\x34\x2c"
+ "\xcc\xe3\x98\x47\xfb\xe6\x75\x3b\x86\x3c\x79\x91\x12\x90\x16\x6a"
+ "\x2d\x39\x84\xf7\xcd\xc8\xd7\x22\xf9\x76\xfe\xc5\xa0\x29\x68\xce"
+ "\x70\x04\x5d\xe3\xac\xf3\x2f\xf6\x89\xd6\x92\xdd\xf4\x44\xb7\x03"
+ "\xb4\x3a\x44\xf3\xce\x06\x13\xdb\x6c\x4b\x91\xa7\x17\xe9\x07\x24"
+ "\xff\xcf\x3b\xdb\x23\xe6\xaf\x16\xe7\xe7\x5f\xfc\x8b\x98\x57\x22"
+ "\x3e\x2a\x2a\xa7\x91\xd7\x6f\x11\x61\x96\x8b\x96\xce\x43\x74\xfd"
+ "\x49\x2f\xb1\x4c\xe4\x2f\x09\x8b\x79\x67\xcf\x8b\x27\x57\x33\x6d"
+ "\xa6\x51\x6b\x09\xe4\xa7\x7c\x37\xd3\xbb\xb1\xb5\xe4\x28\xea\x9f"
+ "\x0d\xb8\x76\xe1\x29\xdf\x8f\xbc\x6e\xd3\x13\x67\xcd\xd4\xd2\xb9"
+ "\x9b\x82\x29\x19\x8e\x50\x75\x86\x2b\x9c\x92\xd1\x14\xae\xce\x70"
+ "\x8b\x94\x71\xe6\x60\xf5\x38\x6b\x28\x65\x1c\x78\x60\x9c\x0b\xfd"
+ "\x74\x1d\xf7\xf9\x65\x27\x59\xf1\xbc\xeb\x32\xf7\xbf\x6b\x5c\x23"
+ "\xda\xea\x86\xcd\x2b\x14\xef\x8f\x6b\xe4\xb5\x05\x94\x75\xf7\xa5"
+ "\x8c\x6b\x42\x3e\xb7\x92\xaf\x71\xed\xcc\x97\xc8\x67\x40\x9a\x07"
+ "\xf3\x9e\x44\xbc\xf7\xe2\xe7\xeb\x4b\x19\x0f\x3b\x77\x7c\x01\xe0"
+ "\xa7\x48\x9e\x72\x8d\x2f\x10\x33\x5c\xb0\xa1\x2f\x02\xce\x78\xdb"
+ "\x82\xd0\xbd\x02\x34\x84\x9c\x8c\x2f\x08\x57\x8f\x2f\x16\xa9\xe3"
+ "\x5d\x01\xc9\xfb\xe3\xab\x18\x76\xdf\xa6\x4c\x5e\x73\x30\xe2\x7d"
+ "\xa3\xa8\xc9\x4c\x0d\x30\xaf\x9a\x33\xcd\x61\x73\xa6\x4d\xb8\x32"
+ "\xad\xdf\x7d\x41\xf8\x42\xae\xcc\xdc\xb0\x2b\x33\x3b\x38\x14\xb6"
+ "\x79\xf9\x51\x62\xfd\x14\xfc\x50\x80\x06\x9f\x80\x1e\x07\x64\xff"
+ "\x7b\xca\x21\x03\x1b\x46\x3b\x5a\xbb\xc1\x0b\xb6\x5f\x4a\xdd\xd4"
+ "\xe6\x3f\x21\x69\x2a\x52\x32\xcd\xcc\x53\xdc\xbf\x4f\xda\xc8\x21"
+ "\xaa\x33\xad\xe1\xea\xcc\xec\x50\x35\xe0\xa6\xa0\x9e\xd4\x3b\x7e"
+ "\x15\x90\xf2\x7a\x07\xf8\xf5\x28\xca\x7c\x42\x8a\xc7\xef\x68\x1a"
+ "\x4c\x47\xb2\xae\x62\xfd\xb4\x20\x18\x60\x9e\xf9\x2b\xeb\x35\xa5"
+ "\xa7\xa8\x48\xd7\x53\xac\xa3\x78\xbe\xc3\x7a\x2a\xac\xe9\xa9\xb0"
+ "\xa6\xa7\xe4\xb3\x19\xba\xc6\x95\x9e\xcb\xfa\x68\x41\xb9\xd2\x33"
+ "\x0b\x42\xd9\x02\xbc\x91\x0c\x18\xb9\xaa\x2f\x90\xa7\x26\x7d\x9e"
+ "\xcc\x2f\xe9\x94\x6e\x0b\x43\xdf\xe0\xe7\x08\x2b\x7d\xe3\xd6\xf4"
+ "\x8d\x41\xd7\x37\x21\x8c\x6b\x90\xa9\x70\x3c\x7d\x13\xd6\xf4\x4d"
+ "\x48\x28\x7d\xa3\xe1\x13\xe2\xf4\x90\xa6\x6f\x42\x71\xf4\x0d\xe4"
+ "\x99\xdb\x9b\xa8\xe9\x19\x07\xeb\x19\x6e\x2f\x78\x2d\x3b\xac\xf4"
+ "\x4c\x01\xe6\x3a\x06\xd6\x33\x21\x94\x09\xeb\x7a\xa6\x57\x96\xb7"
+ "\xb1\xae\xe9\x7b\x91\xa0\x3f\xad\xc4\x3a\x46\xea\x93\xe0\xd8\x20"
+ "\xeb\x13\xd0\xef\xde\x58\x7d\x02\x78\x0e\xdc\x9b\x35\x3d\xd5\x84"
+ "\x99\x6e\x10\xfa\xc4\xb5\xa0\xdc\x8f\xbe\xfe\x14\x73\x7f\xe8\xed"
+ "\xf2\x32\x87\xa7\x3c\x48\xd0\x03\x6e\xd1\xe6\x20\xe0\x08\xfe\x0d"
+ "\x41\x57\x10\x41\x2e\xcd\x41\xc8\x38\x78\xdc\xda\x66\xfb\x13\x85"
+ "\x20\xab\xf3\xba\x7b\x3c\x4f\xfa\x33\xcd\xf3\xce\x0a\x1f\xe8\xe3"
+ "\x7d\xd2\xe6\x80\x7e\xc9\xf4\xb5\x76\x7f\x40\xf9\x9d\x22\x9c\x5f"
+ "\xec\xb5\x42\x06\xac\xf3\x56\xb8\x4d\x4f\xae\x36\x43\xce\x84\x1b"
+ "\x7a\xf1\x7f\xcd\x3b\x6b\x36\x2d\xee\xa4\x6f\xe4\x2f\x11\xe1\x10"
+ "\xe4\x0c\xed\x75\xa1\xdd\x8d\xc0\xbd\x09\x32\xe7\x86\x9c\x99\x83"
+ "\x31\x72\x06\x99\xd9\x85\x7b\xab\xa2\xdf\x38\x37\xe4\xac\x31\x2c"
+ "\xc7\xb3\x4e\x39\xc7\x44\x3d\x6e\x5e\x8b\x83\xac\x35\x86\xab\x95"
+ "\xac\x85\x55\xb9\xf6\x30\xd3\xcf\xa0\xc9\x1a\xfa\x02\xef\xbd\xf8"
+ "\xf9\x20\x3f\xf1\x65\xcd\x16\x21\x6b\xab\x35\x59\x4b\x51\xb2\x86"
+ "\x3e\x4d\x0c\x6d\x52\xf2\xc6\xf0\x79\x1e\xda\x2f\x6f\xa9\x99\x66"
+ "\xdc\x27\x28\xde\x91\x32\x87\x71\x25\x33\x17\xf2\x96\x0d\x79\x03"
+ "\x3c\xe1\x63\xbd\x09\xde\xfc\x0f\x1e\xeb\xe6\xdb\xc4\x7f\x14\x85"
+ "\x46\x3b\x20\x4f\xb9\xd0\x65\x7f\x81\x1e\xfd\x8f\x27\xfd\xd4\x08"
+ "\x79\x32\x43\x8e\xac\x90\xa7\x6c\xc8\x15\xcb\x53\x53\x68\x13\xc3"
+ "\xbc\xa3\xa9\x1f\x86\x1c\x2b\xa3\xe5\x69\xb0\x75\xd0\x5e\xa7\xb5"
+ "\xc2\x4b\xbf\xb1\xb1\xbd\x82\xfb\xed\x5e\x3a\x3a\x5b\xbb\x87\xfd"
+ "\xd3\x68\x91\x76\x0c\x64\xd0\x56\x49\x37\x9e\xa1\xb1\x79\xe0\x77"
+ "\xc2\x7d\x32\xee\xf3\x17\xdc\xfe\x11\xec\x88\xba\x5a\xd4\xdb\xcb"
+ "\x72\x28\x9c\x39\x6c\x9f\xe5\x82\x0f\x93\x44\x6f\x66\x32\xec\xcb"
+ "\xd3\xa2\xcf\xc2\x6b\x6d\x26\x3c\x8f\x44\xfb\xd3\x71\x4d\xdd\x7f"
+ "\x89\xd2\xf0\xb3\xec\x77\x86\x1d\x6c\x3b\xe1\x3e\x5b\xac\xb7\x0c"
+ "\xdf\xb5\x8e\xb2\x4c\x7e\x4a\x6a\x70\x86\x0b\x4d\x5b\xcc\xbc\xe6"
+ "\x94\xc6\xf7\xc2\x79\x60\x5a\xc3\x25\x32\xf2\xba\x40\x38\x05\xf5"
+ "\x95\x9b\x84\x58\x9b\x49\x0d\x6b\xa0\x1f\x9c\x64\x69\x70\x8a\xa6"
+ "\x50\xaf\x94\x49\xab\x8e\x0b\xe3\x06\x3c\x6f\x06\x9e\x8b\x1f\xd9"
+ "\x90\x4b\x9f\x94\x53\xdc\xb5\xda\x5e\xe7\xd8\xfe\xf6\x0f\xf2\xbe"
+ "\x4e\xa7\xc9\x20\xef\x8f\xea\x74\x1a\x64\x5d\xcf\xc8\x63\x74\x68"
+ "\x9d\xf0\x55\x3d\x43\x4c\x0b\x8b\x3d\x28\xfe\x13\x74\x74\x54\x86"
+ "\xe8\xe6\x05\x1b\x6e\x11\x9e\x6e\x01\xfe\x3c\x4b\x0d\x78\x5f\x59"
+ "\x21\xc2\xe1\x94\x9c\xe3\xa2\x3a\xa7\xb9\x67\x9d\x08\xf2\x5a\x4e"
+ "\xaf\xf3\x56\xab\x97\xbe\xe3\x56\x7d\x91\xd1\x28\xe7\x90\xe6\x9c"
+ "\x66\xc0\x4a\x61\x58\xad\x28\x1f\xaa\xce\x69\x41\xbe\x3c\x2f\xfd"
+ "\xae\x50\xe6\x33\x67\x34\xda\x36\xd2\xd7\xcf\xd0\xad\x92\xc6\xc2"
+ "\x95\x73\x92\xf5\x01\xd2\xcc\x48\xdb\x01\xf8\x5e\xe4\x2f\xf7\xd2"
+ "\x7b\xbb\x95\x1d\x7b\xeb\x0e\x3d\x1f\xee\x8b\xf9\x3e\x8a\x7f\x12"
+ "\xe4\x62\x3a\x60\x59\x07\x36\xab\x12\xb4\xe5\x75\xfd\xcf\x8c\x5f"
+ "\x6e\xfc\xd7\x03\xfa\x7c\x9c\x15\xb6\x16\xd9\x37\xd3\x18\xf4\x0f"
+ "\xf0\xbb\x2d\x01\xf3\x88\xd3\xc2\x79\x6b\xed\x1b\x1b\x03\x98\x27"
+ "\xdc\x96\xec\xa5\x97\x9b\x07\xa3\xa7\x60\x5b\xe7\x92\xe8\xaa\x5a"
+ "\xd7\x4f\xcb\xcf\x16\x6c\x08\x0b\xbe\x67\x7d\xd4\x80\x74\xa6\x1b"
+ "\xe0\x2c\xd2\x69\x36\x78\xbf\xe4\x74\xa8\x39\xe7\x6d\x87\x85\x53"
+ "\x90\xfb\x1b\xbc\xc7\x74\xdb\x7b\x8a\x0e\xe3\x9a\x7a\xa0\x47\x78"
+ "\x9d\x18\x73\x33\xff\x5a\x8b\x08\x00\xe6\x41\x2f\x65\x65\x6b\xeb"
+ "\x50\x7e\x4f\x70\x0e\xeb\x96\xb8\xe3\x16\xef\x89\x0d\xc0\x4f\x3f"
+ "\xd1\x36\x06\x7a\x48\xea\xa6\xd5\xc6\x4a\x85\x77\x80\xe1\xba\x2b"
+ "\x2f\x50\x27\xde\xaf\xf5\x8b\x2e\xe1\xb2\x05\x78\x1e\xe1\x5e\x77"
+ "\x99\xd3\xfe\x04\xde\x16\xee\x35\x8c\x53\xfa\x9f\xdc\xdf\xb8\x4c"
+ "\xa7\xcb\x29\xb1\xa1\x7f\xfd\x27\xdd\xcd\xeb\x3d\x6a\x9d\x2b\x3d"
+ "\xd7\x4b\x13\x02\x3a\x5e\x6c\x63\x80\xbe\x4c\xeb\x46\xb6\x35\x78"
+ "\xef\x61\x6d\x85\x08\xb0\xcd\x81\xbc\xa5\x7a\x1b\xb8\x7d\xaa\x5d"
+ "\xe9\x8e\xc8\x76\xf1\x1e\x95\xa9\x42\xd1\x60\xed\x06\x4a\xb2\x2a"
+ "\x5a\x27\x71\x7b\xb9\x2d\xdc\x66\xd9\x16\xa9\x63\x31\x46\x04\x27"
+ "\x63\x3e\x26\xd3\xdd\x80\x85\xf9\x4f\x96\xc6\x53\xe9\xb9\xb1\x7c"
+ "\xd4\xdf\x8f\xe6\x0c\x1b\xe6\xa0\xdf\xb0\x87\xc5\xa9\xd3\x94\xf1"
+ "\xa8\x5a\x3b\xcb\x78\x34\xcc\x76\x76\x80\xf9\x77\xaa\x9b\xc7\x64"
+ "\x4f\x05\xeb\x5b\x99\xf7\x06\xe4\xed\x44\x9e\xb9\x5a\xde\xb9\x6a"
+ "\xcf\x4e\x5e\x87\xf1\x15\xe3\xd8\x73\x5e\xca\x28\xf6\xc9\xf1\xde"
+ "\xe6\xd6\x9f\x31\x77\xc7\xfc\x2f\xc3\x22\xaa\xa7\xba\xe3\xe3\x92"
+ "\x69\xe3\xf1\x2c\x74\x49\x74\xa3\x9e\x9b\x98\xa7\xec\x1b\xe8\x6b"
+ "\xe0\xcb\xcf\x2a\x37\xd3\x0d\xcc\x4f\x22\x25\xa7\x53\xd1\x3d\xe3"
+ "\x90\x70\xc2\xf6\x84\x46\xb5\xad\xa3\xaf\x43\x8e\x4e\x9e\xa1\x8c"
+ "\x8f\x8b\x2a\xac\xc0\x95\xa8\xea\x1c\x91\xd4\x41\x29\x39\x5e\x4f"
+ "\xf0\x73\x6a\x38\xc7\x6b\x3b\x19\x5e\x9d\x17\x71\xdf\x7d\x35\x7d"
+ "\x01\xba\xfa\xd4\xda\xc3\xb8\x47\x79\x9f\xe1\x14\x8d\x9b\xcd\xed"
+ "\x55\x7b\x9c\xe3\x26\x8b\x4b\x62\xb1\x50\x63\x1a\x60\x8e\xb3\xe1"
+ "\xea\x93\x3f\x27\x15\x6b\xcf\x5e\xe4\x4b\x17\x97\xc2\x9c\xc7\x87"
+ "\xb4\x69\xc2\x99\xc0\x32\x71\xb4\xd7\x39\xae\xc4\x4b\x33\x3a\x54"
+ "\xdf\x8c\xcb\x61\x58\x83\xe0\xe0\x45\xdf\x12\xf3\x26\x60\xfd\xc1"
+ "\x5a\xc9\x6b\x97\xe3\xde\x94\x72\x01\x58\x0d\x06\xa5\xb7\xc3\xc0"
+ "\xb5\xde\x19\x2e\x81\x8e\x2e\x09\xd7\x4c\xcf\x93\xf7\xda\x3b\xa1"
+ "\x8d\xa3\xf1\xe1\xaf\x36\xba\x47\x33\x8f\x8f\xcf\x52\x70\x6c\x01"
+ "\xf7\xe8\x33\xfc\x3c\x81\x9f\xfd\xe6\x19\x79\x9e\xda\x5c\xd4\x7f"
+ "\x06\xf5\x8e\xcf\x52\xf3\xf9\xf1\x13\x7a\x50\x47\xaf\x73\x7c\x96"
+ "\x97\x26\x19\xd5\x9e\xcb\x8c\xbc\xc1\xf6\x92\x59\x76\x58\xe6\x94"
+ "\x4c\x67\x9e\x6d\x6d\x94\xf2\xd7\x0e\x9e\xf7\x69\x7a\x83\xd7\x69"
+ "\x92\x4f\x51\x66\x77\xab\x45\xf2\xb7\x41\x18\xc6\xef\x78\x2b\xec"
+ "\x33\xf0\xbe\x98\x52\x5f\x99\xdd\x57\xfe\xc6\xbb\xf1\x6b\xc7\xef"
+ "\xa4\xf6\xdc\x85\x5f\x10\xf7\xf9\xf8\x9d\x94\xb4\xdb\xb7\x34\xc1"
+ "\x8b\x77\x3d\xb0\xd9\xf9\xd9\x4b\xe3\x8f\x8b\x7d\xe9\x06\xd8\x25"
+ "\xf2\xbe\xe1\x6b\xbc\x4e\x30\xde\x8f\x3e\xa8\x50\x7d\x91\x29\xd7"
+ "\x54\x80\x1b\xd3\x5d\xd8\x6b\x45\xa0\xb9\xd2\xcf\x78\xa7\x37\xd7"
+ "\xfa\xc9\x3a\x8e\xdb\x9f\x99\xc9\x6d\xf2\x83\xfe\x7c\x5d\x5b\x2b"
+ "\x7c\xc7\xea\x82\xc4\xfb\x73\xbd\xce\x4c\xc8\xff\x8a\x7c\xb5\xe6"
+ "\xb0\xda\xca\xf0\x34\x9e\x10\x7a\xfb\x95\x4e\x9b\x91\xc7\x7d\x89"
+ "\xe7\xe7\xd1\x76\xd3\x39\xca\x7c\x4f\xa4\x4e\xcf\x3b\x56\x42\xb4"
+ "\x1f\x7a\x04\x63\x8d\xdc\x2b\x68\x90\xfe\x01\x99\x18\xff\xc7\x9d"
+ "\xd4\xf7\x93\x76\xe2\xfd\x2e\xbc\xc3\xd8\xe3\x6b\x2d\x09\x10\xc3"
+ "\x0a\x71\xfb\x50\xfe\x83\xb0\xcf\x88\xb1\x1a\x7d\x3e\x23\xaf\xd2"
+ "\x06\x3d\xd3\xaf\xb7\x32\x17\x6f\x3e\x2b\x02\x7a\xfb\x8e\x35\xb2"
+ "\x2c\x64\x82\xff\x9f\x2d\x19\x94\xff\xfb\x71\xbe\xe3\xba\x63\xe9"
+ "\xaa\xcf\xc2\xa0\x4b\x74\x9f\xdd\x91\xa4\xfa\xeb\xf6\x69\xd1\xfd"
+ "\x75\x07\x6c\x9b\xdb\xb7\xe1\x57\x87\xdf\x21\xf5\x1c\xf9\xbb\xdd"
+ "\x16\x71\x7f\x14\x3f\xe8\xce\xdb\x31\xfe\x67\x04\x54\x3f\x70\x3a"
+ "\xda\xc1\x3c\xf2\x77\x4a\x0a\xf7\x15\x12\xef\xd7\x72\x3a\xf3\x33"
+ "\xa7\x87\x61\xcf\x78\xe9\x76\x17\xde\x9b\x59\x56\xab\xc2\x14\xf5"
+ "\xde\x83\xda\xdd\x1b\xa1\xab\xe9\xf6\xcf\x18\x96\x69\xcb\xf6\xed"
+ "\xcc\xa7\x28\xb3\xdb\x14\xdc\xbe\x1d\xf5\x75\xeb\x74\x45\xda\x09"
+ "\x7e\xcf\x3c\xd9\xeb\xbc\xc3\x08\xba\x1c\x94\xfb\xb1\x98\xef\xc5"
+ "\xb7\x35\xee\xc8\xec\xb7\xc9\xcc\xe3\x0b\x58\x1f\x75\xd3\x37\x73"
+ "\xa0\xb3\xd0\xb7\xd3\x73\xd5\x58\xf3\xcd\xc9\xfc\x0c\x5d\xf9\x19"
+ "\xee\xb3\x5b\xa1\x93\x2e\xd7\xe4\xe4\xf5\x19\x68\xd8\x65\x03\xe5"
+ "\x06\x6b\xea\x8e\x06\x53\xb3\x16\x79\xba\x0e\x53\x5b\xf0\x57\x64"
+ "\x7d\x46\xc2\xb8\xdd\x03\x1e\xb0\x6f\x10\xa1\xb7\x2f\x1f\x34\x7a"
+ "\x82\xe7\xdd\x18\x9b\x6f\x39\x43\xdf\x94\xf4\x78\xf9\x14\x46\xfd"
+ "\x27\x25\x6c\x8d\x3e\x75\xb5\xbb\x96\x8b\xe0\xae\xd3\xc2\x0f\xfb"
+ "\x6e\xf8\xce\xcb\x94\xf5\xfa\x46\xca\xae\xbb\x4c\xe9\xf5\x97\x29"
+ "\x53\xfc\x35\xd3\x50\x07\xbb\xed\xc9\x8b\x66\x82\x4e\xe0\xf5\xbb"
+ "\xa4\xfa\x8d\x24\x79\x24\x54\x0d\xfb\x2d\x08\xfb\xed\x7c\x26\xeb"
+ "\xc6\x7e\xfb\xad\x4f\xda\xc5\x93\xf3\x15\x1f\x4d\xce\x1f\x51\x42"
+ "\x09\xc9\xc5\x64\x06\x7e\xf6\x73\x74\xc7\x8a\x64\x0c\x88\xdc\x66"
+ "\xaf\xd6\x5e\xd0\xbc\xc2\x54\x42\xc3\x64\x5b\xa1\xaf\x45\xf5\xf4"
+ "\xdc\x41\xc7\x61\x03\xf3\x94\x9f\xe5\x86\xdb\xb0\x85\xf7\x8c\x0f"
+ "\x8f\x0e\x18\xd7\xd6\x89\x00\xa7\x97\x8d\x15\x01\xa4\x97\x70\xdd"
+ "\x4d\x48\xef\x75\x7e\xd3\xe5\x35\x5a\xd3\x06\xe3\x51\xcc\x8f\x34"
+ "\xbd\x92\x95\x22\x0c\x0e\xf0\xe8\x78\xd7\xe6\x20\x6c\xef\x73\x2c"
+ "\xb3\x59\xe6\x05\xa5\x22\x68\x5d\xc9\xfb\xf7\x59\xc4\xbe\x05\xbc"
+ "\xa7\xf8\x16\x6c\x9b\x2f\xf3\x27\xe0\xf1\x82\xe7\x0a\xa6\x52\x07"
+ "\xcf\x3d\x5c\x02\xf3\xf3\xaf\xea\xcf\x80\x76\x26\xbf\x32\x8a\xfd"
+ "\x6c\xb2\xf2\xbd\x94\x7f\x80\x71\x97\xbe\x34\xd0\x9d\xb0\xb7\x6e"
+ "\x00\x5e\xdb\xfd\xa0\x03\xde\x63\xfc\x9f\x5b\xae\xed\xff\xfa\x78"
+ "\xef\x15\x69\x18\xff\x1f\x3c\xca\x69\x65\x63\xc9\x52\x66\x15\x5d"
+ "\x83\xd9\x4c\xbc\x27\x0d\x78\x37\xa1\xcc\x61\x1d\x0e\xc6\xa9\x9f"
+ "\xf7\x18\x1e\x79\x04\x69\xc7\x75\x38\xc8\x73\x23\x9e\x3b\xfa\xf3"
+ "\xa8\x32\x5d\x11\x65\x1e\xe9\x31\xdc\xf1\x73\xa4\x05\xa3\xcb\x4c"
+ "\x48\x8e\x2e\x33\x61\x4c\x44\x19\x87\xaa\x67\x42\x76\x4c\x99\xdc"
+ "\x98\x32\x05\x57\xe2\x36\x61\x69\x4c\x99\xb2\x98\x32\xdb\xae\xc4"
+ "\x6d\x42\x6d\x4c\x99\x83\x31\x65\x8e\x44\xd0\x92\xfd\x6a\xb2\x91"
+ "\xd6\x12\x53\xe6\x64\x4c\x99\x6e\xfd\x79\x10\x1a\x27\xaf\xdd\x4f"
+ "\x16\xf0\x26\xfb\x6e\xf9\x5e\x41\xff\xf4\xec\x7d\xb6\x57\x95\x9d"
+ "\x98\x79\x65\xbb\x26\x4e\x8b\xae\x6f\x62\x7e\x74\x7d\x13\x17\x5f"
+ "\xd9\xae\x89\xb6\x98\x32\x8e\x98\x32\xae\x88\x32\x8d\x5a\x3d\x07"
+ "\x62\xca\x1c\x8e\x29\xd3\x7c\x25\x5f\x4d\xec\x88\x29\xd3\x15\x53"
+ "\x26\xf0\x25\xb4\xe0\x71\x5c\xf9\xb5\x8d\x62\x5b\xf9\x3e\xd8\x08"
+ "\x93\x96\xb0\x6f\x04\xef\x83\xbe\x71\x39\x30\x84\xf7\xe7\x78\xbc"
+ "\x3a\x56\x1e\xc0\xd8\x32\x09\x7a\x36\xc7\xad\x8f\x59\xec\x37\xc2"
+ "\x32\xad\x6c\xec\x49\x99\x83\xd9\xa2\xd2\xf7\x4c\xf3\x5f\xe3\xba"
+ "\x8e\x8d\xe1\x71\x6a\xd2\xee\x7e\x9b\x58\xf9\xa0\x91\x06\xe7\x6f"
+ "\xfa\x3e\x6c\x83\xf2\x47\x49\x60\x9b\xfc\x58\xb9\x2c\x73\x3c\xc2"
+ "\x8e\xe6\xfa\xfd\x87\x37\x06\x8c\x31\x78\x1c\xbc\x0a\x1e\xc9\x98"
+ "\x03\x74\xb5\x61\xf4\xe2\xfd\xf5\xd6\x3a\xd8\x40\xb0\xfb\x19\xb7"
+ "\x53\x94\x9d\x2d\x6d\xb2\x95\x97\x89\xef\x3d\x15\x53\xe5\xfe\xbb"
+ "\xb2\x49\xb3\x4b\x9a\x51\x3f\xdb\xee\xcd\xb6\x0b\xec\x23\x85\xf1"
+ "\x97\x6d\xb7\xec\x57\x8f\x55\xf8\x80\x57\x76\xb1\xee\xa7\xe2\xa5"
+ "\xec\xdd\xd2\xd6\x70\xd9\x78\x7f\xdd\xc7\x3e\x34\xc7\xfc\x53\x38"
+ "\x0f\xf8\x7f\x52\xa9\xde\x5e\x8c\xf5\xb0\x1d\xb3\xa7\x5d\x8d\x66"
+ "\xaa\x0f\xb3\x8f\x46\xf3\xe4\x10\xf0\x4a\x76\x7b\x74\xbf\x67\x7b"
+ "\xa3\xfb\x3d\xdb\x17\xcd\x93\x06\xf0\xe4\x9d\xc6\xe8\x32\x77\xa6"
+ "\x45\x97\xb9\x33\x3d\xa2\x8c\x4b\xd5\x73\xe7\x94\x98\x32\x79\x31"
+ "\x65\x0a\x23\x9e\xd1\xc6\x3b\x4b\xfa\xe7\x3e\xd2\x07\xea\xce\xf2"
+ "\x88\x67\xc3\x6e\xa9\x3f\xef\xdc\xa1\xa7\xf1\xda\x51\xfd\x1e\xe5"
+ "\x83\xa3\xc1\x3b\x18\x23\xef\x9c\xff\x68\x0c\x0e\x2d\x31\x38\xf4"
+ "\xcb\xbf\xb6\x77\xff\xdb\xd3\x74\xd7\x61\x6d\xef\xbe\x1b\x63\xf6"
+ "\x02\x7e\x06\xac\x5a\xe4\x07\x1d\xee\x4a\x8e\x86\x77\xd7\x98\x68"
+ "\x78\x77\x65\x45\x3c\x9b\xf1\x3c\x2d\xa2\x0d\xe6\x44\x0b\x25\x80"
+ "\x5f\x60\xbf\xdd\xb5\x48\x4f\xe7\x39\x25\xf0\xed\xb2\xcb\xb1\x26"
+ "\x97\x7d\xcb\x52\x4f\xd1\x5d\x33\x79\xfe\xa9\xc1\x8c\x94\x7f\x52"
+ "\xed\xba\x6b\x77\x0c\x1e\x07\x62\xf0\x38\x1c\xd1\x2e\xbf\x69\x0b"
+ "\x3d\x64\x0a\x3e\xfc\x28\xdb\x3e\xec\x4f\x29\x7d\xbc\x36\xc3\x66"
+ "\xbb\x48\x66\xf6\xad\x3b\x5d\x46\x89\x9e\xf2\x2e\xcc\xe5\x26\x0f"
+ "\x6a\xb3\xf7\xa4\xda\x7c\xca\xb7\x8a\xac\xbd\xce\x6f\xa5\xe9\xfc"
+ "\x18\xae\xb1\xf9\xc2\xd5\xd3\x92\x91\x06\xfd\x97\xdd\xa8\xec\xdc"
+ "\xef\x14\x0a\x7b\x61\x2d\xe8\x89\x79\x51\xce\x8d\x6a\x1e\xb1\xda"
+ "\xc8\x3e\x62\xec\xc7\x8a\x31\x3e\x59\xed\xc3\x7f\x6b\x71\x04\x5f"
+ "\xfb\xad\x1b\xef\x15\xa7\x28\x67\x2c\xdb\x00\x2c\xa3\xec\x6b\x76"
+ "\x2c\xe8\x23\x9e\x7b\x7b\x82\x67\xa4\xed\x86\xf7\x56\xad\x6c\x6d"
+ "\x44\x59\x9f\x36\x37\xee\xe2\x77\x93\x82\x64\x3c\xe6\xf7\x11\xe0"
+ "\xa4\x29\x7b\x2f\x67\xec\x31\xc8\x2b\xca\xb4\xe8\x65\x78\x1e\x2d"
+ "\xf7\x78\xcb\xc8\x38\xb1\x82\x8c\xee\x8d\xa7\x24\x6c\xdd\x6f\x03"
+ "\xb6\x74\xb7\xa7\xa2\x8b\x3c\xfe\x0e\x5e\xeb\x32\x2a\x1f\x9d\x1c"
+ "\x6b\x62\x80\x92\x7a\xaa\x6d\x90\x99\x1c\x6b\xa8\xda\xd6\x85\xf9"
+ "\x12\x6c\xcc\x6f\xcd\x66\x7d\x13\x49\xbb\x39\x73\x0a\x1e\x5e\x30"
+ "\x6f\xc2\xf7\x1f\x9e\xbb\x68\xce\x54\xeb\xa2\x15\xcf\x2d\x5b\x3a"
+ "\x61\xd5\xf3\x65\xd6\xf5\x6b\x56\x94\xad\x58\xf9\x03\x6b\x76\x79"
+ "\x46\xb9\x75\x49\x99\xba\x66\x96\x2e\x59\x5b\x36\x9d\x6f\xb3\xac"
+ "\xb6\x35\xcb\xd6\xc9\xdb\xdb\x87\x53\x34\x90\x15\x65\xcb\xd6\x58"
+ "\x33\x96\x66\x59\xef\x5f\xb2\xa2\xf4\xf9\x35\xcb\xe2\xc2\x9a\x6a"
+ "\x5d\xb3\x6c\xcd\xb2\x25\x4b\xad\xd3\xad\xd9\x0c\x39\x12\x5c\x44"
+ "\x7f\x66\xeb\xe3\x18\x8f\x5f\x55\x4e\xd1\xae\x8d\x67\x5e\xc5\x3f"
+ "\x39\xfe\x2b\xc7\xb2\xc9\x49\xd1\x3c\x37\xd9\x12\xcd\x73\x93\x33"
+ "\xaf\x1c\xcb\x26\xc7\x8c\x7f\x93\x63\xc6\xbf\xc9\x8b\xaf\x1c\xcb"
+ "\x26\xc7\x8c\x7f\x93\x63\xc6\xbf\xc9\xfd\xe3\x1f\x78\xc9\xbb\x55"
+ "\xea\x85\xc9\x31\xe3\xdf\xe4\x98\xf1\x6f\x72\x73\xcc\xf3\x89\x88"
+ "\xe7\x1b\xf0\xdc\x19\x39\x3e\xe2\xd9\xaf\xcb\xe7\x80\x7e\xb9\x3b"
+ "\x49\xcf\xc3\xba\x1e\xba\xb9\x53\xe5\xbd\xdb\x1a\x91\xb7\x4b\xcb"
+ "\x9b\xd3\x2f\x7f\xbc\xaf\x8d\x74\x35\x5f\xbf\xfb\x35\xd6\xe9\xec"
+ "\x8f\xc7\x63\x13\xe4\xe3\x96\x73\x74\x77\x0a\xc3\x62\x1e\x66\xff"
+ "\x4c\xb1\xf7\xf1\xde\x86\x54\x4a\xe2\x32\x0d\x35\xec\xd7\x9b\x93"
+ "\xc5\xbe\xba\x48\x63\xdf\x65\xe8\x94\xbb\xd9\xfe\xed\x54\xe3\xc5"
+ "\xdd\x5e\x69\xf3\xa3\x8c\x06\x5f\xce\x6b\x00\x87\x7d\x81\x93\xaa"
+ "\xd4\x58\xdc\x89\xfb\x64\xe6\x69\x94\x37\x0a\x43\xce\x6a\xf6\x81"
+ "\x46\x9a\x19\xbf\x34\xc0\xf3\xea\xf0\xb6\x8d\x8a\x6f\x5b\xc6\xda"
+ "\xb9\xfd\xf3\x41\x03\x99\xaa\x9c\xe1\x0e\x4f\x98\x6d\xeb\x6f\xa7"
+ "\xa9\xb5\x85\x9c\x12\xe1\xfc\xa8\xb0\x01\xe9\xf1\xe7\x49\xdf\x86"
+ "\xfd\xf7\xed\x24\xb5\xde\xf2\x6d\xf4\xff\xbc\x1c\xb5\x76\x9a\x53"
+ "\x02\x7d\x7b\x19\x70\x2e\xe2\xda\x87\xeb\xbf\xeb\xf0\xdd\x72\xbe"
+ "\xfd\xed\x32\xe1\x4c\x58\xc8\x70\x63\xd2\x77\x40\xbf\x5d\x36\x05"
+ "\x1d\x85\x71\xde\x1d\x14\xce\xc4\x87\xe3\xa4\xbb\x61\x33\x5c\x06"
+ "\x1e\x7e\xc6\x37\x22\xbd\x43\x38\x47\x2e\xe2\xfc\x5e\xae\x0f\x65"
+ "\x06\xb3\xb5\x75\xff\x5b\xe5\xc3\x3f\x25\x3d\xa6\x1d\x5f\x9c\xa6"
+ "\x29\x3f\x56\xed\x98\x12\x8a\xae\x7b\xca\xb4\xf8\xed\x98\xb2\x08"
+ "\xed\xf8\x22\x7e\x3b\xa6\xd8\x24\x6d\x0d\x68\x8b\xe1\x8a\x77\x3b"
+ "\xd0\x96\x2f\x24\xdd\xa3\xd3\x0f\x68\xb6\x90\x1f\xf3\x30\x33\xde"
+ "\xc9\xb2\x0b\x2b\x06\xfa\x4d\xcb\xd7\x62\xaa\xa5\x82\x38\x75\x76"
+ "\x0a\xe7\xb0\x85\x5e\xba\x47\x9e\x6b\x88\x48\x0f\x2a\x5c\x40\x27"
+ "\x03\xd3\x09\xed\x41\xb9\xc1\xfa\x5b\x9f\x97\xa8\xb5\x90\x7b\x20"
+ "\xff\x53\x48\x5f\xcb\x5c\x5b\x21\x7c\x3a\x1d\xf1\xae\x24\xe6\x5d"
+ "\x20\xe2\xdd\xb6\xa8\x77\x9b\xfb\xd3\xeb\xf4\xf4\xaf\xd6\x4f\xf7"
+ "\xb4\xc4\xf4\x13\xfa\x67\xea\x13\xd1\xed\xbe\xe7\xa4\x6a\x1f\xfa"
+ "\xe8\x0a\x5a\xdf\x13\x40\x1f\xf5\xc5\xef\xa3\xa9\x69\xf1\x79\x6d"
+ "\xaa\x5c\x47\x13\xa9\x14\x07\xde\xd4\x3c\xf4\x5d\x9f\xe4\x41\xad"
+ "\x9f\xae\xec\x9f\xa9\xa5\x7a\xff\x7c\xb5\x36\x4e\x6d\x8a\x69\x63"
+ "\xe8\x34\x7d\x67\x82\x6a\xeb\x77\x36\xc7\xc0\x3e\x1e\x9f\x17\xa7"
+ "\x7a\xd1\xce\xd0\x20\xed\x0c\x0e\xce\x8b\xdf\xb1\xa0\x3d\xa1\x2b"
+ "\x79\xf1\x3b\xd9\xaa\x0c\xc5\x2b\x93\x2f\x9c\xf1\xea\xf9\xce\x52"
+ "\x7b\x90\xed\xdc\xef\xd4\xf1\xfa\x52\x44\x7a\x45\x34\xff\xa1\x0d"
+ "\x5c\x8e\xe9\x17\x54\x7a\x96\xfb\xe1\xb4\x95\x0c\x5f\xc6\x93\xbd"
+ "\xce\xef\x9c\x8c\xa1\xd5\xf9\xd3\x34\xed\x89\x1e\x43\xc2\x01\x45"
+ "\xaf\xe9\x63\x63\x70\x0a\xc4\xa7\xd7\x34\x33\xe8\x75\x3e\x3e\xbd"
+ "\xa6\x65\x0d\x4e\xaf\x69\xdc\xff\xe7\xaf\xa4\xd7\xb4\xe2\x48\x7a"
+ "\xc1\xd6\x95\xed\xbb\xcd\x02\xde\xe8\x2b\x12\x0d\xdc\xd6\x10\x99"
+ "\x4d\xe0\x15\x55\xa6\x9b\xcb\xec\x36\x05\x14\x9f\xc0\x86\x4c\x3a"
+ "\x47\xd3\x2a\x74\xf9\x1f\x59\x4b\xc3\x44\xdf\xe3\xec\x47\x94\xc0"
+ "\xe5\x3c\xe5\xe7\xdd\x9e\x60\x36\xf1\xfc\x23\xa6\xde\x8e\xf8\xba"
+ "\x60\x9a\x0f\x34\xad\xb9\x32\x7d\x7a\x92\xf2\x23\x9b\x9e\x1b\xad"
+ "\x23\xa6\x5b\xa3\xfb\x08\x74\x43\x39\x6d\xdb\xe9\x4b\x7f\x57\xef"
+ "\xb3\xe9\xae\x2b\xfb\x6c\xc6\x9d\xaa\xbf\x66\xa4\xc4\xe0\x77\x30"
+ "\x7e\x7f\x4d\x77\x0f\xde\x5f\xd3\x4f\x0e\xde\x5f\xd3\x79\xfd\xf4"
+ "\xbc\x97\x66\x64\x47\x8f\x1b\x33\xcc\xd1\xed\x45\xbd\x28\x27\x0c"
+ "\x43\x6f\xe0\xe7\xaf\xda\x6e\xfd\xc7\x3a\x8e\xfb\x8a\xcf\x15\x01"
+ "\xff\xb1\x8c\xe3\xb5\xc2\x18\x14\x36\x68\xe8\xda\x18\x7f\xbf\x95"
+ "\xe7\xb8\x6d\xb5\x44\xbc\x8f\x6c\xfd\x06\xdb\xee\xf7\x0e\x09\x1b"
+ "\xa8\x03\xf7\x86\xd3\x94\xfb\x87\xb0\xc1\x50\xc1\x7b\x9e\xd2\x6f"
+ "\x5d\xae\x21\xdc\x3b\x26\xb2\x2f\x78\xef\x93\xe7\xa6\xbb\xd4\xdc"
+ "\xe9\x2f\x28\xff\xa6\xea\x97\xdc\x77\xa2\xe9\x78\x6f\x6e\xfc\x7e"
+ "\xb9\xb7\x10\xfd\xf2\x97\xf8\xfd\x72\x6f\xd9\xe0\xfd\x72\xaf\x0b"
+ "\xfd\xf2\x97\x2b\xe5\xe8\xde\x83\x9a\x1c\x6d\xe5\x32\xd6\x95\x3c"
+ "\x1f\xcf\xfd\x1a\xe7\xc1\x3d\x64\x24\x57\xd2\x64\x42\xb7\x2e\x47"
+ "\xb2\xcc\x49\xc0\x92\xf5\xab\x3c\xf7\x76\x68\x30\x22\xe0\xe6\x92"
+ "\xa9\x3b\x9e\x9c\xe4\x5a\x38\xef\x44\x1b\x25\x81\x86\x85\xfb\x19"
+ "\xc6\x1a\x22\xd4\xf3\x1c\xe7\xe3\xf4\x89\xfe\x48\x39\xc9\xcd\xd3"
+ "\xf3\xb1\xae\xd3\xf2\xe6\x8a\xde\x12\xe2\x7c\x31\xb0\xb5\xf6\x0f"
+ "\x93\xe3\x08\xe7\xe7\x7c\x31\x79\x6a\x95\x3c\xe6\x9e\x8c\x96\xc7"
+ "\xdc\xa6\x68\xfe\x04\xfd\x51\x2e\x0c\x3d\x87\x7b\x23\x70\xf8\xca"
+ "\xfc\x75\x75\xd9\x9c\x99\x15\x23\x9b\xe0\x81\x99\xad\x8a\x07\x66"
+ "\xfe\x32\x1a\xd7\x99\xb3\xe3\xf3\xc0\xcc\xc5\x83\xf3\xc0\xcc\xf2"
+ "\xc1\x79\x60\xe6\x6e\xe6\x01\x2f\xcd\x6c\x89\x96\xcd\x99\x87\xa2"
+ "\xdb\x8e\x7a\xa5\x6c\x52\xca\xb5\xc8\x26\x6c\xa1\x1b\x06\x93\x43"
+ "\x96\x29\xf6\x1f\x69\xb8\xac\xef\x75\x7c\x25\x9a\x25\x41\xae\x80"
+ "\xdf\x7d\xc5\xbc\xa6\x04\x1d\x3f\x85\x69\x58\x2f\xcf\x63\xde\x57"
+ "\x16\x49\xc7\x5d\xea\x0c\xa4\x1d\x79\xbf\xe0\x7d\x65\x45\xcf\x59"
+ "\x1f\x47\xb7\xff\xbe\xdd\xf1\xe9\x79\xdf\x21\xd0\xd3\x1e\x9f\x9e"
+ "\xf7\x1d\x1f\x9c\x9e\xf7\x75\xf2\x19\xa9\x2b\x65\xea\xbe\xa0\x75"
+ "\x9d\xb4\x51\x64\x99\x73\x34\xeb\x91\xaf\x36\x3e\xcd\xca\x89\x1e"
+ "\x9f\x66\x8d\xb9\xf6\xf1\x69\x56\x79\xfc\xf1\x69\x96\x2b\xfe\xf8"
+ "\x34\xeb\xa0\x92\x87\x59\xde\x68\x79\x98\xe5\x8e\xe6\x09\xd0\xee"
+ "\x7f\x6c\x7c\x9a\x9d\x1d\x23\x03\x55\xa7\x69\xf6\x3b\xb0\x29\x1c"
+ "\xaa\xdf\xe6\x3c\x1f\x8d\xe3\xec\xfc\xf8\xfd\x36\x7b\x29\xfa\xad"
+ "\x2a\x7e\xbf\xcd\x76\x0c\xde\x6f\xb3\xeb\xd0\x6f\x55\x57\xf6\xdb"
+ "\xec\xc3\xd7\x6e\x53\xcc\xee\x8a\xee\xb3\xd9\xed\xd7\xde\x67\x73"
+ "\xb2\xe2\xf7\xd9\x9c\xd9\xf1\xfb\x6c\x8e\xe6\x9b\x3e\x67\x77\x74"
+ "\x9f\xcd\x29\x8b\xee\x33\xd0\xed\xbf\xd9\x67\xe8\x9f\x52\xe5\x9f"
+ "\x30\xe7\x22\xe6\xed\xc3\x7a\x9d\x73\xba\xbd\x74\xff\x61\x35\xb7"
+ "\xbe\x5f\x8d\x1d\xaa\x0f\xdf\x46\x1e\xef\x95\xe3\xc0\xfd\x49\x5a"
+ "\xda\xf7\xaf\xec\x87\xfb\xd3\xa1\xa3\xbb\x9b\x2b\xe4\xde\x96\xea"
+ "\x43\xa6\x39\xf2\xb9\x37\xf2\xfe\xd4\xfd\xb3\xb9\x2c\xfa\x58\x78"
+ "\x02\x41\x62\xbd\x8e\xfc\x7e\x86\xc3\x67\x43\x63\x60\xd9\xae\x65"
+ "\x8c\xbf\x8a\x4f\x4d\xa9\xbb\xf2\x2e\xc0\x7b\xe0\x05\xc5\xab\xf7"
+ "\xc7\xda\xbf\x0d\x78\xf7\xa8\xe2\xd3\xb9\x19\x31\x38\xf8\xe3\xf3"
+ "\xe9\x03\xc9\x68\x43\x43\x7c\x3e\x7d\x20\x73\x70\x3e\x7d\x00\xfd"
+ "\x4f\x0d\x11\x73\x9f\xd4\x27\x83\xde\x98\xb9\xcf\x03\x25\x26\xbf"
+ "\xe2\x1d\x69\x13\x55\xe7\x94\xf6\x3a\x1f\x88\xb5\xff\xd0\x37\x79"
+ "\x23\x34\x9c\x87\xc4\x94\x1f\xc4\xfe\x7b\x80\xed\xbf\xb7\x07\xc1"
+ "\xf9\x2a\xf6\xdf\x03\x6c\xff\xbd\x7d\xa5\x6c\xe5\x69\xf6\x5f\xbc"
+ "\x39\x5e\x5e\x56\xfc\xfe\xcf\x8b\xe9\x7f\x2a\x2c\xc3\x7c\x58\x96"
+ "\x8f\xce\x57\x1a\x99\x8f\x7d\x93\x38\x2f\xf3\x48\x9c\xbc\xb5\xb1"
+ "\x30\x07\xc9\xe7\xbe\x82\xf7\xd8\x97\x2a\x2e\xef\xe5\x69\x67\x4a"
+ "\xe6\xce\x8e\x96\xc7\xb9\xc6\x68\x79\x7c\xe0\x60\x74\xb9\xb9\xe9"
+ "\xd1\xef\xef\xf7\xff\xcf\xe9\xd8\xb9\xbb\x63\x78\xe0\xa3\xd3\xf4"
+ "\x60\x8a\xe2\x81\x07\x57\xc4\xe0\x71\x28\x3e\x0f\xcc\x6d\x46\xfb"
+ "\x3f\x8a\xcf\x03\x73\xbd\x83\xf3\xc0\xdc\x20\x68\xf9\x51\x24\xdf"
+ "\x2e\xac\xc8\x1d\x16\x9d\xe7\x41\x6b\x7c\x9d\xf7\xe0\x94\xf8\x6b"
+ "\x04\x0f\x16\x28\x1a\x3f\xb8\x3d\x9a\xc6\x0f\x96\x44\xd3\x10\x6d"
+ "\xf9\xef\xd3\xb0\x3f\x1e\x44\xaf\xf3\xc1\x58\xf9\xf7\x9c\xa6\xef"
+ "\x6a\xf2\x9f\xff\x50\x0c\x8e\x7e\x85\x4b\xbc\x75\x91\xef\xf2\xfc"
+ "\xd7\x13\x9f\x96\xdf\xcd\x8a\xdf\xe6\xef\xce\xc6\x18\xe4\x09\x5f"
+ "\x21\x4b\xdf\x5d\x8c\xf4\x85\xbc\x1e\xca\xeb\x21\xf5\x48\x5f\x18"
+ "\xa4\x24\x39\x5e\xf5\x8f\x4b\xdf\x75\xb0\x2f\x0a\xd3\x9f\xf9\xd7"
+ "\x34\x86\x0a\x78\x0c\x62\xbc\x8a\x2a\xa4\xdf\x82\x69\x1b\xf3\xfa"
+ "\xad\xcc\xeb\xdf\x95\xf6\x1f\xef\xb3\xb0\x1f\xa1\xa9\x9c\x0a\x38"
+ "\x2e\x85\xce\xef\x9c\x3f\x06\xf6\x49\x96\x0b\xce\xaf\xe7\x55\xeb"
+ "\x66\x8e\x18\xdd\x94\x6f\x8c\xdf\xc7\xf9\x63\x06\xe7\x9d\xfc\x29"
+ "\xaa\x9f\xf3\x4b\xa3\xfb\x39\xbf\x20\xec\x1c\xb9\x88\xdb\x0a\x1e"
+ "\xb8\x26\x39\x29\xb3\x8a\xb8\x7e\x5c\x52\xdf\x6f\x7d\xbc\xc3\x56"
+ "\x49\xdf\x38\x43\xf9\x27\x64\x7d\x06\x11\x30\x6d\x49\xa0\x66\xa9"
+ "\x03\xe6\xdd\x2e\xf1\x44\x9e\xa2\x20\x19\xc4\xd6\x67\x3b\xf8\x5d"
+ "\x83\x53\x04\x90\xaf\x9d\xf7\x04\xf8\x6c\x35\x78\xe1\x86\x53\x94"
+ "\x7f\x36\xaa\x3c\x24\xdf\xa3\x60\x64\x36\x48\x79\x9c\x97\xae\xaf"
+ "\xe9\x6e\xc3\x73\xfc\x75\xdf\x79\x79\xba\xef\x83\xf2\x19\x9b\x37"
+ "\xe8\xfe\x25\xe3\xc4\x67\x65\x18\xa7\xab\xeb\x81\x79\x75\x3a\xff"
+ "\x2a\x5f\xcb\x79\x87\x06\x7c\xf9\xe6\x1d\xc1\xbb\xe2\xab\xac\x0d"
+ "\x46\xc8\xc1\xbc\xce\x48\x38\x2a\x26\xca\xbc\x80\xee\x8f\xd7\xeb"
+ "\x9c\x6f\xfc\x12\x58\x1a\x3e\xf3\xb3\xa2\xf1\x99\x3f\x0d\x76\x4a"
+ "\x9a\x06\x23\xef\x6a\x30\xb8\xcf\x15\xcf\x32\x3f\xcc\x2f\xbe\xda"
+ "\x9a\x5f\xa2\x85\x0a\x5e\xb9\x82\xb7\xe6\x4b\x7b\x89\x61\x7c\x09"
+ "\x8e\xed\x51\x73\x0b\xb9\x77\xcf\x7b\x5b\x0b\xf6\x2b\xb9\x5f\x10"
+ "\xb3\x46\x38\xbf\x5b\xfa\x53\x69\x72\xff\x64\x30\x56\x0e\x16\x24"
+ "\xeb\x63\x74\x4c\x7a\xba\x2e\xf7\x98\xd7\x32\xdc\x98\x75\xd6\x05"
+ "\xb3\x95\x2c\x2c\xa8\x0b\xa7\x44\xce\xd7\x16\x48\xfb\x4f\x5f\x2f"
+ "\xc5\xfb\xd9\x31\xe5\x62\xd6\xff\xe6\x77\x8b\xc1\xd7\xe9\x93\xd1"
+ "\xbf\x7e\xde\xdb\x52\xb1\x1a\x16\xb4\xc4\xac\x57\xf8\x76\xc9\xf3"
+ "\xf7\x7f\x06\xdc\x02\x4d\xef\x3d\x34\x33\xa6\xbe\x6e\xfb\xd9\xab"
+ "\xb5\xbf\x60\x90\xf6\x17\x0c\xb4\x7f\xa5\x84\x1b\xb3\x96\x58\x20"
+ "\xdb\x1f\xba\x42\xff\x15\xb0\x0f\xa9\x4e\x37\xd8\xdc\x05\xef\xe9"
+ "\xb6\x3a\xaf\x1f\x0c\x6e\xab\x17\x0c\xac\xff\xa9\x72\x03\xeb\x7f"
+ "\xbe\x78\xb6\xba\x97\xe4\xde\x6a\x74\xdd\x1d\xa6\xba\xb8\x6d\x19"
+ "\x64\xfd\xef\x21\x6d\xfd\xef\xa1\xe2\x68\x7d\xf6\x90\x35\xba\x0f"
+ "\x0b\x62\xfa\xf0\xa1\xdc\xe8\x3e\x5c\xd0\xfd\x5f\x1d\xd7\xf0\x4c"
+ "\x89\x89\x89\x86\xc4\x04\x43\x42\x22\x5e\xa3\x89\x34\x2c\xd1\x98"
+ "\x38\x04\xbf\xa1\xda\x75\x98\x21\xd1\x60\xc4\x6f\x88\x76\x1d\x1a"
+ "\xf3\x3c\x8c\xcb\xe2\x67\xd4\xae\x43\x62\x9e\x87\x7e\xc9\xfb\x61"
+ "\x5a\xbd\x7a\xfd\xc6\x98\xe7\x21\x5f\xf2\x7e\xe8\x7f\xb3\x3c\x5d"
+ "\xf1\x1c\xed\x87\x36\x77\xe5\xba\x25\xa5\x2b\x96\xca\xfd\xe2\x65"
+ "\xd6\x25\x4f\x3f\xbd\x6c\xed\x5a\x6b\xd9\x2a\xeb\x7d\x33\x1f\xbe"
+ "\x6b\xaa\x55\x6d\x3b\x97\x4e\xcf\x58\x3a\x9c\xe6\xad\x5f\xc3\x2f"
+ "\xe6\x2d\x9c\x5b\x68\x2d\xb8\x6f\x66\xf4\x4b\x1d\x8c\xdc\x5e\xbe"
+ "\x1a\x94\x08\xf9\xcb\x7d\x69\x14\xd1\x8e\x3d\x52\xf7\x74\xb2\x9f"
+ "\xaf\x5a\xf3\xf8\xfe\xc7\x2d\xec\x3f\x7a\xd9\x2e\xdc\xb7\xf2\x9e"
+ "\xfe\xc2\x65\xdc\x88\x09\x8d\x0e\xb2\x3d\xc5\xe7\x57\x16\x6e\x11"
+ "\x1f\xfa\xc8\xfa\x20\x19\x4e\xd1\xe2\x3f\x34\xe7\x21\x2f\x9e\x3d"
+ "\xde\x20\x59\xed\x94\x84\xf2\xab\xf1\x2e\x41\xcc\x08\x23\xcd\xaf"
+ "\xf9\x42\x7f\x6f\x8b\x4c\xfb\xd0\xa1\xe7\x33\x9d\xa6\x45\x19\xe2"
+ "\x43\x21\x9f\xf9\x7c\x90\xca\xb7\xf0\x0b\x61\x78\xf8\x08\xeb\x86"
+ "\xba\x54\x32\xf2\x5e\xe8\x6b\xa9\x94\xf4\xda\x28\x8e\x59\xb2\xb0"
+ "\x5b\xdf\x0b\x7d\x09\xcf\x5e\x5a\xdc\xce\x75\x73\xde\xb0\xe1\xe1"
+ "\x53\x9c\xbf\x3e\x2a\xff\xa2\x31\x03\x7b\xb1\x0b\xbb\x0d\xc8\xb7"
+ "\xe0\x33\x32\x99\x42\xe2\xef\x81\xd4\xac\xbc\x89\x79\x94\xe0\x41"
+ "\x57\xb4\x04\x1d\xa4\x7c\x7e\x16\x2d\xdb\x10\x12\x41\xf6\x4f\x9f"
+ "\xd7\x6d\x17\x55\xcf\x91\x11\x32\x9d\xe0\x5e\xc3\x3e\x0a\x8b\xf2"
+ "\x1b\x96\x91\x11\xed\x1f\x73\x86\x1e\xa9\xb0\xce\x27\xb2\xcf\x23"
+ "\xe3\xef\xcb\xd9\xdf\x30\xe7\xf4\xae\x3f\x92\xf1\x17\x97\x1d\x86"
+ "\xcb\xc2\x42\x15\x65\xa2\x4b\x70\x1c\x23\xbf\x08\xb0\x8f\x7f\x4b"
+ "\x71\x88\xf3\xfc\x5b\xaf\xdd\x42\x6d\x65\x7e\xda\x7c\x52\x04\xb6"
+ "\xff\x51\x9d\x0d\x68\xed\xf6\xb3\xff\x62\xd2\xe6\x79\x94\x78\xba"
+ "\x90\x0c\xad\x25\xb5\xe4\x59\xec\xa7\x8a\x93\xa2\xab\xa5\xf8\x73"
+ "\x6a\x2b\x69\xa2\xa2\x0e\x32\xb4\x74\x7e\x4a\x32\x16\x4f\x4d\x5d"
+ "\x53\xe5\x45\xb2\x6c\x5e\xc1\x69\x17\x69\xe3\x66\x1a\xb1\xf1\x4f"
+ "\x64\xf2\x74\x75\xa0\x9e\xb3\xf4\xd8\x09\x4a\x00\x3c\xc3\xa6\x4f"
+ "\xc9\xb2\xe9\x51\xf6\xf3\xcd\xa5\xba\x4a\xb2\x08\x7b\x66\xf2\x65"
+ "\x7b\xa6\xf9\xb2\xc8\x4c\xed\xb5\x67\xa6\xb5\xd9\x90\xbf\xf3\x03"
+ "\x1a\xd9\x41\x69\x1f\x9e\xe9\x30\xd4\x5e\xa0\x31\xdc\xa6\xd3\x68"
+ "\x5b\xdd\x05\xe4\xaf\x59\x93\x1d\x46\xd9\xc8\x32\xc1\x94\x35\x79"
+ "\x9e\xc2\x00\x85\x01\xab\xf6\x32\x8d\xa9\xbb\x4c\x96\x70\xf5\x9a"
+ "\x6c\x2e\xd7\x4d\xdf\xdb\xe0\x69\x21\xaa\xd8\x2c\x42\x7d\x35\x39"
+ "\x79\xd0\x89\xc3\xde\x7e\xea\x88\xd1\xd3\xd2\x4d\xad\xfe\xcb\xd4"
+ "\x46\x7f\x26\x4f\xf9\x5f\xdd\xbf\x78\xea\x08\xaf\x59\x27\xb8\x37"
+ "\x76\xa2\x2e\xc5\x3b\xf6\x56\x3e\xab\xec\xa0\xaa\x4a\x4a\xb6\x6d"
+ "\xa4\x61\x67\x90\xae\xe6\xf6\xe3\x0b\x3c\xc1\xbf\xba\x37\x4a\x7f"
+ "\xdc\xc5\xed\x95\xad\x94\xd8\xe6\xaf\x65\xbf\x4f\x43\x28\xb5\xae"
+ "\xc9\xe3\x6f\x27\x8f\xed\x2f\xee\xb0\xb9\xae\x76\x47\x98\x92\x7e"
+ "\x79\xa9\xdd\xe0\x31\x5e\x22\x4f\xa1\x9f\x3e\x42\xdd\xa2\xa6\xee"
+ "\x28\xf4\x56\x6e\x9b\x3f\xc0\xe7\x9d\xb2\x45\x8f\x65\x78\xd5\x1a"
+ "\xca\xaa\xbf\x40\xe9\xfb\x2f\x50\xa6\xe8\xcd\x34\xb0\x8f\x2d\x9f"
+ "\x4d\xdd\x8f\x6b\x72\x27\x25\xa1\xed\xca\x1f\x3b\x45\xf3\xb5\xed"
+ "\xcb\xa4\x86\xcb\x03\xbe\xb6\x97\x7b\x06\x7c\x6d\xc1\x53\x3e\xf6"
+ "\xb7\xf5\xd2\x23\xdb\x4c\x2d\x34\x0c\x72\x72\x90\xf9\xbb\xea\x1c"
+ "\x19\xb7\x9e\x23\x9a\xe8\x30\x90\x75\x39\x9f\xb3\xf8\xfe\x32\x0f"
+ "\xfa\x86\xef\x4f\xd1\xf7\xc7\xe0\x9a\x8c\x5f\x02\xd2\x65\xfc\x86"
+ "\x4e\x8d\x8f\x91\x66\x40\xda\x10\x5c\x13\x21\x2f\x21\x7b\x9d\xf0"
+ "\xa1\xae\xc6\x1e\x03\x0d\x67\x7e\xd6\xfc\x7b\x1b\x7b\x9d\xdf\xf3"
+ "\x7b\xe9\xb9\x6e\x9d\xaf\x95\x8e\x5f\xe8\xfb\xe8\xd4\x59\x8e\x97"
+ "\xe5\x93\x78\xf5\x95\x24\x70\xec\x2c\x2d\x9d\x71\x78\x82\xeb\x45"
+ "\xfd\xb9\xb8\x9a\xf0\x83\x9c\x7e\xef\x84\x5e\xb6\xa7\xaf\x04\x75"
+ "\x7e\xff\x11\xa4\x0b\x3d\x1d\xed\x36\xf2\xbb\x77\x4f\x9d\x35\xa8"
+ "\x3c\x99\x06\xc0\x0c\x68\xf0\x21\xfb\x0b\x77\xb3\x8c\xf7\x18\x4c"
+ "\xe2\x58\x71\x0e\xd5\xed\x11\x2d\xfb\xf7\x88\x66\x25\x7b\xdf\xaf"
+ "\xf5\xd2\x2a\x17\xe3\x88\x71\xbc\x79\x07\xde\x1d\xc3\xa8\xc3\x74"
+ "\x69\x5e\xca\xfe\x64\xdf\x87\xfd\x77\xfd\xd1\xc8\x36\x08\xe7\x43"
+ "\xb5\x3c\x96\xbe\x55\x79\x7c\x08\x74\x40\x6d\x5b\x67\x37\xfd\xe2"
+ "\x72\xd7\x10\xfb\xef\xc8\xe0\x09\x9e\xa2\x49\x69\x64\x61\x7b\xb0"
+ "\x61\x8f\xf0\xbe\xc2\xf1\xf9\xf6\x88\x6e\xf0\xcb\xcd\x67\xa8\x70"
+ "\xc8\x37\xd3\x28\xed\x5f\xcb\x49\xd3\x4f\x85\x37\x47\xe8\xa7\x37"
+ "\x5b\xbd\x47\x22\x74\xd3\xe2\x47\xae\xd4\x4d\x8f\x3f\xa4\x74\x13"
+ "\x64\x5f\xea\xa2\x90\x57\x4b\x9f\x1e\x93\xae\xf9\x89\x3c\x3e\x36"
+ "\x26\x3d\xa0\xa5\x8f\x88\x49\xf7\xa9\xf4\xc7\xe6\xe9\xba\xaf\x8d"
+ "\xf1\x58\xcf\xba\xef\xb1\x3b\x59\xf7\xb5\x15\x6b\xba\x4f\xea\x9f"
+ "\xc7\x6e\x14\xff\x04\x5d\xb4\x8e\xf5\xcd\xa3\x67\x19\x7f\xf1\x21"
+ "\xe9\xb8\x5f\x87\xb4\x5f\x72\x9a\xeb\xcf\x64\xc4\x4f\xd7\x7b\x82"
+ "\xf5\x1e\xeb\x3c\xd6\x7d\xfb\x46\x89\x8e\x7d\x7b\xc4\x89\x3a\x19"
+ "\xfb\xe7\xd1\x7e\xfd\xf7\x32\xd2\x76\x20\xed\x65\xbc\x67\x3d\xc8"
+ "\x34\x69\x2d\x3c\x42\xec\x7f\x02\x5b\xab\x33\x6c\xc8\xa6\x5d\xe8"
+ "\x6f\x3e\x6f\xb8\x0d\xf4\x35\x25\x90\xcd\x53\xc6\x67\x58\x43\xec"
+ "\x93\xd6\xd9\x56\xd6\xc9\x72\x37\x6a\x2b\xe4\xcc\x53\xfe\x39\x55"
+ "\xfa\xc5\x19\x3e\x77\xc7\x38\x14\x6d\x78\x90\xe3\x25\x25\x34\x63"
+ "\x36\xcc\x7e\xe1\xac\xb3\x81\x8b\xd1\x05\x9c\x54\x7c\x96\x47\x0f"
+ "\x78\xe9\x80\x43\xf5\xf5\xe2\x76\x8e\xcb\x76\x8a\x0a\xbb\x30\xdf"
+ "\x0b\x70\xdb\x4c\x21\x07\xf1\x39\x18\x8e\x55\xc8\xd7\x7d\x86\x70"
+ "\x89\x4b\x3f\x0b\xe3\x84\x6e\x40\x1e\x4f\x47\x80\x18\x67\x2f\x3d"
+ "\x9a\xd3\x5a\x71\x84\xcb\x77\x30\x6d\x84\xd3\xae\xc3\x48\x90\x30"
+ "\x0c\x72\xde\x58\x82\x7c\x6a\xed\x3c\x35\x27\xaf\x75\xb1\x8f\x58"
+ "\xef\x7b\xba\x00\xa3\xe2\x94\x82\x01\x58\x02\x63\x40\xd4\x3b\x0d"
+ "\xfe\x88\xcd\xe2\xef\x80\x7f\x80\xfb\x8b\xcf\x45\xf2\x7e\x1b\xe8"
+ "\x92\xcc\xbe\xf2\xca\x16\x7d\x74\x42\xc3\x9f\x89\xb4\xb3\x9d\xe0"
+ "\xb7\x47\xb3\xf8\xdc\x12\x9f\xe7\xbc\xda\x59\x4e\xd0\x28\x5d\x3f"
+ "\xcf\x19\x5e\xff\x3f\x7b\x96\x13\xb0\x2d\xf5\x06\xd1\x04\xfc\xb3"
+ "\xf8\x3c\x27\xf0\xdf\xc1\x7c\xa8\xb5\x29\xfb\xd5\xc7\x24\xcd\xcb"
+ "\x38\x0d\x73\xc7\xe3\x7a\xff\x73\x7b\xb9\x2d\x78\x57\xa8\x6c\x44"
+ "\x81\xf9\xc7\xe3\xd9\xfc\x1e\x69\xb3\x39\xff\x24\xe8\x31\x0f\xc6"
+ "\xb0\xb7\x4f\x85\x0c\x55\x1b\xc9\xa8\x74\xda\xe2\xb9\x5c\x5e\xe9"
+ "\xb4\xc5\x34\xa0\xd3\x1e\xbf\xa8\x74\x9a\xa2\xb1\xd2\x69\x8f\xff"
+ "\x4d\xe9\xb4\xc7\x3f\x93\xfb\x62\xd0\x69\xfc\x8e\xf5\x9a\xae\xd3"
+ "\xf6\x8f\x12\xc7\x59\x77\xf4\x3a\x1f\x6f\xd7\x75\xdb\x4e\xa4\xb1"
+ "\xee\x60\x1c\x95\x9e\x7a\x2c\x53\xfc\x7f\x99\xa4\xfc\x0e\xf8\xbe"
+ "\x84\xcf\x2f\x74\x69\xf7\x3c\x9e\xcc\x54\x3a\x6e\x71\xfa\x80\x8e"
+ "\x7b\xfc\xe0\x40\x59\xd6\x71\x8b\xef\x51\x3a\x4e\xa5\x37\x3c\xc6"
+ "\x3a\xee\xb1\x4c\xa6\x81\x06\xdf\xc0\x6b\x78\x5a\x7e\xa6\x63\x76"
+ "\xa4\x8e\x8b\x96\xaf\xc5\x15\xba\x8e\x63\xdd\x86\xe7\x1d\xd0\x69"
+ "\x72\x0e\xc9\x72\xb6\x1b\x34\xd7\xe5\x8e\xfb\x80\xdb\xcc\xf1\xd7"
+ "\x98\x6e\xb3\xce\xd2\x30\xed\xec\x90\xd6\xee\xc5\xc7\x75\xdf\x47"
+ "\xd0\xbf\x3d\x9e\x1d\x3d\x10\x23\x91\x6e\xe1\xb3\xf3\x1e\xc7\x29"
+ "\xf2\xd4\x0a\x47\x5b\xf0\x24\x15\x95\x41\x57\x24\x3e\xfb\x19\xf7"
+ "\x2d\xe6\x1d\xdf\xe1\x2b\xeb\x9e\x33\xf4\xc4\x88\x22\x3f\x0d\xc5"
+ "\x5c\xfd\xb3\x2a\x03\xde\x95\x47\xbd\x93\x6b\x0c\x13\xd7\x70\x7c"
+ "\x3d\x08\xc2\x20\xf3\xfd\x6b\xac\x6f\xf3\x55\xea\x7b\x4d\xd6\x07"
+ "\x9b\x0a\x73\xa0\x94\x73\xf4\x84\x9c\x97\xc8\xf8\x36\x5b\xe3\xc2"
+ "\xfa\x9d\xf6\x7e\xc8\x20\xef\xff\x76\xf5\xf2\x4f\x5e\x77\xf5\xf2"
+ "\x4f\xde\xce\xba\x08\xed\x33\x85\x9c\xd1\x70\x46\x06\xf5\x7c\x67"
+ "\x38\xdf\x43\xda\x5a\xcc\x67\xf6\xb1\x72\x8e\x66\xd1\x61\x32\xff"
+ "\xed\x42\x3e\x19\x33\x04\xba\x72\xf6\x06\xe2\x78\x2d\x91\x65\x77"
+ "\x0e\xd0\xf8\xc9\xdc\xab\xac\xfb\x25\x7b\x6a\x49\xc6\x8c\x3d\x06"
+ "\x9b\x94\x63\x1a\xed\xee\x5f\xff\x78\xb2\x13\x7a\xd3\x1b\xe1\x17"
+ "\xcb\xf3\xb1\x5b\x38\xae\x01\xdb\x97\x55\x6a\xbe\x79\x13\xf4\x73"
+ "\x2a\x9f\x87\xe1\xb3\x31\x45\xa1\x02\xc3\x31\x19\xcb\xac\xc8\xaa"
+ "\x97\x1d\x6c\x9d\x85\xeb\xd5\xea\x64\x1f\x53\x3f\xca\x2c\xd2\xcb"
+ "\x30\x6c\xf6\x53\xc4\xb8\x7c\x8b\x3c\x53\x1a\xec\x66\x5d\x78\x13"
+ "\x6c\xd1\x54\x55\x4f\x31\x69\xf5\x6c\xf7\xd2\x13\x05\x57\x3b\x9b"
+ "\x31\x78\xfb\x8a\x9a\xaf\xbd\x7d\xa4\xb5\xaf\x98\xbe\xa4\x7d\x57"
+ "\xa9\xb7\x78\xda\xb5\xd7\x6b\xd6\xeb\x2d\xbf\x76\xba\x16\x1f\xfa"
+ "\xea\x74\xcd\xd6\xe8\x5a\xec\xfd\x12\xba\xc6\xa9\x67\x49\xda\x57"
+ "\xaf\xc7\xaa\xd5\xb3\x24\x2f\x5e\x3d\x24\xff\x06\x3d\x37\x95\xa4"
+ "\xc7\xda\xec\x81\xec\xa8\x58\x75\x4b\x5c\x91\xf1\x8b\x7b\xa4\x5c"
+ "\x2d\x39\xd0\x1f\x2f\x59\xed\x95\x43\x57\x2f\xf9\xb8\xa8\x91\xc7"
+ "\x77\x11\xf6\xd2\x92\x66\x8e\xe3\x3a\x7b\xb3\x3a\x93\xad\x95\xe9"
+ "\xb8\x5a\xdc\x64\x8e\xd1\xc5\x31\xf9\x3c\x16\xb4\xbd\x96\x63\x97"
+ "\xac\xe6\x33\x15\x1c\xaf\x15\x3a\xfe\xa9\x9b\x39\xe6\x18\xee\x87"
+ "\xe1\x3e\x53\xe9\x80\xa7\x32\x51\xcf\xe0\x67\x27\x6b\x56\x5b\x0f"
+ "\x54\x66\x0f\x19\xcc\xbf\x1e\xe5\x61\x53\xac\x96\x6b\x53\xe1\xd4"
+ "\x19\x85\x98\x4b\x68\xf1\xfe\x96\x7e\x2e\x63\xc0\xd9\x0b\xf9\x3c"
+ "\x09\xc6\xc5\xa5\x23\xb4\x73\x00\xa0\x87\x03\x74\x7d\xaa\x51\xa7"
+ "\x87\x9e\x8e\xb4\xc3\x3a\x3d\x60\xdf\x24\x7b\x1a\x83\x7c\x4e\xc7"
+ "\xaf\xce\x64\x3f\xf5\xef\xa2\x7a\xb5\x45\xc1\x7e\x5a\xed\xd1\x70"
+ "\x7d\x7d\x85\x46\x39\x6f\xaa\xe4\x79\xd3\xd3\x47\x7d\x29\xab\x2d"
+ "\x3a\x1e\x62\xad\xc5\xc0\x67\xbf\x27\x61\x2c\xdd\xa5\x62\xee\x25"
+ "\xf0\x39\x39\xf9\x7e\x6d\xa6\x41\xd1\xe4\xe9\xe9\xa2\x87\x63\xc7"
+ "\x48\xd8\xc9\xc0\xb3\x93\xe1\x7a\x71\xf5\x6d\xca\xe4\xb8\x17\x5a"
+ "\x7b\x9e\xce\x08\xd7\xcc\x28\x0c\xf7\x5a\x0c\x3a\xbe\xf5\xf2\x4c"
+ "\xeb\xd3\x68\x7f\xb1\x8a\x13\x2b\xf1\xb1\x18\xd8\x9f\x3f\x9c\xba"
+ "\xda\x2a\x36\x59\xe8\xf0\x9a\x2e\x39\x6f\xe2\x3a\x27\xa1\x7e\xc1"
+ "\xf3\x24\xd8\x26\x28\xd7\xd8\x4f\x37\xc0\x15\xbd\x3a\xdd\x9e\xce"
+ "\x57\xe3\xb2\x6a\xa3\x7f\x93\xc5\x70\xcc\x27\xcf\xdb\x51\xba\xd5"
+ "\xfe\x85\x8a\x85\xfd\xf4\x49\x9d\x76\xfd\x38\x01\x1f\xce\xa3\xfc"
+ "\x9b\x9e\x0e\xea\x38\x49\xd9\x4d\xe5\xf3\xbb\x4f\xf9\xf8\xdc\x90"
+ "\xa2\xff\xb1\xe4\x5e\xe7\x52\xeb\x95\xf4\x5f\x9a\x13\x41\xff\x44"
+ "\xe6\x3d\xa6\x3f\xaf\x75\x80\x2e\x4f\x80\x96\x49\xea\xbc\x03\xdb"
+ "\x33\x4b\x97\xe1\x39\x99\xf1\x0c\x57\xeb\x34\x2f\x34\xaa\x75\xb2"
+ "\xa5\xb5\x11\xfd\x80\xf6\x5a\xd8\x56\x4b\xd0\xdb\xcf\x65\x98\x06"
+ "\x1c\x57\x92\xeb\x06\x3e\xd7\xa3\xee\xa6\xd8\x36\x6d\x55\x67\x49"
+ "\x48\xf9\x96\x2c\x6d\x8f\x88\x2d\xee\x2b\xb3\x8a\x80\x3a\x97\xbc"
+ "\xb4\xfc\x70\xa5\xcf\x38\x98\x0e\x60\x1e\x94\x31\x2a\x0d\x72\x5d"
+ "\x01\x36\xd7\xf2\x4f\x04\x70\x53\x7d\xbf\x7c\xbf\x4a\x5b\xf6\x37"
+ "\x5c\xc1\x63\xcb\x66\x0a\xd4\xed\xb3\xcb\x18\x2b\x68\xdb\x72\x2f"
+ "\xf3\x9c\xce\x67\xbc\x0e\xa9\x7c\xc6\x97\xbd\xc9\x3a\x45\xa7\x39"
+ "\xf0\x1f\xde\xeb\x5c\x66\xd3\xf1\xd7\xf3\x73\xdf\x71\x1e\xde\xb3"
+ "\x69\xb6\x06\xa4\xae\x55\x67\x86\x96\xd5\xe9\x32\xcc\x75\x70\x3f"
+ "\xb3\xae\x61\x7a\x28\x5a\x2c\x3b\x1a\x0d\xcb\x62\x50\x71\x33\x99"
+ "\xe7\x21\x8f\x1b\x03\x43\x90\xc7\x3b\x00\x63\xd9\x62\xf5\xae\x1f"
+ "\x4f\xf6\xf3\x97\xbe\x78\xaa\x3f\x96\xcf\xe5\x76\x0d\xe0\xcb\xf2"
+ "\xb7\xbc\xbf\xff\xf9\x9d\xdf\x6e\xe1\x18\xbc\x52\xc7\x94\x8d\x65"
+ "\x7c\x7d\x1c\xdb\x56\xf2\x3a\xe0\xbb\x18\x77\xce\xa3\xf7\xd9\x00"
+ "\x2f\x2e\x2f\x89\x84\x23\xec\x12\x57\x09\x47\xe9\x0e\x1f\xef\x6d"
+ "\x5b\xd5\x7e\xcb\xf2\xdd\x11\xed\x4e\xd6\xf1\x19\xd0\x09\xcb\x0f"
+ "\xc7\xf2\x24\xd7\xcd\xb1\xf8\x34\xd8\xac\x4b\xcc\xa7\x68\x79\xa3"
+ "\x86\x97\xec\xc7\xc1\xc6\x37\x8e\x73\xc9\xb1\x4f\x5f\x51\x3a\x04"
+ "\xfd\x5c\x32\xf6\x15\x75\x8e\xc8\xaf\xe2\x9f\xfe\x20\x43\x18\x7e"
+ "\xcc\xb4\xe2\xf5\x74\x9f\x8c\xd7\x21\xcf\x98\xff\x80\xf7\xf8\xc5"
+ "\x48\xdb\x8f\x65\xac\x5b\xcd\x37\xd0\xd7\x6c\x0b\xca\x58\x7e\xf6"
+ "\x32\x3e\x73\x1b\xe4\xb9\x9e\xf4\x7d\x3b\x56\x16\xa4\x85\x01\x96"
+ "\x89\x1f\x94\xf1\x59\x7a\x15\x47\xfc\x07\x0e\xfd\xfc\x3c\xc7\xce"
+ "\xe4\xb8\xaf\xd0\x43\x89\x03\x71\x5b\x4b\x0a\xd9\xc6\xd2\xfa\x97"
+ "\x76\x19\x44\xbb\x92\xff\x1f\xfc\x8e\xcf\xcb\xab\x7d\xac\x53\xd0"
+ "\x09\x89\x7f\x3d\x45\x3f\xf8\x4c\xad\xfb\xe8\x3a\xaa\xe4\x51\xde"
+ "\xcb\xf2\x6a\x30\x50\x57\x37\xe4\xbb\xe0\x4a\x5d\xf2\x83\xdf\xe9"
+ "\x73\x17\x3e\x7f\xa7\xf6\xc5\x06\xe0\x79\xe9\x07\x72\x2e\x38\xd0"
+ "\x07\xbf\x05\xac\x92\x29\x57\xea\x85\x92\x7c\x5d\xf6\x6c\xb7\xf2"
+ "\x19\xee\x1f\x98\xb9\xfe\xc1\xc6\x0b\x61\x7f\x94\xfb\x29\xe9\xb4"
+ "\x35\x7e\xdf\xc4\xdf\x67\x2b\x69\xd2\xdb\xa0\xd3\x44\xb5\x61\xc5"
+ "\x75\x3d\xa9\x39\x65\x03\x6d\x5f\x21\x6d\xd7\x88\xf7\x33\x23\x68"
+ "\xc3\xcf\xb9\x6a\x5c\x5b\x01\xfa\x2c\xd5\x62\xd5\xaa\x34\xc8\xce"
+ "\xd7\xc5\xa6\x42\x52\x38\xae\x20\x5d\xd6\x91\x37\xcb\x4b\x17\x2d"
+ "\x6a\xbf\x6b\x05\xda\x5f\xb2\x5d\x95\x2b\x39\xc1\xb8\xc4\x6d\x67"
+ "\x34\x8e\x47\xd8\xd6\x50\x31\x15\x56\xbc\xcf\xf8\x5a\xc7\x71\x1f"
+ "\xaf\x78\x41\xea\x70\x8e\xaf\xd0\x57\x32\xc4\xdf\x97\x49\x3d\x7d"
+ "\x25\xd0\x0b\x99\x06\xd4\x03\xfd\xdf\xe3\xd7\xea\x3c\xa4\xe3\xca"
+ "\xb8\xc9\xf8\x9c\x62\x45\x7c\xfa\x72\xbd\x32\xe6\x53\xc9\x30\xfc"
+ "\x92\xf0\x1b\xfa\x55\xed\x12\xd8\xe9\x5d\xbe\xea\xa9\x81\xf0\x3a"
+ "\x71\x9c\xe3\x8b\x61\x2e\xd2\x55\x05\xfe\x1d\xb9\xc5\x0d\xdb\xfc"
+ "\x09\x43\xd1\x06\xca\xc5\x9c\x99\xc4\x25\x31\xa5\x3e\x8c\xeb\x3a"
+ "\x91\xc3\x71\xc6\xf1\x9c\xad\x3d\x67\xf1\x73\xcf\x3a\xb1\xb8\xd7"
+ "\xf9\x4c\xb1\xbe\x47\xa8\x62\xe3\x3c\x63\xeb\x8f\x27\x94\xf8\x38"
+ "\x9f\x27\xe2\xb8\x53\x61\xcc\x85\xba\xb8\xde\x22\x9e\xcf\xa2\x3e"
+ "\xe4\xab\x85\xbd\x21\xd7\x5e\x7c\x89\x77\xa4\xe2\x97\x39\xc8\x5e"
+ "\x6a\x17\xe3\xd5\x93\x32\x35\xa0\xe3\x3a\xd2\x9f\x6b\xf8\x8a\xb8"
+ "\x05\x75\xdc\x90\x7e\xbc\x4a\xa5\x07\x39\xfe\x21\xfb\x3a\xf6\x3a"
+ "\x9f\x1d\xa3\xe3\xaa\xe3\xc0\xf5\xf1\xf9\x4d\x91\x9a\xe3\xe0\xd8"
+ "\x33\x5c\x1f\xc7\x53\x45\xde\x3c\x1d\xdf\xaf\xca\xcb\x95\x75\x42"
+ "\xf0\xf8\xc9\xfa\xd7\x3a\x9a\xa8\xcd\xcf\x3a\xe5\xd9\xba\x63\x75"
+ "\x7e\x5e\xef\x76\xa2\x8e\x2d\x3d\xa2\x84\xc2\x7d\x25\x71\xfb\x98"
+ "\xcb\x20\x7f\x87\xd4\x0f\x35\x39\x5b\xc2\x22\x0f\x7a\x02\xe5\xfa"
+ "\xf2\x78\xad\x09\x72\x5b\x6a\x6c\xae\xe8\xe2\x33\x97\xd0\x39\xa5"
+ "\x46\xe4\x71\xb0\x9d\x85\xf9\x56\x40\x7e\xbf\x02\xba\xc9\xbd\x2e"
+ "\x07\x30\x4a\x87\x18\xcb\xc9\xd8\x1c\x13\xa7\x6a\x30\xfe\xe8\x31"
+ "\xcf\x70\xf5\xd4\xcc\x28\xe9\x75\x96\xc2\xfe\x7f\x6e\xd0\x3d\xdf"
+ "\xad\xa3\x40\x4f\xe4\x73\x8d\xe6\xf9\x5e\x69\xc9\xd5\xf2\xea\xfb"
+ "\xd5\xac\x83\x26\x59\x28\x59\xa4\xcc\x70\xb1\xbe\xed\x49\x9d\x51"
+ "\xc2\x63\x09\xca\x1f\xd4\xcb\xf3\xb8\xce\x63\x07\xfa\xcb\x52\xd5"
+ "\xaf\x0f\x4b\xdb\x95\x3c\x97\xb6\xeb\x32\x1a\xaf\x9e\xb2\x03\x22"
+ "\x6c\xcf\x20\x83\x07\xe3\xd6\xc4\x00\x25\xd7\xbf\x4e\xe4\xda\x28"
+ "\x02\xaf\x6c\xc4\x1c\x66\x34\x7f\xef\xa2\x34\x8f\x65\x94\xf9\x7b"
+ "\x17\xf8\x25\x11\xb8\xbc\x72\x09\x75\x56\xaa\x7c\x9a\xdf\xba\x05"
+ "\xf9\xca\x70\x4d\x13\x06\x03\xed\xae\xa4\xa4\xdd\x61\x32\xba\x2a"
+ "\x69\x0c\xd2\x60\xeb\x3e\xb7\x48\x97\xd9\x78\x38\x54\xd5\x13\xd5"
+ "\xa0\xde\x2d\x95\x22\xf8\x5b\x8c\xe7\xce\xb0\x08\x7c\x15\xba\xa3"
+ "\xfd\x87\x55\x1b\x9f\x3b\xac\xdb\x84\xb8\x77\x47\xfb\x1d\x3c\x77"
+ "\xc5\x19\xef\xa7\x56\xad\x2a\x2b\x5a\xb3\x8c\x2f\x99\x19\xcf\xdf"
+ "\x3e\x3c\x72\x2d\x84\xc7\x3f\x15\xa7\xe2\xb9\x0e\x5e\x77\x7c\x25"
+ "\x55\xdf\x47\x5f\x69\xd1\xd7\x3e\x35\x7f\xfd\x7b\x79\x4e\xc7\x73"
+ "\x1f\xbc\xcb\xf9\xb8\x62\x33\x83\x49\xf8\x2c\x89\x0c\xb1\xf5\x2d"
+ "\x5f\x52\xb6\xa4\x74\x2a\xef\x98\x0d\x8f\x53\xcf\xca\xbc\x98\x7a"
+ "\x1c\xfd\xf5\xa8\xf1\xc7\x6f\xe0\x7c\xd5\xef\x16\x88\x94\xbd\x3e"
+ "\x75\x56\x7a\xe5\x01\x7d\x4d\x6b\x10\x3f\x47\x77\xa8\x66\x8d\x8d"
+ "\xe5\xc1\xbe\x99\x0c\xef\x6e\xec\x30\xb0\x1d\x59\x89\x7b\x5e\x5b"
+ "\x90\x6b\x64\x5a\xbc\xa8\x0f\x2f\x74\x60\x7c\x5f\x19\x10\xd5\x39"
+ "\xa0\xdb\xca\x41\xd7\x6c\x22\x7d\x44\xd8\xa7\xb0\x93\x56\x99\xaf"
+ "\xe6\x73\xc4\xf9\xb9\x3d\xcc\xb3\x31\xe5\x5e\x50\x7d\xb6\x0a\xfc"
+ "\x5f\x6a\xed\x3f\xcf\xab\xe5\xa9\x1a\xa5\xc7\xe1\x5a\xb5\x78\x50"
+ "\x7f\x11\xd7\x8c\x5a\xc5\xe3\xab\x3e\x69\xc6\x7c\x0d\xed\xfc\xe1"
+ "\x29\x5a\xf5\xb1\xd1\x02\x1b\x61\x34\xfd\x14\xf7\x9f\x70\x59\x7e"
+ "\x17\xc5\x47\x37\x9f\x6d\x34\x42\xbb\x40\xcb\x24\x08\xf5\x47\x46"
+ "\xed\x26\x11\x3f\x83\x48\x90\xbb\xa9\x89\xe8\xc1\x61\x43\x8d\x64"
+ "\x1a\x99\x9c\x74\xcb\x37\xc6\x58\xee\x9d\x31\x6d\x8a\xbd\xb2\x02"
+ "\x5a\x39\x18\x30\x89\xc8\xf8\x69\x7b\x6b\x1f\xb9\xdd\x41\xd2\x9f"
+ "\xa6\x7a\x6f\x6d\x3c\x5c\x77\x3a\x85\x8d\xcf\xae\x87\x53\xdf\x72"
+ "\xdb\x9f\x27\xc3\xdb\x97\xbd\x06\x8e\xd1\xcc\xf6\x33\x7f\xeb\xe2"
+ "\x14\xd9\x1e\xfa\x08\x69\xa0\x57\xb9\x70\xbd\xe5\x56\x76\xa7\xad"
+ "\x3a\x5c\xf3\x96\x7b\x00\xbe\x91\x18\xbe\xfd\x35\x32\x1c\xa8\xec"
+ "\x32\x78\x8c\x33\xc8\x63\xf5\xd3\x47\xb8\x8f\xdb\x57\xa8\x93\x6d"
+ "\x59\x86\xd1\xe0\x0c\x6f\xb7\x7f\x41\x06\xed\xfc\xa9\xe1\x1c\xd9"
+ "\x7e\xd7\x34\x48\x39\x3e\xef\xdd\x93\x3a\xf5\xc3\x5e\xe7\x6a\xa3"
+ "\x97\xee\x9b\xad\xd9\x32\x18\x73\x57\x63\xfe\xbf\x4a\xc6\x79\xc2"
+ "\xfb\x0f\xf8\xbb\x30\x48\xcb\xd4\xf3\xc4\xed\xa3\x1f\xf1\x1a\xbc"
+ "\x70\x33\x1f\x88\x4b\x7f\xeb\xe2\xb3\x2d\x83\xf8\xc1\x0c\xf3\x94"
+ "\xdf\xc5\x7b\x91\x43\x46\x42\xff\xd8\x2f\x8a\xbe\x90\x93\xd2\x20"
+ "\x4e\x86\x90\x81\x6e\x09\x5e\x12\x85\xad\xdd\x17\x64\x4c\x53\xd6"
+ "\x35\x6f\x2d\xff\xad\xc1\x13\x38\xef\xf6\x6c\x0b\x53\x1b\xec\x4a"
+ "\x4f\xdd\x79\xb7\x8a\x7d\x1a\xa2\x56\xfa\x33\xb5\x96\xff\x6f\x87"
+ "\xc7\xf1\x67\xa4\x0b\x19\x0b\xbb\xef\x92\x58\xe4\x31\xfe\x1b\xf1"
+ "\x77\x8a\x78\x8c\x03\xdd\xad\xe7\x68\xf5\xdf\x3f\x04\x9c\xb7\xff"
+ "\x03\xb0\x64\xcc\xb4\xe9\xf4\x11\xee\xd1\xa6\xfe\xf1\x2f\x6e\xac"
+ "\x99\x04\xf7\x4e\x53\xf9\x13\x86\x30\xc6\x52\x8e\x6d\x87\x31\x34"
+ "\x87\xdb\x85\xe7\x6c\x7e\xc6\x35\x8b\xaf\xa6\x2d\xee\xfd\xa6\xe0"
+ "\x13\x3c\xb6\x16\xf2\xb8\x89\xf4\x45\x0d\x97\xe4\x58\x5b\xa0\x3d"
+ "\xe7\x6b\xcf\x79\xda\xf3\x6c\xed\x39\x57\x7b\xe6\x75\x79\x6d\x4c"
+ "\x5e\xe3\xea\xb7\x17\x0c\xc3\xda\xf1\xdc\xa8\xf7\x05\xf0\x19\x61"
+ "\x2a\xdf\x2c\xc7\x76\x0d\x8f\x1c\x0d\xaf\x6c\xed\x59\xc7\xe7\x66"
+ "\x53\x70\xf3\xff\x10\x3e\x6b\xad\xd1\xf8\xac\xcd\x8e\xc0\x87\x4c"
+ "\xe5\xb9\x5f\x05\x1f\xb3\x89\xbf\x13\xf1\xdf\xc0\x87\x71\xe1\x34"
+ "\xd4\xdf\x14\x83\x8f\x5b\xc7\x27\x2e\xbf\xad\x13\x5d\x6c\xd7\xac"
+ "\xfd\x9a\x8c\xeb\x3c\x8c\x6d\x96\x86\xcb\x7a\x9c\xc2\xb5\xc1\xab"
+ "\xc5\x29\x84\x2c\x60\xdc\x2e\x43\xfb\xd7\xb6\x68\xf6\xdb\x51\x65"
+ "\xe7\x97\xe5\xe8\xbe\x63\x68\xeb\xc1\x2a\xd5\xd6\x43\xdb\x38\x56"
+ "\xdf\x06\xfa\xba\xbd\x5c\x74\x61\xde\xfd\x9f\x3c\x37\x8c\x84\x5b"
+ "\x5a\xb6\x76\xed\x73\x53\xad\xa5\x4b\x56\x2e\xb3\x66\x2c\xb5\xae"
+ "\x2d\x59\xb1\xbc\x6c\x59\xb4\x3f\x85\x59\xfb\x7e\x8f\x3c\x27\xc2"
+ "\x73\x29\x39\x97\x06\xff\x4b\x3d\x29\x7d\xf2\xca\x2e\x0a\x67\x59"
+ "\x31\xeb\xdc\xfa\x1a\xf5\x9d\x27\xe0\xd3\xac\x8f\x21\xfa\xfc\x97"
+ "\xc7\x10\xa4\x9f\xc4\x38\xb9\x38\x22\x9d\xf3\xfa\xf4\x34\x86\xaf"
+ "\xe9\xa6\x61\xa7\xa8\xac\x9a\xeb\x8c\x4b\xc3\x4b\xa2\x11\x76\x13"
+ "\x7f\xc3\xc2\x00\x9d\x22\x38\xee\x16\x9f\xbf\x44\x39\x71\x9a\x9e"
+ "\x97\xf3\x8a\x45\x78\x56\x73\x36\x01\x1c\x9f\x7f\x04\x65\x0e\x20"
+ "\xcd\xc8\x36\x04\xe6\x81\x5d\x5c\x0e\xe9\xcf\x71\x1c\x0c\xa4\x27"
+ "\x69\xf1\xc4\x38\x6d\x0b\xc7\xa9\x40\x9a\x39\x22\xed\x55\xa4\x59"
+ "\x90\x66\xd5\xe0\xbd\xc9\x74\xc6\x73\xae\xb6\x4e\xc6\x79\xde\xd7"
+ "\xea\x75\x44\xe2\xcc\xdf\x70\xb9\x6b\x62\xb6\x75\xd1\xc2\xbb\xa7"
+ "\xcf\x78\x7a\xd5\xca\xe5\xc3\x49\x92\x3d\x13\xc3\x71\xf6\x5d\xe5"
+ "\xb7\x4f\xb5\xda\x96\x2d\x5b\x63\x5d\xbf\x6c\x65\x99\x75\xc9\xfa"
+ "\x25\x1b\x86\xd3\xf2\x55\x6b\x9e\xe6\x28\x0b\xdc\x2d\x6b\x8b\x9e"
+ "\x5e\xfe\x03\x76\x7a\x51\xb9\x87\x47\xd9\x09\x8b\x58\xb7\x69\x71"
+ "\x49\x8e\x57\xb1\x0d\x99\x72\x6f\x31\xee\x39\x5e\x97\x05\xd7\x66"
+ "\xfc\x8e\xe2\x77\x04\xbf\x13\xf8\xb5\x9f\xa1\x4d\xdb\x70\x3d\xdc"
+ "\xeb\x5c\xb7\x54\xb7\x57\x06\x78\x68\x5d\xb9\xce\x43\xb0\x2f\x0e"
+ "\xab\xf1\x6d\xdd\xc1\xb6\xa0\x94\x9f\x7e\x9e\xaa\xba\x34\xc0\x53"
+ "\x1c\x6f\xb4\x8d\x7d\xba\xd6\xe1\xfd\x65\xb9\x56\xc9\x6b\x26\xd7"
+ "\x31\xdd\x4e\xd3\x86\xfd\x0d\x7b\x44\x0b\xc7\xca\xc1\xb5\x19\xfc"
+ "\xd2\xa2\xe2\xd3\xac\x4f\x47\xbe\xb1\xa8\xe3\xa8\xaa\x43\x7b\x1e"
+ "\x25\x8e\xf3\x37\x5c\x4e\x69\xcf\x0c\x0b\x30\x26\xf3\x3d\x5f\xb5"
+ "\xbd\x53\x93\xf6\x8d\x37\xc3\xc0\xbb\xf5\xad\x5a\x1d\x1c\x4f\xdb"
+ "\x51\xef\x94\x73\x29\x39\x77\xe6\x35\x62\x53\xc2\xbd\x02\xf8\x9c"
+ "\x0f\x27\x3e\xde\x21\xe3\x5f\x3a\x2e\x43\x47\x7c\xeb\x5b\x9e\x72"
+ "\x99\x3f\x81\xd7\x90\xe7\xdb\x44\x98\xe3\x90\x87\x13\x9f\xed\xe0"
+ "\x72\xc2\x7c\x6f\x71\x78\xd7\x88\x5c\x65\x33\x70\xdc\xc1\xf5\x07"
+ "\x35\x98\x01\xa6\xed\x19\x5a\xf7\xa8\x9a\x87\x6f\xda\xa6\x6c\x89"
+ "\xf5\x87\x75\x5f\x4b\xc8\x68\x26\x9e\x9b\x75\x1d\xe0\xa5\xf5\x2e"
+ "\xcd\x2f\xce\xad\xb5\x3f\xa8\x3d\x1f\xd1\x70\x4c\xe0\x58\x28\xc0"
+ "\xbf\x9d\xfb\x0e\xf6\xca\x11\xdc\x9f\x00\x7d\x5a\x14\x7d\xca\x65"
+ "\x9c\x03\xd8\x4d\xfc\xfe\x04\x7f\xef\x06\xef\x4e\xa8\x38\x23\xeb"
+ "\x73\xb8\xcd\x03\xbe\xb3\x75\xb9\xc0\x75\x32\xef\x31\x43\x96\x8e"
+ "\x78\x2e\xb1\x7c\xae\xcf\x06\xbc\x26\x5d\xef\xb0\x9e\x29\x0a\x41"
+ "\x4e\xe5\x7c\xaa\xbc\x54\xd7\x37\x03\x7c\x50\xee\x88\xa7\x4b\xe2"
+ "\xf5\xbb\xa2\x7f\xf9\xdf\x84\xf3\xf9\x66\xe0\xd4\x24\xfb\x80\xe3"
+ "\xb1\x5e\xea\x9f\xb7\xf5\x29\x1d\x59\x7e\xa2\x7f\x8e\xa9\xe1\xc1"
+ "\xb1\xdd\xbd\x8c\xdb\x65\xb9\xef\xaf\xe9\x8d\xf2\xa0\xae\x37\x74"
+ "\x38\xa6\x04\x11\x36\x95\xe3\x9f\x6b\x72\x31\xef\x91\xf0\x78\x29"
+ "\xed\x11\xc0\x19\x79\x51\x9d\x81\x0b\x57\x4f\xc6\x9c\xb6\xfc\x30"
+ "\x7f\xf3\x4d\xda\xb4\xce\xe7\xff\xf7\x80\x2e\xda\x50\x10\x09\x53"
+ "\x98\x27\x17\x33\x5c\xd6\x47\x6c\x93\x14\x85\x8c\x1c\x87\xa6\x58"
+ "\x1b\x5f\xa0\x83\x37\x38\x74\x5c\x41\xc3\xe3\x3a\xbe\xda\x37\xc7"
+ "\x8e\xa3\x1e\xef\x82\x50\x1f\xfb\x82\x37\xab\xfe\xdc\x24\xf5\x0d"
+ "\xde\x1d\x42\xd9\xa3\x5e\x7a\xde\xac\xc9\x50\x0b\xca\x1f\x3a\x56"
+ "\x39\x1b\x79\x36\x74\x68\xfe\xcc\xed\xe8\xdf\x13\x03\xbc\xbf\xae"
+ "\x35\x62\x9d\xe7\x84\xea\xc3\x19\x8e\x53\xb4\xd1\x12\x91\xae\xf5"
+ "\xed\xb1\x02\xa4\xb7\xaa\x35\x93\xc9\x56\x55\x7e\xa3\xf2\x5d\xd5"
+ "\x70\x64\x5d\xc0\xe7\xf5\x58\xc6\x25\xed\x65\x1f\x6f\x2c\xd0\xc7"
+ "\x0b\xc0\x3a\x2c\x69\x3e\x4a\x1c\x65\x3a\xa9\x78\x1f\xcf\x5f\x52"
+ "\x74\xda\x58\x1e\x45\x7b\x1e\x37\x51\x0f\xd3\x69\xe4\x16\x11\x1e"
+ "\xe9\x4f\x10\x45\x1b\x8c\xc4\xf2\xc2\x32\xce\x7b\x83\xe0\x0f\x69"
+ "\x57\x29\xba\x6d\x3c\xa2\xd3\x4d\xef\x3b\xa6\x93\x97\x36\x66\x32"
+ "\x6d\xa3\xdb\x38\xac\xfd\x94\xde\x76\xd0\x94\x63\x9a\xe2\xb9\x45"
+ "\x93\x8b\x16\xf7\x68\xf6\x1d\x59\xf7\x87\x63\xc6\xbb\xe9\x58\x79"
+ "\x0e\x29\xda\x6e\xb2\x78\xa9\xac\x3c\x62\x5e\x72\x9c\xe9\xcb\xb2"
+ "\x02\x3c\x17\x6b\xb1\xb7\x8e\x2b\x3f\xa6\x75\x2d\xa2\x7a\xf2\x62"
+ "\x29\xcb\xeb\x64\x8c\x14\x8e\xdb\xdb\xce\x34\x62\xbd\xc8\xb2\xc4"
+ "\x32\xc0\xf2\xa4\x68\xb4\xa9\x2c\x82\x46\xcd\x4c\x1f\x8d\x4e\x87"
+ "\x63\x74\xf9\x32\x6b\xe9\x74\xa5\x8b\xad\x99\x19\x4b\x27\xc9\x40"
+ "\x37\xd6\xfb\x67\x4d\xb5\x16\x4c\xcf\x28\x2f\xc9\x9a\xaf\x2e\xb3"
+ "\x0a\xf2\xf9\x3a\x3c\x7a\x5e\x67\x45\x3d\x27\xa3\xe7\x86\x5b\x4a"
+ "\x94\xfe\xd8\xe4\xf7\x26\x98\x25\xdf\x70\xdc\xd9\xaa\x95\x44\x21"
+ "\xe0\xbd\xeb\x0c\xfa\xd4\x9c\xc3\x71\x9e\xdd\x0b\xca\x89\xe3\xa2"
+ "\x7f\xd1\x80\x77\xf5\x48\x1f\x69\xe3\xef\x23\xfc\x45\x84\x53\x72"
+ "\xe4\x7a\x9f\xa8\xce\x70\xfb\x52\xf6\xd6\xe2\x57\xec\x4b\x99\xda"
+ "\x3e\xe7\x76\xbb\xe8\x75\x56\xe4\xeb\xed\xe2\xb5\x1d\xcc\xcb\x82"
+ "\x0b\xca\x45\x88\x69\x54\x54\xce\xb1\xc8\x01\x3b\x91\xd7\x76\x2a"
+ "\xd0\x7e\x5b\x93\x9a\xbf\x56\x80\xff\xd7\x69\xf6\x0c\x15\xe0\x19"
+ "\xf6\xdf\xdd\x72\x8d\x2b\xec\xb4\xc8\x18\xe6\xe1\xad\x77\x3c\x8c"
+ "\xf9\x40\xb1\x0e\x13\xb0\x86\x2a\xbf\x07\x05\xef\xab\xfa\xd5\x86"
+ "\x6b\xee\x4e\x36\x25\xa8\xb8\x90\x90\x71\x47\x83\x21\x5c\xd8\xef"
+ "\x27\x83\x77\x23\xb7\x98\xd9\x8f\xa6\x10\xbc\xe7\xe0\x3c\xfa\xbb"
+ "\x2a\x67\xd8\x5b\x65\x08\x07\xd0\x8f\x66\x65\x3f\x77\xb3\xfe\xc4"
+ "\xdc\x75\xf3\x34\x7d\x5c\x93\xe3\xa1\x81\x1c\x6a\x3e\xb3\xf9\x09"
+ "\x2e\x77\xc1\x69\x24\xe8\xec\x96\x5b\xd3\xe4\x1c\x25\x10\x76\x26"
+ "\x90\xf2\x65\xde\x7c\xa7\xae\x63\x79\xbf\xd4\xb4\x45\xf8\x78\x8d"
+ "\xd8\x14\x14\x3e\x19\x6b\x9f\xc7\x0e\x3a\x43\x9e\x8a\x5e\x87\x47"
+ "\x7e\x83\x93\xbf\x2b\xe2\xd7\xc6\x8d\x90\x1a\x37\x50\xbf\x2f\xf1"
+ "\x8e\x62\x8c\x0f\x09\x67\x08\xb6\x2e\xf0\x67\xda\xf0\x5e\x4b\x18"
+ "\xb4\xf2\xf0\x38\xc9\xf4\x49\xe5\xf8\x31\x66\x3e\xe3\x51\x68\x0a"
+ "\xa2\xcd\x91\xed\x32\x84\xbd\xbb\x9c\x68\x97\x01\xed\x2a\x3f\xcb"
+ "\x32\x13\x60\xdf\x24\xc8\xdb\x28\x19\xcf\x5a\xce\xcf\x2b\xad\x91"
+ "\x6d\x64\xfd\xaf\xda\x50\x39\x33\x5e\x1b\x85\x81\xdb\xc8\x34\xa8"
+ "\xbc\x51\x93\x37\x89\x27\xeb\x8f\x6e\xda\x7c\x62\xe4\x16\xf6\x09"
+ "\xca\x09\x42\xbf\xcd\xe2\x3e\xc4\xf8\xe9\x62\x3c\xe3\xf5\x17\xc3"
+ "\xd3\x60\x79\x4d\x5b\x1c\xc5\xc0\xe5\x50\x7c\x7a\x57\xb6\x5e\x9d"
+ "\xde\x95\x3f\xe6\xf2\x8c\x07\xef\xef\x98\x82\x06\xe8\xe0\xbd\xc5"
+ "\x98\xaf\x6d\x8f\x57\xef\xc8\x2d\x8d\x8c\x57\xdc\x77\x82\xe5\x45"
+ "\xd3\x41\xe0\x43\x01\x39\x11\xac\x93\x7a\x9d\xf6\x3c\x5d\x1f\x99"
+ "\x12\xac\x89\x52\x3f\x18\x84\x2b\x1e\x0c\xd3\x16\x17\xef\x73\xcd"
+ "\x42\xfd\x71\xdf\x87\xf9\xdb\x1d\xae\x9c\xae\xf0\xd6\x6f\xde\x6a"
+ "\x4a\xa0\x7b\x7d\x89\xdf\x1c\x6e\x2a\x0f\xa6\x33\x0d\x01\xb3\x1c"
+ "\x72\xfc\x08\xcf\x53\xd5\xda\x88\x1d\xf6\x7f\xb5\x8c\xcf\xe4\x4b"
+ "\xc9\xe9\x52\xfb\x46\x76\x8c\x7f\xb5\x56\x7d\x6d\x1e\xcf\x9d\x5e"
+ "\xfa\x5b\x89\x92\xcb\xaf\xbf\x2e\x6a\xa6\xd6\x85\x9d\x26\x61\xdd"
+ "\x68\x82\x1d\xe9\xd8\x1c\x16\xfc\x3d\x87\xa9\x75\x03\x7c\xa2\xfc"
+ "\xa5\x74\x3e\xe9\x75\x3a\xd2\xe3\xf3\x80\x63\xce\xd5\x79\xc0\xf1"
+ "\x35\x7e\xcf\x74\x57\x73\x15\x47\xa9\x6e\xa7\x88\xad\x5f\x7f\xdd"
+ "\x5a\x29\xeb\x27\x55\x37\xd3\x24\x97\xf7\x8c\xf2\x41\x17\x07\xf2"
+ "\xd6\xea\x7a\x80\xf9\xc5\x14\xe2\x6f\x5d\x90\xe4\x69\xbc\xc3\xb8"
+ "\x52\x96\xa4\xd6\xc1\xbf\x53\x28\xbf\x5f\xe9\xdc\xe4\xf2\xd9\x4b"
+ "\xf6\xf1\x77\x5a\xfd\x29\x93\x97\x22\x4f\x87\x97\x9a\xd5\x7e\xab"
+ "\x79\xf2\x62\xe8\xec\xe2\xdd\xca\x1f\x3a\x49\xc6\x8b\x82\x4c\x73"
+ "\x8c\x28\x96\x6b\xa4\xa5\x01\x6f\x8e\x17\x85\xf9\xce\x16\x73\xff"
+ "\xb8\xe4\xcc\x85\xae\x10\xd2\x16\xc3\xb8\x34\xa6\x07\xb4\x7b\xd5"
+ "\x10\x3e\x78\x69\x92\x85\xb8\xcd\x97\xb6\x8e\x3e\xf8\xc3\x89\x64"
+ "\xfc\x7f\x2c\x4f\x91\xed\x2e\x4a\xdb\x72\xb7\x91\xfe\xcf\x14\x32"
+ "\x30\x1d\xbc\xb4\xc5\xaa\x68\xb7\xa5\x58\xef\x1f\x2f\xd9\x8f\x4b"
+ "\xdd\xb9\xf5\xf1\xae\x05\x41\xf1\x85\x5a\xe7\xde\x02\xfd\xf7\x5c"
+ "\xad\x7a\xbf\xa9\x2b\x76\x0d\x88\xed\x79\xeb\x8a\xb5\xd6\xa5\xab"
+ "\xd6\xaf\x1c\x3b\x36\x6a\xae\x64\x54\xdf\xc5\xdd\xb2\x5b\x8d\xa7"
+ "\x5b\x8e\xeb\x78\xb3\x5d\x82\x67\xb4\x7f\xd3\x15\xb1\xec\xf3\x8b"
+ "\x34\x37\xf7\xa2\x6c\x1a\xb8\xbf\x93\xf2\xef\x8c\x78\xfc\x16\xe5"
+ "\xdf\xf5\xad\xa2\x87\x97\x2d\x59\xba\x21\x22\x75\x72\xe4\xba\x61"
+ "\xd5\xeb\xa8\x3b\x71\xf4\x7d\xd0\x15\x09\xf3\x37\xf1\xd8\xe2\xfc"
+ "\xa0\x32\x28\xfe\x0a\x7d\x3d\x05\x32\x56\xd4\x5a\x16\xa4\x56\xe8"
+ "\x32\xf1\x75\xd6\xe1\xc3\xd4\xd9\x4e\xd8\x53\xe0\x2d\x13\xda\xee"
+ "\x83\x5d\x77\x91\xd7\x67\x50\xee\xb3\xb6\x5a\x8e\xe9\x3c\x55\x8b"
+ "\x57\xef\xac\x43\x7a\x0a\xae\x9f\xe0\x3a\x14\xd7\xdf\x59\x57\x62"
+ "\xde\xc3\xbe\xf4\xeb\xd8\x97\xde\xf9\x8e\xf4\x07\xf2\x3b\x88\x7d"
+ "\x82\xf0\x7e\x11\xdb\x20\x5e\xda\x6a\xe4\x75\x70\xce\x8b\xb4\xfd"
+ "\xd6\x67\x28\x9b\xaf\x42\xee\x0d\x3a\xeb\x44\xf5\xd4\x0e\xb1\xaf"
+ "\x90\xbf\xb7\x96\x7e\x9a\xb6\x26\x24\x26\x7c\x46\x89\x96\xa4\xe4"
+ "\x5e\xe7\x56\x94\x5d\xb9\x88\xe9\x34\xd8\xb7\x68\xe5\x37\x80\x63"
+ "\xec\xc3\x01\xdb\xf0\x47\x24\xed\x5b\xcd\x9e\xab\x97\xe3\xc2\xd6"
+ "\x45\x11\x36\x1d\xef\x4d\x0f\x57\xf6\x89\x08\x29\xfb\x74\x6b\x99"
+ "\x2e\x07\xb8\x77\xe8\x7c\x1a\x15\x5f\x6f\x65\xd9\xb2\x35\xcb\x96"
+ "\x5a\x33\xd6\x0e\xa7\x88\xe8\x7a\x25\xcb\x56\x5a\xd7\x2c\x5b\xfd"
+ "\xfc\xb2\xb5\x32\x32\x1e\xbf\x8d\x1a\xf3\xd3\x44\xea\x3d\xc9\xfa"
+ "\xb9\x2f\xeb\x68\xa6\xef\xd6\xcf\x39\x26\x9b\xa8\xb9\x67\x07\xfb"
+ "\xee\xa8\xf9\xc6\x5b\x1d\xd1\xf3\x8d\x17\x54\xdc\x09\xd7\xd4\xe3"
+ "\x6a\xae\xf3\x82\xfc\x8e\xf5\x29\xda\xe6\x1a\x88\xff\xbe\x6d\x26"
+ "\x68\x69\xd0\xe8\x76\xb1\xd7\xb9\x6d\x8a\x4e\x37\x2f\xbd\xe0\xd6"
+ "\x6c\xa9\x6e\xa9\x3f\x30\xc6\x42\xff\x45\x8d\xaf\xea\x1b\xb4\xdb"
+ "\x38\x2e\x47\xa2\x5c\x4f\x4e\x99\xca\xf3\x0d\x03\xc3\x44\x7d\x6e"
+ "\xf4\xcf\x71\xe8\x4d\xd6\x6f\xdb\x75\x78\xa8\x33\x93\xeb\xd3\xe6"
+ "\x41\x37\x9d\xa1\x17\xe4\x9a\x73\xd8\x35\xb5\x85\x75\x0a\xc7\x10"
+ "\x09\x57\x03\x8e\xdc\xa3\x7d\xc1\x2d\xd7\x61\xf9\x1b\x04\x80\xc5"
+ "\xeb\xc0\xd0\x73\x27\xf9\x7b\xc5\x9c\xa6\x62\xc3\x6d\xdd\xc1\x6b"
+ "\xcf\xa8\xab\x19\xf8\x07\x06\xce\x36\xbc\xe0\x66\xbb\x93\xe1\x7a"
+ "\x69\xdb\x51\x86\xa7\x62\xdf\xbd\x30\x06\xbc\x93\x3e\x60\x3f\xbd"
+ "\x50\x1c\x31\x2f\x63\x7c\x24\x9e\x7e\xe0\x22\xe3\xac\x2a\x5f\x53"
+ "\xd9\x6e\xd6\x9f\xbb\xb5\xb6\xeb\xed\x01\x3c\xe8\xbf\xad\x66\xdd"
+ "\x6f\xc2\xab\xb5\x9b\xf1\x63\xdc\x23\x71\xd6\xf0\xad\x65\x7c\x51"
+ "\xee\x40\x84\x6c\xf3\xba\xcc\x10\xa4\x1d\x19\xf0\x61\xdf\x46\xb1"
+ "\x7a\x63\xd5\x4a\x6b\xe9\x8a\x95\xcf\x16\xad\x5f\xf2\xec\xb2\xa2"
+ "\xe7\x6d\x59\xd6\xe7\x57\x3e\x55\xba\xea\xe9\x67\x99\x6b\xd6\x96"
+ "\x3d\xff\xf4\xb3\x56\xd6\x2c\x45\xb3\xf3\xf3\x8b\xee\x7b\x64\xe1"
+ "\xa3\xc3\xe9\xbe\x25\x48\xc3\xcc\x3f\x3f\x3b\x4b\xbd\x7a\x78\xce"
+ "\xac\xef\x15\xcd\x5a\xf0\xc8\xfc\x45\xf2\xd0\x4b\xff\xfb\xd9\x2b"
+ "\xe3\x67\x88\xe2\x43\x33\x78\xa9\x19\xfd\x3b\xe4\x14\xbd\x34\x4d"
+ "\xc5\x4b\x7f\xb1\x34\x3a\x5e\xfa\x8b\x40\xfa\xc5\x46\xfc\x8e\x12"
+ "\xfd\xd0\x87\x1f\xb4\xfb\x4b\xd9\x8a\xbf\xae\x7b\xb2\xd7\xf9\x62"
+ "\xed\x00\x7f\xbd\x24\xcf\x52\xb2\x9f\x92\x5a\x9f\x7d\x11\xfa\x7f"
+ "\xeb\x91\xc8\x77\x03\xf3\xc9\x17\xdb\xfb\xe7\x93\xfd\x3a\xe5\xc5"
+ "\xfe\xb9\x25\xd2\xda\x31\xaf\xbc\x8e\xe7\x95\x6a\x3d\xe9\xa5\xe9"
+ "\x92\xa7\x06\x95\xef\x24\xd2\xe7\x95\x2c\xdb\x72\x4f\x4a\xce\x3f"
+ "\x7e\x38\x25\x52\xc6\xe5\x9a\xbe\x26\xe3\x5c\x4e\xae\xdf\x99\xdf"
+ "\x6a\xe6\x35\x6d\xd8\xc7\xcd\xb0\x15\x30\x7e\xf5\x0a\x91\xf2\x56"
+ "\xb3\xc2\xe9\x87\xe5\xbc\xc6\xcd\x76\xb3\xc6\x4f\x23\xcf\xd0\x0f"
+ "\xdf\x13\xce\x17\x5a\xd4\x9c\xf2\x85\x10\xeb\x75\xb1\x75\xf4\x7d"
+ "\xec\x5b\xc4\x73\x27\xd4\x79\x68\x80\x67\x5f\x9a\xc6\xbc\x30\x30"
+ "\x97\xfd\x61\x94\xfe\xef\x91\xdf\x25\xfc\xe1\x49\x3d\xde\x43\xd9"
+ "\x58\x32\x18\xc7\xba\x68\xb7\x41\x40\xdf\xfc\x70\x07\xd7\xc1\xf4"
+ "\xf4\xd2\x8b\x07\x91\xd7\x38\x40\xbf\xed\xe6\x7e\xfa\x69\xeb\x2c"
+ "\xfa\x1a\x8b\xc2\xfb\xa5\xe9\x83\xd1\x2a\x3e\x9d\xb6\x17\x7f\x29"
+ "\x9d\x9c\x34\x84\x65\x52\xa7\xd7\x95\xb4\xda\x7e\xe0\x4a\x5a\x6d"
+ "\xbf\x38\x40\xab\x17\x6f\xbe\x92\x56\xdb\x3b\x22\xf6\x95\xb4\x75"
+ "\x94\x97\xa6\x33\xcd\x98\xc7\xd0\xee\x1d\xe0\xb3\xda\x01\xfa\xbd"
+ "\x94\x74\x25\xfd\x5e\x1a\x13\x9f\x7e\xdb\xf9\x7c\x55\x24\x9c\xfa"
+ "\x78\xe3\xc6\xc8\x2d\x06\xed\x3c\xd8\x4b\xd5\xfc\xad\x7b\xc6\xe3"
+ "\x15\x43\xb8\xe4\x15\x27\x7e\xb8\xf2\x3c\x62\xc0\x16\x17\x01\x8d"
+ "\xbe\xae\x66\xcc\x79\x79\x5d\xe9\x2a\x63\xd1\x49\x7d\xcd\x03\xf7"
+ "\x1d\x3c\x77\xe6\x6f\x42\x71\x3a\xd3\x93\xbf\x31\x06\x7e\xef\x50"
+ "\x76\xe9\x4b\xfd\xdf\xff\xe8\x99\xf8\x60\x76\xe2\x16\xb2\x1e\xab"
+ "\xbb\x8b\xd3\x03\xe0\xa1\x3c\x4e\x67\xdf\xad\xc1\x60\x16\x85\x72"
+ "\x29\x3e\xdc\x1f\xf5\xf3\xff\x60\x67\xa2\x63\xf4\x51\xc9\x92\x95"
+ "\x4b\x57\x2d\x5f\xfe\xe5\xaa\x28\x72\x5f\xcd\xe5\x0c\x6f\xef\xe5"
+ "\xef\x6e\x6e\x7d\x66\x23\xea\x84\xfd\x6f\xeb\x52\xe3\xe6\x8f\xa0"
+ "\xff\x56\x34\x2b\x5b\xf2\xf1\x2e\x75\x0e\xfc\xe5\xb4\x08\xfd\x0c"
+ "\x1e\x79\xd9\x2a\x9c\x3f\x5a\x3c\xd0\xc7\x3f\xea\xbe\xb2\x8f\x5f"
+ "\xa6\xf8\x7d\xfc\x72\x7a\x78\x1d\x9f\xc3\x79\x19\xf3\x9f\x35\xd2"
+ "\xd6\xe4\x67\xf6\x83\xc0\x9c\xb9\x0b\xf3\xe5\xee\x05\x1b\xdc\xf7"
+ "\x16\x6d\x48\x90\x7b\xc5\xfc\xed\x95\xe0\x25\xd1\xc9\xbe\x08\xbc"
+ "\x3f\xc6\xdf\x5e\xe1\x6f\x2e\xf1\xf7\x3f\x65\x1e\xdc\x57\x9d\x26"
+ "\x39\x77\xc4\x7b\x6b\xc3\x69\xf9\x7d\x6c\xd8\x0a\x2f\x3b\x74\xdb"
+ "\xda\x04\x93\x91\xcf\xa7\xef\x52\xfd\xd1\xc1\x7d\xc1\xf5\x15\x6d"
+ "\x70\xab\x3a\x2e\xf1\x77\xd5\xc8\xa4\x6c\x88\x97\x8f\x5c\x75\xed"
+ "\x3e\x65\xaf\x63\xb0\xbd\x4a\x61\x70\x0c\xeb\xdf\xab\xd4\xbe\x43"
+ "\xcc\xb2\xcf\xfe\xa3\xbd\xce\x1d\xe6\x58\xff\x53\xe5\x3b\xb4\x23"
+ "\x53\xf7\xc9\xaa\x92\x3e\x50\x64\x62\xfd\xc9\xf3\x9c\xd3\xb4\x23"
+ "\xbf\x41\x8e\x97\x3b\xf2\x23\xf7\x38\xad\x1b\xb7\x0c\x3d\x47\x2f"
+ "\x5f\xbc\xca\xbe\x69\xf2\x80\xef\xab\x63\x18\xca\xef\xe8\xf7\x11"
+ "\x73\x3a\x86\x35\x44\xe0\x86\x77\x07\x23\x7c\x15\x7d\x3c\x1e\xf3"
+ "\xfc\xb1\x41\x7d\x57\xd5\x07\x1c\x5a\x91\x86\xf9\xc4\x4e\x19\x8f"
+ "\x70\x7d\x90\xc6\xd8\x66\xf0\x37\x7b\x76\x5c\xd4\xe6\xa1\xdd\xd6"
+ "\x4a\xc6\x67\xc7\xab\x0c\xd7\x8b\x7c\x42\xee\x07\xec\xa4\x7e\x9c"
+ "\x23\xea\xd3\x61\x2b\x9a\xec\x4c\xd7\xf1\xf2\xd2\x0e\x19\x3f\x85"
+ "\xbf\x73\x1d\xd9\xa6\xf2\xe5\x2b\x8a\x6c\x25\x1b\x8a\x56\xac\x5c"
+ "\x51\x36\x9c\xca\x97\x3c\xbf\x62\x12\x92\xac\x4f\x97\xac\xb0\x15"
+ "\xad\x90\xd1\x8a\x65\x20\xe4\xb2\x0d\x36\xde\xfb\xb8\x62\x0f\xde"
+ "\x2c\x6d\x79\xc3\xce\x69\x6a\xbc\xdf\xb9\x5b\xe7\x53\xf9\xed\x6f"
+ "\x51\x48\x03\xbe\x57\xf2\x9b\xc1\x89\x68\xe7\xc7\xcc\xc3\x2a\xbe"
+ "\xcf\xae\x0e\x65\x5f\xec\x6c\xb9\xd2\x27\x6b\xa7\x57\xf7\xc9\x02"
+ "\x7f\x9b\x59\xd6\x23\x60\x81\xff\x77\xd1\x95\x65\x76\xa5\xf5\xfb"
+ "\x77\x6a\xdf\x1d\xe7\xbe\x92\xf1\xee\x6b\x58\xdf\xee\x7c\xd0\x53"
+ "\x3e\x87\x63\xf6\x6a\x72\xb5\x6b\x76\x04\xbe\xd2\x97\x97\x61\xf1"
+ "\x39\xa9\x49\x81\x48\x5f\xb6\x5d\x9f\x60\xec\xb5\xe8\xf5\x58\x37"
+ "\x19\xa0\xef\x76\xbd\xe6\x37\xb8\x13\xa5\xff\x31\xca\x01\x96\x4b"
+ "\xf7\xa3\xf1\xf6\xb7\x6b\xd7\x81\x58\x1c\x81\xfb\x58\xa4\x1f\x1d"
+ "\xf0\x13\xdc\xe5\x60\x18\x48\xc3\xf8\x5f\x95\x15\x99\x16\xd9\x4f"
+ "\x33\xe7\xe4\xc3\x80\x5e\xbb\x0c\x9d\x34\x6b\x49\x69\x29\xeb\xa0"
+ "\x25\xcb\x4a\x9f\x5f\xb3\x6a\xad\xd6\x75\x33\x97\x73\x18\x6a\x99"
+ "\x65\xaa\xf6\xc6\xba\x72\xd9\xb2\xa5\x2a\x49\xeb\xc8\xe8\x3d\x2b"
+ "\xe5\xc7\x50\x85\xf9\xff\x8e\x92\x01\x5b\xb1\xaa\x51\x18\x76\x75"
+ "\xe2\x77\x5e\xea\x1f\xd9\xaf\x55\xa5\xd1\x73\xb4\xaa\x0a\x5d\xf6"
+ "\x65\x3f\xdb\xd9\xe7\x2c\xe7\xd1\x1e\x21\xf7\x78\xd0\xaf\xae\x3f"
+ "\xa0\x9d\x43\xbc\xe4\xe2\x33\x5f\x09\x11\x70\x0e\xf7\xd3\x7b\xeb"
+ "\xe3\x1d\x5b\x95\xcf\x84\x91\xbf\x59\xcb\x31\x25\xf0\x1e\xf3\xff"
+ "\x97\x4f\x2a\x3d\x59\xe5\xed\xdf\x7b\x31\x24\x62\xbe\x59\x05\xde"
+ "\x5f\x95\x7d\xa5\x7c\xbb\x92\xae\x94\x7b\xf6\xb5\x74\x59\x75\x1a"
+ "\x47\x7c\x83\x1e\xfc\xe7\xfa\x40\x5f\x33\x6e\xd0\xbe\x89\xc0\xf7"
+ "\x5c\x96\xe7\x15\x62\xe4\x88\x7b\xd9\xaf\xe1\x14\xb9\x76\x28\x9e"
+ "\x72\x95\x44\xf8\x06\x9a\xcf\x90\x6b\xbb\xea\x5b\x97\x43\x97\x3f"
+ "\xb4\x53\xda\x72\x0c\x43\x8d\xeb\x55\x43\x14\x7f\xb9\x0e\xe8\xb4"
+ "\xe5\x39\x3c\x9e\x0f\x0f\xd8\x41\x55\x8b\xa4\xbf\x88\x8a\xa9\xd1"
+ "\xc7\xed\x07\x9c\x1c\x1d\x0e\xf2\xa2\xfd\x49\x3e\x9d\x56\x7a\x9e"
+ "\x48\x9e\x98\xb5\xc4\x86\x09\xf6\x8a\xe5\xcb\x97\xad\x59\xab\xc7"
+ "\x19\xcf\x5c\x55\xba\x54\xc5\x15\x9f\x8a\xee\x5f\x0f\x19\x9e\xce"
+ "\xa1\xc9\x91\xaa\x6e\x63\xec\xdd\x2c\x5e\x13\x91\xfe\xa3\x72\xce"
+ "\xf5\xea\x07\xf5\xda\xfc\xeb\x14\xd5\x14\x28\xff\xab\x9a\x14\x65"
+ "\xdb\x5e\xff\x46\xaf\xb3\xba\x4c\xb7\x6d\x79\xad\xb5\x87\x6e\xad"
+ "\xe5\x33\x72\x7c\x96\x60\xff\x1e\xd1\xc9\x6b\xab\xc8\x53\xab\x7f"
+ "\x8b\x8e\xed\xa6\x9d\x7b\x54\x0c\x6d\xf7\x4a\xf6\x15\x79\xf5\xd3"
+ "\x70\x75\x4e\x87\x48\x4d\x4f\x82\x7d\x96\xcc\x32\x31\xa2\x9b\x7d"
+ "\x78\x39\xf6\x55\x75\x27\xdb\x75\xac\xcb\xf8\x7b\x0d\x9d\x54\x7d"
+ "\x18\x3a\x1a\x3a\xfd\x55\xaf\x2f\x25\xa7\x63\xdb\x46\x4a\xe2\x3a"
+ "\xa0\xaf\xbd\xcd\x8d\x4c\xdb\x1a\xfa\x18\xba\x4c\xd3\xd9\x5e\xae"
+ "\xc7\x4b\xd5\x2d\x6a\x3e\x98\xd3\xad\xad\xb3\x76\x23\x1f\xf4\xff"
+ "\x88\x5a\xc5\xab\x19\xf6\xf1\x0e\x2a\xe7\x6f\x53\xaa\xb8\x55\x33"
+ "\x6a\xd1\x0e\x07\x7f\x03\x12\xb6\x20\xe6\x3b\xd5\x65\x68\x83\x43"
+ "\xf3\x01\x07\xaf\xd4\xb4\x2a\xdf\xfe\xea\xa5\x4c\x03\xc0\x0d\x68"
+ "\x70\x03\x80\x8b\xfe\xbf\x59\x8b\x97\x5d\xb3\x43\xaf\x03\xe3\x9f"
+ "\x0f\x76\xb3\x9b\x6d\x67\xe0\xdd\x8e\xdf\x89\x2a\xb9\x97\xee\x85"
+ "\xde\x37\x09\xf6\x5d\x1b\xf8\xde\x5e\x4d\xb3\x3e\x16\x72\xdd\x1a"
+ "\xee\xec\xb3\x94\xc4\xeb\x7c\x5a\x5d\x32\x86\xa1\x0e\x13\xcf\xed"
+ "\xe1\x4b\x67\x1b\x01\x33\x09\xe3\xba\x4f\xfb\xce\xda\x89\xaa\x0b"
+ "\xec\xe7\xe8\xc5\xb8\x7d\x8b\x28\x0a\x9a\x79\x0f\x6a\x84\xfe\x1d"
+ "\xbb\x86\x0b\x4c\xaf\x57\xb2\x07\xf6\x96\x50\x1e\xf4\x87\x3c\x38"
+ "\x3a\xe9\x95\xb9\x5c\x2f\xcb\x02\xf7\xe5\x65\xf4\x0d\xfa\xc7\x2c"
+ "\x2e\x9d\x6d\xb2\xae\xa4\x11\xa7\xe9\x95\xe7\xb8\x8f\x78\x3f\x98"
+ "\xfd\x0f\x91\x66\xe2\xb8\xfb\xa7\xe8\x95\x47\xb9\x7f\x18\x17\xe1"
+ "\x4a\xf7\x06\x7b\x0b\x1f\xe0\x33\xd7\xac\x33\x37\x57\xc0\xe6\x5e"
+ "\xce\xba\x64\xf7\xa7\x3c\x87\xe7\xef\x25\xf1\xbd\x7d\xa9\x08\xcb"
+ "\xfe\xdd\xc8\xfd\xbb\xfb\xd3\xcd\x5d\x22\xfc\x85\x93\xc4\x71\x3f"
+ "\xd1\x17\x06\x0a\x06\x0c\x09\x8c\xb7\xc1\x7e\x96\xcf\x85\x37\x92"
+ "\xa7\x7c\x3b\xfb\xb2\x25\xed\xda\x48\x66\x3e\x53\xcf\xdf\x02\x6a"
+ "\xf3\xd7\x51\x9b\xad\x8e\x7e\x1f\xdc\x4d\xee\x75\x1c\x1f\xe5\xd5"
+ "\x6d\xff\x5a\xbe\x9b\xf7\xd8\xae\xc3\xfd\x1c\xeb\xf7\x64\x5d\x63"
+ "\xfe\xf5\xc4\x1f\xe9\x5f\xdd\x7f\x24\xeb\x63\xf2\x39\xab\xa5\xf0"
+ "\xf7\xd4\x92\xfb\x7b\xb2\x77\x8a\x30\xcf\xeb\x2a\x9f\xe3\x3a\xb6"
+ "\x03\x56\x23\x9f\x3f\x37\x87\x7b\x2c\xc3\xd1\x7e\x23\xef\x1f\xb4"
+ "\xf9\x7d\xe4\x5e\xf9\x2f\x8c\xe3\x2f\xeb\x2f\x50\x92\x7b\xe5\x6f"
+ "\xe5\xbd\x9a\x6f\x9d\x6d\xf4\x2c\xed\x60\x9b\x32\xc8\x67\xef\x79"
+ "\x4f\x12\x73\x8c\x70\x15\xe3\x18\x52\x78\x83\x5e\x46\xbd\x3c\x6c"
+ "\x4e\xbd\xbc\x8c\x15\xb7\x9f\xe9\x01\x9c\x5a\x17\x29\x9a\xb4\x60"
+ "\xa4\xd0\x70\xfe\xd4\x5e\x18\x49\x9f\x57\x5a\x98\x3e\x1c\xb3\x35"
+ "\x8c\xfe\x02\x6e\xb9\xa0\x41\x58\xaf\x03\x38\x27\x69\x6b\xb8\x49"
+ "\xbb\x2e\x50\xb2\x7b\x25\x7f\x0b\xee\xd5\x3b\x4d\x05\xc6\xa4\xf0"
+ "\xa5\x73\x4d\x55\x17\xc9\xc8\xfd\xc6\xfb\x36\x55\xf2\x3d\xc3\x7c"
+ "\x35\x8d\xfb\x0c\x3c\x99\x87\x5f\x3e\x7e\x05\xcc\x77\xb8\x2e\x42"
+ "\x7f\x6d\x07\x0e\x87\xd0\x57\x8d\x7c\x55\xbc\x98\xe1\xe0\xb8\x24"
+ "\xda\x1c\x6a\x20\x1d\x72\x14\x14\xf2\x7b\xcb\x90\x99\xdd\x87\xc2"
+ "\x90\x23\x5e\xc3\xa9\xaf\xa1\xe4\xb0\xd3\x15\xd8\x0f\x5d\x57\x57"
+ "\x23\xcf\x25\x9b\x79\x5d\xf3\x75\xf9\x6d\x8d\x57\x9b\x74\xdd\xf7"
+ "\xa3\x51\x7c\x76\x73\xf7\x49\x03\xaf\xfb\xb8\x72\x7c\x1a\x9f\xc3"
+ "\x0e\x7b\x15\xfa\xff\x26\x4d\x3f\xd6\xc8\xf9\x05\xcb\xfe\x60\xf3"
+ "\x09\xd8\xb2\x2d\x62\x5f\x21\xf1\xfe\x4f\xf2\x16\xe1\x4b\xee\x34"
+ "\x89\x36\x7f\x8b\x3c\xb3\xdb\xe6\x0f\xc9\xfd\x1f\xbc\x4f\x98\xef"
+ "\xf7\x99\x60\xfb\xb6\x33\xed\xf4\x74\xde\x3b\xe2\x75\xb5\xf9\x7e"
+ "\xe1\x5b\xb0\xc1\xc4\xdf\xc2\x1c\x23\xf7\x0e\xb4\xf4\x36\x0b\xe6"
+ "\x0d\x1b\x7c\x26\x34\x34\xd8\x0f\xab\xa7\x30\x91\xe5\x0d\x79\xd3"
+ "\xfa\xf3\xf6\x14\x1a\xf9\xdb\xce\x5c\x67\x44\xda\x90\x05\xe5\x28"
+ "\xcb\x7d\xa5\xa5\x29\x9b\x79\xcf\xe1\xfe\x39\x25\x9f\x5f\xe8\xc1"
+ "\xb8\xb9\xb6\x30\x21\xdc\x53\x68\x08\x01\x36\x78\xdf\x2c\xbf\xc9"
+ "\x19\xf4\x69\xdf\xb8\xea\x82\xfc\x76\x90\xa8\xfe\x95\x17\xf9\x8c"
+ "\x0c\x97\x63\x41\xf0\xb7\x41\x44\xca\x7b\x25\xf1\x7d\xee\xea\x6a"
+ "\xdd\x95\x8f\x81\x9f\xf6\x1e\x65\x79\x0e\x99\x27\x07\xad\xcf\xb0"
+ "\x0d\xb3\x57\xfa\x06\x84\x20\x63\xa1\x94\xc9\xc1\x49\x5d\x94\x50"
+ "\x09\xbe\x55\x6b\x50\x7b\x1f\xf1\x40\x06\xed\x61\x01\x3b\x74\x6f"
+ "\x1e\xf3\x8d\xa9\x9b\x7d\xe5\xee\x26\xe9\x9f\x96\x5a\xeb\xf2\x04"
+ "\xba\xa8\xc5\xf1\x67\x6a\x09\x7a\x1c\x47\x2f\xf8\x8c\xca\x4f\xcd"
+ "\xc8\x70\x57\xf0\x3b\x3b\x78\xb5\x28\xd4\x48\x83\xed\x0d\xf0\xfc"
+ "\x18\x63\xd8\x5f\xd4\x5c\x71\xef\x51\x7d\x5e\x7c\xf5\x36\xd4\xa6"
+ "\x71\xfc\x0c\x21\x2c\x14\xae\x59\xe7\x02\x2e\x76\xd1\x9b\x49\x93"
+ "\x36\xf2\x9a\xdc\xde\x6e\xcc\x51\x72\x35\xb8\xe7\x15\x5c\xe4\xbf"
+ "\x0a\x5c\xe6\x99\x96\x5a\xd2\xda\xb4\xce\x11\x02\xec\x50\xea\x3a"
+ "\xf6\x37\xb0\xdb\xbf\xe0\x35\xdb\xd7\x1e\x45\x3d\x8e\xb6\x60\x3b"
+ "\x71\x1c\x9e\xfa\x30\xc6\xc7\xf3\x16\xd2\x7c\xf2\xec\xe7\xa8\x76"
+ "\x4e\x58\x64\x9a\x31\x5f\xe7\xfd\x18\x3b\xeb\x38\x5e\x0b\xa8\x0c"
+ "\xd1\x50\x0f\x46\x46\x8e\x1d\x01\x18\xf3\x3e\xe1\xbd\x2f\xe8\x89"
+ "\x90\xb0\x18\x3e\xb8\x84\x91\x1e\xba\x53\xc6\x92\xd8\xfa\xf5\xd7"
+ "\x47\x6e\xa1\x7b\x85\xc1\x24\x7d\x3a\xc3\xd5\x7b\x6a\xd1\xb7\x5d"
+ "\xca\x07\x70\x32\x45\xf8\xff\x25\xa2\x2e\xe9\xff\x27\xcc\x39\xcd"
+ "\x75\x72\xdd\x71\x32\xc6\x8b\x5a\xbf\x97\xf6\xca\xf5\xd7\x1d\x7c"
+ "\xc6\x43\xea\xd8\xd7\x96\xf8\x52\xd6\x30\x3e\x1c\x1f\x3a\x21\xbc"
+ "\x2e\xd4\x54\xf5\x77\x69\x5f\xf3\xbb\x99\x6d\xdd\xbd\x6e\xe1\x5a"
+ "\x53\xcc\xe7\x18\x35\xd8\xa6\x73\xf4\x5a\x8a\xa8\x5e\x53\xec\xa5"
+ "\xd7\x8a\x55\xdf\xc8\xfb\x2c\x7e\x1f\xec\xcb\x84\x5d\x5d\x7b\xb0"
+ "\xee\x32\xef\x05\xd4\x2e\x12\xce\x5b\xdc\x3d\xe6\x35\xc5\x0b\x2d"
+ "\x6c\x53\xbd\x56\xe6\x35\xfc\xa1\x50\x5b\x07\x94\x71\x31\x06\x9b"
+ "\x23\x89\x7d\x96\xe1\x1e\x00\xc1\x7c\x36\xed\x0c\xed\xfb\xfc\xb2"
+ "\x93\x0c\x7d\xb0\x05\x2f\x1b\xc8\x0c\xf9\x4a\xde\x35\x9a\xb2\xf1"
+ "\x6e\xf4\x19\x7a\xed\x77\x41\x03\xa5\xe1\x67\xf6\x7d\xbd\xe4\x3a"
+ "\xc0\xcd\xe5\x35\xd2\xd6\x0b\xbc\xc6\xf5\xba\x3c\xa7\x5c\xf5\x3a"
+ "\xa5\x87\x01\x8f\xf7\x7b\xaa\x46\x53\x3a\xaf\x53\x22\x2d\xb3\x28"
+ "\xa4\xf6\x3d\xf5\xb5\x88\xad\xa3\x29\x2b\xba\xde\xd7\x9a\xd4\x3a"
+ "\xe6\xbe\x4e\x39\xb7\xf2\xd1\x37\x30\xb7\x3a\x05\xb8\x07\x84\x33"
+ "\x51\x88\xaf\x5b\x0c\xca\x37\xe1\xf5\x9d\xa6\x5a\xc5\x77\x72\x9f"
+ "\x0f\xfc\xc6\xfb\xa8\xda\x9e\x52\x82\x8c\x07\x92\x3a\x75\x07\x7f"
+ "\x87\x3a\x62\x9d\xd8\x2c\xf1\xd0\xce\xf0\x87\xb6\xde\xc1\xb1\xc1"
+ "\xe4\xd9\xfd\xa2\x25\x6a\x3f\x8a\xcf\xf7\x7b\xe9\x75\x19\x8f\x71"
+ "\xc7\xeb\x94\xfc\xf2\xeb\x64\x6e\x5d\x2e\xdb\x75\x54\xc9\xa2\x91"
+ "\x18\xdf\xb0\x8b\xe5\x0c\x3c\x01\xbc\xb9\x3e\xe6\x8d\xb6\xe0\x79"
+ "\xb7\xbd\x4c\x84\xdd\xcf\xb0\x2d\xfa\x7a\xc8\xbd\xe6\x10\x2d\xe8"
+ "\x0c\xaa\xb3\xa8\x8b\xc9\xd7\x00\x78\x0d\xa3\xc9\x7c\x9a\xf6\x5d"
+ "\xe7\x29\x25\xde\xaf\xb8\xd5\xbd\xe6\x30\x60\xef\xbb\x99\xc7\x82"
+ "\x9d\xa0\x8f\x1a\x13\xf6\xb5\x7b\x02\x1d\xd4\x0a\xf9\x9e\x6f\x13"
+ "\x12\x0e\xf2\x3c\x22\xdb\xbb\xcf\x62\x2d\x52\x31\x18\x64\x5b\xfb"
+ "\xf7\xf9\xb4\x76\x78\x2e\x48\x78\x25\x1e\x70\x89\xde\x26\x9d\xd6"
+ "\x8a\xbf\xf6\xbd\xe9\x5e\x73\x80\xb8\x7f\x38\x3f\x9e\x77\x7b\xba"
+ "\x91\xf7\x6c\x74\xbf\x70\x1e\xbc\xfb\x04\x70\xbf\x3d\xb0\x57\xcd"
+ "\x7b\xa8\x03\x79\xea\x5e\xe7\xf3\x68\xaf\x27\xed\x03\x8d\xd4\xda"
+ "\xfe\xbe\x3b\x19\x57\xf4\x5d\xb6\xa7\xec\xcf\xf1\x7d\x52\x21\xfb"
+ "\xe0\xfb\x2d\x6d\x72\xcf\xae\x6e\xec\xfc\x60\x58\x28\x7d\x56\x77"
+ "\x22\x0c\x3d\xe0\xc5\x95\x75\x81\xd4\x27\x13\xd9\x0f\xa8\xee\x4f"
+ "\xa6\x04\xd5\xbf\xdc\x16\xb6\x57\xe2\xf5\x71\xc4\x7e\xa2\x99\x71"
+ "\xd5\xfb\x98\xbf\xe1\x18\xe6\x3d\x61\xf6\xb7\xef\xb3\x90\xe2\x3f"
+ "\xe1\x02\xdc\x4f\x94\x1c\x4d\xce\xd5\xe2\x1a\xe4\xf6\xa4\xdc\x9d"
+ "\xc4\xe7\x23\x75\xdf\x60\x91\x72\xb7\xb1\x48\xf9\x73\x5b\x58\x47"
+ "\x35\x18\x84\xc6\x9b\x75\x27\xb4\xb2\xd3\x94\x4f\x46\xdd\x6e\x94"
+ "\x9f\x16\xb7\xbd\x89\xd0\x3b\x4e\xa8\x69\xb4\x87\xed\x48\x01\x5d"
+ "\x85\xf1\x60\xa8\xc7\x7f\x59\xfb\x7e\xe6\xfe\x87\x60\x53\x0f\xe5"
+ "\xf3\x51\x3a\x6e\xd7\xb6\xf7\xb7\x7f\x8c\x9a\xdb\xec\x5f\xac\xaf"
+ "\x2d\x09\x33\x68\xec\x34\x09\x3e\x2b\xc9\xe7\x5d\xfc\x29\x75\x8d"
+ "\xbe\x94\xb7\xda\x95\xdc\xec\xdf\x06\x3b\x55\xea\xdb\xa2\x00\x39"
+ "\xb8\x5d\xbc\xb7\x8b\x79\xd3\x50\x6e\x33\xe0\x60\xfe\x63\x9b\xa6"
+ "\xc6\x73\x05\x7b\xd0\xb5\x1d\xbd\x6d\x68\x93\x6c\x1b\xda\x28\xdb"
+ "\xa6\x7d\x5f\xea\x34\xd5\x8f\x95\xeb\xe5\xd7\xd6\x1e\x15\x5f\xc6"
+ "\x55\xd7\xc8\xdf\xce\x3d\x4d\x0d\xef\xcb\x33\x30\xe8\x13\xb5\x0f"
+ "\x52\x5f\x26\x86\xbf\x3c\xfc\xda\x60\xd6\xe7\x2a\x98\x6f\xb5\xbf"
+ "\xca\xb1\x28\xb5\x6f\xd4\x01\xf6\x8f\x45\xf5\x5b\xf2\x1c\x40\x0f"
+ "\xea\xe3\x6f\x7c\x0e\xe8\xa1\x86\x74\xee\xab\x89\x87\x28\x57\xf1"
+ "\x61\xc3\xd7\x78\xad\x59\xcd\xf3\xea\x8f\x43\xf7\xee\x50\x73\x2a"
+ "\xdd\x8f\x3c\x41\xfa\x91\x47\xea\xd8\x6b\xc4\x51\xea\x3b\x91\xba"
+ "\x27\x17\xf7\x47\xe4\x59\x49\xe0\xbb\x3e\xa8\xeb\xbf\xfa\x23\xec"
+ "\x93\xd4\xef\x0f\xb0\x01\xbc\x52\xa9\xce\x91\xf7\x3a\x1b\x0a\x75"
+ "\x1b\x45\x7e\x93\xcc\x29\x8e\x73\xbe\x05\x1b\xce\x4b\x7f\x81\x2a"
+ "\x19\xf3\xe0\x8c\x76\xce\xae\xe1\x39\x6d\x5d\x23\x93\x7d\xf8\x51"
+ "\x76\xb7\x97\x3e\x96\x67\x02\x99\x06\x5c\xb7\xc4\x5d\x7e\x17\xac"
+ "\xa1\x69\x60\xdf\xa7\x5e\x7e\x37\x5d\xf9\xb5\x36\x1c\xd7\x79\x04"
+ "\xed\x1d\xaa\x62\x83\xd6\xdf\x79\x2c\x8b\x24\x0f\xf4\x08\xcb\xf0"
+ "\xdb\xea\x98\x27\x1b\x7c\x91\x74\x5a\x10\x0c\xdb\x95\x0e\xaa\xef"
+ "\x10\x52\xd6\xeb\x3b\xbe\xdc\x9e\x68\x9c\xa3\xdb\x22\x8a\xce\x66"
+ "\xe8\x97\x37\xcc\x92\xd6\xae\x0c\x2b\xc7\x68\xd9\x54\xc9\x31\xa7"
+ "\x7e\x3c\x84\x63\x7b\x05\x5d\x19\xb9\x21\x3e\x93\x89\x71\x36\xec"
+ "\xca\x28\x38\x6d\x23\x43\x91\x8d\xf7\xba\xd6\x64\xf3\xfc\x4a\xd8"
+ "\x61\x0b\xa4\xc2\x3e\x81\x9c\x6f\x5e\x41\xa6\x27\x4a\x00\xdb\x9e"
+ "\x99\xc6\xb1\xb7\x38\xee\x16\xc7\xce\x0b\xd9\x33\x53\x71\x3f\x0a"
+ "\xf6\x9c\x59\x98\x33\xb2\xd9\x5f\x26\xe4\x14\xd0\xc7\x27\x39\xfe"
+ "\x97\xc1\xe3\x0b\xd0\xe6\xb3\x94\xc4\xb1\xbd\x82\xd5\x6b\xf2\xda"
+ "\xfc\x9f\xca\xb9\xc5\x48\x1b\xec\xe9\xb0\x3c\x97\x63\x09\xa7\xac"
+ "\xc9\xc6\x18\x9f\xa3\xda\x7d\x5e\xa8\x76\x2b\xbc\x19\x7f\xa5\xe3"
+ "\xc6\x17\x54\x4a\xdc\xff\xe9\x67\x41\xc0\x0f\xbb\xb2\xf2\x43\xae"
+ "\xac\x3c\x75\x96\xb3\x85\x2a\xcb\x44\x97\x07\xb6\x31\xfb\x6f\xf2"
+ "\x79\x5d\xf6\xc7\xe1\x36\x72\xfb\xb8\xee\x7f\xbd\x70\x56\xc6\x2a"
+ "\x0b\xe2\xd9\x5e\xaa\x95\xe9\x46\x99\xee\x16\xba\xec\xca\x92\x6d"
+ "\x6f\xf3\xab\xb2\x45\xf2\x9e\xcb\x47\xd0\x41\x6b\x73\x3f\x1d\xd0"
+ "\x76\x6e\x1f\xb7\x3f\xc8\x34\x01\x0d\xb4\xb6\x5a\xfa\xb4\x76\x72"
+ "\x1b\x7f\x8f\x51\xe7\x75\xb4\x13\x6d\x95\xed\xec\x43\x3b\x8f\x97"
+ "\x10\x05\x6a\xea\x9a\xbe\x48\xcd\xca\xe3\xf9\xa1\xfd\x0f\xb0\xa3"
+ "\x2b\x5c\x84\x79\xa0\xf1\x97\x95\x2e\xc3\x8f\x60\x9b\x54\xfa\x30"
+ "\x1f\xf4\x89\x2e\xb6\xf7\x3d\x36\xfc\x82\x75\xf2\xbb\xc3\xd2\x3e"
+ "\xe6\x6f\xc4\xae\x46\x9b\xc2\x9f\x53\x65\x97\xe8\x82\x6d\x1a\xf0"
+ "\x04\x91\xa7\x04\xed\xc7\xfc\xf1\xb4\x86\x3f\xe7\xdd\xfc\x77\xd5"
+ "\x2e\x53\x29\xa5\x7d\xf4\xd8\x76\x83\xa7\x63\x3b\xe9\x6d\x79\x12"
+ "\xf9\xd0\x1e\x0b\x60\x8d\x90\xdf\x65\x40\x3b\xf7\x01\xcf\x40\x44"
+ "\x9b\x5a\xbb\x03\x80\xf9\x27\x1a\x5e\x40\x09\xaf\x9f\x43\x3b\xce"
+ "\x91\xc5\x55\x09\xfb\xeb\x61\xb6\x17\x7f\xfc\xd9\xf5\x85\x94\xee"
+ "\xa5\xc6\x2e\xc5\x77\x32\x6e\xd0\x8d\x67\xe8\x8d\xeb\xfa\x63\x03"
+ "\x71\xbc\xb5\x94\x35\xf9\xcc\x47\x32\x46\x10\x8f\x19\xbd\xe0\x19"
+ "\xf6\xa5\x59\x8f\x3a\x7a\x33\x47\x49\x7c\x9c\x39\x84\xe7\x64\x3c"
+ "\xf3\x37\xa3\xd2\x78\x4d\x00\xe5\xf2\x04\x68\xc6\xf0\x61\xcf\xe5"
+ "\xf0\x95\x69\x18\xf7\xac\xc9\x5b\x34\x45\xa4\x4e\x96\xbe\x0c\x4d"
+ "\x95\x3e\xc3\x0b\x6f\x51\xd6\xb5\xe9\x94\x37\xa6\x0c\xa6\xbf\x79"
+ "\xdf\x82\xe1\xa1\x6d\xa9\x67\xe8\xc0\xcd\xd1\x32\x66\x95\xba\x4c"
+ "\xe9\xc1\x37\x3a\x79\xaf\xe0\x1a\xeb\x95\xfa\x8f\x7d\x9e\xae\xb1"
+ "\x5c\x97\x8e\x07\xee\x0f\x0c\x86\xfb\xb5\xd3\xe1\x40\xee\x60\xb0"
+ "\x76\xee\x91\xf1\xe2\xec\xbb\xf6\xb0\x3f\x62\x5d\xed\x31\x4b\x50"
+ "\xda\x75\xcd\x07\xfc\xb4\x76\x3f\x25\xd9\xcf\xf2\x9a\xcc\x3c\x3a"
+ "\x56\x97\x4d\xf5\x98\x93\x8b\x9e\xcc\xd4\x57\x2e\xb0\xef\x83\xd2"
+ "\x21\x6c\x93\xf2\x59\x4a\xb1\x36\xd3\x5c\xb5\x47\xb7\xe1\xdf\xbc"
+ "\xae\xe2\x22\x19\xd4\x37\x52\xde\x4c\x9a\x6d\x15\xc1\xdd\x86\x70"
+ "\x49\x1d\xc7\xbc\x4a\xdd\xe3\xe5\x98\x57\x7a\x1c\x29\x69\xfb\x94"
+ "\x43\xe6\x7a\x2c\xc3\x77\xae\xa1\x2c\x8e\x7d\x67\xf2\x29\x5b\x4e"
+ "\x8d\xd7\x6f\x4e\x01\x7e\x66\x6d\xbf\xdf\xac\x62\x4b\xbd\xe1\x68"
+ "\xb8\x80\xba\xd4\xfb\x15\x21\xcc\x61\x24\xdc\x35\x94\x5e\x77\x81"
+ "\x32\xd9\x0e\x2a\xfa\x5c\xd9\x6c\x3c\x2f\x9c\xd7\x6d\x12\xa1\xff"
+ "\x93\x49\xfb\xcf\x0c\xc4\xc6\xf3\xad\xe5\x78\x7a\xc2\x32\xd8\x5e"
+ "\x49\xd5\x28\xe9\xf3\x23\xe3\xb1\xa8\x6f\xe8\x11\xed\xae\x21\x23"
+ "\x7f\x33\x96\xd7\xf2\x78\x6d\x98\xcf\xfd\xa8\x31\xe4\xcd\x0e\x3d"
+ "\x66\xd8\xa0\xfb\x88\x2e\x35\xdf\x09\x0f\xc5\xfc\xcb\xd7\xeb\x76"
+ "\xaf\xe3\x31\xe3\x27\x56\x3e\x6b\x34\x30\xc7\xf9\x49\x02\xbf\xe3"
+ "\x34\xf6\x85\xcf\x95\xb4\xfc\x49\x1e\xcf\x7b\xb4\x39\xe3\x47\xd6"
+ "\xfe\x34\x65\xc3\xf0\x58\xc6\x38\x34\xa8\x75\xe4\x91\xbd\xce\x9f"
+ "\x2c\xd5\xc7\x33\x1e\xd7\xd5\xf7\x6a\x7f\x52\xee\x35\xfc\x2f\xd7"
+ "\x55\xf0\x33\x6b\xdf\x7b\xe6\xd8\x08\xb9\xc8\x7f\x50\x1f\xdf\xe4"
+ "\xf7\x48\xb6\x8e\xbe\x6f\xed\x06\x1a\xb3\xf0\x6b\x49\x32\xf6\x06"
+ "\x7f\x77\x54\x8d\xbb\x3f\x69\x1f\xd8\x4f\xcb\x95\xf4\x96\xdf\x1a"
+ "\xe4\x39\x86\x41\xb0\xaf\x85\x4f\xf3\x83\x39\x3e\x70\xce\xfd\x27"
+ "\x67\x07\xea\xf9\xa9\xb9\x7f\x1c\x45\x1d\xec\xd7\xc1\xf0\x95\x6d"
+ "\xf2\x93\x66\xae\x83\xe7\x56\x6a\x7c\xfd\x49\xf3\x55\x6c\xb1\x4c"
+ "\xa6\x6f\x58\x9b\x4f\x7a\xba\xff\xaa\xe8\x5b\x4e\x89\x93\x76\x93"
+ "\xe5\xa3\x4a\xaf\x71\xa4\x8a\xe3\x64\x3a\x45\x3f\x5d\xc2\xef\x99"
+ "\xd7\xdd\x13\x79\x2d\xee\xa7\x1f\x78\x78\xdc\xee\x2b\x4c\x9e\xcf"
+ "\x73\x7d\x69\x8b\xff\xf4\xd0\x04\x94\x43\x5a\xea\x87\xe7\x02\xc6"
+ "\xaa\x8d\x94\xc5\xdf\xf4\x44\xba\x5c\x27\xf0\xdd\xf4\x6c\xef\x6d"
+ "\x69\x64\xb9\x6d\x37\x9f\x07\xf8\xe9\x09\xcc\x2f\xa5\x1f\xae\xac"
+ "\xbf\xe6\x5d\x19\xfb\xef\xed\xcb\xde\x21\xaa\xaf\x0e\xae\xc6\x73"
+ "\x66\xc4\xf3\x08\x7d\x2d\xdf\x4b\x07\x6d\x72\xef\x92\x7d\x9e\x57"
+ "\xf2\x78\xbd\xd7\x31\xe0\x27\x74\x70\xb5\xc2\xe5\xe0\xea\x63\x36"
+ "\xe2\xb5\xea\x13\xf5\x32\x8e\xd7\xc1\xd9\x5e\xfa\xc9\x36\x6d\x3d"
+ "\xa6\x5d\xf2\x15\xdb\xbb\x2f\xf2\x1c\xec\xaf\xee\x9d\xc8\xc7\xe3"
+ "\x44\x51\x39\xe5\x2a\x1b\x7e\x6f\x6d\x18\xfc\x13\xd1\xfe\x4f\x79"
+ "\xad\x2f\xae\x4e\x7c\x9d\x48\x96\xa9\xde\xd3\x2e\x7d\xce\xaa\xdf"
+ "\x2b\xc6\x35\x49\x54\xd7\x3a\x70\x4d\x06\xcf\xb9\x70\xe5\x31\x7c"
+ "\x3b\xae\x69\xa2\xfa\x5d\xb9\x96\x81\x39\xac\x05\xf3\x84\xa4\x9e"
+ "\x94\x3d\xc7\x07\x3b\xab\xc8\xb4\xf1\x6c\xfb\x1e\x29\x1f\xda\x9f"
+ "\x2d\x6a\xf5\xc1\x3e\xdb\x4f\xb4\x36\x28\x2e\x5b\xbf\xc1\x67\x82"
+ "\x7e\xb6\xc8\xbe\x9f\x7d\x57\x7e\x96\x19\xed\xbb\xf2\xb3\x3c\xfc"
+ "\xb6\xe3\x77\x92\xe8\xe7\xc9\xb8\x2e\x1a\xf8\xfd\x3c\xaf\xd7\xf9"
+ "\xb3\x45\xa0\xa3\xb4\xb1\xae\x4d\x27\x72\x79\xf4\x03\xcf\x8b\x52"
+ "\xd6\xd9\x54\x7b\xdf\x6a\xc2\x73\x92\x48\xf9\x95\x4f\x6b\x6f\x23"
+ "\x9e\xcd\x56\x3b\xc6\xb5\x14\xd0\x64\x34\xda\x9c\xf2\x5e\x31\xb7"
+ "\x97\xf1\xed\x49\xa9\x75\x44\x9e\xd3\x64\x98\xdc\x7e\x5f\x0a\xca"
+ "\x81\x96\x62\xe2\x83\xd9\x3a\x3d\x35\x3a\xf1\x7c\xca\xd0\x03\x18"
+ "\xca\x0e\x42\x7e\xc0\xd0\xf3\xf7\xd3\x7e\x34\x7f\x5f\x03\x7d\x8a"
+ "\x7c\x98\x13\x27\xe9\x67\x40\x7b\x9d\x3f\xcf\xfd\xb8\x94\xb4\xef"
+ "\x3b\xff\x6c\x91\x3f\xa2\x2c\xc7\xbc\x88\x57\x1e\x75\x26\xa9\x3a"
+ "\x6b\x1d\xa7\xe9\x67\x8f\xa8\x7a\x7f\x9e\x33\x98\x2c\x55\x8e\x85"
+ "\x7d\x57\xe7\xe5\xb8\x18\x6c\x0f\x4d\xf3\x8c\xf1\x93\xa7\x2e\x8c"
+ "\x31\x7f\x6f\x53\x6e\xa5\x70\x9f\xa6\x9f\x5f\x6c\x0b\x74\x5d\xe3"
+ "\x78\xf8\x73\xe9\x93\x25\x2e\x3b\xc8\x53\x71\x97\xfc\x96\xf5\x39"
+ "\x3a\x94\xe1\xf1\xc9\x98\xf0\x7c\x2f\x63\x8b\xb2\x9f\x06\x8f\x0d"
+ "\x98\x63\xf7\xc7\x54\x0c\x23\x6f\x3d\xa7\x23\xcd\xe3\xf7\xc9\xd8"
+ "\x8b\x03\x7e\xe4\x7b\xb6\x2b\x99\xfa\xc5\xa7\x32\xfe\x02\xe3\x1b"
+ "\x7c\xc0\xcd\x38\x87\x5d\x7b\xb6\x73\x1b\xec\x98\xff\x79\x82\xbd"
+ "\x6e\x96\x09\xeb\x3a\x5e\x2b\xfc\xc5\xfb\xe0\x3b\x11\xae\xde\x73"
+ "\x8d\x63\xf3\x2f\xe4\x79\x20\x7b\x50\x9c\xf3\xa5\xec\xd9\xce\x36"
+ "\x49\x55\xe5\x90\xa4\x59\x75\xc2\xdd\x93\xba\xb7\xa9\xd7\xf9\x8b"
+ "\x93\x1f\x97\xab\xbe\xb9\x46\xb8\x27\xf5\xb6\xd7\x6b\x6d\x47\x9a"
+ "\xdc\x9b\x9b\x54\xab\x62\x4d\x7a\xe9\x50\xda\xa0\x6b\x56\xe8\x67"
+ "\xb6\x07\xd8\xc7\x55\xd1\xe2\xd0\xd2\xfe\xb1\xe1\x9a\xf0\x38\xb4"
+ "\xf4\x2b\xd4\xd1\xa7\xd5\x71\xfc\xbf\x58\xc7\xf1\xab\xd5\x01\xdd"
+ "\x70\xf3\x19\xfa\xe5\xa2\x6b\x9f\x3b\xfe\xd2\x2a\x79\xc5\xb5\xb7"
+ "\x51\xe9\xcc\xb7\x3e\x09\x61\xfe\x16\x34\xbf\xd5\x24\xbf\x3b\x65"
+ "\x20\x07\xc7\xdd\x0c\xba\xd6\xd9\x5a\xcb\x2f\x93\x7b\xdd\x1f\xa9"
+ "\x93\x7e\x29\x63\xdd\xb5\x96\xf1\x9c\xed\x57\xbe\xbe\x9a\x5a\xea"
+ "\x33\x1c\x3a\xc0\xf4\xde\x8f\x7e\xd8\x17\xc1\x67\x6d\xfe\x3f\x92"
+ "\xa7\x98\xd7\x57\xdb\x79\x5d\xdb\x27\x52\xde\x6a\x0a\x43\x37\xc0"
+ "\x46\x0f\x49\x7a\xc0\x7e\x51\xf3\xad\xba\x5a\x39\xdf\xf2\xc9\xf3"
+ "\x89\x23\x64\x3c\x4d\xe7\x2a\x3f\xaf\x7d\x87\xfa\x0a\x39\x86\x48"
+ "\x01\xc7\xd9\xe4\x75\x67\x61\xce\x39\xb9\x20\x98\x28\xe4\x7c\x0a"
+ "\xb6\x3f\xc7\xd9\xf4\xf8\xbd\x14\x82\x1d\x5d\x77\x89\xd2\xea\x60"
+ "\x7b\x42\x67\x9b\x59\xaf\x37\x68\xb1\x36\x77\x5e\x1a\x88\xb5\x59"
+ "\xcf\x6b\x3d\x1d\xb8\xbf\x44\xc6\x50\x75\x5d\xed\xbe\x4b\x94\xbe"
+ "\x7f\x1d\x65\xee\xe3\xb5\xbc\xbf\x29\xdb\x87\xed\x0a\x19\x77\x73"
+ "\x55\x26\xaf\xe7\x0f\xd8\x3e\xeb\x39\x2e\x70\xbf\xde\x32\xca\x35"
+ "\x90\x6b\xa2\xf7\x5b\x72\x1c\x0c\xba\xf6\xb4\x07\xcd\xef\x15\x83"
+ "\x76\x0e\xf4\x41\x33\xe8\x97\x1b\xaf\x6f\x75\x3f\xac\xdd\x11\xb1"
+ "\x52\x3f\x4e\x57\xfa\xdd\x4b\x6f\x27\x0d\xc6\x13\xa1\x7d\x85\x34"
+ "\xa9\x9b\xb2\x95\x4f\xc3\x75\x18\x13\xdf\x2e\xe5\xfd\xf3\xca\xe7"
+ "\xc8\x12\xda\xb7\x38\xc1\xfe\x63\x4a\xe4\xef\x9c\xf3\xaf\xf2\xef"
+ "\xa2\x6b\x52\x29\x65\xf3\xfe\x03\xfb\x3d\x58\x37\xc9\xfc\xd3\xd3"
+ "\x2b\x28\x6a\x6e\x91\xa7\x1c\xa3\xa6\x5a\xe7\xae\x7c\x7a\xd5\x73"
+ "\xb6\x25\x65\x2b\x9e\x5a\x51\xba\xa2\x6c\x83\x0c\xa1\x90\x25\xff"
+ "\xdd\x9f\xb1\x74\x91\xdc\x74\x8e\xb0\x2f\xd2\x07\xd6\xe3\xde\xbe"
+ "\x18\xe4\xf5\x83\x6b\xa2\xd7\xdb\x52\xff\xd5\xc1\x96\xaa\x93\xbe"
+ "\x3b\x4d\x49\x5e\xc3\x1f\xe5\xf7\xcd\x77\x20\x6d\x87\xe6\x63\x73"
+ "\x5a\xcb\x17\x76\xbd\x9b\x0b\x3e\x9e\x76\x8a\x7e\x15\xe4\xfd\x10"
+ "\xf4\x95\xcb\x53\x71\x86\xe7\x92\xd3\x78\x8d\xbf\x95\xd7\x32\xd6"
+ "\x70\xfe\xa6\xcd\xec\xc3\xc0\xfe\x50\xe0\xc3\x03\xa7\xb4\x67\xed"
+ "\x9b\xe9\xfb\x82\xab\x2c\x07\x82\xe7\x2d\x3f\x11\xa2\xf0\x75\xb1"
+ "\xaa\x64\x9f\x38\x5f\xf2\x7a\x44\xfc\xb7\xa1\x28\x5f\x0d\x39\xf9"
+ "\x36\x7e\x37\x09\x57\x86\x0d\xf2\x37\xe6\x0c\x35\xbd\xc9\x38\xcc"
+ "\x2b\x11\xe7\x07\x62\x21\x34\xbd\x8f\xe7\x3e\xfc\xc2\xc2\x35\xce"
+ "\x15\xb1\xbf\xc6\xef\x3e\xe5\xfc\xb6\xe5\xec\x13\xd6\x74\x96\xf1"
+ "\x12\x35\xe3\xaa\x7c\xf6\x92\x44\xe4\x0f\x29\x3c\xdf\xb9\xce\xb3"
+ "\xad\x8d\xac\x4f\xc9\xfb\x24\xf7\x33\x6c\xcf\xbd\xf3\x63\x61\xb0"
+ "\x0b\xde\x83\xf3\x74\x05\x49\x9d\x57\x7b\xbb\x9c\x7d\x10\xea\x61"
+ "\x6f\xd7\xa5\x92\xd9\x95\x4a\xc9\xbd\xce\x77\x72\xfa\xfd\x2f\xcc"
+ "\x6a\xbc\xe5\x31\x8f\x63\x67\x43\x1f\xf5\xf2\xf8\xc9\x78\x30\x0f"
+ "\x03\x66\x31\xef\xcf\xa9\xf3\x51\xef\x94\xc2\xb6\xb4\x5c\xbb\x3e"
+ "\x7e\x47\x7e\x4f\x65\xd2\x0e\x2a\xe6\x35\x6d\xde\x77\xe6\xd8\xd2"
+ "\x90\x57\x6d\xfd\xf0\x57\x7f\x92\xfb\xea\xd0\x29\xbc\x5f\xd2\x50"
+ "\x09\x3b\xc1\x9c\x73\x82\xed\x9b\xa0\x93\x1c\xbc\xb7\x19\xbe\x74"
+ "\xb6\x89\xf7\xa3\xe5\xd9\x42\x19\x93\xfd\xf7\xd4\x70\x91\x8c\x9d"
+ "\xf4\x0e\x7f\xab\xdb\x3c\x40\xd7\x5f\xdd\xc3\x30\x44\x4d\x7a\x92"
+ "\xa9\xc2\xb0\x9d\x61\x84\x2f\x9d\x9b\xa2\x97\x03\xed\x86\x71\x39"
+ "\xf0\xc1\xcd\xb2\x1c\xe7\x95\x31\x51\xcc\x8b\x85\x79\x4f\xbb\xac"
+ "\x53\x3d\x17\x08\xc8\x61\xf0\x52\xa8\x09\xf7\x8b\x98\x4e\xb8\x16"
+ "\xca\xb5\x5f\xcc\xd7\x65\x2c\x1e\xf3\x9a\x62\x8f\xf7\xaf\x6e\x89"
+ "\x0f\xfb\xe2\x96\x41\x67\x49\x7b\xf0\x57\xab\xeb\x3f\x27\xa3\xed"
+ "\x19\xee\xbf\x77\xe5\xba\x3f\xf8\xe9\xa0\xc2\xef\xdd\x21\x3d\x35"
+ "\x59\x79\x3d\xe6\xbd\x2e\xbf\x21\x89\x8e\x59\xf8\xec\xc0\xbb\xb9"
+ "\xc7\x2c\x97\x31\xa7\xf8\x55\x8b\xd7\x78\x5b\xb9\xb2\x45\x54\x39"
+ "\xde\x27\x86\x9d\xda\x95\x68\x31\xdb\xf1\xbe\x5b\xf7\xbb\x80\x4d"
+ "\xda\xb5\x13\xef\x40\xdb\x66\xa6\x9b\x97\x9a\x72\xdb\x4a\xd5\xd9"
+ "\x0c\x3c\x0f\xe5\xf3\xf6\x92\xd6\x5b\x9f\xed\x32\x6d\x71\xf3\xf9"
+ "\xcf\x29\xa6\x60\xae\x81\xf7\x81\xf9\xdc\x3f\xc7\x42\xe0\xb3\xff"
+ "\xbc\x96\xa7\xbd\xcf\x8e\x79\x9f\xa5\xbf\xef\x75\xbe\xbb\x54\x3f"
+ "\xb3\xcf\x31\x95\xd8\xc7\x20\xa4\xf9\x0a\xca\x58\x43\x17\xd4\x3e"
+ "\x2a\xfb\x0a\xf2\x3a\x22\x9f\x79\xe4\xbd\x4e\x94\xab\xeb\xf7\xdd"
+ "\x94\x67\x7d\xde\x3d\xa4\xfb\x46\xe1\xfe\x48\xbf\x5f\x0f\x68\xd1"
+ "\xe3\xda\xbb\xdd\x6f\x7e\x37\xd7\xef\xda\x73\x1c\xef\x4e\x40\x1f"
+ "\x0e\x1a\x8b\x48\xce\xfd\x38\x26\xf3\xf3\x64\x08\xa7\x4e\x26\x8e"
+ "\xd1\x71\xcc\x4f\xda\x39\xe7\xc3\x93\xb5\x33\xf1\x89\xe7\xe8\xdd"
+ "\xbf\x0f\xec\x39\x86\xb4\xf5\xb2\xc3\x8b\x95\xbd\x76\x78\xb1\x5c"
+ "\x2f\xab\xd9\x6b\x7b\x63\x63\xc0\xd0\xb4\xd1\x6b\x50\x67\x1f\x0e"
+ "\x17\x78\xe9\xe8\x36\xdd\x6f\x05\xf9\xcc\x83\xc5\x5e\x13\xae\xa9"
+ "\x27\x14\xcc\xf7\xe4\x7a\xe2\xc0\xfc\xe7\x3d\xe9\x1b\xc4\xfb\x83"
+ "\x61\x1e\x2b\x53\xd7\x39\xa4\x0f\x86\xed\x02\xaf\xbb\x0c\x55\x73"
+ "\xb1\xf7\xb4\x6f\x49\x49\x5f\xcf\x1b\xce\x44\x3f\xa7\xf2\xb3\xa2"
+ "\xd9\x61\xaf\xbe\x06\xbf\xcb\x10\xe6\xb8\xdc\xc2\xde\x28\xfc\x1e"
+ "\x9b\x9f\x60\x87\xf9\x3c\x18\x7b\x51\x87\xb0\xad\xe1\xb8\xf9\xef"
+ "\xdd\xc8\xb4\x57\x32\xf5\xde\x4b\x12\x27\xe7\xbd\xc2\xce\xf6\xa7"
+ "\x8f\x7d\x40\x2e\x10\xf2\xa5\x20\xdf\xcc\xe6\x8a\x6e\xf6\x63\x39"
+ "\xce\x31\x0f\x3b\xb5\xba\x7d\x29\x53\x4f\xdc\x96\x4c\xc5\xbd\xce"
+ "\xf7\x60\xff\xbf\x98\x7b\xed\x72\xfe\xde\xa2\xab\xd9\x22\x6a\x6c"
+ "\xcc\xa5\xc1\xe6\x33\x3c\x5f\x9d\x88\xfa\xe7\x09\xc6\xff\x9f\x67"
+ "\x06\x0d\x01\xd8\x0f\xc3\xc4\x37\x1d\xe5\xd0\x03\xc3\x44\x68\x23"
+ "\xfa\xab\xc7\x02\x7b\xb7\x85\xda\x82\xcd\xd2\x47\x04\x32\x6c\xaa"
+ "\xf4\x8b\x0b\x9e\xe0\x61\xe9\xdf\xab\xce\xc1\xff\xf3\x3d\x9e\xe0"
+ "\x07\xd4\x66\xf3\x91\x7b\xcd\x1f\x31\x66\xfd\x73\x06\xe3\x35\xd1"
+ "\xe6\xa0\x09\xe7\xf8\xfd\x7b\x9d\x6a\x9c\xfc\xe7\x5c\xed\x6a\xe6"
+ "\xd8\x98\x91\x38\xdd\xff\xfc\xca\xa7\xcb\x56\xac\x5a\x39\x21\x7f"
+ "\xd9\xba\x65\xa5\xd6\x87\x95\xcb\x5d\xd4\xf8\x95\x34\x10\xff\xfb"
+ "\xd7\xc9\x3c\xa6\xb0\xad\xc2\x71\xc0\xaf\x16\x03\x5c\x8f\xff\x0d"
+ "\xbb\x21\x9d\xd7\xf7\xfe\x27\x63\x80\xeb\xb6\x08\xc7\xff\x1e\x58"
+ "\xeb\xfe\x75\x4b\xbf\x0c\x84\x3f\xea\xe5\x67\x3e\xfb\x19\x76\xfe"
+ "\x73\x3e\xcb\x51\xbd\xf4\x4f\xfb\xf5\xec\xc8\x58\x49\xec\x8b\xc7"
+ "\xeb\x23\x48\x5f\xac\x9f\xb3\x05\x2f\x62\xdc\xf8\x75\xe9\xc0\xb9"
+ "\x9f\x5f\x97\xa3\xbf\x8f\x28\xf9\x95\x79\xb7\xeb\x7b\xc2\xda\x77"
+ "\xd7\xe4\x1e\x76\xd8\xd9\x97\xab\xd6\x61\x7e\xbd\xb3\x3e\x3c\x2c"
+ "\x49\xed\x01\xfc\xfa\xb0\x7e\xa6\x4c\xc9\xe6\x47\x9a\x6c\xfe\xba"
+ "\xe5\x6a\xfb\xf6\x03\xb2\x71\x24\x69\x40\xae\xff\xa2\x95\x3d\x92"
+ "\xf4\x65\x7b\xfe\x9a\x3d\x7c\xe3\x19\xfa\x97\x9b\x79\x6d\x06\xf7"
+ "\xb7\xe0\x7e\x88\x1c\x6b\xa5\x7f\xfd\xfb\x9f\x69\xf7\xa8\xe3\xfd"
+ "\xdf\x69\xf7\x5f\xc7\xfd\x3b\xda\xfd\x68\xdc\xbf\xa6\xdd\x43\x66"
+ "\xdf\xdf\xa2\xdd\xa7\xe1\x7e\x85\x76\x0f\x9d\xff\xfe\x43\xda\xfd"
+ "\x28\xdc\xdf\xa3\xdd\x7f\x0d\xf7\x63\xb5\x7b\xc8\xe0\xfb\xd7\x69"
+ "\xfb\xa7\x49\xc0\xfd\xe2\xb5\xdb\xe7\x47\xdc\x6a\x8f\xee\x7d\x82"
+ "\x2d\x74\x40\x8d\x19\xfd\x69\x69\xe0\xe9\xa5\x3a\x7d\x91\x7e\x84"
+ "\xeb\x41\x7a\x96\x97\xde\xec\x8c\x48\x3f\xa8\xe5\x9f\x8d\xf1\xc6"
+ "\x1b\x91\x5e\xa7\xa5\x2f\x86\x0d\x9a\x14\x91\xee\xd2\xd2\xcb\xa0"
+ "\x17\x4b\x22\xd2\xb5\xb8\x0e\xef\xef\xf0\x52\xa3\x25\x22\xbd\x5c"
+ "\x4b\x3f\xa0\xfb\x2b\x68\xe9\xa5\x5a\xfa\x51\xa4\x1f\x8f\x48\x2f"
+ "\xd6\xd2\xa1\xff\x7f\xdd\x11\x91\xae\xd6\x15\xe4\x59\x34\x93\x38"
+ "\x56\xc1\xb2\xf5\x7e\xc0\x4b\xfb\x8f\x44\xe4\xc9\x53\x65\xff\xc5"
+ "\xec\xa5\xba\xc8\xb6\x4c\xd3\xd2\x33\xbd\xf4\xb7\xc6\x88\xf4\xec"
+ "\xc1\x74\x55\x42\x2d\x15\x0f\xb6\x86\xc9\xdf\xa9\x92\x7e\x92\xd2"
+ "\xb6\xfc\xcd\x32\x3e\xa7\x66\xda\x2f\x4e\x59\x2b\x85\x38\x45\xbf"
+ "\xc9\xd7\xfc\x03\x9b\xd9\x5f\x4b\x9d\xf7\xfb\x4d\x8e\x3c\x03\xc6"
+ "\x3e\xe7\x7c\x06\x70\x23\xa7\xfd\x8b\x8c\x7d\x32\xa9\xdc\xa1\x62"
+ "\x72\x2a\xff\xd3\x6e\x39\x97\xd7\xf6\x39\x91\xe7\x33\x5e\xdb\x64"
+ "\x38\xbc\xde\xe7\x29\xbb\x2c\x7d\x22\x79\x2e\xc5\x69\x3c\xa7\x95"
+ "\xe7\xc2\x22\xe6\x54\x4a\xef\xff\x66\x59\x98\xcf\xed\x3b\xd5\xbc"
+ "\x9f\x65\x91\xf3\xb3\x6f\x4e\x64\x5e\x2f\xfd\x46\xce\x4d\x13\x2d"
+ "\x29\xff\xd6\xeb\xfc\xcd\xec\x81\xb3\x4a\xff\x52\xa7\xa5\xff\x09"
+ "\xe9\x8b\x23\xd2\xb7\x0f\xae\xdb\xa1\xef\xcc\xe9\x05\x7d\x97\x84"
+ "\x3f\x78\x49\x04\x76\xfd\x07\xf0\x5e\x2e\xcf\xdd\x7c\x23\xe4\x4a"
+ "\x2f\xd6\x62\x60\x7c\x16\x5c\x27\x7c\xd0\xd9\xfc\x8d\x89\xeb\xe7"
+ "\xfb\x7d\x34\xdf\xd6\x2b\x76\x3e\xc5\x7e\x76\x17\x65\x3c\x28\x7b"
+ "\x37\xc7\xdf\x66\xdf\x2d\x3f\xef\x0f\x25\xb7\x61\x8c\xab\x5f\xce"
+ "\xef\x3f\xa5\x79\x25\x3e\x6a\x2d\x09\x51\x3d\x60\xef\x7f\x4a\xf7"
+ "\x9b\xfc\x4d\x7f\xfc\x1f\xc6\x81\xeb\xb3\xcb\x6f\xc5\x1c\x9d\xc0"
+ "\xb8\xf2\xb7\xf0\x44\xf5\x7b\x36\xf1\x5b\xb6\x65\xf7\xb8\x4c\x5b"
+ "\xc8\x8a\xb1\x7d\x0a\xee\x1d\xea\x87\x77\x48\x1f\xac\x4d\x4a\x96"
+ "\x8f\x6a\xfe\x98\xe9\xed\x4a\x5f\x1c\x2d\x13\xff\xc4\xe7\x8e\x8e"
+ "\xf2\xf9\xa7\x12\xd8\xcd\x71\xfd\xaf\x36\xef\x27\x43\x5f\x0d\x6c"
+ "\x93\x73\x47\x0c\x4a\x3f\x7d\xb0\x34\x6c\x48\xda\xc2\xeb\x8a\xf2"
+ "\x3b\x11\x35\x93\xcd\x87\x56\x06\x0c\xad\x1b\x3b\x69\xd3\xd7\xc8"
+ "\xb2\x38\xc0\xbe\xe4\x47\x3f\x1f\x59\xc6\xb1\x45\xf7\xda\x60\x87"
+ "\x1a\xde\xc5\xfb\x0f\x57\x1e\x31\x04\xa5\xbd\xf2\xc1\x52\xb9\x16"
+ "\xe5\xca\xe9\xe4\x31\xc4\xd3\x11\xe2\xb3\x47\xd2\x4e\x86\xfe\x4f"
+ "\x0a\xad\x2f\x49\x0d\xae\x2d\xb9\x7e\xff\x1a\x4a\x0e\xad\xcd\x4c"
+ "\x7b\xe5\x12\x4d\xd1\xc7\x1f\xcc\x61\xb3\x45\xaf\x65\x78\x15\xc6"
+ "\x14\x9e\xe3\x8e\x4c\x30\xcb\x3d\x37\xbe\x0f\x1b\xde\x48\xaf\x5f"
+ "\x77\xf5\x6f\xde\x84\x30\xb7\xe5\xd8\xd3\x8c\x4b\xbc\xb6\xee\x78"
+ "\x1d\xf3\x65\xed\x9c\x6c\xe5\xe7\x34\x0a\xf3\x16\xc3\xc8\x8b\xc2"
+ "\x7d\xa6\x94\x0c\xfc\x9d\x90\xca\x65\x72\x1d\x69\x48\x6b\x49\x90"
+ "\x3c\xe5\x7f\xa6\xca\x35\xdc\x47\x1f\xbc\xcf\x76\x1a\xfb\x4d\x22"
+ "\xbf\xf9\x0c\x7d\xf0\x3b\x53\x00\x63\x46\x00\xb6\xf4\x33\x3c\x27"
+ "\xfc\xe0\x53\xbf\x8c\x7d\xfb\xa1\x95\x7d\xc7\xdd\x6b\xee\xe3\xb4"
+ "\x2f\xec\x9f\x4b\xdf\xd8\xe3\x4a\xb6\x3e\x38\xc1\xcf\x76\x3e\xb7"
+ "\x9b\x3a\x35\xf9\xad\xcb\x81\xff\xcb\xde\xf7\xc0\x45\x55\xa5\xfd"
+ "\x9f\x19\x10\xc9\x48\x06\x17\x09\xcd\x6a\x6c\xb1\x9d\xca\x3f\xd4"
+ "\xea\xbb\xae\x61\xe2\xbf\xd6\x5c\x4d\x74\xfd\x83\xe5\x1f\x34\x29"
+ "\x74\x45\x47\x44\x44\x44\x40\x34\x5e\x6b\x15\xc7\x42\x16\x13\x75"
+ "\xea\xc5\x7d\xa9\xfc\xc3\xee\xda\xfb\x62\x6b\x3a\x26\x16\x28\x30"
+ "\x58\x58\x68\xa8\x23\xa1\x21\x8b\x36\xc9\x28\x83\xce\xdc\xfb\x7b"
+ "\x9e\x73\xee\x9d\x3b\x77\x98\x01\xc7\x34\xdb\xdf\xbe\x7c\x3e\x7c"
+ "\xee\x9c\x7b\xcf\x3d\xf7\xdc\xf3\x3c\xe7\x7b\x9e\xe7\xb9\xcf\x79"
+ "\x9e\x4e\xcc\x56\xf1\xc9\x49\x61\x7d\x88\x61\xfa\xd7\x27\xd5\x9e"
+ "\x78\x97\xd3\x69\xb4\x3c\xc6\x46\xcf\xb7\x91\x17\x2d\xbc\x89\x7e"
+ "\xcf\xc4\x78\x05\xc9\xc3\x0c\xfc\x75\x1d\x61\x7b\xec\x0e\x6e\xe1"
+ "\x36\x69\xb4\x2c\x5e\xe5\xc1\x4d\x84\xf9\x22\xc1\x1a\xa9\xc9\x60"
+ "\xb6\x5c\x8d\x8e\xd9\x36\x35\xfa\x35\x3d\xd1\x57\xf9\x60\x5e\x73"
+ "\x90\xa6\x08\x8e\x0b\x9b\xbb\x3d\xa7\xf7\xbc\x1e\xf5\xd1\xab\x1f"
+ "\x21\xc1\x68\x53\x47\xbf\xe3\x1d\xcc\xdf\x18\x9e\x71\x28\x9f\xdf"
+ "\x44\xaf\x3d\x5a\xa7\x25\x3e\x4c\xdf\x3b\x78\x69\x40\x3e\x01\xb9"
+ "\x82\x3c\xc0\xab\x34\x51\xd4\xc7\x4b\xa7\x89\x31\x36\xf1\x06\xf4"
+ "\x2d\x64\xdf\x3e\x0e\x15\xf2\x41\x9a\x28\x56\xff\xd0\x6f\x2b\x9b"
+ "\xe0\x1d\x54\x1a\xb5\xd1\x7a\x59\x90\x09\x0f\x01\xef\x6b\xd4\xbc"
+ "\x4e\x13\xce\xf6\xbf\x1f\x7a\x43\xc4\x55\xc6\xa3\x87\x56\xb1\x71"
+ "\xeb\xa3\x67\xe3\x76\xa8\x50\x58\xaf\x1e\xc5\xdf\xb0\x76\x87\xb3"
+ "\x6f\xf5\x87\x12\x45\x19\xd9\x24\xd4\xc1\x7b\xe0\x77\x34\xc3\xda"
+ "\x43\x39\xf0\xee\xc2\x1e\x86\x43\xf4\x7b\x21\xbc\x1f\xac\x59\x07"
+ "\xab\xf0\xbd\x3c\x61\x2b\x1d\x8b\x54\xe2\x03\x7d\x8e\x44\x9f\x52"
+ "\x94\x53\x8c\x96\x61\x06\x96\xcb\xf2\xf0\xd3\x74\x1f\x30\x3c\x07"
+ "\xe8\xa3\x44\xdc\xc4\x7d\xcb\xd8\x9e\xd4\x7f\x43\x77\xb1\x2f\xf8"
+ "\x3c\xbc\x06\xef\xaa\x46\x7a\xc2\x58\x85\x63\x1d\xa4\xeb\x45\x2d"
+ "\xda\x38\xae\xc1\x98\xa1\xbf\xd0\xe1\x48\x1c\x13\x36\x66\x87\x1d"
+ "\x39\xcf\xd9\x78\x1d\x0e\x92\x8f\x07\x2b\x73\x2a\xc0\x86\x04\xf4"
+ "\x1b\x39\x1c\x29\x8c\x5f\x93\xf0\x7c\x9a\x87\x93\x5d\x33\xec\x74"
+ "\xba\xf7\x61\x47\x5d\x96\x37\x55\x89\xdf\x60\xd1\x26\xcf\xf8\xd5"
+ "\x50\xe5\x74\x5f\xd5\xec\x1f\x50\x46\x0e\x53\x63\x9e\x4b\x1c\xf3"
+ "\x96\x4c\x43\xbd\x34\xde\xac\x1d\x37\xcf\x78\x44\x7c\x86\x89\x18"
+ "\x0a\xc4\x7e\xc2\x6f\x61\x0d\x3e\xac\x91\x68\x62\x18\x23\xde\xb7"
+ "\x9d\xee\x25\x3a\x64\xc1\x3d\x90\x6e\x71\x10\xbf\xfd\xc0\xa8\x54"
+ "\xda\x86\x19\x28\x3f\x92\xc3\x7a\xf4\x89\x85\x71\x8d\x64\x3c\x74"
+ "\x78\x2d\x5b\x0b\x0f\xeb\xb1\x4d\xfc\xae\xc2\xe2\x9d\x1e\x06\xcc"
+ "\x3a\x24\xe4\xea\x3e\xbc\x4b\xe8\x03\xe8\x7f\x07\x0b\x5c\xf5\xba"
+ "\x11\x73\xe6\xd1\xcd\xbe\xfd\x96\x69\x5d\xf7\x15\xf9\x4b\xfb\x3a"
+ "\x0f\x37\x38\xed\x8b\x15\xf6\x1a\x7e\x3a\x10\xf4\xd4\x7d\xd9\x2c"
+ "\x2e\x6e\x71\x36\xd0\x2c\xfd\x1a\xe9\x89\xf9\x61\xd2\xb4\x7c\x63"
+ "\xa5\x16\x74\x6b\xd5\xa0\xbe\xbc\x6e\x50\x78\xda\x35\xd2\x05\x7d"
+ "\x2e\x10\x6f\xd0\xde\xc3\x07\xc1\xf9\x4d\x83\xc2\xa5\xbd\x77\x25"
+ "\x26\xd0\x6d\x0b\x37\x80\x2e\x9b\x7e\x99\xf4\x64\x3e\x14\x9f\x2e"
+ "\x11\xec\x3e\xef\x70\xba\x41\x03\x71\x5f\x67\x25\x68\x84\x7c\x7a"
+ "\xdc\x3b\xdc\xa6\x41\x03\xa1\xdd\x51\xe9\xf1\xa4\x1b\xae\x6f\xe8"
+ "\xab\xcb\x78\xa6\xc4\x00\xed\x8e\xc2\x98\x6b\x1c\x1f\xad\x80\xe7"
+ "\xaf\xe3\x54\x43\xaa\x36\x70\x84\xfa\x88\x03\x9f\x29\xeb\xc8\xa7"
+ "\x87\xe1\xf9\xeb\x30\x6f\x25\xda\x7c\x8c\x56\xe8\xe7\xa6\x41\xeb"
+ "\xe0\x5a\x57\xb8\x86\xf6\x1e\x0e\xe3\xaf\x61\x3c\x77\x68\x3f\x14"
+ "\xdb\x87\x67\xad\x63\x7d\x37\xd3\xba\x75\xe4\x48\x6f\xac\x23\xc6"
+ "\x75\xe3\xd2\xa3\x7d\xf0\x3a\xee\x13\xb6\x63\x5e\x04\x90\xce\xd9"
+ "\x3d\x35\x8e\x7b\x04\xf9\x19\xe6\x72\xc9\x7e\xfe\xad\xe7\xd0\xf7"
+ "\xa7\x18\x7d\x52\x99\x2c\x5b\xb2\x4f\x98\xeb\x20\x1f\x97\x7c\x24"
+ "\xfc\x0e\x70\xd4\x4d\x8f\x26\x69\xad\x24\x94\x7e\x57\x5d\xee\x03"
+ "\xd8\x5b\x12\x80\x39\x16\x9c\xda\x3c\x8f\xed\xad\xc7\x78\x71\xb1"
+ "\x24\x00\x70\xf9\x7e\xe8\x37\xe6\x47\x39\x8f\xb6\x5a\x61\x6c\x4c"
+ "\x40\xa7\xa2\x8d\x2c\x26\xe0\xbe\x0d\xc0\xfb\x69\xab\x40\x1e\x58"
+ "\x45\x02\x56\xd9\x49\x2f\x7c\x4f\xa0\x5b\x03\xfa\x55\xa3\xee\x86"
+ "\x63\x23\xd0\xb0\x00\xde\x65\xd7\xaa\x38\xbe\x7e\x55\x13\xdf\x50"
+ "\x11\x57\x43\x60\x9d\xe9\x56\xa9\xad\xc2\xd8\xe4\xe7\xf1\x5d\xd1"
+ "\x46\x09\x63\x0a\x72\x26\x3c\x63\xd3\xa0\x5d\xb8\x57\x86\xda\x09"
+ "\x94\x87\x8b\xc5\x7d\x45\xdb\xe9\xde\xa3\x92\x70\x87\xed\x2b\x89"
+ "\x2f\x11\xfa\x52\xca\xe1\xef\x24\xba\x3f\xb1\x0b\xea\x3f\x68\xd3"
+ "\x98\xbd\x42\xef\xd8\xa3\xc1\x6c\x03\x25\x0b\x9d\xe2\x72\xd1\x7b"
+ "\xd1\x46\x80\xf7\x4e\xb0\xf1\xd7\x36\x0a\x75\xf1\xde\x09\x2b\x66"
+ "\xf3\x78\x2f\xdc\xa3\x77\xdc\x23\xdb\xe3\x73\x84\xc9\x15\x30\xb6"
+ "\xf8\xdb\x0c\x63\x29\xf8\x50\xa9\xd9\xf7\xef\x92\x1a\xf1\x9b\xb3"
+ "\x89\x7c\xaa\x43\x7e\x72\x1f\x4f\xfc\x28\x91\xc7\x48\x3a\x5a\x85"
+ "\xf1\x9b\xe0\x7c\xa8\x18\xcb\x08\x7e\x87\x41\x5b\x4c\xce\x76\x8a"
+ "\x51\x96\xed\x14\xef\x30\xdd\xcc\x7f\x8b\x7c\x02\xb8\xe2\xd3\x48"
+ "\x8e\x82\x5c\x34\xa4\x8a\xed\x93\x3a\x7a\x18\xfb\x59\x47\x8e\x62"
+ "\x2c\x85\x40\x16\x4b\xe1\xe8\x6a\x01\x3f\x0c\x13\xec\xb6\x40\x13"
+ "\x3c\x13\xf7\xfc\x38\x95\x93\x01\x4f\x54\x50\xef\xaf\x2c\x1e\xe0"
+ "\x51\xad\x4b\x7d\xbc\x9e\xe1\x52\x8e\x74\x29\xab\x2d\x30\x6f\x3c"
+ "\x7d\x5b\xdf\xd0\x93\xda\x0f\xeb\xbb\xae\x26\xda\xf4\x4b\xc4\x07"
+ "\x78\xe5\x02\xf6\xad\xb2\xa1\x09\xdf\x29\x90\xcf\x0c\x27\x68\x03"
+ "\xa5\xb2\x25\xac\xe9\x75\x61\x50\xe7\x12\x09\x41\xbf\x6f\xcc\x91"
+ "\x02\xf5\x1b\x59\x1c\xf3\xcf\xa7\xcf\x58\xd6\x85\x70\xaf\x45\xdf"
+ "\xcf\x2b\x27\xe2\xf7\x44\xff\xdd\x37\x4c\x9d\xf0\x3b\x57\xda\x16"
+ "\xe0\x49\x3b\x09\x01\x1e\xab\xc7\x7c\x74\x70\x4f\xd3\x7f\xdd\x68"
+ "\xe8\x64\xb4\x9d\x26\xda\x05\x44\xd9\x48\x3e\x1f\xe7\x9b\x4a\x7c"
+ "\x37\x5e\x24\x2a\xa0\xab\xed\x88\x6d\x30\x11\x63\x21\xe4\x77\x63"
+ "\xfb\xb8\xf3\x01\x5f\x97\x86\xf2\xd6\x96\xcc\xcf\x0a\x41\xf7\xca"
+ "\x11\x75\xec\xf5\x2c\x0f\x8a\x2f\x3c\xbf\xbb\x52\x88\xfb\xc0\xc6"
+ "\xf6\xb3\x0b\x6c\x9f\x55\xf0\x6b\x70\x4f\xad\x24\x7f\x7f\xce\x72"
+ "\x8d\xeb\x86\x08\x6b\xdd\xe7\x71\x47\x40\x82\x5f\xcb\x7c\x14\x82"
+ "\x5b\x32\x3f\xf7\x77\xf8\x28\x50\xbb\xd5\xe7\x71\x40\x43\x0b\x93"
+ "\xcd\x87\x00\xbe\xfb\x0b\x73\x10\xcf\x87\xa9\xf1\x5e\xb8\x2f\xd0"
+ "\x42\x6d\x4c\x9f\x8f\x92\x78\xed\xf3\x00\xc4\x7c\x78\xa7\x00\x13"
+ "\xf9\x2c\x03\xdf\x0b\xc7\x04\xea\xf9\x42\x79\xed\x91\x02\x0f\x71"
+ "\x61\x55\x61\x55\x36\x6a\x03\xf9\x73\x1c\xf0\xd3\x65\xa0\xc1\x2f"
+ "\x30\xf6\x93\x11\x9e\x53\xb1\xfd\x06\xa9\x08\x6d\x26\x95\xf0\x1b"
+ "\x7d\x91\x0d\x0b\xbe\x25\xf5\x6a\xf7\xeb\x0d\xac\x59\x51\xd0\xe7"
+ "\x18\x6c\x0b\xb1\x00\xfd\xb7\x8c\xa9\xb0\xfe\x98\xa1\xad\x7a\x42"
+ "\xdb\xa8\xe0\x1a\x48\x45\x32\xea\x59\x1f\x69\x2b\xb7\x9f\x26\x95"
+ "\xa1\x5f\xd2\xe7\xa0\x4c\x68\x48\x68\x6e\xaf\x6d\x2d\xb4\x9d\x21"
+ "\xb4\xdd\x04\x6d\x07\x7b\x6e\x3b\x57\xe7\x65\xdb\x5e\xf4\x3b\x37"
+ "\xc3\x9b\xb6\x41\xde\xad\xc6\x3c\x37\xb8\xaf\x2b\xad\x07\x79\xc0"
+ "\x7e\x1d\xe3\x7e\x3e\xca\x33\x7f\xd8\xb2\xa1\x74\xef\x57\x26\xdd"
+ "\x3b\x53\x45\xf7\x80\x5d\x21\xd4\xa7\x91\xed\xfb\xba\x40\xd0\x1f"
+ "\xa2\x25\xb3\x4c\x23\xe9\x4a\x8e\xef\x54\x20\xab\x96\x8d\x63\x7e"
+ "\x8f\x03\x85\x38\xe4\x65\x18\x37\xd2\x83\x9e\x37\xc8\xc6\xfc\x67"
+ "\xcb\x5e\x17\xed\x2f\xcd\x41\x83\x6c\x42\x5b\x6a\x57\xbb\x9e\x98"
+ "\x90\x36\x36\x39\x51\xcc\x6d\x9b\x28\x6c\x3f\x9d\x14\xfb\x4a\xec"
+ "\xfc\xa4\xd8\x79\xea\xc9\xcb\x12\x16\xf5\x5b\xfc\xea\xab\xea\xf1"
+ "\xb1\x4b\x97\xce\x79\x2d\xb6\x0b\x99\x9c\x30\x67\xd1\xd2\xf9\x68"
+ "\x7b\x53\xab\x47\xfd\x7a\x76\xdc\xe2\xc4\x7e\xcf\x8d\x0a\x77\xb1"
+ "\xbd\xe1\x5e\xc5\x5a\x94\xc1\x61\xed\x08\x49\xb3\x93\x20\x8c\xe3"
+ "\x13\xb8\x82\x37\xac\x04\xfd\x0f\xf8\xaf\x11\xd7\x29\x5c\x1b\x50"
+ "\x37\xc0\x18\x82\x80\xdf\xe5\x5b\x73\xf9\xaa\x8b\xe4\x1b\x3b\xc8"
+ "\x95\x35\x3b\x58\x3c\xbc\x5a\xd0\xc9\xcd\x2c\xdf\xe2\x37\xa7\x30"
+ "\xd6\xdd\x9f\xe0\x9c\x39\x68\x88\x65\xe3\x59\xe2\x0b\xeb\x1a\xe8"
+ "\x25\xc7\xf2\x78\x65\x67\x7e\x7d\x08\x5f\xc2\x7f\x1b\x4a\x84\x18"
+ "\xe2\x4a\xa3\xc9\x8a\xdf\xf3\xfd\x27\xd8\xd2\x79\xc4\x53\x36\xb7"
+ "\x8e\x6d\x61\xe3\xa2\xd1\x32\xbf\xe2\x6f\xf6\xa3\x0e\xb3\x86\xe6"
+ "\xc3\x3c\x06\xf3\xff\x13\xad\x84\xd3\x5f\x96\x08\xb2\x23\xc6\xf8"
+ "\x58\x5e\x07\x65\x16\x67\xe4\x58\xb5\xdc\x57\xa3\x1c\xd6\xe5\xaf"
+ "\x1b\xd8\x3f\xde\x53\xe3\xcf\xfe\xf1\xb7\xf3\xff\x37\xf9\xec\xdf"
+ "\xf5\xfc\x8f\xfd\x17\x9f\x7f\xbb\xf7\x57\xa7\xb6\xff\x7f\x2b\xcf"
+ "\xc7\xe3\xbd\x7c\xff\x1f\x73\x7f\xf5\xda\xf6\xfe\x91\xdf\x80\xb7"
+ "\x6a\xff\x74\x96\xf8\x03\x7f\xe6\x6c\x98\x0b\x3c\x7d\x86\x84\xa6"
+ "\xda\xf8\xfa\xf4\x99\xa4\x57\xda\x25\x82\xf9\x08\x1b\x12\x93\xf9"
+ "\xfa\xb4\xeb\x28\x93\x56\x4f\x01\xfe\x2d\xce\xae\x23\x01\x1b\xea"
+ "\x88\xaa\x32\x11\x73\x15\x63\xac\x2f\xc0\x99\x26\xf8\x87\x72\x79"
+ "\x92\x95\x1c\x37\xff\x80\xfe\x4d\x86\xca\x18\xc0\x9d\x5a\x42\x90"
+ "\x7f\x03\x62\x48\x70\x7e\x08\x7f\x80\xcf\x5c\x0c\xeb\xd9\x62\xcc"
+ "\x4b\x58\xbd\x97\x8b\xec\xb4\x37\xa5\xb4\x93\x7a\x2e\xae\xf1\x15"
+ "\xd3\x05\xde\x3c\xca\xf6\x14\x7d\x49\xf7\x33\xc0\x3c\xa9\x66\x76"
+ "\xf5\xea\xe1\x6c\x3d\xaf\x0e\x12\xec\x4d\xf0\xfb\x4b\x2a\x2b\xc2"
+ "\x7b\x14\x63\xfe\x56\x6c\x73\x0f\x57\x4c\xf3\xb7\xee\x4d\x89\xec"
+ "\x94\x3a\x87\x28\x2b\x4d\x8d\x04\x73\x3b\x61\x2e\x50\x98\x77\xbb"
+ "\x60\x9e\x15\x6d\x0b\xe1\x75\xd0\xbf\xf5\xdb\x43\xf8\x75\xd0\xa7"
+ "\xc2\x96\xcc\x8a\x52\x58\x7b\x0e\x08\xdf\x5d\x0c\x30\x2f\x76\x6d"
+ "\x80\x3a\x13\x96\x91\x47\x37\x40\xbd\x6c\xa8\x87\x72\x32\xeb\xdf"
+ "\x89\x0d\x30\x06\xfb\xe0\x99\x55\xea\x59\x58\x36\x52\xdf\x1b\x7c"
+ "\x36\xbc\x87\xba\x8e\x18\x43\x61\x6d\xf3\xc5\x67\x88\xcf\x6d\xc9"
+ "\xac\x04\xfc\x2b\x4d\xa4\xdf\xce\xe0\x3c\x6b\xa7\x72\x32\x9b\xaf"
+ "\x83\x26\x6f\x94\xf2\xeb\x4e\xde\x90\x02\x6b\xfa\x0d\x1a\x03\x33"
+ "\x07\xed\x2d\x28\x63\x50\xb9\xc2\x4e\x02\x99\x7d\x00\x64\x8b\x38"
+ "\xc0\x01\x90\x27\xa8\x2f\x34\xc8\x12\xd0\x97\x1c\xcc\xf3\x88\xd7"
+ "\x41\x6f\xdb\x07\xeb\x72\x11\xca\x01\xb3\xae\x8d\x25\x68\x63\xc7"
+ "\x1c\xad\x4b\x67\xf0\x56\x96\x33\xa7\x72\x9f\x28\x0b\x20\x06\xe1"
+ "\xfa\x0f\xb2\xb0\xef\x4d\xa0\x21\xf0\x40\x29\xc8\x16\x41\x8d\x74"
+ "\xe5\xa0\x63\x5f\x4a\xd7\xfc\x24\x1a\xb3\xd9\x87\x61\x74\xa5\x1d"
+ "\xde\x2f\x00\x9e\x01\x63\x56\x4b\x6d\xe1\x0c\x63\x8c\x01\xe2\x3a"
+ "\x8e\x3a\xaf\x09\xda\xe0\x01\xcb\x84\x6b\xf0\xfe\x47\xc5\x5c\x77"
+ "\x20\x57\x54\x1e\x10\xc6\xac\x9c\x7d\x43\x36\x52\xdd\x1f\x64\x2e"
+ "\xc1\xb6\x59\x59\x8a\x72\x85\x70\xaf\xc3\xff\x11\xf5\x72\x0e\xe4"
+ "\x0a\x1c\x2f\x1c\x27\x68\xa7\x54\xc0\xb1\x6a\x26\xbf\x9c\x58\x26"
+ "\x7c\xb7\xc4\xfc\x17\x6b\xa5\xf1\x37\x16\x3a\x8f\x3f\xdc\x2f\xe8"
+ "\x8d\x27\x7a\x3b\xd1\x0e\x74\xa3\x2a\x2b\xda\x49\xa1\x8f\x07\x98"
+ "\x8d\xc7\x78\x1e\x63\xa5\x61\x6c\x66\x18\xe3\x03\xeb\x31\x0e\x30"
+ "\x60\xf3\x9a\xb3\x04\xbf\x7d\x83\xfc\x54\x75\x9e\xc9\xa7\x55\x19"
+ "\xc8\xc3\x50\xa6\x76\xf8\x7a\xe8\x17\xb6\x07\xe5\x89\x70\x04\x39"
+ "\xb6\xea\x05\xe7\x7c\xca\x52\x2e\xe5\xaa\x48\x69\x3f\x82\x71\x21"
+ "\xd3\x9f\x8d\x0b\xd1\x06\x46\xeb\xdf\x8c\xc3\xbe\xd5\xe2\xbc\x14"
+ "\xdf\x15\xf3\x2a\xc3\x79\x94\xfd\x6b\x91\x6e\xe2\x79\x8c\x21\x0c"
+ "\x74\x0a\x80\x67\x9d\x12\xfa\xb4\x0f\xca\xfe\x50\x0e\xa3\xf6\xfd"
+ "\x9b\x74\xbf\x79\xed\x86\x34\xe9\x1e\x9c\x37\xc0\xc3\x81\x50\xe7"
+ "\x04\x1c\x79\xb1\x2e\xcb\xbd\x5c\x15\xfd\xf6\x0d\xb4\x81\x55\x69"
+ "\xc5\xdc\xcb\x98\x77\x19\x31\x63\xc3\x2c\xd9\xd8\xe3\xd8\xec\x02"
+ "\x5a\x51\xbe\x3b\x62\x2b\x86\xf1\x3e\x01\xf2\xff\xc7\xd1\xec\xbd"
+ "\xaa\xa2\x85\xfe\x19\x58\xfc\x94\x32\x1d\x8d\xf7\x4b\xf5\xa1\x13"
+ "\x91\x0e\x7d\xc8\x21\x5b\x56\x45\x23\x4f\x42\x5b\xe5\x48\x7f\x94"
+ "\x13\xa1\x5e\x9c\x83\xb7\xe8\x7e\xdf\xaa\x06\x94\x2f\x85\xfe\x23"
+ "\xbf\x94\x09\x63\xa7\x73\x9e\x77\xce\xf3\x1c\xda\x00\xfd\xff\x73"
+ "\x07\x0f\x88\xf3\x9a\xf1\xc1\x17\x42\xee\xa7\x3f\xa3\xcd\xba\x0a"
+ "\xda\x35\xa0\x0c\xce\xd6\xd5\x2f\xf6\x1d\xa9\xb5\xa1\x0d\xbd\x1a"
+ "\xca\x30\xbf\xbf\xd0\x35\x77\x7b\xce\xb0\x96\xe2\xc6\x17\x30\x3e"
+ "\x03\x68\xae\x12\x1c\x17\x71\xbe\x6e\x9c\x85\xba\x5f\x38\x9b\xb3"
+ "\xc9\xc0\x0d\xd6\x26\x22\xf8\xfa\xc3\x9c\xbd\x80\xdf\x4e\x1b\x81"
+ "\x87\xfc\x71\xfe\x02\x7d\x77\x61\xbc\x69\x18\xc7\xaa\xb5\xb9\x74"
+ "\xde\x06\xe0\xbc\xbd\x89\x31\x24\xe0\x39\x25\x31\x91\xe4\x48\xb2"
+ "\x81\xce\x63\x8c\x1f\xb2\x15\xc6\x0e\xf3\x1c\xc3\xb3\x53\x45\x1f"
+ "\x65\xe4\x11\x8c\x17\x22\xf0\x49\x09\xce\x65\x61\xec\x7c\xa1\x5e"
+ "\x81\x38\xf7\x9c\xe8\x4f\xeb\xb8\xcc\xb7\x40\x36\xdf\xbe\xa8\x16"
+ "\xc7\xda\x46\xe7\x71\x95\xd6\x06\xf3\xd8\x79\x4c\x71\x3c\x71\x5c"
+ "\x5b\x32\xbf\x84\xf7\x2f\x0d\x15\xc7\x54\x1a\xcf\x2f\x97\x08\x34"
+ "\xaf\x62\x36\xa6\x2f\x07\x0a\xf6\x27\xc7\x18\x0a\xfc\x87\xeb\x40"
+ "\xf1\x1a\x7c\x77\x58\x1b\xf0\xf9\xc8\x23\x5b\x05\xcc\x2a\x31\x23"
+ "\x8f\x7c\x09\xf3\xff\x0f\x1a\x09\x3b\xaa\x12\xa9\xce\x02\x74\x62"
+ "\xf4\xf9\x72\x1b\x8d\xb7\xe1\x06\x3b\x4c\xe4\xc4\x0c\x09\x9f\xbe"
+ "\xdc\x25\x8e\x83\xc8\x93\xe2\xbc\x87\x36\x5a\xe5\xf8\xf3\xe5\x19"
+ "\x68\xa3\x1b\xe2\x9b\x24\x43\x7d\xd9\x24\xc7\xb7\x2f\xab\x11\xdf"
+ "\x90\xaf\xb5\x49\x68\x63\x63\xeb\x95\x89\x54\xa4\xca\x31\xa9\x62"
+ "\x09\xf3\x0d\x60\x32\x17\xf2\x96\x76\x16\xab\x8f\x6b\x18\xd4\xa7"
+ "\xba\xb8\xb0\xe6\x61\xcc\x2e\x3c\x17\x27\x8c\x57\x2d\xd4\x2f\xc1"
+ "\x7d\x93\x18\x2b\xe1\xfe\x5a\xa6\xeb\x01\x4e\x1f\xc0\xf8\xdd\x50"
+ "\x4f\x53\x09\x4f\xbb\x99\xc5\xb0\x5b\xc4\x0a\xfe\x95\xe8\xfb\x97"
+ "\x37\x90\xfb\xb4\xcf\xf1\xdf\x5e\x24\x27\x71\x3f\xab\x15\x63\x48"
+ "\x42\xdb\xea\x8b\xe4\xeb\x13\xf0\xdc\x60\xe1\x18\x0a\xc7\xfd\x70"
+ "\xec\x01\xc7\x77\xe1\xf8\x10\x1c\xdf\x80\xfa\x9c\x50\x3f\x1c\xca"
+ "\x4b\xe0\xfc\xaf\x85\x23\xf4\xf1\x24\xca\x9b\x51\x82\xec\x88\xe7"
+ "\x47\x63\x19\x8e\x83\x04\x9a\x0b\x31\x05\x4f\xf6\x83\x76\x92\xa1"
+ "\xff\x35\xc6\x5a\xda\x96\xf6\x22\xf9\xea\x1a\xb6\x8d\xfb\x98\xe1"
+ "\xf7\xfb\x4e\x32\x28\xb4\x73\xf2\x24\x1c\x07\xc2\x71\x0b\x1c\x13"
+ "\xe1\x18\x2f\x8c\x41\x15\x62\xc3\xbc\x64\x3a\xe6\xd4\x3f\x94\x3d"
+ "\x8f\xcd\x79\x5c\x87\x25\xec\xa8\x2c\x9d\x37\x83\xd1\xdb\x44\xbe"
+ "\xa0\x7c\x00\x75\x87\x63\x5d\x38\x8e\x14\x8e\x91\xc2\x71\xb4\x70"
+ "\xfc\x9d\x70\x1c\x25\x1c\xc7\x98\xc8\x49\xad\x20\x63\xc0\xb8\x9c"
+ "\xd4\xe2\x7b\x03\x76\x07\xb0\x67\x7c\xa5\x43\x1d\x19\x70\x7c\x10"
+ "\xb4\xef\xd3\x92\xf9\x95\xaf\x68\x1f\x45\x9b\xcf\xcd\xcc\xb2\x0f"
+ "\xb7\xd2\xef\xda\x5f\xf5\x72\xc2\xb6\x92\x00\x45\x24\x01\x19\xa8"
+ "\x7b\xbe\x92\xd7\x09\xed\x24\x2a\x85\xef\xc2\x42\x6e\x00\x1f\x8c"
+ "\x97\x47\xf5\xa1\xa0\x3d\x18\xa3\xb8\x96\xda\x8e\x31\xb6\x5b\xd0"
+ "\x90\x52\xf8\xaf\x06\xdd\xa0\x46\xc4\x6f\xd4\x7b\x98\xae\xde\xf9"
+ "\x4b\x78\xd6\x3a\x49\x57\xff\x6a\x30\xfb\x86\xf6\xe0\x12\x38\xaf"
+ "\x97\xce\x9f\xc4\xfd\x00\x83\x60\x3c\x6b\xe0\x7d\x06\xd6\x91\xaf"
+ "\x30\x86\xff\x33\xf5\xec\x9d\xc3\xc5\x77\x16\xe8\xa1\x15\xc7\xb7"
+ "\x9e\x9c\x4c\x06\x2c\x4c\x40\x1e\xae\x73\xe0\xec\x49\x6a\xd7\x15"
+ "\x78\x04\x68\x79\xf2\x69\xa4\xa9\xd3\x1c\x74\xc6\xa0\xe0\x96\xcc"
+ "\xaf\x35\x72\x4c\x31\x6a\x10\x53\x90\x37\x00\xbf\x91\xd6\xfe\x2e"
+ "\xf3\xaf\x1a\xe7\x1f\x9b\x77\x5f\xcf\x93\xdf\xfb\x65\xb5\x8d\xcd"
+ "\xbb\x1a\xe0\x33\xe0\xcf\x6a\xcc\x0f\x01\x38\xf4\xf5\x28\x61\x4e"
+ "\xd7\xc0\x9c\x1e\x04\xe7\xab\x58\x5f\xd9\x79\xe1\x59\xc0\x67\xd5"
+ "\xf8\xde\x0f\x89\xe7\x85\xf7\xc5\x76\x70\x0f\x7e\x0f\xf1\xbc\xd0"
+ "\x3e\xf0\x63\x75\x31\xce\x13\xf1\xbc\xf0\x4e\x20\x47\x7d\x6d\x13"
+ "\xf1\x64\x3d\xe3\xb7\xb5\xe2\x7d\x48\x37\x8c\x8f\xc5\x6c\xfc\x5f"
+ "\xe3\xde\x0a\x3d\xae\x0f\x6b\x66\x91\x80\xe5\x79\xe4\x01\x36\x2f"
+ "\xbf\x6e\x90\x63\xe4\xe9\x32\x3e\x33\xd0\xc6\xab\x86\x18\x2a\x6c"
+ "\x03\x45\x79\x35\xbf\x25\xb3\x66\x9e\x98\xe7\x5b\xca\x33\x50\xb3"
+ "\xa5\x42\xef\x18\x5f\xe8\x4b\xcd\x3a\xb1\x2f\x4e\xeb\x33\xa5\x01"
+ "\xf6\x0d\xdb\x5a\x03\xf2\xba\x05\x70\x81\xe1\x76\x4d\xb1\x89\xdc"
+ "\x2f\xca\xbb\x74\xdd\x0a\x54\x10\x6d\x76\x12\xfd\x3e\x1a\x88\x6b"
+ "\x23\xfa\xf8\x70\x68\xc7\x4a\xb6\x93\x4a\x2d\xe8\xf2\xc9\x17\xc8"
+ "\xec\x15\x5d\x30\xf6\x4a\x34\xf4\x75\x37\xf4\xad\xc0\x8e\xb6\xff"
+ "\x45\xa8\xa7\x9e\x9e\x63\x4f\xe2\xad\xc2\x98\xc1\x3c\x3a\x3d\x5a"
+ "\x18\x5b\xc4\xaf\x02\xc4\xf4\x35\x69\x2c\x67\x10\xda\x72\x70\x7e"
+ "\xbc\x8d\xeb\x58\x28\x6f\x2d\xc9\xc7\xb9\x72\x6a\x8c\x28\x93\x42"
+ "\x7f\xf5\x4c\x26\xfc\x62\x27\x8d\x4d\xa4\x1b\x62\x60\xb6\xc0\x53"
+ "\x27\xd9\xbb\x9f\x3a\xc0\xbe\x73\x0f\x11\xe2\x1b\x9e\x2a\xf4\x09"
+ "\x0d\xf9\x9a\xf9\x65\x95\x7d\xc6\x7c\x4a\x4e\xe5\x39\x7c\x4a\x24"
+ "\x59\xd1\xc0\xe2\x46\x9d\xda\x27\xcd\x89\x53\x6b\xf1\x3e\xb8\xbf"
+ "\x11\xce\x97\x4b\xe7\xbf\x28\x10\xec\x5d\x25\x5d\x57\x47\xa2\x6f"
+ "\x59\x77\x8c\xb5\xcd\x9e\x77\xba\x2f\x7d\x3e\xb5\x79\x0c\x29\x11"
+ "\xe7\x2f\x8e\x33\xae\xd9\x74\x0e\xc3\xfc\xc5\x79\x7c\x73\xd3\x90"
+ "\x52\xf8\x67\xf3\x96\xad\xcd\x06\x3a\x6f\xe9\x9c\x3d\x1d\xe1\xd4"
+ "\x0f\x1a\x5f\x07\xfb\xda\xbc\x32\x34\x00\xae\x45\xc3\xba\x5a\x25"
+ "\x5c\x63\x39\x25\x1a\x69\x8c\x3c\x33\x7e\xdb\xc6\x6f\x9d\xb8\x47"
+ "\x2b\x10\xb8\x1b\x63\x82\x88\xdf\xaa\xc7\x37\xa5\xf3\x76\xfc\xee"
+ "\x74\x9d\xb7\xe8\x1c\xb1\xfe\x4f\x17\x48\xf1\x7d\x4e\xf9\x0a\xef"
+ "\x85\x39\x61\xf2\x99\x2f\x58\xcd\x35\x26\x53\xd5\x58\x90\x4f\x8d"
+ "\xc0\x7b\x70\xcc\x63\x79\x99\x4f\x9b\x44\xde\x83\x79\x39\xef\x22"
+ "\xf9\x66\x49\x4e\x08\x9f\x07\x34\xcd\x83\xb9\xb4\x10\xca\x33\xe1"
+ "\x38\x8f\x1d\x15\x2a\x3c\x0a\x73\x24\xaf\x25\xf3\x9b\x5e\x62\x3e"
+ "\x7a\x1c\x1b\x4b\x50\xae\x09\xf9\x2c\x1b\xc6\x01\x79\x8d\x7e\x47"
+ "\x86\x7e\x23\x7f\x21\x9f\x21\x8f\x05\xae\x1e\x4b\xf9\x8c\xc6\x1f"
+ "\x80\xf3\xd8\x5f\xe4\x33\x68\x2b\x4e\x8c\xf3\x6b\x22\xdf\x04\xb0"
+ "\xef\x39\xdf\xa4\x8a\x3e\xb7\xf8\x2d\x29\xb1\x37\xe9\x0e\xed\xaa"
+ "\x4b\xd4\x34\x96\xe6\x39\xa3\x6d\x34\xc1\xba\xf8\x1d\x8e\xe1\xe4"
+ "\x83\x25\x70\x4f\x91\x34\xe6\x46\x9a\x9b\xf9\xc8\x0c\x6a\x8b\xfc"
+ "\x05\x5c\x2b\x77\xd6\x33\x4c\xe4\x58\x1e\xea\x1a\xe8\xdb\xf7\xcb"
+ "\x60\x82\xdf\x81\x01\xc7\xbe\x31\x8b\x72\xed\x80\x60\xfc\x9e\x7f"
+ "\x6c\x14\xf4\x0f\x75\xe8\x2a\xf8\x1d\x0e\xba\x64\xa9\x07\x9b\xf1"
+ "\x40\xb4\xf5\x08\xf9\x79\x6a\xd1\x8e\x85\xf9\x0c\x2e\x92\x73\x4b"
+ "\x2a\x30\x16\xc8\xe2\xb6\x71\x9e\xd3\x92\xf9\x6b\x18\xeb\x59\x9d"
+ "\x40\x7e\x51\x47\xce\x4d\x46\xbb\x51\xfa\x0f\x68\xa3\xa9\x4d\x96"
+ "\xdb\x68\x6a\x4b\x85\x7f\xd0\xb4\xcf\x44\x3a\xfd\x57\x09\xc7\x71"
+ "\x1d\xfc\x37\x08\x75\xe1\x4d\xcf\x0a\x6b\x4a\x28\xcc\x93\x5a\x87"
+ "\xfd\x17\xf9\x12\xe7\x36\xfa\x71\xa0\xcd\x49\x61\x23\x74\xef\x5b"
+ "\xa0\x0d\xfa\xbd\xe6\xc9\x49\x86\x14\xe4\xa3\x33\x74\x1f\x14\xc6"
+ "\x20\xf6\xce\x97\xe8\x0c\xa5\x27\x8b\x07\x5a\x5b\x05\xcf\x0e\xde"
+ "\x78\x85\xf8\x6a\x13\xc8\xc3\x68\xff\x0e\xb4\xf3\x06\xd4\x71\x85"
+ "\x98\x82\x55\x8d\xe4\xcc\x89\xc4\x55\x44\x09\xd7\x1f\x85\xdf\x06"
+ "\x51\x4e\x82\x7b\x54\x3e\x56\x12\x8c\xf2\xd1\xc8\x55\xe4\xd1\x96"
+ "\xcc\x33\xf9\x22\xad\x50\x86\x40\x3b\x9c\x60\x4b\x80\xbe\xd6\x52"
+ "\x1f\x67\x8c\x53\x6f\xa2\xe3\x46\x71\x18\xdb\x00\x1d\xf6\xcc\x3a"
+ "\x1f\x0b\x51\xb1\xb5\xe7\x0c\xf0\x7f\x99\x20\x33\x9e\x29\x00\xde"
+ "\xaf\x76\xea\xe7\xf3\x4e\xbf\xb3\xf0\xfe\x40\x0b\xca\x67\x9e\xc6"
+ "\xe7\x6c\x3f\x71\x7c\xd0\x5f\x35\x10\xf4\x04\x4a\x6f\x1b\xdf\x04"
+ "\x7d\x2b\xd7\xa6\x10\xff\x46\x72\xee\xe1\x1d\xb9\x74\x9f\x5d\x29"
+ "\xb3\xcf\x9f\x0b\x12\xf5\x70\xd6\xef\xb3\x67\x02\x57\xfb\x10\xb4"
+ "\xab\x63\xbc\x33\xea\xeb\xf7\x7d\x28\xb5\xa5\x1b\x6d\x11\xc4\x90"
+ "\x36\x04\xeb\x88\x72\x55\x6d\x73\x7a\x28\x39\x12\x1a\x01\xf3\xf8"
+ "\x6c\xa1\x49\xf9\xa5\xbf\xf7\x3e\x95\x67\x0b\x85\xf1\x2d\x67\xbe"
+ "\x08\x67\x57\xe0\x5a\x82\xba\x3f\xac\x23\x25\xb8\x46\xb7\x64\x9e"
+ "\xf3\x15\xe7\x0d\xac\x1b\x25\x70\x8f\x10\x0f\x1b\xbf\xff\x9e\x4d"
+ "\xc4\x18\x10\x54\x6f\x60\xf5\x03\x98\xcd\xff\xdc\x60\x87\x2c\x0d"
+ "\xf5\xf0\x3e\xe6\xa3\x76\x76\xdc\x6c\xbb\x02\xc6\xf4\xec\x38\x7c"
+ "\x37\x81\x17\x61\xbd\x3a\x17\x27\xcd\xdb\x33\x14\x9b\x8f\x34\x39"
+ "\xcf\xcb\x73\xeb\x24\x7d\xb3\x36\xa2\x5f\x0e\x51\xbb\x9b\x87\xda"
+ "\xae\xb8\x56\x9d\x6b\xdd\xb8\x91\xd7\xeb\x94\xdc\x88\x35\xd9\x24"
+ "\x40\xb1\x1e\x86\x0d\xe7\x59\x52\x4c\xf7\x8b\xc4\x74\x5f\x60\xc0"
+ "\x83\x51\x23\x13\x3b\xf3\x69\xa1\x44\xb9\xe1\x6a\x67\xff\xde\xd6"
+ "\x07\xf5\xbc\xcf\x93\x93\xc6\x27\x5a\x89\x7a\x81\x8e\x7c\xb7\x90"
+ "\xf8\x8c\xb4\xc3\xb3\x03\x88\xd6\x44\xea\x82\x71\xcf\xe8\x91\x00"
+ "\x94\x3f\xea\x82\xb1\xcd\xd4\x7c\xe2\x9f\x5a\xcf\x37\xac\x7f\xb5"
+ "\x93\x3f\xac\x07\xaa\xad\xc0\x63\xf7\x07\x3c\xa8\xbf\x09\x6d\x1c"
+ "\x8e\xa1\xf7\x15\x79\xee\x9b\x69\xb3\xfb\xbe\x69\x43\xa0\x6f\x3b"
+ "\xbd\xeb\xdb\xb7\xfb\xa4\xbe\x7d\xbb\xef\xc7\xf7\xed\xfc\xd3\x4e"
+ "\x7d\x53\x49\x7d\x8b\x83\xbe\x9d\x1f\xee\x5d\xdf\x2e\x4c\x96\xfa"
+ "\x76\x61\xf2\x2d\xf6\x6d\x57\x3b\x7d\xab\x70\xdf\xb7\xe4\x07\xa1"
+ "\x6f\x67\xbc\xeb\xdb\x45\x8b\xd4\xb7\x8b\x96\x1f\xd3\x37\xd4\xe5"
+ "\xd3\x7a\xf1\x17\x68\x3c\xf9\x04\x16\xaf\xf5\x22\xf9\x76\x68\x5a"
+ "\x3e\x2d\x77\xbb\x48\xea\x5a\x85\xf9\x6d\x4e\xb7\xf0\xdf\x32\x39"
+ "\xa7\x2e\xb6\xbf\x16\xfd\x5d\xeb\x66\x00\x2f\x07\x33\x9e\xfe\x96"
+ "\xfa\x37\xa4\x9b\x79\xc1\xdf\xb4\xee\xf5\xed\xd4\x1f\x65\x58\x9c"
+ "\x50\x2e\x6d\xee\x36\x84\xe6\xa1\xe7\x60\x3e\xf3\xdd\x9e\xf5\xc7"
+ "\xfc\x9d\x7b\x13\xcc\x4a\x3e\x13\x63\x87\x61\xbc\x3f\x5f\xc2\xbf"
+ "\xf5\x6c\xe8\xde\x04\x2b\xcd\x1d\xbe\x86\xee\xf7\xad\x33\x88\x7b"
+ "\xdc\xc4\x67\x98\x83\x86\xc5\xc1\xf9\x1a\x31\x0f\x2c\xaf\x44\x79"
+ "\xe6\x59\xcc\xf5\x08\xb2\x44\x9d\x59\xcc\xcd\x0a\xfc\xbe\x56\xc0"
+ "\x06\x4b\xa0\xb5\x3d\xdc\xfb\xb6\x8f\x88\x7b\x23\x13\x49\x20\xe6"
+ "\xa5\xdc\x98\xd6\x19\xbf\x39\x42\x5b\x75\xfb\x70\xdc\x27\x58\x3a"
+ "\xf3\x81\xa9\xc4\x07\xf7\xf6\xa1\x8f\x9e\x31\xd4\x4c\xc2\x52\x49"
+ "\xa7\x09\xc9\xd0\xa6\x95\xc4\x04\x26\x43\x7b\x30\xd6\x4c\x37\xf8"
+ "\x96\xda\xf8\x72\xa0\x3d\xfc\xfe\xed\x93\x48\x02\x46\x86\xa6\xf3"
+ "\x6b\xb6\x10\x5f\xdc\x07\x88\xfb\xf9\xd8\x5e\x3e\x3f\xff\x96\xcc"
+ "\x6f\xf5\xe2\xfb\xdd\x02\x7d\xba\x32\xfa\xd4\x9f\x91\xe8\x53\xbf"
+ "\xa5\x2d\x7d\xea\x3b\x31\xfa\x7c\x6b\x93\xe8\x73\x21\x52\x4e\x9f"
+ "\xfa\x3e\x72\xfa\xd4\xc7\xdd\x1e\x7d\xea\x63\x24\xfa\xb0\x67\x30"
+ "\xfa\xd4\x27\xbb\xa7\x4f\xbd\x4e\xa2\x4f\x7d\xd8\xad\xd1\xa7\xfe"
+ "\xa8\x67\xfa\xd4\x4f\x6e\x87\x3e\x7e\xee\xe9\x73\xa1\xfb\xad\xd3"
+ "\xe7\x42\xa4\x17\xf4\x79\x80\xd1\xe7\xe2\x2a\x89\x3e\x17\x7f\xdb"
+ "\x96\x3e\x17\x76\x32\xfa\x5c\xc8\x97\xe8\x73\xd1\x24\xa7\xcf\x85"
+ "\xa3\x72\xfa\x5c\xf4\xbf\x3d\xfa\x5c\x24\x12\x7d\xd8\x33\x18\x7d"
+ "\x2e\x86\xba\xa7\xcf\xc5\x70\x89\x3e\x17\x4a\x6e\x8d\x3e\x17\x63"
+ "\x3d\xd3\xe7\x82\xc5\x7b\xfa\x5c\xfc\xc8\x85\x3e\x2a\xcf\xf4\xb9"
+ "\x68\xf2\x82\x3e\x81\x8c\x3e\x0d\x0f\x4b\xf4\xf9\xee\x54\x5b\xfa"
+ "\x7c\x37\x9a\xd1\xe7\xbb\x08\x89\x3e\x0d\x19\x72\xfa\x7c\x17\x2b"
+ "\xa7\xcf\x77\x85\xb7\x47\x9f\xef\xf4\x12\x7d\xd8\x33\x18\x7d\xbe"
+ "\x2b\x76\x4f\x9f\xef\xaa\x24\xfa\x7c\x37\xef\xd6\xe8\xd3\xd0\xc9"
+ "\x33\x7d\xbe\xcb\x69\x87\x3e\x9d\xdd\xd3\xa7\x61\xca\xad\xd3\xa7"
+ "\x21\xa3\x3d\xfa\x78\x27\xeb\x35\xe4\xe0\x73\xef\x40\x3b\xb5\x9e"
+ "\xda\xc1\xb1\x43\xff\x43\x2e\xb3\xa1\x76\x3b\xe7\xe7\xcf\xf6\x68"
+ "\x34\xe4\xa8\x53\xc8\xb0\x3a\x72\xe9\x89\xed\x5c\x27\x7f\x3e\xb3"
+ "\x10\xf4\xa4\x0f\xf2\xf8\xd5\x7e\xbe\xdc\xea\xce\xbe\xb8\x37\xdb"
+ "\x73\xfe\xf6\x4b\x6f\xf8\xf4\x20\x8f\xe0\x3e\xba\x35\x20\x2f\xe3"
+ "\xef\x96\xcc\x4b\x39\x20\x0b\x46\xb6\xb7\x7f\x0b\x7d\x9d\x8e\xac"
+ "\x45\xfd\xf6\x92\xc1\x11\x17\x23\x93\x4f\xc6\xf8\x62\xda\xc7\x70"
+ "\x9f\xc5\xa5\x86\x1c\x1a\xaf\x6a\xd0\xfa\xc8\xc7\xf8\x73\xa8\x7b"
+ "\x5c\x24\x8d\x17\xf8\x4d\x83\xd6\x23\x3f\x80\xac\xfe\x8b\x46\xd2"
+ "\x18\xee\xf0\xcf\xe3\xa3\xdf\x11\x6c\x84\x83\x59\xdd\xa6\x29\x50"
+ "\x77\x30\xe6\x21\x5d\x9a\x86\xf9\x35\x9b\x86\x82\xec\xfb\x38\x3e"
+ "\x03\x63\x27\xed\x80\x23\xfa\xc9\x30\xdf\xcc\xc6\x28\x2a\x2f\xaf"
+ "\x79\xe8\x1d\xe6\x0b\xd7\xd4\x47\xe4\x3b\x78\x4e\x17\x28\x3f\x20"
+ "\xc8\xf3\x58\xff\xfe\x46\xf2\xcf\x6b\x4e\xd7\x03\xa0\x7c\x0a\xda"
+ "\x0e\x12\xae\x3f\x00\x65\xcc\xb9\x4c\xe3\x8d\xf3\xd9\x19\x82\x0f"
+ "\xf1\x3f\xf5\x70\x4e\x25\xd4\x09\x82\x3a\xaf\xa3\xec\x2e\xb4\xd1"
+ "\x0d\xca\xf3\x51\x07\x16\xae\x07\x43\x79\x3c\x7e\x3b\x10\xae\x77"
+ "\x87\xf2\xd3\x50\xfe\x15\xdb\xf3\x72\x53\x98\xa3\x8d\xb6\xdb\xdb"
+ "\x33\xde\x48\xf3\x95\x21\x0d\x98\x2e\xf0\x4f\x27\xff\x9f\xc6\x7a"
+ "\x97\x6b\x31\x4e\xd7\xaa\xc5\x6b\xcc\x47\xed\x9f\xa9\x4e\xd7\x4a"
+ "\x5c\xae\xe5\x39\x5d\xdb\xe7\xd2\xe6\x3e\xa7\x6b\x05\x2e\xf7\x55"
+ "\x39\x5d\xd3\xb9\x5c\x6b\x72\xba\x96\x21\x5c\xf3\x69\xc9\x6c\xf2"
+ "\x95\xbe\xe1\x35\x6a\x85\xf3\x4a\x38\xdf\xcb\xe9\x7c\x8c\x70\x1e"
+ "\x9e\xdf\x34\xd0\x44\xb6\x9a\x85\xf3\x94\xf6\xac\xfd\xa6\x71\x4e"
+ "\xed\x87\x33\x1b\x47\x53\x8c\xc3\x77\xae\xdb\xb3\xd1\xdc\xcd\xe8"
+ "\x77\xe0\x5a\x28\xf2\x95\x33\x6f\x2f\x4a\x52\xcf\x5d\xf6\x9a\x3a"
+ "\x21\x36\x11\xdd\x57\xe2\xe7\x27\xaa\xe3\x17\xcf\x8b\x95\xc5\x59"
+ "\x0f\xc6\x98\x83\x98\x53\x0d\x63\xb7\xd0\xfc\x05\xb9\x7c\x83\x23"
+ "\xe7\x07\xe0\x2a\x3c\xab\xdc\x44\x46\xd3\x67\xe5\xb0\x78\xe4\xa5"
+ "\x18\xfb\x85\xc5\x79\x21\x63\xeb\x48\xd3\x09\x21\xce\x8b\x01\xea"
+ "\x5a\x3d\xc7\x79\xb9\x52\x4d\xe3\x1b\x42\x3d\x16\xe7\xe5\x4a\x0d"
+ "\xcc\xf3\x91\x7c\x17\x96\xc3\x83\xe5\x36\xbb\x2c\xca\x26\xe6\xd9"
+ "\xad\x34\x46\x60\x06\xb3\x65\xb8\xc6\x6b\x1d\xb4\x10\xef\x13\xbe"
+ "\x97\x2e\x74\xba\x7f\x1e\xbb\x2e\xae\x0f\xc2\x33\x75\x83\xb4\x50"
+ "\xee\x52\x07\x65\x6a\xbf\xa7\xd7\x2e\x33\x5b\xde\xa6\x41\x89\xf8"
+ "\x4e\xf8\xde\xf2\x77\x53\x4e\xab\x23\x97\x77\x4b\xef\x76\xb9\xda"
+ "\x29\x16\x9c\xf0\x0e\x97\x6d\x6c\x8e\xb6\x79\x57\xea\x9f\xc8\xab"
+ "\x06\x25\xe2\xb3\x11\xcf\xd8\x5e\x06\x28\x6f\x1a\xa4\x15\xfb\xe3"
+ "\xd4\xbf\x44\xd4\xeb\xa1\x7f\xa7\xe8\x98\x00\x4d\x79\xa0\xa9\xf0"
+ "\x0e\x5b\xf8\xcc\xa6\x54\x96\xcb\x00\xd6\x13\xcc\xc9\x42\xd7\xaa"
+ "\x2b\xf3\x44\x5b\x26\xae\x51\xcc\x86\x79\x45\x92\xff\x30\x46\xd7"
+ "\x26\x71\xfd\xba\xe2\x24\xff\xb1\x67\xc2\xb9\x02\x67\x1e\x72\x7a"
+ "\xde\x09\x7c\x1e\xd4\x1b\xc7\xf6\x03\x0c\xd2\xe2\x7c\x87\xb2\x0a"
+ "\x7d\x31\xf1\x5e\xec\xa3\xa7\x3c\x7c\x9e\x62\x28\x4a\xe3\xf8\x7d"
+ "\x2f\x71\x1c\x73\xe8\x1e\xf9\xef\xfb\x8a\xf6\x3a\x21\x07\x86\x21"
+ "\xc7\x91\x97\xfa\xfb\x68\x9a\xdb\x4d\xf7\xf7\x31\x03\x02\x48\x0c"
+ "\x1b\xdb\xef\xe7\x20\xc6\xe3\x9c\x61\x58\xff\xbd\x41\xa0\x79\x24"
+ "\xeb\xff\xf7\x6f\xe0\x79\xc9\xff\xfe\x7b\x93\x58\x4f\xc4\x65\xf6"
+ "\xbd\xea\xfb\xfd\xb4\x1e\xcb\x15\x3c\x86\xd1\xfc\x57\xaa\x3a\xf2"
+ "\x7d\xb9\x50\xff\x12\xe5\x45\x1a\xbf\xe7\xfb\x06\x7e\xd3\xb0\x31"
+ "\xd0\x57\xd0\x7f\x9a\x84\x9c\x15\xec\xb9\x70\x2c\xc7\xbe\xe0\x18"
+ "\xe1\x5e\x72\x7e\xd3\xdf\xc7\x00\x7d\xdc\xc6\x47\x10\xfc\xba\x1f"
+ "\x6d\x24\x3f\x30\x19\x42\xc9\x5b\xd1\xc6\xca\xde\xf5\x87\x58\x27"
+ "\xdf\xe7\x00\xb1\x0e\xc3\x6e\x7a\x8d\xfa\x94\x6b\x93\xd0\x1e\x24"
+ "\x5c\x4b\xc2\xfd\xb5\x8e\xdf\x7e\x4e\xbf\x3b\xe1\x6f\xea\xd7\x9c"
+ "\x42\xd7\x56\x5f\x69\x1f\xff\x0f\xf3\xa0\x1c\xe0\x52\x0e\x96\x95"
+ "\x57\x30\xbf\x67\x90\xcd\xea\xa9\x0f\xb9\x70\x5e\x68\xfb\x3e\xda"
+ "\x9f\x24\x7e\x30\xf0\x46\x06\xee\xe9\x16\xe6\x61\x06\xee\xd9\x0e"
+ "\xb4\xcd\xa4\xfb\xb5\xe1\xfa\x40\xe1\x18\x2e\x1c\xfb\xb2\x3c\xad"
+ "\x3f\xf4\x92\x72\xad\xa3\x8d\xe6\x87\xbe\x9e\x72\xbf\xe3\x7e\x70"
+ "\xe1\x18\x2e\x1c\xfb\x0a\xb9\x6a\x67\xc0\x7d\x8e\xfd\xdf\xee\x7d"
+ "\x90\x7f\x58\x2b\xee\xe5\xb6\xeb\x06\x85\x71\xba\x08\x8c\x4d\xf7"
+ "\x28\xc6\x09\x4b\x6f\xc2\x58\x31\x16\x62\x24\x37\x88\x31\xb1\x25"
+ "\x03\x73\x83\x56\xb2\x9c\xa0\xb8\x07\x56\x81\x76\x73\x94\x1d\x2b"
+ "\xb5\x97\x69\x5e\xd0\xe5\x4d\x62\xde\x93\x1f\x1a\xec\x9b\x06\x85"
+ "\x09\xf3\x65\x0b\xf3\xd1\xbf\x4a\xed\xc5\x34\xaf\x75\x13\xfd\xee"
+ "\xe5\x7f\x91\x5c\x4d\x16\xeb\xb0\xb1\xbb\x4a\x6d\x5f\x3b\x32\xc5"
+ "\xdc\x8f\x57\xd5\x62\xae\x69\x13\xb9\x9a\x7a\x2d\x28\x21\x1a\xce"
+ "\x0d\x94\xfb\x4c\x5f\x1d\x8f\x6d\x62\xdf\x4d\xe4\x07\x33\xb6\x0d"
+ "\x75\xa2\x1d\x73\x16\xce\x2f\xb7\x91\x9e\xd0\xaf\x8b\x62\xfb\x70"
+ "\x1d\xe6\xbf\x99\x8e\x25\xb6\x79\x6d\x53\xde\x3a\x38\xb7\xde\xe4"
+ "\xdb\x39\x8f\xf9\x5c\x5f\x85\xf5\xef\xbf\x47\xb5\x27\x03\xc1\x5c"
+ "\x48\x86\xb9\x94\xc1\xe9\x86\x69\x59\x2c\xef\x61\xc9\xcc\xc6\x78"
+ "\xf5\x02\x7a\x87\x6f\xbc\x4e\x7c\xd1\x07\x82\xf1\x6c\x33\x8b\x81"
+ "\x0c\xe7\x00\xab\x0b\x61\x8e\xb0\xf5\xcf\xab\x75\xff\xaa\x85\xb6"
+ "\xd1\x93\xc5\x36\xc3\xbd\x4b\x2d\x99\xcd\x91\x8e\xfc\x09\x8e\x79"
+ "\xdc\x3c\x1f\xbf\x3d\xc0\xfc\xa0\x7d\x74\xed\x03\xf6\x17\xda\xaa"
+ "\xf7\x28\x63\xaa\x86\x69\xe9\xf7\x99\xb7\x9e\xd5\x30\x1f\xd5\xe6"
+ "\xbf\xfa\x84\x3e\xd4\x00\xcf\xda\xe5\xc8\x1b\x01\x75\xb2\xd1\xf7"
+ "\x1e\xda\x77\xbc\x67\x02\x7d\x46\x35\x9b\xeb\xcd\x0d\xdc\xa6\x61"
+ "\xda\x8d\x37\x88\xaf\x70\xbe\xa1\xd2\x66\xc5\xdc\x03\x6e\xe3\x6c"
+ "\xd1\xdc\x79\xe8\x13\xfe\xd6\x30\x2d\xee\x1b\x1a\x60\x15\xfb\x6c"
+ "\x69\xc0\xfd\x2a\xd8\x67\x36\xb6\x96\x33\xe2\x38\x6e\xb8\x0a\x6d"
+ "\xa7\x9d\x26\xf5\xc4\x12\x8b\x7e\x73\x74\x4c\x52\x44\x5f\x4e\x0b"
+ "\xd5\xf9\xe8\xf3\x59\x1d\xaa\xfb\xd3\x3c\x46\xd0\xfe\x76\x9a\x8b"
+ "\x0d\xde\x01\x68\x61\x48\xc3\x3d\xff\x16\x9a\x17\x60\x0d\x8d\xd5"
+ "\x01\xef\x4d\xfd\x64\xaf\x09\xdf\x49\x2c\x05\xe2\x5a\x61\x12\xce"
+ "\x6d\xc4\x67\x27\xdd\x20\x57\x88\xe5\x75\xcc\xb1\x0e\xe3\x91\x81"
+ "\xf1\xe9\x2a\x2d\x30\x4f\x92\x6f\x20\x2f\x60\x6e\xf6\x42\x13\xb1"
+ "\xac\x65\xeb\x1b\x8e\xb9\x25\x0e\x9f\x8f\x63\x0b\xba\x99\x19\xc6"
+ "\xf4\x7a\x4b\xe6\x35\x47\xfe\xc7\xec\x10\xd4\x77\x2c\xed\xc6\xd7"
+ "\xb5\x43\x9f\x2b\xf3\x60\xed\xec\x79\x1a\xfb\x57\xc6\x75\x1b\xa6"
+ "\x45\x9f\x6c\xf8\x1d\x2f\x60\x3b\xa5\x1d\xe3\x83\x6b\xef\xfa\x84"
+ "\xf6\xea\x5d\xc9\x78\x81\xc6\x50\x83\x73\x63\x84\xf1\xa3\xf9\x24"
+ "\x74\x49\x6c\x1c\x84\xfa\x36\x66\x2f\xee\xf5\x2b\xe8\x97\x53\xfe"
+ "\xbb\x6b\x74\xed\xc6\xd8\xf7\xdb\xa9\x4e\x78\x6d\x9f\x53\x9f\x2d"
+ "\x74\xff\xeb\x55\xb4\xf5\x5d\x9b\x81\xcf\xda\x80\xf1\xc3\x90\x2f"
+ "\x1a\x9d\xf9\xff\xda\x50\xec\x27\xfa\xfc\xda\x83\x9e\xd5\xc0\x7a"
+ "\xdb\x17\xc7\x19\xee\x81\x75\x7e\x98\xb6\x9d\xb5\x90\xe6\xdd\x6b"
+ "\xc9\xbc\xae\x11\xd7\x42\xd0\x2f\x60\x5d\x68\xe9\x4d\xf5\x4e\x90"
+ "\xa7\x8d\x1c\xca\x33\x2d\x6a\xe4\x1b\x98\xeb\x71\x02\xc6\xc2\xba"
+ "\x7f\x7d\x86\xf8\xcd\xcb\x8e\xfb\x26\xae\xd0\xef\xbd\x16\x31\x9f"
+ "\x1c\x8b\xd7\x77\x3d\x43\xda\x67\x71\x7d\x7d\x9b\x7d\x16\xb8\xf7"
+ "\x27\x97\xe6\x1d\xdb\x85\x6b\x4a\x45\x53\x3d\xae\x11\xf4\x7e\xdc"
+ "\x7b\x91\x06\x3a\x39\xdb\x3f\x54\x8f\xf6\x79\x9a\xf3\x04\xfb\xc2"
+ "\x72\x4f\xd4\xd1\xdf\xc0\xb7\xbe\x78\x64\xbc\x74\xdd\xec\xc8\x99"
+ "\x0e\xf4\xc6\x6f\x6d\x47\x7c\x9f\x27\x86\xc7\x70\xbd\x6e\xe9\x8d"
+ "\xf9\xbf\x5b\x32\x5b\x82\xc5\xdc\xdf\x34\xd7\x37\x7b\x9f\x19\x1e"
+ "\xe3\x32\xf6\x27\xe1\x18\x2f\x00\xf7\xd7\xd1\x31\x50\xfd\xad\x01"
+ "\x63\x3d\x63\xdc\x4a\x43\x0a\xe6\x64\x69\x39\xf1\x76\x08\xdd\xa3"
+ "\x6c\x31\xf4\xbf\x8a\x7e\x58\x4d\x17\x53\x69\x3c\x26\xff\x09\xc9"
+ "\x36\x1e\xef\xa3\xf2\x44\xd0\xdf\x1a\xf0\x1a\xcd\x75\x80\x6d\xde"
+ "\x76\xdc\xe2\x96\x7c\x41\x36\x6d\x02\xdd\xe7\x41\xa0\x15\x95\xdd"
+ "\xe1\x77\x48\x23\xb1\xb6\xb2\x1c\xb4\x2c\xf6\xbe\xe0\x8f\xed\xc7"
+ "\x62\x6c\xc0\x98\xd1\x98\x07\xd6\x78\xf5\x93\x98\xaf\xd9\xba\x84"
+ "\xc6\xc1\xd6\x0d\x4a\x16\xc6\x20\x79\x23\xeb\x57\xe0\xec\x64\x25"
+ "\xed\x23\xf6\xcf\xbb\xbe\x59\x07\x0b\x7a\x84\x5f\x4b\xa6\x35\x55"
+ "\x8c\xcd\xc1\xe4\x29\x16\x1f\x9b\xd1\xc2\x7a\x49\x90\x9f\x53\x85"
+ "\x67\xa7\xde\x81\x67\xef\x13\xda\x8c\x62\x31\xc2\x5b\x40\x06\x1a"
+ "\x14\xd5\x92\xd9\xea\x2b\xea\x33\xc2\x1e\xa2\xbe\x4c\xcf\x6a\xed"
+ "\x25\xe9\x33\x6c\x0c\x65\xfb\xee\x16\x2f\x4e\x54\xcf\x9b\xbf\x54"
+ "\x3b\x27\xf1\x95\x38\x75\x6c\x42\xc2\xe2\x04\x35\x06\x69\x72\x9e"
+ "\x3f\x2c\x8f\x51\x6b\xb8\x90\x9f\xb0\x50\xca\x4f\xd8\x9a\xec\x9c"
+ "\xd3\xd3\x44\x5a\x53\xef\x8c\xed\xa2\x35\xcf\x53\x3b\x3a\x25\x57"
+ "\x04\xff\xc5\xf0\x6f\x80\xff\x52\xb4\x65\xcc\xb6\x92\x48\x58\xeb"
+ "\xa9\x9f\x89\x14\x73\xa2\x35\x0a\x7d\x8c\xea\x48\xeb\xb5\xed\x9c"
+ "\x2f\xea\x41\x98\x37\xbc\x08\xeb\xef\x80\xfb\xe1\xdf\x00\xff\xa5"
+ "\xf0\x4f\xef\xe3\x3e\xa5\xfb\xe5\x8b\x9c\xaf\x31\xff\x91\xd5\xbb"
+ "\xb0\x0e\xbf\x1a\x3f\xd9\x63\xfe\x75\x56\xcf\xa5\x0f\x4a\x3e\xf3"
+ "\xaa\x58\x8f\x7e\xdb\xef\xba\x9a\xa8\xdd\xd4\xf3\xe1\x33\x2f\x15"
+ "\x0a\xf5\xa8\xaf\x8d\xf8\x3e\x98\x6b\x00\xea\x8b\xf5\x7c\xf9\xcc"
+ "\x96\x81\x42\x3d\xba\x56\x70\x99\x4a\x77\xcf\xed\xc4\x67\x16\xf7"
+ "\x12\xea\xa9\x9c\xdb\x73\xaa\xe3\xc7\x65\x9e\x2b\xc0\x3a\xdc\x6a"
+ "\xdf\x60\x26\x3b\xb5\xe6\x41\x7d\xb7\x31\x5a\xbd\xa3\xd3\xcd\x48"
+ "\x57\x3a\x69\x5f\x99\x1f\x3b\x64\xfe\xa2\x24\xcc\x34\x95\xb8\x78"
+ "\x59\x22\x1e\x17\xcd\xf9\x23\x3d\x2c\x9e\xfd\xea\x2b\xec\x47\xe2"
+ "\xc2\x70\xfc\xb1\x10\xf8\x0d\x8f\xf3\x96\x69\xf1\xf0\xca\x62\x2c"
+ "\x26\xc7\xf5\x5d\xf6\x0a\x1e\x5c\xf7\x81\x6a\x5a\x32\x6f\x36\x00"
+ "\x6f\xd4\x30\x9c\xbd\x09\x3a\xd2\xa5\x5e\x54\x8e\x5d\x6d\x22\x47"
+ "\x35\x36\x22\xda\xb5\xe4\x31\x47\x6c\x0a\x8c\x39\x12\xb8\x5a\xfb"
+ "\x4a\xa0\x6d\x7e\x2c\xac\x19\x20\xcb\xda\xc2\x4d\x64\x01\x11\xb0"
+ "\x71\x1d\x8d\x73\x9a\x79\x33\x43\xf0\xed\xf4\xe5\x74\x83\x22\x30"
+ "\x7e\x3f\x94\x69\x9e\x6d\x28\xc7\x41\x79\x2d\x94\x31\xbf\x76\x30"
+ "\x94\x47\xa1\x4d\x0a\xca\xa1\x50\xee\xc5\xe9\x34\x51\xb8\xc7\x18"
+ "\xca\x6a\x28\x87\x41\xfb\x3a\x71\x5e\xb8\x97\x95\x6d\x45\x62\xee"
+ "\x6f\x96\xe7\xdb\x66\x70\xe4\xf9\xc6\x7c\x4e\x69\xaa\x19\x74\xfd"
+ "\xa5\x32\x88\xad\xde\x27\xf4\xe1\x24\xa8\x53\x2f\xae\x97\xcc\xde"
+ "\x61\xb3\x88\xf1\x53\x98\x3d\xc3\xee\xeb\x94\x2f\x1d\xcb\xc1\x62"
+ "\xbe\x74\xb4\x77\xd1\x7c\x8d\x70\xe4\x33\x31\x9e\x2c\x5f\xe8\xd6"
+ "\x96\x47\xf3\x7c\xda\x57\x60\x6c\x5e\x73\xfa\x3c\xc5\x2f\xb7\xa3"
+ "\x0d\x0d\xca\x2c\xb6\x24\x7f\x85\xd8\x69\x7e\x28\x31\xee\x9c\x73"
+ "\x2c\x09\xb7\xfb\xa1\xbe\x00\x99\x81\xe6\xbb\x5a\xb8\x38\xd0\x36"
+ "\x27\x96\xc9\x81\xf6\x53\x0c\xbf\x9e\x1d\xc7\xe4\x05\x7b\x09\x3f"
+ "\x89\xe5\x44\x31\x11\x6e\x0c\x8b\x3d\xb5\x70\x31\x0f\xf7\x06\x26"
+ "\xcf\x89\xa5\xe7\xa0\xde\x1a\x90\xd5\x84\xfe\xbd\x6f\xec\x85\x7b"
+ "\x5c\x39\x21\x46\x86\xbd\x70\xd6\xc3\x19\xf8\x1c\x7f\x2a\x87\x7c"
+ "\x41\x02\x30\xdf\x26\xf6\x6d\xbb\x53\x5c\xbc\x8d\x70\x0e\x7d\x48"
+ "\x9b\x27\x91\x00\x8c\x03\x2c\xf4\xa5\x90\xe5\x0f\xe3\x22\xc5\x58"
+ "\x53\x26\x38\xe7\xfa\x3e\x93\xfe\x40\xb9\xb2\xcf\x2b\x7d\xa3\x46"
+ "\xc3\xaf\xbe\x42\xca\x6a\x67\xde\xec\xd5\xdc\x6d\x68\x64\xf3\x9e"
+ "\xb1\xbf\x61\x79\x49\x39\xd0\xff\xed\x54\x17\xe2\x50\x07\x6e\x89"
+ "\xce\x63\x3e\xa8\x5c\x19\xc6\xdd\xe5\x32\x51\x9e\xc4\x7d\xd3\x5c"
+ "\x31\xf2\x2c\xaf\x7a\x36\x6a\xc7\x2a\x8c\xf1\xac\x80\x31\xe6\x76"
+ "\xe3\x35\x21\x86\x97\x92\xc6\xb8\xb2\x93\x50\xba\x47\x18\x64\x14"
+ "\xdc\x83\x7a\x51\xa1\xa8\x40\xb9\x03\xed\x49\x5c\x26\x37\x19\xf9"
+ "\x16\x68\x8c\x31\x44\x2c\x7c\xb7\x41\x1a\x3e\xe8\x59\xcc\x71\xe8"
+ "\x8b\xb2\xae\x51\x85\x63\xc6\x63\xcc\x80\x91\xf0\x3f\x8d\xe5\x9e"
+ "\x79\xb9\x41\x6c\x13\xca\x01\x20\x43\xcd\x80\xa3\xaa\x25\x93\x1f"
+ "\xe3\x94\x93\x4f\xd8\x13\xcd\xcf\xc7\xd8\x6f\xd8\x36\x95\x9d\x15"
+ "\x8a\xfd\x4c\x06\xe1\x13\x4d\x44\x35\x90\xcd\x45\xcc\x35\xfa\xe6"
+ "\x3a\xe1\x37\xc8\x3f\xcf\x98\x5d\xda\x38\x29\xda\x4a\x19\x4f\xc3"
+ "\x9a\xa7\x24\x23\xe1\x7f\x1a\xd4\x3f\x60\x22\xff\x41\xeb\xaf\x51"
+ "\xd2\x7d\x92\x17\x7d\x42\x71\xbf\x3b\x5f\x2d\x9e\xef\xa4\x88\x84"
+ "\x31\xc5\x9c\x6e\x6c\xee\x37\x77\x7b\x76\x20\x94\x2d\xa2\x8d\x85"
+ "\xda\x5c\xb2\xd0\xaf\x4b\x2c\x3f\x1b\x09\xe5\x60\xb1\x0c\xbf\xd5"
+ "\x22\x56\xa0\x4d\xa2\x39\x3d\x7a\x0b\xea\x9d\xaf\x84\x82\x5c\x08"
+ "\xf2\x0d\x5c\x07\xfa\xbf\x39\x86\xdd\x9b\xab\x6f\xce\xdc\xa0\xb5"
+ "\x74\xdb\x63\xb2\x00\xfe\xc1\x35\x90\xff\x16\xd6\x0a\xed\xc4\x99"
+ "\x7c\xef\x2b\x17\xdf\x8d\xcb\xf4\x09\xe4\x36\x45\xa8\xe8\x3b\x2a"
+ "\x14\x05\xf0\x3b\xd8\x1c\x34\xb0\x01\xea\x01\xfd\x6d\xf9\xb4\x5e"
+ "\xd2\x65\xfd\xfa\x1b\xaa\xc9\x46\x90\xe0\x0d\xaf\xde\xc0\xf1\xa3"
+ "\x3e\xd9\x1b\x52\x54\x51\x28\x77\x62\x1c\x10\x9a\x13\x0d\xe3\x5b"
+ "\xda\x88\x1f\xcd\x29\xb0\xe9\xcf\x79\x34\x96\xfe\x72\x4d\x80\x18"
+ "\xdb\x92\xd7\x0d\xac\xe5\x95\x8b\x2d\x18\xef\x92\xe6\x0e\x69\xd1"
+ "\x74\xa5\x31\x2e\x85\xd8\x96\xdb\x92\x48\x70\x3e\xc7\x62\x5b\xd2"
+ "\x18\x21\x7e\xa0\xa7\x24\xb9\x8f\x6f\xc9\x67\xee\x1a\x23\xc6\xb7"
+ "\xe4\xaf\xdb\xad\xf0\x3b\x0c\xc6\x03\xf3\xbf\x6b\x68\x59\x8a\x37"
+ "\xe5\xeb\x36\xde\xa5\x12\x70\x4f\xc9\xe2\x5d\x7a\xb5\x5e\x28\x14"
+ "\xd4\x2e\xdb\x92\xa5\x00\xfc\x5b\x49\xf3\x02\x3a\x9d\x2b\x81\x37"
+ "\x11\xe2\x1b\xf0\x71\xc2\xb9\x1a\x13\x79\x23\x5f\xd0\x4b\xcd\xa8"
+ "\xe3\xe7\x50\xdb\x18\xd7\xc4\xdf\x8c\xdb\xe2\x0e\x73\xae\x76\xfb"
+ "\x28\xe6\x2a\xc6\xa7\xc8\x52\x86\x9a\x14\xca\x54\xbc\x97\xea\x92"
+ "\x0a\x65\xa8\xeb\xbc\x9e\xfb\xca\xe2\x79\xb1\xb3\x17\xc4\x6b\xd5"
+ "\x93\x26\x8f\xa4\x89\x12\xfb\xaa\xe7\x27\xc6\xd2\x25\x49\x3d\x69"
+ "\xf4\x88\x09\x13\x26\xcf\xfe\xc3\xe4\xe1\x93\xa7\xfc\x61\x28\xdb"
+ "\xb1\x38\x39\x61\x05\x26\xdb\x4c\x5c\xac\xc6\x9b\xe6\x0a\xd9\xc4"
+ "\x53\x62\x13\x16\xbb\xe2\x41\x30\xb5\x73\x29\xa9\x4d\xd7\x82\xbf"
+ "\xa9\x2d\x4d\xa1\xdc\x27\xda\xb8\x28\xf6\x29\x94\x3b\x71\x6c\x69"
+ "\xae\xf1\x2c\x65\x5f\x94\xaf\x84\x3c\xef\xb8\xee\xf8\xe2\x9c\xc6"
+ "\xf5\x07\xde\xc5\xe4\x1c\x9b\x8b\xdd\xeb\xe3\xab\xc4\xfb\x84\xb9"
+ "\x2c\x9c\xeb\xc1\xf7\xec\x99\x4e\xe3\x6b\x65\xf9\x04\x8b\x76\x6f"
+ "\x3c\x27\xf6\xa1\x0e\xeb\x64\x29\x67\x3a\xf2\x09\x67\xf9\x44\x48"
+ "\x79\x28\xe9\x9f\x6c\x8c\x08\x41\x71\xa6\x13\xc8\x2a\x7e\xf0\xdf"
+ "\x19\xff\xc7\x38\xf0\x3d\x89\xaf\x41\x9d\x2d\x50\x01\x6b\x70\xb2"
+ "\x0f\xcb\x63\x95\x55\x4d\x73\x2f\x4c\xb0\xdb\x7c\x66\xdb\x95\x70"
+ "\xf4\xe1\x67\xdb\x7d\xa9\x9e\xc8\x27\xf1\xd5\x74\xaf\x7d\x12\x5f"
+ "\x85\xf9\xda\x80\x8f\xd7\x4d\xb0\xa5\xad\x9b\x60\xe7\x6d\xb3\x41"
+ "\x7e\x87\xe3\x77\xb8\x67\x7c\x82\xfd\x3b\x9e\xe6\xac\xc1\xbd\xf5"
+ "\x2c\xce\x60\x29\xfa\x50\xce\x02\x1e\xde\x7e\x95\xe5\x24\x9e\xb0"
+ "\xe2\xfb\x73\xb3\x57\x98\x58\x4e\xe2\x2b\x2c\x8f\x37\xcb\x75\x4e"
+ "\xd2\xa0\x9d\xb2\xd9\x76\x1f\xf5\x04\xfb\x4d\x9e\xee\x7b\xcd\xf2"
+ "\x55\xb7\x97\x67\x18\x31\x76\x69\x0f\xa2\xc4\x7d\x74\xf6\xbf\x3c"
+ "\xad\xc3\x98\x82\xe9\x66\xde\x8a\xb1\x69\x0e\xdd\xa8\x51\xaa\x93"
+ "\x7c\x61\xdc\x7c\x47\x57\x6a\xc3\xdd\xef\x7b\xce\x1e\x14\xc5\x6f"
+ "\x7e\xce\xc2\x67\x0f\xee\xcb\x6f\x1e\x96\xc8\xeb\x22\xfa\x22\xde"
+ "\xf3\xd9\xcf\xfa\x43\x19\xce\x0f\xad\xe7\x37\x47\x26\xf2\xd9\x91"
+ "\x06\x38\x42\x79\x64\x3e\xbf\x79\x38\x94\xbb\xaf\x83\xfb\xcc\x7c"
+ "\x76\x88\x15\xea\x69\xf9\xec\xd0\x38\x38\x42\xb9\x47\x0d\xd4\x83"
+ "\xf2\x43\x63\xe0\x08\xe5\x5e\xc5\x17\x15\x9d\x54\x70\x0f\x9c\x7b"
+ "\x3e\x99\x3d\xeb\x85\xb5\xf4\x59\xd9\xe3\x74\xec\x19\x13\xf2\xd9"
+ "\x33\x26\x15\xb2\x67\x4c\xd9\xc7\x9e\xf1\x88\x06\xea\x5b\xf9\x6c"
+ "\x75\x30\xd4\x4b\xe6\xb3\x1f\x23\x70\x84\xf2\x2f\x9b\xa0\x1e\x94"
+ "\xfb\xe0\xb3\xa0\xfc\xab\x12\xa8\x0f\xe5\x27\x8a\xa0\xbe\x8d\xcf"
+ "\x7e\x4a\x0f\xf5\x52\xf9\xec\x7e\xd8\x3e\x94\x07\x64\x40\x3d\x28"
+ "\x3f\xad\x85\x23\x94\x7f\x1d\x03\xf5\xa1\x1c\x0d\xef\x34\x8c\xf0"
+ "\xd9\x2f\x25\xc2\x31\x83\xcf\x9e\x01\xcf\x8b\x84\xf2\xcc\x5a\x38"
+ "\x42\x79\x36\xdc\x3f\x1c\xca\x73\x46\xc1\x11\xca\x73\xf1\x5d\x7d"
+ "\xf9\xec\x79\xf0\x9c\x61\x6b\xf9\xec\x57\xe1\x9d\x23\xa1\x1c\xa7"
+ "\x86\x23\x94\xe7\x43\x7f\x86\x43\xf9\x8f\x78\x1f\x94\xe3\x61\x0c"
+ "\x86\xc1\x18\x6b\x43\xe1\xb8\x8e\xcf\x4e\x68\x80\x7a\x50\x5e\x56"
+ "\x0c\x47\x28\x27\xc3\x18\x0e\x87\xf2\xca\x68\x38\x42\x39\x0d\x9e"
+ "\x3f\x2c\x80\xcf\xce\xb0\xc1\x71\x3d\x9f\xbd\xa6\x0a\xea\x41\x39"
+ "\xab\x00\x8e\x50\x7e\x03\xc6\x6f\x38\x94\xd7\x8f\x83\xe3\x7a\xf7"
+ "\xf4\xdc\x58\xc2\xaf\xf6\x83\x3e\x6f\x9d\xc1\xaf\xee\x0c\xc7\x6d"
+ "\x01\xfc\xea\x4e\x1a\x3e\x5b\x7f\x00\xce\xc3\x71\x9b\x15\xca\x7d"
+ "\x85\x32\x1c\xb7\xd7\x43\x39\x5c\x28\xc3\x71\x07\xc8\xe3\x9d\x06"
+ "\x0a\x65\x38\x16\x60\x79\x30\x9f\xbd\x13\x8e\x7e\x78\x8c\x82\x72"
+ "\x84\x50\x86\xe3\x7f\xe7\xc3\x11\xc6\xf4\xbd\x75\x70\x3e\x92\xcf"
+ "\xfe\xaf\x31\x50\x86\x63\x81\x3f\x94\x47\xc1\x71\x21\x94\x47\x99"
+ "\xfb\xf4\x2f\x42\x5e\xe5\x42\x3a\x15\xf1\x21\x23\xb5\xe9\xd7\x88"
+ "\x12\x79\x14\x73\x78\xc0\xda\xfc\x68\x9d\xc2\xef\x72\x51\x9a\x89"
+ "\xca\x0c\xf6\xdc\xe7\xcc\x5c\x08\xb5\x77\xf9\x41\xbd\xce\x17\x15"
+ "\xfe\x3d\x10\x8f\x8c\xa9\x26\x9a\x47\x50\x88\x8f\xe9\x57\xa7\xe8"
+ "\xdc\x1d\xe4\x2b\xcc\x05\xa1\x84\xf1\xea\xcb\x67\x76\xba\x0a\xc7"
+ "\x5d\x7c\xe6\xfd\x75\x30\x5e\x50\x0e\xfa\x02\x8e\x50\xfe\x8f\x37"
+ "\x61\xbc\xa0\xfc\xf2\x08\x38\xee\x6a\xc9\xea\x9c\x68\x52\xf8\x2e"
+ "\xa4\xf8\xb2\x67\x6c\x78\xa0\x8d\xe7\x27\x00\xd2\xf2\xef\xc6\x17"
+ "\x05\xda\x0c\xc0\x63\x13\x75\x81\x18\xe7\x71\xe7\x00\xe8\x6b\x57"
+ "\x03\xf6\x09\x73\xfa\xf0\x37\xc3\x94\xec\xd9\xf7\xf3\xf0\xec\x77"
+ "\x31\xf7\x04\x1f\xf2\xb8\xa7\xeb\x87\xe9\xf5\xc7\x16\x85\xb3\xeb"
+ "\xfe\x44\xba\xfe\x32\x5e\x3f\x1f\x88\x31\xdc\x1f\x7f\x9c\x5e\x37"
+ "\x5a\x1a\x84\xf7\xf2\xc1\x6b\x76\xac\x6b\x52\xf8\xab\x19\xfe\x77"
+ "\x86\x35\xce\x87\x34\xab\x22\x42\x5b\xb2\xfc\xc3\xa1\xef\x7d\x05"
+ "\xf9\x3f\x82\x57\x0d\x8a\x64\xf1\x51\x86\xb9\x8d\x49\x89\xfa\x2f"
+ "\x97\x33\x2d\x74\x03\x60\x28\xea\xd4\xb0\x96\x2a\xd5\x69\x61\xc5"
+ "\x75\x8a\xfb\x6c\xdb\x50\xe6\x0a\x5e\x68\x66\xd8\xea\x7f\xf8\xe6"
+ "\x5b\x11\xf3\xd4\x29\x81\xf0\xfc\xfb\xec\xe9\x56\xfe\x9a\x21\x6d"
+ "\x04\xe0\x32\x3d\xaf\xa7\xfb\x8f\xd8\xef\xf5\xd4\xaf\x94\xfd\x4e"
+ "\xa6\x36\x6c\x68\x0b\xef\x75\xd6\x61\xec\x59\xa5\xa5\x5c\x48\x3c"
+ "\xa1\xdf\xe5\x15\xfe\x47\x3f\xe1\x4c\xca\xc0\x44\xd2\x49\x9d\x72"
+ "\x08\xdb\x0f\x90\xe9\xbb\x8e\xba\x78\xcd\xff\x87\x83\x50\x77\x2b"
+ "\xda\xa6\xb2\xee\xeb\xe5\xc8\xcf\x0c\xef\xf0\x27\x5c\x47\x95\x04"
+ "\x73\x93\xf9\x52\xf9\x59\x71\x5f\x3e\xee\x94\xb2\x05\x47\x11\x5b"
+ "\x4e\x27\xbd\x3d\x67\xa1\x99\xcf\x8d\x27\x5d\x6d\x0a\x16\x57\x58"
+ "\x71\xdf\x89\x01\x56\x94\x57\x8f\x61\xdd\x37\x38\xbf\x2f\x43\xfb"
+ "\x27\x13\xa5\x21\xe1\x34\x96\xcb\xf8\xac\xb3\x11\xc6\xa6\x1a\x62"
+ "\x48\xa0\x6d\x95\xf2\x59\xd7\xc2\x39\xbf\x4b\xc9\xdb\x51\xee\x4f"
+ "\x46\xbb\xdd\x17\x78\x7e\x3c\xd0\x05\xd6\xa4\xfb\x0a\xc5\xbe\xe0"
+ "\x7a\xb4\x01\xc6\x0e\x65\x72\x8c\xa5\x31\xdb\x6e\xc7\xd8\x74\xeb"
+ "\x4c\x30\x0e\x8c\x5e\xf7\xad\xc7\x1c\xf1\xc2\x73\xcf\x73\xdd\x22"
+ "\xa2\x2a\x67\xe0\x37\x48\x7f\x8c\xf5\x75\x8d\xee\xbf\xc7\xcc\xc9"
+ "\x1c\xca\x10\xac\xae\x33\xed\xe6\x0b\x71\x07\xe6\x2f\x4a\x4c\x58"
+ "\xa2\x5e\x3a\x3f\x25\x76\x68\x9f\x65\x7d\xd5\x09\xc9\xea\x04\x5c"
+ "\xc2\xd9\x09\x58\xe6\x97\x2e\x5c\x9c\xa8\xc6\x8c\xe6\x6d\xf3\x21"
+ "\x87\xf2\xaa\x08\x0d\x95\x57\x15\x81\xd4\x46\xc0\xeb\xe3\x0b\x13"
+ "\x53\x79\x4e\xfd\x58\x67\xfe\x8a\xa2\x4b\x7e\xab\x5f\x17\x1a\x87"
+ "\x84\xcb\x54\x53\xbd\x11\xd6\xed\x80\x2d\xdd\x08\xee\x11\xf4\x6f"
+ "\xc9\xea\xe2\xc8\x7f\x6e\x52\x04\xd6\x52\x5b\x4c\x56\x97\x42\xe0"
+ "\xc7\x71\xc2\xb7\x38\xb6\xc7\x46\xb8\x46\xbf\x55\x67\x75\x29\x05"
+ "\xbd\x74\x17\xa5\x95\x3e\xde\x9f\xad\xe9\x5d\xac\xf4\xd9\xea\xf8"
+ "\x42\xbe\x60\x40\x11\xc8\x85\x0a\xfa\x5d\xd0\xf6\x28\x6f\x24\x57"
+ "\x69\x2c\x02\x98\x6b\x2a\x8c\x01\x62\xcf\x1d\xa1\xe3\x42\x26\xaa"
+ "\xb8\xbf\x84\x6b\xd3\xdf\x25\xca\xbd\x80\x05\xbe\x6a\x98\x0f\x8f"
+ "\x91\x47\x0f\xa5\x35\x28\xaf\x28\xee\xbf\xef\x50\x5a\x8d\x92\xcf"
+ "\x19\x19\xd7\x1c\x36\x3c\xcf\x2a\xe4\xcd\x36\xda\xac\xe4\xf3\x51"
+ "\x04\xf5\xc2\x62\x4b\xf7\xe9\xf0\x3f\x22\xd9\xba\x79\xae\xda\xf0"
+ "\xd8\x33\x64\xf4\x13\xfc\xf7\x9f\x95\x10\xd2\xa4\x08\x2c\xf9\x6c"
+ "\x14\xea\x2a\x11\x6a\xab\x2a\x22\xcc\x92\x1b\x85\x7b\x7b\xcd\xad"
+ "\xb9\x73\xb5\x37\x42\x46\x99\x8f\x40\x9d\x63\xa0\x4b\x1d\x87\xd9"
+ "\x86\xb1\x66\x5b\x1f\x1f\x40\xf6\xde\xd0\x29\x4b\x4b\x22\x98\x1d"
+ "\x39\x06\xe6\x0c\xe5\xa7\xfb\x77\x7f\xb6\xaf\x84\xc0\xb3\xe1\xfa"
+ "\x18\xe5\xe7\x83\xdb\x5c\xaf\xf8\x2c\xbc\x84\xb4\x60\xcc\x66\xd0"
+ "\x55\x0f\x9e\xce\x23\x7c\xee\xb4\xaa\xdd\x29\x56\x25\x08\xe2\xca"
+ "\x8a\x9a\x3c\x92\x7a\x81\x3c\x60\xfb\x5e\xe3\xfb\x21\xdc\xdf\x8a"
+ "\x31\x55\x8f\x87\xd2\xd8\x8a\x69\x06\x9a\x13\x37\xb0\x12\xe4\x0f"
+ "\xee\x7b\x8d\x5f\xe5\x64\x03\x81\xeb\x5f\xd9\x7e\x1f\x4a\x2a\xe2"
+ "\xcc\xc4\x18\xad\x27\xad\xca\x48\xb2\xff\x25\x3d\xd9\x0a\x7a\xcf"
+ "\xd6\x2b\x24\x80\xca\xd2\x37\x35\x7e\xb6\x9b\x1a\x5f\xdb\x4a\x0d"
+ "\xc6\xba\xe2\xf9\xef\x35\x5d\x50\xb6\xb6\x2d\xd6\xf8\x57\x9a\xf5"
+ "\x64\x40\x03\xd1\xb4\x2a\x49\x60\xeb\x4a\x4d\x97\x4a\x6d\x1e\xb4"
+ "\x05\xc2\x32\x8c\x2b\xc6\xd9\xc3\xf8\x7b\x38\x4e\xf7\x47\x93\xc9"
+ "\x4d\x8a\xfb\x5f\xef\x52\x4d\xba\x63\x9c\x57\x94\x57\x31\x46\x34"
+ "\x17\x3c\xad\xca\x1e\x1c\xa5\x4b\xbb\x06\xfd\xc2\x38\x46\x7b\xc6"
+ "\xaa\x50\xde\x07\x59\x46\x81\xef\xcc\xf1\x9a\x2e\xb3\xf1\xf8\xd6"
+ "\xc0\xaf\x50\xe6\xe7\x5a\x42\x31\xdf\x94\x3f\xf6\x13\x73\x3f\xaf"
+ "\x3a\x0f\x63\x99\xae\xf1\x85\x7a\x01\x70\xbe\xab\xb1\xc9\x4a\xec"
+ "\xfd\xc6\xaa\xfb\x6b\x69\x4e\xdf\xe0\xed\x69\x44\xa5\x4b\x23\xc1"
+ "\xea\xff\xa0\xbc\xb4\xd3\xbe\x7b\x2c\xc8\x92\xbd\x92\xd1\xbe\xc3"
+ "\xce\x75\x7d\x5d\xfd\x3c\x21\xea\x67\xe8\xef\x7e\xea\x21\x40\xc3"
+ "\xe0\x69\xe1\x54\x1f\x41\x1d\x58\xd1\xb5\x37\xe3\xf1\xae\x3d\x5a"
+ "\xfd\x5e\x3d\xc0\x65\x6d\xa9\xe1\x56\xfb\xf6\xc2\x7c\xdf\x57\x14"
+ "\x0f\xd8\xf9\xec\xbf\x8d\xe2\x73\xe6\x52\x5e\x84\x72\x6b\xab\x5f"
+ "\xa8\x1a\xce\x15\x42\xfb\x11\xad\x0a\xdf\x6a\xf8\xaf\x61\xf7\x3f"
+ "\x60\xc6\xf7\xb6\x17\x0c\x58\x87\xef\x4d\x73\x14\xc1\x7b\xcd\x06"
+ "\x9a\xf1\x21\x53\x4d\x34\x6e\xff\x4d\x18\x5f\x21\x87\x2b\x8e\x07"
+ "\x8e\x01\x77\x53\xd3\x85\xbe\xeb\x4d\x4d\x00\x8c\x2f\xc6\x74\x0e"
+ "\x4c\x9b\x03\xf7\xe4\x4e\xb5\xc0\xb5\xae\xad\xc1\xd3\x34\x98\x2b"
+ "\xcc\xa8\x35\x13\xfb\xe6\xa9\x66\x8c\x59\xb8\x25\x05\xe6\x5c\xf7"
+ "\xa9\x26\x7e\xf3\x54\x71\x6e\x11\xec\x27\x97\xfd\x37\x4b\x2b\xee"
+ "\xd5\x83\xbe\x41\xff\xaa\xe1\xbf\xc6\xa4\x78\x20\xb1\xb5\xcf\x80"
+ "\x3c\x38\x8e\x81\xbe\xf6\xe2\xb3\x06\x16\xe2\x6f\xb8\xd6\x0b\xde"
+ "\x79\x26\x8e\x03\x8e\x87\x30\x16\x53\xa4\xb1\x88\xa9\x87\x7a\xa3"
+ "\xb8\xac\x9c\x54\x93\xa2\x6b\x18\x9f\x35\x20\xce\xa9\xde\x2a\xa9"
+ "\xde\xc2\x75\xac\xde\x8e\xbe\xac\xde\x6f\x4d\x40\x87\x1e\xc2\x78"
+ "\x1f\x76\x33\xde\xfb\xa5\x7b\xa7\x84\xb3\x7b\xdf\x38\xc0\xee\x0d"
+ "\x83\x7b\xbb\xfe\xe0\xd2\xa7\x4b\x52\xfd\x09\xf3\x58\xfd\xb5\x0b"
+ "\x59\xfd\x47\x77\x49\xf5\x02\x83\xa4\x7a\x2f\x99\x59\xbd\x8d\xbe"
+ "\xac\xde\x93\x01\x70\x7d\x7c\xdb\xbe\x04\x8e\x96\xee\x49\x4e\x64"
+ "\xf7\x7c\xa0\x66\xf7\x8c\xca\x87\xeb\xab\xe4\x7d\x09\x5c\x26\xd5"
+ "\x4f\x10\xde\xbb\xa0\x88\xd5\x1f\x36\xc6\xa9\xde\x36\x81\x27\xe0"
+ "\xfa\x5e\xa8\xd7\x35\xb4\xd5\x2f\x2d\x9a\xd5\x7b\xa1\x01\xf9\x11"
+ "\xea\x7c\xc2\x65\x3d\xe2\xdf\xea\xd7\xd3\x02\xed\x04\x00\x6d\x42"
+ "\xf1\x08\xb4\x0b\xe5\x74\x11\xd0\x87\x80\xb5\xf8\x9d\x08\x31\xd7"
+ "\xa4\xe8\x32\x0f\x70\xd7\xee\xd6\x96\x96\x15\x68\x73\xd8\xf2\x38"
+ "\x90\x1f\x36\x3f\x67\xf0\x98\x23\x1a\x65\x88\xdc\x61\x2a\x1d\xc7"
+ "\x72\xcd\x03\x8f\x82\xfc\xa3\xea\x03\x6b\x61\x06\x8d\xdd\x9c\x33"
+ "\x51\xc7\x85\x01\xc6\x5e\x26\x3e\xc6\xd4\x06\x52\xc4\x35\x28\x75"
+ "\x37\x88\x6f\x25\x3c\x01\xeb\x17\xc1\x9a\xaa\x5e\x84\xb2\x85\x6a"
+ "\xa8\xee\xba\xd0\x9e\x3e\xbe\x28\x3d\x9e\xe5\xd7\x46\x39\x0c\xb1"
+ "\x19\xe6\x63\x00\xcd\xfb\xb6\xa8\x33\xd6\x5d\x02\xbf\xfd\xb1\x6e"
+ "\xeb\xe3\xfd\xc3\x5b\xdf\x8b\x2f\xba\x11\x32\xd2\x7c\xe3\x2f\x4f"
+ "\xab\x6e\x86\x4c\xd4\xdd\xcc\x8d\x52\xd9\xde\x8b\x57\xdb\x1e\x1f"
+ "\x50\x64\x0f\x19\xa5\x85\x67\x03\x6e\xe7\x29\xf7\x70\x45\xca\x3d"
+ "\x69\x06\x25\xb6\x7b\x28\x4d\xaf\x3c\x98\x56\xa5\x3c\xc8\x15\x2b"
+ "\x0f\xa5\xe9\xe0\x58\x88\x39\xc0\x40\xde\x53\x1d\x3e\x98\x56\x0a"
+ "\xeb\x46\x10\x81\x79\xd0\x20\xda\x42\xf9\x11\x36\x52\x59\x68\x23"
+ "\x47\x13\xaf\x11\x73\x50\x84\x06\xfe\xfb\x9a\xbb\x4f\x0b\x35\x77"
+ "\x9f\xab\xa6\x7d\x0e\x89\xa6\xef\x88\x7b\x5d\x0f\x72\xac\xcf\xc2"
+ "\x78\x40\x9b\x41\x4f\x6c\xc7\x6f\xbe\x62\x5c\x6b\x45\x50\x7d\x9b"
+ "\xb8\xd6\x4a\x96\x7f\xce\x11\xdb\xfa\xa7\x88\x6b\x2d\xd8\x1c\x68"
+ "\x5c\x6b\xd0\x1f\xa9\x1e\x09\xeb\x17\xcd\x59\x69\x03\xf9\x6c\xf3"
+ "\x04\x2d\xea\x8b\x28\x8f\xb5\x64\x75\x53\x89\xfa\x1e\xca\x18\xf6"
+ "\x4d\x11\x83\xe1\x7f\x20\x9c\xd7\x98\x14\x1f\xad\x15\xcf\xf3\xb9"
+ "\x7e\xf8\x3d\xc0\xc7\xce\xc7\x3d\xd7\x82\xfb\x37\xf9\xb8\x61\xf6"
+ "\xcd\x23\x32\xec\x9b\xe7\x12\x38\x17\x01\xff\x43\xed\x9b\xfd\xf6"
+ "\xc1\x7f\x31\xfc\x1f\x80\x7f\x03\xfc\x97\xc0\x7f\x29\xfc\x57\xc1"
+ "\x7f\x35\xfc\xd7\xc0\x7f\x2d\xfc\x9b\xe0\xbf\x9e\xef\xee\x57\x8e"
+ "\x71\x39\xa1\x6d\x33\xd0\x3d\x54\x6c\x57\x1a\xdf\x6e\x1b\xe0\x7d"
+ "\x23\x51\xfe\x01\xbc\x8a\xe1\x19\x5e\x85\xf2\x3b\xfb\x17\x23\xee"
+ "\xf2\x7d\x86\xe7\x99\x7b\xc7\xeb\xcd\xdd\xa3\xf5\x70\xf4\x37\x07"
+ "\x69\xd5\xf0\x0f\x34\xd4\x86\x9b\x37\x4f\x0b\x07\x1a\xfa\x03\x2d"
+ "\x0d\xf0\x2e\x30\x6f\x7a\x54\x31\xbb\xd4\x2f\x80\xfe\x3d\xcc\xc2"
+ "\xef\x00\x93\x22\x84\xee\xc1\x81\x36\x32\xa0\xdc\xcb\xa4\x78\x90"
+ "\xd6\x6b\x0e\x99\x16\x29\xec\xfd\xc4\xf3\x03\x4d\xbe\xbf\x24\xac"
+ "\x5e\x94\x4c\x76\x8a\x7f\x45\x3b\x3b\x7e\x4e\xf2\xec\xa5\x0b\xe7"
+ "\xbf\x12\xbb\x74\x88\xba\xcf\x3c\xb5\x66\x7e\xc2\x92\xd9\x4b\x96"
+ "\xc5\x2e\x8b\xa5\xa2\x13\x9c\x7a\x42\xee\xd7\x86\xb9\x3b\x6c\xa0"
+ "\x07\x74\xad\xe7\x79\x5c\xb3\xc6\x59\x80\xcf\x1e\x8b\x2f\x3a\x70"
+ "\xc5\xac\xb4\x83\xec\x12\x50\x9f\x01\x73\x6f\xa2\xee\xc0\x15\xab"
+ "\x32\xa0\x5e\x4d\x78\xe0\x77\xbc\x66\xac\xaf\x12\x64\x99\x2f\x48"
+ "\x39\xca\x32\x50\x67\xcf\x22\xab\xf2\x45\xbc\xff\x2f\x03\x8a\xf6"
+ "\xc2\x6f\x38\xa7\xc2\xfb\x78\x90\x6f\xe8\x11\xe4\x1b\x56\x1e\x69"
+ "\x3e\x48\x8f\x51\xaa\x83\xb4\xde\x28\xed\x21\x3c\x5e\x5f\xc5\x97"
+ "\x43\xbb\x68\x6f\xe3\xff\xd2\x3f\x9c\xd6\x81\xf9\x46\xeb\xc0\x5c"
+ "\xab\x53\x04\x97\x62\x3d\xaa\x53\x40\x1f\xf7\x42\x3f\x40\xe7\xf7"
+ "\x15\xe7\x2f\xea\x10\x8e\x39\x9c\x84\xb2\x5e\xf0\xd3\x38\x87\xb1"
+ "\x3f\x3c\xcc\xd9\xdd\x70\xef\x9e\x45\x66\x66\x9b\xbd\x86\x58\x61"
+ "\x22\x88\x13\x88\x0f\xc6\xd4\x2a\x7a\x7f\x11\x57\xa5\x44\x3d\x04"
+ "\xee\x5d\x82\xd7\x68\x8e\x12\x2a\x8f\x07\xef\x12\x65\x60\x31\x47"
+ "\x49\x40\x0c\xf0\xc6\x5c\xf2\xe8\x15\xc5\x2f\x5e\xc7\xf1\xc3\xf1"
+ "\xc2\x6f\xb2\x7c\xd6\x2f\x46\x61\xfc\x85\x6d\xdd\x88\xbf\xad\xfb"
+ "\x42\x2b\xb3\xd7\x04\x37\x89\x72\xa5\x25\x78\xa1\xd5\x99\x6e\x8c"
+ "\x5e\xea\xd8\x45\x73\xe6\x2e\x8c\x9d\x47\x3f\xe3\xcd\x59\xba\x74"
+ "\x59\x7c\xac\x3a\x76\xce\x2b\x71\x6a\x7a\x59\xbd\x6c\x29\x54\x99"
+ "\x9f\xb8\x54\xbd\x78\xf9\x22\x75\xfc\xd2\xf9\x28\x21\xc7\x26\x24"
+ "\x2c\xd3\x26\x76\x21\xec\x4e\x75\xfc\xb2\x85\x89\xf3\xb5\xf0\x63"
+ "\x69\xec\xa2\x79\x6a\x4a\xf5\xa5\xd0\xd4\xc2\x85\x6a\xe1\x09\x4b"
+ "\xe3\xe6\x24\x20\x23\x2c\x7a\x0d\x2a\x39\xdd\x2f\x97\x9f\x03\x30"
+ "\xc6\x1e\xfa\x76\x5d\x51\x84\x8c\x2f\xf1\x85\xb1\xce\x59\x68\x45"
+ "\x9f\x08\x28\x8f\xa3\x3a\x55\x56\xb0\x0d\x6d\xd7\x6f\xc3\x3b\x36"
+ "\x03\xdf\xb7\x64\x75\x2f\x15\xdf\x8d\xda\xb2\x31\xee\x28\xc6\xb4"
+ "\x55\x84\xfc\x96\xee\x41\x06\xfe\xa7\x3e\x33\x59\xdd\x03\xd9\x58"
+ "\x74\xb7\x3a\xdb\xc5\x98\x1d\x36\x24\x08\x7d\xf3\x60\x0e\x8c\x43"
+ "\xb9\x40\xc8\x13\xa1\x80\x7b\x86\xe2\x3d\xdc\xe6\xb9\xb0\x66\x84"
+ "\x84\x4b\xb2\x79\x88\x3f\xd6\xa7\xf5\xb2\xba\xbf\xc4\x77\x9f\x06"
+ "\x6b\x72\xf7\x26\xec\x97\x87\x75\x44\x7d\x1d\xda\x3d\x5e\x44\xc8"
+ "\x53\xc1\x44\x73\xfd\xad\x61\xfa\x96\x6e\x11\x91\x37\x32\x49\xe7"
+ "\x1b\x30\x97\xad\x4a\xf2\x68\x2b\xf0\xc5\x8a\xa7\x89\xcf\xaa\xf1"
+ "\x44\x59\xb4\xa0\x08\xe3\x26\x93\xf2\x31\x79\xc4\x18\x03\xba\xb7"
+ "\x75\x17\x29\x37\xd4\x91\x0a\xdb\x07\x2c\x17\x49\x0a\xca\xd6\x0f"
+ "\xfe\x15\xe3\xe4\xa5\xaf\xe2\xed\x7b\x3f\x36\x77\xda\xd3\x58\x84"
+ "\x39\x44\x1e\x35\xda\xce\x19\x8c\xa9\x05\xc4\x98\x6c\x34\x60\x8c"
+ "\x12\x18\xb7\x6d\x07\xe1\xda\x7d\xe5\x70\xdf\x8b\xa4\x33\x94\x37"
+ "\xe1\x33\xd6\xe5\xf2\x35\x6f\x84\xf0\xb5\x6f\xe4\xf2\x26\xe0\xa9"
+ "\xfa\xf5\x42\x5e\x10\xf4\x39\x40\xdf\x0a\xe4\x53\x6d\x12\x09\x6d"
+ "\x54\x3c\xa8\xa1\x36\x80\x51\xb4\xdc\x03\xca\xf4\x3b\xb6\x31\x39"
+ "\x17\xcb\x3d\xa1\x3c\x86\x95\xb7\x63\xf9\x21\x28\x47\xb3\xf2\x67"
+ "\x58\xee\x05\xe5\x38\x56\xae\x24\x34\xd6\x86\xe2\x41\x16\x7f\x20"
+ "\xf9\x2b\x2c\xc3\xd8\x3f\xb8\xce\x90\x84\xfd\x3d\x0b\x34\x7b\x70"
+ "\x73\xfa\x19\xd0\xd1\x92\x2f\xd2\xf9\x70\x28\x2d\x0e\x6d\x14\x30"
+ "\x1f\x1e\xec\x71\x7f\x2d\xea\x77\x0f\x16\xfb\x85\xe3\x31\xe4\x40"
+ "\xa0\x95\x74\x06\x79\xe9\x7e\x78\x9f\x37\x70\xec\xdc\xda\x64\xf6"
+ "\x0c\x3f\x37\xc1\xc6\x1b\xf8\x9d\x03\x0a\xf9\xcd\x93\x54\xfc\xce"
+ "\x70\xf4\x5d\x84\xb5\xec\xb9\xaa\xa2\x14\x2b\x8d\x5d\x0d\x32\x2a"
+ "\xcc\xa1\x07\xa9\x5f\xb6\x19\x64\x3e\x0f\xb1\x6c\x55\xfc\xe6\x91"
+ "\x2a\xd0\xa5\xf2\xc6\x6b\x6c\xe8\x43\x0d\x72\x6e\xe8\x1b\x47\xe3"
+ "\x50\x36\x88\x5e\xc3\x15\x84\x9b\xb9\xf4\x68\xc2\x87\x0d\x28\x1c"
+ "\x1f\xc7\x1b\x60\x9d\x52\x30\xfb\x37\x8f\xcf\x3f\x47\x9f\xdb\x67"
+ "\x40\x21\xb7\x3c\x0e\x73\x4f\x51\x7c\x49\xc3\x35\x3b\x09\xf0\x64"
+ "\x65\x74\xa0\x7d\x73\x74\xc6\xd1\xb8\x0b\xde\xe5\x31\x52\x84\x7a"
+ "\x8e\xab\x0e\x7d\xc2\x58\xae\x36\x78\x8e\x0d\xde\x15\xe5\x83\x3d"
+ "\x5c\xa9\x12\xe4\x94\xc2\xdd\x73\x6b\x3a\xf1\xcb\xa3\x03\xe1\x9d"
+ "\x9e\x36\x6a\xae\x91\xca\x1b\x38\x57\x7a\x8c\x39\x0a\x54\x19\x9d"
+ "\x6c\x33\x04\x9a\x69\xcc\x6d\x15\xe6\xa0\xe1\xbb\x8f\x54\x35\x2a"
+ "\x7a\xe4\xbd\x98\x0a\xef\x00\xef\x7e\xb0\xae\xc6\x97\x83\xf7\x18"
+ "\xc0\xc6\x0d\xef\x4b\x85\xb1\xcd\x13\x65\x7b\xef\xfa\xdf\x83\xf2"
+ "\x0d\xb7\x34\x9a\xe0\xde\xe8\xbd\x20\x93\x70\x37\xa3\x03\x39\x58"
+ "\x7f\xf0\xda\x51\xcd\x65\x82\xcf\x64\x63\xdd\x83\x7e\x43\xe4\xc3"
+ "\x60\x9c\xe1\xf9\x18\xeb\x5b\x1c\x57\xa8\x9b\x6a\xbf\x19\xe7\x9e"
+ "\xfe\xb9\xd1\x51\xd0\x3f\x1d\xbf\xd9\xcf\x6d\x0c\x54\x58\x6f\xd3"
+ "\x19\x7f\xf4\x2f\x85\xff\x1a\xfe\xdd\x78\x95\xb9\x4f\xff\x06\x9a"
+ "\x1b\x34\x77\x42\x86\x68\x27\x81\xf9\x06\x3c\xd2\xb3\x47\x11\xe8"
+ "\xc3\xee\xe3\x1b\xe6\xb2\x9c\x6c\x9d\xce\xf1\x81\x76\xcc\x35\x7c"
+ "\x0d\xe3\xc6\xe7\x1d\xd5\x58\xbc\xa4\x69\xcf\x19\x9e\x68\x8a\xed"
+ "\x83\x5e\x7d\xd3\xcb\xf6\x76\x79\xe4\x91\x02\x18\x97\x60\x3f\xfd"
+ "\x0d\x7e\x94\x82\xc9\xdf\xbd\x26\xe2\x58\xd9\x60\x1d\x49\x39\x49"
+ "\x94\x56\x58\x2f\x3f\x98\xba\x4e\xd9\x17\xd6\x19\x3b\xac\xfd\x65"
+ "\x55\x25\x64\xc2\x38\x92\x5e\x11\x77\x95\x88\xb9\xd6\x60\x5d\x53"
+ "\xbd\x3f\xd5\xac\xc4\xef\x50\x98\x5b\x8d\xea\xaa\xb9\x53\xa3\x3e"
+ "\xfc\x0a\xd6\x4c\x90\x1b\x76\x7f\x65\x56\xda\x9a\xa3\xd5\x34\x6e"
+ "\x3d\xe8\xe5\xe9\x71\x3c\xe7\xf8\x36\x85\xb9\x4d\x74\x03\x6b\x31"
+ "\x77\xf5\xf1\xa8\x2a\x1a\x4b\xe0\x78\x74\x09\x39\x5e\x9b\x47\xca"
+ "\xeb\xcf\xe0\x1e\xeb\x77\x8f\x47\xeb\x50\x66\xec\x6a\x03\xb9\x70"
+ "\x2b\xc8\x85\x30\x5f\xef\xe3\x54\xb9\x79\xe2\xf7\x29\xcc\xc5\x26"
+ "\xca\x84\x36\x98\xa3\xf9\x42\xbe\x35\x5b\x56\xcf\xc8\x7c\xe1\x5b"
+ "\x15\xe6\x61\x7b\x27\x89\x84\xbd\xa3\xe4\xa2\xdd\x7d\x97\xea\xba"
+ "\x84\xfa\x61\x87\x72\x41\xb9\x79\x62\x3e\xb6\x17\x97\xa8\xc9\x3f"
+ "\xe0\xdd\x8f\x6a\xbc\x9d\x93\xbd\xa8\x0f\x9d\x0d\xf8\xce\x06\x3c"
+ "\x67\x83\xf1\x34\x29\x1e\x0a\x00\xba\xb9\xd5\x43\x44\x1a\xdc\x4c"
+ "\x17\x69\xf0\xf0\x79\x4a\x03\xd0\x5f\x56\x4e\x17\x68\x70\x1a\x68"
+ "\x50\x0f\x34\xc8\x24\x19\xc7\x26\x97\x93\x09\x51\x40\x83\xa6\xab"
+ "\x98\xf3\x80\xe5\xbb\x4b\x64\x63\x4f\x69\x71\xda\xac\xac\xb4\x30"
+ "\x1a\xec\x7a\x89\xd1\x60\xcf\x4b\x66\x90\x63\x06\x90\xf7\xa1\x6c"
+ "\x5f\x1e\xad\xc6\x3c\x54\x7c\x66\x0c\xe6\xe6\x66\xb4\xb8\x09\xb4"
+ "\xb8\xc9\x68\x91\xb6\x04\x68\x51\x5d\x43\xe3\x5d\x1d\xaf\x2d\x27"
+ "\xe5\x31\x7a\x52\x01\xb8\x04\xb4\x98\x83\x74\x41\xdd\xda\xbe\x52"
+ "\xd3\x0d\x74\xe9\xe0\xfc\x14\x12\x2a\xd2\x03\x74\xf7\x2e\x1b\x52"
+ "\x08\xfa\x0e\x87\xc3\xdc\x14\xe9\x11\x4c\xe9\x71\x59\xa0\xc7\x0d"
+ "\xf4\xbf\x03\x7a\xdc\x00\x7a\xdc\x00\x7a\x64\x32\x7a\x20\xce\xbf"
+ "\x68\x09\xe4\xb9\x7f\x6a\x30\x1e\x46\x5b\x7a\xac\x14\xe8\x71\xfa"
+ "\x76\xe8\xf1\xf0\xae\xb6\xf4\xe8\xa5\xeb\x88\x1e\xd2\x9c\x78\xf4"
+ "\x75\xa4\xc7\x4d\xbd\x30\x27\x1e\xc7\x39\x91\xa1\x7c\x0a\xd6\x22"
+ "\x1c\xd3\xb2\xaa\x03\x74\x4e\x60\xae\xb1\xf7\xa7\x5a\x95\xe5\xf5"
+ "\x40\x97\x79\x40\x97\x14\x89\x2e\x8c\x1e\x13\x55\x85\x5f\xb1\xf1"
+ "\x57\x8f\xc5\x35\x03\xe7\x06\xd2\x07\xe8\x04\xf3\xc7\x5d\xae\x42"
+ "\xe7\x6f\xb8\xd0\x26\x87\xf3\x04\xe7\x08\xce\x87\x8a\xb8\x33\x34"
+ "\xf7\xfb\xf1\xa8\x52\x82\xdf\x72\x8f\x47\x1f\x00\x5a\xe5\x11\xfb"
+ "\x72\xa0\x4d\x12\xee\x17\x21\xbd\x31\x67\xe1\xf1\xe8\x75\x28\x2f"
+ "\xa8\x80\xe7\xef\xb3\x03\x9d\xec\x2d\xa1\x5d\xd6\x83\x1e\x85\xdf"
+ "\x78\x9d\xbf\xed\x62\x7e\x66\xde\xaf\x67\x24\x9c\xf7\xb5\x01\x8d"
+ "\x60\xee\xc8\xe6\x8c\x23\x6f\xf3\xb7\x1a\xb2\xad\x8e\xf8\x3f\x30"
+ "\x9f\xd1\xc8\xee\x34\x67\xc6\xcf\xc7\x39\x93\x01\x34\x3a\xe9\x25"
+ "\x8d\x1e\x65\x7b\xa8\x42\x00\xab\xbb\xfb\xe9\x61\x9d\x04\x1a\x3d"
+ "\xa2\xf6\x44\x23\x7b\x41\xff\x52\xbb\x2a\x02\xbf\x3d\x3f\xca\x2d"
+ "\x9e\xac\xe0\x40\x67\xba\x01\xba\xe9\x71\xb3\x8d\xa4\xce\x24\xca"
+ "\x94\x33\xc4\xcf\x38\xf9\x0b\x62\x34\x15\xd3\xb8\xe9\x68\xf3\xc5"
+ "\x7c\x26\x46\x5b\x31\xe0\xd5\xdc\x0c\x2c\x6f\xa3\x65\x33\x59\x39"
+ "\x93\xf8\xd0\x5c\xa6\xd1\x7a\xb2\x1e\xf8\x73\xf7\x4b\x7a\x25\x97"
+ "\x33\x32\x8e\x57\x61\x1e\x26\x62\xa8\xd4\xda\x30\xee\x5b\x40\x45"
+ "\x5c\x39\xc6\xca\x3c\x87\x71\xc9\x2b\x2d\xd0\xa6\x99\xbf\x61\x87"
+ "\x35\x63\x7b\x26\x5f\x8c\xb9\x29\x06\xe0\x1a\x81\xb1\xec\x14\xea"
+ "\x39\x28\x8b\xa0\xed\xcb\x90\xf6\x0e\xc8\x5e\x6a\xea\x0b\x0c\xe7"
+ "\x14\x15\x0b\x2c\x70\xfd\x97\x27\xb1\x5f\xcc\x0e\xcd\x8e\x03\x30"
+ "\xc6\x78\xc8\xdc\x23\x9f\xa4\x99\x7d\x75\xa0\xf3\x82\x8c\x86\xed"
+ "\xfc\x95\x67\xfa\x60\x83\xb1\xda\x4a\x6d\x90\xe6\xf4\x38\x3f\x5d"
+ "\x0a\xfa\x78\x61\x9e\x0b\x5c\xb3\x7f\xf9\x3a\xfa\x85\xf0\x05\xb0"
+ "\x5e\x85\x4c\xc8\x28\x9a\x6b\x56\x4a\xeb\xb2\xba\x16\xd6\xb3\x86"
+ "\xd1\x1a\x3e\x1d\xf3\x81\x1c\x84\xf7\x42\x3d\xe8\x83\x3a\x2b\xc5"
+ "\x94\x0f\xe7\xae\x53\xa2\x8d\xc4\x0a\xf8\x50\xfe\xd5\xdf\x68\x7e"
+ "\xd9\x8b\x8a\xde\x97\x8f\x45\xdb\x08\x3e\x7f\xca\x13\xf8\x9d\xa1"
+ "\xb7\xba\x55\x59\x30\xb0\xd5\xaf\x67\x7e\x7a\xbd\x94\x5b\xd3\x39"
+ "\x87\x26\xe2\xcc\xee\xb9\xd0\x26\xe2\x4c\x5d\x86\x92\x61\x4b\x24"
+ "\xda\xe9\xfc\x5d\xb1\xa5\xa2\xe9\x32\x49\x03\x3e\xae\x88\xd3\xd3"
+ "\x9c\x2d\x5d\x01\xdf\xb9\x95\x80\x27\x37\x41\xe7\x07\x3c\x41\x1c"
+ "\xd8\x0e\xf8\xc1\xad\x04\x5d\xff\x06\xe8\xfa\x02\x8e\xa0\xec\x85"
+ "\xc7\x99\xc0\xa3\x81\xa5\x70\x0e\xe8\xc4\x01\xae\x03\x9e\x68\xb6"
+ "\xa6\x90\xb0\xad\xc0\xa3\xdb\x10\x47\x40\x2e\x7e\x51\x0b\x38\xb2"
+ "\x1c\x70\x24\x89\xe6\x38\x0e\xdd\xae\x64\xf8\xf1\x71\xdd\x3a\xa5"
+ "\x4e\xcc\x71\x4e\xc7\xf7\xb1\xd5\x95\xc8\x1f\x31\x19\xd8\x57\xa5"
+ "\x1d\xd7\xa7\x95\xd1\x3e\x95\x16\xe0\x91\xdc\xb9\x5a\x3c\x47\xe7"
+ "\xed\xf2\xb8\x2e\x1c\xe3\xb5\x48\x1c\x93\x1d\x57\x48\x38\xcd\x03"
+ "\xfa\x7d\x68\x97\x8d\x8b\x48\xdf\xed\x57\x48\xd8\xf6\x45\x44\x03"
+ "\xf3\x55\xb9\x1d\xfa\x30\x6b\x89\x8a\xd0\xdc\x28\x7e\x3d\x0b\xe0"
+ "\xbc\xdb\xdc\x28\x20\x57\x87\x6e\xc7\x39\xb3\x58\xe3\xe8\x93\x4d"
+ "\x97\x10\x6e\x87\xb1\xa3\x71\xe4\x14\x8f\x31\x5f\x27\xd5\xaf\xa2"
+ "\x98\x9c\xff\xcb\x00\xe6\xfb\xd4\x77\x32\xe8\x2a\x9d\x1b\x15\x8f"
+ "\x1d\xe6\xdf\x1a\x38\x46\x9b\x42\x14\x8d\xe2\x35\x90\x3d\x39\xa0"
+ "\x55\xff\x0c\x92\xc1\x05\xe5\x17\x1b\x93\x2f\x63\xae\x01\x2f\xe7"
+ "\xe1\x63\x35\xd8\x96\x5d\x97\x30\x90\xfa\x1b\xbd\x95\x10\xb1\xa3"
+ "\x91\x84\xf3\x7f\x04\x7a\x2c\x80\x77\x6d\x24\x61\xf9\x8d\xf0\xae"
+ "\xcb\xd9\xbb\x8a\x39\xdd\xb9\xcc\x82\x08\xb8\xd6\x6e\x5e\x31\xf3"
+ "\x1f\x31\xaf\x58\x98\x1a\x30\xec\x17\xfc\x63\xe8\xcb\x4c\xe3\xfc"
+ "\xb4\x18\x6d\x67\x08\x3e\x17\xed\x43\xc6\xab\x94\xa7\x3f\x42\x5e"
+ "\xe6\xf4\xf1\xaa\xd9\xb5\xc0\xdb\x2d\x71\x68\x2b\x53\x1d\xac\x33"
+ "\x63\x5c\x1d\x2a\xf3\x99\x14\xea\x7a\x94\xd3\x0e\xc1\x39\xe4\x7d"
+ "\x27\x9e\xaf\x47\x9e\xc7\xeb\x94\xef\xe1\x3e\x63\xed\x05\x82\xed"
+ "\x39\xb7\x83\xf4\x17\xdb\xba\xa8\x08\xdb\x82\x6d\x21\x2f\xa0\x5d"
+ "\x07\xe7\x1a\xa3\x7d\x31\xfa\xad\x87\xf2\x21\xa3\xcc\xac\x6c\xc6"
+ "\x9c\x39\x2a\xe4\x01\xca\x2b\x80\xdf\x18\xc7\x99\xe7\xa3\x7d\x80"
+ "\xcf\xb0\x9f\x5d\x80\xde\xe1\x22\x5f\xc0\xb9\x60\x57\xde\xe8\xba"
+ "\x5a\x85\x3a\x4d\x30\xfe\xbe\x55\xfe\xf0\x8e\x7e\x61\x1e\xfd\x5f"
+ "\xb9\x30\x90\x6f\x01\x2f\x11\x37\xed\xcd\x4e\x98\xd9\xc4\x30\x13"
+ "\x31\x49\xc4\x4d\x8a\x4d\x34\x5f\x44\x31\xfa\xbc\x32\x9f\x76\x2f"
+ "\x71\xb3\xa2\x49\xc2\xcd\x17\xb5\x4e\xb8\xd9\xc4\xdf\xe0\xfa\xb8"
+ "\xc3\xcd\x3e\x5b\xe4\xb8\xd9\x67\x9b\x1c\x37\x9f\x50\xb8\xe2\x66"
+ "\x5b\xcc\xec\x73\xc6\x1d\x5e\x82\x1e\xf3\x68\xa3\x42\x53\xe4\x19"
+ "\x2b\x1f\xf7\xf7\x1e\x2b\x7f\xd5\x43\x8e\x95\x8f\x8f\xfb\xff\x17"
+ "\x2b\x7f\xb5\x5b\x86\x95\xaa\x5b\xc4\xca\x46\x8a\x95\xc1\xfc\x3f"
+ "\x61\x4e\x08\xf8\xb1\x7d\x81\x07\xac\x5c\xd0\xc1\x5c\xf8\xa3\x27"
+ "\xac\xd4\x74\x92\x63\xa5\x66\xb0\x1c\x2b\x7f\x75\x59\xc2\x4a\xe1"
+ "\xda\x1d\xc1\x4a\x8d\xef\xbd\xc1\x4a\x8d\x2f\xc5\xca\x2b\x88\x95"
+ "\x9a\xf3\x1d\x63\xe5\xe3\x2a\xf7\x58\x09\xe7\x29\x56\x3e\xae\x92"
+ "\xb0\xf2\x4c\x07\x58\xf9\xc4\x51\x2f\xb0\x32\x98\x62\xa5\xca\x03"
+ "\x56\x2e\x80\xb1\x12\xf8\x82\xf2\x9e\x0b\x6f\x08\x58\x19\xea\xc0"
+ "\xca\x5b\xe0\x0f\xef\xe8\xf7\x44\x49\x7b\x58\xc9\xe9\x98\x7c\x89"
+ "\x58\xc9\x87\x08\x58\xb9\xd0\x46\x52\x4e\x01\x46\x56\x37\xd2\xbc"
+ "\x38\xd4\x57\x18\xfe\x53\xa7\x23\x16\x45\xe9\xf6\xc0\x78\x19\x4d"
+ "\x45\x14\x9b\xa8\xcf\xeb\x38\xc4\xaa\x22\xa8\x9b\xe7\x90\x3b\x29"
+ "\x76\x9e\x12\xb0\x73\x86\x80\x9d\xb3\x7e\x04\x76\xbe\x84\xb4\x7c"
+ "\xf2\x64\xab\x52\xc4\xce\xb7\x00\x3b\x9f\xa4\xf2\x03\x7e\xd3\x64"
+ "\xd8\xd9\x7f\xa2\xd8\x2f\xb4\x69\x1a\x13\xdf\x21\xac\x5f\x57\xdb"
+ "\xe2\xe8\x58\x6c\xef\xa9\x27\x0c\x0b\x9a\x88\x03\x4b\x67\x48\x58"
+ "\x0a\x6d\x29\x3c\xe3\xe8\x53\x51\x0e\x1c\xcd\x04\x1c\x3d\xeb\x84"
+ "\xa3\xa0\x37\x7d\x88\x98\x07\x38\xda\x42\x71\xf4\x63\x01\x47\xfb"
+ "\xce\x39\x36\x03\x70\x74\xac\x88\xa3\x4f\xe5\x58\x33\x0b\x06\x5a"
+ "\xb3\x3a\xc6\xd1\x16\x8a\xa3\xda\xbb\x8f\xa3\x25\x2e\x38\x0a\xba"
+ "\x2b\xe6\x75\x77\x8b\xa3\x22\x3f\x52\x1c\xcd\x90\x70\x94\x8e\x6b"
+ "\x5f\x7b\x65\x0c\x8c\x7b\x8c\x96\xea\x6e\x0e\x1c\xd5\x16\x31\x1c"
+ "\x85\x73\xd4\x7e\xb2\x14\x70\x14\xf8\x2f\xbd\x02\xe3\x05\x92\x48"
+ "\xe8\xa3\x0a\xf1\x75\x07\xcc\x19\x1c\x23\x07\x9e\x2e\x80\x39\x83"
+ "\x18\xd3\x0c\x73\x06\x70\x74\xd6\x35\x15\xa1\xf3\x25\x0b\xe6\x4b"
+ "\xa3\x87\xbc\x7c\xa2\x0f\xae\x47\x3c\xed\x37\x45\x8e\xa7\xfd\xd6"
+ "\xc9\xf1\xb4\xdf\x50\x09\x4f\x85\x6b\x88\xa7\x40\x33\x18\x9f\x62"
+ "\xc4\xd4\xdb\xc3\xd3\x7e\x93\x1d\x78\xaa\x14\xf0\x74\x41\xc7\x78"
+ "\x4a\xbf\xfd\x79\xc0\x53\x67\x6c\xf0\x8c\xa7\xfd\x26\x4b\x78\xda"
+ "\xff\x69\x07\x9e\xd6\x78\xc2\xd3\xa7\xa2\xdd\xe3\x29\x9c\xa7\x78"
+ "\xfa\x54\xb4\x03\x4f\x6b\xdc\xe0\xe9\x58\x67\x3c\x1d\xd0\x9b\xe1"
+ "\x69\x11\xc5\x51\xc4\xd4\x4a\x0b\xf0\x07\xce\xb9\xc4\x3c\x8a\xa9"
+ "\x1c\x60\x2a\xe6\x2a\xc6\x3c\x55\xe8\x6b\xef\x0e\x53\x19\xe6\x9a"
+ "\x08\xe2\x2a\xce\xcd\xf4\xf1\xa0\xef\xc2\x5a\x04\x63\x42\xd7\x5e"
+ "\x71\xfc\x76\x38\xe1\xeb\xec\x15\x2a\x94\xed\x64\xbc\xc2\x89\xbc"
+ "\xd2\xac\x41\xbf\x5b\x19\xaf\x78\x47\xcb\x01\x6a\x4f\xd8\xea\x49"
+ "\x77\x3f\x86\xba\xfb\x14\xa2\x5c\x39\x05\xf0\x35\x1a\x75\xf7\x42"
+ "\x17\xdd\xbd\xb0\xad\xee\x7e\xb2\x7d\x1c\xf5\x4a\x77\x9f\x8a\x34"
+ "\x0c\x7f\x58\x8e\xa3\xe1\xbd\xe5\x38\xfa\xeb\x6d\xd8\x2f\x86\xe3"
+ "\x85\xee\x75\x77\x3a\xcf\xc3\xe3\x1d\xba\x7b\x8d\x1c\x3f\x25\xdd"
+ "\xfd\xd7\xe3\x3d\xe3\x68\x78\x9e\x4c\x1e\x9d\x25\xe0\xe8\x5c\x01"
+ "\x47\xe7\x4a\x38\x7a\xfc\x0b\x51\x1e\x7d\xfa\xa3\xb2\x1a\x67\x1c"
+ "\x0d\xaf\x75\xe0\x68\x6d\x5b\x1c\x15\x31\x14\xf1\x14\xdb\x41\x5b"
+ "\xd6\x2e\xc0\xe9\xbd\x73\xb5\x4a\x66\xab\x8d\xc1\xb1\xf3\x77\xb5"
+ "\xd5\x56\x34\x5d\x23\x69\x33\x10\x4f\xf3\x28\x9e\x06\x2a\xc8\x1c"
+ "\xc0\xbe\xae\xb8\x97\x20\x1f\xbf\xdb\x27\xb1\x3c\x6f\x68\x5f\xe2"
+ "\x96\xb3\xbc\xa1\xa2\x9d\x09\xde\x97\x7e\xaf\x9f\x79\x46\xc0\xd4"
+ "\xeb\x30\x1e\xc0\x73\x5b\xaf\x03\xa6\x26\xb9\x91\x4d\x57\x02\xa6"
+ "\xa6\x38\xc9\xa6\x30\xf7\x3f\x9e\xeb\x8a\xa9\xcf\xbc\x50\x89\xbc"
+ "\x82\x98\x2a\xd3\xe3\x0b\x7f\x06\x7a\xfc\x33\xef\xca\xb1\xf4\x99"
+ "\x6a\x39\x96\x3e\xf3\x86\x84\xa5\xc2\xb5\x3b\x22\x9b\x3e\xa3\xbf"
+ "\x37\xb2\xe9\x33\x7a\x49\x8f\xff\xf5\x2a\x07\x96\x56\x7b\xc2\xd2"
+ "\x70\xbd\x7b\x2c\x85\xf3\x14\x4b\xc3\xf5\x0e\x2c\xad\x76\xa3\xc7"
+ "\xcb\xb0\x74\xe0\x1c\x86\xa5\x85\x4c\x36\xad\x11\x65\xd3\xc2\x7f"
+ "\x41\x3d\x7e\x60\x8c\xb7\x7a\xfc\xb1\x26\x86\x9f\x88\x4f\x22\x86"
+ "\x4a\x7a\x7c\xa1\x67\x3d\xbe\x03\x0c\xf5\x4a\x16\xa5\x18\x3a\x68"
+ "\x8e\x1c\x43\x07\xc5\xca\x31\x74\xf0\x49\x57\x0c\x6d\x8b\x9f\x83"
+ "\x76\xba\xc3\x4e\xa6\xc7\x0f\x5e\xeb\x19\x37\x07\x55\x79\x8f\x9b"
+ "\xff\x71\x59\x8e\x9b\xff\x11\xfc\xef\x81\x9b\xbf\x59\x2d\xc3\x4d"
+ "\xd5\x2d\xe2\xe6\x4f\xa2\xd3\xff\xc6\xc5\xfe\x39\xd8\xc5\xfe\xf9"
+ "\x1b\x27\xfb\xe7\xe0\x3b\x68\xff\xfc\xcd\x3d\xb2\x7f\xfe\xa6\x46"
+ "\x92\x41\x07\x7f\xd4\x31\x6e\x0e\xaa\x71\x8f\x9b\x70\x9e\xe2\xe6"
+ "\xa0\x1a\x09\x37\x3b\x92\x41\x7f\xbb\xc5\x0b\xdc\xfc\x99\xeb\xf4"
+ "\xbf\x6d\xd7\xfe\xe9\x4e\xa7\x47\xdc\xa4\x78\x59\xe3\xa2\xd3\x4f"
+ "\x71\xd6\xe9\x0b\x25\x9d\x7e\x0c\xc3\x2d\xa3\x4d\x27\xd7\xe9\xef"
+ "\x38\x8e\x0e\x79\xdf\xea\xb0\x87\xbe\x09\x38\x3a\x84\xc6\x88\xb1"
+ "\x3a\xec\xa1\xcf\x3d\x2d\xf6\x8b\xe9\xf4\x6f\x11\xd6\x2f\x37\x3a"
+ "\x3d\xf5\x9b\x1d\x62\x77\xe8\xf4\x35\xae\x3a\xfd\xd0\xf3\x9e\x31"
+ "\xf5\xd9\x30\xb7\x3a\x3d\xea\xdf\x14\x53\xb5\x14\x53\xaf\xe7\x3a"
+ "\x63\x6a\xc4\x70\x8a\xa9\xcf\x8b\x98\xfa\x6c\x9c\x15\xe6\xa6\xd5"
+ "\xaf\x63\x4c\xc5\x76\x24\x4c\x8d\xfb\x69\x30\xd5\x70\xeb\x98\xea"
+ "\xbc\x87\xf5\x63\x78\x77\x07\xa6\xd2\x31\x8e\x38\x53\x19\x83\x98"
+ "\x1a\xe7\xa2\xdf\x17\xba\xd7\xef\xcb\x88\x12\xc7\x47\xd4\xef\x91"
+ "\x06\x14\x6f\xee\xaa\x7e\x3f\x74\x90\x1c\x5b\x87\xc6\xc9\xb1\x75"
+ "\xe8\xc3\x12\xb6\x0a\xd7\xee\x88\x7e\x3f\x74\xe0\xbd\xd1\xef\x87"
+ "\x0e\x94\xb0\xf5\xb9\xa0\x8e\xb1\xf5\xd9\xbe\xee\xb1\x15\xce\x53"
+ "\x6c\x7d\xb6\x6f\xbb\xd8\xfa\xbc\x33\xb6\x0e\x53\x88\xd8\x2a\xe9"
+ "\xf7\xc0\x1f\x38\xff\x12\x75\xb7\xaf\xdf\xbf\x70\xaf\xf5\xfb\x61"
+ "\xc4\x2b\xfd\x3e\x17\x70\x16\x74\xf1\x95\x27\x40\xbf\x9f\x28\xe8"
+ "\xf7\xb5\x7a\x17\xfd\x5e\xdf\x46\xbf\x4f\x9d\x28\x60\x2a\xcc\x29"
+ "\x8a\xa9\x73\x0b\x6f\x5f\xbf\x9f\x84\x34\x1c\x66\x97\x63\x6a\xa4"
+ "\x42\x8e\xa9\x23\x37\x61\xbf\x18\xa6\xeb\xdd\xeb\xf7\x74\x9e\x47"
+ "\x8e\x97\xe9\xf7\xd0\xbf\xb6\xfa\xfd\xc8\xe1\x32\x4c\x9d\xe5\x8c"
+ "\xa9\x91\xc9\x32\x39\x15\xde\x0b\x31\xf5\xfd\xb3\x0c\x53\x3f\x38"
+ "\xeb\x84\xa9\x2f\x7e\x20\x60\xea\xf0\xf7\xcb\x26\x3b\x63\x6a\xe4"
+ "\x01\x11\x53\x29\x5e\xce\xb2\x2a\xd3\xa3\xdb\xfa\x9d\x50\x7f\x1f"
+ "\xf4\x05\x82\xb6\x71\x9f\x14\xb6\xb9\xfb\x6c\x5c\xc7\xfe\x26\xd1"
+ "\xee\xfd\x4d\x8c\x89\x26\x52\x5e\xaf\xa3\x7e\x26\xf9\xe8\x67\xb2"
+ "\x9a\xf4\xce\xbf\xc1\xe2\x07\xd0\x1c\x1f\xd7\xdd\xc7\x0e\x98\x39"
+ "\x5d\xc2\x59\xf4\xc9\xda\x8a\x3e\x59\xd7\x99\x0f\x10\xd0\xbb\x6d"
+ "\xac\x00\x51\x6e\x02\x3c\xd8\x7f\xd6\x15\x67\x47\x0c\xad\x44\xfe"
+ "\x99\x11\xe7\xa2\xf3\xeb\x7f\x06\x3a\xff\x88\xcd\x72\x7c\x1d\x51"
+ "\x2a\xc7\xd7\x11\xab\x24\x7c\x15\xae\xdd\x11\xd9\x75\x44\xce\xbd"
+ "\x91\x5d\x47\xe4\x48\x3a\xff\xc8\x25\x0e\x7c\xad\x72\xc2\xd7\xb3"
+ "\xce\xf8\x1a\x99\x41\xf1\xf5\xac\x2b\xbe\xc2\x79\x8a\xaf\x91\x19"
+ "\x0e\x7c\xad\x72\xd1\xf9\xcf\xba\xe2\xeb\xa8\x29\x14\x5f\x6b\xf5"
+ "\x2e\xb2\xab\xbe\x63\x9d\xbf\xf6\xe7\xa6\xf3\x8f\x9a\xec\x95\xce"
+ "\x8f\x98\xba\x90\x61\x2a\x62\x96\x88\xab\x92\xce\xaf\xf7\xa8\xf3"
+ "\x77\x84\xab\x5e\xc9\xaa\x14\x57\x47\x4f\x91\xe3\xea\xe8\xe9\x72"
+ "\x5c\x1d\x73\xc6\x15\x57\xdb\x62\xea\xe8\x2d\xee\xf0\x94\xe9\xfc"
+ "\x63\xd6\x7b\xc6\xd2\xd1\x25\xde\x63\xe9\xf3\xd7\xe4\x58\xfa\xbc"
+ "\xff\xbf\x2f\x96\xfe\xee\x0d\x19\x96\xaa\x6e\x11\x4b\x7f\x12\x3b"
+ "\xc0\xef\xce\xcb\xb1\x74\x4c\xb0\x1c\x4b\x7f\x57\x26\x61\xa9\x70"
+ "\xed\x8e\x60\xe9\xef\x4c\xf7\x06\x4b\x7f\x67\x92\x64\xd5\x31\x9f"
+ "\x74\x8c\xa5\xa3\xcb\xdd\x63\x29\x9c\xa7\x58\x3a\xba\x5c\xc2\xd2"
+ "\x33\x1d\x60\xe9\x0b\xef\x7a\x81\xa5\x72\x3b\x80\x2b\x96\xde\x73"
+ "\x3b\xc0\x0b\x7a\xaf\xec\x00\x22\x96\x4e\x6c\x6b\x07\x40\x7c\xa5"
+ "\x76\x00\x18\x2f\x11\xc3\xa8\x1d\x60\x14\xc3\x32\xa3\x6d\x9d\xcc"
+ "\x0e\x70\xe7\xb1\x75\xec\x5f\xad\x0e\x7b\x6a\x26\x60\xeb\x58\x9a"
+ "\xff\xc3\xea\xb0\xa7\xbe\x38\x5e\xec\x17\xb3\x03\xbc\x49\x58\xbf"
+ "\xdc\xd8\x01\x46\x60\x7b\xbf\xef\x24\xb3\x03\x38\x61\xed\x45\xc5"
+ "\x78\xbb\x67\x9c\xfd\x7d\x5f\x99\x1d\xa0\x4e\xc2\xd9\xeb\xe8\xa3"
+ "\x0e\x38\x48\x71\x36\xc4\x19\x67\xc7\xcd\xa4\x38\x3b\x42\xc4\xd9"
+ "\xdf\x6b\x5b\x60\x6e\xb6\x78\x8b\xb3\xb8\x8f\xe0\x6c\xcc\xbd\xc1"
+ "\xd9\x62\x2f\x70\xd6\xc9\x36\xb0\x1f\xc6\xc3\x81\xb3\x74\xdc\xc7"
+ "\xb5\x56\xce\x40\x9c\x8d\x71\xb1\x0d\xe8\xdd\xdb\x06\x8e\xde\x0b"
+ "\xdb\xc0\xf8\x89\x72\xbc\x1d\xbf\x56\x8e\xb7\xe3\x7f\x2b\xe1\xad"
+ "\x70\xed\x8e\xd8\x06\xc6\x47\xdd\x1b\xdb\xc0\xf8\x28\x09\x6f\x5f"
+ "\xec\xd7\x31\xde\xfe\x7e\xa0\x7b\xbc\x85\xf3\x14\x6f\x7f\x3f\xb0"
+ "\x5d\xbc\x1d\xe1\x8c\xb7\x13\x1e\x16\xf1\x56\xb2\x0d\xe8\x05\xdb"
+ "\xc0\xba\x8e\x6d\x03\xb5\x1e\x6c\x03\xa3\xef\xb5\x6d\x60\x82\xc7"
+ "\x18\xd2\xee\x6c\x03\xad\xb9\xcc\x6f\x7f\x25\xfa\xed\xcf\x04\xfc"
+ "\x8d\xfa\x02\xc6\xa0\x63\xbf\xfd\x54\xd1\xff\x34\x26\x4f\xc0\xd9"
+ "\x3c\xb7\xb6\x81\x63\x0d\x9e\x6d\x03\xc7\xaa\x9d\xfd\x4f\xa3\x7a"
+ "\xc8\xbf\x5b\x45\x3d\x2c\x7e\xb7\x3a\xf6\x15\xe2\xec\x64\x9a\xd7"
+ "\x85\xcb\x99\x66\x60\xf1\x0c\x27\x87\x61\x3f\xdd\xf9\xf1\x7f\xcc"
+ "\x39\x7f\xcb\x8a\x5a\xe1\xb0\x15\x54\x21\xde\xe6\x11\x8e\x8f\xf3"
+ "\xc3\x58\xe4\xd4\x56\x30\x15\x79\xef\x0f\x27\x9d\x71\xf7\xe0\x69"
+ "\x67\xdc\x8d\x2a\x10\x71\xd7\x0e\xb8\xfb\x49\x5d\x1e\xb3\xbf\xbe"
+ "\xc4\x7c\x53\x77\xbd\xe4\xe4\x9b\xfa\xc5\xa7\x02\xee\x4e\x7c\xb7"
+ "\xcc\x04\xef\xdf\x9e\xff\x14\xdc\xbf\xe7\xf4\xad\xfa\xa0\xe6\xb9"
+ "\xf5\x9d\x12\xf0\xc9\xad\xff\x14\xf4\x55\xb5\x4d\x98\xab\x76\x98"
+ "\xa7\xdb\x9c\xfc\xa7\xf2\x53\x60\x3e\x0b\xfb\x4a\xda\xf5\x43\x7d"
+ "\x49\xf2\x43\xe5\x73\xa6\xd2\xbc\xae\xdc\xe6\x69\x86\x1b\x7c\x9c"
+ "\x0f\x1f\x3c\xd5\x86\xcf\xbf\x79\x13\xd6\x9d\x91\xd1\x3e\x4c\xaf"
+ "\x9b\x6a\x02\xec\xe9\xca\xc6\x7d\x62\xad\x1d\xd6\x1a\x3b\xac\x35"
+ "\x5c\xce\x54\x93\x0d\x65\x93\xdc\xa9\xf5\xf9\xa0\xe7\xd9\x32\x69"
+ "\xce\xd6\x2e\xd9\xa0\xeb\xed\x40\x3d\xef\x0a\xcc\x8d\x74\x8d\x12"
+ "\xfb\x23\xe2\x68\x60\x03\xbc\xc7\x95\xf6\x65\x39\xdb\xf7\x12\x8e"
+ "\x1a\xc6\x1e\x83\x67\x4e\x3a\x51\x89\xbc\x1b\x2d\xed\x29\xa0\x32"
+ "\xb3\x07\x5f\x59\xec\x0b\x8b\xbb\x08\xbc\x70\x07\x6c\x12\xce\xfd"
+ "\x91\xe3\xfa\x1f\x9e\x90\xe3\xfa\x1f\x66\xc8\x71\xfd\x0f\x41\x12"
+ "\xae\x0b\xd7\x00\xd7\x81\x6e\x54\x8e\x86\xb5\xef\x36\xe5\xe8\x3f"
+ "\x68\x44\x5c\xe7\x04\x5c\xdf\x7e\x0b\xb8\xde\xae\x1c\xed\x84\x4b"
+ "\x9e\x71\xfd\x0f\x1a\xc9\x26\x31\xb9\x93\x5b\x1f\xd9\xd3\xce\xb8"
+ "\x1e\xb5\x8b\xe2\xfa\x69\x57\x5c\x87\xf3\x14\xd7\xa3\x76\x79\xdc"
+ "\x4f\x70\xda\xf5\x7b\xda\xe4\x4b\x14\xd7\x6b\x04\x1f\xd9\x2a\x2f"
+ "\xf6\x13\xd4\x30\x4c\x17\xb1\x1c\xed\x55\xf7\xd6\x26\x31\xb9\xc1"
+ "\x1b\x9b\x04\xc5\xf2\x26\x86\xe5\x88\x8d\x22\x9e\xdf\xca\x7e\x82"
+ "\x8e\xf0\x5c\x94\x9b\x11\xcf\x3d\xc9\xcd\x72\x3c\x9f\x72\x49\x8e"
+ "\xe7\x53\x2e\xcb\xf1\x7c\xfa\x25\x39\x9e\x4f\x6f\x70\xc5\xf3\xb6"
+ "\x58\x3e\x75\xa8\x3b\x1c\xd7\x4e\x45\x1b\xc5\xf4\x3c\xcf\x18\x3e"
+ "\x35\xce\x7b\x0c\x9f\x16\xfb\x6f\x87\xe1\x2a\x57\x0c\x9f\xa6\x47"
+ "\x0c\xb2\x67\xb9\x60\xf8\x02\x01\xc3\x05\x1c\xd9\xd1\x28\xc8\xc2"
+ "\xae\x18\xde\x04\xef\xd1\x81\x3e\x6e\xfb\xa7\x2b\x86\x47\x6f\x96"
+ "\x61\xb8\xaa\x03\x0c\x5f\xc0\xec\x20\x32\xbf\x5c\x0f\xb6\x10\x78"
+ "\x8f\x82\x6d\x1e\x64\x73\x71\xcc\x9c\xfb\x23\xc7\xf0\xe8\xcb\x72"
+ "\x0c\x9f\xae\x96\x63\x78\xf4\x49\x09\xc3\x85\x6b\x77\x44\x36\x8f"
+ "\x6e\xba\xe3\xb2\xb9\xc8\x1f\xed\x62\x78\x74\x93\x24\x9b\x4f\x2f"
+ "\xeb\x18\xc3\xa7\x6a\xdd\x63\x38\x9c\xa7\x18\x3e\x55\xeb\x71\x9f"
+ "\x43\x1b\x0c\x7f\xe9\x7d\x2f\x30\x5c\x6e\x0b\x11\x31\x5c\xb0\x85"
+ "\xec\x70\xb2\x85\xd8\x33\x99\x2d\x64\x5b\x23\xe3\x8d\xae\x0a\xc6"
+ "\xa7\xc0\x3f\xa1\xdb\x95\xed\xeb\x6e\xdb\x6e\xcb\x0e\xf2\x52\x9b"
+ "\x98\xe4\xed\xd9\x41\x28\x7e\xe3\x1e\x87\xe9\x80\xdb\x55\xb7\xb8"
+ "\xc7\x61\x8c\xb8\xc7\x41\xe7\x61\x8f\x83\x80\xe7\xb3\x7e\x04\x9e"
+ "\xd3\x3d\x0e\x2f\xef\x97\xdb\x98\x5f\xfe\x44\xb4\x31\x33\x3c\x9f"
+ "\x5d\x21\xc7\xf3\xd9\xe5\x8e\x3d\x0f\x80\xf9\x46\xed\x5b\x6d\xf6"
+ "\x3c\x38\xb0\x9d\xda\x41\x67\x3c\x6c\x98\x5a\x4f\x1c\xf8\x3e\x43"
+ "\xc2\x77\x68\x6b\x95\x0c\xdb\xeb\x9c\xb1\x7d\xc6\x28\x19\xb6\x9f"
+ "\xcd\x93\xfb\x47\xd4\x69\x9d\xb0\x5d\xdc\xf3\x30\x73\x78\x59\x6d"
+ "\x07\xd8\x0e\xf7\xdf\xfa\x1e\xb1\x3b\x8b\xed\xe2\xfe\x06\xb7\xd8"
+ "\xee\xbc\xbf\xc1\xc9\xff\x01\xb1\x9d\xe6\xbd\xe8\xee\x82\xed\x2b"
+ "\xe3\x94\xf6\x23\x30\x1f\x00\xd7\x71\x8e\xd8\x79\xc0\x76\x3a\xde"
+ "\x33\x53\x9d\xb1\xfd\x66\x26\xc3\xf6\xad\x8d\x3f\x1e\xdb\x1d\xf2"
+ "\xb0\x33\xb6\x3f\x8f\xd8\x3e\x6b\x05\xdb\x7f\x91\x71\x6b\xfb\x2f"
+ "\x5c\xfc\x33\xb6\xde\x82\xfd\xa5\x5d\x8c\x77\xd3\x2f\x39\xc6\xcf"
+ "\x3a\x21\xc7\xf8\xd9\xbe\x72\x8c\x9f\xb5\x5f\xc2\x78\xe1\xda\x1d"
+ "\x91\xd3\x67\x55\xdd\x1b\xfb\xcb\xac\x2a\x09\xe3\x67\xef\xee\x78"
+ "\xef\xc5\x8c\x71\xee\x7d\x33\xe0\x3c\xc5\xf8\x19\xe3\xda\xdd\x7b"
+ "\x21\xb3\x77\xc7\x6c\x73\xbb\xf7\xa2\xea\xa7\xf3\xcd\x70\xe6\x15"
+ "\x57\xfb\xcb\xed\xdb\xbe\x63\xf2\xbd\xb5\xbf\xe0\xde\x8b\x95\x27"
+ "\x9d\xf6\x5e\xd4\x76\xbc\xf7\x22\x75\xca\x2d\xda\x5f\xda\xf1\xcd"
+ "\x38\x16\xe5\xec\xef\x36\x67\x8b\x1c\xdf\xe7\x6c\x73\xe0\xfb\x24"
+ "\xc4\xf7\xd8\xbf\xca\xf1\x3d\xb6\x08\xfb\xe9\x6e\x2f\xc6\xc7\xb2"
+ "\xef\x8a\x73\x5a\xe5\xbe\x1a\x2e\xf6\x97\x49\xc8\x7b\xb1\x73\x64"
+ "\xf8\x7e\xd6\x19\xdf\xe7\x86\xb9\x93\xdd\xd1\xee\x4d\x7d\x8a\x67"
+ "\x39\xed\x69\x7b\x51\xf4\x7f\x7b\xa5\x5f\x59\x34\xbc\xbf\xc9\x83"
+ "\xaf\xdb\x2c\xe6\xeb\x46\x7d\xdb\xd0\x0e\x0e\x6d\xed\x9d\xa5\x55"
+ "\xa6\xc5\xf0\x1c\xfa\xba\xb9\xfa\xb9\xa1\xef\x1b\xfa\xba\x55\xc4"
+ "\xe9\x3c\xfa\xb9\x21\x6f\x7a\xf2\x75\x83\x7e\x07\x53\xac\x3f\x2f"
+ "\x60\xbd\xe0\xeb\x96\x9f\x24\xf9\xba\xc9\xb0\xde\x8d\xff\xf0\xfe"
+ "\xb3\x19\xee\xe5\xf8\x74\x09\xeb\x6f\xa0\x1c\xff\xac\x8b\x2d\x86"
+ "\xd2\xe0\x95\xb8\x9f\xd4\x16\x43\xb1\x7e\xde\xcc\x4a\xe4\xe3\x19"
+ "\x5a\x37\xb6\x98\xb6\x3e\xce\x3f\x9d\x2d\x66\xde\x47\x72\x8c\x9f"
+ "\xd7\x20\xc7\xf8\x79\xdb\x24\x8c\x17\xae\xdd\x11\x8c\x9f\xb7\xef"
+ "\xde\xd8\x62\xe6\xed\x93\x6c\x31\xb1\x9b\xdc\xfa\xdf\xc9\x6c\xec"
+ "\x73\xfb\xba\xb7\xb1\xcf\x15\xfc\xef\xe6\xf6\xf5\xb8\x27\xa4\xcd"
+ "\x37\xcd\x57\x97\x31\x1b\xfb\x6d\xec\x09\xa9\xfd\xb9\xd9\x62\x5e"
+ "\x4d\xf4\xd6\x16\x43\x7d\x9b\x4f\xa2\x7f\x88\x77\x7b\x42\x3a\xc2"
+ "\x76\x87\xec\xde\xce\x37\x4c\x39\xb6\xbf\xb6\x4c\x8e\xed\xaf\xad"
+ "\x90\x63\xfb\x1f\x57\xcb\xb1\xfd\x8f\x19\xae\xd8\xde\x16\xd7\x5f"
+ "\x2b\x73\x87\xe9\xda\x49\x68\x8b\xf9\x63\xb8\x67\x3c\x7f\xcd\xe2"
+ "\x3d\x9e\xc7\xd9\xff\xad\xf1\x5c\xe5\x8a\xe7\xf3\x07\xff\xa4\x76"
+ "\x19\x8a\xe7\x0b\xfa\xc9\xf0\x5c\xd5\x01\x9e\xff\x64\x76\x99\x05"
+ "\xaf\xcb\xf1\x7c\x41\xb1\x1c\xcf\x17\xc4\x4b\x78\x2e\x5c\xbb\x23"
+ "\x76\x99\x05\x6b\xef\x8d\x5d\x66\xc1\x5a\x49\x66\xff\xe3\x9c\x8e"
+ "\xf1\xfc\x35\x9b\x7b\x3c\x87\xf3\x14\xcf\x5f\xb3\x79\xf4\xa7\x6e"
+ "\x83\xe7\x0b\x87\x7b\x81\xe7\x6e\x7d\x54\x7e\x1e\x76\x99\x85\x91"
+ "\xde\xda\x65\x3c\xed\x53\x41\x7c\x97\xfc\x53\x9c\xf6\xa9\x44\x8a"
+ "\xfb\x54\x32\xe4\xfe\x29\x77\x1c\xdb\xe3\x27\xca\xb1\x3d\x7e\x8a"
+ "\x1c\xdb\x97\x2c\x91\x63\xfb\x12\xad\xd8\x4f\x66\x97\xc9\x6c\xb3"
+ "\x6f\x45\x8e\xf3\xf1\x1f\x19\x26\xd5\x13\x77\x58\x0f\x6d\xf5\xf6"
+ "\x8c\xf3\xf1\xb5\x9e\x70\x1e\xfd\x55\x3e\x9c\x15\xe7\x06\xe7\x17"
+ "\x5d\xf8\xff\x01\xe7\x3d\xf9\xa1\x50\x3d\x08\x30\x1e\xf1\x9e\xe2"
+ "\xbb\x80\xf5\x88\xf3\xf6\x7f\xb8\xb3\xd1\x2c\x56\xdf\x2d\x9c\xf7"
+ "\x6c\xa3\xd1\x3e\x5c\x39\x43\xc0\xf9\x5b\xd9\x43\x73\x58\x6e\xa3"
+ "\xc9\x5f\x70\xb7\x6d\x34\xda\x65\x72\xbc\xd7\x16\xca\xf1\x5e\x3b"
+ "\x53\xc2\x7b\xe1\xda\x1d\x91\xdf\xb5\x89\xf7\xc6\x46\xa3\x4d\x94"
+ "\xf0\x7e\xc9\xc4\x8e\xf1\x3e\xbe\xde\x3d\xde\xc7\x0b\xb1\xd9\xe2"
+ "\xeb\x6f\x1d\xef\x13\x1c\x78\xdf\x76\xff\x4c\xc6\xed\xfb\xc8\x0c"
+ "\xbf\xd7\x36\x9a\x04\x8f\xf8\xdf\x5e\x7c\x8c\xdb\xb7\xd1\x08\x7b"
+ "\x12\xe7\xba\x8f\x8f\x51\xd6\x8e\x8f\x4c\x59\xb9\x33\xd6\x2f\x1d"
+ "\x2a\xf7\x45\x5c\x3a\x5c\xf4\x45\x2c\xab\x44\xac\x5f\x3e\x5f\x8e"
+ "\xf5\xcb\xe3\x3c\xd9\x68\xf6\x73\xce\x3e\x89\x4b\xb7\xc9\x6d\x34"
+ "\x7a\xb9\x8d\xe6\x45\xe4\xbd\xe5\x3d\x3c\x63\xfd\xd2\x52\xb9\x0f"
+ "\x38\xdb\xa3\xf8\xfe\x2c\xc1\x07\x7c\x96\x93\x0f\xf8\xd8\xf7\x04"
+ "\xac\x4f\xbc\x50\x5a\x65\x23\xde\xf8\x21\xfe\x78\x5f\xef\x75\x6e"
+ "\x7d\x10\xe9\x1a\xd0\x8e\x1f\xe2\xec\x53\x2a\xf4\x69\x8e\xd8\x9e"
+ "\xe4\xe4\x87\xd8\x4e\x3c\x63\x19\xfe\xcf\xd2\x7a\xc4\xff\x56\x5e"
+ "\xc2\x7f\xee\x37\x92\xdd\x86\x43\x39\x9f\xd2\x65\x99\xfa\x6e\xd9"
+ "\x6d\xdc\xd9\x49\x0c\x23\x10\xff\x93\xba\x33\x39\x3f\xee\x67\x66"
+ "\xb7\x49\x8a\x97\xe3\x7e\x92\x5e\x8e\xfb\x49\x53\x24\xdc\x17\xae"
+ "\xdd\x11\x5f\xf4\xa4\x85\xf7\x46\xce\x4f\x5a\x28\xd9\x6d\x96\xbf"
+ "\xd0\x31\xee\x2f\xad\x72\x8f\xfb\x4b\xab\x18\xee\x2f\xad\x6a\xd7"
+ "\x6e\x23\xf3\x8d\x4c\xee\xf7\xa3\xed\x36\xa2\x9c\x7f\xcf\xf7\xf5"
+ "\x24\xf7\xf5\xc6\x6e\xe3\xd8\x93\xfe\xa3\xec\x36\xee\xf1\x5e\x94"
+ "\xed\xcb\xda\xf9\xe6\x2a\xc7\xfb\x15\xfd\xe4\x78\xbf\xe2\x69\x39"
+ "\xde\xaf\x1a\x2f\xc7\xfb\x55\xe3\xdc\xd9\x6d\xe4\x58\xbf\x62\xb5"
+ "\x3b\x9c\xd7\xbe\x88\x76\x9b\x54\x9b\x67\x8c\x5f\xb1\xcb\x7b\x8c"
+ "\x4f\x29\xfb\x3f\x8c\x77\xc1\x78\x95\x2b\xc6\xaf\xf4\xfd\x49\x65"
+ "\x7c\x8a\xf1\x2b\x5b\x65\x18\x7f\x07\x6d\x39\xb7\xb2\x9f\xc4\xb3"
+ "\x6c\x9f\xea\xe2\xff\x9e\xea\xe2\xff\x9e\xea\xe4\xff\x9e\xba\xf6"
+ "\xce\x61\x7c\xea\x9d\xf7\x7f\xbf\x25\x8c\x4f\x75\xf2\x7f\x5f\xd5"
+ "\xaf\x63\x8c\x5f\xb1\xcf\x3d\xc6\xc3\x79\x8a\xf1\x2b\xf6\xb5\x2b"
+ "\xdb\xcb\x30\x3e\x2d\xe8\x6e\xd8\x72\xee\xcd\x7e\xa3\x34\x95\x37"
+ "\xf6\x9c\xf6\xe2\x8e\x78\xb4\xe7\x0c\x16\xed\x39\x5a\x0f\xf6\x9c"
+ "\x3b\x85\xf9\xe9\xbd\xe5\x98\x9f\xde\x47\x8e\xf9\x6b\xa6\xc8\x31"
+ "\x7f\xcd\x64\xb9\x3d\x27\xa1\x8d\x3d\x47\x8e\xff\xe9\xaf\x1b\x5e"
+ "\x74\xb6\xe7\xe8\x9d\xec\x39\x6b\x3a\x79\xc6\xff\x74\x8f\xf8\x7f"
+ "\x9d\xe2\x7f\x8c\x1b\xfc\xcf\xf8\x37\xc1\xff\x98\x1f\x81\xff\xab"
+ "\xef\x01\xfe\x67\x2a\x98\x8d\xe7\x16\xe3\xa4\xec\xf7\xde\xc6\xf3"
+ "\xe3\xd6\x81\xcc\xe9\xf2\x75\x20\x73\xbd\x7c\x1d\xc8\x1c\x2e\xad"
+ "\x03\xc2\xb5\x3b\xb2\x0e\x64\x46\xdf\x9b\x75\x20\x33\x5a\x5a\x07"
+ "\xd6\x0c\xea\x78\x1d\x48\xf7\xb0\x0e\xa4\x0b\xeb\x40\xba\x17\xeb"
+ "\xc0\xda\x3e\x9e\x6d\x3c\xda\xdb\xb7\xf1\xfc\xf6\x5e\xef\x83\x5a"
+ "\x1b\xe6\x95\x8d\x27\x37\xba\xa8\x1c\x63\xa4\x9c\x27\xca\x95\x73"
+ "\x44\x1b\x8f\xc1\xc5\xc6\x63\x68\x63\xe3\x59\x71\x5e\xc0\xff\x71"
+ "\xc2\x7e\xd3\x17\x7f\x44\x8c\x14\x9a\x47\xf9\xf5\xde\x72\xbf\xf9"
+ "\xd7\x29\xfe\x4b\xf1\xfb\xd6\xfd\x15\xfb\xc5\xd6\x1f\x43\x3b\x31"
+ "\x50\x5f\x5f\x22\xb3\xe9\x8c\x73\x17\x23\x65\x9d\xcc\xef\x46\xbe"
+ "\xdf\xf4\xf5\x7c\x19\xde\xbf\xc8\xf6\x9b\x7e\xe0\xee\x3b\xad\x23"
+ "\x26\x7f\xd6\x6e\x1a\x93\xdf\x11\xcb\xef\x75\xd3\x2d\xc5\x92\x9e"
+ "\x25\xc4\x92\x3e\x7b\x0f\x62\x49\xdf\x6a\x4c\xfe\xb3\xae\xf1\xfb"
+ "\xfe\xf3\x05\x63\xb9\x81\x54\x22\x8f\xcc\x70\x8d\x7d\x6a\x70\xbf"
+ "\x77\x5f\x29\xec\xdd\x5f\x74\x77\xe2\xa0\x60\x7f\xe8\x9a\xdf\x2d"
+ "\xbf\x68\x77\x9a\x99\xf6\x07\x73\x56\x43\x5f\x2b\xca\x81\x57\x39"
+ "\xc4\xd3\x04\xc4\xd3\x75\x84\xd6\x3d\x0f\xbc\xd0\xad\xef\x18\xe4"
+ "\xe3\x6c\x8e\x04\x68\x93\x10\x5b\xff\x93\xfa\x7d\x81\x18\x01\xd8"
+ "\xca\xea\xad\x3a\xcf\xdb\xed\xdd\x06\x8e\x81\xfe\x77\xde\xb3\xa8"
+ "\xaa\x53\xa5\xc9\x02\xf3\xa2\x11\xf7\xc4\x2a\x8c\xb6\x16\x03\xd2"
+ "\xe2\xe0\xa2\x2a\x5f\x1e\xf0\x77\xc7\xab\xc4\xdf\xbb\x79\xfa\x9f"
+ "\xe5\x54\x9e\xc1\x75\xaf\x5b\xfe\x01\x8c\x03\x22\xca\x56\xdc\xf7"
+ "\x92\x7d\x6b\x1b\x8c\x0f\xc7\xb3\xb5\x6f\xf6\x7c\x86\x1b\xf0\xbc"
+ "\x08\x18\x4b\xea\x63\x8b\xb8\x41\x73\x58\x01\x6e\x6c\xbf\x2a\x7d"
+ "\xc7\xc6\xf6\x71\x8c\x98\x1d\x65\x9d\xe4\xff\x62\xf2\x84\xad\xaf"
+ "\x17\xb8\xc7\xd6\xd7\x0b\x18\xb6\xbe\x5e\xe0\xc0\x56\x93\x1b\x3b"
+ "\x8a\xcc\x8f\xfd\x0d\xc1\xff\xc5\xe0\x22\x63\x1b\xfe\x05\xe3\xa3"
+ "\xbc\xe1\x95\xff\x0b\xc5\xd3\x85\x0c\x4f\x11\xaf\x44\x4c\x95\xec"
+ "\x28\x06\x8f\x76\x94\x8e\x30\xd5\xab\x3d\xfc\x14\x53\xdf\x5c\x26"
+ "\xc7\xd4\x37\x57\xc8\x31\x75\x43\xab\x2b\xa6\xb6\xc5\xd3\x37\xf7"
+ "\xbb\xc3\x52\x16\x1f\x65\x43\xa1\x67\x1c\x7d\xb3\xde\x13\x8e\x52"
+ "\xff\xf4\x59\x4e\xfe\xe9\x0e\x1c\xfd\xd3\x35\x39\x8e\xfe\x49\x73"
+ "\xab\x38\x4a\x73\x9b\x9c\xfd\x09\x72\x9b\xdc\x36\x8e\x6a\x5d\x70"
+ "\x74\xfd\x26\x09\x47\x5d\xf3\x9b\x74\x80\xa3\x0b\xee\x4e\x0c\x14"
+ "\x19\x8e\x72\x66\xda\x1f\xf5\x22\xec\xeb\x86\xee\x72\x1c\xdd\x30"
+ "\xc6\x33\x8e\xae\xbf\x20\xe1\x28\xab\x77\x77\x71\x74\x43\xb0\x0c"
+ "\x47\x17\x38\xe1\xe8\x3f\x25\x1d\x02\x7d\x2c\x1c\x38\x1a\xef\x84"
+ "\xa3\x0b\x3a\xc2\xd1\x0d\xc1\x38\x46\x4c\x46\xdd\x70\xaa\x63\x1c"
+ "\x7d\xb3\xc9\x3d\x8e\xc2\x79\x8a\xa3\x6f\x36\x49\x38\xea\x46\x46"
+ "\x95\xe1\x68\xf6\x27\x5e\xe0\xe8\xcf\x3c\x36\x4a\xf6\x01\xaf\x6c"
+ "\x15\xd2\x9e\xce\xb6\x31\x52\x67\x3a\xef\x09\x2a\x76\xc9\x7b\x52"
+ "\xdc\x26\xef\xc9\x0a\x71\x8f\xe7\x18\x01\x57\xc7\xfe\x08\x5c\xa5"
+ "\x7b\x3c\x37\x56\xc8\x7d\x4f\x36\x9e\x10\x7d\x4f\x18\xae\xbe\x1d"
+ "\x2b\xf6\x4b\xca\x7b\x52\xdc\x4e\x8c\x54\x5d\x6f\x59\x6c\x94\x31"
+ "\xce\xb1\x51\xde\xee\xee\x39\x46\xaa\x6e\x8c\x2c\x36\xca\xb1\x42"
+ "\x47\xde\x13\xd7\x18\xa9\x12\xc6\x6e\x9a\x4e\x31\xd6\x11\x83\x4a"
+ "\xb7\xde\x11\x23\xb5\x83\x7d\x41\xd8\xce\x9e\xba\xb8\xbb\x8f\xb1"
+ "\x06\x2f\x30\x56\x96\xf7\xc4\x35\xc6\xd4\x26\xbb\xb1\xb4\x98\x54"
+ "\xc6\x14\xbb\x89\x8d\x5a\x7c\x4f\x73\x9f\x60\xbf\xdc\x63\xed\x5b"
+ "\xab\xe5\x58\xfb\xd6\x3e\x5a\xf7\x8c\x3b\xac\x7d\x6b\xa2\x84\xb5"
+ "\xac\xde\xaa\x33\x2e\x58\x5b\xeb\x01\x6b\x61\x5d\xdd\x71\xd1\x5b"
+ "\xac\x7d\x8b\xf6\x9d\xcb\x14\xb0\xb6\xf1\x4e\x63\xed\x5b\x19\x12"
+ "\xd6\xbe\x3d\xba\xe3\x1c\x53\xba\x28\xf7\xfb\x72\x74\x51\x0c\x6b"
+ "\x75\x51\xed\xe6\x98\x92\xf9\x7c\xe4\x0c\x12\x73\x4c\x49\xf6\x80"
+ "\x62\xc1\x1e\xf0\xaf\x9c\x13\x25\x67\xa0\xb7\xf6\x80\xe3\xa0\xbb"
+ "\xe3\xbe\xcb\x95\x98\x73\x6a\x06\xe6\x44\x29\x72\xb1\x07\x14\xb5"
+ "\xb5\x07\x4c\x6f\x1f\x63\xbd\xb2\x07\xd0\x7d\x97\x9b\x9f\x96\x63"
+ "\xec\xe6\x41\x72\x8c\xcd\xab\x10\xf7\x59\x62\x7f\x3c\xc7\x4c\xdd"
+ "\xbc\xda\x61\x0f\xa8\x95\x63\xab\x64\x0f\xc8\x5b\xe5\x19\x63\x37"
+ "\xcb\xed\xbf\x63\x0b\x65\xfb\x2c\x3f\xa8\x73\x8e\x43\x2d\xc6\x9f"
+ "\xca\x2d\x2b\xab\x76\xc6\xd8\xcd\xe6\x7f\xa5\x38\xd4\x8e\x58\x53"
+ "\x1d\xf8\x72\xb7\x8d\x43\xfd\xe7\x58\x63\x69\x11\xc1\xbd\x6d\x14"
+ "\x6f\x65\xb6\x81\xa2\x7b\x63\x1b\x28\x2d\xf2\x60\x1b\xf8\xf3\x25"
+ "\x39\xce\xe6\xf5\xa2\x75\x4f\xb9\xc3\xd9\x3f\xef\x97\x70\x96\xd5"
+ "\x5b\x75\xca\x05\x67\x6b\xee\xa4\x4c\xfb\xe7\x86\xbb\x6b\x1b\xf8"
+ "\x73\x83\x64\x1b\xc8\xbb\x85\xfd\x8f\x9b\xf7\xb9\xc7\xd9\xcd\x82"
+ "\xdd\x75\xb3\x64\x77\xad\x71\x93\x2f\x45\x86\xb3\x5b\x36\x89\xfb"
+ "\x1f\xa9\x4c\x5b\x2b\xca\xb4\x45\xff\x82\xf9\x52\xb6\xe8\xbc\xb5"
+ "\x0d\xe0\x3e\x77\xc4\x56\xc4\x2e\x11\x5f\x25\xdb\x40\x91\x67\xdb"
+ "\x40\x07\xf8\xea\x7d\xee\xbe\x77\x36\xc9\xf1\xf5\x9d\xcd\x72\x7c"
+ "\xdd\xde\xdb\x15\x5f\xdb\x62\xeb\x3b\x27\xdd\xe1\x2a\xb3\x0d\x6c"
+ "\xab\xf2\x8c\xa9\x5b\x89\x27\x4c\xa5\x31\xfd\xea\x24\x1f\x69\x09"
+ "\x53\xf3\x1f\x96\x63\xea\xd6\x51\xb7\x8a\xa9\xf7\x24\x5f\xca\x6d"
+ "\x63\x6a\x9c\x0b\xa6\xe6\xef\x97\x30\xd5\x35\x67\x4a\x07\x98\x7a"
+ "\xb7\xec\x04\xce\x98\x2a\x93\x5d\xb7\x0d\x95\x63\xea\x36\xad\x67"
+ "\x4c\xdd\xf6\x80\x84\xa9\xac\xde\xdd\xc5\xd4\x6d\x11\x77\xd7\x4e"
+ "\xb0\x2d\x42\x92\x5d\xb7\x2b\x3a\xc6\xd4\xad\xfe\xee\x31\x75\xab"
+ "\x3f\xc3\xd4\xad\xfe\xb7\xbe\xa7\x7c\xfb\x05\x2f\x30\xf5\x67\x9e"
+ "\x4b\x65\x7b\xbd\xd7\x76\x02\xb4\xb7\x22\x96\xd6\xfe\xb8\xd8\x21"
+ "\xc9\x62\xec\x90\x51\x02\xc6\x3e\xff\x63\x31\x76\xc7\x35\xb9\x4f"
+ "\xc3\x8e\x56\xd1\xa7\x81\x61\xec\x7f\x6d\x91\xe7\x47\x6d\x1b\x2b"
+ "\x44\x1e\x43\x55\xff\x82\xc3\x4e\x80\x98\x3b\xca\xd9\x4e\xf0\x5f"
+ "\x2f\x78\xc6\x5b\xbd\x56\x66\x27\xf8\xcc\x3d\xde\x5e\x97\xe1\xed"
+ "\xbb\x1b\x28\xde\x3a\x62\xa8\xea\xf7\x89\x31\x54\x3b\x94\x61\x65"
+ "\x78\x1b\xf3\xd3\xe0\x6d\xf1\xad\xe3\xad\x3c\x97\x8a\x6b\xbc\xd4"
+ "\xf7\x9e\x36\x96\x00\xde\xd2\x78\x1d\xae\x31\x53\x6f\x2d\x5e\xc7"
+ "\xdd\x8a\x99\x8a\xfd\x72\x8f\xbb\xef\x7d\x24\xc7\xdd\xf7\x1a\x68"
+ "\x5d\xb7\xb8\xfb\xde\xeb\x12\xee\xb2\x7a\xb7\x8c\xbb\xb7\x65\x33"
+ "\x78\x6f\xdf\xdd\xb5\x19\xbc\xb7\x4f\xc2\xdd\xff\x5a\xd1\x31\xee"
+ "\xea\x93\xdd\xe3\xae\x3e\x99\xe1\xae\x3e\xb9\x5d\xdc\x95\xf9\x10"
+ "\x14\xcc\x77\x1b\xcb\xa3\xf6\x5f\x3d\xcf\x4a\x41\xdc\xed\xd8\x0c"
+ "\x00\x83\x95\xa9\x18\xc3\x29\x06\x7d\x08\x3a\xb6\x19\x74\x84\xb7"
+ "\xde\xdb\x0c\x76\xc6\xca\xf1\x76\xe7\x7c\x39\xde\xbe\xdf\x1d\xfb"
+ "\xd5\xae\xcd\x80\x62\xc0\xce\x8f\x1c\x36\x03\x93\x1c\x67\x25\x9b"
+ "\x41\xe1\x51\xcf\xdf\xbe\x76\x9a\x64\xf2\xed\xf3\x2e\x31\xab\x67"
+ "\x49\x78\x7b\xac\x52\xf4\x19\xfb\xef\xa0\xb2\x28\x67\xbc\xfd\x4b"
+ "\x58\x9b\x98\xd5\x93\xef\x60\xcc\xea\xc9\x77\x38\x66\xf5\x14\x79"
+ "\xcc\xea\x77\xae\x4b\x7e\x64\xde\xc7\xac\xfe\xef\xdd\x14\x83\x91"
+ "\x87\x30\x6e\xf5\xad\xd8\x11\xee\x72\xae\x15\x19\xf6\xca\xec\x08"
+ "\x85\x4f\xcb\xb1\xb7\x70\x9e\x67\xec\x2d\x54\x48\xd8\xcb\xea\xdd"
+ "\x5d\x99\xb7\x30\xfc\xee\xda\x11\x0a\xc3\x25\x3b\x42\xe1\x35\xb7"
+ "\xd8\x2b\xfb\x36\xb6\xb3\xc1\xfd\xb7\x31\x38\x4f\xb1\x77\x67\x83"
+ "\x47\x3b\x42\x1b\xff\xad\xf7\x4f\xb1\x6f\x63\x82\xcc\x6b\xf2\xc2"
+ "\x8e\xf0\xb3\xf3\x31\x78\xbf\xe6\x76\xec\x08\x88\xb7\x88\x67\x22"
+ "\xe6\xde\x8a\x1d\xe1\xce\xcb\xb8\x1f\x9c\x92\x63\xee\x07\x67\xe4"
+ "\x98\xbb\x67\x95\x2b\xe6\xb6\xc5\xdb\x0f\x1f\x76\x87\xb5\xcc\x8e"
+ "\xb0\xa7\xaf\x67\x9c\xfd\x70\x8c\x47\x9c\x75\xf1\xcd\x95\x70\x76"
+ "\xd7\x0a\x39\xce\x7e\xb8\xfe\xb6\x70\xf6\x56\x73\xb0\xfc\xac\x70"
+ "\x36\xc6\x05\x67\x77\x77\x97\x70\xd6\x35\x0f\x4b\x07\x38\x7b\x97"
+ "\xf2\xb0\x78\x96\x71\x77\x6f\x91\xe3\xec\xee\x72\xcf\x38\xbb\x7b"
+ "\xbe\x84\xb3\xac\xde\xdd\xc5\xd9\xdd\x79\x77\xd7\xb6\xb0\x3b\x4f"
+ "\x92\x71\xf7\xcc\xec\x18\x67\x3f\x8c\x72\x8f\xb3\x1f\x0a\xdf\xc5"
+ "\x3e\x8c\xf2\x28\xe3\xb6\xc1\xd9\xbd\xc3\xbd\xc0\xd9\x9f\xb9\x0f"
+ "\xc2\xde\xc8\xdb\xb1\x2d\x50\x7c\x35\xb9\xec\x97\x38\xe5\xbc\x5f"
+ "\xc2\xc9\xb6\x30\x4a\xb4\x2d\xc8\xf3\xb3\x24\x8b\xf6\xdb\x48\x01"
+ "\x77\x47\xfc\x58\xdc\x2d\x9a\xd8\xe2\xc0\xdd\x04\xc0\xdd\x22\xba"
+ "\x3f\xa2\xc5\x81\xbb\xfb\xee\x13\xfb\x25\xe5\x67\xf1\x60\x5b\x18"
+ "\x42\xdb\xdb\xe9\xb0\x2d\x20\x0e\x47\x3a\xdb\x16\xfe\xbe\xdf\x33"
+ "\x06\x17\x95\xcb\x6c\x0b\x9f\xba\xc7\x60\x8b\x0c\x83\xff\x6a\xa7"
+ "\x18\x3c\x44\xc4\xe0\xbf\xaa\xae\x83\x6e\x79\x3d\xcb\x3b\x0c\xb6"
+ "\x50\x0c\x1e\x73\x6f\x30\x78\xdf\x1d\xc0\x60\x3a\xee\x7f\x7b\xd7"
+ "\x68\x00\x0c\x9e\x81\x18\x3c\xe6\xd6\xec\x0d\x3f\x51\x8e\x16\xec"
+ "\x97\x7b\x2c\xfe\x7b\x1f\x39\x16\xff\x3d\x9a\xd6\x75\x8b\xc5\x7f"
+ "\xbb\x26\x61\x31\xab\x77\x77\xed\x0d\x7f\x0f\xbb\xbb\xf6\x86\xbf"
+ "\x87\x49\x58\xfc\xf7\x4b\x1d\x63\x71\x51\xb5\x7b\x2c\x86\xf3\x14"
+ "\x8b\x8b\xaa\xdb\xc5\xe2\x21\xce\x58\xbc\xcf\x21\xf3\xca\xec\x0d"
+ "\xa6\x7f\xf5\xdc\x2d\xfb\x3c\xca\xbf\xea\x47\x48\x46\x9d\xe2\xa3"
+ "\xa7\x8d\xf9\x84\x34\x67\x92\x0c\xa3\x6d\x08\x81\x73\x30\x7e\x1f"
+ "\x4d\x37\x86\x0e\x26\xdc\x5b\x11\xc5\x88\xc7\x6f\xe3\x3f\xc8\xb8"
+ "\x3a\xa5\x30\xb7\xe8\x18\x7f\x44\xfd\x5d\xf1\x3c\x62\xef\x0e\xa7"
+ "\xeb\xee\x9e\xc5\xeb\x22\x06\x0a\xf7\xed\x63\xfb\x6e\x22\x06\x8b"
+ "\x65\xe4\x4d\x93\xe2\xa3\x62\x7e\x53\x44\xb8\x39\x28\x22\xdc\xdd"
+ "\xfd\x8f\xa9\x88\x7f\xd7\xd5\x3c\xbf\x3d\x97\xb7\x34\x3f\x3e\x5c"
+ "\xdf\xfc\x26\x21\xba\x5c\xde\xdc\x92\xf5\x91\x19\xee\x0d\xfd\x33"
+ "\xd4\x6b\xee\xf6\x91\xae\x39\x33\x8a\xb4\x64\xfd\x8f\xaf\x78\x0e"
+ "\xc6\x8d\x70\x99\x3e\x3c\x07\xd7\xf8\xdc\x4e\xa9\x3b\xd2\x00\xab"
+ "\x52\x09\xe9\x7f\x1d\xe7\xcc\xff\x04\x03\xcf\x04\x67\x43\x9b\x1b"
+ "\xa1\x2d\xfe\xc1\x87\x2c\xc0\x8f\xbe\x95\x6b\x09\xce\xe9\x75\xf0"
+ "\x5e\xfa\x6c\x1c\x7b\x9f\x27\xf3\x78\xa5\x2f\xe1\x76\x86\x5b\xf9"
+ "\xee\xd3\x8b\x80\x1e\x44\x97\x40\xfc\xf1\x3d\x36\x42\x3d\x5e\x99"
+ "\xce\x73\x7d\x06\xc0\xf8\x59\xd8\x9c\x86\xfe\x1d\x04\x3d\x96\x87"
+ "\xe7\x6e\x4f\x20\x2a\xf8\x0f\xe0\x37\x4f\x2f\x82\x7e\xe5\x43\xbf"
+ "\xd6\x62\xbf\x3c\xbd\xe3\xc6\x77\x60\xdd\x79\x28\x14\xd7\x0e\xfa"
+ "\x7c\x7c\x36\x7d\x8e\x92\x5b\x67\x87\xf3\x7c\x66\x3a\x6f\x4c\xb6"
+ "\x91\x40\x18\x8b\x1d\xd0\x6f\xe4\x47\xee\x2f\xc3\xf5\x6b\x7a\x12"
+ "\xb2\x27\xa5\x41\x69\x84\xbe\xdb\xff\xfc\x90\xc5\x90\xf6\x0c\x81"
+ "\xeb\x66\xd4\x59\x2e\x2a\xfe\x77\xcb\x84\x4b\x84\x20\x9e\xc0\xef"
+ "\x9d\x16\x58\xc7\xc6\x43\x79\x23\xbc\x07\xd7\x1c\xea\x8b\x75\xe1"
+ "\xfc\x44\x43\xd2\x69\x12\xa8\x25\xfe\xd9\xf0\x6e\x42\x5d\x35\xd6"
+ "\x35\x29\xfe\xb7\x00\xfb\x00\xe5\x81\x50\xc6\xfb\xd0\x87\x8c\xf0"
+ "\x05\xe1\x56\xca\x9b\x39\xd3\x8b\xb8\x3e\xe1\x56\x8a\x7d\xf0\x9e"
+ "\x1b\xe1\x9d\xa1\x4e\x00\xd4\x09\xa0\xc7\x34\xa2\xca\x81\x73\xd8"
+ "\x0e\x1c\x03\x0c\x8b\x6e\x60\xdb\x2a\x6c\xdb\xc3\x38\xf8\xf2\xc1"
+ "\xd3\x8b\x78\xe0\x6d\x5c\x53\xd5\x69\x8a\x13\x75\x8a\xe2\x51\x81"
+ "\x0a\x9e\xe7\x0b\x06\x64\xac\x49\x23\x01\x3a\x8e\x10\x43\x4f\x6c"
+ "\xa7\xf8\x61\x68\xdf\x17\xc7\xa2\x25\xeb\x7f\x6d\x26\xc5\xff\x14"
+ "\xe2\xf8\x02\x3d\x2d\xea\xc7\xf0\x1d\x8a\x27\xe3\x73\xf0\x1e\x56"
+ "\xff\x7f\x69\xec\x7b\xec\xb3\x3a\xcd\x87\x87\xeb\x43\x7d\x14\xe7"
+ "\x89\x4f\xe8\x03\x61\x2d\x59\xc5\x11\x26\xb2\x68\x32\xde\x6f\x62"
+ "\xf7\x01\x2f\x15\x47\x01\xcd\x4a\xf0\x1c\x96\x3d\xf4\x37\x40\xa4"
+ "\x5b\x45\x28\xf0\x86\x2b\xed\x44\x1e\x01\xbe\x10\x79\x04\xfb\xbb"
+ "\x37\xcd\xa4\xa4\xeb\xb0\xa2\x98\xea\x75\xd9\x40\x43\xfb\xd6\x50"
+ "\xdf\x8d\x30\xb6\xdc\x4d\xa4\x4b\x1d\x5c\xdb\xbf\x19\xe9\xb2\x31"
+ "\x05\x68\xc2\xea\x16\x4b\xfd\xc7\xf2\x7e\x4a\x4f\x0e\x68\xc1\xf6"
+ "\x6e\xee\x9f\x8f\xef\xb3\xf1\x3a\xd0\x31\x84\xb7\x94\x24\x43\xbf"
+ "\x90\x6f\x81\x47\xf6\x24\x58\x95\xe8\xd7\x87\xe7\x0f\x5e\xb5\x2a"
+ "\x37\x36\x12\x94\x2b\xc9\x06\xc0\xe5\x6d\x49\x30\xe6\xd0\x26\x1f"
+ "\x36\x20\x63\x80\x48\xc7\x14\xa0\x5d\x12\xf0\x2e\x8c\xf9\x46\x18"
+ "\xbf\xed\x80\x79\xf8\x7b\x3b\xac\x3f\x1c\xd4\x33\x29\xf6\x17\x40"
+ "\x7b\xaa\x6d\x21\xbc\x79\x47\x08\xdf\x04\x63\x38\xb8\x25\x6b\x7f"
+ "\x86\x38\x86\xd8\xa7\x8d\x70\x7e\x03\x5c\x87\xf1\xb4\x31\x1e\x2a"
+ "\x2e\x17\xdf\xd9\xd3\x78\xae\xdf\x43\x06\x6f\xd8\x43\x7a\xbd\xb9"
+ "\x87\x44\xac\xac\x87\x79\x99\x39\x8c\x3f\x3e\xc3\x06\x6b\x62\x6e"
+ "\xde\x8d\x90\x11\x3a\xfc\xf6\xc4\xad\x79\x48\xff\xfa\x1e\xd2\x17"
+ "\xf7\xc6\x4e\x00\x8a\xe2\x1a\x3e\xa1\xd3\x39\xde\xa8\xbd\x46\xb8"
+ "\xa0\xdc\x3c\xfb\x9a\x27\xbb\xbd\x08\xab\xe3\x51\x8d\x85\xa4\x25"
+ "\xc2\x5a\x7e\xb5\x81\xa4\x59\x78\x73\x65\xc6\x25\x02\xd8\xa3\x61"
+ "\x63\xf7\x8f\xc8\x09\xb1\x84\xe0\x9e\x41\xee\x9f\x1a\xf2\x40\x1c"
+ "\xf1\x4d\x3d\x45\x42\xd3\xeb\xf9\x06\x7b\xee\x84\x8c\xb4\x55\x44"
+ "\xb9\xe7\x6a\x0d\x93\x3d\x15\xff\x08\xfa\x04\xf7\xa7\xb6\x44\x93"
+ "\xd9\x36\x61\x3d\xca\x99\x5e\x9c\x3e\x9f\xf4\xc0\xf7\x09\xa4\xb2"
+ "\xd7\xc7\xbb\x61\xdc\x8a\xbd\xc3\xe7\x8f\x93\x29\x3d\x73\x27\xaa"
+ "\xf6\xcc\xb5\x82\xdc\xea\xa7\x4f\x8f\xe5\x1b\x50\xae\x83\xf5\x85"
+ "\xca\x82\xc6\x06\x1b\xc8\x56\xf3\x60\xfd\x36\x91\x43\x75\x7a\x25"
+ "\xb7\xd9\x4f\xef\xe5\x33\x6a\xe9\xba\x8d\x6b\x29\xf4\x7d\x8a\x86"
+ "\xb0\x75\x10\xd6\xcc\xc0\x44\x94\xa7\xf8\x73\xd8\xff\x83\xf0\xae"
+ "\x7c\xef\x78\x98\xa7\x1f\xc7\xe0\xfa\x39\xa1\xd6\x40\xca\xad\x76"
+ "\xf2\x4e\x23\x1d\x23\x3f\x18\x23\xc0\xd5\x8f\x07\xc2\x38\xf9\xbb"
+ "\xa3\x1b\xd2\x8c\xd3\xe5\xe6\x71\x3e\x8c\x36\x94\x2e\x16\x46\x97"
+ "\x17\x97\x10\x58\x47\x81\x36\x9b\x18\x6d\xb8\xee\xd1\x3a\xa4\x8d"
+ "\x77\xef\xf1\x8f\x02\x4f\xeb\x0b\x3e\x9b\x07\xfe\x40\xbe\xe0\x82"
+ "\xa3\x75\xf8\x6c\xec\x03\x7e\x3f\x43\x3e\x98\xf0\xfa\x39\xbe\x52"
+ "\xdb\x40\x8c\xf0\x3e\x7c\x90\x73\x1f\x6c\x5e\xf6\xe1\x80\xc6\x53"
+ "\x1f\xd6\xf7\x07\xbe\xed\x0f\x7c\xdb\x1f\xf8\xd6\xc4\xf8\xf6\x58"
+ "\x2d\xe3\x5b\x3b\xf4\xab\x15\x64\xf7\x95\x53\x88\x12\xfb\xb5\xeb"
+ "\x34\xc6\xe8\x83\x7e\x36\x48\xbc\x3b\xfe\x32\x8c\x91\xc8\xbf\x3e"
+ "\x4f\x76\xc3\xf1\xa9\xb4\xd4\x90\x74\xe4\xdf\x1b\xee\xf8\xf7\x20"
+ "\x99\x30\x07\x68\xf3\x1a\xf0\xef\x77\x1a\x12\x50\x4f\x7c\x57\x4d"
+ "\x01\xfe\x6d\x70\xc7\xbf\x9f\x9c\x38\x00\xcf\x6c\xc3\xbf\xb1\xce"
+ "\xfc\xfb\x49\xbc\xf7\xfc\xfb\xc9\x60\x07\xff\xbe\x24\xf0\xef\x7c"
+ "\x17\xfe\xad\x77\xe2\x5f\x7c\x6f\xaf\xf9\xf7\x93\x7c\xef\xf8\xf7"
+ "\x13\xb5\x83\x7f\x41\x2f\x79\xe7\x55\x3a\x46\x7e\x30\x46\xc0\xbf"
+ "\x07\x2c\x30\x4e\x6e\xf9\xf7\xa7\xa7\xdf\x21\xc3\xad\xd3\xef\xd0"
+ "\xa6\x8e\xe9\x77\xa8\x9f\xf7\xf4\x3b\x68\xbd\xfb\xf4\x3b\x34\xc3"
+ "\x3b\xfa\x1d\x34\x79\xa6\xdf\xc1\x7d\x3f\x1f\xfa\x1d\xce\xb8\x75"
+ "\xfa\x1d\x9e\xd8\x31\xfd\x0c\x97\xbd\xa7\x9f\xa1\xf8\xee\xd3\xef"
+ "\x70\x2f\xef\xe8\x67\xd0\x7b\xa6\x9f\x21\xd1\x13\xfd\x46\xf6\xe0"
+ "\x78\x0e\xfd\xe6\x42\x9e\x33\xa3\x0c\xc4\xe4\xb5\x4f\xc7\xa3\xce"
+ "\x08\x65\x5f\xb1\x4c\x65\x2a\xd0\xab\x5d\xca\x01\x2e\x65\x95\x4b"
+ "\x39\xd8\xa5\x1c\xea\x52\xee\x25\x96\x81\x5e\x9d\xae\x28\x0e\x7f"
+ "\x02\x3a\x1b\xc8\x38\x9f\x46\x0b\xd7\xc3\x66\xdb\xd5\xa8\xf7\x85"
+ "\xb9\xeb\xfb\xc6\x4c\xde\xaa\x4d\x23\x0f\x35\x2a\x3e\x2d\xa1\xf4"
+ "\x58\xd3\x53\xc3\xa7\x64\x10\xa0\x47\xf5\x8b\xab\x90\xaf\xcc\x84"
+ "\xbf\x19\xea\x07\xe3\xf4\x20\xe8\x9b\x66\xe4\x39\x75\xc2\x21\xbe"
+ "\x4e\xf1\xe9\x5f\xf1\xfd\xfa\x6b\x0d\x84\xf3\x79\x52\xc3\xd3\x98"
+ "\xcd\x7e\xd5\x66\x9f\x27\x7b\x82\x3e\xaa\xcf\x56\x72\xfe\xd9\x99"
+ "\x9c\x7a\x95\x99\x37\x8f\xfb\x01\xd6\x31\x58\xcb\x8c\x4d\x56\xe0"
+ "\x49\xde\x6c\x48\xb8\x0c\xfd\x3d\xd2\xa3\x22\x15\xda\x86\xe7\xc0"
+ "\xb3\xaa\xf8\x60\xbf\x7d\x46\x5b\x15\xe1\xa1\x8d\x4a\x4b\x29\xe8"
+ "\xfe\x35\x44\x68\xb3\x8a\xef\xee\x87\xbe\xa6\x7a\xb7\xfa\x59\xce"
+ "\xb0\x30\x78\xe6\x90\x29\x1a\x5f\xc2\xaf\xf6\x0d\xf6\x8e\x3f\x8e"
+ "\x44\x78\xd4\xfb\x72\x86\x15\xb0\x76\xfd\x6f\xa7\xdd\x1c\xcf\xed"
+ "\x46\x0a\xfd\x55\xdd\x4e\xbb\x4d\xed\xb4\x2b\xf4\x57\x7d\x1b\xed"
+ "\x96\x8c\xf2\xdc\xee\x70\xa1\xbf\x91\xb7\xd3\xae\xc7\xfc\x1f\xd0"
+ "\xae\xd0\xdf\x8c\xdb\x69\xd7\xd2\x0e\xdd\xc2\x6e\x8f\x17\x8e\x8e"
+ "\x69\x8f\x17\x6e\x8f\x0f\x8e\xb6\xf3\xfe\x91\x61\xb7\xc7\x03\x47"
+ "\xcd\xed\xf1\xc0\xed\xd1\xff\xb3\x76\xe9\x7f\x7b\xb4\xff\x2c\xaf"
+ "\x3d\xda\xdf\x1e\xdd\x3f\xf3\xc8\xff\xa8\xcb\xf2\x39\xcf\x19\xf8"
+ "\x90\x78\xc2\xe5\x76\x35\x70\x21\xcf\x7d\xba\x86\x8b\x24\x23\x01"
+ "\xc3\x02\xf3\x48\x50\x24\xb5\x0f\x7d\x9e\xb1\x2a\x9f\x28\x75\x4a"
+ "\x4e\xb9\x3b\xa5\x46\x69\xb4\x0d\x26\xe9\x36\xde\x5e\x90\x64\x55"
+ "\xfc\x12\xce\x1f\x8e\x23\xc4\xb2\x54\x43\x58\x3b\x5d\x0d\xd9\x69"
+ "\x91\x64\x82\x9d\xa0\x3d\xc2\x72\x24\x15\x30\x0c\x70\xcc\x98\x67"
+ "\xc5\x35\x2f\x08\xee\xb3\x01\xff\x42\x1b\x56\xb2\x97\x33\x2b\x22"
+ "\x13\x68\x3d\x33\xe8\x8d\x66\x3e\xf7\xb9\x4f\xf9\x74\x0d\x59\x0b"
+ "\xbf\xe1\x99\x97\x7c\xcc\x44\xb9\x1d\xf4\xc9\x96\xac\xcf\xeb\x4d"
+ "\x8a\x52\x03\xea\x98\xa0\xcb\x36\xa5\xff\x80\x36\xf7\x78\xb2\x06"
+ "\xf4\x5a\xac\xbb\x87\x33\x2b\xfb\x6b\x89\xf2\x88\x19\xf5\xf7\x52"
+ "\xd5\xe1\x44\x42\xda\xb1\xb9\xf8\x72\xc1\xd3\x7c\xf1\x7e\x6c\x07"
+ "\x6d\x99\x1b\x39\x18\xdb\xe0\xe9\xc5\xd8\x5f\x3e\x67\x44\xb2\x21"
+ "\x05\xd7\x85\xd2\xbc\xd1\x4f\xf0\x2d\x02\xce\xf7\x6c\x84\x32\xd5"
+ "\xd9\x33\x79\xc0\xdc\x4e\x85\x7c\xf6\x03\x91\x95\x96\xab\xc4\x90"
+ "\x74\x83\xd4\x29\x4a\xb7\xe0\xb3\x9b\x83\xa7\x11\x4b\xf0\x34\x7f"
+ "\xe8\x43\x8e\xd8\x5f\x7c\x96\x78\x1e\x6d\x14\x42\x1f\xf7\x1d\x4e"
+ "\xf5\xdc\x47\x58\x4b\xba\x4d\x08\xe5\xcd\x38\x86\x86\xb4\xab\xd0"
+ "\x97\x63\x4f\xe0\x38\xf3\x39\x53\xab\x2c\xe9\x9a\x47\x98\xcd\xae"
+ "\x2c\x0a\x6d\x3f\xb0\x0e\x94\x30\x3b\x8c\x5f\x09\xf5\xb3\x01\xbc"
+ "\x07\x9d\x3d\x0f\xe5\x95\x2b\x8a\x32\x9a\xff\x78\x8a\x46\xe9\xa5"
+ "\xce\x53\x46\xd7\x7f\xc3\x23\x38\x0e\xc7\x82\xe0\x79\xcf\xd6\x29"
+ "\xca\x12\x99\x1d\xc2\xaf\x06\x9f\x07\x75\x70\xcd\xa9\xe1\x73\x3a"
+ "\xe9\xb1\x1e\x5c\xcf\x11\xae\x9b\x9c\xae\x9b\xf8\x9c\x69\xa1\xc2"
+ "\xf5\x7d\xc2\xf5\x7a\xa7\xeb\xf5\xda\x47\xd0\x2e\x57\x56\x8b\xef"
+ "\x04\x6b\x99\x01\xd7\x35\xb4\xf9\xd3\x77\xea\xee\x67\x10\xea\x55"
+ "\x37\x29\xca\xae\x35\x03\x5f\xc1\xf5\x5a\xa7\xfb\x6b\x8f\x24\x87"
+ "\x93\x91\xdb\x70\x4c\x8f\xf9\x9b\x7c\xbb\x84\x31\x5b\x4e\x19\xf5"
+ "\x2d\x82\xf6\x8a\x9d\xdb\x83\xf3\xd5\xd0\x66\xb1\x05\x64\x3d\xa0"
+ "\x4f\x13\x3e\xd3\x79\xfc\x63\x13\x12\x16\x27\xa8\xfb\xcc\x53\xcf"
+ "\x8b\x9f\xa3\x7e\x65\xf1\xb2\x45\x89\x43\xfb\xcc\xeb\x42\x88\x13"
+ "\xef\xa8\xf8\xcc\x40\x9e\xcb\x99\x34\xc6\x98\x07\x32\x96\x52\x05"
+ "\xeb\xed\x0d\x92\x03\x74\xb5\x87\xcc\x0d\xb7\xe7\xce\x81\xf9\x33"
+ "\x52\x6d\x48\x19\x01\x63\x7f\x6c\x0b\xb5\xfb\xab\x09\x59\x0f\xd7"
+ "\x0d\x29\xc7\xf0\xdc\x6e\x7a\x6e\x1e\x21\xd4\x5e\x95\xe2\x4f\x4a"
+ "\xd4\x57\xa9\xcd\x0b\xae\x5d\xa0\xf6\xbd\x6b\x44\x69\xcb\xf4\x27"
+ "\x7f\x4f\xab\x52\x1e\xe0\x4c\xca\xbf\x73\x35\x4a\x94\x17\x8e\x84"
+ "\x96\x92\x01\xc9\xfe\x04\xaf\x1f\x4a\x83\xf3\x70\x1d\xaf\xd1\x76"
+ "\x28\xad\x8f\x0f\xc2\x7a\x68\x03\xc3\xdf\xe9\x79\xfc\xf9\x23\xa1"
+ "\x66\xc2\xe4\xd6\x63\x6f\x60\x5f\xd5\x3d\xf1\xfb\xc2\xb1\x0d\xd8"
+ "\x3f\x93\xe2\xd8\x7a\x9f\x7c\xa8\x9f\x44\x02\xa0\xfe\x0a\x6e\xf3"
+ "\xa4\x31\x88\x05\xb6\xac\x63\x91\x7c\x66\xb7\x7e\xdb\xdf\x22\xfe"
+ "\xf9\x6f\xc1\xdc\x7c\x8b\xf8\xb6\x64\x1d\x9f\x67\xf2\x55\xd7\xe3"
+ "\xd8\x42\x33\x01\xcd\x4a\x32\x0c\xce\x25\x9b\x48\x7c\x13\x9e\x83"
+ "\x39\x68\xf1\x84\x2d\xd7\x41\xbe\xb3\x86\xf5\x37\x70\xc1\x93\x06"
+ "\xf3\x30\x6e\x2d\x61\xfd\xcd\x81\x5a\xe0\x2d\x98\x63\x7c\xf7\x49"
+ "\x83\x9b\x14\x15\xeb\x3f\x1b\x48\x48\x1a\xce\xe9\xdc\x91\xea\x0f"
+ "\xae\x5b\xf1\x7b\x5a\xf8\xae\xeb\x66\x28\xcf\x31\x14\x42\xb9\xcc"
+ "\x50\x48\xd4\x2f\xa2\xec\x74\xfc\xf2\xef\xe7\xf1\xb6\x27\xca\x41"
+ "\xce\xac\xff\x1b\x39\x5e\x5d\x4a\x02\x66\x10\x1f\x47\xac\xf7\x44"
+ "\xa2\x9c\x60\x82\xf2\x32\xa2\xac\x04\xbd\x1f\x6d\xf3\x69\xbf\x45"
+ "\xfb\x7c\x05\x41\x9b\x3d\xaf\x5c\x6c\xd9\x7d\xd5\x0a\x18\xd6\xd0"
+ "\x09\x7d\xbe\x39\x55\x7e\x1e\xde\x33\xdb\x22\x7c\xeb\x6a\x16\xbe"
+ "\x75\x35\xd3\x6f\x5d\xa6\xd4\x18\xf6\xad\x0b\xbf\x71\x4d\x88\xf1"
+ "\xe1\xb1\x3d\xfc\xee\xf5\x80\x05\xf8\x60\xa9\xa6\xab\x7d\xa9\xa6"
+ "\x5b\xde\x55\x12\x5c\x69\x6e\x00\x19\xad\x94\x6c\x4d\x22\xc1\x7c"
+ "\x73\xdc\x7d\xe5\x86\x63\x84\x7f\x2b\x4f\xb7\x37\xcd\xd0\xc9\x8e"
+ "\x36\x8a\xe6\xd0\x2e\x81\xab\x15\x68\xe7\xef\xba\x3e\x81\xf4\xdd"
+ "\x71\x95\x84\xcf\xbe\x90\x41\xe3\x3e\x61\x8e\x3e\x5b\xb3\x46\x7d"
+ "\xb3\x59\xf3\x58\x6b\xb3\xe6\x91\x40\x33\xfb\x36\x36\xf3\xb2\x8a"
+ "\xa0\xbf\x2d\x9f\xf5\x8f\xa6\x1d\x68\xa3\xb6\x98\x89\x2d\x28\x3f"
+ "\x0f\x79\x19\x9e\xdd\x0b\xbf\xa7\xa4\xaf\x20\x2a\xee\x5b\x0d\xa9"
+ "\x88\xbb\x4a\x06\x00\xed\xf1\xdb\xc1\xf6\x3a\xf6\xed\xc0\x0e\x3a"
+ "\x0d\x7e\x3f\xb8\xde\xac\x51\xf2\xc1\xd1\xfa\xf1\xf3\xd5\xa4\x75"
+ "\x67\x7f\x83\x31\xf9\x03\x92\xde\xca\x9f\x37\xae\xe5\x08\xda\x95"
+ "\xf9\xac\xe3\x3a\xbe\x7b\xb4\xfe\xa8\xe6\x24\xae\x2b\xe1\x12\x76"
+ "\x54\x4c\xbf\x3d\xec\xa8\xa0\xf2\x33\x7e\x67\xe3\x73\x81\x8e\x57"
+ "\x91\x9e\x40\xd7\xab\x66\xe5\x58\xa0\x5d\x45\xfd\x7b\x40\xb7\x1a"
+ "\x19\xdd\x28\x9d\xa1\xde\xc5\x79\x40\xaf\x0b\x8c\x86\xe5\x16\xa0"
+ "\xdf\x7e\x6c\x63\x5a\xe4\xee\x24\xab\x12\xf4\x26\x65\xb9\xf5\x0c"
+ "\xdd\xb3\x82\x74\xdc\x75\xa3\xb4\x53\x2b\xac\x37\xf8\xbd\xf2\x7a"
+ "\x41\x7f\x53\x6b\xf0\xa4\xd0\x9b\xc1\x93\x34\xed\x7c\xbb\x64\xf4"
+ "\x9c\x4f\xfc\xcb\xeb\x4f\x32\x7a\x2e\x11\xe8\x89\x3e\x6e\xcb\x35"
+ "\x5d\x6d\x2d\x40\xcf\xeb\x40\xcf\x44\x13\x79\x27\x81\x04\x1b\x1b"
+ "\x6a\xf0\xbb\xce\x7d\x2f\x54\x10\x32\xf6\x09\x9e\xab\x30\x9c\xa6"
+ "\x74\xdd\x03\x74\xb5\xe9\x72\xf3\xf0\x7b\xa6\x83\xae\x49\x40\xd7"
+ "\xeb\x40\xd7\xcb\x12\x5d\xed\x2d\x40\xd7\x16\xa0\x6b\x0b\xd0\x55"
+ "\xf8\xe6\x39\x73\x3e\xd0\x15\xbf\x8f\x65\x1d\xd0\xe2\x37\x4f\xfc"
+ "\xb6\x84\x74\x45\xbf\x6a\x6e\xb9\xa6\x17\xfd\xd6\xf9\x8a\x86\xec"
+ "\x98\x4b\xfc\xfb\x59\x89\x22\x7d\x3f\x51\x41\x3f\x55\x8f\xef\x23"
+ "\x4a\x68\x0f\xf8\xbe\x8e\x20\x7d\x8d\xfb\xec\x64\xe5\x74\xf2\x88"
+ "\x6d\x13\xa3\xb3\xd1\xf6\x11\xda\x76\x07\x5f\x5f\xae\x51\x6e\x49"
+ "\x22\x11\x48\xf3\x71\x17\xd4\xe4\x68\x54\x05\x71\xa5\x39\xb7\x79"
+ "\x6a\x15\xd0\x69\x14\xd2\xfd\xf6\xe7\xed\x89\x51\xb7\x3e\x6f\x8d"
+ "\x3b\xff\x6f\xde\xde\xe9\x79\x6b\x1c\xe3\x7e\xde\x9e\x08\xba\xbd"
+ "\x79\x7b\x42\xf5\x7f\xf3\xf6\x5f\x61\xde\x56\xd9\x5c\xe7\xad\x43"
+ "\x6e\x49\x88\x8d\x9f\x33\x7f\xd1\xfc\x45\xaf\xa9\xe7\xae\x48\x8c"
+ "\x5d\xca\xa4\x17\x99\xfc\xa2\xb1\x73\x91\xca\xb7\x61\xbd\x3e\x1e"
+ "\x5a\x43\xf6\xf6\xac\x51\x72\x2f\x87\xfa\xf2\xba\xbf\x99\x38\xdd"
+ "\x47\x71\x6f\x83\x1c\x8e\xf3\x3b\x07\x64\xec\x8b\x8a\x33\x71\x9f"
+ "\x83\x14\x68\x48\x68\x24\xf8\x9b\x7d\xc3\xd5\x6a\x70\x9f\x63\x5e"
+ "\x2e\xdf\x80\xfb\x1c\xcb\x4a\x50\xb6\xf8\x72\xff\xfd\xd1\xa0\x43"
+ "\xbc\x1c\x4a\x5a\x5f\x8e\x56\xbe\x79\x9a\xf8\x07\xd6\x90\x71\x1c"
+ "\xc7\xf3\x86\xb4\x46\x90\xfb\x4e\x17\x19\x5e\x6a\x24\x28\xeb\x5c"
+ "\x54\x9c\x0a\x52\xa7\xac\x86\x63\xcd\x35\x75\x4a\xd6\x39\x38\xd2"
+ "\x3c\x7a\x20\xfb\x37\xf0\xb9\x13\x75\xf6\xbf\x3c\xad\xc2\xef\x9b"
+ "\x3b\x42\xf8\xfa\x3d\xa0\x67\xec\xb9\x61\x55\xae\x49\x40\x3f\xf1"
+ "\x47\x79\xfc\x4e\x89\x63\xb0\xe6\x2a\xe8\x12\x6b\x45\x5b\x51\x4d"
+ "\x6f\x9c\x5f\x20\x5f\xd5\x1f\xbc\x58\xa3\xc4\xf9\x66\x09\xee\xa4"
+ "\x5f\x0b\xef\x01\x7d\x34\x6d\xc9\xe5\x6b\xcd\xdd\x27\x8d\xf1\x55"
+ "\x13\x65\x4b\x56\xb5\x06\x64\x9e\x68\x94\x57\xd6\xc1\xb5\x37\xe0"
+ "\x1a\xfb\x5e\xf8\x75\x2d\xef\xf7\x85\x15\x31\x0e\x78\x5a\x71\x45"
+ "\x51\x4d\xe3\x3c\xad\x67\x3a\x49\x83\x75\xf3\x24\x8d\x6d\x67\x7f"
+ "\x93\x0d\xe5\xc9\x3e\xfd\xcd\xad\x9b\x27\x85\xda\x36\x4f\x1a\x3c"
+ "\xe5\x09\xfa\x5d\x1c\xea\x7f\xf5\x02\xbe\x43\x6b\xce\x48\x35\xd4"
+ "\xb7\x34\x07\xcf\x0d\x6f\xce\x99\x63\x38\x96\x9c\x47\xd4\x93\x10"
+ "\xfb\xaa\xdf\x1d\x9b\xc7\xdb\x9e\x8c\x02\xec\xcb\xfb\x80\x1c\x1f"
+ "\x07\xd8\x17\xdd\x16\xfb\x98\x1f\x81\x9d\x30\x0c\xac\x20\xd0\x56"
+ "\x3d\xce\x21\x94\x51\x77\xc3\x38\xe0\xfc\xc0\x79\x40\xb1\x10\x70"
+ "\x50\x9c\x2b\x38\x8f\x10\xeb\xe8\xbc\x75\x99\x37\x38\x57\xee\x37"
+ "\x13\x15\xce\x15\xc4\x42\x9c\x2b\xe8\x9f\xf3\xb6\x30\x57\x02\x6b"
+ "\x89\xea\x1d\xc0\x41\xa3\xad\x94\xce\x17\x94\x25\xcb\x6d\x4e\x18"
+ "\x88\xdf\x76\x9c\xe6\xca\x06\x71\xae\x88\x18\x08\xf3\xc1\x86\x73"
+ "\x65\xb9\xe6\xb1\x1b\xcb\xa5\xb9\xf2\xf2\x19\x15\xa1\xf8\x98\xf5"
+ "\x0f\x6d\x3e\xcc\x95\x4a\xad\x99\xd8\x45\x0c\x84\xb9\x82\xfb\x87"
+ "\x28\x06\xfe\x11\x30\xb0\x09\x30\xd0\x0c\xe7\x61\x8e\x6c\x5f\x20"
+ "\x60\xa0\x30\x37\x5a\x97\x0b\x18\x78\x59\x4d\x6e\xf4\x41\x0c\x7c"
+ "\xc7\x83\xec\x72\xc6\x05\x03\xbf\xea\x7e\x7b\x18\xf8\x15\x8d\x7f"
+ "\x84\x34\xbc\x01\xf4\x44\x3a\x8e\x0d\xe5\x6d\xe5\x79\x80\x7d\x93"
+ "\x7f\x66\x74\x4b\x70\x4f\xb7\x3d\xc2\xda\xe5\x16\xe3\xdc\xd0\x0d"
+ "\xf8\xbc\xc9\xd6\xd2\x96\x76\x7c\xd6\xfe\x62\x67\x9c\x43\x7c\x43"
+ "\xac\x43\x8c\x43\xbc\xc3\xf9\x81\x38\x87\x18\xf7\x2b\xc0\x7f\x28"
+ "\x37\x54\xc4\xd5\x51\xfc\x4b\xbf\x40\x54\xe9\xa3\xc9\x23\xc6\x62"
+ "\x3b\xe8\x36\xd7\x08\xe2\x9f\xf3\xda\x86\x78\x87\xb4\xdd\x72\x9d"
+ "\xe1\x1d\xae\x71\x88\x6d\x6d\xd6\x38\xa0\x2d\xd0\x84\xe0\x1a\x47"
+ "\xed\x14\x99\xc1\x3d\x76\x74\x63\x3a\x49\x4e\x37\x02\x7a\xf6\xd7"
+ "\xb6\xb6\x7a\x49\x8d\x4a\xd4\x4b\x70\x8e\xe3\x5c\x37\x29\xaa\x23"
+ "\x98\xee\x39\x41\xcb\xf4\xa1\xb3\x3d\x68\x19\x74\x7e\x49\xdf\xaf"
+ "\x99\xc8\xbe\xdd\x83\x7e\xdf\x7d\x44\x32\xbf\xb9\x53\x21\x8e\x2b"
+ "\xbe\xe7\xec\x27\x80\x2f\x37\x4f\x43\x9d\xad\xc9\xb6\x79\x9a\x2f"
+ "\xfc\xf6\x97\x78\xad\x66\xf5\xd1\x64\x42\xa6\x24\x7b\xcb\x6b\x35"
+ "\xd4\x77\x86\xff\x26\xfa\x17\xfc\xcb\xd1\xbe\xdc\x37\xd1\x9d\x80"
+ "\x2f\x42\x17\xdb\x33\xc8\x75\x9d\x56\x9d\x6e\xe3\x1b\xd4\x29\xe4"
+ "\x49\xe8\xd7\xf9\x32\x1b\x21\x65\x16\xc0\xbd\x71\x0b\x81\xc6\x8b"
+ "\xf5\x7b\x39\xb3\xaf\x49\xf1\x25\xda\x2b\x1a\x00\x7b\x7d\x9d\xb1"
+ "\x97\xe1\xec\x97\xf4\x1b\x81\x55\xa7\x0d\xc7\xb6\x26\x94\x92\x40"
+ "\x58\x7f\x7d\x2f\x2a\x4e\xaf\x5e\xb1\x8a\xe0\x7e\xd7\x4e\xf0\x7b"
+ "\xfc\x8d\x6e\xc3\xf4\x70\x7f\x57\xfe\x9b\xc9\x0a\xed\xf3\xe4\x11"
+ "\xfe\xe5\xc9\x0a\xf4\x55\x78\x9f\xd3\x2b\x39\x38\xc7\x7c\x9f\xf4"
+ "\x04\xaf\xaf\xbf\xe1\x4b\xe5\x32\x0e\xea\x54\x5a\xf4\x64\x7d\x92"
+ "\x3f\xc1\xfa\xcc\x9f\x4e\x4f\xb0\xfe\x86\x04\x15\xf5\x75\xa0\xf7"
+ "\xd9\xf4\x04\xef\xb5\xc3\xf9\x3f\x71\x01\x24\x3b\x25\x98\x94\x95"
+ "\x57\xd2\x36\xca\xca\x3f\x23\xd8\x06\xf0\x3f\xfc\x3e\x48\x36\x26"
+ "\x85\x02\x0e\xe8\xe1\xfa\x57\x64\xe3\x95\x5e\x70\xbc\x08\xff\xd7"
+ "\x49\xa3\xe2\x94\xb9\xac\x9c\x23\x81\xab\x87\xf1\xc0\xc7\xbc\x11"
+ "\xf7\x50\xa6\x11\x3f\x58\x47\x5a\x8d\x35\x3a\xd0\x61\x6b\x4c\xb8"
+ "\xc7\x9e\x4f\x7f\xb9\x89\xe3\x5f\xbe\xcc\xa5\xbf\x7c\x05\x9f\x6d"
+ "\xe7\x5f\xfe\x1e\x9f\xbd\x21\x45\x2d\xf8\xd7\xea\xa9\x2f\xe0\xfa"
+ "\xeb\x61\x04\xfb\x8a\xcf\xc5\xe7\x6d\x4c\xd0\x08\xcf\xec\x4b\xfb"
+ "\x86\xcf\xc4\x36\x9d\x9f\x89\xf9\xeb\xd5\x53\xf1\x99\xa7\xe3\xe1"
+ "\x18\x04\xf4\xa8\x47\x3a\xe0\xf3\x39\x3e\xba\x13\x9f\x1e\xed\x43"
+ "\xef\xb1\x36\xb8\xbb\xe7\x5d\xe1\x1e\x13\xd5\xfb\xe1\x9e\x56\x9e"
+ "\xd6\xa7\x6d\xc0\xda\xf8\x09\x9e\x7f\x2a\xda\x40\xda\xd2\xf0\x9b"
+ "\xe9\x6c\xad\xfc\xe6\x09\xb6\x56\x32\x9a\x52\x5e\x79\x39\xba\x13"
+ "\xd0\x4d\x85\xeb\x6a\x9d\xe2\x1b\x85\xa3\x8d\x6f\xa2\x7d\x90\xde"
+ "\xc8\x37\x22\x2f\x21\x1f\x89\x3c\x44\xfb\x69\x26\xc4\x99\x67\xe0"
+ "\xb7\xbf\xd0\xce\x0b\x62\x3b\xd0\x07\x22\xf2\xd1\x53\x70\xbd\x2d"
+ "\x1f\x9d\xe9\x2d\xf1\x51\xed\x61\x6b\x1a\xcf\x23\x1f\x19\x5e\xca"
+ "\xc4\x76\x36\x49\xfd\x99\xac\x40\x1e\xfb\x17\xe3\x2d\x33\xd2\xe9"
+ "\xa9\x54\x12\xcc\xde\xa7\x76\x0e\x7d\x9f\x54\x43\x30\xf6\x55\x7c"
+ "\x0f\xec\x43\x36\xa7\x26\xe2\x7b\x6c\xbc\x11\x06\xed\x5e\x21\xc2"
+ "\x3d\x9b\xb1\x6d\x71\x0c\x80\x66\x44\xbc\x47\xac\x9f\xcd\x69\xa0"
+ "\xdf\x7d\xe9\x3d\x8c\xe7\x2e\xba\xe1\x9f\xda\xf3\xae\x3c\x77\x7f"
+ "\x2a\x01\x01\x18\x64\xab\x97\xae\xe2\x73\xec\xac\x6f\x87\xec\xad"
+ "\xdf\x44\x23\x5d\x95\xec\xfc\x99\xee\x4e\x3c\x21\xb4\x6f\x75\xd3"
+ "\xfe\x99\xe1\xb2\xf6\xa3\xa1\xfd\x64\x68\x1f\x65\xb7\x97\xd0\x66"
+ "\x77\x66\x26\x6d\x27\x99\xb5\x2f\xf2\x2d\xaf\x8b\x08\xd7\xa6\xa0"
+ "\x3f\xea\x59\x5f\x86\xa7\x5f\xd2\x31\xa2\x7e\x50\x4a\x4e\xcf\xb9"
+ "\xf8\x41\x39\xfb\xc9\xed\x4d\x33\x0b\x3e\x50\x67\x68\x6c\x43\xb4"
+ "\x8d\xa1\x0c\xba\x1b\xe4\x37\xc9\x0f\xea\x34\x5e\xbf\x6c\x48\xaa"
+ "\x73\xf2\x83\x3a\x63\xc0\xfa\x26\xc5\xd9\xd0\x16\x25\x51\x42\xb9"
+ "\x9a\x9d\xff\x32\xc6\xf9\xbc\xe4\x67\xc8\xce\xa3\x0f\xb7\x60\x27"
+ "\x6e\x3a\x52\x8c\x76\xc2\xb3\xe1\xa2\x6d\xd6\x83\xee\xeb\x85\x8c"
+ "\xdc\x50\x20\xc9\xc8\x0d\x05\x9e\x65\xe4\xb3\x67\xda\x97\x91\x2f"
+ "\x34\x49\x32\x72\xfd\x78\x36\xef\xeb\x9f\x66\xf3\xfe\xdb\x1f\xa8"
+ "\xdd\x19\xda\xb3\xbd\x17\xaf\xe6\xff\x32\xa0\x08\xf9\x7c\x3b\xc8"
+ "\xbc\x7b\x93\x4a\x95\x7b\x40\xc7\xb2\x83\x7c\xbc\x26\x85\xf8\x62"
+ "\xfc\xb7\x35\x30\x86\x46\x5b\x2d\xa9\xf0\x45\x19\xf9\x0b\x68\xe7"
+ "\xdb\x99\x95\x66\x2b\x81\x75\x2e\x83\x8d\xcb\xb9\xdf\x02\x2d\x7c"
+ "\x8c\x56\x2b\xad\x87\xd7\x60\x5d\xab\x47\x39\xf9\x20\x57\xaa\xdc"
+ "\x96\x82\x32\xf4\x42\xb3\xb3\x0c\xdd\x92\x75\x6e\x9e\x7b\xd9\xf9"
+ "\xdb\x50\xdb\xff\x63\xef\xfd\xe3\xa2\xa8\xf6\xff\xf1\xc3\x2c\x28"
+ "\x1a\xc8\xea\x05\x5b\xbd\x58\x6b\x61\x61\xa1\xa2\x61\x17\x8b\x62"
+ "\x31\x2d\x2b\x15\x34\x4d\x32\x4d\x34\x34\x28\x40\x54\x54\x34\x05"
+ "\x34\xf5\xad\xa6\x08\x06\x5c\x2c\x44\x2c\xbd\x69\xd7\x1f\xd8\x47"
+ "\x6f\xda\xd7\xba\x78\x93\xde\x68\x08\xd8\xd5\x1b\x76\x35\x57\x43"
+ "\x43\x43\x5d\x15\xe5\xd7\xee\xce\xf7\x75\xe6\xcc\x3a\x33\xbb\x33"
+ "\xcb\xce\x2c\x10\xfa\xf6\x8f\x7d\x88\x33\x67\xce\xcc\x79\xbd\x9e"
+ "\xe7\x75\x9e\xcf\xd7\x9c\x73\x66\x05\x9f\x3b\x9f\xdd\x83\xb9\x33"
+ "\xce\xe5\x63\x3e\x60\x26\x9c\x59\x0f\xfc\xd9\x80\x79\x34\xe6\xce"
+ "\x66\x01\x77\x3e\xb7\xdc\x3e\x77\x3e\x7b\xe6\x3e\x77\x6e\x2d\xee"
+ "\x6c\xc9\x1f\x58\x73\xe7\x73\x63\x94\x71\xe7\x73\x11\xf7\xb9\x73"
+ "\x7b\xe3\xce\xe7\x42\x2c\xdc\xd9\xbc\xd4\xbb\x03\xce\xe7\xe7\xdf"
+ "\xe1\xce\xbf\x06\xdb\x72\xe7\x5f\x47\xda\x72\xe7\xb3\xc9\x42\xee"
+ "\x7c\x69\xbc\x2d\x77\xfe\x75\xad\x14\x77\x86\xb8\x55\x83\xb9\x33"
+ "\xc6\x17\xe6\xd1\x98\x3f\x9b\x81\x3f\x13\xac\xfd\xfa\x8d\x32\xee"
+ "\xfc\xeb\x41\xc7\xb8\x73\x55\x2f\x71\xee\xfc\xcb\x69\x69\xee\xfc"
+ "\xcb\x69\x71\xee\x7c\xe1\x1b\x8e\xf3\x5c\x58\xd5\xfe\xb9\xf3\x85"
+ "\x00\x71\x7e\x73\x61\x30\xe1\xce\x55\xbe\x2d\xcf\x9d\xab\x7c\xc5"
+ "\xb9\xf3\x85\xed\x84\x67\x54\x69\x6d\xb9\x33\x5c\x23\xca\x9d\x2f"
+ "\x9c\x61\xaf\xf1\x15\x72\x67\x52\x07\x8c\x99\x0d\xd2\xdc\xf9\x62"
+ "\x36\x19\x43\x2f\x4e\x27\x63\x28\xf1\xa9\x2d\x77\xbe\xf8\x5c\xf3"
+ "\xdc\x99\x60\x88\x79\x4e\x49\xee\x7c\x71\xb9\x2d\x77\xfe\xe5\xb4"
+ "\x38\x77\xae\x9e\xcc\xe1\xe8\x37\x93\x90\x3b\x5f\x3c\x76\x77\x70"
+ "\x67\x49\x6c\x05\x08\xb9\xf3\x6f\x1b\xe5\x73\xe7\xdf\x8e\xcb\xe3"
+ "\xce\x18\x73\x62\xdc\xb9\xba\x97\x35\xe6\x84\xdc\xb9\x7a\x88\x38"
+ "\x77\xae\x1e\x23\xe4\xce\xb8\x7e\x31\xee\x5c\xbd\x58\x50\xbf\x0d"
+ "\x77\xae\xde\x20\xe4\xce\xa4\x1c\xc7\x9d\x2f\xe9\xd8\x5c\xc4\x72"
+ "\xf9\xdc\xf9\x52\x6f\xfb\xdc\xf9\x52\x5f\x21\x77\xae\x36\x12\x8e"
+ "\x7c\x69\x1c\xe1\xce\x97\xd4\xe4\xf8\x2f\xcb\xf8\xc7\x39\xee\x4c"
+ "\x8e\xdb\x72\xe7\x4b\x71\xcd\x70\xe7\x60\xc7\xb9\x73\xed\xa4\x92"
+ "\x3b\xdc\xb9\x76\x92\x85\x3b\x9b\x81\x3f\xe6\x03\x0f\x80\x5f\x35"
+ "\x5e\x0f\x81\xfb\xdc\x45\x97\xcb\xbd\xec\xf3\xe7\xeb\xb9\x1c\x7f"
+ "\xbe\x76\x89\xf4\xfd\x6b\xc7\x48\xdf\xbf\xb6\xf6\x4e\x8e\x19\xb8"
+ "\x33\xe6\xd0\x6c\x8e\xf9\x44\x3a\xfc\x76\x2f\x2c\x61\xf8\xf3\xae"
+ "\x1b\xf5\x14\xe6\xd0\xab\xf0\xdc\x4c\xe0\xd1\xdf\xb1\x1c\xba\xbc"
+ "\x36\x98\xe5\xd1\x57\x1b\x60\xcc\xd0\xa7\xa7\x30\xeb\xb5\xdc\xe1"
+ "\xf9\x2a\x19\xfe\x9c\x54\x8f\x3e\xbb\x1d\x8c\xdf\xc3\x57\x16\xa5"
+ "\x90\x72\xd0\xce\xd3\x1c\xdf\xbe\xbc\x5d\xc0\xb7\x93\x18\xbe\x7d"
+ "\x02\xf3\xed\xef\x4a\x10\xfa\x36\x85\x70\x6e\xcc\xb7\x31\xef\x06"
+ "\xbe\x5d\xb1\xb1\x3b\x5d\x5a\xb7\xe2\x72\xa5\x85\x73\xaf\x85\xff"
+ "\x83\xaf\xf5\x87\x0b\x10\xda\x38\x03\xb9\x82\x4f\x2a\x3f\x80\x7b"
+ "\xe0\xf2\x75\x2b\x7e\x47\x96\x72\x30\x66\x57\x10\x5e\x7e\x75\xbf"
+ "\x59\x90\xd3\xfe\x7d\x14\xd6\x24\xcc\x78\x0c\x76\xc0\x3c\xcb\x92"
+ "\xd3\x36\xf7\xe9\x6f\xa0\x7d\x08\x37\x17\xe6\xb5\xaf\xf4\xb6\x70"
+ "\xf3\x74\x96\x9b\x37\x78\x03\x37\x4f\xb4\x70\xf3\xdf\x17\x28\xe4"
+ "\xe6\x27\x18\x8e\xf7\x4a\xcb\x73\xbc\x0d\xf3\xfe\x78\x6e\x8e\x79"
+ "\x39\xe6\xe2\x98\x97\x63\x9e\x8e\xb9\x39\xe6\xe9\x66\x96\x9b\xe3"
+ "\xbd\x09\xeb\xeb\x9a\xe1\xe6\xc0\xdd\xe8\x0e\xe5\x23\x18\x6e\xee"
+ "\xc2\xe7\xe6\x35\x57\x94\x71\xf3\x9a\x1a\x3e\x37\xc7\xb8\x97\xcb"
+ "\xcd\xb1\xef\x6d\xde\xc5\xe2\x6f\x2f\x80\xff\xb0\xaf\xec\xbe\xbb"
+ "\x63\xfd\x88\xfd\x86\x7d\x86\x7d\x27\xe9\x37\x3e\x37\x07\xdc\x95"
+ "\xd6\xff\x71\xdc\xdc\xdf\x8a\x9b\x63\x2e\x0e\xb6\xab\xc2\x1c\xbd"
+ "\xbc\x08\x6c\x33\x0b\x78\x3a\x70\x74\x6b\x7e\x8e\xfd\xeb\x18\x3f"
+ "\xaf\xa9\xbc\x93\xdb\xa6\xbc\x3b\xe4\xe3\xdc\x76\x37\x0b\x3f\xbf"
+ "\x5a\x69\xcb\xcf\xaf\xd6\xf0\xf8\x79\x85\xde\xe5\x77\xb5\x90\x9b"
+ "\xdf\xf2\xb4\xe5\xe6\xd7\xfa\x4a\x72\xf3\xee\x22\xdc\xdc\xc7\xc2"
+ "\xcd\xaf\xbd\xa1\x8c\x9b\x5f\x8b\x94\xe2\xe6\x75\x6a\x3e\x37\xbf"
+ "\x76\x80\xe3\xe6\x49\x3c\x6e\x7e\xd9\x57\x9a\x9b\x5f\x66\xb8\x20"
+ "\xad\x4e\x0c\xc4\x75\x61\x4e\x85\xdf\x15\x6a\x99\x75\xf5\xd7\x63"
+ "\x31\xaf\xc2\xb9\x0c\x78\x7e\xe0\x56\xd7\x07\xf3\x39\x3a\x7e\x47"
+ "\x68\x8f\x47\x25\xce\x40\x0f\x61\x2e\x85\x79\x94\x85\xf7\xe2\xf2"
+ "\x98\x4f\xb5\x2e\x97\x32\x9c\x10\xe7\x52\x86\x73\x0c\x4f\x66\xd6"
+ "\x63\x5e\xdb\x8f\xc7\xc4\x96\xe5\xea\xd7\xf6\x8b\x73\xf5\xeb\xe3"
+ "\x09\xaf\xb9\x76\x10\xfb\x45\xc8\xd5\xe1\x1a\x51\xae\x7e\x7d\x15"
+ "\x7b\xcd\x7e\x21\x57\x27\x75\xc0\xf8\xbc\x55\x9a\xab\xdf\x08\x23"
+ "\xe3\xf5\x8d\xae\x64\xbc\x66\x7d\x6c\xc3\xd5\xaf\x5f\xe2\x73\x75"
+ "\xec\x7f\x5b\xae\x4e\x30\xc5\x3c\xa7\x24\x57\xbf\x31\xd0\x96\xab"
+ "\x5f\xf6\xc5\x5c\x5d\x1c\x57\xb5\x3e\x42\x5c\xdd\xdc\x57\x6f\xb6"
+ "\x70\xf6\xd5\xb8\xbe\x25\xd6\x9c\xfd\x2e\xc4\xda\x09\x8e\xb7\xe3"
+ "\x36\xdd\x1c\x2f\x8f\xb7\x33\xd7\xac\x92\xc7\xdb\x31\xfe\xc4\x78"
+ "\xfb\xcd\x93\xd6\xf8\x13\xf2\xf6\x9b\xd7\xc5\x79\x7b\x6d\x27\x21"
+ "\x6f\xc7\xf5\x8b\xf1\xf6\xda\xc1\x82\xfa\x6d\x78\x7b\xed\x18\x21"
+ "\x6f\x27\xe5\x38\xde\x5e\x5b\xcf\xe6\x41\x0e\xc9\xe7\xed\xb5\xa7"
+ "\xec\xf3\xf6\xda\x73\x42\xde\x5e\xbb\x97\xf0\xf3\x5b\x1e\xf5\x0c"
+ "\x6f\xaf\x2d\x61\xf9\x7f\x11\xff\x38\xc7\xdb\xc9\xf1\x7a\x3e\x6f"
+ "\x2f\xc2\xbc\xfd\x96\x5f\x33\xbc\x5d\xe7\x30\x6f\xa7\x10\xc7\xdb"
+ "\xe1\x6f\xfb\xbc\xfd\xd6\x49\xfb\xbc\xdd\xc4\xe3\xed\x4d\x2c\x6f"
+ "\x6f\x62\x79\x7b\xd3\x5a\x4b\xde\x1b\xf3\x76\xd3\x23\xf1\x5a\x36"
+ "\xef\x5d\xb2\x6b\x5e\x05\xb5\xdb\x92\xf7\x9e\x0d\x7c\xdc\x80\xdc"
+ "\x57\xcd\x46\x08\x73\x76\x3c\x37\xa4\xb4\x3e\x98\x9d\x1f\xd2\xd8"
+ "\x90\x87\x39\xfb\x45\x28\x53\x05\x9c\x1d\x78\xf7\x67\x8d\xc1\x14"
+ "\xb4\xa7\x52\x50\x76\xde\x9d\xb2\xa7\x2d\x65\x31\x57\x87\xf2\xa5"
+ "\x65\xc0\xdb\xf1\x35\xd0\xff\x4b\x4b\xf1\xbc\x93\x94\xa3\x4c\x59"
+ "\xa8\xa3\x82\xe3\xf8\xb7\xd7\x32\x1c\xdf\xc0\x72\x7c\xb8\x06\xb8"
+ "\x4b\xc9\x1d\x8e\xdf\x58\x41\x65\xdc\x10\x70\xfc\xc3\x75\x2b\x6e"
+ "\xef\xb7\xf0\xf6\x75\x2c\xb7\xcf\x30\x33\xdc\xfe\x04\x70\xfb\x4a"
+ "\xc2\xed\x6f\x9f\xb6\x94\x01\xcc\x9c\x66\xca\x5c\x64\xca\x94\x42"
+ "\x99\x0a\x52\xa6\x8e\xcf\xff\x0f\x13\xfe\xdf\x68\xc5\xff\xeb\x18"
+ "\xfe\x6f\xc9\xcb\x63\x0e\xc3\xcf\xcd\x9b\x7d\xc4\x72\xf3\x0d\x77"
+ "\xf8\xff\x3a\x3e\xff\xbf\x93\x9b\xaf\x93\xc5\xff\xe1\x9e\x25\x16"
+ "\x2e\xd9\x26\x3c\xf2\x86\x38\x8f\x6c\x6f\xfc\xdf\xbc\xa2\x7c\x84"
+ "\x35\xff\xc7\x9a\xc0\x92\x9b\x37\x0b\x72\xf3\xf5\x0a\xf9\x7f\xbd"
+ "\x80\xff\x63\x3f\x2a\xc8\xcd\x97\xb4\x89\x6e\x6b\x47\xb9\xf9\xd6"
+ "\xe7\xff\xf5\x95\xfc\xfc\x3c\xe6\xff\x5c\x7e\xbe\x51\x84\xff\x37"
+ "\xf2\xf9\xff\x61\xbd\x4b\x9d\x90\xff\x53\x2e\x22\xfc\xbf\x49\x21"
+ "\xff\x6f\x52\xc8\xff\x9b\x1c\xe4\xff\x4d\x12\xfc\xff\xd6\x09\x69"
+ "\xfe\x7f\xeb\x04\xae\xdb\x9c\xc1\xf1\x34\xfc\x1e\x54\x3b\x0f\xf3"
+ "\x34\x13\xe1\xff\x84\xb7\x01\x4f\x33\xdd\x25\xfc\xdf\x28\xc1\xc9"
+ "\x8c\x3c\xfe\xdf\xd4\x0a\xfc\xbf\x49\x82\xff\x9b\x58\xfe\xdf\x24"
+ "\xc2\xff\x9b\x24\xf8\xbf\x89\xe5\xff\x4d\x56\xfc\xbf\x89\xe5\xff"
+ "\x26\x3b\xfc\xdf\xcc\xf2\x7f\x33\xcb\xff\x89\x8f\x6d\xf9\xbf\xc9"
+ "\x01\xfe\xdf\xc4\xf2\xff\x26\x3b\xfc\xdf\x2c\xc2\xff\x6f\x9d\xc0"
+ "\xfc\x5f\x14\x57\x14\xf2\x11\xe2\x8a\xb6\xe2\xff\xe6\xbb\x88\xff"
+ "\x4b\x62\xcd\x8a\xff\xd3\x0a\xf8\x3f\x2d\x93\xff\x37\x49\xf0\x7f"
+ "\xfa\xa4\x35\xfe\x84\xfc\x9f\x16\xe7\xff\x14\xb2\xe2\xff\x4d\xe2"
+ "\xfc\x9f\x42\x83\x05\xf5\x5b\xf3\x7f\x0a\x59\xf1\xff\x26\x21\xff"
+ "\xa7\x10\xcb\xff\x6f\x2d\x90\xcd\xff\x29\x64\x9f\xff\x53\x48\xc8"
+ "\xff\x29\x44\xf8\x3f\xe5\x42\xf8\x3f\x85\x58\xfe\x7f\x2b\x99\x7f"
+ "\x9c\xe3\xff\xe4\xb8\x0d\xff\x5f\xed\xd2\x1c\xff\xf7\x30\x6e\xe9"
+ "\xaf\x6f\xf4\xeb\x6f\x68\xcc\x9a\xa6\x7e\xb2\xea\x61\xd3\x9d\xef"
+ "\x12\x44\x01\x1f\x38\x0d\xfc\x60\x2a\xa2\xf0\xda\xfe\x94\xe3\x30"
+ "\xee\x4f\x25\xf3\xfb\xf1\xd8\x8f\xe7\x9f\xec\x5c\x58\xe4\x06\x36"
+ "\x45\x4d\xde\xcf\x17\x19\x03\x86\x22\xcc\x01\x1a\xb6\xf4\x2f\xaa"
+ "\xcf\x1a\xab\x69\xc0\x73\xfb\xe3\x10\x35\xa5\x46\x9c\xd7\xbd\x7f"
+ "\x9a\x36\x03\xe6\xdd\xc3\x27\x11\x4e\x77\x2c\xe6\x02\x83\x63\xcc"
+ "\x0b\x3e\xbe\x0d\x5c\xa0\xb6\x92\xe1\x09\x1e\x51\x5a\x94\x97\x82"
+ "\xbc\x3d\x6b\x90\xda\xd3\xc5\xa5\xc3\xab\x6f\x20\x64\x02\x8e\x30"
+ "\xbc\x2f\x6d\x7e\xa2\x4a\x8b\xf7\xf2\xe9\x42\x78\xc2\x7e\x37\x23"
+ "\xcb\x13\x3e\xbc\x8d\x02\x36\xce\x03\x7e\x70\x8c\xf0\x03\xfc\x0d"
+ "\x83\x06\xc2\x0f\x1e\x6a\xac\xf3\x7f\xe4\xce\xdc\xfe\x3b\x6b\x36"
+ "\xb8\xb9\xfd\x4d\x99\x1c\x37\xc0\xbc\x80\x9e\xe2\x8f\x06\xd4\x93"
+ "\xb9\x16\x0b\xc7\x90\xb9\xfd\x01\x55\x88\xda\xf4\x16\x72\x2f\x8d"
+ "\x3a\x8f\xd7\xdc\x6b\x4a\xab\xb6\xa2\x05\x2f\xa3\x87\x8c\x98\x0b"
+ "\x2c\xa5\x0b\x4b\xab\xb2\x11\xde\xa7\x10\xb8\x62\x70\x2e\xcb\x07"
+ "\x46\x4e\x95\xe0\x03\x30\x06\x63\x4e\xc0\x8c\xbd\x14\x75\xb2\xd8"
+ "\xbf\x18\xc9\xe6\x79\x14\xc5\xc4\x4e\xc9\x75\xbe\x5b\xfa\x1b\x8c"
+ "\x7e\xfd\x8b\x4c\xde\xd3\xd4\x64\xdf\xca\x09\x3a\xf3\xa7\x09\x81"
+ "\x78\x3f\xc2\xbf\x9f\xaf\x76\xc1\x7b\x70\xe3\xef\x51\x9a\x77\x0c"
+ "\x45\x82\xf5\x18\x4d\xac\xcf\x9a\x88\xcf\x30\xbf\x9b\x5c\x83\xe8"
+ "\x29\x46\x0a\xc1\xb9\x2e\xcc\x7a\x8c\x7a\x3d\xe2\xbe\x4b\xa9\x41"
+ "\xf9\x66\xb2\xf7\xa3\xf9\xfd\x98\x4e\x66\xf0\x0b\xbd\x94\x42\x3b"
+ "\x6f\xd7\x33\x1c\x6e\x0d\xfe\x56\xe5\x12\x17\x4f\xcc\xe1\x00\xfb"
+ "\x9d\x37\x35\x82\x8f\xce\x11\x1f\xd1\x4b\xdd\x99\x7f\x8d\xef\xfb"
+ "\x6b\xa1\xee\x47\x9a\x9a\x80\xc3\xb1\xdf\xb5\xb4\xec\x83\xcb\xac"
+ "\xad\x69\xc4\x6b\x6b\x2a\x91\x31\x93\xec\x2d\x08\xb8\x70\xc1\x7b"
+ "\x72\xc0\x33\xf8\x32\x6b\x6a\x9a\xfc\x31\x8e\xd4\xf9\x17\xf1\x3a"
+ "\xa0\x9f\x19\xff\x98\x58\xbf\xe0\xef\x5b\x5a\xb8\x59\xd9\xb6\x93"
+ "\x64\x5d\xa5\x95\x2f\x9a\xb6\x12\x0e\xce\xac\x73\x59\xed\x12\x8c"
+ "\xe7\xc8\x5c\xa5\x5c\xe3\x8b\x93\x80\x13\x25\xc9\xf5\x8b\x6b\x5c"
+ "\xfb\xf0\x8b\xfa\x1e\xf3\x8b\xca\x97\xf8\xa5\x83\x9b\x32\xbf\x74"
+ "\x70\x6d\x1f\x7e\x71\xbf\xc7\xfc\xe2\xba\x97\xf8\xa5\xe3\x46\x65"
+ "\x7e\xe9\x28\xb9\xff\x03\xf6\x0b\xce\x55\x59\xf2\x54\x96\x1c\x15"
+ "\x1e\x4f\x19\xbd\x43\x79\x25\xde\x99\x93\x09\x7f\xf3\xe7\x64\xfe"
+ "\x70\x18\xe7\x6f\x56\xa3\xa3\xc3\xf0\xd8\xea\x3e\xcb\x6e\x6e\x8a"
+ "\xf2\xd8\x7f\x27\x37\x45\x3d\xd0\x83\xe1\xa8\x54\x67\x13\xc3\x51"
+ "\xa9\xce\xcc\xbc\xed\xc5\x67\x10\x65\x7c\x6c\xa0\x7a\x57\x42\x11"
+ "\x85\xd7\x2f\xed\xba\x5a\x4f\xad\xb9\x01\x9c\x93\x7a\x98\xc6\x39"
+ "\xa9\xb5\xb3\xf1\x5c\xcc\x5a\x04\x7c\xef\xe1\xcb\x54\xe7\xc1\x78"
+ "\x6f\xb4\x6f\xaf\x16\x31\xb9\x20\xfa\x91\x84\xc0\x1d\x3d\x0d\x2e"
+ "\x78\x1c\xdd\x95\x50\x4f\x59\xb0\x64\x59\xd7\x08\xf6\x34\xdc\xdc"
+ "\xda\x5f\x8f\xe7\x4d\x36\xfa\x8c\xd5\x98\x7c\xa6\xa9\x8d\x3b\x87"
+ "\x22\x31\x7c\x31\xeb\x25\x61\x0c\xc5\xeb\x1b\xdf\x4a\xe4\x70\x66"
+ "\x7e\x9f\xe0\xab\x0c\x38\x3b\xfe\xfe\x8f\x17\x8c\x9d\x74\x53\x4c"
+ "\xa7\x37\xb7\x83\xef\x59\x8c\xc1\xf8\x2d\x8d\xb1\x0d\x42\x8c\xdd"
+ "\x64\x31\x06\x58\xbb\x83\x31\xde\x7a\xc7\x44\x82\x31\xfd\x1d\x8c"
+ "\x31\x63\xe7\xfb\xfe\xbe\x18\x67\x16\x8c\xe1\x71\x93\x60\xec\xbc"
+ "\x24\xc6\x7e\x38\x2d\x8e\x31\x63\x1f\x3e\xc6\x3a\x8c\x24\x18\xeb"
+ "\xec\x52\x3c\x09\x30\x36\x49\x2e\xc6\x98\xa5\x71\x3c\xed\xac\xee"
+ "\x65\xa3\x9d\xa9\xce\xd3\xad\xb5\xb3\x45\x2b\xdf\xf4\x99\x80\x6e"
+ "\x82\x5e\xae\xb5\xe8\x65\xaa\xf3\x2a\x45\x7a\x99\xea\xbc\xd2\xa1"
+ "\xb9\x6c\x54\xe7\x4b\x47\x17\x21\x74\x14\xfa\x53\x79\x04\x99\xcb"
+ "\xf6\x77\xac\x97\x29\xf7\x24\x8c\x43\x51\xbd\xcc\x9e\xb3\x99\x83"
+ "\x44\x79\xac\xba\x33\x07\x89\xf2\x18\xdf\xb0\x5e\x7c\x2e\xdb\x17"
+ "\x29\xb9\x3c\xed\x92\x2b\x32\xdf\x28\xd7\x6a\xbe\x51\xae\x88\x6e"
+ "\xc9\x45\xf8\x5a\xbe\x6e\x39\x1a\x41\x74\xcb\xd1\x08\xac\x5b\x72"
+ "\x19\xbe\x77\x34\xc2\xa2\x5b\x72\xe1\x3c\xd1\x2d\x47\x23\x2e\xc2"
+ "\x0f\x74\x0b\xf5\x40\xfd\xd1\x08\x11\xdd\x42\x79\x30\x5a\x13\x6c"
+ "\x58\x2d\x3d\x97\x2d\x97\xa7\x8f\x73\x79\xfa\x38\x97\xd5\xc7\xb9"
+ "\x8c\x3e\x26\xf7\x0c\x60\x9e\x0d\xdf\x13\xd7\xc9\xbf\x27\xa7\x1f"
+ "\x3c\xe6\x32\xfa\x81\xea\x5c\x83\xfd\x20\xd0\xc7\xf8\x9a\x64\x11"
+ "\x7d\x4c\x79\x6c\x67\xaf\xa9\xb6\xe8\xe3\x46\x52\x9e\xa9\x03\x62"
+ "\x4d\xb1\xa4\x3e\xa6\x3c\xa7\x92\xd8\xe3\x49\xe6\x83\xb3\x3e\xb5"
+ "\xd1\xc7\x94\x27\x5f\xff\x88\xcf\x65\x63\x31\xc4\x3c\x67\xa2\x84"
+ "\x3e\xa6\x3c\xc7\xd8\xe8\x63\xca\x3d\x51\x74\x2e\x1b\xe5\xd5\x97"
+ "\xc3\x51\x97\x23\x82\xb9\x6c\x94\xe7\x06\xbe\x2e\xc6\x18\xbb\xbb"
+ "\xb0\xf5\x40\xbd\x60\x2e\x1b\xd5\x25\x56\x5c\x13\xe7\xf2\x34\x71"
+ "\x2e\xa3\x89\x8f\x46\xb0\x73\xd9\xa8\x2e\x1b\x71\xdd\xb6\x9a\x38"
+ "\xf7\x4e\x79\x8b\x26\xc6\xd7\x10\xcc\x89\x68\x62\xaa\xcb\x25\x6b"
+ "\xcc\x09\x34\x31\xe5\xe5\x66\xd1\xc4\x8d\x6f\xf2\x35\xb1\x57\x2f"
+ "\x81\x26\x66\xea\x17\xd3\xc4\x5e\x2f\x0b\xea\xb7\xd1\xc4\x5e\xd3"
+ "\x2d\x9a\x18\xd7\x6f\xc1\x2d\xa7\x89\xd5\xee\x24\x86\xba\xf7\x90"
+ "\xaf\x89\xbd\x98\xbc\xce\xce\x8f\xc9\x3b\x27\xa1\x1e\xf6\xba\x2e"
+ "\xd4\xc3\x5e\x87\x89\xee\x55\xfb\x32\xf3\xd8\x28\xaf\x4a\x72\xdc"
+ "\x5d\xc3\x3f\x7e\x47\x0f\xb3\xc7\xf1\x3c\x36\x66\xfe\xda\x6a\x75"
+ "\x80\x3c\x1d\xfc\x60\x3b\xd4\xc1\x1a\x3b\x3a\x58\x73\x8f\xe9\xe0"
+ "\xae\x67\x94\xe9\xe0\xae\xa7\xdb\x07\xaf\xbf\xd7\xf4\x96\x5a\x47"
+ "\x38\xd7\x9f\xe6\x2a\xe3\xf5\x7f\x4a\x6a\x1f\x7e\xb9\xd7\xf4\x56"
+ "\x37\x3f\xe2\x17\x1f\x4f\x65\x7e\xf1\xf1\x50\xae\xb7\x7c\xf5\x9c"
+ "\xde\xf2\xd5\x4b\xeb\x2d\x9f\x73\xf6\xf5\x56\x4f\x7f\x4e\x6f\x69"
+ "\x56\x11\xce\xa3\x89\x27\x9c\x47\xd3\x4f\xbe\xde\x7a\x70\xeb\x7d"
+ "\xbd\xd5\x92\x7a\xeb\x4f\x07\x09\xc6\x1e\x9c\xa5\x4c\x6f\x3d\x98"
+ "\x28\xd4\x5b\xbd\xd6\xda\xea\xad\x07\x4f\x3a\xae\xb7\x1e\x6c\x50"
+ "\xa6\xb7\x1e\xac\x77\x4c\x6f\x69\xde\x10\xd7\x5b\x3e\x55\xd2\x7a"
+ "\x8b\x9c\xb3\xe5\xc9\x3d\x1a\x38\x9e\xdc\xa3\xb8\xfd\xeb\xad\x1e"
+ "\x31\xe2\x9c\xb8\xc7\x2c\xa2\xb7\x34\x91\x2d\xaf\xb7\x34\x91\xe2"
+ "\x7a\xab\xc7\x05\xc2\x4d\x35\x93\x6c\xf5\x16\x5c\x23\xaa\xb7\x7a"
+ "\xf6\x60\xaf\x89\x14\xea\x2d\x52\x07\xc4\x9a\xc1\xd2\x7a\xab\xe7"
+ "\x71\x12\x7b\x7a\x6e\x26\xb1\x87\xf8\xd4\x56\x6f\xf5\x5c\xd0\xbc"
+ "\xde\x22\x18\x62\x9e\x53\x52\x6f\xf5\x3c\x64\xab\xb7\x7c\xf4\xe2"
+ "\x7a\xcb\x77\x03\x87\x23\xdf\x21\x42\xbd\xf5\xe7\x4e\x77\x87\xde"
+ "\x92\xc4\x56\x8c\x50\x6f\xfd\xf9\x94\x7c\xbd\xe5\xeb\x29\x4f\x6f"
+ "\x61\xcc\x89\xe9\x2d\xdf\x37\xac\x31\x27\xd4\x5b\xbe\x73\xc5\xf5"
+ "\x96\xef\x5a\xa1\xde\xc2\xf5\x8b\xe9\x2d\xdf\x03\x82\xfa\x6d\xf4"
+ "\x96\xef\x49\xa1\xde\x22\xe5\x38\xbd\xd5\x2b\x99\xc4\x50\x9f\x55"
+ "\xf2\xf5\x56\xaf\x37\xa4\xf5\x56\xaf\xa9\x42\xbd\xd5\x2b\x88\xe8"
+ "\xaa\x5e\x6b\x88\xde\xea\x35\x82\x1c\xf7\x59\xc9\x3f\xce\xe9\x2d"
+ "\x72\x9c\xd3\x5b\xbd\xf2\xe4\xe9\x2d\xaf\x76\xa8\xb7\xd4\x76\xf4"
+ "\x96\xfa\x1e\xd3\x5b\x0f\x8f\x52\xa6\xb7\x1e\x1e\x79\x9f\xd7\xb7"
+ "\x06\xaf\xef\x55\x48\x38\x97\xf6\x82\x32\x5e\xaf\xad\x52\xce\xeb"
+ "\xfd\xf7\x73\xbc\xde\x7f\xbf\x34\xaf\xef\x6d\x7f\xff\x37\xea\x31"
+ "\xc4\xf1\x7a\x3f\x36\x97\xe9\x37\x9c\x8c\xad\x7e\x6e\xf2\x79\xfd"
+ "\xa3\x8b\xef\xf3\xfa\x96\xe4\xf5\x0f\x67\x11\x8c\x3d\xfa\xb2\x32"
+ "\x5e\xff\xe8\x08\x21\xaf\xef\x3b\xdd\x96\xd7\x3f\xba\xd3\x71\x5e"
+ "\xff\xe8\x71\x65\xbc\xfe\xd1\x0a\xc7\x78\xbd\xdf\x40\x71\x5e\xdf"
+ "\xfb\xa0\x34\xaf\x27\xe7\x6c\xf9\x58\x9f\xe3\x1c\x1f\xeb\xb3\xb1"
+ "\xfd\xf3\xfa\x3e\x3a\x71\xee\xd5\xe7\x65\xc2\xeb\xfd\x02\x5b\x9e"
+ "\xd7\xfb\x05\x8a\xf3\xfa\x3e\xdf\x10\x0e\xe4\x17\x64\xcb\xeb\xe1"
+ "\x1a\x51\x5e\xdf\xe7\x3a\x7b\x4d\xa0\x90\xd7\x93\x3a\x20\xd6\x78"
+ "\x4a\xf3\xfa\xc7\xb6\x93\xd8\xf3\xd8\x02\x12\x7b\x88\x4f\x6d\x79"
+ "\xfd\x63\x63\x9a\xe7\xf5\x04\x43\xcc\x73\x4a\xf2\xfa\xc7\x36\xd8"
+ "\xf2\xfa\xde\xe2\xfb\x69\x51\xfe\xb3\x38\x1c\xf9\x77\x15\xf2\xfa"
+ "\xc7\xce\xdd\x1d\xbc\x5e\x12\x5b\x3a\x21\xaf\x7f\x7c\x8f\x7c\x5e"
+ "\xff\xf8\x05\x79\xbc\x1e\x63\x4e\x8c\xd7\xfb\x0f\xb4\xc6\x9c\x90"
+ "\xd7\xfb\x8f\x12\xe7\xf5\xfe\xd3\x85\xbc\x1e\xd7\x2f\xc6\xeb\xfd"
+ "\x33\x05\xf5\xdb\xf0\x7a\xff\x9d\x42\x5e\x4f\xca\x71\xbc\xbe\x6f"
+ "\x04\x89\xa1\xbd\xe5\xef\xa7\x45\xf5\x1d\x28\xcd\xeb\xfb\x0e\x11"
+ "\xf2\xfa\xbe\x1e\x84\xbf\xf7\x8d\x26\xbc\xbe\xaf\x96\x1c\xef\x1d"
+ "\xc5\x3f\xce\xf1\x7a\x72\x9c\xe3\xf5\x7d\x93\xe4\xf1\xfa\x8e\xed"
+ "\x90\xd7\xbb\xdb\xe1\xf5\xee\xf7\x18\xaf\x7f\xb2\x8f\x32\x5e\xff"
+ "\xa4\x9f\x72\xfe\x38\xa8\x9e\xe3\x8f\x83\xea\xa5\xf9\xe3\x93\x0d"
+ "\xf6\xf9\x63\xa0\x8e\xe3\x8f\xfd\x37\x93\x18\xde\x7f\x39\x89\xe1"
+ "\xfd\x87\xcb\xe7\x8f\xfd\xbe\xb9\xcf\x1f\x5b\x92\x3f\xf6\x5d\x49"
+ "\xf8\x63\xbf\x55\xca\xf8\x63\xbf\x95\x42\xfe\xf8\xd4\x56\x5b\xfe"
+ "\xd8\xef\x8a\xe3\xfc\xb1\x7f\x57\x65\xfc\xb1\xbf\xda\x31\xfe\xd8"
+ "\x7f\x96\x38\x7f\x7c\xd2\x28\xcd\x1f\xc9\x39\xdb\x71\x3f\xb0\x2b"
+ "\x37\xee\x0f\x38\xd3\xfe\xf9\xe3\x80\x34\xf1\x31\x7e\xc0\x2a\xc2"
+ "\x1f\xfb\x27\xb6\x3c\x7f\xec\x9f\x28\xce\x1f\x07\x98\xc8\x58\xdb"
+ "\x3f\xc9\x96\x3f\xc2\x35\xa2\xfc\x31\x90\x1d\xff\xfb\x27\x0a\xf9"
+ "\x23\xa9\x03\x62\xcd\x28\x69\xfe\x18\x48\xd6\xa7\x52\x81\x07\x48"
+ "\xec\x21\x3e\xb5\xe5\x8f\x81\x99\xcd\xf3\x47\x82\x21\xe6\x39\x25"
+ "\xf9\x63\xe0\x29\x5b\xfe\xf8\x64\xbd\x38\x7f\x1c\xb4\x87\xc3\xd1"
+ "\xa0\x31\x42\xfe\x38\xb0\xf7\xdd\xc1\x1f\x25\xb1\x95\x26\xe4\x8f"
+ "\x03\xaf\xcb\xe7\x8f\x83\xfa\xc8\xe3\x8f\x18\x73\x62\xfc\x71\xd0"
+ "\x2c\x6b\xcc\x09\xf9\xe3\xa0\xb5\xe2\xfc\x71\xd0\x56\x21\x7f\xc4"
+ "\xf5\x8b\xf1\xc7\x41\xc7\x05\xf5\xdb\xf0\xc7\x41\x57\x84\xfc\x91"
+ "\x94\xe3\xf8\xe3\x53\x19\x24\x86\x3e\xb9\x59\x3e\x7f\x7c\x6a\x96"
+ "\x34\x7f\x7c\x6a\x81\x90\x3f\x3e\x35\x92\xf0\xc4\xa7\xb6\x10\xfe"
+ "\xf8\x54\x14\x39\xfe\x64\x01\xff\x38\xc7\x1f\xc9\x71\x8e\x3f\x3e"
+ "\xb5\xb7\x39\xfe\x68\x9f\x5b\x3c\xcb\x7d\x9b\x00\xfe\xe6\x73\x8b"
+ "\x23\x02\x6e\x11\x34\xde\x3e\xb7\x08\xe6\xbe\x4d\x40\xfd\x85\x7c"
+ "\x9b\x80\x7a\x9a\x7c\x9b\x80\x7a\x9a\xf9\x36\xc1\xe2\x51\xc0\x01"
+ "\x80\x5b\xec\xbc\x5c\x48\xb8\xc5\xe5\x7a\xea\xc3\xab\x2c\xb7\xa8"
+ "\x41\xee\x6b\x12\x58\x6e\xf1\x16\xe6\x16\x4f\xf7\xc3\xdc\xc2\x23"
+ "\x0f\xf8\x6d\x15\xcb\x77\x13\x81\xef\x56\xc1\xff\xa1\xef\x7c\x0b"
+ "\x75\x94\x01\x27\xcd\xc0\xd7\xe3\xef\x63\x40\x5d\xcc\x3a\x59\x66"
+ "\x0d\xad\xde\x4d\x3b\x8d\xac\xbf\xc5\xdf\x37\x91\xfa\xb6\x89\xe5"
+ "\xbb\x26\x8b\xaa\x68\x33\xfe\x8e\x49\x78\x34\xef\xfb\x26\xf8\xbb"
+ "\xa5\x86\x6a\x84\xbf\x71\x92\x37\x1b\x79\x7f\x82\xb9\x46\x35\x52"
+ "\x77\x59\xe2\xd2\x05\x7f\xdf\xa4\x4b\x2d\xe1\xb4\x3b\xcd\x25\x84"
+ "\xd3\xce\xd1\x74\x06\x9e\x14\x90\x7f\x83\xe3\x18\x1f\x61\x7e\x31"
+ "\xc7\x5f\x5b\x3b\xc7\xff\xa1\x9b\x37\x81\xd3\x1a\xac\xbf\x7f\x71"
+ "\x60\x3f\xfe\xce\x02\xfe\xce\xa4\x91\xe5\xb4\xf4\x3b\xfe\x68\xd3"
+ "\x0c\xe0\x3d\x35\xc8\xa5\x3f\xfe\xf6\xc5\x31\xa4\x7e\xdc\x17\xe2"
+ "\xfe\x4d\x7f\x5f\xfe\x5e\x96\x38\x2f\x6a\xbe\xe9\x8f\x4a\xa3\x7e"
+ "\x66\xd6\xcc\x1a\x2d\x6b\x66\x6f\xa0\x60\xc3\x1c\x7f\xea\xe3\xd9"
+ "\x3c\x4e\xeb\x83\x39\xed\x33\x76\x38\xed\xe0\x06\x65\x9c\x76\x70"
+ "\xbd\x90\x6f\x84\xf8\xd8\xf2\x8d\xa7\x27\x3b\xce\x37\x9e\x56\xb6"
+ "\xff\x3b\xf5\x74\x9a\x63\x7c\xe3\xe9\x73\xd6\x7c\x63\x3b\xc3\x37"
+ "\x82\x22\x31\x36\xc5\xf9\x06\x39\x67\x3b\x4e\x04\x73\xfb\xbf\x53"
+ "\xc1\xa3\xda\x3f\xdf\xf8\x8b\x41\x7c\x4c\xf8\x0b\xd9\xff\x9d\x7a"
+ "\xda\xce\xfe\xef\x4a\xf9\xc6\xd3\x7a\x71\xbe\x11\x4c\xf6\x7f\xa7"
+ "\x9e\xae\xb2\xe5\x1b\x70\x8d\x28\xdf\x08\xde\xcc\x5e\xa3\x17\xf2"
+ "\x0d\x52\x07\xc4\x1f\xe9\xfd\xdf\xa9\x21\x64\xff\x77\x6a\x08\xd9"
+ "\xff\x9d\xf5\xa9\x2d\xdf\x18\xd2\xfc\xfe\xef\x2c\x86\x98\xe7\x94"
+ "\xe4\x1b\x43\x6c\xf7\x7f\xa7\x82\xc6\x89\xf3\x8d\x67\xb9\xfd\xdf"
+ "\xa9\x67\x84\xfb\xbf\x53\x43\x32\xef\x0e\xbe\x21\x89\x2d\xe1\xfe"
+ "\xef\xd4\x33\x12\xfb\xbf\xdb\xe3\x1b\xcf\x64\xcb\xe3\x1b\x18\x73"
+ "\x62\x7c\xe3\x99\x73\xd6\x98\x13\xf2\x8d\x67\x4c\xe2\x7c\xe3\x59"
+ "\xe1\xfe\xef\x4c\xfd\x62\x7c\xe3\xd9\x30\x41\xfd\x36\x7c\xe3\xd9"
+ "\xc9\x42\xbe\x41\xca\x71\x7c\x23\x04\xb1\x9a\xcd\x24\x9f\x6f\x3c"
+ "\x7b\x4e\x9a\x6f\x3c\x7b\x49\xc8\x37\x9e\x3d\x48\x78\x45\x88\x37"
+ "\xe1\x1b\xcf\x56\xb0\x3c\xc4\xc8\x3f\xce\xf1\x0d\x72\x9c\xe3\x1b"
+ "\x21\xf7\xd7\xbf\xde\x55\xf9\xaa\xe7\x14\xae\x7f\x7d\xee\xfe\xfa"
+ "\xd7\x56\x79\x0f\x1d\xc2\xae\x7f\x0d\x55\xb8\xfe\x35\xf4\xfe\xfa"
+ "\xd7\x56\xf1\xcb\xf3\xec\xfa\xd7\x30\x85\xeb\x5f\xc3\xee\xaf\x7f"
+ "\x6d\x15\xbf\x84\xb2\xeb\x5f\x87\x2a\x5c\xff\x3a\xd4\x89\xf5\xaf"
+ "\xaf\xac\xe1\xb4\xf1\x2b\x6b\xa4\xb5\xf1\x0b\xcd\xac\x7f\x7d\xe9"
+ "\x04\xa7\x8d\x5f\x1c\x4c\xb8\xe8\x8b\x3d\x08\x17\x1d\xce\xe4\xa6"
+ "\x52\xb0\x36\xfe\x34\x5e\xbb\x7b\xf6\x7e\x0a\xef\xd1\x86\xbf\x19"
+ "\xb9\x76\x21\x72\x35\x62\x6d\x0c\x3e\x58\xcb\x7c\x8b\xe4\x30\x4a"
+ "\x7c\x17\x6b\xe3\xe1\x63\xca\xaa\x78\xdf\x21\xa1\x5e\x38\xc4\xed"
+ "\x8b\x7c\x18\xe1\x73\xdf\xde\xd8\x4f\x65\x34\x5a\xe5\xe4\x67\xd7"
+ "\x53\xda\x04\x61\x4e\xde\x94\x3d\x4d\x8d\x73\xf2\x0d\xec\x77\x45"
+ "\x98\xbc\x7c\x3f\xfb\x39\xf9\x8d\x8d\x30\x76\x8a\xe4\xe5\x71\x4e"
+ "\x1e\xc6\xc8\x7b\x2c\x27\x1f\xc6\xae\x8d\x1d\xde\x4b\x59\x4e\x7e"
+ "\xb8\xaf\x50\x23\xbf\x3a\xc4\x56\x23\x0f\x5f\xe2\xb8\x46\x1e\xbe"
+ "\x55\x99\x46\x1e\xbe\xc5\x31\x8d\xfc\xa2\x9b\xb8\x46\x7e\x21\x29"
+ "\x45\x52\x23\x93\x73\xb6\xda\xe6\xa5\xad\x9c\xb6\x79\x69\x56\xfb"
+ "\xd7\xc8\x2f\x79\x8b\xeb\x98\x97\x7a\x11\x8d\xfc\xa2\x6b\xcb\x6b"
+ "\xe4\x17\x5d\xc5\x35\xf2\x4b\xec\xfb\xef\x17\xdd\x6d\x35\x32\x5c"
+ "\x23\xaa\x91\x5f\x2a\x66\xaf\x71\x15\x6a\x64\x52\x07\xc4\xa1\x73"
+ "\xd2\x1a\x79\xc4\x62\x12\x97\x46\x8c\x22\x71\x89\xf8\xd4\x56\x23"
+ "\x8f\xe8\xd3\xbc\x46\x26\x18\x62\x9e\x53\x52\x23\x8f\x88\xb7\xd5"
+ "\xc8\x2f\x48\xac\x8d\x7d\x65\x38\x87\xa3\x97\x2f\x08\x35\xf2\x88"
+ "\x7d\x77\x87\x46\x96\xc4\x96\xb7\x50\x23\xbf\xbc\x5c\xbe\x46\x7e"
+ "\xf9\x80\x3c\x8d\x8c\x31\x27\xa6\x91\x5f\x71\xb3\xc6\x9c\x50\x23"
+ "\xbf\xd2\x5b\x5c\x23\xbf\x32\x44\xa8\x91\x71\xfd\x62\x1a\xf9\x95"
+ "\xe9\x82\xfa\x6d\x34\xf2\x2b\x4b\x84\x1a\x99\x94\xe3\x34\xf2\xab"
+ "\x7e\xec\x78\xa7\x60\x6d\xec\xab\x6e\xd2\x1a\xf9\x55\x4f\xa1\x46"
+ "\x7e\x45\x4f\xb4\xf0\xab\xc1\x44\x23\xbf\x52\x4b\x8e\xbf\xa0\xe1"
+ "\x1f\xe7\x34\xf2\x0b\x56\x6b\x63\x5f\x1d\x71\x7f\x6d\xec\xdd\xa4"
+ "\x91\x47\x2a\xcc\x7f\x8f\xac\x6f\x1f\x9c\xff\x5e\xd3\x62\xaf\x4e"
+ "\x22\x9c\x6b\x74\xa6\x32\xce\x3f\x3a\xa3\x7d\xf8\xe5\x5e\xd3\x62"
+ "\xa3\xd8\x35\xcb\x11\x7d\x95\xf9\x25\xc2\x5f\xb9\x16\x8b\xd4\x70"
+ "\x5a\x2c\x52\x23\xad\xc5\x22\x4c\xf6\xb5\xd8\xf8\x28\x4e\x8b\xbd"
+ "\x76\x88\x70\x9e\xd7\xb6\x12\xce\xf3\xda\x74\xf9\x5a\x6c\xec\x19"
+ "\xa1\x16\x1b\x33\xea\xbe\x16\x6b\x2d\x2d\x36\xba\x92\xe0\x6f\xec"
+ "\x76\x65\x5a\x6c\xec\x36\xa1\x16\x8b\x2c\xb6\xd5\x62\xaf\x79\x3a"
+ "\xae\xc5\x5e\x1b\xa8\x4c\x8b\xbd\x16\xe8\x98\x16\x7b\x2d\x53\x5c"
+ "\x8b\x8d\x41\xd2\x5a\x8c\x9c\xb3\xe5\xd0\xe3\x07\x72\x1c\x7a\x9c"
+ "\xa9\xfd\x6b\xb1\x71\x05\xe2\x7c\x79\xdc\x76\xa2\xc5\x5e\xcb\x68"
+ "\x79\x2d\xf6\x5a\x86\xb8\x16\x1b\x4f\xbe\x7f\x46\xbd\x96\x65\xab"
+ "\xc5\xe0\x1a\x51\x2d\x36\x7e\x0c\x7b\x4d\x86\x50\x8b\x91\x3a\x20"
+ "\x0e\xc5\x4b\x6b\xb1\xd7\x3b\x91\xb8\x34\xfe\x14\x89\x4b\xc4\xa7"
+ "\xb6\x5a\x6c\xfc\x9e\xe6\xb5\x18\xc1\x10\xf3\x9c\x92\x5a\x6c\x7c"
+ "\x83\xad\x16\x8b\x30\x8a\x6b\xb1\x09\xbc\x75\x1a\x13\x66\x09\xb5"
+ "\xd8\xeb\x61\x77\x87\x16\x93\xc4\x56\x81\x50\x8b\x4d\xe8\x2a\x5f"
+ "\x8b\x4d\x18\x2e\x4f\x8b\x61\xcc\x89\x69\xb1\x09\x99\xd6\x98\x13"
+ "\x6a\xb1\x09\x3b\xc5\xb5\xd8\x84\x62\xa1\x16\xc3\xf5\x8b\x69\xb1"
+ "\x09\xd7\x05\xf5\xdb\x68\xb1\x48\x4f\xa1\x16\x23\xe5\x38\x2d\x16"
+ "\x59\x48\x62\x68\xc4\x56\xf9\x5a\x2c\x32\x53\x5a\x8b\x45\x6e\x10"
+ "\x6a\xb1\xc8\x38\xa2\xb9\x22\x0f\x13\x2d\x16\x99\x46\x8e\x47\x6c"
+ "\xe1\x1f\xe7\xb4\x18\x39\xce\x69\xb1\xc8\x13\xf7\xd7\xcd\xde\x4d"
+ "\x5a\x6c\xe2\x72\x65\x5a\x6c\xe2\xb2\xfb\x9c\xbf\x35\x38\x7f\x64"
+ "\x35\xe1\x5c\x93\x7a\x29\xe3\xfc\x93\x7c\x95\x73\xfe\x68\x0f\x8e"
+ "\xf3\x47\x7b\x48\x73\xfe\x49\xd7\xed\x73\xfe\xa9\xe3\x38\xce\x3f"
+ "\x65\x1f\x19\x5b\xa7\x6c\x20\x63\xeb\x94\x37\xe4\x73\xfe\xb7\x8e"
+ "\x0b\x39\xff\xe4\xb0\xfb\x9c\xbf\xb5\x38\xff\xc4\x52\x82\xbf\xb7"
+ "\x36\x2a\xe3\xfc\x6f\xe5\x09\x39\x7f\xf4\x01\x5b\xce\x3f\xc5\xc5"
+ "\x71\xce\x3f\xa5\x8f\x32\xce\x3f\xc5\xcf\x31\xce\x3f\x65\xb9\x38"
+ "\xe7\x9f\x54\x2b\xcd\xf9\xc9\x39\x5b\xae\x36\xb5\x0f\xc7\xd5\xa2"
+ "\xae\xb7\x7f\xce\x1f\x95\x25\xce\xcb\xa2\x36\x12\xce\x3f\x65\x59"
+ "\xcb\x73\xfe\x29\xcb\xc4\x39\xff\xd4\xae\x84\x1f\x4d\x59\x69\xcb"
+ "\xf9\xe1\x1a\x51\xce\x3f\x75\x38\x7b\xcd\x32\x21\xe7\x27\x75\x40"
+ "\x1c\x9a\x2a\xcd\xf9\xa7\x9a\x48\x5c\x9a\x4a\xbe\xd9\xc5\xfa\xd4"
+ "\x96\xf3\x4f\xdd\xda\x3c\xe7\x27\x18\x62\x9e\x53\x92\xf3\x4f\xbd"
+ "\x62\xcb\xf9\x27\x19\xc4\x39\xff\xdb\xc5\x1c\x8e\xde\x9e\x2e\xe4"
+ "\xfc\xd3\x06\xdf\x1d\x9c\x5f\x12\x5b\x59\x42\xce\xff\xb6\x9b\x7c"
+ "\xce\xff\xf6\x10\x79\x9c\x1f\x63\x4e\x8c\xf3\xbf\xbd\xdc\x1a\x73"
+ "\x42\xce\xff\xf6\x66\x71\xce\xff\xf6\x01\x21\xe7\xc7\xf5\x8b\x71"
+ "\xfe\xb7\x2f\x08\xea\xb7\xe1\xfc\xd1\x2e\x42\xce\x4f\xca\x71\x9c"
+ "\x3f\x7a\x0b\x89\xa1\x93\x36\xc8\xe7\xfc\xd1\xcb\xa5\x39\x7f\xf4"
+ "\x5a\x21\xe7\x8f\x66\xd7\xce\x46\xef\x27\x9c\x3f\x3a\x89\x1c\x9f"
+ "\x94\xcb\x3f\xce\x71\x7e\x72\x9c\xe3\xfc\xd1\x25\xf7\xd7\xd4\xde"
+ "\x4d\x9c\x7f\xc6\x02\x65\x9c\x7f\x46\xb2\x72\x6e\x99\xc0\x5b\xf7"
+ "\x92\x60\x67\xdd\xcb\x3b\xa3\xec\x73\xcb\xf7\x78\xeb\x5e\xde\x65"
+ "\xd7\xbd\xc4\xb2\xeb\x5e\x62\xf7\xc9\xe7\x96\xb1\xfd\x84\xdc\xf2"
+ "\x9d\x8d\xf7\xb9\x65\x6b\x71\xcb\xe8\xd3\x84\x5b\xc6\x34\x28\xe3"
+ "\x96\x31\x56\xeb\x5f\x66\x8a\xac\x7f\x89\x95\xb1\xfe\x25\x56\xe1"
+ "\xfa\x97\x58\x07\xd7\xbf\xc4\x4a\xac\x7f\x79\x27\x42\x9a\x5b\x92"
+ "\x73\xb6\x9c\xe0\x3d\xde\xfa\x97\xf7\xee\x82\xf5\x2f\xef\x4a\xac"
+ "\x51\x78\x97\x5d\xff\x12\xdb\x0a\xeb\x5f\x62\x25\xd6\xbf\xbc\xc7"
+ "\xae\x7f\x89\x15\x59\xff\x12\x2b\xb1\xfe\xe5\x3d\x76\xfd\x4b\xac"
+ "\xd5\xfa\x97\x58\x76\xfd\xcb\x7b\x76\xd6\xbf\xc4\xb1\xeb\x5f\xe2"
+ "\xd8\xf5\x2f\xc4\xa7\xb6\xdc\x32\xce\x81\xf5\x2f\xb1\xec\xfa\x97"
+ "\x58\x3b\xeb\x5f\xe2\x44\xd6\xbf\xbc\x33\x52\x9c\x5b\x26\xf0\xd6"
+ "\xbf\xc4\x5b\xad\x7f\x89\xbb\x4b\xd6\xbf\x48\x62\xcb\x6a\xfd\x4b"
+ "\xbc\x82\xf5\x2f\xf1\x32\xd7\xbf\xc4\x4a\xac\x7f\x89\x3f\x67\x8d"
+ "\x39\x21\xb7\x8c\x97\x58\xff\x92\x60\xb5\xfe\x25\x56\x62\xfd\x4b"
+ "\x42\x98\xa0\x7e\x1b\x6e\x99\x60\xb5\xfe\x25\xd6\x6a\xfd\xcb\x4c"
+ "\x76\xfd\xcb\x8c\x5b\xf2\xb9\x65\x82\x9d\xf5\x2f\x09\x56\xeb\x5f"
+ "\x12\xd8\xf5\x2f\x33\xd9\xf5\x2f\x09\xec\xfa\x97\x19\xb5\xfc\xe3"
+ "\x1c\xb7\x24\xc7\x39\x6e\x39\xb3\xd9\xf5\x2f\xf6\x79\xc7\xbc\x5a"
+ "\x8e\x77\xcc\xab\x95\xe6\x1d\x33\x8b\xed\xf3\x8e\xa4\x10\x8e\x77"
+ "\xcc\xde\x48\xfa\xf7\xec\x25\xa4\x7f\xcf\x66\xde\xc3\x2c\x3e\x06"
+ "\xbc\xe3\x91\x78\xed\xae\xab\x85\x0c\xef\xd8\x9d\x50\x4f\x01\x47"
+ "\x74\x35\x63\xde\x01\x5c\x70\xcd\x3c\xcc\x3b\xaa\xd8\xf5\xb6\xb3"
+ "\x0e\x1c\x4b\xe6\xf3\x8e\xc4\x1e\xcc\xda\x5b\xcc\x3d\x6a\xeb\x99"
+ "\x72\xf8\xbc\xd8\x5a\xdc\x6f\x12\xd8\xb5\xb8\x50\x37\x7f\x0d\x2e"
+ "\xb3\x2e\xf7\x2a\xf0\x92\x69\xe0\x0f\x1e\x2f\xb9\xbf\x16\xd7\xde"
+ "\x5a\xdc\x59\x0a\xf3\xdf\xb3\x96\x09\xb9\xc8\xfc\xcd\xb6\x5c\x64"
+ "\xd6\x25\xc7\xb9\xc8\x6c\x4f\x65\x5c\x64\xb6\x87\x63\x5c\x64\x76"
+ "\xbc\x38\x17\x99\x59\x82\x71\x2b\xce\x45\xc8\x39\xdb\x31\x24\xc9"
+ "\x93\x1b\x43\xe6\x9c\x6a\xff\x5c\x64\xce\x22\xf1\xf1\x62\xce\x72"
+ "\xc2\x45\x66\xc7\xb5\x3c\x17\x99\x1d\x27\xce\x45\xe6\x34\x90\xb8"
+ "\x3d\x3b\xd1\x96\x8b\xc0\x35\xa2\x5c\x24\xa9\x1f\x7b\x4d\x9c\x90"
+ "\x8b\x90\x3a\x20\x36\xbd\x2c\xcd\x45\x92\x2e\x90\x58\x95\xb4\x8f"
+ "\xc4\x2a\xe2\x53\x5b\x2e\x92\xb4\xb6\x79\x2e\x42\x30\xc4\x3c\xa7"
+ "\x24\x17\x49\x3a\x69\xcb\x45\x66\x1e\x16\xe7\x22\xf3\x76\x72\x38"
+ "\x9a\x37\x4a\xc8\x45\xe6\xf6\xba\x3b\xb8\x88\x24\xb6\x16\x09\xb9"
+ "\xc8\xdc\x2b\xf2\xb9\xc8\xbc\xde\xf2\xb8\x08\xc6\x9c\x18\x17\x99"
+ "\x17\x6f\x8d\x39\x21\x17\x99\xb7\x4a\x9c\x8b\xcc\xdb\x2c\xe4\x22"
+ "\xb8\x7e\x31\x2e\x32\xef\x98\xa0\x7e\x1b\x2e\x32\xef\x92\x90\x8b"
+ "\x90\x72\x1c\x17\x99\xbf\x86\xd5\x73\xf1\xf2\xb9\xc8\xfc\x78\x69"
+ "\x2e\x32\x7f\xae\x90\x8b\xcc\x1f\x41\x38\xc7\xfc\x02\xc2\x45\xe6"
+ "\x4f\x22\xc7\x67\xc6\xf1\x8f\x73\x5c\x84\x1c\xe7\xb8\xc8\xfc\x42"
+ "\x19\x79\x2e\x6f\x39\x6b\x71\x77\xde\x16\xe6\xb9\x2c\x39\x2e\x63"
+ "\xc0\x50\xd7\x3b\x79\x2e\xfe\x7b\x52\x91\x3c\x17\x1e\xd3\xb9\x3c"
+ "\xd7\x19\x26\x56\x71\x79\x2e\x3d\x93\xe7\xc2\x39\x2e\xfc\xae\xd4"
+ "\x92\xe3\x32\xcf\xb7\x5d\x87\xbb\xd3\x2c\x3f\xc7\xc5\xbd\x2f\xfd"
+ "\x36\x90\xe4\xb8\x2a\xef\xe4\xb8\xf0\x78\x6e\xaa\xb3\xcd\x71\xe1"
+ "\x71\x9c\xcb\x71\xfd\xdc\xc2\x39\xae\x05\x93\x95\x8d\xeb\x0b\x26"
+ "\xb5\x8f\xf7\xda\xf7\xda\x3a\xdc\xf9\x87\x49\xee\x67\xe1\x2d\x65"
+ "\xef\xb5\x17\xd6\xb6\x0f\xbf\xdc\x6b\x73\xbf\x17\x6c\x21\x7e\x59"
+ "\xb4\x56\x99\x5f\x16\xad\x69\x1f\x7e\xb9\xd7\xe6\x81\xbc\x1f\x42"
+ "\xfc\x92\xd2\x47\x99\x5f\x52\x9c\xd8\xff\x72\x45\x30\xa7\x99\x57"
+ "\x04\xf3\x35\x73\xc9\x30\xbe\x66\x4e\x69\x66\xff\xcb\x0f\xd2\x38"
+ "\xcd\xbc\xe4\x1c\xe1\xa1\x4b\x8a\x09\x0f\x5d\xc2\xbc\x9f\x5a\x1c"
+ "\x86\x18\xad\x6c\xc4\xba\xf9\xdd\x7a\x6a\xd7\xe5\x22\xca\xb8\x94"
+ "\xe8\xe5\x72\x63\x29\x3a\x66\xa8\x47\x1f\xce\x43\xae\xab\xae\x22"
+ "\xd7\x2f\x6e\xd4\x53\x5e\x71\xc8\x1d\xc6\x24\xb0\x59\x29\xf0\x98"
+ "\x8d\x28\x31\x05\x6b\xe9\x34\x53\x79\xa2\x81\xa7\xa5\x53\xa7\x72"
+ "\x3a\x1a\xca\x25\xd6\xa3\x7f\xbe\x5b\x44\x61\xbd\xdc\x94\x3d\x4d"
+ "\xdd\xd4\x6f\x28\xd9\xc7\x8a\x9f\xcf\x87\x7b\x6b\xdf\x12\xe6\xf3"
+ "\x1b\xb3\xa7\x79\x37\xec\x1c\xea\xca\xec\xa1\xd9\x87\xcb\xe9\xcb"
+ "\xd9\x3f\xf3\x93\x46\xe4\x6d\xc9\xe7\x7f\x72\xcf\xe5\xf3\x17\x9d"
+ "\x20\x18\x4d\x3b\xa2\x2c\x9f\x9f\x56\x22\xd4\xd0\x2b\x2e\xd8\x6a"
+ "\xe8\x25\xfd\x1c\xd7\xd0\x4b\xc6\x28\xd3\xd0\x4b\x22\x1c\xd3\xd0"
+ "\x4b\xf6\x58\x6b\xe8\x6d\x29\x58\x43\xa7\x18\x31\x8e\xc5\x35\x34"
+ "\x39\x67\xab\x7d\x3e\x18\xc3\x69\x9f\x0f\x7a\xb5\x7f\x0d\xbd\xb4"
+ "\x48\x5c\xe7\x2c\x3d\x42\x34\xf4\x92\xc2\x96\xd7\xd0\x4b\x0a\xc5"
+ "\x35\xf4\x07\xcf\x11\xbd\xb1\xa4\xd0\xa2\x87\x39\x0d\x0d\xd7\x88"
+ "\x6a\xe8\x0f\x66\x59\x5f\x43\x34\xf4\x92\xbd\x44\x43\x7f\xb0\x56"
+ "\x5a\x43\x2f\xeb\x4b\x62\xd7\x07\x0d\x24\x76\x11\x9f\xda\x6a\xe8"
+ "\x0f\x8e\x37\xaf\xa1\x09\x86\x98\xe7\x94\xd4\xd0\xcb\x7a\xd8\x6a"
+ "\xe8\x14\x89\xfd\x33\x97\x5f\xe7\x70\xb4\x3c\x53\xa8\xa1\x97\x4d"
+ "\xbd\x3b\x34\xb4\x24\xb6\x8a\x84\x1a\x7a\xf9\x40\xf9\x1a\x7a\xf9"
+ "\x74\x79\x1a\x1a\x63\x4e\x4c\x43\x2f\xdf\xc3\xe2\x67\xaf\xb8\x86"
+ "\x5e\x7e\x4c\x5c\x43\x2f\xbf\x20\xd4\xd0\xb8\x7e\x31\x0d\xbd\xa2"
+ "\xab\xa0\x7e\x1b\x0d\xbd\xa2\x9f\x50\x43\x93\x72\x9c\x86\x5e\x51"
+ "\x41\x62\x68\x8a\x82\xfd\x33\x57\xec\x91\xd6\xd0\x2b\x0e\x08\x35"
+ "\xf4\x8a\x35\x44\x2b\xaf\xa8\x22\x1a\x7a\x45\x01\x39\x9e\x52\xc0"
+ "\x3f\xce\x69\x68\x72\x9c\xd3\xd0\x2b\x6a\x65\x68\x68\x4d\x0b\x69"
+ "\x68\xf7\xbb\x4b\x43\xff\xd3\xd0\x3e\x34\xf4\xca\xcd\xca\x34\xf4"
+ "\xca\x02\x07\x35\x81\x77\x33\x9a\xc0\xf5\xbe\x26\xe0\xf3\xad\xff"
+ "\x71\x27\x7c\x6b\xf5\x10\x65\x9a\x60\x75\x70\x7b\xf0\xcb\xbd\xe5"
+ "\x93\x95\xec\x7c\xfd\x0f\x8f\x29\xf3\xc9\x87\xa5\xf7\xf5\x73\x6b"
+ "\xf8\x65\x75\x1a\xf1\xcb\xda\xe9\xca\xfc\xb2\x36\x5a\xb9\x7e\xce"
+ "\xce\xe3\xf4\x73\x76\x1e\x5f\x3f\x7f\x2f\x78\xe7\x9c\x3e\xc4\xbe"
+ "\x7e\x5e\x5f\xc5\xe9\xe7\xcc\xe1\x84\x83\x66\xb2\x73\x4a\x32\x98"
+ "\x9c\xfa\xa2\x7d\x44\x3f\xdf\xc6\xfa\xf9\x22\xe8\xe7\x19\x51\x94"
+ "\x91\xfd\x76\x04\x9e\xbf\x76\x0c\x34\x30\xd6\xcc\xe5\xc9\xf0\x77"
+ "\x92\x01\x7d\x38\x1b\xb9\xae\x06\xed\xbb\x1d\xc6\xca\xed\xf3\x0c"
+ "\xd4\xca\x77\x61\x9c\xa9\xdc\x89\xbc\x62\x40\x57\xdf\xc0\xba\xfa"
+ "\x30\x68\xe6\xe5\xac\xae\xce\x98\x5a\x9e\xc4\xd7\xd5\xe9\x07\x18"
+ "\x5d\x6d\x20\x73\xe3\xca\x93\x40\x57\xc3\xfd\xf0\xb7\x28\xf8\xba"
+ "\xba\x01\x74\x73\x23\xe8\xe6\x8c\xcb\x56\x1a\x7b\x86\xad\xc6\x6e"
+ "\xf0\x99\xa6\xa9\xef\x37\xd4\x1d\x6b\xec\xdb\x5b\xef\x6b\x6c\x5b"
+ "\x8d\xbd\xc6\x9b\xe0\x38\xa3\x9f\x32\x8d\x9d\x11\x20\xd4\xd8\x39"
+ "\x2f\xdb\x6a\xec\x8c\x4c\xc7\x35\x76\xc6\x3e\x65\x1a\x3b\x63\xaf"
+ "\x63\x1a\x3b\xd3\xc7\x5a\x63\xff\x8d\x79\x4f\x9d\x1e\x82\xb1\x2e"
+ "\xae\xb1\xc9\x39\x5b\x6d\xb4\x7e\x1f\xa7\x8d\xd6\x2f\x69\xff\x1a"
+ "\x7b\xbd\x9f\xb8\x0e\x5a\xdf\x8f\x68\xec\x4c\xef\x96\xd7\xd8\x99"
+ "\xde\xe2\x1a\x7b\x3d\x3b\xff\x2d\xd3\xdb\x56\x63\xc3\x35\xa2\x1a"
+ "\x7b\xfd\x49\xeb\x6b\x88\xc6\xce\xd4\x10\x8d\xbd\xfe\xba\xb4\xc6"
+ "\xfe\x68\x2d\x89\x6f\x1f\x4d\x26\xf1\x8d\xf8\xd4\x56\x63\x7f\x34"
+ "\xb8\x79\x8d\x4d\x30\xc4\x3c\xa7\xa4\xc6\xfe\x68\xb1\xad\xc6\x4e"
+ "\x0f\x16\xd7\xd8\xd9\xe3\x39\x1c\x65\xdd\x12\x6a\xec\x8f\x8a\xef"
+ "\x0e\x8d\x2d\x89\x2d\x3f\xa1\xc6\xce\xca\x96\xaf\xb1\xb3\x8e\xc8"
+ "\xd3\xd8\x18\x73\x62\x1a\x3b\xdb\x87\xc5\x8f\x46\x5c\x63\x67\x0f"
+ "\x14\xd7\xd8\xd9\x2f\x0b\x35\x36\xae\x5f\x4c\x63\x67\xcf\x15\xd4"
+ "\x6f\xa3\xb1\xb3\x33\x85\x1a\x9b\x94\xe3\x34\x76\x4e\x10\x89\xa1"
+ "\x6b\xcf\xc9\xd7\xd8\x39\x3e\xd2\x1a\x3b\xa7\x97\x50\x63\x67\x1b"
+ "\x88\x96\xce\x19\x41\x34\x76\x8e\x2b\x39\xbe\x56\xcf\x3f\xce\x69"
+ "\x6c\x72\x9c\xd3\xd8\x39\x91\xf2\xde\x53\x3b\xb5\x1f\x96\x6b\xdb"
+ "\xaf\xc7\x68\xa9\xfd\xb0\x2c\xef\xaa\xff\xe8\xf5\x18\xb9\x9d\x94"
+ "\xe9\xec\x5c\xf7\xfb\x7a\xae\xa5\x75\x43\x4e\x1c\xe1\x5b\x1b\x14"
+ "\xee\x7f\xbb\xc1\xee\xfe\xb7\xf7\xf5\x9c\x52\xbf\xe4\x46\x10\xbf"
+ "\x7c\x32\x58\x99\x5f\x3e\x09\x52\xae\xe7\x3e\x1b\xc1\xe9\xb9\xcf"
+ "\x46\x48\xbf\x0f\xcd\xeb\x64\x5f\xcf\x15\x64\x70\x7a\x2e\xff\x3a"
+ "\xe1\x3b\xf9\x27\x09\xdf\xc9\xcf\x6e\xb9\xf7\xa1\xf9\x9e\xc2\xf7"
+ "\xa1\x79\xb3\xee\xbf\x0f\x6d\x0b\xad\xb6\xa1\x8a\x60\x74\xe3\x29"
+ "\x65\x5a\x6d\x63\xa5\x50\xab\x7d\x76\xcb\x56\xab\xe5\x3f\xe7\xb8"
+ "\x56\xcb\x9f\xaa\x4c\xab\xe5\x47\x39\xa6\xd5\xf2\x0f\x89\xbf\x0f"
+ "\xcd\xf3\x90\x7e\x1f\x4a\xce\xd9\x72\xec\x82\xa9\x1c\xc7\x2e\xe8"
+ "\xd7\xfe\xb5\xda\xa6\x0a\x71\x3e\xbd\xe9\x14\xd1\x6a\xf9\x45\x2d"
+ "\xaf\xd5\xf2\x8b\xc4\xb5\x5a\xc1\x28\xc2\x6b\xf3\x8b\x6c\xb5\x1a"
+ "\x5c\x23\xaa\xd5\x0a\x96\x58\x5f\x43\xb4\x5a\xfe\x61\xa2\xd5\x0a"
+ "\x36\x4a\x6b\xb5\xcd\x43\x48\xec\xda\xdc\x89\xc4\x2e\xe2\x53\x5b"
+ "\xad\x56\x70\xae\x79\xad\x46\x30\xc4\x3c\xa7\xa4\x56\xdb\xdc\xd7"
+ "\x56\xab\xe5\xb9\x8b\x6b\xb5\xcf\x5c\x38\x1c\x7d\xba\x59\xa8\xd5"
+ "\x36\xcf\xba\x3b\xb4\x9a\x24\xb6\x2a\x84\x5a\xed\xd3\x30\xf9\x5a"
+ "\xed\xd3\xb9\xf2\xb4\x1a\xc6\x9c\x98\x56\xfb\xf4\x10\x8b\x9f\xc3"
+ "\xe2\x5a\xed\xd3\x33\xe2\x5a\xed\xd3\x5b\x42\xad\x86\xeb\x17\xd3"
+ "\x6a\x9f\xf5\x16\xd4\x6f\xa3\xd5\x3e\x7b\x4e\xa8\xd5\x48\x39\x4e"
+ "\xab\x7d\xa6\x27\x31\xf4\x93\x3d\xf2\xb5\xda\x67\x87\xa4\xb5\xda"
+ "\x67\x47\x84\x5a\xed\xb3\x3c\xa2\xc9\x3e\xab\x25\x5a\xed\xb3\x42"
+ "\x72\xfc\x93\x42\xfe\x71\x4e\xab\x91\xe3\x9c\x56\xdb\xe2\x2a\x4f"
+ "\xab\x39\xbe\x5f\xd6\x1f\x3f\xa7\x58\x7d\x8f\xcd\x29\xde\xba\x47"
+ "\x99\x4e\xdb\x5a\x78\x5f\x13\xb4\x86\x26\xd8\xa2\x21\x7c\xeb\xf3"
+ "\x97\x95\x69\x82\xcf\x47\x28\xd7\x04\xbb\x27\x71\x9a\x60\xf7\x24"
+ "\x69\x4d\xb0\xad\x97\x7d\x4d\xb0\x63\x0b\xa7\x09\xfe\xee\x46\xc6"
+ "\xd5\x2f\x2e\x91\x71\xf5\x8b\xed\x2d\xa7\x09\xbe\xe8\x2d\xd4\x04"
+ "\xdb\x96\xdf\xd7\x04\x6d\xa1\x09\xb6\xd6\x13\x8c\x6e\xbf\xa2\x4c"
+ "\x13\x6c\xaf\x11\x6a\x82\xc2\x4e\xb6\x9a\xe0\x8b\x31\x8e\x6b\x82"
+ "\x2f\xe6\x2a\xd3\x04\x5f\x24\x39\xa6\x09\xbe\x38\x29\xae\x09\xb6"
+ "\x69\xa5\x35\x01\x39\x67\xcb\xe5\x76\xcc\xe5\xb8\xdc\x8e\xb0\xf6"
+ "\xaf\x09\xfe\x5e\x25\xce\xdb\xfe\x7e\x85\x68\x82\x2f\x4e\xb4\xbc"
+ "\x26\xf8\xe2\x84\xb8\x26\xd8\x31\x95\xf0\xa7\x2f\x4e\xd8\x6a\x02"
+ "\xb8\x46\x54\x13\xec\xc8\xb6\xbe\x86\x68\x82\x2f\x2a\x89\x26\xd8"
+ "\xb1\x47\x5a\x13\xec\x1c\x45\x62\xd7\xce\x5e\x24\x76\x11\x9f\xda"
+ "\x6a\x82\x1d\xb7\x9a\xd7\x04\x04\x43\xcc\x73\x4a\x6a\x82\x9d\xcf"
+ "\xd9\x6a\x82\x6d\xbe\xe2\x9a\x60\xb7\x0f\x87\xa3\x5d\xfb\x84\x9a"
+ "\x60\xe7\xf2\xbb\x43\x13\x48\x62\xab\x4a\xa8\x09\x76\x8d\x97\xaf"
+ "\x09\x76\xad\x92\xa7\x09\x30\xe6\xc4\x34\xc1\x2e\xf6\xfd\x1f\xc1"
+ "\x8b\xad\x26\xd8\x75\x5d\x5c\x13\xec\xee\x24\xd4\x04\xb8\x7e\x31"
+ "\x4d\xb0\x7b\xb0\xa0\x7e\x1b\x4d\xb0\x7b\x8c\x50\x13\x90\x72\x9c"
+ "\x26\xd8\x5d\x4b\x62\xe8\xe7\xc5\xf2\x35\xc1\xee\x93\xd2\x9a\x60"
+ "\xf7\x19\xa1\x26\xd8\xcd\x72\xff\x42\x77\xa2\x09\x76\x1f\x26\xc7"
+ "\x3f\x3f\xcc\x3f\xce\x69\x02\x72\x9c\xd3\x04\x85\x9a\xfb\xfb\x69"
+ "\xdd\x4d\xfb\x69\xed\x39\xa2\x4c\x17\xec\x29\x51\xce\x3f\x0f\xec"
+ "\xe7\xf8\xe7\x81\xfd\x7c\xfe\x29\xdc\xd7\xe2\xcb\x8d\xf6\xf9\xe7"
+ "\x57\x88\xe3\x9f\xfb\xa6\x92\x18\xbe\x6f\x38\x89\xe1\xfb\x98\xbd"
+ "\xf9\xe4\xed\xa7\xb5\x77\xb1\x70\x3f\xad\x2f\xaf\xdc\xdf\x4f\xab"
+ "\xb5\xb8\x65\x61\x00\xe1\x96\x7b\x5f\x56\xc6\x2d\xf7\x8e\x10\x72"
+ "\xcb\xaf\xa7\xdb\x72\xcb\xbd\x3b\x1d\xe7\x96\x7b\x8f\x2b\xe3\x96"
+ "\x7b\x2b\x1c\xe3\x96\xfb\x06\x8a\xef\x61\xf1\x65\x81\xf4\x7e\x5a"
+ "\xe4\x9c\x2d\x27\xf8\x07\x6f\x5f\xfd\x7f\x6c\x6c\xff\xdc\xf2\x1f"
+ "\x3a\xf1\xf1\xff\x1f\x2f\x13\x6e\xb9\x2f\xb0\xe5\xb9\xe5\xbe\x40"
+ "\x71\x6e\xf9\x8f\x6f\xc8\x38\xbc\x2f\xc8\x76\x0f\x0b\xb8\x46\x94"
+ "\x5b\xfe\x83\xdd\xff\x7e\x5f\xa0\x90\x5b\x92\x3a\x20\x0e\x79\x4a"
+ "\x73\xcb\xaf\xb6\x93\xb8\xf4\xd5\x02\x12\x97\x88\x4f\x6d\xb9\xe5"
+ "\x57\x63\x9a\xe7\x96\x04\x43\xcc\x73\x4a\x72\xcb\xaf\x36\xd8\x72"
+ "\xcb\x2f\xf3\xc4\xb9\xe5\x81\x59\x1c\x8e\x0e\x74\x15\x72\xcb\xaf"
+ "\xce\xdd\x1d\xdc\x52\x12\x5b\x3a\x21\xb7\xdc\xbf\x47\x3e\xb7\xdc"
+ "\x7f\x41\x1e\xb7\xc4\x98\x13\xe3\x96\x07\x06\x5a\x63\x4e\xc8\x2d"
+ "\x0f\x8c\x12\xe7\x96\x07\xa6\x0b\xb9\x25\xae\x5f\x8c\x5b\x1e\xc8"
+ "\x14\xd4\x6f\xc3\x2d\x0f\xec\x14\x72\x4b\x52\x8e\xe3\x96\x5f\x47"
+ "\xb0\xe3\xdd\x70\xf9\xdc\xf2\xeb\x81\xd2\xdc\xf2\xeb\x21\x42\x6e"
+ "\xf9\xb5\x07\xe1\x90\x5f\x47\x13\x6e\xf9\xb5\x96\x1c\xff\x72\x18"
+ "\xff\x38\xc7\x2d\xc9\x71\x8e\x5b\x7e\x9d\x24\x6f\xfd\x4d\x8b\xe4"
+ "\x9b\xdb\x68\xfd\x4d\x4b\xe5\x9b\xdb\xcb\xfa\x9b\x83\xbd\x95\xf1"
+ "\xca\x83\xda\xfb\xf3\x82\x5a\x3a\xd7\xfc\xf5\x4a\xc2\xb5\xbe\xd9"
+ "\xa7\x2c\xd7\xfc\xcd\x5e\xe5\x5c\xbf\xb8\x8a\xe3\xfa\xc5\x55\xd2"
+ "\xeb\x09\xbe\x5d\x65\x9f\xeb\x7f\x17\xc0\x71\xfd\x43\xec\x7c\xdb"
+ "\x43\xb3\xc8\x98\x7a\x68\xa0\x92\xf5\x04\xab\x6f\x20\xd7\x0f\xad"
+ "\xd7\x13\x9c\xf8\x86\xac\x27\x98\x6d\xbd\x9e\xa0\x68\xbb\x70\x3d"
+ "\xc1\x3f\x3b\x49\xad\x27\xc0\xb9\xe7\xa6\x9d\x43\x99\xb5\x04\xa2"
+ "\xeb\x08\x26\xb6\xfc\x3a\x02\xac\x13\x3e\x01\xdc\x62\xad\x80\xe3"
+ "\xcd\xbd\xa5\x15\x0e\xc6\x10\xfc\x16\xcd\x55\xa6\x15\x8a\x92\x84"
+ "\x5a\xe1\xfb\x4c\x5b\xad\x50\x74\xca\x71\xad\x50\x64\x52\xa6\x15"
+ "\x8a\x8c\x8e\x69\x85\x43\x93\xc5\xd7\x11\x7c\xbb\x46\x7a\x1d\x01"
+ "\x39\x67\xcb\xf1\xfe\x65\xe2\x38\xde\xbf\x8e\xb4\x7f\xad\xf0\xaf"
+ "\x38\x71\x3e\xf7\xaf\xb9\x44\x2b\x1c\x9a\xd4\xf2\x5a\xe1\xd0\x24"
+ "\x71\xad\xf0\xaf\x4b\x84\x57\x1d\x9a\x64\x9b\x87\x86\x6b\x44\xb5"
+ "\xc2\x77\xbd\xac\xaf\x21\x5a\xe1\x50\x14\xd1\x0a\xdf\x0d\x91\xd6"
+ "\x0a\xdf\x9d\x24\x71\xed\x3b\xf6\x1b\x93\xc4\xa7\xb6\x5a\xe1\xbb"
+ "\xc5\xcd\x6b\x05\x82\x21\xe6\x39\x25\xb5\xc2\x77\xc5\xb6\x5a\xe1"
+ "\xdb\x95\xe2\x5a\xa1\x78\x23\x87\xa3\xe2\xe7\x84\x5a\xe1\xb0\xe7"
+ "\xdd\xa1\x15\x24\xb1\x15\x27\xd4\x0a\x87\xcf\xc8\xd7\x0a\xc5\x5d"
+ "\xe5\x69\x05\x8c\x39\x31\xad\x50\x3c\x99\xc5\x4f\x94\xb8\x56\x28"
+ "\x5e\x20\xae\x15\x8a\x33\x85\x5a\x01\xd7\x2f\xa6\x15\x8a\xbf\x11"
+ "\xd4\x6f\xa3\x15\x8a\x4f\x09\xb5\x02\x29\xc7\x69\x85\xef\x17\x91"
+ "\x18\xfa\xed\x40\xf9\x5a\xe1\xfb\xc9\xd2\x5a\xe1\xfb\xe9\x42\xad"
+ "\xf0\x7d\x30\xd1\x04\xdf\x67\x10\xad\xf0\xfd\x48\x72\xfc\xdb\x40"
+ "\xfe\x71\x4e\x2b\x90\xe3\x9c\x56\xf8\xbe\x40\xde\xdc\x14\xc7\xf3"
+ "\xd0\x7f\xfc\xdc\x14\xf7\x7b\x6c\x6e\x4a\xc9\x28\x65\x5a\xa1\x64"
+ "\xa4\x72\x5e\x5a\x11\xc9\xf1\xd2\x8a\x48\xe9\x39\x10\x47\x7a\xdb"
+ "\xe7\xa5\xc7\x0a\x38\x5e\x5a\xea\x42\xe2\xf7\x0f\x17\x48\xfc\xfe"
+ "\x61\xab\xa3\x73\x20\x56\xdf\x66\xb9\xa8\x65\x0e\xc4\x3c\x76\x0e"
+ "\x04\xf0\x51\xc2\x3f\x7f\xe8\x25\x9c\x03\x71\x64\x95\xd4\x1c\x08"
+ "\xd1\xb9\x0f\x56\x9c\xd3\xc2\x4f\x9d\x99\xfb\x70\x6f\x73\xce\xef"
+ "\xf7\x12\xce\x79\xf4\x92\x32\xce\x79\xb4\x5a\xc8\x39\x8f\xbb\xd9"
+ "\x72\xce\x1f\x46\x39\xce\x39\x7f\x98\xa5\x8c\x73\xfe\x90\xe8\x18"
+ "\xe7\xfc\xe1\xb8\xf8\xdc\x87\x23\x7e\xd2\x73\x1f\xc8\x39\x5b\xae"
+ "\x70\x8c\x97\x57\x3c\xf6\x5c\xfb\xe7\x9c\xa5\x7a\x71\x5e\x50\x7a"
+ "\x89\x70\xce\x1f\x2a\x5a\x9e\x73\xfe\x50\x21\xce\x39\x8f\xb1\xe3"
+ "\xff\x0f\x15\xb6\x9c\x13\xae\x11\xe5\x9c\xc7\x32\xad\xaf\x21\x9c"
+ "\xf3\x87\x13\x84\x73\x1e\xdb\x29\xcd\x39\xcb\x5e\x26\x31\xab\xac"
+ "\x07\x89\x59\xc4\xa7\xb6\x9c\xf3\xd8\xf5\xe6\x39\x27\xc1\x10\xf3"
+ "\x9c\x92\x9c\xb3\x6c\x88\x2d\xe7\x3c\xa2\x15\xe7\x9c\x15\x5d\x39"
+ "\x1c\x95\xef\x11\x72\xce\xb2\x25\x77\x07\xe7\x94\xc4\x96\x5e\xc8"
+ "\x39\xcb\xc7\xc8\xe7\x9c\xe5\xcb\xe5\x71\x4e\x8c\x39\x31\xce\x59"
+ "\x7e\x9c\xc5\xcf\x09\x71\xce\x59\x7e\x45\x9c\x73\x56\xb8\x09\x39"
+ "\x27\xae\x5f\x8c\x73\x56\x0c\x14\xd4\x6f\xc3\x39\x2b\x46\x09\x39"
+ "\x27\x29\xc7\x71\xce\x0a\x03\x89\xa1\x25\x47\xe4\x73\xce\x8a\xe3"
+ "\xd2\x9c\xb3\xe2\x94\x90\x73\x56\xec\x20\xdc\xf2\xb8\x2b\xe1\x9c"
+ "\x15\x45\xe4\x78\x49\x09\xff\x38\xc7\x39\xc9\x71\x8e\x73\x1e\xf7"
+ "\xb6\xc7\x39\xe9\xac\x0e\xd5\x19\x94\xb9\x10\x7e\xfb\xe1\x39\x7b"
+ "\xc0\xf8\x56\x04\x7f\x97\xc0\x38\xa5\x86\xbf\x2b\xa4\xb8\x8c\xc1"
+ "\xa7\x43\xb5\x19\x78\x89\x19\xee\x53\x6e\xb8\x56\x54\xd4\xd3\x88"
+ "\xc7\x93\x2c\x32\xbe\x74\xa8\xf6\x32\x76\x1c\x61\xa6\x63\x10\xed"
+ "\x0d\x7f\x27\xc3\x31\x28\xdf\x05\xc6\x43\xed\x3c\xd4\xe5\x2a\x75"
+ "\x7c\xaf\xa5\x1c\x3c\x73\x97\xf3\xd4\xf1\x59\xb8\x0e\x78\xd6\x22"
+ "\x68\x8f\x56\xf2\x59\xa1\xae\xf0\xed\x0f\xa1\xc5\x46\xfa\xb7\xa2"
+ "\x84\x1b\xa8\x8a\xfa\xb1\x93\x57\x4d\xc7\x11\x10\x87\x10\xe6\x88"
+ "\x85\x3d\x0d\xae\xb8\xce\xa2\x84\x46\x38\x77\xbc\x06\x9f\x33\xc1"
+ "\x33\xa6\xc4\x23\x2a\xfd\x46\x47\x77\xe0\x5c\x6e\xa9\xb5\x74\xf5"
+ "\x4c\x23\x3c\x33\x8c\xaf\xff\x7c\xa8\xd2\x75\xf7\xc7\x95\xcc\xd8"
+ "\x53\x56\x6b\x62\xea\xd0\x26\xe0\xe7\xf9\xd1\x33\x1f\xca\x8b\x3d"
+ "\xc3\xf2\x5d\x28\xc0\xad\x2f\xad\x97\x37\xde\xfd\x18\x25\x65\x47"
+ "\xaf\x25\x0f\xa1\xa2\x27\xc0\x76\x5a\x44\x89\x9d\x97\x79\x1f\x7b"
+ "\xf3\x1f\xdc\x3f\xea\x4e\xd7\xa6\x6e\x40\xd4\x3a\x73\x47\xf7\xef"
+ "\x20\x26\x6e\xca\xa1\x0d\x75\xab\xff\x1d\xa4\x77\x39\xb4\x0d\xdb"
+ "\xfc\x03\x38\xbf\xae\x3b\x6d\xb8\xb9\x14\xe3\xe6\xdf\x23\x0f\xc1"
+ "\xd8\x6e\xed\x8b\xd9\xd1\xf1\x53\xb5\x49\xb1\xf1\xd3\x67\xce\x4d"
+ "\xd2\xf6\x89\xee\x8c\xc6\xcd\x9c\xa9\x8d\x9f\x9a\xb0\x40\xcb\x3f"
+ "\xf3\x8c\x36\x3a\x76\xce\xd4\x69\x71\xd3\xfb\xc5\xbf\x9d\xd8\x19"
+ "\x9e\x09\xf1\x9e\xc3\x1b\x3f\x8b\x79\xf5\xbf\x23\xf3\xd7\x23\xf4"
+ "\x51\x37\xe4\x8a\x9f\x0b\xee\x77\x50\xef\xaa\xad\xc2\xf7\x4b\xcf"
+ "\xa1\x6b\x29\x28\x93\x0a\x31\x6d\x5d\x4a\x47\x28\xfb\x63\xc9\x26"
+ "\x78\xae\x7c\x78\x6e\x78\x46\xfc\xcc\xd5\x96\x67\xb6\x60\x22\x15"
+ "\x63\x22\xe5\x06\x60\xf0\x44\x27\xaf\xfa\x8e\x2f\xd1\x74\x24\x6e"
+ "\x5f\x2d\xf4\x15\x17\x38\xb6\x99\xd1\x0d\xd9\x1d\xaa\xeb\x56\x9f"
+ "\xf0\xb3\x60\xcc\x9c\x15\x9e\x46\xe7\x74\x28\x04\x5e\xe9\x52\x47"
+ "\xc7\x3c\x0f\xd8\xc4\xd7\xcf\x1a\x80\x50\x1a\x5d\x17\xc9\x7c\x1b"
+ "\x83\xae\x03\x0c\x13\x9c\xc2\xb9\x93\xc3\x6e\x52\x28\x14\xea\x88"
+ "\xd1\xa3\xf8\x1a\x5c\x87\x1e\x8e\x61\x9b\x9b\x0b\xe2\xd5\xe3\xfd"
+ "\x51\xda\xe3\x69\x28\xad\x0e\x5f\xb3\xa5\x7f\xb5\x57\x12\x72\x09"
+ "\x4f\xa6\xcf\x42\xdc\x71\xa1\x7b\xc7\xab\xe9\xad\xfd\xab\xf5\xd4"
+ "\x89\x91\xe6\xec\xf0\x34\x68\x4f\x0d\xd4\x53\xa8\x47\x4d\x15\xb8"
+ "\x9e\x75\x39\x8c\xed\x6b\x70\xdb\xc1\x3e\xa0\x7f\xe8\x22\x7a\x29"
+ "\xdb\x87\x32\xfc\xb4\xe6\x8c\xd9\x51\xe5\xae\xb7\x51\xb8\x91\x6e"
+ "\xa2\x33\xfd\xb4\x65\xb5\xb5\x10\xd3\x12\xdf\xa6\x3b\xff\x3b\xd6"
+ "\xcb\x18\x3b\x7d\x53\x37\xe8\x8b\x99\xb3\xa3\xe8\xcc\x67\x27\x8d"
+ "\xef\x8b\xd4\x75\xab\x4f\x7a\x58\xec\x09\xb6\x74\x95\x87\xa3\x93"
+ "\x6a\xdc\x26\x8c\x07\x78\x1e\x16\x0f\x27\x27\x1d\x4a\xb2\xc5\xc3"
+ "\x9d\xbe\x99\xf3\xbc\xc1\x48\x47\xbe\xd4\x94\x15\xea\x4f\x7b\x87"
+ "\x7a\xa7\x5c\x40\x1d\xb0\x6d\xcb\x40\x0b\xa4\xcf\x43\x9a\xb5\x6f"
+ "\x21\xed\x94\x05\x6a\x64\xc8\x0e\x55\x7b\x2d\x49\x73\x01\x9b\x50"
+ "\x10\x5f\x02\x21\x66\x06\x36\x75\x0f\x4f\x5b\x34\x1d\x51\x3b\xcf"
+ "\x17\x52\x98\x3f\xe3\x79\x2b\x17\xa9\xff\xf4\xca\x87\xeb\xe8\x6b"
+ "\x91\x08\xfb\x83\xf1\xc5\xb5\x18\x34\x2a\x16\xc6\xe7\x77\x99\xf3"
+ "\x63\x36\x42\x9d\x32\xdb\xc5\xf0\x5f\x13\xf8\x6a\x00\xf8\xa9\xbc"
+ "\xca\xc4\xd4\xc9\xf8\x2a\x8e\xf3\xd5\x37\xf0\x1c\x9c\xbf\x4e\x56"
+ "\x62\xbf\x8a\xb7\x39\x34\x91\x6d\xf3\x36\x68\x73\x96\x9d\x36\x67"
+ "\x90\x36\xbb\xdd\xb0\xdf\xe6\x9f\xba\xda\x6f\xf3\x4f\xc3\xe5\xb7"
+ "\xf9\x3f\xa7\xe5\xb7\xf9\x3f\xa5\x76\xda\xcc\xfa\x59\x07\x7e\xd6"
+ "\xd9\xf1\xb3\x8e\xf5\xf3\x03\xe7\xed\xb7\xb9\xd2\xcd\x7e\x9b\x2b"
+ "\x87\xc8\x6f\xf3\x4f\x15\xf2\xdb\xfc\x53\x91\x74\x9b\x75\xac\x9f"
+ "\x75\xe0\x67\x9d\x1d\x3f\xeb\x58\x3f\x77\xfd\xb1\x99\x36\x37\xd8"
+ "\x6f\xf3\xa9\x7e\xf2\xdb\x5c\x79\x58\x7e\x9b\x2b\xf7\xda\x69\x33"
+ "\xeb\xe7\x30\xf0\x73\x98\x1d\x3f\x87\xb1\x7e\x7e\x7a\xb5\xfd\x36"
+ "\x9f\xba\x62\xbf\xcd\x3f\xf7\x96\xdf\xe6\x53\xfb\xe5\xb7\xf9\xd4"
+ "\x36\xe9\x36\x87\xb1\x7e\x0e\x03\x3f\x87\xd9\xf1\x73\x18\xeb\xe7"
+ "\x37\x87\xda\x6f\xf3\xcf\xe7\xec\xb7\xf9\xbf\x3e\xf2\xdb\xfc\xf3"
+ "\x0e\xf9\x6d\xfe\x39\x4f\xaa\xcd\x8d\x10\xb7\x3d\xa0\x2d\x4d\x3f"
+ "\x45\xbe\x64\xf2\x0e\xf5\xf5\xa8\x42\x54\xde\x52\x73\x8c\x57\x35"
+ "\xea\x04\x6d\x8b\xa1\x73\xc6\x46\xe0\x7f\xcd\xde\xa1\x9a\x46\xef"
+ "\x50\xff\x86\xee\x1d\x0a\xdf\x9f\x8c\x3a\x60\x3e\xbe\xca\x8c\x34"
+ "\xe6\xac\x50\xef\x35\x63\x91\x36\xd5\x80\xd4\x65\x29\x7a\x94\x92"
+ "\x48\x1b\xca\xd0\x39\xe4\x59\x8d\xb5\xe7\xcf\xa8\xb4\xa6\x04\x25"
+ "\xcc\xa6\xe9\x8b\xd4\xe9\xa9\x38\x6f\x02\x3c\x39\x2d\xe3\x3f\x48"
+ "\x0b\xf7\x08\xcc\x87\x1f\xae\xc7\x6b\x24\x8c\x9f\x39\x63\xc7\x6e"
+ "\x4a\x41\x9a\x6f\xdf\xad\x46\xf8\xf8\x46\xf8\x99\x72\xc2\xd3\x52"
+ "\x26\x23\x6a\xd7\x8d\x4a\x8a\x8c\xcd\xa7\xfb\x59\x8f\xcd\x23\xa7"
+ "\x82\x2d\xa7\x31\xe7\x16\xe4\x8d\x95\x6b\xcb\xff\xd6\x5b\xc6\x6e"
+ "\xc6\x96\xa7\x4d\x64\xbc\xb7\x1a\xbb\xbf\x85\xfb\x73\xb6\xfc\x6f"
+ "\x35\xb6\x25\x9d\x15\x1a\x58\x5e\xdd\x88\x75\x93\xfa\x62\x32\xa2"
+ "\xe0\x78\x6e\x59\xe2\x0d\x24\x6e\xe3\xd0\x44\x9e\x8d\xf3\x3c\xaa"
+ "\xdc\x6e\x48\xd8\x38\x17\x6c\xbc\x4d\xc4\xc6\x59\x8e\xd9\xf8\x4c"
+ "\xb1\xf3\x36\x3e\x93\x29\x6d\xe3\x33\x67\xe4\xdb\xf8\xcc\x24\xf9"
+ "\x36\x3e\x33\x92\xb5\x71\xa1\xd0\xc6\xa7\x8d\x76\x6c\xcc\xc3\xb1"
+ "\x0e\x70\xfc\xc0\x79\x71\x1b\xeb\x00\xc7\x3a\x11\x1c\xeb\x1c\xc4"
+ "\xf1\xd9\xbe\xce\xdb\xf8\x97\x5b\xd2\x36\x3e\x1b\x26\xdf\xc6\xbf"
+ "\x14\xc9\xb7\xf1\x2f\x85\xc4\xc6\x3a\x2b\x1c\xff\x12\x25\x6d\x63"
+ "\x1d\x0f\xc7\x3a\xc0\x71\xd7\x1f\x25\x6c\x0c\x38\xd6\x89\xe0\x58"
+ "\xe7\x20\x8e\xf5\x6b\x9d\xb7\xb1\xfe\x0d\x69\x1b\xeb\xb7\xca\xb7"
+ "\xb1\xde\x4f\xbe\x8d\xf5\xde\xac\x8d\xad\x70\x7c\xf6\xb0\x1d\x1b"
+ "\xf3\x70\x1c\x06\x38\x7e\x7a\xb5\xb8\x8d\xc3\x00\xc7\x61\x22\x38"
+ "\x0e\x73\x10\xc7\xe7\xae\x3b\x6f\xe3\x73\xdf\x48\xdb\xf8\x7c\x27"
+ "\xf9\x36\x3e\xb7\x52\xbe\x8d\xcf\x25\x13\x1b\x87\x59\xe1\xf8\x9c"
+ "\xbf\xb4\x8d\xc3\x78\x38\x0e\x03\x1c\xbf\x39\x54\xc2\xc6\x80\xe3"
+ "\x30\x11\x1c\x87\x39\x88\xe3\x5f\xc7\x3b\x6f\xe3\x5f\x7b\x4b\xdb"
+ "\xf8\xd7\x78\xf9\x36\x3e\x5f\x23\xdf\xc6\xe7\x4f\xb3\x36\xb6\xc2"
+ "\xf1\xf9\x35\x52\x36\x6e\x02\x0d\xe8\x09\x36\xf6\xac\x41\xd4\x46"
+ "\x6c\xdb\x4a\x62\x5b\x53\xf7\xb1\x11\x1b\x29\x73\x0c\xb6\x09\x93"
+ "\x03\xfa\x5d\xd3\xc5\x94\x15\xea\x4b\x53\xd0\xa6\x14\x9c\x77\xfd"
+ "\xf5\xa4\x71\x29\xea\xa2\x4d\xc1\xf9\xdf\x0b\xcc\xfc\x58\x6d\xca"
+ "\x8a\x33\x70\x3f\x15\xce\x7b\x19\xb3\xdd\x32\x4c\x3e\x2f\x44\xc1"
+ "\x39\x4f\xba\xcf\x40\x04\xda\x2b\x90\x7e\x4f\xe3\x5d\x5e\x53\x08"
+ "\xf6\x39\x8a\xca\x2a\xbf\x46\xe6\xee\x63\xc7\x0e\x30\x22\x7f\xfa"
+ "\x77\x7f\xef\xd2\x24\x3d\x32\xbd\xad\xf1\x28\x4f\x2e\x41\xe5\xc9"
+ "\x5f\xa2\xf0\x6a\xfa\x36\xfd\xab\xbf\x47\x93\x4f\x64\xae\xc9\x67"
+ "\x6c\xa0\x29\x7b\x9a\xbf\xd1\x27\x72\xe5\xce\x79\x7a\xca\xa3\x1e"
+ "\xf9\xc7\x55\xd1\x74\xfa\x34\xe4\x9a\x7e\x1e\xb9\xaf\x9b\x86\x3c"
+ "\xd6\x9d\x47\xea\xd2\xaa\x4a\x74\xec\x72\x09\x3a\x76\xe3\x14\x3a"
+ "\x76\x1b\x7e\x8d\xf0\x33\xc3\x2f\xed\x14\xf8\x1a\xa1\x51\x57\x10"
+ "\xfe\xae\xa8\xe1\xc9\xd3\xc8\xbb\xd4\x58\x89\xf0\x9a\xde\xab\x54"
+ "\xd5\x76\x8f\x28\xe4\x4d\xff\xaa\x41\xf4\xdb\x1a\x0a\xce\xb9\xe2"
+ "\xe3\xe5\x46\x03\x2a\xad\xaa\xc7\xe7\x57\xc2\x79\xd7\xd4\x2a\xa8"
+ "\xdf\x5c\x82\xbf\x1b\x6a\x28\x4d\x3b\x82\x8c\x99\xfb\xf0\xb8\xe7"
+ "\x4f\x77\x7f\xde\x90\x01\xa6\x36\xd3\x9a\x47\x08\x0e\x2e\x1c\xca"
+ "\x37\xcb\xf5\x75\x15\xd9\xff\xe6\x3d\x4d\x37\xb0\x73\x4f\xf3\x7b"
+ "\x91\xea\xd1\xa7\xce\xd2\x78\x8e\x1f\xce\x25\x94\xd5\x1e\x45\xf8"
+ "\x5d\x53\xf8\x02\x84\x46\x9a\x10\xc2\xb6\x28\x4f\xae\x46\xa3\x13"
+ "\x91\x17\xce\x3f\x9b\x7f\xf7\xef\x56\x5e\x65\x40\x8b\x8d\xf0\x8c"
+ "\x57\xeb\xef\x3c\x63\xd9\xb2\x32\x04\xe7\x7a\x96\xc5\xe8\x91\x47"
+ "\x22\x52\x63\xfb\x1a\xb3\x42\x35\xa3\xa1\xff\x24\xd4\xd2\x34\xb6"
+ "\x2d\xb6\x29\xb6\x2f\xae\xcf\x62\xf3\xf2\x68\x03\x4a\xad\x47\xea"
+ "\xf2\x14\xf8\x37\x99\x36\x94\xa3\xeb\x08\x9e\xf1\x20\xdd\x75\x5f"
+ "\x1a\xe0\x62\x1c\xc6\x82\x9e\xfa\xb5\x14\xfc\xdf\x4d\x02\x53\x59"
+ "\x04\x53\x6e\x37\x1c\xc0\x54\x1e\x87\xa9\x8b\x7d\x39\x4c\x55\xbb"
+ "\x49\x63\xea\xb7\xa9\x2c\xa6\x0a\xdb\x27\xa6\x2e\x9a\xec\x63\xea"
+ "\xe2\x69\x3b\x98\xda\x46\x77\x0f\x4d\x14\x62\xaa\xda\x47\x3e\xa6"
+ "\x7e\x0b\x68\x43\x4c\xe5\x2a\xc3\xd4\x6f\x6a\x21\xa6\x2e\x6a\xa5"
+ "\x31\xa5\x63\xe3\xd4\x03\xe7\x9b\xc7\x94\x8e\x17\xa7\xaa\x17\x73"
+ "\x98\xba\xfc\x86\x34\xa6\x2e\xed\x23\x98\xd2\xb5\xd3\x38\x75\x69"
+ "\x8c\x7d\x4c\x5d\x0a\x94\xc6\x94\x0e\xe2\x54\xa8\x55\x9c\xba\x1c"
+ "\x2b\x1f\x53\x97\xd2\xda\x0e\x53\x3a\x85\x71\xea\x52\xb4\x10\x53"
+ "\xd5\x49\x76\x30\xc5\xc6\xa9\xae\x3f\x3a\x80\x29\x5e\x9c\xba\x7c"
+ "\x9c\xc3\x54\xcd\x4e\x69\x4c\xd5\x74\x62\x31\xd5\x4e\xe3\xd4\xef"
+ "\x5b\xed\x63\xea\xf7\x65\x76\x30\x05\x71\x4a\x67\x15\xa7\x6a\xbe"
+ "\x91\x8f\xa9\xdf\x4f\xb4\x21\xa6\x14\xc6\xa9\xdf\xf7\x0b\x31\x75"
+ "\xb9\x44\x1a\x53\x61\x6c\x9c\x7a\x7a\x75\xf3\x98\x0a\xe3\xc5\xa9"
+ "\x2b\x7d\x38\x4c\x5d\x73\x91\xc6\xd4\xd5\xc9\x04\x53\x61\xed\x34"
+ "\x4e\x5d\x69\xb0\x8f\xa9\x2b\x95\xd2\x98\x0a\x83\x38\xa5\xb3\x8a"
+ "\x53\xd7\xba\xca\xc7\xd4\x55\xff\xb6\xc3\x54\x98\xc2\x38\x75\xd5"
+ "\x43\x88\xa9\x2b\xbe\x76\x30\xc5\xc6\xa9\x37\x87\x3a\x80\x29\x5e"
+ "\x9c\xba\xb6\x80\xc3\xd4\xf5\xf1\xd2\x98\x32\xec\x61\x31\xd5\x4e"
+ "\xe3\x94\x61\x94\x7d\x4c\x19\x02\xec\x60\x0a\xe2\x54\x98\x55\x9c"
+ "\xba\x3e\x5d\x3e\xa6\x0c\x8b\xda\x10\x53\x0a\xe3\x94\x21\x4a\x88"
+ "\xa9\x6b\x89\x52\x98\x6a\xc4\xba\xcf\x05\x30\x15\x03\xba\x0f\x30"
+ "\xe4\x55\x41\x30\xd5\x04\x98\xfa\x84\x8f\xa9\xff\x5a\xeb\xbe\xeb"
+ "\xc7\xcc\x77\x30\x75\xf3\x94\x35\xa6\xcc\x80\xa9\x26\x06\x53\x37"
+ "\xae\x5b\x74\x5f\x79\x4d\x01\xf8\xea\x32\x2a\x8f\x00\x3c\xe5\xb0"
+ "\x78\xfa\x2f\xe0\x09\xda\x63\x86\xf6\x96\x9e\xae\x44\xe1\x06\xd2"
+ "\xae\x46\x68\xaf\x99\x8f\xa5\xc6\x6a\x0a\x63\x08\x63\xc7\x82\xa3"
+ "\x63\x09\x80\x9f\xd9\xc7\xd1\xb1\x79\xf0\x5b\x08\xbf\x14\xf8\xa1"
+ "\xe3\xa8\xb4\x1a\x31\x39\x7b\x0e\x3f\x15\x2c\x7e\x6e\xac\xb5\x8f"
+ "\x9f\x1b\x71\xf2\x34\xde\xcd\x4b\xf2\xf1\x73\xe3\x20\x3b\x97\x4e"
+ "\x1d\x3e\xe6\x2c\x8d\xe7\xcd\x12\x8c\x5c\x46\xe1\x46\xe4\x45\xbf"
+ "\xe9\xdf\xcd\x23\x12\xa9\xdf\x37\x21\x6a\xed\x34\xa4\x5e\xfb\x33"
+ "\xb4\xd7\xd2\x77\xce\x23\x8f\xa3\xf5\x5f\xa3\xd2\x1b\x95\xa8\xf4"
+ "\xf6\x11\x54\x6a\x86\xdf\x65\xf8\xc1\x33\x86\x4f\xe7\xb7\xd7\xc0"
+ "\xb6\xf7\xe6\x62\xa8\xcb\x4f\xba\xbd\x37\x27\x31\xed\x8d\x86\xf6"
+ "\x36\x72\xed\x2d\x07\x2c\x82\x5f\x7a\x9a\x59\x9d\x18\x6e\x40\x9d"
+ "\x66\x1a\x69\xba\x91\xc5\x20\xf6\xcb\xd1\x13\xf5\x28\x3c\x11\x7c"
+ "\xf5\x36\x60\xb0\x6a\x1b\x4a\x5d\x04\x18\x6c\xac\xc7\xef\xf5\x0d"
+ "\xe5\x69\x0d\x80\xc1\x1b\x05\x34\xd8\xad\x09\x63\xf0\xbf\x18\x83"
+ "\xd7\x0f\x9b\xa5\x31\x98\x45\x30\x08\x3a\xb1\x79\x0c\xf2\xe2\x5a"
+ "\xed\x18\x0e\x83\xb7\x27\x4b\x63\xf0\xd6\x5c\x8b\x4e\xfc\xe3\x31"
+ "\x78\xab\xab\x7d\x0c\xd6\x1a\xe4\x69\xc2\xdb\xf1\xf2\x31\x78\x4b"
+ "\xd7\x76\x18\xbc\xed\x62\x1f\x83\xb7\xf4\x0e\x60\x30\x57\x19\x06"
+ "\x6f\xf9\x09\x31\x58\x3b\x42\x1a\x83\x3a\x36\x0e\x82\xae\x6c\x16"
+ "\x83\x7c\x5d\x79\xfb\x24\x87\xc1\xfa\x73\xd2\x18\xac\x6b\xb0\xe8"
+ "\xca\x3f\x1e\x83\x75\xd9\xf6\x31\x58\x97\x24\x4f\x43\xd6\x5f\x97"
+ "\x8f\xc1\xba\xc3\x6d\x87\xc1\xfa\xe5\xf6\x31\x58\x1f\xdd\x3c\x06"
+ "\x75\x0a\xe3\x60\xdd\x36\x21\x06\x6f\x97\xda\xc1\x20\x1b\x07\x41"
+ "\x87\x36\x8f\x41\x5e\x1c\x6c\x78\x83\xc3\x60\xd3\x74\x69\x0c\x36"
+ "\x2e\xb6\xe8\xd0\x3f\x1e\x83\x8d\x3d\xec\x63\xb0\xa1\x5e\x9e\xe6"
+ "\x6c\x9a\x2b\x1f\x83\x8d\x23\xda\x0e\x83\x4d\x9d\xec\x63\xb0\xb1"
+ "\xda\x01\x0c\x2a\x8c\x83\x8d\x01\x42\x0c\x36\x44\x48\x63\x30\x8c"
+ "\x8d\x83\xa0\x5b\x9b\xc5\x20\x5f\xb7\x36\x9d\xe1\x30\x68\xba\x24"
+ "\x8d\x41\x93\x8b\x45\xb7\xfe\xf1\x18\x34\x6e\xb4\x8f\x41\xe3\x22"
+ "\x79\x1a\xd5\xd4\x20\x1f\x83\xc6\xd2\xb6\xc3\xa0\x69\xad\x7d\x0c"
+ "\x9a\xe2\x9a\xc7\x60\x98\xc2\x38\x68\x2c\x14\x62\xb0\xe9\x84\x1d"
+ "\x0c\xb2\x71\x10\x74\x6e\xf3\x18\xe4\xc5\x41\xf3\xd4\x3b\x18\x54"
+ "\xa1\x78\x69\x0c\xd2\xcb\x2d\x3a\xf7\x8f\xc7\x20\xdd\xdb\x3e\x06"
+ "\x69\x24\x4b\xd3\xaa\xd0\x62\xf9\x18\xa4\x23\xda\x0c\x83\x2a\xd4"
+ "\xd5\x3e\x06\x69\x83\x03\x18\x54\x18\x07\xe9\x20\x21\x06\xcd\x91"
+ "\x52\x18\x34\x83\x2e\x6e\xda\x32\x10\x99\xb3\x22\x73\xbd\x5c\xb4"
+ "\xc8\xe8\xfd\x42\x54\x79\x52\x2d\x1a\x7d\x0b\xec\x93\x78\x0b\xbd"
+ "\x75\x4b\x8d\x4c\x59\x91\x2b\x81\x93\x6b\x78\xfa\x99\x99\x5b\x66"
+ "\xcc\xd8\x97\xb6\x2e\x01\xb9\x82\xfe\x1e\x8b\x8f\x95\x5f\xac\x47"
+ "\xf8\xfe\x8b\xf1\xf3\x5c\xe6\x9e\x07\xe7\x09\xe8\x6b\xfe\x6a\xe6"
+ "\x1d\x73\xa3\x1e\x55\x85\x20\x55\x69\x95\x1e\xec\xb0\x90\xf1\x2f"
+ "\xb6\xcb\x45\x95\x4b\xc4\xa6\xab\xc8\xd5\xf8\xab\xa6\x27\xd8\xdb"
+ "\xdb\x73\x3e\x72\xf1\xad\xa2\xcd\xd8\xae\xd8\x5e\xd8\xc6\xda\x85"
+ "\x34\x0d\xe5\x36\x97\x01\xc6\x8c\xbf\xfa\xf7\xcc\x87\x72\xa2\x7a"
+ "\x55\xe5\xb2\x5d\x36\x36\x54\x2e\x71\xcc\xba\x05\x95\xcb\x88\xd2"
+ "\xd3\x48\xf4\xdd\x31\xd8\x2a\xcb\x41\x5b\xe5\xf2\x74\x5e\x2b\xd8"
+ "\x8a\x5a\xe4\x98\xad\xa8\x63\x56\xb6\xb2\xd5\x55\x2a\xea\xa4\x7c"
+ "\x5b\x51\xb9\xc4\x56\x54\x92\xb4\xad\x74\x0e\xe2\x4a\xa7\xe1\xe9"
+ "\x91\x56\xb0\x95\x6a\x9b\x63\xb6\x52\x35\x08\x6d\x25\xc2\xff\x55"
+ "\xae\x2e\xf2\x6d\xa5\x22\x7b\x81\xaa\x54\x05\x76\x6c\xe5\x20\xae"
+ "\x74\xb9\x3c\xde\xdc\x0a\xb6\x72\x3d\xe1\x98\xad\xdc\xfa\x58\xd9"
+ "\xca\x96\xa7\xaa\xdc\xfa\xc9\xb7\x95\x2b\xf9\x1e\x9e\xca\xb5\x54"
+ "\xda\x56\x61\x0e\xe2\x2a\x4c\xc3\xe3\x77\xad\x60\xab\x0e\xc8\x31"
+ "\x5b\x75\x18\x23\xb4\x95\x08\x9f\x52\x75\x78\x43\xbe\xad\x3a\xf8"
+ "\x12\x5b\xb9\xd5\xdb\xb1\x95\x83\xb8\x0a\xcb\xe5\xf1\x90\x56\xb0"
+ "\x55\xc7\x00\xc7\x6c\xd5\x71\xb1\x95\xad\x44\xc6\xfd\x8e\xcb\xe5"
+ "\xdb\xaa\xe3\x08\x62\xab\x8e\x7e\x52\xb6\x32\x65\x85\x7a\x7b\x81"
+ "\x0d\x1a\x72\x9e\x37\x78\x25\x23\xaa\xd1\x0f\xec\xe6\x0d\x76\x5b"
+ "\xa2\x05\xfe\x04\x76\x33\x18\xd1\xe8\x59\x67\xe9\xb2\x1a\x13\x6a"
+ "\x04\x9b\x35\x78\x87\x6a\xca\x0d\xd5\x78\xce\xd1\xb3\xe7\x55\x9d"
+ "\xa6\xbf\x39\x4b\x8d\xb0\xdd\xb0\x1d\xb0\xed\x68\xb0\x1b\x63\x47"
+ "\xef\x69\xfe\x26\xef\xb1\x81\xa3\xae\x9c\xa5\x67\xea\x69\x1a\xb7"
+ "\x97\xf6\x76\xcb\xc0\xef\x05\xc2\xab\x51\x27\xed\x58\xdc\xa6\x4e"
+ "\x3e\xf8\x78\xb9\xa1\x12\xf8\xc1\x0d\xc4\x70\xb3\xb3\xfe\xde\xa6"
+ "\x09\xfe\x1e\xa6\xf2\xc8\x97\xe8\xee\x1d\x0a\x8d\xdd\xc3\xd3\x52"
+ "\xaf\xa0\x0e\x98\x3f\xa4\x9b\x91\x66\x71\x3c\xa2\x76\xbd\x5b\x44"
+ "\x31\x6b\xd7\x66\xe3\x3a\xdc\xcf\x81\x5d\x34\xf4\x4d\xde\x9c\xee"
+ "\x9b\x31\xa8\xfc\x62\x06\xe3\x37\x6b\x8e\xc0\xf8\xed\x27\x7f\x35"
+ "\xf0\xcc\x40\xda\x3b\xd4\x3f\xa3\x0c\x69\xe9\x26\xb0\x71\x0a\xf3"
+ "\x3c\xc7\x36\x35\xca\xb5\xb1\x3b\x33\xff\xdb\xac\x65\xe7\x6f\x81"
+ "\x9d\xf0\xfd\x99\xf9\x5b\x89\xbc\xf9\x5b\xf0\xcc\x77\xe6\x6f\xa9"
+ "\xdc\x13\xf1\xfc\x2d\xf3\x59\x4d\x4f\x4b\xdb\x67\xc6\xd1\x34\xb4"
+ "\xbd\x5b\x59\xad\x01\xe1\xf6\x97\xd5\x16\xa1\xd4\x24\xa4\x2e\x6b"
+ "\xac\x46\x29\xb5\xb4\xa1\x2c\xed\x12\x0a\xbf\x85\x79\x30\xc6\x4b"
+ "\xa7\xc9\xc4\xaf\xee\x81\xe6\xb3\xfe\x3d\xf5\xaa\x4e\xe3\xca\x2a"
+ "\x10\xe2\xad\xe3\x89\x01\xce\xec\x0e\x7e\x88\x29\x4f\x3b\x8f\xc0"
+ "\x27\x85\xe5\xc6\x9f\xb1\x9f\x62\xe0\x7c\xc8\x1d\x7e\xdd\x7d\xec"
+ "\x97\xf8\x18\xf6\x19\x7e\xdf\x84\xf7\x0e\xd8\xc4\xe3\xdf\x18\x17"
+ "\x5e\xc9\x69\xa8\x3c\xb9\x11\x95\x19\x11\x02\x1c\x9d\xfe\x21\xb2"
+ "\x52\x0a\x47\x59\x04\x47\xa1\x89\x5e\xc9\x6e\x37\x1c\xc0\x51\x2e"
+ "\x87\xa3\x07\x76\x3a\x87\xa3\x07\x26\x3b\x8f\xa3\x07\xfa\x3a\x81"
+ "\xa3\x6d\x42\x1c\x79\xf8\xc8\xc7\x51\xe7\x5a\xf9\x38\xea\xbc\xdf"
+ "\x39\x1c\x3d\xb0\x95\xe0\xa8\x73\x32\xc1\xd1\x03\x79\x1c\x8e\x98"
+ "\xb5\x51\xad\x84\xa3\xce\x7e\xd2\x38\xd2\xb1\xf1\x28\x14\xe2\xd1"
+ "\x03\xe7\x9b\xc7\x91\x8e\x17\x8f\x3c\x6f\x39\x87\x23\xcf\xad\xce"
+ "\xe3\xc8\x73\x96\x72\x1c\xe9\xac\xe2\x51\x97\xc9\xf2\x71\xe4\x19"
+ "\x22\x1f\x47\x9e\xc8\x39\x1c\x79\x5e\x21\x38\xf2\x28\x22\x38\xf2"
+ "\xac\xe2\x70\xc4\xac\x37\x6b\x25\x1c\x79\xc4\xd9\xc1\x11\x1b\x8f"
+ "\x74\x10\x8f\xba\xfe\xe8\x00\x8e\x78\xf1\x48\xfd\x9c\x73\x38\xf2"
+ "\xba\xe2\x3c\x8e\xbc\x0e\x38\x81\x23\xab\x78\xa4\xde\x2a\x1f\x47"
+ "\x5e\xcb\xe4\xe3\xc8\x6b\x84\x73\x38\x52\x0f\x26\x38\xf2\x72\x27"
+ "\x38\x52\x07\x70\x38\x62\xd6\xf0\xb5\x12\x8e\xba\xec\x95\xc6\x51"
+ "\x18\x1b\x8f\x74\x10\x8f\x9e\x5e\xdd\x3c\x8e\xc2\x78\xf1\xa8\xdb"
+ "\x72\xe7\x70\xd4\x6d\xb0\xf3\x38\xea\xe6\xa2\x1c\x47\x61\x56\xf1"
+ "\xa8\xdb\x15\xf9\x38\xea\x5a\x2a\x1f\x47\x5d\x33\x9c\xc3\x51\xb7"
+ "\xc5\x04\x47\x5d\x23\x08\x8e\xba\x25\x71\x38\x62\xd6\x45\xb6\x12"
+ "\x8e\xd4\x46\x3b\x38\x62\xe3\x51\x18\xc4\xa3\x37\x87\x3a\x80\x23"
+ "\x5e\x3c\xf2\x3e\xe6\x1c\x8e\xbc\x17\x3b\x8f\x23\xef\x97\x9d\xc0"
+ "\x91\x55\x3c\xf2\x19\x2c\x1f\x47\xde\xde\xf2\x71\xf4\xa7\x4a\xe7"
+ "\x70\xe4\x5d\x4c\x70\xf4\xa7\x5c\x82\x23\xef\x83\x1c\x8e\x98\xb5"
+ "\xa6\xad\x84\xa3\x3f\x0d\x93\xc2\x11\xde\x8b\xe0\x23\xb2\x2f\x44"
+ "\xed\xba\x85\x28\x78\x13\xfe\xb7\x11\x05\xd6\xa5\xfb\xc4\x1d\x5a"
+ "\x44\xf6\x03\xd0\xab\x7c\x98\x7c\xaf\xd8\xf5\x0f\x6c\x07\xbf\x78"
+ "\x87\xaa\xc3\xcf\x90\x3d\x1a\xf0\xbe\x20\x37\x53\x63\xd0\x00\xbc"
+ "\x2f\x83\xaa\xfb\x16\xbc\x8f\xd5\x9d\xbd\x03\xbc\x25\xf6\x0e\x98"
+ "\x28\xbd\x77\x40\x63\x8e\x65\xdd\xed\x36\x6e\xdd\xad\xaa\xfb\x2c"
+ "\xbb\xeb\x6e\x55\xdd\xdf\xd8\x38\x51\x2e\x1e\xba\x33\xeb\xbf\x6e"
+ "\x76\x7f\xde\x50\x97\xde\x3d\x06\xda\xac\x23\x6d\xef\xce\xec\x1f"
+ "\xdc\xfc\x7a\xdc\x6d\x3c\x9c\x74\xf7\x1e\x3f\x09\xa5\xd1\xab\x4f"
+ "\xc6\xd0\x3e\xa1\x6a\x3a\x3b\x54\xee\xb3\x48\x7e\xff\x90\xb5\x77"
+ "\x86\xb8\xbd\x35\xde\xc4\xde\xec\xbe\x05\xde\x12\xfb\x16\x4c\x94"
+ "\xde\xb7\x40\xdc\xde\x0f\xda\x5f\xe7\xac\x7a\xf0\x88\x7c\x7b\x3f"
+ "\x98\x45\xec\x1d\x9a\x58\x97\xfe\x60\x25\x67\x6f\xcd\x38\xf9\xf6"
+ "\x7e\x70\x19\xb1\xf7\x7f\x26\x81\xbd\x33\xc0\xde\x05\xf2\x9e\x45"
+ "\xa3\xb5\x6f\x6f\x9d\x04\xbe\x7b\x2c\x63\xed\xcd\xe2\x5b\x62\xcf"
+ "\x84\x89\xd2\x7b\x26\x88\xdb\xbb\xc7\x18\xfb\xf6\xee\x31\x44\xbe"
+ "\xbd\x7b\xb8\xb2\xf6\x06\x7c\xf7\x18\xc1\xd9\xbb\x87\x83\xfb\x0a"
+ "\xf0\xed\xad\xa9\x25\xf6\xfe\x29\x82\xf6\xd1\x01\xbe\x75\x72\x9f"
+ "\x25\xa3\x19\x7b\x4b\xe0\xbb\x67\x2d\xb1\x37\xbb\x5f\x83\xb7\xc4"
+ "\x7e\x0d\x13\xa5\xf7\x6b\x10\xb7\x77\xcf\x43\xf6\xed\xdd\x73\xbb"
+ "\x7c\x7b\xf7\x4c\x22\xf6\xd6\x01\xbe\x7b\xee\xe7\xec\xfd\xe7\x20"
+ "\xf9\xf6\xee\x19\x4d\xec\x5d\x39\x0c\xec\x0d\xf8\xd6\xc9\xc4\xf7"
+ "\x9f\x91\x7d\x7b\x87\x49\xe0\xdb\x37\x9a\xb5\x37\x8b\x6f\x89\xbd"
+ "\x22\x26\x4a\xef\x15\x21\x6e\x6f\xdf\x81\xf6\xed\xed\xdb\x43\xbe"
+ "\xbd\xff\x5c\xc5\xda\x1b\xf0\xed\xeb\xcf\xd9\xdb\x77\x8b\x7c\x7b"
+ "\xff\xf9\x04\xb1\xf7\xa9\x60\xda\x27\x0c\xf0\x1d\x26\xf3\x59\x7c"
+ "\x13\x9b\xb1\xb7\x04\xbe\x7b\x9d\x20\xf6\x66\xf7\xa9\xf0\x96\xd8"
+ "\xa7\x62\xa2\xf4\x3e\x15\xe2\xf6\xee\xb5\xd9\xbe\xbd\x7b\xad\x92"
+ "\x6f\xef\x5e\xe3\x88\xbd\xc3\x00\xdf\xbd\x72\x39\x7b\x3f\xe4\x2d"
+ "\xdf\xde\xbd\x86\x11\x7b\xff\x1c\x00\xf6\x06\x7c\x87\xc9\xc4\x77"
+ "\x2f\xbd\x94\xbd\xbd\xc0\xde\xc5\xc0\x63\x60\x1c\xc4\xfb\x2c\xa8"
+ "\xc3\x4d\x42\xbb\x97\x27\x07\xa3\xfe\xb7\xb1\xed\x1f\x2e\x82\xb1"
+ "\x43\xd3\x66\xfb\x65\xa8\x1e\xde\xee\xf4\xda\x61\xd5\xc3\x73\x25"
+ "\xd7\x0e\xab\x1e\x9e\x2c\x7b\xed\xb0\xea\x61\x7f\x8e\x03\x3d\x1c"
+ "\xc7\xf9\x54\xcb\xc4\x0f\x59\x6b\x8a\x55\x0f\x6b\x44\xf7\xd1\x50"
+ "\x3d\x54\x82\xd7\x14\xd3\xab\xff\xab\x35\x67\x2b\xe1\x46\x0f\x97"
+ "\x3a\xe0\xeb\x5c\xf0\x43\x86\xb4\xaf\x7b\xef\x00\x5f\xe7\xb6\xd9"
+ "\xbe\x1d\xaa\xde\xd9\xce\xfb\xba\xf7\x54\x69\x5f\xf7\x7e\x59\xbe"
+ "\xaf\x7b\x7b\x73\xfc\xab\x77\x24\xe7\xeb\xde\xf2\xd7\x8f\xab\x7a"
+ "\xbb\x8a\xee\xe7\xa1\xd2\xee\x25\xbe\x3e\xbd\x0c\x7c\xad\x80\x97"
+ "\xf5\xde\xdf\xbc\xaf\x75\x78\xdf\x09\x3b\xfd\xfa\xd1\x5c\x18\x33"
+ "\x35\x6d\xb6\x7f\x88\xea\xd1\x25\xce\xfb\xfa\xd1\x51\xd2\xbe\x7e"
+ "\x74\xb0\x7c\x5f\x3f\x8a\x38\xee\xf7\xe8\x30\xce\xd7\x8f\x56\xca"
+ "\xf7\xf5\x23\x06\xd1\x7d\x45\x54\x8f\x14\x10\x5f\x9f\xa9\x36\x67"
+ "\x2b\xe1\x84\x8f\x6e\x71\xc0\xd7\xd0\xaf\x75\x76\xfa\x75\x9f\x65"
+ "\xe0\xeb\xdc\x36\xdb\xc7\x44\xd5\x27\xde\x79\x5f\xf7\x19\x22\xed"
+ "\xeb\x3e\xbd\xe5\xfb\xda\xaf\x86\xe3\x9d\x7d\x02\x39\x5f\xf7\x39"
+ "\x2c\xdf\xd7\x7e\xa7\x45\xf7\x37\x51\xf9\xad\x21\xbe\x3e\x3b\x12"
+ "\x7c\xad\x80\x8f\xf6\x91\xe4\xff\x9c\xaf\xc3\xf0\x3e\x1c\x76\xfa"
+ "\xf5\xe3\x89\xc0\x15\x34\x6d\xb6\x9f\x8a\xea\xf1\x37\x9c\xf7\xf5"
+ "\xe3\x7d\xa4\x7d\xfd\xb8\xa7\x7c\x5f\x3f\x56\xc9\x71\xde\xc7\x7d"
+ "\x39\x5f\x3f\x5e\x28\xdf\xd7\x8f\x95\x88\xee\xb3\xa2\x7a\x2c\x99"
+ "\xf8\x5a\x5f\x68\xce\x56\xc2\x85\x1f\x5f\xe4\x80\xaf\xa1\x5f\x87"
+ "\xd9\xe9\xd7\x7d\x41\xd7\x87\xe5\xb6\xd9\xbe\x2e\xaa\xbe\xc3\x9d"
+ "\xf7\x75\xdf\xae\xd2\xbe\xf6\x6f\x90\xef\x6b\xff\xc3\x1c\xdf\xee"
+ "\xeb\xce\xf9\xba\x6f\x9e\x7c\x5f\xfb\xef\x15\xdd\xef\x45\xe5\x1f"
+ "\x4d\x7c\x7d\xde\x1b\x7c\xad\x80\x87\xf7\x8d\x51\xc2\xc3\xe7\x6c"
+ "\x44\xee\x42\x7f\x3f\x39\xb2\x6d\xb9\xf8\x93\x83\x9d\xf7\xf7\x93"
+ "\x2e\xd2\xfe\x7e\xe2\x92\x7c\x7f\x3f\xb1\x97\xe3\xe2\x4f\xd4\x73"
+ "\xfe\x7e\x72\x8d\x7c\x7f\x3f\xb1\x45\x9c\x8b\x3f\x31\xce\x39\x2e"
+ "\xfe\x64\xa4\x12\x2e\x6e\xeb\xef\x7e\x21\x6d\xcb\xc7\xfb\xf5\x71"
+ "\xde\xdf\x01\xd7\xa5\xfd\x1d\x70\x4a\xbe\xbf\x03\xb6\x70\x7c\x3c"
+ "\xa0\x9a\xf3\x77\xbf\x45\xf2\xfd\x1d\x90\x25\xce\xc7\x03\x86\x39"
+ "\xc7\xc7\xfb\x8d\x50\xc2\xc7\x6d\xfd\x3d\x20\xa0\x6d\x39\xf9\x00"
+ "\x1f\xe7\xfd\xdd\xff\x9c\xb4\xbf\xfb\x1f\x91\xef\xef\xfe\x59\x1c"
+ "\x27\xef\xcf\xcb\x7f\x0f\x88\x93\xef\xef\xfe\xcb\xc4\x39\x79\xff"
+ "\x20\xe7\x38\xf9\x80\x60\x25\x9c\xdc\xd6\xdf\x03\x7d\xdb\x96\x97"
+ "\x0f\x74\x73\xde\xdf\x81\xc7\xa5\xfd\x1d\x78\x40\xbe\xbf\x03\x97"
+ "\x71\xbc\x3c\xb0\x84\xf3\xf7\x40\xf9\xfb\x67\xaa\x02\x93\xc4\x79"
+ "\x79\xa0\x9f\x73\xbc\x7c\xa0\xbf\x12\x5e\x6e\xeb\xef\xa7\x3c\xda"
+ "\x96\x9b\x0f\xba\xe5\xbc\xbf\x07\x1d\x92\xf6\xf7\xa0\xed\xf2\xfd"
+ "\x3d\x28\x89\xe3\xe6\x83\x78\xf9\xff\xa7\x46\xca\xf7\xf7\xa0\x68"
+ "\x71\x6e\x3e\xc8\xdb\x39\x6e\xfe\x94\x46\x09\x37\xb7\xf5\x77\x90"
+ "\xb1\x6d\xf9\x79\xd0\x05\xe7\xfd\x1d\xb4\x47\xda\xdf\x41\x1b\xe4"
+ "\xfb\x3b\x28\x9a\xe3\xe7\x41\xdb\x38\x7f\x0f\x0e\x91\xef\xef\xa0"
+ "\x71\xe2\xfc\x3c\xc8\xd5\x39\x7e\x3e\xd8\xdd\xf9\x3c\xf9\x5f\x2a"
+ "\x31\x37\x97\xbb\xff\x63\x79\x12\xbb\xe6\x4e\x35\x98\xdb\xff\x51"
+ "\xf5\x17\xe6\xdb\x2a\xa2\x7b\xcb\xa8\xfe\xd2\xa7\x5d\xef\xff\xa8"
+ "\x7a\xda\xfe\xfe\x8f\xaa\xa7\xe5\xed\xff\xa8\xfa\x8b\xa7\xfc\xf9"
+ "\xf8\x4f\x57\x72\x1a\xe1\x2f\x3c\xfd\x1f\xcc\xf4\xeb\x76\xbd\x2f"
+ "\xa4\xea\x69\xe1\xbe\x90\xaa\xc1\xcc\xbe\x90\xf4\xea\x5f\x93\x95"
+ "\x69\x91\xbf\x54\x39\xff\x5e\xe0\x99\xbd\x58\x87\xc8\xdd\x87\x92"
+ "\xc3\x76\xf0\x1e\x0e\xdb\xcf\x6c\x95\xc6\xf6\x33\x2e\xed\x7a\x1f"
+ "\x4a\xd5\x90\xe5\xf6\xb1\x3d\x24\x5a\xd6\x9e\x23\xaa\x21\xf2\xf7"
+ "\xbd\x51\x0d\xd9\xcb\xe9\xa1\x21\x3c\xfd\xfb\x4c\x6d\x1b\x62\x5b"
+ "\xd9\x7e\x4a\xaa\x21\xb9\x42\x6c\x07\x6f\x23\xd8\xbe\x50\xaa\x4c"
+ "\x77\x3d\x53\xe4\xfc\x7b\x90\xe7\x32\xb0\xe6\x92\xbb\x1f\x26\x87"
+ "\xed\x67\xd7\x72\xd8\x7e\x6e\x89\x34\xb6\x43\xce\xb4\xeb\xfd\x30"
+ "\x55\x21\x53\xed\x63\x3b\x44\x27\x6b\x2f\x13\x55\x48\xb1\x7c\x6c"
+ "\x87\x64\x70\xda\x2f\xe4\x04\x87\xed\xe7\x2a\xda\x0e\xdb\x0a\xf7"
+ "\xc9\x54\x85\x24\x09\xb1\xfd\xec\x32\x82\xed\x6a\xad\x32\x8d\xf9"
+ "\x5c\x9e\xf3\xef\x7d\x74\x71\x58\x5f\xca\xdd\x97\x93\xc3\xf6\xf3"
+ "\xb1\x1c\xb6\x75\x36\xfb\x42\x71\xd8\x0e\x3d\xd0\xae\xf7\xe5\x54"
+ "\x85\x3e\x67\x1f\xdb\xa1\xbe\xb2\xf6\x48\x51\x85\x6e\x96\x8f\xed"
+ "\xd0\x38\x4e\xe7\x86\x16\x72\xd8\xd6\xed\x68\x43\x6c\x2b\x8c\xdb"
+ "\xa1\x11\x42\x6c\x3f\x1f\x45\xb0\x7d\x39\x49\x99\x9e\xd6\x25\x3b"
+ "\xff\x9e\xeb\x85\x11\x58\x4b\xcb\xdd\x1f\x94\xc3\x76\xd8\x70\x0e"
+ "\xdb\x2f\x0c\x91\xc6\xf6\xd0\xec\x76\xbd\x3f\xa8\x6a\xa8\xfd\xfd"
+ "\x7f\x54\x61\x76\xf6\xff\x11\x5b\x2b\x3c\x54\xfe\xbe\x17\xaa\xa1"
+ "\x23\x38\x4d\x3f\x74\x0d\x87\xed\x17\x56\xb6\x1d\xb6\x15\xee\x1b"
+ "\xaa\x1a\x1a\x20\xc4\x76\x58\x08\xc1\x76\x4d\x89\xb2\xdc\xc1\x0b"
+ "\xe3\x9c\x7f\xaf\xf7\xa2\x1f\xce\x1b\xc8\xdd\xa7\x94\xc3\xf6\xb0"
+ "\xde\x1c\xb6\x5f\xf4\x91\xc6\xf6\xf0\x59\xed\x7a\x9f\x52\xd5\xb0"
+ "\x5b\xf6\xb1\x3d\xec\x84\xbc\x3d\x5d\x86\x2b\x58\x07\x3f\xdc\x8f"
+ "\xcb\x5f\x0c\xe7\xcd\x7f\x7f\x31\xba\x0d\xb1\xad\x30\x6e\x0f\x77"
+ "\x17\x62\x7b\x98\x86\x60\xfb\x9a\xaf\xb2\x3c\xc9\x8b\x81\xce\xe7"
+ "\x49\x5e\x0e\x64\xde\x61\xca\xdc\x2f\x95\xc3\xf6\x8b\x26\x6e\x6f"
+ "\xa2\x97\x7b\x5b\x63\xfb\xce\xde\x44\xaa\x11\x43\xda\xcd\x7e\xa9"
+ "\xaa\x97\xbe\xb1\x8f\xe3\x97\xf2\xe4\xe5\x44\x46\xf4\x96\x8f\xe3"
+ "\x97\x6a\xb8\x9c\xc8\x08\xde\xfc\x97\x97\x2d\xdf\x24\x6f\x83\x3d"
+ "\x8b\x46\x14\xdb\xdd\xb3\x48\x35\x62\x4b\xab\xed\xa3\xaa\x7a\xa9"
+ "\x42\xb0\x67\x91\xea\xc5\x5a\x33\xd3\x17\xae\x27\x2a\xcb\xab\xbc"
+ "\x1c\xe2\x7c\x5e\x65\x24\x79\xbf\x2b\x73\xdf\x56\xae\x2f\xbc\xd2"
+ "\x89\xeb\x0b\x23\xfb\x49\xf7\x85\x57\x87\xb7\x9b\x7d\x5b\x55\xaf"
+ "\x1c\xb1\xdf\x17\x5e\xd9\x26\x2f\x87\xf2\xaa\x82\x7d\x60\x5e\xa9"
+ "\xe7\x72\x28\xaf\x86\x70\x7d\x61\xe4\xa2\xb6\xeb\x0b\xaf\x1e\xb7"
+ "\xdf\x17\x5e\x2d\x6c\xb5\xfd\x5c\x55\xaf\x9c\x16\xf6\x85\x57\x10"
+ "\xe9\x0b\x37\x6b\x95\xe5\x61\x46\x2a\x7a\xff\x2d\xec\x0b\xe1\x23"
+ "\x98\x77\xdf\x32\xf7\x8f\xe5\xfa\xc2\x28\x1f\xae\x2f\x84\xdb\xf0"
+ "\x79\xae\x2f\x8c\x1e\xd3\x6e\xf6\x8f\x55\x8d\x3a\x69\xbf\x2f\x8c"
+ "\xda\x2b\x2f\xe7\x32\x7a\x88\xfc\xbe\x30\x9a\xb7\xfe\x69\x34\x6f"
+ "\xfd\x53\xf8\xca\xb6\xeb\x0b\xa3\xcf\xd8\xef\x0b\xa3\x0f\xb6\xda"
+ "\xbe\xb2\xaa\x51\xd5\xc2\xbe\x30\xca\x83\xf4\x85\xdb\xc9\xca\xf2"
+ "\x36\xe1\x0e\xf0\xff\xe6\xf2\x36\xf0\x2c\x3e\xcc\xbb\x7e\x59\xfb"
+ "\xd8\x72\x7d\x21\xa2\x37\xd7\x17\xc6\x0e\x97\xee\x0b\x63\x26\xb7"
+ "\x9b\x7d\x6c\x55\x11\xe7\xec\xf7\x85\x88\x22\x79\x39\x9a\x31\xc3"
+ "\xe5\xf7\x85\x31\x6a\x2e\x47\x33\x66\x1c\xd7\x17\xc6\x66\xb5\x5d"
+ "\x5f\x18\x73\xc9\x7e\x5f\x18\x53\xd2\x6a\xfb\xdb\xaa\x22\x6a\x85"
+ "\x7d\x21\x42\x43\xfa\x42\xbd\x51\x59\x9e\x67\x6c\x94\xf3\x79\x9e"
+ "\xf1\x51\xcc\x9c\x09\x99\xfb\xe9\x72\x7d\xe1\xb5\x7e\x5c\x5f\x18"
+ "\x3f\x46\xba\x2f\x8c\x8b\x6d\x37\xfb\xe9\xaa\x5e\xbb\x62\xbf\x2f"
+ "\xbc\x56\x2a\x2f\xa7\x33\x6e\x8c\xfc\xbe\x30\xce\x97\xcb\xe9\x8c"
+ "\x8b\xe2\xfa\xc2\xf8\x82\xb6\xeb\x0b\xe3\x6e\xd9\xef\x0b\xe3\x4e"
+ "\xb4\xda\x3e\xbb\xaa\x71\x48\xd8\x17\x5e\xf3\x23\x7d\xa1\x29\x4d"
+ "\x59\x5e\x68\x7c\x9c\xf3\x79\xa1\xc8\x38\x66\x3e\x89\xcc\x7d\x7d"
+ "\xb9\xbe\xf0\xfa\x10\xae\x2f\x44\x4a\x7f\xe7\x41\x35\x61\x6e\xbb"
+ "\xd9\xd7\x57\xf5\xba\xfd\xef\x1f\xa9\x5e\xb7\xf7\xfd\x23\x91\x1c"
+ "\xd0\x84\xc9\xf2\xfb\xc2\x04\x7f\x2e\x07\x34\x81\xb7\xfe\x2f\x72"
+ "\x47\xdb\xf5\x85\x48\xfb\xdf\x7f\x50\x4d\x70\xe0\xfb\x0f\x0a\xf7"
+ "\xfb\x55\x4d\xf0\x10\xf6\x85\xd7\x03\x49\x5f\x30\xbb\x2a\xcb\x23"
+ "\x45\x36\x9b\xff\xc7\x3a\xbf\xc9\xdb\x36\x8f\x54\x5a\x15\x8c\x9e"
+ "\x9c\x88\xfb\xc2\x44\xad\x31\x3b\x54\x83\xf7\x17\x36\xf9\xb1\x7b"
+ "\x50\x2e\x61\xf7\x78\xa9\x35\x92\x3d\x28\x0d\xa6\x3b\x7b\x50\x92"
+ "\xbd\x3f\x10\x85\xd7\x02\xe3\x35\xc1\x46\x35\xd9\x7f\x92\xc6\x73"
+ "\xa2\xf0\x1c\xa9\xf3\x25\xcc\xfe\x2a\x8b\x8c\xd0\xf6\x8b\xcd\xec"
+ "\x3f\x19\xa5\x47\xa5\x51\x0b\x91\xb1\xeb\xbe\x34\xb2\x4e\xf8\x8d"
+ "\x42\x66\xff\xc9\x29\x9a\x9e\xe9\xbf\x20\x6f\x2f\xbc\xff\x64\x14"
+ "\x6d\x4e\xd5\xd3\x86\x32\x50\x9a\xa5\x51\x60\xdf\xa9\x96\x3d\x28"
+ "\x27\xf6\xc0\x6d\x37\x4e\xf1\xef\x99\xff\x8b\xd4\xfe\xc2\x13\x15"
+ "\xec\x03\xfb\x46\x29\x97\xdf\x99\xa8\xe6\x30\x3a\x91\x19\x83\xe1"
+ "\xfc\xb6\xd2\x48\x88\x31\xe9\x68\x65\x93\xa2\xbd\x37\x26\x06\x38"
+ "\xe0\x33\x3c\x47\xc4\x26\x7e\x71\x3e\x7b\xf3\x04\xf8\x2c\x17\xef"
+ "\x73\xec\xb8\xcf\xdc\x6e\xb4\x8e\xcf\xde\x8c\x76\xdc\x67\x6f\x1e"
+ "\xb3\xf2\x99\x48\x1e\xe2\xcd\x7d\xf2\x7d\xf6\x66\x1a\x97\x87\x78"
+ "\xf3\x30\xe7\xb3\x49\xde\xc4\x67\x6f\x4e\x22\x3e\x73\xd9\xdb\xa4"
+ "\x68\xff\x8e\x37\xf5\xcd\xfb\x8c\x99\xfb\x60\xa7\x9f\x4d\x5e\x69"
+ "\xcc\x06\xed\x0e\xba\xdc\x71\x9f\x3d\x70\xbe\x75\x7c\x36\x59\xe3"
+ "\xb8\xcf\x26\x2f\x11\xfa\x4c\x4c\x2f\x4f\x96\xff\xcd\x4e\xd5\xe4"
+ "\x20\x4e\x2f\x4f\x4e\xe6\x7c\x36\xb9\x84\xf8\x6c\xb2\x9a\xf8\x8c"
+ "\xd2\x37\x29\xda\x03\x64\x72\x96\x03\x3e\xc3\xef\xf4\xed\xf4\xb3"
+ "\x29\x21\xe0\xb3\x5c\xbc\xef\xb3\xe3\x3e\xeb\xfa\x63\xeb\xf8\xec"
+ "\xad\x52\xc7\x7d\x36\x65\xb0\x95\xcf\x44\x74\xdd\x94\x5e\xf2\x7d"
+ "\xf6\x56\x35\xa7\xeb\xa6\x04\x70\x3e\x9b\xb2\x88\xf8\xec\xad\xc3"
+ "\xc4\x67\xae\x1e\x4d\x8a\xf6\x11\x99\xd2\x6c\xfe\x0b\xf3\xd0\x26"
+ "\x6f\x5b\x9d\xc3\xf9\x2c\xca\x60\xcc\x06\x2d\x04\x3a\xc7\x71\x9f"
+ "\x3d\xbd\xba\x75\x7c\x16\x95\xe6\xb8\xcf\xa2\x2e\x09\x7d\x26\xa6"
+ "\x3f\xa2\x8e\xcb\xf7\x59\x54\x1e\xa7\x3f\xa2\xf4\x9c\xcf\xa6\x06"
+ "\x12\x9f\x45\x25\x13\x9f\xb9\x05\x37\x29\xda\x8b\x24\xca\xe8\x80"
+ "\xcf\xf0\x3b\x58\x3b\xfd\x6c\xda\x16\xf0\x59\x2e\xde\x07\xdb\x71"
+ "\x9f\xbd\x39\xb4\x75\x7c\x36\x2d\xc8\x71\x9f\x4d\xdb\x68\xe5\x33"
+ "\x11\x9e\x3c\x4d\xc1\x3e\xd8\xd3\x22\x38\x9e\x3c\x2d\x8b\xf3\xd9"
+ "\xb4\x2a\xe2\xb3\x69\x01\xc4\x67\x1d\xa2\x9b\x14\xed\x67\x32\x4d"
+ "\x72\xff\x2f\x7b\xbc\xd1\x32\x2f\x9f\xf3\x5b\xf4\xa4\xf6\xc3\x1d"
+ "\xdf\xae\x71\xdc\x6f\xd1\xe3\x9b\xe7\x8e\xd1\xcf\xc9\xf7\x5b\xb4"
+ "\x3b\xc7\x1d\xa3\x47\x72\x7e\x8b\xce\x23\x7e\x7b\xbb\xca\x39\xee"
+ "\x18\xdd\xec\xfa\x57\x31\xee\x68\xeb\xb7\x19\xde\xed\x87\x3f\x4e"
+ "\xdf\xe2\xb8\xdf\x66\x78\x36\xcf\x1f\xa7\xdf\x92\xef\xb7\xe9\x45"
+ "\x1c\x7f\x9c\xe1\xca\xf9\x6d\xc6\x38\xe2\xb7\xe9\x79\xce\xf1\xc7"
+ "\x19\x5a\x25\xfc\xd1\xd6\x6f\xef\x94\xb6\x1f\x0e\xf9\xce\x24\xc7"
+ "\xfd\xf6\x4e\x71\xf3\x1c\xf2\x9d\x9d\xf2\xfd\xf6\x4e\x32\xc7\x21"
+ "\xdf\x39\xc8\xf9\x2d\xc6\x83\xf8\xed\x9d\x71\xce\x71\xc8\x77\x2a"
+ "\x95\x70\x48\x5b\xbf\xc5\x2e\x6b\x3f\x3c\x32\xd6\xdb\x71\xbf\xc5"
+ "\x2e\x6e\x9e\x47\xc6\xca\xff\x66\xb1\x2a\x36\x90\xe3\x91\xb1\x49"
+ "\x9c\xdf\x62\xd9\x6f\xb0\xc4\x7a\x38\xc7\x23\x63\x9b\xdd\xff\x43"
+ "\x8c\x47\xda\xfa\xed\xbd\x90\xf6\xc3\x25\xdf\x95\xc1\xff\xdf\xb3"
+ "\xe2\xff\x62\x5c\xf2\x3d\x05\xfc\xff\x5d\x0b\xff\x87\xfe\xf6\x1e"
+ "\x8f\xff\xbf\xc7\xf2\xff\x77\x0f\x3b\xc7\x25\xdf\x73\x84\xff\xdb"
+ "\x70\x49\x5b\xbf\xc5\xd5\xb6\x1f\x3e\x19\xb7\xcc\x71\xbf\xc5\x5d"
+ "\x69\x9e\x4f\xc6\x29\xf8\x0e\x54\x5c\x01\xc7\x27\xe3\xaa\x38\xbf"
+ "\xc5\x07\x11\xbf\xc5\x2d\x72\x8e\x4f\xe2\x4f\xdb\xd9\xf7\x9b\xc9"
+ "\x3b\x54\x43\x8b\xe4\x21\x8f\xc5\x04\xb3\x7b\x13\xce\x3c\x6c\xf2"
+ "\x09\xd5\xc8\xfd\xbe\x8b\x65\xcf\xe9\x23\xc0\x8c\xce\xab\x66\x4e"
+ "\x76\x6e\xdf\xe9\x99\x9e\xce\xef\x3b\x9d\x70\xaa\xe5\xbe\xef\x92"
+ "\x70\x48\xfe\xbe\xd3\x09\x6b\x38\x0e\x9a\x50\xc1\xf9\x3a\x91\x99"
+ "\x9f\x20\x6f\x3f\xea\x84\x08\xe7\xf6\xa3\x9e\x39\x9e\xe0\x2b\x41"
+ "\x4d\xf6\xa3\x9e\x39\xb2\x6d\xbe\xfb\x12\x7f\x10\xef\x47\x4d\xa7"
+ "\x77\xcc\x50\xb6\x3f\xf2\xcc\x0a\x07\xf0\x9c\x4b\x8b\xe4\x68\x39"
+ "\x3c\xcf\xce\x02\x3c\xe7\xca\xfd\xce\x8c\x10\xcf\xb3\xfb\x39\x87"
+ "\xe7\x59\x67\x9c\xc7\xf3\xac\xed\x2d\xf7\x9d\x99\x59\x99\xf2\xf1"
+ "\x3c\x6b\x12\xc7\xcd\x67\x15\x70\x78\x9e\x7d\x42\x3e\x9e\x67\x69"
+ "\x9d\xc3\xf3\xec\x3e\x04\xcf\x89\x7a\x82\xe7\xd9\xbe\x6d\xf3\xfd"
+ "\x99\xc4\x35\x04\xcf\x9d\x2a\x95\xed\x3f\x3d\xbb\xa0\x79\x3c\xeb"
+ "\x34\xb4\x48\xfe\x9a\xc3\xf3\xdc\x68\x93\x8f\x4e\x23\xf7\x7b\x37"
+ "\x42\x3c\x27\x99\x9c\xc3\x73\xd2\x4e\xe7\xf1\x9c\xb4\xa0\xe5\xbe"
+ "\x77\x93\x34\x55\x3e\x9e\x93\x02\x38\xcd\x92\x94\xc8\xe1\x79\xee"
+ "\x16\xf9\x78\x9e\x63\x70\x0e\xcf\x49\xb7\x08\x9e\xe7\x14\x12\x3c"
+ "\x27\xd5\xb4\xcd\x77\x70\xe6\x4c\x22\x78\xf6\xd0\x2a\xdb\xdf\x7b"
+ "\xae\xe4\xfe\xc7\x3c\x3c\xe7\xd2\x22\xb9\x7d\x0e\xcf\xc9\x41\x80"
+ "\xe7\x5c\xb9\xdf\xdd\x11\xe2\x79\xbe\x93\xdf\xb9\x98\xdf\x02\xdf"
+ "\xb9\x98\xef\xc4\x77\x2e\xac\xbf\xbb\x33\x7f\xa0\x7c\x3c\xcf\x33"
+ "\x72\x5a\x6e\xbe\x8e\xc3\x73\x72\x92\x7c\x3c\xcf\x2b\x72\x0e\xcf"
+ "\xf3\xd9\xef\x5f\xcc\x4b\x23\x78\x9e\x7f\xb0\x6d\xbe\xc7\x33\x2f"
+ "\x80\xe0\xb9\x4b\x8c\xb2\xfd\xd3\x93\x75\xcd\xe3\x39\x4c\x43\x8b"
+ "\xbc\xf7\xe0\xf0\xfc\xbe\xab\xc9\x27\x4c\x23\xf7\xfb\x3f\x42\x3c"
+ "\x2f\xdc\xe8\x1c\x9e\x17\x8e\x72\x1e\xcf\x0b\x7b\xb4\xdc\xf7\x7f"
+ "\x16\xba\xc8\xc7\xf3\x82\x52\x4e\xe3\x2e\xe4\xbd\xff\x7f\x7f\x98"
+ "\x7c\x3c\x2f\x70\xf2\xbb\x40\x0b\xb3\x09\x9e\x17\xb0\xdf\x05\x5a"
+ "\xb8\xa6\x6d\xbe\x0b\x94\x6c\x24\x78\x56\x17\x2a\xdb\x9f\xfe\x7d"
+ "\xb5\x03\x78\xce\xa5\x45\xde\x09\x71\x78\x5e\x7c\x02\xf0\x9c\x2b"
+ "\xf7\x3b\x44\x42\x3c\x2f\x8e\x77\x0e\xcf\x8b\x7b\x39\x8f\xe7\x45"
+ "\x97\x5a\xee\x3b\x44\x8b\x8e\xcb\xc7\xf3\xa2\x3c\x4e\xfb\x2f\xe2"
+ "\xbd\xff\x4b\x51\xf0\x7d\xa2\x45\x51\xce\xe1\x79\xf1\x74\x82\xe7"
+ "\x45\x5a\x82\xe7\xc5\x93\xda\xe6\xfb\x44\xef\x97\x12\x3c\x77\xab"
+ "\x57\xb6\xff\xff\xe2\x66\xe7\x7f\x88\xe5\x37\x2c\x79\x29\x0e\xd3"
+ "\x69\xdb\x9c\xcf\x71\xa4\x85\x39\x87\xe9\xd4\xeb\xce\x63\x3a\xf5"
+ "\x9b\x96\xcb\x71\xa4\x2a\xf8\xd6\x5f\x6a\x22\x97\xe3\x48\xdd\xcb"
+ "\x61\x3a\xad\x5a\x3e\xa6\x53\x83\x9c\xc3\x74\xda\x10\x82\xe9\x94"
+ "\x5a\x82\xe9\xb4\xc0\xb6\xc9\x71\xa4\x14\x38\x97\xe3\x48\xdb\xab"
+ "\x24\xc7\x61\x8b\xe9\x0f\x16\x39\x9f\xe7\xf8\xc0\xc7\x39\x4c\x2f"
+ "\x2d\x76\x1e\xd3\x4b\x33\x5b\x2e\xcf\xb1\x74\x81\x7c\x4c\x2f\x1d"
+ "\xc6\xe5\x39\x96\xae\xe4\x30\xfd\xc1\x41\xf9\x98\x5e\xea\xee\x1c"
+ "\xa6\x3f\xf0\x24\x98\x5e\x52\x42\x30\xfd\x81\x6b\xdb\xe4\x39\x96"
+ "\x24\x39\x97\xe7\xf8\x60\xa5\x92\x3c\x87\x2d\xa6\x57\x44\x38\x9f"
+ "\xeb\x58\x7e\xc9\x39\x4c\x2f\xdf\xe0\x3c\xa6\x97\x4f\x6f\xb9\x5c"
+ "\xc7\xf2\x51\xf2\x31\xbd\x5c\xc3\xe5\x3a\x96\x4f\xe2\x30\xbd\x22"
+ "\x43\x3e\xa6\x97\x9d\x76\x0e\xd3\xcb\xcf\x11\x4c\x2f\xcb\x23\x98"
+ "\x5e\x5e\xd9\x36\xb9\x8e\x65\x23\x9c\xcb\x75\xac\x98\xa4\x24\xd7"
+ "\x61\x8b\xe9\x55\x7e\xce\xe7\x3b\x56\x7e\xe3\x1c\xa6\x57\xc6\x3b"
+ "\x8f\xe9\x95\x43\x5a\x2e\xdf\xb1\xb2\xb7\x7c\x4c\xff\x0f\xef\xfb"
+ "\x17\x2b\x79\xeb\xff\x57\x45\xcb\xc7\xf4\xff\x14\x3a\x87\xe9\x95"
+ "\xfb\x08\xa6\xff\x27\x91\x60\x7a\xe5\x8e\xb6\xc9\x77\xfc\x8f\xaf"
+ "\x73\xf9\x8e\x55\xcd\xee\x7f\x21\x96\xef\xb0\xc5\xf4\x87\xf5\xce"
+ "\xe7\x3c\x3e\xcc\x74\x0e\xd3\x1f\x86\x39\x8f\xe9\x0f\x3d\x5b\x2e"
+ "\xe7\xb1\xfa\x96\x7c\x4c\xaf\x2e\xe2\x72\x1e\x1f\xf2\xe6\x3f\xad"
+ "\x09\x96\x8f\xe9\xd5\xcb\x9c\xc3\xf4\x87\xab\x08\xa6\x57\x0f\x23"
+ "\x98\xfe\x30\xad\x6d\x72\x1e\xab\x0c\xce\xe5\x3c\xd6\xb8\x2a\xc9"
+ "\x79\xd8\x62\x3a\xbd\xd4\xf9\xbc\x47\xfa\x74\xe7\x30\x9d\xee\xe3"
+ "\x3c\xa6\xd7\x9e\x6b\xb9\xbc\xc7\xda\x23\xf2\x31\xbd\x36\x8b\xcb"
+ "\x7b\xac\xe5\xed\x7f\xbf\xce\x43\x3e\xa6\xd7\x46\x3a\x87\xe9\xf4"
+ "\xc9\x04\xd3\x6b\x35\x04\xd3\xe9\xe3\xda\x26\xef\xb1\xe6\xb0\x73"
+ "\x79\x8f\x74\x9b\xf9\x6f\x73\xa6\x27\x44\x6b\x67\xce\x98\x31\x67"
+ "\x7a\x92\x76\x4e\x5c\xec\xdb\xd3\x9f\xeb\x63\xf9\xff\x73\x81\xc9"
+ "\x7d\x92\x3b\xa3\xe8\xf8\xa9\x53\xe6\x0d\xe2\x4e\xc6\x4d\x4f\x80"
+ "\x7f\x3a\xa3\x98\xa9\x73\x62\xb4\x49\x0b\x12\xa7\x6b\xf1\xff\xe2"
+ "\xdf\x4e\x84\x22\x33\x93\xb8\x23\x63\xa7\xc7\x4d\x4d\x8e\x4d\x78"
+ "\x47\x3b\x35\x2e\xf6\x9d\x84\xf8\xe9\x09\x49\xda\xd9\xd3\x67\xcd"
+ "\x8d\x9d\x3d\x1d\xff\x3d\x47\x3b\x63\xe6\x6c\x38\xf0\xf6\xf4\xd8"
+ "\x79\xd3\xb5\xd3\xe6\xce\x98\x31\x7d\xf6\x9c\xce\x68\xd4\xdc\xb8"
+ "\xa4\xd8\xc4\xb8\xe9\xda\x61\xa3\xc2\xfa\x8d\x1b\xfe\xda\xb8\xd0"
+ "\xd0\xce\x88\xf7\xed\x69\x2d\x9d\x35\x4d\x0b\x18\x72\xbd\xa8\xfa"
+ "\xc4\xb3\x0c\xd8\xe8\x5a\xc0\xe6\xba\xd9\x48\xbd\x7a\x36\x72\x5d"
+ "\x75\x03\xb9\xaf\xbd\x81\x3c\xcc\x39\x6e\xb9\xda\x77\x91\x8e\xee"
+ "\x3a\x2f\x71\xdd\x0d\xe4\x6d\xce\xfc\xd2\x40\x67\xee\x2a\x34\x74"
+ "\xfd\x6b\x01\x2e\x4b\x77\xcd\xa9\xc0\xc7\xc1\x17\xae\x74\xe6\xbe"
+ "\xa8\xf3\xaa\x8f\x4b\x0d\x5d\x73\xd3\x52\x2f\x21\x8a\xee\x92\x11"
+ "\xbc\xcb\x6c\xa0\x0e\xe1\xb7\x1d\x60\x2b\xa4\xca\x8c\x80\x5f\x08"
+ "\xfc\x6a\xe0\x67\x44\xaa\xf5\x23\xe0\x97\x08\xbf\x64\xf8\x55\x21"
+ "\xd5\x47\xfe\xf0\x8b\x84\x5f\x34\xfc\xe0\xd8\x47\x6b\xe0\x97\x85"
+ "\x54\x59\x70\x3c\x0b\xca\x66\xc1\xb9\xac\x44\x52\x4f\x16\x9c\xcf"
+ "\xaa\x47\xaa\x6c\x2d\xfc\x82\xe1\x07\x75\xe6\x78\xc0\x2f\x17\x7e"
+ "\x7e\xf0\x0b\x84\x1f\x1c\xcf\x19\x07\x3f\x5c\x76\x11\x39\xf7\xd7"
+ "\x61\xf0\x4b\x83\x5f\x01\xfc\x0e\xc2\xcf\x80\x54\xb9\xae\xf0\x53"
+ "\xc3\x4f\x03\x3f\x78\xbe\x5c\x28\x93\x0b\xf7\xca\xc5\xe7\xe0\x1e"
+ "\x1b\x7c\xe1\x97\x04\xbf\x4a\xa4\xfa\x38\x00\x7e\xa5\xec\x0f\x8e"
+ "\x7d\xbc\x8d\xf7\xff\xc3\xbc\xbf\xc5\x7e\x55\x5e\x4b\x1e\xd6\x17"
+ "\x3d\x61\x84\x7e\x9b\xb9\x93\x5e\x8a\x54\x74\x66\x6e\x5a\xe2\x13"
+ "\xc8\xe5\xb2\x2a\x73\x41\xf9\x32\x84\x68\xf5\xae\xc2\xa2\x85\x8d"
+ "\xf8\xfc\x02\x6c\xb3\xba\xf4\xcc\x64\x3d\x4a\xd4\xe0\xfe\x29\x0f"
+ "\x9f\x99\xc9\xec\xf5\xfb\xf5\x2e\x6a\x35\xbe\x9e\x5e\xff\x6c\x24"
+ "\x9d\x1a\xf9\x09\x5e\x87\x0b\xf5\x47\xe0\x75\xba\x74\xc6\x33\x15"
+ "\xb4\x7a\x70\x34\x8e\x31\x45\x0b\x99\xe7\x1a\x43\xfa\x23\x9c\x87"
+ "\x67\x33\xf8\xb8\xe5\x42\xff\x73\xc5\xff\xa7\xc1\xe7\x74\x41\xbc"
+ "\x3b\x89\x3b\xeb\x19\xfd\xd2\xe8\xf3\x7a\x04\x3e\xd7\xb0\x75\x00"
+ "\xc4\x89\xb0\xdc\xa2\x84\x46\x54\xa5\xca\x1c\x05\x6d\xa3\x20\x06"
+ "\x52\xf4\x63\x03\x90\x39\xe7\xf5\x88\x03\x80\x03\x5c\xee\xeb\x94"
+ "\x6a\xfc\xef\x48\x7c\x9e\xce\x9a\xa0\xc1\x79\xa0\xa2\x94\x4f\x21"
+ "\x2e\x67\x8e\x69\xf4\x89\x33\x68\xc7\x7a\xd1\xe7\xc9\xb3\xe1\x72"
+ "\x55\x96\x67\x69\xf4\x71\x2b\xc0\xf5\xd3\xda\xf8\x42\x38\xe7\x6a"
+ "\xce\xfc\x6b\x01\x3c\x87\xcb\x55\xb8\x8e\x86\x67\x2c\x1a\x8b\xef"
+ "\xbb\xfe\x0c\x3c\x2b\x95\x3a\x06\xea\xfe\x34\xbe\x70\xf7\xc2\x7a"
+ "\x0a\x9f\x33\x67\xb9\xe5\x02\xde\x3d\xe8\xf4\x75\x9a\x8f\xbb\x21"
+ "\xd7\x4d\xeb\x11\xca\x5f\x8f\xdc\xeb\xd2\xd7\x9f\xd0\xbb\x6a\xab"
+ "\x48\xec\xcb\x8c\xa0\xa0\x8c\x5e\xb5\xbe\x90\x06\xfc\x32\xf7\xf2"
+ "\x1e\x93\x21\x7d\xaf\x8f\x7a\xdf\xb9\x57\xce\x98\x0c\x7c\x2f\xc6"
+ "\x46\x70\x9e\xd8\x8a\xd4\x61\xde\x32\xa0\x10\xdb\x0f\xdb\xce\x52"
+ "\x87\x39\xfb\xce\xf3\x86\xe1\xeb\xf5\xaa\x8f\xbc\xe9\xbf\x0d\x28"
+ "\x34\xe7\x44\x16\xc2\xb5\x06\x7c\xde\x6b\x09\xaa\xa5\xe1\x5f\x7c"
+ "\x7f\xe2\x0b\xb0\x3d\x95\x86\x70\xfd\x34\x7b\x8c\x86\x63\x70\xed"
+ "\x24\xf3\x52\x2d\xc2\x63\x53\x8d\x2a\x8b\xc9\x4d\xd0\xea\x10\x7f"
+ "\xe2\xe3\x8f\xf6\x2d\xa8\xa0\xcd\xf0\x33\x0d\xa8\x40\x2e\x45\x63"
+ "\xb1\x7f\x3f\x3a\xa1\x1d\xdd\x11\x6c\xfc\xd1\xc9\x3b\xb6\xed\x1d"
+ "\xbf\x0d\xec\xa3\xde\xd4\x0d\xfa\xfb\x8a\xce\xee\x34\xa5\x45\xd8"
+ "\x3f\xd8\x56\x60\x27\x04\xc7\xdd\x31\x4e\xeb\xd2\xb3\x5c\xad\xec"
+ "\xa5\x7e\x65\x4c\x2a\xcd\xab\xfb\x18\x4d\xfc\x16\xc1\x96\x0f\xd2"
+ "\xbb\x74\x66\xc6\x16\xed\x23\x0c\xe6\xc6\xb0\x7e\x65\xb0\x85\xed"
+ "\x47\xfb\x4c\xd3\xe2\xff\x8f\xef\x8b\xd4\x5e\x15\x88\xd2\xa6\xf8"
+ "\xed\x27\x58\x98\xa0\xb1\xe0\x84\x69\x63\xce\x0b\x31\xa6\xa5\x30"
+ "\xd6\xde\xc1\x5f\x56\xa1\x29\x33\x44\x0b\xe5\x2a\x1a\xb2\x23\x32"
+ "\xe8\x8c\x10\x2d\x5e\x7f\x7e\x5e\x95\xb5\x9d\xb1\xc1\x52\x77\x44"
+ "\x9e\x23\xc4\x2f\x25\x8e\x36\xa4\x5c\x87\x7b\x75\x9f\x50\xf1\xf5"
+ "\x3c\x03\xf8\x2b\x22\x03\xe3\xe1\xc0\xed\x7a\x0a\xef\x09\x48\x77"
+ "\x59\xf7\x4c\x3e\xb4\x75\x23\x60\x02\xda\x8a\x70\xbd\xf0\xec\x06"
+ "\xae\xad\x59\x59\x18\x1b\x70\x8f\x60\x72\x6f\xa8\x77\x29\xdc\x23"
+ "\x33\x24\xb8\x2e\x3d\x5b\xa3\x77\xd9\xb7\xcc\x62\x13\xe6\xde\x5c"
+ "\x39\xb6\x2f\x65\x7b\x18\xba\x86\x04\x37\xcd\xa3\x2b\xd6\xfd\x0c"
+ "\xf5\x2f\x45\x74\xe3\x6d\xba\x74\x51\x04\x5d\x9f\xfe\x3a\x9e\xe7"
+ "\x78\x1a\xa5\x4e\x45\xbe\x0f\x2c\xa1\x0d\xe1\x26\xe4\xf5\xc0\x69"
+ "\x2f\xfa\x58\xc4\x69\xe6\xdb\x08\x8b\x2a\xe8\xea\xb2\xc4\x83\x68"
+ "\xd1\x05\xe4\xb1\x38\x16\x79\xa7\x46\x40\x5b\x4a\xe9\xfa\xf2\xe4"
+ "\xd3\xa8\xac\x16\x7e\x89\xc7\xa0\xdc\x49\xf8\x1d\x44\xa9\x0b\x90"
+ "\xeb\x68\x18\xf7\x52\x6e\x21\x8f\xb2\xc4\x5b\x70\xec\x0a\x5a\x14"
+ "\x45\x1b\x8f\x95\xe2\x72\xc5\x28\xdc\x68\xf0\x5a\x7c\x05\x7c\xfa"
+ "\x3a\x5e\xd3\x7d\x06\x6d\x82\x67\x69\xec\xfa\xa5\xbe\x21\x73\x5f"
+ "\xcc\xcd\x79\xb4\x11\xda\x52\xa5\x47\xcf\x16\x09\xda\x82\x9f\xb9"
+ "\x11\xe1\xbd\x9b\x5c\x70\x19\x73\x76\x78\xe2\x14\x23\x8e\x2f\xd9"
+ "\x95\xc0\x3b\x90\xe5\x3c\x3e\x67\xf0\x09\x4f\xd4\xab\x72\x5c\xc3"
+ "\x8d\x74\x1d\xb6\x0f\x6e\x37\xd8\x28\x88\x6d\x7f\x90\x2a\x11\xb9"
+ "\xd6\xa5\xe7\x8c\xd0\xbb\xec\x8f\xc2\xf7\x80\x3a\x3b\xc0\x7d\x4e"
+ "\x63\x6c\xb0\xe7\xa2\xf5\x2e\xff\xd8\xc6\xe1\xe5\x23\x2d\x60\xa4"
+ "\x83\xe5\x59\xe0\xfc\x32\xbd\xcb\x57\x85\x3c\x3c\x61\x7c\xdc\x39"
+ "\xcf\x8e\x67\xf8\x78\x95\x19\xc7\x56\xf5\xe0\x60\x93\xcf\x04\x2d"
+ "\xed\xd3\x21\x90\xbe\xa9\xf1\xa0\x29\xba\x7e\xb4\x91\xae\x37\x67"
+ "\x0f\xc5\x63\x99\x47\xb9\xb1\x16\x91\xf2\x7f\xed\x4b\x67\x77\x08"
+ "\x26\x73\x48\xff\xda\x15\xd7\x09\xdc\xa6\x22\xfd\x06\x52\x87\x57"
+ "\xd0\xf5\xb8\xff\x9a\xb3\xbb\x14\xa6\xcf\x46\xde\x74\xf6\x04\xb5"
+ "\xd9\x67\xac\xb6\x61\x73\x3c\xc6\x57\x32\xc6\x2f\x9d\xd5\x21\xd8"
+ "\x52\x0f\xdc\xd7\x0d\x6c\x50\x6d\x86\xeb\xe9\xac\xa1\x89\xec\xf3"
+ "\x30\xf1\x90\xc4\xd1\x9c\x6a\xba\x0f\x9c\xcb\x18\x1c\x02\xe7\xdc"
+ "\xce\xab\xfe\x9a\x04\xc7\x11\xfc\x3f\xa9\x28\xe5\x06\xae\x63\x01"
+ "\xc1\xd0\xe0\x60\xc1\xff\x29\x6c\xcf\x8f\xe2\x70\xff\x27\x3c\xf4"
+ "\xaf\x1b\xb8\x7e\xc7\xb4\x97\x22\x71\x72\x28\xf4\xbb\xbf\xee\xd0"
+ "\xbb\xfc\x29\x8e\xb5\xb1\x4b\x2d\x89\x49\x06\xf3\xe6\x78\xf7\xef"
+ "\xc0\x52\xdf\x95\x22\x04\x65\x2a\xf4\x2e\x3e\x69\x9c\x2d\xff\x7a"
+ "\x09\x97\x65\x9e\x13\xfa\xa6\x79\x29\x3b\x06\xc0\x35\xd0\x6f\x8a"
+ "\x70\xcc\x21\xb1\xed\xaf\x55\x38\xee\x40\xbf\xf3\x67\xe3\xfe\x4a"
+ "\x78\xae\x45\x74\xb7\x99\x05\xf0\x5c\x69\xe7\xd9\x67\xe1\x3f\x9b"
+ "\x25\xce\xd0\x99\x89\x5a\x52\x36\x44\x57\x97\x9e\x1b\xa1\x77\xe9"
+ "\x1e\xc9\xc7\x1a\x69\x57\x6e\xf1\x80\x52\xf8\x1b\x78\x89\xa5\x2e"
+ "\xe8\xab\xee\xd0\x47\xc7\x62\x4c\xe1\xfe\xb9\x61\x3d\xe6\x1a\x89"
+ "\xfe\x0d\x99\x89\x81\x50\x4f\xae\xa5\x9f\x9a\xe7\xd1\x95\xe0\x57"
+ "\x64\xbe\x4d\x9f\x58\x07\xbe\x0c\x37\xa9\xe8\x29\xa6\x00\x04\xbc"
+ "\xd5\xb8\x09\x8e\x6f\x9a\x87\x79\x5f\xf6\x09\xe8\xcb\xee\xe2\x65"
+ "\x5d\x11\x2e\xc7\x94\x67\xcb\x36\x76\x4d\xf4\x67\x9e\x99\x52\x99"
+ "\xe1\xf9\x5c\x2c\xcf\xd4\xd8\x35\x24\xa0\x2e\x7d\x83\xb7\xde\xc5"
+ "\x35\x4e\xd0\x5f\xd6\x07\x45\xd2\x74\x24\xc6\x95\xea\xa2\x6a\xc3"
+ "\x10\xf8\xb7\x23\x8b\xe3\x07\xbe\x03\x5e\x3b\x6c\x14\xf4\x15\xf0"
+ "\xf7\xc7\xdd\x69\xd0\x93\x1b\xc6\xe9\xd1\x94\x2c\x7c\xfd\x6a\xf8"
+ "\x3f\x3e\x8e\xcb\xc0\xf1\x38\x3d\x8a\x62\x63\xca\x47\x69\xd8\x7f"
+ "\x56\xf5\x66\x92\x7a\x99\x67\x79\x00\xd7\x89\xaf\xc3\x75\x6e\xcc"
+ "\xa1\x6b\x70\x3d\x50\x47\xa1\xa5\xee\xb5\x70\xcc\x52\xff\xb0\xf8"
+ "\x3b\xf7\xa8\x80\x7b\x78\xf0\x9f\x7d\x43\x0e\x5d\xcb\x3e\x57\x8d"
+ "\x1e\xc5\x44\xe3\x73\xab\xe0\x18\xbe\x96\x60\xe4\xe3\x4e\x18\x3f"
+ "\x7a\xd2\x1e\x15\xc1\xd1\xc7\x1a\x3d\x9a\x51\xc3\x8f\xf1\xe0\x27"
+ "\x4f\xcb\x18\x40\xea\xfb\x38\xc4\x52\x1f\x57\x17\xa9\x83\xce\x98"
+ "\xa5\x61\xfb\x08\xee\xcb\x1e\xb8\x7e\x28\x0f\xed\x9f\x16\xc4\xb6"
+ "\x3f\xae\x96\x60\x1e\x6c\xcf\x5c\x43\xf0\x90\xbe\x2e\xca\x32\x96"
+ "\x83\x2f\xfc\xe1\x9a\x02\xab\xb1\xc9\x1d\x8e\x6b\xd8\xfa\x0e\x82"
+ "\x9f\x02\xf8\x6d\x25\x63\xca\x04\x1d\xc6\x14\x7b\xff\x05\xf8\x79"
+ "\x2d\xe7\xe1\x1e\xae\x70\x8f\xd9\xb8\x1f\xe0\x7b\x98\xb3\x23\xa0"
+ "\x9e\x4f\xac\xc7\x3f\x57\x5c\xce\x9c\xbe\xee\x73\x3c\x4e\x7e\xd4"
+ "\x9d\xae\x86\x32\xfe\x96\x32\xf8\x3c\xd8\xfc\x79\x38\x06\xed\x8f"
+ "\x67\x6c\x94\x0e\x65\x40\x67\x49\xae\x9d\x49\xe9\x8d\xa8\xf2\x3c"
+ "\x3d\xd6\x95\xb8\xcf\x87\x94\xfb\xd6\xa2\xf2\x3c\x33\x32\xff\x2d"
+ "\x30\x50\x97\x42\x17\x01\x57\x3f\x50\x56\x5f\x8d\xe4\x71\xc1\x4f"
+ "\x98\xef\x5f\xd1\x8d\xa0\x7f\x16\x0d\x42\x98\x1b\x5c\x55\xe5\x5d"
+ "\x2a\x37\xdc\x60\xe2\x1f\xfc\xcd\x70\x81\x8f\x40\x2f\x61\xcd\x04"
+ "\xba\x38\x26\x83\x22\xba\xc9\x0c\x65\xf3\xf1\x71\xac\xa9\x40\xcf"
+ "\x6d\xe2\x9d\xa3\xff\xd6\xbf\x90\xd8\x2e\x6f\x33\x33\x1e\xe2\xe7"
+ "\x35\xbe\x54\x84\x9f\xd9\xbc\xa5\x7f\x21\x6e\x43\x6a\x32\x6d\x2e"
+ "\x37\xd6\x15\x95\xd5\x9a\x90\x76\x1e\xd6\x7b\x79\x8b\xc3\x37\x22"
+ "\x1a\xe2\x63\xa1\xbc\x36\xe4\x31\xeb\x1f\x40\x13\x5f\x35\xf4\xe9"
+ "\x5f\x98\x6a\x42\xd4\xba\x14\x37\xf7\x17\xf2\xe8\xa2\x9b\x8f\x05"
+ "\x42\x1c\xc8\x2b\x38\x04\x8c\x57\x3e\x4f\xce\x2b\xb0\xb4\x3d\x9f"
+ "\x6d\x3b\x1c\x63\xf4\xca\x80\xdc\x34\xa6\xbd\xf0\x7f\x49\x7f\xd1"
+ "\x4b\xbd\xe8\xef\xf2\x8c\x68\x4e\x1e\xdd\x38\x67\x23\xa2\x4c\x39"
+ "\x2f\x18\x76\xe7\x57\xe2\x58\xaf\xb3\xd8\x93\xb1\x9d\xd1\x80\x12"
+ "\x53\x90\xfa\xb2\x6a\xe3\x92\xf0\x45\x69\xcc\xf7\x93\xfe\x09\xe5"
+ "\xe4\x3d\xeb\x46\xe6\xfb\x55\x65\xa0\xb1\xc3\x8d\xa9\x34\x19\xaf"
+ "\x36\x6e\x1f\xcd\xd6\x87\xcf\x59\xfc\x97\xcf\x6a\x5f\x05\xf7\x90"
+ "\x5c\xff\x6a\xa7\xad\x6a\xf1\xb6\xe6\xc7\x2b\x6f\x6b\x7e\xb0\x6d"
+ "\x5b\xf3\xb3\x5b\xb6\xad\xf9\x92\xdf\x3f\xb0\xd3\x56\xad\x78\x5b"
+ "\x37\xbd\xa1\xbc\xad\x9b\xfc\x6c\xdb\xba\x69\x49\xcb\xb6\x75\x93"
+ "\xe4\xfb\x3f\x3b\x6d\x0d\x14\x6f\x6b\xc1\x70\xe5\x6d\x2d\x50\xdb"
+ "\xb6\xb5\x20\xbe\x65\xdb\x5a\x90\x24\xd9\x56\xca\x8b\xc6\xf1\x09"
+ "\xe2\x52\x63\x4a\x03\xf0\xbc\x9c\x37\x8a\x16\x6f\x46\x54\x69\x6d"
+ "\x3d\x2a\xf3\xad\xc4\x1c\x9a\xea\x9f\x08\x71\x6f\x29\x0a\xa1\x73"
+ "\xdc\x0a\xcb\xf2\x6a\xe0\xf8\x45\x74\x2c\xb9\x1e\xe9\x66\xe3\xf8"
+ "\xbb\x79\x48\x79\xb4\xdc\xf8\xbb\xd9\xf5\x4e\xfc\x35\x0e\x62\x63"
+ "\xee\xa7\xd3\xcb\x6a\x1a\x11\x6e\x3f\xfc\x3d\xe6\x4e\xfc\x5d\x4a"
+ "\xec\x6d\x1d\x7f\xb1\x3d\xca\xeb\xeb\x05\xf1\x97\xac\xa1\xfa\xb4"
+ "\x97\x75\xec\x4d\xbf\x8c\x90\x78\xec\xdd\xdc\x80\x63\x6f\x3e\x9c"
+ "\x97\xf9\xfc\x87\x2d\xb1\x37\x03\xee\xc9\x8f\xbd\xdf\x45\xe3\xf1"
+ "\xf5\x53\x5f\x65\xb1\xf7\x53\x5f\x4b\xbb\x37\xb2\xed\x86\x7b\xa5"
+ "\x09\x63\xef\xa7\x92\x7b\x5d\xf2\x71\x4b\xe7\x3c\x5f\xb1\xfb\xa1"
+ "\x7a\x37\xf3\x96\x40\x03\x1e\xdf\xea\xc0\x26\x5f\xe5\xd7\xbb\x82"
+ "\x7d\x98\xb5\x10\x37\xeb\xa2\x5d\xe8\x2d\x03\x72\xc3\x93\xe8\xb3"
+ "\x74\x9f\x40\x03\xce\x63\x62\x3d\x7e\x51\xf5\x59\x27\x7a\xeb\x80"
+ "\x5c\x99\xcf\x7d\x82\x1d\xff\x02\x53\xa0\xbf\xec\x9e\x57\x4f\x99"
+ "\xdf\x8f\xf4\x02\x3f\xa8\xe9\xec\x17\xd4\xf4\x0a\x4d\xc5\xcd\xec"
+ "\xc8\xb4\x62\xff\x0b\x08\x97\xa5\x97\xb8\x86\x28\x7f\xfe\xcf\xb2"
+ "\x9a\x79\xfe\x23\xf2\x9f\x9f\xd4\xe9\xd8\xf3\x7f\x96\xe5\xd0\xf3"
+ "\x77\x87\xe7\x6f\x0c\x76\x03\x6d\x48\xfd\xb3\x31\xd8\x55\xde\xf3"
+ "\x6c\xf1\x73\xc8\xc7\xce\xdd\xc3\xe1\xf8\x47\x77\x8f\x50\xef\xce"
+ "\x37\x50\x10\x03\x98\x31\x1c\xf7\x3d\x12\xff\xaa\x21\x66\x9d\xa5"
+ "\x49\x4c\x32\xc8\x8c\x49\x5b\x25\xbf\xff\x67\x7b\xff\x61\x89\xad"
+ "\x70\x7f\xe9\xf6\x5b\xc7\xc4\x5d\x43\xd5\xd2\x31\xf1\x85\x44\xdb"
+ "\x98\xf8\xb7\x51\xf2\x63\xe2\xdf\x34\xb6\x31\xf1\xf3\x05\x5c\x4c"
+ "\xfc\x7c\xba\xf2\x98\xf8\xf9\x40\xc7\x63\xe2\xe7\x9e\xca\x62\xe2"
+ "\xdf\x2a\xed\xc7\xc4\xcf\x03\x95\xc5\xc4\xcf\x03\x6d\x63\xe2\xdf"
+ "\xb2\x84\x31\xf1\x73\xc9\xbd\x2e\xe8\x0c\x3f\x2d\x8c\xd1\x1e\x97"
+ "\x55\xdb\x82\x8d\x4b\x41\xb7\x64\xe4\xe5\x86\x9b\xe8\x3a\x3a\xd3"
+ "\x4f\x6b\xa6\x82\x70\x5c\xd1\xd5\xd5\xc5\xb8\x9b\xe7\xfb\x7b\xd0"
+ "\xdd\x82\x2e\xd2\x4d\x1a\x04\x76\xf2\x83\xe7\xf7\xa2\xeb\xfc\xbb"
+ "\xd0\xf3\xfd\xbb\xe5\xdd\x46\xde\xf0\xd3\xe4\xb1\xe3\x31\xfc\x1d"
+ "\x48\xcf\xd7\x74\x4e\x9f\x87\x02\xbc\x6a\x91\x3b\x3c\x43\xa4\xd7"
+ "\x12\x35\x82\x18\xe4\x8d\xff\xa6\x97\x6e\x09\xd9\x74\x1b\xb9\x7a"
+ "\x25\x83\x6f\xba\xc2\xfd\x92\xbd\x68\x7a\x8e\x3f\xda\x34\x1b\x74"
+ "\x36\x85\x34\xf9\x14\x5d\x68\xac\xf3\xa7\x4c\xde\x13\x02\x89\x7f"
+ "\xb6\xd5\xd0\xdd\x41\x7b\x65\xbd\x6e\x34\x77\x7f\xbd\xca\x94\x1a"
+ "\xa3\xa2\xdf\x8f\x54\xe1\x67\x35\x65\xbd\xae\xa7\x73\xe0\x97\x1a"
+ "\xd3\x05\x73\x68\xd0\xe1\x81\x74\x9d\xa6\x33\x68\xf4\x80\xfc\x79"
+ "\xc8\x6f\xe3\x6d\xe4\x4f\xdf\xf4\xa7\xc0\xff\x91\xf8\x3b\xa4\x60"
+ "\xa3\x48\x33\xb5\x25\x04\xce\xb9\xe2\x98\x48\xe3\xfb\x1b\xe1\xfe"
+ "\x4d\x70\xff\x46\x8c\x6d\xa4\xd9\x04\xf7\x37\xcd\xf7\x97\xd9\x5f"
+ "\xb6\xed\x67\xf0\xc9\x3e\x97\x39\xe0\x15\x35\xbd\x0b\x7e\xf8\xb9"
+ "\xc0\x86\x9b\xb0\x4d\xfa\xbf\xe2\x8d\x9f\x6d\xed\x6d\x14\x00\xcf"
+ "\xe9\x07\xcf\xe0\x0f\xf7\xc5\x7b\xb8\x44\xbe\x35\x4b\x8d\x31\x2a"
+ "\x78\x36\x53\x26\xfb\x6c\xd7\xe0\xd9\xae\x72\xcf\x86\xef\x85\xed"
+ "\x23\xf5\x7e\x34\x7c\xf1\x43\xb8\x6f\xfe\xe6\x95\xdc\x71\x04\x7e"
+ "\x57\x7a\xf3\xfd\x18\x99\x58\xdd\xbe\x4c\x0a\x2f\xeb\x76\x21\x5f"
+ "\x5a\x9d\x93\x3b\x7a\xf9\x59\x3a\xdc\x88\xd0\xf2\x5d\x28\xa0\x1c"
+ "\xfa\x75\x59\xfd\x15\x44\x77\xcd\xc9\x2d\xf6\xaf\x91\x7b\x2f\x83"
+ "\xd4\xbd\x56\x2f\xa5\x2b\x9a\xfc\x70\x5e\x2c\x32\x79\x1d\x45\x27"
+ "\x37\xfa\x0d\x28\x38\x7a\xa2\x11\x4d\x49\xc6\xef\x63\xe9\x64\xed"
+ "\x44\xe4\x7e\x5e\x55\xb8\x25\xf5\x14\x7e\x77\xf4\x45\x92\xf0\xdd"
+ "\xd1\x17\xb9\x48\xb5\x23\x04\xa9\x76\xc6\x21\xd5\xae\x5a\x04\xe5"
+ "\xac\x7e\x01\xe1\xdb\x1f\x42\x29\x46\xfa\x37\x3a\xab\x43\x75\x3a"
+ "\x45\xd7\x87\xf7\x75\xd1\x17\xcd\xc3\xef\x52\x76\x0c\x06\xfb\xfd"
+ "\x0e\xe3\xaa\x17\xfe\x1b\xd7\x97\x38\x1b\xfd\xe9\xb2\x6a\x47\x90"
+ "\x57\x6d\xc7\x11\x46\xef\xc8\x02\x23\x1d\x89\x9a\xb4\xf1\xa8\x21"
+ "\x6b\x82\xba\x09\xe7\xed\xa6\xe1\x18\xf4\xf7\x7e\x5e\x2e\x69\x88"
+ "\x06\xff\xd3\xb4\x06\xbf\x4f\x8c\xcc\x83\x1f\xf6\x25\xe3\xc7\x6e"
+ "\xcf\xac\xc1\xfe\xc6\x7d\x61\x13\x39\xae\xc6\xfd\x61\x1d\xdb\x6f"
+ "\x0c\xaa\x27\xa2\x4c\x14\x42\x26\xb8\x3e\xf5\x02\xf2\xc5\xdf\x9f"
+ "\xdd\x08\xe5\xa6\x98\xdc\x71\x3f\x8e\x2c\x9a\xf8\x23\xba\x98\x88"
+ "\xa8\xd4\xeb\xc8\x13\x30\xc1\xf4\x47\x33\xf4\xc7\xf0\xd3\x5e\xf5"
+ "\x10\x57\xcc\x29\xb7\x90\x17\x8e\x53\xf8\x5b\x2e\xe5\x35\x7a\x64"
+ "\xbe\xe6\xdf\xe5\x93\x04\xe4\x6d\xbc\x16\xd3\xcd\x70\x2d\xe6\x4f"
+ "\x1b\xcc\xc8\xbb\x4b\x22\x52\x6f\x4c\x00\x2c\xce\x84\xfe\x79\x15"
+ "\xfa\x67\x0d\xe9\x9f\x16\xfc\xd1\xab\x7f\x8c\xc4\x6b\xec\x99\xbe"
+ "\x99\xc9\xf6\xcd\xf9\xfe\x38\x17\x76\x07\x7f\xc6\x99\xfe\xd4\x46"
+ "\x8a\x46\xf0\x8c\x60\xf7\xed\xd1\x9b\x52\x3a\xba\xe3\xdc\x25\xfd"
+ "\xd8\x40\xfc\xfe\x03\xda\x4a\x1b\x77\x83\x2f\xdc\xfa\x52\x5a\x3a"
+ "\x3b\xb2\xe0\x68\x44\x35\xe2\xf2\x26\x85\x5b\x1b\xfb\x0c\x28\xd0"
+ "\x8e\xa5\xaf\x9d\x57\xed\x08\x80\xe3\xee\xda\xd7\x1f\x57\x83\x1f"
+ "\xb7\x92\x3c\x4b\xe1\x16\x9c\x4b\xd5\xab\x76\xe0\x1c\x32\xc2\xef"
+ "\xe8\x7f\x60\xde\x7f\xed\x8c\x86\xb2\xc8\x04\x36\x37\x7a\x77\x08"
+ "\x36\x7b\x4f\xd0\x15\xbd\xdb\xc8\xc4\xab\x26\xf0\xc1\xc5\x38\x44"
+ "\x4d\xa9\x01\xdb\x98\xc0\x36\x75\xfe\x1e\x10\xb7\x22\x70\xdc\xa2"
+ "\x33\x82\xf4\x8b\xf4\xb4\x39\x3c\x5a\x45\x83\x5d\xdc\xcb\x93\x4d"
+ "\xe8\xad\x44\x44\x2f\xbe\x02\x36\xaa\xad\x44\xd0\xb6\x2e\x10\xdb"
+ "\xba\x6d\x9c\x87\xbc\x3f\x01\xfb\x78\xd6\x00\xa7\x59\x9f\x9b\xb1"
+ "\x2b\xa5\xc4\xcd\x04\x38\xc7\x71\xcc\x6b\x89\x4b\x27\xf0\x55\x97"
+ "\x35\xb8\xdf\x42\x3f\xf6\x5a\xc2\xc4\x55\xc6\xb7\xc6\xf9\xfe\x8f"
+ "\x34\xcd\xf7\xd7\xc2\xef\x21\x4b\xac\xb3\xc4\x19\x3a\x7d\x7b\x29"
+ "\x8e\x73\xe5\xc9\x7a\x64\x04\x5b\x76\xc1\x63\xe2\x7c\x7f\x5f\xc6"
+ "\xa6\xef\x80\x4d\x67\x20\xf7\x01\xf5\xc8\x05\x9e\x4b\x0d\xcf\x8c"
+ "\x8e\xc5\x9c\xc7\xb1\x55\x63\x82\x7e\x84\xed\x0c\x75\x52\x34\x60"
+ "\xcd\x9c\xd5\x21\x78\x54\xac\x16\x15\xfb\x9f\x44\x78\x1f\xd7\xd4"
+ "\x06\xfa\x1c\x7e\xff\x56\x9e\x6c\x44\xb4\x4f\x64\x01\xc9\x9d\xef"
+ "\x70\x3d\x1a\x51\x8f\xa4\x31\xbd\xeb\x0a\x87\xe9\x5d\x57\x38\x4c"
+ "\xef\x62\xe6\x60\xf1\x71\xdd\x50\x00\xb8\xf6\xe6\xe3\x7a\x97\x5b"
+ "\xab\xe2\x7a\xb4\x7c\x5c\x6f\xb8\xca\xc3\x75\xca\x1f\x83\xeb\x1f"
+ "\x22\x19\x5c\xab\x9a\xfa\x30\x78\x75\x2f\x37\x7e\x09\xfc\x77\x57"
+ "\xa5\x05\xb7\x47\xbe\xc0\xb8\x2d\xf4\x6d\xaf\xb8\x6d\xa8\xf3\xd7"
+ "\xc2\xaf\xc5\x71\x0b\x75\x3a\x8c\xdb\x1f\x22\x1b\x91\xc5\x7e\x18"
+ "\xbf\x74\x46\x4e\xae\x36\x15\x85\x82\xdd\xb6\x78\x2d\x79\x08\x1d"
+ "\x23\x36\xdc\xa2\x7d\x9d\x36\x43\x8c\x60\xf6\x40\x68\x5c\x4a\xd3"
+ "\x66\xef\xb1\xda\xd4\xe3\x48\x6d\xce\xea\x52\x58\x6e\xdc\x89\xbc"
+ "\x12\x91\x2b\x7e\xff\x49\x77\xdd\x17\x05\x3a\x9c\x79\x07\x6d\xce"
+ "\xcc\xa9\x30\x65\xe6\xa6\x99\x20\x9e\x98\xb2\xa7\x69\xcd\x99\xf3"
+ "\x12\xcd\x5d\x77\x15\xd2\x78\x4e\x42\xd7\xbf\x16\xd4\xa5\x17\x6e"
+ "\xb1\xbc\x2b\x17\xe5\x46\xde\xd3\xb4\xd0\x5f\x40\x53\x7d\xd9\x0b"
+ "\xfe\xa5\x2e\xaa\xf6\x3c\x07\xff\xaa\xe0\x5f\xe6\xbd\xa9\xbc\x71"
+ "\xae\xb0\x92\xbc\x73\x8a\xdc\xcb\xc6\xc1\x53\x4c\x1f\x7c\x02\x79"
+ "\x5e\x66\xff\xae\x4b\xdf\x13\x64\x79\xf7\x7e\xa7\x3c\x67\x8f\x0a"
+ "\x7c\x6f\xb0\x89\x2b\x99\x0f\x40\xfe\x8f\xe7\xda\xb0\xf5\x31\xff"
+ "\x37\xfb\x85\xe5\x16\xa5\x9c\x47\x35\xaa\x3d\x05\xe5\x30\xf6\x9b"
+ "\x73\x22\xf7\xae\xbb\x0d\x78\x4c\xbe\x13\x7f\x4f\x75\x01\x7f\x17"
+ "\x2d\x64\xca\x30\xfb\x91\x9a\xb3\xc2\xd3\xe8\x9c\x0e\x85\x58\x43"
+ "\xd6\xd1\x31\xcf\xb3\xff\x3e\x87\xb1\x4d\xf2\x2d\x7b\xae\xd0\x60"
+ "\x3f\xfc\xfd\xf5\x3b\xf3\x8f\xf0\x77\xd1\xd3\x5c\x7d\x0f\x2d\x22"
+ "\xe3\xad\xe5\x79\xf1\xb7\xd3\xf1\xfc\x9e\xc7\xd3\x50\x5a\x9d\xc8"
+ "\xb7\xd3\xb9\x79\x40\x7b\x2a\xcd\xd9\xe1\x69\x75\xe9\x5f\xfa\xeb"
+ "\x55\x5f\x04\xf2\xdb\x2c\xe6\x0b\xbd\xea\xcb\x61\x52\xe7\xe4\xf9"
+ "\xe1\xcb\x28\xa9\x7a\x86\xfb\x9b\x68\x99\x75\xed\x90\xe4\xd5\x7e"
+ "\xfd\x03\xc3\xb7\x99\x8a\xcc\x4d\x91\x5e\xc5\x8b\xae\xc8\xe4\x44"
+ "\xff\x4f\x72\xfe\x9b\x29\x6b\xac\xce\xf8\x18\xd4\xdd\xf7\x21\x64"
+ "\x9a\x19\xf9\x12\x7e\x07\x82\xb9\xde\xe2\x58\x32\x67\xac\x74\x9b"
+ "\x11\x61\xde\xb7\x3d\xa1\x84\x6a\x6c\x8a\x44\x5d\x0c\x48\x3d\xba"
+ "\x36\x95\x5e\x77\x15\xf9\xd1\xf3\x23\xbd\xd6\x5c\x45\x21\x4d\x37"
+ "\x35\x9d\x3f\x9c\x8d\x5c\x1b\x21\x26\x37\xce\x89\xf1\xc2\xf3\xd3"
+ "\xbe\xbd\x5c\x44\x95\x1b\xf7\x63\x9e\xe9\x87\xc7\x01\xfc\xec\xa6"
+ "\x9b\x91\x5d\x56\xdd\x40\xcc\x7b\xe5\xa2\x69\x9f\xc2\x38\xb0\xb7"
+ "\xab\xdb\x62\x88\x7d\x10\xbb\x98\xf1\x40\xc1\x58\xd0\x08\x63\xc1"
+ "\xa8\x48\xba\xbe\xac\xf2\x47\x94\x7a\x05\xa9\x53\xe7\x22\x4f\x5c"
+ "\x7f\xb9\xf1\x1b\x32\x3e\x8c\x87\xf1\x01\xfe\x0f\x5a\xe2\xce\xf8"
+ "\xa0\x1d\x8d\x6c\xc6\x07\xac\x43\xca\x4e\x57\x23\xc0\x72\xc7\xd1"
+ "\xb5\x5e\xf5\x29\xb5\xb4\x19\x6b\x12\xfc\x0e\x1b\xca\x74\xb1\x8c"
+ "\x15\x78\x9c\x68\x64\xc7\x89\x8d\xec\x38\xf1\x71\x0b\x8c\x13\x1f"
+ "\xe3\x71\xe2\x24\xa2\x36\xe0\x31\x02\xc6\x87\xbf\xff\x62\xa0\x9a"
+ "\x60\x4c\x90\xe7\xe7\xbd\x35\x92\xf8\xc9\x89\xfc\xc0\x0c\x63\x31"
+ "\xf6\xf3\xfb\xe0\x5f\xec\xe7\x72\x7f\xf0\x6d\x65\xc7\x11\x0d\x70"
+ "\xdc\x98\xf3\xbc\x61\xdb\x45\x03\x45\x67\xbd\xa0\x6e\x00\x3c\x2c"
+ "\xbc\x85\x28\xa3\xf7\x58\xdd\xce\xd7\x33\x28\xac\x5b\xcd\xd9\xa1"
+ "\x41\x44\x23\x7f\x35\x15\xe7\x68\xbc\xaa\x91\x1a\xe7\x4f\x4d\x74"
+ "\xa4\x97\xf9\xf7\x48\x4f\xf3\x7b\x1a\xf7\xa6\xdf\x35\x9d\x57\xbf"
+ "\x8b\x5c\x0d\xef\xc5\x78\xa5\xbe\x81\xd4\xff\xfc\x4f\x06\x55\x56"
+ "\x0b\x7d\xbb\xc3\x77\x01\x34\xd4\xbf\xe9\x3c\x0a\xde\x34\x0d\x05"
+ "\xe5\x5f\x44\xda\xfc\x19\x28\xe0\x93\x8b\x80\xa1\xf7\x22\xbb\x34"
+ "\x31\xf8\x68\x28\x62\xe6\x04\xcc\x40\x3a\xba\x7b\x98\x01\xfe\x0d"
+ "\xce\x98\x81\x98\xbd\x1f\x69\x9f\xb1\x3a\x33\x94\x5b\x03\xda\x0d"
+ "\x38\x3a\x3c\xc3\x3f\x5e\x16\xc3\xcd\x27\x32\x39\xc4\xa8\x08\xc0"
+ "\x4d\x05\xe0\xe6\xba\x10\x37\x58\xb7\x32\xd8\x19\x45\xb0\x83\xdf"
+ "\xf9\x6d\xe2\xf3\x8b\x69\x47\x15\xe3\x27\x0f\xf8\x73\x83\x15\x7e"
+ "\xf2\xae\x3a\x87\x9f\x26\xc0\x4f\xde\x52\xc0\xcf\x31\x44\xe5\x9a"
+ "\x9d\xc1\xcf\x57\xcc\xfe\x17\x38\xcf\x47\xe6\x0a\xed\x5b\x85\xfd"
+ "\xac\x57\xed\x5b\x39\xde\xdf\x05\x29\xc3\x55\x68\x62\x33\xb8\xda"
+ "\x4b\x70\x75\xe0\x80\x02\x5c\x2d\xa3\xa1\x7e\xfb\xb8\xba\x25\x81"
+ "\xab\xd0\x44\x5b\x5c\xed\xdf\xdc\xb6\xb8\x62\xf6\xed\xfc\x3f\x80"
+ "\xab\x03\xcb\x84\xb8\xfa\xea\x1c\xc1\xd5\x57\x7a\x27\x70\xd5\x4c"
+ "\xbc\xd2\xb1\xf1\xea\x60\x57\x05\xb8\x3a\x0d\xb8\x6a\x26\x5e\x5d"
+ "\x91\xc2\x95\x48\xbc\xfa\xba\xa1\x6d\x71\xc5\xec\x2b\xfa\x7f\x00"
+ "\x57\xff\xdf\x69\x21\xae\xbe\x1e\x42\x70\xf5\x75\xb0\x72\x5c\xe9"
+ "\x9a\x89\x57\x3a\x36\x5e\x7d\x1b\x2b\x1f\x57\x87\x83\x68\xa8\xdf"
+ "\x3e\xae\xce\x48\xe0\x4a\x27\x12\xaf\xbe\x19\xd3\xb6\xb8\x62\xf6"
+ "\x3d\xfd\x3f\x80\xab\x6f\x83\x84\xb8\x3a\x98\x49\x70\x75\x30\xc3"
+ "\x09\x5c\x35\x13\xaf\xc2\xd8\x78\x55\x74\x48\x01\xae\xd6\x00\xae"
+ "\x9a\x89\x57\xdf\x48\xe1\x4a\x24\x5e\xfd\x73\x7b\xdb\xe2\x8a\xd9"
+ "\x97\xf5\xff\x00\xae\x8a\xd6\x08\x71\xf5\xed\x25\x82\xab\x6f\xab"
+ "\x95\xe3\x2a\xac\x99\x78\x15\xc6\xc6\xab\xef\x7a\x28\xc0\x55\x15"
+ "\x0d\xf5\xdb\xc7\xd5\x62\x09\x5c\x85\x89\xc4\xab\x7f\xb9\xb4\x2d"
+ "\xae\x98\x7d\x63\xff\x0f\xe0\xea\x5f\x55\x42\x5c\x1d\x0a\x23\xb8"
+ "\x3a\xa4\x73\x08\x57\xf5\x3c\x5c\x9d\xee\x38\xa2\x31\x95\xe8\xc1"
+ "\xed\x33\x58\x5c\xfd\xad\x7f\xe0\xfb\x73\x11\xb5\x73\x62\xae\x95"
+ "\x16\x2c\x9e\x6e\x8d\x29\xc0\x05\x83\x29\xe3\x7b\x80\xa9\xcb\x04"
+ "\x53\x29\x67\x00\x53\x3f\xe7\x52\xe5\xc9\x57\x30\x4e\x18\x0c\xe5"
+ "\xcd\x00\x0c\x61\x5d\xe8\xe2\xea\x2d\x47\x03\x7e\x78\xd9\x82\xa5"
+ "\xc3\xa3\x5a\x04\x4b\xe3\x00\x4b\x27\xac\xb1\x54\xcc\x61\x69\x8c"
+ "\x84\x06\x7c\x4b\x02\x4b\xfa\xe6\xb1\xf4\x09\xce\x21\xcc\x6c\x25"
+ "\x2c\x1d\xe7\x72\x08\x3b\xa6\x19\x28\xa3\x8f\x5c\x2c\x15\x07\x0a"
+ "\xb1\xf4\x5d\x36\xc1\xd2\x77\x59\xca\xb1\xa4\x4b\x94\xc6\x92\x85"
+ "\x4f\xfd\xef\x1e\xe7\xb0\x04\xdc\x4a\x80\xa5\xe6\x79\x14\x87\xa5"
+ "\xef\x37\xb4\x2d\x96\xac\x78\xd4\x3d\x8b\xa5\xff\x5d\x24\xc4\x52"
+ "\x31\xab\xfb\x8a\x25\x75\x9f\x19\xc6\x2e\xfc\xce\x09\xaf\xc1\x35"
+ "\xdd\x8c\x7c\xc9\x04\x63\x1a\x5e\x8b\x8b\xdf\x53\xec\x4e\xa8\xa0"
+ "\x30\x9e\xd2\x6f\x20\xbf\x35\xb3\x51\x88\x57\x3d\xc1\x8a\x11\xb0"
+ "\xb2\xf2\x06\x72\x6d\x6a\x02\x9c\x34\x22\xd7\x06\xb0\x77\x43\x53"
+ "\x8c\x57\x69\x54\x35\xfa\xe7\xd5\x0a\x18\xcb\xf6\xa3\x7c\xb8\xa6"
+ "\x89\xcd\x43\x9a\xdf\x8f\xec\xb2\x6a\x21\xce\x43\x1e\x43\x45\x13"
+ "\x3f\x06\xff\x97\x38\xed\xff\x86\x0f\xa4\xfc\xff\x8d\xc0\xf7\x79"
+ "\x3c\xbf\x6b\x5f\x51\x9e\x87\x64\xde\x53\x25\x10\xdf\x5b\xfc\xbe"
+ "\xa1\x05\xfc\xbe\x81\xf5\xbb\x73\xe3\xd1\x11\xe9\xf9\x8f\xbc\x58"
+ "\xc1\xcc\x29\xa8\x27\x31\xc2\x12\x17\x70\x8c\xc0\xfc\xa5\xc1\xfb"
+ "\xf9\x5a\xeb\xf1\x06\xc7\x87\xab\xaa\x1f\xce\xe1\xb1\x49\x92\xc7"
+ "\xb0\x71\x22\x75\x01\x89\x13\x84\xc7\x14\x87\xb4\x6c\xfe\xf1\xe8"
+ "\x91\xd6\x8b\x17\xdf\x34\x3f\xf6\x38\xc1\x63\x30\x6e\xf2\xac\x70"
+ "\xd3\x1a\xf1\x42\x19\x6e\x7e\xd8\x21\x8c\x17\x47\x3b\x91\x78\x71"
+ "\xd4\xdd\x91\xb1\xc7\x3e\x9e\x42\x93\x78\x78\xda\xcb\xe1\xa9\x6c"
+ "\x20\xce\x51\xca\xc4\x53\x46\xcb\xe6\x1d\x8f\xf5\x68\x5b\x3c\xb5"
+ "\x5c\xde\xb1\x7d\xe3\xe9\x98\x51\x88\xa7\xd2\x37\x08\x9e\x4a\x23"
+ "\x5b\x00\x4f\xbc\xf8\xa4\xe3\xc5\xa7\x8a\x25\x38\x37\x29\x13\x4f"
+ "\x55\x2d\x9b\x6f\x2c\x8f\x6d\x5b\x3c\xb5\x5c\xbe\xb1\x7d\xe3\xa9"
+ "\x62\xa4\x10\x4f\x65\xdb\x09\x9e\xca\xb6\x39\x8f\x27\x5d\x92\x35"
+ "\x27\x26\x78\xfa\xf1\x38\xe6\xcf\xf2\xf0\xf4\x7d\x70\xcb\xe6\x19"
+ "\x8f\x1f\x68\x5b\x3c\xb5\x5c\x9e\xb1\x7d\xe3\xe9\xc7\x3c\x21\x9e"
+ "\x2a\x1a\x08\x9e\x2a\xea\x5b\x00\x4f\xbc\xf8\x14\xc6\x8b\x4f\x27"
+ "\x7b\xe3\x5c\xa4\x4c\x3c\xb5\x70\x7e\xf1\x44\xa7\xb6\xc5\x53\xcb"
+ "\xe5\x17\xdb\x37\x9e\x4e\xd4\x08\xf1\xf4\xef\x97\x09\x9e\xfe\x3d"
+ "\xc2\x79\x3c\x85\xf1\xe2\x53\x18\x2f\x3e\xfd\x34\x0b\xe7\x20\x65"
+ "\xe2\x49\xdf\xb2\x79\xc5\xff\xbc\xd1\xb6\x78\x6a\xb9\xbc\x62\xfb"
+ "\xc6\xd3\x4f\x21\x42\x3c\x9d\xdc\x40\xf0\x74\x32\xd7\xd1\x5c\x90"
+ "\x25\x07\xc4\xc7\x93\xb4\xb6\x3b\xb5\xcf\x5a\xdb\xc9\xcb\x01\x81"
+ "\xce\x53\x9c\x4f\xac\xdc\x78\xb7\xe6\x13\x31\x86\x2c\x79\xa0\xf6"
+ "\x97\x03\x3a\x95\x26\xc4\xd0\x4f\x17\x08\x86\x7e\xaa\x92\xc2\x90"
+ "\x91\x3f\x27\xed\x37\xde\x9c\xb4\x2b\x88\xda\x99\x50\x44\x95\xb1"
+ "\x73\xd2\xf0\x7c\xb4\xb2\xaa\x6a\xb4\xea\x36\x52\x77\x89\x41\xea"
+ "\xd1\x89\xa9\xf4\x3a\x1c\x43\xe6\x44\x7a\x7d\x78\x11\x85\x34\x01"
+ "\x66\xd2\x2f\xb3\xf3\xd2\x00\x37\x3f\x9c\xae\x47\xdf\x26\xe0\x79"
+ "\x69\x85\x68\x13\x94\x33\x66\x91\x7c\x10\x8e\x23\xcc\x9c\xb4\x19"
+ "\x78\x4e\xda\xcf\x5b\x45\xe7\xa4\x2d\x95\x39\x27\x2d\x09\x70\x50"
+ "\x0b\x38\xb8\x85\x31\xb0\x4f\x30\x17\xed\x93\xa5\xbc\x1c\xd0\x34"
+ "\x89\x1c\x50\xa5\x63\xef\x24\x5a\x7c\x2e\xda\x35\xde\x5c\x34\x4b"
+ "\x0e\x68\x22\xc4\x0e\xd9\x7e\xff\x6f\xb2\xbd\x1c\x90\x09\x62\xc2"
+ "\x68\x3c\xb7\xbc\x96\xcb\x17\x2f\x8a\xc5\x6b\x7f\x9f\x37\x18\x21"
+ "\x56\xe0\xf9\xe3\xbb\xa6\x95\x30\xf9\xbe\xf2\xe4\x4a\xb4\xaa\x11"
+ "\xa9\xbd\x0c\x6c\x5c\xf0\x09\x0d\x6a\x82\xd8\x60\x82\x71\x09\x7c"
+ "\xed\xd9\x34\x07\x62\xc3\x0d\x88\x0d\x73\x20\x36\xdc\x82\xd8\x70"
+ "\xbe\x84\x89\x0d\xf4\x8a\xef\x02\xf0\xfe\xdb\x9b\x2e\xa3\xa0\x8d"
+ "\x97\x51\x30\x8e\x01\xa6\xec\xb1\xba\x26\x9f\x50\x6f\x83\x4f\xa8"
+ "\x06\xce\xf9\x13\x0c\x34\x14\xad\x99\x8d\x98\x58\x8f\x7d\xaf\x9d"
+ "\x81\xe3\xc1\xe9\x9d\x4d\x4b\x11\x72\x06\x07\x4d\xfc\x9c\x20\x1f"
+ "\x07\x12\x31\xc0\x69\x2c\x58\xe5\x81\x3f\x71\x32\x06\x60\x2c\x7c"
+ "\x62\x89\x01\x4e\x61\xe1\x8c\xe4\xfa\x1f\xfb\x58\x08\x4d\x74\x00"
+ "\x0b\x7b\x1d\xc4\xc2\x32\xbc\x6f\xb5\x08\x16\xb2\x00\x0b\xb9\x70"
+ "\x6e\x1b\xc1\xc2\x2d\x11\x2c\xfc\x72\xa0\xf5\xb1\x20\xcc\xc9\xdc"
+ "\xbb\x58\x38\x2b\xf9\xfd\xd7\x66\xb0\xe0\x40\x5c\xd0\x39\x1a\x17"
+ "\x4e\xe3\xfd\x9e\x6d\xb1\xa0\x83\xb8\xa0\x83\xb8\xa0\x63\xe3\xc2"
+ "\x15\x11\x2c\xe8\x8b\x5b\x1f\x0b\xc2\x7c\xca\xbd\x8b\x85\x73\xd2"
+ "\xfb\x5f\xd8\xc5\x82\xce\x81\xb8\xa0\x73\x30\x2e\x1c\x0e\xc2\xfb"
+ "\x24\x8b\x60\x01\xe2\x82\x0e\xe2\x82\x8e\x8d\x0b\x67\x44\xb0\x70"
+ "\xfe\x78\xeb\x63\x41\x98\x0b\xb9\x77\xb1\xf0\xeb\x36\x85\x58\x70"
+ "\x20\x2e\x84\x39\x18\x17\x0e\xaf\xc1\xfb\x0b\xdb\x62\x21\x0c\xe2"
+ "\x42\x18\xc4\x85\x30\x36\x2e\x7c\x23\x82\x85\xaa\x33\xad\x8f\x05"
+ "\x61\x1e\xe3\xde\xc5\xc2\x05\xc9\xef\x9f\xd8\xc7\x42\x98\x03\x71"
+ "\x21\xcc\xd1\xb8\x50\x85\xf7\xe5\x15\xc1\x02\xc4\x85\x30\x88\x0b"
+ "\x61\x6c\x5c\x58\x2c\x82\x85\x8b\x97\x5a\x1f\x0b\xc2\x1c\xc4\xbd"
+ "\x8b\x85\xdf\x8a\xec\x62\x81\xb6\xc5\x02\xce\x21\x60\xfd\x88\xf7"
+ "\xbd\x66\xb0\xf0\x6e\x11\xd5\x48\x63\x2c\x94\xa0\xd5\x0b\x79\x58"
+ "\xc8\x26\x3a\xc2\x82\x83\xb5\x7c\x1c\xe0\xf5\x4b\x18\x07\xa0\x1f"
+ "\x8c\xe0\x77\x3a\x27\xcc\xc0\xcc\x57\xca\x0e\xf5\xc7\xfa\x01\xe7"
+ "\x19\xb0\x86\x90\xd6\x0f\xd5\x57\x5a\x04\x03\x71\x80\x81\x1a\x71"
+ "\x1d\xd9\xe2\xfa\xe1\x5a\x2b\x61\x00\xb4\xe4\xc7\x29\xce\x60\xe0"
+ "\xd2\x61\xf9\x18\x00\x8e\xe0\x10\x06\x08\x4f\xb0\x8f\x01\x5d\x06"
+ "\x87\x01\xe0\x0b\xd9\xba\x6d\x98\x1f\x10\x0c\xe8\x72\xa5\xf9\xc1"
+ "\xe5\xeb\xad\x8f\x81\x16\xe6\x07\xed\x16\x03\xbf\x97\x48\xae\x61"
+ "\xc4\xb1\x1c\xe2\xfe\xe8\xbe\x0f\x21\xfa\xbd\xc8\x97\xd2\x2f\x23"
+ "\xbf\x0f\xdf\x45\x21\x78\xdf\x98\x9d\x8d\xf5\x54\x4a\x22\xfd\x1b"
+ "\x5e\x5b\x6d\x84\x76\xe0\x7d\x44\x19\x7c\x5c\xd3\xb8\x97\xc7\x18"
+ "\xd0\x2a\xc0\xc2\x87\xd0\x06\xbc\x47\x7c\x97\xc4\x8e\x23\xca\x6a"
+ "\x8f\xa2\xc6\x9b\x91\xa8\x34\xea\x32\x0a\xf7\xa7\x9b\xca\x4f\x17"
+ "\xe1\x35\x8c\xae\x45\xf3\x8e\xe2\x75\xe2\x9d\xa7\x24\x23\xea\xaa"
+ "\xaa\x66\x0d\xce\x29\x0d\x48\x46\xea\xbc\xcb\x24\x8f\xb4\xea\x2a"
+ "\x42\xc5\xc9\x08\x11\xbf\xd7\x5c\x72\x5b\xd0\x02\x39\xa4\x49\xe0"
+ "\xf7\xd3\x16\xbf\x17\x0b\x73\x48\x94\x03\xeb\x19\x1d\xc8\x1d\xb6"
+ "\xca\x7a\xc6\x6b\xb6\xeb\x19\x95\xe5\x0e\xaf\x1c\xb4\x3b\x8f\x88"
+ "\xe5\x01\xef\x27\x31\xfd\x9e\xf1\x6b\x13\xc4\xfe\xf2\xe4\xfd\xcc"
+ "\xfc\x68\xdc\xcf\x71\x9f\xc7\xf8\x48\x85\xf6\x62\x8c\x60\x3c\x8c"
+ "\xde\xd6\xd4\xf4\x56\x2d\xa2\xcc\x3e\xa1\x41\x18\x13\xe6\x99\x1a"
+ "\xf7\x35\xd0\xa6\xf2\xa8\xf3\xe0\xf7\x1b\xa8\xbc\x8a\xf5\xf9\xc2"
+ "\xf3\xe0\xcb\xab\xc9\xf4\x4c\xff\xce\xfd\x6b\x91\x3a\xf5\x14\x52"
+ "\x4f\xc1\x6b\x8e\x61\x1c\xf8\x04\x38\xc1\xa6\x77\x11\xc4\x82\x50"
+ "\x75\x13\x1b\x1b\xcc\x96\xbc\x12\x1e\x23\x00\x13\x1f\x26\x00\x26"
+ "\x92\x00\x13\x6f\x61\x4c\x5c\x35\xb9\xcd\x15\xc9\x2f\xcb\xc0\x04"
+ "\x93\x5f\x8e\x06\x4c\x54\x71\x98\xb8\x93\x57\x96\x18\x13\x8a\x26"
+ "\x3a\x31\xb7\x50\x24\x1e\x38\x9d\x57\xbe\xc6\xe6\x95\x79\xf1\x40"
+ "\x19\x36\xae\x49\xef\x89\x29\x89\x8d\xd0\xc4\xe6\xb1\x51\x67\xc1"
+ "\xc6\xde\xe6\xb1\x61\xc8\x12\xc1\xc6\x32\x1e\x36\x32\x78\xd8\x20"
+ "\x79\xa6\xec\xd0\x6d\xb6\xd8\xb8\xde\xa3\x6d\xb0\x61\x35\xef\xe7"
+ "\x9e\xc5\xc6\xf5\x5a\x05\xd8\x70\x20\x6e\x5c\x63\xb1\xa1\x73\x20"
+ "\x6e\xdc\x28\x14\xc1\xc6\x69\x0e\x1b\x3a\x5e\xdc\x60\xf3\x4e\xd9"
+ "\x3a\x91\xb8\x71\x73\x70\xdb\x60\xc3\x6a\x0e\xcf\x3d\x8b\x8d\x5a"
+ "\xc9\xef\x1f\x4b\x63\x43\xe7\x40\xdc\x38\x6b\xc1\x86\x03\x71\xa3"
+ "\xb6\xd4\x16\x1b\x87\x83\x78\xd8\xe0\xc5\x0d\x36\x0f\x85\x39\xa7"
+ "\x0d\x36\x6e\x8d\x69\x1b\x6c\x58\xcd\xc7\xb9\x67\xb1\x71\x3b\x40"
+ "\x01\x36\x1c\x88\x1b\xff\x64\xb1\x11\xe6\x40\xdc\xb8\x5d\x2d\x82"
+ "\x8d\x35\x1c\x36\xc2\x78\x71\x83\xcd\x4b\x65\x87\x89\xc4\x8d\xba"
+ "\xf8\xb6\xc1\x86\xd5\xdc\x9a\x7b\x16\x1b\xf5\x23\xe4\x63\x23\xcc"
+ "\x81\xb8\x91\x6a\xc1\x86\x03\x71\xa3\xc1\x55\x04\x1b\x55\x3c\x6c"
+ "\xf0\xe2\x06\x9b\xa7\xca\x0e\x13\x89\x1b\x0d\xab\xda\x06\x1b\x56"
+ "\xf3\x64\xee\x59\x6c\x34\x46\x3b\x82\x8d\x45\xb5\x22\x3a\xa5\x8a"
+ "\x60\xa3\x09\xca\xf0\x71\xc1\xd7\x26\xd0\x3e\xd7\x70\xd0\x2c\x18"
+ "\x13\x93\x17\x21\x8a\xc1\x45\x2d\x1f\x17\x4d\xbe\x18\x17\xfd\x62"
+ "\x00\x17\x17\x58\x5c\x58\x74\x09\xb3\xf7\x0a\xd1\x26\x96\x9c\x95"
+ "\x45\x9f\xac\xc6\x9a\x35\xc6\x82\x89\xa6\x8d\x6e\xb1\x2d\x80\x09"
+ "\xc1\xbc\x07\x1e\x26\xde\x90\xd0\x27\xaf\x2b\xc7\xc4\xc7\xa0\x5d"
+ "\x9b\x5a\x7a\xed\x93\x05\x13\xa7\x9c\xc5\x84\xd1\xee\xfc\x07\x71"
+ "\x4c\xb0\x3c\x43\x12\x13\x1c\xb7\x20\x98\x38\x6b\x07\x13\xa6\x40"
+ "\x5b\x4c\xb0\xbc\x82\xd9\x87\x80\x70\x0b\x4b\x0e\xcb\xc2\x2f\x84"
+ "\x98\x30\xed\x69\x1b\x4c\x58\xf1\x8b\x7b\x16\x13\xe6\x35\x92\x39"
+ "\xac\xa5\x88\xda\xb8\xd4\x5c\x98\x41\x99\xf7\xc3\xaf\x08\x7e\x25"
+ "\x70\xcc\x0d\x8e\x55\xe0\x6b\xe0\xff\xcc\x39\x73\x67\x66\xef\xe1"
+ "\x22\x2f\x97\x28\x6c\x6f\x5c\xa6\x83\xa5\x8c\xd7\x12\xa4\xdb\xc4"
+ "\xd6\x01\xc7\xd3\xe0\x78\x51\x17\x17\x5d\x07\x28\x5f\x42\xa7\x7f"
+ "\x19\x05\xc7\x3a\xe2\xb2\xf4\x12\x57\xb2\xf7\x31\x45\xe1\x3a\xac"
+ "\xef\xe9\xce\x96\xf1\xe5\xdf\xd7\x73\x89\x0e\xef\xe5\x67\x29\xd3"
+ "\xc9\x4c\x9d\xdd\x82\xcb\x99\x5d\x5c\xb5\xe6\xa5\x48\xcb\x2f\x4b"
+ "\x0f\x45\xb8\x5e\x4b\xd9\xce\x6c\x7d\x7e\xfc\x32\xa6\x4f\x11\xea"
+ "\xe2\xa2\x65\xea\xec\x92\x48\xe1\x36\xe1\xb2\x0f\xd0\x5d\x0a\xf7"
+ "\x33\xe5\x5d\x5c\xfd\x05\xe5\x57\x20\xa6\x2c\x5b\xce\x83\xee\x50"
+ "\xe2\xc7\x96\x63\x38\x1b\x1c\x73\xe5\xdb\x8f\x2d\xe7\x69\xb1\x0d"
+ "\xde\xbf\x8f\xdf\x56\xd3\x52\x0a\xd7\x87\xcb\x74\x31\x77\xf8\xdf"
+ "\x20\xb6\x2d\x41\xfc\x7b\xe2\x72\x70\xdd\x40\xd6\xce\x5e\xd0\x86"
+ "\xe0\x3b\xf5\x65\x75\xa8\xb6\x94\x03\x1c\xf6\xd8\xc4\xd9\x46\x0d"
+ "\xb6\xae\xc5\x7b\x96\x5b\xfb\xae\x8b\x8b\x8b\x1e\xfb\xae\xbc\x06"
+ "\x21\x5c\x96\xee\xf2\xe5\x36\x28\xdf\x95\x6d\x87\x8e\xb4\x83\xd9"
+ "\x33\x91\xf8\x9a\x32\xfe\x29\x9f\x79\x56\x17\x2d\xfb\xac\xdd\xa0"
+ "\xdc\x30\x4b\xbd\x66\x8a\xc1\x30\x5b\xd6\x95\x29\x5b\x16\x87\xbf"
+ "\xef\x75\xa7\xfc\x9f\x70\x59\x53\xfa\x77\xc3\x4c\x4b\x5c\x47\x58"
+ "\xd7\x6f\x5a\xea\x8e\xcf\xf3\xeb\xf7\x26\xe5\xf7\x05\x41\xf9\x91"
+ "\xb6\xe5\xd5\xd6\xe5\x7d\x48\xf9\xaf\xd6\x40\xf9\x08\xdb\xf2\xc6"
+ "\x6e\x56\xe5\xbb\x93\xf2\x07\xaa\xa0\xfc\x38\xdb\xf2\x5a\xeb\xf2"
+ "\x0f\x92\xf2\xc5\x19\x50\x3e\xd2\xb6\xbc\xce\xba\xbc\x86\x94\x3f"
+ "\x18\x02\xe5\x27\xd9\x96\x4f\xb3\x2e\xdf\x83\x94\xff\x36\x0b\xca"
+ "\x47\x59\x97\xdf\xc4\x94\x45\x8f\xb0\x65\x7b\x92\xb2\x45\x35\x50"
+ "\x36\x5a\xa4\xad\x2a\xb6\xee\x40\xb6\xfc\x9f\x49\xf9\xff\x37\x12"
+ "\xca\xc7\xd8\x96\x77\xb5\x2e\xef\x4b\xca\xff\x94\x07\xe5\xe3\x44"
+ "\x7c\x65\x5d\xbe\x17\x29\x7f\xe4\x20\x94\x4f\x14\xf1\x95\x75\xf9"
+ "\x87\x48\xf9\x52\x0f\x28\x9f\x24\x62\x7b\xeb\xf2\x0f\x93\xf2\x65"
+ "\x93\xa0\x7c\xb2\x88\xed\x85\xe5\xd3\x2b\x76\x40\xb9\x45\xf9\x2c"
+ "\x36\xad\xec\x6e\x5d\x77\x6f\x52\xf7\x8f\x46\xb8\x26\xcd\xb6\x3c"
+ "\x72\x21\xe5\xd1\x20\xb6\xfc\x23\xa4\xfc\x49\x6c\xcb\x65\x22\xb6"
+ "\x7f\x14\x97\xdf\x44\xca\x3e\x4a\xca\xfe\xef\x69\x28\xbb\x52\xc4"
+ "\xee\xfc\xb2\x7e\xa4\x6c\xb5\x3b\x94\x5d\x23\x62\x73\x7e\xd9\x3e"
+ "\xa4\xec\x7f\x8b\xa0\x6c\x86\x88\xbd\xf9\x65\x1f\x23\x65\xcf\x94"
+ "\x42\xd9\x2c\x91\xe7\x7d\x84\x57\xf6\x71\x52\xf6\x6c\x25\x94\xcd"
+ "\x15\xf1\x0b\xbf\xac\x3f\x29\x7b\x19\xfb\x30\x4f\xc4\x27\xfc\xb2"
+ "\x7d\x49\xd9\x73\xb8\xaf\x15\x88\xf8\x84\x5f\xf6\x09\x3a\xfd\x57"
+ "\x03\x1b\xa7\xb7\x58\x97\xcd\xe7\xe2\xee\x93\xe6\x2e\x17\x8c\x6c"
+ "\xac\x64\xe6\x6b\xd0\x50\x8e\x1b\x73\x8c\x4f\x59\xc6\x08\x33\x85"
+ "\x02\xe8\xf4\x53\x38\xde\xe1\x3a\x77\xd8\xc6\x36\xd7\xa7\xf2\xb9"
+ "\x31\xa2\x1f\x9d\xde\xb8\x83\xbd\x7f\xa1\x6d\x59\x77\x7e\xd9\xfe"
+ "\x74\xfa\x55\x57\xb6\xec\x5e\xdb\xb2\x6a\x7e\xd9\x01\x74\xba\x41"
+ "\xcb\x96\xdd\x2f\x12\x5f\x07\xf1\xca\x06\xd2\xe9\x37\x42\xa0\xdc"
+ "\x41\xb1\xf8\x4a\x2f\xd5\x0e\xc2\xf1\xc0\x12\xbb\xa1\xfc\x40\x62"
+ "\x5f\x23\xc6\x03\xf3\x8e\xda\x52\x16\xfc\x30\x88\x37\x56\x0e\x32"
+ "\x77\xa9\x8d\x64\x6d\x76\xd8\xf6\x19\xd2\xf8\xcf\xf0\x14\xa9\xf3"
+ "\x76\x12\xd4\x59\x62\xfd\x0c\x6c\x3c\xc2\x3c\x01\xdb\x37\xc8\x94"
+ "\x5e\x9f\x81\xed\x0b\x65\x4b\x05\x1c\x81\x72\x51\xe1\x3a\x59\xdf"
+ "\x0e\xa6\xd3\x6b\xd4\xac\x0d\x04\xe3\x11\xf4\x47\x26\x1e\x82\x7f"
+ "\x4b\xe8\x15\x1a\x2d\x94\x7d\x9a\x2d\x77\xc2\x7a\x1c\x64\x9f\xef"
+ "\x2f\x70\xae\xf2\xce\x18\xe8\xe2\x7a\x5a\x8c\xcb\x24\x3e\x81\x1e"
+ "\xb8\xec\xda\xb1\x9a\x8c\x93\xec\x37\x7e\x5d\x3b\x31\x36\x32\x6f"
+ "\xe9\x5f\x11\x5e\x4b\x1b\xf9\xc7\xd6\x51\x74\xc5\x80\x5a\xe4\x8a"
+ "\xf7\xe9\xa6\x7d\x22\x93\xf5\x70\xdc\xd0\x67\x40\x41\xdd\xfa\x8e"
+ "\xb5\x7a\x97\x7f\x31\xdf\x6d\xab\x5b\xef\x8e\xf4\xe8\xbd\x71\xf8"
+ "\xef\x75\x4b\xe9\x7a\xbc\x7f\xb2\x29\xe7\xff\x67\xef\x6d\xc0\xa2"
+ "\x3a\xb2\x84\xe1\xd3\x4d\xa3\xad\x41\x69\x08\x6a\xab\xa8\xad\x62"
+ "\xd2\x49\xfc\x21\x19\x33\x43\x1c\x8c\x24\xa2\xc1\x8c\x3f\x44\x31"
+ "\x21\x91\x44\x90\x46\x9b\x88\xda\x01\xd4\xd6\xa0\x60\xab\x89\x99"
+ "\xf8\x03\x84\x18\x4c\x10\x30\x21\x3b\x66\xd7\xdd\x30\xbb\xce\x3b"
+ "\xcc\x3e\x66\xd2\x13\x48\x86\x64\x84\x76\x67\xcd\xbb\xcc\x8c\x33"
+ "\xe9\xb0\x8c\x43\x5c\xd4\x9e\xd0\xda\x1d\x69\xba\xbe\x73\xaa\xee"
+ "\xa5\xbb\x2f\x8d\x26\xef\xe4\xdd\xfd\x9e\xef\x4b\xeb\xe5\xde\x5b"
+ "\x75\xea\xd4\xa9\x53\xe7\x9c\x3a\x55\xb7\x7e\x86\x35\x3a\xfc\x3d"
+ "\x28\x7f\xcc\x8b\x38\xbc\xe8\x33\x46\xd0\xf9\xd6\x74\x8e\x84\xc3"
+ "\xda\x03\x17\x35\xda\x45\x6c\x8b\x39\x19\x69\xa0\xf3\x1d\x4c\x9d"
+ "\xf8\x2e\x78\x4a\xeb\x10\x86\x9d\xb5\x17\xde\x20\x98\x43\xae\x31"
+ "\xeb\x80\xed\x5d\xd3\x6d\xd9\x0d\x53\x2e\x69\xb4\xdc\x0e\xd0\x1e"
+ "\xb6\xfe\x31\xc3\xce\xf2\xbd\x6b\xaf\x9a\x1f\xe4\xfb\xd6\x6a\x46"
+ "\x54\xd0\x7e\xb5\xb4\x6f\xed\xc0\x9e\xb5\xf5\x9b\xea\xf9\x3e\xb8"
+ "\x1a\xed\xe7\xbc\x2c\x36\x76\x8e\x25\xcc\x6e\xf2\xdf\xd8\x57\x46"
+ "\x67\x51\xdb\x77\x5f\x82\x4e\x29\x8e\x70\x4a\x78\x72\x94\x78\x28"
+ "\x9d\x6b\xea\xa6\x7a\xe4\x41\x53\x7f\xf9\xfd\x29\x7e\xdd\xfd\xc9"
+ "\xac\x7c\x41\xb5\xa3\xc0\x09\xfc\x1c\x46\xcd\x88\x5f\xb1\xd1\x4f"
+ "\x3a\xfc\xe5\xf7\x27\x60\xf8\x01\x87\xfb\x06\x0f\xef\xd4\x8c\x98"
+ "\x49\x7e\x6f\xaf\x2e\x59\xcf\xca\x93\xe3\xed\x13\x6e\x40\x97\x66"
+ "\x04\x3f\xbb\x8a\xc2\x59\xc5\x82\x6a\xe2\xa7\xbf\x62\xc1\x81\x08"
+ "\x3d\x68\x7a\x63\x92\xf5\x9e\xca\x11\x4b\xe5\xf3\xe8\xe4\xbc\x08"
+ "\xaf\x53\xc2\xf5\xb5\xf7\xdc\xd5\x68\xcf\xd3\x9e\xbb\xdf\x00\xfe"
+ "\x20\xc1\x87\x3f\x83\x04\xfd\xab\x57\x87\x75\x23\x6d\xdd\xe8\x27"
+ "\x9f\x15\x75\x3e\x02\xeb\x3f\x42\xaa\xff\x91\xe0\x54\x0d\x4b\x96"
+ "\x9e\xa3\x9c\xaa\x9f\xb5\x48\xcf\x7a\x79\x8f\xe3\xf0\x7b\x2e\x0f"
+ "\x3b\x83\x75\x7d\xde\xff\x46\xa6\x96\x7c\x7c\x4e\xcf\x98\x61\x67"
+ "\x0c\x93\x41\x75\x51\x33\xb2\x06\xf3\x3c\x2f\xea\x64\xe4\x56\xbc"
+ "\x47\x4b\x77\x97\x74\x67\x04\xc3\xe5\x38\xee\xc9\x26\xe4\x7b\xb9"
+ "\xa8\x8b\x91\x87\x78\xdf\x86\xe4\x06\x65\x8b\xc5\x2c\x28\xe7\x78"
+ "\x5f\x5d\x17\xb2\x9e\x21\xf1\xde\xfb\xbe\x37\xf7\xfe\xef\xff\x20"
+ "\xe9\x81\x9c\x75\xb9\xa6\xbc\xf5\x1b\xcc\xf9\xcf\x6e\x2c\xd8\xb4"
+ "\x79\x8b\xe5\xb9\xc2\xa2\xe2\xad\xdb\xb6\x5b\x77\xec\x44\x3c\x03"
+ "\x67\x62\xb3\x37\x52\x55\x6e\x35\x60\xbd\x3e\x4c\x79\xf4\xf3\x7c"
+ "\x31\x4c\xc8\xd7\xc8\x1e\x8d\x21\x7c\xdf\xc1\x81\xde\x3c\x9d\x69"
+ "\xd8\xa3\xb9\x6d\x09\x9d\xb1\x88\xf2\xad\x72\xd4\x3c\x62\xa7\x73"
+ "\x9c\xbb\x34\xb7\x25\xb7\xbb\x1e\xb1\xd3\xb9\xe3\xcd\xfa\x6e\x48"
+ "\x98\x06\xaa\x4b\x9a\xdb\x8c\x14\x5f\x77\x07\x40\x0b\xa6\x0d\x87"
+ "\x73\x9a\x0e\xf4\xaf\x8c\x65\xae\xaa\xb1\xac\x87\xf0\x57\x1d\x65"
+ "\xdd\xae\xe7\xcd\x70\x18\xdf\x51\xc7\x74\x17\x35\xb7\xf5\x37\xc7"
+ "\xf3\x73\x59\xe3\x6b\x8f\xb2\xae\x7d\x63\x59\xd7\xde\xa3\xac\xa7"
+ "\x6e\x2c\x73\x26\x54\x41\x94\xa7\xf2\xb6\x46\xa7\xe6\x36\x2d\xd7"
+ "\x57\x8c\xf7\xc7\x8e\x3c\x79\x04\xe3\xe6\xf8\x20\xa2\x0e\xdf\x31"
+ "\xcc\xdd\x6c\x10\x74\xbf\xfb\xa5\x37\x12\xf1\x55\xb1\xbe\x02\xd5"
+ "\x61\xcc\x47\xd4\x47\xd4\xd4\x16\xf4\x3a\x30\x3f\x97\xc3\xdb\x09"
+ "\x4e\x4d\x94\xa1\xee\x3a\xcf\x2f\xda\x51\xdd\x03\x84\xef\x9f\x0a"
+ "\xbd\x91\x45\x13\x98\x0f\x61\xc1\xff\x7c\x81\x0a\xf3\xbb\x80\xb8"
+ "\xdd\xc1\xe5\x31\xae\xdf\x54\x6c\xd8\xbc\xb5\xa0\xe0\xae\x91\x60"
+ "\xe4\x77\x08\x3e\x83\xbc\x98\xf6\x56\x7f\xe5\x28\x6b\xc1\x72\xda"
+ "\xb1\xbc\xad\x6d\xd8\x4b\x41\xd9\x00\x2c\x53\x39\xe2\xdd\x8a\xe1"
+ "\x67\xf0\xf9\x0c\xd2\xde\xca\xcf\x34\xd6\x4c\x3a\xc1\x2a\xa3\x66"
+ "\x22\x9d\xad\x74\x16\x1b\xed\xc5\xde\xbb\x3d\x43\x85\xe5\xae\x42"
+ "\xb8\x56\xc3\x04\x98\x81\xe9\xfa\x91\x8e\x06\x7c\x26\x78\x7e\x1e"
+ "\x30\xc2\xb7\x88\x72\x4d\xaa\xa0\x77\xe4\x95\xfd\xf8\x58\x76\xd0"
+ "\x53\x19\xd5\x41\x67\x4c\xf0\x73\x32\xf1\x1d\xf9\xd2\x8a\xb0\xe5"
+ "\xbd\xa5\x19\x2a\xec\xeb\xaa\xea\x02\x38\x4f\x12\x4d\x44\x07\xf5"
+ "\x9f\x7f\x83\x1e\xa8\xbf\x2f\x13\x66\x79\x41\xf5\x9b\x2e\x80\x9a"
+ "\xa3\xac\x1e\xaf\x1a\xbc\xaa\x3f\xc1\xb8\x8f\xf1\x6a\xc5\xf0\xb3"
+ "\x78\xff\x04\xef\x1f\xe3\x85\xfd\x6f\x3d\xd1\x5d\x54\xc2\xba\xe7"
+ "\x54\xc3\x74\xc2\x8f\xb2\xf5\x44\xa7\x26\xde\x4b\xb4\xd3\x19\x32"
+ "\x2c\x76\x54\x41\xc8\xb9\x17\x9a\xd1\x4e\xc0\x78\xbc\xbb\xc5\x3d"
+ "\xf8\x8a\x4e\xc6\x2b\x4b\x7a\x6e\x40\x98\xb3\xd2\x73\x13\x5e\x2d"
+ "\xb7\xbe\x94\xf8\x86\xba\x74\x89\x5f\x1f\xf6\xeb\x5c\x93\x0a\xbe"
+ "\x1e\x5c\x4c\x37\x68\xe2\x52\xf0\xb2\x86\x86\xc7\xa5\x8b\xb0\xf1"
+ "\xf1\xe2\x7d\xbc\x51\xba\x67\xe0\x85\x7c\x9a\x80\xf8\x27\x94\x8b"
+ "\xb0\x09\x35\x78\xef\xc2\xcb\x15\x9a\xff\x24\x4c\x3f\x69\x1f\xd5"
+ "\x67\x1f\xb6\x31\x54\x97\x4e\xcd\xa8\x64\xaa\xa3\x23\x42\xb6\x54"
+ "\xb4\x8e\x0e\xc3\x92\x50\xb6\x6a\x02\xf2\x13\x3d\x2b\x54\x7e\xa2"
+ "\xf5\x0a\xf9\xe1\xb6\x08\xf5\x65\x5f\x9d\x90\x97\x33\xbd\xcf\x9b"
+ "\xf0\x3d\x3a\x1e\xf1\x9c\xa1\x71\x1d\xc4\xc1\xfd\xd7\x23\x97\x00"
+ "\x46\x99\x41\x43\xf6\xa5\x47\x13\xbd\x89\x64\x96\xf2\x96\xf2\x15"
+ "\xb4\x20\x7d\x18\x56\x4f\xf4\x6d\x41\xbc\xf8\xde\x80\x70\xf5\x0e"
+ "\xf8\x52\xa6\x8d\xa7\xf9\xf1\xb3\x28\x8f\x12\xbd\x84\x93\xd2\xb1"
+ "\x40\xb9\x92\x28\x8d\xc8\x5b\x37\x15\xc3\x13\xd1\x46\xd1\x1a\xb9"
+ "\x08\x87\xcf\x09\x24\x93\x74\x77\xf8\x12\x51\x97\xd2\xc0\x4f\xfb"
+ "\xc2\xeb\x21\x11\xf5\x6d\x44\xa7\x46\xa7\x99\x5d\x02\x89\x84\x8f"
+ "\xec\x37\x96\xa3\xb5\x8e\x74\x51\xe0\x1a\x4f\xe5\x20\xfc\x9f\x60"
+ "\x0f\x88\xee\xb5\x44\x0f\xc6\x07\xe5\x5b\xe5\xc0\xde\xd7\x91\x9d"
+ "\xa2\xac\x98\x57\x03\xa6\x6f\xa4\xb2\x13\x3f\x31\xbe\x09\xf1\x64"
+ "\x53\x1c\x9d\x23\x29\x95\xa7\x81\xd6\x26\x12\x3f\x08\xde\x81\x3d"
+ "\x0e\x7e\xe6\x85\x26\x6a\x3f\xe7\x1b\xa6\xa7\xfa\x60\x98\x07\xe1"
+ "\x28\xf5\x31\x1f\x43\x7b\xf4\xd6\x4e\x2f\xfa\x34\x31\xbf\x0b\xad"
+ "\x1f\x5d\x53\x70\xfd\x60\xba\x46\x4c\xdf\x42\x6d\x3f\xd9\x13\xcc"
+ "\x33\x9a\xce\x81\xc6\xb0\x72\x7f\x25\xe2\xd8\xe6\xe5\x63\x51\x88"
+ "\xe7\x63\xa4\xa5\x9c\xf0\x20\x3d\x2d\x02\x57\x8c\x86\xf6\xc7\x0f"
+ "\xae\x6b\x09\x5f\x03\xd5\x39\xd7\xe7\x9d\xbc\x4c\x68\xbb\x62\x8e"
+ "\xd5\x8a\xb8\x26\x84\x69\x62\x7d\x69\xc0\x9e\xcf\x14\xe7\x4d\x8b"
+ "\xb8\xd3\xa5\x5f\xf1\xfa\x6d\x11\x76\x2d\xe6\x17\x45\xbb\x58\x77"
+ "\x80\xee\x18\x8b\x7c\x7e\x94\x44\xf7\x69\xca\x8f\x6d\xcf\xe2\x6d"
+ "\x28\xe5\x41\xe9\x25\x7c\x4b\x09\x9f\xcc\xab\xd9\x48\x87\xe0\x97"
+ "\xae\x0c\xc3\x1b\x48\x16\x39\xdf\xd0\x8e\xf6\x96\x92\x2c\xc6\x14"
+ "\x63\xfa\x33\x87\xe9\x7d\x3b\x7f\xd7\x72\x1b\x3b\x10\xaf\x3b\x43"
+ "\xf1\x0e\xf4\x20\x8f\x6c\x44\x59\xf2\x03\x4c\x8f\x83\x44\xb7\x8d"
+ "\x97\xed\x94\xfb\xf9\x54\x55\xb3\x0f\x80\xe8\x44\x1e\x35\x79\x2a"
+ "\x63\xe3\xd1\xf6\x67\x11\xad\x68\xaf\x4f\xb3\xb7\x32\x81\x68\x46"
+ "\x7b\x26\xd1\x17\x7b\x48\xaa\xfb\xd3\x54\x46\xe2\xe7\x6c\x61\xfb"
+ "\x30\x2e\xee\x5e\xa2\x3d\x50\xee\x58\x73\x30\x8f\x79\xb9\xb1\x1e"
+ "\xa8\xbe\xa8\x5e\x82\x70\x92\xec\x97\x23\xae\x53\xe2\x5d\xc8\x06"
+ "\xf1\xba\x7c\x2c\x3b\x4b\xf0\x01\xd8\xdb\x4f\x50\xdc\x6e\xcc\x7b"
+ "\x8e\x85\x9f\x71\xad\xa2\x33\xc0\x10\xef\x29\xfb\x4e\x1f\x20\x8e"
+ "\x26\xe2\x29\xc2\x5d\x23\x79\xc4\xf7\xb3\x52\x1e\x6e\x6c\xcf\x67"
+ "\xe2\x95\x1c\xd0\xff\xdb\xff\x1c\x2a\x5f\xb7\x2b\xf5\x9f\xea\xbb"
+ "\xdc\x5f\x9a\x06\x5c\x1e\x0a\xc1\x70\x45\x73\xfb\x1e\xa9\xed\x90"
+ "\xea\xfa\xf6\x4f\x9b\x51\x5f\x82\x70\x64\x29\xea\xba\x89\xcb\xe3"
+ "\xf6\xa5\x2a\x2a\x33\xa6\x6d\x92\xf0\xf0\x32\x73\x79\xb2\x71\x19"
+ "\x38\xcb\xb6\x63\x39\x07\xe4\x20\xb6\x49\xaa\xe7\xb3\x0a\x9e\xc8"
+ "\xb6\x8b\x9f\x47\x4c\x36\x09\xfd\xea\x07\x3d\x7d\x01\xbb\x44\x75"
+ "\xef\xe7\x75\x7f\x7b\x76\x9d\x68\x6f\x25\xbb\x75\xbb\x88\x1f\x1b"
+ "\x22\xc3\x44\xcb\xab\x5c\x7e\x89\x96\xd2\x2c\xa2\xa5\x89\xd3\x51"
+ "\x6a\x80\x2b\x9a\xb8\x28\xca\x1f\xd3\x56\x4b\xfa\x2a\xe1\x8a\x2d"
+ "\x20\x5c\x7b\xd1\x56\x11\x4d\x4e\xcd\x68\x2f\xb7\x7f\x8b\xb9\x1c"
+ "\x6c\x92\x68\x6f\xf5\xda\x28\x6d\x74\xf6\x57\x6a\x9e\xb6\x15\xe1"
+ "\xce\x7b\xc5\x79\x6e\x23\x31\xfd\x49\x3e\xc7\x52\xa3\x3f\x4b\x36"
+ "\x9a\xd6\x0e\xe3\xf3\xcf\x0c\x8f\xa3\xac\x5e\x02\x0d\xe2\xd3\x92"
+ "\x8c\xca\x72\xd1\xa3\xd1\xbf\x4d\x7d\x15\xe4\xf5\x29\xf4\x91\x4e"
+ "\x12\xbf\x49\x96\xd1\x47\x9a\xeb\xa9\x8c\x3b\x2f\xcb\x2d\xe6\x53"
+ "\x43\xbc\x17\xf5\x33\x66\x3c\xca\x71\x53\x40\xb6\xc6\x8c\x97\xf8"
+ "\x78\x12\xf9\xa8\xc5\xfc\x8e\x49\xe5\x3a\x89\xf0\xe8\x8b\xe9\x5f"
+ "\x92\x68\xaf\x96\xe0\xef\x97\xeb\x41\xd2\xd5\xb3\x87\xc9\xfe\xf2"
+ "\x3a\x18\x73\x56\x4a\xdb\x20\xe5\xd5\x26\xc3\x92\x8f\xc8\xcf\x66"
+ "\xc6\x30\xb2\x83\x73\xb0\xee\xb9\xed\xdb\x79\x83\xc3\x49\xb6\xb1"
+ "\x45\xe4\xa1\xdf\xca\xe5\x10\xfd\x9e\x80\x1c\x8d\x69\x50\xd8\x27"
+ "\xb2\xc5\xe5\xed\xfb\xc4\xd9\x77\x24\x4b\x64\x53\xa9\x4f\x84\xf8"
+ "\x4a\x24\xfd\x91\x68\x1e\x1b\x13\x2a\x2b\xfa\x1c\x94\x95\x59\x01"
+ "\xdc\x63\x21\x5c\x3b\x57\x27\x6c\x60\x8d\x48\x33\xf6\x31\xa9\x6c"
+ "\xa7\x44\xd9\xa4\x77\xe2\xdb\x6e\xce\xb7\x31\x41\x7c\x44\xbe\x8d"
+ "\xdb\x23\xc1\x37\x91\x2d\x0f\xe8\xeb\xd8\xf7\x64\x5d\x1e\x6c\x2f"
+ "\xc6\x3d\x47\xfa\x10\x44\x57\xb5\xc2\x5e\x34\x85\xb7\x17\x63\xcd"
+ "\x52\x79\xeb\x15\xba\xd1\x20\xf9\xbb\xfb\xe5\x7a\x68\x77\x4b\x67"
+ "\x10\x62\x18\xd9\x4f\xca\x3b\xb8\x0d\xaa\x15\x7c\x95\x74\x79\xdc"
+ "\xd3\x83\xeb\x61\xdc\xcc\x60\x7d\xa6\xba\x26\x9b\x40\x38\xa8\x4e"
+ "\xb9\x5f\x89\x61\xa2\x5e\xc7\x69\xc8\x36\x04\xdb\x68\x84\xad\xf2"
+ "\x33\xd2\x97\x71\x89\xa1\xba\x38\xb6\x46\xd2\x45\x29\x6f\xbd\x0a"
+ "\xeb\x28\x31\x28\xdf\x06\x45\xbe\x54\x37\x2d\xfc\xac\x18\x5e\xc6"
+ "\x71\x97\xe5\x36\x8d\xe0\x31\xad\x15\xd3\x74\x28\xda\xc7\x72\xa2"
+ "\x0f\xf3\x4a\xe7\x36\xeb\x28\xb7\x15\x56\x8f\xa0\xe7\x42\x9d\xd4"
+ "\x4e\x60\x58\xa2\x14\x76\x52\x6a\x4b\x64\xb9\x59\x16\x4a\x93\x3e"
+ "\x29\xbc\x7f\x34\x36\x5d\xf6\x8f\x38\x2e\x6e\x8b\xf4\xc9\x52\xf9"
+ "\x28\x6c\x96\x08\x1b\xab\xa1\xb0\xc3\x82\x0f\x55\x8c\xb7\x57\x63"
+ "\x4e\x4a\xed\x15\xe9\x97\x1a\xdf\xf5\xa4\x63\xf4\x8e\x38\x38\x7e"
+ "\x47\xd9\x0d\xea\x43\x60\xdf\x3b\xee\x34\xd9\x03\xb2\x17\x34\x37"
+ "\x98\xdf\x97\xf3\xfb\x1f\xc9\xee\x90\x1f\x42\xf1\x08\xd7\x40\xb6"
+ "\x08\xc3\xff\x4a\xfb\x02\xb2\xff\xd2\x22\x5e\xfd\x79\x91\x76\x7c"
+ "\x24\xf7\x15\xfe\x2b\x2d\x42\x0e\x93\xd3\xa1\xdd\xfa\x19\xa5\xa3"
+ "\xf4\xb2\xfd\x22\xdb\xe5\x23\xdb\xc4\xf3\x1b\xbf\x44\x92\x71\xde"
+ "\x6f\x90\xfd\xa2\x3e\x75\x10\x2c\x9d\xa5\xc6\x6d\xda\xf8\x2a\x61"
+ "\xcf\xc6\xef\xa7\xb4\xbc\xfe\xd0\x56\xee\xfe\x8a\x7d\x5e\x57\x08"
+ "\x9a\xda\x2f\xc9\x2e\x46\xed\x13\x74\x8e\x77\x8a\x72\x8c\x7f\x87"
+ "\x97\x43\xd8\xd4\x72\x41\x4b\xd4\xbe\xda\x1b\x3c\xee\x43\x2a\x0b"
+ "\xc5\x1d\x09\x8a\xa3\xb3\x11\x31\x4e\x8c\x97\x28\xd2\xf9\xfb\xcc"
+ "\x83\xe0\xeb\x6e\xf0\x7e\x1f\xf9\x08\x92\xed\x9d\x90\x2d\xe8\x9c"
+ "\x30\x49\xb6\xbb\xc8\x97\x53\x64\x7b\x79\xdc\x7a\x09\x66\xb9\x74"
+ "\xe7\xf6\x7d\xc2\x32\xc1\x57\xbd\x5a\xe2\xf7\x69\x51\x8e\x09\x39"
+ "\xbc\x9f\xfd\x5f\x99\xc8\xdb\x09\xa9\x32\x6f\x83\x9f\x49\x7f\x30"
+ "\x7f\x1d\xbd\x73\xb9\x2f\xe1\x7d\xd8\x1a\x82\x21\x9a\x44\x1b\x31"
+ "\x3e\x59\xe9\x53\x5f\xd4\xc4\xff\x8e\xda\x25\xe1\xab\xc6\xff\x42"
+ "\x1a\x7b\x02\x7b\xe1\x9b\xd8\x2e\x4c\xd4\xc8\x36\x86\x79\xd2\x80"
+ "\xce\x58\xba\xa8\x99\x18\x49\x61\x74\x3e\x56\x30\x0c\xd9\xa7\x77"
+ "\x6f\x38\x25\x9c\x13\x9c\xb2\xdd\x20\x5b\xd2\xee\xee\x94\x7c\xba"
+ "\x89\xe5\xb5\x92\x2d\xb9\xa2\x99\x58\x11\xea\x87\x4d\xac\x08\xb5"
+ "\x19\xf1\x6f\x2b\x6d\x06\xfa\xcd\xfb\x3c\x95\x13\x4d\x21\x7e\x00"
+ "\x86\xdd\xdc\x76\x4c\x4c\x22\x1d\xa5\xb3\x59\xb9\x7d\xe2\xe3\x69"
+ "\x13\xbf\x92\x69\x26\xbb\xd9\xfb\xbc\x3c\x7e\x11\xff\x2a\xf9\x6a"
+ "\x8a\xfc\xce\x87\xd8\x4e\xca\x4f\xc6\x87\x25\x27\x3d\xb2\x17\xd2"
+ "\x78\xcb\xc4\x06\xc9\xce\xd7\x87\xd8\x4a\xa9\x0d\x23\x3b\x19\xda"
+ "\x56\x45\xed\x0f\x6d\xab\xe2\xf7\x0c\xb6\x91\xf1\xe9\x5f\xbf\xad"
+ "\x8a\x37\x92\xdd\x92\x6d\x64\xa8\x2d\x88\xcf\xa8\x0d\xf1\x65\x27"
+ "\x5e\x90\x7d\xd9\x80\x1d\x9d\x58\x40\x36\x0a\xf3\x6f\x92\xf2\x46"
+ "\x3b\x31\xf2\x9c\x9c\x37\xc6\x6b\xda\x0d\x28\x9b\x95\x51\x49\x28"
+ "\x53\x8d\x92\x0f\xc8\x75\xf3\x06\x9d\xc5\xa7\x19\x4f\xe3\x9d\x23"
+ "\x49\xce\xec\x9b\xbf\x84\xae\x40\x5b\xd1\xd2\xbb\x45\xe6\xef\xa4"
+ "\xa7\x83\xfd\xc2\xe3\x47\xd9\x01\x4f\xe5\xa4\xb9\xc1\x65\x3c\x84"
+ "\x61\x47\xa4\x31\x04\xce\x5b\x8e\x6b\x12\xf9\x2b\x21\x65\x13\xe5"
+ "\x98\x94\x4c\xe5\xa0\x3e\x11\xe6\xef\x23\xbf\x87\xce\x67\x46\xbd"
+ "\x29\xab\x1b\x90\xf9\xd1\xe7\xbf\xb2\x05\xfb\x57\x51\x17\xc8\x56"
+ "\x4a\x7d\xcf\x56\xf4\x77\xca\x83\xc7\x62\x96\x2d\x4c\x37\x58\x0a"
+ "\xf3\x37\x17\xaf\xbf\xcf\x90\xbf\x39\xbf\x38\x3f\xa7\x20\x7f\x67"
+ "\x4e\x71\xfe\x96\xcd\x33\x37\xe5\x6c\xc8\xcf\x35\x6c\xcf\x29\x32"
+ "\x24\x5a\x67\x58\x47\x42\x00\x74\x9e\x21\xa7\xa8\x68\xeb\xa6\x3c"
+ "\x93\x61\x73\x7e\xee\xac\xc2\xbc\xa2\xbc\x62\x43\x4e\xe1\x96\xad"
+ "\x9b\x4d\x86\x19\xa6\xd9\x33\x12\xbf\x6f\x1a\x19\x3c\x86\x36\x4d"
+ "\x07\x3d\xfe\xeb\x5f\x74\x1f\xb9\x0e\xda\x68\x95\xa5\x30\xda\x9a"
+ "\xbf\x59\x8c\xd9\x4d\x7e\x7b\x4e\x15\x58\x30\x3e\xaa\xae\x92\x78"
+ "\x3d\xa9\x09\xef\x1a\x82\xc3\x72\x1a\xf0\x59\x8b\xb4\xc7\x7b\x2a"
+ "\x27\x9b\x9d\x9a\x69\xe9\xc4\x33\xe4\x85\x01\xcb\x16\xcf\xae\x7f"
+ "\xdc\x8d\x3e\x9b\x85\xe6\x04\xd4\x5d\x87\xb8\xf2\x6d\xa0\xc1\x2b"
+ "\x0a\x2f\x9d\x5a\x47\x63\x5d\x93\xd1\x16\x4c\x69\xe2\x67\x8e\x69"
+ "\xa6\x24\xbb\x62\xe6\x27\xb1\xf2\xf9\x49\xa2\x5e\xa6\x3c\x20\x8f"
+ "\x71\xaf\xd8\x0f\x2b\x48\x3e\x3b\x35\x53\xf8\xf8\xec\x5e\x94\x65"
+ "\x1a\xf7\xed\xfd\xe5\xc3\x29\xe8\x0f\x5e\xa0\xb1\x5b\x8c\x7b\xc0"
+ "\xad\x86\x28\xa4\x4b\xd3\x5c\x92\x08\xaf\x60\x5e\x45\x7a\xc6\x3c"
+ "\x95\x53\x40\x1e\x4f\xc3\x32\xe8\xb0\x2c\x1d\x52\x39\xfe\x93\x97"
+ "\xe3\x28\x4b\xa8\x8a\x45\xfa\x2a\x89\x9e\x29\x33\xe5\x32\x20\xdd"
+ "\x1d\x4e\xcd\xe4\x72\xa4\x53\x47\x74\x85\x1b\xeb\xa3\xf1\x2e\xa4"
+ "\x73\xab\x7f\x1b\xf2\x6d\xb2\x38\xdf\xf5\x48\xad\xd0\x3f\x2c\xcf"
+ "\xa9\x3a\x7c\x3e\xfc\x25\x44\x1d\x2a\x84\x38\x66\x9b\xc2\xda\xdc"
+ "\x3e\x70\x98\x3b\x20\x7a\x07\x73\xb1\xff\xf5\x45\xb7\x54\xa6\x7a"
+ "\xb2\x0d\xff\xf2\x6c\x87\x86\xca\x84\x6d\x45\x54\xdd\x97\x43\x8e"
+ "\x2d\x6a\x5e\x19\xcb\xdc\xec\x8d\x60\x9f\xcb\x30\x82\x78\x42\xfe"
+ "\x56\x2f\xb6\x53\x58\x06\x17\xe6\x9d\x26\xf9\xc6\x6e\xd6\x97\x15"
+ "\xe4\x4b\x4d\x21\x39\x73\x0f\x81\x5b\x2b\xe3\x66\x6a\x7e\x2e\xb2"
+ "\x5e\xd4\xbf\x61\x2b\xa6\x71\x05\xf0\x1b\xd2\x95\xf8\x09\x27\x3e"
+ "\xbb\xe4\x7c\x44\x3f\xdc\x40\x3e\x81\x0b\x65\xd9\x35\x44\x7e\x09"
+ "\x95\x47\xd9\x79\x07\x86\x1f\xf9\x0a\xc8\x57\xc0\xf6\x99\xe3\x6f"
+ "\x44\xbe\xc7\x11\xfe\xbd\x63\x01\xf6\x21\x4c\x6f\xe5\x94\x34\x1a"
+ "\xdf\xc5\x38\xd4\xff\xa8\x14\xe5\x98\xb5\x24\xcf\xf3\x14\xf2\x9c"
+ "\x52\x49\x3e\x61\x15\xe2\x47\x19\x3a\x72\x0d\xc8\x5f\x3b\x3b\xbb"
+ "\x0a\x8c\x94\x0f\x3e\x9f\xa3\xf1\x10\x4f\xe5\x54\x83\x9c\x1f\x43"
+ "\xf9\x3f\xec\x17\x63\x30\x92\x6c\xcd\x74\x58\xbb\xe9\xbb\x08\x6b"
+ "\x46\xfb\x4e\x34\x92\x8c\x61\x9a\x0c\x59\xa6\x50\xd6\xcf\x73\xb9"
+ "\x8a\x03\x23\xab\x34\x74\xd4\xc5\x22\x1c\xca\x55\x2d\xca\x13\xc9"
+ "\x15\xc2\x96\xc9\x32\x85\xb2\x76\x8e\xe0\x90\x86\x91\x8d\x3b\x53"
+ "\x34\x64\x23\xbb\x34\x53\xaf\x91\x8c\xb1\xd7\x7e\xd4\xc1\xc6\xad"
+ "\xe9\x10\xf5\x34\xf5\x9a\xc3\x2b\xea\x20\xc0\xf7\xa9\xad\x41\x7c"
+ "\x3f\x87\x72\x3c\x92\xf8\x2c\xc6\xaa\xa7\x5e\x43\xda\xce\x71\x5f"
+ "\x7c\x17\xd6\x01\x6f\xab\xa6\x9e\xa6\xf4\x12\x0f\xcf\x06\x78\x38"
+ "\x4d\x17\x8e\x87\x0a\xde\x69\xe8\x62\x95\xd3\xe2\x49\x57\x30\x4d"
+ "\x2a\xb6\xa2\x5d\x43\x7d\x2b\xc0\x3c\x34\x9a\x2a\xd0\x52\x1e\x2d"
+ "\x71\x1c\xbe\x58\xce\xe3\x08\xf2\xda\x55\x6a\xbe\xa9\x3c\xb7\xd4"
+ "\x03\xd0\x98\x38\xa5\x4f\x88\x23\xfe\x4e\x3b\x1d\x48\xcf\xdc\xca"
+ "\xf4\x33\x72\x43\x68\xe5\x17\xd2\xda\xfa\x4a\x2c\xca\x91\xa0\xd7"
+ "\x7d\x33\x7a\x13\x0c\xa2\x9d\xb4\x4f\x23\xf9\x9e\x3e\xcb\x81\xbd"
+ "\x5d\x0a\x93\xde\xe3\x7b\xb1\xed\x51\x8e\xef\x0f\xfd\xbd\x61\xfa"
+ "\xa6\xd0\xef\x0d\xd3\xb3\x86\xfa\xde\xa0\xc8\xf7\x1d\xca\xd7\x5f"
+ "\x97\xa1\x0a\xca\x9b\xb7\x7b\x43\x7d\x5b\x98\x5d\x1f\xdc\x9f\x99"
+ "\xfe\x15\xd1\xd0\x8e\xed\x14\x9b\x98\xa1\x62\x88\xa7\x85\xb7\xe1"
+ "\xd3\xbd\xc2\x7f\x21\xbf\x68\x7a\x07\xc1\x28\xcb\x31\xf0\xd3\xc6"
+ "\xfd\x8a\x6e\x5f\xf1\x97\xc8\xc5\x40\x33\xfc\xc1\x60\x96\xa3\xd5"
+ "\x21\xc0\xc0\xc2\xbc\x44\x01\x4c\xe5\xf0\x0c\x7f\x22\x48\x7a\x77"
+ "\xf1\x17\xcd\x00\xfc\x40\xfc\xdf\xf0\x1b\x21\xe8\xe5\xf8\xbc\xa0"
+ "\x92\xf2\x3b\x10\x04\x91\x7a\x93\xd4\x0c\xe4\x24\xe1\x7e\xcf\xe1"
+ "\x55\x96\x81\x7e\xe4\xd4\x93\x1c\x98\x31\x9f\x84\x5f\x7e\x67\xc1"
+ "\xef\x14\x12\xfa\x8e\xbf\x88\xac\xa0\x0c\xa6\x44\x98\xf8\xf4\xae"
+ "\x04\xe7\x40\x90\xba\x5e\x17\x9c\xa5\x0e\xca\x22\xf9\x43\x34\xfd"
+ "\xf1\x22\x3e\x23\xc6\x4f\x6d\x1d\x00\xb8\xdd\xbd\x27\x08\xfc\x37"
+ "\x82\xfc\xe9\xfa\x9b\x94\xf1\x9b\xfe\x26\x07\x3d\x4f\x11\xb7\x69"
+ "\x1d\xdf\x22\xfe\x9b\xff\x0c\xe7\x46\xc8\x8f\x01\xf1\x98\x9e\x1d"
+ "\x0e\x34\xc0\xff\xe9\x76\x39\x28\x58\x42\x03\xf1\x77\x26\x87\xbe"
+ "\x1b\xbd\xa1\xef\xf7\xa4\xfd\xed\x84\xa3\x0e\xd2\x9f\x52\x67\x0c"
+ "\xc0\xdd\x71\x03\x81\xd1\x0a\x95\x89\x2e\x57\xa8\x50\xe0\x27\x51"
+ "\x13\x81\xf4\xd4\x04\x05\x6b\xc2\x43\xff\xdf\xf9\x4d\xd8\x23\x29"
+ "\xc4\x14\x97\x6e\x50\xe4\x02\x45\x18\xbd\x0f\x33\x48\x61\xf7\xfe"
+ "\x6a\x10\x3c\x0f\x33\x04\xbd\xab\x52\xf0\x4f\x3d\xc0\x8c\x82\x6f"
+ "\x83\xd6\xef\x7e\xff\x3f\xfc\xa9\x48\x3f\xbe\xfb\xfd\x5f\xfa\x31"
+ "\xd1\x8a\xa3\x25\xe2\x37\xfa\xc7\x06\x0c\x25\x93\x22\x98\x14\xc0"
+ "\xa4\x87\x6f\xa5\x1d\xff\xee\xf7\xdd\xef\xbb\xdf\x77\xbf\xef\x7e"
+ "\xdf\xfd\xbe\xfb\xfd\x7f\xe0\xa7\xe2\xfd\x08\x26\xfd\x06\x9e\x07"
+ "\xe2\xa9\x1b\x64\xae\x61\x6a\x15\xb0\xa0\x88\xb2\xfb\x41\xa5\x85"
+ "\x61\x9a\x6f\xcf\xcb\x33\x0c\x10\xf4\x35\x13\xd0\x99\x7d\xf7\xe2"
+ "\xf5\x3d\xbc\x26\x06\x85\x4f\xfb\xb6\x28\xfa\x9b\x7f\x2a\x64\x5e"
+ "\x04\xf6\x0b\x23\x61\x18\x0c\x07\x2d\x8c\x80\x91\x70\x1b\x44\xc1"
+ "\x28\x18\x8d\xfd\x4d\x1d\xc4\x40\x2c\xdc\x0e\x71\x30\x06\xc6\xc2"
+ "\x38\xd0\xc3\x78\x98\x80\x25\x89\x87\x49\xd8\xb7\x9f\x82\x0c\x99"
+ "\x1a\xbe\x2c\x65\x90\xa2\xc7\x3f\xf8\x3f\x1d\x52\xf8\x7b\xf6\x77"
+ "\xe1\xff\xad\xe1\x76\x29\xfc\x9c\x14\xee\xfc\x2e\xfc\xbf\x35\xdc"
+ "\xf0\x3f\x7c\x9f\xfa\x3f\x7a\x57\xa1\xc9\x16\x56\x5b\x15\xd6\x56"
+ "\x2a\x43\x55\xd2\x6f\xe0\x1d\x6e\x91\x7e\x10\xbe\xd0\xf4\xca\x5f"
+ "\x0a\x5e\x73\xc5\x63\x29\x80\x18\xe7\x65\xc1\x3f\xdf\x50\x29\xe5"
+ "\xdf\x9e\x2e\xbc\x5c\x78\x21\xe4\x1e\x6c\x61\x6c\xb7\xe1\x35\x46"
+ "\xc6\x23\x60\xb4\x78\x5d\xc1\xf8\xcf\x1a\x00\x9c\x17\xf0\xc2\x6c"
+ "\x3f\xb7\x02\x74\x46\x01\xfc\x79\x29\xc0\x7f\x9e\x02\xb8\xd8\x13"
+ "\xc0\xd9\x5b\x16\xa0\xee\xaf\x16\xf1\x6c\xc0\xeb\x3a\x21\x02\xa7"
+ "\x6a\x60\x78\xcf\xbe\x28\x23\xcd\x70\xef\xec\xb9\xb3\xef\xff\x5e"
+ "\x8e\x61\x56\xfa\x2c\xc3\x7d\x89\xf7\xde\x3b\x27\xf1\xfb\x73\xee"
+ "\xfd\x81\xe1\xbe\xfb\xe6\xdd\x9b\x38\x2f\x31\xd1\xb0\x69\x47\x61"
+ "\xfe\xbd\x89\x1b\xf2\x0c\x9b\x4d\xf9\x45\x86\xf5\xf9\x85\x9b\xb6"
+ "\xe7\x14\xe6\xdd\xaa\x5c\xdf\xf0\x47\xe4\x4d\xf2\x03\xaf\x81\x50"
+ "\x6e\x2f\x00\xcd\xcc\x34\xd0\xcc\x4f\x81\x41\xd5\xa3\x2a\x97\xc6"
+ "\x52\x8d\xd2\x15\xf6\xb7\xe9\xa9\xc7\x7f\x3f\x63\xcd\xe8\x0f\x1e"
+ "\xda\x30\x63\xfe\xc2\xb7\x8e\x34\x82\xfa\x7b\xad\xa0\xbe\xa7\x00"
+ "\xd4\x53\x67\x82\x7a\x4c\x06\xa8\x87\x77\x81\x7a\x4b\x12\xa8\xd7"
+ "\xdb\x41\x9d\x65\x02\x75\xba\x05\xd4\x0f\x87\x09\xdb\x5d\x20\xc2"
+ "\xfe\x59\x07\xea\x9f\x94\x83\xfa\x8d\x12\x50\x1f\x3a\x25\xc2\x5a"
+ "\xab\x40\xfd\xde\x2d\x6b\xfb\xbf\xf9\xf7\x75\xfd\x89\x41\x3f\x27"
+ "\x97\x39\x5a\x0f\xb0\x33\x3e\xcc\xa0\xe9\x77\xbf\xef\x7e\xdf\xfd"
+ "\xbe\xfb\x7d\xf7\xfb\xee\xf7\xdd\xef\xff\xe5\x3f\x97\x0a\xe6\x7e"
+ "\xa9\xd6\xc0\x07\xe8\x2d\x79\x6c\xda\x78\xa7\xea\x81\xb9\x34\xc7"
+ "\x04\x68\x2d\x15\x68\xf9\xbe\x2f\xe2\xd2\xe0\x2d\x12\x1b\xfe\x61"
+ "\x78\x0d\xd7\x06\xcf\x55\xa1\xb9\x48\xcd\xfa\x44\x88\xd0\x83\x98"
+ "\x37\x65\x63\xe7\xc4\x7a\xe7\xfb\xa0\x07\xb4\x7c\xcf\x03\x5a\x3f"
+ "\x8a\xf8\xad\x4e\xf8\xfb\x7a\x79\x9e\x95\x0c\x47\xf3\xac\x68\x5e"
+ "\x16\xc2\xf2\x79\x27\x43\xcc\xab\xd1\xb1\xd7\xf4\xea\x85\xc7\x01"
+ "\x68\x1d\xea\x2b\x47\x99\xab\xa5\x04\xa0\xb9\x41\xac\x47\xa5\x39"
+ "\x37\x88\xbf\xc3\x09\x07\x1a\xc4\x3c\x2b\xe6\xde\x8b\xe1\x18\xd6"
+ "\xe3\x84\x97\xaa\xa4\x3c\x7b\xe4\x70\xc7\xbe\xeb\xd0\x62\xe0\xeb"
+ "\x6d\x5c\x2d\x86\x7e\x48\x9d\x4a\xe5\x1f\xa1\x47\xd8\xf8\xa1\xe6"
+ "\xd8\xc8\xf3\xc9\x28\x6f\x09\x3e\x4d\x91\x1f\x96\x71\x44\x96\x9c"
+ "\xdf\x10\x38\xa2\x28\xad\x8c\x07\x69\xef\xc1\x34\xe5\x32\x1e\xa4"
+ "\x47\xa6\xd1\x95\xba\x8b\xe7\x71\x2a\x1c\x4d\x86\x0f\x93\x23\xf3"
+ "\xbe\x3f\xa7\x2b\xf9\xfc\xfa\x04\xc3\x98\x7b\x17\xe5\x25\xdc\xc9"
+ "\x12\xa3\x67\xbe\x9c\x78\x5b\xca\x88\x94\xd1\x73\x56\x26\xaa\x75"
+ "\xea\x69\xea\xc4\x58\x9d\xfa\x8e\x75\xf4\xf7\xdc\x64\x23\xbf\x1b"
+ "\x34\xc9\xfb\x4c\xdf\x37\x0c\x5f\xf0\xe2\x0b\xdb\x52\x7e\xfe\x93"
+ "\xc5\x29\x8f\x3c\x5e\x74\xd7\x07\x89\xea\xdb\x7f\xfb\xf2\x7b\xc6"
+ "\x2f\x09\x62\xea\x34\xfa\x9b\xd5\x1c\x11\x77\x97\x8d\xb0\x9c\x1b"
+ "\x6f\xf8\x80\x42\xee\xd6\x24\x17\x9b\xee\x9f\xd3\x40\x39\xae\xce"
+ "\x9d\x65\xa3\x34\x8b\x97\x89\x34\x02\x62\xce\xe9\xe0\xb8\xd9\xff"
+ "\x4c\xa9\x0d\x9c\x06\xd0\x08\x5c\x03\xb8\xc7\x09\x0a\x45\xe8\xb4"
+ "\xb6\xc4\x49\x52\xde\x6f\xd2\xdf\xa7\xde\x9a\xad\x46\x0c\xb1\xb3"
+ "\x1e\xa6\xd8\x39\x9e\x44\x8f\xa1\x25\x59\xb3\x21\xc1\x38\xfc\xde"
+ "\x9f\xe0\x53\xc2\x86\x04\x9d\x1a\x9f\x5f\x14\xcf\xc4\x03\xd3\x0f"
+ "\x04\x84\x4e\x3d\x23\x2e\xd9\x64\xfa\xfe\x67\x6e\xd3\xf7\x75\xea"
+ "\x94\x06\x53\x72\xca\xd8\x83\x05\xf7\x24\x24\x27\x98\xee\xd7\xa9"
+ "\xf9\x7d\x5e\xca\x8c\x1f\x3f\xa5\x53\xdf\xf9\xab\xc4\x18\x9d\xea"
+ "\xd7\xf5\x2a\xf8\x50\xbd\xea\xd4\x87\x11\x9f\x7e\xfa\x11\xdc\xbd"
+ "\xe9\x23\xd5\xdd\x4b\x3f\x52\xab\x62\x3e\x8a\x7a\x12\x7e\xad\x1b"
+ "\x0e\xbf\xd6\xe3\x65\x78\x04\x5a\x55\xa5\xe9\xad\xea\xed\xd9\xad"
+ "\x11\xa5\xed\xad\x9a\x27\xa0\x35\x72\x6d\x4c\xeb\xb0\x47\x1e\x6b"
+ "\x1d\xfe\xc4\xe7\xad\xda\x3b\xa1\x75\x04\x40\xeb\x54\xf4\xf3\xa7"
+ "\x41\x5c\xeb\x7d\x31\x2f\xb4\x3e\x32\x59\x6d\xbf\xbd\xf7\x21\xfb"
+ "\x04\xcd\x62\x7b\x82\x0e\xec\x33\x46\x82\xfd\x8e\xa8\x28\xfb\x9d"
+ "\x78\xdd\x05\xf5\xf6\x44\x7c\x4f\x86\x78\x7b\xe4\xce\x61\x00\x82"
+ "\x96\x8f\x0c\x00\x1f\x4d\x85\x05\x1f\x4d\xc3\xfb\x74\xbc\x12\xf0"
+ "\x9a\x81\xd7\x9d\x78\x61\xff\xe5\x23\xda\xdb\x08\x8c\xc3\x92\xff"
+ "\xd7\xaf\x72\x72\xe6\xe6\xdc\x9f\xb1\x30\x22\x22\x2f\x01\x6e\x43"
+ "\xae\x69\x92\x13\xa6\x46\x26\x45\xe6\x25\x7c\xe6\x4e\xc1\xbf\x3a"
+ "\xf5\xd3\xff\x1e\x31\x6c\x8e\x27\xc9\x93\xfd\xf3\xcf\xfa\x61\x24"
+ "\xf2\x1f\x94\x32\xdc\x6b\x03\x95\x1b\x69\x74\xdb\x7a\x1f\xf2\xd8"
+ "\xa2\x74\x4e\x18\x61\x96\xe5\x58\xc4\x7d\xa0\x73\xdb\xca\x50\xfe"
+ "\xa2\x66\x86\x8f\xdb\x43\x71\x69\x37\x49\x67\x0a\x1f\x47\x32\x1d"
+ "\x55\x26\xc7\xf5\xaa\x9b\xd3\xf1\x1d\xe5\x5f\x9b\x14\x0a\x6b\x8f"
+ "\x70\xdb\x54\x7b\x30\xee\xd4\x60\x3c\x76\xc4\x93\xfa\x63\x8c\x6b"
+ "\x0d\x13\xf7\xa8\xdb\xb6\x92\xf2\xe8\x52\xe4\xe1\x96\xf3\xa0\x75"
+ "\xde\xb5\xa8\x5f\x64\x77\xfc\xb6\x11\x4d\x94\xd6\xe1\x75\x41\x83"
+ "\xbf\x5b\xa5\xb1\x9e\x05\xc2\xe3\xb1\x8d\x4a\x90\xd3\x13\x1c\xed"
+ "\x49\x40\xeb\xf3\xf8\x3c\x50\x18\xb5\x9a\xe6\x81\x1e\x46\x1c\x86"
+ "\x6d\xaa\x71\x9d\x10\xd5\x4f\x69\x9c\x30\xca\xec\x56\x7f\x82\x79"
+ "\x8f\xca\x96\xed\x1c\x86\xf1\xb5\x00\x94\x07\x96\xbd\x0c\xe3\x4a"
+ "\x06\xd3\xfc\x49\xac\xe0\xcb\xa8\x6a\x39\xee\x66\x73\x0b\x45\x1a"
+ "\xc6\xdc\xb6\x4f\xfc\x98\xe6\xec\x60\x7c\xac\xcc\x6d\x53\xbf\x80"
+ "\x71\xdd\x61\xe2\xf6\x88\xbc\x46\x6b\xc2\xc4\xd9\x30\x4e\x8d\x71"
+ "\x86\x21\xe2\x22\x30\x2e\x39\x5c\x5c\x4b\x0d\xc7\x99\x39\xc0\xf3"
+ "\xd1\xa3\x52\xf0\xdd\x2c\xf3\xfc\xd6\xe5\xa1\xfa\xbe\x17\xf9\x3e"
+ "\xba\x46\x89\x9f\x70\xbb\xd5\x6d\x84\xaf\x69\x70\xde\x67\x55\x6e"
+ "\x5b\x1a\xca\xc2\xe8\xf3\x83\xe3\x7e\x33\x11\xf9\x40\x74\xb9\xc2"
+ "\xc4\xc5\x63\x79\xd0\x5e\x47\x47\x85\xc1\x39\x0c\xe3\x9c\x18\x67"
+ "\xbc\x45\x7d\xe8\xb8\x0d\xa7\x7d\x10\x26\x43\xe4\x45\x88\x9d\x4f"
+ "\xe5\x11\x72\x01\xc3\x2e\x42\x4c\x5b\xaf\x98\x13\xef\x32\xec\x84"
+ "\x08\x7c\x3f\xc1\x6c\xf6\x31\x18\xdf\x83\xf2\xa4\x75\x5c\xf7\xc1"
+ "\x45\x88\x3e\x88\x30\x11\xb4\x86\x95\xda\x27\x0c\x8f\x70\x78\x7d"
+ "\xb4\x8e\x03\xe5\x2c\xfa\xa7\x78\x57\x63\x3a\xbe\xc6\x6f\x55\x0d"
+ "\x24\x10\x8d\x7c\x1e\xab\xcd\xae\xa2\x79\xa1\xd4\x1e\xba\xd5\x70"
+ "\xa7\x9b\xcb\x6c\x34\xb6\x7f\xda\x7a\x69\x0e\x2f\xd1\xa0\xc1\xb4"
+ "\xbb\xd4\x3a\x3e\x27\xdc\x85\xb8\x88\x86\xc7\xfc\x36\xbb\x7a\x00"
+ "\x8f\xda\x7e\x1b\xcd\xef\xed\xb5\xa9\x97\xb8\xd5\xd1\x4c\xe0\xd1"
+ "\x19\x64\x3c\x04\x87\x79\xf1\x79\xf2\xbd\x36\x4d\x65\x10\x4c\x6a"
+ "\x70\x5e\x73\xdc\x10\x41\x34\x77\x82\xae\x86\xf2\x93\xca\xc8\xe7"
+ "\xdc\x3a\xb6\xf9\xc0\x81\xfe\xc5\x45\xd0\x59\xb1\xac\x86\x66\x2f"
+ "\xad\x75\xb6\xc7\xd4\xed\x06\xe0\x7a\xa1\x06\x83\x84\xb3\x5a\xc6"
+ "\x49\x38\x82\xca\x1a\x2b\xf2\xa7\xb2\x6a\x41\x82\x6d\x09\xa6\x91"
+ "\xf0\x62\xb9\xc6\xd5\x22\x5c\x0b\x7a\x2d\x12\x4c\xb7\x0c\x13\x54"
+ "\x07\x53\x25\xfa\x88\x3f\x54\x67\x59\xb2\x7e\x7a\x6c\x31\xd8\xfe"
+ "\xdf\xd6\x2d\xf4\x36\x10\x2e\xd1\xa0\x17\x34\xa8\x90\x06\x95\x5d"
+ "\xe0\x8f\x49\x93\xf1\x3b\x41\xe7\x0d\xa6\xb9\x96\xc3\xea\x46\x08"
+ "\x3d\xe5\xb0\xc5\x01\xd8\xe8\x10\x58\xe4\x85\x5a\xd4\x01\xa8\x9d"
+ "\x10\x63\x42\x7e\x44\x20\x4c\x23\xd6\xb7\x41\x86\x91\xca\xaf\xc7"
+ "\xb8\x05\x12\xbe\x96\x20\x7c\xc5\x84\x8f\xe6\xc5\x0a\xdb\x1b\xe3"
+ "\x0c\xd8\x3e\x68\xc5\x77\xd7\x60\xfb\x4a\xfa\x1a\xab\x45\xb8\x04"
+ "\x0a\xb7\x4c\x03\xdd\x25\x88\xf9\x73\xaf\x3a\xa2\x5b\xf0\x22\x16"
+ "\xed\xdf\xa8\x01\xdf\x06\xdf\xe7\x3a\xc1\xe0\x95\xf2\x33\x11\x6f"
+ "\x02\xf6\x96\xf2\x8c\xcd\x90\xf3\x94\xe3\x83\x75\x26\x65\xc4\x1c"
+ "\xf4\x4f\x52\xfe\x3e\x25\x3e\x65\xb2\xec\xbb\xcc\x6f\x59\x9f\x30"
+ "\xc7\x3d\xbf\xc5\x70\x7f\xe2\xdb\x79\x09\x33\x79\xdb\x7f\x67\x67"
+ "\xe2\x34\x6c\xdd\x7f\xcb\xff\x56\x52\x48\x02\x0f\xc1\x70\x7a\x9e"
+ "\x46\xcf\x92\xbf\x80\x4f\xab\x57\x45\x0c\x9f\x51\x48\x4f\xc2\x73"
+ "\x48\x19\xfb\x4c\x6e\x44\xaa\xf4\x3c\x5a\xc4\xdc\xc3\x7d\x0e\xe3"
+ "\xc3\xf4\x7c\x07\xc7\x35\xa7\x81\x72\x9e\xfd\x72\xe2\x0f\x1f\xff"
+ "\x97\x88\x8f\x5e\xd8\x98\x12\x75\xa7\x8d\x60\x66\xfe\x28\xf1\x0d"
+ "\x0c\x69\xa6\x90\x69\x6f\x72\x0a\x82\x53\x9d\xa6\x54\x52\x7c\xfc"
+ "\xcc\x45\x89\xaf\xae\x59\x35\xfd\xb7\x89\xb1\xb7\x7f\x90\xd5\x4c"
+ "\xe9\x6f\x8f\x0d\xc9\x69\x5a\x80\xaa\x75\x47\xee\xda\xff\xbd\xb7"
+ "\x05\x96\xc7\x57\x45\xfc\x36\x65\xf2\x96\x42\x0a\x9d\xce\x7d\x31"
+ "\xf2\x55\xe6\x5c\x4b\x8c\x7c\xe1\xf1\xcf\xfe\xf5\xf1\xb7\xce\x3d"
+ "\x75\x17\x96\xf4\xf6\xca\x73\x4f\x3d\xfe\xd6\x67\xff\x1a\xb1\x97"
+ "\x20\xef\x36\x25\xc6\x19\x22\xe7\x6f\x6d\x79\xec\x2e\x4e\xd5\xb8"
+ "\x83\xfa\xea\xf1\x0d\x13\x1a\x27\x9e\x89\x6f\x9d\xf4\xef\x93\xff"
+ "\x34\xe5\x0b\x83\x7b\x2a\x43\x3f\xe2\xa1\xc4\xa9\x03\x7e\x04\xa0"
+ "\x1f\xd1\x89\x7e\x44\x29\xfa\x11\xed\xc1\x7e\xc4\xc7\x23\xe7\x95"
+ "\x08\x5f\x42\xc0\x0b\xff\x67\xe6\xbf\xa3\xff\xb3\x19\xfd\x9f\x99"
+ "\x1f\x45\xae\x7e\xe2\xa3\xa8\x0c\xe1\xff\xc4\x44\x0f\xe3\x3e\xd0"
+ "\x78\xbc\xa3\x1f\xf4\xeb\xa9\x78\x37\xe2\xfb\x5d\xb1\xc3\x43\x7d"
+ "\xa2\x95\xa3\x5b\x23\xb3\xd0\x27\x4a\x46\x9f\x28\x25\xa7\x55\xbb"
+ "\xe4\x57\xad\x23\x92\x52\x5a\x47\x0e\xf8\x45\x8b\x5b\x53\xf5\x73"
+ "\x5a\x97\x68\xa0\xf5\x51\x10\xbe\xd1\x3e\x48\xfc\x58\x13\xa7\xfa"
+ "\x4d\x14\x68\x7e\x33\xba\x7e\xe4\x6f\xa2\xed\xf6\xdf\xe8\xf0\x8a"
+ "\x81\xfa\xdf\xc4\xc2\xf0\x0f\x1e\xaa\x87\x0f\x16\x96\x3a\x3f\xd2"
+ "\xc0\xe8\x8f\x46\xc0\xb5\x8f\x62\xf0\x9e\x7d\x14\x3e\x7a\x11\x34"
+ "\x1f\x8d\xd4\x5c\x0b\x94\x37\xee\xcf\x1f\x4d\xfd\x70\xfe\x47\xd3"
+ "\x92\x7f\xf9\xd1\xf4\xd4\x95\x1f\x25\x7c\xf8\xe1\x47\x33\x9c\x93"
+ "\x83\xfd\x26\x2a\x33\xc0\x3d\xfb\xc8\x83\x45\x7e\xdf\x6f\x1c\x96"
+ "\x38\x6c\x7f\x1e\xf7\x07\xbf\x2f\xf9\x85\xdf\x4f\x59\xf4\xc2\xe3"
+ "\x8f\xe7\x46\xa8\x53\x26\x73\xef\x52\xf2\x34\x03\xde\x67\xa8\xcf"
+ "\x39\xbf\x25\xe0\x73\x26\xb8\x03\x3e\xa7\x61\xd8\xfc\x6d\x21\xfe"
+ "\x59\x1f\x86\x9d\x4f\x4e\x30\xcc\x48\xe4\x9e\xd9\xb9\xf1\x4a\x6f"
+ "\x6d\xf6\xa1\xc4\xf9\x09\xda\xfb\x3b\xd0\x67\x1b\x7e\xe0\xc5\xdc"
+ "\x9f\xd0\x85\x5e\xdb\x57\x3a\xf5\x0b\xcf\xe6\x24\x65\xee\xbd\x1b"
+ "\xeb\xfc\x76\xf2\x82\x87\xbf\xb8\xbf\xe9\xc5\x17\x5f\x68\xfa\xe8"
+ "\xa9\x55\x77\xfd\x33\x86\x7d\x90\x50\x8c\xf2\xf3\x1f\xa6\xff\x98"
+ "\x73\x2d\x39\xf2\xc5\x27\x9a\x5e\x78\x6d\xc3\x86\x16\x92\x17\xaa"
+ "\x5b\xb9\x8d\xea\xb5\xc5\xa2\x4f\xa2\xfa\xb9\xc7\x36\x06\xfd\x9f"
+ "\xf1\xad\xca\xb6\xec\x3b\xbd\xfc\x4e\x2f\xbf\xd3\xcb\xff\x09\xbd"
+ "\x1c\x0b\x42\x2f\xc7\x1f\x0c\xa7\x97\x4b\x96\x2f\x5e\x31\xcf\xb0"
+ "\x35\xd7\x60\x29\xdc\xb2\xa1\x30\x67\x93\xa1\x60\x4b\x8e\x29\xcf"
+ "\x34\x12\x06\x22\x72\x72\x8b\xf3\xb7\xe5\x14\xe7\x0d\x5a\xf3\xa8"
+ "\x97\x7d\xd2\xc1\xbe\xf5\x78\xef\xd0\xbe\xf5\x84\xb8\xf0\xfd\x12"
+ "\x15\xb6\xed\x13\x12\xc3\xc4\x4d\x93\xe2\x96\x86\x89\x7b\x58\x8a"
+ "\x33\x87\xe9\x03\x8e\x12\x7d\x8c\x09\xfb\xc2\xc5\x61\x78\x8d\xec"
+ "\x93\x60\x3f\x4d\xdd\x32\xad\x07\xc8\x27\xb9\x08\x13\x3e\xc4\x32"
+ "\x75\x63\xfc\x19\xd9\x97\x71\xc2\x84\x7d\xb2\x8f\x26\xf5\x43\x8c"
+ "\x6e\x5b\x0a\x96\x73\x82\x33\x4c\x1f\xe5\x6e\x29\x5f\x5f\xc0\x37"
+ "\x5a\x6e\xf0\xd8\x26\x46\x0d\xf6\x8d\xce\x81\xe8\x43\x4e\x34\x2a"
+ "\x60\x93\x64\x58\xf4\x27\x69\x2f\x88\x1e\x5a\xab\xd6\x03\x13\xcf"
+ "\x30\xdb\xf8\x6a\xf2\x29\xa9\x1f\x49\x78\x44\x5f\xb2\x83\xf7\x25"
+ "\xb1\xaf\xd8\x85\x69\x8b\x83\xfa\x93\x5d\xe8\x1b\x0f\xa7\xfe\xe4"
+ "\x45\x98\x78\x82\xfa\x94\x87\x39\xae\x4b\x84\x6b\x19\xe1\x72\xc2"
+ "\x44\x3b\xf7\xfb\x44\xda\xc6\xa0\x71\x33\xec\xd7\x4e\xe4\x7b\x99"
+ "\xca\x7e\x21\xc6\x9f\x73\x6a\xb2\x7a\xe4\x32\x90\x2f\x28\x95\xa3"
+ "\x4c\xd4\xc3\xc4\x30\xfd\x9f\x73\x95\xa2\x1f\x18\x3f\xd0\xff\x21"
+ "\x7c\x7e\xdb\xf8\x9f\xd6\x72\x9c\xf1\x09\x32\xce\x60\xb9\xcc\xdd"
+ "\xb2\x79\x7d\xfe\x86\xad\x85\x79\x86\xa2\xa5\x4b\x0d\x9b\xb6\x98"
+ "\xf2\x66\xcf\x9e\x3d\x32\x44\xfe\xa2\x84\x4f\xfb\x49\x0a\xc9\x21"
+ "\xf9\xb5\x92\x1c\xa6\xa0\xcf\x29\xf9\xcd\xf1\x65\xa1\xfd\x8b\x4f"
+ "\x52\x24\xff\x56\x87\x30\x89\x12\x4c\x43\x08\x0c\xe2\x93\x7c\x64"
+ "\xf2\x73\x47\x4b\x30\xad\x4a\x3c\x18\xc7\xfb\x45\xb4\xfe\xae\x57"
+ "\x94\xaf\x47\x81\xe7\x21\xa9\xbf\x83\x72\x3f\x4c\xea\x27\x4c\xd2"
+ "\x29\xf0\x3c\x14\xe8\x6f\xa8\x64\x98\xb9\xc1\x7d\x13\x7c\x4f\x95"
+ "\xeb\x24\xe0\xc7\x37\x77\x0b\xdc\x2a\x5d\xc0\xef\x9f\x54\xa0\xe8"
+ "\x4b\x8d\x0d\xe0\x06\x9d\x04\x53\x1e\x4a\x63\xf3\x25\xa9\xac\xda"
+ "\x20\x3c\xa7\x43\xf1\x34\xff\x97\x84\x27\x22\x08\xa6\x43\x41\x63"
+ "\xf7\x60\x1a\xed\xa3\x05\xee\x7a\xcc\xdf\x29\x95\x6d\xb2\xa2\xfc"
+ "\x08\xc3\x71\xc7\x21\x4c\xbc\x0c\x33\x37\xb8\x2f\x45\xfd\x39\xbe"
+ "\x26\x13\x26\x2f\x25\x79\xc2\x6b\x18\xd2\xfd\x97\xa0\x3e\xdd\x70"
+ "\x29\x9d\xb2\xfc\xa3\x7a\xb1\xbf\x50\x17\xd2\x4f\x9b\xac\x28\x3f"
+ "\xf6\x0d\x63\x65\x1e\x69\x64\x18\x65\xf9\x9d\x82\xc6\x98\x98\x40"
+ "\xf9\x27\x77\x28\xf0\x8c\x25\x99\x22\x5c\x41\x79\xf9\x14\x78\x3a"
+ "\x25\x3e\x06\xf1\x7a\x8a\x41\x51\x1f\xff\x29\xd1\x13\xc4\xeb\x29"
+ "\xa9\x0a\x3c\x57\x29\x3e\xb4\x5c\x53\xcc\x0a\x3c\x57\x03\xe5\x42"
+ "\x39\x16\x30\x07\x15\xfd\x58\x35\xb3\x7d\x30\x4a\x81\xa7\x51\x86"
+ "\xe9\x1d\xf6\x42\xbd\xa8\xdb\x29\x2d\xb2\x2d\x12\xf5\x1a\x9f\x48"
+ "\xb8\x31\xfc\x42\xb0\x2d\x40\xba\xba\x07\xf3\xc9\x00\x4a\x3e\x05"
+ "\xd1\x25\xf5\xc5\x0d\x09\x8a\xf2\x5d\x92\xf8\x34\x32\x08\x4f\x9a"
+ "\xa2\x7c\xff\x25\xe1\x89\x0c\x82\x51\xd4\x7f\x73\x8f\x84\x47\x13"
+ "\x04\xa3\x94\xff\xcb\x12\x9e\xe0\xbc\x4e\xdf\x9a\x4f\x86\x10\xf9"
+ "\x27\x5e\x61\x58\xcf\x2d\xc6\xa0\xb4\xe2\xdb\xc1\x54\x6c\xff\xde"
+ "\xaa\xe1\x6b\xa6\x63\x0b\x0f\xd2\xde\x52\x68\xa3\x53\xf8\xd8\xe0"
+ "\x0d\xb2\xd3\x53\xad\x75\x68\xcf\x44\x19\x20\x51\xd8\xee\xa9\x7c"
+ "\xbf\x10\x4c\x9b\xee\x84\xd1\xc5\xc1\xdf\x01\x9c\x30\xf5\xa0\x14"
+ "\x87\xe5\x1f\xd3\x21\xc7\x51\xb8\x18\x5f\x9c\x8a\xed\xdf\x78\x8b"
+ "\x68\xc7\xa6\x16\x48\xb0\x68\xf7\xe3\xd3\xc2\xad\x63\x1e\xea\xfb"
+ "\x4b\x91\x9e\xf9\x4b\xc7\xd3\xba\xe6\x6c\x9d\xdf\xc6\xc0\x61\xf5"
+ "\x82\x61\x02\x94\x76\xc2\x34\x2d\xf5\xf1\x0f\xef\x04\x6d\xa9\x85"
+ "\x79\x69\x0f\xdc\x76\x57\x0f\x94\xba\x58\x37\xed\x33\xbb\xfb\x1a"
+ "\x68\xe9\xbc\x84\xdd\xcf\x81\xbe\xa5\xe4\xcf\x61\xd7\xe6\xfa\xe9"
+ "\xdc\xc6\x78\x4a\xdb\x05\xed\x35\x5d\x50\x5a\x13\x9a\xb6\x74\x12"
+ "\xe8\xdb\x68\xcf\x5a\x1b\x44\x13\x1d\xf4\x3d\xc5\x17\x9b\xad\x2b"
+ "\x39\x06\x9a\x52\xf4\x2e\xdb\x4c\x76\x99\x96\x73\x44\xcb\xbe\x4b"
+ "\xa0\x7d\x6b\xbd\x5d\xbd\xf7\x12\xd1\x6b\xd6\xbd\xbb\xd3\xab\x6e"
+ "\xd6\x2f\x85\x66\xfd\x05\x68\xd1\xcf\x87\x16\x6b\x2a\x1c\xbe\x04"
+ "\x51\xcd\xde\x64\x68\xd1\x2c\x86\x96\x84\x54\x70\xf4\xe0\xb3\xa1"
+ "\x1f\x61\xdc\x7c\x1f\xa4\x8b\x30\xcd\x5e\xf5\x2c\x68\x9d\x02\x27"
+ "\xf2\x6c\xda\x59\x79\x4f\x1f\x7a\x0f\x57\x8e\xa2\xf1\xa0\x47\xfa"
+ "\xba\x91\x96\x07\x3a\x61\x7a\x64\x82\x1e\x12\xa9\xfd\x75\x54\xfb"
+ "\x40\x53\x02\x23\x86\x90\x8b\x38\xbe\x1f\x28\xfa\x51\xb5\x47\xb1"
+ "\xad\xc7\x7b\x2f\xca\x84\xc7\x36\x3d\x19\xf3\xbe\x20\x8d\x7b\xf5"
+ "\x94\x9e\x40\x39\xdb\x9e\x49\xfb\x83\x60\x3b\x3d\x3d\x53\x8e\xa3"
+ "\x7d\x4e\x69\xff\xd2\x39\x71\xa0\x73\xf8\x52\xe0\xfd\x1b\xdd\xb4"
+ "\x06\xbf\x87\xf6\x45\x20\x7c\xd8\xe6\x47\xd0\xf8\x13\xd2\x73\x17"
+ "\xb6\xf1\x3d\xd3\x11\x0e\xd3\x63\xfd\x9f\xe3\xfb\x1a\xb3\x71\x6b"
+ "\xdc\xfe\x71\x6b\xae\xf9\x5f\x5b\xd3\xcb\x5e\x5b\xf3\x65\xff\x6b"
+ "\x6b\xfe\x5a\xba\x03\xb4\xfd\xe3\xd6\xb8\xda\x2d\xbc\x0e\x74\xed"
+ "\x96\xcb\xb4\x9e\x5e\xbb\xeb\x32\xe8\x9e\x79\x0e\xeb\xde\xf7\x47"
+ "\xd8\x95\x0f\x7a\x7f\xcc\xfa\x56\x87\xef\x53\x78\xa6\x04\x18\x3e"
+ "\x77\x84\x2b\x5f\x6f\xac\x39\x5d\x1e\x4f\xf3\xd8\x12\x74\x4e\xcd"
+ "\x5a\xbe\xf6\xdf\x15\x63\x49\xc7\x2b\x03\xaf\x4c\xbc\xb2\x58\xac"
+ "\x39\x0b\x79\x55\x3a\x7a\x8f\x0a\x68\x1f\x9f\x39\x7e\x50\x5d\x82"
+ "\x84\x99\x48\xbf\x6e\x08\xbe\xc5\xfb\x2b\xdf\xa5\xfd\x7f\x77\xd3"
+ "\xfe\xbf\xe4\x03\x90\x7e\x91\x3f\x8a\xf9\x58\x31\x1f\x2e\xdf\xa8"
+ "\x23\x6e\x16\xfb\x6e\x19\xf9\x74\xee\xe7\xcd\x2a\xd7\xf3\x66\x75"
+ "\x6f\xec\xbb\x7b\x11\xa6\x06\x61\xca\x24\x1e\x76\x13\x2e\xd4\x1b"
+ "\xd7\x28\x1f\x44\x20\x4e\xcb\xcf\xaf\x77\x68\x8e\x1f\x65\x17\x10"
+ "\xae\x65\x00\x17\xe2\xae\xe2\x7e\x52\x42\x87\x1c\x46\x7e\xd2\x21"
+ "\x84\xa3\xf4\x0e\x6f\x0a\x7d\x33\x74\x3a\x0a\xba\x69\x1f\x8b\x91"
+ "\xac\x4f\xe4\x47\x3e\x1c\xe9\xea\x28\x2f\x0c\xf3\xd8\x20\x9d\x70"
+ "\x53\x3a\x47\x4f\x37\x60\xba\xbd\xac\xd4\x8c\xfe\x22\x2c\xf7\x30"
+ "\xb3\x8a\xf6\xb4\x6d\xc6\xf4\x22\xef\x19\x29\x32\x8d\x94\x07\xdf"
+ "\xd3\x96\xe8\x44\x79\x68\x2e\xf0\xc2\xa8\x6a\x1a\x27\x87\x55\x84"
+ "\x8f\x70\xa1\x1c\x38\xb1\xac\x7b\x9b\x0b\x5c\xe0\x67\x21\x38\x9d"
+ "\x12\xbe\xf2\x10\x7c\x18\xce\x10\x1f\xc9\x5f\x0b\xa6\x19\x55\xcf"
+ "\xf1\xad\xfc\xb9\x9f\xf0\x79\x41\x63\xe0\xf4\x3e\x4e\x38\xf8\x9e"
+ "\xd4\x88\xd3\xbe\xed\x61\xf4\x1d\x67\x78\x5d\xa5\xe6\x08\xbe\x7e"
+ "\x1e\xd3\xbf\xbb\xbb\x3b\x92\xf5\x66\x46\x8c\xe6\x6b\xe7\x1f\x06"
+ "\xfa\xd6\x8a\x30\xbf\x63\xbd\xe6\x88\x51\x3d\xe8\xeb\x21\x0c\xed"
+ "\xa7\x45\x74\x06\xd7\xe5\xca\x45\x8f\xcf\x87\xc7\x53\x97\xa4\xce"
+ "\x87\x65\x0f\x2d\x9c\x0f\x89\x0f\xcc\x4a\x9c\xfb\xbd\x1f\x7c\x8f"
+ "\x3f\x7c\xef\x07\x49\xdf\x83\xf4\x27\x56\xce\x87\xf4\xe5\xf3\x61"
+ "\x15\x5e\xe9\xab\x16\xad\x4c\x5d\xb4\x6a\x3e\x64\x2e\x5e\x82\x6f"
+ "\x0b\xe7\xdf\x9b\xf8\xc8\xac\xf4\x85\x4b\x16\xc1\x63\x19\xf7\x25"
+ "\xde\x77\x1f\x3c\xb4\x68\xe9\xbd\x89\x89\xd2\xfd\xde\x44\x02\x79"
+ "\x2a\x69\xd1\xaa\x59\xe9\x85\x5b\x8a\xb7\xcc\x5a\xbe\x64\x21\x85"
+ "\xc0\xa2\x45\xf3\xd3\x43\xfc\x48\x63\xff\xf5\x7e\xe2\xb7\x9b\x5d"
+ "\x4d\xa3\x7d\x8c\xa1\x16\xe5\x00\xaf\x1e\xbe\x3f\x12\xdc\xf9\x6f"
+ "\xb5\x54\x7f\xbc\x2d\xb8\x23\x8e\xda\x53\x8f\xed\x0e\xaa\x7f\x3b"
+ "\xf1\x91\xf6\x12\xbe\x08\xb3\xe7\x63\xdc\x78\xc9\x1f\x89\xc4\x78"
+ "\x6f\x68\xfc\x5d\x59\x18\x3f\x85\xf6\xdb\x71\xe0\x85\xbc\x77\xa3"
+ "\x3d\x44\x1e\xbb\xa0\xb7\x34\x33\x92\xef\x77\x88\xf5\x4e\xfb\x50"
+ "\x78\x6c\x77\xce\x0d\xd2\xfb\x2e\xda\xaf\x82\xc6\x93\xaf\xc0\x9d"
+ "\xa3\xda\x8b\x53\x68\x4f\x2a\x70\x14\x4b\x38\xae\x0d\xe0\x18\x29"
+ "\xed\x99\xe8\xac\xa5\xbd\x40\x04\x9e\x92\x20\x1b\xe1\x24\x3c\x87"
+ "\x31\x4e\xc2\xf5\x58\x3b\xda\x0a\xb4\xe5\x13\xfc\xa5\x46\x60\xb1"
+ "\xd9\x7a\x7f\x9f\x11\xc4\xf8\xeb\x9d\xa7\x83\x64\xdb\xdd\x62\x45"
+ "\xb8\xb7\xd2\x54\xb4\x2f\x03\xdf\xa3\x01\xee\xb0\xa3\x8c\xbb\xfb"
+ "\x2b\x2d\x39\xec\x2a\xdf\x17\x71\x18\x96\x6f\x16\x96\x2f\xc1\x5f"
+ "\x69\xc9\xe6\x7b\x8c\x72\x38\x63\x1c\xa3\xf7\x58\x84\xeb\x1b\x08"
+ "\x1b\x43\x61\x1e\xfa\xbe\x43\x7b\x76\x33\x1e\x1e\x81\xe1\x9f\xa2"
+ "\x5d\xeb\x40\xd8\x6c\x82\x9d\xe3\x83\xe1\x7c\x3f\x94\x52\x15\x74"
+ "\x82\x31\xcb\x1f\x6b\x59\x17\x94\x1f\xe1\xc9\x12\xed\x18\xd6\xc5"
+ "\x55\xc4\xd3\xcb\xc3\xd5\x18\xfe\x0b\xc4\x9f\x4b\xf6\x52\xd8\xf0"
+ "\xd9\x7c\x7f\x22\x69\x4c\x3e\xf0\x4e\xfb\x3d\xef\x16\xef\xcd\xc8"
+ "\x4b\xfa\x4e\x40\xdf\xf8\x3d\x36\x23\xfa\x3f\x09\x69\xa2\xad\x9c"
+ "\xcd\xf3\xa0\xfd\x65\x99\xee\xcb\x46\xc4\x6b\xb2\xef\xec\xe1\x67"
+ "\x04\x39\xc1\x58\xe0\x2f\x35\x83\x82\x26\x23\xd1\x4f\x36\x04\x79"
+ "\x31\x0b\xe5\x60\x84\xc7\x76\x17\x28\xe4\x20\x1e\xf1\xe4\x20\x7d"
+ "\x1d\x58\xa6\x1c\xc4\x93\xe0\xef\x35\x63\xbe\xd8\x5f\x64\x66\xf4"
+ "\x95\x02\x38\xa4\xf4\x29\xa1\xe9\xef\xec\xa2\x74\x08\x1f\xe9\xe9"
+ "\x25\xf8\x3b\xbb\x89\xe7\x92\xdc\xa1\x5c\xde\x65\x51\xc8\xe5\x54"
+ "\xa4\xe5\xfb\x41\xf1\xe5\x8a\xf8\x48\x8c\xff\xa1\x14\x8f\xba\x7f"
+ "\x57\xa3\x82\xde\xb3\x18\xbf\x00\xe9\x75\xa3\x6e\x47\x60\x7e\x0d"
+ "\xb5\x92\x6f\x22\xc1\x3b\x15\xf0\x3e\x84\x5f\x48\x72\x43\xed\x0e"
+ "\xc1\xd7\x49\xba\x83\xf0\x5a\x8f\xed\x6e\x5d\x28\xfc\xac\x3f\x23"
+ "\xfc\xd2\x00\x7d\x77\x27\x86\xc6\xdf\xed\xc5\xf8\xc7\x48\xd6\xf1"
+ "\xfe\x34\xf9\xfa\x64\x4f\xc8\x96\x35\x17\x50\x7d\xdd\x9d\xad\x80"
+ "\x2f\x43\x38\x93\xc4\x23\xb5\xc4\xa3\x06\xa9\xef\x7e\x41\xa2\xa1"
+ "\x4a\x91\xe6\x34\xa6\x29\x40\x3e\xe6\xc8\x72\x19\x26\x4d\xab\x22"
+ "\x4d\x37\xd5\x23\x13\xf9\x68\x3c\x7d\x81\x34\x92\x9d\x0c\xc6\x41"
+ "\x65\xbb\xcd\x63\xbb\x27\x4a\x51\xf6\x54\xcc\xb7\xf8\x90\xb0\x3b"
+ "\xb7\xa1\x0c\xdd\x87\x61\xf7\x23\xce\x3c\xd2\x81\xc3\xe4\x0f\xba"
+ "\xbc\xc0\x4a\xd3\xa2\x84\xec\xde\xb3\x69\xb4\x0f\xe8\x79\x16\x3d"
+ "\x13\x6e\xe6\x59\x2a\xe9\xe4\x3d\x9b\xf0\x4e\xe1\xfc\x7c\x1b\xb2"
+ "\xc3\xcc\xf3\x23\xbf\xc0\x79\x4f\x05\x9d\x7f\x86\xef\xfd\x52\x1e"
+ "\xb3\x68\x0f\x51\xa4\x7f\x1d\xb6\x3b\xc0\xb6\x23\xdc\x4e\x58\x88"
+ "\xe1\x93\xb8\xae\x0a\x38\xfe\x2e\xf2\x48\x23\xf9\x9e\x8b\xef\x63"
+ "\xa4\xf4\xa3\x08\x1f\x3e\xdf\x2b\x3d\xab\xfa\x09\xd7\x55\x59\x07"
+ "\x67\xf1\xfd\xe4\x48\x0f\x39\x7e\x4c\x4f\xfb\xb5\x0a\x9c\x33\xff"
+ "\x8a\xf7\x25\x78\xff\x23\xde\x1f\xc3\xfb\x2f\x68\xff\xd4\xd2\x7e"
+ "\xae\x8f\xf4\xfe\x36\xde\x57\xe2\xbd\x02\xef\xab\xf0\xbe\x0b\xef"
+ "\x0f\xe3\xfd\x49\xd2\x0b\xda\x0b\x9e\xf6\xb4\xc1\xb6\x55\xc8\x16"
+ "\x7d\xfb\xf3\xa4\x11\x0f\x16\x21\x4c\x2a\xd7\x57\x61\x5f\xb4\xa2"
+ "\x1e\x67\xf2\xf3\x87\x50\x1e\x28\x6c\xb8\x90\x07\x11\xd6\x2f\xdb"
+ "\xa1\xab\x81\x30\xc9\x36\x49\xba\x28\x85\x09\xfc\xe9\x88\x3f\x9e"
+ "\x68\x65\x02\x57\xa4\xa8\x73\x09\xbf\x48\xa7\x09\x93\xa7\x2a\x38"
+ "\x4f\x27\xdc\xe3\xa2\xfd\x90\xf0\x7e\x81\xef\x37\x09\xb3\xa2\x18"
+ "\x97\x7b\x6c\x67\x39\xbe\x7b\x9a\x24\xb8\x72\xe2\x31\x4f\x2f\xc2"
+ "\x67\x06\xc9\x52\xac\xc7\x36\x2b\x53\x21\x4b\xe8\xeb\xdf\xf1\x02"
+ "\xc9\x0c\xf1\x9d\xca\x36\xda\xc2\xdb\x72\x5e\x16\x8e\xff\xaa\x90"
+ "\xc9\x5a\x69\x6e\x92\xd0\xdf\x59\xf5\x0a\x3c\x67\x10\xcf\x8f\x15"
+ "\xfa\xde\x13\x68\xd7\x66\x9d\x53\xd8\xa3\x06\xcc\xef\xbc\x13\xf5"
+ "\x41\xb2\xab\xee\x88\x12\xd2\x97\x59\x5e\x27\x5c\xe2\x7e\x1e\xc6"
+ "\xaf\x27\x3c\xee\x52\xbe\x8f\xbf\x3b\xc2\x42\xe5\x9d\xad\x97\xe3"
+ "\x79\x5c\x4c\x23\x6f\xcf\x22\x0a\x78\x1c\xb6\x7f\xd3\x75\x72\x1c"
+ "\x88\xfd\xe1\xdc\x11\xc5\x3c\x2e\x3d\x80\x37\x3b\x49\xc2\x1b\x11"
+ "\xf6\x0c\x86\xf2\x6c\xe3\x2c\x00\xf5\xdd\x65\x10\xe9\xf0\x9d\x87"
+ "\x15\x3e\xd6\x3f\xab\x0c\x46\x38\x7c\xa7\xe0\x2e\x80\x18\x87\xef"
+ "\x02\xdc\x0d\x30\xd5\xe1\xab\x42\x7f\xa5\x81\xe2\xdf\xbf\x13\x54"
+ "\x2a\xbc\x97\xde\x51\xa6\x56\x39\x7c\xc5\x90\x50\xa6\xc1\x7b\x01"
+ "\x2c\x8e\x64\x1e\x87\x6f\x29\xc2\x99\x60\x45\x3f\xbb\x9a\x1a\xc9"
+ "\x3e\x5b\xdb\x0f\xba\xa5\xfb\x59\xa9\xc3\x87\x7d\x07\xdf\x59\x0c"
+ "\xf7\xb3\x15\xfd\x5f\xe1\xe5\x61\xfe\xf2\xec\xa4\x15\xfd\x57\xd9"
+ "\xc2\xfd\xef\xe3\xfb\x67\x0c\xeb\x92\x39\x7c\xc9\xd0\xee\x76\x23"
+ "\x5c\x29\x63\x15\xd9\xc6\x67\xae\xa9\xa1\x8f\xce\x4d\xa8\xc8\x4e"
+ "\xc2\xb2\xa4\xf5\x61\x39\xb0\x1d\x7e\xa4\xef\x79\xbc\x57\x66\x2f"
+ "\xe6\xef\xe5\xd9\x99\x4c\x97\x9d\x36\x1b\x3b\x62\x54\x06\x87\xaf"
+ "\x0b\xd6\x62\x57\x62\xc5\x0e\x17\x23\xfa\x47\xef\xa1\x7e\x58\x32"
+ "\xed\xb9\x1c\xbd\x62\x47\x29\xc3\x38\x2d\x8b\xc9\x4e\x73\xf8\x7a"
+ "\x00\xf3\xc8\x44\x7c\xab\x39\xbe\xf2\x6c\x2b\xc2\xba\x08\x2e\x18"
+ "\x0f\xe1\x20\xd8\x15\xfd\x10\x8d\xf0\xd6\xbe\x98\x6c\x33\x5e\x07"
+ "\xf0\x6a\xc2\xb4\x9f\x30\x5b\xdc\xaf\x68\xdf\x4c\x4c\x8f\x6d\x73"
+ "\x76\xb7\x97\xce\x78\x20\x5e\xf6\xc3\x70\x84\xef\x40\xb9\x4a\x45"
+ "\xf9\x44\x7a\x73\xb4\x9c\xde\xca\x9c\xe1\x5e\x5e\x8e\x9c\x61\xa2"
+ "\x1c\x39\x91\x14\xde\x8b\xb2\x83\xcf\xc6\x5e\x11\x77\x27\xa6\xcb"
+ "\xe0\xe9\xca\x73\x8c\x4c\x97\x93\xe4\x45\x3d\x44\xbe\x96\x11\x1f"
+ "\x91\xaf\x65\xc4\x4b\x56\x91\x63\x74\x58\x0f\x02\x8b\xc9\x49\xea"
+ "\x8b\xc9\x49\xc3\xf4\x4f\xf5\x71\x5f\x25\xc7\xec\x15\xb8\x37\x20"
+ "\x9e\x2c\x94\xef\x08\xc4\x61\x46\x5c\xd6\x3e\x9b\x01\x56\xec\x60"
+ "\xde\x15\xbe\x3d\xbe\xb5\x3b\x20\x62\x26\x94\x21\xbd\xef\x21\x8f"
+ "\x4c\x58\xce\x16\xbc\xa7\x62\x3c\xdc\x8e\x79\xbd\x8f\x78\xcd\x94"
+ "\x1f\xe6\x63\x45\x9c\x5b\x11\x97\x89\x68\xfa\x8a\xce\x52\x8b\xcd"
+ "\x39\xf0\x95\xa0\xef\xa4\xbf\x3c\xa7\xd5\xaf\xcb\x69\x92\x65\x88"
+ "\xe4\x47\xf0\xad\x0a\x96\xbb\x99\xcf\xe1\x3b\x8e\xad\x0e\xf6\x91"
+ "\xdc\x17\x28\x1e\xfb\x4a\xa7\xb0\x9e\x49\xa6\x8a\xf1\xde\x00\x24"
+ "\x3f\xed\x96\xfd\x04\xfb\x3e\xc9\xd0\x72\x8b\x7b\xcf\x2c\xb0\xa8"
+ "\xf0\xbd\x74\xad\x4f\x0b\xcf\x58\x34\x65\xfd\xe5\x39\xd5\xed\x16"
+ "\xaa\x97\xf3\x98\x86\xd2\x15\x40\xb4\x0a\xfb\x0b\x2a\xe6\x8b\xb6"
+ "\xba\x34\xa3\xcc\xa5\xac\xdd\xbd\x14\x61\x2d\x40\xe5\x21\x39\x22"
+ "\xf8\x65\x3d\xcc\xd9\xaf\x5b\x97\x46\x65\x63\xa3\xcb\xa0\xad\xe7"
+ "\x7e\xa0\x3e\x5b\x5b\x4f\x03\xc9\xa9\x9f\xe9\xd6\xe9\x51\x46\xfb"
+ "\x96\xf5\x94\x45\x3e\x73\x0d\x54\x18\xd6\xdf\x66\x3e\x85\xf1\x2d"
+ "\x08\x77\x96\xcb\xed\xf2\x6b\xbe\x68\x9f\x2e\xe7\x80\xaf\x7c\x9d"
+ "\x71\xf9\xb5\x3e\xd6\x66\xae\x82\xa7\x7b\xca\x90\x57\xa7\x60\xd9"
+ "\x65\x5f\x44\xbb\xc5\x84\x30\x1e\x0c\x6f\xe0\xf2\xbf\xec\x72\x2f"
+ "\x5b\xfe\x1c\xbb\xba\xfc\xda\x67\x6c\x99\x99\xbd\xbf\xd6\x0a\xa3"
+ "\x6f\xdb\xc3\xfc\xa4\x17\x67\xbb\x4e\xc1\x6d\x17\x68\x4f\xfd\x54"
+ "\x58\x9a\xe3\x67\xcb\x2e\x5f\x65\xcf\x3c\x47\xbc\x49\x86\x36\x33"
+ "\xea\x8f\xb5\x8a\xf8\x7d\xb2\xcd\x7c\x06\xf3\x4f\x45\xbc\xa5\xcc"
+ "\x61\x3d\x8e\xb0\xf6\xe8\xa7\x2f\xeb\xe0\x6c\x57\x15\xf8\x62\x72"
+ "\x0e\xf4\x57\xe4\x54\xfb\x63\x72\x9a\xfc\x15\x39\xad\x2c\x66\x9d"
+ "\xde\x57\xb1\xce\xd8\x1f\xb3\x0e\x65\x60\x5d\x35\xd6\xd3\x08\xaa"
+ "\xf3\x1b\x36\x30\xe0\xfb\xd1\x1b\x54\xff\xe5\xeb\x4e\x62\x59\x5b"
+ "\xd1\x37\x66\x42\xf6\xd7\x9d\xa4\x71\x08\x4c\xdb\xda\x17\xb3\xae"
+ "\x09\xe1\x5a\x85\x7e\xad\xeb\x20\xb9\xa4\xf1\x7e\x0c\xfb\x0f\xec"
+ "\x23\x45\x60\x7c\x37\x5e\xde\xbe\x98\x5c\x2d\xab\xcc\xcd\x44\xfc"
+ "\x31\x5c\xa6\xca\x73\x33\xd9\x83\xe5\xe8\x6b\x5f\x43\x3c\xb9\xd6"
+ "\x15\xfd\x0b\x18\xf2\x10\xf5\x24\x37\xd3\x5f\x91\x6b\x66\xb1\xb9"
+ "\xd5\x5e\x2e\xfb\xb9\xaf\x11\xee\xbe\xe7\x8d\x34\x3e\xa1\xc1\xf8"
+ "\x93\xac\xd2\x34\xc1\x4b\xb2\xaa\x33\xe9\xfd\x3a\x93\x95\x95\x9b"
+ "\x8c\x3f\xda\xcf\x5c\xfd\xe5\xa6\x34\x7f\xb9\x29\xc9\x37\x0c\x7d"
+ "\x78\xeb\x19\x20\xfb\xe4\xfb\x25\x43\x1e\x7c\x88\xfc\x68\xe0\xf5"
+ "\xef\xb0\xa2\x0e\xec\x98\x50\xd6\xd6\x83\xb2\x60\xf9\x47\x6e\x9b"
+ "\xda\xdd\xe7\x39\x4f\x59\x8c\x49\x4f\x32\x45\xf5\xfb\x8c\x05\xca"
+ "\x58\x85\xc9\xe8\xaf\x30\x25\xf5\x57\x20\xde\x18\xcc\x27\x76\xfd"
+ "\xbf\x7a\xb9\xbe\xae\x47\x79\x3d\x03\x74\xee\xa5\x90\xf1\xf5\x4d"
+ "\x43\xd9\x48\xb2\x55\x64\x9f\x56\xf8\xbc\x24\x33\x7f\x21\xbb\x26"
+ "\xec\x14\xac\x95\xed\x14\xd9\x28\xea\x17\x91\x9d\xf2\x4b\x76\xca"
+ "\x2f\xd9\x29\xfe\xae\x43\x5b\x53\x9e\x9d\x46\xf6\x68\x85\x55\xd8"
+ "\x99\x15\xfd\x89\x0c\x65\x23\x0a\x71\xa4\x89\xba\x40\x98\xca\xec"
+ "\xd5\x1c\x9e\xf3\x29\xdb\xea\x47\x7b\x83\xd7\x01\xbf\xb0\x37\xad"
+ "\x92\xbd\x51\xcb\xf6\x86\xce\x64\x43\x9d\xf2\x87\xb3\x37\x7e\xc9"
+ "\xde\xf4\x33\x61\x6f\xfc\x92\xbd\xa1\xf0\x7e\xc9\xde\xf4\x87\xb1"
+ "\x37\xa8\xcf\x54\xde\x08\xc9\xce\x94\x91\x9d\xa1\xf2\xa2\xac\x25"
+ "\xf9\x85\x9d\xc9\xc4\x3e\x91\x9a\xec\x4c\x3f\xa6\xf1\xcb\x76\xc6"
+ "\xc3\xd3\x5b\xc9\xd6\xf4\xbd\x00\x68\x3f\x0d\x40\x36\x86\xdb\x13"
+ "\xdf\x54\x1f\xd9\x13\xe4\xdf\x02\xa5\x3d\x41\x7c\x07\xf0\x59\x27"
+ "\xd9\xa9\xa6\xe8\x3d\xcc\x87\xf6\xa4\x7a\x85\xd5\x8d\x75\xfd\x47"
+ "\x88\xf6\xa1\xdd\xb6\x16\x97\x39\xac\x3e\x40\x3b\xd0\xca\xda\xcb"
+ "\x00\x69\x44\xf9\xed\x47\x5b\x01\x80\x7a\xa9\xf7\xa1\x8e\xa3\x8c"
+ "\x1b\xdb\x2d\x9f\x42\x3f\xea\xea\xb2\x9e\x5e\xc7\x33\x6e\xa3\x6e"
+ "\xd9\x65\xe6\x42\xfe\x38\x9f\xb1\x94\xa1\x7d\x31\xba\xda\x7a\xde"
+ "\x83\xa5\x5d\xcc\xbf\x34\xdb\x69\x40\x1d\x30\x2e\xcb\xb7\x47\xd3"
+ "\x99\xa3\xcb\xaf\x31\x3b\xda\xc5\x7f\x5f\x76\x59\x17\x9d\xd5\x05"
+ "\x93\x97\xe6\x30\x7f\x3f\xea\x19\x96\xb7\x1a\xcb\x7d\x12\x69\x6f"
+ "\x42\x9d\x6b\x45\x3d\xd3\xfb\x14\x7a\x86\x3a\x73\x14\x9f\x0d\x82"
+ "\x7f\xeb\x5a\x51\xcf\x4e\xfa\x79\x7b\xd6\xc5\xfb\xa2\x98\x4f\x2b"
+ "\x8d\xdb\xa1\xae\x9d\xf4\x57\x08\x5d\xf3\x8b\x74\x1d\x7e\xe2\x9f"
+ "\x5a\xd2\x35\xac\x0b\x8c\xef\xc6\xcb\x8b\xfa\x13\x5e\xd7\x2c\x41"
+ "\xba\xf6\x9c\xa4\x6b\x31\x42\xd7\xb0\x4e\x23\xfa\x9f\x17\xfa\x46"
+ "\xf8\xa9\xbf\x3a\xa0\x6f\xb1\x26\x3d\x9d\x0d\x20\x64\x87\xeb\x1c"
+ "\xb6\x2b\xa6\x34\xd4\xb7\x24\xd4\x37\xc4\xc7\x5c\x64\x37\x51\x36"
+ "\xff\x44\x6d\xdd\x72\x0b\xfb\xd3\xda\xfe\x09\x65\xa8\x4f\x69\x68"
+ "\xcb\x3e\x43\x3b\xfa\xa7\x67\xdc\x50\x8f\xfa\xa4\x47\x3d\x32\xa2"
+ "\x3e\x25\xa1\x5e\x91\x3e\x35\xf5\x3f\x4f\x38\xd7\x37\x0d\xe0\xe0"
+ "\x6d\x65\xa8\x3e\xdd\x6c\xdc\xd4\x63\xfb\x81\xc6\x09\x5f\xf1\xf1"
+ "\x57\x7c\xd6\x39\xe1\x46\xaa\xf4\x1c\xef\x84\x3f\x68\xb8\x2f\x83"
+ "\x7a\x68\xd9\x0d\x63\x2e\xc1\x0f\xce\xa1\xcc\x03\x3e\x47\xe1\xf3"
+ "\xf9\x15\x77\xbd\x8f\xbe\xc4\x1f\xba\x31\x6f\x0f\xe9\x22\xb3\xcd"
+ "\x25\x5f\x2e\x05\x65\x51\xcb\x3c\x74\x46\x6d\x51\x21\x9d\x51\x4b"
+ "\x67\xd2\xe2\xfb\x68\xe4\x41\x02\xde\x63\x8f\x5f\x87\x38\xbc\xe8"
+ "\x5c\xca\x32\xf2\x9f\xf0\x39\x91\x6d\xd7\x8f\x3c\xbc\x0d\x66\x46"
+ "\xbb\xc5\x59\xb4\x74\x76\x2e\xfa\xd1\x71\xf4\xcc\x6c\x9f\x19\xeb"
+ "\xae\x4b\xe7\xd1\xc6\x60\x7e\x74\x1e\x6d\x91\x11\xea\x0a\xf9\x19"
+ "\x59\xfa\x3a\x1b\x6b\xec\xf7\x70\xbd\x34\xca\xb4\x10\x6d\x48\xe7"
+ "\x24\xa4\xb3\x6b\xf5\x8e\x14\xf8\xd0\x1a\x7e\xdf\x45\x8f\x2d\x69"
+ "\xa0\xfc\x43\xc4\x27\xc8\x3c\x19\x22\x3e\x55\xe6\xd3\x50\x73\x3b"
+ "\xa9\x9d\xee\xdf\xc6\x7a\x68\x0f\x6f\x1a\x37\x28\xf5\xb1\xff\xa4"
+ "\xb3\x68\x77\xf7\x83\x76\x85\xd5\xcb\x1c\x3d\xcc\xee\xb0\x5e\x86"
+ "\x3a\xda\x57\xbc\x84\xf9\xfd\x31\x45\x19\xac\xa2\x28\xbd\x77\x1b"
+ "\xf3\xd1\xb8\x0f\xe6\x71\xd2\x09\x6b\xea\x45\x5d\xe4\x9c\xe4\xfd"
+ "\x4d\x5d\x51\x3a\xe2\x8a\x21\x5c\x6d\x98\xbe\xbf\xa2\x08\xe5\x35"
+ "\xe9\x9c\x53\xa5\xe5\x7b\xee\xa2\x2e\x9f\xb4\xec\x84\x89\x97\xe0"
+ "\x01\x2d\xef\x27\x94\x17\x99\xc9\x26\x60\x98\x0e\xc3\xe2\x10\x7f"
+ "\x81\xc7\xf6\x00\xfa\xdc\xbd\x55\xc2\x97\x7d\x20\x4e\x86\x73\x42"
+ "\x52\xb7\x72\xde\x9a\xb4\x4a\xb2\x2c\x64\x1f\x38\x15\x84\xee\x6a"
+ "\x47\x3b\xc8\xa5\x84\x8f\x0e\xd8\xf4\x75\x46\x3a\x8f\xab\x74\x17"
+ "\xc4\x63\xfd\x10\x7d\x2f\x61\x9f\xe3\x22\xb3\x3d\x60\x78\x6b\xa7"
+ "\x17\xfb\x14\x0f\x54\x39\xe1\x93\x21\xf9\xe9\xbf\xce\xba\x90\x07"
+ "\xad\x47\xb6\x01\x10\x7f\x88\x9f\xa8\x37\x7e\xe4\xc3\xe7\x64\x93"
+ "\xea\xb6\x51\xbf\xfb\x81\x0e\x99\x5f\x43\xd7\x49\x91\x49\xf4\x4d"
+ "\xe7\x25\x31\x1b\x03\xfb\x64\xfa\x8e\x31\xef\x01\xc1\x83\x75\x4d"
+ "\xbd\x68\x47\x68\x4c\x99\xce\xce\x2a\xd2\x33\xaf\xc7\x36\x6f\xa6"
+ "\x13\x1e\x6e\x95\xc6\xab\xdc\x0e\xdf\x22\xb2\x2d\x61\xdb\x2d\xbe"
+ "\x67\xe9\x00\xfe\x1f\x66\xb6\xc7\xa3\x1d\xe2\xb6\xa9\x31\x75\xb7"
+ "\xa8\x7f\x2f\xe1\xa5\xb5\x1e\x5d\x18\x5f\xe4\x66\xdd\xac\xbc\x31"
+ "\x89\xfa\x11\xb4\xff\x27\x86\x3d\x89\x72\xcd\xec\x85\x44\xd3\x0f"
+ "\x9f\xb4\x4f\xbe\x01\x17\xad\x10\x51\x37\x30\x4e\xf4\xc3\x54\x1a"
+ "\x17\x12\xe3\x61\xf3\x5a\x9c\xb0\xc8\x24\xd3\x45\x3e\x06\xf2\x96"
+ "\xf8\x7c\x92\x7c\x0d\xfa\x4e\x51\x54\xc2\xbc\xe4\x73\x20\xac\x4b"
+ "\x2e\x03\x95\x4f\x94\xeb\x87\x9a\xe0\x72\xd1\xb7\xfb\xe8\x12\xc1"
+ "\x83\xa2\x1d\xa0\xe5\x67\xf9\xf4\xd3\x77\x8e\x45\xbc\x2c\x54\x66"
+ "\x5e\x16\x6e\x63\xb1\x8d\xf0\xdd\x8f\x32\xc4\xc3\x5b\x11\x17\xf6"
+ "\x7f\x16\x9e\x13\xf2\x34\xaf\x65\xa8\x35\x2c\x28\x9b\x56\xec\xab"
+ "\x4e\x2e\xf5\xb3\x4e\xc4\xf9\x47\x31\xc6\xf6\xc3\x3f\xfa\xc9\xcf"
+ "\xf6\x92\xec\xee\x30\x51\x9b\xec\x28\x21\x7b\xcb\x61\x6f\x47\xd8"
+ "\x2e\x84\x69\x93\x60\xdb\xf8\x59\x89\xe2\x3e\x9c\xee\xd8\x8e\x6d"
+ "\x45\x3a\xba\x5c\xbc\xbd\x6f\x04\xf9\x1d\xfb\xf8\xd8\x4f\xfc\x61"
+ "\x0d\xab\xd8\x61\x0a\x4f\x8b\xc9\x4a\xed\x59\xff\x75\xd6\x83\xf9"
+ "\x8c\x23\x39\x2a\xdd\x01\xe3\x51\x26\x3f\xdf\xbd\x0b\xc6\x90\x8c"
+ "\xb1\x98\x22\x8b\xe0\x7b\x72\x22\xb3\xa1\xef\x89\x16\xd5\xb2\x0d"
+ "\x26\xa2\x0e\x99\x2f\x41\xf2\xa2\xb5\x25\x06\xa4\x15\xe0\xc8\x15"
+ "\x20\x1f\xe5\x33\x84\x2f\x70\xf8\xfe\x4c\xe7\x8e\xa3\x2c\x26\x9b"
+ "\x64\x59\xc4\x67\xcb\xcd\x6c\x05\xf2\xd5\x2b\xc6\x28\x92\xff\x48"
+ "\xdf\x24\x3a\x21\xb9\x95\xca\x2b\xe6\x40\x27\xff\x82\x5d\x67\xf1"
+ "\x4c\xb4\x69\xdd\x4e\x48\x76\xe3\xdd\xcb\x2f\xb4\x25\xd2\x7b\x37"
+ "\xc2\x9d\x64\xd7\xfb\x09\x06\xfb\xb8\xc9\x76\x66\x53\x91\x9e\xd4"
+ "\x60\xde\x3d\x4e\x78\x46\xec\xc7\x0d\xc9\x4d\x84\x6b\x08\x1a\xba"
+ "\x19\xdf\xff\xf6\x4b\x2c\xef\xfc\xd5\x86\xdd\x34\xc6\x39\xff\x2e"
+ "\xae\x17\x88\xab\x4e\x2d\x6c\xb6\x1f\x69\xad\xb5\xf9\xcd\x68\x9f"
+ "\xcd\xfe\xca\x92\x24\xfe\x2c\xc5\x31\xa9\x1d\x0d\x8f\xbf\x31\x95"
+ "\x9f\xc7\x08\xf3\x1b\x05\x9e\xc6\x24\xfb\x84\x4b\xf4\xfe\x53\x7a"
+ "\x77\xeb\x76\x25\x39\xaa\x53\xc4\x19\x91\x08\x23\xfa\xf1\xf3\x7f"
+ "\xda\x8b\x79\x78\x6c\xf3\x1b\x9d\xb0\xb8\x5e\x7c\x9f\xd9\x15\x76"
+ "\xdf\x6e\xbe\x3e\x0a\x75\x80\x74\x4e\xe8\xf4\x82\xfd\x6d\xf5\x5c"
+ "\xff\x3a\x50\xe6\xbd\x92\xfd\xa5\xf1\x9c\xa8\x4e\x58\xb0\xaf\x4d"
+ "\xcf\xe5\x5b\xcd\xd4\x0f\xea\x42\xce\x78\xc3\xb8\xc1\xd7\x83\xa9"
+ "\x78\x65\xe0\x95\x2d\xbd\x17\xe0\x85\x65\x7e\xf0\x1c\xbe\x17\x73"
+ "\xde\xbd\x61\x52\x39\x31\xae\x17\x7d\x76\x7a\x77\xc2\x83\x4b\xd9"
+ "\x1b\x09\x6a\xf9\xb9\xee\x18\x8d\x13\x3c\x68\x75\xc2\x7c\x10\x75"
+ "\xb1\x80\xcf\xdd\x41\xda\x88\xef\xac\xb4\x9a\x79\x5b\x76\xbb\x91"
+ "\xee\x07\x4f\xb6\x54\xbb\xc1\x70\x07\x95\xff\xc1\x53\x54\x26\x9a"
+ "\xc3\x42\xf7\xa2\x6a\xe6\x6a\xae\xf1\x01\x7d\xcb\x43\x5c\xa8\xff"
+ "\x75\x09\x62\xcc\xa1\xd1\x42\xf8\x24\x99\x60\x72\xf9\x05\x9f\x77"
+ "\x25\x19\xb6\xa9\xe8\x3d\xa6\xf6\x28\x1f\x87\x39\xcf\x4a\x33\xa5"
+ "\xb9\x0b\x0b\x46\xa0\x9e\x2f\xa0\xb3\x1e\xaf\xc0\x82\x65\x0c\x79"
+ "\xdd\x6c\xe6\x67\x49\xb9\xb0\xfd\xe9\xa9\xe5\xf3\x8d\x16\xa0\xfd"
+ "\x9b\x9f\xcd\xbf\xcd\x60\x38\xb7\x35\x88\xf3\x30\xc6\x61\x7b\xd4"
+ "\xd3\x66\xf6\x42\x3f\x95\x19\xd3\xbe\x77\xdd\xab\xa1\xb3\x2e\x77"
+ "\x5b\x18\xa7\x83\x61\x5d\x09\x5b\xf6\xa0\x73\xd7\x65\xe6\x95\xcb"
+ "\xdc\x5c\x4f\xfa\xb1\x60\x9f\x13\xde\x39\x3f\xa4\x4e\x0c\x94\x23"
+ "\xe5\x44\x73\x82\xa8\x47\x3f\xf2\x2a\xb4\x1e\x53\xea\x45\x1d\x2e"
+ "\x38\x1f\x5a\x87\x29\x98\x43\x0a\x4a\x42\xca\x5c\xbc\x52\xa5\xf7"
+ "\xe0\x4b\x1b\xf4\x8c\xf5\x9a\x72\xd0\x63\x4b\x89\x43\xfd\x28\x11"
+ "\x75\x43\xe1\x28\xcf\x24\x37\x7f\xc5\xb6\xa7\x8f\xce\x26\xbd\x0c"
+ "\x14\x4e\x32\x4e\xe1\x7e\xf4\x6f\xf0\xdd\x88\xf1\x3a\xd2\x5f\x3a"
+ "\x97\x2b\x38\x7e\xe0\xfc\x05\x48\xd9\x41\xb8\xa2\xf7\x1c\x38\x40"
+ "\xb2\x8b\x30\x33\xa3\x7d\x07\xd0\xf7\x4e\xd9\x27\xf3\x15\xc3\x0a"
+ "\x28\x9e\xe4\x14\xc3\x6b\x9c\xf0\xf7\x7c\xef\x72\x37\xf6\x01\xc3"
+ "\xfb\x1e\x29\xf6\x01\x1f\x4d\x97\x9b\x49\x75\xd9\x03\x0f\x9d\x45"
+ "\x3b\x86\xf6\xbb\x24\x51\xb4\x3f\x0f\xb5\xd1\x3b\xda\xcf\xcf\xf1"
+ "\xb9\xb5\x0d\xed\xd4\x8d\x4a\x4b\x7a\x9f\x1a\x86\xdf\x50\x43\x8a"
+ "\xaf\xf2\x42\x94\x2f\xd6\x9c\xe5\xe8\x3e\x0d\xed\xbe\x7f\x06\xc3"
+ "\xb3\x1c\xc7\xaf\xe8\x7c\xb8\xd2\x1d\xac\xff\xdd\x1b\x27\x35\x0e"
+ "\xdf\x55\x3b\x3f\x07\x16\x1e\xe2\xfc\x78\xb9\x13\xbd\x80\x67\x38"
+ "\x6e\x89\x3f\x7f\xe8\x3e\xbc\x9e\xf9\x0e\x5f\xa4\x3d\xe3\xf5\x23"
+ "\x0f\xdd\x80\x99\xaf\xef\x84\xc4\x9a\x1b\x90\x50\x7b\x03\x8c\xec"
+ "\x2f\x46\x75\x0d\xfa\x71\xcf\x5c\xd3\x01\xda\x89\xcc\xd1\x16\xd0"
+ "\xd6\xee\x44\x7f\xce\x07\xaa\xfe\x0a\xf4\xe7\x7c\xe8\xcf\x5d\x35"
+ "\x92\xbd\x1c\xf0\xe7\xfa\xb8\xaf\x5c\x74\x81\x9f\x21\x5a\x51\x74"
+ "\x61\x94\x19\x54\x51\xd9\xa0\x43\xfa\x4a\xaf\xc0\x43\xaa\xa8\x2e"
+ "\xf4\x25\xb1\xcc\x4e\xa9\xbc\x78\x8f\x8b\x36\xc3\x70\x5e\x56\xb4"
+ "\xe1\xac\xa2\x24\x71\xc8\xb6\x59\x4d\x32\xe5\x26\x5d\xc2\x32\x3c"
+ "\x3c\x9e\xbe\x39\x9f\x9e\xe0\xd5\x14\xd5\x30\x2f\x85\x17\x4f\x65"
+ "\x5e\x0c\xe7\x7b\xfd\x37\x62\xb8\xc7\xf6\xb0\xd1\xa9\xc9\x1a\x72"
+ "\x3d\x24\xf6\x99\x24\x5b\xf3\xf0\x3b\x4c\x5d\x86\x32\x9a\x5b\xbd"
+ "\xcb\x87\xfe\xf8\x15\xd2\xe3\x87\x4f\xae\x28\x60\x3e\xc3\x66\xfa"
+ "\xfe\xff\x70\x35\xcd\x4d\xa0\x6f\x92\xff\x84\xbe\xce\xad\xe6\x23"
+ "\x50\x1b\x42\xfd\x87\xe8\x02\xc4\x59\x99\x5b\xcd\xb0\xcf\xfe\x75"
+ "\xfd\x7a\x9a\x7f\x26\xd6\x9a\x3e\xdc\xe5\x84\xcd\x7c\xde\x07\x5f"
+ "\x9f\xc3\xed\xe9\xc2\x16\x37\xf2\x20\xd4\x06\x2c\xac\xa6\xfd\xcb"
+ "\x7b\xcb\x2d\x17\xec\x93\xc9\xf6\x2f\xac\x10\xbe\x90\xa5\x43\xb4"
+ "\x05\x0b\x9f\x13\xdf\x0f\x16\xce\x75\xc2\x4a\xde\xc6\x5b\xa6\x91"
+ "\x4c\x2c\x2c\x60\xb1\x96\x3f\x10\xdc\xec\x32\x28\xdb\xe2\x83\x6c"
+ "\x56\x61\xe9\x60\x5c\x57\xae\x00\x7b\x6d\xa3\x87\xd6\xdc\xb8\xc7"
+ "\xad\xf1\xa0\x6f\xd0\x82\x71\x17\x28\x0f\x17\xc2\x20\xdf\x47\x88"
+ "\xb9\x0b\x0b\x0f\x38\xe1\x31\xc9\x1e\x2e\xcc\x12\x63\xcc\x0b\xb3"
+ "\x7a\x31\x2d\xfa\x8a\xb7\x63\x3c\xfa\xbf\x1b\xa3\xa4\x6f\xdc\xae"
+ "\xbd\x7c\xad\xe8\xc2\x33\x4e\x28\xe0\x7b\xef\x17\x4f\x05\x7d\xb1"
+ "\x81\x85\xd5\x11\xb1\xd7\x7d\x70\x39\x17\x3d\xc4\xe7\xe1\xa9\x61"
+ "\x9c\xc7\x96\x0a\x32\x5e\x6c\x6f\xff\xbe\x57\xbd\x7a\x35\x86\xc5"
+ "\xc9\x78\x11\x66\x0c\xbe\x27\x0c\xc0\x88\x34\x73\x83\xd2\xac\xee"
+ "\x55\xdf\xfd\xf7\x18\x96\xa6\x48\x93\xa9\x48\x63\x0e\x4a\x53\x26"
+ "\xe5\x53\xa2\x48\x73\x50\x91\xa6\x26\x0c\x6d\x8d\x8a\x34\x76\x45"
+ "\x9a\x73\x61\x68\xeb\x52\xa4\x71\x87\xa6\x59\xa4\x09\xe2\x2d\xcd"
+ "\x27\x4a\xc4\x30\x7d\x68\x9a\x45\x46\x45\x9a\x24\xf9\x1d\x7d\xcf"
+ "\x4c\xe1\x1b\xa0\x3c\x61\x9d\x62\xbd\x5e\xc0\x78\x2c\xff\xea\x82"
+ "\x9b\xf8\xdf\xd8\x37\xb4\x9c\x2f\x3d\x2e\xce\xd3\x25\xbb\x4a\xf3"
+ "\x0f\xc8\x9e\xd3\x37\x13\x92\x09\xf2\x3b\x29\xaf\x8b\xb0\x78\x3f"
+ "\xc9\x10\xe2\x3c\x35\x98\x1f\x8b\xec\x0a\x3a\xcf\x29\xe8\x74\x0e"
+ "\xe6\xc7\x22\x77\x68\x9a\xc5\x9a\xd0\x34\x8b\xe3\x82\xd2\xd4\x8b"
+ "\x7c\x16\x1b\x15\x69\x92\x14\x69\xd2\x06\xcb\xe7\xe2\x2c\x45\x9a"
+ "\x02\x45\x9a\x92\x00\x0f\x17\xf3\xb5\xe1\xa4\x0f\x18\x8e\xfd\x9f"
+ "\x55\x67\x6e\xc2\x3b\x9d\x2c\xcf\xf2\xda\x69\x21\xd7\x8f\xd0\xf9"
+ "\x78\xb4\xd6\x8c\x9f\x5d\xd0\x05\x8f\xcc\x92\xbf\x2d\xbf\x75\xc3"
+ "\x1b\x49\xdf\x3c\x91\xb7\xdd\xcd\x56\x2f\xb6\xb9\x8b\xb1\x0d\x5e"
+ "\x96\x28\xcf\x2d\xa1\xf9\x38\xfc\xec\x1b\xde\x1f\x59\xdc\x21\xf4"
+ "\xef\x11\xf9\x9b\x0e\x95\x07\xfb\x19\x8f\xcc\xfc\x3f\xa4\xab\x8d"
+ "\xe8\xa2\x33\x20\x10\x87\x65\xa0\xaf\x31\x40\x2b\xe5\xf9\xc8\xef"
+ "\x64\x5a\xeb\xc4\x9c\x20\x9a\x2b\xec\xa2\x73\x39\x30\x4d\x43\x50"
+ "\xff\x84\x68\x75\x9f\xde\xe9\xd5\x84\xd2\xfc\xc8\x3e\x89\xe6\x0e"
+ "\x61\xa3\x1e\xe9\x90\xed\xc9\x90\xf2\x57\xde\x68\x6c\xaf\x01\xa0"
+ "\x39\x0f\x6d\x35\xe8\x6f\x62\x1f\x8b\xe8\xee\x84\x34\x03\xf7\x7f"
+ "\x37\xdf\x00\x7a\x76\x94\xcc\xe3\x73\x22\x44\x59\xd2\x32\xe9\xfc"
+ "\x65\xf2\x7d\x5a\x2c\x5f\xd2\xbc\x3c\xc6\xcf\x62\x82\xb4\xfd\xcd"
+ "\x25\x2e\xa4\x35\x2d\x5d\x9e\x3f\xe4\x84\x34\xe1\xd7\x95\x37\x1a"
+ "\x68\xbe\x06\xcd\x6d\x6a\x76\x27\x11\x4c\x31\xd2\x29\xcf\x9d\xee"
+ "\xa1\xb3\x9c\x11\x76\xe6\x50\x7d\xa5\x60\xbe\x0a\x1a\x1e\xfd\xab"
+ "\x90\x9f\xb4\x33\xa1\xfa\x10\x89\x72\x9a\x76\x2e\x54\xe6\xd2\x9c"
+ "\xa1\x32\x97\xe6\x0a\xd5\x07\x35\xea\xc3\x12\x4d\x68\x9a\x25\x71"
+ "\xa1\x69\x96\x24\x04\xa5\x29\x17\xf9\x2c\x49\x52\xa4\x49\x53\xa4"
+ "\x09\xb6\x7f\x58\xe6\x25\xe6\x81\x7e\x27\xb7\xf7\x4b\xac\x41\xef"
+ "\xea\x2a\xde\x4e\x2d\x39\x28\x87\x49\xeb\x92\xf9\x5c\x29\x09\xdf"
+ "\x49\x85\x8d\x22\xf8\x33\x0a\x1a\xce\x2a\x68\xb8\x20\xbf\x4b\xf3"
+ "\x2b\x3e\x40\xde\x4d\x95\xe4\xcc\x1d\xbd\x07\x1e\x8b\xf6\xad\x7c"
+ "\x92\x7c\x33\x6a\x9f\xf8\x1c\xb6\x5d\xe8\x53\x5e\x03\x1d\xcd\x1d"
+ "\xbc\x58\x0c\x11\x74\x3e\x8c\x13\x7e\x94\x81\xfd\xb9\x0e\x9a\xe3"
+ "\x8e\xfe\xd4\x8a\x8b\xb0\xa4\x07\xf3\xaf\xc6\x3c\x90\x77\x8f\xa6"
+ "\x84\xd2\xf0\x68\x7a\x28\x0d\x8f\x66\x07\xbd\xeb\xf0\xdd\x12\x54"
+ "\x6e\x1d\xed\x13\xf1\x0a\xf7\xad\x1f\x3d\x20\x87\xd3\x18\x00\x96"
+ "\xb1\xbb\x94\xfb\x01\x29\x34\x6f\x30\xb6\x13\x1e\xdd\x4a\xe3\x05"
+ "\x12\xce\xd3\xc1\xbc\x15\xbc\x78\xb4\x55\x41\x47\x87\x82\x8e\xee"
+ "\x80\xad\x59\xd2\x23\x74\xe4\x51\x7c\x7e\xdc\x48\x61\xc8\x0b\x43"
+ "\xb4\xcf\x70\xbb\x7d\x1a\xf9\xa9\x3f\x5a\xe2\xc6\xf2\xb2\x17\xd4"
+ "\xb1\xd2\xfb\x32\x36\x8d\xfc\xee\xa2\x0e\xb4\xcf\xb4\x76\x76\x0a"
+ "\x86\x65\x88\x7a\xfd\x11\x96\x7f\x55\x8a\xc0\xfb\x23\xfe\x6d\x9f"
+ "\x60\xf1\xd9\xc0\x62\x1a\x87\xec\x9f\xf5\xc6\x36\x26\xca\x73\x6c"
+ "\x11\xc7\x3e\x59\x1f\xfc\x95\x8d\x89\xfe\x8a\x9d\xe7\x30\xac\x1a"
+ "\x75\xa2\x5c\xf4\x69\x76\xc6\xa3\xec\x57\x63\xfd\x61\x1f\x78\xa9"
+ "\xd4\x97\x69\xa4\x33\xe6\x68\xce\x1a\x9d\x41\x15\x25\xe6\x66\xfc"
+ "\xe8\x6c\x90\x5e\xb9\x0d\x3b\x17\xb0\x4e\x58\x5a\x41\xbe\x1d\xd9"
+ "\x0d\x9a\x83\xd8\xec\x73\x01\x8d\xb3\x38\x7c\x97\xb8\x4f\x8e\xf1"
+ "\xe5\x22\xed\x52\x6d\x50\x5a\x97\x34\x0e\xd2\x4d\x71\x73\x7c\xa0"
+ "\x69\x76\xbb\xe8\xac\xdd\x38\xe1\xc7\x2f\xad\x68\x46\x7b\x81\x69"
+ "\x92\xe5\x34\x34\x66\xc2\xbf\xfb\x17\x03\x9d\xcb\xac\xb1\xef\xec"
+ "\xe4\xb8\xa5\x6f\xce\xbc\x7f\xe4\x28\xe9\x06\x87\xbb\x83\x7c\x4a"
+ "\x8d\x98\xb7\xb5\xb4\x3c\xc2\x0b\xda\xde\x8a\x46\x83\x13\x9f\xfb"
+ "\x2b\x1a\x8d\x48\x1b\xf2\xf3\x47\x74\x36\x62\x88\x2f\xb3\x68\x51"
+ "\xfa\xca\x15\xcb\x66\x3d\xb1\x72\x49\xc6\xa2\x79\x86\x8c\xfc\x4d"
+ "\x79\xa6\x59\x5b\xb6\x16\x1b\xb6\x17\xe6\x17\xe7\x6f\xde\xc0\x8f"
+ "\x07\x33\xe4\x14\x8b\xbb\xb1\x20\xa7\xa8\x78\x3e\x3d\xce\x34\x58"
+ "\x0a\xf3\xb6\xf1\xc7\xbb\x46\x42\x28\x92\xfc\xe2\xbc\x42\xc3\x0c"
+ "\xd3\x4c\xc3\xe2\x9c\xfc\x02\x5a\xc5\x10\x0e\xd7\x3c\x43\x61\x5e"
+ "\x61\x5e\x8e\xc9\x30\xdf\x90\x48\x98\x83\xd1\x05\xd5\x67\xa2\x6c"
+ "\x9f\x8a\xb0\x3d\x47\x1f\xba\x9b\xec\x14\xb5\xeb\x17\x61\xc5\x56"
+ "\xf2\xe1\xf8\x79\x5e\x28\x87\xd8\x26\x38\x3d\xb6\x65\xc5\x83\xdb"
+ "\xf1\x65\x07\x42\xe5\x77\x59\x75\xa8\xfc\x2e\x3b\x39\xb8\x1d\x5f"
+ "\xa6\xd0\xff\x65\x0a\xfd\x5f\x76\x61\x70\x3b\xbe\xcc\x15\x9a\x66"
+ "\x39\x84\xa6\x59\xae\x1b\xb0\x33\x48\xeb\x5e\x6e\x97\x96\x27\x28"
+ "\xd2\xcc\x55\xa4\x49\x55\xbc\x67\x04\xbd\xa3\xef\xba\xdc\x14\xec"
+ "\x1b\xe0\x7b\xb1\xac\xeb\x01\xfb\xb6\xfc\x80\x0c\x43\x6d\x0f\xad"
+ "\x75\x91\x60\xeb\x83\x60\xbb\x25\xd8\x01\xfd\x27\x9b\x44\x73\x37"
+ "\x85\x7f\xbe\x62\x86\x64\xdb\xba\x8e\x04\xda\xd0\x2e\xac\x8b\x29"
+ "\x57\x60\x79\x45\x9d\x80\x75\xd1\x7c\x5e\xf6\xda\x1a\x4f\x5d\x2c"
+ "\x68\x29\x2d\x9d\x67\xc5\x6c\x4b\x6b\x68\xfe\x38\x86\x45\xe1\x85"
+ "\x76\x6a\x85\x5e\x9e\x3b\xbf\x0f\x61\x9c\xb0\x82\xcb\x32\xa5\xdb"
+ "\xc7\xe7\x1d\xf2\xfc\x2a\x68\x8d\x15\x9d\x11\x77\x44\xec\x21\xd1"
+ "\x45\xe7\xac\x51\xde\x88\x43\xc3\xd4\x4b\x3f\x97\xce\xcb\xd2\xe1"
+ "\x15\x87\x38\x0b\x64\x9c\x88\x4f\x0f\xe2\x5c\x3e\x9a\x47\x26\xf9"
+ "\x3d\x2b\x0e\xca\xfe\x05\xf5\x15\xc2\xd9\x8e\xf0\x73\xb3\x21\xfa"
+ "\x88\xcd\x8f\x7d\x94\x2e\xa2\xe9\x0c\xf9\xa1\x0e\xbd\x0f\xda\x6b"
+ "\x7c\xd8\x7f\x05\x1d\xef\x4f\x59\x2f\x83\xa3\xde\x07\x34\x3e\xbc"
+ "\xd6\x0a\x65\x75\x6a\x7f\x07\x1b\x48\x47\x7d\xb4\x15\x6e\xa2\x67"
+ "\x1f\x85\x63\x7a\xec\x4b\xb8\x68\x0e\xf7\x10\xe3\x11\xd1\x04\x67"
+ "\x9f\x46\xfd\xbd\xf4\x99\x92\xef\x7b\xa0\x0e\x71\x85\x9d\x5f\xac"
+ "\x06\x87\xc7\x96\x8e\xed\xdf\xf6\x73\xb2\xcd\x6e\xae\xe6\xb6\x4f"
+ "\x8d\xe1\x65\xc8\x8b\xc6\xa1\xfc\x14\xc9\xbe\x5b\x68\x5e\x19\xc2"
+ "\x9e\xba\x19\x2c\xd1\xdd\x8c\xe5\x46\x5d\x74\xbe\xb5\x3b\x31\x52"
+ "\xb2\xaf\x5a\x4c\xd7\x25\xa7\xfb\x3a\xe5\x23\xdf\x88\xda\x63\xd4"
+ "\x55\xb7\xe8\x2b\xae\x7c\xf2\x15\x3e\x67\xf9\x31\xf4\xff\xd2\x65"
+ "\x3d\xb8\x0d\xdf\xd1\xfe\xa5\xf3\xf1\x44\x3e\xaf\x07\xfb\x93\x45"
+ "\x16\xf4\xd9\xf4\x6e\xb4\x8d\x8f\x65\xca\x71\x7c\x9c\x88\xe2\x4a"
+ "\x98\xb7\x59\xdf\x45\x71\xc5\x03\x71\x62\x0d\x01\x6b\xb6\xfa\x28"
+ "\xfc\xa0\x1c\x2e\xda\x96\xc7\x6a\x14\xef\xa7\xe4\x77\x7c\x6e\xc2"
+ "\x67\x83\x84\xdf\x85\x36\x57\x25\xf6\x5c\x58\x39\xbe\x96\xeb\xcd"
+ "\x63\x1d\x72\x3c\x1f\x53\x3b\x41\xdf\xc6\xdc\xe0\x8f\xb5\x38\xb9"
+ "\xcf\x85\x69\xde\xfd\xd2\x1b\x89\x7d\x0c\x15\xa3\xb3\x55\x31\x8c"
+ "\xf0\x90\xce\xf0\x33\xee\xf1\xbd\x13\x1e\x3b\x4b\xeb\x1c\x48\x46"
+ "\xb6\xfb\x20\xde\xf2\x20\x8d\x3f\xaf\xe4\x72\x4b\x61\x84\x97\xf0"
+ "\x51\x9b\x48\xb8\x09\xdf\x61\xf2\x69\xf9\x7c\xc9\x95\x54\xfe\x83"
+ "\x43\xd5\x15\xc6\x5b\x83\x78\x19\x89\xef\x07\x42\xcb\xba\xb2\x5a"
+ "\xf1\x7e\x52\x7e\xa7\xb1\x5e\x21\x7b\x2b\x6b\xa4\xb8\x96\x9b\xe5"
+ "\x35\x8d\xaf\x91\x59\xd9\xad\xc8\xcf\x1b\x8a\x7f\x95\x56\xf1\xae"
+ "\x97\xdf\xab\xf8\x37\x86\x55\x46\x39\x8f\x23\x62\x0e\x97\xb3\x61"
+ "\xb7\x2b\xf2\x66\x7b\x99\x60\x9a\xac\xa0\x3c\x87\xe1\x7b\x41\xa0"
+ "\xfe\x56\x59\x65\x7c\xf8\xbc\x2f\x08\x0e\xfd\x92\x55\x55\x32\x9c"
+ "\xf8\xbe\xb1\xaa\x21\x28\x5d\xe3\x2d\xca\xaa\x90\xdd\x8c\x7e\x21"
+ "\xbb\xab\xba\x15\xb4\x78\x03\x38\x33\x34\x01\x5a\x32\x74\x41\x70"
+ "\xa8\x9f\x19\x06\xa5\xac\x16\x59\x49\xc6\x49\x5e\x33\x92\xc3\xc4"
+ "\x79\xa5\xb8\xcc\xf0\x32\x9e\x61\x09\x0a\x97\xfa\x47\x19\x9f\x4a"
+ "\x7e\x02\xd9\x67\x77\x6f\x69\x86\x7c\xce\x2a\x97\x49\xda\x47\x6c"
+ "\x8e\x38\xd3\x1b\xe5\x3a\xa3\x51\x89\x57\xac\xbf\x91\x70\x04\x70"
+ "\x96\x09\x1f\x2f\xc3\x19\x54\xb6\x1e\x27\xac\x94\xbf\x13\xb9\xc4"
+ "\xd8\xe0\xaa\x0b\x43\xf5\x3b\x3c\xb6\xd5\xf1\xa1\x3c\x5b\x3d\x33"
+ "\xc0\xb3\xd5\x49\x01\xbc\xab\x53\x83\xe0\x7e\x8d\xef\x19\x41\x70"
+ "\xd9\xb7\x92\x4d\x21\x2b\xab\x0f\x28\xf2\xaa\x0e\xc2\xd1\x10\x94"
+ "\x57\x63\x10\x5c\x07\xbe\xdb\x87\xae\x9f\xd5\x17\x86\xae\x9f\xd5"
+ "\xde\xf0\xf5\xf3\xb8\x2e\x90\xef\xe3\xf1\xb7\xd6\xab\xc7\x53\x82"
+ "\xe8\xa9\xc3\xf7\xf4\x50\x3d\x7a\x3c\x5b\xf1\x3e\x50\xff\x0c\x6d"
+ "\x47\xc3\xce\x94\x48\x0a\x2f\x9e\x0a\x3a\xa1\x67\x8f\x97\x07\xc7"
+ "\xbf\x7b\x43\xc4\x13\x8d\xfc\x1b\x1c\x7d\xdf\x14\x70\x4d\x4a\x38"
+ "\x82\x09\x8a\xef\x90\x69\xc7\xf6\x3a\xec\x99\xa0\x72\xfb\xe7\xf0"
+ "\x53\xfb\xf7\xb8\x5b\x7c\xb7\x29\x8c\x63\xb6\xf7\x33\x87\x6a\xcb"
+ "\x3c\xb6\x27\x12\xb1\xcf\xd0\x2d\xf8\xf3\x04\xca\xff\x66\xee\x9b"
+ "\xb0\xf2\xc2\x38\x94\xa7\x1b\x17\xe1\x89\x4f\xf1\xde\x87\xf7\x5f"
+ "\x84\xb6\xaf\x4f\x64\x30\x9b\x6a\x55\x9d\x4d\xd9\xee\x3e\x51\x80"
+ "\x7d\x8f\x1b\xd1\xbe\xb2\xcc\x30\x71\x07\x98\x2d\x62\x65\x98\xf0"
+ "\x7a\xac\xaf\x1b\x4e\x78\xe2\x3c\xd1\x1b\x14\xde\xc4\x6c\xa3\x33"
+ "\x08\xde\x49\xf9\x61\x9a\xa1\xea\x4d\x5e\x07\x25\x64\x2f\x53\xa3"
+ "\x28\xc7\x57\x17\x21\x73\x8f\x28\x47\xe6\x1f\x43\xf3\xce\x8c\x0f"
+ "\x5f\x8e\xcc\xb9\x58\x8e\xaf\xc2\x97\x23\x33\x9d\xf3\x56\x8d\x65"
+ "\x19\xe4\x77\x64\x16\x60\x59\xbe\xe2\x7c\x0f\x0d\xdf\x27\xf7\x53"
+ "\x4b\xbf\xc2\xfe\xbf\x1a\x78\xda\x55\x25\x81\x7a\x93\xe0\x4e\x45"
+ "\x57\x43\x7a\x98\x3c\x5b\x98\x6d\xf8\x2a\x27\x64\xfa\xe4\xf6\x4a"
+ "\x0a\xbf\x20\x68\x41\x3e\xa9\x89\x4f\x58\x1e\x4c\x37\x54\x7d\xcb"
+ "\xfa\x29\xbe\x33\x3d\x89\xfa\xff\x84\x53\x6e\xd3\xb1\x3d\x77\xc9"
+ "\x7c\xc4\xb8\x34\x45\x9c\x37\x28\xce\x14\x12\xb7\x6b\x20\xbc\x44"
+ "\x0e\xff\x7a\xf5\xf4\xe4\x29\x45\x3d\x61\xfd\x3c\x35\x3f\xb4\xdc"
+ "\x4f\x9e\x11\xe5\xc3\x3a\x1a\xc4\xeb\x27\x3b\xb0\x8e\xfa\xc2\xd7"
+ "\xd1\x93\xee\xf0\xb2\xf6\x54\x14\xc7\x17\x0b\x61\xf0\x3d\x65\xc4"
+ "\xba\xeb\xe3\x32\x28\xd5\xd3\xe0\xfa\x79\x6a\xa9\x5c\x3f\x5f\xaf"
+ "\x8c\x4f\x95\x2b\xca\xd8\x7f\x11\xd6\x8c\x12\x65\x5d\xf3\xb4\x02"
+ "\xf7\xc9\xf0\xb2\xf8\x94\x1d\xcb\xd9\x1f\xbe\x9c\x4f\x5d\x18\x5a"
+ "\x16\x9f\xa2\x6f\x75\xfd\x83\x65\x71\x8d\x4e\xa4\x81\x30\x69\xd6"
+ "\xcc\x64\xb6\x70\xf9\xac\x49\x25\xbf\xc8\x09\x6b\x4a\xe8\x3b\x5d"
+ "\x50\x78\x56\xa8\xfc\x61\x19\x28\x1d\xf1\xcf\x27\xfa\x31\x54\x0f"
+ "\x17\x0d\xa0\xbe\x95\x4c\x7a\x6c\x6b\xce\x28\x78\x75\xf5\x22\x64"
+ "\xcd\xef\x55\xab\x17\x0b\x7e\x3d\xad\x52\xd0\xd4\x11\x9e\x5f\x6b"
+ "\x5c\xc8\xaf\xab\xe1\xf9\x95\x15\x35\x34\xbf\xb2\xa8\xfe\xaf\x0e"
+ "\xe6\x57\x56\x4a\x30\xbf\xfc\x36\x51\xbe\xe9\x7a\x94\x8d\xbe\xb5"
+ "\xac\x4e\xd8\x72\x5d\x34\xca\x8a\x48\xd3\x43\x69\x8a\xa3\xbd\x42"
+ "\x4e\x0c\x13\x40\x7b\x05\xb2\xb2\x64\xfd\x1f\x5d\x0d\xc3\x59\xdf"
+ "\x1a\x9a\xa3\x4d\x67\x3d\xeb\x1c\xd6\xab\x76\x87\x2f\x11\x68\xbc"
+ "\x51\x91\x6f\x53\x78\x5b\x90\x75\x0e\x79\x5a\x19\x26\xbc\x5b\x8c"
+ "\x99\x3e\x6d\x08\xb5\x11\x4f\x43\x68\x1d\xad\xe1\xe9\x60\x60\xff"
+ "\xd3\x9b\x5f\x37\xaf\xb3\xa7\x2d\x83\xeb\xec\x99\x18\xa9\xbe\xfe"
+ "\x1a\x4a\xdf\xd3\x07\xc2\xd7\xd7\xd3\xf5\x43\xd7\xd7\xd3\x67\x86"
+ "\xae\xaf\xa7\xa9\xef\x73\xd5\x09\xcf\xe8\x42\xdb\x8d\xa7\x5d\xa1"
+ "\xe5\xc5\x7c\x31\x1d\x53\x0f\xbb\x9d\xde\xbf\x6e\xb9\xe5\x8b\x6c"
+ "\x1c\xd5\x15\xad\xff\x47\xfa\xa7\x12\x8d\xdf\x14\xc7\x90\xb8\x91"
+ "\x87\xe5\x3b\x87\x3c\x3f\x3c\xaa\x1d\xfb\x95\x34\x3f\xcf\x30\x99"
+ "\xc6\xca\x9e\xf9\xb3\x5f\xad\x9a\x87\xcf\xea\x8b\x90\xfd\x53\xbf"
+ "\x3a\xa2\x8c\xe6\x92\xf1\xb5\x83\xfc\xfb\xc4\x33\xbe\xe0\xba\xa0"
+ "\x39\x65\x87\xc5\x5e\x8e\x34\xce\xf9\xd9\x45\x58\xbb\x5f\xd4\x4b"
+ "\x76\x45\x28\x1f\xd7\x1a\xc2\xd7\xcb\xda\x24\xac\x97\xcf\xc2\xd7"
+ "\xcb\xda\x8c\xa1\xeb\x65\xad\x05\xeb\xe5\xb3\xc1\x7a\xb4\xf6\x80"
+ "\xa4\x47\x7b\x29\x8d\x61\x33\xf9\xab\x6b\xbf\x22\x18\x7c\x46\x1d"
+ "\x59\xfb\x39\xc5\xcf\xea\x91\xf5\x88\xa7\xa1\xfe\x3f\xcf\x5f\x82"
+ "\x69\x92\x70\x04\xe3\x75\x46\xf7\x84\xd3\x93\xb5\xf4\x3d\x55\x35"
+ "\xdb\x02\x5a\xe4\x61\xe6\x71\xc2\x51\x08\x70\x05\xb2\x97\x11\x1c"
+ "\x85\xd3\xd9\xcb\x01\xf8\x6c\xa3\x0c\xc7\xc7\x45\x05\xac\x81\x79"
+ "\xcc\x40\x70\xa1\xb8\xb3\xa5\xf2\x0f\xe7\xed\x08\xc1\x13\x9c\x02"
+ "\xc6\x2a\xf4\x31\xfb\x4c\xa8\x3e\x66\x97\x87\xca\xe7\x5a\xfa\x3e"
+ "\x11\xed\x47\x3b\x87\xb2\xdc\xd5\x6f\x53\xcd\xfb\x76\x74\x33\x27"
+ "\x4a\xa1\x9b\x28\x03\x39\xff\x28\x64\x20\xe7\x50\x28\xad\x39\x09"
+ "\xe1\x65\x20\x27\x79\x68\x19\xc8\xc9\x1c\x5a\x06\x72\x8a\x49\x06"
+ "\x9c\x90\x73\x2a\x54\x37\x73\x0e\x86\x96\x1d\xf3\xe5\xba\x09\x31"
+ "\xdf\x44\x37\xd1\x17\xba\x7d\x28\x3d\x94\xfc\x7f\x55\xdd\x0d\x80"
+ "\x6f\xc0\x33\x2d\xea\x15\xd2\xb7\x2e\x85\xbe\x21\xa1\x8d\x37\x13"
+ "\x0f\x6b\x79\x1f\x6d\x5d\x46\x30\x1f\x0f\x8b\xbe\x56\x29\xc2\xfe"
+ "\x8e\xe6\xec\x09\x7e\xe6\x9e\x08\x2d\xff\xba\xe2\xf0\xfc\x5c\x77"
+ "\x10\xf9\x59\x1a\x9e\x9f\xeb\x4e\x0e\xcd\xcf\x75\x2d\xb4\x56\x7d"
+ "\xb0\x4e\xad\xbb\x60\xd8\xc6\x7d\x14\x9e\xe6\x0a\xe4\xde\xff\xf5"
+ "\xda\xa7\xdc\xb8\xd0\xf6\x69\x9d\xef\x9b\xb7\x4f\xb9\x99\xe1\xdb"
+ "\xa7\x5c\x4b\xf8\xf6\x29\xf7\x80\xd0\x87\x5c\x7b\xa8\x3e\xe4\xd6"
+ "\x87\xca\x04\xf2\xee\x5b\x6b\x9f\x4c\x3a\x85\x0e\x1c\xb9\x08\xa6"
+ "\x0a\xf4\x29\x24\x5b\x98\xb7\x3a\x94\x46\xd3\xcc\xf0\xf5\x66\x4a"
+ "\xc5\x7a\x3b\x12\xbe\xde\x4c\xd9\x43\xd7\x9b\xa9\x04\xeb\xed\xc8"
+ "\xe0\x7a\x33\x55\x7d\x73\x9f\xc2\xd4\x1a\x5a\x67\xa6\xc6\x6f\x5e"
+ "\x67\x79\x51\xe1\xeb\x2c\x2f\x21\x7c\x9d\xe5\x25\x8b\x3a\xcb\x2b"
+ "\x0e\xad\xb3\xbc\x8c\xd0\x3a\x43\xbe\x7d\x6b\x75\x96\xd7\xa2\xa8"
+ "\xb3\x2d\x17\x61\xfd\x22\xac\xb3\x73\xa2\xce\x36\x8c\x50\xd0\xe8"
+ "\x0c\x5f\x67\x79\x5e\xac\xb3\x2d\xe1\xeb\x6c\x7d\xdc\xd0\x75\xb6"
+ "\x9e\xf6\xd0\xd8\x32\xb8\xce\xd6\xa7\x7d\xf3\x3a\x5b\x5f\x12\x5a"
+ "\x67\xeb\x4d\xdf\xbc\xce\xd6\xdb\xc3\xd7\xd9\xfa\x8e\xf0\x75\xb6"
+ "\xde\x25\xea\x6c\x83\x31\xb4\xce\x36\x68\x43\xeb\x0c\xf9\xf6\x37"
+ "\xd6\x19\xd6\x8f\x5e\xcc\xd7\xdd\xf0\x52\x2f\x1f\xd3\xde\x50\xe6"
+ "\x04\xb3\xb4\x9e\xdd\xcc\x65\x47\xaa\xc3\x77\x11\xa6\x78\x70\xdb"
+ "\xbd\xa1\x46\x0a\x7b\x62\x70\x3d\x6c\x68\xc2\x76\xb5\xa7\xa5\x84"
+ "\xcf\xeb\x12\x75\x48\x3c\x47\x38\x31\x46\xb6\x81\xdb\x7f\xac\x63"
+ "\x46\xfb\x0a\x53\x5b\x8c\xf0\x6e\xc2\x43\xfb\xaa\x84\xe2\x32\x6b"
+ "\xbe\x89\x5f\x36\xf4\x1c\xf3\x42\x3d\xed\xfd\x7f\x11\xf2\xc7\x0b"
+ "\x59\x35\x2b\xfd\xdf\x3a\xcc\xeb\xb2\x90\xd3\x67\x15\x63\x26\xe6"
+ "\x21\xfc\x5f\x33\xf9\xbf\x75\xe1\xe5\xd4\x7c\x13\xff\xd7\x4c\xfc"
+ "\xa8\x0b\xea\xaf\xc6\xa2\x07\xa8\xe8\xaf\x9a\x7d\xd1\x6e\x21\x3b"
+ "\xdc\x8f\xad\x28\xd4\x7b\x6c\xf9\x09\x0a\x9a\xb1\x6e\xf2\x4f\x48"
+ "\x34\x1f\x0b\x4d\x9f\x9f\x1c\x9e\xe6\xfc\x0c\xa4\xf9\xdd\xf0\x34"
+ "\xe7\x5b\x86\xa6\x39\xff\x20\xd2\xfc\xee\x60\xdd\xca\x6f\x90\xe4"
+ "\x20\x4c\xbf\x3c\xdf\x1e\xbe\xfe\xf3\x15\xf5\x0f\x99\xc5\x25\xcc"
+ "\xc5\xd3\x87\xc0\x3d\x0b\xc1\x70\x34\x57\x9f\x60\x49\x46\xc2\xc0"
+ "\xce\x54\xe2\x1c\x02\x2e\x63\x90\xec\xd1\xda\x82\xb0\xb2\xf7\x6c"
+ "\x99\xd0\xc7\x67\x3b\x42\xf5\xf1\xd9\xea\x50\x7d\x44\x5e\x87\xa6"
+ "\x6b\x0a\x8d\x37\x1f\xf8\xf6\x6c\xec\x46\xa3\x42\x06\xde\xbf\x08"
+ "\x1b\xdf\x16\x32\xb0\xb1\x3f\x94\x8e\x8d\x29\xe1\x65\x60\x63\x26"
+ "\x96\xff\xfd\xf0\x32\xb0\xb1\x78\x68\x19\xd8\x58\x8e\xbc\x7c\x3f"
+ "\x58\x6e\x57\x95\xa4\x0c\x57\xc0\x9c\x0e\x6f\xf3\x36\x9e\x0d\x3f"
+ "\xae\xb3\xb1\x4b\xf0\xb8\x20\x3e\x94\xc7\x1b\x7d\xa1\x3c\xc4\xb2"
+ "\xfc\xed\x3c\x1c\x38\x2b\xc3\x63\x2b\x50\xea\xbf\xe3\x22\x14\x48"
+ "\xfa\xbf\xe9\xcf\xa1\x34\x16\x48\xfd\x9f\x70\x63\x59\x05\x0d\xc8"
+ "\x4b\x47\x78\x5e\x16\xd8\xc3\x97\xb9\x80\xda\x20\x87\x7f\x90\x2e"
+ "\x15\xb8\x30\x7c\x15\x7d\x3b\xa0\x31\xac\x5a\x0c\x5f\xe5\x03\x2d"
+ "\x6f\xaf\x06\xda\xa5\x4d\x71\x34\x46\xce\xc7\x98\x51\x7e\xa3\xe3"
+ "\x81\xd6\x1e\xe9\x88\xae\xb5\x25\xca\x6f\xa2\x9b\x52\x88\x6e\x9a"
+ "\xc7\x42\xeb\x6a\xa2\xad\x90\xee\x70\xfb\x40\x96\x77\x82\x57\xe0"
+ "\xb6\x90\x5e\x10\xbc\x0c\x2b\xc6\x3a\xcb\x14\xb6\x69\x53\x75\xf8"
+ "\x3a\xde\xd4\x38\xb4\xec\x6c\x3a\x2b\xea\x79\x33\x84\xd6\xf3\xa6"
+ "\x2e\xbf\x6d\x74\x06\x95\x15\x65\xe0\x1b\xe9\x09\x7d\x3b\x1d\xd2"
+ "\xde\xef\x5d\xd3\x61\xd9\x0d\x93\x2f\xc1\x66\x33\xcf\x4f\xcd\xd0"
+ "\xa7\x50\x41\x0b\xb7\x01\x9b\xdf\xe3\x74\x22\xcc\x5a\x1f\xa8\xd9"
+ "\xde\x8d\x1d\x14\x57\x67\x63\x5e\x3a\x37\x46\x3e\x03\x06\x65\xe1"
+ "\xf6\x4e\xd8\xbc\x27\x24\x3d\xb6\x46\x0e\x81\xe3\x8c\x18\xdf\xdf"
+ "\xdc\x24\x8f\xc3\x0f\x35\xbe\x8f\x30\x17\xe4\x79\xbf\xe2\x5b\xd8"
+ "\xe6\x73\x43\xb6\xcb\x48\x13\xad\x1d\x27\x9a\x6e\x6e\x07\xb6\x24"
+ "\xca\xf2\x2b\xbe\xcd\x6d\x49\x09\xac\x6d\xd9\xb2\x14\xe3\xdc\x37"
+ "\x19\xcf\x0d\xd2\x83\x2d\xd6\x60\x3c\xe2\xbc\x98\x2d\x07\xe5\xf5"
+ "\x29\xf8\x5c\x7d\x0b\x5c\x32\x3d\x76\x05\x3d\xe7\xb0\xbf\xe0\x96"
+ "\x70\x5c\xb8\x05\x8e\x38\x47\xc3\x3c\x98\xed\x87\x88\x4b\x50\x78"
+ "\x17\x9d\x3f\xe3\xa8\xe9\x86\x28\x1f\x68\x44\xdf\xce\x72\x2f\xad"
+ "\x0d\xa1\xbe\xa1\xc3\xb7\xc0\x4e\xdf\xe0\xf8\x1c\x02\xfd\x02\x7b"
+ "\x9b\xb5\x5f\xda\x83\xcd\xf2\x10\xf1\xb4\xcd\x7c\xd5\x5e\x73\x94"
+ "\x75\x1f\xe7\x7b\x6f\x59\x42\xfa\x7f\x07\x69\xfe\x0f\xcd\xc3\xd8"
+ "\x0d\x0b\x10\xfe\x77\x42\xd7\x0b\x15\x3e\xa9\x65\x88\xfe\x9f\x85"
+ "\xfa\x7f\x0b\xc2\xeb\xb9\xe5\x26\xfd\x3f\x0b\xf5\xff\x16\x04\xb7"
+ "\x9b\xe2\x3b\x8f\xe5\x42\xb0\x4f\x4a\xfb\x63\x19\xd6\x93\x9f\xf9"
+ "\xdc\x63\xf7\x54\x81\xce\x47\xdf\xb4\x51\x37\x1d\xdd\x2d\xa4\xaf"
+ "\xba\x36\x57\x13\xed\xc3\xa0\x1d\x6d\x21\x59\xa4\xb6\x8c\xf4\xf5"
+ "\x39\x03\x6f\xcb\x7c\x42\x17\x4b\xad\xcc\x35\xb3\x0b\x65\x68\x8b"
+ "\x59\xc6\x15\xb5\xcb\x2c\xd6\x7d\x8c\xee\x82\xe1\x8e\x6e\xde\x2e"
+ "\xaa\xc8\x5f\xe5\x7e\xab\xef\x1a\x10\xde\xe6\x92\x36\x20\xbc\xfe"
+ "\x81\x76\x92\xe3\x2e\x21\x1d\x27\x9c\x84\xbb\x1d\xe1\x08\x2f\xc1"
+ "\xc9\xe5\x10\x6b\x63\x9e\x6b\x08\x2e\x3b\x1f\x7f\xc1\xbc\x31\xfc"
+ "\x73\x1a\x57\x71\x50\xba\xd2\x35\x6c\x76\x17\x7d\x33\xbb\x6a\x67"
+ "\xa5\x1b\xd9\xec\x42\x1a\x13\x2b\xa4\xf3\xa0\x55\xef\xfe\xc9\x19"
+ "\x59\x3c\x15\xb4\x22\xec\xb9\x9e\x16\x83\x17\x9c\x50\x98\x18\x6a"
+ "\x23\x0a\x15\xfe\xaf\x85\xf7\x33\xf1\xae\xa1\xf9\x89\xd2\xfc\x55"
+ "\xb2\x07\xcc\xe1\xf3\x70\xf9\xb8\xd9\x9c\x0a\xfa\x26\x4d\x73\xa2"
+ "\xc4\xfe\x6f\x85\x56\xc5\xd8\x9b\xeb\x30\x9f\x57\xf3\x7b\xcc\xb7"
+ "\x28\x52\xc8\x48\x71\x64\x68\x9d\x16\x56\x97\x5e\xa6\x6f\x41\xa2"
+ "\x3d\x78\xc6\xa7\xb4\x8f\x85\x4d\xb2\xef\xa6\x08\x3f\x27\xb7\x07"
+ "\x86\xcd\x84\xb7\x48\xd1\xce\x14\x72\xff\xbf\x7f\x50\xbb\x50\x44"
+ "\x76\x3d\x44\x26\xdb\xb9\x0c\x15\x19\xda\xdc\x28\x37\x85\x24\xff"
+ "\x45\xc7\x10\x66\x0f\xad\x39\xc4\xf7\xe1\x57\xa0\x28\xbd\xdf\x06"
+ "\xda\x36\x17\x5f\x53\xa5\x43\x19\xe1\x72\x4b\xed\xc6\x1c\x31\x1f"
+ "\xc9\xad\xc8\xa3\x40\xe6\x39\xc1\xb4\x17\xfe\x1e\xc4\x7c\x0a\x92"
+ "\x85\xa2\x14\x9a\x9b\x31\xba\x87\xef\xb5\xa5\x93\x65\xc8\xe1\xeb"
+ "\x80\x76\x9f\xb2\xcf\x53\x74\x3a\x7c\xd9\x8b\xa8\xfd\xaf\x74\x42"
+ "\x71\x42\x68\xdd\x16\xf1\xf6\x5f\xfe\xae\x83\x75\xef\x0a\x4d\x57"
+ "\xac\x09\xad\xfb\xc2\x6a\x8a\x1f\x72\x8e\x4f\x79\x61\x3c\xf6\x67"
+ "\xd6\xba\xf9\x7c\xaf\x62\xd4\xff\xc2\x8c\x9b\xd9\x41\xa6\x2b\x8c"
+ "\xf7\x23\xac\x34\x2f\x18\xed\x56\xf1\x81\x90\x31\xa3\xb1\x7c\xcc"
+ "\x68\xed\x45\xd8\x2a\x7d\xfb\xd9\xda\xa6\xa0\xaf\x61\x68\xdf\xa0"
+ "\x98\xbe\xff\xac\x0d\x6f\x33\x8a\x2f\x84\xf7\x0d\x8a\xdd\x92\x5d"
+ "\x58\xcb\x62\x94\x72\xb0\x95\xd6\xd3\xf1\x34\x72\x1f\x96\xc6\x42"
+ "\x87\xee\xc3\x6e\x4d\x19\xe8\xc3\x16\x92\x3d\xd8\x6a\x1c\xe8\xc3"
+ "\xba\xc2\xf5\x61\x9d\x61\xea\x73\xeb\xbe\xf0\xf5\xb9\xb5\x26\x7c"
+ "\x1f\x76\xeb\x69\xd1\xce\x6f\xed\x0e\xad\xe7\xad\x67\x03\xdf\x84"
+ "\x8b\x1b\xbe\x3d\x7f\x78\x5b\xd2\x60\x7f\x78\xdb\xcf\x44\x5d\x6d"
+ "\xbb\x16\x4a\xdb\xb6\xf4\xf0\xb6\x7d\x9b\x79\x68\x7f\x78\xdb\xbe"
+ "\xa1\x6d\xfb\xb6\xfa\xc1\xfe\xb0\x61\x98\x02\xa6\x65\xc0\x57\x0a"
+ "\xf1\xcd\xb6\x5d\x10\x7c\xda\x4e\xfe\x5c\x44\x10\xbc\x3b\x54\xde"
+ "\x91\x66\xc4\x87\xb6\xed\x12\xd9\x34\x59\x66\x86\xe2\x09\xed\xbd"
+ "\x34\xbd\x0a\x46\xa0\x0e\xbc\xef\xb1\x6d\x1f\x90\x7f\x9a\xc7\x47"
+ "\xf9\x90\x8d\x1c\x72\x3e\x9d\x5a\xa6\x8f\xe8\xd8\x5e\x72\xb3\xef"
+ "\xa5\x11\x7a\x48\x7f\x65\x10\x3f\xb6\x73\xff\x8f\x70\xdc\xbc\xce"
+ "\xb6\xf7\x28\x74\xcc\x2d\xe6\xe1\x5a\x7f\x21\xea\xcd\xaa\xe8\xcb"
+ "\x5a\xb5\x7c\x4d\xdf\x90\xf6\xd6\x6a\x0c\x2f\xa3\xd6\x94\x01\x7b"
+ "\x5b\xc8\xf1\xee\x50\xc4\x67\x8b\x3a\xb0\x36\xf9\x63\x82\xc7\xba"
+ "\xad\xd6\x50\x9b\x64\xcd\x56\xa4\x53\xf4\xff\xac\x9c\x9e\xaf\xd7"
+ "\xde\x58\xbb\x87\x6e\x6f\x76\x6c\x15\xe5\xdf\xa9\xf8\xbe\xbc\x43"
+ "\x7b\xf3\xf6\x66\xc7\x10\xe5\xdf\x91\x12\xda\xde\xec\x54\x7c\xa3"
+ "\xdf\x91\x1d\xbe\xbd\xd9\x61\x95\xed\x8c\xb0\x1b\x3b\xfe\xed\xeb"
+ "\xd9\x9b\x1d\x8d\xa1\xf6\x66\x47\xf5\xad\xec\x4d\xf3\x20\x7b\xb3"
+ "\xc3\x1d\x5d\x13\xae\x2c\x3b\xa3\xc2\xdb\x9b\x9d\x09\xa2\x0e\x77"
+ "\x96\x84\xda\x9b\x9d\xc9\xa1\x75\xb8\x43\x51\x87\x3b\x15\xdf\xbf"
+ "\x77\x68\xff\x4f\x6d\x52\x44\x44\x84\x3a\x42\xa5\x56\x45\x60\x14"
+ "\x16\x0f\x86\x47\x68\x22\x22\xf1\x1a\x26\xdd\x87\xab\x23\xd4\x1a"
+ "\xbc\x22\xa5\xfb\x30\xc5\xfb\x70\x4a\x8b\x97\x46\xba\x47\x2a\xde"
+ "\x87\xdd\x22\x7e\xb8\x94\xaf\x9c\xbf\x46\xf1\x1e\x79\x8b\xf8\x61"
+ "\x7f\x63\x7a\x18\xf4\x1e\xba\x0e\x72\xc9\xe6\x6d\x39\x05\xf9\x26"
+ "\x3e\xaf\x3d\xcf\x90\x93\x9b\x9b\x57\x54\x64\x28\xde\x62\x78\xf8"
+ "\xa1\x95\xf7\xcd\x33\x88\xe9\xf1\x05\xf3\x67\x98\x46\xc2\xb2\xed"
+ "\x85\x14\xb1\x6c\xd5\x92\x4c\x43\xfa\xc3\x0f\x85\x46\xca\x68\xf8"
+ "\x34\xf8\x9b\x61\x09\xd2\xbd\x94\x97\xc6\x02\x1c\x3c\xca\xed\x4e"
+ "\x17\xad\x3d\x17\xfd\x89\xb2\xdf\x9d\xa5\xf5\xcb\x37\x4a\x19\xad"
+ "\xab\xe8\x84\x92\x5d\x54\x88\x59\xf5\x65\x60\x59\x47\xfb\xa9\x94"
+ "\x1c\x63\xbf\x74\x81\xe1\x51\x50\x77\xc2\xfe\x2f\x5a\xd2\x10\x16"
+ "\xdf\x1d\x4e\x1f\x18\x4a\xc9\xb7\x2d\x7b\x09\xe3\x54\xec\x41\x3f"
+ "\x86\xb9\xa5\xf5\xf9\xa5\xc7\x78\xd8\x2f\xcb\x64\xb8\xe8\x8b\xb0"
+ "\x6b\x3e\xfb\x25\xe3\xef\xb4\x67\x8d\x80\xdb\x15\xc3\xd4\xcf\x9f"
+ "\x23\xbb\x50\x13\x0b\x1a\x9a\x97\x7d\x2c\x16\xb4\xc7\xc6\xd2\x9e"
+ "\xbb\xbb\x34\xf2\xbc\xec\x97\xf0\xdd\x09\xfb\xbb\x29\x6f\x82\xf5"
+ "\xab\x9f\xbf\x41\xf0\xb5\xa1\xf0\x73\x03\xf3\xb8\x77\x69\xd4\x08"
+ "\xb7\xe2\x73\x88\x8e\xee\x67\x7f\xf5\xc6\x9a\xd3\x67\xa7\xa1\x9f"
+ "\x86\x55\x71\xd6\x57\x06\x62\x6d\xd4\xae\x5d\x3b\xfa\x99\x8f\xf6"
+ "\x4c\x58\xd6\x53\xca\x8e\x6c\x02\x0d\xea\xb3\xca\x5e\x48\x6b\x29"
+ "\x76\x99\xea\xf2\x40\x83\xe5\x8f\xbf\x04\xbb\xab\x0c\xcb\xd1\x6f"
+ "\x5c\x06\x9a\x4f\xac\xb4\xde\xb5\xa8\xf0\xf0\x6f\x41\xf3\x0f\x37"
+ "\xca\xd4\x37\x98\x1e\x4a\x8a\x59\x37\xa3\x7d\xb8\xdd\xcc\x4b\xf3"
+ "\x6d\xcf\x66\xf7\x13\xcc\x3a\x4f\xa9\x1e\xda\xd1\x7d\xd9\x75\x81"
+ "\x79\x0f\xfc\x56\xec\x57\xd1\xd6\xe3\xa6\xf5\xb3\xda\x5d\xcb\x20"
+ "\xe2\x62\x26\xa8\xdb\xcc\xd5\xe0\xc8\x72\x43\xc9\x05\xd6\x7d\x36"
+ "\xfb\xcf\xd0\x6e\x6e\x84\xb5\x1d\xa0\x3e\xdb\xf5\x47\xe0\x7b\x49"
+ "\x57\x5e\xa0\x75\xb7\xfa\x5d\xf9\x14\x76\x0d\x76\xee\x82\x51\x3b"
+ "\x3f\xa5\x7e\x50\x07\xe6\x73\x19\x9e\x3a\x0f\x2a\xc4\xa7\x7e\xfe"
+ "\x8f\xa0\x7f\xfe\x49\x5a\x67\x9e\x02\x35\xbb\x41\xcf\x4a\x8d\x51"
+ "\x37\x4a\x8d\xba\x1b\xcc\x18\xeb\x29\x35\xc6\xb5\x5b\x10\xbe\xeb"
+ "\x3d\x18\xdd\x01\x71\xbf\xbc\xd4\xa1\xae\xfe\x12\xe2\xa9\x4c\x17"
+ "\xb1\x6c\x35\x5f\x22\x7c\xe5\x4f\xcb\xfc\x98\x36\x38\x8d\x2f\xe6"
+ "\xa7\xd5\x8e\x4c\x2f\xf8\x11\x57\xf5\x0d\x88\xaf\xb9\x01\x7a\x7f"
+ "\xc5\x4f\xcb\x28\x5d\x0f\x94\x56\x38\xce\x02\x4a\x0a\xeb\xef\xab"
+ "\xb4\xa4\xa3\x3d\x1c\xfe\xee\xba\x26\x8d\xe3\x6c\x0f\xb4\xb9\x6f"
+ "\x40\x3b\xfc\x1e\x1c\xd6\xbf\xd8\xff\x61\x5d\x53\x24\xfa\x93\x2a"
+ "\xfb\x4e\x9a\x03\x2f\x64\xa7\xb4\x8d\xf6\xcf\x2b\x83\x23\xbb\x21"
+ "\xca\xb2\x13\x86\x5f\xc2\x70\x6e\x7b\xca\x73\x33\x1d\xbe\xbf\xd8"
+ "\x77\xf2\xf5\xe0\xfb\xbb\x77\xb7\x41\x44\xbb\xbb\x9a\xca\xaf\xee"
+ "\x8f\xbd\x00\x0e\xf7\x39\x70\x58\x3e\xb3\xfb\x75\x7f\xe8\x3e\xe8"
+ "\x07\xed\x3f\x5e\x3f\xa7\x76\x68\xae\x83\x23\xd3\x0d\xef\x63\xde"
+ "\xac\xf2\x02\xed\x09\x99\xd2\xee\xf6\xd2\xfe\x3b\x89\xac\x57\x3f"
+ "\xf2\x48\x21\xcc\xac\xfd\x12\x12\x8e\x7f\x09\x46\xe6\x31\xaa\x69"
+ "\x8d\x37\xed\x97\x76\x1c\xef\x51\xd8\x07\xc3\xb2\xf3\xb5\xde\x2c"
+ "\x46\x5a\xeb\xdd\x67\x84\xba\x1b\x81\xb5\xde\x37\x7a\x03\x6b\xbd"
+ "\x51\xa6\xb4\xb4\xde\xdb\x09\xbb\x6b\xa2\xcf\xc2\x70\xd4\x13\x3b"
+ "\xc9\xf7\x91\x2b\xa0\xd9\x7b\x05\x60\x76\x99\x9a\xfa\x99\x1a\xd4"
+ "\x87\x5d\x0e\xac\x1b\x7a\xee\x84\xb2\xb9\x78\x8f\xc2\x0b\xfb\x73"
+ "\x65\x7c\xaf\x8a\x2e\x49\x8e\x31\x4c\x8d\x61\x93\xf0\x1e\x81\xf7"
+ "\x31\xa5\x35\xcc\xc5\xca\x8b\x13\xd1\x57\x19\x49\xf2\x2c\xd6\x97"
+ "\x17\x27\x7a\x6c\x65\x51\x4e\x38\x55\x20\xcb\xb5\xb0\xef\xbb\xb4"
+ "\xef\x77\x5e\xa6\xfd\xde\x5d\x9c\xae\x3e\xb3\x8a\xf6\x7e\x97\xc2"
+ "\x89\x86\xad\x94\x2f\xe6\x9f\x89\xf7\x68\xd1\x07\x2d\xed\x91\xd3"
+ "\xf6\xf6\x99\x29\xcf\x4d\x18\xce\xe4\x70\x2c\xb7\x86\xe2\xfe\xa5"
+ "\xf3\xb2\x5a\xc0\x18\xd5\x88\xd3\x2b\xe1\x47\xdd\x2f\x39\x45\x3a"
+ "\xde\xab\x8e\x66\xcd\xd9\x73\xa1\xe6\x28\x3b\x7b\xfc\x28\x6b\x11"
+ "\xba\x57\xd6\xe8\x84\x7f\xe2\x7b\x4f\x62\x1b\xde\x72\x10\xe3\x9a"
+ "\xb1\x37\x4e\x7c\x69\x31\xd1\xfc\xd2\xb2\x73\x4e\x98\x16\x17\x5c"
+ "\x06\x66\xdb\xd9\x48\xed\xe8\x3f\xed\x6e\xc5\xfe\xe4\xf3\x8d\xed"
+ "\x5d\x3d\xf0\x0f\x37\xba\x23\x4b\x3f\x06\xb5\xc3\xd7\x09\x73\xe2"
+ "\xc4\x39\x39\x75\x47\x99\xf3\x15\x3a\x3f\xf8\x28\xeb\x41\x79\x99"
+ "\x74\x09\xf6\x4c\xba\x27\x0e\xe2\x7e\x83\x5e\x89\xb0\x4f\x7b\xee"
+ "\x0f\xb2\x4f\xef\xb5\x39\x9b\x82\x6c\xd3\xfe\x4d\x83\x6d\xd3\xbe"
+ "\x7c\x61\x9b\x50\xf7\xb9\x2d\xea\x77\x4a\xe1\xab\x15\xe1\xd2\xfa"
+ "\x95\x7d\x0f\x28\xc2\xbd\x52\xf8\x0c\x45\xb8\x4b\x84\xef\xcd\x93"
+ "\x6d\x5f\x3b\xd1\xb1\x9d\x6c\xdf\xde\x25\x64\xfb\xda\xb3\x25\xdb"
+ "\xc7\xed\xcf\xde\x59\xec\x4d\xb4\x45\xdb\xc8\xde\xec\x8d\x24\xfa"
+ "\xd9\x2f\x41\xa6\x7d\xc4\x45\xb0\x7d\x48\x61\xe5\xbf\x07\x0d\x5e"
+ "\x92\xdd\x2b\x19\x47\x76\x8f\x6c\x1e\xd9\xbe\x37\xc6\xb2\x8e\x37"
+ "\x8e\xb2\xf3\x35\x7c\xdf\x6a\xdb\x80\xfd\x7b\x19\xc3\x0e\x62\xd8"
+ "\xcb\x18\x4f\x76\x90\x78\xd2\x96\xd9\x04\xfc\x5c\x9b\xf2\x22\x8b"
+ "\x5f\x9d\x08\x87\xb1\xbe\x69\xff\xab\x7d\xc8\xdf\x68\x15\x58\x1c"
+ "\xc5\x6e\xbe\x0e\x85\xf6\x4a\x6f\x2f\xee\x22\xbd\x1b\xbb\xd7\x4f"
+ "\xe3\x14\x7f\x86\xdd\x6e\x76\x89\xd6\xaa\x10\x0d\x6b\x77\x3c\x4a"
+ "\x7b\x7d\xab\x5a\xcc\x00\xb4\x2f\x01\xd9\x6c\xa4\x45\x53\x8e\x34"
+ "\x89\xbd\x85\x6d\x67\x9c\xf0\x99\x24\xaf\xfb\x69\xad\x1a\xb6\x29"
+ "\xd8\x11\xb7\xa1\x7d\xc4\xb2\x45\xf7\x97\x01\xed\xcd\x42\xe7\x6b"
+ "\xd2\xfd\x0d\xb5\xdf\x5c\x2e\xef\xcf\x62\x43\xdb\x80\x30\x8e\x0e"
+ "\x2f\x10\xcd\x4e\xb0\x2d\x6d\x2b\x69\xc2\xf4\x7b\x5c\xc4\x1b\x66"
+ "\x2b\x95\x71\xa8\x38\x0e\x35\x1f\xbb\x35\x23\x9c\x53\xf8\x37\x96"
+ "\xf4\xb6\x2c\x17\x90\xdd\x77\x74\x23\x8e\x92\x4e\x81\x03\x71\x31"
+ "\x6c\x03\x42\xe2\x24\xfc\xa3\x76\xb1\xbf\x22\xfe\x33\x54\x5f\xb4"
+ "\x4f\x17\xcd\x53\x42\xbe\x44\xd1\x5e\x0d\xc2\x0f\xb5\x2d\xaa\xfb"
+ "\x3d\x80\xb4\xd7\x18\xca\x9b\x2d\x95\xf6\xf2\xa2\xfd\xc5\x6e\xb6"
+ "\xb7\x18\xf2\x28\x41\xde\x5f\xcc\xbf\xfd\xdb\xdd\x5b\x0c\x71\xeb"
+ "\x6b\xd5\x0c\x75\xce\x96\x4a\xfb\x8b\x21\xfd\x0d\x24\x87\x52\x99"
+ "\xd2\x5e\x7d\x8a\x78\xbe\xe7\x20\x85\x1d\xb1\xb1\x56\xb9\xfe\xa9"
+ "\xbc\x54\x16\x8c\xb3\x08\xff\x90\xa1\x5e\xee\x4b\xa3\x78\x0c\xcb"
+ "\x22\xf8\x39\x68\xc7\x1c\xd8\x86\xbd\xdb\xd9\xaf\x3e\xb2\x13\x34"
+ "\xc2\xa6\xed\xcf\xa1\xf4\xc2\xa6\xed\xd7\x07\x6c\xda\xfe\x51\xc2"
+ "\xa6\x09\x1e\x0b\x9b\xb6\x5f\x25\x6c\xda\xbe\xaf\xf8\x7c\x22\xb4"
+ "\x69\x14\x47\x76\x4d\xb6\x69\xc7\xc7\xb2\x56\xb2\x1d\x1e\xdb\xbe"
+ "\x6e\xd9\xb6\x1d\xc2\x30\xb2\x1d\x44\xa3\xb0\x53\x7b\x53\xd8\x1f"
+ "\x8c\x20\xe6\x6b\xd2\xb3\x99\xf6\xcf\xe8\x96\x9e\xa9\x3d\x79\x52"
+ "\xd8\xb8\xfd\xc9\x01\x1b\xb7\xcf\x1e\x48\x4b\x36\x6e\xff\x63\xc2"
+ "\xc6\x89\xf0\xba\xa7\xc8\xc6\xed\x4d\x21\x1e\x48\xf8\xd5\xf4\x1d"
+ "\x4d\x82\x27\x3e\xa6\x05\xdb\xb8\x50\xfd\xda\x5f\x25\xdb\x38\xb2"
+ "\x6d\xf8\xde\xe0\x84\xa9\x7c\x5c\x98\xf4\xac\x0a\x79\x2e\xeb\x1d"
+ "\xd5\x01\x95\x99\xce\x0f\x20\xbe\x2d\xbc\x0c\xc3\xa5\x7d\x6b\xa4"
+ "\x72\xef\x77\xca\x6b\x34\x91\xff\x83\xf7\x34\x83\xc0\xbe\x64\x58"
+ "\xd7\x53\x68\x3f\x47\x47\x59\x27\x38\xaa\x59\x59\xbb\xef\x02\xf8"
+ "\xf7\x6e\xfc\x9c\xea\x15\xfb\x1b\x3f\xa4\x3b\xd9\x9d\x4b\xf0\xc2"
+ "\xd4\xb5\x6e\x3e\x7e\xff\xf9\x11\x35\xc6\x59\x43\xe2\xe6\x53\x1e"
+ "\x34\xae\x88\xcf\xda\xa1\xc6\x11\xbe\x41\x5e\x87\x6e\x92\xd7\x3b"
+ "\x3c\x2f\xf4\xa5\xb0\xdf\x13\x73\x05\x5e\xe0\xdf\xd0\xf8\x9e\xcc"
+ "\xe1\x71\xfd\x4e\x8a\x8f\x18\x22\xfe\xab\x9b\xa7\x7f\x71\xfc\xcd"
+ "\xd3\xbf\xf8\x00\xd9\x20\x5a\x8f\xd7\x6f\x0b\xc5\x33\xda\x27\xc3"
+ "\x5d\x22\xb8\x1c\xe9\x3b\xc8\xe7\xa5\x53\x79\xbf\x4c\x2f\xe3\x24"
+ "\xb9\x3b\x8c\x70\x7c\xff\x5a\xb4\x91\xa9\x3b\x80\xf6\x0e\x0e\x4e"
+ "\x7b\x3c\xc0\xdf\x17\xd3\x6f\x32\x4e\x13\xe5\xc0\x5e\x20\x9d\x2f"
+ "\xdf\x8c\xad\x20\xad\xa5\xa9\x1a\xf8\xf6\xf0\xa2\x1b\xed\x25\x3f"
+ "\xbf\x55\x5a\xb7\xdb\x83\xf6\x6d\x0a\xed\xb1\x49\x7e\xa5\xb4\xd6"
+ "\x62\x1c\xda\xe5\x58\xda\x87\x85\xc6\xab\xd7\xf6\xa7\xab\x9b\xf9"
+ "\xfe\xfb\x07\x12\xe5\xb4\x43\x8d\xed\x51\xbe\x52\x9e\x7c\x1d\x12"
+ "\xa6\x31\xc9\x69\x08\x37\xad\xbd\xc1\xf6\x78\x0a\xdf\xdf\xcc\xd7"
+ "\x43\x36\x70\x1c\xfa\xa0\xb1\x22\x9f\x6c\x90\xf2\xa9\x76\xc2\x0b"
+ "\xa6\x9b\xad\x73\x1a\xba\x7c\x07\xce\x7f\xf3\xf2\x81\x54\xbe\x97"
+ "\x74\xb7\x28\xdf\x4d\xf2\x7d\x69\xe9\x37\xcf\x57\x27\xe7\x7b\xe0"
+ "\x9b\xf3\xf5\xa5\x33\x5f\x9f\xaf\x89\x12\x5f\x5f\x72\xdd\x82\xaf"
+ "\x61\xf2\xf9\x71\xc2\xd7\xcf\xc7\x20\xe5\xf3\xe3\xcc\x70\xf9\x00"
+ "\xff\x0d\xb9\x5f\x8f\x56\x3e\x23\x46\x3a\x97\x78\x04\xe2\xa9\x77"
+ "\xc2\x81\x81\xb3\x87\xc5\x79\x49\x3f\x3e\xed\x84\x97\xaa\x42\xd7"
+ "\x71\xfd\xf8\xdf\xd6\xd6\x53\xbb\xce\xfc\x4e\xf8\xf1\x79\x1a\x6b"
+ "\x4b\xdd\x25\xf6\x07\x94\xd2\xa0\x3d\x7f\x69\xc8\xfd\x8b\xa4\x3d"
+ "\x72\xb2\xe5\xbd\x3b\x68\x7d\x2a\xab\x6c\xcc\xee\x2d\x35\x83\x38"
+ "\x2b\xfa\xe5\x7b\x69\x1d\x12\x3e\x0f\xc7\x67\x31\x0e\x45\xe7\x0b"
+ "\x88\x3d\x29\x86\x61\xd8\x1e\x3a\x7f\x42\xac\xdf\x7b\x39\x03\x69"
+ "\xb0\xf2\xb1\x26\xbe\xc7\x3e\xdf\xdb\xc5\x8d\x70\x6a\x4a\x2b\xf6"
+ "\xf4\x78\xd9\x2a\xc3\x38\x65\x7c\x03\xfb\x5b\xbc\xbc\x44\xb4\x2d"
+ "\x2f\xa7\xf5\x0e\x71\x8e\x11\xed\x73\xd6\xb0\x3b\x31\x64\xfd\xe1"
+ "\xa2\xc2\xc2\x2d\x85\xf3\x0c\x45\x9b\xd6\xcd\x2a\x2a\xce\x29\xde"
+ "\x5a\xc4\x17\xaa\x8f\x04\x0c\x30\x14\xe7\x6f\xca\xdb\xb2\xb5\xd8"
+ "\xb8\x3d\x27\x5f\x2c\x6c\xbf\x0b\x01\x83\x81\x20\xf4\xdc\x48\xb4"
+ "\x41\xe7\x98\x9a\xef\x41\xc1\xcf\x8e\xa4\xbd\x48\xe4\x75\xbb\x2d"
+ "\x7a\x7e\xc6\x16\xda\xac\x83\xc9\x4e\xd8\xd2\x2d\xd7\x03\xed\x8f"
+ "\x88\x7e\x8b\xfe\x12\x1c\x7c\x92\x64\x67\x05\xba\xa0\x75\x62\x5f"
+ "\x09\xbe\x37\x80\xa3\x18\x03\xda\x41\x6b\xdf\x46\xe3\xb0\x07\xcf"
+ "\xf9\x6d\x2f\xdb\xf9\x7e\x8f\x3b\x2f\xd1\xfb\x35\xd9\x4f\xa0\xef"
+ "\x4a\xe2\x3b\xf0\x94\x05\x9d\x70\x70\x06\xe5\x4b\x7a\x57\x5b\x29"
+ "\xce\xea\x66\xb6\x97\x3b\x68\xad\x36\xbe\x6b\x91\x06\xbb\xec\x8b"
+ "\x22\xbd\x51\x2c\xa6\x11\x7d\xb4\x83\xee\x0f\x74\x2e\x90\xd6\x7a"
+ "\x6b\x6b\xc5\xba\x6e\x0d\xc2\xf6\x0c\xc0\xda\x68\xdf\xe3\x46\x33"
+ "\xb6\x9b\x61\xbf\x65\xb3\xd8\x5d\x99\xfe\xbe\xcc\xc8\xe0\x32\x63"
+ "\xbf\x1a\xeb\xef\xd0\xdb\x58\xf6\x38\x59\x56\x44\xdd\x1f\x3a\x24"
+ "\xf6\x5e\xde\x95\x89\x61\xc3\xf0\x6e\xe9\xc5\x38\xda\x03\x01\xe3"
+ "\xb2\xe9\x1b\x59\x7b\xc9\x55\x7b\xb3\xbe\x13\xeb\xfd\x90\xc5\x09"
+ "\xdb\xe2\xc5\xba\x35\x84\xc7\x3c\x1c\x65\x37\xa0\xc5\xc0\xec\x34"
+ "\x46\xe7\x84\x43\x67\x5a\x0c\x6e\x60\x11\x6b\x3e\xa7\x74\xa8\x57"
+ "\xfa\x52\x2b\xf9\x22\x18\xce\xd7\xe7\x1d\x6a\x94\x79\x5e\x6c\x60"
+ "\x97\x09\x66\xa8\x71\x65\x6a\x2f\x8f\xf0\xb6\xe4\x4b\xa0\x39\x58"
+ "\x5d\x70\xe8\xbc\xb2\xbd\x98\x61\x9a\x67\x30\xe5\x14\x1b\x0a\xf2"
+ "\x37\xe7\x19\x4c\xf9\x26\xc3\xe6\x2d\xc5\x86\x0d\x5b\x68\x80\x87"
+ "\x86\x74\x42\x64\xc2\x4f\xe5\xdb\x9e\x19\x29\x7f\xc3\xee\xdd\x6e"
+ "\x1e\x26\x64\xfa\xc8\xac\x5e\x8f\x79\x78\x28\x4f\x8e\xc4\x88\xb6"
+ "\xf2\x70\x36\xd2\xae\x11\xeb\xff\x22\xba\xf1\x1d\xcb\x7f\xa8\x35"
+ "\x54\x77\x8f\x3c\x2d\xc1\x1e\x94\x61\xb9\x5c\x4c\xbb\x34\x10\x77"
+ "\x44\x92\xc7\x3a\xb1\x4e\x99\xef\x7b\x53\xc7\xe7\xf0\x1f\xb6\x0f"
+ "\x99\x86\xf6\xfa\xda\x09\xb9\x57\xe0\xf0\x3b\xcc\x76\xc8\x2d\xc9"
+ "\x90\xd6\x5f\xbe\xcb\x2c\xc9\x0f\xca\xc4\x11\x18\x2c\x3f\x47\xb2"
+ "\x48\x7e\x98\x27\x53\xcb\xe7\x7b\xf8\xbc\x68\xe7\xf0\x1d\xdb\x67"
+ "\x27\x1c\x36\x51\x39\xdc\xdb\x33\xb5\xa5\xc7\xf8\xfe\x7b\x5f\xd0"
+ "\xb7\x53\x3a\x9f\x06\x65\x65\x84\x38\x47\xf3\x48\x86\x5c\x47\x32"
+ "\x7c\x78\x1d\xe6\xf2\x12\x2a\x63\x82\x9f\xff\xc8\x65\x0c\xfd\x03"
+ "\xa4\x49\x2d\xef\xf3\x47\x6d\x08\xd2\xd6\x52\xbc\x8b\x31\xcc\xa3"
+ "\x29\x48\x0e\xae\x84\x93\x03\xac\xdb\xdc\x82\x2d\xb9\x1b\x51\xd1"
+ "\x0b\xf3\x8a\x73\xcd\xb4\xb7\x05\xd9\x01\xbe\x71\xc6\x0c\x93\x61"
+ "\x6b\x51\x5e\xee\x48\x08\x07\x35\x10\x19\x5c\xff\x3a\x3f\xca\x6b"
+ "\x6f\x6f\x66\x24\xad\xb1\x10\x6b\x2a\x2a\x76\xf5\x16\x61\x5f\x24"
+ "\xa4\xde\x2b\x9e\x73\xe8\x13\xd1\xa7\x4b\xe4\x7b\xc7\x11\xcf\xc4"
+ "\x3c\x81\x8a\x9f\x11\x1f\x7a\xd5\x2a\x6c\x4f\xca\x8b\x65\x19\xc0"
+ "\xe7\x32\x2c\x93\x39\x30\x47\xa3\xe2\x74\xaf\x3a\xf2\x02\xd9\x1f"
+ "\x31\x1f\xe4\x12\xda\x81\xe8\xba\x4e\x28\xe7\x73\xc1\x6a\x79\x7b"
+ "\x54\x7e\x5a\x4e\x73\x78\x60\x9d\x73\x45\xbc\x2c\x27\x41\x69\xde"
+ "\xa6\x30\xbe\xd7\x91\xed\xc8\x39\xaa\x73\x26\xea\x5e\x23\xc3\x21"
+ "\x5f\x59\x1d\xb7\x23\x15\x5a\xa5\x6d\xf8\x40\x47\xdf\xc4\x05\x3d"
+ "\x5c\xfe\x74\xbb\x52\xf8\xbe\x29\xe8\xeb\x75\x42\xc5\x18\x69\x7e"
+ "\x0a\x1f\x53\x74\x58\x11\x97\x57\xe0\xc2\xbc\xae\xcb\x79\xb1\x98"
+ "\x5d\x74\x9e\x29\xca\x59\x85\x39\x30\x66\x58\x11\x47\x7d\x65\xd6"
+ "\x9b\x39\xcc\x09\xe5\x19\x5c\xb6\xf0\xb9\x78\xbc\xd8\xc3\x8d\xe4"
+ "\x8d\xca\x49\x72\x15\x90\xa9\x8a\x93\x72\x7d\x53\x99\x31\x5d\x96"
+ "\x81\xef\xf3\x5b\x61\x97\x79\x39\xd4\x5e\x33\x5c\x6f\x75\x48\x8b"
+ "\x47\xe8\x2e\xef\xe7\x89\xfd\x85\x68\x9d\x4b\x04\xd2\x68\xbe\x08"
+ "\x95\xff\x46\x73\xf7\xa3\xbd\xd4\x6f\xda\x65\xa6\xbd\x13\x44\x5b"
+ "\x56\x69\x40\x19\x8e\x0b\xac\x4d\xaf\x44\xff\xaf\x3c\x4e\xd4\x5d"
+ "\x65\x72\x90\xee\xb9\xa4\xf9\x00\xc3\x89\x47\x64\xcf\x1c\xd6\x45"
+ "\x5c\x5f\xc5\xba\xdf\x4a\xb3\x9c\x8e\xef\x33\x80\xb2\x41\xf3\x60"
+ "\xaf\x40\xe5\x01\x6a\x23\x88\x3e\x27\x54\x6a\x29\x7f\x2a\x1f\xb5"
+ "\xd9\x5c\x6e\xf4\x74\x06\x4a\x65\x83\x82\x86\xd3\x32\x2e\x09\x77"
+ "\x8b\xfc\x4e\xfb\x8e\x39\xa1\x2a\x9d\xce\x81\x6c\x76\xf3\x32\xdc"
+ "\xd6\x82\xbd\x82\x16\x37\x87\xeb\x91\x79\x88\xe1\x65\xf8\x8e\x75"
+ "\x71\x10\xc4\x37\xa1\x46\xb3\xb0\x45\x55\x74\x86\x29\x2b\x35\xd0"
+ "\xbe\x84\xc9\xc2\xde\xf0\xbd\x74\x78\xdc\x08\x49\x67\x47\xd0\x1a"
+ "\x21\x3e\x2f\xc6\xed\xe3\xb6\x41\xec\xbd\x80\xf1\xa8\x23\x1e\x3a"
+ "\xd3\xa5\xcf\x3c\x42\xd0\xf6\x4a\xf6\x40\x1e\x74\x3e\x25\xff\x06"
+ "\xf9\x4a\xba\xd8\xcb\x64\x38\xf6\xf5\x5e\x29\x93\xeb\x6f\xdf\x51"
+ "\x0c\xa3\xf3\x53\xd5\xa0\x6d\xe1\x7b\x85\xbd\x52\x23\xd3\x2b\xc5"
+ "\xa9\xb9\x3c\x70\x1e\xbc\x32\xa0\xff\xbd\xfc\xac\xcf\x57\x5a\xe5"
+ "\x7c\x38\x2c\xc2\x11\x7c\x4b\x02\x8f\xeb\x1a\xc0\x23\xf6\x50\xd1"
+ "\xf2\xf3\x9e\xeb\x29\xae\x0a\x02\xb6\xaa\x92\xef\x57\xcc\xe7\xad"
+ "\x61\x39\x5c\xcf\x9b\x47\xf0\x3a\x30\x00\x9d\x0f\x42\xe7\x08\xab"
+ "\x85\x2c\x56\xcd\x95\xd3\x44\xa8\x88\x8f\x55\xa9\x72\xde\x32\x0e"
+ "\xa2\xff\xa6\x36\x4f\x94\x45\x43\x3a\x22\x9d\xd9\xc9\xed\x85\xf0"
+ "\xb5\xaa\xda\xb8\x0c\xf2\x72\x56\xd5\x07\xd7\xb5\xf0\xe5\xaa\x4e"
+ "\x07\xc9\x03\xd1\x33\x50\xff\x58\xf7\x6e\xd1\x96\x54\x75\x04\xd1"
+ "\x98\x82\xef\xdd\x81\x7a\xe0\x75\x44\x67\x40\x85\x3d\xef\x91\xeb"
+ "\x0a\xc2\xf8\x19\xa7\x93\xea\x03\xfb\x62\x49\xd0\x42\x3e\x21\xea"
+ "\x0a\xf2\x04\x69\x7c\x75\x13\xc9\x95\xc7\xf6\x6a\x4a\xa8\x6c\xbe"
+ "\x9a\x1e\x44\xaf\x8a\xec\x3a\x86\x99\x64\x18\x27\xbc\xca\xd7\x32"
+ "\xc9\xfc\xc4\xb8\xb2\x81\x7a\xbc\x8f\xc3\x96\xcb\x74\xde\xa2\xcd"
+ "\x90\x78\xf5\xea\xc7\x52\x1e\xad\x72\x1e\xf8\x8c\xfd\x9f\xaa\x2c"
+ "\x25\x8e\x75\x3b\x8a\xf3\xc4\xe6\x46\xd4\xc8\xe7\xe4\x6e\xcc\x33"
+ "\xcd\x34\xe4\xac\xa7\x6d\x90\x8a\x0a\xf2\xf2\x2c\xfc\x23\x4e\xa8"
+ "\x1f\x18\xc7\xf3\x43\x3e\x88\x3d\xa7\x5f\x7b\xec\x15\x31\x7f\x85"
+ "\xf4\x82\xf4\xdd\x45\xfa\xde\x5c\xf2\x25\xef\xdb\x38\xca\xee\x03"
+ "\x87\x97\x95\x91\xff\xcf\x6d\x1f\x95\x5f\xef\x16\xed\x00\xd6\x27"
+ "\xb5\x91\x1e\xdb\x51\x4b\x28\xbf\x8e\x96\x85\xea\xf2\xd1\xf2\xf0"
+ "\x76\xe2\xe8\xbd\xdc\x4e\x94\x0b\xb9\x20\xfb\x44\x73\xff\x09\x2f"
+ "\xa6\x69\x51\xe0\x3c\x1f\xb0\x51\x47\x9d\xb2\x8d\x12\xed\xc4\x6b"
+ "\x1a\x6c\x83\xca\xa5\xbc\x7c\x01\xb9\x79\xad\x44\xc8\xcd\x6b\xd8"
+ "\xff\xfb\xc7\x7d\x72\x5f\x47\xb4\x1d\xaf\x3a\xc9\x7f\x14\xe7\x6b"
+ "\xbf\x96\x28\xe3\xab\x8a\xa5\x76\xe3\xb5\x94\xc1\xfe\xc3\xd1\x1e"
+ "\xf2\x1f\x68\x5e\x22\xf1\x82\x9f\x27\xcc\xf5\xe6\xb5\x82\x20\xfb"
+ "\xa3\xc3\xf7\x92\x70\x75\xbd\x8e\x9a\xe3\x59\xf4\xb9\x6d\x56\xee"
+ "\xe6\xe2\xf9\xb4\x45\x55\x9e\xd5\x92\x97\x5b\x9c\x67\x52\x7e\x67"
+ "\x33\xca\xbe\x18\x7d\xe3\xae\x42\xbd\x77\xc5\x10\x3f\x5e\xc3\xf2"
+ "\x1f\xf3\xc9\x65\xe0\x76\x0a\x7d\x47\xc9\xc6\x45\x5d\x84\x63\x1f"
+ "\x8b\xb3\xc4\x5f\xf3\xc9\x72\x42\x70\x0b\xad\xcc\xef\xb1\x55\x63"
+ "\xf9\x8f\x6a\xa5\xfe\x16\xf6\x69\xab\x0d\xf2\x7b\x20\x7d\x75\x1e"
+ "\x6f\xfb\x8e\xf2\x39\x7d\xc8\xd3\xea\xae\x20\x7f\x8b\xde\xcf\x48"
+ "\xef\x7c\x1f\x26\x71\x2e\x7a\xf5\x0e\xc1\xdf\x6a\xac\xff\x57\x25"
+ "\x5b\x71\xac\x55\xe0\x01\x78\x6b\xb7\x2b\xb2\x8e\x8f\xef\x57\x97"
+ "\xcb\xf9\x61\xfa\x0b\xc1\x79\x52\xbb\xa5\xc4\xe7\x84\x6a\xbe\x3e"
+ "\x64\x2f\xdf\x43\xae\xfa\x6c\x18\x5a\xd3\x83\xe1\x10\x06\xfb\xbf"
+ "\xaf\xd6\xc8\x65\x5e\x65\xa5\xb0\x63\x9a\x9b\x94\xb1\x47\x94\xf1"
+ "\x58\x19\xc9\x16\xe5\x4f\xf2\x2f\xd1\x60\x92\xf6\x25\x71\xd2\xf9"
+ "\x8d\x44\x3f\xdf\x1f\x4d\x4f\x7a\x7d\x0c\xfb\xbf\x15\x67\xe5\x72"
+ "\x50\x19\x4f\xef\x76\x69\xe4\x7d\xa9\x44\xfa\x63\xf3\x43\x69\x3b"
+ "\x76\x30\x28\x4d\xb7\x7d\x1a\x8d\xdd\x1f\x9b\xc1\x6c\xaf\x1d\x20"
+ "\x39\xa4\xfd\xaa\xaa\x06\xe4\xf0\x58\xd3\x60\xb9\x3b\x96\x40\x72"
+ "\x17\x2c\x4b\xf9\xf7\xe5\xa2\x24\x15\xe5\x15\xcf\xe3\xde\x3d\x3a"
+ "\x76\xb4\xed\x59\x4e\x71\xfe\x96\xcd\x45\x33\x0d\x45\xa6\x1c\x49"
+ "\xe9\x43\x74\xde\xc6\xfb\xfe\x6e\x59\xcf\x3c\xb6\xd7\x13\x02\xb6"
+ "\xe5\xf5\x80\xfc\xd3\x1c\xad\x69\x34\x36\xfb\xfa\x0e\xa1\x4f\xaf"
+ "\x2f\x0d\xd2\x5d\x9e\x9e\x74\xb4\x8e\xfb\x6c\xaf\x07\xb7\xff\x6e"
+ "\xe4\xe9\x88\x2b\xf0\xfa\x18\x89\xa7\x6e\xc1\xe3\xd7\x7f\xc5\xcb"
+ "\xc9\xf7\xe3\x3a\x76\x9e\xca\xc9\xf7\x7f\xe1\xfe\xd9\xeb\x27\xe5"
+ "\xf2\x06\xfa\x0d\xaf\xdb\xb9\x1f\x25\xf9\x6b\xb7\xea\xd7\x0b\xff"
+ "\xf4\x8d\x2c\x69\xec\xad\x43\xee\xe3\xc9\xfe\x35\xd2\x62\x12\xbe"
+ "\xea\x1b\x63\x56\x94\xb0\xbe\xb5\x56\xda\xa7\x8e\xea\xe0\x8d\x87"
+ "\x64\xdf\x92\xcf\xdf\xab\xd8\x95\xe6\xb1\xbd\x91\x14\x6c\x27\x58"
+ "\xc4\xc6\x0e\xc9\x47\x4c\x13\x7d\xd7\xdb\x7e\xde\x89\x79\xd1\xb7"
+ "\x87\x9b\xd0\x86\xe5\x7a\x03\xed\xdf\xbb\xa7\x09\x0f\xf9\xd7\xac"
+ "\x57\x2f\x9d\x55\x59\xc3\xbf\xe1\xd5\x22\x6e\x17\xd6\x2d\xc2\xa1"
+ "\xff\xf7\x3a\x97\x0d\x3f\xca\x28\xcd\xdd\x71\xcb\x3e\x12\xbc\xf1"
+ "\x29\xb5\x45\xf8\x8c\x72\x5b\x63\x14\x32\x55\x63\x74\x15\x19\xa1"
+ "\xb7\x57\xaf\xee\x2d\xca\xd4\xd0\x78\x01\xf1\xc2\x51\xe3\x05\x21"
+ "\x3f\x6f\x78\xd1\xe6\x9d\x0c\xc6\x27\xe1\x22\x9e\x6a\x88\x0e\x56"
+ "\xa4\x57\x93\x7c\x93\xbc\xb2\x5e\x23\xfa\x09\x6f\xd8\x59\x91\x51"
+ "\x3d\xc4\xde\x5b\x37\x2b\x67\x14\x9d\xf7\x48\x67\x80\x92\xbd\x12"
+ "\xfb\xfb\x1f\xdf\xff\x8a\x18\x1b\x90\xf2\xad\x79\x89\xa9\x4f\xf0"
+ "\x76\xe5\x30\x6f\x57\x18\x88\xfd\xd2\x6b\x4e\xf2\x79\xb4\x96\x13"
+ "\xfc\xcc\x57\x69\x7d\xb6\xab\xc5\xe2\xe3\x67\xd5\x95\x16\x93\x9f"
+ "\xe6\xa3\xef\x46\x7c\xfd\x71\x73\xb1\x0f\x56\x79\x49\x26\x6b\x3a"
+ "\x68\xaf\x78\x71\x16\x78\x4d\x97\xbc\x3f\x3c\x9d\x21\x49\xe7\x9f"
+ "\x62\xb9\x22\x02\xe7\x97\x1e\x3f\x43\xe3\xb6\xa2\x3f\xae\x87\xc3"
+ "\xe8\xd3\x8b\x3a\x38\x3e\x8b\xce\xe2\x13\x7d\x85\x4e\xac\x97\x88"
+ "\xbf\x20\xec\x22\xf1\x0d\x59\xb6\x13\xc7\xdf\xa3\xb9\xe9\x4e\x09"
+ "\x87\xc7\x76\x1c\xdb\xff\x37\xcc\x22\x2f\xc4\xe7\x91\xeb\xf3\xf8"
+ "\xac\xc1\xe3\x1b\x01\x7c\x98\x7e\xa6\xe4\x17\x80\x18\xfb\xfa\x80"
+ "\x70\xd5\xc8\x63\x5f\x01\xdf\xe7\x78\xa3\x3c\xf6\x25\xf6\x9e\xae"
+ "\x29\xa6\xfc\x87\x1a\x23\x62\xa5\x4f\x92\xdc\x6b\xc9\x87\x1b\xd2"
+ "\x9f\xc0\xf6\x9d\x68\x97\xfd\x42\x51\x3f\xb5\x4b\xc8\x3f\xa4\x33"
+ "\x57\x65\x5f\x52\xf8\x00\xb5\x19\xa2\x2d\xab\x4d\x92\xdb\x32\x4c"
+ "\x7b\x5a\xb2\x15\x52\x3b\x57\x3b\xd0\xff\x0d\x3f\x2f\xbf\xb6\x58"
+ "\xe6\x91\xcc\x73\xc1\xa3\xda\xb6\xde\xd8\xc2\xf2\x00\x6f\x6b\xdb"
+ "\x38\xaf\x07\xe2\xeb\x22\x83\x78\x4f\xef\x1a\x61\x37\x6b\xb1\xfd"
+ "\xaf\x99\x2b\xda\x14\x11\xc6\x62\x1b\x37\xf2\x73\xdb\x39\x0f\xf2"
+ "\xf9\xd8\x8c\xab\xd4\x48\xb4\xb9\x9c\xaa\x44\x83\xb0\x65\xb5\x08"
+ "\x7f\x5c\xea\x93\xd5\x56\x13\x2d\xc1\xf4\xae\xde\xbc\x71\xf3\x96"
+ "\xed\x9b\x69\x40\x6d\x6b\x91\x21\x77\x8b\x29\x6f\x64\x98\xf1\x10"
+ "\x3d\x9d\x6b\xed\xae\x1a\xd8\x77\xea\x4d\x2d\xcd\xa3\x17\x67\x16"
+ "\xbc\x39\xc2\x70\x07\xc9\x57\xdd\x26\x1a\x2b\xe0\x67\x47\xd0\x1e"
+ "\xab\x62\xdc\xa0\x9b\xd2\x0b\x5e\x9f\xb8\xd6\xbb\xdd\x2c\xf9\x58"
+ "\x27\x7e\x4a\x7c\x94\xfa\x1c\x0c\xcb\xf8\x85\xdc\x0e\x11\x7d\xdc"
+ "\x37\xef\x33\x72\xbb\xe8\xef\x33\x6b\x38\xbf\xfa\x8c\xd8\xde\xd4"
+ "\xb5\x3a\x55\xb3\x7d\xa2\x5c\x75\xe7\x65\x7e\x50\xf9\x3d\x74\xd6"
+ "\x26\xcb\x47\x19\x7d\x53\x2b\xe1\x22\xfb\x49\xb8\x6b\xe4\x79\xdc"
+ "\xb4\x97\xa8\x7d\x1b\xed\x23\x5c\xff\xa9\xbf\x82\xec\x4d\xbd\x5e"
+ "\xb6\x4b\xd4\x16\xf9\x11\xcf\xbb\xd7\x5d\x91\xa8\x37\x0f\x61\xda"
+ "\xb1\x9d\x70\xc2\x24\xce\x1b\xa8\x4f\x0d\x3d\x6f\xe0\x84\x01\x2f"
+ "\x93\x74\xed\x0b\x7a\xbe\xd9\x25\xa7\x49\x0f\x84\xd5\xd7\x2b\x60"
+ "\xf6\x21\x4d\xa7\x06\xfc\x15\xb1\x9f\xa9\xb4\xff\x31\x9d\x9d\x51"
+ "\xff\x05\xed\x19\x1a\x90\x8d\xfa\x51\x92\x0f\xd2\x4d\xbc\xa3\xf6"
+ "\xb6\x0b\x4e\x88\xbd\x4c\x2a\x51\x36\x58\x26\x50\x99\x98\x27\x1f"
+ "\x65\xe2\x84\x26\x20\x07\x82\x47\x18\xa6\x0f\xf8\x29\xf5\x3d\x94"
+ "\x26\x98\x0f\x98\xc7\x43\xa2\x6f\x7a\x22\x45\x6e\xb3\x69\xbf\x54"
+ "\x71\xfe\x44\xfd\xa9\xd3\xbb\xbb\xb1\xcf\x7f\x22\x2b\x08\xc7\x29"
+ "\x69\x2c\x42\xc3\xd4\x75\xba\x3a\xde\x67\x3b\x51\x12\x18\x13\xa8"
+ "\x3f\x45\x76\x97\xe3\x88\x6d\xb4\x38\xdc\xfc\xcc\x68\x95\x7c\x46"
+ "\x3c\xc2\x9e\x94\x7d\x14\x19\x57\x8b\x18\x73\xe2\x7b\x5c\xa2\x0e"
+ "\x96\x23\xcc\xd9\x81\xf1\x58\x0c\x1b\xe8\x03\x5a\x51\x8f\xb9\xef"
+ "\x7d\xa2\x27\xd0\xd7\xab\xe3\xfb\x0a\xf0\x7e\xa0\xc0\xa3\x75\xc2"
+ "\x09\xa7\xb2\xdf\x86\xfe\x83\x21\x7f\x73\x3e\xba\x0f\x1b\x2c\x5b"
+ "\xe6\x63\xd7\x61\x83\x25\x7f\x3e\x4d\xf9\x5a\x96\xba\x84\xdf\x51"
+ "\x39\xe6\x87\x19\x3f\xa6\x71\x6f\x7e\x2e\x33\x8d\x19\x61\x3f\x97"
+ "\xc6\x4e\x3d\xe2\xac\xd4\xe1\xd2\x5d\x2b\xdd\x87\x61\xbb\x67\x41"
+ "\x5d\x39\x44\x67\xdf\x20\xff\xeb\xfd\x36\x71\xce\xab\xd4\x66\xa3"
+ "\x2d\x7f\x73\xbf\xfc\xbd\x8c\xcf\x81\xa7\x7d\x0c\x7b\xcd\x7c\x3c"
+ "\xce\x63\x7b\x73\x60\xfc\x43\x8c\x2f\x8a\x6f\x6e\x18\xde\x21\x87"
+ "\xcb\xe3\xb1\x18\xd6\x23\x8f\xbd\x0a\xd8\x37\x7d\x81\xb4\x21\x63"
+ "\xdb\x71\xf2\xf7\x38\x8f\xed\x2d\x83\xcc\x33\x19\x4f\xa9\x81\x5d"
+ "\x91\xfc\xa4\x08\xee\x57\xdb\xde\x8c\xe3\x7b\x87\x92\x2f\xce\xc7"
+ "\x99\xdf\xca\x90\xf3\xa1\x3e\x02\xd1\x2d\x7d\xfb\xe1\x7a\x4f\x7b"
+ "\x84\x8a\x3d\x46\xdf\x1a\xa8\x7f\x05\xcf\x8d\xdf\xbb\x8b\x8f\xcb"
+ "\x1b\x8b\xd0\x3f\xbb\x4b\x31\x0e\x47\x32\x34\xa7\x0a\x46\xf0\x31"
+ "\x26\xd1\x4f\x8f\x24\x1f\x01\xcb\x70\x02\xeb\x33\x82\x6c\xb9\x68"
+ "\xf7\xde\xba\x30\xd0\xc6\xeb\x1a\xcd\x2c\xb6\xf0\x20\xed\x33\x2f"
+ "\xd6\x2d\xbc\xf5\x15\xc9\x9b\x6b\xdc\x46\x0f\xa3\x39\xca\xaf\xad"
+ "\xf1\x88\x71\xf8\x86\xfb\x03\x63\x66\x6f\x1d\x90\xf6\x44\xa5\xf9"
+ "\x6f\x58\x5f\x0d\x33\x07\x7c\x4e\x84\xe7\xbe\x17\xe2\xa4\x35\x0a"
+ "\x94\xff\x37\xf8\xce\x83\xfd\xfe\xff\xad\x15\x7a\xda\x60\xe7\x38"
+ "\xd0\x56\x8b\x75\x00\x0d\xe8\xff\xbf\x55\x23\xda\x06\xc2\x9d\x09"
+ "\xbd\xb1\x9f\xba\x7a\x6d\x9f\xcc\x24\x1e\xba\x63\xaf\x24\x8a\x3d"
+ "\x88\x1b\x7e\xe5\xb6\x69\xb0\x4e\x1b\xb0\xfe\xff\x61\x50\x5f\x57"
+ "\xce\xab\x6f\x1b\x6b\xf1\x5d\x67\x4d\x87\x7f\x8f\x76\x6e\x3d\x80"
+ "\x6f\x1b\x6b\xec\xbb\xce\x4e\xf3\x33\xc8\xd7\x01\x1c\xfa\x13\x40"
+ "\x7f\xc4\x9a\x2f\x6e\xa0\xac\x2e\xbf\xe6\xbf\x42\xe7\x05\xd6\x21"
+ "\xdc\x72\xf7\x55\x56\x8b\x69\x96\x5b\xd8\x95\x5a\x84\x5b\x76\xf9"
+ "\x0a\x3b\x8e\xb0\xcb\xcc\x28\x2b\xdb\x98\xaf\x3f\x62\xe3\x17\x86"
+ "\xc7\xc9\x76\xbf\x9d\xea\xaa\xd8\x51\xc3\x6c\xea\x23\x6c\xef\x3d"
+ "\x77\x7b\x6c\x6f\xa7\x0f\x9c\x53\x86\x78\x49\xae\x56\x58\xe9\x79"
+ "\xe3\x17\x28\x07\x5f\xac\x45\xbf\x03\xe5\xf6\x0b\x84\xa3\xef\x3f"
+ "\x7c\x6d\x96\x2b\xe2\xee\x58\xbc\x8c\x61\xe9\xbf\xce\x5a\xfa\xb7"
+ "\xb1\xa6\x23\xcf\x20\xfd\x97\x90\xfe\xeb\xac\x11\xcb\x70\xfa\xf0"
+ "\x45\x00\xa2\xbf\x9f\x70\xf6\x43\xc4\xda\x1d\xaa\x98\x3a\x8c\x5f"
+ "\x6b\xd5\x41\x1d\xc2\x3e\xe3\x86\x98\x5a\x84\x79\xe6\xb9\x18\xe0"
+ "\xf4\xf7\x20\xdd\x31\x3b\x6a\xfa\x31\x6f\xa2\x1f\xf3\xf7\xca\x74"
+ "\xca\xf9\x13\xbd\xb2\xde\xae\xa5\x31\xc2\xd8\xc2\xf3\x44\xb7\xf8"
+ "\xee\xf1\x77\x39\xae\x22\xac\xe7\x88\x7b\xee\x16\x7d\xec\xbf\x4b"
+ "\x92\xe9\x0f\xfd\x0e\xf6\x77\x65\xc2\x7e\xfe\x1d\xf6\x7f\x1a\xa4"
+ "\x33\x5d\x44\x18\x95\xdf\x85\x7a\x2b\xad\xfd\xfb\x42\xe6\x19\xc6"
+ "\xcf\x54\x7e\xe7\x4a\xdf\x52\xc8\xc7\xa8\x73\x72\x8b\xf3\xb7\xe5"
+ "\x60\xcf\x77\x24\x58\x28\x88\xf7\x8d\xf3\x4c\x86\x2d\x9b\x0d\xeb"
+ "\x73\xf2\x0b\xb6\x6c\xcb\x2b\x9c\xc9\x87\x33\x8a\xf2\x36\x9b\x68"
+ "\xe8\xba\x30\xa7\xd0\x32\x52\xd1\x9f\x29\xdf\x51\xd3\x4e\x67\xd0"
+ "\xec\x26\xf9\x7e\xe7\x63\x69\xdc\xd6\xcb\x6c\x29\xbc\x5f\x2c\x6c"
+ "\xcc\x4f\xee\x37\xec\x4c\xa1\xf8\xf7\x44\x3b\xfe\x4e\x2b\xab\x2c"
+ "\xfc\x94\x31\x7e\xb6\xb6\xea\x0a\xbc\xf3\x33\xce\x8f\xde\x34\x19"
+ "\x0f\xef\xbb\x92\xcc\x5a\x76\x92\x1f\xf6\x93\x2c\x46\xf1\x21\xbc"
+ "\x78\xe7\x90\xf0\x45\x30\xbc\x2f\x0d\x02\xf3\xed\xdf\xf9\x98\xa9"
+ "\xb1\xec\xc8\x4b\xa9\xcf\x60\x95\xd6\x3d\xfe\xba\x13\xde\xa1\xbe"
+ "\x14\x7d\xb7\x39\xc7\x7d\x72\xbe\x3e\xeb\x9d\x7c\xec\x73\x58\x99"
+ "\x6d\x58\x14\xf1\xeb\xb0\xe8\xd3\xab\xa3\x55\x74\x76\x6e\x27\xad"
+ "\x15\x4d\xa4\xef\xbb\x75\x36\x7f\x62\x60\x7e\xd3\xdf\x1d\xa4\xfe"
+ "\x05\xff\xce\xc1\x6d\xd2\x4f\xba\x65\xdd\x55\xd3\xfa\x9b\xbd\x13"
+ "\xe6\x09\xfd\xfb\xc9\x65\x82\xc7\xfa\x9f\x27\xca\xc7\xcf\x01\x47"
+ "\xdf\xe0\x9d\x48\x2c\xff\xff\x66\xa5\x69\xd2\x37\xc9\x77\x22\xfd"
+ "\xb1\x5f\x26\xf6\x17\x61\xbf\x40\xf7\x65\x23\xc6\x5d\xf1\x57\x16"
+ "\xfe\xa9\x1f\x7d\x2a\x3f\xf6\x13\x58\xe5\x97\xff\xd2\x5f\x59\xd8"
+ "\xe1\xdf\x6e\x54\x53\xdb\x5a\x6a\x45\xfe\x6e\x31\x8f\x64\x57\xcd"
+ "\xb7\xf5\x6f\x37\xa2\xff\x55\xe8\x64\x0c\xd3\xc6\x16\xba\xf8\x79"
+ "\xc5\x95\x85\x9d\xd2\xfb\xff\x43\xdc\xfb\x80\x47\x59\x5c\xfb\xe3"
+ "\xf3\x6e\x96\x10\x31\x64\x37\x31\xe0\x0a\x41\x16\x0d\x36\xb5\xfc"
+ "\x89\x8a\x2d\x7a\xb1\x46\x81\x8a\xbd\x68\x52\x8b\xf7\xa6\xb7\xd8"
+ "\x04\x4d\x6c\xb0\x31\xac\xc9\x02\x9b\x18\x36\x7f\xe0\xa6\xb4\x85"
+ "\x64\xc1\xc0\x45\x09\x90\xf6\x62\x2f\x52\x84\x50\xb1\x8d\xbd\x28"
+ "\xab\x44\x1b\x35\x64\xa3\x45\x8c\x8a\x75\x89\x01\x23\x0d\x61\x25"
+ "\x0b\x59\x92\xdd\x77\xbe\x9f\x33\xf3\xbe\xd9\x0d\x26\xb4\xdc\x7b"
+ "\x9f\xdf\x2f\xcf\xb3\x79\xdf\x99\x77\xfe\x9e\x99\x39\x73\xce\x99"
+ "\x33\xe7\x9c\xa3\xb0\x0a\x3a\x19\x71\x01\x84\xfb\x55\x1e\x91\x7e"
+ "\x68\xda\x20\x85\x4d\x8a\xd0\xab\x4c\x05\x5f\x32\x87\xfa\xae\xf7"
+ "\x59\xf0\x67\x24\x23\x1a\xec\xdb\x0b\x4c\x8f\x27\xbe\x41\xd2\xf0"
+ "\xec\x31\xc0\x58\xda\xb2\x18\x4c\xb7\xeb\x23\x1d\x06\xd2\x3f\x77"
+ "\x21\xe8\xa7\x17\x9a\x55\xf2\x8d\xbe\x7a\xe2\xcd\xdc\xf0\xdb\x1d"
+ "\x84\xb3\xd2\x43\x02\x17\x32\x79\xee\xf4\xc2\x6c\x1d\x9e\x74\x8f"
+ "\x80\x70\x29\xc6\x2d\x25\xcb\xc7\xc6\x48\x3c\xf0\x42\x66\x04\x7f"
+ "\xd8\x4d\x63\xed\x65\xbb\x34\x3b\x5b\x31\xab\x65\xf8\xbf\x76\xc9"
+ "\xb5\xf2\xc2\x1a\x3d\x2d\xe2\xa4\xbd\x1f\x57\xd1\x81\x95\x41\x36"
+ "\xc1\xf6\x5d\x7e\x0a\x63\x94\xa9\xa5\xdb\x13\x5e\x53\x72\xbe\xe1"
+ "\x39\x9b\xf8\x6b\x3a\x7f\xa4\xf7\xed\x23\xdc\x85\x75\xd6\x71\x4e"
+ "\xfb\x15\xed\x9f\xd6\x09\x8c\xb5\xfa\x89\xb7\xda\x1d\x73\xb8\xce"
+ "\xcf\xc4\x38\x27\x14\x7e\xd0\xcb\xf3\x18\x68\xca\x61\x79\x09\xca"
+ "\x83\xf4\xf3\x04\x9f\x84\x75\xa1\x62\x5d\x20\xcf\x31\x9a\xd7\xce"
+ "\xf3\xc4\xbf\xec\x5e\xd3\x54\xda\x45\xb6\xfa\x31\x5f\x77\xaf\x21"
+ "\x18\xd2\x3a\xa8\xae\x14\xf7\x20\xc5\x3e\xe9\x5e\x31\x8b\xca\x78"
+ "\x2a\x2e\xc0\x8c\xad\xd8\x21\x30\x2e\x01\x9b\x93\xc5\x9f\x46\x7a"
+ "\xa3\x9d\xc5\x10\x0f\x3b\x74\x0f\x19\x7e\xff\xe8\x35\xaf\xda\xd5"
+ "\xbb\x71\x55\x79\x5f\xe5\xee\x83\xc0\xfd\x23\xda\x4f\x5c\x3d\x1e"
+ "\x74\x0d\xd2\xb9\x26\xd0\x59\xf5\xee\xae\xcb\xa5\xd5\xef\xe6\xd2"
+ "\x5c\x99\x69\x21\x79\xca\xaa\x5d\xe2\xcc\x3b\x61\x55\xb9\x94\x5b"
+ "\xfe\x2e\x45\xcf\x4f\x72\x4f\xd2\x2b\xa8\xe9\x67\x96\x9a\x41\x5e"
+ "\xf1\x77\x19\x72\x8c\x7e\x97\xa1\xf3\x17\xc3\xd5\x63\xdf\xc9\xd5"
+ "\xb2\xa9\xcc\xe0\xb1\xfa\xd8\x8c\x00\x8b\xdd\xfe\x1c\x63\xae\x12"
+ "\x1e\x78\xa6\x04\xf3\x08\x30\xe6\x86\xdd\xcd\xa4\x7f\xb1\x03\x7b"
+ "\x74\xb5\xca\x58\x14\xda\xf2\xcc\x05\xd4\xe9\x94\xe9\xb8\xb4\xab"
+ "\x66\x41\x3a\x3f\x9e\x89\xc0\x23\xac\xd6\xc9\x62\x6a\x55\x66\x74"
+ "\x39\x59\x12\xe2\x40\x57\xfc\xee\xa8\xce\x0b\x0c\x7b\x2e\xbc\x1d"
+ "\xf8\x11\xf5\x56\x38\x79\xf0\x0d\xf0\x77\x95\x2a\x0f\xfc\x23\x70"
+ "\xf7\xb2\x3d\xb3\x64\x1f\xf7\xcc\xd2\x79\x03\xbc\xa7\x0d\xbd\x63"
+ "\xbd\x27\xe5\xd2\x33\xe6\x47\x97\x2d\xb3\x67\x15\xe6\xd2\x23\x65"
+ "\xea\xf2\x6f\x5e\x4a\x2b\xc6\x4a\x7f\x54\x7b\x32\x69\x6d\x11\xfd"
+ "\x24\xef\x2a\xed\xd9\x12\x21\xef\x21\x99\xf3\xdd\x44\xf7\x91\xae"
+ "\x09\xbe\x1d\x78\x5d\x5c\x1d\x60\xca\x89\x18\x66\xb8\xb4\xbe\xc7"
+ "\x97\xd8\x97\xe4\xdf\x29\xd5\x1a\x86\xa9\xa7\x79\x68\x3d\x2f\x0e"
+ "\x9e\xff\x6a\xbc\xb9\x5f\xe0\xc7\x0d\xe7\xea\x79\xfc\x87\x69\x72"
+ "\xaf\x7b\x31\x59\xd7\x1d\x1c\xde\xa6\x4b\xd1\xc2\xd0\xc6\xfd\x6e"
+ "\x5a\x23\x65\xab\x98\xe1\xa5\x92\x76\x03\xf1\x25\x4e\xbc\x93\x2e"
+ "\x97\x90\x7f\x6b\xbe\x22\x5f\x3b\xd7\x8e\xbd\xf4\x45\x07\xdf\x50"
+ "\xb4\x10\x6b\xde\x36\x92\xfe\x56\xe4\x7d\x78\x79\x76\xff\xa2\xeb"
+ "\x32\xba\x5e\x22\xbd\xae\xa7\x31\x34\xdf\xde\x51\x72\xcc\x5e\xc4"
+ "\xfc\xdf\x5d\xaf\xcf\x5f\x3d\x4d\xcd\x78\xdd\x07\xe7\x8b\x23\xda"
+ "\x41\xe6\xae\x55\x0d\x72\x8e\xef\x9d\x2f\xce\xa8\x27\xb0\x9f\x77"
+ "\xb0\xbd\xf7\x18\x2d\xcc\x82\xf7\xff\xc2\xbb\x90\x61\xd0\xb7\x21"
+ "\xf3\x68\x52\x77\xbd\x11\x18\x07\x98\x47\xe1\xf2\x0f\x84\x9f\xfc"
+ "\x8b\xc2\xcf\xc0\x15\x71\x6b\x25\x0a\x23\x38\x3a\xda\xc8\x4c\x71"
+ "\xb1\x31\x93\xaf\x4f\xb2\xdc\xfd\xdd\x39\xb3\xcb\x9c\xa5\x0e\xae"
+ "\x06\x03\x26\x1e\xe9\x37\xf5\x58\xd7\xc3\xdf\x2c\x97\xf4\xc3\x86"
+ "\x63\xc3\x9e\xa9\xaf\xaf\xe4\x36\xe2\x69\xd5\x84\x1e\x73\xd9\x72"
+ "\x66\xd8\xd7\xef\x35\x10\x0f\x45\x34\x8c\x27\xf8\x29\x78\xf1\xbd"
+ "\xef\x1d\x42\x1c\xe0\xe5\xe0\xae\x1e\xb3\xbc\x93\xb4\x2f\x5e\xdd"
+ "\xd8\x63\x0e\x97\x6f\x64\x54\x3e\xf8\x74\xc3\x4e\x67\x97\xc1\x63"
+ "\xfc\x2e\xf3\x58\xfd\xec\x10\xde\x87\x1d\x2b\xd4\x49\x32\x61\x2a"
+ "\x03\x7b\xf0\xda\xb2\x8b\xd8\x9b\x1d\xe2\x7c\xc6\xd0\xc3\xf6\xdd"
+ "\xdf\x30\x42\x3e\x71\xc6\x9a\x50\xfc\x60\x5f\xe5\x3e\xe0\xff\x47"
+ "\x93\x35\x3e\x04\x7c\xd2\xbe\x5a\x7d\x3f\xc0\xf7\x07\xe4\x39\xd1"
+ "\xbe\x5d\x7a\x9a\x61\xc7\xe8\x97\xa4\xeb\xcc\xdd\x34\x0f\xf8\x85"
+ "\xae\x2e\xb2\xbd\x38\xc2\x5c\x99\x07\x1a\x25\x97\x70\xf3\xd8\x0a"
+ "\x73\x74\x5c\x45\xea\x93\x2d\xa0\x8d\xc6\x76\x8f\x63\x71\xfe\x47"
+ "\xa8\xcd\xa4\x6f\xdf\xb6\x0d\x3c\x27\x9d\x0f\x9b\x94\xd4\xa5\xa6"
+ "\x8a\xd4\x25\xa1\xca\x39\xb7\x11\x0d\x65\x72\xdc\xaf\x98\x82\xf7"
+ "\x28\xc1\xca\x59\xb7\xed\x90\xbe\x8a\xfc\xae\xf1\xbc\x1d\x79\x8e"
+ "\x23\x8f\x17\xbf\x4e\xe4\x6b\x39\xc5\x1a\x96\xe2\xd9\x6c\x52\xf8"
+ "\x0e\x13\x46\x72\x66\xb9\xf0\xdd\x4a\xfb\x73\x0b\x4f\x00\x6f\x37"
+ "\x20\x64\x70\xa3\xc2\x32\xb8\x86\x75\x18\xb7\xe8\x85\xff\xce\x0f"
+ "\xa1\xac\xe6\xd0\x05\xb5\x79\x7b\x0f\xe1\x43\xc1\x57\x1d\x05\x0e"
+ "\x38\x3a\xad\x96\x59\x34\x9d\x69\x43\x4b\xb0\x99\xf6\x61\xb2\x39"
+ "\xd0\x84\x3a\x0f\xe2\xd7\x68\x2d\x60\x51\x3d\xac\xe1\x53\x5d\xe7"
+ "\x4a\xd2\x75\xbf\x7f\x58\x93\x03\xb8\x67\x20\xff\xaa\x27\x69\x4e"
+ "\x74\x19\x82\x28\x1f\xbc\x76\xb3\x27\xaf\x59\xe8\xb0\xd1\x9d\x04"
+ "\x4a\x83\x3a\x52\x3c\x81\x66\xa6\x72\x8b\x01\xe1\x46\xba\x5f\xc0"
+ "\x91\xb6\xd5\xd1\xce\x5a\x6d\x01\xec\x9b\x2d\xe0\x3d\x53\x92\xd1"
+ "\x1e\x51\x1e\xbe\x1f\xdd\x87\xf1\xb5\x82\x67\x40\x79\x6d\xa4\x13"
+ "\x47\x77\xf7\x79\x51\xca\x4d\xc8\xdf\xc4\x07\x2c\x06\x2a\xbf\x87"
+ "\xed\x3f\xc9\x7b\x53\x52\x66\x76\x4b\x5f\xa6\x1d\x6c\xff\x41\xb4"
+ "\xf3\xf1\x88\x76\xce\x47\xfb\x8d\xd8\x2b\xdd\x28\xf3\x20\x5f\x81"
+ "\x3a\x3b\x51\xa7\xdf\x47\xfa\x9f\xc9\x7c\xa5\xc5\x48\x6d\x6e\xa5"
+ "\xf6\x3a\x42\x8c\xaf\x4c\x31\xd6\x9c\x63\x46\xac\x05\xf7\x0e\x3c"
+ "\xd1\xff\x03\xa0\xeb\x93\xfa\x2a\xf7\x0f\xda\x7f\x20\x3a\x12\x61"
+ "\xaf\x3e\x97\xd6\x23\x0d\xda\xd8\x88\x76\x1d\x1c\xdb\xcd\x48\xb6"
+ "\x30\x0a\xf3\x74\x14\xea\x1d\x8d\xb1\x6a\x04\xec\x5e\x07\xac\x0f"
+ "\x52\x9f\xd4\x0b\x6a\x97\x8a\xf2\x6a\x2e\xa0\x4d\x45\x16\x63\x6c"
+ "\x27\xf9\x79\xef\xe3\x80\xf7\xd1\x74\x47\x1f\x27\x7d\x71\xd2\xbd"
+ "\x46\x9e\x6d\xe8\xab\xd1\xcb\x7e\x5f\x4a\x7c\xfe\x29\xb6\x7f\x8d"
+ "\xf4\xc5\xba\x7f\xad\x76\x96\x7c\x54\xca\x77\x1b\x3e\x25\xd8\x53"
+ "\xbf\x62\x2b\xcc\x55\x9e\x2e\x1f\x8b\xed\x1c\x07\x9a\x65\x3f\xab"
+ "\x53\x89\x3e\xfd\xfd\x5a\xbd\x9d\x23\xac\xb1\x80\x07\xf8\x45\xbd"
+ "\xc0\xbb\x88\x7f\x91\x7a\x66\xbf\x3f\x98\xe5\x88\x4a\x03\xaf\x62"
+ "\x40\x3b\xe9\x1e\xd3\x78\xd0\x68\x77\x93\x1e\x22\xda\x87\x3d\xfb"
+ "\xf7\xc7\x2f\xe7\x03\x19\xf0\x01\x5d\xf0\x12\xda\xf0\x7b\x21\x4f"
+ "\x25\x1f\xb1\x52\xc6\xfa\x52\xa2\x6e\x87\x83\x5f\xe0\xa5\xb4\xf7"
+ "\xa2\xde\xf2\x35\x2b\x44\x1d\xe4\x17\xb7\xcb\x6e\xe5\x27\x9a\xac"
+ "\xbe\x11\x6d\x1d\x44\xe8\xcf\xf9\x34\x5f\x7b\x42\x97\x60\xa8\xfe"
+ "\xdc\x4b\xa5\x11\xf2\x1a\xd2\x27\x28\x27\x9d\x09\x69\x2f\xe9\x25"
+ "\xa1\x13\x98\xee\x90\x76\x61\x3c\x81\x6e\x8d\xef\x78\xe9\x6d\xe1"
+ "\x7f\x8b\x68\x5a\xa1\x73\x77\x5a\xd3\x93\x7b\x69\x09\xd5\xd1\x74"
+ "\x89\x8f\xef\xdc\x82\x25\x8f\xe6\xe7\x4a\x11\xe6\xf4\x27\xec\x4b"
+ "\x7e\x3a\x94\x37\x32\x0a\x5e\xbc\xf2\xa5\xa3\xf2\x4c\xe0\x40\x6c"
+ "\x04\x8f\x60\x1c\x94\xe9\x1a\xd8\x01\x29\xd7\x3d\x30\x6d\x38\xb9"
+ "\xee\xfd\x3f\x2d\x58\x56\x28\xea\x10\x2a\x85\xb9\xf2\x56\xe0\x18"
+ "\xf6\xf0\xbc\xfb\xe7\x4d\x2f\xca\xb5\x0b\xa7\x3a\x52\x88\xba\x24"
+ "\x27\xa7\x50\x53\x38\x5c\x4a\xb9\xe8\xcb\xe3\x2b\x45\x56\xdb\xcf"
+ "\xec\x52\x55\xb1\x28\x7f\xc9\x8a\x5c\xad\x88\xc8\xb6\x26\x11\xbe"
+ "\x6c\xaa\x13\xb2\xaa\x31\x52\x3f\xe2\xc0\xc1\x88\xf3\xd4\x48\xf9"
+ "\xcd\x75\xf8\x36\x78\xfe\x6f\xbb\x81\xe6\xca\xcb\x4b\x5b\xeb\x85"
+ "\x2d\x13\xe3\xe1\xdf\x10\x7c\x5f\x9e\x4f\x7e\x20\xb0\xb7\xb5\x91"
+ "\xdf\x62\x4d\xf7\x00\xf8\xfa\xe5\x29\xe0\xb5\x68\xef\x75\xa4\x87"
+ "\x54\x0e\x9c\x0a\x3e\xfd\x95\x44\x4d\x26\x12\xa3\x1a\x0e\xcc\x26"
+ "\xbd\xb1\xed\x42\x7e\xf7\xf2\x9c\xb0\xfc\xee\x15\xd2\xe9\x89\xc1"
+ "\x78\x77\x52\xdb\xa8\x9d\xf8\xbe\x38\x42\x67\xa7\xd3\x0b\x30\x52"
+ "\x39\xa4\x5b\x22\x7c\xb4\x80\x26\xd6\xec\x41\x18\x5a\x7f\x43\xfb"
+ "\xd0\x1f\xd7\x10\xce\x55\x5d\xab\x9a\xe5\x9a\xf9\xc3\x36\xbe\xb1"
+ "\x38\x7d\xa6\x9f\x25\x4a\x9c\xf1\x32\xf1\xe2\xd7\xa0\x8d\x4d\x88"
+ "\xcf\x00\xde\x19\x45\xb4\x91\x3c\xa3\x7a\xf9\x4b\x4d\x9e\x47\xf0"
+ "\x19\x15\xd1\x06\x6f\x58\xe6\xf7\x4a\xa2\x2f\x7e\x55\xf3\x1a\xa9"
+ "\x93\x23\xf4\x0f\xa4\x0e\xc8\x1f\x8c\x83\x32\x2e\xd4\xad\x9d\xb9"
+ "\x27\x9e\x42\x7a\xc0\xa2\x59\x3b\x07\xa7\xbe\x67\x50\xbf\xa5\x2e"
+ "\xe5\x1f\x86\xf0\x3f\xd2\x27\x46\x71\xba\x2a\xf5\x65\xa9\xed\xb9"
+ "\x82\x8e\x22\xf9\x62\x3f\xc1\xfb\x0f\xc5\xf8\x8e\xbd\xee\x0f\x36"
+ "\x2f\x7b\x69\xb0\x3d\xd4\x66\xbb\x03\xc4\x00\xf2\xd1\xde\x87\x36"
+ "\x8d\x46\x9a\xda\x70\x9b\xff\x20\xce\x46\x89\xa7\x94\x34\xc8\x1f"
+ "\x63\xa4\x9c\x77\x55\x7b\xc4\xb8\x19\x7b\xd8\x1f\xbe\x44\x5b\xdb"
+ "\x57\x4b\xdd\x97\x51\xba\x4e\x09\xca\x1a\xd2\xff\xb0\x0c\xf6\x40"
+ "\x81\x94\xc1\xfe\x91\x85\xc7\xf0\x0f\x4d\x34\xef\x49\x6f\x48\xd7"
+ "\x19\xa2\xf1\x94\xfe\x42\xfe\x98\xa2\x97\xa3\x26\xac\x6a\x24\x3e"
+ "\xb9\x5a\x9e\x7f\x63\x5c\xfe\xb8\x34\x4a\x39\x21\x68\xa9\x99\x01"
+ "\x56\x8f\xb8\x68\xc4\x3d\x42\xe9\xa8\x4e\x21\xab\x04\x6c\xa8\x2f"
+ "\x2a\x78\xac\x28\x4b\x74\x3a\xca\xc3\xbc\xda\x73\x34\x3c\x37\xfe"
+ "\x98\x26\xf0\xa5\x06\x6b\x5e\x79\x60\x75\x98\x77\xff\xe3\xce\x41"
+ "\xb9\x1b\xca\x09\xef\x19\x7f\x7c\x9b\x60\x5c\x33\x28\x83\x68\x0c"
+ "\x8a\x76\xc8\xf3\xd4\x37\x4e\xb1\xc6\x33\x1c\xf4\x05\xed\xb5\xc4"
+ "\x1f\xd2\xd8\x0b\x7a\x4f\xc8\xcf\x1a\x9f\xdf\x2e\xcf\x2c\x36\xe3"
+ "\xfd\x05\xd5\x30\xdc\xdc\x69\x4c\x8a\xd4\xef\x95\xf0\x6f\xcc\x51"
+ "\xa9\x4c\xf4\x9f\xca\xc2\xfe\xa3\xe8\x72\x4d\xad\xdc\x87\x51\xe6"
+ "\x7f\x9c\xd2\x60\x2d\xce\xf2\x36\x6a\x70\xa0\x31\x16\x30\x6f\xb4"
+ "\x63\x0e\x08\x9f\x69\x65\xf5\xfc\xcc\x32\x94\x21\x7d\xeb\x36\xd6"
+ "\x72\x82\xad\x96\xde\x47\xfc\x37\xda\x2e\xef\x44\x62\x2e\x82\x37"
+ "\xa5\x76\xaa\x1b\x57\xb9\xa9\xed\x74\x8e\x17\x96\xa9\x34\xbe\x4d"
+ "\x79\x7d\x4f\xcb\x3c\x35\xf2\x9c\x11\x63\xd3\xa8\xf0\x95\x79\x4c"
+ "\x3b\xdf\xc2\x3c\xff\x43\x1b\xcd\x7b\x2a\xc7\x2f\x78\xe6\x46\xaf"
+ "\x0a\xb8\x60\x4c\x12\xfa\x2a\x5f\x89\xd5\xc7\x04\xe3\xd1\x7c\x19"
+ "\x7a\x1b\x63\xf2\xca\x6c\xdd\xb6\x12\xed\x4d\x58\xc3\xe5\x92\x96"
+ "\x7c\xe5\xa2\xa9\xe2\x6e\x6e\x0a\xde\x76\x1b\xd1\x46\x3b\x0c\x42"
+ "\x16\xaa\xeb\xaf\x4e\x06\x9c\xce\xea\x77\x01\xd4\xd5\x3f\x6e\x27"
+ "\xdd\x5f\x4f\x40\xea\xfe\x52\xfc\x83\x7e\xae\xb6\xfa\x43\x74\x17"
+ "\xa6\x1d\x75\xd4\xe9\x7c\x16\xe1\xb7\xa8\x0a\x05\xb0\x7b\x85\xee"
+ "\x3f\x1e\xd4\xf0\xda\xe8\xd3\xec\x95\x8f\xb4\xf2\x23\xdb\xb0\x48"
+ "\x9e\x29\xbe\x12\x90\xb4\xff\x2b\x84\x7b\x6a\x25\xbf\xf6\x8a\x4f"
+ "\x6f\x37\xbe\x1f\xbc\xb4\x8f\x19\x73\xef\xcf\xb5\xe6\x13\x8a\x4e"
+ "\xbd\xd5\x61\x4d\x99\x9a\x33\x53\x28\x8b\x5b\xbf\x37\xf7\x4e\x6b"
+ "\xc6\x5d\x53\x1d\x79\xd3\x1e\x94\x8f\xb9\x19\x0b\xe9\x79\x89\xee"
+ "\x80\xb5\xaf\xf2\x4f\x19\x43\xf9\xc1\x43\x5a\x1b\xfe\x94\xe7\x55"
+ "\xbe\x2f\x7c\x30\x71\x73\xd1\x5a\xee\x5a\xd2\x8c\x3d\xb5\x9b\xe8"
+ "\xe4\xf4\xd0\x67\x9c\x6f\x58\xd2\xcc\xe3\x8b\xd6\xfa\xe2\x8f\x75"
+ "\xe1\xd7\xe0\x8b\x2f\xb6\xd7\x00\x07\x9a\x2a\x78\xc0\x14\x1c\x2d"
+ "\x71\x25\xc2\xa0\x49\xba\x40\xf7\xd0\x58\xb2\xf9\xdf\x2c\xe3\xe9"
+ "\x21\xee\x01\xfd\x03\xb8\xfc\xa9\x59\xdf\xc7\x85\x1c\xd3\x55\xb4"
+ "\x36\xdd\xc1\x07\x68\xee\x80\x3e\xa0\xfb\xb4\x6b\x49\x96\x89\x74"
+ "\xe8\xff\xbe\x54\x09\x8b\x3f\x11\x0c\xac\x1a\x7c\x33\xfa\x2a\xff"
+ "\x1b\xe3\x9f\x2e\x64\xcf\x6a\xa5\x45\xec\x15\xea\xea\x9b\x1f\x02"
+ "\x2f\xd0\xa0\x97\x89\xb2\x62\x35\x7f\xcc\xa2\x3c\x16\x61\x9b\xe0"
+ "\x72\x3f\x75\xa3\xbd\x8e\xe4\x56\x74\x2f\xd8\xe4\x50\xc8\xff\x56"
+ "\xe6\xa0\xac\x0e\xdf\xe2\x2a\xcc\x24\xbf\xcb\x8c\xf3\x2b\xe5\x94"
+ "\x26\x2c\xd3\x52\xbd\x35\x06\x35\x00\x7a\xc2\x4c\xf3\x43\xd0\xaa"
+ "\x42\x9f\xe2\xbf\x1b\x07\xcf\xe7\x86\x8c\xfd\x7f\x8b\xf9\x70\xae"
+ "\xd2\x88\xb9\xfd\xa7\xb4\x1b\x12\x25\xed\xa4\x56\x2a\x4c\xda\x8a"
+ "\xf8\xef\x17\xc5\xba\xd4\xe6\x23\xe0\xeb\xa3\xb3\x73\x53\x90\xfb"
+ "\xe8\x9e\x8a\x1a\x85\x39\xc9\x4e\x33\x4f\x69\x5f\x39\xdd\x57\x1f"
+ "\x9c\x97\x36\xcc\x4b\x1b\xe6\x25\xe9\x39\xa0\x7e\x5f\xd4\xcd\xd9"
+ "\x58\xb3\xca\x69\xf6\xdf\xa5\xd4\x7e\x82\x0d\xe8\xf7\x58\x15\xb0"
+ "\x12\xfa\xac\x04\x9f\x84\x15\x49\x74\xcf\x90\xfa\x6a\x0a\xa2\xcf"
+ "\x91\xfd\x32\xa8\xde\xea\x4a\xf4\xcb\x80\x7e\x39\xce\x08\x59\x10"
+ "\xdd\xff\x04\x2e\x19\x1f\xf6\xe1\x72\xb0\x2e\xb2\x8f\x2a\xf9\x7d"
+ "\x12\x7d\x38\xf8\xea\x70\x7d\xe4\x06\xea\x23\xc1\xe0\xe0\x06\xed"
+ "\x9c\x53\xb4\x93\xf0\x56\x37\x3b\x98\x11\x57\x41\xf7\x2e\x8b\xd6"
+ "\x82\xee\x9d\x4b\x63\xb8\xbd\x92\xbb\xa8\x9d\xc3\x8d\x17\x95\x27"
+ "\xcb\x7a\x75\xb1\xa9\xa2\x3c\xbb\xaf\xf2\xd5\x94\xe1\xe1\xfd\xea"
+ "\xfd\x97\x87\xf7\xab\x93\x28\x3f\xb5\x83\xee\x90\x9a\xc8\xc0\x18"
+ "\xe6\x37\xe8\x8a\x61\xeb\x8d\xab\xa8\xa7\x76\x0d\xfb\x0d\x73\xbf"
+ "\xbb\xa6\x70\xe8\x9a\x50\xb7\x07\x18\xc1\x8f\xe4\x45\x52\xae\xff"
+ "\x6a\xdb\xe0\xf9\x83\xab\xa8\xc1\xa4\x58\xa3\x68\x8d\x09\x9a\x18"
+ "\xfd\x1d\xae\x5c\x93\xe2\x22\x1b\x85\x73\x81\xab\x86\xfd\x8e\x75"
+ "\x60\xe5\xab\xbf\x75\x03\xca\xb3\xc7\x55\x28\xdc\x17\xf5\xad\x31"
+ "\x71\xfe\x60\x32\xc1\x15\x6d\x75\x60\x8d\x9f\x14\x7b\xb7\x90\x95"
+ "\xbc\x86\xf5\xff\xae\xf0\xbb\xe3\x8b\x2f\xb2\x4b\xbd\xa0\xd7\x72"
+ "\xbc\xec\x2f\x11\xbe\x50\x5f\xb3\x7b\x95\x6f\xac\x95\x6b\x75\xe2"
+ "\x73\xd8\xd3\xa6\xa9\x95\x26\x6e\x2d\x31\x71\x94\x35\x56\xe5\x29"
+ "\x06\xec\x5b\xd3\xc2\x73\x47\xde\x53\xd5\xe7\x0e\xf2\x1f\x18\x7e"
+ "\x5e\xbc\xf6\xc1\xe5\xe7\xc5\x6b\x2f\x68\x72\xde\x6c\xa9\x7b\xfb"
+ "\x5a\x50\xe7\x39\xf8\xea\x89\xcf\x59\x9d\x54\xff\x6b\x2e\x59\x37"
+ "\x60\x12\x4c\x23\x3c\xb3\x10\x70\x2b\xef\xab\x3c\x94\xa2\xe3\x06"
+ "\x9a\x43\xa6\x10\xf1\x43\x4c\xcc\x73\x7c\x9b\x07\xdc\xa3\x9d\x11"
+ "\x96\x24\x11\xad\xaa\x56\xfe\xc9\x88\xfd\x6b\x2b\xdd\x3d\xf1\xc7"
+ "\x17\x61\x2e\x1f\x02\xfe\x33\x2e\xd0\xf0\x5f\x37\xca\xf0\xd5\x4a"
+ "\x3b\x14\x31\xc2\x67\x20\xd6\x39\xf9\x09\xa4\xb5\x8e\xb8\x44\xb4"
+ "\x9b\x7c\x06\x82\x47\x38\x54\xaf\xef\xfd\x6a\x65\x1a\xc1\x5b\xc8"
+ "\x8c\x0d\x44\x0f\x03\x76\x9b\x0c\xea\xae\x0b\x33\x2d\x8c\xfa\x7c"
+ "\x61\xf5\x84\x5d\x3f\x9f\xc1\x8c\x6f\x59\x1e\x65\xb6\x5b\x59\x62"
+ "\xc5\xb7\x8d\xec\x6f\xb3\x99\x81\xe0\xe0\x65\x87\x1a\x24\xec\x0e"
+ "\xf9\xf4\xf1\xf1\xb2\xd7\x32\x69\x3c\xe8\x5c\x26\x3d\xc8\x7b\xe5"
+ "\xb9\x94\xdb\x8c\x3d\xd0\x22\xbf\xff\x69\xf1\x30\xfb\xc3\x7c\xeb"
+ "\xd2\x22\x6b\xce\xb2\x95\x05\x53\xa6\x8c\x19\x86\x97\x70\x27\x4b"
+ "\x5e\xc2\x9d\x19\xc9\x4b\x20\x9c\x87\xf2\x66\x5f\xca\x3b\x2c\xcc"
+ "\xd2\xcc\x8b\x64\xa5\xb2\xf0\xfb\x2d\x6c\xe1\x2d\x11\xc1\xdb\xd8"
+ "\xc2\x5b\x6f\xcb\x7a\x28\x77\x49\x4e\x71\x44\xec\xed\x91\x72\xc4"
+ "\x9a\xe7\x50\x77\xd4\x84\x7b\x81\x3f\x94\x07\x9f\xa6\x7d\xe7\xf5"
+ "\x07\x9c\x41\xfe\x05\xe6\xee\x6c\xb2\xe9\x75\xc4\x1e\x64\x47\x80"
+ "\xdf\xf8\x44\xc2\xeb\xa3\xa5\x5d\xdb\x10\x23\x39\x9d\x09\x7d\xf7"
+ "\x81\xa7\x3b\x2f\xef\x5e\xbc\xfe\x54\xeb\x96\x00\xf0\x44\x71\xa9"
+ "\xa4\x77\x5e\x9f\x86\xf8\x78\x3c\x1f\x96\x67\x3a\xaf\xff\x08\xfc"
+ "\x72\x9a\xb0\x61\xb2\x82\x6c\x98\xbc\x2e\x74\xc3\x66\xf8\xcb\x99"
+ "\xb4\xa5\xe7\xee\x24\x1b\xf7\x5e\xf6\x7a\x2d\xd1\x17\x94\x16\x79"
+ "\xa6\x5b\x9f\x60\xa9\xf4\x24\x7a\x18\xdf\xa6\xf1\x0d\xc5\xa5\x7c"
+ "\x6b\x26\xe9\xd4\x24\x23\x7e\x03\xd1\x6d\x51\x96\x98\xd8\xbe\xca"
+ "\xd7\x5d\x3a\x0d\xe2\x1f\xe1\xee\x17\xc1\x59\xdf\x07\xe3\x80\xbf"
+ "\xe3\xfc\x26\x9e\x45\x36\x81\x14\x96\x4c\xfb\x83\xc9\x91\x21\xee"
+ "\x16\xd2\xbe\x48\x38\x61\xbb\xc0\xa5\xaf\x77\xe9\x78\xa1\x5a\xf2"
+ "\xa3\x63\x28\x3f\xf6\xcf\xb3\x72\xff\x7c\x23\x46\x5f\x0b\x78\x4f"
+ "\xd4\xe7\xea\x90\xfb\x65\x05\xf6\xdc\xc2\xdc\x1c\xeb\xd4\xa2\x31"
+ "\x2c\xc2\x03\x6b\x5e\x6e\x81\xb5\x30\xf7\xa9\xe5\xb9\x45\x82\xd1"
+ "\xa3\xaf\x43\xcf\xdf\x80\x83\xc2\xfe\xb0\x27\x10\x8c\xdf\x28\x26"
+ "\x5e\xd8\x54\x31\x45\x9c\xa5\xc8\x33\xb0\x9e\x14\xb5\x7a\x6c\x9a"
+ "\x94\x5b\x9e\x06\x5c\x0f\x4b\x7b\x5c\xae\xe2\x7c\xa2\xe3\x4e\xb1"
+ "\xc3\xeb\xa5\xae\xcc\x1b\x6f\x6a\xb0\xaa\x45\x3b\x0f\x86\xe9\xb5"
+ "\x26\x61\x77\x48\xea\xac\xbe\x71\xd4\xcb\xdc\x07\xc2\x34\x48\xd3"
+ "\x5d\x84\x07\x05\x3e\xfc\x3b\xb8\x50\xa3\x9d\x51\xcf\xe1\x0a\xbe"
+ "\x82\x77\xd6\xf4\x33\x21\x0f\x24\xdf\x08\x12\xbf\x1e\x4e\xd5\xe1"
+ "\x08\xfa\xa5\x93\xe4\x0e\x3a\x7f\x94\x1e\xbc\xc8\x9d\xc5\xcc\x40"
+ "\xb2\x07\xe0\x90\xf2\xbd\x85\x3e\x03\xaf\x7c\xc3\x0a\x5a\x26\x9f"
+ "\xd2\x6c\xd7\x74\x37\x79\x7c\x71\x1e\xca\x71\x84\xf9\x8e\xa6\x39"
+ "\x82\x8e\xef\xa7\x79\x73\x38\x29\x8b\xf6\x08\x89\xbb\xaf\xfe\x7b"
+ "\xed\xe5\x63\xe4\x39\x8a\xc4\x6f\x87\x1b\xb5\x3e\x74\x13\xce\xd2"
+ "\x74\x7f\x0d\x72\x5e\x37\xcd\xc1\x9c\xcb\xa7\xb1\x00\x9e\x5f\xab"
+ "\xc3\x8b\xfa\x4b\x6d\x27\xb9\x35\xf0\x70\xf9\xbe\x92\x80\x41\xfa"
+ "\x2e\x7d\x63\x9a\xe4\x8f\x9a\xac\x91\xe7\x86\x92\x17\x6a\x9a\x15"
+ "\xb6\x13\xf2\x46\xed\xa5\x38\x62\x59\x01\x5d\x27\xfb\x59\xd6\xca"
+ "\x25\x3f\xcb\xcd\x5a\x6e\x9b\x66\x5d\x5e\x20\x8e\x6d\x85\x18\xc0"
+ "\xbe\xfc\xb1\x9f\x59\x09\x8b\x64\xcd\x5b\xb8\x30\xeb\xde\x87\x7f"
+ "\xf8\xa3\x31\xec\xde\x25\x88\xb3\x2f\xb3\x2e\x4c\x9d\x26\x3f\x3d"
+ "\x34\x7f\xee\xbf\x64\xcd\x4d\x7f\xf8\xc1\x45\xc3\xe8\xa4\xc7\x62"
+ "\x4e\x90\x8e\xcf\xa8\x0e\xf6\xd6\x3a\xa9\x83\xd4\xd4\x3c\x54\x07"
+ "\xa9\xc9\x8b\x1f\xb0\xf3\x9b\x16\xc6\xde\x42\xec\x5b\xeb\xf0\x2b"
+ "\x97\xf3\xe6\x2a\x33\xda\xef\x0f\xcf\x9b\xb7\xc4\x79\x1b\xc9\x0e"
+ "\xa4\xec\xf5\x4d\xe0\xbf\x37\x16\x46\x7e\x0b\xe3\x82\x37\x43\x02"
+ "\x5f\x6a\xf3\x82\xe6\x43\x56\x30\x46\xcc\x0d\x49\xaf\xbc\xb9\x50"
+ "\x9f\x1b\x35\xf2\x7c\x88\x91\xcc\x8c\xbe\x63\x7e\x27\x92\x7c\x19"
+ "\x73\x21\x8f\xce\xd6\x29\x9e\xc7\xf7\x24\x6a\xe5\xae\x21\x79\x33"
+ "\xd1\xb3\xda\x99\x58\xdc\x69\xf6\xe6\xeb\xbc\xb2\x69\x81\xe4\x05"
+ "\x9b\x8a\xc5\xbc\x59\x3d\xe1\x5e\x71\x06\x29\xee\x13\xbd\xd9\x18"
+ "\x9e\x3f\x6f\xad\xa3\xb1\x21\xbc\x20\x71\xef\x9b\x47\x2f\x91\xe3"
+ "\x44\x21\xae\x4b\xb7\x33\x6f\x9f\xc2\x0c\xc6\x29\x2e\x56\x6b\xe0"
+ "\xe5\x5e\xf6\xe6\x16\xa9\x87\xfa\x56\x8c\x4e\x3f\xe3\x3d\xd1\xcb"
+ "\x78\xfb\xa5\xf2\xaf\xea\x08\xf9\x97\xd3\xc6\x4f\xb4\xda\x7c\x44"
+ "\x23\xbb\x3d\x3e\x61\xdf\xf4\xee\x56\x9b\x9f\x74\x4b\xc6\x9c\x62"
+ "\x6f\x3d\x52\x16\xe2\xfd\x78\x9f\x80\xbe\x89\x3d\x64\xa6\x94\x29"
+ "\x80\x1f\x7b\x6b\xbd\xe4\x4d\x64\x3c\xc1\x1d\xef\xd4\x46\x23\x8d"
+ "\x0f\xe6\x65\x17\xc6\x28\x7d\x38\xbc\x17\x57\x61\xd0\xec\x48\xbd"
+ "\x75\x82\x78\x54\x82\xd5\x33\x06\x35\xef\x99\x4a\xfc\xf0\x24\xdc"
+ "\x17\xa6\x2f\x79\x40\xc2\xf6\x2d\x6f\x93\xa3\x9b\xf6\xcd\xc0\x48"
+ "\xb8\x14\xe3\x79\x5c\x1f\xcf\xf4\x90\xef\x6e\x1a\xaf\xbe\xca\x3f"
+ "\x5b\xf4\xb1\xec\x9d\xf1\x73\x5b\x54\x05\xb3\x1e\xae\xbb\x95\xe2"
+ "\xb1\xfe\xdf\xda\x22\x74\x7b\x68\x7d\x5d\x92\x17\x78\x38\x4d\xcb"
+ "\x9f\xa9\xe7\xbf\xd4\x3e\xb1\xb8\xa0\x4b\x42\xae\x3b\xa5\x8e\x8f"
+ "\xe6\x4e\x7a\x88\x8e\x0f\x9d\x01\x36\xc9\x39\xa9\xcb\xe0\xcc\xb2"
+ "\x3f\xcd\x3f\x50\x37\x82\xff\xde\x68\x7b\x54\x93\x03\x60\x6d\xff"
+ "\xf9\xfc\x0c\xc6\xf2\xfd\x2b\x33\x07\x65\x28\x24\xfb\x20\x9b\x83"
+ "\x68\x87\x37\x42\x46\x36\xa8\xa3\xe9\x65\xcd\x19\xa4\x33\x46\x77"
+ "\x96\xa9\x1c\x5a\x57\x52\x6e\xd3\x6c\xf6\x00\xf3\xa2\xbc\x02\x71"
+ "\xfe\x5d\xf9\x67\x71\x57\x92\x78\x6d\xc1\xe7\x97\xf2\x2f\x34\x1d"
+ "\x26\x41\xbb\xc8\xfb\x78\xcd\xf3\x06\x65\x41\xe2\x6e\xda\x9f\x85"
+ "\x5e\x36\xe2\x17\x0f\x27\x2f\x04\x7e\xc8\x5b\x52\x90\xb3\xec\xf1"
+ "\xc7\xff\x3e\x6a\x88\x3c\xe3\x72\x55\xaa\xa0\xb5\x9a\xc1\xff\xee"
+ "\xcb\x93\xf3\xb4\x19\xf8\xff\x37\x69\x92\x7e\xfb\xf1\x97\x58\x37"
+ "\x93\x4e\xb3\xb7\x2d\x3a\xfd\x2e\xd7\xd1\xdb\xc9\xbc\xb2\x39\x2f"
+ "\xbc\x36\x9a\x7d\x5f\x5f\x1b\x6f\x1b\x87\x5f\x1b\x6f\xa7\x60\x9f"
+ "\x3d\x8e\xef\xc9\xa8\xf3\xb8\xc0\xf9\x34\xde\x92\x06\x77\x9b\x82"
+ "\x77\x0b\x1a\x3c\xab\x98\x29\x44\x7f\x93\x6c\x9a\xf6\x83\x10\xf8"
+ "\xda\x10\x70\x44\x56\x90\x99\x69\x2f\xa8\x29\x20\xb9\xe3\x64\x1e"
+ "\xbc\xc0\xbd\x59\xc5\xc0\x17\x08\x57\x9f\x96\x67\xf0\x3f\x39\x0f"
+ "\x3e\x04\xef\x35\xa7\x08\x57\xa8\xe4\x0c\x81\xc9\xfd\xfa\xed\x2d"
+ "\x3a\x8d\x6b\xaa\xb0\x0a\x1b\xd9\xb4\x6f\x87\xa4\x3e\x53\x03\xed"
+ "\xdd\xa8\xe7\x80\xc0\x41\x21\x13\x9d\x01\xb0\x9a\x27\x50\x2e\xe9"
+ "\x05\x15\x50\xfb\xa2\x6e\x33\x05\x53\xc5\x59\xc1\x8e\x27\x84\x3e"
+ "\xd0\x6d\x52\x1f\xe8\x36\xb6\xbd\x80\xe0\xf0\x76\xe0\xb2\xb2\xf1"
+ "\xf8\x63\x6d\x91\xf1\x8e\xc7\x97\x66\xd9\xf2\x8a\xb3\x48\x17\xf0"
+ "\x92\xfd\x5d\xae\xa1\xca\x77\x92\x24\x7c\xdf\xc9\x08\xcb\xaa\xa4"
+ "\x0e\x1f\xe1\xcc\x99\x01\x61\xc3\x56\x3b\xeb\x79\x77\x16\xc1\xbe"
+ "\xec\x22\x85\x63\x30\xe7\xde\x9d\x4e\x67\x3f\xbd\xa4\x3b\xb3\x23"
+ "\x93\xb9\x2a\xb9\x9b\x64\x68\x88\x1f\xa7\xdf\xa9\xef\x45\x3c\xd6"
+ "\x3e\xc5\x5d\x25\xce\x1a\xed\x42\x36\x07\x38\xbd\xe3\xf6\x32\x93"
+ "\xa6\xeb\x6a\x7b\x8c\xf4\xf3\x84\x4e\xb9\xa0\x33\xde\x39\x23\xef"
+ "\x68\xbd\xd3\xa9\xc3\x12\xb4\xef\x6c\xba\xd7\x4f\x7a\x3a\xbd\x9c"
+ "\x74\x02\xdf\x65\x7a\x7e\x2f\x7b\x47\xdc\x31\x7d\xd0\x2f\xde\xf7"
+ "\xfc\xc4\x1f\x79\x27\xff\x9d\x2d\x12\x6f\xbd\x53\x87\x78\xe0\xca"
+ "\x77\xca\xd1\xe6\x38\x69\x23\x40\x94\xb3\x40\xd7\x87\x8a\x84\xdb"
+ "\xdc\x25\x36\x10\xcb\x4b\x1f\x7f\x3c\xb7\xb0\x48\xf7\x29\x9f\xb2"
+ "\x2c\x3f\xe7\x2e\xed\x0e\x7e\x41\xee\xca\xac\xa5\x39\xe2\x8e\x0f"
+ "\x62\xe5\xeb\x25\xf0\x9d\x46\xfc\x8d\xd0\x9b\x17\x7d\x6a\x9b\xba"
+ "\x5d\xa3\xa3\x3a\x58\xcb\x01\xa9\x6f\xd1\xf2\xa4\xdc\xdb\xae\xfe"
+ "\x4f\xb4\xa3\x4d\xdf\xdb\x48\xc6\xd2\xcb\xee\xb0\xd2\x99\x19\xd9"
+ "\x65\xa0\xb3\x39\x92\xb3\x20\x0d\xd6\xe8\x3b\x83\x77\xa6\xd7\x23"
+ "\x9e\xce\x84\xdd\x05\x74\x0e\xdc\x36\x5f\xdd\x50\x94\xc3\x13\xb2"
+ "\xcd\xc0\x6b\xb1\x34\x76\x74\x56\x24\x7d\x78\xb4\xa4\x11\xbe\x26"
+ "\x59\xa0\xbb\x80\xf4\x69\x5b\xcc\xa0\x4f\xb0\x5f\xb6\x2d\x00\xaf"
+ "\x97\xb3\xa6\x84\xc5\x50\x1d\xd8\x0b\xbd\x52\xae\xdc\xb2\xf8\xf5"
+ "\x52\xc6\xb4\xfd\xd0\xbb\x5e\xc8\x39\x5b\x52\xe4\x9e\x5a\xe4\xd0"
+ "\xe4\x28\x0e\xa4\x5b\xe3\x65\x37\xfa\x64\x9b\xb3\x67\x8b\x79\x22"
+ "\x70\x5d\xcb\x2e\xbe\x31\xbb\x59\xe8\x3c\x6f\xcc\x9e\xad\xf2\xbc"
+ "\x28\x0a\x63\xaf\x19\x83\x71\x6c\xe3\x65\x29\x4c\xd3\x93\x8e\x3a"
+ "\xc5\x8e\xdc\x42\x72\x60\xcc\x0f\x37\xc1\x02\xe5\xaf\xd1\xca\x5f"
+ "\x83\xf2\x51\xef\x6d\x9a\xff\xdc\x16\x9f\x5e\x17\xd6\xab\x0f\xfb"
+ "\x71\x0e\xed\xc9\x68\xff\x62\xfc\xb2\xa5\xcc\x29\x00\xde\x6f\xf2"
+ "\xa0\xcc\x49\xd2\x7d\x47\x52\xf4\xf5\x42\x75\x6b\x7d\xa0\x39\x40"
+ "\xf6\x2b\x15\xad\xae\x72\x92\x7f\xe8\x65\x72\x94\xc9\x2f\x74\xd7"
+ "\x63\xff\x8c\x01\xde\xf0\xc5\x55\x60\x9f\xa4\x3a\x88\x6e\xf7\x4f"
+ "\xe6\xd8\x47\x43\x59\x21\xa3\xb4\xa1\x51\xcc\xc6\x46\xd2\xec\xa8"
+ "\x6f\x4b\x98\xce\x44\x19\x17\x80\x9f\x9d\xac\xbc\x93\x1d\xd9\x4f"
+ "\x75\x93\x9e\x13\x8d\x6b\x3f\xc6\x09\x63\x65\x41\x3d\x0d\xe0\x35"
+ "\xc6\x02\x0e\x1f\xd0\x78\x91\xee\xc8\xf6\x7e\xc1\x7f\x98\xd0\x36"
+ "\x63\x07\x3b\xf2\x3a\x8d\x15\x95\x05\x18\x77\x05\xfb\x32\xef\x23"
+ "\x1b\x76\x04\xeb\x55\xa5\xbc\x8b\xce\x2f\x4f\x31\xcf\x7c\xa2\xcb"
+ "\xc1\xab\x88\xf7\xb2\x1c\xae\x8a\xb1\x16\xba\xd3\x9e\xf9\xab\xba"
+ "\xb8\x7a\xb1\x92\xf1\x66\xec\x0f\x17\x0d\x2c\x18\x00\x5f\x8d\x76"
+ "\x1b\xca\xce\x90\x9d\xbd\x7a\xe0\x9a\xb5\xa4\xb3\x12\x53\x5d\xc2"
+ "\xcc\x64\xa3\xb0\xcc\xc6\x03\xad\xfe\x3a\xd6\x6a\xab\x63\xef\x04"
+ "\x6b\x99\x7b\x05\xc9\x69\x3d\xdd\xef\x3a\x6a\xe9\xae\xca\x55\x78"
+ "\x7f\xd1\xfa\x2f\x54\x57\xeb\x9a\x77\x8f\xbe\x8f\x91\x7b\x9f\x59"
+ "\xff\x4d\x84\x6b\x5b\x32\xdf\xc1\x6c\x7b\x87\x95\x75\x72\x95\x68"
+ "\x3c\xe7\x93\x54\xc7\x5a\x94\x55\x4f\xf6\xfc\xcc\x6a\xaf\x65\x0c"
+ "\xfa\x6f\x4c\x77\x30\x71\x46\xea\x2e\xf8\x13\xb5\x71\xdc\xf6\x73"
+ "\x2c\xc6\x5d\xf0\x86\x78\x17\x32\x13\xf4\xd7\x93\xd3\x2e\x74\x30"
+ "\xc9\x96\xa1\xc7\xd1\x45\x77\xbe\xd5\x1a\x6a\x63\x48\xb6\x1b\xf0"
+ "\x32\xea\xf9\x77\x38\xf5\xfc\xad\x02\x17\x6c\x23\x78\xa0\x4d\x47"
+ "\x16\x49\x98\xb4\x20\x56\xb6\x19\xf0\xc9\x8c\x84\x4f\xeb\x2c\x82"
+ "\x0f\xe9\xa4\xab\x2b\xba\xeb\xd1\xb6\x34\xc0\x40\xd5\xeb\xa0\x39"
+ "\x40\x67\x79\x54\x7e\xf5\x39\x16\xeb\x2e\x20\x9d\x75\xcf\xb3\xa6"
+ "\x0c\x63\x8c\x7a\xe1\x4c\x43\xcd\x79\x66\xa4\x71\x23\xda\xa1\x46"
+ "\x7c\x17\x30\x2f\xa5\x31\xf3\xc5\xdb\x32\xf0\x5b\x84\x5f\x26\xcd"
+ "\x3d\x3c\x17\x63\xbc\xd6\xa2\x0d\x89\x18\xab\x7a\x7a\xca\xf9\xb8"
+ "\x64\x2d\xd9\x78\xa5\xfd\x19\x73\x25\x1c\xbf\x71\xc9\xcf\x83\x58"
+ "\x3b\xaa\xe0\x3d\x3d\x89\xea\x86\x55\x0d\x52\x7f\xf9\xdd\x45\xdb"
+ "\x40\xeb\xd7\x6d\x14\x36\x32\x62\xc1\x9f\x90\xcc\x81\x3d\x27\xee"
+ "\xd2\xb5\x59\x74\x3c\xfe\xcb\xf1\x64\x7f\xc2\x33\xcf\x20\x74\x29"
+ "\x8b\x4a\xb5\xb9\x5e\x8a\x34\x73\xbc\x6c\x46\x9e\x5c\x13\x2d\xe2"
+ "\x0e\x20\xe1\x81\x91\xe8\x2c\xec\x5d\x2d\xa4\xc3\xca\x27\x66\xb2"
+ "\x58\x85\xfb\x62\xb3\x4d\xdc\x13\x6c\xa2\x39\x14\x2b\xe6\xbe\xfc"
+ "\x06\xda\xd8\x67\xc2\xde\xd6\x86\x78\xa3\x1e\x4f\x7b\xa8\x0a\x7e"
+ "\x99\x78\xf5\xf4\x62\x13\x77\x9e\x67\x49\x42\xee\xa5\xc7\x17\xfb"
+ "\x4c\xad\xd8\xf9\x9d\xc0\xdd\x64\x5b\x87\xf2\x20\x3e\x0a\x7b\xe5"
+ "\x41\xd4\xeb\x46\xfa\x44\x3d\x3d\xef\xcd\x34\x7a\x1c\x4d\x62\x9d"
+ "\x91\xfd\x35\xb1\x47\xca\xf8\x51\xe9\x0e\x9f\x49\x8c\x99\x1e\x57"
+ "\x94\x29\xf6\x66\xb2\xc3\x01\xda\x9b\x8b\xf6\x9c\x12\xf1\x0a\x78"
+ "\x67\x8a\x37\x47\xc4\x19\xc8\xe6\x09\xd9\xd3\x8c\x88\x8b\x42\x9b"
+ "\xd9\x60\x18\x75\xd3\x3e\x4d\xeb\x2e\xbd\x98\xce\x00\xe5\xfe\x2c"
+ "\xea\x2e\xe6\x4c\xda\xe8\x95\x71\x92\x0e\x78\xaf\x3e\x92\x6f\xa7"
+ "\x73\x17\xaa\x5b\xed\xcd\x34\x84\x7a\x33\xa3\xa8\x7e\x2a\x8b\x64"
+ "\xae\xe8\x23\xea\xed\x62\x64\x1f\x9e\x6f\x38\x97\xca\xe9\xde\x17"
+ "\xca\x15\xed\x71\x04\x80\x7b\xce\x35\x0c\xaf\xdf\xf3\x49\x97\xdb"
+ "\xf9\x6f\x98\xd3\xef\xef\x22\x9c\x12\x32\xdb\xd7\x59\x9f\xa0\x7d"
+ "\xfa\xfd\x29\x34\xa6\x21\xac\xf3\x50\xbc\x7d\xdd\xcc\x2e\xa6\x38"
+ "\xb1\x76\xe4\xd9\xe4\xfb\xf7\x10\x9d\x58\xa6\x72\x8e\xf7\x59\x34"
+ "\x77\x4d\xdd\xa4\x97\x63\x77\x09\x5d\x98\x84\x0f\xbd\x9e\x40\x17"
+ "\x6b\x29\xff\x98\xb5\x04\x3d\xe5\x07\xcf\xf9\x8c\x52\x27\xc6\x48"
+ "\xe5\x3e\x4c\xdf\xca\xb0\x5e\xb2\x42\xf5\x23\xf3\xb6\xe0\x97\x00"
+ "\xbb\xcf\xe4\x5e\xf0\xfe\x2e\x9d\x47\xba\x7c\x1f\xfe\x22\x6c\xa2"
+ "\x92\xbe\xa8\xba\xf1\x65\xf2\xd7\x55\xc6\xfb\x52\xd8\xcc\x12\x92"
+ "\x55\xbf\xdf\x1e\xe7\x67\x69\x5a\xb9\x67\x65\xb9\x7f\x61\x97\x2b"
+ "\x97\xe6\x6d\xcb\x16\xa9\x87\xa2\x26\xbc\xdc\x16\x42\xd9\xa1\x84"
+ "\x3f\x98\xb1\xd7\x94\x81\x7e\x01\x3d\x72\x74\x3e\xea\x69\x6b\x0d"
+ "\xb6\x31\xb2\xab\xbc\x5d\xc5\x7e\x7d\xd6\xc2\x34\xfd\x9f\xb2\x1e"
+ "\xf6\x97\x5b\x54\x9e\x62\x06\xef\x46\xf2\xdf\x32\xc2\xb3\x24\x4f"
+ "\x77\x86\x58\xb4\xc7\x0e\x2e\x2b\xfe\x93\x2e\x94\x71\xc7\x9b\x24"
+ "\x6b\x07\xae\x0a\x71\x8b\xe1\xd5\x0b\x5e\x56\x03\xfc\x2d\xec\x83"
+ "\xae\x9e\xf8\x5c\x5c\x05\xbb\x9b\x1b\x4c\x42\x7f\x4c\xdd\xf0\x41"
+ "\x17\xc6\x76\xb6\xd4\x37\x2a\x5a\x17\xa1\x6b\x14\x85\xba\x5e\x26"
+ "\x5d\x23\x6e\x2e\xca\xa8\xa3\x3d\x13\x63\xd6\x57\xf9\x17\xd0\xff"
+ "\xef\x89\xfd\x6e\x1d\xd1\x45\x02\xcf\x1f\x7d\xc0\x17\xbf\xbf\x81"
+ "\xca\x20\x3b\x65\xea\x8a\x60\x43\xcd\x57\xcc\x28\xe1\x71\x74\x7a"
+ "\x6b\x77\x9f\x9b\xbb\xf6\x37\xd0\x3a\xd2\xca\x36\xa1\xec\x10\xdf"
+ "\xb0\x1f\xb4\xf7\xd1\x85\x72\x6c\xc4\xbb\x85\xbe\x07\x07\xe8\x6e"
+ "\xe0\x5f\x6a\xeb\xfa\x89\x2e\xfa\x4b\x1a\x68\x5d\x77\xaf\x79\x7f"
+ "\xc3\x0f\x2d\xe5\xa0\x01\x8e\x66\x7b\xa3\x62\xed\x62\x6f\xd7\x6c"
+ "\x9d\x8e\x74\xae\xc6\xb7\x5a\xc6\x78\x50\x08\xe8\xf6\xc4\xd3\xec"
+ "\xd8\x7b\xfd\x95\xcc\x30\x80\xbd\xb5\x1f\xbc\x0f\xdf\x9a\x19\x5b"
+ "\x3d\x81\xa5\xe2\xdb\x84\xd3\xec\xe8\xcb\x41\x03\x4b\xc4\xcf\xec"
+ "\x9b\x98\x77\x15\xca\x4d\x23\x99\xee\x91\x73\x74\xce\xfc\x81\xb4"
+ "\xcb\xf1\x1c\x4b\x56\x51\x1e\xc9\x92\x6b\x26\xb0\x64\x92\x23\x23"
+ "\x2e\x25\x2b\x24\xcf\x59\x74\x3e\x71\xf5\x04\x36\x6d\x68\xbd\x47"
+ "\xeb\x24\x9d\x77\x4c\xec\xf1\x2b\x7d\xec\x7a\xdb\x77\x79\x07\xca"
+ "\x75\xf1\xca\x28\xce\x27\x5a\x0c\x92\x1e\xfc\xa0\xd8\xb4\x45\xce"
+ "\x3b\x71\xae\x80\xf9\x46\xe7\x36\x9a\xbc\x5a\x11\x36\x5e\x13\x8a"
+ "\x93\xe8\x6e\x96\x88\x53\xcc\x04\x4b\xb3\x68\x87\x66\x97\x31\xb4"
+ "\xfa\xe6\x6c\x2a\x83\xda\x93\xb5\x44\xca\xba\xc9\x66\x23\xe0\x2a"
+ "\xf4\x84\xd7\x3d\xc7\x62\x7f\xf5\x1c\x33\x1f\x79\x5c\xf4\x6b\x97"
+ "\x5c\x8b\x46\x46\xed\x55\x5d\xb4\xce\x30\x27\xd0\x6e\xaa\x8f\xe6"
+ "\x46\x6b\xf0\xac\xbb\xcc\xce\x55\xf7\x13\x64\x9f\xe4\x83\x2f\xdd"
+ "\x85\x7b\x58\x7a\x67\x50\xda\x19\x5b\xcc\x7c\x3b\x50\xde\x8e\x09"
+ "\xcc\x8c\xb2\xce\x7b\xf2\x09\xd7\x5a\x6e\x70\x17\x1e\x40\xd9\xc7"
+ "\xae\xa2\xfd\x68\x3d\xe0\x23\xf7\xa5\x63\x07\x3d\x81\x76\x46\x3e"
+ "\x2e\x1e\xb4\xf1\x10\x95\x83\x34\xf7\x88\xfe\x6e\xb5\x58\xb3\xa4"
+ "\x5d\x4d\xd1\xd7\xc1\x33\x04\xad\x1f\x9e\x73\xa2\xbc\x45\x9e\x6c"
+ "\xd0\x9c\x5a\x9f\x74\x58\xcb\xf9\x75\x6c\x83\xbb\x70\x27\xa3\xf1"
+ "\xa1\xf4\x08\x97\x7b\xba\x91\xf6\xcc\xd0\x71\xa1\x34\xf8\xb6\x1f"
+ "\xe5\x7e\x27\x7c\x36\x46\x67\x36\xe1\x34\x75\xe8\x0f\x60\xe5\xdf"
+ "\x0a\x18\x49\x99\xe1\xb1\x49\xd4\x56\x8c\x5d\x92\xc7\xfe\xf1\xf0"
+ "\x77\x22\xb1\xf6\x31\xef\x2b\x5a\x85\xbc\xec\xc3\xb1\x0f\x06\x55"
+ "\x2e\xf1\xd9\x87\x6e\xd0\x6e\xd8\xe7\x3e\x74\x13\x2e\x10\xf8\x64"
+ "\x06\x9d\x67\x7f\xf8\xba\x49\x91\xe3\x4b\x7d\x21\x9a\x69\xb8\x31"
+ "\x8e\x38\xab\x20\x1d\xc0\xc1\x31\xe6\xe6\x4f\xba\x54\x3a\x83\x22"
+ "\xdd\xde\x01\x0b\x93\xf3\x8f\xbb\x50\xee\x7e\x8d\x86\x6c\xd3\xf6"
+ "\xd3\xb6\xde\x78\xfb\x16\xfe\xb4\x85\xe9\x7a\x88\x58\xbf\xb5\x59"
+ "\x52\x77\xd4\x42\x38\x6a\x87\x41\xae\x1d\x6a\xa3\x96\xb7\x45\x9e"
+ "\x8d\x7f\x58\x8e\xfc\x2d\xc3\xf6\x37\x6a\x02\xd9\x9f\x2a\x23\x1b"
+ "\xa2\xe2\xae\x12\x70\x15\xf6\x83\x68\x8f\xbf\x9f\xc9\xf3\xfa\xf6"
+ "\xbb\x40\xe3\x47\xd3\x3d\x55\xbd\x6d\x57\x76\xae\xd0\xae\xdd\x97"
+ "\x6b\x5f\xa0\xf3\xd0\xdc\x0c\x18\x57\x9a\x84\xbf\x03\xd0\x5d\xaa"
+ "\x3f\xfe\x13\xd0\xd9\x3d\x56\xb9\x6e\xda\x6d\x3c\x5e\xe2\xdb\xac"
+ "\x00\x2b\xa7\x7e\x69\x72\x89\x68\xea\x33\xca\x71\xe9\xe7\xdb\x7a"
+ "\xd9\x23\xfa\x10\xd1\xfb\x86\x3e\x49\xfb\x06\x9f\x74\x89\xbe\x91"
+ "\x8d\x1e\xd1\xb7\x8f\xc4\x1d\xc0\x2b\xec\x4f\xbb\x84\xed\x27\x3e"
+ "\xf7\x04\x2a\xe3\xe3\xe7\xa9\x7d\x34\x26\xc0\x0f\xd7\x9e\x66\x1f"
+ "\x65\xf3\x31\xbf\x1a\x73\x65\x65\x7e\x34\x4d\x96\xd9\x63\xdd\x04"
+ "\x1c\x2c\xef\x2c\x92\xce\xce\xc7\xeb\xf9\x86\x1e\x2b\xf1\x30\xbd"
+ "\xa8\x0f\xf3\x23\x02\x0f\x7d\x6c\xa6\xb1\x9a\xb1\x87\xa5\xc9\x79"
+ "\xf8\xf1\x28\xe2\x77\xa5\x8f\xa7\x8f\x0e\x60\xde\x4b\xfb\x72\x83"
+ "\x3a\xab\x8a\xd8\xc7\x22\x71\xec\x15\xb6\x51\xf2\x34\x09\x1f\x00"
+ "\xfe\x1f\xed\x14\x7a\x49\x68\xef\xca\xa0\x8e\xff\x3e\xda\xc9\x49"
+ "\xde\xed\xd4\xe4\x9e\x84\xcb\x9c\xd2\x46\x60\x5f\xe5\xc7\xf3\x06"
+ "\xe5\x9e\x74\xa7\xbb\x92\x37\x53\x3a\x8c\xfd\x59\x4a\x23\x6d\x90"
+ "\x9d\xd6\xee\x3b\x7f\xfc\x23\xed\x2e\x73\x0a\xe9\x6a\x21\x2f\xf0"
+ "\x1d\x17\xf2\x56\x82\x01\xd5\x2d\xda\x6e\x20\x19\xe7\xc7\x75\x61"
+ "\x39\xf3\x47\xc2\x37\x84\xb4\x47\xf0\xf1\x01\x7d\x8e\xa0\xbf\xd1"
+ "\xd2\xaf\xc7\x47\x93\x0e\x4f\x63\x62\x0e\xf4\x72\xcb\x98\x1b\xeb"
+ "\x68\x4e\x7e\x7c\x3c\x12\x4e\xe9\x41\xb5\x4c\xe2\xa0\x8f\x9a\xb8"
+ "\x58\xeb\x1f\x35\xfd\x7d\x7a\xe2\x93\x5b\x74\x5a\x44\xc2\xd9\x0c"
+ "\xfc\xf2\x69\x50\xc0\xda\xb5\x24\x85\xec\xee\x3e\xed\x24\x3b\xe2"
+ "\x9f\x7c\x45\xf6\xda\x83\xae\x25\x0b\x42\x65\x16\xb2\x4f\xcb\x54"
+ "\xd7\x92\xcc\x53\x36\x66\xc8\xb2\x91\x6c\x7d\x7f\x39\xf1\x78\xe0"
+ "\x59\xc1\xaf\x81\x3e\xc1\x3a\x5f\xb5\x94\x99\x1e\xc9\x23\x19\x43"
+ "\x4a\x22\xd9\x53\x27\x5b\xea\xe4\x0b\x21\x54\x96\x92\x80\xf7\xf1"
+ "\xa0\xe7\xcc\xdc\xbc\x64\x36\x9d\xcf\x87\x2a\x39\xf0\xf1\x71\xb2"
+ "\xe9\x6e\xf0\xf8\x02\x6c\xd5\x19\x16\x43\xf6\xda\x83\x1b\xf6\x6f"
+ "\x69\xf5\x7f\x2a\xf8\x9b\x38\x1b\x4b\x04\xfd\x41\x77\x00\x2c\x6a"
+ "\xfc\xfe\x72\xec\xf1\x6b\x64\xbf\xcf\x72\xd9\x6f\xd9\x6e\x6a\xbf"
+ "\xc4\x71\x8f\x65\x3a\x45\xdb\x3f\xdd\x14\x44\xf9\xaa\x2b\x6f\x51"
+ "\xc8\x95\x97\x21\xef\xd4\xb7\x30\xa7\x9d\x77\x79\xfc\x2d\xe0\xb9"
+ "\xce\x0b\xdf\x75\x74\xfe\x4f\x7d\xa4\xfe\x51\xdd\xef\x9e\x3b\x23"
+ "\x68\xad\x20\xc2\x65\xf9\x5a\x9e\x6e\xe4\xe9\x6e\x61\xfd\xae\x3c"
+ "\xd1\xf7\x56\xbf\xcc\x9b\x25\xde\x29\x7f\x04\x1c\xb4\x3e\x0f\xc2"
+ "\x01\x7d\xa7\xfe\x51\xff\x83\x04\x13\xc0\x40\xeb\xab\x65\x40\xeb"
+ "\x27\xf5\xf1\x1d\xec\x3a\xcf\xa1\x9f\xe8\xab\xe8\xe7\x00\xfa\xd9"
+ "\x9c\xc7\x58\x60\xe3\x71\x76\x31\x21\x2f\x83\x78\xd4\xb2\xf7\x40"
+ "\xc3\x97\xba\x18\x78\x51\xe3\x8b\x4e\x97\xe1\x97\xa0\x4d\x9c\x3e"
+ "\xf0\xa4\x3e\xde\x45\x3a\xbc\x1e\x1b\x7e\xc1\x3a\x46\x34\x8e\x4e"
+ "\xaf\xa3\x6e\xcb\xbb\xea\x49\xe6\xec\xe2\x5d\xa0\x4d\x03\x9e\x20"
+ "\xd2\xe4\xa1\xff\xe0\x61\x4f\x69\xed\xa7\xb4\xab\xbe\x92\xfd\x32"
+ "\xe5\xb3\xc4\x43\xff\xb6\xd6\xe0\x69\x5f\xcb\xf4\xbe\xfc\x04\xe9"
+ "\xd0\x1f\x0b\xca\x1a\x4b\xfd\x51\xd1\xcf\xad\x68\x67\x20\xa2\x4f"
+ "\x47\xba\x49\x8f\xf8\x03\x36\x26\x83\x29\xcf\xf5\xa0\x1f\x3d\xcc"
+ "\xe2\x72\x82\xfe\x7a\x88\xe8\xc5\xe3\x47\xae\xce\x64\xc9\x5e\xf6"
+ "\xc9\x51\x39\xef\x84\x2d\xe8\x71\xa7\xd9\xa7\xe7\x07\xed\x3d\x93"
+ "\x0d\xfd\xf8\xfd\x75\x34\x8f\x84\xdd\x67\xda\x33\xfa\x30\x67\xe8"
+ "\x9c\x7e\x25\xea\xe8\x4b\x19\x2f\xda\x53\x39\x8b\xf4\x84\x63\x11"
+ "\x26\xdf\x51\x74\x5f\x55\x41\xbe\x2d\x1c\x30\xa3\xf2\x41\xcf\xad"
+ "\xa1\x27\xc1\x70\x58\x9d\xdb\xbd\x6c\x36\xea\x10\x67\x2c\x0d\x4e"
+ "\x9f\xe1\xdf\xf7\xb2\x69\x57\x86\x53\xfe\x9a\x3c\x12\xfe\x26\xf9"
+ "\x2c\x95\x87\xbe\x25\x9c\x66\x9f\x5d\x35\x74\x8d\x59\x05\x2e\x93"
+ "\x78\xf0\xaf\x6d\x24\xff\xbc\xc2\x7a\x05\x0d\x47\x3a\x16\x57\x98"
+ "\xef\xa8\xde\x0e\xbc\x8f\x78\xdf\xe2\xca\xe1\xf0\xd9\xb4\x91\xca"
+ "\x5a\xbf\x59\xe8\x48\x96\x55\x6f\x06\xbe\x00\xad\x70\xd8\x42\x67"
+ "\x29\xd8\x3b\x77\xfa\x59\xd1\x36\x46\xfe\x67\xc6\x7a\x82\x0f\xb0"
+ "\xc3\x75\xa9\x6c\xfb\x39\xb2\x19\x97\x92\xf0\xcc\x39\x8c\xa5\x86"
+ "\x43\x88\x26\x25\x39\x32\x2f\x4a\x31\xd7\x6c\xd6\x69\xf8\xcf\xce"
+ "\x97\x9e\x67\x06\x6b\x81\x78\xf7\xcf\xb3\xf2\x60\xad\x41\xcd\xab"
+ "\x23\x3b\xe6\x09\xc7\x52\xc9\x8e\xb9\x6e\x1b\x5c\xd0\x3e\x0e\xac"
+ "\xb9\x5e\xcb\x98\xf5\x85\x6c\x1a\xf9\x33\x30\xf9\x24\x2d\x27\xf7"
+ "\x6b\x6f\x32\xda\x67\xd6\xec\x85\x9b\xa5\xbd\xf0\xbf\xe6\x93\xce"
+ "\xb9\xf6\xfd\xe1\x10\x78\x18\x51\x6e\x21\x4b\xae\x3b\xc7\x52\x88"
+ "\x0e\xca\x3a\x29\x69\x36\xe2\x0b\x1f\xe8\x36\xf1\xd0\xdf\x52\xd8"
+ "\xb6\xd3\x61\x7f\x07\xbe\x22\xf2\x91\xc0\x2d\x23\xe9\x4f\xd7\x8c"
+ "\x17\xfa\x04\xc2\xd6\x2e\x9d\x33\x20\xcc\x6a\x37\x32\xe3\x61\xd2"
+ "\x4d\xac\x97\xf7\xf0\x0e\x07\xa5\xbe\x6f\x5f\xa5\xb7\x49\xb7\x03"
+ "\x3f\xe2\x79\xb9\x4b\xf2\x3b\x6a\x34\xf8\x2f\x5f\x9f\x5b\xda\x20"
+ "\x3d\x11\xeb\x59\xa3\x46\xf0\x38\xde\x33\xf4\x8d\xe2\xc8\xae\x5b"
+ "\x9a\x80\xe5\x89\x59\xc4\xf7\x68\x3c\xe3\x21\xeb\x60\x9c\xa4\x61"
+ "\x84\xce\xb5\x45\x9e\xff\x61\x6f\x8a\xeb\xab\x3c\x91\xa1\xef\x67"
+ "\xb4\xaf\x4b\x5b\xaf\x27\x72\xbc\x51\x71\x7b\x2e\xd3\x3e\xb3\xa6"
+ "\x23\x4e\x67\x37\x69\x48\x5f\xab\xef\x6f\xe2\x0c\x77\xf5\x84\x7b"
+ "\x8b\x8a\x59\xd2\x0f\xaf\x8b\x61\x74\xfe\x87\xb4\x5d\x72\xdf\x3d"
+ "\x71\x30\x7c\x46\x90\x26\xe0\x4d\x36\x0a\x04\x8f\x41\xb6\x3f\xa5"
+ "\x4f\x83\x6e\xdd\x06\xa8\xdc\x7f\x4f\x7c\x14\x51\x4f\x70\x70\x1f"
+ "\x45\x1d\xa4\x83\x4e\xe5\x4b\xda\xe4\x44\x83\xb8\x4b\x89\x74\x72"
+ "\x7f\x3d\x31\x22\xdf\x46\x76\xa8\x08\xbe\xaa\xc6\x4f\x7a\xba\xbf"
+ "\x90\xf0\x75\xb0\xa8\x99\xb5\xcc\x72\xc8\xe9\x35\xc6\x49\x1b\xdd"
+ "\xa6\x0e\xd6\xf1\x00\x7d\xa7\xb9\xee\x9e\x41\xf2\xc0\x8e\x17\x3c"
+ "\xb4\x6f\x0f\x64\xc6\x3e\x48\xbc\xbe\xa0\xc5\x3b\xb6\x4c\x47\x3e"
+ "\xc4\x25\xbc\xd6\x13\x30\xd6\x94\xb0\x69\xd2\x96\x6a\x87\xb0\xd1"
+ "\x45\x77\xd6\x6f\x4c\x64\x96\x1b\x6b\x59\x4a\x5f\x65\x87\x1b\xfc"
+ "\xa5\xd4\xcb\xa5\xfa\x37\x9e\xcb\x20\x7f\x0e\xfb\xfa\xbd\xa3\xe4"
+ "\x58\x7d\xfe\x08\xc2\x29\xe1\x70\xc7\x45\xed\x7c\xa8\xcd\xcb\x3e"
+ "\x5f\xbc\xa3\x47\xea\xd2\x0b\xf9\x92\xeb\x58\x5b\x58\xff\xe0\xf3"
+ "\x47\x64\x5b\x3e\x7f\xe4\xb0\x8d\x91\xec\xfc\xe8\x76\x61\x9b\xfd"
+ "\xf3\x54\x2f\x3b\x61\xd3\xe4\x31\x6d\x62\x5e\x11\xbd\x5b\x45\x3c"
+ "\xd8\x17\xee\xf5\x48\x47\xfb\x04\xe8\xa3\x34\x49\xc3\x1f\xeb\x52"
+ "\x31\x7f\x22\xfa\xff\x36\xc9\x1b\x87\xc5\x89\xcf\x31\x26\xf2\x6c"
+ "\x38\x66\x15\xfa\x2c\x1b\xce\xed\xc2\x33\x86\x6f\xf8\xb0\x0d\xcf"
+ "\x58\xc4\x7b\xf1\x34\xe3\xd9\x8e\x67\x22\xbe\xbb\x68\x5e\x82\x87"
+ "\xb5\x90\x8f\xca\xde\xf8\x63\x96\x91\xee\x45\x11\x6c\x3c\x6b\xfe"
+ "\x85\x49\x9d\xbd\xce\x34\xf2\x4f\x98\xbe\x8d\xb1\xa2\x20\xef\xb7"
+ "\x5e\x4f\x3e\x46\x3a\xd3\xca\xb6\xd1\x59\x7a\x67\xe2\xd0\xb3\xf4"
+ "\xce\x59\xf8\x21\xd4\xd9\x8c\x5f\x00\xbf\xb4\xf0\xef\xe4\xac\xbe"
+ "\xca\xce\x34\xc0\x51\xd0\x58\x57\x86\x13\x29\x3f\xc6\x81\xf8\xa2"
+ "\xf8\x97\xdd\xb2\xbf\x3d\x0c\xe1\x18\x1e\x7f\x2e\x4d\xeb\xaf\x0f"
+ "\x61\xb3\xb5\x0c\xfb\x5a\x3c\x60\x32\x01\x7d\x8e\x3f\xb7\x8b\xfa"
+ "\x4b\xed\xed\x8d\xff\xb0\x2d\xf2\x4e\x18\x95\x49\xfd\xf7\xc5\x23"
+ "\x1f\x60\xc9\x67\xfc\xdc\xa6\xc3\x53\x83\x13\xdd\x97\x31\xf4\xa2"
+ "\x0c\x49\x07\x21\x3d\xca\xd0\xd3\x0f\xc2\x7e\x82\xb0\x4f\xd0\x45"
+ "\x75\x81\x27\x8e\xd1\xef\x9b\xf5\x55\x9e\x9c\xf6\x7a\x3e\xd3\xec"
+ "\x79\x74\xa6\xf9\x23\xf2\x92\x4d\x85\xe1\xf2\xa3\xce\x18\x59\xe7"
+ "\x87\x6d\xa7\x58\xe7\x3d\xb2\xde\x93\xd6\x91\xd6\x92\x73\x0a\xe8"
+ "\x3b\x50\xbd\x33\x25\xdf\x37\xc7\x93\xe4\x67\x9e\x3a\x15\x7b\xfe"
+ "\x87\xc0\x47\xdc\x7d\x8a\x9d\x3c\xd1\x1a\xe8\xba\xc2\xfd\xf0\xa4"
+ "\xb0\x17\xc2\xfb\xcb\x99\xa7\xf4\x56\x71\x9e\xd5\xc3\xbe\x88\xf7"
+ "\xf8\xc4\x9d\x73\xbc\x9f\x0a\xd1\x77\x3a\x43\xa7\xbd\x01\x3c\xf6"
+ "\xa0\x9f\x0c\x15\x69\xb7\x53\x3c\xe2\xc8\x26\xc9\x8e\x88\x6f\x7c"
+ "\xe3\x07\xed\x72\x4d\x9d\x7a\x9b\x68\x0b\xd1\xde\xe0\x7d\x6e\x6a"
+ "\xb3\xea\xfa\xa0\x9d\xfa\x50\x06\xfe\x8f\x7c\x83\xd2\x9a\xb0\xae"
+ "\x20\x59\xe1\xa9\xe7\x31\xef\xb8\xba\xe1\x83\xf6\x2b\xeb\xc3\x29"
+ "\x71\x57\xb2\x2c\xc8\x7b\x7c\xf1\x1f\xb4\x13\x4d\x52\xe3\x1c\x15"
+ "\x33\xb7\x8e\xbb\x7b\x13\x3e\x04\x8e\x3d\xd5\xfc\xba\x43\x8e\xcd"
+ "\x15\x96\xdb\xac\xf7\x7d\xbb\xd6\x77\xc4\x89\x33\xaa\x99\x5b\xa4"
+ "\xff\x10\x2f\xfb\x82\x8d\x28\xb3\xc2\x38\x13\x3d\x80\xbd\xe1\xa2"
+ "\x84\xc5\x17\x19\x83\x7b\xc3\x15\xb5\xe3\x8b\x11\x6d\xf9\x47\xd4"
+ "\x31\xa0\xd5\x71\xe0\x7f\x58\xc7\x81\xcb\xd5\x21\xcf\xcf\xbb\xd2"
+ "\xae\x9c\x77\xec\x12\x76\x75\x80\x3f\x7d\x12\x67\x7e\xb9\x3f\x04"
+ "\xfe\x2d\x68\xee\x21\xfd\x90\x32\xd2\x95\x25\x5f\x2a\x41\xd7\xcb"
+ "\xee\x23\x8e\x7e\xe6\x5e\xf1\x3e\xeb\x64\x5d\xc2\x7e\xdf\x11\x3b"
+ "\xf1\x6c\xe7\xd2\x06\x36\x7e\x98\x31\x60\xf8\xc2\x45\xf0\xde\x86"
+ "\x71\xd8\x1a\x31\xcf\x5a\xfd\xef\x33\x4f\x36\xc9\x57\xdb\x48\xae"
+ "\x8d\x35\xdb\xc3\x54\xe0\x06\xd0\xe8\x21\x01\x0f\xd0\x2f\x92\xdf"
+ "\xfa\xa4\x4b\xf0\x5b\x3e\x61\x33\x79\xac\xf0\x91\x52\xb9\xd7\x4e"
+ "\xb2\xef\xd0\x40\xa6\xb5\xaf\x92\x65\x90\xef\x14\x92\x3b\x73\x73"
+ "\x51\x5e\x7a\x30\x8a\x0b\x7e\x0a\xb4\x3f\xf9\x4e\xf1\xf8\xbd\x2c"
+ "\x04\x3a\xba\xee\x02\x4b\xac\x03\xed\x09\x9c\x6d\x26\xbc\xbe\x43"
+ "\xf3\x9f\xb2\xfe\x42\xd8\x7f\xca\x76\x92\xf5\xb4\xe3\xfd\x02\x33"
+ "\x86\x36\x7c\xd2\xb5\xf5\x02\x4b\xde\xb6\x82\xa5\x6c\x25\x59\xde"
+ "\x97\x92\xf6\x11\xba\xed\xe4\x4b\x65\x59\x0a\x9d\x25\x84\x69\x1f"
+ "\xb2\x91\x10\xc6\x5b\x46\x21\x03\xb9\x22\x78\x7f\x29\xf6\xc1\xa0"
+ "\xeb\x98\x35\x68\x3e\xb7\x0b\xb0\xc3\x5e\xd6\xd5\x00\xf8\x4d\x1b"
+ "\x6e\x6c\x75\x1d\x99\xda\x08\xff\x37\xaf\x27\x4b\xfc\x8e\xb2\xfc"
+ "\x23\xcd\x89\xd0\xd6\x4c\x36\xb3\x9b\xa5\xca\x73\xfb\xab\xb0\x27"
+ "\x9e\xce\x24\x9d\x46\xe7\x93\xcc\x12\xda\xba\x58\x29\xfb\x35\x8b"
+ "\xf2\x04\xd3\x18\xfd\x9c\x5f\xf1\xae\x99\xf9\x2c\x95\xce\x1f\xe8"
+ "\xac\xc4\xfa\xb4\x48\xff\xcd\xe4\x52\x96\x1a\x59\xf6\x93\xc5\x85"
+ "\x4b\x6f\x49\xfd\x69\xae\xf5\xf1\xa5\x85\x4f\xae\x5c\x52\x98\xcb"
+ "\x16\x48\x55\x10\x61\x8e\xbe\x98\xf4\x40\x56\x2e\xb5\xe7\x59\x1f"
+ "\x5b\x5e\x58\x98\x5b\x60\xb7\x3e\x30\x37\xe3\xeb\x36\x49\xb7\x5a"
+ "\x76\xd2\x59\x8f\xd4\x0b\xec\xbe\x8a\xff\xc7\xb7\x2e\x54\x93\x7f"
+ "\xad\x8a\xf9\x8b\x4c\xc1\x05\x56\xe9\xe7\xa8\x7b\x31\xe9\xe2\xf2"
+ "\xb2\xcc\x2d\x92\x4e\xed\x7e\x44\xd2\xf6\x25\x56\x79\x8f\xae\x5b"
+ "\xda\x01\xec\x5d\x90\x24\xd7\xd4\xdf\xee\x8a\xb2\x31\x7a\x7f\x92"
+ "\xde\x4d\x36\xb6\xd6\x3d\x81\xce\xc3\xff\x26\x6c\x34\xf2\xad\x0b"
+ "\x15\x3d\x9d\x9e\x46\xfb\x2e\xec\x4e\x6f\x27\xbb\xba\x95\xa7\x73"
+ "\x00\x9f\x84\xbe\xca\xbf\x2d\xf2\x1a\xb3\xdc\x1a\x8d\xd0\x25\x75"
+ "\x10\xbb\x17\x93\x8d\x4e\xfe\x1f\x13\x2f\x68\xe5\xac\x43\x7d\x57"
+ "\x23\x2d\x78\xb1\xd3\x31\x9a\xae\xe2\xe4\x0e\xad\x5d\x52\xa7\xe2"
+ "\xf4\x0a\xa9\x53\xf1\xb7\x9d\x11\x77\xe1\x85\xad\x09\xda\x1b\x35"
+ "\x9a\xb4\x4f\x2b\xaf\x59\xc7\x09\x48\x7f\x14\x74\xdd\x96\x2b\xc7"
+ "\x85\x7f\x93\xfc\xcf\x10\xdb\x4b\xdd\xf3\x87\xda\x34\xd1\xe1\x66"
+ "\xf9\xad\x94\xc5\x4b\xb8\xa2\x0f\x07\x25\x9c\x44\x7c\xd2\x69\x84"
+ "\x29\x9f\x97\x75\x27\x5d\x3a\xbf\x06\x47\xfc\xfe\x82\xc7\x96\x3d"
+ "\x69\x5b\x62\x5f\xfa\xe8\xd2\xfc\xa5\xf6\x62\x71\x65\x7f\x9a\xf8"
+ "\xf7\xbd\xa9\x39\x8b\x2e\xb5\x3f\x9f\x42\x32\x19\xcd\x6e\xb5\x9f"
+ "\x74\x20\xa4\x5c\xac\xfb\xab\x60\x25\xbb\xfb\xca\xfa\xd9\x2d\xda"
+ "\x5a\x27\xec\x78\x9c\x61\xde\xa8\xb1\x07\xb5\xf3\x91\x6e\x6d\xac"
+ "\xc4\xf7\x5e\xf3\x39\x97\x75\x02\x9b\xd3\xc1\x7c\x07\xe8\x5c\x0c"
+ "\xf0\xf6\xd2\xfe\xb9\xbe\x84\xf6\xb9\x36\x76\x24\x88\xbd\x54\x9c"
+ "\x95\xf7\x8c\x25\x98\x11\x0d\x09\x18\xed\xec\x60\x67\x96\x0b\x58"
+ "\x9c\xb5\xec\x14\xb6\x39\xce\x5a\x7e\x4b\x73\x91\xda\xac\xf2\xcc"
+ "\xad\x9c\x67\x3e\xa7\x9e\xcd\xdb\xca\xcf\xe6\x3d\x17\xb6\x7d\x79"
+ "\xc6\x8b\xbc\x7b\x90\xf7\x24\xf9\xb6\xaa\xee\x61\x7b\x08\x4f\x52"
+ "\xd8\x64\x37\x83\x37\x3c\xd6\x4e\xed\xf1\xf8\x52\x99\xbc\xaf\x7f"
+ "\xc6\xeb\xf1\xdf\xca\x40\x7b\x7a\xc5\xfd\x50\x71\xbe\x07\xfa\x10"
+ "\xf9\x3c\x68\x97\xc7\xd7\x4f\xb4\x48\xbb\x0a\x1a\xd1\xcb\xce\x98"
+ "\x81\x2f\x2d\x54\x2e\xf5\x79\x1b\xe6\x24\xe9\x69\xa0\xef\xa0\x63"
+ "\x4e\xd7\x69\x77\x83\x3b\xd7\x23\x9e\x60\x30\x74\xfc\x7b\xa6\xd0"
+ "\x38\x02\xc6\xdf\x09\xcf\x81\x1e\x61\x23\x6a\x61\x27\xff\x8c\xbb"
+ "\x96\x38\xe4\x78\xf7\xdc\xaf\xc5\x9d\x0d\xdb\x0b\xe8\x79\x04\xe1"
+ "\x01\xfc\x54\xee\x7a\x74\x4b\xc4\xd9\x34\x7d\x13\x36\xbd\x48\xef"
+ "\xc4\x56\xc2\xae\x47\xfe\x0d\x72\xee\x3d\xfa\x1f\xbe\xb2\xbc\x28"
+ "\xe4\x09\xd1\xfd\x56\x0d\xbe\xfb\x3d\x6b\x7a\x74\x5d\x0f\xb4\xe9"
+ "\xec\x0f\xdc\x8f\x07\x99\xf0\x5f\xdf\x19\x14\xfa\x90\x9a\x8d\x08"
+ "\x45\xad\xec\x26\x7d\x35\xb2\xaf\x16\xbb\x2d\x41\xfa\x7e\xe8\xab"
+ "\xec\xe9\x1c\xd4\x49\x32\x4b\x9a\x91\xe8\x36\xf2\xe9\x47\xeb\x87"
+ "\x68\x40\x6a\x13\xad\x1f\x94\x6d\xa6\x73\x6e\xb9\x8e\xce\x26\xfd"
+ "\xcf\xd6\xd1\x59\x31\xe7\xd1\x6e\xf0\x9c\x65\x7c\xe6\x3a\x96\x2d"
+ "\xf4\x10\x82\x7e\xba\x97\x6c\xc4\xde\xb3\x58\xe2\x24\xdf\x7a\xa1"
+ "\xab\xb2\xa2\x9b\xfc\x19\x97\xef\xe8\x67\xb1\xaa\xab\x28\x9b\x68"
+ "\xf5\x23\xa5\x42\x7f\x23\x06\xf9\x1a\x48\xbf\x83\x74\x0c\xe3\x84"
+ "\xcf\xc8\xf7\xd9\x8e\xf3\xcc\xd8\xc9\xce\xd6\xd1\x79\x52\x18\xd6"
+ "\x67\xbf\xa2\xf3\x43\xbe\x31\xdb\x6c\x2a\x35\xac\xa5\x32\xd4\x0b"
+ "\x67\x66\xeb\xf9\xc8\x37\x39\xe5\xeb\x60\x67\x3f\x10\xf9\x28\xad"
+ "\xb0\x25\x62\x5e\x8c\x7d\xdb\x4a\xe9\x83\x08\x6f\x57\xcd\x19\x1c"
+ "\x7b\x4a\x68\x45\xb0\x01\xdf\x16\xa9\xae\x0f\xdb\x10\x97\x29\xce"
+ "\x31\x06\x2c\x74\xbe\x89\x39\xb7\xbf\xc1\xe3\xfd\xc2\x2d\xda\x43"
+ "\x77\x95\xed\xd8\x7f\x05\x6f\xe3\xfb\xe6\xf6\x2f\x99\xd1\xf6\x38"
+ "\x8d\xa7\x4f\xda\x00\xee\x61\xbb\x64\xfb\x7c\xaf\xf6\x6e\xcc\xcb"
+ "\xe8\xc5\x7c\xf5\x1b\x62\xd8\x61\x0b\xe9\xd8\x9f\x73\x1d\xb6\xf4"
+ "\x63\x7c\x7c\x6b\x80\x2f\xcb\x25\x5d\xed\x1b\x5c\x9b\x34\x47\xa3"
+ "\x2c\xe6\x32\x7c\xdf\xa9\xeb\x34\xd1\x3c\x5d\x27\x6c\xbc\x9f\x2d"
+ "\x25\xb8\x61\x6e\xcf\x3a\x92\x1f\xb6\xb1\xdc\x2b\xef\xf5\x99\x91"
+ "\x67\xf0\xfe\x6f\xe8\x82\xda\x82\x76\x90\x2d\x1a\x47\x68\x85\x7a"
+ "\x9c\xce\xdf\x1f\x3c\xaf\x72\xba\xf3\x40\xf7\x57\x88\x77\x4a\x77"
+ "\xf0\x5e\xe2\x05\xe9\xae\x18\x9d\xbd\xd3\x5d\xfa\xf0\x3a\xf9\x2a"
+ "\x59\xbf\x53\x4f\x6b\x84\xda\x40\xf7\xc1\xaa\x9f\x10\xeb\x94\x68"
+ "\x9c\x58\x71\xfe\x10\xf5\xb3\x2f\x1f\xf4\xa3\xcc\x1e\x71\x6e\xd6"
+ "\xbb\x5d\x2b\x87\x6c\x66\xa1\x8c\x3c\xbd\x0c\x95\xf4\x87\x0b\x85"
+ "\xfe\x9e\x57\xe6\x97\xba\x46\x0f\xfa\x55\x71\x8f\x87\xf2\x4b\x1d"
+ "\xa0\xaf\xea\x06\x75\x50\xc5\xdd\x9a\xaf\xf6\xe8\x3a\x66\x78\x1f"
+ "\xbc\xff\x45\x30\xed\x75\x1d\x6b\xf7\x03\x3f\xf8\x5d\xc7\x2c\xf8"
+ "\x06\xfc\xff\x65\xdb\x65\xe5\x21\x64\x47\x61\x39\x33\xa8\x09\x45"
+ "\xeb\xc8\x46\x06\x69\xdb\x4b\xbd\xf7\x73\xb7\x6b\xf6\x32\xa2\x7a"
+ "\xd8\x57\x5f\x85\xcf\xe1\x43\x9a\x0c\xf9\xdc\x62\xc9\xc3\x9c\x5b"
+ "\x2c\x64\xc8\x1b\x8f\xb9\xff\xb3\x24\x60\x68\x28\xf1\x1a\xa4\x3e"
+ "\xde\xb9\x0c\x2f\xeb\x5f\x13\xd6\x05\x3d\x67\xa6\xb2\x86\xa7\x39"
+ "\x8b\x1d\xb2\xcc\x5e\x61\x3f\x24\x2c\x13\xe8\x15\xf7\x9f\xe8\xcc"
+ "\x5c\x25\xfa\x31\xe1\xe5\x36\xd2\x91\xf2\xd8\xce\x91\x2c\x39\x5a"
+ "\xca\x27\x64\x1a\x4d\xcf\xf3\x9a\xd3\x43\xc3\x09\x14\x96\x30\x3b"
+ "\xe7\xd5\xcf\xa5\xaa\x0d\x2a\xf9\x1f\xe4\x65\xf5\xc0\x97\x36\xbf"
+ "\xb0\xd3\xe0\x01\x3d\x8a\x3a\xb8\xad\x90\xee\x52\xf6\x8e\x23\xfb"
+ "\x0d\x72\x6d\xf6\xfe\x42\xb4\xa9\xf2\x6e\x5e\x46\x3c\x99\x8f\x7c"
+ "\x1d\x9d\x63\x48\x17\x8f\x74\xf7\x34\x95\x76\x93\x8e\xd9\x22\xf2"
+ "\x63\xdb\xa9\xd5\xed\x8b\x2f\x76\xdc\x18\xcb\xb2\xfb\x2a\x7b\x17"
+ "\x79\x59\x53\xdd\x95\xe3\x8d\xde\x45\x97\xa3\xcf\x25\xbd\x98\xc6"
+ "\x46\xe2\xf1\x49\x86\x33\x03\xf5\x3f\xc0\xa9\xfd\xfe\x7b\x82\x86"
+ "\x00\x1b\x30\x8c\xe6\xdf\x2a\x77\xb0\x60\xe5\x68\x1e\x2a\xc1\x78"
+ "\xf5\x5a\xc0\x03\xb6\xb0\x56\xa9\x77\x43\xba\x03\x26\xa7\x9f\x9f"
+ "\xf3\x04\x0f\xd0\x19\x02\xd1\xef\xc0\x5b\xfe\x3b\x3c\xc1\x57\x19"
+ "\xe9\x77\x13\xbe\xe9\x60\xfe\xa9\xd4\xae\x19\xb6\x72\x36\xbd\x87"
+ "\xbe\xf7\x76\xca\x3d\xdf\x9f\xa6\x3d\xcd\x64\x1f\x38\xb2\x4d\xdf"
+ "\x5b\x5e\xf0\x18\x19\x99\x9e\xbe\x30\x77\x45\x6e\xbe\xf5\x21\x32"
+ "\x41\x7d\xa9\xde\x68\xd8\xcf\xe1\xf9\x58\xda\x5f\x89\x7e\x27\x7f"
+ "\x87\x97\xf3\x75\xa8\xfb\x39\xc4\x9a\x4b\x26\x99\xf7\xff\xa5\xaf"
+ "\x43\x9d\x3e\x27\x3f\x87\xe1\xf3\x9f\xf3\x2d\x83\x6b\x40\x3d\xd4"
+ "\x47\x61\xb1\xa7\x57\xfa\x17\xd2\x3a\x92\xfb\xcb\xf9\x79\x91\xb6"
+ "\x8a\x24\x7d\xb6\xbf\x01\xf1\x8b\xf5\x3b\xaf\x98\x8b\xb1\x08\xe7"
+ "\x87\xef\xd8\x9c\x77\x60\xbc\x1b\xe5\xfa\x15\x69\xd7\xea\x7a\x12"
+ "\x9a\x4f\x7b\xa1\xd7\xa1\x56\xdd\x5e\x2a\x65\x93\xe7\xd7\x6f\x57"
+ "\x47\xc7\xc8\x73\xb1\xf3\x07\xf4\x3b\x5c\x72\x6d\x1e\xd2\xd6\xe6"
+ "\xf9\x96\xcb\xe9\xb2\x84\xd7\xc6\x85\x98\xf0\xba\xfe\x4c\xcb\x7b"
+ "\x21\xe6\xef\xe9\xc1\x68\x3c\xe2\xb8\xd3\x2c\x30\x89\xe4\x95\xf2"
+ "\xce\x76\x40\xd8\x17\x92\xf6\x38\xfa\x4e\x68\xef\xa8\xa3\xef\x6d"
+ "\xed\x7d\x22\xde\xf7\x6b\xef\xa0\x17\xfb\x9e\xd5\xde\xb1\x66\xfb"
+ "\x2a\xb4\xf7\x44\xbc\x2f\xd5\xde\xb1\x77\xf4\xfd\x40\x7b\x1f\x8f"
+ "\xf7\x3b\xb4\xf7\xeb\xf0\x3e\x45\x7b\xc7\x1a\xec\x13\x67\x06\x68"
+ "\x7b\x0c\xda\x7e\xfe\xca\x79\xd6\x0b\x6e\x79\x6e\xdd\xc7\x40\x0f"
+ "\xd6\xca\xbd\x67\x30\x2e\x11\x73\x3a\x47\x87\x2f\xe2\x1b\xa9\x1e"
+ "\xc4\x4f\xf3\x32\x6f\x5b\x44\xbc\x66\xbf\xad\x6f\x9e\x97\x7d\xe5"
+ "\x8d\x88\xaf\xd3\xe2\x17\x83\xe7\xf6\x47\xc4\xbb\xb4\x78\x3b\xf0"
+ "\x62\x5e\x44\xfc\x1a\x2d\x7e\x9d\x97\x7d\x62\x8c\x88\x77\x68\xf1"
+ "\x3b\x75\x1d\x1e\x2d\x3e\x5f\x8b\x3f\xe8\x65\xef\x1f\x88\x88\xcf"
+ "\xd6\xe2\x81\xff\xcf\xb7\x47\xc4\x0b\xbc\x22\x6d\xb2\x9b\xf8\xe1"
+ "\x52\x5a\x5b\x7d\x01\x2f\x6b\xdf\x19\x91\x66\x81\xcc\x1b\x30\x7b"
+ "\xd9\x87\x2d\x11\xf1\x73\xb4\xf8\x14\xaf\xf2\x8d\xc8\x32\x53\x47"
+ "\xc2\x55\xca\x16\x96\x3d\x92\x5c\x9f\x78\x20\xa1\xcb\x2c\xe8\xec"
+ "\x8b\xb9\x74\x27\xcc\xb4\x8d\x77\x58\x9d\x9c\x77\xb0\x8b\x0b\x35"
+ "\xdd\xdd\x0c\xd2\xa3\x94\xf7\xeb\x2e\xce\xd2\x6c\x2b\xf8\xc4\x9d"
+ "\xbb\x12\x8a\x0b\xbc\x22\xe4\x33\x8e\x72\x69\x2f\x5c\xf7\x3d\x43"
+ "\xf2\x2d\xed\xec\x1f\x69\xc8\x56\x2c\xe9\x82\x77\x93\x0c\xdc\x63"
+ "\xef\x97\xb6\xe4\xc1\x07\x53\x1c\xc9\x79\x08\x1e\x91\xf2\x2c\x89"
+ "\xf7\x2f\xe6\xaa\xfd\x74\xaf\x55\xca\xc2\x68\x2d\x52\x7a\xd2\x57"
+ "\x8b\x4c\xeb\x65\x17\x85\x5d\x8a\x28\x4b\xfc\xb1\xbe\xca\x8b\xf3"
+ "\xc2\xf7\x89\x02\x75\x5a\xfc\x07\x88\x5f\x1c\x11\xbf\x76\x64\xdc"
+ "\x0e\x7c\x67\xce\xce\x1c\xb8\xc0\xfd\xc1\x0b\x3c\x50\xfd\x57\xb4"
+ "\xfb\x71\xa1\x23\x78\x7d\xc8\x95\x9d\x47\xf7\x6d\xc8\x47\x6c\x70"
+ "\x05\xf7\x91\x4e\x24\xe2\xaf\x7e\xd0\xef\x03\x8d\xd1\xc7\xd7\x3f"
+ "\x4a\xfa\xaf\xe7\x19\x9d\xcd\x96\x75\x93\xbf\x41\x13\xa7\x7b\xdc"
+ "\xab\xce\xb0\x58\xba\x8f\xb3\xfd\x71\xfa\xfe\x29\x7b\x20\xcf\xc7"
+ "\x8e\xe4\x85\xd8\x76\x94\xbd\xed\x51\x9d\xbe\xb8\x18\x0c\xdf\x15"
+ "\xce\xa6\xb3\xec\xeb\xcb\x84\x4f\xec\x7e\x61\xab\xdc\x54\x41\x3a"
+ "\x05\xe7\x1a\xf9\x1b\x44\x1b\x7f\xe0\x35\x55\x30\x2b\xf6\xf6\xd9"
+ "\x78\x6f\x93\x3f\x7c\x43\xfc\x48\x7d\x92\x6b\xb9\xdf\x2e\x71\x4d"
+ "\x76\xbb\xc4\x17\xfd\x76\xfe\x1b\xba\x7f\xd2\xef\x00\xbe\x69\x04"
+ "\x1d\xde\x38\x5c\xfe\x55\xdb\x98\x61\x60\x23\x68\x93\x9e\x46\x83"
+ "\xc4\x4f\x03\x39\xaa\x21\xa6\x82\x64\xed\xc2\x1f\xee\xc6\xa2\xba"
+ "\x3d\x05\x01\xc3\x91\x92\x4e\xf6\xf4\x75\xcc\xb2\x38\x60\x40\x9a"
+ "\xfe\x93\x71\x76\xb2\x69\x7e\xcc\x0d\x7a\xd6\xf0\x12\xbe\xbf\x56"
+ "\xd0\x68\x08\x0a\x7a\x65\x20\x47\xc8\x67\x5d\x45\x36\xda\x43\x3c"
+ "\xed\x21\xa2\xc5\x63\x41\x8b\x67\x03\xff\xc7\x84\x56\xe6\x25\x04"
+ "\x8b\xf2\xae\xde\x56\xc8\x62\x43\x45\x29\x89\xcf\x5c\x60\xb3\xf5"
+ "\xfd\x67\xdb\x0a\xec\x29\x7d\x96\x31\x35\xd8\x53\x48\xee\x13\xa7"
+ "\x98\xc5\x39\x34\xbd\xab\x86\xbf\x9a\xb7\xaf\xb8\xbc\x6f\xef\xd0"
+ "\xca\x14\x61\x6f\x82\xda\x32\x5c\x5f\xd7\x3d\xc7\x8c\x21\xed\x5e"
+ "\xaa\xf3\x24\x1b\x0f\xfa\xd9\x10\x77\x9e\xbb\x4f\xe7\x33\x03\xf9"
+ "\x43\x76\xe6\x0a\xd9\xea\xa8\x23\x79\x41\xe6\x71\x7c\xcc\x9c\x85"
+ "\x34\x46\x03\xaf\x10\x9d\x46\xfa\xcc\x48\x6f\x3e\xcd\x06\xde\x36"
+ "\x05\xb0\x67\x04\x40\x93\x3f\x41\x7c\xf1\xc0\xa7\xd2\xbe\x45\xd0"
+ "\x4a\xf7\x48\xdd\x85\xf7\x52\xdc\xc5\xb2\x93\x42\x6f\x68\x91\x5c"
+ "\x5b\x03\x47\x29\x5c\x46\xf7\x64\x13\x1c\x75\x7b\xfb\x03\xa3\xa4"
+ "\xfc\x6e\xe0\x03\x6d\x7f\x68\x90\xbc\xdd\xc0\xd1\x91\xe6\xae\xea"
+ "\xca\x71\x70\xf2\x05\x59\x47\xf4\x2b\xf7\x8a\x33\x7e\xb2\x19\xe0"
+ "\xb8\xdb\xcd\x81\xee\xa4\x2d\xa3\xe0\xb3\xea\x86\x1c\x87\xb4\x21"
+ "\x19\x94\x77\xf3\x85\xbc\x3f\x67\xad\x3c\xdf\xc8\xd9\x22\xe5\xfd"
+ "\x39\x24\x2f\x07\xfe\x09\x6e\xe9\x8d\xcf\x01\x7d\x1b\xcc\xef\x4d"
+ "\x58\x35\xec\xfc\x92\xfb\xd1\x92\x5d\xd6\xeb\x59\x22\x9d\x33\x65"
+ "\x85\xa4\x2d\x56\xb9\x86\x43\x75\x7c\x83\xf8\x36\xb9\xc3\xc6\xa2"
+ "\xa4\xbd\xe3\xe0\x97\x33\xeb\x98\x15\x6d\x1d\xcb\xcd\x39\x99\x42"
+ "\xef\xd1\x95\x93\xe7\xe9\x26\x3f\x55\x21\x26\xcf\x03\x43\xbb\x78"
+ "\x7c\x4e\xa6\x4c\x1f\xba\xa3\xb5\x1b\x7d\x30\xe7\xa4\x78\x02\x67"
+ "\x34\x9a\x30\x84\xb9\x9f\x93\xc2\x5d\x39\xb3\xe5\x7d\xf3\xd0\x2f"
+ "\x74\xbc\x2a\xe7\x68\x68\x95\x84\xdb\x92\x5d\x12\x6e\xa1\x5d\xda"
+ "\x7e\x35\x99\xde\xb1\x77\xa7\x4a\xfd\x95\x90\x5d\xa7\x91\xbd\x5a"
+ "\x1a\xca\x83\x77\xcd\xce\x67\xa8\x16\x7d\x9f\xa6\x7d\x9f\x4d\x71"
+ "\xe8\x1f\xf6\xac\x60\x1b\xf5\x6b\x24\xdc\x2a\x60\x51\xca\xa2\xd0"
+ "\xe6\x05\xa4\xeb\x4d\x74\x8a\xc7\x7f\xb7\xdb\x23\xc6\x80\xdf\x42"
+ "\xba\xfd\x54\x0f\xd9\x1b\x22\xbc\x89\x32\x8d\x54\x5e\xb8\xfd\xea"
+ "\x38\xbd\x2d\x54\x1f\x7d\x43\x5f\x53\x04\x5f\x8d\x3e\x53\x1a\x1a"
+ "\xd7\x53\x36\x92\xfb\x9d\x07\xcc\x48\x87\x8e\xa7\x11\x4c\x24\xcc"
+ "\x78\x92\xc6\xd3\x6b\xe3\xc0\xe3\x87\xc2\x43\x86\x55\x33\x70\x43"
+ "\x21\xe9\x52\xf1\x34\x0d\x7e\x9a\x8f\x15\x55\xd8\xa2\x95\xdf\xd4"
+ "\xe7\x23\xf2\x4e\x1a\x4c\x8b\x76\x13\x6d\x44\x7a\x09\x74\x4e\x25"
+ "\xe7\xab\xda\x16\x91\xaf\x2d\xeb\x2b\xa2\x91\xb3\x53\x56\x6f\x16"
+ "\x3e\x2b\x53\xfb\x2a\xd5\xce\x30\xbc\x65\x39\xc3\xd4\x71\xbd\x5e"
+ "\x87\x97\xa9\x3b\xf5\x76\xe2\x5d\xdb\x83\x79\x4a\x78\x4c\xd4\x05"
+ "\x7a\x3e\x92\xe9\x60\x8c\xfc\xe4\x3f\x76\x04\xbf\x18\x8a\x07\x50"
+ "\x69\x0d\xde\xed\x16\xf3\x91\xf1\x7a\x92\x5d\x02\xae\x0b\xe4\x1c"
+ "\xe2\x6b\xe4\x5e\xc8\xeb\xa9\x4c\x3a\x6b\x94\xf6\x46\xf9\x16\x94"
+ "\xab\xdd\x59\xe2\x7b\xb4\x36\x80\xff\x0b\xee\xbc\x94\xaf\xbb\x77"
+ "\x49\x8e\x35\xe3\x16\x71\xe7\x76\xfa\x72\x1b\x5d\xa7\xcd\x09\x07"
+ "\x86\xd2\xdc\xe6\xb0\x8d\x33\xf2\x45\xad\xd9\x38\x73\x15\xd7\x09"
+ "\xf8\x2b\x6c\x1e\xbf\xc0\x6b\xe9\xee\x08\x5f\xc1\xb7\x54\x63\x0c"
+ "\xcb\xce\xb3\x6b\xc9\x2f\xb6\xd3\xc6\xbf\x20\xfb\x77\xc0\x97\x07"
+ "\x81\x3f\x48\x9f\x7e\x34\xe9\x25\x11\xfe\x21\xbd\x67\x1e\x8f\xf8"
+ "\x0d\x45\xee\xc1\x7b\x78\x8a\x71\x0e\xdd\x1d\xe5\x65\x99\xa0\xa5"
+ "\x8b\x8e\xd2\x7c\x20\x1d\xf5\x53\x8a\x31\x09\xe9\x8e\xe2\x9b\x7d"
+ "\xbd\x90\x25\xd8\x2d\x21\x73\xb1\xbd\xec\x0c\x8b\x16\x3e\x0e\x1d"
+ "\x01\x92\xa9\x19\x3a\x14\xf6\x3c\x8f\xb7\x5b\x10\x1f\x27\xe2\x03"
+ "\xa8\x7b\x83\xdd\x82\x6f\x71\xf8\x76\x02\x4f\x15\x65\x38\xaa\xd1"
+ "\x6e\xe7\x19\x76\x3d\xda\xd2\xc5\x5d\x76\x0b\xda\x79\xaa\xec\x49"
+ "\x36\xbe\xd5\xd6\x45\xfc\x1d\xca\xf3\x4a\xdf\x8d\xc8\xdb\xa1\x28"
+ "\xb7\xa3\x5f\x0e\x92\x89\xe0\x59\xba\x1e\x4f\x67\x88\xc5\x39\x57"
+ "\x61\xdf\x5b\x85\xfa\xe9\x5e\x2b\xca\x21\x1b\x24\xb2\x2d\xe8\x1b"
+ "\xc9\xd5\x50\xee\xaa\x6e\x7e\x0a\x65\x77\x1d\xe9\x46\x79\x8e\xf6"
+ "\xc1\x32\x35\x9a\x7a\x32\xfa\x3b\x8e\x6f\x5c\x15\x40\x9b\xb6\x90"
+ "\xee\x36\xe2\xcc\x88\x33\x0f\xd2\xc3\x8a\x31\x5e\x7b\xbf\x6a\x30"
+ "\x6d\x59\x26\x73\x5e\x64\x42\x87\xda\xba\x32\x8a\x75\x28\x51\xf5"
+ "\x64\x07\x2b\x5c\xa6\x61\x12\x95\xb7\x0e\xe5\x95\xe5\xb2\xab\x80"
+ "\xab\x63\xd0\x46\xf2\x11\x7d\x42\xc0\x89\xd6\x98\x62\x48\x42\x5f"
+ "\x5c\xd4\x27\x15\x63\xb7\x1e\xeb\x01\xfd\x51\xd0\x9f\xab\x56\x85"
+ "\x06\xef\xea\x52\x9f\xe2\x89\x9f\xa3\x7e\xc9\x71\xb4\xcf\x42\xbf"
+ "\xe6\xac\xca\xe3\x27\xd0\xb7\xae\x23\x79\xed\x0c\x7b\x8f\xa9\xd5"
+ "\xd6\x46\x77\x28\x4e\x48\xb8\x75\x91\x0e\xea\x2c\xf4\x73\xce\xa0"
+ "\xad\x5e\x25\xea\x59\xbe\xd1\xc9\xd0\xae\x75\x5a\x3f\x29\xae\x76"
+ "\x90\xa6\x57\xa2\x36\x69\xef\x63\x06\xd3\x7e\xbd\x9f\x31\x11\xfd"
+ "\x44\x7e\xe3\x5d\x54\x9e\xd6\xcf\x31\xe8\xe7\x55\x5f\xef\x27\xe6"
+ "\xd3\x0a\xbe\x46\xeb\xe7\x5a\xad\x9f\x06\xf4\x73\x0c\xfa\x39\x21"
+ "\xa2\x9f\x09\x97\xf4\x73\x36\xfa\x99\x86\x7e\x76\x44\xf4\xd3\x3c"
+ "\x4c\x3f\x67\x7b\xa9\x8e\x0d\xf6\x34\x69\x1f\x8c\x37\x8a\xfb\xef"
+ "\x55\x51\x83\xf7\xdf\x55\xba\x77\x79\x41\xd8\x20\x3a\x40\xf2\x1b"
+ "\x92\x1b\x11\xaf\x47\x77\x3c\xb3\x8a\xd7\x96\x0b\xd9\xcd\x78\x29"
+ "\x9b\x16\xf4\x55\x55\xd4\xe2\xc1\xbb\x1b\x9b\x85\xef\x1a\x3f\xc5"
+ "\x0b\x9b\x01\x85\x4c\xc8\x1e\xd3\x8b\x57\x96\x51\x7e\xca\x8b\xf4"
+ "\xeb\x06\xef\x98\x29\x06\x9b\x94\x87\x3a\x19\xbd\x93\x2d\x2c\x79"
+ "\x26\xc0\x9b\xc5\x99\x40\x55\x54\xd8\xff\xd3\x0a\xde\x44\x70\x11"
+ "\xf7\x59\xc5\x7d\x50\xb6\x36\x2b\xb8\x56\xbf\x97\xde\x8d\xb4\x9d"
+ "\x11\xf7\xd2\xbb\x45\x1b\xfa\x85\xed\x87\x95\xe9\xc1\x95\xe2\x7e"
+ "\x7a\x5f\x95\x31\x26\x5c\xb7\x22\xe5\x2f\x98\xa3\xf4\xee\x93\xb6"
+ "\xd9\x48\xc6\x66\x15\xfa\x36\x55\xc6\x59\xba\x8e\x8b\x57\x61\x36"
+ "\x5a\xcb\xc3\xfa\x79\xa9\x32\x2e\x1e\x62\x0b\x4a\x19\x45\x76\xde"
+ "\x29\xde\x3e\x78\xd7\xbc\xca\x58\xfe\xf7\xee\x9a\x97\xf9\x30\x4e"
+ "\x58\x6f\x36\xf2\x79\xae\x18\xc1\xe3\x16\xdb\x85\xaf\x14\x65\xd4"
+ "\x24\x6a\x67\x87\x62\xa4\xfd\xc3\x24\xce\x83\x14\xe3\xa7\x1a\x6e"
+ "\x6e\x4e\x0f\x05\x4d\x5e\xd4\x29\x6c\x4b\x0d\x86\x8d\x47\xc9\x56"
+ "\x06\xf2\x8e\x15\x76\xce\x51\xde\xd0\xf4\xe2\x7b\xf9\x25\xe1\xb4"
+ "\x4b\xc2\x56\x3f\x70\xd6\x48\xba\x3c\xeb\x27\x08\x19\xaf\x2d\xae"
+ "\x82\xd9\xca\xbe\x64\x51\x98\x8b\x27\xa9\x6d\xad\x5d\xe2\x9e\x9f"
+ "\x89\x57\xa6\x32\x4f\x57\x50\xd2\xed\xa0\x97\x3a\x92\x91\xe6\x4b"
+ "\x36\x9e\xee\x99\x90\x2f\x19\xa4\x3f\x2d\xfc\xc7\x28\xd1\x2f\x2f"
+ "\x5e\x3e\x86\xa9\x3f\xcd\xbc\x9a\x1b\x4a\x1a\x48\x97\xe0\xc5\x7e"
+ "\x2f\xf9\x60\x51\x9c\xcf\xb2\x24\xc2\x53\x98\xc3\x9d\xdc\xf0\x74"
+ "\x03\xf2\x74\xff\x67\x7f\xd7\x28\x4f\xf0\x63\x66\x03\xfe\x3c\xad"
+ "\x44\xef\x32\x96\x32\x63\xcd\x29\x66\xc6\x3c\x0b\x1e\x0e\xce\x66"
+ "\xba\xad\x87\xba\x04\x69\x43\xa0\x0e\x73\xb2\xc8\xc2\x03\x7d\x55"
+ "\xd1\x46\xf0\xb5\xe5\xba\xfc\x62\x9d\xb4\xf5\x66\x44\xfd\x4f\x09"
+ "\xbb\x14\x92\x3e\x00\x6c\xa3\xef\x91\xf7\x4c\x13\x7f\x8a\x3c\xb3"
+ "\x07\x79\x1b\x25\xba\x49\xc2\xb0\x78\x8b\xdc\x47\xa2\x9b\x0e\x83"
+ "\x3b\x5a\x23\x75\xa2\x12\x91\x36\x67\x50\x27\x8a\x64\x82\xf8\x8e"
+ "\x31\xdc\x22\xf9\x9e\xe2\x2d\x59\xa1\x18\x6d\x8d\x53\x7c\x76\x0a"
+ "\xe5\x45\x3e\x93\xf0\x73\x59\x15\x5d\x1f\x9e\x6b\xd1\x79\xb4\x9f"
+ "\xa2\x4f\xb1\x18\xd7\xe3\xd4\x2f\x82\x89\x9f\xec\xba\x29\xa3\xbc"
+ "\x87\x77\x8e\xe0\x07\xc9\x9c\xdd\x1e\x14\xf2\xa5\x63\x8d\x98\x4f"
+ "\x67\x30\x06\xd7\x90\x6d\x2b\x0f\xea\x39\xb2\xbd\x9f\x1d\xb1\xf4"
+ "\xb2\x56\xbc\xd3\xdd\x07\xf7\x13\x9f\xb3\x4e\xeb\xf0\x7b\x39\xe8"
+ "\x81\x4c\xb4\x39\x8f\xca\x22\x5c\x43\xfa\xa2\x64\x83\xb0\xd5\x87"
+ "\xb2\x3a\x99\x28\xe3\x88\xda\xc5\x8e\x38\x88\x87\x3d\xd7\xd8\xba"
+ "\xfd\x63\xd6\x6a\xf9\x8b\xa8\x87\xe8\x6d\x77\x61\xef\xe5\xca\x76"
+ "\xa0\xec\xb5\x5a\xd9\xdd\x28\x3b\x71\xe4\xb2\x3f\xf0\x5e\x61\xd9"
+ "\x57\xd0\xee\x0f\xda\xae\xa4\xec\xb2\x2d\x3c\x04\x3c\x3c\x16\x7b"
+ "\x7c\x36\xd9\x67\xa5\x3b\xae\xa1\x0b\x64\x93\x66\xb2\xe0\xd5\x4f"
+ "\x29\x31\xdb\x08\xdf\x08\xfd\x90\x0d\x45\x8b\xc5\xfd\x57\x92\xb3"
+ "\x6b\xf7\x5e\x3d\xc1\x93\x8c\xe4\xee\x7d\x55\x31\x6b\xc3\xbc\xe8"
+ "\xe0\xd9\xb8\xd9\xab\xc4\xec\x91\xba\xd6\x45\x8b\xe5\xdc\x8a\x59"
+ "\x42\x65\x0d\xcf\x73\xda\xd7\x09\x9d\x7d\x25\xe6\xa4\x2e\xdf\xea"
+ "\x8d\xb7\xaf\xd3\xca\xb2\x5e\x2a\x37\xd5\x0c\x09\x59\x73\x1d\x76"
+ "\xeb\xca\xc2\xa5\xf6\x5c\xfd\x82\xf6\x18\xf6\x50\xee\x63\xb9\x4b"
+ "\x57\xe4\xe6\x58\x17\x2d\x2f\x2c\x98\xbe\xec\xf1\xc7\xad\x0f\xe4"
+ "\x16\x15\x2d\xf9\x69\xee\x18\xb6\xa8\x70\x49\x41\xd1\x52\x92\x6d"
+ "\x5a\xad\xf3\x6e\xcb\xca\x5b\x66\x9f\xfe\xdd\x79\xa9\x97\xc8\x36"
+ "\xe9\xbe\xf6\x71\xe2\x71\xb0\x3f\x8d\x07\x8d\x11\x4f\x76\x89\x4c"
+ "\xc5\xdc\xfd\x34\xf8\x6b\xcc\xc1\xd3\xb4\x17\xd2\xfe\x43\xbc\x17"
+ "\xd9\x37\x26\x9b\xc9\x5b\x37\xf3\xb6\x53\xca\xc4\x6d\xa0\xdb\xdb"
+ "\x11\x47\xf7\x9e\x8f\xf3\xfe\x32\x9f\x38\xcf\x56\x26\x16\x23\x4d"
+ "\xd3\xaf\x10\xe7\x8b\x2f\xde\x52\xf3\x57\x66\x94\x34\xc6\x55\x01"
+ "\x6e\x18\xcd\xd7\x91\xad\xe1\xcf\x2d\x4c\xb3\x91\x6e\xf0\x78\x03"
+ "\xa4\x43\x14\x93\x1e\x2c\xe3\x84\x53\xe5\xfa\xba\xea\xa2\x84\x4b"
+ "\x8e\x43\xdc\x65\x50\x26\xfe\x88\x78\xc4\xd5\xe4\x77\xb1\x6a\x0c"
+ "\xf0\xff\x80\x2d\x8c\xab\xaf\xd1\x69\x73\xd2\xf1\x59\xd9\x81\xb0"
+ "\xb0\xb5\x12\x3d\x66\xd6\x10\xfd\x30\x25\x36\x91\x29\xd7\x96\xca"
+ "\x1f\xf2\x28\xd7\xae\x95\x3f\x7a\x8f\xfc\x4d\x9c\x23\x7f\x97\xc6"
+ "\xff\x6f\x7f\x7a\xfd\xff\xe3\x32\x02\x7f\xe7\xf7\x0f\xd4\x2f\xfa"
+ "\xfd\xff\x63\xff\xff\x37\xf9\xb1\x18\x2e\xf3\xa3\xf9\x86\xb9\x75"
+ "\xfc\x57\x7f\x65\x31\x98\x9f\xb5\xeb\x1f\xc5\x9c\xfe\x94\x59\x4a"
+ "\x83\xbc\xb3\xec\x11\x96\xe4\xfc\x12\x34\x18\x68\x2d\xbb\x83\x77"
+ "\x3a\x2f\xf0\x13\x98\x37\xef\x61\xfe\x36\x56\x77\xb0\xd8\xf5\x1d"
+ "\xa0\xb3\xec\xd2\xf7\x0c\x9d\x37\xd1\x3d\x2f\x0f\xc2\x2d\x2b\x02"
+ "\xec\x5d\xdf\x57\xa4\x53\xe9\x6e\xcd\x06\xee\x39\xce\x18\xcd\xdf"
+ "\xd8\x6c\x96\x58\x37\x9e\x1f\xe4\x95\x7b\x73\xb8\x61\xef\x22\xc4"
+ "\x1d\xdd\xa7\xa6\x8d\xda\x57\xd2\x3c\xca\xfa\x28\xed\xf3\xb1\xaf"
+ "\x68\x73\xf3\x1e\x71\x8f\x11\x4f\x9a\x83\x9a\x8d\x69\xec\x4f\xd7"
+ "\xbc\x2a\xf7\xf4\x6b\xd6\x6b\xf2\x3c\x7a\x17\xf7\x37\xd0\x8f\x46"
+ "\x5e\x59\xd2\x40\x65\xee\x55\x1b\x47\xd1\x9e\xb9\xaf\x24\x6d\x54"
+ "\xe9\x12\x66\x68\xf5\x9e\x66\x87\x81\x0b\xe9\x7c\x1c\xeb\x6e\x0f"
+ "\xd6\x59\xc3\xb6\xf1\xdc\x85\xf6\xad\x03\x3d\xb7\x16\x6d\xda\xd5"
+ "\x57\x35\x36\xc5\xab\x8c\xb6\x68\xb4\x9c\x1b\xeb\x62\xcf\x7a\xa4"
+ "\x49\x5f\xce\x26\xaf\x47\x3a\xd0\x76\x6b\x89\x47\x91\xed\x8b\x9f"
+ "\x02\x18\x1c\x40\x9d\x6d\xd6\x9f\x50\x38\x4e\xd0\x18\x54\x37\xfa"
+ "\x61\xed\x50\xe2\x04\xcf\x4f\x75\xe8\xf5\xa2\xfc\xb5\x28\xbf\x4d"
+ "\x3b\x63\x74\xc9\x72\xc6\x1e\x90\xeb\xb5\x88\xec\x33\x1c\xd7\xee"
+ "\x89\x75\xae\x2f\xc1\xbe\xde\xcf\xc8\x0e\x6e\x2d\xea\x70\x9b\x2a"
+ "\x18\x37\xd1\x1d\xe3\xe3\x41\xf0\x35\xaa\xd4\xdf\x55\xe2\x9e\xd5"
+ "\xf2\x0a\x3a\x44\xd0\x1e\x21\xd0\xf7\x42\x3e\x03\xfa\x23\x0f\x78"
+ "\x02\x34\x87\xb8\x9f\x01\x7a\x83\xe2\x51\x47\x2d\xfa\xd5\x06\xbe"
+ "\xf9\x00\xf6\x6e\xba\x23\x1e\xf3\x93\xf3\xdf\x67\x74\xc6\x41\xf4"
+ "\x42\x91\x83\x07\x84\x5f\xa9\xaa\xb8\x59\x3a\xbd\x40\xf3\x83\x68"
+ "\x84\xf5\x3f\x61\xc6\x01\x8c\x31\xe6\x48\x33\xe8\x0f\xd0\xf4\x71"
+ "\x36\x6d\x6c\x9a\x05\x5d\xa0\xf9\x91\x96\x38\x3c\x6e\x15\xf6\xf7"
+ "\x58\xd4\xd1\xec\x55\x26\x0a\x58\x48\x1c\x14\xb7\x4e\xdf\xeb\x49"
+ "\xe6\xe0\x45\x19\x1c\xb8\x0e\x70\x3b\x30\x2d\x5b\x01\x1d\x3c\xf6"
+ "\x28\xc6\xe2\x00\xa5\x45\x7e\x23\xd2\x1f\xc4\xbe\x3f\x47\x1b\x93"
+ "\xe3\xe0\x09\x40\x07\xc4\xcd\xa3\x76\x20\x4f\x0b\x60\x8d\xba\xcc"
+ "\x7e\x0d\x8f\x1d\x95\x34\x8c\xf9\x53\x1d\xf6\x18\xeb\x35\x61\xf8"
+ "\x9b\x62\x22\xe1\x0f\x58\x48\xbe\x5c\x31\xff\x22\x62\xec\xc0\x97"
+ "\x9a\xb3\x49\x0e\x8d\xfa\x0e\x0a\x19\x9a\x62\xba\x87\x6c\xbf\x61"
+ "\xce\x1c\x04\x2c\x0e\x22\x5d\x23\xe1\xe6\xd5\x7f\x05\xce\x7d\x94"
+ "\x68\x28\xf3\xfd\x92\x46\x35\x75\xd1\x1c\x3e\xa5\x98\xde\xa3\x70"
+ "\xa7\x12\xb7\x80\xca\x43\xf8\x15\x3c\x41\xcb\x9a\xf6\x97\xd5\x91"
+ "\x7f\x63\x7b\x2a\xd9\x66\x93\x63\x6d\x4f\x45\xbb\xea\xf5\x3b\x50"
+ "\x34\x07\x68\xec\xd1\x47\x21\x7f\xf0\x2a\xa6\x7a\x92\x35\x8a\x7c"
+ "\x03\x79\xd4\xc6\xe3\xb4\x3e\xf5\xef\x88\xef\x22\x9b\xb9\x11\xb0"
+ "\x59\xa0\x8d\x49\xa3\xf0\x15\xaa\x98\xef\x91\x6d\x33\x27\x21\x1c"
+ "\x83\x36\x88\x73\x88\xde\x81\xbc\xa8\x1a\xca\xe3\x0c\xe7\xa1\xf5"
+ "\x83\xb9\x6c\x42\x9e\x3b\xf0\xe4\x7a\x5a\xb2\x9b\x8f\x76\xb8\x9f"
+ "\x21\xdb\x65\x8a\xa9\xbd\x77\x20\xc5\x80\x7a\x03\xa8\xd7\x40\x73"
+ "\x83\xe6\x85\x5e\x46\x8d\x84\xd1\x1e\x8c\x9f\x98\x5f\x87\x83\x8d"
+ "\x80\xbb\x19\xf4\x7f\x20\x53\xd2\x77\x26\xb7\xd6\x3e\xb7\x38\x1f"
+ "\x8c\x8e\xf1\x6d\x97\x76\x86\x28\xdd\xa0\xff\xd7\x30\x9d\x69\x22"
+ "\x3b\x43\x31\x28\xab\x45\x9b\x13\x26\xa4\x6b\x1b\x9c\x43\x64\xef"
+ "\x40\x31\x67\x10\xad\xa9\xb5\x9f\xe6\xde\xfd\x12\x76\x71\x3e\x9a"
+ "\x03\xa0\xe3\xb7\xc8\x71\x8e\x5b\x40\xb4\xaa\x9c\x87\xf1\x89\x7a"
+ "\x19\xc2\x66\x02\xe0\xac\xa2\x0c\x7d\xae\x44\xe2\x06\xa4\x4d\x03"
+ "\x5d\x3a\x38\x6f\x74\x5c\x20\xcb\x4c\x28\xd6\xe8\x90\x46\x8c\x0d"
+ "\xd9\x6b\x77\x0b\x3b\x58\x62\x5e\x26\x2c\x3c\xec\x0f\x12\x7e\x3d"
+ "\x8a\x76\x01\x27\xc4\xbf\xd0\x9b\xe0\x8c\x09\xcf\xed\xf8\x2d\xfa"
+ "\xdc\x8e\x18\x57\x31\xb7\xd7\x08\x7c\x14\xdf\xe8\x65\xf7\x75\xea"
+ "\x73\x9f\xd6\xb9\x8a\x75\x5d\xb3\x42\x9c\x0f\x98\x48\x1e\x28\xd6"
+ "\x7d\xa0\x5b\xf0\x18\x34\x9e\xad\x8e\x4e\x61\x23\x7f\xb5\xca\x62"
+ "\x5a\xfd\x27\x49\x3e\x72\x9a\xd6\xbf\xbe\xc6\x69\x6c\x50\x97\x9b"
+ "\xfc\x18\xac\x01\x0e\xa4\x35\xe8\x47\x9b\xf0\x2d\x86\x6c\xc2\x35"
+ "\x2d\x4e\x63\x45\x18\xdb\xc3\xd9\x34\x6e\x09\xb3\xf5\x3b\x17\x35"
+ "\x12\x07\xc4\x6a\xf3\x45\xb4\xf1\x12\xb8\x9a\x24\x5c\x13\xf2\x87"
+ "\xae\x6f\x73\x2c\xad\xef\x48\xb8\x12\x4c\x09\xb6\x48\x8b\xfe\x8f"
+ "\xb6\xeb\x70\x0d\xc3\xf4\x9a\xab\xb4\xf9\xa8\xe1\xd6\x84\x61\x71"
+ "\x6b\x8d\xf4\x19\xd1\xb8\x9a\xfa\x82\x3d\x85\xea\x17\xfe\xb0\x34"
+ "\xde\xa7\xc9\x47\x73\x2a\x21\xe8\x65\xa5\x69\x3a\x1e\x43\x7b\x16"
+ "\xd1\x7c\xa2\xb1\xd2\x71\x07\xc9\xca\x64\xdb\xaf\x49\xd1\xc7\x83"
+ "\xda\x1d\x89\x13\xd0\x26\xa1\xef\x15\xee\xf3\x35\x3f\x42\xbe\x04"
+ "\xc2\x6d\x61\xfa\xea\x9a\xbc\xa1\x7d\xbf\x26\x83\xfa\x4e\x73\xc2"
+ "\xb6\x82\xe4\x65\x72\x2f\xf3\x2a\xb1\xc7\x87\xe2\xab\xd8\xf7\x84"
+ "\x5e\x86\x46\x8f\x11\xbe\xb7\xfd\x44\xa6\xa7\xfd\x0d\xe9\x85\x6c"
+ "\x5e\xdb\x0f\xd3\x68\xff\x43\x5c\xb3\x06\x83\xe3\x48\xdf\x44\xf7"
+ "\xb8\xc9\x96\xcf\xd5\xc7\x25\x2f\x08\x1c\x7d\x90\x7c\x67\x20\xdd"
+ "\xda\x56\xf0\x01\xc1\x68\xc6\xea\x34\x7a\x93\xf0\x04\x5f\x99\x79"
+ "\xf5\xca\x2e\x76\x95\xed\xbb\xfc\xf3\x53\x4a\xe2\xbf\x63\x1d\x05"
+ "\xc8\x5e\x26\xca\xb6\x9e\x52\xae\xcd\x45\xbd\x89\xda\xd3\x82\xe7"
+ "\x03\x78\x5e\x87\xe7\xed\x78\x4e\xc4\x73\x12\xd2\xab\x5a\xfa\x54"
+ "\x84\x47\x21\xfe\x36\xed\x89\x36\x26\xd2\x79\x76\xc6\xaf\x88\xae"
+ "\xfc\x09\xc5\x8f\xff\x88\xc2\x78\xbe\xad\xf5\xbb\x45\xae\xed\xc4"
+ "\x17\x50\x8e\x83\xd2\xd1\xbe\x86\x38\x1b\xd2\xac\xa7\xb2\xc9\xae"
+ "\x02\xde\xef\x89\xa0\x4f\x51\xce\xb8\x27\xf1\x9c\x85\xe7\x2d\x78"
+ "\xda\x91\x9f\xec\x79\x66\x00\x06\x6d\x61\x7c\x11\xb7\x20\xc7\x21"
+ "\xc7\x13\x63\xd8\x44\xeb\x5d\xc7\x07\x34\x9f\x86\xa4\x5b\x2c\xd3"
+ "\x49\xfe\x75\x5c\xb2\x3e\x76\x41\x31\x76\xa6\xf6\x20\xc6\x0e\xe5"
+ "\xdf\x43\xf9\xf1\x9c\xab\x3d\xd3\xb4\xe7\x7c\xed\x79\x9f\xf6\x9c"
+ "\xa7\x3d\x17\x78\x95\x44\xbf\x46\x9b\x00\x66\x89\x42\x4e\x8e\xb5"
+ "\xab\xd5\x3b\x3e\x85\xf8\x6b\xe0\xff\xdb\xc9\x8f\x23\xea\xad\xd3"
+ "\xe5\xd6\x24\xfb\x19\xa8\xba\xea\xea\xad\x42\xf6\x33\xee\x40\x04"
+ "\x2e\xcc\x8b\x55\xd2\x18\x68\xa7\xe8\x3a\x03\xe8\x06\x59\x4e\xac"
+ "\x41\x3b\xaf\x27\x7f\x30\xe4\x57\x93\xec\x14\x0a\x3e\x2a\xbe\x27"
+ "\x85\xd6\xab\x90\xe9\x6f\x20\x1b\x45\xc5\xf9\xf8\x39\xc0\x53\x94"
+ "\xea\xf8\x9e\xf8\x25\xc9\xe7\x8f\xfe\x4b\x5f\xd5\x78\x6b\x98\xcf"
+ "\x1f\xd7\x26\xcf\x36\xaf\x7d\x0a\xf1\x11\xfc\xff\xb8\x75\xd4\x66"
+ "\xc0\xba\x1d\xfd\x99\xd5\xa1\x8c\xcf\xc6\xf3\xd6\x4e\xd9\xe7\x54"
+ "\xbd\xcf\xda\x58\xd9\x74\x98\x77\x2a\x89\x41\xe0\xc3\x42\x9a\xdf"
+ "\x1d\x83\x78\x39\x31\x48\x4f\x6d\xfe\x60\x9c\x13\x5f\xa4\xf1\x8e"
+ "\xc0\x27\x69\x61\x3c\x3d\xfe\xe0\xd0\x71\x89\x3b\x18\x94\xf4\x42"
+ "\x3b\xd6\x25\xcd\x81\x35\x97\xac\xcb\x0c\x5a\x97\x5a\xde\xc0\x50"
+ "\x1c\x7f\x4d\x06\xe1\x78\xad\x8d\x98\xb7\x89\x39\x34\x36\x5e\x65"
+ "\x7c\xbb\xb6\x27\xb5\x63\x8f\xbc\x1d\xf1\x0b\x65\x3b\x65\xbc\x56"
+ "\x17\xe6\x5f\xe2\x3c\x9a\xff\x7a\xbc\x36\xbf\xa9\x9c\x39\x34\xd6"
+ "\x7a\xbc\x56\x3e\xe6\x69\xe2\x2c\x5a\x3f\x7a\xbc\x9c\x93\xf1\xeb"
+ "\x08\xdf\x50\xde\xa0\xd0\x65\x04\xff\xfd\x93\x26\xb4\xfb\xda\x46"
+ "\xd0\x17\xf5\xb4\x9e\x57\x97\xb0\xd8\x95\x5b\xd8\x58\xb9\x36\xaf"
+ "\xfd\x48\xcf\x2b\x64\xfa\x55\xd7\xb6\xe8\x38\xaa\x46\xe0\xb3\x84"
+ "\xb4\xa1\xb8\x72\xc2\x52\x5e\x69\x0a\x06\xcd\xc5\x39\x47\x82\xb3"
+ "\x04\xce\xc5\xba\xaf\xeb\xab\xb2\x18\xbd\x6c\xaf\x59\xdb\x4b\x5a"
+ "\x04\xad\xa6\x58\xee\x38\x52\x2f\x71\x97\x2c\xdb\x32\x88\xff\x22"
+ "\xe8\x10\x81\xeb\xa9\x2e\x2a\x0b\xfb\x8a\xd9\x5f\x96\x79\xb5\xc4"
+ "\xdf\x96\x4c\x2f\xbb\x21\x51\xc7\xad\xb4\x3f\x99\x14\x66\xab\xfe"
+ "\x89\xdc\x9f\x54\x92\x81\xd9\xfc\xc2\x3e\x5d\xab\xad\x9b\xd1\xbe"
+ "\x49\xf6\xbf\xb3\x8a\xc7\x90\xcd\xaa\x4c\xb4\xf5\x01\xd0\x67\x3b"
+ "\xb5\xb3\x19\xf0\xb9\xd7\x85\x88\x97\xd5\xe0\x8a\xf5\x74\xdd\x09"
+ "\x6d\x5c\x8e\xa3\x3d\x3b\x09\xb7\xaf\x5e\x21\x7d\x2a\x91\x3c\x48"
+ "\xf8\xf8\x22\x9a\xd5\xc2\x03\xc2\x97\x41\x95\xa5\x2b\x42\xc6\x55"
+ "\x2f\xd7\xc9\xb5\x47\x84\x8f\x0a\x57\x71\x8e\x94\x27\x5e\xb7\x5c"
+ "\xc6\x5f\x97\x29\xf5\x10\x8a\xf3\xb4\xf0\xbc\x28\xcb\xf8\x0f\x85"
+ "\xfc\x35\xfa\xaa\x9b\x24\x3d\x72\xdd\xec\x08\x9d\x1f\x01\x6b\x61"
+ "\xe7\xb8\xea\xba\x8c\xf0\xba\xb8\x2e\x99\xf2\x20\xef\x69\xc4\xe7"
+ "\xe9\xf1\x72\xaf\x89\x9b\xa3\xc9\xcc\xf2\xae\xae\x48\x63\xc0\xcd"
+ "\xd1\x5b\x2b\xf5\xf5\x7b\x5d\xb3\xac\x5f\xae\x5f\xea\x23\xcd\x07"
+ "\x5a\xc3\x41\x61\x57\xac\x27\x85\xd6\x32\xde\xf3\x83\xfa\xda\x95"
+ "\xf4\x9d\xb8\x73\x26\xd7\xed\x75\xed\x11\xed\x70\x69\x73\xf5\x78"
+ "\xef\x63\x96\x58\x7c\xf3\x7b\x95\x18\x79\x96\xa5\x58\x24\x8f\xb1"
+ "\x61\xc9\x2e\xf5\x02\x0f\x90\x6c\x9a\xe4\x09\x24\xb3\xd1\xf4\x55"
+ "\xe9\xac\xc4\x4f\xb6\xd2\x5c\x58\x0f\x61\xfb\x68\x66\xa6\xdb\x47"
+ "\xeb\xab\x9a\x30\x2f\x2c\x3b\xb6\xec\xd4\xfa\x95\x83\xfa\xea\xdc"
+ "\xce\x37\x68\x2e\x6d\x92\x6b\xcc\x52\x4b\xf3\xd8\x83\xb9\x87\xfd"
+ "\x67\xcb\xe1\x52\x91\xb7\x5c\x9f\x7b\x58\xa3\x39\xa7\x94\x89\xf1"
+ "\xb5\xe3\xf9\x16\x8c\x29\xe1\xd7\x7c\xcc\x83\x10\x9e\x39\xf2\xa9"
+ "\x98\xe9\xa9\xcd\xf9\x2d\xc8\x8b\xf5\x3f\xa5\x51\x1f\x03\x7f\xfc"
+ "\xb1\x54\x31\xc7\x9c\xa4\xdf\x98\x2a\xce\xfa\x69\x8e\xd1\xfc\x12"
+ "\x67\xfe\x98\x6b\xa6\x8a\xef\x33\x9a\x67\xc2\x66\x0a\xc2\xd4\x5e"
+ "\x9a\x67\x7d\x55\x13\x63\x74\x9b\xc7\x5e\x65\x82\x3c\x6f\xab\x9a"
+ "\x98\xa4\xeb\x86\xd3\x3c\xb4\x4f\x61\xe3\x50\xbe\xb5\xc9\xea\x27"
+ "\xd9\xf9\x67\x9e\xe0\x7c\x46\x69\x09\x76\x12\x5f\x5e\xdb\x84\x3c"
+ "\x11\xe3\x1f\x27\x74\x59\x0f\x2f\x16\xf2\xcc\x6b\xf0\x2d\x7f\x28"
+ "\xce\xb9\x2a\x20\xe8\x4a\x60\xc7\x1b\x13\x19\x9d\xd3\x63\xaf\x99"
+ "\xe8\xd2\xe9\xe1\x99\x88\x43\x1a\x6a\x1f\xf1\xe0\x6d\x78\x77\xd1"
+ "\x3e\x3d\x82\xdc\x79\x16\xc9\x8a\x08\x67\x90\xec\x89\xe4\x60\x80"
+ "\xf5\xd1\x53\xca\xe4\xf8\x23\x64\xbf\x68\xd9\xd7\xed\x5e\x3b\x1d"
+ "\xfc\x3c\xd9\xd3\xb2\x16\xb2\x6b\x3a\x94\xeb\xfd\x24\x77\x2a\xfb"
+ "\x8a\x64\x3c\x49\x96\xa1\x32\x9e\xa4\x3c\xed\x57\x8a\x9f\x37\xfc"
+ "\x9b\x64\xd3\xde\xbb\x2f\xff\x9b\xb4\x56\xa6\x9d\x54\x8b\x5f\xbd"
+ "\x84\x95\x05\x6b\x25\xa9\x54\x87\x15\xe1\x14\xc2\xb1\xa4\x67\x43"
+ "\xeb\x5c\x09\x32\xb2\x97\x84\x71\x42\xbb\x57\xdf\xfc\x90\xbb\x84"
+ "\x78\xda\x24\xe1\xbb\x80\xec\x17\x5f\x91\xae\x97\x92\x24\xc6\x53"
+ "\xd8\x97\x55\x92\x6c\xa8\x3b\xb1\xa6\x87\x19\x6d\x85\x6c\x12\xc9"
+ "\xd0\x4d\x21\xee\x26\x1e\x98\xe6\x04\x60\xd0\x76\x5a\x99\xf4\x94"
+ "\x7d\x15\x33\xe0\xfb\x64\xbc\x67\xeb\xb4\x14\xf2\x98\xa3\x02\x2c"
+ "\x91\x68\xa8\xb9\xab\xd8\xe4\xbe\xaa\x49\x73\xf4\xb1\x22\x3a\x83"
+ "\xe4\x78\x83\xfe\xae\x94\x24\xa1\x0b\x40\xb6\xfc\xbd\x04\x37\x1d"
+ "\x57\xf5\x90\xec\x7a\x52\x4a\x94\x9f\x99\xe5\x3e\x34\xa9\x1c\xe3"
+ "\x9a\x26\xe7\xcb\xa4\x79\x98\xfb\x47\x23\xda\xf9\xbd\x88\xf7\x2a"
+ "\xca\x6f\xf2\x13\x0d\x37\x12\x7c\x26\x1d\xd1\xe1\x53\x23\x6c\x80"
+ "\x32\x9b\x18\xef\x20\xef\x46\xdb\x5a\x6c\x25\x2c\xe6\xb4\x72\xfd"
+ "\xab\xe8\x23\xdd\x0d\x6e\x96\x32\xfe\xeb\xf7\xeb\x7c\xba\x6c\xf7"
+ "\xf5\xab\x4c\x15\x51\x8c\x64\xf3\x64\x33\x52\xe8\x62\x9e\xb5\x08"
+ "\x79\xbc\x27\x38\x87\xb9\x9d\x77\x52\x9a\xfb\xb5\xbd\xec\x78\x6f"
+ "\x99\x85\x1d\xb6\xcc\xc1\x3a\xbe\x7e\x81\x37\x2a\x2e\xf9\x8a\x75"
+ "\x5e\x95\xeb\x17\x68\xf0\x6d\x11\xba\x22\xca\xf5\xd7\xd1\x5e\x42"
+ "\xb2\x01\xec\x23\x44\xa3\x25\xa0\xec\x9d\xfa\xba\xc1\x3e\xd1\x84"
+ "\x3c\x16\x89\x63\xb2\xb1\x27\x5d\x9f\x48\x76\x6b\x04\xff\x20\xd3"
+ "\xc7\xca\x73\x83\xeb\xdb\x07\xe9\x6d\xa4\xa3\x7c\x42\x87\x50\x99"
+ "\xd4\x9d\x15\x22\x59\xc2\xa4\x6e\xea\x9b\x36\x17\xb1\x5f\x4d\x8e"
+ "\x09\xaf\xdb\x49\xf3\xc4\xba\xed\x8e\x5c\x97\x93\x53\xc2\x7c\xea"
+ "\xc4\xe3\xd3\x6b\x99\x75\xb8\x75\x68\x8b\xa3\xbd\x6a\xf2\xb3\x35"
+ "\x35\xbc\xde\x65\x50\xef\x5d\x5d\xcd\x62\x95\x75\x00\x1b\xad\xb3"
+ "\x15\xd9\xe3\xb0\x1e\x5f\x30\xc5\x5e\x9b\x31\xd7\x3e\x9a\x3b\x2d"
+ "\xcc\xb0\xfe\xdc\xe8\x98\x29\x81\x6b\xeb\x79\xd4\xcd\x0f\x3d\x60"
+ "\xa7\xb3\x6f\x17\xfb\x22\x9f\x45\xcd\x05\x96\xbb\x31\x96\xd9\xbc"
+ "\xca\x94\x03\x74\xcf\xfd\x70\x2c\xd1\x22\x53\x0e\x50\x99\xa5\x75"
+ "\x2c\xa6\xb4\x93\x77\xad\x7b\x7c\x54\x0c\xf6\x5f\x33\xf6\x8d\xb5"
+ "\x57\xc7\x5e\x5b\x3f\x80\x32\x5e\xcf\x16\xf9\x86\xb5\xf3\x26\xdb"
+ "\x66\xbd\x7d\xf8\xb6\xd9\xc6\x9f\x52\xac\xf3\xaf\xac\x6d\x37\xf8"
+ "\xc3\x6d\xbb\xc1\xff\x7f\xd0\xb6\xf7\x22\xda\x66\x0e\xb7\x2d\x8f"
+ "\xda\x76\xe2\xca\xda\x96\x3c\x2b\xdc\xb6\xe4\x59\xff\x60\xdb\xf6"
+ "\x8c\xdc\xb6\x29\x4f\x0e\xdf\x36\xc7\xb5\xa7\x94\x29\xab\xae\xac"
+ "\x6d\x53\xed\xe1\xb6\x4d\xb5\xff\x6f\xda\xe6\xac\xe3\x27\x5b\x93"
+ "\x18\xd9\xd3\x8c\x25\x3c\x7f\x4a\xb9\xa1\x62\x55\x92\xd0\xe3\x4e"
+ "\xc0\xfb\xed\x65\x75\xfc\x73\x49\xdb\x4c\xb9\x28\xf7\xb4\x29\x3e"
+ "\xcc\x5f\xa9\x57\xa2\xdc\xe0\x15\x7a\x2e\x51\x13\x76\xf1\x4a\x1e"
+ "\x9c\xe1\x27\x9d\xc1\x20\xd9\x76\x21\x5b\xf0\xf5\xfb\x2e\x04\xc8"
+ "\x0f\x47\xc3\x8e\x73\x46\xb6\xef\x82\xcf\xd0\x57\x75\xc3\x34\xdd"
+ "\x9e\xab\x9e\xd7\xb4\xe5\x72\xf8\xe8\x86\x25\x73\xf3\x98\x89\xf0"
+ "\x11\x3d\xc9\x9f\x66\x8d\x73\x74\xcc\xdc\xaf\x68\xdf\xbf\xc1\xa1"
+ "\xdf\xd7\xd5\xcb\x4a\xef\x1a\xcd\x4d\xa5\x2c\x8a\xee\x0c\x0b\xdb"
+ "\x8f\x16\x1f\x4b\x2e\x65\xa3\xd2\x1d\x28\x3f\xc0\xb2\x4d\x0e\x94"
+ "\x0d\x78\x48\x5a\xfe\x86\x57\xa3\xf2\x59\x6c\x2d\xca\xa6\xe7\x5c"
+ "\x4b\x19\x5f\xfd\x2c\x33\xd2\xdd\x62\xba\x23\x2c\xef\x07\x47\xc7"
+ "\xa0\x1e\xaf\x5e\xcf\xdf\x81\x5f\x9c\x84\xdf\x8d\xaf\x87\xe1\x77"
+ "\xe3\xf2\x30\xfc\x6e\xbc\x43\xc2\xef\xc6\xd4\x30\xfc\x92\xad\x57"
+ "\x06\xbf\x1b\xf3\xc3\xf0\x93\x79\x2f\x0f\xbf\x1b\x7f\x3d\x32\xfc"
+ "\x6e\x6c\x0c\xc3\x4f\x96\x35\x02\xfc\xa2\x87\x87\xdf\x8d\xa1\x7f"
+ "\x0c\x7e\xc9\xd6\x7f\x10\x7e\x63\x25\xfc\xa6\x2a\x61\xf8\x25\xbf"
+ "\x1c\x86\x5f\x72\xb1\x84\x5f\xb2\x2d\x0c\xbf\xa9\xd9\x57\x06\xbf"
+ "\xe4\x3d\x61\xf8\xc9\xbc\x97\x87\x5f\xf2\x89\x91\xe1\x97\x1c\x08"
+ "\xc3\x4f\x96\x75\x65\xf0\x9b\x7a\x17\xe0\x66\xd6\xe0\x67\x1e\x19"
+ "\x7e\x53\xb3\xff\x41\xf8\x99\x24\xfc\x6e\xba\x27\x0c\xbf\xa9\xe7"
+ "\xc3\xf0\x9b\xfa\x8a\x84\xdf\xd4\x86\x30\xfc\x6e\xaa\xbf\x32\xf8"
+ "\x4d\xed\x0e\xc3\x4f\xe6\xbd\x3c\xfc\x6e\x9a\x32\x32\xfc\x6e\x9a"
+ "\x1d\x86\x9f\x2c\x6b\x04\xf8\x8d\x1e\x1e\x7e\x37\xad\xfa\xc7\xe0"
+ "\x77\x53\xfd\xe5\xe0\x77\x65\xb4\xc6\x4d\x23\xde\x7f\xbf\xc2\x72"
+ "\x82\x23\x95\x43\x30\x24\xfd\x44\xb5\xea\xa6\xe0\x76\x35\x3a\x46"
+ "\xde\xe1\xb8\xe9\x00\x78\x98\xbb\x3b\x94\x6f\xdc\xbf\x5d\x1d\x15"
+ "\xc3\x2b\x3f\x3f\xae\x56\x9e\x5c\xc3\x2b\xa2\x8d\x6a\xc5\x68\x23"
+ "\xd9\x33\x18\xd1\xe7\xba\xf2\x8d\x17\xa2\xae\x63\xd7\xd3\x7d\xbd"
+ "\xd5\xa0\xd7\xe8\xbd\xaf\xea\x1b\x07\x40\x8b\xa4\x5d\x0a\x93\x9c"
+ "\xa5\x45\xc2\xd9\x67\x61\x6e\xce\xf2\x82\x9c\x25\x05\x76\xeb\x92"
+ "\xc7\x7e\x56\x34\xd4\x86\xbe\xf0\x93\xb9\x86\xc6\xef\x1b\x81\x41"
+ "\x1b\x33\x95\xdc\x41\xb6\xfa\x6c\x37\x90\x6e\x5a\xca\x6c\xe1\xd7"
+ "\x20\xa1\x24\x89\x0f\x64\x3e\x97\x76\x23\x3f\x24\x6c\x10\x0e\xe4"
+ "\x3d\x07\x7e\xaa\x89\xec\xca\x68\xe7\x50\x4d\xa7\x94\x9b\x7f\xc0"
+ "\xe3\x9d\x42\x7f\x54\xdc\xed\x50\x52\xf4\x3b\x58\xcd\xdc\x6c\x4f"
+ "\x52\x5d\xce\x5d\x7c\x83\xb3\x9e\x60\xd0\x4a\xf6\xdf\x56\x44\x4d"
+ "\xee\x50\xa6\x25\xf2\x78\x7b\x12\x77\xd9\xad\xda\x19\x87\xb0\x7f"
+ "\x97\x56\xc2\x3f\xa3\xf2\x34\x5a\x90\xfc\x96\xb8\x25\x3d\x98\x72"
+ "\xc4\x54\x61\x8d\xa2\xb4\x64\x87\x91\xec\x13\xea\xbe\xaa\xa8\xdd"
+ "\x94\x16\xf4\xf8\xdd\xc8\x7f\x37\xf9\xea\x1c\x2c\x43\xb6\xe9\x9a"
+ "\xd3\xca\x37\x8d\xa2\x2f\xae\xa2\xe6\xde\xa7\x33\x9f\x13\xfe\x22"
+ "\x05\x5c\xbf\x75\x11\x7d\x68\x16\x7e\x3e\x83\x67\x85\x9f\x4f\x2d"
+ "\xcf\x24\xe4\x11\xf8\x94\x6c\xaf\xca\x32\xbe\x75\x42\x6f\x17\x68"
+ "\xe8\x31\x08\xbf\x1d\x51\xc7\xd5\x08\xef\x8f\xf8\x1e\x8b\xf0\x26"
+ "\xd0\xa1\xf1\xda\xf7\xb1\x08\x17\x13\x5d\x2a\xfa\x55\x5d\x2e\x75"
+ "\xa2\x95\x6f\x2d\x46\x9c\x59\x4b\x13\x8f\x34\xf7\x10\xad\xab\x95"
+ "\x91\x80\xf0\x54\xe2\x19\xb5\xef\x89\x08\x5f\x45\xe7\x02\xda\xf7"
+ "\x71\xa7\x95\x9b\xcf\x20\xfc\x0d\xed\x3b\xe8\xfa\x9b\x85\xad\x2d"
+ "\xc0\x9d\x7c\x47\x39\x00\xfb\xb5\x04\x77\xc0\x3a\x91\x9b\x8b\x9a"
+ "\xc0\xaf\x96\xd1\x38\x52\x3f\xdd\x25\xa7\x59\x87\x72\xf3\x75\x74"
+ "\x2f\x4f\x8e\x95\x73\x97\xb4\x0f\x64\xc8\x44\xbc\x85\xe2\x49\xb7"
+ "\x5c\xdd\xe0\x5c\x4b\xef\x80\xe9\x7e\x82\xa1\x56\x17\x78\xa2\x9b"
+ "\xd3\xb4\x71\x06\xec\xc8\x86\x2f\x2b\xdf\xa1\x8d\x05\xda\x36\x1a"
+ "\xdf\xb7\x69\xe7\x1e\x5d\xe9\xc1\x01\x79\xbf\x48\xb9\x39\xef\x7f"
+ "\x64\xb3\x02\xf9\x24\xde\xbb\x79\x97\xee\xc3\x10\x71\xc2\x56\x06"
+ "\xcd\x4f\x92\xaf\xf8\xe2\x8b\x1a\x84\x8d\x16\xcc\x51\x7d\xae\xd0"
+ "\x3c\xe1\xd1\xdf\x70\x4b\x59\xcd\xcd\x83\xf7\x7f\x91\xd7\xaa\xf9"
+ "\x7d\x60\x92\x4f\xf8\x16\x0b\xeb\x17\x7d\x53\xe0\x87\x88\x6f\x49"
+ "\x11\xdf\x74\xbb\x84\xd2\xe6\x54\xd5\xb7\x66\x47\x7c\xab\xbd\xe4"
+ "\xdb\xa2\x88\x6f\x6b\x2e\x29\xd3\x16\xf1\xcd\x7e\x49\xbe\x75\x11"
+ "\xdf\xb2\x2f\xf9\xb6\x2b\xe2\x5b\x86\xf6\x2d\x0a\xf1\xee\x41\x1b"
+ "\x89\xca\x37\xd3\xb4\x78\xe0\xfa\x6f\xb5\x47\xc4\xa7\x6a\xf1\x54"
+ "\xbf\xcf\xcb\x8e\x1d\xd7\xe2\xc5\x3c\xc7\x3c\xba\x49\xd6\x31\x2d"
+ "\x36\xa2\x0e\x26\xc7\xb0\x48\xde\x2f\x56\x52\x1c\x26\xc5\x3a\x9a"
+ "\xe6\x94\xa9\xa2\x9c\x7c\x08\xb9\xa4\x3d\x30\xb9\x0e\x85\x1f\x6a"
+ "\xf2\x95\x8b\x74\x23\xe1\xc6\xe1\x75\x04\xa7\x95\xeb\xf7\x58\x43"
+ "\xae\xa2\x03\xaa\xab\xe4\x28\xf9\x25\x24\xbb\x61\x65\xdd\x64\x3b"
+ "\x46\xf7\x49\xd8\xcf\x3c\xf6\xbe\xf2\xd6\x80\xb8\x6f\x4b\xf7\x21"
+ "\xe2\xc8\xee\x59\xab\x90\xef\x9c\x91\x7e\x09\xe9\x7e\xef\x86\xa2"
+ "\x03\x2b\xbb\x59\x92\xed\xbb\xbc\x93\xf8\x3c\x89\x13\xa6\x11\x3e"
+ "\x31\x69\x38\xed\x59\xa1\xeb\xad\x4c\x4f\xa5\x38\x4f\xb7\x90\x33"
+ "\xc7\x9c\x52\xa6\x97\xeb\xdf\x65\x7f\xa7\x97\x0b\x5e\x5a\xbb\x57"
+ "\xd8\x57\x35\x3d\x65\xd0\x6f\xa6\x32\x7d\xcd\xf9\xf8\xfd\xbb\x10"
+ "\x37\x67\xa8\x7e\xe3\xf4\x87\xa9\x4c\xea\x87\x57\x99\x16\xa0\xb2"
+ "\x91\x26\x7b\x50\xbf\x11\xf1\x2b\x83\x6c\x02\xda\x76\x4a\x2f\x1f"
+ "\xdf\xc1\xff\x4f\x13\x7c\x25\x95\x79\x7e\xc3\x87\xed\x88\xab\xf5"
+ "\x1a\xe7\x3a\xa4\x7e\xe4\xf4\x7a\x2f\xeb\x48\x1d\x69\xff\x13\x32"
+ "\x49\xb3\xd3\xcd\x5d\xce\x66\xac\xf9\x46\x69\x07\xc0\xe9\x96\xbc"
+ "\xfc\xf4\x33\xe4\x8b\x8c\x7c\x78\xd3\xb9\xa3\xc4\x3b\x33\x84\x3e"
+ "\x04\xc5\x01\x36\x84\x9f\xc5\x59\xd1\x95\xad\xc9\xe9\x62\xff\x23"
+ "\xdb\x4d\x74\xe7\x82\xee\x70\xf4\x55\xcd\x58\x30\xe8\xeb\x41\xbf"
+ "\x4f\xa0\xcc\x78\x8a\x64\x7c\x35\xaa\x6c\xe3\xa5\x6d\xa0\xf6\xa2"
+ "\xac\xee\x11\xf7\x52\xb3\xb3\x51\xc8\x41\x37\x16\xbb\xa5\x2e\xd9"
+ "\x8c\x57\xa2\x2c\x13\xbb\x50\xd7\x81\x41\x1f\x17\x48\x53\x4d\x3a"
+ "\xc1\x28\x7f\xb0\x9f\x85\xa2\x8e\xe3\x52\x4e\x3f\xc3\x07\x3c\xd6"
+ "\x58\xd3\xcf\x8c\x5a\xbc\xaf\x35\x18\xa0\xbb\xf5\xc3\xda\xe0\xa2"
+ "\x3d\x52\xd8\x6f\xda\xe8\x6c\xa4\xfb\x13\x33\x03\x7a\x9b\x67\xfa"
+ "\x48\x6f\x9f\xda\x2c\x61\x3b\xf3\xa4\x0e\xc7\xf5\xe7\x50\xb6\xf3"
+ "\x63\xd6\xa9\xcc\x7c\x92\xf4\x5b\x04\x4c\x4a\x74\x9d\xab\x99\x4f"
+ "\x8a\x74\xfd\x83\x69\x84\xbc\x83\xf4\x7d\x09\x4e\xdb\xc9\xee\x00"
+ "\xca\xac\xc6\x58\x08\x3f\xb6\xca\xcc\x97\x85\x7c\x13\xdf\x45\xbf"
+ "\x85\x3e\x5b\x6a\xa2\x9c\x2b\x33\xf7\x78\x95\x54\xab\x9c\x83\x32"
+ "\x8e\x7c\xc0\x93\x1e\x42\x8f\x32\x73\x3d\xf9\x92\x05\x3c\x9a\xc9"
+ "\x76\x5d\xab\x1f\xeb\xc5\xd1\x4f\x73\xa1\x99\x7c\x06\x7a\x95\x99"
+ "\xd2\x97\x95\x99\x60\x3e\xd3\x46\xf5\x13\x6c\xc9\x8f\x2e\x60\x7a"
+ "\xa1\xaf\x2a\x75\x50\xfe\x41\x3e\x7b\x91\x66\x44\xdb\x8d\x04\xa3"
+ "\x10\xda\xdc\x0a\x7a\xd5\x3d\xe1\x63\x6a\xdf\x7b\x6a\x82\xb3\x91"
+ "\xf4\x27\xf1\x2e\x6d\x5f\xb8\xe4\xd8\xc9\x79\x90\xfa\x42\x94\x25"
+ "\x69\x4a\xab\x9c\x0b\xd2\x8f\xb9\x92\x9a\xa1\xc1\x4f\xf8\xbc\x70"
+ "\xad\x90\x70\x90\xe9\x6f\x31\x4a\xb9\x4c\xd2\x37\xd0\xae\xfa\xb0"
+ "\x5c\xe6\x16\xa3\x90\xa9\x69\x3a\xd6\xf8\x76\x30\xa2\xcd\x7e\x71"
+ "\x0f\xf0\x1c\xf1\xd4\xa9\x39\x54\xd7\x7a\xb2\x2d\x46\xf3\xe2\x74"
+ "\xe4\xfc\x4f\x9d\x4f\xed\x24\xdd\xbc\x50\x7c\xb1\x9b\x6f\x28\x26"
+ "\x5f\xda\x6e\xe4\x29\xc5\x5a\x18\xf6\x2e\x1a\xe1\x4d\xf2\x7b\xd2"
+ "\x57\x75\xcb\xb4\x08\xdf\xbb\xd8\x07\x6f\x79\x44\xdf\xe7\x68\x8f"
+ "\x26\x3b\x0f\x83\x71\x1b\xce\x6d\xc1\x7a\x0f\x68\xb4\xd2\x48\xbe"
+ "\xa7\x62\x6b\x66\xb0\x54\xba\x6b\x4c\x7a\xda\x34\xdf\xb8\xf9\xdc"
+ "\x6c\xb2\x9d\x4c\x76\x20\xdd\x25\xb7\xa2\xbd\xb7\x8e\x7d\x66\xbc"
+ "\xb8\xdf\xe8\x77\xcf\x38\x47\x3a\x3a\xdd\xa7\x4a\x85\x7d\xa3\x98"
+ "\x74\x47\x90\xef\x90\xbe\xb7\x7d\x3c\xfe\xdc\x6c\xfa\x26\x7c\x07"
+ "\x50\x99\xff\x53\x3b\xc0\xca\x2d\xed\x1a\x2d\xd3\x8d\xbd\xfc\x5a"
+ "\xf4\x47\xdc\x67\xc4\xfb\xf8\xd3\xca\x6d\xb7\x4b\x7f\x91\xd2\x96"
+ "\xbd\xa6\x6b\x18\x2d\xef\xe7\xfb\x98\xb8\x2f\xad\xdc\xfa\x82\xf5"
+ "\x66\xc6\xba\x95\x5b\x5f\x14\x76\xa5\x5d\xf6\x18\x8d\xce\x8b\xa9"
+ "\x91\xed\x32\x65\x39\x0c\xa2\x8d\xd4\xbe\x2b\x6b\xdb\xad\xfa\x7e"
+ "\x19\xdd\x57\x75\x6b\xa3\x7e\xaf\x5f\xf4\x5f\xb3\x37\xed\xbe\x81"
+ "\xf8\x96\xdb\xa6\xca\x71\xb1\x6b\xbe\x7a\xed\xb1\xff\x07\x75\xfb"
+ "\xb4\xfd\xd0\x2b\x6c\x6e\x03\x2e\x18\x57\x6f\x5f\xd5\x6d\x69\xfa"
+ "\x7e\xaa\xe9\xc8\x4f\x93\xfb\xfc\x6d\x99\xe1\xbd\x54\xc2\x70\xc8"
+ "\x9d\x9d\x65\xcb\xec\x56\x10\xec\xb6\x25\xf6\xc7\xf2\xac\xb9\x85"
+ "\x85\xcb\x0a\xad\x64\xf0\xe6\x12\xbf\x4a\x31\xbc\xea\xb6\x7c\xcd"
+ "\xf7\xdb\xae\x41\xdf\x6f\x55\xb7\x1d\x88\xf4\xc9\xe7\x55\x6e\x6b"
+ "\xfc\xbf\xe1\x6b\x6e\x1b\xf1\x9e\x9f\xcb\xa0\x36\xe0\xd7\x88\x9f"
+ "\x1b\x3f\xf2\xc1\xc3\xb2\x02\x2c\x0d\xfb\xa3\x38\x13\x0e\xdf\x57"
+ "\xbf\x6d\x1d\x9d\x83\x77\x28\xb3\x6e\xd9\xae\x1a\x99\xb0\x6b\x52"
+ "\xa9\x0a\xdb\x9b\x3b\x90\x1f\x3f\x37\x7e\xcd\xf8\x89\x7c\xea\x1b"
+ "\xe2\xae\x6d\x43\xe4\x37\x3a\x9b\xe6\x95\xee\x39\x94\x86\x57\x18"
+ "\x05\x1d\xa2\x6e\x94\xe9\x2e\x69\x83\x81\x57\x4d\x3f\xa0\xa5\x13"
+ "\xb8\x21\xae\x82\x59\x87\x49\x17\xc5\xab\xbe\xe1\xd5\xd2\x89\xbb"
+ "\xef\x7a\x7f\xc8\x76\x3f\xd2\xeb\xe9\x8c\xbc\xea\x16\x9b\x96\x4e"
+ "\xda\x34\xab\x34\x0c\x57\xef\x28\x5e\x79\x21\x49\x4b\x67\x8e\x2c"
+ "\x2f\x22\x4d\xb4\x5a\x35\x79\x1e\xa5\x51\x2b\x8c\xd2\x0f\x4b\xd5"
+ "\x6d\x47\x91\x7e\x58\x9b\xa7\x57\x36\x4e\xb7\x97\x5e\x3a\x4e\xb6"
+ "\xc7\x96\xe6\xde\xb9\xb4\x60\x05\x79\x92\xb2\x2f\x5b\x6e\xa7\x67"
+ "\xc1\x92\x9f\x89\xc7\xb2\xac\xc7\x1f\x93\x2f\xf6\xfc\x54\x7a\xc9"
+ "\xc7\x7c\xa3\x67\xce\x72\x1b\x3d\x1e\x5b\x46\x41\x47\xde\xb4\xe5"
+ "\x8f\xe9\x2e\xbd\x87\xd8\x5d\xea\xab\xfa\x76\xb2\x57\x99\x95\x28"
+ "\xe9\x91\x6f\xa7\x7a\x95\x6f\x88\x73\x60\x53\x85\x97\xbd\x99\x22"
+ "\x7c\xff\xb1\xaf\xd9\x2b\x50\xbe\x7d\x17\xd9\x2b\x30\x55\xd8\x1e"
+ "\x33\x05\x97\xe6\xf2\x0d\x25\x56\xe4\xcd\xf7\xb2\x9d\xda\xdd\x72"
+ "\xbb\x45\xd8\x0d\xad\xba\xfd\xa0\xae\x5f\xa8\xba\x8a\x5a\xc8\x1e"
+ "\xbe\xd0\x37\xda\x28\x6c\xe1\x04\x90\x2e\x71\xfb\x46\xe1\x97\x26"
+ "\x11\xe1\xa3\x08\x27\x21\x6c\x41\x18\xfc\x65\x4e\x26\xdd\x4f\x44"
+ "\xd8\x8a\x70\x32\xca\x6f\xd1\xd7\x45\x24\x6c\x34\x67\x73\x77\x0e"
+ "\xcb\x1f\x0f\xb5\x31\x85\xb5\xf5\x1d\xb3\xee\xcb\x57\xf8\xed\xad"
+ "\xfa\x8e\x75\xd0\x6f\xaf\xf0\xe5\x64\x5e\x2c\xf6\x35\xb1\xb7\x7f"
+ "\x67\x5b\x94\x65\xd2\x0a\x49\x87\x7f\x67\x81\x6e\x93\x41\xd2\xd9"
+ "\xdf\xc9\x8c\xf0\x79\x4c\xe1\xbc\x41\x9f\xc7\xd2\x2e\xd9\x73\xc2"
+ "\xee\x91\xf2\x9d\x06\x5e\xf5\xed\xf6\x41\xff\x74\x55\xdf\x71\x45"
+ "\xfa\xa7\xf3\xe2\x3b\xf1\x37\x88\xdf\x15\xde\x07\xbf\x33\x87\xea"
+ "\x1c\xce\xbf\x33\xf8\x73\x47\x56\x31\x68\x71\x3c\x05\x5d\xae\xd1"
+ "\xc0\x14\xcf\x2b\xd3\xc8\xbe\x8d\x95\xbe\x11\xed\x37\xac\xcc\x81"
+ "\xfc\x2b\x2a\xb3\xef\x21\xbb\xbb\xbe\xb2\x1c\xe5\xc6\xed\xa4\x83"
+ "\x84\xb0\xb4\x1b\xc9\x7b\x94\xd9\xe2\x1e\x9b\x6e\x53\x2e\xf2\x4e"
+ "\xfc\xb0\x77\x0f\xde\xd7\xcf\x8c\xf3\x97\x99\x82\x4b\x72\x25\x1d"
+ "\x37\xfb\xd7\x12\x97\x16\x77\xca\xfd\x7e\xf6\x3a\xfe\x90\xf4\x77"
+ "\xe2\x55\xee\x30\xd3\x7d\x24\x93\x92\xbf\x8c\x23\xaf\xc9\xb1\x24"
+ "\x57\xc4\x21\xdd\x6a\xd0\x5a\x5a\xfb\x9e\xf2\x24\x75\x31\x7e\x21"
+ "\x24\xef\xfa\x2b\xb3\x6d\x3f\x99\x54\x4e\xf5\xc4\x08\x3a\xe2\x7d"
+ "\x16\x4b\xbe\x02\xa9\x6d\xdb\x23\x6c\xde\xd5\x20\x8e\xf4\xb1\x7a"
+ "\x1f\x62\xc2\xee\xaf\xd6\x16\x9b\xf0\x55\x56\x75\x47\x8c\x6e\x33"
+ "\xc7\x8b\xb8\x4b\xfb\xf3\xd0\x0f\xc5\x0a\x99\xfa\xd8\xb4\x8c\xf9"
+ "\x78\x9b\xa6\xb9\xb9\x8d\x9c\x3b\x49\xbd\x09\xa5\xa9\xbd\x7b\x7f"
+ "\xbe\x52\xf8\x89\xac\xba\x23\x13\xe3\x14\x14\xe3\xbd\xfa\xc7\x5f"
+ "\x12\x6e\x11\xfe\x13\xe9\x5e\xa1\xea\x47\xbd\x73\xee\x17\xf6\x75"
+ "\x0d\x92\x5e\x14\x76\xed\xaa\xee\x48\xe2\x09\x45\x8d\xd2\x47\x6c"
+ "\x49\x23\xc6\x4f\xec\xfb\xb4\x36\xc4\xfd\x49\x33\xf5\xfd\x8e\x06"
+ "\xe0\xd4\xb9\xf8\xfd\xab\xf4\x0f\xf3\xe3\x2f\xf5\x72\xc9\x7e\x14"
+ "\xe6\x96\x15\x4f\x33\xea\x6f\x1f\xd4\x11\x1a\xbc\x93\x79\xc7\x45"
+ "\xb2\x6d\x35\x78\x3f\x57\x99\x73\xbb\xa4\x2b\xef\x34\x7a\xd9\x4d"
+ "\x2e\xb9\xbe\xef\xc4\xfc\x6f\xd6\xee\x66\xdd\x09\xfe\xf7\x9f\xb3"
+ "\x87\x96\x71\x67\xae\x2e\xfb\x90\x63\x77\x67\x1a\xe6\xe2\x5c\xfc"
+ "\xfe\x15\xe9\x17\xea\x3e\xb2\x57\x1b\xc4\xdd\xa2\x53\x51\x16\x96"
+ "\x8a\xf8\x1c\x3d\x7e\x94\x92\x06\xd8\xdc\x69\xd7\xf1\x49\x6f\x42"
+ "\x71\x0b\xc2\x6b\x40\xa7\x07\xb5\x30\xf8\x9f\x3b\x6b\xf5\x30\xde"
+ "\xeb\x75\x7c\x43\xfc\x59\xef\xd3\x99\xcf\x12\xff\xf7\x98\x05\x34"
+ "\x99\x85\xf8\xab\x3b\xc1\xff\xfe\xb9\x5c\xe6\xfd\xc0\xd7\x5b\xf9"
+ "\xce\x34\x7f\x42\x4f\xaa\x1f\x38\x14\xdf\x8e\x7b\xd9\xef\x16\x6b"
+ "\xe5\x74\x79\x8d\xf3\x8f\x86\xc7\x23\xca\x04\x18\x1f\x95\x7d\x9a"
+ "\x63\xc5\x7b\x3b\xf9\x2b\xef\xab\xfa\x27\xb3\x57\xf9\x76\x40\xa4"
+ "\x5b\xd1\x5d\xbf\xae\xdf\xbc\xc8\x03\x0e\xde\xfd\x38\xcd\x95\x7f"
+ "\x12\xf7\x93\xd7\x97\x98\x33\x88\xe6\x23\x3b\x04\xc2\x3e\x19\xd9"
+ "\x9c\x0c\xb2\x68\x61\xe7\x7f\xc3\xb1\x2e\x61\xdf\x7e\x65\x4a\xac"
+ "\x6e\x6f\x12\xeb\x34\x8f\x1b\xf6\xda\xc9\x06\xa5\x90\xa5\xf5\xa5"
+ "\xc4\x09\xbb\x93\x9a\xbd\xc9\x6d\x2b\x58\x62\x9d\x2a\xed\x4d\x0a"
+ "\x1b\x05\x97\xb1\x39\xc9\x2b\xbf\x98\xa5\xdb\x9c\x04\x1c\xe8\xee"
+ "\x61\x0a\xbf\x10\x0c\xe0\x99\x1c\x61\xeb\xc6\x38\xac\xfd\x49\x03"
+ "\xf0\xa6\x41\xda\x9f\xbc\xb2\xfd\xe6\x9f\xba\xe5\x3c\x99\x33\x4d"
+ "\xf7\xe1\x1d\x11\x97\x86\xf5\xa2\xd1\x39\x77\x04\xb4\xb8\x45\x5e"
+ "\xf6\x56\xf7\x20\x6d\x06\x7c\x47\x32\x45\x7c\x2f\xe5\x65\x79\xcf"
+ "\x46\xae\x2b\x26\xfe\x68\xeb\x1e\x85\x7d\x39\x1a\xbf\xd1\xf4\x5b"
+ "\x30\x88\x3f\x2e\xf0\x76\xe2\x11\x4c\x0a\xf6\x1b\x47\x14\x4f\x0f"
+ "\x06\xa3\xb2\x82\xca\x51\xa2\x3d\xe9\xce\x75\x7a\x28\x48\x77\xff"
+ "\x8d\xe9\xa1\x5e\xf2\xaf\x79\x94\xee\x92\xd5\x3c\x4e\x77\x1b\x27"
+ "\x73\xf2\x53\x93\x1e\x3a\xcb\x77\xc8\x3b\x9b\x6d\x9a\xcf\xcc\x96"
+ "\xd0\x0a\xde\x8c\x71\x88\x25\xbe\x83\xec\x6f\xc5\x29\x01\x16\x67"
+ "\x8b\x3a\xf4\xe0\xf9\x43\x9c\x6c\x6f\x91\x8f\x32\xb5\x2a\x00\x5c"
+ "\x69\x55\xb2\x82\x51\xe5\x9e\x60\xa7\xf0\x13\x90\x1e\x1a\xcd\xd3"
+ "\x1d\x77\x71\xe1\x5b\x6c\x05\x6f\x02\x9e\x8d\x12\x3e\xb4\x8b\x79"
+ "\x2f\xde\x63\xd2\x8b\x7b\x39\xf9\xf7\x44\xd9\xcd\xe9\x41\xb5\x3f"
+ "\xdd\xa1\x96\x65\x39\x14\xe4\xfb\x1c\xf9\x3e\x47\x7b\x52\x51\xa6"
+ "\x19\xe1\xbb\xf9\x8e\xc7\xe9\x0e\x54\xb9\xe0\x7d\xd0\x47\xb7\x76"
+ "\xaf\xb4\x91\x7c\x7a\x92\x9d\xf1\xac\xa0\xbb\x7c\x87\x76\x4f\x54"
+ "\xf8\x96\x75\x0c\x70\xad\x9e\xd9\xe9\xc5\xec\xee\xac\xe2\xc9\xe2"
+ "\xbe\x29\xdd\xa5\x4a\x0f\x5a\x51\x67\x39\xc1\x23\x56\xf8\xf3\x16"
+ "\xf7\xa9\xee\x6a\xbf\x9c\x7f\x4f\xd2\x13\x29\xba\x8e\x19\xe8\x7e"
+ "\x46\xe8\xb7\x05\x6d\x64\x0b\xac\xcc\xc7\x03\x24\xf7\x3b\xd4\xdf"
+ "\x6e\xb0\xae\x30\x02\xaf\xde\x15\x6a\xb5\xa5\x0e\x7f\xa7\xae\xda"
+ "\x96\xcf\x37\x95\xce\xe2\xd5\x45\x0b\xf0\x3c\xc0\x5d\x25\x74\x67"
+ "\x50\xe1\xd5\x2b\x92\xf9\xa6\x55\x88\x2f\x66\x78\x1e\xe0\xd5\x4f"
+ "\x1f\xe7\x9b\x9c\x08\x3b\x1b\xf1\x44\x38\x63\x27\xd2\xa7\xf2\xea"
+ "\x87\x12\xf1\x6c\xe0\xd5\x3f\x5c\x83\x74\x08\x2f\xf2\xe3\x89\xf0"
+ "\xbf\xe4\x20\x1d\xc2\xff\x7a\xf4\x94\xf2\xdd\x66\xbc\x23\xae\xa2"
+ "\x56\xd6\xb5\xa6\x5e\xd4\x55\xfd\xf3\x3d\xb2\x8e\x5f\x36\xca\x3a"
+ "\xd6\x37\xc9\x3a\x5c\x6d\xb2\x8e\x1f\xcd\x43\xba\xd9\xbc\xfa\xc7"
+ "\xa9\x78\x36\xf2\xea\x47\x92\x90\x0e\xe1\xac\x18\x3c\x11\xce\x46"
+ "\x5d\x4e\x84\x1f\xf5\xe2\x89\x70\x4e\x0b\xd2\xcd\xe1\xd5\x8f\x1f"
+ "\xc4\xf3\x20\xaf\xce\xa3\xf2\x11\x7e\xa2\x0e\x4f\x84\xf3\xd7\x21"
+ "\x1d\xc2\x05\xa5\x78\x22\xfc\x0c\xfa\x54\x9a\xc6\xab\x37\xb9\xf0"
+ "\x74\xf3\xea\xff\x40\x7d\xab\x10\xde\x12\xc0\x13\xe1\xe7\x90\xdf"
+ "\x89\x70\x5d\x36\x9e\x08\x6f\xa7\xbe\xce\xe3\xd5\x3b\xa8\x9e\x26"
+ "\x5e\xfd\x6b\xea\x33\xc2\xff\x39\x07\x4f\x84\x77\x52\x7b\x10\xfe"
+ "\x2d\xe5\x43\x78\x17\x60\x50\xba\x80\x57\xff\x6e\x16\x9e\xcd\xbc"
+ "\x7a\xaf\x11\xe9\x10\x6e\x38\x8a\x27\xc2\x2f\x01\x86\x4e\x84\xff"
+ "\x60\xc7\x13\xe1\x57\xa8\xbf\x0b\x79\xf5\x41\x0b\x9e\x2d\xbc\xfa"
+ "\xb5\x6e\xa4\x43\xf8\x75\x37\x9e\x08\x37\x01\x7e\x4e\x84\xff\x9c"
+ "\x87\xe7\xf0\x7e\x82\xaa\xdf\xf1\xf2\x8a\x68\xc6\xab\x3f\x34\xf3"
+ "\x8a\xd1\x78\xb6\xbb\x79\xc5\xa8\x14\x5e\x7d\xdc\x86\x78\x3c\x3f"
+ "\xda\x83\xf0\x34\x2d\x8c\xe7\xc7\x5b\x10\x4e\xd5\xc2\x78\x7e\xb2"
+ "\x06\xe1\x59\x5a\x18\x4f\x2f\x85\x01\xe3\x13\x74\xce\x41\x4f\x23"
+ "\xc2\x73\xb4\x30\x9e\x9f\x67\xe0\x19\xe4\xd5\x7f\x9d\x83\x78\xc0"
+ "\xea\xaf\x41\x84\xf1\xfc\xec\x20\xc2\x80\x85\xd7\x8a\xf0\x3c\xdf"
+ "\xd4\x9f\x09\x9d\x26\x75\xfc\xbd\x3e\x3e\xbe\xbc\xa1\xec\x3c\x33"
+ "\xd0\x1c\x25\x7f\x14\xd6\x15\x6c\x72\x87\x92\xf6\x7c\x83\xd3\x6b"
+ "\xa0\x34\xa1\xcd\xa5\xa9\xea\xf8\xd2\x06\xc4\x47\x23\xdd\xe8\x53"
+ "\xca\x3d\xef\xd1\xfe\xea\x29\xf5\x0a\x9f\x78\x9a\x5d\xbb\x68\xe4"
+ "\x39\x02\x7a\x62\x36\xf9\x46\x07\xbc\xf2\x79\xe5\xa8\x73\x78\x76"
+ "\xf3\xca\xab\x3b\x00\x2f\x84\xe3\xdf\xc7\x13\xe1\x6f\xff\x12\xf0"
+ "\x42\xf8\xc7\xf7\xe2\xd9\xdd\x57\x75\xcf\x34\xaf\xf2\x5d\xa1\xe3"
+ "\xc2\xf7\xfe\xdc\x66\x0a\x72\xe0\x23\xec\xd5\xbf\xde\xed\x33\x05"
+ "\xdd\x98\xef\xd5\x6d\x26\xb2\xcf\xf6\x7c\x3e\xda\xba\x90\xec\xca"
+ "\x11\xff\x13\xcd\x07\x92\x0d\xb2\xee\xab\x79\x87\x72\xcf\x8f\x48"
+ "\x6e\xca\xc7\xe7\x8c\xf4\xbd\x58\x7c\xbf\xe1\x77\x36\xf9\x3d\x86"
+ "\x85\xbf\xff\x98\xbe\x3f\x6b\x22\x59\xf7\x4d\x8f\x89\xef\x1e\x7f"
+ "\x97\xd6\xaf\x28\xfa\xf6\x32\xa5\xf5\x2a\xf7\xb4\x4b\xd9\x57\xda"
+ "\x71\x5e\x19\xc5\x7a\xcd\x25\xc7\xd1\xf6\x2e\xaf\x72\x57\xa7\x26"
+ "\x87\x6c\xe1\xe6\xa2\x36\x69\xc3\xc0\x39\x92\x7d\x95\x18\xb5\xb6"
+ "\x36\x73\x7d\x25\x6f\x23\x7e\x16\x7b\x90\xc1\xea\x4c\x6e\xec\x50"
+ "\xe6\x1e\xd8\x46\x72\x8a\xc4\xdd\xa9\x74\xcf\xa8\x43\xb9\xb7\x78"
+ "\x60\xe3\xd3\xc9\xd6\x12\x13\xea\x9f\xfb\x72\x59\x80\x9f\x77\x3b"
+ "\xef\xc5\x5e\x29\xe2\xb3\xa5\xee\xba\x78\x5f\x28\xf5\x8d\xc4\xfb"
+ "\x6c\x29\x73\x9d\x7b\x80\xf2\x46\xf2\x0f\xa1\x5f\x46\x75\xaa\xe3"
+ "\x77\xa7\xc9\xf3\xb2\x7b\x57\xbd\xaa\x7a\x0d\x26\x3b\x1b\x65\x2d"
+ "\x39\x84\xf2\xef\x6d\x1a\xc2\x6b\x0e\xa6\x15\xdf\x5e\x78\x0d\x69"
+ "\xb7\x0a\xb9\xd0\xbd\x47\x75\x99\x32\x47\x1f\x7e\x25\xe9\xac\x34"
+ "\xda\x17\x25\xbd\x38\x77\x11\xd9\xd7\x0c\x26\xae\x4f\x0b\xd6\xde"
+ "\xeb\x0d\xd5\xee\x4e\xe5\x9b\x77\xa7\xc5\x05\x15\x26\xf5\xfe\xe7"
+ "\xfe\x62\x66\x80\xe4\x75\xef\x50\xda\x7b\xd4\x31\x71\xb3\x66\x38"
+ "\x98\xc1\x5d\xf8\x31\x85\x2b\xf8\x2f\xaf\xcb\xf4\x74\xb7\x33\x77"
+ "\xa1\x28\xab\x9c\xff\x32\x75\xa1\x3a\x26\xb9\x76\x3b\xd1\xb9\x0e"
+ "\x92\x33\xbd\x4f\xf1\xa3\x30\x2e\xe0\x27\xe6\x66\xeb\x6d\x21\x3f"
+ "\x03\xeb\x01\x3b\xa2\x41\xe9\x9e\x76\x56\x28\x44\x36\xa5\xd6\x7a"
+ "\x01\x07\x39\x5e\x73\xe7\x11\xce\xd7\xea\x7d\x56\x4d\x78\xda\xdc"
+ "\xba\x98\xce\x64\x63\xc8\x46\xcf\x79\x71\xaf\x33\x48\xbe\x01\x69"
+ "\xaf\x95\x69\x23\xc7\x6e\xa9\x76\x9f\x75\x69\x81\xbd\xf0\x29\x6b"
+ "\xd1\xd2\x92\xdc\xbb\xa6\x2e\x9f\x66\x2d\x74\x58\x0b\x85\x7f\x6d"
+ "\x11\x91\x33\xcd\x5a\x94\xbf\xcc\x6e\xb5\x17\xdb\x72\xbf\xee\x6b"
+ "\xd8\xc2\xcd\x25\xdd\x92\x36\xbc\x5f\xda\x00\xa8\xdf\xdd\x65\x2f"
+ "\xe5\xaa\xf5\x86\xd1\xa0\xfd\xe7\x2d\xba\x18\x3d\x97\xee\xe6\x98"
+ "\xd5\x4a\x2b\xd3\x7c\x80\xc7\x3e\x9b\xc0\xe8\xfe\x48\x4c\x5f\xd5"
+ "\xbc\x85\xe1\x73\x96\xfb\x6b\xa5\x1c\x64\x5e\xb6\x57\xb9\x57\xd8"
+ "\x34\xab\xd5\xed\x7e\x69\xdf\xe4\x39\xc5\xbc\x72\x2f\x7b\x5e\xda"
+ "\xb2\xab\xdf\xbd\x40\xd2\x94\xf3\x84\xdc\x8a\x5b\x77\x77\xf1\x9d"
+ "\xf9\x64\xf3\x4a\xa1\xb9\x2a\x7c\xf2\xb2\x73\xe2\x8e\x2b\xd6\x5a"
+ "\x06\xdd\x2f\x0f\x6d\x2e\x6b\x53\xc7\x57\x67\xa8\xbf\x7d\xb2\xa1"
+ "\xec\xd7\xcc\xb0\x0f\xb8\xc0\x68\xc5\x7a\xb8\x81\x4d\x3e\xe4\xec"
+ "\x32\xa0\xcd\xaf\x1f\x72\xb6\x1b\x78\x6d\xf9\xae\xde\x64\x67\x7b"
+ "\xa0\x52\xd8\x07\x45\x19\x01\xf6\xe7\x79\x8c\x78\xa3\x46\xff\xb8"
+ "\xcd\x01\xff\xb8\xb2\xc6\xc0\xa6\x1d\xd9\xee\x1b\x6e\x65\xf3\xbf"
+ "\xc9\xcf\xbe\xd5\x44\x32\xac\xfb\x4b\xdf\x9a\x47\x32\xc4\x92\xce"
+ "\x80\xb9\xa4\xcb\xbf\x79\x3d\xe9\xf8\xf9\x2e\x6e\xde\xd1\xd0\x3f"
+ "\xbe\x32\xf5\x30\xd2\xbc\x03\xde\xe1\x5d\x2b\xe6\xef\x14\x66\xb8"
+ "\x78\x53\x7e\xda\xbe\x7e\x97\xa1\xb9\x69\x8e\x94\x7b\x66\x63\xcd"
+ "\x88\xf9\x34\x3f\xf7\xad\x03\x4d\x0c\x75\xb3\x7d\xfd\x0b\x0c\x7f"
+ "\x9e\xfd\xb5\xef\xff\xfe\x56\x6a\x13\xeb\x23\x9b\xad\xe0\xd1\x5e"
+ "\xfb\x78\x0b\xe3\x9b\x37\x99\x5f\x2c\x09\x18\x16\x7b\x99\xe1\x48"
+ "\xfb\x16\x56\x7a\x92\x8d\x0d\x9e\x4d\x31\xfe\x0e\xf9\x2f\x92\x2d"
+ "\xc4\x77\x2d\xc2\x26\x1a\x76\x17\x55\xdc\xeb\x03\x7d\xa2\x9e\x4d"
+ "\x89\x6e\x5d\xe4\x66\xf8\xfe\x68\xf0\x9f\x2d\xec\x48\x9e\x8f\x79"
+ "\x32\xeb\xd9\x45\x43\x1a\x7b\xe5\xdf\xea\xd9\x56\xf0\x07\x5b\x7b"
+ "\x58\xac\x3c\xcf\x4d\x89\x0e\x0e\xa4\x18\x83\x4f\xa7\x90\x8d\x1a"
+ "\xce\xcf\xa6\x8c\x21\x9a\x34\xb8\x2c\x25\xa6\xd5\x57\xcf\x66\x76"
+ "\xb1\x94\x8b\x06\x66\xba\xf8\x74\xca\x98\x56\xdb\x16\x94\x05\x62"
+ "\x13\x70\x25\xfb\x58\x64\x37\x8b\xe0\x74\x75\x26\x5b\xd4\xad\xcc"
+ "\xbf\x6b\xcc\x51\x36\x8e\xec\x33\x92\x7d\x35\xb2\x11\xab\x26\x6e"
+ "\x32\x87\x12\xd7\xb7\x39\xcf\x93\x3d\x91\x00\x03\xae\xcc\xb0\x4a"
+ "\x1f\xe4\x0a\xf5\x59\xe5\x29\x63\xb2\xe8\xb9\xb1\xe8\x51\xa2\x95"
+ "\xd5\x3e\x0b\xf9\x4e\x8a\xa1\x76\x62\x9d\xc6\xac\x3a\x01\x58\x96"
+ "\xa5\x18\x91\x2e\x16\xf1\x71\x9e\xee\x00\x0b\x4d\xff\x79\xf6\x0c"
+ "\x9b\xf0\x91\x9b\xb8\xdd\xc9\xcc\x2e\x27\x4b\xb4\x7e\x5b\xcc\xa5"
+ "\x47\x42\x2f\xfe\x3c\x83\x57\xfd\xeb\x6c\x5e\x61\x4c\x92\x71\x0b"
+ "\xee\xb2\x7e\x8f\x31\xeb\xad\xf4\x7e\xdf\x49\xeb\x9d\x18\xc3\xc4"
+ "\x5a\x9b\xa0\xe3\x05\xcf\x77\xdf\x47\x72\x8e\xdf\xf7\xde\xc5\xe8"
+ "\x5f\x97\xaa\x55\x47\xb7\xa8\x15\x46\x2b\xf9\xd2\xee\x51\xee\x7b"
+ "\x99\x57\x9f\x09\xf0\xda\x1d\x62\x2e\x22\xbc\xff\x62\xf4\x43\x5e"
+ "\x5e\xdd\xb3\x18\xe5\xa7\x5d\x54\x8c\xed\xf8\x1d\xd7\xf2\xef\xa2"
+ "\x7e\x87\x76\xe6\x37\x53\xbf\x85\xbf\x1d\xf4\x2b\x0b\x63\xc6\xc7"
+ "\xd7\x5a\x85\x0d\xfa\x01\xc0\x57\xf3\x47\x4a\xf0\x20\x18\xa8\x03"
+ "\x29\x63\x44\x5f\x07\x52\x62\x01\x5f\xb2\xc5\x6a\x72\x2e\x41\x9e"
+ "\xcd\xb5\xb3\xf0\x2d\xee\x62\x62\x6d\x1e\xf9\xbd\xf2\xd8\x7c\x2c"
+ "\xb4\xa9\x36\x95\x6c\x8d\x3d\x5b\x82\x35\x37\xae\xd6\xca\x37\xd5"
+ "\xce\xd1\xd6\x16\xa3\x76\xaa\xd5\x3d\xbb\x2e\xd2\x5d\x01\xb4\x0d"
+ "\xed\x6b\xc7\xef\xb8\x57\xb9\x6f\xda\xc5\xa9\xf9\xed\x78\x32\xb4"
+ "\xd5\xca\xab\x96\xe5\xd1\x3b\xbe\x59\x01\x9b\x71\x04\x07\x82\x87"
+ "\x84\xc5\x82\xb1\x61\x58\x6c\xdd\xe9\x55\xbe\x17\x54\xab\x3c\xa8"
+ "\xe3\xbe\xe3\xbc\xea\x89\x94\x88\x74\xb7\x87\xd3\xfd\xd7\x02\x99"
+ "\xee\xa3\x6e\x99\xce\x5e\x8f\xef\xef\x49\x78\x2f\x28\xfe\x3a\xbc"
+ "\x17\x3c\x15\xce\x5b\xe3\x93\x79\x9b\x4a\x65\xde\x2c\xca\xfb\xc2"
+ "\x25\x6d\xfa\x75\x38\xfd\x2f\x93\x65\xfa\x43\xd3\x64\xfa\x7f\xcb"
+ "\x8f\x48\xf7\x76\x38\xdd\xa6\x06\x99\xee\xed\x26\x99\x2e\xa7\x05"
+ "\x73\x63\xd4\x30\x6d\x09\x85\xf3\xbc\x34\x4b\xe6\xe9\xf4\xca\x3c"
+ "\x65\x8b\x91\xe7\xf6\xa1\x6d\xb9\x7f\x7a\x38\xfd\x8b\x5a\xbf\x3f"
+ "\xb3\xc9\xf4\x25\x31\x11\xe9\x1e\x96\xe9\xe8\xfb\x69\xa4\xbb\xaf"
+ "\xed\x62\xf4\x2b\x16\x99\x6e\xcd\x2e\x9a\x8f\x48\xb3\x5c\xad\xca"
+ "\x6c\xbe\x18\xfd\xf0\x01\x94\xd3\x84\xb1\x49\xa2\x27\xc6\x2e\x49"
+ "\x75\x95\x74\xe2\x7d\x0e\x9d\x6b\x10\xce\xf5\x2a\xf3\x92\x80\x77"
+ "\x43\xc3\x9f\x99\xde\x7f\x60\x50\x8e\xa6\x82\x7e\xd8\x54\x3a\x3c"
+ "\x8d\xbe\xb1\xf0\x28\xe9\x3a\x10\x4e\x39\xa5\x7c\x7f\x2a\xd9\xa0"
+ "\xe3\x65\x0b\x34\xd9\xd5\xfd\x82\x57\x23\x1b\x10\x24\xdf\x94\x71"
+ "\xdf\x97\x32\x4f\xcc\x4d\xf0\x9a\xc2\xee\x1f\xc9\x33\xb1\x47\x35"
+ "\x7b\x95\xef\x13\xbd\x34\xea\x19\x83\xda\x80\x5f\x23\x7e\xee\x67"
+ "\x48\xce\x59\xc9\xe6\xeb\x32\xe0\xe1\xdb\xfa\x7d\xec\x7f\xbf\x6d"
+ "\x09\xcb\xc1\xbe\x0f\xd8\xdd\xdf\x7c\xe5\x7a\xc2\xdf\xff\x9a\x4c"
+ "\x66\x88\x6f\x69\xa2\x95\x36\x97\x66\xb8\x54\xe9\xaf\x1e\x6b\x11"
+ "\x74\xde\xf7\xdf\xc4\x9e\x5f\x2e\x6c\xcb\xd6\x56\xb7\xa9\xc9\xd8"
+ "\x4b\xce\xb0\x28\x4f\x69\x17\x6b\x50\xbb\x0c\xae\x7e\x66\x6c\xc5"
+ "\x7e\x4a\xe9\x1b\x40\x3b\x58\x0b\x88\x86\xfa\xfe\xa7\xae\x0b\x5a"
+ "\x79\xf5\xbb\x7d\x65\x4f\x4a\xbf\xdc\x44\x6f\xd2\x1e\x04\xbc\x13"
+ "\x2b\x7c\xb5\x15\x8c\x46\xda\x7f\x8e\xc7\x7b\x0c\xa5\xbd\x78\xd3"
+ "\xcf\x6c\x17\x7f\xb3\xdb\xd7\xbf\xb9\x22\xb5\xff\xa6\x82\x8c\x81"
+ "\xf1\xd5\x6d\x03\x9b\xd7\x67\x04\x7f\xb3\x3b\x3b\x78\x53\xbe\x2f"
+ "\x34\xbe\xa2\x01\x75\x63\x7f\xda\x62\xd8\xab\x36\x18\xf6\x3a\xdd"
+ "\x06\x2a\xf7\x90\x73\x97\xe1\x35\x67\x9b\xe1\x35\xb5\xd1\x70\xc8"
+ "\xe9\xc2\xb3\x9e\xfc\x76\x81\xae\xfd\xe7\x25\xaf\x39\x9b\xb1\x3f"
+ "\xfe\x73\x3d\xe0\x55\xaf\xcb\x5b\xf9\xbd\x41\xd6\xba\x2b\xc8\xde"
+ "\xb4\x9f\x67\xbe\xf8\x92\x6e\xfc\x7c\xbe\x71\xb5\x99\xbe\x71\x3b"
+ "\xb2\x45\x9b\xc7\x6f\x12\x7d\xa4\x3b\x5f\xaf\xa9\xb2\xcd\x1a\x3c"
+ "\xa8\xcc\xb7\xb7\xd3\x59\xac\x6e\x77\x57\x59\xb8\xe6\x6b\x76\x77"
+ "\x0d\xd2\x67\xdc\xa0\xed\xdd\xff\x2f\xec\xee\x6a\x72\x09\xb2\xbb"
+ "\x0b\x5e\xb8\x4d\xe3\x85\xdd\x9a\x8d\xa5\x58\xe2\x7f\x85\x8d\x25"
+ "\x87\x5b\xd8\x49\x12\xe7\xff\x9b\xd6\x35\x10\x1d\xda\x57\xb5\xd0"
+ "\xad\xf3\xb9\x44\x5b\x85\x36\x94\x04\xf1\x0b\x20\x1e\xf8\xcf\x37"
+ "\x4f\x8f\xe7\x9b\xe7\x12\x1f\x11\x15\xe2\x79\xdf\xed\xa3\xfb\x4c"
+ "\x3c\xef\xee\xd0\xa6\x32\x77\x68\xd3\x8e\x34\xc4\xcd\xc1\xef\xae"
+ "\xd0\xa6\xb9\x7e\xfc\x02\xf8\x05\x43\x9b\xe6\x01\xf7\xce\x33\xe2"
+ "\x17\x83\x9f\x19\xbf\x44\xfc\x2c\xf8\x25\xe1\x67\xc5\x2f\x59\xdd"
+ "\x34\x8f\xec\x16\x2b\x7c\xf3\xbc\x54\xcc\x03\x8b\x5e\x6e\x18\xde"
+ "\x0f\xdc\x85\xfe\xa7\x11\xdd\xc7\xe3\x7a\x12\x39\xd9\x3e\x7b\xfe"
+ "\x67\x01\xd1\x7e\xc2\xcb\xcf\x3b\xdb\x7d\x53\x76\x7b\x7d\xe3\x36"
+ "\x79\xf1\x5c\xe0\x8b\xdf\x97\x87\x9f\x0d\x3f\x87\x6f\x53\xad\x0d"
+ "\x63\xba\x00\xdf\xc0\xcb\x3f\x00\xbc\xbc\x48\x93\xcf\x3d\x00\x3c"
+ "\xb7\xa8\x41\x7b\x3f\xe8\x55\x7e\x20\x6c\x12\x20\x9d\x1b\xe1\x16"
+ "\xaf\xf2\x90\x48\xd7\x3b\xbe\xb6\x5c\xbb\x0b\x55\x8e\xf8\x4e\xaf"
+ "\x31\x2b\x46\xa6\x5b\x4f\xf2\x3a\x2a\x33\xa0\xaf\xc3\x21\xfe\x39"
+ "\x1e\xb3\x65\x3d\xb9\xc4\x91\x55\x94\xbf\xf4\xb1\xdc\xa2\x3b\xad"
+ "\x53\x73\xac\x29\x4b\x0b\x9f\xca\x7a\x6a\x79\xee\xf2\x5c\x41\x42"
+ "\x22\xea\x9b\x43\xce\xa9\xc8\x0f\x33\x0b\x82\x1f\x8a\xeb\xe4\x9c"
+ "\xf6\xee\x85\x7e\x8c\xd1\x0d\xbb\x7d\x07\x7b\x7c\x86\x10\x68\xb8"
+ "\xd8\xce\x72\xac\xcd\xea\xb6\x83\x3d\x01\x43\x6c\xa7\x95\x71\xac"
+ "\x07\xfa\xe6\xe9\x6c\xd3\x68\xba\xf7\x59\x0b\xd1\x74\x48\xb3\xb7"
+ "\x20\x60\x78\x90\xf2\xff\x36\xdf\xb7\x0f\xef\x88\xcb\xa0\x7c\x1c"
+ "\x74\x9e\x78\x82\xce\x93\xe1\x8a\xd4\xd7\xc4\x73\x7d\xc6\x6b\x22"
+ "\x5d\x45\xc3\x21\x7a\x5e\x28\xe5\x2d\x28\x97\xe4\x75\xfc\xb7\x3f"
+ "\xb3\x89\x34\xbf\x2d\x90\x69\xb0\x16\x3b\x94\xf4\xb5\x94\x4e\xf0"
+ "\x56\x68\xe3\x3e\xb4\xa3\x6c\x39\x33\xea\xeb\x9b\x78\xa9\xc1\x35"
+ "\xbe\x82\x68\xde\x07\xbf\xa2\x35\x4e\xed\xe1\x58\xd3\x2f\x22\xef"
+ "\xde\x02\x9f\xc8\x0f\x1e\x33\x8a\x78\x4b\xc2\x23\x84\x3f\x3c\xa5"
+ "\x6d\x22\x7f\x83\xda\x66\x20\x7e\xac\x47\x49\xbf\x85\xbe\xd5\x81"
+ "\x4e\xad\x13\x7c\x49\x7a\xbe\xce\x0b\xac\x1b\x2f\xed\x2c\xc5\x66"
+ "\x33\xba\x0f\x3e\x19\xf5\xcc\x27\xf8\x11\xbc\xe8\x5c\x98\x57\x3d"
+ "\x68\xac\x4b\x60\x46\xf2\x61\x10\x1c\xb7\x7b\xb6\x3c\x1b\x48\xdf"
+ "\xa3\xd3\xd7\xfe\xc4\xdd\xb3\x23\xc7\x4d\x8e\x97\x35\xb7\x80\x4e"
+ "\x38\x72\xc4\x51\xe2\x92\xa2\xa2\xe5\x4f\xe6\x5a\x73\x97\x3c\x96"
+ "\x67\x15\x9f\xad\xcb\x8b\x90\x64\xa9\xbd\xc8\xba\x6c\x65\x81\xf5"
+ "\xc9\xa2\xa5\xc4\x29\xe4\x16\x16\x2e\xb7\xd9\xc7\x30\x99\xd3\xfa"
+ "\xe4\xf2\x7c\xfb\x52\x1b\x5e\x8a\x72\x0b\x72\xac\x62\xd4\x8b\x50"
+ "\x54\x7e\xbe\x55\xab\xa1\x28\x6f\x49\x21\x4d\x84\x82\x9f\x22\x51"
+ "\x44\xfe\xa1\x7c\x44\x2c\xd9\xb1\xa2\xbd\xa7\x47\xf9\xc1\xd8\x26"
+ "\x23\x60\x5d\xbb\x7b\x36\xe9\x32\x20\x1c\x2b\x78\xcb\xaa\x74\x71"
+ "\xee\xf3\x0c\xfa\xd8\x3b\xd5\xd9\xde\x57\x95\xb1\x56\xef\x1b\xd9"
+ "\x8d\x17\x76\x13\xc9\x26\xa7\x92\x71\x51\xdc\xd1\xc3\x7a\x10\xba"
+ "\x2e\x55\xe9\x1e\x09\x8b\x8c\xc6\x48\x9b\xdb\x52\xa7\x27\xe3\x3d"
+ "\x79\x66\xf2\x03\xba\x03\xc2\x34\x3b\xf7\x0a\xf2\x84\x28\x8f\xba"
+ "\x69\xc7\x02\xe4\xf3\x85\x79\x94\x8c\x66\x4a\x2f\xd2\x55\x65\x4c"
+ "\xe0\xe3\x6a\xb1\x37\x65\xec\xa1\x76\x8d\xb0\xcf\x58\x2f\xa0\xdc"
+ "\x77\xc1\x9d\x7c\x2b\x91\xa5\x5c\xd8\xe8\xec\xea\x4b\x78\x9a\xf5"
+ "\x57\xb2\xd1\xfd\xd8\xdb\x02\x06\x36\xf9\x22\xe6\x45\xf1\x2d\x2c"
+ "\x6a\xd5\x03\xcc\xd0\xf0\x44\x03\xd9\x7d\x65\x2d\x0b\xb6\x30\x0f"
+ "\x76\x41\x4f\x60\x0f\x6b\x71\x77\xb0\x23\xc1\xdd\xd2\x27\x43\x09"
+ "\xf1\x18\x0f\x3d\x45\xb6\xa8\xca\x56\xf1\xd0\xbe\x3f\xf9\x46\xed"
+ "\x3d\xdd\x40\xbe\x14\x26\x7b\x82\x9f\xb9\x3d\xa5\x3b\x99\xc7\xe1"
+ "\x71\xd3\x1d\x7d\xc0\xed\x91\xd7\xf0\xed\xaa\x16\xe4\x7b\x90\x8d"
+ "\x46\xf8\x07\x54\xc7\xda\xcd\xbc\xfd\x17\xe3\xf9\xf1\x5f\x6c\xe6"
+ "\x5e\xcc\x29\xf2\x8d\xd0\xb5\x7e\x3c\xef\x5e\xaf\xd9\x9b\xa3\x79"
+ "\x6a\x5b\xc1\x2c\xa7\x95\x1f\x74\x09\x59\xc8\x3c\x11\xbe\x0e\x61"
+ "\xb1\xff\x7b\x1c\x9b\x29\x3c\xe1\xb4\xf2\x50\x8c\x0c\x6f\xa7\xf0"
+ "\x44\x84\x2d\x32\xfc\x16\x85\x93\x10\x4e\x91\xe1\x56\x26\xef\xab"
+ "\x3f\x34\x5b\x86\x8f\x51\x18\xb0\x7f\x68\x81\x7b\x05\xb5\xf7\xaf"
+ "\x18\xb3\x87\x1e\x2e\xfb\x14\xbc\xaa\xe3\x94\x58\x0f\x87\x9c\x79"
+ "\x24\xab\xc1\x7a\xf8\xc1\x47\x57\x1f\x27\x3e\xf7\x21\x47\x74\x2a"
+ "\x3d\x7f\x50\x6a\x0a\xb0\xd1\xa0\x1b\xaf\xc6\xb7\xfb\x09\x76\xc3"
+ "\xd2\x31\x7b\xcb\x26\xa7\x07\xb9\x9b\x3f\x9f\xdf\xc5\x37\xd5\x64"
+ "\xf0\xe7\x0b\xe8\x2c\x1f\x7b\x5d\xa9\xb9\xa1\x24\x20\x6c\xef\x82"
+ "\x56\xc7\x1a\x7a\x48\xe8\xce\xf8\x40\xfb\x8e\x60\x8b\xd3\xcc\x37"
+ "\x95\x67\x80\xa7\x6c\x7f\x20\x25\x48\x7a\x89\xa0\xf7\x7f\x78\xff"
+ "\x9b\x79\x44\x3b\x6c\x3a\xac\xee\x2c\x48\x55\xcb\x32\x19\x4f\xce"
+ "\xef\x7a\x20\x8f\xbb\xb1\x8f\x29\x52\x86\xce\x3f\x43\xfd\x9f\x89"
+ "\x7a\xa7\xe6\x77\xa9\x2b\xf3\xc8\x9f\x94\xc0\x2f\x4e\xda\xd3\x57"
+ "\x00\x9f\x3c\x9d\x69\x0a\x6d\xda\xe4\x7e\x33\xef\xe4\x95\xf9\x66"
+ "\x53\x7e\xb8\x60\x44\xfd\x27\xb4\x29\xc4\x33\x59\x10\xf5\x04\xd1"
+ "\x57\xa2\x1f\xf6\xaa\xcd\x06\xd0\x31\x5d\x2f\x3e\xda\x3e\x8a\xaf"
+ "\xcc\x34\xa1\x4f\xb7\x78\x52\xce\xb3\xd6\x7e\x5a\x2b\x8b\x62\xde"
+ "\x74\x30\x36\xdf\x11\x74\x9b\x7c\x42\x47\xce\x6c\x7b\x82\x5d\xcf"
+ "\xc7\x95\x67\x9c\x56\x16\x65\x3e\x58\x8a\x3e\xa0\xef\xaf\x75\xb4"
+ "\x1b\x55\xf4\x63\xa6\x84\x1b\xe5\x9b\x03\xd8\xb6\xeb\x3c\xce\x95"
+ "\xb5\x7f\x91\x98\x37\x6a\x51\x26\xa3\xbb\x83\xfb\x40\xb3\xa8\x03"
+ "\x99\x26\x15\xfb\x11\x7d\x7b\x33\xe5\x0c\xa3\x3a\x25\xac\x17\x49"
+ "\x3f\xaf\xc9\x80\x33\xea\x27\x5b\xc5\x3a\x5c\x91\x76\x4e\x68\x20"
+ "\x6f\xf8\xf1\xdf\xbc\xc9\x85\xf6\xb5\xf1\x4d\x73\x87\xb7\x35\xbd"
+ "\x79\xee\x21\x6d\x7e\xc4\xe0\x67\xe1\xbf\xde\x9d\x81\x39\x90\x22"
+ "\xfc\x7d\x6e\x5e\xe7\xd6\xe5\x45\x58\x6f\x98\x23\x8b\x3e\x6a\x70"
+ "\x76\x0d\x6f\xab\xd5\xf5\x81\xf4\xb3\x36\xea\x33\x6e\x0a\x91\xff"
+ "\xe0\xf3\x64\xf7\xba\xeb\xcd\x14\xff\x15\x8e\xe9\xc3\x5f\xf3\x79"
+ "\x14\xe9\x3b\x76\xfe\x37\xf9\xc0\x15\x96\x97\x3f\xe2\x1c\xd9\xf9"
+ "\xff\xd8\xfb\xfa\xb8\xa8\xca\xbc\xfd\x9b\x01\x0d\x0b\x75\x34\x70"
+ "\xd1\x35\xc3\xd2\x76\x34\x4d\xdc\xa7\x5c\x2d\x7d\x16\xdf\x4a\xcd"
+ "\x17\x6c\x65\xa3\x44\x43\xc3\x16\x0c\x0c\x0d\x15\x11\x06\xa4\xec"
+ "\xa7\x86\x80\x0a\x2e\x1a\x0a\xf6\x68\x8b\x26\xbe\xf4\xd4\xb3\xda"
+ "\xaa\x8d\x9b\xee\xfa\xc2\x9b\x3d\x58\x68\xa8\x23\xa1\x91\xa1\x8d"
+ "\x38\xca\x80\x33\x73\x7e\xdf\xef\xb9\xcf\x70\xce\x99\x39\x67\x98"
+ "\x33\x82\x62\x8f\x7f\xf0\xd1\x39\xe7\xcc\x3d\xf7\xb9\xbf\xd7\xb9"
+ "\xee\xeb\xfa\x9e\xfb\x05\xda\xc5\x77\xb4\xbe\x91\x19\xe3\x41\x7d"
+ "\xc8\xab\x5d\xb0\xad\xcc\xd0\x8f\x24\x9c\x26\x2a\x13\xf4\x97\x3b"
+ "\xfe\xbc\x42\x35\x00\xfa\x19\x0b\x68\x81\xe3\x65\x47\xc8\x94\x89"
+ "\x24\xb9\x38\xb2\x8e\xd8\xf6\x4f\x83\x7e\x2d\x78\xfb\x9f\x0d\x2a"
+ "\x7c\x8f\x85\xfb\xa5\xb1\x9e\x7d\xfd\xba\xcc\x4f\xbf\x35\xa1\x8f"
+ "\x4d\x29\xfc\xd6\xa0\x32\xdf\x08\x0d\x60\xd7\xdd\x06\x2f\x91\x1c"
+ "\xc9\x58\x9b\xde\x6d\xe1\xde\x0c\x99\xef\x46\xe2\x7e\xd4\x27\x83"
+ "\xcb\xd8\xf9\xdc\x27\x43\x8f\x90\x93\x95\x39\xa4\xa8\xfa\x1c\xce"
+ "\x41\xdc\x72\x32\x34\x13\x35\x65\x27\x33\xe8\xc6\x8f\x40\x37\xc2"
+ "\xf3\xda\xc1\xaa\x3e\x5d\x63\x7b\xbf\x85\xef\xba\x6c\x9a\xd1\x0c"
+ "\xcf\x68\x2e\xb7\x87\x9a\xf9\x83\x10\x92\xcb\xbd\xeb\xc2\xbd\xd5"
+ "\x36\x2e\x22\x7d\x36\xaa\xac\xa1\x52\xef\xb6\x3a\xcd\x67\xd7\x7b"
+ "\xf1\xb7\x76\x39\x5d\x63\xdb\x63\x6d\xf2\xfc\x00\xf2\x0f\xb8\xf7"
+ "\xa3\x1a\xa5\xcf\xe4\x9f\xd9\xb1\x83\x66\xc0\x9d\x19\x30\x67\x86"
+ "\xf6\x84\x18\x14\x41\xdc\x24\xfd\x98\x2d\x06\xb7\x93\x6d\x31\x08"
+ "\xdd\xc2\xc6\x00\x7c\xdc\xd2\xd7\xb8\x18\x9c\x85\x18\x54\x43\x0c"
+ "\x52\x49\xca\x89\x69\x45\x64\x4a\x30\xc4\xa0\xb6\x0e\xd7\x6c\xa7"
+ "\x7b\xd8\xc5\xd1\xb6\x67\x63\x71\xd6\xa0\x2a\x31\xd2\x18\xec\x7c"
+ "\x9d\xc6\x60\xd7\xeb\x06\xd0\x31\xd1\x41\xdb\xe1\xb3\x65\x71\x68"
+ "\x00\xee\xc7\xc3\xa4\x86\xe3\x7e\xdb\x34\x16\xb7\x21\x16\xb7\x69"
+ "\x2c\xb4\xf3\x21\x16\xe5\x15\xec\xba\x2f\x27\x2b\x8b\x48\x51\x78"
+ "\x3e\x29\x06\x5e\x82\x58\xcc\xc2\xb8\x60\x8e\xc1\xb2\x54\xd3\x75"
+ "\x43\x02\xf1\xcd\x4d\x20\xfe\xb6\x78\x58\x6f\x43\x3c\x12\x20\x1e"
+ "\x8d\x10\x0f\x53\x53\x3c\x7c\xd9\x78\x5c\xe5\xe2\xd1\x88\xe3\xe6"
+ "\x20\x1e\x8d\x10\x8f\x46\x88\x47\x2a\x8d\x07\xf2\xfc\x64\x63\x67"
+ "\xc6\xfa\xb3\x86\x6c\xbe\x22\x11\x8f\xa5\x5c\x3c\xce\xba\x13\x8f"
+ "\xd0\x68\xc7\x78\xbc\x1a\xdc\x5c\x3c\xf8\x67\xe2\xf5\xb1\x18\x8f"
+ "\xdb\xf9\xdc\x33\xf1\x14\x3e\x13\x29\xaa\xa7\xa1\x2f\xc2\x36\x3d"
+ "\x5e\x76\x80\x7d\x26\xe0\x5e\x53\xb6\xff\xd9\xa4\x2a\xaa\x86\xb8"
+ "\x44\x30\x34\x4f\xc0\xc5\x85\xc6\x23\x3d\xb8\xe0\x5b\xda\xfe\x01"
+ "\x13\xb0\xcf\xc0\x67\x03\xe3\x03\x71\x82\xe7\x47\x6a\xff\x41\xe1"
+ "\x3b\x60\x28\xd3\x8a\xcf\x09\x3e\x23\xf8\x3c\x14\x47\x9e\x63\xf7"
+ "\x73\x3f\x19\x7c\x8c\xe0\xbb\xe0\x93\xa1\x07\x20\x56\x39\xc4\xb2"
+ "\x18\x62\xb3\x08\x9e\x13\x0f\xd2\x1b\xf7\x21\x3c\x19\xba\x02\xf5"
+ "\x82\x1a\x30\xdf\xc1\x02\x71\xb2\xd4\xfb\x3f\x9c\x06\x3e\x2b\x6f"
+ "\x11\xff\xdc\x6c\xe6\xf6\x5c\x66\xda\x87\xe0\x9c\x7c\x2f\x33\xc4"
+ "\x08\x9e\x1d\xd1\x33\xd3\xb4\x17\xf3\x0f\x1a\xb2\xa9\x8a\x78\x77"
+ "\x8c\xa2\x31\xb2\x08\x9e\x99\x49\x51\xf8\xcc\xa4\x40\x8c\x4e\x2b"
+ "\x8c\xd1\xeb\xec\x38\x28\xf0\x9f\x99\x8c\xdf\x68\x3d\xf4\x93\x10"
+ "\xa3\x50\xbd\x5c\x8c\x2c\x5b\xa3\xbd\x2d\xea\x04\x7c\x87\xfd\xb8"
+ "\xf5\x9d\x69\x1e\x56\xf0\x50\x8d\xe0\x5d\x4f\x1a\xcc\x24\x71\x06"
+ "\x51\x25\x9c\x23\xed\x4b\xa7\x7d\x43\x4a\xf5\xfb\x08\xae\xc3\x8c"
+ "\xb9\x6f\xdc\x8f\xa1\xd4\xbc\x0f\xf8\x2a\x4f\x87\x9f\x37\xb1\x9f"
+ "\x0d\x64\xe9\x0c\xe2\xc9\xee\x4f\x1a\x9a\x4f\xd2\x00\x9f\x85\xaf"
+ "\xe7\xab\xac\x59\x29\x05\x8c\x1a\xf7\x91\x21\x3a\x9c\x13\x95\xbc"
+ "\x84\xf8\x14\x47\x16\xe1\x5a\x74\x17\x70\x6d\xe1\x12\x23\x94\x69"
+ "\x60\x1a\x2d\xd0\x67\x6c\x4e\x65\xf6\xe1\xda\xfa\x83\xb0\x8f\x60"
+ "\xd7\xc9\x98\xde\x1b\xb5\x08\xe6\x00\x75\xda\x8d\xa0\xbd\xa6\xb3"
+ "\xe3\x09\xe1\x98\x47\xf1\x5c\x1c\xbb\x31\x33\x1b\xeb\x45\xf3\xf1"
+ "\xf4\xdf\x41\xb8\x8f\x63\xb7\x7c\xcf\x83\x5a\x83\x57\x26\x78\x62"
+ "\xd0\x68\x58\xce\x7c\x86\xfa\x43\x4d\x69\xb9\x89\xcd\xc5\x1a\x92"
+ "\x23\xdb\x67\x26\xe0\x3a\xbe\xb8\x4e\x3f\xf6\xd9\x33\xc7\xe2\x1e"
+ "\xcb\x80\x59\x0d\xd3\x2d\x4d\xb7\x67\xb6\x41\xc5\xf7\xcb\xd3\x73"
+ "\x01\xb7\x9a\xb1\x1a\x26\x19\xf7\x33\x38\x04\xf7\x85\x3e\x68\x47"
+ "\x95\x89\xe5\x94\x4f\x67\xaf\x50\x61\xae\xc8\x04\xfc\x50\xf4\xed"
+ "\x67\xec\x9e\xb1\x97\x3d\xc2\x0a\x4f\x84\x9a\x09\xfe\x7e\x48\x3f"
+ "\x7c\xdf\x32\x5d\xdf\xa0\xba\x10\xd0\xd0\x3e\x24\x2c\xb9\x9a\xdf"
+ "\x2f\x53\xb8\x2f\x26\xf2\x4c\xe1\x6c\x28\x13\x79\xa6\x2a\x45\x45"
+ "\xb9\x25\x08\xf3\x95\xde\xf6\xdc\x52\x5c\x7b\x95\x68\x01\xc7\xc5"
+ "\x91\xf9\xec\x9e\x13\x9d\x80\xdf\xad\x4b\x81\x4f\x6e\x6b\xba\x6e"
+ "\x02\x3e\x41\x1e\xd8\x0c\xfc\x61\x5d\xea\xff\x70\x7a\x23\x19\x60"
+ "\xe3\x11\xd4\x5e\xf8\xef\x0c\xc0\x68\xe7\x63\x70\x0c\xe2\x64\x05"
+ "\x5e\x07\x3e\xd1\x7c\x94\x40\xfa\x7c\x04\x18\xdd\x84\x3c\x02\xba"
+ "\x78\x72\x2c\xf0\xc8\x62\xe0\x91\x45\xec\xbe\xc5\xfe\x9b\x55\x94"
+ "\x3f\xbe\xac\x5a\xa1\xca\xb4\xed\x5b\xce\xb6\xef\x8c\x91\x25\x88"
+ "\x8f\xf0\x14\x76\xce\x9b\x05\xfb\xa7\xa5\xa1\x9e\x25\x46\xc0\xc8"
+ "\xfa\xbc\x3d\x78\x8c\x7d\x6e\x17\x47\x3e\x6c\xa5\x58\x0b\xc2\x36"
+ "\xc9\xbb\x46\x02\xd9\xbd\x3d\x7f\xf1\x7f\x38\x63\x1e\x19\xb0\xf9"
+ "\x1a\xe9\xb3\x79\x1e\xd1\xc0\xf3\xaa\xda\x0c\x75\x98\x39\x5f\x4d"
+ "\xd8\xbd\x1d\xda\x87\x44\xc0\x71\xc9\xbd\x1d\x40\x57\xfb\x6f\xc6"
+ "\x67\xe6\x1d\x4d\x53\x9d\xcc\x99\x7b\x53\x2c\xd0\x76\x74\x2d\xa6"
+ "\x19\x74\xfd\x3d\xf5\x9b\xa1\x54\xe7\xcf\xe0\xd6\x19\x8e\x0c\x03"
+ "\xaf\xf2\xd0\x15\x8f\x19\xcb\x98\xb5\xb1\xc1\xb1\x09\xb8\xa6\x31"
+ "\x77\x0e\xb4\xa7\x15\x62\xf5\x4c\x0a\x49\xb1\x76\xa9\x04\x9e\x00"
+ "\xed\x84\x6b\x2f\x2b\x7a\x0e\x67\xe4\x60\x59\x96\xcc\xbd\xef\xe3"
+ "\xfd\x5a\xd7\xee\x4d\xcb\xbb\x42\x02\x99\xb7\x21\x1e\x73\xe1\x5e"
+ "\xaf\x90\x3e\xb9\x57\xe0\x5e\x17\xd3\x7b\xb5\xed\xd3\x6e\x4d\xbd"
+ "\xa0\x81\x73\x4e\xf7\x45\x32\xbc\x8d\xfb\x22\x85\x6b\x80\xc3\x1e"
+ "\x65\x9e\x20\xa4\xb8\x96\x5d\x07\xa3\xbe\xd4\x7c\x8e\xe0\xef\x62"
+ "\xfe\xa8\xb4\x8e\xc5\xf4\x42\xc4\xb2\x35\x7f\x47\xf0\x1b\x95\x80"
+ "\xed\xfa\x48\xcc\xa5\x05\x1f\xaa\x32\xe0\xba\x13\xac\xe6\xd3\x7b"
+ "\x4c\xdf\x8a\x3a\xed\x2b\x38\x86\xd8\x17\x60\x7e\x2b\x62\x1e\xcf"
+ "\xb3\xb8\x87\xef\x95\x56\x5e\x22\x58\x9e\xb0\x1c\x8c\xbf\xad\xac"
+ "\xcb\x1e\x6f\xbc\x86\x65\x21\x16\x30\xcf\x83\xcf\x1a\x8d\xfd\x3e"
+ "\x1c\x6f\xee\xcf\x74\x4b\x0d\xa4\x9f\x0d\xb8\x9e\x89\x1a\x31\xc0"
+ "\x62\x05\xf8\x1b\xd7\x49\x65\x98\x50\x4f\xc0\x19\xd6\xf3\x61\x88"
+ "\x77\xa0\x0d\x17\x70\xcc\xd7\x1e\x1b\x9d\x96\xa9\xd1\xd3\xf8\xe2"
+ "\xff\x5d\xc5\x87\xb2\xf8\xbd\x11\x2a\x3b\x96\xae\x4f\x34\xc6\xe2"
+ "\x71\xe4\x4d\xcb\x0d\x01\x67\xd6\x52\xce\x44\x4e\xb2\xf1\x26\xcb"
+ "\x4d\xec\xda\xfc\xfb\x70\xdc\x6d\x24\x5b\x47\x85\xbc\x59\x5c\xcb"
+ "\xf3\xe6\xe4\x58\x01\x6f\xd6\x32\x8d\xa0\xdf\x25\x78\x33\xfc\x35"
+ "\x31\x6f\x86\xcf\x10\xf3\xe6\x9b\x87\xed\x79\xd3\x91\x33\xc3\x37"
+ "\x49\xf1\x25\xf8\x98\xc7\xaf\x78\xbc\x19\x2b\xcf\x95\xe1\xc7\x94"
+ "\x73\xe5\xac\x33\x62\xae\x9c\xe5\xf3\xeb\xe5\xca\xd9\x31\x22\xae"
+ "\x54\xbb\xc8\x95\x57\x58\xae\xf4\x65\x7e\x86\x67\x82\xe3\x8f\xcd"
+ "\x73\x65\xb8\x72\x6e\x33\xcf\xc2\xdb\x72\x5c\x39\xfb\xa8\x98\x2b"
+ "\x67\x9b\xc4\x5c\x39\xbb\x90\xe7\x4a\xee\x5c\x8b\x70\xe5\xec\x23"
+ "\xf7\x86\x2b\x67\xb3\xeb\x9c\x97\x5e\x43\xae\x7c\x73\x4b\xf3\x5c"
+ "\x19\x5e\x26\xcd\x95\x70\x9c\xe5\xca\xf0\x32\x9e\x2b\xcf\x35\xc3"
+ "\x95\x11\xcb\x15\x70\xa5\x2f\xcb\x95\x6a\x19\xae\x9c\x0b\x6d\xc5"
+ "\xe1\x82\xc5\x9e\x1d\x36\x38\xae\xf4\x6f\xe2\x4a\x17\xf0\xa1\x2c"
+ "\x7e\x11\xef\x3b\xe3\x4a\x6b\x26\xd5\x97\xc8\x95\x4c\x37\x8e\x2b"
+ "\xa3\xcd\x24\xe1\x0c\x70\x64\xf9\x15\x76\x0f\x0f\x76\x8c\x30\xfc"
+ "\x25\xbe\x86\x5c\xb4\xba\x6c\x17\xb4\x57\xa9\x7e\x0f\xcb\x4d\xec"
+ "\x3c\xaf\x89\xc8\x55\x7b\xe0\xda\x9c\x26\xdd\xc9\x72\xe7\x19\x8e"
+ "\x3b\xc3\x38\xee\x9c\x79\x07\xdc\xf9\x3a\xc6\x72\x4e\x76\x83\xca"
+ "\xc6\x9d\x6b\x81\x3b\xe7\xb0\xfa\x01\xdf\xed\x52\xee\x8c\xea\x62"
+ "\xab\x17\xe6\x34\x4b\xe3\x36\x12\x5a\xaf\x3a\x47\x1e\x9d\xc0\x96"
+ "\xf7\x93\x6e\x6e\x2d\x69\xe2\xd2\x30\x9e\x4b\x2f\x7b\x44\x1e\x96"
+ "\xe7\xd1\xb7\xd4\x4d\x3c\x9a\x0a\x3c\x7a\x5e\xc0\xa3\xe0\x9b\x3e"
+ "\x45\xce\x03\x1e\xad\x67\x79\xf4\x4b\x8e\x47\xff\xd2\xfb\x44\x18"
+ "\xf0\xe8\x04\x1b\x8f\xbe\x35\xcd\x94\x7a\x21\xc0\xf4\x41\xf3\x3c"
+ "\x5a\xcf\xf2\x68\x6c\xeb\xf3\xe8\x11\x3b\x1e\x05\xef\x8a\x7b\xb5"
+ "\x4b\xf2\xa8\x0d\x8f\x2c\x8f\xa6\xf0\x3c\xca\xb6\xeb\x5f\x0e\x96"
+ "\x84\x43\xbb\x87\xc7\xb2\xde\xad\x89\x47\x63\xf7\x50\x1e\x85\x63"
+ "\x6c\xfe\xe4\x5d\xe0\x51\xc0\x5f\x72\x31\xdc\x37\x3c\x2f\x50\x47"
+ "\x35\xf2\x6b\x1e\x3c\x33\xd8\x46\x4d\x7c\x3a\x17\x9e\x19\xe4\x98"
+ "\x1b\xf0\xcc\x00\x8f\xce\xbc\xa9\x26\xec\xf3\xf2\x01\x3c\x2f\x57"
+ "\x64\xf6\x15\xb3\x8d\xe3\x95\xe5\xd3\x48\x3f\x31\x9f\x46\x8e\x13"
+ "\xf3\xe9\x5f\x2c\x3c\x9f\x72\xe7\x90\x4f\x21\x66\xd6\x35\x95\xde"
+ "\xc8\xa9\xee\xf1\x69\xa4\x6f\x13\x9f\xaa\x38\x3e\x9d\xdb\x3c\x9f"
+ "\xb2\xef\x06\x65\xf8\x54\xc8\x0d\xf2\x7c\x1a\xe9\xcb\xf3\x69\xe4"
+ "\xf5\x26\x3e\xad\x90\xe3\xd3\xb7\xfc\xa5\xf9\x14\x8e\xb3\x7c\xfa"
+ "\x96\x7f\x13\x9f\x56\x48\xf0\xe9\x04\x21\x9f\x46\x5d\xa4\x7c\xba"
+ "\x87\xae\xbb\x01\x9c\x5a\x62\x04\x7c\xe0\x33\x17\x97\xc3\x72\xaa"
+ "\x15\x38\x15\xf7\x5a\xc5\xbd\x66\x70\x6c\xbe\x14\xa7\x52\xce\xd5"
+ "\x13\xe4\x55\x7c\x36\x93\x27\x81\xdf\x85\xbe\x08\xda\x84\xed\x7b"
+ "\x6d\xed\x97\x27\xe0\xd7\x37\x96\xa8\x51\xdb\x89\xb0\x62\xb5\x61"
+ "\xe5\x86\x06\xc7\x16\x8b\xb0\xa2\x2c\x96\x51\x7a\x39\x6e\x95\xf3"
+ "\xee\x27\xd0\xbb\x87\x10\xd5\xd2\x10\xe0\xd7\x50\xf4\xee\x05\x76"
+ "\xde\xbd\xc0\xd1\xbb\x9f\x76\xce\xa3\x8a\xbc\xfb\x9f\x31\x86\x73"
+ "\xcf\x89\x79\x74\xee\x45\x31\x8f\xce\x9b\x81\xf5\xa2\x3c\x5e\x20"
+ "\xed\xdd\xd9\xe7\xfc\xed\x81\x4d\xde\xbd\x42\xcc\x9f\xbc\x77\x9f"
+ "\xd7\x51\x9e\x47\xdf\x0e\x15\xe9\xd1\x99\x1c\x8f\xce\xe6\x78\x74"
+ "\x36\xcf\xa3\x27\xbf\xb1\xe9\xd1\xe8\x85\xc7\x2b\x84\x3c\xfa\x76"
+ "\x6e\x13\x8f\x56\x3a\xf2\xa8\x8d\x43\x91\x4f\xb1\x1c\xcc\x65\xed"
+ "\x04\x9e\xde\x3d\x3b\x56\x45\x73\xb5\xe1\xd8\x76\xde\xf6\xb9\xda"
+ "\xe2\xda\x9b\x44\x1b\x86\x7c\x9a\xc3\xf2\x69\x67\x0f\x32\x0b\xb8"
+ "\xaf\x13\xce\x45\xc8\xc5\xf7\xfa\x8b\xe8\x5e\x4d\x98\x5f\xb2\x2e"
+ "\xa6\xfb\x1e\xda\xf2\x4c\x70\xbf\xec\xfb\xfc\x19\xe7\x38\x4e\xc5"
+ "\xfd\xcc\x01\x73\x1f\xdd\x02\x4e\x5d\x24\xa1\x4d\x97\x02\xa7\x26"
+ "\x08\xb4\x29\x3c\xfb\x5f\xce\xb6\xe7\xd4\x98\x0e\x25\x88\x15\xe4"
+ "\x54\x91\x8f\x2f\x68\x03\x3e\x3e\x66\x96\x98\x4b\x63\xb2\xc4\x5c"
+ "\x1a\x33\x9e\xe7\x52\xee\x5c\x8b\x68\xd3\x98\xf0\x7b\xa3\x4d\x63"
+ "\xc2\x79\x1f\x3f\x6f\x44\x13\x97\x96\xcb\x71\xe9\xdb\xe1\xd2\x5c"
+ "\x0a\xc7\x59\x2e\x7d\x3b\xbc\x89\x4b\xcb\x25\x7c\xbc\x88\x4b\xdf"
+ "\xe9\x4d\xb9\xb4\x80\x6a\xd3\x0a\x9b\x36\x2d\xb8\x0f\x7d\xfc\x3b"
+ "\x01\x4a\x7d\xfc\x89\x5a\xca\x9f\xc8\x4f\x36\x0e\xe5\x7d\x7c\x81"
+ "\xbc\x8f\x6f\x86\x43\x15\x69\x51\x96\x43\x63\x7b\x8b\x39\x34\xb6"
+ "\xaf\x98\x43\xdf\xcd\xb6\xe7\x50\x47\xfe\x8c\x9d\x23\xc5\x9d\xd4"
+ "\xc7\xbf\x3b\x46\x9e\x37\x63\x33\x95\xf3\xe6\xfc\x42\x31\x6f\xc6"
+ "\x96\xff\xdf\xe0\xcd\x05\x23\x45\xbc\xa9\x76\x91\x37\xef\x8a\xa7"
+ "\x5f\x60\x97\xff\x5c\x60\x97\xff\x5c\x20\xc8\x7f\x2e\x68\xc1\xfc"
+ "\xe7\x82\x7b\x94\xff\x5c\x90\xc3\x6b\xd0\x77\x17\x36\xcf\x9b\xb1"
+ "\x39\xd2\xbc\x09\xc7\x59\xde\x8c\xcd\xe1\x79\xb3\x39\x0d\x1a\xf7"
+ "\x9a\x02\xde\x6c\xe3\x9e\x3e\xce\x69\xfe\x53\xca\xd3\x23\x6f\xb2"
+ "\x7c\x59\x61\xe7\xe9\x43\x84\x9e\xbe\x80\xf7\xf4\xe3\x28\x6f\x95"
+ "\x9a\x33\xc5\x9e\xbe\xc5\x79\x74\x61\x94\xa9\x29\x1f\xba\x0a\x78"
+ "\x74\x21\xbb\x16\x8c\xa9\x29\x1f\x1a\x7f\xdd\x56\x2f\xea\xe9\xd7"
+ "\x12\x5a\x2f\x09\x4f\xcf\x8e\x1f\x5e\x78\xb0\xc9\xd3\x57\xd8\x7b"
+ "\xfa\xf8\x2d\xf2\x9c\xba\xb0\x5a\xd2\xd3\xa3\xff\x66\x39\x35\x96"
+ "\xe5\xd4\x5b\xeb\x85\x9c\xba\xd8\x83\xe5\xd4\x17\x6d\x9c\xba\x48"
+ "\x63\x82\x67\xd3\xd4\xbe\x79\x4e\xc5\x72\x78\x4e\x8d\xbc\x3b\x9c"
+ "\xaa\x73\x9d\x53\x85\xf3\x60\xbf\x84\x7b\x6f\xe2\x54\xb6\x8d\x17"
+ "\x6f\x2a\x09\x47\x4e\x8d\xb4\xf3\xf7\x05\xd2\xfe\xfe\x38\x51\x61"
+ "\xfb\xd8\xfc\x3d\xc6\x80\xe5\x9b\x56\xf5\xf7\x8b\x6f\x8a\xb9\x35"
+ "\x5e\x23\xe6\xd6\xc5\xe7\x78\x6e\xe5\xce\xb5\x88\xbf\x5f\x6c\xbc"
+ "\x37\xfe\x7e\xb1\x91\xe7\xd6\xf8\x53\xcd\x73\xeb\xc2\x5a\x69\x6e"
+ "\x85\xe3\x2c\xb7\x2e\xac\x75\xca\xad\x2f\x0a\xb9\x75\xc9\x61\x1b"
+ "\xb7\xf2\xfe\x1e\xf0\x81\xcf\x5f\x5c\xa6\xfb\xfe\x7e\xfc\xbd\xf6"
+ "\xf7\x4b\x74\x8a\xfc\xfd\x7a\xe0\x59\xf0\xe2\x4b\x4f\x81\xbf\x9f"
+ "\xca\xf9\xfb\xca\x7c\x3b\x7f\x9f\xef\xe0\xef\x13\xa7\x72\x9c\x0a"
+ "\xcf\x14\xcb\xa9\xb3\x0b\xdc\xf7\xf7\xaf\x60\x0c\x13\x0e\x8a\x39"
+ "\x35\xe1\xb0\x98\x53\xb5\x53\xb1\x5e\x94\xd3\xf3\xa5\xfd\x3d\xfb"
+ "\x9c\x2f\xed\x28\xf2\xf7\x50\x3f\x47\x7f\xaf\xf5\x10\x71\xea\x4c"
+ "\x21\xa7\x2e\x1d\x2a\xd2\xa9\x70\x5f\xc8\xa9\xdb\xcf\x53\x4e\xdd"
+ "\x71\x5e\xc0\xa9\x93\x77\x70\x9c\x9a\x18\x75\x7c\x9a\x90\x53\x97"
+ "\x26\xda\x38\x95\xe5\xcb\x99\x26\x55\x72\xa8\xe3\xb8\x13\x76\xbc"
+ "\x0f\x8e\x05\x82\xb2\x71\xbe\x18\x96\x59\x78\x3e\xb2\xf9\xf1\x26"
+ "\xa1\xd2\xe3\x4d\x4a\xe3\xf4\xa4\xa8\x3a\x93\x1d\x67\x92\x8b\xe3"
+ "\x4c\x96\x91\xde\xb9\x8d\x74\xfd\x01\x76\xed\x44\x99\xb5\x07\x66"
+ "\xbc\xc6\xf3\x2c\x8e\xc9\xfa\x08\xc7\x64\xdd\xa2\x63\x80\x20\xde"
+ "\x8e\xeb\x0d\xd8\x74\x13\xf0\xc1\xfe\xf3\xf6\x3c\x9b\x68\x29\x41"
+ "\xfc\x84\x45\xda\x79\xfe\xfc\x36\xe0\xf9\x93\x42\xc4\xfc\x9a\xb4"
+ "\x42\xcc\xaf\x49\x23\x78\x7e\xe5\xce\xb5\x88\x76\x4d\x9a\x76\x6f"
+ "\xb4\x6b\xd2\x34\xde\xf3\x6b\x07\x37\xf1\x6b\x99\x80\x5f\xcf\x0b"
+ "\xf9\x75\x69\x10\xcb\xaf\xe7\xed\xf9\x15\x8e\xb3\xfc\xba\x34\xa8"
+ "\x89\x5f\xcb\xec\x3c\xff\x79\x7b\x7e\x4d\xf6\x63\xf9\xb5\x32\xdf"
+ "\x4e\xbb\xe6\x37\xef\xf9\x2b\xdb\x9a\xe7\x4f\xf6\x55\xe4\xf9\x91"
+ "\x53\xa3\x29\xa7\x22\x67\xd9\x78\x95\xf7\xfc\xf9\xb2\x9e\xbf\x39"
+ "\x5e\x55\xa4\x55\x59\x5e\x4d\xf1\x13\xf3\x6a\x4a\x77\x31\xaf\xbe"
+ "\xb7\xc9\x9e\x57\x1d\x39\x35\xe5\x35\x29\x3e\xa5\x9e\xff\xbd\x89"
+ "\xf2\x5c\x9a\xf2\xbe\x72\x2e\x5d\xf6\x85\x98\x4b\x53\x8e\xfd\xdf"
+ "\xe5\xd2\xd4\xf1\x22\x2e\x55\xbb\xc8\xa5\x77\x25\x0f\x90\xba\x45"
+ "\xcc\xa5\xa9\xe5\x62\x2e\x4d\x5d\xc9\x73\x29\x77\xae\x45\xb8\x34"
+ "\x35\xff\xde\x70\x69\x6a\x3e\xaf\x55\xdf\x4b\x6a\x9e\x4b\x53\xd2"
+ "\xa4\xb9\x14\x8e\xb3\x5c\x9a\x92\xc6\x73\xe9\xb9\x66\xb8\xf4\xfd"
+ "\x59\x0a\xb8\x54\x9c\x07\xb0\xe7\xd2\x7b\x9e\x07\x78\x3f\x5c\x51"
+ "\x1e\xc0\xc6\xa5\x53\x1d\xf3\x00\xc8\xaf\x6c\x1e\x00\xda\xcb\xc6"
+ "\x61\x6c\x1e\x60\x0c\xe5\xb2\x52\xf3\x0a\x51\x1e\xa0\xe5\xb9\x75"
+ "\xf9\x7c\x53\x53\x3e\x35\x15\xb8\x75\x39\xbb\x46\xaa\xa9\x29\x9f"
+ "\xba\xb2\xa3\xad\x5e\x34\x0f\xb0\x8a\xd0\x7a\x49\xe4\x01\x46\xb1"
+ "\xe5\x1d\x15\xe5\x01\x04\x5c\x7b\xd9\x63\xc5\x41\x79\x9e\x5d\x5e"
+ "\x2b\xca\x03\x54\xf1\x3c\x7b\x0b\xc7\xa8\x03\x0f\xb2\x3c\xdb\x4d"
+ "\xc8\xb3\xff\xef\x31\x96\x67\x47\xd9\x78\xf6\x83\xc0\x7a\x78\x36"
+ "\xeb\x95\xf2\x2c\xce\x23\x38\x1f\x7e\x6f\x78\x76\x9f\x02\x9e\x15"
+ "\xe4\x06\xf6\x43\x7b\x34\xf1\x2c\xdb\xee\xff\x6f\x7f\x49\x18\xf2"
+ "\x6c\xb8\x5d\x6e\x20\x5f\x3a\x37\x70\xf4\x5e\xe4\x06\x56\x74\x11"
+ "\xf3\xed\x8a\x31\x62\xbe\xfd\x7f\x0d\x3c\xdf\x72\xe7\x5a\x24\x37"
+ "\xb0\x42\x7d\x6f\x72\x03\x2b\xd4\x3c\xdf\xae\xb8\xda\x3c\xdf\x2e"
+ "\x37\x4a\xf3\x2d\x1c\x67\xf9\x76\xb9\xd1\x29\xdf\x8e\x12\xf2\xed"
+ "\xca\x73\x36\xbe\xe5\x73\x03\xf9\x5c\x6e\x60\x45\xf3\xb9\x81\x4a"
+ "\x99\xdc\xc0\xd8\x7b\x9d\x1b\x58\x59\xa9\x24\x37\xd0\xb0\x9e\x8e"
+ "\xdb\x5f\x8a\xe3\xf6\x67\x00\xff\x06\x7f\x03\x6d\xd0\xfc\xb8\xfd"
+ "\x44\xdb\xf8\xd3\xf0\x1c\x8e\x67\x73\x24\x73\x03\x27\x6a\xe4\x73"
+ "\x03\x27\xca\x85\xe3\x4f\x57\x9d\x11\xbf\xb7\x5a\x75\xce\xf6\xde"
+ "\xea\xc4\xb7\xc8\xb3\xe9\xec\x9a\xdd\xd6\xac\x6c\x42\xd7\xf0\x4e"
+ "\xaf\xc6\x7a\x4a\x8d\xe3\xff\xd2\x2a\x7c\x97\xf5\xe1\xb0\xa6\x5c"
+ "\x41\x19\xf2\x6d\x0e\xb1\x32\x91\xed\x71\x0d\x71\x36\x57\xf0\x67"
+ "\xc4\x5e\x7a\xb6\x90\x77\x0f\x9d\x15\xf2\xee\x87\x11\x36\xde\xb5"
+ "\x00\xef\x1e\xac\xca\xa1\xf9\xd7\xd7\xe9\xd8\xd4\x9d\xaf\x0b\xc6"
+ "\xa6\x7e\xf3\x4f\x8e\x77\xd3\x66\x1d\xd7\xc3\xfd\x3b\x1b\x3f\x05"
+ "\xdf\xdf\x75\xd6\xd5\x31\xa8\x39\x92\x63\xa7\x38\x7e\x92\x1c\x3f"
+ "\x05\x75\x55\x6f\xe2\x9e\x55\x0b\x3c\xa7\x9b\x04\xe3\xa7\x72\x13"
+ "\xe0\x79\xe6\xe6\x95\x38\x1d\x87\xfa\x3a\x3f\x0e\x95\xc9\xca\x1a"
+ "\x8e\xfd\x9b\x35\x3b\x9b\x34\x32\x91\x9e\x8c\x6f\xd6\x70\xfc\xfd"
+ "\xdb\xb7\xa1\xdf\x19\x1d\xea\xc9\xf9\xba\x00\xe0\x9e\x4e\xb4\xdd"
+ "\xd3\x72\x2d\xd0\xd7\x58\xa0\xaf\xb1\x66\x65\x05\x98\x51\x9b\xac"
+ "\xcf\xea\x93\x0b\x3e\xcf\x9c\xca\xee\x69\xf8\x70\x3a\x78\xbd\x3c"
+ "\xf4\x79\xd7\xe0\xd9\x48\xd6\xa8\xb0\x3e\x36\x1e\xed\x5c\x03\xf7"
+ "\x71\xcd\xb9\x96\x33\xff\xc2\xf3\xa8\x6e\xc2\x09\xf8\xcd\xd5\x6b"
+ "\x4a\x10\xbb\xa1\xfc\x9c\x02\x56\x33\xcb\x8c\x95\xc5\xba\xd0\x75"
+ "\x1b\x01\x0b\x2d\x90\x93\x10\xd6\x47\xcc\xeb\xab\x7f\x12\xf3\x7a"
+ "\x7a\x4f\x31\xaf\xaf\x3e\xc5\xf3\x3a\x77\x0e\x78\x1d\xe2\xc6\xea"
+ "\x68\xcb\x1a\x77\x75\xf4\xea\x1a\x1b\xaf\x5b\x39\x5e\xdf\xec\x02"
+ "\xaf\x3b\xd5\xd1\x02\x5e\x92\xe7\xf5\xd5\x35\x7c\x4e\x22\xfd\xa8"
+ "\xe4\x18\xd9\xb3\x42\x5e\xff\x30\x9a\xe5\xf5\xb3\xf6\xbc\x0e\xc7"
+ "\x59\x5e\xff\x30\x5a\x76\x3e\xc1\x59\xfb\xf7\x69\x19\xdb\x59\x5e"
+ "\xaf\xe0\xc6\xc8\x96\x29\x98\x4f\x50\x41\x39\xdd\xc6\xe5\x98\xaf"
+ "\xba\xb7\x39\x89\x8c\x02\x25\x39\x09\x96\xcb\x6b\x29\x97\x23\x37"
+ "\xda\xf8\xdc\x95\xf9\x04\xcd\xf1\xb9\x4d\x37\x23\x9f\xcb\xe9\x66"
+ "\x31\x9f\x67\x6e\x17\xf3\x79\x66\xa1\x98\xcf\xb3\xb6\x8b\xf9\x3c"
+ "\xab\xc0\x9e\xcf\x1d\xb9\x3c\xd3\x22\xc5\xe3\xb1\x7f\xc6\x1c\x45"
+ "\x56\xa8\x3c\x87\xaf\xd1\x28\xe7\xf0\xb5\x7d\xff\xcf\x71\xb8\xda"
+ "\x9e\xc3\xd7\x86\x23\x07\x59\x3e\xb0\xe3\xf0\xb9\x1c\x87\x73\x3c"
+ "\x92\x77\x85\xd3\xc2\xf6\x1c\x5e\x0b\xf7\xd1\x8c\x1f\x37\xff\x6c"
+ "\xcf\xe1\xeb\x42\x44\x1c\xae\x6e\x86\xc3\xe7\xd2\x3c\x88\x68\x5c"
+ "\xae\x4c\x2e\x04\xee\x23\x62\x93\x8c\x36\xb7\xb5\x99\xb0\x3e\x62"
+ "\x0e\x5f\x57\x28\xe6\xf0\x75\x7a\x31\x87\xaf\xcb\xe6\x39\x9c\x3b"
+ "\xd7\x22\xda\x7c\xdd\xce\x16\xd7\xe6\x36\x7c\x38\xe5\xf0\x75\x3b"
+ "\x79\x6d\x9e\xb5\xb2\x79\x0e\x5f\x13\x28\xcd\xe1\x70\x9c\xe5\xf0"
+ "\x35\x81\xb2\xf3\x1c\x1c\x38\x3c\x3b\x4a\x01\x87\x8b\x73\x21\x36"
+ "\x0e\xe7\x72\x21\x79\x82\x5c\x88\x25\x95\xe6\x42\x36\x5d\xa1\xd8"
+ "\xe8\xe4\x41\x71\x0a\xf8\xf1\xdf\xac\x72\xee\xdd\x36\xb9\x95\x07"
+ "\xc9\x8e\x54\x92\x07\x61\xf9\x1b\xe7\x38\xbc\x06\xbc\x5d\xe6\xe2"
+ "\x1c\x87\x71\xb6\x39\x0e\x99\x32\x73\x1c\x38\x3e\x9f\x79\x07\x7c"
+ "\xce\xce\x71\x58\xbf\x44\x9c\x63\x5e\x9f\x64\xcb\x31\x53\x3e\xdf"
+ "\xb8\x5a\xcc\xe7\x1b\xd3\x9a\xe6\x3c\x00\xe7\x97\xc6\xae\x75\x98"
+ "\xf3\xd0\xc4\xed\x6c\x1e\x74\xfd\x39\xdd\x9f\xab\x49\x13\xbf\x87"
+ "\xf1\xfc\x0e\x65\x8d\x10\x71\x7b\x95\x90\xdb\xff\xea\x25\xe2\xf6"
+ "\xf3\x39\xe2\xf1\x11\x55\xb1\x02\x6e\xb7\xcd\x79\xc8\xf1\x38\x5e"
+ "\xd9\x0c\xb7\xc3\xf7\x5d\x9f\x23\xd6\xb2\xdc\x6e\x9b\xdf\x20\xc9"
+ "\xed\xc2\xf9\x0d\x82\xf1\x0f\xc8\xed\xec\xde\x1b\x7e\x76\xdc\xbe"
+ "\x34\x52\x65\xf9\x1a\x9e\x07\xe0\x75\x7c\x46\x2c\x0c\x70\x3b\xdb"
+ "\xde\x39\xc3\x85\xdc\x7e\x3b\x95\x72\xfb\x47\x57\xee\x9c\xdb\x9b"
+ "\xf4\xb0\x90\xdb\x5f\x44\x6e\xdf\x30\x8c\xce\xbf\x48\x71\x6d\xfe"
+ "\x85\xdd\xf8\x8c\x8f\x5c\xc8\xbf\x38\xe5\x78\x89\x7a\x89\x39\x7e"
+ "\xc3\x1a\x31\xc7\x6f\x38\x22\xe6\xf8\x0d\x4b\x78\x8e\xe7\xce\xb5"
+ "\x88\x4e\xdf\x90\x79\x6f\xf2\x2f\x1b\x32\x79\x8e\xdf\x18\xd3\xfc"
+ "\xdc\x8b\xbf\xfa\x48\x8f\xcd\x80\xe3\x2c\xc7\xff\xd5\xc7\xe9\xdc"
+ "\x0b\x51\xbe\xfb\xa3\x19\x92\x73\x2f\xca\xee\xde\xd8\x0c\x21\x56"
+ "\xec\xf3\x2f\xee\xe7\xbe\x3f\x0a\x53\x9a\x7f\xc1\xb9\x17\x4b\x4f"
+ "\x0b\xe6\x5e\x54\x36\x3f\xf7\x22\x31\xc4\xc5\xfc\x8b\x93\xb1\x19"
+ "\x27\x82\x85\xe3\xdd\x72\x5f\x13\xf3\x7b\xee\x8c\x26\x7e\x7f\x05"
+ "\xf9\x3d\x7f\xbe\x98\xdf\xf3\x63\xb1\x9e\x52\x73\x31\xbe\x14\xbd"
+ "\x57\xcc\xdd\x2f\x1e\xab\x61\x97\x7f\x79\x05\xb1\x97\xdf\x5b\xc4"
+ "\xef\xe7\x85\xfc\x9e\x5b\x2d\xa5\xdd\x31\xef\xcd\x8e\x29\x9e\x29"
+ "\x98\xd3\x36\xd9\x36\xfe\x6d\xd3\xd5\xe3\xa1\x70\xff\x7a\x99\xb1"
+ "\x6e\x33\xe9\x58\x37\x76\x6c\x1b\xe6\xc1\xa1\xac\xdd\x33\x63\x55"
+ "\xda\x70\xc6\x8a\x63\xdd\xec\xc7\xb9\xe1\xd8\x37\x1c\xeb\x56\x1c"
+ "\x99\x29\x3b\xce\x0d\xb1\x29\x37\xd6\x0d\xea\xed\xcb\x72\xfd\x45"
+ "\x8e\xeb\xb9\xb1\x6e\xb9\x8b\xf8\xb1\x6e\x22\xae\x97\x18\x3f\xbc"
+ "\xff\x7c\x8a\xb4\x8e\x4f\xe6\xb9\xbe\x11\x75\xfc\x0b\x76\xb9\x18"
+ "\x36\x06\x9b\x35\x77\x35\x17\xc3\x72\x7d\xde\x63\x25\x88\xe3\xb0"
+ "\x58\x89\x5c\x8c\xe3\x18\xe7\xbb\x97\x8b\xc9\x5b\x28\xe6\xf8\xbc"
+ "\x02\x31\xc7\xe7\xcd\xe0\x39\x9e\x3b\xd7\x22\x1c\x9f\x17\x77\x6f"
+ "\x72\x31\x79\x71\x7c\x2e\x26\x7f\xaa\xe4\xf8\x3b\x51\x8e\x3d\xb7"
+ "\x56\x3a\xc7\x9e\xcb\x8d\xbf\xcb\xad\x95\x9d\x13\xe2\xf0\x4e\x73"
+ "\xcb\x73\x34\xc7\xee\xc6\x9c\x90\xca\xb6\x96\x8b\xd9\xf2\xac\xd2"
+ "\x5c\x0c\x3b\xb6\xf9\x34\x8e\x0f\x51\x36\x27\xa4\x39\x6e\x6f\xd2"
+ "\xee\x4e\xde\x61\x8a\xb9\xfd\xe3\xe7\xc4\xdc\xfe\xf1\x30\x31\xb7"
+ "\x7f\x32\x52\xcc\xed\x9f\x04\xd9\x73\xbb\x23\xaf\x7f\xbc\x52\x8a"
+ "\xd3\x63\x5f\xc1\x5c\xcc\x36\x83\x3c\x9f\x7f\xfc\xb9\x72\x3e\xff"
+ "\xaf\x83\xff\xa7\xf9\x5c\x6d\xcf\xe7\xff\x65\xba\xab\x79\x19\x96"
+ "\xcf\xb7\x5e\x15\xf1\xb9\xba\x19\x3e\xbf\x6b\x79\x99\x6d\x63\xc5"
+ "\x7c\xbe\x2d\x5e\xcc\xe7\xdb\x06\xf2\x7c\xce\x9d\x6b\x91\xbc\xcc"
+ "\xb6\x31\xf7\x26\x2f\xb3\x6d\x0c\xaf\xd9\x3f\xe9\xdd\x3c\x9f\x7f"
+ "\x7c\x40\x9a\xcf\xe1\x38\xcb\xe7\x1f\x1f\x90\x1d\x4f\xed\xc0\xe7"
+ "\x7f\xf3\x50\xc0\xe7\x92\x63\x54\xda\x46\x5e\xe6\x6f\x44\x69\x5e"
+ "\x46\x6e\x9e\x0a\xf2\x3b\x3f\x3e\x45\x30\x4f\x25\xc8\x36\x4f\x25"
+ "\x45\x3c\x3e\xa5\xc5\xb9\xbd\xa0\x8b\x98\xdb\x0b\xfc\xc4\xdc\xbe"
+ "\x73\xb0\x98\xdb\x77\x06\xda\xea\x49\xf3\x32\xa9\x0e\xf3\x56\xc4"
+ "\x3c\x5f\xb0\x50\xf7\x4a\x35\x91\xe2\xfa\xcb\x1e\x9f\x5e\x94\xe7"
+ "\xf9\x82\x5c\x39\x9e\xc7\xf1\x2a\x9f\xce\x8c\x94\xe0\xf9\xed\xdb"
+ "\x7e\x0d\x3c\x2f\x37\x0e\x85\xf5\x41\xc0\xf1\xc8\xf7\x2c\xbf\x73"
+ "\x5c\x8f\x3c\x6f\xf9\x87\x54\x8e\x66\xbb\xbe\xb5\x78\x5e\x3e\x47"
+ "\xb3\xe3\x5c\x49\x18\xc7\xf3\xae\xcc\xa1\x39\x2c\xce\xd1\xe4\xce"
+ "\x6d\xed\x1c\xcd\xa7\xcf\x89\xf9\xfe\xd3\x48\x31\xdf\x7f\xfa\x18"
+ "\xcf\xf7\xdc\xb9\x16\xd1\xef\x9f\x3e\x7b\x6f\x72\x34\x9f\x3e\xcb"
+ "\xf3\xfd\xce\x2e\xcd\xf3\x7d\xc1\x56\x69\xbe\x2f\xe0\xd6\x66\x2b"
+ "\xd8\xea\x3a\xdf\x17\x36\xf1\xbd\xe3\xfc\x99\x14\xf7\xc7\xc8\x8c"
+ "\xbc\xd7\x39\x9a\x42\x59\xfe\x77\xb6\x3e\x86\xfb\x39\x1a\x6e\x4e"
+ "\xe2\x6c\xe9\xf5\x31\x8e\x3b\x19\x23\x73\xbc\x48\xc8\xf5\x85\x16"
+ "\xf1\x58\xc4\x5d\x1e\xb6\xb1\x88\xc7\x4b\x90\xeb\x3f\xeb\x27\xe6"
+ "\xfa\xcf\x34\x72\x39\x9a\xfd\x56\xe1\x98\xc4\x5d\x33\xc4\x39\x9a"
+ "\x7c\x71\x8e\x66\x32\x62\x6f\xef\x19\x79\xae\xdf\xb5\x42\x3c\x06"
+ "\x9c\xce\x51\xdc\x3e\x93\x1b\x03\x3e\x53\x30\x06\x7c\xc2\xc7\x1c"
+ "\xd7\xef\xde\x76\xac\xcc\x4c\x94\x8c\x43\xbc\xf3\xb1\xde\x2b\x24"
+ "\xc7\x20\xb2\x7d\x80\x93\x71\x88\x6f\x9c\x51\xe3\x98\x66\xcd\xe6"
+ "\x45\x82\x71\x88\x4e\xd6\x33\x16\xf1\xff\xcc\x58\x59\xfe\x6f\x60"
+ "\x78\xfe\xb7\xfe\x81\xcf\xdb\x58\x51\xe7\xb3\x71\xd9\xad\x6f\xad"
+ "\xbc\x8d\x54\x9e\x44\x37\x0a\xf9\x7f\xcf\x69\xaa\xf3\x23\xdb\x58"
+ "\xde\x66\xef\x40\x31\xef\xef\x0d\x17\xf3\xfe\x5e\x3f\x9e\xf7\xb9"
+ "\x73\x2d\x32\x16\x7d\xef\x80\x7b\xa3\xf3\xf7\x0e\xe0\xf3\x36\x9f"
+ "\x75\x68\x9e\xf7\x77\x65\x4a\xf3\xfe\xae\x4c\xca\xfb\xbb\x32\x9d"
+ "\xe6\x6d\x44\x63\x23\x3f\xbb\x7a\xc7\x79\x1b\x9b\xce\xbf\xe7\xf3"
+ "\x7a\x3e\xab\x55\x92\xb7\x69\x9a\x93\x7e\x47\x79\x1b\x69\xbe\xb7"
+ "\x69\xfb\xe3\x4e\xde\xb9\x8a\xf9\xfe\xbf\xaf\x8a\xf9\xfe\xbf\xaf"
+ "\x8b\xf9\x7e\x5f\x47\x31\xdf\xef\xf3\x91\xca\xdb\x88\xb9\xfe\xf3"
+ "\x91\x52\x3c\x1f\x3b\x19\xf3\x36\x7f\x3f\x20\xcf\xf1\x9f\x47\x2b"
+ "\xe7\xf8\x2f\x56\x3e\xe0\x78\x3b\x8e\x57\xdb\x73\xfc\x17\x47\xee"
+ "\xaa\xc6\x67\x39\xfe\x7f\xf6\x8b\x38\xbe\x05\x73\x39\xae\xcc\x27"
+ "\x91\xd7\xf6\x7f\xb7\x1b\xff\xfe\x77\xbb\xf1\xef\xff\x23\x18\xff"
+ "\xfe\xf7\x31\x2d\xc7\xf1\x7f\x6f\xf9\xf1\xef\x2e\x71\xfc\xdf\x05"
+ "\xe3\xdf\xff\x7e\xb5\x79\x8e\xff\x3c\x4e\x9a\xe3\xe1\x38\xcb\xf1"
+ "\x9f\xc7\x39\xd5\xf6\x22\x8e\xdf\x77\xaa\x35\x72\x39\xf7\x66\xbe"
+ "\xd1\x3e\xd9\x3d\xec\x94\xae\x3b\x22\x9b\xcf\x19\x6a\xcb\xe7\xc4"
+ "\xca\xe4\x73\x5a\x8a\xf3\xf7\x5f\x14\x73\xfe\xfe\x4b\x62\xce\x3f"
+ "\xe4\x27\xe6\xfc\x43\xbe\xe2\x7c\xce\x02\x87\x7c\x8e\x98\xff\xbf"
+ "\x1c\xab\x9b\x2c\xcc\xe7\xe4\x0b\xf2\x39\x07\x8f\xca\xf3\xff\x97"
+ "\xb2\xfc\x7f\x8b\xe5\xff\x70\x09\xfe\xff\xc7\xff\x11\xfe\x0f\xbf"
+ "\x03\xfe\xff\xc7\x3d\xe0\xff\x03\x87\x69\x8e\xc7\xc5\x75\x52\xf6"
+ "\x2b\xcf\xf1\xdc\x59\x3f\x70\xb0\xbb\xb8\x1f\x38\x38\x51\xdc\x0f"
+ "\x1c\xf4\xe0\xfb\x01\xee\x5c\x8b\xf4\x03\x07\xfd\xef\x4d\x3f\x70"
+ "\xd0\x9f\xef\x07\x0e\xde\x6c\xbe\x1f\xf8\x52\xa6\x1f\xf8\x92\xeb"
+ "\x07\xbe\x54\xd0\x0f\x1c\xba\x24\x9f\xe3\x89\x75\x3f\xc7\x33\xec"
+ "\x5e\xcf\x83\x3a\x54\xad\x28\xc7\xb3\x3e\xdb\x50\x84\x6b\xa4\x5c"
+ "\x24\xaa\xa5\xb3\x6c\x39\x1e\x9d\x5d\x8e\x47\xe7\x90\xe3\x59\x72"
+ "\x91\xe3\xff\x89\xdc\x7c\xd3\xc9\x77\xb0\x46\x0a\xbb\x9f\xf4\x57"
+ "\x17\xc5\xe3\xe6\xbf\x62\xf9\x9f\x5f\xbf\xef\xeb\xf9\x58\x2f\xda"
+ "\xff\xe8\x9c\xac\x81\xaa\x1b\x2c\xca\xe9\x4c\x94\x5a\x23\xe5\x6b"
+ "\xd1\xb8\x1b\xf1\x7c\x53\x5d\x98\x88\xef\x27\xd3\xf9\xa6\x3b\xa4"
+ "\xde\xd3\x36\xad\xc9\x7f\x38\x86\x5d\x93\xbf\x69\x2d\x3f\x5d\xbe"
+ "\x4b\x6b\x49\xcf\xe4\xd6\x92\x3e\x7f\x0f\xd6\x92\x76\x75\x4d\xfe"
+ "\xf3\xf6\xeb\xf7\xfd\xb3\x43\x69\x91\x8e\x94\x20\x46\xc2\xec\xd7"
+ "\x3e\xd5\x49\xcf\xdd\x57\x71\x73\xf7\xe7\xb5\xce\x3a\x28\x58\x1f"
+ "\xb6\xcf\xef\x5a\x49\x0a\xb5\x06\xb6\x3e\xb8\x77\x37\xd4\x75\x75"
+ "\x11\x60\xd5\x8a\x7c\xba\x00\xf9\xf4\x9f\x3a\xf6\xda\x8b\x80\x85"
+ "\xae\x91\xc1\x88\xe3\x74\x2b\xf1\x89\x5d\x84\xdc\xfa\x4f\x76\xdc"
+ "\x17\xc8\x08\xe0\x56\x7a\x5d\xd2\x45\xc6\x62\xe9\x1a\x1b\x0c\xf5"
+ "\x7f\x68\xd7\xbc\xb2\x76\x25\x7a\x23\x3c\x17\x57\xd8\xbd\x5c\x4b"
+ "\xcd\xf5\x3a\x8c\xc5\xa1\x79\x65\x5e\x0c\xf0\x6f\xde\x5b\xc4\x5b"
+ "\xd9\x73\xfa\xcf\x34\x56\xcf\x60\xbf\xd7\xb5\xd2\x07\xd7\x01\xb1"
+ "\x69\x2b\xeb\x2f\x7c\x7e\x6b\x13\xb4\x8f\x95\xa1\x7d\xdf\x1b\x51"
+ "\x94\x37\xe0\xf7\x34\xd0\x96\xec\x18\x5b\xe4\x0d\x76\x0f\x2b\xe0"
+ "\x8d\xcd\x75\xfc\x7b\x6c\x2c\x1f\xdb\x88\xe6\x51\xbe\xe6\xc7\xbf"
+ "\xe8\xe5\xb8\x55\x17\x21\xcd\xad\xba\x08\xca\xad\xba\x88\x26\x6e"
+ "\xd5\x4b\xe4\x51\x44\xe3\xd8\x8f\x70\xe3\x5f\x74\x76\x1a\x5b\x77"
+ "\x1f\xae\x8f\x72\x44\xd1\xf8\x17\x96\x4f\xa3\x29\x9f\x22\x5f\xd9"
+ "\x38\x95\xcf\xa3\xe8\x64\xf3\x28\xcd\x71\xaa\xa2\x39\xfc\x2c\xa7"
+ "\x1e\x7d\x4e\xcc\xa9\x47\x87\x89\x39\xf5\xd8\x7e\x7b\x4e\x75\xe4"
+ "\xd3\xa3\x4b\xa4\xb8\x94\xae\x8f\x72\x2c\x52\x9e\x47\x8f\x6e\x95"
+ "\xe3\x51\x76\x7c\xfa\x4c\xc1\xf8\xf4\x26\x1e\xfd\xd7\x17\x62\x1e"
+ "\x3d\x5a\xe3\x2a\x8f\xb2\x7b\x9b\x9c\xbf\x0b\x7b\x9b\xb8\xcd\xa3"
+ "\xb1\x76\x3c\xfa\xef\xa9\x3c\x8f\xda\xef\x6f\xd2\x0c\x8f\xce\x6d"
+ "\x9d\x35\x50\x44\x3c\x6a\x35\xb0\xf5\x09\x98\xc7\xd6\xf5\xb4\x98"
+ "\x47\x8f\x79\xcb\xf3\xe8\xbf\xb7\xf1\x3c\x4a\xaf\x6b\x5d\x1e\xfd"
+ "\x77\xb9\x88\x47\xe7\x0a\x78\xf4\x67\xde\x43\xe0\x18\x8b\x26\x1e"
+ "\x8d\x11\xf0\xe8\xdc\xe6\x78\xf4\xdf\xe5\xd8\x46\x54\xa3\x1e\xdb"
+ "\xd0\x3c\x8f\x1e\xdd\x29\xcd\xa3\x70\x9c\xe5\xd1\xa3\x3b\x79\x1e"
+ "\x95\xd0\xa8\x22\x1e\x3d\x9e\xa4\x80\x47\xdb\xf8\xda\x28\xc7\x13"
+ "\x15\xe5\x2a\xf8\x39\x9d\x8e\x6b\xa4\xce\x10\xce\x09\xda\x67\xb7"
+ "\xef\xc9\x3e\x87\x7d\x4f\x96\xd8\xe6\x78\x8e\xe3\x78\x75\xc2\x1d"
+ "\xf0\x2a\x3b\xc7\xf3\xc4\x6a\xf1\xd8\x93\x13\x6b\x6c\x63\x4f\x28"
+ "\xaf\x96\xf4\xb5\xd5\x8b\xdf\xf7\x64\x9f\x93\x35\x52\x4f\x5c\x14"
+ "\xad\x8d\x32\x4e\xb8\x36\x4a\xf1\x69\xf9\x35\x52\x4f\x7a\x8b\xd6"
+ "\x46\x39\x51\xd0\xb4\xef\x89\xfd\x1a\xa9\x3c\xc7\x16\x75\x67\x39"
+ "\xb6\x69\x0d\xaa\x93\x13\x9b\xd6\x48\x6d\x66\x5e\x10\x96\xb3\xab"
+ "\x2a\xb2\xf5\x39\x56\xa7\x80\x63\x45\xfb\x9e\xd8\xaf\x31\x55\x74"
+ "\xb0\xf4\xd8\x3e\x52\x12\xbe\x4f\x62\x6d\xd4\x7d\xf7\x74\xef\x13"
+ "\xac\x97\x34\xd7\x16\x8f\x14\x73\x6d\x71\x1c\x7b\xed\x39\x29\xae"
+ "\x2d\xee\xc2\x73\x2d\xbd\x2e\xe9\x9c\x1d\xd7\x56\xca\x70\x2d\xf4"
+ "\xab\x79\x97\x95\x72\x6d\x71\x10\xcb\xb5\xa9\x1c\xd7\x5e\x69\x69"
+ "\xae\x2d\x0e\xe2\xb9\xb6\xa4\x5d\xf3\x7b\x4c\x9d\x54\x4b\xcf\xcb"
+ "\x39\xa9\xa6\x5c\x7b\x52\xed\x74\x8f\x29\xd1\x98\x8f\x92\x9b\xb6"
+ "\x3d\xa6\xf8\x7c\xc0\x3e\x2e\x1f\x70\x3f\xef\x89\x52\x62\x54\x9a"
+ "\x0f\x38\x09\xde\x1d\xe7\x5d\x2e\xc5\x3d\xa7\xc2\x70\x4f\x94\x3d"
+ "\x76\xf9\x80\x3d\x8e\xf9\x80\xd7\x9c\x73\xac\xa2\x7c\x00\x3b\xef"
+ "\xb2\xf4\xba\x98\x63\x4b\x6f\x8a\x39\xf6\x7f\x57\xdb\xe6\x59\x62"
+ "\x7d\xe4\xd7\x4c\x2d\x1b\xd9\x94\x0f\xa8\x14\x73\x2b\x9f\x0f\xf8"
+ "\xdf\x11\xf2\x1c\x5b\x26\xce\xff\x4e\x28\x10\xcd\xb3\xdc\x51\x25"
+ "\x5c\x87\xda\xb6\xfe\xd4\xa9\x95\xc7\xcb\x85\x1c\x5b\xb6\xe7\x7e"
+ "\x5a\x87\xba\x69\xad\xa9\x66\xc6\x72\x3b\xae\x43\xfd\x4d\xdf\xd2"
+ "\x63\x7b\x08\xce\x6d\x63\xf9\x56\x94\x1b\xd8\x73\x6f\x72\x03\xc7"
+ "\xf6\xc8\xe4\x06\xbe\xd9\x2e\xe6\xd9\x6f\x2a\xd9\x6b\xcf\x48\xf1"
+ "\xec\x37\x4b\x78\x9e\xa5\xd7\x25\x9d\xb1\xe3\xd9\x8a\x96\xd4\xb4"
+ "\xdf\x14\xb4\x6e\x6e\xe0\x9b\x02\x3e\x37\xf0\xbf\x2e\xcc\x7f\x2c"
+ "\x8b\x93\xe6\xd9\x32\x2e\xef\x5a\xc6\xe7\x5d\x2b\x24\xf6\x4b\x11"
+ "\xf1\x6c\xf9\x54\xdb\xfc\x47\x56\xd3\x56\xda\x34\xed\x9e\xfb\x70"
+ "\xbf\x94\xf2\x60\xa5\xb9\x01\x9c\xe7\x8e\xdc\x8a\xdc\x65\xe3\x57"
+ "\x3e\x37\xb0\x47\x3e\x37\xd0\x0c\xbf\x2a\xdf\xbb\xef\xf4\x54\x31"
+ "\xbf\x9e\x0e\x11\xf3\x6b\xc5\x45\x7b\x7e\x75\xe4\xd6\xd3\xd9\x52"
+ "\xbc\x4a\x73\x03\x15\x99\xf2\x9c\x7a\x5a\x27\xc7\xa9\xec\x9a\x7e"
+ "\x55\xfc\x18\x69\x9e\x53\xbf\x3d\x27\xe6\xd4\x6f\xbd\x5c\xe5\xd4"
+ "\x7b\xb2\x5f\x8a\xdb\x9c\x1a\x69\xc7\xa9\xdf\x2d\xe1\x39\xd5\x7e"
+ "\xcf\x94\x66\x38\xb5\xb5\xf2\x04\x42\x4e\x15\x69\xd7\xef\x2c\x62"
+ "\x4e\xad\x08\x94\xe7\xd4\xef\x8a\x79\x4e\xa5\xd7\xb5\x2e\xa7\x7e"
+ "\x67\x6e\xdd\x3c\xc1\x77\x66\x5e\xbb\x56\x1c\x6e\x9e\x53\x4f\x1f"
+ "\x93\xe6\xd4\xd3\xc7\x28\xa7\x9e\x3e\xe6\xfa\x9c\xf2\x33\xdb\x14"
+ "\x70\x6a\x1b\xdf\x4b\xe5\xcc\x56\xc5\x79\x02\xcc\xb7\x22\x97\x56"
+ "\xde\xd9\xda\x21\xf1\xb6\xb5\x43\xc6\x70\x1c\xfb\xe2\x9d\x72\xec"
+ "\xd9\x2f\xc4\x63\x1a\xce\xee\xb7\x8d\x69\xa0\x1c\x7b\xfe\x35\xf1"
+ "\xfe\xa8\x8e\x6b\x85\x88\xd7\x50\xfd\xbe\x43\x53\x9e\x00\x39\x77"
+ "\x8c\x30\x4f\x70\xbe\x83\x3c\xdf\x7e\x1f\x28\xca\x13\xfc\x4b\x9a"
+ "\x6f\x6f\x89\xf8\xb6\x72\x12\xcb\xb7\x4d\x6b\xa8\x7e\x1f\x67\x5b"
+ "\x43\xb5\x59\x0d\x2b\xe2\xdb\xf0\xbb\xc3\xb7\xfb\x5c\xe7\x5b\xf1"
+ "\x5e\x2a\xf6\xeb\xa5\x56\x5e\x2f\x3d\x02\x7c\xcb\xae\xd7\x61\xbf"
+ "\x66\xaa\x6b\xeb\x75\xb4\xd6\x9a\xa9\x58\x2f\x69\xde\x3d\xb7\x50"
+ "\xcc\xbb\xe7\x0a\xd8\x6b\x25\x79\xf7\xdc\x58\x9e\x77\xe9\x75\x2e"
+ "\xf3\xae\x5b\x39\x83\x73\x71\xad\x9b\x33\x38\x17\xc7\xf3\xee\xf9"
+ "\x61\xcd\xf3\xee\xf7\x43\xa5\x79\xf7\xfb\xa1\x94\x77\xbf\x1f\xea"
+ "\x94\x77\x45\x63\x08\x2e\xf4\x93\x5c\xcb\xa3\xf2\x7e\xdf\x67\xe5"
+ "\x82\xc6\x9d\x9c\x01\x70\xb0\x2a\x11\xd7\x70\x0a\xc7\x31\x04\xcd"
+ "\xe7\x0c\x9a\xe3\x5b\xe5\x39\x03\x7d\x5f\x31\xdf\xea\xfb\x89\xf9"
+ "\xf6\x87\xd3\x58\x2f\xa7\x39\x03\x96\x03\xf4\x0b\x9b\x72\x06\x7a"
+ "\x31\xcf\xf2\x39\x83\x1f\x96\xcb\xbf\xfb\xd2\xe7\x8b\xf4\xed\x8b"
+ "\x76\x6b\x56\xcf\xe4\xf9\xf6\x44\x89\x6d\xcc\xd8\xc5\x53\xc7\x83"
+ "\x85\x7c\xab\xaf\x76\x58\xb3\x7a\x5a\x0b\xae\x59\x3d\xad\x85\xd7"
+ "\xac\x0e\x11\xaf\x59\xbd\xf1\x16\x3f\x8e\x4c\xf9\x9a\xd5\x55\x31"
+ "\x2c\x07\x23\x86\x70\xdd\x6a\x57\xf2\x08\xad\xbc\xd7\x8a\x88\x7b"
+ "\x45\x79\x84\xaa\xeb\x62\xee\xfd\xa1\x8f\x3c\xf7\x56\x1d\xe6\xb9"
+ "\x97\x5e\xd7\xba\x9a\xb7\xca\xd0\xba\x79\x84\x2a\x03\x9f\x47\xf8"
+ "\xe1\x0b\x49\xee\x15\xbd\x1b\xd3\x17\x48\xbf\x1b\x83\xe3\x2c\xf7"
+ "\xea\x0b\x64\xf3\x08\x0e\xe3\xb7\xaa\x37\xd0\x77\x63\x9c\xe6\xd5"
+ "\x2b\xc8\x23\xb4\xb9\x31\x06\xd5\x39\xee\xe4\x11\x90\x6f\x91\xcf"
+ "\x6c\x9c\xeb\x4a\x1e\xa1\xe5\x35\xee\xa5\x0d\x62\xce\xbd\xb4\x49"
+ "\xcc\xb9\x3f\x8d\xb0\xe7\x5c\x47\xbe\xbd\x74\x4e\x8a\x6b\x69\x1e"
+ "\xa1\xa6\x56\x9e\x67\x2f\x7b\xcb\xf2\xac\xdd\xd8\x5c\x9e\x67\x7f"
+ "\x1c\x26\xe6\xd9\xcb\x13\xdd\xe2\x59\x57\xf7\x60\x69\x53\x3c\x1b"
+ "\x6e\xc7\xb3\x3f\x9e\xe6\x79\xd6\x7e\x1f\x96\x66\x78\xb6\x95\xf6"
+ "\x61\x91\xd7\xb8\x35\xaf\x89\x79\xb6\x26\x4d\x9e\x67\x6b\xfa\xf1"
+ "\x3c\x4b\xaf\x6b\x5d\x9e\xad\x09\x6d\xdd\xdc\x42\x4d\x28\xaf\x71"
+ "\x7f\x7a\xac\x79\x9e\xbd\xac\x96\xe6\xd9\xcb\xdc\x7b\xb1\xcb\x6a"
+ "\x59\x8d\xeb\xc0\xb3\x57\x3c\x14\xf0\x6c\x1b\x1f\x83\x70\x85\xb8"
+ "\x93\x5b\x60\xf9\x55\x6f\x37\x5f\xe2\x8c\x70\xbe\x84\x20\xb7\x30"
+ "\xc6\x96\x5b\x10\xef\xcf\x12\x6f\xcb\xdf\x06\x71\xbc\x3b\xea\x4e"
+ "\x79\xf7\xe7\x2e\xf5\x4d\xbc\xbb\x00\x78\xf7\x67\x76\x7e\x44\x7d"
+ "\x13\xef\x5e\x3b\x6e\xab\x17\xbf\x3f\x8b\x4c\x6e\xe1\x79\xb6\xbc"
+ "\x39\x4d\xb9\x05\xe4\xe1\x20\x61\x6e\xe1\xda\x12\x79\x0e\xfe\x39"
+ "\x4d\x94\x5b\xf8\xa7\x34\x07\x1b\x45\x1c\x5c\x7b\x90\xe5\xe0\xe7"
+ "\x6d\x1c\xfc\x73\xd9\x2d\xf0\x96\xb7\x3e\x50\xc6\xc1\x46\x96\x83"
+ "\xc7\xdd\x1b\x0e\xfe\xbc\x05\x38\x98\x6d\xf7\xab\xb3\x4a\x75\xc0"
+ "\xc1\x61\xc8\xc1\xe3\x5c\xcb\x37\xdc\xa5\x3d\x5a\xb0\x5e\xd2\x5c"
+ "\x7c\xf5\x92\x98\x8b\xaf\xf9\xb3\xd7\x4a\x72\xf1\xd5\x2f\x78\x2e"
+ "\xa6\xd7\xb5\x6e\xbe\xe1\x6a\x75\xeb\xe6\x1b\xae\x56\xf3\x5c\x7c"
+ "\x6d\x7b\xf3\x5c\xfc\x73\x96\x34\x17\xc3\x71\x96\x8b\x7f\xce\x72"
+ "\xca\xc5\xcf\x0b\xb9\xf8\x97\x26\xcd\x2b\xca\x37\xe8\xef\xf7\xbd"
+ "\x5b\x7e\x91\xd5\xbf\x01\xbd\x48\x4a\x95\xc7\x2f\xd7\x4b\x73\x09"
+ "\xb9\x91\x4a\x52\x4a\xcd\xcf\x13\x38\x06\xed\x67\xe8\x5e\xea\x3f"
+ "\x94\x58\xd7\x2e\x8d\x47\x3e\x5e\x87\x7f\xa0\x71\x33\x55\xdc\xb3"
+ "\xc5\xb6\xb1\x81\x1d\xef\x8a\xc7\x91\x7b\xf3\x04\xe7\xa5\x7e\x8b"
+ "\xc9\x4c\x30\x71\xdf\x8b\xa3\xf3\x6e\x12\xcc\xb6\xcf\x88\x4d\xbd"
+ "\x87\x21\x9e\x59\x93\x60\x34\x74\x49\x30\x4a\x7d\xff\x09\x35\xf1"
+ "\xee\xb4\x8c\x61\x36\xaf\x67\x8c\x37\x9e\xd2\xea\x6f\xac\x22\x24"
+ "\x73\x3d\x63\xa8\xff\xc0\x00\xb8\xf9\xa5\xe2\xaf\x70\xdd\x8d\xae"
+ "\x75\x65\x37\x52\x83\x09\x1c\x3b\x62\x3b\x06\xed\x46\xac\xa9\x9e"
+ "\x8c\x15\xce\x31\xeb\x47\x1d\xc8\xd3\x02\x57\x25\x12\xf2\xcc\x2d"
+ "\x7c\x66\x0c\xe5\x80\x19\xdf\x74\x28\x33\x03\xca\x62\x7e\xf3\x5b"
+ "\x23\xe0\xd1\xab\xe4\x7d\x82\xcf\xf4\x0a\xb8\xaf\xfc\x74\x6c\x7b"
+ "\xcf\xfe\x39\x8c\xca\x8b\x58\xb7\xcd\x1b\xca\xf8\xad\x37\x40\x3c"
+ "\x48\xe6\x02\xe2\x8d\xf7\x91\x01\xd7\x31\xaa\x64\x06\xfa\x11\x5d"
+ "\xa9\xd9\x48\x9f\x69\xa8\xdf\x21\xf0\xb1\x0c\xfc\xee\xe6\x05\x44"
+ "\x0d\x7f\x3e\x4c\xf6\x7a\xa8\xeb\xf5\x30\xb8\xcf\x31\x58\x2f\xb9"
+ "\x7b\xcc\xd8\x08\xfd\xce\x6f\xfd\xb1\xef\x60\x7f\x1f\x7f\x9b\xfd"
+ "\x1d\x95\x75\x85\x05\x8e\x33\xa9\xc9\x4c\x69\xbc\x99\x74\x86\xb6"
+ "\xc8\x83\x7a\x23\x1e\xad\x9f\x68\xf5\xef\xf5\x20\x64\x57\x42\x8d"
+ "\xaa\x14\xea\x6e\xf9\xeb\x6f\x8d\x3a\xed\xef\x09\x9c\x37\xa0\x67"
+ "\xb9\xec\x51\xf7\xda\x94\x9f\x08\x41\x3e\x81\xff\xcf\x31\x42\x3f"
+ "\x36\x09\x3e\x67\xc0\x7d\x58\x6f\xf8\x7b\xe1\xb5\x70\xbc\x8b\x6e"
+ "\xd1\x59\xd2\x39\x96\x78\xa7\xc3\xbd\xd1\x6b\xaf\xeb\xf1\x5a\xbd"
+ "\x47\x5d\x04\xd6\x01\x3e\x1b\xe1\x33\x7e\x0f\xc7\x90\x11\x66\xeb"
+ "\xbc\xa1\x2c\x36\xb3\xd6\x1b\xac\x7d\xe7\x0d\x65\xb9\x0f\xee\x33"
+ "\x03\xee\x19\xae\xf1\x81\x6b\x7c\xd8\x7f\xb5\x44\x9d\x05\xc7\xb0"
+ "\x1c\xf8\xd7\x47\x37\xaf\x11\xcb\x2e\xc3\xb2\x65\xda\xc1\x8b\xf1"
+ "\x5d\x6f\x60\x00\xdb\xd8\xa7\x06\x68\x3d\x4e\x55\x79\xdc\xf0\xea"
+ "\xec\xc1\x30\xf0\x9c\xeb\xde\xd3\x12\x9f\x4c\x2b\x21\xba\x1e\x58"
+ "\x4e\xdd\x39\x28\xdf\x0b\xdb\xa2\xfe\x83\xba\x03\x7a\x8f\xeb\x91"
+ "\xd8\xbe\x10\x4f\x63\xc0\x13\x78\x0f\x37\x7c\xf1\x77\xf0\x3b\xdc"
+ "\xf5\xec\xda\xf7\x58\xe7\x00\xad\x27\x03\x9f\x2d\x9e\x1e\x17\x89"
+ "\xa7\x7f\xc7\x3e\xf0\x7d\xb3\x9e\xec\x2c\xc7\xef\xeb\xe9\xf7\x00"
+ "\x4b\x37\xa0\xde\x86\xf7\xf1\x18\x7e\x96\xa9\xaf\x8f\x2d\x6e\xc5"
+ "\xfe\x80\x0d\xfb\xd8\xd9\x30\x02\xb8\xb0\x61\x04\xeb\xbb\x5b\xab"
+ "\x57\xb1\xfd\xb0\xc7\x0d\xd6\xd7\xa5\x43\x0c\x2d\x1f\xf9\x7b\x65"
+ "\x40\xdb\x5a\x6f\x63\x5c\xaa\xe0\x9c\x31\x04\xe3\x92\x91\x00\x31"
+ "\xa1\xd7\xc6\xf3\xf5\xc7\xcf\x46\x36\x9e\x56\x88\x05\x9d\xbb\x69"
+ "\xec\x87\xf7\x93\x71\x0b\xe2\xd8\x8d\x31\x1e\x81\xab\x19\xc4\x2d"
+ "\x60\x64\xd7\x02\x93\x0a\xc7\xf5\xe1\xf1\x43\x75\x26\x55\x06\x48"
+ "\x36\xe8\x67\xc9\x6a\xe0\xe5\x4d\x8b\xa0\xcd\xa1\x4c\xa6\x4f\xb4"
+ "\x6e\x90\x2d\x8e\x09\x10\xbb\x45\x80\x5d\x68\xf3\x0c\x68\xbf\xcd"
+ "\xc0\x79\xf8\xff\xcd\xd0\xff\x80\xa6\xd3\xe9\x3d\x8c\x11\x50\x9e"
+ "\x7a\x53\x37\xc6\x90\xd7\x8d\xa9\x85\x36\x1c\x5a\xff\x81\x31\xc8"
+ "\xd6\x86\x58\xa7\x0c\x38\xbe\x1a\xce\x43\x7b\x1e\xa0\x18\xba\x91"
+ "\x66\xbb\x67\xb9\xf6\x4c\xdb\x45\x86\xae\xde\x45\x7a\xae\xda\x45"
+ "\x86\x2f\xad\x86\xe7\x32\xf5\x8f\xcc\xc9\x30\x33\xf4\x89\xa7\x6b"
+ "\x1a\xbb\x25\x97\xe1\xbb\x27\xeb\x7b\xbf\xcd\x5f\xbe\x8b\x0c\xc0"
+ "\xb9\xb1\x53\x6a\x09\xc1\x3e\x7c\x4a\xbb\x0b\x4c\x69\xec\x4d\x62"
+ "\xed\x72\xba\xc6\xf2\x5e\xff\xae\x93\x6f\x12\x72\x54\x63\x24\xda"
+ "\x38\xe8\xcb\xeb\x6a\x88\xd6\xc8\x18\x4a\x52\x7e\x22\xc0\x3d\xb5"
+ "\xb4\xed\x6e\x91\x29\x73\x08\xc1\x39\x83\xd6\x9f\x35\xa4\x63\x24"
+ "\xf1\x4a\x3c\x43\xfc\x93\xab\x99\x1a\xcb\xfa\x34\x9d\x36\x89\xa8"
+ "\x76\xd5\x55\x50\xed\xe9\x71\xf3\xd4\x41\x9c\x9f\x5a\x1f\x4a\xde"
+ "\x30\x73\xfd\x51\xd6\x7a\x53\x72\x14\xe9\x8e\xf7\xd3\x99\xd5\x5e"
+ "\x37\x63\xa0\xdd\x4c\xca\xf8\xf9\xe6\x50\x36\x9e\xeb\xd3\x83\x77"
+ "\xcd\x36\x81\x6e\x1d\xad\x4f\x9e\xc3\xd4\xa0\xae\x83\xfe\x85\xd5"
+ "\x82\xa5\x35\x66\xd0\x56\x11\xd0\x7f\xeb\xc9\x57\x55\xf9\x2a\x6b"
+ "\xf6\x68\xbd\xc2\xdf\xc8\x65\xfb\x6d\xec\x4b\xa1\xee\x21\x1a\x92"
+ "\xc2\xd6\x1f\xfa\xcc\xce\x71\xa8\xa7\x98\x0b\x58\xff\x43\x70\xaf"
+ "\x4c\xef\x1d\xc1\x70\x7d\x00\xf6\x9f\x53\x2a\x75\xa4\xc8\x64\x21"
+ "\x1b\xaf\xb0\x6d\xd4\x1e\xda\xc8\x0b\x62\x6e\x84\x76\xf2\x96\x8a"
+ "\x1b\xc6\xcc\x9a\x79\xba\xc6\xea\x49\x63\xc3\xc6\xc5\x48\xe3\x32"
+ "\x79\x3e\x81\x7e\x14\x62\xb3\x86\xc6\xc6\xea\x97\x5d\x86\xb1\x51"
+ "\x76\x1f\xb7\x22\xe4\xfa\x17\xfc\x6d\x06\xf0\x81\xb8\xb0\xfa\x66"
+ "\x97\xe1\x6f\x63\x1d\xf0\xfd\x19\xe2\x60\xca\xf2\x0b\x4c\x49\x6c"
+ "\x0d\x29\x85\xfb\x61\xba\x08\xeb\x60\x56\x5a\x87\x1a\xb9\x3a\xa4"
+ "\x3d\x03\xb8\x7d\x06\x70\xfb\x0c\xe0\x56\x4f\x71\x7b\xa2\x92\xe2"
+ "\xd6\x02\xf5\x6a\x00\xed\xbe\x34\x84\xa8\xb0\x5e\x3b\xcf\xe2\x1a"
+ "\x7d\x50\xcf\x1a\x1e\xbb\x93\xae\x42\x1b\xd9\xf0\xeb\xd9\xbf\x2b"
+ "\xb6\x4f\x89\xb1\x82\x24\x23\x7e\x1b\xa5\xf0\x6b\xd2\x4d\x99\x05"
+ "\xb1\xf9\x0b\xe0\xf7\x47\x0d\xf1\xa9\x26\x5e\x49\x21\x80\xdf\x1a"
+ "\x29\xfc\x9a\xd6\x1c\x80\xdf\x74\xc0\xef\x1c\x21\x7e\x4d\x03\x95"
+ "\xe3\xb7\xde\xd4\x84\xdf\xd7\x39\xfc\x46\xd9\xe1\xb7\x5a\x80\x5f"
+ "\xbc\x6f\xc5\xf8\x35\x85\x29\xc3\x6f\xbd\xbe\x09\xbf\xe0\x4b\x36"
+ "\xbe\xc5\xb6\x51\x7b\x68\x23\xc0\x6f\xfd\xe7\xd0\x4e\x92\xf8\xbd"
+ "\xfb\xf1\x6b\x4c\x71\x3d\x7e\x8d\x53\x9b\x8f\x5f\xc3\x55\xe5\xf1"
+ "\x6b\xd8\xd7\xfa\xf1\x6b\xec\xa9\x2c\x7e\x0d\xf9\xf2\xf1\x6b\x88"
+ "\x6b\x3b\xf1\x33\x07\xb9\x1e\x3f\x73\x97\xe6\xe3\x77\xbb\x50\x79"
+ "\xfc\x6e\xc7\xb7\x7e\xfc\x6e\x57\x2a\x8b\xdf\xed\x70\xf9\xf8\xdd"
+ "\x7e\x56\x2e\x7e\xa3\xbb\x5b\x19\x2b\x8e\x9b\xeb\x96\x18\x88\x1a"
+ "\x88\xea\x35\x4b\x47\xf4\x8c\xf0\xd9\xcb\xf6\x99\xd5\x54\xe0\xab"
+ "\xed\x3e\xfb\xd8\x7d\x56\xdb\x7d\xf6\xb5\xfb\xec\x6f\xf7\xb9\xa7"
+ "\xed\x33\xc4\xab\xdd\x35\x0f\x73\x12\x78\xb6\x14\xbd\x87\xc5\x9f"
+ "\x3b\xdf\xe7\x0d\x4b\x00\xfa\xbe\x3e\x52\x75\xcf\x48\x65\x4c\x1d"
+ "\x3d\x08\x73\x5b\xc5\x90\x58\x2d\xf9\xed\x15\x0f\x4b\x5a\x63\x2a"
+ "\x58\x42\xcf\x1e\x1a\xa6\x31\x85\x58\xb3\xc6\xf8\x4e\x5e\x02\xf8"
+ "\x32\x80\x4f\x4c\xf6\x6f\x0f\x65\xff\x06\xda\xcd\x50\x12\x6b\x00"
+ "\x5d\xfe\x15\x53\xe5\x61\x59\x82\xf7\xf9\x4c\xac\x8e\x58\x3d\xfb"
+ "\x63\xde\xca\xc3\x9a\x3d\xc6\xd7\xe0\xd9\xbf\x07\xf8\x52\xfd\xea"
+ "\x54\xab\x77\x69\x6d\x39\x49\x57\x59\x03\x12\x13\x41\xd7\xd7\x7e"
+ "\x4e\x96\xd6\x32\x35\x89\x66\xc6\x54\x1a\xa6\xc3\xf7\xb6\x35\xa5"
+ "\xf1\xc7\x48\x89\xa1\x9c\x60\x9f\x87\x58\x2d\x35\x7c\x4e\xdf\x13"
+ "\xe3\x35\x70\xac\xc4\xb0\x93\x14\xc3\x67\xdd\xbc\x4b\x70\x9f\xd6"
+ "\x7e\xa5\xb5\x3b\x89\x25\x6b\x8c\xda\xea\x3b\xda\xc8\xf8\x8e\x36"
+ "\x15\xd7\x42\xdd\xb2\x46\x9b\xb1\xae\x25\x50\x0f\x76\x8f\xce\xec"
+ "\xd1\x66\xb6\x5c\x63\x19\x9b\x43\xb0\x64\xc3\xf5\x7e\x70\xbd\xdf"
+ "\x68\x13\xd6\x0f\xeb\x26\xe9\xf7\xb2\x12\x23\xa0\xee\xcf\x87\x68"
+ "\xbc\x08\xb3\xcc\xcb\x5f\x19\xde\xac\x13\x65\x7d\x64\x56\x62\x35"
+ "\x2d\xd7\xdb\x9d\x72\x65\xc7\x3f\x31\x59\x49\x5c\x7d\xd5\xee\x94"
+ "\x6b\x76\x52\x2e\x57\xdf\x00\x37\xca\x65\xa6\xc9\x97\xab\xe5\xea"
+ "\x1b\xe4\x4e\xb9\x3b\x9d\x94\xcb\xd5\x37\x45\x79\xb9\x2a\xe2\xe5"
+ "\x24\x6e\x11\x6e\x61\x41\x45\x42\x9d\x61\xc1\x2d\x1c\xa8\x88\x93"
+ "\xfb\x4f\x8a\x70\x0b\x03\x2a\x0f\xd9\xfc\x37\x62\xc0\xad\xf8\xab"
+ "\x3c\x9c\xc6\xdf\xad\xd8\xab\x3c\x64\xf7\x7f\xc4\xd8\xbb\x17\x77"
+ "\x0f\x59\xfc\xa3\x37\x86\x38\x01\xa7\xef\x08\xb2\xae\x9f\x48\xac"
+ "\xdd\x12\x55\xef\x59\x83\xc8\xe8\x24\xe8\xf3\x72\x48\x97\xd1\x9b"
+ "\x2e\x30\x41\x98\x73\x52\xa9\xb2\x92\x72\x89\x2a\x53\x65\x55\x15"
+ "\x26\x54\xa8\x4a\xcd\x43\x91\xb7\x2c\x5b\x17\x99\x3c\x9e\x84\xe3"
+ "\x87\x23\x09\x31\xbe\xab\x21\xb4\xac\x89\x24\x5d\x1b\x44\xa6\x58"
+ "\x08\xe6\x38\x8c\x93\xe7\x5f\x60\xbe\x4e\x04\x8d\x7f\x1d\xf8\x35"
+ "\xc7\x84\x7d\x69\x17\xf8\xae\x19\x70\x0c\xe5\x98\xc8\x6e\xab\xc1"
+ "\x63\xb2\x81\xbd\xd6\x00\x7e\xd4\xc0\xac\x4f\x64\xfb\x64\x26\x59"
+ "\x43\xde\x87\xcf\x97\x55\x9e\xed\x3c\x0d\x44\xb5\x19\xbc\x6a\xfd"
+ "\x2a\x4f\xa2\x57\x79\x56\xa2\x7f\x05\x9f\x5c\x9b\x7c\x1d\xf3\xf9"
+ "\x3b\x82\x76\x59\x0d\xaa\xf7\xc0\x37\xe3\xf5\xcf\xc4\x12\xd5\xd7"
+ "\x50\x1e\x5c\x3b\xe0\x70\x1c\x21\x4e\xf2\x39\x5e\x56\xdf\xac\x31"
+ "\xf8\x7d\x2c\x07\xf3\xa4\x19\x56\x68\x67\xdf\xf5\x26\xac\x37\x93"
+ "\x95\xbc\x4f\x97\x00\x7d\x8e\xca\xf3\xf3\xb1\xfd\x98\x7a\xec\x43"
+ "\xa0\xef\xe8\x71\x05\x3e\xb3\xf9\x80\x54\xa6\x8c\xf1\x1d\x55\xc3"
+ "\xa4\x77\x0c\x2a\x31\xd6\x11\xdd\xa2\x46\x52\xa5\xf2\xfc\x02\x7f"
+ "\xfb\x86\x6f\x56\x90\xd1\x37\x6b\x1c\xd4\x61\x8f\xad\xbe\xf8\x5b"
+ "\xb6\xe3\x98\xff\xe0\xea\x58\x76\x38\x51\xbe\x8e\xcc\x7b\x3d\xba"
+ "\x4e\xf1\x67\x0c\xd8\x96\x3a\x6d\x1d\xd4\xa5\xdd\x58\x6c\x6f\x26"
+ "\x2b\x4b\x6d\x4c\xd6\xf4\x62\xf3\x81\x2a\xaf\x68\xcc\x2b\x31\x59"
+ "\x63\x68\x7e\x3b\x7b\x0c\x3b\x56\x07\xb9\x1f\x34\x40\x05\x6a\xa1"
+ "\x6b\x2a\x2f\x36\x1f\x18\xa2\x51\x29\xf3\x53\x2a\x2f\xd6\xff\xea"
+ "\x7a\x61\x3b\xb4\x1b\x08\xbf\xf7\x42\x95\xca\x2b\x93\xe6\x38\xc6"
+ "\xf8\xe3\xef\xc1\x35\x3d\xe1\x37\xfd\x99\xac\x51\x7a\xbc\x0e\xce"
+ "\xef\xe1\xce\x07\x08\xce\x07\x40\x9d\x43\xb9\xf3\x65\xdc\xf9\x3e"
+ "\x82\xf3\x7d\x62\x7b\x11\x8f\x2b\x2a\x2f\x13\xde\x13\xe3\x3b\x06"
+ "\xef\xc7\x17\xdf\x27\xb0\xf7\xe4\x37\x86\x70\xd7\xf9\xd6\xaa\xda"
+ "\x75\xb9\x01\xf8\x82\xf3\x3d\x05\xdf\xef\xf9\x75\x7c\x20\x19\xbd"
+ "\x09\xdb\xb4\x5d\x1f\xbd\xd7\x8b\x03\xd8\x3c\x91\xca\x2b\x80\x6d"
+ "\x0b\xe8\x3f\x85\xe5\xc1\x71\x03\xf6\x91\x46\xd0\x91\xf0\x7f\xcc"
+ "\xb5\x8a\x72\x1d\x73\x16\x2c\x78\x67\x41\x40\xdf\x88\x80\x88\x98"
+ "\x59\x01\x6f\xbe\xb3\x70\x5e\xdc\x88\xbe\x11\x0f\x13\x22\xc0\x8e"
+ "\x9a\x49\xed\xcc\x58\xb3\x32\x56\x94\xe6\x80\x7e\x53\xa9\xa1\x2f"
+ "\x6f\x24\x59\x10\x57\x4b\xb7\xbc\x58\xcb\xfa\x3c\x78\x96\x52\xc2"
+ "\x75\x09\xa3\xa0\xed\xdb\xb1\xef\x01\x4a\x03\x08\x49\x83\xf3\xba"
+ "\x84\x13\x78\xec\x38\x7b\x0c\x1c\x33\x9b\x0b\x4b\xf0\x26\x47\x02"
+ "\xea\xd8\x7c\xda\x35\x55\x7b\x0f\x36\x77\x78\x93\xa8\xcc\xa9\xde"
+ "\xe4\xbf\xb5\x65\xaa\x03\x56\xbd\xea\xbf\xad\x15\x2a\xd4\x20\x5f"
+ "\xfb\x1f\x23\x83\xe2\xbd\x09\x9e\xff\x4a\x0b\xc7\xe1\x3c\x9e\x63"
+ "\xcb\x61\x63\xdd\x7e\x2a\x5e\x87\xf9\x35\xfc\x7f\x72\x0e\x73\xf1"
+ "\x6b\x7f\xd0\x31\xa8\x89\x55\xed\xb6\x61\x5d\x03\x7a\x10\x02\xed"
+ "\xb8\x1d\xeb\xa7\x57\xb5\x2b\xf0\xcc\x85\xeb\x17\x11\x1f\xb8\x3e"
+ "\xdb\x9a\x9d\xb1\x02\x79\xc1\xbc\xaa\x5d\x18\x93\xda\x75\xe0\xe6"
+ "\xb5\xc4\x3b\x77\x2d\x3c\x9f\x6b\x89\x57\xfd\xaa\xf6\x29\x7a\xaf"
+ "\xb0\x5a\x6c\x5b\x28\xc6\xe7\x86\x8a\xfc\x11\x8e\x65\xe9\xc9\xce"
+ "\x68\x3c\x06\xcf\x9f\x5c\x7e\xd8\xe7\x16\x68\x47\x53\x9f\x68\x62"
+ "\xf5\xcd\x88\x67\xa0\xdd\xea\xfb\x44\x07\x76\x8e\x05\x6c\xc1\x33"
+ "\xc6\xf8\x65\xc4\xd7\xaa\xbc\x0b\xfe\xf5\x2c\x21\x5a\x7c\xa6\xd7"
+ "\xa7\x84\xef\xb8\x65\x82\x67\x3b\x2f\x76\xe7\x2d\x03\x7c\xce\x23"
+ "\x05\xf0\xf9\xb8\xae\x80\x04\x4c\x06\x3d\xa6\x7a\xa8\xc3\xcb\x11"
+ "\x8c\xb9\x5f\x11\x68\xd8\xea\xcf\xc8\xc9\xf2\x63\xc4\x27\x8c\x78"
+ "\x36\xad\x23\x1f\x47\x54\x53\xf4\xf0\x79\x21\x51\x95\x98\x2c\xec"
+ "\x3b\x03\xed\x30\xcc\xfd\x17\x13\x7c\x1f\xc0\xa8\x76\xc5\x15\xd6"
+ "\x99\x80\xcb\x6a\xda\xe1\x78\x72\xab\xfa\xfb\x1a\xfc\xce\x1b\x46"
+ "\xee\x3d\xda\x0d\xee\x3d\xda\x0d\xf6\x3d\x5a\x74\x62\x38\x7d\x8f"
+ "\x86\xef\xcf\xa6\x84\x7b\x32\x58\x1e\xbe\x53\xeb\x68\x04\x1c\xbc"
+ "\xab\xe9\x64\x79\x57\xd3\x35\xa7\x8e\xf8\x96\x18\x6a\x48\x69\xed"
+ "\x31\xf2\xd1\x22\xe2\xcb\xdc\x88\xec\x50\xa4\x3b\x41\x98\xb5\xdf"
+ "\xe9\x77\x6b\x75\xed\x2c\x98\xff\xb8\xe1\xff\x70\xe7\x65\x1e\xf8"
+ "\x9c\x76\x4a\x5b\x40\x06\xe4\xd5\x91\xc0\x37\x2e\xa5\xb0\x6b\x4a"
+ "\xe1\xfe\x7f\xe6\x1b\x9a\x80\xdb\x37\x34\x4f\x34\xdc\xd0\xf4\xea"
+ "\x6c\xa0\xef\xdd\x66\x5c\x55\x13\x1c\xcb\xcb\x7c\x70\x6b\x67\x1e"
+ "\xe6\xbf\x8d\x06\x62\xee\xf2\x7d\x0d\x62\x19\x7e\xbb\x27\xbe\xab"
+ "\x49\x5e\x42\xd4\xd6\x1f\x34\xa4\x38\xb2\x8e\x0c\x82\xd8\xe3\x7b"
+ "\x89\xcd\x55\xf4\xbd\x84\x05\xfc\x12\xbe\x9b\xb8\x75\x43\xa3\x62"
+ "\x7c\xb3\xf5\x93\xa2\x02\x48\xc3\xb6\x68\xc0\xeb\x0e\x92\xdc\xc0"
+ "\x5c\x2c\x7d\xdf\x4a\x30\x67\xcd\xac\x6a\xbf\x93\xf1\xcb\xd6\x1f"
+ "\xd5\x9c\xc6\x3e\xe6\x59\x9e\x3b\xbc\x17\xba\xc7\x1d\xde\xec\xbb"
+ "\x04\x7c\x87\x07\xf1\x8b\xdd\x59\x87\xf1\x84\xb8\xd6\x19\x54\x13"
+ "\x20\x76\xc5\xd5\x1f\x43\xdc\x2a\x44\x71\x63\xe3\x0c\xd7\x5d\x8e"
+ "\x80\x78\x5d\xa2\x31\x2c\x32\x42\xfc\xf6\x63\x19\x59\x29\x85\x8b"
+ "\x4c\x2a\xf0\x64\xaa\x22\xd3\x39\x76\x3e\x0c\xc6\x71\x67\xe3\xb1"
+ "\x76\x0d\xd0\xef\xe0\xbb\xd0\x5b\x5b\xa3\x03\x1a\x7c\x33\x42\x6f"
+ "\xfb\x66\x44\x3a\x79\x2f\x4a\xe3\x19\x45\xbc\x8b\xaa\x4f\xd3\x78"
+ "\xce\xe7\xe2\x89\xe3\xe7\x16\x6b\x3a\x99\xeb\x21\x9e\xb7\x20\x9e"
+ "\x71\x7a\xb2\x71\x01\xf1\x2d\xad\xa9\xc0\x77\x46\x1d\xc6\x17\x13"
+ "\x32\xa1\x1f\x63\x2d\xd6\x9d\x65\xe3\xba\x0b\xe2\x6a\xce\x3c\x5d"
+ "\x83\xef\x4a\x9b\xe2\xba\x08\xe2\x7a\x0b\xe2\x7a\x95\x8f\xab\xa5"
+ "\x1e\xe2\x5a\x0f\x71\xad\x87\xb8\x72\xef\x53\x67\x44\x41\x5c\xf1"
+ "\xdd\xdb\x07\xf5\x81\xf8\x3e\x15\xdf\x5b\x61\x5c\x71\xcc\xb6\x75"
+ "\xb1\xa6\x27\xfb\x1e\xf5\x4d\x0d\xc9\x9b\x4d\xbc\x07\x9a\x88\x47"
+ "\xf2\x7e\xa2\x86\x7a\xaa\x9f\xfa\x9c\xa8\xa0\x3c\xc0\x7d\x15\xc1"
+ "\xf8\x96\x7e\x6e\x21\x4b\x5f\x23\xbd\xcc\x6b\x68\x9c\x4b\xcd\x5f"
+ "\x60\xde\x78\xe8\xad\xc5\x1a\xd5\x86\x45\x64\x38\xc6\x7c\xe2\xa5"
+ "\x00\x72\x34\xb8\xd8\x21\xe6\xd6\xec\x2c\x35\xc4\x29\x1c\xe3\xee"
+ "\xfe\x73\xeb\x13\xee\xfa\x73\xfb\xf0\xe1\x07\xcf\x6d\x4b\x3f\xb7"
+ "\x0f\x47\x48\x3f\xb7\x3e\x03\xdd\x7b\x6e\x7d\x06\x3c\x78\x6e\xef"
+ "\x87\xe7\xd6\xc7\xdf\xfe\xb9\x6d\xd2\x2d\x0b\xe6\xc4\xcc\x8a\x9a"
+ "\x17\x35\xef\x2f\x01\xb3\x97\xc4\xcd\x79\x97\xaa\x17\x91\x7e\xd1"
+ "\x58\xac\x41\xaa\x75\xd0\x5f\x9f\xf4\xaf\x20\xbb\x7b\x54\xa8\xac"
+ "\xd3\xfd\xbd\x98\xcc\xba\x40\x6b\x66\xdd\x9e\x75\xa0\xc5\xf1\xf9"
+ "\xce\x02\x8d\x7d\x59\xe5\xff\xfe\xbf\x7b\x82\xfe\x5c\x70\x85\xe0"
+ "\xff\xe9\xfb\xe1\xdd\xb1\x38\x87\x32\x67\x3d\x53\x83\x73\x28\x8f"
+ "\x1f\x41\x6d\xd1\xe9\xf4\x23\xa1\xe0\x27\xa6\xfb\x93\x86\xe9\xa1"
+ "\xaa\x55\x67\x89\x77\xe7\x0a\x32\xd1\x6a\x65\x18\x9d\xf6\x0a\xe8"
+ "\x3e\xbf\x22\xdd\xeb\x57\x08\x6a\x9d\xcb\x2a\xdf\x81\x01\x09\xcb"
+ "\xf0\xdf\x2e\x01\x09\x1f\x5c\xb8\xac\x7a\xf4\x14\x9b\xc7\xe9\xc6"
+ "\xd4\x30\xeb\xd3\xcb\x2c\x9f\xcc\x0b\xc6\x77\xa7\x79\xdd\x98\xea"
+ "\x5d\xe0\x37\x76\x35\x9a\x54\xef\x2d\xc0\x31\xe8\x8f\x33\xf8\x0e"
+ "\x14\xdb\xe0\xbd\x3a\xf0\x13\xef\x73\x79\x28\xd5\xa3\x23\xf0\xf9"
+ "\x02\x7d\x55\x7d\xe8\x72\x85\x0a\x9f\x37\xa3\xef\x28\xfd\xfb\x70"
+ "\x1f\x50\x47\xfd\x86\xf5\x4c\xa5\xc1\x2f\x63\x85\x57\x00\x51\xd5"
+ "\xaf\xea\x3c\x06\x34\x4f\x1c\xea\x95\x15\x70\x6e\x25\x9c\x63\xdf"
+ "\x45\xaa\xba\x9a\x98\x87\x3b\xf9\x22\xc7\x01\xa6\x3d\xae\xa9\x3a"
+ "\xaf\xc1\x35\xa4\xd2\xa8\x2f\xa9\x31\x65\x67\x44\x9a\xb7\x45\x07"
+ "\x98\x51\x4f\xf6\x8d\x0e\x6c\xc8\xce\x08\x35\x67\x67\xc4\x87\xf4"
+ "\x63\xdf\xb9\xc3\xf5\x5d\xe6\xe0\x3d\x34\x64\xa5\x84\xc3\xf5\xc6"
+ "\x1b\xbe\x79\xb1\x37\xb2\xf2\xc8\x89\xf8\x1c\x12\xf0\x0a\x72\x5f"
+ "\xe7\x83\x13\x72\x18\x73\xff\x60\xe0\xbe\x9c\x1d\xe4\xe4\x44\xe0"
+ "\xbe\x50\x47\xee\xa3\x63\x14\x2c\x84\x72\x60\x31\x81\xb2\xaa\xf1"
+ "\x19\x42\x8d\x5a\x08\xed\x80\xcf\x07\x3e\x07\x2c\x17\x02\x0f\xda"
+ "\x9e\x15\x7c\x8e\x90\xeb\xd8\xe7\xd6\xee\xb9\xc1\x67\xe5\x11\x03"
+ "\x51\xe3\xb3\x82\x5c\x88\xcf\x0a\x8e\xfd\x59\xc7\x3d\x2b\x9d\x2b"
+ "\x89\x7a\x23\xf0\x60\xa9\xf9\x18\xfb\xbc\xa0\x96\x2c\x32\x0b\x38"
+ "\x10\xdf\x1b\x09\x9e\x95\xd5\xb6\x67\xc5\xc6\x81\xf0\x3c\x98\xf1"
+ "\x59\x59\xac\x79\xa2\x71\x31\xff\xac\x4c\x3f\xa7\x26\x2c\x3f\x7e"
+ "\x70\x2b\x30\x17\x9e\x15\xcc\xa7\x59\x6c\x1c\x08\xcf\x0a\xce\x4d"
+ "\x62\x39\xf0\x6d\xe0\xc0\x5a\xe0\x40\x03\x1c\x87\x67\x64\xf3\x5c"
+ "\x8e\x03\xb9\x67\xa3\x61\x31\xc7\x81\x57\x03\x48\x63\x5f\xe4\xc0"
+ "\x8d\x32\xda\xe5\x9c\x1d\x07\x76\x19\xec\x1e\x07\x76\x09\xc4\xef"
+ "\x61\x0c\x1b\x21\x9e\x18\xc7\x09\xfe\x8c\xb9\x28\x07\xb8\x6f\x5a"
+ "\x1b\x8b\xdb\x02\xe9\xb8\xed\xe2\xfa\x2e\x49\x8e\x93\x88\x1b\xe0"
+ "\xbc\xd6\x5c\xef\x18\x3b\xe6\x03\x63\xbc\x90\xe7\x90\xdf\x90\xeb"
+ "\x90\xe3\x90\xef\xf0\xf9\x40\x9e\x43\x8e\xfb\x1d\xf0\x3f\x7c\xae"
+ "\x29\x8e\xac\x62\xf9\x2f\xf9\x12\x51\x27\x8f\x25\xbd\x4a\xf7\x59"
+ "\xc0\xdb\xdc\x24\xc8\x7f\xc2\xbe\x0d\xf9\x0e\x63\xbb\xe1\x16\xe5"
+ "\x3b\xec\xe3\x90\xdb\x1c\xfa\x38\x88\x2d\xc4\xa4\x27\xf6\x71\x6c"
+ "\xce\x22\xd5\xb7\x7b\x5e\x57\xea\x49\xb2\xba\x12\xef\xfa\x55\x8f"
+ "\xfa\x3b\xfa\x92\x47\x07\xd8\x7c\x09\x3e\xe3\xf8\xac\xeb\x55\x9d"
+ "\x43\xa9\xf7\x4c\xdb\x43\xfd\x50\x77\xba\xb7\x10\x78\x7e\xde\xef"
+ "\x3f\x1a\x43\xc7\x05\x80\xbf\xf7\x4b\xde\xc7\x64\x8f\xaa\xc1\x76"
+ "\xc5\xfb\x7c\xa3\x1f\xe0\x32\x3b\x2b\x28\x03\xdb\x2a\x3b\x6b\x0c"
+ "\xfc\x7f\x1c\x8f\xb5\x47\x37\x1d\x8d\x27\x24\x24\x5e\x29\xd6\x1e"
+ "\x65\xdf\xff\x32\xdf\x87\x3e\xca\x4c\x0f\xf5\xb2\x7e\x1f\xda\x0e"
+ "\x70\xe1\xff\x8e\x25\x85\xdc\xca\xdc\x1d\x99\x6c\x66\x6a\x02\x12"
+ "\x48\x7f\xa8\x97\xe5\xb8\x99\x90\xe3\x46\xe0\xbd\x89\xd1\x10\xe3"
+ "\x5d\x35\xbb\xad\x06\x2f\xbd\xaa\x53\x39\xf8\xc5\x1a\xe0\x5e\x2f"
+ "\x21\xf7\x52\x9e\xed\xc4\xae\x11\x66\xca\xdc\x1d\x8f\x65\x4d\x39"
+ "\x46\x3a\x43\xff\xeb\x75\x59\xe5\xb7\x69\x49\x12\xc1\xb9\xb4\xed"
+ "\xe0\xff\x51\x8d\x5d\xb5\xf8\xfd\x4e\xcc\xf7\xd3\x3c\x62\x5f\x24"
+ "\xbd\x98\xe9\xd3\x3c\x70\x1c\xc4\x76\x6b\xbe\xca\x0a\xc7\xe8\xb8"
+ "\xaa\x7c\x82\xe7\xd3\x1a\xbd\x58\x5d\x66\x85\x6b\x4a\x8c\xf9\x24"
+ "\x6d\x91\x37\xc1\xeb\xe9\x58\xbd\x7c\x82\xd7\xaf\x5e\xa0\x66\xc7"
+ "\x51\xb0\xdf\x33\xe7\x13\xfc\xae\x05\x8e\x7f\x68\xf5\x21\xe9\x09"
+ "\xbe\xe4\x78\x51\x09\x5b\xc6\xf1\xa2\x7f\x11\x2c\x03\xf0\x0f\xff"
+ "\x3f\x44\x32\x16\xf9\x03\x0f\xe4\xc3\xf9\x6f\x49\xc6\xb5\x9e\xf0"
+ "\xef\x65\xf8\xbb\x45\xae\xa8\xfc\x7c\x8e\x17\x59\x49\xe7\x65\x7f"
+ "\x64\x00\xc7\x4c\x29\xce\xcf\xd4\x92\xf6\x50\x77\xbf\xd2\x8a\x4c"
+ "\xf0\xb0\x8f\x9a\x71\xfe\x3e\x93\x3c\xbd\xd6\xca\x4c\xbf\x6a\x4d"
+ "\x9e\x7e\x0d\x7f\xdb\xc2\x4c\xff\x05\x7f\x7b\x75\x42\x00\x37\x76"
+ "\x37\x9f\x1d\x67\x98\x76\xab\x0f\xc1\xba\xe2\xef\xe2\xef\x65\x2c"
+ "\xd0\x70\xbf\x39\x80\xad\x1b\xfe\x26\x96\x29\xfc\xcd\x13\xf8\x9b"
+ "\x7f\x66\x7f\x73\x25\xfc\xdb\x05\xfa\x2e\x36\x0e\xf8\xfb\x56\x26"
+ "\xb4\x1d\x93\x1c\xea\xc9\x7e\xc7\x54\x23\xf5\x9d\x83\xf4\x3b\x8f"
+ "\xb2\xb9\x38\xfc\x4e\x03\x83\xd7\xd3\x32\xa0\x6f\x3c\x83\xc7\x9f"
+ "\x0e\xd5\x11\xc7\x18\x76\x5b\x48\xfb\xca\x6e\x63\x69\x5f\x49\x63"
+ "\xca\x62\x65\x7a\x68\x3b\x88\x9b\x1a\xfb\xd5\x2a\x55\xb7\xc7\x9a"
+ "\xca\xf8\x3e\xd4\x13\xe3\x8d\xb8\xb1\x61\x09\x71\x64\xc3\x10\x5b"
+ "\x4f\x03\x21\x42\xcc\xc0\xff\xbd\xb9\x72\xe6\xd8\xca\x81\x3a\x10"
+ "\x1b\x8e\x9e\x86\xf3\x8e\x38\xf2\x1f\xc1\xe3\xe8\x37\xe7\x4c\x5a"
+ "\x86\x41\x1c\xe9\x5e\x4f\xc5\x72\x0a\xf9\xfa\x4c\xf3\x40\x8c\xdd"
+ "\x67\xd8\xf2\xc1\x38\x3d\x9d\x48\x7c\xe9\xfd\xfc\x26\x89\xbd\x9f"
+ "\x44\x9d\x2f\xd6\xd5\x76\x1f\x58\x87\x74\x6b\x00\xb1\xdd\x47\x46"
+ "\x63\x1f\x28\xf7\x1a\xe1\xbe\xb3\x17\xcb\xb6\xb5\x01\xc4\x8c\xd8"
+ "\xbe\x63\xbb\x3e\xdd\xaa\x81\x7a\x0f\x60\xbf\x43\x31\x77\x59\x02"
+ "\x3f\xbf\xb1\xd8\x63\xee\x91\x44\x02\x02\x18\xb4\xd5\xeb\x75\xf0"
+ "\x3b\xfe\xdd\x69\xdd\xbe\xb2\x34\x7c\x1f\x8a\x71\x55\x71\xc7\x07"
+ "\x0b\x30\xc1\x95\x6f\x92\x28\xdf\x7f\x86\xa8\xfc\x50\x28\x3f\x1e"
+ "\xca\x47\xed\xf6\x3a\xe6\xec\xfc\xd9\x75\x60\x9e\x8e\xa7\xe5\xdb"
+ "\x70\xcb\x64\x26\x18\x63\x13\xc8\x43\x57\x54\xdd\x03\x28\x9f\x76"
+ "\x62\xdb\x88\x1d\x63\xa5\xb2\xe6\x5b\xed\xc6\x58\x09\xc7\xe0\xed"
+ "\xd6\x1a\xe8\xf8\x2a\x55\x77\x76\x4f\x2b\xcc\x8d\xa1\x06\x2d\x04"
+ "\xfd\xc6\x8f\xb1\x3a\x8b\xe7\x3b\xe8\x16\x55\xf1\x63\xac\x54\xfe"
+ "\xec\xfb\x4e\xbd\xaa\xfb\xb3\xf5\x2a\xa2\x82\xcf\x06\x7a\xbc\x53"
+ "\xa2\xf0\x78\xd3\x18\x46\xee\x38\x8e\x0f\xe7\x72\xc4\xb5\x5f\xef"
+ "\xc3\x3c\x61\xf7\x89\xb6\xdc\xac\x8c\xf7\x55\xa0\x91\x9f\xd4\xf1"
+ "\x1a\xf9\x49\x9d\xbc\x46\xee\xde\xe0\x5c\x23\xf7\xf6\xe6\x35\xf2"
+ "\xe3\x51\xf4\xb9\x7f\x7c\x12\x7d\xee\x1f\x67\xdf\x85\xa6\x43\x79"
+ "\xe6\x8f\x77\x84\x33\x9f\x44\x1b\x10\xe7\x9b\x41\xf3\xee\x5e\x74"
+ "\x4c\xb5\x0b\x3c\x96\x05\xf4\xf1\x7b\x09\xc4\x0b\xd7\x96\x7b\x0f"
+ "\xda\xb0\xd4\x5c\x49\x8a\xbd\x50\x23\x7f\x03\xe5\xf4\x5a\x52\x82"
+ "\xef\x37\xb3\x92\x75\xb4\x5d\x7a\x84\x40\x2c\x3c\x4b\x4d\x26\xf6"
+ "\x3a\x3c\x07\xfd\x5a\x35\xea\xe4\x43\xd6\x63\xaa\x4d\x09\xa8\xa1"
+ "\x77\x04\x0a\x35\x74\xfd\xaa\x1e\x29\xd2\xda\xb9\xd7\xb3\xe6\x55"
+ "\x42\xed\xdc\xa3\x18\xb5\x33\xe6\xf3\x51\x0f\x58\xa9\x66\x0e\x00"
+ "\xfd\x1c\x88\x3a\x1a\xb5\xb3\x55\xa4\x9d\x7b\x6e\x71\xae\x9d\x7b"
+ "\x34\x3c\xd0\xce\xad\xa5\x9d\x6d\xf9\x03\x7b\xed\xdc\x33\xc6\x3d"
+ "\xed\xdc\x33\xfa\x81\x76\x6e\x6b\xda\xb9\x67\xa8\x4d\x3b\x5b\x53"
+ "\x7d\xdb\x63\x3e\x7f\x73\x93\x76\xee\x35\xcd\x51\x3b\xf7\x8a\x74"
+ "\xd4\xce\x3d\xb2\xc4\xda\xb9\xcf\x7c\x47\xed\xdc\x6b\xbb\x9c\x76"
+ "\x06\xde\xaa\x45\xed\x8c\xf8\x42\x1d\x8d\xfa\x19\xea\x3b\x8e\x62"
+ "\xad\xd7\x19\xf7\xb4\x73\xaf\x0a\xd7\xb4\xf3\xe3\xc3\xa4\xb5\x73"
+ "\x77\x93\xbc\x76\xee\x6e\x92\xd6\xce\x01\x67\x78\xcd\x13\xb0\xad"
+ "\xed\x6b\xe7\x80\x71\xd2\xfa\x26\x60\x2a\xd5\xce\x8f\x0f\x6d\x79"
+ "\xed\xfc\xf8\x50\x69\xed\x1c\x70\x94\xea\x8c\xc7\x87\x3b\x6a\x67"
+ "\xf8\x8e\xa4\x76\x0e\x68\xe0\xbe\x33\x54\xac\x9d\x69\x19\xd0\x67"
+ "\xfa\xc9\x6b\xe7\xde\x7b\x69\x1f\xda\x7b\x19\xed\x43\x69\x4c\x1d"
+ "\xb5\x73\xef\xd7\x9a\xd7\xce\x14\x43\x6c\x3d\x65\xb5\x73\xef\x2d"
+ "\x8e\xda\xb9\xbb\x49\x5a\x3b\x3f\xb9\x84\xc7\xd1\x93\xdd\xc5\xda"
+ "\xb9\xf7\x4f\xf7\x87\x76\x96\xc5\xd6\x38\xb1\x76\x7e\x62\xbf\x72"
+ "\xed\xfc\xc4\x55\x65\xda\x19\x31\x27\xa5\x9d\x9f\x1c\x66\x8f\x39"
+ "\xb1\x76\x7e\x32\x44\x5a\x3b\x3f\x19\x23\xd6\xce\x58\xbe\x94\x76"
+ "\x7e\x72\x83\xa8\x7c\x07\xed\xfc\xe4\x17\x62\xed\x4c\xaf\xe3\xb5"
+ "\x73\x9f\x30\x2e\x17\xb1\x45\xb9\x76\xee\x33\xc2\xb9\x76\xee\x33"
+ "\x56\xac\x9d\xfb\xf8\x53\x8d\xdc\x27\x96\x6a\xe7\x3e\x03\x38\x0d"
+ "\x9e\x2f\x3c\xce\x6b\x67\x7a\xdc\x51\x3b\xf7\x59\xd1\x8c\x76\x1e"
+ "\xea\xba\x76\x1e\x14\x7f\xac\x49\x3b\x0f\x8a\xb7\x69\x67\x2b\xe8"
+ "\xc7\xcd\xa0\x03\xe0\xaf\x06\xe7\x5a\xe0\x33\x77\x59\xd5\x77\x98"
+ "\x73\xfd\x3c\xe0\x73\x5e\x3f\x3f\xdd\x8e\x3e\xfb\xfd\x7f\xa2\xcf"
+ "\x7e\xff\xed\x4d\x39\x66\xd0\xce\xa8\xa1\xb9\x1c\x73\x79\x3a\xfc"
+ "\xed\x4e\x38\xc6\xea\xe7\x5d\x75\x26\x15\x6a\xe8\x95\x38\xee\x13"
+ "\x74\xf4\xd7\x9c\x86\x2e\x35\x0e\xe5\x74\x74\x7f\x3f\xe8\x33\xf4"
+ "\xe9\x5a\x76\x2e\x98\x37\xd4\xaf\x82\xd5\xcf\x71\x26\xf2\x5f\xb7"
+ "\x86\xe2\x7b\xf8\x0a\x9d\x96\x5e\x07\xf7\x59\xc9\xeb\xed\xbe\x47"
+ "\x45\x7a\x3b\x8e\xd5\xdb\xe5\xa8\xb7\xbf\x3e\x46\xc8\x21\x2d\xd5"
+ "\xdc\xa8\xb7\x51\x77\x83\xde\x2e\xdb\xd4\x8d\x29\xaa\x5f\xd5\xd7"
+ "\x68\xd3\xdc\xab\xe1\x33\xc4\x5a\x7f\x04\xa2\xb2\xe9\x2d\xe2\x05"
+ "\x31\xa9\x78\x0f\x7e\x03\xaf\xaf\x5f\xf5\x54\x4f\xdb\x75\xd0\x67"
+ "\x97\x51\x5d\xde\xaf\xdc\x2a\xca\x69\x3f\x15\x85\x9e\x84\xed\x8f"
+ "\xa1\x1d\x50\x67\xd9\x72\xda\xd6\xbe\xd1\x81\x8c\x1f\xd5\xe6\xe2"
+ "\xbc\xb6\x66\x84\x4d\x9b\xa7\x73\xda\xbc\xc1\x17\xb4\x79\xac\x4d"
+ "\x9b\x3f\x95\xed\xa6\x36\x2f\x67\x35\xde\x84\x96\xd7\x78\x1b\x16"
+ "\xdd\x7b\x6d\x8e\xba\x1c\xb5\x38\xea\x72\xd4\xe9\xa8\xcd\x51\xa7"
+ "\x5b\x39\x6d\x8e\xeb\x1e\x9a\xea\x9b\xd1\xe6\xa0\xdd\x98\x87\x1f"
+ "\x8e\x60\xb5\xb9\x87\x50\x9b\x6b\x3a\xb8\xa7\xcd\x35\xde\x42\x6d"
+ "\x8e\xb8\x57\xaa\xcd\x31\xf6\x0e\xef\x62\x71\x5f\x07\x88\x1f\xc6"
+ "\xca\xe9\xbb\x3b\x2e\x8e\x18\x37\x8c\x19\xc6\x4e\x36\x6e\x42\x6d"
+ "\x0e\xb8\x2b\x32\xdd\x3b\x6d\xae\xb1\xd3\xe6\xa8\xc5\xa1\xed\xaa"
+ "\x51\xa3\x97\xea\xa0\x6d\xe6\x83\x4e\x07\x8d\x6e\xaf\xcf\x31\xbe"
+ "\xae\xe9\xf3\xdf\x19\x9b\x72\xdb\x2a\xdf\xf6\x9b\x31\xb7\xdd\xd5"
+ "\xa6\xcf\xfb\x19\x1d\xf5\x79\x7f\x6f\x81\x3e\x2f\xd3\xab\x9e\x1a"
+ "\x20\xd6\xe6\x81\xfd\x1c\xb5\x79\xff\xb1\xb2\xda\xbc\x9b\x84\x36"
+ "\xf7\xb3\x69\xf3\xfe\x0b\xdd\xd3\xe6\xfd\xe3\xe4\xb4\x79\xbd\x5a"
+ "\xa8\xcd\xfb\x9f\xe6\xb5\x79\x9c\x40\x9b\xf7\x1d\x2a\xaf\xcd\xfb"
+ "\xd2\x79\x59\xea\xdd\xf1\x58\x16\x6a\x2a\x7c\x57\x18\x80\x73\xf6"
+ "\x55\x03\x96\xa3\xae\xc2\x5c\x06\xd4\x1f\xb4\xd5\x80\xa9\x42\x8d"
+ "\x8e\xef\x08\x9d\xe9\xa8\xd8\xb7\x48\x2f\xd4\x52\xa8\xa3\x6c\xba"
+ "\x17\xaf\x47\x3d\xd5\xba\x5a\xea\x69\x83\xb4\x96\x7a\xda\xc2\xea"
+ "\x64\x9c\xeb\xa9\xea\x5f\x8e\x7d\x62\xcb\x6a\xf5\xfe\xe5\xd2\x5a"
+ "\x7d\xc0\x7c\xaa\x6b\xfa\x57\x60\x5c\xc4\x5a\x1d\xbe\x23\xa9\xd5"
+ "\x07\x6c\xe3\xbe\x53\x2e\xd6\xea\xb4\x0c\xe8\x9f\x0f\xcb\x6b\xf5"
+ "\x81\x33\x68\x7f\x3d\x70\x20\xed\xaf\xb9\x18\x3b\x68\xf5\x81\xed"
+ "\x84\x5a\x1d\xe3\xef\xa8\xd5\x29\xa6\xd8\x7a\xca\x6a\xf5\x81\x93"
+ "\x1c\xb5\x7a\xdf\xa1\xa8\xd5\xa5\x71\x35\x68\xb0\x18\x57\xcf\x9c"
+ "\x32\x59\x6d\x9a\x7d\x15\x96\xb7\xc9\x5e\xb3\xdf\x87\x58\x33\xf0"
+ "\xba\x1d\xef\xe9\x99\xf9\xca\x74\x3b\xfb\x9d\x6d\xca\x74\x3b\xe2"
+ "\x4f\x4a\xb7\x3f\x73\xdd\x1e\x7f\x62\xdd\x3e\xa8\xa3\xb4\x6e\x1f"
+ "\xd4\x57\xac\xdb\xb1\x7c\x29\xdd\x3e\x68\xaa\xa8\x7c\x07\xdd\x3e"
+ "\x28\x46\xac\xdb\xe9\x75\xbc\x6e\x0f\xf4\xe5\xf2\x20\xe7\x94\xeb"
+ "\xf6\x41\x37\x9d\xeb\xf6\x41\x16\xb1\x6e\x1f\x54\x46\xf5\x79\xa0"
+ "\xc6\xc4\xea\xf6\x41\xd5\x9c\x9e\xaf\x14\x1e\xe7\x75\x3b\x3d\x6e"
+ "\x12\xea\x76\x1d\xea\xf6\xc0\xa0\x66\x74\x7b\x90\xeb\xba\xfd\x05"
+ "\x81\x6e\x7f\xa1\x19\xdd\x1e\x78\xdd\xb9\x6e\x1f\x2a\xd0\xed\x7f"
+ "\xe0\x74\xfb\x10\x4e\xb7\x0f\xd9\x6e\xcb\x7b\xa3\x6e\xb7\x3c\xb1"
+ "\x23\x9c\xcb\x7b\x1f\xdb\xb5\xa8\x4c\xb5\xdb\x96\xf7\x5e\x00\x7a"
+ "\xdc\x40\xbc\x57\x2e\x20\x04\x35\x3b\x8e\x0d\x29\x32\x0d\xe5\xc6"
+ "\x87\x0c\xf1\xcb\x45\xcd\x7e\x19\xae\xa9\x06\xcd\x0e\xba\xfb\xbf"
+ "\x1a\x87\xaa\xe0\x7e\x2a\x44\xd7\x2e\x6a\xba\xb6\xd2\x76\x2d\x6a"
+ "\x75\xb8\xbe\xa8\x04\x74\x3b\x7e\x07\x9e\xff\xa2\x22\x1c\x77\xa2"
+ "\x3d\xc1\x5e\x0b\x65\x94\xf1\x1a\x7f\xf0\x76\x56\xe3\x1b\x38\x8d"
+ "\x0f\xdf\x01\xed\x72\xac\x49\xe3\x37\x96\xa9\x32\xeb\x44\x1a\xff"
+ "\x48\xfd\xaa\xc1\xe5\x36\xdd\x9e\xc1\x69\xfb\x4c\x2b\xab\xed\xcb"
+ "\x41\xdb\x57\x50\x6d\x3f\xd8\x64\xbb\x06\x30\x53\xc9\x5e\x73\x99"
+ "\xbd\xa6\x08\xae\x29\xa3\xd7\xfc\x5e\xa8\xff\x8f\x50\xfd\xff\x9c"
+ "\x9d\xfe\xff\x3d\xab\xff\x6d\x79\x79\xd4\x30\xc2\xdc\xbc\xd5\x4f"
+ "\x2a\x37\xff\x6c\x93\xfe\xcf\x10\xea\xff\xa6\xdc\xfc\xef\x15\xe9"
+ "\x7f\xf8\xcd\x63\x36\x2d\x79\x57\x74\x64\x9d\xb4\x8e\x6c\x6b\xfa"
+ "\xdf\xba\xea\xe1\x08\x7b\xfd\x8f\x9e\xc0\x96\x9b\xb7\x8a\x72\xf3"
+ "\xcf\xba\xa9\xff\x9f\x15\xe9\x7f\x8c\xa3\x1b\xb9\xf9\x63\x77\xc5"
+ "\xb7\xb5\xa1\xdc\x7c\xeb\xeb\xff\xff\x30\x0a\xf3\xf3\xa8\xff\xf9"
+ "\xfc\xfc\x73\x12\xfa\x7f\x88\x50\xff\x1f\xd1\xab\x7e\x6f\xa7\xff"
+ "\x87\x4b\xe8\xff\x21\x6e\xea\xff\x21\x6e\xea\xff\x21\x2e\xea\xff"
+ "\x21\x32\xfa\x3f\xd0\x20\xaf\xff\x03\xe9\xfa\x9e\x99\xbc\x4e\xc3"
+ "\xf7\xa0\x01\x8b\x50\xa7\x0d\xa5\xfa\x9f\xea\x36\xd0\x69\x43\xef"
+ "\x13\xfd\xff\x07\x19\x4d\xf6\x07\x81\xfe\x1f\xd2\x0a\xfa\x7f\x88"
+ "\x8c\xfe\x1f\xca\xe9\xff\x21\x12\xfa\x7f\x88\x8c\xfe\x1f\xca\xe9"
+ "\xff\x21\x76\xfa\x7f\x08\xa7\xff\x87\x3a\xd1\xff\xc3\x38\xfd\x3f"
+ "\x8c\xd3\xff\x34\xc6\x8e\xfa\x7f\x98\x0b\xfa\x7f\x08\xa7\xff\x87"
+ "\x38\xd1\xff\xc3\x24\xf4\x7f\xa0\x01\xf5\xbf\x34\xae\x5e\x18\x2c"
+ "\xc6\xd5\xf3\x76\xfa\x7f\xd8\x7d\xa4\xff\x65\xb1\x66\xa7\xff\x9f"
+ "\x77\x43\xff\x3f\xaf\x50\xff\x0f\x91\xd1\xff\xcf\x5f\xb7\xc7\x9f"
+ "\x58\xff\xbf\x20\xa3\xff\x5f\xb0\xd3\xff\x43\x64\xf4\xff\x0b\x53"
+ "\x45\xe5\x3b\xe8\xff\x17\xec\xf4\xff\x10\x3b\xfd\x3f\x9c\xd3\xff"
+ "\x81\xd9\xca\xf5\xff\x0b\xcd\xe8\xff\x17\xec\xf4\xff\x0b\x9c\xfe"
+ "\x1f\xce\xe9\xff\x17\x38\xfd\x1f\x98\x25\x3c\xce\xeb\x7f\x7a\xdc"
+ "\x51\xff\x0f\x6f\x4e\xff\xfb\x98\xb7\x46\x07\x34\xf6\x89\x0e\x6c"
+ "\xcc\xca\x0b\x7e\xba\xfa\x71\x4b\xd3\x9e\x07\xe1\xa0\x07\x2a\x41"
+ "\x1f\xcc\x22\x2a\x5c\x37\x40\x7b\x0a\xfa\xfd\x59\x74\x7c\x3f\xf6"
+ "\xfd\x38\xfe\xa4\x30\x41\xd7\x0e\xda\x94\xdc\xf6\x4d\x24\xe6\x01"
+ "\xc9\x41\xa8\x01\x1a\xb6\x46\x13\x53\x56\x46\x68\x03\x8e\xed\x8f"
+ "\x26\xaa\x37\x6a\xa5\x75\xdd\xd2\x4a\xc6\x0a\x98\xf7\x9e\x12\x46"
+ "\x35\x5d\x71\xe4\x25\x16\xc7\xa8\x0b\x36\xde\x02\x2d\x60\xac\x60"
+ "\x75\x82\x4f\x78\x00\xc9\xd5\x12\xdf\x8e\xb5\x44\xdd\xd1\xc3\xa3"
+ "\xfd\xcb\xaf\x11\x62\x01\x8d\x30\xb6\x1f\x63\xed\x5f\x1d\x80\xeb"
+ "\x04\x75\xa2\x3a\x61\x5f\x3b\x33\xa7\x13\x3e\xbc\x45\x06\x6c\x5a"
+ "\x04\xfa\xa0\x98\xea\x03\xdc\x1f\xa1\x81\xea\x83\x5e\x8d\xf5\x9a"
+ "\x27\x9a\xc6\xf6\x37\xcd\xd9\xe0\xc7\xf6\xdf\x5e\xc3\x6b\x03\xd4"
+ "\x05\xcc\x1b\x1a\x32\xc8\x44\xc7\x5a\x24\x4c\xa5\x63\xfb\x07\x54"
+ "\x13\x55\xde\x4c\xe2\x5d\x14\x5e\x85\xf3\xf0\xfd\x8b\xaa\xb7\x91"
+ "\x25\xe3\x49\x2f\x33\x6a\x81\x54\x66\x4f\x51\x75\x36\xc1\x35\x10"
+ "\x41\x2b\x0e\xcd\xe1\xf4\xc0\xc4\x59\x32\x7a\x00\xfa\x60\xd4\x04"
+ "\xb4\xef\x1d\x71\xfd\xa8\xe6\x28\x51\xae\xf3\x46\xb0\xdc\x29\x3b"
+ "\xe7\x77\x6b\x74\xa0\xb9\x4f\x34\xb1\xf8\xe6\x05\xd3\x35\x31\xb3"
+ "\x52\xac\x1f\x7f\x1a\x8b\x6b\x1d\x7e\x5a\x55\xe3\x81\xeb\x7b\xe3"
+ "\x5e\x97\xd6\x9d\xc9\x41\xa2\xf9\x18\xb7\xb9\x98\xdd\xa6\x31\x43"
+ "\x7d\x37\xa3\x96\x30\x6f\x98\x55\x04\xce\x75\x62\xe7\x63\x98\xf4"
+ "\x84\xdf\xf3\xd2\x9f\x6c\xb6\xd2\x75\x25\xad\x4b\x23\x3b\x58\x21"
+ "\x2e\x4c\xaa\x8a\x14\xde\x32\xb1\x1a\x2e\x0d\xf7\xc1\x5c\xe6\xd1"
+ "\x11\x35\x1c\x60\xff\xe1\xbc\x46\x88\xd1\x45\x1a\x23\x26\xd5\x9b"
+ "\xfd\xd7\xbc\x54\x13\x00\x65\x3f\x71\xfb\x36\x68\x38\x6e\xcf\x4c"
+ "\xdb\x1a\xbb\xec\xdc\x9a\x46\x9c\x5b\x53\x41\xcc\x6b\xe8\xba\x85"
+ "\x80\x0b\x0f\x5c\xef\x03\xea\xd0\x93\x9d\x53\x73\x5b\x83\x38\x52"
+ "\x6f\xbe\x8c\xf3\x80\xce\xb2\xf1\xb1\x70\x71\xc1\xbd\x33\x6d\xda"
+ "\xac\xa4\xe0\x34\x9d\x57\x69\x17\x8b\xdb\xdb\xa8\x06\x67\xe7\xb9"
+ "\xac\x1a\x3e\x0d\xc7\xc8\x5c\x53\xfd\x71\xe5\x51\x50\x37\x21\x71"
+ "\x4a\xe3\xf2\xc7\x15\x6d\x23\x2e\xea\x5f\x59\x5c\xfe\x73\x28\x8d"
+ "\xcb\xc8\xde\xee\xc5\x65\x64\x40\xdb\x88\x8b\xf7\xaf\x2c\x2e\x7f"
+ "\x2c\xa3\x71\x19\xb5\xdf\xbd\xb8\x8c\xda\xe7\x2c\x2e\x98\xab\xb2"
+ "\xe5\xa9\x6c\x39\x2a\xec\x4f\xa9\xdf\x99\x90\xc6\x8f\xc9\x9c\x90"
+ "\x26\x1c\x93\x79\xf2\x08\xe6\x6f\x56\x91\x13\x63\xb0\xaf\x1c\xbd"
+ "\xda\x79\x6e\xea\xa5\x72\x3e\x37\xf5\xe2\x73\x54\xa3\xbe\xd8\x9d"
+ "\x6a\xd4\xb1\xec\xb8\xed\xa4\x73\x44\x65\x7e\x6a\x5e\xf0\xae\x79"
+ "\x3a\x15\xce\x5f\xda\x75\xcd\xa4\x4a\xab\x03\xcd\xa9\x7a\x9c\xc1"
+ "\x9c\xd4\xea\x05\x38\x16\xd3\x48\x40\xef\x3d\x7e\x45\x35\x76\x2a"
+ "\xae\xbb\x76\xe8\x9a\x8e\xcd\x05\x31\x4f\x7c\x1a\xbb\xb3\x87\xc1"
+ "\x03\xfb\xd1\x5d\xf3\x4c\x2a\x1b\x96\x6c\xf3\x1a\xa1\x3d\x03\x6f"
+ "\x6c\x8b\x0e\xc0\x71\x93\x8d\x7e\x19\xa1\x16\xbf\xbc\x60\x73\x61"
+ "\x72\x90\x14\xbe\xd8\xf9\x92\xd0\x87\xe2\xfc\xc6\x99\xb1\x3c\xce"
+ "\xac\x4b\x29\xbe\x4a\x40\xb3\xe3\xde\x42\x9d\xa1\xef\x64\x6e\x47"
+ "\x76\x98\xbe\x1d\x62\xcf\x61\x0c\xfa\x6f\x79\x8c\x6d\x10\x63\xec"
+ "\x06\x87\x31\xc0\x5a\x13\xc6\x04\xf3\x1d\x03\x29\xc6\xf4\x4d\x18"
+ "\x63\xfb\xce\xa5\x9a\x9e\x88\x33\x1b\xc6\xb0\xdf\xa4\x18\xab\x92"
+ "\xc5\xd8\xc9\x4a\x69\x8c\x99\xfb\x0a\x31\x36\x32\x92\x62\x6c\xec"
+ "\x63\x47\xc3\x00\x63\x61\x4a\x31\x36\xb6\xa7\xd8\x3b\xbf\x3c\xcc"
+ "\xd1\x3b\x8f\x5d\x66\xef\x9d\x6d\x5e\xf9\x86\x5f\x56\xd0\x0d\xf0"
+ "\xcb\xc6\x26\xbf\x3c\x76\x9b\x7b\x7e\x79\xec\x56\xd7\xc6\xb2\xbd"
+ "\xd8\xee\x44\x22\x21\x27\xe0\x79\x2a\x0d\xa6\x63\xd9\x3e\x65\xfd"
+ "\xf2\xe8\x4c\xc4\xa1\xb4\x5f\xa6\xe7\x1c\xc7\x20\xbd\xb4\x8d\x1f"
+ "\x83\xf4\xd2\xfc\x86\xb5\xd2\x63\xd9\x76\x68\x73\x04\xde\x25\x47"
+ "\x62\xbc\x51\x8e\xdd\x78\xa3\x1c\x09\xdf\x92\x43\xf0\xbb\x42\xdf"
+ "\x72\x22\x98\xfa\x96\x13\xc1\xe8\x5b\x72\x58\xbd\x77\x22\xd8\xe6"
+ "\x5b\x72\xe0\x3c\xf5\x2d\x27\x82\x2f\xc3\x1f\xfa\x96\x97\x7c\x4f"
+ "\x04\x4b\xf9\x96\x97\x1e\xa3\x63\xd9\x5e\xf4\x92\x1f\xcb\x96\x23"
+ "\xf0\xc7\x39\x02\x7f\x9c\xc3\xf9\xe3\x1c\xd6\x1f\xd3\xdf\x1c\xc0"
+ "\xd6\x0d\x7f\x13\xcb\x14\xfe\x26\xef\x1f\x5e\x5a\x43\xfd\xc3\x8b"
+ "\xde\x18\x07\xb1\x3f\x86\xef\xc4\x4b\xf9\xe3\x97\xb8\xf1\x6f\x2f"
+ "\x7a\xd9\xfc\x71\x23\xbd\x9e\x2d\x03\xb8\xe6\xa2\xbc\x3f\x1e\x97"
+ "\x44\xb9\x67\x1c\x37\x1e\x9c\xc6\xd4\xd1\x1f\x8f\x13\xfa\x1f\x99"
+ "\xb1\x6c\x14\x43\x6c\x3d\x63\xe5\xfc\xf1\xb8\x18\x47\x7f\x3c\x3a"
+ "\x4d\x7a\x2c\xdb\x84\xb1\x3c\x8e\xc6\x5f\x12\x8f\x65\x1b\xf7\x85"
+ "\xd0\x17\x23\xc6\xee\x33\x6c\xf9\x8a\xc7\xb2\x8d\x5f\x2e\xed\x89"
+ "\x73\x04\x9e\x38\x87\xf5\xc4\x27\x82\x6d\x63\xd9\xc6\xef\xc7\xb2"
+ "\x1d\x3d\x71\x4e\xd3\xf5\x36\x4f\x8c\xdf\xa1\x98\x93\xf2\xc4\x13"
+ "\xda\xd9\x63\x4e\xec\x89\x27\xf4\xb6\x79\xe2\xc6\xe9\x42\x4f\x3c"
+ "\x61\x98\xd8\x13\x63\xf9\x52\x9e\x78\xc2\x1c\x51\xf9\x0e\x9e\x78"
+ "\xc2\x32\x9b\x27\xc6\xf2\x6d\xb8\xe5\x3d\xf1\xcb\x7d\x28\x87\x8e"
+ "\x7e\x4e\xb9\x27\x7e\x99\xcd\xeb\x14\x6e\xa4\xef\x9c\xc4\x7e\xf8"
+ "\xe5\x8e\x62\x3f\x3c\x41\x4f\x7d\xef\xcb\x43\xe9\x38\xb6\x09\x46"
+ "\x7a\x7c\xf4\xb3\xc2\xe3\xbc\x1f\xa6\xc7\x71\x1c\x1b\x1d\xbf\xf6"
+ "\xf2\x38\x65\x3e\xf8\x37\x6d\xd0\x07\xfb\x3b\xf1\xc1\xfe\xbf\x32"
+ "\x1f\x3c\xb1\xc1\x3d\x1f\x3c\xd1\xd4\x36\x74\xfd\xaf\xcd\x6f\xbd"
+ "\x1c\x46\x35\xd7\xe4\x35\xee\xe9\xfa\xc9\x99\x6d\x23\x2e\xbf\x36"
+ "\xbf\x35\x29\x88\xc6\x25\xb8\x9f\x7b\x71\x09\x96\xdd\xff\xb0\x79"
+ "\xbf\xf5\xaa\x99\xf7\x5b\xaf\x9a\xe5\xfd\x56\xb0\xc5\xb9\xdf\x0a"
+ "\x19\xc3\xfb\xad\x3f\x6d\xa3\x9a\xe7\x4f\x2b\xa9\xe6\xf9\xd3\x78"
+ "\xe5\x7e\xeb\x95\xc3\x0f\xfc\x56\x4b\xfa\xad\xc9\x15\x14\x63\xaf"
+ "\xac\x76\xcf\x6f\xbd\x92\x26\xf6\x5b\xa1\xdb\x1d\xfd\xd6\x2b\xd7"
+ "\x5d\xf7\x5b\x7f\xf2\x73\xcf\x6f\xfd\xc9\xd7\x35\xbf\xf5\xa7\x85"
+ "\xd2\x7e\x6b\x2a\x91\xf7\x5b\xf4\x9c\xa3\x4e\x0e\xf1\xe3\x75\xf2"
+ "\xb4\x8b\x6d\xdf\x6f\x4d\x7b\x5f\x5a\x13\x4f\x5b\x4d\xfd\xd6\x9f"
+ "\xe2\x5a\xde\x6f\xfd\x29\x4e\xda\x6f\x85\x78\x50\x6d\xfa\xa7\x78"
+ "\x47\xbf\x05\xdf\x91\xf4\x5b\x21\xcf\x71\xdf\x89\x13\xfb\x2d\x5a"
+ "\x06\x70\xcd\x54\x79\xbf\x15\x72\x95\x72\x4f\xc8\x41\xca\x3d\x34"
+ "\xa6\x8e\x7e\x2b\x24\xbb\x79\xbf\x45\x31\xc4\xd6\x53\xd6\x6f\x85"
+ "\x9c\x73\xf4\x5b\xc1\x66\x69\xbf\xf5\xea\x17\x3c\x8e\x5e\x0d\x11"
+ "\xfb\xad\x3f\xf7\xbd\x3f\xfc\x96\x2c\xb6\xde\x17\xfb\xad\x3f\xdf"
+ "\x54\xee\xb7\x5e\xed\xa7\xcc\x6f\x21\xe6\xa4\xfc\xd6\xab\x0b\xed"
+ "\x31\x27\xf6\x5b\xaf\xae\x91\xf6\x5b\xaf\x6e\x17\xfb\x2d\x2c\x5f"
+ "\xca\x6f\xbd\x7a\x5a\x54\xbe\x83\xdf\x7a\xf5\xba\xd8\x6f\xd1\xeb"
+ "\x78\xbf\x15\x9a\x45\x39\x34\x78\x9b\x72\xbf\x15\xba\x50\xde\x6f"
+ "\x85\x26\x89\xfd\x56\x68\x30\xf5\x55\xa1\x05\xd4\x6f\x85\x46\xd0"
+ "\xe3\xc1\x5b\x85\xc7\x79\xbf\x45\x8f\xf3\x7e\x2b\x74\x9f\x32\xbf"
+ "\xd5\xb9\x0d\xfa\x2d\xb5\x13\xbf\xa5\xfe\x95\xf9\xad\xd7\xa3\xdc"
+ "\xf3\x5b\xaf\x47\x3e\xd0\xf5\xad\xa1\xeb\x43\x8b\xa8\xe6\x0a\xf3"
+ "\x70\x4f\xd7\xe3\x16\x1d\xee\xea\xfa\x37\xcb\x79\x5d\xff\x66\xb9"
+ "\xbc\xae\x0f\x6b\x66\xfd\xb7\x59\x3d\x79\x5d\xff\x06\x97\xcb\x7c"
+ "\x63\x16\xed\x5b\xdf\xe8\xad\x5c\xd7\xcf\xdc\xf0\x40\xd7\xb7\xa4"
+ "\xae\x7f\x7d\x0f\xc5\xd8\xcc\x39\xee\xe9\xfa\x99\x11\x62\x5d\x1f"
+ "\xb1\xcc\x51\xd7\xcf\x3c\xee\xba\xae\x9f\x79\xd5\x3d\x5d\x3f\xb3"
+ "\xd6\x35\x5d\xff\xc6\x24\x69\x5d\x1f\x56\x21\xaf\xeb\xe9\x39\x47"
+ "\x3d\x16\x7e\x95\xd7\x63\xe1\xfb\xdb\xbe\xae\x0f\x0f\x93\xd6\x5e"
+ "\xe1\x73\xa8\xae\x7f\x63\x62\xcb\xeb\xfa\x37\x26\x4a\xeb\xfa\xf0"
+ "\x33\x54\x03\xbd\x11\xec\xa8\xeb\xe1\x3b\x92\xba\x7e\x56\x47\xee"
+ "\x3b\x13\xc5\xba\x9e\x96\x01\x5c\xd3\x4f\x5e\xd7\xcf\x3a\x4a\xb9"
+ "\x67\x56\x36\xe5\x1e\x1a\x53\x47\x5d\x3f\x2b\xa6\x79\x5d\x4f\x31"
+ "\xc4\xd6\x53\x56\xd7\xcf\xfa\xc2\x51\xd7\x87\xc9\xac\xa7\xf5\xe6"
+ "\x6a\x1e\x47\x6f\x0e\x14\xeb\xfa\x59\x96\xfb\x43\xd7\xcb\x62\x2b"
+ "\x4c\xac\xeb\x67\x17\x2b\xd7\xf5\x6f\x7a\x28\xd3\xf5\x88\x39\x29"
+ "\x5d\xff\xe6\x24\x7b\xcc\x89\x75\xfd\x9b\x51\xd2\xba\xfe\xcd\x65"
+ "\x62\x5d\x8f\xe5\x4b\xe9\xfa\x37\x0b\x45\xe5\x3b\xe8\xfa\x37\x8f"
+ "\x8b\x75\x3d\xbd\x8e\xd7\xf5\x11\xd1\x94\x43\xc3\xdc\x58\x4f\x2b"
+ "\x62\x92\xbc\xae\x8f\x08\x11\xeb\xfa\x08\x0d\xd5\xef\x11\x29\x54"
+ "\xd7\x47\x0c\xa7\xc7\xc3\x12\x85\xc7\x79\x5d\x1f\x96\x28\xd6\xf5"
+ "\x11\x99\xca\x74\xfd\x43\x6d\x50\xd7\x7b\x3b\xd1\xf5\xde\xbf\x32"
+ "\x5d\xff\xd6\x48\xf7\x74\xfd\x5b\x41\xee\xeb\xc7\x79\xbe\xbc\x7e"
+ "\x9c\xe7\x2b\xaf\x1f\xff\xe2\xe7\x5c\x3f\xbe\x1d\xc6\xeb\xc7\xa8"
+ "\x83\x94\xc3\xa3\xb6\x50\x0e\x8f\x9a\xa5\x5c\x3f\x46\x9e\x79\xa0"
+ "\x1f\x5b\x52\x3f\x46\x6c\xa5\xfa\x31\x72\x9b\x7b\xfa\x31\x72\xab"
+ "\x58\x3f\xce\x3b\xec\xa8\x1f\xa3\x3a\xb8\xae\x1f\xa3\x06\xba\xa7"
+ "\x1f\xa3\x06\xb8\xa6\x1f\xa3\x56\x4b\xeb\xc7\xbf\xf8\xcb\xeb\x47"
+ "\x7a\xce\xb1\xdf\x7f\x7b\x20\xdf\xef\xcf\x6d\x68\xfb\xfa\x71\x6e"
+ "\xae\x74\x1f\x3f\x77\x1b\xd5\x8f\x51\x69\x2d\xaf\x1f\xa3\xd2\xa4"
+ "\xf5\xe3\xdb\xdd\x69\x5f\x1b\x95\xe9\xa8\x1f\xe1\x3b\x92\xfa\xf1"
+ "\x6d\xae\xff\x8f\x4a\x13\xeb\x47\x5a\x06\x70\x4d\x94\xbc\x7e\x8c"
+ "\xe6\xe6\xa7\xbe\x7d\x9a\x72\x0f\x8d\xa9\xa3\x7e\x7c\xbb\xb0\x79"
+ "\xfd\x48\x31\xc4\xd6\x53\x56\x3f\xbe\x7d\xd3\x51\x3f\xfe\xc5\x57"
+ "\x5a\x3f\xc6\x14\xf3\x38\x8a\x89\x11\xeb\xc7\xe8\x11\xf7\x87\x7e"
+ "\x94\xc5\x56\xae\x58\x3f\xc6\x74\x54\xae\x1f\x63\x46\x2a\xd3\x8f"
+ "\x88\x39\x29\xfd\x18\xb3\xda\x1e\x73\x62\xfd\x18\xb3\x5d\x5a\x3f"
+ "\xc6\x1c\x16\xeb\x47\x2c\x5f\x4a\x3f\xc6\x5c\x15\x95\xef\xa0\x1f"
+ "\xe7\x75\x10\xeb\x47\x7a\x1d\xaf\x1f\xe7\xed\xa4\x1c\xfa\xd6\x41"
+ "\xe5\xfa\x71\xde\x6a\x79\xfd\x38\x2f\x5b\xac\x1f\xe7\x45\x52\x9d"
+ "\x38\x4f\x47\xf5\xe3\xbc\x44\x7a\xfc\xad\x03\xc2\xe3\xbc\x7e\xa4"
+ "\xc7\x79\xfd\x38\xaf\xac\x39\xfd\xe8\x5c\x5b\x2c\x12\xec\x4d\xb0"
+ "\x48\xb4\x37\xc1\x71\x91\xb6\x78\x67\xbe\x73\x6d\xf1\xae\x60\x6f"
+ "\x82\x05\xdc\xde\x04\x0b\xb8\xbd\x09\xe6\xb3\x7b\x13\x24\x4d\x02"
+ "\x0d\x00\xda\xa2\xf0\xca\x1e\xaa\x2d\xae\x98\x54\x1f\x5e\xe3\xb4"
+ "\x45\x2d\xf1\x4e\x9b\xc7\x69\x8b\x99\xa8\x2d\xe6\x8f\x47\x6d\xe1"
+ "\x93\x0b\xfa\xb6\x9a\xd3\xbb\xb1\xa0\x77\xab\xe1\x33\x3c\x3b\x87"
+ "\xa0\x8c\x12\xd0\xa4\x99\xf8\x7d\xdc\x1f\x03\xca\x62\xe7\xc9\xb2"
+ "\x73\x68\xf5\xed\x02\x66\xd3\xf9\xb7\xb8\xbf\x89\xdc\xde\x26\xb6"
+ "\x7d\x4d\x12\xab\x19\x2b\xee\x63\x32\x25\x42\xb0\xbf\x09\xee\x89"
+ "\x6a\xa8\x21\xb8\xc7\x49\xee\x02\xe2\xfb\x11\x6a\x8d\x1a\xa2\xee"
+ "\xb4\xcc\xa3\x13\xee\x6f\xd2\xc9\x48\x35\x6d\xa1\xf5\x18\xd5\xb4"
+ "\xef\xfa\x3f\x0c\x3a\x69\xc0\xe6\x3a\x5e\x63\xac\x43\x7d\xf1\xae"
+ "\x26\xc0\xf8\xae\xa6\xd7\x8d\x1b\xa0\x69\x0d\xf6\xfb\x5f\x18\xe3"
+ "\x71\x9f\x85\xd2\x78\x9a\x03\x65\xf7\xbd\xf8\x8b\x86\xe4\xbd\x05"
+ "\xba\xa7\x96\x78\x3c\x83\x7b\x5f\x14\x13\xf5\xef\x7a\x02\xef\xdf"
+ "\xd0\xf4\x14\xae\x65\x89\x79\x51\xeb\x0d\x0d\x29\x0a\x3f\xcb\xce"
+ "\x99\x35\xdb\xe6\xcc\xd6\x91\xa1\x86\x77\x35\xaa\x8d\x0b\x04\x9a"
+ "\xd6\x0f\x35\xed\xf3\x4e\x34\xed\x7c\x3f\xf7\x34\xed\x7c\x5f\xb1"
+ "\xde\x58\x3c\xd8\x51\x6f\xcc\x5f\xe2\xba\xde\x98\xef\xe6\xfa\xef"
+ "\xf3\x5d\x5c\xff\x7d\xbe\xc5\x5e\x6f\x6c\x67\xf5\xc6\x3b\x71\x88"
+ "\x4d\x69\xbd\x41\xcf\x39\xf6\x13\xef\x0a\xd6\x7f\x7f\x37\xaa\xed"
+ "\xeb\x8d\x77\x7d\xa4\xfb\x84\x77\xb9\xf5\xdf\xe7\x3b\x59\xff\xdd"
+ "\x5d\xbd\x31\xdf\x2c\xad\x37\xde\xe5\xd6\x7f\x5f\x40\x1c\xf5\x06"
+ "\x7c\x47\x52\x6f\xbc\xcb\xad\xff\x3e\xdf\x2c\xd6\x1b\xb4\x0c\xe0"
+ "\x1f\x27\xeb\xbf\xc7\x71\xeb\xbf\xc7\x71\xeb\xbf\xd3\x98\x3a\xea"
+ "\x8d\x38\x17\xd6\x7f\xa7\x18\x62\xeb\x29\xab\x37\xe2\x24\xd6\x7f"
+ "\x7f\x27\x56\x5a\x6f\x2c\x12\xac\xff\xbe\xd0\x6e\xfd\xf7\xb8\xc2"
+ "\xfb\x43\x6f\xc8\x62\xcb\x6e\xfd\xf7\x85\x32\xeb\xbf\x3b\xd3\x1b"
+ "\x0b\xf7\x2a\xd3\x1b\x88\x39\x29\xbd\xb1\xd0\x62\x8f\x39\xb1\xde"
+ "\x58\xd4\x5d\x5a\x6f\x2c\xb2\x5b\xff\x1d\xcb\x97\xd2\x1b\x8b\x66"
+ "\x88\xca\x77\xd0\x1b\x8b\x96\x88\xf5\x06\xbd\x8e\xd7\x1b\x8b\x7b"
+ "\x52\x0e\x7d\xa7\xbb\x72\xbd\xb1\xc8\x22\xaf\x37\x16\xb7\x13\xeb"
+ "\x8d\x45\x15\x54\x57\x2c\x0e\xa4\x7a\x63\x51\x2d\x3d\xfe\x8e\xbf"
+ "\xf0\x38\xaf\x37\xe8\x71\x5e\x6f\x2c\x7e\x30\xff\xf5\xbe\xca\x57"
+ "\xc5\xbb\x39\xff\x35\xfe\xc1\xfc\xd7\x56\x79\x0f\xbd\x98\x9b\xff"
+ "\x9a\xe0\xe6\xfc\xd7\x84\x07\xf3\x5f\x5b\x25\x2e\x4b\xb8\xf9\xaf"
+ "\x89\x6e\xce\x7f\x4d\x7c\x30\xff\xb5\x55\xe2\x92\xc0\xcd\x7f\x4d"
+ "\x72\x73\xfe\x6b\xd2\x1d\xcc\x7f\x5d\x5e\xc0\x7b\xe3\xe5\x05\xf2"
+ "\xde\x58\xdb\xcc\xfc\xd7\x54\x03\xef\x8d\x97\x4d\xa5\x5a\x74\xd9"
+ "\x73\x54\x8b\xa6\xb0\xb9\x29\x2d\x7a\xe3\x8f\x77\x84\xef\x5e\xb0"
+ "\x4f\x85\x6b\xb4\xe1\x9e\x91\xab\x13\x88\x97\x19\xbd\x31\xc4\x60"
+ "\x35\xbb\x17\xc9\x11\x12\x3b\x17\xbd\x71\x4a\x4c\x49\xb5\x70\x1f"
+ "\x12\xed\x39\x7e\x5d\xe4\x23\x04\xcf\x1d\xaa\xdb\xa7\xca\x6c\xb4"
+ "\xcb\xc9\x2f\x30\xa9\x02\xe6\x89\x73\xf2\x96\xec\xbc\x60\xcc\xc9"
+ "\x37\x70\xfb\x8a\xb0\x79\xf9\x81\xce\x73\xf2\x9b\x1a\xa1\xef\x94"
+ "\xc8\xcb\x63\x4e\x1e\xfa\xc8\x5f\x59\x4e\x3e\x91\x9b\x1b\x9b\x32"
+ "\xcc\xbd\x9c\x7c\xca\x50\xb1\x47\xfe\x20\xc4\xd1\x23\xa7\x6c\x72"
+ "\xdd\x23\xa7\x1c\x76\xcf\x23\xa7\xe8\x5c\xf3\xc8\xcb\x7a\x4b\x7b"
+ "\x64\x6d\xa6\x56\xd6\x23\xd3\x73\x8e\xde\x26\xf5\x30\xef\x6d\x52"
+ "\x57\xb7\x7d\x8f\x9c\x1a\x28\xed\x63\x52\x87\x51\x8f\xbc\x2c\xa0"
+ "\xe5\x3d\xf2\xb2\x00\x69\x8f\x9c\xca\xbd\xff\x5e\xd6\xc7\xd1\x23"
+ "\xc3\x77\x24\x3d\x72\xea\x45\xee\x3b\x01\x62\x8f\x4c\xcb\x00\x1e"
+ "\xb2\xc8\x7b\xe4\xf7\x36\x50\x5e\x7a\x2f\x8a\xf2\x12\x8d\xa9\xa3"
+ "\x47\x7e\x6f\x64\xf3\x1e\x99\x62\x88\xad\xa7\xac\x47\x7e\x6f\xa5"
+ "\xa3\x47\xd6\xca\xcc\x8d\x5d\x3e\x8b\xc7\xd1\x72\x0f\xb1\x47\x7e"
+ "\xef\xd4\xfd\xe1\x91\x65\xb1\x15\x28\xf6\xc8\xef\x6f\x51\xee\x91"
+ "\xdf\x3f\xad\xcc\x23\x23\xe6\xa4\x3c\xf2\xf2\xde\xf6\x98\x13\x7b"
+ "\xe4\xe5\x23\xa4\x3d\xf2\xf2\x10\xb1\x47\xc6\xf2\xa5\x3c\xf2\xf2"
+ "\x65\xa2\xf2\x1d\x3c\xf2\xf2\x4d\x62\x8f\x4c\xaf\xe3\x3d\xf2\x07"
+ "\x41\x5c\x7f\xe7\xc6\xdc\xd8\x0f\x7a\xcb\x7b\xe4\x0f\xfa\x89\x3d"
+ "\xf2\x72\x33\xf5\xc2\x1f\x4c\xa3\x1e\xf9\x03\x35\x3d\xae\x7d\x56"
+ "\x78\x9c\xf7\xc8\x5a\xbb\xb9\xb1\x1f\x44\x3c\x98\x1b\x7b\x3f\x79"
+ "\xe4\x15\x6e\xe6\xbf\x57\xf8\xb6\x0d\xcd\xff\x6b\xf3\x62\x1f\xc4"
+ "\x53\xcd\xb5\xb2\xd0\x3d\xcd\xbf\x72\x67\xdb\x88\xcb\xaf\xcd\x8b"
+ "\xad\xe0\xe6\x2c\x7f\x38\xd6\xbd\xb8\x7c\x38\xc6\x7d\x2f\xb6\xee"
+ "\x59\xde\x8b\xad\x7b\x56\xde\x8b\xa5\x75\x77\xee\xc5\x32\x13\x79"
+ "\x2f\x96\x7e\x8e\x6a\x9e\xf4\xc3\x54\xf3\xa4\x2f\x53\xee\xc5\x56"
+ "\x37\x88\xbd\x58\x5a\xd4\x03\x2f\xd6\x5a\x5e\x6c\xa5\x91\xe2\x6f"
+ "\xf5\x51\xf7\xbc\xd8\xea\x23\x62\x2f\xb6\xee\xa2\xa3\x17\x4b\xef"
+ "\xe7\xba\x17\x4b\x9f\xe4\x9e\x17\x4b\x9f\xe8\x9a\x17\x4b\x2f\x94"
+ "\xf6\x62\x69\x3d\xe5\xbd\x18\x3d\xe7\xa8\xa1\x33\x27\xf1\x1a\x3a"
+ "\xb3\x7b\xdb\xf7\x62\x19\x07\xa4\xf5\x72\xc6\x51\xea\xc5\xd2\x77"
+ "\xb6\xbc\x17\x4b\xdf\x29\xed\xc5\x32\xb9\xfd\xcf\xd2\xf7\x38\x7a"
+ "\x31\xf8\x8e\xa4\x17\xcb\x8c\xe1\xbe\xb3\x53\xec\xc5\x68\x19\xc0"
+ "\x43\x2b\xe5\xbd\xd8\x9a\xbe\x94\x97\x32\x6f\x52\x5e\xa2\x31\x75"
+ "\xf4\x62\x99\xc5\xcd\x7b\x31\x8a\x21\xb6\x9e\xb2\x5e\x6c\x8d\x9f"
+ "\xa3\x17\x4b\xf3\x97\xf6\x62\x6b\x05\xf3\x34\xd6\xae\x16\x7b\xb1"
+ "\x35\x33\xee\x0f\x2f\x26\x8b\xad\x03\x62\x2f\xb6\x76\xa0\x72\x2f"
+ "\xb6\x76\x96\x32\x2f\x86\x98\x93\xf2\x62\x6b\x0b\xed\x31\x27\xf6"
+ "\x62\x6b\x8f\x4b\x7b\xb1\xb5\x17\xc5\x5e\x0c\xcb\x97\xf2\x62\xeb"
+ "\x3a\x8a\xca\x77\xf0\x62\xeb\xfa\x89\xbd\x18\xbd\x8e\xf7\x62\xeb"
+ "\x8a\x28\x87\x7e\x78\x58\xb9\x17\x5b\x57\x28\xef\xc5\xd6\x7d\x21"
+ "\xf6\x62\xeb\x56\x50\xcf\xb5\x4e\x4f\xbd\xd8\xba\x5c\x7a\xfc\x43"
+ "\x9d\xf0\x38\xef\xc5\xe8\x71\xde\x8b\xad\x33\x3c\x98\x37\x7b\x3f"
+ "\x79\xb1\xec\x2d\xee\x79\xb1\xec\xfc\x07\x9a\xbf\x35\x34\x7f\x96"
+ "\x17\xd5\x5c\x7f\x1d\xe6\x9e\xe6\xff\xeb\x50\xf7\x35\x7f\x9e\x86"
+ "\xd7\xfc\x79\x1a\x79\xcd\x9f\xd3\xd1\xb9\xe6\xcf\x8d\xe5\x35\xff"
+ "\xc6\x53\xb4\x6f\xdd\xf8\x05\xed\x5b\x37\x2e\x54\xae\xf9\x37\x5c"
+ "\x15\x6b\xfe\x9c\x19\x0f\x34\x7f\x6b\x69\xfe\xec\x1a\x8a\xbf\x0d"
+ "\xfb\xdd\xd3\xfc\x1b\xf6\x89\x35\x7f\xde\x69\x47\xcd\xbf\xf1\x31"
+ "\xd7\x35\xff\xc6\x91\xee\x69\xfe\x8d\x41\xae\x69\xfe\x8d\x5b\xa4"
+ "\x35\x7f\x8e\x5a\x5e\xf3\xd3\x73\x8e\x5a\x2d\x77\x24\xaf\xd5\x72"
+ "\x3b\xb6\x7d\xcd\xff\xd1\x1e\x69\x5d\xf6\xd1\x7e\xaa\xf9\x37\xe6"
+ "\xb7\xbc\xe6\xdf\x98\x2f\xad\xf9\x73\x07\x52\x7d\xb4\x71\xab\xa3"
+ "\xe6\x87\xef\x48\x6a\xfe\xdc\x59\xdc\x77\xf2\xc5\x9a\x9f\x96\x01"
+ "\x3c\x94\x24\xaf\xf9\x37\x75\xa7\xbc\x94\xcb\xed\xd9\x45\x63\xea"
+ "\xa8\xf9\x73\x0f\x37\xaf\xf9\x29\x86\xd8\x7a\xca\x6a\xfe\x4d\x1d"
+ "\x1c\x35\x7f\x8e\x8f\xb4\xe6\xdf\x7c\x91\xc7\xd1\xe6\x65\x62\xcd"
+ "\xbf\x69\xea\xfd\xa1\xf9\x65\xb1\xb5\x47\xac\xf9\x37\xf7\x56\xae"
+ "\xf9\x37\x87\x28\xd3\xfc\x88\x39\x29\xcd\xbf\x79\x8b\x3d\xe6\xc4"
+ "\x9a\x7f\xf3\x41\x69\xcd\xbf\xf9\xb4\x58\xf3\x63\xf9\x52\x9a\x3f"
+ "\xcf\x43\x54\xbe\x83\xe6\xcf\x7b\x4c\xac\xf9\xe9\x75\xbc\xe6\xcf"
+ "\xe3\xfa\xbb\xbf\x7e\xa1\x5c\xf3\xe7\x6d\x91\xd7\xfc\x79\xdb\xc5"
+ "\x9a\x3f\x8f\x9b\x3b\x9b\x57\x4e\x35\x7f\x5e\x26\x3d\xfe\xd7\xcf"
+ "\x85\xc7\x79\xcd\x4f\x8f\xf3\x9a\x3f\xaf\xfa\xc1\x9c\xda\xfb\x49"
+ "\xf3\x6f\xc9\x76\x4f\xf3\x6f\xc9\x72\x5f\x5b\x6e\x17\xcc\x7b\xd9"
+ "\xee\x64\xde\xcb\xc7\x51\xce\xb5\xe5\x27\x82\x79\x2f\xdb\xb8\x79"
+ "\x2f\xdb\xb8\x79\x2f\x5b\x4f\x29\xd7\x96\x5b\xc7\x8b\xb5\xe5\xc7"
+ "\xfb\x1f\x68\xcb\xd6\xd2\x96\x79\x26\xaa\x2d\xb7\xfa\xb9\xa7\x2d"
+ "\xb7\xda\xcd\x7f\xd9\x21\x31\xff\x65\xab\x82\xf9\x2f\x5b\xdd\x9c"
+ "\xff\xb2\xd5\xc5\xf9\x2f\x5b\x65\xe6\xbf\x7c\x1c\x2d\xaf\x2d\xe9"
+ "\x39\x47\x4d\xf0\x89\x60\xfe\xcb\x27\xf7\xc1\xfc\x97\x4f\x64\xe6"
+ "\x28\x7c\xc2\xcd\x7f\xd9\xda\x0a\xf3\x5f\xb6\xca\xcc\x7f\xf9\x84"
+ "\x9b\xff\xb2\x4d\x62\xfe\xcb\x56\x99\xf9\x2f\x9f\x70\xf3\x5f\xb6"
+ "\xda\xcd\x7f\xd9\xc6\xcd\x7f\xf9\xc4\xc9\xfc\x97\xbf\x71\xf3\x5f"
+ "\xfe\xc6\xcd\x7f\xa1\x31\x75\xd4\x96\x7f\x73\x61\xfe\xcb\x56\x6e"
+ "\xfe\xcb\x56\x27\xf3\x5f\xfe\x26\x31\xff\xe5\xe3\x48\x69\x6d\xb9"
+ "\x5d\x30\xff\xa5\xc0\x6e\xfe\xcb\xdf\xee\x93\xf9\x2f\xb2\xd8\xb2"
+ "\x9b\xff\x52\xe0\xc6\xfc\x97\x02\x85\xf3\x5f\xb6\xca\xcc\x7f\x29"
+ "\xb0\xd8\x63\x4e\xac\x2d\xb7\xcb\xcc\x7f\xd9\x6e\x37\xff\x65\xab"
+ "\xcc\xfc\x97\xed\x33\x44\xe5\x3b\x68\xcb\xed\x76\xf3\x5f\xb6\xd9"
+ "\xcd\x7f\xd9\xc1\xcd\x7f\xf9\xb8\x8b\x72\x6d\xb9\xdd\xc9\xfc\x97"
+ "\x1d\x76\xf3\x5f\xb6\x73\xf3\x5f\x76\x70\xf3\x5f\xb6\x73\xf3\x5f"
+ "\x3e\x56\x0b\x8f\xf3\xda\x92\x1e\xe7\xb5\xe5\x8e\x66\xe7\xbf\x38"
+ "\xd7\x1d\x9f\xa9\x79\xdd\xf1\x99\x5a\x5e\x77\xec\xb8\xe8\x5c\x77"
+ "\xec\x0e\xe5\x75\x47\xe1\x7e\xfa\x7c\x17\x6e\xa2\xcf\x77\x21\xfb"
+ "\x1e\x26\xa9\x18\x74\xc7\x13\x3b\xc2\x77\x5d\xdb\xc3\xea\x8e\xdd"
+ "\xf3\x4c\x2a\xd0\x88\x5e\x56\xd4\x1d\xa0\x05\xd3\x16\xa1\xee\xa8"
+ "\xe6\xe6\xdb\xee\x3c\x5d\x1c\x2f\xd4\x1d\x9f\x3e\xc7\xce\xbd\x45"
+ "\xed\x61\x34\xb1\xd7\xe1\x79\xa9\xb9\xb8\x07\xe7\x71\x73\x71\xa1"
+ "\x6c\xe1\x1c\x5c\x76\x5e\xee\x35\xd0\x25\xb3\x21\x1e\x02\x5d\xf2"
+ "\x60\x2e\xae\xb3\xb9\xb8\x3b\xdd\xcc\x7f\xef\xcc\x17\x6b\x91\xcf"
+ "\x0e\x3a\x6a\x91\xc2\x76\xae\x6b\x91\xc2\x7e\xee\x69\x91\x42\x8d"
+ "\x6b\x5a\xa4\x70\xa5\xb4\x16\xd9\x51\x8d\xb8\x95\xd6\x22\xf4\x9c"
+ "\x63\x1f\xb2\xbb\x1f\xdf\x87\xec\xba\xd9\xf6\xb5\xc8\xae\x1c\xe9"
+ "\xfe\x62\xd7\x16\xaa\x45\x0a\x57\xb4\xbc\x16\x29\x5c\x21\xad\x45"
+ "\x76\xfb\x51\xde\x2e\x4c\x73\xd4\x22\xf0\x1d\x49\x2d\xb2\x7b\x3c"
+ "\xf7\x9d\x15\x62\x2d\x42\xcb\x00\x6e\x9a\x23\xaf\x45\xf6\x78\x50"
+ "\xae\xda\x7d\x8a\x72\x15\x8d\xa9\xa3\x16\xd9\xbd\xbd\x79\x2d\x42"
+ "\x31\xc4\xd6\x53\x56\x8b\xec\xbe\xee\xa8\x45\x76\xe8\xa5\xb5\xc8"
+ "\xde\xe3\x3c\x8e\xf6\x46\x89\xb5\xc8\x9e\x61\xf7\x87\x16\x91\xc5"
+ "\x56\x8e\x58\x8b\xec\xed\xa0\x5c\x8b\xec\x1d\xa1\x4c\x8b\x20\xe6"
+ "\xa4\xb4\xc8\xde\x95\xf6\x98\x13\x6b\x91\xbd\xdb\xa4\xb5\xc8\xde"
+ "\x83\x62\x2d\x82\xe5\x4b\x69\x91\xbd\x3f\x89\xca\x77\xd0\x22\x9f"
+ "\xb5\x13\x6b\x11\x7a\x1d\xaf\x45\x3e\x2b\xe0\xfc\xdc\x4a\xe5\x5a"
+ "\xe4\xb3\x95\xf2\x5a\xe4\xb3\x35\x62\x2d\xf2\x59\x04\xd5\x1c\x9f"
+ "\x1d\xa0\x5a\xe4\xb3\x78\x7a\x7c\xc7\x0a\xe1\x71\x5e\x8b\xd0\xe3"
+ "\xbc\x16\xf9\xac\x48\x41\x9e\x6b\x9a\x92\xb9\xb8\x85\xb7\xc4\x79"
+ "\x2e\x5b\x8e\xcb\x3c\x20\x79\x4c\x53\x9e\x4b\xf8\x9e\x54\x22\xcf"
+ "\x85\x7d\x3a\x9f\xe7\x3a\xc7\x72\x15\x9f\xe7\xd2\xb3\x79\x2e\xcc"
+ "\x71\xe1\xbb\x52\x5b\x8e\xcb\xba\xd8\x71\x1e\x6e\xa1\x55\x79\x8e"
+ "\x8b\x7f\x5f\x6a\x32\xd0\x1c\x57\x45\x53\x8e\x0b\xfb\x73\x4b\xbd"
+ "\x63\x8e\x0b\xfb\x71\x3e\xc7\x75\xb6\x85\x73\x5c\x9f\x2f\x71\xaf"
+ "\x5f\xff\x3c\xbe\x6d\xbc\xd7\xfe\xb5\xcd\xc3\xfd\x4c\x4f\x73\x3f"
+ "\xff\xd3\xc5\xbd\xf7\xda\xff\xa3\x6e\x1b\x71\xf9\xb5\x8d\xfd\xfe"
+ "\x5c\x47\xe3\xf2\xf7\xed\xee\xc5\xe5\xef\x05\x6d\x23\x2e\xbf\xb6"
+ "\x71\x20\xff\x13\x4a\xe3\xb2\x7f\xa4\x7b\x71\xd9\x1f\xe4\x7e\xae"
+ "\xfe\xf0\x34\xde\x33\x1f\x9e\x26\xf4\xcc\xc7\xc6\x08\x3d\xf3\x97"
+ "\xcd\xac\x7f\x79\x28\x97\xf7\xcc\x07\x2c\x54\x87\x1e\xb8\x48\x75"
+ "\xe8\x01\xf6\xfd\x54\xd2\x48\xc2\x7a\x65\x33\xfa\xe6\xb9\x26\xd5"
+ "\xae\x2b\x3a\x95\x39\x95\xfa\xe5\x52\x73\x11\x29\x36\x98\xc8\x87"
+ "\x8b\x88\xd7\xca\x6b\xc4\x6b\x47\x9d\x49\xd5\x39\x9a\x78\x43\x9f"
+ "\x04\x6d\x56\x04\x3a\x66\x13\x89\xd5\xa2\x97\x3e\xd0\xbd\x34\xd6"
+ "\x20\xf0\xd2\x5f\x26\xf1\x3e\x1a\xae\x8b\x35\x91\xaf\xe6\xea\x54"
+ "\xe8\x97\x6f\x67\xe7\x05\xdf\x1e\x98\x1c\xc4\xae\x63\x25\xcc\xe7"
+ "\xc3\x6f\x07\xcc\x14\xe7\xf3\x1b\xb3\xf3\xa6\x35\x14\x26\x8f\x61"
+ "\xd7\xd0\xec\xcb\xe7\xf4\x95\xac\x9f\xf9\x51\x23\xf1\xb5\xe5\xf3"
+ "\x3f\xfa\xd5\xe5\xf3\xff\x6e\xa0\x18\xfd\xc7\x25\xf7\xf2\xf9\xff"
+ "\xa8\x16\x7b\xe8\x7f\x7a\x38\x7a\xe8\x03\xe3\x5d\xf7\xd0\x07\x62"
+ "\xdc\xf3\xd0\x07\xa2\x5d\xf3\xd0\x07\x8a\xed\x3d\x74\x81\x16\x3d"
+ "\xf4\x97\xfe\x88\x63\x69\x0f\x4d\xcf\x39\x7a\x9f\x43\x31\xbc\xf7"
+ "\x39\x34\xac\xed\x7b\xe8\x83\x95\xd2\x3e\xe7\xe0\x25\xea\xa1\x0f"
+ "\x14\xb5\xbc\x87\x3e\x50\x24\xed\xa1\x0f\xbd\x46\xfd\xc6\x81\x22"
+ "\x9b\x1f\xe6\x3d\x34\x7c\x47\xd2\x43\x1f\x5a\x6d\xff\x1d\xea\xa1"
+ "\x0f\x94\x51\x0f\x7d\x68\xbb\xbc\x87\xfe\x6a\x2c\xe5\xae\xaf\xfc"
+ "\x28\x77\xd1\x98\x3a\x7a\xe8\x43\x57\x9b\xf7\xd0\x14\x43\x6c\x3d"
+ "\x65\x3d\xf4\x57\xcf\x39\x7a\xe8\x2f\x65\xd6\xcf\x3c\xdc\x91\xc7"
+ "\x91\xae\x50\xec\xa1\xbf\x4a\xba\x3f\x3c\xb4\x2c\xb6\x2a\xc5\x1e"
+ "\x5a\x37\x49\xb9\x87\xd6\x2d\x53\xe6\xa1\x11\x73\x52\x1e\x5a\x57"
+ "\xcc\xe1\xa7\x4c\xda\x43\xeb\x7e\x92\xf6\xd0\x87\x3d\xc4\x1e\x1a"
+ "\xcb\x97\xf2\xd0\x87\x07\x8a\xca\x77\xf0\xd0\x87\xc7\x8b\x3d\x34"
+ "\xbd\x8e\xf7\xd0\x87\x6b\x29\x87\xee\x77\x63\xfd\xcc\xc3\xc5\xf2"
+ "\x1e\xfa\xf0\x69\xb1\x87\x3e\x5c\x40\xbd\xf2\x3f\x09\xf5\xd0\x87"
+ "\x0f\xd0\xe3\xfb\x0f\x08\x8f\xf3\x1e\x7a\xbf\xdd\xfa\x99\xff\x54"
+ "\x2b\xf0\xd0\xa1\x2d\xe4\xa1\xc7\xdd\x5f\x1e\xba\x71\x4f\xdb\xf0"
+ "\xd0\x5f\x1f\x74\xcf\x43\x7f\x7d\xc0\x45\x4f\x30\xad\x19\x4f\x30"
+ "\xe6\x81\x27\x10\xea\xad\x7f\xf6\xa1\x7a\xeb\x68\x88\x7b\x9e\xe0"
+ "\xe8\xb4\xb6\x10\x97\x5f\x57\x4c\x8e\x70\xe3\xf5\xff\xf5\x93\x7b"
+ "\x31\xf9\x57\xcd\x03\xff\xdc\x1a\x71\x39\x9a\x4b\xe3\x72\x6c\x99"
+ "\x7b\x71\x39\x96\xe2\xbe\x7f\x2e\xdb\xc7\xfb\xe7\xb2\x7d\x42\xff"
+ "\xfc\x2f\xd1\x3b\xe7\xe3\x21\xce\xfd\x73\x09\xe1\xfd\x73\xd1\x2c"
+ "\xaa\x41\x8b\xb8\x31\x25\x45\x6c\x4e\x3d\xf1\x0b\xea\x9f\x6f\xa1"
+ "\x7f\xbe\x0c\xfe\xf9\xad\x70\x95\x99\xdb\x3b\x02\xc7\xaf\x15\x83"
+ "\x07\x46\xcf\x5c\x1a\x0f\xff\x8f\x33\x90\x0f\x17\x10\xaf\x55\xe0"
+ "\x7d\xb7\x43\x5f\xb9\x7d\x91\x41\xb5\x62\x2e\xf4\x33\x15\x85\xa4"
+ "\x73\x24\xf8\xea\x3a\xf4\xd5\x47\xc0\x33\x2f\xe7\x7c\xf5\xc9\xa4"
+ "\xd2\x38\xa1\xaf\x3e\x7e\x9a\xf5\xd5\x06\x3a\x36\xae\x34\x0e\x7c"
+ "\x35\xfc\x1e\xee\x45\x21\xf4\xd5\x0d\xe0\x9b\x1b\xc1\x37\x67\x5e"
+ "\xb1\xf3\xd8\x6f\x39\x7a\xec\x06\xbf\xbc\x50\xd3\xc0\xe4\x71\xe8"
+ "\xb1\x6f\x6d\x7b\xe0\xb1\x1d\x3d\xf6\xbf\x03\x29\x8e\x4f\x8e\x77"
+ "\xcf\x63\x9f\x1c\x27\xf6\xd8\xa7\xe6\x38\x7a\xec\x93\x85\xae\x7b"
+ "\xec\x93\xa7\xdc\xf3\xd8\x27\xcb\x5c\xf3\xd8\x45\x83\xed\x3d\xf6"
+ "\x27\xec\x7b\xea\xe3\xa1\x88\x75\x69\x8f\x4d\xcf\x39\x7a\xa3\xe2"
+ "\x53\xbc\x37\x2a\xde\xd4\xf6\x3d\x76\x71\x90\xb4\x0f\x2a\x1e\x4f"
+ "\x3d\x76\x51\x60\xcb\x7b\xec\xa2\x40\x69\x8f\x5d\xcc\x8d\x7f\x2b"
+ "\x0a\x74\xf4\xd8\xf0\x1d\x49\x8f\x5d\x7c\xdd\xfe\x3b\xd4\x63\x17"
+ "\x3d\x4b\x3d\x76\x49\x47\x79\x8f\x5d\xb2\x9d\xf2\x5b\xc9\x12\xca"
+ "\x6f\x34\xa6\x8e\x1e\xbb\x64\x6a\xf3\x1e\x9b\x62\x88\xad\xa7\xac"
+ "\xc7\x2e\xd9\xe0\xe8\xb1\x8f\x4f\x93\xf6\xd8\x65\xf3\x79\x1c\x95"
+ "\x75\x11\x7b\xec\x92\x8b\xf7\x87\xc7\x96\xc5\x56\x90\xd8\x63\x97"
+ "\xee\x55\xee\xb1\x4b\x2f\x29\xf3\xd8\x88\x39\x29\x8f\x5d\x36\x98"
+ "\xc3\xcf\xb3\xd2\x1e\xbb\x6c\x92\xb4\xc7\x2e\x9b\x23\xf6\xd8\x58"
+ "\xbe\x94\xc7\x2e\x5b\x23\x2a\xdf\xc1\x63\x97\x15\x8a\x3d\x36\xbd"
+ "\x8e\xf7\xd8\xa7\x82\x29\x87\x1e\xb3\x28\xf7\xd8\xa7\x06\xcb\x7b"
+ "\xec\x53\xc3\xc4\x1e\xfb\x94\x0f\xf5\xd2\xa7\x22\xa8\xc7\x3e\x15"
+ "\x40\x8f\x1f\x33\x0b\x8f\xf3\x1e\x9b\x1e\xe7\x3d\xf6\xa9\x38\x65"
+ "\xef\xa9\xef\x68\x3d\xac\x31\x77\x7f\x3e\x46\x4b\xad\x87\x65\x7b"
+ "\x57\x7d\xaf\xe7\x63\xfc\x6f\x5f\xf7\x7c\xf6\xff\xf6\x79\xe0\xe7"
+ "\x5a\xda\x37\x9c\x5a\x41\xf5\x56\xb9\x9b\xeb\xdf\x96\x3b\x5d\xff"
+ "\xf6\x81\x9f\x73\x37\x2e\xff\x1b\x4d\xe3\xf2\xed\x54\xf7\xe2\xf2"
+ "\x6d\xb0\xfb\x7e\xee\x7c\x04\xef\xe7\xce\x47\xc8\xbf\x0f\xfd\xae"
+ "\xaf\x73\x3f\xf7\xfd\x4e\xde\xcf\x9d\xed\x48\xf5\xce\x99\xeb\x54"
+ "\xef\x9c\xd9\xdb\x72\xef\x43\xcf\xf4\x13\xbf\x0f\xfd\x6e\xf5\x83"
+ "\xf7\xa1\x77\xc3\xab\x9d\x26\x14\xa3\x15\x37\xdd\xf3\x6a\x15\x46"
+ "\xb1\x57\xbb\xd0\xc5\xd1\xab\x9d\x79\xcd\x75\xaf\x76\x26\xc9\x3d"
+ "\xaf\x76\x26\xd1\x35\xaf\x76\xe6\x9c\xf4\xfb\xd0\xef\x34\xf2\xef"
+ "\x43\xe9\x39\x47\x8d\xfd\x7d\x12\xaf\xb1\xbf\x1f\xdf\xf6\xbd\xda"
+ "\xd9\x5a\x69\x3d\x7d\xf6\x26\xf5\x6a\x67\x2a\x5b\xde\xab\x9d\xa9"
+ "\x94\xf6\x6a\xdf\x47\x51\x5d\x7b\xa6\xd2\xd1\xab\xc1\x77\x24\xbd"
+ "\xda\xf7\x9b\xec\xbf\x43\xbd\xda\x19\x3d\xf5\x6a\xdf\xef\x97\xf7"
+ "\x6a\x95\x21\x94\xbb\x2a\xfb\x52\xee\xa2\x31\x75\xf4\x6a\xdf\x5b"
+ "\x9a\xf7\x6a\x14\x43\x6c\x3d\x65\xbd\x5a\xe5\x58\x47\xaf\xf6\x5d"
+ "\x1f\x69\xaf\x76\xfe\x31\x1e\x47\xe7\x0e\x8a\xbd\x5a\xe5\xea\xfb"
+ "\xc3\xab\xc9\x62\xab\x56\xec\xd5\xce\xcd\x50\xee\xd5\xce\xad\x51"
+ "\xe6\xd5\x10\x73\x52\x5e\xed\xdc\x39\x0e\x3f\x7a\x69\xaf\x76\xae"
+ "\x41\xda\xab\x9d\xef\x22\xf6\x6a\x58\xbe\x94\x57\x3b\x3f\x42\x54"
+ "\xbe\x83\x57\x3b\xff\x9a\xd8\xab\xd1\xeb\x78\xaf\x76\x9e\xf3\x46"
+ "\xdf\x16\x2b\xf7\x6a\xe7\xcf\xc9\x7b\xb5\xf3\x97\xc4\x5e\xed\xfc"
+ "\x3e\xea\xc9\x2e\xa8\xa9\x57\x3b\x5f\x44\x8f\x7f\x5b\x24\x3c\xce"
+ "\x7b\x35\x7a\x9c\xf7\x6a\x17\x02\x94\x79\x35\xd7\xd7\xcb\xba\xf7"
+ "\x63\x8a\xd5\xbf\xb2\x31\xc5\xfa\x62\xf7\x7c\x9a\xbe\xe8\x81\x27"
+ "\x68\x0d\x4f\x70\xe1\x59\xaa\xb7\xaa\xe6\xb8\xe7\x09\xaa\x22\xdc"
+ "\xf7\x04\x57\xe2\x79\x4f\x70\x25\x5e\xde\x13\xfc\x30\xcc\xb9\x27"
+ "\xf8\x51\xc7\x7b\x82\xcb\xbd\x69\xbf\x7a\xb9\x1d\xed\x57\x2f\x1d"
+ "\x6d\x39\x4f\x70\x69\x84\xd8\x13\xfc\xb0\xe5\x81\x27\xb8\x1b\x9e"
+ "\xe0\xa2\x2f\xc5\xe8\xa5\x0e\xee\x79\x82\x4b\xde\x62\x4f\xf0\x73"
+ "\x5f\x47\x4f\x70\x29\xc6\x75\x4f\x70\x69\x8d\x7b\x9e\xe0\x52\xa6"
+ "\x6b\x9e\xe0\xd2\x75\x69\x4f\xf0\xc3\x70\x79\x4f\x40\xcf\x39\x6a"
+ "\xb9\x1f\xd7\xf0\x5a\xee\xc7\x19\x6d\xdf\x13\xfc\x48\xa4\x75\xdb"
+ "\x8f\x1d\xa8\x27\xb8\x64\x68\x79\x4f\x70\xc9\x20\xed\x09\x7e\x4c"
+ "\xa2\xfa\xe9\x92\xc1\xd1\x13\xc0\x77\x24\x3d\xc1\x8f\x7b\xed\xbf"
+ "\x43\x3d\xc1\x25\x23\xf5\x04\x3f\x16\xcb\x7b\x82\x9a\x28\xca\x5d"
+ "\x35\xc3\x28\x77\xd1\x98\x3a\x7a\x82\x9a\x2e\xcd\x7b\x02\x8a\x21"
+ "\xb6\x9e\xb2\x9e\xa0\xe6\x35\x47\x4f\xf0\xc3\x50\x69\x4f\x70\x65"
+ "\x30\x8f\xa3\x9f\x4e\x89\x3d\x41\xcd\x96\xfb\xc3\x13\xc8\x62\x8b"
+ "\x88\x3d\xc1\x4f\xf3\x95\x7b\x82\x9f\xb6\x29\xf3\x04\x88\x39\x29"
+ "\x4f\xf0\x13\xf7\xfe\x8f\xe2\xc5\xd1\x13\x5c\xe9\x28\xed\x09\xae"
+ "\xf4\x15\x7b\x02\x2c\x5f\xca\x13\x5c\x99\x2a\x2a\xdf\xc1\x13\x5c"
+ "\x89\x11\x7b\x02\x7a\x1d\xef\x09\x7e\x56\x53\x0e\xad\xba\xa8\xdc"
+ "\x13\x5c\xb9\x2e\xef\x09\xae\x34\x88\x3d\xc1\x15\x4e\xfb\xff\xdc"
+ "\x87\x7a\x82\x2b\x7a\x7a\xbc\x4a\x2f\x3c\xce\x7b\x02\x7a\x9c\xf7"
+ "\x04\x3f\x3f\xfb\x60\x3d\xad\xfb\x69\x3d\xad\xda\x4b\xee\xf9\x82"
+ "\xda\x6a\xf7\xf5\xa7\xb1\x9c\xd7\x9f\xc6\x72\xa1\xfe\x14\xaf\x6b"
+ "\x71\x75\xbf\x73\xfd\x59\xd7\x93\xd7\x9f\x86\x24\xca\xe1\x86\x59"
+ "\x94\xc3\x0d\xec\xda\x7c\xca\xd6\xd3\xfa\x65\x83\x78\x3d\xad\x6b"
+ "\x1d\x1e\xac\xa7\xd5\x5a\xda\xf2\xe7\x71\x54\x5b\xfe\x32\xc7\x3d"
+ "\x6d\xf9\x4b\x84\x58\x5b\xde\x5c\xe6\xa8\x2d\x7f\x39\xee\xba\xb6"
+ "\xfc\xe5\xaa\x7b\xda\xf2\x97\x5a\xd7\xb4\xa5\x61\x92\xf4\x1a\x16"
+ "\x57\x0f\xc8\xaf\xa7\x45\xcf\x39\x6a\x82\xeb\x82\x75\xf5\xaf\xef"
+ "\x6f\xfb\xda\xf2\x7a\x98\x74\xff\x7f\x7d\x0e\xd5\x96\x86\x89\x2d"
+ "\xaf\x2d\x0d\x13\xa5\xb5\xe5\xf5\x33\xb4\x1f\x36\x04\x3b\xae\x61"
+ "\x01\xdf\x91\xd4\x96\x75\xdc\xfa\xf7\x86\x89\x62\x6d\x49\xcb\x00"
+ "\x1e\xea\x27\xaf\x2d\xeb\x8e\x52\x5e\xaa\xcb\xa6\xbc\x44\x63\xea"
+ "\xa8\x2d\xeb\x62\x9a\xd7\x96\x14\x43\x6c\x3d\x65\xb5\x65\xdd\x17"
+ "\x8e\xda\xf2\xea\x3e\x69\x6d\x69\x5c\xcd\xe3\xc8\x38\x50\xac\x2d"
+ "\xeb\x2c\xf7\x87\xb6\x94\xc5\x56\x98\x58\x5b\xde\x28\x56\xae\x2d"
+ "\x8d\x1e\xca\xb4\x25\x62\x4e\x4a\x5b\x1a\x27\xd9\x63\x4e\xac\x2d"
+ "\x8d\x51\xd2\xda\xd2\xb8\x4c\xac\x2d\xb1\x7c\x29\x6d\x69\x2c\x14"
+ "\x95\xef\xa0\x2d\x8d\xc7\xc5\xda\x92\x5e\xc7\x6b\xcb\x9b\xd1\x94"
+ "\x43\xaf\xce\x52\xae\x2d\x6f\x4e\x92\xd7\x96\x37\x43\xc4\xda\xf2"
+ "\xa6\x86\x6a\xc8\x9b\x29\x54\x5b\xde\x1c\x4e\x8f\x5f\x0d\x17\x1e"
+ "\xe7\xb5\x25\x3d\xce\x6b\xcb\x9b\x99\xca\xe6\xdf\xb4\x48\xbe\xf9"
+ "\x2e\xcd\xbf\x69\xa9\x7c\x73\x5b\x99\x7f\x53\x3f\xc2\x3d\x5d\x59"
+ "\x3f\xfc\xc1\xb8\xa0\x96\xce\x35\xdf\xdc\x4a\xb5\x96\xe9\x94\x7b"
+ "\xb9\x66\x53\x99\xdb\x5a\xdf\xd3\x83\x34\x69\x7d\x4f\x9c\x4e\x28"
+ "\x37\x9f\xa0\x61\x9b\x73\xad\x6f\x1d\xc7\x6b\x7d\x33\x37\xde\xd6"
+ "\xbc\x9a\xf6\xa9\xe6\x49\xee\xcc\x27\x58\x55\x47\xbc\x3e\xb4\x9f"
+ "\x4f\x50\x7e\x90\xce\x27\x58\x60\x3f\x9f\xe0\xf6\x51\xf1\x7c\x82"
+ "\xc6\xbe\x72\xf3\x09\x30\xf7\x7c\xbb\x30\x79\x0c\xce\x25\x90\x9c"
+ "\x47\xf0\x7a\xcb\xcf\x23\x40\x9f\xf0\x11\xe0\x16\xbd\x02\xf2\xcd"
+ "\xaf\xcb\x2b\xd4\xbf\x4f\xf1\x7b\x7b\x8d\x7b\x5e\xe1\x76\xa6\xc8"
+ "\x2b\x78\x7a\x14\x3a\x7a\x85\xdb\x37\x5d\xf7\x0a\xe6\xee\xee\x79"
+ "\x05\xb3\xbf\x6b\x5e\xc1\xbc\x44\x7a\x1e\x41\x43\x81\xfc\x3c\x02"
+ "\x7a\xce\x51\xe3\x59\xbb\xf3\x1a\xcf\x72\xa9\xed\x7b\x05\xcb\x0a"
+ "\x69\x3d\x67\x59\x43\xbd\x82\x39\xbe\xe5\xbd\x82\x39\x5e\xda\x2b"
+ "\x58\xdb\x51\x5d\x65\x8e\x77\xcc\x43\xc3\x77\x24\xbd\x82\x75\x98"
+ "\xfd\x77\xa8\x57\x30\x27\x52\xaf\x60\x0d\x91\xf7\x0a\xd6\xeb\x94"
+ "\xd7\xac\xdc\x1e\x93\x34\xa6\x8e\x5e\xc1\xba\xa1\x79\xaf\x40\x31"
+ "\xc4\xd6\x53\xd6\x2b\x58\x2f\x3a\x7a\x85\x86\xad\x92\x5e\xc1\x93"
+ "\xec\x6f\xc2\x91\x27\x79\x4d\xec\x15\x98\x7e\xf7\x87\x57\x90\xc5"
+ "\xd6\x0a\xb1\x57\x60\x1a\x14\x7b\x05\x4f\x32\x50\x99\x57\x40\xcc"
+ "\x49\x78\x05\x4f\xb2\x84\xc3\x4f\xa2\xa4\x57\xf0\x24\xd9\x92\x5e"
+ "\xc1\x93\x14\x8a\xbd\x02\x96\x2f\xe1\x15\x3c\xc9\x19\x51\xf9\xf6"
+ "\x5e\xc1\x93\xdc\x14\x7b\x05\x7a\x5d\x93\x57\xf0\xf4\xc8\xa1\xfd"
+ "\x5f\xc3\x24\xc5\x5e\xc1\xd3\x63\x89\xac\x57\xf0\xf4\x58\x26\xf2"
+ "\x0a\x9e\x1e\xec\x7c\x5f\xbd\xa7\xc7\x4e\xd6\x2b\x78\x7a\x44\x52"
+ "\xaf\xd0\x30\x51\x78\x9c\xf7\x0a\xf4\x78\x93\x57\x48\xf7\x38\xa0"
+ "\x6c\x6c\x8a\xeb\x79\xe8\x7b\x3f\x36\xc5\xfb\xd7\x35\x36\xc5\xd3"
+ "\x33\xca\x2d\xaf\xe0\xe9\x19\xe9\xbe\x2e\x7d\x24\x8e\xd7\xa5\x8f"
+ "\xc4\xc9\x8e\x81\xf0\xf4\x1a\xe1\x54\x97\x7a\x7a\x1f\x68\xd2\xa5"
+ "\x9e\x0f\x3d\xc6\xf2\xb7\xe7\x43\x1e\x2c\x7f\x7b\xb6\x3f\xec\xea"
+ "\x18\x88\x55\xb7\x38\x2d\x6a\x1b\x03\xb1\x88\x1b\x03\x01\x7a\x94"
+ "\xd5\x9f\x9e\xed\x87\x89\xc6\x40\x78\x7a\x6d\x93\x1b\x03\x21\x39"
+ "\xf6\xc1\x4e\x73\xda\xf4\xe9\x9d\x8c\x7d\xf8\x55\x6b\xce\x74\x8f"
+ "\x32\x56\x73\x7a\xb6\x6f\xe7\x96\xe6\xf4\x6c\xef\x25\xd6\x9c\x3e"
+ "\xbd\x1d\x34\xa7\x67\xfb\x28\x97\x35\xa7\x67\xfb\xd5\x6e\x69\x4e"
+ "\xcf\xf6\x69\x2e\x69\x4e\xcf\xf6\x57\x25\xc7\x3e\x78\x7a\x05\xc9"
+ "\x8e\x7d\xe0\xce\x39\x6a\x05\x6f\x3e\xaf\xe8\xe9\xfd\x5a\x9b\xd7"
+ "\x9c\x9e\x0f\x99\x25\x75\x81\xa7\x77\x3b\x56\x73\x7a\xb6\xaf\x6d"
+ "\x71\xcd\x09\x65\x4a\x6a\x4e\x4f\x6f\xda\xff\xc3\x79\x07\xcd\x89"
+ "\xdf\x91\xd2\x9c\x9e\xde\x85\xf6\xdf\x69\xa4\xd7\x1b\x58\xcd\xe9"
+ "\xe9\x7d\x5c\x56\x73\x7a\x76\x98\x43\x39\xab\xc3\x73\x94\xb3\x68"
+ "\x4c\x1d\x34\xa7\x67\x87\x8e\xcd\x6a\x4e\x0e\x43\x6c\x3d\xe5\x34"
+ "\xa7\x67\x87\x10\x07\xcd\xe9\xe9\x35\x5c\x5a\x73\x3e\x32\x90\xc7"
+ "\xd1\xc3\xc5\x22\xcd\xe9\xd9\x61\xd3\x7d\xa1\x39\x65\xb1\xf5\x90"
+ "\x59\xa4\x39\x3d\x1f\x8e\x51\xae\x39\x1f\xde\xa2\x48\x73\xb2\x98"
+ "\x93\xd2\x9c\x0f\x5f\xe5\xf0\x63\x90\xd6\x9c\x8f\x74\x90\xd6\x9c"
+ "\x8f\xf4\x16\x69\x4e\xb6\x7c\x29\xcd\xf9\xc8\x24\x51\xf9\x0e\x9a"
+ "\xf3\x91\x28\x91\xe6\xe4\xae\xe3\x35\xa7\x8f\x0f\xe5\x50\xcf\x4b"
+ "\xca\x35\xe7\x23\x57\xe5\x35\xe7\x23\x37\xc5\x9a\xf3\x91\x63\x54"
+ "\x5b\xfa\x04\x50\xcd\xf9\x48\x25\x3d\xee\x59\x2d\x3c\xde\xa4\x39"
+ "\xb9\xe3\xbc\xe6\xf4\x09\x74\xa6\x39\x99\xac\x31\x9a\x4c\x95\x75"
+ "\x0f\xfc\xed\x83\x7a\x76\x87\xfe\x4d\x07\xff\x3f\x06\xfd\x54\x17"
+ "\xf8\xbf\x6c\x8e\xcd\xe0\x37\x46\x63\x05\x5d\x62\x85\xdf\x29\x35"
+ "\xfc\xa2\xd3\xf5\x30\x63\x7f\xb2\x87\xf6\x2f\x63\x34\x9d\xcd\x0f"
+ "\x8d\xb3\x32\x91\x84\xf1\x85\xff\xc7\xc3\x31\xb8\xbe\x13\xf4\x87"
+ "\x01\x8b\x48\xa7\x6b\x9e\x3e\x65\xb6\xeb\xa0\xce\x9d\xaa\x3c\x7d"
+ "\x56\x63\x19\x50\xd7\x4a\xb8\x9f\xe1\xb2\x75\x85\xb2\xa6\x6c\xef"
+ "\x45\x92\xcc\xcc\x8f\xba\x79\x75\xa4\xda\xb3\x63\xdf\xce\xb5\x0f"
+ "\x8d\x03\x1e\x22\xa8\x11\xf7\xf4\x30\x78\x61\x99\xba\x79\x8d\x78"
+ "\xce\x1b\xcf\x59\xa0\x8e\xda\x18\xa2\x4a\xaf\x7b\xc8\x1b\x34\x57"
+ "\xbb\x64\x23\x53\xf3\x8e\x19\xea\x0c\xfd\xeb\x57\xbd\x2a\xbc\x76"
+ "\x6f\xac\x60\xfb\x9e\x12\xa3\x85\x2d\x23\x60\x1e\xd6\xa7\x63\xbf"
+ "\xcd\x70\xbd\x54\x1d\x96\xef\x22\x03\xda\xf5\x63\xf4\xca\xfa\xbb"
+ "\x8e\x89\x72\xed\xd8\x79\x59\x2f\xa2\xeb\x0f\x6d\x17\x40\x54\x52"
+ "\xe7\x15\xfe\x8e\xb3\xf1\x0f\xde\xeb\xba\x31\xc6\xe4\x0d\x44\x95"
+ "\x61\x7d\xc8\xfb\x6b\xa8\x51\xde\x7a\xc6\x50\x9f\xde\x29\x58\xef"
+ "\x61\x8e\xc4\x36\x7f\x0f\xce\x67\x74\x63\x0c\x37\x52\x11\x37\x9d"
+ "\x22\x0f\x43\xdf\x6e\x1f\x8b\x05\x11\x31\xb3\x02\xe2\xa2\x62\xe6"
+ "\xbc\xb3\x30\x2e\xa0\x6f\xc4\xc3\x64\xda\x3b\xef\x04\xc4\xcc\x9a"
+ "\xb7\x24\x40\x78\xe6\xf9\x80\x88\xa8\x77\x67\xcd\x8e\x9e\x33\x30"
+ "\xe6\xcd\xd8\x87\x31\xc1\x2a\xa8\x87\x2f\xd6\xc5\x9a\xde\x29\x6e"
+ "\xf3\x5a\x42\xd6\x75\x25\x5e\x58\x2f\xf8\xbd\x0a\xbd\x57\x58\x2d"
+ "\xfe\x5e\xfa\x7a\xc6\xa8\x82\x6b\x92\x81\xd3\x32\xb4\x0f\xc1\xb5"
+ "\x1d\xab\xf3\xa0\x5e\x9b\xa1\xde\x50\x47\xa8\x73\x67\x2f\x5b\x9d"
+ "\x6d\x98\x48\x46\x4c\x68\xeb\x00\x83\x9d\xfb\x76\x36\x3d\xf4\x12"
+ "\xc3\x84\xe2\xfd\x19\xe1\x59\xf1\x80\x63\x07\x59\xdf\x90\x3d\x46"
+ "\x03\xdf\x0d\xb2\x61\xcc\x9a\x95\xa6\x63\xd6\x8f\x36\x80\xae\xf4"
+ "\xa8\x67\x22\xff\x13\xb0\x89\xdf\x5f\x3d\x88\x90\x14\xa6\x3e\x94"
+ "\xdd\x1b\x83\xa9\x07\x0c\x53\x9c\xc2\x39\x75\xf8\x0d\x15\xf9\x23"
+ "\x94\xf1\xbe\x9e\xec\x8c\xc6\x32\xf4\x70\x0c\xdb\xdc\x9a\xbf\x23"
+ "\x38\x44\x43\x52\x7e\x97\x42\x52\xea\xf1\x3b\x5b\xa3\x35\x9d\xe3"
+ "\x88\xc7\x94\x78\xe6\x02\xf0\x8e\x07\xd3\x7b\x47\x30\xb3\x2d\x5a"
+ "\xa3\xf7\xec\x1c\x69\xcd\x4e\xd3\xc1\xfd\xd4\x42\x39\x45\x7a\x8f"
+ "\x21\x3e\x58\x4e\xc6\x7a\xb6\xed\x6b\xf1\xde\xa1\x7d\xc0\xff\x30"
+ "\x3a\x26\x95\x7b\x86\x32\xc3\x35\xd6\xcc\xbd\x7b\x4a\xbd\x6e\x91"
+ "\x29\x66\xe6\x36\xb3\x26\x5c\x53\x62\x34\x02\xa7\xc5\xbe\xc9\x74"
+ "\xea\xb4\xbc\xb3\x39\x6a\x4e\x5e\x57\x78\x16\xd7\xec\xdd\xc3\xac"
+ "\x49\x08\x08\xe9\x47\xd4\xf5\xe9\x6a\x8d\xad\x3d\xa1\x2d\xbd\x94"
+ "\xe1\x48\x3d\x00\xef\x09\xf1\x00\xf5\xe1\xf0\xa0\x8e\x3f\x1c\xe7"
+ "\x88\x87\xa6\x67\x73\x7d\x62\xa0\x99\x09\x7d\xe9\x76\x56\x62\x24"
+ "\xe3\x9b\x38\x4d\x7b\x89\xb4\xc7\xb6\x2d\x01\x2f\x90\xbe\x88\xf8"
+ "\xaf\x9e\x49\x02\xde\x58\xa2\x26\x86\xec\xc4\xe0\xce\xcb\x52\x3c"
+ "\xa0\x4d\x54\xc0\x2f\x81\xc0\x99\x81\xb7\xbb\xa5\xe9\x12\xe7\x10"
+ "\x55\x61\xd5\x1e\x15\xea\x67\x1c\xb7\x72\xd9\xb3\xcb\xb0\xcd\xf0"
+ "\x3d\xe6\x97\x50\x82\xf1\x60\x63\xf1\x4b\x24\x99\x04\xac\x8c\xef"
+ "\x53\xe0\x7c\xcc\x26\x28\x53\xd9\x7d\x75\x61\xf5\xaf\x05\x62\x35"
+ "\x08\xe2\x54\x5a\x6d\x61\xcb\x64\x63\x15\xcd\xc7\xea\x20\xd4\x83"
+ "\x8f\x97\xda\x88\x71\x95\xb9\xe7\x3d\xdc\x3d\xd7\xc0\x3d\x97\x3b"
+ "\xb9\xe7\x32\x7a\xcf\xed\xea\x9c\xdf\x73\xd7\x81\xce\xef\xb9\xeb"
+ "\x2c\x37\xee\xd9\xa4\xfc\x9e\xbb\xd4\xc8\xdf\x73\x12\x17\xe7\x24"
+ "\x88\x73\x92\x93\x38\x27\x71\x71\x7e\xa4\xca\xf9\x3d\x3f\xda\xdb"
+ "\xf9\x3d\x3f\x1a\xa2\xfc\x9e\xbb\xd6\x2a\xbf\xe7\xae\x95\x4e\xee"
+ "\x99\x8b\x73\x12\xc4\x39\xc9\x49\x9c\x93\xb8\x38\x77\xf9\xc6\xf9"
+ "\x3d\xfb\xfa\x39\xbf\x67\xdf\xf1\xca\xef\xf9\x51\xbd\xf2\x7b\x7e"
+ "\xb4\x4c\xfe\x9e\xb5\x5c\x9c\xb5\x10\x67\xad\x93\x38\x6b\xb9\x38"
+ "\x0f\x59\xe5\xfc\x9e\xfd\x3a\x38\xbf\x67\xbf\x11\xca\xef\xd9\xb7"
+ "\x5c\xf9\x3d\xfb\x1e\x71\x72\xcf\x5c\x9c\xb5\x10\x67\xad\x93\x38"
+ "\x6b\xb9\x38\x4f\x1f\xd5\xcc\x3d\x5b\x9c\xdf\x73\xb7\xc1\xca\xef"
+ "\xd9\xef\x98\xf2\x7b\xf6\xdb\x27\x77\xcf\x8d\xc0\xdb\x3e\x70\x2f"
+ "\xb7\xbf\x0b\x7d\xc9\xe2\x9b\x18\xe6\x53\x4d\x54\xb9\xa9\xd6\xc8"
+ "\xce\x35\xa4\x03\xdc\x5b\x24\xb3\x3e\x23\x13\xff\xb5\xfa\x26\x86"
+ "\x36\xfa\x26\x46\x36\x74\x1b\x6d\x58\x3a\x83\xb4\x47\x3d\xbe\xd2"
+ "\x4a\xfc\xad\x59\x89\xd3\xd2\x5e\x21\x01\xc9\x06\xa2\x2e\xd1\xea"
+ "\x89\x36\x96\x31\x94\x90\x8b\xa4\x63\x0d\x7a\xcf\xb3\xa4\xa8\xf6"
+ "\x18\x99\xb7\x80\x61\x2e\x7b\xfe\x26\x09\xf3\x26\xa0\x93\x53\x32"
+ "\xbf\x25\x01\xf0\x1b\x81\x9b\xe1\x0f\xcb\xe9\x3c\x11\xfa\xcf\xf5"
+ "\x19\x6b\xf3\xb4\xc4\xff\xd0\xdc\x1a\x82\xc7\x37\xc1\x9f\x65\x7d"
+ "\x9a\x4e\x3b\x83\xa8\x76\xd5\x55\xa8\x68\xdf\xfc\x9b\xf1\xf6\x7d"
+ "\xf3\xc4\x59\xd0\x96\xb3\xd9\x73\xd9\xb9\xaf\x28\x6d\xcb\xdf\xf8"
+ "\xda\xfa\x6e\xb6\x2d\x2b\x2d\xb4\xbf\xb7\xeb\xbb\x0f\xc1\xef\xf3"
+ "\x6d\xf9\x1b\x2f\x6c\x4b\x26\x2b\x31\xb6\xb4\xa6\x11\x7d\x93\xfa"
+ "\x72\x3c\x51\xe9\x3d\xbb\x7d\x5e\x12\x5b\x47\x64\xda\x78\x8f\xa0"
+ "\x8d\x2b\x7d\xaa\xdb\xd5\xc9\xb4\x71\x05\xb4\x71\x8d\x44\x1b\x97"
+ "\xbb\xd6\xc6\xfe\x17\xef\xbc\x8d\xfd\x0b\xe5\xdb\xd8\xbf\x41\x79"
+ "\x1b\xfb\xc7\x2b\x6f\x63\xff\x48\xae\x8d\x0d\xe2\x36\xf6\xf7\x97"
+ "\x6f\xe3\x24\x01\x8e\x93\x00\xc7\x8f\x54\x49\xb7\x71\x12\xe0\x38"
+ "\x49\x02\xc7\x49\x2e\xe2\xb8\xc7\xd8\x3b\x6f\xe3\x1e\x5d\xe4\xdb"
+ "\xb8\xc7\x0c\xe5\x6d\xdc\xbd\x52\x79\x1b\x77\x2f\xa2\x6d\x9c\x64"
+ "\x87\xe3\xee\x89\x4e\xda\x58\x80\xe3\x24\xc0\x71\x97\x6f\x64\xda"
+ "\x18\x70\x9c\x24\x81\xe3\x24\x17\x71\xfc\xdb\xed\x77\xde\xc6\xbf"
+ "\x5d\x28\xdf\xc6\xbf\x3d\xac\xbc\x8d\x7f\x1b\xa4\xbc\x8d\x7f\x1b"
+ "\xc8\xb5\xb1\x1d\x8e\x7b\xe8\xe5\xdb\x58\x2b\xc0\xb1\x16\x70\x3c"
+ "\x64\x95\x74\x1b\x6b\x01\xc7\x5a\x09\x1c\x6b\x5d\xc4\xf1\x63\x1d"
+ "\xef\xbc\x8d\x7b\x9e\x91\x6f\xe3\xc7\xfa\x2a\x6f\xe3\x9e\x5b\x95"
+ "\xb7\x71\xcf\x2c\xda\xc6\x5a\x3b\x1c\xf7\x1c\xe3\xa4\x8d\x05\x38"
+ "\xd6\x02\x8e\xa7\x8f\x92\x69\x63\xc0\xb1\x56\x02\xc7\x5a\x17\x71"
+ "\xdc\x6b\xfe\x9d\xb7\x71\xaf\x11\xf2\x6d\xdc\x6b\xa5\xf2\x36\xee"
+ "\xe5\xad\xbc\x8d\x1f\x33\x71\x6d\x6c\x87\xe3\xc7\x0a\xe4\xda\xf8"
+ "\x36\x78\xc0\x8e\xd0\xc6\x1d\x6b\x89\x6a\x13\xb6\x6d\x05\x6d\x5b"
+ "\x4b\xb7\x8c\xcc\x4d\x2a\x6b\x24\xb6\x09\x9b\x03\xfa\xd9\xbf\x93"
+ "\x25\x2b\x31\x8c\x51\xc1\x3d\x69\x31\xef\xda\xeb\xba\x39\x95\x74"
+ "\x0a\xd0\x62\xfe\x37\x80\x1d\x1f\x1b\xa0\xfd\xe0\x1c\xfc\x9e\x27"
+ "\xe6\xbd\xcc\xd9\xa3\xca\x2c\x7e\x29\xf9\x70\xae\x1f\xd3\x77\x5e"
+ "\x10\x78\xaf\x58\xe6\x6d\x7f\xdf\xd2\xda\x3d\xd0\x3e\x27\x48\x49"
+ "\xc5\x97\xc4\xda\x2d\x63\xed\x20\x33\xd1\x30\x3f\x6b\x7c\x8b\xe2"
+ "\xf4\xc4\xf2\xa6\xbf\x4f\x69\xfc\x31\x52\x1a\xff\x19\x99\x52\xc3"
+ "\xdc\x62\x7e\xd0\xf8\xdc\xf6\xcb\xae\xb0\xf8\x65\xc4\x5a\xb2\xf3"
+ "\x22\xcd\x7e\xd9\xc7\x0a\x17\xe9\x55\x3e\x26\xa2\x89\xae\x66\x98"
+ "\xf4\xd9\xc4\x2b\xbd\x8a\x78\x67\xcc\x26\x3e\x19\x55\x44\x5d\x54"
+ "\x5d\x41\x8a\xaf\x1c\x23\xc5\x75\x67\x48\xf1\x2d\xf8\x6b\x84\x3f"
+ "\x2b\xfc\xa5\x9c\x81\x58\x13\x32\xe9\x2a\xc1\x7d\x45\x0d\x4f\x57"
+ "\x12\xdf\x22\x73\x05\xc1\x39\xbd\xd7\x3c\x1f\x3f\xea\x13\x4e\x7c"
+ "\x99\x1f\xfc\x09\xf3\xa6\xbf\x0a\xce\x79\xe1\xf1\x52\xb3\x81\x14"
+ "\x55\x9b\xf0\xfc\x56\x38\xef\x95\x5c\x0d\xe5\x5b\x8f\xe1\xbe\xa1"
+ "\x86\xa2\x94\xe3\xc4\xbc\xa6\x4e\xc7\xa0\x87\xee\x96\x18\x98\x09"
+ "\x4d\x6d\x65\xfc\x9f\xa0\x38\x08\x38\xb7\xd9\xaa\x34\xd6\x8f\xd3"
+ "\xf5\x6f\xde\xf6\xef\x0a\xed\xdc\xc3\xfa\x76\xa8\x7a\xf2\x99\x0b"
+ "\x0c\x8e\xf1\xc3\x5c\x42\x89\xf1\x04\xc1\x77\x4d\x53\x96\x10\x32"
+ "\xd1\x42\x08\xb6\x45\x69\x7c\x0d\x99\x1c\x4b\x3a\x63\xfe\xd9\xfa"
+ "\xb3\xa6\x6b\x69\xb5\x81\x24\x99\xa1\x8e\xd7\x4c\x4d\x75\x2c\x79"
+ "\xbf\x84\xc0\xb9\x1e\x25\x91\x7a\xe2\x13\x4b\xd4\xd8\xbe\xe6\xac"
+ "\xc4\xd0\xc9\xf0\xfc\xcc\x33\x32\x0c\xb6\x2d\xb6\x29\xb6\x2f\x96"
+ "\x67\x6b\xf3\xd2\x08\x03\x49\x36\x11\x75\xa9\x16\xfe\x8d\x67\x0c"
+ "\xa5\xe4\x3a\x81\x3a\x56\x30\x5d\xea\x74\x80\x8b\x2c\xc4\x02\xe0"
+ "\xb3\x06\xe2\xdf\x55\x06\x53\xe5\x14\x53\xed\xea\x5c\xc0\x54\x25"
+ "\x8f\xa9\xde\x63\x79\x4c\x3d\xd9\x5b\x1e\x53\x4f\x24\x71\x98\x32"
+ "\xb4\x4d\x4c\x3d\xd1\xdd\x39\xa6\x7a\x9b\x9c\x60\xaa\x06\x30\xb5"
+ "\x47\x8c\xa9\x27\x07\x2b\xc7\xd4\x13\xe3\xee\x22\xa6\x2a\xdc\xc3"
+ "\xd4\x13\x03\xc4\x98\xea\x3d\x5c\x1e\x53\x49\x1c\x4f\x3d\x52\xd5"
+ "\x3c\xa6\x92\x04\x3c\xf5\xe4\x06\x1e\x53\x7d\x17\xca\x63\xaa\xcf"
+ "\x29\x8a\xa9\xa4\x36\xca\x53\x7d\x62\x9c\x63\xaa\xcf\x44\x79\x4c"
+ "\x25\x01\x4f\x25\xd9\xf1\x54\xdf\xe5\xca\x31\xd5\x27\xf7\xee\x61"
+ "\x2a\xc9\x4d\x9e\xea\x93\x22\xc6\xd4\x93\x99\x4e\x30\xc5\xf1\x54"
+ "\x97\x6f\x5c\xc0\x94\x80\xa7\xfa\x5e\xe5\x31\xf5\xbb\xe3\xf2\x98"
+ "\xfa\x5d\x5f\x0e\x53\x6d\x94\xa7\x9e\x3a\xec\x1c\x53\x4f\xe5\x3b"
+ "\xc1\x14\xf0\x54\x92\x1d\x4f\xfd\xee\x8c\x72\x4c\x3d\x65\xb8\x8b"
+ "\x98\x72\x93\xa7\x9e\x2a\x17\x63\xaa\x6f\xb5\x3c\xa6\xb4\x1c\x4f"
+ "\x0d\x59\xd5\x3c\xa6\xb4\x02\x9e\xd2\x8c\xe4\x31\xd5\xff\x31\x79"
+ "\x4c\xf5\x5b\x42\x31\xa5\x6d\xa3\x3c\xd5\xcf\xcf\x39\xa6\x34\x46"
+ "\x79\x4c\x69\x81\xa7\xb4\x76\x3c\xd5\x7f\xa0\x72\x4c\xf5\x1b\x73"
+ "\xf7\x30\xa5\x75\x93\xa7\xfa\x69\xc4\x98\xd2\x0c\x75\x82\x29\x8e"
+ "\xa7\xa6\x8f\x72\x01\x53\x02\x9e\xea\x9f\xcd\x63\x6a\xc0\x7c\x79"
+ "\x4c\x3d\x5d\xcc\x61\xaa\x8d\xf2\xd4\xd3\x51\xce\x31\xf5\xf4\x38"
+ "\x27\x98\x02\x9e\xd2\xda\xf1\xd4\x80\x65\xca\x31\xf5\x74\xce\x5d"
+ "\xc4\x94\x9b\x3c\xf5\x74\xa2\x18\x53\xfd\xd3\xe4\x30\xd5\x88\xbe"
+ "\xcf\x03\x30\x15\x09\xbe\x0f\x30\xd4\xb9\x8c\x62\xea\x36\x60\xea"
+ "\x23\x21\xa6\xbe\xb7\xf7\x7d\x03\x7e\xb2\x36\x61\xea\x99\x9b\xf6"
+ "\x98\xb2\x02\xa6\x6e\xb3\x98\x7a\xa6\xa3\xcd\xf7\x95\xd6\xe6\x43"
+ "\xac\xae\x90\xd2\x60\xc0\xd3\x7a\x0e\x4f\xdf\x03\x9e\xe0\x7e\xac"
+ "\x70\xbf\x45\x95\x15\x64\x8a\x81\xde\x57\x23\xdc\xaf\x55\x88\xa5"
+ "\xc6\x1a\x15\x62\x08\xb1\x63\xc3\x51\xf1\x3c\xc0\xcf\x82\x53\xa4"
+ "\x78\x11\xfc\x25\xc0\x9f\x16\xfe\xc8\x29\x52\x54\x43\xd8\x9c\x3d"
+ "\x8f\x9f\x32\x0e\x3f\x03\xb7\x3b\xc7\xcf\xc0\x15\xca\x3c\xde\xa0"
+ "\x76\xca\xf1\x33\xb0\x82\x1b\x4b\xa7\x9e\x32\xf5\x02\x83\xe3\x66"
+ "\x29\x46\xae\x90\x29\x66\xd2\x99\x99\xae\xe9\xea\x13\x4a\xd4\x4b"
+ "\x2d\x44\xb5\x7a\x36\x51\xaf\x3e\x0b\xf7\x6b\x7b\x76\xaa\x88\xcf"
+ "\x09\xd3\x97\xa4\xa8\xae\x82\x14\xdd\x3a\x4e\x8a\xac\xf0\x77\x05"
+ "\xfe\xa0\x8e\x53\xe6\x08\xef\xd7\xc0\xdd\xef\x33\x1b\xa0\xac\x3e"
+ "\xf2\xf7\xfb\x4c\x3c\x7b\xbf\x11\x70\xbf\x8d\xfc\xfd\x96\x02\x16"
+ "\x21\x2e\x3d\xac\x9c\x4f\x9c\x62\x20\x1d\xde\x31\x33\x4c\x23\x87"
+ "\x41\x8c\xcb\x89\x72\x13\x99\x12\x0b\xb1\x7a\x13\x30\x58\x5d\x40"
+ "\x92\x13\x01\x83\x8d\x26\x7c\xaf\x6f\x28\x4d\x69\x00\x0c\x0e\x3c"
+ "\xc0\x40\xbb\xdd\x46\x0c\x7e\x8f\x18\x1c\xa0\xb7\xca\x63\xb0\x9c"
+ "\x62\x10\x7c\x62\xf3\x18\x14\xf0\xda\xa0\x18\x1e\x83\x83\x97\xc8"
+ "\x63\x30\x70\x8d\xcd\x27\xde\x7b\x0c\x06\x0e\x74\x8e\xc1\x40\x1f"
+ "\x65\x9e\x70\xf0\x4a\xe5\x18\x0c\x0c\xbb\x7b\x18\x1c\xfc\x98\x73"
+ "\x0c\x06\x9a\x5d\xc0\x60\x85\x7b\x18\x0c\x0c\x12\x63\x70\x50\x84"
+ "\x3c\x06\x93\x38\x1e\x04\x5f\xd9\x2c\x06\x85\xbe\x72\xf0\x75\x1e"
+ "\x83\xff\x61\x91\xc7\xe0\x7f\xf8\xd9\x7c\xe5\xbd\xc7\xe0\xef\xf7"
+ "\x3a\xc7\xe0\xef\x33\x95\x79\xc8\x67\x3b\x2a\xc7\xe0\xef\xf5\x77"
+ "\x0f\x83\xff\xb1\xc5\x39\x06\xff\x23\xa5\x79\x0c\x26\xb9\xc9\x83"
+ "\xbf\x3f\x22\xc6\xe0\xe0\x1a\x27\x18\xe4\x78\x10\x7c\x68\xf3\x18"
+ "\x14\xf0\xe0\xb3\x0b\x79\x0c\x0e\x59\x26\x8f\xc1\xe7\x36\xd8\x7c"
+ "\xe8\xbd\xc7\xe0\x73\xcf\x39\xc7\xe0\x73\xbe\xca\x3c\xe7\x90\x35"
+ "\xca\x31\xf8\x5c\xc4\xdd\xc3\xe0\x90\xbe\xce\x31\x38\xc4\xcb\x05"
+ "\x0c\xba\xc9\x83\xcf\x8d\x13\x63\xf0\xd9\x68\x79\x0c\x6a\x39\x1e"
+ "\x04\xdf\xda\x2c\x06\x85\xbe\x75\x48\x03\x8f\xc1\x61\xed\xe4\x31"
+ "\x38\xf4\x31\x9b\x6f\xbd\xf7\x18\xfc\xc3\x7e\xe7\x18\xfc\x43\x8e"
+ "\x32\x8f\x3a\xcc\x4f\x39\x06\xff\x50\x73\xf7\x30\x38\x74\xbb\x73"
+ "\x0c\x0e\x5d\xd1\x3c\x06\xb5\x6e\xf2\xe0\x1f\x8a\xc4\x18\x1c\x62"
+ "\x70\x82\x41\x8e\x07\xc1\xe7\x36\x8f\x41\x01\x0f\x0e\x4b\xe2\x31"
+ "\xf8\xc2\x4a\x79\x0c\x3e\xbf\xc5\xe6\x73\xef\x3d\x06\x9f\x1f\xe1"
+ "\x1c\x83\xcf\xf7\x54\xe6\x69\x5f\xd8\xa0\x1c\x83\xcf\x47\xdf\x3d"
+ "\x0c\xbe\x30\xd0\x39\x06\x5f\xf0\x71\x01\x83\x6e\xf2\xe0\xf3\xc1"
+ "\x62\x0c\x0e\x8b\x93\xc3\xa0\x15\x7c\xf1\xed\xad\xf3\x82\xac\x59"
+ "\xd9\x15\x9d\x3d\x02\x88\xd9\x37\x25\xbf\x34\xce\x48\x26\xdf\x84"
+ "\xf6\x89\xbd\x49\x66\xde\x54\x13\x4b\x56\xf6\x31\xd0\xe4\xa1\x02"
+ "\xff\xcc\x8e\x2d\x33\x67\xd6\xe9\x32\xe6\x11\x2f\xf0\xdf\x6b\xf1"
+ "\x58\xe9\x65\x13\xc1\xdf\x4f\xc2\xfa\x5c\xe1\xeb\x83\x79\x02\xe6"
+ "\x17\x8d\x9a\x7d\xc7\xdc\xa8\x27\xd5\xc3\x89\x67\x51\xb5\x1e\xda"
+ "\x21\x81\x8d\x2f\xb6\xcb\x65\xcf\xe1\xd1\x79\xd7\x88\x97\xf9\x07"
+ "\xff\x1e\xd0\xde\xbe\x1d\x17\x13\x8f\x9e\xd5\x8c\x15\xdb\x15\xdb"
+ "\x0b\xdb\x38\x20\x01\xdf\x5d\x0f\x3f\x58\x02\x18\x33\xff\xa0\xe9"
+ "\xb1\x19\xae\x93\xf6\xab\xc3\x8f\x2a\xc7\xc6\xf0\x15\x74\xde\xc2"
+ "\xf0\x88\xa2\x4a\x22\xf9\xee\x18\xda\xaa\xdc\xc5\xb6\xaa\x10\xf8"
+ "\xbc\x56\x68\xab\x11\x39\xae\xb5\xd5\x88\x9f\xec\xda\x4a\xc2\x57"
+ "\x8d\xb8\xae\xbc\xad\x46\x7c\x4e\xdb\x6a\x44\xa6\x7c\x5b\x25\xb9"
+ "\x88\xab\xa4\x50\x81\x1f\x69\x85\xb6\xfa\xcf\x23\xae\xb5\xd5\x1f"
+ "\xfd\xc4\x6d\x25\xa5\xff\xff\xf8\x98\xf2\xb6\xfa\x4f\x3d\x6d\xab"
+ "\xff\x3c\xe0\xa4\xad\x5c\xc4\x55\x52\x85\x40\x37\xb7\x42\x5b\xfd"
+ "\xd1\xe0\x5a\x5b\x05\x8d\xb4\x6b\x2b\x09\x9d\x1a\x34\x5e\x79\x5b"
+ "\x05\xd1\xfd\xf0\x3c\xff\x58\x23\xdf\x56\x5a\x17\x71\xa5\x0d\x15"
+ "\xe8\xbb\x56\x68\xab\x91\x3d\x5d\x6b\xab\x91\x31\xe2\xb6\x92\xd2"
+ "\x53\x23\x17\x2a\x6f\xab\x91\x43\x69\x5b\x8d\xf4\x75\xd2\x56\x2e"
+ "\xe2\x4a\x5b\x21\xd0\x21\xad\xd0\x56\xa3\xc6\xb9\xd6\x56\xa3\x36"
+ "\xd8\xb5\x95\x44\xbf\x3f\x6a\x8b\xf2\xb6\x1a\x15\x41\xdb\x6a\x54"
+ "\x90\x5c\x5b\x59\xb2\x12\xa7\x75\x86\x36\x68\x58\x9f\x18\xd8\x39"
+ "\x9e\xa8\x1a\xfb\x40\xbb\xf9\x42\xbb\x2d\x0b\x20\xb7\xb3\xa0\xdd"
+ "\x0c\x66\x32\x79\xfe\x05\xa6\xa4\xd6\x42\x1a\xa1\xcd\x1a\x7c\x13"
+ "\x43\x4b\x0d\x35\x38\xe6\xe8\x85\x2a\xcf\x31\xcb\xa6\xcf\x57\x13"
+ "\x6c\x37\x6c\x07\x6c\x3b\x06\xda\x8d\x6d\x47\xdf\xbc\x48\x8b\x6f"
+ "\x46\xec\xa4\xab\x17\x98\x77\xf4\x0c\x83\xf7\xcb\xf8\x8e\x2a\xc3"
+ "\xf7\x02\x53\x6a\x48\x87\x80\x57\xf0\x9e\xc6\x0c\xc6\xe3\xa5\x86"
+ "\x0a\xd0\x07\x75\x84\xd5\x66\x17\x34\xbe\x96\x57\x35\x3e\x96\xd2"
+ "\xd0\x97\x98\x6e\xa3\x0d\xe6\x6e\x69\xba\xe4\xab\xa4\x3d\xea\x87"
+ "\x74\x2b\xf1\x4f\x8a\x21\xaa\x5d\x73\x75\x2a\x76\xee\xda\x02\x2c"
+ "\x63\xb4\x05\xda\xc5\x9f\xb9\x21\x18\xd3\x7d\x23\x92\x94\x5e\xce"
+ "\x64\xe3\x66\xaf\x11\xd8\xb8\x7d\xa7\x51\x83\xce\x0c\x64\x7c\x13"
+ "\x23\x33\x4b\x48\x00\x73\x1b\xda\x98\x9d\x4f\x34\xe6\xa7\xbc\x46"
+ "\xa5\x6d\x3c\x9a\x1d\xff\x6d\x0d\xe0\xc6\x6f\x41\x3b\xe1\xef\xb3"
+ "\xe3\xb7\x62\x05\xe3\xb7\xa0\xce\xfc\xf8\xad\xd1\x69\x38\x7e\xcb"
+ "\x7a\xc1\xbf\x87\xed\xde\xdf\x89\x66\x18\xb8\xf7\xae\x25\x46\x03"
+ "\xc1\xfb\x2f\x31\xea\x48\x72\x1c\x51\x97\x34\xd6\x10\xad\x91\x31"
+ "\x94\xa4\xfc\x44\xa6\xdc\x44\x1d\x8c\x78\x19\xb3\x84\xc6\x75\xf4"
+ "\x44\xeb\x05\x4d\x0f\xbd\xe7\x98\xd8\x92\x32\x42\x04\xf3\x78\x22"
+ "\x41\x33\x7b\x43\x1c\x22\x4b\x53\xaa\x08\xc4\xc4\x50\x6a\x3e\x8b"
+ "\x71\x8a\x84\xf3\xc3\x9b\xf4\x75\xb7\x8c\x3a\x3c\x86\x31\xc3\xf7"
+ "\x4d\xb8\x76\x40\x9e\x40\x7f\x23\x2e\x3a\xc7\xa7\x90\xd2\xf8\x46"
+ "\x52\x62\xc6\x39\xbb\xa3\x4c\x27\x43\x2b\xe4\x70\x54\xce\xe1\x68"
+ "\x4f\xe7\xf8\x76\x75\x2e\xe0\xa8\x82\xc7\xd1\x8b\xc7\xef\x0c\x47"
+ "\x2f\x2e\xb9\x73\x1c\xbd\x38\xf6\x0e\x70\x54\x23\xc6\xd1\x4b\x83"
+ "\x95\xe3\xe8\x45\xb5\x72\x1c\x8d\x2d\xbf\x33\x1c\xbd\x78\x98\xe2"
+ "\x68\x6c\x16\xc5\xd1\x8b\xfb\x78\x1c\xb1\x73\xa3\x5a\x09\x47\x63"
+ "\x83\xe4\x71\x94\xc4\xf1\x51\x12\xf0\xd1\x23\x55\xcd\xe3\x28\x49"
+ "\xc0\x47\xe3\xbb\xdc\x19\x8e\xc6\x1d\xbe\x73\x1c\x8d\x5b\xed\x3e"
+ "\x8e\x92\xec\xf8\x68\xfc\x12\xe5\x38\x1a\x17\xaa\x1c\x47\xe3\x7a"
+ "\xde\x19\x8e\xc6\x77\xa0\x38\x7a\xa9\x92\xe2\x68\x3c\xe1\x71\xc4"
+ "\xce\x37\x6b\x25\x1c\xbd\xb4\xc2\x09\x8e\x38\x3e\x4a\x02\x3e\xea"
+ "\xf2\x8d\x0b\x38\x12\xf0\xd1\xcb\xaf\xdd\x19\x8e\x5e\xee\x70\xe7"
+ "\x38\x9a\x70\xfa\x0e\x70\x64\xc7\x47\x2f\x1f\x56\x8e\xa3\x09\xf9"
+ "\xca\x71\x34\x21\xe2\xce\x70\xf4\xf2\x54\x8a\xa3\x09\x7d\x28\x8e"
+ "\x5e\x1e\xc7\xe3\x88\x9d\xc3\xd7\x4a\x38\x1a\x5f\x26\x8f\x23\x2d"
+ "\xc7\x47\x5a\xe0\xa3\x21\xab\x9a\xc7\x91\x56\xc0\x47\x93\xb6\xdc"
+ "\x19\x8e\x26\x4d\xbd\x73\x1c\x4d\x7a\xcc\x7d\x1c\x69\xed\xf8\x68"
+ "\x72\x07\xe5\x38\x9a\x58\xa3\x1c\x47\x13\x77\xde\x19\x8e\x26\x6d"
+ "\xa0\x38\x9a\x18\x4d\x71\x34\x29\x93\xc7\x11\x3b\x2f\xb2\x95\x70"
+ "\x34\xd1\xdf\x09\x8e\x38\x3e\xd2\x02\x1f\x4d\x1f\xe5\x02\x8e\x04"
+ "\x7c\x34\xe5\xa7\x3b\xc3\xd1\x94\x0d\x77\x8e\xa3\x29\x73\xee\x00"
+ "\x47\x76\x7c\x14\x3c\x55\x39\x8e\xa6\x04\x2a\xc7\xd1\x64\xe3\x9d"
+ "\xe1\x68\xca\x45\x8a\xa3\xc9\x9f\x53\x1c\x4d\xa9\xe0\x71\xc4\xce"
+ "\x35\x6d\x25\x1c\x4d\x0e\x97\xc3\x11\xae\x45\xb0\x8e\xae\x0b\x61"
+ "\xcc\x48\x20\x43\xf3\xf0\xdf\x46\x12\x58\x9f\x1e\xbc\xe2\x70\x22"
+ "\x5d\x0f\x40\xef\x19\xcc\xe6\x7b\xa5\xbe\xff\xc8\x76\x88\x8b\x6f"
+ "\x62\xf0\x94\x73\x74\x8d\x06\x5c\x17\xe4\x46\x72\x24\x19\xc4\xae"
+ "\xcb\x30\x55\x87\xeb\x58\x35\xad\x1d\xe0\x2b\xb3\x76\xc0\xeb\xf2"
+ "\x6b\x07\x34\xae\xb7\xcd\xbb\x2d\x10\xcc\xbb\x9d\xba\xda\xf9\xbc"
+ "\xdb\xa9\x0b\x37\xbd\xae\x14\x0f\x53\x83\xf0\x1e\x6f\x74\x4b\x84"
+ "\x7b\x9f\xfa\x3e\xdc\x73\x18\xbd\x77\x00\xbc\x4b\xf3\x71\x0b\x04"
+ "\x38\x99\x1a\x18\x12\x46\x52\x98\x74\xf5\xfb\x8c\x5f\x62\x30\x93"
+ "\x9d\x18\xae\xb0\x2e\xff\xbf\xbd\xef\x01\x88\xaa\xca\xfe\xbf\x33"
+ "\x0c\x45\x86\x32\x18\xb8\xd4\x5a\x8d\x2d\xb6\xd8\x9a\x62\x59\x6b"
+ "\xfb\xd5\x8d\x12\x8b\x4a\x05\x0d\x75\x54\x54\x34\x34\x48\x44\x02"
+ "\x54\x44\x18\x90\xac\xd5\x42\x40\x02\x16\x93\x7f\xb6\xd4\x9a\xab"
+ "\x49\xad\xee\xd2\xae\xd6\xb4\x6a\x8b\x85\x40\xa5\x2d\xed\xe2\x36"
+ "\xb1\x64\x64\x68\x93\x8e\xf2\x6f\x66\xee\xef\x9c\x77\xdf\xf0\xde"
+ "\x0c\x33\x30\x6f\x06\x59\x7f\x6d\x53\x4f\x66\xee\x3b\xef\xdc\x7b"
+ "\xcf\xf9\xdc\x73\xcf\x3d\xef\xbd\x73\x1d\xee\x7f\xc8\xcb\xbb\xd1"
+ "\xbe\xbc\x9f\x0c\xe6\xe5\x5d\xcd\xcb\xdb\x7e\xde\x82\x45\x8e\xf3"
+ "\x16\xd8\x97\xf7\xdc\x01\xde\x73\x9e\xfb\x95\x74\x79\xcf\xad\xe6"
+ "\xe5\x5d\xdd\x91\x3b\xd7\x20\xc8\xfb\xc9\x44\xe9\xf2\x9e\x5b\xc9"
+ "\xe4\xed\x9b\x0a\xf2\x6e\x04\x79\x4b\xcc\xdf\xf2\xa4\xc3\xfc\xdf"
+ "\x4c\xde\x19\x0e\xf0\x1d\x59\xc9\xe4\xcd\xe7\x4c\xf0\x73\x90\x33"
+ "\x61\x91\xe3\x9c\x09\xf6\xe5\x1d\xb9\xa6\x7f\x79\x47\xce\x93\x2e"
+ "\xef\x48\x15\x93\x77\x06\xe0\x3b\x32\x46\x90\x77\xa4\x4e\xba\xbc"
+ "\x23\x95\x4c\xde\x23\xe3\xa9\x7f\x06\xe0\x3b\x43\x22\xbe\x23\xf7"
+ "\x0d\x20\x6f\x07\xf8\x9e\xaf\xe4\xe5\xcd\xe3\xdb\x41\xbe\x86\x45"
+ "\x8e\xf3\x35\xd8\x97\xf7\xbc\x33\xfd\xcb\x7b\xde\x71\xe9\xf2\x9e"
+ "\x97\xcf\xcb\x1b\xf0\x3d\xef\x94\x20\xef\xf9\x11\xd2\xe5\x3d\x2f"
+ "\x8b\xc9\xfb\xa6\x68\x90\x37\xe0\x3b\x43\x22\xbe\xe7\x8f\xee\x5f"
+ "\xde\x1a\x07\xf8\x5e\x90\xc5\xe4\xcd\xe7\x8a\xf0\x73\x90\x2b\x62"
+ "\x91\xe3\x5c\x11\xf6\xe5\xbd\x60\x56\xff\xf2\x5e\x70\x9f\x74\x79"
+ "\x2f\x20\x4c\xde\x1a\xc0\xf7\x82\x50\x41\xde\x0b\xb4\xd2\xe5\x3d"
+ "\x5f\xcf\xe4\xed\x17\x49\xfd\x35\x80\x6f\x8d\x44\x7c\x2f\xc8\x19"
+ "\x40\xde\x0e\xf0\xad\xd6\xf3\xf2\xe6\xf1\xed\x20\x4f\xc5\x22\xc7"
+ "\x79\x2a\xec\xcb\x5b\x7d\xa4\x7f\x79\xab\x5f\x93\x2e\x6f\x75\x22"
+ "\x2f\x6f\xc0\xb7\xfa\xa0\x20\xef\x85\xc1\xd2\xe5\xad\x8e\x66\xf2"
+ "\xf6\x0f\x03\x79\x03\xbe\x35\x12\xf1\xad\x36\x3a\x92\xb7\x0f\xc8"
+ "\xfb\x38\xf8\x31\x30\x0f\xaa\xcd\x85\xe0\xa7\x98\xac\xe5\xde\x90"
+ "\x3a\x85\x4c\xb8\x82\xb2\x5f\xd4\x0c\x73\x87\x7a\xe8\xf2\x65\x2c"
+ "\x3a\xee\xfe\xbb\xc3\x8b\x76\x38\x7e\x77\x78\xd1\x46\xe9\xef\x0e"
+ "\x2f\x0a\x15\x7c\xa0\x45\x5b\x05\x9d\x2e\xe6\xec\x87\xb4\x77\x8a"
+ "\x17\x4d\xb6\x9f\x47\x63\x61\x2b\xbe\x53\x4c\x73\x47\x4d\x35\x17"
+ "\xb9\xe2\x1b\x2d\x6a\x73\x42\xd7\x4d\xa0\x87\x46\xc7\xba\x8e\xaa"
+ "\x05\x5d\x37\x0d\x5d\xde\x8e\xa8\xb7\xdc\xd7\x75\x54\x86\x63\x5d"
+ "\x47\xad\x94\xae\xeb\xa8\x60\xc1\xff\x8a\x4a\x11\x74\xbd\xc4\x85"
+ "\xf7\xc7\xa3\x54\xf6\xf3\x79\x2c\x6e\x64\xba\xfe\x49\x25\xe8\xda"
+ "\x05\xbf\x2c\xea\xd4\xc0\xba\xce\x80\x71\x9d\xd1\xcf\xb8\x5e\x7a"
+ "\x10\xe6\x4c\xf5\xd0\xe5\x0f\x59\x5a\xe6\xbe\xae\x97\xc6\x39\xd6"
+ "\xf5\xd2\x39\xd2\x75\xbd\x74\xb4\xe0\xfb\x2d\x8d\x16\x74\xbd\xd4"
+ "\x20\x5d\xd7\x4b\xbd\xed\xe7\x15\x59\x72\x98\xe9\xfa\x66\x85\xb9"
+ "\xc8\x15\x9f\x70\xa9\xd6\x09\x5d\xc3\xb8\xce\xe8\x67\x5c\x47\x57"
+ "\x82\xae\x9b\x86\x2e\x8f\x49\xf4\x36\xf7\x75\x1d\x3d\xcf\xb1\xae"
+ "\xa3\xa7\x49\xd7\x75\xb4\x97\xe0\x77\x46\xcf\x14\x74\x1d\xad\x93"
+ "\xae\xeb\x65\x9d\xf6\xf3\x9b\x2c\xdb\xc3\x74\x7d\x4b\x2c\xe8\xda"
+ "\x05\x7f\x34\xda\xa1\xff\x2f\xe8\x5a\x03\xe3\x5a\xd3\xcf\xb8\x5e"
+ "\x91\x03\xbe\x82\x7a\xe8\xf2\xa9\xac\x58\xe7\xbe\xae\x57\x3c\xe4"
+ "\x58\xd7\x2b\xc6\x49\xd7\xf5\x72\x83\xe0\xf3\xae\x98\x22\xe8\x7a"
+ "\x45\x9d\x74\x5d\x2f\x6f\xb5\x9f\x67\x65\x79\x21\xd3\xf5\x4f\xeb"
+ "\xcc\x45\xae\xf8\xc2\x2b\x4a\x9c\xd0\x35\x8c\x6b\x4d\x3f\xe3\x3a"
+ "\x06\xd6\xf5\x9a\xa6\xa1\xcb\xeb\x12\xb3\xdc\x7d\x5d\xc7\xdc\xed"
+ "\x58\xd7\x31\xfe\xd2\x75\xfd\x94\x4e\xf0\xb7\x63\x02\x05\x5d\xc7"
+ "\xd4\x48\xd7\xf5\x53\x8d\xf6\xf3\xbd\x3c\x95\xc5\x74\x7d\x6b\x30"
+ "\xe8\xda\x05\x3f\x3c\x66\x8b\x2b\x7e\x78\x72\x19\xf1\xb2\xd6\xf7"
+ "\xaa\xd8\xa1\xf5\xc5\x57\xcd\x71\x5f\xdf\xab\x6e\x75\xac\xef\x55"
+ "\x9e\xd2\xf5\xbd\xb2\x51\xf0\xc5\x57\xf9\x09\xfa\x5e\xb5\x47\xba"
+ "\xbe\x57\x6a\xed\xfb\xe2\x2b\x13\xdd\xf3\xc5\x57\xa5\xb8\xe2\x8b"
+ "\xf7\xd5\x77\xac\x7a\x68\xfd\xf1\xd8\x87\xdc\xd7\x77\xec\x70\xc7"
+ "\xfa\x7e\xfa\xb2\x74\x7d\x3f\xad\x15\xfc\xf1\x58\x85\xa0\xef\xd8"
+ "\x12\xe9\xfa\x7e\xba\xda\xbe\x3f\xfe\x74\xb4\x7b\xfe\x78\x6c\x8c"
+ "\x2b\xfe\x78\x5f\x7d\x3f\x13\x36\xb4\x3e\xf9\x33\x93\xdc\xd7\x77"
+ "\x9c\xc9\xb1\xbe\xe3\xbe\x92\xae\xef\xb8\x6a\xc1\x27\x8f\x13\xc5"
+ "\xbf\x9f\xd9\x2a\x5d\xdf\x71\x95\xf6\x7d\xf2\xb8\x08\xf7\x7c\xf2"
+ "\x67\x22\x5d\xf1\xc9\xfb\xea\x3b\x7e\xca\xd0\xfa\xe5\xf1\x63\xdc"
+ "\xd7\xf7\xea\xf3\x8e\xf5\xbd\xfa\xb4\x74\x7d\xaf\xae\x14\xfc\xf2"
+ "\xd5\xad\x82\xbe\xe3\x5d\xc8\x9f\xb9\x3a\xdf\xbe\x5f\xbe\x3a\xc4"
+ "\x3d\xbf\x3c\x3e\xd4\x15\xbf\xbc\xaf\xbe\x13\x82\x86\xd6\x37\x4f"
+ "\xf0\x75\x5f\xdf\x6b\xce\x38\xd6\xf7\x9a\xe3\xd2\xf5\xbd\x26\x5f"
+ "\xf0\xcd\xd7\x88\xe2\xff\x09\xb1\xd2\xf5\xbd\x26\xcb\xbe\x6f\xbe"
+ "\x26\xd8\x3d\xdf\x3c\x61\xb2\x2b\xbe\x79\x5f\x7d\x27\x06\x0c\xad"
+ "\x7f\x9e\x28\x73\x5f\xdf\x6b\x4f\x3a\xd6\xf7\xda\x43\xd2\xf5\xbd"
+ "\x36\x4b\xf0\xcf\xd7\x1e\x13\xf4\x9d\xa8\x96\xae\xef\xb5\x89\xf6"
+ "\xfd\xf3\xb5\x2a\xf7\xfc\xf3\xc4\x40\xf7\xe3\xe4\x49\x06\xf4\xcd"
+ "\xa5\xe6\x7f\x6c\x48\xb1\xbc\x73\x97\x28\xca\xff\x98\xc4\xed\xad"
+ "\x62\x3f\xb7\x4c\xd2\x43\xd7\x76\xfe\xc7\x67\x07\xc8\xff\xf8\xac"
+ "\xc4\xfc\x8f\x49\xe3\xa4\x3f\x8f\xff\xac\x41\x58\x23\x24\x89\xd6"
+ "\xff\xc9\xdc\xb8\xbe\xb6\xf3\x42\x3e\x6b\x93\x17\x32\x91\xcb\x0b"
+ "\x49\x73\x6f\x2b\x74\x6d\x2d\x92\x4c\xdc\xbf\x2f\xb0\xae\x11\xd7"
+ "\x21\x52\xf3\x50\x0a\xd8\x4e\x3e\x29\x60\x7b\xdd\xfb\x8e\xb1\xbd"
+ "\xee\xd6\x6b\x3b\x0f\x65\xca\xee\xfe\xb1\x9d\x92\x25\x2d\xe7\xc8"
+ "\x3a\x17\xf2\xde\xa4\x34\x0a\xeb\xa1\x75\xa2\xf5\xef\x7a\xe5\x10"
+ "\x62\xdb\xc5\x7c\x4a\x29\x07\xad\xb1\x9d\x7c\x8c\x61\x5b\xd5\xe6"
+ "\xda\xba\x6b\x5d\xb3\xfb\xf7\x41\x52\xf7\xe1\x9a\x4b\x6a\x3e\x4c"
+ "\x01\xdb\xeb\xdf\x10\xb0\x9d\x5a\xe6\x18\xdb\x1b\xba\xae\xed\x7c"
+ "\x98\x1b\x32\xfa\xc7\xf6\x86\x28\x69\xb9\x4c\x36\x7c\x29\x1d\xdb"
+ "\x1b\xf6\x09\x6b\xbf\x0d\x7a\x01\xdb\xa9\xed\x43\x87\x6d\x57\xf3"
+ "\x64\x6e\xc8\xb7\xc6\xf6\xfa\x4a\x86\xed\x9f\x4d\x75\x6d\x8d\x99"
+ "\x5a\xe3\xfe\x7d\x9f\x4d\x5b\x71\x7d\x29\x35\x2f\xa7\x80\xed\x8d"
+ "\xcf\x0b\xd8\xde\xd4\x27\x2f\x94\x80\xed\xb4\xd3\xd7\x76\x5e\xce"
+ "\xb4\x85\xfd\x63\x3b\x6d\x8a\xb4\x1c\x29\x69\x47\xa4\x63\x3b\x6d"
+ "\xab\xb0\xce\x4d\xab\x13\xb0\xbd\xa9\x76\x08\xb1\xed\xa2\xdd\x4e"
+ "\x8b\xb7\xc6\xf6\xc6\x74\x86\xed\xb1\xf9\xae\xad\xa7\x37\x15\xba"
+ "\x7f\x9f\x4b\x13\x83\x6b\x69\xa9\xf9\x41\x05\x6c\xa7\x2f\x17\xb0"
+ "\xad\x99\xe7\x18\xdb\x19\x6f\x5d\xdb\xf9\x41\x33\x06\xc8\xff\x93"
+ "\xd1\x4f\xfe\x1f\x7b\xef\x0a\x67\xb8\x90\xf7\x22\x23\x46\x58\xd3"
+ "\x67\xec\x11\xb0\xad\xa9\x1a\x3a\x6c\xbb\x9a\x37\x34\x23\xcc\x1a"
+ "\xdb\xe9\x6a\x86\xed\x9f\xb7\xba\x16\x3b\xd0\x24\xba\x7f\x5f\x6f"
+ "\x73\x08\xc6\x0d\xa4\xe6\x29\x15\xb0\x9d\x39\x4d\xc0\xf6\xe6\x49"
+ "\x8e\xb1\x9d\xb5\xfd\xda\xce\x53\x9a\xe5\xdb\x3f\xb6\x33\xf5\xd2"
+ "\x72\xba\x64\xb9\xf0\x1e\x7c\x56\x88\x10\xbf\xc8\x12\x3d\xff\xbe"
+ "\x39\x6b\x08\xb1\xed\xa2\xdd\xce\x0a\xb4\xc6\x76\xe6\x64\x86\xed"
+ "\xbb\xa6\xb8\x16\x27\xd9\x3c\xd3\xfd\x38\xc9\x96\x99\xdc\x3d\x4c"
+ "\x89\xf9\x52\x05\x6c\x67\xdf\x2c\xe4\x26\xda\x32\xcd\x16\xdb\x42"
+ "\x6e\xa2\xe7\xe6\x5d\x3b\xf9\x52\xb3\x3f\xef\x1f\xc7\xd9\x35\xd2"
+ "\x62\x22\xcf\x4d\x93\x8e\xe3\xe7\xbc\x84\x98\xc8\x73\xa2\xe7\x5f"
+ "\xb6\x58\xf6\x24\x1f\x82\x9c\x45\xcf\x7d\xd9\x7f\xce\xa2\xe7\xb4"
+ "\x57\x2f\x8f\x6a\x76\xbb\x75\xce\xa2\x6c\xa5\x99\x1b\x0b\xe3\x73"
+ "\x5c\x8b\xab\x6c\x51\xbb\x1f\x57\xf9\x0d\xbb\xbf\x2b\x31\x6f\xab"
+ "\x30\x16\x9e\x1f\x2b\x8c\x85\xdf\x3c\xe6\x78\x2c\xbc\xb0\xfc\xda"
+ "\xc9\xdb\xfa\xfc\x57\xfd\x8f\x85\xe7\x8f\x49\x8b\xa1\xbc\xe0\x42"
+ "\x1e\x98\x17\xfc\x84\x18\xca\x0b\x6a\x61\x2c\xfc\xa6\x64\xe8\xc6"
+ "\xc2\x0b\xe7\xfb\x1f\x0b\x2f\xd4\x5d\xbd\x7c\xae\xcf\x77\x5a\x8f"
+ "\x85\xe7\x47\xb3\xb1\x30\x51\xe9\x5a\x1c\xe6\x37\x2e\xdd\xff\xb6"
+ "\x1e\x0b\x2f\xc6\x70\xf7\xbe\x25\xe6\x8f\x15\xc6\xc2\xd6\x49\xc2"
+ "\x58\x78\xb1\x8f\x3f\x2f\x8c\x85\x6d\x6b\xae\x9d\xfc\xb1\x5b\xbf"
+ "\xef\x7f\x2c\x6c\x6d\x94\x16\x73\xd9\x36\x4f\xfa\x58\xd8\x26\x7a"
+ "\xff\x69\x9b\xe8\xfd\xa7\x17\xab\x86\x6e\x2c\x6c\xeb\xea\x7f\x2c"
+ "\x6c\x6b\xba\x7a\x79\x65\xb7\x29\xac\xc7\xc2\xd6\x20\x36\x16\x26"
+ "\x15\xba\x16\xb7\x79\xd1\x09\xff\x7f\xa0\xb8\xcd\xf6\x44\xee\xb9"
+ "\x00\x89\x79\x6c\x85\xb1\xf0\xd2\x34\x61\x2c\x6c\x5f\xee\x78\x2c"
+ "\xe4\x6c\xbc\x76\xf2\xd8\xbe\x64\xea\x7f\x2c\xbc\xd4\x2c\x2d\x46"
+ "\x93\xb3\x5c\xfa\x58\xc8\x19\x2f\xc4\x68\x72\x12\x85\xb1\xb0\xbd"
+ "\x7a\xe8\xc6\xc2\x76\xcf\xfe\xc7\x42\x4e\xeb\xd5\xcb\x6f\x9b\xa3"
+ "\xb4\x1e\x0b\x2f\x4d\x66\x63\x61\x72\x80\x6b\x71\x9e\xed\xe9\xee"
+ "\xc7\x79\xf2\xd3\xb9\x67\x26\x24\xe6\xd3\x15\xc6\x42\xee\x63\xc2"
+ "\x58\xc8\x5f\xe3\x78\x2c\xe4\x3d\x7f\xed\xe4\xd3\xcd\xbb\xa1\xff"
+ "\xb1\x90\xdb\x26\x2d\xa6\x93\xb7\x46\xfa\x58\xc8\x9b\x22\xc4\x74"
+ "\xf2\xd2\x85\xb1\x90\x7f\x78\xe8\xc6\x42\xbe\x6f\xff\x63\x21\x4f"
+ "\x7f\xf5\xf2\xec\xe6\x8d\xb6\x1e\x0b\xb9\x21\x6c\x2c\xdc\x5f\xea"
+ "\x5a\x5c\x28\x7f\xab\xfb\x71\xa1\x97\xb7\x72\xcf\x93\x48\xcc\xeb"
+ "\x2b\x8c\x85\x1d\xf3\x84\xb1\xf0\x72\x3f\xfb\x3c\x14\xec\xb8\x76"
+ "\xf2\xfa\x16\x0c\xb0\xff\xd1\x8e\xfe\xf6\x3f\xb2\x13\x03\x2a\xd8"
+ "\x28\x7d\x2c\x14\x84\x0a\x31\xa0\x02\xd1\xfb\x7f\x2f\xd7\x0e\xdd"
+ "\x58\x78\x79\x80\xfd\x1f\x0a\x9c\xd8\xff\xc1\xd5\x7c\xbf\x05\x41"
+ "\xd6\x63\x61\xc7\x4c\x36\x16\x1e\x50\xb9\x16\x47\x7a\x79\xc0\xf8"
+ "\x3f\xae\xf3\x7b\xfc\xfa\xc6\x91\xea\x5a\xa7\x90\x5f\x2c\xc2\xb1"
+ "\x50\x34\xd5\x58\x94\xae\xc6\xfc\xc2\xa6\x40\x3e\x07\xe5\x66\x3e"
+ "\xc7\x8b\xc1\xc8\x72\x50\xea\x4d\xbd\x39\x28\x59\xee\x0f\x22\xc7"
+ "\x77\x81\xf1\x9d\x60\xa3\x92\xe5\x9f\xa4\xf8\x4c\x14\x3e\x23\xd5"
+ "\x52\xcb\xe5\x57\x49\x37\x42\xdf\xcf\x0e\x90\x7f\x32\x5a\x47\xea"
+ "\xa2\xd3\x88\xd1\xf7\xa2\x96\xbd\x27\x5c\x58\xc7\xe5\x9f\x5c\x16"
+ "\x70\x4b\xee\xbf\x89\x9f\x0f\xe6\x9f\x8c\xa6\xe6\x4c\x1d\xd5\xd7"
+ "\x77\x12\xa0\x05\xf9\x2e\xb7\xe4\xa0\x2c\xba\x0f\xfb\x6e\x5c\x16"
+ "\x74\x4b\xf9\xbf\x1d\xe5\x17\x2e\x72\x21\x0f\x6c\x61\x9b\x10\xdf"
+ "\x29\x1a\x2f\x60\xb4\x88\x9b\x83\xe1\xfc\xb1\x3a\x35\xd8\x98\xdc"
+ "\xff\xab\xea\x71\x29\xf7\x46\x51\x98\x13\x3a\xc3\x67\x44\xfa\xd8"
+ "\x2f\x41\x67\xc5\x7a\xd0\x59\x13\xe6\x39\x76\x5e\x67\x9e\x17\xaf"
+ "\x8e\xce\x8a\xb3\x9c\xd7\x59\xf1\x37\x36\x3a\xb3\x13\x87\x28\xfe"
+ "\x58\xba\xce\x8a\x4b\x85\x38\x44\xb1\x4e\xd0\xd9\x6f\x83\x99\xce"
+ "\x8a\x53\x99\xce\xa6\x82\x5d\x76\x65\x5d\x5e\x3c\xe0\xfb\xdf\xb8"
+ "\x6e\xea\xf1\xeb\xbb\x2e\x17\x74\x56\x52\x65\x2c\x82\xb5\x3b\xac"
+ "\xcb\x9d\xd7\xd9\x8d\x2d\x57\x47\x67\x25\x93\x9d\xd7\x59\x49\x99"
+ "\xb5\xce\xec\xad\x97\x4b\x5c\xd8\xb3\xb3\x24\x42\x58\x2f\x97\x14"
+ "\x0a\x3a\x2b\x69\x65\x3a\x2b\x19\xcf\x74\x36\xcd\xd8\xe3\x52\x0e"
+ "\x90\x92\x6a\x27\x74\x86\xf7\xf4\xfb\x19\x67\xaf\xa8\x41\x67\x4d"
+ "\x98\xf7\xd9\x79\x9d\xf9\x7e\x72\x75\x74\xb6\xb3\xcd\x79\x9d\xbd"
+ "\x32\xc7\x46\x67\x76\xd6\x75\xaf\x3c\x20\x5d\x67\xaf\x28\x84\x75"
+ "\xdd\x2b\x61\x82\xce\x5e\x29\x61\x3a\xdb\xa9\x63\x3a\x7b\x30\xa8"
+ "\xc7\xa5\x3c\x22\xaf\x0c\x18\xff\x42\x3f\xb4\xc7\xaf\xef\x3a\x47"
+ "\xd0\x59\xa9\xb7\xb1\x08\xd6\x42\xb0\xce\x71\x5e\x67\xf7\xbf\x78"
+ "\x75\x74\xb6\xab\xd4\x79\x9d\x95\x7a\x5a\xeb\xcc\xde\xfa\x63\xd7"
+ "\x79\xe9\x3a\xdb\x55\x23\xac\x3f\x76\x19\x05\x9d\x95\xce\x64\x3a"
+ "\xdb\x55\xc8\x74\x16\x12\xd9\xe3\x52\x2e\x92\xd2\x00\x27\x74\x86"
+ "\xf7\x60\xfb\x19\x67\x65\x5a\xd0\x59\x13\xe6\xc1\x76\x5e\x67\x8b"
+ "\x1f\xbe\x3a\x3a\x2b\x8b\x70\x5e\x67\x65\xef\xd8\xe8\xcc\x8e\x9f"
+ "\x5c\xe6\x42\x1e\xec\xb2\x78\xc1\x4f\x2e\xab\x16\x74\x56\x4e\x98"
+ "\xce\xca\xc2\x98\xce\x1e\xca\xea\x71\x29\x9f\x49\x99\xc3\xfc\x5f"
+ "\xfd\xf9\x8d\x96\xe7\xf2\x05\xbd\x55\xa4\x5e\x3b\xbe\x63\x85\x97"
+ "\xf3\x7a\xab\x78\x76\x60\xdf\xb1\x62\xa1\x74\xbd\x55\x04\x0a\xbe"
+ "\x63\x45\xac\xa0\xb7\x8a\x1a\xa6\xb7\x0a\xe2\x9e\xef\x58\x31\xe0"
+ "\xfb\xaf\xf6\x7c\xc7\xbe\x7a\xdb\x1d\x7c\xed\xf8\x8f\x95\x5a\xe7"
+ "\xf5\xb6\x7b\xdc\xc0\xfe\xe3\x6e\x5f\xe9\x7a\xab\x6c\x16\xfc\xc7"
+ "\xdd\x2a\x41\x6f\xbb\x13\x99\xde\x2a\x6b\xdc\xf3\x1f\x77\x3b\xcc"
+ "\xff\xd6\x9f\xff\xd8\x57\x6f\xaf\xb6\x5d\x3b\x3e\xe4\xab\xa9\xce"
+ "\xeb\xed\xd5\x2f\x07\xf6\x21\x5f\x3d\x21\x5d\x6f\xaf\x16\x0a\x3e"
+ "\xe4\xab\x4d\x82\xde\x7e\x17\xc4\xf4\xf6\x6a\xa2\x7b\x3e\xe4\xab"
+ "\x06\x57\x7c\xc8\xbe\x7a\xab\xaa\xbc\x76\xfc\xc8\xaa\x60\xe7\xf5"
+ "\x56\xb5\x73\x60\x3f\xb2\xca\x85\x3d\x8b\xab\x66\x0a\x7e\x64\x55"
+ "\xbe\xa0\xb7\x2a\x1d\xd3\x5b\x55\x90\x7b\x7e\x64\xd5\x80\xf9\x3f"
+ "\xec\xf9\x91\x7d\xf5\xf6\xba\xfa\xda\xf1\x25\x5f\x93\xe0\xff\xbf"
+ "\x3e\x67\x60\x5f\xf2\x75\x17\xfc\xff\xd7\x15\x82\x2f\xf9\xba\xc8"
+ "\xff\x7f\x9d\xf7\xff\x5f\xd3\xb9\xe7\x4b\xbe\xee\x8c\xff\xdf\xc7"
+ "\x97\xec\xab\xb7\x3d\xca\x6b\xc7\x9f\xfc\x7d\xa5\xf3\x7a\xdb\x73"
+ "\xc3\xc0\xfe\xe4\xef\x5d\xd8\x07\xea\xf7\x87\x05\x7f\x72\x0f\x11"
+ "\xf4\xb6\x27\x82\xe9\xed\xf7\x25\xee\xf9\x93\x7b\x1c\xe6\x7f\xb4"
+ "\xe8\xcd\xe4\x97\xae\xa6\x76\xe2\x90\x27\x63\xa7\xf0\xb9\x09\xf7"
+ "\xea\x4c\xfe\xe9\x6a\xa9\xfb\xbb\x58\x72\x4e\x9f\x88\x25\xa4\xc5"
+ "\x63\xef\x46\xf7\xf2\x4e\xef\x1d\xe7\x7e\xde\xe9\x37\x2e\x0f\xde"
+ "\xfe\x2e\x6f\x9c\x91\x9e\x77\xfa\x8d\x3d\x82\x0f\xfa\x46\xbb\xa0"
+ "\xeb\x3f\x70\xcf\x27\x48\xcb\x47\xfd\x46\xbc\x7b\xf9\xa8\xf7\x3e"
+ "\xcb\xf0\xf5\xc6\x78\x96\x8f\x7a\x6f\xec\xd0\xec\xfb\xb2\xa7\x09"
+ "\xf3\x51\xd3\xdc\x87\xf7\xb9\x96\x1f\x79\x6f\xbb\x13\x78\x6e\xa2"
+ "\x76\x62\xb4\x02\x9e\xf7\x57\x03\x9e\x9b\xa4\xee\x33\x63\x8d\xe7"
+ "\xfd\x8f\xb9\x87\xe7\x7d\x5d\xee\xe3\x79\xdf\xf1\xc1\xdb\x67\x66"
+ "\xdf\x7e\xe9\x78\xde\x97\x2a\xf8\xe6\xfb\x0e\x0b\x78\xde\xaf\x97"
+ "\x8e\xe7\x7d\x53\xdd\xc3\xf3\xfe\x87\x18\x9e\xff\x60\x64\x78\xde"
+ "\x3f\x65\x68\xf6\x9f\xf9\xc3\x1e\x86\xe7\x50\x83\x6b\xf9\xa7\xf7"
+ "\x1f\x1e\x18\xcf\x19\x6a\x6a\x27\x7e\x2d\xe0\xb9\x3a\xcb\xe4\x9f"
+ "\xa1\x96\xba\xdf\x8d\x35\x9e\xab\x6f\x76\x0f\xcf\x07\x4e\xb8\x8f"
+ "\xe7\x03\x45\x83\xb7\xdf\xcd\x81\x0c\xe9\x78\x3e\x10\x26\xac\x59"
+ "\x0e\xe4\x08\x78\xae\xd6\x4a\xc7\xf3\x01\x6f\xf7\xf0\x5c\xed\xcb"
+ "\xf0\xfc\x66\x1d\xc3\x73\xb5\xd7\xd0\xec\x83\xf3\x66\x2a\xc3\xf3"
+ "\xa3\x53\x5d\xcb\xef\x5d\xed\x30\xff\xb1\x08\xcf\x4d\xd4\x4e\x6c"
+ "\x5f\xc0\xf3\x1f\x23\x00\xcf\x4d\x52\xf7\xdd\xb1\xc6\xf3\xdb\x6e"
+ "\xee\x73\xf1\xf6\x20\xec\x73\xf1\xb6\x1b\xfb\x5c\xd8\xee\xbb\xf3"
+ "\xf6\x2c\xe9\x78\x7e\x3b\x40\x58\xcb\xbd\x1d\x25\xe0\xf9\x8f\xf9"
+ "\xd2\xf1\xfc\x56\xb3\x7b\x78\x7e\x9b\xdf\xff\xe2\xad\x52\x86\xe7"
+ "\xb7\x9b\x86\x66\x3f\x9e\xb7\xc2\x18\x9e\x1f\xdb\xe2\x5a\xfe\xf4"
+ "\x3f\x46\x0d\x8c\x67\x8d\x9a\xda\xb9\xef\x21\xe0\xf9\x4f\x2a\x93"
+ "\xbf\x46\x2d\x75\xff\x1f\x6b\x3c\x1f\x7a\xc7\x3d\x3c\x1f\x8a\x73"
+ "\x1f\xcf\x87\xee\x1b\xbc\xfd\x7f\x0e\xdd\x2a\x1d\xcf\x07\xdb\x84"
+ "\x35\xee\x21\xd1\xfd\xff\x3f\x45\x4b\xc7\xf3\x41\x37\xf7\x05\x3a"
+ "\xf4\x16\xc3\xf3\x41\x7e\x5f\xa0\x43\x7b\x86\x66\x5f\xa0\x83\x01"
+ "\x0c\xcf\x4f\xd4\xb9\x96\x9f\xfe\x4f\xe3\x9d\xc0\x73\x13\xb5\x73"
+ "\x4f\x48\xc0\x73\x8d\x1e\xf0\xdc\x24\x75\x1f\x22\x6b\x3c\xd7\x6c"
+ "\x73\x0f\xcf\x35\x0f\xb8\x8f\xe7\x1a\xcf\xc1\xdb\x87\xe8\xcf\xe7"
+ "\xa5\xe3\xf9\xcf\x96\xfb\x7f\x60\x9f\xff\x2c\xba\xff\xf7\x8e\x0b"
+ "\xfb\x13\xfd\x39\xdd\x3d\x3c\xd7\x6c\x66\x78\xfe\xf3\x54\x86\xe7"
+ "\x9a\xd4\xa1\xd9\x9f\xe8\x4f\x6d\x0c\xcf\xb3\xfd\x5c\xcb\xff\x5f"
+ "\x33\xe0\xf3\x1f\xf6\xe2\x1b\x96\xb8\x94\x80\xe9\xbf\x1e\x73\x3f"
+ "\xc6\xf1\xd7\x25\xee\x61\xfa\xaf\xc3\xdd\xc7\xf4\x5f\x3e\x1f\xbc"
+ "\x18\xc7\x5f\x5c\xd8\xeb\xef\x2f\x39\x42\x8c\xe3\x2f\x8d\x02\xa6"
+ "\x0f\x2b\xa4\x63\xfa\x2f\x11\xee\x61\xfa\xaf\xf3\x18\xa6\xff\xa2"
+ "\x64\x98\xfe\xeb\xcc\xa1\x89\x71\xbc\x73\xd8\xbd\x18\xc7\x5f\x1b"
+ "\x5d\x89\x71\xf4\xc5\xf4\xbb\x25\xee\xc7\x39\xde\x9d\xe4\x1e\xa6"
+ "\x8f\x7c\xe9\x3e\xa6\x8f\xec\x1f\xbc\x38\xc7\x91\x22\xe9\x98\x3e"
+ "\x12\x2d\xc4\x39\x8e\x54\x09\x98\x7e\xb7\x49\x3a\xa6\x8f\x04\xba"
+ "\x87\xe9\x77\xc7\x31\x4c\x1f\x6e\x65\x98\x7e\x57\x35\x34\x71\x8e"
+ "\xc3\xf9\xee\xc5\x39\xde\xad\x72\x25\xce\xd1\x17\xd3\xef\xc7\xbb"
+ "\x1f\xeb\x78\xdf\xd3\x3d\x4c\x6b\x0f\xb9\x8f\x69\xed\xe6\xc1\x8b"
+ "\x75\x68\xe3\xa4\x63\x5a\x3b\x59\x88\x75\x68\x53\x05\x4c\xbf\xbf"
+ "\x4f\x3a\xa6\xdf\xeb\x74\x0f\xd3\x5a\x13\xc3\xf4\x7b\x35\x0c\xd3"
+ "\x5a\xc3\xd0\xc4\x3a\xde\x8b\x71\x2f\xd6\xf1\x7e\xaa\x2b\xb1\x8e"
+ "\xbe\x98\x3e\x16\xe2\x7e\xbc\xe3\xe8\xe7\xee\x61\xfa\xe8\x36\xf7"
+ "\x31\x7d\x74\xde\xe0\xc5\x3b\x8e\x4e\x93\x8e\xe9\xa3\xa2\xfd\x2f"
+ "\x8e\x8a\xde\xff\x3f\x96\x25\x1d\xd3\x7f\xab\x73\x0f\xd3\x47\x3f"
+ "\x66\x98\xfe\x5b\x0e\xc3\xf4\xd1\xda\xa1\x89\x77\xfc\x6d\x8a\x7b"
+ "\xf1\x8e\x63\x03\xe6\xbf\xb0\x17\xef\xe8\x8b\xe9\xbf\xfb\xb9\x1f"
+ "\xf3\xf8\x60\xbf\x7b\x98\xfe\x60\x89\xfb\x98\xfe\x60\xdc\xe0\xc5"
+ "\x3c\x3e\xf0\x95\x8e\xe9\xe3\xcd\x42\xcc\xe3\x03\xd1\xf3\x4f\x7f"
+ "\x8f\x94\x8e\xe9\xe3\x95\xee\x61\xfa\x83\xd7\x18\xa6\x8f\x47\x33"
+ "\x4c\x7f\x50\x3a\x34\x31\x8f\xe3\xde\xee\xc5\x3c\xfe\xae\x72\x25"
+ "\xe6\xd1\x17\xd3\x27\xda\xdc\x8f\x7b\x9c\xd8\xec\x1e\xa6\x4f\x4c"
+ "\x72\x1f\xd3\xb5\xa6\xc1\x8b\x7b\xd4\x7e\x25\x1d\xd3\xb5\xd5\x42"
+ "\xdc\xa3\x56\x94\xff\xfe\xc3\x20\xe9\x98\xae\x4d\x71\x0f\xd3\x27"
+ "\x36\x32\x4c\xd7\x4e\x66\x98\x3e\x91\x38\x34\x71\x8f\xbf\xeb\xdc"
+ "\x8b\x7b\x9c\xe8\xf3\xfc\x5b\xf2\xca\x84\x18\xd5\xda\x55\xab\x92"
+ "\x57\xa6\xa8\x92\xe3\xe3\x9e\x5a\x39\x6d\xac\xe5\xf7\xb4\xe0\xd4"
+ "\xb1\xa9\xc3\x48\xcc\x9a\xe5\xcb\xd6\xdf\x23\x9c\x8c\x5f\x99\x00"
+ "\x7f\x86\x91\xd8\xe5\xc9\xb1\xaa\x94\x8d\x89\x2b\x55\xf8\x6b\xcd"
+ "\x53\x89\x40\xb2\x36\x45\x28\x99\xbb\x32\x7e\x79\x6a\x5c\xc2\xd3"
+ "\xaa\xe5\xf1\x71\x4f\x27\xac\x59\x99\x90\xa2\x4a\x5a\xf9\xec\xba"
+ "\xb8\xa4\x95\xf8\x3d\x59\xb5\x6a\x6d\x12\x14\x3c\xb5\x32\x6e\xfd"
+ "\x4a\xd5\x8a\x75\xab\x56\xad\x4c\x4a\x1e\x46\x66\xad\x8b\x4f\x89"
+ "\x4b\x8c\x5f\xa9\x0a\x9d\xf5\xd0\xdd\x91\x33\x9e\x8c\x7c\xf0\xc1"
+ "\x61\x44\xb4\xf7\xb4\x8a\x16\x56\x44\x03\x86\x14\x67\x3d\x3e\x7b"
+ "\xbf\x3e\x80\x90\xed\x80\xcd\xbc\x24\xa2\xdc\x96\x44\x14\x5b\x2f"
+ "\x12\xaf\xed\x17\x89\xb7\xea\x19\x12\x42\x7d\x0f\x69\xf3\x2e\x12"
+ "\x3f\x3a\xea\xe1\x26\xba\xe3\x02\xa1\xbe\x17\x43\xf4\xbe\x9f\xe9"
+ "\xa1\x4c\x49\x77\x7c\xa6\xc2\x73\xa0\x0b\xcc\x71\xb0\xa7\xc5\xe3"
+ "\xb3\x2c\xbd\xef\x3f\x1a\x33\xbf\x21\x72\x3a\xe2\xa3\xc8\x37\xcd"
+ "\x7a\xf9\xfb\xb8\x53\x09\xc8\x8a\x78\xd4\xc5\xc3\xa1\x26\x1e\x27"
+ "\xbd\xe0\x08\x80\x23\x1a\x8e\xad\x70\xe4\xc3\x61\x24\x1e\xf5\xa1"
+ "\x70\xa4\xc0\x01\x65\xf5\xa5\x70\xec\x81\xa3\x9a\x78\x34\x40\x79"
+ "\x43\x0c\x1c\x70\xae\x21\x87\xf1\x69\x28\x24\x1e\x8d\x7e\x70\x44"
+ "\xc1\x01\xd7\x7f\x0c\xe5\x1f\xd7\x10\x8f\x4f\x80\xee\xe3\x26\x38"
+ "\x0c\x70\x00\xcf\x4f\x54\x70\xe0\xf5\x25\xec\xdc\xa7\x4a\x38\x66"
+ "\xc2\x01\x3c\x3e\x85\x7a\x3e\x3d\x0c\x47\x23\x1c\xcd\x70\xb4\x12"
+ "\x8f\x53\xd0\xb6\x53\x40\x73\x2a\x10\x0e\x68\xc3\xa9\x2a\x38\x6a"
+ "\x89\xc7\x69\xe0\x73\x1a\xea\x38\xad\x23\xd0\x47\xfe\x08\x82\x23"
+ "\x4a\xf4\x3b\x55\xf4\xdd\xde\x51\xe2\xb3\xf9\x76\x9d\xf6\x2e\x23"
+ "\x8c\xdb\xba\x13\xa6\x6c\xe2\x61\xda\xf1\x8f\xc6\xc4\xbb\x88\xec"
+ "\x9c\x47\x5d\x51\xc3\x16\x42\xa8\xf2\x02\xd1\xa6\x75\xe3\xf9\x22"
+ "\x94\x59\x47\x6e\x5d\xa1\x8e\xbc\x59\x82\xe3\x53\x1a\x3e\xeb\x0a"
+ "\xf9\xeb\x4f\xe9\x64\x8f\x57\xe3\xf5\xb4\x20\x6d\x34\xcd\x54\xef"
+ "\xc2\xf7\x70\xcf\xa2\x0c\x71\xdc\xe4\x6f\x4c\xa1\xca\x64\x03\xda"
+ "\x18\x6d\x1a\xd7\xae\x35\x30\xde\x46\xc0\xf5\xf1\x14\xf4\xa8\xf7"
+ "\x07\x9d\x67\x13\x05\xf7\x7b\xc7\x67\x7a\x5a\xb9\x37\x8c\xd9\x9d"
+ "\x93\xdc\xfa\xa5\xcb\xff\xe5\x7c\x3c\xd7\xf9\x5a\x7c\x08\xad\xd2"
+ "\x34\x69\x13\xba\x49\xab\xc7\xc9\x85\x60\xff\xe4\xf4\xce\xf8\x10"
+ "\x73\xf1\xcb\xf9\x35\x80\x01\xa4\x79\x47\xd3\x86\x7f\x63\xa1\xdf"
+ "\x72\x5a\x58\xa8\xc6\x18\x90\x56\x53\x00\x36\xb9\x6e\x4d\x97\xff"
+ "\xde\x60\xd5\xe3\x3e\xb4\x05\xeb\x91\x63\xbe\xf5\x93\x84\xd9\x85"
+ "\xba\xf8\x2e\xff\x87\x75\xc8\xdb\x54\xb9\x57\x0f\xe7\x14\x14\xb0"
+ "\x07\x6d\x90\x5d\x80\xeb\x4c\x45\x0f\x37\x69\x1f\xe7\xea\xbc\x0c"
+ "\xed\x94\x67\x3e\x06\xbc\x5f\xdd\xab\x3f\x90\xd6\x29\xa7\xd8\x76"
+ "\xbf\x87\x9b\x00\xeb\xde\xa6\xdc\x0f\x27\xef\x1c\x49\x14\x65\x05"
+ "\x84\x54\x8c\x24\x5e\x1d\xb9\x27\xdb\x75\x8a\xa8\x76\x66\xf7\xea"
+ "\xe2\xe5\x40\x03\x75\xd6\x52\xd0\x07\x57\x57\x61\x6e\xa3\xe3\xba"
+ "\xea\xa7\xf5\xd6\x55\x9c\xdb\x88\x75\x71\xf2\x61\xb2\x62\xdf\x2d"
+ "\x7c\xaa\xe2\xfb\x69\x73\xfd\x03\xc8\x43\xe7\x51\x3f\x9e\xbe\x1e"
+ "\xaf\x37\x15\x17\xe9\xf1\x1c\xd2\x33\xf9\x7f\xa6\xf7\xd9\x4c\x0c"
+ "\x14\xca\x4c\xbc\x0e\x4c\xa8\x03\x79\x16\xd8\xaf\x93\xde\x58\x1f"
+ "\x5c\x9b\x6a\xca\x56\x11\xd5\xe3\x84\xb4\x7b\x34\x70\xb1\x09\xaa"
+ "\x4c\x6b\x67\x3a\xae\xff\x38\xb5\x96\x9a\xe1\x30\x4d\xac\x25\x32"
+ "\xed\xe3\xa8\xdf\x7a\xbd\xea\x91\xeb\x41\xce\xf5\xdf\xf7\xca\x77"
+ "\xcc\xde\x36\x90\x91\x12\xe4\xe2\x6d\x7a\x61\xba\x96\xca\x55\x04"
+ "\xfb\x21\x96\x17\xf6\xa7\x23\xb7\x41\x65\x23\x33\xe5\x63\x8f\x65"
+ "\x52\x11\xef\x6f\xc4\xfd\x07\xfa\x08\x9d\x6c\x7a\x27\xd2\xab\xee"
+ "\xe0\x30\xb7\xc6\xc4\x9f\x47\xdc\xa3\x9e\xa9\x7f\x45\x34\xfe\x9e"
+ "\x37\x8e\x28\x7d\x6a\x89\x5c\xa5\x09\xac\x61\x78\x28\x54\x43\xdf"
+ "\xa6\x32\x7e\xd0\xc7\xe2\xac\x3d\x70\x6d\x90\x80\xbf\x86\x3a\xd3"
+ "\x8e\xb4\xd6\x2e\xff\x22\x65\x67\xd1\xf6\x46\x9a\x9f\xd6\x8a\xef"
+ "\x9f\xb7\x78\x34\x1c\xe7\x64\x90\xed\x45\x58\x3b\xd2\xda\x34\xf1"
+ "\x54\xaf\xf9\x1e\xea\x1a\x55\xa4\x7c\x67\xbd\x1e\x74\xb6\xbd\x11"
+ "\x31\x51\x73\xa5\x53\x8e\x39\x01\xe9\x88\x0f\xe7\x97\xb3\xbe\x7a"
+ "\x41\x5f\x09\xf2\xed\xc8\x6d\xf4\x16\xfa\xda\x50\x8d\xf8\x80\x3a"
+ "\x8c\xac\x6e\xe0\x9b\x0d\x75\xec\x48\x33\x02\xdd\x64\x9d\x4c\x1f"
+ "\xca\x8d\xaf\xf5\xf4\x54\x5e\x37\x21\x97\xd6\x53\x63\xb8\xf1\x0b"
+ "\x33\xcc\xcb\x04\xce\x47\xea\xc8\xe2\x4a\x8b\xcc\xd8\x98\xeb\xe5"
+ "\xc3\xe5\x8a\xd0\xfb\x72\x7c\xd2\xed\xf1\xd1\x79\x34\x86\x2e\x33"
+ "\xaa\x64\xdd\x57\x68\x63\xde\x7c\x68\x5b\x36\xa1\xdd\xeb\x69\x5d"
+ "\x46\x18\xed\xcc\xfd\x84\x80\x6f\xd4\x4c\xc0\xd6\x8e\x1e\x21\xa3"
+ "\xfa\xf0\x8d\xc4\x67\x44\xa2\x0f\x3d\x51\xdb\x4c\x36\x85\xd1\xb6"
+ "\x86\x54\x13\xa9\x37\xb4\x92\xf4\xcf\x89\x77\xe6\x49\xe2\x97\x1e"
+ "\x46\xf5\x75\xd1\xcd\x84\x95\x9f\x24\x99\x5f\x12\xc5\xa6\x63\xb4"
+ "\x73\x36\xcc\xd3\x1f\x35\x63\x79\x2b\x94\x9b\x48\x66\x1b\x35\x6a"
+ "\x96\x10\x6f\xfc\x7e\xf2\x18\x96\x7f\x45\x60\x3c\x2b\xc2\x53\xf5"
+ "\x3e\xe5\x50\x27\x5e\x5f\x01\x6d\x31\x5f\xa1\x87\xf3\xae\x10\xb2"
+ "\x69\x21\x09\x48\x5f\x4e\x94\xe1\xe0\x2e\x34\x18\x0f\x91\x70\x13"
+ "\x05\x3f\xe0\x38\xc9\x88\x23\x5e\xe1\x46\x7c\x7f\xfc\x34\x1c\x65"
+ "\xa4\x02\x68\xa1\x6f\x5a\xec\xdb\xa6\x33\xe0\x17\x9d\xb7\x5c\x73"
+ "\x84\xbf\xe6\x0c\x41\x99\x75\xf9\x5e\x0c\xee\xdc\x71\xb1\x1a\xfa"
+ "\x1e\x86\x32\x80\x7a\x1a\xcd\x78\xdd\x15\x6e\x7e\x42\x19\xc8\x96"
+ "\x19\x01\xab\x45\x39\xd5\xcb\x52\xb5\x1c\x5f\x9d\xc7\xc7\x5b\x2a"
+ "\x92\xb8\x36\x59\xd1\x86\x1b\xe9\x25\xbd\x7f\x0e\xf0\xfa\x78\x5f"
+ "\x78\xea\x83\x94\xd7\x5b\x67\x47\xee\xc7\xed\x16\x79\x5b\xf4\x02"
+ "\x34\x3a\xd0\x45\xa7\x47\x22\x51\x74\xe4\x7e\xe2\xad\x93\x5d\x52"
+ "\x89\xb0\x8b\x76\xeb\x3a\x0b\x2d\x4f\x13\xac\x93\x7d\x1f\x2b\xd0"
+ "\x9c\x24\x80\xe9\x5e\x1a\x38\x0f\xf8\xbf\x98\x28\x9c\xe7\xf0\xdc"
+ "\x7b\x9e\x9f\x7f\x2d\xbc\x3d\xc0\x0e\xd7\x9a\xfc\x0b\xa3\xa9\xff"
+ "\xf4\x44\x7a\x29\xc0\x9b\xca\x41\x37\x46\xda\x69\x2e\xca\xac\x86"
+ "\x39\xd6\xbb\xc1\x68\x20\x8c\xfe\x93\xcb\xb4\x68\x7a\x2a\x7b\xe6"
+ "\xf5\x93\x33\xc8\x13\x7c\x31\x25\xcc\xd7\xca\xf0\x5a\xda\x89\xf6"
+ "\xc3\x54\xf4\x84\x3e\x37\x09\xe6\xec\xa2\xc2\x08\xb3\x7f\x5e\x74"
+ "\xe7\xee\xbd\x21\x38\x27\xe0\x78\xa3\x85\x70\x2d\xcf\x07\xea\xf5"
+ "\xd4\x79\x7c\x72\xd0\x04\xd7\xd3\xc2\xcc\x6a\x56\xce\xec\x1b\xb3"
+ "\x43\x9f\x1c\xa4\x63\xe1\x5c\x7e\x72\x1d\x9c\xf3\x6c\xf1\xf8\x34"
+ "\x04\xca\x09\xcd\x4f\x51\x68\x35\x17\x81\xf6\xd3\x19\x0c\xd3\xc9"
+ "\xb5\x56\xbf\xe5\x28\xcf\xfa\x7c\xb4\x51\x68\x9b\xa0\x7c\xa5\x60"
+ "\x27\xd8\x1c\xc0\x6c\x7b\xa6\xb6\x23\xf7\xd3\x54\x9d\x6c\xf6\x78"
+ "\x94\x13\xea\xd6\xc0\xec\x5a\xba\x69\xf7\xde\xb0\xa3\x61\x84\x1c"
+ "\x3d\x86\xe3\xe8\xd3\x52\x9d\x2c\x22\x44\x90\xe5\xa7\x87\x90\x96"
+ "\x6b\x27\xd8\x12\xfc\xce\xd9\x15\xb8\x06\xc6\x39\xda\x2f\x05\xb3"
+ "\x8f\x9f\x56\xe3\xbc\x05\xf6\x24\x96\x9f\xa7\x6a\x81\x77\x25\x1d"
+ "\xf9\x66\x1b\xb4\x2b\xab\x85\x6f\x8b\xb8\x6d\x16\xbb\x48\x77\x1c"
+ "\x88\x65\xb4\x9b\xa0\xfe\x53\xa3\x75\xb2\x39\x01\x62\xbc\xb0\x7e"
+ "\x9d\x7a\x1e\x30\xdd\x34\xf1\x18\xfc\x06\x5f\xca\xc2\x0f\xec\x8b"
+ "\x17\xd8\x95\x04\xc4\x1b\xda\x94\x92\x02\xf4\x8f\x0e\x24\x76\xee"
+ "\x38\x90\x0a\xbc\x62\x2d\xb6\x05\xaf\xc5\xf1\x00\xf6\xc5\x8b\xb3"
+ "\x1b\x26\xa3\x07\x37\xe6\x4d\x64\x7c\xaf\x2d\x81\xb2\x2e\xdf\x03"
+ "\x89\x7c\xb9\x82\x6b\x93\xdc\xc3\x0c\xf5\xcb\x2c\xf5\x75\xf9\xa6"
+ "\xe9\x81\xaf\x56\x27\xfb\x75\xa0\x95\xad\x29\x48\x8c\xa6\x54\x8d"
+ "\xb8\xf1\x80\xb6\x7e\x05\x7f\xaf\xe7\x71\x7a\xe3\xd1\x5a\x42\x42"
+ "\x41\x5b\x97\x40\x9f\x3b\x47\x51\xb8\xfe\x34\xd1\x91\xad\x55\x78"
+ "\xfd\x36\xf8\x8d\xe5\x48\x03\xe5\x01\x3a\xb2\xad\x90\xf1\x3d\xe9"
+ "\x8d\xfa\xb1\xe6\x7b\x7a\x06\xe3\x7b\xfa\x31\xe4\xc7\xcf\xf1\x37"
+ "\xe2\x77\xbc\x1e\x79\x97\x15\xd3\x76\xe4\x07\xbc\x62\x2c\x75\x6c"
+ "\x87\x32\x4b\x3d\xa1\x6b\x7a\xeb\xda\x02\x75\x8d\x16\xf7\xa1\xa4"
+ "\x98\x1a\xf8\xf6\x55\xea\x48\x59\x2d\x9e\xdb\x0a\x65\x78\x2d\xc3"
+ "\xc2\xe9\x23\x88\x13\x1d\xeb\x97\x07\xc3\xcb\xe9\x3a\x1d\x29\x8d"
+ "\x10\xcf\x3d\xa0\x8b\xe1\x96\xb9\x89\xe7\xa7\xb7\xf0\x13\x78\x31"
+ "\x1e\x34\xbf\x3a\x96\x1f\x0b\x38\x66\xbd\x91\x7f\x47\xee\x67\x2a"
+ "\x1d\x79\xa9\x8a\xb5\xad\x3e\xdf\xc0\xb0\x0d\x3a\xe0\xae\x61\x3a"
+ "\xcf\xfd\x30\x1d\xe7\xcd\x8a\x02\xb4\x63\x69\xed\x70\x4d\xa4\xcd"
+ "\x9c\xe9\x05\xe5\xcd\x3c\xbf\x44\x9d\x6c\x5a\xab\xb5\x0d\xc2\xb9"
+ "\xae\x30\x0b\x71\xc3\xdb\x86\x22\x6c\xaf\xe5\x3c\xd4\xa1\x80\x3a"
+ "\x72\x11\xef\x58\x87\xa9\x68\x7b\x08\xf0\xa9\xb1\xa9\x43\x81\x74"
+ "\xe0\xf3\x1c\xc5\xf9\xfb\xe5\x51\xb4\x0d\x68\x9a\x2d\x34\x78\x1e"
+ "\x64\xfe\x6b\x28\x83\xfe\xef\x8b\xc7\xb2\x5c\xa0\x81\xf5\x9f\xc3"
+ "\x77\x7a\x34\x63\x88\xbc\xa1\x54\x87\xeb\x5d\x1c\xdb\x53\x1b\x46"
+ "\x1b\x48\x43\xa9\x99\x98\x5f\x5f\x93\x18\xa2\xa1\xda\xb3\x1e\xff"
+ "\x58\x53\xdf\xd9\x46\xa4\xf9\xa8\xff\xe0\xf2\xff\xd0\x6e\x58\x97"
+ "\xa5\xdf\x43\xd0\x67\xb9\xe0\xd1\x54\xd6\xa0\xbf\xc8\xd9\x39\xf8"
+ "\xbe\x0d\xcf\xbf\x0c\xeb\x38\x5c\xcb\xc1\x7a\x3d\x36\x5f\xce\xd6"
+ "\x73\x66\xa0\x2d\xc7\x72\x5c\xeb\xc1\xfc\x55\x21\x3a\x47\x5f\x5f"
+ "\xad\x67\xb2\x6b\x9a\xc7\xd9\x7b\x6c\xaf\xf1\x51\x2d\xb6\xd9\x5c"
+ "\xb5\x5a\x8f\x7d\xc8\x4c\xa5\xe6\x06\x63\x87\x16\xe7\x38\xd5\x7a"
+ "\x5c\x87\x36\x4d\x0a\x2f\x23\xd4\xfc\xda\x6a\xbd\xc4\x3e\x70\xf7"
+ "\xbf\x61\xad\x7e\x41\x3f\x76\xb5\x3e\xd3\x44\xe4\x79\x1a\x4f\xaf"
+ "\xe9\xa5\x54\x7b\xe9\xce\x35\x89\x1d\xb9\x4d\x91\x18\xa5\x96\xee"
+ "\xbf\x37\x45\x5a\xfa\x5e\xce\xf7\x1d\xea\x3a\x88\x65\x13\x4b\xb2"
+ "\xb8\xfe\x02\x8d\xc3\x67\xfd\x68\xb6\x0f\x3d\x5a\x6a\x24\xc9\xa5"
+ "\xb4\x3b\xb9\x8c\xc8\x4d\xc5\x9b\x83\x0f\x94\x37\xa1\x4d\x0f\xb1"
+ "\xc8\x93\x93\x9d\x51\x4f\x12\x35\x44\x79\xce\xe3\xf3\xfb\xc2\xd3"
+ "\xb3\xb8\x7d\x9d\xde\x03\x3a\x69\x6d\xfd\x9c\xf3\xd5\xeb\x61\xed"
+ "\x1f\x6e\xcc\xa4\x6c\x5e\xfa\x7c\xc9\x6c\x9e\x1f\x9e\xb3\xe8\xaf"
+ "\x9c\x5f\x93\xbb\x50\x87\xc3\xf7\x5f\xfa\xe9\xab\xd2\x7e\x5f\xff"
+ "\x39\xc6\x8d\xbe\xb6\xf7\xed\xeb\x3f\x1f\x1b\xdc\xbe\xfe\x33\xc2"
+ "\x85\xbe\xaa\xec\xf7\xf5\x5f\xc3\x5d\xef\xeb\x3f\x9b\xfa\xf6\xf5"
+ "\x5f\xf7\x0d\x6e\x5f\xff\xe5\xf0\xfd\xcf\x7e\xfa\x1a\xec\xa0\xaf"
+ "\x5d\xae\xf7\xf5\x5f\xc7\xfa\xf6\xb5\x79\xcc\xe0\xf6\xb5\x39\xc8"
+ "\x61\x5f\xe5\x3e\x14\xed\x13\xd8\xa5\x6e\x4d\x17\xf8\x73\xc5\xbf"
+ "\x25\x19\xbb\x89\xbc\xce\xd0\x49\xea\x47\x37\x91\xcc\x8d\x44\x3e"
+ "\x21\x11\xec\x5e\x36\x99\x4a\x8b\x1f\xd6\xd7\x97\xb6\x43\xf9\x59"
+ "\x72\x32\xb5\x93\x84\x24\xa1\xfd\x6d\x3e\xdf\x10\x23\xd5\xfe\x36"
+ "\xd7\xf4\xda\x5f\xe3\x3d\xbc\xcd\xfd\xf7\xcd\xf5\xed\xdd\x04\xfb"
+ "\x0f\xdf\x3d\x7b\xed\x6f\x36\x93\xb7\xad\xfd\x45\x79\x34\x74\x76"
+ "\x5a\xd9\x5f\xf6\x6e\xd7\x99\x8f\x6d\x6d\x6f\xee\x39\x42\xec\xdb"
+ "\xde\x33\xfb\xd1\xf6\x96\xc3\x79\x69\xed\x3f\x93\x6a\xb1\xbd\xf9"
+ "\x50\xa7\xd8\xf6\x1e\x8d\xc1\xf9\xf5\x4c\xa3\x6b\xb6\xf7\x4c\xa3"
+ "\xa5\xdf\x65\x7c\xbf\xa1\x6c\xb2\xb5\xed\xfd\xb7\x97\x33\xb8\xa5"
+ "\xc5\xe9\xca\x03\xb7\x75\x7a\x9a\xab\x12\x82\x71\x7e\xeb\x00\x99"
+ "\xfc\xb9\xbc\x53\x71\xd6\xe3\xdf\x6c\xaf\x8e\x8e\x18\x19\xad\x8a"
+ "\x6f\x0a\x4f\xa1\x5f\xd0\xb1\x09\xc1\x18\x5f\xc5\x38\x01\x9c\x3f"
+ "\x02\x3e\x7d\x93\xb4\x76\x33\x9e\x30\xff\x25\x6a\x60\xbc\x1c\x58"
+ "\xdf\x29\x37\x6f\x52\xfb\x80\x1e\x94\xb4\x28\x2b\x82\xbe\xf0\x64"
+ "\xfe\xa5\xa2\x22\xed\xf1\xa0\xaf\x08\xd2\xd2\xcd\x8a\x10\xd7\xdb"
+ "\xff\x45\x58\xff\xed\xff\x22\x43\x7a\xfb\x19\x4f\xe7\xda\xff\x45"
+ "\x98\x53\xed\x1f\x05\xed\xef\x9e\xe2\x09\xeb\x45\xf9\x7b\xdd\x53"
+ "\x14\x12\xdb\xd3\xe4\x94\x8e\xdd\xaa\x43\xe7\xb4\xfd\xa3\xa3\xb6"
+ "\x47\x1c\x28\xd7\xcb\xc1\x06\x70\x73\x38\x8e\x3d\x66\xff\xda\xc0"
+ "\x66\x7d\x41\x99\x4d\xd2\x4b\xb4\x49\x3a\x87\xef\xbf\xf4\xad\x7f"
+ "\x73\xf5\xe0\xd7\xff\xa5\xe3\xfe\xdb\xda\xc4\x37\x33\x23\x1c\xdb"
+ "\xc4\xac\xea\xbe\x36\xb1\x45\x26\xdd\x26\x7e\x59\xd7\xd7\x26\xfe"
+ "\xe7\x6e\xc1\x26\xfe\xe7\x66\xd7\x6d\x62\xcb\x57\xce\xdb\xc4\x96"
+ "\xf7\x5d\xb3\x89\x2d\x39\xfd\xdb\xc4\x96\x56\xd7\x6c\x62\x4b\x6b"
+ "\x5f\x9b\xd8\x12\x66\x6d\x13\xff\xe3\xf0\x5d\x57\x9a\x1f\x1d\x04"
+ "\x73\xb4\xf7\x39\x8f\xff\xb4\x1b\xb3\x09\x31\xe7\xff\xab\x2d\xdc"
+ "\x44\x3b\xe8\x8e\xe8\x20\xb3\x7c\x32\xda\x95\x90\x8e\x8e\x58\x2f"
+ "\xf3\x86\x20\x6f\x3a\x32\x39\x89\xf6\x04\xe0\x9a\x2a\x10\xda\xef"
+ "\x43\x3b\x82\x46\xd0\x0d\x41\x23\x4b\xaf\x10\x3f\x38\x02\x4a\xf9"
+ "\xf9\x18\xbe\x07\xd3\x0d\x01\xc3\x72\xd7\x93\xf1\x3e\x06\xe2\x05"
+ "\x6d\x50\xfb\x6c\x56\x12\xb0\x41\x7e\xf8\x9d\x66\x7f\x11\x54\x71"
+ "\x85\x28\x7c\x52\x41\x37\xbe\x50\x5f\xaa\x0f\xa5\xc9\x41\xa4\x22"
+ "\x89\x78\x99\xe5\x24\xa0\x5c\x4e\xab\x8d\x1d\x41\x72\x93\x5f\x61"
+ "\x22\xd3\x4f\x6b\x25\x1d\x05\x6b\xaf\xc2\xc2\xa9\xe6\x51\x85\x81"
+ "\xa6\xcc\x58\x0f\xba\x49\xed\x81\x6d\x35\x15\x16\xaa\x68\x31\x1c"
+ "\x99\xb1\x23\xd0\x87\xae\x58\x0f\x75\x77\x04\x0c\xcb\x83\xba\xcb"
+ "\xd7\x93\xc0\xb2\x2b\x24\x88\x5e\x0a\x92\x83\xfe\xd5\xb8\x3f\x2a"
+ "\xc8\x48\x6d\x96\x7f\x11\x04\xe7\x14\x68\x13\x29\xd6\x6f\x84\xfa"
+ "\x7b\x82\x30\xc6\x05\xd8\x26\x01\x15\x50\xbf\x69\x43\x90\xc4\xf1"
+ "\xd2\xca\xd6\xf5\x7c\xbb\xcc\xe3\x7f\x13\x41\xdf\x84\x03\xdb\x05"
+ "\x32\xac\x40\x99\x4c\xf8\x4d\x24\xb6\x6d\xfb\x15\x32\x1e\xda\x19"
+ "\x08\x6d\x08\x82\x7a\x31\xb7\x8c\x7a\xe9\xb3\x4a\xc4\xa8\x55\xdb"
+ "\x4c\x3b\xf8\xb6\x7d\x07\x6d\xbb\x20\xb4\x0d\xeb\x42\xf9\x38\xba"
+ "\x6f\x1b\x9e\x71\x1b\x8e\xcd\xaf\x7d\x52\xaf\x0f\xc3\x7b\xb8\x97"
+ "\x36\xc5\x4a\xc4\xea\x57\x53\x1c\xe1\x25\xef\x4d\x32\x9a\x2a\x4f"
+ "\xb7\xcd\x7e\xfe\x0b\x8a\x31\xc4\xe7\xdf\x24\xe3\x1b\x60\x5c\xd7"
+ "\x77\x9e\x27\xd4\xf7\x74\xdb\xf1\xa0\x76\xa9\x75\x39\x7c\xfe\xed"
+ "\xc5\x6c\xda\xd8\x13\x88\xf1\xaf\xa2\x9a\x3c\x39\x4d\xed\x0e\x8c"
+ "\xd7\x7d\x78\xaa\x9b\x2c\x4b\xc5\xfb\xc4\x34\x55\xb5\x88\x78\xb5"
+ "\x78\xb4\xab\x33\x3f\xc7\x7b\x5a\x67\x83\xac\xef\x69\x9d\x9d\x49"
+ "\x3c\xbe\xd6\x13\x8f\x6f\x54\xc4\xe3\xdc\x1e\x02\x74\xd6\xc7\xb7"
+ "\xba\xf0\x37\x6e\x23\x1a\x23\xfd\x9a\x16\x86\x06\xe5\xca\x69\x67"
+ "\xf8\x38\x99\x4e\xbb\x1e\xef\xf1\x7c\xfd\x0d\xc8\xef\x5b\x98\x57"
+ "\x7d\xf0\x3b\xf2\x4b\x4c\x22\x37\x9d\xf3\xf8\xba\xcd\xc7\x70\x7d"
+ "\x98\xd1\xaf\x48\x67\xa4\x6a\xd2\xa3\xda\x1b\xd2\x55\x58\x18\xd1"
+ "\x83\xf1\xb9\x15\x68\x83\xce\x7e\xe9\x23\xcb\x22\x14\xf4\x4f\x69"
+ "\x00\xde\xe7\x54\x97\xc2\x81\xba\xe4\xf4\x38\x72\xe3\x68\xd4\x37"
+ "\x8e\x85\x0a\x56\xae\xc4\xf1\x90\xc7\x8f\x1b\xbd\xc7\x5d\xd1\x26"
+ "\x39\x21\x26\xb8\x3e\xf3\x2b\x32\x1a\xf7\xc5\x2d\x03\xba\x65\x26"
+ "\x2f\x1c\xc7\x6a\xed\xa2\x4f\xc8\xd9\x44\x22\xcf\xfc\x9e\x0c\x07"
+ "\x4c\x70\xe3\xd1\x0c\xe3\x31\xbc\xd9\xa7\x13\xec\x8a\x59\x73\x99"
+ "\xf8\xa0\x9d\xc2\x3d\x66\x1a\xda\x75\xc4\xfc\x5d\xd0\x88\x5d\x09"
+ "\xc4\xcf\xf8\x5d\xec\x48\xfd\x77\xb1\x37\xed\x34\x13\xbf\x11\x89"
+ "\x44\x59\x96\x00\x58\x5c\x0b\xe3\xf3\x02\x8c\xcf\x76\x36\x3e\x2d"
+ "\xf8\xa3\xb9\xc3\x53\xf0\xdd\x7f\x6e\x6c\xee\xe0\xc7\xe6\x06\xc0"
+ "\xdf\x7a\x01\x7f\xc6\xb5\x41\xf2\x32\x39\x25\xd0\x46\x90\xfb\x57"
+ "\x01\x15\x9a\xeb\xbd\x30\x46\x49\xef\x4c\x68\x04\x9b\x0f\x7d\xa5"
+ "\xc6\x03\xa0\x0b\xcf\x71\x72\x15\x2d\x2a\xd2\x7d\x18\xd1\x46\x84"
+ "\xb8\x49\xfb\xc2\xee\xb1\xf1\x3a\xd5\x5c\xfa\x5d\x8b\xc7\xd7\x3a"
+ "\x28\xf7\x52\xcd\xff\xb9\x12\xf4\xb8\x90\xc5\x59\xda\xd5\x18\x33"
+ "\xd5\x79\x7c\x7d\x10\x78\x11\x7c\x76\xe0\x23\xee\xbe\xdc\x37\x01"
+ "\x40\x4b\x4c\x20\x73\xa3\xdf\xf4\x54\xb3\x5f\x61\x96\xf6\x99\x6e"
+ "\xce\x5e\xf5\x80\x0e\xce\xc6\x13\xf9\xb2\x76\x90\x8d\x09\x64\xd3"
+ "\x11\xe4\x0d\x76\x2b\x02\xed\x16\xcd\x4f\x8e\x4f\xd7\x51\x73\x78"
+ "\x8c\x07\x05\xb9\x78\x61\x8c\x7c\x69\x22\xa1\x19\xe7\x41\x46\x86"
+ "\x26\x02\x7d\x1b\x01\xb6\x6d\x64\xd9\x7a\xe2\xb7\x0b\xe4\x33\xbc"
+ "\x1d\x7c\x9a\x82\x7f\xe8\xde\xd4\xd4\x7a\x9a\x00\xe7\x68\xc7\x7c"
+ "\x36\xcb\x6e\x00\x5d\x8d\xc8\xc1\x71\x0b\xe3\xd8\x67\x33\x67\x57"
+ "\x39\xdd\x1a\x37\x04\xdd\xd1\xb3\x21\x48\x05\xc7\x6d\x16\x5b\x67"
+ "\xb1\x33\x34\xf7\xab\x2c\xb4\x73\x0d\xa9\x3a\x62\x04\x59\x8e\xc0"
+ "\x39\x71\x43\xd0\x68\x4e\xa6\x4f\x83\x4c\x57\x11\xaf\x89\x9d\x44"
+ "\x06\xed\x52\x42\x9b\xc9\xc9\xd8\x16\xb4\xad\x01\x26\x18\x47\x28"
+ "\x67\xe0\x29\xa7\x80\x35\x73\xe1\xf4\xd4\x59\x71\x2a\x72\x3c\xe8"
+ "\x34\xc1\xfc\xb2\x99\x5d\xf4\x4b\xbc\x2f\xd8\x90\x6a\x24\xd4\xbf"
+ "\x08\x65\x08\x72\xfb\xba\xe6\xc3\x88\x4e\xe2\x18\xd3\xe7\x76\x0b"
+ "\x98\x3e\xb7\x5b\xc0\xf4\xb9\x4a\xee\x3e\xbc\x08\xd7\x5d\x95\x80"
+ "\x6b\x3f\x31\xae\xbf\x79\xe7\xaa\xe2\x7a\xb6\x74\x5c\xef\xbc\x20"
+ "\xc2\xb5\xe6\xbf\x83\xeb\x8f\xd4\x1c\xae\x3d\x7a\xc6\x72\x78\x3d"
+ "\xdc\x60\x7c\x1b\xfc\xdf\x73\x39\x16\xdc\x9e\xd8\x8b\xb8\xfd\xb6"
+ "\xf1\x5a\xc5\x6d\x57\x47\x90\x0a\x8e\x41\xc7\x2d\xf0\x74\x1a\xb7"
+ "\x1f\xa9\xbb\x89\x45\x7e\x88\x5f\x9a\x7f\xba\x4d\x95\x49\x1e\x04"
+ "\x3b\x01\x3e\xc3\x6d\xe4\x24\x27\xc3\x76\xb5\x6a\x3e\x35\x83\x8d"
+ "\xe0\x72\x8d\x74\x67\x53\x6a\xf6\xcb\x8b\xce\xfc\x98\x28\xcd\x85"
+ "\x4f\xe8\x1b\x8c\xfb\x89\x4f\x22\x51\xe0\xfd\x58\xea\x7b\x71\x0f"
+ "\xac\xc3\xb9\x7b\xb5\xe6\x1d\x9f\xa9\xf0\x7e\x26\xde\x43\x31\x15"
+ "\x55\x44\x9b\x77\x1c\xd2\x9a\x7d\x2f\x10\xba\xe3\x62\x08\xde\xc3"
+ "\xed\xc8\x6d\x57\x5b\xee\xe1\xdb\xf5\x8d\xfc\x2a\xa2\x61\xbc\xc0"
+ "\x9a\xea\xfc\xc7\xf0\x57\x0e\xed\xf8\x1e\xfe\x7a\xc0\x5f\x6e\x1f"
+ "\x63\x69\xf3\x5c\x3b\xdb\x6b\xa9\xb0\xc8\xc0\xdb\xc1\xed\xdc\x18"
+ "\xbc\x8b\x0c\x3f\xc7\x7f\x87\xf6\xb4\x59\x9e\x09\xe8\xa5\x17\xe4"
+ "\xb1\x05\xeb\x06\x99\x28\xd8\x73\x0a\xec\x37\x3e\x03\xc4\xf3\xe3"
+ "\x7e\x9b\x03\x35\x4d\x5a\x4d\x0b\x69\xf7\x38\x1f\xd9\x00\x73\xbf"
+ "\xb9\xb8\xc8\x80\xf7\xdc\x10\xf7\x96\x7a\x47\x80\xbe\xb5\x69\x1c"
+ "\x0d\x97\x8f\xd8\x5c\x98\xa3\xa5\xc5\xd3\xf5\xb8\x86\xec\xa0\xb1"
+ "\xbf\xe6\xff\xe2\xbd\x26\x0f\x16\x6f\x39\xbf\x9b\x82\xfc\x70\x5f"
+ "\xf8\xde\xe7\xa2\x70\xbf\xf6\x2c\x85\xea\xfd\x74\xc2\x3f\x0f\xc0"
+ "\xda\x8b\x7b\xba\xe3\x73\x47\x3f\xcf\x22\x59\x1d\x76\xf6\x74\x17"
+ "\x9e\x4f\x3a\x9f\x63\x2e\xca\xd1\x76\xe4\x9e\x6f\x06\x1f\xa0\x55"
+ "\xdc\x67\x7b\xba\x00\xfa\x4e\x47\xe7\xa4\xe9\xe1\x82\x9f\x23\x3e"
+ "\x33\x82\x4c\x54\x22\xaf\x68\x87\x7e\x75\xe0\xea\xc4\xf0\x3d\x26"
+ "\xad\xb9\x47\xed\x73\x3c\xfd\xbc\x44\x9f\xe8\x82\xc3\xfd\x5f\x4d"
+ "\x85\x79\x59\xc6\x3b\x81\xf7\xb8\xdb\x88\x69\xad\xfa\x51\xbc\x07"
+ "\x82\xbe\x5e\x46\x1c\x7b\x96\xad\x6e\x8f\x91\xa0\xdf\xf7\x46\x42"
+ "\xad\xbc\xbb\x47\x4d\x46\xe8\x89\x72\xb6\x21\x93\xe6\x5d\x20\x81"
+ "\x74\x83\xda\x27\xe7\x02\x99\xda\x73\x29\x60\xd8\x4b\x49\x44\xd1"
+ "\x0d\x36\xb9\x3b\x39\xd6\x07\x9f\x9b\x7b\xf7\x9c\x56\xde\x60\xac"
+ "\x41\x3f\x33\x10\xe7\x01\x6c\xbb\xe9\x92\x7a\xc4\xb6\x8b\x78\x9f"
+ "\xf8\x32\xd1\xae\x78\x15\xe6\x81\xef\x8e\x7b\x66\x80\xed\x03\xdb"
+ "\xc5\xcd\x07\x2e\xcc\x05\xdd\x30\x17\xcc\x52\xd3\xce\xfa\xa6\x4f"
+ "\xf0\xde\xb5\x32\x73\x1d\x19\x8e\xfc\xf1\x5e\x33\x37\x3f\xcc\x83"
+ "\xf9\x01\x7e\xc3\x5a\xa2\x77\x7e\x50\xcd\x26\x7d\xe6\x07\x5c\x87"
+ "\xd4\x37\xb7\x11\xc0\xf2\xf5\xb3\x0d\x3e\x9d\x1a\x03\x35\xe3\x9a"
+ "\xa4\xc1\x78\x1e\xf3\x1b\x8d\xb0\xcc\x15\x38\x4f\x74\xf3\xf3\x44"
+ "\x19\x3f\x4f\xbc\x32\x08\xf3\xc4\x2b\x38\x4f\x9c\x26\xf2\x9d\x38"
+ "\x47\xc0\xfc\xf0\x87\x7f\xeb\xe5\x3d\x30\x27\x48\xd3\xb3\xbe\xd2"
+ "\x21\x7e\x8a\x8b\x8e\x9a\x61\x2e\x46\x3d\x6f\x02\xfd\xa2\x9e\x1b"
+ "\x82\x40\xb7\x4d\xd7\x87\x75\x41\xb9\xb1\x38\x3d\x78\xcf\x59\xbd"
+ "\x9c\x16\x66\x45\x74\x01\x1e\xd2\x2e\x13\xb9\xd1\x2f\x2f\x6b\xff"
+ "\xfc\x7c\x39\xae\x5b\xcd\x45\xe9\x29\x6c\x8d\x7c\xc9\x1f\x63\x34"
+ "\x3e\x6d\x44\x89\xf1\x53\x13\x55\xfb\x98\xbf\x55\x0f\x37\xaf\x0e"
+ "\xf0\xea\xf9\x36\x60\xd8\x8b\xcf\x10\x85\x7e\x75\xac\x4f\xe6\x42"
+ "\xa2\x7c\xef\xb3\x7c\x79\xbd\x01\xc6\xf6\x75\x66\x58\xb7\xa7\x07"
+ "\x57\xb4\x90\x29\x15\x2b\xc8\xe4\xf2\xb3\x44\x55\xbe\x8a\x8c\xdf"
+ "\x75\x16\x30\xb4\x5a\x3d\xa2\x87\xc3\x47\x97\x96\x7b\x2e\x60\x15"
+ "\x09\xa1\xa3\x32\x83\xe1\xef\x94\xfc\x55\xb0\x9e\x19\x95\x1e\x4c"
+ "\xfd\xf3\xb2\xcc\x40\x97\x03\x6b\x37\xf0\xd1\xa1\x0d\xdf\x9b\xec"
+ "\xe1\x66\x97\x44\x1f\x62\x56\x04\xe0\xa6\x11\x70\xf3\xbd\x35\x6e"
+ "\x70\xdd\xca\x61\x67\x16\xc3\x0e\xde\xf3\xab\x10\xfb\x17\x2b\x3e"
+ "\x74\x19\x3f\xa5\xe0\x3f\x77\xd9\xe0\xa7\xf4\x82\x7b\xf8\xe9\x01"
+ "\xfc\x94\x66\x03\x7e\x4e\x12\x79\x89\xd9\x1d\xfc\x5c\xd4\x71\x73"
+ "\x44\x55\x7c\x13\x7b\x86\xe9\xfb\x69\xa8\x67\x9d\xc7\xf7\x53\xe7"
+ "\x05\xc9\x88\x8b\xb8\xaa\x1e\x00\x57\x06\x86\xab\xcb\x6b\x5c\xc0"
+ "\x55\x21\xe0\xaa\xba\x7f\x5c\x5d\x76\x84\xab\xea\xbe\xb8\x32\xcc"
+ "\x1b\x5a\x5c\x71\xf9\x44\xff\x07\x70\x75\x79\x8a\x35\xae\x2e\x15"
+ "\x31\x5c\x5d\x2a\x74\x1d\x57\x19\x03\xd8\xab\x0c\xde\x5e\x75\x1c"
+ "\x77\x01\x57\xed\x14\xf8\xf7\x8f\xab\xf3\x0e\x70\x95\x61\xc7\x5e"
+ "\x5d\xd9\x3f\xb4\xb8\xe2\xf2\x9d\xfe\x0f\xe0\xaa\x23\xdf\x1a\x57"
+ "\x97\xcf\x33\x5c\x5d\x6e\x77\x03\x57\x03\xd8\xab\x0c\xde\x5e\x75"
+ "\xdf\x2a\x1d\x57\x34\x14\x70\x35\x80\xbd\x3a\xe3\x08\x57\x76\xec"
+ "\x55\x97\xe7\xd0\xe2\x8a\xcb\xc7\xfa\x3f\x80\xab\xae\x36\x6b\x5c"
+ "\x75\xce\x60\xb8\xea\x0c\x75\x1d\x57\x9a\x01\xec\x95\x86\xb7\x57"
+ "\xc6\x75\x2e\xe0\xaa\x94\x02\xff\xfe\x71\x75\xc4\x01\xae\x34\x76"
+ "\xec\x55\xcf\x92\xa1\xc5\x15\x97\x2f\xf6\x7f\x00\x57\xc6\x10\x6b"
+ "\x5c\x75\x97\x31\x5c\x75\x97\xba\x81\xab\x01\xec\x95\x86\xb7\x57"
+ "\xe6\x93\x2e\xe0\xca\x00\xb8\x1a\xc0\x5e\x65\x38\xc2\x95\x1d\x7b"
+ "\x65\x3a\x34\xb4\xb8\xe2\xf2\xd9\xfe\x0f\xe0\xca\x5c\x62\x8d\x2b"
+ "\xe3\x65\x86\x2b\xa3\xc1\x29\x5c\x75\x8a\x70\xd5\x7c\x7d\x58\x77"
+ "\x26\x5b\x0f\xbe\xb1\x8a\xc7\xd5\xeb\xab\x13\x37\xad\x23\xf2\xfd"
+ "\x8b\x4a\xac\xd7\x82\x0a\xd9\xcd\xb6\x98\x02\x5c\x70\x98\x32\xae"
+ "\x06\x4c\x9d\x63\x98\xd2\x9c\x01\x4c\xfd\xb3\x44\xde\x90\x7a\x1e"
+ "\x71\xc2\x61\xa8\x74\x15\x60\x08\xd7\x85\x32\x45\x80\x94\x35\xe0"
+ "\x4b\xe7\x78\x2c\x29\x88\x6c\x50\xb0\x14\x09\x58\x3a\x65\x8b\xa5"
+ "\xe3\x02\x96\xe6\x38\x58\x03\x2e\x75\x80\x25\xdd\xc0\x58\xda\x85"
+ "\x31\x84\xb5\x57\x09\x4b\x1f\x0b\x31\x84\x7d\x2b\xf4\x72\xa3\xbf"
+ "\x44\x2c\x29\x48\xab\x35\x96\xe8\x63\x0c\x4b\x34\xcc\x75\x2c\x65"
+ "\x54\x3b\xc6\x12\xef\x4f\x29\x3c\x56\xba\x87\x25\xf0\xad\xac\xb0"
+ "\x34\xb0\x1f\x25\x60\x49\x3e\x6b\x68\xb1\x64\xe3\x47\xfd\x60\xb1"
+ "\xe4\x11\x6c\x85\x25\x85\x8c\xad\xfb\x14\x32\x87\xeb\x3e\x33\xcc"
+ "\x5d\x78\xcf\x09\xdf\x0d\x36\x5d\x52\x3f\x6a\x82\x39\x0d\xdf\x11"
+ "\xc6\xfb\x14\x07\x12\x1a\xe5\x88\xa7\xdc\x8b\x24\x30\x27\x89\x4c"
+ "\xf5\xe9\x64\x58\x31\x02\x56\xb6\x5e\x24\x8a\x9e\x1e\xc0\x49\x37"
+ "\x51\x74\x81\xbc\xbb\x7a\x62\x7d\xea\xa2\xdb\xc8\x7b\x17\x1a\x61"
+ "\x2e\xab\x21\xe5\x70\x4d\x0f\x1f\x87\x34\x6f\x52\x8f\xd8\x96\x86"
+ "\x71\xc8\x93\x44\xbb\xe8\x15\xd0\xbf\xc2\x6d\xfd\x77\x3d\xe7\x48"
+ "\xff\x47\xac\x74\x5f\x2a\xd2\x3b\xf7\x5e\x81\x8b\xf3\x11\x77\x9f"
+ "\x2a\x81\xe9\xde\xa2\xf7\x9d\x83\xa0\xf7\x9d\xbc\xde\xdd\x9a\x8f"
+ "\x14\x9e\x8e\x9f\x7f\x14\xd9\x0a\xee\x99\x82\x4e\x66\x23\x2c\x76"
+ "\x01\x6d\x04\xfa\x2f\x5d\x7e\xe9\x93\x6d\xe7\x1b\xb4\x0f\x17\x14"
+ "\xd7\x17\xe1\xdc\xe4\xd0\x8f\xe1\xed\x44\xe6\x46\x66\x27\x38\x3f"
+ "\x66\x18\x99\x39\xa8\xf1\x47\xc5\x75\x19\x57\xcf\x5e\x1c\x19\x78"
+ "\xee\x71\xc3\x8f\x41\xdc\x94\xda\xe0\xe6\x6a\xd8\x0b\xd7\x70\x73"
+ "\x7d\xb4\xb5\xbd\xf0\x3c\xc2\xec\x85\xe7\x61\x67\xe6\x9e\x01\xf0"
+ "\x74\x50\x84\x27\x83\x80\xa7\x1b\xbe\xc2\x18\xa5\x44\x3c\x55\x0e"
+ "\x6a\xdc\x51\xe1\x75\x72\x68\xf1\x34\x78\x71\xc7\x6b\x1b\x4f\x37"
+ "\x54\x5b\xe3\xc9\x6b\x38\xc3\x93\x97\xb7\xfb\x78\xca\x10\xd9\xa7"
+ "\x0c\x91\x7d\xf2\xbe\x0f\x63\x93\x12\xf1\x64\x18\xd4\x78\xa3\xe2"
+ "\xc6\x5b\x87\x16\x4f\x83\x17\x6f\xbc\xb6\xf1\xe4\x4d\xac\xf1\x34"
+ "\x6c\x09\xc3\xd3\xb0\xa8\x41\xc0\xd3\x41\x5b\x9f\x98\xe1\x69\xc4"
+ "\xf3\xe8\x3f\x4b\xc3\x93\x2c\x6c\x50\xe3\x8c\x8a\xe1\x6b\x86\x16"
+ "\x4f\x83\x17\x67\xbc\xb6\xf1\x34\x22\xc2\x1a\x4f\xde\xfb\x19\x9e"
+ "\xbc\xf7\xb9\x8f\x27\x8d\xc8\x3e\x69\x44\xf6\x49\x79\x1a\x63\x91"
+ "\x12\xf1\x34\xb8\xf1\x45\x85\xcf\x91\xa1\xc5\xd3\xe0\xc5\x17\xaf"
+ "\x6d\x3c\x29\x2b\xad\xf1\x34\xc2\xc4\xf0\x34\xc2\x38\x08\x78\x12"
+ "\xd9\x27\x8d\xc8\x3e\xdd\x34\x16\x63\x90\x12\xf1\xa4\x1f\xd4\xb8"
+ "\xa2\x62\xe4\xf0\xa1\xc5\xd3\xe0\xc5\x15\xaf\x6d\x3c\x8d\xd4\x5b"
+ "\xe3\xc9\x77\x16\xc3\x93\xef\x4c\x67\x63\x41\x96\x18\x90\x18\x4f"
+ "\x8e\xd7\x76\xfe\x71\xb6\x6b\x3b\x49\x31\x20\x5c\xe7\xb9\x1c\x4f"
+ "\xf4\x9b\xf3\xff\x6b\x3c\x11\x31\x64\x89\x03\x5d\x7b\x31\x20\xff"
+ "\xc9\xd6\x18\xba\x69\x27\xc3\xd0\x4d\x25\x8e\x30\x64\x14\x3f\x93"
+ "\xf6\xb5\xe8\x99\xb4\xf3\x44\xbe\x3f\x41\x2b\xaf\xe7\x9f\x49\xc3"
+ "\xe7\xd1\xea\x5b\xdb\xc8\xb6\x2b\x44\x39\x22\x96\x28\x67\x27\x66"
+ "\xd2\x3c\xb4\x21\xc9\x6a\x9f\x97\xce\x92\xa9\x3d\x80\x99\xdc\x73"
+ "\xfc\x73\x69\x80\x9b\x8f\x9a\x3b\xc9\xbb\x09\xf8\x5c\x5a\x35\xa9"
+ "\x00\x3a\x63\x21\x8b\x07\xa1\x1d\xe1\x9e\x49\x5b\xf5\x2a\xe0\x60"
+ "\xd4\x42\xbb\xcf\xa4\x65\x4b\x7c\x26\x2d\x05\x70\x60\x00\x1c\x5c"
+ "\x46\x0c\x1c\xb2\x7a\x16\x6d\x57\xb6\x28\x06\xb4\xc2\x41\x0c\xa8"
+ "\xc9\xb9\x7b\x12\x83\xfe\x2c\xda\x77\xa2\x67\xd1\x2c\x31\xa0\x45"
+ "\x60\x3b\x24\xeb\xfd\x27\x0e\xf7\x3f\x40\x1b\x61\x02\x9b\x30\x1b"
+ "\x9f\x2d\x37\x08\xf1\xe2\xf4\x38\x7c\xf7\x37\x3d\xd8\x08\xb6\x02"
+ "\x9f\x1f\x7f\x73\x45\x2d\x17\xef\x6b\x48\x6d\x22\xdb\xba\x89\xd2"
+ "\x47\xcf\xdb\x05\xff\xf4\x94\x1e\xb0\x0d\x26\x98\x97\x40\xd7\xc3"
+ "\x7b\x92\xc1\x36\x5c\x04\xdb\x90\x0c\xb6\xe1\x32\xd8\x86\x96\x5a"
+ "\xce\x36\xd0\x17\xcc\x53\x31\x2f\x78\xc5\x39\x32\xb9\xec\x1c\x99"
+ "\x82\x36\xc0\x54\x94\x97\xd5\xe3\x9f\x1e\xa9\xf7\x4f\x57\xc3\xb9"
+ "\x58\x86\x81\x2e\x6d\x4e\x12\xe1\x6c\x3d\xea\x5e\xb5\x0a\xed\x41"
+ "\xc0\xf2\x9e\x6c\x42\xdc\xc1\x41\x8f\x38\x26\x28\xc6\x81\x03\x1b"
+ "\xe0\x36\x16\x6c\xe2\xc0\xbb\xdc\xb4\x01\x88\x85\x5d\x16\x1b\xe0"
+ "\x16\x16\x6e\x76\xf8\xfe\xcf\x00\x58\xa8\x76\x02\x0b\x06\x27\xb1"
+ "\x50\x88\xf9\xb4\xed\x60\xe1\x14\x60\xa1\x09\xce\xb5\x31\x2c\x5c"
+ "\xb6\x83\x85\x5b\xd6\x5c\x7d\x2c\x58\xc7\x64\x7e\xb8\x58\xf8\x69"
+ "\xa8\x6b\x58\xc8\x70\xc2\x2e\x64\x38\x6b\x17\xda\x31\x0f\x75\x5f"
+ "\x2c\x64\x80\x5d\xc8\x00\xbb\x90\xc1\xdb\x85\xf3\x76\xb0\x30\x7a"
+ "\xe3\xd5\xc7\x82\x75\x3c\xe5\x87\x8b\x85\x5b\x1d\xe7\xbf\xe8\x1f"
+ "\x0b\x4e\xd8\x85\x0c\x27\xed\x02\x0d\xc5\xfc\xcd\x76\xb0\x00\x76"
+ "\x21\x03\xec\x42\x06\x6f\x17\xce\xd8\xc1\xc2\x6d\xcf\x5f\x7d\x2c"
+ "\x58\xc7\x42\x7e\xb8\x58\xb8\xdd\xe1\xfe\x5f\xfd\x63\x41\xe3\x84"
+ "\x5d\xd0\x38\x69\x17\x68\x29\xe6\x3d\xee\x8b\x05\x0d\xd8\x05\x0d"
+ "\xd8\x05\x0d\x6f\x17\x8e\xd8\xc1\x82\x6a\xc7\xd5\xc7\x82\x75\x1c"
+ "\xe3\x87\x8b\x85\x31\xb1\x2e\x62\xc1\x09\xbb\xa0\x71\xd6\x2e\x18"
+ "\x30\x5f\xb0\x1d\x2c\x80\x5d\xd0\x80\x5d\xd0\xf0\x76\x21\xc3\x0e"
+ "\x16\xee\x28\xbb\xfa\x58\xb0\x8e\x41\xfc\x70\xb1\xf0\xb3\x94\x7e"
+ "\xb1\x40\xfb\x62\x01\x63\x08\xb8\x7e\xc4\x7c\xdc\x1c\x16\x9e\xd1"
+ "\xca\xbb\x29\x62\xa1\x96\xbc\x98\x26\xc2\x42\x11\x5b\x47\x58\x70"
+ "\xb0\x5d\x8c\x03\x7c\x7f\x09\x71\x00\xeb\x07\x23\xe8\x9d\x16\x67"
+ "\x06\x73\xcf\x2b\x15\xa5\xc7\xe2\xfa\x01\xe3\x0c\xb8\x86\x70\xbc"
+ "\x7e\x08\xdc\x3d\x28\x18\x88\x07\x0c\xb4\xdb\x5f\x47\x0e\xfa\xfa"
+ "\xe1\xbb\xab\x84\x01\x58\x4b\xbe\xa2\x71\x07\x03\x63\x1d\xee\xff"
+ "\xe1\x18\x03\xe0\x23\x38\x85\x01\xe6\x27\xf4\x8f\x81\x8c\x46\x01"
+ "\x03\xe0\x2f\x14\x65\xb4\xa1\x7f\xc0\x30\x90\xd1\xe4\xd8\x3f\xb8"
+ "\xf3\xb5\xab\x8f\x81\x41\xf6\x0f\xae\x59\x0c\xfc\x3c\xdd\xe1\x3b"
+ "\x8c\x68\xcb\xc1\xee\xcf\x1e\x77\x1b\xa1\xab\xd5\x8f\xe6\x9e\x23"
+ "\x81\x2f\x3d\x43\xa6\x62\xde\x98\xfd\xdd\x9d\x72\x4d\x22\xfd\x1a"
+ "\xdf\xad\x36\x42\x3f\x30\x5f\x28\x87\x8f\xef\x02\xbc\x1a\x62\xf5"
+ "\x64\x1b\x60\xe1\x25\xe8\x03\xe6\xae\x1f\x91\x78\x7d\x58\xbd\xe1"
+ "\x43\xd2\x7d\x49\x4d\xea\xa2\xcf\x91\xf0\x20\xda\xd3\xd0\xac\xc5"
+ "\x77\x18\x15\xda\xf5\x1f\xe2\x7b\xe2\xc3\x96\xa5\x12\xf9\x05\x45"
+ "\x50\x08\xc6\x94\x26\xa6\x12\x65\xe9\x39\x16\x47\xda\x76\x81\x90"
+ "\xe3\x80\x52\xa6\xf7\xa0\x32\xcf\x8d\x83\x10\x43\x8a\x02\xbd\x37"
+ "\x5b\xf4\x7e\xdc\x3a\x86\x24\x77\xe2\x7d\x46\x27\x62\x87\x57\xe5"
+ "\x7d\xc6\xef\xfa\xbe\xcf\xe8\x5a\xec\x70\x5c\x62\xbf\xcf\x11\xf1"
+ "\x7e\xc0\xa6\x14\x6e\xdc\x73\x7a\xed\x01\xdb\xdf\x90\x5a\xc3\x3d"
+ "\x1f\x8d\xe3\x1c\xc7\x3c\xe2\x23\x13\xfa\x8b\x18\x41\x3c\xcc\xde"
+ "\xd3\xd3\xb3\xd4\x40\xe4\x66\xff\xf4\x14\xc4\x84\x79\x6d\x80\x57"
+ "\x0e\xf4\xa9\x21\xba\x05\xf4\x7e\x91\x34\xb4\xf2\x3a\x4f\x6b\x01"
+ "\x5d\xde\x35\x9e\xae\x0d\x1a\x36\xc1\x40\x94\x99\x9f\x13\xe5\x32"
+ "\x7c\xe7\x18\xe6\x81\x5d\xe0\x13\x54\x3c\x43\x26\xc3\x7c\x10\xd1"
+ "\xc3\xdb\x06\xb3\x25\xae\x84\x73\x04\x60\xe2\xa5\x04\xc0\x04\xcc"
+ "\x5e\xaa\xa5\x88\x89\xbb\xde\xf2\x5c\x67\x27\xbe\x2c\x01\x13\x5c"
+ "\x7c\x39\x06\x30\xd1\x2a\x60\xa2\x37\xae\xec\x60\x4e\xd0\x2e\x72"
+ "\xe3\xd9\x42\x3b\xf6\xc0\xed\xb8\xf2\x77\x7c\x5c\x59\x64\x0f\x5c"
+ "\xc3\xc6\x2f\x1c\xe7\xc4\x74\x8c\x8d\xea\x81\xb1\xd1\x61\xc1\x86"
+ "\x61\x60\x6c\x8c\x0f\xb3\x83\x8d\x42\x11\x36\x1a\x45\xd8\x60\x71"
+ "\xa6\xa2\xf4\xb6\xbe\xd8\x18\x7f\x72\x68\xb0\x61\xf3\xdc\xcf\x0f"
+ "\x16\x1b\x77\xef\x91\x8e\x8d\x0c\x27\xec\xc6\x77\x3c\x36\x32\x9c"
+ "\xb0\x1b\x13\x62\xec\x60\xa3\x5d\xc0\x46\x86\xc8\x6e\xf0\x71\xa7"
+ "\xa2\x0c\x3b\x76\x63\xc2\x37\x43\x83\x0d\x9b\x67\x78\x7e\xb0\xd8"
+ "\x98\x78\xcc\x05\x6c\x38\x61\x37\xbe\xb0\x60\xc3\x09\xbb\x11\x9c"
+ "\xd5\x17\x1b\x34\x54\x84\x0d\x91\xdd\xe0\xe3\x50\xe8\x73\xf6\xc1"
+ "\xc6\x24\xcf\xa1\xc1\x86\xcd\xf3\x38\x3f\x58\x6c\x4c\xd2\x49\xc7"
+ "\x86\xc6\x09\xbb\xf1\x1e\x8f\x0d\x8d\x13\x76\xe3\x9e\x52\x3b\xd8"
+ "\x28\x15\xb0\xa1\x11\xd9\x0d\x3e\x2e\x55\xa4\xb1\x63\x37\xee\x1d"
+ "\x33\x34\xd8\xb0\x79\xb6\xe6\x07\x8b\x8d\x7b\x1d\xee\x7f\xdd\x0f"
+ "\x36\x9c\xb0\x1b\x99\x16\x6c\x38\x61\x37\x26\xd7\xd8\xc1\x86\x41"
+ "\x84\x0d\x91\xdd\xe0\xe3\x54\x45\x1a\x3b\x76\xe3\xbe\x69\x43\x83"
+ "\x0d\x9b\xe7\x64\x7e\xb0\xd8\xb8\x3f\xc0\x19\x6c\xa4\x1b\xec\xac"
+ "\x53\x5a\x19\x36\x7a\x80\x46\x8c\x0b\xf1\xda\x04\xfa\xa7\x08\x87"
+ "\x35\x0b\x62\x62\x49\x3a\x91\x73\xb8\x30\x88\x71\x71\x7f\x23\xe2"
+ "\xe2\xee\x58\xc0\xc5\x57\x3c\x2e\x2c\xeb\x12\x2e\xf7\x0a\x5b\x9b"
+ "\x58\x62\x56\x96\xf5\xc9\x8b\xb8\x66\x8d\xb5\x60\xe2\x97\x73\x3c"
+ "\xe3\x06\x01\x13\x56\xcf\x3d\x88\x30\xb1\xd0\xc1\xfa\x64\xbe\xeb"
+ "\x98\x78\x05\xd6\xae\x3d\x83\xfd\xee\x93\x05\x13\x9f\xbb\x8b\x89"
+ "\x29\xfd\x3e\xff\x60\x1f\x13\xbc\x9f\xe1\x10\x13\x82\x6f\xc1\x30"
+ "\xf1\x45\x3f\x98\x98\xd2\xda\x17\x13\xbc\x5f\xc1\xe5\x21\x60\xbe"
+ "\x85\x25\x86\x65\xf1\x2f\xac\x31\xf1\xc0\xca\xa1\xc1\x84\x8d\x7f"
+ "\xf1\x83\xc5\xc4\xaf\x42\x1c\x61\x22\x5f\x6e\xae\x86\xa3\x06\x0e"
+ "\x2d\x1c\xb5\x26\x39\x99\x51\x26\x37\x73\xf9\xc9\xf9\x31\x63\x7b"
+ "\xfe\x3a\xfa\xc2\xe3\x91\x48\x43\x37\x2b\xb8\x1c\x64\x16\x1e\xa6"
+ "\x61\x04\xf3\x21\x6a\x7d\x64\xd1\xa8\x13\xa4\xbd\xde\xc2\xcb\x67"
+ "\x33\x09\x81\xfe\x33\x3a\x39\xc9\x62\x74\x21\xd7\x21\x1d\xcd\xbd"
+ "\xe0\x07\x65\x5e\x3c\x4f\x2e\xc7\xaf\x49\x2e\x47\x5e\xb6\x75\xdf"
+ "\xc0\xd3\xa8\x4c\xd9\x44\x25\xae\x1b\x78\x61\x9d\x16\xba\x61\x48"
+ "\x67\xba\xee\xf6\x50\x93\x4c\x11\x28\xa6\xa3\x0f\x13\x31\xdd\x8d"
+ "\x3c\xbf\x20\xab\x7e\xdc\x41\x88\x8f\x4c\xc5\xfa\x92\x2a\xb7\xf4"
+ "\xc5\x9b\xe3\x39\xa2\x3d\x1e\x78\x8e\xb7\xe2\x79\x1d\x21\xc3\x81"
+ "\x1e\xf9\x0e\x8f\xe5\xda\x8d\xf4\xc3\xe9\x30\x8f\x10\x8e\xbf\x4c"
+ "\x11\x6c\x96\x93\x60\xd6\x2f\xa2\x28\xeb\x6d\xb3\x8a\xe4\x5b\xd7"
+ "\x31\xc2\x22\x2f\x31\x1d\xd2\x50\x79\x2f\x8d\x0f\xd7\x8e\x61\x72"
+ "\xec\xdb\x14\x71\x3b\x18\x1d\x99\xc4\xd3\x29\xa1\x5f\x53\x7b\x75"
+ "\x59\x18\x1a\x64\xa1\x03\xfc\xde\x0c\xba\xd0\x36\xc0\x78\xe3\xe5"
+ "\xe0\x0b\x3a\xd8\xc3\xcb\x22\x44\xcc\x73\xb8\x4c\xa6\x2b\xe3\xe5"
+ "\x65\xce\xbd\x10\x05\xb4\x23\xcd\x9b\x15\xa1\xbd\x7c\xb3\x95\xc4"
+ "\xa2\x57\x9a\x6d\xbc\x89\xe3\xdb\x06\xe3\x4c\x2e\x53\xf1\x72\xb8"
+ "\x09\x69\xe1\x9a\x30\xd6\x2f\x65\xaf\x5e\x4d\x72\x05\x9e\xd3\x8a"
+ "\x68\xfd\x98\x8c\xcd\x9d\xd0\xb7\x99\x7d\xe9\xbd\x6c\xe9\xfd\x19"
+ "\xbd\xbe\x0d\xe8\x23\xfa\xd2\x2b\x6d\xe9\x47\x31\xfa\x4b\x21\x40"
+ "\x1f\xd9\x97\xde\x38\xd2\x86\xfe\x27\x8c\xfe\x72\x09\xd0\xab\xfb"
+ "\xd2\xab\x6c\xe9\x03\x38\xfa\x91\x32\xd4\x4d\x54\x5f\xfa\x10\x5b"
+ "\xfa\x9b\x19\xff\x0e\x3d\xd0\x47\xf7\xa5\xcf\xb2\xa5\xbf\x85\xd1"
+ "\x77\x87\x01\x7d\x8c\x2d\x7d\x05\x47\x4b\xee\xe0\x69\x7f\xca\x68"
+ "\x8d\x95\x40\x1b\x6b\xa7\xaf\x1e\x3c\xef\x60\x9e\x7e\x34\xa3\xff"
+ "\x8e\x00\x7d\xbc\x1d\x5d\xd9\xd2\xdf\xca\xfa\x7a\x53\x04\xd0\x27"
+ "\xda\xd1\x95\x2d\xfd\x6d\x8c\xde\x33\x11\xe8\x53\xec\xe8\xca\x96"
+ "\xfe\x76\x46\x7f\xbd\x16\xe8\x53\xed\xc8\xde\x9a\x7e\xe4\x30\x25"
+ "\xd0\xa5\x97\x65\x5b\xc6\x8f\x95\xdc\x6d\x79\x8f\x61\xbc\xbd\xa3"
+ "\xe1\x9a\x2c\x3b\x72\xb7\xa5\xbf\x83\xd1\x8f\xa8\x06\xfa\x2d\x7d"
+ "\xe9\x89\x8c\xd1\x93\x7b\x78\xfa\x9f\x31\x7a\x5f\x94\xe5\x56\x3b"
+ "\xb2\xc7\xf3\x5a\x7e\x9c\x06\x32\x5a\x8f\x7c\xa0\xcd\xb1\x23\x77"
+ "\x31\xed\x58\x46\xfb\xb3\xc3\x40\x9b\x6f\x47\xe6\x62\xda\x3b\x19"
+ "\xed\x4f\x52\x80\xb6\xd0\x8e\xbc\xc5\xb4\x3f\x67\xb4\x37\x67\x01"
+ "\x6d\x89\x9d\xf6\xde\x21\xa2\x0d\x62\xb4\x3f\xcd\x01\xda\x52\x3b"
+ "\x7a\x11\xd3\x8e\x63\xb4\x63\x51\x87\x95\x76\xf4\x22\xa6\xbd\x8b"
+ "\xd1\xde\x8a\x63\xad\xca\x8e\x4e\xc4\xb4\xbf\xa0\x23\x6f\xaf\xe2"
+ "\x6d\xeb\x1e\x5b\x5a\xc0\x80\x16\xec\x50\x2d\xd8\xc2\xf1\xb4\x60"
+ "\x4c\x75\x05\xb3\x6b\xfb\x90\xce\x42\x43\xe5\xc6\x7b\x45\xf3\xc0"
+ "\xdd\xb4\xc0\xbf\x90\xb7\x7f\xd5\xb6\xfc\xa8\x5c\x21\xa6\x9d\x40"
+ "\x0b\xee\x8f\xe6\x69\x0f\xf6\xa5\xf5\x12\xd3\x4e\xa4\x05\xe3\x6a"
+ "\x78\xda\x9a\xbe\xb4\xca\x5e\x5a\x5a\xf0\x8b\x53\x40\x73\xb8\x9c"
+ "\xb7\xab\xa2\x76\xde\x23\xe2\x37\x89\x16\xdc\xad\xe7\xf9\x69\xfb"
+ "\xf2\x53\x89\x69\xef\xa1\x05\x53\x52\x78\xda\x63\x7d\x69\x43\xc4"
+ "\xb4\xf7\xd2\x82\x60\x6f\x9e\xb6\xb6\x2f\x6d\x96\x98\x76\x32\x2d"
+ "\xb8\x27\x88\xa7\xad\xb3\xa5\x2d\x67\x73\x90\x9c\xd7\xd3\x7d\xb4"
+ "\x60\x72\x28\x4f\xdb\x68\x35\xc7\xca\x65\xdc\x18\x2b\x67\x74\xf7"
+ "\xd3\x91\x3f\x3f\xc6\xeb\xf3\x94\xd5\xdc\x9a\x2d\x1b\x89\x73\x4a"
+ "\x19\xea\xf3\x85\xb9\x3a\xa0\xfd\x25\xcf\xaf\xc9\x76\xee\xe3\xdb"
+ "\x37\x05\xce\x35\x5b\xe6\x27\x98\x77\x74\xf6\xfc\x9e\xc4\xbb\xc8"
+ "\x8d\xe7\x14\xd3\x6b\xd9\xdc\xc8\xef\x53\xac\x98\xc1\xfd\x36\x57"
+ "\xc5\x2b\xc3\x0d\xd4\x28\x2e\xcb\x93\xd3\xc6\x89\x06\xa2\xc0\x9c"
+ "\xde\xd4\xbf\xa8\x46\x07\xe5\xfa\xb1\xf1\xba\x8e\x82\xe9\xa7\x74"
+ "\x32\x13\xb7\x27\x1e\x7c\xd7\xe9\xc8\xeb\x75\xf8\x3d\x2f\x1b\xf7"
+ "\x49\x0c\x91\x99\x8a\xa7\xeb\x71\x5f\xc5\x0a\xf8\x9d\x0b\x07\xb7"
+ "\x87\x21\xf8\x98\xf4\x05\x12\xa2\x5d\x6f\x24\x67\x53\x89\x9c\xdb"
+ "\xb3\x5b\x11\x7a\x37\x5d\x1b\x3b\x15\xda\x12\x02\xf5\xc6\xb4\xc0"
+ "\x6f\xae\x2d\xb8\x87\x69\x61\xa8\xb7\x36\xa9\x1b\x69\x36\xeb\xfd"
+ "\x2b\x42\xe8\x73\x8b\xbf\x49\xd4\x90\xdb\xcf\x29\x42\x39\xdb\x85"
+ "\x79\x6f\xcd\xfe\xa1\xde\x5c\xbe\xdb\xef\x62\x7f\xcd\xe5\xba\x55"
+ "\xcc\xd8\x89\x39\x6e\x31\xd7\xad\x25\xcf\x2d\xab\x67\xc6\x96\x4b"
+ "\x60\xaf\x68\xe5\x5e\x1d\x97\x47\x57\x11\x7a\x9a\xeb\x5f\x36\x6d"
+ "\xa4\x81\xab\x3b\xcd\xdd\x5b\xb2\x70\x8f\x6d\xad\xe6\x1c\x69\xe1"
+ "\xcf\x21\x7f\x9e\xe7\x3c\x5b\x9e\x78\x9d\x7e\xcc\x5e\x1d\x7d\x6d"
+ "\x75\xa7\x29\x3f\xb9\xd1\xac\x4c\xae\xa3\xf9\x1a\x5d\x43\xbc\x8e"
+ "\x70\x7d\x55\xcc\x38\x41\x47\x2c\x6c\x30\xe7\x27\x1f\x84\xf2\xc6"
+ "\x06\x43\x37\x57\xde\xa2\x98\xa1\x42\xbf\xf9\x92\x32\xad\x99\xe6"
+ "\xa7\xe9\xb4\xb7\x74\x93\x56\xc5\x0c\xce\xaf\xc2\x72\xba\x43\xa3"
+ "\x43\x19\x9b\x77\x68\x1a\x3d\x02\x88\xe2\x92\x6f\x5a\x73\x47\xc1"
+ "\x8c\x10\xcb\x7e\x76\x96\xba\x90\xaf\x8e\xe7\xe5\x74\xce\x5e\x45"
+ "\x68\x2d\x97\xb3\xb7\x60\x46\xbe\x4e\xf6\x18\xb7\x3f\x9f\xce\x22"
+ "\x4b\xe7\x79\xa4\x20\x0f\xfb\xfb\x9a\x10\x1f\x5a\x14\x1a\x04\xfc"
+ "\xf5\xe0\x7b\x67\x31\x6c\xcc\x30\xea\x64\x53\x73\xd8\xf7\x47\xbc"
+ "\x74\xb2\x07\x0d\xfc\x77\x3f\x9d\x4c\xbf\x85\xff\xae\xb2\xe4\x4d"
+ "\xb6\x9f\xc7\x79\xba\x11\xb0\xe0\x67\xde\xa5\xf6\xc2\x75\x03\xd7"
+ "\x1e\xff\xe9\x46\xd5\x6d\x44\x76\x56\xf1\x48\x15\xd4\xe9\xc7\xf4"
+ "\xf4\x48\x06\xfc\xf5\xe1\xff\xea\xf9\xbf\x14\x69\x38\xbc\xfb\x15"
+ "\x77\x82\x2e\x9a\x98\x7e\x1e\xe1\xf6\x81\xe6\x70\x05\xd8\xa3\xbe"
+ "\x9a\x26\x8e\x6f\x51\x85\xd5\xde\x37\xc1\x93\xee\xb9\x77\xf2\x7d"
+ "\xf7\xff\x72\xca\x03\xcb\x57\x3c\x15\xb3\x72\xd5\xd3\xb1\x71\xcf"
+ "\xac\x8e\x5f\x93\xb0\x36\xf1\xd9\xa4\xe4\x94\x75\xeb\x37\xa4\x6e"
+ "\x4c\x03\x3e\xbd\xfb\x7f\xd3\x5d\xa1\x32\x83\x9c\x80\xae\x1f\x86"
+ "\x3a\x1e\xe5\xf6\x79\xc2\x32\x86\xb9\x47\x0c\x0a\x95\xfd\xf5\x48"
+ "\x43\x00\xac\x01\xc1\xff\x6e\x57\x3c\x3a\x07\xf7\x6d\x04\xfc\xcb"
+ "\x1a\x4a\x1f\xd5\xe2\x9e\xd5\xad\x8a\x47\x43\xeb\xf5\x8f\x6a\x71"
+ "\x8f\xf5\xa3\x01\x6d\x24\xf0\x0e\x22\x3b\xa7\x78\x34\x18\xcf\x57"
+ "\xdc\x49\xc8\x31\xb8\xd6\x1e\xcf\x3b\x94\x24\xe0\xe5\x51\x54\x5f"
+ "\x38\x8a\xb6\x23\xff\xc2\x62\xda\xa6\xdf\x14\x4b\x72\xe1\x37\x8c"
+ "\x09\xe5\x59\x45\x98\xe7\x51\x58\x75\x98\xb3\xc9\xe8\xf2\x62\xda"
+ "\xba\x65\x14\x6d\x7d\xae\x98\xb6\x57\x8c\xa2\xba\xc0\x42\xe2\xdd"
+ "\x51\xf0\x28\x8c\xf7\x47\x95\xdc\xb8\x86\xf3\xe6\x91\x8f\x54\xe7"
+ "\xc1\xb9\x89\x46\xe2\x51\x01\xbf\xa1\xcc\x70\x54\xc5\xda\x7d\xe0"
+ "\x62\xa7\x27\xf4\xb7\x94\xf6\xc4\xcb\x72\xa1\x1e\xa6\x8f\xb0\x71"
+ "\xc7\xc0\x83\x81\xfa\xf4\x0d\x9d\x2d\x44\xa7\x08\xc3\x7d\x43\xb0"
+ "\x3e\x9f\x86\x92\x76\x82\xfc\xde\x4c\xea\xf4\x4c\xbe\x85\x1a\x81"
+ "\xd6\xcb\xbc\x29\x5e\x06\xf5\xb5\x02\x6f\x83\xb8\x3f\x41\xab\xd6"
+ "\xa4\xa8\x12\xd6\xc5\xc7\x8f\x1b\x46\x82\xb8\xbf\x44\xbc\xdf\x7a"
+ "\x0a\xe6\x6b\x7f\xb9\x98\x1e\x83\x7e\x6a\xa1\xbf\xb5\x27\x61\xe5"
+ "\x03\xd8\x20\xd0\xa7\x7c\xe0\x9b\x01\xe5\x87\xe1\xfb\x61\x68\x7b"
+ "\x2d\xb7\x7f\xb3\x62\xe1\x1b\xb4\x20\x6c\x32\xb4\x13\xe7\x4a\x15"
+ "\xe6\x77\xbf\xb4\x21\x52\x06\xfd\x2e\x04\xba\x5a\xd5\x2d\x64\xec"
+ "\x59\xc5\x63\x9e\xd0\x8e\x2a\xf8\x8e\xf4\x6f\xa1\x1e\x81\xfe\x18"
+ "\xeb\xd7\xc2\x9d\xf8\x1b\x64\xa5\x2d\x1b\x45\x73\x3a\x0a\xc2\x74"
+ "\xb8\x6f\x05\xb7\xf7\x26\xfc\x06\xb9\xd4\x02\x6d\xfe\xa5\xcc\x48"
+ "\x19\xac\x9f\x65\x15\xbd\x3c\xc3\xaa\xb1\x4d\xd8\x0e\x5c\x93\x7f"
+ "\x04\x9e\xac\xb9\x47\x4d\xee\xee\x24\xb2\x8f\x5a\x09\x29\x2d\xa6"
+ "\x95\x70\x94\xc2\x51\xf2\x21\x9c\x3b\x01\x47\x2d\x94\xd7\xc1\xdf"
+ "\x0f\xe1\xef\x09\x38\x60\x4d\x1f\x80\xed\x4e\x4e\xa7\x6d\x13\x4b"
+ "\xc8\xcf\x90\x3f\x60\x6b\x41\x8b\x62\x21\xf6\xb7\x16\xf7\xa5\xa1"
+ "\x23\x1f\x4b\xb1\xda\x4b\x43\xf1\x78\x1b\x81\xf3\xf0\xd7\xc8\xfe"
+ "\x8a\x8f\x27\x42\xe1\x88\xe1\xbf\xef\x03\x9a\x53\xfc\x77\x2d\x1c"
+ "\x75\x03\x1f\xb6\xfc\x1c\x1d\x33\xa7\x38\x4f\xeb\xd4\x91\xe2\x1c"
+ "\xdd\x2c\x3d\x51\x44\x84\xc1\x91\x65\x5d\x1e\xa1\x66\x65\xf3\x02"
+ "\xd9\xef\x79\xc1\xfc\xdf\x28\x38\x40\x4e\xf3\x81\xff\xfc\x12\x56"
+ "\x36\xbf\x8a\x28\xd4\xed\x70\x74\xda\xd4\x8f\x3c\x73\x50\x9f\x3d"
+ "\x30\x07\xa1\x2e\x75\x8a\xc7\x42\x51\x47\x79\x0c\x5b\x32\x7c\x37"
+ "\x0f\xca\x42\x00\x5b\xa5\x02\x7e\x9e\xb8\xcf\x1a\x3f\x4f\xa8\x6c"
+ "\xf0\x93\x8f\xb6\x08\xc6\x4b\x4e\x05\xc3\xcb\xe1\x4b\x9b\x62\xe0"
+ "\xf7\x13\x81\xc0\xe7\x30\xc6\x8a\x80\x07\xe7\xaf\xe6\x9d\x83\x35"
+ "\x78\x2c\x51\xa0\x7d\x69\x57\x3c\xb1\x0e\x31\x8b\x75\xf3\xf5\xb2"
+ "\xb6\x40\xfb\xa0\xac\x12\xdb\xb7\x16\xf8\xc2\xef\x2a\xa0\xab\x6c"
+ "\x20\x17\x2d\x6d\xe3\xae\x79\xf1\x19\xc0\x23\xdf\x5e\xe4\x89\xd7"
+ "\x51\xa1\x5f\x21\x78\x0d\xab\x7b\xe6\x38\x28\xc7\xb5\x3d\xbe\x77"
+ "\xe7\xd1\x60\xd4\x11\xc4\x24\xfe\x6d\x30\x06\xc3\x58\x0a\x23\x66"
+ "\xcc\x35\x1f\x40\x70\x6f\xb3\x1b\x5a\x14\x33\xbd\x27\xa4\x93\x60"
+ "\xe4\x87\xf6\x1b\xfa\xd1\x58\x81\x63\x91\xf1\x1a\x83\xfd\x40\xfe"
+ "\x1f\xc2\x6a\x0a\xff\x96\x63\x7b\xe0\xbc\xa8\xde\x42\x5c\xb3\xe7"
+ "\xa5\xb1\xbe\x42\x5d\x55\x70\x7d\x35\xf6\x1d\xe5\x09\xe7\x6b\x80"
+ "\x4f\x2c\x9e\xc3\xbd\x29\xf9\xfe\x54\xe1\xfb\x8e\x28\x0f\xa4\x6f"
+ "\x80\xd5\x0b\xb7\x8f\x86\x22\x8c\xcb\xd5\x0f\xfc\xab\x51\x1f\x14"
+ "\xea\x40\x1e\x99\x46\x6a\xa4\x60\x8f\x7e\x97\xd6\x09\xbe\xcf\xac"
+ "\x2f\xad\xf5\x33\x53\x2b\xd6\x0f\x5c\x87\x76\xf0\x18\xfa\x03\x68"
+ "\x4f\xa0\x4e\x1f\xf4\x75\xa0\x2c\xdf\x5c\x00\x3c\xd6\x77\x72\xf1"
+ "\x2d\xe0\xf3\x31\xb4\x25\x1f\xf9\x40\x7b\x8e\x31\x5e\xb3\xbc\x31"
+ "\xe7\xbe\x58\xd7\x3c\xbf\x2a\xd4\x39\x37\x9e\xd3\xb8\x3e\x81\xed"
+ "\x9a\xb5\xbb\x9c\x9d\xab\x01\x9a\x1a\xda\x13\x46\xe8\x26\x35\xdb"
+ "\xab\x9a\x9d\x3b\x98\xd9\xc5\xe9\xf7\x18\xb3\x6b\xb3\xde\x4f\xce"
+ "\xa0\x6d\x42\xbb\x67\xa5\x5a\xf6\xa4\xe2\xdb\x7d\x10\xeb\xa3\x1b"
+ "\xa2\xb8\x39\x14\xeb\xc0\xeb\x79\x7e\x91\xc8\xcf\x22\xab\x09\xd0"
+ "\x0e\x26\xaf\x99\x5b\xa1\xbc\x0a\xb1\xc8\xc9\x0d\xec\xe8\xa5\x4c"
+ "\xc4\xe2\xac\x74\xb8\xfe\x70\x2e\xfe\xde\xc0\xfd\x56\x72\x36\xb6"
+ "\xf7\xfc\xcc\x63\x78\x1e\x63\x22\x79\xab\x01\x4b\x66\x42\x7e\xe6"
+ "\x47\x82\x0d\xd9\x5c\xdf\xf6\x19\x36\x85\xca\x8e\x1a\x09\xc1\x76"
+ "\x82\x8c\x6a\x3a\x0a\x66\x07\x82\xed\x8f\xc1\xb6\x82\xbd\x3e\x48"
+ "\x7f\xa7\x26\xd8\x66\xb0\x67\x7c\xfb\x66\x17\xf1\xba\x3f\x88\x7d"
+ "\x44\x79\x4e\x60\xb6\x0f\xce\x45\x3c\x80\x6d\x17\xfa\x3d\x3b\x51"
+ "\x2c\x63\xae\xdf\xa0\x07\xd4\x17\xea\x45\xc4\x13\xb1\x9f\x0f\xbc"
+ "\xf6\xb1\xdf\x0c\x1b\x28\xeb\xfc\x51\xb4\x0e\xe9\x05\xda\xf0\x37"
+ "\xf0\x9c\x06\xea\x9e\x98\xc8\xed\x8f\x2d\xc3\x7d\xc5\x80\xef\x3e"
+ "\x6d\x9a\x91\x00\x8f\x1a\x94\x29\xd0\x99\x10\x8f\xf0\xbb\x8e\xaf"
+ "\xc3\x08\xf3\xf9\x78\x38\xa6\x0a\xe3\x3f\xfc\xbc\x35\xbe\xc2\x6d"
+ "\xc7\x3f\xea\x3b\xdf\x9c\x19\x46\x38\x3c\x24\x11\xd5\x05\x45\xf8"
+ "\x36\x7e\xee\xe0\x75\x1d\x7e\xe6\x28\x8c\x17\x11\x8f\x18\x1b\x5d"
+ "\xd7\x70\x78\xdc\x30\x53\x86\x7d\x86\x6b\x6b\x78\x3e\x5c\x9f\x39"
+ "\x3c\x65\x73\x18\xa8\xa3\x1b\xa0\x9f\xbd\x38\x98\xad\xe5\xf5\x5c"
+ "\x67\x23\x13\x8b\xed\xf2\xc6\x3d\x8e\xd1\x26\x81\xdf\xfd\xeb\x8e"
+ "\x1e\xc1\x2e\xa1\xee\xcd\x9c\xee\xc3\x63\x2b\xd8\x7c\xcb\xdb\xad"
+ "\x70\x76\x7e\x94\x15\x86\xb1\x2d\x65\x1c\x7e\xb1\x2d\x99\x51\xd8"
+ "\x96\x1a\xae\x1d\x99\x2a\x72\x41\x11\xe1\x87\xf5\xc3\xb5\x95\xfc"
+ "\x78\xe5\x79\xcd\x4e\x41\x5e\xcf\x81\xad\xc2\x36\x41\xdd\xcc\xfe"
+ "\x3d\xc2\xe1\x60\x1d\xdf\xf6\xda\xce\x6c\xbc\xf6\x89\xd8\x2e\x39"
+ "\x77\x6d\xad\x4e\xf1\x78\x73\x27\xdb\x23\x6e\x18\x5c\xbf\x87\x7b"
+ "\x6e\x53\x11\x79\x0a\x6d\x34\xbe\x8f\x0c\xdf\x8f\xa8\xe6\x03\x56"
+ "\xcf\x11\x05\xf0\xf3\x42\x8c\x5a\x70\xd1\xae\x88\xdc\x8f\xfb\xc7"
+ "\x80\xac\xf7\x81\x8f\xb4\x07\xe5\x8d\x58\x06\x1f\x69\x72\x47\x41"
+ "\x44\xb3\x05\xb7\x50\x4f\x29\xca\x9e\xe9\x67\xce\x18\xc0\x71\x8d"
+ "\x80\xad\x39\x63\x78\x39\xee\x01\x39\x7a\x41\x7d\xbb\xf9\x7e\xed"
+ "\x01\x7a\xf0\xc5\x22\x77\xf0\x6d\x2f\xe1\xe9\xa7\x59\xf4\xc0\x8f"
+ "\xd5\xba\x5c\xb4\xbf\x9c\x0e\xe6\x9c\xe2\xaf\xad\xe2\xeb\x3a\x6d"
+ "\xa1\x45\x1f\x91\xdb\xef\x19\xca\xd0\x0e\x4e\x04\xdd\x73\xb6\x2f"
+ "\xad\x9b\xa3\xe3\x6d\xe3\x31\x56\x47\x64\x06\x87\x43\xf0\x7b\x04"
+ "\x1c\xcd\xd9\x67\x63\x9f\xd0\x16\xe7\xd7\x6f\x61\xfb\xe9\x21\x96"
+ "\xd0\xa6\xe2\x3a\x09\xf8\x6d\xe1\xc7\x0f\xdf\xe6\xb9\x37\x5b\x63"
+ "\x25\x32\x0e\xb0\x72\xb7\xc0\x7b\xae\x97\xbd\x79\xae\x82\xd9\xc0"
+ "\x52\x76\xcd\xdc\x85\x7c\xdf\xf6\xb1\xbe\xf1\xbf\x51\x6e\x1a\x4e"
+ "\x6e\xb7\x8a\xe4\x08\x72\x7b\x72\x1b\x4f\x5f\x83\xb6\x5c\x18\xaf"
+ "\x73\x8f\x5b\xc6\x72\x5f\x7b\xf1\xe4\x46\x1c\x0f\xa2\x76\x55\xda"
+ "\xd8\x8b\x1a\xfb\xf6\x62\x6e\x22\xdf\xdf\x4a\x9b\xb1\x51\xc5\xfb"
+ "\xbb\xdb\x2d\x7a\xa8\x37\xf0\xfb\x1a\x42\x19\xda\x4f\xac\x5b\x3c"
+ "\x07\x95\x33\xb9\xf2\x63\xf9\xc9\x95\x7d\xf5\xf0\xe4\x64\xf1\x78"
+ "\x46\x5d\xa3\x4d\x40\x1e\xa8\x53\xce\xaf\x84\x32\xa6\xd7\x27\xbd"
+ "\xd1\x36\x88\x6d\x34\xd0\x16\x9a\x29\x8e\x97\x27\xa7\x58\x8f\xc5"
+ "\xb9\x55\xfc\x58\xe4\xeb\x8e\xbc\x01\x74\x14\x2c\xaa\x77\x9f\x4d"
+ "\xbd\xa8\x9b\x63\xdc\xfe\x33\x5c\x1f\x9f\xbc\x6c\x99\xd3\x90\x1e"
+ "\xae\x4d\x85\x6b\x74\x36\xf3\x63\x3e\xb6\x0f\xea\x52\x73\x36\xab"
+ "\x98\xb3\x15\xa9\x1d\xac\x3d\xad\x15\xfc\x3c\x01\x65\xc1\x7c\x59"
+ "\x35\x3f\x97\x58\x70\x33\xcf\xba\x4d\x91\x21\xf6\xfd\xa3\xb9\x6a"
+ "\x8b\x7f\xc4\xf1\xe2\x6c\x51\x64\x28\xdf\x3f\x2c\xbb\x9b\x95\xcd"
+ "\xf5\xc6\xb2\x5c\x26\x87\x42\xca\xcd\x57\x73\xaa\xf9\xf9\x0a\xc7"
+ "\x97\x1c\x7e\xab\x70\x8c\xe1\x6f\xe0\x51\x82\xfc\x1b\xb2\xba\xd1"
+ "\xa7\x2e\xd1\x29\x22\x0e\xa3\x3d\x40\x7b\x81\xcf\x1b\x73\x7f\x67"
+ "\x73\x7f\xbf\x42\xbb\x83\x7e\x08\x9e\x07\xba\x7d\x68\x8b\xa0\xbc"
+ "\x0b\x73\x0d\xd2\x6f\xbd\x80\x6f\x64\x33\xbb\x76\xde\x70\xce\x57"
+ "\xf8\x36\xcc\xc3\x52\x66\xb9\x0e\xec\xd6\x11\xbc\x0e\xaf\xb7\xd8"
+ "\x2f\xb4\x5d\x46\xb4\x4d\x5c\x7d\xf3\xe6\xf0\x18\xe7\xd6\x0d\x16"
+ "\xbf\xa8\x47\x2e\xa2\xc5\xfd\xd9\x38\x9b\x36\xaf\x94\xd9\xb3\x79"
+ "\xdb\xf1\x5a\x4e\x7f\x60\x2b\x35\x5d\xf4\xcb\x8a\x24\xa2\x28\xbf"
+ "\x88\x76\x31\x2c\x87\xb5\x73\x5e\x1b\xeb\xc7\xbc\xb7\xb8\x7e\x30"
+ "\x9b\x9a\xcf\xda\x12\x96\x53\xde\xcd\x9d\x3b\x89\x7d\xc1\x73\x79"
+ "\xa2\x73\xb8\xdf\x22\x9c\xe3\xf6\xd6\xb3\xbd\xce\xdc\x13\xdb\x87"
+ "\xbe\xa2\x9b\x5b\xf7\x79\x95\x17\x5b\x6c\xef\xfc\x58\xd6\xce\xf9"
+ "\x63\x2d\x76\x17\xe4\x72\x10\x6d\x2f\x77\x6e\x15\x4f\x33\x9b\xff"
+ "\xcb\xd9\xf7\xf9\xf3\x98\x5c\x03\xe4\xbc\xbc\x0f\xb3\x7e\xcc\x8f"
+ "\xe3\xd6\xd9\xdf\xaa\x41\xb6\xf3\x67\x5a\x64\x2b\xfe\x8e\xe3\x07"
+ "\xea\x57\xe2\x6f\x0e\xf7\xe9\xdc\x1a\xb6\x14\x69\xb0\x4d\x6c\x8e"
+ "\x98\x17\x6a\xeb\x53\x9f\x55\xa8\xbf\xc4\x79\x89\xf9\xaa\xea\xf7"
+ "\xf9\xd8\x14\xd1\x26\xbd\x0a\xf3\xc2\x02\x6f\x8b\x8d\xa1\x1d\x61"
+ "\x04\xf7\x6d\x3a\xab\x58\x30\x1c\xcb\x70\xcf\x2d\x31\x0d\xda\xa7"
+ "\x03\xdd\x3a\x9e\xe7\xfc\x36\x8b\xdd\x40\x5b\x52\x6f\x68\xe1\x7d"
+ "\xba\x05\x25\xe5\xbc\x2d\xb9\xa0\x58\xb0\xd3\xda\x0f\x5b\xb0\xd3"
+ "\xda\x66\xa8\xf7\xdb\xda\x0c\xf0\x9b\xb7\x74\x14\x2c\x88\xb7\xf2"
+ "\x03\xa0\xac\x7f\xdb\xb1\x20\x04\xc7\x28\xee\xf7\xca\xd9\x27\x2e"
+ "\xde\xa6\x96\x59\xda\x8c\x76\xf3\xd2\x26\x4b\xfc\x42\x5d\x86\xbe"
+ "\x9a\x4d\x7d\xcd\x56\xb6\x13\xeb\xb3\xf0\x53\x10\xdc\x33\x14\xe4"
+ "\x80\xf1\x96\x05\xfb\x78\x3b\x5f\x69\x65\x2b\xf9\x39\x0c\xed\xa4"
+ "\xf5\x5c\x15\xb6\xdd\x7a\xae\x52\x6f\xeb\x6b\x23\xd5\x6a\xe7\xe7"
+ "\x2a\x75\x30\xda\x2d\x8b\x8d\xb4\xb6\x05\xea\xa8\x72\x2b\x5f\x76"
+ "\x41\xab\xc5\x97\x15\xec\xe8\x82\x14\xb4\x51\x50\x7f\x0d\x5f\xf7"
+ "\x29\x9d\xe2\x91\x26\x4b\xdd\x70\xde\xbb\x5e\x05\xd8\x2c\x08\x0b"
+ "\x01\x4c\xd5\xf0\x3e\x20\x37\x36\xbb\x71\x7f\x3f\xc5\x7c\xc4\xff"
+ "\x30\xc4\x99\x36\xe1\x22\x69\x15\xe6\x8a\x63\x97\xd6\x5a\xe4\xbb"
+ "\x70\xa5\xd8\x2f\x2c\x2b\xa6\x5b\x3b\x0a\x16\x4e\x15\xf7\x71\x3b"
+ "\x94\xe5\xf1\x31\x04\x4e\xb6\x1c\xaf\x85\x88\x6b\xab\xbe\xb1\x7e"
+ "\x2c\x0c\xc5\x7e\xe0\x9a\x08\xea\x57\xa0\xdf\x83\x7b\x3e\xc3\xb8"
+ "\xd9\x5a\xd1\x8b\xf9\xc7\x9b\xbb\xb2\xc5\xfe\x55\x58\x2b\xda\x4a"
+ "\x7e\xed\x59\x0b\xfe\x4e\xbe\x38\x16\x33\x6b\x7a\x84\x2a\x31\x29"
+ "\x2e\x21\x65\xd5\x3d\xaa\xb8\x84\xb8\x94\xb8\xe5\xf1\x71\x69\xcb"
+ "\x53\xe2\xd6\x26\x8c\x5f\xb3\xfc\xe9\xb8\xa7\x54\x1b\x96\x27\xab"
+ "\x82\x53\xc7\xa6\x0e\x23\x02\xe9\xaf\x54\xcb\x93\x93\xd7\xad\x59"
+ "\x19\xa3\x4a\x88\x7b\xea\xee\xa4\x95\xc9\x2b\x53\x54\xcb\x93\xd6"
+ "\xae\x4b\x88\x51\x8d\x8d\x99\x30\x36\xf8\xfe\x98\x61\xe2\x18\xda"
+ "\x1d\x4a\xd2\x6e\xbe\xd2\xd6\x96\x77\x85\x78\xf9\xc8\x12\x93\x7c"
+ "\x52\xe3\x12\x58\xcc\x6e\xd1\xfe\x89\x85\x24\x11\xce\x7b\x57\x14"
+ "\xa0\xac\x17\x6a\xe1\xaf\x02\xe9\xa0\x9f\x2a\xf8\xee\x05\x6d\x1f"
+ "\xdd\x51\xb0\x28\x51\xa7\x58\xaa\x46\x99\x81\x2c\x54\xd0\xb7\xd1"
+ "\xf4\x4a\x6d\x1b\xf8\x6c\x89\xf8\x9c\x41\xc5\x15\xe2\x97\xbf\x9e"
+ "\x28\xe0\xf0\x86\x43\x29\x57\x62\xac\x6b\x11\xac\x71\x16\x6b\x59"
+ "\x4c\x74\x71\xa8\xde\x37\x7d\x3c\xcd\x4f\x1f\xcf\xf4\xb2\xf8\x21"
+ "\x4b\x2c\x3c\xfc\x79\x12\x8e\xf8\x6c\x51\x2c\x0e\xe1\x74\x05\x58"
+ "\xc6\x58\xf0\xa5\x77\x1f\x0e\x01\x7f\xb0\x19\xe3\xb9\x70\xee\x21"
+ "\x83\x9c\x78\x43\xbb\x14\x47\xd3\x83\xc9\xcb\x50\x57\x72\x00\xa5"
+ "\x1d\x05\x8b\xbd\x2c\xf1\x34\xe8\x83\x12\xfa\xd2\xc4\xf7\xe3\x5b"
+ "\xae\x1f\xc5\x34\xb0\x70\x24\xb4\xaf\x00\xdb\xb3\x78\xb2\xa5\x0f"
+ "\xd0\xee\x26\x9d\x62\x51\x09\xb4\x53\x89\xed\xb2\x17\xeb\xc3\x78"
+ "\x17\xb4\x33\xc3\xbc\x1e\xe4\x76\x1b\xdb\x33\x36\xaf\x9c\x8d\x3f"
+ "\xe8\xcf\xc1\x0a\xf8\x9e\x7b\x91\x78\x6f\x4f\x22\x7e\x34\xfb\x76"
+ "\x7a\xd2\x60\x24\x0d\xb1\x4d\xc4\x67\x23\xd5\xd3\x3f\xb5\xb5\xf1"
+ "\x7d\xda\x83\xb6\xe1\x8f\xcf\x34\x29\xb0\x4f\x30\x57\x78\x57\x5c"
+ "\x74\x18\x5b\x54\xbc\x3c\x8a\x1a\xe8\x2e\xb1\xcf\x15\xe5\x8b\x32"
+ "\x41\x7f\xeb\x12\xcc\x53\xd0\x87\x4e\xa8\x3b\x82\xf7\x8d\x0d\xb4"
+ "\x27\x4a\xe4\x4b\x2d\x46\x9c\x19\x1c\xf0\xf6\xb2\xf0\xa6\x72\x6e"
+ "\xaf\xe5\x00\xa6\xff\xa8\x0c\xb8\x46\x2f\xf0\x8f\x52\xdb\xf2\x47"
+ "\x9e\xf0\x5d\x6f\xa9\x87\xad\xc3\xa3\xd0\x27\xd0\x03\x96\xf5\x0e"
+ "\xea\x0b\x2c\x28\xa6\xa7\x1a\xa0\x3c\xaf\x8b\xe0\x38\x39\x55\x51"
+ "\xcc\xf1\xaf\x01\xb9\x8f\x46\xfe\xcf\x8d\x22\x64\x0b\xd0\x5c\x2a"
+ "\x58\x1c\x81\xf1\x5d\x38\x07\xe3\x3f\x2c\xcc\x36\x66\xcd\xe3\xf9"
+ "\x57\x36\x78\x0e\x29\x40\x9f\xb0\x10\xf8\x03\x86\xf2\x2e\xc3\x3c"
+ "\x0c\xbf\x27\x14\x92\x20\xac\x07\xbe\x73\xf1\x90\x8e\x82\x25\x41"
+ "\x96\xfa\x28\xe0\x3f\xd7\xcc\x62\x30\x3c\xb6\xc6\x37\xa4\xb6\x61"
+ "\xce\x30\x7a\x14\xec\x3b\xb6\x11\x31\x06\xd7\x44\x59\x30\x05\x58"
+ "\x3f\xc5\xe1\xca\x8f\x04\xd1\x82\x28\x5d\xc5\x48\xa0\x03\x5c\x95"
+ "\x03\x9e\x10\x57\x40\xbb\xd5\x82\x29\xc0\x5a\x23\xd2\x41\x1b\x86"
+ "\x55\xa7\x85\x28\xd0\x46\xb6\x2a\x96\xe0\x2d\x2d\x25\xfd\xed\x13"
+ "\x4d\xf4\x27\x8b\x9b\x98\x9e\x96\x98\x1a\x3a\x99\x0e\x04\xb9\x2f"
+ "\x69\x14\xc9\xbd\x11\x70\x3c\x0c\xe5\xcc\x62\xd5\x4b\x4c\xd0\xb6"
+ "\x46\xce\x17\xcf\x00\x1d\x70\x73\xd5\x92\xc3\x78\x3d\x2f\xc3\x3a"
+ "\x41\x86\x4b\x03\xec\xc9\xd0\x46\x76\x0a\x3c\x68\xc1\xd2\x40\x1c"
+ "\x2b\x70\xcd\x4c\x9d\x22\xaa\xdd\xd1\xbd\x02\xa8\x43\xa1\x28\x24"
+ "\x5e\x58\xc7\x31\x3f\x8e\x3e\xdd\x52\x47\x1e\xc8\x5a\x9f\x19\xdb"
+ "\x2f\x9e\x8f\xc1\x6a\x13\x63\xe2\x78\x7d\xa0\x1f\xca\x77\xe9\x61"
+ "\xe1\x7a\x6a\xb0\xbd\x7e\xec\x53\x56\x6d\xe5\x0e\x68\x6b\xe3\xcb"
+ "\x23\x01\x47\xac\xbd\xc6\xfe\xda\x1b\xa8\x62\xf3\xa4\xf6\x0e\xc4"
+ "\xf7\xb2\xfb\x1a\x4a\x08\xc1\x32\xfe\x77\xe0\x25\x98\x7b\x6c\xe3"
+ "\xfb\x8e\xef\x37\x2c\x5b\x67\x7d\xbf\x61\x59\x8c\xa3\xfb\x0d\x36"
+ "\xf5\xbe\x85\xf5\x9a\x2b\x22\x65\xa2\xba\x4b\xcd\x76\xea\xb6\x5c"
+ "\x3f\xa1\x52\xbc\x9e\x89\xe6\xda\x50\x0f\xf3\x14\xfd\x69\xa4\x8c"
+ "\x02\x9f\x63\xdc\x1c\x1e\xcd\xfb\x2f\xe8\x17\x2d\xd3\x21\x8d\x6d"
+ "\x3f\x7a\x3f\x5e\x7e\xe8\x5b\x91\x2e\xee\x87\xe7\x23\x44\x89\x7f"
+ "\xef\xd7\x5b\x4e\xcb\xad\x88\x09\xb5\xf3\x03\xfc\xac\x5f\x72\xf4"
+ "\x14\x3e\xac\x88\xff\xcd\xb8\x28\x7a\xe9\x7b\xcf\xbb\xf1\xb9\x81"
+ "\xb5\x97\xe3\xd7\x49\x64\xec\xdb\x14\xa5\x88\x22\xb4\x9f\xab\x29"
+ "\xb1\x5c\x62\xef\xf3\x2c\x1c\x59\x91\x9e\xc0\x2f\x98\x23\xa6\xd4"
+ "\xc8\xf3\xb7\xfc\xa6\xe2\xdf\x58\x62\xfd\x1b\x3e\x1e\x51\xa2\x0a"
+ "\x6e\xf7\x88\xe1\x1e\x1b\xfb\xbf\x98\xde\x22\x79\xa5\xb8\xad\x20"
+ "\xee\x2c\x4f\xee\x8b\x0f\xfe\xd3\x09\xfc\x82\xe0\xfc\x94\x88\x5e"
+ "\x82\x9b\x0c\x9b\x45\xe4\x1f\xb1\xe6\x3f\x50\xd9\x4f\x1f\xa5\x7e"
+ "\x6e\x13\x7d\xbf\x9d\xfd\x79\x20\x7a\x10\xf9\xf7\xff\x51\x35\xde"
+ "\x60\xf9\x2a\xc0\xe3\x81\x56\x7b\xa4\x82\xfc\x7f\x65\xd1\x31\x15"
+ "\x23\x54\x38\x3f\x4d\x6b\xfd\xfb\xc1\x7c\xeb\xdf\x0f\xe9\x06\xa1"
+ "\xe5\x84\xab\x24\x53\x07\x73\x6f\xc8\xbe\xde\x42\x1f\x9b\x21\xe3"
+ "\x93\x6f\x33\x84\x84\x0f\xdf\x1a\x0f\x42\x1e\x9e\x2c\x2a\x56\xd8"
+ "\xa7\xbe\x3a\x9f\x5b\x36\xf3\x03\xe2\x76\xbd\xb2\xcf\xc9\x07\x6d"
+ "\xca\xf0\xf7\x75\x2a\xbe\x6c\xd2\xfb\x7d\xe8\xb9\x32\x95\xe8\xb7"
+ "\x2c\x04\xfe\xa9\x04\xfc\xeb\xfb\xd2\xfe\xf8\xf9\xf1\xe3\xc4\x47"
+ "\x86\xe3\xe3\xc7\xcf\x55\xfa\x50\x36\x8b\x83\x25\xe2\xfe\xe0\x7f"
+ "\xb4\xd7\x50\x52\xfe\x04\xe5\x0b\x28\xff\x65\x50\xe6\xf1\x1f\x3f"
+ "\x3f\x7e\x7e\xfc\xfc\xf8\xf9\xf1\xf3\xe3\xe7\xc7\xcf\x0f\xe0\x23"
+ "\x13\x2f\xac\xbd\xe0\xb8\x9e\xff\x2b\x5e\xff\xc8\xf8\x43\x5c\x26"
+ "\x77\xe7\x3a\xca\x7f\x48\x56\x88\x56\x55\x19\xad\x53\xe6\x47\x34"
+ "\x06\x57\x27\xea\xbd\xb6\x86\xd5\x06\xed\x89\x6d\x0b\x28\x51\x37"
+ "\x4d\xa9\x49\xed\x54\x6c\x09\x3d\x16\x58\x15\xd3\xea\x57\x18\x79"
+ "\x6a\xf2\xc1\x14\x83\x77\xce\xcc\xba\xf1\xfb\xe2\xdb\x47\x97\x46"
+ "\x35\x4f\x3d\x9c\x6e\x94\x67\x3f\xfc\xb7\x3b\x5e\x5d\xd1\x32\xb2"
+ "\x60\xee\x27\xf7\xbc\x9d\x74\x71\xd8\x8b\x8f\x7f\x78\xd7\xde\x67"
+ "\xce\xdd\xf2\xca\xa2\x7f\xfe\xea\x2f\x69\xdd\xd7\xbd\xf0\xc8\x07"
+ "\x77\xbe\xbe\xea\xec\xa8\xe2\xf9\x9f\xdd\xff\xa7\xf5\x57\x46\xe4"
+ "\xce\xae\x9f\xf0\x66\xc2\x85\xdb\xca\x97\xfe\xfb\xd7\xef\x6a\xcc"
+ "\xb2\xcd\x0f\xbd\x3f\x66\xf7\xf2\x2f\x7d\x77\xcc\xf9\x78\xd2\x5b"
+ "\xcf\x7e\x7f\xc3\xb6\xc7\x4e\x8c\x7b\x23\xee\x9b\x9b\x77\x2e\xfc"
+ "\xfc\x81\x77\x36\x76\x79\x3e\x3f\xe3\xf8\xd8\xd7\x56\x7e\xe5\x5f"
+ "\x34\xef\xf4\x7d\x87\xd6\x5d\x1e\xbe\x7d\xd6\xc9\xbb\xf7\xaf\x39"
+ "\x7f\x6b\xd9\x92\x33\xd3\x8e\x64\x98\x3c\x9e\x9b\x7e\xf4\x67\xbf"
+ "\x7b\xea\x3f\x37\xbd\xfc\xe4\xa7\xf7\xfe\x31\xf9\xd2\x8d\x2f\x3d"
+ "\xf1\xd1\x2f\xfe\xb0\xfa\xdb\x9f\xee\x5a\xfc\xaf\xff\xfb\xeb\xa6"
+ "\x9e\xeb\x7f\xf3\xe8\xdf\x7f\xfe\xfb\xa7\xbf\xfe\xc9\x6f\x17\xfc"
+ "\xe3\x97\x7f\xde\xd0\xe1\x93\x17\xde\x30\xf1\xc0\xda\xef\x6e\xaf"
+ "\x58\xf6\xc5\x83\xef\x65\x52\x77\xe4\x47\x14\xd5\x4f\x0e\xa5\xde"
+ "\x04\xe7\x11\x8b\xcb\xa3\x5d\xe6\x23\x97\xf1\xfa\x67\x05\x59\xf7"
+ "\x11\x99\x17\xb9\x4e\xe1\xc2\x8a\xc1\xd5\x7e\x3b\xf8\xa8\xc4\xd7"
+ "\x3b\xf3\xc1\xf8\xd1\x24\x38\xee\x85\xe3\xa7\x5c\x89\x10\x05\xb8"
+ "\xc3\x49\x1e\x57\xff\x23\x83\xbe\x7b\x40\xcb\x3c\xc9\x75\x20\x2d"
+ "\x2f\x72\x03\x19\x46\x6e\x24\xde\x64\x38\x19\x41\x7c\x88\x92\xf8"
+ "\x92\x91\xe4\x26\xe2\x47\xfc\xc9\x28\xf2\x13\x12\x40\x6e\x26\xb7"
+ "\x40\x6f\x46\x93\x5b\xc9\x6d\xe4\x76\x10\xca\x18\xfb\x7d\xc9\x22"
+ "\x21\x01\xf0\x0f\xfc\x1f\x41\x42\xb8\xdf\xd1\x3f\x96\x0f\x69\xb9"
+ "\x96\x2f\x6f\xe4\xcb\x75\x3f\x96\x0f\x69\xb9\xea\xbf\xfc\x77\xcc"
+ "\x7f\xf5\xaf\x0c\x5c\x07\xe6\x3d\x58\xf9\x10\xbd\x1f\xdb\x52\x19"
+ "\xff\xe9\xfd\x4d\x06\xb8\xbe\x0f\x3f\xeb\xeb\x6d\x3f\x21\x70\xf0"
+ "\x01\xd9\x4c\x42\xd8\xfd\x06\x2a\xfe\x18\x8b\x65\x7f\x53\xf8\x66"
+ "\xe1\xad\x13\x2f\xe2\xc7\xfd\x3b\xf0\x47\x9b\x02\x47\x16\x1c\x39"
+ "\x70\xe4\xc1\xb1\x0b\x8e\xd7\x2c\xbc\x89\xec\xf6\x50\x22\x53\xa5"
+ "\xc3\x5f\x1d\x91\x8d\x09\x80\x63\x1f\x91\x05\x8e\x27\xb2\x3b\xda"
+ "\x89\x6c\x6c\xbc\xd0\xf8\x09\x5b\x7b\x5b\x29\x1b\xcf\x97\xab\xe0"
+ "\xfb\x24\x71\xac\x56\xea\x7c\xa6\x9d\x11\x19\xa6\x9a\x34\x61\xf2"
+ "\x84\xfb\xee\x5d\xae\xba\x3b\xe2\x6e\xd5\x3d\xc1\x93\x26\x4d\x0c"
+ "\xbe\x7f\xe2\xa4\x5f\xaa\xee\xb9\xe7\x57\x93\x82\x7f\x15\x1c\xac"
+ "\x5a\xb3\x31\x29\x6e\x52\xf0\xd3\x2b\x55\x09\x31\x71\xc9\xaa\x55"
+ "\x71\x49\x6b\x36\x2c\x4f\x5a\xe9\x44\xd7\xa5\x7c\xa0\x2b\xe4\x56"
+ "\x13\x6b\xa6\x58\x43\x32\xf2\x20\x51\xc4\x46\x10\x45\x7a\x30\xe9"
+ "\xa3\x52\x59\x3e\xdf\xa5\x20\xfe\xe8\xf3\x59\xb3\x68\xfe\x3f\xc7"
+ "\x2e\x1e\xf1\xb7\x87\x9e\x1e\x3b\x6d\xfa\xef\xf2\xaa\x89\x3c\xa1"
+ "\x95\xc8\x57\x6d\x25\xf2\xa8\x30\x22\x8f\x48\x24\xf2\xe9\xc0\x62"
+ "\x6f\x24\x91\xef\x6e\x26\xf2\xdf\x66\x11\xf9\x4b\x39\x44\xae\xb1"
+ "\x53\xf6\xce\x56\x56\x76\x7e\x3c\x91\xb7\xec\x23\xf2\xcf\x4a\x88"
+ "\xbc\xb6\x96\x2b\xf3\xf0\x00\xbe\x5d\x01\x83\x2c\x91\xc1\xf8\x48"
+ "\xc5\x83\xec\xff\x01\x9e\x94\x72\x6b"
;
diff --git a/sys/dev/pci/pci.c b/sys/dev/pci/pci.c
index b346dd3..7eb84e6 100644
--- a/sys/dev/pci/pci.c
+++ b/sys/dev/pci/pci.c
@@ -347,6 +347,21 @@ pci_find_device(uint16_t vendor, uint16_t device)
return (NULL);
}
+device_t
+pci_find_class(uint8_t class, uint8_t subclass)
+{
+ struct pci_devinfo *dinfo;
+
+ STAILQ_FOREACH(dinfo, &pci_devq, pci_links) {
+ if (dinfo->cfg.baseclass == class &&
+ dinfo->cfg.subclass == subclass) {
+ return (dinfo->cfg.dev);
+ }
+ }
+
+ return (NULL);
+}
+
static int
pci_printf(pcicfgregs *cfg, const char *fmt, ...)
{
@@ -1338,8 +1353,11 @@ pci_alloc_msix_method(device_t dev, device_t child, int *count)
for (i = 0; i < max; i++) {
/* Allocate a message. */
error = PCIB_ALLOC_MSIX(device_get_parent(dev), child, &irq);
- if (error)
+ if (error) {
+ if (i == 0)
+ return (error);
break;
+ }
resource_list_add(&dinfo->resources, SYS_RES_IRQ, i + 1, irq,
irq, 1);
}
diff --git a/sys/dev/pci/pci_pci.c b/sys/dev/pci/pci_pci.c
index 93bbf3a..fa14816 100644
--- a/sys/dev/pci/pci_pci.c
+++ b/sys/dev/pci/pci_pci.c
@@ -767,18 +767,6 @@ pcib_write_ivar(device_t dev, device_t child, int which, uintptr_t value)
}
#ifdef NEW_PCIB
-static const char *
-pcib_child_name(device_t child)
-{
- static char buf[64];
-
- if (device_get_nameunit(child) != NULL)
- return (device_get_nameunit(child));
- snprintf(buf, sizeof(buf), "pci%d:%d:%d:%d", pci_get_domain(child),
- pci_get_bus(child), pci_get_slot(child), pci_get_function(child));
- return (buf);
-}
-
/*
* Attempt to allocate a resource from the existing resources assigned
* to a window.
@@ -954,7 +942,7 @@ pcib_grow_window(struct pcib_softc *sc, struct pcib_window *w, int type,
if (bootverbose)
printf("\tback candidate range: %#lx-%#lx\n",
start_free, back);
- back = roundup2(back + 1, w->step) - 1;
+ back = roundup2(back + 1, 1ul << w->step) - 1;
back -= rman_get_end(w->res);
} else
back = 0;
diff --git a/sys/dev/pci/pci_subr.c b/sys/dev/pci/pci_subr.c
index 7f0c806..2d16896 100644
--- a/sys/dev/pci/pci_subr.c
+++ b/sys/dev/pci/pci_subr.c
@@ -33,9 +33,10 @@ __FBSDID("$FreeBSD$");
* provide PCI domains.
*/
-#include <sys/types.h>
+#include <sys/param.h>
#include <sys/bus.h>
#include <sys/rman.h>
+#include <sys/systm.h>
#include <dev/pci/pcireg.h>
#include <dev/pci/pcivar.h>
@@ -128,3 +129,157 @@ host_pcib_get_busno(pci_read_config_fn read_config, int bus, int slot, int func,
return 1;
}
+
+#ifdef NEW_PCIB
+/*
+ * Return a pointer to a pretty name for a PCI device. If the device
+ * has a driver attached, the device's name is used, otherwise a name
+ * is generated from the device's PCI address.
+ */
+const char *
+pcib_child_name(device_t child)
+{
+ static char buf[64];
+
+ if (device_get_nameunit(child) != NULL)
+ return (device_get_nameunit(child));
+ snprintf(buf, sizeof(buf), "pci%d:%d:%d:%d", pci_get_domain(child),
+ pci_get_bus(child), pci_get_slot(child), pci_get_function(child));
+ return (buf);
+}
+
+/*
+ * Some Host-PCI bridge drivers know which resource ranges they can
+ * decode and should only allocate subranges to child PCI devices.
+ * This API provides a way to manage this. The bridge drive should
+ * initialize this structure during attach and call
+ * pcib_host_res_decodes() on each resource range it decodes. It can
+ * then use pcib_host_res_alloc() and pcib_host_res_adjust() as helper
+ * routines for BUS_ALLOC_RESOURCE() and BUS_ADJUST_RESOURCE(). This
+ * API assumes that resources for any decoded ranges can be safely
+ * allocated from the parent via bus_generic_alloc_resource().
+ */
+int
+pcib_host_res_init(device_t pcib, struct pcib_host_resources *hr)
+{
+
+ hr->hr_pcib = pcib;
+ resource_list_init(&hr->hr_rl);
+ return (0);
+}
+
+int
+pcib_host_res_free(device_t pcib, struct pcib_host_resources *hr)
+{
+
+ resource_list_free(&hr->hr_rl);
+ return (0);
+}
+
+int
+pcib_host_res_decodes(struct pcib_host_resources *hr, int type, u_long start,
+ u_long end, u_int flags)
+{
+ struct resource_list_entry *rle;
+ int rid;
+
+ if (bootverbose)
+ device_printf(hr->hr_pcib, "decoding %d %srange %#lx-%#lx\n",
+ type, flags & RF_PREFETCHABLE ? "prefetchable ": "", start,
+ end);
+ rid = resource_list_add_next(&hr->hr_rl, type, start, end,
+ end - start + 1);
+ if (flags & RF_PREFETCHABLE) {
+ KASSERT(type == SYS_RES_MEMORY,
+ ("only memory is prefetchable"));
+ rle = resource_list_find(&hr->hr_rl, type, rid);
+ rle->flags = RLE_PREFETCH;
+ }
+ return (0);
+}
+
+struct resource *
+pcib_host_res_alloc(struct pcib_host_resources *hr, device_t dev, int type,
+ int *rid, u_long start, u_long end, u_long count, u_int flags)
+{
+ struct resource_list_entry *rle;
+ struct resource *r;
+ u_long new_start, new_end;
+
+ if (flags & RF_PREFETCHABLE)
+ KASSERT(type == SYS_RES_MEMORY,
+ ("only memory is prefetchable"));
+
+ rle = resource_list_find(&hr->hr_rl, type, 0);
+ if (rle == NULL) {
+ /*
+ * No decoding ranges for this resource type, just pass
+ * the request up to the parent.
+ */
+ return (bus_generic_alloc_resource(hr->hr_pcib, dev, type, rid,
+ start, end, count, flags));
+ }
+
+restart:
+ /* Try to allocate from each decoded range. */
+ for (; rle != NULL; rle = STAILQ_NEXT(rle, link)) {
+ if (rle->type != type)
+ continue;
+ if (((flags & RF_PREFETCHABLE) != 0) !=
+ ((rle->flags & RLE_PREFETCH) != 0))
+ continue;
+ new_start = ulmax(start, rle->start);
+ new_end = ulmin(end, rle->end);
+ if (new_start > new_end ||
+ new_start + count - 1 > new_end ||
+ new_start + count < new_start)
+ continue;
+ r = bus_generic_alloc_resource(hr->hr_pcib, dev, type, rid,
+ new_start, new_end, count, flags);
+ if (r != NULL) {
+ if (bootverbose)
+ device_printf(hr->hr_pcib,
+ "allocated type %d (%#lx-%#lx) for rid %x of %s\n",
+ type, rman_get_start(r), rman_get_end(r),
+ *rid, pcib_child_name(dev));
+ return (r);
+ }
+ }
+
+ /*
+ * If we failed to find a prefetch range for a memory
+ * resource, try again without prefetch.
+ */
+ if (flags & RF_PREFETCHABLE) {
+ flags &= ~RF_PREFETCHABLE;
+ rle = resource_list_find(&hr->hr_rl, type, 0);
+ goto restart;
+ }
+ return (NULL);
+}
+
+int
+pcib_host_res_adjust(struct pcib_host_resources *hr, device_t dev, int type,
+ struct resource *r, u_long start, u_long end)
+{
+ struct resource_list_entry *rle;
+
+ rle = resource_list_find(&hr->hr_rl, type, 0);
+ if (rle == NULL) {
+ /*
+ * No decoding ranges for this resource type, just pass
+ * the request up to the parent.
+ */
+ return (bus_generic_adjust_resource(hr->hr_pcib, dev, type, r,
+ start, end));
+ }
+
+ /* Only allow adjustments that stay within a decoded range. */
+ for (; rle != NULL; rle = STAILQ_NEXT(rle, link)) {
+ if (rle->start <= start && rle->end >= end)
+ return (bus_generic_adjust_resource(hr->hr_pcib, dev,
+ type, r, start, end));
+ }
+ return (ERANGE);
+}
+#endif /* NEW_PCIB */
diff --git a/sys/dev/pci/pcib_private.h b/sys/dev/pci/pcib_private.h
index 1574deb..0561581 100644
--- a/sys/dev/pci/pcib_private.h
+++ b/sys/dev/pci/pcib_private.h
@@ -33,6 +33,31 @@
#ifndef __PCIB_PRIVATE_H__
#define __PCIB_PRIVATE_H__
+#ifdef NEW_PCIB
+/*
+ * Data structure and routines that Host to PCI bridge drivers can use
+ * to restrict allocations for child devices to ranges decoded by the
+ * bridge.
+ */
+struct pcib_host_resources {
+ device_t hr_pcib;
+ struct resource_list hr_rl;
+};
+
+int pcib_host_res_init(device_t pcib,
+ struct pcib_host_resources *hr);
+int pcib_host_res_free(device_t pcib,
+ struct pcib_host_resources *hr);
+int pcib_host_res_decodes(struct pcib_host_resources *hr, int type,
+ u_long start, u_long end, u_int flags);
+struct resource *pcib_host_res_alloc(struct pcib_host_resources *hr,
+ device_t dev, int type, int *rid, u_long start, u_long end,
+ u_long count, u_int flags);
+int pcib_host_res_adjust(struct pcib_host_resources *hr,
+ device_t dev, int type, struct resource *r, u_long start,
+ u_long end);
+#endif
+
/*
* Export portions of generic PCI:PCI bridge support so that it can be
* used by subclasses.
@@ -90,6 +115,9 @@ struct pcib_softc
typedef uint32_t pci_read_config_fn(int b, int s, int f, int reg, int width);
+#ifdef NEW_PCIB
+const char *pcib_child_name(device_t child);
+#endif
int host_pcib_get_busno(pci_read_config_fn read_config, int bus,
int slot, int func, uint8_t *busnum);
int pcib_attach(device_t dev);
diff --git a/sys/dev/pci/pcivar.h b/sys/dev/pci/pcivar.h
index ae3fe79..8fd84a7 100644
--- a/sys/dev/pci/pcivar.h
+++ b/sys/dev/pci/pcivar.h
@@ -457,6 +457,7 @@ pci_msix_count(device_t dev)
device_t pci_find_bsf(uint8_t, uint8_t, uint8_t);
device_t pci_find_dbsf(uint32_t, uint8_t, uint8_t, uint8_t);
device_t pci_find_device(uint16_t, uint16_t);
+device_t pci_find_class(uint8_t class, uint8_t subclass);
/* Can be used by drivers to manage the MSI-X table. */
int pci_pending_msix(device_t dev, u_int index);
diff --git a/sys/dev/ppbus/if_plip.c b/sys/dev/ppbus/if_plip.c
index fc81aec..281baf2 100644
--- a/sys/dev/ppbus/if_plip.c
+++ b/sys/dev/ppbus/if_plip.c
@@ -585,6 +585,8 @@ lp_intr(void *arg)
if (bpf_peers_present(sc->sc_ifp->if_bpf))
lptap(sc->sc_ifp, top);
+ M_SETFIB(top, sc->sc_ifp->if_fib);
+
/* mbuf is free'd on failure. */
netisr_queue(NETISR_IP, top);
ppb_lock(ppbus);
@@ -637,6 +639,8 @@ lp_intr(void *arg)
if (bpf_peers_present(sc->sc_ifp->if_bpf))
lptap(sc->sc_ifp, top);
+ M_SETFIB(top, sc->sc_ifp->if_fib);
+
/* mbuf is free'd on failure. */
netisr_queue(NETISR_IP, top);
ppb_lock(ppbus);
diff --git a/sys/dev/rt/if_rt.c b/sys/dev/rt/if_rt.c
new file mode 100644
index 0000000..22105dc
--- /dev/null
+++ b/sys/dev/rt/if_rt.c
@@ -0,0 +1,2616 @@
+/*-
+ * Copyright (c) 2011, Aleksandr Rybalko
+ * based on hard work
+ * by Alexander Egorenkov <egorenar@gmail.com>
+ * and by Damien Bergamini <damien.bergamini@free.fr>
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice unmodified, this list of conditions, and the following
+ * disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+#include "if_rtvar.h"
+#include "if_rtreg.h"
+
+#include <net/if.h>
+#include <net/if_arp.h>
+#include <net/ethernet.h>
+#include <net/if_dl.h>
+#include <net/if_media.h>
+#include <net/if_types.h>
+#include <net/if_vlan_var.h>
+
+#include <net/bpf.h>
+
+#include <machine/bus.h>
+#include <machine/cache.h>
+#include <machine/cpufunc.h>
+#include <machine/resource.h>
+#include <vm/vm_param.h>
+#include <vm/vm.h>
+#include <vm/pmap.h>
+#include <machine/pmap.h>
+#include <sys/bus.h>
+#include <sys/rman.h>
+
+#include <dev/mii/mii.h>
+#include <dev/mii/miivar.h>
+
+#include <mips/rt305x/rt305x_sysctlvar.h>
+#include <mips/rt305x/rt305xreg.h>
+
+#ifdef IF_RT_PHY_SUPPORT
+#include "miibus_if.h"
+#endif
+
+/*
+ * Defines and macros
+ */
+#define RT_MAX_AGG_SIZE 3840
+
+#define RT_TX_DATA_SEG0_SIZE MJUMPAGESIZE
+
+#define RT_MS(_v, _f) (((_v) & _f) >> _f##_S)
+#define RT_SM(_v, _f) (((_v) << _f##_S) & _f)
+
+#define RT_TX_WATCHDOG_TIMEOUT 5
+
+/*
+ * Static function prototypes
+ */
+static int rt_probe(device_t dev);
+static int rt_attach(device_t dev);
+static int rt_detach(device_t dev);
+static int rt_shutdown(device_t dev);
+static int rt_suspend(device_t dev);
+static int rt_resume(device_t dev);
+static void rt_init_locked(void *priv);
+static void rt_init(void *priv);
+static void rt_stop_locked(void *priv);
+static void rt_stop(void *priv);
+static void rt_start(struct ifnet *ifp);
+static int rt_ioctl(struct ifnet *ifp, u_long cmd, caddr_t data);
+static void rt_periodic(void *arg);
+static void rt_tx_watchdog(void *arg);
+static void rt_intr(void *arg);
+static void rt_tx_coherent_intr(struct rt_softc *sc);
+static void rt_rx_coherent_intr(struct rt_softc *sc);
+static void rt_rx_delay_intr(struct rt_softc *sc);
+static void rt_tx_delay_intr(struct rt_softc *sc);
+static void rt_rx_intr(struct rt_softc *sc);
+static void rt_tx_intr(struct rt_softc *sc, int qid);
+static void rt_rx_done_task(void *context, int pending);
+static void rt_tx_done_task(void *context, int pending);
+static void rt_periodic_task(void *context, int pending);
+static int rt_rx_eof(struct rt_softc *sc, int limit);
+static void rt_tx_eof(struct rt_softc *sc,
+ struct rt_softc_tx_ring *ring);
+static void rt_update_stats(struct rt_softc *sc);
+static void rt_watchdog(struct rt_softc *sc);
+static void rt_update_raw_counters(struct rt_softc *sc);
+static void rt_intr_enable(struct rt_softc *sc, uint32_t intr_mask);
+static void rt_intr_disable(struct rt_softc *sc, uint32_t intr_mask);
+static int rt_txrx_enable(struct rt_softc *sc);
+static int rt_alloc_rx_ring(struct rt_softc *sc,
+ struct rt_softc_rx_ring *ring);
+static void rt_reset_rx_ring(struct rt_softc *sc,
+ struct rt_softc_rx_ring *ring);
+static void rt_free_rx_ring(struct rt_softc *sc,
+ struct rt_softc_rx_ring *ring);
+static int rt_alloc_tx_ring(struct rt_softc *sc,
+ struct rt_softc_tx_ring *ring, int qid);
+static void rt_reset_tx_ring(struct rt_softc *sc,
+ struct rt_softc_tx_ring *ring);
+static void rt_free_tx_ring(struct rt_softc *sc,
+ struct rt_softc_tx_ring *ring);
+static void rt_dma_map_addr(void *arg, bus_dma_segment_t *segs,
+ int nseg, int error);
+static void rt_sysctl_attach(struct rt_softc *sc);
+#ifdef IF_RT_PHY_SUPPORT
+void rt_miibus_statchg(device_t);
+static int rt_miibus_readreg(device_t, int, int);
+static int rt_miibus_writereg(device_t, int, int, int);
+#endif
+static int rt_ifmedia_upd(struct ifnet *);
+static void rt_ifmedia_sts(struct ifnet *, struct ifmediareq *);
+
+SYSCTL_NODE(_hw, OID_AUTO, rt, CTLFLAG_RD, 0, "RT driver parameters");
+#ifdef IF_RT_DEBUG
+static int rt_debug = 0;
+SYSCTL_INT(_hw_rt, OID_AUTO, debug, CTLFLAG_RW, &rt_debug, 0,
+ "RT debug level");
+TUNABLE_INT("hw.rt.debug", &rt_debug);
+#endif
+
+static int
+rt_probe(device_t dev)
+{
+ device_set_desc(dev, "Ralink RT305XF onChip Ethernet MAC");
+ return (0);
+}
+
+/*
+ * macaddr_atoi - translate string MAC address to uint8_t array
+ */
+static int
+macaddr_atoi(const char *str, uint8_t *mac)
+{
+ int count, i;
+ unsigned int amac[ETHER_ADDR_LEN]; /* Aligned version */
+
+ count = sscanf(str, "%x%*c%x%*c%x%*c%x%*c%x%*c%x",
+ &amac[0], &amac[1], &amac[2],
+ &amac[3], &amac[4], &amac[5]);
+ if (count < ETHER_ADDR_LEN) {
+ memset(mac, 0, ETHER_ADDR_LEN);
+ return (1);
+ }
+
+ /* Copy aligned to result */
+ for (i = 0; i < ETHER_ADDR_LEN; i ++)
+ mac[i] = (amac[i] & 0xff);
+
+ return (0);
+}
+
+#ifdef USE_GENERATED_MAC_ADDRESS
+static char *
+kernenv_next(char *cp)
+{
+
+ if (cp != NULL) {
+ while (*cp != 0)
+ cp++;
+ cp++;
+ if (*cp == 0)
+ cp = NULL;
+ }
+ return (cp);
+}
+
+/*
+ * generate_mac(uin8_t *mac)
+ * This is MAC address generator for cases when real device MAC address
+ * unknown or not yet accessible.
+ * Use 'b','s','d' signature and 3 octets from CRC32 on kenv.
+ * MAC = 'b', 's', 'd', CRC[3]^CRC[2], CRC[1], CRC[0]
+ *
+ * Output - MAC address, that do not change between reboots, if hints or
+ * bootloader info unchange.
+ */
+static void
+generate_mac(uint8_t *mac)
+{
+ unsigned char *cp;
+ int i = 0;
+ uint32_t crc = 0xffffffff;
+
+ /* Generate CRC32 on kenv */
+ if (dynamic_kenv) {
+ for (cp = kenvp[0]; cp != NULL; cp = kenvp[++i]) {
+ crc = calculate_crc32c(crc, cp, strlen(cp) + 1);
+ }
+ } else {
+ for (cp = kern_envp; cp != NULL; cp = kernenv_next(cp)) {
+ crc = calculate_crc32c(crc, cp, strlen(cp) + 1);
+ }
+ }
+ crc = ~crc;
+
+ mac[0] = 'b';
+ mac[1] = 's';
+ mac[2] = 'd';
+ mac[3] = (crc >> 24) ^ ((crc >> 16) & 0xff);
+ mac[4] = (crc >> 8) & 0xff;
+ mac[5] = crc & 0xff;
+}
+#endif
+
+/*
+ * ether_request_mac - try to find usable MAC address.
+ */
+static int
+ether_request_mac(device_t dev, uint8_t *mac)
+{
+ char *var;
+
+ /*
+ * "ethaddr" is passed via envp on RedBoot platforms
+ * "kmac" is passed via argv on RouterBOOT platforms
+ */
+#if defined(__U_BOOT__) || defined(__REDBOOT__) || defined(__ROUTERBOOT__)
+ if ((var = getenv("ethaddr")) != NULL ||
+ (var = getenv("kmac")) != NULL ) {
+
+ if(!macaddr_atoi(var, mac)) {
+ printf("%s: use %s macaddr from KENV\n",
+ device_get_nameunit(dev), var);
+ freeenv(var);
+ return (0);
+ }
+ freeenv(var);
+ }
+#endif
+
+ /*
+ * Try from hints
+ * hint.[dev].[unit].macaddr
+ */
+ if (!resource_string_value(device_get_name(dev),
+ device_get_unit(dev), "macaddr", (const char **)&var)) {
+
+ if(!macaddr_atoi(var, mac)) {
+ printf("%s: use %s macaddr from hints\n",
+ device_get_nameunit(dev), var);
+ return (0);
+ }
+ }
+
+#ifdef USE_GENERATED_MAC_ADDRESS
+ generate_mac(mac);
+
+ device_printf(dev, "use generated %02x:%02x:%02x:%02x:%02x:%02x "
+ "macaddr\n", mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]);
+#else
+ /* Hardcoded */
+ mac[0] = 0x00;
+ mac[1] = 0x18;
+ mac[2] = 0xe7;
+ mac[3] = 0xd5;
+ mac[4] = 0x83;
+ mac[5] = 0x90;
+
+ device_printf(dev, "use hardcoded 00:18:e7:d5:83:90 macaddr\n");
+#endif
+
+ return (0);
+}
+
+static int
+rt_attach(device_t dev)
+{
+ struct rt_softc *sc;
+ struct ifnet *ifp;
+ int error, i;
+
+ sc = device_get_softc(dev);
+ sc->dev = dev;
+
+ mtx_init(&sc->lock, device_get_nameunit(dev), MTX_NETWORK_LOCK,
+ MTX_DEF | MTX_RECURSE);
+
+ sc->mem_rid = 0;
+ sc->mem = bus_alloc_resource_any(dev, SYS_RES_MEMORY, &sc->mem_rid,
+ RF_ACTIVE);
+ if (sc->mem == NULL) {
+ device_printf(dev, "could not allocate memory resource\n");
+ error = ENXIO;
+ goto fail;
+ }
+
+ sc->bst = rman_get_bustag(sc->mem);
+ sc->bsh = rman_get_bushandle(sc->mem);
+
+ sc->irq_rid = 0;
+ sc->irq = bus_alloc_resource_any(dev, SYS_RES_IRQ, &sc->irq_rid,
+ RF_ACTIVE);
+ if (sc->irq == NULL) {
+ device_printf(dev,
+ "could not allocate interrupt resource\n");
+ error = ENXIO;
+ goto fail;
+ }
+
+#ifdef IF_RT_DEBUG
+ sc->debug = rt_debug;
+
+ SYSCTL_ADD_INT(device_get_sysctl_ctx(dev),
+ SYSCTL_CHILDREN(device_get_sysctl_tree(dev)), OID_AUTO,
+ "debug", CTLFLAG_RW, &sc->debug, 0, "rt debug level");
+#endif
+
+ device_printf(dev, "RT305XF Ethernet MAC (rev 0x%08x)\n",
+ sc->mac_rev);
+
+ /* Reset hardware */
+ RT_WRITE(sc, GE_PORT_BASE + FE_RST_GLO, PSE_RESET);
+
+ RT_WRITE(sc, GDMA1_BASE + GDMA_FWD_CFG,
+ (
+ GDM_ICS_EN | /* Enable IP Csum */
+ GDM_TCS_EN | /* Enable TCP Csum */
+ GDM_UCS_EN | /* Enable UDP Csum */
+ GDM_STRPCRC | /* Strip CRC from packet */
+ GDM_DST_PORT_CPU << GDM_UFRC_P_SHIFT | /* Forward UCast to CPU */
+ GDM_DST_PORT_CPU << GDM_BFRC_P_SHIFT | /* Forward BCast to CPU */
+ GDM_DST_PORT_CPU << GDM_MFRC_P_SHIFT | /* Forward MCast to CPU */
+ GDM_DST_PORT_CPU << GDM_OFRC_P_SHIFT /* Forward Other to CPU */
+ ));
+
+ /* allocate Tx and Rx rings */
+ for (i = 0; i < RT_SOFTC_TX_RING_COUNT; i++) {
+ error = rt_alloc_tx_ring(sc, &sc->tx_ring[i], i);
+ if (error != 0) {
+ device_printf(dev, "could not allocate Tx ring #%d\n",
+ i);
+ goto fail;
+ }
+ }
+
+ sc->tx_ring_mgtqid = 5;
+
+ error = rt_alloc_rx_ring(sc, &sc->rx_ring);
+ if (error != 0) {
+ device_printf(dev, "could not allocate Rx ring\n");
+ goto fail;
+ }
+
+ callout_init(&sc->periodic_ch, 0);
+ callout_init_mtx(&sc->tx_watchdog_ch, &sc->lock, 0);
+
+ ifp = sc->ifp = if_alloc(IFT_ETHER);
+ if (ifp == NULL) {
+ device_printf(dev, "could not if_alloc()\n");
+ error = ENOMEM;
+ goto fail;
+ }
+
+ ifp->if_softc = sc;
+ if_initname(ifp, device_get_name(sc->dev), device_get_unit(sc->dev));
+ ifp->if_flags = IFF_BROADCAST | IFF_SIMPLEX | IFF_MULTICAST;
+ ifp->if_init = rt_init;
+ ifp->if_ioctl = rt_ioctl;
+ ifp->if_start = rt_start;
+ ifp->if_mtu = ETHERMTU;
+#define RT_TX_QLEN 256
+
+ IFQ_SET_MAXLEN(&ifp->if_snd, RT_TX_QLEN);
+ ifp->if_snd.ifq_drv_maxlen = RT_TX_QLEN;
+ IFQ_SET_READY(&ifp->if_snd);
+
+#ifdef IF_RT_PHY_SUPPORT
+ error = mii_attach(dev, &sc->rt_miibus, ifp, rt_ifmedia_upd,
+ rt_ifmedia_sts, BMSR_DEFCAPMASK, MII_PHY_ANY, MII_OFFSET_ANY, 0);
+ if (error != 0) {
+ device_printf(dev, "attaching PHYs failed\n");
+ error = ENXIO;
+ goto fail;
+ }
+#else
+ ifmedia_init(&sc->rt_ifmedia, 0, rt_ifmedia_upd, rt_ifmedia_sts);
+ ifmedia_add(&sc->rt_ifmedia, IFM_ETHER | IFM_100_TX | IFM_FDX, 0,
+ NULL);
+ ifmedia_set(&sc->rt_ifmedia, IFM_ETHER | IFM_100_TX | IFM_FDX);
+
+#endif /* IF_RT_PHY_SUPPORT */
+
+ ether_request_mac(dev, sc->mac_addr);
+ ether_ifattach(ifp, sc->mac_addr);
+
+ /*
+ * Tell the upper layer(s) we support long frames.
+ */
+ ifp->if_data.ifi_hdrlen = sizeof(struct ether_vlan_header);
+ ifp->if_capabilities |= IFCAP_VLAN_MTU;
+ ifp->if_capenable |= IFCAP_VLAN_MTU;
+ ifp->if_capabilities |= IFCAP_RXCSUM|IFCAP_TXCSUM;
+ ifp->if_capenable |= IFCAP_RXCSUM|IFCAP_TXCSUM;
+
+ /* init task queue */
+ TASK_INIT(&sc->rx_done_task, 0, rt_rx_done_task, sc);
+ TASK_INIT(&sc->tx_done_task, 0, rt_tx_done_task, sc);
+ TASK_INIT(&sc->periodic_task, 0, rt_periodic_task, sc);
+
+ sc->rx_process_limit = 100;
+
+ sc->taskqueue = taskqueue_create("rt_taskq", M_NOWAIT,
+ taskqueue_thread_enqueue, &sc->taskqueue);
+
+ taskqueue_start_threads(&sc->taskqueue, 1, PI_NET, "%s taskq",
+ device_get_nameunit(sc->dev));
+
+ rt_sysctl_attach(sc);
+
+ /* set up interrupt */
+ error = bus_setup_intr(dev, sc->irq, INTR_TYPE_NET | INTR_MPSAFE,
+ NULL, rt_intr, sc, &sc->irqh);
+ if (error != 0) {
+ printf("%s: could not set up interrupt\n",
+ device_get_nameunit(dev));
+ goto fail;
+ }
+#ifdef IF_RT_DEBUG
+ device_printf(dev, "debug var at %#08x\n", (u_int)&(sc->debug));
+#endif
+
+ return (0);
+
+fail:
+ /* free Tx and Rx rings */
+ for (i = 0; i < RT_SOFTC_TX_RING_COUNT; i++)
+ rt_free_tx_ring(sc, &sc->tx_ring[i]);
+
+ rt_free_rx_ring(sc, &sc->rx_ring);
+
+ mtx_destroy(&sc->lock);
+
+ if (sc->mem != NULL)
+ bus_release_resource(dev, SYS_RES_MEMORY, sc->mem_rid,
+ sc->mem);
+
+ if (sc->irq != NULL)
+ bus_release_resource(dev, SYS_RES_IRQ, sc->irq_rid,
+ sc->irq);
+
+ return (error);
+}
+
+/*
+ * Set media options.
+ */
+static int
+rt_ifmedia_upd(struct ifnet *ifp)
+{
+ struct rt_softc *sc;
+#ifdef IF_RT_PHY_SUPPORT
+ struct mii_data *mii;
+ int error = 0;
+
+ sc = ifp->if_softc;
+ RT_SOFTC_LOCK(sc);
+
+ mii = device_get_softc(sc->rt_miibus);
+ if (mii->mii_instance) {
+ struct mii_softc *miisc;
+ for (miisc = LIST_FIRST(&mii->mii_phys); miisc != NULL;
+ miisc = LIST_NEXT(miisc, mii_list))
+ mii_phy_reset(miisc);
+ }
+ if (mii)
+ error = mii_mediachg(mii);
+ RT_SOFTC_UNLOCK(sc);
+
+ return (error);
+
+#else /* !IF_RT_PHY_SUPPORT */
+
+ struct ifmedia *ifm;
+ struct ifmedia_entry *ife;
+
+ sc = ifp->if_softc;
+ ifm = &sc->rt_ifmedia;
+ ife = ifm->ifm_cur;
+
+ if (IFM_TYPE(ifm->ifm_media) != IFM_ETHER)
+ return (EINVAL);
+
+ if (IFM_SUBTYPE(ife->ifm_media) == IFM_AUTO) {
+ device_printf(sc->dev,
+ "AUTO is not supported for multiphy MAC");
+ return (EINVAL);
+ }
+
+ /*
+ * Ignore everything
+ */
+ return (0);
+#endif /* IF_RT_PHY_SUPPORT */
+}
+
+/*
+ * Report current media status.
+ */
+static void
+rt_ifmedia_sts(struct ifnet *ifp, struct ifmediareq *ifmr)
+{
+#ifdef IF_RT_PHY_SUPPORT
+ struct rt_softc *sc;
+ struct mii_data *mii;
+
+ sc = ifp->if_softc;
+
+ RT_SOFTC_LOCK(sc);
+ mii = device_get_softc(sc->rt_miibus);
+ mii_pollstat(mii);
+ ifmr->ifm_active = mii->mii_media_active;
+ ifmr->ifm_status = mii->mii_media_status;
+ ifmr->ifm_active = IFM_ETHER | IFM_100_TX | IFM_FDX;
+ ifmr->ifm_status = IFM_AVALID | IFM_ACTIVE;
+ RT_SOFTC_UNLOCK(sc);
+#else /* !IF_RT_PHY_SUPPORT */
+
+ ifmr->ifm_status = IFM_AVALID | IFM_ACTIVE;
+ ifmr->ifm_active = IFM_ETHER | IFM_100_TX | IFM_FDX;
+#endif /* IF_RT_PHY_SUPPORT */
+}
+
+static int
+rt_detach(device_t dev)
+{
+ struct rt_softc *sc;
+ struct ifnet *ifp;
+ int i;
+
+ sc = device_get_softc(dev);
+ ifp = sc->ifp;
+
+ RT_DPRINTF(sc, RT_DEBUG_ANY, "detaching\n");
+
+ RT_SOFTC_LOCK(sc);
+
+ ifp->if_drv_flags &= ~(IFF_DRV_RUNNING | IFF_DRV_OACTIVE);
+
+ callout_stop(&sc->periodic_ch);
+ callout_stop(&sc->tx_watchdog_ch);
+
+ taskqueue_drain(sc->taskqueue, &sc->rx_done_task);
+ taskqueue_drain(sc->taskqueue, &sc->tx_done_task);
+ taskqueue_drain(sc->taskqueue, &sc->periodic_task);
+
+ /* free Tx and Rx rings */
+ for (i = 0; i < RT_SOFTC_TX_RING_COUNT; i++)
+ rt_free_tx_ring(sc, &sc->tx_ring[i]);
+
+ rt_free_rx_ring(sc, &sc->rx_ring);
+
+ RT_SOFTC_UNLOCK(sc);
+
+#ifdef IF_RT_PHY_SUPPORT
+ if (sc->rt_miibus != NULL)
+ device_delete_child(dev, sc->rt_miibus);
+#endif
+
+ ether_ifdetach(ifp);
+ if_free(ifp);
+
+ taskqueue_free(sc->taskqueue);
+
+ mtx_destroy(&sc->lock);
+
+ bus_generic_detach(dev);
+ bus_teardown_intr(dev, sc->irq, sc->irqh);
+ bus_release_resource(dev, SYS_RES_IRQ, sc->irq_rid, sc->irq);
+ bus_release_resource(dev, SYS_RES_MEMORY, sc->mem_rid, sc->mem);
+
+ return (0);
+}
+
+static int
+rt_shutdown(device_t dev)
+{
+ struct rt_softc *sc;
+
+ sc = device_get_softc(dev);
+ RT_DPRINTF(sc, RT_DEBUG_ANY, "shutting down\n");
+ rt_stop(sc);
+
+ return (0);
+}
+
+static int
+rt_suspend(device_t dev)
+{
+ struct rt_softc *sc;
+
+ sc = device_get_softc(dev);
+ RT_DPRINTF(sc, RT_DEBUG_ANY, "suspending\n");
+ rt_stop(sc);
+
+ return (0);
+}
+
+static int
+rt_resume(device_t dev)
+{
+ struct rt_softc *sc;
+ struct ifnet *ifp;
+
+ sc = device_get_softc(dev);
+ ifp = sc->ifp;
+
+ RT_DPRINTF(sc, RT_DEBUG_ANY, "resuming\n");
+
+ if (ifp->if_flags & IFF_UP)
+ rt_init(sc);
+
+ return (0);
+}
+
+/*
+ * rt_init_locked - Run initialization process having locked mtx.
+ */
+static void
+rt_init_locked(void *priv)
+{
+ struct rt_softc *sc;
+ struct ifnet *ifp;
+#ifdef IF_RT_PHY_SUPPORT
+ struct mii_data *mii;
+#endif
+ int i, ntries;
+ uint32_t tmp;
+
+ sc = priv;
+ ifp = sc->ifp;
+#ifdef IF_RT_PHY_SUPPORT
+ mii = device_get_softc(sc->rt_miibus);
+#endif
+
+ RT_DPRINTF(sc, RT_DEBUG_ANY, "initializing\n");
+
+ RT_SOFTC_ASSERT_LOCKED(sc);
+
+ /* hardware reset */
+ RT_WRITE(sc, GE_PORT_BASE + FE_RST_GLO, PSE_RESET);
+ rt305x_sysctl_set(SYSCTL_RSTCTRL, SYSCTL_RSTCTRL_FRENG);
+
+ /* Fwd to CPU (uni|broad|multi)cast and Unknown */
+ RT_WRITE(sc, GDMA1_BASE + GDMA_FWD_CFG,
+ (
+ GDM_ICS_EN | /* Enable IP Csum */
+ GDM_TCS_EN | /* Enable TCP Csum */
+ GDM_UCS_EN | /* Enable UDP Csum */
+ GDM_STRPCRC | /* Strip CRC from packet */
+ GDM_DST_PORT_CPU << GDM_UFRC_P_SHIFT | /* Forward UCast to CPU */
+ GDM_DST_PORT_CPU << GDM_BFRC_P_SHIFT | /* Forward BCast to CPU */
+ GDM_DST_PORT_CPU << GDM_MFRC_P_SHIFT | /* Forward MCast to CPU */
+ GDM_DST_PORT_CPU << GDM_OFRC_P_SHIFT /* Forward Other to CPU */
+ ));
+
+ /* disable DMA engine */
+ RT_WRITE(sc, PDMA_BASE + PDMA_GLO_CFG, 0);
+ RT_WRITE(sc, PDMA_BASE + PDMA_RST_IDX, 0xffffffff);
+
+ /* wait while DMA engine is busy */
+ for (ntries = 0; ntries < 100; ntries++) {
+ tmp = RT_READ(sc, PDMA_BASE + PDMA_GLO_CFG);
+ if (!(tmp & (FE_TX_DMA_BUSY | FE_RX_DMA_BUSY)))
+ break;
+ DELAY(1000);
+ }
+
+ if (ntries == 100) {
+ device_printf(sc->dev, "timeout waiting for DMA engine\n");
+ goto fail;
+ }
+
+ /* reset Rx and Tx rings */
+ tmp = FE_RST_DRX_IDX0 |
+ FE_RST_DTX_IDX3 |
+ FE_RST_DTX_IDX2 |
+ FE_RST_DTX_IDX1 |
+ FE_RST_DTX_IDX0;
+
+ RT_WRITE(sc, PDMA_BASE + PDMA_RST_IDX, tmp);
+
+ /* XXX switch set mac address */
+ for (i = 0; i < RT_SOFTC_TX_RING_COUNT; i++)
+ rt_reset_tx_ring(sc, &sc->tx_ring[i]);
+
+ for (i = 0; i < RT_SOFTC_TX_RING_COUNT; i++) {
+ /* update TX_BASE_PTRx */
+ RT_WRITE(sc, PDMA_BASE + TX_BASE_PTR(i),
+ sc->tx_ring[i].desc_phys_addr);
+ RT_WRITE(sc, PDMA_BASE + TX_MAX_CNT(i),
+ RT_SOFTC_TX_RING_DESC_COUNT);
+ RT_WRITE(sc, PDMA_BASE + TX_CTX_IDX(i), 0);
+ }
+
+ /* init Rx ring */
+ rt_reset_rx_ring(sc, &sc->rx_ring);
+
+ /* update RX_BASE_PTR0 */
+ RT_WRITE(sc, PDMA_BASE + RX_BASE_PTR0,
+ sc->rx_ring.desc_phys_addr);
+ RT_WRITE(sc, PDMA_BASE + RX_MAX_CNT0,
+ RT_SOFTC_RX_RING_DATA_COUNT);
+ RT_WRITE(sc, PDMA_BASE + RX_CALC_IDX0,
+ RT_SOFTC_RX_RING_DATA_COUNT - 1);
+
+ /* write back DDONE, 16byte burst enable RX/TX DMA */
+ RT_WRITE(sc, PDMA_BASE + PDMA_GLO_CFG,
+ FE_TX_WB_DDONE | FE_DMA_BT_SIZE16 | FE_RX_DMA_EN | FE_TX_DMA_EN);
+
+ /* disable interrupts mitigation */
+ RT_WRITE(sc, PDMA_BASE + DELAY_INT_CFG, 0);
+
+ /* clear pending interrupts */
+ RT_WRITE(sc, GE_PORT_BASE + FE_INT_STATUS, 0xffffffff);
+
+ /* enable interrupts */
+ tmp = CNT_PPE_AF |
+ CNT_GDM_AF |
+ PSE_P2_FC |
+ GDM_CRC_DROP |
+ PSE_BUF_DROP |
+ GDM_OTHER_DROP |
+ PSE_P1_FC |
+ PSE_P0_FC |
+ PSE_FQ_EMPTY |
+ INT_TX_COHERENT |
+ INT_RX_COHERENT |
+ INT_TXQ3_DONE |
+ INT_TXQ2_DONE |
+ INT_TXQ1_DONE |
+ INT_TXQ0_DONE |
+ INT_RX_DONE;
+
+ sc->intr_enable_mask = tmp;
+
+ RT_WRITE(sc, GE_PORT_BASE + FE_INT_ENABLE, tmp);
+
+ if (rt_txrx_enable(sc) != 0)
+ goto fail;
+
+#ifdef IF_RT_PHY_SUPPORT
+ if (mii) mii_mediachg(mii);
+#endif /* IF_RT_PHY_SUPPORT */
+
+ ifp->if_drv_flags &= ~IFF_DRV_OACTIVE;
+ ifp->if_drv_flags |= IFF_DRV_RUNNING;
+
+ sc->periodic_round = 0;
+
+ callout_reset(&sc->periodic_ch, hz / 10, rt_periodic, sc);
+
+ return;
+
+fail:
+ rt_stop_locked(sc);
+}
+
+/*
+ * rt_init - lock and initialize device.
+ */
+static void
+rt_init(void *priv)
+{
+ struct rt_softc *sc;
+
+ sc = priv;
+ RT_SOFTC_LOCK(sc);
+ rt_init_locked(sc);
+ RT_SOFTC_UNLOCK(sc);
+}
+
+/*
+ * rt_stop_locked - stop TX/RX w/ lock
+ */
+static void
+rt_stop_locked(void *priv)
+{
+ struct rt_softc *sc;
+ struct ifnet *ifp;
+
+ sc = priv;
+ ifp = sc->ifp;
+
+ RT_DPRINTF(sc, RT_DEBUG_ANY, "stopping\n");
+
+ RT_SOFTC_ASSERT_LOCKED(sc);
+ sc->tx_timer = 0;
+ ifp->if_drv_flags &= ~(IFF_DRV_RUNNING | IFF_DRV_OACTIVE);
+ callout_stop(&sc->periodic_ch);
+ callout_stop(&sc->tx_watchdog_ch);
+ RT_SOFTC_UNLOCK(sc);
+ taskqueue_block(sc->taskqueue);
+
+ /*
+ * Sometime rt_stop_locked called from isr and we get panic
+ * When found, I fix it
+ */
+#ifdef notyet
+ taskqueue_drain(sc->taskqueue, &sc->rx_done_task);
+ taskqueue_drain(sc->taskqueue, &sc->tx_done_task);
+ taskqueue_drain(sc->taskqueue, &sc->periodic_task);
+#endif
+ RT_SOFTC_LOCK(sc);
+
+ /* disable interrupts */
+ RT_WRITE(sc, GE_PORT_BASE + FE_INT_ENABLE, 0);
+
+ /* reset adapter */
+ RT_WRITE(sc, GE_PORT_BASE + FE_RST_GLO, PSE_RESET);
+
+ RT_WRITE(sc, GDMA1_BASE + GDMA_FWD_CFG,
+ (
+ GDM_ICS_EN | /* Enable IP Csum */
+ GDM_TCS_EN | /* Enable TCP Csum */
+ GDM_UCS_EN | /* Enable UDP Csum */
+ GDM_STRPCRC | /* Strip CRC from packet */
+ GDM_DST_PORT_CPU << GDM_UFRC_P_SHIFT | /* Forward UCast to CPU */
+ GDM_DST_PORT_CPU << GDM_BFRC_P_SHIFT | /* Forward BCast to CPU */
+ GDM_DST_PORT_CPU << GDM_MFRC_P_SHIFT | /* Forward MCast to CPU */
+ GDM_DST_PORT_CPU << GDM_OFRC_P_SHIFT /* Forward Other to CPU */
+ ));
+}
+
+static void
+rt_stop(void *priv)
+{
+ struct rt_softc *sc;
+
+ sc = priv;
+ RT_SOFTC_LOCK(sc);
+ rt_stop_locked(sc);
+ RT_SOFTC_UNLOCK(sc);
+}
+
+/*
+ * rt_tx_data - transmit packet.
+ */
+static int
+rt_tx_data(struct rt_softc *sc, struct mbuf *m, int qid)
+{
+ struct ifnet *ifp;
+ struct rt_softc_tx_ring *ring;
+ struct rt_softc_tx_data *data;
+ struct rt_txdesc *desc;
+ struct mbuf *m_d;
+ bus_dma_segment_t dma_seg[RT_SOFTC_MAX_SCATTER];
+ int error, ndmasegs, ndescs, i;
+
+ KASSERT(qid >= 0 && qid < RT_SOFTC_TX_RING_COUNT,
+ ("%s: Tx data: invalid qid=%d\n",
+ device_get_nameunit(sc->dev), qid));
+
+ RT_SOFTC_TX_RING_ASSERT_LOCKED(&sc->tx_ring[qid]);
+
+ ifp = sc->ifp;
+ ring = &sc->tx_ring[qid];
+ desc = &ring->desc[ring->desc_cur];
+ data = &ring->data[ring->data_cur];
+
+ error = bus_dmamap_load_mbuf_sg(ring->data_dma_tag, data->dma_map, m,
+ dma_seg, &ndmasegs, 0);
+ if (error != 0) {
+ /* too many fragments, linearize */
+
+ RT_DPRINTF(sc, RT_DEBUG_TX,
+ "could not load mbuf DMA map, trying to linearize "
+ "mbuf: ndmasegs=%d, len=%d, error=%d\n",
+ ndmasegs, m->m_pkthdr.len, error);
+
+ m_d = m_collapse(m, M_DONTWAIT, 16);
+ if (m_d == NULL) {
+ m_freem(m);
+ m = NULL;
+ return (ENOMEM);
+ }
+ m = m_d;
+
+ sc->tx_defrag_packets++;
+
+ error = bus_dmamap_load_mbuf_sg(ring->data_dma_tag,
+ data->dma_map, m, dma_seg, &ndmasegs, 0);
+ if (error != 0) {
+ device_printf(sc->dev, "could not load mbuf DMA map: "
+ "ndmasegs=%d, len=%d, error=%d\n",
+ ndmasegs, m->m_pkthdr.len, error);
+ m_freem(m);
+ return (error);
+ }
+ }
+
+ if (m->m_pkthdr.len == 0)
+ ndmasegs = 0;
+
+ /* determine how many Tx descs are required */
+ ndescs = 1 + ndmasegs / 2;
+ if ((ring->desc_queued + ndescs) >
+ (RT_SOFTC_TX_RING_DESC_COUNT - 2)) {
+ RT_DPRINTF(sc, RT_DEBUG_TX,
+ "there are not enough Tx descs\n");
+
+ sc->no_tx_desc_avail++;
+
+ bus_dmamap_unload(ring->data_dma_tag, data->dma_map);
+ m_freem(m);
+ return (EFBIG);
+ }
+
+ data->m = m;
+
+ /* set up Tx descs */
+ for (i = 0; i < ndmasegs; i += 2) {
+ /* Set destenation */
+ desc->dst = (TXDSCR_DST_PORT_GDMA1);
+ if ((ifp->if_capenable & IFCAP_TXCSUM) != 0)
+ desc->dst |= (TXDSCR_IP_CSUM_GEN|TXDSCR_UDP_CSUM_GEN|
+ TXDSCR_TCP_CSUM_GEN);
+ /* Set queue id */
+ desc->qn = qid;
+ /* No PPPoE */
+ desc->pppoe = 0;
+ /* No VLAN */
+ desc->vid = 0;
+
+ desc->sdp0 = htole32(dma_seg[i].ds_addr);
+ desc->sdl0 = htole16(dma_seg[i].ds_len |
+ ( ((i+1) == ndmasegs )?RT_TXDESC_SDL0_LASTSEG:0 ));
+
+ if ((i+1) < ndmasegs) {
+ desc->sdp1 = htole32(dma_seg[i+1].ds_addr);
+ desc->sdl1 = htole16(dma_seg[i+1].ds_len |
+ ( ((i+2) == ndmasegs )?RT_TXDESC_SDL1_LASTSEG:0 ));
+ } else {
+ desc->sdp1 = 0;
+ desc->sdl1 = 0;
+ }
+
+ if ((i+2) < ndmasegs) {
+ ring->desc_queued++;
+ ring->desc_cur = (ring->desc_cur + 1) %
+ RT_SOFTC_TX_RING_DESC_COUNT;
+ }
+ desc = &ring->desc[ring->desc_cur];
+ }
+
+ RT_DPRINTF(sc, RT_DEBUG_TX, "sending data: len=%d, ndmasegs=%d, "
+ "DMA ds_len=%d/%d/%d/%d/%d\n",
+ m->m_pkthdr.len, ndmasegs,
+ (int) dma_seg[0].ds_len,
+ (int) dma_seg[1].ds_len,
+ (int) dma_seg[2].ds_len,
+ (int) dma_seg[3].ds_len,
+ (int) dma_seg[4].ds_len);
+
+ bus_dmamap_sync(ring->seg0_dma_tag, ring->seg0_dma_map,
+ BUS_DMASYNC_PREWRITE);
+ bus_dmamap_sync(ring->data_dma_tag, data->dma_map,
+ BUS_DMASYNC_PREWRITE);
+ bus_dmamap_sync(ring->desc_dma_tag, ring->desc_dma_map,
+ BUS_DMASYNC_PREWRITE);
+
+ ring->desc_queued++;
+ ring->desc_cur = (ring->desc_cur + 1) % RT_SOFTC_TX_RING_DESC_COUNT;
+
+ ring->data_queued++;
+ ring->data_cur = (ring->data_cur + 1) % RT_SOFTC_TX_RING_DATA_COUNT;
+
+ /* kick Tx */
+ RT_WRITE(sc, PDMA_BASE + TX_CTX_IDX(qid), ring->desc_cur);
+
+ return (0);
+}
+
+/*
+ * rt_start - start Transmit/Receive
+ */
+static void
+rt_start(struct ifnet *ifp)
+{
+ struct rt_softc *sc;
+ struct mbuf *m;
+ int qid = 0 /* XXX must check QoS priority */;
+
+ sc = ifp->if_softc;
+
+ if (!(ifp->if_drv_flags & IFF_DRV_RUNNING))
+ return;
+
+ for (;;) {
+ IFQ_DRV_DEQUEUE(&ifp->if_snd, m);
+ if (m == NULL)
+ break;
+
+ m->m_pkthdr.rcvif = NULL;
+
+ RT_SOFTC_TX_RING_LOCK(&sc->tx_ring[qid]);
+
+ if (sc->tx_ring[qid].data_queued >=
+ RT_SOFTC_TX_RING_DATA_COUNT) {
+ RT_SOFTC_TX_RING_UNLOCK(&sc->tx_ring[qid]);
+
+ RT_DPRINTF(sc, RT_DEBUG_TX,
+ "if_start: Tx ring with qid=%d is full\n", qid);
+
+ m_freem(m);
+
+ ifp->if_drv_flags |= IFF_DRV_OACTIVE;
+ ifp->if_oerrors++;
+
+ sc->tx_data_queue_full[qid]++;
+
+ break;
+ }
+
+ if (rt_tx_data(sc, m, qid) != 0) {
+ RT_SOFTC_TX_RING_UNLOCK(&sc->tx_ring[qid]);
+
+ ifp->if_oerrors++;
+
+ break;
+ }
+
+ RT_SOFTC_TX_RING_UNLOCK(&sc->tx_ring[qid]);
+ sc->tx_timer = RT_TX_WATCHDOG_TIMEOUT;
+ callout_reset(&sc->tx_watchdog_ch, hz, rt_tx_watchdog, sc);
+ }
+}
+
+/*
+ * rt_update_promisc - set/clear promiscuous mode. Unused yet, because
+ * filtering done by attached Ethernet switch.
+ */
+static void
+rt_update_promisc(struct ifnet *ifp)
+{
+ struct rt_softc *sc;
+
+ sc = ifp->if_softc;
+ printf("%s: %s promiscuous mode\n",
+ device_get_nameunit(sc->dev),
+ (ifp->if_flags & IFF_PROMISC) ? "entering" : "leaving");
+}
+
+/*
+ * rt_ioctl - ioctl handler.
+ */
+static int
+rt_ioctl(struct ifnet *ifp, u_long cmd, caddr_t data)
+{
+ struct rt_softc *sc;
+ struct ifreq *ifr;
+#ifdef IF_RT_PHY_SUPPORT
+ struct mii_data *mii;
+#endif /* IF_RT_PHY_SUPPORT */
+ int error, startall;
+
+ sc = ifp->if_softc;
+ ifr = (struct ifreq *) data;
+
+ error = 0;
+
+ switch (cmd) {
+ case SIOCSIFFLAGS:
+ startall = 0;
+ RT_SOFTC_LOCK(sc);
+ if (ifp->if_flags & IFF_UP) {
+ if (ifp->if_drv_flags & IFF_DRV_RUNNING) {
+ if ((ifp->if_flags ^ sc->if_flags) &
+ IFF_PROMISC)
+ rt_update_promisc(ifp);
+ } else {
+ rt_init_locked(sc);
+ startall = 1;
+ }
+ } else {
+ if (ifp->if_drv_flags & IFF_DRV_RUNNING)
+ rt_stop_locked(sc);
+ }
+ sc->if_flags = ifp->if_flags;
+ RT_SOFTC_UNLOCK(sc);
+ break;
+ case SIOCGIFMEDIA:
+ case SIOCSIFMEDIA:
+#ifdef IF_RT_PHY_SUPPORT
+ mii = device_get_softc(sc->rt_miibus);
+ error = ifmedia_ioctl(ifp, ifr, &mii->mii_media, cmd);
+#else
+ error = ifmedia_ioctl(ifp, ifr, &sc->rt_ifmedia, cmd);
+#endif /* IF_RT_PHY_SUPPORT */
+ break;
+ default:
+ error = ether_ioctl(ifp, cmd, data);
+ break;
+ }
+ return (error);
+}
+
+/*
+ * rt_periodic - Handler of PERIODIC interrupt
+ */
+static void
+rt_periodic(void *arg)
+{
+ struct rt_softc *sc;
+
+ sc = arg;
+ RT_DPRINTF(sc, RT_DEBUG_PERIODIC, "periodic\n");
+ taskqueue_enqueue(sc->taskqueue, &sc->periodic_task);
+}
+
+/*
+ * rt_tx_watchdog - Handler of TX Watchdog
+ */
+static void
+rt_tx_watchdog(void *arg)
+{
+ struct rt_softc *sc;
+ struct ifnet *ifp;
+
+ sc = arg;
+ ifp = sc->ifp;
+
+ if (sc->tx_timer == 0)
+ return;
+
+ if (--sc->tx_timer == 0) {
+ device_printf(sc->dev, "Tx watchdog timeout: resetting\n");
+#ifdef notyet
+ /*
+ * XXX: Commented out, because reset break input.
+ */
+ rt_stop_locked(sc);
+ rt_init_locked(sc);
+#endif
+ ifp->if_oerrors++;
+ sc->tx_watchdog_timeouts++;
+ }
+ callout_reset(&sc->tx_watchdog_ch, hz, rt_tx_watchdog, sc);
+}
+
+/*
+ * rt_cnt_ppe_af - Handler of PPE Counter Table Almost Full interrupt
+ */
+static void
+rt_cnt_ppe_af(struct rt_softc *sc)
+{
+
+ RT_DPRINTF(sc, RT_DEBUG_INTR, "PPE Counter Table Almost Full\n");
+}
+
+/*
+ * rt_cnt_gdm_af - Handler of GDMA 1 & 2 Counter Table Almost Full interrupt
+ */
+static void
+rt_cnt_gdm_af(struct rt_softc *sc)
+{
+
+ RT_DPRINTF(sc, RT_DEBUG_INTR,
+ "GDMA 1 & 2 Counter Table Almost Full\n");
+}
+
+/*
+ * rt_pse_p2_fc - Handler of PSE port2 (GDMA 2) flow control interrupt
+ */
+static void
+rt_pse_p2_fc(struct rt_softc *sc)
+{
+
+ RT_DPRINTF(sc, RT_DEBUG_INTR,
+ "PSE port2 (GDMA 2) flow control asserted.\n");
+}
+
+/*
+ * rt_gdm_crc_drop - Handler of GDMA 1/2 discard a packet due to CRC error
+ * interrupt
+ */
+static void
+rt_gdm_crc_drop(struct rt_softc *sc)
+{
+
+ RT_DPRINTF(sc, RT_DEBUG_INTR,
+ "GDMA 1 & 2 discard a packet due to CRC error\n");
+}
+
+/*
+ * rt_pse_buf_drop - Handler of buffer sharing limitation interrupt
+ */
+static void
+rt_pse_buf_drop(struct rt_softc *sc)
+{
+
+ RT_DPRINTF(sc, RT_DEBUG_INTR,
+ "PSE discards a packet due to buffer sharing limitation\n");
+}
+
+/*
+ * rt_gdm_other_drop - Handler of discard on other reason interrupt
+ */
+static void
+rt_gdm_other_drop(struct rt_softc *sc)
+{
+
+ RT_DPRINTF(sc, RT_DEBUG_INTR,
+ "GDMA 1 & 2 discard a packet due to other reason\n");
+}
+
+/*
+ * rt_pse_p1_fc - Handler of PSE port1 (GDMA 1) flow control interrupt
+ */
+static void
+rt_pse_p1_fc(struct rt_softc *sc)
+{
+
+ RT_DPRINTF(sc, RT_DEBUG_INTR,
+ "PSE port1 (GDMA 1) flow control asserted.\n");
+}
+
+/*
+ * rt_pse_p0_fc - Handler of PSE port0 (CDMA) flow control interrupt
+ */
+static void
+rt_pse_p0_fc(struct rt_softc *sc)
+{
+
+ RT_DPRINTF(sc, RT_DEBUG_INTR,
+ "PSE port0 (CDMA) flow control asserted.\n");
+}
+
+/*
+ * rt_pse_fq_empty - Handler of PSE free Q empty threshold reached interrupt
+ */
+static void
+rt_pse_fq_empty(struct rt_softc *sc)
+{
+
+ RT_DPRINTF(sc, RT_DEBUG_INTR,
+ "PSE free Q empty threshold reached & forced drop "
+ "condition occurred.\n");
+}
+
+/*
+ * rt_intr - main ISR
+ */
+static void
+rt_intr(void *arg)
+{
+ struct rt_softc *sc;
+ struct ifnet *ifp;
+ uint32_t status;
+
+ sc = arg;
+ ifp = sc->ifp;
+
+ /* acknowledge interrupts */
+ status = RT_READ(sc, GE_PORT_BASE + FE_INT_STATUS);
+ RT_WRITE(sc, GE_PORT_BASE + FE_INT_STATUS, status);
+
+ RT_DPRINTF(sc, RT_DEBUG_INTR, "interrupt: status=0x%08x\n", status);
+
+ if (status == 0xffffffff || /* device likely went away */
+ status == 0) /* not for us */
+ return;
+
+ sc->interrupts++;
+
+ if (!(ifp->if_drv_flags & IFF_DRV_RUNNING))
+ return;
+
+ if (status & CNT_PPE_AF)
+ rt_cnt_ppe_af(sc);
+
+ if (status & CNT_GDM_AF)
+ rt_cnt_gdm_af(sc);
+
+ if (status & PSE_P2_FC)
+ rt_pse_p2_fc(sc);
+
+ if (status & GDM_CRC_DROP)
+ rt_gdm_crc_drop(sc);
+
+ if (status & PSE_BUF_DROP)
+ rt_pse_buf_drop(sc);
+
+ if (status & GDM_OTHER_DROP)
+ rt_gdm_other_drop(sc);
+
+ if (status & PSE_P1_FC)
+ rt_pse_p1_fc(sc);
+
+ if (status & PSE_P0_FC)
+ rt_pse_p0_fc(sc);
+
+ if (status & PSE_FQ_EMPTY)
+ rt_pse_fq_empty(sc);
+
+ if (status & INT_TX_COHERENT)
+ rt_tx_coherent_intr(sc);
+
+ if (status & INT_RX_COHERENT)
+ rt_rx_coherent_intr(sc);
+
+ if (status & RX_DLY_INT)
+ rt_rx_delay_intr(sc);
+
+ if (status & TX_DLY_INT)
+ rt_tx_delay_intr(sc);
+
+ if (status & INT_RX_DONE)
+ rt_rx_intr(sc);
+
+ if (status & INT_TXQ3_DONE)
+ rt_tx_intr(sc, 3);
+
+ if (status & INT_TXQ2_DONE)
+ rt_tx_intr(sc, 2);
+
+ if (status & INT_TXQ1_DONE)
+ rt_tx_intr(sc, 1);
+
+ if (status & INT_TXQ0_DONE)
+ rt_tx_intr(sc, 0);
+}
+
+static void
+rt_tx_coherent_intr(struct rt_softc *sc)
+{
+ uint32_t tmp;
+ int i;
+
+ RT_DPRINTF(sc, RT_DEBUG_INTR, "Tx coherent interrupt\n");
+
+ sc->tx_coherent_interrupts++;
+
+ /* restart DMA engine */
+ tmp = RT_READ(sc, PDMA_BASE + PDMA_GLO_CFG);
+ tmp &= ~(FE_TX_WB_DDONE | FE_TX_DMA_EN);
+ RT_WRITE(sc, PDMA_BASE + PDMA_GLO_CFG, tmp);
+
+ for (i = 0; i < RT_SOFTC_TX_RING_COUNT; i++)
+ rt_reset_tx_ring(sc, &sc->tx_ring[i]);
+
+ for (i = 0; i < RT_SOFTC_TX_RING_COUNT; i++) {
+ RT_WRITE(sc, PDMA_BASE + TX_BASE_PTR(i),
+ sc->tx_ring[i].desc_phys_addr);
+ RT_WRITE(sc, PDMA_BASE + TX_MAX_CNT(i),
+ RT_SOFTC_TX_RING_DESC_COUNT);
+ RT_WRITE(sc, PDMA_BASE + TX_CTX_IDX(i), 0);
+ }
+
+ rt_txrx_enable(sc);
+}
+
+/*
+ * rt_rx_coherent_intr
+ */
+static void
+rt_rx_coherent_intr(struct rt_softc *sc)
+{
+ uint32_t tmp;
+
+ RT_DPRINTF(sc, RT_DEBUG_INTR, "Rx coherent interrupt\n");
+
+ sc->rx_coherent_interrupts++;
+
+ /* restart DMA engine */
+ tmp = RT_READ(sc, PDMA_BASE + PDMA_GLO_CFG);
+ tmp &= ~(FE_RX_DMA_EN);
+ RT_WRITE(sc, PDMA_BASE + PDMA_GLO_CFG, tmp);
+
+ /* init Rx ring */
+ rt_reset_rx_ring(sc, &sc->rx_ring);
+ RT_WRITE(sc, PDMA_BASE + RX_BASE_PTR0,
+ sc->rx_ring.desc_phys_addr);
+ RT_WRITE(sc, PDMA_BASE + RX_MAX_CNT0,
+ RT_SOFTC_RX_RING_DATA_COUNT);
+ RT_WRITE(sc, PDMA_BASE + RX_CALC_IDX0,
+ RT_SOFTC_RX_RING_DATA_COUNT - 1);
+
+ rt_txrx_enable(sc);
+}
+
+/*
+ * rt_rx_intr - a packet received
+ */
+static void
+rt_rx_intr(struct rt_softc *sc)
+{
+
+ RT_DPRINTF(sc, RT_DEBUG_INTR, "Rx interrupt\n");
+ sc->rx_interrupts++;
+ RT_SOFTC_LOCK(sc);
+
+ if (!(sc->intr_disable_mask & INT_RX_DONE)) {
+ rt_intr_disable(sc, INT_RX_DONE);
+ taskqueue_enqueue(sc->taskqueue, &sc->rx_done_task);
+ }
+
+ sc->intr_pending_mask |= INT_RX_DONE;
+ RT_SOFTC_UNLOCK(sc);
+}
+
+static void
+rt_rx_delay_intr(struct rt_softc *sc)
+{
+
+ RT_DPRINTF(sc, RT_DEBUG_INTR, "Rx delay interrupt\n");
+ sc->rx_delay_interrupts++;
+}
+
+static void
+rt_tx_delay_intr(struct rt_softc *sc)
+{
+
+ RT_DPRINTF(sc, RT_DEBUG_INTR, "Tx delay interrupt\n");
+ sc->tx_delay_interrupts++;
+}
+
+/*
+ * rt_tx_intr - Transsmition of packet done
+ */
+static void
+rt_tx_intr(struct rt_softc *sc, int qid)
+{
+
+ KASSERT(qid >= 0 && qid < RT_SOFTC_TX_RING_COUNT,
+ ("%s: Tx interrupt: invalid qid=%d\n",
+ device_get_nameunit(sc->dev), qid));
+
+ RT_DPRINTF(sc, RT_DEBUG_INTR, "Tx interrupt: qid=%d\n", qid);
+
+ sc->tx_interrupts[qid]++;
+ RT_SOFTC_LOCK(sc);
+
+ if (!(sc->intr_disable_mask & (INT_TXQ0_DONE << qid))) {
+ rt_intr_disable(sc, (INT_TXQ0_DONE << qid));
+ taskqueue_enqueue(sc->taskqueue, &sc->tx_done_task);
+ }
+
+ sc->intr_pending_mask |= (INT_TXQ0_DONE << qid);
+ RT_SOFTC_UNLOCK(sc);
+}
+
+/*
+ * rt_rx_done_task - run RX task
+ */
+static void
+rt_rx_done_task(void *context, int pending)
+{
+ struct rt_softc *sc;
+ struct ifnet *ifp;
+ int again;
+
+ sc = context;
+ ifp = sc->ifp;
+
+ RT_DPRINTF(sc, RT_DEBUG_RX, "Rx done task\n");
+
+ if (!(ifp->if_drv_flags & IFF_DRV_RUNNING))
+ return;
+
+ sc->intr_pending_mask &= ~INT_RX_DONE;
+
+ again = rt_rx_eof(sc, sc->rx_process_limit);
+
+ RT_SOFTC_LOCK(sc);
+
+ if ((sc->intr_pending_mask & INT_RX_DONE) || again) {
+ RT_DPRINTF(sc, RT_DEBUG_RX,
+ "Rx done task: scheduling again\n");
+ taskqueue_enqueue(sc->taskqueue, &sc->rx_done_task);
+ } else {
+ rt_intr_enable(sc, INT_RX_DONE);
+ }
+
+ RT_SOFTC_UNLOCK(sc);
+}
+
+/*
+ * rt_tx_done_task - check for pending TX task in all queues
+ */
+static void
+rt_tx_done_task(void *context, int pending)
+{
+ struct rt_softc *sc;
+ struct ifnet *ifp;
+ uint32_t intr_mask;
+ int i;
+
+ sc = context;
+ ifp = sc->ifp;
+
+ RT_DPRINTF(sc, RT_DEBUG_TX, "Tx done task\n");
+
+ if (!(ifp->if_drv_flags & IFF_DRV_RUNNING))
+ return;
+
+ for (i = RT_SOFTC_TX_RING_COUNT - 1; i >= 0; i--) {
+ if (sc->intr_pending_mask & (INT_TXQ0_DONE << i)) {
+ sc->intr_pending_mask &= ~(INT_TXQ0_DONE << i);
+ rt_tx_eof(sc, &sc->tx_ring[i]);
+ }
+ }
+
+ sc->tx_timer = 0;
+
+ ifp->if_drv_flags &= ~IFF_DRV_OACTIVE;
+
+ intr_mask = (
+ INT_TXQ3_DONE |
+ INT_TXQ2_DONE |
+ INT_TXQ1_DONE |
+ INT_TXQ0_DONE);
+
+ RT_SOFTC_LOCK(sc);
+
+ rt_intr_enable(sc, ~sc->intr_pending_mask &
+ (sc->intr_disable_mask & intr_mask));
+
+ if (sc->intr_pending_mask & intr_mask) {
+ RT_DPRINTF(sc, RT_DEBUG_TX,
+ "Tx done task: scheduling again\n");
+ taskqueue_enqueue(sc->taskqueue, &sc->tx_done_task);
+ }
+
+ RT_SOFTC_UNLOCK(sc);
+
+ if (!IFQ_IS_EMPTY(&ifp->if_snd))
+ rt_start(ifp);
+}
+
+/*
+ * rt_periodic_task - run periodic task
+ */
+static void
+rt_periodic_task(void *context, int pending)
+{
+ struct rt_softc *sc;
+ struct ifnet *ifp;
+
+ sc = context;
+ ifp = sc->ifp;
+
+ RT_DPRINTF(sc, RT_DEBUG_PERIODIC, "periodic task: round=%lu\n",
+ sc->periodic_round);
+
+ if (!(ifp->if_drv_flags & IFF_DRV_RUNNING))
+ return;
+
+ RT_SOFTC_LOCK(sc);
+ sc->periodic_round++;
+ rt_update_stats(sc);
+
+ if ((sc->periodic_round % 10) == 0) {
+ rt_update_raw_counters(sc);
+ rt_watchdog(sc);
+ }
+
+ RT_SOFTC_UNLOCK(sc);
+ callout_reset(&sc->periodic_ch, hz / 10, rt_periodic, sc);
+}
+
+/*
+ * rt_rx_eof - check for frames that done by DMA engine and pass it into
+ * network subsystem.
+ */
+static int
+rt_rx_eof(struct rt_softc *sc, int limit)
+{
+ struct ifnet *ifp;
+ struct rt_softc_rx_ring *ring;
+ struct rt_rxdesc *desc;
+ struct rt_softc_rx_data *data;
+ struct mbuf *m, *mnew;
+ bus_dma_segment_t segs[1];
+ bus_dmamap_t dma_map;
+ uint32_t index, desc_flags;
+ int error, nsegs, len, nframes;
+
+ ifp = sc->ifp;
+ ring = &sc->rx_ring;
+
+ nframes = 0;
+
+ while (limit != 0) {
+ index = RT_READ(sc, PDMA_BASE + RX_DRX_IDX0);
+ if (ring->cur == index)
+ break;
+
+ desc = &ring->desc[ring->cur];
+ data = &ring->data[ring->cur];
+
+ bus_dmamap_sync(ring->desc_dma_tag, ring->desc_dma_map,
+ BUS_DMASYNC_POSTREAD | BUS_DMASYNC_POSTWRITE);
+
+#ifdef IF_RT_DEBUG
+ if ( sc->debug & RT_DEBUG_RX ) {
+ printf("\nRX Descriptor[%#08x] dump:\n", (u_int)desc);
+ hexdump(desc, 16, 0, 0);
+ printf("-----------------------------------\n");
+ }
+#endif
+
+ /* XXX Sometime device don`t set DDONE bit */
+#ifdef DDONE_FIXED
+ if (!(desc->sdl0 & htole16(RT_RXDESC_SDL0_DDONE))) {
+ RT_DPRINTF(sc, RT_DEBUG_RX, "DDONE=0, try next\n");
+ break;
+ }
+#endif
+
+ len = le16toh(desc->sdl0) & 0x3fff;
+ RT_DPRINTF(sc, RT_DEBUG_RX, "new frame len=%d\n", len);
+
+ nframes++;
+
+ mnew = m_getjcl(M_DONTWAIT, MT_DATA, M_PKTHDR,
+ MJUMPAGESIZE);
+ if (mnew == NULL) {
+ sc->rx_mbuf_alloc_errors++;
+ ifp->if_ierrors++;
+ goto skip;
+ }
+
+ mnew->m_len = mnew->m_pkthdr.len = MJUMPAGESIZE;
+
+ error = bus_dmamap_load_mbuf_sg(ring->data_dma_tag,
+ ring->spare_dma_map, mnew, segs, &nsegs, BUS_DMA_NOWAIT);
+ if (error != 0) {
+ RT_DPRINTF(sc, RT_DEBUG_RX,
+ "could not load Rx mbuf DMA map: "
+ "error=%d, nsegs=%d\n",
+ error, nsegs);
+
+ m_freem(mnew);
+
+ sc->rx_mbuf_dmamap_errors++;
+ ifp->if_ierrors++;
+
+ goto skip;
+ }
+
+ KASSERT(nsegs == 1, ("%s: too many DMA segments",
+ device_get_nameunit(sc->dev)));
+
+ bus_dmamap_sync(ring->data_dma_tag, data->dma_map,
+ BUS_DMASYNC_POSTREAD);
+ bus_dmamap_unload(ring->data_dma_tag, data->dma_map);
+
+ dma_map = data->dma_map;
+ data->dma_map = ring->spare_dma_map;
+ ring->spare_dma_map = dma_map;
+
+ bus_dmamap_sync(ring->data_dma_tag, data->dma_map,
+ BUS_DMASYNC_PREREAD);
+
+ m = data->m;
+ desc_flags = desc->src;
+
+ data->m = mnew;
+ /* Add 2 for proper align of RX IP header */
+ desc->sdp0 = htole32(segs[0].ds_addr+2);
+ desc->sdl0 = htole32(segs[0].ds_len-2);
+ desc->src = 0;
+ desc->ai = 0;
+ desc->foe = 0;
+
+ RT_DPRINTF(sc, RT_DEBUG_RX,
+ "Rx frame: rxdesc flags=0x%08x\n", desc_flags);
+
+ m->m_pkthdr.rcvif = ifp;
+ /* Add 2 to fix data align, after sdp0 = addr + 2 */
+ m->m_data += 2;
+ m->m_pkthdr.len = m->m_len = len;
+
+ /* check for crc errors */
+ if ((ifp->if_capenable & IFCAP_RXCSUM) != 0) {
+ /*check for valid checksum*/
+ if (desc_flags & (RXDSXR_SRC_IP_CSUM_FAIL|
+ RXDSXR_SRC_L4_CSUM_FAIL)) {
+ RT_DPRINTF(sc, RT_DEBUG_RX,
+ "rxdesc: crc error\n");
+
+ ifp->if_ierrors++;
+
+ if (!(ifp->if_flags & IFF_PROMISC)) {
+ m_freem(m);
+ goto skip;
+ }
+ }
+ if ((desc_flags & RXDSXR_SRC_IP_CSUM_FAIL) != 0) {
+ m->m_pkthdr.csum_flags |= CSUM_IP_CHECKED;
+ m->m_pkthdr.csum_flags |= CSUM_IP_VALID;
+ m->m_pkthdr.csum_data = 0xffff;
+ }
+ m->m_flags &= ~M_HASFCS;
+ }
+
+ (*ifp->if_input)(ifp, m);
+skip:
+ desc->sdl0 &= ~htole16(RT_RXDESC_SDL0_DDONE);
+
+ bus_dmamap_sync(ring->desc_dma_tag, ring->desc_dma_map,
+ BUS_DMASYNC_PREREAD | BUS_DMASYNC_PREWRITE);
+
+ ring->cur = (ring->cur + 1) % RT_SOFTC_RX_RING_DATA_COUNT;
+
+ limit--;
+ }
+
+ if (ring->cur == 0)
+ RT_WRITE(sc, PDMA_BASE + RX_CALC_IDX0,
+ RT_SOFTC_RX_RING_DATA_COUNT - 1);
+ else
+ RT_WRITE(sc, PDMA_BASE + RX_CALC_IDX0,
+ ring->cur - 1);
+
+ RT_DPRINTF(sc, RT_DEBUG_RX, "Rx eof: nframes=%d\n", nframes);
+
+ sc->rx_packets += nframes;
+
+ return (limit == 0);
+}
+
+/*
+ * rt_tx_eof - check for successful transmitted frames and mark their
+ * descriptor as free.
+ */
+static void
+rt_tx_eof(struct rt_softc *sc, struct rt_softc_tx_ring *ring)
+{
+ struct ifnet *ifp;
+ struct rt_txdesc *desc;
+ struct rt_softc_tx_data *data;
+ uint32_t index;
+ int ndescs, nframes;
+
+ ifp = sc->ifp;
+
+ ndescs = 0;
+ nframes = 0;
+
+ for (;;) {
+ index = RT_READ(sc, PDMA_BASE + TX_DTX_IDX(ring->qid));
+ if (ring->desc_next == index)
+ break;
+
+ ndescs++;
+
+ desc = &ring->desc[ring->desc_next];
+
+ bus_dmamap_sync(ring->desc_dma_tag, ring->desc_dma_map,
+ BUS_DMASYNC_POSTREAD | BUS_DMASYNC_POSTWRITE);
+
+ if (desc->sdl0 & htole16(RT_TXDESC_SDL0_LASTSEG) ||
+ desc->sdl1 & htole16(RT_TXDESC_SDL1_LASTSEG)) {
+ nframes++;
+
+ data = &ring->data[ring->data_next];
+
+ bus_dmamap_sync(ring->data_dma_tag, data->dma_map,
+ BUS_DMASYNC_POSTWRITE);
+ bus_dmamap_unload(ring->data_dma_tag, data->dma_map);
+
+ m_freem(data->m);
+
+ data->m = NULL;
+
+ ifp->if_opackets++;
+
+ RT_SOFTC_TX_RING_LOCK(ring);
+ ring->data_queued--;
+ ring->data_next = (ring->data_next + 1) %
+ RT_SOFTC_TX_RING_DATA_COUNT;
+ RT_SOFTC_TX_RING_UNLOCK(ring);
+ }
+
+ desc->sdl0 &= ~htole16(RT_TXDESC_SDL0_DDONE);
+
+ bus_dmamap_sync(ring->desc_dma_tag, ring->desc_dma_map,
+ BUS_DMASYNC_PREREAD | BUS_DMASYNC_PREWRITE);
+
+ RT_SOFTC_TX_RING_LOCK(ring);
+ ring->desc_queued--;
+ ring->desc_next = (ring->desc_next + 1) %
+ RT_SOFTC_TX_RING_DESC_COUNT;
+ RT_SOFTC_TX_RING_UNLOCK(ring);
+ }
+
+ RT_DPRINTF(sc, RT_DEBUG_TX,
+ "Tx eof: qid=%d, ndescs=%d, nframes=%d\n", ring->qid, ndescs,
+ nframes);
+}
+
+/*
+ * rt_update_stats - query statistics counters and update related variables.
+ */
+static void
+rt_update_stats(struct rt_softc *sc)
+{
+ struct ifnet *ifp;
+
+ ifp = sc->ifp;
+ RT_DPRINTF(sc, RT_DEBUG_STATS, "update statistic: \n");
+ /* XXX do update stats here */
+}
+
+/*
+ * rt_watchdog - reinit device on watchdog event.
+ */
+static void
+rt_watchdog(struct rt_softc *sc)
+{
+ uint32_t tmp;
+#ifdef notyet
+ int ntries;
+#endif
+
+ tmp = RT_READ(sc, PSE_BASE + CDMA_OQ_STA);
+
+ RT_DPRINTF(sc, RT_DEBUG_WATCHDOG, "watchdog: PSE_IQ_STA=0x%08x\n",
+ tmp);
+
+ /* XXX: do not reset */
+#ifdef notyet
+ if (((tmp >> P0_IQ_PCNT_SHIFT) & 0xff) != 0) {
+ sc->tx_queue_not_empty[0]++;
+
+ for (ntries = 0; ntries < 10; ntries++) {
+ tmp = RT_READ(sc, PSE_BASE + PSE_IQ_STA);
+ if (((tmp >> P0_IQ_PCNT_SHIFT) & 0xff) == 0)
+ break;
+
+ DELAY(1);
+ }
+ }
+
+ if (((tmp >> P1_IQ_PCNT_SHIFT) & 0xff) != 0) {
+ sc->tx_queue_not_empty[1]++;
+
+ for (ntries = 0; ntries < 10; ntries++) {
+ tmp = RT_READ(sc, PSE_BASE + PSE_IQ_STA);
+ if (((tmp >> P1_IQ_PCNT_SHIFT) & 0xff) == 0)
+ break;
+
+ DELAY(1);
+ }
+ }
+#endif
+}
+
+/*
+ * rt_update_raw_counters - update counters.
+ */
+static void
+rt_update_raw_counters(struct rt_softc *sc)
+{
+
+ sc->tx_bytes += RT_READ(sc, CNTR_BASE + GDMA_TX_GBCNT0);
+ sc->tx_packets += RT_READ(sc, CNTR_BASE + GDMA_TX_GPCNT0);
+ sc->tx_skip += RT_READ(sc, CNTR_BASE + GDMA_TX_SKIPCNT0);
+ sc->tx_collision+= RT_READ(sc, CNTR_BASE + GDMA_TX_COLCNT0);
+
+ sc->rx_bytes += RT_READ(sc, CNTR_BASE + GDMA_RX_GBCNT0);
+ sc->rx_packets += RT_READ(sc, CNTR_BASE + GDMA_RX_GPCNT0);
+ sc->rx_crc_err += RT_READ(sc, CNTR_BASE + GDMA_RX_CSUM_ERCNT0);
+ sc->rx_short_err+= RT_READ(sc, CNTR_BASE + GDMA_RX_SHORT_ERCNT0);
+ sc->rx_long_err += RT_READ(sc, CNTR_BASE + GDMA_RX_LONG_ERCNT0);
+ sc->rx_phy_err += RT_READ(sc, CNTR_BASE + GDMA_RX_FERCNT0);
+ sc->rx_fifo_overflows+= RT_READ(sc, CNTR_BASE + GDMA_RX_OERCNT0);
+}
+
+static void
+rt_intr_enable(struct rt_softc *sc, uint32_t intr_mask)
+{
+ uint32_t tmp;
+
+ sc->intr_disable_mask &= ~intr_mask;
+ tmp = sc->intr_enable_mask & ~sc->intr_disable_mask;
+ RT_WRITE(sc, GE_PORT_BASE + FE_INT_ENABLE, tmp);
+}
+
+static void
+rt_intr_disable(struct rt_softc *sc, uint32_t intr_mask)
+{
+ uint32_t tmp;
+
+ sc->intr_disable_mask |= intr_mask;
+ tmp = sc->intr_enable_mask & ~sc->intr_disable_mask;
+ RT_WRITE(sc, GE_PORT_BASE + FE_INT_ENABLE, tmp);
+}
+
+/*
+ * rt_txrx_enable - enable TX/RX DMA
+ */
+static int
+rt_txrx_enable(struct rt_softc *sc)
+{
+ struct ifnet *ifp;
+ uint32_t tmp;
+ int ntries;
+
+ ifp = sc->ifp;
+
+ /* enable Tx/Rx DMA engine */
+ for (ntries = 0; ntries < 200; ntries++) {
+ tmp = RT_READ(sc, PDMA_BASE + PDMA_GLO_CFG);
+ if (!(tmp & (FE_TX_DMA_BUSY | FE_RX_DMA_BUSY)))
+ break;
+
+ DELAY(1000);
+ }
+
+ if (ntries == 200) {
+ device_printf(sc->dev, "timeout waiting for DMA engine\n");
+ return (-1);
+ }
+
+ DELAY(50);
+
+ tmp |= FE_TX_WB_DDONE | FE_RX_DMA_EN | FE_TX_DMA_EN;
+ RT_WRITE(sc, PDMA_BASE + PDMA_GLO_CFG, tmp);
+
+ /* XXX set Rx filter */
+ return (0);
+}
+
+/*
+ * rt_alloc_rx_ring - allocate RX DMA ring buffer
+ */
+static int
+rt_alloc_rx_ring(struct rt_softc *sc, struct rt_softc_rx_ring *ring)
+{
+ struct rt_rxdesc *desc;
+ struct rt_softc_rx_data *data;
+ bus_dma_segment_t segs[1];
+ int i, nsegs, error;
+
+ error = bus_dma_tag_create(bus_get_dma_tag(sc->dev), PAGE_SIZE, 0,
+ BUS_SPACE_MAXADDR_32BIT, BUS_SPACE_MAXADDR, NULL, NULL,
+ RT_SOFTC_RX_RING_DATA_COUNT * sizeof(struct rt_rxdesc), 1,
+ RT_SOFTC_RX_RING_DATA_COUNT * sizeof(struct rt_rxdesc),
+ 0, NULL, NULL, &ring->desc_dma_tag);
+ if (error != 0) {
+ device_printf(sc->dev,
+ "could not create Rx desc DMA tag\n");
+ goto fail;
+ }
+
+ error = bus_dmamem_alloc(ring->desc_dma_tag, (void **) &ring->desc,
+ BUS_DMA_NOWAIT | BUS_DMA_ZERO, &ring->desc_dma_map);
+ if (error != 0) {
+ device_printf(sc->dev,
+ "could not allocate Rx desc DMA memory\n");
+ goto fail;
+ }
+
+ error = bus_dmamap_load(ring->desc_dma_tag, ring->desc_dma_map,
+ ring->desc,
+ RT_SOFTC_RX_RING_DATA_COUNT * sizeof(struct rt_rxdesc),
+ rt_dma_map_addr, &ring->desc_phys_addr, 0);
+ if (error != 0) {
+ device_printf(sc->dev, "could not load Rx desc DMA map\n");
+ goto fail;
+ }
+
+ error = bus_dma_tag_create(bus_get_dma_tag(sc->dev), PAGE_SIZE, 0,
+ BUS_SPACE_MAXADDR_32BIT, BUS_SPACE_MAXADDR, NULL, NULL,
+ MJUMPAGESIZE, 1, MJUMPAGESIZE, 0, NULL, NULL,
+ &ring->data_dma_tag);
+ if (error != 0) {
+ device_printf(sc->dev,
+ "could not create Rx data DMA tag\n");
+ goto fail;
+ }
+
+ for (i = 0; i < RT_SOFTC_RX_RING_DATA_COUNT; i++) {
+ desc = &ring->desc[i];
+ data = &ring->data[i];
+
+ error = bus_dmamap_create(ring->data_dma_tag, 0,
+ &data->dma_map);
+ if (error != 0) {
+ device_printf(sc->dev, "could not create Rx data DMA "
+ "map\n");
+ goto fail;
+ }
+
+ data->m = m_getjcl(M_DONTWAIT, MT_DATA, M_PKTHDR,
+ MJUMPAGESIZE);
+ if (data->m == NULL) {
+ device_printf(sc->dev, "could not allocate Rx mbuf\n");
+ error = ENOMEM;
+ goto fail;
+ }
+
+ data->m->m_len = data->m->m_pkthdr.len = MJUMPAGESIZE;
+
+ error = bus_dmamap_load_mbuf_sg(ring->data_dma_tag,
+ data->dma_map, data->m, segs, &nsegs, BUS_DMA_NOWAIT);
+ if (error != 0) {
+ device_printf(sc->dev,
+ "could not load Rx mbuf DMA map\n");
+ goto fail;
+ }
+
+ KASSERT(nsegs == 1, ("%s: too many DMA segments",
+ device_get_nameunit(sc->dev)));
+
+ /* Add 2 for proper align of RX IP header */
+ desc->sdp0 = htole32(segs[0].ds_addr+2);
+ desc->sdl0 = htole32(segs[0].ds_len-2);
+ }
+
+ error = bus_dmamap_create(ring->data_dma_tag, 0,
+ &ring->spare_dma_map);
+ if (error != 0) {
+ device_printf(sc->dev,
+ "could not create Rx spare DMA map\n");
+ goto fail;
+ }
+
+ bus_dmamap_sync(ring->desc_dma_tag, ring->desc_dma_map,
+ BUS_DMASYNC_PREREAD | BUS_DMASYNC_PREWRITE);
+ return (0);
+
+fail:
+ rt_free_rx_ring(sc, ring);
+ return (error);
+}
+
+/*
+ * rt_reset_rx_ring - reset RX ring buffer
+ */
+static void
+rt_reset_rx_ring(struct rt_softc *sc, struct rt_softc_rx_ring *ring)
+{
+ struct rt_rxdesc *desc;
+ int i;
+
+ for (i = 0; i < RT_SOFTC_RX_RING_DATA_COUNT; i++) {
+ desc = &ring->desc[i];
+ desc->sdl0 &= ~htole16(RT_RXDESC_SDL0_DDONE);
+ }
+
+ bus_dmamap_sync(ring->desc_dma_tag, ring->desc_dma_map,
+ BUS_DMASYNC_PREREAD | BUS_DMASYNC_PREWRITE);
+ ring->cur = 0;
+}
+
+/*
+ * rt_free_rx_ring - free memory used by RX ring buffer
+ */
+static void
+rt_free_rx_ring(struct rt_softc *sc, struct rt_softc_rx_ring *ring)
+{
+ struct rt_softc_rx_data *data;
+ int i;
+
+ if (ring->desc != NULL) {
+ bus_dmamap_sync(ring->desc_dma_tag, ring->desc_dma_map,
+ BUS_DMASYNC_POSTWRITE);
+ bus_dmamap_unload(ring->desc_dma_tag, ring->desc_dma_map);
+ bus_dmamem_free(ring->desc_dma_tag, ring->desc,
+ ring->desc_dma_map);
+ }
+
+ if (ring->desc_dma_tag != NULL)
+ bus_dma_tag_destroy(ring->desc_dma_tag);
+
+ for (i = 0; i < RT_SOFTC_RX_RING_DATA_COUNT; i++) {
+ data = &ring->data[i];
+
+ if (data->m != NULL) {
+ bus_dmamap_sync(ring->data_dma_tag, data->dma_map,
+ BUS_DMASYNC_POSTREAD);
+ bus_dmamap_unload(ring->data_dma_tag, data->dma_map);
+ m_freem(data->m);
+ }
+
+ if (data->dma_map != NULL)
+ bus_dmamap_destroy(ring->data_dma_tag, data->dma_map);
+ }
+
+ if (ring->spare_dma_map != NULL)
+ bus_dmamap_destroy(ring->data_dma_tag, ring->spare_dma_map);
+
+ if (ring->data_dma_tag != NULL)
+ bus_dma_tag_destroy(ring->data_dma_tag);
+}
+
+/*
+ * rt_alloc_tx_ring - allocate TX ring buffer
+ */
+static int
+rt_alloc_tx_ring(struct rt_softc *sc, struct rt_softc_tx_ring *ring, int qid)
+{
+ struct rt_softc_tx_data *data;
+ int error, i;
+
+ mtx_init(&ring->lock, device_get_nameunit(sc->dev), NULL, MTX_DEF);
+
+ error = bus_dma_tag_create(bus_get_dma_tag(sc->dev), PAGE_SIZE, 0,
+ BUS_SPACE_MAXADDR_32BIT, BUS_SPACE_MAXADDR, NULL, NULL,
+ RT_SOFTC_TX_RING_DESC_COUNT * sizeof(struct rt_txdesc), 1,
+ RT_SOFTC_TX_RING_DESC_COUNT * sizeof(struct rt_txdesc),
+ 0, NULL, NULL, &ring->desc_dma_tag);
+ if (error != 0) {
+ device_printf(sc->dev,
+ "could not create Tx desc DMA tag\n");
+ goto fail;
+ }
+
+ error = bus_dmamem_alloc(ring->desc_dma_tag, (void **) &ring->desc,
+ BUS_DMA_NOWAIT | BUS_DMA_ZERO, &ring->desc_dma_map);
+ if (error != 0) {
+ device_printf(sc->dev,
+ "could not allocate Tx desc DMA memory\n");
+ goto fail;
+ }
+
+ error = bus_dmamap_load(ring->desc_dma_tag, ring->desc_dma_map,
+ ring->desc, (RT_SOFTC_TX_RING_DESC_COUNT *
+ sizeof(struct rt_txdesc)), rt_dma_map_addr,
+ &ring->desc_phys_addr, 0);
+ if (error != 0) {
+ device_printf(sc->dev, "could not load Tx desc DMA map\n");
+ goto fail;
+ }
+
+ ring->desc_queued = 0;
+ ring->desc_cur = 0;
+ ring->desc_next = 0;
+
+ error = bus_dma_tag_create(bus_get_dma_tag(sc->dev), PAGE_SIZE, 0,
+ BUS_SPACE_MAXADDR_32BIT, BUS_SPACE_MAXADDR, NULL, NULL,
+ RT_SOFTC_TX_RING_DATA_COUNT * RT_TX_DATA_SEG0_SIZE, 1,
+ RT_SOFTC_TX_RING_DATA_COUNT * RT_TX_DATA_SEG0_SIZE,
+ 0, NULL, NULL, &ring->seg0_dma_tag);
+ if (error != 0) {
+ device_printf(sc->dev,
+ "could not create Tx seg0 DMA tag\n");
+ goto fail;
+ }
+
+ error = bus_dmamem_alloc(ring->seg0_dma_tag, (void **) &ring->seg0,
+ BUS_DMA_NOWAIT | BUS_DMA_ZERO, &ring->seg0_dma_map);
+ if (error != 0) {
+ device_printf(sc->dev,
+ "could not allocate Tx seg0 DMA memory\n");
+ goto fail;
+ }
+
+ error = bus_dmamap_load(ring->seg0_dma_tag, ring->seg0_dma_map,
+ ring->seg0,
+ RT_SOFTC_TX_RING_DATA_COUNT * RT_TX_DATA_SEG0_SIZE,
+ rt_dma_map_addr, &ring->seg0_phys_addr, 0);
+ if (error != 0) {
+ device_printf(sc->dev, "could not load Tx seg0 DMA map\n");
+ goto fail;
+ }
+
+ error = bus_dma_tag_create(bus_get_dma_tag(sc->dev), PAGE_SIZE, 0,
+ BUS_SPACE_MAXADDR_32BIT, BUS_SPACE_MAXADDR, NULL, NULL,
+ MJUMPAGESIZE, RT_SOFTC_MAX_SCATTER, MJUMPAGESIZE, 0, NULL, NULL,
+ &ring->data_dma_tag);
+ if (error != 0) {
+ device_printf(sc->dev,
+ "could not create Tx data DMA tag\n");
+ goto fail;
+ }
+
+ for (i = 0; i < RT_SOFTC_TX_RING_DATA_COUNT; i++) {
+ data = &ring->data[i];
+
+ error = bus_dmamap_create(ring->data_dma_tag, 0,
+ &data->dma_map);
+ if (error != 0) {
+ device_printf(sc->dev, "could not create Tx data DMA "
+ "map\n");
+ goto fail;
+ }
+ }
+
+ ring->data_queued = 0;
+ ring->data_cur = 0;
+ ring->data_next = 0;
+
+ ring->qid = qid;
+ return (0);
+
+fail:
+ rt_free_tx_ring(sc, ring);
+ return (error);
+}
+
+/*
+ * rt_reset_tx_ring - reset TX ring buffer to empty state
+ */
+static void
+rt_reset_tx_ring(struct rt_softc *sc, struct rt_softc_tx_ring *ring)
+{
+ struct rt_softc_tx_data *data;
+ struct rt_txdesc *desc;
+ int i;
+
+ for (i = 0; i < RT_SOFTC_TX_RING_DESC_COUNT; i++) {
+ desc = &ring->desc[i];
+
+ desc->sdl0 = 0;
+ desc->sdl1 = 0;
+ }
+
+ ring->desc_queued = 0;
+ ring->desc_cur = 0;
+ ring->desc_next = 0;
+
+ bus_dmamap_sync(ring->desc_dma_tag, ring->desc_dma_map,
+ BUS_DMASYNC_PREWRITE);
+
+ bus_dmamap_sync(ring->seg0_dma_tag, ring->seg0_dma_map,
+ BUS_DMASYNC_PREWRITE);
+
+ for (i = 0; i < RT_SOFTC_TX_RING_DATA_COUNT; i++) {
+ data = &ring->data[i];
+
+ if (data->m != NULL) {
+ bus_dmamap_sync(ring->data_dma_tag, data->dma_map,
+ BUS_DMASYNC_POSTWRITE);
+ bus_dmamap_unload(ring->data_dma_tag, data->dma_map);
+ m_freem(data->m);
+ data->m = NULL;
+ }
+ }
+
+ ring->data_queued = 0;
+ ring->data_cur = 0;
+ ring->data_next = 0;
+}
+
+/*
+ * rt_free_tx_ring - free RX ring buffer
+ */
+static void
+rt_free_tx_ring(struct rt_softc *sc, struct rt_softc_tx_ring *ring)
+{
+ struct rt_softc_tx_data *data;
+ int i;
+
+ if (ring->desc != NULL) {
+ bus_dmamap_sync(ring->desc_dma_tag, ring->desc_dma_map,
+ BUS_DMASYNC_POSTWRITE);
+ bus_dmamap_unload(ring->desc_dma_tag, ring->desc_dma_map);
+ bus_dmamem_free(ring->desc_dma_tag, ring->desc,
+ ring->desc_dma_map);
+ }
+
+ if (ring->desc_dma_tag != NULL)
+ bus_dma_tag_destroy(ring->desc_dma_tag);
+
+ if (ring->seg0 != NULL) {
+ bus_dmamap_sync(ring->seg0_dma_tag, ring->seg0_dma_map,
+ BUS_DMASYNC_POSTWRITE);
+ bus_dmamap_unload(ring->seg0_dma_tag, ring->seg0_dma_map);
+ bus_dmamem_free(ring->seg0_dma_tag, ring->seg0,
+ ring->seg0_dma_map);
+ }
+
+ if (ring->seg0_dma_tag != NULL)
+ bus_dma_tag_destroy(ring->seg0_dma_tag);
+
+ for (i = 0; i < RT_SOFTC_TX_RING_DATA_COUNT; i++) {
+ data = &ring->data[i];
+
+ if (data->m != NULL) {
+ bus_dmamap_sync(ring->data_dma_tag, data->dma_map,
+ BUS_DMASYNC_POSTWRITE);
+ bus_dmamap_unload(ring->data_dma_tag, data->dma_map);
+ m_freem(data->m);
+ }
+
+ if (data->dma_map != NULL)
+ bus_dmamap_destroy(ring->data_dma_tag, data->dma_map);
+ }
+
+ if (ring->data_dma_tag != NULL)
+ bus_dma_tag_destroy(ring->data_dma_tag);
+
+ mtx_destroy(&ring->lock);
+}
+
+/*
+ * rt_dma_map_addr - get address of busdma segment
+ */
+static void
+rt_dma_map_addr(void *arg, bus_dma_segment_t *segs, int nseg, int error)
+{
+ if (error != 0)
+ return;
+
+ KASSERT(nseg == 1, ("too many DMA segments, %d should be 1", nseg));
+
+ *(bus_addr_t *) arg = segs[0].ds_addr;
+}
+
+/*
+ * rt_sysctl_attach - attach sysctl nodes for NIC counters.
+ */
+static void
+rt_sysctl_attach(struct rt_softc *sc)
+{
+ struct sysctl_ctx_list *ctx;
+ struct sysctl_oid *tree;
+ struct sysctl_oid *stats;
+
+ ctx = device_get_sysctl_ctx(sc->dev);
+ tree = device_get_sysctl_tree(sc->dev);
+
+ /* statistic counters */
+ stats = SYSCTL_ADD_NODE(ctx, SYSCTL_CHILDREN(tree), OID_AUTO,
+ "stats", CTLFLAG_RD, 0, "statistic");
+
+ SYSCTL_ADD_INT(ctx, SYSCTL_CHILDREN(stats), OID_AUTO,
+ "interrupts", CTLFLAG_RD, &sc->interrupts, 0,
+ "all interrupts");
+
+ SYSCTL_ADD_INT(ctx, SYSCTL_CHILDREN(stats), OID_AUTO,
+ "tx_coherent_interrupts", CTLFLAG_RD, &sc->tx_coherent_interrupts,
+ 0, "Tx coherent interrupts");
+
+ SYSCTL_ADD_INT(ctx, SYSCTL_CHILDREN(stats), OID_AUTO,
+ "rx_coherent_interrupts", CTLFLAG_RD, &sc->rx_coherent_interrupts,
+ 0, "Rx coherent interrupts");
+
+ SYSCTL_ADD_INT(ctx, SYSCTL_CHILDREN(stats), OID_AUTO,
+ "rx_interrupts", CTLFLAG_RD, &sc->rx_interrupts, 0,
+ "Rx interrupts");
+
+ SYSCTL_ADD_INT(ctx, SYSCTL_CHILDREN(stats), OID_AUTO,
+ "rx_delay_interrupts", CTLFLAG_RD, &sc->rx_delay_interrupts, 0,
+ "Rx delay interrupts");
+
+ SYSCTL_ADD_INT(ctx, SYSCTL_CHILDREN(stats), OID_AUTO,
+ "TXQ3_interrupts", CTLFLAG_RD, &sc->tx_interrupts[3], 0,
+ "Tx AC3 interrupts");
+
+ SYSCTL_ADD_INT(ctx, SYSCTL_CHILDREN(stats), OID_AUTO,
+ "TXQ2_interrupts", CTLFLAG_RD, &sc->tx_interrupts[2], 0,
+ "Tx AC2 interrupts");
+
+ SYSCTL_ADD_INT(ctx, SYSCTL_CHILDREN(stats), OID_AUTO,
+ "TXQ1_interrupts", CTLFLAG_RD, &sc->tx_interrupts[1], 0,
+ "Tx AC1 interrupts");
+
+ SYSCTL_ADD_INT(ctx, SYSCTL_CHILDREN(stats), OID_AUTO,
+ "TXQ0_interrupts", CTLFLAG_RD, &sc->tx_interrupts[0], 0,
+ "Tx AC0 interrupts");
+
+ SYSCTL_ADD_INT(ctx, SYSCTL_CHILDREN(stats), OID_AUTO,
+ "tx_delay_interrupts", CTLFLAG_RD, &sc->tx_delay_interrupts,
+ 0, "Tx delay interrupts");
+
+ SYSCTL_ADD_INT(ctx, SYSCTL_CHILDREN(stats), OID_AUTO,
+ "TXQ3_desc_queued", CTLFLAG_RD, &sc->tx_ring[3].desc_queued,
+ 0, "Tx AC3 descriptors queued");
+
+ SYSCTL_ADD_INT(ctx, SYSCTL_CHILDREN(stats), OID_AUTO,
+ "TXQ3_data_queued", CTLFLAG_RD, &sc->tx_ring[3].data_queued,
+ 0, "Tx AC3 data queued");
+
+ SYSCTL_ADD_INT(ctx, SYSCTL_CHILDREN(stats), OID_AUTO,
+ "TXQ2_desc_queued", CTLFLAG_RD, &sc->tx_ring[2].desc_queued,
+ 0, "Tx AC2 descriptors queued");
+
+ SYSCTL_ADD_INT(ctx, SYSCTL_CHILDREN(stats), OID_AUTO,
+ "TXQ2_data_queued", CTLFLAG_RD, &sc->tx_ring[2].data_queued,
+ 0, "Tx AC2 data queued");
+
+ SYSCTL_ADD_INT(ctx, SYSCTL_CHILDREN(stats), OID_AUTO,
+ "TXQ1_desc_queued", CTLFLAG_RD, &sc->tx_ring[1].desc_queued,
+ 0, "Tx AC1 descriptors queued");
+
+ SYSCTL_ADD_INT(ctx, SYSCTL_CHILDREN(stats), OID_AUTO,
+ "TXQ1_data_queued", CTLFLAG_RD, &sc->tx_ring[1].data_queued,
+ 0, "Tx AC1 data queued");
+
+ SYSCTL_ADD_INT(ctx, SYSCTL_CHILDREN(stats), OID_AUTO,
+ "TXQ0_desc_queued", CTLFLAG_RD, &sc->tx_ring[0].desc_queued,
+ 0, "Tx AC0 descriptors queued");
+
+ SYSCTL_ADD_INT(ctx, SYSCTL_CHILDREN(stats), OID_AUTO,
+ "TXQ0_data_queued", CTLFLAG_RD, &sc->tx_ring[0].data_queued,
+ 0, "Tx AC0 data queued");
+
+ SYSCTL_ADD_INT(ctx, SYSCTL_CHILDREN(stats), OID_AUTO,
+ "TXQ3_data_queue_full", CTLFLAG_RD, &sc->tx_data_queue_full[3],
+ 0, "Tx AC3 data queue full");
+
+ SYSCTL_ADD_INT(ctx, SYSCTL_CHILDREN(stats), OID_AUTO,
+ "TXQ2_data_queue_full", CTLFLAG_RD, &sc->tx_data_queue_full[2],
+ 0, "Tx AC2 data queue full");
+
+ SYSCTL_ADD_INT(ctx, SYSCTL_CHILDREN(stats), OID_AUTO,
+ "TXQ1_data_queue_full", CTLFLAG_RD, &sc->tx_data_queue_full[1],
+ 0, "Tx AC1 data queue full");
+
+ SYSCTL_ADD_INT(ctx, SYSCTL_CHILDREN(stats), OID_AUTO,
+ "TXQ0_data_queue_full", CTLFLAG_RD, &sc->tx_data_queue_full[0],
+ 0, "Tx AC0 data queue full");
+
+ SYSCTL_ADD_INT(ctx, SYSCTL_CHILDREN(stats), OID_AUTO,
+ "tx_watchdog_timeouts", CTLFLAG_RD, &sc->tx_watchdog_timeouts,
+ 0, "Tx watchdog timeouts");
+
+ SYSCTL_ADD_INT(ctx, SYSCTL_CHILDREN(stats), OID_AUTO,
+ "tx_defrag_packets", CTLFLAG_RD, &sc->tx_defrag_packets, 0,
+ "Tx defragmented packets");
+
+ SYSCTL_ADD_INT(ctx, SYSCTL_CHILDREN(stats), OID_AUTO,
+ "no_tx_desc_avail", CTLFLAG_RD, &sc->no_tx_desc_avail, 0,
+ "no Tx descriptors available");
+
+ SYSCTL_ADD_INT(ctx, SYSCTL_CHILDREN(stats), OID_AUTO,
+ "rx_mbuf_alloc_errors", CTLFLAG_RD, &sc->rx_mbuf_alloc_errors,
+ 0, "Rx mbuf allocation errors");
+
+ SYSCTL_ADD_INT(ctx, SYSCTL_CHILDREN(stats), OID_AUTO,
+ "rx_mbuf_dmamap_errors", CTLFLAG_RD, &sc->rx_mbuf_dmamap_errors,
+ 0, "Rx mbuf DMA mapping errors");
+
+ SYSCTL_ADD_INT(ctx, SYSCTL_CHILDREN(stats), OID_AUTO,
+ "tx_queue_0_not_empty", CTLFLAG_RD, &sc->tx_queue_not_empty[0],
+ 0, "Tx queue 0 not empty");
+
+ SYSCTL_ADD_INT(ctx, SYSCTL_CHILDREN(stats), OID_AUTO,
+ "tx_queue_1_not_empty", CTLFLAG_RD, &sc->tx_queue_not_empty[1],
+ 0, "Tx queue 1 not empty");
+
+ SYSCTL_ADD_INT(ctx, SYSCTL_CHILDREN(stats), OID_AUTO,
+ "rx_packets", CTLFLAG_RD, &sc->rx_packets, 0,
+ "Rx packets");
+
+ SYSCTL_ADD_INT(ctx, SYSCTL_CHILDREN(stats), OID_AUTO,
+ "rx_crc_errors", CTLFLAG_RD, &sc->rx_crc_err, 0,
+ "Rx CRC errors");
+
+ SYSCTL_ADD_INT(ctx, SYSCTL_CHILDREN(stats), OID_AUTO,
+ "rx_phy_errors", CTLFLAG_RD, &sc->rx_phy_err, 0,
+ "Rx PHY errors");
+
+ SYSCTL_ADD_INT(ctx, SYSCTL_CHILDREN(stats), OID_AUTO,
+ "rx_dup_packets", CTLFLAG_RD, &sc->rx_dup_packets, 0,
+ "Rx duplicate packets");
+
+ SYSCTL_ADD_INT(ctx, SYSCTL_CHILDREN(stats), OID_AUTO,
+ "rx_fifo_overflows", CTLFLAG_RD, &sc->rx_fifo_overflows, 0,
+ "Rx FIFO overflows");
+
+ SYSCTL_ADD_INT(ctx, SYSCTL_CHILDREN(stats), OID_AUTO,
+ "rx_bytes", CTLFLAG_RD, &sc->rx_bytes, 0,
+ "Rx bytes");
+
+ SYSCTL_ADD_INT(ctx, SYSCTL_CHILDREN(stats), OID_AUTO,
+ "rx_long_err", CTLFLAG_RD, &sc->rx_long_err, 0,
+ "Rx too long frame errors");
+
+ SYSCTL_ADD_INT(ctx, SYSCTL_CHILDREN(stats), OID_AUTO,
+ "rx_short_err", CTLFLAG_RD, &sc->rx_short_err, 0,
+ "Rx too short frame errors");
+
+ SYSCTL_ADD_INT(ctx, SYSCTL_CHILDREN(stats), OID_AUTO,
+ "tx_bytes", CTLFLAG_RD, &sc->tx_bytes, 0,
+ "Tx bytes");
+ SYSCTL_ADD_INT(ctx, SYSCTL_CHILDREN(stats), OID_AUTO,
+ "tx_packets", CTLFLAG_RD, &sc->tx_packets, 0,
+ "Tx packets");
+ SYSCTL_ADD_INT(ctx, SYSCTL_CHILDREN(stats), OID_AUTO,
+ "tx_skip", CTLFLAG_RD, &sc->tx_skip, 0,
+ "Tx skip count for GDMA ports");
+ SYSCTL_ADD_INT(ctx, SYSCTL_CHILDREN(stats), OID_AUTO,
+ "tx_collision", CTLFLAG_RD, &sc->tx_collision, 0,
+ "Tx collision count for GDMA ports");
+}
+
+#ifdef IF_RT_PHY_SUPPORT
+static int
+rt_miibus_readreg(device_t dev, int phy, int reg)
+{
+ struct rt_softc *sc = device_get_softc(dev);
+
+ /*
+ * PSEUDO_PHYAD is a special value for indicate switch attached.
+ * No one PHY use PSEUDO_PHYAD (0x1e) address.
+ */
+ if (phy == 31) {
+ /* Fake PHY ID for bfeswitch attach */
+ switch (reg) {
+ case MII_BMSR:
+ return (BMSR_EXTSTAT|BMSR_MEDIAMASK);
+ case MII_PHYIDR1:
+ return (0x40); /* As result of faking */
+ case MII_PHYIDR2: /* PHY will detect as */
+ return (0x6250); /* bfeswitch */
+ }
+ }
+
+ /* Wait prev command done if any */
+ while (RT_READ(sc, MDIO_ACCESS) & MDIO_CMD_ONGO);
+ RT_WRITE(sc, MDIO_ACCESS,
+ MDIO_CMD_ONGO ||
+ ((phy << MDIO_PHY_ADDR_SHIFT) & MDIO_PHY_ADDR_MASK) ||
+ ((reg << MDIO_PHYREG_ADDR_SHIFT) & MDIO_PHYREG_ADDR_MASK));
+ while (RT_READ(sc, MDIO_ACCESS) & MDIO_CMD_ONGO);
+
+ return (RT_READ(sc, MDIO_ACCESS) & MDIO_PHY_DATA_MASK);
+}
+
+static int
+rt_miibus_writereg(device_t dev, int phy, int reg, int val)
+{
+ struct rt_softc *sc = device_get_softc(dev);
+
+ /* Wait prev command done if any */
+ while (RT_READ(sc, MDIO_ACCESS) & MDIO_CMD_ONGO);
+ RT_WRITE(sc, MDIO_ACCESS,
+ MDIO_CMD_ONGO || MDIO_CMD_WR ||
+ ((phy << MDIO_PHY_ADDR_SHIFT) & MDIO_PHY_ADDR_MASK) ||
+ ((reg << MDIO_PHYREG_ADDR_SHIFT) & MDIO_PHYREG_ADDR_MASK) ||
+ (val & MDIO_PHY_DATA_MASK));
+ while (RT_READ(sc, MDIO_ACCESS) & MDIO_CMD_ONGO);
+
+ return (0);
+}
+
+void
+rt_miibus_statchg(device_t dev)
+{
+ struct rt_softc *sc = device_get_softc(dev);
+ struct mii_data *mii;
+
+ mii = device_get_softc(sc->rt_miibus);
+
+ if ((mii->mii_media_status & (IFM_ACTIVE | IFM_AVALID)) ==
+ (IFM_ACTIVE | IFM_AVALID)) {
+ switch (IFM_SUBTYPE(mii->mii_media_active)) {
+ case IFM_10_T:
+ case IFM_100_TX:
+ /* XXX check link here */
+ sc->flags |= 1;
+ break;
+ default:
+ break;
+ }
+ }
+}
+#endif /* IF_RT_PHY_SUPPORT */
+
+static device_method_t rt_dev_methods[] =
+{
+ DEVMETHOD(device_probe, rt_probe),
+ DEVMETHOD(device_attach, rt_attach),
+ DEVMETHOD(device_detach, rt_detach),
+ DEVMETHOD(device_shutdown, rt_shutdown),
+ DEVMETHOD(device_suspend, rt_suspend),
+ DEVMETHOD(device_resume, rt_resume),
+
+ /* bus interface */
+ DEVMETHOD(bus_print_child, bus_generic_print_child),
+ DEVMETHOD(bus_driver_added, bus_generic_driver_added),
+
+#ifdef IF_RT_PHY_SUPPORT
+ /* MII interface */
+ DEVMETHOD(miibus_readreg, rt_miibus_readreg),
+ DEVMETHOD(miibus_writereg, rt_miibus_writereg),
+ DEVMETHOD(miibus_statchg, rt_miibus_statchg),
+#endif
+ { 0, 0 }
+};
+
+static driver_t rt_driver =
+{
+ "rt",
+ rt_dev_methods,
+ sizeof(struct rt_softc)
+};
+
+static devclass_t rt_dev_class;
+
+DRIVER_MODULE(rt, nexus, rt_driver, rt_dev_class, 0, 0);
+MODULE_DEPEND(rt, ether, 1, 1, 1);
+MODULE_DEPEND(rt, miibus, 1, 1, 1);
+
diff --git a/sys/dev/rt/if_rtreg.h b/sys/dev/rt/if_rtreg.h
new file mode 100644
index 0000000..65b4a8c
--- /dev/null
+++ b/sys/dev/rt/if_rtreg.h
@@ -0,0 +1,289 @@
+/*-
+ * Copyright (c) 2009, Aleksandr Rybalko
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice unmodified, this list of conditions, and the following
+ * disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * $FreeBSD$
+ */
+
+#ifndef _IF_RTREG_H_
+#define _IF_RTREG_H_
+
+#define RT_READ(sc, reg) \
+ bus_space_read_4((sc)->bst, (sc)->bsh, reg)
+
+#define RT_WRITE(sc, reg, val) \
+ bus_space_write_4((sc)->bst, (sc)->bsh, reg, val)
+
+#define GE_PORT_BASE 0x0000
+
+#define MDIO_ACCESS 0x00
+#define MDIO_CMD_ONGO (1<<31)
+#define MDIO_CMD_WR (1<<30)
+#define MDIO_PHY_ADDR_MASK 0x1f000000
+#define MDIO_PHY_ADDR_SHIFT 24
+#define MDIO_PHYREG_ADDR_MASK 0x001f0000
+#define MDIO_PHYREG_ADDR_SHIFT 16
+#define MDIO_PHY_DATA_MASK 0x0000ffff
+#define MDIO_PHY_DATA_SHIFT 0
+
+#define FE_GLO_CFG 0x08 /*Frame Engine Global Configuration */
+#define EXT_VLAN_TYPE_MASK 0xffff0000
+#define EXT_VLAN_TYPE_SHIFT 16
+#define EXT_VLAN_TYPE_DFLT 0x81000000
+#define US_CYC_CNT_MASK 0x0000ff00
+#define US_CYC_CNT_SHIFT 8
+#define US_CYC_CNT_DFLT (132<<8) /* sys clocks per 1uS */
+#define L2_SPACE (8<<4) /* L2 space. Unit is 8 bytes */
+
+#define FE_RST_GLO 0x0C /*Frame Engine Global Reset*/
+#define FC_DROP_CNT_MASK 0xffff0000 /*Flow cntrl drop count */
+#define FC_DROP_CNT_SHIFT 16
+#define PSE_RESET (1<<0)
+
+#define FE_INT_STATUS 0x10
+#define CNT_PPE_AF (1<<31)
+#define CNT_GDM_AF (1<<29)
+#define PSE_P2_FC (1<<26)
+#define GDM_CRC_DROP (1<<25)
+#define PSE_BUF_DROP (1<<24)
+#define GDM_OTHER_DROP (1<<23)
+#define PSE_P1_FC (1<<22)
+#define PSE_P0_FC (1<<21)
+#define PSE_FQ_EMPTY (1<<20)
+#define INT_TX_COHERENT (1<<17)
+#define INT_RX_COHERENT (1<<16)
+#define INT_TXQ3_DONE (1<<11)
+#define INT_TXQ2_DONE (1<<10)
+#define INT_TXQ1_DONE (1<<9)
+#define INT_TXQ0_DONE (1<<8)
+#define INT_RX_DONE (1<<2)
+#define TX_DLY_INT (1<<1) /* TXQ[0|1]_DONE with delay */
+#define RX_DLY_INT (1<<0) /* RX_DONE with delay */
+#define FE_INT_ENABLE 0x14
+#define MDIO_CFG2 0x18
+#define FOE_TS_T 0x1c
+#define PSE_FQ_PCNT_MASK 0xff000000
+#define PSE_FQ_PCNT_SHIFT 24
+#define FOE_TS_TIMESTAMP_MASK 0x0000ffff
+#define FOE_TS_TIMESTAMP_SHIFT 0
+
+#define GDMA1_BASE 0x0020
+#define GDMA2_BASE 0x0060
+#define CDMA_BASE 0x0080
+
+#define GDMA_FWD_CFG 0x00 /* Only GDMA */
+#define GDM_DROP_256B (1<<23)
+#define GDM_ICS_EN (1<<22)
+#define GDM_TCS_EN (1<<21)
+#define GDM_UCS_EN (1<<20)
+#define GDM_DISPAD (1<<18)
+#define GDM_DISCRC (1<<17)
+#define GDM_STRPCRC (1<<16)
+#define GDM_UFRC_P_SHIFT 12
+#define GDM_BFRC_P_SHIFT 8
+#define GDM_MFRC_P_SHIFT 4
+#define GDM_OFRC_P_SHIFT 0
+#define GDM_XFRC_P_MASK 0x07
+#define GDM_DST_PORT_CPU 0
+#define GDM_DST_PORT_GDMA1 1
+#define GDM_DST_PORT_GDMA2 2
+#define GDM_DST_PORT_PPE 6
+#define GDM_DST_PORT_DISCARD 7
+
+#define CDMA_CSG_CFG 0x00 /* Only CDMA */
+#define INS_VLAN_TAG (0x8100<<16)
+#define ICS_GEN_EN (1<<2)
+#define TCS_GEN_EN (1<<1)
+#define UCS_GEN_EN (1<<0)
+
+#define GDMA_SCH_CFG 0x04
+#define GDM1_SCH_MOD_MASK 0x03000000
+#define GDM1_SCH_MOD_SHIFT 24
+#define GDM1_SCH_MOD_WRR 0
+#define GDM1_SCH_MOD_STRICT 1
+#define GDM1_SCH_MOD_MIXED 2
+#define GDM1_WT_1 0
+#define GDM1_WT_2 1
+#define GDM1_WT_4 2
+#define GDM1_WT_8 3
+#define GDM1_WT_16 4
+#define GDM1_WT_Q3_SHIFT 12
+#define GDM1_WT_Q2_SHIFT 8
+#define GDM1_WT_Q1_SHIFT 4
+#define GDM1_WT_Q0_SHIFT 0
+
+#define GDMA_SHPR_CFG 0x08
+#define GDM1_SHPR_EN (1<<24)
+#define GDM1_BK_SIZE_MASK 0x00ff0000 /* Bucket size 1kB units */
+#define GDM1_BK_SIZE_SHIFT 16
+#define GDM1_TK_RATE_MASK 0x00003fff /* Shaper token rate 8B/ms units */
+#define GDM1_TK_RATE_SHIFT 0
+
+#define GDMA_MAC_ADRL 0x0C
+#define GDMA_MAC_ADRH 0x10
+
+#define PPPOE_SID_0001 0x08 /* 0..15 SID0, 15..31 SID1 */
+#define PPPOE_SID_0203 0x0c
+#define PPPOE_SID_0405 0x10
+#define PPPOE_SID_0607 0x14
+#define PPPOE_SID_0809 0x18
+#define PPPOE_SID_1011 0x1c
+#define PPPOE_SID_1213 0x20
+#define PPPOE_SID_1415 0x24
+#define VLAN_ID_0001 0x28 /* 0..11 VID0, 15..26 VID1 */
+#define VLAN_ID_0203 0x2c
+#define VLAN_ID_0405 0x30
+#define VLAN_ID_0607 0x34
+#define VLAN_ID_0809 0x38
+#define VLAN_ID_1011 0x3c
+#define VLAN_ID_1213 0x40
+#define VLAN_ID_1415 0x44
+
+#define PSE_BASE 0x0040
+#define PSE_FQFC_CFG 0x00
+#define FQ_MAX_PCNT_MASK 0xff000000
+#define FQ_MAX_PCNT_SHIFT 24
+#define FQ_FC_RLS_MASK 0x00ff0000
+#define FQ_FC_RLS_SHIFT 16
+#define FQ_FC_ASRT_MASK 0x0000ff00
+#define FQ_FC_ASRT_SHIFT 8
+#define FQ_FC_DROP_MASK 0x000000ff
+#define FQ_FC_DROP_SHIFT 0
+
+#define CDMA_FC_CFG 0x04
+#define GDMA1_FC_CFG 0x08
+#define GDMA2_FC_CFG 0x0C
+#define P_SHARING (1<<28)
+#define P_HQ_DEF_MASK 0x0f000000
+#define P_HQ_DEF_SHIFT 24
+#define P_HQ_RESV_MASK 0x00ff0000
+#define P_HQ_RESV_SHIFT 16
+#define P_LQ_RESV_MASK 0x0000ff00
+#define P_LQ_RESV_SHIFT 8
+#define P_IQ_ASRT_MASK 0x000000ff
+#define P_IQ_ASRT_SHIFT 0
+
+#define CDMA_OQ_STA 0x10
+#define GDMA1_OQ_STA 0x14
+#define GDMA2_OQ_STA 0x18
+#define P_OQ3_PCNT_MASK 0xff000000
+#define P_OQ3_PCNT_SHIFT 24
+#define P_OQ2_PCNT_MASK 0x00ff0000
+#define P_OQ2_PCNT_SHIFT 16
+#define P_OQ1_PCNT_MASK 0x0000ff00
+#define P_OQ1_PCNT_SHIFT 8
+#define P_OQ0_PCNT_MASK 0x000000ff
+#define P_OQ0_PCNT_SHIFT 0
+
+#define PSE_IQ_STA 0x1C
+#define P6_OQ0_PCNT_MASK 0xff000000
+#define P6_OQ0_PCNT_SHIFT 24
+#define P2_IQ_PCNT_MASK 0x00ff0000
+#define P2_IQ_PCNT_SHIFT 16
+#define P1_IQ_PCNT_MASK 0x0000ff00
+#define P1_IQ_PCNT_SHIFT 8
+#define P0_IQ_PCNT_MASK 0x000000ff
+#define P0_IQ_PCNT_SHIFT 0
+
+#define PDMA_BASE 0x0100
+#define PDMA_GLO_CFG 0x00
+#define FE_TX_WB_DDONE (1<<6)
+#define FE_DMA_BT_SIZE4 (0<<4)
+#define FE_DMA_BT_SIZE8 (1<<4)
+#define FE_DMA_BT_SIZE16 (2<<4)
+#define FE_RX_DMA_BUSY (1<<3)
+#define FE_RX_DMA_EN (1<<2)
+#define FE_TX_DMA_BUSY (1<<1)
+#define FE_TX_DMA_EN (1<<0)
+#define PDMA_RST_IDX 0x04
+#define FE_RST_DRX_IDX0 (1<<16)
+#define FE_RST_DTX_IDX3 (1<<3)
+#define FE_RST_DTX_IDX2 (1<<2)
+#define FE_RST_DTX_IDX1 (1<<1)
+#define FE_RST_DTX_IDX0 (1<<0)
+
+#define PDMA_SCH_CFG 0x08
+#define DELAY_INT_CFG 0x0C
+#define TXDLY_INT_EN (1<<31)
+#define TXMAX_PINT_SHIFT 24
+#define TXMAX_PTIME_SHIFT 16
+#define RXDLY_INT_EN (1<<15)
+#define RXMAX_PINT_SHIFT 8
+#define RXMAX_PTIME_SHIFT 0
+
+#define TX_BASE_PTR0 0x10
+#define TX_MAX_CNT0 0x14
+#define TX_CTX_IDX0 0x18
+#define TX_DTX_IDX0 0x1C
+
+#define TX_BASE_PTR1 0x20
+#define TX_MAX_CNT1 0x24
+#define TX_CTX_IDX1 0x28
+#define TX_DTX_IDX1 0x2C
+
+#define RX_BASE_PTR0 0x30
+#define RX_MAX_CNT0 0x34
+#define RX_CALC_IDX0 0x38
+#define RX_DRX_IDX0 0x3C
+
+#define TX_BASE_PTR2 0x40
+#define TX_MAX_CNT2 0x44
+#define TX_CTX_IDX2 0x48
+#define TX_DTX_IDX2 0x4C
+
+#define TX_BASE_PTR3 0x50
+#define TX_MAX_CNT3 0x54
+#define TX_CTX_IDX3 0x58
+#define TX_DTX_IDX3 0x5C
+
+#define TX_BASE_PTR(qid) (((qid>1)?(0x20):(0x10)) + (qid) * 16)
+#define TX_MAX_CNT(qid) (((qid>1)?(0x24):(0x14)) + (qid) * 16)
+#define TX_CTX_IDX(qid) (((qid>1)?(0x28):(0x18)) + (qid) * 16)
+#define TX_DTX_IDX(qid) (((qid>1)?(0x2c):(0x1c)) + (qid) * 16)
+
+#define PPE_BASE 0x0200
+
+#define CNTR_BASE 0x0400
+#define PPE_AC_BCNT0 0x000
+#define PPE_AC_PCNT0 0x004
+#define PPE_AC_BCNT63 0x1F8
+#define PPE_AC_PCNT63 0x1FC
+#define PPE_MTR_CNT0 0x200
+#define PPE_MTR_CNT63 0x2FC
+#define GDMA_TX_GBCNT0 0x300
+#define GDMA_TX_GPCNT0 0x304
+#define GDMA_TX_SKIPCNT0 0x308
+#define GDMA_TX_COLCNT0 0x30C
+#define GDMA_RX_GBCNT0 0x320
+#define GDMA_RX_GPCNT0 0x324
+#define GDMA_RX_OERCNT0 0x328
+#define GDMA_RX_FERCNT0 0x32C
+#define GDMA_RX_SHORT_ERCNT0 0x330
+#define GDMA_RX_LONG_ERCNT0 0x334
+#define GDMA_RX_CSUM_ERCNT0 0x338
+
+#define POLICYTABLE_BASE 0x1000
+
+#endif /* _IF_RTREG_H_ */
diff --git a/sys/dev/rt/if_rtvar.h b/sys/dev/rt/if_rtvar.h
new file mode 100644
index 0000000..bd21158
--- /dev/null
+++ b/sys/dev/rt/if_rtvar.h
@@ -0,0 +1,282 @@
+/*-
+ * Copyright (c) 2010-2011 Aleksandr Rybalko <ray@ddteam.net>
+ * Copyright (c) 2009-2010 Alexander Egorenkov <egorenar@gmail.com>
+ * Copyright (c) 2009 Damien Bergamini <damien.bergamini@free.fr>
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice unmodified, this list of conditions, and the following
+ * disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * $FreeBSD$
+ */
+
+#ifndef _IF_RTVAR_H_
+#define _IF_RTVAR_H_
+
+#include <sys/param.h>
+#include <sys/sysctl.h>
+#include <sys/sockio.h>
+#include <sys/mbuf.h>
+#include <sys/kernel.h>
+#include <sys/socket.h>
+#include <sys/systm.h>
+#include <sys/malloc.h>
+#include <sys/taskqueue.h>
+#include <sys/module.h>
+#include <sys/bus.h>
+#include <sys/endian.h>
+
+#include <machine/bus.h>
+#include <machine/resource.h>
+#include <sys/rman.h>
+
+#include <net/bpf.h>
+#include <net/if.h>
+#include <net/if_arp.h>
+#include <net/ethernet.h>
+#include <net/if_dl.h>
+#include <net/if_media.h>
+#include <net/if_types.h>
+
+#include "opt_if_rt.h"
+
+#define RT_SOFTC_LOCK(sc) mtx_lock(&(sc)->lock)
+#define RT_SOFTC_UNLOCK(sc) mtx_unlock(&(sc)->lock)
+#define RT_SOFTC_ASSERT_LOCKED(sc) mtx_assert(&(sc)->lock, MA_OWNED)
+
+#define RT_SOFTC_TX_RING_LOCK(ring) mtx_lock(&(ring)->lock)
+#define RT_SOFTC_TX_RING_UNLOCK(ring) mtx_unlock(&(ring)->lock)
+#define RT_SOFTC_TX_RING_ASSERT_LOCKED(ring) \
+ mtx_assert(&(ring)->lock, MA_OWNED)
+
+#define RT_SOFTC_TX_RING_COUNT 4
+
+#ifndef IF_RT_RING_DATA_COUNT
+#define IF_RT_RING_DATA_COUNT 128
+#endif
+
+#define RT_SOFTC_RX_RING_DATA_COUNT IF_RT_RING_DATA_COUNT
+
+#define RT_SOFTC_MAX_SCATTER 10
+
+#define RT_SOFTC_TX_RING_DATA_COUNT (IF_RT_RING_DATA_COUNT/4)
+#define RT_SOFTC_TX_RING_DESC_COUNT \
+ (RT_SOFTC_TX_RING_DATA_COUNT * RT_SOFTC_MAX_SCATTER)
+
+#define RT_TXDESC_SDL1_BURST (1 << 15)
+#define RT_TXDESC_SDL1_LASTSEG (1 << 14)
+#define RT_TXDESC_SDL0_DDONE (1 << 15)
+#define RT_TXDESC_SDL0_LASTSEG (1 << 14)
+struct rt_txdesc
+{
+ uint32_t sdp0;
+ uint16_t sdl1;
+ uint16_t sdl0;
+ uint32_t sdp1;
+ uint8_t vid;
+#define TXDSCR_INS_VLAN_TAG 0x80
+#define TXDSCR_VLAN_PRIO_MASK 0x70
+#define TXDSCR_VLAN_IDX_MASK 0x0f
+ uint8_t pppoe;
+#define TXDSCR_USR_DEF_FLD 0x80
+#define TXDSCR_INS_PPPOE_HDR 0x10
+#define TXDSCR_PPPOE_SID_MASK 0x0f
+ uint8_t qn;
+#define TXDSCR_QUEUE_MASK 0x07
+ uint8_t dst;
+#define TXDSCR_IP_CSUM_GEN 0x80
+#define TXDSCR_UDP_CSUM_GEN 0x40
+#define TXDSCR_TCP_CSUM_GEN 0x20
+#define TXDSCR_DST_PORT_MASK 0x07
+#define TXDSCR_DST_PORT_CPU 0x00
+#define TXDSCR_DST_PORT_GDMA1 0x01
+#define TXDSCR_DST_PORT_GDMA2 0x02
+#define TXDSCR_DST_PORT_PPE 0x06
+#define TXDSCR_DST_PORT_DISC 0x07
+} __packed;
+
+#define RT_RXDESC_SDL0_DDONE (1 << 15)
+struct rt_rxdesc
+{
+ uint32_t sdp0;
+ uint16_t sdl1;
+ uint16_t sdl0;
+ uint32_t sdp1;
+ uint16_t foe;
+#define RXDSXR_FOE_ENTRY_VALID 0x40
+#define RXDSXR_FOE_ENTRY_MASK 0x3f
+ uint8_t ai;
+#define RXDSXR_AI_COU_REASON 0xff
+#define RXDSXR_AI_PARSER_RSLT_MASK 0xff
+ uint8_t src;
+#define RXDSXR_SRC_IPFVLD 0x80
+#define RXDSXR_SRC_L4FVLD 0x40
+#define RXDSXR_SRC_IP_CSUM_FAIL 0x20
+#define RXDSXR_SRC_L4_CSUM_FAIL 0x10
+#define RXDSXR_SRC_AIS 0x08
+#define RXDSXR_SRC_PORT_MASK 0x07
+} __packed;
+
+struct rt_softc_rx_data
+{
+ bus_dmamap_t dma_map;
+ struct mbuf *m;
+};
+
+struct rt_softc_rx_ring
+{
+ bus_dma_tag_t desc_dma_tag;
+ bus_dmamap_t desc_dma_map;
+ bus_addr_t desc_phys_addr;
+ struct rt_rxdesc *desc;
+ bus_dma_tag_t data_dma_tag;
+ bus_dmamap_t spare_dma_map;
+ struct rt_softc_rx_data data[RT_SOFTC_RX_RING_DATA_COUNT];
+ int cur;
+};
+
+struct rt_softc_tx_data
+{
+ bus_dmamap_t dma_map;
+ struct mbuf *m;
+};
+
+struct rt_softc_tx_ring
+{
+ struct mtx lock;
+ bus_dma_tag_t desc_dma_tag;
+ bus_dmamap_t desc_dma_map;
+ bus_addr_t desc_phys_addr;
+ struct rt_txdesc *desc;
+ int desc_queued;
+ int desc_cur;
+ int desc_next;
+ bus_dma_tag_t seg0_dma_tag;
+ bus_dmamap_t seg0_dma_map;
+ bus_addr_t seg0_phys_addr;
+ uint8_t *seg0;
+ bus_dma_tag_t data_dma_tag;
+ struct rt_softc_tx_data data[RT_SOFTC_TX_RING_DATA_COUNT];
+ int data_queued;
+ int data_cur;
+ int data_next;
+ int qid;
+};
+
+struct rt_softc
+{
+ device_t dev;
+ struct mtx lock;
+ uint32_t flags;
+
+ int mem_rid;
+ struct resource *mem;
+ int irq_rid;
+ struct resource *irq;
+ void *irqh;
+
+ bus_space_tag_t bst;
+ bus_space_handle_t bsh;
+
+ struct ifnet *ifp;
+ int if_flags;
+ struct ifmedia rt_ifmedia;
+
+ uint32_t mac_rev;
+ uint8_t mac_addr[ETHER_ADDR_LEN];
+ device_t rt_miibus;
+
+ uint32_t intr_enable_mask;
+ uint32_t intr_disable_mask;
+ uint32_t intr_pending_mask;
+
+ struct task rx_done_task;
+ int rx_process_limit;
+ struct task tx_done_task;
+ struct task periodic_task;
+ struct callout periodic_ch;
+ unsigned long periodic_round;
+ struct taskqueue *taskqueue;
+
+ struct rt_softc_rx_ring rx_ring;
+ struct rt_softc_tx_ring tx_ring[RT_SOFTC_TX_RING_COUNT];
+ int tx_ring_mgtqid;
+
+ struct callout tx_watchdog_ch;
+ int tx_timer;
+
+ /* statistic counters */
+ unsigned long interrupts;
+ unsigned long tx_coherent_interrupts;
+ unsigned long rx_coherent_interrupts;
+ unsigned long rx_interrupts;
+ unsigned long rx_delay_interrupts;
+ unsigned long tx_interrupts[RT_SOFTC_TX_RING_COUNT];
+ unsigned long tx_delay_interrupts;
+ unsigned long tx_data_queue_full[RT_SOFTC_TX_RING_COUNT];
+ unsigned long tx_watchdog_timeouts;
+ unsigned long tx_defrag_packets;
+ unsigned long no_tx_desc_avail;
+ unsigned long rx_mbuf_alloc_errors;
+ unsigned long rx_mbuf_dmamap_errors;
+ unsigned long tx_queue_not_empty[2];
+
+ unsigned long rx_bytes;
+ unsigned long rx_packets;
+ unsigned long rx_crc_err;
+ unsigned long rx_phy_err;
+ unsigned long rx_dup_packets;
+ unsigned long rx_fifo_overflows;
+ unsigned long rx_short_err;
+ unsigned long rx_long_err;
+ unsigned long tx_bytes;
+ unsigned long tx_packets;
+ unsigned long tx_skip;
+ unsigned long tx_collision;
+
+ int phy_addr;
+
+#ifdef IF_RT_DEBUG
+ int debug;
+#endif
+};
+
+#ifdef IF_RT_DEBUG
+enum
+{
+ RT_DEBUG_RX = 0x00000001,
+ RT_DEBUG_TX = 0x00000002,
+ RT_DEBUG_INTR = 0x00000004,
+ RT_DEBUG_STATE = 0x00000008,
+ RT_DEBUG_STATS = 0x00000010,
+ RT_DEBUG_PERIODIC = 0x00000020,
+ RT_DEBUG_WATCHDOG = 0x00000040,
+ RT_DEBUG_ANY = 0xffffffff
+};
+
+#define RT_DPRINTF(sc, m, fmt, ...) \
+ do { if ((sc)->debug & (m)) \
+ device_printf(sc->dev, fmt, __VA_ARGS__); } while (0)
+#else
+#define RT_DPRINTF(sc, m, fmt, ...)
+#endif /* #ifdef IF_RT_DEBUG */
+
+#endif /* #ifndef _IF_RTVAR_H_ */
diff --git a/sys/dev/sound/usb/uaudio.c b/sys/dev/sound/usb/uaudio.c
index f40ada7..565022c 100644
--- a/sys/dev/sound/usb/uaudio.c
+++ b/sys/dev/sound/usb/uaudio.c
@@ -192,7 +192,8 @@ struct uaudio_chan {
};
#define UMIDI_CABLES_MAX 16 /* units */
-#define UMIDI_BULK_SIZE 1024 /* bytes */
+#define UMIDI_TX_FRAMES 256 /* units */
+#define UMIDI_TX_BUFFER (UMIDI_TX_FRAMES * 4) /* bytes */
enum {
UMIDI_TX_TRANSFER,
@@ -235,6 +236,7 @@ struct umidi_chan {
uint8_t curr_cable;
uint8_t max_cable;
uint8_t valid;
+ uint8_t single_command;
};
struct uaudio_softc {
@@ -497,8 +499,7 @@ static const struct usb_config
.type = UE_BULK,
.endpoint = UE_ADDR_ANY,
.direction = UE_DIR_OUT,
- .bufsize = UMIDI_BULK_SIZE,
- .flags = {.pipe_bof = 1,.short_xfer_ok = 1,},
+ .bufsize = UMIDI_TX_BUFFER,
.callback = &umidi_bulk_write_callback,
},
@@ -507,7 +508,7 @@ static const struct usb_config
.endpoint = UE_ADDR_ANY,
.direction = UE_DIR_IN,
.bufsize = 4, /* bytes */
- .flags = {.pipe_bof = 1,.short_xfer_ok = 1,.proxy_buffer = 1,},
+ .flags = {.short_xfer_ok = 1,.proxy_buffer = 1,},
.callback = &umidi_bulk_read_callback,
},
};
@@ -3541,7 +3542,7 @@ umidi_bulk_write_callback(struct usb_xfer *xfer, usb_error_t error)
struct umidi_sub_chan *sub;
struct usb_page_cache *pc;
uint32_t actlen;
- uint16_t total_length;
+ uint16_t nframes;
uint8_t buf;
uint8_t start_cable;
uint8_t tr_any;
@@ -3549,6 +3550,10 @@ umidi_bulk_write_callback(struct usb_xfer *xfer, usb_error_t error)
usbd_xfer_status(xfer, &len, NULL, NULL, NULL);
+ /*
+ * NOTE: Some MIDI devices only accept 4 bytes of data per
+ * short terminated USB transfer.
+ */
switch (USB_GET_STATE(xfer)) {
case USB_ST_TRANSFERRED:
DPRINTF("actlen=%d bytes\n", len);
@@ -3557,7 +3562,7 @@ umidi_bulk_write_callback(struct usb_xfer *xfer, usb_error_t error)
tr_setup:
DPRINTF("start\n");
- total_length = 0; /* reset */
+ nframes = 0; /* reset */
start_cable = chan->curr_cable;
tr_any = 0;
pc = usbd_xfer_get_frame(xfer, 0);
@@ -3569,51 +3574,50 @@ tr_setup:
sub = &chan->sub[chan->curr_cable];
if (sub->write_open) {
- usb_fifo_get_data(sub->fifo.fp[USB_FIFO_TX],
- pc, total_length, 1, &actlen, 0);
+ usb_fifo_get_data_linear(sub->fifo.fp[USB_FIFO_TX],
+ &buf, 1, &actlen, 0);
} else {
actlen = 0;
}
if (actlen) {
- usbd_copy_out(pc, total_length, &buf, 1);
tr_any = 1;
- DPRINTF("byte=0x%02x\n", buf);
+ DPRINTF("byte=0x%02x from FIFO %u\n", buf,
+ (unsigned int)chan->curr_cable);
if (umidi_convert_to_usb(sub, chan->curr_cable, buf)) {
- DPRINTF("sub= %02x %02x %02x %02x\n",
+ DPRINTF("sub=0x%02x 0x%02x 0x%02x 0x%02x\n",
sub->temp_cmd[0], sub->temp_cmd[1],
sub->temp_cmd[2], sub->temp_cmd[3]);
- usbd_copy_in(pc, total_length,
- sub->temp_cmd, 4);
+ usbd_copy_in(pc, nframes * 4, sub->temp_cmd, 4);
- total_length += 4;
+ nframes++;
- if (total_length >= UMIDI_BULK_SIZE) {
+ if ((nframes >= UMIDI_TX_FRAMES) || (chan->single_command != 0))
break;
- }
} else {
continue;
}
}
+
chan->curr_cable++;
- if (chan->curr_cable >= chan->max_cable) {
+ if (chan->curr_cable >= chan->max_cable)
chan->curr_cable = 0;
- }
+
if (chan->curr_cable == start_cable) {
- if (tr_any == 0) {
+ if (tr_any == 0)
break;
- }
tr_any = 0;
}
}
- if (total_length) {
- usbd_xfer_set_frame_len(xfer, 0, total_length);
+ if (nframes != 0) {
+ DPRINTF("Transferring %d frames\n", (int)nframes);
+ usbd_xfer_set_frame_len(xfer, 0, 4 * nframes);
usbd_transfer_submit(xfer);
}
break;
@@ -3785,6 +3789,9 @@ umidi_probe(device_t dev)
int error;
uint32_t n;
+ if (usb_test_quirk(uaa, UQ_SINGLE_CMD_MIDI))
+ chan->single_command = 1;
+
if (usbd_set_alt_interface_index(sc->sc_udev, chan->iface_index,
chan->iface_alt_index)) {
DPRINTF("setting of alternate index failed!\n");
diff --git a/sys/dev/syscons/syscons.c b/sys/dev/syscons/syscons.c
index b12b654..69d628e 100644
--- a/sys/dev/syscons/syscons.c
+++ b/sys/dev/syscons/syscons.c
@@ -1450,6 +1450,8 @@ sctty_ioctl(struct tty *tp, u_long cmd, caddr_t data, struct thread *td)
case GIO_KEYMAP: /* get keyboard translation table */
case PIO_KEYMAP: /* set keyboard translation table */
+ case OGIO_KEYMAP: /* get keyboard translation table (compat) */
+ case OPIO_KEYMAP: /* set keyboard translation table (compat) */
case GIO_DEADKEYMAP: /* get accent key translation table */
case PIO_DEADKEYMAP: /* set accent key translation table */
case GETFKEY: /* get function key string */
diff --git a/sys/dev/uart/uart_bus_pci.c b/sys/dev/uart/uart_bus_pci.c
index c479022..7c5b8b3 100644
--- a/sys/dev/uart/uart_bus_pci.c
+++ b/sys/dev/uart/uart_bus_pci.c
@@ -83,6 +83,7 @@ static struct pci_id pci_ns8250_ids[] = {
{ 0x103c, 0x1290, 0xffff, 0, "HP Auxiliary Diva Serial Port", 0x18 },
{ 0x11c1, 0x0480, 0xffff, 0, "Agere Systems Venus Modem (V90, 56KFlex)", 0x14 },
{ 0x115d, 0x0103, 0xffff, 0, "Xircom Cardbus Ethernet + 56k Modem", 0x10 },
+{ 0x1282, 0x6585, 0xffff, 0, "Davicom 56PDV PCI Modem", 0x10 },
{ 0x12b9, 0x1008, 0xffff, 0, "3Com 56K FaxModem Model 5610", 0x10 },
{ 0x131f, 0x1000, 0xffff, 0, "Siig CyberSerial (1-port) 16550", 0x18 },
{ 0x131f, 0x1001, 0xffff, 0, "Siig CyberSerial (1-port) 16650", 0x18 },
diff --git a/sys/dev/uart/uart_kbd_sun.c b/sys/dev/uart/uart_kbd_sun.c
index 1564d3f..43c0096 100644
--- a/sys/dev/uart/uart_kbd_sun.c
+++ b/sys/dev/uart/uart_kbd_sun.c
@@ -739,6 +739,7 @@ sunkbd_ioctl(keyboard_t *kbd, u_long cmd, caddr_t data)
case KDSETRAD:
break;
case PIO_KEYMAP:
+ case OPIO_KEYMAP:
case PIO_KEYMAPENT:
case PIO_DEADKEYMAP:
default:
diff --git a/sys/dev/usb/input/uhid.c b/sys/dev/usb/input/uhid.c
index 1da1203..1b810e3 100644
--- a/sys/dev/usb/input/uhid.c
+++ b/sys/dev/usb/input/uhid.c
@@ -634,6 +634,18 @@ uhid_probe(device_t dev)
if (usb_test_quirk(uaa, UQ_HID_IGNORE))
return (ENXIO);
+ /*
+ * Don't attach to mouse and keyboard devices, hence then no
+ * "nomatch" event is generated and then ums and ukbd won't
+ * attach properly when loaded.
+ */
+ if ((uaa->info.bInterfaceClass == UICLASS_HID) &&
+ (uaa->info.bInterfaceSubClass == UISUBCLASS_BOOT) &&
+ ((uaa->info.bInterfaceProtocol == UIPROTO_BOOT_KEYBOARD) ||
+ (uaa->info.bInterfaceProtocol == UIPROTO_MOUSE))) {
+ return (ENXIO);
+ }
+
return (BUS_PROBE_GENERIC);
}
diff --git a/sys/dev/usb/input/ukbd.c b/sys/dev/usb/input/ukbd.c
index b03f884..bf3ecd7 100644
--- a/sys/dev/usb/input/ukbd.c
+++ b/sys/dev/usb/input/ukbd.c
@@ -59,6 +59,8 @@ __FBSDID("$FreeBSD$");
#include <sys/callout.h>
#include <sys/malloc.h>
#include <sys/priv.h>
+#include <sys/proc.h>
+#include <sys/sched.h>
#include <sys/kdb.h>
#include <dev/usb/usb.h>
@@ -108,9 +110,10 @@ TUNABLE_INT("hw.usb.ukbd.no_leds", &ukbd_no_leds);
#define UKBD_IN_BUF_SIZE (2*(UKBD_NMOD + (2*UKBD_NKEYCODE))) /* bytes */
#define UKBD_IN_BUF_FULL (UKBD_IN_BUF_SIZE / 2) /* bytes */
#define UKBD_NFKEY (sizeof(fkey_tab)/sizeof(fkey_tab[0])) /* units */
+#define UKBD_BUFFER_SIZE 64 /* bytes */
struct ukbd_data {
- uint8_t modifiers;
+ uint16_t modifiers;
#define MOD_CONTROL_L 0x01
#define MOD_CONTROL_R 0x10
#define MOD_SHIFT_L 0x02
@@ -119,9 +122,10 @@ struct ukbd_data {
#define MOD_ALT_R 0x40
#define MOD_WIN_L 0x08
#define MOD_WIN_R 0x80
- uint8_t reserved;
+/* internal */
+#define MOD_EJECT 0x0100
+#define MOD_FN 0x0200
uint8_t keycode[UKBD_NKEYCODE];
- uint8_t exten[8];
};
enum {
@@ -137,6 +141,18 @@ struct ukbd_softc {
fkeytab_t sc_fkeymap[UKBD_NFKEY];
struct hid_location sc_loc_apple_eject;
struct hid_location sc_loc_apple_fn;
+ struct hid_location sc_loc_ctrl_l;
+ struct hid_location sc_loc_ctrl_r;
+ struct hid_location sc_loc_shift_l;
+ struct hid_location sc_loc_shift_r;
+ struct hid_location sc_loc_alt_l;
+ struct hid_location sc_loc_alt_r;
+ struct hid_location sc_loc_win_l;
+ struct hid_location sc_loc_win_r;
+ struct hid_location sc_loc_events;
+ struct hid_location sc_loc_numlock;
+ struct hid_location sc_loc_capslock;
+ struct hid_location sc_loc_scrolllock;
struct usb_callout sc_callout;
struct ukbd_data sc_ndata;
struct ukbd_data sc_odata;
@@ -155,31 +171,64 @@ struct ukbd_softc {
uint32_t sc_buffered_char[2];
#endif
uint32_t sc_flags; /* flags */
-#define UKBD_FLAG_COMPOSE 0x0001
-#define UKBD_FLAG_POLLING 0x0002
-#define UKBD_FLAG_SET_LEDS 0x0004
-#define UKBD_FLAG_ATTACHED 0x0010
-#define UKBD_FLAG_GONE 0x0020
-#define UKBD_FLAG_APPLE_EJECT 0x0040
-#define UKBD_FLAG_APPLE_FN 0x0080
-#define UKBD_FLAG_APPLE_SWAP 0x0100
-#define UKBD_FLAG_TIMER_RUNNING 0x0200
+#define UKBD_FLAG_COMPOSE 0x00000001
+#define UKBD_FLAG_POLLING 0x00000002
+#define UKBD_FLAG_SET_LEDS 0x00000004
+#define UKBD_FLAG_ATTACHED 0x00000010
+#define UKBD_FLAG_GONE 0x00000020
+
+#define UKBD_FLAG_HID_MASK 0x003fffc0
+#define UKBD_FLAG_APPLE_EJECT 0x00000040
+#define UKBD_FLAG_APPLE_FN 0x00000080
+#define UKBD_FLAG_APPLE_SWAP 0x00000100
+#define UKBD_FLAG_TIMER_RUNNING 0x00000200
+#define UKBD_FLAG_CTRL_L 0x00000400
+#define UKBD_FLAG_CTRL_R 0x00000800
+#define UKBD_FLAG_SHIFT_L 0x00001000
+#define UKBD_FLAG_SHIFT_R 0x00002000
+#define UKBD_FLAG_ALT_L 0x00004000
+#define UKBD_FLAG_ALT_R 0x00008000
+#define UKBD_FLAG_WIN_L 0x00010000
+#define UKBD_FLAG_WIN_R 0x00020000
+#define UKBD_FLAG_EVENTS 0x00040000
+#define UKBD_FLAG_NUMLOCK 0x00080000
+#define UKBD_FLAG_CAPSLOCK 0x00100000
+#define UKBD_FLAG_SCROLLLOCK 0x00200000
int sc_mode; /* input mode (K_XLATE,K_RAW,K_CODE) */
int sc_state; /* shift/lock key state */
int sc_accents; /* accent key index (> 0) */
int sc_poll_tick_last;
+ int sc_led_size;
+ int sc_kbd_size;
uint16_t sc_inputs;
uint16_t sc_inputhead;
uint16_t sc_inputtail;
+ uint16_t sc_modifiers;
uint8_t sc_leds; /* store for async led requests */
uint8_t sc_iface_index;
uint8_t sc_iface_no;
+ uint8_t sc_id_apple_eject;
+ uint8_t sc_id_apple_fn;
+ uint8_t sc_id_ctrl_l;
+ uint8_t sc_id_ctrl_r;
+ uint8_t sc_id_shift_l;
+ uint8_t sc_id_shift_r;
+ uint8_t sc_id_alt_l;
+ uint8_t sc_id_alt_r;
+ uint8_t sc_id_win_l;
+ uint8_t sc_id_win_r;
+ uint8_t sc_id_event;
+ uint8_t sc_id_numlock;
+ uint8_t sc_id_capslock;
+ uint8_t sc_id_scrolllock;
+ uint8_t sc_id_events;
uint8_t sc_kbd_id;
- uint8_t sc_led_id;
+
uint8_t sc_poll_detected;
+ uint8_t sc_buffer[UKBD_BUFFER_SIZE];
};
#define KEY_ERROR 0x01
@@ -261,6 +310,22 @@ static const uint8_t ukbd_trtab[256] = {
NN, NN, NN, NN, NN, NN, NN, NN, /* F8 - FF */
};
+static const uint8_t ukbd_boot_desc[] = {
+ 0x05, 0x01, 0x09, 0x06, 0xa1,
+ 0x01, 0x05, 0x07, 0x19, 0xe0,
+ 0x29, 0xe7, 0x15, 0x00, 0x25,
+ 0x01, 0x75, 0x01, 0x95, 0x08,
+ 0x81, 0x02, 0x95, 0x01, 0x75,
+ 0x08, 0x81, 0x01, 0x95, 0x03,
+ 0x75, 0x01, 0x05, 0x08, 0x19,
+ 0x01, 0x29, 0x03, 0x91, 0x02,
+ 0x95, 0x05, 0x75, 0x01, 0x91,
+ 0x01, 0x95, 0x06, 0x75, 0x08,
+ 0x15, 0x00, 0x26, 0xff, 0x00,
+ 0x05, 0x07, 0x19, 0x00, 0x2a,
+ 0xff, 0x00, 0x81, 0x00, 0xc0
+};
+
/* prototypes */
static void ukbd_timeout(void *);
static void ukbd_set_leds(struct ukbd_softc *, uint8_t);
@@ -323,6 +388,33 @@ ukbd_put_key(struct ukbd_softc *sc, uint32_t key)
}
static void
+ukbd_yield(void)
+{
+ struct thread *td = curthread;
+ uint32_t old_prio;
+
+ DROP_GIANT();
+
+ thread_lock(td);
+
+ /* get current priority */
+ old_prio = td->td_base_pri;
+
+ /* set new priority */
+ sched_prio(td, td->td_user_pri);
+
+ /* cause a task switch */
+ mi_switch(SW_INVOL | SWT_RELINQUISH, NULL);
+
+ /* restore priority */
+ sched_prio(td, old_prio);
+
+ thread_unlock(td);
+
+ PICKUP_GIANT();
+}
+
+static void
ukbd_do_poll(struct ukbd_softc *sc, uint8_t wait)
{
DPRINTFN(2, "polling\n");
@@ -333,8 +425,9 @@ ukbd_do_poll(struct ukbd_softc *sc, uint8_t wait)
if (kdb_active == 0) {
while (sc->sc_inputs == 0) {
- /* make sure the USB code gets a chance to run */
- pause("UKBD", 1);
+
+ /* give USB threads a chance to run */
+ ukbd_yield();
/* check if we should wait */
if (!wait)
@@ -561,8 +654,6 @@ ukbd_intr_callback(struct usb_xfer *xfer, usb_error_t error)
uint8_t i;
uint8_t offset;
uint8_t id;
- uint8_t apple_fn;
- uint8_t apple_eject;
int len;
usbd_xfer_status(xfer, &len, NULL, NULL, NULL);
@@ -580,73 +671,145 @@ ukbd_intr_callback(struct usb_xfer *xfer, usb_error_t error)
if (sc->sc_kbd_id != 0) {
/* check and remove HID ID byte */
usbd_copy_out(pc, 0, &id, 1);
- if (id != sc->sc_kbd_id) {
- DPRINTF("wrong HID ID\n");
- goto tr_setup;
- }
offset = 1;
len--;
+ if (len == 0) {
+ DPRINTF("zero length data\n");
+ goto tr_setup;
+ }
} else {
offset = 0;
+ id = 0;
}
- if (len > sizeof(sc->sc_ndata)) {
- len = sizeof(sc->sc_ndata);
- }
+ if (len > UKBD_BUFFER_SIZE)
+ len = UKBD_BUFFER_SIZE;
- if (len) {
- memset(&sc->sc_ndata, 0, sizeof(sc->sc_ndata));
- usbd_copy_out(pc, offset, &sc->sc_ndata, len);
+ /* get data */
+ usbd_copy_out(pc, offset, sc->sc_buffer, len);
- if ((sc->sc_flags & UKBD_FLAG_APPLE_EJECT) &&
- hid_get_data((uint8_t *)&sc->sc_ndata,
- len, &sc->sc_loc_apple_eject))
- apple_eject = 1;
- else
- apple_eject = 0;
+ /* clear temporary storage */
+ memset(&sc->sc_ndata, 0, sizeof(sc->sc_ndata));
- if ((sc->sc_flags & UKBD_FLAG_APPLE_FN) &&
- hid_get_data((uint8_t *)&sc->sc_ndata,
- len, &sc->sc_loc_apple_fn))
- apple_fn = 1;
+ /* scan through HID data */
+ if ((sc->sc_flags & UKBD_FLAG_APPLE_EJECT) &&
+ (id == sc->sc_id_apple_eject)) {
+ if (hid_get_data(sc->sc_buffer, len, &sc->sc_loc_apple_eject))
+ sc->sc_modifiers |= MOD_EJECT;
else
- apple_fn = 0;
-#ifdef USB_DEBUG
- DPRINTF("apple_eject=%u apple_fn=%u\n",
- apple_eject, apple_fn);
+ sc->sc_modifiers &= ~MOD_EJECT;
+ }
+ if ((sc->sc_flags & UKBD_FLAG_APPLE_FN) &&
+ (id == sc->sc_id_apple_fn)) {
+ if (hid_get_data(sc->sc_buffer, len, &sc->sc_loc_apple_fn))
+ sc->sc_modifiers |= MOD_FN;
+ else
+ sc->sc_modifiers &= ~MOD_FN;
+ }
+ if ((sc->sc_flags & UKBD_FLAG_CTRL_L) &&
+ (id == sc->sc_id_ctrl_l)) {
+ if (hid_get_data(sc->sc_buffer, len, &sc->sc_loc_ctrl_l))
+ sc-> sc_modifiers |= MOD_CONTROL_L;
+ else
+ sc-> sc_modifiers &= ~MOD_CONTROL_L;
+ }
+ if ((sc->sc_flags & UKBD_FLAG_CTRL_R) &&
+ (id == sc->sc_id_ctrl_r)) {
+ if (hid_get_data(sc->sc_buffer, len, &sc->sc_loc_ctrl_r))
+ sc->sc_modifiers |= MOD_CONTROL_R;
+ else
+ sc->sc_modifiers &= ~MOD_CONTROL_R;
+ }
+ if ((sc->sc_flags & UKBD_FLAG_SHIFT_L) &&
+ (id == sc->sc_id_shift_l)) {
+ if (hid_get_data(sc->sc_buffer, len, &sc->sc_loc_shift_l))
+ sc->sc_modifiers |= MOD_SHIFT_L;
+ else
+ sc->sc_modifiers &= ~MOD_SHIFT_L;
+ }
+ if ((sc->sc_flags & UKBD_FLAG_SHIFT_R) &&
+ (id == sc->sc_id_shift_r)) {
+ if (hid_get_data(sc->sc_buffer, len, &sc->sc_loc_shift_r))
+ sc->sc_modifiers |= MOD_SHIFT_R;
+ else
+ sc->sc_modifiers &= ~MOD_SHIFT_R;
+ }
+ if ((sc->sc_flags & UKBD_FLAG_ALT_L) &&
+ (id == sc->sc_id_alt_l)) {
+ if (hid_get_data(sc->sc_buffer, len, &sc->sc_loc_alt_l))
+ sc->sc_modifiers |= MOD_ALT_L;
+ else
+ sc->sc_modifiers &= ~MOD_ALT_L;
+ }
+ if ((sc->sc_flags & UKBD_FLAG_ALT_R) &&
+ (id == sc->sc_id_alt_r)) {
+ if (hid_get_data(sc->sc_buffer, len, &sc->sc_loc_alt_r))
+ sc->sc_modifiers |= MOD_ALT_R;
+ else
+ sc->sc_modifiers &= ~MOD_ALT_R;
+ }
+ if ((sc->sc_flags & UKBD_FLAG_WIN_L) &&
+ (id == sc->sc_id_win_l)) {
+ if (hid_get_data(sc->sc_buffer, len, &sc->sc_loc_win_l))
+ sc->sc_modifiers |= MOD_WIN_L;
+ else
+ sc->sc_modifiers &= ~MOD_WIN_L;
+ }
+ if ((sc->sc_flags & UKBD_FLAG_WIN_R) &&
+ (id == sc->sc_id_win_r)) {
+ if (hid_get_data(sc->sc_buffer, len, &sc->sc_loc_win_r))
+ sc->sc_modifiers |= MOD_WIN_R;
+ else
+ sc->sc_modifiers &= ~MOD_WIN_R;
+ }
- if (sc->sc_ndata.modifiers) {
- DPRINTF("mod: 0x%04x\n", sc->sc_ndata.modifiers);
+ sc->sc_ndata.modifiers = sc->sc_modifiers;
+
+ if ((sc->sc_flags & UKBD_FLAG_EVENTS) &&
+ (id == sc->sc_id_events)) {
+ i = sc->sc_loc_events.count;
+ if (i > UKBD_NKEYCODE)
+ i = UKBD_NKEYCODE;
+ if (i > len)
+ i = len;
+ while (i--) {
+ sc->sc_ndata.keycode[i] =
+ hid_get_data(sc->sc_buffer + i, len - i,
+ &sc->sc_loc_events);
}
- for (i = 0; i < UKBD_NKEYCODE; i++) {
- if (sc->sc_ndata.keycode[i]) {
- DPRINTF("[%d] = %d\n", i, sc->sc_ndata.keycode[i]);
- }
- }
-#endif /* USB_DEBUG */
+ }
- if (apple_fn) {
- for (i = 0; i < UKBD_NKEYCODE; i++) {
- sc->sc_ndata.keycode[i] =
- ukbd_apple_fn(sc->sc_ndata.keycode[i]);
- }
+#ifdef USB_DEBUG
+ DPRINTF("modifiers = 0x%04x\n", (int)sc->sc_modifiers);
+ for (i = 0; i < UKBD_NKEYCODE; i++) {
+ if (sc->sc_ndata.keycode[i]) {
+ DPRINTF("[%d] = 0x%02x\n",
+ (int)i, (int)sc->sc_ndata.keycode[i]);
}
+ }
+#endif
+ if (sc->sc_modifiers & MOD_FN) {
+ for (i = 0; i < UKBD_NKEYCODE; i++) {
+ sc->sc_ndata.keycode[i] =
+ ukbd_apple_fn(sc->sc_ndata.keycode[i]);
+ }
+ }
- if (sc->sc_flags & UKBD_FLAG_APPLE_SWAP) {
- for (i = 0; i < UKBD_NKEYCODE; i++) {
- sc->sc_ndata.keycode[i] =
- ukbd_apple_swap(sc->sc_ndata.keycode[i]);
- }
+ if (sc->sc_flags & UKBD_FLAG_APPLE_SWAP) {
+ for (i = 0; i < UKBD_NKEYCODE; i++) {
+ sc->sc_ndata.keycode[i] =
+ ukbd_apple_swap(sc->sc_ndata.keycode[i]);
}
+ }
- ukbd_interrupt(sc);
+ ukbd_interrupt(sc);
- if (!(sc->sc_flags & UKBD_FLAG_TIMER_RUNNING)) {
- if (ukbd_any_key_pressed(sc)) {
- ukbd_start_timer(sc);
- }
+ if (!(sc->sc_flags & UKBD_FLAG_TIMER_RUNNING)) {
+ if (ukbd_any_key_pressed(sc)) {
+ ukbd_start_timer(sc);
}
}
+
case USB_ST_SETUP:
tr_setup:
if (sc->sc_inputs < UKBD_IN_BUF_FULL) {
@@ -672,10 +835,12 @@ tr_setup:
static void
ukbd_set_leds_callback(struct usb_xfer *xfer, usb_error_t error)
{
+ struct ukbd_softc *sc = usbd_xfer_softc(xfer);
struct usb_device_request req;
struct usb_page_cache *pc;
- uint8_t buf[2];
- struct ukbd_softc *sc = usbd_xfer_softc(xfer);
+ uint8_t id;
+ uint8_t any;
+ int len;
#ifdef USB_DEBUG
if (ukbd_no_leds)
@@ -685,37 +850,83 @@ ukbd_set_leds_callback(struct usb_xfer *xfer, usb_error_t error)
switch (USB_GET_STATE(xfer)) {
case USB_ST_TRANSFERRED:
case USB_ST_SETUP:
- if (sc->sc_flags & UKBD_FLAG_SET_LEDS) {
- sc->sc_flags &= ~UKBD_FLAG_SET_LEDS;
-
- req.bmRequestType = UT_WRITE_CLASS_INTERFACE;
- req.bRequest = UR_SET_REPORT;
- USETW2(req.wValue, UHID_OUTPUT_REPORT, 0);
- req.wIndex[0] = sc->sc_iface_no;
- req.wIndex[1] = 0;
- req.wLength[1] = 0;
-
- /* check if we need to prefix an ID byte */
- if (sc->sc_led_id != 0) {
- req.wLength[0] = 2;
- buf[0] = sc->sc_led_id;
- buf[1] = sc->sc_leds;
- } else {
- req.wLength[0] = 1;
- buf[0] = sc->sc_leds;
- buf[1] = 0;
+ if (!(sc->sc_flags & UKBD_FLAG_SET_LEDS))
+ break;
+ sc->sc_flags &= ~UKBD_FLAG_SET_LEDS;
+
+ req.bmRequestType = UT_WRITE_CLASS_INTERFACE;
+ req.bRequest = UR_SET_REPORT;
+ USETW2(req.wValue, UHID_OUTPUT_REPORT, 0);
+ req.wIndex[0] = sc->sc_iface_no;
+ req.wIndex[1] = 0;
+ req.wLength[1] = 0;
+
+ memset(sc->sc_buffer, 0, UKBD_BUFFER_SIZE);
+
+ id = 0;
+ any = 0;
+
+ /* Assumption: All led bits must be in the same ID. */
+
+ if (sc->sc_flags & UKBD_FLAG_NUMLOCK) {
+ if (sc->sc_leds & NLKED) {
+ hid_put_data_unsigned(sc->sc_buffer + 1, UKBD_BUFFER_SIZE - 1,
+ &sc->sc_loc_numlock, 1);
}
+ id = sc->sc_id_numlock;
+ any = 1;
+ }
- pc = usbd_xfer_get_frame(xfer, 0);
- usbd_copy_in(pc, 0, &req, sizeof(req));
- pc = usbd_xfer_get_frame(xfer, 1);
- usbd_copy_in(pc, 0, buf, sizeof(buf));
+ if (sc->sc_flags & UKBD_FLAG_SCROLLLOCK) {
+ if (sc->sc_leds & SLKED) {
+ hid_put_data_unsigned(sc->sc_buffer + 1, UKBD_BUFFER_SIZE - 1,
+ &sc->sc_loc_scrolllock, 1);
+ }
+ id = sc->sc_id_scrolllock;
+ any = 1;
+ }
- usbd_xfer_set_frame_len(xfer, 0, sizeof(req));
- usbd_xfer_set_frame_len(xfer, 1, req.wLength[0]);
- usbd_xfer_set_frames(xfer, 2);
- usbd_transfer_submit(xfer);
+ if (sc->sc_flags & UKBD_FLAG_CAPSLOCK) {
+ if (sc->sc_leds & CLKED) {
+ hid_put_data_unsigned(sc->sc_buffer + 1, UKBD_BUFFER_SIZE - 1,
+ &sc->sc_loc_capslock, 1);
+ }
+ id = sc->sc_id_capslock;
+ any = 1;
}
+
+ /* if no leds, nothing to do */
+ if (!any)
+ break;
+
+ /* range check output report length */
+ len = sc->sc_led_size;
+ if (len > (UKBD_BUFFER_SIZE - 1))
+ len = (UKBD_BUFFER_SIZE - 1);
+
+ /* check if we need to prefix an ID byte */
+ sc->sc_buffer[0] = id;
+
+ pc = usbd_xfer_get_frame(xfer, 1);
+ if (id != 0) {
+ len++;
+ usbd_copy_in(pc, 0, sc->sc_buffer, len);
+ } else {
+ usbd_copy_in(pc, 0, sc->sc_buffer + 1, len);
+ }
+ req.wLength[0] = len;
+ usbd_xfer_set_frame_len(xfer, 1, len);
+
+ DPRINTF("len=%d, id=%d\n", len, id);
+
+ /* setup control request last */
+ pc = usbd_xfer_get_frame(xfer, 0);
+ usbd_copy_in(pc, 0, &req, sizeof(req));
+ usbd_xfer_set_frame_len(xfer, 0, sizeof(req));
+
+ /* start data transfer */
+ usbd_xfer_set_frames(xfer, 2);
+ usbd_transfer_submit(xfer);
break;
default: /* Error */
@@ -739,7 +950,7 @@ static const struct usb_config ukbd_config[UKBD_N_TRANSFER] = {
.type = UE_CONTROL,
.endpoint = 0x00, /* Control pipe */
.direction = UE_DIR_ANY,
- .bufsize = sizeof(struct usb_device_request) + 8,
+ .bufsize = sizeof(struct usb_device_request) + UKBD_BUFFER_SIZE,
.callback = &ukbd_set_leds_callback,
.timeout = 1000, /* 1 second */
},
@@ -808,6 +1019,140 @@ ukbd_probe(device_t dev)
return (error);
}
+static void
+ukbd_parse_hid(struct ukbd_softc *sc, const uint8_t *ptr, uint32_t len)
+{
+ uint32_t flags;
+
+ /* reset detected bits */
+ sc->sc_flags &= ~UKBD_FLAG_HID_MASK;
+
+ /* check if there is an ID byte */
+ sc->sc_kbd_size = hid_report_size(ptr, len,
+ hid_input, &sc->sc_kbd_id);
+
+ /* investigate if this is an Apple Keyboard */
+ if (hid_locate(ptr, len,
+ HID_USAGE2(HUP_CONSUMER, HUG_APPLE_EJECT),
+ hid_input, 0, &sc->sc_loc_apple_eject, &flags,
+ &sc->sc_id_apple_eject)) {
+ if (flags & HIO_VARIABLE)
+ sc->sc_flags |= UKBD_FLAG_APPLE_EJECT |
+ UKBD_FLAG_APPLE_SWAP;
+ DPRINTFN(1, "Found Apple eject-key\n");
+ }
+ if (hid_locate(ptr, len,
+ HID_USAGE2(0xFFFF, 0x0003),
+ hid_input, 0, &sc->sc_loc_apple_fn, &flags,
+ &sc->sc_id_apple_fn)) {
+ if (flags & HIO_VARIABLE)
+ sc->sc_flags |= UKBD_FLAG_APPLE_FN;
+ DPRINTFN(1, "Found Apple FN-key\n");
+ }
+ /* figure out some keys */
+ if (hid_locate(ptr, len,
+ HID_USAGE2(HUP_KEYBOARD, 0xE0),
+ hid_input, 0, &sc->sc_loc_ctrl_l, &flags,
+ &sc->sc_id_ctrl_l)) {
+ if (flags & HIO_VARIABLE)
+ sc->sc_flags |= UKBD_FLAG_CTRL_L;
+ DPRINTFN(1, "Found left control\n");
+ }
+ if (hid_locate(ptr, len,
+ HID_USAGE2(HUP_KEYBOARD, 0xE4),
+ hid_input, 0, &sc->sc_loc_ctrl_r, &flags,
+ &sc->sc_id_ctrl_r)) {
+ if (flags & HIO_VARIABLE)
+ sc->sc_flags |= UKBD_FLAG_CTRL_R;
+ DPRINTFN(1, "Found right control\n");
+ }
+ if (hid_locate(ptr, len,
+ HID_USAGE2(HUP_KEYBOARD, 0xE1),
+ hid_input, 0, &sc->sc_loc_shift_l, &flags,
+ &sc->sc_id_shift_l)) {
+ if (flags & HIO_VARIABLE)
+ sc->sc_flags |= UKBD_FLAG_SHIFT_L;
+ DPRINTFN(1, "Found left shift\n");
+ }
+ if (hid_locate(ptr, len,
+ HID_USAGE2(HUP_KEYBOARD, 0xE5),
+ hid_input, 0, &sc->sc_loc_shift_r, &flags,
+ &sc->sc_id_shift_r)) {
+ if (flags & HIO_VARIABLE)
+ sc->sc_flags |= UKBD_FLAG_SHIFT_R;
+ DPRINTFN(1, "Found right shift\n");
+ }
+ if (hid_locate(ptr, len,
+ HID_USAGE2(HUP_KEYBOARD, 0xE2),
+ hid_input, 0, &sc->sc_loc_alt_l, &flags,
+ &sc->sc_id_alt_l)) {
+ if (flags & HIO_VARIABLE)
+ sc->sc_flags |= UKBD_FLAG_ALT_L;
+ DPRINTFN(1, "Found left alt\n");
+ }
+ if (hid_locate(ptr, len,
+ HID_USAGE2(HUP_KEYBOARD, 0xE6),
+ hid_input, 0, &sc->sc_loc_alt_r, &flags,
+ &sc->sc_id_alt_r)) {
+ if (flags & HIO_VARIABLE)
+ sc->sc_flags |= UKBD_FLAG_ALT_R;
+ DPRINTFN(1, "Found right alt\n");
+ }
+ if (hid_locate(ptr, len,
+ HID_USAGE2(HUP_KEYBOARD, 0xE3),
+ hid_input, 0, &sc->sc_loc_win_l, &flags,
+ &sc->sc_id_win_l)) {
+ if (flags & HIO_VARIABLE)
+ sc->sc_flags |= UKBD_FLAG_WIN_L;
+ DPRINTFN(1, "Found left GUI\n");
+ }
+ if (hid_locate(ptr, len,
+ HID_USAGE2(HUP_KEYBOARD, 0xE7),
+ hid_input, 0, &sc->sc_loc_win_r, &flags,
+ &sc->sc_id_win_r)) {
+ if (flags & HIO_VARIABLE)
+ sc->sc_flags |= UKBD_FLAG_WIN_R;
+ DPRINTFN(1, "Found right GUI\n");
+ }
+ /* figure out event buffer */
+ if (hid_locate(ptr, len,
+ HID_USAGE2(HUP_KEYBOARD, 0x00),
+ hid_input, 0, &sc->sc_loc_events, &flags,
+ &sc->sc_id_events)) {
+ sc->sc_flags |= UKBD_FLAG_EVENTS;
+ DPRINTFN(1, "Found keyboard events\n");
+ }
+
+ /* figure out leds on keyboard */
+ sc->sc_led_size = hid_report_size(ptr, len,
+ hid_output, NULL);
+
+ if (hid_locate(ptr, len,
+ HID_USAGE2(HUP_LEDS, 0x01),
+ hid_output, 0, &sc->sc_loc_numlock, &flags,
+ &sc->sc_id_numlock)) {
+ if (flags & HIO_VARIABLE)
+ sc->sc_flags |= UKBD_FLAG_NUMLOCK;
+ DPRINTFN(1, "Found keyboard numlock\n");
+ }
+ if (hid_locate(ptr, len,
+ HID_USAGE2(HUP_LEDS, 0x02),
+ hid_output, 0, &sc->sc_loc_capslock, &flags,
+ &sc->sc_id_capslock)) {
+ if (flags & HIO_VARIABLE)
+ sc->sc_flags |= UKBD_FLAG_CAPSLOCK;
+ DPRINTFN(1, "Found keyboard capslock\n");
+ }
+ if (hid_locate(ptr, len,
+ HID_USAGE2(HUP_LEDS, 0x03),
+ hid_output, 0, &sc->sc_loc_scrolllock, &flags,
+ &sc->sc_id_scrolllock)) {
+ if (flags & HIO_VARIABLE)
+ sc->sc_flags |= UKBD_FLAG_SCROLLLOCK;
+ DPRINTFN(1, "Found keyboard scrolllock\n");
+ }
+}
+
static int
ukbd_attach(device_t dev)
{
@@ -817,7 +1162,6 @@ ukbd_attach(device_t dev)
keyboard_t *kbd = &sc->sc_kbd;
void *hid_ptr = NULL;
usb_error_t err;
- uint32_t flags;
uint16_t n;
uint16_t hid_len;
@@ -864,64 +1208,38 @@ ukbd_attach(device_t dev)
*/
KBD_PROBE_DONE(kbd);
- /*
- * Set boot protocol if we need the quirk.
- */
- if (usb_test_quirk(uaa, UQ_KBD_BOOTPROTO)) {
- err = usbd_req_set_protocol(sc->sc_udev, NULL,
- sc->sc_iface_index, 0);
- if (err != USB_ERR_NORMAL_COMPLETION) {
- DPRINTF("set protocol error=%s\n", usbd_errstr(err));
- goto detach;
- }
- }
-
- /* figure out if there is an ID byte in the data */
+ /* get HID descriptor */
err = usbd_req_get_hid_desc(uaa->device, NULL, &hid_ptr,
&hid_len, M_TEMP, uaa->info.bIfaceIndex);
+
if (err == 0) {
- uint8_t apple_keys = 0;
- uint8_t temp_id;
-
- /* investigate if this is an Apple Keyboard */
- if (hid_locate(hid_ptr, hid_len,
- HID_USAGE2(HUP_CONSUMER, HUG_APPLE_EJECT),
- hid_input, 0, &sc->sc_loc_apple_eject, &flags,
- &temp_id)) {
- if (flags & HIO_VARIABLE)
- sc->sc_flags |= UKBD_FLAG_APPLE_EJECT |
- UKBD_FLAG_APPLE_SWAP;
- DPRINTFN(1, "Found Apple eject-key\n");
- apple_keys = 1;
- sc->sc_kbd_id = temp_id;
- }
- if (hid_locate(hid_ptr, hid_len,
- HID_USAGE2(0xFFFF, 0x0003),
- hid_input, 0, &sc->sc_loc_apple_fn, &flags,
- &temp_id)) {
- if (flags & HIO_VARIABLE)
- sc->sc_flags |= UKBD_FLAG_APPLE_FN;
- DPRINTFN(1, "Found Apple FN-key\n");
- apple_keys = 1;
- sc->sc_kbd_id = temp_id;
- }
- if (apple_keys == 0) {
- /*
- * Assume the first HID ID contains the
- * keyboard data
- */
- hid_report_size(hid_ptr, hid_len,
- hid_input, &sc->sc_kbd_id);
- }
+ DPRINTF("Parsing HID descriptor of %d bytes\n",
+ (int)hid_len);
- /* investigate if we need an ID-byte for the leds */
- hid_report_size(hid_ptr, hid_len, hid_output, &sc->sc_led_id);
+ ukbd_parse_hid(sc, hid_ptr, hid_len);
free(hid_ptr, M_TEMP);
}
+ /* check if we should use the boot protocol */
+ if (usb_test_quirk(uaa, UQ_KBD_BOOTPROTO) ||
+ (err != 0) || (!(sc->sc_flags & UKBD_FLAG_EVENTS))) {
+
+ DPRINTF("Forcing boot protocol\n");
+
+ err = usbd_req_set_protocol(sc->sc_udev, NULL,
+ sc->sc_iface_index, 0);
+
+ if (err != 0) {
+ DPRINTF("Set protocol error=%s (ignored)\n",
+ usbd_errstr(err));
+ }
+
+ ukbd_parse_hid(sc, ukbd_boot_desc, sizeof(ukbd_boot_desc));
+ }
+
/* ignore if SETIDLE fails, hence it is not crucial */
- err = usbd_req_set_idle(sc->sc_udev, NULL, sc->sc_iface_index, 0, 0);
+ usbd_req_set_idle(sc->sc_udev, NULL, sc->sc_iface_index, 0, 0);
mtx_lock(&Giant);
@@ -1468,10 +1786,6 @@ errkey:
static int
ukbd_ioctl(keyboard_t *kbd, u_long cmd, caddr_t arg)
{
- /* translate LED_XXX bits into the device specific bits */
- static const uint8_t ledmap[8] = {
- 0, 2, 1, 3, 4, 6, 5, 7,
- };
struct ukbd_softc *sc = kbd->kb_data;
int i;
@@ -1547,10 +1861,11 @@ ukbd_ioctl(keyboard_t *kbd, u_long cmd, caddr_t arg)
#endif
case KDSETLED: /* set keyboard LED */
/* NOTE: lock key state in "sc_state" won't be changed */
- if (*(int *)arg & ~LOCK_MASK) {
+ if (*(int *)arg & ~LOCK_MASK)
return (EINVAL);
- }
+
i = *(int *)arg;
+
/* replace CAPS LED with ALTGR LED for ALTGR keyboards */
if (sc->sc_mode == K_XLATE &&
kbd->kb_keymap->n_keys > ALTGR_OFFSET) {
@@ -1559,9 +1874,9 @@ ukbd_ioctl(keyboard_t *kbd, u_long cmd, caddr_t arg)
else
i &= ~CLKED;
}
- if (KBD_HAS_DEVICE(kbd)) {
- ukbd_set_leds(sc, ledmap[i & LED_MASK]);
- }
+ if (KBD_HAS_DEVICE(kbd))
+ ukbd_set_leds(sc, i);
+
KBD_LED_VAL(kbd) = *(int *)arg;
break;
case KDGKBSTATE: /* get lock key state */
@@ -1614,6 +1929,8 @@ ukbd_ioctl(keyboard_t *kbd, u_long cmd, caddr_t arg)
return (ukbd_set_typematic(kbd, *(int *)arg));
case PIO_KEYMAP: /* set keyboard translation table */
+ case OPIO_KEYMAP: /* set keyboard translation table
+ * (compat) */
case PIO_KEYMAPENT: /* set keyboard translation table
* entry */
case PIO_DEADKEYMAP: /* set accent key translation table */
diff --git a/sys/dev/usb/net/if_aue.c b/sys/dev/usb/net/if_aue.c
index 71871de..86bfe20 100644
--- a/sys/dev/usb/net/if_aue.c
+++ b/sys/dev/usb/net/if_aue.c
@@ -256,7 +256,6 @@ static device_method_t aue_methods[] = {
/* bus interface */
DEVMETHOD(bus_print_child, bus_generic_print_child),
- DEVMETHOD(bus_driver_added, bus_generic_driver_added),
/* MII interface */
DEVMETHOD(miibus_readreg, aue_miibus_readreg),
diff --git a/sys/dev/usb/net/if_axe.c b/sys/dev/usb/net/if_axe.c
index 5c94e91..a440294 100644
--- a/sys/dev/usb/net/if_axe.c
+++ b/sys/dev/usb/net/if_axe.c
@@ -142,6 +142,7 @@ static const STRUCT_USB_HOST_ID axe_devs[] = {
AXE_DEV(ASIX, AX88178, AXE_FLAG_178),
AXE_DEV(ASIX, AX88772, AXE_FLAG_772),
AXE_DEV(ASIX, AX88772A, AXE_FLAG_772A),
+ AXE_DEV(ASIX, AX88772B, AXE_FLAG_772B),
AXE_DEV(ATEN, UC210T, 0),
AXE_DEV(BELKIN, F5D5055, AXE_FLAG_178),
AXE_DEV(BILLIONTON, USB2AR, 0),
@@ -190,7 +191,9 @@ static void axe_ifmedia_sts(struct ifnet *, struct ifmediareq *);
static int axe_cmd(struct axe_softc *, int, int, int, void *);
static void axe_ax88178_init(struct axe_softc *);
static void axe_ax88772_init(struct axe_softc *);
+static void axe_ax88772_phywake(struct axe_softc *);
static void axe_ax88772a_init(struct axe_softc *);
+static void axe_ax88772b_init(struct axe_softc *);
static int axe_get_phyno(struct axe_softc *, int);
static const struct usb_config axe_config[AXE_N_TRANSFER] = {
@@ -217,6 +220,17 @@ static const struct usb_config axe_config[AXE_N_TRANSFER] = {
},
};
+static const struct ax88772b_mfb ax88772b_mfb_table[] = {
+ { 0x8000, 0x8001, 2048 },
+ { 0x8100, 0x8147, 4096},
+ { 0x8200, 0x81EB, 6144},
+ { 0x8300, 0x83D7, 8192},
+ { 0x8400, 0x851E, 16384},
+ { 0x8500, 0x8666, 20480},
+ { 0x8600, 0x87AE, 24576},
+ { 0x8700, 0x8A3D, 32768}
+};
+
static device_method_t axe_methods[] = {
/* Device interface */
DEVMETHOD(device_probe, axe_probe),
@@ -225,7 +239,6 @@ static device_method_t axe_methods[] = {
/* bus interface */
DEVMETHOD(bus_print_child, bus_generic_print_child),
- DEVMETHOD(bus_driver_added, bus_generic_driver_added),
/* MII interface */
DEVMETHOD(miibus_readreg, axe_miibus_readreg),
@@ -669,16 +682,11 @@ axe_ax88772_init(struct axe_softc *sc)
}
static void
-axe_ax88772a_init(struct axe_softc *sc)
+axe_ax88772_phywake(struct axe_softc *sc)
{
struct usb_ether *ue;
- uint16_t eeprom;
ue = &sc->sc_ue;
- axe_cmd(sc, AXE_CMD_SROM_READ, 0, 0x0017, &eeprom);
- eeprom = le16toh(eeprom);
- /* Reload EEPROM. */
- AXE_GPIO_WRITE(AXE_GPIO_RELOAD_EEPROM, hz / 32);
if (sc->sc_phyno == AXE_772_PHY_NO_EPHY) {
/* Manually select internal(embedded) PHY - MAC mode. */
axe_cmd(sc, AXE_CMD_SW_PHY_SELECT, 0, AXE_SW_PHY_SELECT_SS_ENB |
@@ -704,6 +712,55 @@ axe_ax88772a_init(struct axe_softc *sc)
uether_pause(&sc->sc_ue, hz / 32);
axe_cmd(sc, AXE_CMD_SW_RESET_REG, 0, AXE_SW_RESET_IPRL, NULL);
uether_pause(&sc->sc_ue, hz / 32);
+}
+
+static void
+axe_ax88772a_init(struct axe_softc *sc)
+{
+ struct usb_ether *ue;
+
+ ue = &sc->sc_ue;
+ /* Reload EEPROM. */
+ AXE_GPIO_WRITE(AXE_GPIO_RELOAD_EEPROM, hz / 32);
+ axe_ax88772_phywake(sc);
+ /* Stop MAC. */
+ axe_cmd(sc, AXE_CMD_RXCTL_WRITE, 0, 0, NULL);
+}
+
+static void
+axe_ax88772b_init(struct axe_softc *sc)
+{
+ struct usb_ether *ue;
+ uint16_t eeprom;
+ uint8_t *eaddr;
+ int i;
+
+ ue = &sc->sc_ue;
+ /* Reload EEPROM. */
+ AXE_GPIO_WRITE(AXE_GPIO_RELOAD_EEPROM, hz / 32);
+ /*
+ * Save PHY power saving configuration(high byte) and
+ * clear EEPROM checksum value(low byte).
+ */
+ axe_cmd(sc, AXE_CMD_SROM_READ, 0, AXE_EEPROM_772B_PHY_PWRCFG, &eeprom);
+ sc->sc_pwrcfg = le16toh(eeprom) & 0xFF00;
+
+ /*
+ * Auto-loaded default station address from internal ROM is
+ * 00:00:00:00:00:00 such that an explicit access to EEPROM
+ * is required to get real station address.
+ */
+ eaddr = ue->ue_eaddr;
+ for (i = 0; i < ETHER_ADDR_LEN / 2; i++) {
+ axe_cmd(sc, AXE_CMD_SROM_READ, 0, AXE_EEPROM_772B_NODE_ID + i,
+ &eeprom);
+ eeprom = le16toh(eeprom);
+ *eaddr++ = (uint8_t)(eeprom & 0xFF);
+ *eaddr++ = (uint8_t)((eeprom >> 8) & 0xFF);
+ }
+ /* Wakeup PHY. */
+ axe_ax88772_phywake(sc);
+ /* Stop MAC. */
axe_cmd(sc, AXE_CMD_RXCTL_WRITE, 0, 0, NULL);
}
@@ -732,6 +789,8 @@ axe_reset(struct axe_softc *sc)
axe_ax88772_init(sc);
else if (sc->sc_flags & AXE_FLAG_772A)
axe_ax88772a_init(sc);
+ else if (sc->sc_flags & AXE_FLAG_772B)
+ axe_ax88772b_init(sc);
}
static void
@@ -755,29 +814,29 @@ axe_attach_post(struct usb_ether *ue)
sc->sc_phyno = 0;
}
+ /* Initialize controller and get station address. */
if (sc->sc_flags & AXE_FLAG_178) {
axe_ax88178_init(sc);
sc->sc_tx_bufsz = 16 * 1024;
+ axe_cmd(sc, AXE_178_CMD_READ_NODEID, 0, 0, ue->ue_eaddr);
} else if (sc->sc_flags & AXE_FLAG_772) {
axe_ax88772_init(sc);
sc->sc_tx_bufsz = 8 * 1024;
+ axe_cmd(sc, AXE_178_CMD_READ_NODEID, 0, 0, ue->ue_eaddr);
} else if (sc->sc_flags & AXE_FLAG_772A) {
axe_ax88772a_init(sc);
sc->sc_tx_bufsz = 8 * 1024;
- }
-
- /*
- * Get station address.
- */
- if (AXE_IS_178_FAMILY(sc))
axe_cmd(sc, AXE_178_CMD_READ_NODEID, 0, 0, ue->ue_eaddr);
- else
+ } else if (sc->sc_flags & AXE_FLAG_772B) {
+ axe_ax88772b_init(sc);
+ sc->sc_tx_bufsz = 8 * 1024;
+ } else
axe_cmd(sc, AXE_172_CMD_READ_NODEID, 0, 0, ue->ue_eaddr);
/*
* Fetch IPG values.
*/
- if (sc->sc_flags & AXE_FLAG_772A) {
+ if (sc->sc_flags & (AXE_FLAG_772A | AXE_FLAG_772B)) {
/* Set IPG values. */
sc->sc_ipgs[0] = 0x15;
sc->sc_ipgs[1] = 0x16;
@@ -1104,18 +1163,30 @@ axe_init(struct usb_ether *ue)
axe_cmd(sc, AXE_172_CMD_WRITE_IPG2, 0, sc->sc_ipgs[2], NULL);
}
- /* Enable receiver, set RX mode */
+ /* AX88772B uses different maximum frame burst configuration. */
+ if (sc->sc_flags & AXE_FLAG_772B)
+ axe_cmd(sc, AXE_772B_CMD_RXCTL_WRITE_CFG,
+ ax88772b_mfb_table[AX88772B_MFB_16K].threshold,
+ ax88772b_mfb_table[AX88772B_MFB_16K].byte_cnt, NULL);
+
+ /* Enable receiver, set RX mode. */
rxmode = (AXE_RXCMD_MULTICAST | AXE_RXCMD_ENABLE);
if (AXE_IS_178_FAMILY(sc)) {
-#if 0
- rxmode |= AXE_178_RXCMD_MFB_2048; /* chip default */
-#else
- /*
- * Default Rx buffer size is too small to get
- * maximum performance.
- */
- rxmode |= AXE_178_RXCMD_MFB_16384;
-#endif
+ if (sc->sc_flags & AXE_FLAG_772B) {
+ /*
+ * Select RX header format type 1. Aligning IP
+ * header on 4 byte boundary is not needed
+ * because we always copy the received frame in
+ * RX handler.
+ */
+ rxmode |= AXE_772B_RXCMD_HDR_TYPE_1;
+ } else {
+ /*
+ * Default Rx buffer size is too small to get
+ * maximum performance.
+ */
+ rxmode |= AXE_178_RXCMD_MFB_16384;
+ }
} else {
rxmode |= AXE_172_RXCMD_UNICAST;
}
diff --git a/sys/dev/usb/net/if_axereg.h b/sys/dev/usb/net/if_axereg.h
index 6772911..6e08997 100644
--- a/sys/dev/usb/net/if_axereg.h
+++ b/sys/dev/usb/net/if_axereg.h
@@ -96,6 +96,8 @@
#define AXE_CMD_READ_VLAN_CTRL 0x4027
#define AXE_CMD_WRITE_VLAN_CTRL 0x4028
+#define AXE_772B_CMD_RXCTL_WRITE_CFG 0x012A
+
#define AXE_SW_RESET_CLEAR 0x00
#define AXE_SW_RESET_RR 0x01
#define AXE_SW_RESET_RT 0x02
@@ -132,12 +134,18 @@
#define AXE_178_RXCMD_KEEP_INVALID_CRC 0x0004
#define AXE_RXCMD_BROADCAST 0x0008
#define AXE_RXCMD_MULTICAST 0x0010
+#define AXE_RXCMD_ACCEPT_RUNT 0x0040 /* AX88772B */
#define AXE_RXCMD_ENABLE 0x0080
#define AXE_178_RXCMD_MFB_MASK 0x0300
#define AXE_178_RXCMD_MFB_2048 0x0000
#define AXE_178_RXCMD_MFB_4096 0x0100
#define AXE_178_RXCMD_MFB_8192 0x0200
#define AXE_178_RXCMD_MFB_16384 0x0300
+#define AXE_772B_RXCMD_HDR_TYPE_0 0x0000
+#define AXE_772B_RXCMD_HDR_TYPE_1 0x0100
+#define AXE_772B_RXCMD_IPHDR_ALIGN 0x0200
+#define AXE_772B_RXCMD_ADD_CHKSUM 0x0400
+#define AXE_RXCMD_LOOPBACK 0x1000 /* AX88772A/AX88772B */
#define AXE_PHY_SEL_PRI 1
#define AXE_PHY_SEL_SEC 0
@@ -176,7 +184,7 @@
#define AXE_PHY_MODE_REALTEK_8251CL 0x0E
#define AXE_PHY_MODE_ATTANSIC 0x40
-/* AX88772A only. */
+/* AX88772A/AX88772B only. */
#define AXE_SW_PHY_SELECT_EXT 0x0000
#define AXE_SW_PHY_SELECT_EMBEDDED 0x0001
#define AXE_SW_PHY_SELECT_AUTO 0x0002
@@ -199,6 +207,24 @@
#define AXE_CONFIG_IDX 0 /* config number 1 */
#define AXE_IFACE_IDX 0
+/* EEPROM Map. */
+#define AXE_EEPROM_772B_NODE_ID 0x04
+#define AXE_EEPROM_772B_PHY_PWRCFG 0x18
+
+struct ax88772b_mfb {
+ int byte_cnt;
+ int threshold;
+ int size;
+};
+#define AX88772B_MFB_2K 0
+#define AX88772B_MFB_4K 1
+#define AX88772B_MFB_6K 2
+#define AX88772B_MFB_8K 3
+#define AX88772B_MFB_16K 4
+#define AX88772B_MFB_20K 5
+#define AX88772B_MFB_24K 6
+#define AX88772B_MFB_32K 7
+
struct axe_sframe_hdr {
uint16_t len;
uint16_t ilen;
@@ -228,6 +254,7 @@ struct axe_softc {
uint8_t sc_ipgs[3];
uint8_t sc_phyaddrs[2];
+ uint16_t sc_pwrcfg;
int sc_tx_bufsz;
};
diff --git a/sys/dev/usb/net/if_mos.c b/sys/dev/usb/net/if_mos.c
index 1e884f9..0cbea91 100644
--- a/sys/dev/usb/net/if_mos.c
+++ b/sys/dev/usb/net/if_mos.c
@@ -222,7 +222,6 @@ static device_method_t mos_methods[] = {
/* bus interface */
DEVMETHOD(bus_print_child, bus_generic_print_child),
- DEVMETHOD(bus_driver_added, bus_generic_driver_added),
/* MII interface */
DEVMETHOD(miibus_readreg, mos_miibus_readreg),
diff --git a/sys/dev/usb/net/if_rue.c b/sys/dev/usb/net/if_rue.c
index afd2f4d..3e3a151 100644
--- a/sys/dev/usb/net/if_rue.c
+++ b/sys/dev/usb/net/if_rue.c
@@ -188,7 +188,6 @@ static device_method_t rue_methods[] = {
/* Bus interface */
DEVMETHOD(bus_print_child, bus_generic_print_child),
- DEVMETHOD(bus_driver_added, bus_generic_driver_added),
/* MII interface */
DEVMETHOD(miibus_readreg, rue_miibus_readreg),
diff --git a/sys/dev/usb/net/if_udav.c b/sys/dev/usb/net/if_udav.c
index d2cceaa..ea35127 100644
--- a/sys/dev/usb/net/if_udav.c
+++ b/sys/dev/usb/net/if_udav.c
@@ -147,7 +147,6 @@ static device_method_t udav_methods[] = {
/* bus interface */
DEVMETHOD(bus_print_child, bus_generic_print_child),
- DEVMETHOD(bus_driver_added, bus_generic_driver_added),
/* MII interface */
DEVMETHOD(miibus_readreg, udav_miibus_readreg),
diff --git a/sys/dev/usb/net/if_usie.c b/sys/dev/usb/net/if_usie.c
new file mode 100644
index 0000000..cda1d3d
--- /dev/null
+++ b/sys/dev/usb/net/if_usie.c
@@ -0,0 +1,1586 @@
+/*-
+ * Copyright (c) 2011 Anybots Inc
+ * written by Akinori Furukoshi <moonlightakkiy@yahoo.ca>
+ * - ucom part is based on u3g.c
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+#include <sys/param.h>
+#include <sys/systm.h>
+#include <sys/queue.h>
+#include <sys/systm.h>
+#include <sys/kernel.h>
+#include <sys/bus.h>
+#include <sys/module.h>
+#include <sys/sockio.h>
+#include <sys/socket.h>
+#include <sys/lock.h>
+#include <sys/mutex.h>
+#include <sys/condvar.h>
+#include <sys/sysctl.h>
+#include <sys/malloc.h>
+#include <sys/taskqueue.h>
+
+#include <machine/bus.h>
+
+#include <net/if.h>
+#include <net/if_types.h>
+#include <net/netisr.h>
+#include <net/bpf.h>
+#include <net/ethernet.h>
+
+#include <netinet/in.h>
+#include <netinet/ip.h>
+#include <netinet/ip6.h>
+#include <netinet/udp.h>
+
+#include <net80211/ieee80211_ioctl.h>
+
+#include <dev/usb/usb.h>
+#include <dev/usb/usbdi.h>
+#include <dev/usb/usbdi_util.h>
+#include <dev/usb/usb_cdc.h>
+#include "usbdevs.h"
+
+#define USB_DEBUG_VAR usie_debug
+#include <dev/usb/usb_debug.h>
+#include <dev/usb/usb_process.h>
+#include <dev/usb/usb_msctest.h>
+
+#include <dev/usb/serial/usb_serial.h>
+
+#include <dev/usb/net/if_usievar.h>
+
+#ifdef USB_DEBUG
+static int usie_debug = 0;
+
+SYSCTL_NODE(_hw_usb, OID_AUTO, usie, CTLFLAG_RW, 0, "sierra USB modem");
+SYSCTL_INT(_hw_usb_usie, OID_AUTO, debug, CTLFLAG_RW, &usie_debug, 0,
+ "usie debug level");
+#endif
+
+/* Sierra Wireless Direct IP modems */
+static const STRUCT_USB_HOST_ID usie_devs[] = {
+#define USIE_DEV(v, d) { \
+ USB_VP(USB_VENDOR_##v, USB_PRODUCT_##v##_##d) }
+ USIE_DEV(SIERRA, MC8700),
+ USIE_DEV(SIERRA, TRUINSTALL),
+ USIE_DEV(AIRPRIME, USB308),
+#undef USIE_DEV
+};
+
+static device_probe_t usie_probe;
+static device_attach_t usie_attach;
+static device_detach_t usie_detach;
+
+static void usie_uc_update_line_state(struct ucom_softc *, uint8_t);
+static void usie_uc_cfg_get_status(struct ucom_softc *, uint8_t *, uint8_t *);
+static void usie_uc_cfg_set_dtr(struct ucom_softc *, uint8_t);
+static void usie_uc_cfg_set_rts(struct ucom_softc *, uint8_t);
+static void usie_uc_cfg_open(struct ucom_softc *);
+static void usie_uc_cfg_close(struct ucom_softc *);
+static void usie_uc_start_read(struct ucom_softc *);
+static void usie_uc_stop_read(struct ucom_softc *);
+static void usie_uc_start_write(struct ucom_softc *);
+static void usie_uc_stop_write(struct ucom_softc *);
+
+static usb_callback_t usie_uc_tx_callback;
+static usb_callback_t usie_uc_rx_callback;
+static usb_callback_t usie_uc_status_callback;
+static usb_callback_t usie_if_tx_callback;
+static usb_callback_t usie_if_rx_callback;
+static usb_callback_t usie_if_status_callback;
+
+static void usie_if_sync_to(void *);
+static void usie_if_sync_cb(void *, int);
+static void usie_if_status_cb(void *, int);
+
+static void usie_if_start(struct ifnet *);
+static int usie_if_output(struct ifnet *, struct mbuf *, struct sockaddr *, struct route *);
+static void usie_if_init(void *);
+static void usie_if_stop(struct usie_softc *);
+static int usie_if_ioctl(struct ifnet *, u_long, caddr_t);
+
+static int usie_do_request(struct usie_softc *, struct usb_device_request *, void *);
+static int usie_if_cmd(struct usie_softc *, uint8_t);
+static void usie_cns_req(struct usie_softc *, uint32_t, uint16_t);
+static void usie_cns_rsp(struct usie_softc *, struct usie_cns *);
+static void usie_hip_rsp(struct usie_softc *, uint8_t *, uint32_t);
+static int usie_driver_loaded(struct module *, int, void *);
+
+static const struct usb_config usie_uc_config[USIE_UC_N_XFER] = {
+ [USIE_UC_STATUS] = {
+ .type = UE_INTERRUPT,
+ .endpoint = UE_ADDR_ANY,
+ .direction = UE_DIR_IN,
+ .bufsize = 0, /* use wMaxPacketSize */
+ .flags = {.pipe_bof = 1,.short_xfer_ok = 1,},
+ .callback = &usie_uc_status_callback,
+ },
+ [USIE_UC_RX] = {
+ .type = UE_BULK,
+ .endpoint = UE_ADDR_ANY,
+ .direction = UE_DIR_IN,
+ .bufsize = USIE_BUFSIZE,
+ .flags = {.pipe_bof = 1,.short_xfer_ok = 1,.proxy_buffer = 1,},
+ .callback = &usie_uc_rx_callback,
+ },
+ [USIE_UC_TX] = {
+ .type = UE_BULK,
+ .endpoint = UE_ADDR_ANY,
+ .direction = UE_DIR_OUT,
+ .bufsize = USIE_BUFSIZE,
+ .flags = {.pipe_bof = 1,.force_short_xfer = 1,},
+ .callback = &usie_uc_tx_callback,
+ }
+};
+
+static const struct usb_config usie_if_config[USIE_IF_N_XFER] = {
+ [USIE_IF_STATUS] = {
+ .type = UE_INTERRUPT,
+ .endpoint = UE_ADDR_ANY,
+ .direction = UE_DIR_IN,
+ .bufsize = 0, /* use wMaxPacketSize */
+ .flags = {.pipe_bof = 1,.short_xfer_ok = 1,},
+ .callback = &usie_if_status_callback,
+ },
+ [USIE_IF_RX] = {
+ .type = UE_BULK,
+ .endpoint = UE_ADDR_ANY,
+ .direction = UE_DIR_IN,
+ .bufsize = USIE_BUFSIZE,
+ .flags = {.pipe_bof = 1,.short_xfer_ok = 1,},
+ .callback = &usie_if_rx_callback,
+ },
+ [USIE_IF_TX] = {
+ .type = UE_BULK,
+ .endpoint = UE_ADDR_ANY,
+ .direction = UE_DIR_OUT,
+ .bufsize = MAX(USIE_BUFSIZE, MCLBYTES),
+ .flags = {.pipe_bof = 1,.force_short_xfer = 1,},
+ .callback = &usie_if_tx_callback,
+ }
+};
+
+static device_method_t usie_methods[] = {
+ DEVMETHOD(device_probe, usie_probe),
+ DEVMETHOD(device_attach, usie_attach),
+ DEVMETHOD(device_detach, usie_detach),
+ {0, 0}
+};
+
+static driver_t usie_driver = {
+ .name = "usie",
+ .methods = usie_methods,
+ .size = sizeof(struct usie_softc),
+};
+
+static devclass_t usie_devclass;
+static eventhandler_tag usie_etag;
+
+DRIVER_MODULE(usie, uhub, usie_driver, usie_devclass, usie_driver_loaded, 0);
+MODULE_DEPEND(usie, ucom, 1, 1, 1);
+MODULE_DEPEND(usie, usb, 1, 1, 1);
+MODULE_VERSION(usie, 1);
+
+static const struct ucom_callback usie_uc_callback = {
+ .ucom_cfg_get_status = &usie_uc_cfg_get_status,
+ .ucom_cfg_set_dtr = &usie_uc_cfg_set_dtr,
+ .ucom_cfg_set_rts = &usie_uc_cfg_set_rts,
+ .ucom_cfg_open = &usie_uc_cfg_open,
+ .ucom_cfg_close = &usie_uc_cfg_close,
+ .ucom_start_read = &usie_uc_start_read,
+ .ucom_stop_read = &usie_uc_stop_read,
+ .ucom_start_write = &usie_uc_start_write,
+ .ucom_stop_write = &usie_uc_stop_write,
+};
+
+static void
+usie_autoinst(void *arg, struct usb_device *udev,
+ struct usb_attach_arg *uaa)
+{
+ struct usb_interface *iface;
+ struct usb_interface_descriptor *id;
+ struct usb_device_request req;
+ int err;
+
+ if (uaa->dev_state != UAA_DEV_READY)
+ return;
+
+ iface = usbd_get_iface(udev, 0);
+ if (iface == NULL)
+ return;
+
+ id = iface->idesc;
+ if (id == NULL || id->bInterfaceClass != UICLASS_MASS)
+ return;
+
+ if (usbd_lookup_id_by_uaa(usie_devs, sizeof(usie_devs), uaa) != 0)
+ return; /* no device match */
+
+ if (bootverbose) {
+ DPRINTF("Ejecting %s %s\n",
+ usb_get_manufacturer(udev),
+ usb_get_product(udev));
+ }
+ req.bmRequestType = UT_VENDOR;
+ req.bRequest = UR_SET_INTERFACE;
+ USETW(req.wValue, UF_DEVICE_REMOTE_WAKEUP);
+ USETW(req.wIndex, UHF_PORT_CONNECTION);
+ USETW(req.wLength, 0);
+
+ /* at this moment there is no mutex */
+ err = usbd_do_request_flags(udev, NULL, &req,
+ NULL, 0, NULL, 250 /* ms */ );
+
+ /* success, mark the udev as disappearing */
+ if (err == 0)
+ uaa->dev_state = UAA_DEV_EJECTING;
+}
+
+static int
+usie_probe(device_t self)
+{
+ struct usb_attach_arg *uaa = device_get_ivars(self);
+
+ if (uaa->usb_mode != USB_MODE_HOST)
+ return (ENXIO);
+ if (uaa->info.bConfigIndex != USIE_CNFG_INDEX)
+ return (ENXIO);
+ if (uaa->info.bIfaceIndex != USIE_IFACE_INDEX)
+ return (ENXIO);
+ if (uaa->info.bInterfaceClass != UICLASS_VENDOR)
+ return (ENXIO);
+
+ return (usbd_lookup_id_by_uaa(usie_devs, sizeof(usie_devs), uaa));
+}
+
+static int
+usie_attach(device_t self)
+{
+ struct usie_softc *sc = device_get_softc(self);
+ struct usb_attach_arg *uaa = device_get_ivars(self);
+ struct ifnet *ifp;
+ struct usb_interface *iface;
+ struct usb_interface_descriptor *id;
+ struct usb_device_request req;
+ int err;
+ uint16_t fwattr;
+ uint8_t iface_index;
+ uint8_t ifidx;
+ uint8_t start;
+
+ device_set_usb_desc(self);
+ sc->sc_udev = uaa->device;
+ sc->sc_dev = self;
+
+ mtx_init(&sc->sc_mtx, "usie", MTX_NETWORK_LOCK, MTX_DEF);
+
+ TASK_INIT(&sc->sc_if_status_task, 0, usie_if_status_cb, sc);
+ TASK_INIT(&sc->sc_if_sync_task, 0, usie_if_sync_cb, sc);
+
+ usb_callout_init_mtx(&sc->sc_if_sync_ch, &sc->sc_mtx, 0);
+
+ mtx_lock(&sc->sc_mtx);
+
+ /* set power mode to D0 */
+ req.bmRequestType = UT_WRITE_VENDOR_DEVICE;
+ req.bRequest = USIE_POWER;
+ USETW(req.wValue, 0);
+ USETW(req.wIndex, 0);
+ USETW(req.wLength, 0);
+ if (usie_do_request(sc, &req, NULL)) {
+ mtx_unlock(&sc->sc_mtx);
+ goto detach;
+ }
+ /* read fw attr */
+ fwattr = 0;
+ req.bmRequestType = UT_READ_VENDOR_DEVICE;
+ req.bRequest = USIE_FW_ATTR;
+ USETW(req.wValue, 0);
+ USETW(req.wIndex, 0);
+ USETW(req.wLength, sizeof(fwattr));
+ if (usie_do_request(sc, &req, &fwattr)) {
+ mtx_unlock(&sc->sc_mtx);
+ goto detach;
+ }
+ mtx_unlock(&sc->sc_mtx);
+
+ /* check DHCP supports */
+ DPRINTF("fwattr=%x\n", fwattr);
+ if (!(fwattr & USIE_FW_DHCP)) {
+ device_printf(self, "DHCP is not supported. A firmware upgrade might be needed.\n");
+ }
+
+ /* find available interfaces */
+ sc->sc_nucom = 0;
+ for (ifidx = 0; ifidx < USIE_IFACE_MAX; ifidx++) {
+ iface = usbd_get_iface(uaa->device, ifidx);
+ if (iface == NULL)
+ break;
+
+ id = usbd_get_interface_descriptor(iface);
+ if ((id == NULL) || (id->bInterfaceClass != UICLASS_VENDOR))
+ continue;
+
+ /* setup Direct IP transfer */
+ if (id->bInterfaceNumber >= 7 && id->bNumEndpoints == 3) {
+ sc->sc_if_ifnum = id->bInterfaceNumber;
+ iface_index = ifidx;
+
+ DPRINTF("ifnum=%d, ifidx=%d\n",
+ sc->sc_if_ifnum, ifidx);
+
+ err = usbd_transfer_setup(uaa->device,
+ &iface_index, sc->sc_if_xfer, usie_if_config,
+ USIE_IF_N_XFER, sc, &sc->sc_mtx);
+
+ if (err == 0)
+ continue;
+
+ device_printf(self,
+ "could not allocate USB transfers on "
+ "iface_index=%d, err=%s\n",
+ iface_index, usbd_errstr(err));
+ goto detach;
+ }
+
+ /* setup ucom */
+ if (sc->sc_nucom >= USIE_UCOM_MAX)
+ continue;
+
+ usbd_set_parent_iface(uaa->device, ifidx,
+ uaa->info.bIfaceIndex);
+
+ DPRINTF("NumEndpoints=%d bInterfaceNumber=%d\n",
+ id->bNumEndpoints, id->bInterfaceNumber);
+
+ if (id->bNumEndpoints == 2) {
+ sc->sc_uc_xfer[sc->sc_nucom][0] = NULL;
+ start = 1;
+ } else
+ start = 0;
+
+ err = usbd_transfer_setup(uaa->device, &ifidx,
+ sc->sc_uc_xfer[sc->sc_nucom] + start,
+ usie_uc_config + start, USIE_UC_N_XFER - start,
+ &sc->sc_ucom[sc->sc_nucom], &sc->sc_mtx);
+
+ if (err != 0) {
+ DPRINTF("usbd_transfer_setup error=%s\n", usbd_errstr(err));
+ continue;
+ }
+
+ mtx_lock(&sc->sc_mtx);
+ for (; start < USIE_UC_N_XFER; start++)
+ usbd_xfer_set_stall(sc->sc_uc_xfer[sc->sc_nucom][start]);
+ mtx_unlock(&sc->sc_mtx);
+
+ sc->sc_uc_ifnum[sc->sc_nucom] = id->bInterfaceNumber;
+
+ sc->sc_nucom++; /* found a port */
+ }
+
+ if (sc->sc_nucom == 0) {
+ device_printf(self, "no comports found\n");
+ goto detach;
+ }
+
+ err = ucom_attach(&sc->sc_super_ucom, sc->sc_ucom,
+ sc->sc_nucom, sc, &usie_uc_callback, &sc->sc_mtx);
+
+ if (err != 0) {
+ DPRINTF("ucom_attach failed\n");
+ goto detach;
+ }
+ DPRINTF("Found %d interfaces.\n", sc->sc_nucom);
+
+ /* setup ifnet (Direct IP) */
+ sc->sc_ifp = ifp = if_alloc(IFT_OTHER);
+
+ if (ifp == NULL) {
+ device_printf(self, "Could not allocate a network interface\n");
+ goto detach;
+ }
+ if_initname(ifp, "usie", device_get_unit(self));
+
+ ifp->if_softc = sc;
+ ifp->if_mtu = USIE_MTU_MAX;
+ ifp->if_flags |= IFF_NOARP;
+ ifp->if_init = usie_if_init;
+ ifp->if_ioctl = usie_if_ioctl;
+ ifp->if_start = usie_if_start;
+ ifp->if_output = usie_if_output;
+ IFQ_SET_MAXLEN(&ifp->if_snd, ifqmaxlen);
+ ifp->if_snd.ifq_drv_maxlen = ifqmaxlen;
+ IFQ_SET_READY(&ifp->if_snd);
+
+ if_attach(ifp);
+ bpfattach(ifp, DLT_RAW, 0);
+
+ if (fwattr & USIE_PM_AUTO) {
+ usbd_set_power_mode(uaa->device, USB_POWER_MODE_SAVE);
+ DPRINTF("enabling automatic suspend and resume\n");
+ } else {
+ usbd_set_power_mode(uaa->device, USB_POWER_MODE_ON);
+ DPRINTF("USB power is always ON\n");
+ }
+
+ DPRINTF("device attached\n");
+ return (0);
+
+detach:
+ usie_detach(self);
+ return (ENOMEM);
+}
+
+static int
+usie_detach(device_t self)
+{
+ struct usie_softc *sc = device_get_softc(self);
+ uint8_t x;
+
+ /* detach ifnet */
+ if (sc->sc_ifp != NULL) {
+ usie_if_stop(sc);
+ usbd_transfer_unsetup(sc->sc_if_xfer, USIE_IF_N_XFER);
+ bpfdetach(sc->sc_ifp);
+ if_detach(sc->sc_ifp);
+ if_free(sc->sc_ifp);
+ sc->sc_ifp = NULL;
+ }
+ /* detach ucom */
+ if (sc->sc_nucom > 0)
+ ucom_detach(&sc->sc_super_ucom, sc->sc_ucom);
+
+ /* stop all USB transfers */
+ usbd_transfer_unsetup(sc->sc_if_xfer, USIE_IF_N_XFER);
+
+ for (x = 0; x != USIE_UCOM_MAX; x++)
+ usbd_transfer_unsetup(sc->sc_uc_xfer[x], USIE_UC_N_XFER);
+
+ mtx_destroy(&sc->sc_mtx);
+
+ return (0);
+}
+
+static void
+usie_uc_update_line_state(struct ucom_softc *ucom, uint8_t ls)
+{
+ struct usie_softc *sc = ucom->sc_parent;
+ struct usb_device_request req;
+
+ if (sc->sc_uc_xfer[ucom->sc_subunit][USIE_UC_STATUS] == NULL)
+ return;
+
+ req.bmRequestType = UT_WRITE_CLASS_INTERFACE;
+ req.bRequest = USIE_LINK_STATE;
+ USETW(req.wValue, ls);
+ USETW(req.wIndex, sc->sc_uc_ifnum[ucom->sc_subunit]);
+ USETW(req.wLength, 0);
+
+ DPRINTF("sc_uc_ifnum=%d\n", sc->sc_uc_ifnum[ucom->sc_subunit]);
+
+ usie_do_request(sc, &req, NULL);
+}
+
+static void
+usie_uc_cfg_get_status(struct ucom_softc *ucom, uint8_t *lsr, uint8_t *msr)
+{
+ struct usie_softc *sc = ucom->sc_parent;
+
+ *msr = sc->sc_msr;
+ *lsr = sc->sc_lsr;
+}
+
+static void
+usie_uc_cfg_set_dtr(struct ucom_softc *ucom, uint8_t flag)
+{
+ uint8_t dtr;
+
+ dtr = flag ? USIE_LS_DTR : 0;
+ usie_uc_update_line_state(ucom, dtr);
+}
+
+static void
+usie_uc_cfg_set_rts(struct ucom_softc *ucom, uint8_t flag)
+{
+ uint8_t rts;
+
+ rts = flag ? USIE_LS_RTS : 0;
+ usie_uc_update_line_state(ucom, rts);
+}
+
+static void
+usie_uc_cfg_open(struct ucom_softc *ucom)
+{
+ struct usie_softc *sc = ucom->sc_parent;
+
+ /* usbd_transfer_start() is NULL safe */
+
+ usbd_transfer_start(sc->sc_uc_xfer[ucom->sc_subunit][USIE_UC_STATUS]);
+}
+
+static void
+usie_uc_cfg_close(struct ucom_softc *ucom)
+{
+ struct usie_softc *sc = ucom->sc_parent;
+
+ usbd_transfer_stop(sc->sc_uc_xfer[ucom->sc_subunit][USIE_UC_STATUS]);
+}
+
+static void
+usie_uc_start_read(struct ucom_softc *ucom)
+{
+ struct usie_softc *sc = ucom->sc_parent;
+
+ usbd_transfer_start(sc->sc_uc_xfer[ucom->sc_subunit][USIE_UC_RX]);
+}
+
+static void
+usie_uc_stop_read(struct ucom_softc *ucom)
+{
+ struct usie_softc *sc = ucom->sc_parent;
+
+ usbd_transfer_stop(sc->sc_uc_xfer[ucom->sc_subunit][USIE_UC_RX]);
+}
+
+static void
+usie_uc_start_write(struct ucom_softc *ucom)
+{
+ struct usie_softc *sc = ucom->sc_parent;
+
+ usbd_transfer_start(sc->sc_uc_xfer[ucom->sc_subunit][USIE_UC_TX]);
+}
+
+static void
+usie_uc_stop_write(struct ucom_softc *ucom)
+{
+ struct usie_softc *sc = ucom->sc_parent;
+
+ usbd_transfer_stop(sc->sc_uc_xfer[ucom->sc_subunit][USIE_UC_TX]);
+}
+
+static void
+usie_uc_rx_callback(struct usb_xfer *xfer, usb_error_t error)
+{
+ struct ucom_softc *ucom = usbd_xfer_softc(xfer);
+ struct usie_softc *sc = ucom->sc_parent;
+ struct usb_page_cache *pc;
+ uint32_t actlen;
+
+ usbd_xfer_status(xfer, &actlen, NULL, NULL, NULL);
+
+ switch (USB_GET_STATE(xfer)) {
+ case USB_ST_TRANSFERRED:
+ pc = usbd_xfer_get_frame(xfer, 0);
+
+ /* handle CnS response */
+ if (ucom == sc->sc_ucom && actlen >= USIE_HIPCNS_MIN) {
+
+ DPRINTF("transferred=%u\n", actlen);
+
+ /* check if it is really CnS reply */
+ usbd_copy_out(pc, 0, sc->sc_resp_temp, 1);
+
+ if (sc->sc_resp_temp[0] == USIE_HIP_FRM_CHR) {
+
+ /* verify actlen */
+ if (actlen > USIE_BUFSIZE)
+ actlen = USIE_BUFSIZE;
+
+ /* get complete message */
+ usbd_copy_out(pc, 0, sc->sc_resp_temp, actlen);
+ usie_hip_rsp(sc, sc->sc_resp_temp, actlen);
+
+ /* need to fall though */
+ goto tr_setup;
+ }
+ /* else call ucom_put_data() */
+ }
+ /* standard ucom transfer */
+ ucom_put_data(ucom, pc, 0, actlen);
+
+ /* fall though */
+ case USB_ST_SETUP:
+tr_setup:
+ usbd_xfer_set_frame_len(xfer, 0, usbd_xfer_max_len(xfer));
+ usbd_transfer_submit(xfer);
+ break;
+
+ default: /* Error */
+ if (error != USB_ERR_CANCELLED) {
+ usbd_xfer_set_stall(xfer);
+ goto tr_setup;
+ }
+ break;
+ }
+}
+
+static void
+usie_uc_tx_callback(struct usb_xfer *xfer, usb_error_t error)
+{
+ struct ucom_softc *ucom = usbd_xfer_softc(xfer);
+ struct usb_page_cache *pc;
+ uint32_t actlen;
+
+ switch (USB_GET_STATE(xfer)) {
+ case USB_ST_TRANSFERRED:
+ case USB_ST_SETUP:
+tr_setup:
+ pc = usbd_xfer_get_frame(xfer, 0);
+
+ /* handle CnS request */
+ struct mbuf *m = usbd_xfer_get_priv(xfer);
+
+ if (m != NULL) {
+ usbd_m_copy_in(pc, 0, m, 0, m->m_pkthdr.len);
+ usbd_xfer_set_frame_len(xfer, 0, m->m_pkthdr.len);
+ usbd_xfer_set_priv(xfer, NULL);
+ usbd_transfer_submit(xfer);
+ m_freem(m);
+ break;
+ }
+ /* standard ucom transfer */
+ if (ucom_get_data(ucom, pc, 0, USIE_BUFSIZE, &actlen)) {
+ usbd_xfer_set_frame_len(xfer, 0, actlen);
+ usbd_transfer_submit(xfer);
+ }
+ break;
+
+ default: /* Error */
+ if (error != USB_ERR_CANCELLED) {
+ usbd_xfer_set_stall(xfer);
+ goto tr_setup;
+ }
+ break;
+ }
+}
+
+static void
+usie_uc_status_callback(struct usb_xfer *xfer, usb_error_t error)
+{
+ struct usb_page_cache *pc;
+ struct {
+ struct usb_device_request req;
+ uint16_t param;
+ } st;
+ uint32_t actlen;
+ uint16_t param;
+
+ usbd_xfer_status(xfer, &actlen, NULL, NULL, NULL);
+
+ switch (USB_GET_STATE(xfer)) {
+ case USB_ST_TRANSFERRED:
+ DPRINTFN(4, "info received, actlen=%u\n", actlen);
+
+ if (actlen < sizeof(st)) {
+ DPRINTF("data too short actlen=%u\n", actlen);
+ goto tr_setup;
+ }
+ pc = usbd_xfer_get_frame(xfer, 0);
+ usbd_copy_out(pc, 0, &st, sizeof(st));
+
+ if (st.req.bmRequestType == 0xa1 && st.req.bRequest == 0x20) {
+ struct ucom_softc *ucom = usbd_xfer_softc(xfer);
+ struct usie_softc *sc = ucom->sc_parent;
+
+ param = le16toh(st.param);
+ DPRINTF("param=%x\n", param);
+ sc->sc_msr = sc->sc_lsr = 0;
+ sc->sc_msr |= (param & USIE_DCD) ? SER_DCD : 0;
+ sc->sc_msr |= (param & USIE_DSR) ? SER_DSR : 0;
+ sc->sc_msr |= (param & USIE_RI) ? SER_RI : 0;
+ sc->sc_msr |= (param & USIE_CTS) ? 0 : SER_CTS;
+ sc->sc_msr |= (param & USIE_RTS) ? SER_RTS : 0;
+ sc->sc_msr |= (param & USIE_DTR) ? SER_DTR : 0;
+ }
+ /* fall though */
+ case USB_ST_SETUP:
+tr_setup:
+ usbd_xfer_set_frame_len(xfer, 0, usbd_xfer_max_len(xfer));
+ usbd_transfer_submit(xfer);
+ break;
+
+ default: /* Error */
+ DPRINTF("USB transfer error, %s\n",
+ usbd_errstr(error));
+
+ if (error != USB_ERR_CANCELLED) {
+ usbd_xfer_set_stall(xfer);
+ goto tr_setup;
+ }
+ break;
+ }
+}
+
+static void
+usie_if_rx_callback(struct usb_xfer *xfer, usb_error_t error)
+{
+ struct usie_softc *sc = usbd_xfer_softc(xfer);
+ struct ifnet *ifp = sc->sc_ifp;
+ struct mbuf *m0;
+ struct mbuf *m = NULL;
+ struct usie_desc *rxd;
+ uint32_t actlen;
+ uint16_t err;
+ uint16_t pkt;
+ uint16_t ipl;
+ uint16_t len;
+ uint16_t diff;
+ uint8_t pad;
+ uint8_t ipv;
+
+ usbd_xfer_status(xfer, &actlen, NULL, NULL, NULL);
+
+ switch (USB_GET_STATE(xfer)) {
+ case USB_ST_TRANSFERRED:
+ DPRINTFN(15, "rx done, actlen=%u\n", actlen);
+
+ if (actlen < sizeof(struct usie_hip)) {
+ DPRINTF("data too short %u\n", actlen);
+ goto tr_setup;
+ }
+ m = sc->sc_rxm;
+ sc->sc_rxm = NULL;
+
+ /* fall though */
+ case USB_ST_SETUP:
+tr_setup:
+
+ if (sc->sc_rxm == NULL) {
+ sc->sc_rxm = m_getjcl(M_DONTWAIT, MT_DATA, M_PKTHDR,
+ MJUMPAGESIZE /* could be bigger than MCLBYTES */ );
+ }
+ if (sc->sc_rxm == NULL) {
+ DPRINTF("could not allocate Rx mbuf\n");
+ ifp->if_ierrors++;
+ usbd_xfer_set_stall(xfer);
+ usbd_xfer_set_frames(xfer, 0);
+ } else {
+ /*
+ * Directly loading a mbuf cluster into DMA to
+ * save some data copying. This works because
+ * there is only one cluster.
+ */
+ usbd_xfer_set_frame_data(xfer, 0,
+ mtod(sc->sc_rxm, caddr_t), MIN(MJUMPAGESIZE, USIE_RXSZ_MAX));
+ usbd_xfer_set_frames(xfer, 1);
+ }
+ usbd_transfer_submit(xfer);
+ break;
+
+ default: /* Error */
+ DPRINTF("USB transfer error, %s\n", usbd_errstr(error));
+
+ if (error != USB_ERR_CANCELLED) {
+ /* try to clear stall first */
+ usbd_xfer_set_stall(xfer);
+ ifp->if_ierrors++;
+ goto tr_setup;
+ }
+ if (sc->sc_rxm != NULL) {
+ m_freem(sc->sc_rxm);
+ sc->sc_rxm = NULL;
+ }
+ break;
+ }
+
+ if (m == NULL)
+ return;
+
+ mtx_unlock(&sc->sc_mtx);
+
+ m->m_pkthdr.len = m->m_len = actlen;
+
+ err = pkt = 0;
+
+ /* HW can aggregate multiple frames in a single USB xfer */
+ for (;;) {
+ rxd = mtod(m, struct usie_desc *);
+
+ len = be16toh(rxd->hip.len) & USIE_HIP_IP_LEN_MASK;
+ pad = (rxd->hip.id & USIE_HIP_PAD) ? 1 : 0;
+ ipl = (len - pad - ETHER_HDR_LEN);
+ if (ipl >= len) {
+ DPRINTF("Corrupt frame\n");
+ m_freem(m);
+ break;
+ }
+ diff = sizeof(struct usie_desc) + ipl + pad;
+
+ if (((rxd->hip.id & USIE_HIP_MASK) != USIE_HIP_IP) ||
+ (be16toh(rxd->desc_type) & USIE_TYPE_MASK) != USIE_IP_RX) {
+ DPRINTF("received wrong type of packet\n");
+ m->m_data += diff;
+ m->m_pkthdr.len = (m->m_len -= diff);
+ err++;
+ if (m->m_pkthdr.len > 0)
+ continue;
+ m_freem(m);
+ break;
+ }
+ switch (be16toh(rxd->ethhdr.ether_type)) {
+ case ETHERTYPE_IP:
+ ipv = NETISR_IP;
+ break;
+#ifdef INET6
+ case ETHERTYPE_IPV6:
+ ipv = NETISR_IPV6;
+ break;
+#endif
+ default:
+ DPRINTF("unsupported ether type\n");
+ err++;
+ break;
+ }
+
+ /* the last packet */
+ if (m->m_pkthdr.len <= diff) {
+ m->m_data += (sizeof(struct usie_desc) + pad);
+ m->m_pkthdr.len = m->m_len = ipl;
+ m->m_pkthdr.rcvif = ifp;
+ BPF_MTAP(sc->sc_ifp, m);
+ netisr_dispatch(ipv, m);
+ break;
+ }
+ /* copy aggregated frames to another mbuf */
+ m0 = m_getcl(M_DONTWAIT, MT_DATA, M_PKTHDR);
+ if (__predict_false(m0 == NULL)) {
+ DPRINTF("could not allocate mbuf\n");
+ err++;
+ m_freem(m);
+ break;
+ }
+ m_copydata(m, sizeof(struct usie_desc) + pad, ipl, mtod(m0, caddr_t));
+ m0->m_pkthdr.rcvif = ifp;
+ m0->m_pkthdr.len = m0->m_len = ipl;
+
+ BPF_MTAP(sc->sc_ifp, m0);
+ netisr_dispatch(ipv, m0);
+
+ m->m_data += diff;
+ m->m_pkthdr.len = (m->m_len -= diff);
+ }
+
+ mtx_lock(&sc->sc_mtx);
+
+ ifp->if_ierrors += err;
+ ifp->if_ipackets += pkt;
+}
+
+static void
+usie_if_tx_callback(struct usb_xfer *xfer, usb_error_t error)
+{
+ struct usie_softc *sc = usbd_xfer_softc(xfer);
+ struct usb_page_cache *pc;
+ struct ifnet *ifp = sc->sc_ifp;
+ struct mbuf *m;
+ uint16_t size;
+
+ switch (USB_GET_STATE(xfer)) {
+ case USB_ST_TRANSFERRED:
+ DPRINTFN(11, "transfer complete\n");
+ ifp->if_drv_flags &= ~IFF_DRV_OACTIVE;
+ ifp->if_opackets++;
+
+ /* fall though */
+ case USB_ST_SETUP:
+tr_setup:
+
+ if ((ifp->if_drv_flags & IFF_DRV_RUNNING) == 0)
+ break;
+
+ IFQ_DRV_DEQUEUE(&ifp->if_snd, m);
+ if (m == NULL)
+ break;
+
+ if (m->m_pkthdr.len > (MCLBYTES - ETHER_HDR_LEN +
+ ETHER_CRC_LEN - sizeof(sc->sc_txd))) {
+ DPRINTF("packet len is too big: %d\n",
+ m->m_pkthdr.len);
+ break;
+ }
+ pc = usbd_xfer_get_frame(xfer, 0);
+
+ sc->sc_txd.hip.len = htobe16(m->m_pkthdr.len +
+ ETHER_HDR_LEN + ETHER_CRC_LEN);
+ size = sizeof(sc->sc_txd);
+
+ usbd_copy_in(pc, 0, &sc->sc_txd, size);
+ usbd_m_copy_in(pc, size, m, 0, m->m_pkthdr.len);
+ usbd_xfer_set_frame_len(xfer, 0, m->m_pkthdr.len +
+ size + ETHER_CRC_LEN);
+
+ BPF_MTAP(ifp, m);
+
+ m_freem(m);
+
+ usbd_transfer_submit(xfer);
+ break;
+
+ default: /* Error */
+ DPRINTF("USB transfer error, %s\n",
+ usbd_errstr(error));
+ ifp->if_oerrors++;
+
+ if (error != USB_ERR_CANCELLED) {
+ usbd_xfer_set_stall(xfer);
+ ifp->if_ierrors++;
+ goto tr_setup;
+ }
+ break;
+ }
+}
+
+static void
+usie_if_status_callback(struct usb_xfer *xfer, usb_error_t error)
+{
+ struct usie_softc *sc = usbd_xfer_softc(xfer);
+ struct usb_page_cache *pc;
+ struct usb_cdc_notification cdc;
+ uint32_t actlen;
+
+ usbd_xfer_status(xfer, &actlen, NULL, NULL, NULL);
+
+ switch (USB_GET_STATE(xfer)) {
+ case USB_ST_TRANSFERRED:
+ DPRINTFN(4, "info received, actlen=%d\n", actlen);
+
+ /* usb_cdc_notification - .data[16] */
+ if (actlen < (sizeof(cdc) - 16)) {
+ DPRINTF("data too short %d\n", actlen);
+ goto tr_setup;
+ }
+ pc = usbd_xfer_get_frame(xfer, 0);
+ usbd_copy_out(pc, 0, &cdc, (sizeof(cdc) - 16));
+
+ DPRINTFN(4, "bNotification=%x\n", cdc.bNotification);
+
+ if (cdc.bNotification & UCDC_N_RESPONSE_AVAILABLE) {
+ taskqueue_enqueue(taskqueue_thread,
+ &sc->sc_if_status_task);
+ }
+ /* fall though */
+ case USB_ST_SETUP:
+tr_setup:
+ usbd_xfer_set_frame_len(xfer, 0, usbd_xfer_max_len(xfer));
+ usbd_transfer_submit(xfer);
+ break;
+
+ default: /* Error */
+ DPRINTF("USB transfer error, %s\n",
+ usbd_errstr(error));
+
+ if (error != USB_ERR_CANCELLED) {
+ usbd_xfer_set_stall(xfer);
+ goto tr_setup;
+ }
+ break;
+ }
+}
+
+static void
+usie_if_sync_to(void *arg)
+{
+ struct usie_softc *sc = arg;
+
+ taskqueue_enqueue(taskqueue_thread, &sc->sc_if_sync_task);
+}
+
+static void
+usie_if_sync_cb(void *arg, int pending)
+{
+ struct usie_softc *sc = arg;
+
+ mtx_lock(&sc->sc_mtx);
+
+ /* call twice */
+ usie_if_cmd(sc, USIE_HIP_SYNC2M);
+ usie_if_cmd(sc, USIE_HIP_SYNC2M);
+
+ usb_callout_reset(&sc->sc_if_sync_ch, 2 * hz, usie_if_sync_to, sc);
+
+ mtx_unlock(&sc->sc_mtx);
+}
+
+static void
+usie_if_status_cb(void *arg, int pending)
+{
+ struct usie_softc *sc = arg;
+ struct ifnet *ifp = sc->sc_ifp;
+ struct usb_device_request req;
+ struct usie_hip *hip;
+ struct usie_lsi *lsi;
+ uint16_t actlen;
+ uint8_t ntries;
+ uint8_t pad;
+
+ mtx_lock(&sc->sc_mtx);
+
+ req.bmRequestType = UT_READ_CLASS_INTERFACE;
+ req.bRequest = UCDC_GET_ENCAPSULATED_RESPONSE;
+ USETW(req.wValue, 0);
+ USETW(req.wIndex, sc->sc_if_ifnum);
+ USETW(req.wLength, sizeof(sc->sc_status_temp));
+
+ for (ntries = 0; ntries != 10; ntries++) {
+ int err;
+
+ err = usbd_do_request_flags(sc->sc_udev,
+ &sc->sc_mtx, &req, sc->sc_status_temp, USB_SHORT_XFER_OK,
+ &actlen, USB_DEFAULT_TIMEOUT);
+
+ if (err == 0)
+ break;
+
+ DPRINTF("Control request failed: %s %d/10\n",
+ usbd_errstr(err), ntries);
+
+ usb_pause_mtx(&sc->sc_mtx, USB_MS_TO_TICKS(10));
+ }
+
+ if (ntries == 10) {
+ mtx_unlock(&sc->sc_mtx);
+ DPRINTF("Timeout\n");
+ return;
+ }
+
+ hip = (struct usie_hip *)sc->sc_status_temp;
+
+ pad = (hip->id & USIE_HIP_PAD) ? 1 : 0;
+
+ DPRINTF("hip.id=%x hip.len=%d actlen=%u pad=%d\n",
+ hip->id, be16toh(hip->len), actlen, pad);
+
+ switch (hip->id & USIE_HIP_MASK) {
+ case USIE_HIP_SYNC2H:
+ usie_if_cmd(sc, USIE_HIP_SYNC2M);
+ break;
+ case USIE_HIP_RESTR:
+ usb_callout_stop(&sc->sc_if_sync_ch);
+ break;
+ case USIE_HIP_UMTS:
+ lsi = (struct usie_lsi *)(
+ sc->sc_status_temp + sizeof(struct usie_hip) + pad);
+
+ DPRINTF("lsi.proto=%x lsi.len=%d\n", lsi->proto,
+ be16toh(lsi->len));
+
+ if (lsi->proto != USIE_LSI_UMTS)
+ break;
+
+ if (lsi->area == USIE_LSI_AREA_NO ||
+ lsi->area == USIE_LSI_AREA_NODATA) {
+ device_printf(sc->sc_dev, "no service available\n");
+ break;
+ }
+ if (lsi->state == USIE_LSI_STATE_IDLE) {
+ DPRINTF("lsi.state=%x\n", lsi->state);
+ break;
+ }
+ DPRINTF("ctx=%x\n", hip->param);
+ sc->sc_txd.hip.param = hip->param;
+
+ sc->sc_net.addr_len = lsi->pdp_addr_len;
+ memcpy(&sc->sc_net.dns1_addr, &lsi->dns1_addr, 16);
+ memcpy(&sc->sc_net.dns2_addr, &lsi->dns2_addr, 16);
+ memcpy(sc->sc_net.pdp_addr, lsi->pdp_addr, 16);
+ memcpy(sc->sc_net.gw_addr, lsi->gw_addr, 16);
+ ifp->if_flags |= IFF_UP;
+ ifp->if_drv_flags |= IFF_DRV_RUNNING;
+
+ device_printf(sc->sc_dev, "IP Addr=%d.%d.%d.%d\n",
+ *lsi->pdp_addr, *(lsi->pdp_addr + 1),
+ *(lsi->pdp_addr + 2), *(lsi->pdp_addr + 3));
+ device_printf(sc->sc_dev, "Gateway Addr=%d.%d.%d.%d\n",
+ *lsi->gw_addr, *(lsi->gw_addr + 1),
+ *(lsi->gw_addr + 2), *(lsi->gw_addr + 3));
+ device_printf(sc->sc_dev, "Prim NS Addr=%d.%d.%d.%d\n",
+ *lsi->dns1_addr, *(lsi->dns1_addr + 1),
+ *(lsi->dns1_addr + 2), *(lsi->dns1_addr + 3));
+ device_printf(sc->sc_dev, "Scnd NS Addr=%d.%d.%d.%d\n",
+ *lsi->dns2_addr, *(lsi->dns2_addr + 1),
+ *(lsi->dns2_addr + 2), *(lsi->dns2_addr + 3));
+
+ usie_cns_req(sc, USIE_CNS_ID_RSSI, USIE_CNS_OB_RSSI);
+ break;
+
+ case USIE_HIP_RCGI:
+ /* ignore, workaround for sloppy windows */
+ break;
+ default:
+ DPRINTF("undefined msgid: %x\n", hip->id);
+ break;
+ }
+
+ mtx_unlock(&sc->sc_mtx);
+}
+
+static void
+usie_if_start(struct ifnet *ifp)
+{
+ struct usie_softc *sc = ifp->if_softc;
+
+ if (!(ifp->if_drv_flags & IFF_DRV_RUNNING)) {
+ DPRINTF("Not running\n");
+ return;
+ }
+ mtx_lock(&sc->sc_mtx);
+ usbd_transfer_start(sc->sc_if_xfer[USIE_IF_TX]);
+ mtx_unlock(&sc->sc_mtx);
+
+ DPRINTFN(3, "interface started\n");
+}
+
+static int
+usie_if_output(struct ifnet *ifp, struct mbuf *m, struct sockaddr *dst,
+ struct route *ro)
+{
+ int err;
+
+ DPRINTF("proto=%x\n", dst->sa_family);
+
+ switch (dst->sa_family) {
+#ifdef INET6
+ case AF_INET6;
+ /* fall though */
+#endif
+ case AF_INET:
+ break;
+
+ /* silently drop dhclient packets */
+ case AF_UNSPEC:
+ m_freem(m);
+ return (0);
+
+ /* drop other packet types */
+ default:
+ m_freem(m);
+ return (EAFNOSUPPORT);
+ }
+
+ err = (ifp->if_transmit)(ifp, m);
+ if (err) {
+ ifp->if_oerrors++;
+ return (ENOBUFS);
+ }
+ ifp->if_opackets++;
+
+ return (0);
+}
+
+static void
+usie_if_init(void *arg)
+{
+ struct usie_softc *sc = arg;
+ struct ifnet *ifp = sc->sc_ifp;
+ uint8_t i;
+
+ mtx_lock(&sc->sc_mtx);
+
+ /* write tx descriptor */
+ sc->sc_txd.hip.id = USIE_HIP_CTX;
+ sc->sc_txd.hip.param = 0; /* init value */
+ sc->sc_txd.desc_type = htobe16(USIE_IP_TX);
+
+ for (i = 0; i != USIE_IF_N_XFER; i++)
+ usbd_xfer_set_stall(sc->sc_if_xfer[i]);
+
+ usbd_transfer_start(sc->sc_uc_xfer[USIE_HIP_IF][USIE_UC_RX]);
+ usbd_transfer_start(sc->sc_if_xfer[USIE_IF_STATUS]);
+ usbd_transfer_start(sc->sc_if_xfer[USIE_IF_RX]);
+
+ /* if not running, initiate the modem */
+ if (!(ifp->if_drv_flags & IFF_DRV_RUNNING))
+ usie_cns_req(sc, USIE_CNS_ID_INIT, USIE_CNS_OB_LINK_UPDATE);
+
+ mtx_unlock(&sc->sc_mtx);
+
+ DPRINTF("ifnet initialized\n");
+}
+
+static void
+usie_if_stop(struct usie_softc *sc)
+{
+ usb_callout_drain(&sc->sc_if_sync_ch);
+
+ mtx_lock(&sc->sc_mtx);
+
+ /* usie_cns_req() clears IFF_* flags */
+ usie_cns_req(sc, USIE_CNS_ID_STOP, USIE_CNS_OB_LINK_UPDATE);
+
+ usbd_transfer_stop(sc->sc_if_xfer[USIE_IF_TX]);
+ usbd_transfer_stop(sc->sc_if_xfer[USIE_IF_RX]);
+ usbd_transfer_stop(sc->sc_if_xfer[USIE_IF_STATUS]);
+
+ /* shutdown device */
+ usie_if_cmd(sc, USIE_HIP_DOWN);
+
+ mtx_unlock(&sc->sc_mtx);
+}
+
+static int
+usie_if_ioctl(struct ifnet *ifp, u_long cmd, caddr_t data)
+{
+ struct usie_softc *sc = ifp->if_softc;
+ struct ieee80211req *ireq;
+ struct ieee80211req_sta_info si;
+ struct ifmediareq *ifmr;
+
+ switch (cmd) {
+ case SIOCSIFFLAGS:
+ if (ifp->if_flags & IFF_UP) {
+ if (!(ifp->if_drv_flags & IFF_DRV_RUNNING))
+ usie_if_init(sc);
+ } else {
+ if (ifp->if_drv_flags & IFF_DRV_RUNNING)
+ usie_if_stop(sc);
+ }
+ break;
+
+ case SIOCSIFCAP:
+ if (!(ifp->if_drv_flags & IFF_DRV_RUNNING)) {
+ device_printf(sc->sc_dev,
+ "Connect to the network first.\n");
+ break;
+ }
+ mtx_lock(&sc->sc_mtx);
+ usie_cns_req(sc, USIE_CNS_ID_RSSI, USIE_CNS_OB_RSSI);
+ mtx_unlock(&sc->sc_mtx);
+ break;
+
+ case SIOCG80211:
+ ireq = (struct ieee80211req *)data;
+
+ if (ireq->i_type != IEEE80211_IOC_STA_INFO)
+ break;
+
+ memset(&si, 0, sizeof(si));
+ si.isi_len = sizeof(si);
+ /*
+ * ifconfig expects RSSI in 0.5dBm units
+ * relative to the noise floor.
+ */
+ si.isi_rssi = 2 * sc->sc_rssi;
+ if (copyout(&si, (uint8_t *)ireq->i_data + 8,
+ sizeof(struct ieee80211req_sta_info)))
+ DPRINTF("copyout failed\n");
+ DPRINTF("80211\n");
+ break;
+
+ case SIOCGIFMEDIA: /* to fool ifconfig */
+ ifmr = (struct ifmediareq *)data;
+ ifmr->ifm_count = 1;
+ DPRINTF("media\n");
+ break;
+
+ case SIOCSIFADDR:
+ case SIOCSIFDSTADDR:
+ break;
+
+ default:
+ return (EINVAL);
+ }
+ return (0);
+}
+
+static int
+usie_do_request(struct usie_softc *sc, struct usb_device_request *req,
+ void *data)
+{
+ int err = 0;
+ int ntries;
+
+ mtx_assert(&sc->sc_mtx, MA_OWNED);
+
+ for (ntries = 0; ntries != 10; ntries++) {
+ err = usbd_do_request(sc->sc_udev,
+ &sc->sc_mtx, req, data);
+ if (err == 0)
+ break;
+
+ DPRINTF("Control request failed: %s %d/10\n",
+ usbd_errstr(err), ntries);
+
+ usb_pause_mtx(&sc->sc_mtx, USB_MS_TO_TICKS(10));
+ }
+ return (err);
+}
+
+static int
+usie_if_cmd(struct usie_softc *sc, uint8_t cmd)
+{
+ struct usb_device_request req;
+ struct usie_hip msg;
+
+ msg.len = 0;
+ msg.id = cmd;
+ msg.param = 0;
+
+ req.bmRequestType = UT_WRITE_CLASS_INTERFACE;
+ req.bRequest = UCDC_SEND_ENCAPSULATED_COMMAND;
+ USETW(req.wValue, 0);
+ USETW(req.wIndex, sc->sc_if_ifnum);
+ USETW(req.wLength, sizeof(msg));
+
+ DPRINTF("cmd=%x\n", cmd);
+
+ return (usie_do_request(sc, &req, &msg));
+}
+
+static void
+usie_cns_req(struct usie_softc *sc, uint32_t id, uint16_t obj)
+{
+ struct ifnet *ifp = sc->sc_ifp;
+ struct mbuf *m;
+ struct usb_xfer *xfer;
+ struct usie_hip *hip;
+ struct usie_cns *cns;
+ uint8_t *param;
+ uint8_t *tmp;
+ uint8_t cns_len;
+
+ m = m_getcl(M_DONTWAIT, MT_DATA, M_PKTHDR);
+ if (__predict_false(m == NULL)) {
+ DPRINTF("could not allocate mbuf\n");
+ ifp->if_ierrors++;
+ return;
+ }
+ /* to align usie_hip{} on 32 bit */
+ m->m_data += 3;
+ param = mtod(m, uint8_t *);
+ *param++ = USIE_HIP_FRM_CHR;
+ hip = (struct usie_hip *)param;
+ cns = (struct usie_cns *)(hip + 1);
+
+ tmp = param + USIE_HIPCNS_MIN - 2;
+
+ switch (obj) {
+ case USIE_CNS_OB_LINK_UPDATE:
+ cns_len = 2;
+ cns->op = USIE_CNS_OP_SET;
+ *tmp++ = 1; /* profile ID, always use 1 for now */
+ *tmp++ = id == USIE_CNS_ID_INIT ? 1 : 0;
+ break;
+
+ case USIE_CNS_OB_PROF_WRITE:
+ cns_len = 245;
+ cns->op = USIE_CNS_OP_SET;
+ *tmp++ = 1; /* profile ID, always use 1 for now */
+ *tmp++ = 2;
+ memcpy(tmp, &sc->sc_net, 34);
+ memset(tmp + 35, 0, 245 - 36);
+ tmp += 243;
+ break;
+
+ case USIE_CNS_OB_RSSI:
+ cns_len = 0;
+ cns->op = USIE_CNS_OP_REQ;
+ break;
+
+ default:
+ DPRINTF("unsupported CnS object type\n");
+ return;
+ }
+ *tmp = USIE_HIP_FRM_CHR;
+
+ hip->len = htobe16(sizeof(struct usie_cns) + cns_len);
+ hip->id = USIE_HIP_CNS2M;
+ hip->param = 0; /* none for CnS */
+
+ cns->obj = htobe16(obj);
+ cns->id = htobe32(id);
+ cns->len = cns_len;
+ cns->rsv0 = cns->rsv1 = 0; /* always '0' */
+
+ param = (uint8_t *)(cns + 1);
+
+ DPRINTF("param: %16D\n", param, ":");
+
+ m->m_pkthdr.len = m->m_len = USIE_HIPCNS_MIN + cns_len + 2;
+
+ xfer = sc->sc_uc_xfer[USIE_HIP_IF][USIE_UC_TX];
+
+ if (usbd_xfer_get_priv(xfer) == NULL) {
+ usbd_xfer_set_priv(xfer, m);
+ usbd_transfer_start(xfer);
+ } else {
+ DPRINTF("Dropped CNS event\n");
+ m_freem(m);
+ }
+}
+
+static void
+usie_cns_rsp(struct usie_softc *sc, struct usie_cns *cns)
+{
+ struct ifnet *ifp = sc->sc_ifp;
+
+ DPRINTF("received CnS\n");
+
+ switch (be16toh(cns->obj)) {
+ case USIE_CNS_OB_LINK_UPDATE:
+ if (be32toh(cns->id) & USIE_CNS_ID_INIT)
+ usie_if_sync_to(sc);
+ else if (be32toh(cns->id) & USIE_CNS_ID_STOP) {
+ ifp->if_flags &= ~IFF_UP;
+ ifp->if_drv_flags &=
+ ~(IFF_DRV_RUNNING | IFF_DRV_OACTIVE);
+ } else
+ DPRINTF("undefined link update\n");
+ break;
+
+ case USIE_CNS_OB_RSSI:
+ sc->sc_rssi = be16toh(*(int16_t *)(cns + 1));
+ if (sc->sc_rssi <= 0)
+ device_printf(sc->sc_dev, "No signal\n");
+ else {
+ device_printf(sc->sc_dev, "RSSI=%ddBm\n",
+ sc->sc_rssi - 110);
+ }
+ break;
+
+ case USIE_CNS_OB_PROF_WRITE:
+ break;
+
+ case USIE_CNS_OB_PDP_READ:
+ break;
+
+ default:
+ DPRINTF("undefined CnS\n");
+ break;
+ }
+}
+
+static void
+usie_hip_rsp(struct usie_softc *sc, uint8_t *rsp, uint32_t len)
+{
+ struct usie_hip *hip;
+ struct usie_cns *cns;
+ uint32_t i;
+ uint32_t j;
+ uint32_t off;
+ uint8_t tmp[USIE_HIPCNS_MAX] __aligned(4);
+
+ for (off = 0; (off + USIE_HIPCNS_MIN) <= len; off++) {
+
+ uint8_t pad;
+
+ while ((off < len) && (rsp[off] == USIE_HIP_FRM_CHR))
+ off++;
+
+ /* Unstuff the bytes */
+ for (i = j = 0; ((i + off) < len) &&
+ (j < USIE_HIPCNS_MAX); i++) {
+
+ if (rsp[i + off] == USIE_HIP_FRM_CHR)
+ break;
+
+ if (rsp[i + off] == USIE_HIP_ESC_CHR) {
+ if ((i + off + 1) >= len)
+ break;
+ tmp[j++] = rsp[i++ + off + 1] ^ 0x20;
+ } else {
+ tmp[j++] = rsp[i + off];
+ }
+ }
+
+ off += i;
+
+ DPRINTF("frame len=%d\n", j);
+
+ if (j < sizeof(struct usie_hip)) {
+ DPRINTF("too little data\n");
+ break;
+ }
+ /*
+ * Make sure we are not reading the stack if something
+ * is wrong.
+ */
+ memset(tmp + j, 0, sizeof(tmp) - j);
+
+ hip = (struct usie_hip *)tmp;
+
+ DPRINTF("hip: len=%d msgID=%02x, param=%02x\n",
+ be16toh(hip->len), hip->id, hip->param);
+
+ pad = (hip->id & USIE_HIP_PAD) ? 1 : 0;
+
+ if ((hip->id & USIE_HIP_MASK) == USIE_HIP_CNS2H) {
+ cns = (struct usie_cns *)(((uint8_t *)(hip + 1)) + pad);
+
+ if (j < (sizeof(struct usie_cns) +
+ sizeof(struct usie_hip) + pad)) {
+ DPRINTF("too little data\n");
+ break;
+ }
+ DPRINTF("cns: obj=%04x, op=%02x, rsv0=%02x, "
+ "app=%08x, rsv1=%02x, len=%d\n",
+ be16toh(cns->obj), cns->op, cns->rsv0,
+ be32toh(cns->id), cns->rsv1, cns->len);
+
+ if (cns->op & USIE_CNS_OP_ERR)
+ DPRINTF("CnS error response\n");
+ else
+ usie_cns_rsp(sc, cns);
+
+ i = sizeof(struct usie_hip) + pad + sizeof(struct usie_cns);
+ j = cns->len;
+ } else {
+ i = sizeof(struct usie_hip) + pad;
+ j = be16toh(hip->len);
+ }
+#ifdef USB_DEBUG
+ if (usie_debug == 0)
+ continue;
+
+ while (i < USIE_HIPCNS_MAX && j > 0) {
+ DPRINTF("param[0x%02x] = 0x%02x\n", i, tmp[i]);
+ i++;
+ j--;
+ }
+#endif
+ }
+}
+
+static int
+usie_driver_loaded(struct module *mod, int what, void *arg)
+{
+ switch (what) {
+ case MOD_LOAD:
+ /* register autoinstall handler */
+ usie_etag = EVENTHANDLER_REGISTER(usb_dev_configured,
+ usie_autoinst, NULL, EVENTHANDLER_PRI_ANY);
+ break;
+ case MOD_UNLOAD:
+ EVENTHANDLER_DEREGISTER(usb_dev_configured, usie_etag);
+ break;
+ default:
+ return (EOPNOTSUPP);
+ }
+ return (0);
+}
+
diff --git a/sys/dev/usb/net/if_usievar.h b/sys/dev/usb/net/if_usievar.h
new file mode 100644
index 0000000..9ba0dc8
--- /dev/null
+++ b/sys/dev/usb/net/if_usievar.h
@@ -0,0 +1,256 @@
+/* $FreeBSD$ */
+
+/*-
+ * Copyright (c) 2011 Anybots Inc
+ * written by Akinori Furukoshi <moonlightakkiy@yahoo.ca>
+ * - ucom part is based on u3g.c
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#ifndef _IF_USEVAR_H_
+#define _IF_USEVAR_H_
+
+#define USIE_DCD 0x0001
+#define USIE_DSR 0x0002
+#define USIE_DTR 0x0004
+#define USIE_RI 0x0008
+#define USIE_CTS 0x0100
+#define USIE_RTS 0x0200
+
+#define USIE_HIP_FRM_CHR 0x7e
+#define USIE_HIP_ESC_CHR 0x7d
+#define USIE_HIP_IF 0
+
+#define USIE_HIPCNS_MIN 16 /* HIP + CnS + 2 framing char */
+#define USIE_HIPCNS_MAX 261 /* HIP + max CnS 255 + 2 framing char */
+
+#define USIE_CNFG_INDEX 0
+#define USIE_IFACE_INDEX 0
+#define USIE_IFACE_MAX 12
+#define USIE_BUFSIZE 2048
+#define USIE_MTU_MAX 1500
+#define USIE_RXSZ_MAX 4096
+
+/* USB control pipe request */
+#define USIE_POWER 0x00
+#define USIE_FW_ATTR 0x06
+#define USIE_NMEA 0x07
+#define USIE_LINK_STATE 0x22
+
+/* firmware attr flags */
+#define USIE_PM_AUTO (1 << 1)
+#define USIE_FW_DHCP (1 << 3) /* DHCP capable */
+
+/* line state flags */
+#define USIE_LS_DTR (1 << 0)
+#define USIE_LS_RTS (1 << 1)
+
+/* Host Interface Porotocol Header */
+struct usie_hip {
+ uint16_t len;
+#define USIE_HIP_LEN_MASK 0x3fff
+#define USIE_HIP_IP_LEN_MASK 0x07ff
+
+ uint8_t id;
+#define USIE_HIP_PAD (1 << 7)
+#define USIE_HIP_MASK 0x7f
+#define USIE_HIP_SYNC2M 0x20 /* host -> modem */
+#define USIE_HIP_DOWN 0x26
+#define USIE_HIP_CNS2M 0x2b /* h -> m */
+#define USIE_HIP_CTX 0x3f
+#define USIE_HIP_SYNC2H 0x60 /* h <- m */
+#define USIE_HIP_RESTR 0x62
+#define USIE_HIP_RCGI 0x64
+#define USIE_HIP_CNS2H 0x6b /* h <- m */
+#define USIE_HIP_UMTS 0x78
+#define USIE_HIP_IP 0x7f
+
+ uint8_t param;
+} __packed __aligned(4);
+
+/* Control and Status Header */
+struct usie_cns {
+ uint16_t obj; /* object type */
+#define USIE_CNS_OB_RSSI 0x1001 /* read RSSI */
+#define USIE_CNS_OB_HW_DISABLE 0x1011 /* disable h/w */
+#define USIE_CNS_OB_PW_SW 0x1071 /* power on/off */
+#define USIE_CNS_OB_PROF_WRITE 0x7003 /* write profile */
+#define USIE_CNS_OB_LINK_UPDATE 0x7004 /* dis/connect */
+#define USIE_CNS_OB_PDP_READ 0x7006 /* read out IP addr */
+
+ uint8_t op; /* operation type */
+#define USIE_CNS_OP_ERR (1 << 7)/* | == error */
+#define USIE_CNS_OP_REQ 0x01 /* host -> modem */
+#define USIE_CNS_OP_RSP 0x02 /* h <- m */
+#define USIE_CNS_OP_SET 0x03 /* h -> m */
+#define USIE_CNS_OP_ACK 0x04 /* h <- m */
+#define USIE_CNS_OP_NOTIF_ON 0x05 /* h -> m */
+#define USIE_CNS_OP_RSP_ON 0x06 /* h <- m */
+#define USIE_CNS_OP_NOTIF 0x07 /* h <- m */
+#define USIE_CNS_OP_NOTIF_OFF 0x08 /* h -> m */
+#define USIE_CNS_OP_RSP_OFF 0x09 /* h <- m */
+#define USIE_CNS_OP_REQ_CHG 0x0a /* h -> m */
+#define USIE_CNS_OP_RSP_CHG 0x0b /* h <- m */
+
+ uint8_t rsv0; /* reserved, always '0' */
+ uint32_t id; /* caller ID */
+/*
+ * .id is to identify calling functions
+ * h/w responses with the same .id used in request. Only '0' is reserved
+ * for notification (asynchronous message generated by h/w without any
+ * request). All other values are user defineable.
+ */
+#define USIE_CNS_ID_NOTIF 0x00000000 /* reserved */
+#define USIE_CNS_ID_INIT 0x00000001
+#define USIE_CNS_ID_STOP 0x00000002
+#define USIE_CNS_ID_DNS 0x00000003
+#define USIE_CNS_ID_RSSI 0x00000004
+
+ uint8_t rsv1; /* reserved, always '0' */
+ uint8_t len; /* length of param */
+} __packed;
+
+/*
+ * CnS param attached to struct usie_cns
+ * usie_cns.len is total size of this param
+ * max 255
+ */
+#define USIE_CNS_PM_UP 0x01
+#define USIE_CNS_PM_DOWN 0x00
+
+/* Link Sense Indication data structure */
+struct usie_lsi {
+ uint8_t proto;
+#define USIE_LSI_UMTS 0x01
+
+ uint8_t pad0;
+ uint16_t len;
+ uint8_t area;
+#define USIE_LSI_AREA_NO 0x00
+#define USIE_LSI_AREA_NODATA 0x01
+
+ uint8_t pad1[41];
+ uint8_t state;
+#define USIE_LSI_STATE_IDLE 0x00
+
+ uint8_t pad2[33];
+ uint8_t type;
+#define USIE_LSI_IP4 0x00
+
+ uint8_t pdp_addr_len; /* PDP addr */
+ uint8_t pdp_addr[16];
+ uint8_t pad3[23];
+ uint8_t dns1_addr_len; /* DNS addr */
+ uint8_t dns1_addr[16];
+ uint8_t dns2_addr_len;
+ uint8_t dns2_addr[16];
+ uint8_t wins1_addr_len; /* Wins addr */
+ uint8_t wins1_addr[16];
+ uint8_t wins2_addr_len;
+ uint8_t wins2_addr[16];
+ uint8_t pad4[4];
+ uint8_t gw_addr_len; /* GW addr */
+ uint8_t gw_addr[16];
+ uint8_t rsv[8];
+} __packed;
+
+struct usie_net_info {
+ uint8_t addr_len;
+ uint8_t pdp_addr[16];
+ uint8_t dns1_addr[16];
+ uint8_t dns2_addr[16];
+ uint8_t gw_addr[16];
+} __packed;
+
+/* Tx/Rx IP packet descriptor */
+struct usie_desc {
+ struct usie_hip hip;
+ uint16_t desc_type;
+#define USIE_TYPE_MASK 0x03ff
+#define USIE_IP_TX 0x0002
+#define USIE_IP_RX 0x0202
+
+ struct ether_header ethhdr;
+} __packed;
+
+enum {
+ USIE_UC_STATUS,
+ USIE_UC_RX,
+ USIE_UC_TX,
+ USIE_UC_N_XFER
+};
+
+enum {
+ USIE_IF_STATUS,
+ USIE_IF_RX,
+ USIE_IF_TX,
+ USIE_IF_N_XFER
+};
+
+struct usie_softc {
+ struct ucom_super_softc sc_super_ucom;
+
+#define USIE_UCOM_MAX 6
+ struct ucom_softc sc_ucom[USIE_UCOM_MAX];
+ uint8_t sc_uc_ifnum[USIE_UCOM_MAX];
+
+ struct mtx sc_mtx;
+
+ struct task sc_if_status_task;
+ struct task sc_if_sync_task;
+ struct usb_callout sc_if_sync_ch;
+
+ struct usie_net_info sc_net;
+
+ struct usie_desc sc_txd;
+
+ struct usb_xfer *sc_uc_xfer[USIE_UCOM_MAX][USIE_UC_N_XFER];
+ struct usb_xfer *sc_if_xfer[USIE_IF_N_XFER];
+
+ struct ifnet *sc_ifp;
+ struct usb_device *sc_udev;
+ device_t sc_dev;
+
+ struct mbuf *sc_rxm;
+
+ uint16_t sc_if_ifnum;
+
+ int16_t sc_rssi;
+
+ uint8_t sc_msr;
+ uint8_t sc_lsr;
+ uint8_t sc_nucom;
+
+ uint8_t sc_resp_temp[USIE_BUFSIZE] __aligned(4);
+ uint8_t sc_status_temp[USIE_BUFSIZE] __aligned(4);
+};
+
+/* Some code assumptions */
+
+extern uint8_t usie_assert[((sizeof(struct usie_hip) +
+ sizeof(struct usie_lsi) + 1) <= USIE_BUFSIZE) ? 1 : -1];
+
+extern uint8_t ucdc_assert[(sizeof(struct usb_cdc_notification)
+ >= 16) ? 1 : -1];
+
+#endif /* _IF_USEVAR_H_ */
diff --git a/sys/dev/usb/net/uhso.c b/sys/dev/usb/net/uhso.c
index ab13093..cbb0b08 100644
--- a/sys/dev/usb/net/uhso.c
+++ b/sys/dev/usb/net/uhso.c
@@ -1754,6 +1754,7 @@ uhso_if_rxflush(void *arg)
/* Dispatch to IP layer */
BPF_MTAP(sc->sc_ifp, m);
+ M_SETFIB(m, ifp->if_fib);
netisr_dispatch(isr, m);
m = m0 != NULL ? m0 : NULL;
mtx_lock(&sc->sc_mtx);
diff --git a/sys/dev/usb/quirk/usb_quirk.c b/sys/dev/usb/quirk/usb_quirk.c
index 0c3d673..e54b908 100644
--- a/sys/dev/usb/quirk/usb_quirk.c
+++ b/sys/dev/usb/quirk/usb_quirk.c
@@ -472,6 +472,7 @@ static struct usb_quirk_entry usb_quirks[USB_DEV_QUIRKS_MAX] = {
USB_QUIRK(ROLAND, SD20, 0x0000, 0xffff, UQ_AU_VENDOR_CLASS),
USB_QUIRK(ROLAND, SD80, 0x0000, 0xffff, UQ_AU_VENDOR_CLASS),
USB_QUIRK(ROLAND, UA700, 0x0000, 0xffff, UQ_AU_VENDOR_CLASS),
+ USB_QUIRK(MEDELI, DD305, 0x0000, 0xffff, UQ_SINGLE_CMD_MIDI, UQ_MATCH_VENDOR_ONLY),
};
#undef USB_QUIRK_VP
#undef USB_QUIRK
@@ -538,6 +539,7 @@ static const char *usb_quirk_str[USB_QUIRK_MAX] = {
[UQ_MSC_EJECT_TCT] = "UQ_MSC_EJECT_TCT",
[UQ_BAD_MIDI] = "UQ_BAD_MIDI",
[UQ_AU_VENDOR_CLASS] = "UQ_AU_VENDOR_CLASS",
+ [UQ_SINGLE_CMD_MIDI] = "UQ_SINGLE_CMD_MIDI",
};
/*------------------------------------------------------------------------*
diff --git a/sys/dev/usb/quirk/usb_quirk.h b/sys/dev/usb/quirk/usb_quirk.h
index e86794e..e012842 100644
--- a/sys/dev/usb/quirk/usb_quirk.h
+++ b/sys/dev/usb/quirk/usb_quirk.h
@@ -102,6 +102,7 @@ enum {
UQ_BAD_MIDI, /* device claims MIDI class, but isn't */
UQ_AU_VENDOR_CLASS, /* audio device uses vendor and not audio class */
+ UQ_SINGLE_CMD_MIDI, /* at most one command per USB packet */
USB_QUIRK_MAX
};
diff --git a/sys/dev/usb/usb_hid.c b/sys/dev/usb/usb_hid.c
index 21c4c50c..6bd51cd 100644
--- a/sys/dev/usb/usb_hid.c
+++ b/sys/dev/usb/usb_hid.c
@@ -702,6 +702,43 @@ hid_get_data_unsigned(const uint8_t *buf, usb_size_t len, struct hid_location *l
}
/*------------------------------------------------------------------------*
+ * hid_put_data
+ *------------------------------------------------------------------------*/
+void
+hid_put_data_unsigned(uint8_t *buf, usb_size_t len,
+ struct hid_location *loc, unsigned int value)
+{
+ uint32_t hpos = loc->pos;
+ uint32_t hsize = loc->size;
+ uint64_t data;
+ uint64_t mask;
+ uint32_t rpos;
+ uint8_t n;
+
+ DPRINTFN(11, "hid_put_data: loc %d/%d = %u\n", hpos, hsize, value);
+
+ /* Range check and limit */
+ if (hsize == 0)
+ return;
+ if (hsize > 32)
+ hsize = 32;
+
+ /* Put data in a safe way */
+ rpos = (hpos / 8);
+ n = (hsize + 7) / 8;
+ data = ((uint64_t)value) << (hpos % 8);
+ mask = ((1ULL << hsize) - 1ULL) << (hpos % 8);
+ rpos += n;
+ while (n--) {
+ rpos--;
+ if (rpos < len) {
+ buf[rpos] &= ~(mask >> (8 * n));
+ buf[rpos] |= (data >> (8 * n));
+ }
+ }
+}
+
+/*------------------------------------------------------------------------*
* hid_is_collection
*------------------------------------------------------------------------*/
int
diff --git a/sys/dev/usb/usb_request.c b/sys/dev/usb/usb_request.c
index 4358ef4..bb5e0da 100644
--- a/sys/dev/usb/usb_request.c
+++ b/sys/dev/usb/usb_request.c
@@ -779,10 +779,17 @@ usbd_req_reset_port(struct usb_device *udev, struct mtx *mtx, uint8_t port)
uint16_t pr_recovery_delay;
#endif
- err = usbd_req_set_port_feature(udev, mtx, port, UHF_PORT_RESET);
- if (err) {
+ /* clear any leftover port reset changes first */
+ usbd_req_clear_port_feature(
+ udev, mtx, port, UHF_C_PORT_RESET);
+
+ /* assert port reset on the given port */
+ err = usbd_req_set_port_feature(
+ udev, mtx, port, UHF_PORT_RESET);
+
+ /* check for errors */
+ if (err)
goto done;
- }
#ifdef USB_DEBUG
/* range check input parameters */
pr_poll_delay = usb_pr_poll_delay;
@@ -798,6 +805,9 @@ usbd_req_reset_port(struct usb_device *udev, struct mtx *mtx, uint8_t port)
#endif
n = 0;
while (1) {
+ uint16_t status;
+ uint16_t change;
+
#ifdef USB_DEBUG
/* wait for the device to recover from reset */
usb_pause_mtx(mtx, USB_MS_TO_TICKS(pr_poll_delay));
@@ -811,14 +821,25 @@ usbd_req_reset_port(struct usb_device *udev, struct mtx *mtx, uint8_t port)
if (err) {
goto done;
}
+ status = UGETW(ps.wPortStatus);
+ change = UGETW(ps.wPortChange);
+
/* if the device disappeared, just give up */
- if (!(UGETW(ps.wPortStatus) & UPS_CURRENT_CONNECT_STATUS)) {
+ if (!(status & UPS_CURRENT_CONNECT_STATUS))
goto done;
- }
+
/* check if reset is complete */
- if (UGETW(ps.wPortChange) & UPS_C_PORT_RESET) {
+ if (change & UPS_C_PORT_RESET)
break;
- }
+
+ /*
+ * Some Virtual Machines like VirtualBox 4.x fail to
+ * generate a port reset change event. Check if reset
+ * is no longer asserted.
+ */
+ if (!(status & UPS_RESET))
+ break;
+
/* check for timeout */
if (n > 1000) {
n = 0;
diff --git a/sys/dev/usb/usbdevs b/sys/dev/usb/usbdevs
index a5f4cbb..386e546 100644
--- a/sys/dev/usb/usbdevs
+++ b/sys/dev/usb/usbdevs
@@ -484,6 +484,7 @@ vendor SHANTOU 0x0a46 ShanTou
vendor MEDIAGEAR 0x0a48 MediaGear
vendor BROADCOM 0x0a5c Broadcom
vendor GREENHOUSE 0x0a6b GREENHOUSE
+vendor MEDELI 0x0a67 Medeli
vendor GEOCAST 0x0a79 Geocast Network Systems
vendor IDQUANTIQUE 0x0aba id Quantique
vendor ZYDAS 0x0ace Zydas Technology Corporation
@@ -899,6 +900,7 @@ product AIRPLUS MCD650 0x3198 MCD650 modem
/* AirPrime products */
product AIRPRIME PC5220 0x0112 CDMA Wireless PC Card
+product AIRPRIME USB308 0x68A3 USB308 HSPA+ USB Modem
/* AirTies products */
product AIRTIES RT3070 0x2310 RT3070
@@ -1043,6 +1045,7 @@ product ASIX AX88172 0x1720 10/100 Ethernet
product ASIX AX88178 0x1780 AX88178
product ASIX AX88772 0x7720 AX88772
product ASIX AX88772A 0x772a AX88772A USB 2.0 10/100 Ethernet
+product ASIX AX88772B 0x772b AX88772B USB 2.0 10/100 Ethernet
/* ASUS products */
product ASUS2 USBN11 0x0b05 USB-N11
@@ -2130,6 +2133,9 @@ product MCT DU_H3SP_USB232 0x0200 D-Link DU-H3SP USB BAY Hub
product MCT USB232 0x0210 USB-232 Interface
product MCT SITECOM_USB232 0x0230 Sitecom USB-232 Products
+/* Medeli */
+product MEDELI DD305 0x5011 DD305 Digital Drum Set
+
/* MediaTek, Inc. */
product MEDIATEK MTK3329 0x3329 MTK II GPS Receiver
diff --git a/sys/dev/usb/usbhid.h b/sys/dev/usb/usbhid.h
index c07454f..4816e87 100644
--- a/sys/dev/usb/usbhid.h
+++ b/sys/dev/usb/usbhid.h
@@ -233,6 +233,8 @@ int32_t hid_get_data(const uint8_t *buf, usb_size_t len,
struct hid_location *loc);
uint32_t hid_get_data_unsigned(const uint8_t *buf, usb_size_t len,
struct hid_location *loc);
+void hid_put_data_unsigned(uint8_t *buf, usb_size_t len,
+ struct hid_location *loc, unsigned int value);
int hid_is_collection(const void *desc, usb_size_t size, uint32_t usage);
struct usb_hid_descriptor *hid_get_descriptor_from_usb(
struct usb_config_descriptor *cd,
diff --git a/sys/dev/vkbd/vkbd.c b/sys/dev/vkbd/vkbd.c
index 15cf059..42fca40 100644
--- a/sys/dev/vkbd/vkbd.c
+++ b/sys/dev/vkbd/vkbd.c
@@ -1208,6 +1208,7 @@ vkbd_ioctl(keyboard_t *kbd, u_long cmd, caddr_t arg)
break;
case PIO_KEYMAP: /* set keyboard translation table */
+ case OPIO_KEYMAP: /* set keyboard translation table (compat) */
case PIO_KEYMAPENT: /* set keyboard translation table entry */
case PIO_DEADKEYMAP: /* set accent key translation table */
state->ks_accents = 0;
diff --git a/sys/dev/xen/control/control.c b/sys/dev/xen/control/control.c
index bc59fa0..301d4e8 100644
--- a/sys/dev/xen/control/control.c
+++ b/sys/dev/xen/control/control.c
@@ -197,6 +197,7 @@ extern void xencons_resume(void);
static void
xctrl_suspend()
{
+ u_int cpuid;
int i, j, k, fpp;
unsigned long max_pfn, start_info_mfn;
@@ -210,11 +211,11 @@ xctrl_suspend()
thread_lock(td);
sched_bind(td, 0);
thread_unlock(td);
- KASSERT(PCPU_GET(cpuid) == 0, ("xen_suspend: not running on cpu 0"));
+ cpuid = PCPU_GET(cpuid);
+ KASSERT(cpuid == 0, ("xen_suspend: not running on cpu 0"));
- sched_pin();
- map = PCPU_GET(other_cpus);
- sched_unpin();
+ map = all_cpus;
+ CPU_CLR(cpuid, &map);
CPU_NAND(&map, &stopped_cpus);
if (!CPU_EMPTY(&map))
stop_cpus(map);
diff --git a/sys/fs/devfs/devfs_vnops.c b/sys/fs/devfs/devfs_vnops.c
index bf6dab8..955bd8b 100644
--- a/sys/fs/devfs/devfs_vnops.c
+++ b/sys/fs/devfs/devfs_vnops.c
@@ -397,6 +397,7 @@ devfs_allocv(struct devfs_dirent *de, struct mount *mp, int lockmode,
sx_xunlock(&dmp->dm_lock);
return (ENOENT);
}
+loop:
DEVFS_DE_HOLD(de);
DEVFS_DMP_HOLD(dmp);
mtx_lock(&devfs_de_interlock);
@@ -405,16 +406,21 @@ devfs_allocv(struct devfs_dirent *de, struct mount *mp, int lockmode,
VI_LOCK(vp);
mtx_unlock(&devfs_de_interlock);
sx_xunlock(&dmp->dm_lock);
- error = vget(vp, lockmode | LK_INTERLOCK, curthread);
+ vget(vp, lockmode | LK_INTERLOCK | LK_RETRY, curthread);
sx_xlock(&dmp->dm_lock);
if (devfs_allocv_drop_refs(0, dmp, de)) {
- if (error == 0)
- vput(vp);
+ vput(vp);
return (ENOENT);
}
- else if (error) {
- sx_xunlock(&dmp->dm_lock);
- return (error);
+ else if ((vp->v_iflag & VI_DOOMED) != 0) {
+ mtx_lock(&devfs_de_interlock);
+ if (de->de_vnode == vp) {
+ de->de_vnode = NULL;
+ vp->v_data = NULL;
+ }
+ mtx_unlock(&devfs_de_interlock);
+ vput(vp);
+ goto loop;
}
sx_xunlock(&dmp->dm_lock);
*vpp = vp;
diff --git a/sys/fs/nfs/nfs_commonacl.c b/sys/fs/nfs/nfs_commonacl.c
index c4875d8..1d731c5 100644
--- a/sys/fs/nfs/nfs_commonacl.c
+++ b/sys/fs/nfs/nfs_commonacl.c
@@ -59,7 +59,8 @@ nfsrv_dissectace(struct nfsrv_descript *nd, struct acl_entry *acep,
mask = fxdr_unsigned(u_int32_t, *tl++);
len = fxdr_unsigned(int, *tl);
if (len < 0) {
- return (NFSERR_BADXDR);
+ error = NFSERR_BADXDR;
+ goto nfsmout;
} else if (len == 0) {
/* Netapp filers return a 0 length who for nil users */
acep->ae_tag = ACL_UNDEFINED_TAG;
@@ -68,7 +69,8 @@ nfsrv_dissectace(struct nfsrv_descript *nd, struct acl_entry *acep,
acep->ae_entry_type = ACL_ENTRY_TYPE_DENY;
if (acesizep)
*acesizep = 4 * NFSX_UNSIGNED;
- return (0);
+ error = 0;
+ goto nfsmout;
}
if (len > NFSV4_SMALLSTR)
name = malloc(len + 1, M_NFSSTRING, M_WAITOK);
@@ -78,7 +80,7 @@ nfsrv_dissectace(struct nfsrv_descript *nd, struct acl_entry *acep,
if (error) {
if (len > NFSV4_SMALLSTR)
free(name, M_NFSSTRING);
- return (error);
+ goto nfsmout;
}
if (len == 6) {
if (!NFSBCMP(name, "OWNER@", 6)) {
@@ -171,8 +173,9 @@ nfsrv_dissectace(struct nfsrv_descript *nd, struct acl_entry *acep,
*aceerrp = aceerr;
if (acesizep)
*acesizep = NFSM_RNDUP(len) + (4 * NFSX_UNSIGNED);
- return (0);
+ error = 0;
nfsmout:
+ NFSEXITCODE(error);
return (error);
}
@@ -184,6 +187,7 @@ nfsrv_acemasktoperm(u_int32_t acetype, u_int32_t mask, int owner,
enum vtype type, acl_perm_t *permp)
{
acl_perm_t perm = 0x0;
+ int error = 0;
if (mask & NFSV4ACE_READDATA) {
mask &= ~NFSV4ACE_READDATA;
@@ -257,10 +261,15 @@ nfsrv_acemasktoperm(u_int32_t acetype, u_int32_t mask, int owner,
mask &= ~NFSV4ACE_SYNCHRONIZE;
perm |= ACL_SYNCHRONIZE;
}
- if (mask != 0)
- return (NFSERR_ATTRNOTSUPP);
+ if (mask != 0) {
+ error = NFSERR_ATTRNOTSUPP;
+ goto out;
+ }
*permp = perm;
- return (0);
+
+out:
+ NFSEXITCODE(error);
+ return (error);
}
/* local functions */
@@ -445,19 +454,26 @@ nfsrv_setacl(vnode_t vp, NFSACL_T *aclp, struct ucred *cred,
{
int error;
- if (nfsrv_useacl == 0 || nfs_supportsnfsv4acls(vp) == 0)
- return (NFSERR_ATTRNOTSUPP);
+ if (nfsrv_useacl == 0 || nfs_supportsnfsv4acls(vp) == 0) {
+ error = NFSERR_ATTRNOTSUPP;
+ goto out;
+ }
/*
* With NFSv4 ACLs, chmod(2) may need to add additional entries.
* Make sure it has enough room for that - splitting every entry
* into two and appending "canonical six" entries at the end.
* Cribbed out of kern/vfs_acl.c - Rick M.
*/
- if (aclp->acl_cnt > (ACL_MAX_ENTRIES - 6) / 2)
- return (NFSERR_ATTRNOTSUPP);
+ if (aclp->acl_cnt > (ACL_MAX_ENTRIES - 6) / 2) {
+ error = NFSERR_ATTRNOTSUPP;
+ goto out;
+ }
error = VOP_ACLCHECK(vp, ACL_TYPE_NFS4, aclp, cred, p);
if (!error)
error = VOP_SETACL(vp, ACL_TYPE_NFS4, aclp, cred, p);
+
+out:
+ NFSEXITCODE(error);
return (error);
}
diff --git a/sys/fs/nfs/nfs_commonkrpc.c b/sys/fs/nfs/nfs_commonkrpc.c
index f658ac8..1f65380 100644
--- a/sys/fs/nfs/nfs_commonkrpc.c
+++ b/sys/fs/nfs/nfs_commonkrpc.c
@@ -166,7 +166,7 @@ newnfs_connect(struct nfsmount *nmp, struct nfssockreq *nrp,
CLIENT *client;
struct netconfig *nconf;
struct socket *so;
- int one = 1, retries, error;
+ int one = 1, retries, error = 0;
struct thread *td = curthread;
/*
@@ -222,7 +222,7 @@ newnfs_connect(struct nfsmount *nmp, struct nfssockreq *nrp,
nrp->nr_soproto, td->td_ucred, td);
if (error) {
td->td_ucred = origcred;
- return (error);
+ goto out;
}
do {
if (error != 0 && pktscale > 2)
@@ -253,7 +253,7 @@ newnfs_connect(struct nfsmount *nmp, struct nfssockreq *nrp,
soclose(so);
if (error) {
td->td_ucred = origcred;
- return (error);
+ goto out;
}
client = clnt_reconnect_create(nconf, saddr, nrp->nr_prog,
@@ -307,7 +307,10 @@ newnfs_connect(struct nfsmount *nmp, struct nfssockreq *nrp,
/* Restore current thread's credentials. */
td->td_ucred = origcred;
- return (0);
+
+out:
+ NFSEXITCODE(error);
+ return (error);
}
/*
@@ -712,8 +715,10 @@ tryagain:
NFSM_DISSECT(tl, u_int32_t *, NFSX_UNSIGNED);
nd->nd_repstat = fxdr_unsigned(u_int32_t, *tl);
if (nd->nd_repstat != 0) {
- if ((nd->nd_repstat == NFSERR_DELAY &&
+ if (((nd->nd_repstat == NFSERR_DELAY ||
+ nd->nd_repstat == NFSERR_GRACE) &&
(nd->nd_flag & ND_NFSV4) &&
+ nd->nd_procnum != NFSPROC_DELEGRETURN &&
nd->nd_procnum != NFSPROC_SETATTR &&
nd->nd_procnum != NFSPROC_READ &&
nd->nd_procnum != NFSPROC_WRITE &&
diff --git a/sys/fs/nfs/nfs_commonport.c b/sys/fs/nfs/nfs_commonport.c
index 6254915..0320f47 100644
--- a/sys/fs/nfs/nfs_commonport.c
+++ b/sys/fs/nfs/nfs_commonport.c
@@ -289,6 +289,50 @@ nfsvno_getfs(struct nfsfsinfo *sip, int isdgram)
NFSV3FSINFO_CANSETTIME);
}
+/*
+ * Do the pathconf vnode op.
+ */
+int
+nfsvno_pathconf(struct vnode *vp, int flag, register_t *retf,
+ struct ucred *cred, struct thread *p)
+{
+ int error;
+
+ error = VOP_PATHCONF(vp, flag, retf);
+ if (error == EOPNOTSUPP || error == EINVAL) {
+ /*
+ * Some file systems return EINVAL for name arguments not
+ * supported and some return EOPNOTSUPP for this case.
+ * So the NFSv3 Pathconf RPC doesn't fail for these cases,
+ * just fake them.
+ */
+ switch (flag) {
+ case _PC_LINK_MAX:
+ *retf = LINK_MAX;
+ break;
+ case _PC_NAME_MAX:
+ *retf = NAME_MAX;
+ break;
+ case _PC_CHOWN_RESTRICTED:
+ *retf = 1;
+ break;
+ case _PC_NO_TRUNC:
+ *retf = 1;
+ break;
+ default:
+ /*
+ * Only happens if a _PC_xxx is added to the server,
+ * but this isn't updated.
+ */
+ *retf = 0;
+ printf("nfsrvd pathconf flag=%d not supp\n", flag);
+ };
+ error = 0;
+ }
+ NFSEXITCODE(error);
+ return (error);
+}
+
/* Fake nfsrv_atroot. Just return 0 */
int
nfsrv_atroot(struct vnode *vp, long *retp)
@@ -384,6 +428,7 @@ nfssvc_nfscommon(struct thread *td, struct nfssvc_args *uap)
int error;
error = nfssvc_call(td, uap, td->td_ucred);
+ NFSEXITCODE(error);
return (error);
}
@@ -396,9 +441,9 @@ nfssvc_call(struct thread *p, struct nfssvc_args *uap, struct ucred *cred)
if (uap->flag & NFSSVC_IDNAME) {
error = copyin(uap->argp, (caddr_t)&nid, sizeof (nid));
if (error)
- return (error);
+ goto out;
error = nfssvc_idname(&nid);
- return (error);
+ goto out;
} else if (uap->flag & NFSSVC_GETSTATS) {
error = copyout(&newnfsstats,
CAST_USER_ADDR_T(uap->argp), sizeof (newnfsstats));
@@ -460,7 +505,7 @@ nfssvc_call(struct thread *p, struct nfssvc_args *uap, struct ucred *cred)
sizeof(newnfsstats.cbrpccnt));
}
}
- return (error);
+ goto out;
} else if (uap->flag & NFSSVC_NFSUSERDPORT) {
u_short sockport;
@@ -472,6 +517,9 @@ nfssvc_call(struct thread *p, struct nfssvc_args *uap, struct ucred *cred)
nfsrv_nfsuserddelport();
error = 0;
}
+
+out:
+ NFSEXITCODE(error);
return (error);
}
@@ -526,7 +574,7 @@ nfscommon_modevent(module_t mod, int type, void *data)
switch (type) {
case MOD_LOAD:
if (loaded)
- return (0);
+ goto out;
newnfs_portinit();
mtx_init(&nfs_nameid_mutex, "nfs_nameid_mutex", NULL, MTX_DEF);
mtx_init(&nfs_sockl_mutex, "nfs_sockl_mutex", NULL, MTX_DEF);
@@ -563,6 +611,9 @@ nfscommon_modevent(module_t mod, int type, void *data)
error = EOPNOTSUPP;
break;
}
+
+out:
+ NFSEXITCODE(error);
return error;
}
static moduledata_t nfscommon_mod = {
diff --git a/sys/fs/nfs/nfs_commonsubs.c b/sys/fs/nfs/nfs_commonsubs.c
index 03b5786..168018c 100644
--- a/sys/fs/nfs/nfs_commonsubs.c
+++ b/sys/fs/nfs/nfs_commonsubs.c
@@ -179,8 +179,10 @@ nfsm_mbufuio(struct nfsrv_descript *nd, struct uio *uiop, int siz)
len = NFSMTOD(mp, caddr_t) + mbuf_len(mp) - mbufcp;
rem = NFSM_RNDUP(siz) - siz;
while (siz > 0) {
- if (uiop->uio_iovcnt <= 0 || uiop->uio_iov == NULL)
- return (EBADRPC);
+ if (uiop->uio_iovcnt <= 0 || uiop->uio_iov == NULL) {
+ error = EBADRPC;
+ goto out;
+ }
left = uiop->uio_iov->iov_len;
uiocp = uiop->uio_iov->iov_base;
if (left > siz)
@@ -189,8 +191,10 @@ nfsm_mbufuio(struct nfsrv_descript *nd, struct uio *uiop, int siz)
while (left > 0) {
while (len == 0) {
mp = mbuf_next(mp);
- if (mp == NULL)
- return (EBADRPC);
+ if (mp == NULL) {
+ error = EBADRPC;
+ goto out;
+ }
mbufcp = NFSMTOD(mp, caddr_t);
len = mbuf_len(mp);
}
@@ -231,6 +235,9 @@ nfsm_mbufuio(struct nfsrv_descript *nd, struct uio *uiop, int siz)
else
nd->nd_dpos += rem;
}
+
+out:
+ NFSEXITCODE2(error, nd);
return (error);
}
#endif /* !APPLE */
@@ -308,9 +315,10 @@ nfsm_dissct(struct nfsrv_descript *nd, int siz)
APPLESTATIC int
nfsm_advance(struct nfsrv_descript *nd, int offs, int left)
{
+ int error = 0;
if (offs == 0)
- return (0);
+ goto out;
/*
* A negative offs should be considered a serious problem.
*/
@@ -330,13 +338,18 @@ nfsm_advance(struct nfsrv_descript *nd, int offs, int left)
while (offs > left) {
offs -= left;
nd->nd_md = mbuf_next(nd->nd_md);
- if (nd->nd_md == NULL)
- return (EBADRPC);
+ if (nd->nd_md == NULL) {
+ error = EBADRPC;
+ goto out;
+ }
left = mbuf_len(nd->nd_md);
nd->nd_dpos = NFSMTOD(nd->nd_md, caddr_t);
}
nd->nd_dpos += offs;
- return (0);
+
+out:
+ NFSEXITCODE(error);
+ return (error);
}
/*
@@ -620,8 +633,10 @@ nfsm_getfh(struct nfsrv_descript *nd, struct nfsfh **nfhpp)
if (nd->nd_flag & (ND_NFSV3 | ND_NFSV4)) {
NFSM_DISSECT(tl, u_int32_t *, NFSX_UNSIGNED);
if ((len = fxdr_unsigned(int, *tl)) <= 0 ||
- len > NFSX_FHMAX)
- return (EBADRPC);
+ len > NFSX_FHMAX) {
+ error = EBADRPC;
+ goto nfsmout;
+ }
} else
len = NFSX_V2FH;
MALLOC(nfhp, struct nfsfh *, sizeof (struct nfsfh) + len,
@@ -629,11 +644,12 @@ nfsm_getfh(struct nfsrv_descript *nd, struct nfsfh **nfhpp)
error = nfsrv_mtostr(nd, nfhp->nfh_fh, len);
if (error) {
FREE((caddr_t)nfhp, M_NFSFH);
- return (error);
+ goto nfsmout;
}
nfhp->nfh_len = len;
*nfhpp = nfhp;
nfsmout:
+ NFSEXITCODE2(error, nd);
return (error);
}
@@ -660,9 +676,9 @@ nfsrv_dissectacl(struct nfsrv_descript *nd, NFSACL_T *aclp, int *aclerrp,
aclsize = NFSX_UNSIGNED;
acecnt = fxdr_unsigned(int, *tl);
if (acecnt > ACL_MAX_ENTRIES)
- aceerr = 1;
+ aceerr = NFSERR_ATTRNOTSUPP;
if (nfsrv_useacl == 0)
- aceerr = 1;
+ aceerr = NFSERR_ATTRNOTSUPP;
for (i = 0; i < acecnt; i++) {
if (aclp && !aceerr)
error = nfsrv_dissectace(nd, &aclp->acl_entry[i],
@@ -670,7 +686,7 @@ nfsrv_dissectacl(struct nfsrv_descript *nd, NFSACL_T *aclp, int *aclerrp,
else
error = nfsrv_skipace(nd, &acesize);
if (error)
- return (error);
+ goto nfsmout;
aclsize += acesize;
}
if (aclp && !aceerr)
@@ -680,6 +696,7 @@ nfsrv_dissectacl(struct nfsrv_descript *nd, NFSACL_T *aclp, int *aclerrp,
if (aclsizep)
*aclsizep = aclsize;
nfsmout:
+ NFSEXITCODE2(error, nd);
return (error);
}
@@ -697,6 +714,7 @@ nfsrv_skipace(struct nfsrv_descript *nd, int *acesizep)
error = nfsm_advance(nd, NFSM_RNDUP(len), -1);
nfsmout:
*acesizep = NFSM_RNDUP(len) + (4 * NFSX_UNSIGNED);
+ NFSEXITCODE2(error, nd);
return (error);
}
@@ -715,8 +733,10 @@ nfsrv_getattrbits(struct nfsrv_descript *nd, nfsattrbit_t *attrbitp, int *cntp,
NFSM_DISSECT(tl, u_int32_t *, NFSX_UNSIGNED);
cnt = fxdr_unsigned(int, *tl);
- if (cnt < 0)
- return (NFSERR_BADXDR);
+ if (cnt < 0) {
+ error = NFSERR_BADXDR;
+ goto nfsmout;
+ }
if (cnt > NFSATTRBIT_MAXWORDS) {
outcnt = NFSATTRBIT_MAXWORDS;
if (retnotsupp)
@@ -735,6 +755,7 @@ nfsrv_getattrbits(struct nfsrv_descript *nd, nfsattrbit_t *attrbitp, int *cntp,
if (cntp)
*cntp = NFSX_UNSIGNED + (cnt * NFSX_UNSIGNED);
nfsmout:
+ NFSEXITCODE2(error, nd);
return (error);
}
@@ -756,7 +777,7 @@ nfsv4_loadattr(struct nfsrv_descript *nd, vnode_t vp,
u_int32_t *leasep, u_int32_t *rderrp, NFSPROC_T *p, struct ucred *cred)
{
u_int32_t *tl;
- int i = 0, j, k, l, m, bitpos, attrsum = 0;
+ int i = 0, j, k, l = 0, m, bitpos, attrsum = 0;
int error, tfhsize, aceerr, attrsize, cnt, retnotsup;
u_char *cp, *cp2, namestr[NFSV4_SMALLSTR + 1];
nfsattrbit_t attrbits, retattrbits, checkattrbits;
@@ -782,7 +803,7 @@ nfsv4_loadattr(struct nfsrv_descript *nd, vnode_t vp,
error = nfsrv_getattrbits(nd, &attrbits, NULL, NULL);
}
if (error)
- return (error);
+ goto nfsmout;
if (compare) {
*retcmpp = retnotsup;
@@ -853,7 +874,7 @@ nfsv4_loadattr(struct nfsrv_descript *nd, vnode_t vp,
error = nfsrv_getattrbits(nd, &nap->na_suppattr,
&cnt, &retnotsup);
if (error)
- return (error);
+ goto nfsmout;
if (compare && !(*retcmpp)) {
NFSSETSUPP_ATTRBIT(&checkattrbits);
if (!NFSEQUAL_ATTRBIT(&retattrbits, &checkattrbits)
@@ -1014,9 +1035,10 @@ nfsv4_loadattr(struct nfsrv_descript *nd, vnode_t vp,
&cnt, p);
if (error) {
acl_free(naclp);
- return (error);
+ goto nfsmout;
}
- if (aceerr || nfsrv_compareacl(aclp, naclp))
+ if (aceerr || aclp == NULL ||
+ nfsrv_compareacl(aclp, naclp))
*retcmpp = NFSERR_NOTSAME;
acl_free(naclp);
} else {
@@ -1033,7 +1055,7 @@ nfsv4_loadattr(struct nfsrv_descript *nd, vnode_t vp,
error = nfsrv_dissectacl(nd, NULL, &aceerr,
&cnt, p);
if (error)
- return (error);
+ goto nfsmout;
}
attrsum += cnt;
break;
@@ -1118,7 +1140,7 @@ nfsv4_loadattr(struct nfsrv_descript *nd, vnode_t vp,
case NFSATTRBIT_FILEHANDLE:
error = nfsm_getfh(nd, &tnfhp);
if (error)
- return (error);
+ goto nfsmout;
tfhsize = tnfhp->nfh_len;
if (compare) {
if (!(*retcmpp) &&
@@ -1184,7 +1206,7 @@ nfsv4_loadattr(struct nfsrv_descript *nd, vnode_t vp,
case NFSATTRBIT_FSLOCATIONS:
error = nfsrv_getrefstr(nd, &cp, &cp2, &l, &m);
if (error)
- return (error);
+ goto nfsmout;
attrsum += l;
if (compare && !(*retcmpp)) {
refp = nfsv4root_getreferral(vp, NULL, 0);
@@ -1360,8 +1382,10 @@ nfsv4_loadattr(struct nfsrv_descript *nd, vnode_t vp,
case NFSATTRBIT_OWNER:
NFSM_DISSECT(tl, u_int32_t *, NFSX_UNSIGNED);
j = fxdr_unsigned(int, *tl);
- if (j < 0)
- return (NFSERR_BADXDR);
+ if (j < 0) {
+ error = NFSERR_BADXDR;
+ goto nfsmout;
+ }
attrsum += (NFSX_UNSIGNED + NFSM_RNDUP(j));
if (j > NFSV4_SMALLSTR)
cp = malloc(j + 1, M_NFSSTRING, M_WAITOK);
@@ -1371,7 +1395,7 @@ nfsv4_loadattr(struct nfsrv_descript *nd, vnode_t vp,
if (error) {
if (j > NFSV4_SMALLSTR)
free(cp, M_NFSSTRING);
- return (error);
+ goto nfsmout;
}
if (compare) {
if (!(*retcmpp)) {
@@ -1391,8 +1415,10 @@ nfsv4_loadattr(struct nfsrv_descript *nd, vnode_t vp,
case NFSATTRBIT_OWNERGROUP:
NFSM_DISSECT(tl, u_int32_t *, NFSX_UNSIGNED);
j = fxdr_unsigned(int, *tl);
- if (j < 0)
- return (NFSERR_BADXDR);
+ if (j < 0) {
+ error = NFSERR_BADXDR;
+ goto nfsmout;
+ }
attrsum += (NFSX_UNSIGNED + NFSM_RNDUP(j));
if (j > NFSV4_SMALLSTR)
cp = malloc(j + 1, M_NFSSTRING, M_WAITOK);
@@ -1402,7 +1428,7 @@ nfsv4_loadattr(struct nfsrv_descript *nd, vnode_t vp,
if (error) {
if (j > NFSV4_SMALLSTR)
free(cp, M_NFSSTRING);
- return (error);
+ goto nfsmout;
}
if (compare) {
if (!(*retcmpp)) {
@@ -1708,6 +1734,7 @@ nfsv4_loadattr(struct nfsrv_descript *nd, vnode_t vp,
error = nfsm_advance(nd, attrsize - attrsum, -1);
}
nfsmout:
+ NFSEXITCODE2(error, nd);
return (error);
}
@@ -1904,8 +1931,10 @@ nfsrv_mtostr(struct nfsrv_descript *nd, char *str, int siz)
siz -= xfer;
if (siz > 0) {
mp = mbuf_next(mp);
- if (mp == NULL)
- return (EBADRPC);
+ if (mp == NULL) {
+ error = EBADRPC;
+ goto out;
+ }
cp = NFSMTOD(mp, caddr_t);
len = mbuf_len(mp);
} else {
@@ -1922,6 +1951,9 @@ nfsrv_mtostr(struct nfsrv_descript *nd, char *str, int siz)
else
nd->nd_dpos += rem;
}
+
+out:
+ NFSEXITCODE2(error, nd);
return (error);
}
@@ -1995,12 +2027,12 @@ nfsv4_fillattr(struct nfsrv_descript *nd, struct mount *mp, vnode_t vp,
supports_nfsv4acls == 0)) {
NFSCLRBIT_ATTRBIT(retbitp, NFSATTRBIT_ACL);
} else if (naclp != NULL) {
- if (vn_lock(vp, LK_SHARED) == 0) {
+ if (NFSVOPLOCK(vp, LK_SHARED) == 0) {
error = VOP_ACCESSX(vp, VREAD_ACL, cred, p);
if (error == 0)
error = VOP_GETACL(vp, ACL_TYPE_NFS4,
naclp, cred, p);
- VOP_UNLOCK(vp, 0);
+ NFSVOPUNLOCK(vp, 0);
} else
error = NFSERR_PERM;
if (error != 0) {
@@ -2568,9 +2600,12 @@ nfsv4_strtouid(u_char *str, int len, uid_t *uidp, NFSPROC_T *p)
u_char *cp;
struct nfsusrgrp *usrp;
int cnt, ret;
+ int error = 0;
- if (len == 0)
- return (NFSERR_BADOWNER);
+ if (len == 0) {
+ error = NFSERR_BADOWNER;
+ goto out;
+ }
/*
* Look for an '@'.
*/
@@ -2601,7 +2636,8 @@ tryagain:
if (len == 6 && !NFSBCMP(str, "nobody", 6)) {
*uidp = nfsrv_defaultuid;
NFSUNLOCKNAMEID();
- return (0);
+ error = 0;
+ goto out;
}
LIST_FOREACH(usrp, NFSUSERNAMEHASH(str, len), lug_namehash) {
@@ -2613,7 +2649,8 @@ tryagain:
TAILQ_REMOVE(&nfsuserlruhead, usrp, lug_lru);
TAILQ_INSERT_TAIL(&nfsuserlruhead, usrp, lug_lru);
NFSUNLOCKNAMEID();
- return (0);
+ error = 0;
+ goto out;
}
}
NFSUNLOCKNAMEID();
@@ -2622,7 +2659,11 @@ tryagain:
str, p);
if (ret == 0 && cnt < 2)
goto tryagain;
- return (NFSERR_BADOWNER);
+ error = NFSERR_BADOWNER;
+
+out:
+ NFSEXITCODE(error);
+ return (error);
}
/*
@@ -2748,9 +2789,12 @@ nfsv4_strtogid(u_char *str, int len, gid_t *gidp, NFSPROC_T *p)
u_char *cp;
struct nfsusrgrp *usrp;
int cnt, ret;
+ int error = 0;
- if (len == 0)
- return (NFSERR_BADOWNER);
+ if (len == 0) {
+ error = NFSERR_BADOWNER;
+ goto out;
+ }
/*
* Look for an '@'.
*/
@@ -2779,7 +2823,8 @@ tryagain:
if (len == 7 && !NFSBCMP(str, "nogroup", 7)) {
*gidp = nfsrv_defaultgid;
NFSUNLOCKNAMEID();
- return (0);
+ error = 0;
+ goto out;
}
LIST_FOREACH(usrp, NFSGROUPNAMEHASH(str, len), lug_namehash) {
@@ -2791,7 +2836,8 @@ tryagain:
TAILQ_REMOVE(&nfsuserlruhead, usrp, lug_lru);
TAILQ_INSERT_TAIL(&nfsuserlruhead, usrp, lug_lru);
NFSUNLOCKNAMEID();
- return (0);
+ error = 0;
+ goto out;
}
}
NFSUNLOCKNAMEID();
@@ -2800,7 +2846,11 @@ tryagain:
str, p);
if (ret == 0 && cnt < 2)
goto tryagain;
- return (NFSERR_BADOWNER);
+ error = NFSERR_BADOWNER;
+
+out:
+ NFSEXITCODE(error);
+ return (error);
}
/*
@@ -2845,7 +2895,8 @@ nfsrv_nfsuserdport(u_short port, NFSPROC_T *p)
NFSLOCKNAMEID();
if (nfsrv_nfsuserd) {
NFSUNLOCKNAMEID();
- return (EPERM);
+ error = EPERM;
+ goto out;
}
nfsrv_nfsuserd = 1;
NFSUNLOCKNAMEID();
@@ -2871,6 +2922,8 @@ nfsrv_nfsuserdport(u_short port, NFSPROC_T *p)
NFSSOCKADDRFREE(rp->nr_nam);
nfsrv_nfsuserd = 0;
}
+out:
+ NFSEXITCODE(error);
return (error);
}
@@ -2910,7 +2963,8 @@ nfsrv_getuser(int procnum, uid_t uid, gid_t gid, char *name, NFSPROC_T *p)
NFSLOCKNAMEID();
if (nfsrv_nfsuserd == 0) {
NFSUNLOCKNAMEID();
- return (EPERM);
+ error = EPERM;
+ goto out;
}
NFSUNLOCKNAMEID();
nd = &nfsd;
@@ -2936,6 +2990,8 @@ nfsrv_getuser(int procnum, uid_t uid, gid_t gid, char *name, NFSPROC_T *p)
mbuf_freem(nd->nd_mrep);
error = nd->nd_repstat;
}
+out:
+ NFSEXITCODE(error);
return (error);
}
@@ -2992,7 +3048,7 @@ nfssvc_idname(struct nfsd_idargs *nidp)
NFSUNLOCKNAMEID();
if (error)
free(cp, M_NFSSTRING);
- return (error);
+ goto out;
}
/*
@@ -3005,7 +3061,7 @@ nfssvc_idname(struct nfsd_idargs *nidp)
nidp->nid_namelen);
if (error) {
free((caddr_t)newusrp, M_NFSUSERGROUP);
- return (error);
+ goto out;
}
newusrp->lug_namelen = nidp->nid_namelen;
@@ -3080,6 +3136,8 @@ nfssvc_idname(struct nfsd_idargs *nidp)
} else
FREE((caddr_t)newusrp, M_NFSUSERGROUP);
NFSUNLOCKNAMEID();
+out:
+ NFSEXITCODE(error);
return (error);
}
@@ -3109,6 +3167,7 @@ nfsrv_checkutf8(u_int8_t *cp, int len)
int cnt = 0, gotd = 0, shift = 0;
u_int8_t byte;
static int utf8_shift[5] = { 7, 11, 16, 21, 26 };
+ int error = 0;
/*
* Here are what the variables are used for:
@@ -3125,14 +3184,18 @@ nfsrv_checkutf8(u_int8_t *cp, int len)
if (cnt > 0) {
/* This handles the 10xxxxxx bytes */
if ((*cp & 0xc0) != 0x80 ||
- (gotd && (*cp & 0x20)))
- return (NFSERR_INVAL);
+ (gotd && (*cp & 0x20))) {
+ error = NFSERR_INVAL;
+ goto out;
+ }
gotd = 0;
val <<= 6;
val |= (*cp & 0x3f);
cnt--;
- if (cnt == 0 && (val >> shift) == 0x0)
- return (NFSERR_INVAL);
+ if (cnt == 0 && (val >> shift) == 0x0) {
+ error = NFSERR_INVAL;
+ goto out;
+ }
} else if (*cp & 0x80) {
/* first byte of multi byte char */
byte = *cp;
@@ -3140,8 +3203,10 @@ nfsrv_checkutf8(u_int8_t *cp, int len)
cnt++;
byte <<= 1;
}
- if (cnt == 0 || cnt == 6)
- return (NFSERR_INVAL);
+ if (cnt == 0 || cnt == 6) {
+ error = NFSERR_INVAL;
+ goto out;
+ }
val = (*cp & (0x3f >> cnt));
shift = utf8_shift[cnt - 1];
if (cnt == 2 && val == 0xd)
@@ -3152,8 +3217,11 @@ nfsrv_checkutf8(u_int8_t *cp, int len)
len--;
}
if (cnt > 0)
- return (NFSERR_INVAL);
- return (0);
+ error = NFSERR_INVAL;
+
+out:
+ NFSEXITCODE(error);
+ return (error);
}
/*
@@ -3174,7 +3242,7 @@ nfsrv_getrefstr(struct nfsrv_descript *nd, u_char **fsrootp, u_char **srvp,
{
u_int32_t *tl;
u_char *cp = NULL, *cp2 = NULL, *cp3, *str;
- int i, j, len, stringlen, cnt, slen, siz, xdrsum, error, nsrv;
+ int i, j, len, stringlen, cnt, slen, siz, xdrsum, error = 0, nsrv;
struct list {
SLIST_ENTRY(list) next;
int len;
@@ -3192,15 +3260,20 @@ nfsrv_getrefstr(struct nfsrv_descript *nd, u_char **fsrootp, u_char **srvp,
*/
NFSM_DISSECT(tl, u_int32_t *, NFSX_UNSIGNED);
len = fxdr_unsigned(int, *tl);
- if (len < 0 || len > 10240)
- return (NFSERR_BADXDR);
+ if (len < 0 || len > 10240) {
+ error = NFSERR_BADXDR;
+ goto nfsmout;
+ }
if (len == 0) {
NFSM_DISSECT(tl, u_int32_t *, NFSX_UNSIGNED);
- if (*tl != 0)
- return (NFSERR_BADXDR);
+ if (*tl != 0) {
+ error = NFSERR_BADXDR;
+ goto nfsmout;
+ }
*nilp = 1;
*sump = 2 * NFSX_UNSIGNED;
- return (0);
+ error = 0;
+ goto nfsmout;
}
cp = malloc(len + 1, M_NFSSTRING, M_WAITOK);
error = nfsrv_mtostr(nd, cp, len);
@@ -3210,10 +3283,8 @@ nfsrv_getrefstr(struct nfsrv_descript *nd, u_char **fsrootp, u_char **srvp,
if (cnt <= 0)
error = NFSERR_BADXDR;
}
- if (error) {
- free(cp, M_NFSSTRING);
- return (error);
- }
+ if (error)
+ goto nfsmout;
/*
* Now, loop through the location list and make up the srvlist.
@@ -3227,9 +3298,8 @@ nfsrv_getrefstr(struct nfsrv_descript *nd, u_char **fsrootp, u_char **srvp,
NFSM_DISSECT(tl, u_int32_t *, NFSX_UNSIGNED);
nsrv = fxdr_unsigned(int, *tl);
if (nsrv <= 0) {
- free(cp, M_NFSSTRING);
- free(cp2, M_NFSSTRING);
- return (NFSERR_BADXDR);
+ error = NFSERR_BADXDR;
+ goto nfsmout;
}
/*
@@ -3238,9 +3308,8 @@ nfsrv_getrefstr(struct nfsrv_descript *nd, u_char **fsrootp, u_char **srvp,
NFSM_DISSECT(tl, u_int32_t *, NFSX_UNSIGNED);
len = fxdr_unsigned(int, *tl);
if (len <= 0 || len > 1024) {
- free(cp, M_NFSSTRING);
- free(cp2, M_NFSSTRING);
- return (NFSERR_BADXDR);
+ error = NFSERR_BADXDR;
+ goto nfsmout;
}
nfsrv_refstrbigenough(siz + len + 3, &cp2, &cp3, &slen);
if (cp3 != cp2) {
@@ -3248,11 +3317,8 @@ nfsrv_getrefstr(struct nfsrv_descript *nd, u_char **fsrootp, u_char **srvp,
siz++;
}
error = nfsrv_mtostr(nd, cp3, len);
- if (error) {
- free(cp, M_NFSSTRING);
- free(cp2, M_NFSSTRING);
- return (error);
- }
+ if (error)
+ goto nfsmout;
cp3 += len;
*cp3++ = ':';
siz += (len + 1);
@@ -3264,18 +3330,14 @@ nfsrv_getrefstr(struct nfsrv_descript *nd, u_char **fsrootp, u_char **srvp,
NFSM_DISSECT(tl, u_int32_t *, NFSX_UNSIGNED);
len = fxdr_unsigned(int, *tl);
if (len <= 0 || len > 1024) {
- free(cp, M_NFSSTRING);
- free(cp2, M_NFSSTRING);
- return (NFSERR_BADXDR);
+ error = NFSERR_BADXDR;
+ goto nfsmout;
}
lsp = (struct list *)malloc(sizeof (struct list)
+ len, M_TEMP, M_WAITOK);
error = nfsrv_mtostr(nd, lsp->host, len);
- if (error) {
- free(cp, M_NFSSTRING);
- free(cp2, M_NFSSTRING);
- return (error);
- }
+ if (error)
+ goto nfsmout;
xdrsum += NFSX_UNSIGNED + NFSM_RNDUP(len);
lsp->len = len;
SLIST_INSERT_HEAD(&head, lsp, next);
@@ -3287,17 +3349,13 @@ nfsrv_getrefstr(struct nfsrv_descript *nd, u_char **fsrootp, u_char **srvp,
NFSM_DISSECT(tl, u_int32_t *, NFSX_UNSIGNED);
len = fxdr_unsigned(int, *tl);
if (len <= 0 || len > 1024) {
- free(cp, M_NFSSTRING);
- free(cp2, M_NFSSTRING);
- return (NFSERR_BADXDR);
+ error = NFSERR_BADXDR;
+ goto nfsmout;
}
nfsrv_refstrbigenough(siz + len + 1, &cp2, &cp3, &slen);
error = nfsrv_mtostr(nd, cp3, len);
- if (error) {
- free(cp, M_NFSSTRING);
- free(cp2, M_NFSSTRING);
- return (error);
- }
+ if (error)
+ goto nfsmout;
xdrsum += NFSX_UNSIGNED + NFSM_RNDUP(len);
str = cp3;
stringlen = len;
@@ -3320,12 +3378,14 @@ nfsrv_getrefstr(struct nfsrv_descript *nd, u_char **fsrootp, u_char **srvp,
*fsrootp = cp;
*srvp = cp2;
*sump = xdrsum;
+ NFSEXITCODE2(0, nd);
return (0);
nfsmout:
if (cp != NULL)
free(cp, M_NFSSTRING);
if (cp2 != NULL)
free(cp2, M_NFSSTRING);
+ NFSEXITCODE2(error, nd);
return (error);
}
diff --git a/sys/fs/nfs/nfs_var.h b/sys/fs/nfs/nfs_var.h
index 5f944b5..f095641 100644
--- a/sys/fs/nfs/nfs_var.h
+++ b/sys/fs/nfs/nfs_var.h
@@ -325,6 +325,8 @@ struct ucred *newnfs_getcred(void);
void newnfs_setroot(struct ucred *);
int nfs_catnap(int, int, const char *);
struct nfsreferral *nfsv4root_getreferral(vnode_t, vnode_t, u_int32_t);
+int nfsvno_pathconf(vnode_t, int, register_t *, struct ucred *,
+ NFSPROC_T *);
int nfsrv_atroot(vnode_t, long *);
void newnfs_timer(void *);
int nfs_supportsnfsv4acls(vnode_t);
@@ -438,6 +440,7 @@ int nfscl_getcl(vnode_t, struct ucred *, NFSPROC_T *,
struct nfsclclient *nfscl_findcl(struct nfsmount *);
void nfscl_clientrelease(struct nfsclclient *);
void nfscl_freelock(struct nfscllock *, int);
+void nfscl_freelockowner(struct nfscllockowner *, int);
int nfscl_getbytelock(vnode_t, u_int64_t, u_int64_t, short,
struct ucred *, NFSPROC_T *, struct nfsclclient *, int, void *, int,
u_int8_t *, u_int8_t *, struct nfscllockowner **, int *, int *);
@@ -568,8 +571,6 @@ int nfsvno_checkexp(mount_t, NFSSOCKADDR_T, struct nfsexstuff *,
struct ucred **);
int nfsvno_fhtovp(mount_t, fhandle_t *, NFSSOCKADDR_T, int,
vnode_t *, struct nfsexstuff *, struct ucred **);
-int nfsvno_pathconf(vnode_t, int, register_t *, struct ucred *,
- NFSPROC_T *);
vnode_t nfsvno_getvp(fhandle_t *);
int nfsvno_advlock(vnode_t, int, u_int64_t, u_int64_t, NFSPROC_T *);
int nfsrv_v4rootexport(void *, struct ucred *, NFSPROC_T *);
diff --git a/sys/fs/nfs/nfsdport.h b/sys/fs/nfs/nfsdport.h
index a3f05db..529ada2 100644
--- a/sys/fs/nfs/nfsdport.h
+++ b/sys/fs/nfs/nfsdport.h
@@ -57,6 +57,22 @@ struct nfsexstuff {
int nes_secflavors[MAXSECFLAVORS]; /* and the flavors */
};
+/*
+ * These are NO-OPS for BSD until Isilon upstreams EXITCODE support.
+ * EXITCODE is an in-memory ring buffer that holds the routines failing status.
+ * This is a valuable tool to use when debugging and analyzing issues.
+ * In addition to recording a routine's failing status, it offers
+ * logging of routines for call stack tracing.
+ * EXITCODE should be used only in routines that return a true errno value, as
+ * that value will be formatted to a displayable errno string. Routines that
+ * return regular int status that are not true errno should not set EXITCODE.
+ * If you want to log routine tracing, you can add EXITCODE(0) to any routine.
+ * NFS extended the EXITCODE with EXITCODE2 to record either the routine's
+ * exit errno status or the nd_repstat.
+ */
+#define NFSEXITCODE(error)
+#define NFSEXITCODE2(error, nd)
+
#define NFSVNO_EXINIT(e) ((e)->nes_exflag = 0)
#define NFSVNO_EXPORTED(e) ((e)->nes_exflag & MNT_EXPORTED)
#define NFSVNO_EXRDONLY(e) ((e)->nes_exflag & MNT_EXRDONLY)
diff --git a/sys/fs/nfs/nfsport.h b/sys/fs/nfs/nfsport.h
index 9866ef7..726d3b5 100644
--- a/sys/fs/nfs/nfsport.h
+++ b/sys/fs/nfs/nfsport.h
@@ -836,10 +836,13 @@ void nfsd_mntinit(void);
/*
* Define these for vnode lock/unlock ops.
+ *
+ * These are good abstractions to macro out, so that they can be added to
+ * later, for debugging or stats, etc.
*/
-#define NFSVOPLOCK(v, f, p) vn_lock((v), (f))
-#define NFSVOPUNLOCK(v, f, p) VOP_UNLOCK((v), (f))
-#define NFSVOPISLOCKED(v, p) VOP_ISLOCKED((v))
+#define NFSVOPLOCK(v, f) vn_lock((v), (f))
+#define NFSVOPUNLOCK(v, f) VOP_UNLOCK((v), (f))
+#define NFSVOPISLOCKED(v) VOP_ISLOCKED((v))
/*
* Define ncl_hash().
diff --git a/sys/fs/nfsclient/nfs_clport.c b/sys/fs/nfsclient/nfs_clport.c
index 4a95887..44d3c74 100644
--- a/sys/fs/nfsclient/nfs_clport.c
+++ b/sys/fs/nfsclient/nfs_clport.c
@@ -127,7 +127,7 @@ nfscl_nget(struct mount *mntp, struct vnode *dvp, struct nfsfh *nfhp,
if (error == 0 && nvp != NULL) {
/*
* I believe there is a slight chance that vgonel() could
- * get called on this vnode between when vn_lock() drops
+ * get called on this vnode between when NFSVOPLOCK() drops
* the VI_LOCK() and vget() acquires it again, so that it
* hasn't yet had v_usecount incremented. If this were to
* happen, the VI_DOOMED flag would be set, so check for
@@ -317,7 +317,7 @@ nfscl_ngetreopen(struct mount *mntp, u_int8_t *fhp, int fhsize,
error = vfs_hash_get(mntp, hash, (LK_EXCLUSIVE | LK_NOWAIT), td, &nvp,
newnfs_vncmpf, nfhp);
if (error == 0 && nvp != NULL) {
- VOP_UNLOCK(nvp, 0);
+ NFSVOPUNLOCK(nvp, 0);
} else if (error == EBUSY) {
/*
* The LK_EXCLOTHER lock type tells nfs_lock1() to not try
diff --git a/sys/fs/nfsclient/nfs_clrpcops.c b/sys/fs/nfsclient/nfs_clrpcops.c
index ee73882..b88f7b8 100644
--- a/sys/fs/nfsclient/nfs_clrpcops.c
+++ b/sys/fs/nfsclient/nfs_clrpcops.c
@@ -585,7 +585,7 @@ APPLESTATIC void
nfsrpc_doclose(struct nfsmount *nmp, struct nfsclopen *op, NFSPROC_T *p)
{
struct nfsrv_descript nfsd, *nd = &nfsd;
- struct nfscllockowner *lp;
+ struct nfscllockowner *lp, *nlp;
struct nfscllock *lop, *nlop;
struct ucred *tcred;
u_int64_t off = 0, len = 0;
@@ -642,6 +642,14 @@ nfsrpc_doclose(struct nfsmount *nmp, struct nfsclopen *op, NFSPROC_T *p)
}
nfscl_freelock(lop, 0);
}
+ /*
+ * Do a ReleaseLockOwner.
+ * The lock owner name nfsl_owner may be used by other opens for
+ * other files but the lock_owner4 name that nfsrpc_rellockown()
+ * puts on the wire has the file handle for this file appended
+ * to it, so it can be done now.
+ */
+ (void)nfsrpc_rellockown(nmp, lp, tcred, p);
}
/*
@@ -659,20 +667,8 @@ nfsrpc_doclose(struct nfsmount *nmp, struct nfsclopen *op, NFSPROC_T *p)
NFSLOCKCLSTATE();
nfscl_lockunlock(&op->nfso_own->nfsow_rwlock);
- /*
- * Move the lockowner to nfsc_defunctlockowner,
- * so the Renew thread will do the ReleaseLockOwner
- * Op on it later. There might still be other
- * opens using the same lockowner name.
- */
- lp = LIST_FIRST(&op->nfso_lock);
- if (lp != NULL) {
- while (LIST_NEXT(lp, nfsl_list) != NULL)
- lp = LIST_NEXT(lp, nfsl_list);
- LIST_PREPEND(&nmp->nm_clp->nfsc_defunctlockowner,
- &op->nfso_lock, lp, nfsl_list);
- LIST_INIT(&op->nfso_lock);
- }
+ LIST_FOREACH_SAFE(lp, &op->nfso_lock, nfsl_list, nlp)
+ nfscl_freelockowner(lp, 0);
nfscl_freeopen(op, 0);
NFSUNLOCKCLSTATE();
NFSFREECRED(tcred);
@@ -3629,7 +3625,8 @@ nfsrpc_lockt(struct nfsrv_descript *nd, vnode_t vp,
{
u_int32_t *tl;
int error, type, size;
- u_int8_t own[NFSV4CL_LOCKNAMELEN];
+ uint8_t own[NFSV4CL_LOCKNAMELEN + NFSX_V4FHMAX];
+ struct nfsnode *np;
NFSCL_REQSTART(nd, NFSPROC_LOCKT, vp);
NFSM_BUILD(tl, u_int32_t *, 7 * NFSX_UNSIGNED);
@@ -3644,7 +3641,10 @@ nfsrpc_lockt(struct nfsrv_descript *nd, vnode_t vp,
*tl++ = clp->nfsc_clientid.lval[0];
*tl = clp->nfsc_clientid.lval[1];
nfscl_filllockowner(id, own, flags);
- (void) nfsm_strtom(nd, own, NFSV4CL_LOCKNAMELEN);
+ np = VTONFS(vp);
+ NFSBCOPY(np->n_fhp->nfh_fh, &own[NFSV4CL_LOCKNAMELEN],
+ np->n_fhp->nfh_len);
+ (void)nfsm_strtom(nd, own, NFSV4CL_LOCKNAMELEN + np->n_fhp->nfh_len);
error = nfscl_request(nd, vp, p, cred, NULL);
if (error)
return (error);
@@ -3744,6 +3744,7 @@ nfsrpc_lock(struct nfsrv_descript *nd, struct nfsmount *nmp, vnode_t vp,
{
u_int32_t *tl;
int error, size;
+ uint8_t own[NFSV4CL_LOCKNAMELEN + NFSX_V4FHMAX];
nfscl_reqstart(nd, NFSPROC_LOCK, nmp, nfhp, fhlen, NULL);
NFSM_BUILD(tl, u_int32_t *, 7 * NFSX_UNSIGNED);
@@ -3768,7 +3769,9 @@ nfsrpc_lock(struct nfsrv_descript *nd, struct nfsmount *nmp, vnode_t vp,
*tl++ = txdr_unsigned(lp->nfsl_seqid);
*tl++ = lp->nfsl_open->nfso_own->nfsow_clp->nfsc_clientid.lval[0];
*tl = lp->nfsl_open->nfso_own->nfsow_clp->nfsc_clientid.lval[1];
- (void) nfsm_strtom(nd, lp->nfsl_owner, NFSV4CL_LOCKNAMELEN);
+ NFSBCOPY(lp->nfsl_owner, own, NFSV4CL_LOCKNAMELEN);
+ NFSBCOPY(nfhp, &own[NFSV4CL_LOCKNAMELEN], fhlen);
+ (void)nfsm_strtom(nd, own, NFSV4CL_LOCKNAMELEN + fhlen);
} else {
*tl = newnfs_false;
NFSM_BUILD(tl, u_int32_t *, NFSX_STATEID + NFSX_UNSIGNED);
@@ -4029,12 +4032,17 @@ nfsrpc_rellockown(struct nfsmount *nmp, struct nfscllockowner *lp,
struct nfsrv_descript nfsd, *nd = &nfsd;
u_int32_t *tl;
int error;
+ uint8_t own[NFSV4CL_LOCKNAMELEN + NFSX_V4FHMAX];
nfscl_reqstart(nd, NFSPROC_RELEASELCKOWN, nmp, NULL, 0, NULL);
NFSM_BUILD(tl, u_int32_t *, 2 * NFSX_UNSIGNED);
*tl++ = nmp->nm_clp->nfsc_clientid.lval[0];
*tl = nmp->nm_clp->nfsc_clientid.lval[1];
- (void) nfsm_strtom(nd, lp->nfsl_owner, NFSV4CL_LOCKNAMELEN);
+ NFSBCOPY(lp->nfsl_owner, own, NFSV4CL_LOCKNAMELEN);
+ NFSBCOPY(lp->nfsl_open->nfso_fh, &own[NFSV4CL_LOCKNAMELEN],
+ lp->nfsl_open->nfso_fhlen);
+ (void)nfsm_strtom(nd, own, NFSV4CL_LOCKNAMELEN +
+ lp->nfsl_open->nfso_fhlen);
nd->nd_flag |= ND_USEGSSNAME;
error = newnfs_request(nd, nmp, NULL, &nmp->nm_sockreq, NULL, p, cred,
NFS_PROG, NFS_VER4, NULL, 1, NULL);
diff --git a/sys/fs/nfsclient/nfs_clstate.c b/sys/fs/nfsclient/nfs_clstate.c
index aa81437..7ce2b8e 100644
--- a/sys/fs/nfsclient/nfs_clstate.c
+++ b/sys/fs/nfsclient/nfs_clstate.c
@@ -95,7 +95,7 @@ int nfscl_deleghighwater = NFSCLDELEGHIGHWATER;
static int nfscl_delegcnt = 0;
static int nfscl_getopen(struct nfsclownerhead *, u_int8_t *, int, u_int8_t *,
- NFSPROC_T *, u_int32_t, struct nfsclowner **, struct nfsclopen **);
+ u_int8_t *, u_int32_t, struct nfscllockowner **, struct nfsclopen **);
static void nfscl_clrelease(struct nfsclclient *);
static void nfscl_cleanclient(struct nfsclclient *);
static void nfscl_expireclient(struct nfsclclient *, struct nfsmount *,
@@ -114,7 +114,6 @@ static struct nfscldeleg *nfscl_finddeleg(struct nfsclclient *, u_int8_t *,
int);
static int nfscl_checkconflict(struct nfscllockownerhead *, struct nfscllock *,
u_int8_t *, struct nfscllock **);
-static void nfscl_freelockowner(struct nfscllockowner *, int);
static void nfscl_freealllocks(struct nfscllockownerhead *, int);
static int nfscl_localconflict(struct nfsclclient *, u_int8_t *, int,
struct nfscllock *, u_int8_t *, struct nfscldeleg *, struct nfscllock **);
@@ -522,25 +521,20 @@ nfscl_getstateid(vnode_t vp, u_int8_t *nfhp, int fhlen, u_int32_t mode,
* for a matching OpenOwner and use that.
*/
nfscl_filllockowner(p->td_proc, own, F_POSIX);
- error = nfscl_getopen(&clp->nfsc_owner, nfhp, fhlen, NULL, p,
- mode, NULL, &op);
- if (error == 0) {
- /* now look for a lockowner */
- LIST_FOREACH(lp, &op->nfso_lock, nfsl_list) {
- if (!NFSBCMP(lp->nfsl_owner, own,
- NFSV4CL_LOCKNAMELEN)) {
- stateidp->seqid =
- lp->nfsl_stateid.seqid;
- stateidp->other[0] =
- lp->nfsl_stateid.other[0];
- stateidp->other[1] =
- lp->nfsl_stateid.other[1];
- stateidp->other[2] =
- lp->nfsl_stateid.other[2];
- NFSUNLOCKCLSTATE();
- return (0);
- }
- }
+ lp = NULL;
+ error = nfscl_getopen(&clp->nfsc_owner, nfhp, fhlen, own, own,
+ mode, &lp, &op);
+ if (error == 0 && lp != NULL) {
+ stateidp->seqid =
+ lp->nfsl_stateid.seqid;
+ stateidp->other[0] =
+ lp->nfsl_stateid.other[0];
+ stateidp->other[1] =
+ lp->nfsl_stateid.other[1];
+ stateidp->other[2] =
+ lp->nfsl_stateid.other[2];
+ NFSUNLOCKCLSTATE();
+ return (0);
}
}
if (op == NULL) {
@@ -579,55 +573,74 @@ nfscl_getstateid(vnode_t vp, u_int8_t *nfhp, int fhlen, u_int32_t mode,
}
/*
- * Get an existing open. Search up the parentage tree for a match and
- * return with the first one found.
+ * Search for a matching file, mode and, optionally, lockowner.
*/
static int
nfscl_getopen(struct nfsclownerhead *ohp, u_int8_t *nfhp, int fhlen,
- u_int8_t *rown, NFSPROC_T *p, u_int32_t mode, struct nfsclowner **owpp,
- struct nfsclopen **opp)
+ u_int8_t *openown, u_int8_t *lockown, u_int32_t mode,
+ struct nfscllockowner **lpp, struct nfsclopen **opp)
{
- struct nfsclowner *owp = NULL;
- struct nfsclopen *op;
- NFSPROC_T *nproc;
- u_int8_t own[NFSV4CL_LOCKNAMELEN], *ownp;
+ struct nfsclowner *owp;
+ struct nfsclopen *op, *rop, *rop2;
+ struct nfscllockowner *lp;
+ int keep_looping;
- nproc = p;
- op = NULL;
- while (op == NULL && (nproc != NULL || rown != NULL)) {
- if (nproc != NULL) {
- nfscl_filllockowner(nproc->td_proc, own, F_POSIX);
- ownp = own;
- } else {
- ownp = rown;
- }
- /* Search the client list */
- LIST_FOREACH(owp, ohp, nfsow_list) {
- if (!NFSBCMP(owp->nfsow_owner, ownp,
- NFSV4CL_LOCKNAMELEN))
- break;
- }
- if (owp != NULL) {
- /* and look for the correct open */
- LIST_FOREACH(op, &owp->nfsow_open, nfso_list) {
- if (op->nfso_fhlen == fhlen &&
- !NFSBCMP(op->nfso_fh, nfhp, fhlen)
- && (op->nfso_mode & mode) == mode) {
- break;
+ if (lpp != NULL)
+ *lpp = NULL;
+ /*
+ * rop will be set to the open to be returned. There are three
+ * variants of this, all for an open of the correct file:
+ * 1 - A match of lockown.
+ * 2 - A match of the openown, when no lockown match exists.
+ * 3 - A match for any open, if no openown or lockown match exists.
+ * Looking for #2 over #3 probably isn't necessary, but since
+ * RFC3530 is vague w.r.t. the relationship between openowners and
+ * lockowners, I think this is the safer way to go.
+ */
+ rop = NULL;
+ rop2 = NULL;
+ keep_looping = 1;
+ /* Search the client list */
+ owp = LIST_FIRST(ohp);
+ while (owp != NULL && keep_looping != 0) {
+ /* and look for the correct open */
+ op = LIST_FIRST(&owp->nfsow_open);
+ while (op != NULL && keep_looping != 0) {
+ if (op->nfso_fhlen == fhlen &&
+ !NFSBCMP(op->nfso_fh, nfhp, fhlen)
+ && (op->nfso_mode & mode) == mode) {
+ if (lpp != NULL) {
+ /* Now look for a matching lockowner. */
+ LIST_FOREACH(lp, &op->nfso_lock,
+ nfsl_list) {
+ if (!NFSBCMP(lp->nfsl_owner,
+ lockown,
+ NFSV4CL_LOCKNAMELEN)) {
+ *lpp = lp;
+ rop = op;
+ keep_looping = 0;
+ break;
+ }
+ }
+ }
+ if (rop == NULL && !NFSBCMP(owp->nfsow_owner,
+ openown, NFSV4CL_LOCKNAMELEN)) {
+ rop = op;
+ if (lpp == NULL)
+ keep_looping = 0;
}
+ if (rop2 == NULL)
+ rop2 = op;
}
+ op = LIST_NEXT(op, nfso_list);
}
- if (rown != NULL)
- break;
- if (op == NULL)
- nproc = nfscl_getparent(nproc);
+ owp = LIST_NEXT(owp, nfsow_list);
}
- if (op == NULL) {
+ if (rop == NULL)
+ rop = rop2;
+ if (rop == NULL)
return (EBADF);
- }
- if (owpp)
- *owpp = owp;
- *opp = op;
+ *opp = rop;
return (0);
}
@@ -748,7 +761,8 @@ nfscl_getcl(vnode_t vp, struct ucred *cred, NFSPROC_T *p,
FREE((caddr_t)newclp, M_NFSCLCLIENT);
}
NFSLOCKCLSTATE();
- while ((clp->nfsc_flags & NFSCLFLAGS_HASCLIENTID) == 0 && !igotlock)
+ while ((clp->nfsc_flags & NFSCLFLAGS_HASCLIENTID) == 0 && !igotlock &&
+ (mp->mnt_kern_flag & MNTK_UNMOUNTF) == 0)
igotlock = nfsv4_lock(&clp->nfsc_lock, 1, NULL,
NFSCLSTATEMUTEXPTR, mp);
if (!igotlock)
@@ -892,16 +906,16 @@ nfscl_getbytelock(vnode_t vp, u_int64_t off, u_int64_t len,
struct nfscldeleg *dp = NULL, *ldp = NULL;
struct nfscllockownerhead *lhp = NULL;
struct nfsnode *np;
- u_int8_t own[NFSV4CL_LOCKNAMELEN], *ownp;
+ u_int8_t own[NFSV4CL_LOCKNAMELEN], *ownp, openown[NFSV4CL_LOCKNAMELEN];
+ u_int8_t *openownp;
int error = 0, ret, donelocally = 0;
u_int32_t mode;
- if (type == F_WRLCK)
- mode = NFSV4OPEN_ACCESSWRITE;
- else
- mode = NFSV4OPEN_ACCESSREAD;
+ /* For Lock Ops, the open mode doesn't matter, so use 0 to match any. */
+ mode = 0;
np = VTONFS(vp);
*lpp = NULL;
+ lp = NULL;
*newonep = 0;
*donelocallyp = 0;
@@ -941,9 +955,12 @@ nfscl_getbytelock(vnode_t vp, u_int64_t off, u_int64_t len,
op = NULL;
if (recovery) {
ownp = rownp;
+ openownp = ropenownp;
} else {
nfscl_filllockowner(id, own, flags);
ownp = own;
+ nfscl_filllockowner(p->td_proc, openown, F_POSIX);
+ openownp = openown;
}
if (!recovery) {
NFSLOCKCLSTATE();
@@ -962,13 +979,13 @@ nfscl_getbytelock(vnode_t vp, u_int64_t off, u_int64_t len,
dp = NULL;
}
if (dp != NULL) {
- /* Now, find the associated open to get the correct openowner */
+ /* Now, find an open and maybe a lockowner. */
ret = nfscl_getopen(&dp->nfsdl_owner, np->n_fhp->nfh_fh,
- np->n_fhp->nfh_len, NULL, p, mode, NULL, &op);
+ np->n_fhp->nfh_len, openownp, ownp, mode, NULL, &op);
if (ret)
ret = nfscl_getopen(&clp->nfsc_owner,
- np->n_fhp->nfh_fh, np->n_fhp->nfh_len, NULL, p,
- mode, NULL, &op);
+ np->n_fhp->nfh_fh, np->n_fhp->nfh_len, openownp,
+ ownp, mode, NULL, &op);
if (!ret) {
lhp = &dp->nfsdl_lock;
TAILQ_REMOVE(&clp->nfsc_deleg, dp, nfsdl_list);
@@ -981,16 +998,11 @@ nfscl_getbytelock(vnode_t vp, u_int64_t off, u_int64_t len,
}
if (!donelocally) {
/*
- * Get the related Open.
+ * Get the related Open and maybe lockowner.
*/
- if (recovery)
- error = nfscl_getopen(&clp->nfsc_owner,
- np->n_fhp->nfh_fh, np->n_fhp->nfh_len, ropenownp,
- NULL, mode, NULL, &op);
- else
- error = nfscl_getopen(&clp->nfsc_owner,
- np->n_fhp->nfh_fh, np->n_fhp->nfh_len, NULL, p,
- mode, NULL, &op);
+ error = nfscl_getopen(&clp->nfsc_owner,
+ np->n_fhp->nfh_fh, np->n_fhp->nfh_len, openownp,
+ ownp, mode, &lp, &op);
if (!error)
lhp = &op->nfso_lock;
}
@@ -1011,10 +1023,11 @@ nfscl_getbytelock(vnode_t vp, u_int64_t off, u_int64_t len,
/*
* Ok, see if a lockowner exists and create one, as required.
*/
- LIST_FOREACH(lp, lhp, nfsl_list) {
- if (!NFSBCMP(lp->nfsl_owner, ownp, NFSV4CL_LOCKNAMELEN))
- break;
- }
+ if (lp == NULL)
+ LIST_FOREACH(lp, lhp, nfsl_list) {
+ if (!NFSBCMP(lp->nfsl_owner, ownp, NFSV4CL_LOCKNAMELEN))
+ break;
+ }
if (lp == NULL) {
NFSBCOPY(ownp, nlp->nfsl_owner, NFSV4CL_LOCKNAMELEN);
if (recovery)
@@ -1450,7 +1463,7 @@ nfscl_freeopenowner(struct nfsclowner *owp, int local)
/*
* Free up a byte range lock owner structure.
*/
-static void
+APPLESTATIC void
nfscl_freelockowner(struct nfscllockowner *lp, int local)
{
struct nfscllock *lop, *nlop;
diff --git a/sys/fs/nfsclient/nfs_clsubs.c b/sys/fs/nfsclient/nfs_clsubs.c
index 214dfb7..f64cf2d 100644
--- a/sys/fs/nfsclient/nfs_clsubs.c
+++ b/sys/fs/nfsclient/nfs_clsubs.c
@@ -143,12 +143,12 @@ ncl_upgrade_vnlock(struct vnode *vp)
int old_lock;
ASSERT_VOP_LOCKED(vp, "ncl_upgrade_vnlock");
- old_lock = VOP_ISLOCKED(vp);
+ old_lock = NFSVOPISLOCKED(vp);
if (old_lock != LK_EXCLUSIVE) {
KASSERT(old_lock == LK_SHARED,
("ncl_upgrade_vnlock: wrong old_lock %d", old_lock));
/* Upgrade to exclusive lock, this might block */
- vn_lock(vp, LK_UPGRADE | LK_RETRY);
+ NFSVOPLOCK(vp, LK_UPGRADE | LK_RETRY);
}
return (old_lock);
}
@@ -159,7 +159,7 @@ ncl_downgrade_vnlock(struct vnode *vp, int old_lock)
if (old_lock != LK_EXCLUSIVE) {
KASSERT(old_lock == LK_SHARED, ("wrong old_lock %d", old_lock));
/* Downgrade from exclusive lock. */
- vn_lock(vp, LK_DOWNGRADE | LK_RETRY);
+ NFSVOPLOCK(vp, LK_DOWNGRADE | LK_RETRY);
}
}
diff --git a/sys/fs/nfsclient/nfs_clvfsops.c b/sys/fs/nfsclient/nfs_clvfsops.c
index d962a54..3339428 100644
--- a/sys/fs/nfsclient/nfs_clvfsops.c
+++ b/sys/fs/nfsclient/nfs_clvfsops.c
@@ -1344,7 +1344,7 @@ mountnfs(struct nfs_args *argp, struct mount *mp, struct sockaddr *nam,
/*
* Lose the lock but keep the ref.
*/
- VOP_UNLOCK(*vpp, 0);
+ NFSVOPUNLOCK(*vpp, 0);
return (0);
}
error = EIO;
@@ -1477,7 +1477,7 @@ loop:
VI_LOCK(vp);
MNT_IUNLOCK(mp);
/* XXX Racy bv_cnt check. */
- if (VOP_ISLOCKED(vp) || vp->v_bufobj.bo_dirty.bv_cnt == 0 ||
+ if (NFSVOPISLOCKED(vp) || vp->v_bufobj.bo_dirty.bv_cnt == 0 ||
waitfor == MNT_LAZY) {
VI_UNLOCK(vp);
MNT_ILOCK(mp);
@@ -1491,7 +1491,7 @@ loop:
error = VOP_FSYNC(vp, waitfor, td);
if (error)
allerror = error;
- VOP_UNLOCK(vp, 0);
+ NFSVOPUNLOCK(vp, 0);
vrele(vp);
MNT_ILOCK(mp);
diff --git a/sys/fs/nfsclient/nfs_clvnops.c b/sys/fs/nfsclient/nfs_clvnops.c
index 0a1d6a2..a69c76e 100644
--- a/sys/fs/nfsclient/nfs_clvnops.c
+++ b/sys/fs/nfsclient/nfs_clvnops.c
@@ -1209,13 +1209,13 @@ nfs_lookup(struct vop_lookup_args *ap)
}
if (flags & ISDOTDOT) {
- ltype = VOP_ISLOCKED(dvp);
+ ltype = NFSVOPISLOCKED(dvp);
error = vfs_busy(mp, MBF_NOWAIT);
if (error != 0) {
vfs_ref(mp);
- VOP_UNLOCK(dvp, 0);
+ NFSVOPUNLOCK(dvp, 0);
error = vfs_busy(mp, 0);
- vn_lock(dvp, ltype | LK_RETRY);
+ NFSVOPLOCK(dvp, ltype | LK_RETRY);
vfs_rel(mp);
if (error == 0 && (dvp->v_iflag & VI_DOOMED)) {
vfs_unbusy(mp);
@@ -1224,14 +1224,14 @@ nfs_lookup(struct vop_lookup_args *ap)
if (error != 0)
return (error);
}
- VOP_UNLOCK(dvp, 0);
+ NFSVOPUNLOCK(dvp, 0);
error = nfscl_nget(mp, dvp, nfhp, cnp, td, &np, NULL,
cnp->cn_lkflags);
if (error == 0)
newvp = NFSTOV(np);
vfs_unbusy(mp);
if (newvp != dvp)
- vn_lock(dvp, ltype | LK_RETRY);
+ NFSVOPLOCK(dvp, ltype | LK_RETRY);
if (dvp->v_iflag & VI_DOOMED) {
if (error == 0) {
if (newvp == dvp)
@@ -1764,7 +1764,7 @@ nfs_rename(struct vop_rename_args *ap)
error = 0;
goto out;
}
- if ((error = vn_lock(fvp, LK_EXCLUSIVE)) != 0)
+ if ((error = NFSVOPLOCK(fvp, LK_EXCLUSIVE)) != 0)
goto out;
/*
@@ -1781,7 +1781,7 @@ nfs_rename(struct vop_rename_args *ap)
* this condition can result in potential (silent) data loss.
*/
error = VOP_FSYNC(fvp, MNT_WAIT, fcnp->cn_thread);
- VOP_UNLOCK(fvp, 0);
+ NFSVOPUNLOCK(fvp, 0);
if (!error && tvp)
error = VOP_FSYNC(tvp, MNT_WAIT, tcnp->cn_thread);
if (error)
@@ -2943,9 +2943,9 @@ nfs_advlock(struct vop_advlock_args *ap)
cred = p->p_ucred;
else
cred = td->td_ucred;
- vn_lock(vp, LK_EXCLUSIVE | LK_RETRY);
+ NFSVOPLOCK(vp, LK_EXCLUSIVE | LK_RETRY);
if (vp->v_iflag & VI_DOOMED) {
- VOP_UNLOCK(vp, 0);
+ NFSVOPUNLOCK(vp, 0);
return (EBADF);
}
@@ -2968,27 +2968,27 @@ nfs_advlock(struct vop_advlock_args *ap)
ap->a_fl, 0, cred, td, ap->a_id, ap->a_flags);
if (ret == NFSERR_DENIED && (ap->a_flags & F_WAIT) &&
ap->a_op == F_SETLK) {
- VOP_UNLOCK(vp, 0);
+ NFSVOPUNLOCK(vp, 0);
error = nfs_catnap(PZERO | PCATCH, ret,
"ncladvl");
if (error)
return (EINTR);
- vn_lock(vp, LK_EXCLUSIVE | LK_RETRY);
+ NFSVOPLOCK(vp, LK_EXCLUSIVE | LK_RETRY);
if (vp->v_iflag & VI_DOOMED) {
- VOP_UNLOCK(vp, 0);
+ NFSVOPUNLOCK(vp, 0);
return (EBADF);
}
}
} while (ret == NFSERR_DENIED && (ap->a_flags & F_WAIT) &&
ap->a_op == F_SETLK);
if (ret == NFSERR_DENIED) {
- VOP_UNLOCK(vp, 0);
+ NFSVOPUNLOCK(vp, 0);
return (EAGAIN);
} else if (ret == EINVAL || ret == EBADF || ret == EINTR) {
- VOP_UNLOCK(vp, 0);
+ NFSVOPUNLOCK(vp, 0);
return (ret);
} else if (ret != 0) {
- VOP_UNLOCK(vp, 0);
+ NFSVOPUNLOCK(vp, 0);
return (EACCES);
}
@@ -3015,21 +3015,21 @@ nfs_advlock(struct vop_advlock_args *ap)
}
}
}
- VOP_UNLOCK(vp, 0);
+ NFSVOPUNLOCK(vp, 0);
return (0);
} else if (!NFS_ISV4(vp)) {
- error = vn_lock(vp, LK_SHARED);
+ error = NFSVOPLOCK(vp, LK_SHARED);
if (error)
return (error);
if ((VFSTONFS(vp->v_mount)->nm_flag & NFSMNT_NOLOCKD) != 0) {
size = VTONFS(vp)->n_size;
- VOP_UNLOCK(vp, 0);
+ NFSVOPUNLOCK(vp, 0);
error = lf_advlock(ap, &(vp->v_lockf), size);
} else {
if (nfs_advlock_p != NULL)
error = nfs_advlock_p(ap);
else {
- VOP_UNLOCK(vp, 0);
+ NFSVOPUNLOCK(vp, 0);
error = ENOLCK;
}
}
@@ -3049,15 +3049,15 @@ nfs_advlockasync(struct vop_advlockasync_args *ap)
if (NFS_ISV4(vp))
return (EOPNOTSUPP);
- error = vn_lock(vp, LK_SHARED);
+ error = NFSVOPLOCK(vp, LK_SHARED);
if (error)
return (error);
if ((VFSTONFS(vp->v_mount)->nm_flag & NFSMNT_NOLOCKD) != 0) {
size = VTONFS(vp)->n_size;
- VOP_UNLOCK(vp, 0);
+ NFSVOPUNLOCK(vp, 0);
error = lf_advlockasync(ap, &(vp->v_lockf), size);
} else {
- VOP_UNLOCK(vp, 0);
+ NFSVOPUNLOCK(vp, 0);
error = EOPNOTSUPP;
}
return (error);
diff --git a/sys/fs/nfsserver/nfs_nfsdcache.c b/sys/fs/nfsserver/nfs_nfsdcache.c
index fc513a3..50f92ad 100644
--- a/sys/fs/nfsserver/nfs_nfsdcache.c
+++ b/sys/fs/nfsserver/nfs_nfsdcache.c
@@ -308,6 +308,7 @@ nfsrvd_getcache(struct nfsrv_descript *nd, struct socket *so)
ret = nfsrc_gettcp(nd, newrp);
}
nfsrc_trimcache(nd->nd_sockref, so);
+ NFSEXITCODE2(0, nd);
return (ret);
}
@@ -373,7 +374,7 @@ loop:
}
nfsrc_unlock(rp);
free((caddr_t)newrp, M_NFSRVCACHE);
- return (ret);
+ goto out;
}
}
newnfsstats.srvcache_misses++;
@@ -394,7 +395,11 @@ loop:
TAILQ_INSERT_TAIL(&nfsrvudplru, newrp, rc_lru);
NFSUNLOCKCACHE();
nd->nd_rp = newrp;
- return (RC_DOIT);
+ ret = RC_DOIT;
+
+out:
+ NFSEXITCODE2(0, nd);
+ return (ret);
}
/*
@@ -436,8 +441,7 @@ nfsrvd_updatecache(struct nfsrv_descript *nd, struct socket *so)
M_COPYALL, M_WAIT);
rp->rc_timestamp = NFSD_MONOSEC + NFSRVCACHE_TCPTIMEOUT;
nfsrc_unlock(rp);
- nfsrc_trimcache(nd->nd_sockref, so);
- return (retrp);
+ goto out;
}
/*
@@ -492,7 +496,10 @@ nfsrvd_updatecache(struct nfsrv_descript *nd, struct socket *so)
nfsrc_freecache(rp);
NFSUNLOCKCACHE();
}
+
+out:
nfsrc_trimcache(nd->nd_sockref, so);
+ NFSEXITCODE2(0, nd);
return (retrp);
}
@@ -656,7 +663,7 @@ tryagain:
}
nfsrc_unlock(rp);
free((caddr_t)newrp, M_NFSRVCACHE);
- return (ret);
+ goto out;
}
newnfsstats.srvcache_misses++;
newnfsstats.srvcache_size++;
@@ -670,7 +677,11 @@ tryagain:
LIST_INSERT_HEAD(hp, newrp, rc_hash);
NFSUNLOCKCACHE();
nd->nd_rp = newrp;
- return (RC_DOIT);
+ ret = RC_DOIT;
+
+out:
+ NFSEXITCODE2(0, nd);
+ return (ret);
}
/*
diff --git a/sys/fs/nfsserver/nfs_nfsdkrpc.c b/sys/fs/nfsserver/nfs_nfsdkrpc.c
index 2484919..ae676f3 100644
--- a/sys/fs/nfsserver/nfs_nfsdkrpc.c
+++ b/sys/fs/nfsserver/nfs_nfsdkrpc.c
@@ -115,7 +115,7 @@ nfssvc_program(struct svc_req *rqst, SVCXPRT *xprt)
if (rqst->rq_proc > NFSV2PROC_STATFS) {
svcerr_noproc(rqst);
svc_freereq(rqst);
- return;
+ goto out;
}
nd.nd_procnum = newnfs_nfsv3_procid[rqst->rq_proc];
nd.nd_flag = ND_NFSV2;
@@ -123,7 +123,7 @@ nfssvc_program(struct svc_req *rqst, SVCXPRT *xprt)
if (rqst->rq_proc >= NFS_V3NPROCS) {
svcerr_noproc(rqst);
svc_freereq(rqst);
- return;
+ goto out;
}
nd.nd_procnum = rqst->rq_proc;
nd.nd_flag = ND_NFSV3;
@@ -132,7 +132,7 @@ nfssvc_program(struct svc_req *rqst, SVCXPRT *xprt)
rqst->rq_proc != NFSV4PROC_COMPOUND) {
svcerr_noproc(rqst);
svc_freereq(rqst);
- return;
+ goto out;
}
nd.nd_procnum = rqst->rq_proc;
nd.nd_flag = ND_NFSV4;
@@ -192,7 +192,7 @@ nfssvc_program(struct svc_req *rqst, SVCXPRT *xprt)
svcerr_weakauth(rqst);
svc_freereq(rqst);
m_freem(nd.nd_mrep);
- return;
+ goto out;
}
}
@@ -201,7 +201,7 @@ nfssvc_program(struct svc_req *rqst, SVCXPRT *xprt)
svcerr_weakauth(rqst);
svc_freereq(rqst);
m_freem(nd.nd_mrep);
- return;
+ goto out;
}
/* Set the flag based on credflavor */
@@ -215,7 +215,7 @@ nfssvc_program(struct svc_req *rqst, SVCXPRT *xprt)
svcerr_weakauth(rqst);
svc_freereq(rqst);
m_freem(nd.nd_mrep);
- return;
+ goto out;
}
#ifdef MAC
@@ -227,7 +227,7 @@ nfssvc_program(struct svc_req *rqst, SVCXPRT *xprt)
svcerr_weakauth(rqst);
svc_freereq(rqst);
m_freem(nd.nd_mrep);
- return;
+ goto out;
}
}
@@ -248,13 +248,13 @@ nfssvc_program(struct svc_req *rqst, SVCXPRT *xprt)
if (nd.nd_mreq != NULL)
m_freem(nd.nd_mreq);
svc_freereq(rqst);
- return;
+ goto out;
}
if (nd.nd_mreq == NULL) {
svcerr_decode(rqst);
svc_freereq(rqst);
- return;
+ goto out;
}
if (nd.nd_repstat & NFSERR_AUTHERR) {
@@ -267,6 +267,9 @@ nfssvc_program(struct svc_req *rqst, SVCXPRT *xprt)
if (rp != NULL)
nfsrvd_sentcache(rp, xprt->xp_socket, 0);
svc_freereq(rqst);
+
+out:
+ NFSEXITCODE(0);
}
/*
@@ -329,6 +332,8 @@ nfs_proc(struct nfsrv_descript *nd, u_int32_t xid, struct socket *so,
cacherep = RC_REPLY;
*rpp = nfsrvd_updatecache(nd, so);
}
+
+ NFSEXITCODE2(0, nd);
return (cacherep);
}
@@ -340,7 +345,7 @@ nfsrvd_addsock(struct file *fp)
{
int siz;
struct socket *so;
- int error;
+ int error = 0;
SVCXPRT *xprt;
static u_int64_t sockref = 0;
@@ -348,9 +353,8 @@ nfsrvd_addsock(struct file *fp)
siz = sb_max_adj;
error = soreserve(so, siz, siz);
- if (error) {
- return (error);
- }
+ if (error)
+ goto out;
/*
* Steal the socket from userland so that it doesn't close
@@ -376,7 +380,9 @@ nfsrvd_addsock(struct file *fp)
SVC_RELEASE(xprt);
}
- return (0);
+out:
+ NFSEXITCODE(error);
+ return (error);
}
/*
@@ -387,13 +393,13 @@ int
nfsrvd_nfsd(struct thread *td, struct nfsd_nfsd_args *args)
{
char principal[MAXHOSTNAMELEN + 5];
- int error;
+ int error = 0;
bool_t ret2, ret3, ret4;
error = copyinstr(args->principal, principal, sizeof (principal),
NULL);
if (error)
- return (error);
+ goto out;
/*
* Only the first nfsd actually does any work. The RPC code
@@ -438,7 +444,9 @@ nfsrvd_nfsd(struct thread *td, struct nfsd_nfsd_args *args)
}
NFSD_UNLOCK();
- return (0);
+out:
+ NFSEXITCODE(error);
+ return (error);
}
/*
diff --git a/sys/fs/nfsserver/nfs_nfsdport.c b/sys/fs/nfsserver/nfs_nfsdport.c
index 5b96729..56c563a 100644
--- a/sys/fs/nfsserver/nfs_nfsdport.c
+++ b/sys/fs/nfsserver/nfs_nfsdport.c
@@ -116,14 +116,16 @@ nfsvno_getattr(struct vnode *vp, struct nfsvattr *nvap, struct ucred *cred,
* locked by this thread or not locked by this thread.
* As such, shared lock it, if not exclusively locked.
*/
- if (VOP_ISLOCKED(vp) != LK_EXCLUSIVE) {
+ if (NFSVOPISLOCKED(vp) != LK_EXCLUSIVE) {
lockedit = 1;
- vn_lock(vp, LK_SHARED | LK_RETRY);
+ NFSVOPLOCK(vp, LK_SHARED | LK_RETRY);
}
}
error = VOP_GETATTR(vp, &nvap->na_vattr, cred);
if (lockedit != 0)
- VOP_UNLOCK(vp, 0);
+ NFSVOPUNLOCK(vp, 0);
+
+ NFSEXITCODE(error);
return (error);
}
@@ -138,6 +140,8 @@ nfsvno_getfh(struct vnode *vp, fhandle_t *fhp, struct thread *p)
NFSBZERO((caddr_t)fhp, sizeof(fhandle_t));
fhp->fh_fsid = vp->v_mount->mnt_stat.f_fsid;
error = VOP_VPTOFH(vp, &fhp->fh_fid);
+
+ NFSEXITCODE(error);
return (error);
}
@@ -160,8 +164,10 @@ nfsvno_accchk(struct vnode *vp, accmode_t accmode, struct ucred *cred,
int error = 0, getret = 0;
if (vpislocked == 0) {
- if (vn_lock(vp, LK_SHARED) != 0)
- return (EPERM);
+ if (NFSVOPLOCK(vp, LK_SHARED) != 0) {
+ error = EPERM;
+ goto out;
+ }
}
if (accmode & VWRITE) {
/* Just vn_writechk() changed to check rdonly */
@@ -191,8 +197,8 @@ nfsvno_accchk(struct vnode *vp, accmode_t accmode, struct ucred *cred,
}
if (error != 0) {
if (vpislocked == 0)
- VOP_UNLOCK(vp, 0);
- return (error);
+ NFSVOPUNLOCK(vp, 0);
+ goto out;
}
/*
@@ -231,7 +237,10 @@ nfsvno_accchk(struct vnode *vp, accmode_t accmode, struct ucred *cred,
}
}
if (vpislocked == 0)
- VOP_UNLOCK(vp, 0);
+ NFSVOPUNLOCK(vp, 0);
+
+out:
+ NFSEXITCODE(error);
return (error);
}
@@ -245,6 +254,7 @@ nfsvno_setattr(struct vnode *vp, struct nfsvattr *nvap, struct ucred *cred,
int error;
error = VOP_SETATTR(vp, &nvap->na_vattr, cred);
+ NFSEXITCODE(error);
return (error);
}
@@ -279,10 +289,11 @@ nfsvno_namei(struct nfsrv_descript *nd, struct nameidata *ndp,
else
vrele(dp);
nfsvno_relpathbuf(ndp);
- return (ENOTDIR);
+ error = ENOTDIR;
+ goto out1;
}
if (islocked)
- NFSVOPUNLOCK(dp, 0, p);
+ NFSVOPUNLOCK(dp, 0);
VREF(dp);
*retdirp = dp;
if (NFSVNO_EXRDONLY(exp))
@@ -351,7 +362,7 @@ nfsvno_namei(struct nfsrv_descript *nd, struct nameidata *ndp,
if ((cnp->cn_flags & (SAVENAME | SAVESTART)) == 0)
nfsvno_relpathbuf(ndp);
if (ndp->ni_vp && !lockleaf)
- NFSVOPUNLOCK(ndp->ni_vp, 0, p);
+ NFSVOPUNLOCK(ndp->ni_vp, 0);
break;
}
@@ -359,7 +370,7 @@ nfsvno_namei(struct nfsrv_descript *nd, struct nameidata *ndp,
* Validate symlink
*/
if ((cnp->cn_flags & LOCKPARENT) && ndp->ni_pathlen == 1)
- NFSVOPUNLOCK(ndp->ni_dvp, 0, p);
+ NFSVOPUNLOCK(ndp->ni_dvp, 0);
if (!(nd->nd_flag & ND_PUBLOOKUP)) {
error = EINVAL;
goto badlink2;
@@ -444,6 +455,9 @@ out:
} else if ((ndp->ni_cnd.cn_flags & (WANTPARENT|LOCKPARENT)) == 0) {
ndp->ni_dvp = NULL;
}
+
+out1:
+ NFSEXITCODE2(error, nd);
return (error);
}
@@ -487,7 +501,7 @@ nfsvno_readlink(struct vnode *vp, struct ucred *cred, struct thread *p,
struct iovec *ivp = iv;
struct uio io, *uiop = &io;
struct mbuf *mp, *mp2 = NULL, *mp3 = NULL;
- int i, len, tlen, error;
+ int i, len, tlen, error = 0;
len = 0;
i = 0;
@@ -523,7 +537,7 @@ nfsvno_readlink(struct vnode *vp, struct ucred *cred, struct thread *p,
if (error) {
m_freem(mp3);
*lenp = 0;
- return (error);
+ goto out;
}
if (uiop->uio_resid > 0) {
len -= uiop->uio_resid;
@@ -533,7 +547,10 @@ nfsvno_readlink(struct vnode *vp, struct ucred *cred, struct thread *p,
*lenp = len;
*mpp = mp3;
*mpendp = mp;
- return (0);
+
+out:
+ NFSEXITCODE(error);
+ return (error);
}
/*
@@ -650,7 +667,7 @@ nfsvno_read(struct vnode *vp, off_t off, int cnt, struct ucred *cred,
if (error) {
m_freem(m3);
*mpp = NULL;
- return (error);
+ goto out;
}
tlen = len - uiop->uio_resid;
cnt = cnt < tlen ? cnt : tlen;
@@ -662,7 +679,10 @@ nfsvno_read(struct vnode *vp, off_t off, int cnt, struct ucred *cred,
nfsrv_adj(m3, len - tlen, tlen - cnt);
*mpp = m3;
*mpendp = m2;
- return (0);
+
+out:
+ NFSEXITCODE(error);
+ return (error);
}
/*
@@ -712,6 +732,8 @@ nfsvno_write(struct vnode *vp, off_t off, int retlen, int cnt, int stable,
uiop->uio_offset = off;
error = VOP_WRITE(vp, uiop, ioflags, cred);
FREE((caddr_t)iv, M_TEMP);
+
+ NFSEXITCODE(error);
return (error);
}
@@ -758,7 +780,7 @@ nfsvno_createsub(struct nfsrv_descript *nd, struct nameidata *ndp,
vrele(ndp->ni_startdir);
nfsvno_relpathbuf(ndp);
vput(ndp->ni_dvp);
- return (error);
+ goto out;
}
nvap->na_rdev = rdev;
error = VOP_MKNOD(ndp->ni_dvp, &ndp->ni_vp,
@@ -767,12 +789,13 @@ nfsvno_createsub(struct nfsrv_descript *nd, struct nameidata *ndp,
nfsvno_relpathbuf(ndp);
vrele(ndp->ni_startdir);
if (error)
- return (error);
+ goto out;
} else {
vrele(ndp->ni_startdir);
nfsvno_relpathbuf(ndp);
vput(ndp->ni_dvp);
- return (ENXIO);
+ error = ENXIO;
+ goto out;
}
*vpp = ndp->ni_vp;
} else {
@@ -804,6 +827,9 @@ nfsvno_createsub(struct nfsrv_descript *nd, struct nameidata *ndp,
if (error)
vput(*vpp);
}
+
+out:
+ NFSEXITCODE(error);
return (error);
}
@@ -826,13 +852,15 @@ nfsvno_mknod(struct nameidata *ndp, struct nfsvattr *nvap, struct ucred *cred,
nfsvno_relpathbuf(ndp);
vput(ndp->ni_dvp);
vrele(ndp->ni_vp);
- return (EEXIST);
+ error = EEXIST;
+ goto out;
}
if (vtyp != VCHR && vtyp != VBLK && vtyp != VSOCK && vtyp != VFIFO) {
vrele(ndp->ni_startdir);
nfsvno_relpathbuf(ndp);
vput(ndp->ni_dvp);
- return (NFSERR_BADTYPE);
+ error = NFSERR_BADTYPE;
+ goto out;
}
if (vtyp == VSOCK) {
vrele(ndp->ni_startdir);
@@ -846,7 +874,7 @@ nfsvno_mknod(struct nameidata *ndp, struct nfsvattr *nvap, struct ucred *cred,
vrele(ndp->ni_startdir);
nfsvno_relpathbuf(ndp);
vput(ndp->ni_dvp);
- return (error);
+ goto out;
}
error = VOP_MKNOD(ndp->ni_dvp, &ndp->ni_vp,
&ndp->ni_cnd, &nvap->na_vattr);
@@ -858,6 +886,9 @@ nfsvno_mknod(struct nameidata *ndp, struct nfsvattr *nvap, struct ucred *cred,
* see any reason to do the lookup.
*/
}
+
+out:
+ NFSEXITCODE(error);
return (error);
}
@@ -877,12 +908,16 @@ nfsvno_mkdir(struct nameidata *ndp, struct nfsvattr *nvap, uid_t saved_uid,
vput(ndp->ni_dvp);
vrele(ndp->ni_vp);
nfsvno_relpathbuf(ndp);
- return (EEXIST);
+ error = EEXIST;
+ goto out;
}
error = VOP_MKDIR(ndp->ni_dvp, &ndp->ni_vp, &ndp->ni_cnd,
&nvap->na_vattr);
vput(ndp->ni_dvp);
nfsvno_relpathbuf(ndp);
+
+out:
+ NFSEXITCODE(error);
return (error);
}
@@ -904,7 +939,8 @@ nfsvno_symlink(struct nameidata *ndp, struct nfsvattr *nvap, char *pathcp,
else
vput(ndp->ni_dvp);
vrele(ndp->ni_vp);
- return (EEXIST);
+ error = EEXIST;
+ goto out;
}
error = VOP_SYMLINK(ndp->ni_dvp, &ndp->ni_vp, &ndp->ni_cnd,
@@ -920,6 +956,9 @@ nfsvno_symlink(struct nameidata *ndp, struct nfsvattr *nvap, char *pathcp,
*/
if (!not_v2 && !error)
vput(ndp->ni_vp);
+
+out:
+ NFSEXITCODE(error);
return (error);
}
@@ -960,10 +999,12 @@ nfsvno_getsymlink(struct nfsrv_descript *nd, struct nfsvattr *nvap,
}
*pathcpp = pathcp;
*lenp = len;
+ NFSEXITCODE2(0, nd);
return (0);
nfsmout:
if (pathcp)
free(pathcp, M_TEMP);
+ NFSEXITCODE2(error, nd);
return (error);
}
@@ -989,6 +1030,7 @@ nfsvno_removesub(struct nameidata *ndp, int is_v4, struct ucred *cred,
else
vput(ndp->ni_dvp);
vput(vp);
+ NFSEXITCODE(error);
return (error);
}
@@ -1027,6 +1069,7 @@ out:
else
vput(ndp->ni_dvp);
vput(vp);
+ NFSEXITCODE(error);
return (error);
}
@@ -1097,9 +1140,9 @@ nfsvno_rename(struct nameidata *fromndp, struct nameidata *tondp,
goto out;
}
if (ndflag & ND_NFSV4) {
- if (vn_lock(fvp, LK_EXCLUSIVE) == 0) {
+ if (NFSVOPLOCK(fvp, LK_EXCLUSIVE) == 0) {
error = nfsrv_checkremove(fvp, 0, p);
- VOP_UNLOCK(fvp, 0);
+ NFSVOPUNLOCK(fvp, 0);
} else
error = EPERM;
if (tvp && !error)
@@ -1136,6 +1179,7 @@ out:
out1:
vrele(fromndp->ni_startdir);
nfsvno_relpathbuf(fromndp);
+ NFSEXITCODE(error);
return (error);
}
@@ -1158,7 +1202,7 @@ nfsvno_link(struct nameidata *ndp, struct vnode *vp, struct ucred *cred,
error = EXDEV;
}
if (!error) {
- vn_lock(vp, LK_EXCLUSIVE | LK_RETRY);
+ NFSVOPLOCK(vp, LK_EXCLUSIVE | LK_RETRY);
if ((vp->v_iflag & VI_DOOMED) == 0)
error = VOP_LINK(ndp->ni_dvp, vp, &ndp->ni_cnd);
else
@@ -1167,7 +1211,7 @@ nfsvno_link(struct nameidata *ndp, struct vnode *vp, struct ucred *cred,
vrele(ndp->ni_dvp);
else
vput(ndp->ni_dvp);
- VOP_UNLOCK(vp, 0);
+ NFSVOPUNLOCK(vp, 0);
} else {
if (ndp->ni_dvp == ndp->ni_vp)
vrele(ndp->ni_dvp);
@@ -1177,6 +1221,7 @@ nfsvno_link(struct nameidata *ndp, struct vnode *vp, struct ucred *cred,
vrele(ndp->ni_vp);
}
nfsvno_relpathbuf(ndp);
+ NFSEXITCODE(error);
return (error);
}
@@ -1271,6 +1316,7 @@ nfsvno_fsync(struct vnode *vp, u_int64_t off, int cnt, struct ucred *cred,
}
BO_UNLOCK(bo);
}
+ NFSEXITCODE(error);
return (error);
}
@@ -1296,6 +1342,7 @@ nfsvno_statfs(struct vnode *vp, struct statfs *sf)
if (sf->f_ffree < 0)
sf->f_ffree = 0;
}
+ NFSEXITCODE(error);
return (error);
}
@@ -1386,6 +1433,8 @@ nfsvno_open(struct nfsrv_descript *nd, struct nameidata *ndp,
}
}
*vpp = vp;
+
+ NFSEXITCODE2(0, nd);
}
/*
@@ -1419,6 +1468,7 @@ nfsvno_fillattr(struct nfsrv_descript *nd, struct mount *mp, struct vnode *vp,
error = nfsv4_fillattr(nd, mp, vp, NULL, &nvap->na_vattr, fhp, rderror,
attrbitp, cred, p, isdgram, reterr, supports_nfsv4acls, at_root,
mounted_on_fileno);
+ NFSEXITCODE2(0, nd);
return (error);
}
@@ -1465,7 +1515,7 @@ nfsrvd_readdir(struct nfsrv_descript *nd, int isdgram,
if (nd->nd_repstat) {
nfsrv_postopattr(nd, getret, &at);
- return (0);
+ goto out;
}
if (nd->nd_flag & ND_NFSV2) {
NFSM_DISSECT(tl, u_int32_t *, 2 * NFSX_UNSIGNED);
@@ -1512,7 +1562,7 @@ nfsrvd_readdir(struct nfsrv_descript *nd, int isdgram,
vput(vp);
if (nd->nd_flag & ND_NFSV3)
nfsrv_postopattr(nd, getret, &at);
- return (0);
+ goto out;
}
not_zfs = strcmp(vp->v_mount->mnt_vfc->vfc_name, "zfs");
MALLOC(rbuf, caddr_t, siz, M_TEMP, M_WAITOK);
@@ -1556,7 +1606,7 @@ again:
free((caddr_t)cookies, M_TEMP);
if (nd->nd_flag & ND_NFSV3)
nfsrv_postopattr(nd, getret, &at);
- return (0);
+ goto out;
}
/*
* If nothing read, return eof
@@ -1576,7 +1626,7 @@ again:
*tl = newnfs_true;
FREE((caddr_t)rbuf, M_TEMP);
FREE((caddr_t)cookies, M_TEMP);
- return (0);
+ goto out;
}
/*
@@ -1677,9 +1727,13 @@ again:
*tl = newnfs_false;
FREE((caddr_t)rbuf, M_TEMP);
FREE((caddr_t)cookies, M_TEMP);
+
+out:
+ NFSEXITCODE2(0, nd);
return (0);
nfsmout:
vput(vp);
+ NFSEXITCODE2(error, nd);
return (error);
}
@@ -1714,7 +1768,7 @@ nfsrvd_readdirplus(struct nfsrv_descript *nd, int isdgram,
if (nd->nd_repstat) {
nfsrv_postopattr(nd, getret, &at);
- return (0);
+ goto out;
}
NFSM_DISSECT(tl, u_int32_t *, 6 * NFSX_UNSIGNED);
off = fxdr_hyper(tl);
@@ -1786,7 +1840,7 @@ nfsrvd_readdirplus(struct nfsrv_descript *nd, int isdgram,
vput(vp);
if (nd->nd_flag & ND_NFSV3)
nfsrv_postopattr(nd, getret, &at);
- return (0);
+ goto out;
}
not_zfs = strcmp(vp->v_mount->mnt_vfc->vfc_name, "zfs");
@@ -1826,7 +1880,7 @@ again:
free((caddr_t)rbuf, M_TEMP);
if (nd->nd_flag & ND_NFSV3)
nfsrv_postopattr(nd, getret, &at);
- return (0);
+ goto out;
}
/*
* If nothing read, return eof
@@ -1843,7 +1897,7 @@ again:
*tl = newnfs_true;
free((caddr_t)cookies, M_TEMP);
free((caddr_t)rbuf, M_TEMP);
- return (0);
+ goto out;
}
/*
@@ -1887,7 +1941,7 @@ again:
*/
mp = vp->v_mount;
vfs_ref(mp);
- VOP_UNLOCK(vp, 0);
+ NFSVOPUNLOCK(vp, 0);
nd->nd_repstat = vfs_busy(mp, 0);
vfs_rel(mp);
if (nd->nd_repstat != 0) {
@@ -1896,7 +1950,7 @@ again:
free(rbuf, M_TEMP);
if (nd->nd_flag & ND_NFSV3)
nfsrv_postopattr(nd, getret, &at);
- return (0);
+ goto out;
}
/*
@@ -1986,7 +2040,7 @@ again:
dp->d_name[1] == '.')
cn.cn_flags |=
ISDOTDOT;
- if (vn_lock(vp, LK_SHARED)
+ if (NFSVOPLOCK(vp, LK_SHARED)
!= 0) {
nd->nd_repstat = EPERM;
break;
@@ -2001,7 +2055,7 @@ again:
r = VOP_LOOKUP(vp, &nvp,
&cn);
if (vp != nvp)
- VOP_UNLOCK(vp,
+ NFSVOPUNLOCK(vp,
0);
}
}
@@ -2080,7 +2134,7 @@ again:
if (nvp != NULL) {
supports_nfsv4acls =
nfs_supportsnfsv4acls(nvp);
- VOP_UNLOCK(nvp, 0);
+ NFSVOPUNLOCK(nvp, 0);
} else
supports_nfsv4acls = 0;
if (refp != NULL) {
@@ -2148,9 +2202,13 @@ again:
}
FREE((caddr_t)cookies, M_TEMP);
FREE((caddr_t)rbuf, M_TEMP);
+
+out:
+ NFSEXITCODE2(0, nd);
return (0);
nfsmout:
vput(vp);
+ NFSEXITCODE2(error, nd);
return (error);
}
@@ -2249,6 +2307,7 @@ nfsrv_sattr(struct nfsrv_descript *nd, struct nfsvattr *nvap,
error = nfsv4_sattr(nd, nvap, attrbitp, aclp, p);
};
nfsmout:
+ NFSEXITCODE2(error, nd);
return (error);
}
@@ -2272,7 +2331,7 @@ nfsv4_sattr(struct nfsrv_descript *nd, struct nfsvattr *nvap,
error = nfsrv_getattrbits(nd, attrbitp, NULL, &retnotsup);
if (error)
- return (error);
+ goto nfsmout;
NFSM_DISSECT(tl, u_int32_t *, NFSX_UNSIGNED);
attrsize = fxdr_unsigned(int, *tl);
@@ -2304,7 +2363,7 @@ nfsv4_sattr(struct nfsrv_descript *nd, struct nfsvattr *nvap,
if (error)
goto nfsmout;
if (aceerr && !nd->nd_repstat)
- nd->nd_repstat = NFSERR_ATTRNOTSUPP;
+ nd->nd_repstat = aceerr;
attrsum += aclsize;
break;
case NFSATTRBIT_ARCHIVE:
@@ -2337,8 +2396,10 @@ nfsv4_sattr(struct nfsrv_descript *nd, struct nfsvattr *nvap,
case NFSATTRBIT_OWNER:
NFSM_DISSECT(tl, u_int32_t *, NFSX_UNSIGNED);
j = fxdr_unsigned(int, *tl);
- if (j < 0)
- return (NFSERR_BADXDR);
+ if (j < 0) {
+ error = NFSERR_BADXDR;
+ goto nfsmout;
+ }
if (j > NFSV4_SMALLSTR)
cp = malloc(j + 1, M_NFSSTRING, M_WAITOK);
else
@@ -2347,7 +2408,7 @@ nfsv4_sattr(struct nfsrv_descript *nd, struct nfsvattr *nvap,
if (error) {
if (j > NFSV4_SMALLSTR)
free(cp, M_NFSSTRING);
- return (error);
+ goto nfsmout;
}
if (!nd->nd_repstat) {
nd->nd_repstat = nfsv4_strtouid(cp,j,&uid,p);
@@ -2361,8 +2422,10 @@ nfsv4_sattr(struct nfsrv_descript *nd, struct nfsvattr *nvap,
case NFSATTRBIT_OWNERGROUP:
NFSM_DISSECT(tl, u_int32_t *, NFSX_UNSIGNED);
j = fxdr_unsigned(int, *tl);
- if (j < 0)
- return (NFSERR_BADXDR);
+ if (j < 0) {
+ error = NFSERR_BADXDR;
+ goto nfsmout;
+ }
if (j > NFSV4_SMALLSTR)
cp = malloc(j + 1, M_NFSSTRING, M_WAITOK);
else
@@ -2371,7 +2434,7 @@ nfsv4_sattr(struct nfsrv_descript *nd, struct nfsvattr *nvap,
if (error) {
if (j > NFSV4_SMALLSTR)
free(cp, M_NFSSTRING);
- return (error);
+ goto nfsmout;
}
if (!nd->nd_repstat) {
nd->nd_repstat = nfsv4_strtogid(cp,j,&gid,p);
@@ -2453,6 +2516,7 @@ nfsv4_sattr(struct nfsrv_descript *nd, struct nfsvattr *nvap,
error = nfsm_advance(nd, attrsize - attrsum, -1);
}
nfsmout:
+ NFSEXITCODE2(error, nd);
return (error);
}
@@ -2484,14 +2548,16 @@ nfsd_excred(struct nfsrv_descript *nd, struct nfsexstuff *exp,
error = NFSERR_WRONGSEC;
else
error = (NFSERR_AUTHERR | AUTH_TOOWEAK);
- return (error);
+ goto out;
}
/*
* Check to see if the file system is exported V4 only.
*/
- if (NFSVNO_EXV4ONLY(exp) && !(nd->nd_flag & ND_NFSV4))
- return (NFSERR_PROGNOTV4);
+ if (NFSVNO_EXV4ONLY(exp) && !(nd->nd_flag & ND_NFSV4)) {
+ error = NFSERR_PROGNOTV4;
+ goto out;
+ }
/*
* Now, map the user credentials.
@@ -2508,7 +2574,10 @@ nfsd_excred(struct nfsrv_descript *nd, struct nfsexstuff *exp,
crsetgroups(nd->nd_cred, credanon->cr_ngroups,
credanon->cr_groups);
}
- return (0);
+
+out:
+ NFSEXITCODE2(error, nd);
+ return (error);
}
/*
@@ -2533,6 +2602,7 @@ nfsvno_checkexp(struct mount *mp, struct sockaddr *nam, struct nfsexstuff *exp,
for (i = 0; i < exp->nes_numsecflavor; i++)
exp->nes_secflavors[i] = secflavors[i];
}
+ NFSEXITCODE(error);
return (error);
}
@@ -2578,50 +2648,9 @@ nfsvno_fhtovp(struct mount *mp, fhandle_t *fhp, struct sockaddr *nam,
* but this will have to do until VFS_FHTOVP() has a lock
* type argument like VFS_VGET().
*/
- vn_lock(*vpp, LK_DOWNGRADE | LK_RETRY);
- return (error);
-}
-
-/*
- * Do the pathconf vnode op.
- */
-int
-nfsvno_pathconf(struct vnode *vp, int flag, register_t *retf,
- struct ucred *cred, struct thread *p)
-{
- int error;
+ NFSVOPLOCK(*vpp, LK_DOWNGRADE | LK_RETRY);
- error = VOP_PATHCONF(vp, flag, retf);
- if (error == EOPNOTSUPP || error == EINVAL) {
- /*
- * Some file systems return EINVAL for name arguments not
- * supported and some return EOPNOTSUPP for this case.
- * So the NFSv3 Pathconf RPC doesn't fail for these cases,
- * just fake them.
- */
- switch (flag) {
- case _PC_LINK_MAX:
- *retf = LINK_MAX;
- break;
- case _PC_NAME_MAX:
- *retf = NAME_MAX;
- break;
- case _PC_CHOWN_RESTRICTED:
- *retf = 1;
- break;
- case _PC_NO_TRUNC:
- *retf = 1;
- break;
- default:
- /*
- * Only happens if a _PC_xxx is added to the server,
- * but this isn't updated.
- */
- *retf = 0;
- printf("nfsrvd pathconf flag=%d not supp\n", flag);
- };
- error = 0;
- }
+ NFSEXITCODE(error);
return (error);
}
@@ -2653,7 +2682,7 @@ nfsd_fhtovp(struct nfsrv_descript *nd, struct nfsrvfh *nfp, int lktype,
if (mp == NULL) {
*vpp = NULL;
nd->nd_repstat = ESTALE;
- return;
+ goto out;
}
if (startwrite)
@@ -2723,6 +2752,9 @@ nfsd_fhtovp(struct nfsrv_descript *nd, struct nfsrvfh *nfp, int lktype,
if (mpp != NULL)
*mpp = NULL;
}
+
+out:
+ NFSEXITCODE2(0, nd);
}
/*
@@ -2733,13 +2765,19 @@ fp_getfvp(struct thread *p, int fd, struct file **fpp, struct vnode **vpp)
{
struct filedesc *fdp;
struct file *fp;
+ int error = 0;
fdp = p->td_proc->p_fd;
if (fd >= fdp->fd_nfiles ||
- (fp = fdp->fd_ofiles[fd]) == NULL)
- return (EBADF);
+ (fp = fdp->fd_ofiles[fd]) == NULL) {
+ error = EBADF;
+ goto out;
+ }
*fpp = fp;
- return (0);
+
+out:
+ NFSEXITCODE(error);
+ return (error);
}
/*
@@ -2751,7 +2789,7 @@ int
nfsrv_v4rootexport(void *argp, struct ucred *cred, struct thread *p)
{
struct nfsex_args *nfsexargp = (struct nfsex_args *)argp;
- int error;
+ int error = 0;
struct nameidata nd;
fhandle_t fh;
@@ -2759,15 +2797,17 @@ nfsrv_v4rootexport(void *argp, struct ucred *cred, struct thread *p)
if ((nfsexargp->export.ex_flags & MNT_DELEXPORT) != 0)
nfs_rootfhset = 0;
else if (error == 0) {
- if (nfsexargp->fspec == NULL)
- return (EPERM);
+ if (nfsexargp->fspec == NULL) {
+ error = EPERM;
+ goto out;
+ }
/*
* If fspec != NULL, this is the v4root path.
*/
NDINIT(&nd, LOOKUP, FOLLOW | MPSAFE, UIO_USERSPACE,
nfsexargp->fspec, p);
if ((error = namei(&nd)) != 0)
- return (error);
+ goto out;
error = nfsvno_getfh(nd.ni_vp, &fh, p);
vrele(nd.ni_vp);
if (!error) {
@@ -2778,6 +2818,9 @@ nfsrv_v4rootexport(void *argp, struct ucred *cred, struct thread *p)
nfs_rootfhset = 1;
}
}
+
+out:
+ NFSEXITCODE(error);
return (error);
}
@@ -2790,23 +2833,29 @@ nfsrv_getsocksndseq(struct socket *so, tcp_seq *maxp, tcp_seq *unap)
{
struct inpcb *inp;
struct tcpcb *tp;
+ int error = 0;
inp = sotoinpcb(so);
KASSERT(inp != NULL, ("nfsrv_getsocksndseq: inp == NULL"));
INP_RLOCK(inp);
if (inp->inp_flags & (INP_TIMEWAIT | INP_DROPPED)) {
INP_RUNLOCK(inp);
- return (EPIPE);
+ error = EPIPE;
+ goto out;
}
tp = intotcpcb(inp);
if (tp->t_state != TCPS_ESTABLISHED) {
INP_RUNLOCK(inp);
- return (EPIPE);
+ error = EPIPE;
+ goto out;
}
*maxp = tp->snd_max;
*unap = tp->snd_una;
INP_RUNLOCK(inp);
- return (0);
+
+out:
+ NFSEXITCODE(error);
+ return (error);
}
/*
@@ -2878,16 +2927,18 @@ int
nfsvno_advlock(struct vnode *vp, int ftype, u_int64_t first,
u_int64_t end, struct thread *td)
{
- int error;
+ int error = 0;
struct flock fl;
u_int64_t tlen;
if (nfsrv_dolocallocks == 0)
- return (0);
+ goto out;
/* Check for VI_DOOMED here, so that VOP_ADVLOCK() isn't performed. */
- if ((vp->v_iflag & VI_DOOMED) != 0)
- return (EPERM);
+ if ((vp->v_iflag & VI_DOOMED) != 0) {
+ error = EPERM;
+ goto out;
+ }
fl.l_whence = SEEK_SET;
fl.l_type = ftype;
@@ -2911,14 +2962,17 @@ nfsvno_advlock(struct vnode *vp, int ftype, u_int64_t first,
fl.l_pid = (pid_t)0;
fl.l_sysid = (int)nfsv4_sysid;
- NFSVOPUNLOCK(vp, 0, td);
+ NFSVOPUNLOCK(vp, 0);
if (ftype == F_UNLCK)
error = VOP_ADVLOCK(vp, (caddr_t)td->td_proc, F_UNLCK, &fl,
(F_POSIX | F_REMOTE));
else
error = VOP_ADVLOCK(vp, (caddr_t)td->td_proc, F_SETLK, &fl,
(F_POSIX | F_REMOTE));
- NFSVOPLOCK(vp, LK_EXCLUSIVE | LK_RETRY, td);
+ NFSVOPLOCK(vp, LK_EXCLUSIVE | LK_RETRY);
+
+out:
+ NFSEXITCODE(error);
return (error);
}
@@ -2929,12 +2983,14 @@ int
nfsvno_v4rootexport(struct nfsrv_descript *nd)
{
struct ucred *credanon;
- int exflags, error, numsecflavor, *secflavors, i;
+ int exflags, error = 0, numsecflavor, *secflavors, i;
error = vfs_stdcheckexp(&nfsv4root_mnt, nd->nd_nam, &exflags,
&credanon, &numsecflavor, &secflavors);
- if (error)
- return (NFSERR_PROGUNAVAIL);
+ if (error) {
+ error = NFSERR_PROGUNAVAIL;
+ goto out;
+ }
if (credanon != NULL)
crfree(credanon);
for (i = 0; i < numsecflavor; i++) {
@@ -2947,7 +3003,10 @@ nfsvno_v4rootexport(struct nfsrv_descript *nd)
else if (secflavors[i] == RPCSEC_GSS_KRB5P)
nd->nd_flag |= ND_EXGSSPRIVACY;
}
- return (0);
+
+out:
+ NFSEXITCODE(error);
+ return (error);
}
/*
@@ -2967,27 +3026,32 @@ nfssvc_nfsd(struct thread *td, struct nfssvc_args *uap)
if (uap->flag & NFSSVC_NFSDADDSOCK) {
error = copyin(uap->argp, (caddr_t)&sockarg, sizeof (sockarg));
if (error)
- return (error);
- if ((error = fget(td, sockarg.sock, &fp)) != 0) {
- return (error);
- }
+ goto out;
+ if ((error = fget(td, sockarg.sock, &fp)) != 0)
+ goto out;
if (fp->f_type != DTYPE_SOCKET) {
fdrop(fp, td);
- return (EPERM);
+ error = EPERM;
+ goto out;
}
error = nfsrvd_addsock(fp);
fdrop(fp, td);
} else if (uap->flag & NFSSVC_NFSDNFSD) {
- if (uap->argp == NULL)
- return (EINVAL);
+ if (uap->argp == NULL) {
+ error = EINVAL;
+ goto out;
+ }
error = copyin(uap->argp, (caddr_t)&nfsdarg,
sizeof (nfsdarg));
if (error)
- return (error);
+ goto out;
error = nfsrvd_nfsd(td, &nfsdarg);
} else {
error = nfssvc_srvcall(td, uap, td->td_ucred);
}
+
+out:
+ NFSEXITCODE(error);
return (error);
}
@@ -3085,6 +3149,8 @@ nfssvc_srvcall(struct thread *p, struct nfssvc_args *uap, struct ucred *cred)
nfsd_master_proc = procp;
PROC_UNLOCK(procp);
}
+
+ NFSEXITCODE(error);
return (error);
}
@@ -3179,7 +3245,7 @@ nfsd_modevent(module_t mod, int type, void *data)
switch (type) {
case MOD_LOAD:
if (loaded)
- return (0);
+ goto out;
newnfs_portinit();
mtx_init(&nfs_cache_mutex, "nfs_cache_mutex", NULL, MTX_DEF);
mtx_init(&nfs_v4root_mutex, "nfs_v4root_mutex", NULL, MTX_DEF);
@@ -3235,7 +3301,10 @@ nfsd_modevent(module_t mod, int type, void *data)
error = EOPNOTSUPP;
break;
}
- return error;
+
+out:
+ NFSEXITCODE(error);
+ return (error);
}
static moduledata_t nfsd_mod = {
"nfsd",
diff --git a/sys/fs/nfsserver/nfs_nfsdserv.c b/sys/fs/nfsserver/nfs_nfsdserv.c
index 64aafb4..b6a365d 100644
--- a/sys/fs/nfsserver/nfs_nfsdserv.c
+++ b/sys/fs/nfsserver/nfs_nfsdserv.c
@@ -93,7 +93,7 @@ nfsrvd_access(struct nfsrv_descript *nd, __unused int isdgram,
if (nd->nd_repstat) {
nfsrv_postopattr(nd, 1, &nva);
- return (0);
+ goto out;
}
NFSM_DISSECT(tl, u_int32_t *, NFSX_UNSIGNED);
nfsmode = fxdr_unsigned(u_int32_t, *tl);
@@ -103,7 +103,7 @@ nfsrvd_access(struct nfsrv_descript *nd, __unused int isdgram,
NFSACCESS_EXECUTE))) {
nd->nd_repstat = NFSERR_INVAL;
vput(vp);
- return (0);
+ goto out;
}
if (nfsmode & NFSACCESS_READ) {
supported |= NFSACCESS_READ;
@@ -155,9 +155,13 @@ nfsrvd_access(struct nfsrv_descript *nd, __unused int isdgram,
} else
NFSM_BUILD(tl, u_int32_t *, NFSX_UNSIGNED);
*tl = txdr_unsigned(nfsmode);
+
+out:
+ NFSEXITCODE2(0, nd);
return (0);
nfsmout:
vput(vp);
+ NFSEXITCODE2(error, nd);
return (error);
}
@@ -180,12 +184,12 @@ nfsrvd_getattr(struct nfsrv_descript *nd, int isdgram,
accmode_t accmode;
if (nd->nd_repstat)
- return (0);
+ goto out;
if (nd->nd_flag & ND_NFSV4) {
error = nfsrv_getattrbits(nd, &attrbits, NULL, NULL);
if (error) {
vput(vp);
- return (error);
+ goto out;
}
/*
@@ -196,7 +200,7 @@ nfsrvd_getattr(struct nfsrv_descript *nd, int isdgram,
(void) nfsrv_putreferralattr(nd, &attrbits, refp, 1,
&nd->nd_repstat);
vput(vp);
- return (0);
+ goto out;
}
if (nd->nd_repstat == 0) {
accmode = 0;
@@ -235,10 +239,10 @@ nfsrvd_getattr(struct nfsrv_descript *nd, int isdgram,
} else
at_root = 0;
vfs_ref(mp);
- VOP_UNLOCK(vp, 0);
+ NFSVOPUNLOCK(vp, 0);
if (at_root != 0) {
if ((nd->nd_repstat =
- vn_lock(tvp, LK_SHARED)) == 0) {
+ NFSVOPLOCK(tvp, LK_SHARED)) == 0) {
nd->nd_repstat = VOP_GETATTR(
tvp, &va, nd->nd_cred);
vput(tvp);
@@ -270,7 +274,10 @@ nfsrvd_getattr(struct nfsrv_descript *nd, int isdgram,
} else {
vput(vp);
}
- return (0);
+
+out:
+ NFSEXITCODE2(error, nd);
+ return (error);
}
/*
@@ -290,7 +297,7 @@ nfsrvd_setattr(struct nfsrv_descript *nd, __unused int isdgram,
if (nd->nd_repstat) {
nfsrv_wcc(nd, preat_ret, &nva2, postat_ret, &nva);
- return (0);
+ goto out;
}
#ifdef NFS4_ACL_EXTATTR_NAME
aclp = acl_alloc(M_WAITOK);
@@ -326,7 +333,7 @@ nfsrvd_setattr(struct nfsrv_descript *nd, __unused int isdgram,
acl_free(aclp);
#endif
nfsrv_wcc(nd, preat_ret, &nva2, postat_ret, &nva);
- return (0);
+ goto out;
}
} else if (!nd->nd_repstat && (nd->nd_flag & ND_NFSV4))
nd->nd_repstat = nfsrv_checkuidgid(nd, &nva);
@@ -440,6 +447,9 @@ nfsrvd_setattr(struct nfsrv_descript *nd, __unused int isdgram,
(void) nfsrv_putattrbit(nd, &retbits);
else if (!nd->nd_repstat)
nfsrv_fillattr(nd, &nva);
+
+out:
+ NFSEXITCODE2(0, nd);
return (0);
nfsmout:
vput(vp);
@@ -454,6 +464,7 @@ nfsmout:
*/
(void) nfsrv_putattrbit(nd, &retbits);
}
+ NFSEXITCODE2(error, nd);
return (error);
}
@@ -468,14 +479,14 @@ nfsrvd_lookup(struct nfsrv_descript *nd, __unused int isdgram,
{
struct nameidata named;
vnode_t vp, dirp = NULL;
- int error, dattr_ret = 1;
+ int error = 0, dattr_ret = 1;
struct nfsvattr nva, dattr;
char *bufp;
u_long *hashp;
if (nd->nd_repstat) {
nfsrv_postopattr(nd, dattr_ret, &dattr);
- return (0);
+ goto out;
}
/*
@@ -485,7 +496,7 @@ nfsrvd_lookup(struct nfsrv_descript *nd, __unused int isdgram,
if (dp->v_type == VLNK && (nd->nd_flag & ND_NFSV4)) {
nd->nd_repstat = NFSERR_SYMLINK;
vrele(dp);
- return (0);
+ goto out;
}
NFSNAMEICNDSET(&named.ni_cnd, nd->nd_cred, LOOKUP,
@@ -495,7 +506,7 @@ nfsrvd_lookup(struct nfsrv_descript *nd, __unused int isdgram,
if (error) {
vrele(dp);
nfsvno_relpathbuf(&named);
- return (error);
+ goto out;
}
if (!nd->nd_repstat) {
nd->nd_repstat = nfsvno_namei(nd, &named, dp, 0, exp, p, &dirp);
@@ -512,7 +523,7 @@ nfsrvd_lookup(struct nfsrv_descript *nd, __unused int isdgram,
}
if (nd->nd_flag & ND_NFSV3)
nfsrv_postopattr(nd, dattr_ret, &dattr);
- return (0);
+ goto out;
}
if (named.ni_startdir)
vrele(named.ni_startdir);
@@ -542,7 +553,7 @@ nfsrvd_lookup(struct nfsrv_descript *nd, __unused int isdgram,
if (nd->nd_repstat) {
if (nd->nd_flag & ND_NFSV3)
nfsrv_postopattr(nd, dattr_ret, &dattr);
- return (0);
+ goto out;
}
if (nd->nd_flag & ND_NFSV2) {
(void) nfsm_fhtom(nd, (u_int8_t *)fhp, 0, 0);
@@ -552,7 +563,10 @@ nfsrvd_lookup(struct nfsrv_descript *nd, __unused int isdgram,
nfsrv_postopattr(nd, 0, &nva);
nfsrv_postopattr(nd, dattr_ret, &dattr);
}
- return (0);
+
+out:
+ NFSEXITCODE2(error, nd);
+ return (error);
}
/*
@@ -569,7 +583,7 @@ nfsrvd_readlink(struct nfsrv_descript *nd, __unused int isdgram,
if (nd->nd_repstat) {
nfsrv_postopattr(nd, getret, &nva);
- return (0);
+ goto out;
}
if (vnode_vtype(vp) != VLNK) {
if (nd->nd_flag & ND_NFSV2)
@@ -586,12 +600,15 @@ nfsrvd_readlink(struct nfsrv_descript *nd, __unused int isdgram,
if (nd->nd_flag & ND_NFSV3)
nfsrv_postopattr(nd, getret, &nva);
if (nd->nd_repstat)
- return (0);
+ goto out;
NFSM_BUILD(tl, u_int32_t *, NFSX_UNSIGNED);
*tl = txdr_unsigned(len);
mbuf_setnext(nd->nd_mb, mp);
nd->nd_mb = mpend;
nd->nd_bpos = NFSMTOD(mpend, caddr_t) + mbuf_len(mpend);
+
+out:
+ NFSEXITCODE2(0, nd);
return (0);
}
@@ -614,7 +631,7 @@ nfsrvd_read(struct nfsrv_descript *nd, __unused int isdgram,
if (nd->nd_repstat) {
nfsrv_postopattr(nd, getret, &nva);
- return (0);
+ goto out;
}
if (nd->nd_flag & ND_NFSV2) {
NFSM_DISSECT(tl, u_int32_t *, 2 * NFSX_UNSIGNED);
@@ -690,7 +707,7 @@ nfsrvd_read(struct nfsrv_descript *nd, __unused int isdgram,
vput(vp);
if (nd->nd_flag & ND_NFSV3)
nfsrv_postopattr(nd, getret, &nva);
- return (0);
+ goto out;
}
if (off >= nva.na_size) {
cnt = 0;
@@ -717,7 +734,7 @@ nfsrvd_read(struct nfsrv_descript *nd, __unused int isdgram,
mbuf_freem(m3);
if (nd->nd_flag & ND_NFSV3)
nfsrv_postopattr(nd, getret, &nva);
- return (0);
+ goto out;
}
}
vput(vp);
@@ -742,9 +759,13 @@ nfsrvd_read(struct nfsrv_descript *nd, __unused int isdgram,
nd->nd_mb = m2;
nd->nd_bpos = NFSMTOD(m2, caddr_t) + mbuf_len(m2);
}
+
+out:
+ NFSEXITCODE2(0, nd);
return (0);
nfsmout:
vput(vp);
+ NFSEXITCODE2(error, nd);
return (error);
}
@@ -769,7 +790,7 @@ nfsrvd_write(struct nfsrv_descript *nd, __unused int isdgram,
if (nd->nd_repstat) {
nfsrv_wcc(nd, forat_ret, &forat, aftat_ret, &nva);
- return (0);
+ goto out;
}
if (nd->nd_flag & ND_NFSV2) {
NFSM_DISSECT(tl, u_int32_t *, 4 * NFSX_UNSIGNED);
@@ -862,7 +883,7 @@ nfsrvd_write(struct nfsrv_descript *nd, __unused int isdgram,
vput(vp);
if (nd->nd_flag & ND_NFSV3)
nfsrv_wcc(nd, forat_ret, &forat, aftat_ret, &nva);
- return (0);
+ goto out;
}
/*
@@ -888,7 +909,7 @@ nfsrvd_write(struct nfsrv_descript *nd, __unused int isdgram,
if (nd->nd_flag & ND_NFSV3)
nfsrv_wcc(nd, forat_ret, &forat, aftat_ret, &nva);
if (nd->nd_repstat)
- return (0);
+ goto out;
NFSM_BUILD(tl, u_int32_t *, 4 * NFSX_UNSIGNED);
*tl++ = txdr_unsigned(retlen);
if (stable == NFSWRITE_UNSTABLE)
@@ -904,9 +925,13 @@ nfsrvd_write(struct nfsrv_descript *nd, __unused int isdgram,
*tl = txdr_unsigned(nfsboottime.tv_usec);
} else if (!nd->nd_repstat)
nfsrv_fillattr(nd, &nva);
+
+out:
+ NFSEXITCODE2(0, nd);
return (0);
nfsmout:
vput(vp);
+ NFSEXITCODE2(error, nd);
return (error);
}
@@ -936,17 +961,14 @@ nfsrvd_create(struct nfsrv_descript *nd, __unused int isdgram,
if (nd->nd_repstat) {
nfsrv_wcc(nd, dirfor_ret, &dirfor, diraft_ret, &diraft);
- return (0);
+ goto out;
}
NFSNAMEICNDSET(&named.ni_cnd, nd->nd_cred, CREATE,
LOCKPARENT | LOCKLEAF | SAVESTART);
nfsvno_setpathbuf(&named, &bufp, &hashp);
error = nfsrv_parsename(nd, bufp, hashp, &named.ni_pathlen);
- if (error) {
- vput(dp);
- nfsvno_relpathbuf(&named);
- return (error);
- }
+ if (error)
+ goto nfsmout;
if (!nd->nd_repstat) {
NFSVNO_ATTRINIT(&nva);
if (nd->nd_flag & ND_NFSV2) {
@@ -1001,7 +1023,7 @@ nfsrvd_create(struct nfsrv_descript *nd, __unused int isdgram,
&diraft);
}
vput(dp);
- return (0);
+ goto out;
}
nd->nd_repstat = nfsvno_namei(nd, &named, dp, 1, exp, p, &dirp);
@@ -1020,7 +1042,7 @@ nfsrvd_create(struct nfsrv_descript *nd, __unused int isdgram,
&diraft);
if (dirp)
vrele(dirp);
- return (0);
+ goto out;
}
if (!(nd->nd_flag & ND_NFSV2)) {
@@ -1074,10 +1096,14 @@ nfsrvd_create(struct nfsrv_descript *nd, __unused int isdgram,
}
nfsrv_wcc(nd, dirfor_ret, &dirfor, diraft_ret, &diraft);
}
+
+out:
+ NFSEXITCODE2(0, nd);
return (0);
nfsmout:
vput(dp);
nfsvno_relpathbuf(&named);
+ NFSEXITCODE2(error, nd);
return (error);
}
@@ -1106,7 +1132,7 @@ nfsrvd_mknod(struct nfsrv_descript *nd, __unused int isdgram,
cnflags = (LOCKPARENT | SAVESTART);
if (nd->nd_repstat) {
nfsrv_wcc(nd, dirfor_ret, &dirfor, diraft_ret, &diraft);
- return (0);
+ goto out;
}
#ifdef NFS4_ACL_EXTATTR_NAME
aclp = acl_alloc(M_WAITOK);
@@ -1124,13 +1150,8 @@ nfsrvd_mknod(struct nfsrv_descript *nd, __unused int isdgram,
case NFLNK:
error = nfsvno_getsymlink(nd, &nva, p, &pathcp,
&pathlen);
- if (error) {
- vrele(dp);
-#ifdef NFS4_ACL_EXTATTR_NAME
- acl_free(aclp);
-#endif
- return (error);
- }
+ if (error)
+ goto nfsmout;
break;
case NFCHR:
case NFBLK:
@@ -1151,38 +1172,22 @@ nfsrvd_mknod(struct nfsrv_descript *nd, __unused int isdgram,
#ifdef NFS4_ACL_EXTATTR_NAME
acl_free(aclp);
#endif
- return (0);
- };
+ goto out;
+ }
}
NFSNAMEICNDSET(&named.ni_cnd, nd->nd_cred, CREATE, cnflags);
nfsvno_setpathbuf(&named, &bufp, &hashp);
error = nfsrv_parsename(nd, bufp, hashp, &named.ni_pathlen);
- if (error) {
- vrele(dp);
-#ifdef NFS4_ACL_EXTATTR_NAME
- acl_free(aclp);
-#endif
- nfsvno_relpathbuf(&named);
- if (pathcp)
- FREE(pathcp, M_TEMP);
- return (error);
- }
+ if (error)
+ goto nfsmout;
if (!nd->nd_repstat) {
if (nd->nd_flag & ND_NFSV3) {
NFSM_DISSECT(tl, u_int32_t *, NFSX_UNSIGNED);
vtyp = nfsv34tov_type(*tl);
}
error = nfsrv_sattr(nd, &nva, &attrbits, aclp, p);
- if (error) {
- vrele(dp);
-#ifdef NFS4_ACL_EXTATTR_NAME
- acl_free(aclp);
-#endif
- nfsvno_relpathbuf(&named);
- if (pathcp)
- FREE(pathcp, M_TEMP);
- return (error);
- }
+ if (error)
+ goto nfsmout;
nva.na_type = vtyp;
if (!nd->nd_repstat && (nd->nd_flag & ND_NFSV3) &&
(vtyp == VCHR || vtyp == VBLK)) {
@@ -1211,7 +1216,7 @@ nfsrvd_mknod(struct nfsrv_descript *nd, __unused int isdgram,
if (nd->nd_flag & ND_NFSV3)
nfsrv_wcc(nd, dirfor_ret, &dirfor, diraft_ret,
&diraft);
- return (0);
+ goto out;
}
/*
@@ -1241,7 +1246,7 @@ nfsrvd_mknod(struct nfsrv_descript *nd, __unused int isdgram,
if (nd->nd_flag & ND_NFSV3)
nfsrv_wcc(nd, dirfor_ret, &dirfor, diraft_ret,
&diraft);
- return (0);
+ goto out;
}
if (dirp)
dirfor_ret = nfsvno_getattr(dirp, &dirfor, nd->nd_cred, p, 0);
@@ -1254,7 +1259,7 @@ nfsrvd_mknod(struct nfsrv_descript *nd, __unused int isdgram,
#ifdef NFS4_ACL_EXTATTR_NAME
acl_free(aclp);
#endif
- return (0);
+ goto out;
} else if (vtyp == VLNK) {
nfsrvd_symlinksub(nd, &named, &nva, fhp, vpp, dirp,
&dirfor, &diraft, &diraft_ret, &attrbits,
@@ -1263,7 +1268,7 @@ nfsrvd_mknod(struct nfsrv_descript *nd, __unused int isdgram,
acl_free(aclp);
#endif
FREE(pathcp, M_TEMP);
- return (0);
+ goto out;
}
}
@@ -1276,7 +1281,7 @@ nfsrvd_mknod(struct nfsrv_descript *nd, __unused int isdgram,
nd->nd_repstat = nfsvno_getattr(vp, &nva, nd->nd_cred,
p, 1);
if (vpp != NULL && nd->nd_repstat == 0) {
- VOP_UNLOCK(vp, 0);
+ NFSVOPUNLOCK(vp, 0);
*vpp = vp;
} else
vput(vp);
@@ -1302,6 +1307,9 @@ nfsrvd_mknod(struct nfsrv_descript *nd, __unused int isdgram,
#ifdef NFS4_ACL_EXTATTR_NAME
acl_free(aclp);
#endif
+
+out:
+ NFSEXITCODE2(0, nd);
return (0);
nfsmout:
vrele(dp);
@@ -1312,6 +1320,8 @@ nfsmout:
nfsvno_relpathbuf(&named);
if (pathcp)
FREE(pathcp, M_TEMP);
+
+ NFSEXITCODE2(error, nd);
return (error);
}
@@ -1324,7 +1334,7 @@ nfsrvd_remove(struct nfsrv_descript *nd, __unused int isdgram,
{
struct nameidata named;
u_int32_t *tl;
- int error, dirfor_ret = 1, diraft_ret = 1;
+ int error = 0, dirfor_ret = 1, diraft_ret = 1;
vnode_t dirp = NULL;
struct nfsvattr dirfor, diraft;
char *bufp;
@@ -1332,7 +1342,7 @@ nfsrvd_remove(struct nfsrv_descript *nd, __unused int isdgram,
if (nd->nd_repstat) {
nfsrv_wcc(nd, dirfor_ret, &dirfor, diraft_ret, &diraft);
- return (0);
+ goto out;
}
NFSNAMEICNDSET(&named.ni_cnd, nd->nd_cred, DELETE,
LOCKPARENT | LOCKLEAF);
@@ -1341,7 +1351,7 @@ nfsrvd_remove(struct nfsrv_descript *nd, __unused int isdgram,
if (error) {
vput(dp);
nfsvno_relpathbuf(&named);
- return (error);
+ goto out;
}
if (!nd->nd_repstat) {
nd->nd_repstat = nfsvno_namei(nd, &named, dp, 1, exp, p, &dirp);
@@ -1391,7 +1401,10 @@ nfsrvd_remove(struct nfsrv_descript *nd, __unused int isdgram,
txdr_hyper(diraft.na_filerev, tl);
}
}
- return (0);
+
+out:
+ NFSEXITCODE2(error, nd);
+ return (error);
}
/*
@@ -1403,7 +1416,7 @@ nfsrvd_rename(struct nfsrv_descript *nd, int isdgram,
struct nfsexstuff *toexp)
{
u_int32_t *tl;
- int error, fdirfor_ret = 1, fdiraft_ret = 1;
+ int error = 0, fdirfor_ret = 1, fdiraft_ret = 1;
int tdirfor_ret = 1, tdiraft_ret = 1;
struct nameidata fromnd, tond;
vnode_t fdirp = NULL, tdirp = NULL, tdp = NULL;
@@ -1416,7 +1429,7 @@ nfsrvd_rename(struct nfsrv_descript *nd, int isdgram,
if (nd->nd_repstat) {
nfsrv_wcc(nd, fdirfor_ret, &fdirfor, fdiraft_ret, &fdiraft);
nfsrv_wcc(nd, tdirfor_ret, &tdirfor, tdiraft_ret, &tdiraft);
- return (0);
+ goto out;
}
if (!(nd->nd_flag & ND_NFSV2))
fdirfor_ret = nfsvno_getattr(dp, &fdirfor, nd->nd_cred, p, 1);
@@ -1430,7 +1443,7 @@ nfsrvd_rename(struct nfsrv_descript *nd, int isdgram,
if (todp)
vrele(todp);
nfsvno_relpathbuf(&fromnd);
- return (error);
+ goto out;
}
if (nd->nd_flag & ND_NFSV4) {
tdp = todp;
@@ -1442,14 +1455,14 @@ nfsrvd_rename(struct nfsrv_descript *nd, int isdgram,
vput(dp);
/* todp is always NULL except NFSv4 */
nfsvno_relpathbuf(&fromnd);
- return (error);
+ goto out;
}
nd->nd_cred->cr_uid = nd->nd_saveduid;
nfsd_fhtovp(nd, &tfh, LK_EXCLUSIVE, &tdp, &tnes, NULL, 0, p);
if (tdp) {
tdirfor_ret = nfsvno_getattr(tdp, &tdirfor, nd->nd_cred,
p, 1);
- NFSVOPUNLOCK(tdp, 0, p);
+ NFSVOPUNLOCK(tdp, 0);
}
}
NFSNAMEICNDSET(&tond.ni_cnd, nd->nd_cred, RENAME, LOCKPARENT | LOCKLEAF | NOCACHE | SAVESTART);
@@ -1462,7 +1475,7 @@ nfsrvd_rename(struct nfsrv_descript *nd, int isdgram,
vput(dp);
nfsvno_relpathbuf(&fromnd);
nfsvno_relpathbuf(&tond);
- return (error);
+ goto out;
}
}
if (nd->nd_repstat) {
@@ -1477,7 +1490,7 @@ nfsrvd_rename(struct nfsrv_descript *nd, int isdgram,
vput(dp);
nfsvno_relpathbuf(&fromnd);
nfsvno_relpathbuf(&tond);
- return (0);
+ goto out;
}
/*
@@ -1496,7 +1509,7 @@ nfsrvd_rename(struct nfsrv_descript *nd, int isdgram,
if (tdp)
vrele(tdp);
nfsvno_relpathbuf(&tond);
- return (0);
+ goto out;
}
if (vnode_vtype(fromnd.ni_vp) == VDIR)
tond.ni_cnd.cn_flags |= WILLBEDIR;
@@ -1528,7 +1541,10 @@ nfsrvd_rename(struct nfsrv_descript *nd, int isdgram,
tl += 2;
txdr_hyper(tdiraft.na_filerev, tl);
}
- return (0);
+
+out:
+ NFSEXITCODE2(error, nd);
+ return (error);
}
/*
@@ -1552,9 +1568,9 @@ nfsrvd_link(struct nfsrv_descript *nd, int isdgram,
if (nd->nd_repstat) {
nfsrv_postopattr(nd, getret, &at);
nfsrv_wcc(nd, dirfor_ret, &dirfor, diraft_ret, &diraft);
- return (0);
+ goto out;
}
- NFSVOPUNLOCK(vp, 0, p);
+ NFSVOPUNLOCK(vp, 0);
if (vnode_vtype(vp) == VDIR) {
if (nd->nd_flag & ND_NFSV4)
nd->nd_repstat = NFSERR_ISDIR;
@@ -1579,12 +1595,12 @@ nfsrvd_link(struct nfsrv_descript *nd, int isdgram,
if (error) {
vrele(vp);
/* tovp is always NULL unless NFSv4 */
- return (error);
+ goto out;
}
nfsd_fhtovp(nd, &dfh, LK_EXCLUSIVE, &dp, &tnes, NULL, 0,
p);
if (dp)
- NFSVOPUNLOCK(dp, 0, p);
+ NFSVOPUNLOCK(dp, 0);
}
}
NFSNAMEICNDSET(&named.ni_cnd, nd->nd_cred, CREATE,
@@ -1597,7 +1613,7 @@ nfsrvd_link(struct nfsrv_descript *nd, int isdgram,
if (dp)
vrele(dp);
nfsvno_relpathbuf(&named);
- return (error);
+ goto out;
}
if (!nd->nd_repstat) {
nd->nd_repstat = nfsvno_namei(nd, &named, dp, 0, &tnes,
@@ -1636,7 +1652,10 @@ nfsrvd_link(struct nfsrv_descript *nd, int isdgram,
tl += 2;
txdr_hyper(diraft.na_filerev, tl);
}
- return (0);
+
+out:
+ NFSEXITCODE2(error, nd);
+ return (error);
}
/*
@@ -1649,14 +1668,14 @@ nfsrvd_symlink(struct nfsrv_descript *nd, __unused int isdgram,
{
struct nfsvattr nva, dirfor, diraft;
struct nameidata named;
- int error, dirfor_ret = 1, diraft_ret = 1, pathlen;
+ int error = 0, dirfor_ret = 1, diraft_ret = 1, pathlen;
vnode_t dirp = NULL;
char *bufp, *pathcp = NULL;
u_long *hashp;
if (nd->nd_repstat) {
nfsrv_wcc(nd, dirfor_ret, &dirfor, diraft_ret, &diraft);
- return (0);
+ goto out;
}
if (vpp)
*vpp = NULL;
@@ -1670,7 +1689,7 @@ nfsrvd_symlink(struct nfsrv_descript *nd, __unused int isdgram,
if (error) {
vrele(dp);
nfsvno_relpathbuf(&named);
- return (error);
+ goto out;
}
if (!nd->nd_repstat) {
nd->nd_repstat = nfsvno_namei(nd, &named, dp, 0, exp, p, &dirp);
@@ -1708,7 +1727,10 @@ nfsrvd_symlink(struct nfsrv_descript *nd, __unused int isdgram,
}
nfsrv_wcc(nd, dirfor_ret, &dirfor, diraft_ret, &diraft);
}
- return (0);
+
+out:
+ NFSEXITCODE2(error, nd);
+ return (error);
}
/*
@@ -1735,7 +1757,7 @@ nfsrvd_symlinksub(struct nfsrv_descript *nd, struct nameidata *ndp,
nvap, nd->nd_cred, p, 1);
}
if (vpp != NULL && nd->nd_repstat == 0) {
- VOP_UNLOCK(ndp->ni_vp, 0);
+ NFSVOPUNLOCK(ndp->ni_vp, 0);
*vpp = ndp->ni_vp;
} else
vput(ndp->ni_vp);
@@ -1752,6 +1774,8 @@ nfsrvd_symlinksub(struct nfsrv_descript *nd, struct nameidata *ndp,
txdr_hyper(diraftp->na_filerev, tl);
(void) nfsrv_putattrbit(nd, attrbitp);
}
+
+ NFSEXITCODE2(0, nd);
}
/*
@@ -1765,33 +1789,27 @@ nfsrvd_mkdir(struct nfsrv_descript *nd, __unused int isdgram,
struct nfsvattr nva, dirfor, diraft;
struct nameidata named;
u_int32_t *tl;
- int error, dirfor_ret = 1, diraft_ret = 1;
+ int error = 0, dirfor_ret = 1, diraft_ret = 1;
vnode_t dirp = NULL;
char *bufp;
u_long *hashp;
if (nd->nd_repstat) {
nfsrv_wcc(nd, dirfor_ret, &dirfor, diraft_ret, &diraft);
- return (0);
+ goto out;
}
NFSNAMEICNDSET(&named.ni_cnd, nd->nd_cred, CREATE,
LOCKPARENT | SAVENAME);
nfsvno_setpathbuf(&named, &bufp, &hashp);
error = nfsrv_parsename(nd, bufp, hashp, &named.ni_pathlen);
- if (error) {
- vrele(dp);
- nfsvno_relpathbuf(&named);
- return (error);
- }
+ if (error)
+ goto nfsmout;
if (!nd->nd_repstat) {
NFSVNO_ATTRINIT(&nva);
if (nd->nd_flag & ND_NFSV3) {
error = nfsrv_sattr(nd, &nva, NULL, NULL, p);
- if (error) {
- vrele(dp);
- nfsvno_relpathbuf(&named);
- return (error);
- }
+ if (error)
+ goto nfsmout;
} else {
NFSM_DISSECT(tl, u_int32_t *, NFSX_UNSIGNED);
nva.na_mode = nfstov_mode(*tl++);
@@ -1816,7 +1834,7 @@ nfsrvd_mkdir(struct nfsrv_descript *nd, __unused int isdgram,
if (nd->nd_flag & ND_NFSV3)
nfsrv_wcc(nd, dirfor_ret, &dirfor, diraft_ret,
&diraft);
- return (0);
+ goto out;
}
if (dirp != NULL)
dirfor_ret = nfsvno_getattr(dirp, &dirfor, nd->nd_cred, p, 0);
@@ -1837,10 +1855,14 @@ nfsrvd_mkdir(struct nfsrv_descript *nd, __unused int isdgram,
(void) nfsm_fhtom(nd, (u_int8_t *)fhp, 0, 0);
nfsrv_fillattr(nd, &nva);
}
+
+out:
+ NFSEXITCODE2(0, nd);
return (0);
nfsmout:
vrele(dp);
nfsvno_relpathbuf(&named);
+ NFSEXITCODE2(error, nd);
return (error);
}
@@ -1868,7 +1890,7 @@ nfsrvd_mkdirsub(struct nfsrv_descript *nd, struct nameidata *ndp,
nd->nd_repstat = nfsvno_getattr(vp, nvap, nd->nd_cred,
p, 1);
if (vpp && !nd->nd_repstat) {
- NFSVOPUNLOCK(vp, 0, p);
+ NFSVOPUNLOCK(vp, 0);
*vpp = vp;
} else {
vput(vp);
@@ -1886,6 +1908,8 @@ nfsrvd_mkdirsub(struct nfsrv_descript *nd, struct nameidata *ndp,
txdr_hyper(diraftp->na_filerev, tl);
(void) nfsrv_putattrbit(nd, attrbitp);
}
+
+ NFSEXITCODE2(0, nd);
}
/*
@@ -1902,7 +1926,7 @@ nfsrvd_commit(struct nfsrv_descript *nd, __unused int isdgram,
if (nd->nd_repstat) {
nfsrv_wcc(nd, for_ret, &bfor, aft_ret, &aft);
- return (0);
+ goto out;
}
NFSM_DISSECT(tl, u_int32_t *, 3 * NFSX_UNSIGNED);
/*
@@ -1925,9 +1949,13 @@ nfsrvd_commit(struct nfsrv_descript *nd, __unused int isdgram,
*tl++ = txdr_unsigned(nfsboottime.tv_sec);
*tl = txdr_unsigned(nfsboottime.tv_usec);
}
+
+out:
+ NFSEXITCODE2(0, nd);
return (0);
nfsmout:
vput(vp);
+ NFSEXITCODE2(error, nd);
return (error);
}
@@ -1947,7 +1975,7 @@ nfsrvd_statfs(struct nfsrv_descript *nd, __unused int isdgram,
if (nd->nd_repstat) {
nfsrv_postopattr(nd, getret, &at);
- return (0);
+ goto out;
}
sf = &sfs;
nd->nd_repstat = nfsvno_statfs(vp, sf);
@@ -1956,7 +1984,7 @@ nfsrvd_statfs(struct nfsrv_descript *nd, __unused int isdgram,
if (nd->nd_flag & ND_NFSV3)
nfsrv_postopattr(nd, getret, &at);
if (nd->nd_repstat)
- return (0);
+ goto out;
if (nd->nd_flag & ND_NFSV2) {
NFSM_BUILD(tl, u_int32_t *, NFSX_V2STATFS);
*tl++ = txdr_unsigned(NFS_V2MAXDATA);
@@ -1983,6 +2011,9 @@ nfsrvd_statfs(struct nfsrv_descript *nd, __unused int isdgram,
txdr_hyper(tval, tl); tl += 2;
*tl = 0;
}
+
+out:
+ NFSEXITCODE2(0, nd);
return (0);
}
@@ -2000,7 +2031,7 @@ nfsrvd_fsinfo(struct nfsrv_descript *nd, int isdgram,
if (nd->nd_repstat) {
nfsrv_postopattr(nd, getret, &at);
- return (0);
+ goto out;
}
getret = nfsvno_getattr(vp, &at, nd->nd_cred, p, 1);
nfsvno_getfs(&fs, isdgram);
@@ -2019,6 +2050,9 @@ nfsrvd_fsinfo(struct nfsrv_descript *nd, int isdgram,
txdr_nfsv3time(&fs.fs_timedelta, tl);
tl += 2;
*tl = txdr_unsigned(fs.fs_properties);
+
+out:
+ NFSEXITCODE2(0, nd);
return (0);
}
@@ -2036,7 +2070,7 @@ nfsrvd_pathconf(struct nfsrv_descript *nd, __unused int isdgram,
if (nd->nd_repstat) {
nfsrv_postopattr(nd, getret, &at);
- return (0);
+ goto out;
}
nd->nd_repstat = nfsvno_pathconf(vp, _PC_LINK_MAX, &linkmax,
nd->nd_cred, p);
@@ -2067,6 +2101,9 @@ nfsrvd_pathconf(struct nfsrv_descript *nd, __unused int isdgram,
pc->pc_caseinsensitive = newnfs_false;
pc->pc_casepreserving = newnfs_true;
}
+
+out:
+ NFSEXITCODE2(0, nd);
return (0);
}
@@ -2236,11 +2273,13 @@ nfsrvd_lock(struct nfsrv_descript *nd, __unused int isdgram,
(void) nfsm_strtom(nd, cf.cl_owner, cf.cl_ownerlen);
}
vput(vp);
+ NFSEXITCODE2(0, nd);
return (0);
nfsmout:
vput(vp);
if (stp)
free((caddr_t)stp, M_NFSDSTATE);
+ NFSEXITCODE2(error, nd);
return (error);
}
@@ -2344,11 +2383,13 @@ nfsrvd_lockt(struct nfsrv_descript *nd, __unused int isdgram,
}
}
vput(vp);
+ NFSEXITCODE2(0, nd);
return (0);
nfsmout:
vput(vp);
if (stp)
free((caddr_t)stp, M_NFSDSTATE);
+ NFSEXITCODE2(error, nd);
return (error);
}
@@ -2442,6 +2483,7 @@ nfsrvd_locku(struct nfsrv_descript *nd, __unused int isdgram,
}
nfsmout:
vput(vp);
+ NFSEXITCODE2(error, nd);
return (error);
}
@@ -2481,11 +2523,7 @@ nfsrvd_open(struct nfsrv_descript *nd, __unused int isdgram,
i = fxdr_unsigned(int, *(tl + 5));
if (i <= 0 || i > NFSV4_OPAQUELIMIT) {
nd->nd_repstat = NFSERR_BADXDR;
- vrele(dp);
-#ifdef NFS4_ACL_EXTATTR_NAME
- acl_free(aclp);
-#endif
- return (0);
+ goto nfsmout;
}
MALLOC(stp, struct nfsstate *, sizeof (struct nfsstate) + i,
M_NFSDSTATE, M_WAITOK);
@@ -2534,14 +2572,8 @@ nfsrvd_open(struct nfsrv_descript *nd, __unused int isdgram,
nd->nd_clientid.qval = clientid.qval;
}
error = nfsrv_mtostr(nd, stp->ls_owner, stp->ls_ownerlen);
- if (error) {
- vrele(dp);
-#ifdef NFS4_ACL_EXTATTR_NAME
- acl_free(aclp);
-#endif
- FREE((caddr_t)stp, M_NFSDSTATE);
- return (error);
- }
+ if (error)
+ goto nfsmout;
NFSVNO_ATTRINIT(&nva);
NFSM_DISSECT(tl, u_int32_t *, NFSX_UNSIGNED);
create = fxdr_unsigned(int, *tl);
@@ -2556,14 +2588,8 @@ nfsrvd_open(struct nfsrv_descript *nd, __unused int isdgram,
case NFSCREATE_UNCHECKED:
case NFSCREATE_GUARDED:
error = nfsv4_sattr(nd, &nva, &attrbits, aclp, p);
- if (error) {
- vrele(dp);
-#ifdef NFS4_ACL_EXTATTR_NAME
- acl_free(aclp);
-#endif
- FREE((caddr_t)stp, M_NFSDSTATE);
- return (error);
- }
+ if (error)
+ goto nfsmout;
/*
* If the na_gid being set is the same as that of
* the directory it is going in, clear it, since
@@ -2583,21 +2609,11 @@ nfsrvd_open(struct nfsrv_descript *nd, __unused int isdgram,
break;
default:
nd->nd_repstat = NFSERR_BADXDR;
- vrele(dp);
-#ifdef NFS4_ACL_EXTATTR_NAME
- acl_free(aclp);
-#endif
- FREE((caddr_t)stp, M_NFSDSTATE);
- return (0);
+ goto nfsmout;
};
} else if (create != NFSV4OPEN_NOCREATE) {
nd->nd_repstat = NFSERR_BADXDR;
- vrele(dp);
-#ifdef NFS4_ACL_EXTATTR_NAME
- acl_free(aclp);
-#endif
- FREE((caddr_t)stp, M_NFSDSTATE);
- return (0);
+ goto nfsmout;
}
/*
@@ -2623,12 +2639,7 @@ nfsrvd_open(struct nfsrv_descript *nd, __unused int isdgram,
if (nd->nd_repstat) {
nd->nd_repstat = nfsrv_opencheck(clientid,
&stateid, stp, NULL, nd, p, nd->nd_repstat);
- vrele(dp);
-#ifdef NFS4_ACL_EXTATTR_NAME
- acl_free(aclp);
-#endif
- FREE((caddr_t)stp, M_NFSDSTATE);
- return (0);
+ goto nfsmout;
}
if (create == NFSV4OPEN_CREATE)
NFSNAMEICNDSET(&named.ni_cnd, nd->nd_cred, CREATE,
@@ -2645,6 +2656,7 @@ nfsrvd_open(struct nfsrv_descript *nd, __unused int isdgram,
#endif
FREE((caddr_t)stp, M_NFSDSTATE);
nfsvno_relpathbuf(&named);
+ NFSEXITCODE2(error, nd);
return (error);
}
if (!nd->nd_repstat) {
@@ -2694,16 +2706,11 @@ nfsrvd_open(struct nfsrv_descript *nd, __unused int isdgram,
break;
default:
nd->nd_repstat = NFSERR_BADXDR;
- vrele(dp);
-#ifdef NFS4_ACL_EXTATTR_NAME
- acl_free(aclp);
-#endif
- FREE((caddr_t)stp, M_NFSDSTATE);
- return (0);
+ goto nfsmout;
};
stp->ls_flags |= NFSLCK_RECLAIM;
vp = dp;
- vn_lock(vp, LK_EXCLUSIVE | LK_RETRY);
+ NFSVOPLOCK(vp, LK_EXCLUSIVE | LK_RETRY);
if ((vp->v_iflag & VI_DOOMED) == 0)
nd->nd_repstat = nfsrv_opencheck(clientid, &stateid,
stp, vp, nd, p, nd->nd_repstat);
@@ -2711,12 +2718,7 @@ nfsrvd_open(struct nfsrv_descript *nd, __unused int isdgram,
nd->nd_repstat = NFSERR_PERM;
} else {
nd->nd_repstat = NFSERR_BADXDR;
- vrele(dp);
-#ifdef NFS4_ACL_EXTATTR_NAME
- acl_free(aclp);
-#endif
- FREE((caddr_t)stp, M_NFSDSTATE);
- return (0);
+ goto nfsmout;
}
/*
@@ -2765,7 +2767,7 @@ nfsrvd_open(struct nfsrv_descript *nd, __unused int isdgram,
* (ie: Leave the NFSVOPUNLOCK() about here.)
*/
if (vp)
- NFSVOPUNLOCK(vp, 0, p);
+ NFSVOPUNLOCK(vp, 0);
if (stp)
FREE((caddr_t)stp, M_NFSDSTATE);
if (!nd->nd_repstat && dirp)
@@ -2835,6 +2837,7 @@ nfsrvd_open(struct nfsrv_descript *nd, __unused int isdgram,
#ifdef NFS4_ACL_EXTATTR_NAME
acl_free(aclp);
#endif
+ NFSEXITCODE2(0, nd);
return (0);
nfsmout:
vrele(dp);
@@ -2843,6 +2846,7 @@ nfsmout:
#endif
if (stp)
FREE((caddr_t)stp, M_NFSDSTATE);
+ NFSEXITCODE2(error, nd);
return (error);
}
@@ -2884,9 +2888,11 @@ nfsrvd_close(struct nfsrv_descript *nd, __unused int isdgram,
*tl++ = txdr_unsigned(stateid.seqid);
NFSBCOPY((caddr_t)stateid.other,(caddr_t)tl,NFSX_STATEIDOTHER);
}
+ NFSEXITCODE2(0, nd);
return (0);
nfsmout:
vput(vp);
+ NFSEXITCODE2(error, nd);
return (error);
}
@@ -2903,7 +2909,7 @@ nfsrvd_delegpurge(struct nfsrv_descript *nd, __unused int isdgram,
if (nfs_rootfhset == 0 || nfsd_checkrootexp(nd) != 0) {
nd->nd_repstat = NFSERR_WRONGSEC;
- return (0);
+ goto nfsmout;
}
NFSM_DISSECT(tl, u_int32_t *, 2 * NFSX_UNSIGNED);
clientid.lval[0] = *tl++;
@@ -2918,6 +2924,7 @@ nfsrvd_delegpurge(struct nfsrv_descript *nd, __unused int isdgram,
nd->nd_repstat = nfsrv_delegupdate(clientid, NULL, NULL,
NFSV4OP_DELEGPURGE, nd->nd_cred, p);
nfsmout:
+ NFSEXITCODE2(error, nd);
return (error);
}
@@ -2949,6 +2956,7 @@ nfsrvd_delegreturn(struct nfsrv_descript *nd, __unused int isdgram,
NFSV4OP_DELEGRETURN, nd->nd_cred, p);
nfsmout:
vput(vp);
+ NFSEXITCODE2(error, nd);
return (error);
}
@@ -2965,6 +2973,7 @@ nfsrvd_getfh(struct nfsrv_descript *nd, __unused int isdgram,
vput(vp);
if (!nd->nd_repstat)
(void) nfsm_fhtom(nd, (u_int8_t *)&fh, 0, 0);
+ NFSEXITCODE2(0, nd);
return (0);
}
@@ -3008,6 +3017,7 @@ nfsrvd_openconfirm(struct nfsrv_descript *nd, __unused int isdgram,
}
nfsmout:
vput(vp);
+ NFSEXITCODE2(error, nd);
return (error);
}
@@ -3085,6 +3095,7 @@ nfsrvd_opendowngrade(struct nfsrv_descript *nd, __unused int isdgram,
}
nfsmout:
vput(vp);
+ NFSEXITCODE2(error, nd);
return (error);
}
@@ -3101,7 +3112,7 @@ nfsrvd_renew(struct nfsrv_descript *nd, __unused int isdgram,
if (nfs_rootfhset == 0 || nfsd_checkrootexp(nd) != 0) {
nd->nd_repstat = NFSERR_WRONGSEC;
- return (0);
+ goto nfsmout;
}
NFSM_DISSECT(tl, u_int32_t *, NFSX_HYPER);
clientid.lval[0] = *tl++;
@@ -3116,6 +3127,7 @@ nfsrvd_renew(struct nfsrv_descript *nd, __unused int isdgram,
nd->nd_repstat = nfsrv_getclient(clientid, (CLOPS_RENEWOP|CLOPS_RENEW),
NULL, (nfsquad_t)((u_quad_t)0), nd, p);
nfsmout:
+ NFSEXITCODE2(error, nd);
return (error);
}
@@ -3133,7 +3145,7 @@ nfsrvd_secinfo(struct nfsrv_descript *nd, int isdgram,
struct nfsrvfh fh;
struct nfsexstuff retnes;
u_int32_t *sizp;
- int error, savflag, i;
+ int error = 0, savflag, i;
char *bufp;
u_long *hashp;
@@ -3147,7 +3159,7 @@ nfsrvd_secinfo(struct nfsrv_descript *nd, int isdgram,
if (error) {
vput(dp);
nfsvno_relpathbuf(&named);
- return (error);
+ goto out;
}
if (!nd->nd_repstat) {
nd->nd_repstat = nfsvno_namei(nd, &named, dp, 1, exp, p, &dirp);
@@ -3158,7 +3170,7 @@ nfsrvd_secinfo(struct nfsrv_descript *nd, int isdgram,
if (dirp)
vrele(dirp);
if (nd->nd_repstat)
- return (0);
+ goto out;
vrele(named.ni_startdir);
nfsvno_relpathbuf(&named);
fh.nfsrvfh_len = NFSX_MYFH;
@@ -3173,7 +3185,7 @@ nfsrvd_secinfo(struct nfsrv_descript *nd, int isdgram,
}
nd->nd_flag = savflag;
if (nd->nd_repstat)
- return (0);
+ goto out;
/*
* Finally have the export flags for name, so we can create
@@ -3216,7 +3228,10 @@ nfsrvd_secinfo(struct nfsrv_descript *nd, int isdgram,
}
}
*sizp = txdr_unsigned(len);
- return (0);
+
+out:
+ NFSEXITCODE2(error, nd);
+ return (error);
}
/*
@@ -3236,7 +3251,7 @@ nfsrvd_setclientid(struct nfsrv_descript *nd, __unused int isdgram,
if (nfs_rootfhset == 0 || nfsd_checkrootexp(nd) != 0) {
nd->nd_repstat = NFSERR_WRONGSEC;
- return (0);
+ goto out;
}
NFSM_DISSECT(tl, u_int32_t *, NFSX_VERF + NFSX_UNSIGNED);
verf = (u_char *)tl;
@@ -3244,7 +3259,7 @@ nfsrvd_setclientid(struct nfsrv_descript *nd, __unused int isdgram,
i = fxdr_unsigned(int, *tl);
if (i > NFSV4_OPAQUELIMIT || i <= 0) {
nd->nd_repstat = NFSERR_BADXDR;
- return (error);
+ goto nfsmout;
}
idlen = i;
if (nd->nd_flag & ND_GSS)
@@ -3320,6 +3335,9 @@ nfsrvd_setclientid(struct nfsrv_descript *nd, __unused int isdgram,
*tl++ = confirm.lval[0];
*tl = confirm.lval[1];
}
+
+out:
+ NFSEXITCODE2(0, nd);
return (0);
nfsmout:
if (clp) {
@@ -3327,6 +3345,7 @@ nfsmout:
NFSFREEMUTEX(&clp->lc_req.nr_mtx);
free((caddr_t)clp, M_NFSDCLIENT);
}
+ NFSEXITCODE2(error, nd);
return (error);
}
@@ -3344,7 +3363,7 @@ nfsrvd_setclientidcfrm(struct nfsrv_descript *nd,
if (nfs_rootfhset == 0 || nfsd_checkrootexp(nd) != 0) {
nd->nd_repstat = NFSERR_WRONGSEC;
- return (0);
+ goto nfsmout;
}
NFSM_DISSECT(tl, u_int32_t *, 2 * NFSX_HYPER);
clientid.lval[0] = *tl++;
@@ -3359,6 +3378,7 @@ nfsrvd_setclientidcfrm(struct nfsrv_descript *nd,
nd->nd_repstat = nfsrv_getclient(clientid, (CLOPS_CONFIRM|CLOPS_RENEW),
NULL, confirm, nd, p);
nfsmout:
+ NFSEXITCODE2(error, nd);
return (error);
}
@@ -3395,6 +3415,7 @@ nfsrvd_verify(struct nfsrv_descript *nd, int isdgram,
}
}
vput(vp);
+ NFSEXITCODE2(error, nd);
return (error);
}
@@ -3414,6 +3435,7 @@ nfsrvd_openattr(struct nfsrv_descript *nd, __unused int isdgram,
nd->nd_repstat = NFSERR_NOTSUPP;
nfsmout:
vrele(dp);
+ NFSEXITCODE2(error, nd);
return (error);
}
@@ -3431,13 +3453,13 @@ nfsrvd_releaselckown(struct nfsrv_descript *nd, __unused int isdgram,
if (nfs_rootfhset == 0 || nfsd_checkrootexp(nd) != 0) {
nd->nd_repstat = NFSERR_WRONGSEC;
- return (0);
+ goto nfsmout;
}
NFSM_DISSECT(tl, u_int32_t *, 3 * NFSX_UNSIGNED);
len = fxdr_unsigned(int, *(tl + 2));
if (len <= 0 || len > NFSV4_OPAQUELIMIT) {
nd->nd_repstat = NFSERR_BADXDR;
- return (0);
+ goto nfsmout;
}
MALLOC(stp, struct nfsstate *, sizeof (struct nfsstate) + len,
M_NFSDSTATE, M_WAITOK);
@@ -3459,9 +3481,12 @@ nfsrvd_releaselckown(struct nfsrv_descript *nd, __unused int isdgram,
goto nfsmout;
nd->nd_repstat = nfsrv_releaselckown(stp, clientid, p);
FREE((caddr_t)stp, M_NFSDSTATE);
+
+ NFSEXITCODE2(0, nd);
return (0);
nfsmout:
if (stp)
free((caddr_t)stp, M_NFSDSTATE);
+ NFSEXITCODE2(error, nd);
return (error);
}
diff --git a/sys/fs/nfsserver/nfs_nfsdsocket.c b/sys/fs/nfsserver/nfs_nfsdsocket.c
index 33be284..eaeb1dc 100644
--- a/sys/fs/nfsserver/nfs_nfsdsocket.c
+++ b/sys/fs/nfsserver/nfs_nfsdsocket.c
@@ -376,7 +376,7 @@ nfsrvd_dorpc(struct nfsrv_descript *nd, int isdgram,
if (error != EBADRPC)
printf("nfs dorpc err1=%d\n", error);
nd->nd_repstat = NFSERR_GARBAGE;
- return;
+ goto out;
}
if (nd->nd_procnum == NFSPROC_READ ||
nd->nd_procnum == NFSPROC_READDIR ||
@@ -393,7 +393,7 @@ nfsrvd_dorpc(struct nfsrv_descript *nd, int isdgram,
nfsd_fhtovp(nd, &fh, lktype, &vp, &nes,
&mp, nfs_writerpc[nd->nd_procnum], p);
if (nd->nd_repstat == NFSERR_PROGNOTV4)
- return;
+ goto out;
}
}
@@ -416,7 +416,7 @@ nfsrvd_dorpc(struct nfsrv_descript *nd, int isdgram,
NFSINCRGLOBAL(newnfsstats.srvrpccnt[nfsv3to4op[nd->nd_procnum]]);
if (mp != NULL && nfs_writerpc[nd->nd_procnum] != 0)
vn_finished_write(mp);
- return;
+ goto out;
}
/*
@@ -430,7 +430,7 @@ nfsrvd_dorpc(struct nfsrv_descript *nd, int isdgram,
} else {
if (nfs_retfh[nd->nd_procnum] == 1) {
if (vp)
- NFSVOPUNLOCK(vp, 0, p);
+ NFSVOPUNLOCK(vp, 0);
error = (*(nfsrv3_procs1[nd->nd_procnum]))(nd, isdgram,
vp, NULL, (fhandle_t *)fh.nfsrvfh_data, p, &nes);
} else if (nfs_retfh[nd->nd_procnum] == 2) {
@@ -469,6 +469,9 @@ nfsrvd_dorpc(struct nfsrv_descript *nd, int isdgram,
nd->nd_repstat == NFSERR_GRACE ||
nd->nd_repstat == NFSERR_NOGRACE))
nd->nd_flag &= ~ND_SAVEREPLY;
+
+out:
+ NFSEXITCODE2(0, nd);
}
/*
@@ -705,7 +708,7 @@ nfsrvd_compound(struct nfsrv_descript *nd, int isdgram,
vrele(vp);
vp = nvp;
cur_fsid = vp->v_mount->mnt_stat.f_fsid;
- VOP_UNLOCK(vp, 0);
+ NFSVOPUNLOCK(vp, 0);
vpnes = nes;
}
break;
@@ -720,7 +723,7 @@ nfsrvd_compound(struct nfsrv_descript *nd, int isdgram,
vrele(vp);
vp = nvp;
cur_fsid = vp->v_mount->mnt_stat.f_fsid;
- VOP_UNLOCK(vp, 0);
+ NFSVOPUNLOCK(vp, 0);
vpnes = nes;
}
break;
@@ -733,7 +736,7 @@ nfsrvd_compound(struct nfsrv_descript *nd, int isdgram,
vrele(vp);
vp = nvp;
cur_fsid = vp->v_mount->mnt_stat.f_fsid;
- VOP_UNLOCK(vp, 0);
+ NFSVOPUNLOCK(vp, 0);
vpnes = nes;
}
} else
@@ -840,7 +843,7 @@ nfsrvd_compound(struct nfsrv_descript *nd, int isdgram,
}
}
/* Lookup ops return a locked vnode */
- VOP_UNLOCK(nvp, 0);
+ NFSVOPUNLOCK(nvp, 0);
}
if (!nd->nd_repstat) {
vrele(vp);
@@ -861,7 +864,7 @@ nfsrvd_compound(struct nfsrv_descript *nd, int isdgram,
}
if (nfsv4_opflag[op].modifyfs)
vn_start_write(savevp, &temp_mp, V_WAIT);
- if (vn_lock(savevp, LK_EXCLUSIVE) == 0) {
+ if (NFSVOPLOCK(savevp, LK_EXCLUSIVE) == 0) {
VREF(vp);
VREF(savevp);
error = (*(nfsrv4_ops2[op]))(nd, isdgram,
@@ -878,7 +881,7 @@ nfsrvd_compound(struct nfsrv_descript *nd, int isdgram,
if (nfsv4_opflag[op].modifyfs)
vn_start_write(vp, &temp_mp,
V_WAIT);
- if (vn_lock(vp, nfsv4_opflag[op].lktype)
+ if (NFSVOPLOCK(vp, nfsv4_opflag[op].lktype)
== 0)
VREF(vp);
else
@@ -946,4 +949,6 @@ nfsmout:
NFSLOCKV4ROOTMUTEX();
nfsv4_relref(&nfsv4rootfs_lock);
NFSUNLOCKV4ROOTMUTEX();
+
+ NFSEXITCODE2(0, nd);
}
diff --git a/sys/fs/nfsserver/nfs_nfsdstate.c b/sys/fs/nfsserver/nfs_nfsdstate.c
index fc84d72..bd246d5 100644
--- a/sys/fs/nfsserver/nfs_nfsdstate.c
+++ b/sys/fs/nfsserver/nfs_nfsdstate.c
@@ -135,7 +135,7 @@ nfsrv_setclient(struct nfsrv_descript *nd, struct nfsclient **new_clpp,
nfsquad_t *clientidp, nfsquad_t *confirmp, NFSPROC_T *p)
{
struct nfsclient *clp = NULL, *new_clp = *new_clpp;
- int i;
+ int i, error = 0;
struct nfsstate *stp, *tstp;
struct sockaddr_in *sad, *rad;
int zapit = 0, gotit, hasstate = 0, igotlock;
@@ -144,8 +144,10 @@ nfsrv_setclient(struct nfsrv_descript *nd, struct nfsclient **new_clpp,
/*
* Check for state resource limit exceeded.
*/
- if (nfsrv_openpluslock > NFSRV_V4STATELIMIT)
- return (NFSERR_RESOURCE);
+ if (nfsrv_openpluslock > NFSRV_V4STATELIMIT) {
+ error = NFSERR_RESOURCE;
+ goto out;
+ }
if (nfsrv_issuedelegs == 0 ||
((nd->nd_flag & ND_GSS) != 0 && nfsrv_nogsscallback != 0))
@@ -228,7 +230,7 @@ nfsrv_setclient(struct nfsrv_descript *nd, struct nfsclient **new_clpp,
if (zapit)
nfsrv_zapclient(clp, p);
*new_clpp = NULL;
- return (0);
+ goto out;
}
/*
@@ -274,7 +276,8 @@ nfsrv_setclient(struct nfsrv_descript *nd, struct nfsclient **new_clpp,
NFSLOCKV4ROOTMUTEX();
nfsv4_unlock(&nfsv4rootfs_lock, 1);
NFSUNLOCKV4ROOTMUTEX();
- return (NFSERR_CLIDINUSE);
+ error = NFSERR_CLIDINUSE;
+ goto out;
}
}
@@ -335,7 +338,7 @@ nfsrv_setclient(struct nfsrv_descript *nd, struct nfsclient **new_clpp,
}
nfsrv_zapclient(clp, p);
*new_clpp = NULL;
- return (0);
+ goto out;
}
/*
* id and verifier match, so update the net address info
@@ -388,7 +391,10 @@ nfsrv_setclient(struct nfsrv_descript *nd, struct nfsclient **new_clpp,
}
nfsrv_zapclient(clp, p);
*new_clpp = NULL;
- return (0);
+
+out:
+ NFSEXITCODE2(error, nd);
+ return (error);
}
/*
@@ -406,8 +412,10 @@ nfsrv_getclient(nfsquad_t clientid, int opflags, struct nfsclient **clpp,
if (clpp)
*clpp = NULL;
- if (nfsrvboottime != clientid.lval[0])
- return (NFSERR_STALECLIENTID);
+ if (nfsrvboottime != clientid.lval[0]) {
+ error = NFSERR_STALECLIENTID;
+ goto out;
+ }
/*
* If called with opflags == CLOPS_RENEW, the State Lock is
@@ -450,7 +458,7 @@ nfsrv_getclient(nfsquad_t clientid, int opflags, struct nfsclient **clpp,
} else if (opflags != CLOPS_RENEW) {
NFSUNLOCKSTATE();
}
- return (error);
+ goto out;
}
/*
@@ -526,6 +534,9 @@ nfsrv_getclient(nfsquad_t clientid, int opflags, struct nfsclient **clpp,
}
if (clpp)
*clpp = clp;
+
+out:
+ NFSEXITCODE2(error, nd);
return (error);
}
@@ -537,7 +548,7 @@ APPLESTATIC int
nfsrv_adminrevoke(struct nfsd_clid *revokep, NFSPROC_T *p)
{
struct nfsclient *clp = NULL;
- int i;
+ int i, error = 0;
int gotit, igotlock;
/*
@@ -570,7 +581,8 @@ nfsrv_adminrevoke(struct nfsd_clid *revokep, NFSPROC_T *p)
NFSLOCKV4ROOTMUTEX();
nfsv4_unlock(&nfsv4rootfs_lock, 0);
NFSUNLOCKV4ROOTMUTEX();
- return (EPERM);
+ error = EPERM;
+ goto out;
}
/*
@@ -590,7 +602,10 @@ nfsrv_adminrevoke(struct nfsd_clid *revokep, NFSPROC_T *p)
NFSLOCKV4ROOTMUTEX();
nfsv4_unlock(&nfsv4rootfs_lock, 0);
NFSUNLOCKV4ROOTMUTEX();
- return (0);
+
+out:
+ NFSEXITCODE(error);
+ return (error);
}
/*
@@ -1229,6 +1244,7 @@ nfsrv_getstate(struct nfsclient *clp, nfsv4stateid_t *stateidp, __unused u_int32
{
struct nfsstate *stp;
struct nfsstatehead *hp;
+ int error = 0;
*stpp = NULL;
hp = NFSSTATEHASH(clp, *stateidp);
@@ -1241,10 +1257,15 @@ nfsrv_getstate(struct nfsclient *clp, nfsv4stateid_t *stateidp, __unused u_int32
/*
* If no state id in list, return NFSERR_BADSTATEID.
*/
- if (stp == LIST_END(hp))
- return (NFSERR_BADSTATEID);
+ if (stp == LIST_END(hp)) {
+ error = NFSERR_BADSTATEID;
+ goto out;
+ }
*stpp = stp;
- return (0);
+
+out:
+ NFSEXITCODE(error);
+ return (error);
}
/*
@@ -1323,14 +1344,16 @@ nfsrv_lockctrl(vnode_t vp, struct nfsstate **new_stpp,
error = nfsrv_checkrestart(clientid, new_stp->ls_flags,
&new_stp->ls_stateid, specialid);
if (error)
- return (error);
+ goto out;
/*
* Check for state resource limit exceeded.
*/
if ((new_stp->ls_flags & NFSLCK_LOCK) &&
- nfsrv_openpluslock > NFSRV_V4STATELIMIT)
- return (NFSERR_RESOURCE);
+ nfsrv_openpluslock > NFSRV_V4STATELIMIT) {
+ error = NFSERR_RESOURCE;
+ goto out;
+ }
/*
* For the lock case, get another nfslock structure,
@@ -1546,14 +1569,7 @@ tryagain:
nfsrv_unlocklf(lfp);
}
NFSUNLOCKSTATE();
- if (other_lop)
- FREE((caddr_t)other_lop, M_NFSDLOCK);
- if (haslock) {
- NFSLOCKV4ROOTMUTEX();
- nfsv4_unlock(&nfsv4rootfs_lock, 1);
- NFSUNLOCKV4ROOTMUTEX();
- }
- return (error);
+ goto out;
}
/*
@@ -1582,15 +1598,7 @@ tryagain:
error = NFSERR_BADSTATEID;
}
NFSUNLOCKSTATE();
- if (haslock) {
- NFSLOCKV4ROOTMUTEX();
- nfsv4_unlock(&nfsv4rootfs_lock, 1);
- NFSUNLOCKV4ROOTMUTEX();
- }
- /*
- * Called to lock or unlock, so the lock has gone away.
- */
- return (error);
+ goto out;
}
/*
@@ -1638,14 +1646,8 @@ tryagain:
nfsrv_unlocklf(lfp);
}
NFSUNLOCKSTATE();
- if (other_lop)
- FREE((caddr_t)other_lop, M_NFSDLOCK);
- if (haslock) {
- NFSLOCKV4ROOTMUTEX();
- nfsv4_unlock(&nfsv4rootfs_lock, 1);
- NFSUNLOCKV4ROOTMUTEX();
- }
- return (NFSERR_OPENMODE);
+ error = NFSERR_OPENMODE;
+ goto out;
}
} else
mystp = NULL;
@@ -1670,27 +1672,18 @@ tryagain:
}
if (ret == 0)
NFSUNLOCKSTATE();
- if (haslock) {
- NFSLOCKV4ROOTMUTEX();
- nfsv4_unlock(&nfsv4rootfs_lock, 1);
- NFSUNLOCKV4ROOTMUTEX();
- }
if (ret == 2)
- return (NFSERR_PERM);
+ error = NFSERR_PERM;
else
- return (NFSERR_OPENMODE);
+ error = NFSERR_OPENMODE;
+ goto out;
}
}
}
/* We're outta here */
NFSUNLOCKSTATE();
- if (haslock) {
- NFSLOCKV4ROOTMUTEX();
- nfsv4_unlock(&nfsv4rootfs_lock, 1);
- NFSUNLOCKV4ROOTMUTEX();
- }
- return (0);
+ goto out;
}
}
@@ -1708,18 +1701,14 @@ tryagain:
lckstp = NULL;
goto tryagain;
}
- return (ret);
+ error = ret;
+ goto out;
}
if (!(new_stp->ls_flags & NFSLCK_CHECK) ||
(LIST_EMPTY(&lfp->lf_open) && LIST_EMPTY(&lfp->lf_lock) &&
LIST_EMPTY(&lfp->lf_deleg))) {
NFSUNLOCKSTATE();
- if (haslock) {
- NFSLOCKV4ROOTMUTEX();
- nfsv4_unlock(&nfsv4rootfs_lock, 1);
- NFSUNLOCKV4ROOTMUTEX();
- }
- return (0);
+ goto out;
}
}
@@ -1773,7 +1762,8 @@ tryagain:
lckstp = NULL;
goto tryagain;
}
- return (ret);
+ error = ret;
+ goto out;
}
/* Never gets here. */
}
@@ -1801,12 +1791,7 @@ tryagain:
nfsrv_unlocklf(lfp);
}
NFSUNLOCKSTATE();
- if (haslock) {
- NFSLOCKV4ROOTMUTEX();
- nfsv4_unlock(&nfsv4rootfs_lock, 1);
- NFSUNLOCKV4ROOTMUTEX();
- }
- return (0);
+ goto out;
}
/*
@@ -1877,12 +1862,7 @@ tryagain:
}
if (ret == 0)
NFSUNLOCKSTATE();
- if (haslock) {
- NFSLOCKV4ROOTMUTEX();
- nfsv4_unlock(&nfsv4rootfs_lock, 1);
- NFSUNLOCKV4ROOTMUTEX();
- }
- return (error);
+ goto out;
}
}
}
@@ -1892,12 +1872,7 @@ tryagain:
*/
if (new_stp->ls_flags & (NFSLCK_TEST | NFSLCK_CHECK)) {
NFSUNLOCKSTATE();
- if (haslock) {
- NFSLOCKV4ROOTMUTEX();
- nfsv4_unlock(&nfsv4rootfs_lock, 1);
- NFSUNLOCKV4ROOTMUTEX();
- }
- return (0);
+ goto out;
}
/*
@@ -1950,6 +1925,8 @@ tryagain:
nfsrv_unlocklf(lfp);
}
NFSUNLOCKSTATE();
+
+out:
if (haslock) {
NFSLOCKV4ROOTMUTEX();
nfsv4_unlock(&nfsv4rootfs_lock, 1);
@@ -1957,7 +1934,8 @@ tryagain:
}
if (other_lop)
FREE((caddr_t)other_lop, M_NFSDLOCK);
- return (0);
+ NFSEXITCODE2(error, nd);
+ return (error);
}
/*
@@ -1974,7 +1952,7 @@ nfsrv_opencheck(nfsquad_t clientid, nfsv4stateid_t *stateidp,
struct nfsclient *clp;
struct nfsstate *ownerstp;
struct nfslockfile *lfp, *new_lfp;
- int error, haslock = 0, ret, readonly = 0, getfhret = 0;
+ int error = 0, haslock = 0, ret, readonly = 0, getfhret = 0;
if ((new_stp->ls_flags & NFSLCK_SHAREBITS) == NFSLCK_READACCESS)
readonly = 1;
@@ -1984,7 +1962,7 @@ nfsrv_opencheck(nfsquad_t clientid, nfsv4stateid_t *stateidp,
error = nfsrv_checkrestart(clientid, new_stp->ls_flags,
&new_stp->ls_stateid, 0);
if (error)
- return (error);
+ goto out;
/*
* Check for state resource limit exceeded.
@@ -1993,8 +1971,10 @@ nfsrv_opencheck(nfsquad_t clientid, nfsv4stateid_t *stateidp,
* returns NFSERR_RESOURCE and the limit is just a rather
* arbitrary high water mark, so no harm is done.
*/
- if (nfsrv_openpluslock > NFSRV_V4STATELIMIT)
- return (NFSERR_RESOURCE);
+ if (nfsrv_openpluslock > NFSRV_V4STATELIMIT) {
+ error = NFSERR_RESOURCE;
+ goto out;
+ }
tryagain:
MALLOC(new_lfp, struct nfslockfile *, sizeof (struct nfslockfile),
@@ -2052,7 +2032,7 @@ tryagain:
NFSUNLOCKV4ROOTMUTEX();
}
free((caddr_t)new_lfp, M_NFSDLOCKFILE);
- return (error);
+ goto out;
}
/*
@@ -2062,7 +2042,7 @@ tryagain:
if (vp == NULL) {
NFSUNLOCKSTATE();
FREE((caddr_t)new_lfp, M_NFSDLOCKFILE);
- return (0);
+ goto out;
}
/*
@@ -2082,7 +2062,7 @@ tryagain:
nfsv4_unlock(&nfsv4rootfs_lock, 1);
NFSUNLOCKV4ROOTMUTEX();
}
- return (error);
+ goto out;
}
/*
@@ -2113,7 +2093,8 @@ tryagain:
nfsv4_unlock(&nfsv4rootfs_lock, 1);
NFSUNLOCKV4ROOTMUTEX();
}
- return (NFSERR_EXPIRED);
+ error = NFSERR_EXPIRED;
+ goto out;
}
}
@@ -2148,7 +2129,7 @@ tryagain:
nfsv4_unlock(&nfsv4rootfs_lock, 1);
NFSUNLOCKV4ROOTMUTEX();
}
- return (error);
+ goto out;
}
}
@@ -2189,7 +2170,8 @@ tryagain:
*/
if (ret == -1)
goto tryagain;
- return (ret);
+ error = ret;
+ goto out;
}
}
stp = nstp;
@@ -2201,7 +2183,10 @@ tryagain:
nfsv4_unlock(&nfsv4rootfs_lock, 1);
NFSUNLOCKV4ROOTMUTEX();
}
- return (0);
+
+out:
+ NFSEXITCODE2(error, nd);
+ return (error);
}
/*
@@ -2218,7 +2203,7 @@ nfsrv_openctrl(struct nfsrv_descript *nd, vnode_t vp,
struct nfsstate *openstp = NULL, *new_open, *ownerstp, *new_deleg;
struct nfslockfile *lfp, *new_lfp;
struct nfsclient *clp;
- int error, haslock = 0, ret, delegate = 1, writedeleg = 1;
+ int error = 0, haslock = 0, ret, delegate = 1, writedeleg = 1;
int readonly = 0, cbret = 1, getfhret = 0;
if ((new_stp->ls_flags & NFSLCK_SHAREBITS) == NFSLCK_READACCESS)
@@ -2234,7 +2219,8 @@ nfsrv_openctrl(struct nfsrv_descript *nd, vnode_t vp,
if (error) {
printf("Nfsd: openctrl unexpected restart err=%d\n",
error);
- return (NFSERR_EXPIRED);
+ error = NFSERR_EXPIRED;
+ goto out;
}
tryagain:
@@ -2305,7 +2291,8 @@ tryagain:
nfsv4_unlock(&nfsv4rootfs_lock, 1);
NFSUNLOCKV4ROOTMUTEX();
}
- return (NFSERR_EXPIRED);
+ error = NFSERR_EXPIRED;
+ goto out;
}
if (new_stp->ls_flags & NFSLCK_RECLAIM)
@@ -2332,7 +2319,7 @@ tryagain:
nfsv4_unlock(&nfsv4rootfs_lock, 1);
NFSUNLOCKV4ROOTMUTEX();
}
- return (error);
+ goto out;
}
/*
@@ -2366,7 +2353,8 @@ tryagain:
nfsv4_unlock(&nfsv4rootfs_lock, 1);
NFSUNLOCKV4ROOTMUTEX();
}
- return (NFSERR_EXPIRED);
+ error = NFSERR_EXPIRED;
+ goto out;
}
/*
@@ -2431,7 +2419,7 @@ tryagain:
free((caddr_t)new_open, M_NFSDSTATE);
free((caddr_t)new_deleg, M_NFSDSTATE);
printf("nfsd openctrl unexpected client cnfl\n");
- return (error);
+ goto out;
}
}
}
@@ -2482,7 +2470,8 @@ tryagain:
openstp = NULL;
goto tryagain;
}
- return (ret);
+ error = ret;
+ goto out;
}
}
}
@@ -2855,6 +2844,9 @@ tryagain:
FREE((caddr_t)new_open, M_NFSDSTATE);
if (new_deleg)
FREE((caddr_t)new_deleg, M_NFSDSTATE);
+
+out:
+ NFSEXITCODE2(error, nd);
return (error);
}
@@ -2869,7 +2861,7 @@ nfsrv_openupdate(vnode_t vp, struct nfsstate *new_stp, nfsquad_t clientid,
struct nfsclient *clp;
struct nfslockfile *lfp;
u_int32_t bits;
- int error, gotstate = 0, len = 0;
+ int error = 0, gotstate = 0, len = 0;
u_char client[NFSV4_OPAQUELIMIT];
/*
@@ -2878,7 +2870,7 @@ nfsrv_openupdate(vnode_t vp, struct nfsstate *new_stp, nfsquad_t clientid,
error = nfsrv_checkrestart(clientid, new_stp->ls_flags,
&new_stp->ls_stateid, 0);
if (error)
- return (error);
+ goto out;
NFSLOCKSTATE();
/*
@@ -2925,7 +2917,7 @@ nfsrv_openupdate(vnode_t vp, struct nfsstate *new_stp, nfsquad_t clientid,
nfsrv_nootherstate(stp))
nfsrv_freeopenowner(stp->ls_openowner, 0, p);
NFSUNLOCKSTATE();
- return (error);
+ goto out;
}
/*
@@ -2978,7 +2970,8 @@ nfsrv_openupdate(vnode_t vp, struct nfsstate *new_stp, nfsquad_t clientid,
bits = (new_stp->ls_flags & NFSLCK_SHAREBITS);
if (~(stp->ls_flags) & bits) {
NFSUNLOCKSTATE();
- return (NFSERR_INVAL);
+ error = NFSERR_INVAL;
+ goto out;
}
stp->ls_flags = (bits | NFSLCK_OPEN);
stp->ls_stateid.seqid++;
@@ -2993,6 +2986,9 @@ nfsrv_openupdate(vnode_t vp, struct nfsstate *new_stp, nfsquad_t clientid,
nfsrv_writestable(client, len, NFSNST_NEWSTATE, p);
nfsrv_backupstable();
}
+
+out:
+ NFSEXITCODE2(error, nd);
return (error);
}
@@ -3005,7 +3001,7 @@ nfsrv_delegupdate(nfsquad_t clientid, nfsv4stateid_t *stateidp,
{
struct nfsstate *stp;
struct nfsclient *clp;
- int error;
+ int error = 0;
fhandle_t fh;
/*
@@ -3014,7 +3010,7 @@ nfsrv_delegupdate(nfsquad_t clientid, nfsv4stateid_t *stateidp,
if (vp) {
error = nfsvno_getfh(vp, &fh, p);
if (error)
- return (error);
+ goto out;
}
/*
* Check for restart conditions (client and server).
@@ -3050,25 +3046,31 @@ nfsrv_delegupdate(nfsquad_t clientid, nfsv4stateid_t *stateidp,
*/
if (error == NFSERR_EXPIRED && op == NFSV4OP_DELEGPURGE) {
NFSUNLOCKSTATE();
- return (0);
+ error = 0;
+ goto out;
}
if (error) {
NFSUNLOCKSTATE();
- return (error);
+ goto out;
}
if (op == NFSV4OP_DELEGRETURN) {
if (NFSBCMP((caddr_t)&fh, (caddr_t)&stp->ls_lfp->lf_fh,
sizeof (fhandle_t))) {
NFSUNLOCKSTATE();
- return (NFSERR_BADSTATEID);
+ error = NFSERR_BADSTATEID;
+ goto out;
}
nfsrv_freedeleg(stp);
} else {
nfsrv_freedeleglist(&clp->lc_olddeleg);
}
NFSUNLOCKSTATE();
- return (0);
+ error = 0;
+
+out:
+ NFSEXITCODE(error);
+ return (error);
}
/*
@@ -3080,7 +3082,7 @@ nfsrv_releaselckown(struct nfsstate *new_stp, nfsquad_t clientid,
{
struct nfsstate *stp, *nstp, *openstp, *ownstp;
struct nfsclient *clp;
- int error;
+ int error = 0;
/*
* Check for restart conditions (client and server).
@@ -3088,7 +3090,7 @@ nfsrv_releaselckown(struct nfsstate *new_stp, nfsquad_t clientid,
error = nfsrv_checkrestart(clientid, new_stp->ls_flags,
&new_stp->ls_stateid, 0);
if (error)
- return (error);
+ goto out;
NFSLOCKSTATE();
/*
@@ -3098,7 +3100,7 @@ nfsrv_releaselckown(struct nfsstate *new_stp, nfsquad_t clientid,
(nfsquad_t)((u_quad_t)0), NULL, p);
if (error) {
NFSUNLOCKSTATE();
- return (error);
+ goto out;
}
LIST_FOREACH(ownstp, &clp->lc_open, ls_list) {
LIST_FOREACH(openstp, &ownstp->ls_open, ls_list) {
@@ -3116,7 +3118,8 @@ nfsrv_releaselckown(struct nfsstate *new_stp, nfsquad_t clientid,
nfsrv_freelockowner(stp, NULL, 0, p);
} else {
NFSUNLOCKSTATE();
- return (NFSERR_LOCKSHELD);
+ error = NFSERR_LOCKSHELD;
+ goto out;
}
}
stp = nstp;
@@ -3124,7 +3127,10 @@ nfsrv_releaselckown(struct nfsstate *new_stp, nfsquad_t clientid,
}
}
NFSUNLOCKSTATE();
- return (0);
+
+out:
+ NFSEXITCODE(error);
+ return (error);
}
/*
@@ -3151,6 +3157,7 @@ nfsrv_getlockfh(vnode_t vp, u_short flags,
panic("nfsrv_getlockfh");
}
error = nfsvno_getfh(vp, fhp, p);
+ NFSEXITCODE(error);
return (error);
}
@@ -3406,6 +3413,7 @@ static int
nfsrv_checkseqid(struct nfsrv_descript *nd, u_int32_t seqid,
struct nfsstate *stp, struct nfsrvcache *op)
{
+ int error = 0;
if (op != nd->nd_rp)
panic("nfsrvstate checkseqid");
@@ -3421,20 +3429,27 @@ nfsrv_checkseqid(struct nfsrv_descript *nd, u_int32_t seqid,
stp->ls_op = op;
nfsrvd_refcache(op);
stp->ls_seq = seqid;
- return (0);
+ goto out;
} else if (stp->ls_seq == seqid && stp->ls_op &&
op->rc_xid == stp->ls_op->rc_xid &&
op->rc_refcnt == 0 &&
op->rc_reqlen == stp->ls_op->rc_reqlen &&
op->rc_cksum == stp->ls_op->rc_cksum) {
- if (stp->ls_op->rc_flag & RC_INPROG)
- return (NFSERR_DONTREPLY);
+ if (stp->ls_op->rc_flag & RC_INPROG) {
+ error = NFSERR_DONTREPLY;
+ goto out;
+ }
nd->nd_rp = stp->ls_op;
nd->nd_rp->rc_flag |= RC_INPROG;
nfsrvd_delcache(op);
- return (NFSERR_REPLYFROMCACHE);
+ error = NFSERR_REPLYFROMCACHE;
+ goto out;
}
- return (NFSERR_BADSEQID);
+ error = NFSERR_BADSEQID;
+
+out:
+ NFSEXITCODE2(error, nd);
+ return (error);
}
/*
@@ -3558,6 +3573,7 @@ nfsrv_getclientipaddr(struct nfsrv_descript *nd, struct nfsclient *clp)
clp->lc_program = 0;
}
nfsmout:
+ NFSEXITCODE2(error, nd);
return (error);
}
@@ -3590,7 +3606,7 @@ static int
nfsrv_checkrestart(nfsquad_t clientid, u_int32_t flags,
nfsv4stateid_t *stateidp, int specialid)
{
- int ret;
+ int ret = 0;
/*
* First check for a server restart. Open, LockT, ReleaseLockOwner
@@ -3598,11 +3614,15 @@ nfsrv_checkrestart(nfsquad_t clientid, u_int32_t flags,
*/
if (flags &
(NFSLCK_OPEN | NFSLCK_TEST | NFSLCK_RELEASE | NFSLCK_DELEGPURGE)) {
- if (clientid.lval[0] != nfsrvboottime)
- return (NFSERR_STALECLIENTID);
+ if (clientid.lval[0] != nfsrvboottime) {
+ ret = NFSERR_STALECLIENTID;
+ goto out;
+ }
} else if (stateidp->other[0] != nfsrvboottime &&
- specialid == 0)
- return (NFSERR_STALESTATEID);
+ specialid == 0) {
+ ret = NFSERR_STALESTATEID;
+ goto out;
+ }
/*
* Read, Write, Setattr and LockT can return NFSERR_GRACE and do
@@ -3610,11 +3630,14 @@ nfsrv_checkrestart(nfsquad_t clientid, u_int32_t flags,
* (The others will be checked, as required, later.)
*/
if (!(flags & (NFSLCK_CHECK | NFSLCK_TEST)))
- return (0);
+ goto out;
NFSLOCKSTATE();
ret = nfsrv_checkgrace(flags);
NFSUNLOCKSTATE();
+
+out:
+ NFSEXITCODE(ret);
return (ret);
}
@@ -3624,13 +3647,18 @@ nfsrv_checkrestart(nfsquad_t clientid, u_int32_t flags,
static int
nfsrv_checkgrace(u_int32_t flags)
{
+ int error = 0;
if (nfsrv_stablefirst.nsf_flags & NFSNSF_GRACEOVER) {
- if (flags & NFSLCK_RECLAIM)
- return (NFSERR_NOGRACE);
+ if (flags & NFSLCK_RECLAIM) {
+ error = NFSERR_NOGRACE;
+ goto out;
+ }
} else {
- if (!(flags & NFSLCK_RECLAIM))
- return (NFSERR_GRACE);
+ if (!(flags & NFSLCK_RECLAIM)) {
+ error = NFSERR_GRACE;
+ goto out;
+ }
/*
* If grace is almost over and we are still getting Reclaims,
@@ -3641,7 +3669,10 @@ nfsrv_checkgrace(u_int32_t flags)
nfsrv_stablefirst.nsf_eograce = NFSD_MONOSEC +
NFSRV_LEASEDELTA;
}
- return (0);
+
+out:
+ NFSEXITCODE(error);
+ return (error);
}
/*
@@ -3790,6 +3821,8 @@ nfsrv_docallback(struct nfsclient *clp, int procnum,
} else {
NFSUNLOCKSTATE();
}
+
+ NFSEXITCODE(error);
return (error);
}
@@ -4096,10 +4129,10 @@ nfsrv_updatestable(NFSPROC_T *p)
NFSVNO_SETATTRVAL(&nva, size, 0);
vp = NFSFPVNODE(sf->nsf_fp);
vn_start_write(vp, &mp, V_WAIT);
- if (vn_lock(vp, LK_EXCLUSIVE) == 0) {
+ if (NFSVOPLOCK(vp, LK_EXCLUSIVE) == 0) {
error = nfsvno_setattr(vp, &nva, NFSFPCRED(sf->nsf_fp), p,
NULL);
- VOP_UNLOCK(vp, 0);
+ NFSVOPUNLOCK(vp, 0);
} else
error = EPERM;
vn_finished_write(mp);
@@ -4231,7 +4264,7 @@ nfsrv_checkstable(struct nfsclient *clp)
* Return 0 to indicate the conflict can't be revoked and 1 to indicate
* the revocation worked and the conflicting client is "bye, bye", so it
* can be tried again.
- * Return 2 to indicate that the vnode is VI_DOOMED after vn_lock().
+ * Return 2 to indicate that the vnode is VI_DOOMED after NFSVOPLOCK().
* Unlocks State before a non-zero value is returned.
*/
static int
@@ -4248,8 +4281,8 @@ nfsrv_clientconflict(struct nfsclient *clp, int *haslockp, vnode_t vp,
return (0);
if (*haslockp == 0) {
NFSUNLOCKSTATE();
- lktype = VOP_ISLOCKED(vp);
- VOP_UNLOCK(vp, 0);
+ lktype = NFSVOPISLOCKED(vp);
+ NFSVOPUNLOCK(vp, 0);
NFSLOCKV4ROOTMUTEX();
nfsv4_relref(&nfsv4rootfs_lock);
do {
@@ -4258,7 +4291,7 @@ nfsrv_clientconflict(struct nfsclient *clp, int *haslockp, vnode_t vp,
} while (!gotlock);
NFSUNLOCKV4ROOTMUTEX();
*haslockp = 1;
- vn_lock(vp, lktype | LK_RETRY);
+ NFSVOPLOCK(vp, lktype | LK_RETRY);
if ((vp->v_iflag & VI_DOOMED) != 0)
return (2);
else
@@ -4317,7 +4350,8 @@ nfsrv_delegconflict(struct nfsstate *stp, int *haslockp, NFSPROC_T *p,
if (clp->lc_delegtime < NFSD_MONOSEC) {
nfsrv_freedeleg(stp);
NFSUNLOCKSTATE();
- return (-1);
+ error = -1;
+ goto out;
}
NFSUNLOCKSTATE();
/*
@@ -4332,7 +4366,8 @@ nfsrv_delegconflict(struct nfsstate *stp, int *haslockp, NFSPROC_T *p,
nfsv4_unlock(&nfsv4rootfs_lock, 1);
NFSUNLOCKV4ROOTMUTEX();
}
- return (NFSERR_DELAY);
+ error = NFSERR_DELAY;
+ goto out;
}
/*
@@ -4388,7 +4423,8 @@ nfsrv_delegconflict(struct nfsstate *stp, int *haslockp, NFSPROC_T *p,
retrycnt++;
} while ((error == NFSERR_BADSTATEID ||
error == NFSERR_BADHANDLE) && retrycnt < NFSV4_CBRETRYCNT);
- return (NFSERR_DELAY);
+ error = NFSERR_DELAY;
+ goto out;
}
if (clp->lc_expiry >= NFSD_MONOSEC &&
@@ -4404,7 +4440,8 @@ nfsrv_delegconflict(struct nfsstate *stp, int *haslockp, NFSPROC_T *p,
nfsv4_unlock(&nfsv4rootfs_lock, 1);
NFSUNLOCKV4ROOTMUTEX();
}
- return (NFSERR_DELAY);
+ error = NFSERR_DELAY;
+ goto out;
}
/*
@@ -4416,8 +4453,8 @@ nfsrv_delegconflict(struct nfsstate *stp, int *haslockp, NFSPROC_T *p,
*/
if (*haslockp == 0) {
NFSUNLOCKSTATE();
- lktype = VOP_ISLOCKED(vp);
- VOP_UNLOCK(vp, 0);
+ lktype = NFSVOPISLOCKED(vp);
+ NFSVOPUNLOCK(vp, 0);
NFSLOCKV4ROOTMUTEX();
nfsv4_relref(&nfsv4rootfs_lock);
do {
@@ -4426,15 +4463,17 @@ nfsrv_delegconflict(struct nfsstate *stp, int *haslockp, NFSPROC_T *p,
} while (!gotlock);
NFSUNLOCKV4ROOTMUTEX();
*haslockp = 1;
- vn_lock(vp, lktype | LK_RETRY);
+ NFSVOPLOCK(vp, lktype | LK_RETRY);
if ((vp->v_iflag & VI_DOOMED) != 0) {
*haslockp = 0;
NFSLOCKV4ROOTMUTEX();
nfsv4_unlock(&nfsv4rootfs_lock, 1);
NFSUNLOCKV4ROOTMUTEX();
- return (NFSERR_PERM);
+ error = NFSERR_PERM;
+ goto out;
}
- return (-1);
+ error = -1;
+ goto out;
}
NFSUNLOCKSTATE();
@@ -4459,7 +4498,11 @@ nfsrv_delegconflict(struct nfsstate *stp, int *haslockp, NFSPROC_T *p,
}
if (zapped_clp)
nfsrv_zapclient(clp, p);
- return (-1);
+ error = -1;
+
+out:
+ NFSEXITCODE(error);
+ return (error);
}
/*
@@ -4491,8 +4534,8 @@ tryagain:
NFSUNLOCKV4ROOTMUTEX();
}
if (error == -1)
- return (0);
- return (error);
+ error = 0;
+ goto out;
}
/*
@@ -4511,7 +4554,7 @@ tryagain:
nfsv4_unlock(&nfsv4rootfs_lock, 1);
NFSUNLOCKV4ROOTMUTEX();
}
- return (error);
+ goto out;
}
/*
@@ -4532,6 +4575,9 @@ tryagain:
nfsv4_unlock(&nfsv4rootfs_lock, 1);
NFSUNLOCKV4ROOTMUTEX();
}
+
+out:
+ NFSEXITCODE(error);
return (error);
}
@@ -4549,7 +4595,7 @@ nfsrv_cleandeleg(vnode_t vp, struct nfslockfile *lfp,
struct nfsclient *clp, int *haslockp, NFSPROC_T *p)
{
struct nfsstate *stp, *nstp;
- int ret;
+ int ret = 0;
stp = LIST_FIRST(&lfp->lf_deleg);
while (stp != LIST_END(&lfp->lf_deleg)) {
@@ -4561,12 +4607,14 @@ nfsrv_cleandeleg(vnode_t vp, struct nfslockfile *lfp,
* nfsrv_delegconflict() unlocks state
* when it returns non-zero.
*/
- return (ret);
+ goto out;
}
}
stp = nstp;
}
- return (0);
+out:
+ NFSEXITCODE(ret);
+ return (ret);
}
/*
@@ -4610,7 +4658,7 @@ nfsd_recalldelegation(vnode_t vp, NFSPROC_T *p)
nfsrv_issuedelegs == 0)
return;
- KASSERT((VOP_ISLOCKED(vp) != LK_EXCLUSIVE), ("vp %p is locked", vp));
+ KASSERT((NFSVOPISLOCKED(vp) != LK_EXCLUSIVE), ("vp %p is locked", vp));
/*
* First, get a reference on the nfsv4rootfs_lock so that an
* exclusive lock cannot be acquired by another thread.
@@ -4626,9 +4674,9 @@ nfsd_recalldelegation(vnode_t vp, NFSPROC_T *p)
NFSGETNANOTIME(&mytime);
starttime = (u_int32_t)mytime.tv_sec;
do {
- if (vn_lock(vp, LK_EXCLUSIVE) == 0) {
+ if (NFSVOPLOCK(vp, LK_EXCLUSIVE) == 0) {
error = nfsrv_checkremove(vp, 0, p);
- VOP_UNLOCK(vp, 0);
+ NFSVOPUNLOCK(vp, 0);
} else
error = EPERM;
if (error == NFSERR_DELAY) {
@@ -4700,7 +4748,7 @@ nfsrv_checksetattr(vnode_t vp, struct nfsrv_descript *nd,
NFSISSET_ATTRBIT(attrbitp, NFSATTRBIT_ACL))
stp->ls_flags |= NFSLCK_SETATTR;
if (stp->ls_flags == 0)
- return (0);
+ goto out;
lop->lo_end = NFS64BITSSET;
lop->lo_flags = NFSLCK_WRITE;
stp->ls_ownerlen = 0;
@@ -4712,6 +4760,9 @@ nfsrv_checksetattr(vnode_t vp, struct nfsrv_descript *nd,
stp->ls_stateid.other[2] = stateidp->other[2];
error = nfsrv_lockctrl(vp, &stp, &lop, NULL, clientid,
stateidp, exp, nd, p);
+
+out:
+ NFSEXITCODE2(error, nd);
return (error);
}
@@ -4731,13 +4782,13 @@ nfsrv_checkgetattr(struct nfsrv_descript *nd, vnode_t vp,
struct nfsclient *clp;
struct nfsvattr nva;
fhandle_t nfh;
- int error;
+ int error = 0;
nfsattrbit_t cbbits;
u_quad_t delegfilerev;
NFSCBGETATTR_ATTRBIT(attrbitp, &cbbits);
if (!NFSNONZERO_ATTRBIT(&cbbits))
- return (0);
+ goto out;
/*
* Get the lock file structure.
@@ -4750,8 +4801,8 @@ nfsrv_checkgetattr(struct nfsrv_descript *nd, vnode_t vp,
if (error) {
NFSUNLOCKSTATE();
if (error == -1)
- return (0);
- return (error);
+ error = 0;
+ goto out;
}
/*
@@ -4763,7 +4814,7 @@ nfsrv_checkgetattr(struct nfsrv_descript *nd, vnode_t vp,
}
if (stp == LIST_END(&lfp->lf_deleg)) {
NFSUNLOCKSTATE();
- return (0);
+ goto out;
}
clp = stp->ls_clp;
delegfilerev = stp->ls_filerev;
@@ -4783,7 +4834,7 @@ nfsrv_checkgetattr(struct nfsrv_descript *nd, vnode_t vp,
clp->lc_clientid.qval == nd->nd_clientid.qval) ||
nfsaddr2_match(clp->lc_req.nr_nam, nd->nd_nam)) {
NFSUNLOCKSTATE();
- return (0);
+ goto out;
}
/*
@@ -4814,7 +4865,11 @@ nfsrv_checkgetattr(struct nfsrv_descript *nd, vnode_t vp,
} else {
NFSUNLOCKSTATE();
}
- return (0);
+ error = 0;
+
+out:
+ NFSEXITCODE2(error, nd);
+ return (error);
}
/*
@@ -4997,6 +5052,8 @@ nfsrv_locallock(vnode_t vp, struct nfslockfile *lfp, int flags,
/* handle fragment past end of list */
error = nfsrv_dolocal(vp, lfp, flags, NFSLCK_UNLOCK, first,
end, cfp, p);
+
+ NFSEXITCODE(error);
return (error);
}
@@ -5079,7 +5136,7 @@ nfsrv_dolocal(vnode_t vp, struct nfslockfile *lfp, int flags, int oldflags,
uint64_t first, uint64_t end, struct nfslockconflict *cfp, NFSPROC_T *p)
{
struct nfsrollback *rlp;
- int error, ltype, oldltype;
+ int error = 0, ltype, oldltype;
if (flags & NFSLCK_WRITE)
ltype = F_WRLCK;
@@ -5095,7 +5152,7 @@ nfsrv_dolocal(vnode_t vp, struct nfslockfile *lfp, int flags, int oldflags,
oldltype = F_UNLCK;
if (ltype == oldltype || (oldltype == F_WRLCK && ltype == F_RDLCK))
/* nothing to do */
- return (0);
+ goto out;
error = nfsvno_advlock(vp, ltype, first, end, p);
if (error != 0) {
if (cfp != NULL) {
@@ -5116,6 +5173,9 @@ nfsrv_dolocal(vnode_t vp, struct nfslockfile *lfp, int flags, int oldflags,
rlp->rlck_type = oldltype;
LIST_INSERT_HEAD(&lfp->lf_rollback, rlp, rlck_list);
}
+
+out:
+ NFSEXITCODE(error);
return (error);
}
diff --git a/sys/fs/nfsserver/nfs_nfsdsubs.c b/sys/fs/nfsserver/nfs_nfsdsubs.c
index 252eb0d..bd92c3f 100644
--- a/sys/fs/nfsserver/nfs_nfsdsubs.c
+++ b/sys/fs/nfsserver/nfs_nfsdsubs.c
@@ -1418,21 +1418,23 @@ nfsrv_mtofh(struct nfsrv_descript *nd, struct nfsrvfh *fhp)
if (len == 0 && nfs_pubfhset && (nd->nd_flag & ND_NFSV3) &&
nd->nd_procnum == NFSPROC_LOOKUP) {
nd->nd_flag |= ND_PUBLOOKUP;
- return (0);
+ goto nfsmout;
}
if (len < NFSRV_MINFH || len > NFSRV_MAXFH) {
if (nd->nd_flag & ND_NFSV4) {
if (len > 0 && len <= NFSX_V4FHMAX) {
error = nfsm_advance(nd, NFSM_RNDUP(len), -1);
if (error)
- return (error);
+ goto nfsmout;
nd->nd_repstat = NFSERR_BADHANDLE;
- return (0);
+ goto nfsmout;
} else {
- return (EBADRPC);
+ error = EBADRPC;
+ goto nfsmout;
}
} else {
- return (EBADRPC);
+ error = EBADRPC;
+ goto nfsmout;
}
}
copylen = len;
@@ -1450,11 +1452,12 @@ nfsrv_mtofh(struct nfsrv_descript *nd, struct nfsrvfh *fhp)
nd->nd_procnum == NFSPROC_LOOKUP &&
!NFSBCMP((caddr_t)tl, nfs_v2pubfh, NFSX_V2FH)) {
nd->nd_flag |= ND_PUBLOOKUP;
- return (0);
+ goto nfsmout;
}
NFSBCOPY(tl, (caddr_t)fhp->nfsrvfh_data, copylen);
fhp->nfsrvfh_len = copylen;
nfsmout:
+ NFSEXITCODE2(error, nd);
return (error);
}
@@ -1503,22 +1506,28 @@ nfsd_errmap(struct nfsrv_descript *nd)
APPLESTATIC int
nfsrv_checkuidgid(struct nfsrv_descript *nd, struct nfsvattr *nvap)
{
+ int error = 0;
/*
* If not setting either uid nor gid, it's OK.
*/
if (NFSVNO_NOTSETUID(nvap) && NFSVNO_NOTSETGID(nvap))
- return (0);
+ goto out;
if ((NFSVNO_ISSETUID(nvap) && nvap->na_uid == nfsrv_defaultuid)
- || (NFSVNO_ISSETGID(nvap) && nvap->na_gid == nfsrv_defaultgid))
- return (NFSERR_BADOWNER);
+ || (NFSVNO_ISSETGID(nvap) && nvap->na_gid == nfsrv_defaultgid)) {
+ error = NFSERR_BADOWNER;
+ goto out;
+ }
if (nd->nd_cred->cr_uid == 0)
- return (0);
+ goto out;
if ((NFSVNO_ISSETUID(nvap) && nvap->na_uid != nd->nd_cred->cr_uid) ||
(NFSVNO_ISSETGID(nvap) && nvap->na_gid != nd->nd_cred->cr_gid &&
!groupmember(nvap->na_gid, nd->nd_cred)))
- return (NFSERR_PERM);
- return (0);
+ error = NFSERR_PERM;
+
+out:
+ NFSEXITCODE2(error, nd);
+ return (error);
}
/*
@@ -1542,7 +1551,7 @@ nfsrv_fixattr(struct nfsrv_descript *nd, vnode_t vp,
* the V2 and 3 semantics.
*/
if ((nd->nd_flag & ND_NFSV4) == 0)
- return;
+ goto out;
NFSVNO_ATTRINIT(&nva);
NFSZERO_ATTRBIT(&nattrbits);
tuid = nd->nd_cred->cr_uid;
@@ -1604,6 +1613,9 @@ nfsrv_fixattr(struct nfsrv_descript *nd, vnode_t vp,
#endif
NFSCLRBIT_ATTRBIT(attrbitp, NFSATTRBIT_ACL);
nd->nd_cred->cr_uid = tuid;
+
+out:
+ NFSEXITCODE2(0, nd);
}
/*
@@ -1800,10 +1812,12 @@ nfsrv_parsename(struct nfsrv_descript *nd, char *bufp, u_long *hashp,
len = fxdr_unsigned(int, *tl);
if (len > NFS_MAXNAMLEN) {
nd->nd_repstat = NFSERR_NAMETOL;
- return (0);
+ error = 0;
+ goto nfsmout;
} else if (len <= 0) {
nd->nd_repstat = NFSERR_INVAL;
- return (0);
+ error = 0;
+ goto nfsmout;
}
/*
@@ -1815,14 +1829,17 @@ nfsrv_parsename(struct nfsrv_descript *nd, char *bufp, u_long *hashp,
for (i = 0; i < len; i++) {
while (rem == 0) {
md = mbuf_next(md);
- if (md == NULL)
- return (EBADRPC);
+ if (md == NULL) {
+ error = EBADRPC;
+ goto nfsmout;
+ }
fromcp = NFSMTOD(md, caddr_t);
rem = mbuf_len(md);
}
if (*fromcp == '\0') {
nd->nd_repstat = EACCES;
- return (0);
+ error = 0;
+ goto nfsmout;
}
/*
* For lookups on the public filehandle, do some special
@@ -1858,7 +1875,8 @@ nfsrv_parsename(struct nfsrv_descript *nd, char *bufp, u_long *hashp,
*/
if (*fromcp == '/' && pubtype != 1) {
nd->nd_repstat = EACCES;
- return (0);
+ error = 0;
+ goto nfsmout;
}
/*
@@ -1871,7 +1889,8 @@ nfsrv_parsename(struct nfsrv_descript *nd, char *bufp, u_long *hashp,
digit = nfsrv_hexdigit(*fromcp, &error);
if (error) {
nd->nd_repstat = EACCES;
- return (0);
+ error = 0;
+ goto nfsmout;
}
if (percent == 1) {
val = (digit << 4);
@@ -1890,7 +1909,8 @@ nfsrv_parsename(struct nfsrv_descript *nd, char *bufp, u_long *hashp,
*/
if ((len - i) < 3) {
nd->nd_repstat = EACCES;
- return (0);
+ error = 0;
+ goto nfsmout;
}
percent = 1;
} else {
@@ -1908,7 +1928,8 @@ nfsrv_parsename(struct nfsrv_descript *nd, char *bufp, u_long *hashp,
nd->nd_repstat = NFSERR_BADNAME;
else
nd->nd_repstat = EACCES;
- return (0);
+ error = 0;
+ goto nfsmout;
}
hash += ((u_char)*fromcp);
*tocp++ = *fromcp;
@@ -1926,7 +1947,7 @@ nfsrv_parsename(struct nfsrv_descript *nd, char *bufp, u_long *hashp,
} else {
error = nfsm_advance(nd, i, rem);
if (error)
- return (error);
+ goto nfsmout;
}
}
@@ -1939,11 +1960,13 @@ nfsrv_parsename(struct nfsrv_descript *nd, char *bufp, u_long *hashp,
(outlen == 2 && bufp[0] == '.' &&
bufp[1] == '.')) {
nd->nd_repstat = NFSERR_BADNAME;
- return (0);
+ error = 0;
+ goto nfsmout;
}
if (nfsrv_checkutf8((u_int8_t *)bufp, outlen)) {
nd->nd_repstat = NFSERR_INVAL;
- return (0);
+ error = 0;
+ goto nfsmout;
}
}
}
@@ -1952,6 +1975,7 @@ nfsrv_parsename(struct nfsrv_descript *nd, char *bufp, u_long *hashp,
if (hashp != NULL)
*hashp = hash;
nfsmout:
+ NFSEXITCODE2(error, nd);
return (error);
}
diff --git a/sys/fs/smbfs/smbfs_smb.c b/sys/fs/smbfs/smbfs_smb.c
index f58f7de..bebc8ee 100644
--- a/sys/fs/smbfs/smbfs_smb.c
+++ b/sys/fs/smbfs/smbfs_smb.c
@@ -556,7 +556,7 @@ smbfs_smb_setftime(struct smbnode *np, struct timespec *mtime,
/*
* Set DOS file attributes.
- * Looks like this call can be used only if CAP_NT_SMBS bit is on.
+ * Looks like this call can be used only if SMB_CAP_NT_SMBS bit is on.
*/
int
smbfs_smb_setfattrNT(struct smbnode *np, u_int16_t attr, struct timespec *mtime,
diff --git a/sys/geom/cache/g_cache.c b/sys/geom/cache/g_cache.c
index ca05f14..fc3490f 100644
--- a/sys/geom/cache/g_cache.c
+++ b/sys/geom/cache/g_cache.c
@@ -37,6 +37,7 @@ __FBSDID("$FreeBSD$");
#include <sys/sysctl.h>
#include <sys/malloc.h>
#include <sys/queue.h>
+#include <sys/sbuf.h>
#include <sys/time.h>
#include <vm/uma.h>
#include <geom/geom.h>
diff --git a/sys/geom/concat/g_concat.c b/sys/geom/concat/g_concat.c
index 54e0fe0..b2196b7 100644
--- a/sys/geom/concat/g_concat.c
+++ b/sys/geom/concat/g_concat.c
@@ -34,6 +34,7 @@ __FBSDID("$FreeBSD$");
#include <sys/lock.h>
#include <sys/mutex.h>
#include <sys/bio.h>
+#include <sys/sbuf.h>
#include <sys/sysctl.h>
#include <sys/malloc.h>
#include <geom/geom.h>
diff --git a/sys/geom/eli/g_eli.c b/sys/geom/eli/g_eli.c
index 30497a4..6941470 100644
--- a/sys/geom/eli/g_eli.c
+++ b/sys/geom/eli/g_eli.c
@@ -35,6 +35,7 @@ __FBSDID("$FreeBSD$");
#include <sys/lock.h>
#include <sys/mutex.h>
#include <sys/bio.h>
+#include <sys/sbuf.h>
#include <sys/sysctl.h>
#include <sys/malloc.h>
#include <sys/eventhandler.h>
diff --git a/sys/geom/gate/g_gate.c b/sys/geom/gate/g_gate.c
index 22338a5..886b993 100644
--- a/sys/geom/gate/g_gate.c
+++ b/sys/geom/gate/g_gate.c
@@ -45,6 +45,7 @@ __FBSDID("$FreeBSD$");
#include <sys/proc.h>
#include <sys/limits.h>
#include <sys/queue.h>
+#include <sys/sbuf.h>
#include <sys/sysctl.h>
#include <sys/signalvar.h>
#include <sys/time.h>
diff --git a/sys/geom/geom.h b/sys/geom/geom.h
index 6256572..2546b56 100644
--- a/sys/geom/geom.h
+++ b/sys/geom/geom.h
@@ -44,7 +44,6 @@
#include <sys/queue.h>
#include <sys/ioccom.h>
#include <sys/conf.h>
-#include <sys/sbuf.h>
#include <sys/module.h>
struct g_class;
@@ -90,6 +89,7 @@ typedef void g_dumpconf_t (struct sbuf *, const char *indent, struct g_geom *,
struct g_class {
const char *name;
u_int version;
+ u_int spare0;
g_taste_t *taste;
g_config_t *config;
g_ctl_req_t *ctlreq;
@@ -106,6 +106,8 @@ struct g_class {
g_access_t *access;
g_orphan_t *orphan;
g_ioctl_t *ioctl;
+ void *spare1;
+ void *spare2;
/*
* The remaining elements are private
*/
@@ -135,6 +137,8 @@ struct g_geom {
g_access_t *access;
g_orphan_t *orphan;
g_ioctl_t *ioctl;
+ void *spare0;
+ void *spare1;
void *softc;
unsigned flags;
#define G_GEOM_WITHER 1
diff --git a/sys/geom/geom_bsd.c b/sys/geom/geom_bsd.c
index c5b9252..60fc50c 100644
--- a/sys/geom/geom_bsd.c
+++ b/sys/geom/geom_bsd.c
@@ -57,6 +57,7 @@ __FBSDID("$FreeBSD$");
#include <sys/errno.h>
#include <sys/disklabel.h>
#include <sys/gpt.h>
+#include <sys/sbuf.h>
#include <sys/uuid.h>
#include <geom/geom.h>
#include <geom/geom_slice.h>
diff --git a/sys/geom/geom_ccd.c b/sys/geom/geom_ccd.c
index 1659321..b2ccaba 100644
--- a/sys/geom/geom_ccd.c
+++ b/sys/geom/geom_ccd.c
@@ -58,6 +58,7 @@ __FBSDID("$FreeBSD$");
#include <sys/module.h>
#include <sys/bio.h>
#include <sys/malloc.h>
+#include <sys/sbuf.h>
#include <geom/geom.h>
/*
diff --git a/sys/geom/geom_disk.c b/sys/geom/geom_disk.c
index 17cae68..3072895 100644
--- a/sys/geom/geom_disk.c
+++ b/sys/geom/geom_disk.c
@@ -46,6 +46,7 @@ __FBSDID("$FreeBSD$");
#include <sys/ctype.h>
#include <sys/fcntl.h>
#include <sys/malloc.h>
+#include <sys/sbuf.h>
#include <sys/sysctl.h>
#include <sys/devicestat.h>
#include <machine/md_var.h>
diff --git a/sys/geom/geom_pc98.c b/sys/geom/geom_pc98.c
index ffc48bd..71c194d 100644
--- a/sys/geom/geom_pc98.c
+++ b/sys/geom/geom_pc98.c
@@ -43,6 +43,7 @@ __FBSDID("$FreeBSD$");
#include <sys/bio.h>
#include <sys/lock.h>
#include <sys/mutex.h>
+#include <sys/sbuf.h>
#include <sys/diskpc98.h>
#include <geom/geom.h>
diff --git a/sys/geom/geom_sunlabel.c b/sys/geom/geom_sunlabel.c
index f05b7e6..5ac35ad 100644
--- a/sys/geom/geom_sunlabel.c
+++ b/sys/geom/geom_sunlabel.c
@@ -47,6 +47,7 @@ __FBSDID("$FreeBSD$");
#include <sys/lock.h>
#include <sys/mutex.h>
#include <sys/md5.h>
+#include <sys/sbuf.h>
#include <sys/sun_disklabel.h>
#include <geom/geom.h>
#include <geom/geom_slice.h>
diff --git a/sys/geom/geom_vfs.c b/sys/geom/geom_vfs.c
index 9eaf6b1..f90321d 100644
--- a/sys/geom/geom_vfs.c
+++ b/sys/geom/geom_vfs.c
@@ -171,7 +171,7 @@ g_vfs_open(struct vnode *vp, struct g_consumer **cpp, const char *fsname, int wr
gp = g_new_geomf(&g_vfs_class, "%s.%s", fsname, pp->name);
cp = g_new_consumer(gp);
g_attach(cp, pp);
- error = g_access(cp, 1, wr, 1);
+ error = g_access(cp, 1, wr, wr);
if (error) {
g_wither_geom(gp, ENXIO);
return (error);
diff --git a/sys/geom/label/g_label_gpt.c b/sys/geom/label/g_label_gpt.c
index 3701495..ecab01b 100644
--- a/sys/geom/label/g_label_gpt.c
+++ b/sys/geom/label/g_label_gpt.c
@@ -33,6 +33,7 @@ __FBSDID("$FreeBSD$");
#include <sys/malloc.h>
#include <sys/kobj.h>
#include <sys/gpt.h>
+#include <sys/sbuf.h>
#include <geom/geom.h>
#include <geom/label/g_label.h>
diff --git a/sys/geom/mirror/g_mirror.c b/sys/geom/mirror/g_mirror.c
index a2780d7..6688864 100644
--- a/sys/geom/mirror/g_mirror.c
+++ b/sys/geom/mirror/g_mirror.c
@@ -35,6 +35,7 @@ __FBSDID("$FreeBSD$");
#include <sys/lock.h>
#include <sys/mutex.h>
#include <sys/bio.h>
+#include <sys/sbuf.h>
#include <sys/sysctl.h>
#include <sys/malloc.h>
#include <sys/eventhandler.h>
diff --git a/sys/geom/mountver/g_mountver.c b/sys/geom/mountver/g_mountver.c
index c653090..b2e1a63 100644
--- a/sys/geom/mountver/g_mountver.c
+++ b/sys/geom/mountver/g_mountver.c
@@ -36,6 +36,7 @@ __FBSDID("$FreeBSD$");
#include <sys/mutex.h>
#include <sys/bio.h>
#include <sys/disk.h>
+#include <sys/sbuf.h>
#include <sys/sysctl.h>
#include <sys/malloc.h>
#include <sys/eventhandler.h>
diff --git a/sys/geom/multipath/g_multipath.c b/sys/geom/multipath/g_multipath.c
index 6720a87..947cce0 100644
--- a/sys/geom/multipath/g_multipath.c
+++ b/sys/geom/multipath/g_multipath.c
@@ -38,6 +38,7 @@ __FBSDID("$FreeBSD$");
#include <sys/lock.h>
#include <sys/mutex.h>
#include <sys/bio.h>
+#include <sys/sbuf.h>
#include <sys/sysctl.h>
#include <sys/kthread.h>
#include <sys/malloc.h>
diff --git a/sys/geom/nop/g_nop.c b/sys/geom/nop/g_nop.c
index c1a2333..675f06e 100644
--- a/sys/geom/nop/g_nop.c
+++ b/sys/geom/nop/g_nop.c
@@ -34,6 +34,7 @@ __FBSDID("$FreeBSD$");
#include <sys/lock.h>
#include <sys/mutex.h>
#include <sys/bio.h>
+#include <sys/sbuf.h>
#include <sys/sysctl.h>
#include <sys/malloc.h>
#include <geom/geom.h>
diff --git a/sys/geom/raid/g_raid.c b/sys/geom/raid/g_raid.c
index 1fdd421..3c4a3f8 100644
--- a/sys/geom/raid/g_raid.c
+++ b/sys/geom/raid/g_raid.c
@@ -35,6 +35,7 @@ __FBSDID("$FreeBSD$");
#include <sys/lock.h>
#include <sys/mutex.h>
#include <sys/bio.h>
+#include <sys/sbuf.h>
#include <sys/sysctl.h>
#include <sys/malloc.h>
#include <sys/eventhandler.h>
diff --git a/sys/geom/raid3/g_raid3.c b/sys/geom/raid3/g_raid3.c
index 67e4419..eef7c10 100644
--- a/sys/geom/raid3/g_raid3.c
+++ b/sys/geom/raid3/g_raid3.c
@@ -35,6 +35,7 @@ __FBSDID("$FreeBSD$");
#include <sys/lock.h>
#include <sys/mutex.h>
#include <sys/bio.h>
+#include <sys/sbuf.h>
#include <sys/sysctl.h>
#include <sys/malloc.h>
#include <sys/eventhandler.h>
diff --git a/sys/geom/sched/g_sched.c b/sys/geom/sched/g_sched.c
index dd5120f..1010229 100644
--- a/sys/geom/sched/g_sched.c
+++ b/sys/geom/sched/g_sched.c
@@ -111,6 +111,7 @@
#include <sys/bio.h>
#include <sys/limits.h>
#include <sys/hash.h>
+#include <sys/sbuf.h>
#include <sys/sysctl.h>
#include <sys/malloc.h>
#include <sys/proc.h> /* we access curthread */
diff --git a/sys/geom/sched/gs_rr.c b/sys/geom/sched/gs_rr.c
index 39b976a..1fc8cda 100644
--- a/sys/geom/sched/gs_rr.c
+++ b/sys/geom/sched/gs_rr.c
@@ -59,6 +59,7 @@
#include <sys/module.h>
#include <sys/proc.h>
#include <sys/queue.h>
+#include <sys/sbuf.h>
#include <sys/sysctl.h>
#include "gs_scheduler.h"
diff --git a/sys/geom/shsec/g_shsec.c b/sys/geom/shsec/g_shsec.c
index 4bf918f..abf0317 100644
--- a/sys/geom/shsec/g_shsec.c
+++ b/sys/geom/shsec/g_shsec.c
@@ -34,6 +34,7 @@ __FBSDID("$FreeBSD$");
#include <sys/lock.h>
#include <sys/mutex.h>
#include <sys/bio.h>
+#include <sys/sbuf.h>
#include <sys/sysctl.h>
#include <sys/malloc.h>
#include <vm/uma.h>
diff --git a/sys/geom/stripe/g_stripe.c b/sys/geom/stripe/g_stripe.c
index 08841b5..bb94631 100644
--- a/sys/geom/stripe/g_stripe.c
+++ b/sys/geom/stripe/g_stripe.c
@@ -34,6 +34,7 @@ __FBSDID("$FreeBSD$");
#include <sys/lock.h>
#include <sys/mutex.h>
#include <sys/bio.h>
+#include <sys/sbuf.h>
#include <sys/sysctl.h>
#include <sys/malloc.h>
#include <vm/uma.h>
diff --git a/sys/geom/vinum/geom_vinum.c b/sys/geom/vinum/geom_vinum.c
index 107b80d..ab4d1a4 100644
--- a/sys/geom/vinum/geom_vinum.c
+++ b/sys/geom/vinum/geom_vinum.c
@@ -37,6 +37,7 @@ __FBSDID("$FreeBSD$");
#include <sys/malloc.h>
#include <sys/module.h>
#include <sys/mutex.h>
+#include <sys/sbuf.h>
#include <sys/sysctl.h>
#include <sys/systm.h>
diff --git a/sys/geom/vinum/geom_vinum_drive.c b/sys/geom/vinum/geom_vinum_drive.c
index f782fd0..877eed4 100644
--- a/sys/geom/vinum/geom_vinum_drive.c
+++ b/sys/geom/vinum/geom_vinum_drive.c
@@ -27,8 +27,10 @@
#include <sys/cdefs.h>
__FBSDID("$FreeBSD$");
+#include <sys/types.h>
#include <sys/endian.h>
#include <sys/malloc.h>
+#include <sys/sbuf.h>
#include <sys/systm.h>
#include <geom/geom.h>
diff --git a/sys/geom/vinum/geom_vinum_list.c b/sys/geom/vinum/geom_vinum_list.c
index 00b89495..3d44cd4 100644
--- a/sys/geom/vinum/geom_vinum_list.c
+++ b/sys/geom/vinum/geom_vinum_list.c
@@ -28,8 +28,10 @@
#include <sys/cdefs.h>
__FBSDID("$FreeBSD$");
+#include <sys/types.h>
#include <sys/libkern.h>
#include <sys/malloc.h>
+#include <sys/sbuf.h>
#include <geom/geom.h>
#include <geom/vinum/geom_vinum_var.h>
diff --git a/sys/geom/vinum/geom_vinum_subr.c b/sys/geom/vinum/geom_vinum_subr.c
index e381ff2..ea7c7e7 100644
--- a/sys/geom/vinum/geom_vinum_subr.c
+++ b/sys/geom/vinum/geom_vinum_subr.c
@@ -44,6 +44,7 @@ __FBSDID("$FreeBSD$");
#include <sys/param.h>
#include <sys/malloc.h>
+#include <sys/sbuf.h>
#include <sys/systm.h>
#include <geom/geom.h>
diff --git a/sys/geom/virstor/g_virstor.c b/sys/geom/virstor/g_virstor.c
index 509aca1..e9bee5c 100644
--- a/sys/geom/virstor/g_virstor.c
+++ b/sys/geom/virstor/g_virstor.c
@@ -40,6 +40,7 @@ __FBSDID("$FreeBSD$");
#include <sys/mutex.h>
#include <sys/sx.h>
#include <sys/bio.h>
+#include <sys/sbuf.h>
#include <sys/sysctl.h>
#include <sys/malloc.h>
#include <sys/time.h>
diff --git a/sys/i386/Makefile b/sys/i386/Makefile
index baff9d6..f6ecf7f 100644
--- a/sys/i386/Makefile
+++ b/sys/i386/Makefile
@@ -25,10 +25,9 @@ links::
(cd $$i && { rm -f tags; ln -s ../tags tags; }) done
SI386= ${SYS}/i386/acpica/*.[ch] ${SYS}/i386/bios/*.[ch] \
- ${SYS}/i386/cpufreq/*.[ch] ${SYS}/i386/pci/*.[ch] \
${SYS}/i386/i386/*.[ch] ${SYS}/i386/ibcs2/*.[ch] \
${SYS}/i386/include/*.[ch] ${SYS}/i386/isa/*.[ch] \
- ${SYS}/i386/linux/*.[ch]
+ ${SYS}/i386/linux/*.[ch] ${SYS}/i386/pci/*.[ch]
AI386= ${SYS}/i386/i386/*.s
tags::
diff --git a/sys/i386/i386/genassym.c b/sys/i386/i386/genassym.c
index 5ae9002..9acc4f4 100644
--- a/sys/i386/i386/genassym.c
+++ b/sys/i386/i386/genassym.c
@@ -180,7 +180,6 @@ ASSYM(UC_GS, offsetof(ucontext_t, uc_mcontext.mc_gs));
ASSYM(ENOENT, ENOENT);
ASSYM(EFAULT, EFAULT);
ASSYM(ENAMETOOLONG, ENAMETOOLONG);
-ASSYM(MAXCPU, MAXCPU);
ASSYM(MAXCOMLEN, MAXCOMLEN);
ASSYM(MAXPATHLEN, MAXPATHLEN);
ASSYM(BOOTINFO_SIZE, sizeof(struct bootinfo));
diff --git a/sys/i386/i386/intr_machdep.c b/sys/i386/i386/intr_machdep.c
index 56529f7..eb6bfa1 100644
--- a/sys/i386/i386/intr_machdep.c
+++ b/sys/i386/i386/intr_machdep.c
@@ -71,6 +71,11 @@ static STAILQ_HEAD(, pic) pics;
static int assign_cpu;
#endif
+u_long intrcnt[INTRCNT_COUNT];
+char intrnames[INTRCNT_COUNT * (MAXCOMLEN + 1)];
+size_t sintrcnt = sizeof(intrcnt);
+size_t sintrnames = sizeof(intrnames);
+
static int intr_assign_cpu(void *arg, u_char cpu);
static void intr_disable_src(void *arg);
static void intr_init(void *__dummy);
diff --git a/sys/i386/i386/mp_machdep.c b/sys/i386/i386/mp_machdep.c
index 78c90c0..0900901 100644
--- a/sys/i386/i386/mp_machdep.c
+++ b/sys/i386/i386/mp_machdep.c
@@ -658,12 +658,11 @@ cpu_mp_announce(void)
void
init_secondary(void)
{
- cpuset_t tcpuset, tallcpus;
struct pcpu *pc;
vm_offset_t addr;
int gsel_tss;
int x, myid;
- u_int cr0;
+ u_int cpuid, cr0;
/* bootAP is set in start_ap() to our ID. */
myid = bootAP;
@@ -758,8 +757,9 @@ init_secondary(void)
#endif
/* A quick check from sanity claus */
+ cpuid = PCPU_GET(cpuid);
if (PCPU_GET(apic_id) != lapic_id()) {
- printf("SMP: cpuid = %d\n", PCPU_GET(cpuid));
+ printf("SMP: cpuid = %d\n", cpuid);
printf("SMP: actual apic_id = %d\n", lapic_id());
printf("SMP: correct apic_id = %d\n", PCPU_GET(apic_id));
panic("cpuid mismatch! boom!!");
@@ -781,19 +781,13 @@ init_secondary(void)
smp_cpus++;
- CTR1(KTR_SMP, "SMP: AP CPU #%d Launched", PCPU_GET(cpuid));
- printf("SMP: AP CPU #%d Launched!\n", PCPU_GET(cpuid));
- tcpuset = PCPU_GET(cpumask);
+ CTR1(KTR_SMP, "SMP: AP CPU #%d Launched", cpuid);
+ printf("SMP: AP CPU #%d Launched!\n", cpuid);
/* Determine if we are a logical CPU. */
/* XXX Calculation depends on cpu_logical being a power of 2, e.g. 2 */
if (cpu_logical > 1 && PCPU_GET(apic_id) % cpu_logical != 0)
- CPU_OR(&logical_cpus_mask, &tcpuset);
-
- /* Build our map of 'other' CPUs. */
- tallcpus = all_cpus;
- CPU_NAND(&tallcpus, &tcpuset);
- PCPU_SET(other_cpus, tallcpus);
+ CPU_SET(cpuid, &logical_cpus_mask);
if (bootverbose)
lapic_dump("AP");
@@ -934,7 +928,6 @@ assign_cpu_ids(void)
static int
start_all_aps(void)
{
- cpuset_t tallcpus;
#ifndef PC98
u_char mpbiosreason;
#endif
@@ -997,11 +990,6 @@ start_all_aps(void)
CPU_SET(cpu, &all_cpus); /* record AP in CPU map */
}
- /* build our map of 'other' CPUs */
- tallcpus = all_cpus;
- CPU_NAND(&tallcpus, PCPU_PTR(cpumask));
- PCPU_SET(other_cpus, tallcpus);
-
/* restore the warmstart vector */
*(u_int32_t *) WARMBOOT_OFF = mpbioswarmvec;
@@ -1253,9 +1241,7 @@ smp_targeted_tlb_shootdown(cpuset_t mask, u_int vector, vm_offset_t addr1, vm_of
if (othercpus < 1)
return;
} else {
- sched_pin();
- CPU_NAND(&mask, PCPU_PTR(cpumask));
- sched_unpin();
+ CPU_CLR(PCPU_GET(cpuid), &mask);
if (CPU_EMPTY(&mask))
return;
}
@@ -1452,11 +1438,12 @@ ipi_cpu(int cpu, u_int ipi)
void
ipi_all_but_self(u_int ipi)
{
+ cpuset_t other_cpus;
- sched_pin();
+ other_cpus = all_cpus;
+ CPU_CLR(PCPU_GET(cpuid), &other_cpus);
if (IPI_IS_BITMAPED(ipi)) {
- ipi_selected(PCPU_GET(other_cpus), ipi);
- sched_unpin();
+ ipi_selected(other_cpus, ipi);
return;
}
@@ -1466,8 +1453,7 @@ ipi_all_but_self(u_int ipi)
* Set the mask of receiving CPUs for this purpose.
*/
if (ipi == IPI_STOP_HARD)
- CPU_OR_ATOMIC(&ipi_nmi_pending, PCPU_PTR(other_cpus));
- sched_unpin();
+ CPU_OR_ATOMIC(&ipi_nmi_pending, &other_cpus);
CTR2(KTR_SMP, "%s: ipi: %x", __func__, ipi);
lapic_ipi_vectored(ipi, APIC_IPI_DEST_OTHERS);
@@ -1476,7 +1462,7 @@ ipi_all_but_self(u_int ipi)
int
ipi_nmi_handler()
{
- cpuset_t cpumask;
+ u_int cpuid;
/*
* As long as there is not a simple way to know about a NMI's
@@ -1484,13 +1470,11 @@ ipi_nmi_handler()
* the global pending bitword an IPI_STOP_HARD has been issued
* and should be handled.
*/
- sched_pin();
- cpumask = PCPU_GET(cpumask);
- sched_unpin();
- if (!CPU_OVERLAP(&ipi_nmi_pending, &cpumask))
+ cpuid = PCPU_GET(cpuid);
+ if (!CPU_ISSET(cpuid, &ipi_nmi_pending))
return (1);
- CPU_NAND_ATOMIC(&ipi_nmi_pending, &cpumask);
+ CPU_CLR_ATOMIC(cpuid, &ipi_nmi_pending);
cpustop_handler();
return (0);
}
@@ -1502,25 +1486,21 @@ ipi_nmi_handler()
void
cpustop_handler(void)
{
- cpuset_t cpumask;
u_int cpu;
- sched_pin();
cpu = PCPU_GET(cpuid);
- cpumask = PCPU_GET(cpumask);
- sched_unpin();
savectx(&stoppcbs[cpu]);
/* Indicate that we are stopped */
- CPU_OR_ATOMIC(&stopped_cpus, &cpumask);
+ CPU_SET_ATOMIC(cpu, &stopped_cpus);
/* Wait for restart */
- while (!CPU_OVERLAP(&started_cpus, &cpumask))
+ while (!CPU_ISSET(cpu, &started_cpus))
ia32_pause();
- CPU_NAND_ATOMIC(&started_cpus, &cpumask);
- CPU_NAND_ATOMIC(&stopped_cpus, &cpumask);
+ CPU_CLR_ATOMIC(cpu, &started_cpus);
+ CPU_CLR_ATOMIC(cpu, &stopped_cpus);
if (cpu == 0 && cpustop_restartfunc != NULL) {
cpustop_restartfunc();
diff --git a/sys/i386/i386/pmap.c b/sys/i386/i386/pmap.c
index 45d19b2..002e529 100644
--- a/sys/i386/i386/pmap.c
+++ b/sys/i386/i386/pmap.c
@@ -932,16 +932,18 @@ pmap_update_pde_invalidate(vm_offset_t va, pd_entry_t newpde)
void
pmap_invalidate_page(pmap_t pmap, vm_offset_t va)
{
- cpuset_t cpumask, other_cpus;
+ cpuset_t other_cpus;
+ u_int cpuid;
sched_pin();
if (pmap == kernel_pmap || !CPU_CMP(&pmap->pm_active, &all_cpus)) {
invlpg(va);
smp_invlpg(va);
} else {
- cpumask = PCPU_GET(cpumask);
- other_cpus = PCPU_GET(other_cpus);
- if (CPU_OVERLAP(&pmap->pm_active, &cpumask))
+ cpuid = PCPU_GET(cpuid);
+ other_cpus = all_cpus;
+ CPU_CLR(cpuid, &other_cpus);
+ if (CPU_ISSET(cpuid, &pmap->pm_active))
invlpg(va);
CPU_AND(&other_cpus, &pmap->pm_active);
if (!CPU_EMPTY(&other_cpus))
@@ -953,8 +955,9 @@ pmap_invalidate_page(pmap_t pmap, vm_offset_t va)
void
pmap_invalidate_range(pmap_t pmap, vm_offset_t sva, vm_offset_t eva)
{
- cpuset_t cpumask, other_cpus;
+ cpuset_t other_cpus;
vm_offset_t addr;
+ u_int cpuid;
sched_pin();
if (pmap == kernel_pmap || !CPU_CMP(&pmap->pm_active, &all_cpus)) {
@@ -962,9 +965,10 @@ pmap_invalidate_range(pmap_t pmap, vm_offset_t sva, vm_offset_t eva)
invlpg(addr);
smp_invlpg_range(sva, eva);
} else {
- cpumask = PCPU_GET(cpumask);
- other_cpus = PCPU_GET(other_cpus);
- if (CPU_OVERLAP(&pmap->pm_active, &cpumask))
+ cpuid = PCPU_GET(cpuid);
+ other_cpus = all_cpus;
+ CPU_CLR(cpuid, &other_cpus);
+ if (CPU_ISSET(cpuid, &pmap->pm_active))
for (addr = sva; addr < eva; addr += PAGE_SIZE)
invlpg(addr);
CPU_AND(&other_cpus, &pmap->pm_active);
@@ -977,16 +981,18 @@ pmap_invalidate_range(pmap_t pmap, vm_offset_t sva, vm_offset_t eva)
void
pmap_invalidate_all(pmap_t pmap)
{
- cpuset_t cpumask, other_cpus;
+ cpuset_t other_cpus;
+ u_int cpuid;
sched_pin();
if (pmap == kernel_pmap || !CPU_CMP(&pmap->pm_active, &all_cpus)) {
invltlb();
smp_invltlb();
} else {
- cpumask = PCPU_GET(cpumask);
- other_cpus = PCPU_GET(other_cpus);
- if (CPU_OVERLAP(&pmap->pm_active, &cpumask))
+ cpuid = PCPU_GET(cpuid);
+ other_cpus = all_cpus;
+ CPU_CLR(cpuid, &other_cpus);
+ if (CPU_ISSET(cpuid, &pmap->pm_active))
invltlb();
CPU_AND(&other_cpus, &pmap->pm_active);
if (!CPU_EMPTY(&other_cpus))
@@ -1006,11 +1012,11 @@ pmap_invalidate_cache(void)
}
struct pde_action {
- cpuset_t store; /* processor that updates the PDE */
cpuset_t invalidate; /* processors that invalidate their TLB */
vm_offset_t va;
pd_entry_t *pde;
pd_entry_t newpde;
+ u_int store; /* processor that updates the PDE */
};
static void
@@ -1020,9 +1026,7 @@ pmap_update_pde_kernel(void *arg)
pd_entry_t *pde;
pmap_t pmap;
- sched_pin();
- if (!CPU_CMP(&act->store, PCPU_PTR(cpumask))) {
- sched_unpin();
+ if (act->store == PCPU_GET(cpuid)) {
/*
* Elsewhere, this operation requires allpmaps_lock for
@@ -1033,8 +1037,7 @@ pmap_update_pde_kernel(void *arg)
pde = pmap_pde(pmap, act->va);
pde_store(pde, act->newpde);
}
- } else
- sched_unpin();
+ }
}
static void
@@ -1042,12 +1045,8 @@ pmap_update_pde_user(void *arg)
{
struct pde_action *act = arg;
- sched_pin();
- if (!CPU_CMP(&act->store, PCPU_PTR(cpumask))) {
- sched_unpin();
+ if (act->store == PCPU_GET(cpuid))
pde_store(act->pde, act->newpde);
- } else
- sched_unpin();
}
static void
@@ -1055,12 +1054,8 @@ pmap_update_pde_teardown(void *arg)
{
struct pde_action *act = arg;
- sched_pin();
- if (CPU_OVERLAP(&act->invalidate, PCPU_PTR(cpumask))) {
- sched_unpin();
+ if (CPU_ISSET(PCPU_GET(cpuid), &act->invalidate))
pmap_update_pde_invalidate(act->va, act->newpde);
- } else
- sched_unpin();
}
/*
@@ -1075,23 +1070,25 @@ static void
pmap_update_pde(pmap_t pmap, vm_offset_t va, pd_entry_t *pde, pd_entry_t newpde)
{
struct pde_action act;
- cpuset_t active, cpumask, other_cpus;
+ cpuset_t active, other_cpus;
+ u_int cpuid;
sched_pin();
- cpumask = PCPU_GET(cpumask);
- other_cpus = PCPU_GET(other_cpus);
+ cpuid = PCPU_GET(cpuid);
+ other_cpus = all_cpus;
+ CPU_CLR(cpuid, &other_cpus);
if (pmap == kernel_pmap)
active = all_cpus;
else
active = pmap->pm_active;
if (CPU_OVERLAP(&active, &other_cpus)) {
- act.store = cpumask;
+ act.store = cpuid;
act.invalidate = active;
act.va = va;
act.pde = pde;
act.newpde = newpde;
- CPU_OR(&cpumask, &active);
- smp_rendezvous_cpus(cpumask,
+ CPU_SET(cpuid, &active);
+ smp_rendezvous_cpus(active,
smp_no_rendevous_barrier, pmap == kernel_pmap ?
pmap_update_pde_kernel : pmap_update_pde_user,
pmap_update_pde_teardown, &act);
@@ -1100,7 +1097,7 @@ pmap_update_pde(pmap_t pmap, vm_offset_t va, pd_entry_t *pde, pd_entry_t newpde)
pmap_kenter_pde(va, newpde);
else
pde_store(pde, newpde);
- if (CPU_OVERLAP(&active, &cpumask))
+ if (CPU_ISSET(cpuid, &active))
pmap_update_pde_invalidate(va, newpde);
}
sched_unpin();
@@ -1925,12 +1922,12 @@ pmap_lazyfix_action(void)
}
static void
-pmap_lazyfix_self(cpuset_t mymask)
+pmap_lazyfix_self(u_int cpuid)
{
if (rcr3() == lazyptd)
load_cr3(PCPU_GET(curpcb)->pcb_cr3);
- CPU_NAND_ATOMIC(lazymask, &mymask);
+ CPU_CLR_ATOMIC(cpuid, lazymask);
}
@@ -1938,7 +1935,7 @@ static void
pmap_lazyfix(pmap_t pmap)
{
cpuset_t mymask, mask;
- u_int spins;
+ u_int cpuid, spins;
int lsb;
mask = pmap->pm_active;
@@ -1956,10 +1953,13 @@ pmap_lazyfix(pmap_t pmap)
#else
lazyptd = vtophys(pmap->pm_pdir);
#endif
- mymask = PCPU_GET(cpumask);
+ cpuid = PCPU_GET(cpuid);
+
+ /* Use a cpuset just for having an easy check. */
+ CPU_SETOF(cpuid, &mymask);
if (!CPU_CMP(&mask, &mymask)) {
lazymask = &pmap->pm_active;
- pmap_lazyfix_self(mymask);
+ pmap_lazyfix_self(cpuid);
} else {
atomic_store_rel_int((u_int *)&lazymask,
(u_int)&pmap->pm_active);
@@ -2188,7 +2188,7 @@ pmap_collect(pmap_t locked_pmap, struct vpgqueues *vpq)
sched_pin();
TAILQ_FOREACH(m, &vpq->pl, pageq) {
- if (m->hold_count || m->busy)
+ if ((m->flags & PG_MARKER) != 0 || m->hold_count || m->busy)
continue;
TAILQ_FOREACH_SAFE(pv, &m->md.pv_list, pv_list, next_pv) {
va = pv->pv_va;
@@ -5098,17 +5098,19 @@ void
pmap_activate(struct thread *td)
{
pmap_t pmap, oldpmap;
+ u_int cpuid;
u_int32_t cr3;
critical_enter();
pmap = vmspace_pmap(td->td_proc->p_vmspace);
oldpmap = PCPU_GET(curpmap);
+ cpuid = PCPU_GET(cpuid);
#if defined(SMP)
- CPU_NAND_ATOMIC(&oldpmap->pm_active, PCPU_PTR(cpumask));
- CPU_OR_ATOMIC(&pmap->pm_active, PCPU_PTR(cpumask));
+ CPU_CLR_ATOMIC(cpuid, &oldpmap->pm_active);
+ CPU_SET_ATOMIC(cpuid, &pmap->pm_active);
#else
- CPU_NAND(&oldpmap->pm_active, PCPU_PTR(cpumask));
- CPU_OR(&pmap->pm_active, PCPU_PTR(cpumask));
+ CPU_CLR(cpuid, &oldpmap->pm_active);
+ CPU_SET(cpuid, &pmap->pm_active);
#endif
#ifdef PAE
cr3 = vtophys(pmap->pm_pdpt);
diff --git a/sys/i386/i386/support.s b/sys/i386/i386/support.s
index 0c55f6f..29a258c 100644
--- a/sys/i386/i386/support.s
+++ b/sys/i386/i386/support.s
@@ -41,18 +41,6 @@
#define IDXSHIFT 10
- .data
- ALIGN_DATA
- .globl intrcnt, eintrcnt
-intrcnt:
- .space INTRCNT_COUNT * 4
-eintrcnt:
-
- .globl intrnames, eintrnames
-intrnames:
- .space INTRCNT_COUNT * (MAXCOMLEN + 1)
-eintrnames:
-
.text
/*
diff --git a/sys/i386/i386/vm_machdep.c b/sys/i386/i386/vm_machdep.c
index a084e09..0a7bc21 100644
--- a/sys/i386/i386/vm_machdep.c
+++ b/sys/i386/i386/vm_machdep.c
@@ -602,8 +602,8 @@ cpu_reset()
u_int cnt;
if (smp_active) {
- sched_pin();
- map = PCPU_GET(other_cpus);
+ map = all_cpus;
+ CPU_CLR(PCPU_GET(cpuid), &map);
CPU_NAND(&map, &stopped_cpus);
if (!CPU_EMPTY(&map)) {
printf("cpu_reset: Stopping other CPUs\n");
@@ -612,7 +612,6 @@ cpu_reset()
if (PCPU_GET(cpuid) != 0) {
cpu_reset_proxyid = PCPU_GET(cpuid);
- sched_unpin();
cpustop_restartfunc = cpu_reset_proxy;
cpu_reset_proxy_active = 0;
printf("cpu_reset: Restarting BSP\n");
@@ -632,8 +631,7 @@ cpu_reset()
while (1);
/* NOTREACHED */
- } else
- sched_unpin();
+ }
DELAY(1000000);
}
@@ -802,7 +800,8 @@ sf_buf_alloc(struct vm_page *m, int flags)
struct sf_head *hash_list;
struct sf_buf *sf;
#ifdef SMP
- cpuset_t cpumask, other_cpus;
+ cpuset_t other_cpus;
+ u_int cpuid;
#endif
int error;
@@ -877,13 +876,14 @@ sf_buf_alloc(struct vm_page *m, int flags)
CPU_ZERO(&sf->cpumask);
shootdown:
sched_pin();
- cpumask = PCPU_GET(cpumask);
- if (!CPU_OVERLAP(&cpumask, &sf->cpumask)) {
- CPU_OR(&sf->cpumask, &cpumask);
+ cpuid = PCPU_GET(cpuid);
+ if (!CPU_ISSET(cpuid, &sf->cpumask)) {
+ CPU_SET(cpuid, &sf->cpumask);
invlpg(sf->kva);
}
if ((flags & SFB_CPUPRIVATE) == 0) {
- other_cpus = PCPU_GET(other_cpus);
+ other_cpus = all_cpus;
+ CPU_CLR(cpuid, &other_cpus);
CPU_NAND(&other_cpus, &sf->cpumask);
if (!CPU_EMPTY(&other_cpus)) {
CPU_OR(&sf->cpumask, &other_cpus);
diff --git a/sys/i386/ibcs2/ibcs2_ioctl.c b/sys/i386/ibcs2/ibcs2_ioctl.c
index 17749db..90184e3 100644
--- a/sys/i386/ibcs2/ibcs2_ioctl.c
+++ b/sys/i386/ibcs2/ibcs2_ioctl.c
@@ -654,12 +654,12 @@ ibcs2_ioctl(td, uap)
break;
case IBCS2_GIO_KEYMAP: /* Get keyboard map table */
- uap->cmd = GIO_KEYMAP;
+ uap->cmd = OGIO_KEYMAP;
error = ioctl(td, (struct ioctl_args *)uap);
break;
case IBCS2_PIO_KEYMAP: /* Set keyboard map table */
- uap->cmd = PIO_KEYMAP;
+ uap->cmd = OPIO_KEYMAP;
error = ioctl(td, (struct ioctl_args *)uap);
break;
diff --git a/sys/i386/include/cpufunc.h b/sys/i386/include/cpufunc.h
index d6ec534..7116f76 100644
--- a/sys/i386/include/cpufunc.h
+++ b/sys/i386/include/cpufunc.h
@@ -133,16 +133,18 @@ enable_intr(void)
}
static __inline void
-cpu_monitor(const void *addr, int extensions, int hints)
+cpu_monitor(const void *addr, u_long extensions, u_int hints)
{
- __asm __volatile("monitor;"
- : :"a" (addr), "c" (extensions), "d"(hints));
+
+ __asm __volatile("monitor"
+ : : "a" (addr), "c" (extensions), "d" (hints));
}
static __inline void
-cpu_mwait(int extensions, int hints)
+cpu_mwait(u_long extensions, u_int hints)
{
- __asm __volatile("mwait;" : :"a" (hints), "c" (extensions));
+
+ __asm __volatile("mwait" : : "a" (hints), "c" (extensions));
}
static __inline void
diff --git a/sys/i386/xen/mp_machdep.c b/sys/i386/xen/mp_machdep.c
index 2d05596..a0ef1e8 100644
--- a/sys/i386/xen/mp_machdep.c
+++ b/sys/i386/xen/mp_machdep.c
@@ -523,8 +523,8 @@ xen_smp_intr_init_cpus(void *unused)
void
init_secondary(void)
{
- cpuset_t tcpuset, tallcpus;
vm_offset_t addr;
+ u_int cpuid;
int gsel_tss;
@@ -601,23 +601,18 @@ init_secondary(void)
#endif
smp_cpus++;
- CTR1(KTR_SMP, "SMP: AP CPU #%d Launched", PCPU_GET(cpuid));
- printf("SMP: AP CPU #%d Launched!\n", PCPU_GET(cpuid));
- tcpuset = PCPU_GET(cpumask);
+ cpuid = PCPU_GET(cpuid);
+ CTR1(KTR_SMP, "SMP: AP CPU #%d Launched", cpuid);
+ printf("SMP: AP CPU #%d Launched!\n", cpuid);
/* Determine if we are a logical CPU. */
if (logical_cpus > 1 && PCPU_GET(apic_id) % logical_cpus != 0)
- CPU_OR(&logical_cpus_mask, &tcpuset);
+ CPU_SET(cpuid, &logical_cpus_mask);
/* Determine if we are a hyperthread. */
if (hyperthreading_cpus > 1 &&
PCPU_GET(apic_id) % hyperthreading_cpus != 0)
- CPU_OR(&hyperthreading_cpus_mask, &tcpuset);
-
- /* Build our map of 'other' CPUs. */
- tallcpus = all_cpus;
- CPU_NAND(&tallcpus, &tcpuset);
- PCPU_SET(other_cpus, tallcpus);
+ CPU_SET(cpuid, &hyperthreading_cpus_mask);
#if 0
if (bootverbose)
lapic_dump("AP");
@@ -731,7 +726,6 @@ assign_cpu_ids(void)
int
start_all_aps(void)
{
- cpuset_t tallcpus;
int x,apic_id, cpu;
struct pcpu *pc;
@@ -789,11 +783,6 @@ start_all_aps(void)
}
- /* build our map of 'other' CPUs */
- tallcpus = all_cpus;
- CPU_NAND(&tallcpus, PCPU_PTR(cpumask));
- PCPU_SET(other_cpus, tallcpus);
-
pmap_invalidate_range(kernel_pmap, 0, NKPT * NBPDR - 1);
/* number of APs actually started */
@@ -1031,9 +1020,7 @@ smp_targeted_tlb_shootdown(cpuset_t mask, u_int vector, vm_offset_t addr1, vm_of
if (othercpus < 1)
return;
} else {
- critical_enter();
- CPU_NAND(&mask, PCPU_PTR(cpumask));
- critical_exit();
+ CPU_CLR(PCPU_GET(cpuid), &mask);
if (CPU_EMPTY(&mask))
return;
}
@@ -1184,9 +1171,8 @@ ipi_all_but_self(u_int ipi)
* of help in order to understand what is the source.
* Set the mask of receiving CPUs for this purpose.
*/
- sched_pin();
- other_cpus = PCPU_GET(other_cpus);
- sched_unpin();
+ other_cpus = all_cpus;
+ CPU_CLR(PCPU_GET(cpuid), &other_cpus);
if (ipi == IPI_STOP_HARD)
CPU_OR_ATOMIC(&ipi_nmi_pending, &other_cpus);
@@ -1197,7 +1183,7 @@ ipi_all_but_self(u_int ipi)
int
ipi_nmi_handler()
{
- cpuset_t cpumask;
+ u_int cpuid;
/*
* As long as there is not a simple way to know about a NMI's
@@ -1205,13 +1191,11 @@ ipi_nmi_handler()
* the global pending bitword an IPI_STOP_HARD has been issued
* and should be handled.
*/
- sched_pin();
- cpumask = PCPU_GET(cpumask);
- sched_unpin();
- if (!CPU_OVERLAP(&ipi_nmi_pending, &cpumask))
+ cpuid = PCPU_GET(cpuid);
+ if (!CPU_ISSET(cpuid, &ipi_nmi_pending))
return (1);
- CPU_NAND_ATOMIC(&ipi_nmi_pending, &cpumask);
+ CPU_CLR_ATOMIC(cpuid, &ipi_nmi_pending);
cpustop_handler();
return (0);
}
@@ -1223,25 +1207,21 @@ ipi_nmi_handler()
void
cpustop_handler(void)
{
- cpuset_t cpumask;
int cpu;
- sched_pin();
- cpumask = PCPU_GET(cpumask);
cpu = PCPU_GET(cpuid);
- sched_unpin();
savectx(&stoppcbs[cpu]);
/* Indicate that we are stopped */
- CPU_OR_ATOMIC(&stopped_cpus, &cpumask);
+ CPU_SET_ATOMIC(cpu, &stopped_cpus);
/* Wait for restart */
- while (!CPU_OVERLAP(&started_cpus, &cpumask))
+ while (!CPU_ISSET(cpu, &started_cpus))
ia32_pause();
- CPU_NAND_ATOMIC(&started_cpus, &cpumask);
- CPU_NAND_ATOMIC(&stopped_cpus, &cpumask);
+ CPU_CLR_ATOMIC(cpu, &started_cpus);
+ CPU_CLR_ATOMIC(cpu, &stopped_cpus);
if (cpu == 0 && cpustop_restartfunc != NULL) {
cpustop_restartfunc();
diff --git a/sys/i386/xen/mptable.c b/sys/i386/xen/mptable.c
index 22019ea..0c1efe8 100644
--- a/sys/i386/xen/mptable.c
+++ b/sys/i386/xen/mptable.c
@@ -28,22 +28,16 @@
__FBSDID("$FreeBSD$");
#include <sys/param.h>
-#include <sys/systm.h>
#include <sys/bus.h>
#include <sys/kernel.h>
-#include <sys/malloc.h>
#include <vm/vm.h>
#include <vm/vm_param.h>
#include <vm/pmap.h>
-#include <x86/apicreg.h>
-#include <x86/mptable.h>
#include <machine/frame.h>
#include <machine/intr_machdep.h>
#include <machine/apicvar.h>
-#include <machine/md_var.h>
-#include <machine/specialreg.h>
#include <xen/hypervisor.h>
#include <machine/xen/xen-os.h>
@@ -111,20 +105,3 @@ mptable_register(void *dummy __unused)
}
SYSINIT(mptable_register, SI_SUB_TUNABLES - 1, SI_ORDER_FIRST, mptable_register,
NULL);
-
-
-
-int
-mptable_pci_probe_table(int bus)
-{
-
- return (0);
-}
-
-int
-mptable_pci_route_interrupt(device_t pcib, device_t dev, int pin)
-{
-
- return (0);
-}
-
diff --git a/sys/i386/xen/pmap.c b/sys/i386/xen/pmap.c
index a23ae6d..b5e71da 100644
--- a/sys/i386/xen/pmap.c
+++ b/sys/i386/xen/pmap.c
@@ -802,7 +802,8 @@ pmap_cache_bits(int mode, boolean_t is_pde)
void
pmap_invalidate_page(pmap_t pmap, vm_offset_t va)
{
- cpuset_t cpumask, other_cpus;
+ cpuset_t other_cpus;
+ u_int cpuid;
CTR2(KTR_PMAP, "pmap_invalidate_page: pmap=%p va=0x%x",
pmap, va);
@@ -812,9 +813,10 @@ pmap_invalidate_page(pmap_t pmap, vm_offset_t va)
invlpg(va);
smp_invlpg(va);
} else {
- cpumask = PCPU_GET(cpumask);
- other_cpus = PCPU_GET(other_cpus);
- if (CPU_OVERLAP(&pmap->pm_active, &cpumask))
+ cpuid = PCPU_GET(cpuid);
+ other_cpus = all_cpus;
+ CPU_CLR(cpuid, &other_cpus);
+ if (CPU_ISSET(cpuid, &pmap->pm_active))
invlpg(va);
CPU_AND(&other_cpus, &pmap->pm_active);
if (!CPU_EMPTY(&other_cpus))
@@ -827,8 +829,9 @@ pmap_invalidate_page(pmap_t pmap, vm_offset_t va)
void
pmap_invalidate_range(pmap_t pmap, vm_offset_t sva, vm_offset_t eva)
{
- cpuset_t cpumask, other_cpus;
+ cpuset_t other_cpus;
vm_offset_t addr;
+ u_int cpuid;
CTR3(KTR_PMAP, "pmap_invalidate_page: pmap=%p eva=0x%x sva=0x%x",
pmap, sva, eva);
@@ -839,9 +842,10 @@ pmap_invalidate_range(pmap_t pmap, vm_offset_t sva, vm_offset_t eva)
invlpg(addr);
smp_invlpg_range(sva, eva);
} else {
- cpumask = PCPU_GET(cpumask);
- other_cpus = PCPU_GET(other_cpus);
- if (CPU_OVERLAP(&pmap->pm_active, &cpumask))
+ cpuid = PCPU_GET(cpuid);
+ other_cpus = all_cpus;
+ CPU_CLR(cpuid, &other_cpus);
+ if (CPU_ISSET(cpuid, &pmap->pm_active))
for (addr = sva; addr < eva; addr += PAGE_SIZE)
invlpg(addr);
CPU_AND(&other_cpus, &pmap->pm_active);
@@ -855,7 +859,8 @@ pmap_invalidate_range(pmap_t pmap, vm_offset_t sva, vm_offset_t eva)
void
pmap_invalidate_all(pmap_t pmap)
{
- cpuset_t cpumask, other_cpus;
+ cpuset_t other_cpus;
+ u_int cpuid;
CTR1(KTR_PMAP, "pmap_invalidate_page: pmap=%p", pmap);
@@ -864,9 +869,10 @@ pmap_invalidate_all(pmap_t pmap)
invltlb();
smp_invltlb();
} else {
- cpumask = PCPU_GET(cpumask);
- other_cpus = PCPU_GET(other_cpus);
- if (CPU_OVERLAP(&pmap->pm_active, &cpumask))
+ cpuid = PCPU_GET(cpuid);
+ other_cpus = all_cpus;
+ CPU_CLR(cpuid, &other_cpus);
+ if (CPU_ISSET(cpuid, &pmap->pm_active))
invltlb();
CPU_AND(&other_cpus, &pmap->pm_active);
if (!CPU_EMPTY(&other_cpus))
@@ -1708,12 +1714,12 @@ pmap_lazyfix_action(void)
}
static void
-pmap_lazyfix_self(cpuset_t mymask)
+pmap_lazyfix_self(u_int cpuid)
{
if (rcr3() == lazyptd)
load_cr3(PCPU_GET(curpcb)->pcb_cr3);
- CPU_NAND_ATOMIC(lazymask, &mymask);
+ CPU_CLR_ATOMIC(cpuid, lazymask);
}
@@ -1721,7 +1727,7 @@ static void
pmap_lazyfix(pmap_t pmap)
{
cpuset_t mymask, mask;
- u_int spins;
+ u_int cpuid, spins;
int lsb;
mask = pmap->pm_active;
@@ -1739,10 +1745,13 @@ pmap_lazyfix(pmap_t pmap)
#else
lazyptd = vtophys(pmap->pm_pdir);
#endif
- mymask = PCPU_GET(cpumask);
+ cpuid = PCPU_GET(cpuid);
+
+ /* Use a cpuset just for having an easy check. */
+ CPU_SETOF(cpuid, &mymask);
if (!CPU_CMP(&mask, &mymask)) {
lazymask = &pmap->pm_active;
- pmap_lazyfix_self(mymask);
+ pmap_lazyfix_self(cpuid);
} else {
atomic_store_rel_int((u_int *)&lazymask,
(u_int)&pmap->pm_active);
@@ -2012,7 +2021,7 @@ pmap_collect(pmap_t locked_pmap, struct vpgqueues *vpq)
sched_pin();
TAILQ_FOREACH(m, &vpq->pl, pageq) {
- if (m->hold_count || m->busy)
+ if ((m->flags & PG_MARKER) != 0 || m->hold_count || m->busy)
continue;
TAILQ_FOREACH_SAFE(pv, &m->md.pv_list, pv_list, next_pv) {
va = pv->pv_va;
@@ -4126,17 +4135,19 @@ void
pmap_activate(struct thread *td)
{
pmap_t pmap, oldpmap;
+ u_int cpuid;
u_int32_t cr3;
critical_enter();
pmap = vmspace_pmap(td->td_proc->p_vmspace);
oldpmap = PCPU_GET(curpmap);
+ cpuid = PCPU_GET(cpuid);
#if defined(SMP)
- CPU_NAND_ATOMIC(&oldpmap->pm_active, PCPU_PTR(cpumask));
- CPU_OR_ATOMIC(&pmap->pm_active, PCPU_PTR(cpumask));
+ CPU_CLR_ATOMIC(cpuid, &oldpmap->pm_active);
+ CPU_SET_ATOMIC(cpuid, &pmap->pm_active);
#else
- CPU_NAND(&oldpmap->pm_active, PCPU_PTR(cpumask));
- CPU_OR(&pmap->pm_active, PCPU_PTR(cpumask));
+ CPU_CLR(cpuid, &oldpmap->pm_active);
+ CPU_SET(cpuid, &pmap->pm_active);
#endif
#ifdef PAE
cr3 = vtophys(pmap->pm_pdpt);
diff --git a/sys/ia64/conf/DEFAULTS b/sys/ia64/conf/DEFAULTS
index 2cb2330..a3e10d6 100644
--- a/sys/ia64/conf/DEFAULTS
+++ b/sys/ia64/conf/DEFAULTS
@@ -18,3 +18,5 @@ device uart_ns8250
options GEOM_PART_BSD
options GEOM_PART_GPT
options GEOM_PART_MBR
+
+options NEW_PCIB
diff --git a/sys/ia64/conf/GENERIC b/sys/ia64/conf/GENERIC
index 2d8d316..eaf3ffd 100644
--- a/sys/ia64/conf/GENERIC
+++ b/sys/ia64/conf/GENERIC
@@ -48,7 +48,7 @@ options NFSLOCKD # Network Lock Manager
options NFSD # New Network Filesystem Server
options NFS_ROOT # NFS usable as root device
options P1003_1B_SEMAPHORES # POSIX-style semaphores
-options PREEMPTION # Enable kernel thread preemption
+#options PREEMPTION # Enable kernel thread preemption
options PRINTF_BUFR_SIZE=128 # Printf buffering to limit interspersion
options PROCFS # Process filesystem (/proc)
options PSEUDOFS # Pseudo-filesystem framework
diff --git a/sys/ia64/ia64/clock.c b/sys/ia64/ia64/clock.c
index 96d07c4..24623c5 100644
--- a/sys/ia64/ia64/clock.c
+++ b/sys/ia64/ia64/clock.c
@@ -91,12 +91,14 @@ ia64_ih_clock(struct thread *td, u_int xiv, struct trapframe *tf)
ia64_set_itm(itc + load);
} else
ia64_set_itv((1 << 16) | xiv);
+
+ ia64_set_eoi(0);
ia64_srlz_d();
et = &ia64_clock_et;
if (et->et_active)
et->et_event_cb(et, et->et_arg);
- return (0);
+ return (1);
}
/*
diff --git a/sys/ia64/ia64/efi.c b/sys/ia64/ia64/efi.c
index 5cd4518..32868a0 100644
--- a/sys/ia64/ia64/efi.c
+++ b/sys/ia64/ia64/efi.c
@@ -161,20 +161,67 @@ efi_get_time(struct efi_tm *tm)
struct efi_md *
efi_md_first(void)
{
+ struct efi_md *md;
+
+ if (bootinfo->bi_memmap == 0)
+ return (NULL);
+ md = (struct efi_md *)bootinfo->bi_memmap;
+ return (md);
+}
+
+struct efi_md *
+efi_md_last(void)
+{
+ struct efi_md *md;
if (bootinfo->bi_memmap == 0)
return (NULL);
- return ((struct efi_md *)bootinfo->bi_memmap);
+ md = (struct efi_md *)(bootinfo->bi_memmap + bootinfo->bi_memmap_size -
+ bootinfo->bi_memdesc_size);
+ return (md);
}
struct efi_md *
efi_md_next(struct efi_md *md)
{
- uint64_t plim;
+ struct efi_md *lim;
- plim = bootinfo->bi_memmap + bootinfo->bi_memmap_size;
+ lim = efi_md_last();
md = (struct efi_md *)((uintptr_t)md + bootinfo->bi_memdesc_size);
- return ((md >= (struct efi_md *)plim) ? NULL : md);
+ return ((md > lim) ? NULL : md);
+}
+
+struct efi_md *
+efi_md_prev(struct efi_md *md)
+{
+ struct efi_md *lim;
+
+ lim = efi_md_first();
+ md = (struct efi_md *)((uintptr_t)md - bootinfo->bi_memdesc_size);
+ return ((md < lim) ? NULL : md);
+}
+
+struct efi_md *
+efi_md_find(vm_paddr_t pa)
+{
+ static struct efi_md *last = NULL;
+ struct efi_md *md, *p0, *p1;
+
+ md = (last != NULL) ? last : efi_md_first();
+ p1 = p0 = NULL;
+ while (md != NULL && md != p1) {
+ if (pa >= md->md_phys &&
+ pa < md->md_phys + md->md_pages * EFI_PAGE_SIZE) {
+ last = md;
+ return (md);
+ }
+
+ p1 = p0;
+ p0 = md;
+ md = (pa < md->md_phys) ? efi_md_prev(md) : efi_md_next(md);
+ }
+
+ return (NULL);
}
void
diff --git a/sys/ia64/ia64/exception.S b/sys/ia64/ia64/exception.S
index 729a96c..a38df1a 100644
--- a/sys/ia64/ia64/exception.S
+++ b/sys/ia64/ia64/exception.S
@@ -50,9 +50,6 @@ __FBSDID("$FreeBSD$");
.section .ivt.data, "aw"
- .global pmap_ptc_g_sem
-pmap_ptc_g_sem: data8 0
-
.global ia64_kptdir
ia64_kptdir: data8 0
@@ -151,58 +148,51 @@ ENTRY_NOPROFILE(exception_save, 0)
}
{ .mmi
mov ar.rsc=0
- sub r19=r23,r30
- add r31=8,r30
- ;;
-}
-{ .mmi
mov r22=cr.iip
- nop 0
addl r29=NTLBRT_SAVE,r0 // 22-bit restart token.
;;
}
/*
- * We have a 1KB aligned trapframe, pointed to by sp. If we write
- * to the trapframe, we may trigger a data nested TLB fault. By
- * aligning the trapframe on a 1KB boundary, we guarantee that if
- * we get a data nested TLB fault, it will be on the very first
- * write. Since the data nested TLB fault does not preserve any
- * state, we have to be careful what we clobber. Consequently, we
- * have to be careful what we use here. Below a list of registers
- * that are currently alive:
+ * We have a 1KB aligned trapframe, pointed to by r30. We can't
+ * reliably write to the trapframe using virtual addressing, due
+ * to the fact that TC entries we depend on can be removed by:
+ * 1. ptc.g instructions issued by other threads/cores/CPUs, or
+ * 2. TC modifications in another thread on the same core.
+ * When our TC entry gets removed, we get nested TLB faults and
+ * since no state is saved, we can only deal with those when
+ * explicitly coded and expected.
+ * As such, we switch to physical addressing and account for the
+ * fact that the tpa instruction can cause a nested TLB fault.
+ * Since the data nested TLB fault does not preserve any state,
+ * we have to be careful what we clobber. Consequently, we have
+ * to be careful what we use here. Below a list of registers that
+ * are considered alive:
* r16,r17=arguments
* r18=pr, r19=length, r20=unat, r21=rsc, r22=iip, r23=TOS
- * r29=restart point
- * r30,r31=trapframe pointers
+ * r29=restart token
+ * r30=trapframe pointers
* p14,p15=memory stack switch
*/
-
- /* PTC.G enter non-exclusive */
- mov r24 = ar.ccv
- movl r25 = pmap_ptc_g_sem
- ;;
-.ptc_g_0:
- ld8.acq r26 = [r25]
- ;;
- tbit.nz p12, p0 = r26, 63
-(p12) br.cond.spnt.few .ptc_g_0
- ;;
- mov ar.ccv = r26
- adds r27 = 1, r26
+exception_save_restart:
+ tpa r24=r30 // Nested TLB fault possible
+ sub r19=r23,r30
+ nop 0
;;
- cmpxchg8.rel r27 = [r25], r27, ar.ccv
+
+ rsm psr.dt
+ add r29=16,r19 // Clobber restart token
+ mov r30=r24
;;
- cmp.ne p12, p0 = r26, r27
-(p12) br.cond.spnt.few .ptc_g_0
+ srlz.d
+ add r31=8,r24
;;
- mov ar.ccv = r24
-exception_save_restart:
+ // r18=pr, r19=length, r20=unat, r21=rsc, r22=iip, r23=TOS
+ // r29=delta
{ .mmi
st8 [r30]=r19,16 // length
st8 [r31]=r0,16 // flags
- add r29=16,r19 // Clobber restart token
;;
}
{ .mmi
@@ -218,6 +208,7 @@ exception_save_restart:
;;
}
// r18=pr, r19=rnat, r20=bspstore, r21=rsc, r22=iip, r23=rp
+ // r24=pfs
{ .mmi
st8 [r30]=r23,16 // rp
st8 [r31]=r18,16 // pr
@@ -275,7 +266,7 @@ exception_save_restart:
sub r18=r18,r20
;;
}
- // r19=ifs, r22=iip
+ // r18=ndirty, r19=ifs, r22=iip
{ .mmi
st8 [r31]=r18,16 // ndirty
st8 [r30]=r19,16 // cfm
@@ -431,27 +422,10 @@ exception_save_restart:
;;
}
{ .mlx
- ssm psr.ic|psr.dfh
+ ssm psr.dt|psr.ic|psr.dfh
movl gp=__gp
;;
}
-
- /* PTC.G leave non-exclusive */
- srlz.d
- movl r25 = pmap_ptc_g_sem
- ;;
-.ptc_g_1:
- ld8.acq r26 = [r25]
- ;;
- mov ar.ccv = r26
- adds r27 = -1, r26
- ;;
- cmpxchg8.rel r27 = [r25], r27, ar.ccv
- ;;
- cmp.ne p12, p0 = r26, r27
-(p12) br.cond.spnt.few .ptc_g_1
- ;;
-
{ .mib
srlz.d
nop 0
@@ -469,34 +443,52 @@ END(exception_save)
ENTRY_NOPROFILE(exception_restore, 0)
{ .mmi
rsm psr.i
- add r3=SIZEOF_TRAPFRAME-16,sp
- add r2=SIZEOF_TRAPFRAME,sp
+ add sp=16,sp
+ nop 0
;;
}
-{ .mmi
+
+ // The next instruction can fault. Let it be...
+ tpa r9=sp
+ ;;
+ rsm psr.dt|psr.ic
+ add r8=SIZEOF_SPECIAL+16,r9
+ ;;
srlz.d
- add r8=SIZEOF_SPECIAL+32,sp
- nop 0
+ add r2=SIZEOF_TRAPFRAME-16,r9
+ add r3=SIZEOF_TRAPFRAME-32,r9
;;
-}
- // The next load can trap. Let it be...
+
+{ .mmi
ldf.fill f15=[r2],-32 // f15
ldf.fill f14=[r3],-32 // f14
- add sp=16,sp
+ nop 0
;;
+}
+{ .mmi
ldf.fill f13=[r2],-32 // f13
ldf.fill f12=[r3],-32 // f12
+ nop 0
;;
+}
+{ .mmi
ldf.fill f11=[r2],-32 // f11
ldf.fill f10=[r3],-32 // f10
+ nop 0
;;
+}
+{ .mmi
ldf.fill f9=[r2],-32 // f9
ldf.fill f8=[r3],-32 // f8
+ nop 0
;;
+}
+{ .mmi
ldf.fill f7=[r2],-24 // f7
ldf.fill f6=[r3],-16 // f6
+ nop 0
;;
-
+}
{ .mmi
ld8 r8=[r8] // unat (after)
;;
@@ -553,53 +545,53 @@ ENTRY_NOPROFILE(exception_restore, 0)
bsw.0
;;
}
+{ .mii
+ ld8 r16=[r9] // tf_length
+ add r31=16,r9
+ add r30=24,r9
+}
{ .mmi
ld8.fill r15=[r3],-16 // r15
ld8.fill r14=[r2],-16 // r14
- add r31=16,sp
+ nop 0
;;
}
{ .mmi
- ld8 r16=[sp] // tf_length
ld8.fill r11=[r3],-16 // r11
- add r30=24,sp
- ;;
-}
-{ .mmi
ld8.fill r10=[r2],-16 // r10
- ld8.fill r9=[r3],-16 // r9
add r16=r16,sp // ar.k7
;;
}
{ .mmi
+ ld8.fill r9=[r3],-16 // r9
ld8.fill r8=[r2],-16 // r8
- ld8.fill r3=[r3] // r3
+ nop 0
;;
}
- // We want nested TLB faults from here on...
- rsm psr.ic|psr.i
+{ .mmi
+ ld8.fill r3=[r3] // r3
ld8.fill r2=[r2] // r2
nop 0
;;
- srlz.d
- ld8.fill sp=[r31],16 // sp
- nop 0
- ;;
+}
+ ld8.fill sp=[r31],16 // sp
ld8 r17=[r30],16 // unat
- ld8 r29=[r31],16 // rp
;;
+ ld8 r29=[r31],16 // rp
ld8 r18=[r30],16 // pr
+ ;;
ld8 r28=[r31],16 // pfs
+ ld8 r20=[r30],24 // bspstore
mov rp=r29
;;
- ld8 r20=[r30],24 // bspstore
ld8 r21=[r31],24 // rnat
mov ar.pfs=r28
;;
ld8.fill r26=[r30],16 // tp
ld8 r22=[r31],16 // rsc
;;
+
{ .mmi
ld8 r23=[r30],16 // fpsr
ld8 r24=[r31],16 // psr
@@ -636,6 +628,11 @@ ENTRY_NOPROFILE(exception_restore, 0)
addl r29=NTLBRT_RESTORE,r0 // 22-bit restart token
;;
}
+
+ ssm psr.dt
+ ;;
+ srlz.d
+
exception_restore_restart:
{ .mmi
mov r30=ar.bspstore
@@ -1015,15 +1012,33 @@ IVT_ENTRY(Data_Nested_TLB, 0x1400)
// here are direct mapped region 7 addresses, we have no problem
// constructing physical addresses.
-{ .mlx
+{ .mmi
+ mov cr.ifa=r30
+ mov r26=rr[r30]
+ extr.u r27=r30,61,3
+ ;;
+}
+{ .mii
nop 0
- movl r27=ia64_kptdir
+ dep r26=0,r26,0,2
+ cmp.eq p12,p13=7,r27
;;
}
{ .mii
- ld8 r27=[r27]
- extr.u r28=r30,3*PAGE_SHIFT-8, PAGE_SHIFT-3 // dir L0 index
- extr.u r26=r30,2*PAGE_SHIFT-5, PAGE_SHIFT-3 // dir L1 index
+ mov cr.itir=r26
+(p12) dep r28=0,r30,61,3
+(p13) extr.u r28=r30,3*PAGE_SHIFT-8, PAGE_SHIFT-3 // dir L0 index
+ ;;
+}
+{ .mlx
+(p12) add r28=PTE_PRESENT+PTE_ACCESSED+PTE_DIRTY+PTE_PL_KERN+PTE_AR_RWX+PTE_MA_WB,r28
+(p13) movl r27=ia64_kptdir
+ ;;
+}
+{ .mib
+(p13) ld8 r27=[r27]
+(p13) extr.u r26=r30,2*PAGE_SHIFT-5, PAGE_SHIFT-3 // dir L1 index
+(p12) br.cond.spnt.few 1f
;;
}
{ .mmi
@@ -1040,58 +1055,48 @@ IVT_ENTRY(Data_Nested_TLB, 0x1400)
extr.u r28=r30,PAGE_SHIFT,PAGE_SHIFT-5 // pte index
;;
}
-{ .mmi
+{ .mii
shladd r27=r26,3,r27
+ shl r28=r28,5
;;
- mov r26=rr[r30]
dep r27=0,r27,61,3
;;
}
-{ .mii
ld8 r27=[r27] // pte page
- shl r28=r28,5
- dep r26=0,r26,0,2
;;
-}
-{ .mmi
add r27=r28,r27
;;
- mov cr.ifa=r30
dep r27=0,r27,61,3
;;
-}
-{ .mmi
- ld8 r28=[r27] // pte
+ ld8 r28=[r27] // pte
;;
- mov cr.itir=r26
or r28=PTE_DIRTY+PTE_ACCESSED,r28
;;
-}
-{ .mmi
st8 [r27]=r28
;;
- addl r26=NTLBRT_SAVE,r0
- addl r27=NTLBRT_RESTORE,r0
-}
+ ssm psr.dt
+ ;;
+1:
{ .mmi
itc.d r28
;;
- ssm psr.dt
- cmp.eq p12,p0=r29,r26
+ addl r26=NTLBRT_SAVE,r0
+ addl r27=NTLBRT_RESTORE,r0
;;
}
-{ .mib
+{ .mmi
srlz.d
+ cmp.eq p12,p0=r29,r26
cmp.eq p13,p0=r29,r27
-(p12) br.cond.sptk.few exception_save_restart
;;
}
-{ .mib
- nop 0
+{ .mbb
nop 0
+(p12) br.cond.sptk.few exception_save_restart
(p13) br.cond.sptk.few exception_restore_restart
;;
}
+
{ .mlx
mov r26=ar.bsp
movl r29=kstack
diff --git a/sys/ia64/ia64/interrupt.c b/sys/ia64/ia64/interrupt.c
index 27d5e60..c2372b2 100644
--- a/sys/ia64/ia64/interrupt.c
+++ b/sys/ia64/ia64/interrupt.c
@@ -320,11 +320,12 @@ ia64_handle_intr(struct trapframe *tf)
td->td_intr_frame = tf;
do {
- ia64_set_eoi(0);
- ia64_srlz_d();
CTR2(KTR_INTR, "INTR: ITC=%u, XIV=%u",
(u_int)tf->tf_special.ifa, xiv);
- (ia64_handler[xiv])(td, xiv, tf);
+ if (!(ia64_handler[xiv])(td, xiv, tf)) {
+ ia64_set_eoi(0);
+ ia64_srlz_d();
+ }
xiv = ia64_get_ivr();
ia64_srlz_d();
} while (xiv != 15);
diff --git a/sys/ia64/ia64/locore.S b/sys/ia64/ia64/locore.S
index b2d0969..d4c1190 100644
--- a/sys/ia64/ia64/locore.S
+++ b/sys/ia64/ia64/locore.S
@@ -206,11 +206,14 @@ intr_n = 1
.byte 0
intr_n = intr_n + 1
.endr
-EXPORT(eintrnames)
+EXPORT(sintrnames)
+ .word INTRCNT_COUNT * INTRNAME_LEN
+
.align 8
EXPORT(intrcnt)
.fill INTRCNT_COUNT, 8, 0
-EXPORT(eintrcnt)
+EXPORT(sintrcnt)
+ .word INTRCNT_COUNT
.text
// in0: image base
diff --git a/sys/ia64/ia64/mp_machdep.c b/sys/ia64/ia64/mp_machdep.c
index 59b14d0..0d8f241 100644
--- a/sys/ia64/ia64/mp_machdep.c
+++ b/sys/ia64/ia64/mp_machdep.c
@@ -150,18 +150,18 @@ ia64_ih_rndzvs(struct thread *td, u_int xiv, struct trapframe *tf)
static u_int
ia64_ih_stop(struct thread *td, u_int xiv, struct trapframe *tf)
{
- cpuset_t mybit;
+ u_int cpuid;
PCPU_INC(md.stats.pcs_nstops);
- mybit = PCPU_GET(cpumask);
+ cpuid = PCPU_GET(cpuid);
savectx(PCPU_PTR(md.pcb));
- CPU_OR_ATOMIC(&stopped_cpus, &mybit);
- while (!CPU_OVERLAP(&started_cpus, &mybit))
+ CPU_SET_ATOMIC(cpuid, &stopped_cpus);
+ while (!CPU_ISSET(cpuid, &started_cpus))
cpu_spinwait();
- CPU_NAND_ATOMIC(&started_cpus, &mybit);
- CPU_NAND_ATOMIC(&stopped_cpus, &mybit);
+ CPU_CLR_ATOMIC(cpuid, &started_cpus);
+ CPU_CLR_ATOMIC(cpuid, &stopped_cpus);
return (0);
}
@@ -371,8 +371,6 @@ cpu_mp_start()
STAILQ_FOREACH(pc, &cpuhead, pc_allcpu) {
pc->pc_md.current_pmap = kernel_pmap;
- pc->pc_other_cpus = all_cpus;
- CPU_NAND(&pc->pc_other_cpus, &pc->pc_cpumask);
/* The BSP is obviously running already. */
if (pc->pc_cpuid == 0) {
pc->pc_md.awake = 1;
@@ -478,7 +476,7 @@ ipi_selected(cpuset_t cpus, int ipi)
struct pcpu *pc;
STAILQ_FOREACH(pc, &cpuhead, pc_allcpu) {
- if (CPU_OVERLAP(&cpus, &pc->pc_cpumask))
+ if (CPU_ISSET(pc->pc_cpuid, &cpus))
ipi_send(pc, ipi);
}
}
diff --git a/sys/ia64/ia64/nexus.c b/sys/ia64/ia64/nexus.c
index 8e71b1e..53f23cb 100644
--- a/sys/ia64/ia64/nexus.c
+++ b/sys/ia64/ia64/nexus.c
@@ -86,6 +86,8 @@ static device_t nexus_add_child(device_t bus, u_int order, const char *name,
int unit);
static struct resource *nexus_alloc_resource(device_t, device_t, int, int *,
u_long, u_long, u_long, u_int);
+static int nexus_adjust_resource(device_t, device_t, int, struct resource *,
+ u_long, u_long);
static int nexus_activate_resource(device_t, device_t, int, int,
struct resource *);
static int nexus_deactivate_resource(device_t, device_t, int, int,
@@ -122,6 +124,7 @@ static device_method_t nexus_methods[] = {
DEVMETHOD(bus_print_child, nexus_print_child),
DEVMETHOD(bus_add_child, nexus_add_child),
DEVMETHOD(bus_alloc_resource, nexus_alloc_resource),
+ DEVMETHOD(bus_adjust_resource, nexus_adjust_resource),
DEVMETHOD(bus_release_resource, nexus_release_resource),
DEVMETHOD(bus_activate_resource, nexus_activate_resource),
DEVMETHOD(bus_deactivate_resource, nexus_deactivate_resource),
@@ -238,6 +241,20 @@ nexus_add_child(device_t bus, u_int order, const char *name, int unit)
return(child);
}
+static struct rman *
+nexus_rman(int type)
+{
+ switch (type) {
+ case SYS_RES_IRQ:
+ return (&irq_rman);
+ case SYS_RES_IOPORT:
+ return (&port_rman);
+ case SYS_RES_MEMORY:
+ return (&mem_rman);
+ default:
+ return (NULL);
+ }
+}
/*
* Allocate a resource on behalf of child. NB: child is usually going to be a
@@ -271,23 +288,9 @@ nexus_alloc_resource(device_t bus, device_t child, int type, int *rid,
}
flags &= ~RF_ACTIVE;
-
- switch (type) {
- case SYS_RES_IRQ:
- rm = &irq_rman;
- break;
-
- case SYS_RES_IOPORT:
- rm = &port_rman;
- break;
-
- case SYS_RES_MEMORY:
- rm = &mem_rman;
- break;
-
- default:
- return 0;
- }
+ rm = nexus_rman(type);
+ if (rm == NULL)
+ return (NULL);
rv = rman_reserve_resource(rm, start, end, count, flags, child);
if (rv == 0)
@@ -305,6 +308,20 @@ nexus_alloc_resource(device_t bus, device_t child, int type, int *rid,
}
static int
+nexus_adjust_resource(device_t bus, device_t child, int type,
+ struct resource *r, u_long start, u_long end)
+{
+ struct rman *rm;
+
+ rm = nexus_rman(type);
+ if (rm == NULL)
+ return (ENXIO);
+ if (!rman_is_region_manager(r, rm))
+ return (EINVAL);
+ return (rman_adjust_resource(r, start, end));
+}
+
+static int
nexus_activate_resource(device_t bus, device_t child, int type, int rid,
struct resource *r)
{
diff --git a/sys/ia64/ia64/pmap.c b/sys/ia64/ia64/pmap.c
index b36f813..0e34f36 100644
--- a/sys/ia64/ia64/pmap.c
+++ b/sys/ia64/ia64/pmap.c
@@ -66,6 +66,7 @@ __FBSDID("$FreeBSD$");
#include <vm/uma.h>
#include <machine/bootinfo.h>
+#include <machine/efi.h>
#include <machine/md_var.h>
#include <machine/pal.h>
@@ -179,7 +180,7 @@ static uint64_t pmap_ptc_e_count2 = 2;
static uint64_t pmap_ptc_e_stride1 = 0x2000;
static uint64_t pmap_ptc_e_stride2 = 0x100000000;
-extern volatile u_long pmap_ptc_g_sem;
+struct mtx pmap_ptc_mutex;
/*
* Data for the RID allocator
@@ -338,6 +339,8 @@ pmap_bootstrap()
pmap_ptc_e_stride1,
pmap_ptc_e_stride2);
+ mtx_init(&pmap_ptc_mutex, "PTC.G mutex", NULL, MTX_SPIN);
+
/*
* Setup RIDs. RIDs 0..7 are reserved for the kernel.
*
@@ -481,6 +484,18 @@ pmap_vhpt_population(SYSCTL_HANDLER_ARGS)
return (error);
}
+vm_offset_t
+pmap_page_to_va(vm_page_t m)
+{
+ vm_paddr_t pa;
+ vm_offset_t va;
+
+ pa = VM_PAGE_TO_PHYS(m);
+ va = (m->md.memattr == VM_MEMATTR_UNCACHEABLE) ? IA64_PHYS_TO_RR6(pa) :
+ IA64_PHYS_TO_RR7(pa);
+ return (va);
+}
+
/*
* Initialize a vm_page's machine-dependent fields.
*/
@@ -490,6 +505,7 @@ pmap_page_init(vm_page_t m)
TAILQ_INIT(&m->md.pv_list);
m->md.pv_list_count = 0;
+ m->md.memattr = VM_MEMATTR_DEFAULT;
}
/*
@@ -528,11 +544,11 @@ pmap_invalidate_page(vm_offset_t va)
{
struct ia64_lpte *pte;
struct pcpu *pc;
- uint64_t tag, sem;
- register_t is;
+ uint64_t tag;
u_int vhpt_ofs;
critical_enter();
+
vhpt_ofs = ia64_thash(va) - PCPU_GET(md.vhpt);
tag = ia64_ttag(va);
STAILQ_FOREACH(pc, &cpuhead, pc_allcpu) {
@@ -540,34 +556,16 @@ pmap_invalidate_page(vm_offset_t va)
atomic_cmpset_64(&pte->tag, tag, 1UL << 63);
}
- /* PTC.G enter exclusive */
- is = intr_disable();
-
- /* Atomically assert writer after all writers have gone. */
- do {
- /* Wait until there's no more writer. */
- do {
- sem = atomic_load_acq_long(&pmap_ptc_g_sem);
- tag = sem | (1ul << 63);
- } while (sem == tag);
- } while (!atomic_cmpset_rel_long(&pmap_ptc_g_sem, sem, tag));
-
- /* Wait until all readers are gone. */
- tag = (1ul << 63);
- do {
- sem = atomic_load_acq_long(&pmap_ptc_g_sem);
- } while (sem != tag);
+ mtx_lock_spin(&pmap_ptc_mutex);
ia64_ptc_ga(va, PAGE_SHIFT << 2);
ia64_mf();
ia64_srlz_i();
- /* PTC.G leave exclusive */
- atomic_store_rel_long(&pmap_ptc_g_sem, 0);
+ mtx_unlock_spin(&pmap_ptc_mutex);
ia64_invala();
- intr_restore(is);
critical_exit();
}
@@ -718,8 +716,7 @@ pmap_growkernel(vm_offset_t addr)
if (!nkpg)
panic("%s: cannot add dir. page", __func__);
- dir1 = (struct ia64_lpte **)
- IA64_PHYS_TO_RR7(VM_PAGE_TO_PHYS(nkpg));
+ dir1 = (struct ia64_lpte **)pmap_page_to_va(nkpg);
bzero(dir1, PAGE_SIZE);
ia64_kptdir[KPTE_DIR0_INDEX(kernel_vm_end)] = dir1;
}
@@ -729,8 +726,7 @@ pmap_growkernel(vm_offset_t addr)
if (!nkpg)
panic("%s: cannot add PTE page", __func__);
- leaf = (struct ia64_lpte *)
- IA64_PHYS_TO_RR7(VM_PAGE_TO_PHYS(nkpg));
+ leaf = (struct ia64_lpte *)pmap_page_to_va(nkpg);
bzero(leaf, PAGE_SIZE);
dir1[KPTE_DIR1_INDEX(kernel_vm_end)] = leaf;
@@ -790,7 +786,7 @@ get_pv_entry(pmap_t locked_pmap)
vpq = &vm_page_queues[PQ_INACTIVE];
retry:
TAILQ_FOREACH(m, &vpq->pl, pageq) {
- if (m->hold_count || m->busy)
+ if ((m->flags & PG_MARKER) != 0 || m->hold_count || m->busy)
continue;
TAILQ_FOREACH_SAFE(pv, &m->md.pv_list, pv_list, next_pv) {
va = pv->pv_va;
@@ -1141,6 +1137,14 @@ pmap_pte_prot(pmap_t pm, struct ia64_lpte *pte, vm_prot_t prot)
pte->pte |= prot2ar[(prot & VM_PROT_ALL) >> 1];
}
+static PMAP_INLINE void
+pmap_pte_attr(struct ia64_lpte *pte, vm_memattr_t ma)
+{
+
+ pte->pte &= ~PTE_MA_MASK;
+ pte->pte |= (ma & PTE_MA_MASK);
+}
+
/*
* Set a pte to contain a valid mapping and enter it in the VHPT. If
* the pte was orginally valid, then its assumed to already be in the
@@ -1153,8 +1157,9 @@ pmap_set_pte(struct ia64_lpte *pte, vm_offset_t va, vm_offset_t pa,
boolean_t wired, boolean_t managed)
{
- pte->pte &= PTE_PROT_MASK | PTE_PL_MASK | PTE_AR_MASK | PTE_ED;
- pte->pte |= PTE_PRESENT | PTE_MA_WB;
+ pte->pte &= PTE_PROT_MASK | PTE_MA_MASK | PTE_PL_MASK |
+ PTE_AR_MASK | PTE_ED;
+ pte->pte |= PTE_PRESENT;
pte->pte |= (managed) ? PTE_MANAGED : (PTE_DIRTY | PTE_ACCESSED);
pte->pte |= (wired) ? PTE_WIRED : 0;
pte->pte |= pa & PTE_PPN_MASK;
@@ -1271,6 +1276,7 @@ pmap_qenter(vm_offset_t va, vm_page_t *m, int count)
else
pmap_enter_vhpt(pte, va);
pmap_pte_prot(kernel_pmap, pte, VM_PROT_ALL);
+ pmap_pte_attr(pte, m[i]->md.memattr);
pmap_set_pte(pte, va, VM_PAGE_TO_PHYS(m[i]), FALSE, FALSE);
va += PAGE_SIZE;
}
@@ -1312,6 +1318,7 @@ pmap_kenter(vm_offset_t va, vm_offset_t pa)
else
pmap_enter_vhpt(pte, va);
pmap_pte_prot(kernel_pmap, pte, VM_PROT_ALL);
+ pmap_pte_attr(pte, VM_MEMATTR_DEFAULT);
pmap_set_pte(pte, va, pa, FALSE, FALSE);
}
@@ -1622,6 +1629,7 @@ validate:
* adds the pte to the VHPT if necessary.
*/
pmap_pte_prot(pmap, pte, prot);
+ pmap_pte_attr(pte, m->md.memattr);
pmap_set_pte(pte, va, pa, wired, managed);
/* Invalidate the I-cache when needed. */
@@ -1727,6 +1735,7 @@ pmap_enter_quick_locked(pmap_t pmap, vm_offset_t va, vm_page_t m,
pmap_enter_vhpt(pte, va);
pmap_pte_prot(pmap, pte,
prot & (VM_PROT_READ | VM_PROT_EXECUTE));
+ pmap_pte_attr(pte, m->md.memattr);
pmap_set_pte(pte, va, VM_PAGE_TO_PHYS(m), FALSE, managed);
if (prot & VM_PROT_EXECUTE)
@@ -1809,8 +1818,10 @@ pmap_copy(pmap_t dst_pmap, pmap_t src_pmap, vm_offset_t dst_addr, vm_size_t len,
void
pmap_zero_page(vm_page_t m)
{
- vm_offset_t va = IA64_PHYS_TO_RR7(VM_PAGE_TO_PHYS(m));
- bzero((caddr_t) va, PAGE_SIZE);
+ void *p;
+
+ p = (void *)pmap_page_to_va(m);
+ bzero(p, PAGE_SIZE);
}
@@ -1825,8 +1836,10 @@ pmap_zero_page(vm_page_t m)
void
pmap_zero_page_area(vm_page_t m, int off, int size)
{
- vm_offset_t va = IA64_PHYS_TO_RR7(VM_PAGE_TO_PHYS(m));
- bzero((char *)(caddr_t)va + off, size);
+ char *p;
+
+ p = (void *)pmap_page_to_va(m);
+ bzero(p + off, size);
}
@@ -1839,8 +1852,10 @@ pmap_zero_page_area(vm_page_t m, int off, int size)
void
pmap_zero_page_idle(vm_page_t m)
{
- vm_offset_t va = IA64_PHYS_TO_RR7(VM_PAGE_TO_PHYS(m));
- bzero((caddr_t) va, PAGE_SIZE);
+ void *p;
+
+ p = (void *)pmap_page_to_va(m);
+ bzero(p, PAGE_SIZE);
}
@@ -1853,9 +1868,11 @@ pmap_zero_page_idle(vm_page_t m)
void
pmap_copy_page(vm_page_t msrc, vm_page_t mdst)
{
- vm_offset_t src = IA64_PHYS_TO_RR7(VM_PAGE_TO_PHYS(msrc));
- vm_offset_t dst = IA64_PHYS_TO_RR7(VM_PAGE_TO_PHYS(mdst));
- bcopy((caddr_t) src, (caddr_t) dst, PAGE_SIZE);
+ void *dst, *src;
+
+ src = (void *)pmap_page_to_va(msrc);
+ dst = (void *)pmap_page_to_va(mdst);
+ bcopy(src, dst, PAGE_SIZE);
}
/*
@@ -2202,6 +2219,7 @@ pmap_remove_write(vm_page_t m)
}
prot &= ~VM_PROT_WRITE;
pmap_pte_prot(pmap, pte, prot);
+ pmap_pte_attr(pte, m->md.memattr);
pmap_invalidate_page(pv->pv_va);
}
pmap_switch(oldpmap);
@@ -2218,12 +2236,37 @@ pmap_remove_write(vm_page_t m)
* NOT real memory.
*/
void *
-pmap_mapdev(vm_paddr_t pa, vm_size_t size)
+pmap_mapdev(vm_paddr_t pa, vm_size_t sz)
{
+ static void *last_va = NULL;
+ static vm_paddr_t last_pa = 0;
+ static vm_size_t last_sz = 0;
+ struct efi_md *md;
vm_offset_t va;
- va = pa | IA64_RR_BASE(6);
- return ((void *)va);
+ if (pa == last_pa && sz == last_sz)
+ return (last_va);
+
+ md = efi_md_find(pa);
+ if (md == NULL) {
+ printf("%s: [%#lx..%#lx] not covered by memory descriptor\n",
+ __func__, pa, pa + sz - 1);
+ return (NULL);
+ }
+
+ if (md->md_type == EFI_MD_TYPE_FREE) {
+ printf("%s: [%#lx..%#lx] is in DRAM\n", __func__, pa,
+ pa + sz - 1);
+ return (NULL);
+ }
+
+ va = (md->md_attr & EFI_MD_ATTR_WB) ? IA64_PHYS_TO_RR7(pa) :
+ IA64_PHYS_TO_RR6(pa);
+
+ last_va = (void *)va;
+ last_pa = pa;
+ last_sz = sz;
+ return (last_va);
}
/*
@@ -2235,6 +2278,63 @@ pmap_unmapdev(vm_offset_t va, vm_size_t size)
}
/*
+ * Sets the memory attribute for the specified page.
+ */
+static void
+pmap_page_set_memattr_1(void *arg)
+{
+ struct ia64_pal_result res;
+ register_t is;
+ uintptr_t pp = (uintptr_t)arg;
+
+ is = intr_disable();
+ res = ia64_call_pal_static(pp, 0, 0, 0);
+ intr_restore(is);
+}
+
+void
+pmap_page_set_memattr(vm_page_t m, vm_memattr_t ma)
+{
+ struct ia64_lpte *pte;
+ pmap_t oldpmap;
+ pv_entry_t pv;
+ void *va;
+
+ vm_page_lock_queues();
+ m->md.memattr = ma;
+ TAILQ_FOREACH(pv, &m->md.pv_list, pv_list) {
+ PMAP_LOCK(pv->pv_pmap);
+ oldpmap = pmap_switch(pv->pv_pmap);
+ pte = pmap_find_vhpt(pv->pv_va);
+ KASSERT(pte != NULL, ("pte"));
+ pmap_pte_attr(pte, ma);
+ pmap_invalidate_page(pv->pv_va);
+ pmap_switch(oldpmap);
+ PMAP_UNLOCK(pv->pv_pmap);
+ }
+ vm_page_unlock_queues();
+
+ if (ma == VM_MEMATTR_UNCACHEABLE) {
+#ifdef SMP
+ smp_rendezvous(NULL, pmap_page_set_memattr_1, NULL,
+ (void *)PAL_PREFETCH_VISIBILITY);
+#else
+ pmap_page_set_memattr_1((void *)PAL_PREFETCH_VISIBILITY);
+#endif
+ va = (void *)pmap_page_to_va(m);
+ critical_enter();
+ cpu_flush_dcache(va, PAGE_SIZE);
+ critical_exit();
+#ifdef SMP
+ smp_rendezvous(NULL, pmap_page_set_memattr_1, NULL,
+ (void *)PAL_MC_DRAIN);
+#else
+ pmap_page_set_memattr_1((void *)PAL_MC_DRAIN);
+#endif
+ }
+}
+
+/*
* perform the pmap work for mincore
*/
int
@@ -2244,7 +2344,7 @@ pmap_mincore(pmap_t pmap, vm_offset_t addr, vm_paddr_t *locked_pa)
struct ia64_lpte *pte, tpte;
vm_paddr_t pa;
int val;
-
+
PMAP_LOCK(pmap);
retry:
oldpmap = pmap_switch(pmap);
diff --git a/sys/ia64/include/efi.h b/sys/ia64/include/efi.h
index f32f3fa..02bef10 100644
--- a/sys/ia64/include/efi.h
+++ b/sys/ia64/include/efi.h
@@ -161,8 +161,11 @@ void efi_boot_finish(void);
int efi_boot_minimal(uint64_t);
void *efi_get_table(struct uuid *);
void efi_get_time(struct efi_tm *);
+struct efi_md *efi_md_find(vm_paddr_t);
struct efi_md *efi_md_first(void);
+struct efi_md *efi_md_last(void);
struct efi_md *efi_md_next(struct efi_md *);
+struct efi_md *efi_md_prev(struct efi_md *);
void efi_reset_system(void);
int efi_set_time(struct efi_tm *);
int efi_var_get(efi_char *, struct uuid *, uint32_t *, size_t *, void *);
diff --git a/sys/ia64/include/pmap.h b/sys/ia64/include/pmap.h
index 6f3b320..2b89df0 100644
--- a/sys/ia64/include/pmap.h
+++ b/sys/ia64/include/pmap.h
@@ -68,6 +68,7 @@ struct pv_entry;
struct md_page {
int pv_list_count;
TAILQ_HEAD(,pv_entry) pv_list;
+ vm_memattr_t memattr;
};
struct pmap {
@@ -115,21 +116,22 @@ extern vm_offset_t virtual_end;
extern uint64_t pmap_vhpt_base[];
extern int pmap_vhpt_log2size;
-#define pmap_page_get_memattr(m) VM_MEMATTR_DEFAULT
+#define pmap_page_get_memattr(m) ((m)->md.memattr)
#define pmap_page_is_mapped(m) (!TAILQ_EMPTY(&(m)->md.pv_list))
-#define pmap_page_set_memattr(m, ma) (void)0
#define pmap_mapbios(pa, sz) pmap_mapdev(pa, sz)
#define pmap_unmapbios(va, sz) pmap_unmapdev(va, sz)
-vm_offset_t pmap_steal_memory(vm_size_t);
vm_offset_t pmap_alloc_vhpt(void);
void pmap_bootstrap(void);
void pmap_kenter(vm_offset_t va, vm_offset_t pa);
vm_paddr_t pmap_kextract(vm_offset_t va);
void pmap_kremove(vm_offset_t);
void *pmap_mapdev(vm_paddr_t, vm_size_t);
-void pmap_unmapdev(vm_offset_t, vm_size_t);
+void pmap_page_set_memattr(vm_page_t, vm_memattr_t);
+vm_offset_t pmap_page_to_va(vm_page_t);
+vm_offset_t pmap_steal_memory(vm_size_t);
struct pmap *pmap_switch(struct pmap *pmap);
+void pmap_unmapdev(vm_offset_t, vm_size_t);
#endif /* _KERNEL */
diff --git a/sys/ia64/include/sf_buf.h b/sys/ia64/include/sf_buf.h
index 8d67542..75bcdfa 100644
--- a/sys/ia64/include/sf_buf.h
+++ b/sys/ia64/include/sf_buf.h
@@ -41,18 +41,20 @@
*/
struct sf_buf;
-static __inline vm_offset_t
-sf_buf_kva(struct sf_buf *sf)
+static __inline vm_page_t
+sf_buf_page(struct sf_buf *sf)
{
-
- return (IA64_PHYS_TO_RR7(VM_PAGE_TO_PHYS((vm_page_t)sf)));
+
+ return ((vm_page_t)sf);
}
-static __inline vm_page_t
-sf_buf_page(struct sf_buf *sf)
+static __inline vm_offset_t
+sf_buf_kva(struct sf_buf *sf)
{
+ vm_page_t m;
- return ((vm_page_t)sf);
+ m = sf_buf_page(sf);
+ return (pmap_page_to_va(m));
}
#endif /* !_MACHINE_SF_BUF_H_ */
diff --git a/sys/kern/Make.tags.inc b/sys/kern/Make.tags.inc
index ad7ea11..6f5a13a 100644
--- a/sys/kern/Make.tags.inc
+++ b/sys/kern/Make.tags.inc
@@ -37,6 +37,7 @@ COMM= ${SYS}/dev/advansys/*.[ch] \
${SYS}/fs/smbfs/*.[ch] \
${SYS}/fs/udf/*.[ch] \
${SYS}/fs/unionfs/*.[ch] \
+ ${SYS}/geom/*.[ch] \
${SYS}/kern/*.[ch] \
${SYS}/net/*.[ch] \
${SYS}/netatalk/*.[ch] \
@@ -55,6 +56,7 @@ COMM= ${SYS}/dev/advansys/*.[ch] \
${SYS}/sys/*.[ch]
COMMDIR1= ${SYS}/conf \
+ ${SYS}/geom \
${SYS}/kern \
${SYS}/net \
${SYS}/netatalk \
diff --git a/sys/kern/imgact_elf.c b/sys/kern/imgact_elf.c
index ad79360..45f6d64 100644
--- a/sys/kern/imgact_elf.c
+++ b/sys/kern/imgact_elf.c
@@ -1115,6 +1115,7 @@ __elfN(coredump)(struct thread *td, struct vnode *vp, off_t limit, int flags)
hdrsize = 0;
__elfN(puthdr)(td, (void *)NULL, &hdrsize, seginfo.count);
+#ifdef RACCT
PROC_LOCK(td->td_proc);
error = racct_add(td->td_proc, RACCT_CORE, hdrsize + seginfo.size);
PROC_UNLOCK(td->td_proc);
@@ -1122,6 +1123,7 @@ __elfN(coredump)(struct thread *td, struct vnode *vp, off_t limit, int flags)
error = EFAULT;
goto done;
}
+#endif
if (hdrsize + seginfo.size >= limit) {
error = EFAULT;
goto done;
diff --git a/sys/kern/init_sysent.c b/sys/kern/init_sysent.c
index e45ffc5..004516b 100644
--- a/sys/kern/init_sysent.c
+++ b/sys/kern/init_sysent.c
@@ -548,8 +548,8 @@ struct sysent sysent[] = {
{ AS(msgctl_args), (sy_call_t *)lkmressys, AUE_NULL, NULL, 0, 0, 0, SY_THR_ABSENT }, /* 511 = msgctl */
{ AS(shmctl_args), (sy_call_t *)lkmressys, AUE_NULL, NULL, 0, 0, 0, SY_THR_ABSENT }, /* 512 = shmctl */
{ AS(lpathconf_args), (sy_call_t *)lpathconf, AUE_LPATHCONF, NULL, 0, 0, 0, SY_THR_STATIC }, /* 513 = lpathconf */
- { 0, (sy_call_t *)nosys, AUE_NULL, NULL, 0, 0, 0, SY_THR_ABSENT }, /* 514 = cap_new */
- { 0, (sy_call_t *)nosys, AUE_NULL, NULL, 0, 0, 0, SY_THR_ABSENT }, /* 515 = cap_getrights */
+ { AS(cap_new_args), (sy_call_t *)cap_new, AUE_CAP_NEW, NULL, 0, 0, SYF_CAPENABLED, SY_THR_STATIC }, /* 514 = cap_new */
+ { AS(cap_getrights_args), (sy_call_t *)cap_getrights, AUE_CAP_GETRIGHTS, NULL, 0, 0, SYF_CAPENABLED, SY_THR_STATIC }, /* 515 = cap_getrights */
{ 0, (sy_call_t *)cap_enter, AUE_CAP_ENTER, NULL, 0, 0, SYF_CAPENABLED, SY_THR_STATIC }, /* 516 = cap_enter */
{ AS(cap_getmode_args), (sy_call_t *)cap_getmode, AUE_CAP_GETMODE, NULL, 0, 0, SYF_CAPENABLED, SY_THR_STATIC }, /* 517 = cap_getmode */
{ 0, (sy_call_t *)nosys, AUE_NULL, NULL, 0, 0, 0, SY_THR_ABSENT }, /* 518 = pdfork */
diff --git a/sys/kern/kern_clock.c b/sys/kern/kern_clock.c
index f3f49ca..681b645 100644
--- a/sys/kern/kern_clock.c
+++ b/sys/kern/kern_clock.c
@@ -842,7 +842,7 @@ watchdog_fire(void)
curintr = intrcnt;
curname = intrnames;
inttotal = 0;
- nintr = eintrcnt - intrcnt;
+ nintr = sintrcnt;
printf("interrupt total\n");
while (--nintr >= 0) {
diff --git a/sys/kern/kern_descrip.c b/sys/kern/kern_descrip.c
index 7f32d47..829ece2 100644
--- a/sys/kern/kern_descrip.c
+++ b/sys/kern/kern_descrip.c
@@ -37,6 +37,7 @@
#include <sys/cdefs.h>
__FBSDID("$FreeBSD$");
+#include "opt_capsicum.h"
#include "opt_compat.h"
#include "opt_ddb.h"
#include "opt_ktrace.h"
@@ -44,6 +45,7 @@ __FBSDID("$FreeBSD$");
#include <sys/param.h>
#include <sys/systm.h>
+#include <sys/capability.h>
#include <sys/conf.h>
#include <sys/domain.h>
#include <sys/fcntl.h>
@@ -91,6 +93,7 @@ __FBSDID("$FreeBSD$");
#include <security/audit/audit.h>
#include <vm/uma.h>
+#include <vm/vm.h>
#include <ddb/ddb.h>
@@ -818,6 +821,7 @@ do_dup(struct thread *td, int flags, int old, int new,
* descriptors, just put the limit on the size of the file
* descriptor table.
*/
+#ifdef RACCT
PROC_LOCK(p);
error = racct_set(p, RACCT_NOFILE, new + 1);
PROC_UNLOCK(p);
@@ -826,6 +830,7 @@ do_dup(struct thread *td, int flags, int old, int new,
fdrop(fp, td);
return (EMFILE);
}
+#endif
fdgrowtable(fdp, new + 1);
}
if (fdp->fd_ofiles[new] == NULL)
@@ -1155,7 +1160,7 @@ kern_close(td, fd)
int fd;
{
struct filedesc *fdp;
- struct file *fp;
+ struct file *fp, *fp_object;
int error;
int holdleaders;
@@ -1190,8 +1195,14 @@ kern_close(td, fd)
* added, and deleteing a knote for the new fd.
*/
knote_fdclose(td, fd);
- if (fp->f_type == DTYPE_MQUEUE)
- mq_fdclose(td, fd, fp);
+
+ /*
+ * When we're closing an fd with a capability, we need to notify
+ * mqueue if the underlying object is of type mqueue.
+ */
+ (void)cap_funwrap(fp, 0, &fp_object);
+ if (fp_object->f_type == DTYPE_MQUEUE)
+ mq_fdclose(td, fd, fp_object);
FILEDESC_XUNLOCK(fdp);
error = closef(fp, td);
@@ -1473,7 +1484,10 @@ fdalloc(struct thread *td, int minfd, int *result)
{
struct proc *p = td->td_proc;
struct filedesc *fdp = p->p_fd;
- int fd = -1, maxfd, error;
+ int fd = -1, maxfd;
+#ifdef RACCT
+ int error;
+#endif
FILEDESC_XLOCK_ASSERT(fdp);
@@ -1496,11 +1510,13 @@ fdalloc(struct thread *td, int minfd, int *result)
return (EMFILE);
if (fd < fdp->fd_nfiles)
break;
+#ifdef RACCT
PROC_LOCK(p);
error = racct_set(p, RACCT_NOFILE, min(fdp->fd_nfiles * 2, maxfd));
PROC_UNLOCK(p);
if (error != 0)
return (EMFILE);
+#endif
fdgrowtable(fdp, min(fdp->fd_nfiles * 2, maxfd));
}
@@ -1770,11 +1786,11 @@ fdcopy(struct filedesc *fdp)
FILEDESC_XUNLOCK(newfdp);
FILEDESC_SLOCK(fdp);
}
- /* copy everything except kqueue descriptors */
+ /* copy all passable descriptors (i.e. not kqueue) */
newfdp->fd_freefile = -1;
for (i = 0; i <= fdp->fd_lastfile; ++i) {
if (fdisused(fdp, i) &&
- fdp->fd_ofiles[i]->f_type != DTYPE_KQUEUE &&
+ (fdp->fd_ofiles[i]->f_ops->fo_flags & DFLAG_PASSABLE) &&
fdp->fd_ofiles[i]->f_ops != &badfileops) {
newfdp->fd_ofiles[i] = fdp->fd_ofiles[i];
newfdp->fd_ofileflags[i] = fdp->fd_ofileflags[i];
@@ -1816,9 +1832,11 @@ fdfree(struct thread *td)
if (fdp == NULL)
return;
+#ifdef RACCT
PROC_LOCK(td->td_proc);
racct_set(td->td_proc, RACCT_NOFILE, 0);
PROC_UNLOCK(td->td_proc);
+#endif
/* Check for special need to clear POSIX style locks */
fdtol = td->td_proc->p_fdtol;
@@ -2134,6 +2152,7 @@ closef(struct file *fp, struct thread *td)
struct flock lf;
struct filedesc_to_leader *fdtol;
struct filedesc *fdp;
+ struct file *fp_object;
/*
* POSIX record locking dictates that any close releases ALL
@@ -2146,11 +2165,15 @@ closef(struct file *fp, struct thread *td)
* NULL thread pointer when there really is no owning
* context that might have locks, or the locks will be
* leaked.
+ *
+ * If this is a capability, we do lock processing under the underlying
+ * node, not the capability itself.
*/
- if (fp->f_type == DTYPE_VNODE && td != NULL) {
+ (void)cap_funwrap(fp, 0, &fp_object);
+ if ((fp_object->f_type == DTYPE_VNODE) && (td != NULL)) {
int vfslocked;
- vp = fp->f_vnode;
+ vp = fp_object->f_vnode;
vfslocked = VFS_LOCK_GIANT(vp->v_mount);
if ((td->td_proc->p_leader->p_flag & P_ADVLOCK) != 0) {
lf.l_whence = SEEK_SET;
@@ -2180,7 +2203,7 @@ closef(struct file *fp, struct thread *td)
lf.l_start = 0;
lf.l_len = 0;
lf.l_type = F_UNLCK;
- vp = fp->f_vnode;
+ vp = fp_object->f_vnode;
(void) VOP_ADVLOCK(vp,
(caddr_t)fdtol->fdl_leader,
F_UNLCK, &lf, F_POSIX);
@@ -2259,15 +2282,27 @@ fget_unlocked(struct filedesc *fdp, int fd)
* If the descriptor doesn't exist or doesn't match 'flags', EBADF is
* returned.
*
+ * If the FGET_GETCAP flag is set, the capability itself will be returned.
+ * Calling _fget() with FGET_GETCAP on a non-capability will return EINVAL.
+ * Otherwise, if the file is a capability, its rights will be checked against
+ * the capability rights mask, and if successful, the object will be unwrapped.
+ *
* If an error occured the non-zero error is returned and *fpp is set to
* NULL. Otherwise *fpp is held and set and zero is returned. Caller is
* responsible for fdrop().
*/
+#define FGET_GETCAP 0x00000001
static __inline int
-_fget(struct thread *td, int fd, struct file **fpp, int flags)
+_fget(struct thread *td, int fd, struct file **fpp, int flags,
+ cap_rights_t needrights, cap_rights_t *haverights, u_char *maxprotp,
+ int fget_flags)
{
struct filedesc *fdp;
struct file *fp;
+#ifdef CAPABILITIES
+ struct file *fp_fromcap;
+ int error;
+#endif
*fpp = NULL;
if (td == NULL || (fdp = td->td_proc->p_fd) == NULL)
@@ -2278,6 +2313,47 @@ _fget(struct thread *td, int fd, struct file **fpp, int flags)
fdrop(fp, td);
return (EBADF);
}
+
+#ifdef CAPABILITIES
+ /*
+ * If a capability has been requested, return the capability directly.
+ * Otherwise, check capability rights, extract the underlying object,
+ * and check its access flags.
+ */
+ if (fget_flags & FGET_GETCAP) {
+ if (fp->f_type != DTYPE_CAPABILITY) {
+ fdrop(fp, td);
+ return (EINVAL);
+ }
+ } else {
+ if (maxprotp == NULL)
+ error = cap_funwrap(fp, needrights, &fp_fromcap);
+ else
+ error = cap_funwrap_mmap(fp, needrights, maxprotp,
+ &fp_fromcap);
+ if (error) {
+ fdrop(fp, td);
+ return (error);
+ }
+
+ /*
+ * If we've unwrapped a file, drop the original capability
+ * and hold the new descriptor. fp after this point refers to
+ * the actual (unwrapped) object, not the capability.
+ */
+ if (fp != fp_fromcap) {
+ fhold(fp_fromcap);
+ fdrop(fp, td);
+ fp = fp_fromcap;
+ }
+ }
+#else /* !CAPABILITIES */
+ KASSERT(fp->f_type != DTYPE_CAPABILITY,
+ ("%s: saw capability", __func__));
+ if (maxprotp != NULL)
+ *maxprotp = VM_PROT_ALL;
+#endif /* CAPABILITIES */
+
/*
* FREAD and FWRITE failure return EBADF as per POSIX.
*
@@ -2296,23 +2372,36 @@ int
fget(struct thread *td, int fd, struct file **fpp)
{
- return(_fget(td, fd, fpp, 0));
+ return(_fget(td, fd, fpp, 0, 0, NULL, NULL, 0));
}
int
fget_read(struct thread *td, int fd, struct file **fpp)
{
- return(_fget(td, fd, fpp, FREAD));
+ return(_fget(td, fd, fpp, FREAD, 0, NULL, NULL, 0));
}
int
fget_write(struct thread *td, int fd, struct file **fpp)
{
- return(_fget(td, fd, fpp, FWRITE));
+ return(_fget(td, fd, fpp, FWRITE, 0, NULL, NULL, 0));
+}
+
+/*
+ * Unlike the other fget() calls, which will accept and check capability rights
+ * but never return capabilities, fgetcap() returns the capability but doesn't
+ * check capability rights.
+ */
+int
+fgetcap(struct thread *td, int fd, struct file **fpp)
+{
+
+ return (_fget(td, fd, fpp, 0, 0, NULL, NULL, FGET_GETCAP));
}
+
/*
* Like fget() but loads the underlying vnode, or returns an error if the
* descriptor does not represent a vnode. Note that pipes use vnodes but
@@ -2327,7 +2416,7 @@ _fgetvp(struct thread *td, int fd, struct vnode **vpp, int flags)
int error;
*vpp = NULL;
- if ((error = _fget(td, fd, &fp, flags)) != 0)
+ if ((error = _fget(td, fd, &fp, flags, 0, NULL, NULL, 0)) != 0)
return (error);
if (fp->f_vnode == NULL) {
error = EINVAL;
@@ -2383,7 +2472,7 @@ fgetsock(struct thread *td, int fd, struct socket **spp, u_int *fflagp)
*spp = NULL;
if (fflagp != NULL)
*fflagp = 0;
- if ((error = _fget(td, fd, &fp, 0)) != 0)
+ if ((error = _fget(td, fd, &fp, 0, 0, NULL, NULL, 0)) != 0)
return (error);
if (fp->f_type != DTYPE_SOCKET) {
error = ENOTSOCK;
@@ -2419,6 +2508,9 @@ fputsock(struct socket *so)
/*
* Handle the last reference to a file being closed.
+ *
+ * No special capability handling here, as the capability's fo_close will run
+ * instead of the object here, and perform any necessary drop on the object.
*/
int
_fdrop(struct file *fp, struct thread *td)
diff --git a/sys/kern/kern_exec.c b/sys/kern/kern_exec.c
index f30f89a..f7f80af 100644
--- a/sys/kern/kern_exec.c
+++ b/sys/kern/kern_exec.c
@@ -36,6 +36,7 @@ __FBSDID("$FreeBSD$");
#include <sys/param.h>
#include <sys/capability.h>
#include <sys/systm.h>
+#include <sys/capability.h>
#include <sys/eventhandler.h>
#include <sys/lock.h>
#include <sys/mutex.h>
@@ -113,8 +114,8 @@ SYSCTL_PROC(_kern, KERN_PS_STRINGS, ps_strings, CTLTYPE_ULONG|CTLFLAG_RD,
NULL, 0, sysctl_kern_ps_strings, "LU", "");
/* XXX This should be vm_size_t. */
-SYSCTL_PROC(_kern, KERN_USRSTACK, usrstack, CTLTYPE_ULONG|CTLFLAG_RD,
- NULL, 0, sysctl_kern_usrstack, "LU", "");
+SYSCTL_PROC(_kern, KERN_USRSTACK, usrstack, CTLTYPE_ULONG|CTLFLAG_RD|
+ CTLFLAG_CAPRD, NULL, 0, sysctl_kern_usrstack, "LU", "");
SYSCTL_PROC(_kern, OID_AUTO, stackprot, CTLTYPE_INT|CTLFLAG_RD,
NULL, 0, sysctl_kern_stackprot, "I", "");
diff --git a/sys/kern/kern_exit.c b/sys/kern/kern_exit.c
index bb25d17..30b94b6 100644
--- a/sys/kern/kern_exit.c
+++ b/sys/kern/kern_exit.c
@@ -744,9 +744,11 @@ proc_reap(struct thread *td, struct proc *p, int *status, int options,
* Destroy resource accounting information associated with the process.
*/
racct_proc_exit(p);
+#ifdef RACCT
PROC_LOCK(p->p_pptr);
racct_sub(p->p_pptr, RACCT_NPROC, 1);
PROC_UNLOCK(p->p_pptr);
+#endif
/*
* Free credentials, arguments, and sigacts.
@@ -905,19 +907,23 @@ loop:
void
proc_reparent(struct proc *child, struct proc *parent)
{
+#ifdef RACCT
int locked;
+#endif
sx_assert(&proctree_lock, SX_XLOCKED);
PROC_LOCK_ASSERT(child, MA_OWNED);
if (child->p_pptr == parent)
return;
+#ifdef RACCT
locked = PROC_LOCKED(parent);
if (!locked)
PROC_LOCK(parent);
racct_add_force(parent, RACCT_NPROC, 1);
if (!locked)
PROC_UNLOCK(parent);
+#endif
PROC_LOCK(child->p_pptr);
racct_sub(child->p_pptr, RACCT_NPROC, 1);
sigqueue_take(child->p_ksi);
diff --git a/sys/kern/kern_fail.c b/sys/kern/kern_fail.c
index e0fb32b..f192471 100644
--- a/sys/kern/kern_fail.c
+++ b/sys/kern/kern_fail.c
@@ -52,6 +52,7 @@
#include <sys/cdefs.h>
__FBSDID("$FreeBSD$");
+#include <sys/ctype.h>
#include <sys/errno.h>
#include <sys/fail.h>
#include <sys/kernel.h>
@@ -59,6 +60,7 @@ __FBSDID("$FreeBSD$");
#include <sys/lock.h>
#include <sys/malloc.h>
#include <sys/mutex.h>
+#include <sys/proc.h>
#include <sys/sbuf.h>
#include <machine/stdarg.h>
@@ -88,16 +90,20 @@ enum fail_point_t {
FAIL_POINT_BREAK, /**< break into the debugger */
FAIL_POINT_PRINT, /**< print a message */
FAIL_POINT_SLEEP, /**< sleep for some msecs */
- FAIL_POINT_INVALID, /**< placeholder */
+ FAIL_POINT_NUMTYPES
};
-static const char *fail_type_strings[] = {
- "off",
- "panic",
- "return",
- "break",
- "print",
- "sleep",
+static struct {
+ const char *name;
+ int nmlen;
+} fail_type_strings[] = {
+#define FP_TYPE_NM_LEN(s) { s, sizeof(s) - 1 }
+ [FAIL_POINT_OFF] = FP_TYPE_NM_LEN("off"),
+ [FAIL_POINT_PANIC] = FP_TYPE_NM_LEN("panic"),
+ [FAIL_POINT_RETURN] = FP_TYPE_NM_LEN("return"),
+ [FAIL_POINT_BREAK] = FP_TYPE_NM_LEN("break"),
+ [FAIL_POINT_PRINT] = FP_TYPE_NM_LEN("print"),
+ [FAIL_POINT_SLEEP] = FP_TYPE_NM_LEN("sleep"),
};
/**
@@ -109,7 +115,7 @@ struct fail_point_entry {
int fe_arg; /**< argument to type (e.g. return value) */
int fe_prob; /**< likelihood of firing in millionths */
int fe_count; /**< number of times to fire, 0 means always */
-
+ pid_t fe_pid; /**< only fail for this process */
TAILQ_ENTRY(fail_point_entry) fe_entries; /**< next entry in fail point */
};
@@ -120,7 +126,7 @@ fail_point_sleep(struct fail_point *fp, struct fail_point_entry *ent,
/* convert from millisecs to ticks, rounding up */
int timo = ((msecs * hz) + 999) / 1000;
- if (timo) {
+ if (timo > 0) {
if (fp->fp_sleep_fn == NULL) {
msleep(fp, &g_fp_mtx, PWAIT, "failpt", timo);
} else {
@@ -191,19 +197,13 @@ fail_point_init(struct fail_point *fp, const char *fmt, ...)
void
fail_point_destroy(struct fail_point *fp)
{
- struct fail_point_entry *ent;
- if (fp->fp_flags & FAIL_POINT_DYNAMIC_NAME && fp->fp_name != NULL) {
- fp_free((void *)(intptr_t)fp->fp_name);
+ if ((fp->fp_flags & FAIL_POINT_DYNAMIC_NAME) != 0) {
+ fp_free(__DECONST(void *, fp->fp_name));
fp->fp_name = NULL;
}
fp->fp_flags = 0;
-
- while (!TAILQ_EMPTY(&fp->fp_entries)) {
- ent = TAILQ_FIRST(&fp->fp_entries);
- TAILQ_REMOVE(&fp->fp_entries, ent, fe_entries);
- fp_free(ent);
- }
+ clear_entries(&fp->fp_entries);
}
/**
@@ -222,16 +222,14 @@ fail_point_eval_nontrivial(struct fail_point *fp, int *return_value)
FP_LOCK();
- ent = TAILQ_FIRST(&fp->fp_entries);
- while (ent) {
+ TAILQ_FOREACH_SAFE(ent, &fp->fp_entries, fe_entries, next) {
int cont = 0; /* don't continue by default */
- next = TAILQ_NEXT(ent, fe_entries);
if (ent->fe_prob < PROB_MAX &&
- ent->fe_prob < random() % PROB_MAX) {
- cont = 1;
- goto loop_end;
- }
+ ent->fe_prob < random() % PROB_MAX)
+ continue;
+ if (ent->fe_pid != NO_PID && ent->fe_pid != curproc->p_pid)
+ continue;
switch (ent->fe_type) {
case FAIL_POINT_PANIC:
@@ -239,13 +237,14 @@ fail_point_eval_nontrivial(struct fail_point *fp, int *return_value)
/* NOTREACHED */
case FAIL_POINT_RETURN:
- if (return_value)
+ if (return_value != NULL)
*return_value = ent->fe_arg;
ret = FAIL_POINT_RC_RETURN;
break;
case FAIL_POINT_BREAK:
- printf("fail point %s breaking to debugger\n", fp->fp_name);
+ printf("fail point %s breaking to debugger\n",
+ fp->fp_name);
breakpoint();
break;
@@ -273,13 +272,9 @@ fail_point_eval_nontrivial(struct fail_point *fp, int *return_value)
break;
}
- if (ent && ent->fe_count > 0 && --ent->fe_count == 0)
+ if (ent != NULL && ent->fe_count > 0 && --ent->fe_count == 0)
free_entry(&fp->fp_entries, ent);
-
-loop_end:
- if (cont)
- ent = next;
- else
+ if (cont == 0)
break;
}
@@ -290,7 +285,7 @@ loop_end:
FP_UNLOCK();
- return ret;
+ return (ret);
}
/**
@@ -320,9 +315,11 @@ fail_point_get(struct fail_point *fp, struct sbuf *sb)
}
if (ent->fe_count > 0)
sbuf_printf(sb, "%d*", ent->fe_count);
- sbuf_printf(sb, "%s", fail_type_strings[ent->fe_type]);
+ sbuf_printf(sb, "%s", fail_type_strings[ent->fe_type].name);
if (ent->fe_arg)
sbuf_printf(sb, "(%d)", ent->fe_arg);
+ if (ent->fe_pid != NO_PID)
+ sbuf_printf(sb, "[pid %d]", ent->fe_pid);
if (TAILQ_NEXT(ent, fe_entries))
sbuf_printf(sb, "->");
}
@@ -380,7 +377,7 @@ fail_point_set(struct fail_point *fp, char *buf)
fp->fp_name, fp->fp_location, buf);
#endif /* IWARNING */
- return error;
+ return (error);
}
#define MAX_FAIL_POINT_BUF 1023
@@ -422,9 +419,8 @@ fail_point_sysctl(SYSCTL_HANDLER_ARGS)
}
out:
- if (buf)
- fp_free(buf);
- return error;
+ fp_free(buf);
+ return (error);
}
/**
@@ -437,12 +433,17 @@ parse_fail_point(struct fail_point_entries *ents, char *p)
/* <fail_point> ::
* <term> ( "->" <term> )*
*/
- if (!(p = parse_term(ents, p)))
- return 0;
- while (*p)
- if (p[0] != '-' || p[1] != '>' || !(p = parse_term(ents, p+2)))
- return 0;
- return p;
+ p = parse_term(ents, p);
+ if (p == NULL)
+ return (NULL);
+ while (*p != '\0') {
+ if (p[0] != '-' || p[1] != '>')
+ return (NULL);
+ p = parse_term(ents, p + 2);
+ if (p == NULL)
+ return (NULL);
+ }
+ return (p);
}
/**
@@ -455,6 +456,7 @@ parse_term(struct fail_point_entries *ents, char *p)
ent = fp_malloc(sizeof *ent, M_WAITOK | M_ZERO);
ent->fe_prob = PROB_MAX;
+ ent->fe_pid = NO_PID;
TAILQ_INSERT_TAIL(ents, ent, fe_entries);
/*
@@ -462,14 +464,16 @@ parse_term(struct fail_point_entries *ents, char *p)
* ( (<float> "%") | (<integer> "*" ) )*
* <type>
* [ "(" <integer> ")" ]
+ * [ "[pid " <integer> "]" ]
*/
/* ( (<float> "%") | (<integer> "*" ) )* */
- while (('0' <= *p && *p <= '9') || *p == '.') {
+ while (isdigit(*p) || *p == '.') {
int units, decimal;
- if (!(p = parse_number(&units, &decimal, p)))
- return 0;
+ p = parse_number(&units, &decimal, p);
+ if (p == NULL)
+ return (NULL);
if (*p == '%') {
if (units > 100) /* prevent overflow early */
@@ -477,37 +481,44 @@ parse_term(struct fail_point_entries *ents, char *p)
ent->fe_prob = units * (PROB_MAX / 100) + decimal;
if (ent->fe_prob > PROB_MAX)
ent->fe_prob = PROB_MAX;
-
} else if (*p == '*') {
if (!units || decimal)
- return 0;
+ return (NULL);
ent->fe_count = units;
-
- } else {
- return 0;
- }
-
+ } else
+ return (NULL);
p++;
}
/* <type> */
- if (!(p = parse_type(ent, p)))
- return 0;
+ p = parse_type(ent, p);
+ if (p == NULL)
+ return (NULL);
if (*p == '\0')
- return p;
+ return (p);
/* [ "(" <integer> ")" ] */
if (*p != '(')
return p;
p++;
- if (('0' <= *p && *p <= '9') || *p == '-')
- ent->fe_arg = strtol(p, &p, 0);
- else
- return 0;
+ if (!isdigit(*p) && *p != '-')
+ return (NULL);
+ ent->fe_arg = strtol(p, &p, 0);
if (*p++ != ')')
- return 0;
-
- return p;
+ return (NULL);
+
+ /* [ "[pid " <integer> "]" ] */
+#define PID_STRING "[pid "
+ if (strncmp(p, PID_STRING, sizeof(PID_STRING) - 1) != 0)
+ return (p);
+ p += sizeof(PID_STRING) - 1;
+ if (!isdigit(*p))
+ return (NULL);
+ ent->fe_pid = strtol(p, &p, 0);
+ if (*p++ != ']')
+ return (NULL);
+
+ return (p);
}
/**
@@ -528,14 +539,14 @@ parse_number(int *out_units, int *out_decimal, char *p)
old_p = p;
*out_units = strtol(p, &p, 10);
if (p == old_p && *p != '.')
- return 0;
+ return (NULL);
/* fractional part */
*out_decimal = 0;
if (*p == '.') {
int digits = 0;
p++;
- while ('0' <= *p && *p <= '9') {
+ while (isdigit(*p)) {
int digit = *p - '0';
if (digits < PROB_DIGITS - 2)
*out_decimal = *out_decimal * 10 + digit;
@@ -545,12 +556,12 @@ parse_number(int *out_units, int *out_decimal, char *p)
p++;
}
if (!digits) /* need at least one digit after '.' */
- return 0;
+ return (NULL);
while (digits++ < PROB_DIGITS - 2) /* add implicit zeros */
*out_decimal *= 10;
}
- return p; /* success */
+ return (p); /* success */
}
/**
@@ -560,21 +571,16 @@ static char *
parse_type(struct fail_point_entry *ent, char *beg)
{
enum fail_point_t type;
- char *end = beg;
- while ('a' <= *end && *end <= 'z')
- end++;
- if (beg == end)
- return 0;
- for (type = FAIL_POINT_OFF; type != FAIL_POINT_INVALID; type++) {
- const char *p = fail_type_strings[type];
- const char *q = beg;
- while (q < end && *p++ == *q++);
- if (q == end && *p == '\0') {
+ int len;
+
+ for (type = FAIL_POINT_OFF; type < FAIL_POINT_NUMTYPES; type++) {
+ len = fail_type_strings[type].nmlen;
+ if (strncmp(fail_type_strings[type].name, beg, len) == 0) {
ent->fe_type = type;
- return end;
+ return (beg + len);
}
}
- return 0;
+ return (NULL);
}
/**
@@ -595,6 +601,7 @@ static void
clear_entries(struct fail_point_entries *ents)
{
struct fail_point_entry *ent, *ent_next;
+
TAILQ_FOREACH_SAFE(ent, ents, fe_entries, ent_next)
fp_free(ent);
TAILQ_INIT(ents);
diff --git a/sys/kern/kern_fork.c b/sys/kern/kern_fork.c
index 04e635a..9d3e22d 100644
--- a/sys/kern/kern_fork.c
+++ b/sys/kern/kern_fork.c
@@ -476,7 +476,10 @@ do_fork(struct thread *td, int flags, struct proc *p2, struct thread *td2,
sigacts_copy(newsigacts, p1->p_sigacts);
p2->p_sigacts = newsigacts;
}
- if (flags & RFLINUXTHPN)
+
+ if (flags & RFTSIGZMB)
+ p2->p_sigparent = RFTSIGNUM(flags);
+ else if (flags & RFLINUXTHPN)
p2->p_sigparent = SIGUSR1;
else
p2->p_sigparent = SIGCHLD;
@@ -719,10 +722,22 @@ fork1(struct thread *td, int flags, int pages, struct proc **procp)
static int curfail;
static struct timeval lastfail;
+ /* Check for the undefined or unimplemented flags. */
+ if ((flags & ~(RFFLAGS | RFTSIGFLAGS(RFTSIGMASK))) != 0)
+ return (EINVAL);
+
+ /* Signal value requires RFTSIGZMB. */
+ if ((flags & RFTSIGFLAGS(RFTSIGMASK)) != 0 && (flags & RFTSIGZMB) == 0)
+ return (EINVAL);
+
/* Can't copy and clear. */
if ((flags & (RFFDG|RFCFDG)) == (RFFDG|RFCFDG))
return (EINVAL);
+ /* Check the validity of the signal number. */
+ if ((flags & RFTSIGZMB) != 0 && (u_int)RFTSIGNUM(flags) > _SIG_MAXSIG)
+ return (EINVAL);
+
p1 = td->td_proc;
/*
@@ -734,11 +749,13 @@ fork1(struct thread *td, int flags, int pages, struct proc **procp)
return (fork_norfproc(td, flags));
}
+#ifdef RACCT
PROC_LOCK(p1);
error = racct_add(p1, RACCT_NPROC, 1);
PROC_UNLOCK(p1);
if (error != 0)
return (EAGAIN);
+#endif
mem_charged = 0;
vm2 = NULL;
@@ -822,6 +839,7 @@ fork1(struct thread *td, int flags, int pages, struct proc **procp)
goto fail;
}
+#ifdef RACCT
/*
* After fork, there is exactly one thread running.
*/
@@ -832,6 +850,7 @@ fork1(struct thread *td, int flags, int pages, struct proc **procp)
error = EAGAIN;
goto fail;
}
+#endif
/*
* Increment the count of procs running with this uid. Don't allow
@@ -874,9 +893,11 @@ fail1:
vmspace_free(vm2);
uma_zfree(proc_zone, newproc);
pause("fork", hz / 2);
+#ifdef RACCT
PROC_LOCK(p1);
racct_sub(p1, RACCT_NPROC, 1);
PROC_UNLOCK(p1);
+#endif
return (error);
}
diff --git a/sys/kern/kern_intr.c b/sys/kern/kern_intr.c
index 9cde590..b9ed881 100644
--- a/sys/kern/kern_intr.c
+++ b/sys/kern/kern_intr.c
@@ -1869,8 +1869,7 @@ SYSINIT(start_softintr, SI_SUB_SOFTINTR, SI_ORDER_FIRST, start_softintr,
static int
sysctl_intrnames(SYSCTL_HANDLER_ARGS)
{
- return (sysctl_handle_opaque(oidp, intrnames, eintrnames - intrnames,
- req));
+ return (sysctl_handle_opaque(oidp, intrnames, sintrnames, req));
}
SYSCTL_PROC(_hw, OID_AUTO, intrnames, CTLTYPE_OPAQUE | CTLFLAG_RD,
@@ -1879,8 +1878,7 @@ SYSCTL_PROC(_hw, OID_AUTO, intrnames, CTLTYPE_OPAQUE | CTLFLAG_RD,
static int
sysctl_intrcnt(SYSCTL_HANDLER_ARGS)
{
- return (sysctl_handle_opaque(oidp, intrcnt,
- (char *)eintrcnt - (char *)intrcnt, req));
+ return (sysctl_handle_opaque(oidp, intrcnt, sintrcnt, req));
}
SYSCTL_PROC(_hw, OID_AUTO, intrcnt, CTLTYPE_OPAQUE | CTLFLAG_RD,
@@ -1894,9 +1892,12 @@ DB_SHOW_COMMAND(intrcnt, db_show_intrcnt)
{
u_long *i;
char *cp;
+ u_int j;
cp = intrnames;
- for (i = intrcnt; i != eintrcnt && !db_pager_quit; i++) {
+ j = 0;
+ for (i = intrcnt; j < (sintrcnt / sizeof(u_long)) && !db_pager_quit;
+ i++, j++) {
if (*cp == '\0')
break;
if (*i != 0)
diff --git a/sys/kern/kern_jail.c b/sys/kern/kern_jail.c
index 5850ad1..358d673 100644
--- a/sys/kern/kern_jail.c
+++ b/sys/kern/kern_jail.c
@@ -3639,6 +3639,7 @@ prison_priv_check(struct ucred *cred, int priv)
case PRIV_NET_LAGG:
case PRIV_NET_GIF:
case PRIV_NET_SETIFVNET:
+ case PRIV_NET_SETIFFIB:
/*
* 802.11-related privileges.
diff --git a/sys/kern/kern_linker.c b/sys/kern/kern_linker.c
index 86a14ae..f919254 100644
--- a/sys/kern/kern_linker.c
+++ b/sys/kern/kern_linker.c
@@ -70,6 +70,9 @@ SYSCTL_INT(_debug, OID_AUTO, kld_debug, CTLFLAG_RW,
#define KLD_LOCK() sx_xlock(&kld_sx)
#define KLD_UNLOCK() sx_xunlock(&kld_sx)
+#define KLD_DOWNGRADE() sx_downgrade(&kld_sx)
+#define KLD_LOCK_READ() sx_slock(&kld_sx)
+#define KLD_UNLOCK_READ() sx_sunlock(&kld_sx)
#define KLD_LOCKED() sx_xlocked(&kld_sx)
#define KLD_LOCK_ASSERT() do { \
if (!cold) \
@@ -1019,18 +1022,24 @@ kern_kldload(struct thread *td, const char *file, int *fileid)
KLD_LOCK();
error = linker_load_module(kldname, modname, NULL, NULL, &lf);
- if (error)
- goto unlock;
+ if (error) {
+ KLD_UNLOCK();
+ goto done;
+ }
+ lf->userrefs++;
+ if (fileid != NULL)
+ *fileid = lf->id;
#ifdef HWPMC_HOOKS
+ KLD_DOWNGRADE();
pkm.pm_file = lf->filename;
pkm.pm_address = (uintptr_t) lf->address;
PMC_CALL_HOOK(td, PMC_FN_KLD_LOAD, (void *) &pkm);
-#endif
- lf->userrefs++;
- if (fileid != NULL)
- *fileid = lf->id;
-unlock:
+ KLD_UNLOCK_READ();
+#else
KLD_UNLOCK();
+#endif
+
+done:
CURVNET_RESTORE();
return (error);
}
@@ -1102,10 +1111,14 @@ kern_kldunload(struct thread *td, int fileid, int flags)
error = ENOENT;
#ifdef HWPMC_HOOKS
- if (error == 0)
+ if (error == 0) {
+ KLD_DOWNGRADE();
PMC_CALL_HOOK(td, PMC_FN_KLD_UNLOAD, (void *) &pkm);
+ KLD_UNLOCK_READ();
+ } else
+#else
+ KLD_UNLOCK();
#endif
- KLD_UNLOCK();
CURVNET_RESTORE();
return (error);
}
@@ -1932,7 +1945,7 @@ linker_hwpmc_list_objects(void)
int i, nmappings;
nmappings = 0;
- KLD_LOCK();
+ KLD_LOCK_READ();
TAILQ_FOREACH(lf, &linker_files, link)
nmappings++;
@@ -1947,7 +1960,7 @@ linker_hwpmc_list_objects(void)
kobase[i].pm_address = (uintptr_t)lf->address;
i++;
}
- KLD_UNLOCK();
+ KLD_UNLOCK_READ();
KASSERT(i > 0, ("linker_hpwmc_list_objects: no kernel objects?"));
diff --git a/sys/kern/kern_mib.c b/sys/kern/kern_mib.c
index f829551..75b3af9 100644
--- a/sys/kern/kern_mib.c
+++ b/sys/kern/kern_mib.c
@@ -57,7 +57,7 @@ __FBSDID("$FreeBSD$");
SYSCTL_NODE(, 0, sysctl, CTLFLAG_RW, 0,
"Sysctl internal magic");
-SYSCTL_NODE(, CTL_KERN, kern, CTLFLAG_RW, 0,
+SYSCTL_NODE(, CTL_KERN, kern, CTLFLAG_RW|CTLFLAG_CAPRD, 0,
"High kernel, proc, limits &c");
SYSCTL_NODE(, CTL_VM, vm, CTLFLAG_RW, 0,
"Virtual memory");
@@ -90,23 +90,23 @@ SYSCTL_NODE(, OID_AUTO, regression, CTLFLAG_RW, 0,
SYSCTL_STRING(_kern, OID_AUTO, ident, CTLFLAG_RD|CTLFLAG_MPSAFE,
kern_ident, 0, "Kernel identifier");
-SYSCTL_STRING(_kern, KERN_OSRELEASE, osrelease, CTLFLAG_RD|CTLFLAG_MPSAFE,
- osrelease, 0, "Operating system release");
+SYSCTL_STRING(_kern, KERN_OSRELEASE, osrelease, CTLFLAG_RD|CTLFLAG_MPSAFE|
+ CTLFLAG_CAPRD, osrelease, 0, "Operating system release");
-SYSCTL_INT(_kern, KERN_OSREV, osrevision, CTLFLAG_RD,
+SYSCTL_INT(_kern, KERN_OSREV, osrevision, CTLFLAG_RD|CTLFLAG_CAPRD,
0, BSD, "Operating system revision");
SYSCTL_STRING(_kern, KERN_VERSION, version, CTLFLAG_RD|CTLFLAG_MPSAFE,
version, 0, "Kernel version");
-SYSCTL_STRING(_kern, KERN_OSTYPE, ostype, CTLFLAG_RD|CTLFLAG_MPSAFE,
- ostype, 0, "Operating system type");
+SYSCTL_STRING(_kern, KERN_OSTYPE, ostype, CTLFLAG_RD|CTLFLAG_MPSAFE|
+ CTLFLAG_CAPRD, ostype, 0, "Operating system type");
/*
* NOTICE: The *userland* release date is available in
* /usr/include/osreldate.h
*/
-SYSCTL_INT(_kern, KERN_OSRELDATE, osreldate, CTLFLAG_RD,
+SYSCTL_INT(_kern, KERN_OSRELDATE, osreldate, CTLFLAG_RD|CTLFLAG_CAPRD,
&osreldate, 0, "Kernel release date");
SYSCTL_INT(_kern, KERN_MAXPROC, maxproc, CTLFLAG_RDTUN,
@@ -118,24 +118,24 @@ SYSCTL_INT(_kern, KERN_MAXPROCPERUID, maxprocperuid, CTLFLAG_RW,
SYSCTL_INT(_kern, OID_AUTO, maxusers, CTLFLAG_RDTUN,
&maxusers, 0, "Hint for kernel tuning");
-SYSCTL_INT(_kern, KERN_ARGMAX, argmax, CTLFLAG_RD,
+SYSCTL_INT(_kern, KERN_ARGMAX, argmax, CTLFLAG_RD|CTLFLAG_CAPRD,
0, ARG_MAX, "Maximum bytes of argument to execve(2)");
-SYSCTL_INT(_kern, KERN_POSIX1, posix1version, CTLFLAG_RD,
+SYSCTL_INT(_kern, KERN_POSIX1, posix1version, CTLFLAG_RD|CTLFLAG_CAPRD,
0, _POSIX_VERSION, "Version of POSIX attempting to comply to");
-SYSCTL_INT(_kern, KERN_NGROUPS, ngroups, CTLFLAG_RDTUN,
+SYSCTL_INT(_kern, KERN_NGROUPS, ngroups, CTLFLAG_RDTUN|CTLFLAG_CAPRD,
&ngroups_max, 0,
"Maximum number of supplemental groups a user can belong to");
-SYSCTL_INT(_kern, KERN_JOB_CONTROL, job_control, CTLFLAG_RD,
+SYSCTL_INT(_kern, KERN_JOB_CONTROL, job_control, CTLFLAG_RD|CTLFLAG_CAPRD,
0, 1, "Whether job control is available");
#ifdef _POSIX_SAVED_IDS
-SYSCTL_INT(_kern, KERN_SAVED_IDS, saved_ids, CTLFLAG_RD,
+SYSCTL_INT(_kern, KERN_SAVED_IDS, saved_ids, CTLFLAG_RD|CTLFLAG_CAPRD,
0, 1, "Whether saved set-group/user ID is available");
#else
-SYSCTL_INT(_kern, KERN_SAVED_IDS, saved_ids, CTLFLAG_RD,
+SYSCTL_INT(_kern, KERN_SAVED_IDS, saved_ids, CTLFLAG_RD|CTLFLAG_CAPRD,
0, 0, "Whether saved set-group/user ID is available");
#endif
@@ -144,13 +144,13 @@ char kernelname[MAXPATHLEN] = "/kernel"; /* XXX bloat */
SYSCTL_STRING(_kern, KERN_BOOTFILE, bootfile, CTLFLAG_RW,
kernelname, sizeof kernelname, "Name of kernel file booted");
-SYSCTL_INT(_hw, HW_NCPU, ncpu, CTLFLAG_RD,
+SYSCTL_INT(_hw, HW_NCPU, ncpu, CTLFLAG_RD|CTLFLAG_CAPRD,
&mp_ncpus, 0, "Number of active CPUs");
-SYSCTL_INT(_hw, HW_BYTEORDER, byteorder, CTLFLAG_RD,
+SYSCTL_INT(_hw, HW_BYTEORDER, byteorder, CTLFLAG_RD|CTLFLAG_CAPRD,
0, BYTE_ORDER, "System byte order");
-SYSCTL_INT(_hw, HW_PAGESIZE, pagesize, CTLFLAG_RD,
+SYSCTL_INT(_hw, HW_PAGESIZE, pagesize, CTLFLAG_RD|CTLFLAG_CAPRD,
0, PAGE_SIZE, "System memory page size");
static int
@@ -167,7 +167,7 @@ sysctl_kern_arnd(SYSCTL_HANDLER_ARGS)
}
SYSCTL_PROC(_kern, KERN_ARND, arandom,
- CTLTYPE_OPAQUE | CTLFLAG_RD | CTLFLAG_MPSAFE, NULL, 0,
+ CTLTYPE_OPAQUE | CTLFLAG_RD | CTLFLAG_MPSAFE | CTLFLAG_CAPRD, NULL, 0,
sysctl_kern_arnd, "", "arc4rand");
static int
@@ -448,6 +448,8 @@ FEATURE(compat_freebsd7, "Compatible with FreeBSD 7");
* This is really cheating. These actually live in the libc, something
* which I'm not quite sure is a good idea anyway, but in order for
* getnext and friends to actually work, we define dummies here.
+ *
+ * XXXRW: These probably should be CTLFLAG_CAPRD.
*/
SYSCTL_STRING(_user, USER_CS_PATH, cs_path, CTLFLAG_RD,
"", 0, "PATH that finds all the standard utilities");
diff --git a/sys/kern/kern_racct.c b/sys/kern/kern_racct.c
index 01f7777..401ce1d 100644
--- a/sys/kern/kern_racct.c
+++ b/sys/kern/kern_racct.c
@@ -103,7 +103,7 @@ SDT_PROBE_DEFINE2(racct, kernel, racct, leave, leave, "struct racct *",
int racct_types[] = {
[RACCT_CPU] =
- RACCT_IN_THOUSANDS,
+ RACCT_IN_MILLIONS,
[RACCT_DATA] =
RACCT_RECLAIMABLE | RACCT_INHERITABLE | RACCT_DENIABLE,
[RACCT_STACK] =
@@ -141,7 +141,7 @@ int racct_types[] = {
[RACCT_SHMSIZE] =
RACCT_RECLAIMABLE | RACCT_DENIABLE | RACCT_SLOPPY,
[RACCT_WALLCLOCK] =
- RACCT_IN_THOUSANDS };
+ RACCT_IN_MILLIONS };
static void
racct_add_racct(struct racct *dest, const struct racct *src)
@@ -173,7 +173,7 @@ racct_sub_racct(struct racct *dest, const struct racct *src)
* Update resource usage in dest.
*/
for (i = 0; i <= RACCT_MAX; i++) {
- if (!racct_is_sloppy(i)) {
+ if (!RACCT_IS_SLOPPY(i)) {
KASSERT(dest->r_resources[i] >= 0,
("racct propagation meltdown: dest < 0"));
KASSERT(src->r_resources[i] >= 0,
@@ -181,10 +181,10 @@ racct_sub_racct(struct racct *dest, const struct racct *src)
KASSERT(src->r_resources[i] <= dest->r_resources[i],
("racct propagation meltdown: src > dest"));
}
- if (racct_is_reclaimable(i)) {
+ if (RACCT_IS_RECLAIMABLE(i)) {
dest->r_resources[i] -= src->r_resources[i];
if (dest->r_resources[i] < 0) {
- KASSERT(racct_is_sloppy(i),
+ KASSERT(RACCT_IS_SLOPPY(i),
("racct_sub_racct: usage < 0"));
dest->r_resources[i] = 0;
}
@@ -218,9 +218,9 @@ racct_destroy_locked(struct racct **racctp)
racct = *racctp;
for (i = 0; i <= RACCT_MAX; i++) {
- if (racct_is_sloppy(i))
+ if (RACCT_IS_SLOPPY(i))
continue;
- if (!racct_is_reclaimable(i))
+ if (!RACCT_IS_RECLAIMABLE(i))
continue;
KASSERT(racct->r_resources[i] == 0,
("destroying non-empty racct: "
@@ -255,7 +255,7 @@ racct_alloc_resource(struct racct *racct, int resource,
racct->r_resources[resource] += amount;
if (racct->r_resources[resource] < 0) {
- KASSERT(racct_is_sloppy(resource),
+ KASSERT(RACCT_IS_SLOPPY(resource),
("racct_alloc_resource: usage < 0"));
racct->r_resources[resource] = 0;
}
@@ -285,7 +285,7 @@ racct_add(struct proc *p, int resource, uint64_t amount)
mtx_lock(&racct_lock);
#ifdef RCTL
error = rctl_enforce(p, resource, amount);
- if (error && racct_is_deniable(resource)) {
+ if (error && RACCT_IS_DENIABLE(resource)) {
SDT_PROBE(racct, kernel, rusage, add_failure, p, resource,
amount, 0, 0);
mtx_unlock(&racct_lock);
@@ -373,14 +373,14 @@ racct_set_locked(struct proc *p, int resource, uint64_t amount)
diff = amount - p->p_racct->r_resources[resource];
#ifdef notyet
- KASSERT(diff >= 0 || racct_is_reclaimable(resource),
+ KASSERT(diff >= 0 || RACCT_IS_RECLAIMABLE(resource),
("racct_set: usage of non-reclaimable resource %d dropping",
resource));
#endif
#ifdef RCTL
if (diff > 0) {
error = rctl_enforce(p, resource, diff);
- if (error && racct_is_deniable(resource)) {
+ if (error && RACCT_IS_DENIABLE(resource)) {
SDT_PROBE(racct, kernel, rusage, set_failure, p,
resource, amount, 0, 0);
return (error);
@@ -489,7 +489,7 @@ racct_sub(struct proc *p, int resource, uint64_t amount)
* We need proc lock to dereference p->p_ucred.
*/
PROC_LOCK_ASSERT(p, MA_OWNED);
- KASSERT(racct_is_reclaimable(resource),
+ KASSERT(RACCT_IS_RECLAIMABLE(resource),
("racct_sub: called for non-reclaimable resource %d", resource));
mtx_lock(&racct_lock);
@@ -512,7 +512,7 @@ racct_sub_cred_locked(struct ucred *cred, int resource, uint64_t amount)
0, 0);
#ifdef notyet
- KASSERT(racct_is_reclaimable(resource),
+ KASSERT(RACCT_IS_RECLAIMABLE(resource),
("racct_sub_cred: called for non-reclaimable resource %d",
resource));
#endif
@@ -564,7 +564,7 @@ racct_proc_fork(struct proc *parent, struct proc *child)
*/
for (i = 0; i <= RACCT_MAX; i++) {
if (parent->p_racct->r_resources[i] == 0 ||
- !racct_is_inheritable(i))
+ !RACCT_IS_INHERITABLE(i))
continue;
error = racct_set_locked(child, i,
diff --git a/sys/kern/kern_rctl.c b/sys/kern/kern_rctl.c
index 3d0a478..a939758 100644
--- a/sys/kern/kern_rctl.c
+++ b/sys/kern/kern_rctl.c
@@ -99,17 +99,17 @@ static struct dict subjectnames[] = {
{ NULL, -1 }};
static struct dict resourcenames[] = {
- { "cpu", RACCT_CPU },
- { "data", RACCT_DATA },
- { "stack", RACCT_STACK },
- { "core", RACCT_CORE },
- { "rss", RACCT_RSS },
- { "memlock", RACCT_MEMLOCK },
- { "nproc", RACCT_NPROC },
- { "nofile", RACCT_NOFILE },
- { "vmem", RACCT_VMEM },
- { "npts", RACCT_NPTS },
- { "swap", RACCT_SWAP },
+ { "cputime", RACCT_CPU },
+ { "datasize", RACCT_DATA },
+ { "stacksize", RACCT_STACK },
+ { "coredumpsize", RACCT_CORE },
+ { "memoryuse", RACCT_RSS },
+ { "memorylocked", RACCT_MEMLOCK },
+ { "maxproc", RACCT_NPROC },
+ { "openfiles", RACCT_NOFILE },
+ { "vmemoryuse", RACCT_VMEM },
+ { "pseudoterminals", RACCT_NPTS },
+ { "swapuse", RACCT_SWAP },
{ "nthr", RACCT_NTHR },
{ "msgqqueued", RACCT_MSGQQUEUED },
{ "msgqsize", RACCT_MSGQSIZE },
@@ -907,7 +907,7 @@ rctl_string_to_rule(char *rulestr, struct rctl_rule **rulep)
error = str2int64(amountstr, &rule->rr_amount);
if (error != 0)
goto out;
- if (racct_is_in_thousands(rule->rr_resource))
+ if (RACCT_IS_IN_MILLIONS(rule->rr_resource))
rule->rr_amount *= 1000;
}
@@ -947,7 +947,7 @@ rctl_rule_add(struct rctl_rule *rule)
/*
* Some rules just don't make sense. Note that the one below
- * cannot be rewritten using racct_is_deniable(); the RACCT_PCTCPU,
+ * cannot be rewritten using RACCT_IS_DENIABLE(); the RACCT_PCTCPU,
* for example, is not deniable in the racct sense, but the
* limit is enforced in a different way, so "deny" rules for %CPU
* do make sense.
@@ -958,7 +958,7 @@ rctl_rule_add(struct rctl_rule *rule)
return (EOPNOTSUPP);
if (rule->rr_per == RCTL_SUBJECT_TYPE_PROCESS &&
- racct_is_sloppy(rule->rr_resource))
+ RACCT_IS_SLOPPY(rule->rr_resource))
return (EOPNOTSUPP);
/*
@@ -1152,8 +1152,8 @@ rctl_rule_to_sbuf(struct sbuf *sb, const struct rctl_rule *rule)
amount = rule->rr_amount;
if (amount != RCTL_AMOUNT_UNDEFINED &&
- racct_is_in_thousands(rule->rr_resource))
- amount /= 1000;
+ RACCT_IS_IN_MILLIONS(rule->rr_resource))
+ amount /= 1000000;
sbuf_printf(sb, "%s:%s=%jd",
rctl_resource_name(rule->rr_resource),
@@ -1219,10 +1219,10 @@ rctl_racct_to_sbuf(struct racct *racct, int sloppy)
sb = sbuf_new_auto();
for (i = 0; i <= RACCT_MAX; i++) {
- if (sloppy == 0 && racct_is_sloppy(i))
+ if (sloppy == 0 && RACCT_IS_SLOPPY(i))
continue;
amount = racct->r_resources[i];
- if (racct_is_in_thousands(i))
+ if (RACCT_IS_IN_MILLIONS(i))
amount /= 1000;
sbuf_printf(sb, "%s=%jd,", rctl_resource_name(i), amount);
}
diff --git a/sys/kern/kern_rmlock.c b/sys/kern/kern_rmlock.c
index 3214e1b..1c7337d 100644
--- a/sys/kern/kern_rmlock.c
+++ b/sys/kern/kern_rmlock.c
@@ -263,7 +263,7 @@ _rm_rlock_hard(struct rmlock *rm, struct rm_priotracker *tracker, int trylock)
pc = pcpu_find(curcpu);
/* Check if we just need to do a proper critical_exit. */
- if (!CPU_OVERLAP(&pc->pc_cpumask, &rm->rm_writecpus)) {
+ if (!CPU_ISSET(pc->pc_cpuid, &rm->rm_writecpus)) {
critical_exit();
return (1);
}
@@ -325,7 +325,7 @@ _rm_rlock_hard(struct rmlock *rm, struct rm_priotracker *tracker, int trylock)
critical_enter();
pc = pcpu_find(curcpu);
- CPU_NAND(&rm->rm_writecpus, &pc->pc_cpumask);
+ CPU_CLR(pc->pc_cpuid, &rm->rm_writecpus);
rm_tracker_add(pc, tracker);
sched_pin();
critical_exit();
@@ -367,7 +367,7 @@ _rm_rlock(struct rmlock *rm, struct rm_priotracker *tracker, int trylock)
* conditional jump.
*/
if (0 == (td->td_owepreempt |
- CPU_OVERLAP(&rm->rm_writecpus, &pc->pc_cpumask)))
+ CPU_ISSET(pc->pc_cpuid, &rm->rm_writecpus)))
return (1);
/* We do not have a read token and need to acquire one. */
diff --git a/sys/kern/kern_sysctl.c b/sys/kern/kern_sysctl.c
index 8d2fdde..956bf0c 100644
--- a/sys/kern/kern_sysctl.c
+++ b/sys/kern/kern_sysctl.c
@@ -38,12 +38,14 @@
#include <sys/cdefs.h>
__FBSDID("$FreeBSD$");
+#include "opt_capsicum.h"
#include "opt_compat.h"
#include "opt_ktrace.h"
#include <sys/param.h>
#include <sys/fail.h>
#include <sys/systm.h>
+#include <sys/capability.h>
#include <sys/kernel.h>
#include <sys/sysctl.h>
#include <sys/malloc.h>
@@ -725,7 +727,12 @@ sysctl_sysctl_name(SYSCTL_HANDLER_ARGS)
return (error);
}
-static SYSCTL_NODE(_sysctl, 1, name, CTLFLAG_RD, sysctl_sysctl_name, "");
+/*
+ * XXXRW/JA: Shouldn't return name data for nodes that we don't permit in
+ * capability mode.
+ */
+static SYSCTL_NODE(_sysctl, 1, name, CTLFLAG_RD | CTLFLAG_CAPRD,
+ sysctl_sysctl_name, "");
static int
sysctl_sysctl_next_ls(struct sysctl_oid_list *lsp, int *name, u_int namelen,
@@ -806,7 +813,12 @@ sysctl_sysctl_next(SYSCTL_HANDLER_ARGS)
return (error);
}
-static SYSCTL_NODE(_sysctl, 2, next, CTLFLAG_RD, sysctl_sysctl_next, "");
+/*
+ * XXXRW/JA: Shouldn't return next data for nodes that we don't permit in
+ * capability mode.
+ */
+static SYSCTL_NODE(_sysctl, 2, next, CTLFLAG_RD | CTLFLAG_CAPRD,
+ sysctl_sysctl_next, "");
static int
name2oid(char *name, int *oid, int *len, struct sysctl_oid **oidpp)
@@ -902,9 +914,13 @@ sysctl_sysctl_name2oid(SYSCTL_HANDLER_ARGS)
return (error);
}
+/*
+ * XXXRW/JA: Shouldn't return name2oid data for nodes that we don't permit in
+ * capability mode.
+ */
SYSCTL_PROC(_sysctl, 3, name2oid,
- CTLTYPE_INT | CTLFLAG_RW | CTLFLAG_ANYBODY | CTLFLAG_MPSAFE,
- 0, 0, sysctl_sysctl_name2oid, "I", "");
+ CTLTYPE_INT | CTLFLAG_RW | CTLFLAG_ANYBODY | CTLFLAG_MPSAFE
+ | CTLFLAG_CAPRW, 0, 0, sysctl_sysctl_name2oid, "I", "");
static int
sysctl_sysctl_oidfmt(SYSCTL_HANDLER_ARGS)
@@ -931,7 +947,7 @@ sysctl_sysctl_oidfmt(SYSCTL_HANDLER_ARGS)
}
-static SYSCTL_NODE(_sysctl, 4, oidfmt, CTLFLAG_RD|CTLFLAG_MPSAFE,
+static SYSCTL_NODE(_sysctl, 4, oidfmt, CTLFLAG_RD|CTLFLAG_MPSAFE|CTLFLAG_CAPRD,
sysctl_sysctl_oidfmt, "");
static int
@@ -955,7 +971,8 @@ sysctl_sysctl_oiddescr(SYSCTL_HANDLER_ARGS)
return (error);
}
-static SYSCTL_NODE(_sysctl, 5, oiddescr, CTLFLAG_RD, sysctl_sysctl_oiddescr, "");
+static SYSCTL_NODE(_sysctl, 5, oiddescr, CTLFLAG_RD|CTLFLAG_CAPRD,
+ sysctl_sysctl_oiddescr, "");
/*
* Default "handler" functions.
@@ -1429,6 +1446,19 @@ sysctl_root(SYSCTL_HANDLER_ARGS)
KASSERT(req->td != NULL, ("sysctl_root(): req->td == NULL"));
+#ifdef CAPABILITY_MODE
+ /*
+ * If the process is in capability mode, then don't permit reading or
+ * writing unless specifically granted for the node.
+ */
+ if (IN_CAPABILITY_MODE(req->td)) {
+ if (req->oldptr && !(oid->oid_kind & CTLFLAG_CAPRD))
+ return (EPERM);
+ if (req->newptr && !(oid->oid_kind & CTLFLAG_CAPWR))
+ return (EPERM);
+ }
+#endif
+
/* Is this sysctl sensitive to securelevels? */
if (req->newptr && (oid->oid_kind & CTLFLAG_SECURE)) {
lvl = (oid->oid_kind & CTLMASK_SECURE) >> CTLSHIFT_SECURE;
diff --git a/sys/kern/kern_tc.c b/sys/kern/kern_tc.c
index 39d6f23..0c52071 100644
--- a/sys/kern/kern_tc.c
+++ b/sys/kern/kern_tc.c
@@ -492,6 +492,12 @@ tc_windup(void)
/* Now is a good time to change timecounters. */
if (th->th_counter != timecounter) {
+#ifndef __arm__
+ if ((timecounter->tc_flags & TC_FLAGS_C3STOP) != 0)
+ cpu_disable_deep_sleep++;
+ if ((th->th_counter->tc_flags & TC_FLAGS_C3STOP) != 0)
+ cpu_disable_deep_sleep--;
+#endif
th->th_counter = timecounter;
th->th_offset_count = ncount;
tc_min_ticktock_freq = max(1, timecounter->tc_frequency /
diff --git a/sys/kern/kern_thr.c b/sys/kern/kern_thr.c
index 7011a53..94e41e2 100644
--- a/sys/kern/kern_thr.c
+++ b/sys/kern/kern_thr.c
@@ -185,11 +185,13 @@ create_thread(struct thread *td, mcontext_t *ctx,
}
}
+#ifdef RACCT
PROC_LOCK(td->td_proc);
error = racct_add(p, RACCT_NTHR, 1);
PROC_UNLOCK(td->td_proc);
if (error != 0)
return (EPROCLIM);
+#endif
/* Initialize our td */
newtd = thread_alloc(0);
@@ -277,9 +279,11 @@ create_thread(struct thread *td, mcontext_t *ctx,
return (0);
fail:
+#ifdef RACCT
PROC_LOCK(p);
racct_sub(p, RACCT_NTHR, 1);
PROC_UNLOCK(p);
+#endif
return (error);
}
diff --git a/sys/kern/posix4_mib.c b/sys/kern/posix4_mib.c
index 2fb926b..e299787 100644
--- a/sys/kern/posix4_mib.c
+++ b/sys/kern/posix4_mib.c
@@ -57,7 +57,8 @@ static int p31b_sysctl_proc(SYSCTL_HANDLER_ARGS);
SYSCTL_DECL(_p1003_1b);
#define P1B_SYSCTL(num, name) \
- SYSCTL_INT(_p1003_1b, num, name, CTLFLAG_RD, facility + num - 1, 0, "");
+ SYSCTL_INT(_p1003_1b, num, name, CTLFLAG_RD | CTLFLAG_CAPRD, \
+ facility + num - 1, 0, "");
#define P1B_SYSCTL_RW(num, name) \
SYSCTL_PROC(_p1003_1b, num, name, CTLTYPE_INT | CTLFLAG_RW, NULL, num, \
p31b_sysctl_proc, "I", "");
@@ -67,7 +68,7 @@ SYSCTL_DECL(_p1003_1b);
SYSCTL_DECL(_kern_p1003_1b);
#define P1B_SYSCTL(num, name) \
- SYSCTL_INT(_kern_p1003_1b, OID_AUTO, name, CTLFLAG_RD, \
+ SYSCTL_INT(_kern_p1003_1b, OID_AUTO, name, CTLFLAG_RD | CTLFLAG_CAPRD, \
facility + num - 1, 0, "");
#define P1B_SYSCTL_RW(num, name) \
SYSCTL_PROC(_p1003_1b, OID_AUTO, name, CTLTYPE_INT | CTLFLAG_RW, NULL, \
diff --git a/sys/kern/sched_4bsd.c b/sys/kern/sched_4bsd.c
index 592bb80..574755f0 100644
--- a/sys/kern/sched_4bsd.c
+++ b/sys/kern/sched_4bsd.c
@@ -951,8 +951,7 @@ sched_switch(struct thread *td, struct thread *newtd, int flags)
if (td->td_flags & TDF_IDLETD) {
TD_SET_CAN_RUN(td);
#ifdef SMP
- /* Spinlock held here, assume no migration. */
- CPU_NAND(&idle_cpus_mask, PCPU_PTR(cpumask));
+ CPU_CLR(PCPU_GET(cpuid), &idle_cpus_mask);
#endif
} else {
if (TD_IS_RUNNING(td)) {
@@ -1026,7 +1025,7 @@ sched_switch(struct thread *td, struct thread *newtd, int flags)
#ifdef SMP
if (td->td_flags & TDF_IDLETD)
- CPU_OR(&idle_cpus_mask, PCPU_PTR(cpumask));
+ CPU_SET(PCPU_GET(cpuid), &idle_cpus_mask);
#endif
sched_lock.mtx_lock = (uintptr_t)td;
td->td_oncpu = PCPU_GET(cpuid);
@@ -1055,7 +1054,8 @@ static int
forward_wakeup(int cpunum)
{
struct pcpu *pc;
- cpuset_t dontuse, id, map, map2, me;
+ cpuset_t dontuse, map, map2;
+ u_int id, me;
int iscpuset;
mtx_assert(&sched_lock, MA_OWNED);
@@ -1073,27 +1073,24 @@ forward_wakeup(int cpunum)
/*
* Check the idle mask we received against what we calculated
* before in the old version.
- *
- * Also note that sched_lock is held now, thus no migration is
- * expected.
*/
- me = PCPU_GET(cpumask);
+ me = PCPU_GET(cpuid);
/* Don't bother if we should be doing it ourself. */
- if (CPU_OVERLAP(&me, &idle_cpus_mask) &&
- (cpunum == NOCPU || CPU_ISSET(cpunum, &me)))
+ if (CPU_ISSET(me, &idle_cpus_mask) &&
+ (cpunum == NOCPU || me == cpunum))
return (0);
- dontuse = me;
+ CPU_SETOF(me, &dontuse);
CPU_OR(&dontuse, &stopped_cpus);
CPU_OR(&dontuse, &hlt_cpus_mask);
CPU_ZERO(&map2);
if (forward_wakeup_use_loop) {
STAILQ_FOREACH(pc, &cpuhead, pc_allcpu) {
- id = pc->pc_cpumask;
- if (!CPU_OVERLAP(&id, &dontuse) &&
+ id = pc->pc_cpuid;
+ if (!CPU_ISSET(id, &dontuse) &&
pc->pc_curthread == pc->pc_idlethread) {
- CPU_OR(&map2, &id);
+ CPU_SET(id, &map2);
}
}
}
@@ -1125,11 +1122,11 @@ forward_wakeup(int cpunum)
if (!CPU_EMPTY(&map)) {
forward_wakeups_delivered++;
STAILQ_FOREACH(pc, &cpuhead, pc_allcpu) {
- id = pc->pc_cpumask;
- if (!CPU_OVERLAP(&map, &id))
+ id = pc->pc_cpuid;
+ if (!CPU_ISSET(id, &map))
continue;
if (cpu_idle_wakeup(pc->pc_cpuid))
- CPU_NAND(&map, &id);
+ CPU_CLR(id, &map);
}
if (!CPU_EMPTY(&map))
ipi_selected(map, IPI_AST);
@@ -1147,7 +1144,7 @@ kick_other_cpu(int pri, int cpuid)
int cpri;
pcpu = pcpu_find(cpuid);
- if (CPU_OVERLAP(&idle_cpus_mask, &pcpu->pc_cpumask)) {
+ if (CPU_ISSET(cpuid, &idle_cpus_mask)) {
forward_wakeups_delivered++;
if (!cpu_idle_wakeup(cpuid))
ipi_cpu(cpuid, IPI_AST);
@@ -1205,10 +1202,10 @@ void
sched_add(struct thread *td, int flags)
#ifdef SMP
{
- cpuset_t idle, me, tidlemsk;
+ cpuset_t tidlemsk;
struct td_sched *ts;
+ u_int cpu, cpuid;
int forwarded = 0;
- int cpu;
int single_cpu = 0;
ts = td->td_sched;
@@ -1271,23 +1268,17 @@ sched_add(struct thread *td, int flags)
ts->ts_runq = &runq;
}
- if (single_cpu && (cpu != PCPU_GET(cpuid))) {
+ cpuid = PCPU_GET(cpuid);
+ if (single_cpu && cpu != cpuid) {
kick_other_cpu(td->td_priority, cpu);
} else {
if (!single_cpu) {
+ tidlemsk = idle_cpus_mask;
+ CPU_NAND(&tidlemsk, &hlt_cpus_mask);
+ CPU_CLR(cpuid, &tidlemsk);
- /*
- * Thread spinlock is held here, assume no
- * migration is possible.
- */
- me = PCPU_GET(cpumask);
- idle = idle_cpus_mask;
- tidlemsk = idle;
- CPU_AND(&idle, &me);
- CPU_OR(&me, &hlt_cpus_mask);
- CPU_NAND(&tidlemsk, &me);
-
- if (CPU_EMPTY(&idle) && ((flags & SRQ_INTR) == 0) &&
+ if (!CPU_ISSET(cpuid, &idle_cpus_mask) &&
+ ((flags & SRQ_INTR) == 0) &&
!CPU_EMPTY(&tidlemsk))
forwarded = forward_wakeup(cpu);
}
diff --git a/sys/kern/subr_kdb.c b/sys/kern/subr_kdb.c
index 2bc5ab2..f5cb31e 100644
--- a/sys/kern/subr_kdb.c
+++ b/sys/kern/subr_kdb.c
@@ -197,9 +197,12 @@ kdb_sysctl_trap_code(SYSCTL_HANDLER_ARGS)
void
kdb_panic(const char *msg)
{
-
#ifdef SMP
- stop_cpus_hard(PCPU_GET(other_cpus));
+ cpuset_t other_cpus;
+
+ other_cpus = all_cpus;
+ CPU_CLR(PCPU_GET(cpuid), &other_cpus);
+ stop_cpus_hard(other_cpus);
#endif
printf("KDB: panic\n");
panic("%s", msg);
@@ -415,7 +418,7 @@ kdb_thr_ctx(struct thread *thr)
#if defined(SMP) && defined(KDB_STOPPEDPCB)
STAILQ_FOREACH(pc, &cpuhead, pc_allcpu) {
if (pc->pc_curthread == thr &&
- CPU_OVERLAP(&stopped_cpus, &pc->pc_cpumask))
+ CPU_ISSET(pc->pc_cpuid, &stopped_cpus))
return (KDB_STOPPEDPCB(pc));
}
#endif
@@ -499,6 +502,9 @@ kdb_thr_select(struct thread *thr)
int
kdb_trap(int type, int code, struct trapframe *tf)
{
+#ifdef SMP
+ cpuset_t other_cpus;
+#endif
struct kdb_dbbe *be;
register_t intr;
int handled;
@@ -514,7 +520,9 @@ kdb_trap(int type, int code, struct trapframe *tf)
intr = intr_disable();
#ifdef SMP
- stop_cpus_hard(PCPU_GET(other_cpus));
+ other_cpus = all_cpus;
+ CPU_CLR(PCPU_GET(cpuid), &other_cpus);
+ stop_cpus_hard(other_cpus);
#endif
kdb_active++;
diff --git a/sys/kern/subr_pcpu.c b/sys/kern/subr_pcpu.c
index a6b3ae0..ec6b590 100644
--- a/sys/kern/subr_pcpu.c
+++ b/sys/kern/subr_pcpu.c
@@ -87,7 +87,6 @@ pcpu_init(struct pcpu *pcpu, int cpuid, size_t size)
KASSERT(cpuid >= 0 && cpuid < MAXCPU,
("pcpu_init: invalid cpuid %d", cpuid));
pcpu->pc_cpuid = cpuid;
- CPU_SETOF(cpuid, &pcpu->pc_cpumask);
cpuid_to_pcpu[cpuid] = pcpu;
STAILQ_INSERT_TAIL(&cpuhead, pcpu, pc_allcpu);
cpu_pcpu_init(pcpu, cpuid, size);
diff --git a/sys/kern/subr_smp.c b/sys/kern/subr_smp.c
index 0929ab9..d0c5def 100644
--- a/sys/kern/subr_smp.c
+++ b/sys/kern/subr_smp.c
@@ -70,25 +70,25 @@ int mp_maxcpus = MAXCPU;
volatile int smp_started;
u_int mp_maxid;
-SYSCTL_NODE(_kern, OID_AUTO, smp, CTLFLAG_RD, NULL, "Kernel SMP");
+SYSCTL_NODE(_kern, OID_AUTO, smp, CTLFLAG_RD|CTLFLAG_CAPRD, NULL, "Kernel SMP");
-SYSCTL_UINT(_kern_smp, OID_AUTO, maxid, CTLFLAG_RD, &mp_maxid, 0,
+SYSCTL_INT(_kern_smp, OID_AUTO, maxid, CTLFLAG_RD|CTLFLAG_CAPRD, &mp_maxid, 0,
"Max CPU ID.");
-SYSCTL_INT(_kern_smp, OID_AUTO, maxcpus, CTLFLAG_RD, &mp_maxcpus, 0,
- "Max number of CPUs that the system was compiled for.");
+SYSCTL_INT(_kern_smp, OID_AUTO, maxcpus, CTLFLAG_RD|CTLFLAG_CAPRD, &mp_maxcpus,
+ 0, "Max number of CPUs that the system was compiled for.");
int smp_active = 0; /* are the APs allowed to run? */
SYSCTL_INT(_kern_smp, OID_AUTO, active, CTLFLAG_RW, &smp_active, 0,
"Number of Auxillary Processors (APs) that were successfully started");
int smp_disabled = 0; /* has smp been disabled? */
-SYSCTL_INT(_kern_smp, OID_AUTO, disabled, CTLFLAG_RDTUN, &smp_disabled, 0,
- "SMP has been disabled from the loader");
+SYSCTL_INT(_kern_smp, OID_AUTO, disabled, CTLFLAG_RDTUN|CTLFLAG_CAPRD,
+ &smp_disabled, 0, "SMP has been disabled from the loader");
TUNABLE_INT("kern.smp.disabled", &smp_disabled);
int smp_cpus = 1; /* how many cpu's running */
-SYSCTL_INT(_kern_smp, OID_AUTO, cpus, CTLFLAG_RD, &smp_cpus, 0,
+SYSCTL_INT(_kern_smp, OID_AUTO, cpus, CTLFLAG_RD|CTLFLAG_CAPRD, &smp_cpus, 0,
"Number of CPUs online");
int smp_topology = 0; /* Which topology we're using. */
@@ -142,7 +142,7 @@ mp_start(void *dummy)
/* Probe for MP hardware. */
if (smp_disabled != 0 || cpu_mp_probe() == 0) {
mp_ncpus = 1;
- all_cpus = PCPU_GET(cpumask);
+ CPU_SETOF(PCPU_GET(cpuid), &all_cpus);
return;
}
@@ -706,7 +706,7 @@ mp_setvariables_for_up(void *dummy)
{
mp_ncpus = 1;
mp_maxid = PCPU_GET(cpuid);
- all_cpus = PCPU_GET(cpumask);
+ CPU_SETOF(mp_maxid, &all_cpus);
KASSERT(PCPU_GET(cpuid) == 0, ("UP must have a CPU ID of zero"));
}
SYSINIT(cpu_mp_setvariables, SI_SUB_TUNABLES, SI_ORDER_FIRST,
diff --git a/sys/kern/subr_uio.c b/sys/kern/subr_uio.c
index 9385dc4..6e81328 100644
--- a/sys/kern/subr_uio.c
+++ b/sys/kern/subr_uio.c
@@ -64,6 +64,8 @@ __FBSDID("$FreeBSD$");
SYSCTL_INT(_kern, KERN_IOV_MAX, iov_max, CTLFLAG_RD, NULL, UIO_MAXIOV,
"Maximum number of elements in an I/O vector; sysconf(_SC_IOV_MAX)");
+static int uiomove_faultflag(void *cp, int n, struct uio *uio, int nofault);
+
#ifdef ZERO_COPY_SOCKETS
/* Declared in uipc_socket.c */
extern int so_zero_copy_receive;
@@ -129,23 +131,65 @@ retry:
#endif /* ZERO_COPY_SOCKETS */
int
+copyin_nofault(const void *udaddr, void *kaddr, size_t len)
+{
+ int error, save;
+
+ save = vm_fault_disable_pagefaults();
+ error = copyin(udaddr, kaddr, len);
+ vm_fault_enable_pagefaults(save);
+ return (error);
+}
+
+int
+copyout_nofault(const void *kaddr, void *udaddr, size_t len)
+{
+ int error, save;
+
+ save = vm_fault_disable_pagefaults();
+ error = copyout(kaddr, udaddr, len);
+ vm_fault_enable_pagefaults(save);
+ return (error);
+}
+
+int
uiomove(void *cp, int n, struct uio *uio)
{
- struct thread *td = curthread;
+
+ return (uiomove_faultflag(cp, n, uio, 0));
+}
+
+int
+uiomove_nofault(void *cp, int n, struct uio *uio)
+{
+
+ return (uiomove_faultflag(cp, n, uio, 1));
+}
+
+static int
+uiomove_faultflag(void *cp, int n, struct uio *uio, int nofault)
+{
+ struct thread *td;
struct iovec *iov;
u_int cnt;
- int error = 0;
- int save = 0;
+ int error, newflags, save;
+
+ td = curthread;
+ error = 0;
KASSERT(uio->uio_rw == UIO_READ || uio->uio_rw == UIO_WRITE,
("uiomove: mode"));
- KASSERT(uio->uio_segflg != UIO_USERSPACE || uio->uio_td == curthread,
+ KASSERT(uio->uio_segflg != UIO_USERSPACE || uio->uio_td == td,
("uiomove proc"));
- WITNESS_WARN(WARN_GIANTOK | WARN_SLEEPOK, NULL,
- "Calling uiomove()");
+ if (!nofault)
+ WITNESS_WARN(WARN_GIANTOK | WARN_SLEEPOK, NULL,
+ "Calling uiomove()");
- save = td->td_pflags & TDP_DEADLKTREAT;
- td->td_pflags |= TDP_DEADLKTREAT;
+ /* XXX does it make a sense to set TDP_DEADLKTREAT for UIO_SYSSPACE ? */
+ newflags = TDP_DEADLKTREAT;
+ if (uio->uio_segflg == UIO_USERSPACE && nofault)
+ newflags |= TDP_NOFAULTING;
+ save = curthread_pflags_set(newflags);
while (n > 0 && uio->uio_resid) {
iov = uio->uio_iov;
@@ -187,8 +231,7 @@ uiomove(void *cp, int n, struct uio *uio)
n -= cnt;
}
out:
- if (save == 0)
- td->td_pflags &= ~TDP_DEADLKTREAT;
+ curthread_pflags_restore(save);
return (error);
}
diff --git a/sys/kern/sys_capability.c b/sys/kern/sys_capability.c
index a19e881..04f98d8 100644
--- a/sys/kern/sys_capability.c
+++ b/sys/kern/sys_capability.c
@@ -116,3 +116,402 @@ cap_getmode(struct thread *td, struct cap_getmode_args *uap)
}
#endif /* CAPABILITY_MODE */
+
+#ifdef CAPABILITIES
+
+/*
+ * struct capability describes a capability, and is hung off of its struct
+ * file f_data field. cap_file and cap_rightss are static once hooked up, as
+ * neither the object it references nor the rights it encapsulates are
+ * permitted to change.
+ */
+struct capability {
+ struct file *cap_object; /* Underlying object's file. */
+ struct file *cap_file; /* Back-pointer to cap's file. */
+ cap_rights_t cap_rights; /* Mask of rights on object. */
+};
+
+/*
+ * Capabilities have a fileops vector, but in practice none should ever be
+ * called except for fo_close, as the capability will normally not be
+ * returned during a file descriptor lookup in the system call code.
+ */
+static fo_rdwr_t capability_read;
+static fo_rdwr_t capability_write;
+static fo_truncate_t capability_truncate;
+static fo_ioctl_t capability_ioctl;
+static fo_poll_t capability_poll;
+static fo_kqfilter_t capability_kqfilter;
+static fo_stat_t capability_stat;
+static fo_close_t capability_close;
+
+static struct fileops capability_ops = {
+ .fo_read = capability_read,
+ .fo_write = capability_write,
+ .fo_truncate = capability_truncate,
+ .fo_ioctl = capability_ioctl,
+ .fo_poll = capability_poll,
+ .fo_kqfilter = capability_kqfilter,
+ .fo_stat = capability_stat,
+ .fo_close = capability_close,
+ .fo_flags = DFLAG_PASSABLE,
+};
+
+static struct fileops capability_ops_unpassable = {
+ .fo_read = capability_read,
+ .fo_write = capability_write,
+ .fo_truncate = capability_truncate,
+ .fo_ioctl = capability_ioctl,
+ .fo_poll = capability_poll,
+ .fo_kqfilter = capability_kqfilter,
+ .fo_stat = capability_stat,
+ .fo_close = capability_close,
+ .fo_flags = 0,
+};
+
+static uma_zone_t capability_zone;
+
+static void
+capability_init(void *dummy __unused)
+{
+
+ capability_zone = uma_zcreate("capability", sizeof(struct capability),
+ NULL, NULL, NULL, NULL, UMA_ALIGN_PTR, 0);
+ if (capability_zone == NULL)
+ panic("capability_init: capability_zone not initialized");
+}
+SYSINIT(vfs, SI_SUB_VFS, SI_ORDER_ANY, capability_init, NULL);
+
+/*
+ * Test whether a capability grants the requested rights.
+ */
+static int
+cap_check(struct capability *c, cap_rights_t rights)
+{
+
+ if ((c->cap_rights | rights) != c->cap_rights)
+ return (ENOTCAPABLE);
+ return (0);
+}
+
+/*
+ * Extract rights from a capability for monitoring purposes -- not for use in
+ * any other way, as we want to keep all capability permission evaluation in
+ * this one file.
+ */
+cap_rights_t
+cap_rights(struct file *fp_cap)
+{
+ struct capability *c;
+
+ KASSERT(fp_cap->f_type == DTYPE_CAPABILITY,
+ ("cap_rights: !capability"));
+
+ c = fp_cap->f_data;
+ return (c->cap_rights);
+}
+
+/*
+ * System call to create a new capability reference to either an existing
+ * file object or an an existing capability.
+ */
+int
+cap_new(struct thread *td, struct cap_new_args *uap)
+{
+ int error, capfd;
+ int fd = uap->fd;
+ struct file *fp, *fcapp;
+ cap_rights_t rights = uap->rights;
+
+ AUDIT_ARG_FD(fd);
+#ifdef notyet /* capability auditing will follow in a few commits */
+ AUDIT_ARG_RIGHTS(rights);
+#endif
+ error = fget(td, fd, &fp);
+ if (error)
+ return (error);
+ AUDIT_ARG_FILE(td->td_proc, fp);
+ error = kern_capwrap(td, fp, rights, &fcapp, &capfd);
+ if (error)
+ return (error);
+
+ /*
+ * Release our reference to the file (kern_capwrap has held a reference
+ * for the filedesc array).
+ */
+ fdrop(fp, td);
+ td->td_retval[0] = capfd;
+ return (0);
+}
+
+/*
+ * System call to query the rights mask associated with a capability.
+ */
+int
+cap_getrights(struct thread *td, struct cap_getrights_args *uap)
+{
+ struct capability *cp;
+ struct file *fp;
+ int error;
+
+ AUDIT_ARG_FD(uap->fd);
+ error = fgetcap(td, uap->fd, &fp);
+ if (error)
+ return (error);
+ cp = fp->f_data;
+ error = copyout(&cp->cap_rights, uap->rightsp, sizeof(*uap->rightsp));
+ fdrop(fp, td);
+ return (error);
+}
+
+/*
+ * Create a capability to wrap around an existing file.
+ */
+int
+kern_capwrap(struct thread *td, struct file *fp, cap_rights_t rights,
+ struct file **fcappp, int *capfdp)
+{
+ struct capability *cp, *cp_old;
+ struct file *fp_object;
+ int error;
+
+ if ((rights | CAP_MASK_VALID) != CAP_MASK_VALID)
+ return (EINVAL);
+
+ /*
+ * If a new capability is being derived from an existing capability,
+ * then the new capability rights must be a subset of the existing
+ * rights.
+ */
+ if (fp->f_type == DTYPE_CAPABILITY) {
+ cp_old = fp->f_data;
+ if ((cp_old->cap_rights | rights) != cp_old->cap_rights)
+ return (ENOTCAPABLE);
+ }
+
+ /*
+ * Allocate a new file descriptor to hang the capability off of.
+ */
+ error = falloc(td, fcappp, capfdp, fp->f_flag);
+ if (error)
+ return (error);
+
+ /*
+ * Rather than nesting capabilities, directly reference the object an
+ * existing capability references. There's nothing else interesting
+ * to preserve for future use, as we've incorporated the previous
+ * rights mask into the new one. This prevents us from having to
+ * deal with capability chains.
+ */
+ if (fp->f_type == DTYPE_CAPABILITY)
+ fp_object = ((struct capability *)fp->f_data)->cap_object;
+ else
+ fp_object = fp;
+ fhold(fp_object);
+ cp = uma_zalloc(capability_zone, M_WAITOK | M_ZERO);
+ cp->cap_rights = rights;
+ cp->cap_object = fp_object;
+ cp->cap_file = *fcappp;
+ if (fp->f_flag & DFLAG_PASSABLE)
+ finit(*fcappp, fp->f_flag, DTYPE_CAPABILITY, cp,
+ &capability_ops);
+ else
+ finit(*fcappp, fp->f_flag, DTYPE_CAPABILITY, cp,
+ &capability_ops_unpassable);
+
+ /*
+ * Release our private reference (the proc filedesc still has one).
+ */
+ fdrop(*fcappp, td);
+ return (0);
+}
+
+/*
+ * Given a file descriptor, test it against a capability rights mask and then
+ * return the file descriptor on which to actually perform the requested
+ * operation. As long as the reference to fp_cap remains valid, the returned
+ * pointer in *fp will remain valid, so no extra reference management is
+ * required, and the caller should fdrop() fp_cap as normal when done with
+ * both.
+ */
+int
+cap_funwrap(struct file *fp_cap, cap_rights_t rights, struct file **fpp)
+{
+ struct capability *c;
+ int error;
+
+ if (fp_cap->f_type != DTYPE_CAPABILITY) {
+ *fpp = fp_cap;
+ return (0);
+ }
+ c = fp_cap->f_data;
+ error = cap_check(c, rights);
+ if (error)
+ return (error);
+ *fpp = c->cap_object;
+ return (0);
+}
+
+/*
+ * Slightly different routine for memory mapping file descriptors: unwrap the
+ * capability and check CAP_MMAP, but also return a bitmask representing the
+ * maximum mapping rights the capability allows on the object.
+ */
+int
+cap_funwrap_mmap(struct file *fp_cap, cap_rights_t rights, u_char *maxprotp,
+ struct file **fpp)
+{
+ struct capability *c;
+ u_char maxprot;
+ int error;
+
+ if (fp_cap->f_type != DTYPE_CAPABILITY) {
+ *fpp = fp_cap;
+ *maxprotp = VM_PROT_ALL;
+ return (0);
+ }
+ c = fp_cap->f_data;
+ error = cap_check(c, rights | CAP_MMAP);
+ if (error)
+ return (error);
+ *fpp = c->cap_object;
+ maxprot = 0;
+ if (c->cap_rights & CAP_READ)
+ maxprot |= VM_PROT_READ;
+ if (c->cap_rights & CAP_WRITE)
+ maxprot |= VM_PROT_WRITE;
+ if (c->cap_rights & CAP_MAPEXEC)
+ maxprot |= VM_PROT_EXECUTE;
+ *maxprotp = maxprot;
+ return (0);
+}
+
+/*
+ * When a capability is closed, simply drop the reference on the underlying
+ * object and free the capability. fdrop() will handle the case where the
+ * underlying object also needs to close, and the caller will have already
+ * performed any object-specific lock or mqueue handling.
+ */
+static int
+capability_close(struct file *fp, struct thread *td)
+{
+ struct capability *c;
+ struct file *fp_object;
+
+ KASSERT(fp->f_type == DTYPE_CAPABILITY,
+ ("capability_close: !capability"));
+
+ c = fp->f_data;
+ fp->f_ops = &badfileops;
+ fp->f_data = NULL;
+ fp_object = c->cap_object;
+ uma_zfree(capability_zone, c);
+ return (fdrop(fp_object, td));
+}
+
+/*
+ * In general, file descriptor operations should never make it to the
+ * capability, only the underlying file descriptor operation vector, so panic
+ * if we do turn up here.
+ */
+static int
+capability_read(struct file *fp, struct uio *uio, struct ucred *active_cred,
+ int flags, struct thread *td)
+{
+
+ panic("capability_read");
+}
+
+static int
+capability_write(struct file *fp, struct uio *uio, struct ucred *active_cred,
+ int flags, struct thread *td)
+{
+
+ panic("capability_write");
+}
+
+static int
+capability_truncate(struct file *fp, off_t length, struct ucred *active_cred,
+ struct thread *td)
+{
+
+ panic("capability_truncate");
+}
+
+static int
+capability_ioctl(struct file *fp, u_long com, void *data,
+ struct ucred *active_cred, struct thread *td)
+{
+
+ panic("capability_ioctl");
+}
+
+static int
+capability_poll(struct file *fp, int events, struct ucred *active_cred,
+ struct thread *td)
+{
+
+ panic("capability_poll");
+}
+
+static int
+capability_kqfilter(struct file *fp, struct knote *kn)
+{
+
+ panic("capability_kqfilter");
+}
+
+static int
+capability_stat(struct file *fp, struct stat *sb, struct ucred *active_cred,
+ struct thread *td)
+{
+
+ panic("capability_stat");
+}
+
+#else /* !CAPABILITIES */
+
+/*
+ * Stub Capability functions for when options CAPABILITIES isn't compiled
+ * into the kernel.
+ */
+int
+cap_new(struct thread *td, struct cap_new_args *uap)
+{
+
+ return (ENOSYS);
+}
+
+int
+cap_getrights(struct thread *td, struct cap_getrights_args *uap)
+{
+
+ return (ENOSYS);
+}
+
+int
+cap_funwrap(struct file *fp_cap, cap_rights_t rights, struct file **fpp)
+{
+
+ KASSERT(fp_cap->f_type != DTYPE_CAPABILITY,
+ ("cap_funwrap: saw capability"));
+
+ *fpp = fp_cap;
+ return (0);
+}
+
+int
+cap_funwrap_mmap(struct file *fp_cap, cap_rights_t rights, u_char *maxprotp,
+ struct file **fpp)
+{
+
+ KASSERT(fp_cap->f_type != DTYPE_CAPABILITY,
+ ("cap_funwrap_mmap: saw capability"));
+
+ *fpp = fp_cap;
+ *maxprotp = VM_PROT_ALL;
+ return (0);
+}
+
+#endif /* CAPABILITIES */
+
diff --git a/sys/kern/syscalls.c b/sys/kern/syscalls.c
index 29a6485..abd9484 100644
--- a/sys/kern/syscalls.c
+++ b/sys/kern/syscalls.c
@@ -521,8 +521,8 @@ const char *syscallnames[] = {
"msgctl", /* 511 = msgctl */
"shmctl", /* 512 = shmctl */
"lpathconf", /* 513 = lpathconf */
- "#514", /* 514 = cap_new */
- "#515", /* 515 = cap_getrights */
+ "cap_new", /* 514 = cap_new */
+ "cap_getrights", /* 515 = cap_getrights */
"cap_enter", /* 516 = cap_enter */
"cap_getmode", /* 517 = cap_getmode */
"#518", /* 518 = pdfork */
diff --git a/sys/kern/syscalls.master b/sys/kern/syscalls.master
index af958c9..0b249a5 100644
--- a/sys/kern/syscalls.master
+++ b/sys/kern/syscalls.master
@@ -914,8 +914,9 @@
512 AUE_SHMCTL NOSTD { int shmctl(int shmid, int cmd, \
struct shmid_ds *buf); }
513 AUE_LPATHCONF STD { int lpathconf(char *path, int name); }
-514 AUE_CAP_NEW UNIMPL cap_new
-515 AUE_CAP_GETRIGHTS UNIMPL cap_getrights
+514 AUE_CAP_NEW STD { int cap_new(int fd, u_int64_t rights); }
+515 AUE_CAP_GETRIGHTS STD { int cap_getrights(int fd, \
+ u_int64_t *rightsp); }
516 AUE_CAP_ENTER STD { int cap_enter(void); }
517 AUE_CAP_GETMODE STD { int cap_getmode(u_int *modep); }
518 AUE_PDFORK UNIMPL pdfork
diff --git a/sys/kern/systrace_args.c b/sys/kern/systrace_args.c
index 880b46b..f57777f 100644
--- a/sys/kern/systrace_args.c
+++ b/sys/kern/systrace_args.c
@@ -3096,6 +3096,22 @@ systrace_args(int sysnum, void *params, uint64_t *uarg, int *n_args)
*n_args = 2;
break;
}
+ /* cap_new */
+ case 514: {
+ struct cap_new_args *p = params;
+ iarg[0] = p->fd; /* int */
+ uarg[1] = p->rights; /* u_int64_t */
+ *n_args = 2;
+ break;
+ }
+ /* cap_getrights */
+ case 515: {
+ struct cap_getrights_args *p = params;
+ iarg[0] = p->fd; /* int */
+ uarg[1] = (intptr_t) p->rightsp; /* u_int64_t * */
+ *n_args = 2;
+ break;
+ }
/* cap_enter */
case 516: {
*n_args = 0;
@@ -8326,6 +8342,32 @@ systrace_setargdesc(int sysnum, int ndx, char *desc, size_t descsz)
break;
};
break;
+ /* cap_new */
+ case 514:
+ switch(ndx) {
+ case 0:
+ p = "int";
+ break;
+ case 1:
+ p = "u_int64_t";
+ break;
+ default:
+ break;
+ };
+ break;
+ /* cap_getrights */
+ case 515:
+ switch(ndx) {
+ case 0:
+ p = "int";
+ break;
+ case 1:
+ p = "u_int64_t *";
+ break;
+ default:
+ break;
+ };
+ break;
/* cap_enter */
case 516:
break;
diff --git a/sys/kern/sysv_msg.c b/sys/kern/sysv_msg.c
index 87d479e..ffd8580 100644
--- a/sys/kern/sysv_msg.c
+++ b/sys/kern/sysv_msg.c
@@ -620,6 +620,7 @@ msgget(td, uap)
error = ENOSPC;
goto done2;
}
+#ifdef RACCT
PROC_LOCK(td->td_proc);
error = racct_add(td->td_proc, RACCT_NMSGQ, 1);
PROC_UNLOCK(td->td_proc);
@@ -627,6 +628,7 @@ msgget(td, uap)
error = ENOSPC;
goto done2;
}
+#endif
DPRINTF(("msqid %d is available\n", msqid));
msqkptr->u.msg_perm.key = key;
msqkptr->u.msg_perm.cuid = cred->cr_uid;
@@ -685,7 +687,9 @@ kern_msgsnd(td, msqid, msgp, msgsz, msgflg, mtype)
register struct msqid_kernel *msqkptr;
register struct msg *msghdr;
short next;
+#ifdef RACCT
size_t saved_msgsz;
+#endif
if (!prison_allow(td->td_ucred, PR_ALLOW_SYSVIPC))
return (ENOSYS);
@@ -723,6 +727,7 @@ kern_msgsnd(td, msqid, msgp, msgsz, msgflg, mtype)
goto done2;
#endif
+#ifdef RACCT
PROC_LOCK(td->td_proc);
if (racct_add(td->td_proc, RACCT_MSGQQUEUED, 1)) {
PROC_UNLOCK(td->td_proc);
@@ -737,6 +742,7 @@ kern_msgsnd(td, msqid, msgp, msgsz, msgflg, mtype)
goto done2;
}
PROC_UNLOCK(td->td_proc);
+#endif
segs_needed = (msgsz + msginfo.msgssz - 1) / msginfo.msgssz;
DPRINTF(("msgsz=%zu, msgssz=%d, segs_needed=%d\n", msgsz,
@@ -991,12 +997,14 @@ kern_msgsnd(td, msqid, msgp, msgsz, msgflg, mtype)
wakeup(msqkptr);
td->td_retval[0] = 0;
done3:
+#ifdef RACCT
if (error != 0) {
PROC_LOCK(td->td_proc);
racct_sub(td->td_proc, RACCT_MSGQQUEUED, 1);
racct_sub(td->td_proc, RACCT_MSGQSIZE, saved_msgsz);
PROC_UNLOCK(td->td_proc);
}
+#endif
done2:
mtx_unlock(&msq_mtx);
return (error);
diff --git a/sys/kern/sysv_sem.c b/sys/kern/sysv_sem.c
index ac53a8d..4a4c479 100644
--- a/sys/kern/sysv_sem.c
+++ b/sys/kern/sysv_sem.c
@@ -149,9 +149,6 @@ struct sem_undo {
#endif
/* shouldn't need tuning */
-#ifndef SEMMAP
-#define SEMMAP 30 /* # of entries in semaphore map */
-#endif
#ifndef SEMMSL
#define SEMMSL SEMMNS /* max # of semaphores per id */
#endif
@@ -182,7 +179,6 @@ struct sem_undo {
* semaphore info struct
*/
struct seminfo seminfo = {
- SEMMAP, /* # of entries in semaphore map */
SEMMNI, /* # of semaphore identifiers */
SEMMNS, /* # of semaphores in system */
SEMMNU, /* # of undo structures in system */
@@ -194,8 +190,6 @@ struct seminfo seminfo = {
SEMAEM /* adjust on exit max value */
};
-SYSCTL_INT(_kern_ipc, OID_AUTO, semmap, CTLFLAG_RW, &seminfo.semmap, 0,
- "Number of entries in the semaphore map");
SYSCTL_INT(_kern_ipc, OID_AUTO, semmni, CTLFLAG_RDTUN, &seminfo.semmni, 0,
"Number of semaphore identifiers");
SYSCTL_INT(_kern_ipc, OID_AUTO, semmns, CTLFLAG_RDTUN, &seminfo.semmns, 0,
@@ -255,7 +249,6 @@ seminit(void)
{
int i, error;
- TUNABLE_INT_FETCH("kern.ipc.semmap", &seminfo.semmap);
TUNABLE_INT_FETCH("kern.ipc.semmni", &seminfo.semmni);
TUNABLE_INT_FETCH("kern.ipc.semmns", &seminfo.semmns);
TUNABLE_INT_FETCH("kern.ipc.semmnu", &seminfo.semmnu);
@@ -931,6 +924,7 @@ semget(struct thread *td, struct semget_args *uap)
error = ENOSPC;
goto done2;
}
+#ifdef RACCT
PROC_LOCK(td->td_proc);
error = racct_add(td->td_proc, RACCT_NSEM, nsems);
PROC_UNLOCK(td->td_proc);
@@ -938,6 +932,7 @@ semget(struct thread *td, struct semget_args *uap)
error = ENOSPC;
goto done2;
}
+#endif
DPRINTF(("semid %d is available\n", semid));
mtx_lock(&sema_mtx[semid]);
KASSERT((sema[semid].u.sem_perm.mode & SEM_ALLOC) == 0,
@@ -1023,12 +1018,14 @@ semop(struct thread *td, struct semop_args *uap)
nsops));
return (E2BIG);
} else {
+#ifdef RACCT
PROC_LOCK(td->td_proc);
if (nsops > racct_get_available(td->td_proc, RACCT_NSEMOP)) {
PROC_UNLOCK(td->td_proc);
return (E2BIG);
}
PROC_UNLOCK(td->td_proc);
+#endif
sops = malloc(nsops * sizeof(*sops), M_TEMP, M_WAITOK);
}
diff --git a/sys/kern/sysv_shm.c b/sys/kern/sysv_shm.c
index f5a84ae..1741a21 100644
--- a/sys/kern/sysv_shm.c
+++ b/sys/kern/sysv_shm.c
@@ -672,6 +672,7 @@ shmget_allocate_segment(td, uap, mode)
shm_last_free = -1;
}
shmseg = &shmsegs[segnum];
+#ifdef RACCT
PROC_LOCK(td->td_proc);
if (racct_add(td->td_proc, RACCT_NSHM, 1)) {
PROC_UNLOCK(td->td_proc);
@@ -683,6 +684,7 @@ shmget_allocate_segment(td, uap, mode)
return (ENOMEM);
}
PROC_UNLOCK(td->td_proc);
+#endif
/*
* In case we sleep in malloc(), mark the segment present but deleted
* so that noone else tries to create the same key.
@@ -699,10 +701,12 @@ shmget_allocate_segment(td, uap, mode)
shm_object = vm_pager_allocate(shm_use_phys ? OBJT_PHYS : OBJT_SWAP,
0, size, VM_PROT_DEFAULT, 0, cred);
if (shm_object == NULL) {
+#ifdef RACCT
PROC_LOCK(td->td_proc);
racct_sub(td->td_proc, RACCT_NSHM, 1);
racct_sub(td->td_proc, RACCT_SHMSIZE, size);
PROC_UNLOCK(td->td_proc);
+#endif
return (ENOMEM);
}
VM_OBJECT_LOCK(shm_object);
diff --git a/sys/kern/tty.c b/sys/kern/tty.c
index f6475cb..187e635 100644
--- a/sys/kern/tty.c
+++ b/sys/kern/tty.c
@@ -91,7 +91,7 @@ static const char *dev_console_filename;
HUPCL|CLOCAL|CCTS_OFLOW|CRTS_IFLOW|CDTR_IFLOW|\
CDSR_OFLOW|CCAR_OFLOW)
-#define TTY_CALLOUT(tp,d) ((d) != (tp)->t_dev && (d) != dev_console)
+#define TTY_CALLOUT(tp,d) (dev2unit(d) & TTYUNIT_CALLOUT)
/*
* Set TTY buffer sizes.
@@ -772,6 +772,10 @@ ttyil_ioctl(struct cdev *dev, u_long cmd, caddr_t data, int fflag,
goto done;
}
+ error = ttydevsw_cioctl(tp, dev2unit(dev), cmd, data, td);
+ if (error != ENOIOCTL)
+ goto done;
+
switch (cmd) {
case TIOCGETA:
/* Obtain terminal flags through tcgetattr(). */
@@ -878,6 +882,13 @@ ttydevsw_defioctl(struct tty *tp, u_long cmd, caddr_t data, struct thread *td)
}
static int
+ttydevsw_defcioctl(struct tty *tp, int unit, u_long cmd, caddr_t data, struct thread *td)
+{
+
+ return (ENOIOCTL);
+}
+
+static int
ttydevsw_defparam(struct tty *tp, struct termios *t)
{
@@ -955,6 +966,7 @@ tty_alloc_mutex(struct ttydevsw *tsw, void *sc, struct mtx *mutex)
PATCH_FUNC(outwakeup);
PATCH_FUNC(inwakeup);
PATCH_FUNC(ioctl);
+ PATCH_FUNC(cioctl);
PATCH_FUNC(param);
PATCH_FUNC(modem);
PATCH_FUNC(mmap);
@@ -1190,13 +1202,13 @@ tty_makedev(struct tty *tp, struct ucred *cred, const char *fmt, ...)
/* Slave call-in devices. */
if (tp->t_flags & TF_INITLOCK) {
- dev = make_dev_cred(&ttyil_cdevsw, 0, cred,
+ dev = make_dev_cred(&ttyil_cdevsw, TTYUNIT_INIT, cred,
uid, gid, mode, "%s%s.init", prefix, name);
dev_depends(tp->t_dev, dev);
dev->si_drv1 = tp;
dev->si_drv2 = &tp->t_termios_init_in;
- dev = make_dev_cred(&ttyil_cdevsw, 0, cred,
+ dev = make_dev_cred(&ttyil_cdevsw, TTYUNIT_LOCK, cred,
uid, gid, mode, "%s%s.lock", prefix, name);
dev_depends(tp->t_dev, dev);
dev->si_drv1 = tp;
@@ -1205,20 +1217,22 @@ tty_makedev(struct tty *tp, struct ucred *cred, const char *fmt, ...)
/* Call-out devices. */
if (tp->t_flags & TF_CALLOUT) {
- dev = make_dev_cred(&ttydev_cdevsw, 0, cred,
+ dev = make_dev_cred(&ttydev_cdevsw, TTYUNIT_CALLOUT, cred,
UID_UUCP, GID_DIALER, 0660, "cua%s", name);
dev_depends(tp->t_dev, dev);
dev->si_drv1 = tp;
/* Slave call-out devices. */
if (tp->t_flags & TF_INITLOCK) {
- dev = make_dev_cred(&ttyil_cdevsw, 0, cred,
+ dev = make_dev_cred(&ttyil_cdevsw,
+ TTYUNIT_CALLOUT | TTYUNIT_INIT, cred,
UID_UUCP, GID_DIALER, 0660, "cua%s.init", name);
dev_depends(tp->t_dev, dev);
dev->si_drv1 = tp;
dev->si_drv2 = &tp->t_termios_init_out;
- dev = make_dev_cred(&ttyil_cdevsw, 0, cred,
+ dev = make_dev_cred(&ttyil_cdevsw,
+ TTYUNIT_CALLOUT | TTYUNIT_LOCK, cred,
UID_UUCP, GID_DIALER, 0660, "cua%s.lock", name);
dev_depends(tp->t_dev, dev);
dev->si_drv1 = tp;
diff --git a/sys/kern/uipc_socket.c b/sys/kern/uipc_socket.c
index 3334fc2..990c6ba 100644
--- a/sys/kern/uipc_socket.c
+++ b/sys/kern/uipc_socket.c
@@ -1915,7 +1915,6 @@ release:
/*
* Optimized version of soreceive() for stream (TCP) sockets.
*/
-#ifdef TCP_SORECEIVE_STREAM
int
soreceive_stream(struct socket *so, struct sockaddr **psa, struct uio *uio,
struct mbuf **mp0, struct mbuf **controlp, int *flagsp)
@@ -1955,20 +1954,9 @@ soreceive_stream(struct socket *so, struct sockaddr **psa, struct uio *uio,
}
oresid = uio->uio_resid;
- /* We will never ever get anything unless we are connected. */
+ /* We will never ever get anything unless we are or were connected. */
if (!(so->so_state & (SS_ISCONNECTED|SS_ISDISCONNECTED))) {
- /* When disconnecting there may be still some data left. */
- if (sb->sb_cc > 0)
- goto deliver;
- if (!(so->so_state & SS_ISDISCONNECTED))
- error = ENOTCONN;
- goto out;
- }
-
- /* Socket buffer is empty and we shall not block. */
- if (sb->sb_cc == 0 &&
- ((sb->sb_flags & SS_NBIO) || (flags & (MSG_DONTWAIT|MSG_NBIO)))) {
- error = EAGAIN;
+ error = ENOTCONN;
goto out;
}
@@ -1995,6 +1983,13 @@ restart:
goto out;
}
+ /* Socket buffer is empty and we shall not block. */
+ if (sb->sb_cc == 0 &&
+ ((so->so_state & SS_NBIO) || (flags & (MSG_DONTWAIT|MSG_NBIO)))) {
+ error = EAGAIN;
+ goto out;
+ }
+
/* Socket buffer got some data that we shall deliver now. */
if (sb->sb_cc > 0 && !(flags & MSG_WAITALL) &&
((sb->sb_flags & SS_NBIO) ||
@@ -2109,7 +2104,6 @@ out:
sbunlock(sb);
return (error);
}
-#endif /* TCP_SORECEIVE_STREAM */
/*
* Optimized version of soreceive() for simple datagram cases from userspace.
diff --git a/sys/kern/vfs_bio.c b/sys/kern/vfs_bio.c
index 2743089..a6ad81e 100644
--- a/sys/kern/vfs_bio.c
+++ b/sys/kern/vfs_bio.c
@@ -1625,6 +1625,7 @@ vfs_vmio_release(struct buf *bp)
int i;
vm_page_t m;
+ pmap_qremove(trunc_page((vm_offset_t)bp->b_data), bp->b_npages);
VM_OBJECT_LOCK(bp->b_bufobj->bo_object);
for (i = 0; i < bp->b_npages; i++) {
m = bp->b_pages[i];
@@ -1658,7 +1659,6 @@ vfs_vmio_release(struct buf *bp)
vm_page_unlock(m);
}
VM_OBJECT_UNLOCK(bp->b_bufobj->bo_object);
- pmap_qremove(trunc_page((vm_offset_t) bp->b_data), bp->b_npages);
if (bp->b_bufsize) {
bufspacewakeup();
@@ -3012,6 +3012,10 @@ allocbuf(struct buf *bp, int size)
if (desiredpages < bp->b_npages) {
vm_page_t m;
+ pmap_qremove((vm_offset_t)trunc_page(
+ (vm_offset_t)bp->b_data) +
+ (desiredpages << PAGE_SHIFT),
+ (bp->b_npages - desiredpages));
VM_OBJECT_LOCK(bp->b_bufobj->bo_object);
for (i = desiredpages; i < bp->b_npages; i++) {
/*
@@ -3032,8 +3036,6 @@ allocbuf(struct buf *bp, int size)
vm_page_unlock(m);
}
VM_OBJECT_UNLOCK(bp->b_bufobj->bo_object);
- pmap_qremove((vm_offset_t) trunc_page((vm_offset_t)bp->b_data) +
- (desiredpages << PAGE_SHIFT), (bp->b_npages - desiredpages));
bp->b_npages = desiredpages;
}
} else if (size > bp->b_bcount) {
diff --git a/sys/kern/vfs_mount.c b/sys/kern/vfs_mount.c
index 2e07cf1..5edf0f5 100644
--- a/sys/kern/vfs_mount.c
+++ b/sys/kern/vfs_mount.c
@@ -51,6 +51,7 @@ __FBSDID("$FreeBSD$");
#include <sys/proc.h>
#include <sys/filedesc.h>
#include <sys/reboot.h>
+#include <sys/sbuf.h>
#include <sys/syscallsubr.h>
#include <sys/sysproto.h>
#include <sys/sx.h>
diff --git a/sys/kern/vfs_mountroot.c b/sys/kern/vfs_mountroot.c
index 496ea70..ccbcb33 100644
--- a/sys/kern/vfs_mountroot.c
+++ b/sys/kern/vfs_mountroot.c
@@ -55,6 +55,7 @@ __FBSDID("$FreeBSD$");
#include <sys/proc.h>
#include <sys/filedesc.h>
#include <sys/reboot.h>
+#include <sys/sbuf.h>
#include <sys/stat.h>
#include <sys/syscallsubr.h>
#include <sys/sysproto.h>
diff --git a/sys/kgssapi/gss_impl.c b/sys/kgssapi/gss_impl.c
index 09b0a4b..ef6c041 100644
--- a/sys/kgssapi/gss_impl.c
+++ b/sys/kgssapi/gss_impl.c
@@ -282,7 +282,11 @@ kgssapi_modevent(module_t mod, int type, void *data)
rpc_gss_svc_max_data_length;
break;
case MOD_UNLOAD:
- /* Unloading of the kgssapi module isn't supported. */
+ /*
+ * Unloading of the kgssapi module is not currently supported.
+ * If somebody wants this, we would need to keep track of
+ * currently executing threads and make sure the count is 0.
+ */
/* FALLTHROUGH */
default:
error = EOPNOTSUPP;
diff --git a/sys/mips/conf/RT305X b/sys/mips/conf/RT305X
index 00506e3..1e1ed38 100644
--- a/sys/mips/conf/RT305X
+++ b/sys/mips/conf/RT305X
@@ -92,9 +92,9 @@ options IPFIREWALL_DEFAULT_TO_ACCEPT
device random
device loop
-# RT3050F, RT3052F have only pseudo PHYs
-#device mii
-#device miibus
+# RT3050F, RT3052F have only pseudo PHYs, so mii not required
+device rt
+
device pty # Pseudo-ttys (telnet etc)
device ether
device bpf # Berkeley packet filter
diff --git a/sys/mips/conf/RT305X.hints b/sys/mips/conf/RT305X.hints
index 3c8b6cb..b405202 100644
--- a/sys/mips/conf/RT305X.hints
+++ b/sys/mips/conf/RT305X.hints
@@ -14,11 +14,12 @@ hint.nvram.1.maxsize=0x4000
hint.nvram.1.flags=3 # 1 = No check, 2 = Format Generic
# on-board Ralink Frame Engine
-#hint.rt.0.at="nexus0"
-#hint.rt.0.maddr=0x12000000
-#hint.rt.0.msize=0x200000
-#hint.rt.0.irq=9
-hint.rt.0.macaddr="00:18:e7:d5:83:90"
+hint.rt.0.at="nexus0"
+hint.rt.0.maddr=0x10100000
+hint.rt.0.msize=0x10000
+hint.rt.0.irq=3
+# macaddr can be statically set
+#hint.rt.0.macaddr="xx:xx:xx:xx:xx:xx"
# on-board Ralink 2872 802.11n core
hint.rt2860.0.at="nexus0"
diff --git a/sys/mips/conf/XLP b/sys/mips/conf/XLP
new file mode 100644
index 0000000..6843534
--- /dev/null
+++ b/sys/mips/conf/XLP
@@ -0,0 +1,93 @@
+# XLP -- Generic kernel configuration file for FreeBSD/mips
+#
+# For more information on this file, please read the handbook section on
+# Kernel Configuration Files:
+#
+# http://www.FreeBSD.org/doc/en_US.ISO8859-1/books/handbook/kernelconfig-config.html
+#
+# The handbook is also available locally in /usr/share/doc/handbook
+# if you've installed the doc distribution, otherwise always see the
+# FreeBSD World Wide Web server (http://www.FreeBSD.org/) for the
+# latest information.
+#
+# An exhaustive list of options and more detailed explanations of the
+# device lines is also present in the ../../conf/NOTES and NOTES files.
+# If you are in doubt as to the purpose or necessity of a line, check first
+# in NOTES.
+#
+# $FreeBSD$
+
+machine mips mipseb
+ident XLP
+
+options ISA_MIPS32
+makeoptions KERNLOADADDR=0x80100000
+
+include "../nlm/std.xlp"
+makeoptions MODULES_OVERRIDE=""
+makeoptions DEBUG=-g # Build kernel with gdb(1) debug symbols
+#profile 2
+makeoptions TRAMPLOADADDR=0xffffffff85000000
+makeoptions TRAMP_ARCH_FLAGS="-mabi=64 -march=mips64"
+
+options SCHED_ULE # ULE scheduler
+#options VERBOSE_SYSINIT
+#options SCHED_4BSD # 4BSD scheduler
+options SMP
+options PREEMPTION # Enable kernel thread preemption
+#options FULL_PREEMPTION # Enable kernel thread preemption
+options INET # InterNETworking
+options INET6 # IPv6 communications protocols
+options FFS # Berkeley Fast Filesystem
+#options SOFTUPDATES # Enable FFS soft updates support
+options UFS_ACL # Support for access control lists
+options UFS_DIRHASH # Improve performance on big directories
+options NFSCL
+options NFS_ROOT
+options MSDOSFS #MSDOS Filesystem
+#
+#options BOOTP
+#options BOOTP_NFSROOT
+#options BOOTP_NFSV3
+#options BOOTP_WIRED_TO=nlge0
+#options BOOTP_COMPAT
+#options ROOTDEVNAME=\"nfs:10.1.1.8:/usr/extra/nfsroot\"
+#
+options MD_ROOT # MD is a potential root device
+options MD_ROOT_SIZE=27000
+options ROOTDEVNAME=\"ufs:md0\"
+options _KPOSIX_PRIORITY_SCHEDULING # POSIX P1003_1B real-time extensions
+options HZ=1000
+options NO_SWAPPING
+
+#Debugging options
+options KTRACE # ktrace(1) support
+options DDB
+options KDB
+options GDB
+options BREAK_TO_DEBUGGER
+options ALT_BREAK_TO_DEBUGGER
+#options DEADLKRES #Enable the deadlock resolver
+#options INVARIANTS #Enable calls of extra sanity checking
+#options INVARIANT_SUPPORT #Extra sanity checks of internal structures, required by INVARIANTS
+#options WITNESS #Enable checks to detect deadlocks and cycles
+#options WITNESS_SKIPSPIN #Don't run witness on spinlocks for speed
+#options KTR # ktr(4) and ktrdump(8) support
+#options KTR_COMPILE=(KTR_LOCK|KTR_PROC|KTR_INTR|KTR_CALLOUT|KTR_UMA|KTR_SYSC)
+#options KTR_ENTRIES=131072
+#options LOCK_DEBUG
+#options LOCK_PROFILING
+
+
+# Pseudo
+device loop
+device random
+device md
+device pty
+device bpf
+
+# UART
+device uart
+
+# Network
+device ether
diff --git a/sys/mips/conf/XLP64 b/sys/mips/conf/XLP64
new file mode 100644
index 0000000..997a1f6
--- /dev/null
+++ b/sys/mips/conf/XLP64
@@ -0,0 +1,95 @@
+# XLP64 -- Generic kernel configuration file for FreeBSD/mips
+#
+# For more information on this file, please read the handbook section on
+# Kernel Configuration Files:
+#
+# http://www.FreeBSD.org/doc/en_US.ISO8859-1/books/handbook/kernelconfig-config.html
+#
+# The handbook is also available locally in /usr/share/doc/handbook
+# if you've installed the doc distribution, otherwise always see the
+# FreeBSD World Wide Web server (http://www.FreeBSD.org/) for the
+# latest information.
+#
+# An exhaustive list of options and more detailed explanations of the
+# device lines is also present in the ../../conf/NOTES and NOTES files.
+# If you are in doubt as to the purpose or necessity of a line, check first
+# in NOTES.
+#
+# $FreeBSD$
+
+machine mips mips64eb
+ident XLP64
+
+options ISA_MIPS64
+makeoptions ARCH_FLAGS="-march=mips64 -mabi=64"
+makeoptions KERNLOADADDR=0xffffffff80100000
+
+include "../nlm/std.xlp"
+
+makeoptions MODULES_OVERRIDE=""
+makeoptions DEBUG=-g # Build kernel with gdb(1) debug symbols
+#profile 2
+makeoptions TRAMPLOADADDR=0xffffffff85000000
+makeoptions TRAMP_ARCH_FLAGS="-mabi=64 -march=mips64"
+
+options SCHED_ULE # ULE scheduler
+#options VERBOSE_SYSINIT
+#options SCHED_4BSD # 4BSD scheduler
+options SMP
+options PREEMPTION # Enable kernel thread preemption
+#options FULL_PREEMPTION # Enable kernel thread preemption
+options INET # InterNETworking
+options INET6 # IPv6 communications protocols
+options FFS # Berkeley Fast Filesystem
+#options SOFTUPDATES # Enable FFS soft updates support
+options UFS_ACL # Support for access control lists
+options UFS_DIRHASH # Improve performance on big directories
+options NFSCL
+options NFS_ROOT
+options MSDOSFS #MSDOS Filesystem
+#
+#options BOOTP
+#options BOOTP_NFSROOT
+#options BOOTP_NFSV3
+#options BOOTP_WIRED_TO=nlge0
+#options BOOTP_COMPAT
+#options ROOTDEVNAME=\"nfs:10.1.1.8:/usr/extra/nfsroot\"
+#
+options MD_ROOT # MD is a potential root device
+options MD_ROOT_SIZE=27000
+options ROOTDEVNAME=\"ufs:md0\"
+options _KPOSIX_PRIORITY_SCHEDULING # POSIX P1003_1B real-time extensions
+options HZ=1000
+options NO_SWAPPING
+
+#Debugging options
+options KTRACE # ktrace(1) support
+options DDB
+options KDB
+options GDB
+options BREAK_TO_DEBUGGER
+options ALT_BREAK_TO_DEBUGGER
+#options DEADLKRES #Enable the deadlock resolver
+#options INVARIANTS #Enable calls of extra sanity checking
+#options INVARIANT_SUPPORT #Extra sanity checks of internal structures, required by INVARIANTS
+#options WITNESS #Enable checks to detect deadlocks and cycles
+#options WITNESS_SKIPSPIN #Don't run witness on spinlocks for speed
+#options KTR # ktr(4) and ktrdump(8) support
+#options KTR_COMPILE=(KTR_LOCK|KTR_PROC|KTR_INTR|KTR_CALLOUT|KTR_UMA|KTR_SYSC)
+#options KTR_ENTRIES=131072
+#options LOCK_DEBUG
+#options LOCK_PROFILING
+
+
+# Pseudo
+device loop
+device random
+device md
+device pty
+device bpf
+
+# UART
+device uart
+
+# Network
+device ether
diff --git a/sys/mips/conf/XLPN32 b/sys/mips/conf/XLPN32
new file mode 100644
index 0000000..97c73a8
--- /dev/null
+++ b/sys/mips/conf/XLPN32
@@ -0,0 +1,94 @@
+# XLPN32 -- Generic kernel configuration file for FreeBSD/mips
+#
+# For more information on this file, please read the handbook section on
+# Kernel Configuration Files:
+#
+# http://www.FreeBSD.org/doc/en_US.ISO8859-1/books/handbook/kernelconfig-config.html
+#
+# The handbook is also available locally in /usr/share/doc/handbook
+# if you've installed the doc distribution, otherwise always see the
+# FreeBSD World Wide Web server (http://www.FreeBSD.org/) for the
+# latest information.
+#
+# An exhaustive list of options and more detailed explanations of the
+# device lines is also present in the ../../conf/NOTES and NOTES files.
+# If you are in doubt as to the purpose or necessity of a line, check first
+# in NOTES.
+#
+# $FreeBSD$
+
+machine mips mipsn32eb
+ident XLPN32
+
+options ISA_MIPS64
+makeoptions ARCH_FLAGS="-march=mips64 -mabi=n32"
+makeoptions KERNLOADADDR=0x80100000
+
+include "../nlm/std.xlp"
+makeoptions MODULES_OVERRIDE=""
+makeoptions DEBUG=-g # Build kernel with gdb(1) debug symbols
+#profile 2
+makeoptions TRAMPLOADADDR=0xffffffff85000000
+makeoptions TRAMP_ARCH_FLAGS="-mabi=64 -march=mips64"
+
+options SCHED_ULE # ULE scheduler
+#options VERBOSE_SYSINIT
+#options SCHED_4BSD # 4BSD scheduler
+options SMP
+options PREEMPTION # Enable kernel thread preemption
+#options FULL_PREEMPTION # Enable kernel thread preemption
+options INET # InterNETworking
+options INET6 # IPv6 communications protocols
+options FFS # Berkeley Fast Filesystem
+#options SOFTUPDATES # Enable FFS soft updates support
+options UFS_ACL # Support for access control lists
+options UFS_DIRHASH # Improve performance on big directories
+options NFSCL
+options NFS_ROOT
+options MSDOSFS #MSDOS Filesystem
+#
+#options BOOTP
+#options BOOTP_NFSROOT
+#options BOOTP_NFSV3
+#options BOOTP_WIRED_TO=nlge0
+#options BOOTP_COMPAT
+#options ROOTDEVNAME=\"nfs:10.1.1.8:/usr/extra/nfsroot\"
+#
+options MD_ROOT # MD is a potential root device
+options MD_ROOT_SIZE=27000
+options ROOTDEVNAME=\"ufs:md0\"
+options _KPOSIX_PRIORITY_SCHEDULING # POSIX P1003_1B real-time extensions
+options HZ=1000
+options NO_SWAPPING
+
+#Debugging options
+options KTRACE # ktrace(1) support
+#options DDB
+#options KDB
+#options GDB
+#options BREAK_TO_DEBUGGER
+#options ALT_BREAK_TO_DEBUGGER
+#options DEADLKRES #Enable the deadlock resolver
+#options INVARIANTS #Enable calls of extra sanity checking
+#options INVARIANT_SUPPORT #Extra sanity checks of internal structures, required by INVARIANTS
+#options WITNESS #Enable checks to detect deadlocks and cycles
+#options WITNESS_SKIPSPIN #Don't run witness on spinlocks for speed
+#options KTR # ktr(4) and ktrdump(8) support
+#options KTR_COMPILE=(KTR_LOCK|KTR_PROC|KTR_INTR|KTR_CALLOUT|KTR_UMA|KTR_SYSC)
+#options KTR_ENTRIES=131072
+#options LOCK_DEBUG
+#options LOCK_PROFILING
+
+
+# Pseudo
+device loop
+device random
+device md
+device pty
+device bpf
+
+# UART
+device uart
+
+# Network
+device ether
diff --git a/sys/mips/include/bus.h b/sys/mips/include/bus.h
index af83d36..1745b0f 100644
--- a/sys/mips/include/bus.h
+++ b/sys/mips/include/bus.h
@@ -721,7 +721,7 @@ void __bs_c(f,_bs_c_8) (void *t, bus_space_handle_t bsh1, \
DECLARE_BUS_SPACE_PROTOTYPES(generic);
extern bus_space_tag_t mips_bus_space_generic;
/* Special bus space for RMI processors */
-#ifdef CPU_RMI
+#if defined(CPU_RMI) || defined (CPU_NLM)
extern bus_space_tag_t rmi_bus_space;
extern bus_space_tag_t rmi_pci_bus_space;
#endif
diff --git a/sys/mips/include/cpufunc.h b/sys/mips/include/cpufunc.h
index f680970..f5c24b4 100644
--- a/sys/mips/include/cpufunc.h
+++ b/sys/mips/include/cpufunc.h
@@ -254,6 +254,10 @@ MIPS_RW32_COP0_SEL(config3, MIPS_COP_0_CONFIG, 3);
#ifdef CPU_CNMIPS
MIPS_RW32_COP0_SEL(config4, MIPS_COP_0_CONFIG, 4);
#endif
+#ifdef CPU_NLM
+MIPS_RW32_COP0_SEL(config6, MIPS_COP_0_CONFIG, 6);
+MIPS_RW32_COP0_SEL(config7, MIPS_COP_0_CONFIG, 7);
+#endif
MIPS_RW32_COP0(count, MIPS_COP_0_COUNT);
MIPS_RW32_COP0(index, MIPS_COP_0_TLB_INDEX);
MIPS_RW32_COP0(wired, MIPS_COP_0_TLB_WIRED);
diff --git a/sys/mips/include/intr_machdep.h b/sys/mips/include/intr_machdep.h
index 3d66e63..f224517 100644
--- a/sys/mips/include/intr_machdep.h
+++ b/sys/mips/include/intr_machdep.h
@@ -29,7 +29,7 @@
#ifndef _MACHINE_INTR_MACHDEP_H_
#define _MACHINE_INTR_MACHDEP_H_
-#ifdef CPU_RMI
+#if defined(CPU_RMI) || defined(CPU_NLM)
#define XLR_MAX_INTR 64
#else
#define NHARD_IRQS 6
diff --git a/sys/mips/malta/gt_pci.c b/sys/mips/malta/gt_pci.c
index 237e742..aa28639 100644
--- a/sys/mips/malta/gt_pci.c
+++ b/sys/mips/malta/gt_pci.c
@@ -326,15 +326,15 @@ gt_pci_attach(device_t dev)
ICW4_8086);
/* mask all interrupts */
- bus_space_write_1(sc->sc_st, sc->sc_ioh_icu1, 0,
+ bus_space_write_1(sc->sc_st, sc->sc_ioh_icu1, 1,
sc->sc_imask & 0xff);
/* enable special mask mode */
- bus_space_write_1(sc->sc_st, sc->sc_ioh_icu1, 1,
+ bus_space_write_1(sc->sc_st, sc->sc_ioh_icu1, 0,
OCW3_SEL | OCW3_ESMM | OCW3_SMM);
/* read IRR by default */
- bus_space_write_1(sc->sc_st, sc->sc_ioh_icu1, 1,
+ bus_space_write_1(sc->sc_st, sc->sc_ioh_icu1, 0,
OCW3_SEL | OCW3_RR);
/* reset, program device, 4 bytes */
@@ -348,15 +348,15 @@ gt_pci_attach(device_t dev)
ICW4_8086);
/* mask all interrupts */
- bus_space_write_1(sc->sc_st, sc->sc_ioh_icu2, 0,
+ bus_space_write_1(sc->sc_st, sc->sc_ioh_icu2, 1,
sc->sc_imask & 0xff);
/* enable special mask mode */
- bus_space_write_1(sc->sc_st, sc->sc_ioh_icu2, 1,
+ bus_space_write_1(sc->sc_st, sc->sc_ioh_icu2, 0,
OCW3_SEL | OCW3_ESMM | OCW3_SMM);
/* read IRR by default */
- bus_space_write_1(sc->sc_st, sc->sc_ioh_icu2, 1,
+ bus_space_write_1(sc->sc_st, sc->sc_ioh_icu2, 0,
OCW3_SEL | OCW3_RR);
/*
diff --git a/sys/mips/mips/cache.c b/sys/mips/mips/cache.c
index e54a3e1..4e7f35f 100644
--- a/sys/mips/mips/cache.c
+++ b/sys/mips/mips/cache.c
@@ -80,6 +80,13 @@ __FBSDID("$FreeBSD$");
struct mips_cache_ops mips_cache_ops;
+#if defined(MIPS_DISABLE_L1_CACHE) || defined(CPU_RMI) || defined(CPU_NLM)
+static void
+cache_noop(vm_offset_t va, vm_size_t size)
+{
+}
+#endif
+
void
mips_config_cache(struct mips_cpuinfo * cpuinfo)
{
@@ -94,8 +101,13 @@ mips_config_cache(struct mips_cpuinfo * cpuinfo)
break;
case 32:
mips_cache_ops.mco_icache_sync_all = mipsNN_icache_sync_all_32;
+#ifdef CPU_NLM
+ mips_cache_ops.mco_icache_sync_range =
+ mipsNN_icache_sync_range_index_32;
+#else
mips_cache_ops.mco_icache_sync_range =
mipsNN_icache_sync_range_32;
+#endif
mips_cache_ops.mco_icache_sync_range_index =
mipsNN_icache_sync_range_index_32;
break;
@@ -143,16 +155,26 @@ mips_config_cache(struct mips_cpuinfo * cpuinfo)
mips_cache_ops.mco_pdcache_wbinv_all =
mips_cache_ops.mco_intern_pdcache_wbinv_all =
mipsNN_pdcache_wbinv_all_32;
+#ifdef CPU_NLM
+ mips_cache_ops.mco_pdcache_wbinv_range =
+ mipsNN_pdcache_wbinv_range_index_32;
+#else
mips_cache_ops.mco_pdcache_wbinv_range =
mipsNN_pdcache_wbinv_range_32;
+#endif
mips_cache_ops.mco_pdcache_wbinv_range_index =
mips_cache_ops.mco_intern_pdcache_wbinv_range_index =
mipsNN_pdcache_wbinv_range_index_32;
mips_cache_ops.mco_pdcache_inv_range =
mipsNN_pdcache_inv_range_32;
+#if defined(CPU_RMI) || defined(CPU_NLM)
+ mips_cache_ops.mco_pdcache_wb_range =
+ mips_cache_ops.mco_intern_pdcache_wb_range = cache_noop;
+#else
mips_cache_ops.mco_pdcache_wb_range =
mips_cache_ops.mco_intern_pdcache_wb_range =
mipsNN_pdcache_wb_range_32;
+#endif
break;
#ifdef CPU_CNMIPS
case 128:
diff --git a/sys/mips/mips/cache_mipsNN.c b/sys/mips/mips/cache_mipsNN.c
index 57ea719..98014b1 100644
--- a/sys/mips/mips/cache_mipsNN.c
+++ b/sys/mips/mips/cache_mipsNN.c
@@ -54,15 +54,36 @@ __FBSDID("$FreeBSD$");
#define round_line32(x) (((x) + 31) & ~31)
#define trunc_line32(x) ((x) & ~31)
+#if defined(CPU_NLM)
+static __inline void
+xlp_sync(void)
+{
+ __asm __volatile (
+ ".set push \n"
+ ".set noreorder \n"
+ ".set mips64 \n"
+ "dla $8, 1f \n"
+ "/* jr.hb $8 */ \n"
+ ".word 0x1000408 \n"
+ "nop \n"
+ "1: nop \n"
+ ".set pop \n"
+ : : : "$8");
+}
+#endif
-#ifdef SB1250_PASS1
+#if defined(SB1250_PASS1)
#define SYNC __asm volatile("sync; sync")
+#elif defined(CPU_NLM)
+#define SYNC xlp_sync()
#else
#define SYNC __asm volatile("sync")
#endif
-#ifdef CPU_CNMIPS
+#if defined(CPU_CNMIPS)
#define SYNCI mips_sync_icache();
+#elif defined(CPU_NLM)
+#define SYNCI xlp_sync()
#else
#define SYNCI
#endif
diff --git a/sys/mips/mips/cpu.c b/sys/mips/mips/cpu.c
index cfb5ddb..e87b7a0 100644
--- a/sys/mips/mips/cpu.c
+++ b/sys/mips/mips/cpu.c
@@ -101,8 +101,14 @@ mips_get_identity(struct mips_cpuinfo *cpuinfo)
/* Learn TLB size and L1 cache geometry. */
cfg1 = mips_rd_config1();
+#ifndef CPU_NLM
cpuinfo->tlb_nentries =
((cfg1 & MIPS_CONFIG1_TLBSZ_MASK) >> MIPS_CONFIG1_TLBSZ_SHIFT) + 1;
+#else
+ /* Account for Extended TLB entries in XLP */
+ tmp = mips_rd_config6();
+ cpuinfo->tlb_nentries = ((tmp >> 16) & 0xffff) + 1;
+#endif
/* Add extended TLB size information from config4. */
#if defined(CPU_CNMIPS)
diff --git a/sys/mips/mips/elf_trampoline.c b/sys/mips/mips/elf_trampoline.c
index 70aedeb..7d8324a 100644
--- a/sys/mips/mips/elf_trampoline.c
+++ b/sys/mips/mips/elf_trampoline.c
@@ -27,7 +27,7 @@ __FBSDID("$FreeBSD$");
#include <machine/asm.h>
#include <sys/param.h>
-#ifdef __mips_n64
+#if ELFSIZE == 64
#include <sys/elf64.h>
#else
#include <sys/elf32.h>
@@ -90,13 +90,19 @@ bzero(void *addr, size_t count)
}
/*
+ * Convert number to pointer, truncate on 64->32 case, sign extend
+ * in 32->64 case
+ */
+#define mkptr(x) ((void *)(intptr_t)(int)(x))
+
+/*
* Relocate PT_LOAD segements of kernel ELF image to their respective
* virtual addresses and return entry point
*/
void *
load_kernel(void * kstart)
{
-#ifdef __mips_n64
+#if ELFSIZE == 64
Elf64_Ehdr *eh;
Elf64_Phdr phdr[64] /* XXX */;
Elf64_Shdr shdr[64] /* XXX */;
@@ -107,17 +113,19 @@ load_kernel(void * kstart)
#endif
int i, j;
void *entry_point;
- vm_offset_t lastaddr = 0;
+ vm_offset_t loadend = 0;
+ intptr_t lastaddr;
int symtabindex = -1;
int symstrindex = -1;
+ Elf_Size tmp;
-#ifdef __mips_n64
+#if ELFSIZE == 64
eh = (Elf64_Ehdr *)kstart;
#else
eh = (Elf32_Ehdr *)kstart;
#endif
- entry_point = (void*)eh->e_entry;
- memcpy(phdr, (void *)(kstart + eh->e_phoff ),
+ entry_point = mkptr(eh->e_entry);
+ memcpy(phdr, (void *)(kstart + eh->e_phoff),
eh->e_phnum * sizeof(phdr[0]));
memcpy(shdr, (void *)(kstart + eh->e_shoff),
@@ -147,27 +155,31 @@ load_kernel(void * kstart)
if (phdr[i].p_type != PT_LOAD)
continue;
- memcpy((void *)(phdr[i].p_vaddr),
+ memcpy(mkptr(phdr[i].p_vaddr),
(void*)(kstart + phdr[i].p_offset), phdr[i].p_filesz);
/* Clean space from oversized segments, eg: bss. */
if (phdr[i].p_filesz < phdr[i].p_memsz)
- bzero((void *)(phdr[i].p_vaddr + phdr[i].p_filesz),
+ bzero(mkptr(phdr[i].p_vaddr + phdr[i].p_filesz),
phdr[i].p_memsz - phdr[i].p_filesz);
- if (lastaddr < phdr[i].p_vaddr + phdr[i].p_memsz)
- lastaddr = phdr[i].p_vaddr + phdr[i].p_memsz;
+ if (loadend < phdr[i].p_vaddr + phdr[i].p_memsz)
+ loadend = phdr[i].p_vaddr + phdr[i].p_memsz;
}
/* Now grab the symbol tables. */
+ lastaddr = (intptr_t)(int)loadend;
if (symtabindex >= 0 && symstrindex >= 0) {
- *(Elf_Size *)lastaddr = SYMTAB_MAGIC;
+ tmp = SYMTAB_MAGIC;
+ memcpy((void *)lastaddr, &tmp, sizeof(tmp));
lastaddr += sizeof(Elf_Size);
- *(Elf_Size *)lastaddr = shdr[symtabindex].sh_size +
+ tmp = shdr[symtabindex].sh_size +
shdr[symstrindex].sh_size + 2*sizeof(Elf_Size);
+ memcpy((void *)lastaddr, &tmp, sizeof(tmp));
lastaddr += sizeof(Elf_Size);
/* .symtab size */
- *(Elf_Size *)lastaddr = shdr[symtabindex].sh_size;
+ tmp = shdr[symtabindex].sh_size;
+ memcpy((void *)lastaddr, &tmp, sizeof(tmp));
lastaddr += sizeof(shdr[symtabindex].sh_size);
/* .symtab data */
memcpy((void*)lastaddr,
@@ -176,16 +188,19 @@ load_kernel(void * kstart)
lastaddr += shdr[symtabindex].sh_size;
/* .strtab size */
- *(Elf_Size *)lastaddr = shdr[symstrindex].sh_size;
+ tmp = shdr[symstrindex].sh_size;
+ memcpy((void *)lastaddr, &tmp, sizeof(tmp));
lastaddr += sizeof(shdr[symstrindex].sh_size);
/* .strtab data */
memcpy((void*)lastaddr,
shdr[symstrindex].sh_offset + kstart,
shdr[symstrindex].sh_size);
- } else
+ } else {
/* Do not take any chances */
- *(Elf_Size *)lastaddr = 0;
+ tmp = 0;
+ memcpy((void *)lastaddr, &tmp, sizeof(tmp));
+ }
return entry_point;
}
diff --git a/sys/mips/mips/exception.S b/sys/mips/mips/exception.S
index da32a77..ed7554b 100644
--- a/sys/mips/mips/exception.S
+++ b/sys/mips/mips/exception.S
@@ -228,7 +228,7 @@ SlowFault:
and a0, a0, a2 ; \
mtc0 a0, MIPS_COP_0_STATUS ; \
ITLBNOPFIX
-#elif defined(CPU_RMI)
+#elif defined(CPU_RMI) || defined(CPU_NLM)
#define CLEAR_STATUS \
mfc0 a0, MIPS_COP_0_STATUS ;\
li a2, (MIPS_SR_KX | MIPS_SR_UX | MIPS_SR_COP_2_BIT) ; \
@@ -470,7 +470,7 @@ NNON_LEAF(MipsUserGenException, CALLFRAME_SIZ, ra)
and t0, a0, ~(MIPS_SR_COP_1_BIT | MIPS_SR_EXL | MIPS3_SR_KSU_MASK | MIPS_SR_INT_IE)
#if defined(CPU_CNMIPS)
or t0, t0, (MIPS_SR_KX | MIPS_SR_SX | MIPS_SR_UX | MIPS_SR_PX)
-#elif defined(CPU_RMI)
+#elif defined(CPU_RMI) || defined(CPU_NLM)
or t0, t0, (MIPS_SR_KX | MIPS_SR_UX | MIPS_SR_COP_2_BIT)
#endif
mtc0 t0, MIPS_COP_0_STATUS
@@ -688,7 +688,7 @@ NNON_LEAF(MipsUserIntr, CALLFRAME_SIZ, ra)
and t0, a0, ~(MIPS_SR_COP_1_BIT | MIPS_SR_EXL | MIPS_SR_INT_IE | MIPS3_SR_KSU_MASK)
#ifdef CPU_CNMIPS
or t0, t0, (MIPS_SR_KX | MIPS_SR_SX | MIPS_SR_UX | MIPS_SR_PX)
-#elif defined(CPU_RMI)
+#elif defined(CPU_RMI) || defined(CPU_NLM)
or t0, t0, (MIPS_SR_KX | MIPS_SR_UX | MIPS_SR_COP_2_BIT)
#endif
mtc0 t0, MIPS_COP_0_STATUS
@@ -1134,16 +1134,19 @@ END(MipsFPTrap)
*/
.data
.globl intrcnt
- .globl eintrcnt
+ .globl sintrcnt
.globl intrnames
- .globl eintrnames
+ .globl sintrnames
intrnames:
.space INTRCNT_COUNT * (MAXCOMLEN + 1) * 2
-eintrnames:
+sintrnames:
+ .word INTRCNT_COUNT * (MAXCOMLEN + 1) * 2
+
.align 4
intrcnt:
.space INTRCNT_COUNT * 4 * 2
-eintrcnt:
+sintrcnt:
+ .word INTRCNT_COUNT * 4 * 2
/*
diff --git a/sys/mips/mips/locore.S b/sys/mips/mips/locore.S
index 9f685eb..4b28f19 100644
--- a/sys/mips/mips/locore.S
+++ b/sys/mips/mips/locore.S
@@ -99,7 +99,7 @@ VECTOR(_locore, unknown)
/* Reset these bits */
li t0, ~(MIPS_SR_DE | MIPS_SR_SOFT_RESET | MIPS_SR_ERL | MIPS_SR_EXL | MIPS_SR_INT_IE)
-#elif defined (CPU_RMI)
+#elif defined (CPU_RMI) || defined (CPU_NLM)
/* Set these bits */
li t1, (MIPS_SR_COP_2_BIT | MIPS_SR_COP_0_BIT | MIPS_SR_KX | MIPS_SR_UX)
diff --git a/sys/mips/mips/machdep.c b/sys/mips/mips/machdep.c
index 4c80ea0..f7e5248 100644
--- a/sys/mips/mips/machdep.c
+++ b/sys/mips/mips/machdep.c
@@ -338,7 +338,7 @@ mips_vector_init(void)
bcopy(MipsTLBMiss, (void *)MIPS_UTLB_MISS_EXC_VEC,
MipsTLBMissEnd - MipsTLBMiss);
-#if defined(CPU_CNMIPS) || defined(CPU_RMI)
+#if defined(CPU_CNMIPS) || defined(CPU_RMI) || defined(CPU_NLM)
/* Fake, but sufficient, for the 32-bit with 64-bit hardware addresses */
bcopy(MipsTLBMiss, (void *)MIPS3_XTLB_MISS_EXC_VEC,
MipsTLBMissEnd - MipsTLBMiss);
diff --git a/sys/mips/mips/mp_machdep.c b/sys/mips/mips/mp_machdep.c
index 79a3476..2298124 100644
--- a/sys/mips/mips/mp_machdep.c
+++ b/sys/mips/mips/mp_machdep.c
@@ -75,8 +75,11 @@ ipi_send(struct pcpu *pc, int ipi)
void
ipi_all_but_self(int ipi)
{
+ cpuset_t other_cpus;
- ipi_selected(PCPU_GET(other_cpus), ipi);
+ other_cpus = all_cpus;
+ CPU_CLR(PCPU_GET(cpuid), &other_cpus);
+ ipi_selected(other_cpus, ipi);
}
/* Send an IPI to a set of cpus. */
@@ -86,7 +89,7 @@ ipi_selected(cpuset_t cpus, int ipi)
struct pcpu *pc;
STAILQ_FOREACH(pc, &cpuhead, pc_allcpu) {
- if (CPU_OVERLAP(&cpus, &pc->pc_cpumask)) {
+ if (CPU_ISSET(pc->pc_cpuid, &cpus)) {
CTR3(KTR_SMP, "%s: pc: %p, ipi: %x\n", __func__, pc,
ipi);
ipi_send(pc, ipi);
@@ -109,13 +112,10 @@ ipi_cpu(int cpu, u_int ipi)
static int
mips_ipi_handler(void *arg)
{
- int cpu;
- cpuset_t cpumask;
- u_int ipi, ipi_bitmap;
+ u_int cpu, ipi, ipi_bitmap;
int bit;
cpu = PCPU_GET(cpuid);
- cpumask = PCPU_GET(cpumask);
platform_ipi_clear(); /* quiesce the pending ipi interrupt */
@@ -150,14 +150,14 @@ mips_ipi_handler(void *arg)
tlb_save();
/* Indicate we are stopped */
- CPU_OR_ATOMIC(&stopped_cpus, &cpumask);
+ CPU_SET_ATOMIC(cpu, &stopped_cpus);
/* Wait for restart */
- while (!CPU_OVERLAP(&started_cpus, &cpumask))
+ while (!CPU_ISSET(cpu, &started_cpus))
cpu_spinwait();
- CPU_NAND_ATOMIC(&started_cpus, &cpumask);
- CPU_NAND_ATOMIC(&stopped_cpus, &cpumask);
+ CPU_CLR_ATOMIC(cpu, &started_cpus);
+ CPU_CLR_ATOMIC(cpu, &stopped_cpus);
CTR0(KTR_SMP, "IPI_STOP (restart)");
break;
case IPI_PREEMPT:
@@ -243,7 +243,7 @@ void
cpu_mp_start(void)
{
int error, cpuid;
- cpuset_t cpumask, ocpus;
+ cpuset_t cpumask;
mtx_init(&ap_boot_mtx, "ap boot", NULL, MTX_SPIN);
@@ -269,16 +269,11 @@ cpu_mp_start(void)
}
CPU_SET(cpuid, &all_cpus);
}
-
- ocpus = all_cpus;
- CPU_CLR(PCPU_GET(cpuid), &ocpus);
- PCPU_SET(other_cpus, ocpus);
}
void
smp_init_secondary(u_int32_t cpuid)
{
- cpuset_t ocpus;
/* TLB */
mips_wr_wired(0);
@@ -316,11 +311,6 @@ smp_init_secondary(u_int32_t cpuid)
CTR1(KTR_SMP, "SMP: AP CPU #%d launched", PCPU_GET(cpuid));
- /* Build our map of 'other' CPUs. */
- ocpus = all_cpus;
- CPU_CLR(PCPU_GET(cpuid), &ocpus);
- PCPU_SET(other_cpus, ocpus);
-
if (bootverbose)
printf("SMP: AP CPU #%d launched.\n", PCPU_GET(cpuid));
diff --git a/sys/mips/mips/pmap.c b/sys/mips/mips/pmap.c
index 1d4d411..4d46099 100644
--- a/sys/mips/mips/pmap.c
+++ b/sys/mips/mips/pmap.c
@@ -625,19 +625,18 @@ pmap_init(void)
static __inline void
pmap_invalidate_all_local(pmap_t pmap)
{
+ u_int cpuid;
+
+ cpuid = PCPU_GET(cpuid);
if (pmap == kernel_pmap) {
tlb_invalidate_all();
return;
}
- sched_pin();
- if (CPU_OVERLAP(&pmap->pm_active, PCPU_PTR(cpumask))) {
- sched_unpin();
+ if (CPU_ISSET(cpuid, &pmap->pm_active))
tlb_invalidate_all_user(pmap);
- } else {
- sched_unpin();
- pmap->pm_asid[PCPU_GET(cpuid)].gen = 0;
- }
+ else
+ pmap->pm_asid[cpuid].gen = 0;
}
#ifdef SMP
@@ -666,21 +665,20 @@ pmap_invalidate_all(pmap_t pmap)
static __inline void
pmap_invalidate_page_local(pmap_t pmap, vm_offset_t va)
{
+ u_int cpuid;
+
+ cpuid = PCPU_GET(cpuid);
if (is_kernel_pmap(pmap)) {
tlb_invalidate_address(pmap, va);
return;
}
- sched_pin();
- if (pmap->pm_asid[PCPU_GET(cpuid)].gen != PCPU_GET(asid_generation)) {
- sched_unpin();
+ if (pmap->pm_asid[cpuid].gen != PCPU_GET(asid_generation))
return;
- } else if (!CPU_OVERLAP(&pmap->pm_active, PCPU_PTR(cpumask))) {
- pmap->pm_asid[PCPU_GET(cpuid)].gen = 0;
- sched_unpin();
+ else if (!CPU_ISSET(cpuid, &pmap->pm_active)) {
+ pmap->pm_asid[cpuid].gen = 0;
return;
}
- sched_unpin();
tlb_invalidate_address(pmap, va);
}
@@ -719,21 +717,20 @@ pmap_invalidate_page(pmap_t pmap, vm_offset_t va)
static __inline void
pmap_update_page_local(pmap_t pmap, vm_offset_t va, pt_entry_t pte)
{
+ u_int cpuid;
+
+ cpuid = PCPU_GET(cpuid);
if (is_kernel_pmap(pmap)) {
tlb_update(pmap, va, pte);
return;
}
- sched_pin();
- if (pmap->pm_asid[PCPU_GET(cpuid)].gen != PCPU_GET(asid_generation)) {
- sched_unpin();
+ if (pmap->pm_asid[cpuid].gen != PCPU_GET(asid_generation))
return;
- } else if (!CPU_OVERLAP(&pmap->pm_active, PCPU_PTR(cpumask))) {
- pmap->pm_asid[PCPU_GET(cpuid)].gen = 0;
- sched_unpin();
+ else if (!CPU_ISSET(cpuid, &pmap->pm_active)) {
+ pmap->pm_asid[cpuid].gen = 0;
return;
}
- sched_unpin();
tlb_update(pmap, va, pte);
}
@@ -1414,7 +1411,7 @@ get_pv_entry(pmap_t locked_pmap)
vpq = &vm_page_queues[PQ_INACTIVE];
retry:
TAILQ_FOREACH(m, &vpq->pl, pageq) {
- if (m->hold_count || m->busy)
+ if ((m->flags & PG_MARKER) != 0 || m->hold_count || m->busy)
continue;
TAILQ_FOREACH_SAFE(pv, &m->md.pv_list, pv_list, next_pv) {
va = pv->pv_va;
@@ -2953,19 +2950,21 @@ pmap_activate(struct thread *td)
{
pmap_t pmap, oldpmap;
struct proc *p = td->td_proc;
+ u_int cpuid;
critical_enter();
pmap = vmspace_pmap(p->p_vmspace);
oldpmap = PCPU_GET(curpmap);
+ cpuid = PCPU_GET(cpuid);
if (oldpmap)
- CPU_NAND_ATOMIC(&oldpmap->pm_active, PCPU_PTR(cpumask));
- CPU_OR_ATOMIC(&pmap->pm_active, PCPU_PTR(cpumask));
+ CPU_CLR_ATOMIC(cpuid, &oldpmap->pm_active);
+ CPU_SET_ATOMIC(cpuid, &pmap->pm_active);
pmap_asid_alloc(pmap);
if (td == curthread) {
PCPU_SET(segbase, pmap->pm_segtab);
- mips_wr_entryhi(pmap->pm_asid[PCPU_GET(cpuid)].asid);
+ mips_wr_entryhi(pmap->pm_asid[cpuid].asid);
}
PCPU_SET(curpmap, pmap);
diff --git a/sys/mips/nlm/board.c b/sys/mips/nlm/board.c
new file mode 100644
index 0000000..d75059e
--- /dev/null
+++ b/sys/mips/nlm/board.c
@@ -0,0 +1,80 @@
+/*-
+ * Copyright 2003-2011 Netlogic Microsystems (Netlogic). All rights
+ * reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY Netlogic Microsystems ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL NETLOGIC OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+ * THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * NETLOGIC_BSD */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+#include <sys/param.h>
+#include <sys/systm.h>
+#include <sys/bus.h>
+#include <sys/kernel.h>
+#include <sys/lock.h>
+#include <sys/mutex.h>
+
+#include <mips/nlm/hal/mips-extns.h>
+#include <mips/nlm/hal/mmio.h>
+#include <mips/nlm/hal/iomap.h>
+#include <mips/nlm/hal/fmn.h>
+#include <mips/nlm/hal/pic.h>
+#include <mips/nlm/hal/uart.h>
+
+#include <mips/nlm/board.h>
+
+struct xlp_board_info xlp_board_info;
+
+int nlm_setup_xlp_board(void);
+
+/*
+ * All our knowledge of chip and board that cannot be detected by probing
+ * at run-time goes here
+ */
+
+int
+nlm_setup_xlp_board(void)
+{
+ struct xlp_board_info *boardp;
+ int node;
+
+ /* start with a clean slate */
+ boardp = &xlp_board_info;
+ memset(boardp, 0, sizeof(xlp_board_info));
+ boardp->nodemask = 0x1; /* only node 0 */
+
+ for (node = 0; node < XLP_MAX_NODES; node++) {
+ if ((boardp->nodemask & (1 << node)) == 0)
+ continue;
+ }
+ return 0;
+}
+
+int nlm_board_info_setup()
+{
+ nlm_setup_xlp_board();
+ return 0;
+}
diff --git a/sys/mips/nlm/board.h b/sys/mips/nlm/board.h
new file mode 100644
index 0000000..742ebba
--- /dev/null
+++ b/sys/mips/nlm/board.h
@@ -0,0 +1,75 @@
+/*-
+ * Copyright 2003-2011 Netlogic Microsystems (Netlogic). All rights
+ * reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY Netlogic Microsystems ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL NETLOGIC OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+ * THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * $FreeBSD$
+ * NETLOGIC_BSD */
+
+#ifndef __NLM_BOARD_H__
+#define __NLM_BOARD_H__
+
+#define XLP_NAE_NBLOCKS 5
+#define XLP_NAE_NPORTS 4
+#define XLP_I2C_MAXDEVICES 8
+
+struct xlp_i2c_devinfo {
+ u_int addr; /* keep first, for i2c ivars to work */
+ int bus;
+ char *device;
+};
+
+struct xlp_port_ivars {
+ int port;
+ int block;
+ int type;
+ int phy_addr;
+};
+
+struct xlp_block_ivars {
+ int block;
+ int type;
+ u_int portmask;
+ struct xlp_port_ivars port_ivars[XLP_NAE_NPORTS];
+};
+
+struct xlp_nae_ivars {
+ int node;
+ u_int blockmask;
+ struct xlp_block_ivars block_ivars[XLP_NAE_NBLOCKS];
+};
+
+struct xlp_board_info {
+ u_int nodemask;
+ struct xlp_node_info {
+ struct xlp_i2c_devinfo i2c_devs[XLP_I2C_MAXDEVICES];
+ struct xlp_nae_ivars nae_ivars;
+ } nodes[XLP_MAX_NODES];
+};
+
+extern struct xlp_board_info xlp_board_info;
+int nlm_board_info_setup(void);
+
+#endif
diff --git a/sys/mips/nlm/bus_space_rmi.c b/sys/mips/nlm/bus_space_rmi.c
new file mode 100644
index 0000000..8653cdf
--- /dev/null
+++ b/sys/mips/nlm/bus_space_rmi.c
@@ -0,0 +1,688 @@
+/*
+ * Copyright 2003-2011 Netlogic Microsystems (Netlogic). All rights
+ * reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY Netlogic Microsystems ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL NETLOGIC OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+ * THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * NETLOGIC_BSD */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+#include <sys/param.h>
+#include <sys/systm.h>
+#include <sys/bus.h>
+#include <sys/kernel.h>
+#include <sys/endian.h>
+#include <sys/malloc.h>
+#include <sys/ktr.h>
+
+#include <vm/vm.h>
+#include <vm/pmap.h>
+#include <vm/vm_kern.h>
+#include <vm/vm_extern.h>
+
+#include <machine/bus.h>
+#include <machine/cache.h>
+
+static int
+rmi_bus_space_map(void *t, bus_addr_t addr,
+ bus_size_t size, int flags,
+ bus_space_handle_t *bshp);
+
+static void
+rmi_bus_space_unmap(void *t, bus_space_handle_t bsh,
+ bus_size_t size);
+
+static int
+rmi_bus_space_subregion(void *t,
+ bus_space_handle_t bsh,
+ bus_size_t offset, bus_size_t size,
+ bus_space_handle_t *nbshp);
+
+static u_int8_t
+rmi_bus_space_read_1(void *t,
+ bus_space_handle_t handle,
+ bus_size_t offset);
+
+static u_int16_t
+rmi_bus_space_read_2(void *t,
+ bus_space_handle_t handle,
+ bus_size_t offset);
+
+static u_int32_t
+rmi_bus_space_read_4(void *t,
+ bus_space_handle_t handle,
+ bus_size_t offset);
+
+static void
+rmi_bus_space_read_multi_1(void *t,
+ bus_space_handle_t handle,
+ bus_size_t offset, u_int8_t *addr,
+ size_t count);
+
+static void
+rmi_bus_space_read_multi_2(void *t,
+ bus_space_handle_t handle,
+ bus_size_t offset, u_int16_t *addr,
+ size_t count);
+
+static void
+rmi_bus_space_read_multi_4(void *t,
+ bus_space_handle_t handle,
+ bus_size_t offset, u_int32_t *addr,
+ size_t count);
+
+static void
+rmi_bus_space_read_region_1(void *t,
+ bus_space_handle_t bsh,
+ bus_size_t offset, u_int8_t *addr,
+ size_t count);
+
+static void
+rmi_bus_space_read_region_2(void *t,
+ bus_space_handle_t bsh,
+ bus_size_t offset, u_int16_t *addr,
+ size_t count);
+
+static void
+rmi_bus_space_read_region_4(void *t,
+ bus_space_handle_t bsh,
+ bus_size_t offset, u_int32_t *addr,
+ size_t count);
+
+static void
+rmi_bus_space_write_1(void *t,
+ bus_space_handle_t handle,
+ bus_size_t offset, u_int8_t value);
+
+static void
+rmi_bus_space_write_2(void *t,
+ bus_space_handle_t handle,
+ bus_size_t offset, u_int16_t value);
+
+static void
+rmi_bus_space_write_4(void *t,
+ bus_space_handle_t handle,
+ bus_size_t offset, u_int32_t value);
+
+static void
+rmi_bus_space_write_multi_1(void *t,
+ bus_space_handle_t handle,
+ bus_size_t offset,
+ const u_int8_t *addr,
+ size_t count);
+
+static void
+rmi_bus_space_write_multi_2(void *t,
+ bus_space_handle_t handle,
+ bus_size_t offset,
+ const u_int16_t *addr,
+ size_t count);
+
+static void
+rmi_bus_space_write_multi_4(void *t,
+ bus_space_handle_t handle,
+ bus_size_t offset,
+ const u_int32_t *addr,
+ size_t count);
+
+static void
+rmi_bus_space_write_region_2(void *t,
+ bus_space_handle_t bsh,
+ bus_size_t offset,
+ const u_int16_t *addr,
+ size_t count);
+
+static void
+rmi_bus_space_write_region_4(void *t,
+ bus_space_handle_t bsh,
+ bus_size_t offset,
+ const u_int32_t *addr,
+ size_t count);
+
+
+static void
+rmi_bus_space_set_region_2(void *t,
+ bus_space_handle_t bsh,
+ bus_size_t offset, u_int16_t value,
+ size_t count);
+static void
+rmi_bus_space_set_region_4(void *t,
+ bus_space_handle_t bsh,
+ bus_size_t offset, u_int32_t value,
+ size_t count);
+
+static void
+rmi_bus_space_barrier(void *tag __unused, bus_space_handle_t bsh __unused,
+ bus_size_t offset __unused, bus_size_t len __unused, int flags);
+
+static void
+rmi_bus_space_copy_region_2(void *t,
+ bus_space_handle_t bsh1,
+ bus_size_t off1,
+ bus_space_handle_t bsh2,
+ bus_size_t off2, size_t count);
+
+u_int8_t
+rmi_bus_space_read_stream_1(void *t, bus_space_handle_t handle,
+ bus_size_t offset);
+
+static u_int16_t
+rmi_bus_space_read_stream_2(void *t, bus_space_handle_t handle,
+ bus_size_t offset);
+
+static u_int32_t
+rmi_bus_space_read_stream_4(void *t, bus_space_handle_t handle,
+ bus_size_t offset);
+static void
+rmi_bus_space_read_multi_stream_1(void *t,
+ bus_space_handle_t handle,
+ bus_size_t offset, u_int8_t *addr,
+ size_t count);
+
+static void
+rmi_bus_space_read_multi_stream_2(void *t,
+ bus_space_handle_t handle,
+ bus_size_t offset, u_int16_t *addr,
+ size_t count);
+
+static void
+rmi_bus_space_read_multi_stream_4(void *t,
+ bus_space_handle_t handle,
+ bus_size_t offset, u_int32_t *addr,
+ size_t count);
+
+void
+rmi_bus_space_write_stream_1(void *t, bus_space_handle_t bsh,
+ bus_size_t offset, u_int8_t value);
+static void
+rmi_bus_space_write_stream_2(void *t, bus_space_handle_t handle,
+ bus_size_t offset, u_int16_t value);
+
+static void
+rmi_bus_space_write_stream_4(void *t, bus_space_handle_t handle,
+ bus_size_t offset, u_int32_t value);
+
+static void
+rmi_bus_space_write_multi_stream_1(void *t,
+ bus_space_handle_t handle,
+ bus_size_t offset,
+ const u_int8_t *addr,
+ size_t count);
+static void
+rmi_bus_space_write_multi_stream_2(void *t,
+ bus_space_handle_t handle,
+ bus_size_t offset,
+ const u_int16_t *addr,
+ size_t count);
+
+static void
+rmi_bus_space_write_multi_stream_4(void *t,
+ bus_space_handle_t handle,
+ bus_size_t offset,
+ const u_int32_t *addr,
+ size_t count);
+
+#define TODO() printf("XLP bus space: '%s' unimplemented\n", __func__)
+
+static struct bus_space local_rmi_bus_space = {
+ /* cookie */
+ (void *)0,
+
+ /* mapping/unmapping */
+ rmi_bus_space_map,
+ rmi_bus_space_unmap,
+ rmi_bus_space_subregion,
+
+ /* allocation/deallocation */
+ NULL,
+ NULL,
+
+ /* barrier */
+ rmi_bus_space_barrier,
+
+ /* read (single) */
+ rmi_bus_space_read_1,
+ rmi_bus_space_read_2,
+ rmi_bus_space_read_4,
+ NULL,
+
+ /* read multiple */
+ rmi_bus_space_read_multi_1,
+ rmi_bus_space_read_multi_2,
+ rmi_bus_space_read_multi_4,
+ NULL,
+
+ /* read region */
+ rmi_bus_space_read_region_1,
+ rmi_bus_space_read_region_2,
+ rmi_bus_space_read_region_4,
+ NULL,
+
+ /* write (single) */
+ rmi_bus_space_write_1,
+ rmi_bus_space_write_2,
+ rmi_bus_space_write_4,
+ NULL,
+
+ /* write multiple */
+ rmi_bus_space_write_multi_1,
+ rmi_bus_space_write_multi_2,
+ rmi_bus_space_write_multi_4,
+ NULL,
+
+ /* write region */
+ NULL,
+ rmi_bus_space_write_region_2,
+ rmi_bus_space_write_region_4,
+ NULL,
+
+ /* set multiple */
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+
+ /* set region */
+ NULL,
+ rmi_bus_space_set_region_2,
+ rmi_bus_space_set_region_4,
+ NULL,
+
+ /* copy */
+ NULL,
+ rmi_bus_space_copy_region_2,
+ NULL,
+ NULL,
+
+ /* read (single) stream */
+ rmi_bus_space_read_stream_1,
+ rmi_bus_space_read_stream_2,
+ rmi_bus_space_read_stream_4,
+ NULL,
+
+ /* read multiple stream */
+ rmi_bus_space_read_multi_stream_1,
+ rmi_bus_space_read_multi_stream_2,
+ rmi_bus_space_read_multi_stream_4,
+ NULL,
+
+ /* read region stream */
+ rmi_bus_space_read_region_1,
+ rmi_bus_space_read_region_2,
+ rmi_bus_space_read_region_4,
+ NULL,
+
+ /* write (single) stream */
+ rmi_bus_space_write_stream_1,
+ rmi_bus_space_write_stream_2,
+ rmi_bus_space_write_stream_4,
+ NULL,
+
+ /* write multiple stream */
+ rmi_bus_space_write_multi_stream_1,
+ rmi_bus_space_write_multi_stream_2,
+ rmi_bus_space_write_multi_stream_4,
+ NULL,
+
+ /* write region stream */
+ NULL,
+ rmi_bus_space_write_region_2,
+ rmi_bus_space_write_region_4,
+ NULL,
+};
+
+/* generic bus_space tag */
+bus_space_tag_t rmi_bus_space = &local_rmi_bus_space;
+
+/*
+ * Map a region of device bus space into CPU virtual address space.
+ */
+static int
+rmi_bus_space_map(void *t __unused, bus_addr_t addr,
+ bus_size_t size __unused, int flags __unused,
+ bus_space_handle_t *bshp)
+{
+
+ *bshp = addr;
+ return (0);
+}
+
+/*
+ * Unmap a region of device bus space.
+ */
+static void
+rmi_bus_space_unmap(void *t __unused, bus_space_handle_t bsh __unused,
+ bus_size_t size __unused)
+{
+}
+
+/*
+ * Get a new handle for a subregion of an already-mapped area of bus space.
+ */
+
+static int
+rmi_bus_space_subregion(void *t __unused, bus_space_handle_t bsh,
+ bus_size_t offset, bus_size_t size __unused,
+ bus_space_handle_t *nbshp)
+{
+ *nbshp = bsh + offset;
+ return (0);
+}
+
+/*
+ * Read a 1, 2, 4, or 8 byte quantity from bus space
+ * described by tag/handle/offset.
+ */
+
+static u_int8_t
+rmi_bus_space_read_1(void *tag, bus_space_handle_t handle,
+ bus_size_t offset)
+{
+ return (u_int8_t) (*(volatile u_int32_t *)(handle + offset));
+}
+
+static u_int16_t
+rmi_bus_space_read_2(void *tag, bus_space_handle_t handle,
+ bus_size_t offset)
+{
+ return (u_int16_t)(*(volatile u_int32_t *)(handle + offset));
+}
+
+static u_int32_t
+rmi_bus_space_read_4(void *tag, bus_space_handle_t handle,
+ bus_size_t offset)
+{
+ return (*(volatile u_int32_t *)(handle + offset));
+}
+
+
+/*
+ * Read `count' 1, 2, 4, or 8 byte quantities from bus space
+ * described by tag/handle/offset and copy into buffer provided.
+ */
+static void
+rmi_bus_space_read_multi_1(void *tag, bus_space_handle_t handle,
+ bus_size_t offset, u_int8_t *addr, size_t count)
+{
+ TODO();
+}
+
+static void
+rmi_bus_space_read_multi_2(void *tag, bus_space_handle_t handle,
+ bus_size_t offset, u_int16_t *addr, size_t count)
+{
+ TODO();
+}
+
+static void
+rmi_bus_space_read_multi_4(void *tag, bus_space_handle_t handle,
+ bus_size_t offset, u_int32_t *addr, size_t count)
+{
+ TODO();
+}
+
+/*
+ * Write the 1, 2, 4, or 8 byte value `value' to bus space
+ * described by tag/handle/offset.
+ */
+
+static void
+rmi_bus_space_write_1(void *tag, bus_space_handle_t handle,
+ bus_size_t offset, u_int8_t value)
+{
+ *(volatile u_int32_t *)(handle + offset) = (u_int32_t)value;
+}
+
+static void
+rmi_bus_space_write_2(void *tag, bus_space_handle_t handle,
+ bus_size_t offset, u_int16_t value)
+{
+ *(volatile u_int32_t *)(handle + offset) = (u_int32_t)value;
+}
+
+static void
+rmi_bus_space_write_4(void *tag, bus_space_handle_t handle,
+ bus_size_t offset, u_int32_t value)
+{
+ *(volatile u_int32_t *)(handle + offset) = value;
+}
+
+
+/*
+ * Write `count' 1, 2, 4, or 8 byte quantities from the buffer
+ * provided to bus space described by tag/handle/offset.
+ */
+
+
+static void
+rmi_bus_space_write_multi_1(void *tag, bus_space_handle_t handle,
+ bus_size_t offset, const u_int8_t *addr, size_t count)
+{
+ TODO();
+}
+
+static void
+rmi_bus_space_write_multi_2(void *tag, bus_space_handle_t handle,
+ bus_size_t offset, const u_int16_t *addr, size_t count)
+{
+ TODO();
+}
+
+static void
+rmi_bus_space_write_multi_4(void *tag, bus_space_handle_t handle,
+ bus_size_t offset, const u_int32_t *addr, size_t count)
+{
+ TODO();
+}
+
+/*
+ * Write `count' 1, 2, 4, or 8 byte value `val' to bus space described
+ * by tag/handle starting at `offset'.
+ */
+
+static void
+rmi_bus_space_set_region_2(void *t, bus_space_handle_t bsh,
+ bus_size_t offset, u_int16_t value, size_t count)
+{
+ bus_addr_t addr = bsh + offset;
+
+ for (; count != 0; count--, addr += 2)
+ (*(volatile u_int32_t *)(addr)) = value;
+}
+
+static void
+rmi_bus_space_set_region_4(void *t, bus_space_handle_t bsh,
+ bus_size_t offset, u_int32_t value, size_t count)
+{
+ bus_addr_t addr = bsh + offset;
+
+ for (; count != 0; count--, addr += 4)
+ (*(volatile u_int32_t *)(addr)) = value;
+}
+
+
+/*
+ * Copy `count' 1, 2, 4, or 8 byte values from bus space starting
+ * at tag/bsh1/off1 to bus space starting at tag/bsh2/off2.
+ */
+static void
+rmi_bus_space_copy_region_2(void *t, bus_space_handle_t bsh1,
+ bus_size_t off1, bus_space_handle_t bsh2,
+ bus_size_t off2, size_t count)
+{
+ printf("bus_space_copy_region_2 - unimplemented\n");
+}
+
+/*
+ * Read `count' 1, 2, 4, or 8 byte quantities from bus space
+ * described by tag/handle/offset and copy into buffer provided.
+ */
+
+u_int8_t
+rmi_bus_space_read_stream_1(void *t, bus_space_handle_t handle,
+ bus_size_t offset)
+{
+
+ return *((volatile u_int8_t *)(handle + offset));
+}
+
+
+static u_int16_t
+rmi_bus_space_read_stream_2(void *t, bus_space_handle_t handle,
+ bus_size_t offset)
+{
+ return *(volatile u_int16_t *)(handle + offset);
+}
+
+
+static u_int32_t
+rmi_bus_space_read_stream_4(void *t, bus_space_handle_t handle,
+ bus_size_t offset)
+{
+ return (*(volatile u_int32_t *)(handle + offset));
+}
+
+
+static void
+rmi_bus_space_read_multi_stream_1(void *tag, bus_space_handle_t handle,
+ bus_size_t offset, u_int8_t *addr, size_t count)
+{
+ TODO();
+}
+
+static void
+rmi_bus_space_read_multi_stream_2(void *tag, bus_space_handle_t handle,
+ bus_size_t offset, u_int16_t *addr, size_t count)
+{
+ TODO();
+}
+
+static void
+rmi_bus_space_read_multi_stream_4(void *tag, bus_space_handle_t handle,
+ bus_size_t offset, u_int32_t *addr, size_t count)
+{
+ TODO();
+}
+
+
+/*
+ * Read `count' 1, 2, 4, or 8 byte quantities from bus space
+ * described by tag/handle and starting at `offset' and copy into
+ * buffer provided.
+ */
+void
+rmi_bus_space_read_region_1(void *t, bus_space_handle_t bsh,
+ bus_size_t offset, u_int8_t *addr, size_t count)
+{
+ TODO();
+}
+
+void
+rmi_bus_space_read_region_2(void *t, bus_space_handle_t bsh,
+ bus_size_t offset, u_int16_t *addr, size_t count)
+{
+ TODO();
+}
+
+void
+rmi_bus_space_read_region_4(void *t, bus_space_handle_t bsh,
+ bus_size_t offset, u_int32_t *addr, size_t count)
+{
+ bus_addr_t baddr = bsh + offset;
+
+ while (count--) {
+ *addr++ = (*(volatile u_int32_t *)(baddr));
+ baddr += 4;
+ }
+}
+
+void
+rmi_bus_space_write_stream_1(void *t, bus_space_handle_t handle,
+ bus_size_t offset, u_int8_t value)
+{
+ TODO();
+}
+
+
+static void
+rmi_bus_space_write_stream_2(void *t, bus_space_handle_t handle,
+ bus_size_t offset, u_int16_t value)
+{
+ TODO();
+}
+
+
+static void
+rmi_bus_space_write_stream_4(void *t, bus_space_handle_t handle,
+ bus_size_t offset, u_int32_t value)
+{
+ TODO();
+}
+
+
+static void
+rmi_bus_space_write_multi_stream_1(void *tag, bus_space_handle_t handle,
+ bus_size_t offset, const u_int8_t *addr, size_t count)
+{
+ TODO();
+}
+
+static void
+rmi_bus_space_write_multi_stream_2(void *tag, bus_space_handle_t handle,
+ bus_size_t offset, const u_int16_t *addr, size_t count)
+{
+ TODO();
+}
+
+static void
+rmi_bus_space_write_multi_stream_4(void *tag, bus_space_handle_t handle,
+ bus_size_t offset, const u_int32_t *addr, size_t count)
+{
+ TODO();
+}
+
+void
+rmi_bus_space_write_region_2(void *t,
+ bus_space_handle_t bsh,
+ bus_size_t offset,
+ const u_int16_t *addr,
+ size_t count)
+{
+ TODO();
+}
+
+void
+rmi_bus_space_write_region_4(void *t, bus_space_handle_t bsh,
+ bus_size_t offset, const u_int32_t *addr, size_t count)
+{
+ TODO();
+}
+
+static void
+rmi_bus_space_barrier(void *tag __unused, bus_space_handle_t bsh __unused,
+ bus_size_t offset __unused, bus_size_t len __unused, int flags)
+{
+}
diff --git a/sys/mips/nlm/clock.h b/sys/mips/nlm/clock.h
new file mode 100644
index 0000000..2135dbf
--- /dev/null
+++ b/sys/mips/nlm/clock.h
@@ -0,0 +1,41 @@
+/*-
+ * Copyright 2003-2011 Netlogic Microsystems (Netlogic). All rights
+ * reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY Netlogic Microsystems ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL NETLOGIC OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+ * THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * $FreeBSD$
+ * NETLOGIC_BSD */
+
+#ifndef _RMI_CLOCK_H_
+#define _RMI_CLOCK_H_
+
+#define XLP_PIC_HZ 133000000U
+#define XLP_CPU_HZ (nlm_cpu_frequency)
+
+void count_compare_clockhandler(struct trapframe *);
+void pic_hardclockhandler(struct trapframe *);
+void pic_timecounthandler(struct trapframe *);
+
+#endif /* _RMI_CLOCK_H_ */
diff --git a/sys/mips/nlm/cms.c b/sys/mips/nlm/cms.c
new file mode 100644
index 0000000..fb03d80
--- /dev/null
+++ b/sys/mips/nlm/cms.c
@@ -0,0 +1,452 @@
+/*-
+ * Copyright 2003-2011 Netlogic Microsystems (Netlogic). All rights
+ * reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY Netlogic Microsystems ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL NETLOGIC OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+ * THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * NETLOGIC_BSD */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+#include <sys/types.h>
+#include <sys/systm.h>
+#include <sys/param.h>
+#include <sys/lock.h>
+#include <sys/mutex.h>
+#include <sys/proc.h>
+#include <sys/limits.h>
+#include <sys/bus.h>
+
+#include <sys/ktr.h>
+#include <sys/kernel.h>
+#include <sys/kthread.h>
+#include <sys/proc.h>
+#include <sys/resourcevar.h>
+#include <sys/sched.h>
+#include <sys/unistd.h>
+#include <sys/sysctl.h>
+#include <sys/malloc.h>
+
+#include <machine/reg.h>
+#include <machine/cpu.h>
+#include <machine/hwfunc.h>
+#include <machine/mips_opcode.h>
+#include <machine/param.h>
+#include <machine/intr_machdep.h>
+
+#include <mips/nlm/hal/mips-extns.h>
+#include <mips/nlm/hal/mmio.h>
+#include <mips/nlm/hal/iomap.h>
+#include <mips/nlm/hal/cop0.h>
+#include <mips/nlm/hal/cop2.h>
+#include <mips/nlm/hal/fmn.h>
+#include <mips/nlm/hal/pic.h>
+
+#include <mips/nlm/msgring.h>
+#include <mips/nlm/interrupt.h>
+#include <mips/nlm/xlp.h>
+#include <mips/nlm/board.h>
+
+#define MSGRNG_NSTATIONS 1024
+/*
+ * Keep track of our message ring handler threads, each core has a
+ * different message station. Ideally we will need to start a few
+ * message handling threads every core, and wake them up depending on
+ * load
+ */
+struct msgring_thread {
+ struct thread *thread; /* msgring handler threads */
+ int needed; /* thread needs to wake up */
+};
+static struct msgring_thread msgring_threads[XLP_MAX_CORES * XLP_MAX_THREADS];
+static struct proc *msgring_proc; /* all threads are under a proc */
+
+/*
+ * The device drivers can register a handler for the the messages sent
+ * from a station (corresponding to the device).
+ */
+struct tx_stn_handler {
+ msgring_handler action;
+ void *arg;
+};
+static struct tx_stn_handler msgmap[MSGRNG_NSTATIONS];
+static struct mtx msgmap_lock;
+uint64_t xlp_cms_base;
+uint32_t xlp_msg_thread_mask;
+static int xlp_msg_threads_per_core = 3; /* Make tunable */
+
+static void create_msgring_thread(int hwtid);
+static int msgring_process_fast_intr(void *arg);
+/*
+ * Boot time init, called only once
+ */
+void
+xlp_msgring_config(void)
+{
+ unsigned int thrmask, mask;
+ int i;
+
+ /* TODO: Add other nodes */
+ xlp_cms_base = nlm_regbase_cms(0);
+
+ mtx_init(&msgmap_lock, "msgring", NULL, MTX_SPIN);
+ if (xlp_threads_per_core < xlp_msg_threads_per_core)
+ xlp_msg_threads_per_core = xlp_threads_per_core;
+ thrmask = ((1 << xlp_msg_threads_per_core) - 1);
+ /*thrmask <<= xlp_threads_per_core - xlp_msg_threads_per_core;*/
+ mask = 0;
+ for (i = 0; i < XLP_MAX_CORES; i++) {
+ mask <<= XLP_MAX_THREADS;
+ mask |= thrmask;
+ }
+ xlp_msg_thread_mask = xlp_hw_thread_mask & mask;
+ printf("Initializing CMS...@%jx, Message handler thread mask %#jx\n",
+ (uintmax_t)xlp_cms_base, (uintmax_t)xlp_msg_thread_mask);
+}
+
+/*
+ * Initialize the messaging subsystem.
+ *
+ * Message Stations are shared among all threads in a cpu core, this
+ * has to be called once from every core which is online.
+ */
+void
+xlp_msgring_iodi_config(void)
+{
+ void *cookie;
+
+ xlp_msgring_config();
+/* nlm_cms_default_setup(0,0,0,0); */
+ nlm_cms_credit_setup(50);
+ create_msgring_thread(0);
+ cpu_establish_hardintr("msgring", msgring_process_fast_intr, NULL,
+ NULL, IRQ_MSGRING, INTR_TYPE_NET, &cookie);
+}
+
+void
+nlm_cms_credit_setup(int credit)
+{
+ int src, qid, i;
+
+#if 0
+ /* there are a total of 18 src stations on XLP. */
+ printf("Setting up CMS credits!\n");
+ for(src=0; src<18; src++) {
+ for(qid=0; qid<1024; qid++) {
+ nlm_cms_setup_credits(xlp_cms_base, qid, src, credit);
+ }
+ }
+#endif
+ printf("Setting up CMS credits!\n");
+ /* CPU Credits */
+ for(i = 1; i < 8; i++) {
+ src = (i << 4);
+ for(qid = 0; qid < 1024; qid++) {
+ nlm_cms_setup_credits(xlp_cms_base, qid, src, credit);
+ }
+ }
+ /* PCIE Credits */
+ for(i = 0; i < 4; i++) {
+ src = (256 + (i * 2));
+ for(qid = 0; qid < 1024; qid++) {
+ nlm_cms_setup_credits(xlp_cms_base, qid, src, credit);
+ }
+ }
+ /* DTE Credits */
+ src = 264;
+ for(qid = 0; qid < 1024; qid++) {
+ nlm_cms_setup_credits(xlp_cms_base, qid, src, credit);
+ }
+ /* RSA Credits */
+ src = 272;
+ for(qid = 0; qid < 1024; qid++) {
+ nlm_cms_setup_credits(xlp_cms_base, qid, src, credit);
+ }
+ /* Crypto Credits */
+ src = 281;
+ for(qid = 0; qid < 1024; qid++) {
+ nlm_cms_setup_credits(xlp_cms_base, qid, src, credit);
+ }
+ /* CMP Credits */
+ src = 298;
+ for(qid = 0; qid < 1024; qid++) {
+ nlm_cms_setup_credits(xlp_cms_base, qid, src, credit);
+ }
+ /* POE Credits */
+ src = 384;
+ for(qid = 0; qid < 1024; qid++) {
+ nlm_cms_setup_credits(xlp_cms_base, qid, src, credit);
+ }
+ /* NAE Credits */
+ src = 476;
+ for(qid = 0; qid < 1024; qid++) {
+ nlm_cms_setup_credits(xlp_cms_base, qid, src, credit);
+ }
+}
+
+void
+xlp_msgring_cpu_init(uint32_t cpuid)
+{
+ int queue,i;
+
+ queue = XLP_CMS_CPU_PUSHQ(0, ((cpuid >> 2) & 0x7), (cpuid & 0x3), 0);
+ /* temp allocate 4 segments to each output queue */
+ nlm_cms_alloc_onchip_q(xlp_cms_base, queue, 4);
+ /* Enable high watermark and non empty interrupt */
+ nlm_cms_per_queue_level_intr(xlp_cms_base, queue,2,0);
+ for(i=0;i<8;i++) {
+ /* temp distribute the credits to all CPU stations */
+ nlm_cms_setup_credits(xlp_cms_base, queue, i * 16, 8);
+ }
+}
+
+void
+xlp_cpu_msgring_handler(int bucket, int size, int code, int stid,
+ struct nlm_fmn_msg *msg, void *data)
+{
+ int i;
+
+ printf("vc:%d srcid:%d size:%d\n",bucket,stid,size);
+ for(i=0;i<size;i++) {
+ printf("msg->msg[%d]:0x%jx ", i, (uintmax_t)msg->msg[i]);
+ }
+ printf("\n");
+}
+
+/*
+ * Drain out max_messages for the buckets set in the bucket mask.
+ * Use max_msgs = 0 to drain out all messages.
+ */
+int
+xlp_handle_msg_vc(int vc, int max_msgs)
+{
+ struct nlm_fmn_msg msg;
+ int i, srcid = 0, size = 0, code = 0;
+ struct tx_stn_handler *he;
+ uint32_t mflags, status;
+
+ for (i = 0; i < max_msgs; i++) {
+ mflags = nlm_fmn_saveflags();
+ status = nlm_fmn_msgrcv(vc, &srcid, &size, &code, &msg);
+ nlm_fmn_restoreflags(mflags);
+ if (status != 0) /* If there is no msg or error */
+ break;
+ if (srcid < 0 && srcid >= 1024) {
+ printf("[%s]: bad src id %d\n", __func__, srcid);
+ continue;
+ }
+ he = &msgmap[srcid];
+ if(he->action != NULL)
+ (he->action)(vc, size, code, srcid, &msg, he->arg);
+#if 0 /* debug */
+ else
+ printf("[%s]: No Handler for message from stn_id=%d,"
+ " vc=%d, size=%d, msg0=%jx, dropping message\n",
+ __func__, srcid, vc, size, (uintmax_t)msg.msg[0]);
+#endif
+ }
+
+ return (i);
+}
+
+static int
+msgring_process_fast_intr(void *arg)
+{
+ struct msgring_thread *mthd;
+ struct thread *td;
+ int cpu;
+
+ cpu = nlm_cpuid();
+ mthd = &msgring_threads[cpu];
+ td = mthd->thread;
+
+ /* clear pending interrupts */
+ nlm_write_c0_eirr(1ULL << IRQ_MSGRING);
+
+ /* wake up the target thread */
+ mthd->needed = 1;
+ thread_lock(td);
+ if (TD_AWAITING_INTR(td)) {
+ TD_CLR_IWAIT(td);
+ sched_add(td, SRQ_INTR);
+ }
+
+ thread_unlock(td);
+ return (FILTER_HANDLED);
+}
+
+u_int fmn_msgcount[32][4];
+u_int fmn_loops[32];
+
+static void
+msgring_process(void * arg)
+{
+ volatile struct msgring_thread *mthd;
+ struct thread *td;
+ uint32_t mflags;
+ int hwtid, vc, handled, nmsgs;
+
+ hwtid = (intptr_t)arg;
+ mthd = &msgring_threads[hwtid];
+ td = mthd->thread;
+ KASSERT(curthread == td,
+ ("%s:msg_ithread and proc linkage out of sync", __func__));
+
+ /* First bind this thread to the right CPU */
+ thread_lock(td);
+ sched_bind(td, xlp_hwtid_to_cpuid[hwtid]);
+ thread_unlock(td);
+
+ if (hwtid != nlm_cpuid())
+ printf("Misscheduled hwtid %d != cpuid %d\n", hwtid, nlm_cpuid());
+ mflags = nlm_fmn_saveflags();
+ nlm_fmn_cpu_init(IRQ_MSGRING, 0, 0, 0, 0, 0);
+ nlm_fmn_restoreflags(mflags);
+
+ /* start processing messages */
+ for( ; ; ) {
+ /*atomic_store_rel_int(&mthd->needed, 0);*/
+
+ /* enable cop2 access */
+ do {
+ handled = 0;
+ for (vc = 0; vc < 4; vc++) {
+ nmsgs = xlp_handle_msg_vc(vc, 1);
+ fmn_msgcount[hwtid][vc] += nmsgs;
+ handled += nmsgs;
+ }
+ } while (handled);
+
+ /* sleep */
+#if 0
+ thread_lock(td);
+ if (mthd->needed) {
+ thread_unlock(td);
+ continue;
+ }
+ sched_class(td, PRI_ITHD);
+ TD_SET_IWAIT(td);
+ mi_switch(SW_VOL, NULL);
+ thread_unlock(td);
+#else
+ pause("wmsg", 1);
+#endif
+ fmn_loops[hwtid]++;
+ }
+}
+
+static void
+create_msgring_thread(int hwtid)
+{
+ struct msgring_thread *mthd;
+ struct thread *td;
+ int error;
+
+ mthd = &msgring_threads[hwtid];
+ error = kproc_kthread_add(msgring_process, (void *)(uintptr_t)hwtid,
+ &msgring_proc, &td, RFSTOPPED, 2, "msgrngproc",
+ "msgthr%d", hwtid);
+ if (error)
+ panic("kproc_kthread_add() failed with %d", error);
+ mthd->thread = td;
+
+ thread_lock(td);
+ sched_class(td, PRI_ITHD);
+ sched_add(td, SRQ_INTR);
+ thread_unlock(td);
+ CTR2(KTR_INTR, "%s: created %s", __func__, td->td_name);
+}
+
+int
+register_msgring_handler(int startb, int endb, msgring_handler action,
+ void *arg)
+{
+ int i;
+
+ printf("Register handler %d-%d %p(%p)\n", startb, endb, action, arg);
+ KASSERT(startb >= 0 && startb <= endb && endb < MSGRNG_NSTATIONS,
+ ("Invalid value for for bucket range %d,%d", startb, endb));
+
+ mtx_lock_spin(&msgmap_lock);
+ for (i = startb; i <= endb; i++) {
+ KASSERT(msgmap[i].action == NULL,
+ ("Bucket %d already used [action %p]", i, msgmap[i].action));
+ msgmap[i].action = action;
+ msgmap[i].arg = arg;
+ }
+ mtx_unlock_spin(&msgmap_lock);
+
+ return (0);
+}
+
+/*
+ * Start message ring processing threads on other CPUs, after SMP start
+ */
+static void
+start_msgring_threads(void *arg)
+{
+ int hwt;
+
+ for (hwt = 1; hwt < XLP_MAX_CORES * XLP_MAX_THREADS; hwt++) {
+ if ((xlp_msg_thread_mask & (1 << hwt)) == 0)
+ continue;
+ create_msgring_thread(hwt);
+ }
+}
+
+SYSINIT(start_msgring_threads, SI_SUB_SMP, SI_ORDER_MIDDLE,
+ start_msgring_threads, NULL);
+
+/*
+ * DEBUG support, XXX: static buffer, not locked
+ */
+static int
+sys_print_debug(SYSCTL_HANDLER_ARGS)
+{
+ int error, nb, i, fs;
+ static char xprintb[4096], *buf;
+
+ buf = xprintb;
+ fs = sizeof(xprintb);
+ nb = snprintf(buf, fs,
+ "\nID vc0 vc1 vc2 vc3 loops\n");
+ buf += nb;
+ fs -= nb;
+ for (i = 0; i < 32; i++) {
+ if ((xlp_hw_thread_mask & (1 << i)) == 0)
+ continue;
+ nb = snprintf(buf, fs,
+ "%2d: %8d %8d %8d %8d %8d\n", i,
+ fmn_msgcount[i][0], fmn_msgcount[i][1],
+ fmn_msgcount[i][2], fmn_msgcount[i][3],
+ fmn_loops[i]);
+ buf += nb;
+ fs -= nb;
+ }
+ error = SYSCTL_OUT(req, xprintb, buf - xprintb);
+ return (error);
+}
+
+SYSCTL_PROC(_debug, OID_AUTO, msgring, CTLTYPE_STRING | CTLFLAG_RD, 0, 0,
+ sys_print_debug, "A", "msgring debug info");
diff --git a/sys/mips/nlm/files.xlp b/sys/mips/nlm/files.xlp
new file mode 100644
index 0000000..ac13845
--- /dev/null
+++ b/sys/mips/nlm/files.xlp
@@ -0,0 +1,12 @@
+# $FreeBSD$
+mips/nlm/hal/fmn.c standard
+mips/nlm/xlp_machdep.c standard
+mips/nlm/intr_machdep.c standard
+mips/nlm/tick.c standard
+mips/nlm/iodi.c standard
+mips/nlm/board.c standard
+mips/nlm/cms.c standard
+mips/nlm/bus_space_rmi.c standard
+mips/nlm/mpreset.S standard
+mips/nlm/uart_bus_xlp_iodi.c optional uart
+mips/nlm/uart_cpu_mips_xlp.c optional uart
diff --git a/sys/mips/nlm/hal/bridge.h b/sys/mips/nlm/hal/bridge.h
new file mode 100644
index 0000000..d91ccd6
--- /dev/null
+++ b/sys/mips/nlm/hal/bridge.h
@@ -0,0 +1,177 @@
+/*-
+ * Copyright 2003-2011 Netlogic Microsystems (Netlogic). All rights
+ * reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY Netlogic Microsystems ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL NETLOGIC OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+ * THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * $FreeBSD$
+ * NETLOGIC_BSD */
+
+#ifndef __NLM_BRIDGE_H__
+#define __NLM_BRIDGE_H__
+
+/**
+* @file_name mio.h
+* @author Netlogic Microsystems
+* @brief Basic definitions of XLP memory and io subsystem
+*/
+
+/* BRIDGE specific registers */
+#define XLP_BRIDGE_MODE_REG 0x40
+#define XLP_BRIDGE_PCI_CFG_BASE_REG 0x41
+#define XLP_BRIDGE_PCI_CFG_LIMIT_REG 0x42
+#define XLP_BRIDGE_PCIE_CFG_BASE_REG 0x43
+#define XLP_BRIDGE_PCIE_CFG_LIMIT_REG 0x44
+#define XLP_BRIDGE_BUSNUM_BAR0_REG 0x45
+#define XLP_BRIDGE_BUSNUM_BAR1_REG 0x46
+#define XLP_BRIDGE_BUSNUM_BAR2_REG 0x47
+#define XLP_BRIDGE_BUSNUM_BAR3_REG 0x48
+#define XLP_BRIDGE_BUSNUM_BAR4_REG 0x49
+#define XLP_BRIDGE_BUSNUM_BAR5_REG 0x4a
+#define XLP_BRIDGE_BUSNUM_BAR6_REG 0x4b
+#define XLP_BRIDGE_FLASH_BAR0_REG 0x4c
+#define XLP_BRIDGE_FLASH_BAR1_REG 0x4d
+#define XLP_BRIDGE_FLASH_BAR2_REG 0x4e
+#define XLP_BRIDGE_FLASH_BAR3_REG 0x4f
+#define XLP_BRIDGE_FLASH_LIMIT0_REG 0x50
+#define XLP_BRIDGE_FLASH_LIMIT1_REG 0x51
+#define XLP_BRIDGE_FLASH_LIMIT2_REG 0x52
+#define XLP_BRIDGE_FLASH_LIMIT3_REG 0x53
+
+#define XLP_BRIDGE_DRAM_BAR_REG(i) (0x54 + (i))
+#define XLP_BRIDGE_DRAM_BAR0_REG 0x54
+#define XLP_BRIDGE_DRAM_BAR1_REG 0x55
+#define XLP_BRIDGE_DRAM_BAR2_REG 0x56
+#define XLP_BRIDGE_DRAM_BAR3_REG 0x57
+#define XLP_BRIDGE_DRAM_BAR4_REG 0x58
+#define XLP_BRIDGE_DRAM_BAR5_REG 0x59
+#define XLP_BRIDGE_DRAM_BAR6_REG 0x5a
+#define XLP_BRIDGE_DRAM_BAR7_REG 0x5b
+
+#define XLP_BRIDGE_DRAM_LIMIT_REG(i) (0x5c + (i))
+#define XLP_BRIDGE_DRAM_LIMIT0_REG 0x5c
+#define XLP_BRIDGE_DRAM_LIMIT1_REG 0x5d
+#define XLP_BRIDGE_DRAM_LIMIT2_REG 0x5e
+#define XLP_BRIDGE_DRAM_LIMIT3_REG 0x5f
+#define XLP_BRIDGE_DRAM_LIMIT4_REG 0x60
+#define XLP_BRIDGE_DRAM_LIMIT5_REG 0x61
+#define XLP_BRIDGE_DRAM_LIMIT6_REG 0x62
+#define XLP_BRIDGE_DRAM_LIMIT7_REG 0x63
+
+#define XLP_BRIDGE_DRAM_NODE_TRANSLN0_REG 0x64
+#define XLP_BRIDGE_DRAM_NODE_TRANSLN1_REG 0x65
+#define XLP_BRIDGE_DRAM_NODE_TRANSLN2_REG 0x66
+#define XLP_BRIDGE_DRAM_NODE_TRANSLN3_REG 0x67
+#define XLP_BRIDGE_DRAM_NODE_TRANSLN4_REG 0x68
+#define XLP_BRIDGE_DRAM_NODE_TRANSLN5_REG 0x69
+#define XLP_BRIDGE_DRAM_NODE_TRANSLN6_REG 0x6a
+#define XLP_BRIDGE_DRAM_NODE_TRANSLN7_REG 0x6b
+#define XLP_BRIDGE_DRAM_CHNL_TRANSLN0_REG 0x6c
+#define XLP_BRIDGE_DRAM_CHNL_TRANSLN1_REG 0x6d
+#define XLP_BRIDGE_DRAM_CHNL_TRANSLN2_REG 0x6e
+#define XLP_BRIDGE_DRAM_CHNL_TRANSLN3_REG 0x6f
+#define XLP_BRIDGE_DRAM_CHNL_TRANSLN4_REG 0x70
+#define XLP_BRIDGE_DRAM_CHNL_TRANSLN5_REG 0x71
+#define XLP_BRIDGE_DRAM_CHNL_TRANSLN6_REG 0x72
+#define XLP_BRIDGE_DRAM_CHNL_TRANSLN7_REG 0x73
+#define XLP_BRIDGE_PCIEMEM_BASE0_REG 0x74
+#define XLP_BRIDGE_PCIEMEM_BASE1_REG 0x75
+#define XLP_BRIDGE_PCIEMEM_BASE2_REG 0x76
+#define XLP_BRIDGE_PCIEMEM_BASE3_REG 0x77
+#define XLP_BRIDGE_PCIEMEM_LIMIT0_REG 0x78
+#define XLP_BRIDGE_PCIEMEM_LIMIT1_REG 0x79
+#define XLP_BRIDGE_PCIEMEM_LIMIT2_REG 0x7a
+#define XLP_BRIDGE_PCIEMEM_LIMIT3_REG 0x7b
+#define XLP_BRIDGE_PCIEIO_BASE0_REG 0x7c
+#define XLP_BRIDGE_PCIEIO_BASE1_REG 0x7d
+#define XLP_BRIDGE_PCIEIO_BASE2_REG 0x7e
+#define XLP_BRIDGE_PCIEIO_BASE3_REG 0x7f
+#define XLP_BRIDGE_PCIEIO_LIMIT0_REG 0x80
+#define XLP_BRIDGE_PCIEIO_LIMIT1_REG 0x81
+#define XLP_BRIDGE_PCIEIO_LIMIT2_REG 0x82
+#define XLP_BRIDGE_PCIEIO_LIMIT3_REG 0x83
+#define XLP_BRIDGE_PCIEMEM_BASE4_REG 0x84
+#define XLP_BRIDGE_PCIEMEM_BASE5_REG 0x85
+#define XLP_BRIDGE_PCIEMEM_BASE6_REG 0x86
+#define XLP_BRIDGE_PCIEMEM_LIMIT4_REG 0x87
+#define XLP_BRIDGE_PCIEMEM_LIMIT5_REG 0x88
+#define XLP_BRIDGE_PCIEMEM_LIMIT6_REG 0x89
+#define XLP_BRIDGE_PCIEIO_BASE4_REG 0x8a
+#define XLP_BRIDGE_PCIEIO_BASE5_REG 0x8b
+#define XLP_BRIDGE_PCIEIO_BASE6_REG 0x8c
+#define XLP_BRIDGE_PCIEIO_LIMIT4_REG 0x8d
+#define XLP_BRIDGE_PCIEIO_LIMIT5_REG 0x8e
+#define XLP_BRIDGE_PCIEIO_LIMIT6_REG 0x8f
+#define XLP_BRIDGE_NBU_EVENT_CNT_CTL_REG 0x90
+#define XLP_BRIDGE_EVNTCTR1_LOW_REG 0x91
+#define XLP_BRIDGE_EVNTCTR1_HI_REG 0x92
+#define XLP_BRIDGE_EVNT_CNT_CTL2_REG 0x93
+#define XLP_BRIDGE_EVNTCTR2_LOW_REG 0x94
+#define XLP_BRIDGE_EVNTCTR2_HI_REG 0x95
+#define XLP_BRIDGE_TRACEBUF_MATCH_REG0 0x96
+#define XLP_BRIDGE_TRACEBUF_MATCH_REG1 0x97
+#define XLP_BRIDGE_TRACEBUF_MATCH_LOW_REG 0x98
+#define XLP_BRIDGE_TRACEBUF_MATCH_HI_REG 0x99
+#define XLP_BRIDGE_TRACEBUF_CTRL_REG 0x9a
+#define XLP_BRIDGE_TRACEBUF_INIT_REG 0x9b
+#define XLP_BRIDGE_TRACEBUF_ACCESS_REG 0x9c
+#define XLP_BRIDGE_TRACEBUF_READ_DATA_REG0 0x9d
+#define XLP_BRIDGE_TRACEBUF_READ_DATA_REG1 0x9d
+#define XLP_BRIDGE_TRACEBUF_READ_DATA_REG2 0x9f
+#define XLP_BRIDGE_TRACEBUF_READ_DATA_REG3 0xa0
+#define XLP_BRIDGE_TRACEBUF_STATUS_REG 0xa1
+#define XLP_BRIDGE_ADDRESS_ERROR0_REG 0xa2
+#define XLP_BRIDGE_ADDRESS_ERROR1_REG 0xa3
+#define XLP_BRIDGE_ADDRESS_ERROR2_REG 0xa4
+#define XLP_BRIDGE_TAG_ECC_ADDR_ERROR0_REG 0xa5
+#define XLP_BRIDGE_TAG_ECC_ADDR_ERROR1_REG 0xa6
+#define XLP_BRIDGE_TAG_ECC_ADDR_ERROR2_REG 0xa7
+#define XLP_BRIDGE_LINE_FLUSH_REG0 0xa8
+#define XLP_BRIDGE_LINE_FLUSH_REG1 0xa9
+#define XLP_BRIDGE_NODE_ID_REG 0xaa
+#define XLP_BRIDGE_ERROR_INTERRUPT_EN_REG 0xab
+#define XLP_BRIDGE_PCIE0_WEIGHT_REG 0x300
+#define XLP_BRIDGE_PCIE1_WEIGHT_REG 0x301
+#define XLP_BRIDGE_PCIE2_WEIGHT_REG 0x302
+#define XLP_BRIDGE_PCIE3_WEIGHT_REG 0x303
+#define XLP_BRIDGE_USB_WEIGHT_REG 0x304
+#define XLP_BRIDGE_NET_WEIGHT_REG 0x305
+#define XLP_BRIDGE_POE_WEIGHT_REG 0x306
+#define XLP_BRIDGE_CMS_WEIGHT_REG 0x307
+#define XLP_BRIDGE_DMAENG_WEIGHT_REG 0x308
+#define XLP_BRIDGE_SEC_WEIGHT_REG 0x309
+#define XLP_BRIDGE_COMP_WEIGHT_REG 0x30a
+#define XLP_BRIDGE_GIO_WEIGHT_REG 0x30b
+#define XLP_BRIDGE_FLASH_WEIGHT_REG 0x30c
+
+#if !defined(LOCORE) && !defined(__ASSEMBLY__)
+
+#define nlm_rdreg_bridge(b, r) nlm_read_reg_kseg(b, r)
+#define nlm_wreg_bridge(b, r, v) nlm_write_reg_kseg(b, r, v)
+#define nlm_pcibase_bridge(node) nlm_pcicfg_base(XLP_IO_BRIDGE_OFFSET(node))
+#define nlm_regbase_bridge(node) nlm_pcibase_bridge(node)
+
+#endif
+
+#endif
diff --git a/sys/mips/nlm/hal/cop0.h b/sys/mips/nlm/hal/cop0.h
new file mode 100644
index 0000000..18ecc97
--- /dev/null
+++ b/sys/mips/nlm/hal/cop0.h
@@ -0,0 +1,280 @@
+/*-
+ * Copyright 2003-2011 Netlogic Microsystems (Netlogic). All rights
+ * reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY Netlogic Microsystems ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL NETLOGIC OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+ * THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * $FreeBSD$
+ * NETLOGIC_BSD */
+
+#ifndef __NLM_COP0_H__
+#define __NLM_COP0_H__
+
+#define NLM_C0_INDEX 0
+#define NLM_C0_RANDOM 1
+#define NLM_C0_ENTRYLO0 2
+#define NLM_C0_ENTRYLO1 3
+#define NLM_C0_CONTEXT 4
+#define NLM_C0_USERLOCAL 4
+#define NLM_C0_PAGEMASK 5
+#define NLM_C0_WIRED 6
+#define NLM_C0_BADVADDR 8
+#define NLM_C0_COUNT 9
+#define NLM_C0_EIRR 9
+#define NLM_C0_EIMR 9
+#define NLM_C0_ENTRYHI 10
+#define NLM_C0_COMPARE 11
+#define NLM_C0_STATUS 12
+#define NLM_C0_INTCTL 12
+#define NLM_C0_SRSCTL 12
+#define NLM_C0_CAUSE 13
+#define NLM_C0_EPC 14
+#define NLM_C0_PRID 15
+#define NLM_C0_EBASE 15
+#define NLM_C0_CONFIG 16
+#define NLM_C0_CONFIG0 16
+#define NLM_C0_CONFIG1 16
+#define NLM_C0_CONFIG2 16
+#define NLM_C0_CONFIG3 16
+#define NLM_C0_CONFIG4 16
+#define NLM_C0_CONFIG5 16
+#define NLM_C0_CONFIG6 16
+#define NLM_C0_CONFIG7 16
+#define NLM_C0_WATCHLO 18
+#define NLM_C0_WATCHHI 19
+#define NLM_C0_XCONTEXT 20
+#define NLM_C0_SCRATCH 22
+#define NLM_C0_SCRATCH0 22
+#define NLM_C0_SCRATCH1 22
+#define NLM_C0_SCRATCH2 22
+#define NLM_C0_SCRATCH3 22
+#define NLM_C0_SCRATCH4 22
+#define NLM_C0_SCRATCH5 22
+#define NLM_C0_SCRATCH6 22
+#define NLM_C0_SCRATCH7 22
+#define NLM_C0_DEBUG 23
+#define NLM_C0_DEPC 24
+#define NLM_C0_PERFCNT 25
+#define NLM_C0_PERFCNT0 25
+#define NLM_C0_PERFCNT1 25
+#define NLM_C0_TAGLO 28
+#define NLM_C0_DATALO 28
+#define NLM_C0_TAGHI 29
+#define NLM_C0_DATAHI 29
+#define NLM_C0_ERROREPC 30
+#define NLM_C0_DESAVE 31
+
+/* cop0 status bits */
+#define NLM_STATUS_CP0_EN (1<<28)
+#define NLM_STATUS_CP1_EN (1<<29)
+#define NLM_STATUS_CP2_EN (1<<30)
+#define NLM_STATUS_KX_EN (1<<7)
+#define NLM_STATUS_UX_EN (1<<5)
+
+#ifndef LOCORE
+
+#define nlm_memory_barrier() \
+ __asm__ __volatile__( \
+ ".set push\n\t" \
+ ".set noreorder\n\t" \
+ " sync\n\t" \
+ ".set pop" \
+ ::: "memory")
+
+#define NLM_DEFINE_ACCESSORS32(name, reg, sel) \
+static __inline__ uint32_t nlm_read_c0_##name(void) \
+{ \
+ uint32_t __rv; \
+ __asm__ __volatile__ ( \
+ ".set push\n" \
+ ".set noreorder\n" \
+ ".set mips64\n" \
+ "mfc0 %0, $%1, %2\n" \
+ ".set pop\n" \
+ : "=r" (__rv) \
+ : "i" (reg), "i" (sel) \
+ ); \
+ return __rv; \
+} \
+ \
+static __inline__ void nlm_write_c0_##name(uint32_t val) \
+{ \
+ __asm__ __volatile__( \
+ ".set push\n" \
+ ".set noreorder\n" \
+ ".set mips64\n" \
+ "mtc0 %0, $%1, %2\n" \
+ ".set pop\n" \
+ :: "r" (val), "i" (reg), "i" (sel) \
+ ); \
+} struct __hack
+
+/* struct __hack above swallows a semicolon - otherwise the macro
+ * usage below cannot have the terminating semicolon */
+#if (__mips == 64)
+#define NLM_DEFINE_ACCESSORS64(name, reg, sel) \
+static __inline__ uint64_t nlm_read_c0_##name(void) \
+{ \
+ uint64_t __rv; \
+ __asm__ __volatile__ ( \
+ ".set push\n" \
+ ".set noreorder\n" \
+ ".set mips64\n" \
+ "dmfc0 %0,$%1,%2\n" \
+ ".set pop\n" \
+ : "=r" (__rv) \
+ : "i" (reg), "i" (sel) ); \
+ return __rv; \
+} \
+ \
+static __inline__ void nlm_write_c0_##name(uint64_t val) \
+{ \
+ __asm__ __volatile__ ( \
+ ".set push\n" \
+ ".set noreorder\n" \
+ ".set mips64\n" \
+ "dmtc0 %0,$%1,%2\n" \
+ ".set pop\n" \
+ :: "r" (val), "i" (reg), "i" (sel) ); \
+} struct __hack
+
+#else
+
+#define NLM_DEFINE_ACCESSORS64(name, reg, sel) \
+static __inline__ uint64_t nlm_read_c0_##name(void) \
+{ \
+ uint32_t __high, __low; \
+ __asm__ __volatile__ ( \
+ ".set push\n" \
+ ".set noreorder\n" \
+ ".set mips64\n" \
+ "dmfc0 $8, $%2, %3\n" \
+ "dsra32 %0, $8, 0\n" \
+ "sll %1, $8, 0\n" \
+ ".set pop\n" \
+ : "=r"(__high), "=r"(__low) \
+ : "i"(reg), "i"(sel) \
+ : "$8" ); \
+ \
+ return (((uint64_t)__high << 32) | __low); \
+} \
+ \
+static __inline__ void nlm_write_c0_##name(uint64_t val) \
+{ \
+ uint32_t __high = val >> 32; \
+ uint32_t __low = val & 0xffffffff; \
+ __asm__ __volatile__ ( \
+ ".set push\n" \
+ ".set noreorder\n" \
+ ".set mips64\n" \
+ "dsll32 $8, %1, 0\n" \
+ "dsll32 $9, %0, 0\n" \
+ "dsrl32 $8, $8, 0\n" \
+ "or $8, $8, $9\n" \
+ "dmtc0 $8, $%2, %3\n" \
+ ".set pop\n" \
+ :: "r"(__high), "r"(__low), "i"(reg), "i"(sel) \
+ : "$8", "$9"); \
+} struct __hack
+
+#endif
+
+NLM_DEFINE_ACCESSORS32(index, 0, 0);
+NLM_DEFINE_ACCESSORS32(random, 1, 0);
+NLM_DEFINE_ACCESSORS64(entrylo0, 2, 0);
+NLM_DEFINE_ACCESSORS64(entrylo1, 3, 0);
+NLM_DEFINE_ACCESSORS64(context, 4, 0);
+NLM_DEFINE_ACCESSORS64(userlocal, 4, 0);
+NLM_DEFINE_ACCESSORS32(pagemask, 5, 0);
+NLM_DEFINE_ACCESSORS32(wired, 6, 0);
+NLM_DEFINE_ACCESSORS64(badvaddr, 8, 0);
+NLM_DEFINE_ACCESSORS32(count, 9, 0);
+NLM_DEFINE_ACCESSORS64(eirr, 9, 6);
+NLM_DEFINE_ACCESSORS64(eimr, 9, 7);
+NLM_DEFINE_ACCESSORS64(entryhi, 10, 0);
+NLM_DEFINE_ACCESSORS32(compare, 11, 0);
+NLM_DEFINE_ACCESSORS32(status, 12, 0);
+NLM_DEFINE_ACCESSORS32(intctl, 12, 1);
+NLM_DEFINE_ACCESSORS32(srsctl, 12, 2);
+NLM_DEFINE_ACCESSORS32(cause, 13, 0);
+NLM_DEFINE_ACCESSORS64(epc, 14, 0);
+NLM_DEFINE_ACCESSORS32(prid, 15, 0);
+NLM_DEFINE_ACCESSORS32(ebase, 15, 1);
+NLM_DEFINE_ACCESSORS32(config0, 16, 0);
+NLM_DEFINE_ACCESSORS32(config1, 16, 1);
+NLM_DEFINE_ACCESSORS32(config2, 16, 2);
+NLM_DEFINE_ACCESSORS32(config3, 16, 3);
+NLM_DEFINE_ACCESSORS32(config6, 16, 6);
+NLM_DEFINE_ACCESSORS32(config7, 16, 7);
+NLM_DEFINE_ACCESSORS64(watchlo0, 18, 0);
+NLM_DEFINE_ACCESSORS32(watchhi0, 19, 0);
+NLM_DEFINE_ACCESSORS64(xcontext, 20, 0);
+NLM_DEFINE_ACCESSORS64(scratch0, 22, 0);
+NLM_DEFINE_ACCESSORS64(scratch1, 22, 1);
+NLM_DEFINE_ACCESSORS64(scratch2, 22, 2);
+NLM_DEFINE_ACCESSORS64(scratch3, 22, 3);
+NLM_DEFINE_ACCESSORS64(scratch4, 22, 4);
+NLM_DEFINE_ACCESSORS64(scratch5, 22, 5);
+NLM_DEFINE_ACCESSORS64(scratch6, 22, 6);
+NLM_DEFINE_ACCESSORS64(scratch7, 22, 7);
+NLM_DEFINE_ACCESSORS32(debug, 23, 0);
+NLM_DEFINE_ACCESSORS32(depc, 24, 0);
+NLM_DEFINE_ACCESSORS32(perfctrl0, 25, 0);
+NLM_DEFINE_ACCESSORS64(perfcntr0, 25, 1);
+NLM_DEFINE_ACCESSORS32(perfctrl1, 25, 2);
+NLM_DEFINE_ACCESSORS64(perfcntr1, 25, 3);
+NLM_DEFINE_ACCESSORS32(perfctrl2, 25, 4);
+NLM_DEFINE_ACCESSORS64(perfcntr2, 25, 5);
+NLM_DEFINE_ACCESSORS32(perfctrl3, 25, 6);
+NLM_DEFINE_ACCESSORS64(perfcntr3, 25, 7);
+NLM_DEFINE_ACCESSORS64(taglo0, 28, 0);
+NLM_DEFINE_ACCESSORS64(taglo2, 28, 2);
+NLM_DEFINE_ACCESSORS64(taghi0, 29, 0);
+NLM_DEFINE_ACCESSORS64(taghi2, 29, 2);
+NLM_DEFINE_ACCESSORS64(errorepc, 30, 0);
+NLM_DEFINE_ACCESSORS64(desave, 31, 0);
+
+static __inline__ int nlm_nodeid(void)
+{
+ return (nlm_read_c0_ebase() >> 5) & 0x3;
+}
+
+static __inline__ int nlm_cpuid(void)
+{
+ return nlm_read_c0_ebase() & 0x1f;
+}
+
+static __inline__ int nlm_threadid(void)
+{
+ return nlm_read_c0_ebase() & 0x3;
+}
+
+static __inline__ int nlm_coreid(void)
+{
+ return (nlm_read_c0_ebase() >> 2) & 0x7;
+}
+
+#endif
+
+#endif
diff --git a/sys/mips/nlm/hal/cop2.h b/sys/mips/nlm/hal/cop2.h
new file mode 100644
index 0000000..062cd9d
--- /dev/null
+++ b/sys/mips/nlm/hal/cop2.h
@@ -0,0 +1,327 @@
+/*-
+ * Copyright 2003-2011 Netlogic Microsystems (Netlogic). All rights
+ * reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY Netlogic Microsystems ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL NETLOGIC OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+ * THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * $FreeBSD$
+ * NETLOGIC_BSD */
+
+#ifndef __NLM_COP2_H__
+#define __NLM_COP2_H__
+
+#define XLP_COP2_TX_BUF_REG 0
+#define XLP_COP2_RX_BUF_REG 1
+#define XLP_COP2_TXMSGSTATUS_REG 2
+#define XLP_COP2_RXMSGSTATUS_REG 3
+#define XLP_COP2_MSGSTATUS1_REG 4
+#define XLP_COP2_MSGCONFIG_REG 5
+#define XLP_COP2_MSGCONFIG1_REG 6
+
+#define CROSSTHR_POPQ_EN 0x01
+#define VC0_POPQ_EN 0x02
+#define VC1_POPQ_EN 0x04
+#define VC2_POPQ_EN 0x08
+#define VC3_POPQ_EN 0x10
+#define ALL_VC_POPQ_EN 0x1E
+#define ALL_VC_CT_POPQ_EN 0x1F
+
+struct nlm_fmn_msg {
+ uint64_t msg[4];
+};
+
+#define NLM_DEFINE_COP2_ACCESSORS32(name, reg, sel) \
+static inline uint32_t nlm_read_c2_##name(void) \
+{ \
+ uint32_t __rv; \
+ __asm__ __volatile__ ( \
+ ".set push\n" \
+ ".set noreorder\n" \
+ ".set mips64\n" \
+ "mfc2 %0, $%1, %2\n" \
+ ".set pop\n" \
+ : "=r" (__rv) \
+ : "i" (reg), "i" (sel) \
+ ); \
+ return __rv; \
+} \
+ \
+static inline void nlm_write_c2_##name(uint32_t val) \
+{ \
+ __asm__ __volatile__( \
+ ".set push\n" \
+ ".set noreorder\n" \
+ ".set mips64\n" \
+ "mtc2 %0, $%1, %2\n" \
+ ".set pop\n" \
+ :: "r" (val), "i" (reg), "i" (sel) \
+ ); \
+} struct __hack
+
+#if (__mips == 64)
+#define NLM_DEFINE_COP2_ACCESSORS64(name, reg, sel) \
+static inline uint64_t nlm_read_c2_##name(void) \
+{ \
+ uint64_t __rv; \
+ __asm__ __volatile__ ( \
+ ".set push\n" \
+ ".set noreorder\n" \
+ ".set mips64\n" \
+ "dmfc2 %0, $%1, %2\n" \
+ ".set pop\n" \
+ : "=r" (__rv) \
+ : "i" (reg), "i" (sel) ); \
+ return __rv; \
+} \
+ \
+static inline void nlm_write_c2_##name(uint64_t val) \
+{ \
+ __asm__ __volatile__ ( \
+ ".set push\n" \
+ ".set noreorder\n" \
+ ".set mips64\n" \
+ "dmtc2 %0, $%1, %2\n" \
+ ".set pop\n" \
+ :: "r" (val), "i" (reg), "i" (sel) ); \
+} struct __hack
+
+#else
+
+#define NLM_DEFINE_COP2_ACCESSORS64(name, reg, sel) \
+static inline uint64_t nlm_read_c2_##name(void) \
+{ \
+ uint32_t __high, __low; \
+ __asm__ __volatile__ ( \
+ ".set push\n" \
+ ".set noreorder\n" \
+ ".set mips64\n" \
+ "dmfc2 $8, $%2, %3\n" \
+ "dsra32 %0, $8, 0\n" \
+ "sll %1, $8, 0\n" \
+ ".set pop\n" \
+ : "=r"(__high), "=r"(__low) \
+ : "i"(reg), "i"(sel) \
+ : "$8" ); \
+ \
+ return (((uint64_t)__high << 32) | __low); \
+} \
+ \
+static inline void nlm_write_c2_##name(uint64_t val) \
+{ \
+ uint32_t __high = val >> 32; \
+ uint32_t __low = val & 0xffffffff; \
+ __asm__ __volatile__ ( \
+ ".set push\n" \
+ ".set noreorder\n" \
+ ".set mips64\n" \
+ "dsll32 $8, %1, 0\n" \
+ "dsll32 $9, %0, 0\n" \
+ "dsrl32 $8, $8, 0\n" \
+ "or $8, $8, $9\n" \
+ "dmtc2 $8, $%2, %3\n" \
+ ".set pop\n" \
+ :: "r"(__high), "r"(__low), "i"(reg), "i"(sel) \
+ :"$8", "$9"); \
+} struct __hack
+
+#endif
+
+NLM_DEFINE_COP2_ACCESSORS64(txbuf0, XLP_COP2_TX_BUF_REG, 0);
+NLM_DEFINE_COP2_ACCESSORS64(txbuf1, XLP_COP2_TX_BUF_REG, 1);
+NLM_DEFINE_COP2_ACCESSORS64(txbuf2, XLP_COP2_TX_BUF_REG, 2);
+NLM_DEFINE_COP2_ACCESSORS64(txbuf3, XLP_COP2_TX_BUF_REG, 3);
+
+NLM_DEFINE_COP2_ACCESSORS64(rxbuf0, XLP_COP2_RX_BUF_REG, 0);
+NLM_DEFINE_COP2_ACCESSORS64(rxbuf1, XLP_COP2_RX_BUF_REG, 1);
+NLM_DEFINE_COP2_ACCESSORS64(rxbuf2, XLP_COP2_RX_BUF_REG, 2);
+NLM_DEFINE_COP2_ACCESSORS64(rxbuf3, XLP_COP2_RX_BUF_REG, 3);
+
+NLM_DEFINE_COP2_ACCESSORS32(txmsgstatus, XLP_COP2_TXMSGSTATUS_REG, 0);
+NLM_DEFINE_COP2_ACCESSORS32(rxmsgstatus, XLP_COP2_RXMSGSTATUS_REG, 0);
+NLM_DEFINE_COP2_ACCESSORS32(msgstatus1, XLP_COP2_MSGSTATUS1_REG, 0);
+NLM_DEFINE_COP2_ACCESSORS32(msgconfig, XLP_COP2_MSGCONFIG_REG, 0);
+NLM_DEFINE_COP2_ACCESSORS32(msgconfig1, XLP_COP2_MSGCONFIG1_REG, 0);
+
+/* successful completion returns 1, else 0 */
+static __inline__ int nlm_msgsend(int val)
+{
+ int result;
+ __asm__ volatile (
+ ".set push \n"
+ ".set noreorder \n"
+ ".set mips64 \n"
+ "move $8, %1 \n"
+ "sync \n"
+ "/* msgsnds $9, $8 */ \n"
+ ".word 0x4a084801 \n"
+ "move %0, $9 \n"
+ ".set pop \n"
+ : "=r" (result)
+ : "r" (val)
+ : "$8", "$9"
+ );
+ return result;
+}
+
+static __inline__ int nlm_msgld(int vc)
+{
+ int val;
+ __asm__ volatile (
+ ".set push \n"
+ ".set noreorder \n"
+ ".set mips64 \n"
+ "move $8, %1 \n"
+ "/* msgld $9, $8 */ \n"
+ ".word 0x4a084802 \n"
+ "move %0, $9 \n"
+ ".set pop \n"
+ : "=r" (val)
+ : "r" (vc)
+ : "$8", "$9"
+ );
+ return val;
+}
+
+static __inline__ void nlm_msgwait(int vc)
+{
+ __asm__ volatile (
+ ".set push \n"
+ ".set noreorder \n"
+ ".set mips64 \n"
+ "move $8, %0 \n"
+ "/* msgwait $8 */ \n"
+ ".word 0x4a080003 \n"
+ ".set pop \n"
+ :: "r" (vc)
+ : "$8"
+ );
+}
+
+/* TODO this is not needed in n32 and n64 */
+static __inline uint32_t
+nlm_fmn_saveflags(void)
+{
+ uint32_t sr = mips_rd_status();
+
+ mips_wr_status((sr & ~MIPS_SR_INT_IE) | MIPS_SR_COP_2_BIT);
+ return (sr);
+}
+
+static __inline void
+nlm_fmn_restoreflags(uint32_t sr)
+{
+
+ mips_wr_status(sr);
+}
+
+static __inline__ int nlm_fmn_msgsend(int dstid, int size, int swcode,
+ struct nlm_fmn_msg *m)
+{
+ uint32_t flags, status;
+ int rv;
+
+ size -= 1;
+ flags = nlm_fmn_saveflags();
+ switch(size) {
+ case 3: nlm_write_c2_txbuf3(m->msg[3]);
+ case 2: nlm_write_c2_txbuf2(m->msg[2]);
+ case 1: nlm_write_c2_txbuf1(m->msg[1]);
+ case 0: nlm_write_c2_txbuf0(m->msg[0]);
+ }
+
+ dstid |= ((swcode << 24) | (size << 16));
+ status = nlm_msgsend(dstid);
+ rv = !status;
+ if (rv != 0)
+ rv = nlm_read_c2_txmsgstatus();
+ nlm_fmn_restoreflags(flags);
+
+ return (rv);
+}
+
+static __inline__ int nlm_fmn_msgrcv(int vc, int *srcid, int *size, int *code,
+ struct nlm_fmn_msg *m)
+{
+ uint32_t status;
+ uint32_t msg_status, flags;
+ int tmp_sz, rv;
+
+ flags = nlm_fmn_saveflags();
+ status = nlm_msgld(vc); /* will return 0, if error */
+ rv = !status;
+ if (rv == 0) {
+ msg_status = nlm_read_c2_rxmsgstatus();
+ *size = ((msg_status >> 26) & 0x3) + 1;
+ *code = (msg_status >> 18) & 0xff;
+ *srcid = (msg_status >> 4) & 0xfff;
+ tmp_sz = *size - 1;
+ switch(tmp_sz) {
+ case 3: m->msg[3] = nlm_read_c2_rxbuf3();
+ case 2: m->msg[2] = nlm_read_c2_rxbuf2();
+ case 1: m->msg[1] = nlm_read_c2_rxbuf1();
+ case 0: m->msg[0] = nlm_read_c2_rxbuf0();
+ }
+ }
+ nlm_fmn_restoreflags(flags);
+
+ return rv;
+}
+
+/**
+ * nlm_fmn_cpu_init() initializes the per-h/w thread cop2 w.r.t the following
+ * configuration parameters. It needs to be individually setup on each
+ * hardware thread.
+ *
+ * int_vec - interrupt vector getting placed into msgconfig reg
+ * ctpe - cross thread message pop enable. When set to 1, the thread (h/w cpu)
+ * associated where this cop2 register is setup, can pop messages
+ * intended for any other thread in the same core.
+ * v0pe - VC0 pop message request mode enable. When set to 1, the thread
+ * can send pop requests to vc0.
+ * v1pe - VC1 pop message request mode enable. When set to 1, the thread
+ * can send pop requests to vc1.
+ * v2pe - VC2 pop message request mode enable. When set to 1, the thread
+ * can send pop requests to vc2.
+ * v3pe - VC3 pop message request mode enable. When set to 1, the thread
+ * can send pop requests to vc3.
+ */
+static __inline__ void nlm_fmn_cpu_init(int int_vec, int ctpe, int v0pe,
+ int v1pe, int v2pe, int v3pe)
+{
+ uint32_t val = nlm_read_c2_msgconfig();
+
+ /* Note: in XLP PRM 0.8.1, the int_vec bits are un-documented
+ * in msgconfig register of cop2.
+ * As per chip/cpu RTL, [16:20] bits consist of int_vec.
+ */
+ val |= ((int_vec & 0x1f) << 16) |
+ ((v3pe & 0x1) << 4) |
+ ((v2pe & 0x1) << 3) |
+ ((v1pe & 0x1) << 2) |
+ ((v0pe & 0x1) << 1) |
+ (ctpe & 0x1);
+
+ nlm_write_c2_msgconfig(val);
+}
+#endif
diff --git a/sys/mips/nlm/hal/cpucontrol.h b/sys/mips/nlm/hal/cpucontrol.h
new file mode 100644
index 0000000..0bc0f5b
--- /dev/null
+++ b/sys/mips/nlm/hal/cpucontrol.h
@@ -0,0 +1,70 @@
+/*-
+ * Copyright 2003-2011 Netlogic Microsystems (Netlogic). All rights
+ * reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY Netlogic Microsystems ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL NETLOGIC OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+ * THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * $FreeBSD$
+ * NETLOGIC_BSD */
+
+#ifndef __NLM_CPUCONTROL_H__
+#define __NLM_CPUCONTROL_H__
+
+#define XLP_CPU_BLOCKID_IFU 0
+#define XLP_CPU_BLOCKID_ICU 1
+
+#define XLP_CPU_BLOCKID_IEU 2
+#define XLP_CPU_BLOCKID_LSU 3
+#define XLP_LSU_DEFEATURE 0x304
+#define XLP_LSU_CERRLOG_REGID 0x09
+
+#define XLP_CPU_BLOCKID_MMU 4
+#define XLP_CPU_BLOCKID_PRF 5
+
+#define XLP_CPU_BLOCKID_SCH 7
+#define XLP_SCHED_DEFEATURE 0x700
+
+#define XLP_CPU_BLOCKID_SCU 8
+#define XLP_CPU_BLOCKID_FPU 9
+
+#define XLP_CPU_BLOCKID_MAP 10
+
+/* Offsets of interest from the 'MAP' Block */
+#define XLP_BLKID_MAP_THREADMODE 0x00
+#define XLP_BLKID_MAP_EXT_EBASE_ENABLE 0x04
+#define XLP_BLKID_MAP_CCDI_CONFIG 0x08
+#define XLP_BLKID_MAP_THRD0_CCDI_STATUS 0x0c
+#define XLP_BLKID_MAP_THRD1_CCDI_STATUS 0x10
+#define XLP_BLKID_MAP_THRD2_CCDI_STATUS 0x14
+#define XLP_BLKID_MAP_THRD3_CCDI_STATUS 0x18
+#define XLP_BLKID_MAP_THRD0_DEBUG_MODE 0x1c
+#define XLP_BLKID_MAP_THRD1_DEBUG_MODE 0x20
+#define XLP_BLKID_MAP_THRD2_DEBUG_MODE 0x24
+#define XLP_BLKID_MAP_THRD3_DEBUG_MODE 0x28
+#define XLP_BLKID_MAP_MISC_STATE 0x60
+#define XLP_BLKID_MAP_DEBUG_READ_CTL 0x64
+#define XLP_BLKID_MAP_DEBUG_READ_REG0 0x68
+#define XLP_BLKID_MAP_DEBUG_READ_REG1 0x6c
+
+#endif /* __NLM_CPUCONTROL_H__ */
diff --git a/sys/mips/nlm/hal/fmn.c b/sys/mips/nlm/hal/fmn.c
new file mode 100644
index 0000000..fd4f7c8
--- /dev/null
+++ b/sys/mips/nlm/hal/fmn.c
@@ -0,0 +1,789 @@
+/*-
+ * Copyright 2003-2011 Netlogic Microsystems (Netlogic). All rights
+ * reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY Netlogic Microsystems ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL NETLOGIC OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+ * THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * $FreeBSD$
+ * NETLOGIC_BSD */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+#include <sys/types.h>
+#include <mips/nlm/hal/mips-extns.h>
+#include <mips/nlm/hal/mmio.h>
+#include <mips/nlm/hal/iomap.h>
+#include <mips/nlm/hal/fmn.h>
+#include <sys/systm.h>
+
+uint32_t bad_xlp_num_nodes = 4;
+/* XLP can take upto 16K of FMN messages per hardware queue, as spill.
+* But, configuring all 16K causes the total spill memory to required
+* to blow upto 192MB for single chip configuration, and 768MB in four
+* chip configuration. Hence for now, we will setup the per queue spill
+* as 1K FMN messages. With this, the total spill memory needed for 1024
+* hardware queues (with 12bytes per single entry FMN message) becomes
+* (1*1024)*12*1024queues = 12MB. For the four chip config, the memory
+* needed = 12 * 4 = 48MB.
+*/
+uint64_t nlm_cms_spill_total_messages = 1 * 1024;
+
+/* On a XLP832, we have the following FMN stations:
+* CPU stations: 8
+* PCIE0 stations: 1
+* PCIE1 stations: 1
+* PCIE2 stations: 1
+* PCIE3 stations: 1
+* GDX stations: 1
+* CRYPTO stations: 1
+* RSA stations: 1
+* CMP stations: 1
+* POE stations: 1
+* NAE stations: 1
+* ==================
+* Total : 18 stations per chip
+*
+* For all 4 nodes, there are 18*4 = 72 FMN stations
+*/
+uint32_t nlm_cms_total_stations = 18 * 4 /*xlp_num_nodes*/;
+uint32_t cms_onchip_seg_availability[XLP_CMS_ON_CHIP_PER_QUEUE_SPACE];
+
+int nlm_cms_verify_credit_config (int spill_en, int tot_credit)
+{
+ /* Note: In XLP there seem to be no mechanism to read back
+ * the credit count that has been programmed into a sid / did pair;
+ * since we have only one register 0x2000 to read.
+ * Hence it looks like all credit mgmt/verification needs to
+ * be done by software. Software could keep track of total credits
+ * getting programmed and verify it from this function.
+ */
+
+ if (spill_en) {
+ /* TODO */
+ }
+
+ if (tot_credit > (XLP_CMS_ON_CHIP_MESG_SPACE*bad_xlp_num_nodes))
+ return 1; /* credits overflowed - should not happen */
+
+ return 0;
+}
+
+/**
+ * Takes inputs as node, queue_size and maximum number of queues.
+ * Calculates the base, start & end and returns the same for a
+ * defined qid.
+ *
+ * The output queues are maintained in the internal output buffer
+ * which is a on-chip SRAM structure. For the actial hardware
+ * internal implementation, It is a structure which consists
+ * of eight banks of 4096-entry x message-width SRAMs. The SRAM
+ * implementation is designed to run at 1GHz with a 1-cycle read/write
+ * access. A read/write transaction can be initiated for each bank
+ * every cycle for a total of eight accesses per cycle. Successive
+ * entries of the same output queue are placed in successive banks.
+ * This is done to spread different read & write accesses to same/different
+ * output queue over as many different banks as possible so that they
+ * can be scheduled concurrently. Spreading the accesses to as many banks
+ * as possible to maximize the concurrency internally is important for
+ * achieving the desired peak throughput. This is done by h/w implementation
+ * itself.
+ *
+ * Output queues are allocated from this internal output buffer by
+ * software. The total capacity of the output buffer is 32K-entry.
+ * Each output queue can be sized from 32-entry to 1024-entry in
+ * increments of 32-entry. This is done by specifying a Start & a
+ * End pointer: pointers to the first & last 32-entry chunks allocated
+ * to the output queue.
+ *
+ * To optimize the storage required for 1024 OQ pointers, the upper 5-bits
+ * are shared by the Start & the End pointer. The side-effect of this
+ * optimization is that an OQ can't cross a 1024-entry boundary. Also, the
+ * lower 5-bits don't need to be specified in the Start & the End pointer
+ * as the allocation is in increments of 32-entries.
+ *
+ * Queue occupancy is tracked by a Head & a Tail pointer. Tail pointer
+ * indicates the location to which next entry will be written & Head
+ * pointer indicates the location from which next entry will be read. When
+ * these pointers reach the top of the allocated space (indicated by the
+ * End pointer), they are reset to the bottom of the allocated space
+ * (indicated by the Start pointer).
+ *
+ * Output queue pointer information:
+ * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ *
+ * 14 10 9 5 4 0
+ * ------------------
+ * | base ptr |
+ * ------------------
+ * ----------------
+ * | start ptr |
+ * ----------------
+ * ----------------
+ * | end ptr |
+ * ----------------
+ * ------------------------------------
+ * | head ptr |
+ * ------------------------------------
+ * ------------------------------------
+ * | tail ptr |
+ * ------------------------------------
+ * Note:
+ * A total of 1024 segments can sit on one software-visible "bank"
+ * of internal SRAM. Each segment contains 32 entries. Also note
+ * that sw-visible "banks" are not the same as the actual internal
+ * 8-bank implementation of hardware. It is an optimization of
+ * internal access.
+ *
+ */
+
+void nlm_cms_setup_credits(uint64_t base, int destid, int srcid, int credit)
+{
+ uint32_t val;
+
+ val = ((credit << 24) | (destid << 12) | (srcid << 0));
+ nlm_wreg_cms(base, XLP_CMS_OUTPUTQ_CREDIT_CFG_REG, val);
+
+}
+
+int nlm_cms_config_onchip_queue (uint64_t base, uint64_t spill_base,
+ int qid, int spill_en)
+{
+
+ /* Configure 32 as onchip queue depth */
+ nlm_cms_alloc_onchip_q(base, qid, 1);
+
+ /* Spill configuration */
+ if (spill_en) {
+ /* Configure 4*4KB = 16K as spill size */
+ nlm_cms_alloc_spill_q(base, qid, spill_base, 4);
+ }
+
+#if 0
+ /* configure credits for src cpu0, on this queue */
+ nlm_cms_setup_credits(base, qid, XLP_CMS_CPU0_SRC_STID,
+ XLP_CMS_DEFAULT_CREDIT(nlm_cms_total_stations,
+ nlm_cms_spill_total_messages));
+
+ /* configure credits for src cpu1, on this queue */
+ nlm_cms_setup_credits(base, qid, XLP_CMS_CPU1_SRC_STID,
+ XLP_CMS_DEFAULT_CREDIT(nlm_cms_total_stations,
+ nlm_cms_spill_total_messages));
+
+ /* configure credits for src cpu2, on this queue */
+ nlm_cms_setup_credits(base, qid, XLP_CMS_CPU2_SRC_STID,
+ XLP_CMS_DEFAULT_CREDIT(nlm_cms_total_stations,
+ nlm_cms_spill_total_messages));
+
+ /* configure credits for src cpu3, on this queue */
+ nlm_cms_setup_credits(base, qid, XLP_CMS_CPU3_SRC_STID,
+ XLP_CMS_DEFAULT_CREDIT(nlm_cms_total_stations,
+ nlm_cms_spill_total_messages));
+
+ /* configure credits for src cpu4, on this queue */
+ nlm_cms_setup_credits(base, qid, XLP_CMS_CPU4_SRC_STID,
+ XLP_CMS_DEFAULT_CREDIT(nlm_cms_total_stations,
+ nlm_cms_spill_total_messages));
+
+ /* configure credits for src cpu5, on this queue */
+ nlm_cms_setup_credits(base, qid, XLP_CMS_CPU5_SRC_STID,
+ XLP_CMS_DEFAULT_CREDIT(nlm_cms_total_stations,
+ nlm_cms_spill_total_messages));
+
+ /* configure credits for src cpu6, on this queue */
+ nlm_cms_setup_credits(base, qid, XLP_CMS_CPU6_SRC_STID,
+ XLP_CMS_DEFAULT_CREDIT(nlm_cms_total_stations,
+ nlm_cms_spill_total_messages));
+
+ /* configure credits for src cpu7, on this queue */
+ nlm_cms_setup_credits(base, qid, XLP_CMS_CPU7_SRC_STID,
+ XLP_CMS_DEFAULT_CREDIT(nlm_cms_total_stations,
+ nlm_cms_spill_total_messages));
+
+ /* configure credits for src pcie0, on this queue */
+ nlm_cms_setup_credits(base, qid, XLP_CMS_PCIE0_SRC_STID,
+ XLP_CMS_DEFAULT_CREDIT(nlm_cms_total_stations,
+ nlm_cms_spill_total_messages));
+
+ /* configure credits for src pcie1, on this queue */
+ nlm_cms_setup_credits(base, qid, XLP_CMS_PCIE1_SRC_STID,
+ XLP_CMS_DEFAULT_CREDIT(nlm_cms_total_stations,
+ nlm_cms_spill_total_messages));
+
+ /* configure credits for src pcie2, on this queue */
+ nlm_cms_setup_credits(base, qid, XLP_CMS_PCIE2_SRC_STID,
+ XLP_CMS_DEFAULT_CREDIT(nlm_cms_total_stations,
+ nlm_cms_spill_total_messages));
+
+ /* configure credits for src pcie3, on this queue */
+ nlm_cms_setup_credits(base, qid, XLP_CMS_PCIE3_SRC_STID,
+ XLP_CMS_DEFAULT_CREDIT(nlm_cms_total_stations,
+ nlm_cms_spill_total_messages));
+
+ /* configure credits for src dte, on this queue */
+ nlm_cms_setup_credits(base, qid, XLP_CMS_DTE_SRC_STID,
+ XLP_CMS_DEFAULT_CREDIT(nlm_cms_total_stations,
+ nlm_cms_spill_total_messages));
+
+ /* configure credits for src rsa_ecc, on this queue */
+ nlm_cms_setup_credits(base, qid, XLP_CMS_RSA_ECC_SRC_STID,
+ XLP_CMS_DEFAULT_CREDIT(nlm_cms_total_stations,
+ nlm_cms_spill_total_messages));
+
+ /* configure credits for src crypto, on this queue */
+ nlm_cms_setup_credits(base, qid, XLP_CMS_CRYPTO_SRC_STID,
+ XLP_CMS_DEFAULT_CREDIT(nlm_cms_total_stations,
+ nlm_cms_spill_total_messages));
+
+ /* configure credits for src cmp, on this queue */
+ nlm_cms_setup_credits(base, qid, XLP_CMS_CMP_SRC_STID,
+ XLP_CMS_DEFAULT_CREDIT(nlm_cms_total_stations,
+ nlm_cms_spill_total_messages));
+
+ /* configure credits for src poe, on this queue */
+ nlm_cms_setup_credits(base, qid, XLP_CMS_POE_SRC_STID,
+ XLP_CMS_DEFAULT_CREDIT(nlm_cms_total_stations,
+ nlm_cms_spill_total_messages));
+
+ /* configure credits for src nae, on this queue */
+ nlm_cms_setup_credits(base, qid, XLP_CMS_NAE_SRC_STID,
+ XLP_CMS_DEFAULT_CREDIT(nlm_cms_total_stations,
+ nlm_cms_spill_total_messages));
+#endif
+
+ return 0;
+}
+
+/*
+ * base - CMS module base address for this node.
+ * qid - is the output queue id otherwise called as vc id
+ * spill_base - is the 40-bit physical address of spill memory. Must be
+ 4KB aligned.
+ * nsegs - No of segments where a "1" indicates 4KB. Spill size must be
+ * a multiple of 4KB.
+ */
+int nlm_cms_alloc_spill_q(uint64_t base, int qid, uint64_t spill_base,
+ int nsegs)
+{
+ uint64_t queue_config;
+ uint32_t spill_start;
+
+ if(nsegs > XLP_CMS_MAX_SPILL_SEGMENTS_PER_QUEUE) {
+ return 1;
+ }
+
+ queue_config = nlm_rdreg_cms(base,(XLP_CMS_OUTPUTQ_CONFIG_REG(qid)));
+
+ spill_start = ((spill_base >> 12) & 0x3F);
+ /* Spill configuration */
+ queue_config = (((uint64_t)XLP_CMS_SPILL_ENA << 62) |
+ (((spill_base >> 18) & 0x3FFFFF) << 27) |
+ (spill_start + nsegs - 1) << 21 |
+ (spill_start << 15));
+
+ nlm_wreg_cms(base,(XLP_CMS_OUTPUTQ_CONFIG_REG(qid)),queue_config);
+
+ return 0;
+}
+
+/*
+ * base - CMS module base address for this node.
+ * qid - is the output queue id otherwise called as vc id
+ * nsegs - No of segments where a "1" indicates 32 credits. On chip
+ * credits must be a multiple of 32.
+ */
+int nlm_cms_alloc_onchip_q(uint64_t base, int qid, int nsegs)
+{
+ static uint32_t curr_end = 0;
+ uint64_t queue_config;
+ int onchipbase, start, last;
+ uint8_t i;
+
+ if( ((curr_end + nsegs) > XLP_CMS_MAX_ONCHIP_SEGMENTS) ||
+ (nsegs > XLP_CMS_ON_CHIP_PER_QUEUE_SPACE) ) {
+ /* Invalid configuration */
+ return 1;
+ }
+ if(((curr_end % 32) + nsegs - 1) <= 31) {
+ onchipbase = (curr_end / 32);
+ start = (curr_end % 32);
+ curr_end += nsegs;
+ } else {
+ onchipbase = (curr_end / 32) + 1;
+ start = 0;
+ curr_end = ((onchipbase * 32) + nsegs);
+ }
+ last = start + nsegs - 1;
+
+ for(i = start;i <= last;i++) {
+ if(cms_onchip_seg_availability[onchipbase] & (1 << i)) {
+ /* Conflict!!! segment is already allocated */
+ return 1;
+ }
+ }
+ /* Update the availability bitmap as consumed */
+ for(i = start; i <= last; i++) {
+ cms_onchip_seg_availability[onchipbase] |= (1 << i);
+ }
+
+ queue_config = nlm_rdreg_cms(base,(XLP_CMS_OUTPUTQ_CONFIG_REG(qid)));
+
+ /* On chip configuration */
+ queue_config = (((uint64_t)XLP_CMS_QUEUE_ENA << 63) |
+ ((onchipbase & 0x1f) << 10) |
+ ((last & 0x1f) << 5) |
+ (start & 0x1f));
+
+ nlm_wreg_cms(base,(XLP_CMS_OUTPUTQ_CONFIG_REG(qid)),queue_config);
+
+ return 0;
+}
+
+void nlm_cms_default_setup(int node, uint64_t spill_base, int spill_en,
+ int popq_en)
+{
+ int j, k, vc;
+ int queue;
+ uint64_t base;
+
+ base = nlm_regbase_cms(node);
+ for(j=0; j<1024; j++) {
+ printf("Qid:0x%04d Val:0x%016jx\n",j, (uintmax_t)nlm_cms_get_onchip_queue (base, j));
+ }
+ /* Enable all cpu push queues */
+ for (j=0; j<XLP_MAX_CORES; j++)
+ for (k=0; k<XLP_MAX_THREADS; k++)
+ for (vc=0; vc<XLP_CMS_MAX_VCPU_VC; vc++) {
+ /* TODO : remove this once SMP works */
+ if( (j == 0) && (k == 0) )
+ continue;
+ queue = XLP_CMS_CPU_PUSHQ(node, j, k, vc);
+ nlm_cms_config_onchip_queue(base, spill_base, queue, spill_en);
+ }
+
+ /* Enable pcie 0 push queue */
+ for (j=XLP_CMS_PCIE0_QID(0); j<XLP_CMS_PCIE0_MAXQID; j++) {
+ queue = XLP_CMS_IO_PUSHQ(node, j);
+ nlm_cms_config_onchip_queue(base, spill_base, queue, spill_en);
+ }
+
+ /* Enable pcie 1 push queue */
+ for (j=XLP_CMS_PCIE1_QID(0); j<XLP_CMS_PCIE1_MAXQID; j++) {
+ queue = XLP_CMS_IO_PUSHQ(node, j);
+ nlm_cms_config_onchip_queue(base, spill_base, queue, spill_en);
+ }
+
+ /* Enable pcie 2 push queue */
+ for (j=XLP_CMS_PCIE2_QID(0); j<XLP_CMS_PCIE2_MAXQID; j++) {
+ queue = XLP_CMS_IO_PUSHQ(node, j);
+ nlm_cms_config_onchip_queue(base, spill_base, queue, spill_en);
+ }
+
+ /* Enable pcie 3 push queue */
+ for (j=XLP_CMS_PCIE3_QID(0); j<XLP_CMS_PCIE3_MAXQID; j++) {
+ queue = XLP_CMS_IO_PUSHQ(node, j);
+ nlm_cms_config_onchip_queue(base, spill_base, queue, spill_en);
+ }
+
+ /* Enable DTE push queue */
+ for (j=XLP_CMS_DTE_QID(0); j<XLP_CMS_DTE_MAXQID; j++) {
+ queue = XLP_CMS_IO_PUSHQ(node, j);
+ nlm_cms_config_onchip_queue(base, spill_base, queue, spill_en);
+ }
+
+ /* Enable RSA/ECC push queue */
+ for (j=XLP_CMS_RSA_ECC_QID(0); j<XLP_CMS_RSA_ECC_MAXQID; j++) {
+ queue = XLP_CMS_IO_PUSHQ(node, j);
+ nlm_cms_config_onchip_queue(base, spill_base, queue, spill_en);
+ }
+
+ /* Enable crypto push queue */
+ for (j=XLP_CMS_CRYPTO_QID(0); j<XLP_CMS_CRYPTO_MAXQID; j++) {
+ queue = XLP_CMS_IO_PUSHQ(node, j);
+ nlm_cms_config_onchip_queue(base, spill_base, queue, spill_en);
+ }
+
+ /* Enable CMP push queue */
+ for (j=XLP_CMS_CMP_QID(0); j<XLP_CMS_CMP_MAXQID; j++) {
+ queue = XLP_CMS_IO_PUSHQ(node, j);
+ nlm_cms_config_onchip_queue(base, spill_base, queue, spill_en);
+ }
+
+ /* Enable POE push queue */
+ for (j=XLP_CMS_POE_QID(0); j<XLP_CMS_POE_MAXQID; j++) {
+ queue = XLP_CMS_IO_PUSHQ(node, j);
+ nlm_cms_config_onchip_queue(base, spill_base, queue, spill_en);
+ }
+
+ /* Enable NAE push queue */
+ for (j=XLP_CMS_NAE_QID(0); j<XLP_CMS_NAE_MAXQID; j++) {
+ queue = XLP_CMS_IO_PUSHQ(node, j);
+ nlm_cms_config_onchip_queue(base, spill_base, queue, spill_en);
+ }
+
+ /* Enable all pop queues */
+ if (popq_en) {
+ for (j=XLP_CMS_POPQ_QID(0); j<XLP_CMS_POPQ_MAXQID; j++) {
+ queue = XLP_CMS_POPQ(node, j);
+ nlm_cms_config_onchip_queue(base, spill_base, queue,
+ spill_en);
+ }
+ }
+}
+
+uint64_t nlm_cms_get_onchip_queue (uint64_t base, int qid)
+{
+ return nlm_rdreg_cms(base, XLP_CMS_OUTPUTQ_CONFIG_REG(qid));
+}
+
+void nlm_cms_set_onchip_queue (uint64_t base, int qid, uint64_t val)
+{
+ uint64_t rdval;
+
+ rdval = nlm_rdreg_cms(base, XLP_CMS_OUTPUTQ_CONFIG_REG(qid));
+ rdval |= val;
+ nlm_wreg_cms(base, XLP_CMS_OUTPUTQ_CONFIG_REG(qid), rdval);
+}
+
+void nlm_cms_per_queue_level_intr(uint64_t base, int qid, int sub_type,
+ int intr_val)
+{
+ uint64_t val;
+
+ val = nlm_rdreg_cms(base, XLP_CMS_OUTPUTQ_CONFIG_REG(qid));
+
+ val |= (((uint64_t)sub_type<<54) |
+ ((uint64_t)intr_val<<56));
+
+ nlm_wreg_cms(base, XLP_CMS_OUTPUTQ_CONFIG_REG(qid), val);
+}
+
+void nlm_cms_level_intr(int node, int sub_type, int intr_val)
+{
+ int j, k, vc;
+ int queue;
+ uint64_t base;
+
+ base = nlm_regbase_cms(node);
+ /* setup level intr config on all cpu push queues */
+ for (j=0; j<XLP_MAX_CORES; j++)
+ for (k=0; k<XLP_MAX_THREADS; k++)
+ for (vc=0; vc<XLP_CMS_MAX_VCPU_VC; vc++) {
+ queue = XLP_CMS_CPU_PUSHQ(node, j, k, vc);
+ nlm_cms_per_queue_level_intr(base, queue, sub_type, intr_val);
+ }
+
+ /* setup level intr config on all pcie 0 push queue */
+ for (j=XLP_CMS_PCIE0_QID(0); j<XLP_CMS_PCIE0_MAXQID; j++) {
+ queue = XLP_CMS_IO_PUSHQ(node, j);
+ nlm_cms_per_queue_level_intr(base, queue, sub_type, intr_val);
+ }
+
+ /* setup level intr config on all pcie 1 push queue */
+ for (j=XLP_CMS_PCIE1_QID(0); j<XLP_CMS_PCIE1_MAXQID; j++) {
+ queue = XLP_CMS_IO_PUSHQ(node, j);
+ nlm_cms_per_queue_level_intr(base, queue, sub_type, intr_val);
+ }
+
+ /* setup level intr config on all pcie 2 push queue */
+ for (j=XLP_CMS_PCIE2_QID(0); j<XLP_CMS_PCIE2_MAXQID; j++) {
+ queue = XLP_CMS_IO_PUSHQ(node, j);
+ nlm_cms_per_queue_level_intr(base, queue, sub_type, intr_val);
+ }
+
+ /* setup level intr config on all pcie 3 push queue */
+ for (j=XLP_CMS_PCIE3_QID(0); j<XLP_CMS_PCIE3_MAXQID; j++) {
+ queue = XLP_CMS_IO_PUSHQ(node, j);
+ nlm_cms_per_queue_level_intr(base, queue, sub_type, intr_val);
+ }
+
+ /* setup level intr config on all DTE push queue */
+ for (j=XLP_CMS_DTE_QID(0); j<XLP_CMS_DTE_MAXQID; j++) {
+ queue = XLP_CMS_IO_PUSHQ(node, j);
+ nlm_cms_per_queue_level_intr(base, queue, sub_type, intr_val);
+ }
+
+ /* setup level intr config on all RSA/ECC push queue */
+ for (j=XLP_CMS_RSA_ECC_QID(0); j<XLP_CMS_RSA_ECC_MAXQID; j++) {
+ queue = XLP_CMS_IO_PUSHQ(node, j);
+ nlm_cms_per_queue_level_intr(base, queue, sub_type, intr_val);
+ }
+
+ /* setup level intr config on all crypto push queue */
+ for (j=XLP_CMS_CRYPTO_QID(0); j<XLP_CMS_CRYPTO_MAXQID; j++) {
+ queue = XLP_CMS_IO_PUSHQ(node, j);
+ nlm_cms_per_queue_level_intr(base, queue, sub_type, intr_val);
+ }
+
+ /* setup level intr config on all CMP push queue */
+ for (j=XLP_CMS_CMP_QID(0); j<XLP_CMS_CMP_MAXQID; j++) {
+ queue = XLP_CMS_IO_PUSHQ(node, j);
+ nlm_cms_per_queue_level_intr(base, queue, sub_type, intr_val);
+ }
+
+ /* setup level intr config on all POE push queue */
+ for (j=XLP_CMS_POE_QID(0); j<XLP_CMS_POE_MAXQID; j++) {
+ queue = XLP_CMS_IO_PUSHQ(node, j);
+ nlm_cms_per_queue_level_intr(base, queue, sub_type, intr_val);
+ }
+
+ /* setup level intr config on all NAE push queue */
+ for (j=XLP_CMS_NAE_QID(0); j<XLP_CMS_NAE_MAXQID; j++) {
+ queue = XLP_CMS_IO_PUSHQ(node, j);
+ nlm_cms_per_queue_level_intr(base, queue, sub_type, intr_val);
+ }
+
+ /* setup level intr config on all pop queues */
+ for (j=XLP_CMS_POPQ_QID(0); j<XLP_CMS_POPQ_MAXQID; j++) {
+ queue = XLP_CMS_POPQ(node, j);
+ nlm_cms_per_queue_level_intr(base, queue, sub_type, intr_val);
+ }
+}
+
+void nlm_cms_per_queue_timer_intr(uint64_t base, int qid, int sub_type,
+ int intr_val)
+{
+ uint64_t val;
+
+ val = nlm_rdreg_cms(base, XLP_CMS_OUTPUTQ_CONFIG_REG(qid));
+
+ val |= (((uint64_t)sub_type<<49) |
+ ((uint64_t)intr_val<<51));
+
+ nlm_wreg_cms(base, XLP_CMS_OUTPUTQ_CONFIG_REG(qid), val);
+}
+
+void nlm_cms_timer_intr(int node, int en, int sub_type, int intr_val)
+{
+ int j, k, vc;
+ int queue;
+ uint64_t base;
+
+ base = nlm_regbase_cms(node);
+ /* setup timer intr config on all cpu push queues */
+ for (j=0; j<XLP_MAX_CORES; j++)
+ for (k=0; k<XLP_MAX_THREADS; k++)
+ for (vc=0; vc<XLP_CMS_MAX_VCPU_VC; vc++) {
+ queue = XLP_CMS_CPU_PUSHQ(node, j, k, vc);
+ nlm_cms_per_queue_timer_intr(base, queue, sub_type, intr_val);
+ }
+
+ /* setup timer intr config on all pcie 0 push queue */
+ for (j=XLP_CMS_PCIE0_QID(0); j<XLP_CMS_PCIE0_MAXQID; j++) {
+ queue = XLP_CMS_IO_PUSHQ(node, j);
+ nlm_cms_per_queue_timer_intr(base, queue, sub_type, intr_val);
+ }
+
+ /* setup timer intr config on all pcie 1 push queue */
+ for (j=XLP_CMS_PCIE1_QID(0); j<XLP_CMS_PCIE1_MAXQID; j++) {
+ queue = XLP_CMS_IO_PUSHQ(node, j);
+ nlm_cms_per_queue_timer_intr(base, queue, sub_type, intr_val);
+ }
+
+ /* setup timer intr config on all pcie 2 push queue */
+ for (j=XLP_CMS_PCIE2_QID(0); j<XLP_CMS_PCIE2_MAXQID; j++) {
+ queue = XLP_CMS_IO_PUSHQ(node, j);
+ nlm_cms_per_queue_timer_intr(base, queue, sub_type, intr_val);
+ }
+
+ /* setup timer intr config on all pcie 3 push queue */
+ for (j=XLP_CMS_PCIE3_QID(0); j<XLP_CMS_PCIE3_MAXQID; j++) {
+ queue = XLP_CMS_IO_PUSHQ(node, j);
+ nlm_cms_per_queue_timer_intr(base, queue, sub_type, intr_val);
+ }
+
+ /* setup timer intr config on all DTE push queue */
+ for (j=XLP_CMS_DTE_QID(0); j<XLP_CMS_DTE_MAXQID; j++) {
+ queue = XLP_CMS_IO_PUSHQ(node, j);
+ nlm_cms_per_queue_timer_intr(base, queue, sub_type, intr_val);
+ }
+
+ /* setup timer intr config on all RSA/ECC push queue */
+ for (j=XLP_CMS_RSA_ECC_QID(0); j<XLP_CMS_RSA_ECC_MAXQID; j++) {
+ queue = XLP_CMS_IO_PUSHQ(node, j);
+ nlm_cms_per_queue_timer_intr(base, queue, sub_type, intr_val);
+ }
+
+ /* setup timer intr config on all crypto push queue */
+ for (j=XLP_CMS_CRYPTO_QID(0); j<XLP_CMS_CRYPTO_MAXQID; j++) {
+ queue = XLP_CMS_IO_PUSHQ(node, j);
+ nlm_cms_per_queue_timer_intr(base, queue, sub_type, intr_val);
+ }
+
+ /* setup timer intr config on all CMP push queue */
+ for (j=XLP_CMS_CMP_QID(0); j<XLP_CMS_CMP_MAXQID; j++) {
+ queue = XLP_CMS_IO_PUSHQ(node, j);
+ nlm_cms_per_queue_timer_intr(base, queue, sub_type, intr_val);
+ }
+
+ /* setup timer intr config on all POE push queue */
+ for (j=XLP_CMS_POE_QID(0); j<XLP_CMS_POE_MAXQID; j++) {
+ queue = XLP_CMS_IO_PUSHQ(node, j);
+ nlm_cms_per_queue_timer_intr(base, queue, sub_type, intr_val);
+ }
+
+ /* setup timer intr config on all NAE push queue */
+ for (j=XLP_CMS_NAE_QID(0); j<XLP_CMS_NAE_MAXQID; j++) {
+ queue = XLP_CMS_IO_PUSHQ(node, j);
+ nlm_cms_per_queue_timer_intr(base, queue, sub_type, intr_val);
+ }
+
+ /* setup timer intr config on all pop queues */
+ for (j=XLP_CMS_POPQ_QID(0); j<XLP_CMS_POPQ_MAXQID; j++) {
+ queue = XLP_CMS_POPQ(node, j);
+ nlm_cms_per_queue_timer_intr(base, queue, sub_type, intr_val);
+ }
+}
+
+/* returns 1 if interrupt has been generated for this output queue */
+int nlm_cms_outputq_intr_check(uint64_t base, int qid)
+{
+ uint64_t val;
+ val = nlm_rdreg_cms(base, XLP_CMS_OUTPUTQ_CONFIG_REG(qid));
+
+ return ((val >> 59) & 0x1);
+}
+
+void nlm_cms_outputq_clr_intr(uint64_t base, int qid)
+{
+ uint64_t val;
+ val = nlm_rdreg_cms(base, XLP_CMS_OUTPUTQ_CONFIG_REG(qid));
+ val |= (1ULL<<59);
+ nlm_wreg_cms(base, XLP_CMS_OUTPUTQ_CONFIG_REG(qid), val);
+}
+
+void nlm_cms_illegal_dst_error_intr(uint64_t base, int en)
+{
+ uint64_t val;
+
+ val = nlm_rdreg_cms(base, XLP_CMS_MSG_CONFIG_REG);
+ val |= (en<<8);
+ nlm_wreg_cms(base, XLP_CMS_MSG_CONFIG_REG, val);
+}
+
+void nlm_cms_timeout_error_intr(uint64_t base, int en)
+{
+ uint64_t val;
+
+ val = nlm_rdreg_cms(base, XLP_CMS_MSG_CONFIG_REG);
+ val |= (en<<7);
+ nlm_wreg_cms(base, XLP_CMS_MSG_CONFIG_REG, val);
+}
+
+void nlm_cms_biu_error_resp_intr(uint64_t base, int en)
+{
+ uint64_t val;
+
+ val = nlm_rdreg_cms(base, XLP_CMS_MSG_CONFIG_REG);
+ val |= (en<<6);
+ nlm_wreg_cms(base, XLP_CMS_MSG_CONFIG_REG, val);
+}
+
+void nlm_cms_spill_uncorrectable_ecc_error_intr(uint64_t base, int en)
+{
+ uint64_t val;
+
+ val = nlm_rdreg_cms(base, XLP_CMS_MSG_CONFIG_REG);
+ val |= (en<<5) | (en<<3);
+ nlm_wreg_cms(base, XLP_CMS_MSG_CONFIG_REG, val);
+}
+
+void nlm_cms_spill_correctable_ecc_error_intr(uint64_t base, int en)
+{
+ uint64_t val;
+
+ val = nlm_rdreg_cms(base, XLP_CMS_MSG_CONFIG_REG);
+ val |= (en<<4) | (en<<2);
+ nlm_wreg_cms(base, XLP_CMS_MSG_CONFIG_REG, val);
+}
+
+void nlm_cms_outputq_uncorrectable_ecc_error_intr(uint64_t base, int en)
+{
+ uint64_t val;
+
+ val = nlm_rdreg_cms(base, XLP_CMS_MSG_CONFIG_REG);
+ val |= (en<<1);
+ nlm_wreg_cms(base, XLP_CMS_MSG_CONFIG_REG, val);
+}
+
+void nlm_cms_outputq_correctable_ecc_error_intr(uint64_t base, int en)
+{
+ uint64_t val;
+
+ val = nlm_rdreg_cms(base, XLP_CMS_MSG_CONFIG_REG);
+ val |= (en<<0);
+ nlm_wreg_cms(base, XLP_CMS_MSG_CONFIG_REG, val);
+}
+
+uint64_t nlm_cms_network_error_status(uint64_t base)
+{
+ return nlm_rdreg_cms(base, XLP_CMS_MSG_ERR_REG);
+}
+
+int nlm_cms_get_net_error_code(uint64_t err)
+{
+ return ((err >> 12) & 0xf);
+}
+
+int nlm_cms_get_net_error_syndrome(uint64_t err)
+{
+ return ((err >> 32) & 0x1ff);
+}
+
+int nlm_cms_get_net_error_ramindex(uint64_t err)
+{
+ return ((err >> 44) & 0x7fff);
+}
+
+int nlm_cms_get_net_error_outputq(uint64_t err)
+{
+ return ((err >> 16) & 0xfff);
+}
+
+/*========================= FMN Tracing related APIs ================*/
+
+void nlm_cms_trace_setup(uint64_t base, int en, uint64_t trace_base,
+ uint64_t trace_limit, int match_dstid_en,
+ int dst_id, int match_srcid_en, int src_id,
+ int wrap)
+{
+ uint64_t val;
+
+ nlm_wreg_cms(base, XLP_CMS_TRACE_BASE_ADDR_REG, trace_base);
+ nlm_wreg_cms(base, XLP_CMS_TRACE_LIMIT_ADDR_REG, trace_limit);
+
+ val = nlm_rdreg_cms(base, XLP_CMS_TRACE_CONFIG_REG);
+ val |= (((uint64_t)match_dstid_en << 39) |
+ ((dst_id & 0xfff) << 24) |
+ (match_srcid_en << 23) |
+ ((src_id & 0xfff) << 8) |
+ (wrap << 1) |
+ (en << 0));
+ nlm_wreg_cms(base, XLP_CMS_MSG_CONFIG_REG, val);
+}
+
+void nlm_cms_endian_byte_swap (uint64_t base, int en)
+{
+ nlm_wreg_cms(base, XLP_CMS_MSG_ENDIAN_SWAP_REG, en);
+}
diff --git a/sys/mips/nlm/hal/fmn.h b/sys/mips/nlm/hal/fmn.h
new file mode 100644
index 0000000..75fc774
--- /dev/null
+++ b/sys/mips/nlm/hal/fmn.h
@@ -0,0 +1,275 @@
+/*-
+ * Copyright 2003-2011 Netlogic Microsystems (Netlogic). All rights
+ * reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY Netlogic Microsystems ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL NETLOGIC OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+ * THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * $FreeBSD$
+ * NETLOGIC_BSD */
+
+#ifndef __NLM_FMNV2_H__
+#define __NLM_FMNV2_H__
+
+/**
+* @file_name fmn.h
+* @author Netlogic Microsystems
+* @brief HAL for Fast message network V2
+*/
+
+/* FMN configuration registers */
+#define XLP_CMS_OUTPUTQ_CONFIG_REG(i) ((i)*2)
+#define XLP_CMS_MAX_OUTPUTQ 1024
+#define XLP_CMS_OUTPUTQ_CREDIT_CFG_REG (0x2000/4)
+#define XLP_CMS_MSG_CONFIG_REG (0x2008/4)
+#define XLP_CMS_MSG_ERR_REG (0x2010/4)
+#define XLP_CMS_TRACE_CONFIG_REG (0x2018/4)
+#define XLP_CMS_TRACE_BASE_ADDR_REG (0x2020/4)
+#define XLP_CMS_TRACE_LIMIT_ADDR_REG (0x2028/4)
+#define XLP_CMS_TRACE_CURRENT_ADDR_REG (0x2030/4)
+#define XLP_CMS_MSG_ENDIAN_SWAP_REG (0x2038/4)
+
+#define XLP_CMS_CPU_PUSHQ(node, core, thread, vc) \
+ (((node)<<10) | ((core)<<4) | ((thread)<<2) | ((vc)<<0))
+#define XLP_CMS_POPQ(node, queue) (((node)<<10) | (queue))
+#define XLP_CMS_IO_PUSHQ(node, queue) (((node)<<10) | (queue))
+
+#define XLP_CMS_POPQ_QID(i) (128+(i))
+#define XLP_CMS_POPQ_MAXQID 255
+#define XLP_CMS_PCIE0_QID(i) (256+(i))
+#define XLP_CMS_PCIE0_MAXQID 257
+#define XLP_CMS_PCIE1_QID(i) (258+(i))
+#define XLP_CMS_PCIE1_MAXQID 259
+#define XLP_CMS_PCIE2_QID(i) (260+(i))
+#define XLP_CMS_PCIE2_MAXQID 261
+#define XLP_CMS_PCIE3_QID(i) (262+(i))
+#define XLP_CMS_PCIE3_MAXQID 263
+#define XLP_CMS_DTE_QID(i) (264+(i))
+#define XLP_CMS_DTE_MAXQID 267
+#define XLP_CMS_RSA_ECC_QID(i) (272+(i))
+#define XLP_CMS_RSA_ECC_MAXQID 280
+#define XLP_CMS_CRYPTO_QID(i) (281+(i))
+#define XLP_CMS_CRYPTO_MAXQID 296
+/* TODO PCI header register 0x3C says CMP starts at 297(0x129) VERIFY */
+#define XLP_CMS_CMP_QID(i) (298+(i))
+#define XLP_CMS_CMP_MAXQID 305
+#define XLP_CMS_POE_QID(i) (384+(i))
+#define XLP_CMS_POE_MAXQID 391
+#define XLP_CMS_NAE_QID(i) (476+(i))
+#define XLP_CMS_NAE_MAXQID 1023
+
+#define XLP_CMS_NAE_TX_VC_BASE 476
+#define XLP_CMS_NAE_TX_VC_LIMIT 999
+#define XLP_CMS_NAE_RX_VC_BASE 1000
+#define XLP_CMS_NAE_RX_VC_LIMIT 1019
+
+#define XLP_MAX_CMS_QUEUES 1024
+
+/* FMN Level Interrupt Type */
+#define XLP_CMS_LVL_INTR_DISABLE 0
+#define XLP_CMS_LVL_LOW_WATERMARK 1
+#define XLP_CMS_LVL_HI_WATERMARK 2
+
+/* FMN Level interrupt trigger values */
+#define XLP_CMS_QUEUE_NON_EMPTY 0
+#define XLP_CMS_QUEUE_QUARTER_FULL 1
+#define XLP_CMS_QUEUE_HALF_FULL 2
+#define XLP_CMS_QUEUE_THREE_QUARTER_FULL 3
+#define XLP_CMS_QUEUE_FULL 4
+
+/* FMN Timer Interrupt Type */
+#define XLP_CMS_TIMER_INTR_DISABLE 0
+#define XLP_CMS_TIMER_CONSUMER 1
+#define XLP_CMS_TIMER_PRODUCER 1
+
+/* FMN timer interrupt trigger values */
+#define XLP_CMS_TWO_POW_EIGHT_CYCLES 0
+#define XLP_CMS_TWO_POW_TEN_CYCLES 1
+#define XLP_CMS_TWO_POW_TWELVE_CYCLES 2
+#define XLP_CMS_TWO_POW_FOURTEEN_CYCLES 3
+#define XLP_CMS_TWO_POW_SIXTEEN_CYCLES 4
+#define XLP_CMS_TWO_POW_EIGHTTEEN_CYCLES 5
+#define XLP_CMS_TWO_POW_TWENTY_CYCLES 6
+#define XLP_CMS_TWO_POW_TWENTYTWO_CYCLES 7
+
+#define XLP_CMS_QUEUE_ENA 1ULL
+#define XLP_CMS_QUEUE_DIS 0
+#define XLP_CMS_SPILL_ENA 1ULL
+#define XLP_CMS_SPILL_DIS 0
+
+#define XLP_CMS_MAX_VCPU_VC 4
+
+/* Each XLP chip can hold upto 32K messages on the chip itself */
+#define XLP_CMS_ON_CHIP_MESG_SPACE (32*1024)
+#define XLP_CMS_ON_CHIP_PER_QUEUE_SPACE \
+ ((XLP_CMS_ON_CHIP_MESG_SPACE)/(XLP_MAX_CMS_QUEUES))
+#define XLP_CMS_MAX_ONCHIP_SEGMENTS 1024
+#define XLP_CMS_MAX_SPILL_SEGMENTS_PER_QUEUE 64
+
+/* FMN Network error */
+#define XLP_CMS_ILLEGAL_DST_ERROR 0x100
+#define XLP_CMS_BIU_TIMEOUT_ERROR 0x080
+#define XLP_CMS_BIU_ERROR 0x040
+#define XLP_CMS_SPILL_FILL_UNCORRECT_ECC_ERROR 0x020
+#define XLP_CMS_SPILL_FILL_CORRECT_ECC_ERROR 0x010
+#define XLP_CMS_SPILL_UNCORRECT_ECC_ERROR 0x008
+#define XLP_CMS_SPILL_CORRECT_ECC_ERROR 0x004
+#define XLP_CMS_OUTPUTQ_UNCORRECT_ECC_ERROR 0x002
+#define XLP_CMS_OUTPUTQ_CORRECT_ECC_ERROR 0x001
+
+/* worst case, a single entry message consists of a 4 byte header
+ * and an 8-byte entry = 12 bytes in total
+ */
+#define XLP_CMS_SINGLE_ENTRY_MSG_SIZE 12
+/* total spill memory needed for one FMN queue */
+#define XLP_CMS_PER_QUEUE_SPILL_MEM(spilltotmsgs) \
+ ((spilltotmsgs) * (XLP_CMS_SINGLE_ENTRY_MSG_SIZE))
+/* total spill memory needed */
+#define XLP_CMS_TOTAL_SPILL_MEM(spilltotmsgs) \
+ ((XLP_CMS_PER_QUEUE_SPILL_MEM(spilltotmsgs)) * \
+ (XLP_MAX_CMS_QUEUES))
+/* total number of FMN messages possible in a queue */
+#define XLP_CMS_TOTAL_QUEUE_SIZE(spilltotmsgs) \
+ ((spilltotmsgs) + (XLP_CMS_ON_CHIP_PER_QUEUE_SPACE))
+
+/* FMN Src station id's */
+#define XLP_CMS_CPU0_SRC_STID (0 << 4)
+#define XLP_CMS_CPU1_SRC_STID (1 << 4)
+#define XLP_CMS_CPU2_SRC_STID (2 << 4)
+#define XLP_CMS_CPU3_SRC_STID (3 << 4)
+#define XLP_CMS_CPU4_SRC_STID (4 << 4)
+#define XLP_CMS_CPU5_SRC_STID (5 << 4)
+#define XLP_CMS_CPU6_SRC_STID (6 << 4)
+#define XLP_CMS_CPU7_SRC_STID (7 << 4)
+#define XLP_CMS_PCIE0_SRC_STID 256
+#define XLP_CMS_PCIE1_SRC_STID 258
+#define XLP_CMS_PCIE2_SRC_STID 260
+#define XLP_CMS_PCIE3_SRC_STID 262
+#define XLP_CMS_DTE_SRC_STID 264
+#define XLP_CMS_RSA_ECC_SRC_STID 272
+#define XLP_CMS_CRYPTO_SRC_STID 281
+#define XLP_CMS_CMP_SRC_STID 298
+#define XLP_CMS_POE_SRC_STID 384
+#define XLP_CMS_NAE_SRC_STID 476
+#if 0
+#define XLP_CMS_DEFAULT_CREDIT(cmstotstns,spilltotmsgs) \
+ ((XLP_CMS_TOTAL_QUEUE_SIZE(spilltotmsgs)) / \
+ (cmstotstns))
+#endif
+#define XLP_CMS_DEFAULT_CREDIT(cmstotstns,spilltotmsgs) 8
+
+/* POPQ related defines */
+#define XLP_CMS_POPQID_START 128
+#define XLP_CMS_POPQID_END 255
+
+#define XLP_CMS_INT_RCVD 0x800000000000000ULL
+
+#define nlm_rdreg_cms(b, r) nlm_read_reg64_xkseg(b,r)
+#define nlm_wreg_cms(b, r, v) nlm_write_reg64_xkseg(b,r,v)
+#define nlm_pcibase_cms(node) nlm_pcicfg_base(XLP_IO_CMS_OFFSET(node))
+#define nlm_regbase_cms(node) nlm_pcibar0_base_xkphys(nlm_pcibase_cms(node))
+
+enum fmn_swcode {
+ FMN_SWCODE_CPU0=1,
+ FMN_SWCODE_CPU1,
+ FMN_SWCODE_CPU2,
+ FMN_SWCODE_CPU3,
+ FMN_SWCODE_CPU4,
+ FMN_SWCODE_CPU5,
+ FMN_SWCODE_CPU6,
+ FMN_SWCODE_CPU7,
+ FMN_SWCODE_CPU8,
+ FMN_SWCODE_CPU9,
+ FMN_SWCODE_CPU10,
+ FMN_SWCODE_CPU11,
+ FMN_SWCODE_CPU12,
+ FMN_SWCODE_CPU13,
+ FMN_SWCODE_CPU14,
+ FMN_SWCODE_CPU15,
+ FMN_SWCODE_CPU16,
+ FMN_SWCODE_CPU17,
+ FMN_SWCODE_CPU18,
+ FMN_SWCODE_CPU19,
+ FMN_SWCODE_CPU20,
+ FMN_SWCODE_CPU21,
+ FMN_SWCODE_CPU22,
+ FMN_SWCODE_CPU23,
+ FMN_SWCODE_CPU24,
+ FMN_SWCODE_CPU25,
+ FMN_SWCODE_CPU26,
+ FMN_SWCODE_CPU27,
+ FMN_SWCODE_CPU28,
+ FMN_SWCODE_CPU29,
+ FMN_SWCODE_CPU30,
+ FMN_SWCODE_CPU31,
+ FMN_SWCODE_CPU32,
+ FMN_SWCODE_PCIE0,
+ FMN_SWCODE_PCIE1,
+ FMN_SWCODE_PCIE2,
+ FMN_SWCODE_PCIE3,
+ FMN_SWCODE_DTE,
+ FMN_SWCODE_CRYPTO,
+ FMN_SWCODE_RSA,
+ FMN_SWCODE_CMP,
+ FMN_SWCODE_POE,
+ FMN_SWCODE_NAE,
+};
+
+extern uint64_t nlm_cms_spill_total_messages;
+extern uint32_t nlm_cms_total_stations;
+extern uint32_t cms_onchip_seg_availability[XLP_CMS_ON_CHIP_PER_QUEUE_SPACE];
+
+extern uint64_t cms_base_addr(int node);
+extern int nlm_cms_verify_credit_config (int spill_en, int tot_credit);
+extern int nlm_cms_get_oc_space(int qsize, int max_queues, int qid, int *ocbase, int *ocstart, int *ocend);
+extern void nlm_cms_setup_credits (uint64_t base, int destid, int srcid, int credit);
+extern int nlm_cms_config_onchip_queue (uint64_t base, uint64_t cms_spill_base, int qid, int spill_en);
+extern void nlm_cms_default_setup(int node, uint64_t spill_base, int spill_en, int popq_en);
+extern uint64_t nlm_cms_get_onchip_queue (uint64_t base, int qid);
+extern void nlm_cms_set_onchip_queue (uint64_t base, int qid, uint64_t val);
+extern void nlm_cms_per_queue_level_intr(uint64_t base, int qid, int sub_type, int intr_val);
+extern void nlm_cms_level_intr(int node, int sub_type, int intr_val);
+extern void nlm_cms_per_queue_timer_intr(uint64_t base, int qid, int sub_type, int intr_val);
+extern void nlm_cms_timer_intr(int node, int en, int sub_type, int intr_val);
+extern int nlm_cms_outputq_intr_check(uint64_t base, int qid);
+extern void nlm_cms_outputq_clr_intr(uint64_t base, int qid);
+extern void nlm_cms_illegal_dst_error_intr(uint64_t base, int en);
+extern void nlm_cms_timeout_error_intr(uint64_t base, int en);
+extern void nlm_cms_biu_error_resp_intr(uint64_t base, int en);
+extern void nlm_cms_spill_uncorrectable_ecc_error_intr(uint64_t base, int en);
+extern void nlm_cms_spill_correctable_ecc_error_intr(uint64_t base, int en);
+extern void nlm_cms_outputq_uncorrectable_ecc_error_intr(uint64_t base, int en);
+extern void nlm_cms_outputq_correctable_ecc_error_intr(uint64_t base, int en);
+extern uint64_t nlm_cms_network_error_status(uint64_t base);
+extern int nlm_cms_get_net_error_code(uint64_t err);
+extern int nlm_cms_get_net_error_syndrome(uint64_t err);
+extern int nlm_cms_get_net_error_ramindex(uint64_t err);
+extern int nlm_cms_get_net_error_outputq(uint64_t err);
+extern void nlm_cms_trace_setup(uint64_t base, int en, uint64_t trace_base, uint64_t trace_limit, int match_dstid_en, int dst_id, int match_srcid_en, int src_id, int wrap);
+extern void nlm_cms_endian_byte_swap (uint64_t base, int en);
+extern uint8_t xlp_msg_send(uint8_t vc, uint8_t size);
+extern int nlm_cms_alloc_spill_q(uint64_t base, int qid, uint64_t spill_base,
+ int nsegs);
+extern int nlm_cms_alloc_onchip_q(uint64_t base, int qid, int nsegs);
+
+#endif
diff --git a/sys/mips/nlm/hal/iomap.h b/sys/mips/nlm/hal/iomap.h
new file mode 100644
index 0000000..e11dcdd
--- /dev/null
+++ b/sys/mips/nlm/hal/iomap.h
@@ -0,0 +1,237 @@
+/*-
+ * Copyright 2003-2011 Netlogic Microsystems (Netlogic). All rights
+ * reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY Netlogic Microsystems ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL NETLOGIC OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+ * THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * $FreeBSD$
+ * NETLOGIC_BSD */
+
+#ifndef __NLM_IOMAP_H__
+#define __NLM_IOMAP_H__
+
+/**
+* @file_name xlpiomap.h
+* @author Netlogic Microsystems
+* @brief Basic definitions Netlogic XLP IO BASEs
+*/
+
+/* ----------------------------------
+ * XLP RESET Physical Address Map
+ * ----------------------------------
+ * PCI ECFG : 0x18000000 - 0x1bffffff
+ * PCI CFG : 0x1c000000 - 0x1cffffff
+ * FLASH : 0x1fc00000 - 0x1fffffff
+ * ----------------------------------
+ */
+
+#define XLP_DEFAULT_IO_BASE 0x18000000
+#define XLP_DEFAULT_IO_BASE_KSEG1 0xb8000000
+#define XLP_IO_SIZE (64 << 20) /* Size of the ECFG Space */
+#define XLP_IO_PCI_HDRSZ 0x100
+#define XLP_IO_DEV(node, dev) ((dev) + (node) * 8)
+#define XLP_HDR_OFFSET(node, bus, dev, fn) (((bus) << 20) | \
+ ((XLP_IO_DEV(node, dev)) << 15) | ((fn) << 12))
+
+#define XLP_IO_BRIDGE_OFFSET(node) XLP_HDR_OFFSET(node,0,0,0)
+/* coherent inter chip */
+#define XLP_IO_CIC0_OFFSET(node) XLP_HDR_OFFSET(node,0,0,1)
+#define XLP_IO_CIC1_OFFSET(node) XLP_HDR_OFFSET(node,0,0,2)
+#define XLP_IO_CIC2_OFFSET(node) XLP_HDR_OFFSET(node,0,0,3)
+#define XLP_IO_PIC_OFFSET(node) XLP_HDR_OFFSET(node,0,0,4)
+
+#define XLP_IO_PCIE_OFFSET(node,i) XLP_HDR_OFFSET(node,0,1,i)
+#define XLP_IO_PCIE0_OFFSET(node) XLP_HDR_OFFSET(node,0,1,0)
+#define XLP_IO_PCIE1_OFFSET(node) XLP_HDR_OFFSET(node,0,1,1)
+#define XLP_IO_PCIE2_OFFSET(node) XLP_HDR_OFFSET(node,0,1,2)
+#define XLP_IO_PCIE3_OFFSET(node) XLP_HDR_OFFSET(node,0,1,3)
+
+#define XLP_IO_USB_OFFSET(node, i) XLP_HDR_OFFSET(node,0,2,i)
+#define XLP_IO_USB_EHCI0_OFFSET(node) XLP_HDR_OFFSET(node,0,2,0)
+#define XLP_IO_USB_OHCI0_OFFSET(node) XLP_HDR_OFFSET(node,0,2,1)
+#define XLP_IO_USB_OHCI1_OFFSET(node) XLP_HDR_OFFSET(node,0,2,2)
+#define XLP_IO_USB_EHCI1_OFFSET(node) XLP_HDR_OFFSET(node,0,2,3)
+#define XLP_IO_USB_OHCI2_OFFSET(node) XLP_HDR_OFFSET(node,0,2,4)
+#define XLP_IO_USB_OHCI3_OFFSET(node) XLP_HDR_OFFSET(node,0,2,5)
+
+#define XLP_IO_NAE_OFFSET(node) XLP_HDR_OFFSET(node,0,3,0)
+#define XLP_IO_POE_OFFSET(node) XLP_HDR_OFFSET(node,0,3,1)
+
+#define XLP_IO_CMS_OFFSET(node) XLP_HDR_OFFSET(node,0,4,0)
+
+#define XLP_IO_DMA_OFFSET(node) XLP_HDR_OFFSET(node,0,5,1)
+#define XLP_IO_SEC_OFFSET(node) XLP_HDR_OFFSET(node,0,5,2)
+#define XLP_IO_CMP_OFFSET(node) XLP_HDR_OFFSET(node,0,5,3)
+
+#define XLP_IO_UART_OFFSET(node, i) XLP_HDR_OFFSET(node,0,6,i)
+#define XLP_IO_UART0_OFFSET(node) XLP_HDR_OFFSET(node,0,6,0)
+#define XLP_IO_UART1_OFFSET(node) XLP_HDR_OFFSET(node,0,6,1)
+#define XLP_IO_I2C_OFFSET(node, i) XLP_HDR_OFFSET(node,0,6,2+i)
+#define XLP_IO_I2C0_OFFSET(node) XLP_HDR_OFFSET(node,0,6,2)
+#define XLP_IO_I2C1_OFFSET(node) XLP_HDR_OFFSET(node,0,6,3)
+#define XLP_IO_GPIO_OFFSET(node) XLP_HDR_OFFSET(node,0,6,4)
+/* system management */
+#define XLP_IO_SYS_OFFSET(node) XLP_HDR_OFFSET(node,0,6,5)
+#define XLP_IO_JTAG_OFFSET(node) XLP_HDR_OFFSET(node,0,6,6)
+
+#define XLP_IO_NOR_OFFSET(node) XLP_HDR_OFFSET(node,0,7,0)
+#define XLP_IO_NAND_OFFSET(node) XLP_HDR_OFFSET(node,0,7,1)
+#define XLP_IO_SPI_OFFSET(node) XLP_HDR_OFFSET(node,0,7,2)
+/* SD flash */
+#define XLP_IO_SD_OFFSET(node) XLP_HDR_OFFSET(node,0,7,3)
+#define XLP_IO_MMC_OFFSET(node, slot) ((XLP_IO_SD_OFFSET(node))+(slot*0x100)+XLP_IO_PCI_HDRSZ)
+/* PCI config header register id's */
+#define XLP_PCI_CFGREG0 0x00
+#define XLP_PCI_CFGREG1 0x01
+#define XLP_PCI_CFGREG2 0x02
+#define XLP_PCI_CFGREG3 0x03
+#define XLP_PCI_CFGREG4 0x04
+#define XLP_PCI_CFGREG5 0x05
+#define XLP_PCI_DEVINFO_REG0 0x30
+#define XLP_PCI_DEVINFO_REG1 0x31
+#define XLP_PCI_DEVINFO_REG2 0x32
+#define XLP_PCI_DEVINFO_REG3 0x33
+#define XLP_PCI_DEVINFO_REG4 0x34
+#define XLP_PCI_DEVINFO_REG5 0x35
+#define XLP_PCI_DEVINFO_REG6 0x36
+#define XLP_PCI_DEVINFO_REG7 0x37
+#define XLP_PCI_DEVSCRATCH_REG0 0x38
+#define XLP_PCI_DEVSCRATCH_REG1 0x39
+#define XLP_PCI_DEVSCRATCH_REG2 0x3a
+#define XLP_PCI_DEVSCRATCH_REG3 0x3b
+#define XLP_PCI_MSGSTN_REG 0x3c
+#define XLP_PCI_IRTINFO_REG 0x3d
+#define XLP_PCI_UCODEINFO_REG 0x3e
+#define XLP_PCI_SBB_WT_REG 0x3f
+
+#if !defined(LOCORE) && !defined(__ASSEMBLY__)
+
+#ifndef __NLM_NLMIO_H__
+#error iomap.h needs mmio.h to be included
+#endif
+
+static __inline__ uint32_t
+nlm_read_reg_kseg(uint64_t base, uint32_t reg)
+{
+ volatile uint32_t *addr = (volatile uint32_t *)(intptr_t)base + reg;
+
+ return (*addr);
+}
+
+static __inline__ void
+nlm_write_reg_kseg(uint64_t base, uint32_t reg, uint32_t val)
+{
+ volatile uint32_t *addr = (volatile uint32_t *)(intptr_t)base + reg;
+
+ *addr = val;
+}
+
+static __inline__ uint64_t
+nlm_read_reg64_kseg(uint64_t base, uint32_t reg)
+{
+ volatile uint64_t *addr = (volatile uint64_t *)(intptr_t)base + (reg >> 1);
+
+ return (nlm_load_dword(addr));
+}
+
+static __inline__ void
+nlm_write_reg64_kseg(uint64_t base, uint32_t reg, uint64_t val)
+{
+ volatile uint64_t *addr = (volatile uint64_t *)(intptr_t)base + (reg >> 1);
+
+ return (nlm_store_dword(addr, val));
+}
+
+/*
+ * Routines to store 32/64 bit values to 64 bit addresses,
+ * used when going thru XKPHYS to access registers
+ */
+static __inline__ uint32_t
+nlm_read_reg_xkseg(uint64_t base, uint32_t reg)
+{
+ uint64_t addr = base + reg * sizeof(uint32_t);
+
+ return (nlm_load_word_daddr(addr));
+}
+
+static __inline__ void
+nlm_write_reg_xkseg(uint64_t base, uint32_t reg, uint32_t val)
+{
+ uint64_t addr = base + reg * sizeof(uint32_t);
+
+ return (nlm_store_word_daddr(addr, val));
+}
+
+static __inline__ uint64_t
+nlm_read_reg64_xkseg(uint64_t base, uint32_t reg)
+{
+ uint64_t addr = base + (reg >> 1) * sizeof(uint64_t);
+
+ return (nlm_load_dword_daddr(addr));
+}
+
+static __inline__ void
+nlm_write_reg64_xkseg(uint64_t base, uint32_t reg, uint64_t val)
+{
+ uint64_t addr = base + (reg >> 1) * sizeof(uint64_t);
+
+ return (nlm_store_dword_daddr(addr, val));
+}
+
+/* Location where IO base is mapped */
+extern uint64_t nlm_pcicfg_baseaddr;
+
+static __inline__ uint64_t
+nlm_pcicfg_base(uint32_t devoffset)
+{
+ return (nlm_pcicfg_baseaddr + devoffset);
+}
+
+static __inline__ uint64_t
+nlm_pcibar0_base_xkphys(uint64_t pcibase)
+{
+ uint64_t paddr;
+
+ paddr = nlm_read_reg_kseg(pcibase, XLP_PCI_CFGREG4) & ~0xfu;
+ return (0x9000000000000000 | paddr);
+}
+#define nlm_pci_rdreg(b, r) nlm_read_reg_kseg(b, r)
+#define nlm_pci_wreg(b, r, v) nlm_write_reg_kseg(b, r, v)
+
+#endif /* !LOCORE && !__ASSEMBLY__*/
+
+
+/* COMPAT stuff - TODO remove */
+#define bit_set(p, m) ((p) |= (m))
+#define bit_clear(p, m) ((p) &= ~(m))
+#define bit_get(p,m) ((p) & (m))
+#define BIT(x) (0x01 << (x))
+
+#define XLP_MAX_NODES 4
+#define XLP_MAX_CORES 8
+#define XLP_MAX_THREADS 4
+#define XLP_CACHELINE_SIZE 64
+#define XLP_NUM_NODES 1 /* we support only one now */
+
+#endif
diff --git a/sys/mips/nlm/hal/mips-extns.h b/sys/mips/nlm/hal/mips-extns.h
new file mode 100644
index 0000000..7851b1b
--- /dev/null
+++ b/sys/mips/nlm/hal/mips-extns.h
@@ -0,0 +1,200 @@
+/*-
+ * Copyright 2003-2011 Netlogic Microsystems (Netlogic). All rights
+ * reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY Netlogic Microsystems ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL NETLOGIC OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+ * THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * $FreeBSD$
+ * NETLOGIC_BSD */
+
+#ifndef __NLM_MIPS_EXTNS_H__
+#define __NLM_MIPS_EXTNS_H__
+
+#if !defined(LOCORE) && !defined(__ASSEMBLY__)
+static __inline__ int32_t nlm_swapw(int32_t *loc, int32_t val)
+{
+ int32_t oldval = 0;
+
+ __asm__ __volatile__ (
+ ".set push\n"
+ ".set noreorder\n"
+ "move $9, %2\n"
+ "move $8, %3\n"
+ ".word 0x71280014\n" /* "swapw $8, $9\n" */
+ "move %1, $8\n"
+ ".set pop\n"
+ : "+m" (*loc), "=r" (oldval)
+ : "r" (loc), "r" (val)
+ : "$8", "$9" );
+
+ return oldval;
+}
+
+static __inline__ uint32_t nlm_swapwu(int32_t *loc, uint32_t val)
+{
+ uint32_t oldval;
+
+ __asm__ __volatile__ (
+ ".set push\n"
+ ".set noreorder\n"
+ "move $9, %2\n"
+ "move $8, %3\n"
+ ".word 0x71280015\n" /* "swapwu $8, $9\n" */
+ "move %1, $8\n"
+ ".set pop\n"
+ : "+m" (*loc), "=r" (oldval)
+ : "r" (loc), "r" (val)
+ : "$8", "$9" );
+
+ return oldval;
+}
+
+#if (__mips == 64)
+static __inline__ uint64_t nlm_swapd(int32_t *loc, uint64_t val)
+{
+ uint64_t oldval;
+
+ __asm__ __volatile__ (
+ ".set push\n"
+ ".set noreorder\n"
+ "move $9, %2\n"
+ "move $8, %3\n"
+ ".word 0x71280014\n" /* "swapw $8, $9\n" */
+ "move %1, $8\n"
+ ".set pop\n"
+ : "+m" (*loc), "=r" (oldval)
+ : "r" (loc), "r" (val)
+ : "$8", "$9" );
+
+ return oldval;
+}
+#endif
+
+#if defined(__mips_n64) || defined(__mips_n32)
+static __inline uint64_t
+nlm_mfcr(uint32_t reg)
+{
+ uint64_t res;
+
+ __asm__ __volatile__(
+ ".set push\n\t"
+ ".set noreorder\n\t"
+ "move $9, %1\n\t"
+ ".word 0x71280018\n\t" /* mfcr $8, $9 */
+ "move %0, $8\n\t"
+ ".set pop\n"
+ : "=r" (res) : "r"(reg)
+ : "$8", "$9"
+ );
+ return (res);
+}
+
+static __inline void
+nlm_mtcr(uint32_t reg, uint64_t value)
+{
+ __asm__ __volatile__(
+ ".set push\n\t"
+ ".set noreorder\n\t"
+ "move $8, %0\n"
+ "move $9, %1\n"
+ ".word 0x71280019\n" /* mtcr $8, $9 */
+ ".set pop\n"
+ :
+ : "r" (value), "r" (reg)
+ : "$8", "$9"
+ );
+}
+
+#else /* !(defined(__mips_n64) || defined(__mips_n32)) */
+
+static __inline__ uint64_t
+nlm_mfcr(uint32_t reg)
+{
+ uint64_t hi;
+ uint64_t lo;
+
+ __asm__ __volatile__ (
+ ".set push\n"
+ ".set mips64\n"
+ "move $8, %2\n"
+ ".word 0x71090018\n"
+ "nop \n"
+ "dsra32 %0, $9, 0\n"
+ "sll %1, $9, 0\n"
+ ".set pop\n"
+ : "=r"(hi), "=r"(lo)
+ : "r"(reg) : "$8", "$9");
+
+ return (((uint64_t)hi) << 32) | lo;
+}
+
+static __inline__ void
+nlm_mtcr(uint32_t reg, uint64_t val)
+{
+ uint32_t hi, lo;
+ hi = val >> 32;
+ lo = val & 0xffffffff;
+
+ __asm__ __volatile__ (
+ ".set push\n"
+ ".set mips64\n"
+ "move $9, %0\n"
+ "dsll32 $9, %1, 0\n"
+ "dsll32 $8, %0, 0\n"
+ "dsrl32 $9, $9, 0\n"
+ "or $9, $9, $8\n"
+ "move $8, %2\n"
+ ".word 0x71090019\n"
+ "nop \n"
+ ".set pop\n"
+ ::"r"(hi), "r"(lo), "r"(reg)
+ : "$8", "$9");
+}
+#endif /* (defined(__mips_n64) || defined(__mips_n32)) */
+
+/* dcrc2 */
+/* XLP additional instructions */
+
+/*
+ * Atomic increment a unsigned int
+ */
+static __inline unsigned int
+nlm_ldaddwu(unsigned int value, unsigned int *addr)
+{
+ __asm__ __volatile__(
+ ".set push\n"
+ ".set noreorder\n"
+ "move $8, %2\n"
+ "move $9, %3\n"
+ ".word 0x71280011\n" /* ldaddwu $8, $9 */
+ "move %0, $8\n"
+ ".set pop\n"
+ : "=&r"(value), "+m"(*addr)
+ : "0"(value), "r" ((unsigned long)addr)
+ : "$8", "$9");
+
+ return (value);
+}
+#endif
+#endif
diff --git a/sys/mips/nlm/hal/mmio.h b/sys/mips/nlm/hal/mmio.h
new file mode 100644
index 0000000..a19a867
--- /dev/null
+++ b/sys/mips/nlm/hal/mmio.h
@@ -0,0 +1,338 @@
+/*-
+ * Copyright 2003-2011 Netlogic Microsystems (Netlogic). All rights
+ * reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY Netlogic Microsystems ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL NETLOGIC OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+ * THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * $FreeBSD$
+ * NETLOGIC_BSD */
+
+#ifndef __NLM_NLMIO_H__
+#define __NLM_NLMIO_H__
+
+#if !defined(__mips_n32) && !defined(__mips_n64)
+/*
+ * For o32 compilation, we have to disable interrupts and enable KX bit to
+ * access 64 bit addresses or data.
+ *
+ * We need to disable interrupts because we save just the lower 32 bits of
+ * registers in interrupt handling. So if we get hit by an interrupt while
+ * using the upper 32 bits of a register, we lose.
+ */
+static __inline__ uint32_t nlm_enable_kx(void)
+{
+ uint32_t sr;
+
+ __asm__ __volatile__(
+ "mfc0 %0, $12 \n\t" /* read status reg */
+ "move $8, %0 \n\t"
+ "ori $8, $8, 0x81 \n\t" /* set KX, and IE */
+ "xori $8, $8, 0x1 \n\t" /* flip IE */
+ "mtc0 $8, $12 \n\t" /* update status reg */
+ : "=r"(sr)
+ : : "$8");
+
+ return (sr);
+}
+
+static __inline__ void nlm_restore_kx(uint32_t sr)
+{
+ __asm__ __volatile__("mtc0 %0, $12" : : "r"(sr));
+}
+#endif
+
+static __inline__ uint32_t
+nlm_load_word(volatile uint32_t *addr)
+{
+ return (*addr);
+}
+
+static __inline__ void
+nlm_store_word(volatile uint32_t *addr, uint32_t val)
+{
+ *addr = val;
+}
+
+#if defined(__mips_n64) || defined(__mips_n32)
+static __inline__ uint64_t
+nlm_load_dword(volatile uint64_t *addr)
+{
+ return (*addr);
+}
+
+static __inline__ void
+nlm_store_dword(volatile uint64_t *addr, uint64_t val)
+{
+ *addr = val;
+}
+
+#else /* o32 */
+static __inline__ uint64_t
+nlm_load_dword(volatile uint64_t *addr)
+{
+ uint32_t valhi, vallo, sr;
+
+ sr = nlm_enable_kx();
+ __asm__ __volatile__(
+ ".set push \n\t"
+ ".set mips64 \n\t"
+ "ld $8, 0(%2) \n\t"
+ "dsra32 %0, $8, 0 \n\t"
+ "sll %1, $8, 0 \n\t"
+ ".set pop \n"
+ : "=r"(valhi), "=r"(vallo)
+ : "r"(addr)
+ : "$8" );
+ nlm_restore_kx(sr);
+
+ return (((uint64_t)valhi << 32) | vallo);
+}
+
+static __inline__ void
+nlm_store_dword(volatile uint64_t *addr, uint64_t val)
+{
+ uint32_t valhi, vallo, sr;
+
+ valhi = val >> 32;
+ vallo = val & 0xffffffff;
+
+ sr = nlm_enable_kx();
+ __asm__ __volatile__(
+ ".set push \n\t"
+ ".set mips64 \n\t"
+ "dsll32 $8, %1, 0 \n\t"
+ "dsll32 $9, %2, 0 \n\t" /* get rid of the */
+ "dsrl32 $9, $9, 0 \n\t" /* sign extend */
+ "or $9, $9, $8 \n\t"
+ "sd $9, 0(%0) \n\t"
+ ".set pop \n"
+ : : "r"(addr), "r"(valhi), "r"(vallo)
+ : "$8", "$9", "memory");
+ nlm_restore_kx(sr);
+}
+#endif
+
+#if defined(__mips_n64)
+static __inline__ uint64_t
+nlm_load_word_daddr(uint64_t addr)
+{
+ volatile uint32_t *p = (volatile uint32_t *)(intptr_t)addr;
+
+ return (*p);
+}
+
+static __inline__ void
+nlm_store_word_daddr(uint64_t addr, uint32_t val)
+{
+ volatile uint32_t *p = (volatile uint32_t *)(intptr_t)addr;
+
+ *p = val;
+}
+
+static __inline__ uint64_t
+nlm_load_dword_daddr(uint64_t addr)
+{
+ volatile uint64_t *p = (volatile uint64_t *)(intptr_t)addr;
+
+ return (*p);
+}
+
+static __inline__ void
+nlm_store_dword_daddr(uint64_t addr, uint64_t val)
+{
+ volatile uint64_t *p = (volatile uint64_t *)(intptr_t)addr;
+
+ *p = val;
+}
+
+#elif defined(__mips_n32)
+
+static __inline__ uint64_t
+nlm_load_word_daddr(uint64_t addr)
+{
+ uint32_t val;
+
+ __asm__ __volatile__(
+ ".set push \n\t"
+ ".set mips64 \n\t"
+ "lw %0, 0(%1) \n\t"
+ ".set pop \n"
+ : "=r"(val)
+ : "r"(addr));
+
+ return (val);
+}
+
+static __inline__ void
+nlm_store_word_daddr(uint64_t addr, uint32_t val)
+{
+ __asm__ __volatile__(
+ ".set push \n\t"
+ ".set mips64 \n\t"
+ "sw %0, 0(%1) \n\t"
+ ".set pop \n"
+ : : "r"(val), "r"(addr)
+ : "memory");
+}
+
+static __inline__ uint64_t
+nlm_load_dword_daddr(uint64_t addr)
+{
+ uint64_t val;
+
+ __asm__ __volatile__(
+ ".set push \n\t"
+ ".set mips64 \n\t"
+ "ld %0, 0(%1) \n\t"
+ ".set pop \n"
+ : "=r"(val)
+ : "r"(addr));
+ return (val);
+}
+
+static __inline__ void
+nlm_store_dword_daddr(uint64_t addr, uint64_t val)
+{
+ __asm__ __volatile__(
+ ".set push \n\t"
+ ".set mips64 \n\t"
+ "sd %0, 0(%1) \n\t"
+ ".set pop \n"
+ : : "r"(val), "r"(addr)
+ : "memory");
+}
+
+#else /* o32 */
+static __inline__ uint64_t
+nlm_load_word_daddr(uint64_t addr)
+{
+ uint32_t val, addrhi, addrlo, sr;
+
+ addrhi = addr >> 32;
+ addrlo = addr & 0xffffffff;
+
+ sr = nlm_enable_kx();
+ __asm__ __volatile__(
+ ".set push \n\t"
+ ".set mips64 \n\t"
+ "dsll32 $8, %1, 0 \n\t"
+ "dsll32 $9, %2, 0 \n\t" /* get rid of the */
+ "dsrl32 $9, $9, 0 \n\t" /* sign extend */
+ "or $9, $9, $8 \n\t"
+ "lw %0, 0($9) \n\t"
+ ".set pop \n"
+ : "=r"(val)
+ : "r"(addrhi), "r"(addrlo)
+ : "$8", "$9");
+ nlm_restore_kx(sr);
+
+ return (val);
+
+}
+
+static __inline__ void
+nlm_store_word_daddr(uint64_t addr, uint32_t val)
+{
+ uint32_t addrhi, addrlo, sr;
+
+ addrhi = addr >> 32;
+ addrlo = addr & 0xffffffff;
+
+ sr = nlm_enable_kx();
+ __asm__ __volatile__(
+ ".set push \n\t"
+ ".set mips64 \n\t"
+ "dsll32 $8, %1, 0 \n\t"
+ "dsll32 $9, %2, 0 \n\t" /* get rid of the */
+ "dsrl32 $9, $9, 0 \n\t" /* sign extend */
+ "or $9, $9, $8 \n\t"
+ "sw %0, 0($9) \n\t"
+ ".set pop \n"
+ :: "r"(val), "r"(addrhi), "r"(addrlo)
+ : "$8", "$9", "memory");
+ nlm_restore_kx(sr);
+}
+
+static __inline__ uint64_t
+nlm_load_dword_daddr(uint64_t addr)
+{
+ uint32_t addrh, addrl, sr;
+ uint32_t valh, vall;
+
+ addrh = addr >> 32;
+ addrl = addr & 0xffffffff;
+
+ sr = nlm_enable_kx();
+ __asm__ __volatile__(
+ ".set push \n\t"
+ ".set mips64 \n\t"
+ "dsll32 $8, %2, 0 \n\t"
+ "dsll32 $9, %3, 0 \n\t" /* get rid of the */
+ "dsrl32 $9, $9, 0 \n\t" /* sign extend */
+ "or $9, $9, $8 \n\t"
+ "ld $8, 0($9) \n\t"
+ "dsra32 %0, $8, 0 \n\t"
+ "sll %1, $8, 0 \n\t"
+ ".set pop \n"
+ : "=r"(valh), "=r"(vall)
+ : "r"(addrh), "r"(addrl)
+ : "$8", "$9");
+ nlm_restore_kx(sr);
+
+ return (((uint64_t)valh << 32) | vall);
+}
+
+static __inline__ void
+nlm_store_dword_daddr(uint64_t addr, uint64_t val)
+{
+ uint32_t addrh, addrl, sr;
+ uint32_t valh, vall;
+
+ addrh = addr >> 32;
+ addrl = addr & 0xffffffff;
+ valh = val >> 32;
+ vall = val & 0xffffffff;
+
+ sr = nlm_enable_kx();
+ __asm__ __volatile__(
+ ".set push \n\t"
+ ".set mips64 \n\t"
+ "dsll32 $8, %2, 0 \n\t"
+ "dsll32 $9, %3, 0 \n\t" /* get rid of the */
+ "dsrl32 $9, $9, 0 \n\t" /* sign extend */
+ "or $9, $9, $8 \n\t"
+ "dsll32 $8, %0, 0 \n\t"
+ "dsll32 $10, %1, 0 \n\t" /* get rid of the */
+ "dsrl32 $10, $10, 0 \n\t" /* sign extend */
+ "or $8, $8, $10 \n\t"
+ "sd $8, 0($9) \n\t"
+ ".set pop \n"
+ : : "r"(valh), "r"(vall), "r"(addrh), "r"(addrl)
+ : "$8", "$9", "memory");
+ nlm_restore_kx(sr);
+}
+
+#endif /* __mips_n64 */
+
+#endif
diff --git a/sys/mips/nlm/hal/mmu.h b/sys/mips/nlm/hal/mmu.h
new file mode 100644
index 0000000..a620727
--- /dev/null
+++ b/sys/mips/nlm/hal/mmu.h
@@ -0,0 +1,204 @@
+/*-
+ * Copyright 2003-2011 Netlogic Microsystems (Netlogic). All rights
+ * reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY Netlogic Microsystems ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL NETLOGIC OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+ * THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * $FreeBSD$
+ * NETLOGIC_BSD */
+
+#ifndef __XLP_MMU_H__
+#define __XLP_MMU_H__
+
+#include <mips/nlm/hal/cop0.h>
+#include <mips/nlm/hal/mips-extns.h>
+
+#define XLP_MMU_SETUP_REG 0x400
+#define XLP_MMU_LFSRSEED_REG 0x401
+#define XLP_MMU_HPW_NUM_PAGE_LVL_REG 0x410
+#define XLP_MMU_PGWKR_PGDBASE_REG 0x411
+#define XLP_MMU_PGWKR_PGDSHFT_REG 0x412
+#define XLP_MMU_PGWKR_PGDMASK_REG 0x413
+#define XLP_MMU_PGWKR_PUDSHFT_REG 0x414
+#define XLP_MMU_PGWKR_PUDMASK_REG 0x415
+#define XLP_MMU_PGWKR_PMDSHFT_REG 0x416
+#define XLP_MMU_PGWKR_PMDMASK_REG 0x417
+#define XLP_MMU_PGWKR_PTESHFT_REG 0x418
+#define XLP_MMU_PGWKR_PTEMASK_REG 0x419
+
+typedef struct hw_pagewalker {
+ int pgd_present;
+ int pud_present;
+ int pmd_present;
+ int pte_present;
+ uint64_t pgd_baseaddr;
+ uint32_t pgd_shift;
+ uint32_t pgd_mask;
+ uint32_t pud_shift;
+ uint32_t pud_mask;
+ uint32_t pmd_shift;
+ uint32_t pmd_mask;
+ uint32_t pte_shift;
+ uint32_t pte_mask;
+} nlm_pagewalker;
+
+/**
+ * On power on reset, XLP comes up with 64 TLBs.
+ * Large-variable-tlb's (ELVT) and extended TLB is disabled.
+ * Enabling large-variable-tlb's sets up the standard
+ * TLB size from 64 to 128 TLBs.
+ * Enabling fixed TLB (EFT) sets up an additional 2048 tlbs.
+ * ELVT + EFT = 128 + 2048 = 2176 TLB entries.
+ * threads 64-entry-standard-tlb 128-entry-standard-tlb
+ * per std-tlb-only| std+EFT | std-tlb-only| std+EFT
+ * core | | |
+ * --------------------------------------------------------
+ * 1 64 64+2048 128 128+2048
+ * 2 64 64+1024 64 64+1024
+ * 4 32 32+512 32 32+512
+ *
+ * 1(G) 64 64+2048 128 128+2048
+ * 2(G) 128 128+2048 128 128+2048
+ * 4(G) 128 128+2048 128 128+2048
+ * (G) = Global mode
+ */
+
+
+/* en = 1 to enable
+ * en = 0 to disable
+ */
+static __inline__ void nlm_large_variable_tlb_en (int en)
+{
+ unsigned int val;
+
+ val = nlm_read_c0_config6();
+ val |= (en << 5);
+ nlm_write_c0_config6(val);
+ return;
+}
+
+/* en = 1 to enable
+ * en = 0 to disable
+ */
+static __inline__ void nlm_pagewalker_en (int en)
+{
+ unsigned int val;
+
+ val = nlm_read_c0_config6();
+ val |= (en << 3);
+ nlm_write_c0_config6(val);
+ return;
+}
+
+/* en = 1 to enable
+ * en = 0 to disable
+ */
+static __inline__ void nlm_extended_tlb_en (int en)
+{
+ unsigned int val;
+
+ val = nlm_read_c0_config6();
+ val |= (en << 2);
+ nlm_write_c0_config6(val);
+ return;
+}
+
+static __inline__ int nlm_get_num_combined_tlbs(void)
+{
+ return (((nlm_read_c0_config6() >> 16) & 0xffff) + 1);
+}
+
+/* get number of variable TLB entries */
+static __inline__ int nlm_get_num_vtlbs(void)
+{
+ return (((nlm_read_c0_config6() >> 6) & 0x3ff) + 1);
+}
+
+static __inline__ void nlm_setup_extended_pagemask (int mask)
+{
+ nlm_write_c0_config7(mask);
+}
+
+/* hashindex_en = 1 to enable hash mode, hashindex_en=0 to disable
+ * global_mode = 1 to enable global mode, global_mode=0 to disable
+ * clk_gating = 0 to enable clock gating, clk_gating=1 to disable
+ */
+static __inline__ void nlm_mmu_setup(int hashindex_en, int global_mode,
+ int clk_gating)
+{
+ /*uint32_t mmusetup = nlm_mfcr(XLP_MMU_SETUP_REG);*/
+
+ uint32_t mmusetup = 0;
+ mmusetup |= (hashindex_en << 13);
+ mmusetup |= (clk_gating << 3);
+ mmusetup |= (global_mode << 0);
+ nlm_mtcr(XLP_MMU_SETUP_REG, mmusetup);
+}
+
+static __inline__ void nlm_mmu_lfsr_seed (int thr0_seed, int thr1_seed,
+ int thr2_seed, int thr3_seed)
+{
+ uint32_t seed = nlm_mfcr(XLP_MMU_LFSRSEED_REG);
+ seed |= ((thr3_seed & 0x7f) << 23);
+ seed |= ((thr2_seed & 0x7f) << 16);
+ seed |= ((thr1_seed & 0x7f) << 7);
+ seed |= ((thr0_seed & 0x7f) << 0);
+ nlm_mtcr(XLP_MMU_LFSRSEED_REG, seed);
+}
+
+static __inline__ void nlm_pagewalker_setup (nlm_pagewalker *walker)
+{
+ uint64_t val;
+
+ if (!walker->pgd_present)
+ return;
+
+ val = nlm_mfcr(XLP_MMU_HPW_NUM_PAGE_LVL_REG);
+
+ if (walker->pgd_present)
+ val |= (1 << 3);
+
+ if (walker->pud_present)
+ val |= (1 << 2);
+
+ if (walker->pmd_present)
+ val |= (1 << 1);
+
+ if (walker->pte_present)
+ val |= (1 << 0);
+
+ nlm_mtcr(XLP_MMU_HPW_NUM_PAGE_LVL_REG, val);
+
+ nlm_mtcr(XLP_MMU_PGWKR_PGDBASE_REG, walker->pgd_baseaddr);
+ nlm_mtcr(XLP_MMU_PGWKR_PGDSHFT_REG, walker->pgd_shift);
+ nlm_mtcr(XLP_MMU_PGWKR_PGDMASK_REG, walker->pgd_mask);
+ nlm_mtcr(XLP_MMU_PGWKR_PUDSHFT_REG, walker->pud_shift);
+ nlm_mtcr(XLP_MMU_PGWKR_PUDMASK_REG, walker->pud_mask);
+ nlm_mtcr(XLP_MMU_PGWKR_PMDSHFT_REG, walker->pmd_shift);
+ nlm_mtcr(XLP_MMU_PGWKR_PMDMASK_REG, walker->pmd_mask);
+ nlm_mtcr(XLP_MMU_PGWKR_PTESHFT_REG, walker->pte_shift);
+ nlm_mtcr(XLP_MMU_PGWKR_PTEMASK_REG, walker->pte_mask);
+}
+
+#endif
diff --git a/sys/mips/nlm/hal/pic.h b/sys/mips/nlm/hal/pic.h
new file mode 100644
index 0000000..842a367
--- /dev/null
+++ b/sys/mips/nlm/hal/pic.h
@@ -0,0 +1,427 @@
+/*-
+ * Copyright 2003-2011 Netlogic Microsystems (Netlogic). All rights
+ * reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY Netlogic Microsystems ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL NETLOGIC OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+ * THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * $FreeBSD$
+ * NETLOGIC_BSD */
+
+#ifndef __XLP_PIC_H__
+#define __XLP_PIC_H__
+
+/* PIC Specific registers */
+#define XLP_PIC_CTRL_REG 0x40
+#define XLP_PIC_BYTESWAP_REG 0x42
+#define XLP_PIC_STATUS_REG 0x44
+#define XLP_PIC_INTR_TIMEOUT 0x46
+#define XLP_PIC_ICI0_INTR_TIMEOUT 0x48
+#define XLP_PIC_ICI1_INTR_TIMEOUT 0x4a
+#define XLP_PIC_ICI2_INTR_TIMEOUT 0x4c
+#define XLP_PIC_IPI_CTRL_REG 0x4e
+#define XLP_PIC_INT_ACK_REG 0x50
+#define XLP_PIC_INT_PENDING0_REG 0x52
+#define XLP_PIC_INT_PENDING1_REG 0x54
+#define XLP_PIC_INT_PENDING2_REG 0x56
+
+#define XLP_PIC_WDOG0_MAXVAL_REG 0x58
+#define XLP_PIC_WDOG0_COUNT_REG 0x5a
+#define XLP_PIC_WDOG0_ENABLE0_REG 0x5c
+#define XLP_PIC_WDOG0_ENABLE1_REG 0x5e
+#define XLP_PIC_WDOG0_BEATCMD_REG 0x60
+#define XLP_PIC_WDOG0_BEAT0_REG 0x62
+#define XLP_PIC_WDOG0_BEAT1_REG 0x64
+
+#define XLP_PIC_WDOG1_MAXVAL_REG 0x66
+#define XLP_PIC_WDOG1_COUNT_REG 0x68
+#define XLP_PIC_WDOG1_ENABLE0_REG 0x6a
+#define XLP_PIC_WDOG1_ENABLE1_REG 0x6c
+#define XLP_PIC_WDOG1_BEATCMD_REG 0x6e
+#define XLP_PIC_WDOG1_BEAT0_REG 0x70
+#define XLP_PIC_WDOG1_BEAT1_REG 0x72
+
+#define XLP_PIC_WDOG_MAXVAL_REG(i) (XLP_PIC_WDOG0_MAXVAL_REG + ((i) ? 7 : 0))
+#define XLP_PIC_WDOG_COUNT_REG(i) (XLP_PIC_WDOG0_COUNT_REG + ((i) ? 7 : 0))
+#define XLP_PIC_WDOG_ENABLE0_REG(i) (XLP_PIC_WDOG0_ENABLE0_REG + ((i) ? 7 : 0))
+#define XLP_PIC_WDOG_ENABLE1_REG(i) (XLP_PIC_WDOG0_ENABLE1_REG + ((i) ? 7 : 0))
+#define XLP_PIC_WDOG_BEATCMD_REG(i) (XLP_PIC_WDOG0_BEATCMD_REG + ((i) ? 7 : 0))
+#define XLP_PIC_WDOG_BEAT0_REG(i) (XLP_PIC_WDOG0_BEAT0_REG + ((i) ? 7 : 0))
+#define XLP_PIC_WDOG_BEAT1_REG(i) (XLP_PIC_WDOG0_BEAT1_REG + ((i) ? 7 : 0))
+
+#define XLP_PIC_SYSTIMER0_MAXVAL_REG 0x74
+#define XLP_PIC_SYSTIMER1_MAXVAL_REG 0x76
+#define XLP_PIC_SYSTIMER2_MAXVAL_REG 0x78
+#define XLP_PIC_SYSTIMER3_MAXVAL_REG 0x7a
+#define XLP_PIC_SYSTIMER4_MAXVAL_REG 0x7c
+#define XLP_PIC_SYSTIMER5_MAXVAL_REG 0x7e
+#define XLP_PIC_SYSTIMER6_MAXVAL_REG 0x80
+#define XLP_PIC_SYSTIMER7_MAXVAL_REG 0x82
+#define XLP_PIC_SYSTIMER_MAXVAL_REG(i) (XLP_PIC_SYSTIMER0_MAXVAL_REG + ((i)*2))
+
+#define XLP_PIC_SYSTIMER0_COUNT_REG 0x84
+#define XLP_PIC_SYSTIMER1_COUNT_REG 0x86
+#define XLP_PIC_SYSTIMER2_COUNT_REG 0x88
+#define XLP_PIC_SYSTIMER3_COUNT_REG 0x8a
+#define XLP_PIC_SYSTIMER4_COUNT_REG 0x8c
+#define XLP_PIC_SYSTIMER5_COUNT_REG 0x8e
+#define XLP_PIC_SYSTIMER6_COUNT_REG 0x90
+#define XLP_PIC_SYSTIMER7_COUNT_REG 0x92
+#define XLP_PIC_SYSTIMER_COUNT_REG(i) (XLP_PIC_SYSTIMER0_COUNT_REG + ((i)*2))
+
+#define XLP_PIC_ITE0_N0_N1_REG 0x94
+#define XLP_PIC_ITE1_N0_N1_REG 0x98
+#define XLP_PIC_ITE2_N0_N1_REG 0x9c
+#define XLP_PIC_ITE3_N0_N1_REG 0xa0
+#define XLP_PIC_ITE4_N0_N1_REG 0xa4
+#define XLP_PIC_ITE5_N0_N1_REG 0xa8
+#define XLP_PIC_ITE6_N0_N1_REG 0xac
+#define XLP_PIC_ITE7_N0_N1_REG 0xb0
+#define XLP_PIC_ITE_N0_N1_REG(i) (XLP_PIC_ITE0_N0_N1_REG + ((i)*4))
+
+#define XLP_PIC_ITE0_N2_N3_REG 0x96
+#define XLP_PIC_ITE1_N2_N3_REG 0x9a
+#define XLP_PIC_ITE2_N2_N3_REG 0x9e
+#define XLP_PIC_ITE3_N2_N3_REG 0xa2
+#define XLP_PIC_ITE4_N2_N3_REG 0xa6
+#define XLP_PIC_ITE5_N2_N3_REG 0xaa
+#define XLP_PIC_ITE6_N2_N3_REG 0xae
+#define XLP_PIC_ITE7_N2_N3_REG 0xb2
+#define XLP_PIC_ITE_N2_N3_REG(i) (XLP_PIC_ITE0_N2_N3_REG + ((i)*4))
+
+#define XLP_PIC_IRT0_REG 0xb4
+#define XLP_PIC_IRT_REG(i) (XLP_PIC_IRT0_REG + ((i)*2))
+
+/* PIC IRT indices */
+
+#define XLP_PIC_IRT_WD0_INDEX 0
+#define XLP_PIC_IRT_WD1_INDEX 1
+#define XLP_PIC_IRT_WD_NMI0_INDEX 2
+#define XLP_PIC_IRT_WD_NMI1_INDEX 3
+#define XLP_PIC_IRT_TIMER0_INDEX 4
+#define XLP_PIC_IRT_TIMER1_INDEX 5
+#define XLP_PIC_IRT_TIMER2_INDEX 6
+#define XLP_PIC_IRT_TIMER3_INDEX 7
+#define XLP_PIC_IRT_TIMER4_INDEX 8
+#define XLP_PIC_IRT_TIMER5_INDEX 9
+#define XLP_PIC_IRT_TIMER6_INDEX 10
+#define XLP_PIC_IRT_TIMER7_INDEX 11
+#define XLP_PIC_IRT_TIMER_INDEX(i) (XLP_PIC_IRT_TIMER0_INDEX + (i))
+
+#define XLP_PIC_IRT_MSGQ0_INDEX 12
+#define XLP_PIC_IRT_MSGQ_INDEX(i) (XLP_PIC_IRT_MSGQ0_INDEX + (i))
+/* 12 to 43 */
+#define XLP_PIC_IRT_MSG0_INDEX 44
+#define XLP_PIC_IRT_MSG1_INDEX 45
+
+#define XLP_PIC_IRT_PCIE_MSIX0_INDEX 46
+#define XLP_PIC_IRT_PCIE_MSIX_INDEX(i) (XLP_PIC_IRT_PCIE_MSIX0_INDEX + (i))
+/* 46 to 77 */
+#define XLP_PIC_IRT_PCIE_LINK0_INDEX 78
+#define XLP_PIC_IRT_PCIE_LINK1_INDEX 79
+#define XLP_PIC_IRT_PCIE_LINK2_INDEX 80
+#define XLP_PIC_IRT_PCIE_LINK3_INDEX 81
+#define XLP_PIC_IRT_PCIE_LINK_INDEX(i) (XLP_PIC_IRT_PCIE_LINK0_INDEX + (i))
+/* 78 to 81 */
+#define XLP_PIC_IRT_NA0_INDEX 82
+#define XLP_PIC_IRT_NA_INDEX(i) (XLP_PIC_IRT_NA0_INDEX + (i))
+/* 82 to 113 */
+#define XLP_PIC_IRT_POE_INDEX 114
+#define XLP_PIC_IRT_USB0_INDEX 115
+#define XLP_PIC_IRT_EHCI0_INDEX 115
+#define XLP_PIC_IRT_EHCI1_INDEX 118
+#define XLP_PIC_IRT_USB_INDEX(i) (XLP_PIC_IRT_USB0_INDEX + (i))
+/* 115 to 120 */
+#define XLP_PIC_IRT_GDX_INDEX 121
+#define XLP_PIC_IRT_SEC_INDEX 122
+#define XLP_PIC_IRT_RSA_INDEX 123
+#define XLP_PIC_IRT_COMP0_INDEX 124
+#define XLP_PIC_IRT_COMP_INDEX(i) (XLP_PIC_IRT_COMP0_INDEX + (i))
+/* 124 to 127 */
+#define XLP_PIC_IRT_GBU_INDEX 128
+/* coherent inter chip */
+#define XLP_PIC_IRT_CIC0_INDEX 129
+#define XLP_PIC_IRT_CIC1_INDEX 130
+#define XLP_PIC_IRT_CIC2_INDEX 131
+#define XLP_PIC_IRT_CAM_INDEX 132
+#define XLP_PIC_IRT_UART0_INDEX 133
+#define XLP_PIC_IRT_UART1_INDEX 134
+#define XLP_PIC_IRT_I2C0_INDEX 135
+#define XLP_PIC_IRT_I2C1_INDEX 136
+#define XLP_PIC_IRT_SYS0_INDEX 137
+#define XLP_PIC_IRT_SYS1_INDEX 138
+#define XLP_PIC_IRT_JTAG_INDEX 139
+#define XLP_PIC_IRT_PIC_INDEX 140
+#define XLP_PIC_IRT_NBU_INDEX 141
+#define XLP_PIC_IRT_TCU_INDEX 142
+/* global coherency */
+#define XLP_PIC_IRT_GCU_INDEX 143
+#define XLP_PIC_IRT_DMC0_INDEX 144
+#define XLP_PIC_IRT_DMC1_INDEX 145
+#define XLP_PIC_IRT_GPIO0_INDEX 146
+#define XLP_PIC_IRT_GPIO_INDEX(i) (XLP_PIC_IRT_GPIO0_INDEX + (i))
+/* 146 to 149 */
+#define XLP_PIC_IRT_NOR_INDEX 150
+#define XLP_PIC_IRT_NAND_INDEX 151
+#define XLP_PIC_IRT_SPI_INDEX 152
+#define XLP_PIC_IRT_MMC_INDEX 153
+
+/* PIC control register defines */
+#define XLP_PIC_ITV_OFFSET 32 /* interrupt timeout value */
+#define XLP_PIC_ICI_OFFSET 19 /* ICI interrupt timeout enable */
+#define XLP_PIC_ITE_OFFSET 18 /* interrupt timeout enable */
+#define XLP_PIC_STE_OFFSET 10 /* system timer interrupt enable */
+#define XLP_PIC_WWR1_OFFSET 8 /* watchdog timer 1 wraparound count for reset */
+#define XLP_PIC_WWR0_OFFSET 6 /* watchdog timer 0 wraparound count for reset */
+#define XLP_PIC_WWN1_OFFSET 4 /* watchdog timer 1 wraparound count for NMI */
+#define XLP_PIC_WWN0_OFFSET 2 /* watchdog timer 0 wraparound count for NMI */
+#define XLP_PIC_WTE_OFFSET 0 /* watchdog timer enable */
+
+/* PIC Status register defines */
+#define XLP_PIC_ICI_STATUS_OFFSET 33 /* ICI interrupt timeout interrupt status */
+#define XLP_PIC_ITE_STATUS_OFFSET 32 /* interrupt timeout interrupt status */
+#define XLP_PIC_STS_STATUS_OFFSET 4 /* System timer interrupt status */
+#define XLP_PIC_WNS_STATUS_OFFSET 2 /* NMI interrupt status for watchdog timers */
+#define XLP_PIC_WIS_STATUS_OFFSET 0 /* Interrupt status for watchdog timers */
+
+/* PIC IPI control register offsets */
+#define XLP_PIC_IPICTRL_NMI_OFFSET 32
+#define XLP_PIC_IPICTRL_RIV_OFFSET 20 /* received interrupt vector */
+#define XLP_PIC_IPICTRL_IDB_OFFSET 16 /* interrupt destination base */
+#define XLP_PIC_IPICTRL_DTE_OFFSET 16 /* interrupt destination thread enables */
+
+/* PIC IRT register offsets */
+#define XLP_PIC_IRT_ENABLE_OFFSET 31
+#define XLP_PIC_IRT_NMI_OFFSET 29
+#define XLP_PIC_IRT_SCH_OFFSET 28 /* Scheduling scheme */
+#define XLP_PIC_IRT_RVEC_OFFSET 20 /* Interrupt receive vectors */
+#define XLP_PIC_IRT_DT_OFFSET 19 /* Destination type */
+#define XLP_PIC_IRT_DB_OFFSET 16 /* Destination base */
+#define XLP_PIC_IRT_DTE_OFFSET 0 /* Destination thread enables */
+
+#define XLP_PIC_MAX_IRQ 64
+#define XLP_PIC_MAX_IRT 160
+#define XLP_PIC_TIMER_FREQ 133000000
+
+#if !defined(LOCORE) && !defined(__ASSEMBLY__)
+
+#define nlm_rdreg_pic(b, r) nlm_read_reg64_kseg(b,r)
+#define nlm_wreg_pic(b, r, v) nlm_write_reg64_kseg(b,r,v)
+#define nlm_pcibase_pic(node) nlm_pcicfg_base(XLP_IO_PIC_OFFSET(node))
+#define nlm_regbase_pic(node) nlm_pcibase_pic(node)
+
+/* IRT and h/w interrupt routines */
+static __inline__ int
+nlm_pic_get_numirts(uint64_t pcibase)
+{
+ return (nlm_pci_rdreg(pcibase, XLP_PCI_IRTINFO_REG) >> 16);
+}
+
+static __inline__ int
+nlm_pic_get_startirt(uint64_t base)
+{
+ return (nlm_pci_rdreg(base, XLP_PCI_IRTINFO_REG) & 0xff);
+}
+
+
+static __inline__ int
+nlm_pic_read_irt(uint64_t base, int irt_index)
+{
+ return nlm_rdreg_pic(base, XLP_PIC_IRT_REG(irt_index));
+}
+
+/* IRT's can be written into in two modes
+ * ITE mode - Here the destination of the interrupt is one of the
+ * eight interrupt-thread-enable groups, allowing the interrupt
+ * to be distributed to any thread on any node
+ * ID mode - In ID mode, the IRT has the DB and DTE fields.
+ * DB[18:17] hold the node select and DB[16], if set to 0 selects
+ * cpu-cores 0-3, and if set to 1 selects cpu-cores 4-7.
+ * The DTE[15:0] field is a thread mask, allowing the PIC to broadcast
+ * the interrupt to 1-16 threads selectable from that mask
+ */
+
+static __inline__ void
+nlm_pic_write_irt_raw(uint64_t base, int irt_index, int en, int nmi, int sch,
+ int vec, int dt, int db, int dte)
+{
+ uint64_t val =
+ (((en & 0x1) << XLP_PIC_IRT_ENABLE_OFFSET) |
+ ((nmi & 0x1) << XLP_PIC_IRT_NMI_OFFSET) |
+ ((sch & 0x1) << XLP_PIC_IRT_SCH_OFFSET) |
+ ((vec & 0x3f) << XLP_PIC_IRT_RVEC_OFFSET) |
+ ((dt & 0x1 ) << XLP_PIC_IRT_DT_OFFSET) |
+ ((db & 0x7) << XLP_PIC_IRT_DB_OFFSET) |
+ (dte & 0xffff));
+ nlm_wreg_pic(base, XLP_PIC_IRT_REG(irt_index), val);
+}
+
+/* write IRT in ID mode */
+static __inline__ void
+nlm_pic_write_irt_id(uint64_t base, int irt_index, int en, int nmi, int vec,
+ int node, int cpugroup, uint32_t cpu_mask)
+{
+ nlm_pic_write_irt_raw(base, irt_index, en, nmi, 1, vec, 1,
+ (node << 1) | cpugroup , cpu_mask);
+}
+
+/* write IRT in ITE mode */
+static __inline__ void
+nlm_pic_write_ite(uint64_t base, int ite, uint32_t node0_thrmask,
+ uint32_t node1_thrmask, uint32_t node2_thrmask, uint32_t node3_thrmask)
+{
+ uint64_t tm10 = ((uint64_t)node1_thrmask << 32) | node0_thrmask;
+ uint64_t tm32 = ((uint64_t)node1_thrmask << 32) | node0_thrmask;
+
+ /* Enable the ITE register for all nodes */
+ nlm_wreg_pic(base, XLP_PIC_ITE_N0_N1_REG(ite), tm10);
+ nlm_wreg_pic(base, XLP_PIC_ITE_N2_N3_REG(ite), tm32);
+}
+
+static __inline__ void
+nlm_pic_write_irt_ite(uint64_t base, int irt_index, int ite, int en, int nmi,
+ int sch, int vec)
+{
+ nlm_pic_write_irt_raw(base, irt_index, en, nmi, sch, vec, 0, ite, 0);
+}
+
+/* Goto PIC on that node, and ack the interrupt */
+static __inline__ void nlm_pic_ack(uint64_t src_base, int irt)
+{
+ nlm_wreg_pic(src_base, XLP_PIC_INT_ACK_REG, irt);
+ /* ack in the status registers for watchdog and system timers */
+ if (irt < 12)
+ nlm_wreg_pic(src_base, XLP_PIC_STATUS_REG, (1 << irt));
+}
+
+/* IPI routines */
+
+static __inline__ void
+nlm_pic_send_ipi(uint64_t local_base, int target_node, int vcpu, int vec, int nmi)
+{
+ uint64_t ipi =
+ (((uint64_t)nmi << XLP_PIC_IPICTRL_NMI_OFFSET) |
+ (vec << XLP_PIC_IPICTRL_RIV_OFFSET) |
+ (target_node << 17) |
+ (1 << (vcpu & 0xf)));
+ if (vcpu > 15)
+ ipi |= 0x10000; /* set bit 16 to select cpus 16-31 */
+
+ nlm_wreg_pic(local_base, XLP_PIC_IPI_CTRL_REG, ipi);
+}
+
+/* System Timer routines -- broadcasts systemtimer to 16 vcpus defined in cpu_mask */
+
+static __inline__ void
+nlm_pic_set_systimer(uint64_t base, int timer, uint64_t value, int irq, int node,
+ int cpugroup, uint32_t cpumask)
+{
+ uint64_t pic_ctrl = nlm_rdreg_pic(base, XLP_PIC_CTRL_REG);
+ int en;
+
+ en = (cpumask != 0);
+ nlm_wreg_pic(base, XLP_PIC_SYSTIMER_MAXVAL_REG(timer), value);
+ nlm_pic_write_irt_id(base, XLP_PIC_IRT_TIMER_INDEX(timer),
+ en, 0, irq, node, cpugroup, cpumask);
+
+ /* enable the timer */
+ pic_ctrl |= (1 << (XLP_PIC_STE_OFFSET+timer));
+ nlm_wreg_pic(base, XLP_PIC_CTRL_REG, pic_ctrl);
+}
+
+static __inline__ uint64_t
+nlm_pic_read_systimer(uint64_t base, int timer)
+{
+ return nlm_rdreg_pic(base, XLP_PIC_SYSTIMER_COUNT_REG(timer));
+}
+
+/* Watchdog timer routines */
+
+/* node - XLP node
+ * timer - watchdog timer. valid values are 0 and 1
+ * wrap_around_count - defines the number of times the watchdog timer can wrap-around
+ * after which the reset / NMI gets generated to the threads defined in thread-enable-masks.
+ * value - the vatchdog timer max value, upto which the timer will count down
+ */
+
+static __inline__ void
+nlm_pic_set_wdogtimer(uint64_t base, int timer, int wrap_around_count, int nmi,
+ uint32_t node0_thrmask, uint32_t node1_thrmask,
+ uint32_t node2_thrmask, uint32_t node3_thrmask, uint64_t value)
+{
+ uint64_t pic_ctrl = nlm_rdreg_pic(base, XLP_PIC_CTRL_REG);
+ uint64_t mask0, mask1;
+
+ if (timer > 1 || wrap_around_count > 3)
+ return;
+
+ /* enable watchdog timer interrupt */
+ pic_ctrl |= (((1 << timer) & 0xf));
+
+ if (timer) {
+ if (nmi)
+ pic_ctrl |= (wrap_around_count << XLP_PIC_WWN1_OFFSET);
+ else
+ pic_ctrl |= (wrap_around_count << XLP_PIC_WWN0_OFFSET);
+ } else {
+ if (nmi)
+ pic_ctrl |= (wrap_around_count << XLP_PIC_WWR1_OFFSET);
+ else
+ pic_ctrl |= (wrap_around_count << XLP_PIC_WWR0_OFFSET);
+ }
+
+ mask0 = ((unsigned long long)node1_thrmask << 32) | node0_thrmask;
+ mask1 = ((unsigned long long)node3_thrmask << 32) | node2_thrmask;
+
+ nlm_wreg_pic(base, XLP_PIC_WDOG_MAXVAL_REG(timer), value);
+
+ nlm_wreg_pic(base, XLP_PIC_WDOG_ENABLE0_REG(timer), mask0);
+ nlm_wreg_pic(base, XLP_PIC_WDOG_ENABLE1_REG(timer), mask1);
+
+ nlm_wreg_pic(base, XLP_PIC_CTRL_REG, pic_ctrl);
+}
+
+/* watchdog's need to be "stroked" by heartbeats from vcpus.
+ * On XLP, the heartbeat bit for a specific cpu thread on a specific
+ * node is set according to the following formula:
+ * 32N + 4C + T
+ * where N = node, C=cpu-core number, T=thread number
+ *
+ * src_node = source node of watchdog timer interrupts. These interrupts
+ * get generated from the PIC on src_node.
+ * timer = watchdog timer 0 or 1
+ * node = node for which the hearbeat is being done
+ * cpu = cpu-core for which the hearbeat is being done
+ * thread = h/w thread for which the hearbeat is being done
+ */
+static __inline__ void
+nlm_pic_set_wdog_heartbeat(uint64_t base, int timer, int node, int cpu,
+ int thread)
+{
+ int val = 32 * node + 4 * cpu + thread;
+
+ nlm_wreg_pic(base, XLP_PIC_WDOG_BEATCMD_REG(timer), val);
+}
+
+#endif /* !LOCORE && !__ASSEMBLY__ */
+#endif
diff --git a/sys/mips/nlm/hal/sys.h b/sys/mips/nlm/hal/sys.h
new file mode 100644
index 0000000..89e4c52
--- /dev/null
+++ b/sys/mips/nlm/hal/sys.h
@@ -0,0 +1,125 @@
+/*-
+ * Copyright 2003-2011 Netlogic Microsystems (Netlogic). All rights
+ * reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY Netlogic Microsystems ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL NETLOGIC OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+ * THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * $FreeBSD$
+ * NETLOGIC_BSD */
+
+#ifndef __NLM_SYS_H__
+#define __NLM_SYS_H__
+
+/**
+* @file_name sys.h
+* @author Netlogic Microsystems
+* @brief HAL for System configuration registers
+*/
+#define XLP_SYS_CHIP_RESET_REG 0x40
+#define XLP_SYS_POWER_ON_RESET_REG 0x41
+#define XLP_SYS_EFUSE_DEVICE_CFG_STATUS0_REG 0x42
+#define XLP_SYS_EFUSE_DEVICE_CFG_STATUS1_REG 0x43
+#define XLP_SYS_EFUSE_DEVICE_CFG_STATUS2_REG 0x44
+#define XLP_SYS_EFUSE_DEVICE_CFG3_REG 0x45
+#define XLP_SYS_EFUSE_DEVICE_CFG4_REG 0x46
+#define XLP_SYS_EFUSE_DEVICE_CFG5_REG 0x47
+#define XLP_SYS_EFUSE_DEVICE_CFG6_REG 0x48
+#define XLP_SYS_EFUSE_DEVICE_CFG7_REG 0x49
+#define XLP_SYS_PLL_CTRL_REG 0x4a
+#define XLP_SYS_CPU_RESET_REG 0x4b
+#define XLP_SYS_CPU_NONCOHERENT_MODE_REG 0x4d
+#define XLP_SYS_CORE_DFS_DIS_CTRL_REG 0x4e
+#define XLP_SYS_CORE_DFS_RST_CTRL_REG 0x4f
+#define XLP_SYS_CORE_DFS_BYP_CTRL_REG 0x50
+#define XLP_SYS_CORE_DFS_PHA_CTRL_REG 0x51
+#define XLP_SYS_CORE_DFS_DIV_INC_CTRL_REG 0x52
+#define XLP_SYS_CORE_DFS_DIV_DEC_CTRL_REG 0x53
+#define XLP_SYS_CORE_DFS_DIV_VALUE_REG 0x54
+#define XLP_SYS_RESET_REG 0x55
+#define XLP_SYS_DFS_DIS_CTRL_REG 0x56
+#define XLP_SYS_DFS_RST_CTRL_REG 0x57
+#define XLP_SYS_DFS_BYP_CTRL_REG 0x58
+#define XLP_SYS_DFS_DIV_INC_CTRL_REG 0x59
+#define XLP_SYS_DFS_DIV_DEC_CTRL_REG 0x5a
+#define XLP_SYS_DFS_DIV_VALUE0_REG 0x5b
+#define XLP_SYS_DFS_DIV_VALUE1_REG 0x5c
+#define XLP_SYS_SENSE_AMP_DLY_REG 0x5d
+#define XLP_SYS_SOC_SENSE_AMP_DLY_REG 0x5e
+#define XLP_SYS_CTRL0_REG 0x5f
+#define XLP_SYS_CTRL1_REG 0x60
+#define XLP_SYS_TIMEOUT_BS1_REG 0x61
+#define XLP_SYS_BYTE_SWAP_REG 0x62
+#define XLP_SYS_VRM_VID_REG 0x63
+#define XLP_SYS_PWR_RAM_CMD_REG 0x64
+#define XLP_SYS_PWR_RAM_ADDR_REG 0x65
+#define XLP_SYS_PWR_RAM_DATA0_REG 0x66
+#define XLP_SYS_PWR_RAM_DATA1_REG 0x67
+#define XLP_SYS_PWR_RAM_DATA2_REG 0x68
+#define XLP_SYS_PWR_UCODE_REG 0x69
+#define XLP_SYS_CPU0_PWR_STATUS_REG 0x6a
+#define XLP_SYS_CPU1_PWR_STATUS_REG 0x6b
+#define XLP_SYS_CPU2_PWR_STATUS_REG 0x6c
+#define XLP_SYS_CPU3_PWR_STATUS_REG 0x6d
+#define XLP_SYS_CPU4_PWR_STATUS_REG 0x6e
+#define XLP_SYS_CPU5_PWR_STATUS_REG 0x6f
+#define XLP_SYS_CPU6_PWR_STATUS_REG 0x70
+#define XLP_SYS_CPU7_PWR_STATUS_REG 0x71
+#define XLP_SYS_STATUS_REG 0x72
+#define XLP_SYS_INT_POL_REG 0x73
+#define XLP_SYS_INT_TYPE_REG 0x74
+#define XLP_SYS_INT_STATUS_REG 0x75
+#define XLP_SYS_INT_MASK0_REG 0x76
+#define XLP_SYS_INT_MASK1_REG 0x77
+#define XLP_SYS_UCO_S_ECC_REG 0x78
+#define XLP_SYS_UCO_M_ECC_REG 0x79
+#define XLP_SYS_UCO_ADDR_REG 0x7a
+#define XLP_SYS_UCO_INSTR_REG 0x7b
+#define XLP_SYS_MEM_BIST0_REG 0x7c
+#define XLP_SYS_MEM_BIST1_REG 0x7d
+#define XLP_SYS_MEM_BIST2_REG 0x7e
+#define XLP_SYS_MEM_BIST3_REG 0x7f
+#define XLP_SYS_MEM_BIST4_REG 0x80
+#define XLP_SYS_MEM_BIST5_REG 0x81
+#define XLP_SYS_MEM_BIST6_REG 0x82
+#define XLP_SYS_MEM_BIST7_REG 0x83
+#define XLP_SYS_MEM_BIST8_REG 0x84
+#define XLP_SYS_MEM_BIST9_REG 0x85
+#define XLP_SYS_MEM_BIST10_REG 0x86
+#define XLP_SYS_MEM_BIST11_REG 0x87
+#define XLP_SYS_MEM_BIST12_REG 0x88
+#define XLP_SYS_SCRTCH0_REG 0x89
+#define XLP_SYS_SCRTCH1_REG 0x8a
+#define XLP_SYS_SCRTCH2_REG 0x8b
+#define XLP_SYS_SCRTCH3_REG 0x8c
+
+#if !defined(LOCORE) && !defined(__ASSEMBLY__)
+
+#define nlm_rdreg_sys(b, r) nlm_read_reg_kseg(b,r)
+#define nlm_wreg_sys(b, r, v) nlm_write_reg_kseg(b,r,v)
+#define nlm_pcibase_sys(node) nlm_pcicfg_base(XLP_IO_SYS_OFFSET(node))
+#define nlm_regbase_sys(node) nlm_pcibase_sys(node)
+
+#endif
+
+#endif
diff --git a/sys/mips/nlm/hal/uart.h b/sys/mips/nlm/hal/uart.h
new file mode 100644
index 0000000..9eebb49
--- /dev/null
+++ b/sys/mips/nlm/hal/uart.h
@@ -0,0 +1,196 @@
+/*-
+ * Copyright 2003-2011 Netlogic Microsystems (Netlogic). All rights
+ * reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY Netlogic Microsystems ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL NETLOGIC OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+ * THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * $FreeBSD$
+ * NETLOGIC_BSD */
+
+#ifndef __XLP_UART_H__
+#define __XLP_UART_H__
+
+/* UART Specific registers */
+#define XLP_UART_RX_DATA_REG 0x40
+#define XLP_UART_TX_DATA_REG 0x40
+
+#define XLP_UART_INT_EN_REG 0x41
+#define XLP_UART_INT_ID_REG 0x42
+#define XLP_UART_FIFO_CTL_REG 0x42
+#define XLP_UART_LINE_CTL_REG 0x43
+#define XLP_UART_MODEM_CTL_REG 0x44
+#define XLP_UART_LINE_STS_REG 0x45
+#define XLP_UART_MODEM_STS_REG 0x46
+
+#define XLP_UART_DIVISOR0_REG 0x40
+#define XLP_UART_DIVISOR1_REG 0x41
+
+#define XLP_UART_BASE_BAUD (133000000/16)
+#define XLP_UART_BAUD_DIVISOR(baud) (XLP_UART_BASE_BAUD / baud)
+
+/* LCR mask values */
+#define LCR_5BITS 0x00
+#define LCR_6BITS 0x01
+#define LCR_7BITS 0x02
+#define LCR_8BITS 0x03
+#define LCR_STOPB 0x04
+#define LCR_PENAB 0x08
+#define LCR_PODD 0x00
+#define LCR_PEVEN 0x10
+#define LCR_PONE 0x20
+#define LCR_PZERO 0x30
+#define LCR_SBREAK 0x40
+#define LCR_EFR_ENABLE 0xbf
+#define LCR_DLAB 0x80
+
+/* MCR mask values */
+#define MCR_DTR 0x01
+#define MCR_RTS 0x02
+#define MCR_DRS 0x04
+#define MCR_IE 0x08
+#define MCR_LOOPBACK 0x10
+
+/* FCR mask values */
+#define FCR_RCV_RST 0x02
+#define FCR_XMT_RST 0x04
+#define FCR_RX_LOW 0x00
+#define FCR_RX_MEDL 0x40
+#define FCR_RX_MEDH 0x80
+#define FCR_RX_HIGH 0xc0
+
+/* IER mask values */
+#define IER_ERXRDY 0x1
+#define IER_ETXRDY 0x2
+#define IER_ERLS 0x4
+#define IER_EMSC 0x8
+
+/* uart IRQ info */
+#define XLP_NODE0_UART0_IRQ 17
+#define XLP_NODE1_UART0_IRQ 18
+#define XLP_NODE2_UART0_IRQ 19
+#define XLP_NODE3_UART0_IRQ 20
+#define XLP_NODE0_UART1_IRQ 21
+#define XLP_NODE1_UART1_IRQ 22
+#define XLP_NODE2_UART1_IRQ 23
+#define XLP_NODE3_UART1_IRQ 24
+
+#if !defined(LOCORE) && !defined(__ASSEMBLY__)
+
+#define nlm_rdreg_uart(b, r) nlm_read_reg_kseg(b,r)
+#define nlm_wreg_uart(b, r, v) nlm_write_reg_kseg(b,r,v)
+#define nlm_pcibase_uart(node, inst) nlm_pcicfg_base(XLP_IO_UART_OFFSET(node, inst))
+#define nlm_regbase_uart(node, inst) nlm_pcibase_uart(node, inst)
+
+static __inline__ void
+nlm_uart_set_baudrate(uint64_t base, int baud)
+{
+ uint32_t lcr;
+
+ lcr = nlm_rdreg_uart(base, XLP_UART_LINE_CTL_REG);
+
+ /* enable divisor register, and write baud values */
+ nlm_wreg_uart(base, XLP_UART_LINE_CTL_REG, lcr | (1 << 7));
+ nlm_wreg_uart(base, XLP_UART_DIVISOR0_REG,
+ (XLP_UART_BAUD_DIVISOR(baud) & 0xff));
+ nlm_wreg_uart(base, XLP_UART_DIVISOR1_REG,
+ ((XLP_UART_BAUD_DIVISOR(baud) >> 8) & 0xff));
+
+ /* restore default lcr */
+ nlm_wreg_uart(base, XLP_UART_LINE_CTL_REG, lcr);
+}
+
+static __inline__ void
+nlm_outbyte (uint64_t base, char c)
+{
+ uint32_t lsr;
+
+ for (;;) {
+ lsr = nlm_rdreg_uart(base, XLP_UART_LINE_STS_REG);
+ if (lsr & 0x20) break;
+ }
+
+ nlm_wreg_uart(base, XLP_UART_TX_DATA_REG, (int)c);
+}
+
+static __inline__ char
+nlm_inbyte (uint64_t base)
+{
+ int data, lsr;
+
+ for(;;) {
+ lsr = nlm_rdreg_uart(base, XLP_UART_LINE_STS_REG);
+ if (lsr & 0x80) { /* parity/frame/break-error - push a zero */
+ data = 0;
+ break;
+ }
+ if (lsr & 0x01) { /* Rx data */
+ data = nlm_rdreg_uart(base, XLP_UART_RX_DATA_REG);
+ break;
+ }
+ }
+
+ return (char)data;
+}
+
+static __inline__ int
+nlm_uart_init(uint64_t base, int baud, int databits, int stopbits,
+ int parity, int int_en, int loopback)
+{
+ uint32_t lcr;
+
+ lcr = 0;
+ if (databits >= 8)
+ lcr |= LCR_8BITS;
+ else if (databits == 7)
+ lcr |= LCR_7BITS;
+ else if (databits == 6)
+ lcr |= LCR_6BITS;
+ else
+ lcr |= LCR_5BITS;
+
+ if (stopbits > 1)
+ lcr |= LCR_STOPB;
+
+ lcr |= parity << 3;
+
+ /* setup default lcr */
+ nlm_wreg_uart(base, XLP_UART_LINE_CTL_REG, lcr);
+
+ /* Reset the FIFOs */
+ nlm_wreg_uart(base, XLP_UART_LINE_CTL_REG, FCR_RCV_RST | FCR_XMT_RST);
+
+ nlm_uart_set_baudrate(base, baud);
+
+ if (loopback)
+ nlm_wreg_uart(base, XLP_UART_MODEM_CTL_REG, 0x1f);
+
+ if (int_en)
+ nlm_wreg_uart(base, XLP_UART_INT_EN_REG, IER_ERXRDY | IER_ETXRDY);
+
+ return 0;
+}
+
+#endif /* !LOCORE && !__ASSEMBLY__ */
+#endif /* __XLP_UART_H__ */
+
diff --git a/sys/mips/nlm/interrupt.h b/sys/mips/nlm/interrupt.h
new file mode 100644
index 0000000..41904eb
--- /dev/null
+++ b/sys/mips/nlm/interrupt.h
@@ -0,0 +1,49 @@
+/*-
+ * Copyright 2003-2011 Netlogic Microsystems (Netlogic). All rights
+ * reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY Netlogic Microsystems ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL NETLOGIC OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+ * THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * $FreeBSD$
+ * NETLOGIC_BSD */
+
+#ifndef _RMI_INTERRUPT_H_
+#define _RMI_INTERRUPT_H_
+
+/* Defines for the IRQ numbers */
+
+#define IRQ_IPI 41 /* 8-39 are mapped by PIC intr 0-31 */
+#define IRQ_MSGRING 6
+#define IRQ_TIMER 7
+
+/*
+ * XLR needs custom pre and post handlers for PCI/PCI-e interrupts
+ * XXX: maybe follow i386 intsrc model
+ */
+void xlp_establish_intr(const char *name, driver_filter_t filt,
+ driver_intr_t handler, void *arg, int irq, int flags,
+ void **cookiep, void (*busack)(int));
+void xlp_enable_irq(int irq);
+
+#endif /* _RMI_INTERRUPT_H_ */
diff --git a/sys/mips/nlm/intr_machdep.c b/sys/mips/nlm/intr_machdep.c
new file mode 100644
index 0000000..4862356
--- /dev/null
+++ b/sys/mips/nlm/intr_machdep.c
@@ -0,0 +1,253 @@
+/*-
+ * Copyright 2003-2011 Netlogic Microsystems (Netlogic). All rights
+ * reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY Netlogic Microsystems ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL NETLOGIC OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+ * THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * NETLOGIC_BSD */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+#include <sys/param.h>
+#include <sys/systm.h>
+#include <sys/bus.h>
+#include <sys/interrupt.h>
+#include <sys/kernel.h>
+
+#include <machine/cpu.h>
+#include <machine/cpufunc.h>
+#include <machine/cpuinfo.h>
+#include <machine/cpuregs.h>
+#include <machine/frame.h>
+#include <machine/intr_machdep.h>
+#include <machine/md_var.h>
+#include <machine/trap.h>
+#include <machine/hwfunc.h>
+
+#include <mips/nlm/hal/mmio.h>
+#include <mips/nlm/hal/iomap.h>
+#include <mips/nlm/hal/cop0.h>
+#include <mips/nlm/interrupt.h>
+#include <mips/nlm/hal/pic.h>
+#include <mips/nlm/xlp.h>
+
+struct xlp_intrsrc {
+ void (*busack)(int); /* Additional ack */
+ struct intr_event *ie; /* event corresponding to intr */
+ int irq;
+};
+
+static struct xlp_intrsrc xlp_interrupts[XLR_MAX_INTR];
+static mips_intrcnt_t mips_intr_counters[XLR_MAX_INTR];
+static int intrcnt_index;
+
+void
+xlp_enable_irq(int irq)
+{
+ uint64_t eimr;
+
+ eimr = nlm_read_c0_eimr();
+ nlm_write_c0_eimr(eimr | (1ULL << irq));
+}
+
+void
+cpu_establish_softintr(const char *name, driver_filter_t * filt,
+ void (*handler) (void *), void *arg, int irq, int flags,
+ void **cookiep)
+{
+
+ panic("Soft interrupts unsupported!\n");
+}
+
+void
+cpu_establish_hardintr(const char *name, driver_filter_t * filt,
+ void (*handler) (void *), void *arg, int irq, int flags,
+ void **cookiep)
+{
+
+ xlp_establish_intr(name, filt, handler, arg, irq, flags,
+ cookiep, NULL);
+}
+
+static void
+xlp_post_filter(void *source)
+{
+ struct xlp_intrsrc *src = source;
+
+ if (src->busack)
+ src->busack(src->irq);
+ nlm_pic_ack(xlp_pic_base, xlp_irq_to_irt(src->irq));
+}
+
+static void
+xlp_pre_ithread(void *source)
+{
+ struct xlp_intrsrc *src = source;
+
+ if (src->busack)
+ src->busack(src->irq);
+}
+
+static void
+xlp_post_ithread(void *source)
+{
+ struct xlp_intrsrc *src = source;
+
+ nlm_pic_ack(xlp_pic_base, xlp_irq_to_irt(src->irq));
+}
+
+void
+xlp_establish_intr(const char *name, driver_filter_t filt,
+ driver_intr_t handler, void *arg, int irq, int flags,
+ void **cookiep, void (*busack)(int))
+{
+ struct intr_event *ie; /* descriptor for the IRQ */
+ struct xlp_intrsrc *src = NULL;
+ int errcode;
+
+ if (irq < 0 || irq > XLR_MAX_INTR)
+ panic("%s called for unknown hard intr %d", __func__, irq);
+
+ /*
+ * FIXME locking - not needed now, because we do this only on
+ * startup from CPU0
+ */
+ src = &xlp_interrupts[irq];
+ ie = src->ie;
+ if (ie == NULL) {
+ /*
+ * PIC based interrupts need ack in PIC, and some SoC
+ * components need additional acks (e.g. PCI)
+ */
+ if (xlp_irq_is_picintr(irq))
+ errcode = intr_event_create(&ie, src, 0, irq,
+ xlp_pre_ithread, xlp_post_ithread, xlp_post_filter,
+ NULL, "hard intr%d:", irq);
+ else {
+ if (filt == NULL)
+ panic("Not supported - non filter percpu intr");
+ errcode = intr_event_create(&ie, src, 0, irq,
+ NULL, NULL, NULL, NULL, "hard intr%d:", irq);
+ }
+ if (errcode) {
+ printf("Could not create event for intr %d\n", irq);
+ return;
+ }
+ src->irq = irq;
+ src->busack = busack;
+ src->ie = ie;
+ }
+ intr_event_add_handler(ie, name, filt, handler, arg,
+ intr_priority(flags), flags, cookiep);
+ xlp_enable_irq(irq);
+}
+
+void
+cpu_intr(struct trapframe *tf)
+{
+ struct intr_event *ie;
+ uint64_t eirr, eimr;
+ int i;
+
+ critical_enter();
+
+ /* find a list of enabled interrupts */
+ eirr = nlm_read_c0_eirr();
+ eimr = nlm_read_c0_eimr();
+ eirr &= eimr;
+
+ if (eirr == 0) {
+ critical_exit();
+ return;
+ }
+ /*
+ * No need to clear the EIRR here as the handler writes to
+ * compare which ACKs the interrupt.
+ */
+ if (eirr & (1 << IRQ_TIMER)) {
+ intr_event_handle(xlp_interrupts[IRQ_TIMER].ie, tf);
+ critical_exit();
+ return;
+ }
+
+ /* FIXME sched pin >? LOCK>? */
+ for (i = sizeof(eirr) * 8 - 1; i >= 0; i--) {
+ if ((eirr & (1ULL << i)) == 0)
+ continue;
+
+ ie = xlp_interrupts[i].ie;
+ /* Don't account special IRQs */
+ switch (i) {
+ case IRQ_IPI:
+ case IRQ_MSGRING:
+ break;
+ default:
+ mips_intrcnt_inc(mips_intr_counters[i]);
+ }
+
+ /* Ack the IRQ on the CPU */
+ nlm_write_c0_eirr(1ULL << i);
+ if (intr_event_handle(ie, tf) != 0) {
+ printf("stray interrupt %d\n", i);
+ }
+ }
+ critical_exit();
+}
+
+void
+mips_intrcnt_setname(mips_intrcnt_t counter, const char *name)
+{
+ int idx = counter - intrcnt;
+
+ KASSERT(counter != NULL, ("mips_intrcnt_setname: NULL counter"));
+
+ snprintf(intrnames + (MAXCOMLEN + 1) * idx,
+ MAXCOMLEN + 1, "%-*s", MAXCOMLEN, name);
+}
+
+mips_intrcnt_t
+mips_intrcnt_create(const char* name)
+{
+ mips_intrcnt_t counter = &intrcnt[intrcnt_index++];
+
+ mips_intrcnt_setname(counter, name);
+ return counter;
+}
+
+void
+cpu_init_interrupts()
+{
+ int i;
+ char name[MAXCOMLEN + 1];
+
+ /*
+ * Initialize all available vectors so spare IRQ
+ * would show up in systat output
+ */
+ for (i = 0; i < XLR_MAX_INTR; i++) {
+ snprintf(name, MAXCOMLEN + 1, "int%d:", i);
+ mips_intr_counters[i] = mips_intrcnt_create(name);
+ }
+}
diff --git a/sys/mips/nlm/iodi.c b/sys/mips/nlm/iodi.c
new file mode 100644
index 0000000..3b372bb
--- /dev/null
+++ b/sys/mips/nlm/iodi.c
@@ -0,0 +1,233 @@
+/*-
+ * Copyright 2003-2011 Netlogic Microsystems (Netlogic). All rights
+ * reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY Netlogic Microsystems ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL NETLOGIC OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+ * THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * NETLOGIC_BSD */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+#define __RMAN_RESOURCE_VISIBLE
+#include <sys/param.h>
+#include <sys/systm.h>
+#include <sys/bus.h>
+#include <sys/interrupt.h>
+#include <sys/kernel.h>
+#include <sys/lock.h>
+#include <sys/malloc.h>
+#include <sys/module.h>
+#include <sys/mutex.h>
+#include <sys/reboot.h>
+#include <sys/rman.h>
+
+#include <vm/vm.h>
+#include <vm/vm_param.h>
+#include <vm/pmap.h>
+
+#include <machine/cpu.h>
+#include <machine/bus.h>
+#include <machine/intr_machdep.h>
+
+#include <mips/nlm/hal/mmio.h>
+#include <mips/nlm/hal/iomap.h>
+#include <mips/nlm/hal/pic.h>
+#include <mips/nlm/hal/uart.h>
+#include <mips/nlm/hal/cop2.h>
+#include <mips/nlm/hal/fmn.h>
+
+#include <mips/nlm/msgring.h>
+#include <mips/nlm/xlp.h>
+#include <mips/nlm/board.h>
+
+extern void iodi_activateirqs(void);
+
+extern bus_space_tag_t uart_bus_space_mem;
+
+static struct resource *iodi_alloc_resource(device_t, device_t, int, int *,
+ u_long, u_long, u_long, u_int);
+
+static int iodi_activate_resource(device_t, device_t, int, int,
+ struct resource *);
+struct iodi_softc *iodi_softc; /* There can be only one. */
+
+static int
+iodi_setup_intr(device_t dev, device_t child,
+ struct resource *ires, int flags, driver_filter_t *filt,
+ driver_intr_t *intr, void *arg, void **cookiep)
+{
+ const char *name = device_get_name(child);
+ int unit = device_get_unit(child);
+
+ if (strcmp(name, "uart") == 0) {
+ /* Note: in xlp, all pic interrupts are level triggered */
+ nlm_pic_write_irt_id(xlp_pic_base, XLP_PIC_IRT_UART0_INDEX, 1, 0,
+ xlp_irt_to_irq(XLP_PIC_IRT_UART0_INDEX), 0, 0, 0x1);
+
+ cpu_establish_hardintr("uart", filt, intr, arg,
+ xlp_irt_to_irq(XLP_PIC_IRT_UART0_INDEX), flags, cookiep);
+ } else if (strcmp(name, "ehci") == 0) {
+ if (unit == 0) {
+ nlm_pic_write_irt_id(xlp_pic_base, XLP_PIC_IRT_EHCI0_INDEX, 1, 0,
+ xlp_irt_to_irq(XLP_PIC_IRT_EHCI0_INDEX), 0, 0, 0x1);
+
+ cpu_establish_hardintr("ehci0", filt, intr, arg,
+ xlp_irt_to_irq(XLP_PIC_IRT_EHCI0_INDEX), flags, cookiep);
+ } else if (unit == 1) {
+ nlm_pic_write_irt_id(xlp_pic_base, XLP_PIC_IRT_EHCI1_INDEX, 1, 0,
+ xlp_irt_to_irq(XLP_PIC_IRT_EHCI1_INDEX), 0, 0, 0x1);
+
+ cpu_establish_hardintr("ehci1", filt, intr, arg,
+ xlp_irt_to_irq(XLP_PIC_IRT_EHCI1_INDEX), flags, cookiep);
+
+ }
+ } else if (strcmp(name, "xlp_sdhci") == 0) {
+ nlm_pic_write_irt_id(xlp_pic_base, XLP_PIC_IRT_MMC_INDEX, 1, 0,
+ xlp_irt_to_irq(XLP_PIC_IRT_MMC_INDEX), 0, 0, 0x1);
+
+ cpu_establish_hardintr("xlp_sdhci", filt, intr, arg,
+ xlp_irt_to_irq(XLP_PIC_IRT_MMC_INDEX), flags, cookiep);
+
+ }
+
+ return (0);
+}
+
+static struct resource *
+iodi_alloc_resource(device_t bus, device_t child, int type, int *rid,
+ u_long start, u_long end, u_long count, u_int flags)
+{
+ struct resource *res = malloc(sizeof(*res), M_DEVBUF, M_WAITOK);
+ const char *name = device_get_name(child);
+ int unit;
+
+ switch (type) {
+ case SYS_RES_IRQ:
+ device_printf(bus, "IRQ resource - for %s %lx-%lx\n",
+ device_get_nameunit(child), start, end);
+ break;
+
+ case SYS_RES_IOPORT:
+ device_printf(bus, "IOPORT resource - for %s %lx-%lx\n",
+ device_get_nameunit(child), start, end);
+ break;
+
+ case SYS_RES_MEMORY:
+ device_printf(bus, "MEMORY resource - for %s %lx-%lx\n",
+ device_get_nameunit(child), start, end);
+ break;
+ }
+
+ unit = device_get_unit(child);
+ if (strcmp(name, "uart") == 0) {
+ if (unit == 0) {
+ res->r_bushandle = nlm_regbase_uart(0, 0) + XLP_IO_PCI_HDRSZ;
+ } else if ( unit == 1) {
+ res->r_bushandle = nlm_regbase_uart(0, 1) + XLP_IO_PCI_HDRSZ;
+ } else
+ printf("%s: Unknown uart unit\n", __FUNCTION__);
+
+ res->r_bustag = uart_bus_space_mem;
+ }
+
+ return (res);
+}
+
+static int
+iodi_activate_resource(device_t bus, device_t child, int type, int rid,
+ struct resource *r)
+{
+ return (0);
+}
+/* prototypes */
+static int iodi_probe(device_t);
+static int iodi_attach(device_t);
+static void iodi_identify(driver_t *, device_t);
+
+int
+iodi_probe(device_t dev)
+{
+ return 0;
+}
+
+void
+iodi_identify(driver_t *driver, device_t parent)
+{
+
+ BUS_ADD_CHILD(parent, 0, "iodi", 0);
+}
+
+
+int
+iodi_attach(device_t dev)
+{
+ device_t tmpd;
+ char desc[32];
+ int i;
+
+ device_printf(dev, "IODI - Initialize message ring.\n");
+ xlp_msgring_iodi_config();
+
+ /*
+ * Attach each devices
+ */
+ device_add_child(dev, "uart", 0);
+ device_add_child(dev, "xlp_i2c", 0);
+ device_add_child(dev, "xlp_i2c", 1);
+ device_add_child(dev, "ehci", 0);
+ device_add_child(dev, "ehci", 1);
+ device_add_child(dev, "xlp_sdhci", 0);
+
+ for (i=0; i < XLP_NUM_NODES; i++) {
+ tmpd = device_add_child(dev, "xlpnae", i);
+ device_set_ivars(tmpd, &xlp_board_info.nodes[i].nae_ivars);
+ snprintf(desc, sizeof(desc), "XLP NAE %d", i);
+ device_set_desc_copy(tmpd, desc);
+ }
+
+ bus_generic_probe(dev);
+ bus_generic_attach(dev);
+ return 0;
+}
+
+static device_method_t iodi_methods[] = {
+ DEVMETHOD(device_probe, iodi_probe),
+ DEVMETHOD(device_attach, iodi_attach),
+ DEVMETHOD(device_identify, iodi_identify),
+ DEVMETHOD(bus_alloc_resource, iodi_alloc_resource),
+ DEVMETHOD(bus_activate_resource, iodi_activate_resource),
+ DEVMETHOD(bus_add_child, bus_generic_add_child),
+ DEVMETHOD(bus_setup_intr, iodi_setup_intr),
+ {0, 0},
+};
+
+static driver_t iodi_driver = {
+ "iodi",
+ iodi_methods,
+ 1 /* no softc */
+};
+static devclass_t iodi_devclass;
+
+DRIVER_MODULE(iodi, nexus, iodi_driver, iodi_devclass, 0, 0);
diff --git a/sys/mips/nlm/mpreset.S b/sys/mips/nlm/mpreset.S
new file mode 100644
index 0000000..c56bd9f
--- /dev/null
+++ b/sys/mips/nlm/mpreset.S
@@ -0,0 +1,159 @@
+/*-
+ * Copyright 2003-2011 Netlogic Microsystems (Netlogic). All rights
+ * reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY Netlogic Microsystems ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL NETLOGIC OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+ * THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * $FreeBSD$
+ * NETLOGIC_BSD */
+
+#include <machine/asm.h>
+#include <machine/cpu.h>
+#include <machine/cpuregs.h>
+#include <mips/nlm/hal/iomap.h>
+#include <mips/nlm/hal/sys.h>
+#include <mips/nlm/hal/cpucontrol.h>
+
+#include "assym.s"
+
+ .text
+ .set noat
+ .set noreorder
+ .set mips64
+
+VECTOR(XLPResetEntry, unknown)
+ mfc0 t0, MIPS_COP_0_STATUS
+ li t1, 0x80000
+ and t1, t0, t1
+ bnez t1, nmi_handler
+ nop
+
+#ifdef SMP
+ /* Reset entry for secordary cores */
+ mfc0 t0, MIPS_COP_0_PRID, 1
+ srl t0, t0, 2 /* discard thread id */
+ andi t0, t0, 0x7 /* core id */
+ li t1, 1
+ sll t0, t1, t0
+ nor t0, t0, zero /* mask with core id bit clear */
+
+ /* clear CPU non-coherent bit */
+ li t2, XLP_DEFAULT_IO_BASE_KSEG1 + XLP_IO_SYS_OFFSET(0) + XLP_SYS_CPU_NONCOHERENT_MODE_REG * 4
+ lw t1, 0(t2)
+ and t1, t1, t0
+ sw t1, 0(t2)
+ lw t1, 0(t2) /* read-back ensures operation complete */
+ sync
+
+ dla t2, mpentry
+ jr t2
+ nop
+#endif
+ nop
+ /* NOT REACHED */
+VECTOR_END(XLPResetEntry)
+
+
+ /* Not yet */
+nmi_handler:
+ nop
+ nop
+ j nmi_handler
+
+#ifdef SMP
+ /*
+ * Enable other threads in the core, called from thread 0
+ * of the core
+ */
+LEAF(xlp_enable_threads)
+ /*
+ * Save and restore callee saved registers of all ABIs
+ * Enabling threads trashes the registers
+ */
+ dmtc0 sp, $4, 2 /* SP saved in UserLocal */
+ ori sp, sp, 0x7
+ xori sp, sp, 0x7 /* align 64 bit */
+ addiu sp, sp, -128
+ mfc0 t1, MIPS_COP_0_STATUS
+ sd s0, 0(sp)
+ sd s1, 8(sp)
+ sd s2, 16(sp)
+ sd s3, 24(sp)
+ sd s4, 32(sp)
+ sd s5, 40(sp)
+ sd s6, 48(sp)
+ sd s7, 56(sp)
+ sd s8, 64(sp)
+ sd t1, 72(sp)
+ sd gp, 80(sp)
+ sd ra, 88(sp)
+ /* Use register number to work in o32 and n32 */
+ li $9, ((XLP_CPU_BLOCKID_MAP << 8) | XLP_BLKID_MAP_THREADMODE)
+ move $8, a0
+ sync
+ .word 0x71280019 /* mtcr t0, t1*/
+ mfc0 t0, MIPS_COP_0_PRID, 1
+ andi t0, 0x3
+ beqz t0, 2f
+ nop
+ dla t1, mpentry /* child thread, go to hardware init */
+ jr t1
+ nop
+
+
+2: /*
+ * Parent hardware thread, restore registers, return
+ */
+#if 1
+ /*
+ * A0 Errata - Write MMU_SETUP after changing thread mode register.
+ */
+ li $9, 0x400
+ li $8, 0
+ .word 0x71280019 /* mtcr $8, $9*/
+ .word 0x000000c0 /* ehb */
+#endif
+ dmfc0 t0, $4, 2 /* SP saved in UserLocal */
+ ori sp, t0, 0x7
+ xori sp, sp, 0x7 /* align 64 bit */
+ addiu sp, sp, -128
+ ld s0, 0(sp)
+ ld s1, 8(sp)
+ ld s2, 16(sp)
+ ld s3, 24(sp)
+ ld s4, 32(sp)
+ ld s5, 40(sp)
+ ld s6, 48(sp)
+ ld s7, 56(sp)
+ ld s8, 64(sp)
+ ld t1, 72(sp)
+ ld gp, 80(sp)
+ ld ra, 88(sp)
+ mfc0 t1, MIPS_COP_0_STATUS
+
+ move sp, t0 /* Restore the real SP */
+ jr ra
+ nop
+END(xlp_enable_threads)
+#endif
diff --git a/sys/mips/nlm/msgring.h b/sys/mips/nlm/msgring.h
new file mode 100644
index 0000000..b951569
--- /dev/null
+++ b/sys/mips/nlm/msgring.h
@@ -0,0 +1,44 @@
+/*-
+ * Copyright 2003-2011 Netlogic Microsystems (Netlogic). All rights
+ * reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY Netlogic Microsystems ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL NETLOGIC OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+ * THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * $FreeBSD$
+ * NETLOGIC_BSD */
+
+/** FIXME **/
+extern uint32_t xlp_msg_thread_mask;
+typedef void (*msgring_handler)(int, int, int, int, struct nlm_fmn_msg *, void *);
+int register_msgring_handler(int startb, int endb, msgring_handler action,
+ void *arg);
+int xlp_handle_msg_vc(int vc, int max_msgs);
+void xlp_msgring_cpu_init(uint32_t);
+void xlp_msgring_config(void);
+void xlp_cpu_msgring_handler(int bucket, int size, int code, int stid,
+ struct nlm_fmn_msg *msg, void *data);
+
+void nlm_cms_credit_setup(int credit);
+void xlp_msgring_iodi_config(void);
+
diff --git a/sys/mips/nlm/std.xlp b/sys/mips/nlm/std.xlp
new file mode 100644
index 0000000..01c9245
--- /dev/null
+++ b/sys/mips/nlm/std.xlp
@@ -0,0 +1,4 @@
+# $FreeBSD$
+files "../nlm/files.xlp"
+cpu CPU_NLM
+
diff --git a/sys/mips/nlm/tick.c b/sys/mips/nlm/tick.c
new file mode 100644
index 0000000..874a252
--- /dev/null
+++ b/sys/mips/nlm/tick.c
@@ -0,0 +1,393 @@
+/*-
+ * Copyright 2003-2011 Netlogic Microsystems (Netlogic). All rights
+ * reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY Netlogic Microsystems ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL NETLOGIC OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+ * THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * NETLOGIC_BSD */
+
+/*
+ * Simple driver for the 32-bit interval counter built in to all
+ * MIPS32 CPUs.
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+#include "opt_cputype.h"
+
+#include <sys/param.h>
+#include <sys/systm.h>
+#include <sys/sysctl.h>
+#include <sys/bus.h>
+#include <sys/kernel.h>
+#include <sys/module.h>
+#include <sys/rman.h>
+#include <sys/power.h>
+#include <sys/smp.h>
+#include <sys/time.h>
+#include <sys/timeet.h>
+#include <sys/timetc.h>
+
+#include <machine/hwfunc.h>
+#include <machine/clock.h>
+#include <machine/locore.h>
+#include <machine/md_var.h>
+#include <machine/intr_machdep.h>
+
+#include <mips/nlm/interrupt.h>
+
+uint64_t counter_freq;
+
+struct timecounter *platform_timecounter;
+
+static DPCPU_DEFINE(uint32_t, cycles_per_tick);
+static uint32_t cycles_per_usec;
+
+static DPCPU_DEFINE(volatile uint32_t, counter_upper);
+static DPCPU_DEFINE(volatile uint32_t, counter_lower_last);
+static DPCPU_DEFINE(uint32_t, compare_ticks);
+static DPCPU_DEFINE(uint32_t, lost_ticks);
+
+struct clock_softc {
+ int intr_rid;
+ struct resource *intr_res;
+ void *intr_handler;
+ struct timecounter tc;
+ struct eventtimer et;
+};
+static struct clock_softc *softc;
+
+/*
+ * Device methods
+ */
+static int clock_probe(device_t);
+static void clock_identify(driver_t *, device_t);
+static int clock_attach(device_t);
+static unsigned counter_get_timecount(struct timecounter *tc);
+
+void
+mips_timer_early_init(uint64_t clock_hz)
+{
+ /* Initialize clock early so that we can use DELAY sooner */
+ counter_freq = clock_hz;
+ cycles_per_usec = (clock_hz / (1000 * 1000));
+}
+
+void
+platform_initclocks(void)
+{
+
+ if (platform_timecounter != NULL)
+ tc_init(platform_timecounter);
+}
+
+static uint64_t
+tick_ticker(void)
+{
+ uint64_t ret;
+ uint32_t ticktock;
+ uint32_t t_lower_last, t_upper;
+
+ /*
+ * Disable preemption because we are working with cpu specific data.
+ */
+ critical_enter();
+
+ /*
+ * Note that even though preemption is disabled, interrupts are
+ * still enabled. In particular there is a race with clock_intr()
+ * reading the values of 'counter_upper' and 'counter_lower_last'.
+ *
+ * XXX this depends on clock_intr() being executed periodically
+ * so that 'counter_upper' and 'counter_lower_last' are not stale.
+ */
+ do {
+ t_upper = DPCPU_GET(counter_upper);
+ t_lower_last = DPCPU_GET(counter_lower_last);
+ } while (t_upper != DPCPU_GET(counter_upper));
+
+ ticktock = mips_rd_count();
+
+ critical_exit();
+
+ /* COUNT register wrapped around */
+ if (ticktock < t_lower_last)
+ t_upper++;
+
+ ret = ((uint64_t)t_upper << 32) | ticktock;
+ return (ret);
+}
+
+void
+mips_timer_init_params(uint64_t platform_counter_freq, int double_count)
+{
+
+ /*
+ * XXX: Do not use printf here: uart code 8250 may use DELAY so this
+ * function should be called before cninit.
+ */
+ counter_freq = platform_counter_freq;
+ /*
+ * XXX: Some MIPS32 cores update the Count register only every two
+ * pipeline cycles.
+ * We know this because of status registers in CP0, make it automatic.
+ */
+ if (double_count != 0)
+ counter_freq /= 2;
+
+ cycles_per_usec = counter_freq / (1 * 1000 * 1000);
+ set_cputicker(tick_ticker, counter_freq, 1);
+}
+
+static int
+sysctl_machdep_counter_freq(SYSCTL_HANDLER_ARGS)
+{
+ int error;
+ uint64_t freq;
+
+ if (softc == NULL)
+ return (EOPNOTSUPP);
+ freq = counter_freq;
+ error = sysctl_handle_64(oidp, &freq, sizeof(freq), req);
+ if (error == 0 && req->newptr != NULL) {
+ counter_freq = freq;
+ softc->et.et_frequency = counter_freq;
+ softc->tc.tc_frequency = counter_freq;
+ }
+ return (error);
+}
+
+SYSCTL_PROC(_machdep, OID_AUTO, counter_freq, CTLTYPE_U64 | CTLFLAG_RW,
+ NULL, 0, sysctl_machdep_counter_freq, "QU",
+ "Timecounter frequency in Hz");
+
+static unsigned
+counter_get_timecount(struct timecounter *tc)
+{
+
+ return (mips_rd_count());
+}
+
+/*
+ * Wait for about n microseconds (at least!).
+ */
+void
+DELAY(int n)
+{
+ uint32_t cur, last, delta, usecs;
+
+ /*
+ * This works by polling the timer and counting the number of
+ * microseconds that go by.
+ */
+ last = mips_rd_count();
+ delta = usecs = 0;
+
+ while (n > usecs) {
+ cur = mips_rd_count();
+
+ /* Check to see if the timer has wrapped around. */
+ if (cur < last)
+ delta += cur + (0xffffffff - last) + 1;
+ else
+ delta += cur - last;
+
+ last = cur;
+
+ if (delta >= cycles_per_usec) {
+ usecs += delta / cycles_per_usec;
+ delta %= cycles_per_usec;
+ }
+ }
+}
+
+static int
+clock_start(struct eventtimer *et,
+ struct bintime *first, struct bintime *period)
+{
+ uint32_t fdiv, div, next;
+
+ if (period != NULL) {
+ div = (et->et_frequency * (period->frac >> 32)) >> 32;
+ if (period->sec != 0)
+ div += et->et_frequency * period->sec;
+ } else
+ div = 0;
+ if (first != NULL) {
+ fdiv = (et->et_frequency * (first->frac >> 32)) >> 32;
+ if (first->sec != 0)
+ fdiv += et->et_frequency * first->sec;
+ } else
+ fdiv = div;
+ DPCPU_SET(cycles_per_tick, div);
+ next = mips_rd_count() + fdiv;
+ DPCPU_SET(compare_ticks, next);
+ mips_wr_compare(next);
+ return (0);
+}
+
+static int
+clock_stop(struct eventtimer *et)
+{
+
+ DPCPU_SET(cycles_per_tick, 0);
+ mips_wr_compare(0xffffffff);
+ return (0);
+}
+
+/*
+ * Device section of file below
+ */
+static int
+clock_intr(void *arg)
+{
+ struct clock_softc *sc = (struct clock_softc *)arg;
+ uint32_t cycles_per_tick;
+ uint32_t count, compare_last, compare_next, lost_ticks;
+
+ cycles_per_tick = DPCPU_GET(cycles_per_tick);
+ /*
+ * Set next clock edge.
+ */
+ count = mips_rd_count();
+ compare_last = DPCPU_GET(compare_ticks);
+ if (cycles_per_tick > 0) {
+ compare_next = count + cycles_per_tick;
+ DPCPU_SET(compare_ticks, compare_next);
+ mips_wr_compare(compare_next);
+ } else /* In one-shot mode timer should be stopped after the event. */
+ mips_wr_compare(0xffffffff);
+
+ /* COUNT register wrapped around */
+ if (count < DPCPU_GET(counter_lower_last)) {
+ DPCPU_SET(counter_upper, DPCPU_GET(counter_upper) + 1);
+ }
+ DPCPU_SET(counter_lower_last, count);
+
+ if (cycles_per_tick > 0) {
+
+ /*
+ * Account for the "lost time" between when the timer interrupt
+ * fired and when 'clock_intr' actually started executing.
+ */
+ lost_ticks = DPCPU_GET(lost_ticks);
+ lost_ticks += count - compare_last;
+
+ /*
+ * If the COUNT and COMPARE registers are no longer in sync
+ * then make up some reasonable value for the 'lost_ticks'.
+ *
+ * This could happen, for e.g., after we resume normal
+ * operations after exiting the debugger.
+ */
+ if (lost_ticks > 2 * cycles_per_tick)
+ lost_ticks = cycles_per_tick;
+
+ while (lost_ticks >= cycles_per_tick) {
+ if (sc->et.et_active)
+ sc->et.et_event_cb(&sc->et, sc->et.et_arg);
+ lost_ticks -= cycles_per_tick;
+ }
+ DPCPU_SET(lost_ticks, lost_ticks);
+ }
+ if (sc->et.et_active)
+ sc->et.et_event_cb(&sc->et, sc->et.et_arg);
+ return (FILTER_HANDLED);
+}
+
+static int
+clock_probe(device_t dev)
+{
+
+ if (device_get_unit(dev) != 0)
+ panic("can't attach more clocks");
+
+ device_set_desc(dev, "Generic MIPS32 ticker");
+ return (0);
+}
+
+static void
+clock_identify(driver_t * drv, device_t parent)
+{
+
+ BUS_ADD_CHILD(parent, 0, "clock", 0);
+}
+
+static int
+clock_attach(device_t dev)
+{
+ struct clock_softc *sc;
+
+ softc = sc = device_get_softc(dev);
+ cpu_establish_hardintr("compare", clock_intr, NULL,
+ sc, IRQ_TIMER, INTR_TYPE_CLK, &sc->intr_handler);
+
+ sc->tc.tc_get_timecount = counter_get_timecount;
+ sc->tc.tc_counter_mask = 0xffffffff;
+ sc->tc.tc_frequency = counter_freq;
+ sc->tc.tc_name = "MIPS32";
+ sc->tc.tc_quality = 800;
+ sc->tc.tc_priv = sc;
+ tc_init(&sc->tc);
+ sc->et.et_name = "MIPS32";
+#if 0
+ sc->et.et_flags = ET_FLAGS_PERIODIC | ET_FLAGS_ONESHOT |
+ ET_FLAGS_PERCPU;
+#endif
+ sc->et.et_flags = ET_FLAGS_PERIODIC | ET_FLAGS_PERCPU;
+ sc->et.et_quality = 800;
+ sc->et.et_frequency = counter_freq;
+ sc->et.et_min_period.sec = 0;
+ sc->et.et_min_period.frac = 0x00004000LLU << 32; /* To be safe. */
+ sc->et.et_max_period.sec = 0xfffffffeU / sc->et.et_frequency;
+ sc->et.et_max_period.frac =
+ ((0xfffffffeLLU << 32) / sc->et.et_frequency) << 32;
+ sc->et.et_start = clock_start;
+ sc->et.et_stop = clock_stop;
+ sc->et.et_priv = sc;
+ et_register(&sc->et);
+ return (0);
+}
+
+static device_method_t clock_methods[] = {
+ /* Device interface */
+ DEVMETHOD(device_probe, clock_probe),
+ DEVMETHOD(device_identify, clock_identify),
+ DEVMETHOD(device_attach, clock_attach),
+ DEVMETHOD(device_detach, bus_generic_detach),
+ DEVMETHOD(device_shutdown, bus_generic_shutdown),
+
+ {0, 0}
+};
+
+static driver_t clock_driver = {
+ "clock",
+ clock_methods,
+ sizeof(struct clock_softc),
+};
+
+static devclass_t clock_devclass;
+
+DRIVER_MODULE(clock, nexus, clock_driver, clock_devclass, 0, 0);
diff --git a/sys/mips/nlm/uart_bus_xlp_iodi.c b/sys/mips/nlm/uart_bus_xlp_iodi.c
new file mode 100644
index 0000000..236900a
--- /dev/null
+++ b/sys/mips/nlm/uart_bus_xlp_iodi.c
@@ -0,0 +1,88 @@
+/*-
+ * Copyright 2003-2011 Netlogic Microsystems (Netlogic). All rights
+ * reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY Netlogic Microsystems ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL NETLOGIC OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+ * THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * NETLOGIC_BSD */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+#include <sys/param.h>
+#include <sys/systm.h>
+#include <sys/bus.h>
+#include <sys/kernel.h>
+#include <sys/module.h>
+#include <sys/lock.h>
+#include <sys/mutex.h>
+#include <sys/rman.h>
+
+#include <machine/bus.h>
+#include <machine/resource.h>
+
+#include <mips/nlm/hal/mmio.h>
+#include <mips/nlm/hal/iomap.h>
+#include <mips/nlm/hal/uart.h>
+
+#include <dev/uart/uart.h>
+#include <dev/uart/uart_bus.h>
+#include <dev/uart/uart_cpu.h>
+
+static int uart_iodi_probe(device_t dev);
+
+static device_method_t uart_iodi_methods[] = {
+ /* Device interface */
+ DEVMETHOD(device_probe, uart_iodi_probe),
+ DEVMETHOD(device_attach, uart_bus_attach),
+ DEVMETHOD(device_detach, uart_bus_detach),
+ {0, 0}
+};
+
+static driver_t uart_iodi_driver = {
+ uart_driver_name,
+ uart_iodi_methods,
+ sizeof(struct uart_softc),
+};
+
+extern SLIST_HEAD(uart_devinfo_list, uart_devinfo) uart_sysdevs;
+
+static int
+uart_iodi_probe(device_t dev)
+{
+ struct uart_softc *sc;
+
+ sc = device_get_softc(dev);
+ sc->sc_sysdev = SLIST_FIRST(&uart_sysdevs);
+ sc->sc_class = &uart_ns8250_class;
+ bcopy(&sc->sc_sysdev->bas, &sc->sc_bas, sizeof(sc->sc_bas));
+ sc->sc_sysdev->bas.bst = rmi_bus_space;
+ sc->sc_sysdev->bas.bsh = nlm_regbase_uart(0, 0) + XLP_IO_PCI_HDRSZ;
+ sc->sc_bas.bst = rmi_bus_space;
+ sc->sc_bas.bsh = nlm_regbase_uart(0, 0) + XLP_IO_PCI_HDRSZ;
+ /* regshft = 2, rclk = 66000000, rid = 0, chan = 0 */
+ return (uart_bus_probe(dev, 2, 133000000, 0, 0));
+}
+
+DRIVER_MODULE(uart, iodi, uart_iodi_driver, uart_devclass, 0, 0);
diff --git a/sys/mips/nlm/uart_cpu_mips_xlp.c b/sys/mips/nlm/uart_cpu_mips_xlp.c
new file mode 100644
index 0000000..07bdd6a
--- /dev/null
+++ b/sys/mips/nlm/uart_cpu_mips_xlp.c
@@ -0,0 +1,89 @@
+/*-
+ * Copyright 2003-2011 Netlogic Microsystems (Netlogic). All rights
+ * reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY Netlogic Microsystems ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL NETLOGIC OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+ * THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * NETLOGIC_BSD */
+
+/*
+ * Skeleton of this file was based on respective code for ARM
+ * code written by Olivier Houchard.
+ */
+/*
+ * XLRMIPS: This file is hacked from arm/...
+ */
+#include "opt_uart.h"
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+#include <sys/param.h>
+#include <sys/systm.h>
+#include <sys/bus.h>
+#include <sys/cons.h>
+#include <sys/kdb.h>
+#include <sys/kernel.h>
+#include <sys/lock.h>
+#include <sys/mutex.h>
+
+#include <machine/bus.h>
+
+#include <dev/uart/uart.h>
+#include <dev/uart/uart_cpu.h>
+
+#include <mips/nlm/hal/mmio.h>
+#include <mips/nlm/hal/iomap.h>
+#include <mips/nlm/hal/uart.h>
+
+bus_space_tag_t uart_bus_space_io;
+bus_space_tag_t uart_bus_space_mem;
+
+int
+uart_cpu_eqres(struct uart_bas *b1, struct uart_bas *b2)
+{
+ return ((b1->bsh == b2->bsh && b1->bst == b2->bst) ? 1 : 0);
+}
+
+
+int
+uart_cpu_getdev(int devtype, struct uart_devinfo *di)
+{
+ di->ops = uart_getops(&uart_ns8250_class);
+ di->bas.chan = 0;
+ di->bas.bst = rmi_bus_space;
+ di->bas.bsh = nlm_regbase_uart(0, 0) + XLP_IO_PCI_HDRSZ;
+
+ di->bas.regshft = 2;
+ /* divisor = rclk / (baudrate * 16); */
+ di->bas.rclk = 133000000;
+ di->baudrate = 115200;
+ di->databits = 8;
+ di->stopbits = 1;
+ di->parity = UART_PARITY_NONE;
+
+ uart_bus_space_io = NULL;
+ uart_bus_space_mem = rmi_bus_space;
+ return (0);
+}
diff --git a/sys/mips/nlm/xlp.h b/sys/mips/nlm/xlp.h
new file mode 100644
index 0000000..5c79aaf
--- /dev/null
+++ b/sys/mips/nlm/xlp.h
@@ -0,0 +1,133 @@
+/*-
+ * Copyright 2003-2011 Netlogic Microsystems (Netlogic). All rights
+ * reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY Netlogic Microsystems ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL NETLOGIC OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+ * THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * $FreeBSD$
+ * NETLOGIC_BSD */
+
+#ifndef __NLM_XLP_H__
+#define __NLM_XLP_H__
+#include <mips/nlm/hal/pic.h>
+
+#define XLP_PIC_IRT_UART0_IRQ 9
+#define XLP_PIC_IRT_UART1_IRQ 10
+
+#define XLP_PIC_IRT_PCIE0_IRQ 11
+#define XLP_PIC_IRT_PCIE1_IRQ 12
+#define XLP_PIC_IRT_PCIE2_IRQ 13
+#define XLP_PIC_IRT_PCIE3_IRQ 14
+
+#define XLP_PIC_IRT_EHCI0_IRQ 39
+#define XLP_PIC_IRT_EHCI1_IRQ 42
+#define XLP_PIC_IRT_MMC_IRQ 43
+
+
+#ifndef LOCORE
+/*
+ * FreeBSD can be started with few threads and cores turned off,
+ * so have a hardware thread id to FreeBSD cpuid mapping.
+ */
+extern int xlp_ncores;
+extern int xlp_threads_per_core;
+extern uint32_t xlp_hw_thread_mask;
+extern int xlp_cpuid_to_hwtid[];
+extern int xlp_hwtid_to_cpuid[];
+#ifdef SMP
+extern void xlp_enable_threads(int code);
+#endif
+
+extern uint64_t xlp_pic_base; /* TODO just for node 0 now */
+
+static __inline__ int
+xlp_irt_to_irq(int irt)
+{
+ switch (irt) {
+ case XLP_PIC_IRT_MMC_INDEX :
+ return XLP_PIC_IRT_MMC_IRQ;
+ case XLP_PIC_IRT_EHCI0_INDEX :
+ return XLP_PIC_IRT_EHCI0_IRQ;
+ case XLP_PIC_IRT_EHCI1_INDEX :
+ return XLP_PIC_IRT_EHCI1_IRQ;
+ case XLP_PIC_IRT_UART0_INDEX :
+ return XLP_PIC_IRT_UART0_IRQ;
+ case XLP_PIC_IRT_UART1_INDEX :
+ return XLP_PIC_IRT_UART1_IRQ;
+ case XLP_PIC_IRT_PCIE_LINK0_INDEX :
+ return XLP_PIC_IRT_PCIE0_IRQ;
+ case XLP_PIC_IRT_PCIE_LINK1_INDEX :
+ return XLP_PIC_IRT_PCIE1_IRQ;
+ case XLP_PIC_IRT_PCIE_LINK2_INDEX :
+ return XLP_PIC_IRT_PCIE2_IRQ;
+ case XLP_PIC_IRT_PCIE_LINK3_INDEX :
+ return XLP_PIC_IRT_PCIE3_IRQ;
+ default: panic("Bad IRT %d\n", irt);
+ }
+}
+
+static __inline__ int
+xlp_irq_to_irt(int irq)
+{
+ switch (irq) {
+ case XLP_PIC_IRT_MMC_IRQ :
+ return XLP_PIC_IRT_MMC_INDEX;
+ case XLP_PIC_IRT_EHCI0_IRQ :
+ return XLP_PIC_IRT_EHCI0_INDEX;
+ case XLP_PIC_IRT_EHCI1_IRQ :
+ return XLP_PIC_IRT_EHCI1_INDEX;
+ case XLP_PIC_IRT_UART0_IRQ :
+ return XLP_PIC_IRT_UART0_INDEX;
+ case XLP_PIC_IRT_UART1_IRQ :
+ return XLP_PIC_IRT_UART1_INDEX;
+ case XLP_PIC_IRT_PCIE0_IRQ :
+ return XLP_PIC_IRT_PCIE_LINK0_INDEX;
+ case XLP_PIC_IRT_PCIE1_IRQ :
+ return XLP_PIC_IRT_PCIE_LINK1_INDEX;
+ case XLP_PIC_IRT_PCIE2_IRQ :
+ return XLP_PIC_IRT_PCIE_LINK2_INDEX;
+ case XLP_PIC_IRT_PCIE3_IRQ :
+ return XLP_PIC_IRT_PCIE_LINK3_INDEX;
+ default: panic("Bad IRQ %d\n", irq);
+ }
+}
+
+static __inline__ int
+xlp_irq_is_picintr(int irq)
+{
+ switch (irq) {
+ case XLP_PIC_IRT_MMC_IRQ : return 1;
+ case XLP_PIC_IRT_EHCI0_IRQ : return 1;
+ case XLP_PIC_IRT_EHCI1_IRQ : return 1;
+ case XLP_PIC_IRT_UART0_IRQ : return 1;
+ case XLP_PIC_IRT_UART1_IRQ : return 1;
+ case XLP_PIC_IRT_PCIE0_IRQ : return 1;
+ case XLP_PIC_IRT_PCIE1_IRQ : return 1;
+ case XLP_PIC_IRT_PCIE2_IRQ : return 1;
+ case XLP_PIC_IRT_PCIE3_IRQ : return 1;
+ default: return 0;
+ }
+}
+#endif /* LOCORE */
+#endif /* __NLM_XLP_H__ */
diff --git a/sys/mips/nlm/xlp_machdep.c b/sys/mips/nlm/xlp_machdep.c
new file mode 100644
index 0000000..6b4bde4
--- /dev/null
+++ b/sys/mips/nlm/xlp_machdep.c
@@ -0,0 +1,665 @@
+/*-
+ * Copyright 2003-2011 Netlogic Microsystems (Netlogic). All rights
+ * reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY Netlogic Microsystems ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL NETLOGIC OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+ * THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * NETLOGIC_BSD */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+#include "opt_ddb.h"
+
+#include <sys/param.h>
+#include <sys/bus.h>
+#include <sys/conf.h>
+#include <sys/rtprio.h>
+#include <sys/systm.h>
+#include <sys/interrupt.h>
+#include <sys/limits.h>
+#include <sys/lock.h>
+#include <sys/malloc.h>
+#include <sys/mutex.h>
+#include <sys/random.h>
+
+#include <sys/cons.h> /* cinit() */
+#include <sys/kdb.h>
+#include <sys/reboot.h>
+#include <sys/queue.h>
+#include <sys/smp.h>
+#include <sys/timetc.h>
+
+#include <vm/vm.h>
+#include <vm/vm_page.h>
+
+#include <machine/cpu.h>
+#include <machine/cpufunc.h>
+#include <machine/cpuinfo.h>
+#include <machine/tlb.h>
+#include <machine/cpuregs.h>
+#include <machine/frame.h>
+#include <machine/hwfunc.h>
+#include <machine/md_var.h>
+#include <machine/asm.h>
+#include <machine/pmap.h>
+#include <machine/trap.h>
+#include <machine/clock.h>
+#include <machine/fls64.h>
+#include <machine/intr_machdep.h>
+#include <machine/smp.h>
+
+#include <mips/nlm/hal/mips-extns.h>
+#include <mips/nlm/hal/mmio.h>
+#include <mips/nlm/hal/iomap.h>
+#include <mips/nlm/hal/cop0.h>
+#include <mips/nlm/hal/sys.h>
+#include <mips/nlm/hal/pic.h>
+#include <mips/nlm/hal/uart.h>
+#include <mips/nlm/hal/mmu.h>
+#include <mips/nlm/hal/bridge.h>
+#include <mips/nlm/hal/cpucontrol.h>
+
+#include <mips/nlm/clock.h>
+#include <mips/nlm/interrupt.h>
+#include <mips/nlm/board.h>
+#include <mips/nlm/xlp.h>
+
+/* 4KB static data aread to keep a copy of the bootload env until
+ the dynamic kenv is setup */
+char boot1_env[4096];
+int xlp_argc;
+char **xlp_argv, **xlp_envp;
+
+uint64_t xlp_cpu_frequency;
+uint64_t nlm_pcicfg_baseaddr = MIPS_PHYS_TO_KSEG1(XLP_DEFAULT_IO_BASE);
+
+int xlp_ncores;
+int xlp_threads_per_core;
+uint32_t xlp_hw_thread_mask;
+int xlp_cpuid_to_hwtid[MAXCPU];
+int xlp_hwtid_to_cpuid[MAXCPU];
+uint64_t xlp_pic_base;
+
+static int xlp_mmuval;
+
+extern uint32_t _end;
+extern char XLPResetEntry[], XLPResetEntryEnd[];
+
+static void
+xlp_setup_core(void)
+{
+ uint64_t reg;
+
+ reg = nlm_mfcr(XLP_LSU_DEFEATURE);
+ /* Enable Unaligned and L2HPE */
+ reg |= (1 << 30) | (1 << 23);
+ /*
+ * Experimental : Enable SUE
+ * Speculative Unmap Enable. Enable speculative L2 cache request for
+ * unmapped access.
+ */
+ reg |= (1ull << 31);
+ /* Clear S1RCM - A0 errata */
+ reg &= ~0xeull;
+ nlm_mtcr(XLP_LSU_DEFEATURE, reg);
+
+ reg = nlm_mfcr(XLP_SCHED_DEFEATURE);
+ /* Experimental: Disable BRU accepting ALU ops - A0 errata */
+ reg |= (1 << 24);
+ nlm_mtcr(XLP_SCHED_DEFEATURE, reg);
+}
+
+static void
+xlp_setup_mmu(void)
+{
+
+ nlm_setup_extended_pagemask(0); /* pagemask = 0 for 4K pages */
+ nlm_large_variable_tlb_en(0);
+ nlm_extended_tlb_en(1);
+ nlm_mmu_setup(0, 0, 0);
+}
+
+static void
+xlp_parse_mmu_options(void)
+{
+ int i, j, k;
+ uint32_t cpu_map = xlp_hw_thread_mask;
+ uint32_t core0_thr_mask, core_thr_mask;
+
+#ifndef SMP /* Uniprocessor! */
+ if (cpu_map != 0x1) {
+ printf("WARNING: Starting uniprocessor kernel on cpumask [0x%lx]!\n"
+ "WARNING: Other CPUs will be unused.\n", (u_long)cpu_map);
+ cpu_map = 0x1;
+ }
+#endif
+
+ xlp_ncores = 1;
+ core0_thr_mask = cpu_map & 0xf;
+ switch (core0_thr_mask) {
+ case 1:
+ xlp_threads_per_core = 1;
+ xlp_mmuval = 0;
+ break;
+ case 3:
+ xlp_threads_per_core = 2;
+ xlp_mmuval = 2;
+ break;
+ case 0xf:
+ xlp_threads_per_core = 4;
+ xlp_mmuval = 3;
+ break;
+ default:
+ goto unsupp;
+ }
+
+ /* Verify other cores CPU masks */
+ for (i = 1; i < XLP_MAX_CORES; i++) {
+ core_thr_mask = (cpu_map >> (i*4)) & 0xf;
+ if (core_thr_mask) {
+ if (core_thr_mask != core0_thr_mask)
+ goto unsupp;
+ xlp_ncores++;
+ }
+ }
+
+ xlp_hw_thread_mask = cpu_map;
+ /* setup hardware processor id to cpu id mapping */
+ for (i = 0; i< MAXCPU; i++)
+ xlp_cpuid_to_hwtid[i] =
+ xlp_hwtid_to_cpuid [i] = -1;
+ for (i = 0, k = 0; i < XLP_MAX_CORES; i++) {
+ if (((cpu_map >> (i*4)) & 0xf) == 0)
+ continue;
+ for (j = 0; j < xlp_threads_per_core; j++) {
+ xlp_cpuid_to_hwtid[k] = i*4 + j;
+ xlp_hwtid_to_cpuid[i*4 + j] = k;
+ k++;
+ }
+ }
+
+#ifdef SMP
+ /*
+ * We will enable the other threads in core 0 here
+ * so that the TLB and cache info is correct when
+ * mips_init runs
+ */
+ xlp_enable_threads(xlp_mmuval);
+#endif
+ /* setup for the startup core */
+ xlp_setup_mmu();
+ return;
+
+unsupp:
+ printf("ERROR : Unsupported CPU mask [use 1,2 or 4 threads per core].\n"
+ "\tcore0 thread mask [%lx], boot cpu mask [%lx].\n",
+ (u_long)core0_thr_mask, (u_long)cpu_map);
+ panic("Invalid CPU mask - halting.\n");
+ return;
+}
+
+static void
+xlp_set_boot_flags(void)
+{
+ char *p;
+
+ p = getenv("bootflags");
+ if (p == NULL)
+ return;
+
+ for (; p && *p != '\0'; p++) {
+ switch (*p) {
+ case 'd':
+ case 'D':
+ boothowto |= RB_KDB;
+ break;
+ case 'g':
+ case 'G':
+ boothowto |= RB_GDB;
+ break;
+ case 'v':
+ case 'V':
+ boothowto |= RB_VERBOSE;
+ break;
+
+ case 's': /* single-user (default, supported for sanity) */
+ case 'S':
+ boothowto |= RB_SINGLE;
+ break;
+
+ default:
+ printf("Unrecognized boot flag '%c'.\n", *p);
+ break;
+ }
+ }
+
+ freeenv(p);
+ return;
+}
+
+static void
+mips_init(void)
+{
+ init_param1();
+ init_param2(physmem);
+
+ mips_cpu_init();
+ cpuinfo.cache_coherent_dma = TRUE;
+ pmap_bootstrap();
+#ifdef DDB
+ kdb_init();
+ if (boothowto & RB_KDB) {
+ kdb_enter("Boot flags requested debugger", NULL);
+ }
+#endif
+ mips_proc0_init();
+ mutex_init();
+}
+
+unsigned int
+platform_get_timecount(struct timecounter *tc __unused)
+{
+
+ return ((unsigned int)~nlm_pic_read_systimer(xlp_pic_base, 7));
+}
+
+static void
+xlp_pic_init(void)
+{
+ struct timecounter pic_timecounter = {
+ platform_get_timecount, /* get_timecount */
+ 0, /* no poll_pps */
+ ~0U, /* counter_mask */
+ XLP_PIC_TIMER_FREQ, /* frequency */
+ "XLRPIC", /* name */
+ 2000, /* quality (adjusted in code) */
+ };
+ int i;
+
+ xlp_pic_base = nlm_regbase_pic(0); /* TOOD: Add other nodes */
+ printf("Initializing PIC...@%jx\n", (uintmax_t)xlp_pic_base);
+ /* Bind all PIC irqs to cpu 0 */
+ for(i = 0; i < XLP_PIC_MAX_IRT; i++) {
+ nlm_pic_write_irt_raw(xlp_pic_base, i, 0, 0, 1, 0,
+ 1, 0, 0x1);
+ }
+
+ nlm_pic_set_systimer(xlp_pic_base, 7, ~0ULL, 0, 0, 0, 0);
+ platform_timecounter = &pic_timecounter;
+}
+
+#if defined(__mips_n32) || defined(__mips_n64) /* PHYSADDR_64_BIT */
+#ifdef XLP_SIM
+#define XLP_MEM_LIM 0x200000000ULL
+#else
+#define XLP_MEM_LIM 0x10000000000ULL
+#endif
+#else
+#define XLP_MEM_LIM 0xfffff000UL
+#endif
+static void
+xlp_mem_init(void)
+{
+ uint64_t bridgebase = nlm_regbase_bridge(0); /* TOOD: Add other nodes */
+ vm_size_t physsz = 0;
+ uint64_t base, lim, val;
+ int i, j;
+
+ for (i = 0, j = 0; i < 8; i++) {
+ val = nlm_rdreg_bridge(bridgebase, XLP_BRIDGE_DRAM_BAR_REG(i));
+ base = ((val >> 12) & 0xfffff) << 20;
+ val = nlm_rdreg_bridge(bridgebase, XLP_BRIDGE_DRAM_LIMIT_REG(i));
+ lim = ((val >> 12) & 0xfffff) << 20;
+
+ /* BAR not enabled */
+ if (lim == 0)
+ continue;
+
+ /* first bar, start a bit after end */
+ if (base == 0) {
+ base = (vm_paddr_t)MIPS_KSEG0_TO_PHYS(&_end) + 0x20000;
+ lim = 0x0c000000; /* TODO : hack to avoid uboot packet mem */
+ }
+ if (base >= XLP_MEM_LIM) {
+ printf("Mem [%d]: Ignore %#jx - %#jx\n", i,
+ (intmax_t)base, (intmax_t)lim);
+ continue;
+ }
+ if (lim > XLP_MEM_LIM) {
+ printf("Mem [%d]: Restrict %#jx -> %#jx\n", i,
+ (intmax_t)lim, (intmax_t)XLP_MEM_LIM);
+ lim = XLP_MEM_LIM;
+ }
+ if (lim <= base) {
+ printf("Mem[%d]: Malformed %#jx -> %#jx\n", i,
+ (intmax_t)base, (intmax_t)lim);
+ continue;
+ }
+
+ /*
+ * Exclude reset entry memory range 0x1fc00000 - 0x20000000
+ * from free memory
+ */
+ if (base <= 0x1fc00000 && (base + lim) > 0x1fc00000) {
+ uint64_t base0, lim0, base1, lim1;
+
+ base0 = base;
+ lim0 = 0x1fc00000;
+ base1 = 0x20000000;
+ lim1 = lim;
+
+ if (lim0 > base0) {
+ phys_avail[j++] = (vm_paddr_t)base0;
+ phys_avail[j++] = (vm_paddr_t)lim0;
+ physsz += lim0 - base0;
+ printf("Mem[%d]: %#jx - %#jx (excl reset)\n", i,
+ (intmax_t)base0, (intmax_t)lim0);
+ }
+ if (lim1 > base1) {
+ phys_avail[j++] = (vm_paddr_t)base1;
+ phys_avail[j++] = (vm_paddr_t)lim1;
+ physsz += lim1 - base1;
+ printf("Mem[%d]: %#jx - %#jx (excl reset)\n", i,
+ (intmax_t)base1, (intmax_t)lim1);
+ }
+ } else {
+ phys_avail[j++] = (vm_paddr_t)base;
+ phys_avail[j++] = (vm_paddr_t)lim;
+ physsz += lim - base;
+ printf("Mem[%d]: %#jx - %#jx\n", i,
+ (intmax_t)base, (intmax_t)lim);
+ }
+
+ }
+
+ /* setup final entry with 0 */
+ phys_avail[j] = phys_avail[j + 1] = 0;
+ realmem = physmem = btoc(physsz);
+}
+
+static uint32_t
+xlp_get_cpu_frequency(void)
+{
+ uint64_t sysbase = nlm_regbase_sys(0);
+ unsigned int pll_divf, pll_divr, dfs_div, num, denom;
+ uint32_t val;
+
+ val = nlm_rdreg_sys(sysbase, XLP_SYS_POWER_ON_RESET_REG);
+ pll_divf = (val >> 10) & 0x7f;
+ pll_divr = (val >> 8) & 0x3;
+ dfs_div = (val >> 17) & 0x3;
+
+ num = pll_divf + 1;
+ denom = 3 * (pll_divr + 1) * (1<< (dfs_div + 1));
+ val = 800000000ULL * num / denom;
+ return (val);
+}
+
+void
+platform_start(__register_t a0 __unused,
+ __register_t a1 __unused,
+ __register_t a2 __unused,
+ __register_t a3 __unused)
+{
+ int i;
+
+ xlp_argc = 1;
+ /*
+ * argv and envp are passed in array of 32bit pointers
+ */
+ xlp_argv = NULL;
+ xlp_envp = NULL;
+
+ /* Initialize pcpu stuff */
+ mips_pcpu0_init();
+
+ /* initialize console so that we have printf */
+ boothowto |= (RB_SERIAL | RB_MULTIPLE); /* Use multiple consoles */
+
+ /* For now */
+ boothowto |= RB_VERBOSE;
+ boothowto |= RB_SINGLE;
+ bootverbose++;
+
+ /* clockrate used by delay, so initialize it here */
+ xlp_cpu_frequency = xlp_get_cpu_frequency();
+ cpu_clock = xlp_cpu_frequency / 1000000;
+ mips_timer_early_init(xlp_cpu_frequency);
+
+ /* Init console please */
+ cninit();
+
+ /* Environment */
+ printf("Args %#jx %#jx %#jx %#jx:\n", (intmax_t)a0,
+ (intmax_t)a1, (intmax_t)a2, (intmax_t)a3);
+ xlp_hw_thread_mask = a0;
+ init_static_kenv(boot1_env, sizeof(boot1_env));
+ printf("Environment (from %d args):\n", xlp_argc - 1);
+ if (xlp_argc == 1)
+ printf("\tNone\n");
+ for (i = 1; i < xlp_argc; i++) {
+ char *n, *arg;
+
+ arg = (char *)(intptr_t)xlp_argv[i];
+ printf("\t%s\n", arg);
+ n = strsep(&arg, "=");
+ if (arg == NULL)
+ setenv(n, "1");
+ else
+ setenv(n, arg);
+ }
+
+ /* Early core init and fixes for errata */
+ xlp_setup_core();
+
+ xlp_set_boot_flags();
+ xlp_parse_mmu_options();
+
+ xlp_mem_init();
+
+ bcopy(XLPResetEntry, (void *)MIPS_RESET_EXC_VEC,
+ XLPResetEntryEnd - XLPResetEntry);
+
+ /*
+ * MIPS generic init
+ */
+ mips_init();
+ /*
+ * XLP specific post initialization
+ * initialize other on chip stuff
+ */
+ nlm_board_info_setup();
+ xlp_pic_init();
+
+ mips_timer_init_params(xlp_cpu_frequency, 0);
+}
+
+void
+platform_cpu_init()
+{
+}
+
+void
+platform_identify(void)
+{
+
+ printf("XLP Eval Board\n");
+}
+
+/*
+ * XXX Maybe return the state of the watchdog in enter, and pass it to
+ * exit? Like spl().
+ */
+void
+platform_trap_enter(void)
+{
+}
+
+void
+platform_reset(void)
+{
+ uint64_t sysbase = nlm_regbase_sys(0);
+
+ nlm_wreg_sys(sysbase, XLP_SYS_CHIP_RESET_REG, 1);
+ for(;;)
+ __asm __volatile("wait");
+}
+
+void
+platform_trap_exit(void)
+{
+}
+
+#ifdef SMP
+/*
+ * XLP threads are started simultaneously when we enable threads, this will
+ * ensure that the threads are blocked in platform_init_ap, until they are
+ * ready to proceed to smp_init_secondary()
+ */
+static volatile int thr_unblock[4];
+
+int
+platform_start_ap(int cpuid)
+{
+ uint32_t coremask, val;
+ uint64_t sysbase = nlm_regbase_sys(0);
+ int hwtid = xlp_cpuid_to_hwtid[cpuid];
+ int core, thr;
+
+ core = hwtid / 4;
+ thr = hwtid % 4;
+ if (thr == 0) {
+ /* First thread in core, do core wake up */
+ coremask = 1u << core;
+
+ /* Enable core clock */
+ val = nlm_rdreg_sys(sysbase, XLP_SYS_CORE_DFS_DIS_CTRL_REG);
+ val &= ~coremask;
+ nlm_wreg_sys(sysbase, XLP_SYS_CORE_DFS_DIS_CTRL_REG, val);
+
+ /* Remove CPU Reset */
+ val = nlm_rdreg_sys(sysbase, XLP_SYS_CPU_RESET_REG);
+ val &= ~coremask & 0xff;
+ nlm_wreg_sys(sysbase, XLP_SYS_CPU_RESET_REG, val);
+
+ if (bootverbose)
+ printf("Waking up core %d ...", core);
+
+ /* Poll for CPU to mark itself coherent */
+ do {
+ val = nlm_rdreg_sys(sysbase, XLP_SYS_CPU_NONCOHERENT_MODE_REG);
+ } while ((val & coremask) != 0);
+ if (bootverbose)
+ printf("Done\n");
+ } else {
+ /* otherwise release the threads stuck in platform_init_ap */
+ thr_unblock[thr] = 1;
+ }
+
+ return (0);
+}
+
+void
+platform_init_ap(int cpuid)
+{
+ uint32_t stat;
+ int thr;
+
+ /* The first thread has to setup the MMU and enable other threads */
+ thr = nlm_threadid();
+ if (thr == 0) {
+ xlp_setup_core();
+ xlp_enable_threads(xlp_mmuval);
+ xlp_setup_mmu();
+ } else {
+ /*
+ * FIXME busy wait here eats too many cycles, especially
+ * in the core 0 while bootup
+ */
+ while (thr_unblock[thr] == 0)
+ __asm__ __volatile__ ("nop;nop;nop;nop");
+ thr_unblock[thr] = 0;
+ }
+
+ stat = mips_rd_status();
+ KASSERT((stat & MIPS_SR_INT_IE) == 0,
+ ("Interrupts enabled in %s!", __func__));
+ stat |= MIPS_SR_COP_2_BIT | MIPS_SR_COP_0_BIT;
+ mips_wr_status(stat);
+
+ nlm_write_c0_eimr(0ull);
+ xlp_enable_irq(IRQ_IPI);
+ xlp_enable_irq(IRQ_TIMER);
+ xlp_enable_irq(IRQ_MSGRING);
+
+ return;
+}
+
+int
+platform_ipi_intrnum(void)
+{
+
+ return (IRQ_IPI);
+}
+
+void
+platform_ipi_send(int cpuid)
+{
+
+ nlm_pic_send_ipi(xlp_pic_base, 0, xlp_cpuid_to_hwtid[cpuid],
+ platform_ipi_intrnum(), 0);
+}
+
+void
+platform_ipi_clear(void)
+{
+}
+
+int
+platform_processor_id(void)
+{
+
+ return (xlp_hwtid_to_cpuid[nlm_cpuid()]);
+}
+
+void
+platform_cpu_mask(cpuset_t *mask)
+{
+ int i, s;
+
+ CPU_ZERO(mask);
+ s = xlp_ncores * xlp_threads_per_core;
+ for (i = 0; i < s; i++)
+ CPU_SET(i, mask);
+}
+
+struct cpu_group *
+platform_smp_topo()
+{
+
+ return (smp_topo_2level(CG_SHARE_L2, xlp_ncores, CG_SHARE_L1,
+ xlp_threads_per_core, CG_FLAG_THREAD));
+}
+#endif
diff --git a/sys/modules/usb/Makefile b/sys/modules/usb/Makefile
index 6288d66..abcfcbe 100644
--- a/sys/modules/usb/Makefile
+++ b/sys/modules/usb/Makefile
@@ -27,7 +27,7 @@
SUBDIR = usb
SUBDIR += ehci musb ohci uhci xhci uss820dci ${_at91dci} ${_atmegadci}
-SUBDIR += rum run uath upgt ural zyd ${_urtw}
+SUBDIR += rum run uath upgt usie ural zyd ${_urtw}
SUBDIR += atp uhid ukbd ums udbp ufm uep
SUBDIR += ucom u3g uark ubsa ubser uchcom ucycom ufoma uftdi ugensa uipaq ulpt \
umct umcs umodem umoscom uplcom uslcom uvisor uvscom
diff --git a/sys/modules/usb/usie/Makefile b/sys/modules/usb/usie/Makefile
new file mode 100644
index 0000000..f7d7c07
--- /dev/null
+++ b/sys/modules/usb/usie/Makefile
@@ -0,0 +1,35 @@
+#
+# $FreeBSD$
+#
+# Copyright (c) 2011 Hans Petter Selasky. All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+# 1. Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+# 2. Redistributions in binary form must reproduce the above copyright
+# notice, this list of conditions and the following disclaimer in the
+# documentation and/or other materials provided with the distribution.
+#
+# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+# SUCH DAMAGE.
+#
+
+.PATH: ${.CURDIR}/../../../dev/usb/net
+
+KMOD = usie
+SRCS = if_usie.c
+SRCS += opt_bus.h opt_usb.h device_if.h bus_if.h \
+ usb_if.h usbdevs.h opt_inet.h
+
+.include <bsd.kmod.mk>
diff --git a/sys/net/bpf_filter.c b/sys/net/bpf_filter.c
index 1bd1609..672dfaa 100644
--- a/sys/net/bpf_filter.c
+++ b/sys/net/bpf_filter.c
@@ -177,6 +177,8 @@ bpf_filter(const struct bpf_insn *pc, u_char *p, u_int wirelen, u_int buflen)
bpf_u_int32 k;
u_int32_t mem[BPF_MEMWORDS];
+ bzero(mem, sizeof(mem));
+
if (pc == NULL)
/*
* No filter means accept all.
diff --git a/sys/net/if.c b/sys/net/if.c
index a5a3a8e..2b7a24a 100644
--- a/sys/net/if.c
+++ b/sys/net/if.c
@@ -58,6 +58,8 @@
#include <sys/taskqueue.h>
#include <sys/domain.h>
#include <sys/jail.h>
+#include <sys/priv.h>
+
#include <machine/stdarg.h>
#include <vm/uma.h>
@@ -2135,6 +2137,20 @@ ifhwioctl(u_long cmd, struct ifnet *ifp, caddr_t data, struct thread *td)
free(odescrbuf, M_IFDESCR);
break;
+ case SIOCGIFFIB:
+ ifr->ifr_fib = ifp->if_fib;
+ break;
+
+ case SIOCSIFFIB:
+ error = priv_check(td, PRIV_NET_SETIFFIB);
+ if (error)
+ return (error);
+ if (ifr->ifr_fib >= rt_numfibs)
+ return (EINVAL);
+
+ ifp->if_fib = ifr->ifr_fib;
+ break;
+
case SIOCSIFFLAGS:
error = priv_check(td, PRIV_NET_SETIFFLAGS);
if (error)
diff --git a/sys/net/if.h b/sys/net/if.h
index 06521cb..d1f3883 100644
--- a/sys/net/if.h
+++ b/sys/net/if.h
@@ -325,6 +325,7 @@ struct ifreq {
int ifru_media;
caddr_t ifru_data;
int ifru_cap[2];
+ u_int ifru_fib;
} ifr_ifru;
#define ifr_addr ifr_ifru.ifru_addr /* address */
#define ifr_dstaddr ifr_ifru.ifru_dstaddr /* other end of p-to-p link */
@@ -341,6 +342,7 @@ struct ifreq {
#define ifr_reqcap ifr_ifru.ifru_cap[0] /* requested capabilities */
#define ifr_curcap ifr_ifru.ifru_cap[1] /* current capabilities */
#define ifr_index ifr_ifru.ifru_index /* interface index */
+#define ifr_fib ifr_ifru.ifru_fib /* interface fib */
};
#define _SIZEOF_ADDR_IFREQ(ifr) \
diff --git a/sys/net/if_arcsubr.c b/sys/net/if_arcsubr.c
index 0e23b24..2a58d5a 100644
--- a/sys/net/if_arcsubr.c
+++ b/sys/net/if_arcsubr.c
@@ -608,6 +608,7 @@ arc_input(struct ifnet *ifp, struct mbuf *m)
m_freem(m);
return;
}
+ M_SETFIB(m, ifp->if_fib);
netisr_dispatch(isr, m);
}
diff --git a/sys/net/if_atmsubr.c b/sys/net/if_atmsubr.c
index d8a3313..fb63fd5 100644
--- a/sys/net/if_atmsubr.c
+++ b/sys/net/if_atmsubr.c
@@ -332,6 +332,7 @@ atm_input(struct ifnet *ifp, struct atm_pseudohdr *ah, struct mbuf *m,
return;
}
}
+ M_SETFIB(m, ifp->if_fib);
netisr_dispatch(isr, m);
}
diff --git a/sys/net/if_debug.c b/sys/net/if_debug.c
index dcf504e..e7319374 100644
--- a/sys/net/if_debug.c
+++ b/sys/net/if_debug.c
@@ -86,6 +86,7 @@ if_show_ifnet(struct ifnet *ifp)
IF_DB_PRINTF("%d", if_snd.ifq_drv_maxlen);
IF_DB_PRINTF("%d", if_snd.altq_type);
IF_DB_PRINTF("%x", if_snd.altq_flags);
+ IF_DB_PRINTF("%u", if_fib);
#undef IF_DB_PRINTF
}
diff --git a/sys/net/if_ethersubr.c b/sys/net/if_ethersubr.c
index be90f5a..aa8113b 100644
--- a/sys/net/if_ethersubr.c
+++ b/sys/net/if_ethersubr.c
@@ -692,6 +692,8 @@ ether_input_internal(struct ifnet *ifp, struct mbuf *m)
m_adj(m, ETHER_VLAN_ENCAP_LEN);
}
+ M_SETFIB(m, ifp->if_fib);
+
/* Allow ng_ether(4) to claim this frame. */
if (IFP2AC(ifp)->ac_netgraph != NULL) {
KASSERT(ng_ether_input_p != NULL,
diff --git a/sys/net/if_fddisubr.c b/sys/net/if_fddisubr.c
index 13fdd72..d98029c 100644
--- a/sys/net/if_fddisubr.c
+++ b/sys/net/if_fddisubr.c
@@ -550,6 +550,7 @@ fddi_input(ifp, m)
ifp->if_noproto++;
goto dropanyway;
}
+ M_SETFIB(m, ifp->if_fib);
netisr_dispatch(isr, m);
return;
diff --git a/sys/net/if_fwsubr.c b/sys/net/if_fwsubr.c
index eac049a..7c57feb 100644
--- a/sys/net/if_fwsubr.c
+++ b/sys/net/if_fwsubr.c
@@ -627,6 +627,7 @@ firewire_input(struct ifnet *ifp, struct mbuf *m, uint16_t src)
return;
}
+ M_SETFIB(m, ifp->if_fib);
netisr_dispatch(isr, m);
}
diff --git a/sys/net/if_gif.c b/sys/net/if_gif.c
index 4a8df34..2b6b2b4 100644
--- a/sys/net/if_gif.c
+++ b/sys/net/if_gif.c
@@ -609,6 +609,7 @@ gif_input(m, af, ifp)
ifp->if_ipackets++;
ifp->if_ibytes += m->m_pkthdr.len;
+ M_SETFIB(m, ifp->if_fib);
netisr_dispatch(isr, m);
}
diff --git a/sys/net/if_iso88025subr.c b/sys/net/if_iso88025subr.c
index 933065e..7961df0 100644
--- a/sys/net/if_iso88025subr.c
+++ b/sys/net/if_iso88025subr.c
@@ -680,6 +680,7 @@ iso88025_input(ifp, m)
break;
}
+ M_SETFIB(m, ifp->if_fib);
netisr_dispatch(isr, m);
return;
diff --git a/sys/net/if_lagg.c b/sys/net/if_lagg.c
index 2548c65..d540966 100644
--- a/sys/net/if_lagg.c
+++ b/sys/net/if_lagg.c
@@ -1221,14 +1221,15 @@ lagg_input(struct ifnet *ifp, struct mbuf *m)
struct lagg_softc *sc = lp->lp_softc;
struct ifnet *scifp = sc->sc_ifp;
+ LAGG_RLOCK(sc);
if ((scifp->if_drv_flags & IFF_DRV_RUNNING) == 0 ||
(lp->lp_flags & LAGG_PORT_DISABLED) ||
sc->sc_proto == LAGG_PROTO_NONE) {
+ LAGG_RUNLOCK(sc);
m_freem(m);
return (NULL);
}
- LAGG_RLOCK(sc);
ETHER_BPF_MTAP(scifp, m);
m = (*sc->sc_input)(sc, lp, m);
diff --git a/sys/net/if_llatbl.h b/sys/net/if_llatbl.h
index 1f30f37..4b18353 100644
--- a/sys/net/if_llatbl.h
+++ b/sys/net/if_llatbl.h
@@ -151,7 +151,6 @@ struct lltable {
int llt_af;
struct ifnet *llt_ifp;
- struct llentry * (*llt_new)(const struct sockaddr *, u_int);
void (*llt_free)(struct lltable *, struct llentry *);
void (*llt_prefix_free)(struct lltable *,
const struct sockaddr *prefix,
@@ -159,8 +158,6 @@ struct lltable {
u_int flags);
struct llentry * (*llt_lookup)(struct lltable *, u_int flags,
const struct sockaddr *l3addr);
- int (*llt_rtcheck)(struct ifnet *, u_int flags,
- const struct sockaddr *);
int (*llt_dump)(struct lltable *,
struct sysctl_req *);
};
diff --git a/sys/net/if_spppfr.c b/sys/net/if_spppfr.c
index ae4f959..ca84656 100644
--- a/sys/net/if_spppfr.c
+++ b/sys/net/if_spppfr.c
@@ -280,6 +280,8 @@ drop: ++ifp->if_ierrors;
if (! (ifp->if_flags & IFF_UP))
goto drop;
+ M_SETFIB(m, ifp->if_fib);
+
/* Check queue. */
if (netisr_queue(isr, m)) { /* (0) on success. */
if (debug)
diff --git a/sys/net/if_spppsubr.c b/sys/net/if_spppsubr.c
index 3f0faaf..363d9aa 100644
--- a/sys/net/if_spppsubr.c
+++ b/sys/net/if_spppsubr.c
@@ -737,6 +737,7 @@ sppp_input(struct ifnet *ifp, struct mbuf *m)
goto drop;
SPPP_UNLOCK(sp);
+ M_SETFIB(m, ifp->if_fib);
/* Check queue. */
if (netisr_queue(isr, m)) { /* (0) on success. */
if (debug)
diff --git a/sys/net/if_stf.c b/sys/net/if_stf.c
index 1ef5581..e32956e 100644
--- a/sys/net/if_stf.c
+++ b/sys/net/if_stf.c
@@ -781,6 +781,7 @@ in_stf_input(m, off)
*/
ifp->if_ipackets++;
ifp->if_ibytes += m->m_pkthdr.len;
+ M_SETFIB(m, ifp->if_fib);
netisr_dispatch(NETISR_IPV6, m);
}
diff --git a/sys/net/if_tun.c b/sys/net/if_tun.c
index 49a5249..d74c9fe 100644
--- a/sys/net/if_tun.c
+++ b/sys/net/if_tun.c
@@ -929,6 +929,7 @@ tunwrite(struct cdev *dev, struct uio *uio, int flag)
ifp->if_ibytes += m->m_pkthdr.len;
ifp->if_ipackets++;
CURVNET_SET(ifp->if_vnet);
+ M_SETFIB(m, ifp->if_fib);
netisr_dispatch(isr, m);
CURVNET_RESTORE();
return (0);
diff --git a/sys/net/if_var.h b/sys/net/if_var.h
index b3ecb7d..2dcb6f9 100644
--- a/sys/net/if_var.h
+++ b/sys/net/if_var.h
@@ -195,17 +195,18 @@ struct ifnet {
/* protected by if_addr_mtx */
void *if_pf_kif;
void *if_lagg; /* lagg glue */
- u_char if_alloctype; /* if_type at time of allocation */
+ char *if_description; /* interface description */
+ u_int if_fib; /* interface FIB */
+ u_char if_alloctype; /* if_type at time of allocation */
/*
* Spare fields are added so that we can modify sensitive data
* structures without changing the kernel binary interface, and must
* be used with care where binary compatibility is required.
*/
- char if_cspare[3];
- char *if_description; /* interface description */
- void *if_pspare[7];
+ char if_cspare[3];
int if_ispare[4];
+ void *if_pspare[8]; /* 1 netmap, 7 TDB */
};
typedef void if_init_f_t(void *);
diff --git a/sys/net/radix.h b/sys/net/radix.h
index 29659b5..0dc11e9 100644
--- a/sys/net/radix.h
+++ b/sys/net/radix.h
@@ -132,6 +132,7 @@ struct radix_node_head {
(struct radix_node *rn, struct radix_node_head *head);
struct radix_node rnh_nodes[3]; /* empty tree for common case */
int rnh_multipath; /* multipath capable ? */
+ u_int rnh_spare; /* route caching */
#ifdef _KERNEL
struct rwlock rnh_lock; /* locks entire radix tree */
#endif
diff --git a/sys/net80211/ieee80211_ageq.c b/sys/net80211/ieee80211_ageq.c
index ea223f7..018ddc2 100644
--- a/sys/net80211/ieee80211_ageq.c
+++ b/sys/net80211/ieee80211_ageq.c
@@ -49,7 +49,7 @@ __FBSDID("$FreeBSD$");
void
ieee80211_ageq_init(struct ieee80211_ageq *aq, int maxlen, const char *name)
{
- memset(aq, 0, sizeof(aq));
+ memset(aq, 0, sizeof(*aq));
aq->aq_maxlen = maxlen;
IEEE80211_AGEQ_INIT(aq, name); /* OS-dependent setup */
}
diff --git a/sys/net80211/ieee80211_power.c b/sys/net80211/ieee80211_power.c
index aad82ba..201eea0 100644
--- a/sys/net80211/ieee80211_power.c
+++ b/sys/net80211/ieee80211_power.c
@@ -102,7 +102,7 @@ ieee80211_power_vdetach(struct ieee80211vap *vap)
void
ieee80211_psq_init(struct ieee80211_psq *psq, const char *name)
{
- memset(psq, 0, sizeof(psq));
+ memset(psq, 0, sizeof(*psq));
psq->psq_maxlen = IEEE80211_PS_MAX_QUEUE;
IEEE80211_PSQ_INIT(psq, name); /* OS-dependent setup */
}
diff --git a/sys/netgraph/netflow/netflow.c b/sys/netgraph/netflow/netflow.c
index dfbb507..8ec5629 100644
--- a/sys/netgraph/netflow/netflow.c
+++ b/sys/netgraph/netflow/netflow.c
@@ -100,7 +100,7 @@ static int export_send(priv_p, fib_export_p, item_p, int);
static int hash_insert(priv_p, struct flow_hash_entry *, struct flow_rec *, int, uint8_t);
#ifdef INET6
-static int hash6_insert(priv_p, struct flow6_hash_entry *, struct flow6_rec *, int, uint8_t);
+static int hash6_insert(priv_p, struct flow_hash_entry *, struct flow6_rec *, int, uint8_t);
#endif
static __inline void expire_flow(priv_p, fib_export_p, struct flow_entry *, int);
@@ -412,7 +412,7 @@ hash_insert(priv_p priv, struct flow_hash_entry *hsh, struct flow_rec *r,
bitcount32((x).__u6_addr.__u6_addr32[3])
/* XXX: Do we need inline here ? */
static __inline int
-hash6_insert(priv_p priv, struct flow6_hash_entry *hsh6, struct flow6_rec *r,
+hash6_insert(priv_p priv, struct flow_hash_entry *hsh6, struct flow6_rec *r,
int plen, uint8_t tcp_flags)
{
struct flow6_entry *fle6;
@@ -491,7 +491,7 @@ hash6_insert(priv_p priv, struct flow6_hash_entry *hsh6, struct flow6_rec *r,
}
/* Push new flow at the and of hash. */
- TAILQ_INSERT_TAIL(&hsh6->head, fle6, fle6_hash);
+ TAILQ_INSERT_TAIL(&hsh6->head, (struct flow_entry *)fle6, fle_hash);
return (0);
}
@@ -507,9 +507,6 @@ void
ng_netflow_cache_init(priv_p priv)
{
struct flow_hash_entry *hsh;
-#ifdef INET6
- struct flow6_hash_entry *hsh6;
-#endif
int i;
/* Initialize cache UMA zone. */
@@ -534,13 +531,13 @@ ng_netflow_cache_init(priv_p priv)
#ifdef INET6
/* Allocate hash. */
- priv->hash6 = malloc(NBUCKETS * sizeof(struct flow6_hash_entry),
+ priv->hash6 = malloc(NBUCKETS * sizeof(struct flow_hash_entry),
M_NETFLOW_HASH, M_WAITOK | M_ZERO);
/* Initialize hash. */
- for (i = 0, hsh6 = priv->hash6; i < NBUCKETS; i++, hsh6++) {
- mtx_init(&hsh6->mtx, "hash mutex", NULL, MTX_DEF);
- TAILQ_INIT(&hsh6->head);
+ for (i = 0, hsh = priv->hash6; i < NBUCKETS; i++, hsh++) {
+ mtx_init(&hsh->mtx, "hash mutex", NULL, MTX_DEF);
+ TAILQ_INIT(&hsh->head);
}
#endif
@@ -588,10 +585,6 @@ ng_netflow_cache_flush(priv_p priv)
{
struct flow_entry *fle, *fle1;
struct flow_hash_entry *hsh;
-#ifdef INET6
- struct flow6_entry *fle6, *fle61;
- struct flow6_hash_entry *hsh6;
-#endif
struct netflow_export_item exp;
fib_export_p fe;
int i;
@@ -610,11 +603,11 @@ ng_netflow_cache_flush(priv_p priv)
expire_flow(priv, fe, fle, NG_QUEUE);
}
#ifdef INET6
- for (hsh6 = priv->hash6, i = 0; i < NBUCKETS; hsh6++, i++)
- TAILQ_FOREACH_SAFE(fle6, &hsh6->head, fle6_hash, fle61) {
- TAILQ_REMOVE(&hsh6->head, fle6, fle6_hash);
- fe = priv_to_fib(priv, fle6->f.r.fib);
- expire_flow(priv, fe, (struct flow_entry *)fle6, NG_QUEUE);
+ for (hsh = priv->hash6, i = 0; i < NBUCKETS; hsh++, i++)
+ TAILQ_FOREACH_SAFE(fle, &hsh->head, fle_hash, fle1) {
+ TAILQ_REMOVE(&hsh->head, fle, fle_hash);
+ fe = priv_to_fib(priv, fle->f.r.fib);
+ expire_flow(priv, fe, fle, NG_QUEUE);
}
#endif
@@ -629,8 +622,8 @@ ng_netflow_cache_flush(priv_p priv)
#ifdef INET6
uma_zdestroy(priv->zone6);
/* Destroy hash mutexes. */
- for (i = 0, hsh6 = priv->hash6; i < NBUCKETS; i++, hsh6++)
- mtx_destroy(&hsh6->mtx);
+ for (i = 0, hsh = priv->hash6; i < NBUCKETS; i++, hsh++)
+ mtx_destroy(&hsh->mtx);
/* Free hash memory. */
if (priv->hash6 != NULL)
@@ -790,8 +783,9 @@ int
ng_netflow_flow6_add(priv_p priv, fib_export_p fe, struct ip6_hdr *ip6, caddr_t upper_ptr, uint8_t upper_proto,
uint8_t is_frag, unsigned int src_if_index)
{
- register struct flow6_entry *fle6 = NULL, *fle61;
- struct flow6_hash_entry *hsh6;
+ register struct flow_entry *fle = NULL, *fle1;
+ register struct flow6_entry *fle6;
+ struct flow_hash_entry *hsh;
struct flow6_rec r;
int plen;
int error = 0;
@@ -846,9 +840,9 @@ ng_netflow_flow6_add(priv_p priv, fib_export_p fe, struct ip6_hdr *ip6, caddr_t
priv->info.nfinfo_bytes6 += plen;
/* Find hash slot. */
- hsh6 = &priv->hash6[ip6_hash(&r)];
+ hsh = &priv->hash6[ip6_hash(&r)];
- mtx_lock(&hsh6->mtx);
+ mtx_lock(&hsh->mtx);
/*
* Go through hash and find our entry. If we encounter an
@@ -856,19 +850,22 @@ ng_netflow_flow6_add(priv_p priv, fib_export_p fe, struct ip6_hdr *ip6, caddr_t
* search since most active entries are first, and most
* searches are done on most active entries.
*/
- TAILQ_FOREACH_REVERSE_SAFE(fle6, &hsh6->head, f6head, fle6_hash, fle61) {
- if (fle6->f.version != IP6VERSION)
+ TAILQ_FOREACH_REVERSE_SAFE(fle, &hsh->head, fhead, fle_hash, fle1) {
+ if (fle->f.version != IP6VERSION)
continue;
+ fle6 = (struct flow6_entry *)fle;
if (bcmp(&r, &fle6->f.r, sizeof(struct flow6_rec)) == 0)
break;
if ((INACTIVE(fle6) && SMALL(fle6)) || AGED(fle6)) {
- TAILQ_REMOVE(&hsh6->head, fle6, fle6_hash);
- expire_flow(priv, priv_to_fib(priv, fle6->f.r.fib), (struct flow_entry *)fle6, NG_QUEUE);
+ TAILQ_REMOVE(&hsh->head, fle, fle_hash);
+ expire_flow(priv, priv_to_fib(priv, fle->f.r.fib), fle,
+ NG_QUEUE);
atomic_add_32(&priv->info.nfinfo_act_exp, 1);
}
}
- if (fle6 != NULL) { /* An existent entry. */
+ if (fle != NULL) { /* An existent entry. */
+ fle6 = (struct flow6_entry *)fle;
fle6->f.bytes += plen;
fle6->f.packets ++;
@@ -883,8 +880,9 @@ ng_netflow_flow6_add(priv_p priv, fib_export_p fe, struct ip6_hdr *ip6, caddr_t
*/
if (tcp_flags & TH_FIN || tcp_flags & TH_RST || AGED(fle6) ||
(fle6->f.bytes >= (CNTR_MAX - IF_MAXMTU)) ) {
- TAILQ_REMOVE(&hsh6->head, fle6, fle6_hash);
- expire_flow(priv, priv_to_fib(priv, fle6->f.r.fib), (struct flow_entry *)fle6, NG_QUEUE);
+ TAILQ_REMOVE(&hsh->head, fle, fle_hash);
+ expire_flow(priv, priv_to_fib(priv, fle->f.r.fib), fle,
+ NG_QUEUE);
atomic_add_32(&priv->info.nfinfo_act_exp, 1);
} else {
/*
@@ -892,15 +890,15 @@ ng_netflow_flow6_add(priv_p priv, fib_export_p fe, struct ip6_hdr *ip6, caddr_t
* if it isn't there already. Next search will
* locate it quicker.
*/
- if (fle6 != TAILQ_LAST(&hsh6->head, f6head)) {
- TAILQ_REMOVE(&hsh6->head, fle6, fle6_hash);
- TAILQ_INSERT_TAIL(&hsh6->head, fle6, fle6_hash);
+ if (fle != TAILQ_LAST(&hsh->head, fhead)) {
+ TAILQ_REMOVE(&hsh->head, fle, fle_hash);
+ TAILQ_INSERT_TAIL(&hsh->head, fle, fle_hash);
}
}
} else /* A new flow entry. */
- error = hash6_insert(priv, hsh6, &r, plen, tcp_flags);
+ error = hash6_insert(priv, hsh, &r, plen, tcp_flags);
- mtx_unlock(&hsh6->mtx);
+ mtx_unlock(&hsh->mtx);
return (error);
}
@@ -910,64 +908,109 @@ ng_netflow_flow6_add(priv_p priv, fib_export_p fe, struct ip6_hdr *ip6, caddr_t
* Return records from cache to userland.
*
* TODO: matching particular IP should be done in kernel, here.
- * XXX: IPv6 flows will return random data
*/
int
-ng_netflow_flow_show(priv_p priv, uint32_t last, struct ng_mesg *resp)
+ng_netflow_flow_show(priv_p priv, struct ngnf_show_header *req,
+struct ngnf_show_header *resp)
{
struct flow_hash_entry *hsh;
struct flow_entry *fle;
- struct ngnf_flows *data;
- int i;
+ struct flow_entry_data *data = (struct flow_entry_data *)(resp + 1);
+#ifdef INET6
+ struct flow6_entry_data *data6 = (struct flow6_entry_data *)(resp + 1);
+#endif
+ int i, max;
- data = (struct ngnf_flows *)resp->data;
- data->last = 0;
- data->nentries = 0;
+ i = req->hash_id;
+ if (i > NBUCKETS-1)
+ return (EINVAL);
- /* Check if this is a first run */
- if (last == 0) {
- hsh = priv->hash;
- i = 0;
- } else {
- if (last > NBUCKETS-1)
- return (EINVAL);
- hsh = priv->hash + last;
- i = last;
- }
+#ifdef INET6
+ if (req->version == 6) {
+ resp->version = 6;
+ hsh = priv->hash6 + i;
+ max = NREC6_AT_ONCE;
+ } else
+#endif
+ if (req->version == 4) {
+ resp->version = 4;
+ hsh = priv->hash + i;
+ max = NREC_AT_ONCE;
+ } else
+ return (EINVAL);
/*
* We will transfer not more than NREC_AT_ONCE. More data
* will come in next message.
- * We send current hash index to userland, and userland should
- * return it back to us. Then, we will restart with new entry.
+ * We send current hash index and current record number in list
+ * to userland, and userland should return it back to us.
+ * Then, we will restart with new entry.
*
- * The resulting cache snapshot is inaccurate for the
- * following reasons:
- * - we skip locked hash entries
- * - we bail out, if someone wants our entry
- * - we skip rest of entry, when hit NREC_AT_ONCE
+ * The resulting cache snapshot can be inaccurate if flow expiration
+ * is taking place on hash item between userland data requests for
+ * this hash item id.
*/
+ resp->nentries = 0;
for (; i < NBUCKETS; hsh++, i++) {
- if (mtx_trylock(&hsh->mtx) == 0)
- continue;
+ int list_id;
+ if (mtx_trylock(&hsh->mtx) == 0) {
+ /*
+ * Requested hash index is not available,
+ * relay decision to skip or re-request data
+ * to userland.
+ */
+ resp->hash_id = i;
+ resp->list_id = 0;
+ return (0);
+ }
+
+ list_id = 0;
TAILQ_FOREACH(fle, &hsh->head, fle_hash) {
- if (hsh->mtx.mtx_lock & MTX_CONTESTED)
- break;
+ if (hsh->mtx.mtx_lock & MTX_CONTESTED) {
+ resp->hash_id = i;
+ resp->list_id = list_id;
+ mtx_unlock(&hsh->mtx);
+ return (0);
+ }
+
+ list_id++;
+ /* Search for particular record in list. */
+ if (req->list_id > 0) {
+ if (list_id < req->list_id)
+ continue;
- bcopy(&fle->f, &(data->entries[data->nentries]),
- sizeof(fle->f));
- data->nentries++;
- if (data->nentries == NREC_AT_ONCE) {
+ /* Requested list position found. */
+ req->list_id = 0;
+ }
+#ifdef INET6
+ if (req->version == 6) {
+ struct flow6_entry *fle6;
+
+ fle6 = (struct flow6_entry *)fle;
+ bcopy(&fle6->f, data6 + resp->nentries,
+ sizeof(fle6->f));
+ } else
+#endif
+ bcopy(&fle->f, data + resp->nentries,
+ sizeof(fle->f));
+ resp->nentries++;
+ if (resp->nentries == max) {
+ resp->hash_id = i;
+ /*
+ * If it was the last item in list
+ * we simply skip to next hash_id.
+ */
+ resp->list_id = list_id + 1;
mtx_unlock(&hsh->mtx);
- if (++i < NBUCKETS)
- data->last = i;
return (0);
}
}
mtx_unlock(&hsh->mtx);
}
+ resp->hash_id = resp->list_id = 0;
+
return (0);
}
@@ -1057,10 +1100,6 @@ ng_netflow_expire(void *arg)
{
struct flow_entry *fle, *fle1;
struct flow_hash_entry *hsh;
-#ifdef INET6
- struct flow6_entry *fle6, *fle61;
- struct flow6_hash_entry *hsh6;
-#endif
priv_p priv = (priv_p )arg;
uint32_t used;
int i;
@@ -1103,20 +1142,23 @@ ng_netflow_expire(void *arg)
}
#ifdef INET6
- for (hsh6 = priv->hash6, i = 0; i < NBUCKETS; hsh6++, i++) {
+ for (hsh = priv->hash6, i = 0; i < NBUCKETS; hsh++, i++) {
+ struct flow6_entry *fle6;
+
/*
* Skip entries, that are already being worked on.
*/
- if (mtx_trylock(&hsh6->mtx) == 0)
+ if (mtx_trylock(&hsh->mtx) == 0)
continue;
used = atomic_load_acq_32(&priv->info.nfinfo_used6);
- TAILQ_FOREACH_SAFE(fle6, &hsh6->head, fle6_hash, fle61) {
+ TAILQ_FOREACH_SAFE(fle, &hsh->head, fle_hash, fle1) {
+ fle6 = (struct flow6_entry *)fle;
/*
* Interrupt thread wants this entry!
* Quick! Quick! Bail out!
*/
- if (hsh6->mtx.mtx_lock & MTX_CONTESTED)
+ if (hsh->mtx.mtx_lock & MTX_CONTESTED)
break;
/*
@@ -1128,13 +1170,14 @@ ng_netflow_expire(void *arg)
if ((INACTIVE(fle6) && (SMALL(fle6) ||
(used > (NBUCKETS*2)))) || AGED(fle6)) {
- TAILQ_REMOVE(&hsh6->head, fle6, fle6_hash);
- expire_flow(priv, priv_to_fib(priv, fle6->f.r.fib), (struct flow_entry *)fle6, NG_NOFLAGS);
+ TAILQ_REMOVE(&hsh->head, fle, fle_hash);
+ expire_flow(priv, priv_to_fib(priv,
+ fle->f.r.fib), fle, NG_NOFLAGS);
used--;
atomic_add_32(&priv->info.nfinfo_inact_exp, 1);
}
}
- mtx_unlock(&hsh6->mtx);
+ mtx_unlock(&hsh->mtx);
}
#endif
diff --git a/sys/netgraph/netflow/netflow_v9.c b/sys/netgraph/netflow/netflow_v9.c
index bd8deaa..31304d7 100644
--- a/sys/netgraph/netflow/netflow_v9.c
+++ b/sys/netgraph/netflow/netflow_v9.c
@@ -398,7 +398,6 @@ get_export9_dgram(priv_p priv, fib_export_p fe, struct netflow_v9_packet_opt **t
item = ng_package_data(m, NG_NOFLAGS);
if (item == NULL) {
- m_free(m);
free(t, M_NETFLOW_GENERAL);
return (NULL);
}
diff --git a/sys/netgraph/netflow/ng_netflow.c b/sys/netgraph/netflow/ng_netflow.c
index 780a127..64adc28 100644
--- a/sys/netgraph/netflow/ng_netflow.c
+++ b/sys/netgraph/netflow/ng_netflow.c
@@ -504,19 +504,20 @@ ng_netflow_rcvmsg (node_p node, item_p item, hook_p lasthook)
}
case NGM_NETFLOW_SHOW:
{
- uint32_t *last;
-
- if (msg->header.arglen != sizeof(uint32_t))
+ if (msg->header.arglen != sizeof(struct ngnf_show_header))
ERROUT(EINVAL);
- last = (uint32_t *)msg->data;
-
NG_MKRESPONSE(resp, msg, NGRESP_SIZE, M_NOWAIT);
if (!resp)
ERROUT(ENOMEM);
- error = ng_netflow_flow_show(priv, *last, resp);
+ error = ng_netflow_flow_show(priv,
+ (struct ngnf_show_header *)msg->data,
+ (struct ngnf_show_header *)resp->data);
+
+ if (error)
+ NG_FREE_MSG(resp);
break;
}
diff --git a/sys/netgraph/netflow/ng_netflow.h b/sys/netgraph/netflow/ng_netflow.h
index 6685000..ed11f35 100644
--- a/sys/netgraph/netflow/ng_netflow.h
+++ b/sys/netgraph/netflow/ng_netflow.h
@@ -33,7 +33,7 @@
#define _NG_NETFLOW_H_
#define NG_NETFLOW_NODE_TYPE "netflow"
-#define NGM_NETFLOW_COOKIE 1299079728
+#define NGM_NETFLOW_COOKIE 1309868867
#define NG_NETFLOW_MAXIFACES USHRT_MAX
@@ -133,6 +133,19 @@ struct ng_netflow_setmtu {
uint16_t mtu; /* MTU for packet */
};
+/* This structure is used in NGM_NETFLOW_SHOW request/responce */
+struct ngnf_show_header {
+ u_char version; /* IPv4 or IPv6 */
+ uint32_t hash_id; /* current hash index */
+ uint32_t list_id; /* current record number in given hash */
+ uint32_t nentries; /* number of records in response */
+};
+
+/* XXXGL
+ * Somewhere flow_rec6 is casted to flow_rec, and flow6_entry_data is
+ * casted to flow_entry_data. After casting, fle->r.fib is accessed.
+ * So beginning of these structs up to fib should be kept common.
+ */
/* This is unique data, which identifies flow */
struct flow_rec {
@@ -233,29 +246,24 @@ struct flow6_entry_data {
* without overflowing socket receive buffer
*/
#define NREC_AT_ONCE 1000
-#define NGRESP_SIZE (sizeof(struct ngnf_flows) + (NREC_AT_ONCE * \
+#define NREC6_AT_ONCE (NREC_AT_ONCE * sizeof(struct flow_entry_data) / \
+ sizeof(struct flow6_entry_data))
+#define NGRESP_SIZE (sizeof(struct ngnf_show_header) + (NREC_AT_ONCE * \
sizeof(struct flow_entry_data)))
#define SORCVBUF_SIZE (NGRESP_SIZE + 2 * sizeof(struct ng_mesg))
-/* This struct is returned to userland, when "show cache ip flow" */
-struct ngnf_flows {
- uint32_t nentries;
- uint32_t last;
- struct flow_entry_data entries[0];
-};
-
/* Everything below is for kernel */
#ifdef _KERNEL
struct flow_entry {
- struct flow_entry_data f;
TAILQ_ENTRY(flow_entry) fle_hash; /* entries in hash slot */
+ struct flow_entry_data f;
};
struct flow6_entry {
+ TAILQ_ENTRY(flow_entry) fle_hash; /* entries in hash slot */
struct flow6_entry_data f;
- TAILQ_ENTRY(flow6_entry) fle6_hash; /* entries in hash slot */
};
/* Parsing declarations */
@@ -402,7 +410,7 @@ struct netflow {
/* IPv6 support */
#ifdef INET6
uma_zone_t zone6;
- struct flow6_hash_entry *hash6;
+ struct flow_hash_entry *hash6;
#endif
/* Multiple FIB support */
fib_export_p fib_data[RT_NUMFIBS]; /* array of pointers to fib-specific data */
@@ -430,11 +438,6 @@ struct flow_hash_entry {
TAILQ_HEAD(fhead, flow_entry) head;
};
-struct flow6_hash_entry {
- struct mtx mtx;
- TAILQ_HEAD(f6head, flow6_entry) head;
-};
-
#define ERROUT(x) { error = (x); goto done; }
#define MTAG_NETFLOW 1221656444
@@ -465,7 +468,7 @@ void ng_netflow_copyinfo(priv_p, struct ng_netflow_info *);
timeout_t ng_netflow_expire;
int ng_netflow_flow_add(priv_p, fib_export_p, struct ip *, caddr_t, uint8_t, uint8_t, unsigned int);
int ng_netflow_flow6_add(priv_p, fib_export_p, struct ip6_hdr *, caddr_t , uint8_t, uint8_t, unsigned int);
-int ng_netflow_flow_show(priv_p, uint32_t last, struct ng_mesg *);
+int ng_netflow_flow_show(priv_p, struct ngnf_show_header *req, struct ngnf_show_header *resp);
void ng_netflow_v9_cache_init(priv_p);
void ng_netflow_v9_cache_flush(priv_p);
diff --git a/sys/netgraph/netgraph.h b/sys/netgraph/netgraph.h
index 8dbf0b5..7b67c94e 100644
--- a/sys/netgraph/netgraph.h
+++ b/sys/netgraph/netgraph.h
@@ -53,6 +53,7 @@
#include <sys/malloc.h>
#include <sys/module.h>
#include <sys/mutex.h>
+#include <sys/refcount.h>
#ifdef HAVE_KERNEL_OPTION_HEADERS
#include "opt_netgraph.h"
@@ -137,7 +138,7 @@ struct ng_hook {
* If you can't do it with these you probably shouldn;t be doing it.
*/
void ng_unref_hook(hook_p hook); /* don't move this */
-#define _NG_HOOK_REF(hook) atomic_add_int(&(hook)->hk_refs, 1)
+#define _NG_HOOK_REF(hook) refcount_acquire(&(hook)->hk_refs)
#define _NG_HOOK_NAME(hook) ((hook)->hk_name)
#define _NG_HOOK_UNREF(hook) ng_unref_hook(hook)
#define _NG_HOOK_SET_PRIVATE(hook, val) do {(hook)->hk_private = val;} while (0)
@@ -396,11 +397,11 @@ struct ng_node {
* Public methods for nodes.
* If you can't do it with these you probably shouldn't be doing it.
*/
-int ng_unref_node(node_p node); /* don't move this */
+void ng_unref_node(node_p node); /* don't move this */
#define _NG_NODE_NAME(node) ((node)->nd_name + 0)
#define _NG_NODE_HAS_NAME(node) ((node)->nd_name[0] + 0)
#define _NG_NODE_ID(node) ((node)->nd_ID + 0)
-#define _NG_NODE_REF(node) atomic_add_int(&(node)->nd_refs, 1)
+#define _NG_NODE_REF(node) refcount_acquire(&(node)->nd_refs)
#define _NG_NODE_UNREF(node) ng_unref_node(node)
#define _NG_NODE_SET_PRIVATE(node, val) do {(node)->nd_private = val;} while (0)
#define _NG_NODE_PRIVATE(node) ((node)->nd_private)
@@ -441,7 +442,7 @@ static __inline char * _ng_node_name(node_p node, char *file, int line);
static __inline int _ng_node_has_name(node_p node, char *file, int line);
static __inline ng_ID_t _ng_node_id(node_p node, char *file, int line);
static __inline void _ng_node_ref(node_p node, char *file, int line);
-static __inline int _ng_node_unref(node_p node, char *file, int line);
+static __inline void _ng_node_unref(node_p node, char *file, int line);
static __inline void _ng_node_set_private(node_p node, void * val,
char *file, int line);
static __inline void * _ng_node_private(node_p node, char *file, int line);
@@ -492,11 +493,11 @@ _ng_node_ref(node_p node, char *file, int line)
_NG_NODE_REF(node);
}
-static __inline int
+static __inline void
_ng_node_unref(node_p node, char *file, int line)
{
_chknode(node, file, line);
- return (_NG_NODE_UNREF(node));
+ _NG_NODE_UNREF(node);
}
static __inline void
diff --git a/sys/netgraph/ng_base.c b/sys/netgraph/ng_base.c
index f67f247f..0918193 100644
--- a/sys/netgraph/ng_base.c
+++ b/sys/netgraph/ng_base.c
@@ -772,18 +772,14 @@ ng_rmnode(node_p node, hook_p dummy1, void *dummy2, int dummy3)
* Remove a reference to the node, possibly the last.
* deadnode always acts as it it were the last.
*/
-int
+void
ng_unref_node(node_p node)
{
- int v;
-
- if (node == &ng_deadnode) {
- return (0);
- }
- v = atomic_fetchadd_int(&node->nd_refs, -1);
+ if (node == &ng_deadnode)
+ return;
- if (v == 1) { /* we were the last */
+ if (refcount_release(&node->nd_refs)) { /* we were the last */
mtx_lock(&ng_namehash_mtx);
node->nd_type->refs--; /* XXX maybe should get types lock? */
@@ -797,7 +793,6 @@ ng_unref_node(node_p node)
mtx_destroy(&node->nd_input_queue.q_mtx);
NG_FREE_NODE(node);
}
- return (v - 1);
}
/************************************************************************
@@ -963,15 +958,11 @@ ng_unname(node_p node)
void
ng_unref_hook(hook_p hook)
{
- int v;
- if (hook == &ng_deadhook) {
+ if (hook == &ng_deadhook)
return;
- }
-
- v = atomic_fetchadd_int(&hook->hk_refs, -1);
- if (v == 1) { /* we were the last */
+ if (refcount_release(&hook->hk_refs)) { /* we were the last */
if (_NG_HOOK_NODE(hook)) /* it'll probably be ng_deadnode */
_NG_NODE_UNREF((_NG_HOOK_NODE(hook)));
NG_FREE_HOOK(hook);
diff --git a/sys/netgraph/ng_ether.c b/sys/netgraph/ng_ether.c
index b51d048..afedaa3 100644
--- a/sys/netgraph/ng_ether.c
+++ b/sys/netgraph/ng_ether.c
@@ -55,6 +55,7 @@
#include <sys/proc.h>
#include <sys/syslog.h>
#include <sys/socket.h>
+#include <sys/taskqueue.h>
#include <net/if.h>
#include <net/if_dl.h>
@@ -336,6 +337,7 @@ ng_ether_detach(struct ifnet *ifp)
const node_p node = IFP2NG(ifp);
const priv_p priv = NG_NODE_PRIVATE(node);
+ taskqueue_drain(taskqueue_swi, &ifp->if_linktask);
NG_NODE_REALLY_DIE(node); /* Force real removal of node */
/*
* We can't assume the ifnet is still around when we run shutdown
diff --git a/sys/netgraph/ng_iface.c b/sys/netgraph/ng_iface.c
index a08595f..e774098 100644
--- a/sys/netgraph/ng_iface.c
+++ b/sys/netgraph/ng_iface.c
@@ -777,6 +777,7 @@ ng_iface_rcvdata(hook_p hook, item_p item)
/* First chunk of an mbuf contains good junk */
if (harvest.point_to_point)
random_harvest(m, 16, 3, 0, RANDOM_NET);
+ M_SETFIB(m, ifp->if_fib);
netisr_dispatch(isr, m);
return (0);
}
diff --git a/sys/netgraph/ng_socket.c b/sys/netgraph/ng_socket.c
index c5d887b..f72f822 100644
--- a/sys/netgraph/ng_socket.c
+++ b/sys/netgraph/ng_socket.c
@@ -525,33 +525,32 @@ ng_attach_cntl(struct socket *so)
{
struct ngsock *priv;
struct ngpcb *pcbp;
+ node_p node;
int error;
- /* Allocate node private info */
- priv = malloc(sizeof(*priv), M_NETGRAPH_SOCK, M_WAITOK | M_ZERO);
-
/* Setup protocol control block */
- if ((error = ng_attach_common(so, NG_CONTROL)) != 0) {
- free(priv, M_NETGRAPH_SOCK);
+ if ((error = ng_attach_common(so, NG_CONTROL)) != 0)
return (error);
- }
pcbp = sotongpcb(so);
- /* Link the pcb the private data. */
- priv->ctlsock = pcbp;
- pcbp->sockdata = priv;
- priv->refs++;
-
- /* Initialize mutex. */
- mtx_init(&priv->mtx, "ng_socket", NULL, MTX_DEF);
-
/* Make the generic node components */
- if ((error = ng_make_node_common(&typestruct, &priv->node)) != 0) {
- free(priv, M_NETGRAPH_SOCK);
+ if ((error = ng_make_node_common(&typestruct, &node)) != 0) {
ng_detach_common(pcbp, NG_CONTROL);
return (error);
}
+ /* Allocate node private info */
+ priv = malloc(sizeof(*priv), M_NETGRAPH_SOCK, M_WAITOK | M_ZERO);
+
+ /* Initialize mutex. */
+ mtx_init(&priv->mtx, "ng_socket", NULL, MTX_DEF);
+
+ /* Link the pcb the private data. */
+ priv->ctlsock = pcbp;
+ pcbp->sockdata = priv;
+ priv->refs++;
+ priv->node = node;
+
/* Store a hint for netstat(1). */
priv->node_id = priv->node->nd_ID;
diff --git a/sys/netinet/if_ether.c b/sys/netinet/if_ether.c
index 6a66c05..f766fc4 100644
--- a/sys/netinet/if_ether.c
+++ b/sys/netinet/if_ether.c
@@ -694,11 +694,13 @@ match:
bcmp(ar_sha(ah), &la->ll_addr, ifp->if_addrlen)) {
if (la->la_flags & LLE_STATIC) {
LLE_WUNLOCK(la);
- log(LOG_ERR,
- "arp: %*D attempts to modify permanent "
- "entry for %s on %s\n",
- ifp->if_addrlen, (u_char *)ar_sha(ah), ":",
- inet_ntoa(isaddr), ifp->if_xname);
+ if (log_arp_permanent_modify)
+ log(LOG_ERR,
+ "arp: %*D attempts to modify "
+ "permanent entry for %s on %s\n",
+ ifp->if_addrlen,
+ (u_char *)ar_sha(ah), ":",
+ inet_ntoa(isaddr), ifp->if_xname);
goto reply;
}
if (log_arp_movements) {
@@ -857,6 +859,7 @@ reply:
ah->ar_pro = htons(ETHERTYPE_IP); /* let's be sure! */
m->m_len = sizeof(*ah) + (2 * ah->ar_pln) + (2 * ah->ar_hln);
m->m_pkthdr.len = m->m_len;
+ m->m_pkthdr.rcvif = NULL;
sa.sa_family = AF_ARP;
sa.sa_len = 2;
(*ifp->if_output)(ifp, m, &sa, NULL);
diff --git a/sys/netinet/in.c b/sys/netinet/in.c
index 7ae8477..c090117 100644
--- a/sys/netinet/in.c
+++ b/sys/netinet/in.c
@@ -1416,6 +1416,18 @@ in_lltable_rtcheck(struct ifnet *ifp, u_int flags, const struct sockaddr *l3addr
/* XXX rtalloc1 should take a const param */
rt = rtalloc1(__DECONST(struct sockaddr *, l3addr), 0, 0);
+
+ /*
+ * If the gateway for an existing host route matches the target L3
+ * address, allow for ARP to proceed.
+ */
+ if (rt != NULL && (rt->rt_flags & (RTF_HOST|RTF_GATEWAY)) &&
+ rt->rt_gateway->sa_family == AF_INET &&
+ memcmp(rt->rt_gateway->sa_data, l3addr->sa_data, 4) == 0) {
+ RTFREE_LOCKED(rt);
+ return (0);
+ }
+
if (rt == NULL || (!(flags & LLE_PUB) &&
((rt->rt_flags & RTF_GATEWAY) ||
(rt->rt_ifp != ifp)))) {
@@ -1599,10 +1611,8 @@ in_domifattach(struct ifnet *ifp)
llt = lltable_init(ifp, AF_INET);
if (llt != NULL) {
- llt->llt_new = in_lltable_new;
llt->llt_free = in_lltable_free;
llt->llt_prefix_free = in_lltable_prefix_free;
- llt->llt_rtcheck = in_lltable_rtcheck;
llt->llt_lookup = in_lltable_lookup;
llt->llt_dump = in_lltable_dump;
}
diff --git a/sys/netinet/in_pcb.h b/sys/netinet/in_pcb.h
index dfef963..55270ec 100644
--- a/sys/netinet/in_pcb.h
+++ b/sys/netinet/in_pcb.h
@@ -179,8 +179,9 @@ struct inpcb {
u_char inp_ip_minttl; /* (i) minimum TTL or drop */
uint32_t inp_flowid; /* (x) flow id / queue id */
u_int inp_refcount; /* (i) refcount */
- void *inp_pspare[4]; /* (x) rtentry / general use */
- u_int inp_ispare[4]; /* general use */
+ void *inp_pspare[5]; /* (x) route caching / general use */
+ u_int inp_ispare[6]; /* (x) route caching / user cookie /
+ * general use */
/* Local and foreign ports, local and foreign addr. */
struct in_conninfo inp_inc; /* (i/p) list for PCB's local port */
diff --git a/sys/netinet/in_proto.c b/sys/netinet/in_proto.c
index d2a772f..a9a3890 100644
--- a/sys/netinet/in_proto.c
+++ b/sys/netinet/in_proto.c
@@ -163,7 +163,7 @@ struct protosw inetsw[] = {
},
#ifdef SCTP
{
- .pr_type = SOCK_DGRAM,
+ .pr_type = SOCK_SEQPACKET,
.pr_domain = &inetdomain,
.pr_protocol = IPPROTO_SCTP,
.pr_flags = PR_WANTRCVD,
@@ -177,18 +177,6 @@ struct protosw inetsw[] = {
.pr_drain = sctp_drain,
.pr_usrreqs = &sctp_usrreqs
},
-{
- .pr_type = SOCK_SEQPACKET,
- .pr_domain = &inetdomain,
- .pr_protocol = IPPROTO_SCTP,
- .pr_flags = PR_WANTRCVD,
- .pr_input = sctp_input,
- .pr_ctlinput = sctp_ctlinput,
- .pr_ctloutput = sctp_ctloutput,
- .pr_drain = sctp_drain,
- .pr_usrreqs = &sctp_usrreqs
-},
-
{
.pr_type = SOCK_STREAM,
.pr_domain = &inetdomain,
diff --git a/sys/netinet/libalias/libalias.3 b/sys/netinet/libalias/libalias.3
index fb63a4c..b82b087 100644
--- a/sys/netinet/libalias/libalias.3
+++ b/sys/netinet/libalias/libalias.3
@@ -25,7 +25,7 @@
.\"
.\" $FreeBSD$
.\"
-.Dd June 22, 2011
+.Dd July 04, 2011
.Dt LIBALIAS 3
.Os
.Sh NAME
@@ -52,7 +52,7 @@ machine on the local network.
.Pp
A certain amount of flexibility is built into the packet aliasing engine.
In the simplest mode of operation, a many-to-one address mapping takes
-place between local network and the packet aliasing host.
+place between the local network and the packet aliasing host.
This is known as IP masquerading.
In addition, one-to-one mappings between local and public addresses can
also be implemented, which is known as static NAT.
@@ -61,15 +61,11 @@ linked to different public addresses, comprising several distinct
many-to-one mappings.
Also, a given public address and port can be statically redirected to a
private address/port.
-.Pp
-The packet aliasing engine was designed to operate in user space outside
-of the kernel, without any access to private kernel data structure, but
-the source code can also be ported to a kernel environment.
.Sh INITIALIZATION AND CONTROL
One special function,
.Fn LibAliasInit ,
-must always be called before any packet handling may be performed and
-the returned instance pointer passed to all the other functions.
+must always be called before any packet handling may be performed, and
+the returned instance pointer must be passed to all the other functions.
Normally, the
.Fn LibAliasSetAddress
function is called afterwards, to set the default aliasing address.
@@ -118,8 +114,8 @@ prior to any packet handling.
This function has no return value and is used to clear any
resources attached to internal data structures.
.Pp
-This functions should be called when a program stops using the aliasing
-engine; it does, amongst other things, clear out any firewall holes.
+This function should be called when a program stops using the aliasing
+engine; amongst other things, it clears out any firewall holes.
To provide backwards compatibility and extra security, it is added to
the
.Xr atexit 3
@@ -135,7 +131,7 @@ local area network are aliased.
All outgoing packets are re-mapped to this address unless overridden by a
static address mapping established by
.Fn LibAliasRedirectAddr .
-If this function is not called, and no static rules match, an outgoing
+If this function has not been called, and no static rules match, an outgoing
packet retains its source address.
.Pp
If the
@@ -150,7 +146,7 @@ address may or may not change on successive dial-up attempts.
If the
.Dv PKT_ALIAS_RESET_ON_ADDR_CHANGE
mode bit is set to zero, this function can also be used to dynamically change
-the aliasing address on a packet to packet basis (it is a low overhead call).
+the aliasing address on a packet-to-packet basis (it is a low overhead call).
.Pp
It is mandatory that this function be called prior to any packet handling.
.Ed
@@ -170,7 +166,7 @@ The following mode bits are defined in
.It Dv PKT_ALIAS_LOG
Enables logging into
.Pa /var/log/alias.log .
-Each time an aliasing link is created or deleted, the log file is appended
+Each time an aliasing link is created or deleted, the log file is appended to
with the current number of ICMP, TCP and UDP links.
Mainly useful for debugging when the log file is viewed continuously with
.Xr tail 1 .
@@ -186,7 +182,7 @@ Response packets to connections or transactions initiated from the packet
aliasing host or local network will be unaffected.
This mode bit is useful for implementing a one-way firewall.
.It Dv PKT_ALIAS_SAME_PORTS
-If this mode bit is set, the packet aliasing engine will attempt to leave
+If this mode bit is set, the packet-aliasing engine will attempt to leave
the alias port numbers unchanged from the actual local port numbers.
This can be done as long as the quintuple (proto, alias addr, alias port,
remote addr, remote port) is unique.
@@ -211,7 +207,7 @@ Standard Class A, B and C unregistered addresses are:
192.168.0.0 -> 192.168.255.255 (Class C subnets)
.Ed
.Pp
-This option is useful in the case that packet aliasing host has both
+This option is useful in the case that the packet aliasing host has both
registered and unregistered subnets on different interfaces.
The registered subnet is fully accessible to the outside world, so traffic
from it does not need to be passed through the packet aliasing engine.
@@ -229,8 +225,9 @@ of an address change.
.It Dv PKT_ALIAS_PUNCH_FW
This option makes
.Nm
-`punch holes' in an
-.Xr ipfirewall 4
+.Dq punch holes
+in an
+.Xr ipfirewall 4 -
based firewall for FTP/IRC DCC connections.
The holes punched are bound by from/to IP address and port; it will not be
possible to use a hole for another connection.
@@ -240,9 +237,9 @@ To cater to unexpected death of a program using
(e.g.\& kill -9),
changing the state of the flag will clear the entire firewall range
allocated for holes.
-This will also happen on the initial call to
-.Fn LibAliasSetFWBase .
-This call must happen prior to setting this flag.
+This clearing will also happen on the initial call to
+.Fn LibAliasSetFWBase ,
+which must happen prior to setting this flag.
.It Dv PKT_ALIAS_REVERSE
This option makes
.Nm
@@ -260,9 +257,11 @@ below for details.
.It Dv PKT_ALIAS_SKIP_GLOBAL
This option is used by
.Pa ipfw_nat
-only. Specifying it as a flag to
+only.
+Specifying it as a flag to
.Fn LibAliasSetMode
-has no effect. See section
+has no effect.
+See section
.Sx NETWORK ADDRESS TRANSLATION
in
.Xr ipfw 8
@@ -273,10 +272,10 @@ for more details.
.Ft void
.Fn LibAliasSetFWBase "struct libalias *" "unsigned int base" "unsigned int num"
.Bd -ragged -offset indent
-Set firewall range allocated for punching firewall holes (with the
+Set the firewall range allocated for punching firewall holes (with the
.Dv PKT_ALIAS_PUNCH_FW
flag).
-The range will be cleared for all rules on initialization.
+The range is cleared for all rules on initialization.
.Ed
.Pp
.Ft void
@@ -302,7 +301,7 @@ the two packet handling functions,
.Fn LibAliasIn
and
.Fn LibAliasOut ,
-comprise minimal set of functions needed for a basic IP masquerading
+comprise the minimal set of functions needed for a basic IP masquerading
implementation.
.Pp
.Ft int
@@ -323,11 +322,11 @@ Return codes:
The packet aliasing process was successful.
.It Dv PKT_ALIAS_IGNORED
The packet was ignored and not de-aliased.
-This can happen if the protocol is unrecognized, possibly an ICMP message
-type is not handled or if incoming packets for new connections are being
-ignored (if
+This can happen if the protocol is unrecognized, as for an ICMP message
+type that is not handled, or if incoming packets for new connections are being
+ignored (if the
.Dv PKT_ALIAS_DENY_INCOMING
-mode bit was set by
+mode bit was set using
.Fn LibAliasSetMode ) .
.It Dv PKT_ALIAS_UNRESOLVED_FRAGMENT
This is returned when a fragment cannot be resolved because the header
@@ -418,7 +417,7 @@ is called to change the address after
.Fn LibAliasRedirectPort
is called, a zero reference will track this change.
.Pp
-If the link is further set up to operate for a load sharing, then
+If the link is further set up to operate with load sharing, then
.Fa local_addr
and
.Fa local_port
@@ -433,7 +432,7 @@ Likewise, if
.Fa remote_port
is zero, this indicates to redirect packets originating from any remote
port number.
-Almost always, the remote port specification will be zero, but non-zero
+The remote port specification will almost always be zero, but non-zero
remote addresses can sometimes be useful for firewalling.
If two calls to
.Fn LibAliasRedirectPort
@@ -485,9 +484,10 @@ is called to change the address after
.Fn LibAliasRedirectAddr
is called, a zero reference will track this change.
.Pp
-If the link is further set up to operate for a load sharing, then
+If the link is further set up to operate with load sharing, then the
.Fa local_addr
-is ignored, and is selected dynamically from the server pool, as described in
+argument is ignored, and is selected dynamically from the server pool,
+as described in
.Fn LibAliasAddServer
below.
.Pp
@@ -542,12 +542,12 @@ up for Load Sharing using IP Network Address Translation (RFC 2391, LSNAT).
LSNAT operates as follows.
A client attempts to access a server by using the server virtual address.
The LSNAT router transparently redirects the request to one of the hosts
-in server pool, selected using a real-time load sharing algorithm.
+in the server pool, using a real-time load sharing algorithm.
Multiple sessions may be initiated from the same client, and each session
-could be directed to a different host based on load balance across server
-pool hosts at the time.
-If load share is desired for just a few specific services, the configuration
-on LSNAT could be defined to restrict load share for just the services
+could be directed to a different host based on the load balance across server
+pool hosts when the sessions are initiated.
+If load sharing is desired for just a few specific services, the configuration
+on LSNAT could be defined to restrict load sharing to just the services
desired.
.Pp
Currently, only the simplest selection algorithm is implemented, where a
@@ -606,8 +606,8 @@ The parameter
is the pointer returned by either of the redirection functions.
If an invalid pointer is passed to
.Fn LibAliasRedirectDelete ,
-then a program crash or unpredictable operation could result, so it is
-necessary to be careful using this function.
+then a program crash or unpredictable operation could result, so
+care is needed when using this function.
.Ed
.Pp
.Ft int
@@ -714,7 +714,7 @@ access, or to restrict access to certain external machines.
.Bd -ragged -offset indent
This function specifies that any IP packet with protocol number of
.Fa proto
-from a given remote address to an alias address be
+from a given remote address to an alias address will be
redirected to a specified local address.
.Pp
If
@@ -829,10 +829,12 @@ is the pointer to the packet to be de-aliased.
"struct in_addr alias_addr" "u_short src_port" "u_short dst_port" \
"int alias_param" "int link_type"
.Bd -ragged -offset indent
-This function adds new state to instance hash table.
-Zero can be specified instead of dst_address and/or dst port.
-This makes link partially specified dynamic.
-However due to hashing method such links can be resolved on inbound (ext -> int) only.
+This function adds new state to the instance hash table.
+The dst_address and/or dst_port may be given as zero, which
+introduces some dynamic character into the link, since
+LibAliasSetAddress can change the address that is used.
+However, in the current implementation, such links can only be used
+for inbound (ext -> int) traffic.
.Ed
.Pp
.Ft void
@@ -1119,9 +1121,9 @@ SLIST_HEAD(dll_chain, dll) dll_chain ...
.Ed
.Pp
.Va handler_chain
-keep tracks of all the protocol handlers loaded, while
+keeps track of all the protocol handlers loaded, while
.Va ddl_chain
-takes care of userland modules loaded.
+tracks which userland modules are loaded.
.Pp
.Va handler_chain
is composed of
@@ -1143,12 +1145,12 @@ struct proto_handler {
where:
.Bl -inset
.It Va pri
-is the priority assigned to a protocol handler, lower
+is the priority assigned to a protocol handler; lower priority
is better.
.It Va dir
is the direction of packets: ingoing or outgoing.
.It Va proto
-says at which protocol this packet belongs: IP, TCP or UDP.
+indicates to which protocol this packet belongs: IP, TCP or UDP.
.It Va fingerprint
points to the fingerprint function while protohandler points
to the protocol handler function.
@@ -1156,8 +1158,8 @@ to the protocol handler function.
.Pp
The
.Va fingerprint
-function has the double of scope of checking if the
-incoming packet is found and if it belongs to any categories that this
+function has the dual role of checking if the
+incoming packet is found, and if it belongs to any categories that this
module can handle.
.Pp
The
@@ -1172,8 +1174,8 @@ When a packet enters
if it meets a module hook,
.Va handler_chain
is searched to see if there is an handler that matches
-this type of a packet (it checks protocol and direction of packet), then if
-more than one handler is found, it starts with the module with
+this type of a packet (it checks protocol and direction of packet).
+Then, if more than one handler is found, it starts with the module with
the lowest priority number: it calls the
.Va fingerprint
function and interprets the result.
@@ -1211,8 +1213,8 @@ structure, then
is called.
The
.Fn find_handler
-function is responsible for walking out the handler
-chain, it receives as input parameters:
+function is responsible for walking the handler
+chain; it receives as input parameters:
.Bl -tag -width indent
.It Fa IN
direction
@@ -1236,9 +1238,9 @@ supporting INcoming UDP packets.
.Pp
As was mentioned earlier,
.Nm
-in userland is a bit different, cause
-care has to be taken of module handling too (avoiding duplicate load of
-module, avoiding module with same name, etc.) so
+in userland is a bit different, as
+care must be taken in module handling as well (avoiding duplicate load of
+modules, avoiding modules with same name, etc.) so
.Va dll_chain
was introduced.
.Pp
@@ -1252,9 +1254,8 @@ When an application calls
.Nm
first unloads all the loaded modules, then reloads all the modules listed in
.Pa /etc/libalias.conf :
-for every module loaded, a new entry to
-.Va dll_chain
-is added.
+for every module loaded, a new entry is added to
+.Va dll_chain .
.Pp
.Va dll_chain
is composed of
@@ -1291,8 +1292,8 @@ There is a module (called
.Pa alias_dummy.[ch] )
in
.Nm
-that can be used as a skeleton for future work, here we analyse some parts of that
-module.
+that can be used as a skeleton for future work.
+Here we analyse some parts of that module.
From
.Pa alias_dummy.c :
.Bd -literal
@@ -1305,7 +1306,7 @@ The variable
is the
.Dq "most important thing"
in a module
-cause it describes the handlers present and lets the outside world use
+since it describes the handlers present and lets the outside world use
it in an opaque way.
.Pp
It must ALWAYS be present in every module, and it MUST retain
@@ -1348,7 +1349,7 @@ mod_handler(module_t mod, int type, void *data)
.Ed
When running as KLD,
.Fn mod_handler
-register/deregister the module using
+registers/deregisters the module using
.Fn attach_handlers
and
.Fn detach_handlers ,
diff --git a/sys/netinet/sctp_pcb.c b/sys/netinet/sctp_pcb.c
index 8dc01cd..7059365 100644
--- a/sys/netinet/sctp_pcb.c
+++ b/sys/netinet/sctp_pcb.c
@@ -2523,8 +2523,7 @@ sctp_inpcb_alloc(struct socket *so, uint32_t vrf_id)
so->so_pcb = (caddr_t)inp;
- if ((SCTP_SO_TYPE(so) == SOCK_DGRAM) ||
- (SCTP_SO_TYPE(so) == SOCK_SEQPACKET)) {
+ if (SCTP_SO_TYPE(so) == SOCK_SEQPACKET) {
/* UDP style socket */
inp->sctp_flags = (SCTP_PCB_FLAGS_UDPTYPE |
SCTP_PCB_FLAGS_UNBOUND);
@@ -3721,13 +3720,6 @@ sctp_inpcb_free(struct sctp_inpcb *inp, int immediate, int from)
(void)sctp_m_free(ip_pcb->inp_options);
ip_pcb->inp_options = 0;
}
-#ifdef INET
- if (ip_pcb->inp_moptions) {
- inp_freemoptions(ip_pcb->inp_moptions);
- ip_pcb->inp_moptions = 0;
- }
-#endif
-
#ifdef INET6
if (ip_pcb->inp_vflag & INP_IPV6) {
struct in6pcb *in6p;
diff --git a/sys/netinet/sctp_uio.h b/sys/netinet/sctp_uio.h
index d3b186d..9b9acbf 100644
--- a/sys/netinet/sctp_uio.h
+++ b/sys/netinet/sctp_uio.h
@@ -591,6 +591,7 @@ struct sctp_authchunk {
struct sctp_authkey {
sctp_assoc_t sca_assoc_id;
uint16_t sca_keynumber;
+ uint16_t sca_keylength;
uint8_t sca_key[];
};
diff --git a/sys/netinet/sctp_usrreq.c b/sys/netinet/sctp_usrreq.c
index 4c1d726..ab87772 100644
--- a/sys/netinet/sctp_usrreq.c
+++ b/sys/netinet/sctp_usrreq.c
@@ -3571,8 +3571,18 @@ sctp_setopt(struct socket *so, int optname, void *optval, size_t optsize,
size_t size;
SCTP_CHECK_AND_CAST(sca, optval, struct sctp_authkey, optsize);
+ if (sca->sca_keylength == 0) {
+ size = optsize - sizeof(struct sctp_authkey);
+ } else {
+ if (sca->sca_keylength + sizeof(struct sctp_authkey) <= optsize) {
+ size = sca->sca_keylength;
+ } else {
+ SCTP_LTRACE_ERR_RET(inp, NULL, NULL, SCTP_FROM_SCTP_USRREQ, EINVAL);
+ error = EINVAL;
+ break;
+ }
+ }
SCTP_FIND_STCB(inp, stcb, sca->sca_assoc_id);
- size = optsize - sizeof(struct sctp_authkey);
if (stcb) {
shared_keys = &stcb->asoc.shared_keys;
diff --git a/sys/netinet/tcp_lro.c b/sys/netinet/tcp_lro.c
index 27384c5..6569eda 100644
--- a/sys/netinet/tcp_lro.c
+++ b/sys/netinet/tcp_lro.c
@@ -277,6 +277,14 @@ tcp_lro_rx(struct lro_ctrl *cntl, struct mbuf *m_head, uint32_t csum)
lro->dest_port == tcp->th_dport &&
lro->source_ip == ip->ip_src.s_addr &&
lro->dest_ip == ip->ip_dst.s_addr) {
+ /* Flush now if appending will result in overflow. */
+ if (lro->len > (65535 - tcp_data_len)) {
+ SLIST_REMOVE(&cntl->lro_active, lro,
+ lro_entry, next);
+ tcp_lro_flush(cntl, lro);
+ break;
+ }
+
/* Try to append it */
if (__predict_false(seq != lro->next_seq ||
diff --git a/sys/netinet/tcp_output.c b/sys/netinet/tcp_output.c
index 4542ac5..572a491 100644
--- a/sys/netinet/tcp_output.c
+++ b/sys/netinet/tcp_output.c
@@ -84,10 +84,6 @@ __FBSDID("$FreeBSD$");
#include <security/mac/mac_framework.h>
-#ifdef notyet
-extern struct mbuf *m_copypack();
-#endif
-
VNET_DEFINE(int, path_mtu_discovery) = 1;
SYSCTL_VNET_INT(_net_inet_tcp, OID_AUTO, path_mtu_discovery, CTLFLAG_RW,
&VNET_NAME(path_mtu_discovery), 1,
@@ -820,19 +816,6 @@ send:
TCPSTAT_INC(tcps_sndpack);
TCPSTAT_ADD(tcps_sndbyte, len);
}
-#ifdef notyet
- if ((m = m_copypack(so->so_snd.sb_mb, off,
- (int)len, max_linkhdr + hdrlen)) == 0) {
- SOCKBUF_UNLOCK(&so->so_snd);
- error = ENOBUFS;
- goto out;
- }
- /*
- * m_copypack left space for our hdr; use it.
- */
- m->m_len += hdrlen;
- m->m_data -= hdrlen;
-#else
MGETHDR(m, M_DONTWAIT, MT_DATA);
if (m == NULL) {
SOCKBUF_UNLOCK(&so->so_snd);
@@ -872,7 +855,7 @@ send:
goto out;
}
}
-#endif /* notyet */
+
/*
* If we're sending everything we've got, set PUSH.
* (This will keep happy those implementations which only
diff --git a/sys/netinet/tcp_subr.c b/sys/netinet/tcp_subr.c
index 6ed58911..46b4022 100644
--- a/sys/netinet/tcp_subr.c
+++ b/sys/netinet/tcp_subr.c
@@ -206,11 +206,9 @@ SYSCTL_VNET_INT(_net_inet_tcp, OID_AUTO, isn_reseed_interval, CTLFLAG_RW,
&VNET_NAME(tcp_isn_reseed_interval), 0,
"Seconds between reseeding of ISN secret");
-#ifdef TCP_SORECEIVE_STREAM
static int tcp_soreceive_stream = 0;
SYSCTL_INT(_net_inet_tcp, OID_AUTO, soreceive_stream, CTLFLAG_RDTUN,
&tcp_soreceive_stream, 0, "Using soreceive_stream for TCP sockets");
-#endif
#ifdef TCP_SIGNATURE
static int tcp_sig_checksigs = 1;
@@ -337,13 +335,15 @@ tcp_init(void)
tcp_finwait2_timeout = TCPTV_FINWAIT2_TIMEOUT;
tcp_tcbhashsize = hashsize;
-#ifdef TCP_SORECEIVE_STREAM
TUNABLE_INT_FETCH("net.inet.tcp.soreceive_stream", &tcp_soreceive_stream);
if (tcp_soreceive_stream) {
+#ifdef INET
tcp_usrreqs.pru_soreceive = soreceive_stream;
+#endif
+#ifdef INET6
tcp6_usrreqs.pru_soreceive = soreceive_stream;
+#endif /* INET6 */
}
-#endif
#ifdef INET6
#define TCP_MINPROTOHDR (sizeof(struct ip6_hdr) + sizeof(struct tcphdr))
@@ -541,6 +541,7 @@ tcp_respond(struct tcpcb *tp, void *ipgen, struct tcphdr *th, struct mbuf *m,
m_freem(m->m_next);
m->m_next = NULL;
m->m_data = (caddr_t)ipgen;
+ m_addr_changed(m);
/* m_len is set later */
tlen = 0;
#define xchg(a,b,type) { type t; t=a; a=b; b=t; }
diff --git a/sys/netinet/tcp_syncache.h b/sys/netinet/tcp_syncache.h
index ddfa459..5783b6d 100644
--- a/sys/netinet/tcp_syncache.h
+++ b/sys/netinet/tcp_syncache.h
@@ -81,6 +81,8 @@ struct syncache {
#endif
struct label *sc_label; /* MAC label reference */
struct ucred *sc_cred; /* cred cache for jail checks */
+
+ u_int32_t sc_spare[2]; /* UTO */
};
/*
diff --git a/sys/netinet/tcp_var.h b/sys/netinet/tcp_var.h
index e8189b0..bbf392f 100644
--- a/sys/netinet/tcp_var.h
+++ b/sys/netinet/tcp_var.h
@@ -203,9 +203,9 @@ struct tcpcb {
struct cc_var *ccv; /* congestion control specific vars */
struct osd *osd; /* storage for Khelp module data */
- int t_ispare; /* explicit pad for 64bit alignment */
+ uint32_t t_ispare[12]; /* 4 keep timers, 5 UTO, 3 TBD */
void *t_pspare2[4]; /* 4 TBD */
- uint64_t _pad[12]; /* 7 UTO, 5 TBD (1-2 CC/RTT?) */
+ uint64_t _pad[6]; /* 6 TBD (1-2 CC/RTT?) */
};
/*
@@ -300,6 +300,7 @@ struct tcpopt {
u_int16_t to_mss; /* maximum segment size */
u_int8_t to_wscale; /* window scaling */
u_int8_t to_nsacks; /* number of SACK blocks */
+ u_int32_t to_spare; /* UTO */
};
/*
diff --git a/sys/netinet6/in6.c b/sys/netinet6/in6.c
index 9558d1b..39e77e9 100644
--- a/sys/netinet6/in6.c
+++ b/sys/netinet6/in6.c
@@ -2636,10 +2636,8 @@ in6_domifattach(struct ifnet *ifp)
ext->scope6_id = scope6_ifattach(ifp);
ext->lltable = lltable_init(ifp, AF_INET6);
if (ext->lltable != NULL) {
- ext->lltable->llt_new = in6_lltable_new;
ext->lltable->llt_free = in6_lltable_free;
ext->lltable->llt_prefix_free = in6_lltable_prefix_free;
- ext->lltable->llt_rtcheck = in6_lltable_rtcheck;
ext->lltable->llt_lookup = in6_lltable_lookup;
ext->lltable->llt_dump = in6_lltable_dump;
}
diff --git a/sys/netinet6/in6_proto.c b/sys/netinet6/in6_proto.c
index 9e78e9a..e03e640 100644
--- a/sys/netinet6/in6_proto.c
+++ b/sys/netinet6/in6_proto.c
@@ -192,41 +192,29 @@ struct ip6protosw inet6sw[] = {
},
#ifdef SCTP
{
- .pr_type = SOCK_DGRAM,
- .pr_domain = &inet6domain,
- .pr_protocol = IPPROTO_SCTP,
- .pr_flags = PR_WANTRCVD,
- .pr_input = sctp6_input,
- .pr_ctlinput = sctp6_ctlinput,
- .pr_ctloutput = sctp_ctloutput,
- .pr_drain = sctp_drain,
+ .pr_type = SOCK_SEQPACKET,
+ .pr_domain = &inet6domain,
+ .pr_protocol = IPPROTO_SCTP,
+ .pr_flags = PR_WANTRCVD,
+ .pr_input = sctp6_input,
+ .pr_ctlinput = sctp6_ctlinput,
+ .pr_ctloutput = sctp_ctloutput,
+ .pr_drain = sctp_drain,
#ifndef INET /* Do not call initialization twice. */
- .pr_init = sctp_init,
+ .pr_init = sctp_init,
#endif
- .pr_usrreqs = &sctp6_usrreqs
-},
-{
- .pr_type = SOCK_SEQPACKET,
- .pr_domain = &inet6domain,
- .pr_protocol = IPPROTO_SCTP,
- .pr_flags = PR_WANTRCVD,
- .pr_input = sctp6_input,
- .pr_ctlinput = sctp6_ctlinput,
- .pr_ctloutput = sctp_ctloutput,
- .pr_drain = sctp_drain,
- .pr_usrreqs = &sctp6_usrreqs
+ .pr_usrreqs = &sctp6_usrreqs
},
-
{
- .pr_type = SOCK_STREAM,
- .pr_domain = &inet6domain,
- .pr_protocol = IPPROTO_SCTP,
- .pr_flags = PR_WANTRCVD,
- .pr_input = sctp6_input,
- .pr_ctlinput = sctp6_ctlinput,
- .pr_ctloutput = sctp_ctloutput,
- .pr_drain = sctp_drain,
- .pr_usrreqs = &sctp6_usrreqs
+ .pr_type = SOCK_STREAM,
+ .pr_domain = &inet6domain,
+ .pr_protocol = IPPROTO_SCTP,
+ .pr_flags = PR_WANTRCVD,
+ .pr_input = sctp6_input,
+ .pr_ctlinput = sctp6_ctlinput,
+ .pr_ctloutput = sctp_ctloutput,
+ .pr_drain = sctp_drain,
+ .pr_usrreqs = &sctp6_usrreqs
},
#endif /* SCTP */
{
diff --git a/sys/pc98/cbus/pckbd.c b/sys/pc98/cbus/pckbd.c
index 24f7267..5efb983 100644
--- a/sys/pc98/cbus/pckbd.c
+++ b/sys/pc98/cbus/pckbd.c
@@ -799,6 +799,7 @@ pckbd_ioctl(keyboard_t *kbd, u_long cmd, caddr_t arg)
break;
case PIO_KEYMAP: /* set keyboard translation table */
+ case OPIO_KEYMAP: /* set keyboard translation table (compat) */
case PIO_KEYMAPENT: /* set keyboard translation table entry */
case PIO_DEADKEYMAP: /* set accent key translation table */
state->ks_accents = 0;
diff --git a/sys/pc98/conf/DEFAULTS b/sys/pc98/conf/DEFAULTS
index f30501e..6c8b561 100644
--- a/sys/pc98/conf/DEFAULTS
+++ b/sys/pc98/conf/DEFAULTS
@@ -27,3 +27,5 @@ options GEOM_PART_PC98
# enable support for native hardware
device atpic
+
+options NEW_PCIB
diff --git a/sys/powerpc/aim/locore32.S b/sys/powerpc/aim/locore32.S
index d0a3778..ed74af2 100644
--- a/sys/powerpc/aim/locore32.S
+++ b/sys/powerpc/aim/locore32.S
@@ -90,11 +90,14 @@ GLOBAL(esym)
#define INTRCNT_COUNT 256 /* max(HROWPIC_IRQMAX,OPENPIC_IRQMAX) */
GLOBAL(intrnames)
.space INTRCNT_COUNT * (MAXCOMLEN + 1) * 2
-GLOBAL(eintrnames)
+GLOBAL(sintrnames)
+ .word INTRCNT_COUNT * (MAXCOMLEN + 1) * 2
+
.align 4
GLOBAL(intrcnt)
.space INTRCNT_COUNT * 4 * 2
-GLOBAL(eintrcnt)
+GLOBAL(sintrcnt)
+ .word INTRCNT_COUNT * 4 * 2
.text
.globl btext
diff --git a/sys/powerpc/aim/locore64.S b/sys/powerpc/aim/locore64.S
index 5af5e3a..9a54b79 100644
--- a/sys/powerpc/aim/locore64.S
+++ b/sys/powerpc/aim/locore64.S
@@ -90,11 +90,14 @@ GLOBAL(esym)
#define INTRCNT_COUNT 256 /* max(HROWPIC_IRQMAX,OPENPIC_IRQMAX) */
GLOBAL(intrnames)
.space INTRCNT_COUNT * (MAXCOMLEN + 1) * 2
-GLOBAL(eintrnames)
+GLOBAL(sintrnames)
+ .word INTRCNT_COUNT * (MAXCOMLEN + 1) * 2
+
.align 4
GLOBAL(intrcnt)
.space INTRCNT_COUNT * 4 * 2
-GLOBAL(eintrcnt)
+GLOBAL(sintrcnt)
+ .word INTRCNT_COUNT * 4 * 2
.text
.globl btext
diff --git a/sys/powerpc/aim/mmu_oea.c b/sys/powerpc/aim/mmu_oea.c
index be80455..23354f9 100644
--- a/sys/powerpc/aim/mmu_oea.c
+++ b/sys/powerpc/aim/mmu_oea.c
@@ -945,9 +945,7 @@ moea_activate(mmu_t mmu, struct thread *td)
pm = &td->td_proc->p_vmspace->vm_pmap;
pmr = pm->pmap_phys;
- sched_pin();
- CPU_OR(&pm->pm_active, PCPU_PTR(cpumask));
- sched_unpin();
+ CPU_SET(PCPU_GET(cpuid), &pm->pm_active);
PCPU_SET(curpmap, pmr);
}
@@ -957,9 +955,7 @@ moea_deactivate(mmu_t mmu, struct thread *td)
pmap_t pm;
pm = &td->td_proc->p_vmspace->vm_pmap;
- sched_pin();
- CPU_NAND(&pm->pm_active, PCPU_PTR(cpumask));
- sched_unpin();
+ CPU_CLR(PCPU_GET(cpuid), &pm->pm_active);
PCPU_SET(curpmap, NULL);
}
diff --git a/sys/powerpc/aim/mmu_oea64.c b/sys/powerpc/aim/mmu_oea64.c
index 8f4028f..f051b61 100644
--- a/sys/powerpc/aim/mmu_oea64.c
+++ b/sys/powerpc/aim/mmu_oea64.c
@@ -998,9 +998,7 @@ moea64_activate(mmu_t mmu, struct thread *td)
pmap_t pm;
pm = &td->td_proc->p_vmspace->vm_pmap;
- sched_pin();
- CPU_OR(&pm->pm_active, PCPU_PTR(cpumask));
- sched_unpin();
+ CPU_SET(PCPU_GET(cpuid), &pm->pm_active);
#ifdef __powerpc64__
PCPU_SET(userslb, pm->pm_slb);
@@ -1015,9 +1013,7 @@ moea64_deactivate(mmu_t mmu, struct thread *td)
pmap_t pm;
pm = &td->td_proc->p_vmspace->vm_pmap;
- sched_pin();
- CPU_NAND(&pm->pm_active, PCPU_PTR(cpumask));
- sched_unpin();
+ CPU_CLR(PCPU_GET(cpuid), &pm->pm_active);
#ifdef __powerpc64__
PCPU_SET(userslb, NULL);
#else
diff --git a/sys/powerpc/booke/locore.S b/sys/powerpc/booke/locore.S
index de7effc..216962d 100644
--- a/sys/powerpc/booke/locore.S
+++ b/sys/powerpc/booke/locore.S
@@ -789,10 +789,13 @@ GLOBAL(kernload)
.long 0
GLOBAL(intrnames)
.space INTRCNT_COUNT * (MAXCOMLEN + 1) * 2
-GLOBAL(eintrnames)
+GLOBAL(sintrnames)
+ .word INTRCNT_COUNT * (MAXCOMLEN + 1) * 2
+
.align 4
GLOBAL(intrcnt)
.space INTRCNT_COUNT * 4 * 2
-GLOBAL(eintrcnt)
+GLOBAL(sintrcnt)
+ .word INTRCNT_COUNT * 4 * 2
#include <powerpc/booke/trap_subr.S>
diff --git a/sys/powerpc/booke/pmap.c b/sys/powerpc/booke/pmap.c
index e1cd071..18068fc 100644
--- a/sys/powerpc/booke/pmap.c
+++ b/sys/powerpc/booke/pmap.c
@@ -1826,6 +1826,7 @@ static void
mmu_booke_activate(mmu_t mmu, struct thread *td)
{
pmap_t pmap;
+ u_int cpuid;
pmap = &td->td_proc->p_vmspace->vm_pmap;
@@ -1836,14 +1837,15 @@ mmu_booke_activate(mmu_t mmu, struct thread *td)
mtx_lock_spin(&sched_lock);
- CPU_OR_ATOMIC(&pmap->pm_active, PCPU_PTR(cpumask));
+ cpuid = PCPU_GET(cpuid);
+ CPU_SET_ATOMIC(cpuid, &pmap->pm_active);
PCPU_SET(curpmap, pmap);
- if (pmap->pm_tid[PCPU_GET(cpuid)] == TID_NONE)
+ if (pmap->pm_tid[cpuid] == TID_NONE)
tid_alloc(pmap);
/* Load PID0 register with pmap tid value. */
- mtspr(SPR_PID0, pmap->pm_tid[PCPU_GET(cpuid)]);
+ mtspr(SPR_PID0, pmap->pm_tid[cpuid]);
__asm __volatile("isync");
mtx_unlock_spin(&sched_lock);
@@ -1865,9 +1867,7 @@ mmu_booke_deactivate(mmu_t mmu, struct thread *td)
CTR5(KTR_PMAP, "%s: td=%p, proc = '%s', id = %d, pmap = 0x%08x",
__func__, td, td->td_proc->p_comm, td->td_proc->p_pid, pmap);
- sched_pin();
- CPU_NAND_ATOMIC(&pmap->pm_active, PCPU_PTR(cpumask));
- sched_unpin();
+ CPU_CLR_ATOMIC(PCPU_GET(cpuid), &pmap->pm_active);
PCPU_SET(curpmap, NULL);
}
diff --git a/sys/powerpc/conf/GENERIC b/sys/powerpc/conf/GENERIC
index 2950a49..367ced5 100644
--- a/sys/powerpc/conf/GENERIC
+++ b/sys/powerpc/conf/GENERIC
@@ -31,6 +31,7 @@ options PSIM #GDB PSIM ppc simulator
options MAMBO #IBM Mambo Full System Simulator
options SCHED_ULE #ULE scheduler
+options PREEMPTION #Enable kernel thread preemption
options INET #InterNETworking
options INET6 #IPv6 communications protocols
options SCTP #Stream Control Transmission Protocol
diff --git a/sys/powerpc/conf/GENERIC64 b/sys/powerpc/conf/GENERIC64
index 7e385a1..e1e4aad 100644
--- a/sys/powerpc/conf/GENERIC64
+++ b/sys/powerpc/conf/GENERIC64
@@ -31,6 +31,7 @@ options PS3 #Sony Playstation 3
options MAMBO #IBM Mambo Full System Simulator
options SCHED_ULE #ULE scheduler
+options PREEMPTION #Enable kernel thread preemption
options INET #InterNETworking
options INET6 #IPv6 communications protocols
options SCTP #Stream Control Transmission Protocol
diff --git a/sys/powerpc/powerpc/mp_machdep.c b/sys/powerpc/powerpc/mp_machdep.c
index 3563376..db20a6f 100644
--- a/sys/powerpc/powerpc/mp_machdep.c
+++ b/sys/powerpc/powerpc/mp_machdep.c
@@ -171,9 +171,8 @@ cpu_mp_start(void)
pc->pc_cpuid = bsp.cr_cpuid;
pc->pc_bsp = 1;
}
- CPU_SETOF(pc->pc_cpuid, &pc->pc_cpumask);
pc->pc_hwref = cpu.cr_hwref;
- CPU_OR(&all_cpus, &pc->pc_cpumask);
+ CPU_SET(pc->pc_cpuid, &all_cpus);
next:
error = platform_smp_next_cpu(&cpu);
}
@@ -211,8 +210,6 @@ cpu_mp_unleash(void *dummy)
smp_cpus = 0;
STAILQ_FOREACH(pc, &cpuhead, pc_allcpu) {
cpus++;
- pc->pc_other_cpus = all_cpus;
- CPU_NAND(&pc->pc_other_cpus, &pc->pc_cpumask);
if (!pc->pc_bsp) {
if (bootverbose)
printf("Waking up CPU %d (dev=%x)\n",
@@ -274,7 +271,7 @@ SYSINIT(start_aps, SI_SUB_SMP, SI_ORDER_FIRST, cpu_mp_unleash, NULL);
int
powerpc_ipi_handler(void *arg)
{
- cpuset_t self;
+ u_int cpuid;
uint32_t ipimask;
int msg;
@@ -306,14 +303,14 @@ powerpc_ipi_handler(void *arg)
*/
CTR1(KTR_SMP, "%s: IPI_STOP or IPI_STOP_HARD (stop)",
__func__);
- savectx(&stoppcbs[PCPU_GET(cpuid)]);
- self = PCPU_GET(cpumask);
+ cpuid = PCPU_GET(cpuid);
+ savectx(&stoppcbs[cpuid]);
savectx(PCPU_GET(curpcb));
- CPU_OR_ATOMIC(&stopped_cpus, &self);
- while (!CPU_OVERLAP(&started_cpus, &self))
+ CPU_SET_ATOMIC(cpuid, &stopped_cpus);
+ while (!CPU_ISSET(cpuid, &started_cpus))
cpu_spinwait();
- CPU_NAND_ATOMIC(&started_cpus, &self);
- CPU_NAND_ATOMIC(&stopped_cpus, &self);
+ CPU_CLR_ATOMIC(cpuid, &stopped_cpus);
+ CPU_CLR_ATOMIC(cpuid, &started_cpus);
CTR1(KTR_SMP, "%s: IPI_STOP (restart)", __func__);
break;
case IPI_HARDCLOCK:
@@ -346,7 +343,7 @@ ipi_selected(cpuset_t cpus, int ipi)
struct pcpu *pc;
STAILQ_FOREACH(pc, &cpuhead, pc_allcpu) {
- if (CPU_OVERLAP(&cpus, &pc->pc_cpumask))
+ if (CPU_ISSET(pc->pc_cpuid, &cpus))
ipi_send(pc, ipi);
}
}
diff --git a/sys/powerpc/ps3/if_glc.c b/sys/powerpc/ps3/if_glc.c
index d87383d..ab5c172 100644
--- a/sys/powerpc/ps3/if_glc.c
+++ b/sys/powerpc/ps3/if_glc.c
@@ -155,7 +155,7 @@ glc_attach(device_t dev)
lv1_net_control(sc->sc_bus, sc->sc_dev, GELIC_GET_MAC_ADDRESS,
0, 0, 0, &mac64, &junk);
memcpy(sc->sc_enaddr, &((uint8_t *)&mac64)[2], sizeof(sc->sc_enaddr));
- sc->sc_tx_vlan = sc->sc_rx_vlan = -1;
+ sc->sc_tx_vlan = sc->sc_rx_vlan = -1;
err = lv1_net_control(sc->sc_bus, sc->sc_dev, GELIC_GET_VLAN_ID,
GELIC_VLAN_TX_ETHERNET, 0, 0, &val, &junk);
if (err == 0)
@@ -178,7 +178,7 @@ glc_attach(device_t dev)
}
bus_setup_intr(dev, sc->sc_irq,
- INTR_TYPE_MISC | INTR_MPSAFE | INTR_ENTROPY,
+ INTR_TYPE_NET | INTR_MPSAFE | INTR_ENTROPY,
glc_intr_filter, glc_intr, sc, &sc->sc_irqctx);
sc->sc_hwirq_status = (uint64_t *)contigmalloc(8, M_GLC, M_ZERO, 0,
BUS_SPACE_MAXADDR_32BIT, 8, PAGE_SIZE);
@@ -755,8 +755,11 @@ glc_rxintr(struct glc_softc *sc)
m->m_len = sc->sc_rxdmadesc[i].valid_size;
m->m_pkthdr.len = m->m_len;
- if (sc->sc_rx_vlan >= 0)
- m_adj(m, 2);
+ /*
+ * Remove VLAN tag. Even on early firmwares that do not allow
+ * multiple VLANs, the VLAN tag is still in place here.
+ */
+ m_adj(m, 2);
mtx_unlock(&sc->sc_mtx);
(*ifp->if_input)(ifp, m);
diff --git a/sys/security/audit/audit.h b/sys/security/audit/audit.h
index f66f33a..dfcd193 100644
--- a/sys/security/audit/audit.h
+++ b/sys/security/audit/audit.h
@@ -114,6 +114,7 @@ void audit_arg_auditon(union auditon_udata *udata);
void audit_arg_file(struct proc *p, struct file *fp);
void audit_arg_argv(char *argv, int argc, int length);
void audit_arg_envv(char *envv, int envc, int length);
+void audit_arg_rights(cap_rights_t rights);
void audit_sysclose(struct thread *td, int fd);
void audit_cred_copy(struct ucred *src, struct ucred *dest);
void audit_cred_destroy(struct ucred *cred);
@@ -235,6 +236,11 @@ void audit_thread_free(struct thread *td);
audit_arg_rgid((rgid)); \
} while (0)
+#define AUDIT_ARG_RIGHTS(rights) do { \
+ if (AUDITING_TD(curthread)) \
+ audit_arg_rights((rights)); \
+} while (0)
+
#define AUDIT_ARG_RUID(ruid) do { \
if (AUDITING_TD(curthread)) \
audit_arg_ruid((ruid)); \
@@ -342,6 +348,7 @@ void audit_thread_free(struct thread *td);
#define AUDIT_ARG_PID(pid)
#define AUDIT_ARG_PROCESS(p)
#define AUDIT_ARG_RGID(rgid)
+#define AUDIT_ARG_RIGHTS(rights)
#define AUDIT_ARG_RUID(ruid)
#define AUDIT_ARG_SIGNUM(signum)
#define AUDIT_ARG_SGID(sgid)
diff --git a/sys/security/audit/audit_arg.c b/sys/security/audit/audit_arg.c
index 562b799..4e155da 100644
--- a/sys/security/audit/audit_arg.c
+++ b/sys/security/audit/audit_arg.c
@@ -865,6 +865,19 @@ audit_arg_envv(char *envv, int envc, int length)
ARG_SET_VALID(ar, ARG_ENVV);
}
+void
+audit_arg_rights(cap_rights_t rights)
+{
+ struct kaudit_record *ar;
+
+ ar = currecord();
+ if (ar == NULL)
+ return;
+
+ ar->k_ar.ar_arg_rights = rights;
+ ARG_SET_VALID(ar, ARG_RIGHTS);
+}
+
/*
* The close() system call uses it's own audit call to capture the path/vnode
* information because those pieces are not easily obtained within the system
diff --git a/sys/security/audit/audit_bsm.c b/sys/security/audit/audit_bsm.c
index b4713cc..a8fcd8f 100644
--- a/sys/security/audit/audit_bsm.c
+++ b/sys/security/audit/audit_bsm.c
@@ -1589,6 +1589,28 @@ kaudit_to_bsm(struct kaudit_record *kar, struct au_record **pau)
}
break;
+ case AUE_CAP_NEW:
+ /*
+ * XXXRW/XXXJA: Would be nice to audit socket/etc information.
+ */
+ FD_VNODE1_TOKENS;
+ if (ARG_IS_VALID(kar, ARG_RIGHTS)) {
+ tok = au_to_arg64(2, "rights", ar->ar_arg_rights);
+ kau_write(rec, tok);
+ }
+ break;
+
+ case AUE_CAP_GETRIGHTS:
+ if (ARG_IS_VALID(kar, ARG_FD)) {
+ tok = au_to_arg32(1, "fd", ar->ar_arg_fd);
+ kau_write(rec, tok);
+ }
+ break;
+
+ case AUE_CAP_ENTER:
+ case AUE_CAP_GETMODE:
+ break;
+
case AUE_NULL:
default:
printf("BSM conversion requested for unknown event %d\n",
diff --git a/sys/security/audit/audit_private.h b/sys/security/audit/audit_private.h
index b2f2bad..92a0729 100644
--- a/sys/security/audit/audit_private.h
+++ b/sys/security/audit/audit_private.h
@@ -229,6 +229,7 @@ struct audit_record {
int ar_arg_exitstatus;
int ar_arg_exitretval;
struct sockaddr_storage ar_arg_sockaddr;
+ cap_rights_t ar_arg_rights;
};
/*
@@ -288,6 +289,7 @@ struct audit_record {
#define ARG_ENVV 0x0002000000000000ULL
#define ARG_ATFD1 0x0004000000000000ULL
#define ARG_ATFD2 0x0008000000000000ULL
+#define ARG_RIGHTS 0x0010000000000000ULL
#define ARG_NONE 0x0000000000000000ULL
#define ARG_ALL 0xFFFFFFFFFFFFFFFFULL
diff --git a/sys/sparc64/include/cache.h b/sys/sparc64/include/cache.h
index 3852da4..3d0ac4f 100644
--- a/sys/sparc64/include/cache.h
+++ b/sys/sparc64/include/cache.h
@@ -110,15 +110,16 @@ cache_flush_t spitfire_cache_flush;
dcache_page_inval_t spitfire_dcache_page_inval;
icache_page_inval_t spitfire_icache_page_inval;
+cache_enable_t zeus_cache_enable;
+cache_flush_t zeus_cache_flush;
+dcache_page_inval_t zeus_dcache_page_inval;
+icache_page_inval_t zeus_icache_page_inval;
+
extern cache_enable_t *cache_enable;
extern cache_flush_t *cache_flush;
extern dcache_page_inval_t *dcache_page_inval;
extern icache_page_inval_t *icache_page_inval;
-cache_flush_t zeus_cache_flush;
-dcache_page_inval_t zeus_dcache_page_inval;
-icache_page_inval_t zeus_icache_page_inval;
-
#endif /* KERNEL */
#endif /* !LOCORE */
diff --git a/sys/sparc64/include/cpu.h b/sys/sparc64/include/cpu.h
index c0845a0..1634477 100644
--- a/sys/sparc64/include/cpu.h
+++ b/sys/sparc64/include/cpu.h
@@ -57,6 +57,7 @@ void cpu_halt(void);
void cpu_reset(void);
void fork_trampoline(void);
void swi_vm(void *v);
+void zeus_init(u_int cpu_impl);
static __inline u_int64_t
get_cyclecount(void)
diff --git a/sys/sparc64/include/pmap.h b/sys/sparc64/include/pmap.h
index adad257..87c56a3 100644
--- a/sys/sparc64/include/pmap.h
+++ b/sys/sparc64/include/pmap.h
@@ -90,12 +90,9 @@ void pmap_kremove_flags(vm_offset_t va);
boolean_t pmap_page_is_mapped(vm_page_t m);
int pmap_cache_enter(vm_page_t m, vm_offset_t va);
-void pmap_cache_remove(vm_page_t m, vm_offset_t va);
int pmap_remove_tte(struct pmap *pm1, struct pmap *pm2, struct tte *tp,
vm_offset_t va);
-int pmap_protect_tte(struct pmap *pm1, struct pmap *pm2, struct tte *tp,
- vm_offset_t va);
void pmap_map_tsb(void);
void pmap_set_kctx(void);
diff --git a/sys/sparc64/include/tlb.h b/sys/sparc64/include/tlb.h
index b813b0f..3f2c3c5 100644
--- a/sys/sparc64/include/tlb.h
+++ b/sys/sparc64/include/tlb.h
@@ -44,7 +44,17 @@
(TD_V | TD_4M | (TLB_DIRECT_ADDRESS_MASK - TLB_DIRECT_PAGE_MASK))
#define TLB_DAR_SLOT_SHIFT (3)
-#define TLB_DAR_SLOT(slot) ((slot) << TLB_DAR_SLOT_SHIFT)
+#define TLB_DAR_TLB_SHIFT (16)
+#define TLB_DAR_SLOT(tlb, slot) \
+ ((tlb) << TLB_DAR_TLB_SHIFT | (slot) << TLB_DAR_SLOT_SHIFT)
+#define TLB_DAR_T16 (0) /* US-III{,i,+}, IV{,+} */
+#define TLB_DAR_T32 (0) /* US-I, II{,e,i} */
+#define TLB_DAR_DT512_0 (2) /* US-III{,i,+}, IV{,+} */
+#define TLB_DAR_DT512_1 (3) /* US-III{,i,+}, IV{,+} */
+#define TLB_DAR_IT128 (2) /* US-III{,i,+}, IV */
+#define TLB_DAR_IT512 (2) /* US-IV+ */
+#define TLB_DAR_FTLB (0) /* SPARC64 V, VI, VII, VIIIfx */
+#define TLB_DAR_STLB (2) /* SPARC64 V, VI, VII, VIIIfx */
#define TAR_VPN_SHIFT (13)
#define TAR_CTX_MASK ((1 << TAR_VPN_SHIFT) - 1)
@@ -156,6 +166,9 @@ tlb_flush_user_t cheetah_tlb_flush_user;
tlb_flush_nonlocked_t spitfire_tlb_flush_nonlocked;
tlb_flush_user_t spitfire_tlb_flush_user;
+tlb_flush_nonlocked_t zeus_tlb_flush_nonlocked;
+tlb_flush_user_t zeus_tlb_flush_user;
+
extern tlb_flush_nonlocked_t *tlb_flush_nonlocked;
extern tlb_flush_user_t *tlb_flush_user;
diff --git a/sys/sparc64/pci/fire.c b/sys/sparc64/pci/fire.c
index 855a72a..0402896 100644
--- a/sys/sparc64/pci/fire.c
+++ b/sys/sparc64/pci/fire.c
@@ -664,9 +664,7 @@ fire_attach(device_t dev)
/*
* Setup JBC/UBC performance counter 0 in bus cycle counting
- * mode as timecounter. Unfortunately, at least with Fire all
- * JBus-driven performance counters just don't advance in bus
- * cycle counting mode.
+ * mode as timecounter.
*/
if (device_get_unit(dev) == 0) {
FIRE_CTRL_SET(sc, FO_XBC_PRF_CNT0, 0);
@@ -674,19 +672,10 @@ fire_attach(device_t dev)
FIRE_CTRL_SET(sc, FO_XBC_PRF_CNT_SEL,
(FO_XBC_PRF_CNT_NONE << FO_XBC_PRF_CNT_CNT1_SHFT) |
(FO_XBC_PRF_CNT_XB_CLK << FO_XBC_PRF_CNT_CNT0_SHFT));
-#ifdef FIRE_DEBUG
- device_printf(dev, "FO_XBC_PRF_CNT0 0x%016llx\n",
- (long long unsigned)FIRE_CTRL_READ_8(sc,
- FO_XBC_PRF_CNT0));
- device_printf(dev, "FO_XBC_PRF_CNT0 0x%016llx\n",
- (long long unsigned)FIRE_CTRL_READ_8(sc,
- FO_XBC_PRF_CNT0));
-#endif
tc = malloc(sizeof(*tc), M_DEVBUF, M_NOWAIT | M_ZERO);
if (tc == NULL)
panic("%s: could not malloc timecounter", __func__);
tc->tc_get_timecount = fire_get_timecount;
- tc->tc_poll_pps = NULL;
tc->tc_counter_mask = TC_COUNTER_MAX_MASK;
if (OF_getprop(OF_peer(0), "clock-frequency", &prop,
sizeof(prop)) == -1)
@@ -694,8 +683,16 @@ fire_attach(device_t dev)
__func__);
tc->tc_frequency = prop;
tc->tc_name = strdup(device_get_nameunit(dev), M_DEVBUF);
- tc->tc_quality = -FIRE_PERF_CNT_QLTY;
tc->tc_priv = sc;
+ /*
+ * Due to initial problems with the JBus-driven performance
+ * counters not advancing which might be firmware dependent
+ * ensure that it actually works.
+ */
+ if (fire_get_timecount(tc) - fire_get_timecount(tc) != 0)
+ tc->tc_quality = FIRE_PERF_CNT_QLTY;
+ else
+ tc->tc_quality = -FIRE_PERF_CNT_QLTY;
tc_init(tc);
}
diff --git a/sys/sparc64/pci/schizo.c b/sys/sparc64/pci/schizo.c
index 7d55516..4d1a5a7 100644
--- a/sys/sparc64/pci/schizo.c
+++ b/sys/sparc64/pci/schizo.c
@@ -482,7 +482,6 @@ schizo_attach(device_t dev)
if (tc == NULL)
panic("%s: could not malloc timecounter", __func__);
tc->tc_get_timecount = schizo_get_timecount;
- tc->tc_poll_pps = NULL;
tc->tc_counter_mask = STX_CTRL_PERF_CNT_MASK;
if (OF_getprop(OF_peer(0), "clock-frequency", &prop,
sizeof(prop)) == -1)
@@ -1521,6 +1520,7 @@ schizo_get_timecount(struct timecounter *tc)
struct schizo_softc *sc;
sc = tc->tc_priv;
- return (SCHIZO_CTRL_READ_8(sc, STX_CTRL_PERF_CNT) &
- (STX_CTRL_PERF_CNT_MASK << STX_CTRL_PERF_CNT_CNT0_SHIFT));
+ return ((SCHIZO_CTRL_READ_8(sc, STX_CTRL_PERF_CNT) &
+ (STX_CTRL_PERF_CNT_MASK << STX_CTRL_PERF_CNT_CNT0_SHIFT)) >>
+ STX_CTRL_PERF_CNT_CNT0_SHIFT);
}
diff --git a/sys/sparc64/sparc64/cache.c b/sys/sparc64/sparc64/cache.c
index 636c18a..d29a294 100644
--- a/sys/sparc64/sparc64/cache.c
+++ b/sys/sparc64/sparc64/cache.c
@@ -169,12 +169,12 @@ cache_init(struct pcpu *pcpu)
tlb_flush_nonlocked = cheetah_tlb_flush_nonlocked;
tlb_flush_user = cheetah_tlb_flush_user;
} else if (pcpu->pc_impl == CPU_IMPL_SPARC64V) {
- cache_enable = cheetah_cache_enable;
+ cache_enable = zeus_cache_enable;
cache_flush = zeus_cache_flush;
dcache_page_inval = zeus_dcache_page_inval;
icache_page_inval = zeus_icache_page_inval;
- tlb_flush_nonlocked = cheetah_tlb_flush_nonlocked;
- tlb_flush_user = cheetah_tlb_flush_user;
+ tlb_flush_nonlocked = zeus_tlb_flush_nonlocked;
+ tlb_flush_user = zeus_tlb_flush_user;
} else if (pcpu->pc_impl >= CPU_IMPL_ULTRASPARCI &&
pcpu->pc_impl < CPU_IMPL_ULTRASPARCIII) {
cache_enable = spitfire_cache_enable;
diff --git a/sys/sparc64/sparc64/cheetah.c b/sys/sparc64/sparc64/cheetah.c
index 99d38c9..8ecc62f 100644
--- a/sys/sparc64/sparc64/cheetah.c
+++ b/sys/sparc64/sparc64/cheetah.c
@@ -1,6 +1,6 @@
/*-
* Copyright (c) 2003 Jake Burkholder.
- * Copyright (c) 2005, 2008, 2010 Marius Strobl <marius@FreeBSD.org>
+ * Copyright (c) 2005 - 2011 Marius Strobl <marius@FreeBSD.org>
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
@@ -28,8 +28,6 @@
#include <sys/cdefs.h>
__FBSDID("$FreeBSD$");
-#include "opt_pmap.h"
-
#include <sys/param.h>
#include <sys/systm.h>
#include <sys/lock.h>
@@ -45,17 +43,19 @@ __FBSDID("$FreeBSD$");
#include <machine/cpufunc.h>
#include <machine/dcr.h>
#include <machine/lsu.h>
-#include <machine/mcntl.h>
#include <machine/smp.h>
#include <machine/tlb.h>
#include <machine/ver.h>
#include <machine/vmparam.h>
#define CHEETAH_ICACHE_TAG_LOWER 0x30
+#define CHEETAH_T16_ENTRIES 16
+#define CHEETAH_DT512_ENTRIES 512
+#define CHEETAH_IT128_ENTRIES 128
+#define CHEETAH_IT512_ENTRIES 512
/*
- * CPU-specific initialization - this is used for both the Sun Cheetah and
- * later as well as the Fujitsu Zeus and later CPUs.
+ * CPU-specific initialization for Sun Cheetah and later CPUs
*/
void
cheetah_init(u_int cpu_impl)
@@ -78,14 +78,6 @@ cheetah_init(u_int cpu_impl)
stxa(AA_IMMU_TSB_NEXT_REG, ASI_IMMU, 0);
membar(Sync);
- if (cpu_impl == CPU_IMPL_SPARC64V) {
- /* Ensure MCNTL_JPS1_TSBP is 0. */
- val = ldxa(AA_MCNTL, ASI_MCNTL);
- val &= ~MCNTL_JPS1_TSBP;
- stxa(AA_MCNTL, ASI_MCNTL, val);
- return;
- }
-
/*
* Configure the first large dTLB to hold 4MB pages (e.g. for direct
* mappings) for all three contexts and ensure the second one is set
@@ -223,33 +215,92 @@ cheetah_icache_page_inval(vm_paddr_t pa __unused)
}
-#define cheetah_dmap_all() do { \
- stxa(TLB_DEMAP_ALL, ASI_DMMU_DEMAP, 0); \
- stxa(TLB_DEMAP_ALL, ASI_IMMU_DEMAP, 0); \
- flush(KERNBASE); \
-} while (0)
-
/*
- * Flush all non-locked mappings from the TLB.
+ * Flush all non-locked mappings from the TLBs.
*/
void
cheetah_tlb_flush_nonlocked(void)
{
- cheetah_dmap_all();
+ stxa(TLB_DEMAP_ALL, ASI_DMMU_DEMAP, 0);
+ stxa(TLB_DEMAP_ALL, ASI_IMMU_DEMAP, 0);
+ flush(KERNBASE);
}
/*
- * Flush all user mappings from the TLB.
+ * Flush all user mappings from the TLBs.
*/
void
-cheetah_tlb_flush_user()
+cheetah_tlb_flush_user(void)
{
+ u_long data, tag;
+ register_t s;
+ u_int i, slot;
/*
- * Just use cheetah_dmap_all() and accept somes TLB misses
- * rather than searching all 1040 D-TLB and 144 I-TLB slots
- * for non-kernel mappings.
+ * We read ASI_{D,I}TLB_DATA_ACCESS_REG twice back-to-back in order
+ * to work around errata of USIII and beyond.
*/
- cheetah_dmap_all();
+ for (i = 0; i < CHEETAH_T16_ENTRIES; i++) {
+ slot = TLB_DAR_SLOT(TLB_DAR_T16, i);
+ s = intr_disable();
+ (void)ldxa(slot, ASI_DTLB_DATA_ACCESS_REG);
+ data = ldxa(slot, ASI_DTLB_DATA_ACCESS_REG);
+ intr_restore(s);
+ tag = ldxa(slot, ASI_DTLB_TAG_READ_REG);
+ if ((data & TD_V) != 0 && (data & TD_L) == 0 &&
+ TLB_TAR_CTX(tag) != TLB_CTX_KERNEL)
+ stxa_sync(slot, ASI_DTLB_DATA_ACCESS_REG, 0);
+ s = intr_disable();
+ (void)ldxa(slot, ASI_ITLB_DATA_ACCESS_REG);
+ data = ldxa(slot, ASI_ITLB_DATA_ACCESS_REG);
+ intr_restore(s);
+ tag = ldxa(slot, ASI_ITLB_TAG_READ_REG);
+ if ((data & TD_V) != 0 && (data & TD_L) == 0 &&
+ TLB_TAR_CTX(tag) != TLB_CTX_KERNEL)
+ stxa_sync(slot, ASI_ITLB_DATA_ACCESS_REG, 0);
+ }
+ for (i = 0; i < CHEETAH_DT512_ENTRIES; i++) {
+ slot = TLB_DAR_SLOT(TLB_DAR_DT512_0, i);
+ s = intr_disable();
+ (void)ldxa(slot, ASI_DTLB_DATA_ACCESS_REG);
+ data = ldxa(slot, ASI_DTLB_DATA_ACCESS_REG);
+ intr_restore(s);
+ tag = ldxa(slot, ASI_DTLB_TAG_READ_REG);
+ if ((data & TD_V) != 0 && TLB_TAR_CTX(tag) != TLB_CTX_KERNEL)
+ stxa_sync(slot, ASI_DTLB_DATA_ACCESS_REG, 0);
+ slot = TLB_DAR_SLOT(TLB_DAR_DT512_1, i);
+ s = intr_disable();
+ (void)ldxa(slot, ASI_ITLB_DATA_ACCESS_REG);
+ data = ldxa(slot, ASI_DTLB_DATA_ACCESS_REG);
+ intr_restore(s);
+ tag = ldxa(slot, ASI_DTLB_TAG_READ_REG);
+ if ((data & TD_V) != 0 && TLB_TAR_CTX(tag) != TLB_CTX_KERNEL)
+ stxa_sync(slot, ASI_DTLB_DATA_ACCESS_REG, 0);
+ }
+ if (PCPU_GET(impl) == CPU_IMPL_ULTRASPARCIVp) {
+ for (i = 0; i < CHEETAH_IT512_ENTRIES; i++) {
+ slot = TLB_DAR_SLOT(TLB_DAR_IT512, i);
+ s = intr_disable();
+ (void)ldxa(slot, ASI_ITLB_DATA_ACCESS_REG);
+ data = ldxa(slot, ASI_ITLB_DATA_ACCESS_REG);
+ intr_restore(s);
+ tag = ldxa(slot, ASI_ITLB_TAG_READ_REG);
+ if ((data & TD_V) != 0 &&
+ TLB_TAR_CTX(tag) != TLB_CTX_KERNEL)
+ stxa_sync(slot, ASI_ITLB_DATA_ACCESS_REG, 0);
+ }
+ } else {
+ for (i = 0; i < CHEETAH_IT128_ENTRIES; i++) {
+ slot = TLB_DAR_SLOT(TLB_DAR_IT128, i);
+ s = intr_disable();
+ (void)ldxa(slot, ASI_ITLB_DATA_ACCESS_REG);
+ data = ldxa(slot, ASI_ITLB_DATA_ACCESS_REG);
+ tag = ldxa(slot, ASI_ITLB_TAG_READ_REG);
+ intr_restore(s);
+ if ((data & TD_V) != 0 &&
+ TLB_TAR_CTX(tag) != TLB_CTX_KERNEL)
+ stxa_sync(slot, ASI_ITLB_DATA_ACCESS_REG, 0);
+ }
+ }
}
diff --git a/sys/sparc64/sparc64/counter.c b/sys/sparc64/sparc64/counter.c
index cb9241a..8009fad 100644
--- a/sys/sparc64/sparc64/counter.c
+++ b/sys/sparc64/sparc64/counter.c
@@ -86,13 +86,12 @@ sparc64_counter_init(const char *name, bus_space_tag_t tag,
bus_space_write_8(tag, handle, offset + CTR_CT1 + CTR_LIMIT,
COUNTER_MASK);
/* Register as a time counter. */
- tc = malloc(sizeof(*tc), M_DEVBUF, M_WAITOK);
+ tc = malloc(sizeof(*tc), M_DEVBUF, M_WAITOK | M_ZERO);
sc = malloc(sizeof(*sc), M_DEVBUF, M_WAITOK);
sc->sc_tag = tag;
sc->sc_handle = handle;
sc->sc_offset = offset + CTR_CT0;
tc->tc_get_timecount = counter_get_timecount;
- tc->tc_poll_pps = NULL;
tc->tc_counter_mask = COUNTER_MASK;
tc->tc_frequency = COUNTER_FREQ;
tc->tc_name = strdup(name, M_DEVBUF);
@@ -107,6 +106,5 @@ counter_get_timecount(struct timecounter *tc)
struct ct_softc *sc;
sc = tc->tc_priv;
- return (bus_space_read_8(sc->sc_tag, sc->sc_handle, sc->sc_offset) &
- COUNTER_MASK);
+ return (bus_space_read_8(sc->sc_tag, sc->sc_handle, sc->sc_offset));
}
diff --git a/sys/sparc64/sparc64/exception.S b/sys/sparc64/sparc64/exception.S
index 0b8a0fa..fa2f2d5 100644
--- a/sys/sparc64/sparc64/exception.S
+++ b/sys/sparc64/sparc64/exception.S
@@ -369,11 +369,21 @@ ENTRY(rsf_fatal)
sir
END(rsf_fatal)
- .comm intrnames, IV_MAX * (MAXCOMLEN + 1)
- .comm eintrnames, 0
-
- .comm intrcnt, IV_MAX * 8
- .comm eintrcnt, 0
+ .data
+ _ALIGN_DATA
+ .globl intrnames, sintrnames
+intrnames:
+ .space IV_MAX * (MAXCOMLEN + 1)
+sintrnames:
+ .word IV_MAX * (MAXCOMLEN + 1)
+
+ .globl intrcnt, sintrcnt
+intrcnt:
+ .space IV_MAX * 8
+sintrcnt:
+ .word IV_MAX * 8
+
+ .text
/*
* Trap table and associated macros
@@ -578,7 +588,8 @@ END(tl0_sfsr_trap)
andcc %g1, IRSR_BUSY, %g0
bnz,a,pt %xcc, intr_vector
nop
- sir
+ ba,a,pt %xcc, intr_vector_stray
+ nop
.align 32
.endm
diff --git a/sys/sparc64/sparc64/interrupt.S b/sys/sparc64/sparc64/interrupt.S
index b71a05d..3f80445 100644
--- a/sys/sparc64/sparc64/interrupt.S
+++ b/sys/sparc64/sparc64/interrupt.S
@@ -32,6 +32,7 @@ __FBSDID("$FreeBSD$");
#include <machine/intr_machdep.h>
#include <machine/ktr.h>
#include <machine/pstate.h>
+#include <machine/ver.h>
#include "assym.s"
@@ -153,6 +154,29 @@ ENTRY(intr_vector)
retry
END(intr_vector)
+ENTRY(intr_vector_stray)
+ /*
+ * SPARC64-VI trigger stray vector interrupts in order to indicate
+ * uncorrectable errors in interrupt packets, which still need to be
+ * acknowledged though.
+ * US-IV occasionally trigger stray vector interrupts for reasons
+ * unknown accompanied by a state in which they even fault on locked
+ * TLB entries so we can't even log these here. Just retrying the
+ * instruction in that case gets the CPU back on track.
+ */
+ rdpr %ver, %g1
+ srlx %g1, VER_IMPL_SHIFT, %g1
+ sll %g1, VER_IMPL_SIZE, %g1
+ srl %g1, VER_IMPL_SIZE, %g1
+ cmp %g1, CPU_IMPL_SPARC64VI
+ bne,a,pn %icc, 1f
+ nop
+ stxa %g0, [%g0] ASI_INTR_RECEIVE
+ membar #Sync
+
+1: retry
+END(intr_vector_stray)
+
ENTRY(intr_fast)
save %sp, -CCFSZ, %sp
diff --git a/sys/sparc64/sparc64/intr_machdep.c b/sys/sparc64/sparc64/intr_machdep.c
index 112ddab..9a7e92f 100644
--- a/sys/sparc64/sparc64/intr_machdep.c
+++ b/sys/sparc64/sparc64/intr_machdep.c
@@ -171,7 +171,7 @@ static int
intrcnt_setname(const char *name, int index)
{
- if (intrnames + (MAXCOMLEN + 1) * index >= eintrnames)
+ if ((MAXCOMLEN + 1) * index >= sintrnames)
return (E2BIG);
snprintf(intrnames + (MAXCOMLEN + 1) * index, MAXCOMLEN + 1, "%-*s",
MAXCOMLEN, name);
diff --git a/sys/sparc64/sparc64/machdep.c b/sys/sparc64/sparc64/machdep.c
index abf3a91..c0cc75d 100644
--- a/sys/sparc64/sparc64/machdep.c
+++ b/sys/sparc64/sparc64/machdep.c
@@ -348,9 +348,10 @@ sparc64_init(caddr_t mdp, u_long o1, u_long o2, u_long o3, ofw_vec_t *vec)
/*
* Do CPU-specific initialization.
*/
- if (cpu_impl == CPU_IMPL_SPARC64V ||
- cpu_impl >= CPU_IMPL_ULTRASPARCIII)
+ if (cpu_impl >= CPU_IMPL_ULTRASPARCIII)
cheetah_init(cpu_impl);
+ else if (cpu_impl == CPU_IMPL_SPARC64V)
+ zeus_init(cpu_impl);
/*
* Clear (S)TICK timer (including NPT).
diff --git a/sys/sparc64/sparc64/mp_exception.S b/sys/sparc64/sparc64/mp_exception.S
index f1b323a..54a5e4d 100644
--- a/sys/sparc64/sparc64/mp_exception.S
+++ b/sys/sparc64/sparc64/mp_exception.S
@@ -247,8 +247,8 @@ ENTRY(tl_ipi_tlb_range_demap)
ldx [%g5 + ITA_START], %g1
ldx [%g5 + ITA_END], %g2
-1: or %g1, %g3, %g4
sethi %hi(KERNBASE), %g6
+1: or %g1, %g3, %g4
stxa %g0, [%g4] ASI_DMMU_DEMAP
stxa %g0, [%g4] ASI_IMMU_DEMAP
flush %g6
@@ -257,7 +257,7 @@ ENTRY(tl_ipi_tlb_range_demap)
add %g1, %g6, %g1
cmp %g1, %g2
blt,a,pt %xcc, 1b
- nop
+ sethi %hi(KERNBASE), %g6
IPI_DONE(%g5, %g1, %g2, %g3, %g4, %g6)
retry
diff --git a/sys/sparc64/sparc64/mp_machdep.c b/sys/sparc64/sparc64/mp_machdep.c
index 83d8e9f..e5910e0 100644
--- a/sys/sparc64/sparc64/mp_machdep.c
+++ b/sys/sparc64/sparc64/mp_machdep.c
@@ -139,8 +139,6 @@ static cpu_ipi_single_t spitfire_ipi_single;
SYSINIT(cpu_mp_unleash, SI_SUB_SMP, SI_ORDER_FIRST, cpu_mp_unleash, NULL);
-CTASSERT(MAXCPU <= IDR_CHEETAH_MAX_BN_PAIRS);
-
void
mp_init(u_int cpu_impl)
{
@@ -281,7 +279,6 @@ sun4u_startcpu(phandle_t cpu, void *func, u_long arg)
void
cpu_mp_start(void)
{
- cpuset_t ocpus;
mtx_init(&ipi_mtx, "ipi", NULL, MTX_SPIN);
@@ -298,9 +295,6 @@ cpu_mp_start(void)
KASSERT(!isjbus || mp_ncpus <= IDR_JALAPENO_MAX_BN_PAIRS,
("%s: can only IPI a maximum of %d JBus-CPUs",
__func__, IDR_JALAPENO_MAX_BN_PAIRS));
- ocpus = all_cpus;
- CPU_CLR(curcpu, &ocpus);
- PCPU_SET(other_cpus, ocpus);
smp_active = 1;
}
@@ -422,15 +416,16 @@ cpu_mp_unleash(void *v)
void
cpu_mp_bootstrap(struct pcpu *pc)
{
- cpuset_t ocpus;
volatile struct cpu_start_args *csa;
csa = &cpu_start_args;
/* Do CPU-specific initialization. */
- if (pc->pc_impl == CPU_IMPL_SPARC64V ||
- pc->pc_impl >= CPU_IMPL_ULTRASPARCIII)
+ if (pc->pc_impl >= CPU_IMPL_ULTRASPARCIII)
cheetah_init(pc->pc_impl);
+ else if (pc->pc_impl == CPU_IMPL_SPARC64V)
+ zeus_init(pc->pc_impl);
+
/*
* Enable the caches. Note that his may include applying workarounds.
*/
@@ -464,9 +459,6 @@ cpu_mp_bootstrap(struct pcpu *pc)
smp_cpus++;
KASSERT(curthread != NULL, ("%s: curthread", __func__));
- ocpus = all_cpus;
- CPU_CLR(curcpu, &ocpus);
- PCPU_SET(other_cpus, ocpus);
printf("SMP: AP CPU #%d Launched!\n", curcpu);
csa->csa_count--;
@@ -702,6 +694,8 @@ cheetah_ipi_selected(cpuset_t cpus, u_long d0, u_long d1, u_long d2)
ASI_SDB_INTR_W, 0);
membar(Sync);
bnp++;
+ if (bnp == IDR_CHEETAH_MAX_BN_PAIRS)
+ break;
}
}
while (((ids = ldxa(0, ASI_INTR_DISPATCH_STATUS)) &
diff --git a/sys/sparc64/sparc64/pmap.c b/sys/sparc64/sparc64/pmap.c
index f917af9..46c5050 100644
--- a/sys/sparc64/sparc64/pmap.c
+++ b/sys/sparc64/sparc64/pmap.c
@@ -152,6 +152,9 @@ struct pmap kernel_pmap_store;
static vm_paddr_t pmap_bootstrap_alloc(vm_size_t size, uint32_t colors);
static void pmap_bootstrap_set_tte(struct tte *tp, u_long vpn, u_long data);
+static void pmap_cache_remove(vm_page_t m, vm_offset_t va);
+static int pmap_protect_tte(struct pmap *pm1, struct pmap *pm2,
+ struct tte *tp, vm_offset_t va);
/*
* Map the given physical page at the specified virtual address in the
@@ -247,7 +250,7 @@ PMAP_STATS_VAR(pmap_ncopy_page_soc);
PMAP_STATS_VAR(pmap_nnew_thread);
PMAP_STATS_VAR(pmap_nnew_thread_oc);
-static inline u_long dtlb_get_data(u_int slot);
+static inline u_long dtlb_get_data(u_int tlb, u_int slot);
/*
* Quick sort callout for comparing memory regions
@@ -288,15 +291,21 @@ om_cmp(const void *a, const void *b)
}
static inline u_long
-dtlb_get_data(u_int slot)
+dtlb_get_data(u_int tlb, u_int slot)
{
+ u_long data;
+ register_t s;
+ slot = TLB_DAR_SLOT(tlb, slot);
/*
- * We read ASI_DTLB_DATA_ACCESS_REG twice in order to work
- * around errata of USIII and beyond.
+ * We read ASI_DTLB_DATA_ACCESS_REG twice back-to-back in order to
+ * work around errata of USIII and beyond.
*/
- (void)ldxa(TLB_DAR_SLOT(slot), ASI_DTLB_DATA_ACCESS_REG);
- return (ldxa(TLB_DAR_SLOT(slot), ASI_DTLB_DATA_ACCESS_REG));
+ s = intr_disable();
+ (void)ldxa(slot, ASI_DTLB_DATA_ACCESS_REG);
+ data = ldxa(slot, ASI_DTLB_DATA_ACCESS_REG);
+ intr_restore(s);
+ return (data);
}
/*
@@ -392,7 +401,9 @@ pmap_bootstrap(u_int cpu_impl)
} else {
dtlb_slots_avail = 0;
for (i = 0; i < dtlb_slots; i++) {
- data = dtlb_get_data(i);
+ data = dtlb_get_data(cpu_impl ==
+ CPU_IMPL_ULTRASPARCIII ? TLB_DAR_T16 :
+ TLB_DAR_T32, i);
if ((data & (TD_V | TD_L)) != (TD_V | TD_L))
dtlb_slots_avail++;
}
@@ -948,7 +959,7 @@ pmap_cache_enter(vm_page_t m, vm_offset_t va)
return (0);
}
-void
+static void
pmap_cache_remove(vm_page_t m, vm_offset_t va)
{
struct tte *tp;
@@ -1286,6 +1297,7 @@ pmap_release(pmap_t pm)
pc->pc_pmap = NULL;
mtx_unlock_spin(&sched_lock);
+ pmap_qremove((vm_offset_t)pm->pm_tsb, TSB_PAGES);
obj = pm->pm_tsb_obj;
VM_OBJECT_LOCK(obj);
KASSERT(obj->ref_count == 1, ("pmap_release: tsbobj ref count != 1"));
@@ -1297,7 +1309,6 @@ pmap_release(pmap_t pm)
vm_page_free_zero(m);
}
VM_OBJECT_UNLOCK(obj);
- pmap_qremove((vm_offset_t)pm->pm_tsb, TSB_PAGES);
PMAP_LOCK_DESTROY(pm);
}
@@ -1379,6 +1390,8 @@ pmap_remove_all(vm_page_t m)
struct tte *tp;
vm_offset_t va;
+ KASSERT((m->flags & (PG_FICTITIOUS | PG_UNMANAGED)) == 0,
+ ("pmap_remove_all: page %p is not managed", m));
vm_page_lock_queues();
for (tp = TAILQ_FIRST(&m->md.tte_list); tp != NULL; tp = tpn) {
tpn = TAILQ_NEXT(tp, tte_link);
@@ -1405,7 +1418,7 @@ pmap_remove_all(vm_page_t m)
vm_page_unlock_queues();
}
-int
+static int
pmap_protect_tte(struct pmap *pm, struct pmap *pm2, struct tte *tp,
vm_offset_t va)
{
@@ -1974,7 +1987,7 @@ pmap_page_wired_mappings(vm_page_t m)
/*
* Remove all pages from specified address space, this aids process exit
- * speeds. This is much faster than pmap_remove n the case of running down
+ * speeds. This is much faster than pmap_remove in the case of running down
* an entire address space. Only works for the current pmap.
*/
void
diff --git a/sys/sparc64/sparc64/spitfire.c b/sys/sparc64/sparc64/spitfire.c
index d6e25b9..7e51f2d 100644
--- a/sys/sparc64/sparc64/spitfire.c
+++ b/sys/sparc64/sparc64/spitfire.c
@@ -140,47 +140,45 @@ spitfire_icache_page_inval(vm_paddr_t pa)
}
/*
- * Flush all non-locked mappings from the TLB.
+ * Flush all non-locked mappings from the TLBs.
*/
void
spitfire_tlb_flush_nonlocked(void)
{
- int i;
+ u_int i;
+ u_int slot;
for (i = 0; i < SPITFIRE_TLB_ENTRIES; i++) {
- if ((ldxa(TLB_DAR_SLOT(i), ASI_DTLB_DATA_ACCESS_REG) &
- TD_L) == 0)
- stxa_sync(TLB_DAR_SLOT(i),
- ASI_DTLB_DATA_ACCESS_REG, 0);
- if ((ldxa(TLB_DAR_SLOT(i), ASI_ITLB_DATA_ACCESS_REG) &
- TD_L) == 0)
- stxa_sync(TLB_DAR_SLOT(i),
- ASI_ITLB_DATA_ACCESS_REG, 0);
+ slot = TLB_DAR_SLOT(TLB_DAR_T32, i);
+ if ((ldxa(slot, ASI_DTLB_DATA_ACCESS_REG) & TD_L) == 0)
+ stxa_sync(slot, ASI_DTLB_DATA_ACCESS_REG, 0);
+ if ((ldxa(slot, ASI_ITLB_DATA_ACCESS_REG) & TD_L) == 0)
+ stxa_sync(slot, ASI_ITLB_DATA_ACCESS_REG, 0);
}
}
/*
- * Flush all user mappings from the TLB.
+ * Flush all user mappings from the TLBs.
*/
void
spitfire_tlb_flush_user(void)
{
u_long data;
u_long tag;
- int i;
+ u_int i;
+ u_int slot;
for (i = 0; i < SPITFIRE_TLB_ENTRIES; i++) {
- data = ldxa(TLB_DAR_SLOT(i), ASI_DTLB_DATA_ACCESS_REG);
- tag = ldxa(TLB_DAR_SLOT(i), ASI_DTLB_TAG_READ_REG);
+ slot = TLB_DAR_SLOT(TLB_DAR_T32, i);
+ data = ldxa(slot, ASI_DTLB_DATA_ACCESS_REG);
+ tag = ldxa(slot, ASI_DTLB_TAG_READ_REG);
if ((data & TD_V) != 0 && (data & TD_L) == 0 &&
TLB_TAR_CTX(tag) != TLB_CTX_KERNEL)
- stxa_sync(TLB_DAR_SLOT(i),
- ASI_DTLB_DATA_ACCESS_REG, 0);
- data = ldxa(TLB_DAR_SLOT(i), ASI_ITLB_DATA_ACCESS_REG);
- tag = ldxa(TLB_DAR_SLOT(i), ASI_ITLB_TAG_READ_REG);
+ stxa_sync(slot, ASI_DTLB_DATA_ACCESS_REG, 0);
+ data = ldxa(slot, ASI_ITLB_DATA_ACCESS_REG);
+ tag = ldxa(slot, ASI_ITLB_TAG_READ_REG);
if ((data & TD_V) != 0 && (data & TD_L) == 0 &&
TLB_TAR_CTX(tag) != TLB_CTX_KERNEL)
- stxa_sync(TLB_DAR_SLOT(i),
- ASI_ITLB_DATA_ACCESS_REG, 0);
+ stxa_sync(slot, ASI_ITLB_DATA_ACCESS_REG, 0);
}
}
diff --git a/sys/sparc64/sparc64/tick.c b/sys/sparc64/sparc64/tick.c
index 921ffcb..0c0decc 100644
--- a/sys/sparc64/sparc64/tick.c
+++ b/sys/sparc64/sparc64/tick.c
@@ -197,12 +197,10 @@ cpu_initclocks(void)
* quality (S)TICK timers in the MP case.
*/
tick_tc.tc_get_timecount = tick_get_timecount_up;
- tick_tc.tc_poll_pps = NULL;
tick_tc.tc_counter_mask = ~0u;
tick_tc.tc_frequency = clock;
tick_tc.tc_name = "tick";
tick_tc.tc_quality = TICK_QUALITY_UP;
- tick_tc.tc_priv = NULL;
#ifdef SMP
if (cpu_mp_probe()) {
tick_tc.tc_get_timecount = tick_get_timecount_mp;
@@ -212,12 +210,10 @@ cpu_initclocks(void)
tc_init(&tick_tc);
if (sclock != 0) {
stick_tc.tc_get_timecount = stick_get_timecount_up;
- stick_tc.tc_poll_pps = NULL;
stick_tc.tc_counter_mask = ~0u;
stick_tc.tc_frequency = sclock;
stick_tc.tc_name = "stick";
stick_tc.tc_quality = TICK_QUALITY_UP;
- stick_tc.tc_priv = NULL;
#ifdef SMP
if (cpu_mp_probe()) {
stick_tc.tc_get_timecount = stick_get_timecount_mp;
diff --git a/sys/sparc64/sparc64/vm_machdep.c b/sys/sparc64/sparc64/vm_machdep.c
index 2b46dd1..dae1989 100644
--- a/sys/sparc64/sparc64/vm_machdep.c
+++ b/sys/sparc64/sparc64/vm_machdep.c
@@ -525,7 +525,7 @@ uma_small_alloc(uma_zone_t zone, int bytes, u_int8_t *flags, int wait)
pa = VM_PAGE_TO_PHYS(m);
if (dcache_color_ignore == 0 && m->md.color != DCACHE_COLOR(pa)) {
KASSERT(m->md.colors[0] == 0 && m->md.colors[1] == 0,
- ("uma_small_alloc: free page still has mappings!"));
+ ("uma_small_alloc: free page %p still has mappings!", m));
PMAP_STATS_INC(uma_nsmall_alloc_oc);
m->md.color = DCACHE_COLOR(pa);
dcache_page_inval(pa);
diff --git a/sys/sparc64/sparc64/zeus.c b/sys/sparc64/sparc64/zeus.c
index a3dc4e5..e6a31aa 100644
--- a/sys/sparc64/sparc64/zeus.c
+++ b/sys/sparc64/sparc64/zeus.c
@@ -1,5 +1,5 @@
/*-
- * Copyright (c) 2010 Marius Strobl <marius@FreeBSD.org>
+ * Copyright (c) 2010 - 2011 Marius Strobl <marius@FreeBSD.org>
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
@@ -32,7 +32,64 @@ __FBSDID("$FreeBSD$");
#include <machine/asi.h>
#include <machine/cache.h>
+#include <machine/cpu.h>
#include <machine/cpufunc.h>
+#include <machine/mcntl.h>
+#include <machine/lsu.h>
+#include <machine/tlb.h>
+#include <machine/tte.h>
+#include <machine/vmparam.h>
+
+#define ZEUS_FTLB_ENTRIES 32
+#define ZEUS_STLB_ENTRIES 2048
+
+/*
+ * CPU-specific initialization for Fujitsu Zeus CPUs
+ */
+void
+zeus_init(u_int cpu_impl)
+{
+ u_long val;
+
+ /* Ensure the TSB Extension Registers hold 0 as TSB_Base. */
+
+ stxa(AA_DMMU_TSB_PEXT_REG, ASI_DMMU, 0);
+ stxa(AA_IMMU_TSB_PEXT_REG, ASI_IMMU, 0);
+ membar(Sync);
+
+ stxa(AA_DMMU_TSB_SEXT_REG, ASI_DMMU, 0);
+ /*
+ * NB: the secondary context was removed from the iMMU.
+ */
+ membar(Sync);
+
+ stxa(AA_DMMU_TSB_NEXT_REG, ASI_DMMU, 0);
+ stxa(AA_IMMU_TSB_NEXT_REG, ASI_IMMU, 0);
+ membar(Sync);
+
+ val = ldxa(AA_MCNTL, ASI_MCNTL);
+ /* Ensure MCNTL_JPS1_TSBP is 0. */
+ val &= ~MCNTL_JPS1_TSBP;
+ /*
+ * Ensure 4-Mbyte page entries are stored in the 1024-entry, 2-way set
+ * associative TLB.
+ */
+ val = (val & ~MCNTL_RMD_MASK) | MCNTL_RMD_1024;
+ stxa(AA_MCNTL, ASI_MCNTL, val);
+}
+
+/*
+ * Enable level 1 caches.
+ */
+void
+zeus_cache_enable(u_int cpu_impl)
+{
+ u_long lsu;
+
+ lsu = ldxa(0, ASI_LSU_CTL_REG);
+ stxa(0, ASI_LSU_CTL_REG, lsu | LSU_IC | LSU_DC);
+ flush(KERNBASE);
+}
/*
* Flush all lines from the level 1 caches.
@@ -63,3 +120,52 @@ zeus_icache_page_inval(vm_paddr_t pa __unused)
{
}
+
+/*
+ * Flush all non-locked mappings from the TLBs.
+ */
+void
+zeus_tlb_flush_nonlocked(void)
+{
+
+ stxa(TLB_DEMAP_ALL, ASI_DMMU_DEMAP, 0);
+ stxa(TLB_DEMAP_ALL, ASI_IMMU_DEMAP, 0);
+ flush(KERNBASE);
+}
+
+/*
+ * Flush all user mappings from the TLBs.
+ */
+void
+zeus_tlb_flush_user(void)
+{
+ u_long data, tag;
+ u_int i, slot;
+
+ for (i = 0; i < ZEUS_FTLB_ENTRIES; i++) {
+ slot = TLB_DAR_SLOT(TLB_DAR_FTLB, i);
+ data = ldxa(slot, ASI_DTLB_DATA_ACCESS_REG);
+ tag = ldxa(slot, ASI_DTLB_TAG_READ_REG);
+ if ((data & TD_V) != 0 && (data & TD_L) == 0 &&
+ TLB_TAR_CTX(tag) != TLB_CTX_KERNEL)
+ stxa_sync(slot, ASI_DTLB_DATA_ACCESS_REG, 0);
+ data = ldxa(slot, ASI_ITLB_DATA_ACCESS_REG);
+ tag = ldxa(slot, ASI_ITLB_TAG_READ_REG);
+ if ((data & TD_V) != 0 && (data & TD_L) == 0 &&
+ TLB_TAR_CTX(tag) != TLB_CTX_KERNEL)
+ stxa_sync(slot, ASI_ITLB_DATA_ACCESS_REG, 0);
+ }
+ for (i = 0; i < ZEUS_STLB_ENTRIES; i++) {
+ slot = TLB_DAR_SLOT(TLB_DAR_STLB, i);
+ data = ldxa(slot, ASI_DTLB_DATA_ACCESS_REG);
+ tag = ldxa(slot, ASI_DTLB_TAG_READ_REG);
+ if ((data & TD_V) != 0 && (data & TD_L) == 0 &&
+ TLB_TAR_CTX(tag) != TLB_CTX_KERNEL)
+ stxa_sync(slot, ASI_DTLB_DATA_ACCESS_REG, 0);
+ data = ldxa(slot, ASI_ITLB_DATA_ACCESS_REG);
+ tag = ldxa(slot, ASI_ITLB_TAG_READ_REG);
+ if ((data & TD_V) != 0 && (data & TD_L) == 0 &&
+ TLB_TAR_CTX(tag) != TLB_CTX_KERNEL)
+ stxa_sync(slot, ASI_ITLB_DATA_ACCESS_REG, 0);
+ }
+}
diff --git a/sys/sys/_types.h b/sys/sys/_types.h
index d71cdb0..c59afd3 100644
--- a/sys/sys/_types.h
+++ b/sys/sys/_types.h
@@ -38,6 +38,7 @@
typedef __uint32_t __blksize_t; /* file block size */
typedef __int64_t __blkcnt_t; /* file block count */
typedef __int32_t __clockid_t; /* clock_gettime()... */
+typedef __uint64_t __cap_rights_t; /* capability rights */
typedef __uint32_t __fflags_t; /* file flags */
typedef __uint64_t __fsblkcnt_t;
typedef __uint64_t __fsfilcnt_t;
diff --git a/sys/sys/bus.h b/sys/sys/bus.h
index e02bdd3..09b8911 100644
--- a/sys/sys/bus.h
+++ b/sys/sys/bus.h
@@ -247,6 +247,7 @@ STAILQ_HEAD(resource_list, resource_list_entry);
#define RLE_RESERVED 0x0001 /* Reserved by the parent bus. */
#define RLE_ALLOCATED 0x0002 /* Reserved resource is allocated. */
+#define RLE_PREFETCH 0x0004 /* Resource is a prefetch range. */
void resource_list_init(struct resource_list *rl);
void resource_list_free(struct resource_list *rl);
diff --git a/sys/sys/capability.h b/sys/sys/capability.h
index 04e7a10..dee2e7a 100644
--- a/sys/sys/capability.h
+++ b/sys/sys/capability.h
@@ -38,10 +38,56 @@
#include <sys/cdefs.h>
#include <sys/types.h>
+#include <sys/file.h>
+
+/*
+ * Possible rights on capabilities.
+ *
+ * Notes:
+ * Some system calls don't require a capability in order to perform an
+ * operation on an fd. These include: close, dup, dup2.
+ *
+ * sendfile is authorized using CAP_READ on the file and CAP_WRITE on the
+ * socket.
+ *
+ * mmap() and aio*() system calls will need special attention as they may
+ * involve reads or writes depending a great deal on context.
+ */
+#define CAP_READ 0x0000000000000001ULL /* read/recv */
+#define CAP_WRITE 0x0000000000000002ULL /* write/send */
+#define CAP_MMAP 0x0000000000000004ULL /* mmap */
+#define CAP_MAPEXEC 0x0000000000000008ULL /* mmap(2) as exec */
+#define CAP_MASK_VALID 0x000000000000000fULL
+
#ifdef _KERNEL
#define IN_CAPABILITY_MODE(td) (td->td_ucred->cr_flags & CRED_FLAG_CAPMODE)
+/*
+ * Create a capability to wrap a file object.
+ */
+int kern_capwrap(struct thread *td, struct file *fp, cap_rights_t rights,
+ struct file **cap, int *capfd);
+
+/*
+ * Unwrap a capability if its rights mask is a superset of 'rights'.
+ *
+ * Unwrapping a non-capability is effectively a no-op; the value of fp_cap
+ * is simply copied into fpp.
+ */
+int cap_funwrap(struct file *fp_cap, cap_rights_t rights,
+ struct file **fpp);
+int cap_funwrap_mmap(struct file *fp_cap, cap_rights_t rights,
+ u_char *maxprotp, struct file **fpp);
+
+/*
+ * For the purposes of procstat(1) and similar tools, allow kern_descrip.c to
+ * extract the rights from a capability. However, this should not be used by
+ * kernel code generally, instead cap_funwrap() should be used in order to
+ * keep all access control in one place.
+ */
+cap_rights_t cap_rights(struct file *fp_cap);
+
#else /* !_KERNEL */
__BEGIN_DECLS
@@ -64,6 +110,18 @@ int cap_enter(void);
*/
int cap_getmode(u_int* modep);
+/*
+ * cap_new(): Create a new capability derived from an existing file
+ * descriptor with the specified rights. If the existing file descriptor is
+ * a capability, then the new rights must be a subset of the existing rights.
+ */
+int cap_new(int fd, cap_rights_t rights);
+
+/*
+ * cap_getrights(): Query the rights on a capability.
+ */
+int cap_getrights(int fd, cap_rights_t *rightsp);
+
__END_DECLS
#endif /* !_KERNEL */
diff --git a/sys/sys/cpuset.h b/sys/sys/cpuset.h
index 030a874..3b2fdbb 100644
--- a/sys/sys/cpuset.h
+++ b/sys/sys/cpuset.h
@@ -131,6 +131,7 @@
#define CPU_SET_ATOMIC(n, p) \
atomic_set_long(&(p)->__bits[(n)/_NCPUBITS], __cpuset_mask(n))
+/* Convenience functions catering special cases. */
#define CPU_OR_ATOMIC(d, s) do { \
__size_t __i; \
for (__i = 0; __i < _NCPUWORDS; __i++) \
@@ -138,13 +139,6 @@
(s)->__bits[__i]); \
} while (0)
-#define CPU_NAND_ATOMIC(d, s) do { \
- __size_t __i; \
- for (__i = 0; __i < _NCPUWORDS; __i++) \
- atomic_clear_long(&(d)->__bits[__i], \
- (s)->__bits[__i]); \
-} while (0)
-
#define CPU_COPY_STORE_REL(f, t) do { \
__size_t __i; \
for (__i = 0; __i < _NCPUWORDS; __i++) \
diff --git a/sys/sys/file.h b/sys/sys/file.h
index e4edac9..eea2c00 100644
--- a/sys/sys/file.h
+++ b/sys/sys/file.h
@@ -64,6 +64,7 @@ struct socket;
#define DTYPE_SEM 9 /* posix semaphore */
#define DTYPE_PTS 10 /* pseudo teletype master device */
#define DTYPE_DEV 11 /* Device specific fd type */
+#define DTYPE_CAPABILITY 12 /* capability */
#ifdef _KERNEL
@@ -178,6 +179,7 @@ extern volatile int openfiles; /* actual number of open files */
int fget(struct thread *td, int fd, struct file **fpp);
int fget_read(struct thread *td, int fd, struct file **fpp);
int fget_write(struct thread *td, int fd, struct file **fpp);
+int fgetcap(struct thread *td, int fd, struct file **fpp);
int _fdrop(struct file *fp, struct thread *td);
/*
diff --git a/sys/sys/interrupt.h b/sys/sys/interrupt.h
index fb253ae..3dace82 100644
--- a/sys/sys/interrupt.h
+++ b/sys/sys/interrupt.h
@@ -149,10 +149,10 @@ extern struct intr_event *clk_intr_event;
extern void *vm_ih;
/* Counts and names for statistics (defined in MD code). */
-extern u_long eintrcnt[]; /* end of intrcnt[] */
-extern char eintrnames[]; /* end of intrnames[] */
extern u_long intrcnt[]; /* counts for for each device and stray */
extern char intrnames[]; /* string table containing device names */
+extern size_t sintrcnt; /* size of intrcnt table */
+extern size_t sintrnames; /* size of intrnames table */
#ifdef DDB
void db_dump_intr_event(struct intr_event *ie, int handlers);
diff --git a/sys/sys/kbio.h b/sys/sys/kbio.h
index 22b0285..7f17bda 100644
--- a/sys/sys/kbio.h
+++ b/sys/sys/kbio.h
@@ -120,6 +120,20 @@ struct keymap {
};
typedef struct keymap keymap_t;
+#ifdef _KERNEL
+struct okeyent_t {
+ u_char map[NUM_STATES];
+ u_char spcl;
+ u_char flgs;
+};
+
+struct okeymap {
+ u_short n_keys;
+ struct okeyent_t key[NUM_KEYS];
+};
+typedef struct okeymap okeymap_t;
+#endif /* _KERNEL */
+
#endif /* !_KEYMAP_DECLARED */
/* defines for "special" keys (spcl bit set in keymap) */
@@ -223,6 +237,10 @@ typedef struct fkeyarg fkeyarg_t;
/* XXX: Should have keymap_t as an argument, but that's too big for ioctl()! */
#define GIO_KEYMAP _IO('k', 6)
#define PIO_KEYMAP _IO('k', 7)
+#ifdef _KERNEL
+#define OGIO_KEYMAP _IOR('k', 6, okeymap_t)
+#define OPIO_KEYMAP _IOW('k', 7, okeymap_t)
+#endif /* _KERNEL */
#define GIO_DEADKEYMAP _IOR('k', 8, accentmap_t)
#define PIO_DEADKEYMAP _IOW('k', 9, accentmap_t)
#define GIO_KEYMAPENT _IOWR('k', 10, keyarg_t)
diff --git a/sys/sys/pcpu.h b/sys/sys/pcpu.h
index e6044a7..b25fcc8 100644
--- a/sys/sys/pcpu.h
+++ b/sys/sys/pcpu.h
@@ -146,7 +146,7 @@ struct rm_queue {
struct rm_queue* volatile rmq_prev;
};
-#define PCPU_NAME_LEN (sizeof("CPU ") + sizeof(__XSTRING(MAXCPU) + 1))
+#define PCPU_NAME_LEN (sizeof("CPU ") + sizeof(__XSTRING(MAXCPU)) - 1)
/*
* This structure maps out the global data that needs to be kept on a
@@ -196,18 +196,6 @@ struct pcpu {
* if only to make kernel debugging easier.
*/
PCPU_MD_FIELDS;
-
- /*
- * XXX
- * For the time being, keep the cpuset_t objects as the very last
- * members of the structure.
- * They are actually tagged to be removed soon, but as long as this
- * does not happen, it is necessary to find a way to implement
- * easilly interfaces to userland and leaving them last makes that
- * possible.
- */
- cpuset_t pc_cpumask; /* This cpu mask */
- cpuset_t pc_other_cpus; /* Mask of all other cpus */
} __aligned(CACHE_LINE_SIZE);
#ifdef _KERNEL
diff --git a/sys/sys/priv.h b/sys/sys/priv.h
index 7733e36..b984f1a 100644
--- a/sys/sys/priv.h
+++ b/sys/sys/priv.h
@@ -337,6 +337,7 @@
#define PRIV_NET_GIF 416 /* Administer gif interface. */
#define PRIV_NET_SETIFVNET 417 /* Move interface to vnet. */
#define PRIV_NET_SETIFDESCR 418 /* Set interface description. */
+#define PRIV_NET_SETIFFIB 419 /* Set interface fib. */
/*
* 802.11-related privileges.
diff --git a/sys/sys/proc.h b/sys/sys/proc.h
index c54a956..233efe9 100644
--- a/sys/sys/proc.h
+++ b/sys/sys/proc.h
@@ -393,7 +393,7 @@ do { \
#define TDP_COWINPROGRESS 0x00000010 /* Snapshot copy-on-write in progress. */
#define TDP_ALTSTACK 0x00000020 /* Have alternate signal stack. */
#define TDP_DEADLKTREAT 0x00000040 /* Lock aquisition - deadlock treatment. */
-#define TDP_UNUSED80 0x00000080 /* available. */
+#define TDP_NOFAULTING 0x00000080 /* Do not handle page faults. */
#define TDP_NOSLEEPING 0x00000100 /* Thread is not allowed to sleep on a sq. */
#define TDP_OWEUPC 0x00000200 /* Call addupc() at next AST. */
#define TDP_ITHREAD 0x00000400 /* Thread is an interrupt thread. */
@@ -913,6 +913,25 @@ void thread_unthread(struct thread *td);
void thread_wait(struct proc *p);
struct thread *thread_find(struct proc *p, lwpid_t tid);
+static __inline int
+curthread_pflags_set(int flags)
+{
+ struct thread *td;
+ int save;
+
+ td = curthread;
+ save = ~flags | (td->td_pflags & flags);
+ td->td_pflags |= flags;
+ return (save);
+}
+
+static __inline void
+curthread_pflags_restore(int save)
+{
+
+ curthread->td_pflags &= save;
+}
+
#endif /* _KERNEL */
#endif /* !_SYS_PROC_H_ */
diff --git a/sys/sys/racct.h b/sys/sys/racct.h
index 222dbce..119b333 100644
--- a/sys/sys/racct.h
+++ b/sys/sys/racct.h
@@ -73,7 +73,7 @@ struct ucred;
/*
* Resource properties.
*/
-#define RACCT_IN_THOUSANDS 0x01
+#define RACCT_IN_MILLIONS 0x01
#define RACCT_RECLAIMABLE 0x02
#define RACCT_INHERITABLE 0x04
#define RACCT_DENIABLE 0x08
@@ -82,35 +82,35 @@ struct ucred;
extern int racct_types[];
/*
- * Amount stored in c_resources[] is thousand times bigger than what's
+ * Amount stored in c_resources[] is 10**6 times bigger than what's
* visible to the userland. It gets fixed up when retrieving resource
* usage or adding rules.
*/
-#define racct_is_in_thousands(X) (racct_types[X] & RACCT_IN_THOUSANDS)
+#define RACCT_IS_IN_MILLIONS(X) (racct_types[X] & RACCT_IN_MILLIONS)
/*
* Resource usage can drop, as opposed to only grow.
*/
-#define racct_is_reclaimable(X) (racct_types[X] & RACCT_RECLAIMABLE)
+#define RACCT_IS_RECLAIMABLE(X) (racct_types[X] & RACCT_RECLAIMABLE)
/*
* Children inherit resource usage.
*/
-#define racct_is_inheritable(X) (racct_types[X] & RACCT_INHERITABLE)
+#define RACCT_IS_INHERITABLE(X) (racct_types[X] & RACCT_INHERITABLE)
/*
* racct_{add,set}(9) can actually return an error and not update resource
* usage counters. Note that even when resource is not deniable, allocating
* resource might cause signals to be sent by RCTL code.
*/
-#define racct_is_deniable(X) (racct_types[X] & RACCT_DENIABLE)
+#define RACCT_IS_DENIABLE(X) (racct_types[X] & RACCT_DENIABLE)
/*
* Per-process resource usage information makes no sense, but per-credential
* one does. This kind of resources are usually allocated for process, but
* freed using credentials.
*/
-#define racct_is_sloppy(X) (racct_types[X] & RACCT_SLOPPY)
+#define RACCT_IS_SLOPPY(X) (racct_types[X] & RACCT_SLOPPY)
/*
* The 'racct' structure defines resource consumption for a particular
diff --git a/sys/sys/sem.h b/sys/sys/sem.h
index cce28f0..f52bc0c 100644
--- a/sys/sys/sem.h
+++ b/sys/sys/sem.h
@@ -107,8 +107,7 @@ union semun {
* semaphore info struct
*/
struct seminfo {
- int semmap, /* # of entries in semaphore map */
- semmni, /* # of semaphore identifiers */
+ int semmni, /* # of semaphore identifiers */
semmns, /* # of semaphores in system */
semmnu, /* # of undo structures in system */
semmsl, /* max # of semaphores per id */
diff --git a/sys/sys/sockio.h b/sys/sys/sockio.h
index 4c1c483..8922699 100644
--- a/sys/sys/sockio.h
+++ b/sys/sys/sockio.h
@@ -110,6 +110,9 @@
#define SIOCSIFVNET _IOWR('i', 90, struct ifreq) /* move IF jail/vnet */
#define SIOCSIFRVNET _IOWR('i', 91, struct ifreq) /* reclaim vnet IF */
+#define SIOCGIFFIB _IOWR('i', 92, struct ifreq) /* get IF fib */
+#define SIOCSIFFIB _IOW('i', 93, struct ifreq) /* set IF fib */
+
#define SIOCSDRVSPEC _IOW('i', 123, struct ifdrv) /* set driver-specific
parameters */
#define SIOCGDRVSPEC _IOWR('i', 123, struct ifdrv) /* get driver-specific
diff --git a/sys/sys/syscall.h b/sys/sys/syscall.h
index 8be00de..fa4f46f 100644
--- a/sys/sys/syscall.h
+++ b/sys/sys/syscall.h
@@ -430,6 +430,8 @@
#define SYS_msgctl 511
#define SYS_shmctl 512
#define SYS_lpathconf 513
+#define SYS_cap_new 514
+#define SYS_cap_getrights 515
#define SYS_cap_enter 516
#define SYS_cap_getmode 517
#define SYS_pselect 522
diff --git a/sys/sys/syscall.mk b/sys/sys/syscall.mk
index 2f8e7b3..544bbf4 100644
--- a/sys/sys/syscall.mk
+++ b/sys/sys/syscall.mk
@@ -379,6 +379,8 @@ MIASM = \
msgctl.o \
shmctl.o \
lpathconf.o \
+ cap_new.o \
+ cap_getrights.o \
cap_enter.o \
cap_getmode.o \
pselect.o \
diff --git a/sys/sys/sysctl.h b/sys/sys/sysctl.h
index b2ebae3..1e879f5 100644
--- a/sys/sys/sysctl.h
+++ b/sys/sys/sysctl.h
@@ -88,6 +88,9 @@ struct ctlname {
#define CTLFLAG_VNET 0x00020000 /* Prisons with vnet can fiddle */
#define CTLFLAG_RDTUN (CTLFLAG_RD|CTLFLAG_TUN)
#define CTLFLAG_DYING 0x00010000 /* oid is being removed */
+#define CTLFLAG_CAPRD 0x00008000 /* Can be read in capability mode */
+#define CTLFLAG_CAPWR 0x00004000 /* Can be written in capability mode */
+#define CTLFLAG_CAPRW (CTLFLAG_CAPRD|CTLFLAG_CAPWR)
/*
* Secure level. Note that CTLFLAG_SECURE == CTLFLAG_SECURE1.
@@ -407,7 +410,8 @@ SYSCTL_ALLOWED_TYPES(UINT64, uint64_t *a; unsigned long long *b; );
* kernel features.
*/
#define FEATURE(name, desc) \
- SYSCTL_INT(_kern_features, OID_AUTO, name, CTLFLAG_RD, 0, 1, desc)
+ SYSCTL_INT(_kern_features, OID_AUTO, name, CTLFLAG_RD | CTLFLAG_CAPRD, \
+ 0, 1, desc)
#endif /* _KERNEL */
diff --git a/sys/sys/sysproto.h b/sys/sys/sysproto.h
index 0965b72..90e0449 100644
--- a/sys/sys/sysproto.h
+++ b/sys/sys/sysproto.h
@@ -1657,6 +1657,14 @@ struct lpathconf_args {
char path_l_[PADL_(char *)]; char * path; char path_r_[PADR_(char *)];
char name_l_[PADL_(int)]; int name; char name_r_[PADR_(int)];
};
+struct cap_new_args {
+ char fd_l_[PADL_(int)]; int fd; char fd_r_[PADR_(int)];
+ char rights_l_[PADL_(u_int64_t)]; u_int64_t rights; char rights_r_[PADR_(u_int64_t)];
+};
+struct cap_getrights_args {
+ char fd_l_[PADL_(int)]; int fd; char fd_r_[PADR_(int)];
+ char rightsp_l_[PADL_(u_int64_t *)]; u_int64_t * rightsp; char rightsp_r_[PADR_(u_int64_t *)];
+};
struct cap_enter_args {
register_t dummy;
};
@@ -2073,6 +2081,8 @@ int __semctl(struct thread *, struct __semctl_args *);
int msgctl(struct thread *, struct msgctl_args *);
int shmctl(struct thread *, struct shmctl_args *);
int lpathconf(struct thread *, struct lpathconf_args *);
+int cap_new(struct thread *, struct cap_new_args *);
+int cap_getrights(struct thread *, struct cap_getrights_args *);
int cap_enter(struct thread *, struct cap_enter_args *);
int cap_getmode(struct thread *, struct cap_getmode_args *);
int pselect(struct thread *, struct pselect_args *);
@@ -2758,6 +2768,8 @@ int freebsd7_shmctl(struct thread *, struct freebsd7_shmctl_args *);
#define SYS_AUE_msgctl AUE_MSGCTL
#define SYS_AUE_shmctl AUE_SHMCTL
#define SYS_AUE_lpathconf AUE_LPATHCONF
+#define SYS_AUE_cap_new AUE_CAP_NEW
+#define SYS_AUE_cap_getrights AUE_CAP_GETRIGHTS
#define SYS_AUE_cap_enter AUE_CAP_ENTER
#define SYS_AUE_cap_getmode AUE_CAP_GETMODE
#define SYS_AUE_pselect AUE_SELECT
diff --git a/sys/sys/systm.h b/sys/sys/systm.h
index 35d34e4..8b0de57 100644
--- a/sys/sys/systm.h
+++ b/sys/sys/systm.h
@@ -217,8 +217,12 @@ int copyinstr(const void * __restrict udaddr, void * __restrict kaddr,
__nonnull(1) __nonnull(2);
int copyin(const void * __restrict udaddr, void * __restrict kaddr,
size_t len) __nonnull(1) __nonnull(2);
+int copyin_nofault(const void * __restrict udaddr, void * __restrict kaddr,
+ size_t len) __nonnull(1) __nonnull(2);
int copyout(const void * __restrict kaddr, void * __restrict udaddr,
size_t len) __nonnull(1) __nonnull(2);
+int copyout_nofault(const void * __restrict kaddr, void * __restrict udaddr,
+ size_t len) __nonnull(1) __nonnull(2);
int fubyte(const void *base);
long fuword(const void *base);
@@ -392,4 +396,15 @@ bitcount32(uint32_t x)
return (x);
}
+static __inline uint16_t
+bitcount16(uint32_t x)
+{
+
+ x = (x & 0x5555) + ((x & 0xaaaa) >> 1);
+ x = (x & 0x3333) + ((x & 0xcccc) >> 2);
+ x = (x + (x >> 4)) & 0x0f0f;
+ x = (x + (x >> 8)) & 0x00ff;
+ return (x);
+}
+
#endif /* !_SYS_SYSTM_H_ */
diff --git a/sys/sys/timetc.h b/sys/sys/timetc.h
index dc1dea4..4f75c3d 100644
--- a/sys/sys/timetc.h
+++ b/sys/sys/timetc.h
@@ -47,7 +47,7 @@ struct timecounter {
*/
u_int tc_counter_mask;
/* This mask should mask off any unimplemented bits. */
- u_int64_t tc_frequency;
+ uint64_t tc_frequency;
/* Frequency of the counter in Hz. */
char *tc_name;
/* Name of the timecounter. */
@@ -57,6 +57,8 @@ struct timecounter {
* another timecounter higher means better. Negative
* means "only use at explicit request".
*/
+ u_int tc_flags;
+#define TC_FLAGS_C3STOP 1 /* Timer dies in C3. */
void *tc_priv;
/* Pointer to the timecounter's private parts. */
diff --git a/sys/sys/tty.h b/sys/sys/tty.h
index c594e11..42f264b 100644
--- a/sys/sys/tty.h
+++ b/sys/sys/tty.h
@@ -152,6 +152,11 @@ struct xtty {
#ifdef _KERNEL
+/* Used to distinguish between normal, callout, lock and init devices. */
+#define TTYUNIT_INIT 0x1
+#define TTYUNIT_LOCK 0x2
+#define TTYUNIT_CALLOUT 0x4
+
/* Allocation and deallocation. */
struct tty *tty_alloc(struct ttydevsw *tsw, void *softc);
struct tty *tty_alloc_mutex(struct ttydevsw *tsw, void *softc, struct mtx *mtx);
diff --git a/sys/sys/ttydevsw.h b/sys/sys/ttydevsw.h
index 4506919..748ae0b 100644
--- a/sys/sys/ttydevsw.h
+++ b/sys/sys/ttydevsw.h
@@ -46,6 +46,8 @@ typedef void tsw_outwakeup_t(struct tty *tp);
typedef void tsw_inwakeup_t(struct tty *tp);
typedef int tsw_ioctl_t(struct tty *tp, u_long cmd, caddr_t data,
struct thread *td);
+typedef int tsw_cioctl_t(struct tty *tp, int unit, u_long cmd, caddr_t data,
+ struct thread *td);
typedef int tsw_param_t(struct tty *tp, struct termios *t);
typedef int tsw_modem_t(struct tty *tp, int sigon, int sigoff);
typedef int tsw_mmap_t(struct tty *tp, vm_ooffset_t offset,
@@ -63,6 +65,7 @@ struct ttydevsw {
tsw_inwakeup_t *tsw_inwakeup; /* Input can be stored again. */
tsw_ioctl_t *tsw_ioctl; /* ioctl() hooks. */
+ tsw_cioctl_t *tsw_cioctl; /* ioctl() on control devices. */
tsw_param_t *tsw_param; /* TIOCSETA device parameter setting. */
tsw_modem_t *tsw_modem; /* Modem sigon/sigoff. */
@@ -70,6 +73,8 @@ struct ttydevsw {
tsw_pktnotify_t *tsw_pktnotify; /* TIOCPKT events. */
tsw_free_t *tsw_free; /* Destructor. */
+
+ void *tsw_spare[4]; /* For future use. */
};
static __inline int
@@ -126,6 +131,15 @@ ttydevsw_ioctl(struct tty *tp, u_long cmd, caddr_t data, struct thread *td)
}
static __inline int
+ttydevsw_cioctl(struct tty *tp, int unit, u_long cmd, caddr_t data, struct thread *td)
+{
+ tty_lock_assert(tp, MA_OWNED);
+ MPASS(!tty_gone(tp));
+
+ return tp->t_devsw->tsw_cioctl(tp, unit, cmd, data, td);
+}
+
+static __inline int
ttydevsw_param(struct tty *tp, struct termios *t)
{
MPASS(!tty_gone(tp));
diff --git a/sys/sys/types.h b/sys/sys/types.h
index cb513af..1b994d3 100644
--- a/sys/sys/types.h
+++ b/sys/sys/types.h
@@ -89,6 +89,8 @@ typedef __blkcnt_t blkcnt_t;
#define _BLKCNT_T_DECLARED
#endif
+typedef __cap_rights_t cap_rights_t;
+
#ifndef _CLOCK_T_DECLARED
typedef __clock_t clock_t;
#define _CLOCK_T_DECLARED
diff --git a/sys/sys/uio.h b/sys/sys/uio.h
index d7fa124..5df279b 100644
--- a/sys/sys/uio.h
+++ b/sys/sys/uio.h
@@ -100,6 +100,7 @@ int uiomove(void *cp, int n, struct uio *uio);
int uiomove_frombuf(void *buf, int buflen, struct uio *uio);
int uiomove_fromphys(struct vm_page *ma[], vm_offset_t offset, int n,
struct uio *uio);
+int uiomove_nofault(void *cp, int n, struct uio *uio);
int uiomoveco(void *cp, int n, struct uio *uio, int disposable);
#else /* !_KERNEL */
diff --git a/sys/sys/unistd.h b/sys/sys/unistd.h
index 378308d..9d56a3a 100644
--- a/sys/sys/unistd.h
+++ b/sys/sys/unistd.h
@@ -180,8 +180,16 @@
#define RFLINUXTHPN (1<<16) /* do linux clone exit parent notification */
#define RFSTOPPED (1<<17) /* leave child in a stopped state */
#define RFHIGHPID (1<<18) /* use a pid higher than 10 (idleproc) */
+#define RFTSIGZMB (1<<19) /* select signal for exit parent notification */
+#define RFTSIGSHIFT 20 /* selected signal number is in bits 20-27 */
+#define RFTSIGMASK 0xFF
+#define RFTSIGNUM(flags) (((flags) >> RFTSIGSHIFT) & RFTSIGMASK)
+#define RFTSIGFLAGS(signum) ((signum) << RFTSIGSHIFT)
#define RFPPWAIT (1<<31) /* parent sleeps until child exits (vfork) */
#define RFKERNELONLY (RFSTOPPED | RFHIGHPID | RFPPWAIT)
+#define RFFLAGS (RFFDG | RFPROC | RFMEM | RFNOWAIT | RFCFDG | \
+ RFTHREAD | RFSIGSHARE | RFLINUXTHPN | RFSTOPPED | RFHIGHPID | RFTSIGZMB | \
+ RFPPWAIT)
#endif /* __BSD_VISIBLE */
diff --git a/sys/sys/vnode.h b/sys/sys/vnode.h
index 40f9a6a..1c4c7b7 100644
--- a/sys/sys/vnode.h
+++ b/sys/sys/vnode.h
@@ -75,12 +75,9 @@ struct vpollinfo {
* Lock reference:
* c - namecache mutex
* f - freelist mutex
- * G - Giant
* i - interlock
- * m - mntvnodes mutex
+ * m - mount point interlock
* p - pollinfo lock
- * s - spechash mutex
- * S - syncer mutex
* u - Only a reference to the vnode is needed to read.
* v - vnode lock
*
@@ -165,7 +162,7 @@ struct vnode {
/*
* Hooks for various subsystems and features.
*/
- struct vpollinfo *v_pollinfo; /* G Poll events, p for *v_pi */
+ struct vpollinfo *v_pollinfo; /* i Poll events, p for *v_pi */
struct label *v_label; /* MAC label for vnode */
struct lockf *v_lockf; /* Byte-level lock list */
};
diff --git a/sys/ufs/ffs/ffs_alloc.c b/sys/ufs/ffs/ffs_alloc.c
index 6d27ace..82506fb 100644
--- a/sys/ufs/ffs/ffs_alloc.c
+++ b/sys/ufs/ffs/ffs_alloc.c
@@ -2038,7 +2038,11 @@ ffs_blkfree(ump, fs, devvp, bno, size, inum, vtype, dephd)
ffs_snapblkfree(fs, devvp, bno, size, inum, vtype, dephd)) {
return;
}
- if (!ump->um_candelete) {
+ /*
+ * Nothing to delay if TRIM is disabled, or the operation is
+ * performed on the snapshot.
+ */
+ if (!ump->um_candelete || devvp->v_type == VREG) {
ffs_blkfree_cg(ump, fs, devvp, bno, size, inum, dephd);
return;
}
@@ -2377,6 +2381,18 @@ ffs_fserr(fs, inum, cp)
* in the current directory is oldvalue then change it to newvalue.
* unlink(nameptr, oldvalue) - Verify that the inode number associated
* with nameptr in the current directory is oldvalue then unlink it.
+ *
+ * The following functions may only be used on a quiescent filesystem
+ * by the soft updates journal. They are not safe to be run on an active
+ * filesystem.
+ *
+ * setinode(inode, dip) - the specified disk inode is replaced with the
+ * contents pointed to by dip.
+ * setbufoutput(fd, flags) - output associated with the specified file
+ * descriptor (which must reference the character device supporting
+ * the filesystem) switches from using physio to running through the
+ * buffer cache when flags is set to 1. The descriptor reverts to
+ * physio for output when flags is set to zero.
*/
static int sysctl_ffs_fsck(SYSCTL_HANDLER_ARGS);
@@ -2423,11 +2439,21 @@ static SYSCTL_NODE(_vfs_ffs, FFS_SET_DOTDOT, setdotdot, CTLFLAG_WR,
static SYSCTL_NODE(_vfs_ffs, FFS_UNLINK, unlink, CTLFLAG_WR,
sysctl_ffs_fsck, "Unlink a Duplicate Name");
+static SYSCTL_NODE(_vfs_ffs, FFS_SET_INODE, setinode, CTLFLAG_WR,
+ sysctl_ffs_fsck, "Update an On-Disk Inode");
+
+static SYSCTL_NODE(_vfs_ffs, FFS_SET_BUFOUTPUT, setbufoutput, CTLFLAG_WR,
+ sysctl_ffs_fsck, "Set Buffered Writing for Descriptor");
+
+#define DEBUG 1
#ifdef DEBUG
-static int fsckcmds = 0;
+static int fsckcmds = 1;
SYSCTL_INT(_debug, OID_AUTO, fsckcmds, CTLFLAG_RW, &fsckcmds, 0, "");
#endif /* DEBUG */
+static int buffered_write(struct file *, struct uio *, struct ucred *,
+ int, struct thread *);
+
static int
sysctl_ffs_fsck(SYSCTL_HANDLER_ARGS)
{
@@ -2441,8 +2467,10 @@ sysctl_ffs_fsck(SYSCTL_HANDLER_ARGS)
ufs2_daddr_t blkno;
long blkcnt, blksize;
struct filedesc *fdp;
- struct file *fp;
+ struct file *fp, *vfp;
int vfslocked, filetype, error;
+ static struct fileops *origops, bufferedops;
+ static int outcnt = 0;
if (req->newlen > sizeof cmd)
return (EBADRPC);
@@ -2450,7 +2478,7 @@ sysctl_ffs_fsck(SYSCTL_HANDLER_ARGS)
return (error);
if (cmd.version != FFS_CMD_VERSION)
return (ERPCMISMATCH);
- if ((error = getvnode(curproc->p_fd, cmd.handle, &fp)) != 0)
+ if ((error = getvnode(td->td_proc->p_fd, cmd.handle, &fp)) != 0)
return (error);
vp = fp->f_data;
if (vp->v_type != VREG && vp->v_type != VDIR) {
@@ -2463,12 +2491,13 @@ sysctl_ffs_fsck(SYSCTL_HANDLER_ARGS)
fdrop(fp, td);
return (EINVAL);
}
- if (mp->mnt_flag & MNT_RDONLY) {
+ ump = VFSTOUFS(mp);
+ if ((mp->mnt_flag & MNT_RDONLY) &&
+ ump->um_fsckpid != td->td_proc->p_pid) {
vn_finished_write(mp);
fdrop(fp, td);
return (EROFS);
}
- ump = VFSTOUFS(mp);
fs = ump->um_fs;
filetype = IFREG;
@@ -2489,7 +2518,7 @@ sysctl_ffs_fsck(SYSCTL_HANDLER_ARGS)
case FFS_ADJ_REFCNT:
#ifdef DEBUG
if (fsckcmds) {
- printf("%s: adjust inode %jd count by %jd\n",
+ printf("%s: adjust inode %jd link count by %jd\n",
mp->mnt_stat.f_mntonname, (intmax_t)cmd.value,
(intmax_t)cmd.size);
}
@@ -2500,7 +2529,8 @@ sysctl_ffs_fsck(SYSCTL_HANDLER_ARGS)
ip->i_nlink += cmd.size;
DIP_SET(ip, i_nlink, ip->i_nlink);
ip->i_effnlink += cmd.size;
- ip->i_flag |= IN_CHANGE;
+ ip->i_flag |= IN_CHANGE | IN_MODIFIED;
+ error = ffs_update(vp, 1);
if (DOINGSOFTDEP(vp))
softdep_change_linkcnt(ip);
vput(vp);
@@ -2518,7 +2548,8 @@ sysctl_ffs_fsck(SYSCTL_HANDLER_ARGS)
break;
ip = VTOI(vp);
DIP_SET(ip, i_blocks, DIP(ip, i_blocks) + cmd.size);
- ip->i_flag |= IN_CHANGE;
+ ip->i_flag |= IN_CHANGE | IN_MODIFIED;
+ error = ffs_update(vp, 1);
vput(vp);
break;
@@ -2718,6 +2749,78 @@ sysctl_ffs_fsck(SYSCTL_HANDLER_ARGS)
UIO_USERSPACE, (ino_t)cmd.size);
break;
+ case FFS_SET_INODE:
+ if (ump->um_fsckpid != td->td_proc->p_pid) {
+ error = EPERM;
+ break;
+ }
+#ifdef DEBUG
+ if (fsckcmds && outcnt++ < 100) {
+ printf("%s: update inode %jd\n",
+ mp->mnt_stat.f_mntonname, (intmax_t)cmd.value);
+ }
+#endif /* DEBUG */
+ if ((error = ffs_vget(mp, (ino_t)cmd.value, LK_EXCLUSIVE, &vp)))
+ break;
+ vfslocked = VFS_LOCK_GIANT(vp->v_mount);
+ AUDIT_ARG_VNODE1(vp);
+ ip = VTOI(vp);
+ if (ip->i_ump->um_fstype == UFS1)
+ error = copyin((void *)(intptr_t)cmd.size, ip->i_din1,
+ sizeof(struct ufs1_dinode));
+ else
+ error = copyin((void *)(intptr_t)cmd.size, ip->i_din2,
+ sizeof(struct ufs2_dinode));
+ if (error) {
+ vput(vp);
+ VFS_UNLOCK_GIANT(vfslocked);
+ break;
+ }
+ ip->i_flag |= IN_CHANGE | IN_MODIFIED;
+ error = ffs_update(vp, 1);
+ vput(vp);
+ VFS_UNLOCK_GIANT(vfslocked);
+ break;
+
+ case FFS_SET_BUFOUTPUT:
+ if (ump->um_fsckpid != td->td_proc->p_pid) {
+ error = EPERM;
+ break;
+ }
+ if (VTOI(vp)->i_ump != ump) {
+ error = EINVAL;
+ break;
+ }
+#ifdef DEBUG
+ if (fsckcmds) {
+ printf("%s: %s buffered output for descriptor %jd\n",
+ mp->mnt_stat.f_mntonname,
+ cmd.size == 1 ? "enable" : "disable",
+ (intmax_t)cmd.value);
+ }
+#endif /* DEBUG */
+ if ((error = getvnode(td->td_proc->p_fd, cmd.value, &vfp)) != 0)
+ break;
+ if (vfp->f_vnode->v_type != VCHR) {
+ fdrop(vfp, td);
+ error = EINVAL;
+ break;
+ }
+ if (origops == NULL) {
+ origops = vfp->f_ops;
+ bcopy((void *)origops, (void *)&bufferedops,
+ sizeof(bufferedops));
+ bufferedops.fo_write = buffered_write;
+ }
+ if (cmd.size == 1)
+ atomic_store_rel_ptr((volatile uintptr_t *)&vfp->f_ops,
+ (uintptr_t)&bufferedops);
+ else
+ atomic_store_rel_ptr((volatile uintptr_t *)&vfp->f_ops,
+ (uintptr_t)origops);
+ fdrop(vfp, td);
+ break;
+
default:
#ifdef DEBUG
if (fsckcmds) {
@@ -2733,3 +2836,73 @@ sysctl_ffs_fsck(SYSCTL_HANDLER_ARGS)
vn_finished_write(mp);
return (error);
}
+
+/*
+ * Function to switch a descriptor to use the buffer cache to stage
+ * its I/O. This is needed so that writes to the filesystem device
+ * will give snapshots a chance to copy modified blocks for which it
+ * needs to retain copies.
+ */
+static int
+buffered_write(fp, uio, active_cred, flags, td)
+ struct file *fp;
+ struct uio *uio;
+ struct ucred *active_cred;
+ int flags;
+ struct thread *td;
+{
+ struct vnode *devvp;
+ struct inode *ip;
+ struct buf *bp;
+ struct fs *fs;
+ int error, vfslocked;
+ daddr_t lbn;
+ static int outcnt = 0;
+
+ /*
+ * The devvp is associated with the /dev filesystem. To discover
+ * the filesystem with which the device is associated, we depend
+ * on the application setting the current directory to a location
+ * within the filesystem being written. Yes, this is an ugly hack.
+ */
+ devvp = fp->f_vnode;
+ ip = VTOI(td->td_proc->p_fd->fd_cdir);
+ if (ip->i_devvp != devvp)
+ return (EINVAL);
+ fs = ip->i_fs;
+ vfslocked = VFS_LOCK_GIANT(ip->i_vnode->v_mount);
+ vn_lock(devvp, LK_EXCLUSIVE | LK_RETRY);
+ if ((flags & FOF_OFFSET) == 0)
+ uio->uio_offset = fp->f_offset;
+#ifdef DEBUG
+ if (fsckcmds && outcnt++ < 100) {
+ printf("%s: buffered write for block %jd\n",
+ fs->fs_fsmnt, (intmax_t)btodb(uio->uio_offset));
+ }
+#endif /* DEBUG */
+ /*
+ * All I/O must be contained within a filesystem block, start on
+ * a fragment boundary, and be a multiple of fragments in length.
+ */
+ if (uio->uio_resid > fs->fs_bsize - (uio->uio_offset % fs->fs_bsize) ||
+ fragoff(fs, uio->uio_offset) != 0 ||
+ fragoff(fs, uio->uio_resid) != 0) {
+ error = EINVAL;
+ goto out;
+ }
+ lbn = numfrags(fs, uio->uio_offset);
+ bp = getblk(devvp, lbn, uio->uio_resid, 0, 0, 0);
+ bp->b_flags |= B_RELBUF;
+ if ((error = uiomove((char *)bp->b_data, uio->uio_resid, uio)) != 0) {
+ brelse(bp);
+ goto out;
+ }
+ error = bwrite(bp);
+ if ((flags & FOF_OFFSET) == 0)
+ fp->f_offset = uio->uio_offset;
+ fp->f_nextoff = uio->uio_offset;
+out:
+ VOP_UNLOCK(devvp, 0);
+ VFS_UNLOCK_GIANT(vfslocked);
+ return (error);
+}
diff --git a/sys/ufs/ffs/ffs_balloc.c b/sys/ufs/ffs/ffs_balloc.c
index 63a4eba..f6b078f 100644
--- a/sys/ufs/ffs/ffs_balloc.c
+++ b/sys/ufs/ffs/ffs_balloc.c
@@ -234,9 +234,7 @@ ffs_balloc_ufs1(struct vnode *vp, off_t startoffset, int size,
if (num < 1)
panic ("ffs_balloc_ufs1: ufs_getlbns returned indirect block");
#endif
- saved_inbdflush = ~TDP_INBDFLUSH | (curthread->td_pflags &
- TDP_INBDFLUSH);
- curthread->td_pflags |= TDP_INBDFLUSH;
+ saved_inbdflush = curthread_pflags_set(TDP_INBDFLUSH);
/*
* Fetch the first indirect block allocating if necessary.
*/
@@ -250,7 +248,7 @@ ffs_balloc_ufs1(struct vnode *vp, off_t startoffset, int size,
pref = ffs_blkpref_ufs1(ip, lbn, 0, (ufs1_daddr_t *)0);
if ((error = ffs_alloc(ip, lbn, pref, (int)fs->fs_bsize,
flags, cred, &newb)) != 0) {
- curthread->td_pflags &= saved_inbdflush;
+ curthread_pflags_restore(saved_inbdflush);
return (error);
}
nb = newb;
@@ -356,7 +354,7 @@ retry:
* If asked only for the indirect block, then return it.
*/
if (flags & BA_METAONLY) {
- curthread->td_pflags &= saved_inbdflush;
+ curthread_pflags_restore(saved_inbdflush);
*bpp = bp;
return (0);
}
@@ -406,7 +404,7 @@ retry:
bp->b_flags |= B_CLUSTEROK;
bdwrite(bp);
}
- curthread->td_pflags &= saved_inbdflush;
+ curthread_pflags_restore(saved_inbdflush);
*bpp = nbp;
return (0);
}
@@ -428,11 +426,11 @@ retry:
nbp = getblk(vp, lbn, fs->fs_bsize, 0, 0, 0);
nbp->b_blkno = fsbtodb(fs, nb);
}
- curthread->td_pflags &= saved_inbdflush;
+ curthread_pflags_restore(saved_inbdflush);
*bpp = nbp;
return (0);
fail:
- curthread->td_pflags &= saved_inbdflush;
+ curthread_pflags_restore(saved_inbdflush);
/*
* If we have failed to allocate any blocks, simply return the error.
* This is the usual case and avoids the need to fsync the file.
@@ -774,9 +772,7 @@ ffs_balloc_ufs2(struct vnode *vp, off_t startoffset, int size,
if (num < 1)
panic ("ffs_balloc_ufs2: ufs_getlbns returned indirect block");
#endif
- saved_inbdflush = ~TDP_INBDFLUSH | (curthread->td_pflags &
- TDP_INBDFLUSH);
- curthread->td_pflags |= TDP_INBDFLUSH;
+ saved_inbdflush = curthread_pflags_set(TDP_INBDFLUSH);
/*
* Fetch the first indirect block allocating if necessary.
*/
@@ -790,7 +786,7 @@ ffs_balloc_ufs2(struct vnode *vp, off_t startoffset, int size,
pref = ffs_blkpref_ufs2(ip, lbn, 0, (ufs2_daddr_t *)0);
if ((error = ffs_alloc(ip, lbn, pref, (int)fs->fs_bsize,
flags, cred, &newb)) != 0) {
- curthread->td_pflags &= saved_inbdflush;
+ curthread_pflags_restore(saved_inbdflush);
return (error);
}
nb = newb;
@@ -896,7 +892,7 @@ retry:
* If asked only for the indirect block, then return it.
*/
if (flags & BA_METAONLY) {
- curthread->td_pflags &= saved_inbdflush;
+ curthread_pflags_restore(saved_inbdflush);
*bpp = bp;
return (0);
}
@@ -946,7 +942,7 @@ retry:
bp->b_flags |= B_CLUSTEROK;
bdwrite(bp);
}
- curthread->td_pflags &= saved_inbdflush;
+ curthread_pflags_restore(saved_inbdflush);
*bpp = nbp;
return (0);
}
@@ -974,11 +970,11 @@ retry:
nbp = getblk(vp, lbn, fs->fs_bsize, 0, 0, 0);
nbp->b_blkno = fsbtodb(fs, nb);
}
- curthread->td_pflags &= saved_inbdflush;
+ curthread_pflags_restore(saved_inbdflush);
*bpp = nbp;
return (0);
fail:
- curthread->td_pflags &= saved_inbdflush;
+ curthread_pflags_restore(saved_inbdflush);
/*
* If we have failed to allocate any blocks, simply return the error.
* This is the usual case and avoids the need to fsync the file.
diff --git a/sys/ufs/ffs/ffs_inode.c b/sys/ufs/ffs/ffs_inode.c
index 62fa8e0..0034029 100644
--- a/sys/ufs/ffs/ffs_inode.c
+++ b/sys/ufs/ffs/ffs_inode.c
@@ -90,7 +90,7 @@ ffs_update(vp, waitfor)
return (0);
ip->i_flag &= ~(IN_LAZYACCESS | IN_LAZYMOD | IN_MODIFIED);
fs = ip->i_fs;
- if (fs->fs_ronly)
+ if (fs->fs_ronly && ip->i_ump->um_fsckpid == 0)
return (0);
error = bread(ip->i_devvp, fsbtodb(fs, ino_to_fsba(fs, ip->i_number)),
(int)fs->fs_bsize, NOCRED, &bp);
diff --git a/sys/ufs/ffs/ffs_softdep.c b/sys/ufs/ffs/ffs_softdep.c
index 9af5f67..fccb296 100644
--- a/sys/ufs/ffs/ffs_softdep.c
+++ b/sys/ufs/ffs/ffs_softdep.c
@@ -880,6 +880,7 @@ static inline void setup_freeext(struct freeblks *, struct inode *, int, int);
static inline void setup_freeindir(struct freeblks *, struct inode *, int,
ufs_lbn_t, int);
static inline struct freeblks *newfreeblks(struct mount *, struct inode *);
+static void freeblks_free(struct ufsmount *, struct freeblks *, int);
static void indir_trunc(struct freework *, ufs2_daddr_t, ufs_lbn_t);
ufs2_daddr_t blkcount(struct fs *, ufs2_daddr_t, off_t);
static int trunc_check_buf(struct buf *, int *, ufs_lbn_t, int, int);
@@ -5198,7 +5199,7 @@ newfreefrag(ip, blkno, size, lbn)
freefrag->ff_blkno = blkno;
freefrag->ff_fragsize = size;
- if (fs->fs_flags & FS_SUJ) {
+ if ((ip->i_ump->um_mountp->mnt_kern_flag & MNTK_SUJ) != 0) {
freefrag->ff_jdep = (struct worklist *)
newjfreefrag(freefrag, ip, blkno, size, lbn);
} else {
@@ -5751,7 +5752,6 @@ newfreeblks(mp, ip)
freeblks->fb_modrev = DIP(ip, i_modrev);
freeblks->fb_devvp = ip->i_devvp;
freeblks->fb_chkcnt = 0;
- freeblks->fb_freecnt = 0;
freeblks->fb_len = 0;
return (freeblks);
@@ -6199,7 +6199,7 @@ softdep_journal_freeblocks(ip, cred, length, flags)
quotaref(vp, freeblks->fb_quota);
(void) chkdq(ip, -datablocks, NOCRED, 0);
#endif
- freeblks->fb_chkcnt = datablocks;
+ freeblks->fb_chkcnt = -datablocks;
UFS_LOCK(ip->i_ump);
fs->fs_pendingblocks += datablocks;
UFS_UNLOCK(ip->i_ump);
@@ -6429,7 +6429,7 @@ softdep_setup_freeblocks(ip, length, flags)
quotaref(vp, freeblks->fb_quota);
(void) chkdq(ip, -datablocks, NOCRED, 0);
#endif
- freeblks->fb_chkcnt = datablocks;
+ freeblks->fb_chkcnt = -datablocks;
UFS_LOCK(ip->i_ump);
fs->fs_pendingblocks += datablocks;
UFS_UNLOCK(ip->i_ump);
@@ -7284,8 +7284,8 @@ freework_freeblock(freework)
freeblks->fb_cgwait++;
WORKLIST_INSERT(&wkhd, &freework->fw_list);
}
- freeblks->fb_freecnt += btodb(bsize);
FREE_LOCK(&lk);
+ freeblks_free(ump, freeblks, btodb(bsize));
ffs_blkfree(ump, fs, freeblks->fb_devvp, freework->fw_blkno, bsize,
freeblks->fb_inum, freeblks->fb_vtype, &wkhd);
ACQUIRE_LOCK(&lk);
@@ -7459,6 +7459,33 @@ handle_workitem_freeblocks(freeblks, flags)
}
/*
+ * Handle completion of block free via truncate. This allows fs_pending
+ * to track the actual free block count more closely than if we only updated
+ * it at the end. We must be careful to handle cases where the block count
+ * on free was incorrect.
+ */
+static void
+freeblks_free(ump, freeblks, blocks)
+ struct ufsmount *ump;
+ struct freeblks *freeblks;
+ int blocks;
+{
+ struct fs *fs;
+ ufs2_daddr_t remain;
+
+ UFS_LOCK(ump);
+ remain = -freeblks->fb_chkcnt;
+ freeblks->fb_chkcnt += blocks;
+ if (remain > 0) {
+ if (remain < blocks)
+ blocks = remain;
+ fs = ump->um_fs;
+ fs->fs_pendingblocks -= blocks;
+ }
+ UFS_UNLOCK(ump);
+}
+
+/*
* Once all of the freework workitems are complete we can retire the
* freeblocks dependency and any journal work awaiting completion. This
* can not be called until all other dependencies are stable on disk.
@@ -7478,7 +7505,7 @@ handle_complete_freeblocks(freeblks, flags)
ump = VFSTOUFS(freeblks->fb_list.wk_mp);
fs = ump->um_fs;
flags = LK_EXCLUSIVE | flags;
- spare = freeblks->fb_freecnt - freeblks->fb_chkcnt;
+ spare = freeblks->fb_chkcnt;
/*
* If we did not release the expected number of blocks we may have
@@ -7501,9 +7528,9 @@ handle_complete_freeblocks(freeblks, flags)
}
vput(vp);
}
- if (freeblks->fb_chkcnt) {
+ if (spare < 0) {
UFS_LOCK(ump);
- fs->fs_pendingblocks -= freeblks->fb_chkcnt;
+ fs->fs_pendingblocks += spare;
UFS_UNLOCK(ump);
}
#ifdef QUOTA
@@ -7559,7 +7586,7 @@ indir_trunc(freework, dbn, lbn)
ufs2_daddr_t nb, nnb, *bap2 = 0;
ufs_lbn_t lbnadd, nlbn;
int i, nblocks, ufs1fmt;
- int fs_pendingblocks;
+ int freedblocks;
int goingaway;
int freedeps;
int needj;
@@ -7701,16 +7728,18 @@ indir_trunc(freework, dbn, lbn)
bp->b_flags |= B_INVAL | B_NOCACHE;
brelse(bp);
}
- fs_pendingblocks = 0;
+ freedblocks = 0;
if (level == 0)
- fs_pendingblocks = (nblocks * cnt);
+ freedblocks = (nblocks * cnt);
+ if (needj == 0)
+ freedblocks += nblocks;
+ freeblks_free(ump, freeblks, freedblocks);
/*
* If we are journaling set up the ref counts and offset so this
* indirect can be completed when its children are free.
*/
if (needj) {
ACQUIRE_LOCK(&lk);
- freeblks->fb_freecnt += fs_pendingblocks;
freework->fw_off = i;
freework->fw_ref += freedeps;
freework->fw_ref -= NINDIR(fs) + 1;
@@ -7724,12 +7753,10 @@ indir_trunc(freework, dbn, lbn)
/*
* If we're not journaling we can free the indirect now.
*/
- fs_pendingblocks += nblocks;
dbn = dbtofsb(fs, dbn);
ffs_blkfree(ump, fs, freeblks->fb_devvp, dbn, fs->fs_bsize,
freeblks->fb_inum, freeblks->fb_vtype, NULL);
/* Non SUJ softdep does single-threaded truncations. */
- freeblks->fb_freecnt += fs_pendingblocks;
if (freework->fw_blkno == dbn) {
freework->fw_state |= ALLCOMPLETE;
ACQUIRE_LOCK(&lk);
@@ -8901,7 +8928,7 @@ softdep_setup_sbupdate(ump, fs, bp)
struct sbdep *sbdep;
struct worklist *wk;
- if ((fs->fs_flags & FS_SUJ) == 0)
+ if ((ump->um_mountp->mnt_kern_flag & MNTK_SUJ) == 0)
return;
LIST_FOREACH(wk, &bp->b_dep, wk_list)
if (wk->wk_type == D_SBDEP)
@@ -12082,6 +12109,7 @@ top:
case D_FREEWORK:
case D_FREEDEP:
+ case D_JSEGDEP:
continue;
default:
@@ -12510,33 +12538,36 @@ softdep_request_cleanup(fs, vp, cred, resource)
int error;
mp = vp->v_mount;
- ump = VTOI(vp)->i_ump;
+ ump = VFSTOUFS(mp);
mtx_assert(UFS_MTX(ump), MA_OWNED);
if (resource == FLUSH_BLOCKS_WAIT)
stat_cleanup_blkrequests += 1;
else
stat_cleanup_inorequests += 1;
+
/*
* If we are being called because of a process doing a
- * copy-on-write, then it is not safe to update the vnode
- * as we may recurse into the copy-on-write routine.
+ * copy-on-write, then it is not safe to process any
+ * worklist items as we will recurse into the copyonwrite
+ * routine. This will result in an incoherent snapshot.
*/
- if (!(curthread->td_pflags & TDP_COWINPROGRESS)) {
- UFS_UNLOCK(ump);
- error = ffs_update(vp, 1);
+ if (curthread->td_pflags & TDP_COWINPROGRESS)
+ return (0);
+ UFS_UNLOCK(ump);
+ error = ffs_update(vp, 1);
+ if (error != 0) {
UFS_LOCK(ump);
- if (error != 0)
- return (0);
+ return (0);
}
/*
* If we are in need of resources, consider pausing for
* tickdelay to give ourselves some breathing room.
*/
- UFS_UNLOCK(ump);
ACQUIRE_LOCK(&lk);
+ process_removes(vp);
+ process_truncates(vp);
request_cleanup(UFSTOVFS(ump), resource);
FREE_LOCK(&lk);
- UFS_LOCK(ump);
/*
* Now clean up at least as many resources as we will need.
*
@@ -12568,29 +12599,23 @@ softdep_request_cleanup(fs, vp, cred, resource)
roundup((fs->fs_dsize * fs->fs_minfree / 100) -
fs->fs_cstotal.cs_nffree, fs->fs_frag));
} else {
+ UFS_LOCK(ump);
printf("softdep_request_cleanup: Unknown resource type %d\n",
resource);
return (0);
}
starttime = time_second;
retry:
- while ((resource == FLUSH_BLOCKS_WAIT && ump->softdep_on_worklist > 0 &&
- fs->fs_cstotal.cs_nbfree <= needed) ||
- (resource == FLUSH_INODES_WAIT && fs->fs_pendinginodes > 0 &&
- fs->fs_cstotal.cs_nifree <= needed)) {
- UFS_UNLOCK(ump);
+ if ((resource == FLUSH_BLOCKS_WAIT && ump->softdep_on_worklist > 0 &&
+ fs->fs_cstotal.cs_nbfree <= needed) ||
+ (resource == FLUSH_INODES_WAIT && fs->fs_pendinginodes > 0 &&
+ fs->fs_cstotal.cs_nifree <= needed)) {
ACQUIRE_LOCK(&lk);
- process_removes(vp);
- process_truncates(vp);
if (ump->softdep_on_worklist > 0 &&
- process_worklist_item(UFSTOVFS(ump), 1, LK_NOWAIT) != 0) {
+ process_worklist_item(UFSTOVFS(ump),
+ ump->softdep_on_worklist, LK_NOWAIT) != 0)
stat_worklist_push += 1;
- FREE_LOCK(&lk);
- UFS_LOCK(ump);
- continue;
- }
FREE_LOCK(&lk);
- UFS_LOCK(ump);
}
/*
* If we still need resources and there are no more worklist
@@ -12604,7 +12629,6 @@ retry:
fs->fs_cstotal.cs_nbfree <= needed) ||
(resource == FLUSH_INODES_WAIT && fs->fs_pendinginodes > 0 &&
fs->fs_cstotal.cs_nifree <= needed)) {
- UFS_UNLOCK(ump);
MNT_ILOCK(mp);
MNT_VNODE_FOREACH(lvp, mp, mvp) {
VI_LOCK(lvp);
@@ -12633,7 +12657,6 @@ retry:
VOP_FSYNC(lvp, MNT_NOWAIT, curthread);
VOP_UNLOCK(lvp, 0);
}
- UFS_LOCK(ump);
if (ump->softdep_on_worklist > 0) {
stat_cleanup_retries += 1;
goto retry;
@@ -12642,6 +12665,7 @@ retry:
}
if (time_second - starttime > stat_cleanup_high_delay)
stat_cleanup_high_delay = time_second - starttime;
+ UFS_LOCK(ump);
return (1);
}
diff --git a/sys/ufs/ffs/ffs_vfsops.c b/sys/ufs/ffs/ffs_vfsops.c
index b0f2d7e..35852bf 100644
--- a/sys/ufs/ffs/ffs_vfsops.c
+++ b/sys/ufs/ffs/ffs_vfsops.c
@@ -132,8 +132,8 @@ static struct buf_ops ffs_ops = {
*/
static const char *ffs_opts[] = { "acls", "async", "noatime", "noclusterr",
"noclusterw", "noexec", "export", "force", "from", "groupquota",
- "multilabel", "nfsv4acls", "snapshot", "nosuid", "suiddir", "nosymfollow",
- "sync", "union", "userquota", NULL };
+ "multilabel", "nfsv4acls", "fsckpid", "snapshot", "nosuid", "suiddir",
+ "nosymfollow", "sync", "union", "userquota", NULL };
static int
ffs_mount(struct mount *mp)
@@ -142,6 +142,7 @@ ffs_mount(struct mount *mp)
struct thread *td;
struct ufsmount *ump = 0;
struct fs *fs;
+ pid_t fsckpid = 0;
int error, flags;
u_int mntorflags;
accmode_t accmode;
@@ -184,6 +185,29 @@ ffs_mount(struct mount *mp)
vfs_deleteopt(mp->mnt_opt, "snapshot");
}
+ if (vfs_getopt(mp->mnt_optnew, "fsckpid", NULL, NULL) == 0 &&
+ vfs_scanopt(mp->mnt_optnew, "fsckpid", "%d", &fsckpid) == 1) {
+ /*
+ * Once we have set the restricted PID, do not
+ * persist "fsckpid" in the options list.
+ */
+ vfs_deleteopt(mp->mnt_optnew, "fsckpid");
+ vfs_deleteopt(mp->mnt_opt, "fsckpid");
+ if (mp->mnt_flag & MNT_UPDATE) {
+ if (VFSTOUFS(mp)->um_fs->fs_ronly == 0 &&
+ vfs_flagopt(mp->mnt_optnew, "ro", NULL, 0) == 0) {
+ printf("Checker enable: Must be read-only\n");
+ return (EINVAL);
+ }
+ } else if (vfs_flagopt(mp->mnt_optnew, "ro", NULL, 0) == 0) {
+ printf("Checker enable: Must be read-only\n");
+ return (EINVAL);
+ }
+ /* Set to -1 if we are done */
+ if (fsckpid == 0)
+ fsckpid = -1;
+ }
+
if (vfs_getopt(mp->mnt_optnew, "nfsv4acls", NULL, NULL) == 0) {
if (mntorflags & MNT_ACLS) {
printf("WARNING: \"acls\" and \"nfsv4acls\" "
@@ -204,6 +228,20 @@ ffs_mount(struct mount *mp)
ump = VFSTOUFS(mp);
fs = ump->um_fs;
devvp = ump->um_devvp;
+ if (fsckpid == -1 && ump->um_fsckpid > 0) {
+ if ((error = ffs_flushfiles(mp, WRITECLOSE, td)) != 0 ||
+ (error = ffs_sbupdate(ump, MNT_WAIT, 0)) != 0)
+ return (error);
+ DROP_GIANT();
+ g_topology_lock();
+ /*
+ * Return to normal read-only mode.
+ */
+ error = g_access(ump->um_cp, 0, -1, 0);
+ g_topology_unlock();
+ PICKUP_GIANT();
+ ump->um_fsckpid = 0;
+ }
if (fs->fs_ronly == 0 &&
vfs_flagopt(mp->mnt_optnew, "ro", NULL, 0)) {
/*
@@ -273,7 +311,10 @@ ffs_mount(struct mount *mp)
softdep_unmount(mp);
DROP_GIANT();
g_topology_lock();
- g_access(ump->um_cp, 0, -1, 0);
+ /*
+ * Drop our write and exclusive access.
+ */
+ g_access(ump->um_cp, 0, -1, -1);
g_topology_unlock();
PICKUP_GIANT();
fs->fs_ronly = 1;
@@ -292,6 +333,13 @@ ffs_mount(struct mount *mp)
if (fs->fs_ronly &&
!vfs_flagopt(mp->mnt_optnew, "ro", NULL, 0)) {
/*
+ * If we are running a checker, do not allow upgrade.
+ */
+ if (ump->um_fsckpid > 0) {
+ printf("Active checker, cannot rw upgrade\n");
+ return (EINVAL);
+ }
+ /*
* If upgrade to read-write by non-root, then verify
* that user has necessary permissions on the device.
*/
@@ -327,13 +375,9 @@ ffs_mount(struct mount *mp)
DROP_GIANT();
g_topology_lock();
/*
- * If we're the root device, we may not have an E count
- * yet, get it now.
+ * Request exclusive write access.
*/
- if (ump->um_cp->ace == 0)
- error = g_access(ump->um_cp, 0, 1, 1);
- else
- error = g_access(ump->um_cp, 0, 1, 0);
+ error = g_access(ump->um_cp, 0, 1, 1);
g_topology_unlock();
PICKUP_GIANT();
if (error)
@@ -389,6 +433,39 @@ ffs_mount(struct mount *mp)
mp->mnt_flag |= MNT_NFS4ACLS;
MNT_IUNLOCK(mp);
}
+ /*
+ * If this is a request from fsck to clean up the filesystem,
+ * then allow the specified pid to proceed.
+ */
+ if (fsckpid > 0) {
+ if (ump->um_fsckpid != 0) {
+ printf("Active checker already running on %s\n",
+ fs->fs_fsmnt);
+ return (EINVAL);
+ }
+ KASSERT((mp->mnt_flag & MNT_SOFTDEP) == 0,
+ ("soft updates enabled on read-only file system"));
+ DROP_GIANT();
+ g_topology_lock();
+ /*
+ * Request write access.
+ */
+ error = g_access(ump->um_cp, 0, 1, 0);
+ g_topology_unlock();
+ PICKUP_GIANT();
+ if (error) {
+ printf("Checker activation failed on %s\n",
+ fs->fs_fsmnt);
+ return (error);
+ }
+ ump->um_fsckpid = fsckpid;
+ if (fs->fs_snapinum[0] != 0)
+ ffs_snapshot_mount(mp);
+ fs->fs_mtime = time_second;
+ fs->fs_fmod = 1;
+ fs->fs_clean = 0;
+ (void) ffs_sbupdate(ump, MNT_WAIT, 0);
+ }
/*
* If this is a snapshot request, take the snapshot.
@@ -452,6 +529,31 @@ ffs_mount(struct mount *mp)
vrele(devvp);
return (error);
}
+ if (fsckpid > 0) {
+ KASSERT((mp->mnt_flag & MNT_SOFTDEP) == 0,
+ ("soft updates enabled on read-only file system"));
+ ump = VFSTOUFS(mp);
+ fs = ump->um_fs;
+ DROP_GIANT();
+ g_topology_lock();
+ /*
+ * Request write access.
+ */
+ error = g_access(ump->um_cp, 0, 1, 0);
+ g_topology_unlock();
+ PICKUP_GIANT();
+ if (error) {
+ printf("Checker activation failed on %s\n",
+ fs->fs_fsmnt);
+ } else {
+ ump->um_fsckpid = fsckpid;
+ if (fs->fs_snapinum[0] != 0)
+ ffs_snapshot_mount(mp);
+ fs->fs_mtime = time_second;
+ fs->fs_clean = 0;
+ (void) ffs_sbupdate(ump, MNT_WAIT, 0);
+ }
+ }
}
vfs_mountedfrom(mp, fspec);
return (0);
@@ -665,13 +767,6 @@ ffs_mountfs(devvp, mp, td)
DROP_GIANT();
g_topology_lock();
error = g_vfs_open(devvp, &cp, "ffs", ronly ? 0 : 1);
-
- /*
- * If we are a root mount, drop the E flag so fsck can do its magic.
- * We will pick it up again when we remount R/W.
- */
- if (error == 0 && ronly && (mp->mnt_flag & MNT_ROOTFS))
- error = g_access(cp, 0, 0, -1);
g_topology_unlock();
PICKUP_GIANT();
VOP_UNLOCK(devvp, 0);
@@ -932,7 +1027,7 @@ ffs_mountfs(devvp, mp, td)
strlcpy(fs->fs_fsmnt, mp->mnt_stat.f_mntonname, MAXMNTLEN);
mp->mnt_stat.f_iosize = fs->fs_bsize;
- if( mp->mnt_flag & MNT_ROOTFS) {
+ if (mp->mnt_flag & MNT_ROOTFS) {
/*
* Root mount; update timestamp in mount structure.
* this will be used by the common root mount code
@@ -1169,7 +1264,7 @@ ffs_unmount(mp, mntflags)
}
UFS_UNLOCK(ump);
softdep_unmount(mp);
- if (fs->fs_ronly == 0) {
+ if (fs->fs_ronly == 0 || ump->um_fsckpid > 0) {
fs->fs_clean = fs->fs_flags & (FS_UNCLEAN|FS_NEEDSFSCK) ? 0 : 1;
error = ffs_sbupdate(ump, MNT_WAIT, 0);
if (error && error != ENXIO) {
@@ -1183,6 +1278,13 @@ ffs_unmount(mp, mntflags)
}
DROP_GIANT();
g_topology_lock();
+ if (ump->um_fsckpid > 0) {
+ /*
+ * Return to normal read-only mode.
+ */
+ error = g_access(ump->um_cp, 0, -1, 0);
+ ump->um_fsckpid = 0;
+ }
g_vfs_close(ump->um_cp);
g_topology_unlock();
PICKUP_GIANT();
@@ -1331,7 +1433,7 @@ ffs_sync(mp, waitfor)
td = curthread;
fs = ump->um_fs;
- if (fs->fs_fmod != 0 && fs->fs_ronly != 0) { /* XXX */
+ if (fs->fs_fmod != 0 && fs->fs_ronly != 0 && ump->um_fsckpid == 0) {
printf("fs = %s\n", fs->fs_fsmnt);
panic("ffs_sync: rofs mod");
}
@@ -1689,12 +1791,12 @@ ffs_uninit(vfsp)
* Write a superblock and associated information back to disk.
*/
int
-ffs_sbupdate(mp, waitfor, suspended)
- struct ufsmount *mp;
+ffs_sbupdate(ump, waitfor, suspended)
+ struct ufsmount *ump;
int waitfor;
int suspended;
{
- struct fs *fs = mp->um_fs;
+ struct fs *fs = ump->um_fs;
struct buf *sbbp;
struct buf *bp;
int blks;
@@ -1702,14 +1804,14 @@ ffs_sbupdate(mp, waitfor, suspended)
int i, size, error, allerror = 0;
if (fs->fs_ronly == 1 &&
- (mp->um_mountp->mnt_flag & (MNT_RDONLY | MNT_UPDATE)) !=
- (MNT_RDONLY | MNT_UPDATE))
+ (ump->um_mountp->mnt_flag & (MNT_RDONLY | MNT_UPDATE)) !=
+ (MNT_RDONLY | MNT_UPDATE) && ump->um_fsckpid == 0)
panic("ffs_sbupdate: write read-only filesystem");
/*
* We use the superblock's buf to serialize calls to ffs_sbupdate().
*/
- sbbp = getblk(mp->um_devvp, btodb(fs->fs_sblockloc), (int)fs->fs_sbsize,
- 0, 0, 0);
+ sbbp = getblk(ump->um_devvp, btodb(fs->fs_sblockloc),
+ (int)fs->fs_sbsize, 0, 0, 0);
/*
* First write back the summary information.
*/
@@ -1719,7 +1821,7 @@ ffs_sbupdate(mp, waitfor, suspended)
size = fs->fs_bsize;
if (i + fs->fs_frag > blks)
size = (blks - i) * fs->fs_fsize;
- bp = getblk(mp->um_devvp, fsbtodb(fs, fs->fs_csaddr + i),
+ bp = getblk(ump->um_devvp, fsbtodb(fs, fs->fs_csaddr + i),
size, 0, 0, 0);
bcopy(space, bp->b_data, (u_int)size);
space = (char *)space + size;
@@ -1755,9 +1857,9 @@ ffs_sbupdate(mp, waitfor, suspended)
fs->fs_fmod = 0;
fs->fs_time = time_second;
if (fs->fs_flags & FS_DOSOFTDEP)
- softdep_setup_sbupdate(mp, (struct fs *)bp->b_data, bp);
+ softdep_setup_sbupdate(ump, (struct fs *)bp->b_data, bp);
bcopy((caddr_t)fs, bp->b_data, (u_int)fs->fs_sbsize);
- ffs_oldfscompat_write((struct fs *)bp->b_data, mp);
+ ffs_oldfscompat_write((struct fs *)bp->b_data, ump);
if (suspended)
bp->b_flags |= B_VALIDSUSPWRT;
if (waitfor != MNT_WAIT)
diff --git a/sys/ufs/ffs/fs.h b/sys/ufs/ffs/fs.h
index a0b8e5b..b1e2174 100644
--- a/sys/ufs/ffs/fs.h
+++ b/sys/ufs/ffs/fs.h
@@ -214,7 +214,9 @@
#define FFS_SET_CWD 12 /* set current directory */
#define FFS_SET_DOTDOT 13 /* set inode number for ".." */
#define FFS_UNLINK 14 /* remove a name in the filesystem */
-#define FFS_MAXID 15 /* number of valid ffs ids */
+#define FFS_SET_INODE 15 /* update an on-disk inode */
+#define FFS_SET_BUFOUTPUT 16 /* set buffered writing on descriptor */
+#define FFS_MAXID 16 /* number of valid ffs ids */
/*
* Command structure passed in to the filesystem to adjust filesystem values.
diff --git a/sys/ufs/ffs/softdep.h b/sys/ufs/ffs/softdep.h
index 80c7315..b251ba8 100644
--- a/sys/ufs/ffs/softdep.h
+++ b/sys/ufs/ffs/softdep.h
@@ -536,8 +536,7 @@ struct freeblks {
#endif
uint64_t fb_modrev; /* Inode revision at start of trunc. */
off_t fb_len; /* Length we're truncating to. */
- ufs2_daddr_t fb_chkcnt; /* Expected blks released. */
- ufs2_daddr_t fb_freecnt; /* Actual blocks released. */
+ ufs2_daddr_t fb_chkcnt; /* Blocks released. */
ino_t fb_inum; /* inode owner of blocks */
enum vtype fb_vtype; /* inode owner's file type */
uid_t fb_uid; /* uid of previous owner of blocks */
diff --git a/sys/ufs/ufs/ufs_inode.c b/sys/ufs/ufs/ufs_inode.c
index 7ddbe97..129c26d 100644
--- a/sys/ufs/ufs/ufs_inode.c
+++ b/sys/ufs/ufs/ufs_inode.c
@@ -120,15 +120,14 @@ ufs_inactive(ap)
isize = ip->i_size;
if (ip->i_ump->um_fstype == UFS2)
isize += ip->i_din2->di_extsize;
- if (ip->i_effnlink <= 0 && isize && !UFS_RDONLY(ip)) {
+ if (ip->i_effnlink <= 0 && isize && !UFS_RDONLY(ip))
+ error = UFS_TRUNCATE(vp, (off_t)0, IO_EXT | IO_NORMAL,
+ NOCRED, td);
+ if (ip->i_nlink <= 0 && ip->i_mode && !UFS_RDONLY(ip)) {
#ifdef QUOTA
if (!getinoquota(ip))
(void)chkiq(ip, -1, NOCRED, FORCE);
#endif
- error = UFS_TRUNCATE(vp, (off_t)0, IO_EXT | IO_NORMAL,
- NOCRED, td);
- }
- if (ip->i_nlink <= 0 && ip->i_mode && !UFS_RDONLY(ip)) {
#ifdef UFS_EXTATTR
ufs_extattr_vnode_inactive(vp, td);
#endif
diff --git a/sys/ufs/ufs/ufsmount.h b/sys/ufs/ufs/ufsmount.h
index 7874105..6447dce 100644
--- a/sys/ufs/ufs/ufsmount.h
+++ b/sys/ufs/ufs/ufsmount.h
@@ -77,6 +77,7 @@ struct ufsmount {
u_long um_bptrtodb; /* indir ptr to disk block */
u_long um_seqinc; /* inc between seq blocks */
struct mtx um_lock; /* Protects ufsmount & fs */
+ pid_t um_fsckpid; /* PID permitted fsck sysctls */
long um_numindirdeps; /* outstanding indirdeps */
struct workhead softdep_workitem_pending; /* softdep work queue */
struct worklist *softdep_worklist_tail; /* Tail pointer for above */
diff --git a/sys/vm/device_pager.c b/sys/vm/device_pager.c
index f2131dd..411482a 100644
--- a/sys/vm/device_pager.c
+++ b/sys/vm/device_pager.c
@@ -217,8 +217,10 @@ dev_pager_getpages(object, m, count, reqpage)
memattr = object->memattr;
VM_OBJECT_UNLOCK(object);
csw = dev_refthread(dev, &ref);
- if (csw == NULL)
- panic("dev_pager_getpage: no cdevsw");
+ if (csw == NULL) {
+ VM_OBJECT_LOCK(object);
+ return (VM_PAGER_FAIL);
+ }
td = curthread;
fpop = td->td_fpop;
td->td_fpop = NULL;
diff --git a/sys/vm/swap_pager.c b/sys/vm/swap_pager.c
index 2868a2f..f421e4f 100644
--- a/sys/vm/swap_pager.c
+++ b/sys/vm/swap_pager.c
@@ -193,11 +193,13 @@ swap_reserve_by_cred(vm_ooffset_t incr, struct ucred *cred)
if (incr & PAGE_MASK)
panic("swap_reserve: & PAGE_MASK");
+#ifdef RACCT
PROC_LOCK(curproc);
error = racct_add(curproc, RACCT_SWAP, incr);
PROC_UNLOCK(curproc);
if (error != 0)
return (0);
+#endif
res = 0;
mtx_lock(&sw_dev_mtx);
@@ -237,11 +239,13 @@ swap_reserve_by_cred(vm_ooffset_t incr, struct ucred *cred)
curproc->p_pid, uip->ui_uid, incr);
}
+#ifdef RACCT
if (!res) {
PROC_LOCK(curproc);
racct_sub(curproc, RACCT_SWAP, incr);
PROC_UNLOCK(curproc);
}
+#endif
return (res);
}
@@ -255,9 +259,11 @@ swap_reserve_force(vm_ooffset_t incr)
swap_reserved += incr;
mtx_unlock(&sw_dev_mtx);
+#ifdef RACCT
PROC_LOCK(curproc);
racct_add_force(curproc, RACCT_SWAP, incr);
PROC_UNLOCK(curproc);
+#endif
uip = curthread->td_ucred->cr_ruidinfo;
PROC_LOCK(curproc);
diff --git a/sys/vm/vm_extern.h b/sys/vm/vm_extern.h
index ae8e578..72f0254 100644
--- a/sys/vm/vm_extern.h
+++ b/sys/vm/vm_extern.h
@@ -61,6 +61,8 @@ int useracc(void *, int, int);
int vm_fault(vm_map_t, vm_offset_t, vm_prot_t, int);
void vm_fault_copy_entry(vm_map_t, vm_map_t, vm_map_entry_t, vm_map_entry_t,
vm_ooffset_t *);
+int vm_fault_disable_pagefaults(void);
+void vm_fault_enable_pagefaults(int save);
int vm_fault_hold(vm_map_t map, vm_offset_t vaddr, vm_prot_t fault_type,
int fault_flags, vm_page_t *m_hold);
int vm_fault_quick_hold_pages(vm_map_t map, vm_offset_t addr, vm_size_t len,
@@ -70,6 +72,7 @@ int vm_fault_wire(vm_map_t, vm_offset_t, vm_offset_t, boolean_t);
int vm_forkproc(struct thread *, struct proc *, struct thread *, struct vmspace *, int);
void vm_waitproc(struct proc *);
int vm_mmap(vm_map_t, vm_offset_t *, vm_size_t, vm_prot_t, vm_prot_t, int, objtype_t, void *, vm_ooffset_t);
+int vm_mmap_to_errno(int rv);
void vm_set_page_size(void);
void vm_sync_icache(vm_map_t, vm_offset_t, vm_size_t);
struct vmspace *vmspace_alloc(vm_offset_t, vm_offset_t);
diff --git a/sys/vm/vm_fault.c b/sys/vm/vm_fault.c
index 55abe86..eeb10a4 100644
--- a/sys/vm/vm_fault.c
+++ b/sys/vm/vm_fault.c
@@ -209,6 +209,8 @@ vm_fault(vm_map_t map, vm_offset_t vaddr, vm_prot_t fault_type,
int fault_flags)
{
+ if ((curthread->td_pflags & TDP_NOFAULTING) != 0)
+ return (KERN_PROTECTION_FAILURE);
return (vm_fault_hold(map, vaddr, fault_type, fault_flags, NULL));
}
@@ -1475,3 +1477,17 @@ vm_fault_additional_pages(m, rbehind, rahead, marray, reqpage)
/* return number of pages */
return i;
}
+
+int
+vm_fault_disable_pagefaults(void)
+{
+
+ return (curthread_pflags_set(TDP_NOFAULTING));
+}
+
+void
+vm_fault_enable_pagefaults(int save)
+{
+
+ curthread_pflags_restore(save);
+}
diff --git a/sys/vm/vm_glue.c b/sys/vm/vm_glue.c
index da9b1dc..c552cb7 100644
--- a/sys/vm/vm_glue.c
+++ b/sys/vm/vm_glue.c
@@ -222,12 +222,14 @@ vslock(void *addr, size_t len)
#endif
error = vm_map_wire(&curproc->p_vmspace->vm_map, start, end,
VM_MAP_WIRE_SYSTEM | VM_MAP_WIRE_NOHOLES);
+#ifdef RACCT
if (error != KERN_SUCCESS) {
PROC_LOCK(curproc);
racct_set(curproc, RACCT_MEMLOCK,
ptoa(pmap_wired_count(vm_map_pmap(&curproc->p_vmspace->vm_map))));
PROC_UNLOCK(curproc);
}
+#endif
/*
* Return EFAULT on error to match copy{in,out}() behaviour
* rather than returning ENOMEM like mlock() would.
@@ -244,10 +246,12 @@ vsunlock(void *addr, size_t len)
trunc_page((vm_offset_t)addr), round_page((vm_offset_t)addr + len),
VM_MAP_WIRE_SYSTEM | VM_MAP_WIRE_NOHOLES);
+#ifdef RACCT
PROC_LOCK(curproc);
racct_set(curproc, RACCT_MEMLOCK,
ptoa(pmap_wired_count(vm_map_pmap(&curproc->p_vmspace->vm_map))));
PROC_UNLOCK(curproc);
+#endif
}
/*
diff --git a/sys/vm/vm_map.c b/sys/vm/vm_map.c
index 31886af..8493478 100644
--- a/sys/vm/vm_map.c
+++ b/sys/vm/vm_map.c
@@ -318,6 +318,7 @@ static void
vmspace_container_reset(struct proc *p)
{
+#ifdef RACCT
PROC_LOCK(p);
racct_set(p, RACCT_DATA, 0);
racct_set(p, RACCT_STACK, 0);
@@ -325,6 +326,7 @@ vmspace_container_reset(struct proc *p)
racct_set(p, RACCT_MEMLOCK, 0);
racct_set(p, RACCT_VMEM, 0);
PROC_UNLOCK(p);
+#endif
}
static inline void
@@ -3305,7 +3307,9 @@ vm_map_growstack(struct proc *p, vm_offset_t addr)
#ifdef notyet
uint64_t limit;
#endif
+#ifdef RACCT
int error;
+#endif
Retry:
PROC_LOCK(p);
@@ -3404,6 +3408,7 @@ Retry:
vm_map_unlock_read(map);
return (KERN_NO_SPACE);
}
+#ifdef RACCT
PROC_LOCK(p);
if (is_procstack &&
racct_set(p, RACCT_STACK, ctob(vm->vm_ssize) + grow_amount)) {
@@ -3412,6 +3417,7 @@ Retry:
return (KERN_NO_SPACE);
}
PROC_UNLOCK(p);
+#endif
/* Round up the grow amount modulo SGROWSIZ */
grow_amount = roundup (grow_amount, sgrowsiz);
@@ -3435,6 +3441,7 @@ Retry:
rv = KERN_NO_SPACE;
goto out;
}
+#ifdef RACCT
PROC_LOCK(p);
if (racct_set(p, RACCT_VMEM, map->size + grow_amount)) {
PROC_UNLOCK(p);
@@ -3443,6 +3450,7 @@ Retry:
goto out;
}
PROC_UNLOCK(p);
+#endif
if (vm_map_lock_upgrade(map))
goto Retry;
@@ -3542,6 +3550,7 @@ Retry:
}
out:
+#ifdef RACCT
if (rv != KERN_SUCCESS) {
PROC_LOCK(p);
error = racct_set(p, RACCT_VMEM, map->size);
@@ -3550,6 +3559,7 @@ out:
KASSERT(error == 0, ("decreasing RACCT_STACK failed"));
PROC_UNLOCK(p);
}
+#endif
return (rv);
}
diff --git a/sys/vm/vm_mmap.c b/sys/vm/vm_mmap.c
index 37949a5..c78571d 100644
--- a/sys/vm/vm_mmap.c
+++ b/sys/vm/vm_mmap.c
@@ -1019,19 +1019,23 @@ mlock(td, uap)
PROC_UNLOCK(proc);
if (npages + cnt.v_wire_count > vm_page_max_wired)
return (EAGAIN);
+#ifdef RACCT
PROC_LOCK(proc);
error = racct_set(proc, RACCT_MEMLOCK, nsize);
PROC_UNLOCK(proc);
if (error != 0)
return (ENOMEM);
+#endif
error = vm_map_wire(&proc->p_vmspace->vm_map, start, end,
VM_MAP_WIRE_USER | VM_MAP_WIRE_NOHOLES);
+#ifdef RACCT
if (error != KERN_SUCCESS) {
PROC_LOCK(proc);
racct_set(proc, RACCT_MEMLOCK,
ptoa(pmap_wired_count(vm_map_pmap(&proc->p_vmspace->vm_map))));
PROC_UNLOCK(proc);
}
+#endif
return (error == KERN_SUCCESS ? 0 : ENOMEM);
}
@@ -1074,11 +1078,13 @@ mlockall(td, uap)
if (error)
return (error);
#endif
+#ifdef RACCT
PROC_LOCK(td->td_proc);
error = racct_set(td->td_proc, RACCT_MEMLOCK, map->size);
PROC_UNLOCK(td->td_proc);
if (error != 0)
return (ENOMEM);
+#endif
if (uap->how & MCL_FUTURE) {
vm_map_lock(map);
@@ -1098,12 +1104,14 @@ mlockall(td, uap)
VM_MAP_WIRE_USER|VM_MAP_WIRE_HOLESOK);
error = (error == KERN_SUCCESS ? 0 : EAGAIN);
}
+#ifdef RACCT
if (error != KERN_SUCCESS) {
PROC_LOCK(td->td_proc);
racct_set(td->td_proc, RACCT_MEMLOCK,
ptoa(pmap_wired_count(vm_map_pmap(&td->td_proc->p_vmspace->vm_map))));
PROC_UNLOCK(td->td_proc);
}
+#endif
return (error);
}
@@ -1138,11 +1146,13 @@ munlockall(td, uap)
/* Forcibly unwire all pages. */
error = vm_map_unwire(map, vm_map_min(map), vm_map_max(map),
VM_MAP_WIRE_USER|VM_MAP_WIRE_HOLESOK);
+#ifdef RACCT
if (error == KERN_SUCCESS) {
PROC_LOCK(td->td_proc);
racct_set(td->td_proc, RACCT_MEMLOCK, 0);
PROC_UNLOCK(td->td_proc);
}
+#endif
return (error);
}
@@ -1177,11 +1187,13 @@ munlock(td, uap)
return (EINVAL);
error = vm_map_unwire(&td->td_proc->p_vmspace->vm_map, start, end,
VM_MAP_WIRE_USER | VM_MAP_WIRE_NOHOLES);
+#ifdef RACCT
if (error == KERN_SUCCESS) {
PROC_LOCK(td->td_proc);
racct_sub(td->td_proc, RACCT_MEMLOCK, ptoa(end - start));
PROC_UNLOCK(td->td_proc);
}
+#endif
return (error == KERN_SUCCESS ? 0 : ENOMEM);
}
@@ -1412,7 +1424,7 @@ vm_mmap(vm_map_t map, vm_offset_t *addr, vm_size_t size, vm_prot_t prot,
if (td->td_proc->p_vmspace->vm_map.size + size >
lim_cur(td->td_proc, RLIMIT_VMEM)) {
PROC_UNLOCK(td->td_proc);
- return(ENOMEM);
+ return (ENOMEM);
}
if (racct_set(td->td_proc, RACCT_VMEM,
td->td_proc->p_vmspace->vm_map.size + size)) {
@@ -1523,6 +1535,13 @@ vm_mmap(vm_map_t map, vm_offset_t *addr, vm_size_t size, vm_prot_t prot,
vm_map_wire(map, *addr, *addr + size,
VM_MAP_WIRE_USER|VM_MAP_WIRE_NOHOLES);
+ return (vm_mmap_to_errno(rv));
+}
+
+int
+vm_mmap_to_errno(int rv)
+{
+
switch (rv) {
case KERN_SUCCESS:
return (0);
diff --git a/sys/vm/vm_pageout.c b/sys/vm/vm_pageout.c
index c2690af..e9c9927 100644
--- a/sys/vm/vm_pageout.c
+++ b/sys/vm/vm_pageout.c
@@ -216,15 +216,21 @@ static void vm_req_vmdaemon(int req);
#endif
static void vm_pageout_page_stats(void);
+/*
+ * Initialize a dummy page for marking the caller's place in the specified
+ * paging queue. In principle, this function only needs to set the flag
+ * PG_MARKER. Nonetheless, it sets the flag VPO_BUSY and initializes the hold
+ * count to one as safety precautions.
+ */
static void
vm_pageout_init_marker(vm_page_t marker, u_short queue)
{
bzero(marker, sizeof(*marker));
- marker->flags = PG_FICTITIOUS | PG_MARKER;
+ marker->flags = PG_MARKER;
marker->oflags = VPO_BUSY;
marker->queue = queue;
- marker->wire_count = 1;
+ marker->hold_count = 1;
}
/*
@@ -1634,7 +1640,9 @@ vm_daemon()
struct thread *td;
struct vmspace *vm;
int breakout, swapout_flags, tryagain, attempts;
+#ifdef RACCT
uint64_t rsize, ravailable;
+#endif
while (TRUE) {
mtx_lock(&vm_daemon_mtx);
@@ -1716,6 +1724,7 @@ again:
vm_pageout_map_deactivate_pages(
&vm->vm_map, limit);
}
+#ifdef RACCT
rsize = IDX_TO_OFF(size);
PROC_LOCK(p);
racct_set(p, RACCT_RSS, rsize);
@@ -1744,6 +1753,7 @@ again:
if (rsize > ravailable)
tryagain = 1;
}
+#endif
vmspace_free(vm);
}
sx_sunlock(&allproc_lock);
diff --git a/sys/vm/vm_unix.c b/sys/vm/vm_unix.c
index c07a1c1..6f8e7c8 100644
--- a/sys/vm/vm_unix.c
+++ b/sys/vm/vm_unix.c
@@ -117,6 +117,7 @@ obreak(td, uap)
error = ENOMEM;
goto done;
}
+#ifdef RACCT
PROC_LOCK(td->td_proc);
error = racct_set(td->td_proc, RACCT_DATA, new - base);
if (error != 0) {
@@ -133,13 +134,16 @@ obreak(td, uap)
goto done;
}
PROC_UNLOCK(td->td_proc);
+#endif
rv = vm_map_insert(&vm->vm_map, NULL, 0, old, new,
VM_PROT_RW, VM_PROT_ALL, 0);
if (rv != KERN_SUCCESS) {
+#ifdef RACCT
PROC_LOCK(td->td_proc);
racct_set_force(td->td_proc, RACCT_DATA, old - base);
racct_set_force(td->td_proc, RACCT_VMEM, vm->vm_map.size);
PROC_UNLOCK(td->td_proc);
+#endif
error = ENOMEM;
goto done;
}
@@ -165,10 +169,12 @@ obreak(td, uap)
goto done;
}
vm->vm_dsize -= btoc(old - new);
+#ifdef RACCT
PROC_LOCK(td->td_proc);
racct_set_force(td->td_proc, RACCT_DATA, new - base);
racct_set_force(td->td_proc, RACCT_VMEM, vm->vm_map.size);
PROC_UNLOCK(td->td_proc);
+#endif
}
done:
vm_map_unlock(&vm->vm_map);
diff --git a/sys/x86/include/mptable.h b/sys/x86/include/mptable.h
index 451d9ce..85a21c9 100644
--- a/sys/x86/include/mptable.h
+++ b/sys/x86/include/mptable.h
@@ -72,6 +72,8 @@ typedef struct MPCTH {
u_char reserved;
} *mpcth_t;
+/* Base table entries */
+
#define MPCT_ENTRY_PROCESSOR 0
#define MPCT_ENTRY_BUS 1
#define MPCT_ENTRY_IOAPIC 2
@@ -132,7 +134,56 @@ typedef struct INTENTRY {
#define INTENTRY_FLAGS_TRIGGER_EDGE 0x4
#define INTENTRY_FLAGS_TRIGGER_LEVEL 0xc
-/* descriptions of MP basetable entries */
+/* Extended table entries */
+
+typedef struct EXTENTRY {
+ u_char type;
+ u_char length;
+} *ext_entry_ptr;
+
+#define MPCT_EXTENTRY_SAS 0x80
+#define MPCT_EXTENTRY_BHD 0x81
+#define MPCT_EXTENTRY_CBASM 0x82
+
+typedef struct SASENTRY {
+ u_char type;
+ u_char length;
+ u_char bus_id;
+ u_char address_type;
+ uint64_t address_base;
+ uint64_t address_length;
+} __attribute__((__packed__)) *sas_entry_ptr;
+
+#define SASENTRY_TYPE_IO 0
+#define SASENTRY_TYPE_MEMORY 1
+#define SASENTRY_TYPE_PREFETCH 2
+
+typedef struct BHDENTRY {
+ u_char type;
+ u_char length;
+ u_char bus_id;
+ u_char bus_info;
+ u_char parent_bus;
+ u_char reserved[3];
+} *bhd_entry_ptr;
+
+#define BHDENTRY_INFO_SUBTRACTIVE_DECODE 0x1
+
+typedef struct CBASMENTRY {
+ u_char type;
+ u_char length;
+ u_char bus_id;
+ u_char address_mod;
+ u_int predefined_range;
+} *cbasm_entry_ptr;
+
+#define CBASMENTRY_ADDRESS_MOD_ADD 0x0
+#define CBASMENTRY_ADDRESS_MOD_SUBTRACT 0x1
+
+#define CBASMENTRY_RANGE_ISA_IO 0
+#define CBASMENTRY_RANGE_VGA_IO 1
+
+/* descriptions of MP table entries */
typedef struct BASETABLE_ENTRY {
u_char type;
u_char length;
@@ -140,6 +191,17 @@ typedef struct BASETABLE_ENTRY {
} basetable_entry;
#ifdef _KERNEL
+struct mptable_hostb_softc {
+#ifdef NEW_PCIB
+ struct pcib_host_resources sc_host_res;
+ int sc_decodes_vga_io;
+ int sc_decodes_isa_io;
+#endif
+};
+
+#ifdef NEW_PCIB
+void mptable_pci_host_res_init(device_t pcib);
+#endif
int mptable_pci_probe_table(int bus);
int mptable_pci_route_interrupt(device_t pcib, device_t dev, int pin);
#endif
diff --git a/sys/x86/x86/mptable.c b/sys/x86/x86/mptable.c
index 4b240a6..fe520eb 100644
--- a/sys/x86/x86/mptable.c
+++ b/sys/x86/x86/mptable.c
@@ -32,22 +32,31 @@ __FBSDID("$FreeBSD$");
#include <sys/systm.h>
#include <sys/bus.h>
#include <sys/kernel.h>
+#include <sys/limits.h>
#include <sys/malloc.h>
+#ifdef NEW_PCIB
+#include <sys/rman.h>
+#endif
#include <vm/vm.h>
#include <vm/vm_param.h>
#include <vm/pmap.h>
+#include <dev/pci/pcivar.h>
+#ifdef NEW_PCIB
+#include <dev/pci/pcib_private.h>
+#endif
#include <x86/apicreg.h>
#include <x86/mptable.h>
#include <machine/frame.h>
#include <machine/intr_machdep.h>
#include <machine/apicvar.h>
#include <machine/md_var.h>
+#ifdef NEW_PCIB
+#include <machine/resource.h>
+#endif
#include <machine/specialreg.h>
-#include <dev/pci/pcivar.h>
-
/* string defined by the Intel MP Spec as identifying the MP table */
#define MP_SIG 0x5f504d5f /* _MP_ */
@@ -67,6 +76,7 @@ __FBSDID("$FreeBSD$");
#define BIOS_COUNT (BIOS_SIZE/4)
typedef void mptable_entry_handler(u_char *entry, void *arg);
+typedef void mptable_extended_entry_handler(ext_entry_ptr entry, void *arg);
static basetable_entry basetable_entry_types[] =
{
@@ -146,6 +156,7 @@ struct pci_route_interrupt_args {
static mpfps_t mpfps;
static mpcth_t mpct;
+static ext_entry_ptr mpet;
static void *ioapics[MAX_APIC_ID + 1];
static bus_datum *busses;
static int mptable_nioapics, mptable_nbusses, mptable_maxbusid;
@@ -181,6 +192,10 @@ static void mptable_probe_cpus_handler(u_char *entry, void *arg __unused);
static void mptable_register(void *dummy);
static int mptable_setup_local(void);
static int mptable_setup_io(void);
+#ifdef NEW_PCIB
+static void mptable_walk_extended_table(
+ mptable_extended_entry_handler *handler, void *arg);
+#endif
static void mptable_walk_table(mptable_entry_handler *handler, void *arg);
static int search_for_sig(u_int32_t target, int count);
@@ -281,6 +296,11 @@ found:
__func__);
return (ENXIO);
}
+ if (mpct->extended_table_length != 0 &&
+ mpct->extended_table_length + mpct->base_table_length +
+ (uintptr_t)mpfps->pap < 1024 * 1024)
+ mpet = (ext_entry_ptr)((char *)mpct +
+ mpct->base_table_length);
if (mpct->signature[0] != 'P' || mpct->signature[1] != 'C' ||
mpct->signature[2] != 'M' || mpct->signature[3] != 'P') {
printf("%s: MP Config Table has bad signature: %c%c%c%c\n",
@@ -393,7 +413,7 @@ SYSINIT(mptable_register, SI_SUB_TUNABLES - 1, SI_ORDER_FIRST, mptable_register,
NULL);
/*
- * Call the handler routine for each entry in the MP config table.
+ * Call the handler routine for each entry in the MP config base table.
*/
static void
mptable_walk_table(mptable_entry_handler *handler, void *arg)
@@ -419,6 +439,27 @@ mptable_walk_table(mptable_entry_handler *handler, void *arg)
}
}
+#ifdef NEW_PCIB
+/*
+ * Call the handler routine for each entry in the MP config extended
+ * table.
+ */
+static void
+mptable_walk_extended_table(mptable_extended_entry_handler *handler, void *arg)
+{
+ ext_entry_ptr end, entry;
+
+ if (mpet == NULL)
+ return;
+ entry = mpet;
+ end = (ext_entry_ptr)((char *)mpet + mpct->extended_table_length);
+ while (entry < end) {
+ handler(entry, arg);
+ entry = (ext_entry_ptr)((char *)entry + entry->length);
+ }
+}
+#endif
+
static void
mptable_probe_cpus_handler(u_char *entry, void *arg)
{
@@ -1053,3 +1094,133 @@ mptable_pci_route_interrupt(device_t pcib, device_t dev, int pin)
'A' + pin, args.vector);
return (args.vector);
}
+
+#ifdef NEW_PCIB
+struct host_res_args {
+ struct mptable_hostb_softc *sc;
+ device_t dev;
+ u_char bus;
+};
+
+/*
+ * Initialize a Host-PCI bridge so it can restrict resource allocation
+ * requests to the resources it actually decodes according to MP
+ * config table extended entries.
+ */
+static void
+mptable_host_res_handler(ext_entry_ptr entry, void *arg)
+{
+ struct host_res_args *args;
+ cbasm_entry_ptr cbasm;
+ sas_entry_ptr sas;
+ const char *name;
+ uint64_t start, end;
+ int error, *flagp, flags, type;
+
+ args = arg;
+ switch (entry->type) {
+ case MPCT_EXTENTRY_SAS:
+ sas = (sas_entry_ptr)entry;
+ if (sas->bus_id != args->bus)
+ break;
+ switch (sas->address_type) {
+ case SASENTRY_TYPE_IO:
+ type = SYS_RES_IOPORT;
+ flags = 0;
+ break;
+ case SASENTRY_TYPE_MEMORY:
+ type = SYS_RES_MEMORY;
+ flags = 0;
+ break;
+ case SASENTRY_TYPE_PREFETCH:
+ type = SYS_RES_MEMORY;
+ flags = RF_PREFETCHABLE;
+ break;
+ default:
+ printf(
+ "MPTable: Unknown systems address space type for bus %u: %d\n",
+ sas->bus_id, sas->address_type);
+ return;
+ }
+ start = sas->address_base;
+ end = sas->address_base + sas->address_length - 1;
+#ifdef __i386__
+ if (start > ULONG_MAX) {
+ device_printf(args->dev,
+ "Ignoring %d range above 4GB (%#jx-%#jx)\n",
+ type, (uintmax_t)start, (uintmax_t)end);
+ break;
+ }
+ if (end > ULONG_MAX) {
+ device_printf(args->dev,
+ "Truncating end of %d range above 4GB (%#jx-%#jx)\n",
+ type, (uintmax_t)start, (uintmax_t)end);
+ end = ULONG_MAX;
+ }
+#endif
+ error = pcib_host_res_decodes(&args->sc->sc_host_res, type,
+ start, end, flags);
+ if (error)
+ panic("Failed to manage %d range (%#jx-%#jx): %d",
+ type, (uintmax_t)start, (uintmax_t)end, error);
+ break;
+ case MPCT_EXTENTRY_CBASM:
+ cbasm = (cbasm_entry_ptr)entry;
+ if (cbasm->bus_id != args->bus)
+ break;
+ switch (cbasm->predefined_range) {
+ case CBASMENTRY_RANGE_ISA_IO:
+ flagp = &args->sc->sc_decodes_isa_io;
+ name = "ISA I/O";
+ break;
+ case CBASMENTRY_RANGE_VGA_IO:
+ flagp = &args->sc->sc_decodes_vga_io;
+ name = "VGA I/O";
+ break;
+ default:
+ printf(
+ "MPTable: Unknown compatiblity address space range for bus %u: %d\n",
+ cbasm->bus_id, cbasm->predefined_range);
+ return;
+ }
+ if (*flagp != 0)
+ printf(
+ "MPTable: Duplicate compatibility %s range for bus %u\n",
+ name, cbasm->bus_id);
+ switch (cbasm->address_mod) {
+ case CBASMENTRY_ADDRESS_MOD_ADD:
+ *flagp = 1;
+ if (bootverbose)
+ device_printf(args->dev, "decoding %s ports\n",
+ name);
+ break;
+ case CBASMENTRY_ADDRESS_MOD_SUBTRACT:
+ *flagp = -1;
+ if (bootverbose)
+ device_printf(args->dev,
+ "not decoding %s ports\n", name);
+ break;
+ default:
+ printf(
+ "MPTable: Unknown compatibility address space modifier: %u\n",
+ cbasm->address_mod);
+ break;
+ }
+ break;
+ }
+}
+
+void
+mptable_pci_host_res_init(device_t pcib)
+{
+ struct host_res_args args;
+
+ KASSERT(pci0 != -1, ("do not know how to map PCI bus IDs"));
+ args.bus = pci_get_bus(pcib) + pci0;
+ args.dev = pcib;
+ args.sc = device_get_softc(pcib);
+ if (pcib_host_res_init(pcib, &args.sc->sc_host_res) != 0)
+ panic("failed to init hostb resources");
+ mptable_walk_extended_table(mptable_host_res_handler, &args);
+}
+#endif
diff --git a/sys/x86/x86/mptable_pci.c b/sys/x86/x86/mptable_pci.c
index 48eec7f..f0b90a8 100644
--- a/sys/x86/x86/mptable_pci.c
+++ b/sys/x86/x86/mptable_pci.c
@@ -69,6 +69,9 @@ static int
mptable_hostb_attach(device_t dev)
{
+#ifdef NEW_PCIB
+ mptable_pci_host_res_init(dev);
+#endif
device_add_child(dev, "pci", pcib_get_bus(dev));
return (bus_generic_attach(dev));
}
@@ -104,6 +107,80 @@ mptable_hostb_map_msi(device_t pcib, device_t dev, int irq, uint64_t *addr,
return (PCIB_MAP_MSI(device_get_parent(bus), dev, irq, addr, data));
}
+#ifdef NEW_PCIB
+static int
+mptable_is_isa_range(u_long start, u_long end)
+{
+
+ if (end >= 0x10000)
+ return (0);
+ if ((start & 0xfc00) != (end & 0xfc00))
+ return (0);
+ start &= ~0xfc00;
+ end &= ~0xfc00;
+ return (start >= 0x100 && end <= 0x3ff);
+}
+
+static int
+mptable_is_vga_range(u_long start, u_long end)
+{
+ if (end >= 0x10000)
+ return (0);
+ if ((start & 0xfc00) != (end & 0xfc00))
+ return (0);
+ start &= ~0xfc00;
+ end &= ~0xfc00;
+ return (pci_is_vga_ioport_range(start, end));
+}
+
+static struct resource *
+mptable_hostb_alloc_resource(device_t dev, device_t child, int type, int *rid,
+ u_long start, u_long end, u_long count, u_int flags)
+{
+ struct mptable_hostb_softc *sc;
+
+ sc = device_get_softc(dev);
+ if (type == SYS_RES_IOPORT && start + count - 1 == end) {
+ if (mptable_is_isa_range(start, end)) {
+ switch (sc->sc_decodes_isa_io) {
+ case -1:
+ return (NULL);
+ case 1:
+ return (bus_generic_alloc_resource(dev, child,
+ type, rid, start, end, count, flags));
+ default:
+ break;
+ }
+ }
+ if (mptable_is_vga_range(start, end)) {
+ switch (sc->sc_decodes_vga_io) {
+ case -1:
+ return (NULL);
+ case 1:
+ return (bus_generic_alloc_resource(dev, child,
+ type, rid, start, end, count, flags));
+ default:
+ break;
+ }
+ }
+ }
+ start = hostb_alloc_start(type, start, end, count);
+ return (pcib_host_res_alloc(&sc->sc_host_res, child, type, rid, start,
+ end, count, flags));
+}
+
+static int
+mptable_hostb_adjust_resource(device_t dev, device_t child, int type,
+ struct resource *r, u_long start, u_long end)
+{
+ struct mptable_hostb_softc *sc;
+
+ sc = device_get_softc(dev);
+ return (pcib_host_res_adjust(&sc->sc_host_res, child, type, r, start,
+ end));
+}
+#endif
+
static device_method_t mptable_hostb_methods[] = {
/* Device interface */
DEVMETHOD(device_probe, mptable_hostb_probe),
@@ -116,8 +193,13 @@ static device_method_t mptable_hostb_methods[] = {
DEVMETHOD(bus_print_child, bus_generic_print_child),
DEVMETHOD(bus_read_ivar, legacy_pcib_read_ivar),
DEVMETHOD(bus_write_ivar, legacy_pcib_write_ivar),
+#ifdef NEW_PCIB
+ DEVMETHOD(bus_alloc_resource, mptable_hostb_alloc_resource),
+ DEVMETHOD(bus_adjust_resource, mptable_hostb_adjust_resource),
+#else
DEVMETHOD(bus_alloc_resource, legacy_pcib_alloc_resource),
DEVMETHOD(bus_adjust_resource, bus_generic_adjust_resource),
+#endif
DEVMETHOD(bus_release_resource, bus_generic_release_resource),
DEVMETHOD(bus_activate_resource, bus_generic_activate_resource),
DEVMETHOD(bus_deactivate_resource, bus_generic_deactivate_resource),
@@ -140,7 +222,8 @@ static device_method_t mptable_hostb_methods[] = {
static devclass_t hostb_devclass;
-DEFINE_CLASS_0(pcib, mptable_hostb_driver, mptable_hostb_methods, 1);
+DEFINE_CLASS_0(pcib, mptable_hostb_driver, mptable_hostb_methods,
+ sizeof(struct mptable_hostb_softc));
DRIVER_MODULE(mptable_pcib, legacy, mptable_hostb_driver, hostb_devclass, 0, 0);
/* PCI to PCI bridge driver. */
diff --git a/sys/x86/x86/tsc.c b/sys/x86/x86/tsc.c
index 5f17f62..0b383bf 100644
--- a/sys/x86/x86/tsc.c
+++ b/sys/x86/x86/tsc.c
@@ -452,6 +452,7 @@ init_TSC_tc(void)
if (cpu_can_deep_sleep && cpu_vendor_id == CPU_VENDOR_INTEL &&
(amd_pminfo & AMDPM_TSC_INVARIANT) == 0) {
tsc_timecounter.tc_quality = -1000;
+ tsc_timecounter.tc_flags |= TC_FLAGS_C3STOP;
if (bootverbose)
printf("TSC timecounter disabled: C3 enabled.\n");
goto init;
diff --git a/tools/regression/bin/sh/parser/alias6.0 b/tools/regression/bin/sh/parser/alias6.0
new file mode 100644
index 0000000..c723d08
--- /dev/null
+++ b/tools/regression/bin/sh/parser/alias6.0
@@ -0,0 +1,6 @@
+# $FreeBSD$
+
+alias alias0='| cat >/dev/null'
+
+eval '{ echo bad; } alias0'
+eval '(echo bad)alias0'
diff --git a/tools/regression/kqueue/config.h b/tools/regression/kqueue/config.h
index 2a377db..a204092 100644
--- a/tools/regression/kqueue/config.h
+++ b/tools/regression/kqueue/config.h
@@ -1,7 +1,7 @@
-/* AUTOMATICALLY GENERATED -- DO NOT EDIT */
/* $FreeBSD$ */
-#define HAVE_ERR_H
-#define HAVE_SYS_EVENT_H
+
+#define HAVE_ERR_H 1
+#define HAVE_SYS_EVENT_H 1
#define HAVE_EV_DISPATCH 1
#define HAVE_EV_RECEIPT 1
#undef HAVE_NOTE_TRUNCATE
diff --git a/tools/regression/kqueue/main.c b/tools/regression/kqueue/main.c
index 182003c..f76c4e2 100644
--- a/tools/regression/kqueue/main.c
+++ b/tools/regression/kqueue/main.c
@@ -18,6 +18,7 @@
#include <sys/types.h>
+#include "config.h"
#include "common.h"
int testnum = 1;
@@ -230,7 +231,7 @@ test_kqueue_close(void)
int
main(int argc, char **argv)
{
- int test_proc = 0; /* XXX-FIXME */
+ int test_proc = 1;
int test_socket = 1;
int test_signal = 1;
int test_vnode = 1;
diff --git a/tools/regression/kqueue/proc.c b/tools/regression/kqueue/proc.c
index d4e863e..6288ee6 100644
--- a/tools/regression/kqueue/proc.c
+++ b/tools/regression/kqueue/proc.c
@@ -16,6 +16,11 @@
* $FreeBSD$
*/
+#include <sys/stat.h>
+
+#include <err.h>
+
+#include "config.h"
#include "common.h"
static int sigusr1_caught = 0;
@@ -37,6 +42,11 @@ add_and_delete(void)
/* Create a child that waits to be killed and then exits */
pid = fork();
if (pid == 0) {
+ struct stat s;
+ if (fstat(kqfd, &s) != -1)
+ errx(1, "kqueue inherited across fork! (%s() at %s:%d)",
+ __func__, __FILE__, __LINE__);
+
pause();
exit(2);
}
@@ -52,6 +62,7 @@ add_and_delete(void)
test_begin("kevent(EVFILT_PROC, EV_DELETE)");
+ sleep(1);
test_no_kevents();
kevent_add(kqfd, &kev, pid, EVFILT_PROC, EV_DELETE, 0, 0, NULL);
if (kill(pid, SIGKILL) < 0)
@@ -63,6 +74,7 @@ add_and_delete(void)
}
+#ifdef TODO
static void
event_trigger(void)
{
@@ -93,7 +105,6 @@ event_trigger(void)
success();
}
-#ifdef TODO
void
test_kevent_signal_disable(void)
{
@@ -225,7 +236,10 @@ test_evfilt_proc()
signal(SIGUSR1, sig_handler);
add_and_delete();
+
+#if TODO
event_trigger();
+#endif
signal(SIGUSR1, SIG_DFL);
diff --git a/tools/regression/lib/libc/gen/Makefile b/tools/regression/lib/libc/gen/Makefile
index a79dc2f..72a0750 100644
--- a/tools/regression/lib/libc/gen/Makefile
+++ b/tools/regression/lib/libc/gen/Makefile
@@ -1,6 +1,6 @@
# $FreeBSD$
-TESTS= test-fmtcheck test-fnmatch test-fpclassify test-wordexp
+TESTS= test-fmtcheck test-fnmatch test-fpclassify test-posix_spawn test-wordexp
.PHONY: tests
tests: ${TESTS}
diff --git a/tools/regression/lib/libc/gen/test-posix_spawn.c b/tools/regression/lib/libc/gen/test-posix_spawn.c
new file mode 100644
index 0000000..f1b8d43
--- /dev/null
+++ b/tools/regression/lib/libc/gen/test-posix_spawn.c
@@ -0,0 +1,90 @@
+/*-
+ * Copyright (c) 2011 Jilles Tjoelker
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+/*
+ * Test program for posix_spawn() and posix_spawnp() as specified by
+ * IEEE Std. 1003.1-2008.
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+#include <sys/wait.h>
+
+#include <assert.h>
+#include <errno.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <spawn.h>
+
+int
+main(int argc, char *argv[])
+{
+ int error, status;
+ pid_t pid, waitres;
+ char *myargs[4];
+ char *myenv[2] = { "answer=42", NULL };
+
+ /* Make sure we have no child processes. */
+ while (waitpid(-1, NULL, 0) != -1)
+ ;
+ assert(errno == ECHILD);
+
+ /* Simple test. */
+ myargs[0] = "sh";
+ myargs[1] = "-c";
+ myargs[2] = "exit $answer";
+ myargs[3] = NULL;
+ error = posix_spawnp(&pid, myargs[0], NULL, NULL, myargs, myenv);
+ assert(error == 0);
+ waitres = waitpid(pid, &status, 0);
+ assert(waitres == pid);
+ assert(WIFEXITED(status) && WEXITSTATUS(status) == 42);
+
+ /*
+ * If the executable does not exist, the function shall either fail
+ * and not create a child process or succeed and create a child
+ * process that exits with status 127.
+ */
+ myargs[0] = "/var/empty/nonexistent";
+ myargs[1] = NULL;
+ error = posix_spawn(&pid, myargs[0], NULL, NULL, myargs, myenv);
+ if (error == 0) {
+ waitres = waitpid(pid, &status, 0);
+ assert(waitres == pid);
+ assert(WIFEXITED(status) && WEXITSTATUS(status) == 127);
+ } else {
+ assert(error == ENOENT);
+ waitres = waitpid(-1, NULL, 0);
+ assert(waitres == -1 && errno == ECHILD);
+ }
+
+ printf("PASS posix_spawn()\n");
+ printf("PASS posix_spawnp()\n");
+
+ return (0);
+}
diff --git a/tools/tools/pciid/mk_pci_vendors.pl b/tools/tools/pciid/mk_pci_vendors.pl
deleted file mode 100644
index 8c46e1a..0000000
--- a/tools/tools/pciid/mk_pci_vendors.pl
+++ /dev/null
@@ -1,263 +0,0 @@
-#!/usr/bin/perl -w
-#
-# Copyright (C) 2001 Sheldon Hearn. All rights reserved.
-#
-# Redistribution and use in source and binary forms, with or without
-# modification, are permitted provided that the following conditions
-# are met:
-# 1. Redistributions of source code must retain the above copyright
-# notice, this list of conditions and the following disclaimer.
-# 2. Redistributions in binary form must reproduce the above copyright
-# notice, this list of conditions and the following disclaimer in the
-# documentation and/or other materials provided with the distribution.
-#
-# THIS SOFTWARE IS PROVIDED BY THE AUTHORS AND CONTRIBUTORS ``AS IS'' AND
-# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE LIABLE
-# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
-# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
-# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
-# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
-# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
-# SUCH DAMAGE.
-#
-# $FreeBSD$
-#
-# usage: mk_pci_vendors [-lq] [-p pcidevs.txt] [-v vendors.txt]
-#
-# Generate src/share/misc/pci_vendors from the Hart and Boemler lists,
-# currently available at:
-#
-# Boemler: http://www.pcidatabase.com/reports.php?type=csv
-# Hart: http://members.datafast.net.au/dft0802/downloads/pcidevs.txt
-#
-# -l Where an entry is found in both input lists, use the entry with
-# the longest description. The default is for the Boemler file to
-# override the Hart file.
-# -q Do not print diagnostics.
-# -p Specify the pathname of the Hart file. (Default ./pcidevs.txt)
-# -v Specify the pathname of the Boemler file. (Default ./vendors.txt)
-#
-use strict;
-use Getopt::Std;
-use Data::Dumper;
-
-my $PROGNAME = 'mk_pci_vendors';
-my $VENDORS_FILE = 'vendors.txt';
-my $PCIDEVS_FILE = 'pcidevs.txt';
-
-my ($cur_vendor, $vendorid, $pciid, $vendor);
-my %opts;
-my %pciids = ();
-my %vendors = ();
-my ($descr, $existing, $id, $line, $rv, $winner, $optlused);
-
-my $IS_VENDOR = 1;
-my $IS_DEVICE = 2;
-my $V_DESCR = 0;
-my $V_DEVSL = 1;
-my $W_FINAL = 0;
-my $W_VENDORS = 1;
-my $W_PCIDEVS = 2;
-
-sub clean_descr($);
-sub vendors_parse($\$\$\$\$);
-sub pcidevs_parse($\$\$);
-
-if (not getopts('lp:qv:', \%opts) or @ARGV > 0) {
- print STDERR "usage: $PROGNAME [-lq] [-p pcidevs.txt] [-v vendors.txt]\n";
- exit 1;
-}
-
-if (not defined($opts{p})) {
- $opts{p} = $PCIDEVS_FILE;
-}
-if (not defined($opts{v})) {
- $opts{v} = $VENDORS_FILE;
-}
-foreach (('l', 'q')) {
- if (not exists($opts{$_})) {
- $opts{$_} = 0;
- } else {
- $opts{$_} = 1;
- }
-}
-
-open(VENDORS, "< $opts{v}") or
- die "$PROGNAME: $opts{v}: $!\n";
-while ($line = <VENDORS>) {
- chomp($line);
- $rv = vendors_parse($line, $vendorid, $pciid, $vendor, $descr);
- if ($rv != 0) {
- if (defined $vendors{$vendorid}
- && $vendors{$vendorid}[$W_VENDORS] ne $vendor) {
- die "$PROGNAME: $vendorid: duplicate vendor ID\n";
- }
- $vendors{$vendorid}[$W_VENDORS] = $vendor;
- $pciids{$vendorid}{$pciid}[$W_VENDORS] = $descr;
- }
-}
-close(VENDORS);
-
-open(PCIDEVS, "< $opts{p}") or
- die "$PROGNAME: $opts{p}: $!\n";
-while ($line = <PCIDEVS>) {
- chomp($line);
- $rv = pcidevs_parse($line, $id, $descr);
- if ($rv == $IS_VENDOR) {
- $vendorid = $id;
- $vendors{$vendorid}[$W_PCIDEVS] = $descr;
- } elsif ($rv == $IS_DEVICE) {
- $pciids{$vendorid}{$id}[$W_PCIDEVS] = $descr;
- }
-}
-close(PCIDEVS);
-
-foreach my $vid (keys(%vendors)) {
- if (!defined $vendors{$vid}[$W_VENDORS]
- && defined $vendors{$vid}[$W_PCIDEVS]) {
- $vendors{$vid}[$W_FINAL] = $vendors{$vid}[$W_PCIDEVS];
- } elsif (defined $vendors{$vid}[$W_VENDORS]
- && !defined $vendors{$vid}[$W_PCIDEVS]) {
- $vendors{$vid}[$W_FINAL] = $vendors{$vid}[$W_VENDORS];
- } elsif (!$opts{l}) {
- $vendors{$vid}[$W_FINAL] = $vendors{$vid}[$W_VENDORS];
- } else {
- if (length($vendors{$vid}[$W_VENDORS]) >
- length($vendors{$vid}[$W_PCIDEVS])) {
- $vendors{$vid}[$W_FINAL] = $vendors{$vid}[$W_VENDORS];
- } else {
- $vendors{$vid}[$W_FINAL] = $vendors{$vid}[$W_PCIDEVS];
- }
- }
-
- foreach my $pciid (keys(%{$pciids{$vid}})) {
- if (!defined $pciids{$vid}{$pciid}[$W_VENDORS]
- && defined $pciids{$vid}{$pciid}[$W_PCIDEVS]) {
- $pciids{$vid}{$pciid}[$W_FINAL] =
- $pciids{$vid}{$pciid}[$W_PCIDEVS];
- } elsif (defined $pciids{$vid}{$pciid}[$W_VENDORS]
- && !defined $pciids{$vid}{$pciid}[$W_PCIDEVS]) {
- $pciids{$vid}{$pciid}[$W_FINAL] =
- $pciids{$vid}{$pciid}[$W_VENDORS];
- } elsif (!$opts{l}) {
- $pciids{$vid}{$pciid}[$W_FINAL] =
- $pciids{$vid}{$pciid}[$W_VENDORS];
- } else {
- if (length($pciids{$vid}{$pciid}[$W_VENDORS]) >
- length($pciids{$vid}{$pciid}[$W_PCIDEVS])) {
- $pciids{$vid}{$pciid}[$W_FINAL] =
- $pciids{$vid}{$pciid}[$W_VENDORS];
- } else {
- $pciids{$vid}{$pciid}[$W_FINAL] =
- $pciids{$vid}{$pciid}[$W_PCIDEVS];
- }
- }
- }
-
-}
-
-$optlused = $opts{l} ? "with" : "without";
-print <<HEADER_END;
-; \$FreeBSD\$
-;
-; Automatically generated by src/tools/tools/pciid/mk_pci_vendors.pl
-; ($optlused the -l option), using the following source lists:
-;
-; http://www.pcidatabase.com/reports.php?type=csv
-; http://members.datafast.net.au/dft0802/downloads/pcidevs.txt
-;
-; Manual edits on this file will be lost!
-;
-HEADER_END
-
-foreach my $vid (sort keys %vendors) {
- $descr = $vendors{$vid}[0];
- print "$vid\t$descr\n";
- foreach $pciid (sort keys %{$pciids{$vid}}) {
- $descr = $pciids{$vid}{$pciid}[0];
- print "\t$pciid\t$descr\n";
- }
-}
-exit 0;
-
-
-# Parse a line from the Boemler CSV file and place the vendor id, pciid,
-# vendor description and description in the scalars.
-#
-# Returns 0 if there is a problem.
-#
-sub vendors_parse($\$\$\$\$)
-{
- my ($line, $vendorid_ref, $pciid_ref, $vendor_ref, $descr_ref) = @_;
-
- my @a = split(/","/, $line);
- $a[0] =~ s/0x//; # 0x1234 -> 1234
- $a[1] =~ s/0x//;
-
- $a[0] =~ s/^"//; # Remove starting or trailing "
- $a[4] =~ s/"$//;
-
- $a[0] = uc($a[0]); # Some are lowercase hex-digits
- $a[1] = uc($a[1]);
-
- # Length of the Vendor ID or PCI ID is not four hex-digits, ignore it
- return 0 if (length($a[0]) != 4 || length($a[1]) != 4);
-
- # If there is no description, see if the chip data exists and use that
- if ($a[4] eq "") {
- if ($a[3] ne "") {
- $a[4] = $a[3];
- $a[3] = "";
- } else {
- $a[4] = "?";
- }
- }
-
- $$vendorid_ref = $a[0];
- $$pciid_ref = $a[1];
- $$vendor_ref = $a[2];
- $$descr_ref = clean_descr($a[4]);
- $$descr_ref .= clean_descr(" ($a[3])") if ($a[3] =~ /[a-zA-Z0-0]/);
- return 1;
-}
-
-# Parse a line from the Hart file and place the ID and description
-# in the scalars referenced by $id_ref and $descr_ref.
-#
-# On success, returns $IS_VENDOR if the line represents a vendor entity
-# or $IS_DEVICE if the line represents a device entity.
-#
-# Returns 0 on failure.
-#
-sub pcidevs_parse($\$\$)
-{
- my ($line, $id_ref, $descr_ref) = @_;
- my $descr;
-
- if ($line =~ /^V\t([A-Fa-f0-9]{4})\t([^\t].+?)\s*$/) {
- ($$id_ref, $$descr_ref) = (uc($1), clean_descr($2));
- return $IS_VENDOR;
- } elsif ($line =~ /^D\t([A-Fa-f0-9]{4})\t([^\t].+?)\s*$/) {
- ($$id_ref, $$descr_ref) = (uc($1), clean_descr($2));
- return $IS_DEVICE;
- } elsif (not $opts{q} and
- $line !~ /^\s*$/ and $line !~ /^[;ORSX]/) {
- print STDERR "$PROGNAME: ignored Hart: $line\n";
- }
-
- return 0;
-}
-
-sub clean_descr($)
-{
- my ($descr) = @_;
-
- $descr =~ s/[^[:print:]]//g; # non-printable
- $descr =~ s/\\//g; # escape of 's
- $descr =~ s/\#/*/g; # pciconf(8) ignores data after this
-
- return $descr;
-}
diff --git a/usr.bin/calendar/parsedata.c b/usr.bin/calendar/parsedata.c
index e3f9fab..c7e183c 100644
--- a/usr.bin/calendar/parsedata.c
+++ b/usr.bin/calendar/parsedata.c
@@ -548,6 +548,24 @@ parsedaymonth(char *date, int *yearp, int *monthp, int *dayp, int *flags,
continue;
}
+ /* Every so-manied dayofweek of every month of the year */
+ if (lflags == (F_DAYOFWEEK | F_MODIFIERINDEX | F_VARIABLE)) {
+ offset = indextooffset(modifierindex);
+
+ for (m = 0; m < 12; m++) {
+ dow = first_dayofweek_of_month(year, m);
+ d = (idayofweek - dow + 8) % 7;
+ d += (offset - 1) * 7;
+ if (remember_ymd(year, m, d)) {
+ remember(&remindex,
+ yearp, monthp, dayp, edp,
+ year, m, d, NULL);
+ continue;
+ }
+ }
+ continue;
+ }
+
/* A certain dayofweek of a month */
if (lflags ==
(F_MONTH | F_DAYOFWEEK | F_MODIFIERINDEX | F_VARIABLE)) {
@@ -800,6 +818,8 @@ showflags(int flags)
static const char *
getmonthname(int i)
{
+ if (i <= 0 || i > 12)
+ return ("");
if (nmonths[i - 1].len != 0 && nmonths[i - 1].name != NULL)
return (nmonths[i - 1].name);
return (months[i - 1]);
@@ -918,6 +938,16 @@ indextooffset(char *s)
int i;
struct fixs *n;
+ if (s[0] == '+' || s[0] == '-') {
+ char ss[9];
+ for (i = -100; i < 100; i++) {
+ sprintf(ss, "%s%d", (i > 0) ? "+" : "", i);
+ if (strcmp(ss, s) == 0)
+ return (i);
+ }
+ return (0);
+ }
+
for (i = 0; i < 6; i++) {
if (strcasecmp(s, sequences[i]) == 0) {
if (i == 5)
diff --git a/usr.bin/calendar/pom.c b/usr.bin/calendar/pom.c
index 89d06a2..671763a 100644
--- a/usr.bin/calendar/pom.c
+++ b/usr.bin/calendar/pom.c
@@ -155,7 +155,7 @@ fpom(int year, double utcoffset, double *ffms, double *fnms)
tomorrow = potm(days_tomorrow); /* 31 December 00:00:01 */
olddir = today > tomorrow ? -1 : +1;
- yeardays = 1 + isleap(year) ? DAYSPERLEAPYEAR : DAYSPERYEAR; /* reuse */
+ yeardays = 1 + (isleap(year) ? DAYSPERLEAPYEAR : DAYSPERYEAR); /* reuse */
for (d = 0; d <= yeardays; d++) {
today = potm(days_today);
tomorrow = potm(days_tomorrow);
diff --git a/usr.bin/clang/clang/Makefile b/usr.bin/clang/clang/Makefile
index 2abafd7..874aeb5 100644
--- a/usr.bin/clang/clang/Makefile
+++ b/usr.bin/clang/clang/Makefile
@@ -31,6 +31,7 @@ LIBDEPS=clangfrontendtool \
clangstaticanalyzercore \
clanganalysis \
clangindex \
+ clangarcmigrate \
clangrewrite \
clangast \
clanglex \
@@ -43,16 +44,21 @@ LIBDEPS=clangfrontendtool \
llvmarmdisassembler \
llvmarmasmparser \
llvmarmcodegen \
+ llvmarmdesc \
llvmarminstprinter \
llvmarminfo \
llvmmipscodegen \
+ llvmmipsdesc \
+ llvmmipsinstprinter \
llvmmipsinfo \
llvmpowerpccodegen \
+ llvmpowerpcdesc \
llvmpowerpcinstprinter \
llvmpowerpcinfo \
llvmx86disassembler \
llvmx86asmparser \
llvmx86codegen \
+ llvmx86desc \
llvmselectiondag \
llvmasmprinter \
llvmmcparser \
diff --git a/usr.bin/clang/tblgen/Makefile b/usr.bin/clang/tblgen/Makefile
index f46496f..6962406 100644
--- a/usr.bin/clang/tblgen/Makefile
+++ b/usr.bin/clang/tblgen/Makefile
@@ -24,6 +24,7 @@ SRCS= ARMDecoderEmitter.cpp \
DAGISelMatcherOpt.cpp \
DisassemblerEmitter.cpp \
EDEmitter.cpp \
+ Error.cpp \
FastISelEmitter.cpp \
FixedLenDecoderEmitter.cpp \
InstrEnumEmitter.cpp \
@@ -32,6 +33,7 @@ SRCS= ARMDecoderEmitter.cpp \
LLVMCConfigurationEmitter.cpp \
NeonEmitter.cpp \
OptParserEmitter.cpp \
+ PseudoLoweringEmitter.cpp \
Record.cpp \
RegisterInfoEmitter.cpp \
SetTheory.cpp \
diff --git a/usr.bin/cpio/Makefile b/usr.bin/cpio/Makefile
index fe339cd..5868e52 100644
--- a/usr.bin/cpio/Makefile
+++ b/usr.bin/cpio/Makefile
@@ -3,17 +3,24 @@
.include <bsd.own.mk>
PROG= bsdcpio
-BSDCPIO_VERSION_STRING=2.8.3
-SRCS= cpio.c cmdline.c err.c line_reader.c matching.c pathmatch.c
+BSDCPIO_VERSION_STRING=2.8.4
+
+SRCS= cpio.c cmdline.c
+
+.PATH: ${.CURDIR}/../../lib/libarchive/libarchive_fe
+SRCS+= err.c line_reader.c matching.c pathmatch.c
+
CFLAGS+= -DBSDCPIO_VERSION_STRING=\"${BSDCPIO_VERSION_STRING}\"
CFLAGS+= -DPLATFORM_CONFIG_H=\"config_freebsd.h\"
+CFLAGS+= -I${.CURDIR} -I${.CURDIR}/../../lib/libarchive/libarchive_fe
+
.ifdef RELEASE_CRUNCH
# FreeBSD's installer uses cpio in crunched binaries that are
# statically linked, cannot use -lcrypto, and are size sensitive.
CFLAGS+= -DSMALLER
.endif
-DPADD= ${LIBARCHIVE} ${LIBZ} ${LIBBZ2} ${LIBMD} ${LIBLZMA}
-LDADD= -larchive -lz -lbz2 -lmd -llzma
+DPADD= ${LIBARCHIVE} ${LIBZ} ${LIBBZ2} ${LIBMD} ${LIBLZMA} ${LIBBSDXML}
+LDADD= -larchive -lz -lbz2 -lmd -llzma -lbsdxml
.if ${MK_OPENSSL} != "no"
DPADD+= ${LIBCRYPTO}
LDADD+= -lcrypto
diff --git a/usr.bin/cpio/cmdline.c b/usr.bin/cpio/cmdline.c
index f0e8ba20..687fa62 100644
--- a/usr.bin/cpio/cmdline.c
+++ b/usr.bin/cpio/cmdline.c
@@ -175,7 +175,7 @@ cpio_getopt(struct cpio *cpio)
/* Otherwise, pick up the next word. */
opt_word = *cpio->argv;
if (opt_word == NULL) {
- warnc(0,
+ lafe_warnc(0,
"Option -%c requires an argument",
opt);
return ('?');
@@ -226,13 +226,13 @@ cpio_getopt(struct cpio *cpio)
/* Fail if there wasn't a unique match. */
if (match == NULL) {
- warnc(0,
+ lafe_warnc(0,
"Option %s%s is not supported",
long_prefix, opt_word);
return ('?');
}
if (match2 != NULL) {
- warnc(0,
+ lafe_warnc(0,
"Ambiguous option %s%s (matches --%s and --%s)",
long_prefix, opt_word, match->name, match2->name);
return ('?');
@@ -244,7 +244,7 @@ cpio_getopt(struct cpio *cpio)
if (cpio->optarg == NULL) {
cpio->optarg = *cpio->argv;
if (cpio->optarg == NULL) {
- warnc(0,
+ lafe_warnc(0,
"Option %s%s requires an argument",
long_prefix, match->name);
return ('?');
@@ -255,7 +255,7 @@ cpio_getopt(struct cpio *cpio)
} else {
/* Argument forbidden: fail if there is one. */
if (cpio->optarg != NULL) {
- warnc(0,
+ lafe_warnc(0,
"Option %s%s does not allow an argument",
long_prefix, match->name);
return ('?');
diff --git a/usr.bin/cpio/config_freebsd.h b/usr.bin/cpio/config_freebsd.h
index ec4e441..bf24b9e 100644
--- a/usr.bin/cpio/config_freebsd.h
+++ b/usr.bin/cpio/config_freebsd.h
@@ -53,4 +53,5 @@
#define HAVE_UNSIGNED_LONG_LONG 1
#define HAVE_UTIME_H 1
#define HAVE_UTIMES 1
+#define HAVE_WCSCMP 1
diff --git a/usr.bin/cpio/cpio.c b/usr.bin/cpio/cpio.c
index ab32224..cd81050 100644
--- a/usr.bin/cpio/cpio.c
+++ b/usr.bin/cpio/cpio.c
@@ -136,19 +136,19 @@ main(int argc, char *argv[])
cpio->buff = buff;
cpio->buff_size = sizeof(buff);
- /* Need progname before calling warnc. */
+ /* Need lafe_progname before calling lafe_warnc. */
if (*argv == NULL)
- progname = "bsdcpio";
+ lafe_progname = "bsdcpio";
else {
#if defined(_WIN32) && !defined(__CYGWIN__)
- progname = strrchr(*argv, '\\');
+ lafe_progname = strrchr(*argv, '\\');
#else
- progname = strrchr(*argv, '/');
+ lafe_progname = strrchr(*argv, '/');
#endif
- if (progname != NULL)
- progname++;
+ if (lafe_progname != NULL)
+ lafe_progname++;
else
- progname = *argv;
+ lafe_progname = *argv;
}
cpio->uid_override = -1;
@@ -189,7 +189,7 @@ main(int argc, char *argv[])
case 'C': /* NetBSD/OpenBSD */
cpio->bytes_per_block = atoi(cpio->optarg);
if (cpio->bytes_per_block <= 0)
- errc(1, 0, "Invalid blocksize %s", cpio->optarg);
+ lafe_errc(1, 0, "Invalid blocksize %s", cpio->optarg);
break;
case 'c': /* POSIX 1997 */
cpio->format = "odc";
@@ -198,14 +198,14 @@ main(int argc, char *argv[])
cpio->extract_flags &= ~ARCHIVE_EXTRACT_NO_AUTODIR;
break;
case 'E': /* NetBSD/OpenBSD */
- include_from_file(&cpio->matching,
+ lafe_include_from_file(&cpio->matching,
cpio->optarg, cpio->option_null);
break;
case 'F': /* NetBSD/OpenBSD/GNU cpio */
cpio->filename = cpio->optarg;
break;
case 'f': /* POSIX 1997 */
- exclude(&cpio->matching, cpio->optarg);
+ lafe_exclude(&cpio->matching, cpio->optarg);
break;
case 'H': /* GNU cpio (also --format) */
cpio->format = cpio->optarg;
@@ -218,7 +218,7 @@ main(int argc, char *argv[])
break;
case 'i': /* POSIX 1997 */
if (cpio->mode != '\0')
- errc(1, 0,
+ lafe_errc(1, 0,
"Cannot use both -i and -%c", cpio->mode);
cpio->mode = opt;
break;
@@ -255,13 +255,13 @@ main(int argc, char *argv[])
break;
case 'o': /* POSIX 1997 */
if (cpio->mode != '\0')
- errc(1, 0,
+ lafe_errc(1, 0,
"Cannot use both -o and -%c", cpio->mode);
cpio->mode = opt;
break;
case 'p': /* POSIX 1997 */
if (cpio->mode != '\0')
- errc(1, 0,
+ lafe_errc(1, 0,
"Cannot use both -p and -%c", cpio->mode);
cpio->mode = opt;
cpio->extract_flags &= ~ARCHIVE_EXTRACT_SECURE_NODOTDOT;
@@ -277,7 +277,7 @@ main(int argc, char *argv[])
* also; use that to set [ug]name_override. */
errmsg = owner_parse(cpio->optarg, &uid, &gid);
if (errmsg) {
- warnc(-1, "%s", errmsg);
+ lafe_warnc(-1, "%s", errmsg);
usage();
}
if (uid != -1) {
@@ -335,16 +335,16 @@ main(int argc, char *argv[])
cpio->mode = 'i';
/* -t requires -i */
if (cpio->option_list && cpio->mode != 'i')
- errc(1, 0, "Option -t requires -i");
+ lafe_errc(1, 0, "Option -t requires -i");
/* -n requires -it */
if (cpio->option_numeric_uid_gid && !cpio->option_list)
- errc(1, 0, "Option -n requires -it");
+ lafe_errc(1, 0, "Option -n requires -it");
/* Can only specify format when writing */
if (cpio->format != NULL && cpio->mode != 'o')
- errc(1, 0, "Option --format requires -o");
+ lafe_errc(1, 0, "Option --format requires -o");
/* -l requires -p */
if (cpio->option_link && cpio->mode != 'p')
- errc(1, 0, "Option -l requires -p");
+ lafe_errc(1, 0, "Option -l requires -p");
/* TODO: Flag other nonsensical combinations. */
switch (cpio->mode) {
@@ -358,7 +358,7 @@ main(int argc, char *argv[])
break;
case 'i':
while (*cpio->argv != NULL) {
- include(&cpio->matching, *cpio->argv);
+ lafe_include(&cpio->matching, *cpio->argv);
--cpio->argc;
++cpio->argv;
}
@@ -369,12 +369,12 @@ main(int argc, char *argv[])
break;
case 'p':
if (*cpio->argv == NULL || **cpio->argv == '\0')
- errc(1, 0,
+ lafe_errc(1, 0,
"-p mode requires a target directory");
mode_pass(cpio, *cpio->argv);
break;
default:
- errc(1, 0,
+ lafe_errc(1, 0,
"Must specify at least one of -i, -o, or -p");
}
@@ -388,7 +388,7 @@ usage(void)
{
const char *p;
- p = progname;
+ p = lafe_progname;
fprintf(stderr, "Brief Usage:\n");
fprintf(stderr, " List: %s -it < archive\n", p);
@@ -426,7 +426,7 @@ long_help(void)
const char *prog;
const char *p;
- prog = progname;
+ prog = lafe_progname;
fflush(stderr);
@@ -459,16 +459,16 @@ static void
mode_out(struct cpio *cpio)
{
struct archive_entry *entry, *spare;
- struct line_reader *lr;
+ struct lafe_line_reader *lr;
const char *p;
int r;
if (cpio->option_append)
- errc(1, 0, "Append mode not yet supported.");
+ lafe_errc(1, 0, "Append mode not yet supported.");
cpio->archive_read_disk = archive_read_disk_new();
if (cpio->archive_read_disk == NULL)
- errc(1, 0, "Failed to allocate archive object");
+ lafe_errc(1, 0, "Failed to allocate archive object");
if (cpio->option_follow_links)
archive_read_disk_set_symlink_logical(cpio->archive_read_disk);
else
@@ -477,7 +477,7 @@ mode_out(struct cpio *cpio)
cpio->archive = archive_write_new();
if (cpio->archive == NULL)
- errc(1, 0, "Failed to allocate archive object");
+ lafe_errc(1, 0, "Failed to allocate archive object");
switch (cpio->compress) {
case 'J':
r = archive_write_set_compression_xz(cpio->archive);
@@ -499,10 +499,10 @@ mode_out(struct cpio *cpio)
break;
}
if (r < ARCHIVE_WARN)
- errc(1, 0, "Requested compression not available");
+ lafe_errc(1, 0, "Requested compression not available");
r = archive_write_set_format_by_name(cpio->archive, cpio->format);
if (r != ARCHIVE_OK)
- errc(1, 0, "%s", archive_error_string(cpio->archive));
+ lafe_errc(1, 0, "%s", archive_error_string(cpio->archive));
archive_write_set_bytes_per_block(cpio->archive, cpio->bytes_per_block);
cpio->linkresolver = archive_entry_linkresolver_new();
archive_entry_linkresolver_set_strategy(cpio->linkresolver,
@@ -513,11 +513,11 @@ mode_out(struct cpio *cpio)
*/
r = archive_write_open_file(cpio->archive, cpio->filename);
if (r != ARCHIVE_OK)
- errc(1, 0, "%s", archive_error_string(cpio->archive));
- lr = line_reader("-", cpio->option_null);
- while ((p = line_reader_next(lr)) != NULL)
+ lafe_errc(1, 0, "%s", archive_error_string(cpio->archive));
+ lr = lafe_line_reader("-", cpio->option_null);
+ while ((p = lafe_line_reader_next(lr)) != NULL)
file_to_archive(cpio, p);
- line_reader_free(lr);
+ lafe_line_reader_free(lr);
/*
* The hardlink detection may have queued up a couple of entries
@@ -534,7 +534,7 @@ mode_out(struct cpio *cpio)
r = archive_write_close(cpio->archive);
if (r != ARCHIVE_OK)
- errc(1, 0, "%s", archive_error_string(cpio->archive));
+ lafe_errc(1, 0, "%s", archive_error_string(cpio->archive));
if (!cpio->quiet) {
int64_t blocks =
@@ -566,15 +566,15 @@ file_to_archive(struct cpio *cpio, const char *srcpath)
*/
entry = archive_entry_new();
if (entry == NULL)
- errc(1, 0, "Couldn't allocate entry");
+ lafe_errc(1, 0, "Couldn't allocate entry");
archive_entry_copy_sourcepath(entry, srcpath);
r = archive_read_disk_entry_from_file(cpio->archive_read_disk,
entry, -1, NULL);
if (r < ARCHIVE_FAILED)
- errc(1, 0, "%s",
+ lafe_errc(1, 0, "%s",
archive_error_string(cpio->archive_read_disk));
if (r < ARCHIVE_OK)
- warnc(0, "%s",
+ lafe_warnc(0, "%s",
archive_error_string(cpio->archive_read_disk));
if (r <= ARCHIVE_FAILED) {
cpio->return_value = 1;
@@ -607,7 +607,7 @@ file_to_archive(struct cpio *cpio, const char *srcpath)
free(cpio->pass_destpath);
cpio->pass_destpath = malloc(cpio->pass_destpath_alloc);
if (cpio->pass_destpath == NULL)
- errc(1, ENOMEM,
+ lafe_errc(1, ENOMEM,
"Can't allocate path buffer");
}
strcpy(cpio->pass_destpath, cpio->destdir);
@@ -673,7 +673,7 @@ entry_to_archive(struct cpio *cpio, struct archive_entry *entry)
/* Save the original entry in case we need it later. */
t = archive_entry_clone(entry);
if (t == NULL)
- errc(1, ENOMEM, "Can't create link");
+ lafe_errc(1, ENOMEM, "Can't create link");
/* Note: link(2) doesn't create parent directories,
* so we use archive_write_header() instead as a
* convenience. */
@@ -683,7 +683,7 @@ entry_to_archive(struct cpio *cpio, struct archive_entry *entry)
r = archive_write_header(cpio->archive, t);
archive_entry_free(t);
if (r != ARCHIVE_OK)
- warnc(archive_errno(cpio->archive),
+ lafe_warnc(archive_errno(cpio->archive),
"%s", archive_error_string(cpio->archive));
if (r == ARCHIVE_FATAL)
exit(1);
@@ -691,7 +691,7 @@ entry_to_archive(struct cpio *cpio, struct archive_entry *entry)
if (r != ARCHIVE_OK && archive_errno(cpio->archive) == EXDEV) {
/* Cross-device link: Just fall through and use
* the original entry to copy the file over. */
- warnc(0, "Copying file instead");
+ lafe_warnc(0, "Copying file instead");
} else
#endif
return (0);
@@ -705,7 +705,7 @@ entry_to_archive(struct cpio *cpio, struct archive_entry *entry)
if (archive_entry_size(entry) > 0) {
fd = open(srcpath, O_RDONLY | O_BINARY);
if (fd < 0) {
- warnc(errno,
+ lafe_warnc(errno,
"%s: could not open file", srcpath);
goto cleanup;
}
@@ -717,7 +717,7 @@ entry_to_archive(struct cpio *cpio, struct archive_entry *entry)
r = archive_write_header(cpio->archive, entry);
if (r != ARCHIVE_OK)
- warnc(archive_errno(cpio->archive),
+ lafe_warnc(archive_errno(cpio->archive),
"%s: %s",
srcpath,
archive_error_string(cpio->archive));
@@ -731,10 +731,10 @@ entry_to_archive(struct cpio *cpio, struct archive_entry *entry)
r = archive_write_data(cpio->archive,
cpio->buff, bytes_read);
if (r < 0)
- errc(1, archive_errno(cpio->archive),
+ lafe_errc(1, archive_errno(cpio->archive),
"%s", archive_error_string(cpio->archive));
if (r < bytes_read) {
- warnc(0,
+ lafe_warnc(0,
"Truncated write; file may have grown while being archived.");
}
bytes_read = read(fd, cpio->buff, cpio->buff_size);
@@ -763,7 +763,7 @@ restore_time(struct cpio *cpio, struct archive_entry *entry,
(void)name; /* UNUSED */
if (!warned)
- warnc(0, "Can't restore access times on this platform");
+ lafe_warnc(0, "Can't restore access times on this platform");
warned = 1;
return (fd);
#else
@@ -801,7 +801,7 @@ restore_time(struct cpio *cpio, struct archive_entry *entry,
if ((AE_IFLNK != archive_entry_filetype(entry))
&& utimes(name, times) != 0)
#endif
- warnc(errno, "Can't update time for %s", name);
+ lafe_warnc(errno, "Can't update time for %s", name);
#endif
return (fd);
}
@@ -818,28 +818,28 @@ mode_in(struct cpio *cpio)
ext = archive_write_disk_new();
if (ext == NULL)
- errc(1, 0, "Couldn't allocate restore object");
+ lafe_errc(1, 0, "Couldn't allocate restore object");
r = archive_write_disk_set_options(ext, cpio->extract_flags);
if (r != ARCHIVE_OK)
- errc(1, 0, "%s", archive_error_string(ext));
+ lafe_errc(1, 0, "%s", archive_error_string(ext));
a = archive_read_new();
if (a == NULL)
- errc(1, 0, "Couldn't allocate archive object");
+ lafe_errc(1, 0, "Couldn't allocate archive object");
archive_read_support_compression_all(a);
archive_read_support_format_all(a);
if (archive_read_open_file(a, cpio->filename, cpio->bytes_per_block))
- errc(1, archive_errno(a),
+ lafe_errc(1, archive_errno(a),
"%s", archive_error_string(a));
for (;;) {
r = archive_read_next_header(a, &entry);
if (r == ARCHIVE_EOF)
break;
if (r != ARCHIVE_OK) {
- errc(1, archive_errno(a),
+ lafe_errc(1, archive_errno(a),
"%s", archive_error_string(a));
}
- if (excluded(cpio->matching, archive_entry_pathname(entry)))
+ if (lafe_excluded(cpio->matching, archive_entry_pathname(entry)))
continue;
if (cpio->option_rename) {
destpath = cpio_rename(archive_entry_pathname(entry));
@@ -867,10 +867,10 @@ mode_in(struct cpio *cpio)
}
r = archive_read_close(a);
if (r != ARCHIVE_OK)
- errc(1, 0, "%s", archive_error_string(a));
+ lafe_errc(1, 0, "%s", archive_error_string(a));
r = archive_write_close(ext);
if (r != ARCHIVE_OK)
- errc(1, 0, "%s", archive_error_string(ext));
+ lafe_errc(1, 0, "%s", archive_error_string(ext));
if (!cpio->quiet) {
int64_t blocks = (archive_position_uncompressed(a) + 511)
/ 512;
@@ -899,13 +899,13 @@ extract_data(struct archive *ar, struct archive *aw)
if (r == ARCHIVE_EOF)
return (ARCHIVE_OK);
if (r != ARCHIVE_OK) {
- warnc(archive_errno(ar),
+ lafe_warnc(archive_errno(ar),
"%s", archive_error_string(ar));
exit(1);
}
r = archive_write_data_block(aw, block, size, offset);
if (r != ARCHIVE_OK) {
- warnc(archive_errno(aw),
+ lafe_warnc(archive_errno(aw),
"%s", archive_error_string(aw));
return (r);
}
@@ -921,22 +921,22 @@ mode_list(struct cpio *cpio)
a = archive_read_new();
if (a == NULL)
- errc(1, 0, "Couldn't allocate archive object");
+ lafe_errc(1, 0, "Couldn't allocate archive object");
archive_read_support_compression_all(a);
archive_read_support_format_all(a);
if (archive_read_open_file(a, cpio->filename, cpio->bytes_per_block))
- errc(1, archive_errno(a),
+ lafe_errc(1, archive_errno(a),
"%s", archive_error_string(a));
for (;;) {
r = archive_read_next_header(a, &entry);
if (r == ARCHIVE_EOF)
break;
if (r != ARCHIVE_OK) {
- errc(1, archive_errno(a),
+ lafe_errc(1, archive_errno(a),
"%s", archive_error_string(a));
}
- if (excluded(cpio->matching, archive_entry_pathname(entry)))
+ if (lafe_excluded(cpio->matching, archive_entry_pathname(entry)))
continue;
if (cpio->verbose)
list_item_verbose(cpio, entry);
@@ -945,7 +945,7 @@ mode_list(struct cpio *cpio)
}
r = archive_read_close(a);
if (r != ARCHIVE_OK)
- errc(1, 0, "%s", archive_error_string(a));
+ lafe_errc(1, 0, "%s", archive_error_string(a));
if (!cpio->quiet) {
int64_t blocks = (archive_position_uncompressed(a) + 511)
/ 512;
@@ -1040,7 +1040,7 @@ list_item_verbose(struct cpio *cpio, struct archive_entry *entry)
static void
mode_pass(struct cpio *cpio, const char *destdir)
{
- struct line_reader *lr;
+ struct lafe_line_reader *lr;
const char *p;
int r;
@@ -1052,31 +1052,31 @@ mode_pass(struct cpio *cpio, const char *destdir)
cpio->archive = archive_write_disk_new();
if (cpio->archive == NULL)
- errc(1, 0, "Failed to allocate archive object");
+ lafe_errc(1, 0, "Failed to allocate archive object");
r = archive_write_disk_set_options(cpio->archive, cpio->extract_flags);
if (r != ARCHIVE_OK)
- errc(1, 0, "%s", archive_error_string(cpio->archive));
+ lafe_errc(1, 0, "%s", archive_error_string(cpio->archive));
cpio->linkresolver = archive_entry_linkresolver_new();
archive_write_disk_set_standard_lookup(cpio->archive);
cpio->archive_read_disk = archive_read_disk_new();
if (cpio->archive_read_disk == NULL)
- errc(1, 0, "Failed to allocate archive object");
+ lafe_errc(1, 0, "Failed to allocate archive object");
if (cpio->option_follow_links)
archive_read_disk_set_symlink_logical(cpio->archive_read_disk);
else
archive_read_disk_set_symlink_physical(cpio->archive_read_disk);
archive_read_disk_set_standard_lookup(cpio->archive_read_disk);
- lr = line_reader("-", cpio->option_null);
- while ((p = line_reader_next(lr)) != NULL)
+ lr = lafe_line_reader("-", cpio->option_null);
+ while ((p = lafe_line_reader_next(lr)) != NULL)
file_to_archive(cpio, p);
- line_reader_free(lr);
+ lafe_line_reader_free(lr);
archive_entry_linkresolver_free(cpio->linkresolver);
r = archive_write_close(cpio->archive);
if (r != ARCHIVE_OK)
- errc(1, 0, "%s", archive_error_string(cpio->archive));
+ lafe_errc(1, 0, "%s", archive_error_string(cpio->archive));
if (!cpio->quiet) {
int64_t blocks =
@@ -1160,7 +1160,7 @@ lookup_name(struct cpio *cpio, struct name_cache **name_cache_variable,
if (*name_cache_variable == NULL) {
*name_cache_variable = malloc(sizeof(struct name_cache));
if (*name_cache_variable == NULL)
- errc(1, ENOMEM, "No more memory");
+ lafe_errc(1, ENOMEM, "No more memory");
memset(*name_cache_variable, 0, sizeof(struct name_cache));
(*name_cache_variable)->size = name_cache_size;
}
@@ -1217,7 +1217,7 @@ lookup_uname_helper(struct cpio *cpio, const char **name, id_t id)
if (pwent == NULL) {
*name = NULL;
if (errno != 0 && errno != ENOENT)
- warnc(errno, "getpwuid(%d) failed", id);
+ lafe_warnc(errno, "getpwuid(%d) failed", id);
return (errno);
}
@@ -1244,7 +1244,7 @@ lookup_gname_helper(struct cpio *cpio, const char **name, id_t id)
if (grent == NULL) {
*name = NULL;
if (errno != 0)
- warnc(errno, "getgrgid(%d) failed", id);
+ lafe_warnc(errno, "getgrgid(%d) failed", id);
return (errno);
}
diff --git a/usr.bin/cpio/cpio.h b/usr.bin/cpio/cpio.h
index 2afa8f2..2d5b548 100644
--- a/usr.bin/cpio/cpio.h
+++ b/usr.bin/cpio/cpio.h
@@ -88,7 +88,7 @@ struct cpio {
struct name_cache *gname_cache;
/* Work data. */
- struct matching *matching;
+ struct lafe_matching *matching;
char *buff;
size_t buff_size;
};
diff --git a/usr.bin/cpio/line_reader.c b/usr.bin/cpio/line_reader.c
deleted file mode 100644
index 8461941..0000000
--- a/usr.bin/cpio/line_reader.c
+++ /dev/null
@@ -1,171 +0,0 @@
-/*-
- * Copyright (c) 2008 Tim Kientzle
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer
- * in this position and unchanged.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR(S) ``AS IS'' AND ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
- * IN NO EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include "cpio_platform.h"
-__FBSDID("$FreeBSD$");
-
-#include <errno.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-
-#include "err.h"
-#include "line_reader.h"
-
-#if defined(_WIN32) && !defined(__CYGWIN__) && !defined(__BORLANDC__)
-#define strdup _strdup
-#endif
-
-/*
- * Read lines from file and do something with each one. If option_null
- * is set, lines are terminated with zero bytes; otherwise, they're
- * terminated with newlines.
- *
- * This uses a self-sizing buffer to handle arbitrarily-long lines.
- */
-struct line_reader {
- FILE *f;
- char *buff, *buff_end, *line_start, *line_end, *p;
- char *pathname;
- size_t buff_length;
- int nullSeparator; /* Lines separated by null, not CR/CRLF/etc. */
- int ret;
-};
-
-struct line_reader *
-line_reader(const char *pathname, int nullSeparator)
-{
- struct line_reader *lr;
-
- lr = calloc(1, sizeof(*lr));
- if (lr == NULL)
- errc(1, ENOMEM, "Can't open %s", pathname);
-
- lr->nullSeparator = nullSeparator;
- lr->pathname = strdup(pathname);
-
- if (strcmp(pathname, "-") == 0)
- lr->f = stdin;
- else
- lr->f = fopen(pathname, "r");
- if (lr->f == NULL)
- errc(1, errno, "Couldn't open %s", pathname);
- lr->buff_length = 8192;
- lr->buff = malloc(lr->buff_length);
- if (lr->buff == NULL)
- errc(1, ENOMEM, "Can't read %s", pathname);
- lr->line_start = lr->line_end = lr->buff_end = lr->buff;
-
- return (lr);
-}
-
-const char *
-line_reader_next(struct line_reader *lr)
-{
- size_t bytes_wanted, bytes_read, new_buff_size;
- char *line_start, *p;
-
- for (;;) {
- /* If there's a line in the buffer, return it immediately. */
- while (lr->line_end < lr->buff_end) {
- if (lr->nullSeparator) {
- if (*lr->line_end == '\0') {
- line_start = lr->line_start;
- lr->line_start = lr->line_end + 1;
- lr->line_end = lr->line_start;
- return (line_start);
- }
- } else if (*lr->line_end == '\x0a' || *lr->line_end == '\x0d') {
- *lr->line_end = '\0';
- line_start = lr->line_start;
- lr->line_start = lr->line_end + 1;
- lr->line_end = lr->line_start;
- if (line_start[0] != '\0')
- return (line_start);
- }
- lr->line_end++;
- }
-
- /* If we're at end-of-file, process the final data. */
- if (lr->f == NULL) {
- /* If there's more text, return one last line. */
- if (lr->line_end > lr->line_start) {
- *lr->line_end = '\0';
- line_start = lr->line_start;
- lr->line_start = lr->line_end + 1;
- lr->line_end = lr->line_start;
- return (line_start);
- }
- /* Otherwise, we're done. */
- return (NULL);
- }
-
- /* Buffer only has part of a line. */
- if (lr->line_start > lr->buff) {
- /* Move a leftover fractional line to the beginning. */
- memmove(lr->buff, lr->line_start,
- lr->buff_end - lr->line_start);
- lr->buff_end -= lr->line_start - lr->buff;
- lr->line_end -= lr->line_start - lr->buff;
- lr->line_start = lr->buff;
- } else {
- /* Line is too big; enlarge the buffer. */
- new_buff_size = lr->buff_length * 2;
- if (new_buff_size <= lr->buff_length)
- errc(1, ENOMEM,
- "Line too long in %s", lr->pathname);
- lr->buff_length = new_buff_size;
- p = realloc(lr->buff, new_buff_size);
- if (p == NULL)
- errc(1, ENOMEM,
- "Line too long in %s", lr->pathname);
- lr->buff_end = p + (lr->buff_end - lr->buff);
- lr->line_end = p + (lr->line_end - lr->buff);
- lr->line_start = lr->buff = p;
- }
-
- /* Get some more data into the buffer. */
- bytes_wanted = lr->buff + lr->buff_length - lr->buff_end;
- bytes_read = fread(lr->buff_end, 1, bytes_wanted, lr->f);
- lr->buff_end += bytes_read;
-
- if (ferror(lr->f))
- errc(1, errno, "Can't read %s", lr->pathname);
- if (feof(lr->f)) {
- if (lr->f != stdin)
- fclose(lr->f);
- lr->f = NULL;
- }
- }
-}
-
-void
-line_reader_free(struct line_reader *lr)
-{
- free(lr->buff);
- free(lr->pathname);
- free(lr);
-}
diff --git a/usr.bin/cpio/matching.c b/usr.bin/cpio/matching.c
deleted file mode 100644
index 0fd2b6a..0000000
--- a/usr.bin/cpio/matching.c
+++ /dev/null
@@ -1,284 +0,0 @@
-/*-
- * Copyright (c) 2003-2007 Tim Kientzle
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR(S) ``AS IS'' AND ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
- * IN NO EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include "cpio_platform.h"
-__FBSDID("$FreeBSD$");
-
-#ifdef HAVE_ERRNO_H
-#include <errno.h>
-#endif
-#ifdef HAVE_STDLIB_H
-#include <stdlib.h>
-#endif
-#ifdef HAVE_STRING_H
-#include <string.h>
-#endif
-
-#include "err.h"
-#include "line_reader.h"
-#include "matching.h"
-#include "pathmatch.h"
-
-struct match {
- struct match *next;
- int matches;
- char pattern[1];
-};
-
-struct matching {
- struct match *exclusions;
- int exclusions_count;
- struct match *inclusions;
- int inclusions_count;
- int inclusions_unmatched_count;
-};
-
-static void add_pattern(struct match **list, const char *pattern);
-static void initialize_matching(struct matching **);
-static int match_exclusion(struct match *, const char *pathname);
-static int match_inclusion(struct match *, const char *pathname);
-
-/*
- * The matching logic here needs to be re-thought. I started out to
- * try to mimic gtar's matching logic, but it's not entirely
- * consistent. In particular 'tar -t' and 'tar -x' interpret patterns
- * on the command line as anchored, but --exclude doesn't.
- */
-
-/*
- * Utility functions to manage exclusion/inclusion patterns
- */
-
-int
-exclude(struct matching **matching, const char *pattern)
-{
-
- if (*matching == NULL)
- initialize_matching(matching);
- add_pattern(&((*matching)->exclusions), pattern);
- (*matching)->exclusions_count++;
- return (0);
-}
-
-int
-exclude_from_file(struct matching **matching, const char *pathname)
-{
- struct line_reader *lr;
- const char *p;
- int ret = 0;
-
- lr = line_reader(pathname, 0);
- while ((p = line_reader_next(lr)) != NULL) {
- if (exclude(matching, p) != 0)
- ret = -1;
- }
- line_reader_free(lr);
- return (ret);
-}
-
-int
-include(struct matching **matching, const char *pattern)
-{
-
- if (*matching == NULL)
- initialize_matching(matching);
- add_pattern(&((*matching)->inclusions), pattern);
- (*matching)->inclusions_count++;
- (*matching)->inclusions_unmatched_count++;
- return (0);
-}
-
-int
-include_from_file(struct matching **matching, const char *pathname,
- int nullSeparator)
-{
- struct line_reader *lr;
- const char *p;
- int ret = 0;
-
- lr = line_reader(pathname, nullSeparator);
- while ((p = line_reader_next(lr)) != NULL) {
- if (include(matching, p) != 0)
- ret = -1;
- }
- line_reader_free(lr);
- return (ret);
-}
-
-static void
-add_pattern(struct match **list, const char *pattern)
-{
- struct match *match;
- size_t len;
-
- len = strlen(pattern);
- match = malloc(sizeof(*match) + len + 1);
- if (match == NULL)
- errc(1, errno, "Out of memory");
- strcpy(match->pattern, pattern);
- /* Both "foo/" and "foo" should match "foo/bar". */
- if (len && match->pattern[len - 1] == '/')
- match->pattern[strlen(match->pattern)-1] = '\0';
- match->next = *list;
- *list = match;
- match->matches = 0;
-}
-
-
-int
-excluded(struct matching *matching, const char *pathname)
-{
- struct match *match;
- struct match *matched;
-
- if (matching == NULL)
- return (0);
-
- /* Exclusions take priority */
- for (match = matching->exclusions; match != NULL; match = match->next){
- if (match_exclusion(match, pathname))
- return (1);
- }
-
- /* Then check for inclusions */
- matched = NULL;
- for (match = matching->inclusions; match != NULL; match = match->next){
- if (match_inclusion(match, pathname)) {
- /*
- * If this pattern has never been matched,
- * then we're done.
- */
- if (match->matches == 0) {
- match->matches++;
- matching->inclusions_unmatched_count--;
- return (0);
- }
- /*
- * Otherwise, remember the match but keep checking
- * in case we can tick off an unmatched pattern.
- */
- matched = match;
- }
- }
- /*
- * We didn't find a pattern that had never been matched, but
- * we did find a match, so count it and exit.
- */
- if (matched != NULL) {
- matched->matches++;
- return (0);
- }
-
- /* If there were inclusions, default is to exclude. */
- if (matching->inclusions != NULL)
- return (1);
-
- /* No explicit inclusions, default is to match. */
- return (0);
-}
-
-/*
- * This is a little odd, but it matches the default behavior of
- * gtar. In particular, 'a*b' will match 'foo/a1111/222b/bar'
- *
- */
-static int
-match_exclusion(struct match *match, const char *pathname)
-{
- return (pathmatch(match->pattern,
- pathname,
- PATHMATCH_NO_ANCHOR_START | PATHMATCH_NO_ANCHOR_END));
-}
-
-/*
- * Again, mimic gtar: inclusions are always anchored (have to match
- * the beginning of the path) even though exclusions are not anchored.
- */
-static int
-match_inclusion(struct match *match, const char *pathname)
-{
-#if 0
- return (pathmatch(match->pattern, pathname, 0));
-#else
- return (pathmatch(match->pattern, pathname, PATHMATCH_NO_ANCHOR_END));
-#endif
-}
-
-void
-cleanup_exclusions(struct matching **matching)
-{
- struct match *p, *q;
-
- if (*matching == NULL)
- return;
-
- for (p = (*matching)->inclusions; p != NULL; ) {
- q = p;
- p = p->next;
- free(q);
- }
-
- for (p = (*matching)->exclusions; p != NULL; ) {
- q = p;
- p = p->next;
- free(q);
- }
-
- free(*matching);
- *matching = NULL;
-}
-
-static void
-initialize_matching(struct matching **matching)
-{
- *matching = calloc(sizeof(**matching), 1);
- if (*matching == NULL)
- errc(1, errno, "No memory");
-}
-
-int
-unmatched_inclusions(struct matching *matching)
-{
-
- if (matching == NULL)
- return (0);
- return (matching->inclusions_unmatched_count);
-}
-
-int
-unmatched_inclusions_warn(struct matching *matching, const char *msg)
-{
- struct match *p;
-
- if (matching == NULL)
- return (0);
-
- for (p = matching->inclusions; p != NULL; p = p->next) {
- if (p->matches == 0)
- warnc(0, "%s: %s", p->pattern, msg);
- }
-
- return (matching->inclusions_unmatched_count);
-}
diff --git a/usr.bin/cpio/pathmatch.c b/usr.bin/cpio/pathmatch.c
deleted file mode 100644
index 75f9095..0000000
--- a/usr.bin/cpio/pathmatch.c
+++ /dev/null
@@ -1,255 +0,0 @@
-/*-
- * Copyright (c) 2003-2007 Tim Kientzle
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer
- * in this position and unchanged.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR(S) ``AS IS'' AND ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
- * IN NO EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include "cpio_platform.h"
-__FBSDID("$FreeBSD$");
-
-#ifdef HAVE_STRING_H
-#include <string.h>
-#endif
-
-#include "pathmatch.h"
-
-/*
- * Check whether a character 'c' is matched by a list specification [...]:
- * * Leading '!' negates the class.
- * * <char>-<char> is a range of characters
- * * \<char> removes any special meaning for <char>
- *
- * Some interesting boundary cases:
- * a-d-e is one range (a-d) followed by two single characters - and e.
- * \a-\d is same as a-d
- * a\-d is three single characters: a, d, -
- * Trailing - is not special (so [a-] is two characters a and -).
- * Initial - is not special ([a-] is same as [-a] is same as [\\-a])
- * This function never sees a trailing \.
- * [] always fails
- * [!] always succeeds
- */
-static int
-pm_list(const char *start, const char *end, const char c, int flags)
-{
- const char *p = start;
- char rangeStart = '\0', nextRangeStart;
- int match = 1, nomatch = 0;
-
- /* This will be used soon... */
- (void)flags; /* UNUSED */
-
- /* If this is a negated class, return success for nomatch. */
- if (*p == '!' && p < end) {
- match = 0;
- nomatch = 1;
- ++p;
- }
-
- while (p < end) {
- nextRangeStart = '\0';
- switch (*p) {
- case '-':
- /* Trailing or initial '-' is not special. */
- if ((rangeStart == '\0') || (p == end - 1)) {
- if (*p == c)
- return (match);
- } else {
- char rangeEnd = *++p;
- if (rangeEnd == '\\')
- rangeEnd = *++p;
- if ((rangeStart <= c) && (c <= rangeEnd))
- return (match);
- }
- break;
- case '\\':
- ++p;
- /* Fall through */
- default:
- if (*p == c)
- return (match);
- nextRangeStart = *p; /* Possible start of range. */
- }
- rangeStart = nextRangeStart;
- ++p;
- }
- return (nomatch);
-}
-
-/*
- * If s is pointing to "./", ".//", "./././" or the like, skip it.
- */
-static const char *
-pm_slashskip(const char *s) {
- while ((*s == '/')
- || (s[0] == '.' && s[1] == '/')
- || (s[0] == '.' && s[1] == '\0'))
- ++s;
- return (s);
-}
-
-static int
-pm(const char *p, const char *s, int flags)
-{
- const char *end;
-
- /*
- * Ignore leading './', './/', '././', etc.
- */
- if (s[0] == '.' && s[1] == '/')
- s = pm_slashskip(s + 1);
- if (p[0] == '.' && p[1] == '/')
- p = pm_slashskip(p + 1);
-
- for (;;) {
- switch (*p) {
- case '\0':
- if (s[0] == '/') {
- if (flags & PATHMATCH_NO_ANCHOR_END)
- return (1);
- /* "dir" == "dir/" == "dir/." */
- s = pm_slashskip(s);
- }
- return (*s == '\0');
- case '?':
- /* ? always succeds, unless we hit end of 's' */
- if (*s == '\0')
- return (0);
- break;
- case '*':
- /* "*" == "**" == "***" ... */
- while (*p == '*')
- ++p;
- /* Trailing '*' always succeeds. */
- if (*p == '\0')
- return (1);
- while (*s) {
- if (pathmatch(p, s, flags))
- return (1);
- ++s;
- }
- return (0);
- case '[':
- /*
- * Find the end of the [...] character class,
- * ignoring \] that might occur within the class.
- */
- end = p + 1;
- while (*end != '\0' && *end != ']') {
- if (*end == '\\' && end[1] != '\0')
- ++end;
- ++end;
- }
- if (*end == ']') {
- /* We found [...], try to match it. */
- if (!pm_list(p + 1, end, *s, flags))
- return (0);
- p = end; /* Jump to trailing ']' char. */
- break;
- } else
- /* No final ']', so just match '['. */
- if (*p != *s)
- return (0);
- break;
- case '\\':
- /* Trailing '\\' matches itself. */
- if (p[1] == '\0') {
- if (*s != '\\')
- return (0);
- } else {
- ++p;
- if (*p != *s)
- return (0);
- }
- break;
- case '/':
- if (*s != '/' && *s != '\0')
- return (0);
- /* Note: pattern "/\./" won't match "/";
- * pm_slashskip() correctly stops at backslash. */
- p = pm_slashskip(p);
- s = pm_slashskip(s);
- if (*p == '\0' && (flags & PATHMATCH_NO_ANCHOR_END))
- return (1);
- --p; /* Counteract the increment below. */
- --s;
- break;
- case '$':
- /* '$' is special only at end of pattern and only
- * if PATHMATCH_NO_ANCHOR_END is specified. */
- if (p[1] == '\0' && (flags & PATHMATCH_NO_ANCHOR_END)){
- /* "dir" == "dir/" == "dir/." */
- return (*pm_slashskip(s) == '\0');
- }
- /* Otherwise, '$' is not special. */
- /* FALL THROUGH */
- default:
- if (*p != *s)
- return (0);
- break;
- }
- ++p;
- ++s;
- }
-}
-
-/* Main entry point. */
-int
-pathmatch(const char *p, const char *s, int flags)
-{
- /* Empty pattern only matches the empty string. */
- if (p == NULL || *p == '\0')
- return (s == NULL || *s == '\0');
-
- /* Leading '^' anchors the start of the pattern. */
- if (*p == '^') {
- ++p;
- flags &= ~PATHMATCH_NO_ANCHOR_START;
- }
-
- if (*p == '/' && *s != '/')
- return (0);
-
- /* Certain patterns and file names anchor implicitly. */
- if (*p == '*' || *p == '/' || *p == '/') {
- while (*p == '/')
- ++p;
- while (*s == '/')
- ++s;
- return (pm(p, s, flags));
- }
-
- /* If start is unanchored, try to match start of each path element. */
- if (flags & PATHMATCH_NO_ANCHOR_START) {
- for ( ; s != NULL; s = strchr(s, '/')) {
- if (*s == '/')
- s++;
- if (pm(p, s, flags))
- return (1);
- }
- return (0);
- }
-
- /* Default: Match from beginning. */
- return (pm(p, s, flags));
-}
diff --git a/usr.bin/cpio/test/Makefile b/usr.bin/cpio/test/Makefile
index 111864e..e1b94f1 100644
--- a/usr.bin/cpio/test/Makefile
+++ b/usr.bin/cpio/test/Makefile
@@ -2,24 +2,30 @@
# Where to find the cpio sources (for the internal unit tests)
CPIO_SRCDIR=${.CURDIR}/..
-.PATH: ${CPIO_SRCDIR}
-# Some cpio sources are pulled in for white-box tests
-CPIO_SRCS= cmdline.c err.c pathmatch.c
+.PATH: ${CPIO_SRCDIR}
+CPIO_SRCS= cmdline.c
+
+.PATH: ${.CURDIR}/../../../lib/libarchive/libarchive_fe
+CPIO_SRCS+= err.c pathmatch.c
TESTS= \
test_0.c \
test_basic.c \
test_format_newc.c \
test_gcpio_compat.c \
+ test_option_B_upper.c \
+ test_option_C_upper.c \
+ test_option_J_upper.c \
+ test_option_L_upper.c \
+ test_option_Z_upper.c \
test_option_a.c \
- test_option_B.c \
test_option_c.c \
test_option_d.c \
test_option_f.c \
test_option_help.c \
- test_option_L.c \
- test_option_ell.c \
+ test_option_l.c \
+ test_option_lzma.c \
test_option_m.c \
test_option_t.c \
test_option_u.c \
@@ -46,9 +52,11 @@ DPADD=${LIBARCHIVE} ${LIBBZ2} ${LIBZ} ${LIBLZMA}
CFLAGS+= -DPLATFORM_CONFIG_H=\"config_freebsd.h\"
CFLAGS+= -I..
LDADD= -larchive -lz -lbz2 -llzma
-CFLAGS+= -static -g -O2 -Wall
+#CFLAGS+= -static -g -O2 -Wall
+CFLAGS+= -g -O2 -Wall
CFLAGS+= -I${.OBJDIR}
CFLAGS+= -I${CPIO_SRCDIR}
+CFLAGS+= -I${.CURDIR}/../../../lib/libarchive/libarchive_fe
# Uncomment to link against dmalloc
#LDADD+= -L/usr/local/lib -ldmalloc
diff --git a/usr.bin/cpio/test/main.c b/usr.bin/cpio/test/main.c
index 5a51752..bca4c96 100644
--- a/usr.bin/cpio/test/main.c
+++ b/usr.bin/cpio/test/main.c
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2003-2007 Tim Kientzle
+ * Copyright (c) 2003-2009 Tim Kientzle
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
@@ -23,12 +23,7 @@
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
-/*
- * Various utility routines useful for test programs.
- * Each test program is linked against this file.
- */
#include "test.h"
-
#include <errno.h>
#include <locale.h>
#include <stdarg.h>
@@ -38,149 +33,318 @@
* This same file is used pretty much verbatim for all test harnesses.
*
* The next few lines are the only differences.
+ * TODO: Move this into a separate configuration header, have all test
+ * suites share one copy of this file.
*/
-#define PROGRAM "bsdcpio" /* Name of program being tested. */
+__FBSDID("$FreeBSD$");
+#define KNOWNREF "test_option_f.cpio.uu"
#define ENVBASE "BSDCPIO" /* Prefix for environment variables. */
+#define PROGRAM "bsdcpio" /* Name of program being tested. */
+#undef LIBRARY /* Not testing a library. */
#undef EXTRA_DUMP /* How to dump extra data */
/* How to generate extra version info. */
#define EXTRA_VERSION (systemf("%s --version", testprog) ? "" : "")
-#define KNOWNREF "test_option_f.cpio.uu"
-__FBSDID("$FreeBSD$");
/*
- * "list.h" is simply created by "grep DEFINE_TEST"; it has
- * a line like
- * DEFINE_TEST(test_function)
- * for each test.
- * Include it here with a suitable DEFINE_TEST to declare all of the
- * test functions.
+ *
+ * Windows support routines
+ *
+ * Note: Configuration is a tricky issue. Using HAVE_* feature macros
+ * in the test harness is dangerous because they cover up
+ * configuration errors. The classic example of this is omitting a
+ * configure check. If libarchive and libarchive_test both look for
+ * the same feature macro, such errors are hard to detect. Platform
+ * macros (e.g., _WIN32 or __GNUC__) are a little better, but can
+ * easily lead to very messy code. It's best to limit yourself
+ * to only the most generic programming techniques in the test harness
+ * and thus avoid conditionals altogether. Where that's not possible,
+ * try to minimize conditionals by grouping platform-specific tests in
+ * one place (e.g., test_acl_freebsd) or by adding new assert()
+ * functions (e.g., assertMakeHardlink()) to cover up platform
+ * differences. Platform-specific coding in libarchive_test is often
+ * a symptom that some capability is missing from libarchive itself.
*/
-#undef DEFINE_TEST
-#define DEFINE_TEST(name) void name(void);
-#include "list.h"
+#if defined(_WIN32) && !defined(__CYGWIN__)
+#include <io.h>
+#include <windows.h>
+#ifndef F_OK
+#define F_OK (0)
+#endif
+#ifndef S_ISDIR
+#define S_ISDIR(m) ((m) & _S_IFDIR)
+#endif
+#ifndef S_ISREG
+#define S_ISREG(m) ((m) & _S_IFREG)
+#endif
+#if !defined(__BORLANDC__)
+#define access _access
+#define chdir _chdir
+#endif
+#ifndef fileno
+#define fileno _fileno
+#endif
+/*#define fstat _fstat64*/
+#if !defined(__BORLANDC__)
+#define getcwd _getcwd
+#endif
+#define lstat stat
+/*#define lstat _stat64*/
+/*#define stat _stat64*/
+#define rmdir _rmdir
+#if !defined(__BORLANDC__)
+#define strdup _strdup
+#define umask _umask
+#endif
+#define int64_t __int64
+#endif
+
+#if defined(HAVE__CrtSetReportMode)
+# include <crtdbg.h>
+#endif
+
+#if defined(_WIN32) && !defined(__CYGWIN__)
+void *GetFunctionKernel32(const char *name)
+{
+ static HINSTANCE lib;
+ static int set;
+ if (!set) {
+ set = 1;
+ lib = LoadLibrary("kernel32.dll");
+ }
+ if (lib == NULL) {
+ fprintf(stderr, "Can't load kernel32.dll?!\n");
+ exit(1);
+ }
+ return (void *)GetProcAddress(lib, name);
+}
+
+static int
+my_CreateSymbolicLinkA(const char *linkname, const char *target, int flags)
+{
+ static BOOLEAN (WINAPI *f)(LPCSTR, LPCSTR, DWORD);
+ static int set;
+ if (!set) {
+ set = 1;
+ f = GetFunctionKernel32("CreateSymbolicLinkA");
+ }
+ return f == NULL ? 0 : (*f)(linkname, target, flags);
+}
+
+static int
+my_CreateHardLinkA(const char *linkname, const char *target)
+{
+ static BOOLEAN (WINAPI *f)(LPCSTR, LPCSTR, LPSECURITY_ATTRIBUTES);
+ static int set;
+ if (!set) {
+ set = 1;
+ f = GetFunctionKernel32("CreateHardLinkA");
+ }
+ return f == NULL ? 0 : (*f)(linkname, target, NULL);
+}
+
+int
+my_GetFileInformationByName(const char *path, BY_HANDLE_FILE_INFORMATION *bhfi)
+{
+ HANDLE h;
+ int r;
+
+ memset(bhfi, 0, sizeof(*bhfi));
+ h = CreateFile(path, FILE_READ_ATTRIBUTES, 0, NULL,
+ OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
+ if (h == INVALID_HANDLE_VALUE)
+ return (0);
+ r = GetFileInformationByHandle(h, bhfi);
+ CloseHandle(h);
+ return (r);
+}
+#endif
-/* Interix doesn't define these in a standard header. */
-#if __INTERIX__
-extern char *optarg;
-extern int optind;
+#if defined(HAVE__CrtSetReportMode)
+static void
+invalid_parameter_handler(const wchar_t * expression,
+ const wchar_t * function, const wchar_t * file,
+ unsigned int line, uintptr_t pReserved)
+{
+ /* nop */
+}
#endif
+/*
+ *
+ * OPTIONS FLAGS
+ *
+ */
+
/* Enable core dump on failure. */
static int dump_on_failure = 0;
-/* Default is to remove temp dirs for successful tests. */
+/* Default is to remove temp dirs and log data for successful tests. */
static int keep_temp_files = 0;
-/* Default is to print some basic information about each test. */
-static int quiet_flag = 0;
-/* Default is to summarize repeated failures. */
-static int verbose = 0;
-/* Cumulative count of component failures. */
+/* Default is to just report pass/fail for each test. */
+static int verbosity = 0;
+#define VERBOSITY_SUMMARY_ONLY -1 /* -q */
+#define VERBOSITY_PASSFAIL 0 /* Default */
+#define VERBOSITY_LIGHT_REPORT 1 /* -v */
+#define VERBOSITY_FULL 2 /* -vv */
+/* A few places generate even more output for verbosity > VERBOSITY_FULL,
+ * mostly for debugging the test harness itself. */
+/* Cumulative count of assertion failures. */
static int failures = 0;
-/* Cumulative count of skipped component tests. */
+/* Cumulative count of reported skips. */
static int skips = 0;
-/* Cumulative count of assertions. */
+/* Cumulative count of assertions checked. */
static int assertions = 0;
/* Directory where uuencoded reference files can be found. */
static const char *refdir;
/*
- * My own implementation of the standard assert() macro emits the
- * message in the same format as GCC (file:line: message).
- * It also includes some additional useful information.
- * This makes it a lot easier to skim through test failures in
- * Emacs. ;-)
- *
- * It also supports a few special features specifically to simplify
- * test harnesses:
- * failure(fmt, args) -- Stores a text string that gets
- * printed if the following assertion fails, good for
- * explaining subtle tests.
- */
-static char msg[4096];
-
-/*
- * For each test source file, we remember how many times each
- * failure was reported.
- */
-static const char *failed_filename = NULL;
-static struct line {
- int line;
- int count;
-} failed_lines[1000];
-
-/*
- * Count this failure; return the number of previous failures.
+ * Report log information selectively to console and/or disk log.
*/
-static int
-previous_failures(const char *filename, int line)
+static int log_console = 0;
+static FILE *logfile;
+static void
+vlogprintf(const char *fmt, va_list ap)
{
- unsigned int i;
- int count;
+#ifdef va_copy
+ va_list lfap;
+ va_copy(lfap, ap);
+#endif
+ if (log_console)
+ vfprintf(stdout, fmt, ap);
+ if (logfile != NULL)
+#ifdef va_copy
+ vfprintf(logfile, fmt, lfap);
+ va_end(lfap);
+#else
+ vfprintf(logfile, fmt, ap);
+#endif
+}
- if (failed_filename == NULL || strcmp(failed_filename, filename) != 0)
- memset(failed_lines, 0, sizeof(failed_lines));
- failed_filename = filename;
+static void
+logprintf(const char *fmt, ...)
+{
+ va_list ap;
+ va_start(ap, fmt);
+ vlogprintf(fmt, ap);
+ va_end(ap);
+}
- for (i = 0; i < sizeof(failed_lines)/sizeof(failed_lines[0]); i++) {
- if (failed_lines[i].line == line) {
- count = failed_lines[i].count;
- failed_lines[i].count++;
- return (count);
- }
- if (failed_lines[i].line == 0) {
- failed_lines[i].line = line;
- failed_lines[i].count = 1;
- return (0);
- }
- }
- return (0);
+/* Set up a message to display only if next assertion fails. */
+static char msgbuff[4096];
+static const char *msg, *nextmsg;
+void
+failure(const char *fmt, ...)
+{
+ va_list ap;
+ va_start(ap, fmt);
+ vsprintf(msgbuff, fmt, ap);
+ va_end(ap);
+ nextmsg = msgbuff;
}
/*
* Copy arguments into file-local variables.
+ * This was added to permit vararg assert() functions without needing
+ * variadic wrapper macros. Turns out that the vararg capability is almost
+ * never used, so almost all of the vararg assertions can be simplified
+ * by removing the vararg capability and reworking the wrapper macro to
+ * pass __FILE__, __LINE__ directly into the function instead of using
+ * this hook. I suspect this machinery is used so rarely that we
+ * would be better off just removing it entirely. That would simplify
+ * the code here noticably.
*/
static const char *test_filename;
static int test_line;
static void *test_extra;
-void test_setup(const char *filename, int line)
+void assertion_setup(const char *filename, int line)
{
test_filename = filename;
test_line = line;
}
+/* Called at the beginning of each assert() function. */
+static void
+assertion_count(const char *file, int line)
+{
+ (void)file; /* UNUSED */
+ (void)line; /* UNUSED */
+ ++assertions;
+ /* Proper handling of "failure()" message. */
+ msg = nextmsg;
+ nextmsg = NULL;
+ /* Uncomment to print file:line after every assertion.
+ * Verbose, but occasionally useful in tracking down crashes. */
+ /* printf("Checked %s:%d\n", file, line); */
+}
+
/*
- * Inform user that we're skipping a test.
+ * For each test source file, we remember how many times each
+ * assertion was reported. Cleared before each new test,
+ * used by test_summarize().
*/
-void
-test_skipping(const char *fmt, ...)
+static struct line {
+ int count;
+ int skip;
+} failed_lines[10000];
+
+/* Count this failure, setup up log destination and handle initial report. */
+static void
+failure_start(const char *filename, int line, const char *fmt, ...)
{
va_list ap;
- if (previous_failures(test_filename, test_line))
- return;
+ /* Record another failure for this line. */
+ ++failures;
+ /* test_filename = filename; */
+ failed_lines[line].count++;
+ /* Determine whether to log header to console. */
+ switch (verbosity) {
+ case VERBOSITY_FULL:
+ log_console = 1;
+ break;
+ case VERBOSITY_LIGHT_REPORT:
+ log_console = (failed_lines[line].count < 2);
+ break;
+ default:
+ log_console = 0;
+ }
+
+ /* Log file:line header for this failure */
va_start(ap, fmt);
- fprintf(stderr, " *** SKIPPING: ");
- vfprintf(stderr, fmt, ap);
- fprintf(stderr, "\n");
+#if _MSC_VER
+ logprintf("%s(%d): ", filename, line);
+#else
+ logprintf("%s:%d: ", filename, line);
+#endif
+ vlogprintf(fmt, ap);
va_end(ap);
- ++skips;
+ logprintf("\n");
+
+ if (msg != NULL && msg[0] != '\0') {
+ logprintf(" Description: %s\n", msg);
+ msg = NULL;
+ }
+
+ /* Determine whether to log details to console. */
+ if (verbosity == VERBOSITY_LIGHT_REPORT)
+ log_console = 0;
}
-/* Common handling of failed tests. */
+/* Complete reporting of failed tests. */
+/*
+ * The 'extra' hook here is used by libarchive to include libarchive
+ * error messages with assertion failures. It could also be used
+ * to add strerror() output, for example. Just define the EXTRA_DUMP()
+ * macro appropriately.
+ */
static void
-report_failure(void *extra)
+failure_finish(void *extra)
{
- if (msg[0] != '\0') {
- fprintf(stderr, " Description: %s\n", msg);
- msg[0] = '\0';
- }
-
+ (void)extra; /* UNUSED (maybe) */
#ifdef EXTRA_DUMP
if (extra != NULL)
- fprintf(stderr, " detail: %s\n", EXTRA_DUMP(extra));
-#else
- (void)extra; /* UNUSED */
+ logprintf(" detail: %s\n", EXTRA_DUMP(extra));
#endif
if (dump_on_failure) {
@@ -191,203 +355,170 @@ report_failure(void *extra)
}
}
-/*
- * Summarize repeated failures in the just-completed test file.
- * The reports above suppress multiple failures from the same source
- * line; this reports on any tests that did fail multiple times.
- */
-static int
-summarize_comparator(const void *a0, const void *b0)
-{
- const struct line *a = a0, *b = b0;
- if (a->line == 0 && b->line == 0)
- return (0);
- if (a->line == 0)
- return (1);
- if (b->line == 0)
- return (-1);
- return (a->line - b->line);
-}
-
-static void
-summarize(void)
-{
- unsigned int i;
-
- qsort(failed_lines, sizeof(failed_lines)/sizeof(failed_lines[0]),
- sizeof(failed_lines[0]), summarize_comparator);
- for (i = 0; i < sizeof(failed_lines)/sizeof(failed_lines[0]); i++) {
- if (failed_lines[i].line == 0)
- break;
- if (failed_lines[i].count > 1)
- fprintf(stderr, "%s:%d: Failed %d times\n",
- failed_filename, failed_lines[i].line,
- failed_lines[i].count);
- }
- /* Clear the failure history for the next file. */
- memset(failed_lines, 0, sizeof(failed_lines));
-}
-
-/* Set up a message to display only after a test fails. */
+/* Inform user that we're skipping some checks. */
void
-failure(const char *fmt, ...)
+test_skipping(const char *fmt, ...)
{
+ char buff[1024];
va_list ap;
+
va_start(ap, fmt);
- vsprintf(msg, fmt, ap);
+ vsprintf(buff, fmt, ap);
va_end(ap);
+ /* failure_start() isn't quite right, but is awfully convenient. */
+ failure_start(test_filename, test_line, "SKIPPING: %s", buff);
+ --failures; /* Undo failures++ in failure_start() */
+ /* Don't failure_finish() here. */
+ /* Mark as skip, so doesn't count as failed test. */
+ failed_lines[test_line].skip = 1;
+ ++skips;
}
+/*
+ *
+ * ASSERTIONS
+ *
+ */
+
/* Generic assert() just displays the failed condition. */
int
-test_assert(const char *file, int line, int value, const char *condition, void *extra)
+assertion_assert(const char *file, int line, int value,
+ const char *condition, void *extra)
{
- ++assertions;
- if (value) {
- msg[0] = '\0';
- return (value);
+ assertion_count(file, line);
+ if (!value) {
+ failure_start(file, line, "Assertion failed: %s", condition);
+ failure_finish(extra);
}
- failures ++;
- if (!verbose && previous_failures(file, line))
- return (value);
- fprintf(stderr, "%s:%d: Assertion failed\n", file, line);
- fprintf(stderr, " Condition: %s\n", condition);
- report_failure(extra);
return (value);
}
-/* assertEqualInt() displays the values of the two integers. */
+/* chdir() and report any errors */
int
-test_assert_equal_int(const char *file, int line,
- int v1, const char *e1, int v2, const char *e2, void *extra)
+assertion_chdir(const char *file, int line, const char *pathname)
{
- ++assertions;
- if (v1 == v2) {
- msg[0] = '\0';
+ assertion_count(file, line);
+ if (chdir(pathname) == 0)
return (1);
- }
- failures ++;
- if (!verbose && previous_failures(file, line))
- return (0);
- fprintf(stderr, "%s:%d: Assertion failed: Ints not equal\n",
- file, line);
- fprintf(stderr, " %s=%d\n", e1, v1);
- fprintf(stderr, " %s=%d\n", e2, v2);
- report_failure(extra);
+ failure_start(file, line, "chdir(\"%s\")", pathname);
+ failure_finish(NULL);
return (0);
+
}
-static void strdump(const char *p)
+/* Verify two integers are equal. */
+int
+assertion_equal_int(const char *file, int line,
+ long long v1, const char *e1, long long v2, const char *e2, void *extra)
+{
+ assertion_count(file, line);
+ if (v1 == v2)
+ return (1);
+ failure_start(file, line, "%s != %s", e1, e2);
+ logprintf(" %s=%lld (0x%llx, 0%llo)\n", e1, v1, v1, v1);
+ logprintf(" %s=%lld (0x%llx, 0%llo)\n", e2, v2, v2, v2);
+ failure_finish(extra);
+ return (0);
+}
+
+static void strdump(const char *e, const char *p)
{
+ const char *q = p;
+
+ logprintf(" %s = ", e);
if (p == NULL) {
- fprintf(stderr, "(null)");
+ logprintf("NULL");
return;
}
- fprintf(stderr, "\"");
+ logprintf("\"");
while (*p != '\0') {
unsigned int c = 0xff & *p++;
switch (c) {
- case '\a': fprintf(stderr, "\a"); break;
- case '\b': fprintf(stderr, "\b"); break;
- case '\n': fprintf(stderr, "\n"); break;
- case '\r': fprintf(stderr, "\r"); break;
+ case '\a': printf("\a"); break;
+ case '\b': printf("\b"); break;
+ case '\n': printf("\n"); break;
+ case '\r': printf("\r"); break;
default:
if (c >= 32 && c < 127)
- fprintf(stderr, "%c", c);
+ logprintf("%c", c);
else
- fprintf(stderr, "\\x%02X", c);
+ logprintf("\\x%02X", c);
}
}
- fprintf(stderr, "\"");
+ logprintf("\"");
+ logprintf(" (length %d)\n", q == NULL ? -1 : (int)strlen(q));
}
-/* assertEqualString() displays the values of the two strings. */
+/* Verify two strings are equal, dump them if not. */
int
-test_assert_equal_string(const char *file, int line,
+assertion_equal_string(const char *file, int line,
const char *v1, const char *e1,
const char *v2, const char *e2,
void *extra)
{
- ++assertions;
- if (v1 == NULL || v2 == NULL) {
- if (v1 == v2) {
- msg[0] = '\0';
- return (1);
- }
- } else if (strcmp(v1, v2) == 0) {
- msg[0] = '\0';
+ assertion_count(file, line);
+ if (v1 == v2 || (v1 != NULL && v2 != NULL && strcmp(v1, v2) == 0))
return (1);
- }
- failures ++;
- if (!verbose && previous_failures(file, line))
- return (0);
- fprintf(stderr, "%s:%d: Assertion failed: Strings not equal\n",
- file, line);
- fprintf(stderr, " %s = ", e1);
- strdump(v1);
- fprintf(stderr, " (length %d)\n", v1 == NULL ? 0 : (int)strlen(v1));
- fprintf(stderr, " %s = ", e2);
- strdump(v2);
- fprintf(stderr, " (length %d)\n", v2 == NULL ? 0 : (int)strlen(v2));
- report_failure(extra);
+ failure_start(file, line, "%s != %s", e1, e2);
+ strdump(e1, v1);
+ strdump(e2, v2);
+ failure_finish(extra);
return (0);
}
-static void wcsdump(const wchar_t *w)
+static void
+wcsdump(const char *e, const wchar_t *w)
{
+ logprintf(" %s = ", e);
if (w == NULL) {
- fprintf(stderr, "(null)");
+ logprintf("(null)");
return;
}
- fprintf(stderr, "\"");
+ logprintf("\"");
while (*w != L'\0') {
unsigned int c = *w++;
if (c >= 32 && c < 127)
- fprintf(stderr, "%c", c);
+ logprintf("%c", c);
else if (c < 256)
- fprintf(stderr, "\\x%02X", c);
+ logprintf("\\x%02X", c);
else if (c < 0x10000)
- fprintf(stderr, "\\u%04X", c);
+ logprintf("\\u%04X", c);
else
- fprintf(stderr, "\\U%08X", c);
+ logprintf("\\U%08X", c);
}
- fprintf(stderr, "\"");
+ logprintf("\"\n");
}
-/* assertEqualWString() displays the values of the two strings. */
+#ifndef HAVE_WCSCMP
+static int
+wcscmp(const wchar_t *s1, const wchar_t *s2)
+{
+
+ while (*s1 == *s2++) {
+ if (*s1++ == L'\0')
+ return 0;
+ }
+ if (*s1 > *--s2)
+ return 1;
+ else
+ return -1;
+}
+#endif
+
+/* Verify that two wide strings are equal, dump them if not. */
int
-test_assert_equal_wstring(const char *file, int line,
+assertion_equal_wstring(const char *file, int line,
const wchar_t *v1, const char *e1,
const wchar_t *v2, const char *e2,
void *extra)
{
- ++assertions;
- if (v1 == NULL) {
- if (v2 == NULL) {
- msg[0] = '\0';
- return (1);
- }
- } else if (v2 == NULL) {
- if (v1 == NULL) {
- msg[0] = '\0';
- return (1);
- }
- } else if (wcscmp(v1, v2) == 0) {
- msg[0] = '\0';
+ assertion_count(file, line);
+ if (v1 == v2 || wcscmp(v1, v2) == 0)
return (1);
- }
- failures ++;
- if (!verbose && previous_failures(file, line))
- return (0);
- fprintf(stderr, "%s:%d: Assertion failed: Unicode strings not equal\n",
- file, line);
- fprintf(stderr, " %s = ", e1);
- wcsdump(v1);
- fprintf(stderr, "\n");
- fprintf(stderr, " %s = ", e2);
- wcsdump(v2);
- fprintf(stderr, "\n");
- report_failure(extra);
+ failure_start(file, line, "%s != %s", e1, e2);
+ wcsdump(e1, v1);
+ wcsdump(e2, v2);
+ failure_finish(extra);
return (0);
}
@@ -402,249 +533,294 @@ hexdump(const char *p, const char *ref, size_t l, size_t offset)
size_t i, j;
char sep;
+ if (p == NULL) {
+ logprintf("(null)\n");
+ return;
+ }
for(i=0; i < l; i+=16) {
- fprintf(stderr, "%04x", (unsigned)(i + offset));
+ logprintf("%04x", (unsigned)(i + offset));
sep = ' ';
for (j = 0; j < 16 && i + j < l; j++) {
if (ref != NULL && p[i + j] != ref[i + j])
sep = '_';
- fprintf(stderr, "%c%02x", sep, 0xff & (int)p[i+j]);
+ logprintf("%c%02x", sep, 0xff & (int)p[i+j]);
if (ref != NULL && p[i + j] == ref[i + j])
sep = ' ';
}
for (; j < 16; j++) {
- fprintf(stderr, "%c ", sep);
+ logprintf("%c ", sep);
sep = ' ';
}
- fprintf(stderr, "%c", sep);
+ logprintf("%c", sep);
for (j=0; j < 16 && i + j < l; j++) {
int c = p[i + j];
if (c >= ' ' && c <= 126)
- fprintf(stderr, "%c", c);
+ logprintf("%c", c);
else
- fprintf(stderr, ".");
+ logprintf(".");
}
- fprintf(stderr, "\n");
+ logprintf("\n");
}
}
-/* assertEqualMem() displays the values of the two memory blocks. */
-/* TODO: For long blocks, hexdump the first bytes that actually differ. */
+/* Verify that two blocks of memory are the same, display the first
+ * block of differences if they're not. */
int
-test_assert_equal_mem(const char *file, int line,
- const char *v1, const char *e1,
- const char *v2, const char *e2,
+assertion_equal_mem(const char *file, int line,
+ const void *_v1, const char *e1,
+ const void *_v2, const char *e2,
size_t l, const char *ld, void *extra)
{
- ++assertions;
- if (v1 == NULL || v2 == NULL) {
- if (v1 == v2) {
- msg[0] = '\0';
- return (1);
- }
- } else if (memcmp(v1, v2, l) == 0) {
- msg[0] = '\0';
+ const char *v1 = (const char *)_v1;
+ const char *v2 = (const char *)_v2;
+ size_t offset;
+
+ assertion_count(file, line);
+ if (v1 == v2 || (v1 != NULL && v2 != NULL && memcmp(v1, v2, l) == 0))
return (1);
+
+ failure_start(file, line, "%s != %s", e1, e2);
+ logprintf(" size %s = %d\n", ld, (int)l);
+ /* Dump 48 bytes (3 lines) so that the first difference is
+ * in the second line. */
+ offset = 0;
+ while (l > 64 && memcmp(v1, v2, 32) == 0) {
+ /* Two lines agree, so step forward one line. */
+ v1 += 16;
+ v2 += 16;
+ l -= 16;
+ offset += 16;
}
- failures ++;
- if (!verbose && previous_failures(file, line))
- return (0);
- fprintf(stderr, "%s:%d: Assertion failed: memory not equal\n",
- file, line);
- fprintf(stderr, " size %s = %d\n", ld, (int)l);
- fprintf(stderr, " Dump of %s\n", e1);
- hexdump(v1, v2, l < 32 ? l : 32, 0);
- fprintf(stderr, " Dump of %s\n", e2);
- hexdump(v2, v1, l < 32 ? l : 32, 0);
- fprintf(stderr, "\n");
- report_failure(extra);
+ logprintf(" Dump of %s\n", e1);
+ hexdump(v1, v2, l < 64 ? l : 64, offset);
+ logprintf(" Dump of %s\n", e2);
+ hexdump(v2, v1, l < 64 ? l : 64, offset);
+ logprintf("\n");
+ failure_finish(extra);
return (0);
}
+/* Verify that the named file exists and is empty. */
int
-test_assert_empty_file(const char *f1fmt, ...)
+assertion_empty_file(const char *f1fmt, ...)
{
char buff[1024];
char f1[1024];
struct stat st;
va_list ap;
ssize_t s;
- int fd;
-
+ FILE *f;
+ assertion_count(test_filename, test_line);
va_start(ap, f1fmt);
vsprintf(f1, f1fmt, ap);
va_end(ap);
if (stat(f1, &st) != 0) {
- fprintf(stderr, "%s:%d: Could not stat: %s\n", test_filename, test_line, f1);
- report_failure(NULL);
+ failure_start(test_filename, test_line, "Stat failed: %s", f1);
+ failure_finish(NULL);
return (0);
}
if (st.st_size == 0)
return (1);
- failures ++;
- if (!verbose && previous_failures(test_filename, test_line))
- return (0);
-
- fprintf(stderr, "%s:%d: File not empty: %s\n", test_filename, test_line, f1);
- fprintf(stderr, " File size: %d\n", (int)st.st_size);
- fprintf(stderr, " Contents:\n");
- fd = open(f1, O_RDONLY);
- if (fd < 0) {
- fprintf(stderr, " Unable to open %s\n", f1);
+ failure_start(test_filename, test_line, "File should be empty: %s", f1);
+ logprintf(" File size: %d\n", (int)st.st_size);
+ logprintf(" Contents:\n");
+ f = fopen(f1, "rb");
+ if (f == NULL) {
+ logprintf(" Unable to open %s\n", f1);
} else {
- s = sizeof(buff) < st.st_size ? sizeof(buff) : st.st_size;
- s = read(fd, buff, s);
+ s = ((off_t)sizeof(buff) < st.st_size) ?
+ (ssize_t)sizeof(buff) : (ssize_t)st.st_size;
+ s = fread(buff, 1, s, f);
hexdump(buff, NULL, s, 0);
- close(fd);
+ fclose(f);
}
- report_failure(NULL);
+ failure_finish(NULL);
return (0);
}
-/* assertEqualFile() asserts that two files have the same contents. */
+/* Verify that the named file exists and is not empty. */
+int
+assertion_non_empty_file(const char *f1fmt, ...)
+{
+ char f1[1024];
+ struct stat st;
+ va_list ap;
+
+ assertion_count(test_filename, test_line);
+ va_start(ap, f1fmt);
+ vsprintf(f1, f1fmt, ap);
+ va_end(ap);
+
+ if (stat(f1, &st) != 0) {
+ failure_start(test_filename, test_line, "Stat failed: %s", f1);
+ failure_finish(NULL);
+ return (0);
+ }
+ if (st.st_size == 0) {
+ failure_start(test_filename, test_line, "File empty: %s", f1);
+ failure_finish(NULL);
+ return (0);
+ }
+ return (1);
+}
+
+/* Verify that two files have the same contents. */
/* TODO: hexdump the first bytes that actually differ. */
int
-test_assert_equal_file(const char *f1, const char *f2pattern, ...)
+assertion_equal_file(const char *fn1, const char *f2pattern, ...)
{
- char f2[1024];
+ char fn2[1024];
va_list ap;
char buff1[1024];
char buff2[1024];
- int fd1, fd2;
+ FILE *f1, *f2;
int n1, n2;
+ assertion_count(test_filename, test_line);
va_start(ap, f2pattern);
- vsprintf(f2, f2pattern, ap);
+ vsprintf(fn2, f2pattern, ap);
va_end(ap);
- fd1 = open(f1, O_RDONLY);
- fd2 = open(f2, O_RDONLY);
+ f1 = fopen(fn1, "rb");
+ f2 = fopen(fn2, "rb");
for (;;) {
- n1 = read(fd1, buff1, sizeof(buff1));
- n2 = read(fd2, buff2, sizeof(buff2));
+ n1 = fread(buff1, 1, sizeof(buff1), f1);
+ n2 = fread(buff2, 1, sizeof(buff2), f2);
if (n1 != n2)
break;
if (n1 == 0 && n2 == 0) {
- close(fd1);
- close(fd2);
+ fclose(f1);
+ fclose(f2);
return (1);
}
if (memcmp(buff1, buff2, n1) != 0)
break;
}
- close(fd1);
- close(fd2);
- failures ++;
- if (!verbose && previous_failures(test_filename, test_line))
- return (0);
- fprintf(stderr, "%s:%d: Files are not identical\n",
- test_filename, test_line);
- fprintf(stderr, " file1=\"%s\"\n", f1);
- fprintf(stderr, " file2=\"%s\"\n", f2);
- report_failure(test_extra);
+ fclose(f1);
+ fclose(f2);
+ failure_start(test_filename, test_line, "Files not identical");
+ logprintf(" file1=\"%s\"\n", fn1);
+ logprintf(" file2=\"%s\"\n", fn2);
+ failure_finish(test_extra);
return (0);
}
+/* Verify that the named file does exist. */
int
-test_assert_file_exists(const char *fpattern, ...)
+assertion_file_exists(const char *fpattern, ...)
{
char f[1024];
va_list ap;
+ assertion_count(test_filename, test_line);
va_start(ap, fpattern);
vsprintf(f, fpattern, ap);
va_end(ap);
+#if defined(_WIN32) && !defined(__CYGWIN__)
+ if (!_access(f, 0))
+ return (1);
+#else
if (!access(f, F_OK))
return (1);
- if (!previous_failures(test_filename, test_line)) {
- fprintf(stderr, "%s:%d: File doesn't exist\n",
- test_filename, test_line);
- fprintf(stderr, " file=\"%s\"\n", f);
- report_failure(test_extra);
- }
+#endif
+ failure_start(test_filename, test_line, "File should exist: %s", f);
+ failure_finish(test_extra);
return (0);
}
+/* Verify that the named file doesn't exist. */
int
-test_assert_file_not_exists(const char *fpattern, ...)
+assertion_file_not_exists(const char *fpattern, ...)
{
char f[1024];
va_list ap;
+ assertion_count(test_filename, test_line);
va_start(ap, fpattern);
vsprintf(f, fpattern, ap);
va_end(ap);
+#if defined(_WIN32) && !defined(__CYGWIN__)
+ if (_access(f, 0))
+ return (1);
+#else
if (access(f, F_OK))
return (1);
- if (!previous_failures(test_filename, test_line)) {
- fprintf(stderr, "%s:%d: File exists and shouldn't\n",
- test_filename, test_line);
- fprintf(stderr, " file=\"%s\"\n", f);
- report_failure(test_extra);
- }
+#endif
+ failure_start(test_filename, test_line, "File should not exist: %s", f);
+ failure_finish(test_extra);
return (0);
}
-/* assertFileContents() asserts the contents of a file. */
+/* Compare the contents of a file to a block of memory. */
int
-test_assert_file_contents(const void *buff, int s, const char *fpattern, ...)
+assertion_file_contents(const void *buff, int s, const char *fpattern, ...)
{
- char f[1024];
+ char fn[1024];
va_list ap;
char *contents;
- int fd;
+ FILE *f;
int n;
+ assertion_count(test_filename, test_line);
va_start(ap, fpattern);
- vsprintf(f, fpattern, ap);
+ vsprintf(fn, fpattern, ap);
va_end(ap);
- fd = open(f, O_RDONLY);
- contents = malloc(s * 2 + 128);
- n = read(fd, contents, s * 2 + 128);
- close(fd);
+ f = fopen(fn, "rb");
+ if (f == NULL) {
+ failure_start(test_filename, test_line,
+ "File should exist: %s", fn);
+ failure_finish(test_extra);
+ return (0);
+ }
+ contents = malloc(s * 2);
+ n = fread(contents, 1, s * 2, f);
+ fclose(f);
if (n == s && memcmp(buff, contents, s) == 0) {
free(contents);
return (1);
}
- failures ++;
- if (!previous_failures(test_filename, test_line)) {
- fprintf(stderr, "%s:%d: File contents don't match\n",
- test_filename, test_line);
- fprintf(stderr, " file=\"%s\"\n", f);
- if (n > 0)
- hexdump(contents, buff, n, 0);
- else {
- fprintf(stderr, " File empty, contents should be:\n");
- hexdump(buff, NULL, s, 0);
- }
- report_failure(test_extra);
+ failure_start(test_filename, test_line, "File contents don't match");
+ logprintf(" file=\"%s\"\n", fn);
+ if (n > 0)
+ hexdump(contents, buff, n > 512 ? 512 : n, 0);
+ else {
+ logprintf(" File empty, contents should be:\n");
+ hexdump(buff, NULL, s > 512 ? 512 : n, 0);
}
+ failure_finish(test_extra);
free(contents);
return (0);
}
-/* assertTextFileContents() asserts the contents of a text file. */
+/* Check the contents of a text file, being tolerant of line endings. */
int
-test_assert_text_file_contents(const char *buff, const char *f)
+assertion_text_file_contents(const char *buff, const char *fn)
{
char *contents;
const char *btxt, *ftxt;
- int fd;
+ FILE *f;
int n, s;
- fd = open(f, O_RDONLY);
+ assertion_count(test_filename, test_line);
+ f = fopen(fn, "r");
+ if (f == NULL) {
+ failure_start(test_filename, test_line,
+ "File doesn't exist: %s", fn);
+ failure_finish(test_extra);
+ return (0);
+ }
s = strlen(buff);
contents = malloc(s * 2 + 128);
- n = read(fd, contents, s * 2 + 128 -1);
+ n = fread(contents, 1, s * 2 + 128 - 1, f);
if (n >= 0)
contents[n] = '\0';
- close(fd);
+ fclose(f);
/* Compare texts. */
btxt = buff;
ftxt = (const char *)contents;
@@ -666,23 +842,647 @@ test_assert_text_file_contents(const char *buff, const char *f)
free(contents);
return (1);
}
- failures ++;
- if (!previous_failures(test_filename, test_line)) {
- fprintf(stderr, "%s:%d: File contents don't match\n",
- test_filename, test_line);
- fprintf(stderr, " file=\"%s\"\n", f);
- if (n > 0)
- hexdump(contents, buff, n, 0);
- else {
- fprintf(stderr, " File empty, contents should be:\n");
- hexdump(buff, NULL, s, 0);
- }
- report_failure(test_extra);
+ failure_start(test_filename, test_line, "Contents don't match");
+ logprintf(" file=\"%s\"\n", fn);
+ if (n > 0)
+ hexdump(contents, buff, n, 0);
+ else {
+ logprintf(" File empty, contents should be:\n");
+ hexdump(buff, NULL, s, 0);
}
+ failure_finish(test_extra);
free(contents);
return (0);
}
+/* Test that two paths point to the same file. */
+/* As a side-effect, asserts that both files exist. */
+static int
+is_hardlink(const char *file, int line,
+ const char *path1, const char *path2)
+{
+#if defined(_WIN32) && !defined(__CYGWIN__)
+ BY_HANDLE_FILE_INFORMATION bhfi1, bhfi2;
+ int r;
+
+ assertion_count(file, line);
+ r = my_GetFileInformationByName(path1, &bhfi1);
+ if (r == 0) {
+ failure_start(file, line, "File %s can't be inspected?", path1);
+ failure_finish(NULL);
+ return (0);
+ }
+ r = my_GetFileInformationByName(path2, &bhfi2);
+ if (r == 0) {
+ failure_start(file, line, "File %s can't be inspected?", path2);
+ failure_finish(NULL);
+ return (0);
+ }
+ return (bhfi1.dwVolumeSerialNumber == bhfi2.dwVolumeSerialNumber
+ && bhfi1.nFileIndexHigh == bhfi2.nFileIndexHigh
+ && bhfi1.nFileIndexLow == bhfi2.nFileIndexLow);
+#else
+ struct stat st1, st2;
+ int r;
+
+ assertion_count(file, line);
+ r = lstat(path1, &st1);
+ if (r != 0) {
+ failure_start(file, line, "File should exist: %s", path1);
+ failure_finish(NULL);
+ return (0);
+ }
+ r = lstat(path2, &st2);
+ if (r != 0) {
+ failure_start(file, line, "File should exist: %s", path2);
+ failure_finish(NULL);
+ return (0);
+ }
+ return (st1.st_ino == st2.st_ino && st1.st_dev == st2.st_dev);
+#endif
+}
+
+int
+assertion_is_hardlink(const char *file, int line,
+ const char *path1, const char *path2)
+{
+ if (is_hardlink(file, line, path1, path2))
+ return (1);
+ failure_start(file, line,
+ "Files %s and %s are not hardlinked", path1, path2);
+ failure_finish(NULL);
+ return (0);
+}
+
+int
+assertion_is_not_hardlink(const char *file, int line,
+ const char *path1, const char *path2)
+{
+ if (!is_hardlink(file, line, path1, path2))
+ return (1);
+ failure_start(file, line,
+ "Files %s and %s should not be hardlinked", path1, path2);
+ failure_finish(NULL);
+ return (0);
+}
+
+/* Verify a/b/mtime of 'pathname'. */
+/* If 'recent', verify that it's within last 10 seconds. */
+static int
+assertion_file_time(const char *file, int line,
+ const char *pathname, long t, long nsec, char type, int recent)
+{
+ long long filet, filet_nsec;
+ int r;
+
+#if defined(_WIN32) && !defined(__CYGWIN__)
+#define EPOC_TIME (116444736000000000ULL)
+ FILETIME ftime, fbirthtime, fatime, fmtime;
+ ULARGE_INTEGER wintm;
+ HANDLE h;
+ ftime.dwLowDateTime = 0;
+ ftime.dwHighDateTime = 0;
+
+ assertion_count(file, line);
+ h = CreateFile(pathname, FILE_READ_ATTRIBUTES, 0, NULL,
+ OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
+ if (h == INVALID_HANDLE_VALUE) {
+ failure_start(file, line, "Can't access %s\n", pathname);
+ failure_finish(NULL);
+ return (0);
+ }
+ r = GetFileTime(h, &fbirthtime, &fatime, &fmtime);
+ switch (type) {
+ case 'a': ftime = fatime; break;
+ case 'b': ftime = fbirthtime; break;
+ case 'm': ftime = fmtime; break;
+ }
+ CloseHandle(h);
+ if (r == 0) {
+ failure_start(file, line, "Can't GetFileTime %s\n", pathname);
+ failure_finish(NULL);
+ return (0);
+ }
+ wintm.LowPart = ftime.dwLowDateTime;
+ wintm.HighPart = ftime.dwHighDateTime;
+ filet = (wintm.QuadPart - EPOC_TIME) / 10000000;
+ filet_nsec = ((wintm.QuadPart - EPOC_TIME) % 10000000) * 100;
+ nsec = (nsec / 100) * 100; /* Round the request */
+#else
+ struct stat st;
+
+ assertion_count(file, line);
+ r = lstat(pathname, &st);
+ if (r != 0) {
+ failure_start(file, line, "Can't stat %s\n", pathname);
+ failure_finish(NULL);
+ return (0);
+ }
+ switch (type) {
+ case 'a': filet = st.st_atime; break;
+ case 'm': filet = st.st_mtime; break;
+ case 'b': filet = 0; break;
+ default: fprintf(stderr, "INTERNAL: Bad type %c for file time", type);
+ exit(1);
+ }
+#if defined(__FreeBSD__)
+ switch (type) {
+ case 'a': filet_nsec = st.st_atimespec.tv_nsec; break;
+ case 'b': filet = st.st_birthtime;
+ filet_nsec = st.st_birthtimespec.tv_nsec; break;
+ case 'm': filet_nsec = st.st_mtimespec.tv_nsec; break;
+ default: fprintf(stderr, "INTERNAL: Bad type %c for file time", type);
+ exit(1);
+ }
+ /* FreeBSD generally only stores to microsecond res, so round. */
+ filet_nsec = (filet_nsec / 1000) * 1000;
+ nsec = (nsec / 1000) * 1000;
+#else
+ filet_nsec = nsec = 0; /* Generic POSIX only has whole seconds. */
+ if (type == 'b') return (1); /* Generic POSIX doesn't have birthtime */
+#if defined(__HAIKU__)
+ if (type == 'a') return (1); /* Haiku doesn't have atime. */
+#endif
+#endif
+#endif
+ if (recent) {
+ /* Check that requested time is up-to-date. */
+ time_t now = time(NULL);
+ if (filet < now - 10 || filet > now + 1) {
+ failure_start(file, line,
+ "File %s has %ctime %ld, %ld seconds ago\n",
+ pathname, type, filet, now - filet);
+ failure_finish(NULL);
+ return (0);
+ }
+ } else if (filet != t || filet_nsec != nsec) {
+ failure_start(file, line,
+ "File %s has %ctime %ld.%09ld, expected %ld.%09ld",
+ pathname, type, filet, filet_nsec, t, nsec);
+ failure_finish(NULL);
+ return (0);
+ }
+ return (1);
+}
+
+/* Verify atime of 'pathname'. */
+int
+assertion_file_atime(const char *file, int line,
+ const char *pathname, long t, long nsec)
+{
+ return assertion_file_time(file, line, pathname, t, nsec, 'a', 0);
+}
+
+/* Verify atime of 'pathname' is up-to-date. */
+int
+assertion_file_atime_recent(const char *file, int line, const char *pathname)
+{
+ return assertion_file_time(file, line, pathname, 0, 0, 'a', 1);
+}
+
+/* Verify birthtime of 'pathname'. */
+int
+assertion_file_birthtime(const char *file, int line,
+ const char *pathname, long t, long nsec)
+{
+ return assertion_file_time(file, line, pathname, t, nsec, 'b', 0);
+}
+
+/* Verify birthtime of 'pathname' is up-to-date. */
+int
+assertion_file_birthtime_recent(const char *file, int line,
+ const char *pathname)
+{
+ return assertion_file_time(file, line, pathname, 0, 0, 'b', 1);
+}
+
+/* Verify mtime of 'pathname'. */
+int
+assertion_file_mtime(const char *file, int line,
+ const char *pathname, long t, long nsec)
+{
+ return assertion_file_time(file, line, pathname, t, nsec, 'm', 0);
+}
+
+/* Verify mtime of 'pathname' is up-to-date. */
+int
+assertion_file_mtime_recent(const char *file, int line, const char *pathname)
+{
+ return assertion_file_time(file, line, pathname, 0, 0, 'm', 1);
+}
+
+/* Verify number of links to 'pathname'. */
+int
+assertion_file_nlinks(const char *file, int line,
+ const char *pathname, int nlinks)
+{
+#if defined(_WIN32) && !defined(__CYGWIN__)
+ BY_HANDLE_FILE_INFORMATION bhfi;
+ int r;
+
+ assertion_count(file, line);
+ r = my_GetFileInformationByName(pathname, &bhfi);
+ if (r != 0 && bhfi.nNumberOfLinks == (DWORD)nlinks)
+ return (1);
+ failure_start(file, line, "File %s has %d links, expected %d",
+ pathname, bhfi.nNumberOfLinks, nlinks);
+ failure_finish(NULL);
+ return (0);
+#else
+ struct stat st;
+ int r;
+
+ assertion_count(file, line);
+ r = lstat(pathname, &st);
+ if (r == 0 && st.st_nlink == nlinks)
+ return (1);
+ failure_start(file, line, "File %s has %d links, expected %d",
+ pathname, st.st_nlink, nlinks);
+ failure_finish(NULL);
+ return (0);
+#endif
+}
+
+/* Verify size of 'pathname'. */
+int
+assertion_file_size(const char *file, int line, const char *pathname, long size)
+{
+ int64_t filesize;
+ int r;
+
+ assertion_count(file, line);
+#if defined(_WIN32) && !defined(__CYGWIN__)
+ {
+ BY_HANDLE_FILE_INFORMATION bhfi;
+ r = !my_GetFileInformationByName(pathname, &bhfi);
+ filesize = ((int64_t)bhfi.nFileSizeHigh << 32) + bhfi.nFileSizeLow;
+ }
+#else
+ {
+ struct stat st;
+ r = lstat(pathname, &st);
+ filesize = st.st_size;
+ }
+#endif
+ if (r == 0 && filesize == size)
+ return (1);
+ failure_start(file, line, "File %s has size %ld, expected %ld",
+ pathname, (long)filesize, (long)size);
+ failure_finish(NULL);
+ return (0);
+}
+
+/* Assert that 'pathname' is a dir. If mode >= 0, verify that too. */
+int
+assertion_is_dir(const char *file, int line, const char *pathname, int mode)
+{
+ struct stat st;
+ int r;
+
+#if defined(_WIN32) && !defined(__CYGWIN__)
+ (void)mode; /* UNUSED */
+#endif
+ assertion_count(file, line);
+ r = lstat(pathname, &st);
+ if (r != 0) {
+ failure_start(file, line, "Dir should exist: %s", pathname);
+ failure_finish(NULL);
+ return (0);
+ }
+ if (!S_ISDIR(st.st_mode)) {
+ failure_start(file, line, "%s is not a dir", pathname);
+ failure_finish(NULL);
+ return (0);
+ }
+#if !defined(_WIN32) || defined(__CYGWIN__)
+ /* Windows doesn't handle permissions the same way as POSIX,
+ * so just ignore the mode tests. */
+ /* TODO: Can we do better here? */
+ if (mode >= 0 && mode != (st.st_mode & 07777)) {
+ failure_start(file, line, "Dir %s has wrong mode", pathname);
+ logprintf(" Expected: 0%3o\n", mode);
+ logprintf(" Found: 0%3o\n", st.st_mode & 07777);
+ failure_finish(NULL);
+ return (0);
+ }
+#endif
+ return (1);
+}
+
+/* Verify that 'pathname' is a regular file. If 'mode' is >= 0,
+ * verify that too. */
+int
+assertion_is_reg(const char *file, int line, const char *pathname, int mode)
+{
+ struct stat st;
+ int r;
+
+#if defined(_WIN32) && !defined(__CYGWIN__)
+ (void)mode; /* UNUSED */
+#endif
+ assertion_count(file, line);
+ r = lstat(pathname, &st);
+ if (r != 0 || !S_ISREG(st.st_mode)) {
+ failure_start(file, line, "File should exist: %s", pathname);
+ failure_finish(NULL);
+ return (0);
+ }
+#if !defined(_WIN32) || defined(__CYGWIN__)
+ /* Windows doesn't handle permissions the same way as POSIX,
+ * so just ignore the mode tests. */
+ /* TODO: Can we do better here? */
+ if (mode >= 0 && mode != (st.st_mode & 07777)) {
+ failure_start(file, line, "File %s has wrong mode", pathname);
+ logprintf(" Expected: 0%3o\n", mode);
+ logprintf(" Found: 0%3o\n", st.st_mode & 07777);
+ failure_finish(NULL);
+ return (0);
+ }
+#endif
+ return (1);
+}
+
+/* Check whether 'pathname' is a symbolic link. If 'contents' is
+ * non-NULL, verify that the symlink has those contents. */
+static int
+is_symlink(const char *file, int line,
+ const char *pathname, const char *contents)
+{
+#if defined(_WIN32) && !defined(__CYGWIN__)
+ (void)pathname; /* UNUSED */
+ (void)contents; /* UNUSED */
+ assertion_count(file, line);
+ /* Windows sort-of has real symlinks, but they're only usable
+ * by privileged users and are crippled even then, so there's
+ * really not much point in bothering with this. */
+ return (0);
+#else
+ char buff[300];
+ struct stat st;
+ ssize_t linklen;
+ int r;
+
+ assertion_count(file, line);
+ r = lstat(pathname, &st);
+ if (r != 0) {
+ failure_start(file, line,
+ "Symlink should exist: %s", pathname);
+ failure_finish(NULL);
+ return (0);
+ }
+ if (!S_ISLNK(st.st_mode))
+ return (0);
+ if (contents == NULL)
+ return (1);
+ linklen = readlink(pathname, buff, sizeof(buff));
+ if (linklen < 0) {
+ failure_start(file, line, "Can't read symlink %s", pathname);
+ failure_finish(NULL);
+ return (0);
+ }
+ buff[linklen] = '\0';
+ if (strcmp(buff, contents) != 0)
+ return (0);
+ return (1);
+#endif
+}
+
+/* Assert that path is a symlink that (optionally) contains contents. */
+int
+assertion_is_symlink(const char *file, int line,
+ const char *path, const char *contents)
+{
+ if (is_symlink(file, line, path, contents))
+ return (1);
+ if (contents)
+ failure_start(file, line, "File %s is not a symlink to %s",
+ path, contents);
+ else
+ failure_start(file, line, "File %s is not a symlink", path);
+ failure_finish(NULL);
+ return (0);
+}
+
+
+/* Create a directory and report any errors. */
+int
+assertion_make_dir(const char *file, int line, const char *dirname, int mode)
+{
+ assertion_count(file, line);
+#if defined(_WIN32) && !defined(__CYGWIN__)
+ (void)mode; /* UNUSED */
+ if (0 == _mkdir(dirname))
+ return (1);
+#else
+ if (0 == mkdir(dirname, mode))
+ return (1);
+#endif
+ failure_start(file, line, "Could not create directory %s", dirname);
+ failure_finish(NULL);
+ return(0);
+}
+
+/* Create a file with the specified contents and report any failures. */
+int
+assertion_make_file(const char *file, int line,
+ const char *path, int mode, const char *contents)
+{
+#if defined(_WIN32) && !defined(__CYGWIN__)
+ /* TODO: Rework this to set file mode as well. */
+ FILE *f;
+ (void)mode; /* UNUSED */
+ assertion_count(file, line);
+ f = fopen(path, "wb");
+ if (f == NULL) {
+ failure_start(file, line, "Could not create file %s", path);
+ failure_finish(NULL);
+ return (0);
+ }
+ if (contents != NULL) {
+ if (strlen(contents)
+ != fwrite(contents, 1, strlen(contents), f)) {
+ fclose(f);
+ failure_start(file, line,
+ "Could not write file %s", path);
+ failure_finish(NULL);
+ return (0);
+ }
+ }
+ fclose(f);
+ return (1);
+#else
+ int fd;
+ assertion_count(file, line);
+ fd = open(path, O_CREAT | O_WRONLY, mode >= 0 ? mode : 0644);
+ if (fd < 0) {
+ failure_start(file, line, "Could not create %s", path);
+ failure_finish(NULL);
+ return (0);
+ }
+ if (contents != NULL) {
+ if ((ssize_t)strlen(contents)
+ != write(fd, contents, strlen(contents))) {
+ close(fd);
+ failure_start(file, line, "Could not write to %s", path);
+ failure_finish(NULL);
+ return (0);
+ }
+ }
+ close(fd);
+ return (1);
+#endif
+}
+
+/* Create a hardlink and report any failures. */
+int
+assertion_make_hardlink(const char *file, int line,
+ const char *newpath, const char *linkto)
+{
+ int succeeded;
+
+ assertion_count(file, line);
+#if defined(_WIN32) && !defined(__CYGWIN__)
+ succeeded = my_CreateHardLinkA(newpath, linkto);
+#elif HAVE_LINK
+ succeeded = !link(linkto, newpath);
+#else
+ succeeded = 0;
+#endif
+ if (succeeded)
+ return (1);
+ failure_start(file, line, "Could not create hardlink");
+ logprintf(" New link: %s\n", newpath);
+ logprintf(" Old name: %s\n", linkto);
+ failure_finish(NULL);
+ return(0);
+}
+
+/* Create a symlink and report any failures. */
+int
+assertion_make_symlink(const char *file, int line,
+ const char *newpath, const char *linkto)
+{
+#if defined(_WIN32) && !defined(__CYGWIN__)
+ int targetIsDir = 0; /* TODO: Fix this */
+ assertion_count(file, line);
+ if (my_CreateSymbolicLinkA(newpath, linkto, targetIsDir))
+ return (1);
+#elif HAVE_SYMLINK
+ assertion_count(file, line);
+ if (0 == symlink(linkto, newpath))
+ return (1);
+#endif
+ failure_start(file, line, "Could not create symlink");
+ logprintf(" New link: %s\n", newpath);
+ logprintf(" Old name: %s\n", linkto);
+ failure_finish(NULL);
+ return(0);
+}
+
+/* Set umask, report failures. */
+int
+assertion_umask(const char *file, int line, int mask)
+{
+ assertion_count(file, line);
+ (void)file; /* UNUSED */
+ (void)line; /* UNUSED */
+ umask(mask);
+ return (1);
+}
+
+/*
+ *
+ * UTILITIES for use by tests.
+ *
+ */
+
+/*
+ * Check whether platform supports symlinks. This is intended
+ * for tests to use in deciding whether to bother testing symlink
+ * support; if the platform doesn't support symlinks, there's no point
+ * in checking whether the program being tested can create them.
+ *
+ * Note that the first time this test is called, we actually go out to
+ * disk to create and verify a symlink. This is necessary because
+ * symlink support is actually a property of a particular filesystem
+ * and can thus vary between directories on a single system. After
+ * the first call, this returns the cached result from memory, so it's
+ * safe to call it as often as you wish.
+ */
+int
+canSymlink(void)
+{
+ /* Remember the test result */
+ static int value = 0, tested = 0;
+ if (tested)
+ return (value);
+
+ ++tested;
+ assertion_make_file(__FILE__, __LINE__, "canSymlink.0", 0644, "a");
+ /* Note: Cygwin has its own symlink() emulation that does not
+ * use the Win32 CreateSymbolicLink() function. */
+#if defined(_WIN32) && !defined(__CYGWIN__)
+ value = my_CreateSymbolicLinkA("canSymlink.1", "canSymlink.0", 0)
+ && is_symlink(__FILE__, __LINE__, "canSymlink.1", "canSymlink.0");
+#elif HAVE_SYMLINK
+ value = (0 == symlink("canSymlink.0", "canSymlink.1"))
+ && is_symlink(__FILE__, __LINE__, "canSymlink.1","canSymlink.0");
+#endif
+ return (value);
+}
+
+/*
+ * Can this platform run the gzip program?
+ */
+/* Platform-dependent options for hiding the output of a subcommand. */
+#if defined(_WIN32) && !defined(__CYGWIN__)
+static const char *redirectArgs = ">NUL 2>NUL"; /* Win32 cmd.exe */
+#else
+static const char *redirectArgs = ">/dev/null 2>/dev/null"; /* POSIX 'sh' */
+#endif
+int
+canGzip(void)
+{
+ static int tested = 0, value = 0;
+ if (!tested) {
+ tested = 1;
+ if (systemf("gzip -V %s", redirectArgs) == 0)
+ value = 1;
+ }
+ return (value);
+}
+
+/*
+ * Can this platform run the gunzip program?
+ */
+int
+canGunzip(void)
+{
+ static int tested = 0, value = 0;
+ if (!tested) {
+ tested = 1;
+ if (systemf("gunzip -V %s", redirectArgs) == 0)
+ value = 1;
+ }
+ return (value);
+}
+
+/*
+ * Sleep as needed; useful for verifying disk timestamp changes by
+ * ensuring that the wall-clock time has actually changed before we
+ * go back to re-read something from disk.
+ */
+void
+sleepUntilAfter(time_t t)
+{
+ while (t >= time(NULL))
+#if defined(_WIN32) && !defined(__CYGWIN__)
+ Sleep(500);
+#else
+ sleep(1);
+#endif
+}
+
/*
* Call standard system() call, but build up the command line using
* sprintf() conventions.
@@ -696,6 +1496,8 @@ systemf(const char *fmt, ...)
va_start(ap, fmt);
vsprintf(buff, fmt, ap);
+ if (verbosity > VERBOSITY_FULL)
+ logprintf("Cmd: %s\n", buff);
r = system(buff);
va_end(ap);
return (r);
@@ -714,143 +1516,48 @@ slurpfile(size_t * sizep, const char *fmt, ...)
va_list ap;
char *p;
ssize_t bytes_read;
- int fd;
+ FILE *f;
int r;
va_start(ap, fmt);
vsprintf(filename, fmt, ap);
va_end(ap);
- fd = open(filename, O_RDONLY);
- if (fd < 0) {
+ f = fopen(filename, "rb");
+ if (f == NULL) {
/* Note: No error; non-existent file is okay here. */
return (NULL);
}
- r = fstat(fd, &st);
+ r = fstat(fileno(f), &st);
if (r != 0) {
- fprintf(stderr, "Can't stat file %s\n", filename);
- close(fd);
+ logprintf("Can't stat file %s\n", filename);
+ fclose(f);
return (NULL);
}
- p = malloc(st.st_size + 1);
+ p = malloc((size_t)st.st_size + 1);
if (p == NULL) {
- fprintf(stderr, "Can't allocate %ld bytes of memory to read file %s\n", (long int)st.st_size, filename);
- close(fd);
+ logprintf("Can't allocate %ld bytes of memory to read file %s\n",
+ (long int)st.st_size, filename);
+ fclose(f);
return (NULL);
}
- bytes_read = read(fd, p, st.st_size);
+ bytes_read = fread(p, 1, (size_t)st.st_size, f);
if (bytes_read < st.st_size) {
- fprintf(stderr, "Can't read file %s\n", filename);
- close(fd);
+ logprintf("Can't read file %s\n", filename);
+ fclose(f);
free(p);
return (NULL);
}
p[st.st_size] = '\0';
if (sizep != NULL)
*sizep = (size_t)st.st_size;
- close(fd);
+ fclose(f);
return (p);
}
-/*
- * "list.h" is automatically generated; it just has a lot of lines like:
- * DEFINE_TEST(function_name)
- * It's used above to declare all of the test functions.
- * We reuse it here to define a list of all tests (functions and names).
- */
-#undef DEFINE_TEST
-#define DEFINE_TEST(n) { n, #n },
-struct { void (*func)(void); const char *name; } tests[] = {
- #include "list.h"
-};
-
-/*
- * Each test is run in a private work dir. Those work dirs
- * do have consistent and predictable names, in case a group
- * of tests need to collaborate. However, there is no provision
- * for requiring that tests run in a certain order.
- */
-static int test_run(int i, const char *tmpdir)
-{
- int failures_before = failures;
-
- if (!quiet_flag) {
- printf("%d: %s\n", i, tests[i].name);
- fflush(stdout);
- }
-
- /*
- * Always explicitly chdir() in case the last test moved us to
- * a strange place.
- */
- if (chdir(tmpdir)) {
- fprintf(stderr,
- "ERROR: Couldn't chdir to temp dir %s\n",
- tmpdir);
- exit(1);
- }
- /* Create a temp directory for this specific test. */
- if (mkdir(tests[i].name, 0755)) {
- fprintf(stderr,
- "ERROR: Couldn't create temp dir ``%s''\n",
- tests[i].name);
- exit(1);
- }
- /* Chdir() to that work directory. */
- if (chdir(tests[i].name)) {
- fprintf(stderr,
- "ERROR: Couldn't chdir to temp dir ``%s''\n",
- tests[i].name);
- exit(1);
- }
- /* Explicitly reset the locale before each test. */
- setlocale(LC_ALL, "C");
- /* Run the actual test. */
- (*tests[i].func)();
- /* Summarize the results of this test. */
- summarize();
- /* If there were no failures, we can remove the work dir. */
- if (failures == failures_before) {
- if (!keep_temp_files && chdir(tmpdir) == 0) {
-#if defined(_WIN32) && !defined(__CYGWIN__)
- systemf("rmdir /S /Q %s", tests[i].name);
-#else
- systemf("rm -rf %s", tests[i].name);
-#endif
- }
- }
- /* Return appropriate status. */
- return (failures == failures_before ? 0 : 1);
-}
-
-static void usage(const char *program)
-{
- static const int limit = sizeof(tests) / sizeof(tests[0]);
- int i;
-
- printf("Usage: %s [options] <test> <test> ...\n", program);
- printf("Default is to run all tests.\n");
- printf("Otherwise, specify the numbers of the tests you wish to run.\n");
- printf("Options:\n");
- printf(" -d Dump core after any failure, for debugging.\n");
- printf(" -k Keep all temp files.\n");
- printf(" Default: temp files for successful tests deleted.\n");
-#ifdef PROGRAM
- printf(" -p <path> Path to executable to be tested.\n");
- printf(" Default: path taken from " ENVBASE " environment variable.\n");
-#endif
- printf(" -q Quiet.\n");
- printf(" -r <dir> Path to dir containing reference files.\n");
- printf(" Default: Current directory.\n");
- printf(" -v Verbose.\n");
- printf("Available tests:\n");
- for (i = 0; i < limit; i++)
- printf(" %d: %s\n", i, tests[i].name);
- exit(1);
-}
-
+/* Read a uuencoded file from the reference directory, decode, and
+ * write the result into the current directory. */
#define UUDECODE(c) (((c) - 0x20) & 0x3f)
-
void
extract_reference_file(const char *name)
{
@@ -874,7 +1581,7 @@ extract_reference_file(const char *name)
}
/* Now, decode the rest and write it. */
/* Not a lot of error checking here; the input better be right. */
- out = fopen(name, "w");
+ out = fopen(name, "wb");
while (fgets(buff, sizeof(buff), in) != NULL) {
char *p = buff;
int bytes;
@@ -908,19 +1615,211 @@ extract_reference_file(const char *name)
fclose(in);
}
+/*
+ *
+ * TEST management
+ *
+ */
+
+/*
+ * "list.h" is simply created by "grep DEFINE_TEST test_*.c"; it has
+ * a line like
+ * DEFINE_TEST(test_function)
+ * for each test.
+ */
+
+/* Use "list.h" to declare all of the test functions. */
+#undef DEFINE_TEST
+#define DEFINE_TEST(name) void name(void);
+#include "list.h"
+
+/* Use "list.h" to create a list of all tests (functions and names). */
+#undef DEFINE_TEST
+#define DEFINE_TEST(n) { n, #n, 0 },
+struct { void (*func)(void); const char *name; int failures; } tests[] = {
+ #include "list.h"
+};
+
+/*
+ * Summarize repeated failures in the just-completed test.
+ */
+static void
+test_summarize(const char *filename, int failed)
+{
+ unsigned int i;
+
+ switch (verbosity) {
+ case VERBOSITY_SUMMARY_ONLY:
+ printf(failed ? "E" : ".");
+ fflush(stdout);
+ break;
+ case VERBOSITY_PASSFAIL:
+ printf(failed ? "FAIL\n" : "ok\n");
+ break;
+ }
+
+ log_console = (verbosity == VERBOSITY_LIGHT_REPORT);
+
+ for (i = 0; i < sizeof(failed_lines)/sizeof(failed_lines[0]); i++) {
+ if (failed_lines[i].count > 1 && !failed_lines[i].skip)
+ logprintf("%s:%d: Summary: Failed %d times\n",
+ filename, i, failed_lines[i].count);
+ }
+ /* Clear the failure history for the next file. */
+ memset(failed_lines, 0, sizeof(failed_lines));
+}
+
+/*
+ * Actually run a single test, with appropriate setup and cleanup.
+ */
+static int
+test_run(int i, const char *tmpdir)
+{
+ char logfilename[64];
+ int failures_before = failures;
+ int oldumask;
+
+ switch (verbosity) {
+ case VERBOSITY_SUMMARY_ONLY: /* No per-test reports at all */
+ break;
+ case VERBOSITY_PASSFAIL: /* rest of line will include ok/FAIL marker */
+ printf("%3d: %-50s", i, tests[i].name);
+ fflush(stdout);
+ break;
+ default: /* Title of test, details will follow */
+ printf("%3d: %s\n", i, tests[i].name);
+ }
+
+ /* Chdir to the top-level work directory. */
+ if (!assertChdir(tmpdir)) {
+ fprintf(stderr,
+ "ERROR: Can't chdir to top work dir %s\n", tmpdir);
+ exit(1);
+ }
+ /* Create a log file for this test. */
+ sprintf(logfilename, "%s.log", tests[i].name);
+ logfile = fopen(logfilename, "w");
+ fprintf(logfile, "%s\n\n", tests[i].name);
+ /* Chdir() to a work dir for this specific test. */
+ if (!assertMakeDir(tests[i].name, 0755)
+ || !assertChdir(tests[i].name)) {
+ fprintf(stderr,
+ "ERROR: Can't chdir to work dir %s/%s\n",
+ tmpdir, tests[i].name);
+ exit(1);
+ }
+ /* Explicitly reset the locale before each test. */
+ setlocale(LC_ALL, "C");
+ /* Record the umask before we run the test. */
+ umask(oldumask = umask(0));
+ /*
+ * Run the actual test.
+ */
+ (*tests[i].func)();
+ /*
+ * Clean up and report afterwards.
+ */
+ /* Restore umask */
+ umask(oldumask);
+ /* Reset locale. */
+ setlocale(LC_ALL, "C");
+ /* Reset directory. */
+ if (!assertChdir(tmpdir)) {
+ fprintf(stderr, "ERROR: Couldn't chdir to temp dir %s\n",
+ tmpdir);
+ exit(1);
+ }
+ /* Report per-test summaries. */
+ tests[i].failures = failures - failures_before;
+ test_summarize(test_filename, tests[i].failures);
+ /* Close the per-test log file. */
+ fclose(logfile);
+ logfile = NULL;
+ /* If there were no failures, we can remove the work dir and logfile. */
+ if (tests[i].failures == 0) {
+ if (!keep_temp_files && assertChdir(tmpdir)) {
+#if defined(_WIN32) && !defined(__CYGWIN__)
+ /* Make sure not to leave empty directories.
+ * Sometimes a processing of closing files used by tests
+ * is not done, then rmdir will be failed and it will
+ * leave a empty test directory. So we should wait a few
+ * seconds and retry rmdir. */
+ int r, t;
+ for (t = 0; t < 10; t++) {
+ if (t > 0)
+ Sleep(1000);
+ r = systemf("rmdir /S /Q %s", tests[i].name);
+ if (r == 0)
+ break;
+ }
+ systemf("del %s", logfilename);
+#else
+ systemf("rm -rf %s", tests[i].name);
+ systemf("rm %s", logfilename);
+#endif
+ }
+ }
+ /* Return appropriate status. */
+ return (tests[i].failures);
+}
+
+/*
+ *
+ *
+ * MAIN and support routines.
+ *
+ *
+ */
+
+static void
+usage(const char *program)
+{
+ static const int limit = sizeof(tests) / sizeof(tests[0]);
+ int i;
+
+ printf("Usage: %s [options] <test> <test> ...\n", program);
+ printf("Default is to run all tests.\n");
+ printf("Otherwise, specify the numbers of the tests you wish to run.\n");
+ printf("Options:\n");
+ printf(" -d Dump core after any failure, for debugging.\n");
+ printf(" -k Keep all temp files.\n");
+ printf(" Default: temp files for successful tests deleted.\n");
+#ifdef PROGRAM
+ printf(" -p <path> Path to executable to be tested.\n");
+ printf(" Default: path taken from " ENVBASE " environment variable.\n");
+#endif
+ printf(" -q Quiet.\n");
+ printf(" -r <dir> Path to dir containing reference files.\n");
+ printf(" Default: Current directory.\n");
+ printf(" -v Verbose.\n");
+ printf("Available tests:\n");
+ for (i = 0; i < limit; i++)
+ printf(" %d: %s\n", i, tests[i].name);
+ exit(1);
+}
static char *
-get_refdir(void)
+get_refdir(const char *d)
{
char tried[512] = { '\0' };
char buff[128];
char *pwd, *p;
+ /* If a dir was specified, try that */
+ if (d != NULL) {
+ pwd = NULL;
+ snprintf(buff, sizeof(buff), "%s", d);
+ p = slurpfile(NULL, "%s/%s", buff, KNOWNREF);
+ if (p != NULL) goto success;
+ strncat(tried, buff, sizeof(tried) - strlen(tried) - 1);
+ strncat(tried, "\n", sizeof(tried) - strlen(tried) - 1);
+ goto failure;
+ }
+
/* Get the current dir. */
pwd = getcwd(NULL, 0);
while (pwd[strlen(pwd) - 1] == '\n')
pwd[strlen(pwd) - 1] = '\0';
- printf("PWD: %s\n", pwd);
/* Look for a known file. */
snprintf(buff, sizeof(buff), "%s", pwd);
@@ -935,7 +1834,11 @@ get_refdir(void)
strncat(tried, buff, sizeof(tried) - strlen(tried) - 1);
strncat(tried, "\n", sizeof(tried) - strlen(tried) - 1);
+#if defined(LIBRARY)
+ snprintf(buff, sizeof(buff), "%s/%s/test", pwd, LIBRARY);
+#else
snprintf(buff, sizeof(buff), "%s/%s/test", pwd, PROGRAM);
+#endif
p = slurpfile(NULL, "%s/%s", buff, KNOWNREF);
if (p != NULL) goto success;
strncat(tried, buff, sizeof(tried) - strlen(tried) - 1);
@@ -955,11 +1858,12 @@ get_refdir(void)
strncat(tried, "\n", sizeof(tried) - strlen(tried) - 1);
}
+failure:
+ printf("Unable to locate known reference file %s\n", KNOWNREF);
+ printf(" Checked following directories:\n%s\n", tried);
#if defined(_WIN32) && !defined(__CYGWIN__) && defined(_DEBUG)
DebugBreak();
#endif
- printf("Unable to locate known reference file %s\n", KNOWNREF);
- printf(" Checked following directories:\n%s\n", tried);
exit(1);
success:
@@ -968,27 +1872,27 @@ success:
return strdup(buff);
}
-int main(int argc, char **argv)
+int
+main(int argc, char **argv)
{
static const int limit = sizeof(tests) / sizeof(tests[0]);
- int i, tests_run = 0, tests_failed = 0, opt;
+ int i, tests_run = 0, tests_failed = 0, option;
time_t now;
char *refdir_alloc = NULL;
-#if defined(_WIN32) && !defined(__CYGWIN__)
- char *testprg;
-#endif
- const char *opt_arg, *progname, *p;
+ const char *progname;
+ const char *tmp, *option_arg, *p;
char tmpdir[256];
char tmpdir_timestamp[256];
(void)argc; /* UNUSED */
-#if defined(_WIN32) && !defined(__CYGWIN__)
- /* Make sure open() function will be used with a binary mode. */
- /* on cygwin, we need something similar, but instead link against */
- /* a special startup object, binmode.o */
- _set_fmode(_O_BINARY);
+#if defined(HAVE__CrtSetReportMode)
+ /* To stop to run the default invalid parameter handler. */
+ _set_invalid_parameter_handler(invalid_parameter_handler);
+ /* Disable annoying assertion message box. */
+ _CrtSetReportMode(_CRT_ASSERT, 0);
#endif
+
/*
* Name of this program, used to build root of our temp directory
* tree.
@@ -1003,9 +1907,20 @@ int main(int argc, char **argv)
#ifdef PROGRAM
/* Get the target program from environment, if available. */
- testprog = getenv(ENVBASE);
+ testprogfile = getenv(ENVBASE);
#endif
+ if (getenv("TMPDIR") != NULL)
+ tmp = getenv("TMPDIR");
+ else if (getenv("TMP") != NULL)
+ tmp = getenv("TMP");
+ else if (getenv("TEMP") != NULL)
+ tmp = getenv("TEMP");
+ else if (getenv("TEMPDIR") != NULL)
+ tmp = getenv("TEMPDIR");
+ else
+ tmp = "/tmp";
+
/* Allow -d to be controlled through the environment. */
if (getenv(ENVBASE "_DEBUG") != NULL)
dump_on_failure = 1;
@@ -1024,23 +1939,24 @@ int main(int argc, char **argv)
p = *argv++;
++p; /* Skip '-' */
while (*p != '\0') {
- opt = *p++;
- opt_arg = NULL;
+ option = *p++;
+ option_arg = NULL;
/* If 'opt' takes an argument, parse that. */
- if (opt == 'p' || opt == 'r') {
+ if (option == 'p' || option == 'r') {
if (*p != '\0')
- opt_arg = p;
+ option_arg = p;
else if (*argv == NULL) {
fprintf(stderr,
"Option -%c requires argument.\n",
- opt);
+ option);
usage(progname);
} else
- opt_arg = *argv++;
+ option_arg = *argv++;
p = ""; /* End of this option word. */
}
- switch (opt) {
+ /* Now, handle the option. */
+ switch (option) {
case 'd':
dump_on_failure = 1;
break;
@@ -1049,21 +1965,20 @@ int main(int argc, char **argv)
break;
case 'p':
#ifdef PROGRAM
- testprog = opt_arg;
+ testprogfile = option_arg;
#else
usage(progname);
#endif
break;
case 'q':
- quiet_flag++;
+ verbosity--;
break;
case 'r':
- refdir = opt_arg;
+ refdir = option_arg;
break;
case 'v':
- verbose = 1;
+ verbosity++;
break;
- case '?':
default:
usage(progname);
}
@@ -1074,20 +1989,26 @@ int main(int argc, char **argv)
* Sanity-check that our options make sense.
*/
#ifdef PROGRAM
- if (testprog == NULL)
+ if (testprogfile == NULL)
usage(progname);
-#endif
+ {
+ char *testprg;
#if defined(_WIN32) && !defined(__CYGWIN__)
- /*
- * Command.exe cannot accept the command used '/' with drive
- * name such as c:/xxx/command.exe when use '|' pipe handling.
- */
- testprg = strdup(testprog);
- for (i = 0; testprg[i] != '\0'; i++) {
- if (testprg[i] == '/')
- testprg[i] = '\\';
+ /* Command.com sometimes rejects '/' separators. */
+ testprg = strdup(testprogfile);
+ for (i = 0; testprg[i] != '\0'; i++) {
+ if (testprg[i] == '/')
+ testprg[i] = '\\';
+ }
+ testprogfile = testprg;
+#endif
+ /* Quote the name that gets put into shell command lines. */
+ testprg = malloc(strlen(testprogfile) + 3);
+ strcpy(testprg, "\"");
+ strcat(testprg, testprogfile);
+ strcat(testprg, "\"");
+ testprog = testprg;
}
- testprog = testprg;
#endif
/*
@@ -1096,32 +2017,37 @@ int main(int argc, char **argv)
* to make it easier to track the results of multiple tests.
*/
now = time(NULL);
- for (i = 0; i < 1000; i++) {
+ for (i = 0; ; i++) {
strftime(tmpdir_timestamp, sizeof(tmpdir_timestamp),
"%Y-%m-%dT%H.%M.%S",
localtime(&now));
- sprintf(tmpdir, "/tmp/%s.%s-%03d", progname, tmpdir_timestamp, i);
- if (mkdir(tmpdir,0755) == 0)
+ sprintf(tmpdir, "%s/%s.%s-%03d", tmp, progname,
+ tmpdir_timestamp, i);
+ if (assertMakeDir(tmpdir,0755))
break;
- if (errno == EEXIST)
- continue;
- fprintf(stderr, "ERROR: Unable to create temp directory %s\n",
- tmpdir);
- exit(1);
+ if (i >= 999) {
+ fprintf(stderr,
+ "ERROR: Unable to create temp directory %s\n",
+ tmpdir);
+ exit(1);
+ }
}
/*
* If the user didn't specify a directory for locating
- * reference files, use the current directory for that.
+ * reference files, try to find the reference files in
+ * the "usual places."
*/
- if (refdir == NULL)
- refdir = refdir_alloc = get_refdir();
+ refdir = refdir_alloc = get_refdir(refdir);
/*
* Banner with basic information.
*/
- if (!quiet_flag) {
- printf("Running tests in: %s\n", tmpdir);
+ printf("\n");
+ printf("If tests fail or crash, details will be in:\n");
+ printf(" %s\n", tmpdir);
+ printf("\n");
+ if (verbosity > VERBOSITY_SUMMARY_ONLY) {
printf("Reference files will be read from: %s\n", refdir);
#ifdef PROGRAM
printf("Running tests on: %s\n", testprog);
@@ -1129,6 +2055,9 @@ int main(int argc, char **argv)
printf("Exercising: ");
fflush(stdout);
printf("%s\n", EXTRA_VERSION);
+ } else {
+ printf("Running ");
+ fflush(stdout);
}
/*
@@ -1143,15 +2072,30 @@ int main(int argc, char **argv)
}
} else {
while (*(argv) != NULL) {
- i = atoi(*argv);
- if (**argv < '0' || **argv > '9' || i < 0 || i >= limit) {
- printf("*** INVALID Test %s\n", *argv);
- usage(progname);
+ if (**argv >= '0' && **argv <= '9') {
+ i = atoi(*argv);
+ if (i < 0 || i >= limit) {
+ printf("*** INVALID Test %s\n", *argv);
+ free(refdir_alloc);
+ usage(progname);
+ /* usage() never returns */
+ }
} else {
- if (test_run(i, tmpdir))
- tests_failed++;
- tests_run++;
+ for (i = 0; i < limit; ++i) {
+ if (strcmp(*argv, tests[i].name) == 0)
+ break;
+ }
+ if (i >= limit) {
+ printf("*** INVALID Test ``%s''\n",
+ *argv);
+ free(refdir_alloc);
+ usage(progname);
+ /* usage() never returns */
+ }
}
+ if (test_run(i, tmpdir))
+ tests_failed++;
+ tests_run++;
argv++;
}
}
@@ -1159,20 +2103,38 @@ int main(int argc, char **argv)
/*
* Report summary statistics.
*/
- if (!quiet_flag) {
+ if (verbosity > VERBOSITY_SUMMARY_ONLY) {
printf("\n");
- printf("%d of %d tests reported failures\n",
- tests_failed, tests_run);
- printf(" Total of %d assertions checked.\n", assertions);
- printf(" Total of %d assertions failed.\n", failures);
- printf(" Total of %d assertions skipped.\n", skips);
+ printf("Totals:\n");
+ printf(" Tests run: %8d\n", tests_run);
+ printf(" Tests failed: %8d\n", tests_failed);
+ printf(" Assertions checked:%8d\n", assertions);
+ printf(" Assertions failed: %8d\n", failures);
+ printf(" Skips reported: %8d\n", skips);
+ }
+ if (failures) {
+ printf("\n");
+ printf("Failing tests:\n");
+ for (i = 0; i < limit; ++i) {
+ if (tests[i].failures)
+ printf(" %d: %s (%d failures)\n", i,
+ tests[i].name, tests[i].failures);
+ }
+ printf("\n");
+ printf("Details for failing tests: %s\n", tmpdir);
+ printf("\n");
+ } else {
+ if (verbosity == VERBOSITY_SUMMARY_ONLY)
+ printf("\n");
+ printf("%d tests passed, no failures\n", tests_run);
}
free(refdir_alloc);
/* If the final tmpdir is empty, we can remove it. */
/* This should be the usual case when all tests succeed. */
+ assertChdir("..");
rmdir(tmpdir);
- return (tests_failed);
+ return (tests_failed ? 1 : 0);
}
diff --git a/usr.bin/cpio/test/test.h b/usr.bin/cpio/test/test.h
index be28dd4..8b1352a 100644
--- a/usr.bin/cpio/test/test.h
+++ b/usr.bin/cpio/test/test.h
@@ -45,47 +45,84 @@
#error Oops: No config.h and no pre-built configuration in test.h.
#endif
-#if !defined(_WIN32) || defined(__CYGWIN__)
+#include <sys/types.h> /* Windows requires this before sys/stat.h */
+#include <sys/stat.h>
+
+#ifdef USE_DMALLOC
+#include <dmalloc.h>
+#endif
+#if HAVE_DIRENT_H
#include <dirent.h>
-#else
-#include "../cpio_windows.h"
#endif
-#if defined(__CYGWIN__)
-/* In cygwin-1.7.x, the .nlinks field of directories is
- * deliberately inaccurate, because to populate it requires
- * stat'ing every file in the directory, which is slow.
- * So, as an optimization cygwin doesn't do that in newer
- * releases; all correct applications on any platform should
- * never rely on it being > 1, so this optimization doesn't
- * impact the operation of correctly coded applications.
- * Therefore, the cpio test should not check its accuracy
- */
-# define NLINKS_INACCURATE_FOR_DIRS
+#ifdef HAVE_DIRECT_H
+#include <direct.h>
+#define dirent direct
#endif
#include <errno.h>
#include <fcntl.h>
+#ifdef HAVE_IO_H
+#include <io.h>
+#endif
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
-#include <sys/stat.h>
-#if !defined(_WIN32) || defined(__CYGWIN__)
+#include <time.h>
+#ifdef HAVE_UNISTD_H
#include <unistd.h>
#endif
-#include <time.h>
#include <wchar.h>
-
-#ifdef USE_DMALLOC
-#include <dmalloc.h>
+#ifdef HAVE_WINDOWS_H
+#include <windows.h>
#endif
-/* No non-FreeBSD platform will have __FBSDID, so just define it here. */
-#ifdef __FreeBSD__
-#include <sys/cdefs.h> /* For __FBSDID */
+/*
+ * System-specific tweaks. We really want to minimize these
+ * as much as possible, since they make it harder to understand
+ * the mainline code.
+ */
+
+/* Windows (including Visual Studio and MinGW but not Cygwin) */
+#if defined(_WIN32) && !defined(__CYGWIN__)
+#include "../cpio_windows.h"
+#if !defined(__BORLANDC__)
+#define strdup _strdup
+#endif
+#define LOCALE_DE "deu"
#else
-#undef __FBSDID
+#define LOCALE_DE "de_DE.UTF-8"
+#endif
+
+/* Visual Studio */
+#ifdef _MSC_VER
+#define snprintf sprintf_s
+#endif
+
+/* Cygwin */
+#if defined(__CYGWIN__)
+/* Cygwin-1.7.x is lazy about populating nlinks, so don't
+ * expect it to be accurate. */
+# define NLINKS_INACCURATE_FOR_DIRS
+#endif
+
+#if defined(__HAIKU__) || defined(__QNXNTO__)
+/* Haiku and QNX have typedefs in stdint.h (needed for int64_t) */
+#include <stdint.h>
+#endif
+
+/* Get a real definition for __FBSDID if we can */
+#if HAVE_SYS_CDEFS_H
+#include <sys/cdefs.h>
+#endif
+
+/* If not, define it so as to avoid dangling semicolons. */
+#ifndef __FBSDID
#define __FBSDID(a) struct _undefined_hack
#endif
+#ifndef O_BINARY
+#define O_BINARY 0
+#endif
+
/*
* Redefine DEFINE_TEST for use in defining the test functions.
*/
@@ -93,40 +130,81 @@
#define DEFINE_TEST(name) void name(void); void name(void)
/* An implementation of the standard assert() macro */
-#define assert(e) test_assert(__FILE__, __LINE__, (e), #e, NULL)
-
+#define assert(e) assertion_assert(__FILE__, __LINE__, (e), #e, NULL)
+/* chdir() and error if it fails */
+#define assertChdir(path) \
+ assertion_chdir(__FILE__, __LINE__, path)
/* Assert two integers are the same. Reports value of each one if not. */
-#define assertEqualInt(v1,v2) \
- test_assert_equal_int(__FILE__, __LINE__, (v1), #v1, (v2), #v2, NULL)
-
+#define assertEqualInt(v1,v2) \
+ assertion_equal_int(__FILE__, __LINE__, (v1), #v1, (v2), #v2, NULL)
/* Assert two strings are the same. Reports value of each one if not. */
#define assertEqualString(v1,v2) \
- test_assert_equal_string(__FILE__, __LINE__, (v1), #v1, (v2), #v2, NULL)
+ assertion_equal_string(__FILE__, __LINE__, (v1), #v1, (v2), #v2, NULL)
/* As above, but v1 and v2 are wchar_t * */
#define assertEqualWString(v1,v2) \
- test_assert_equal_wstring(__FILE__, __LINE__, (v1), #v1, (v2), #v2, NULL)
+ assertion_equal_wstring(__FILE__, __LINE__, (v1), #v1, (v2), #v2, NULL)
/* As above, but raw blocks of bytes. */
#define assertEqualMem(v1, v2, l) \
- test_assert_equal_mem(__FILE__, __LINE__, (v1), #v1, (v2), #v2, (l), #l, NULL)
+ assertion_equal_mem(__FILE__, __LINE__, (v1), #v1, (v2), #v2, (l), #l, NULL)
/* Assert two files are the same; allow printf-style expansion of second name.
* See below for comments about variable arguments here...
*/
#define assertEqualFile \
- test_setup(__FILE__, __LINE__);test_assert_equal_file
+ assertion_setup(__FILE__, __LINE__);assertion_equal_file
/* Assert that a file is empty; supports printf-style arguments. */
#define assertEmptyFile \
- test_setup(__FILE__, __LINE__);test_assert_empty_file
+ assertion_setup(__FILE__, __LINE__);assertion_empty_file
+/* Assert that a file is not empty; supports printf-style arguments. */
+#define assertNonEmptyFile \
+ assertion_setup(__FILE__, __LINE__);assertion_non_empty_file
+#define assertFileAtime(pathname, sec, nsec) \
+ assertion_file_atime(__FILE__, __LINE__, pathname, sec, nsec)
+#define assertFileAtimeRecent(pathname) \
+ assertion_file_atime_recent(__FILE__, __LINE__, pathname)
+#define assertFileBirthtime(pathname, sec, nsec) \
+ assertion_file_birthtime(__FILE__, __LINE__, pathname, sec, nsec)
+#define assertFileBirthtimeRecent(pathname) \
+ assertion_file_birthtime_recent(__FILE__, __LINE__, pathname)
/* Assert that a file exists; supports printf-style arguments. */
#define assertFileExists \
- test_setup(__FILE__, __LINE__);test_assert_file_exists
+ assertion_setup(__FILE__, __LINE__);assertion_file_exists
/* Assert that a file exists; supports printf-style arguments. */
#define assertFileNotExists \
- test_setup(__FILE__, __LINE__);test_assert_file_not_exists
+ assertion_setup(__FILE__, __LINE__);assertion_file_not_exists
/* Assert that file contents match a string; supports printf-style arguments. */
#define assertFileContents \
- test_setup(__FILE__, __LINE__);test_assert_file_contents
+ assertion_setup(__FILE__, __LINE__);assertion_file_contents
+#define assertFileMtime(pathname, sec, nsec) \
+ assertion_file_mtime(__FILE__, __LINE__, pathname, sec, nsec)
+#define assertFileMtimeRecent(pathname) \
+ assertion_file_mtime_recent(__FILE__, __LINE__, pathname)
+#define assertFileNLinks(pathname, nlinks) \
+ assertion_file_nlinks(__FILE__, __LINE__, pathname, nlinks)
+#define assertFileSize(pathname, size) \
+ assertion_file_size(__FILE__, __LINE__, pathname, size)
#define assertTextFileContents \
- test_setup(__FILE__, __LINE__);test_assert_text_file_contents
+ assertion_setup(__FILE__, __LINE__);assertion_text_file_contents
+#define assertIsDir(pathname, mode) \
+ assertion_is_dir(__FILE__, __LINE__, pathname, mode)
+#define assertIsHardlink(path1, path2) \
+ assertion_is_hardlink(__FILE__, __LINE__, path1, path2)
+#define assertIsNotHardlink(path1, path2) \
+ assertion_is_not_hardlink(__FILE__, __LINE__, path1, path2)
+#define assertIsReg(pathname, mode) \
+ assertion_is_reg(__FILE__, __LINE__, pathname, mode)
+#define assertIsSymlink(pathname, contents) \
+ assertion_is_symlink(__FILE__, __LINE__, pathname, contents)
+/* Create a directory, report error if it fails. */
+#define assertMakeDir(dirname, mode) \
+ assertion_make_dir(__FILE__, __LINE__, dirname, mode)
+#define assertMakeFile(path, mode, contents) \
+ assertion_make_file(__FILE__, __LINE__, path, mode, contents)
+#define assertMakeHardlink(newfile, oldfile) \
+ assertion_make_hardlink(__FILE__, __LINE__, newfile, oldfile)
+#define assertMakeSymlink(newfile, linkto) \
+ assertion_make_symlink(__FILE__, __LINE__, newfile, linkto)
+#define assertUmask(mask) \
+ assertion_umask(__FILE__, __LINE__, mask)
/*
* This would be simple with C99 variadic macros, but I don't want to
@@ -135,27 +213,60 @@
* but effective.
*/
#define skipping \
- test_setup(__FILE__, __LINE__);test_skipping
+ assertion_setup(__FILE__, __LINE__);test_skipping
/* Function declarations. These are defined in test_utility.c. */
void failure(const char *fmt, ...);
-void test_setup(const char *, int);
+int assertion_assert(const char *, int, int, const char *, void *);
+int assertion_chdir(const char *, int, const char *);
+int assertion_empty_file(const char *, ...);
+int assertion_equal_file(const char *, const char *, ...);
+int assertion_equal_int(const char *, int, long long, const char *, long long, const char *, void *);
+int assertion_equal_mem(const char *, int, const void *, const char *, const void *, const char *, size_t, const char *, void *);
+int assertion_equal_string(const char *, int, const char *v1, const char *, const char *v2, const char *, void *);
+int assertion_equal_wstring(const char *, int, const wchar_t *v1, const char *, const wchar_t *v2, const char *, void *);
+int assertion_file_atime(const char *, int, const char *, long, long);
+int assertion_file_atime_recent(const char *, int, const char *);
+int assertion_file_birthtime(const char *, int, const char *, long, long);
+int assertion_file_birthtime_recent(const char *, int, const char *);
+int assertion_file_contents(const void *, int, const char *, ...);
+int assertion_file_exists(const char *, ...);
+int assertion_file_mtime(const char *, int, const char *, long, long);
+int assertion_file_mtime_recent(const char *, int, const char *);
+int assertion_file_nlinks(const char *, int, const char *, int);
+int assertion_file_not_exists(const char *, ...);
+int assertion_file_size(const char *, int, const char *, long);
+int assertion_is_dir(const char *, int, const char *, int);
+int assertion_is_hardlink(const char *, int, const char *, const char *);
+int assertion_is_not_hardlink(const char *, int, const char *, const char *);
+int assertion_is_reg(const char *, int, const char *, int);
+int assertion_is_symlink(const char *, int, const char *, const char *);
+int assertion_make_dir(const char *, int, const char *, int);
+int assertion_make_file(const char *, int, const char *, int, const char *);
+int assertion_make_hardlink(const char *, int, const char *newpath, const char *);
+int assertion_make_symlink(const char *, int, const char *newpath, const char *);
+int assertion_non_empty_file(const char *, ...);
+int assertion_text_file_contents(const char *buff, const char *f);
+int assertion_umask(const char *, int, int);
+void assertion_setup(const char *, int);
+
void test_skipping(const char *fmt, ...);
-int test_assert(const char *, int, int, const char *, void *);
-int test_assert_empty_file(const char *, ...);
-int test_assert_equal_file(const char *, const char *, ...);
-int test_assert_equal_int(const char *, int, int, const char *, int, const char *, void *);
-int test_assert_equal_string(const char *, int, const char *v1, const char *, const char *v2, const char *, void *);
-int test_assert_equal_wstring(const char *, int, const wchar_t *v1, const char *, const wchar_t *v2, const char *, void *);
-int test_assert_equal_mem(const char *, int, const char *, const char *, const char *, const char *, size_t, const char *, void *);
-int test_assert_file_contents(const void *, int, const char *, ...);
-int test_assert_text_file_contents(const char *buff, const char *f);
-int test_assert_file_exists(const char *, ...);
-int test_assert_file_not_exists(const char *, ...);
/* Like sprintf, then system() */
int systemf(const char * fmt, ...);
+/* Delay until time() returns a value after this. */
+void sleepUntilAfter(time_t);
+
+/* Return true if this platform can create symlinks. */
+int canSymlink(void);
+
+/* Return true if this platform can run the "gzip" program. */
+int canGzip(void);
+
+/* Return true if this platform can run the "gunzip" program. */
+int canGunzip(void);
+
/* Suck file into string allocated via malloc(). Call free() when done. */
/* Supports printf-style args: slurpfile(NULL, "%s/myfile", refdir); */
char *slurpfile(size_t *, const char *fmt, ...);
@@ -168,4 +279,7 @@ void extract_reference_file(const char *);
*/
/* Pathname of exe to be tested. */
+const char *testprogfile;
+/* Name of exe to use in printf-formatted command strings. */
+/* On Windows, this includes leading/trailing quotes. */
const char *testprog;
diff --git a/usr.bin/cpio/test/test_0.c b/usr.bin/cpio/test/test_0.c
index d224daa..75a1437 100644
--- a/usr.bin/cpio/test/test_0.c
+++ b/usr.bin/cpio/test/test_0.c
@@ -39,11 +39,11 @@ DEFINE_TEST(test_0)
{
struct stat st;
- failure("File %s does not exist?!", testprog);
- if (!assertEqualInt(0, stat(testprog, &st)))
+ failure("File %s does not exist?!", testprogfile);
+ if (!assertEqualInt(0, stat(testprogfile, &st)))
exit(1);
- failure("%s is not executable?!", testprog);
+ failure("%s is not executable?!", testprogfile);
if (!assert((st.st_mode & 0111) != 0))
exit(1);
diff --git a/usr.bin/cpio/test/test_basic.c b/usr.bin/cpio/test/test_basic.c
index a4eb60f..3a3fae8 100644
--- a/usr.bin/cpio/test/test_basic.c
+++ b/usr.bin/cpio/test/test_basic.c
@@ -26,106 +26,32 @@
__FBSDID("$FreeBSD$");
static void
-verify_files(const char *target)
+verify_files(const char *msg)
{
- struct stat st, st2;
-#if !defined(_WIN32) || defined(__CYGWIN__)
- char buff[128];
-#endif
- int r;
-
/*
* Verify unpacked files.
*/
/* Regular file with 2 links. */
- r = lstat("file", &st);
- failure("Failed to stat file %s/file, errno=%d", target, errno);
- assertEqualInt(r, 0);
- if (r == 0) {
- assert(S_ISREG(st.st_mode));
-#if defined(_WIN32) && !defined(__CYGWIN__)
- /* Group members bits and others bits do not work. */
- assertEqualInt(0600, st.st_mode & 0700);
-#else
- assertEqualInt(0644, st.st_mode & 0777);
-#endif
- assertEqualInt(10, st.st_size);
- failure("file %s/file should have 2 links", target);
- assertEqualInt(2, st.st_nlink);
- }
+ assertIsReg("file", 0644);
+ failure(msg);
+ assertFileSize("file", 10);
+ assertFileNLinks("file", 2);
/* Another name for the same file. */
- r = lstat("linkfile", &st2);
- failure("Failed to stat file %s/linkfile, errno=%d", target, errno);
- assertEqualInt(r, 0);
- if (r == 0) {
- assert(S_ISREG(st2.st_mode));
-#if defined(_WIN32) && !defined(__CYGWIN__)
- /* Group members bits and others bits do not work. */
- assertEqualInt(0600, st2.st_mode & 0700);
-#else
- assertEqualInt(0644, st2.st_mode & 0777);
-#endif
- assertEqualInt(10, st2.st_size);
- failure("file %s/linkfile should have 2 links", target);
- assertEqualInt(2, st2.st_nlink);
- /* Verify that the two are really hardlinked. */
- assertEqualInt(st.st_dev, st2.st_dev);
- failure("%s/linkfile and %s/file should be hardlinked",
- target, target);
- assertEqualInt(st.st_ino, st2.st_ino);
- }
+ assertIsHardlink("linkfile", "file");
/* Symlink */
- r = lstat("symlink", &st);
- failure("Failed to stat file %s/symlink, errno=%d", target, errno);
- assertEqualInt(r, 0);
-#if !defined(_WIN32) || defined(__CYGWIN__)
- if (r == 0) {
- failure("symlink should be a symlink; actual mode is %o",
- st.st_mode);
- assert(S_ISLNK(st.st_mode));
- if (S_ISLNK(st.st_mode)) {
- r = readlink("symlink", buff, sizeof(buff));
- assertEqualInt(r, 4);
- buff[r] = '\0';
- assertEqualString(buff, "file");
- }
- }
-#endif
+ if (canSymlink())
+ assertIsSymlink("symlink", "file");
/* Another file with 1 link and different permissions. */
- r = lstat("file2", &st);
- failure("Failed to stat file %s/file2, errno=%d", target, errno);
- assertEqualInt(r, 0);
- if (r == 0) {
- assert(S_ISREG(st.st_mode));
- failure("%s/file2: st.st_mode = %o", target, st.st_mode);
-#if defined(_WIN32) && !defined(__CYGWIN__)
- /* Execution bit and group members bits and others
- * bits do not work. */
- assertEqualInt(0600, st.st_mode & 0700);
-#else
- assertEqualInt(0777, st.st_mode & 0777);
-#endif
- assertEqualInt(10, st.st_size);
- failure("file %s/file2 should have 1 link", target);
- assertEqualInt(1, st.st_nlink);
- }
+ assertIsReg("file2", 0777);
+ assertFileSize("file2", 10);
+ assertFileNLinks("file2", 1);
/* dir */
- r = lstat("dir", &st);
- if (r == 0) {
- assertEqualInt(r, 0);
- assert(S_ISDIR(st.st_mode));
- failure("%s/dir: st.st_mode = %o", target, st.st_mode);
-#if defined(_WIN32) && !defined(__CYGWIN__)
- assertEqualInt(0700, st.st_mode & 0700);
-#else
- assertEqualInt(0775, st.st_mode & 0777);
-#endif
- }
+ assertIsDir("dir", 0775);
}
static void
@@ -136,7 +62,7 @@ basic_cpio(const char *target,
{
int r;
- if (!assertEqualInt(0, mkdir(target, 0775)))
+ if (!assertMakeDir(target, 0775))
return;
/* Use the cpio program to create an archive. */
@@ -145,7 +71,7 @@ basic_cpio(const char *target,
failure("Error invoking %s -o %s", testprog, pack_options);
assertEqualInt(r, 0);
- chdir(target);
+ assertChdir(target);
/* Verify stderr. */
failure("Expected: %s, options=%s", se, pack_options);
@@ -163,9 +89,9 @@ basic_cpio(const char *target,
failure("Error invoking %s -i %s in dir %s", testprog, unpack_options, target);
assertTextFileContents(se, "unpack.err");
- verify_files(target);
+ verify_files(pack_options);
- chdir("..");
+ assertChdir("..");
}
static void
@@ -173,7 +99,7 @@ passthrough(const char *target)
{
int r;
- if (!assertEqualInt(0, mkdir(target, 0775)))
+ if (!assertMakeDir(target, 0775))
return;
/*
@@ -184,77 +110,64 @@ passthrough(const char *target)
failure("Error invoking %s -p", testprog);
assertEqualInt(r, 0);
- chdir(target);
+ assertChdir(target);
/* Verify stderr. */
failure("Error invoking %s -p in dir %s",
testprog, target);
assertTextFileContents("1 block\n", "stderr");
- verify_files(target);
- chdir("..");
+ verify_files("passthrough");
+ assertChdir("..");
}
DEFINE_TEST(test_basic)
{
- int fd;
- int filelist;
- int oldumask;
+ FILE *filelist;
+ const char *msg;
- oldumask = umask(0);
+ assertUmask(0);
/*
* Create an assortment of files on disk.
*/
- filelist = open("filelist", O_CREAT | O_WRONLY, 0644);
+ filelist = fopen("filelist", "w");
/* File with 10 bytes content. */
- fd = open("file", O_CREAT | O_WRONLY, 0644);
- assert(fd >= 0);
- assertEqualInt(10, write(fd, "123456789", 10));
- close(fd);
- write(filelist, "file\n", 5);
+ assertMakeFile("file", 0644, "1234567890");
+ fprintf(filelist, "file\n");
/* hardlink to above file. */
- assertEqualInt(0, link("file", "linkfile"));
- write(filelist, "linkfile\n", 9);
+ assertMakeHardlink("linkfile", "file");
+ fprintf(filelist, "linkfile\n");
/* Symlink to above file. */
- assertEqualInt(0, symlink("file", "symlink"));
- write(filelist, "symlink\n", 8);
+ if (canSymlink()) {
+ assertMakeSymlink("symlink", "file");
+ fprintf(filelist, "symlink\n");
+ }
/* Another file with different permissions. */
- fd = open("file2", O_CREAT | O_WRONLY, 0777);
- assert(fd >= 0);
- assertEqualInt(10, write(fd, "123456789", 10));
- close(fd);
- write(filelist, "file2\n", 6);
+ assertMakeFile("file2", 0777, "1234567890");
+ fprintf(filelist, "file2\n");
/* Directory. */
- assertEqualInt(0, mkdir("dir", 0775));
- write(filelist, "dir\n", 4);
+ assertMakeDir("dir", 0775);
+ fprintf(filelist, "dir\n");
/* All done. */
- close(filelist);
+ fclose(filelist);
- umask(022);
+ assertUmask(022);
/* Archive/dearchive with a variety of options. */
- basic_cpio("copy", "", "", "2 blocks\n");
- basic_cpio("copy_odc", "--format=odc", "", "2 blocks\n");
+ msg = canSymlink() ? "2 blocks\n" : "1 block\n";
+ basic_cpio("copy", "", "", msg);
+ basic_cpio("copy_odc", "--format=odc", "", msg);
basic_cpio("copy_newc", "-H newc", "", "2 blocks\n");
- basic_cpio("copy_cpio", "-H odc", "", "2 blocks\n");
-#if defined(_WIN32) && !defined(__CYGWIN__)
- /*
- * On Windows, symbolic link does not work.
- * Currentry copying file instead. therefore block size is
- * different.
- */
- basic_cpio("copy_ustar", "-H ustar", "", "10 blocks\n");
-#else
- basic_cpio("copy_ustar", "-H ustar", "", "9 blocks\n");
-#endif
+ basic_cpio("copy_cpio", "-H odc", "", msg);
+ msg = canSymlink() ? "9 blocks\n" : "8 blocks\n";
+ basic_cpio("copy_ustar", "-H ustar", "", msg);
+
/* Copy in one step using -p */
passthrough("passthrough");
-
- umask(oldumask);
}
diff --git a/usr.bin/cpio/test/test_cmdline.c b/usr.bin/cpio/test/test_cmdline.c
new file mode 100644
index 0000000..2dd7d65
--- /dev/null
+++ b/usr.bin/cpio/test/test_cmdline.c
@@ -0,0 +1,107 @@
+/*-
+ * Copyright (c) 2003-2009 Tim Kientzle
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR(S) ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+#include "test.h"
+__FBSDID("$FreeBSD$");
+
+/*
+ * Test the command-line parsing.
+ */
+
+DEFINE_TEST(test_cmdline)
+{
+ FILE *f;
+
+ /* Create an empty file. */
+ f = fopen("empty", "wb");
+ assert(f != NULL);
+ fclose(f);
+
+ failure("-Q is an invalid option on every cpio program I know of");
+ assert(0 != systemf("%s -i -Q <empty >1.out 2>1.err", testprog));
+ assertEmptyFile("1.out");
+
+ failure("-f requires an argument");
+ assert(0 != systemf("%s -if <empty >2.out 2>2.err", testprog));
+ assertEmptyFile("2.out");
+
+ failure("-f requires an argument");
+ assert(0 != systemf("%s -i -f <empty >3.out 2>3.err", testprog));
+ assertEmptyFile("3.out");
+
+ failure("--format requires an argument");
+ assert(0 != systemf("%s -i --format <empty >4.out 2>4.err", testprog));
+ assertEmptyFile("4.out");
+
+ failure("--badopt is an invalid option");
+ assert(0 != systemf("%s -i --badop <empty >5.out 2>5.err", testprog));
+ assertEmptyFile("5.out");
+
+ failure("--badopt is an invalid option");
+ assert(0 != systemf("%s -i --badopt <empty >6.out 2>6.err", testprog));
+ assertEmptyFile("6.out");
+
+ failure("--n is ambiguous");
+ assert(0 != systemf("%s -i --n <empty >7.out 2>7.err", testprog));
+ assertEmptyFile("7.out");
+
+ failure("--create forbids an argument");
+ assert(0 != systemf("%s --create=arg <empty >8.out 2>8.err", testprog));
+ assertEmptyFile("8.out");
+
+ failure("-i with empty input should succeed");
+ assert(0 == systemf("%s -i <empty >9.out 2>9.err", testprog));
+ assertEmptyFile("9.out");
+
+ failure("-o with empty input should succeed");
+ assert(0 == systemf("%s -o <empty >10.out 2>10.err", testprog));
+
+ failure("-i -p is nonsense");
+ assert(0 != systemf("%s -i -p <empty >11.out 2>11.err", testprog));
+ assertEmptyFile("11.out");
+
+ failure("-p -i is nonsense");
+ assert(0 != systemf("%s -p -i <empty >12.out 2>12.err", testprog));
+ assertEmptyFile("12.out");
+
+ failure("-i -o is nonsense");
+ assert(0 != systemf("%s -i -o <empty >13.out 2>13.err", testprog));
+ assertEmptyFile("13.out");
+
+ failure("-o -i is nonsense");
+ assert(0 != systemf("%s -o -i <empty >14.out 2>14.err", testprog));
+ assertEmptyFile("14.out");
+
+ failure("-o -p is nonsense");
+ assert(0 != systemf("%s -o -p <empty >15.out 2>15.err", testprog));
+ assertEmptyFile("15.out");
+
+ failure("-p -o is nonsense");
+ assert(0 != systemf("%s -p -o <empty >16.out 2>16.err", testprog));
+ assertEmptyFile("16.out");
+
+ failure("-p with empty input should fail");
+ assert(0 != systemf("%s -p <empty >17.out 2>17.err", testprog));
+ assertEmptyFile("17.out");
+}
diff --git a/usr.bin/cpio/test/test_format_newc.c b/usr.bin/cpio/test/test_format_newc.c
index 816f074..eb87c31 100644
--- a/usr.bin/cpio/test/test_format_newc.c
+++ b/usr.bin/cpio/test/test_format_newc.c
@@ -25,6 +25,13 @@
#include "test.h"
__FBSDID("$FreeBSD$");
+/* Number of bytes needed to pad 'n' to multiple of 'block', assuming
+ * that 'block' is a power of two. This trick can be more easily
+ * remembered as -n & (block - 1), but many compilers quite reasonably
+ * warn about "-n" when n is an unsigned value. (~(n) + 1) is the
+ * same thing, but written in a way that won't offend anyone. */
+#define PAD(n, block) ((~(n) + 1) & ((block) - 1))
+
static int
is_hex(const char *p, size_t l)
{
@@ -63,60 +70,67 @@ from_hex(const char *p, size_t l)
DEFINE_TEST(test_format_newc)
{
- int fd, list;
+ FILE *list;
int r;
int devmajor, devminor, ino, gid;
+ int uid = -1;
time_t t, t2, now;
char *p, *e;
size_t s, fs, ns;
- mode_t oldmask;
- oldmask = umask(0);
+ assertUmask(0);
+
+#if !defined(_WIN32)
+ uid = getuid();
+#endif
/*
* Create an assortment of files.
* TODO: Extend this to cover more filetypes.
*/
- list = open("list", O_CREAT | O_WRONLY, 0644);
+ list = fopen("list", "w");
/* "file1" */
- fd = open("file1", O_CREAT | O_WRONLY, 0644);
- assert(fd >= 0);
- assertEqualInt(10, write(fd, "123456789", 10));
- close(fd);
- assertEqualInt(6, write(list, "file1\n", 6));
+ assertMakeFile("file1", 0644, "1234567890");
+ fprintf(list, "file1\n");
/* "hardlink" */
- assertEqualInt(0, link("file1", "hardlink"));
- assertEqualInt(9, write(list, "hardlink\n", 9));
+ assertMakeHardlink("hardlink", "file1");
+ fprintf(list, "hardlink\n");
/* Another hardlink, but this one won't be archived. */
- assertEqualInt(0, link("file1", "hardlink2"));
+ assertMakeHardlink("hardlink2", "file1");
/* "symlink" */
- assertEqualInt(0, symlink("file1", "symlink"));
- assertEqualInt(8, write(list, "symlink\n", 8));
+ if (canSymlink()) {
+ assertMakeSymlink("symlink", "file1");
+ fprintf(list, "symlink\n");
+ }
/* "dir" */
- assertEqualInt(0, mkdir("dir", 0775));
- assertEqualInt(4, write(list, "dir\n", 4));
+ assertMakeDir("dir", 0775);
+ fprintf(list, "dir\n");
/* Record some facts about what we just created: */
now = time(NULL); /* They were all created w/in last two seconds. */
/* Use the cpio program to create an archive. */
- close(list);
+ fclose(list);
r = systemf("%s -o --format=newc <list >newc.out 2>newc.err",
testprog);
if (!assertEqualInt(r, 0))
return;
/* Verify that nothing went to stderr. */
- assertTextFileContents("2 blocks\n", "newc.err");
+ if (canSymlink()) {
+ assertTextFileContents("2 blocks\n", "newc.err");
+ } else {
+ assertTextFileContents("1 block\n", "newc.err");
+ }
/* Verify that stdout is a well-formed cpio file in "newc" format. */
p = slurpfile(&s, "newc.out");
- assertEqualInt(s, 1024);
+ assertEqualInt(s, canSymlink() ? 1024 : 512);
e = p;
/*
@@ -133,8 +147,10 @@ DEFINE_TEST(test_format_newc)
assertEqualInt(0x8180, from_hex(e + 14, 8) & 0xffc0); /* Mode */
#else
assertEqualInt(0x81a4, from_hex(e + 14, 8)); /* Mode */
-#endif
- assertEqualInt(from_hex(e + 22, 8), getuid()); /* uid */
+#endif
+ if (uid < 0)
+ uid = from_hex(e + 22, 8);
+ assertEqualInt(from_hex(e + 22, 8), uid); /* uid */
gid = from_hex(e + 30, 8); /* gid */
assertEqualMem(e + 38, "00000003", 8); /* nlink */
t = from_hex(e + 46, 8); /* mtime */
@@ -147,68 +163,60 @@ DEFINE_TEST(test_format_newc)
" field should be zero");
assertEqualInt(0, from_hex(e + 54, 8)); /* File size */
fs = from_hex(e + 54, 8);
- fs += 3 & -fs;
+ fs += PAD(fs, 4);
devmajor = from_hex(e + 62, 8); /* devmajor */
devminor = from_hex(e + 70, 8); /* devminor */
assert(is_hex(e + 78, 8)); /* rdevmajor */
assert(is_hex(e + 86, 8)); /* rdevminor */
assertEqualMem(e + 94, "00000006", 8); /* Name size */
ns = from_hex(e + 94, 8);
- ns += 3 & (-ns - 2);
+ ns += PAD(ns + 2, 4);
assertEqualInt(0, from_hex(e + 102, 8)); /* check field */
assertEqualMem(e + 110, "file1\0", 6); /* Name contents */
/* Since there's another link, no file contents here. */
/* But add in file size so that an error here doesn't cascade. */
e += 110 + fs + ns;
- /* "symlink" pointing to "file1" */
- assert(is_hex(e, 110));
- assertEqualMem(e + 0, "070701", 6); /* Magic */
- assert(is_hex(e + 6, 8)); /* ino */
-#if !defined(_WIN32) || defined(__CYGWIN__)
- /* On Windows, symbolic link and group members bits and
- * others bits do not work. */
- assertEqualInt(0xa1ff, from_hex(e + 14, 8)); /* Mode */
-#endif
- assertEqualInt(from_hex(e + 22, 8), getuid()); /* uid */
- assertEqualInt(gid, from_hex(e + 30, 8)); /* gid */
- assertEqualMem(e + 38, "00000001", 8); /* nlink */
- t2 = from_hex(e + 46, 8); /* mtime */
- failure("First entry created at t=0x%08x this entry created at t2=0x%08x", t, t2);
- assert(t2 == t || t2 == t + 1); /* Almost same as first entry. */
-#if defined(_WIN32) && !defined(__CYGWIN__)
- /* Symbolic link does not work. */
- assertEqualMem(e + 54, "0000000a", 8); /* File size */
-#else
- assertEqualMem(e + 54, "00000005", 8); /* File size */
-#endif
- fs = from_hex(e + 54, 8);
- fs += 3 & -fs;
- assertEqualInt(devmajor, from_hex(e + 62, 8)); /* devmajor */
- assertEqualInt(devminor, from_hex(e + 70, 8)); /* devminor */
- assert(is_hex(e + 78, 8)); /* rdevmajor */
- assert(is_hex(e + 86, 8)); /* rdevminor */
- assertEqualMem(e + 94, "00000008", 8); /* Name size */
- ns = from_hex(e + 94, 8);
- ns += 3 & (-ns - 2);
- assertEqualInt(0, from_hex(e + 102, 8)); /* check field */
- assertEqualMem(e + 110, "symlink\0\0\0", 10); /* Name contents */
-#if !defined(_WIN32) || defined(__CYGWIN__)
- assertEqualMem(e + 110 + ns, "file1\0\0\0", 8); /* symlink target */
-#endif
- e += 110 + fs + ns;
+ if (canSymlink()) {
+ /* "symlink" pointing to "file1" */
+ assert(is_hex(e, 110));
+ assertEqualMem(e + 0, "070701", 6); /* Magic */
+ assert(is_hex(e + 6, 8)); /* ino */
+ assertEqualInt(0xa1ff, from_hex(e + 14, 8)); /* Mode */
+ assertEqualInt(from_hex(e + 22, 8), uid); /* uid */
+ assertEqualInt(gid, from_hex(e + 30, 8)); /* gid */
+ assertEqualMem(e + 38, "00000001", 8); /* nlink */
+ t2 = from_hex(e + 46, 8); /* mtime */
+ failure("First entry created at t=0x%08x this entry created at t2=0x%08x", t, t2);
+ assert(t2 == t || t2 == t + 1); /* Almost same as first entry. */
+ assertEqualMem(e + 54, "00000005", 8); /* File size */
+ fs = from_hex(e + 54, 8);
+ fs += PAD(fs, 4);
+ assertEqualInt(devmajor, from_hex(e + 62, 8)); /* devmajor */
+ assertEqualInt(devminor, from_hex(e + 70, 8)); /* devminor */
+ assert(is_hex(e + 78, 8)); /* rdevmajor */
+ assert(is_hex(e + 86, 8)); /* rdevminor */
+ assertEqualMem(e + 94, "00000008", 8); /* Name size */
+ ns = from_hex(e + 94, 8);
+ ns += PAD(ns + 2, 4);
+ assertEqualInt(0, from_hex(e + 102, 8)); /* check field */
+ assertEqualMem(e + 110, "symlink\0\0\0", 10); /* Name contents */
+ assertEqualMem(e + 110 + ns, "file1\0\0\0", 8); /* symlink target */
+ e += 110 + fs + ns;
+ }
/* "dir" */
assert(is_hex(e, 110));
assertEqualMem(e + 0, "070701", 6); /* Magic */
assert(is_hex(e + 6, 8)); /* ino */
#if defined(_WIN32) && !defined(__CYGWIN__)
- /* Group members bits and others bits do not work. */
+ /* Group members bits and others bits do not work. */
assertEqualInt(0x41c0, from_hex(e + 14, 8) & 0xffc0); /* Mode */
#else
- assertEqualInt(0x41fd, from_hex(e + 14, 8)); /* Mode */
+ /* Mode: sgid bit sometimes propagates from parent dirs, ignore it. */
+ assertEqualInt(040775, from_hex(e + 14, 8) & ~02000);
#endif
- assertEqualInt(from_hex(e + 22, 8), getuid()); /* uid */
+ assertEqualInt(from_hex(e + 22, 8), uid); /* uid */
assertEqualInt(gid, from_hex(e + 30, 8)); /* gid */
#ifndef NLINKS_INACCURATE_FOR_DIRS
assertEqualMem(e + 38, "00000002", 8); /* nlink */
@@ -218,14 +226,14 @@ DEFINE_TEST(test_format_newc)
assert(t2 == t || t2 == t + 1); /* Almost same as first entry. */
assertEqualMem(e + 54, "00000000", 8); /* File size */
fs = from_hex(e + 54, 8);
- fs += 3 & -fs;
+ fs += PAD(fs, 4);
assertEqualInt(devmajor, from_hex(e + 62, 8)); /* devmajor */
assertEqualInt(devminor, from_hex(e + 70, 8)); /* devminor */
assert(is_hex(e + 78, 8)); /* rdevmajor */
assert(is_hex(e + 86, 8)); /* rdevminor */
assertEqualMem(e + 94, "00000004", 8); /* Name size */
ns = from_hex(e + 94, 8);
- ns += 3 & (-ns - 2);
+ ns += PAD(ns + 2, 4);
assertEqualInt(0, from_hex(e + 102, 8)); /* check field */
assertEqualMem(e + 110, "dir\0\0\0", 6); /* Name contents */
e += 110 + fs + ns;
@@ -243,7 +251,7 @@ DEFINE_TEST(test_format_newc)
#else
assertEqualInt(0x81a4, from_hex(e + 14, 8)); /* Mode */
#endif
- assertEqualInt(from_hex(e + 22, 8), getuid()); /* uid */
+ assertEqualInt(from_hex(e + 22, 8), uid); /* uid */
assertEqualInt(gid, from_hex(e + 30, 8)); /* gid */
assertEqualMem(e + 38, "00000003", 8); /* nlink */
t2 = from_hex(e + 46, 8); /* mtime */
@@ -251,17 +259,17 @@ DEFINE_TEST(test_format_newc)
assert(t2 == t || t2 == t + 1); /* Almost same as first entry. */
assertEqualInt(10, from_hex(e + 54, 8)); /* File size */
fs = from_hex(e + 54, 8);
- fs += 3 & -fs;
+ fs += PAD(fs, 4);
assertEqualInt(devmajor, from_hex(e + 62, 8)); /* devmajor */
assertEqualInt(devminor, from_hex(e + 70, 8)); /* devminor */
assert(is_hex(e + 78, 8)); /* rdevmajor */
assert(is_hex(e + 86, 8)); /* rdevminor */
assertEqualMem(e + 94, "00000009", 8); /* Name size */
ns = from_hex(e + 94, 8);
- ns += 3 & (-ns - 2);
+ ns += PAD(ns + 2, 4);
assertEqualInt(0, from_hex(e + 102, 8)); /* check field */
assertEqualMem(e + 110, "hardlink\0\0", 10); /* Name contents */
- assertEqualMem(e + 110 + ns, "123456789\0\0\0", 12); /* File contents */
+ assertEqualMem(e + 110 + ns, "1234567890\0\0", 12); /* File contents */
e += 110 + ns + fs;
/* Last entry is end-of-archive marker. */
@@ -283,6 +291,4 @@ DEFINE_TEST(test_format_newc)
assertEqualMem(e + 110, "TRAILER!!!\0\0", 12); /* Name */
free(p);
-
- umask(oldmask);
}
diff --git a/usr.bin/cpio/test/test_gcpio_compat.c b/usr.bin/cpio/test/test_gcpio_compat.c
index 767719b..3d992c4 100644
--- a/usr.bin/cpio/test/test_gcpio_compat.c
+++ b/usr.bin/cpio/test/test_gcpio_compat.c
@@ -28,15 +28,11 @@ __FBSDID("$FreeBSD$");
static void
unpack_test(const char *from, const char *options, const char *se)
{
- struct stat st, st2;
-#if !defined(_WIN32) || defined(__CYGWIN__)
- char buff[128];
-#endif
int r;
/* Create a work dir named after the file we're unpacking. */
- assertEqualInt(0, mkdir(from, 0775));
- chdir(from);
+ assertMakeDir(from, 0775);
+ assertChdir(from);
/*
* Use cpio to unpack the sample archive
@@ -49,96 +45,64 @@ unpack_test(const char *from, const char *options, const char *se)
assertEqualInt(r, 0);
/* Verify that nothing went to stderr. */
- failure("Error invoking %s -i %s < %s", testprog, options, from);
- assertTextFileContents(se, "unpack.err");
+ if (canSymlink()) {
+ failure("Error invoking %s -i %s < %s",
+ testprog, options, from);
+ assertTextFileContents(se, "unpack.err");
+ }
/*
* Verify unpacked files.
*/
/* Regular file with 2 links. */
- r = lstat("file", &st);
- failure("Failed to stat file %s/file, errno=%d", from, errno);
- assertEqualInt(r, 0);
- if (r == 0) {
- assert(S_ISREG(st.st_mode));
-#if defined(_WIN32) && !defined(__CYGWIN__)
- assertEqualInt(0600, st.st_mode & 0700);
-#else
- assertEqualInt(0644, st.st_mode & 0777);
-#endif
- failure("file %s/file", from);
- assertEqualInt(10, st.st_size);
- failure("file %s/file", from);
- assertEqualInt(2, st.st_nlink);
- }
+ assertIsReg("file", 0644);
+ failure("%s", from);
+ assertFileSize("file", 10);
+ assertFileSize("linkfile", 10);
+ failure("%s", from);
+ assertFileNLinks("file", 2);
/* Another name for the same file. */
- r = lstat("linkfile", &st2);
- failure("Failed to stat file %s/linkfile, errno=%d", from, errno);
- assertEqualInt(r, 0);
- if (r == 0) {
- assert(S_ISREG(st2.st_mode));
-#if defined(_WIN32) && !defined(__CYGWIN__)
- assertEqualInt(0600, st2.st_mode & 0700);
-#else
- assertEqualInt(0644, st2.st_mode & 0777);
-#endif
- failure("file %s/file", from);
- assertEqualInt(10, st2.st_size);
- failure("file %s/file", from);
- assertEqualInt(2, st2.st_nlink);
- failure("file and linkfile should be hardlinked");
- assertEqualInt(st.st_dev, st2.st_dev);
- failure("file %s/file", from);
- assertEqualInt(st.st_ino, st2.st_ino);
- }
+ failure("%s", from);
+ assertIsHardlink("linkfile", "file");
+ assertFileSize("file", 10);
+ assertFileSize("linkfile", 10);
/* Symlink */
- r = lstat("symlink", &st);
- failure("Failed to stat file %s/symlink, errno=%d", from, errno);
- assertEqualInt(r, 0);
-#if !defined(_WIN32) || defined(__CYGWIN__)
- if (r == 0) {
- failure("symlink should be a symlink; actual mode is %o",
- st.st_mode);
- assert(S_ISLNK(st.st_mode));
- if (S_ISLNK(st.st_mode)) {
- r = readlink("symlink", buff, sizeof(buff));
- assertEqualInt(r, 4);
- buff[r] = '\0';
- assertEqualString(buff, "file");
- }
- }
-#endif
+ if (canSymlink())
+ assertIsSymlink("symlink", "file");
/* dir */
- r = lstat("dir", &st);
- if (r == 0) {
- assertEqualInt(r, 0);
- assert(S_ISDIR(st.st_mode));
-#if defined(_WIN32) && !defined(__CYGWIN__)
- assertEqualInt(0700, st.st_mode & 0700);
-#else
- assertEqualInt(0775, st.st_mode & 0777);
-#endif
- }
+ assertIsDir("dir", 0775);
- chdir("..");
+ assertChdir("..");
}
DEFINE_TEST(test_gcpio_compat)
{
- int oldumask;
-
- oldumask = umask(0);
+ assertUmask(0);
/* Dearchive sample files with a variety of options. */
- unpack_test("test_gcpio_compat_ref.bin", "", "1 block\n");
- unpack_test("test_gcpio_compat_ref.crc", "", "2 blocks\n");
- unpack_test("test_gcpio_compat_ref.newc", "", "2 blocks\n");
- /* gcpio-2.9 only reads 6 blocks here */
- unpack_test("test_gcpio_compat_ref.ustar", "", "7 blocks\n");
-
- umask(oldumask);
+ if (canSymlink()) {
+ unpack_test("test_gcpio_compat_ref.bin",
+ "--no-preserve-owner", "1 block\n");
+ unpack_test("test_gcpio_compat_ref.crc",
+ "--no-preserve-owner", "2 blocks\n");
+ unpack_test("test_gcpio_compat_ref.newc",
+ "--no-preserve-owner", "2 blocks\n");
+ /* gcpio-2.9 only reads 6 blocks here */
+ unpack_test("test_gcpio_compat_ref.ustar",
+ "--no-preserve-owner", "7 blocks\n");
+ } else {
+ unpack_test("test_gcpio_compat_ref_nosym.bin",
+ "--no-preserve-owner", "1 block\n");
+ unpack_test("test_gcpio_compat_ref_nosym.crc",
+ "--no-preserve-owner", "2 blocks\n");
+ unpack_test("test_gcpio_compat_ref_nosym.newc",
+ "--no-preserve-owner", "2 blocks\n");
+ /* gcpio-2.9 only reads 6 blocks here */
+ unpack_test("test_gcpio_compat_ref_nosym.ustar",
+ "--no-preserve-owner", "7 blocks\n");
+ }
}
diff --git a/usr.bin/cpio/test/test_gcpio_compat_ref_nosym.bin.uu b/usr.bin/cpio/test/test_gcpio_compat_ref_nosym.bin.uu
new file mode 100644
index 0000000..7a2a272
--- /dev/null
+++ b/usr.bin/cpio/test/test_gcpio_compat_ref_nosym.bin.uu
@@ -0,0 +1,17 @@
+$FreeBSD$
+
+begin 644 test_gcpio_compat_ref_nosym.bin
+MQW%4`-[Z_4'H`^@#`@`VNZU*NQX$``````!D:7(`QW%4`-SZI('H`^@#`@`G
+MNZU*NQX%````"@!F:6QE```Q,C,T-38W.#D*QW%4`-SZI('H`^@#`@`GNZU*
+MNQX)````"@!L:6YK9FEL90``,3(S-#4V-S@Y"L=Q``````````````$`````
+M````"P``````5%)!24Q%4B$A(0``````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+1````````````````````````
+`
+end
diff --git a/usr.bin/cpio/test/test_gcpio_compat_ref_nosym.crc.uu b/usr.bin/cpio/test/test_gcpio_compat_ref_nosym.crc.uu
new file mode 100644
index 0000000..0147df7
--- /dev/null
+++ b/usr.bin/cpio/test/test_gcpio_compat_ref_nosym.crc.uu
@@ -0,0 +1,17 @@
+$FreeBSD$
+
+begin 644 test_gcpio_compat_ref_nosym.crc
+M,#<P-S`R,#`U-D9!1$4P,#`P-#%&1#`P,#`P,T4X,#`P,#`S13@P,#`P,#`P
+M,C1!040Q14)",#`P,#`P,#`P,#`P,#`P,#`P,#`P,#4T,#`P,#`P0D(P,35"
+M,#`S-C`P,#`P,#`T,#`P,#`P,#!D:7(````P-S`W,#(P,#4V1D%$0S`P,#`X
+M,4$T,#`P,#`S13@P,#`P,#-%.#`P,#`P,#`R-$%!1#%%0D(P,#`P,#`P,#`P
+M,#`P,#`P,#`P,#`P-30P,#`P,#!"0C`Q-4(P,#(W,#`P,#`P,#4P,#`P,#`P
+M,&9I;&4``#`W,#<P,C`P-39&041#,#`P,#@Q030P,#`P,#-%.#`P,#`P,T4X
+M,#`P,#`P,#(T04%$,45"0C`P,#`P,#!!,#`P,#`P,#`P,#`P,#`U-#`P,#`P
+M,$)",#$U0C`P,C<P,#`P,#`P.3`P,#`P,44W;&EN:V9I;&4``#$R,S0U-C<X
+M.0H``#`W,#<P,C`P,#`P,#`P,#`P,#`P,#`P,#`P,#`P,#`P,#`P,#`P,#`P
+M,#`P,#$P,#`P,#`P,#`P,#`P,#`P,#`P,#`P,#`P,#`P,#`P,#`P,#`P,#`P
+M,#`P,#`P,#`P,#`P,#`P0C`P,#`P,#`P5%)!24Q%4B$A(0``````````````
+1````````````````````````
+`
+end
diff --git a/usr.bin/cpio/test/test_gcpio_compat_ref_nosym.newc.uu b/usr.bin/cpio/test/test_gcpio_compat_ref_nosym.newc.uu
new file mode 100644
index 0000000..e2a4900
--- /dev/null
+++ b/usr.bin/cpio/test/test_gcpio_compat_ref_nosym.newc.uu
@@ -0,0 +1,17 @@
+$FreeBSD$
+
+begin 644 test_gcpio_compat_ref_nosym.newc
+M,#<P-S`Q,#`U-D9!1$4P,#`P-#%&1#`P,#`P,T4X,#`P,#`S13@P,#`P,#`P
+M,C1!040Q14)",#`P,#`P,#`P,#`P,#`P,#`P,#`P,#4T,#`P,#`P0D(P,35"
+M,#`S-C`P,#`P,#`T,#`P,#`P,#!D:7(````P-S`W,#$P,#4V1D%$0S`P,#`X
+M,4$T,#`P,#`S13@P,#`P,#-%.#`P,#`P,#`R-$%!1#%%0D(P,#`P,#`P,#`P
+M,#`P,#`P,#`P,#`P-30P,#`P,#!"0C`Q-4(P,#(W,#`P,#`P,#4P,#`P,#`P
+M,&9I;&4``#`W,#<P,3`P-39&041#,#`P,#@Q030P,#`P,#-%.#`P,#`P,T4X
+M,#`P,#`P,#(T04%$,45"0C`P,#`P,#!!,#`P,#`P,#`P,#`P,#`U-#`P,#`P
+M,$)",#$U0C`P,C<P,#`P,#`P.3`P,#`P,#`P;&EN:V9I;&4``#$R,S0U-C<X
+M.0H``#`W,#<P,3`P,#`P,#`P,#`P,#`P,#`P,#`P,#`P,#`P,#`P,#`P,#`P
+M,#`P,#$P,#`P,#`P,#`P,#`P,#`P,#`P,#`P,#`P,#`P,#`P,#`P,#`P,#`P
+M,#`P,#`P,#`P,#`P,#`P0C`P,#`P,#`P5%)!24Q%4B$A(0``````````````
+1````````````````````````
+`
+end
diff --git a/usr.bin/cpio/test/test_gcpio_compat_ref_nosym.ustar.uu b/usr.bin/cpio/test/test_gcpio_compat_ref_nosym.ustar.uu
new file mode 100644
index 0000000..b5cbd66
--- /dev/null
+++ b/usr.bin/cpio/test/test_gcpio_compat_ref_nosym.ustar.uu
@@ -0,0 +1,74 @@
+$FreeBSD$
+
+begin 644 test_gcpio_compat_ref_nosym.ustar
+M9&ER+P``````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M`````````````#`P,#`W-S4`,#`P,3<U,``P,#`Q-S4P`#`P,#`P,#`P,#`P
+M`#$Q,C4S,C$W,C<S`#`P,3$S-3$`-0``````````````````````````````
+M````````````````````````````````````````````````````````````
+M``````````````````````````````````````````!U<W1A<@`P,'1I;0``
+M````````````````````````````````````=&EM````````````````````
+M```````````````````P,#`P,C<S`#8V,#`P-C8`````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M``````````````````````!F:6QE````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````,#`P,#8T-``P,#`Q-S4P`#`P
+M,#$W-3``,#`P,#`P,#`P,3(`,3$R-3,R,3<R-S,`,#`Q,30R,P`P````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M`````'5S=&%R`#`P=&EM``````````````````````````````````````!T
+M:6T``````````````````````````````````````#`P,#`R-S,`-C8P,#`T
+M-P``````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M`````````````````````````````````````````````#$R,S0U-C<X.0H`
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````;&EN:V9I;&4`````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M`````````````````````#`P,#`V-#0`,#`P,3<U,``P,#`Q-S4P`#`P,#`P
+M,#`P,#`P`#$Q,C4S,C$W,C<S`#`P,3,Q,S<`,69I;&4`````````````````
+M````````````````````````````````````````````````````````````
+M``````````````````````````````````````````````````!U<W1A<@`P
+M,'1I;0``````````````````````````````````````=&EM````````````
+M```````````````````````````P,#`P,C<S`#8V,#`P-#<`````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+,````````````````
+`
+end
diff --git a/usr.bin/cpio/test/test_option_B.c b/usr.bin/cpio/test/test_option_B_upper.c
index 8083882..b040354 100644
--- a/usr.bin/cpio/test/test_option_B.c
+++ b/usr.bin/cpio/test/test_option_B_upper.c
@@ -26,29 +26,27 @@
__FBSDID("$FreeBSD$");
-DEFINE_TEST(test_option_B)
+DEFINE_TEST(test_option_B_upper)
{
struct stat st;
- int r, fd;
+ int r;
/*
* Create a file on disk.
*/
- fd = open("file", O_CREAT | O_WRONLY, 0644);
- assert(fd >= 0);
- close(fd);
+ assertMakeFile("file", 0644, NULL);
/* Create an archive without -B; this should be 512 bytes. */
r = systemf("echo file | %s -o > small.cpio 2>small.err", testprog);
assertEqualInt(r, 0);
- assertFileContents("1 block\n", 8, "small.err");
+ assertTextFileContents("1 block\n", "small.err");
assertEqualInt(0, stat("small.cpio", &st));
assertEqualInt(512, st.st_size);
/* Create an archive with -B; this should be 5120 bytes. */
r = systemf("echo file | %s -oB > large.cpio 2>large.err", testprog);
assertEqualInt(r, 0);
- assertFileContents("1 block\n", 8, "large.err");
+ assertTextFileContents("1 block\n", "large.err");
assertEqualInt(0, stat("large.cpio", &st));
assertEqualInt(5120, st.st_size);
}
diff --git a/usr.bin/cpio/test/test_option_C_upper.c b/usr.bin/cpio/test/test_option_C_upper.c
new file mode 100644
index 0000000..c8e63fd
--- /dev/null
+++ b/usr.bin/cpio/test/test_option_C_upper.c
@@ -0,0 +1,62 @@
+/*-
+ * Copyright (c) 2003-2007 Tim Kientzle
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR(S) ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+#include "test.h"
+__FBSDID("$FreeBSD$");
+
+
+DEFINE_TEST(test_option_C_upper)
+{
+ int r;
+
+ /*
+ * Create a file on disk.
+ */
+ assertMakeFile("file", 0644, NULL);
+
+ /* Create an archive without -C; this should be 512 bytes. */
+ r = systemf("echo file | %s -o > small.cpio 2>small.err", testprog);
+ assertEqualInt(r, 0);
+ assertTextFileContents("1 block\n", "small.err");
+ assertFileSize("small.cpio", 512);
+
+ /* Create an archive with -C 513; this should be 513 bytes. */
+ r = systemf("echo file | %s -o -C 513 > 513.cpio 2>513.err",
+ testprog);
+ assertEqualInt(r, 0);
+ assertTextFileContents("1 block\n", "513.err");
+ assertFileSize("513.cpio", 513);
+
+ /* Create an archive with -C 12345; this should be 12345 bytes. */
+ r = systemf("echo file | %s -o -C12345 > 12345.cpio 2>12345.err",
+ testprog);
+ assertEqualInt(r, 0);
+ assertTextFileContents("1 block\n", "12345.err");
+ assertFileSize("12345.cpio", 12345);
+
+ /* Create an archive with invalid -C request */
+ assert(0 != systemf("echo file | %s -o -C > bad.cpio 2>bad.err",
+ testprog));
+ assertEmptyFile("bad.cpio");
+}
diff --git a/usr.bin/cpio/line_reader.h b/usr.bin/cpio/test/test_option_J_upper.c
index 4f5dd6a..532aacf 100644
--- a/usr.bin/cpio/line_reader.h
+++ b/usr.bin/cpio/test/test_option_J_upper.c
@@ -1,5 +1,5 @@
/*-
- * Copyright (c) 2009 Joerg Sonnenberger
+ * Copyright (c) 2003-2009 Tim Kientzle
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
@@ -21,17 +21,36 @@
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * $FreeBSD$
*/
+#include "test.h"
+__FBSDID("$FreeBSD$");
-#ifndef LAFE_LINE_READER_H
-#define LAFE_LINE_READER_H
-
-struct line_reader;
+DEFINE_TEST(test_option_J_upper)
+{
+ char *p;
+ int r;
+ size_t s;
-struct line_reader *line_reader(const char *, int nullSeparator);
-const char *line_reader_next(struct line_reader *);
-void line_reader_free(struct line_reader *);
+ /* Create a file. */
+ assertMakeFile("f", 0644, "a");
-#endif
+ /* Archive it with xz compression. */
+ r = systemf("echo f | %s -o -J >archive.out 2>archive.err",
+ testprog);
+ p = slurpfile(&s, "archive.err");
+ p[s] = '\0';
+ if (r != 0) {
+ if (strstr(p, "compression not available") != NULL) {
+ skipping("This version of bsdcpio was compiled "
+ "without xz support");
+ return;
+ }
+ failure("-J option is broken");
+ assertEqualInt(r, 0);
+ return;
+ }
+ /* Check that the archive file has an xz signature. */
+ p = slurpfile(&s, "archive.out");
+ assert(s > 2);
+ assertEqualMem(p, "\3757zXZ", 5);
+}
diff --git a/usr.bin/cpio/test/test_option_L.c b/usr.bin/cpio/test/test_option_L_upper.c
index 79e2adb..0acc100 100644
--- a/usr.bin/cpio/test/test_option_L.c
+++ b/usr.bin/cpio/test/test_option_L_upper.c
@@ -25,60 +25,77 @@
#include "test.h"
__FBSDID("$FreeBSD$");
-DEFINE_TEST(test_option_L)
+/* This is a little pointless, as Windows doesn't support symlinks
+ * (except for the seriously crippled CreateSymbolicLink API) so these
+ * tests won't run on Windows. */
+#if defined(_WIN32) && !defined(__CYGWIN__)
+#define CAT "type"
+#else
+#define CAT "cat"
+#endif
+
+DEFINE_TEST(test_option_L_upper)
{
- struct stat st;
- int fd, filelist;
+ FILE *filelist;
int r;
- filelist = open("filelist", O_CREAT | O_WRONLY, 0644);
+ if (!canSymlink()) {
+ skipping("Symlink tests");
+ return;
+ }
+
+ filelist = fopen("filelist", "w");
/* Create a file and a symlink to the file. */
- fd = open("file", O_CREAT | O_WRONLY, 0644);
- assert(fd >= 0);
- assertEqualInt(10, write(fd, "123456789", 10));
- close(fd);
- write(filelist, "file\n", 5);
+ assertMakeFile("file", 0644, "1234567890");
+ fprintf(filelist, "file\n");
/* Symlink to above file. */
- assertEqualInt(0, symlink("file", "symlink"));
- write(filelist, "symlink\n", 8);
+ assertMakeSymlink("symlink", "file");
+ fprintf(filelist, "symlink\n");
- close(filelist);
+ fclose(filelist);
- r = systemf("cat filelist | %s -pd copy >copy.out 2>copy.err", testprog);
+ r = systemf(CAT " filelist | %s -pd copy >copy.out 2>copy.err", testprog);
assertEqualInt(r, 0);
- assertEqualInt(0, lstat("copy/symlink", &st));
+ assertTextFileContents("1 block\n", "copy.err");
+
failure("Regular -p without -L should preserve symlinks.");
- assert(S_ISLNK(st.st_mode));
+ assertIsSymlink("copy/symlink", NULL);
- r = systemf("cat filelist | %s -pd -L copy-L >copy-L.out 2>copy-L.err", testprog);
+ r = systemf(CAT " filelist | %s -pd -L copy-L >copy-L.out 2>copy-L.err", testprog);
assertEqualInt(r, 0);
assertEmptyFile("copy-L.out");
- assertFileContents("1 block\n", 8, "copy-L.err");
- assertEqualInt(0, lstat("copy-L/symlink", &st));
+ assertTextFileContents("1 block\n", "copy-L.err");
failure("-pdL should dereference symlinks and turn them into files.");
- assert(!S_ISLNK(st.st_mode));
+ assertIsReg("copy-L/symlink", -1);
- r = systemf("cat filelist | %s -o >archive.out 2>archive.err", testprog);
+ r = systemf(CAT " filelist | %s -o >archive.out 2>archive.err", testprog);
failure("Error invoking %s -o ", testprog);
assertEqualInt(r, 0);
+ assertTextFileContents("1 block\n", "archive.err");
- assertEqualInt(0, mkdir("unpack", 0755));
- r = systemf("cat archive.out | (cd unpack ; %s -i >unpack.out 2>unpack.err)", testprog);
+ assertMakeDir("unpack", 0755);
+ assertChdir("unpack");
+ r = systemf(CAT " ../archive.out | %s -i >unpack.out 2>unpack.err", testprog);
failure("Error invoking %s -i", testprog);
assertEqualInt(r, 0);
- assertEqualInt(0, lstat("unpack/symlink", &st));
- assert(S_ISLNK(st.st_mode));
+ assertTextFileContents("1 block\n", "unpack.err");
+ assertChdir("..");
+
+ assertIsSymlink("unpack/symlink", NULL);
- r = systemf("cat filelist | %s -oL >archive-L.out 2>archive-L.err", testprog);
+ r = systemf(CAT " filelist | %s -oL >archive-L.out 2>archive-L.err", testprog);
failure("Error invoking %s -oL", testprog);
assertEqualInt(r, 0);
+ assertTextFileContents("1 block\n", "archive-L.err");
- assertEqualInt(0, mkdir("unpack-L", 0755));
- r = systemf("cat archive-L.out | (cd unpack-L ; %s -i >unpack-L.out 2>unpack-L.err)", testprog);
+ assertMakeDir("unpack-L", 0755);
+ assertChdir("unpack-L");
+ r = systemf(CAT " ../archive-L.out | %s -i >unpack-L.out 2>unpack-L.err", testprog);
failure("Error invoking %s -i < archive-L.out", testprog);
assertEqualInt(r, 0);
- assertEqualInt(0, lstat("unpack-L/symlink", &st));
- assert(!S_ISLNK(st.st_mode));
+ assertTextFileContents("1 block\n", "unpack-L.err");
+ assertChdir("..");
+ assertIsReg("unpack-L/symlink", -1);
}
diff --git a/usr.bin/cpio/test/test_option_Z_upper.c b/usr.bin/cpio/test/test_option_Z_upper.c
new file mode 100644
index 0000000..936ce0c
--- /dev/null
+++ b/usr.bin/cpio/test/test_option_Z_upper.c
@@ -0,0 +1,56 @@
+/*-
+ * Copyright (c) 2003-2009 Tim Kientzle
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR(S) ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+#include "test.h"
+__FBSDID("$FreeBSD$");
+
+DEFINE_TEST(test_option_Z_upper)
+{
+ char *p;
+ int r;
+ size_t s;
+
+ /* Create a file. */
+ assertMakeFile("f", 0644, "a");
+
+ /* Archive it with compress compression. */
+ r = systemf("echo f | %s -oZ >archive.out 2>archive.err",
+ testprog);
+ p = slurpfile(&s, "archive.err");
+ p[s] = '\0';
+ if (r != 0) {
+ if (strstr(p, "compression not available") != NULL) {
+ skipping("This version of bsdcpio was compiled "
+ "without compress support");
+ return;
+ }
+ failure("-Z option is broken");
+ assertEqualInt(r, 0);
+ return;
+ }
+ /* Check that the archive file has a compress signature. */
+ p = slurpfile(&s, "archive.out");
+ assert(s > 2);
+ assertEqualMem(p, "\x1f\x9d", 2);
+}
diff --git a/usr.bin/cpio/test/test_option_a.c b/usr.bin/cpio/test/test_option_a.c
index e769836..af4b48e 100644
--- a/usr.bin/cpio/test/test_option_a.c
+++ b/usr.bin/cpio/test/test_option_a.c
@@ -23,10 +23,10 @@
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#include "test.h"
-#if defined(_WIN32) && !defined(__CYGWIN__)
-#include <sys/utime.h>
-#else
+#if defined(HAVE_UTIME_H)
#include <utime.h>
+#elif defined(HAVE_SYS_UTIME_H)
+#include <sys/utime.h>
#endif
__FBSDID("$FreeBSD$");
@@ -57,19 +57,15 @@ test_create(void)
struct utimbuf times;
static const int numfiles = sizeof(files) / sizeof(files[0]);
int i;
- int fd;
for (i = 0; i < numfiles; ++i) {
- fd = open(files[i].name, O_CREAT | O_WRONLY, 0644);
- assert(fd >= 0);
/*
* Note: Have to write at least one byte to the file.
* cpio doesn't bother reading the file if it's zero length,
* so the atime never gets changed in that case, which
* makes the tests below rather pointless.
*/
- assertEqualInt(1, write(fd, "a", 1));
- close(fd);
+ assertMakeFile(files[i].name, 0644, "a");
/* If utime() isn't supported on your platform, just
* #ifdef this section out. Most of the test below is
@@ -87,26 +83,21 @@ test_create(void)
}
/* Wait until the atime on the last file is actually in the past. */
- /* If utime() is supported above, there's no sleep here which
- * makes the test faster. */
- while (files[numfiles - 1].atime_sec >= time(NULL))
- sleep(1);
+ sleepUntilAfter(files[numfiles - 1].atime_sec);
}
DEFINE_TEST(test_option_a)
{
struct stat st;
int r;
- int f;
- char buff[64];
+ char *p;
/* Create all of the test files. */
test_create();
/* Sanity check; verify that atimes really do get modified. */
- f = open(files[0].name, O_RDONLY);
- assertEqualInt(1, read(f,buff, 1));
- assertEqualInt(0, close(f));
+ assert((p = slurpfile(NULL, "f0")) != NULL);
+ free(p);
assertEqualInt(0, stat("f0", &st));
if (st.st_atime == files[0].atime_sec) {
skipping("Cannot verify -a option\n"
diff --git a/usr.bin/cpio/test/test_option_c.c b/usr.bin/cpio/test/test_option_c.c
index 2f4e3bc..241bcf6 100644
--- a/usr.bin/cpio/test/test_option_c.c
+++ b/usr.bin/cpio/test/test_option_c.c
@@ -53,41 +53,44 @@ from_octal(const char *p, size_t l)
DEFINE_TEST(test_option_c)
{
- int fd, filelist;
+ FILE *filelist;
int r;
+ int uid = -1;
int dev, ino, gid;
time_t t, now;
char *p, *e;
size_t s;
- mode_t oldmask;
- oldmask = umask(0);
+ assertUmask(0);
+
+#if !defined(_WIN32)
+ uid = getuid();
+#endif
/*
* Create an assortment of files.
* TODO: Extend this to cover more filetypes.
*/
- filelist = open("filelist", O_CREAT | O_WRONLY, 0644);
+ filelist = fopen("filelist", "w");
/* "file" */
- fd = open("file", O_CREAT | O_WRONLY, 0644);
- assert(fd >= 0);
- assertEqualInt(10, write(fd, "123456789", 10));
- close(fd);
- assertEqualInt(5, write(filelist, "file\n", 5));
+ assertMakeFile("file", 0644, "1234567890");
+ fprintf(filelist, "file\n");
/* "symlink" */
- assertEqualInt(0, symlink("file", "symlink"));
- assertEqualInt(8, write(filelist, "symlink\n", 8));
+ if (canSymlink()) {
+ assertMakeSymlink("symlink", "file");
+ fprintf(filelist, "symlink\n");
+ }
/* "dir" */
- assertEqualInt(0, mkdir("dir", 0775));
+ assertMakeDir("dir", 0775);
/* Record some facts about what we just created: */
now = time(NULL); /* They were all created w/in last two seconds. */
- assertEqualInt(4, write(filelist, "dir\n", 4));
+ fprintf(filelist, "dir\n");
/* Use the cpio program to create an archive. */
- close(filelist);
+ fclose(filelist);
r = systemf("%s -oc <filelist >basic.out 2>basic.err", testprog);
/* Verify that nothing went to stderr. */
assertTextFileContents("1 block\n", "basic.err");
@@ -115,12 +118,14 @@ DEFINE_TEST(test_option_c)
assert(is_octal(e + 12, 6)); /* ino */
ino = from_octal(e + 12, 6);
#if defined(_WIN32) && !defined(__CYGWIN__)
- /* Group members bits and others bits do not work. */
+ /* Group members bits and others bits do not work. */
assertEqualMem(e + 18, "100666", 6); /* Mode */
#else
assertEqualMem(e + 18, "100644", 6); /* Mode */
#endif
- assertEqualInt(from_octal(e + 24, 6), getuid()); /* uid */
+ if (uid < 0)
+ uid = from_octal(e + 24, 6);
+ assertEqualInt(from_octal(e + 24, 6), uid); /* uid */
assert(is_octal(e + 30, 6)); /* gid */
gid = from_octal(e + 30, 6);
assertEqualMem(e + 36, "000001", 6); /* nlink */
@@ -133,46 +138,37 @@ DEFINE_TEST(test_option_c)
assertEqualMem(e + 59, "000005", 6); /* Name size */
assertEqualMem(e + 65, "00000000012", 11); /* File size */
assertEqualMem(e + 76, "file\0", 5); /* Name contents */
- assertEqualMem(e + 81, "123456789\0", 10); /* File contents */
+ assertEqualMem(e + 81, "1234567890", 10); /* File contents */
e += 91;
- /* Second entry is "symlink" pointing to "file" */
- assert(is_octal(e, 76)); /* Entire header is octal digits. */
- assertEqualMem(e + 0, "070707", 6); /* Magic */
- assertEqualInt(dev, from_octal(e + 6, 6)); /* dev */
- assert(dev != from_octal(e + 12, 6)); /* ino */
+ /* "symlink" pointing to "file" */
+ if (canSymlink()) {
+ assert(is_octal(e, 76)); /* Entire header is octal digits. */
+ assertEqualMem(e + 0, "070707", 6); /* Magic */
+ assertEqualInt(dev, from_octal(e + 6, 6)); /* dev */
+ assert(ino != from_octal(e + 12, 6)); /* ino */
#if !defined(_WIN32) || defined(__CYGWIN__)
- /* On Windows, symbolic link and group members bits and
- * others bits do not work. */
- assertEqualMem(e + 18, "120777", 6); /* Mode */
-#endif
- assertEqualInt(from_octal(e + 24, 6), getuid()); /* uid */
- assertEqualInt(gid, from_octal(e + 30, 6)); /* gid */
- assertEqualMem(e + 36, "000001", 6); /* nlink */
- failure("file entries should have rdev == 0 (dev was 0%o)",
- from_octal(e + 6, 6));
- assertEqualMem(e + 42, "000000", 6); /* rdev */
- t = from_octal(e + 48, 11); /* mtime */
- assert(t <= now); /* File wasn't created in future. */
- assert(t >= now - 2); /* File was created w/in last 2 secs. */
- assertEqualMem(e + 59, "000010", 6); /* Name size */
-#if defined(_WIN32) && !defined(__CYGWIN__)
- /* On Windows, symbolic link does not work. */
- assertEqualMem(e + 65, "00000000012", 11); /* File size */
-#else
- assertEqualMem(e + 65, "00000000004", 11); /* File size */
-#endif
- assertEqualMem(e + 76, "symlink\0", 8); /* Name contents */
-#if defined(_WIN32) && !defined(__CYGWIN__)
- /* On Windows, symbolic link does not work. */
- assertEqualMem(e + 84, "123456789\0", 10); /* File contents. */
- e += 94;
-#else
- assertEqualMem(e + 84, "file", 4); /* Symlink target. */
- e += 88;
+ /* On Windows, symbolic link and group members bits and
+ * others bits do not work. */
+ assertEqualMem(e + 18, "120777", 6); /* Mode */
#endif
+ assertEqualInt(from_octal(e + 24, 6), uid); /* uid */
+ assertEqualInt(gid, from_octal(e + 30, 6)); /* gid */
+ assertEqualMem(e + 36, "000001", 6); /* nlink */
+ failure("file entries should have rdev == 0 (dev was 0%o)",
+ from_octal(e + 6, 6));
+ assertEqualMem(e + 42, "000000", 6); /* rdev */
+ t = from_octal(e + 48, 11); /* mtime */
+ assert(t <= now); /* File wasn't created in future. */
+ assert(t >= now - 2); /* File was created w/in last 2 secs. */
+ assertEqualMem(e + 59, "000010", 6); /* Name size */
+ assertEqualMem(e + 65, "00000000004", 11); /* File size */
+ assertEqualMem(e + 76, "symlink\0", 8); /* Name contents */
+ assertEqualMem(e + 84, "file", 4); /* Symlink target. */
+ e += 88;
+ }
- /* Second entry is "dir" */
+ /* "dir" */
assert(is_octal(e, 76));
assertEqualMem(e + 0, "070707", 6); /* Magic */
/* Dev should be same as first entry. */
@@ -182,12 +178,14 @@ DEFINE_TEST(test_option_c)
assert(is_octal(e + 12, 6)); /* ino */
assert(dev != from_octal(e + 12, 6));
#if defined(_WIN32) && !defined(__CYGWIN__)
- /* Group members bits and others bits do not work. */
+ /* Group members bits and others bits do not work. */
assertEqualMem(e + 18, "040777", 6); /* Mode */
#else
- assertEqualMem(e + 18, "040775", 6); /* Mode */
+ /* Accept 042775 to accomodate systems where sgid bit propagates. */
+ if (memcmp(e + 18, "042775", 6) != 0)
+ assertEqualMem(e + 18, "040775", 6); /* Mode */
#endif
- assertEqualInt(from_octal(e + 24, 6), getuid()); /* uid */
+ assertEqualInt(from_octal(e + 24, 6), uid); /* uid */
/* Gid should be same as first entry. */
assert(is_octal(e + 30, 6)); /* gid */
assertEqualInt(gid, from_octal(e + 30, 6));
@@ -220,6 +218,4 @@ DEFINE_TEST(test_option_c)
assertEqualMem(e + 76, "TRAILER!!!\0", 11); /* Name */
free(p);
-
- umask(oldmask);
}
diff --git a/usr.bin/cpio/test/test_option_d.c b/usr.bin/cpio/test/test_option_d.c
index cb422ae..9ff1453 100644
--- a/usr.bin/cpio/test/test_option_d.c
+++ b/usr.bin/cpio/test/test_option_d.c
@@ -28,41 +28,37 @@ __FBSDID("$FreeBSD$");
DEFINE_TEST(test_option_d)
{
- struct stat st;
- int r, fd;
+ int r;
/*
* Create a file in a directory.
*/
- assertEqualInt(0, mkdir("dir", 0755));
- fd = open("dir/file", O_CREAT | O_WRONLY, 0644);
- assert(fd >= 0);
- close(fd);
+ assertMakeDir("dir", 0755);
+ assertMakeFile("dir/file", 0644, NULL);
/* Create an archive. */
r = systemf("echo dir/file | %s -o > archive.cpio 2>archive.err", testprog);
assertEqualInt(r, 0);
assertTextFileContents("1 block\n", "archive.err");
- assertEqualInt(0, stat("archive.cpio", &st));
- assertEqualInt(512, st.st_size);
+ assertFileSize("archive.cpio", 512);
/* Dearchive without -d, this should fail. */
- assertEqualInt(0, mkdir("without-d", 0755));
- assertEqualInt(0, chdir("without-d"));
+ assertMakeDir("without-d", 0755);
+ assertChdir("without-d");
r = systemf("%s -i < ../archive.cpio >out 2>err", testprog);
assertEqualInt(r, 0);
assertEmptyFile("out");
/* And the file should not be restored. */
- assert(0 != stat("dir/file", &st));
+ assertFileNotExists("dir/file");
/* Dearchive with -d, this should succeed. */
- assertEqualInt(0, chdir(".."));
- assertEqualInt(0, mkdir("with-d", 0755));
- assertEqualInt(0, chdir("with-d"));
+ assertChdir("..");
+ assertMakeDir("with-d", 0755);
+ assertChdir("with-d");
r = systemf("%s -id < ../archive.cpio >out 2>err", testprog);
assertEqualInt(r, 0);
assertEmptyFile("out");
assertTextFileContents("1 block\n", "err");
/* And the file should be restored. */
- assertEqualInt(0, stat("dir/file", &st));
+ assertFileExists("dir/file");
}
diff --git a/usr.bin/cpio/test/test_option_f.c b/usr.bin/cpio/test/test_option_f.c
index 54e07ac..784e085 100644
--- a/usr.bin/cpio/test/test_option_f.c
+++ b/usr.bin/cpio/test/test_option_f.c
@@ -33,44 +33,44 @@ unpack(const char *dirname, const char *option)
{
int r;
- assertEqualInt(0, mkdir(dirname, 0755));
- assertEqualInt(0, chdir(dirname));
+ assertMakeDir(dirname, 0755);
+ assertChdir(dirname);
extract_reference_file("test_option_f.cpio");
r = systemf("%s -i %s < test_option_f.cpio > copy-no-a.out 2>copy-no-a.err", testprog, option);
assertEqualInt(0, r);
- assertEqualInt(0, chdir(".."));
+ assertChdir("..");
}
DEFINE_TEST(test_option_f)
{
/* Calibrate: No -f option, so everything should be extracted. */
- unpack("t0", "");
- assertEqualInt(0, access("t0/a123", F_OK));
- assertEqualInt(0, access("t0/a234", F_OK));
- assertEqualInt(0, access("t0/b123", F_OK));
- assertEqualInt(0, access("t0/b234", F_OK));
+ unpack("t0", "--no-preserve-owner");
+ assertFileExists("t0/a123");
+ assertFileExists("t0/a234");
+ assertFileExists("t0/b123");
+ assertFileExists("t0/b234");
/* Don't extract 'a*' files. */
#if defined(_WIN32) && !defined(__CYGWIN__)
/* Single quotes isn't used by command.exe. */
- unpack("t1", "-f a*");
+ unpack("t1", "--no-preserve-owner -f a*");
#else
- unpack("t1", "-f 'a*'");
+ unpack("t1", "--no-preserve-owner -f 'a*'");
#endif
- assert(0 != access("t1/a123", F_OK));
- assert(0 != access("t1/a234", F_OK));
- assertEqualInt(0, access("t1/b123", F_OK));
- assertEqualInt(0, access("t1/b234", F_OK));
+ assertFileNotExists("t1/a123");
+ assertFileNotExists("t1/a234");
+ assertFileExists("t1/b123");
+ assertFileExists("t1/b234");
/* Don't extract 'b*' files. */
#if defined(_WIN32) && !defined(__CYGWIN__)
/* Single quotes isn't used by command.exe. */
- unpack("t2", "-f b*");
+ unpack("t2", "--no-preserve-owner -f b*");
#else
- unpack("t2", "-f 'b*'");
+ unpack("t2", "--no-preserve-owner -f 'b*'");
#endif
- assertEqualInt(0, access("t2/a123", F_OK));
- assertEqualInt(0, access("t2/a234", F_OK));
- assert(0 != access("t2/b123", F_OK));
- assert(0 != access("t2/b234", F_OK));
+ assertFileExists("t2/a123");
+ assertFileExists("t2/a234");
+ assertFileNotExists("t2/b123");
+ assertFileNotExists("t2/b234");
}
diff --git a/usr.bin/cpio/test/test_option_help.c b/usr.bin/cpio/test/test_option_help.c
index b9433a4..5623430 100644
--- a/usr.bin/cpio/test/test_option_help.c
+++ b/usr.bin/cpio/test/test_option_help.c
@@ -51,6 +51,7 @@ DEFINE_TEST(test_option_help)
/* Exercise --help option. */
r = systemf("%s --help >help.stdout 2>help.stderr", testprog);
+ assertEqualInt(r, 0);
failure("--help should generate nothing to stderr.");
assertEmptyFile("help.stderr");
/* Help message should start with name of program. */
@@ -67,6 +68,7 @@ DEFINE_TEST(test_option_help)
/* -h option should generate the same output. */
r = systemf("%s -h >h.stdout 2>h.stderr", testprog);
+ assertEqualInt(r, 0);
failure("-h should generate nothing to stderr.");
assertEmptyFile("h.stderr");
failure("stdout should be same for -h and --help");
@@ -74,6 +76,7 @@ DEFINE_TEST(test_option_help)
/* -W help should be another synonym. */
r = systemf("%s -W help >Whelp.stdout 2>Whelp.stderr", testprog);
+ assertEqualInt(r, 0);
failure("-W help should generate nothing to stderr.");
assertEmptyFile("Whelp.stderr");
failure("stdout should be same for -W help and --help");
diff --git a/usr.bin/cpio/test/test_option_ell.c b/usr.bin/cpio/test/test_option_l.c
index 36bb0ac..5c76e68 100644
--- a/usr.bin/cpio/test/test_option_ell.c
+++ b/usr.bin/cpio/test/test_option_l.c
@@ -25,26 +25,12 @@
#include "test.h"
__FBSDID("$FreeBSD$");
-/*
- * This is called "test_option_ell" instead of "test_option_l" to
- * avoid any conflicts with "test_option_L" on case-insensitive
- * filesystems.
- */
-
-DEFINE_TEST(test_option_ell)
+DEFINE_TEST(test_option_l)
{
- struct stat st, st2;
- int fd;
int r;
/* Create a file. */
- fd = open("f", O_CREAT | O_WRONLY, 0644);
- assert(fd >= 0);
- assertEqualInt(1, write(fd, "a", 1));
- close(fd);
-
- /* Stat it. */
- assertEqualInt(0, stat("f", &st));
+ assertMakeFile("f", 0644, "a");
/* Copy the file to the "copy" dir. */
r = systemf("echo f | %s -pd copy >copy.out 2>copy.err",
@@ -52,8 +38,7 @@ DEFINE_TEST(test_option_ell)
assertEqualInt(r, 0);
/* Check that the copy is a true copy and not a link. */
- assertEqualInt(0, stat("copy/f", &st2));
- assert(st2.st_ino != st.st_ino);
+ assertIsNotHardlink("f", "copy/f");
/* Copy the file to the "link" dir with the -l option. */
r = systemf("echo f | %s -pld link >link.out 2>link.err",
@@ -61,6 +46,5 @@ DEFINE_TEST(test_option_ell)
assertEqualInt(r, 0);
/* Check that this is a link and not a copy. */
- assertEqualInt(0, stat("link/f", &st2));
- assert(st2.st_ino == st.st_ino);
+ assertIsHardlink("f", "link/f");
}
diff --git a/usr.bin/cpio/matching.h b/usr.bin/cpio/test/test_option_lzma.c
index e98e82e..c6e3353 100644
--- a/usr.bin/cpio/matching.h
+++ b/usr.bin/cpio/test/test_option_lzma.c
@@ -6,8 +6,7 @@
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer
- * in this position and unchanged.
+ * notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
@@ -22,25 +21,36 @@
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * $FreeBSD$
*/
+#include "test.h"
+__FBSDID("$FreeBSD$");
-#ifndef MATCHING_H
-#define MATCHING_H
-
-struct matching;
-
-int exclude(struct matching **matching, const char *pattern);
-int exclude_from_file(struct matching **matching,
- const char *pathname);
-int include(struct matching **matching, const char *pattern);
-int include_from_file(struct matching **matching,
- const char *pathname, int nullSeparator);
+DEFINE_TEST(test_option_lzma)
+{
+ char *p;
+ int r;
+ size_t s;
-int excluded(struct matching *, const char *pathname);
-void cleanup_exclusions(struct matching **);
-int unmatched_inclusions(struct matching *);
-int unmatched_inclusions_warn(struct matching *, const char *msg);
+ /* Create a file. */
+ assertMakeFile("f", 0644, "a");
-#endif
+ /* Archive it with lzma compression. */
+ r = systemf("echo f | %s -o --lzma >archive.out 2>archive.err",
+ testprog);
+ p = slurpfile(&s, "archive.err");
+ p[s] = '\0';
+ if (r != 0) {
+ if (strstr(p, "compression not available") != NULL) {
+ skipping("This version of bsdcpio was compiled "
+ "without lzma support");
+ return;
+ }
+ failure("--lzma option is broken");
+ assertEqualInt(r, 0);
+ return;
+ }
+ /* Check that the archive file has an lzma signature. */
+ p = slurpfile(&s, "archive.out");
+ assert(s > 2);
+ assertEqualMem(p, "\x5d\00\00", 3);
+}
diff --git a/usr.bin/cpio/test/test_option_m.c b/usr.bin/cpio/test/test_option_m.c
index 7f8e901..de880b2 100644
--- a/usr.bin/cpio/test/test_option_m.c
+++ b/usr.bin/cpio/test/test_option_m.c
@@ -28,9 +28,7 @@ __FBSDID("$FreeBSD$");
DEFINE_TEST(test_option_m)
{
- struct stat st;
int r;
- time_t now;
/*
* The reference archive has one file with an mtime in 1970, 1
@@ -38,33 +36,28 @@ DEFINE_TEST(test_option_m)
*/
/* Restored without -m, the result should have a current mtime. */
- assertEqualInt(0, mkdir("without-m", 0755));
- assertEqualInt(0, chdir("without-m"));
+ assertMakeDir("without-m", 0755);
+ assertChdir("without-m");
extract_reference_file("test_option_m.cpio");
- r = systemf("%s -i < test_option_m.cpio >out 2>err", testprog);
- now = time(NULL);
+ r = systemf("%s --no-preserve-owner -i < test_option_m.cpio >out 2>err", testprog);
assertEqualInt(r, 0);
assertEmptyFile("out");
assertTextFileContents("1 block\n", "err");
- assertEqualInt(0, stat("file", &st));
/* Should have been created within the last few seconds. */
- assert(st.st_mtime <= now);
- assert(st.st_mtime > now - 5);
+ assertFileMtimeRecent("file");
/* With -m, it should have an mtime in 1970. */
- assertEqualInt(0, chdir(".."));
- assertEqualInt(0, mkdir("with-m", 0755));
- assertEqualInt(0, chdir("with-m"));
+ assertChdir("..");
+ assertMakeDir("with-m", 0755);
+ assertChdir("with-m");
extract_reference_file("test_option_m.cpio");
- r = systemf("%s -im < test_option_m.cpio >out 2>err", testprog);
- now = time(NULL);
+ r = systemf("%s --no-preserve-owner -im < test_option_m.cpio >out 2>err", testprog);
assertEqualInt(r, 0);
assertEmptyFile("out");
assertTextFileContents("1 block\n", "err");
- assertEqualInt(0, stat("file", &st));
/*
* mtime in reference archive is '1' == 1 second after
* midnight Jan 1, 1970 UTC.
*/
- assertEqualInt(1, st.st_mtime);
+ assertFileMtime("file", 1, 0);
}
diff --git a/usr.bin/cpio/test/test_option_t.c b/usr.bin/cpio/test/test_option_t.c
index 1c9af19..4427bb3 100644
--- a/usr.bin/cpio/test/test_option_t.c
+++ b/usr.bin/cpio/test/test_option_t.c
@@ -71,12 +71,22 @@ DEFINE_TEST(test_option_t)
testprog);
assertEqualInt(r, 0);
assertTextFileContents("1 block\n", "itnv.err");
- extract_reference_file("test_option_tnv.stdout");
- /* This does work because numeric IDs come from archive. */
- /* Unfortunately, the timestamp still gets localized, so
- * we can't just compare against a fixed result. */
- /* TODO: Fix this. */
- /* assertEqualFile("itnv.out", "test_option_tnv.stdout"); */
+ p = slurpfile(NULL, "itnv.out");
+ /* Since -n uses numeric UID/GID, this part should be the
+ * same on every system. */
+ assertEqualMem(p, "-rw-r--r-- 1 1000 1000 0 ",42);
+ /* Date varies depending on local timezone. */
+ if (memcmp(p + 42, "Dec 31 1969", 12) == 0) {
+ /* East of Greenwich we get Dec 31, 1969. */
+ } else {
+ /* West of Greenwich get Jan 1, 1970 */
+ assertEqualMem(p + 42, "Jan ", 4);
+ /* Some systems format "Jan 01", some "Jan 1" */
+ assert(p[46] == ' ' || p[46] == '0');
+ assertEqualMem(p + 47, "1 1970 ", 8);
+ }
+ assertEqualMem(p + 54, " file", 5);
+ free(p);
/* But "-n" without "-t" is an error. */
assert(0 != systemf("%s -in < test_option_t.cpio >in.out 2>in.err",
diff --git a/usr.bin/cpio/test/test_option_u.c b/usr.bin/cpio/test/test_option_u.c
index 7d2edff..08058aa 100644
--- a/usr.bin/cpio/test/test_option_u.c
+++ b/usr.bin/cpio/test/test_option_u.c
@@ -23,10 +23,10 @@
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#include "test.h"
-#if defined(_WIN32) && !defined(__CYGWIN__)
-#include <sys/utime.h>
-#else
+#if defined(HAVE_UTIME_H)
#include <utime.h>
+#elif defined(HAVE_SYS_UTIME_H)
+#include <sys/utime.h>
#endif
__FBSDID("$FreeBSD$");
@@ -35,14 +35,10 @@ DEFINE_TEST(test_option_u)
struct utimbuf times;
char *p;
size_t s;
- int fd;
int r;
/* Create a file. */
- fd = open("f", O_CREAT | O_WRONLY, 0644);
- assert(fd >= 0);
- assertEqualInt(1, write(fd, "a", 1));
- close(fd);
+ assertMakeFile("f", 0644, "a");
/* Copy the file to the "copy" dir. */
r = systemf("echo f | %s -pd copy >copy.out 2>copy.err",
@@ -55,10 +51,7 @@ DEFINE_TEST(test_option_u)
assertEqualMem(p, "a", 1);
/* Recreate the file with a single "b" */
- fd = open("f", O_CREAT | O_TRUNC | O_WRONLY, 0644);
- assert(fd >= 0);
- assertEqualInt(1, write(fd, "b", 1));
- close(fd);
+ assertMakeFile("f", 0644, "b");
/* Set the mtime to the distant past. */
memset(&times, 0, sizeof(times));
diff --git a/usr.bin/cpio/test/test_option_version.c b/usr.bin/cpio/test/test_option_version.c
index 8a25248..7345da1 100644
--- a/usr.bin/cpio/test/test_option_version.c
+++ b/usr.bin/cpio/test/test_option_version.c
@@ -74,14 +74,14 @@ verify(const char *p, size_t s)
/* Skip a single trailing a,b,c, or d. */
if (*q == 'a' || *q == 'b' || *q == 'c' || *q == 'd')
++q;
- /* All terminated by a newline. */
+ /* All terminated by end-of-line: \r, \r\n, or \n */
assert(s >= 1);
failure("Version: %s", p);
-#if defined(_WIN32) && !defined(__CYGWIN__)
- assertEqualMem(q, "\r\n", 2);
-#else
- assertEqualMem(q, "\n", 1);
-#endif
+ if (*q == '\x0d') {
+ if (q[1] != '\0')
+ assertEqualMem(q, "\x0d\x0a", 2);
+ } else
+ assertEqualMem(q, "\x0a", 1);
}
diff --git a/usr.bin/cpio/test/test_option_y.c b/usr.bin/cpio/test/test_option_y.c
index 5cefaed..8e81ee7 100644
--- a/usr.bin/cpio/test/test_option_y.c
+++ b/usr.bin/cpio/test/test_option_y.c
@@ -28,32 +28,30 @@ __FBSDID("$FreeBSD$");
DEFINE_TEST(test_option_y)
{
char *p;
- int fd;
int r;
size_t s;
/* Create a file. */
- fd = open("f", O_CREAT | O_WRONLY, 0644);
- assert(fd >= 0);
- assertEqualInt(1, write(fd, "a", 1));
- close(fd);
+ assertMakeFile("f", 0644, "a");
/* Archive it with bzip2 compression. */
r = systemf("echo f | %s -oy >archive.out 2>archive.err",
testprog);
- failure("-y (bzip) option seems to be broken");
- if (assertEqualInt(r, 0)) {
- p = slurpfile(&s, "archive.err");
- p[s] = '\0';
- if (strstr(p, "bzip2 compression not supported") != NULL) {
+ p = slurpfile(&s, "archive.err");
+ p[s] = '\0';
+ if (r != 0) {
+ if (strstr(p, "compression not available") != NULL) {
skipping("This version of bsdcpio was compiled "
"without bzip2 support");
- } else {
- assertTextFileContents("1 block\n", "archive.err");
- /* Check that the archive file has a bzip2 signature. */
- p = slurpfile(&s, "archive.out");
- assert(s > 2);
- assertEqualMem(p, "BZh9", 4);
+ return;
}
+ failure("-y option is broken");
+ assertEqualInt(r, 0);
+ return;
}
+ assertTextFileContents("1 block\n", "archive.err");
+ /* Check that the archive file has a bzip2 signature. */
+ p = slurpfile(&s, "archive.out");
+ assert(s > 2);
+ assertEqualMem(p, "BZh9", 4);
}
diff --git a/usr.bin/cpio/test/test_option_z.c b/usr.bin/cpio/test/test_option_z.c
index 2057912..91d37ac 100644
--- a/usr.bin/cpio/test/test_option_z.c
+++ b/usr.bin/cpio/test/test_option_z.c
@@ -28,32 +28,29 @@ __FBSDID("$FreeBSD$");
DEFINE_TEST(test_option_z)
{
char *p;
- int fd;
int r;
size_t s;
/* Create a file. */
- fd = open("f", O_CREAT | O_WRONLY, 0644);
- assert(fd >= 0);
- assertEqualInt(1, write(fd, "a", 1));
- close(fd);
+ assertMakeFile("f", 0644, "a");
/* Archive it with gzip compression. */
r = systemf("echo f | %s -oz >archive.out 2>archive.err",
testprog);
- failure("-z option seems to be broken");
- assertEqualInt(r, 0);
- if (r == 0) {
- p = slurpfile(&s, "archive.err");
- p[s] = '\0';
- if (strstr(p, "gzip compression not supported") != NULL) {
+ p = slurpfile(&s, "archive.err");
+ p[s] = '\0';
+ if (r != 0) {
+ if (strstr(p, "compression not available") != NULL) {
skipping("This version of bsdcpio was compiled "
"without gzip support");
- } else {
- /* Check that the archive file has a gzip signature. */
- p = slurpfile(&s, "archive.out");
- assert(s > 2);
- assertEqualMem(p, "\x1f\x8b\x08\x00", 4);
+ return;
}
+ failure("-z option is broken");
+ assertEqualInt(r, 0);
+ return;
}
+ /* Check that the archive file has a gzip signature. */
+ p = slurpfile(&s, "archive.out");
+ assert(s > 4);
+ assertEqualMem(p, "\x1f\x8b\x08\x00", 4);
}
diff --git a/usr.bin/cpio/test/test_owner_parse.c b/usr.bin/cpio/test/test_owner_parse.c
index 06fabd9..d07724e 100644
--- a/usr.bin/cpio/test/test_owner_parse.c
+++ b/usr.bin/cpio/test/test_owner_parse.c
@@ -28,7 +28,12 @@ __FBSDID("$FreeBSD$");
#include "../cpio.h"
#include "err.h"
-#if defined(__CYGWIN__)
+#if !defined(_WIN32)
+#define ROOT "root"
+static int root_uids[] = { 0 };
+/* Solaris 9 root has gid 1 (other) */
+static int root_gids[] = { 0, 1 };
+#elif defined(__CYGWIN__)
/* On cygwin, the Administrator user most likely exists (unless
* it has been renamed or is in a non-English localization), but
* its primary group membership depends on how the user set up
@@ -40,12 +45,9 @@ __FBSDID("$FreeBSD$");
#define ROOT "Administrator"
static int root_uids[] = { 500 };
static int root_gids[] = { 513, 545, 544 };
-#else
-#define ROOT "root"
-static int root_uids[] = { 0 };
-static int root_gids[] = { 0 };
#endif
+#if defined(ROOT)
static int
int_in_list(int i, int *l, size_t n)
{
@@ -55,54 +57,54 @@ int_in_list(int i, int *l, size_t n)
failure("%d", i);
return (0);
}
+#endif
DEFINE_TEST(test_owner_parse)
{
-#if defined(_WIN32) && !defined(__CYGWIN__)
- /* TODO: Does this need cygwin style handling of uid/gid ? */
- skipping("Windows cannot handle uid/gid as UNIX like system");
+#if !defined(ROOT)
+ skipping("No uid/gid configuration for this OS");
#else
int uid, gid;
- assertEqualInt(0, owner_parse(ROOT, &uid, &gid));
+ assert(NULL == owner_parse(ROOT, &uid, &gid));
assert(int_in_list(uid, root_uids,
sizeof(root_uids)/sizeof(root_uids[0])));
assertEqualInt(-1, gid);
- assertEqualInt(0, owner_parse(ROOT ":", &uid, &gid));
+ assert(NULL == owner_parse(ROOT ":", &uid, &gid));
assert(int_in_list(uid, root_uids,
sizeof(root_uids)/sizeof(root_uids[0])));
assert(int_in_list(gid, root_gids,
sizeof(root_gids)/sizeof(root_gids[0])));
- assertEqualInt(0, owner_parse(ROOT ".", &uid, &gid));
+ assert(NULL == owner_parse(ROOT ".", &uid, &gid));
assert(int_in_list(uid, root_uids,
sizeof(root_uids)/sizeof(root_uids[0])));
assert(int_in_list(gid, root_gids,
sizeof(root_gids)/sizeof(root_gids[0])));
- assertEqualInt(0, owner_parse("111", &uid, &gid));
+ assert(NULL == owner_parse("111", &uid, &gid));
assertEqualInt(111, uid);
assertEqualInt(-1, gid);
- assertEqualInt(0, owner_parse("112:", &uid, &gid));
+ assert(NULL == owner_parse("112:", &uid, &gid));
assertEqualInt(112, uid);
/* Can't assert gid, since we don't know gid for user #112. */
- assertEqualInt(0, owner_parse("113.", &uid, &gid));
+ assert(NULL == owner_parse("113.", &uid, &gid));
assertEqualInt(113, uid);
/* Can't assert gid, since we don't know gid for user #113. */
- assertEqualInt(0, owner_parse(":114", &uid, &gid));
+ assert(NULL == owner_parse(":114", &uid, &gid));
assertEqualInt(-1, uid);
assertEqualInt(114, gid);
- assertEqualInt(0, owner_parse(".115", &uid, &gid));
+ assert(NULL == owner_parse(".115", &uid, &gid));
assertEqualInt(-1, uid);
assertEqualInt(115, gid);
- assertEqualInt(0, owner_parse("116:117", &uid, &gid));
+ assert(NULL == owner_parse("116:117", &uid, &gid));
assertEqualInt(116, uid);
assertEqualInt(117, gid);
@@ -112,19 +114,9 @@ DEFINE_TEST(test_owner_parse)
* users.
*/
- /*
- * TODO: Rework owner_parse to either return a char * pointing
- * to an error message or accept a function pointer to an
- * error-reporting routine so that the following tests don't
- * generate any output.
- *
- * Alternatively, redirect stderr temporarily to suppress the output.
- */
-
- cpio_progname = "Ignore this message";
- assertEqualInt(1, owner_parse(":nonexistentgroup", &uid, &gid));
- assertEqualInt(1, owner_parse(ROOT ":nonexistentgroup", &uid, &gid));
- assertEqualInt(1,
+ assert(NULL != owner_parse(":nonexistentgroup", &uid, &gid));
+ assert(NULL != owner_parse(ROOT ":nonexistentgroup", &uid, &gid));
+ assert(NULL !=
owner_parse("nonexistentuser:nonexistentgroup", &uid, &gid));
#endif
}
diff --git a/usr.bin/cpio/test/test_passthrough_dotdot.c b/usr.bin/cpio/test/test_passthrough_dotdot.c
index bcb5a6a..58d8234 100644
--- a/usr.bin/cpio/test/test_passthrough_dotdot.c
+++ b/usr.bin/cpio/test/test_passthrough_dotdot.c
@@ -31,33 +31,28 @@ __FBSDID("$FreeBSD$");
DEFINE_TEST(test_passthrough_dotdot)
{
- struct stat st;
- int fd, r;
- int filelist;
- int oldumask;
+ int r;
+ FILE *filelist;
- oldumask = umask(0);
+ assertUmask(0);
/*
* Create an assortment of files on disk.
*/
- filelist = open("filelist", O_CREAT | O_WRONLY, 0644);
+ filelist = fopen("filelist", "w");
/* Directory. */
- assertEqualInt(0, mkdir("dir", 0755));
- assertEqualInt(0, chdir("dir"));
+ assertMakeDir("dir", 0755);
+ assertChdir("dir");
- write(filelist, ".\n", 2);
+ fprintf(filelist, ".\n");
/* File with 10 bytes content. */
- fd = open("file", O_CREAT | O_WRONLY, 0642);
- assert(fd >= 0);
- assertEqualInt(10, write(fd, "123456789", 10));
- close(fd);
- write(filelist, "file\n", 5);
+ assertMakeFile("file", 0642, "1234567890");
+ fprintf(filelist, "file\n");
/* All done. */
- close(filelist);
+ fclose(filelist);
/*
@@ -68,26 +63,14 @@ DEFINE_TEST(test_passthrough_dotdot)
failure("Error invoking %s -pd ..", testprog);
assertEqualInt(r, 0);
- assertEqualInt(0, chdir(".."));
+ assertChdir("..");
/* Verify stderr and stdout. */
assertTextFileContents("../.\n../file\n1 block\n", "stderr");
assertEmptyFile("stdout");
/* Regular file. */
- r = lstat("file", &st);
- failure("Failed to stat file, errno=%d", errno);
- assertEqualInt(r, 0);
- if (r == 0) {
- assert(S_ISREG(st.st_mode));
-#if defined(_WIN32) && !defined(__CYGWIN__)
- assertEqualInt(0600, st.st_mode & 0700);
-#else
- assertEqualInt(0642, st.st_mode & 0777);
-#endif
- assertEqualInt(10, st.st_size);
- assertEqualInt(1, st.st_nlink);
- }
-
- umask(oldumask);
+ assertIsReg("file", 0642);
+ assertFileSize("file", 10);
+ assertFileNLinks("file", 1);
}
diff --git a/usr.bin/cpio/test/test_passthrough_reverse.c b/usr.bin/cpio/test/test_passthrough_reverse.c
index a7695ed..42df75a 100644
--- a/usr.bin/cpio/test/test_passthrough_reverse.c
+++ b/usr.bin/cpio/test/test_passthrough_reverse.c
@@ -36,33 +36,28 @@ __FBSDID("$FreeBSD$");
DEFINE_TEST(test_passthrough_reverse)
{
- struct stat st;
- int fd, r;
- int filelist;
- int oldumask;
+ int r;
+ FILE *filelist;
- oldumask = umask(0);
+ assertUmask(0);
/*
* Create an assortment of files on disk.
*/
- filelist = open("filelist", O_CREAT | O_WRONLY, 0644);
+ filelist = fopen("filelist", "w");
/* Directory. */
- assertEqualInt(0, mkdir("dir", 0743));
+ assertMakeDir("dir", 0743);
/* File with 10 bytes content. */
- fd = open("dir/file", O_CREAT | O_WRONLY, 0644);
- assert(fd >= 0);
- assertEqualInt(10, write(fd, "123456789", 10));
- close(fd);
- write(filelist, "dir/file\n", 9);
+ assertMakeFile("dir/file", 0644, "1234567890");
+ fprintf(filelist, "dir/file\n");
/* Write dir last. */
- write(filelist, "dir\n", 4);
+ fprintf(filelist, "dir\n");
/* All done. */
- close(filelist);
+ fclose(filelist);
/*
@@ -72,7 +67,7 @@ DEFINE_TEST(test_passthrough_reverse)
failure("Error invoking %s -pd out", testprog);
assertEqualInt(r, 0);
- assertEqualInt(0, chdir("out"));
+ assertChdir("out");
/* Verify stderr and stdout. */
assertTextFileContents("out/dir/file\nout/dir\n1 block\n",
@@ -80,33 +75,11 @@ DEFINE_TEST(test_passthrough_reverse)
assertEmptyFile("../stdout");
/* dir */
- r = lstat("dir", &st);
- if (r == 0) {
- assertEqualInt(r, 0);
- assert(S_ISDIR(st.st_mode));
- failure("st.st_mode=0%o", st.st_mode);
-#if defined(_WIN32) && !defined(__CYGWIN__)
- assertEqualInt(0700, st.st_mode & 0700);
-#else
- assertEqualInt(0743, st.st_mode & 0777);
-#endif
- }
+ assertIsDir("dir", 0743);
/* Regular file. */
- r = lstat("dir/file", &st);
- failure("Failed to stat dir/file, errno=%d", errno);
- assertEqualInt(r, 0);
- if (r == 0) {
- assert(S_ISREG(st.st_mode));
-#if defined(_WIN32) && !defined(__CYGWIN__)
- assertEqualInt(0600, st.st_mode & 0700);
-#else
- assertEqualInt(0644, st.st_mode & 0777);
-#endif
- assertEqualInt(10, st.st_size);
- assertEqualInt(1, st.st_nlink);
- }
-
- umask(oldumask);
+ assertIsReg("dir/file", 0644);
+ assertFileSize("dir/file", 10);
+ assertFileNLinks("dir/file", 1);
}
diff --git a/usr.bin/cpio/test/test_pathmatch.c b/usr.bin/cpio/test/test_pathmatch.c
index a596eda..177c2bc 100644
--- a/usr.bin/cpio/test/test_pathmatch.c
+++ b/usr.bin/cpio/test/test_pathmatch.c
@@ -25,7 +25,7 @@
#include "test.h"
__FBSDID("$FreeBSD$");
-#include "../pathmatch.h"
+#include "pathmatch.h"
/*
* Verify that the pattern matcher implements the wildcard logic specified
@@ -45,126 +45,126 @@ __FBSDID("$FreeBSD$");
DEFINE_TEST(test_pathmatch)
{
- assertEqualInt(1, pathmatch("a/b/c", "a/b/c", 0));
- assertEqualInt(0, pathmatch("a/b/", "a/b/c", 0));
- assertEqualInt(0, pathmatch("a/b", "a/b/c", 0));
- assertEqualInt(0, pathmatch("a/b/c", "a/b/", 0));
- assertEqualInt(0, pathmatch("a/b/c", "a/b", 0));
+ assertEqualInt(1, lafe_pathmatch("a/b/c", "a/b/c", 0));
+ assertEqualInt(0, lafe_pathmatch("a/b/", "a/b/c", 0));
+ assertEqualInt(0, lafe_pathmatch("a/b", "a/b/c", 0));
+ assertEqualInt(0, lafe_pathmatch("a/b/c", "a/b/", 0));
+ assertEqualInt(0, lafe_pathmatch("a/b/c", "a/b", 0));
/* Empty pattern only matches empty string. */
- assertEqualInt(1, pathmatch("","", 0));
- assertEqualInt(0, pathmatch("","a", 0));
- assertEqualInt(1, pathmatch("*","", 0));
- assertEqualInt(1, pathmatch("*","a", 0));
- assertEqualInt(1, pathmatch("*","abcd", 0));
+ assertEqualInt(1, lafe_pathmatch("","", 0));
+ assertEqualInt(0, lafe_pathmatch("","a", 0));
+ assertEqualInt(1, lafe_pathmatch("*","", 0));
+ assertEqualInt(1, lafe_pathmatch("*","a", 0));
+ assertEqualInt(1, lafe_pathmatch("*","abcd", 0));
/* SUSv2: * matches / */
- assertEqualInt(1, pathmatch("*","abcd/efgh/ijkl", 0));
- assertEqualInt(1, pathmatch("abcd*efgh/ijkl","abcd/efgh/ijkl", 0));
- assertEqualInt(1, pathmatch("abcd***efgh/ijkl","abcd/efgh/ijkl", 0));
- assertEqualInt(1, pathmatch("abcd***/efgh/ijkl","abcd/efgh/ijkl", 0));
- assertEqualInt(0, pathmatch("?", "", 0));
- assertEqualInt(0, pathmatch("?", "\0", 0));
- assertEqualInt(1, pathmatch("?", "a", 0));
- assertEqualInt(0, pathmatch("?", "ab", 0));
- assertEqualInt(1, pathmatch("?", ".", 0));
- assertEqualInt(1, pathmatch("?", "?", 0));
- assertEqualInt(1, pathmatch("a", "a", 0));
- assertEqualInt(0, pathmatch("a", "ab", 0));
- assertEqualInt(0, pathmatch("a", "ab", 0));
- assertEqualInt(1, pathmatch("a?c", "abc", 0));
+ assertEqualInt(1, lafe_pathmatch("*","abcd/efgh/ijkl", 0));
+ assertEqualInt(1, lafe_pathmatch("abcd*efgh/ijkl","abcd/efgh/ijkl", 0));
+ assertEqualInt(1, lafe_pathmatch("abcd***efgh/ijkl","abcd/efgh/ijkl", 0));
+ assertEqualInt(1, lafe_pathmatch("abcd***/efgh/ijkl","abcd/efgh/ijkl", 0));
+ assertEqualInt(0, lafe_pathmatch("?", "", 0));
+ assertEqualInt(0, lafe_pathmatch("?", "\0", 0));
+ assertEqualInt(1, lafe_pathmatch("?", "a", 0));
+ assertEqualInt(0, lafe_pathmatch("?", "ab", 0));
+ assertEqualInt(1, lafe_pathmatch("?", ".", 0));
+ assertEqualInt(1, lafe_pathmatch("?", "?", 0));
+ assertEqualInt(1, lafe_pathmatch("a", "a", 0));
+ assertEqualInt(0, lafe_pathmatch("a", "ab", 0));
+ assertEqualInt(0, lafe_pathmatch("a", "ab", 0));
+ assertEqualInt(1, lafe_pathmatch("a?c", "abc", 0));
/* SUSv2: ? matches / */
- assertEqualInt(1, pathmatch("a?c", "a/c", 0));
- assertEqualInt(1, pathmatch("a?*c*", "a/c", 0));
- assertEqualInt(1, pathmatch("*a*", "a/c", 0));
- assertEqualInt(1, pathmatch("*a*", "/a/c", 0));
- assertEqualInt(1, pathmatch("*a*", "defaaaaaaa", 0));
- assertEqualInt(0, pathmatch("a*", "defghi", 0));
- assertEqualInt(0, pathmatch("*a*", "defghi", 0));
+ assertEqualInt(1, lafe_pathmatch("a?c", "a/c", 0));
+ assertEqualInt(1, lafe_pathmatch("a?*c*", "a/c", 0));
+ assertEqualInt(1, lafe_pathmatch("*a*", "a/c", 0));
+ assertEqualInt(1, lafe_pathmatch("*a*", "/a/c", 0));
+ assertEqualInt(1, lafe_pathmatch("*a*", "defaaaaaaa", 0));
+ assertEqualInt(0, lafe_pathmatch("a*", "defghi", 0));
+ assertEqualInt(0, lafe_pathmatch("*a*", "defghi", 0));
/* Character classes */
- assertEqualInt(1, pathmatch("abc[def", "abc[def", 0));
- assertEqualInt(0, pathmatch("abc[def]", "abc[def", 0));
- assertEqualInt(0, pathmatch("abc[def", "abcd", 0));
- assertEqualInt(1, pathmatch("abc[def]", "abcd", 0));
- assertEqualInt(1, pathmatch("abc[def]", "abce", 0));
- assertEqualInt(1, pathmatch("abc[def]", "abcf", 0));
- assertEqualInt(0, pathmatch("abc[def]", "abcg", 0));
- assertEqualInt(1, pathmatch("abc[d*f]", "abcd", 0));
- assertEqualInt(1, pathmatch("abc[d*f]", "abc*", 0));
- assertEqualInt(0, pathmatch("abc[d*f]", "abcdefghi", 0));
- assertEqualInt(0, pathmatch("abc[d*", "abcdefghi", 0));
- assertEqualInt(1, pathmatch("abc[d*", "abc[defghi", 0));
- assertEqualInt(1, pathmatch("abc[d-f]", "abcd", 0));
- assertEqualInt(1, pathmatch("abc[d-f]", "abce", 0));
- assertEqualInt(1, pathmatch("abc[d-f]", "abcf", 0));
- assertEqualInt(0, pathmatch("abc[d-f]", "abcg", 0));
- assertEqualInt(0, pathmatch("abc[d-fh-k]", "abca", 0));
- assertEqualInt(1, pathmatch("abc[d-fh-k]", "abcd", 0));
- assertEqualInt(1, pathmatch("abc[d-fh-k]", "abce", 0));
- assertEqualInt(1, pathmatch("abc[d-fh-k]", "abcf", 0));
- assertEqualInt(0, pathmatch("abc[d-fh-k]", "abcg", 0));
- assertEqualInt(1, pathmatch("abc[d-fh-k]", "abch", 0));
- assertEqualInt(1, pathmatch("abc[d-fh-k]", "abci", 0));
- assertEqualInt(1, pathmatch("abc[d-fh-k]", "abcj", 0));
- assertEqualInt(1, pathmatch("abc[d-fh-k]", "abck", 0));
- assertEqualInt(0, pathmatch("abc[d-fh-k]", "abcl", 0));
- assertEqualInt(0, pathmatch("abc[d-fh-k]", "abc-", 0));
+ assertEqualInt(1, lafe_pathmatch("abc[def", "abc[def", 0));
+ assertEqualInt(0, lafe_pathmatch("abc[def]", "abc[def", 0));
+ assertEqualInt(0, lafe_pathmatch("abc[def", "abcd", 0));
+ assertEqualInt(1, lafe_pathmatch("abc[def]", "abcd", 0));
+ assertEqualInt(1, lafe_pathmatch("abc[def]", "abce", 0));
+ assertEqualInt(1, lafe_pathmatch("abc[def]", "abcf", 0));
+ assertEqualInt(0, lafe_pathmatch("abc[def]", "abcg", 0));
+ assertEqualInt(1, lafe_pathmatch("abc[d*f]", "abcd", 0));
+ assertEqualInt(1, lafe_pathmatch("abc[d*f]", "abc*", 0));
+ assertEqualInt(0, lafe_pathmatch("abc[d*f]", "abcdefghi", 0));
+ assertEqualInt(0, lafe_pathmatch("abc[d*", "abcdefghi", 0));
+ assertEqualInt(1, lafe_pathmatch("abc[d*", "abc[defghi", 0));
+ assertEqualInt(1, lafe_pathmatch("abc[d-f]", "abcd", 0));
+ assertEqualInt(1, lafe_pathmatch("abc[d-f]", "abce", 0));
+ assertEqualInt(1, lafe_pathmatch("abc[d-f]", "abcf", 0));
+ assertEqualInt(0, lafe_pathmatch("abc[d-f]", "abcg", 0));
+ assertEqualInt(0, lafe_pathmatch("abc[d-fh-k]", "abca", 0));
+ assertEqualInt(1, lafe_pathmatch("abc[d-fh-k]", "abcd", 0));
+ assertEqualInt(1, lafe_pathmatch("abc[d-fh-k]", "abce", 0));
+ assertEqualInt(1, lafe_pathmatch("abc[d-fh-k]", "abcf", 0));
+ assertEqualInt(0, lafe_pathmatch("abc[d-fh-k]", "abcg", 0));
+ assertEqualInt(1, lafe_pathmatch("abc[d-fh-k]", "abch", 0));
+ assertEqualInt(1, lafe_pathmatch("abc[d-fh-k]", "abci", 0));
+ assertEqualInt(1, lafe_pathmatch("abc[d-fh-k]", "abcj", 0));
+ assertEqualInt(1, lafe_pathmatch("abc[d-fh-k]", "abck", 0));
+ assertEqualInt(0, lafe_pathmatch("abc[d-fh-k]", "abcl", 0));
+ assertEqualInt(0, lafe_pathmatch("abc[d-fh-k]", "abc-", 0));
/* [] matches nothing, [!] is the same as ? */
- assertEqualInt(0, pathmatch("abc[]efg", "abcdefg", 0));
- assertEqualInt(0, pathmatch("abc[]efg", "abcqefg", 0));
- assertEqualInt(0, pathmatch("abc[]efg", "abcefg", 0));
- assertEqualInt(1, pathmatch("abc[!]efg", "abcdefg", 0));
- assertEqualInt(1, pathmatch("abc[!]efg", "abcqefg", 0));
- assertEqualInt(0, pathmatch("abc[!]efg", "abcefg", 0));
+ assertEqualInt(0, lafe_pathmatch("abc[]efg", "abcdefg", 0));
+ assertEqualInt(0, lafe_pathmatch("abc[]efg", "abcqefg", 0));
+ assertEqualInt(0, lafe_pathmatch("abc[]efg", "abcefg", 0));
+ assertEqualInt(1, lafe_pathmatch("abc[!]efg", "abcdefg", 0));
+ assertEqualInt(1, lafe_pathmatch("abc[!]efg", "abcqefg", 0));
+ assertEqualInt(0, lafe_pathmatch("abc[!]efg", "abcefg", 0));
/* I assume: Trailing '-' is non-special. */
- assertEqualInt(0, pathmatch("abc[d-fh-]", "abcl", 0));
- assertEqualInt(1, pathmatch("abc[d-fh-]", "abch", 0));
- assertEqualInt(1, pathmatch("abc[d-fh-]", "abc-", 0));
- assertEqualInt(1, pathmatch("abc[d-fh-]", "abc-", 0));
+ assertEqualInt(0, lafe_pathmatch("abc[d-fh-]", "abcl", 0));
+ assertEqualInt(1, lafe_pathmatch("abc[d-fh-]", "abch", 0));
+ assertEqualInt(1, lafe_pathmatch("abc[d-fh-]", "abc-", 0));
+ assertEqualInt(1, lafe_pathmatch("abc[d-fh-]", "abc-", 0));
/* ']' can be backslash-quoted within a character class. */
- assertEqualInt(1, pathmatch("abc[\\]]", "abc]", 0));
- assertEqualInt(1, pathmatch("abc[\\]d]", "abc]", 0));
- assertEqualInt(1, pathmatch("abc[\\]d]", "abcd", 0));
- assertEqualInt(1, pathmatch("abc[d\\]]", "abc]", 0));
- assertEqualInt(1, pathmatch("abc[d\\]]", "abcd", 0));
- assertEqualInt(1, pathmatch("abc[d]e]", "abcde]", 0));
- assertEqualInt(1, pathmatch("abc[d\\]e]", "abc]", 0));
- assertEqualInt(0, pathmatch("abc[d\\]e]", "abcd]e", 0));
- assertEqualInt(0, pathmatch("abc[d]e]", "abc]", 0));
+ assertEqualInt(1, lafe_pathmatch("abc[\\]]", "abc]", 0));
+ assertEqualInt(1, lafe_pathmatch("abc[\\]d]", "abc]", 0));
+ assertEqualInt(1, lafe_pathmatch("abc[\\]d]", "abcd", 0));
+ assertEqualInt(1, lafe_pathmatch("abc[d\\]]", "abc]", 0));
+ assertEqualInt(1, lafe_pathmatch("abc[d\\]]", "abcd", 0));
+ assertEqualInt(1, lafe_pathmatch("abc[d]e]", "abcde]", 0));
+ assertEqualInt(1, lafe_pathmatch("abc[d\\]e]", "abc]", 0));
+ assertEqualInt(0, lafe_pathmatch("abc[d\\]e]", "abcd]e", 0));
+ assertEqualInt(0, lafe_pathmatch("abc[d]e]", "abc]", 0));
/* backslash-quoted chars can appear as either end of a range. */
- assertEqualInt(1, pathmatch("abc[\\d-f]gh", "abcegh", 0));
- assertEqualInt(0, pathmatch("abc[\\d-f]gh", "abcggh", 0));
- assertEqualInt(0, pathmatch("abc[\\d-f]gh", "abc\\gh", 0));
- assertEqualInt(1, pathmatch("abc[d-\\f]gh", "abcegh", 0));
- assertEqualInt(1, pathmatch("abc[\\d-\\f]gh", "abcegh", 0));
- assertEqualInt(1, pathmatch("abc[\\d-\\f]gh", "abcegh", 0));
+ assertEqualInt(1, lafe_pathmatch("abc[\\d-f]gh", "abcegh", 0));
+ assertEqualInt(0, lafe_pathmatch("abc[\\d-f]gh", "abcggh", 0));
+ assertEqualInt(0, lafe_pathmatch("abc[\\d-f]gh", "abc\\gh", 0));
+ assertEqualInt(1, lafe_pathmatch("abc[d-\\f]gh", "abcegh", 0));
+ assertEqualInt(1, lafe_pathmatch("abc[\\d-\\f]gh", "abcegh", 0));
+ assertEqualInt(1, lafe_pathmatch("abc[\\d-\\f]gh", "abcegh", 0));
/* backslash-quoted '-' isn't special. */
- assertEqualInt(0, pathmatch("abc[d\\-f]gh", "abcegh", 0));
- assertEqualInt(1, pathmatch("abc[d\\-f]gh", "abc-gh", 0));
+ assertEqualInt(0, lafe_pathmatch("abc[d\\-f]gh", "abcegh", 0));
+ assertEqualInt(1, lafe_pathmatch("abc[d\\-f]gh", "abc-gh", 0));
/* Leading '!' negates a character class. */
- assertEqualInt(0, pathmatch("abc[!d]", "abcd", 0));
- assertEqualInt(1, pathmatch("abc[!d]", "abce", 0));
- assertEqualInt(1, pathmatch("abc[!d]", "abcc", 0));
- assertEqualInt(0, pathmatch("abc[!d-z]", "abcq", 0));
- assertEqualInt(1, pathmatch("abc[!d-gi-z]", "abch", 0));
- assertEqualInt(1, pathmatch("abc[!fgijkl]", "abch", 0));
- assertEqualInt(0, pathmatch("abc[!fghijkl]", "abch", 0));
+ assertEqualInt(0, lafe_pathmatch("abc[!d]", "abcd", 0));
+ assertEqualInt(1, lafe_pathmatch("abc[!d]", "abce", 0));
+ assertEqualInt(1, lafe_pathmatch("abc[!d]", "abcc", 0));
+ assertEqualInt(0, lafe_pathmatch("abc[!d-z]", "abcq", 0));
+ assertEqualInt(1, lafe_pathmatch("abc[!d-gi-z]", "abch", 0));
+ assertEqualInt(1, lafe_pathmatch("abc[!fgijkl]", "abch", 0));
+ assertEqualInt(0, lafe_pathmatch("abc[!fghijkl]", "abch", 0));
/* Backslash quotes next character. */
- assertEqualInt(0, pathmatch("abc\\[def]", "abc\\d", 0));
- assertEqualInt(1, pathmatch("abc\\[def]", "abc[def]", 0));
- assertEqualInt(0, pathmatch("abc\\\\[def]", "abc[def]", 0));
- assertEqualInt(0, pathmatch("abc\\\\[def]", "abc\\[def]", 0));
- assertEqualInt(1, pathmatch("abc\\\\[def]", "abc\\d", 0));
- assertEqualInt(1, pathmatch("abcd\\", "abcd\\", 0));
- assertEqualInt(0, pathmatch("abcd\\", "abcd\\[", 0));
- assertEqualInt(0, pathmatch("abcd\\", "abcde", 0));
- assertEqualInt(0, pathmatch("abcd\\[", "abcd\\", 0));
+ assertEqualInt(0, lafe_pathmatch("abc\\[def]", "abc\\d", 0));
+ assertEqualInt(1, lafe_pathmatch("abc\\[def]", "abc[def]", 0));
+ assertEqualInt(0, lafe_pathmatch("abc\\\\[def]", "abc[def]", 0));
+ assertEqualInt(0, lafe_pathmatch("abc\\\\[def]", "abc\\[def]", 0));
+ assertEqualInt(1, lafe_pathmatch("abc\\\\[def]", "abc\\d", 0));
+ assertEqualInt(1, lafe_pathmatch("abcd\\", "abcd\\", 0));
+ assertEqualInt(0, lafe_pathmatch("abcd\\", "abcd\\[", 0));
+ assertEqualInt(0, lafe_pathmatch("abcd\\", "abcde", 0));
+ assertEqualInt(0, lafe_pathmatch("abcd\\[", "abcd\\", 0));
/*
* Because '.' and '/' have special meanings, we can
@@ -172,72 +172,72 @@ DEFINE_TEST(test_pathmatch)
* differently. (But quoting a character with '\\' suppresses
* special meanings!)
*/
- assertEqualInt(0, pathmatch("a/b/", "a/bc", 0));
- assertEqualInt(1, pathmatch("a/./b", "a/b", 0));
- assertEqualInt(0, pathmatch("a\\/./b", "a/b", 0));
- assertEqualInt(0, pathmatch("a/\\./b", "a/b", 0));
- assertEqualInt(0, pathmatch("a/.\\/b", "a/b", 0));
- assertEqualInt(0, pathmatch("a\\/\\.\\/b", "a/b", 0));
- assertEqualInt(1, pathmatch("./abc/./def/", "abc/def/", 0));
- assertEqualInt(1, pathmatch("abc/def", "./././abc/./def", 0));
- assertEqualInt(1, pathmatch("abc/def/././//", "./././abc/./def/", 0));
- assertEqualInt(1, pathmatch(".////abc/.//def", "./././abc/./def", 0));
- assertEqualInt(1, pathmatch("./abc?def/", "abc/def/", 0));
+ assertEqualInt(0, lafe_pathmatch("a/b/", "a/bc", 0));
+ assertEqualInt(1, lafe_pathmatch("a/./b", "a/b", 0));
+ assertEqualInt(0, lafe_pathmatch("a\\/./b", "a/b", 0));
+ assertEqualInt(0, lafe_pathmatch("a/\\./b", "a/b", 0));
+ assertEqualInt(0, lafe_pathmatch("a/.\\/b", "a/b", 0));
+ assertEqualInt(0, lafe_pathmatch("a\\/\\.\\/b", "a/b", 0));
+ assertEqualInt(1, lafe_pathmatch("./abc/./def/", "abc/def/", 0));
+ assertEqualInt(1, lafe_pathmatch("abc/def", "./././abc/./def", 0));
+ assertEqualInt(1, lafe_pathmatch("abc/def/././//", "./././abc/./def/", 0));
+ assertEqualInt(1, lafe_pathmatch(".////abc/.//def", "./././abc/./def", 0));
+ assertEqualInt(1, lafe_pathmatch("./abc?def/", "abc/def/", 0));
failure("\"?./\" is not the same as \"/./\"");
- assertEqualInt(0, pathmatch("./abc?./def/", "abc/def/", 0));
+ assertEqualInt(0, lafe_pathmatch("./abc?./def/", "abc/def/", 0));
failure("Trailing '/' should match no trailing '/'");
- assertEqualInt(1, pathmatch("./abc/./def/", "abc/def", 0));
+ assertEqualInt(1, lafe_pathmatch("./abc/./def/", "abc/def", 0));
failure("Trailing '/./' is still the same directory.");
- assertEqualInt(1, pathmatch("./abc/./def/./", "abc/def", 0));
+ assertEqualInt(1, lafe_pathmatch("./abc/./def/./", "abc/def", 0));
failure("Trailing '/.' is still the same directory.");
- assertEqualInt(1, pathmatch("./abc/./def/.", "abc/def", 0));
- assertEqualInt(1, pathmatch("./abc/./def", "abc/def/", 0));
+ assertEqualInt(1, lafe_pathmatch("./abc/./def/.", "abc/def", 0));
+ assertEqualInt(1, lafe_pathmatch("./abc/./def", "abc/def/", 0));
failure("Trailing '/./' is still the same directory.");
- assertEqualInt(1, pathmatch("./abc/./def", "abc/def/./", 0));
+ assertEqualInt(1, lafe_pathmatch("./abc/./def", "abc/def/./", 0));
failure("Trailing '/.' is still the same directory.");
- assertEqualInt(1, pathmatch("./abc*/./def", "abc/def/.", 0));
+ assertEqualInt(1, lafe_pathmatch("./abc*/./def", "abc/def/.", 0));
/* Matches not anchored at beginning. */
assertEqualInt(0,
- pathmatch("bcd", "abcd", PATHMATCH_NO_ANCHOR_START));
+ lafe_pathmatch("bcd", "abcd", PATHMATCH_NO_ANCHOR_START));
assertEqualInt(1,
- pathmatch("abcd", "abcd", PATHMATCH_NO_ANCHOR_START));
+ lafe_pathmatch("abcd", "abcd", PATHMATCH_NO_ANCHOR_START));
assertEqualInt(0,
- pathmatch("^bcd", "abcd", PATHMATCH_NO_ANCHOR_START));
+ lafe_pathmatch("^bcd", "abcd", PATHMATCH_NO_ANCHOR_START));
assertEqualInt(1,
- pathmatch("b/c/d", "a/b/c/d", PATHMATCH_NO_ANCHOR_START));
+ lafe_pathmatch("b/c/d", "a/b/c/d", PATHMATCH_NO_ANCHOR_START));
assertEqualInt(0,
- pathmatch("b/c", "a/b/c/d", PATHMATCH_NO_ANCHOR_START));
+ lafe_pathmatch("b/c", "a/b/c/d", PATHMATCH_NO_ANCHOR_START));
assertEqualInt(0,
- pathmatch("^b/c", "a/b/c/d", PATHMATCH_NO_ANCHOR_START));
+ lafe_pathmatch("^b/c", "a/b/c/d", PATHMATCH_NO_ANCHOR_START));
/* Matches not anchored at end. */
assertEqualInt(0,
- pathmatch("bcd", "abcd", PATHMATCH_NO_ANCHOR_END));
+ lafe_pathmatch("bcd", "abcd", PATHMATCH_NO_ANCHOR_END));
assertEqualInt(1,
- pathmatch("abcd", "abcd", PATHMATCH_NO_ANCHOR_END));
+ lafe_pathmatch("abcd", "abcd", PATHMATCH_NO_ANCHOR_END));
assertEqualInt(1,
- pathmatch("abcd", "abcd/", PATHMATCH_NO_ANCHOR_END));
+ lafe_pathmatch("abcd", "abcd/", PATHMATCH_NO_ANCHOR_END));
assertEqualInt(1,
- pathmatch("abcd", "abcd/.", PATHMATCH_NO_ANCHOR_END));
+ lafe_pathmatch("abcd", "abcd/.", PATHMATCH_NO_ANCHOR_END));
assertEqualInt(0,
- pathmatch("abc", "abcd", PATHMATCH_NO_ANCHOR_END));
+ lafe_pathmatch("abc", "abcd", PATHMATCH_NO_ANCHOR_END));
assertEqualInt(1,
- pathmatch("a/b/c", "a/b/c/d", PATHMATCH_NO_ANCHOR_END));
+ lafe_pathmatch("a/b/c", "a/b/c/d", PATHMATCH_NO_ANCHOR_END));
assertEqualInt(0,
- pathmatch("a/b/c$", "a/b/c/d", PATHMATCH_NO_ANCHOR_END));
+ lafe_pathmatch("a/b/c$", "a/b/c/d", PATHMATCH_NO_ANCHOR_END));
assertEqualInt(1,
- pathmatch("a/b/c$", "a/b/c", PATHMATCH_NO_ANCHOR_END));
+ lafe_pathmatch("a/b/c$", "a/b/c", PATHMATCH_NO_ANCHOR_END));
assertEqualInt(1,
- pathmatch("a/b/c$", "a/b/c/", PATHMATCH_NO_ANCHOR_END));
+ lafe_pathmatch("a/b/c$", "a/b/c/", PATHMATCH_NO_ANCHOR_END));
assertEqualInt(1,
- pathmatch("a/b/c/", "a/b/c/d", PATHMATCH_NO_ANCHOR_END));
+ lafe_pathmatch("a/b/c/", "a/b/c/d", PATHMATCH_NO_ANCHOR_END));
assertEqualInt(0,
- pathmatch("a/b/c/$", "a/b/c/d", PATHMATCH_NO_ANCHOR_END));
+ lafe_pathmatch("a/b/c/$", "a/b/c/d", PATHMATCH_NO_ANCHOR_END));
assertEqualInt(1,
- pathmatch("a/b/c/$", "a/b/c/", PATHMATCH_NO_ANCHOR_END));
+ lafe_pathmatch("a/b/c/$", "a/b/c/", PATHMATCH_NO_ANCHOR_END));
assertEqualInt(1,
- pathmatch("a/b/c/$", "a/b/c", PATHMATCH_NO_ANCHOR_END));
+ lafe_pathmatch("a/b/c/$", "a/b/c", PATHMATCH_NO_ANCHOR_END));
assertEqualInt(0,
- pathmatch("b/c", "a/b/c/d", PATHMATCH_NO_ANCHOR_END));
+ lafe_pathmatch("b/c", "a/b/c/d", PATHMATCH_NO_ANCHOR_END));
}
diff --git a/usr.bin/gcore/elfcore.c b/usr.bin/gcore/elfcore.c
index 9da22d7..8228c57 100644
--- a/usr.bin/gcore/elfcore.c
+++ b/usr.bin/gcore/elfcore.c
@@ -183,7 +183,7 @@ elf_coredump(int efd __unused, int fd, pid_t pid)
ptrace(PT_IO, pid, (caddr_t)&iorequest, 0);
ngot = iorequest.piod_len;
if ((size_t)ngot < nwant)
- errx(1, "short read wanted %d, got %d",
+ errx(1, "short read wanted %zu, got %zd",
nwant, ngot);
ngot = write(fd, buf, nwant);
if (ngot == -1)
diff --git a/usr.bin/ipcs/ipc.c b/usr.bin/ipcs/ipc.c
index f904e01..e0601dc 100644
--- a/usr.bin/ipcs/ipc.c
+++ b/usr.bin/ipcs/ipc.c
@@ -73,8 +73,7 @@ struct nlist symbols[] = {
X(shmseg, sizeof(u_long)) \
X(shmall, sizeof(u_long))
-#define SEMINFO_XVEC X(semmap, sizeof(int)) \
- X(semmni, sizeof(int)) \
+#define SEMINFO_XVEC X(semmni, sizeof(int)) \
X(semmns, sizeof(int)) \
X(semmnu, sizeof(int)) \
X(semmsl, sizeof(int)) \
@@ -120,7 +119,7 @@ sysctlgatherstruct(void *addr, size_t size, struct scgs_vector *vecarr)
if (rv == -1)
err(1, "sysctlbyname: %s", xp->sysctl);
if (tsiz != xp->size)
- errx(1, "%s size mismatch (expected %d, got %d)",
+ errx(1, "%s size mismatch (expected %zu, got %zu)",
xp->sysctl, xp->size, tsiz);
}
}
@@ -199,7 +198,7 @@ kget(int idx, void *addr, size_t size)
err(1, "sysctlbyname: %s", sym2sysctl[idx]);
if (tsiz != size)
errx(1, "%s size mismatch "
- "(expected %d, got %d)",
+ "(expected %zu, got %zu)",
sym2sysctl[idx], size, tsiz);
break;
}
diff --git a/usr.bin/ipcs/ipcs.c b/usr.bin/ipcs/ipcs.c
index 3ddfa25..1d8e354 100644
--- a/usr.bin/ipcs/ipcs.c
+++ b/usr.bin/ipcs/ipcs.c
@@ -474,8 +474,6 @@ print_ksemtotal(struct seminfo seminfo)
{
printf("seminfo:\n");
- printf("\tsemmap: %12d\t(# of entries in semaphore map)\n",
- seminfo.semmap);
printf("\tsemmni: %12d\t(# of semaphore identifiers)\n",
seminfo.semmni);
printf("\tsemmns: %12d\t(# of semaphores in system)\n",
diff --git a/usr.bin/ncal/ncal.1 b/usr.bin/ncal/ncal.1
index 8429906..3d71ec3 100644
--- a/usr.bin/ncal/ncal.1
+++ b/usr.bin/ncal/ncal.1
@@ -171,6 +171,8 @@ that, two after that and the whole year.
will warn about these combinations.
.Pp
A year starts on January 1.
+.Pp
+Highlighting of dates is disabled if stdout is not a tty.
.Sh SEE ALSO
.Xr calendar 3 ,
.Xr strftime 3
diff --git a/usr.bin/ncal/ncal.c b/usr.bin/ncal/ncal.c
index 44e31fe..2ca770a 100644
--- a/usr.bin/ncal/ncal.c
+++ b/usr.bin/ncal/ncal.c
@@ -822,7 +822,8 @@ mkmonthr(int y, int m, int jd_flag, struct monthlines *mlines)
dt.d = j - jan1 + 1;
else
sdater(j, &dt);
- if (j == highlightdate && !flag_nohighlight)
+ if (j == highlightdate && !flag_nohighlight
+ && isatty(STDOUT_FILENO))
highlight(mlines->lines[i] + k,
ds + dt.d * dw, dw, &l);
else
diff --git a/usr.bin/netstat/if.c b/usr.bin/netstat/if.c
index fc15607..8a11270 100644
--- a/usr.bin/netstat/if.c
+++ b/usr.bin/netstat/if.c
@@ -394,7 +394,7 @@ intpr(int interval1, u_long ifnetaddr, void (*pfunc)(char *))
n = cp - sa->sa_data + 1;
cp = sa->sa_data;
hexprint:
- while (--n >= 0)
+ while ((--n >= 0) && (m < 30))
m += printf("%02x%c", *cp++ & 0xff,
n > 0 ? ':' : ' ');
m = 32 - m;
diff --git a/usr.bin/nsupdate/Makefile b/usr.bin/nsupdate/Makefile
index 941c7f3..d5cb8f0 100644
--- a/usr.bin/nsupdate/Makefile
+++ b/usr.bin/nsupdate/Makefile
@@ -14,6 +14,7 @@ SRCS+= nsupdate.c
CFLAGS+= -I${SRCDIR}/include
CFLAGS+= -I${BIND_DIR}/lib/isc/${ISC_ATOMIC_ARCH}/include
+CFLAGS+= -DSESSION_KEYFILE=\"/var/run/named/session.key\"
DPADD+= ${BIND_DPADD} ${CRYPTO_DPADD} ${PTHREAD_DPADD}
LDADD+= ${BIND_LDADD} ${CRYPTO_LDADD} ${PTHREAD_LDADD}
diff --git a/usr.bin/rctl/rctl.8 b/usr.bin/rctl/rctl.8
index 98c9d4e..f8f8ddb 100644
--- a/usr.bin/rctl/rctl.8
+++ b/usr.bin/rctl/rctl.8
@@ -25,7 +25,7 @@
.\"
.\" $FreeBSD$
.\"
-.Dd May 26, 2011
+.Dd July 14, 2011
.Dt RCTL 8
.Os
.Sh NAME
@@ -121,32 +121,31 @@ A filter that matches all defined rules for nproc resource would be
"::nproc".
.Pp
.Sh RESOURCES
-.Bl -column -offset 3n "msgqqueued"
-.It cpu CPU time, in milliseconds
-.It data data size, in bytes
-.It stack stack size, in bytes
-.It core core dump size, in bytes
-.It rss resident set size, in bytes
-.It memlock locked memory, in bytes
-.It nproc number of processes
-.It nofile file descriptor table size
-.It vmem address space limit, in bytes
-.It npts number of PTYs
-.It swap swap usage, in bytes
-.It nthr number of threads
-.It msgqqueued number of queued SysV messages
-.It msgqsize SysV message queue size, in bytes
-.It nmsgq number of SysV message queues
-.It nsem number of SysV semaphores
-.It nsemop number of SysV semaphores modified in a single semop(2) call
-.It nshm number of SysV shared memory segments
-.It shmsize SysV shared memory size, in bytes
-.It wallclock wallclock time, in milliseconds
-.It pctcpu %cpu time
+.Bl -column -offset 3n "pseudoterminals"
+.It cputime CPU time, in seconds
+.It datasize data size, in bytes
+.It stacksize stack size, in bytes
+.It coredumpsize core dump size, in bytes
+.It memoryuse resident set size, in bytes
+.It memorylocked locked memory, in bytes
+.It maxproc number of processes
+.It openfiles file descriptor table size
+.It vmemoryuse address space limit, in bytes
+.It pseudoterminals number of PTYs
+.It swapuse swap usage, in bytes
+.It nthr number of threads
+.It msgqqueued number of queued SysV messages
+.It msgqsize SysV message queue size, in bytes
+.It nmsgq number of SysV message queues
+.It nsem number of SysV semaphores
+.It nsemop number of SysV semaphores modified in a single semop(2) call
+.It nshm number of SysV shared memory segments
+.It shmsize SysV shared memory size, in bytes
+.It wallclock wallclock time, in seconds
.El
.Pp
.Sh ACTIONS
-.Bl -column -offset 3n "msgqqueued"
+.Bl -column -offset 3n "pseudoterminals"
.It deny deny the allocation; not supported for cpu and wallclock
.It log log a warning to the console
.It devctl send notification to
@@ -167,7 +166,7 @@ Note that limiting RSS may kill the machine due to thrashing.
.Sh EXIT STATUS
.Ex -std
.Sh EXAMPLES
-.Dl rctl -a user:joe:vmem:deny=1g
+.Dl rctl -a user:joe:vmemoryuse:deny=1g
.Pp
Prevent user "joe" from allocating more than 1GB of virtual memory.
.Pp
diff --git a/usr.bin/rpcgen/rpc_scan.c b/usr.bin/rpcgen/rpc_scan.c
index 421b055..bdbeec0 100644
--- a/usr.bin/rpcgen/rpc_scan.c
+++ b/usr.bin/rpcgen/rpc_scan.c
@@ -329,10 +329,9 @@ findstrconst(char **str, const char **val)
error("unterminated string constant");
}
p++;
- size = p - *str;
- tmp = xmalloc(size + 1);
- (void) strncpy(tmp, *str, size);
- tmp[size] = 0;
+ size = p - *str + 1;
+ tmp = xmalloc(size);
+ (void) strlcpy(tmp, *str, size);
*val = tmp;
*str = p;
}
@@ -352,13 +351,12 @@ findchrconst(char **str, const char **val)
error("unterminated string constant");
}
p++;
- size = p - *str;
- if (size != 3) {
+ size = p - *str + 1;
+ if (size != 4) {
error("empty char string");
}
- tmp = xmalloc(size + 1);
- (void) strncpy(tmp, *str, size);
- tmp[size] = 0;
+ tmp = xmalloc(size);
+ (void) strlcpy(tmp, *str, size);
*val = tmp;
*str = p;
}
@@ -381,10 +379,9 @@ findconst(char **str, const char **val)
p++;
} while (isdigit(*p));
}
- size = p - *str;
- tmp = xmalloc(size + 1);
- (void) strncpy(tmp, *str, size);
- tmp[size] = 0;
+ size = p - *str + 1;
+ tmp = xmalloc(size);
+ (void) strlcpy(tmp, *str, size);
*val = tmp;
*str = p;
}
@@ -438,8 +435,7 @@ findkind(char **mark, token *tokp)
tokp->kind = TOK_IDENT;
for (len = 0; isalnum(str[len]) || str[len] == '_'; len++);
tmp = xmalloc(len + 1);
- (void) strncpy(tmp, str, len);
- tmp[len] = 0;
+ (void) strlcpy(tmp, str, len + 1);
tokp->str = tmp;
*mark = str + len;
}
diff --git a/usr.bin/tar/Makefile b/usr.bin/tar/Makefile
index 4b0d186..ef21e44 100644
--- a/usr.bin/tar/Makefile
+++ b/usr.bin/tar/Makefile
@@ -2,21 +2,24 @@
.include <bsd.own.mk>
PROG= bsdtar
-BSDTAR_VERSION_STRING=2.8.3
+BSDTAR_VERSION_STRING=2.8.4
SRCS= bsdtar.c \
cmdline.c \
- err.c \
getdate.c \
- line_reader.c \
- matching.c \
- pathmatch.c \
read.c \
subst.c \
tree.c \
util.c \
write.c
-DPADD= ${LIBARCHIVE} ${LIBBZ2} ${LIBZ} ${LIBMD} ${LIBLZMA}
-LDADD= -larchive -lbz2 -lz -lmd -llzma
+
+.PATH: ${.CURDIR}/../../lib/libarchive/libarchive_fe
+SRCS+= err.c \
+ line_reader.c \
+ matching.c \
+ pathmatch.c
+
+DPADD= ${LIBARCHIVE} ${LIBBZ2} ${LIBZ} ${LIBMD} ${LIBLZMA} ${LIBBSDXML}
+LDADD= -larchive -lbz2 -lz -lmd -llzma -lbsdxml
.if ${MK_OPENSSL} != "no"
DPADD+= ${LIBCRYPTO}
LDADD+= -lcrypto
@@ -24,6 +27,7 @@ LDADD+= -lcrypto
CFLAGS+= -DBSDTAR_VERSION_STRING=\"${BSDTAR_VERSION_STRING}\"
CFLAGS+= -DPLATFORM_CONFIG_H=\"config_freebsd.h\"
CFLAGS+= -I${.CURDIR} -I${.CURDIR}/../../lib/libarchive
+CFLAGS+= -I${.CURDIR}/../../lib/libarchive/libarchive_fe
SYMLINKS= bsdtar ${BINDIR}/tar
MLINKS= bsdtar.1 tar.1
DEBUG_FLAGS=-g
diff --git a/usr.bin/tar/bsdtar.1 b/usr.bin/tar/bsdtar.1
index 81b3c41..14c77e9 100644
--- a/usr.bin/tar/bsdtar.1
+++ b/usr.bin/tar/bsdtar.1
@@ -50,8 +50,8 @@
.Sh DESCRIPTION
.Nm
creates and manipulates streaming archive files.
-This implementation can extract from tar, pax, cpio, zip, jar, ar,
-xar, and ISO 9660 cdrom images and can create tar, pax, cpio, ar, zip,
+This implementation can extract from tar, pax, cpio, zip, jar, ar, xar,
+rpm and ISO 9660 cdrom images and can create tar, pax, cpio, ar, zip,
and shar archives.
.Pp
The first synopsis form shows a
diff --git a/usr.bin/tar/bsdtar.c b/usr.bin/tar/bsdtar.c
index 00c6f45..0bb6a7f 100644
--- a/usr.bin/tar/bsdtar.c
+++ b/usr.bin/tar/bsdtar.c
@@ -63,6 +63,9 @@ __FBSDID("$FreeBSD$");
#ifdef HAVE_UNISTD_H
#include <unistd.h>
#endif
+#if HAVE_ZLIB_H
+#include <zlib.h>
+#endif
#include "bsdtar.h"
#include "err.h"
@@ -86,6 +89,8 @@ __FBSDID("$FreeBSD$");
int _CRT_glob = 0; /* Disable broken CRT globbing. */
#endif
+static struct bsdtar *_bsdtar;
+
#if defined(HAVE_SIGACTION) && (defined(SIGINFO) || defined(SIGUSR1))
static volatile int siginfo_occurred;
@@ -139,7 +144,7 @@ main(int argc, char **argv)
* Use a pointer for consistency, but stack-allocated storage
* for ease of cleanup.
*/
- bsdtar = &bsdtar_storage;
+ _bsdtar = bsdtar = &bsdtar_storage;
memset(bsdtar, 0, sizeof(*bsdtar));
bsdtar->fd = -1; /* Mark as "unused" */
option_o = 0;
@@ -152,36 +157,36 @@ main(int argc, char **argv)
sa.sa_flags = 0;
#ifdef SIGINFO
if (sigaction(SIGINFO, &sa, NULL))
- bsdtar_errc(1, errno, "sigaction(SIGINFO) failed");
+ lafe_errc(1, errno, "sigaction(SIGINFO) failed");
#endif
#ifdef SIGUSR1
/* ... and treat SIGUSR1 the same way as SIGINFO. */
if (sigaction(SIGUSR1, &sa, NULL))
- bsdtar_errc(1, errno, "sigaction(SIGUSR1) failed");
+ lafe_errc(1, errno, "sigaction(SIGUSR1) failed");
#endif
}
#endif
- /* Need bsdtar_progname before calling bsdtar_warnc. */
+ /* Need lafe_progname before calling lafe_warnc. */
if (*argv == NULL)
- bsdtar_progname = "bsdtar";
+ lafe_progname = "bsdtar";
else {
#if defined(_WIN32) && !defined(__CYGWIN__)
- bsdtar_progname = strrchr(*argv, '\\');
+ lafe_progname = strrchr(*argv, '\\');
#else
- bsdtar_progname = strrchr(*argv, '/');
+ lafe_progname = strrchr(*argv, '/');
#endif
- if (bsdtar_progname != NULL)
- bsdtar_progname++;
+ if (lafe_progname != NULL)
+ lafe_progname++;
else
- bsdtar_progname = *argv;
+ lafe_progname = *argv;
}
time(&now);
#if HAVE_SETLOCALE
if (setlocale(LC_ALL, "") == NULL)
- bsdtar_warnc(0, "Failed to set default locale");
+ lafe_warnc(0, "Failed to set default locale");
#endif
#if defined(HAVE_NL_LANGINFO) && defined(HAVE_D_MD_ORDER)
bsdtar->day_first = (*nl_langinfo(D_MD_ORDER) == 'd');
@@ -233,7 +238,7 @@ main(int argc, char **argv)
case 'b': /* SUSv2 */
t = atoi(bsdtar->optarg);
if (t <= 0 || t > 8192)
- bsdtar_errc(1, 0,
+ lafe_errc(1, 0,
"Argument to -b is out of range (1..8192)");
bsdtar->bytes_per_block = 512 * t;
break;
@@ -251,7 +256,7 @@ main(int argc, char **argv)
break;
case OPTION_EXCLUDE: /* GNU tar */
if (lafe_exclude(&bsdtar->matching, bsdtar->optarg))
- bsdtar_errc(1, 0,
+ lafe_errc(1, 0,
"Couldn't exclude %s\n", bsdtar->optarg);
break;
case OPTION_FORMAT: /* GNU tar, others */
@@ -297,20 +302,20 @@ main(int argc, char **argv)
* when transforming archives.
*/
if (lafe_include(&bsdtar->matching, bsdtar->optarg))
- bsdtar_errc(1, 0,
+ lafe_errc(1, 0,
"Failed to add %s to inclusion list",
bsdtar->optarg);
break;
case 'j': /* GNU tar */
if (bsdtar->create_compression != '\0')
- bsdtar_errc(1, 0,
+ lafe_errc(1, 0,
"Can't specify both -%c and -%c", opt,
bsdtar->create_compression);
bsdtar->create_compression = opt;
break;
case 'J': /* GNU tar 1.21 and later */
if (bsdtar->create_compression != '\0')
- bsdtar_errc(1, 0,
+ lafe_errc(1, 0,
"Can't specify both -%c and -%c", opt,
bsdtar->create_compression);
bsdtar->create_compression = opt;
@@ -330,7 +335,7 @@ main(int argc, char **argv)
break;
case OPTION_LZMA:
if (bsdtar->create_compression != '\0')
- bsdtar_errc(1, 0,
+ lafe_errc(1, 0,
"Can't specify both -%c and -%c", opt,
bsdtar->create_compression);
bsdtar->create_compression = opt;
@@ -355,7 +360,7 @@ main(int argc, char **argv)
{
struct stat st;
if (stat(bsdtar->optarg, &st) != 0)
- bsdtar_errc(1, 0,
+ lafe_errc(1, 0,
"Can't open file %s", bsdtar->optarg);
bsdtar->newer_ctime_sec = st.st_ctime;
bsdtar->newer_ctime_nsec =
@@ -369,7 +374,7 @@ main(int argc, char **argv)
{
struct stat st;
if (stat(bsdtar->optarg, &st) != 0)
- bsdtar_errc(1, 0,
+ lafe_errc(1, 0,
"Can't open file %s", bsdtar->optarg);
bsdtar->newer_mtime_sec = st.st_mtime;
bsdtar->newer_mtime_nsec =
@@ -440,7 +445,7 @@ main(int argc, char **argv)
#if HAVE_REGEX_H
add_substitution(bsdtar, bsdtar->optarg);
#else
- bsdtar_warnc(0,
+ lafe_warnc(0,
"-s is not supported by this version of bsdtar");
usage();
#endif
@@ -487,7 +492,7 @@ main(int argc, char **argv)
break;
case 'X': /* GNU tar */
if (lafe_exclude_from_file(&bsdtar->matching, bsdtar->optarg))
- bsdtar_errc(1, 0,
+ lafe_errc(1, 0,
"failed to process exclusions from file %s",
bsdtar->optarg);
break;
@@ -496,21 +501,21 @@ main(int argc, char **argv)
break;
case 'y': /* FreeBSD version of GNU tar */
if (bsdtar->create_compression != '\0')
- bsdtar_errc(1, 0,
+ lafe_errc(1, 0,
"Can't specify both -%c and -%c", opt,
bsdtar->create_compression);
bsdtar->create_compression = opt;
break;
case 'Z': /* GNU tar */
if (bsdtar->create_compression != '\0')
- bsdtar_errc(1, 0,
+ lafe_errc(1, 0,
"Can't specify both -%c and -%c", opt,
bsdtar->create_compression);
bsdtar->create_compression = opt;
break;
case 'z': /* GNU tar, star, many others */
if (bsdtar->create_compression != '\0')
- bsdtar_errc(1, 0,
+ lafe_errc(1, 0,
"Can't specify both -%c and -%c", opt,
bsdtar->create_compression);
bsdtar->create_compression = opt;
@@ -535,7 +540,7 @@ main(int argc, char **argv)
/* Otherwise, a mode is required. */
if (bsdtar->mode == '\0')
- bsdtar_errc(1, 0,
+ lafe_errc(1, 0,
"Must specify one of -c, -r, -t, -u, -x");
/* Check boolean options only permitted in certain modes. */
@@ -615,7 +620,7 @@ main(int argc, char **argv)
#endif
if (bsdtar->return_value != 0)
- bsdtar_warnc(0,
+ lafe_warnc(0,
"Error exit delayed from previous errors.");
return (bsdtar->return_value);
}
@@ -624,7 +629,7 @@ static void
set_mode(struct bsdtar *bsdtar, char opt)
{
if (bsdtar->mode != '\0' && bsdtar->mode != opt)
- bsdtar_errc(1, 0,
+ lafe_errc(1, 0,
"Can't specify both -%c and -%c", opt, bsdtar->mode);
bsdtar->mode = opt;
}
@@ -636,7 +641,7 @@ static void
only_mode(struct bsdtar *bsdtar, const char *opt, const char *valid_modes)
{
if (strchr(valid_modes, bsdtar->mode) == NULL)
- bsdtar_errc(1, 0,
+ lafe_errc(1, 0,
"Option %s is not permitted in mode -%c",
opt, bsdtar->mode);
}
@@ -647,7 +652,7 @@ usage(void)
{
const char *p;
- p = bsdtar_progname;
+ p = lafe_progname;
fprintf(stderr, "Usage:\n");
fprintf(stderr, " List: %s -tf <archive-filename>\n", p);
@@ -707,7 +712,7 @@ long_help(void)
const char *prog;
const char *p;
- prog = bsdtar_progname;
+ prog = lafe_progname;
fflush(stderr);
diff --git a/usr.bin/tar/cmdline.c b/usr.bin/tar/cmdline.c
index dfe7cf6..ba3e8a1 100644
--- a/usr.bin/tar/cmdline.c
+++ b/usr.bin/tar/cmdline.c
@@ -221,7 +221,7 @@ bsdtar_getopt(struct bsdtar *bsdtar)
if (p[1] == ':') {
bsdtar->optarg = *bsdtar->argv;
if (bsdtar->optarg == NULL) {
- bsdtar_warnc(0,
+ lafe_warnc(0,
"Option %c requires an argument",
opt);
return ('?');
@@ -288,7 +288,7 @@ bsdtar_getopt(struct bsdtar *bsdtar)
/* Otherwise, pick up the next word. */
opt_word = *bsdtar->argv;
if (opt_word == NULL) {
- bsdtar_warnc(0,
+ lafe_warnc(0,
"Option -%c requires an argument",
opt);
return ('?');
@@ -339,13 +339,13 @@ bsdtar_getopt(struct bsdtar *bsdtar)
/* Fail if there wasn't a unique match. */
if (match == NULL) {
- bsdtar_warnc(0,
+ lafe_warnc(0,
"Option %s%s is not supported",
long_prefix, opt_word);
return ('?');
}
if (match2 != NULL) {
- bsdtar_warnc(0,
+ lafe_warnc(0,
"Ambiguous option %s%s (matches --%s and --%s)",
long_prefix, opt_word, match->name, match2->name);
return ('?');
@@ -357,7 +357,7 @@ bsdtar_getopt(struct bsdtar *bsdtar)
if (bsdtar->optarg == NULL) {
bsdtar->optarg = *bsdtar->argv;
if (bsdtar->optarg == NULL) {
- bsdtar_warnc(0,
+ lafe_warnc(0,
"Option %s%s requires an argument",
long_prefix, match->name);
return ('?');
@@ -368,7 +368,7 @@ bsdtar_getopt(struct bsdtar *bsdtar)
} else {
/* Argument forbidden: fail if there is one. */
if (bsdtar->optarg != NULL) {
- bsdtar_warnc(0,
+ lafe_warnc(0,
"Option %s%s does not allow an argument",
long_prefix, match->name);
return ('?');
diff --git a/usr.bin/tar/config_freebsd.h b/usr.bin/tar/config_freebsd.h
index 8209758..4c8ec3a 100644
--- a/usr.bin/tar/config_freebsd.h
+++ b/usr.bin/tar/config_freebsd.h
@@ -44,6 +44,7 @@
#undef HAVE_LIBACL
#define HAVE_LIBARCHIVE 1
#define HAVE_LIMITS_H 1
+#define HAVE_LINK 1
#undef HAVE_LINUX_EXT2_FS_H
#undef HAVE_LINUX_FS_H
#define HAVE_LOCALE_H 1
@@ -77,5 +78,5 @@
#define HAVE_TIME_H 1
#define HAVE_UNISTD_H 1
#define HAVE_WCTYPE_H 1
+#define HAVE_WCSCMP 1
#undef HAVE_WINDOWS_H
-
diff --git a/usr.bin/tar/err.c b/usr.bin/tar/err.c
deleted file mode 100644
index 3770561..0000000
--- a/usr.bin/tar/err.c
+++ /dev/null
@@ -1,74 +0,0 @@
-/*-
- * Copyright (c) 2003-2010 Tim Kientzle
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer
- * in this position and unchanged.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR(S) ``AS IS'' AND ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
- * IN NO EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include "bsdtar_platform.h"
-__FBSDID("$FreeBSD$");
-
-#ifdef HAVE_STDARG_H
-#include <stdarg.h>
-#endif
-#include <stdio.h>
-#ifdef HAVE_STDLIB_H
-#include <stdlib.h>
-#endif
-#ifdef HAVE_STRING_H
-#include <string.h>
-#endif
-
-#include "err.h"
-
-const char *bsdtar_progname;
-
-static void
-bsdtar_vwarnc(int code, const char *fmt, va_list ap)
-{
- fprintf(stderr, "%s: ", bsdtar_progname);
- vfprintf(stderr, fmt, ap);
- if (code != 0)
- fprintf(stderr, ": %s", strerror(code));
- fprintf(stderr, "\n");
-}
-
-void
-bsdtar_warnc(int code, const char *fmt, ...)
-{
- va_list ap;
-
- va_start(ap, fmt);
- bsdtar_vwarnc(code, fmt, ap);
- va_end(ap);
-}
-
-void
-bsdtar_errc(int eval, int code, const char *fmt, ...)
-{
- va_list ap;
-
- va_start(ap, fmt);
- bsdtar_vwarnc(code, fmt, ap);
- va_end(ap);
- exit(eval);
-}
diff --git a/usr.bin/tar/read.c b/usr.bin/tar/read.c
index 525daac..b1616ec 100644
--- a/usr.bin/tar/read.c
+++ b/usr.bin/tar/read.c
@@ -160,11 +160,11 @@ read_archive(struct bsdtar *bsdtar, char mode)
archive_read_support_compression_all(a);
archive_read_support_format_all(a);
if (ARCHIVE_OK != archive_read_set_options(a, bsdtar->option_options))
- bsdtar_errc(1, 0, "%s", archive_error_string(a));
+ lafe_errc(1, 0, "%s", archive_error_string(a));
if (archive_read_open_file(a, bsdtar->filename,
bsdtar->bytes_per_block != 0 ? bsdtar->bytes_per_block :
DEFAULT_BYTES_PER_BLOCK))
- bsdtar_errc(1, 0, "Error opening archive: %s",
+ lafe_errc(1, 0, "Error opening archive: %s",
archive_error_string(a));
do_chdir(bsdtar);
@@ -180,9 +180,9 @@ read_archive(struct bsdtar *bsdtar, char mode)
if (mode == 'x' && bsdtar->option_chroot) {
#if HAVE_CHROOT
if (chroot(".") != 0)
- bsdtar_errc(1, errno, "Can't chroot to \".\"");
+ lafe_errc(1, errno, "Can't chroot to \".\"");
#else
- bsdtar_errc(1, 0,
+ lafe_errc(1, 0,
"chroot isn't supported on this platform");
#endif
}
@@ -198,12 +198,12 @@ read_archive(struct bsdtar *bsdtar, char mode)
if (r == ARCHIVE_EOF)
break;
if (r < ARCHIVE_OK)
- bsdtar_warnc(0, "%s", archive_error_string(a));
+ lafe_warnc(0, "%s", archive_error_string(a));
if (r <= ARCHIVE_WARN)
bsdtar->return_value = 1;
if (r == ARCHIVE_RETRY) {
/* Retryable error: try again */
- bsdtar_warnc(0, "Retrying...");
+ lafe_warnc(0, "Retrying...");
continue;
}
if (r == ARCHIVE_FATAL)
@@ -267,17 +267,17 @@ read_archive(struct bsdtar *bsdtar, char mode)
r = archive_read_data_skip(a);
if (r == ARCHIVE_WARN) {
fprintf(out, "\n");
- bsdtar_warnc(0, "%s",
+ lafe_warnc(0, "%s",
archive_error_string(a));
}
if (r == ARCHIVE_RETRY) {
fprintf(out, "\n");
- bsdtar_warnc(0, "%s",
+ lafe_warnc(0, "%s",
archive_error_string(a));
}
if (r == ARCHIVE_FATAL) {
fprintf(out, "\n");
- bsdtar_warnc(0, "%s",
+ lafe_warnc(0, "%s",
archive_error_string(a));
bsdtar->return_value = 1;
break;
@@ -329,7 +329,7 @@ read_archive(struct bsdtar *bsdtar, char mode)
r = archive_read_close(a);
if (r != ARCHIVE_OK)
- bsdtar_warnc(0, "%s", archive_error_string(a));
+ lafe_warnc(0, "%s", archive_error_string(a));
if (r <= ARCHIVE_WARN)
bsdtar->return_value = 1;
diff --git a/usr.bin/tar/subst.c b/usr.bin/tar/subst.c
index a217293..765f74b 100644
--- a/usr.bin/tar/subst.c
+++ b/usr.bin/tar/subst.c
@@ -58,7 +58,7 @@ init_substitution(struct bsdtar *bsdtar)
bsdtar->substitution = subst = malloc(sizeof(*subst));
if (subst == NULL)
- bsdtar_errc(1, errno, "Out of memory");
+ lafe_errc(1, errno, "Out of memory");
subst->first_rule = subst->last_rule = NULL;
}
@@ -78,7 +78,7 @@ add_substitution(struct bsdtar *bsdtar, const char *rule_text)
rule = malloc(sizeof(*rule));
if (rule == NULL)
- bsdtar_errc(1, errno, "Out of memory");
+ lafe_errc(1, errno, "Out of memory");
rule->next = NULL;
if (subst->last_rule == NULL)
@@ -88,32 +88,32 @@ add_substitution(struct bsdtar *bsdtar, const char *rule_text)
subst->last_rule = rule;
if (*rule_text == '\0')
- bsdtar_errc(1, 0, "Empty replacement string");
+ lafe_errc(1, 0, "Empty replacement string");
end_pattern = strchr(rule_text + 1, *rule_text);
if (end_pattern == NULL)
- bsdtar_errc(1, 0, "Invalid replacement string");
+ lafe_errc(1, 0, "Invalid replacement string");
pattern = malloc(end_pattern - rule_text);
if (pattern == NULL)
- bsdtar_errc(1, errno, "Out of memory");
+ lafe_errc(1, errno, "Out of memory");
memcpy(pattern, rule_text + 1, end_pattern - rule_text - 1);
pattern[end_pattern - rule_text - 1] = '\0';
if ((r = regcomp(&rule->re, pattern, REG_BASIC)) != 0) {
char buf[80];
regerror(r, &rule->re, buf, sizeof(buf));
- bsdtar_errc(1, 0, "Invalid regular expression: %s", buf);
+ lafe_errc(1, 0, "Invalid regular expression: %s", buf);
}
free(pattern);
start_subst = end_pattern + 1;
end_pattern = strchr(start_subst, *rule_text);
if (end_pattern == NULL)
- bsdtar_errc(1, 0, "Invalid replacement string");
+ lafe_errc(1, 0, "Invalid replacement string");
rule->result = malloc(end_pattern - start_subst + 1);
if (rule->result == NULL)
- bsdtar_errc(1, errno, "Out of memory");
+ lafe_errc(1, errno, "Out of memory");
memcpy(rule->result, start_subst, end_pattern - start_subst);
rule->result[end_pattern - start_subst] = '\0';
@@ -136,7 +136,7 @@ add_substitution(struct bsdtar *bsdtar, const char *rule_text)
rule->symlink = 1;
break;
default:
- bsdtar_errc(1, 0, "Invalid replacement flag %c", *end_pattern);
+ lafe_errc(1, 0, "Invalid replacement flag %c", *end_pattern);
}
}
}
@@ -154,7 +154,7 @@ realloc_strncat(char **str, const char *append, size_t len)
new_str = malloc(old_len + len + 1);
if (new_str == NULL)
- bsdtar_errc(1, errno, "Out of memory");
+ lafe_errc(1, errno, "Out of memory");
memcpy(new_str, *str, old_len);
memcpy(new_str + old_len, append, len);
new_str[old_len + len] = '\0';
@@ -175,7 +175,7 @@ realloc_strcat(char **str, const char *append)
new_str = malloc(old_len + strlen(append) + 1);
if (new_str == NULL)
- bsdtar_errc(1, errno, "Out of memory");
+ lafe_errc(1, errno, "Out of memory");
memcpy(new_str, *str, old_len);
strcpy(new_str + old_len, append);
free(*str);
diff --git a/usr.bin/tar/test/Makefile b/usr.bin/tar/test/Makefile
index 9babcfa..4342cdf 100644
--- a/usr.bin/tar/test/Makefile
+++ b/usr.bin/tar/test/Makefile
@@ -6,16 +6,18 @@ TAR_SRCDIR=${.CURDIR}/..
# Some tar sources are pulled in for white-box tests
TAR_SRCS= \
- ../getdate.c
+ getdate.c
TESTS= \
test_0.c \
test_basic.c \
test_copy.c \
+ test_empty_mtree.c \
test_getdate.c \
test_help.c \
- test_option_T.c \
+ test_option_T_upper.c \
test_option_q.c \
+ test_option_r.c \
test_option_s.c \
test_patterns.c \
test_stdio.c \
diff --git a/usr.bin/tar/test/main.c b/usr.bin/tar/test/main.c
index 041b7a0..bd1db1d 100644
--- a/usr.bin/tar/test/main.c
+++ b/usr.bin/tar/test/main.c
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2003-2007 Tim Kientzle
+ * Copyright (c) 2003-2009 Tim Kientzle
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
@@ -23,12 +23,7 @@
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
-/*
- * Various utility routines useful for test programs.
- * Each test program is linked against this file.
- */
#include "test.h"
-
#include <errno.h>
#include <locale.h>
#include <stdarg.h>
@@ -38,148 +33,319 @@
* This same file is used pretty much verbatim for all test harnesses.
*
* The next few lines are the only differences.
+ * TODO: Move this into a separate configuration header, have all test
+ * suites share one copy of this file.
*/
-#define PROGRAM "bsdtar" /* Name of program being tested. */
-#define ENVBASE "BSDTAR" /* Prefix for environment variables. */
+__FBSDID("$FreeBSD$");
+#define KNOWNREF "test_patterns_2.tar.uu"
+#define ENVBASE "BSDTAR" /* Prefix for environment variables. */
+#define PROGRAM "bsdtar" /* Name of program being tested. */
+#undef LIBRARY /* Not testing a library. */
#undef EXTRA_DUMP /* How to dump extra data */
/* How to generate extra version info. */
#define EXTRA_VERSION (systemf("%s --version", testprog) ? "" : "")
-__FBSDID("$FreeBSD$");
/*
- * "list.h" is simply created by "grep DEFINE_TEST"; it has
- * a line like
- * DEFINE_TEST(test_function)
- * for each test.
- * Include it here with a suitable DEFINE_TEST to declare all of the
- * test functions.
+ *
+ * Windows support routines
+ *
+ * Note: Configuration is a tricky issue. Using HAVE_* feature macros
+ * in the test harness is dangerous because they cover up
+ * configuration errors. The classic example of this is omitting a
+ * configure check. If libarchive and libarchive_test both look for
+ * the same feature macro, such errors are hard to detect. Platform
+ * macros (e.g., _WIN32 or __GNUC__) are a little better, but can
+ * easily lead to very messy code. It's best to limit yourself
+ * to only the most generic programming techniques in the test harness
+ * and thus avoid conditionals altogether. Where that's not possible,
+ * try to minimize conditionals by grouping platform-specific tests in
+ * one place (e.g., test_acl_freebsd) or by adding new assert()
+ * functions (e.g., assertMakeHardlink()) to cover up platform
+ * differences. Platform-specific coding in libarchive_test is often
+ * a symptom that some capability is missing from libarchive itself.
*/
-#undef DEFINE_TEST
-#define DEFINE_TEST(name) void name(void);
-#include "list.h"
+#if defined(_WIN32) && !defined(__CYGWIN__)
+#include <io.h>
+#include <windows.h>
+#ifndef F_OK
+#define F_OK (0)
+#endif
+#ifndef S_ISDIR
+#define S_ISDIR(m) ((m) & _S_IFDIR)
+#endif
+#ifndef S_ISREG
+#define S_ISREG(m) ((m) & _S_IFREG)
+#endif
+#if !defined(__BORLANDC__)
+#define access _access
+#undef chdir
+#define chdir _chdir
+#endif
+#ifndef fileno
+#define fileno _fileno
+#endif
+/*#define fstat _fstat64*/
+#if !defined(__BORLANDC__)
+#define getcwd _getcwd
+#endif
+#define lstat stat
+/*#define lstat _stat64*/
+/*#define stat _stat64*/
+#define rmdir _rmdir
+#if !defined(__BORLANDC__)
+#define strdup _strdup
+#define umask _umask
+#endif
+#define int64_t __int64
+#endif
-/* Interix doesn't define these in a standard header. */
-#if __INTERIX__
-extern char *optarg;
-extern int optind;
+#if defined(HAVE__CrtSetReportMode)
+# include <crtdbg.h>
#endif
+#if defined(_WIN32) && !defined(__CYGWIN__)
+void *GetFunctionKernel32(const char *name)
+{
+ static HINSTANCE lib;
+ static int set;
+ if (!set) {
+ set = 1;
+ lib = LoadLibrary("kernel32.dll");
+ }
+ if (lib == NULL) {
+ fprintf(stderr, "Can't load kernel32.dll?!\n");
+ exit(1);
+ }
+ return (void *)GetProcAddress(lib, name);
+}
+
+static int
+my_CreateSymbolicLinkA(const char *linkname, const char *target, int flags)
+{
+ static BOOLEAN (WINAPI *f)(LPCSTR, LPCSTR, DWORD);
+ static int set;
+ if (!set) {
+ set = 1;
+ f = GetFunctionKernel32("CreateSymbolicLinkA");
+ }
+ return f == NULL ? 0 : (*f)(linkname, target, flags);
+}
+
+static int
+my_CreateHardLinkA(const char *linkname, const char *target)
+{
+ static BOOLEAN (WINAPI *f)(LPCSTR, LPCSTR, LPSECURITY_ATTRIBUTES);
+ static int set;
+ if (!set) {
+ set = 1;
+ f = GetFunctionKernel32("CreateHardLinkA");
+ }
+ return f == NULL ? 0 : (*f)(linkname, target, NULL);
+}
+
+int
+my_GetFileInformationByName(const char *path, BY_HANDLE_FILE_INFORMATION *bhfi)
+{
+ HANDLE h;
+ int r;
+
+ memset(bhfi, 0, sizeof(*bhfi));
+ h = CreateFile(path, FILE_READ_ATTRIBUTES, 0, NULL,
+ OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
+ if (h == INVALID_HANDLE_VALUE)
+ return (0);
+ r = GetFileInformationByHandle(h, bhfi);
+ CloseHandle(h);
+ return (r);
+}
+#endif
+
+#if defined(HAVE__CrtSetReportMode)
+static void
+invalid_parameter_handler(const wchar_t * expression,
+ const wchar_t * function, const wchar_t * file,
+ unsigned int line, uintptr_t pReserved)
+{
+ /* nop */
+}
+#endif
+
+/*
+ *
+ * OPTIONS FLAGS
+ *
+ */
+
/* Enable core dump on failure. */
static int dump_on_failure = 0;
-/* Default is to remove temp dirs for successful tests. */
+/* Default is to remove temp dirs and log data for successful tests. */
static int keep_temp_files = 0;
-/* Default is to print some basic information about each test. */
-static int quiet_flag = 0;
-/* Default is to summarize repeated failures. */
-static int verbose = 0;
-/* Cumulative count of component failures. */
+/* Default is to just report pass/fail for each test. */
+static int verbosity = 0;
+#define VERBOSITY_SUMMARY_ONLY -1 /* -q */
+#define VERBOSITY_PASSFAIL 0 /* Default */
+#define VERBOSITY_LIGHT_REPORT 1 /* -v */
+#define VERBOSITY_FULL 2 /* -vv */
+/* A few places generate even more output for verbosity > VERBOSITY_FULL,
+ * mostly for debugging the test harness itself. */
+/* Cumulative count of assertion failures. */
static int failures = 0;
-/* Cumulative count of skipped component tests. */
+/* Cumulative count of reported skips. */
static int skips = 0;
-/* Cumulative count of assertions. */
+/* Cumulative count of assertions checked. */
static int assertions = 0;
/* Directory where uuencoded reference files can be found. */
static const char *refdir;
/*
- * My own implementation of the standard assert() macro emits the
- * message in the same format as GCC (file:line: message).
- * It also includes some additional useful information.
- * This makes it a lot easier to skim through test failures in
- * Emacs. ;-)
- *
- * It also supports a few special features specifically to simplify
- * test harnesses:
- * failure(fmt, args) -- Stores a text string that gets
- * printed if the following assertion fails, good for
- * explaining subtle tests.
+ * Report log information selectively to console and/or disk log.
*/
-static char msg[4096];
-
-/*
- * For each test source file, we remember how many times each
- * failure was reported.
- */
-static const char *failed_filename = NULL;
-static struct line {
- int line;
- int count;
-} failed_lines[1000];
-
-/*
- * Count this failure; return the number of previous failures.
- */
-static int
-previous_failures(const char *filename, int line)
+static int log_console = 0;
+static FILE *logfile;
+static void
+vlogprintf(const char *fmt, va_list ap)
{
- unsigned int i;
- int count;
+#ifdef va_copy
+ va_list lfap;
+ va_copy(lfap, ap);
+#endif
+ if (log_console)
+ vfprintf(stdout, fmt, ap);
+ if (logfile != NULL)
+#ifdef va_copy
+ vfprintf(logfile, fmt, lfap);
+ va_end(lfap);
+#else
+ vfprintf(logfile, fmt, ap);
+#endif
+}
- if (failed_filename == NULL || strcmp(failed_filename, filename) != 0)
- memset(failed_lines, 0, sizeof(failed_lines));
- failed_filename = filename;
+static void
+logprintf(const char *fmt, ...)
+{
+ va_list ap;
+ va_start(ap, fmt);
+ vlogprintf(fmt, ap);
+ va_end(ap);
+}
- for (i = 0; i < sizeof(failed_lines)/sizeof(failed_lines[0]); i++) {
- if (failed_lines[i].line == line) {
- count = failed_lines[i].count;
- failed_lines[i].count++;
- return (count);
- }
- if (failed_lines[i].line == 0) {
- failed_lines[i].line = line;
- failed_lines[i].count = 1;
- return (0);
- }
- }
- return (0);
+/* Set up a message to display only if next assertion fails. */
+static char msgbuff[4096];
+static const char *msg, *nextmsg;
+void
+failure(const char *fmt, ...)
+{
+ va_list ap;
+ va_start(ap, fmt);
+ vsprintf(msgbuff, fmt, ap);
+ va_end(ap);
+ nextmsg = msgbuff;
}
/*
* Copy arguments into file-local variables.
+ * This was added to permit vararg assert() functions without needing
+ * variadic wrapper macros. Turns out that the vararg capability is almost
+ * never used, so almost all of the vararg assertions can be simplified
+ * by removing the vararg capability and reworking the wrapper macro to
+ * pass __FILE__, __LINE__ directly into the function instead of using
+ * this hook. I suspect this machinery is used so rarely that we
+ * would be better off just removing it entirely. That would simplify
+ * the code here noticably.
*/
static const char *test_filename;
static int test_line;
static void *test_extra;
-void test_setup(const char *filename, int line)
+void assertion_setup(const char *filename, int line)
{
test_filename = filename;
test_line = line;
}
+/* Called at the beginning of each assert() function. */
+static void
+assertion_count(const char *file, int line)
+{
+ (void)file; /* UNUSED */
+ (void)line; /* UNUSED */
+ ++assertions;
+ /* Proper handling of "failure()" message. */
+ msg = nextmsg;
+ nextmsg = NULL;
+ /* Uncomment to print file:line after every assertion.
+ * Verbose, but occasionally useful in tracking down crashes. */
+ /* printf("Checked %s:%d\n", file, line); */
+}
+
/*
- * Inform user that we're skipping a test.
+ * For each test source file, we remember how many times each
+ * assertion was reported. Cleared before each new test,
+ * used by test_summarize().
*/
-void
-test_skipping(const char *fmt, ...)
+static struct line {
+ int count;
+ int skip;
+} failed_lines[10000];
+
+/* Count this failure, setup up log destination and handle initial report. */
+static void
+failure_start(const char *filename, int line, const char *fmt, ...)
{
va_list ap;
- if (previous_failures(test_filename, test_line))
- return;
+ /* Record another failure for this line. */
+ ++failures;
+ /* test_filename = filename; */
+ failed_lines[line].count++;
+
+ /* Determine whether to log header to console. */
+ switch (verbosity) {
+ case VERBOSITY_FULL:
+ log_console = 1;
+ break;
+ case VERBOSITY_LIGHT_REPORT:
+ log_console = (failed_lines[line].count < 2);
+ break;
+ default:
+ log_console = 0;
+ }
+ /* Log file:line header for this failure */
va_start(ap, fmt);
- fprintf(stderr, " *** SKIPPING: ");
- vfprintf(stderr, fmt, ap);
- fprintf(stderr, "\n");
+#if _MSC_VER
+ logprintf("%s(%d): ", filename, line);
+#else
+ logprintf("%s:%d: ", filename, line);
+#endif
+ vlogprintf(fmt, ap);
va_end(ap);
- ++skips;
+ logprintf("\n");
+
+ if (msg != NULL && msg[0] != '\0') {
+ logprintf(" Description: %s\n", msg);
+ msg = NULL;
+ }
+
+ /* Determine whether to log details to console. */
+ if (verbosity == VERBOSITY_LIGHT_REPORT)
+ log_console = 0;
}
-/* Common handling of failed tests. */
+/* Complete reporting of failed tests. */
+/*
+ * The 'extra' hook here is used by libarchive to include libarchive
+ * error messages with assertion failures. It could also be used
+ * to add strerror() output, for example. Just define the EXTRA_DUMP()
+ * macro appropriately.
+ */
static void
-report_failure(void *extra)
+failure_finish(void *extra)
{
- if (msg[0] != '\0') {
- fprintf(stderr, " Description: %s\n", msg);
- msg[0] = '\0';
- }
-
+ (void)extra; /* UNUSED (maybe) */
#ifdef EXTRA_DUMP
if (extra != NULL)
- fprintf(stderr, " detail: %s\n", EXTRA_DUMP(extra));
-#else
- (void)extra; /* UNUSED */
+ logprintf(" detail: %s\n", EXTRA_DUMP(extra));
#endif
if (dump_on_failure) {
@@ -190,203 +356,170 @@ report_failure(void *extra)
}
}
-/*
- * Summarize repeated failures in the just-completed test file.
- * The reports above suppress multiple failures from the same source
- * line; this reports on any tests that did fail multiple times.
- */
-static int
-summarize_comparator(const void *a0, const void *b0)
-{
- const struct line *a = a0, *b = b0;
- if (a->line == 0 && b->line == 0)
- return (0);
- if (a->line == 0)
- return (1);
- if (b->line == 0)
- return (-1);
- return (a->line - b->line);
-}
-
-static void
-summarize(void)
-{
- unsigned int i;
-
- qsort(failed_lines, sizeof(failed_lines)/sizeof(failed_lines[0]),
- sizeof(failed_lines[0]), summarize_comparator);
- for (i = 0; i < sizeof(failed_lines)/sizeof(failed_lines[0]); i++) {
- if (failed_lines[i].line == 0)
- break;
- if (failed_lines[i].count > 1)
- fprintf(stderr, "%s:%d: Failed %d times\n",
- failed_filename, failed_lines[i].line,
- failed_lines[i].count);
- }
- /* Clear the failure history for the next file. */
- memset(failed_lines, 0, sizeof(failed_lines));
-}
-
-/* Set up a message to display only after a test fails. */
+/* Inform user that we're skipping some checks. */
void
-failure(const char *fmt, ...)
+test_skipping(const char *fmt, ...)
{
+ char buff[1024];
va_list ap;
+
va_start(ap, fmt);
- vsprintf(msg, fmt, ap);
+ vsprintf(buff, fmt, ap);
va_end(ap);
+ /* failure_start() isn't quite right, but is awfully convenient. */
+ failure_start(test_filename, test_line, "SKIPPING: %s", buff);
+ --failures; /* Undo failures++ in failure_start() */
+ /* Don't failure_finish() here. */
+ /* Mark as skip, so doesn't count as failed test. */
+ failed_lines[test_line].skip = 1;
+ ++skips;
}
+/*
+ *
+ * ASSERTIONS
+ *
+ */
+
/* Generic assert() just displays the failed condition. */
int
-test_assert(const char *file, int line, int value, const char *condition, void *extra)
+assertion_assert(const char *file, int line, int value,
+ const char *condition, void *extra)
{
- ++assertions;
- if (value) {
- msg[0] = '\0';
- return (value);
+ assertion_count(file, line);
+ if (!value) {
+ failure_start(file, line, "Assertion failed: %s", condition);
+ failure_finish(extra);
}
- failures ++;
- if (!verbose && previous_failures(file, line))
- return (value);
- fprintf(stderr, "%s:%d: Assertion failed\n", file, line);
- fprintf(stderr, " Condition: %s\n", condition);
- report_failure(extra);
return (value);
}
-/* assertEqualInt() displays the values of the two integers. */
+/* chdir() and report any errors */
int
-test_assert_equal_int(const char *file, int line,
- int v1, const char *e1, int v2, const char *e2, void *extra)
+assertion_chdir(const char *file, int line, const char *pathname)
{
- ++assertions;
- if (v1 == v2) {
- msg[0] = '\0';
+ assertion_count(file, line);
+ if (chdir(pathname) == 0)
return (1);
- }
- failures ++;
- if (!verbose && previous_failures(file, line))
- return (0);
- fprintf(stderr, "%s:%d: Assertion failed: Ints not equal\n",
- file, line);
- fprintf(stderr, " %s=%d\n", e1, v1);
- fprintf(stderr, " %s=%d\n", e2, v2);
- report_failure(extra);
+ failure_start(file, line, "chdir(\"%s\")", pathname);
+ failure_finish(NULL);
+ return (0);
+
+}
+
+/* Verify two integers are equal. */
+int
+assertion_equal_int(const char *file, int line,
+ long long v1, const char *e1, long long v2, const char *e2, void *extra)
+{
+ assertion_count(file, line);
+ if (v1 == v2)
+ return (1);
+ failure_start(file, line, "%s != %s", e1, e2);
+ logprintf(" %s=%lld (0x%llx, 0%llo)\n", e1, v1, v1, v1);
+ logprintf(" %s=%lld (0x%llx, 0%llo)\n", e2, v2, v2, v2);
+ failure_finish(extra);
return (0);
}
-static void strdump(const char *p)
+static void strdump(const char *e, const char *p)
{
+ const char *q = p;
+
+ logprintf(" %s = ", e);
if (p == NULL) {
- fprintf(stderr, "(null)");
+ logprintf("NULL");
return;
}
- fprintf(stderr, "\"");
+ logprintf("\"");
while (*p != '\0') {
unsigned int c = 0xff & *p++;
switch (c) {
- case '\a': fprintf(stderr, "\a"); break;
- case '\b': fprintf(stderr, "\b"); break;
- case '\n': fprintf(stderr, "\n"); break;
- case '\r': fprintf(stderr, "\r"); break;
+ case '\a': printf("\a"); break;
+ case '\b': printf("\b"); break;
+ case '\n': printf("\n"); break;
+ case '\r': printf("\r"); break;
default:
if (c >= 32 && c < 127)
- fprintf(stderr, "%c", c);
+ logprintf("%c", c);
else
- fprintf(stderr, "\\x%02X", c);
+ logprintf("\\x%02X", c);
}
}
- fprintf(stderr, "\"");
+ logprintf("\"");
+ logprintf(" (length %d)\n", q == NULL ? -1 : (int)strlen(q));
}
-/* assertEqualString() displays the values of the two strings. */
+/* Verify two strings are equal, dump them if not. */
int
-test_assert_equal_string(const char *file, int line,
+assertion_equal_string(const char *file, int line,
const char *v1, const char *e1,
const char *v2, const char *e2,
void *extra)
{
- ++assertions;
- if (v1 == NULL || v2 == NULL) {
- if (v1 == v2) {
- msg[0] = '\0';
- return (1);
- }
- } else if (strcmp(v1, v2) == 0) {
- msg[0] = '\0';
+ assertion_count(file, line);
+ if (v1 == v2 || (v1 != NULL && v2 != NULL && strcmp(v1, v2) == 0))
return (1);
- }
- failures ++;
- if (!verbose && previous_failures(file, line))
- return (0);
- fprintf(stderr, "%s:%d: Assertion failed: Strings not equal\n",
- file, line);
- fprintf(stderr, " %s = ", e1);
- strdump(v1);
- fprintf(stderr, " (length %d)\n", v1 == NULL ? 0 : (int)strlen(v1));
- fprintf(stderr, " %s = ", e2);
- strdump(v2);
- fprintf(stderr, " (length %d)\n", v2 == NULL ? 0 : (int)strlen(v2));
- report_failure(extra);
+ failure_start(file, line, "%s != %s", e1, e2);
+ strdump(e1, v1);
+ strdump(e2, v2);
+ failure_finish(extra);
return (0);
}
-static void wcsdump(const wchar_t *w)
+static void
+wcsdump(const char *e, const wchar_t *w)
{
+ logprintf(" %s = ", e);
if (w == NULL) {
- fprintf(stderr, "(null)");
+ logprintf("(null)");
return;
}
- fprintf(stderr, "\"");
+ logprintf("\"");
while (*w != L'\0') {
unsigned int c = *w++;
if (c >= 32 && c < 127)
- fprintf(stderr, "%c", c);
+ logprintf("%c", c);
else if (c < 256)
- fprintf(stderr, "\\x%02X", c);
+ logprintf("\\x%02X", c);
else if (c < 0x10000)
- fprintf(stderr, "\\u%04X", c);
+ logprintf("\\u%04X", c);
else
- fprintf(stderr, "\\U%08X", c);
+ logprintf("\\U%08X", c);
}
- fprintf(stderr, "\"");
+ logprintf("\"\n");
}
-/* assertEqualWString() displays the values of the two strings. */
+#ifndef HAVE_WCSCMP
+static int
+wcscmp(const wchar_t *s1, const wchar_t *s2)
+{
+
+ while (*s1 == *s2++) {
+ if (*s1++ == L'\0')
+ return 0;
+ }
+ if (*s1 > *--s2)
+ return 1;
+ else
+ return -1;
+}
+#endif
+
+/* Verify that two wide strings are equal, dump them if not. */
int
-test_assert_equal_wstring(const char *file, int line,
+assertion_equal_wstring(const char *file, int line,
const wchar_t *v1, const char *e1,
const wchar_t *v2, const char *e2,
void *extra)
{
- ++assertions;
- if (v1 == NULL) {
- if (v2 == NULL) {
- msg[0] = '\0';
- return (1);
- }
- } else if (v2 == NULL) {
- if (v1 == NULL) {
- msg[0] = '\0';
- return (1);
- }
- } else if (wcscmp(v1, v2) == 0) {
- msg[0] = '\0';
+ assertion_count(file, line);
+ if (v1 == v2 || wcscmp(v1, v2) == 0)
return (1);
- }
- failures ++;
- if (!verbose && previous_failures(file, line))
- return (0);
- fprintf(stderr, "%s:%d: Assertion failed: Unicode strings not equal\n",
- file, line);
- fprintf(stderr, " %s = ", e1);
- wcsdump(v1);
- fprintf(stderr, "\n");
- fprintf(stderr, " %s = ", e2);
- wcsdump(v2);
- fprintf(stderr, "\n");
- report_failure(extra);
+ failure_start(file, line, "%s != %s", e1, e2);
+ wcsdump(e1, v1);
+ wcsdump(e2, v2);
+ failure_finish(extra);
return (0);
}
@@ -401,277 +534,1051 @@ hexdump(const char *p, const char *ref, size_t l, size_t offset)
size_t i, j;
char sep;
+ if (p == NULL) {
+ logprintf("(null)\n");
+ return;
+ }
for(i=0; i < l; i+=16) {
- fprintf(stderr, "%04x", (int)(i + offset));
+ logprintf("%04x", (unsigned)(i + offset));
sep = ' ';
for (j = 0; j < 16 && i + j < l; j++) {
if (ref != NULL && p[i + j] != ref[i + j])
sep = '_';
- fprintf(stderr, "%c%02x", sep, 0xff & (int)p[i+j]);
+ logprintf("%c%02x", sep, 0xff & (int)p[i+j]);
if (ref != NULL && p[i + j] == ref[i + j])
sep = ' ';
}
for (; j < 16; j++) {
- fprintf(stderr, "%c ", sep);
+ logprintf("%c ", sep);
sep = ' ';
}
- fprintf(stderr, "%c", sep);
+ logprintf("%c", sep);
for (j=0; j < 16 && i + j < l; j++) {
int c = p[i + j];
if (c >= ' ' && c <= 126)
- fprintf(stderr, "%c", c);
+ logprintf("%c", c);
else
- fprintf(stderr, ".");
+ logprintf(".");
}
- fprintf(stderr, "\n");
+ logprintf("\n");
}
}
-/* assertEqualMem() displays the values of the two memory blocks. */
-/* TODO: For long blocks, hexdump the first bytes that actually differ. */
+/* Verify that two blocks of memory are the same, display the first
+ * block of differences if they're not. */
int
-test_assert_equal_mem(const char *file, int line,
- const char *v1, const char *e1,
- const char *v2, const char *e2,
+assertion_equal_mem(const char *file, int line,
+ const void *_v1, const char *e1,
+ const void *_v2, const char *e2,
size_t l, const char *ld, void *extra)
{
- ++assertions;
- if (v1 == NULL || v2 == NULL) {
- if (v1 == v2) {
- msg[0] = '\0';
- return (1);
- }
- } else if (memcmp(v1, v2, l) == 0) {
- msg[0] = '\0';
+ const char *v1 = (const char *)_v1;
+ const char *v2 = (const char *)_v2;
+ size_t offset;
+
+ assertion_count(file, line);
+ if (v1 == v2 || (v1 != NULL && v2 != NULL && memcmp(v1, v2, l) == 0))
return (1);
+
+ failure_start(file, line, "%s != %s", e1, e2);
+ logprintf(" size %s = %d\n", ld, (int)l);
+ /* Dump 48 bytes (3 lines) so that the first difference is
+ * in the second line. */
+ offset = 0;
+ while (l > 64 && memcmp(v1, v2, 32) == 0) {
+ /* Two lines agree, so step forward one line. */
+ v1 += 16;
+ v2 += 16;
+ l -= 16;
+ offset += 16;
}
- failures ++;
- if (!verbose && previous_failures(file, line))
- return (0);
- fprintf(stderr, "%s:%d: Assertion failed: memory not equal\n",
- file, line);
- fprintf(stderr, " size %s = %d\n", ld, (int)l);
- fprintf(stderr, " Dump of %s\n", e1);
- hexdump(v1, v2, l < 32 ? l : 32, 0);
- fprintf(stderr, " Dump of %s\n", e2);
- hexdump(v2, v1, l < 32 ? l : 32, 0);
- fprintf(stderr, "\n");
- report_failure(extra);
+ logprintf(" Dump of %s\n", e1);
+ hexdump(v1, v2, l < 64 ? l : 64, offset);
+ logprintf(" Dump of %s\n", e2);
+ hexdump(v2, v1, l < 64 ? l : 64, offset);
+ logprintf("\n");
+ failure_finish(extra);
return (0);
}
+/* Verify that the named file exists and is empty. */
int
-test_assert_empty_file(const char *f1fmt, ...)
+assertion_empty_file(const char *f1fmt, ...)
{
char buff[1024];
char f1[1024];
struct stat st;
va_list ap;
ssize_t s;
- int fd;
-
+ FILE *f;
+ assertion_count(test_filename, test_line);
va_start(ap, f1fmt);
vsprintf(f1, f1fmt, ap);
va_end(ap);
if (stat(f1, &st) != 0) {
- fprintf(stderr, "%s:%d: Could not stat: %s\n",
- test_filename, test_line, f1);
- failures ++;
- report_failure(NULL);
+ failure_start(test_filename, test_line, "Stat failed: %s", f1);
+ failure_finish(NULL);
return (0);
}
if (st.st_size == 0)
return (1);
- failures ++;
- if (!verbose && previous_failures(test_filename, test_line))
- return (0);
-
- fprintf(stderr, "%s:%d: File not empty: %s\n", test_filename, test_line, f1);
- fprintf(stderr, " File size: %d\n", (int)st.st_size);
- fprintf(stderr, " Contents:\n");
- fd = open(f1, O_RDONLY);
- if (fd < 0) {
- fprintf(stderr, " Unable to open %s\n", f1);
+ failure_start(test_filename, test_line, "File should be empty: %s", f1);
+ logprintf(" File size: %d\n", (int)st.st_size);
+ logprintf(" Contents:\n");
+ f = fopen(f1, "rb");
+ if (f == NULL) {
+ logprintf(" Unable to open %s\n", f1);
} else {
s = ((off_t)sizeof(buff) < st.st_size) ?
(ssize_t)sizeof(buff) : (ssize_t)st.st_size;
- s = read(fd, buff, s);
+ s = fread(buff, 1, s, f);
hexdump(buff, NULL, s, 0);
- close(fd);
+ fclose(f);
}
- report_failure(NULL);
+ failure_finish(NULL);
return (0);
}
+/* Verify that the named file exists and is not empty. */
int
-test_assert_non_empty_file(const char *f1fmt, ...)
+assertion_non_empty_file(const char *f1fmt, ...)
{
char f1[1024];
struct stat st;
va_list ap;
-
+ assertion_count(test_filename, test_line);
va_start(ap, f1fmt);
vsprintf(f1, f1fmt, ap);
va_end(ap);
if (stat(f1, &st) != 0) {
- fprintf(stderr, "%s:%d: Could not stat: %s\n",
- test_filename, test_line, f1);
- report_failure(NULL);
- failures++;
+ failure_start(test_filename, test_line, "Stat failed: %s", f1);
+ failure_finish(NULL);
return (0);
}
- if (st.st_size != 0)
- return (1);
-
- failures ++;
- if (!verbose && previous_failures(test_filename, test_line))
+ if (st.st_size == 0) {
+ failure_start(test_filename, test_line, "File empty: %s", f1);
+ failure_finish(NULL);
return (0);
-
- fprintf(stderr, "%s:%d: File empty: %s\n",
- test_filename, test_line, f1);
- report_failure(NULL);
- return (0);
+ }
+ return (1);
}
-/* assertEqualFile() asserts that two files have the same contents. */
+/* Verify that two files have the same contents. */
/* TODO: hexdump the first bytes that actually differ. */
int
-test_assert_equal_file(const char *f1, const char *f2pattern, ...)
+assertion_equal_file(const char *fn1, const char *f2pattern, ...)
{
- char f2[1024];
+ char fn2[1024];
va_list ap;
char buff1[1024];
char buff2[1024];
- int fd1, fd2;
+ FILE *f1, *f2;
int n1, n2;
+ assertion_count(test_filename, test_line);
va_start(ap, f2pattern);
- vsprintf(f2, f2pattern, ap);
+ vsprintf(fn2, f2pattern, ap);
va_end(ap);
- fd1 = open(f1, O_RDONLY);
- fd2 = open(f2, O_RDONLY);
+ f1 = fopen(fn1, "rb");
+ f2 = fopen(fn2, "rb");
for (;;) {
- n1 = read(fd1, buff1, sizeof(buff1));
- n2 = read(fd2, buff2, sizeof(buff2));
+ n1 = fread(buff1, 1, sizeof(buff1), f1);
+ n2 = fread(buff2, 1, sizeof(buff2), f2);
if (n1 != n2)
break;
if (n1 == 0 && n2 == 0) {
- close(fd1);
- close(fd2);
+ fclose(f1);
+ fclose(f2);
return (1);
}
if (memcmp(buff1, buff2, n1) != 0)
break;
}
- close(fd1);
- close(fd2);
- failures ++;
- if (!verbose && previous_failures(test_filename, test_line))
- return (0);
- fprintf(stderr, "%s:%d: Files are not identical\n",
- test_filename, test_line);
- fprintf(stderr, " file1=\"%s\"\n", f1);
- fprintf(stderr, " file2=\"%s\"\n", f2);
- report_failure(test_extra);
+ fclose(f1);
+ fclose(f2);
+ failure_start(test_filename, test_line, "Files not identical");
+ logprintf(" file1=\"%s\"\n", fn1);
+ logprintf(" file2=\"%s\"\n", fn2);
+ failure_finish(test_extra);
return (0);
}
+/* Verify that the named file does exist. */
int
-test_assert_file_exists(const char *fpattern, ...)
+assertion_file_exists(const char *fpattern, ...)
{
char f[1024];
va_list ap;
+ assertion_count(test_filename, test_line);
va_start(ap, fpattern);
vsprintf(f, fpattern, ap);
va_end(ap);
+#if defined(_WIN32) && !defined(__CYGWIN__)
+ if (!_access(f, 0))
+ return (1);
+#else
if (!access(f, F_OK))
return (1);
- if (!previous_failures(test_filename, test_line)) {
- fprintf(stderr, "%s:%d: File doesn't exist\n",
- test_filename, test_line);
- fprintf(stderr, " file=\"%s\"\n", f);
- report_failure(test_extra);
- }
+#endif
+ failure_start(test_filename, test_line, "File should exist: %s", f);
+ failure_finish(test_extra);
return (0);
}
+/* Verify that the named file doesn't exist. */
int
-test_assert_file_not_exists(const char *fpattern, ...)
+assertion_file_not_exists(const char *fpattern, ...)
{
char f[1024];
va_list ap;
+ assertion_count(test_filename, test_line);
va_start(ap, fpattern);
vsprintf(f, fpattern, ap);
va_end(ap);
+#if defined(_WIN32) && !defined(__CYGWIN__)
+ if (_access(f, 0))
+ return (1);
+#else
if (access(f, F_OK))
return (1);
- if (!previous_failures(test_filename, test_line)) {
- fprintf(stderr, "%s:%d: File exists and shouldn't\n",
- test_filename, test_line);
- fprintf(stderr, " file=\"%s\"\n", f);
- report_failure(test_extra);
- }
+#endif
+ failure_start(test_filename, test_line, "File should not exist: %s", f);
+ failure_finish(test_extra);
return (0);
}
-/* assertFileContents() asserts the contents of a file. */
+/* Compare the contents of a file to a block of memory. */
int
-test_assert_file_contents(const void *buff, int s, const char *fpattern, ...)
+assertion_file_contents(const void *buff, int s, const char *fpattern, ...)
{
- char f[1024];
+ char fn[1024];
va_list ap;
char *contents;
- int fd;
+ FILE *f;
int n;
+ assertion_count(test_filename, test_line);
va_start(ap, fpattern);
- vsprintf(f, fpattern, ap);
+ vsprintf(fn, fpattern, ap);
va_end(ap);
- fd = open(f, O_RDONLY);
- if (fd < 0) {
- failures ++;
- if (!previous_failures(test_filename, test_line)) {
- fprintf(stderr, "%s:%d: File doesn't exist: %s\n",
- test_filename, test_line, f);
- report_failure(test_extra);
- }
+ f = fopen(fn, "rb");
+ if (f == NULL) {
+ failure_start(test_filename, test_line,
+ "File should exist: %s", fn);
+ failure_finish(test_extra);
return (0);
}
contents = malloc(s * 2);
- n = read(fd, contents, s * 2);
- close(fd);
+ n = fread(contents, 1, s * 2, f);
+ fclose(f);
if (n == s && memcmp(buff, contents, s) == 0) {
free(contents);
return (1);
}
- failures ++;
- if (!previous_failures(test_filename, test_line)) {
- fprintf(stderr, "%s:%d: File contents don't match\n",
- test_filename, test_line);
- fprintf(stderr, " file=\"%s\"\n", f);
- if (n > 0)
- hexdump(contents, buff, n, 0);
- else {
- fprintf(stderr, " File empty, contents should be:\n");
- hexdump(buff, NULL, s, 0);
+ failure_start(test_filename, test_line, "File contents don't match");
+ logprintf(" file=\"%s\"\n", fn);
+ if (n > 0)
+ hexdump(contents, buff, n > 512 ? 512 : n, 0);
+ else {
+ logprintf(" File empty, contents should be:\n");
+ hexdump(buff, NULL, s > 512 ? 512 : s, 0);
+ }
+ failure_finish(test_extra);
+ free(contents);
+ return (0);
+}
+
+/* Check the contents of a text file, being tolerant of line endings. */
+int
+assertion_text_file_contents(const char *buff, const char *fn)
+{
+ char *contents;
+ const char *btxt, *ftxt;
+ FILE *f;
+ int n, s;
+
+ assertion_count(test_filename, test_line);
+ f = fopen(fn, "r");
+ s = strlen(buff);
+ contents = malloc(s * 2 + 128);
+ n = fread(contents, 1, s * 2 + 128 - 1, f);
+ if (n >= 0)
+ contents[n] = '\0';
+ fclose(f);
+ /* Compare texts. */
+ btxt = buff;
+ ftxt = (const char *)contents;
+ while (*btxt != '\0' && *ftxt != '\0') {
+ if (*btxt == *ftxt) {
+ ++btxt;
+ ++ftxt;
+ continue;
}
- report_failure(test_extra);
+ if (btxt[0] == '\n' && ftxt[0] == '\r' && ftxt[1] == '\n') {
+ /* Pass over different new line characters. */
+ ++btxt;
+ ftxt += 2;
+ continue;
+ }
+ break;
+ }
+ if (*btxt == '\0' && *ftxt == '\0') {
+ free(contents);
+ return (1);
+ }
+ failure_start(test_filename, test_line, "Contents don't match");
+ logprintf(" file=\"%s\"\n", fn);
+ if (n > 0)
+ hexdump(contents, buff, n, 0);
+ else {
+ logprintf(" File empty, contents should be:\n");
+ hexdump(buff, NULL, s, 0);
}
+ failure_finish(test_extra);
free(contents);
return (0);
}
+/* Verify that a text file contains the specified lines, regardless of order */
+/* This could be more efficient if we sorted both sets of lines, etc, but
+ * since this is used only for testing and only ever deals with a dozen or so
+ * lines at a time, this relatively crude approach is just fine. */
+int
+assertion_file_contains_lines_any_order(const char *file, int line,
+ const char *pathname, const char *lines[])
+{
+ char *buff;
+ size_t buff_size;
+ size_t expected_count, actual_count, i, j;
+ char **expected;
+ char *p, **actual;
+ char c;
+ int expected_failure = 0, actual_failure = 0;
+
+ assertion_count(file, line);
+
+ buff = slurpfile(&buff_size, "%s", pathname);
+ if (buff == NULL) {
+ failure_start(pathname, line, "Can't read file: %s", pathname);
+ failure_finish(NULL);
+ return (0);
+ }
+
+ // Make a copy of the provided lines and count up the expected file size.
+ expected_count = 0;
+ for (i = 0; lines[i] != NULL; ++i) {
+ }
+ expected_count = i;
+ expected = malloc(sizeof(char *) * expected_count);
+ for (i = 0; lines[i] != NULL; ++i) {
+ expected[i] = strdup(lines[i]);
+ }
+
+ // Break the file into lines
+ actual_count = 0;
+ for (c = '\0', p = buff; p < buff + buff_size; ++p) {
+ if (*p == '\x0d' || *p == '\x0a')
+ *p = '\0';
+ if (c == '\0' && *p != '\0')
+ ++actual_count;
+ c = *p;
+ }
+ actual = malloc(sizeof(char *) * actual_count);
+ for (j = 0, p = buff; p < buff + buff_size; p += 1 + strlen(p)) {
+ if (*p != '\0') {
+ actual[j] = p;
+ ++j;
+ }
+ }
+
+ // Erase matching lines from both lists
+ for (i = 0; i < expected_count; ++i) {
+ if (expected[i] == NULL)
+ continue;
+ for (j = 0; j < actual_count; ++j) {
+ if (actual[j] == NULL)
+ continue;
+ if (strcmp(expected[i], actual[j]) == 0) {
+ free(expected[i]);
+ expected[i] = NULL;
+ actual[j] = NULL;
+ break;
+ }
+ }
+ }
+
+ // If there's anything left, it's a failure
+ for (i = 0; i < expected_count; ++i) {
+ if (expected[i] != NULL)
+ ++expected_failure;
+ }
+ for (j = 0; j < actual_count; ++j) {
+ if (actual[j] != NULL)
+ ++actual_failure;
+ }
+ if (expected_failure == 0 && actual_failure == 0) {
+ free(buff);
+ free(expected);
+ free(actual);
+ return (1);
+ }
+ failure_start(file, line, "File doesn't match: %s", pathname);
+ for (i = 0; i < expected_count; ++i) {
+ if (expected[i] != NULL) {
+ logprintf(" Expected but not present: %s\n", expected[i]);
+ free(expected[i]);
+ }
+ }
+ for (j = 0; j < actual_count; ++j) {
+ if (actual[j] != NULL)
+ logprintf(" Present but not expected: %s\n", actual[j]);
+ }
+ failure_finish(NULL);
+ free(buff);
+ free(expected);
+ free(actual);
+ return (0);
+}
+
+/* Test that two paths point to the same file. */
+/* As a side-effect, asserts that both files exist. */
+static int
+is_hardlink(const char *file, int line,
+ const char *path1, const char *path2)
+{
+#if defined(_WIN32) && !defined(__CYGWIN__)
+ BY_HANDLE_FILE_INFORMATION bhfi1, bhfi2;
+ int r;
+
+ assertion_count(file, line);
+ r = my_GetFileInformationByName(path1, &bhfi1);
+ if (r == 0) {
+ failure_start(file, line, "File %s can't be inspected?", path1);
+ failure_finish(NULL);
+ return (0);
+ }
+ r = my_GetFileInformationByName(path2, &bhfi2);
+ if (r == 0) {
+ failure_start(file, line, "File %s can't be inspected?", path2);
+ failure_finish(NULL);
+ return (0);
+ }
+ return (bhfi1.dwVolumeSerialNumber == bhfi2.dwVolumeSerialNumber
+ && bhfi1.nFileIndexHigh == bhfi2.nFileIndexHigh
+ && bhfi1.nFileIndexLow == bhfi2.nFileIndexLow);
+#else
+ struct stat st1, st2;
+ int r;
+
+ assertion_count(file, line);
+ r = lstat(path1, &st1);
+ if (r != 0) {
+ failure_start(file, line, "File should exist: %s", path1);
+ failure_finish(NULL);
+ return (0);
+ }
+ r = lstat(path2, &st2);
+ if (r != 0) {
+ failure_start(file, line, "File should exist: %s", path2);
+ failure_finish(NULL);
+ return (0);
+ }
+ return (st1.st_ino == st2.st_ino && st1.st_dev == st2.st_dev);
+#endif
+}
+
+int
+assertion_is_hardlink(const char *file, int line,
+ const char *path1, const char *path2)
+{
+ if (is_hardlink(file, line, path1, path2))
+ return (1);
+ failure_start(file, line,
+ "Files %s and %s are not hardlinked", path1, path2);
+ failure_finish(NULL);
+ return (0);
+}
+
+int
+assertion_is_not_hardlink(const char *file, int line,
+ const char *path1, const char *path2)
+{
+ if (!is_hardlink(file, line, path1, path2))
+ return (1);
+ failure_start(file, line,
+ "Files %s and %s should not be hardlinked", path1, path2);
+ failure_finish(NULL);
+ return (0);
+}
+
+/* Verify a/b/mtime of 'pathname'. */
+/* If 'recent', verify that it's within last 10 seconds. */
+static int
+assertion_file_time(const char *file, int line,
+ const char *pathname, long t, long nsec, char type, int recent)
+{
+ long long filet, filet_nsec;
+ int r;
+
+#if defined(_WIN32) && !defined(__CYGWIN__)
+#define EPOC_TIME (116444736000000000ULL)
+ FILETIME ftime, fbirthtime, fatime, fmtime;
+ ULARGE_INTEGER wintm;
+ HANDLE h;
+ ftime.dwLowDateTime = 0;
+ ftime.dwHighDateTime = 0;
+
+ assertion_count(file, line);
+ h = CreateFile(pathname, FILE_READ_ATTRIBUTES, 0, NULL,
+ OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
+ if (h == INVALID_HANDLE_VALUE) {
+ failure_start(file, line, "Can't access %s\n", pathname);
+ failure_finish(NULL);
+ return (0);
+ }
+ r = GetFileTime(h, &fbirthtime, &fatime, &fmtime);
+ switch (type) {
+ case 'a': ftime = fatime; break;
+ case 'b': ftime = fbirthtime; break;
+ case 'm': ftime = fmtime; break;
+ }
+ CloseHandle(h);
+ if (r == 0) {
+ failure_start(file, line, "Can't GetFileTime %s\n", pathname);
+ failure_finish(NULL);
+ return (0);
+ }
+ wintm.LowPart = ftime.dwLowDateTime;
+ wintm.HighPart = ftime.dwHighDateTime;
+ filet = (wintm.QuadPart - EPOC_TIME) / 10000000;
+ filet_nsec = ((wintm.QuadPart - EPOC_TIME) % 10000000) * 100;
+ nsec = (nsec / 100) * 100; /* Round the request */
+#else
+ struct stat st;
+
+ assertion_count(file, line);
+ r = lstat(pathname, &st);
+ if (r != 0) {
+ failure_start(file, line, "Can't stat %s\n", pathname);
+ failure_finish(NULL);
+ return (0);
+ }
+ switch (type) {
+ case 'a': filet = st.st_atime; break;
+ case 'm': filet = st.st_mtime; break;
+ case 'b': filet = 0; break;
+ default: fprintf(stderr, "INTERNAL: Bad type %c for file time", type);
+ exit(1);
+ }
+#if defined(__FreeBSD__)
+ switch (type) {
+ case 'a': filet_nsec = st.st_atimespec.tv_nsec; break;
+ case 'b': filet = st.st_birthtime;
+ filet_nsec = st.st_birthtimespec.tv_nsec; break;
+ case 'm': filet_nsec = st.st_mtimespec.tv_nsec; break;
+ default: fprintf(stderr, "INTERNAL: Bad type %c for file time", type);
+ exit(1);
+ }
+ /* FreeBSD generally only stores to microsecond res, so round. */
+ filet_nsec = (filet_nsec / 1000) * 1000;
+ nsec = (nsec / 1000) * 1000;
+#else
+ filet_nsec = nsec = 0; /* Generic POSIX only has whole seconds. */
+ if (type == 'b') return (1); /* Generic POSIX doesn't have birthtime */
+#if defined(__HAIKU__)
+ if (type == 'a') return (1); /* Haiku doesn't have atime. */
+#endif
+#endif
+#endif
+ if (recent) {
+ /* Check that requested time is up-to-date. */
+ time_t now = time(NULL);
+ if (filet < now - 10 || filet > now + 1) {
+ failure_start(file, line,
+ "File %s has %ctime %ld, %ld seconds ago\n",
+ pathname, type, filet, now - filet);
+ failure_finish(NULL);
+ return (0);
+ }
+ } else if (filet != t || filet_nsec != nsec) {
+ failure_start(file, line,
+ "File %s has %ctime %ld.%09ld, expected %ld.%09ld",
+ pathname, type, filet, filet_nsec, t, nsec);
+ failure_finish(NULL);
+ return (0);
+ }
+ return (1);
+}
+
+/* Verify atime of 'pathname'. */
+int
+assertion_file_atime(const char *file, int line,
+ const char *pathname, long t, long nsec)
+{
+ return assertion_file_time(file, line, pathname, t, nsec, 'a', 0);
+}
+
+/* Verify atime of 'pathname' is up-to-date. */
+int
+assertion_file_atime_recent(const char *file, int line, const char *pathname)
+{
+ return assertion_file_time(file, line, pathname, 0, 0, 'a', 1);
+}
+
+/* Verify birthtime of 'pathname'. */
+int
+assertion_file_birthtime(const char *file, int line,
+ const char *pathname, long t, long nsec)
+{
+ return assertion_file_time(file, line, pathname, t, nsec, 'b', 0);
+}
+
+/* Verify birthtime of 'pathname' is up-to-date. */
+int
+assertion_file_birthtime_recent(const char *file, int line,
+ const char *pathname)
+{
+ return assertion_file_time(file, line, pathname, 0, 0, 'b', 1);
+}
+
+/* Verify mtime of 'pathname'. */
+int
+assertion_file_mtime(const char *file, int line,
+ const char *pathname, long t, long nsec)
+{
+ return assertion_file_time(file, line, pathname, t, nsec, 'm', 0);
+}
+
+/* Verify mtime of 'pathname' is up-to-date. */
+int
+assertion_file_mtime_recent(const char *file, int line, const char *pathname)
+{
+ return assertion_file_time(file, line, pathname, 0, 0, 'm', 1);
+}
+
+/* Verify number of links to 'pathname'. */
+int
+assertion_file_nlinks(const char *file, int line,
+ const char *pathname, int nlinks)
+{
+#if defined(_WIN32) && !defined(__CYGWIN__)
+ BY_HANDLE_FILE_INFORMATION bhfi;
+ int r;
+
+ assertion_count(file, line);
+ r = my_GetFileInformationByName(pathname, &bhfi);
+ if (r != 0 && bhfi.nNumberOfLinks == (DWORD)nlinks)
+ return (1);
+ failure_start(file, line, "File %s has %d links, expected %d",
+ pathname, bhfi.nNumberOfLinks, nlinks);
+ failure_finish(NULL);
+ return (0);
+#else
+ struct stat st;
+ int r;
+
+ assertion_count(file, line);
+ r = lstat(pathname, &st);
+ if (r == 0 && st.st_nlink == nlinks)
+ return (1);
+ failure_start(file, line, "File %s has %d links, expected %d",
+ pathname, st.st_nlink, nlinks);
+ failure_finish(NULL);
+ return (0);
+#endif
+}
+
+/* Verify size of 'pathname'. */
+int
+assertion_file_size(const char *file, int line, const char *pathname, long size)
+{
+ int64_t filesize;
+ int r;
+
+ assertion_count(file, line);
+#if defined(_WIN32) && !defined(__CYGWIN__)
+ {
+ BY_HANDLE_FILE_INFORMATION bhfi;
+ r = !my_GetFileInformationByName(pathname, &bhfi);
+ filesize = ((int64_t)bhfi.nFileSizeHigh << 32) + bhfi.nFileSizeLow;
+ }
+#else
+ {
+ struct stat st;
+ r = lstat(pathname, &st);
+ filesize = st.st_size;
+ }
+#endif
+ if (r == 0 && filesize == size)
+ return (1);
+ failure_start(file, line, "File %s has size %ld, expected %ld",
+ pathname, (long)filesize, (long)size);
+ failure_finish(NULL);
+ return (0);
+}
+
+/* Assert that 'pathname' is a dir. If mode >= 0, verify that too. */
+int
+assertion_is_dir(const char *file, int line, const char *pathname, int mode)
+{
+ struct stat st;
+ int r;
+
+#if defined(_WIN32) && !defined(__CYGWIN__)
+ (void)mode; /* UNUSED */
+#endif
+ assertion_count(file, line);
+ r = lstat(pathname, &st);
+ if (r != 0) {
+ failure_start(file, line, "Dir should exist: %s", pathname);
+ failure_finish(NULL);
+ return (0);
+ }
+ if (!S_ISDIR(st.st_mode)) {
+ failure_start(file, line, "%s is not a dir", pathname);
+ failure_finish(NULL);
+ return (0);
+ }
+#if !defined(_WIN32) || defined(__CYGWIN__)
+ /* Windows doesn't handle permissions the same way as POSIX,
+ * so just ignore the mode tests. */
+ /* TODO: Can we do better here? */
+ if (mode >= 0 && mode != (st.st_mode & 07777)) {
+ failure_start(file, line, "Dir %s has wrong mode", pathname);
+ logprintf(" Expected: 0%3o\n", mode);
+ logprintf(" Found: 0%3o\n", st.st_mode & 07777);
+ failure_finish(NULL);
+ return (0);
+ }
+#endif
+ return (1);
+}
+
+/* Verify that 'pathname' is a regular file. If 'mode' is >= 0,
+ * verify that too. */
+int
+assertion_is_reg(const char *file, int line, const char *pathname, int mode)
+{
+ struct stat st;
+ int r;
+
+#if defined(_WIN32) && !defined(__CYGWIN__)
+ (void)mode; /* UNUSED */
+#endif
+ assertion_count(file, line);
+ r = lstat(pathname, &st);
+ if (r != 0 || !S_ISREG(st.st_mode)) {
+ failure_start(file, line, "File should exist: %s", pathname);
+ failure_finish(NULL);
+ return (0);
+ }
+#if !defined(_WIN32) || defined(__CYGWIN__)
+ /* Windows doesn't handle permissions the same way as POSIX,
+ * so just ignore the mode tests. */
+ /* TODO: Can we do better here? */
+ if (mode >= 0 && mode != (st.st_mode & 07777)) {
+ failure_start(file, line, "File %s has wrong mode", pathname);
+ logprintf(" Expected: 0%3o\n", mode);
+ logprintf(" Found: 0%3o\n", st.st_mode & 07777);
+ failure_finish(NULL);
+ return (0);
+ }
+#endif
+ return (1);
+}
+
+/* Check whether 'pathname' is a symbolic link. If 'contents' is
+ * non-NULL, verify that the symlink has those contents. */
+static int
+is_symlink(const char *file, int line,
+ const char *pathname, const char *contents)
+{
+#if defined(_WIN32) && !defined(__CYGWIN__)
+ (void)pathname; /* UNUSED */
+ (void)contents; /* UNUSED */
+ assertion_count(file, line);
+ /* Windows sort-of has real symlinks, but they're only usable
+ * by privileged users and are crippled even then, so there's
+ * really not much point in bothering with this. */
+ return (0);
+#else
+ char buff[300];
+ struct stat st;
+ ssize_t linklen;
+ int r;
+
+ assertion_count(file, line);
+ r = lstat(pathname, &st);
+ if (r != 0) {
+ failure_start(file, line,
+ "Symlink should exist: %s", pathname);
+ failure_finish(NULL);
+ return (0);
+ }
+ if (!S_ISLNK(st.st_mode))
+ return (0);
+ if (contents == NULL)
+ return (1);
+ linklen = readlink(pathname, buff, sizeof(buff));
+ if (linklen < 0) {
+ failure_start(file, line, "Can't read symlink %s", pathname);
+ failure_finish(NULL);
+ return (0);
+ }
+ buff[linklen] = '\0';
+ if (strcmp(buff, contents) != 0)
+ return (0);
+ return (1);
+#endif
+}
+
+/* Assert that path is a symlink that (optionally) contains contents. */
+int
+assertion_is_symlink(const char *file, int line,
+ const char *path, const char *contents)
+{
+ if (is_symlink(file, line, path, contents))
+ return (1);
+ if (contents)
+ failure_start(file, line, "File %s is not a symlink to %s",
+ path, contents);
+ else
+ failure_start(file, line, "File %s is not a symlink", path);
+ failure_finish(NULL);
+ return (0);
+}
+
+
+/* Create a directory and report any errors. */
+int
+assertion_make_dir(const char *file, int line, const char *dirname, int mode)
+{
+ assertion_count(file, line);
+#if defined(_WIN32) && !defined(__CYGWIN__)
+ (void)mode; /* UNUSED */
+ if (0 == _mkdir(dirname))
+ return (1);
+#else
+ if (0 == mkdir(dirname, mode))
+ return (1);
+#endif
+ failure_start(file, line, "Could not create directory %s", dirname);
+ failure_finish(NULL);
+ return(0);
+}
+
+/* Create a file with the specified contents and report any failures. */
+int
+assertion_make_file(const char *file, int line,
+ const char *path, int mode, const char *contents)
+{
+#if defined(_WIN32) && !defined(__CYGWIN__)
+ /* TODO: Rework this to set file mode as well. */
+ FILE *f;
+ (void)mode; /* UNUSED */
+ assertion_count(file, line);
+ f = fopen(path, "wb");
+ if (f == NULL) {
+ failure_start(file, line, "Could not create file %s", path);
+ failure_finish(NULL);
+ return (0);
+ }
+ if (contents != NULL) {
+ if (strlen(contents)
+ != fwrite(contents, 1, strlen(contents), f)) {
+ fclose(f);
+ failure_start(file, line,
+ "Could not write file %s", path);
+ failure_finish(NULL);
+ return (0);
+ }
+ }
+ fclose(f);
+ return (1);
+#else
+ int fd;
+ assertion_count(file, line);
+ fd = open(path, O_CREAT | O_WRONLY, mode >= 0 ? mode : 0644);
+ if (fd < 0) {
+ failure_start(file, line, "Could not create %s", path);
+ failure_finish(NULL);
+ return (0);
+ }
+ if (contents != NULL) {
+ if ((ssize_t)strlen(contents)
+ != write(fd, contents, strlen(contents))) {
+ close(fd);
+ failure_start(file, line, "Could not write to %s", path);
+ failure_finish(NULL);
+ return (0);
+ }
+ }
+ close(fd);
+ return (1);
+#endif
+}
+
+/* Create a hardlink and report any failures. */
+int
+assertion_make_hardlink(const char *file, int line,
+ const char *newpath, const char *linkto)
+{
+ int succeeded;
+
+ assertion_count(file, line);
+#if defined(_WIN32) && !defined(__CYGWIN__)
+ succeeded = my_CreateHardLinkA(newpath, linkto);
+#elif HAVE_LINK
+ succeeded = !link(linkto, newpath);
+#else
+ succeeded = 0;
+#endif
+ if (succeeded)
+ return (1);
+ failure_start(file, line, "Could not create hardlink");
+ logprintf(" New link: %s\n", newpath);
+ logprintf(" Old name: %s\n", linkto);
+ failure_finish(NULL);
+ return(0);
+}
+
+/* Create a symlink and report any failures. */
+int
+assertion_make_symlink(const char *file, int line,
+ const char *newpath, const char *linkto)
+{
+#if defined(_WIN32) && !defined(__CYGWIN__)
+ int targetIsDir = 0; /* TODO: Fix this */
+ assertion_count(file, line);
+ if (my_CreateSymbolicLinkA(newpath, linkto, targetIsDir))
+ return (1);
+#elif HAVE_SYMLINK
+ assertion_count(file, line);
+ if (0 == symlink(linkto, newpath))
+ return (1);
+#endif
+ failure_start(file, line, "Could not create symlink");
+ logprintf(" New link: %s\n", newpath);
+ logprintf(" Old name: %s\n", linkto);
+ failure_finish(NULL);
+ return(0);
+}
+
+/* Set umask, report failures. */
+int
+assertion_umask(const char *file, int line, int mask)
+{
+ assertion_count(file, line);
+ (void)file; /* UNUSED */
+ (void)line; /* UNUSED */
+ umask(mask);
+ return (1);
+}
+
+/*
+ *
+ * UTILITIES for use by tests.
+ *
+ */
+
+/*
+ * Check whether platform supports symlinks. This is intended
+ * for tests to use in deciding whether to bother testing symlink
+ * support; if the platform doesn't support symlinks, there's no point
+ * in checking whether the program being tested can create them.
+ *
+ * Note that the first time this test is called, we actually go out to
+ * disk to create and verify a symlink. This is necessary because
+ * symlink support is actually a property of a particular filesystem
+ * and can thus vary between directories on a single system. After
+ * the first call, this returns the cached result from memory, so it's
+ * safe to call it as often as you wish.
+ */
+int
+canSymlink(void)
+{
+ /* Remember the test result */
+ static int value = 0, tested = 0;
+ if (tested)
+ return (value);
+
+ ++tested;
+ assertion_make_file(__FILE__, __LINE__, "canSymlink.0", 0644, "a");
+ /* Note: Cygwin has its own symlink() emulation that does not
+ * use the Win32 CreateSymbolicLink() function. */
+#if defined(_WIN32) && !defined(__CYGWIN__)
+ value = my_CreateSymbolicLinkA("canSymlink.1", "canSymlink.0", 0)
+ && is_symlink(__FILE__, __LINE__, "canSymlink.1", "canSymlink.0");
+#elif HAVE_SYMLINK
+ value = (0 == symlink("canSymlink.0", "canSymlink.1"))
+ && is_symlink(__FILE__, __LINE__, "canSymlink.1","canSymlink.0");
+#endif
+ return (value);
+}
+
+/*
+ * Can this platform run the gzip program?
+ */
+/* Platform-dependent options for hiding the output of a subcommand. */
+#if defined(_WIN32) && !defined(__CYGWIN__)
+static const char *redirectArgs = ">NUL 2>NUL"; /* Win32 cmd.exe */
+#else
+static const char *redirectArgs = ">/dev/null 2>/dev/null"; /* POSIX 'sh' */
+#endif
+int
+canGzip(void)
+{
+ static int tested = 0, value = 0;
+ if (!tested) {
+ tested = 1;
+ if (systemf("gzip -V %s", redirectArgs) == 0)
+ value = 1;
+ }
+ return (value);
+}
+
+/*
+ * Can this platform run the gunzip program?
+ */
+int
+canGunzip(void)
+{
+ static int tested = 0, value = 0;
+ if (!tested) {
+ tested = 1;
+ if (systemf("gunzip -V %s", redirectArgs) == 0)
+ value = 1;
+ }
+ return (value);
+}
+
+/*
+ * Sleep as needed; useful for verifying disk timestamp changes by
+ * ensuring that the wall-clock time has actually changed before we
+ * go back to re-read something from disk.
+ */
+void
+sleepUntilAfter(time_t t)
+{
+ while (t >= time(NULL))
+#if defined(_WIN32) && !defined(__CYGWIN__)
+ Sleep(500);
+#else
+ sleep(1);
+#endif
+}
+
/*
* Call standard system() call, but build up the command line using
* sprintf() conventions.
@@ -685,6 +1592,8 @@ systemf(const char *fmt, ...)
va_start(ap, fmt);
vsprintf(buff, fmt, ap);
+ if (verbosity > VERBOSITY_FULL)
+ logprintf("Cmd: %s\n", buff);
r = system(buff);
va_end(ap);
return (r);
@@ -703,116 +1612,263 @@ slurpfile(size_t * sizep, const char *fmt, ...)
va_list ap;
char *p;
ssize_t bytes_read;
- int fd;
+ FILE *f;
int r;
va_start(ap, fmt);
vsprintf(filename, fmt, ap);
va_end(ap);
- fd = open(filename, O_RDONLY);
- if (fd < 0) {
+ f = fopen(filename, "rb");
+ if (f == NULL) {
/* Note: No error; non-existent file is okay here. */
return (NULL);
}
- r = fstat(fd, &st);
+ r = fstat(fileno(f), &st);
if (r != 0) {
- fprintf(stderr, "Can't stat file %s\n", filename);
- close(fd);
+ logprintf("Can't stat file %s\n", filename);
+ fclose(f);
return (NULL);
}
- p = malloc(st.st_size + 1);
+ p = malloc((size_t)st.st_size + 1);
if (p == NULL) {
- fprintf(stderr, "Can't allocate %ld bytes of memory to read file %s\n", (long int)st.st_size, filename);
- close(fd);
+ logprintf("Can't allocate %ld bytes of memory to read file %s\n",
+ (long int)st.st_size, filename);
+ fclose(f);
return (NULL);
}
- bytes_read = read(fd, p, st.st_size);
+ bytes_read = fread(p, 1, (size_t)st.st_size, f);
if (bytes_read < st.st_size) {
- fprintf(stderr, "Can't read file %s\n", filename);
- close(fd);
+ logprintf("Can't read file %s\n", filename);
+ fclose(f);
free(p);
return (NULL);
}
p[st.st_size] = '\0';
if (sizep != NULL)
*sizep = (size_t)st.st_size;
- close(fd);
+ fclose(f);
return (p);
}
+/* Read a uuencoded file from the reference directory, decode, and
+ * write the result into the current directory. */
+#define UUDECODE(c) (((c) - 0x20) & 0x3f)
+void
+extract_reference_file(const char *name)
+{
+ char buff[1024];
+ FILE *in, *out;
+
+ sprintf(buff, "%s/%s.uu", refdir, name);
+ in = fopen(buff, "r");
+ failure("Couldn't open reference file %s", buff);
+ assert(in != NULL);
+ if (in == NULL)
+ return;
+ /* Read up to and including the 'begin' line. */
+ for (;;) {
+ if (fgets(buff, sizeof(buff), in) == NULL) {
+ /* TODO: This is a failure. */
+ return;
+ }
+ if (memcmp(buff, "begin ", 6) == 0)
+ break;
+ }
+ /* Now, decode the rest and write it. */
+ /* Not a lot of error checking here; the input better be right. */
+ out = fopen(name, "wb");
+ while (fgets(buff, sizeof(buff), in) != NULL) {
+ char *p = buff;
+ int bytes;
+
+ if (memcmp(buff, "end", 3) == 0)
+ break;
+
+ bytes = UUDECODE(*p++);
+ while (bytes > 0) {
+ int n = 0;
+ /* Write out 1-3 bytes from that. */
+ if (bytes > 0) {
+ n = UUDECODE(*p++) << 18;
+ n |= UUDECODE(*p++) << 12;
+ fputc(n >> 16, out);
+ --bytes;
+ }
+ if (bytes > 0) {
+ n |= UUDECODE(*p++) << 6;
+ fputc((n >> 8) & 0xFF, out);
+ --bytes;
+ }
+ if (bytes > 0) {
+ n |= UUDECODE(*p++);
+ fputc(n & 0xFF, out);
+ --bytes;
+ }
+ }
+ }
+ fclose(out);
+ fclose(in);
+}
+
+/*
+ *
+ * TEST management
+ *
+ */
+
/*
- * "list.h" is automatically generated; it just has a lot of lines like:
- * DEFINE_TEST(function_name)
- * It's used above to declare all of the test functions.
- * We reuse it here to define a list of all tests (functions and names).
+ * "list.h" is simply created by "grep DEFINE_TEST test_*.c"; it has
+ * a line like
+ * DEFINE_TEST(test_function)
+ * for each test.
*/
+
+/* Use "list.h" to declare all of the test functions. */
+#undef DEFINE_TEST
+#define DEFINE_TEST(name) void name(void);
+#include "list.h"
+
+/* Use "list.h" to create a list of all tests (functions and names). */
#undef DEFINE_TEST
-#define DEFINE_TEST(n) { n, #n },
-struct { void (*func)(void); const char *name; } tests[] = {
+#define DEFINE_TEST(n) { n, #n, 0 },
+struct { void (*func)(void); const char *name; int failures; } tests[] = {
#include "list.h"
};
/*
- * Each test is run in a private work dir. Those work dirs
- * do have consistent and predictable names, in case a group
- * of tests need to collaborate. However, there is no provision
- * for requiring that tests run in a certain order.
+ * Summarize repeated failures in the just-completed test.
*/
-static int test_run(int i, const char *tmpdir)
+static void
+test_summarize(const char *filename, int failed)
{
- int failures_before = failures;
+ unsigned int i;
- if (!quiet_flag) {
- printf("%d: %s\n", i, tests[i].name);
+ switch (verbosity) {
+ case VERBOSITY_SUMMARY_ONLY:
+ printf(failed ? "E" : ".");
fflush(stdout);
+ break;
+ case VERBOSITY_PASSFAIL:
+ printf(failed ? "FAIL\n" : "ok\n");
+ break;
}
- /*
- * Always explicitly chdir() in case the last test moved us to
- * a strange place.
- */
- if (chdir(tmpdir)) {
- fprintf(stderr,
- "ERROR: Couldn't chdir to temp dir %s\n",
- tmpdir);
- exit(1);
+ log_console = (verbosity == VERBOSITY_LIGHT_REPORT);
+
+ for (i = 0; i < sizeof(failed_lines)/sizeof(failed_lines[0]); i++) {
+ if (failed_lines[i].count > 1 && !failed_lines[i].skip)
+ logprintf("%s:%d: Summary: Failed %d times\n",
+ filename, i, failed_lines[i].count);
+ }
+ /* Clear the failure history for the next file. */
+ memset(failed_lines, 0, sizeof(failed_lines));
+}
+
+/*
+ * Actually run a single test, with appropriate setup and cleanup.
+ */
+static int
+test_run(int i, const char *tmpdir)
+{
+ char logfilename[64];
+ int failures_before = failures;
+ int oldumask;
+
+ switch (verbosity) {
+ case VERBOSITY_SUMMARY_ONLY: /* No per-test reports at all */
+ break;
+ case VERBOSITY_PASSFAIL: /* rest of line will include ok/FAIL marker */
+ printf("%3d: %-50s", i, tests[i].name);
+ fflush(stdout);
+ break;
+ default: /* Title of test, details will follow */
+ printf("%3d: %s\n", i, tests[i].name);
}
- /* Create a temp directory for this specific test. */
- if (mkdir(tests[i].name, 0755)) {
+
+ /* Chdir to the top-level work directory. */
+ if (!assertChdir(tmpdir)) {
fprintf(stderr,
- "ERROR: Couldn't create temp dir ``%s''\n",
- tests[i].name);
+ "ERROR: Can't chdir to top work dir %s\n", tmpdir);
exit(1);
}
- /* Chdir() to that work directory. */
- if (chdir(tests[i].name)) {
+ /* Create a log file for this test. */
+ sprintf(logfilename, "%s.log", tests[i].name);
+ logfile = fopen(logfilename, "w");
+ fprintf(logfile, "%s\n\n", tests[i].name);
+ /* Chdir() to a work dir for this specific test. */
+ if (!assertMakeDir(tests[i].name, 0755)
+ || !assertChdir(tests[i].name)) {
fprintf(stderr,
- "ERROR: Couldn't chdir to temp dir ``%s''\n",
- tests[i].name);
+ "ERROR: Can't chdir to work dir %s/%s\n",
+ tmpdir, tests[i].name);
exit(1);
}
/* Explicitly reset the locale before each test. */
setlocale(LC_ALL, "C");
- /* Run the actual test. */
+ /* Record the umask before we run the test. */
+ umask(oldumask = umask(0));
+ /*
+ * Run the actual test.
+ */
(*tests[i].func)();
- /* Summarize the results of this test. */
- summarize();
- /* If there were no failures, we can remove the work dir. */
- if (failures == failures_before) {
- if (!keep_temp_files && chdir(tmpdir) == 0) {
+ /*
+ * Clean up and report afterwards.
+ */
+ /* Restore umask */
+ umask(oldumask);
+ /* Reset locale. */
+ setlocale(LC_ALL, "C");
+ /* Reset directory. */
+ if (!assertChdir(tmpdir)) {
+ fprintf(stderr, "ERROR: Couldn't chdir to temp dir %s\n",
+ tmpdir);
+ exit(1);
+ }
+ /* Report per-test summaries. */
+ tests[i].failures = failures - failures_before;
+ test_summarize(test_filename, tests[i].failures);
+ /* Close the per-test log file. */
+ fclose(logfile);
+ logfile = NULL;
+ /* If there were no failures, we can remove the work dir and logfile. */
+ if (tests[i].failures == 0) {
+ if (!keep_temp_files && assertChdir(tmpdir)) {
#if defined(_WIN32) && !defined(__CYGWIN__)
- systemf("rmdir /S /Q %s", tests[i].name);
+ /* Make sure not to leave empty directories.
+ * Sometimes a processing of closing files used by tests
+ * is not done, then rmdir will be failed and it will
+ * leave a empty test directory. So we should wait a few
+ * seconds and retry rmdir. */
+ int r, t;
+ for (t = 0; t < 10; t++) {
+ if (t > 0)
+ Sleep(1000);
+ r = systemf("rmdir /S /Q %s", tests[i].name);
+ if (r == 0)
+ break;
+ }
+ systemf("del %s", logfilename);
#else
systemf("rm -rf %s", tests[i].name);
+ systemf("rm %s", logfilename);
#endif
}
}
/* Return appropriate status. */
- return (failures == failures_before ? 0 : 1);
+ return (tests[i].failures);
}
-static void usage(const char *program)
+/*
+ *
+ *
+ * MAIN and support routines.
+ *
+ *
+ */
+
+static void
+usage(const char *program)
{
static const int limit = sizeof(tests) / sizeof(tests[0]);
int i;
@@ -838,87 +1894,101 @@ static void usage(const char *program)
exit(1);
}
-#define UUDECODE(c) (((c) - 0x20) & 0x3f)
-
-void
-extract_reference_file(const char *name)
+static char *
+get_refdir(const char *d)
{
- char buff[1024];
- FILE *in, *out;
+ char tried[512] = { '\0' };
+ char buff[128];
+ char *pwd, *p;
+
+ /* If a dir was specified, try that */
+ if (d != NULL) {
+ pwd = NULL;
+ snprintf(buff, sizeof(buff), "%s", d);
+ p = slurpfile(NULL, "%s/%s", buff, KNOWNREF);
+ if (p != NULL) goto success;
+ strncat(tried, buff, sizeof(tried) - strlen(tried) - 1);
+ strncat(tried, "\n", sizeof(tried) - strlen(tried) - 1);
+ goto failure;
+ }
- sprintf(buff, "%s/%s.uu", refdir, name);
- in = fopen(buff, "r");
- failure("Couldn't open reference file %s", buff);
- assert(in != NULL);
- if (in == NULL)
- return;
- /* Read up to and including the 'begin' line. */
- for (;;) {
- if (fgets(buff, sizeof(buff), in) == NULL) {
- /* TODO: This is a failure. */
- return;
- }
- if (memcmp(buff, "begin ", 6) == 0)
- break;
+ /* Get the current dir. */
+ pwd = getcwd(NULL, 0);
+ while (pwd[strlen(pwd) - 1] == '\n')
+ pwd[strlen(pwd) - 1] = '\0';
+
+ /* Look for a known file. */
+ snprintf(buff, sizeof(buff), "%s", pwd);
+ p = slurpfile(NULL, "%s/%s", buff, KNOWNREF);
+ if (p != NULL) goto success;
+ strncat(tried, buff, sizeof(tried) - strlen(tried) - 1);
+ strncat(tried, "\n", sizeof(tried) - strlen(tried) - 1);
+
+ snprintf(buff, sizeof(buff), "%s/test", pwd);
+ p = slurpfile(NULL, "%s/%s", buff, KNOWNREF);
+ if (p != NULL) goto success;
+ strncat(tried, buff, sizeof(tried) - strlen(tried) - 1);
+ strncat(tried, "\n", sizeof(tried) - strlen(tried) - 1);
+
+#if defined(LIBRARY)
+ snprintf(buff, sizeof(buff), "%s/%s/test", pwd, LIBRARY);
+#else
+ snprintf(buff, sizeof(buff), "%s/%s/test", pwd, PROGRAM);
+#endif
+ p = slurpfile(NULL, "%s/%s", buff, KNOWNREF);
+ if (p != NULL) goto success;
+ strncat(tried, buff, sizeof(tried) - strlen(tried) - 1);
+ strncat(tried, "\n", sizeof(tried) - strlen(tried) - 1);
+
+ if (memcmp(pwd, "/usr/obj", 8) == 0) {
+ snprintf(buff, sizeof(buff), "%s", pwd + 8);
+ p = slurpfile(NULL, "%s/%s", buff, KNOWNREF);
+ if (p != NULL) goto success;
+ strncat(tried, buff, sizeof(tried) - strlen(tried) - 1);
+ strncat(tried, "\n", sizeof(tried) - strlen(tried) - 1);
+
+ snprintf(buff, sizeof(buff), "%s/test", pwd + 8);
+ p = slurpfile(NULL, "%s/%s", buff, KNOWNREF);
+ if (p != NULL) goto success;
+ strncat(tried, buff, sizeof(tried) - strlen(tried) - 1);
+ strncat(tried, "\n", sizeof(tried) - strlen(tried) - 1);
}
- /* Now, decode the rest and write it. */
- /* Not a lot of error checking here; the input better be right. */
- out = fopen(name, "w");
- while (fgets(buff, sizeof(buff), in) != NULL) {
- char *p = buff;
- int bytes;
- if (memcmp(buff, "end", 3) == 0)
- break;
+failure:
+ printf("Unable to locate known reference file %s\n", KNOWNREF);
+ printf(" Checked following directories:\n%s\n", tried);
+#if defined(_WIN32) && !defined(__CYGWIN__) && defined(_DEBUG)
+ DebugBreak();
+#endif
+ exit(1);
- bytes = UUDECODE(*p++);
- while (bytes > 0) {
- int n = 0;
- /* Write out 1-3 bytes from that. */
- if (bytes > 0) {
- n = UUDECODE(*p++) << 18;
- n |= UUDECODE(*p++) << 12;
- fputc(n >> 16, out);
- --bytes;
- }
- if (bytes > 0) {
- n |= UUDECODE(*p++) << 6;
- fputc((n >> 8) & 0xFF, out);
- --bytes;
- }
- if (bytes > 0) {
- n |= UUDECODE(*p++);
- fputc(n & 0xFF, out);
- --bytes;
- }
- }
- }
- fclose(out);
- fclose(in);
+success:
+ free(p);
+ free(pwd);
+ return strdup(buff);
}
-
-int main(int argc, char **argv)
+int
+main(int argc, char **argv)
{
static const int limit = sizeof(tests) / sizeof(tests[0]);
- int i, tests_run = 0, tests_failed = 0, opt;
+ int i, tests_run = 0, tests_failed = 0, option;
time_t now;
char *refdir_alloc = NULL;
-#if defined(_WIN32) && !defined(__CYGWIN__)
- char *testprg;
-#endif
- const char *opt_arg, *progname, *p;
+ const char *progname;
+ const char *tmp, *option_arg, *p;
char tmpdir[256];
char tmpdir_timestamp[256];
(void)argc; /* UNUSED */
-#if defined(_WIN32) && !defined(__CYGWIN__)
- /* Make sure open() function will be used with a binary mode. */
- /* on cygwin, we need something similar, but instead link against */
- /* a special startup object, binmode.o */
- _set_fmode(_O_BINARY);
+#if defined(HAVE__CrtSetReportMode)
+ /* To stop to run the default invalid parameter handler. */
+ _set_invalid_parameter_handler(invalid_parameter_handler);
+ /* Disable annoying assertion message box. */
+ _CrtSetReportMode(_CRT_ASSERT, 0);
#endif
+
/*
* Name of this program, used to build root of our temp directory
* tree.
@@ -933,9 +2003,20 @@ int main(int argc, char **argv)
#ifdef PROGRAM
/* Get the target program from environment, if available. */
- testprog = getenv(ENVBASE);
+ testprogfile = getenv(ENVBASE);
#endif
+ if (getenv("TMPDIR") != NULL)
+ tmp = getenv("TMPDIR");
+ else if (getenv("TMP") != NULL)
+ tmp = getenv("TMP");
+ else if (getenv("TEMP") != NULL)
+ tmp = getenv("TEMP");
+ else if (getenv("TEMPDIR") != NULL)
+ tmp = getenv("TEMPDIR");
+ else
+ tmp = "/tmp";
+
/* Allow -d to be controlled through the environment. */
if (getenv(ENVBASE "_DEBUG") != NULL)
dump_on_failure = 1;
@@ -954,24 +2035,24 @@ int main(int argc, char **argv)
p = *argv++;
++p; /* Skip '-' */
while (*p != '\0') {
- opt = *p++;
- opt_arg = NULL;
+ option = *p++;
+ option_arg = NULL;
/* If 'opt' takes an argument, parse that. */
- if (opt == 'p' || opt == 'r') {
+ if (option == 'p' || option == 'r') {
if (*p != '\0')
- opt_arg = p;
+ option_arg = p;
else if (*argv == NULL) {
fprintf(stderr,
"Option -%c requires argument.\n",
- opt);
+ option);
usage(progname);
} else
- opt_arg = *argv++;
+ option_arg = *argv++;
p = ""; /* End of this option word. */
}
/* Now, handle the option. */
- switch (opt) {
+ switch (option) {
case 'd':
dump_on_failure = 1;
break;
@@ -980,22 +2061,24 @@ int main(int argc, char **argv)
break;
case 'p':
#ifdef PROGRAM
- testprog = opt_arg;
+ testprogfile = option_arg;
#else
+ fprintf(stderr, "-p option not permitted\n");
usage(progname);
#endif
break;
case 'q':
- quiet_flag++;
+ verbosity--;
break;
case 'r':
- refdir = opt_arg;
+ refdir = option_arg;
break;
case 'v':
- verbose = 1;
+ verbosity++;
break;
- case '?':
default:
+ fprintf(stderr, "Unrecognized option '%c'\n",
+ option);
usage(progname);
}
}
@@ -1005,20 +2088,29 @@ int main(int argc, char **argv)
* Sanity-check that our options make sense.
*/
#ifdef PROGRAM
- if (testprog == NULL)
+ if (testprogfile == NULL) {
+ fprintf(stderr, "Program executable required\n");
usage(progname);
-#endif
+ }
+
+ {
+ char *testprg;
#if defined(_WIN32) && !defined(__CYGWIN__)
- /*
- * command.com cannot accept the command used '/' with drive
- * name such as c:/xxx/command.exe when use '|' pipe handling.
- */
- testprg = strdup(testprog);
- for (i = 0; testprg[i] != '\0'; i++) {
- if (testprg[i] == '/')
- testprg[i] = '\\';
+ /* Command.com sometimes rejects '/' separators. */
+ testprg = strdup(testprogfile);
+ for (i = 0; testprg[i] != '\0'; i++) {
+ if (testprg[i] == '/')
+ testprg[i] = '\\';
+ }
+ testprogfile = testprg;
+#endif
+ /* Quote the name that gets put into shell command lines. */
+ testprg = malloc(strlen(testprogfile) + 3);
+ strcpy(testprg, "\"");
+ strcat(testprg, testprogfile);
+ strcat(testprg, "\"");
+ testprog = testprg;
}
- testprog = testprg;
#endif
/*
@@ -1027,42 +2119,37 @@ int main(int argc, char **argv)
* to make it easier to track the results of multiple tests.
*/
now = time(NULL);
- for (i = 0; i < 1000; i++) {
+ for (i = 0; ; i++) {
strftime(tmpdir_timestamp, sizeof(tmpdir_timestamp),
"%Y-%m-%dT%H.%M.%S",
localtime(&now));
- sprintf(tmpdir, "/tmp/%s.%s-%03d", progname, tmpdir_timestamp, i);
- if (mkdir(tmpdir,0755) == 0)
+ sprintf(tmpdir, "%s/%s.%s-%03d", tmp, progname,
+ tmpdir_timestamp, i);
+ if (assertMakeDir(tmpdir,0755))
break;
- if (errno == EEXIST)
- continue;
- fprintf(stderr, "ERROR: Unable to create temp directory %s\n",
- tmpdir);
- exit(1);
+ if (i >= 999) {
+ fprintf(stderr,
+ "ERROR: Unable to create temp directory %s\n",
+ tmpdir);
+ exit(1);
+ }
}
/*
* If the user didn't specify a directory for locating
- * reference files, use the current directory for that.
+ * reference files, try to find the reference files in
+ * the "usual places."
*/
- if (refdir == NULL) {
- char *q;
- systemf("/bin/pwd > %s/refdir", tmpdir);
- q = slurpfile(NULL, "%s/refdir", tmpdir);
- refdir = refdir_alloc = q;
- q += strlen(refdir);
- while (q[-1] == '\n') {
- --q;
- *q = '\0';
- }
- systemf("rm %s/refdir", tmpdir);
- }
+ refdir = refdir_alloc = get_refdir(refdir);
/*
* Banner with basic information.
*/
- if (!quiet_flag) {
- printf("Running tests in: %s\n", tmpdir);
+ printf("\n");
+ printf("If tests fail or crash, details will be in:\n");
+ printf(" %s\n", tmpdir);
+ printf("\n");
+ if (verbosity > VERBOSITY_SUMMARY_ONLY) {
printf("Reference files will be read from: %s\n", refdir);
#ifdef PROGRAM
printf("Running tests on: %s\n", testprog);
@@ -1070,6 +2157,9 @@ int main(int argc, char **argv)
printf("Exercising: ");
fflush(stdout);
printf("%s\n", EXTRA_VERSION);
+ } else {
+ printf("Running ");
+ fflush(stdout);
}
/*
@@ -1084,15 +2174,30 @@ int main(int argc, char **argv)
}
} else {
while (*(argv) != NULL) {
- i = atoi(*argv);
- if (**argv < '0' || **argv > '9' || i < 0 || i >= limit) {
- printf("*** INVALID Test %s\n", *argv);
- usage(progname);
+ if (**argv >= '0' && **argv <= '9') {
+ i = atoi(*argv);
+ if (i < 0 || i >= limit) {
+ printf("*** INVALID Test %s\n", *argv);
+ free(refdir_alloc);
+ usage(progname);
+ /* usage() never returns */
+ }
} else {
- if (test_run(i, tmpdir))
- tests_failed++;
- tests_run++;
+ for (i = 0; i < limit; ++i) {
+ if (strcmp(*argv, tests[i].name) == 0)
+ break;
+ }
+ if (i >= limit) {
+ printf("*** INVALID Test ``%s''\n",
+ *argv);
+ free(refdir_alloc);
+ usage(progname);
+ /* usage() never returns */
+ }
}
+ if (test_run(i, tmpdir))
+ tests_failed++;
+ tests_run++;
argv++;
}
}
@@ -1100,20 +2205,38 @@ int main(int argc, char **argv)
/*
* Report summary statistics.
*/
- if (!quiet_flag) {
+ if (verbosity > VERBOSITY_SUMMARY_ONLY) {
printf("\n");
- printf("%d of %d tests reported failures\n",
- tests_failed, tests_run);
- printf(" Total of %d assertions checked.\n", assertions);
- printf(" Total of %d assertions failed.\n", failures);
- printf(" Total of %d assertions skipped.\n", skips);
+ printf("Totals:\n");
+ printf(" Tests run: %8d\n", tests_run);
+ printf(" Tests failed: %8d\n", tests_failed);
+ printf(" Assertions checked:%8d\n", assertions);
+ printf(" Assertions failed: %8d\n", failures);
+ printf(" Skips reported: %8d\n", skips);
+ }
+ if (failures) {
+ printf("\n");
+ printf("Failing tests:\n");
+ for (i = 0; i < limit; ++i) {
+ if (tests[i].failures)
+ printf(" %d: %s (%d failures)\n", i,
+ tests[i].name, tests[i].failures);
+ }
+ printf("\n");
+ printf("Details for failing tests: %s\n", tmpdir);
+ printf("\n");
+ } else {
+ if (verbosity == VERBOSITY_SUMMARY_ONLY)
+ printf("\n");
+ printf("%d tests passed, no failures\n", tests_run);
}
free(refdir_alloc);
/* If the final tmpdir is empty, we can remove it. */
/* This should be the usual case when all tests succeed. */
+ assertChdir("..");
rmdir(tmpdir);
- return (tests_failed);
+ return (tests_failed ? 1 : 0);
}
diff --git a/usr.bin/tar/test/test.h b/usr.bin/tar/test/test.h
index 6a1e1e8..a4a2461 100644
--- a/usr.bin/tar/test/test.h
+++ b/usr.bin/tar/test/test.h
@@ -45,37 +45,82 @@
#error Oops: No config.h and no pre-built configuration in test.h.
#endif
-#if !defined(_WIN32) || defined(__CYGWIN__)
+#include <sys/types.h> /* Windows requires this before sys/stat.h */
+#include <sys/stat.h>
+
+#ifdef USE_DMALLOC
+#include <dmalloc.h>
+#endif
+#if HAVE_DIRENT_H
#include <dirent.h>
-#else
-#define dirent direct
-#include "../bsdtar_windows.h"
+#endif
+#ifdef HAVE_DIRECT_H
#include <direct.h>
+#define dirent direct
#endif
#include <errno.h>
#include <fcntl.h>
+#ifdef HAVE_IO_H
+#include <io.h>
+#endif
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
-#include <sys/stat.h>
-#if !defined(_WIN32) || defined(__CYGWIN__)
+#include <time.h>
+#ifdef HAVE_UNISTD_H
#include <unistd.h>
#endif
#include <wchar.h>
-
-#ifdef USE_DMALLOC
-#include <dmalloc.h>
+#ifdef HAVE_WINDOWS_H
+#include <windows.h>
#endif
-#ifdef __FreeBSD__
-#include <sys/cdefs.h> /* For __FBSDID */
-#else
-/* Some non-FreeBSD platforms such as newlib-derived ones like
- * cygwin, have __FBSDID, so this definition must be guarded.
+/*
+ * System-specific tweaks. We really want to minimize these
+ * as much as possible, since they make it harder to understand
+ * the mainline code.
*/
+
+/* Windows (including Visual Studio and MinGW but not Cygwin) */
+#if defined(_WIN32) && !defined(__CYGWIN__)
+#include "../bsdtar_windows.h"
+#if !defined(__BORLANDC__)
+#define strdup _strdup
+#endif
+#define LOCALE_DE "deu"
+#else
+#define LOCALE_DE "de_DE.UTF-8"
+#endif
+
+/* Visual Studio */
+#ifdef _MSC_VER
+#define snprintf sprintf_s
+#endif
+
+/* Cygwin */
+#if defined(__CYGWIN__)
+/* Cygwin-1.7.x is lazy about populating nlinks, so don't
+ * expect it to be accurate. */
+# define NLINKS_INACCURATE_FOR_DIRS
+#endif
+
+#if defined(__HAIKU__) || defined(__QNXNTO__)
+/* Haiku and QNX have typedefs in stdint.h (needed for int64_t) */
+#include <stdint.h>
+#endif
+
+/* Get a real definition for __FBSDID if we can */
+#if HAVE_SYS_CDEFS_H
+#include <sys/cdefs.h>
+#endif
+
+/* If not, define it so as to avoid dangling semicolons. */
#ifndef __FBSDID
-#define __FBSDID(a) /* null */
+#define __FBSDID(a) struct _undefined_hack
#endif
+
+#ifndef O_BINARY
+#define O_BINARY 0
#endif
/*
@@ -85,41 +130,83 @@
#define DEFINE_TEST(name) void name(void); void name(void)
/* An implementation of the standard assert() macro */
-#define assert(e) test_assert(__FILE__, __LINE__, (e), #e, NULL)
-
+#define assert(e) assertion_assert(__FILE__, __LINE__, (e), #e, NULL)
+/* chdir() and error if it fails */
+#define assertChdir(path) \
+ assertion_chdir(__FILE__, __LINE__, path)
/* Assert two integers are the same. Reports value of each one if not. */
-#define assertEqualInt(v1,v2) \
- test_assert_equal_int(__FILE__, __LINE__, (v1), #v1, (v2), #v2, NULL)
-
+#define assertEqualInt(v1,v2) \
+ assertion_equal_int(__FILE__, __LINE__, (v1), #v1, (v2), #v2, NULL)
/* Assert two strings are the same. Reports value of each one if not. */
#define assertEqualString(v1,v2) \
- test_assert_equal_string(__FILE__, __LINE__, (v1), #v1, (v2), #v2, NULL)
+ assertion_equal_string(__FILE__, __LINE__, (v1), #v1, (v2), #v2, NULL)
/* As above, but v1 and v2 are wchar_t * */
#define assertEqualWString(v1,v2) \
- test_assert_equal_wstring(__FILE__, __LINE__, (v1), #v1, (v2), #v2, NULL)
+ assertion_equal_wstring(__FILE__, __LINE__, (v1), #v1, (v2), #v2, NULL)
/* As above, but raw blocks of bytes. */
#define assertEqualMem(v1, v2, l) \
- test_assert_equal_mem(__FILE__, __LINE__, (v1), #v1, (v2), #v2, (l), #l, NULL)
+ assertion_equal_mem(__FILE__, __LINE__, (v1), #v1, (v2), #v2, (l), #l, NULL)
/* Assert two files are the same; allow printf-style expansion of second name.
* See below for comments about variable arguments here...
*/
#define assertEqualFile \
- test_setup(__FILE__, __LINE__);test_assert_equal_file
+ assertion_setup(__FILE__, __LINE__);assertion_equal_file
/* Assert that a file is empty; supports printf-style arguments. */
#define assertEmptyFile \
- test_setup(__FILE__, __LINE__);test_assert_empty_file
+ assertion_setup(__FILE__, __LINE__);assertion_empty_file
/* Assert that a file is not empty; supports printf-style arguments. */
#define assertNonEmptyFile \
- test_setup(__FILE__, __LINE__);test_assert_non_empty_file
+ assertion_setup(__FILE__, __LINE__);assertion_non_empty_file
+#define assertFileAtime(pathname, sec, nsec) \
+ assertion_file_atime(__FILE__, __LINE__, pathname, sec, nsec)
+#define assertFileAtimeRecent(pathname) \
+ assertion_file_atime_recent(__FILE__, __LINE__, pathname)
+#define assertFileBirthtime(pathname, sec, nsec) \
+ assertion_file_birthtime(__FILE__, __LINE__, pathname, sec, nsec)
+#define assertFileBirthtimeRecent(pathname) \
+ assertion_file_birthtime_recent(__FILE__, __LINE__, pathname)
/* Assert that a file exists; supports printf-style arguments. */
#define assertFileExists \
- test_setup(__FILE__, __LINE__);test_assert_file_exists
+ assertion_setup(__FILE__, __LINE__);assertion_file_exists
/* Assert that a file exists; supports printf-style arguments. */
#define assertFileNotExists \
- test_setup(__FILE__, __LINE__);test_assert_file_not_exists
+ assertion_setup(__FILE__, __LINE__);assertion_file_not_exists
/* Assert that file contents match a string; supports printf-style arguments. */
#define assertFileContents \
- test_setup(__FILE__, __LINE__);test_assert_file_contents
+ assertion_setup(__FILE__, __LINE__);assertion_file_contents
+#define assertFileMtime(pathname, sec, nsec) \
+ assertion_file_mtime(__FILE__, __LINE__, pathname, sec, nsec)
+#define assertFileMtimeRecent(pathname) \
+ assertion_file_mtime_recent(__FILE__, __LINE__, pathname)
+#define assertFileNLinks(pathname, nlinks) \
+ assertion_file_nlinks(__FILE__, __LINE__, pathname, nlinks)
+#define assertFileSize(pathname, size) \
+ assertion_file_size(__FILE__, __LINE__, pathname, size)
+#define assertTextFileContents \
+ assertion_setup(__FILE__, __LINE__);assertion_text_file_contents
+#define assertFileContainsLinesAnyOrder(pathname, lines) \
+ assertion_file_contains_lines_any_order(__FILE__, __LINE__, pathname, lines)
+#define assertIsDir(pathname, mode) \
+ assertion_is_dir(__FILE__, __LINE__, pathname, mode)
+#define assertIsHardlink(path1, path2) \
+ assertion_is_hardlink(__FILE__, __LINE__, path1, path2)
+#define assertIsNotHardlink(path1, path2) \
+ assertion_is_not_hardlink(__FILE__, __LINE__, path1, path2)
+#define assertIsReg(pathname, mode) \
+ assertion_is_reg(__FILE__, __LINE__, pathname, mode)
+#define assertIsSymlink(pathname, contents) \
+ assertion_is_symlink(__FILE__, __LINE__, pathname, contents)
+/* Create a directory, report error if it fails. */
+#define assertMakeDir(dirname, mode) \
+ assertion_make_dir(__FILE__, __LINE__, dirname, mode)
+#define assertMakeFile(path, mode, contents) \
+ assertion_make_file(__FILE__, __LINE__, path, mode, contents)
+#define assertMakeHardlink(newfile, oldfile) \
+ assertion_make_hardlink(__FILE__, __LINE__, newfile, oldfile)
+#define assertMakeSymlink(newfile, linkto) \
+ assertion_make_symlink(__FILE__, __LINE__, newfile, linkto)
+#define assertUmask(mask) \
+ assertion_umask(__FILE__, __LINE__, mask)
/*
* This would be simple with C99 variadic macros, but I don't want to
@@ -128,27 +215,61 @@
* but effective.
*/
#define skipping \
- test_setup(__FILE__, __LINE__);test_skipping
+ assertion_setup(__FILE__, __LINE__);test_skipping
/* Function declarations. These are defined in test_utility.c. */
void failure(const char *fmt, ...);
-void test_setup(const char *, int);
+int assertion_assert(const char *, int, int, const char *, void *);
+int assertion_chdir(const char *, int, const char *);
+int assertion_empty_file(const char *, ...);
+int assertion_equal_file(const char *, const char *, ...);
+int assertion_equal_int(const char *, int, long long, const char *, long long, const char *, void *);
+int assertion_equal_mem(const char *, int, const void *, const char *, const void *, const char *, size_t, const char *, void *);
+int assertion_equal_string(const char *, int, const char *v1, const char *, const char *v2, const char *, void *);
+int assertion_equal_wstring(const char *, int, const wchar_t *v1, const char *, const wchar_t *v2, const char *, void *);
+int assertion_file_atime(const char *, int, const char *, long, long);
+int assertion_file_atime_recent(const char *, int, const char *);
+int assertion_file_birthtime(const char *, int, const char *, long, long);
+int assertion_file_birthtime_recent(const char *, int, const char *);
+int assertion_file_contains_lines_any_order(const char *, int, const char *, const char **);
+int assertion_file_contents(const void *, int, const char *, ...);
+int assertion_file_exists(const char *, ...);
+int assertion_file_mtime(const char *, int, const char *, long, long);
+int assertion_file_mtime_recent(const char *, int, const char *);
+int assertion_file_nlinks(const char *, int, const char *, int);
+int assertion_file_not_exists(const char *, ...);
+int assertion_file_size(const char *, int, const char *, long);
+int assertion_is_dir(const char *, int, const char *, int);
+int assertion_is_hardlink(const char *, int, const char *, const char *);
+int assertion_is_not_hardlink(const char *, int, const char *, const char *);
+int assertion_is_reg(const char *, int, const char *, int);
+int assertion_is_symlink(const char *, int, const char *, const char *);
+int assertion_make_dir(const char *, int, const char *, int);
+int assertion_make_file(const char *, int, const char *, int, const char *);
+int assertion_make_hardlink(const char *, int, const char *newpath, const char *);
+int assertion_make_symlink(const char *, int, const char *newpath, const char *);
+int assertion_non_empty_file(const char *, ...);
+int assertion_text_file_contents(const char *buff, const char *f);
+int assertion_umask(const char *, int, int);
+void assertion_setup(const char *, int);
+
void test_skipping(const char *fmt, ...);
-int test_assert(const char *, int, int, const char *, void *);
-int test_assert_empty_file(const char *, ...);
-int test_assert_non_empty_file(const char *, ...);
-int test_assert_equal_file(const char *, const char *, ...);
-int test_assert_equal_int(const char *, int, int, const char *, int, const char *, void *);
-int test_assert_equal_string(const char *, int, const char *v1, const char *, const char *v2, const char *, void *);
-int test_assert_equal_wstring(const char *, int, const wchar_t *v1, const char *, const wchar_t *v2, const char *, void *);
-int test_assert_equal_mem(const char *, int, const char *, const char *, const char *, const char *, size_t, const char *, void *);
-int test_assert_file_contents(const void *, int, const char *, ...);
-int test_assert_file_exists(const char *, ...);
-int test_assert_file_not_exists(const char *, ...);
/* Like sprintf, then system() */
int systemf(const char * fmt, ...);
+/* Delay until time() returns a value after this. */
+void sleepUntilAfter(time_t);
+
+/* Return true if this platform can create symlinks. */
+int canSymlink(void);
+
+/* Return true if this platform can run the "gzip" program. */
+int canGzip(void);
+
+/* Return true if this platform can run the "gunzip" program. */
+int canGunzip(void);
+
/* Suck file into string allocated via malloc(). Call free() when done. */
/* Supports printf-style args: slurpfile(NULL, "%s/myfile", refdir); */
char *slurpfile(size_t *, const char *fmt, ...);
@@ -161,4 +282,7 @@ void extract_reference_file(const char *);
*/
/* Pathname of exe to be tested. */
+const char *testprogfile;
+/* Name of exe to use in printf-formatted command strings. */
+/* On Windows, this includes leading/trailing quotes. */
const char *testprog;
diff --git a/usr.bin/tar/test/test_0.c b/usr.bin/tar/test/test_0.c
index d224daa..b97bd37 100644
--- a/usr.bin/tar/test/test_0.c
+++ b/usr.bin/tar/test/test_0.c
@@ -40,7 +40,7 @@ DEFINE_TEST(test_0)
struct stat st;
failure("File %s does not exist?!", testprog);
- if (!assertEqualInt(0, stat(testprog, &st)))
+ if (!assertEqualInt(0, stat(testprogfile, &st)))
exit(1);
failure("%s is not executable?!", testprog);
diff --git a/usr.bin/tar/test/test_basic.c b/usr.bin/tar/test/test_basic.c
index 3fad754..1fa3341 100644
--- a/usr.bin/tar/test/test_basic.c
+++ b/usr.bin/tar/test/test_basic.c
@@ -30,24 +30,16 @@ static void
basic_tar(const char *target, const char *pack_options,
const char *unpack_options, const char *flist)
{
- struct stat st, st2;
-#if !defined(_WIN32) || defined(__CYGWIN__)
- char buff[128];
-#endif
int r;
- assertEqualInt(0, mkdir(target, 0775));
+ assertMakeDir(target, 0775);
/* Use the tar program to create an archive. */
-#if !defined(_WIN32) || defined(__CYGWIN__)
- r = systemf("%s cf - %s `cat %s` >%s/archive 2>%s/pack.err", testprog, pack_options, flist, target, target);
-#else
r = systemf("%s cf - %s %s >%s/archive 2>%s/pack.err", testprog, pack_options, flist, target, target);
-#endif
failure("Error invoking %s cf -", testprog, pack_options);
assertEqualInt(r, 0);
- chdir(target);
+ assertChdir(target);
/* Verify that nothing went to stderr. */
assertEmptyFile("pack.err");
@@ -67,119 +59,57 @@ basic_tar(const char *target, const char *pack_options,
*/
/* Regular file with 2 links. */
- r = lstat("file", &st);
- failure("Failed to stat file %s/file, errno=%d", target, errno);
- assertEqualInt(r, 0);
- if (r == 0) {
- assert(S_ISREG(st.st_mode));
-#if !defined(_WIN32) || defined(__CYGWIN__)
- assertEqualInt(0644, st.st_mode & 0777);
-#else
- assertEqualInt(0600, st.st_mode & 0700);
-#endif
- assertEqualInt(10, st.st_size);
- failure("file %s/file", target);
- assertEqualInt(2, st.st_nlink);
- }
+ assertIsReg("file", -1);
+ assertFileSize("file", 10);
+ failure("%s", target);
+ assertFileNLinks("file", 2);
/* Another name for the same file. */
- r = lstat("linkfile", &st2);
- failure("Failed to stat file %s/linkfile, errno=%d", target, errno);
- assertEqualInt(r, 0);
- if (r == 0) {
- assert(S_ISREG(st2.st_mode));
-#if !defined(_WIN32) || defined(__CYGWIN__)
- assertEqualInt(0644, st2.st_mode & 0777);
-#else
- assertEqualInt(0600, st2.st_mode & 0700);
-#endif
- assertEqualInt(10, st2.st_size);
- failure("file %s/linkfile", target);
- assertEqualInt(2, st2.st_nlink);
- /* Verify that the two are really hardlinked. */
- assertEqualInt(st.st_dev, st2.st_dev);
- failure("%s/linkfile and %s/file aren't really hardlinks", target, target);
- assertEqualInt(st.st_ino, st2.st_ino);
- }
-
-#if !defined(_WIN32) || defined(__CYGWIN__)
+ assertIsReg("linkfile", -1);
+ assertFileSize("linkfile", 10);
+ assertFileNLinks("linkfile", 2);
+ assertIsHardlink("file", "linkfile");
+
/* Symlink */
- r = lstat("symlink", &st);
- failure("Failed to stat file %s/symlink, errno=%d", target, errno);
- assertEqualInt(r, 0);
- if (r == 0) {
- failure("symlink should be a symlink; actual mode is %o",
- st.st_mode);
- assert(S_ISLNK(st.st_mode));
- if (S_ISLNK(st.st_mode)) {
- r = readlink("symlink", buff, sizeof(buff));
- assertEqualInt(r, 4);
- buff[r] = '\0';
- assertEqualString(buff, "file");
- }
- }
-#endif
+ if (canSymlink())
+ assertIsSymlink("symlink", "file");
/* dir */
- r = lstat("dir", &st);
- if (r == 0) {
- assertEqualInt(r, 0);
- assert(S_ISDIR(st.st_mode));
-#if !defined(_WIN32) || defined(__CYGWIN__)
- assertEqualInt(0775, st.st_mode & 0777);
-#else
- assertEqualInt(0700, st.st_mode & 0700);
-#endif
- }
-
- chdir("..");
+ assertIsDir("dir", 0775);
+ assertChdir("..");
}
DEFINE_TEST(test_basic)
{
- int fd;
- int filelist;
- int oldumask;
+ FILE *f;
const char *flist;
- oldumask = umask(0);
-
- /*
- * Create an assortment of files on disk.
- */
- filelist = open("filelist", O_CREAT | O_WRONLY, 0644);
+ assertUmask(0);
/* File with 10 bytes content. */
- fd = open("file", O_CREAT | O_WRONLY, 0644);
- assert(fd >= 0);
- assertEqualInt(10, write(fd, "123456789", 10));
- close(fd);
- write(filelist, "file\n", 5);
+ f = fopen("file", "wb");
+ assert(f != NULL);
+ assertEqualInt(10, fwrite("123456789", 1, 10, f));
+ fclose(f);
/* hardlink to above file. */
- assertEqualInt(0, link("file", "linkfile"));
- write(filelist, "linkfile\n", 9);
+ assertMakeHardlink("linkfile", "file");
+ assertIsHardlink("file", "linkfile");
/* Symlink to above file. */
- assertEqualInt(0, symlink("file", "symlink"));
- write(filelist, "symlink\n", 8);
+ if (canSymlink())
+ assertMakeSymlink("symlink", "file");
/* Directory. */
- assertEqualInt(0, mkdir("dir", 0775));
- write(filelist, "dir\n", 4);
- /* All done. */
- close(filelist);
-
-#if !defined(_WIN32) || defined(__CYGWIN__)
- flist = "filelist";
-#else
- flist = "file linkfile symlink dir";
-#endif
+ assertMakeDir("dir", 0775);
+
+ if (canSymlink())
+ flist = "file linkfile symlink dir";
+ else
+ flist = "file linkfile dir";
/* Archive/dearchive with a variety of options. */
basic_tar("copy", "", "", flist);
/* tar doesn't handle cpio symlinks correctly */
/* basic_tar("copy_odc", "--format=odc", ""); */
basic_tar("copy_ustar", "--format=ustar", "", flist);
-
- umask(oldumask);
}
diff --git a/usr.bin/tar/test/test_copy.c b/usr.bin/tar/test/test_copy.c
index 120d9f3..5a1c4d0 100644
--- a/usr.bin/tar/test/test_copy.c
+++ b/usr.bin/tar/test/test_copy.c
@@ -25,7 +25,108 @@
#include "test.h"
__FBSDID("$FreeBSD$");
-#define LOOP_MAX 170
+#if defined(__CYGWIN__)
+# include <limits.h>
+# include <sys/cygwin.h>
+#endif
+
+/*
+ * Try to figure out how deep we can go in our tests. Assumes that
+ * the first call to this function has the longest starting cwd (which
+ * is currently "<testdir>/original"). This is mostly to work around
+ * limits in our Win32 support.
+ *
+ * Background: On Posix systems, PATH_MAX is merely a limit on the
+ * length of the string passed into a system call. By repeatedly
+ * calling chdir(), you can work with arbitrarily long paths on such
+ * systems. In contrast, Win32 APIs apply PATH_MAX limits to the full
+ * absolute path, so the permissible length of a system call argument
+ * varies with the cwd. Some APIs actually enforce limits
+ * significantly less than PATH_MAX to ensure that you can create
+ * files within the current working directory. The Win32 limits also
+ * apply to Cygwin before 1.7.
+ *
+ * Someday, I want to convert the Win32 support to use newer
+ * wide-character paths with '\\?\' prefix, which has a 32k PATH_MAX
+ * instead of the rather anemic 260 character limit of the older
+ * system calls. Then we can drop this mess (unless we want to
+ * continue to special-case Cygwin 1.5 and earlier).
+ */
+static int
+compute_loop_max(void)
+{
+#if defined(_WIN32) && !defined(__CYGWIN__)
+ static int LOOP_MAX = 0;
+ char buf[MAX_PATH];
+ size_t cwdlen;
+
+ if (LOOP_MAX == 0) {
+ assert(_getcwd(buf, MAX_PATH) != NULL);
+ cwdlen = strlen(buf);
+ /* 12 characters = length of 8.3 filename */
+ /* 4 characters = length of "/../" used in symlink tests */
+ /* 1 character = length of extra "/" separator */
+ LOOP_MAX = MAX_PATH - (int)cwdlen - 12 - 4 - 1;
+ }
+ return LOOP_MAX;
+#elif defined(__CYGWIN__) && !defined(HAVE_CYGWIN_CONV_PATH)
+ static int LOOP_MAX = 0;
+ if (LOOP_MAX == 0) {
+ char wbuf[PATH_MAX];
+ char pbuf[PATH_MAX];
+ size_t wcwdlen;
+ size_t pcwdlen;
+ size_t cwdlen;
+ assert(getcwd(pbuf, PATH_MAX) != NULL);
+ pcwdlen = strlen(pbuf);
+ cygwin_conv_to_full_win32_path(pbuf, wbuf);
+ wcwdlen = strlen(wbuf);
+ cwdlen = ((wcwdlen > pcwdlen) ? wcwdlen : pcwdlen);
+ /* Cygwin helper needs an extra few characters. */
+ LOOP_MAX = PATH_MAX - (int)cwdlen - 12 - 4 - 4;
+ }
+ return LOOP_MAX;
+#else
+ /* cygwin-1.7 ends up here, along with "normal" unix */
+ return 200; /* restore pre-r278 depth */
+#endif
+}
+
+/* filenames[i] is a distinctive filename of length i. */
+/* To simplify interpreting failures, each filename ends with a
+ * decimal integer which is the length of the filename. E.g., A
+ * filename ending in "_92" is 92 characters long. To detect errors
+ * which drop or misplace characters, the filenames use a repeating
+ * "abcdefghijklmnopqrstuvwxyz..." pattern. */
+static char *filenames[201];
+
+static void
+compute_filenames(void)
+{
+ char buff[250];
+ size_t i,j;
+
+ filenames[0] = strdup("");
+ filenames[1] = strdup("1");
+ filenames[2] = strdup("a2");
+ for (i = 3; i < sizeof(filenames)/sizeof(filenames[0]); ++i) {
+ /* Fill with "abcdefghij..." */
+ for (j = 0; j < i; ++j)
+ buff[j] = 'a' + (j % 26);
+ buff[j--] = '\0';
+ /* Work from the end to fill in the number portion. */
+ buff[j--] = '0' + (i % 10);
+ if (i > 9) {
+ buff[j--] = '0' + ((i / 10) % 10);
+ if (i > 99)
+ buff[j--] = '0' + (i / 100);
+ }
+ buff[j] = '_';
+ /* Guard against obvious screwups in the above code. */
+ assertEqualInt(strlen(buff), i);
+ filenames[i] = strdup(buff);
+ }
+}
static void
create_tree(void)
@@ -33,217 +134,145 @@ create_tree(void)
char buff[260];
char buff2[260];
int i;
- int fd;
-
- assertEqualInt(0, mkdir("original", 0775));
- chdir("original");
- assertEqualInt(0, mkdir("f", 0775));
- assertEqualInt(0, mkdir("l", 0775));
- assertEqualInt(0, mkdir("m", 0775));
- assertEqualInt(0, mkdir("s", 0775));
- assertEqualInt(0, mkdir("d", 0775));
-
- for (i = 0; i < LOOP_MAX; i++) {
- buff[0] = 'f';
- buff[1] = '/';
- /* Create a file named "f/abcdef..." */
- buff[i + 2] = 'a' + (i % 26);
- buff[i + 3] = '\0';
- fd = open(buff, O_CREAT | O_WRONLY, 0644);
- assert(fd >= 0);
- assertEqualInt(i + 3, write(fd, buff, strlen(buff)));
- close(fd);
+ int LOOP_MAX;
+
+ compute_filenames();
+
+ /* Log that we'll be omitting some checks. */
+ if (!canSymlink()) {
+ skipping("Symlink checks");
+ }
+
+ assertMakeDir("original", 0775);
+ assertEqualInt(0, chdir("original"));
+ LOOP_MAX = compute_loop_max();
+
+ assertMakeDir("f", 0775);
+ assertMakeDir("l", 0775);
+ assertMakeDir("m", 0775);
+ assertMakeDir("s", 0775);
+ assertMakeDir("d", 0775);
+
+ for (i = 1; i < LOOP_MAX; i++) {
+ failure("Internal sanity check failed: i = %d", i);
+ assert(filenames[i] != NULL);
+
+ sprintf(buff, "f/%s", filenames[i]);
+ assertMakeFile(buff, 0777, buff);
/* Create a link named "l/abcdef..." to the above. */
- strcpy(buff2, buff);
- buff2[0] = 'l';
- assertEqualInt(0, link(buff, buff2));
+ sprintf(buff2, "l/%s", filenames[i]);
+ assertMakeHardlink(buff2, buff);
/* Create a link named "m/abcdef..." to the above. */
- strcpy(buff2, buff);
- buff2[0] = 'm';
- assertEqualInt(0, link(buff, buff2));
-
-#if !defined(_WIN32) || defined(__CYGWIN__)
- /* Create a symlink named "s/abcdef..." to the above. */
- strcpy(buff2 + 3, buff);
- buff[0] = 's';
- buff2[0] = '.';
- buff2[1] = '.';
- buff2[2] = '/';
- assertEqualInt(0, symlink(buff2, buff));
-#else
- skipping("create a symlink to the above");
-#endif
+ sprintf(buff2, "m/%s", filenames[i]);
+ assertMakeHardlink(buff2, buff);
+
+ if (canSymlink()) {
+ /* Create a symlink named "s/abcdef..." to the above. */
+ sprintf(buff, "s/%s", filenames[i]);
+ sprintf(buff2, "../f/%s", filenames[i]);
+ failure("buff=\"%s\" buff2=\"%s\"", buff, buff2);
+ assertMakeSymlink(buff, buff2);
+ }
/* Create a dir named "d/abcdef...". */
buff[0] = 'd';
- assertEqualInt(0, mkdir(buff, 0775));
+ failure("buff=\"%s\"", buff);
+ assertMakeDir(buff, 0775);
}
- chdir("..");
+ assertEqualInt(0, chdir(".."));
}
-#define LIMIT_NONE 0
-#define LIMIT_USTAR 1
+#define LIMIT_NONE 200
+#define LIMIT_USTAR 100
static void
-verify_tree(int limit)
+verify_tree(size_t limit)
{
- struct stat st, st2;
- char filename[260];
char name1[260];
char name2[260];
- char contents[260];
- int i, j, r;
- int fd;
- int len;
- const char *p, *dp;
- DIR *d;
- struct dirent *de;
+ size_t i, LOOP_MAX;
+
+ LOOP_MAX = compute_loop_max();
/* Generate the names we know should be there and verify them. */
for (i = 1; i < LOOP_MAX; i++) {
- /* Generate a base name of the correct length. */
- for (j = 0; j < i; ++j)
- filename[j] = 'a' + (j % 26);
-#if 0
- for (n = i; n > 0; n /= 10)
- filename[--j] = '0' + (n % 10);
-#endif
- filename[i] = '\0';
-
/* Verify a file named "f/abcdef..." */
- strcpy(name1, "f/");
- strcat(name1, filename);
- if (limit != LIMIT_USTAR || strlen(filename) <= 100) {
- fd = open(name1, O_RDONLY);
- failure("Couldn't open \"%s\": %s",
- name1, strerror(errno));
- if (assert(fd >= 0)) {
- len = read(fd, contents, i + 10);
- close(fd);
- assertEqualInt(len, i + 2);
- /* Verify contents of 'contents' */
- contents[len] = '\0';
- failure("Each test file contains its own name");
- assertEqualString(name1, contents);
- /* stat() for dev/ino for next check */
- assertEqualInt(0, lstat(name1, &st));
- }
+ sprintf(name1, "f/%s", filenames[i]);
+ if (i <= limit) {
+ assertFileExists(name1);
+ assertFileContents(name1, strlen(name1), name1);
}
- /*
- * ustar allows 100 chars for links, and we have
- * "original/" as part of the name, so the link
- * names here can't exceed 91 chars.
- */
- strcpy(name2, "l/");
- strcat(name2, filename);
- if (limit != LIMIT_USTAR || strlen(name2) <= 100) {
+ sprintf(name2, "l/%s", filenames[i]);
+ if (i + 2 <= limit) {
/* Verify hardlink "l/abcdef..." */
- assertEqualInt(0, (r = lstat(name2, &st2)));
- if (r == 0) {
- assertEqualInt(st2.st_dev, st.st_dev);
- assertEqualInt(st2.st_ino, st.st_ino);
- }
-
- /* Verify hardlink "m_abcdef..." */
+ assertIsHardlink(name1, name2);
+ /* Verify hardlink "m/abcdef..." */
name2[0] = 'm';
- assertEqualInt(0, (r = lstat(name2, &st2)));
- if (r == 0) {
- assertEqualInt(st2.st_dev, st.st_dev);
- assertEqualInt(st2.st_ino, st.st_ino);
- }
+ assertIsHardlink(name1, name2);
}
-#if !defined(_WIN32) || defined(__CYGWIN__)
- /*
- * Symlink text doesn't include the 'original/' prefix,
- * so the limit here is 100 characters.
- */
- /* Verify symlink "s/abcdef..." */
- strcpy(name2, "../s/");
- strcat(name2, filename);
- if (limit != LIMIT_USTAR || strlen(name2) <= 100) {
- /* This is a symlink. */
- failure("Couldn't stat %s (length %d)",
- filename, strlen(filename));
- if (assertEqualInt(0, lstat(name2 + 3, &st2))) {
- assert(S_ISLNK(st2.st_mode));
- /* This is a symlink to the file above. */
- failure("Couldn't stat %s", name2 + 3);
- if (assertEqualInt(0, stat(name2 + 3, &st2))) {
- assertEqualInt(st2.st_dev, st.st_dev);
- assertEqualInt(st2.st_ino, st.st_ino);
- }
- }
+ if (canSymlink()) {
+ /* Verify symlink "s/abcdef..." */
+ sprintf(name1, "s/%s", filenames[i]);
+ sprintf(name2, "../f/%s", filenames[i]);
+ if (strlen(name2) <= limit)
+ assertIsSymlink(name1, name2);
}
-#else
- skipping("verify symlink");
-#endif
+
/* Verify dir "d/abcdef...". */
- strcpy(name1, "d/");
- strcat(name1, filename);
- if (limit != LIMIT_USTAR || strlen(filename) < 100) {
- /* This is a dir. */
- failure("Couldn't stat %s (length %d)",
- name1, strlen(filename));
- if (assertEqualInt(0, lstat(name1, &st2))) {
- if (assert(S_ISDIR(st2.st_mode))) {
- /* TODO: opendir/readdir this
- * directory and make sure
- * it's empty.
- */
- }
+ sprintf(name1, "d/%s", filenames[i]);
+ if (i + 1 <= limit) { /* +1 for trailing slash */
+ if (assertIsDir(name1, -1)) {
+ /* TODO: opendir/readdir this
+ * directory and make sure
+ * it's empty.
+ */
}
}
}
- /* Now make sure nothing is there that shouldn't be. */
- for (dp = "dflms"; *dp != '\0'; ++dp) {
- char dir[2];
- dir[0] = *dp; dir[1] = '\0';
- d = opendir(dir);
- failure("Unable to open dir '%s'", dir);
- if (!assert(d != NULL))
- continue;
- while ((de = readdir(d)) != NULL) {
- p = de->d_name;
- switch(dp[0]) {
- case 'l': case 'm':
- if (limit == LIMIT_USTAR) {
- failure("strlen(p) = %d", strlen(p));
- assert(strlen(p) <= 100);
- }
- case 'd':
- if (limit == LIMIT_USTAR) {
+#if !defined(_WIN32) || defined(__CYGWIN__)
+ {
+ const char *dp;
+ /* Now make sure nothing is there that shouldn't be. */
+ for (dp = "dflms"; *dp != '\0'; ++dp) {
+ DIR *d;
+ struct dirent *de;
+ char dir[2];
+ dir[0] = *dp; dir[1] = '\0';
+ d = opendir(dir);
+ failure("Unable to open dir '%s'", dir);
+ if (!assert(d != NULL))
+ continue;
+ while ((de = readdir(d)) != NULL) {
+ char *p = de->d_name;
+ if (p[0] == '.')
+ continue;
+ switch(dp[0]) {
+ case 'l': case 'm': case 'd':
failure("strlen(p)=%d", strlen(p));
- assert(strlen(p) < 100);
- }
- case 'f': case 's':
- if (limit == LIMIT_USTAR) {
+ assert(strlen(p) < limit);
+ assertEqualString(p,
+ filenames[strlen(p)]);
+ break;
+ case 'f': case 's':
failure("strlen(p)=%d", strlen(p));
- assert(strlen(p) < 101);
+ assert(strlen(p) < limit + 1);
+ assertEqualString(p,
+ filenames[strlen(p)]);
+ break;
+ default:
+ failure("File %s shouldn't be here", p);
+ assert(0);
}
- /* Our files have very particular filename patterns. */
- if (p[0] != '.' || (p[1] != '.' && p[1] != '\0')) {
- for (i = 0; p[i] != '\0' && i < LOOP_MAX; i++) {
- failure("i=%d, p[i]='%c' 'a'+(i%%26)='%c'", i, p[i], 'a' + (i % 26));
- assertEqualInt(p[i], 'a' + (i % 26));
- }
- assert(p[i] == '\0');
- }
- break;
- case '.':
- assert(p[1] == '\0' || (p[1] == '.' && p[2] == '\0'));
- break;
- default:
- failure("File %s shouldn't be here", p);
- assert(0);
}
+ closedir(d);
}
- closedir(d);
}
+#endif
}
static void
@@ -251,7 +280,13 @@ copy_basic(void)
{
int r;
- assertEqualInt(0, mkdir("plain", 0775));
+ /* NOTE: for proper operation on cygwin-1.5 and windows, the
+ * length of the name of the directory below, "plain", must be
+ * less than or equal to the lengthe of the name of the original
+ * directory, "original" This restriction derives from the
+ * extremely limited pathname lengths on those platforms.
+ */
+ assertMakeDir("plain", 0775);
assertEqualInt(0, chdir("plain"));
/*
@@ -287,7 +322,13 @@ copy_ustar(void)
const char *target = "ustar";
int r;
- assertEqualInt(0, mkdir(target, 0775));
+ /* NOTE: for proper operation on cygwin-1.5 and windows, the
+ * length of the name of the directory below, "ustar", must be
+ * less than or equal to the lengthe of the name of the original
+ * directory, "original" This restriction derives from the
+ * extremely limited pathname lengths on those platforms.
+ */
+ assertMakeDir(target, 0775);
assertEqualInt(0, chdir(target));
/*
@@ -314,17 +355,13 @@ copy_ustar(void)
assertEmptyFile("unpack.err");
assertEmptyFile("unpack.out");
- chdir("original");
verify_tree(LIMIT_USTAR);
- chdir("../..");
+ assertEqualInt(0, chdir("../.."));
}
DEFINE_TEST(test_copy)
{
- int oldumask;
-
- oldumask = umask(0);
-
+ assertUmask(0);
create_tree(); /* Create sample files in "original" dir. */
/* Test simple "tar -c | tar -x" pipeline copy. */
@@ -332,6 +369,4 @@ DEFINE_TEST(test_copy)
/* Same, but constrain to ustar format. */
copy_ustar();
-
- umask(oldumask);
}
diff --git a/usr.bin/tar/err.h b/usr.bin/tar/test/test_empty_mtree.c
index 84ed3f4..6f8a5e9 100644
--- a/usr.bin/tar/err.h
+++ b/usr.bin/tar/test/test_empty_mtree.c
@@ -1,5 +1,5 @@
/*-
- * Copyright (c) 2009 Joerg Sonnenberger
+ * Copyright (c) 2003-2009 Tim Kientzle
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
@@ -21,23 +21,25 @@
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * $FreeBSD$
*/
+#include "test.h"
+__FBSDID("$FreeBSD$");
-#ifndef LAFE_ERR_H
-#define LAFE_ERR_H
-
-#if defined(__GNUC__) && (__GNUC__ > 2 || \
- (__GNUC__ == 2 && __GNUC_MINOR__ >= 5))
-#define __LA_DEAD __attribute__((__noreturn__))
-#else
-#define __LA_DEAD
-#endif
-
-extern const char *bsdtar_progname;
+/*
+ * Regression test: We used to get a bogus error message when we
+ * asked tar to copy entries out of an empty archive. See
+ * Issue 51 on libarchive.googlecode.com for details.
+ */
+DEFINE_TEST(test_empty_mtree)
+{
+ int r;
-void bsdtar_warnc(int code, const char *fmt, ...);
-void bsdtar_errc(int eval, int code, const char *fmt, ...) __LA_DEAD;
+ assertMakeFile("test1.mtree", 0777, "#mtree\n");
-#endif
+ r = systemf("%s cf test1.tar @test1.mtree >test1.out 2>test1.err",
+ testprog);
+ failure("Error invoking %s cf", testprog);
+ assertEqualInt(r, 0);
+ assertEmptyFile("test1.out");
+ assertEmptyFile("test1.err");
+}
diff --git a/usr.bin/tar/test/test_help.c b/usr.bin/tar/test/test_help.c
index c547dbc..0e7d1c9 100644
--- a/usr.bin/tar/test/test_help.c
+++ b/usr.bin/tar/test/test_help.c
@@ -51,6 +51,7 @@ DEFINE_TEST(test_help)
/* Exercise --help option. */
r = systemf("%s --help >help.stdout 2>help.stderr", testprog);
+ assertEqualInt(r, 0);
failure("--help should generate nothing to stderr.");
assertEmptyFile("help.stderr");
/* Help message should start with name of program. */
@@ -67,6 +68,7 @@ DEFINE_TEST(test_help)
/* -h option should generate the same output. */
r = systemf("%s -h >h.stdout 2>h.stderr", testprog);
+ assertEqualInt(r, 0);
failure("-h should generate nothing to stderr.");
assertEmptyFile("h.stderr");
failure("stdout should be same for -h and --help");
@@ -74,6 +76,7 @@ DEFINE_TEST(test_help)
/* -W help should be another synonym. */
r = systemf("%s -W help >Whelp.stdout 2>Whelp.stderr", testprog);
+ assertEqualInt(r, 0);
failure("-W help should generate nothing to stderr.");
assertEmptyFile("Whelp.stderr");
failure("stdout should be same for -W help and --help");
diff --git a/usr.bin/tar/test/test_option_T.c b/usr.bin/tar/test/test_option_T_upper.c
index 72dcd54..87127cc 100644
--- a/usr.bin/tar/test/test_option_T.c
+++ b/usr.bin/tar/test/test_option_T_upper.c
@@ -26,110 +26,144 @@
__FBSDID("$FreeBSD$");
static int
-touch(const char *fn)
+touch(const char *fn, int fail)
{
- int fd = open(fn, O_RDWR | O_CREAT, 0644);
- failure("Couldn't create file '%s', fd=%d, errno=%d (%s)\n",
- fn, fd, errno, strerror(errno));
- if (!assert(fd > 0))
- return (0); /* Failure. */
- close(fd);
+ FILE *f = fopen(fn, "w");
+ if (fail) {
+ failure("Couldn't create file '%s', errno=%d (%s)\n",
+ fn, errno, strerror(errno));
+ if (!assert(f != NULL))
+ return (0); /* Failure. */
+ } else {
+ if (f == NULL)
+ return (0); /* Soft failure. */
+ }
+ fclose(f);
return (1); /* Success */
}
-DEFINE_TEST(test_option_T)
+DEFINE_TEST(test_option_T_upper)
{
FILE *f;
int r;
struct stat st;
+ int gnarlyFilesSupported;
- /* Create a simple dir hierarchy; bail if anything fails. */
- if (!assertEqualInt(0, mkdir("d1", 0755))) return;
- if (!assertEqualInt(0, mkdir("d1/d2", 0755))) return;
- if (!touch("d1/f1")) return;
- if (!touch("d1/f2")) return;
- if (!touch("d1/d2/f3")) return;
- if (!touch("d1/d2/f4")) return;
- if (!touch("d1/d2/f5")) return;
+ /* Create a simple dir heirarchy; bail if anything fails. */
+ if (!assertMakeDir("d1", 0755)) return;
+ if (!assertMakeDir("d1/d2", 0755)) return;
+ if (!touch("f", 1)) return;
+ if (!touch("d1/f1", 1)) return;
+ if (!touch("d1/f2", 1)) return;
+ if (!touch("d1/d2/f3", 1)) return;
+ if (!touch("d1/d2/f4", 1)) return;
+ if (!touch("d1/d2/f5", 1)) return;
+ if (!touch("d1/d2/f6", 1)) return;
+ /* Some platforms don't permit such things; just skip it. */
+ gnarlyFilesSupported = touch("d1/d2/f\x0a", 0);
/* Populate a file list */
f = fopen("filelist", "w+");
if (!assert(f != NULL))
return;
- fprintf(f, "d1/f1\n");
- fprintf(f, "d1/d2/f4\n");
+ /* Use a variety of text line endings. */
+ fprintf(f, "f\x0d"); /* CR */
+ fprintf(f, "d1/f1\x0d\x0a"); /* CRLF */
+ fprintf(f, "d1/d2/f4\x0a"); /* NL */
+ fprintf(f, "d1/d2/f6"); /* EOF */
fclose(f);
/* Populate a second file list */
f = fopen("filelist2", "w+");
if (!assert(f != NULL))
return;
- fprintf(f, "d1/d2/f3\n");
- fprintf(f, "d1/d2/f5\n");
+ /* Use null-terminated names. */
+ fprintf(f, "d1/d2/f3");
+ fwrite("\0", 1, 1, f);
+ fprintf(f, "d1/d2/f5");
+ fwrite("\0", 1, 1, f);
+ if (gnarlyFilesSupported) {
+ fprintf(f, "d1/d2/f\x0a");
+ fwrite("\0", 1, 1, f);
+ }
fclose(f);
/* Use -c -T to archive up the files. */
r = systemf("%s -c -f test1.tar -T filelist > test1.out 2> test1.err",
testprog);
- failure("Failure here probably means that tar can't archive zero-length files without reading them");
assert(r == 0);
assertEmptyFile("test1.out");
assertEmptyFile("test1.err");
/* Use -x -T to dearchive the files */
- if (!assertEqualInt(0, mkdir("test1", 0755))) return;
+ if (!assertMakeDir("test1", 0755)) return;
systemf("%s -x -f test1.tar -T filelist -C test1"
" > test1b.out 2> test1b.err", testprog);
assertEmptyFile("test1b.out");
assertEmptyFile("test1b.err");
/* Verify the files were extracted. */
+ assertFileExists("test1/f");
assertFileExists("test1/d1/f1");
assertFileNotExists("test1/d1/f2");
assertFileNotExists("test1/d1/d2/f3");
assertFileExists("test1/d1/d2/f4");
assertFileNotExists("test1/d1/d2/f5");
+ assertFileExists("test1/d1/d2/f6");
+ if (gnarlyFilesSupported) {
+ assertFileNotExists("test1/d1/d2/f\x0a");
+ }
/* Use -r -T to add more files to the archive. */
- systemf("%s -r -f test1.tar -T filelist2 > test2.out 2> test2.err",
+ systemf("%s -r -f test1.tar --null -T filelist2 > test2.out 2> test2.err",
testprog);
assertEmptyFile("test2.out");
assertEmptyFile("test2.err");
/* Use -x without -T to dearchive the files (ensure -r worked) */
- if (!assertEqualInt(0, mkdir("test3", 0755))) return;
+ if (!assertMakeDir("test3", 0755)) return;
systemf("%s -x -f test1.tar -C test3"
" > test3.out 2> test3.err", testprog);
assertEmptyFile("test3.out");
assertEmptyFile("test3.err");
/* Verify the files were extracted.*/
+ assertFileExists("test3/f");
assertFileExists("test3/d1/f1");
assertFileNotExists("test3/d1/f2");
assertFileExists("test3/d1/d2/f3");
assertFileExists("test3/d1/d2/f4");
assertFileExists("test3/d1/d2/f5");
+ assertFileExists("test3/d1/d2/f6");
+ if (gnarlyFilesSupported) {
+ assertFileExists("test3/d1/d2/f\x0a");
+ }
/* Use -x -T to dearchive the files (verify -x -T together) */
- if (!assertEqualInt(0, mkdir("test2", 0755))) return;
+ if (!assertMakeDir("test2", 0755)) return;
systemf("%s -x -f test1.tar -T filelist -C test2"
" > test2b.out 2> test2b.err", testprog);
assertEmptyFile("test2b.out");
assertEmptyFile("test2b.err");
/* Verify the files were extracted.*/
+ assertFileExists("test2/f");
assertFileExists("test2/d1/f1");
assertFileNotExists("test2/d1/f2");
assertFileNotExists("test2/d1/d2/f3");
assertFileExists("test2/d1/d2/f4");
assertFileNotExists("test2/d1/d2/f5");
+ assertFileExists("test2/d1/d2/f6");
+ if (gnarlyFilesSupported) {
+ assertFileNotExists("test2/d1/d2/f\x0a");
+ }
- assertEqualInt(0, mkdir("test4", 0755));
- assertEqualInt(0, mkdir("test4_out", 0755));
- assertEqualInt(0, mkdir("test4_out2", 0755));
- assertEqualInt(0, mkdir("test4/d1", 0755));
- assertEqualInt(1, touch("test4/d1/foo"));
+ assertMakeDir("test4", 0755);
+ assertMakeDir("test4_out", 0755);
+ assertMakeDir("test4_out2", 0755);
+ assertMakeDir("test4/d1", 0755);
+ assertEqualInt(1, touch("test4/d1/foo", 0));
/* Does bsdtar support -s option ? */
- systemf("%s -cf - -s /foo/bar/ test4/d1/foo > NUL 2> check.err",
+ systemf("%s -cf - -s /foo/bar/ test4/d1/foo > check.out 2> check.err",
testprog);
assertEqualInt(0, stat("check.err", &st));
if (st.st_size == 0) {
@@ -148,6 +182,7 @@ DEFINE_TEST(test_option_T)
} else {
skipping("bsdtar does not support -s option on this platform");
}
+
/* TODO: Include some use of -C directory-changing within the filelist. */
/* I'm pretty sure -C within the filelist is broken on extract. */
}
diff --git a/usr.bin/tar/test/test_option_q.c b/usr.bin/tar/test/test_option_q.c
index 1d92dd5..c8e9540 100644
--- a/usr.bin/tar/test/test_option_q.c
+++ b/usr.bin/tar/test/test_option_q.c
@@ -27,7 +27,8 @@ __FBSDID("$FreeBSD$");
DEFINE_TEST(test_option_q)
{
- int fd;
+ FILE *f;
+ int r;
/*
* Create an archive with several different versions of the
@@ -39,38 +40,38 @@ DEFINE_TEST(test_option_q)
* what we use to build up the test archive.
*/
- fd = open("foo", O_CREAT | O_WRONLY, 0644);
- assert(fd >= 0);
- assertEqualInt(4, write(fd, "foo1", 4));
- close(fd);
+ f = fopen("foo", "w");
+ assert(f != NULL);
+ fprintf(f, "foo1");
+ fclose(f);
assertEqualInt(0, systemf("%s -cf archive.tar foo", testprog));
- fd = open("foo", O_TRUNC | O_WRONLY, 0644);
- assert(fd >= 0);
- assertEqualInt(4, write(fd, "foo2", 4));
- close(fd);
+ f = fopen("foo", "w");
+ assert(f != NULL);
+ fprintf(f, "foo2");
+ fclose(f);
assertEqualInt(0, systemf("%s -rf archive.tar foo", testprog));
- fd = open("bar", O_CREAT | O_WRONLY, 0644);
- assert(fd >= 0);
- assertEqualInt(4, write(fd, "bar1", 4));
- close(fd);
+ f = fopen("bar", "w");
+ assert(f != NULL);
+ fprintf(f, "bar1");
+ fclose(f);
assertEqualInt(0, systemf("%s -rf archive.tar bar", testprog));
- fd = open("foo", O_TRUNC | O_WRONLY, 0644);
- assert(fd >= 0);
- assertEqualInt(4, write(fd, "foo3", 4));
- close(fd);
+ f = fopen("foo", "w");
+ assert(f != NULL);
+ fprintf(f, "foo3");
+ fclose(f);
assertEqualInt(0, systemf("%s -rf archive.tar foo", testprog));
- fd = open("bar", O_TRUNC | O_WRONLY, 0644);
- assert(fd >= 0);
- assertEqualInt(4, write(fd, "bar2", 4));
- close(fd);
+ f = fopen("bar", "w");
+ assert(f != NULL);
+ fprintf(f, "bar2");
+ fclose(f);
assertEqualInt(0, systemf("%s -rf archive.tar bar", testprog));
@@ -80,46 +81,49 @@ DEFINE_TEST(test_option_q)
*/
/* Test 1: -q foo should only extract the first foo. */
- assertEqualInt(0, mkdir("test1", 0755));
- assertEqualInt(0, chdir("test1"));
- assertEqualInt(0,
- systemf("%s -xf ../archive.tar -q foo >test.out 2>test.err",
- testprog));
+ assertMakeDir("test1", 0755);
+ assertChdir("test1");
+ r = systemf("%s -xf ../archive.tar -q foo >test.out 2>test.err",
+ testprog);
+ failure("Fatal error trying to use -q option");
+ if (!assertEqualInt(0, r))
+ return;
+
assertFileContents("foo1", 4, "foo");
assertEmptyFile("test.out");
assertEmptyFile("test.err");
- assertEqualInt(0, chdir(".."));
+ assertChdir("..");
/* Test 2: -q foo bar should extract up to the first bar. */
- assertEqualInt(0, mkdir("test2", 0755));
- assertEqualInt(0, chdir("test2"));
+ assertMakeDir("test2", 0755);
+ assertChdir("test2");
assertEqualInt(0,
systemf("%s -xf ../archive.tar -q foo bar >test.out 2>test.err", testprog));
assertFileContents("foo2", 4, "foo");
assertFileContents("bar1", 4, "bar");
assertEmptyFile("test.out");
assertEmptyFile("test.err");
- assertEqualInt(0, chdir(".."));
+ assertChdir("..");
/* Test 3: Same as test 2, but use --fast-read spelling. */
- assertEqualInt(0, mkdir("test3", 0755));
- assertEqualInt(0, chdir("test3"));
+ assertMakeDir("test3", 0755);
+ assertChdir("test3");
assertEqualInt(0,
systemf("%s -xf ../archive.tar --fast-read foo bar >test.out 2>test.err", testprog));
assertFileContents("foo2", 4, "foo");
assertFileContents("bar1", 4, "bar");
assertEmptyFile("test.out");
assertEmptyFile("test.err");
- assertEqualInt(0, chdir(".."));
+ assertChdir("..");
/* Test 4: Without -q, should extract everything. */
- assertEqualInt(0, mkdir("test4", 0755));
- assertEqualInt(0, chdir("test4"));
+ assertMakeDir("test4", 0755);
+ assertChdir("test4");
assertEqualInt(0,
systemf("%s -xf ../archive.tar foo bar >test.out 2>test.err", testprog));
assertFileContents("foo3", 4, "foo");
assertFileContents("bar2", 4, "bar");
assertEmptyFile("test.out");
assertEmptyFile("test.err");
- assertEqualInt(0, chdir(".."));
+ assertChdir("..");
}
diff --git a/usr.bin/tar/test/test_option_r.c b/usr.bin/tar/test/test_option_r.c
new file mode 100644
index 0000000..516a830
--- /dev/null
+++ b/usr.bin/tar/test/test_option_r.c
@@ -0,0 +1,117 @@
+/*-
+ * Copyright (c) 2003-2007 Tim Kientzle
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR(S) ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+#include "test.h"
+__FBSDID("$FreeBSD$");
+
+/*
+ * Also see test_option_q for additional validation of -r support.
+ */
+DEFINE_TEST(test_option_r)
+{
+ char buff[15];
+ char *p0, *p1;
+ size_t s;
+ FILE *f;
+ int r;
+
+ /* Create a file */
+ f = fopen("f1", "w");
+ if (!assert(f != NULL))
+ return;
+ assertEqualInt(3, fwrite("abc", 1, 3, f));
+ fclose(f);
+
+ /* Archive that one file. */
+ r = systemf("%s cf archive.tar --format=ustar f1 >step1.out 2>step1.err", testprog);
+ failure("Error invoking %s cf archive.tar f1", testprog);
+ assertEqualInt(r, 0);
+
+ /* Verify that nothing went to stdout or stderr. */
+ assertEmptyFile("step1.out");
+ assertEmptyFile("step1.err");
+
+
+ /* Do some basic validation of the constructed archive. */
+ p0 = slurpfile(&s, "archive.tar");
+ if (!assert(p0 != NULL))
+ return;
+ if (!assert(s >= 2048)) {
+ free(p0);
+ return;
+ }
+ assertEqualMem(p0 + 0, "f1", 3);
+ assertEqualMem(p0 + 512, "abc", 3);
+ assertEqualMem(p0 + 1024, "\0\0\0\0\0\0\0\0", 8);
+ assertEqualMem(p0 + 1536, "\0\0\0\0\0\0\0\0", 8);
+
+ /* Edit that file */
+ f = fopen("f1", "w");
+ if (!assert(f != NULL))
+ return;
+ assertEqualInt(3, fwrite("123", 1, 3, f));
+ fclose(f);
+
+ /* Update the archive. */
+ r = systemf("%s rf archive.tar --format=ustar f1 >step2.out 2>step2.err", testprog);
+ failure("Error invoking %s rf archive.tar f1", testprog);
+ assertEqualInt(r, 0);
+
+ /* Verify that nothing went to stdout or stderr. */
+ assertEmptyFile("step2.out");
+ assertEmptyFile("step2.err");
+
+ /* Do some basic validation of the constructed archive. */
+ p1 = slurpfile(&s, "archive.tar");
+ if (!assert(p1 != NULL)) {
+ free(p0);
+ return;
+ }
+ assert(s >= 3072);
+ /* Verify first entry is unchanged. */
+ assertEqualMem(p0, p1, 1024);
+ /* Verify that second entry is correct. */
+ assertEqualMem(p1 + 1024, "f1", 3);
+ assertEqualMem(p1 + 1536, "123", 3);
+ /* Verify end-of-archive marker. */
+ assertEqualMem(p1 + 2048, "\0\0\0\0\0\0\0\0", 8);
+ assertEqualMem(p1 + 2560, "\0\0\0\0\0\0\0\0", 8);
+ free(p0);
+ free(p1);
+
+ /* Unpack both items */
+ assertMakeDir("step3", 0775);
+ assertChdir("step3");
+ r = systemf("%s xf ../archive.tar", testprog);
+ failure("Error invoking %s xf archive.tar", testprog);
+ assertEqualInt(r, 0);
+
+ /* Verify that the second one overwrote the first. */
+ f = fopen("f1", "r");
+ if (assert(f != NULL)) {
+ assertEqualInt(3, fread(buff, 1, 3, f));
+ assertEqualMem(buff, "123", 3);
+ fclose(f);
+ }
+}
diff --git a/usr.bin/tar/test/test_option_s.c b/usr.bin/tar/test/test_option_s.c
index c9a6899..94d6345 100644
--- a/usr.bin/tar/test/test_option_s.c
+++ b/usr.bin/tar/test/test_option_s.c
@@ -28,15 +28,15 @@ __FBSDID("$FreeBSD$");
static int
mkfile(const char *fn, const char *contents)
{
- int fd = open(fn, O_RDWR | O_CREAT, 0644);
- failure("Couldn't create file '%s', fd=%d, errno=%d (%s)\n",
- fn, fd, errno, strerror(errno));
- if (!assert(fd > 0))
+ FILE *f = fopen(fn, "w");
+ failure("Couldn't create file '%s', errno=%d (%s)\n",
+ fn, errno, strerror(errno));
+ if (!assert(f != NULL))
return (1); /* Failure. */
if (contents != NULL)
assertEqualInt(strlen(contents),
- write(fd, contents, strlen(contents)));
- assertEqualInt(0, close(fd));
+ fwrite(contents, 1, strlen(contents), f));
+ assertEqualInt(0, fclose(f));
return (0); /* Success */
}
@@ -44,9 +44,9 @@ DEFINE_TEST(test_option_s)
{
struct stat st;
- /* Create a sample file hierarchy. */
- assertEqualInt(0, mkdir("in", 0755));
- assertEqualInt(0, mkdir("in/d1", 0755));
+ /* Create a sample file heirarchy. */
+ assertMakeDir("in", 0755);
+ assertMakeDir("in/d1", 0755);
assertEqualInt(0, mkfile("in/d1/foo", "foo"));
assertEqualInt(0, mkfile("in/d1/bar", "bar"));
@@ -55,14 +55,15 @@ DEFINE_TEST(test_option_s)
testprog);
assertEqualInt(0, stat("check.err", &st));
if (st.st_size != 0) {
- skipping("bsdtar does not support -s option on this platform");
+ skipping("%s does not support -s option on this platform",
+ testprog);
return;
}
/*
* Test 1: Filename substitution when creating archives.
*/
- assertEqualInt(0, mkdir("test1", 0755));
+ assertMakeDir("test1", 0755);
systemf("%s -cf - -s /foo/bar/ in/d1/foo | %s -xf - -C test1",
testprog, testprog);
assertFileContents("foo", 3, "test1/in/d1/bar");
@@ -74,7 +75,7 @@ DEFINE_TEST(test_option_s)
/*
* Test 2: Basic substitution when extracting archive.
*/
- assertEqualInt(0, mkdir("test2", 0755));
+ assertMakeDir("test2", 0755);
systemf("%s -cf - in/d1/foo | %s -xf - -s /foo/bar/ -C test2",
testprog, testprog);
assertFileContents("foo", 3, "test2/in/d1/bar");
@@ -89,7 +90,7 @@ DEFINE_TEST(test_option_s)
/*
* Test 4: Multiple substitutions when extracting archive.
*/
- assertEqualInt(0, mkdir("test4", 0755));
+ assertMakeDir("test4", 0755);
systemf("%s -cf - in/d1/foo in/d1/bar | %s -xf - -s /foo/bar/ -s }bar}baz} -C test4",
testprog, testprog);
assertFileContents("foo", 3, "test4/in/d1/bar");
@@ -98,7 +99,7 @@ DEFINE_TEST(test_option_s)
/*
* Test 5: Name-switching substitutions when extracting archive.
*/
- assertEqualInt(0, mkdir("test5", 0755));
+ assertMakeDir("test5", 0755);
systemf("%s -cf - in/d1/foo in/d1/bar | %s -xf - -s /foo/bar/ -s }bar}foo} -C test5",
testprog, testprog);
assertFileContents("foo", 3, "test5/in/d1/bar");
diff --git a/usr.bin/tar/test/test_patterns.c b/usr.bin/tar/test/test_patterns.c
index 66a4ecf..f909e27 100644
--- a/usr.bin/tar/test/test_patterns.c
+++ b/usr.bin/tar/test/test_patterns.c
@@ -28,11 +28,17 @@ __FBSDID("$FreeBSD$");
DEFINE_TEST(test_patterns)
{
- int fd, r;
+ FILE *f;
+ int r;
const char *reffile2 = "test_patterns_2.tar";
const char *reffile3 = "test_patterns_3.tar";
const char *reffile4 = "test_patterns_4.tar";
- const char *p;
+
+ const char *tar2aExpected[] = {
+ "/tmp/foo/bar/",
+ "/tmp/foo/bar/baz",
+ NULL
+ };
/*
* Test basic command-line pattern handling.
@@ -44,12 +50,12 @@ DEFINE_TEST(test_patterns)
*
* John Baldwin reported this problem in PR bin/121598
*/
- fd = open("foo", O_CREAT | O_WRONLY, 0644);
- assert(fd >= 0);
- close(fd);
+ f = fopen("foo", "w");
+ assert(f != NULL);
+ fclose(f);
r = systemf("%s cfv tar1.tgz foo > tar1a.out 2> tar1a.err", testprog);
assertEqualInt(r, 0);
- r = systemf("%s xfv tar1.tgz foo bar > tar1b.out 2> tar1b.err", testprog);
+ r = systemf("%s xv --no-same-owner -f tar1.tgz foo bar > tar1b.out 2> tar1b.err", testprog);
failure("tar should return non-zero because a file was given on the command line that's not in the archive");
assert(r != 0);
@@ -61,12 +67,7 @@ DEFINE_TEST(test_patterns)
r = systemf("%s tf %s /tmp/foo/bar > tar2a.out 2> tar2a.err",
testprog, reffile2);
assertEqualInt(r, 0);
-#if !defined(_WIN32) || defined(__CYGWIN__)
- p = "/tmp/foo/bar/\n/tmp/foo/bar/baz\n";
-#else
- p = "/tmp/foo/bar/\r\n/tmp/foo/bar/baz\r\n";
-#endif
- assertFileContents(p, strlen(p), "tar2a.out");
+ assertFileContainsLinesAnyOrder("tar2a.out", tar2aExpected);
assertEmptyFile("tar2a.err");
/*
@@ -75,7 +76,7 @@ DEFINE_TEST(test_patterns)
extract_reference_file(reffile3);
/* Test 3a: Pattern tmp/foo/bar should not match /tmp/foo/bar */
- r = systemf("%s xf %s tmp/foo/bar > tar3a.out 2> tar3a.err",
+ r = systemf("%s x --no-same-owner -f %s tmp/foo/bar > tar3a.out 2> tar3a.err",
testprog, reffile3);
assert(r != 0);
assertEmptyFile("tar3a.out");
@@ -83,26 +84,26 @@ DEFINE_TEST(test_patterns)
/* Test 3b: Pattern /tmp/foo/baz should not match tmp/foo/baz */
assertNonEmptyFile("tar3a.err");
/* Again, with the '/' */
- r = systemf("%s xf %s /tmp/foo/baz > tar3b.out 2> tar3b.err",
+ r = systemf("%s x --no-same-owner -f %s /tmp/foo/baz > tar3b.out 2> tar3b.err",
testprog, reffile3);
assert(r != 0);
assertEmptyFile("tar3b.out");
assertNonEmptyFile("tar3b.err");
/* Test 3c: ./tmp/foo/bar should not match /tmp/foo/bar */
- r = systemf("%s xf %s ./tmp/foo/bar > tar3c.out 2> tar3c.err",
+ r = systemf("%s x --no-same-owner -f %s ./tmp/foo/bar > tar3c.out 2> tar3c.err",
testprog, reffile3);
assert(r != 0);
assertEmptyFile("tar3c.out");
assertNonEmptyFile("tar3c.err");
/* Test 3d: ./tmp/foo/baz should match tmp/foo/baz */
- r = systemf("%s xf %s ./tmp/foo/baz > tar3d.out 2> tar3d.err",
+ r = systemf("%s x --no-same-owner -f %s ./tmp/foo/baz > tar3d.out 2> tar3d.err",
testprog, reffile3);
assertEqualInt(r, 0);
assertEmptyFile("tar3d.out");
assertEmptyFile("tar3d.err");
- assertEqualInt(0, access("tmp/foo/baz/bar", F_OK));
+ assertFileExists("tmp/foo/baz/bar");
/*
* Test 4 archive has some entries starting with windows drive letters
@@ -110,7 +111,7 @@ DEFINE_TEST(test_patterns)
*/
extract_reference_file(reffile4);
- r = systemf("%s xf %s -C tmp > tar4.out 2> tar4.err",
+ r = systemf("%s x --no-same-owner -f %s -C tmp > tar4.out 2> tar4.err",
testprog, reffile4);
assert(r != 0);
assertEmptyFile("tar4.out");
@@ -167,16 +168,16 @@ DEFINE_TEST(test_patterns)
* c:../..\file43
* \/?\UnC\../file54
*/
- assertEqualInt(-1, access(filex, F_OK));
+ assertFileNotExists(filex);
filex = file_c;
xsize = sizeof(file_c);
filex[xsize-3] = '0' + r / 10;
filex[xsize-2] = '0' + r % 10;
- assertEqualInt(-1, access(filex, F_OK));
+ assertFileNotExists(filex);
break;
default:
/* Extracted patterns. */
- assertEqualInt(0, access(filex, F_OK));
+ assertFileExists(filex);
break;
}
}
diff --git a/usr.bin/tar/test/test_patterns_2.tar.uu b/usr.bin/tar/test/test_patterns_2.tar.uu
index 1ed9a7d..f3a0a75 100644
--- a/usr.bin/tar/test/test_patterns_2.tar.uu
+++ b/usr.bin/tar/test/test_patterns_2.tar.uu
@@ -1,4 +1,5 @@
$FreeBSD$
+
begin 644 test_patterns_2.tar
M+W1M<"]F;V\O````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
diff --git a/usr.bin/tar/test/test_patterns_3.tar.uu b/usr.bin/tar/test/test_patterns_3.tar.uu
index e8d487e..8a19f80 100644
--- a/usr.bin/tar/test/test_patterns_3.tar.uu
+++ b/usr.bin/tar/test/test_patterns_3.tar.uu
@@ -1,4 +1,5 @@
$FreeBSD$
+
begin 644 test_patterns_3.tar
M+W1M<"]F;V\O8F%R+P``````````````````````````````````````````
M````````````````````````````````````````````````````````````
diff --git a/usr.bin/tar/test/test_patterns_4.tar.uu b/usr.bin/tar/test/test_patterns_4.tar.uu
index eb89518..3fc62e4 100644
--- a/usr.bin/tar/test/test_patterns_4.tar.uu
+++ b/usr.bin/tar/test/test_patterns_4.tar.uu
@@ -1,4 +1,5 @@
$FreeBSD$
+
begin 644 test_patterns_4.tar
M+V9I;&4P,0``````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
diff --git a/usr.bin/tar/test/test_stdio.c b/usr.bin/tar/test/test_stdio.c
index 2d24ae3..1780d96 100644
--- a/usr.bin/tar/test/test_stdio.c
+++ b/usr.bin/tar/test/test_stdio.c
@@ -27,27 +27,27 @@ __FBSDID("$FreeBSD$");
DEFINE_TEST(test_stdio)
{
- int fd;
- int filelist;
- int oldumask;
+ FILE *filelist;
+ char *p;
+ size_t s;
int r;
- oldumask = umask(0);
+ assertUmask(0);
/*
* Create a couple of files on disk.
*/
- filelist = open("filelist", O_CREAT | O_WRONLY, 0644);
/* File */
- fd = open("f", O_CREAT | O_WRONLY, 0644);
- assert(fd >= 0);
- write(fd, "f\n", 2);
- close(fd);
- write(filelist, "f\n", 2);
+ assertMakeFile("f", 0755, "abc");
/* Link to above file. */
- assertEqualInt(0, link("f", "l"));
- write(filelist, "l\n", 2);
- close(filelist);
+ assertMakeHardlink("l", "f");
+
+ /* Create file list (text mode here) */
+ filelist = fopen("filelist", "w");
+ assert(filelist != NULL);
+ fprintf(filelist, "f\n");
+ fprintf(filelist, "l\n");
+ fclose(filelist);
/*
* Archive/dearchive with a variety of options, verifying
@@ -111,7 +111,10 @@ DEFINE_TEST(test_stdio)
/* 'xvOf' should generate list on stderr, file contents on stdout. */
r = systemf("%s xvOf archive >xvOf.out 2>xvOf.err", testprog);
assertEqualInt(r, 0);
- /* TODO: Verify xvOf.out */
+ /* Verify xvOf.out is the file contents */
+ p = slurpfile(&s, "xvOf.out");
+ assert(s = 3);
+ assertEqualMem(p, "abc", 3);
/* TODO: Verify xvf.err */
/* 'xvf -' should generate list on stderr, empty stdout. */
@@ -119,6 +122,4 @@ DEFINE_TEST(test_stdio)
assertEqualInt(r, 0);
assertEmptyFile("xvf-.out");
/* TODO: Verify xvf-.err */
-
- umask(oldumask);
}
diff --git a/usr.bin/tar/test/test_strip_components.c b/usr.bin/tar/test/test_strip_components.c
index 38e0e48..271f209 100644
--- a/usr.bin/tar/test/test_strip_components.c
+++ b/usr.bin/tar/test/test_strip_components.c
@@ -28,50 +28,49 @@ __FBSDID("$FreeBSD$");
static int
touch(const char *fn)
{
- int fd = open(fn, O_RDWR | O_CREAT, 0644);
- failure("Couldn't create file '%s', fd=%d, errno=%d (%s)\n",
- fn, fd, errno, strerror(errno));
- if (!assert(fd > 0))
+ FILE *f = fopen(fn, "w");
+ failure("Couldn't create file '%s', errno=%d (%s)\n",
+ fn, errno, strerror(errno));
+ if (!assert(f != NULL))
return (0); /* Failure. */
- close(fd);
+ fclose(f);
return (1); /* Success */
}
DEFINE_TEST(test_strip_components)
{
- struct stat st;
-
- assertEqualInt(0, mkdir("d0", 0755));
- assertEqualInt(0, chdir("d0"));
- assertEqualInt(0, mkdir("d1", 0755));
- assertEqualInt(0, mkdir("d1/d2", 0755));
- assertEqualInt(0, mkdir("d1/d2/d3", 0755));
+ assertMakeDir("d0", 0755);
+ assertChdir("d0");
+ assertMakeDir("d1", 0755);
+ assertMakeDir("d1/d2", 0755);
+ assertMakeDir("d1/d2/d3", 0755);
assertEqualInt(1, touch("d1/d2/f1"));
- assertEqualInt(0, link("d1/d2/f1", "l1"));
- assertEqualInt(0, link("d1/d2/f1", "d1/l2"));
- assertEqualInt(0, symlink("d1/d2/f1", "s1"));
- assertEqualInt(0, symlink("d2/f1", "d1/s2"));
- assertEqualInt(0, chdir(".."));
+ assertMakeHardlink("l1", "d1/d2/f1");
+ assertMakeHardlink("d1/l2", "d1/d2/f1");
+ if (canSymlink()) {
+ assertMakeSymlink("s1", "d1/d2/f1");
+ assertMakeSymlink("d1/s2", "d2/f1");
+ }
+ assertChdir("..");
assertEqualInt(0, systemf("%s -cf test.tar d0", testprog));
- assertEqualInt(0, mkdir("target", 0755));
+ assertMakeDir("target", 0755);
assertEqualInt(0, systemf("%s -x -C target --strip-components 2 "
"-f test.tar", testprog));
failure("d0/ is too short and should not get restored");
- assertEqualInt(-1, lstat("target/d0", &st));
+ assertFileNotExists("target/d0");
failure("d0/d1/ is too short and should not get restored");
- assertEqualInt(-1, lstat("target/d1", &st));
+ assertFileNotExists("target/d1");
failure("d0/d1/s2 is a symlink to something that won't be extracted");
-#if !defined(_WIN32) || defined(__CYGWIN__)
- assertEqualInt(-1, stat("target/s2", &st));
-#else
- skipping("symlink with stat()");
-#endif
- assertEqualInt(0, lstat("target/s2", &st));
+ /* If platform supports symlinks, target/s2 is a broken symlink. */
+ /* If platform does not support symlink, target/s2 doesn't exist. */
+ assertFileNotExists("target/s2");
+ if (canSymlink())
+ assertIsSymlink("target/s2", "d2/f1");
failure("d0/d1/d2 should be extracted");
- assertEqualInt(0, lstat("target/d2", &st));
+ assertIsDir("target/d2", -1);
/*
* This next is a complicated case. d0/l1, d0/d1/l2, and
@@ -102,9 +101,9 @@ DEFINE_TEST(test_strip_components)
* parallel tests for cpio and newc formats.
*/
failure("d0/l1 is too short and should not get restored");
- assertEqualInt(-1, lstat("target/l1", &st));
+ assertFileNotExists("target/l1");
failure("d0/d1/l2 is a hardlink to file whose name was too short");
- assertEqualInt(-1, lstat("target/l2", &st));
+ assertFileNotExists("target/l2");
failure("d0/d1/d2/f1 is a hardlink to file whose name was too short");
- assertEqualInt(-1, lstat("target/d2/f1", &st));
+ assertFileNotExists("target/d2/f1");
}
diff --git a/usr.bin/tar/test/test_symlink_dir.c b/usr.bin/tar/test/test_symlink_dir.c
index 356f17c..f0cfebb 100644
--- a/usr.bin/tar/test/test_symlink_dir.c
+++ b/usr.bin/tar/test/test_symlink_dir.c
@@ -32,40 +32,36 @@ __FBSDID("$FreeBSD$");
*/
static int
-mkfile(const char *name, int mode, const char *contents, ssize_t size)
+mkfile(const char *name, int mode, const char *contents, size_t size)
{
- int fd = open(name, O_CREAT | O_WRONLY, mode);
- if (fd < 0)
+ FILE *f = fopen(name, "wb");
+ size_t written;
+
+ (void)mode; /* UNUSED */
+ if (f == NULL)
return (-1);
- if (size != write(fd, contents, size)) {
- close(fd);
+ written = fwrite(contents, 1, size, f);
+ fclose(f);
+ if (size != written)
return (-1);
- }
- close(fd);
return (0);
}
DEFINE_TEST(test_symlink_dir)
{
- struct stat st;
-#if !defined(_WIN32) || defined(__CYGWIN__)
- struct stat st2;
-#endif
- int oldumask;
-
- oldumask = umask(0);
+ assertUmask(0);
- assertEqualInt(0, mkdir("source", 0755));
+ assertMakeDir("source", 0755);
assertEqualInt(0, mkfile("source/file", 0755, "a", 1));
assertEqualInt(0, mkfile("source/file2", 0755, "ab", 2));
- assertEqualInt(0, mkdir("source/dir", 0755));
- assertEqualInt(0, mkdir("source/dir/d", 0755));
+ assertMakeDir("source/dir", 0755);
+ assertMakeDir("source/dir/d", 0755);
assertEqualInt(0, mkfile("source/dir/f", 0755, "abc", 3));
- assertEqualInt(0, mkdir("source/dir2", 0755));
- assertEqualInt(0, mkdir("source/dir2/d2", 0755));
+ assertMakeDir("source/dir2", 0755);
+ assertMakeDir("source/dir2/d2", 0755);
assertEqualInt(0, mkfile("source/dir2/f2", 0755, "abcd", 4));
- assertEqualInt(0, mkdir("source/dir3", 0755));
- assertEqualInt(0, mkdir("source/dir3/d3", 0755));
+ assertMakeDir("source/dir3", 0755);
+ assertMakeDir("source/dir3/d3", 0755);
assertEqualInt(0, mkfile("source/dir3/f3", 0755, "abcde", 5));
assertEqualInt(0,
@@ -75,119 +71,90 @@ DEFINE_TEST(test_symlink_dir)
/*
* Extract with -x and without -P.
*/
- assertEqualInt(0, mkdir("dest1", 0755));
- /* "dir" is a symlink to an existing "real_dir" */
- assertEqualInt(0, mkdir("dest1/real_dir", 0755));
-#if !defined(_WIN32) || defined(__CYGWIN__)
- assertEqualInt(0, symlink("real_dir", "dest1/dir"));
- /* "dir2" is a symlink to a non-existing "real_dir2" */
- assertEqualInt(0, symlink("real_dir2", "dest1/dir2"));
-#else
- skipping("symlink does not work on this platform");
-#endif
+ assertMakeDir("dest1", 0755);
+ /* "dir" is a symlink to an existing "dest1/real_dir" */
+ assertMakeDir("dest1/real_dir", 0755);
+ if (canSymlink()) {
+ assertMakeSymlink("dest1/dir", "real_dir");
+ /* "dir2" is a symlink to a non-existing "real_dir2" */
+ assertMakeSymlink("dest1/dir2", "real_dir2");
+ } else {
+ skipping("some symlink checks");
+ }
/* "dir3" is a symlink to an existing "non_dir3" */
assertEqualInt(0, mkfile("dest1/non_dir3", 0755, "abcdef", 6));
- assertEqualInt(0, symlink("non_dir3", "dest1/dir3"));
+ if (canSymlink())
+ assertMakeSymlink("dest1/dir3", "non_dir3");
/* "file" is a symlink to existing "real_file" */
assertEqualInt(0, mkfile("dest1/real_file", 0755, "abcdefg", 7));
- assertEqualInt(0, symlink("real_file", "dest1/file"));
-#if !defined(_WIN32) || defined(__CYGWIN__)
- /* "file2" is a symlink to non-existing "real_file2" */
- assertEqualInt(0, symlink("real_file2", "dest1/file2"));
-#else
- skipping("symlink does not work on this platform");
-#endif
+ if (canSymlink()) {
+ assertMakeSymlink("dest1/file", "real_file");
+ /* "file2" is a symlink to non-existing "real_file2" */
+ assertMakeSymlink("dest1/file2", "real_file2");
+ }
assertEqualInt(0, systemf("%s -xf test.tar -C dest1", testprog));
- /* dest1/dir symlink should be removed */
- assertEqualInt(0, lstat("dest1/dir", &st));
+ /* dest1/dir symlink should be replaced */
failure("symlink to dir was followed when it shouldn't be");
- assert(S_ISDIR(st.st_mode));
- /* dest1/dir2 symlink should be removed */
- assertEqualInt(0, lstat("dest1/dir2", &st));
+ assertIsDir("dest1/dir", -1);
+ /* dest1/dir2 symlink should be replaced */
failure("Broken symlink wasn't replaced with dir");
- assert(S_ISDIR(st.st_mode));
- /* dest1/dir3 symlink should be removed */
- assertEqualInt(0, lstat("dest1/dir3", &st));
+ assertIsDir("dest1/dir2", -1);
+ /* dest1/dir3 symlink should be replaced */
failure("Symlink to non-dir wasn't replaced with dir");
- assert(S_ISDIR(st.st_mode));
- /* dest1/file symlink should be removed */
- assertEqualInt(0, lstat("dest1/file", &st));
- failure("Symlink to existing file should be removed");
- assert(S_ISREG(st.st_mode));
- /* dest1/file2 symlink should be removed */
- assertEqualInt(0, lstat("dest1/file2", &st));
- failure("Symlink to non-existing file should be removed");
- assert(S_ISREG(st.st_mode));
+ assertIsDir("dest1/dir3", -1);
+ /* dest1/file symlink should be replaced */
+ failure("Symlink to existing file should be replaced");
+ assertIsReg("dest1/file", -1);
+ /* dest1/file2 symlink should be replaced */
+ failure("Symlink to non-existing file should be replaced");
+ assertIsReg("dest1/file2", -1);
/*
* Extract with both -x and -P
*/
- assertEqualInt(0, mkdir("dest2", 0755));
+ assertMakeDir("dest2", 0755);
/* "dir" is a symlink to existing "real_dir" */
- assertEqualInt(0, mkdir("dest2/real_dir", 0755));
-#if !defined(_WIN32) || defined(__CYGWIN__)
- assertEqualInt(0, symlink("real_dir", "dest2/dir"));
+ assertMakeDir("dest2/real_dir", 0755);
+ if (canSymlink())
+ assertMakeSymlink("dest2/dir", "real_dir");
/* "dir2" is a symlink to a non-existing "real_dir2" */
- assertEqualInt(0, symlink("real_dir2", "dest2/dir2"));
-#else
- skipping("symlink does not work on this platform");
-#endif
+ if (canSymlink())
+ assertMakeSymlink("dest2/dir2", "real_dir2");
/* "dir3" is a symlink to an existing "non_dir3" */
assertEqualInt(0, mkfile("dest2/non_dir3", 0755, "abcdefgh", 8));
- assertEqualInt(0, symlink("non_dir3", "dest2/dir3"));
+ if (canSymlink())
+ assertMakeSymlink("dest2/dir3", "non_dir3");
/* "file" is a symlink to existing "real_file" */
assertEqualInt(0, mkfile("dest2/real_file", 0755, "abcdefghi", 9));
- assertEqualInt(0, symlink("real_file", "dest2/file"));
-#if !defined(_WIN32) || defined(__CYGWIN__)
+ if (canSymlink())
+ assertMakeSymlink("dest2/file", "real_file");
/* "file2" is a symlink to non-existing "real_file2" */
- assertEqualInt(0, symlink("real_file2", "dest2/file2"));
-#else
- skipping("symlink does not work on this platform");
-#endif
+ if (canSymlink())
+ assertMakeSymlink("dest2/file2", "real_file2");
assertEqualInt(0, systemf("%s -xPf test.tar -C dest2", testprog));
/* dest2/dir symlink should be followed */
- assertEqualInt(0, lstat("dest2/dir", &st));
- failure("tar -xP removed symlink instead of following it");
-#if !defined(_WIN32) || defined(__CYGWIN__)
- if (assert(S_ISLNK(st.st_mode))) {
- /* Only verify what the symlink points to if it
- * really is a symlink. */
- failure("The symlink should point to a directory");
- assertEqualInt(0, stat("dest2/dir", &st));
- assert(S_ISDIR(st.st_mode));
- failure("The pre-existing directory should still be there");
- assertEqualInt(0, lstat("dest2/real_dir", &st2));
- assert(S_ISDIR(st2.st_mode));
- assertEqualInt(st.st_dev, st2.st_dev);
- failure("symlink should still point to the existing directory");
- assertEqualInt(st.st_ino, st2.st_ino);
+ if (canSymlink()) {
+ assertIsSymlink("dest2/dir", "real_dir");
+ assertIsDir("dest2/real_dir", -1);
}
-#else
- skipping("symlink does not work on this platform");
-#endif
+
/* Contents of 'dir' should be restored */
- assertEqualInt(0, lstat("dest2/dir/d", &st));
- assert(S_ISDIR(st.st_mode));
- assertEqualInt(0, lstat("dest2/dir/f", &st));
- assert(S_ISREG(st.st_mode));
- assertEqualInt(3, st.st_size);
+ assertIsDir("dest2/dir/d", -1);
+ assertIsReg("dest2/dir/f", -1);
+ assertFileSize("dest2/dir/f", 3);
/* dest2/dir2 symlink should be removed */
- assertEqualInt(0, lstat("dest2/dir2", &st));
failure("Broken symlink wasn't replaced with dir");
- assert(S_ISDIR(st.st_mode));
+ assertIsDir("dest2/dir2", -1);
/* dest2/dir3 symlink should be removed */
- assertEqualInt(0, lstat("dest2/dir3", &st));
failure("Symlink to non-dir wasn't replaced with dir");
- assert(S_ISDIR(st.st_mode));
+ assertIsDir("dest2/dir3", -1);
/* dest2/file symlink should be removed;
* even -P shouldn't follow symlinks for files */
- assertEqualInt(0, lstat("dest2/file", &st));
failure("Symlink to existing file should be removed");
- assert(S_ISREG(st.st_mode));
+ assertIsReg("dest2/file", -1);
/* dest2/file2 symlink should be removed */
- assertEqualInt(0, lstat("dest2/file2", &st));
failure("Symlink to non-existing file should be removed");
- assert(S_ISREG(st.st_mode));
+ assertIsReg("dest2/file2", -1);
}
diff --git a/usr.bin/tar/test/test_version.c b/usr.bin/tar/test/test_version.c
index 4f249a5..e4aacc8 100644
--- a/usr.bin/tar/test/test_version.c
+++ b/usr.bin/tar/test/test_version.c
@@ -52,7 +52,8 @@ DEFINE_TEST(test_version)
/* Version message should start with name of program, then space. */
assert(s > 6);
failure("Version must start with 'bsdtar': ``%s''", p);
- assertEqualMem(q, "bsdtar ", 7);
+ if (!assertEqualMem(q, "bsdtar ", 7))
+ return;
q += 7; s -= 7;
/* Version number is a series of digits and periods. */
while (s > 0 && (*q == '.' || (*q >= '0' && *q <= '9'))) {
diff --git a/usr.bin/tar/util.c b/usr.bin/tar/util.c
index 4177e9c..8e8b4a5 100644
--- a/usr.bin/tar/util.c
+++ b/usr.bin/tar/util.c
@@ -293,7 +293,7 @@ set_chdir(struct bsdtar *bsdtar, const char *newdir)
free(old_pending);
}
if (bsdtar->pending_chdir == NULL)
- bsdtar_errc(1, errno, "No memory");
+ lafe_errc(1, errno, "No memory");
}
void
@@ -303,7 +303,7 @@ do_chdir(struct bsdtar *bsdtar)
return;
if (chdir(bsdtar->pending_chdir) != 0) {
- bsdtar_errc(1, 0, "could not chdir to '%s'\n",
+ lafe_errc(1, 0, "could not chdir to '%s'\n",
bsdtar->pending_chdir);
}
free(bsdtar->pending_chdir);
@@ -367,7 +367,7 @@ edit_pathname(struct bsdtar *bsdtar, struct archive_entry *entry)
#if HAVE_REGEX_H
r = apply_substitution(bsdtar, name, &subst_name, 0);
if (r == -1) {
- bsdtar_warnc(0, "Invalid substitution, skipping entry");
+ lafe_warnc(0, "Invalid substitution, skipping entry");
return 1;
}
if (r == 1) {
@@ -383,7 +383,7 @@ edit_pathname(struct bsdtar *bsdtar, struct archive_entry *entry)
if (archive_entry_hardlink(entry)) {
r = apply_substitution(bsdtar, archive_entry_hardlink(entry), &subst_name, 1);
if (r == -1) {
- bsdtar_warnc(0, "Invalid substitution, skipping entry");
+ lafe_warnc(0, "Invalid substitution, skipping entry");
return 1;
}
if (r == 1) {
@@ -394,7 +394,7 @@ edit_pathname(struct bsdtar *bsdtar, struct archive_entry *entry)
if (archive_entry_symlink(entry) != NULL) {
r = apply_substitution(bsdtar, archive_entry_symlink(entry), &subst_name, 1);
if (r == -1) {
- bsdtar_warnc(0, "Invalid substitution, skipping entry");
+ lafe_warnc(0, "Invalid substitution, skipping entry");
return 1;
}
if (r == 1) {
@@ -468,11 +468,11 @@ edit_pathname(struct bsdtar *bsdtar, struct archive_entry *entry)
if (p != name && !bsdtar->warned_lead_slash) {
/* Generate a warning the first time this happens. */
if (slashonly)
- bsdtar_warnc(0,
+ lafe_warnc(0,
"Removing leading '%c' from member names",
name[0]);
else
- bsdtar_warnc(0,
+ lafe_warnc(0,
"Removing leading drive letter from "
"member names");
bsdtar->warned_lead_slash = 1;
diff --git a/usr.bin/tar/write.c b/usr.bin/tar/write.c
index 9d9025a..32e43c6 100644
--- a/usr.bin/tar/write.c
+++ b/usr.bin/tar/write.c
@@ -169,7 +169,7 @@ tar_mode_c(struct bsdtar *bsdtar)
int r;
if (*bsdtar->argv == NULL && bsdtar->names_from_file == NULL)
- bsdtar_errc(1, 0, "no files or directories specified");
+ lafe_errc(1, 0, "no files or directories specified");
a = archive_write_new();
@@ -223,21 +223,21 @@ tar_mode_c(struct bsdtar *bsdtar)
r = archive_write_set_compression_compress(a);
break;
default:
- bsdtar_errc(1, 0,
+ lafe_errc(1, 0,
"Unrecognized compression option -%c",
bsdtar->create_compression);
}
if (r != ARCHIVE_OK) {
- bsdtar_errc(1, 0,
+ lafe_errc(1, 0,
"Unsupported compression option -%c",
bsdtar->create_compression);
}
}
if (ARCHIVE_OK != archive_write_set_options(a, bsdtar->option_options))
- bsdtar_errc(1, 0, "%s", archive_error_string(a));
+ lafe_errc(1, 0, "%s", archive_error_string(a));
if (ARCHIVE_OK != archive_write_open_file(a, bsdtar->filename))
- bsdtar_errc(1, 0, "%s", archive_error_string(a));
+ lafe_errc(1, 0, "%s", archive_error_string(a));
write_archive(a, bsdtar);
}
@@ -265,7 +265,7 @@ tar_mode_r(struct bsdtar *bsdtar)
bsdtar->fd = open(bsdtar->filename, O_RDWR | O_CREAT | O_BINARY, 0666);
#endif
if (bsdtar->fd < 0)
- bsdtar_errc(1, errno,
+ lafe_errc(1, errno,
"Cannot open %s", bsdtar->filename);
a = archive_read_new();
@@ -274,14 +274,14 @@ tar_mode_r(struct bsdtar *bsdtar)
archive_read_support_format_gnutar(a);
r = archive_read_open_fd(a, bsdtar->fd, 10240);
if (r != ARCHIVE_OK)
- bsdtar_errc(1, archive_errno(a),
+ lafe_errc(1, archive_errno(a),
"Can't read archive %s: %s", bsdtar->filename,
archive_error_string(a));
while (0 == archive_read_next_header(a, &entry)) {
if (archive_compression(a) != ARCHIVE_COMPRESSION_NONE) {
archive_read_finish(a);
close(bsdtar->fd);
- bsdtar_errc(1, 0,
+ lafe_errc(1, 0,
"Cannot append to compressed archive.");
}
/* Keep going until we hit end-of-archive */
@@ -310,7 +310,7 @@ tar_mode_r(struct bsdtar *bsdtar)
format &= ARCHIVE_FORMAT_BASE_MASK;
if (format != (int)(archive_format(a) & ARCHIVE_FORMAT_BASE_MASK)
&& format != ARCHIVE_FORMAT_EMPTY) {
- bsdtar_errc(1, 0,
+ lafe_errc(1, 0,
"Format %s is incompatible with the archive %s.",
bsdtar->create_format, bsdtar->filename);
}
@@ -327,11 +327,11 @@ tar_mode_r(struct bsdtar *bsdtar)
archive_write_set_format(a, format);
}
if (lseek(bsdtar->fd, end_offset, SEEK_SET) < 0)
- bsdtar_errc(1, errno, "Could not seek to archive end");
+ lafe_errc(1, errno, "Could not seek to archive end");
if (ARCHIVE_OK != archive_write_set_options(a, bsdtar->option_options))
- bsdtar_errc(1, 0, "%s", archive_error_string(a));
+ lafe_errc(1, 0, "%s", archive_error_string(a));
if (ARCHIVE_OK != archive_write_open_fd(a, bsdtar->fd))
- bsdtar_errc(1, 0, "%s", archive_error_string(a));
+ lafe_errc(1, 0, "%s", archive_error_string(a));
write_archive(a, bsdtar); /* XXX check return val XXX */
@@ -359,7 +359,7 @@ tar_mode_u(struct bsdtar *bsdtar)
bsdtar->fd = open(bsdtar->filename, O_RDWR | O_BINARY);
if (bsdtar->fd < 0)
- bsdtar_errc(1, errno,
+ lafe_errc(1, errno,
"Cannot open %s", bsdtar->filename);
a = archive_read_new();
@@ -369,7 +369,7 @@ tar_mode_u(struct bsdtar *bsdtar)
if (archive_read_open_fd(a, bsdtar->fd,
bsdtar->bytes_per_block != 0 ? bsdtar->bytes_per_block :
DEFAULT_BYTES_PER_BLOCK) != ARCHIVE_OK) {
- bsdtar_errc(1, 0,
+ lafe_errc(1, 0,
"Can't open %s: %s", bsdtar->filename,
archive_error_string(a));
}
@@ -379,7 +379,7 @@ tar_mode_u(struct bsdtar *bsdtar)
if (archive_compression(a) != ARCHIVE_COMPRESSION_NONE) {
archive_read_finish(a);
close(bsdtar->fd);
- bsdtar_errc(1, 0,
+ lafe_errc(1, 0,
"Cannot append to compressed archive.");
}
add_dir_list(bsdtar, archive_entry_pathname(entry),
@@ -410,11 +410,11 @@ tar_mode_u(struct bsdtar *bsdtar)
} else
archive_write_set_bytes_per_block(a, DEFAULT_BYTES_PER_BLOCK);
if (lseek(bsdtar->fd, end_offset, SEEK_SET) < 0)
- bsdtar_errc(1, errno, "Could not seek to archive end");
+ lafe_errc(1, errno, "Could not seek to archive end");
if (ARCHIVE_OK != archive_write_set_options(a, bsdtar->option_options))
- bsdtar_errc(1, 0, "%s", archive_error_string(a));
+ lafe_errc(1, 0, "%s", archive_error_string(a));
if (ARCHIVE_OK != archive_write_open_fd(a, bsdtar->fd))
- bsdtar_errc(1, 0, "%s", archive_error_string(a));
+ lafe_errc(1, 0, "%s", archive_error_string(a));
write_archive(a, bsdtar);
@@ -442,14 +442,14 @@ write_archive(struct archive *a, struct bsdtar *bsdtar)
/* Allocate a buffer for file data. */
if ((bsdtar->buff = malloc(FILEDATABUFLEN)) == NULL)
- bsdtar_errc(1, 0, "cannot allocate memory");
+ lafe_errc(1, 0, "cannot allocate memory");
if ((bsdtar->resolver = archive_entry_linkresolver_new()) == NULL)
- bsdtar_errc(1, 0, "cannot create link resolver");
+ lafe_errc(1, 0, "cannot create link resolver");
archive_entry_linkresolver_set_strategy(bsdtar->resolver,
archive_format(a));
if ((bsdtar->diskreader = archive_read_disk_new()) == NULL)
- bsdtar_errc(1, 0, "Cannot create read_disk object");
+ lafe_errc(1, 0, "Cannot create read_disk object");
archive_read_disk_set_standard_lookup(bsdtar->diskreader);
if (bsdtar->names_from_file != NULL)
@@ -463,7 +463,7 @@ write_archive(struct archive *a, struct bsdtar *bsdtar)
bsdtar->argv++;
arg = *bsdtar->argv;
if (arg == NULL) {
- bsdtar_warnc(0, "%s",
+ lafe_warnc(0, "%s",
"Missing argument for -C");
bsdtar->return_value = 1;
goto cleanup;
@@ -493,7 +493,7 @@ write_archive(struct archive *a, struct bsdtar *bsdtar)
}
if (archive_write_close(a)) {
- bsdtar_warnc(0, "%s", archive_error_string(a));
+ lafe_warnc(0, "%s", archive_error_string(a));
bsdtar->return_value = 1;
}
@@ -543,7 +543,7 @@ archive_names_from_file(struct bsdtar *bsdtar, struct archive *a)
}
lafe_line_reader_free(lr);
if (bsdtar->next_line_is_dir)
- bsdtar_errc(1, errno,
+ lafe_errc(1, errno,
"Unexpected end of filename list; "
"directory expected after -C");
}
@@ -569,7 +569,7 @@ append_archive_filename(struct bsdtar *bsdtar, struct archive *a,
archive_read_support_format_all(ina);
archive_read_support_compression_all(ina);
if (archive_read_open_file(ina, filename, 10240)) {
- bsdtar_warnc(0, "%s", archive_error_string(ina));
+ lafe_warnc(0, "%s", archive_error_string(ina));
bsdtar->return_value = 1;
return (0);
}
@@ -577,7 +577,7 @@ append_archive_filename(struct bsdtar *bsdtar, struct archive *a,
rc = append_archive(bsdtar, a, ina);
if (rc != ARCHIVE_OK) {
- bsdtar_warnc(0, "Error reading archive %s: %s",
+ lafe_warnc(0, "Error reading archive %s: %s",
filename, archive_error_string(ina));
bsdtar->return_value = 1;
}
@@ -610,7 +610,7 @@ append_archive(struct bsdtar *bsdtar, struct archive *a, struct archive *ina)
e = archive_write_header(a, in_entry);
if (e != ARCHIVE_OK) {
if (!bsdtar->verbose)
- bsdtar_warnc(0, "%s: %s",
+ lafe_warnc(0, "%s: %s",
archive_entry_pathname(in_entry),
archive_error_string(a));
else
@@ -651,7 +651,7 @@ copy_file_data(struct bsdtar *bsdtar, struct archive *a,
bytes_written = archive_write_data(a, bsdtar->buff,
bytes_read);
if (bytes_written < bytes_read) {
- bsdtar_warnc(0, "%s", archive_error_string(a));
+ lafe_warnc(0, "%s", archive_error_string(a));
return (-1);
}
progress += bytes_written;
@@ -678,7 +678,7 @@ write_hierarchy(struct bsdtar *bsdtar, struct archive *a, const char *path)
tree = tree_open(path);
if (!tree) {
- bsdtar_warnc(errno, "%s: Cannot open", path);
+ lafe_warnc(errno, "%s: Cannot open", path);
bsdtar->return_value = 1;
return;
}
@@ -691,11 +691,11 @@ write_hierarchy(struct bsdtar *bsdtar, struct archive *a, const char *path)
int descend;
if (tree_ret == TREE_ERROR_FATAL)
- bsdtar_errc(1, tree_errno(tree),
+ lafe_errc(1, tree_errno(tree),
"%s: Unable to continue traversing directory tree",
name);
if (tree_ret == TREE_ERROR_DIR) {
- bsdtar_warnc(errno,
+ lafe_warnc(errno,
"%s: Couldn't visit directory", name);
bsdtar->return_value = 1;
}
@@ -715,7 +715,7 @@ write_hierarchy(struct bsdtar *bsdtar, struct archive *a, const char *path)
lst = tree_current_lstat(tree);
if (lst == NULL) {
/* Couldn't lstat(); must not exist. */
- bsdtar_warnc(errno, "%s: Cannot stat", name);
+ lafe_warnc(errno, "%s: Cannot stat", name);
/* Return error if files disappear during traverse. */
bsdtar->return_value = 1;
continue;
@@ -834,7 +834,7 @@ write_hierarchy(struct bsdtar *bsdtar, struct archive *a, const char *path)
r = archive_read_disk_entry_from_file(bsdtar->diskreader,
entry, -1, st);
if (r != ARCHIVE_OK)
- bsdtar_warnc(archive_errno(bsdtar->diskreader),
+ lafe_warnc(archive_errno(bsdtar->diskreader),
"%s", archive_error_string(bsdtar->diskreader));
if (r < ARCHIVE_WARN)
continue;
@@ -929,7 +929,7 @@ write_entry_backend(struct bsdtar *bsdtar, struct archive *a,
if (fd == -1) {
bsdtar->return_value = 1;
if (!bsdtar->verbose)
- bsdtar_warnc(errno,
+ lafe_warnc(errno,
"%s: could not open file", pathname);
else
fprintf(stderr, ": %s", strerror(errno));
@@ -940,7 +940,7 @@ write_entry_backend(struct bsdtar *bsdtar, struct archive *a,
e = archive_write_header(a, entry);
if (e != ARCHIVE_OK) {
if (!bsdtar->verbose)
- bsdtar_warnc(0, "%s: %s",
+ lafe_warnc(0, "%s: %s",
archive_entry_pathname(entry),
archive_error_string(a));
else
@@ -1016,12 +1016,12 @@ write_file_data(struct bsdtar *bsdtar, struct archive *a,
bytes_read);
if (bytes_written < 0) {
/* Write failed; this is bad */
- bsdtar_warnc(0, "%s", archive_error_string(a));
+ lafe_warnc(0, "%s", archive_error_string(a));
return (-1);
}
if (bytes_written < bytes_read) {
/* Write was truncated; warn but continue. */
- bsdtar_warnc(0,
+ lafe_warnc(0,
"%s: Truncated write; file may have grown while being archived.",
archive_entry_pathname(entry));
return (0);
@@ -1030,7 +1030,7 @@ write_file_data(struct bsdtar *bsdtar, struct archive *a,
bytes_read = read(fd, bsdtar->buff, FILEDATABUFLEN);
}
if (bytes_read < 0) {
- bsdtar_warnc(errno,
+ lafe_warnc(errno,
"%s: Read error",
archive_entry_pathname(entry));
bsdtar->return_value = 1;
@@ -1112,11 +1112,11 @@ add_dir_list(struct bsdtar *bsdtar, const char *path,
p = malloc(sizeof(*p));
if (p == NULL)
- bsdtar_errc(1, ENOMEM, "Can't read archive directory");
+ lafe_errc(1, ENOMEM, "Can't read archive directory");
p->name = strdup(path);
if (p->name == NULL)
- bsdtar_errc(1, ENOMEM, "Can't read archive directory");
+ lafe_errc(1, ENOMEM, "Can't read archive directory");
p->mtime_sec = mtime_sec;
p->mtime_nsec = mtime_nsec;
p->next = NULL;
@@ -1134,26 +1134,26 @@ test_for_append(struct bsdtar *bsdtar)
struct stat s;
if (*bsdtar->argv == NULL && bsdtar->names_from_file == NULL)
- bsdtar_errc(1, 0, "no files or directories specified");
+ lafe_errc(1, 0, "no files or directories specified");
if (bsdtar->filename == NULL)
- bsdtar_errc(1, 0, "Cannot append to stdout.");
+ lafe_errc(1, 0, "Cannot append to stdout.");
if (bsdtar->create_compression != 0)
- bsdtar_errc(1, 0,
+ lafe_errc(1, 0,
"Cannot append to %s with compression", bsdtar->filename);
if (stat(bsdtar->filename, &s) != 0)
return;
if (!S_ISREG(s.st_mode) && !S_ISBLK(s.st_mode))
- bsdtar_errc(1, 0,
+ lafe_errc(1, 0,
"Cannot append to %s: not a regular file.",
bsdtar->filename);
/* Is this an appropriate check here on Windows? */
/*
if (GetFileType(handle) != FILE_TYPE_DISK)
- bsdtar_errc(1, 0, "Cannot append");
+ lafe_errc(1, 0, "Cannot append");
*/
}
diff --git a/usr.bin/tftp/main.c b/usr.bin/tftp/main.c
index da0e5df..2b0172e 100644
--- a/usr.bin/tftp/main.c
+++ b/usr.bin/tftp/main.c
@@ -77,7 +77,7 @@ __FBSDID("$FreeBSD$");
#define MAXLINE 200
#define TIMEOUT 5 /* secs between rexmt's */
-static struct sockaddr_storage peeraddr;
+typedef struct sockaddr_storage peeraddr;
static int connected;
static char mode[32];
jmp_buf toplevel;
diff --git a/usr.bin/top/machine.c b/usr.bin/top/machine.c
index 4c55682..02dc847 100644
--- a/usr.bin/top/machine.c
+++ b/usr.bin/top/machine.c
@@ -239,19 +239,48 @@ static const char *format_nice(const struct kinfo_proc *pp);
static void getsysctl(const char *name, void *ptr, size_t len);
static int swapmode(int *retavail, int *retfree);
+void
+toggle_pcpustats(struct statics *statics)
+{
+
+ if (ncpus == 1)
+ return;
+
+ /* Adjust display based on ncpus */
+ if (pcpu_stats) {
+ y_mem += ncpus - 1; /* 3 */
+ y_swap += ncpus - 1; /* 4 */
+ y_idlecursor += ncpus - 1; /* 5 */
+ y_message += ncpus - 1; /* 5 */
+ y_header += ncpus - 1; /* 6 */
+ y_procs += ncpus - 1; /* 7 */
+ Header_lines += ncpus - 1; /* 7 */
+ statics->ncpus = ncpus;
+ } else {
+ y_mem = 3;
+ y_swap = 4;
+ y_idlecursor = 5;
+ y_message = 5;
+ y_header = 6;
+ y_procs = 7;
+ Header_lines = 7;
+ statics->ncpus = 1;
+ }
+}
+
int
machine_init(struct statics *statics, char do_unames)
{
- int pagesize;
- size_t modelen;
+ int i, j, empty, pagesize;
+ size_t size;
struct passwd *pw;
- modelen = sizeof(smpmode);
- if ((sysctlbyname("machdep.smp_active", &smpmode, &modelen,
+ size = sizeof(smpmode);
+ if ((sysctlbyname("machdep.smp_active", &smpmode, &size,
NULL, 0) != 0 &&
- sysctlbyname("kern.smp.active", &smpmode, &modelen,
+ sysctlbyname("kern.smp.active", &smpmode, &size,
NULL, 0) != 0) ||
- modelen != sizeof(smpmode))
+ size != sizeof(smpmode))
smpmode = 0;
if (do_unames) {
@@ -299,51 +328,37 @@ machine_init(struct statics *statics, char do_unames)
statics->order_names = ordernames;
#endif
- /* Adjust display based on ncpus */
- if (pcpu_stats) {
- int i, j, empty;
- size_t size;
-
- cpumask = 0;
- ncpus = 0;
- GETSYSCTL("kern.smp.maxcpus", maxcpu);
- size = sizeof(long) * maxcpu * CPUSTATES;
- times = malloc(size);
- if (times == NULL)
- err(1, "malloc %zd bytes", size);
- if (sysctlbyname("kern.cp_times", times, &size, NULL, 0) == -1)
- err(1, "sysctlbyname kern.cp_times");
- pcpu_cp_time = calloc(1, size);
- maxid = (size / CPUSTATES / sizeof(long)) - 1;
- for (i = 0; i <= maxid; i++) {
- empty = 1;
- for (j = 0; empty && j < CPUSTATES; j++) {
- if (times[i * CPUSTATES + j] != 0)
- empty = 0;
- }
- if (!empty) {
- cpumask |= (1ul << i);
- ncpus++;
- }
+ /* Allocate state for per-CPU stats. */
+ cpumask = 0;
+ ncpus = 0;
+ GETSYSCTL("kern.smp.maxcpus", maxcpu);
+ size = sizeof(long) * maxcpu * CPUSTATES;
+ times = malloc(size);
+ if (times == NULL)
+ err(1, "malloc %zd bytes", size);
+ if (sysctlbyname("kern.cp_times", times, &size, NULL, 0) == -1)
+ err(1, "sysctlbyname kern.cp_times");
+ pcpu_cp_time = calloc(1, size);
+ maxid = (size / CPUSTATES / sizeof(long)) - 1;
+ for (i = 0; i <= maxid; i++) {
+ empty = 1;
+ for (j = 0; empty && j < CPUSTATES; j++) {
+ if (times[i * CPUSTATES + j] != 0)
+ empty = 0;
}
-
- if (ncpus > 1) {
- y_mem += ncpus - 1; /* 3 */
- y_swap += ncpus - 1; /* 4 */
- y_idlecursor += ncpus - 1; /* 5 */
- y_message += ncpus - 1; /* 5 */
- y_header += ncpus - 1; /* 6 */
- y_procs += ncpus - 1; /* 7 */
- Header_lines += ncpus - 1; /* 7 */
+ if (!empty) {
+ cpumask |= (1ul << i);
+ ncpus++;
}
- size = sizeof(long) * ncpus * CPUSTATES;
- pcpu_cp_old = calloc(1, size);
- pcpu_cp_diff = calloc(1, size);
- pcpu_cpu_states = calloc(1, size);
- statics->ncpus = ncpus;
- } else {
- statics->ncpus = 1;
}
+ size = sizeof(long) * ncpus * CPUSTATES;
+ pcpu_cp_old = calloc(1, size);
+ pcpu_cp_diff = calloc(1, size);
+ pcpu_cpu_states = calloc(1, size);
+ statics->ncpus = 1;
+
+ if (pcpu_stats)
+ toggle_pcpustats(statics);
/* all done! */
return (0);
@@ -398,14 +413,11 @@ get_system_info(struct system_info *si)
int i, j;
size_t size;
- /* get the cp_time array */
- if (pcpu_stats) {
- size = (maxid + 1) * CPUSTATES * sizeof(long);
- if (sysctlbyname("kern.cp_times", pcpu_cp_time, &size, NULL, 0) == -1)
- err(1, "sysctlbyname kern.cp_times");
- } else {
- GETSYSCTL("kern.cp_time", cp_time);
- }
+ /* get the CPU stats */
+ size = (maxid + 1) * CPUSTATES * sizeof(long);
+ if (sysctlbyname("kern.cp_times", pcpu_cp_time, &size, NULL, 0) == -1)
+ err(1, "sysctlbyname kern.cp_times");
+ GETSYSCTL("kern.cp_time", cp_time);
GETSYSCTL("vm.loadavg", sysload);
GETSYSCTL("kern.lastpid", lastpid);
@@ -413,21 +425,17 @@ get_system_info(struct system_info *si)
for (i = 0; i < 3; i++)
si->load_avg[i] = (double)sysload.ldavg[i] / sysload.fscale;
- if (pcpu_stats) {
- for (i = j = 0; i <= maxid; i++) {
- if ((cpumask & (1ul << i)) == 0)
- continue;
- /* convert cp_time counts to percentages */
- percentages(CPUSTATES, &pcpu_cpu_states[j * CPUSTATES],
- &pcpu_cp_time[j * CPUSTATES],
- &pcpu_cp_old[j * CPUSTATES],
- &pcpu_cp_diff[j * CPUSTATES]);
- j++;
- }
- } else {
- /* convert cp_time counts to percentages */
- percentages(CPUSTATES, cpu_states, cp_time, cp_old, cp_diff);
+ /* convert cp_time counts to percentages */
+ for (i = j = 0; i <= maxid; i++) {
+ if ((cpumask & (1ul << i)) == 0)
+ continue;
+ percentages(CPUSTATES, &pcpu_cpu_states[j * CPUSTATES],
+ &pcpu_cp_time[j * CPUSTATES],
+ &pcpu_cp_old[j * CPUSTATES],
+ &pcpu_cp_diff[j * CPUSTATES]);
+ j++;
}
+ percentages(CPUSTATES, cpu_states, cp_time, cp_old, cp_diff);
/* sum memory & swap statistics */
{
@@ -616,7 +624,6 @@ get_process_info(struct system_info *si, struct process_select *sel,
int active_procs;
struct kinfo_proc **prefp;
struct kinfo_proc *pp;
- struct kinfo_proc *prev_pp = NULL;
/* these are copied out of sel for speed */
int show_idle;
@@ -649,7 +656,8 @@ get_process_info(struct system_info *si, struct process_select *sel,
}
previous_proc_count = nproc;
- pbase = kvm_getprocs(kd, KERN_PROC_ALL, 0, &nproc);
+ pbase = kvm_getprocs(kd, sel->thread ? KERN_PROC_ALL : KERN_PROC_PROC,
+ 0, &nproc);
if (nproc > onproc)
pref = realloc(pref, sizeof(*pref) * (onproc = nproc));
if (pref == NULL || pbase == NULL) {
@@ -701,17 +709,16 @@ get_process_info(struct system_info *si, struct process_select *sel,
/* skip zombies */
continue;
+ if (!show_kidle && pp->ki_tdflags & TDF_IDLETD)
+ /* skip kernel idle process */
+ continue;
+
if (displaymode == DISP_CPU && !show_idle &&
(pp->ki_pctcpu == 0 ||
pp->ki_stat == SSTOP || pp->ki_stat == SIDL))
/* skip idle or non-running processes */
continue;
- if (displaymode == DISP_CPU && !show_kidle &&
- pp->ki_tdflags & TDF_IDLETD)
- /* skip kernel idle process */
- continue;
-
if (displaymode == DISP_IO && !show_idle && p_io == 0)
/* skip processes that aren't doing I/O */
continue;
@@ -720,21 +727,8 @@ get_process_info(struct system_info *si, struct process_select *sel,
/* skip proc. that don't belong to the selected UID */
continue;
- /*
- * When not showing threads, take the first thread
- * for output and add the fields that we can from
- * the rest of the process's threads rather than
- * using the system's mostly-broken KERN_PROC_PROC.
- */
- if (sel->thread || prev_pp == NULL ||
- prev_pp->ki_pid != pp->ki_pid) {
- *prefp++ = pp;
- active_procs++;
- prev_pp = pp;
- } else {
- prev_pp->ki_pctcpu += pp->ki_pctcpu;
- prev_pp->ki_runtime += pp->ki_runtime;
- }
+ *prefp++ = pp;
+ active_procs++;
}
/* if requested, sort the "interesting" processes */
@@ -849,7 +843,7 @@ format_next_process(caddr_t handle, char *(*get_userid)(int), int flags)
(args = kvm_getargv(kd, pp, cmdlengthdelta)) == NULL ||
!(*args)) {
if (ps.thread && pp->ki_flag & P_HADTHREADS &&
- pp->ki_ocomm[0]) {
+ pp->ki_ocomm[0]) {
snprintf(cmdbuf, cmdlengthdelta,
"{%s}", pp->ki_ocomm);
} else {
diff --git a/usr.bin/vmstat/vmstat.c b/usr.bin/vmstat/vmstat.c
index d31fdb5..39e71fa 100644
--- a/usr.bin/vmstat/vmstat.c
+++ b/usr.bin/vmstat/vmstat.c
@@ -90,12 +90,12 @@ static struct nlist namelist[] = {
{ "_nchstats" },
#define X_INTRNAMES 5
{ "_intrnames" },
-#define X_EINTRNAMES 6
- { "_eintrnames" },
+#define X_SINTRNAMES 6
+ { "_sintrnames" },
#define X_INTRCNT 7
{ "_intrcnt" },
-#define X_EINTRCNT 8
- { "_eintrcnt" },
+#define X_SINTRCNT 8
+ { "_sintrcnt" },
#define X_KMEMSTATS 9
{ "_kmemstatistics" },
#define X_KMEMZONES 10
@@ -1153,10 +1153,8 @@ dointr(void)
uptime = getuptime();
if (kd != NULL) {
- intrcntlen = namelist[X_EINTRCNT].n_value -
- namelist[X_INTRCNT].n_value;
- inamlen = namelist[X_EINTRNAMES].n_value -
- namelist[X_INTRNAMES].n_value;
+ intrcntlen = namelist[X_SINTRCNT].n_value;
+ inamlen = namelist[X_SINTRNAMES].n_value;
if ((intrcnt = malloc(intrcntlen)) == NULL ||
(intrname = malloc(inamlen)) == NULL)
err(1, "malloc()");
diff --git a/usr.bin/w/w.c b/usr.bin/w/w.c
index 43f1926..0331287 100644
--- a/usr.bin/w/w.c
+++ b/usr.bin/w/w.c
@@ -497,7 +497,7 @@ ttystat(char *line)
char ttybuf[MAXPATHLEN];
(void)snprintf(ttybuf, sizeof(ttybuf), "%s%s", _PATH_DEV, line);
- if (stat(ttybuf, &sb) == 0) {
+ if (stat(ttybuf, &sb) == 0 && S_ISCHR(sb.st_mode)) {
return (&sb);
} else
return (NULL);
diff --git a/usr.bin/wall/wall.c b/usr.bin/wall/wall.c
index 5c44749..eea253f 100644
--- a/usr.bin/wall/wall.c
+++ b/usr.bin/wall/wall.c
@@ -239,8 +239,9 @@ makemsg(char *fname)
err(1, "can't read %s", fname);
setegid(egid);
}
+ cnt = 0;
while (fgets(lbuf, sizeof(lbuf), stdin)) {
- for (cnt = 0, p = lbuf; (ch = *p) != '\0'; ++p, ++cnt) {
+ for (p = lbuf; (ch = *p) != '\0'; ++p, ++cnt) {
if (ch == '\r') {
putc('\r', fp);
cnt = 0;
diff --git a/usr.sbin/Makefile b/usr.sbin/Makefile
index f448f03..fa1936c 100644
--- a/usr.sbin/Makefile
+++ b/usr.sbin/Makefile
@@ -120,13 +120,20 @@ SUBDIR+= authpf
SUBDIR+= dnssec-dsfromkey
SUBDIR+= dnssec-keyfromlabel
SUBDIR+= dnssec-keygen
+SUBDIR+= dnssec-revoke
+SUBDIR+= dnssec-settime
SUBDIR+= dnssec-signzone
.endif
.if ${MK_BIND_NAMED} != "no"
+SUBDIR+= arpaname
+SUBDIR+= ddns-confgen
+SUBDIR+= genrandom
+SUBDIR+= isc-hmac-fixup
SUBDIR+= named
SUBDIR+= named-checkconf
SUBDIR+= named-checkzone
-SUBDIR+= named.reload
+SUBDIR+= named-journalprint
+SUBDIR+= nsec3hash
SUBDIR+= rndc
SUBDIR+= rndc-confgen
.endif
@@ -170,6 +177,7 @@ SUBDIR+= ndp
SUBDIR+= rip6query
SUBDIR+= route6d
SUBDIR+= rrenumd
+SUBDIR+= rtadvctl
SUBDIR+= rtadvd
SUBDIR+= rtsold
SUBDIR+= traceroute6
diff --git a/usr.sbin/arpaname/Makefile b/usr.sbin/arpaname/Makefile
new file mode 100644
index 0000000..145d18a
--- /dev/null
+++ b/usr.sbin/arpaname/Makefile
@@ -0,0 +1,24 @@
+# $FreeBSD$
+
+BIND_DIR= ${.CURDIR}/../../contrib/bind9
+LIB_BIND_REL= ../../lib/bind
+LIB_BIND_DIR= ${.CURDIR}/${LIB_BIND_REL}
+SRCDIR= ${BIND_DIR}/bin/tools
+
+.include "${LIB_BIND_DIR}/config.mk"
+
+PROG= arpaname
+
+.PATH: ${SRCDIR}
+SRCS+= arpaname.c
+
+CFLAGS+= -I${SRCDIR}/unix/include -I${SRCDIR}/include
+
+DPADD+= ${BIND_DPADD} ${CRYPTO_DPADD} ${PTHREAD_DPADD}
+LDADD+= ${BIND_LDADD} ${CRYPTO_LDADD} ${PTHREAD_LDADD}
+
+WARNS?= 3
+
+MAN= arpaname.1
+
+.include <bsd.prog.mk>
diff --git a/usr.sbin/bsdinstall/partedit/partedit.c b/usr.sbin/bsdinstall/partedit/partedit.c
index 0ba3203..303f695 100644
--- a/usr.sbin/bsdinstall/partedit/partedit.c
+++ b/usr.sbin/bsdinstall/partedit/partedit.c
@@ -305,7 +305,7 @@ apply_changes(struct gmesh *mesh)
fprintf(fstab, "# Device\tMountpoint\tFStype\tOptions\tDump\tPass#\n");
TAILQ_FOREACH(md, &part_metadata, metadata) {
if (md->fstab != NULL)
- fprintf(fstab, "%s\t%s\t%s\t%s\t%d\t%d\n",
+ fprintf(fstab, "%s\t%s\t\t%s\t%s\t%d\t%d\n",
md->fstab->fs_spec, md->fstab->fs_file,
md->fstab->fs_vfstype, md->fstab->fs_mntops,
md->fstab->fs_freq, md->fstab->fs_passno);
diff --git a/usr.sbin/bsdinstall/partedit/partedit_powerpc.c b/usr.sbin/bsdinstall/partedit/partedit_powerpc.c
index 23bd8b6..13d2536 100644
--- a/usr.sbin/bsdinstall/partedit/partedit_powerpc.c
+++ b/usr.sbin/bsdinstall/partedit/partedit_powerpc.c
@@ -26,19 +26,42 @@
* $FreeBSD$
*/
+#include <sys/types.h>
+#include <sys/sysctl.h>
#include <string.h>
#include "partedit.h"
+static char platform[255] = "";
+
const char *
default_scheme(void) {
- return ("APM");
+ size_t platlen = sizeof(platform);
+ if (strlen(platform) == 0)
+ sysctlbyname("hw.platform", platform, &platlen, NULL, -1);
+
+ if (strcmp(platform, "powermac") == 0)
+ return ("APM");
+ if (strcmp(platform, "chrp") == 0)
+ return ("MBR");
+
+ /* Pick GPT (bootable on PS3) as a generic default */
+ return ("GPT");
}
int
is_scheme_bootable(const char *part_type) {
- if (strcmp(part_type, "APM") == 0)
+ size_t platlen = sizeof(platform);
+ if (strlen(platform) == 0)
+ sysctlbyname("hw.platform", platform, &platlen, NULL, -1);
+
+ if (strcmp(platform, "powermac") == 0 && strcmp(part_type, "APM") == 0)
+ return (1);
+ if (strcmp(platform, "ps3") == 0 && strcmp(part_type, "GPT") == 0)
return (1);
+ if (strcmp(platform, "chrp") == 0 && strcmp(part_type, "MBR") == 0)
+ return (1);
+
return (0);
}
diff --git a/usr.sbin/bsdinstall/scripts/Makefile b/usr.sbin/bsdinstall/scripts/Makefile
index e32fda6..5e450b7 100644
--- a/usr.sbin/bsdinstall/scripts/Makefile
+++ b/usr.sbin/bsdinstall/scripts/Makefile
@@ -1,8 +1,8 @@
# $FreeBSD$
-SCRIPTS= auto adduser checksum config hostname jail keymap mirrorselect \
- mount netconfig netconfig_ipv4 netconfig_ipv6 rootpass services \
- time umount wlanconfig
+SCRIPTS= auto adduser checksum config docsinstall hostname jail keymap \
+ mirrorselect mount netconfig netconfig_ipv4 netconfig_ipv6 rootpass \
+ services time umount wlanconfig
BINDIR= /usr/libexec/bsdinstall
NO_MAN= true
diff --git a/usr.sbin/bsdinstall/scripts/auto b/usr.sbin/bsdinstall/scripts/auto
index bdc5fc4..667ced4 100755
--- a/usr.sbin/bsdinstall/scripts/auto
+++ b/usr.sbin/bsdinstall/scripts/auto
@@ -127,7 +127,7 @@ if [ ! -z "$FETCH_DISTRIBUTIONS" ]; then
# Try to use any existing distfiles
if [ -d $BSDINSTALL_DISTDIR ]; then
DISTDIR_IS_UNIONFS=1
- mount_unionfs "$BSDINSTALL_FETCHDEST" "$BSDINSTALL_DISTDIR"
+ mount_nullfs -o union "$BSDINSTALL_FETCHDEST" "$BSDINSTALL_DISTDIR"
fi
# Otherwise, fetch everything
@@ -166,6 +166,7 @@ finalconfig() {
"Network" "Networking configuration" \
"Services" "Set daemons to run on startup" \
"Time Zone" "Set system timezone" \
+ "Handbook" "Install FreeBSD Handbook (requires network)" \
"Shell" "Open a shell in the new system" \
"Exit" "Apply configuration and exit installer" 2>&1 1>&3)
exec 3>&-
@@ -195,6 +196,10 @@ finalconfig() {
bsdinstall time
finalconfig
;;
+ "Handbook")
+ bsdinstall docsinstall
+ finalconfig
+ ;;
"Shell")
clear
echo This shell is operating in a chroot in the new system. \
diff --git a/usr.sbin/bsdinstall/scripts/config b/usr.sbin/bsdinstall/scripts/config
index 5d7c3ce..4340450 100755
--- a/usr.sbin/bsdinstall/scripts/config
+++ b/usr.sbin/bsdinstall/scripts/config
@@ -30,3 +30,7 @@ cat $BSDINSTALL_TMPETC/rc.conf.* >> $BSDINSTALL_TMPETC/rc.conf
rm $BSDINSTALL_TMPETC/rc.conf.*
cp $BSDINSTALL_TMPETC/* $BSDINSTALL_CHROOT/etc
+
+# Set up other things from installed config
+chroot $BSDINSTALL_CHROOT /usr/bin/newaliases
+
diff --git a/usr.sbin/bsdinstall/scripts/docsinstall b/usr.sbin/bsdinstall/scripts/docsinstall
new file mode 100644
index 0000000..e037dcc
--- /dev/null
+++ b/usr.sbin/bsdinstall/scripts/docsinstall
@@ -0,0 +1,69 @@
+#!/bin/sh
+#-
+# Copyright (c) 2011 Marc Fonvieille
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+# 1. Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+# 2. Redistributions in binary form must reproduce the above copyright
+# notice, this list of conditions and the following disclaimer in the
+# documentation and/or other materials provided with the distribution.
+#
+# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+# SUCH DAMAGE.
+#
+# $FreeBSD$
+
+
+exec 3>&1
+DOCS=$(dialog --backtitle "FreeBSD Installer" \
+ --title "FreeBSD Documentation Installation" --separate-output \
+ --checklist "This menu will allow you to install the whole documentation set
+from the FreeBSD Documentation Project: Handbook, FAQ and articles.\n\n
+Please select the language versions you wish to install. At minimum,
+you should install the English version, this is the original version
+of the documentation.\n\n
+NB: This requires a working, configured network connection." 0 0 0 \
+ bn "Bengali Documentation" ${DIST_DOC_BN:-off} \
+ da "Danish Documentation" ${DIST_DOC_DA:-off} \
+ de "German Documentation" ${DIST_DOC_DE:-off} \
+ el "Greek Documentation" ${DIST_DOC_EL:-off} \
+ en "English Documentation (recommended)" ${DIST_DOC_EN:-on} \
+ es "Spanish Documentation" ${DIST_DOC_ES:-off} \
+ fr "French Documentation" ${DIST_DOC_FR:-off} \
+ hu "Hungarian Documentation" ${DIST_DOC_HU:-off} \
+ it "Italian Documentation" ${DIST_DOC_IT:-off} \
+ ja "Japanese Documentation" ${DIST_DOC_JA:-off} \
+ mn "Mongolian Documentation" ${DIST_DOC_MN:-off} \
+ nl "Dutch Documentation" ${DIST_DOC_NL:-off} \
+ pl "Polish Documentation" ${DIST_DOC_PL:-off} \
+ pt "Portuguese Documentation" ${DIST_DOC_PT:-off} \
+ ru "Russian Documentation" ${DIST_DOC_RU:-off} \
+ sr "Serbian Documentation" ${DIST_DOC_SR:-off} \
+ tr "Turkish Documentation" ${DIST_DOC_TR:-off} \
+ zh_cn "Simplified Chinese Documentation" ${DIST_DOC_ZH_CN:-off} \
+ zh_tw "Traditional Chinese Documentation" ${DIST_DOC_ZH_TW:-off} \
+2>&1 1>&3)
+test $? -eq 0 || exit 0
+exec 3>&-
+
+clear
+echo "FreeBSD Installer"
+echo "========================"
+echo
+
+for i in $DOCS; do
+ pkg_add -C ${BSDINSTALL_CHROOT} -r ${i}-freebsd-doc
+done
diff --git a/usr.sbin/bsnmpd/modules/snmp_hostres/hostres_device_tbl.c b/usr.sbin/bsnmpd/modules/snmp_hostres/hostres_device_tbl.c
index cb38145..99d55ee 100644
--- a/usr.sbin/bsnmpd/modules/snmp_hostres/hostres_device_tbl.c
+++ b/usr.sbin/bsnmpd/modules/snmp_hostres/hostres_device_tbl.c
@@ -449,7 +449,8 @@ devd_socket_callback(int fd, void *arg __unused)
HRDBG("called");
- read_len = read(fd, buf, sizeof(buf) - 1);
+again:
+ read_len = read(fd, buf, sizeof(buf));
if (read_len < 0) {
if (errno == EBADF) {
devd_sock = -1;
@@ -476,16 +477,9 @@ devd_socket_callback(int fd, void *arg __unused)
syslog(LOG_ERR, "Closing devd_fd, revert to devinfo polling");
} else {
- switch (buf[0]) {
- case '+':
- case '-':
- case '?':
- case '!':
- refresh_device_tbl(1);
- return;
- default:
- syslog(LOG_ERR, "unknown message from devd socket");
- }
+ if (read_len == sizeof(buf))
+ goto again;
+ refresh_device_tbl(1);
}
}
diff --git a/usr.sbin/config/main.c b/usr.sbin/config/main.c
index b1d4b5d..ceee035 100644
--- a/usr.sbin/config/main.c
+++ b/usr.sbin/config/main.c
@@ -577,7 +577,7 @@ cleanheaders(char *p)
struct dirent *dp;
struct file_list *fl;
struct hdr_list *hl;
- int i;
+ size_t len;
remember("y.tab.h");
remember("setdefs.h");
@@ -591,12 +591,13 @@ cleanheaders(char *p)
if ((dirp = opendir(p)) == NULL)
err(EX_OSERR, "opendir %s", p);
while ((dp = readdir(dirp)) != NULL) {
- i = dp->d_namlen - 2;
+ len = strlen(dp->d_name);
/* Skip non-headers */
- if (dp->d_name[i] != '.' || dp->d_name[i + 1] != 'h')
+ if (len < 2 || dp->d_name[len - 2] != '.' ||
+ dp->d_name[len - 1] != 'h')
continue;
/* Skip special stuff, eg: bus_if.h, but check opt_*.h */
- if (index(dp->d_name, '_') &&
+ if (strchr(dp->d_name, '_') &&
strncmp(dp->d_name, "opt_", 4) != 0)
continue;
/* Check if it is a target file */
diff --git a/usr.sbin/ddns-confgen/Makefile b/usr.sbin/ddns-confgen/Makefile
new file mode 100644
index 0000000..a33bea3
--- /dev/null
+++ b/usr.sbin/ddns-confgen/Makefile
@@ -0,0 +1,31 @@
+# $FreeBSD$
+
+BIND_DIR= ${.CURDIR}/../../contrib/bind9
+LIB_BIND_REL= ../../lib/bind
+LIB_BIND_DIR= ${.CURDIR}/${LIB_BIND_REL}
+SRCDIR= ${BIND_DIR}/bin/confgen
+
+.include "${LIB_BIND_DIR}/config.mk"
+
+PROG= ddns-confgen
+
+.PATH: ${SRCDIR}/unix
+SRCS+= os.c
+
+.PATH: ${SRCDIR}
+SRCS+= ddns-confgen.c keygen.c util.c
+
+CFLAGS+= -I${SRCDIR}/unix/include -I${SRCDIR}/include -I${LIB_BIND_DIR}
+
+WARNS?= 3
+
+DPADD+= ${BIND_DPADD} ${CRYPTO_DPADD} ${PTHREAD_DPADD}
+LDADD+= ${BIND_LDADD} ${CRYPTO_LDADD} ${PTHREAD_LDADD}
+
+MAN= ddns-confgen.8
+
+MANFILTER= sed -e 's@fI/etc\\fR.*@fI/etc/namedb\\fR@' \
+ -e '/^sysconfdir$$/d' \
+ -e '/was specified as when BIND was built)/d'
+
+.include <bsd.prog.mk>
diff --git a/usr.sbin/dnssec-revoke/Makefile b/usr.sbin/dnssec-revoke/Makefile
new file mode 100644
index 0000000..7889d96
--- /dev/null
+++ b/usr.sbin/dnssec-revoke/Makefile
@@ -0,0 +1,24 @@
+# $FreeBSD$
+
+BIND_DIR= ${.CURDIR}/../../contrib/bind9
+LIB_BIND_REL= ../../lib/bind
+LIB_BIND_DIR= ${.CURDIR}/${LIB_BIND_REL}
+SRCDIR= ${BIND_DIR}/bin/dnssec
+
+.include "${LIB_BIND_DIR}/config.mk"
+
+PROG= dnssec-revoke
+
+.PATH: ${SRCDIR}
+SRCS+= dnssec-revoke.c dnssectool.c
+
+CFLAGS+= -I${SRCDIR}/unix/include -I${SRCDIR}/include
+
+DPADD+= ${BIND_DPADD} ${CRYPTO_DPADD} ${PTHREAD_DPADD}
+LDADD+= ${BIND_LDADD} ${CRYPTO_LDADD} ${PTHREAD_LDADD}
+
+WARNS?= 3
+
+MAN= dnssec-revoke.8
+
+.include <bsd.prog.mk>
diff --git a/usr.sbin/dnssec-settime/Makefile b/usr.sbin/dnssec-settime/Makefile
new file mode 100644
index 0000000..4ab7fb5
--- /dev/null
+++ b/usr.sbin/dnssec-settime/Makefile
@@ -0,0 +1,24 @@
+# $FreeBSD$
+
+BIND_DIR= ${.CURDIR}/../../contrib/bind9
+LIB_BIND_REL= ../../lib/bind
+LIB_BIND_DIR= ${.CURDIR}/${LIB_BIND_REL}
+SRCDIR= ${BIND_DIR}/bin/dnssec
+
+.include "${LIB_BIND_DIR}/config.mk"
+
+PROG= dnssec-settime
+
+.PATH: ${SRCDIR}
+SRCS+= dnssec-settime.c dnssectool.c
+
+CFLAGS+= -I${SRCDIR}/unix/include -I${SRCDIR}/include
+
+DPADD+= ${BIND_DPADD} ${CRYPTO_DPADD} ${PTHREAD_DPADD}
+LDADD+= ${BIND_LDADD} ${CRYPTO_LDADD} ${PTHREAD_LDADD}
+
+WARNS?= 3
+
+MAN= dnssec-settime.8
+
+.include <bsd.prog.mk>
diff --git a/usr.sbin/dnssec-signzone/Makefile b/usr.sbin/dnssec-signzone/Makefile
index 70ddc3e..7f56b8d 100644
--- a/usr.sbin/dnssec-signzone/Makefile
+++ b/usr.sbin/dnssec-signzone/Makefile
@@ -17,7 +17,7 @@ CFLAGS+= -I${SRCDIR}/unix/include -I${SRCDIR}/include
DPADD+= ${BIND_DPADD} ${CRYPTO_DPADD} ${PTHREAD_DPADD}
LDADD+= ${BIND_LDADD} ${CRYPTO_LDADD} ${PTHREAD_LDADD}
-WARNS?= 3
+WARNS?= 2
MAN= dnssec-signzone.8
diff --git a/usr.sbin/flowctl/Makefile b/usr.sbin/flowctl/Makefile
index d47993b..a2dd377 100644
--- a/usr.sbin/flowctl/Makefile
+++ b/usr.sbin/flowctl/Makefile
@@ -2,6 +2,8 @@
# $FreeBSD$
#
+.include <bsd.own.mk>
+
PROG= flowctl
MAN= flowctl.8
@@ -9,4 +11,11 @@ WARNS?= 2
DPADD= ${LIBNETGRAPH}
LDADD= -lnetgraph
+.if ${MK_INET6_SUPPORT} != "no"
+CFLAGS+= -DINET6
+.endif
+.if ${MK_INET_SUPPORT} != "no"
+CFLAGS+= -DINET
+.endif
+
.include <bsd.prog.mk>
diff --git a/usr.sbin/flowctl/flowctl.8 b/usr.sbin/flowctl/flowctl.8
index cf1396b..5abeddb 100644
--- a/usr.sbin/flowctl/flowctl.8
+++ b/usr.sbin/flowctl/flowctl.8
@@ -24,7 +24,7 @@
.\"
.\" $FreeBSD$
.\"
-.Dd March 23, 2005
+.Dd July 5, 2011
.Dt FLOWCTL 8
.Os
.Sh NAME
@@ -35,7 +35,7 @@ control utility
.Sh SYNOPSIS
.Nm
.Op Fl d Ar level
-.Ar node command
+.Ar path command
.Sh DESCRIPTION
The
.Nm
@@ -55,11 +55,16 @@ Currently,
.Nm
supports only one command.
.Bl -tag -width ".Cm show"
-.It Cm show
+.It Cm show Op Cm ipv4|ipv6
This command is the analog of the
.Dq "show ip cache flow"
command of a Cisco router.
It dumps the contents of the flow cache in Cisco-like format.
+Specifing either
+.Cm ipv4
+or
+.Cm ipv6
+would extract only IPv4 or IPv6 flows respectively.
It has optional parameter
.Cm verbose ,
which is analog of the
diff --git a/usr.sbin/flowctl/flowctl.c b/usr.sbin/flowctl/flowctl.c
index 16f960a..4bf86f0 100644
--- a/usr.sbin/flowctl/flowctl.c
+++ b/usr.sbin/flowctl/flowctl.c
@@ -46,6 +46,7 @@ static const char rcs_id[] =
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
+#include <sysexits.h>
#include <unistd.h>
#include <netgraph.h>
@@ -54,21 +55,38 @@ static const char rcs_id[] =
#define CISCO_SH_FLOW_HEADER "SrcIf SrcIPaddress DstIf DstIPaddress Pr SrcP DstP Pkts\n"
#define CISCO_SH_FLOW "%-13s %-15s %-13s %-15s %2u %4.4x %4.4x %6lu\n"
+#define CISCO_SH_FLOW6_HEADER "SrcIf SrcIPaddress DstIf DstIPaddress Pr SrcP DstP Pkts\n"
+#define CISCO_SH_FLOW6 "%-13s %-30s %-13s %-30s %2u %4.4x %4.4x %6lu\n"
+
#define CISCO_SH_VERB_FLOW_HEADER "SrcIf SrcIPaddress DstIf DstIPaddress Pr TOS Flgs Pkts\n" \
"Port Msk AS Port Msk AS NextHop B/Pk Active\n"
#define CISCO_SH_VERB_FLOW "%-14s %-15s %-14s %-15s %2u %3x %4x %6lu\n" \
"%4.4x /%-2u %-5u %4.4x /%-2u %-5u %-15s %9u %8u\n\n"
-static int flow_cache_print(struct ngnf_flows *recs);
-static int flow_cache_print_verbose(struct ngnf_flows *recs);
-static int ctl_show(int, char **);
+#define CISCO_SH_VERB_FLOW6_HEADER "SrcIf SrcIPaddress DstIf DstIPaddress Pr TOS Flgs Pkts\n" \
+"Port Msk AS Port Msk AS NextHop B/Pk Active\n"
+
+#define CISCO_SH_VERB_FLOW6 "%-14s %-30s %-14s %-30s %2u %3x %4x %6lu\n" \
+ "%4.4x /%-2u %-5u %4.4x /%-2u %-5u %-30s %9u %8u\n\n"
+#ifdef INET
+static void flow_cache_print(struct ngnf_show_header *resp);
+static void flow_cache_print_verbose(struct ngnf_show_header *resp);
+#endif
+#ifdef INET6
+static void flow_cache_print6(struct ngnf_show_header *resp);
+static void flow_cache_print6_verbose(struct ngnf_show_header *resp);
+#endif
+static void ctl_show(int, char **);
+#if defined(INET) || defined(INET6)
+static void do_show(int, void (*func)(struct ngnf_show_header *));
+#endif
static void help(void);
static void execute_command(int, char **);
struct ip_ctl_cmd {
char *cmd_name;
- int (*cmd_func)(int argc, char **argv);
+ void (*cmd_func)(int argc, char **argv);
};
struct ip_ctl_cmd cmds[] = {
@@ -77,7 +95,7 @@ struct ip_ctl_cmd cmds[] = {
};
int cs;
-char ng_nodename[NG_PATHSIZ];
+char *ng_path;
int
main(int argc, char **argv)
@@ -85,7 +103,6 @@ main(int argc, char **argv)
int c;
char sname[NG_NODESIZ];
int rcvbuf = SORCVBUF_SIZE;
- char *ng_name;
/* parse options */
while ((c = getopt(argc, argv, "d:")) != -1) {
@@ -98,14 +115,12 @@ main(int argc, char **argv)
argc -= optind;
argv += optind;
- ng_name = argv[0];
- if (ng_name == NULL)
+ ng_path = argv[0];
+ if (ng_path == NULL || (strlen(ng_path) > NG_PATHSIZ))
help();
argc--;
argv++;
- snprintf(ng_nodename, sizeof(ng_nodename), "%s:", ng_name);
-
/* create control socket. */
snprintf(sname, sizeof(sname), "flowctl%i", getpid());
@@ -145,74 +160,109 @@ execute_command(int argc, char **argv)
(*cmds[cindex].cmd_func)(argc, argv);
}
-static int
+static void
ctl_show(int argc, char **argv)
{
- struct ng_mesg *ng_mesg;
- struct ngnf_flows *data;
- char path[NG_PATHSIZ];
- int token, nread, last = 0;
- int verbose = 0;
+ int ipv4, ipv6, verbose = 0;
+
+ ipv4 = feature_present("inet");
+ ipv6 = feature_present("inet6");
+
+ if (argc > 0 && !strncmp(argv[0], "ipv4", 4)) {
+ ipv6 = 0;
+ argc--;
+ argv++;
+ }
+ if (argc > 0 && !strncmp(argv[0], "ipv6", 4)) {
+ ipv4 = 0;
+ argc--;
+ argv++;
+ }
if (argc > 0 && !strncmp(argv[0], "verbose", strlen(argv[0])))
verbose = 1;
+#ifdef INET
+ if (ipv4) {
+ if (verbose)
+ do_show(4, &flow_cache_print_verbose);
+ else
+ do_show(4, &flow_cache_print);
+ }
+#endif
+
+#ifdef INET6
+ if (ipv6) {
+ if (verbose)
+ do_show(6, &flow_cache_print6_verbose);
+ else
+ do_show(6, &flow_cache_print6);
+ }
+#endif
+}
+
+#if defined(INET) || defined(INET6)
+static void
+do_show(int version, void (*func)(struct ngnf_show_header *))
+{
+ struct ng_mesg *ng_mesg;
+ struct ngnf_show_header req, *resp;
+ int token, nread;
+
ng_mesg = alloca(SORCVBUF_SIZE);
- if (verbose)
- printf(CISCO_SH_VERB_FLOW_HEADER);
- else
- printf(CISCO_SH_FLOW_HEADER);
+ req.version = version;
+ req.hash_id = req.list_id = 0;
for (;;) {
/* request set of accounting records */
- token = NgSendMsg(cs, ng_nodename, NGM_NETFLOW_COOKIE,
- NGM_NETFLOW_SHOW, (void *)&last, sizeof(last));
+ token = NgSendMsg(cs, ng_path, NGM_NETFLOW_COOKIE,
+ NGM_NETFLOW_SHOW, (void *)&req, sizeof(req));
if (token == -1)
err(1, "NgSendMsg(NGM_NETFLOW_SHOW)");
/* read reply */
- nread = NgRecvMsg(cs, ng_mesg, SORCVBUF_SIZE, path);
+ nread = NgRecvMsg(cs, ng_mesg, SORCVBUF_SIZE, NULL);
if (nread == -1)
err(1, "NgRecvMsg() failed");
if (ng_mesg->header.token != token)
err(1, "NgRecvMsg(NGM_NETFLOW_SHOW): token mismatch");
- data = (struct ngnf_flows*)ng_mesg->data;
- if ((ng_mesg->header.arglen < (sizeof(*data))) ||
- (ng_mesg->header.arglen < (sizeof(*data) +
- (data->nentries * sizeof(struct flow_entry_data)))))
+ resp = (struct ngnf_show_header *)ng_mesg->data;
+ if ((ng_mesg->header.arglen < (sizeof(*resp))) ||
+ (ng_mesg->header.arglen < (sizeof(*resp) +
+ (resp->nentries * sizeof(struct flow_entry_data)))))
err(1, "NgRecvMsg(NGM_NETFLOW_SHOW): arglen too small");
- if (verbose)
- (void )flow_cache_print_verbose(data);
- else
- (void )flow_cache_print(data);
+ (*func)(resp);
- if (data->last != 0)
- last = data->last;
+ if (resp->hash_id != 0)
+ req.hash_id = resp->hash_id;
else
break;
+ req.list_id = resp->list_id;
}
-
- return (0);
}
+#endif
-static int
-flow_cache_print(struct ngnf_flows *recs)
+#ifdef INET
+static void
+flow_cache_print(struct ngnf_show_header *resp)
{
struct flow_entry_data *fle;
char src[INET_ADDRSTRLEN], dst[INET_ADDRSTRLEN];
char src_if[IFNAMSIZ], dst_if[IFNAMSIZ];
int i;
- /* quick check */
- if (recs->nentries == 0)
- return (0);
+ if (resp->version != 4)
+ errx(EX_SOFTWARE, "%s: version mismatch: %u",
+ __func__, resp->version);
+
+ printf(CISCO_SH_FLOW_HEADER);
- fle = recs->entries;
- for (i = 0; i < recs->nentries; i++, fle++) {
+ fle = (struct flow_entry_data *)(resp + 1);
+ for (i = 0; i < resp->nentries; i++, fle++) {
inet_ntop(AF_INET, &fle->r.r_src, src, sizeof(src));
inet_ntop(AF_INET, &fle->r.r_dst, dst, sizeof(dst));
printf(CISCO_SH_FLOW,
@@ -226,24 +276,59 @@ flow_cache_print(struct ngnf_flows *recs)
fle->packets);
}
-
- return (i);
}
+#endif
-static int
-flow_cache_print_verbose(struct ngnf_flows *recs)
+#ifdef INET6
+static void
+flow_cache_print6(struct ngnf_show_header *resp)
+{
+ struct flow6_entry_data *fle6;
+ char src6[INET6_ADDRSTRLEN], dst6[INET6_ADDRSTRLEN];
+ char src_if[IFNAMSIZ], dst_if[IFNAMSIZ];
+ int i;
+
+ if (resp->version != 6)
+ errx(EX_SOFTWARE, "%s: version mismatch: %u",
+ __func__, resp->version);
+
+ printf(CISCO_SH_FLOW6_HEADER);
+
+ fle6 = (struct flow6_entry_data *)(resp + 1);
+ for (i = 0; i < resp->nentries; i++, fle6++) {
+ inet_ntop(AF_INET6, &fle6->r.src.r_src6, src6, sizeof(src6));
+ inet_ntop(AF_INET6, &fle6->r.dst.r_dst6, dst6, sizeof(dst6));
+ printf(CISCO_SH_FLOW6,
+ if_indextoname(fle6->fle_i_ifx, src_if),
+ src6,
+ if_indextoname(fle6->fle_o_ifx, dst_if),
+ dst6,
+ fle6->r.r_ip_p,
+ ntohs(fle6->r.r_sport),
+ ntohs(fle6->r.r_dport),
+ fle6->packets);
+
+ }
+}
+#endif
+
+#ifdef INET
+static void
+flow_cache_print_verbose(struct ngnf_show_header *resp)
{
struct flow_entry_data *fle;
char src[INET_ADDRSTRLEN], dst[INET_ADDRSTRLEN], next[INET_ADDRSTRLEN];
char src_if[IFNAMSIZ], dst_if[IFNAMSIZ];
int i;
- /* quick check */
- if (recs->nentries == 0)
- return (0);
+ if (resp->version != 4)
+ errx(EX_SOFTWARE, "%s: version mismatch: %u",
+ __func__, resp->version);
- fle = recs->entries;
- for (i = 0; i < recs->nentries; i++, fle++) {
+ printf(CISCO_SH_VERB_FLOW_HEADER);
+
+ fle = (struct flow_entry_data *)(resp + 1);
+ for (i = 0; i < resp->nentries; i++, fle++) {
inet_ntop(AF_INET, &fle->r.r_src, src, sizeof(src));
inet_ntop(AF_INET, &fle->r.r_dst, dst, sizeof(dst));
inet_ntop(AF_INET, &fle->next_hop, next, sizeof(next));
@@ -267,9 +352,50 @@ flow_cache_print_verbose(struct ngnf_flows *recs)
0);
}
-
- return (i);
}
+#endif
+
+#ifdef INET6
+static void
+flow_cache_print6_verbose(struct ngnf_show_header *resp)
+{
+ struct flow6_entry_data *fle6;
+ char src6[INET6_ADDRSTRLEN], dst6[INET6_ADDRSTRLEN], next6[INET6_ADDRSTRLEN];
+ char src_if[IFNAMSIZ], dst_if[IFNAMSIZ];
+ int i;
+
+ if (resp->version != 6)
+ errx(EX_SOFTWARE, "%s: version mismatch: %u",
+ __func__, resp->version);
+
+ printf(CISCO_SH_VERB_FLOW6_HEADER);
+
+ fle6 = (struct flow6_entry_data *)(resp + 1);
+ for (i = 0; i < resp->nentries; i++, fle6++) {
+ inet_ntop(AF_INET6, &fle6->r.src.r_src6, src6, sizeof(src6));
+ inet_ntop(AF_INET6, &fle6->r.dst.r_dst6, dst6, sizeof(dst6));
+ inet_ntop(AF_INET6, &fle6->n.next_hop6, next6, sizeof(next6));
+ printf(CISCO_SH_VERB_FLOW6,
+ if_indextoname(fle6->fle_i_ifx, src_if),
+ src6,
+ if_indextoname(fle6->fle_o_ifx, dst_if),
+ dst6,
+ fle6->r.r_ip_p,
+ fle6->r.r_tos,
+ fle6->tcp_flags,
+ fle6->packets,
+ ntohs(fle6->r.r_sport),
+ fle6->src_mask,
+ 0,
+ ntohs(fle6->r.r_dport),
+ fle6->dst_mask,
+ 0,
+ next6,
+ (u_int)(fle6->bytes / fle6->packets),
+ 0);
+ }
+}
+#endif
static void
help(void)
diff --git a/usr.sbin/genrandom/Makefile b/usr.sbin/genrandom/Makefile
new file mode 100644
index 0000000..975d84b
--- /dev/null
+++ b/usr.sbin/genrandom/Makefile
@@ -0,0 +1,24 @@
+# $FreeBSD$
+
+BIND_DIR= ${.CURDIR}/../../contrib/bind9
+LIB_BIND_REL= ../../lib/bind
+LIB_BIND_DIR= ${.CURDIR}/${LIB_BIND_REL}
+SRCDIR= ${BIND_DIR}/bin/tools
+
+.include "${LIB_BIND_DIR}/config.mk"
+
+PROG= genrandom
+
+.PATH: ${SRCDIR}
+SRCS+= genrandom.c
+
+CFLAGS+= -I${SRCDIR}/unix/include -I${SRCDIR}/include
+
+DPADD+= ${BIND_DPADD} ${CRYPTO_DPADD} ${PTHREAD_DPADD}
+LDADD+= ${BIND_LDADD} ${CRYPTO_LDADD} ${PTHREAD_LDADD}
+
+WARNS?= 3
+
+MAN= genrandom.8
+
+.include <bsd.prog.mk>
diff --git a/usr.sbin/isc-hmac-fixup/Makefile b/usr.sbin/isc-hmac-fixup/Makefile
new file mode 100644
index 0000000..1313855
--- /dev/null
+++ b/usr.sbin/isc-hmac-fixup/Makefile
@@ -0,0 +1,24 @@
+# $FreeBSD$
+
+BIND_DIR= ${.CURDIR}/../../contrib/bind9
+LIB_BIND_REL= ../../lib/bind
+LIB_BIND_DIR= ${.CURDIR}/${LIB_BIND_REL}
+SRCDIR= ${BIND_DIR}/bin/tools
+
+.include "${LIB_BIND_DIR}/config.mk"
+
+PROG= isc-hmac-fixup
+
+.PATH: ${SRCDIR}
+SRCS+= isc-hmac-fixup.c
+
+CFLAGS+= -I${SRCDIR}/unix/include -I${SRCDIR}/include
+
+DPADD+= ${BIND_DPADD} ${CRYPTO_DPADD} ${PTHREAD_DPADD}
+LDADD+= ${BIND_LDADD} ${CRYPTO_LDADD} ${PTHREAD_LDADD}
+
+WARNS?= 3
+
+MAN= isc-hmac-fixup.8
+
+.include <bsd.prog.mk>
diff --git a/usr.sbin/mountd/exports.5 b/usr.sbin/mountd/exports.5
index 357f82a..f2a1474 100644
--- a/usr.sbin/mountd/exports.5
+++ b/usr.sbin/mountd/exports.5
@@ -28,7 +28,7 @@
.\" @(#)exports.5 8.3 (Berkeley) 3/29/95
.\" $FreeBSD$
.\"
-.Dd December 3, 2009
+.Dd July 12, 2011
.Dt EXPORTS 5
.Os
.Sh NAME
@@ -72,6 +72,13 @@ that can be mounted on by the corresponding client(s).
There are three forms of this specification.
The first is to list all mount points as absolute
directory paths separated by whitespace.
+This list of directory paths should be considered an
+.Dq administrative control ,
+since it is only enforced by the
+.Xr mountd 8
+daemon and not the kernel.
+As such, it only applies to NFSv2 and NFSv3 mounts and only
+with respect to the client's use of the mount protocol.
The second is to specify the pathname of the root of the file system
followed by the
.Fl alldirs
@@ -81,8 +88,21 @@ including regular files if the
.Fl r
option is used on
.Xr mountd 8 .
+Because NFSv4 does not use the mount protocol,
+the
+.Dq administrative controls
+are not applied.
+Thus, all the above export line(s) should be considered to have the
+.Fl alldirs
+flag, even if the line is specified without it.
The third form has the string ``V4:'' followed by a single absolute path
name, to specify the NFSv4 tree root.
+This line does not export any file system, but simply marks where the root
+of the server's directory tree is for NFSv4 clients.
+The exported file systems for NFSv4 are specified via the other lines
+in the
+.Xr exports 5
+file in the same way as for NFSv2 and NFSv3.
The pathnames must not have any symbolic links in them and should not have
any
.Dq Pa \&.
diff --git a/usr.sbin/mountd/mountd.c b/usr.sbin/mountd/mountd.c
index 01a27eb..a1e83c3 100644
--- a/usr.sbin/mountd/mountd.c
+++ b/usr.sbin/mountd/mountd.c
@@ -1789,10 +1789,9 @@ get_exp(void)
{
struct exportlist *ep;
- ep = (struct exportlist *)malloc(sizeof (struct exportlist));
+ ep = (struct exportlist *)calloc(1, sizeof (struct exportlist));
if (ep == (struct exportlist *)NULL)
out_of_mem();
- memset(ep, 0, sizeof(struct exportlist));
return (ep);
}
@@ -1804,10 +1803,9 @@ get_grp(void)
{
struct grouplist *gp;
- gp = (struct grouplist *)malloc(sizeof (struct grouplist));
+ gp = (struct grouplist *)calloc(1, sizeof (struct grouplist));
if (gp == (struct grouplist *)NULL)
out_of_mem();
- memset(gp, 0, sizeof(struct grouplist));
return (gp);
}
diff --git a/usr.sbin/named-checkconf/Makefile b/usr.sbin/named-checkconf/Makefile
index 618cc13..abee068 100644
--- a/usr.sbin/named-checkconf/Makefile
+++ b/usr.sbin/named-checkconf/Makefile
@@ -13,6 +13,7 @@ PROG= named-checkconf
SRCS+= named-checkconf.c check-tool.c
CFLAGS+= -I${LIB_BIND_DIR}
+CFLAGS+= -I${BIND_DIR}/lib/isc/${ISC_ATOMIC_ARCH}/include
WARNS?= 3
diff --git a/usr.sbin/named-journalprint/Makefile b/usr.sbin/named-journalprint/Makefile
new file mode 100644
index 0000000..cdf4016
--- /dev/null
+++ b/usr.sbin/named-journalprint/Makefile
@@ -0,0 +1,24 @@
+# $FreeBSD$
+
+BIND_DIR= ${.CURDIR}/../../contrib/bind9
+LIB_BIND_REL= ../../lib/bind
+LIB_BIND_DIR= ${.CURDIR}/${LIB_BIND_REL}
+SRCDIR= ${BIND_DIR}/bin/tools
+
+.include "${LIB_BIND_DIR}/config.mk"
+
+PROG= named-journalprint
+
+.PATH: ${SRCDIR}
+SRCS+= named-journalprint.c
+
+CFLAGS+= -I${SRCDIR}/unix/include -I${SRCDIR}/include
+
+DPADD+= ${BIND_DPADD} ${CRYPTO_DPADD} ${PTHREAD_DPADD}
+LDADD+= ${BIND_LDADD} ${CRYPTO_LDADD} ${PTHREAD_LDADD}
+
+WARNS?= 3
+
+MAN= named-journalprint.8
+
+.include <bsd.prog.mk>
diff --git a/usr.sbin/named.reload/Makefile b/usr.sbin/named.reload/Makefile
deleted file mode 100644
index 7ea9d06..0000000
--- a/usr.sbin/named.reload/Makefile
+++ /dev/null
@@ -1,9 +0,0 @@
-# $FreeBSD$
-
-SCRIPTS= named.reload.sh
-MAN= named.reload.8
-
-LINKS= ${BINDIR}/named.reload ${BINDIR}/named.reconfig
-MLINKS= named.reload.8 named.reconfig.8
-
-.include <bsd.prog.mk>
diff --git a/usr.sbin/named.reload/named.reload.8 b/usr.sbin/named.reload/named.reload.8
deleted file mode 100644
index 6458774..0000000
--- a/usr.sbin/named.reload/named.reload.8
+++ /dev/null
@@ -1,68 +0,0 @@
-.\"-
-.\" Copyright (c) 2004 Dag-Erling Coïdan Smørgrav
-.\" All rights reserved.
-.\"
-.\" Redistribution and use in source and binary forms, with or without
-.\" modification, are permitted provided that the following conditions
-.\" are met:
-.\" 1. Redistributions of source code must retain the above copyright
-.\" notice, this list of conditions and the following disclaimer
-.\" in this position and unchanged.
-.\" 2. Redistributions in binary form must reproduce the above copyright
-.\" notice, this list of conditions and the following disclaimer in the
-.\" documentation and/or other materials provided with the distribution.
-.\"
-.\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
-.\" IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
-.\" OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
-.\" IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
-.\" INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-.\" NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-.\" DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-.\" THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-.\" (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
-.\" THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-.\"
-.\" $FreeBSD$
-.\"
-.Dd September 21, 2004
-.Dt NAMED.RELOAD 8
-.Os
-.Sh NAME
-.Nm named.reconfig ,
-.Nm named.reload
-.Nd reload name server configuration
-.Sh SYNOPSIS
-.Nm named.reconfig
-.Op Fl V
-.Op Fl c config-file
-.Op Fl k key-file
-.Op Fl s server
-.Op Fl p port
-.Op Fl y keyid
-.Nm named.reload
-.Op Fl V
-.Op Fl c config-file
-.Op Fl k key-file
-.Op Fl s server
-.Op Fl p port
-.Op Fl y keyid
-.Sh DESCRIPTION
-The
-.Nm named.reconfig
-command signals the name server to reload its configuration files and
-load any new zones.
-.Pp
-The
-.Nm named.reload
-command signals the name server to reload its configuration files and
-all zones.
-.Pp
-Both these commands take the same command-line arguments as
-.Xr rndc 8 ,
-except for the command argument, which is implied by the name.
-.Sh SEE ALSO
-.Xr named.conf 5 ,
-.Xr rndc.conf 5 ,
-.Xr named 8 ,
-.Xr rndc 8
diff --git a/usr.sbin/named.reload/named.reload.sh b/usr.sbin/named.reload/named.reload.sh
deleted file mode 100644
index d1ee3af..0000000
--- a/usr.sbin/named.reload/named.reload.sh
+++ /dev/null
@@ -1,42 +0,0 @@
-#!/bin/sh
-#-
-# Copyright (c) 2004 Dag-Erling Coïdan Smørgrav
-# All rights reserved.
-#
-# Redistribution and use in source and binary forms, with or without
-# modification, are permitted provided that the following conditions
-# are met:
-# 1. Redistributions of source code must retain the above copyright
-# notice, this list of conditions and the following disclaimer
-# in this position and unchanged.
-# 2. Redistributions in binary form must reproduce the above copyright
-# notice, this list of conditions and the following disclaimer in the
-# documentation and/or other materials provided with the distribution.
-#
-# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
-# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
-# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
-# IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
-# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-# NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
-# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-#
-# $FreeBSD$
-#
-
-rndc=/usr/sbin/rndc
-me=$(basename $0)
-cmd=${me#named.}
-cmd=${cmd%.sh}
-
-args=$(getopt "c:k:s:p:Vy:" "$@")
-if [ $? -ne 0 -o $# -ne 0 ] ; then
- echo "usage: ${me} [-V] [-c config-file] [-k key-file]" 1>&2
- echo " [-s server] [-p port] [-y keyid]" 1>&2
- exit 1
-fi
-
-exec "${rndc}" "$@" "${cmd}"
diff --git a/usr.sbin/named/Makefile b/usr.sbin/named/Makefile
index adeb3da..89de5ac 100644
--- a/usr.sbin/named/Makefile
+++ b/usr.sbin/named/Makefile
@@ -36,12 +36,11 @@ SRCS+= os.c
SRCS+= builtin.c client.c config.c control.c \
controlconf.c interfacemgr.c \
listenlist.c log.c logconf.c main.c notify.c \
- query.c server.c sortlist.c \
+ query.c server.c sortlist.c statschannel.c \
tkeyconf.c tsigconf.c update.c xfrout.c \
zoneconf.c \
lwaddr.c lwresd.c lwdclient.c lwderror.c lwdgabn.c \
- lwdgnba.c lwdgrbn.c lwdnoop.c lwsearch.c \
- statschannel.c
+ lwdgnba.c lwdgrbn.c lwdnoop.c lwsearch.c
CFLAGS+= -DCONFIGARGS="\"${CONFIGARGS}\""
@@ -58,7 +57,8 @@ LDADD+= ${BIND_LDADD} ${CRYPTO_LDADD} ${PTHREAD_LDADD}
MAN= named.8 lwresd.8 named.conf.5
-MANFILTER= sed -e "s@/etc/named\.conf@/etc/namedb/named.conf@g"
+MANFILTER= sed -e "s@/etc/named\.conf@/etc/namedb/named.conf@g" \
+ -e "s@/var\/run\/named\/named.pid@/var/run/named/pid@"
LINKS= ${BINDIR}/named ${BINDIR}/lwresd
diff --git a/usr.sbin/nsec3hash/Makefile b/usr.sbin/nsec3hash/Makefile
new file mode 100644
index 0000000..6dbea09
--- /dev/null
+++ b/usr.sbin/nsec3hash/Makefile
@@ -0,0 +1,24 @@
+# $FreeBSD$
+
+BIND_DIR= ${.CURDIR}/../../contrib/bind9
+LIB_BIND_REL= ../../lib/bind
+LIB_BIND_DIR= ${.CURDIR}/${LIB_BIND_REL}
+SRCDIR= ${BIND_DIR}/bin/tools
+
+.include "${LIB_BIND_DIR}/config.mk"
+
+PROG= nsec3hash
+
+.PATH: ${SRCDIR}
+SRCS+= nsec3hash.c
+
+CFLAGS+= -I${SRCDIR}/unix/include -I${SRCDIR}/include
+
+DPADD+= ${BIND_DPADD} ${CRYPTO_DPADD} ${PTHREAD_DPADD}
+LDADD+= ${BIND_LDADD} ${CRYPTO_LDADD} ${PTHREAD_LDADD}
+
+WARNS?= 2
+
+MAN= nsec3hash.8
+
+.include <bsd.prog.mk>
diff --git a/usr.sbin/pmccontrol/pmccontrol.c b/usr.sbin/pmccontrol/pmccontrol.c
index 80d4bd7..2a680ae 100644
--- a/usr.sbin/pmccontrol/pmccontrol.c
+++ b/usr.sbin/pmccontrol/pmccontrol.c
@@ -134,33 +134,15 @@ pmcc_init_debug(void)
static int
pmcc_do_enable_disable(struct pmcc_op_list *op_list)
{
- long cpusetsize;
int c, error, i, j, ncpu, npmc, t;
- cpuset_t haltedcpus, cpumask;
struct pmcc_op *np;
unsigned char *map;
unsigned char op;
int cpu, pmc;
- size_t setsize;
if ((ncpu = pmc_ncpu()) < 0)
err(EX_OSERR, "Unable to determine the number of cpus");
- /* Determine the set of active CPUs. */
- cpusetsize = sysconf(_SC_CPUSET_SIZE);
- if (cpusetsize == -1 || (u_long)cpusetsize > sizeof(cpuset_t)) {
- err(EX_OSERR, "ERROR: Cannot determine which CPUs are "
- "halted");
- }
- CPU_ZERO(&haltedcpus);
- setsize = (size_t)cpusetsize;
- if (ncpu > 1 && sysctlbyname("machdep.hlt_cpus", &haltedcpus,
- &setsize, NULL, 0) < 0)
- err(EX_OSERR, "ERROR: Cannot determine which CPUs are "
- "halted");
- CPU_FILL(&cpumask);
- CPU_NAND(&cpumask, &haltedcpus);
-
/* Determine the maximum number of PMCs in any CPU. */
npmc = 0;
for (c = 0; c < ncpu; c++) {
@@ -207,8 +189,7 @@ pmcc_do_enable_disable(struct pmcc_op_list *op_list)
if (cpu == PMCC_CPU_ALL)
for (i = 0; i < ncpu; i++) {
- if (CPU_ISSET(i, &cpumask))
- SET_PMCS(i, pmc, op);
+ SET_PMCS(i, pmc, op);
}
else
SET_PMCS(cpu, pmc, op);
@@ -240,9 +221,10 @@ pmcc_do_enable_disable(struct pmcc_op_list *op_list)
static int
pmcc_do_list_state(void)
{
- size_t dummy;
+ cpuset_t logical_cpus_mask;
+ long cpusetsize;
+ size_t setsize;
int c, cpu, n, npmc, ncpu;
- unsigned int logical_cpus_mask;
struct pmc_info *pd;
struct pmc_pmcinfo *pi;
const struct pmc_cpuinfo *pc;
@@ -254,17 +236,22 @@ pmcc_do_list_state(void)
pmc_name_of_cputype(pc->pm_cputype),
pc->pm_npmc);
- dummy = sizeof(logical_cpus_mask);
+ /* Determine the set of logical CPUs. */
+ cpusetsize = sysconf(_SC_CPUSET_SIZE);
+ if (cpusetsize == -1 || (u_long)cpusetsize > sizeof(cpuset_t))
+ err(EX_OSERR, "Cannot determine which CPUs are logical");
+ CPU_ZERO(&logical_cpus_mask);
+ setsize = (size_t)cpusetsize;
if (sysctlbyname("machdep.logical_cpus_mask", &logical_cpus_mask,
- &dummy, NULL, 0) < 0)
- logical_cpus_mask = 0;
+ &setsize, NULL, 0) < 0)
+ CPU_ZERO(&logical_cpus_mask);
ncpu = pc->pm_ncpu;
for (c = cpu = 0; cpu < ncpu; cpu++) {
#if defined(__i386__) || defined(__amd64__)
if (pc->pm_cputype == PMC_CPU_INTEL_PIV &&
- (logical_cpus_mask & (1 << cpu)))
+ CPU_ISSET(cpu, &logical_cpus_mask))
continue; /* skip P4-style 'logical' cpus */
#endif
if (pmc_pmcinfo(cpu, &pi) < 0) {
diff --git a/usr.sbin/pmcstat/pmcstat.c b/usr.sbin/pmcstat/pmcstat.c
index ab3846c..52e02a8 100644
--- a/usr.sbin/pmcstat/pmcstat.c
+++ b/usr.sbin/pmcstat/pmcstat.c
@@ -552,7 +552,7 @@ int
main(int argc, char **argv)
{
double interval;
- int option, npmc, ncpu, haltedcpus;
+ int option, npmc, ncpu;
int c, check_driver_stats, current_cpu, current_sampling_count;
int do_callchain, do_descendants, do_logproccsw, do_logprocexit;
int do_print;
@@ -617,14 +617,6 @@ main(int argc, char **argv)
if (sysctlbyname("hw.ncpu", &ncpu, &dummy, NULL, 0) < 0)
err(EX_OSERR, "ERROR: Cannot determine the number of CPUs");
cpumask = (1 << ncpu) - 1;
- haltedcpus = 0;
- if (ncpu > 1) {
- if (sysctlbyname("machdep.hlt_cpus", &haltedcpus, &dummy,
- NULL, 0) < 0)
- err(EX_OSERR, "ERROR: Cannot determine which CPUs are "
- "halted");
- cpumask &= ~haltedcpus;
- }
while ((option = getopt(argc, argv,
"CD:EF:G:M:NO:P:R:S:TWc:df:gk:m:n:o:p:qr:s:t:vw:z:")) != -1)
@@ -637,7 +629,7 @@ main(int argc, char **argv)
case 'c': /* CPU */
if (optarg[0] == '*' && optarg[1] == '\0')
- cpumask = ((1 << ncpu) - 1) & ~haltedcpus;
+ cpumask = (1 << ncpu) - 1;
else
cpumask = pmcstat_get_cpumask(optarg);
diff --git a/usr.sbin/pwd_mkdb/pwd_mkdb.c b/usr.sbin/pwd_mkdb/pwd_mkdb.c
index 2abbcdf..79f91a9 100644
--- a/usr.sbin/pwd_mkdb/pwd_mkdb.c
+++ b/usr.sbin/pwd_mkdb/pwd_mkdb.c
@@ -351,14 +351,16 @@ main(int argc, char *argv[])
if ((dp->put)(sdp, &key, &data, 0) == -1)
error("put");
}
- ypcnt = 1;
+ ypcnt = 0;
data.data = (u_char *)buf;
sdata.data = (u_char *)sbuf;
key.data = (u_char *)tbuf;
for (cnt = 1; scan(fp, &pwd); ++cnt) {
if (!is_comment &&
- (pwd.pw_name[0] == '+' || pwd.pw_name[0] == '-'))
+ (pwd.pw_name[0] == '+' || pwd.pw_name[0] == '-')) {
yp_enabled = 1;
+ ypcnt++;
+ }
if (is_comment)
--cnt;
#define COMPACT(e) t = e; while ((*p++ = *t++));
@@ -456,7 +458,6 @@ main(int argc, char *argv[])
tbuf[0] = CURRENT_VERSION(_PW_KEYYPBYNUM);
store = htonl(ypcnt);
memmove(tbuf + 1, &store, sizeof(store));
- ypcnt++;
key.size = sizeof(store) + 1;
if ((dp->put)(dp, &key, &data, method) == -1)
error("put");
@@ -547,7 +548,6 @@ main(int argc, char *argv[])
tbuf[0] = LEGACY_VERSION(_PW_KEYYPBYNUM);
store = HTOL(ypcnt);
memmove(tbuf + 1, &store, sizeof(store));
- ypcnt++;
key.size = sizeof(store) + 1;
if ((dp->put)(dp, &key, &data, method) == -1)
error("put");
diff --git a/usr.sbin/rndc-confgen/Makefile b/usr.sbin/rndc-confgen/Makefile
index 08f2d7e..2474920 100644
--- a/usr.sbin/rndc-confgen/Makefile
+++ b/usr.sbin/rndc-confgen/Makefile
@@ -3,7 +3,7 @@
BIND_DIR= ${.CURDIR}/../../contrib/bind9
LIB_BIND_REL= ../../lib/bind
LIB_BIND_DIR= ${.CURDIR}/${LIB_BIND_REL}
-SRCDIR= ${BIND_DIR}/bin/rndc
+SRCDIR= ${BIND_DIR}/bin/confgen
.include "${LIB_BIND_DIR}/config.mk"
@@ -13,7 +13,7 @@ PROG= rndc-confgen
SRCS+= os.c
.PATH: ${SRCDIR}
-SRCS+= rndc-confgen.c util.c
+SRCS+= rndc-confgen.c keygen.c util.c
CFLAGS+= -I${SRCDIR}/unix/include -I${SRCDIR}/include -I${LIB_BIND_DIR}
diff --git a/usr.sbin/rndc/Makefile b/usr.sbin/rndc/Makefile
index 9cd356f..66d8452 100644
--- a/usr.sbin/rndc/Makefile
+++ b/usr.sbin/rndc/Makefile
@@ -9,13 +9,11 @@ SRCDIR= ${BIND_DIR}/bin/rndc
PROG= rndc
-.PATH: ${SRCDIR}/unix
-SRCS+= os.c
-
.PATH: ${SRCDIR}
SRCS+= rndc.c util.c
-CFLAGS+= -I${SRCDIR}/unix/include -I${SRCDIR}/include -I${LIB_BIND_DIR}
+CFLAGS+= -I${SRCDIR}/include -I${LIB_BIND_DIR}
+CFLAGS+= -I${BIND_DIR}/lib/isc/${ISC_ATOMIC_ARCH}/include
WARNS?= 3
diff --git a/usr.sbin/rpcbind/rpcb_stat.c b/usr.sbin/rpcbind/rpcb_stat.c
index b10ed50..3061754 100644
--- a/usr.sbin/rpcbind/rpcb_stat.c
+++ b/usr.sbin/rpcbind/rpcb_stat.c
@@ -54,7 +54,7 @@
static rpcb_stat_byvers inf;
void
-rpcbs_init()
+rpcbs_init(void)
{
}
diff --git a/usr.sbin/rpcbind/rpcb_svc_com.c b/usr.sbin/rpcbind/rpcb_svc_com.c
index 79cb937..f90dc59 100644
--- a/usr.sbin/rpcbind/rpcb_svc_com.c
+++ b/usr.sbin/rpcbind/rpcb_svc_com.c
@@ -1076,7 +1076,7 @@ netbuffree(struct netbuf *ap)
extern bool_t __svc_clean_idle(fd_set *, int, bool_t);
void
-my_svc_run()
+my_svc_run(void)
{
size_t nfds;
struct pollfd pollfds[FD_SETSIZE];
diff --git a/usr.sbin/rpcbind/rpcbind.c b/usr.sbin/rpcbind/rpcbind.c
index 5a76a68..dff0b08 100644
--- a/usr.sbin/rpcbind/rpcbind.c
+++ b/usr.sbin/rpcbind/rpcbind.c
@@ -178,12 +178,13 @@ main(int argc, char *argv[])
init_transport(nconf);
while ((nconf = getnetconfig(nc_handle))) {
- if (nconf->nc_flag & NC_VISIBLE)
+ if (nconf->nc_flag & NC_VISIBLE) {
if (ipv6_only == 1 && strcmp(nconf->nc_protofmly,
"inet") == 0) {
/* DO NOTHING */
} else
init_transport(nconf);
+ }
}
endnetconfig(nc_handle);
@@ -766,7 +767,7 @@ terminate(int dummy __unused)
}
void
-rpcbind_abort()
+rpcbind_abort(void)
{
#ifdef WARMSTART
write_warmstart(); /* Dump yourself */
diff --git a/usr.sbin/rpcbind/util.c b/usr.sbin/rpcbind/util.c
index 6c41253..16e6f70 100644
--- a/usr.sbin/rpcbind/util.c
+++ b/usr.sbin/rpcbind/util.c
@@ -283,7 +283,7 @@ freeit:
}
void
-network_init()
+network_init(void)
{
#ifdef INET6
struct ifaddrs *ifap, *ifp;
diff --git a/usr.sbin/rpcbind/warmstart.c b/usr.sbin/rpcbind/warmstart.c
index 410f270..fc0956f 100644
--- a/usr.sbin/rpcbind/warmstart.c
+++ b/usr.sbin/rpcbind/warmstart.c
@@ -142,7 +142,7 @@ error: fprintf(stderr, "rpcbind: will start from scratch\n");
}
void
-write_warmstart()
+write_warmstart(void)
{
(void) write_struct(RPCBFILE, (xdrproc_t)xdr_rpcblist_ptr, &list_rbl);
#ifdef PORTMAP
@@ -152,7 +152,7 @@ write_warmstart()
}
void
-read_warmstart()
+read_warmstart(void)
{
rpcblist_ptr tmp_rpcbl = NULL;
#ifdef PORTMAP
diff --git a/usr.sbin/rtadvctl/Makefile b/usr.sbin/rtadvctl/Makefile
new file mode 100644
index 0000000..a66db84c4
--- /dev/null
+++ b/usr.sbin/rtadvctl/Makefile
@@ -0,0 +1,13 @@
+# $FreeBSD$
+#
+.PATH: ${.CURDIR}/../rtadvd
+
+PROG= rtadvctl
+MAN= rtadvctl.8
+
+SRCS= rtadvctl.c control.c control_client.c if.c timer_subr.c
+
+CFLAGS+= -I${.CURDIR} -I${.CURDIR}/../rtadvd
+WARNS?= 1
+
+.include <bsd.prog.mk>
diff --git a/usr.sbin/rtadvctl/rtadvctl.8 b/usr.sbin/rtadvctl/rtadvctl.8
new file mode 100644
index 0000000..f779c98
--- /dev/null
+++ b/usr.sbin/rtadvctl/rtadvctl.8
@@ -0,0 +1,104 @@
+.\" Copyright (C) 2011 Hiroki Sato <hrs@FreeBSD.org>.
+.\" All rights reserved.
+.\"
+.\" Redistribution and use in source and binary forms, with or without
+.\" modification, are permitted provided that the following conditions
+.\" are met:
+.\" 1. Redistributions of source code must retain the above copyright
+.\" notice, this list of conditions and the following disclaimer.
+.\" 2. Redistributions in binary form must reproduce the above copyright
+.\" notice, this list of conditions and the following disclaimer in the
+.\" documentation and/or other materials provided with the distribution.
+.\"
+.\" THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS
+.\" IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+.\" LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+.\" FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+.\" PROJECT OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+.\" INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+.\" (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+.\" SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+.\" CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+.\" OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
+.\" EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+.\"
+.\" $FreeBSD$
+.\"
+.Dd July 16, 2011
+.Dt RTADVCTL 8
+.Os
+.Sh NAME
+.Nm rtadvctl
+.Nd control program for
+.Xr rtadvd 8 daemon
+.Sh SYNOPSIS
+.Nm
+.Op Fl v
+.Ar subcommand
+.Op Ar interface ...
+.Sh DESCRIPTION
+.Nm
+is a utility that communicates with
+.Xr rtadvd 8
+daemon and displays information about Router Advertisement messages being
+sent on each interface.
+.Pp
+This utility provides several options and subcommands.
+The options are as follows:
+.Bl -tag -width indent
+.\"
+.It Fl v
+Increase verbosity level.
+When specified once, the
+.Nm
+utility shows additional information about prefixes, RDNSS, and DNSSL
+options.
+When given twice, it additionally shows information about
+inactive interfaces and some statistics.
+.El
+.Pp
+The subcommands are as follows:
+.Bl -tag -width indent
+.\"
+.It reload Op interfaces...
+Specifies to reload the configuration file. If one or more
+.Ar interface
+is specified, configuration entries for the interfaces will be reloaded
+selectively.
+.It enable interfaces...
+Specifies to mark the interface as enable and to try to reload the
+configuration entry.
+This subcommand is useful for dynamically-added interfaces.
+.Pp
+The
+.Xr rtadvd 8
+daemon marks an interface as enable if the interface exists and the
+configuration file has a valid entry for that when it is invoked.
+.It disable interfaces...
+Specifies to mark the interface as disable.
+.It shutdown
+Makes the
+.Xr rtadvd 8
+daemon shut down.
+Note that the
+.Xr rtadvd 8
+daemon will send several RAs with zero lifetime to invalidate the old
+information on each interface.
+It will take at most nine seconds.
+.It show Op interfaces...
+Displays information on Router Advertisement messages being sent
+on each interface.
+.El
+.Sh SEE ALSO
+.Xr rtadvd 8 ,
+.Xr rtadvd.conf 5
+.Sh HISTORY
+The
+.Nm
+command first appeared in
+.Fx 9.0 .
+.Sh AUTHORS
+.Nm
+was written by
+.An "Hiroki Sato" Aq hrs@FreeBSD.org .
diff --git a/usr.sbin/rtadvctl/rtadvctl.c b/usr.sbin/rtadvctl/rtadvctl.c
new file mode 100644
index 0000000..26bf11d
--- /dev/null
+++ b/usr.sbin/rtadvctl/rtadvctl.c
@@ -0,0 +1,926 @@
+/*-
+ * Copyright (C) 2011 Hiroki Sato <hrs@FreeBSD.org>
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
+ * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+ * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * $FreeBSD$
+ *
+ */
+
+#include <sys/queue.h>
+#include <sys/types.h>
+#include <sys/socket.h>
+#include <sys/stat.h>
+#include <sys/un.h>
+#include <sys/uio.h>
+#include <net/if.h>
+#include <net/if_dl.h>
+#include <net/if_types.h>
+#include <net/if_var.h>
+#include <net/ethernet.h>
+#include <netinet/in.h>
+#include <netinet/ip6.h>
+#include <netinet/icmp6.h>
+#include <netinet6/in6_var.h>
+#include <netinet6/nd6.h>
+#include <arpa/inet.h>
+#include <fcntl.h>
+#include <errno.h>
+#include <inttypes.h>
+#include <netdb.h>
+#include <unistd.h>
+#include <string.h>
+#include <stdarg.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <stdarg.h>
+#include <syslog.h>
+#include <err.h>
+
+#include "pathnames.h"
+#include "rtadvd.h"
+#include "if.h"
+#include "timer_subr.h"
+#include "timer.h"
+#include "control.h"
+#include "control_client.h"
+
+#define RA_IFSTATUS_INACTIVE 0
+#define RA_IFSTATUS_RA_RECV 1
+#define RA_IFSTATUS_RA_SEND 2
+
+static int vflag = LOG_ERR;
+
+static void usage(void);
+
+static int action_propset(char *);
+static int action_propget(char *, struct ctrl_msg_pl *);
+static int action_plgeneric(int, char *, char *);
+
+static int action_enable(int, char **);
+static int action_disable(int, char **);
+static int action_reload(int, char **);
+static int action_echo(int, char **);
+static int action_version(int, char **);
+static int action_shutdown(int, char **);
+
+static int action_show(int, char **);
+static int action_show_prefix(struct prefix *);
+static int action_show_rtinfo(struct rtinfo *);
+static int action_show_rdnss(void *);
+static int action_show_dnssl(void *);
+
+static int csock_client_open(struct sockinfo *);
+static size_t dname_labeldec(char *, size_t, const char *);
+static void mysyslog(int, const char *, ...);
+
+static const char *rtpref_str[] = {
+ "medium", /* 00 */
+ "high", /* 01 */
+ "rsv", /* 10 */
+ "low" /* 11 */
+};
+
+static struct dispatch_table {
+ const char *dt_comm;
+ int (*dt_act)(int, char **);
+} dtable[] = {
+ { "show", action_show },
+ { "reload", action_reload },
+ { "shutdown", action_shutdown },
+ { "enable", action_enable },
+ { "disable", action_disable },
+ { NULL, NULL },
+ { "echo", action_echo },
+ { "version", action_version },
+ { NULL, NULL },
+};
+
+static char errmsgbuf[1024];
+static char *errmsg = NULL;
+
+static void
+mysyslog(int priority, const char * restrict fmt, ...)
+{
+ va_list ap;
+
+ if (vflag >= priority) {
+ va_start(ap, fmt);
+ vfprintf(stderr, fmt, ap);
+ fprintf(stderr, "\n");
+ va_end(ap);
+ }
+}
+
+static void
+usage(void)
+{
+ int i;
+
+ for (i = 0; (size_t)i < sizeof(dtable)/sizeof(dtable[0]); i++) {
+ if (dtable[i].dt_comm == NULL)
+ break;
+ printf("%s\n", dtable[i].dt_comm);
+ }
+
+ exit(1);
+}
+
+int
+main(int argc, char *argv[])
+{
+ int i;
+ int ch;
+ int (*action)(int, char **) = NULL;
+ int error;
+
+ while ((ch = getopt(argc, argv, "Dv")) != -1) {
+ switch (ch) {
+ case 'D':
+ vflag = LOG_DEBUG;
+ break;
+ case 'v':
+ vflag++;
+ break;
+ default:
+ usage();
+ }
+ }
+ argc -= optind;
+ argv += optind;
+
+ if (argc == 0)
+ usage();
+
+ for (i = 0; (size_t)i < sizeof(dtable)/sizeof(dtable[0]); i++) {
+ if (dtable[i].dt_comm == NULL ||
+ strcmp(dtable[i].dt_comm, argv[0]) == 0) {
+ action = dtable[i].dt_act;
+ break;
+ }
+ }
+
+ if (action == NULL)
+ usage();
+
+ error = (dtable[i].dt_act)(--argc, ++argv);
+ if (error) {
+ fprintf(stderr, "%s failed", dtable[i].dt_comm);
+ if (errmsg != NULL)
+ fprintf(stderr, ": %s", errmsg);
+ fprintf(stderr, ".\n");
+ }
+
+ return (error);
+}
+
+static int
+csock_client_open(struct sockinfo *s)
+{
+ struct sockaddr_un sun;
+
+ if ((s->si_fd = socket(PF_UNIX, SOCK_STREAM, 0)) == -1)
+ err(1, "cannot open control socket.");
+
+ memset(&sun, 0, sizeof(sun));
+ sun.sun_family = AF_UNIX;
+ sun.sun_len = sizeof(sun);
+ strlcpy(sun.sun_path, s->si_name, sizeof(sun.sun_path));
+
+ if (connect(s->si_fd, (struct sockaddr *)&sun, sizeof(sun)) == -1)
+ err(1, "connect: %s", s->si_name);
+
+ mysyslog(LOG_DEBUG,
+ "<%s> connected to %s", __func__, sun.sun_path);
+
+ return (0);
+}
+
+static int
+action_plgeneric(int action, char *plstr, char *buf)
+{
+ struct ctrl_msg_hdr *cm;
+ struct ctrl_msg_pl cp;
+ struct sockinfo *s;
+ char *msg;
+ char *p;
+ char *q;
+
+ s = &ctrlsock;
+ csock_client_open(s);
+
+ cm = (struct ctrl_msg_hdr *)buf;
+ msg = (char *)buf + sizeof(*cm);
+
+ cm->cm_version = CM_VERSION;
+ cm->cm_type = action;
+ cm->cm_len = sizeof(*cm);
+
+ if (plstr != NULL) {
+ memset(&cp, 0, sizeof(cp));
+ p = strchr(plstr, ':');
+ q = strchr(plstr, '=');
+ if (p != NULL && q != NULL && p > q)
+ return (1);
+
+ if (p == NULL) { /* No : */
+ cp.cp_ifname = NULL;
+ cp.cp_key = plstr;
+ } else if (p == plstr) { /* empty */
+ cp.cp_ifname = NULL;
+ cp.cp_key = plstr + 1;
+ } else {
+ *p++ = '\0';
+ cp.cp_ifname = plstr;
+ cp.cp_key = p;
+ }
+ if (q == NULL)
+ cp.cp_val = NULL;
+ else {
+ *q++ = '\0';
+ cp.cp_val = q;
+ }
+ cm->cm_len += cmsg_pl2bin(msg, &cp);
+
+ mysyslog(LOG_DEBUG, "<%s> key=%s, val_len=%d, ifname=%s",
+ __func__,cp.cp_key, cp.cp_val_len, cp.cp_ifname);
+ }
+
+ return (cmsg_handler_client(s->si_fd, CM_STATE_MSG_DISPATCH, buf));
+}
+
+static int
+action_propget(char *argv, struct ctrl_msg_pl *cp)
+{
+ int error;
+ struct ctrl_msg_hdr *cm;
+ char buf[CM_MSG_MAXLEN];
+ char *msg;
+
+ memset(cp, 0, sizeof(*cp));
+ cm = (struct ctrl_msg_hdr *)buf;
+ msg = (char *)buf + sizeof(*cm);
+
+ error = action_plgeneric(CM_TYPE_REQ_GET_PROP, argv, buf);
+ if (error || cm->cm_len <= sizeof(*cm))
+ return (1);
+
+ cmsg_bin2pl(msg, cp);
+ mysyslog(LOG_DEBUG, "<%s> type=%d, len=%d",
+ __func__, cm->cm_type, cm->cm_len);
+ mysyslog(LOG_DEBUG, "<%s> key=%s, val_len=%d, ifname=%s",
+ __func__,cp->cp_key, cp->cp_val_len, cp->cp_ifname);
+
+ return (0);
+}
+
+static int
+action_propset(char *argv)
+{
+ char buf[CM_MSG_MAXLEN];
+
+ return (action_plgeneric(CM_TYPE_REQ_SET_PROP, argv, buf));
+}
+
+static int
+action_disable(int argc, char **argv)
+{
+ char *action_argv;
+ char argv_disable[IFNAMSIZ + sizeof(":disable=")];
+ int i;
+ int error;
+
+ if (argc < 1)
+ return (1);
+
+ error = 0;
+ for (i = 0; i < argc; i++) {
+ sprintf(argv_disable, "%s:disable=", argv[i]);
+ action_argv = argv_disable;
+ error += action_propset(action_argv);
+ }
+
+ return (error);
+}
+
+static int
+action_enable(int argc, char **argv)
+{
+ char *action_argv;
+ char argv_enable[IFNAMSIZ + sizeof(":enable=")];
+ int i;
+ int error;
+
+ if (argc < 1)
+ return (1);
+
+ error = 0;
+ for (i = 0; i < argc; i++) {
+ sprintf(argv_enable, "%s:enable=", argv[i]);
+ action_argv = argv_enable;
+ error += action_propset(action_argv);
+ }
+
+ return (error);
+}
+
+static int
+action_reload(int argc, char **argv)
+{
+ char *action_argv;
+ char argv_reload[IFNAMSIZ + sizeof(":reload=")];
+ int i;
+ int error;
+
+ if (argc == 0) {
+ action_argv = strdup(":reload=");
+ return (action_propset(action_argv));
+ }
+
+ error = 0;
+ for (i = 0; i < argc; i++) {
+ sprintf(argv_reload, "%s:reload=", argv[i]);
+ action_argv = argv_reload;
+ error += action_propset(action_argv);
+ }
+
+ return (error);
+}
+
+static int
+action_echo(int argc __unused, char **argv __unused)
+{
+ char *action_argv;
+
+ action_argv = strdup("echo");
+ return (action_propset(action_argv));
+}
+
+static int
+action_shutdown(int argc __unused, char **argv __unused)
+{
+ char *action_argv;
+
+ action_argv = strdup("shutdown");
+ return (action_propset(action_argv));
+}
+
+/* XXX */
+static int
+action_version(int argc __unused, char **argv __unused)
+{
+ char *action_argv;
+ struct ctrl_msg_pl cp;
+ int error;
+
+ action_argv = strdup(":version=");
+ error = action_propget(action_argv, &cp);
+ if (error)
+ return (error);
+
+ printf("version=%s\n", cp.cp_val);
+ return (0);
+}
+
+static int
+action_show(int argc, char **argv)
+{
+ char *action_argv;
+ char argv_ifilist[sizeof(":ifilist=")] = ":ifilist=";
+ char argv_ifi[IFNAMSIZ + sizeof(":ifi=")];
+ char argv_rai[IFNAMSIZ + sizeof(":rai=")];
+ char argv_rti[IFNAMSIZ + sizeof(":rti=")];
+ char argv_pfx[IFNAMSIZ + sizeof(":pfx=")];
+ char argv_ifi_ra_timer[IFNAMSIZ + sizeof(":ifi_ra_timer=")];
+ char argv_rdnss[IFNAMSIZ + sizeof(":rdnss=")];
+ char argv_dnssl[IFNAMSIZ + sizeof(":dnssl=")];
+ char ssbuf[SSBUFLEN];
+
+ struct ctrl_msg_pl cp;
+ struct ifinfo *ifi;
+ TAILQ_HEAD(, ifinfo) ifl = TAILQ_HEAD_INITIALIZER(ifl);
+ char *endp;
+ char *p;
+ int error;
+ int i;
+ int len;
+
+ if (argc == 0) {
+ action_argv = argv_ifilist;
+ error = action_propget(action_argv, &cp);
+ if (error)
+ return (error);
+
+ p = cp.cp_val;
+ endp = p + cp.cp_val_len;
+ while (p < endp) {
+ ifi = malloc(sizeof(*ifi));
+ if (ifi == NULL)
+ return (1);
+ memset(ifi, 0, sizeof(*ifi));
+
+ strcpy(ifi->ifi_ifname, p);
+ ifi->ifi_ifindex = if_nametoindex(ifi->ifi_ifname);
+ TAILQ_INSERT_TAIL(&ifl, ifi, ifi_next);
+ p += strlen(ifi->ifi_ifname) + 1;
+ }
+ } else {
+ for (i = 0; i < argc; i++) {
+ ifi = malloc(sizeof(*ifi));
+ if (ifi == NULL)
+ return (1);
+ memset(ifi, 0, sizeof(*ifi));
+
+ strcpy(ifi->ifi_ifname, argv[i]);
+ ifi->ifi_ifindex = if_nametoindex(ifi->ifi_ifname);
+ if (ifi->ifi_ifindex == 0) {
+ sprintf(errmsgbuf, "invalid interface %s",
+ ifi->ifi_ifname);
+ errmsg = errmsgbuf;
+ return (1);
+ }
+
+ TAILQ_INSERT_TAIL(&ifl, ifi, ifi_next);
+ }
+ }
+
+ TAILQ_FOREACH(ifi, &ifl, ifi_next) {
+ struct ifinfo *ifi_s;
+ struct rtadvd_timer *rat;
+ struct rainfo *rai;
+ struct rtinfo *rti;
+ struct prefix *pfx;
+ int c;
+ int ra_ifstatus;
+
+ sprintf(argv_ifi, "%s:ifi=", ifi->ifi_ifname);
+ action_argv = argv_ifi;
+ error = action_propget(action_argv, &cp);
+ if (error)
+ return (error);
+ ifi_s = (struct ifinfo *)cp.cp_val;
+
+ if (!(ifi_s->ifi_persist) && vflag < LOG_NOTICE)
+ continue;
+
+ printf("%s: flags=<", ifi->ifi_ifname);
+
+ c = 0;
+ if (ifi_s->ifi_ifindex == 0)
+ c += printf("NONEXISTENT");
+ else
+ c += printf("%s", (ifi_s->ifi_flags & IFF_UP) ?
+ "UP" : "DOWN");
+ switch (ifi_s->ifi_state) {
+ case IFI_STATE_CONFIGURED:
+ c += printf("%s%s", (c) ? "," : "", "CONFIGURED");
+ break;
+ case IFI_STATE_TRANSITIVE:
+ c += printf("%s%s", (c) ? "," : "", "TRANSITIVE");
+ break;
+ }
+ if (ifi_s->ifi_persist)
+ c += printf("%s%s", (c) ? "," : "", "PERSIST");
+ printf(">");
+
+ ra_ifstatus = RA_IFSTATUS_INACTIVE;
+ if ((ifi_s->ifi_flags & IFF_UP) &&
+ ((ifi_s->ifi_state == IFI_STATE_CONFIGURED) ||
+ (ifi_s->ifi_state == IFI_STATE_TRANSITIVE))) {
+#if (__FreeBSD_version < 900000)
+ /*
+ * RA_RECV: !ip6.forwarding && ip6.accept_rtadv
+ * RA_SEND: ip6.forwarding
+ */
+ if (getinet6sysctl(IPV6CTL_FORWARDING) == 0) {
+ if (getinet6sysctl(IPV6CTL_ACCEPT_RTADV))
+ ra_ifstatus = RA_IFSTATUS_RA_RECV;
+ else
+ ra_ifstatus = RA_IFSTATUS_INACTIVE;
+ } else
+ ra_ifstatus = RA_IFSTATUS_RA_SEND;
+#else
+ /*
+ * RA_RECV: ND6_IFF_ACCEPT_RTADV
+ * RA_SEND: ip6.forwarding
+ */
+ if (ifi_s->ifi_nd_flags & ND6_IFF_ACCEPT_RTADV)
+ ra_ifstatus = RA_IFSTATUS_RA_RECV;
+ else if (getinet6sysctl(IPV6CTL_FORWARDING))
+ ra_ifstatus = RA_IFSTATUS_RA_SEND;
+ else
+ ra_ifstatus = RA_IFSTATUS_INACTIVE;
+#endif
+ }
+
+ c = 0;
+ printf(" status=<");
+ if (ra_ifstatus == RA_IFSTATUS_INACTIVE)
+ printf("%s%s", (c) ? "," : "", "INACTIVE");
+ else if (ra_ifstatus == RA_IFSTATUS_RA_RECV)
+ printf("%s%s", (c) ? "," : "", "RA_RECV");
+ else if (ra_ifstatus == RA_IFSTATUS_RA_SEND)
+ printf("%s%s", (c) ? "," : "", "RA_SEND");
+ printf("> ");
+
+ switch (ifi_s->ifi_state) {
+ case IFI_STATE_CONFIGURED:
+ case IFI_STATE_TRANSITIVE:
+ break;
+ default:
+ printf("\n");
+ continue;
+ }
+
+ printf("mtu %d\n", ifi_s->ifi_phymtu);
+
+ sprintf(argv_rai, "%s:rai=", ifi->ifi_ifname);
+ action_argv = argv_rai;
+
+ error = action_propget(action_argv, &cp);
+ if (error)
+ continue;
+
+ rai = (struct rainfo *)cp.cp_val;
+
+ printf("\tDefaultLifetime: %s",
+ sec2str(rai->rai_lifetime, ssbuf));
+ if (ra_ifstatus != RA_IFSTATUS_RA_SEND &&
+ rai->rai_lifetime == 0)
+ printf(" (RAs will be sent with zero lifetime)");
+
+ printf("\n");
+
+ printf("\tMinAdvInterval/MaxAdvInterval: %s/%s\n",
+ sec2str(rai->rai_mininterval, ssbuf),
+ sec2str(rai->rai_maxinterval, ssbuf));
+ if (rai->rai_linkmtu)
+ printf("\tAdvLinkMTU: %d", rai->rai_linkmtu);
+ else
+ printf("\tAdvLinkMTU: <none>");
+
+ printf(", ");
+
+ printf("Flags: ");
+ if (rai->rai_managedflg || rai->rai_otherflg) {
+ printf("%s", rai->rai_managedflg ? "M" : "");
+ printf("%s", rai->rai_otherflg ? "O" : "");
+ } else
+ printf("<none>");
+
+ printf(", ");
+
+ printf("Preference: %s\n",
+ rtpref_str[(rai->rai_rtpref >> 3) & 0xff]);
+
+ printf("\t"
+ "ReachableTime: %s, "
+ "RetransTimer: %s, "
+ "CurHopLimit: %d\n",
+ sec2str(rai->rai_reachabletime, ssbuf),
+ sec2str(rai->rai_retranstimer, ssbuf),
+ rai->rai_hoplimit);
+ printf("\tAdvIfPrefixes: %s\n",
+ rai->rai_advifprefix ? "yes" : "no");
+
+ /* RA timer */
+ rat = NULL;
+ if (ifi_s->ifi_ra_timer != NULL) {
+ sprintf(argv_ifi_ra_timer, "%s:ifi_ra_timer=",
+ ifi->ifi_ifname);
+ action_argv = argv_ifi_ra_timer;
+
+ error = action_propget(action_argv, &cp);
+ if (error)
+ return (error);
+
+ rat = (struct rtadvd_timer *)cp.cp_val;
+ }
+ printf("\tNext RA send: %s",
+ (rat == NULL) ? "never\n" :
+ ctime((time_t *)&rat->rat_tm.tv_sec));
+ printf("\tLast RA sent: %s",
+ (ifi_s->ifi_ra_lastsent.tv_sec == 0) ? "never\n" :
+ ctime((time_t *)&ifi_s->ifi_ra_lastsent.tv_sec));
+ if (rai->rai_clockskew)
+ printf("\tClock skew: %" PRIu16 "sec\n",
+ rai->rai_clockskew);
+
+ if (vflag < LOG_WARNING)
+ continue;
+
+ /* route information */
+ sprintf(argv_rti, "%s:rti=", ifi->ifi_ifname);
+ action_argv = argv_rti;
+ error = action_propget(action_argv, &cp);
+ if (error)
+ return (error);
+
+ rti = (struct rtinfo *)cp.cp_val;
+ len = cp.cp_val_len / sizeof(*rti);
+ if (len > 0) {
+ printf("\tRoute Info:\n");
+
+ for (i = 0; i < len; i++)
+ action_show_rtinfo(&rti[i]);
+ }
+
+ /* prefix information */
+ sprintf(argv_pfx, "%s:pfx=", ifi->ifi_ifname);
+ action_argv = argv_pfx;
+
+ error = action_propget(action_argv, &cp);
+ if (error)
+ continue;
+
+ pfx = (struct prefix *)cp.cp_val;
+ len = cp.cp_val_len / sizeof(*pfx);
+
+ if (len > 0) {
+ printf("\tPrefixes (%d):\n", len);
+
+ for (i = 0; i < len; i++)
+ action_show_prefix(&pfx[i]);
+ }
+
+ /* RDNSS information */
+ sprintf(argv_rdnss, "%s:rdnss=", ifi->ifi_ifname);
+ action_argv = argv_rdnss;
+
+ error = action_propget(action_argv, &cp);
+ if (error)
+ continue;
+
+ len = *((uint16_t *)cp.cp_val);
+
+ if (len > 0) {
+ printf("\tRDNSS entries:\n");
+ action_show_rdnss(cp.cp_val);
+ }
+
+ /* DNSSL information */
+ sprintf(argv_dnssl, "%s:dnssl=", ifi->ifi_ifname);
+ action_argv = argv_dnssl;
+
+ error = action_propget(action_argv, &cp);
+ if (error)
+ continue;
+
+ len = *((uint16_t *)cp.cp_val);
+
+ if (len > 0) {
+ printf("\tDNSSL entries:\n");
+ action_show_dnssl(cp.cp_val);
+ }
+
+ if (vflag < LOG_NOTICE)
+ continue;
+
+ printf("\n");
+
+ printf("\tCounters\n"
+ "\t RA burst counts: %" PRIu16 " (interval: %s)\n"
+ "\t RS wait counts: %" PRIu16 "\n",
+ ifi_s->ifi_burstcount,
+ sec2str(ifi_s->ifi_burstinterval, ssbuf),
+ ifi_s->ifi_rs_waitcount);
+
+ printf("\tOutputs\n"
+ "\t RA: %" PRIu64 "\n", ifi_s->ifi_raoutput);
+
+ printf("\tInputs\n"
+ "\t RA: %" PRIu64 " (normal)\n"
+ "\t RA: %" PRIu64 " (inconsistent)\n"
+ "\t RS: %" PRIu64 "\n",
+ ifi_s->ifi_rainput,
+ ifi_s->ifi_rainconsistent,
+ ifi_s->ifi_rsinput);
+
+ printf("\n");
+
+#if 0 /* Not implemented yet */
+ printf("\tReceived RAs:\n");
+#endif
+ }
+
+ return (0);
+}
+
+static int
+action_show_rtinfo(struct rtinfo *rti)
+{
+ char ntopbuf[INET6_ADDRSTRLEN];
+ char ssbuf[SSBUFLEN];
+
+ printf("\t %s/%d (pref: %s, ltime: %s)\n",
+ inet_ntop(AF_INET6, &rti->rti_prefix,
+ ntopbuf, sizeof(ntopbuf)),
+ rti->rti_prefixlen,
+ rtpref_str[0xff & (rti->rti_rtpref >> 3)],
+ (rti->rti_ltime == ND6_INFINITE_LIFETIME) ?
+ "infinity" : sec2str(rti->rti_ltime, ssbuf));
+
+ return (0);
+}
+
+static int
+action_show_prefix(struct prefix *pfx)
+{
+ char ntopbuf[INET6_ADDRSTRLEN];
+ char ssbuf[SSBUFLEN];
+ struct timeval now;
+
+ gettimeofday(&now, NULL);
+ printf("\t %s/%d", inet_ntop(AF_INET6, &pfx->pfx_prefix,
+ ntopbuf, sizeof(ntopbuf)), pfx->pfx_prefixlen);
+
+ printf(" (");
+ switch (pfx->pfx_origin) {
+ case PREFIX_FROM_KERNEL:
+ printf("KERNEL");
+ break;
+ case PREFIX_FROM_CONFIG:
+ printf("CONFIG");
+ break;
+ case PREFIX_FROM_DYNAMIC:
+ printf("DYNAMIC");
+ break;
+ }
+
+ printf(",");
+
+ printf(" vltime=%s",
+ (pfx->pfx_validlifetime == ND6_INFINITE_LIFETIME) ?
+ "infinity" : sec2str(pfx->pfx_validlifetime, ssbuf));
+
+ if (pfx->pfx_vltimeexpire > 0)
+ printf("(expire: %s)",
+ ((long)pfx->pfx_vltimeexpire > now.tv_sec) ?
+ sec2str(pfx->pfx_vltimeexpire - now.tv_sec, ssbuf) :
+ "0");
+
+ printf(",");
+
+ printf(" pltime=%s",
+ (pfx->pfx_preflifetime == ND6_INFINITE_LIFETIME) ?
+ "infinity" : sec2str(pfx->pfx_preflifetime, ssbuf));
+
+ if (pfx->pfx_pltimeexpire > 0)
+ printf("(expire %s)",
+ ((long)pfx->pfx_pltimeexpire > now.tv_sec) ?
+ sec2str(pfx->pfx_pltimeexpire - now.tv_sec, ssbuf) :
+ "0");
+
+ printf(",");
+
+ printf(" flags=");
+ if (pfx->pfx_onlinkflg || pfx->pfx_autoconfflg) {
+ printf("%s", pfx->pfx_onlinkflg ? "L" : "");
+ printf("%s", pfx->pfx_autoconfflg ? "A" : "");
+ } else
+ printf("<none>");
+
+ if (pfx->pfx_timer) {
+ struct timeval *rest;
+
+ rest = rtadvd_timer_rest(pfx->pfx_timer);
+ if (rest) { /* XXX: what if not? */
+ printf(" expire=%s", sec2str(rest->tv_sec, ssbuf));
+ }
+ }
+
+ printf(")\n");
+
+ return (0);
+}
+
+static int
+action_show_rdnss(void *msg)
+{
+ struct rdnss *rdn;
+ struct rdnss_addr *rda;
+ uint16_t *rdn_cnt;
+ uint16_t *rda_cnt;
+ int i;
+ int j;
+ char *p;
+ uint32_t ltime;
+ char ntopbuf[INET6_ADDRSTRLEN];
+ char ssbuf[SSBUFLEN];
+
+ p = msg;
+ rdn_cnt = (uint16_t *)p;
+ p += sizeof(*rdn_cnt);
+
+ if (*rdn_cnt > 0) {
+ for (i = 0; i < *rdn_cnt; i++) {
+ rdn = (struct rdnss *)p;
+ ltime = rdn->rd_ltime;
+ p += sizeof(*rdn);
+
+ rda_cnt = (uint16_t *)p;
+ p += sizeof(*rda_cnt);
+ if (*rda_cnt > 0)
+ for (j = 0; j < *rda_cnt; j++) {
+ rda = (struct rdnss_addr *)p;
+ printf("\t %s (ltime=%s)\n",
+ inet_ntop(AF_INET6,
+ &rda->ra_dns,
+ ntopbuf,
+ sizeof(ntopbuf)),
+ sec2str(ltime, ssbuf));
+ p += sizeof(*rda);
+ }
+ }
+ }
+
+ return (0);
+}
+
+static int
+action_show_dnssl(void *msg)
+{
+ struct dnssl *dns;
+ struct dnssl_addr *dna;
+ uint16_t *dns_cnt;
+ uint16_t *dna_cnt;
+ int i;
+ int j;
+ char *p;
+ uint32_t ltime;
+ char hbuf[NI_MAXHOST];
+ char ssbuf[SSBUFLEN];
+
+ p = msg;
+ dns_cnt = (uint16_t *)p;
+ p += sizeof(*dns_cnt);
+
+ if (*dns_cnt > 0) {
+ for (i = 0; i < *dns_cnt; i++) {
+ dns = (struct dnssl *)p;
+ ltime = dns->dn_ltime;
+ p += sizeof(*dns);
+
+ dna_cnt = (uint16_t *)p;
+ p += sizeof(*dna_cnt);
+ if (*dna_cnt > 0)
+ for (j = 0; j < *dna_cnt; j++) {
+ dna = (struct dnssl_addr *)p;
+ dname_labeldec(hbuf, sizeof(hbuf),
+ dna->da_dom);
+ printf("\t %s (ltime=%s)\n",
+ hbuf, sec2str(ltime, ssbuf));
+ p += sizeof(*dna);
+ }
+ }
+ }
+
+ return (0);
+}
+
+/* Decode domain name label encoding in RFC 1035 Section 3.1 */
+static size_t
+dname_labeldec(char *dst, size_t dlen, const char *src)
+{
+ size_t len;
+ const char *src_origin;
+ const char *src_last;
+ const char *dst_origin;
+
+ src_origin = src;
+ src_last = strchr(src, '\0');
+ dst_origin = dst;
+ memset(dst, '\0', dlen);
+ while (src && (len = (uint8_t)(*src++) & 0x3f) &&
+ (src + len) <= src_last) {
+ if (dst != dst_origin)
+ *dst++ = '.';
+ mysyslog(LOG_DEBUG, "<%s> labellen = %zd", __func__, len);
+ memcpy(dst, src, len);
+ src += len;
+ dst += len;
+ }
+ *dst = '\0';
+
+ return (src - src_origin);
+}
diff --git a/usr.sbin/rtadvd/Makefile b/usr.sbin/rtadvd/Makefile
index 9dbfc99..d48832d 100644
--- a/usr.sbin/rtadvd/Makefile
+++ b/usr.sbin/rtadvd/Makefile
@@ -16,12 +16,13 @@
PROG= rtadvd
MAN= rtadvd.conf.5 rtadvd.8
-SRCS= rtadvd.c rrenum.c advcap.c if.c config.c timer.c dump.c
+SRCS= rtadvd.c rrenum.c advcap.c if.c config.c timer.c timer_subr.c \
+ control.c control_server.c
DPADD= ${LIBUTIL}
LDADD= -lutil
-CFLAGS+= -DHAVE_ARC4RANDOM -DHAVE_POLL_H -DROUTEINFO
+CFLAGS+= -DHAVE_ARC4RANDOM
WARNS?= 1
diff --git a/usr.sbin/rtadvd/config.c b/usr.sbin/rtadvd/config.c
index c0e442b..681611f 100644
--- a/usr.sbin/rtadvd/config.c
+++ b/usr.sbin/rtadvd/config.c
@@ -3,6 +3,7 @@
/*
* Copyright (C) 1998 WIDE Project.
+ * Copyright (C) 2011 Hiroki Sato <hrs@FreeBSD.org>
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
@@ -52,6 +53,7 @@
#include <stdio.h>
#include <syslog.h>
#include <errno.h>
+#include <inttypes.h>
#include <netdb.h>
#include <string.h>
#include <search.h>
@@ -130,48 +132,153 @@ dname_labelenc(char *dst, const char *src)
var = def; \
} while (0)
-#define ELM_MALLOC(p,error_action) \
- do { \
- p = malloc(sizeof(*p)); \
- if (p == NULL) { \
- syslog(LOG_ERR, "<%s> malloc failed: %s", \
- __func__, strerror(errno)); \
- error_action; \
- } \
- memset(p, 0, sizeof(*p)); \
- } while(0)
+int
+loadconfig_index(int idx)
+{
+ char ifname[IFNAMSIZ];
+
+ syslog(LOG_DEBUG, "<%s> enter", __func__);
+
+ if (if_indextoname(idx, ifname) != NULL)
+ return (loadconfig_ifname(ifname));
+ else
+ return (1);
+}
int
-loadconfig(char *ifl_names[], const int ifl_len)
+loadconfig_ifname(char *ifname)
{
- int i;
- int idx;
- int error;
+ struct ifinfo *ifi;
+
+ syslog(LOG_DEBUG, "<%s> enter", __func__);
+
+ update_ifinfo(&ifilist, UPDATE_IFINFO_ALL);
+ TAILQ_FOREACH(ifi, &ifilist, ifi_next) {
+ /* NULL means all IFs will be processed. */
+ if (ifname != NULL &&
+ strcmp(ifi->ifi_ifname, ifname) != 0)
+ continue;
- for (i = 0; i < ifl_len; i++) {
- idx = if_nametoindex(ifl_names[i]);
- if (idx == 0) {
+ if (!ifi->ifi_persist) {
+ syslog(LOG_INFO,
+ "<%s> %s is not a target interface. "
+ "Ignored at this moment.", __func__,
+ ifi->ifi_ifname);
+ continue;
+
+ }
+ if (ifi->ifi_ifindex == 0) {
syslog(LOG_ERR,
- "<%s> interface %s not found. "
- "Ignored at this moment.", __func__, ifl_names[i]);
+ "<%s> %s not found. "
+ "Ignored at this moment.", __func__,
+ ifi->ifi_ifname);
continue;
}
- syslog(LOG_INFO,
- "<%s> loading config for %s.", __func__, ifl_names[i]);
- error = getconfig(idx);
- if (error)
+ if (getconfig(ifi) == NULL) {
syslog(LOG_ERR,
"<%s> invalid configuration for %s. "
- "Ignored at this moment.", __func__, ifl_names[i]);
+ "Ignored at this moment.", __func__,
+ ifi->ifi_ifname);
+ continue;
+ }
+ }
+ return (0);
+}
+
+int
+rm_ifinfo_index(int idx)
+{
+ struct ifinfo *ifi;
+
+ ifi = if_indextoifinfo(idx);
+ if (ifi == NULL) {
+ syslog(LOG_ERR, "<%s>: ifinfo not found (idx=%d)",
+ __func__, idx);
+ return (-1);
+ }
+
+ return (rm_ifinfo(ifi));
+}
+
+int
+rm_ifinfo(struct ifinfo *ifi)
+{
+ int error;
+
+ syslog(LOG_DEBUG, "<%s> enter (%s).", __func__, ifi->ifi_ifname);
+ switch (ifi->ifi_state) {
+ case IFI_STATE_UNCONFIGURED:
+ return (0);
+ break;
+ default:
+ ifi->ifi_state = IFI_STATE_UNCONFIGURED;
+ syslog(LOG_DEBUG,
+ "<%s> ifname=%s marked as UNCONFIGURED.",
+ __func__, ifi->ifi_ifname);
+
+ /* XXX: No MC leaving here becasue index is disappeared */
+
+ /* Inactivate timer */
+ rtadvd_remove_timer(ifi->ifi_ra_timer);
+ ifi->ifi_ra_timer = NULL;
+ break;
+ }
+
+ /* clean up ifi */
+ if (!ifi->ifi_persist) {
+ TAILQ_REMOVE(&ifilist, ifi, ifi_next);
+ syslog(LOG_DEBUG, "<%s>: ifinfo (idx=%d) removed.",
+ __func__, ifi->ifi_ifindex);
+ free(ifi);
+ } else {
+ /* recreate an empty entry */
+ update_persist_ifinfo(&ifilist, ifi->ifi_ifname);
+ syslog(LOG_DEBUG, "<%s>: ifname=%s is persistent.",
+ __func__, ifi->ifi_ifname);
+ }
+
+ /* clean up rai if any */
+ switch (ifi->ifi_state) {
+ case IFI_STATE_CONFIGURED:
+ if (ifi->ifi_rainfo != NULL) {
+ error = rm_rainfo(ifi->ifi_rainfo);
+ if (error)
+ return (error);
+ ifi->ifi_rainfo = NULL;
+ }
+ break;
+ case IFI_STATE_TRANSITIVE:
+ if (ifi->ifi_rainfo == ifi->ifi_rainfo_trans) {
+ if (ifi->ifi_rainfo != NULL) {
+ error = rm_rainfo(ifi->ifi_rainfo);
+ if (error)
+ return (error);
+ ifi->ifi_rainfo = NULL;
+ ifi->ifi_rainfo_trans = NULL;
+ }
+ } else {
+ if (ifi->ifi_rainfo != NULL) {
+ error = rm_rainfo(ifi->ifi_rainfo);
+ if (error)
+ return (error);
+ ifi->ifi_rainfo = NULL;
+ }
+ if (ifi->ifi_rainfo_trans != NULL) {
+ error = rm_rainfo(ifi->ifi_rainfo_trans);
+ if (error)
+ return (error);
+ ifi->ifi_rainfo_trans = NULL;
+ }
+ }
}
+ syslog(LOG_DEBUG, "<%s> leave (%s).", __func__, ifi->ifi_ifname);
return (0);
}
int
-rmconfig(int idx)
+rm_rainfo(struct rainfo *rai)
{
- struct rainfo *rai;
struct prefix *pfx;
struct soliciter *sol;
struct rdnss *rdn;
@@ -179,26 +286,16 @@ rmconfig(int idx)
struct dnssl *dns;
struct rtinfo *rti;
- rai = if_indextorainfo(idx);
- if (rai == NULL) {
- syslog(LOG_ERR, "<%s>: rainfo not found (idx=%d)",
- __func__, idx);
- return (-1);
- }
+ syslog(LOG_DEBUG, "<%s>: enter", __func__);
TAILQ_REMOVE(&railist, rai, rai_next);
- syslog(LOG_DEBUG, "<%s>: rainfo (idx=%d) removed.",
- __func__, idx);
-
- /* Free all of allocated memories for this entry. */
- rtadvd_remove_timer(rai->rai_timer);
+ if (rai->rai_ifinfo != NULL)
+ syslog(LOG_DEBUG, "<%s>: rainfo (idx=%d) removed.",
+ __func__, rai->rai_ifinfo->ifi_ifindex);
if (rai->rai_ra_data != NULL)
free(rai->rai_ra_data);
- if (rai->rai_sdl != NULL)
- free(rai->rai_sdl);
-
while ((pfx = TAILQ_FIRST(&rai->rai_prefix)) != NULL) {
TAILQ_REMOVE(&rai->rai_prefix, pfx, pfx_next);
free(pfx);
@@ -224,51 +321,51 @@ rmconfig(int idx)
free(rti);
}
free(rai);
-
+ syslog(LOG_DEBUG, "<%s>: leave", __func__);
+
return (0);
}
-int
-getconfig(int idx)
+struct ifinfo *
+getconfig(struct ifinfo *ifi)
{
int stat, i;
+ int error;
char tbuf[BUFSIZ];
struct rainfo *rai;
struct rainfo *rai_old;
- long val;
+ int32_t val;
int64_t val64;
char buf[BUFSIZ];
char *bp = buf;
char *addr, *flagstr;
- char intface[IFNAMSIZ];
- if (if_indextoname(idx, intface) == NULL) {
- syslog(LOG_ERR, "<%s> invalid index number (%d)",
- __func__, idx);
- return (-1);
- }
+ if (ifi == NULL) /* if does not exist */
+ return (NULL);
- TAILQ_FOREACH(rai_old, &railist, rai_next)
- if (idx == rai_old->rai_ifindex)
- break;
+ if (ifi->ifi_state == IFI_STATE_TRANSITIVE &&
+ ifi->ifi_rainfo == NULL) {
+ syslog(LOG_INFO, "<%s> %s is shutting down. Skipped.",
+ __func__, ifi->ifi_ifname);
+ return (NULL);
+ }
- if ((stat = agetent(tbuf, intface)) <= 0) {
+ if ((stat = agetent(tbuf, ifi->ifi_ifname)) <= 0) {
memset(tbuf, 0, sizeof(tbuf));
syslog(LOG_INFO,
"<%s> %s isn't defined in the configuration file"
" or the configuration file doesn't exist."
" Treat it as default",
- __func__, intface);
+ __func__, ifi->ifi_ifname);
}
ELM_MALLOC(rai, exit(1));
TAILQ_INIT(&rai->rai_prefix);
-#ifdef ROUTEINFO
TAILQ_INIT(&rai->rai_route);
-#endif
TAILQ_INIT(&rai->rai_rdnss);
TAILQ_INIT(&rai->rai_dnssl);
TAILQ_INIT(&rai->rai_soliciter);
+ rai->rai_ifinfo = ifi;
/* gather on-link prefixes from the network interfaces. */
if (agetflag("noifprefix"))
@@ -282,25 +379,12 @@ getconfig(int idx)
else
rai->rai_advlinkopt = 1;
if (rai->rai_advlinkopt) {
- if ((rai->rai_sdl = if_nametosdl(intface)) == NULL) {
+ if (ifi->ifi_sdl.sdl_type == 0) {
syslog(LOG_ERR,
"<%s> can't get information of %s",
- __func__, intface);
+ __func__, ifi->ifi_ifname);
goto getconfig_free_rai;
}
- rai->rai_ifindex = rai->rai_sdl->sdl_index;
- } else
- rai->rai_ifindex = if_nametoindex(intface);
- strncpy(rai->rai_ifname, intface, sizeof(rai->rai_ifname));
- syslog(LOG_DEBUG,
- "<%s> ifindex = %d on %s", __func__, rai->rai_ifindex,
- rai->rai_ifname);
-
- if ((rai->rai_phymtu = if_getmtu(intface)) == 0) {
- rai->rai_phymtu = IPV6_MMTU;
- syslog(LOG_WARNING,
- "<%s> can't get interface mtu of %s. Treat as %d",
- __func__, intface, IPV6_MMTU);
}
/*
@@ -309,24 +393,24 @@ getconfig(int idx)
MAYHAVE(val, "maxinterval", DEF_MAXRTRADVINTERVAL);
if (val < MIN_MAXINTERVAL || val > MAX_MAXINTERVAL) {
syslog(LOG_ERR,
- "<%s> maxinterval (%ld) on %s is invalid "
+ "<%s> maxinterval (%" PRIu32 ") on %s is invalid "
"(must be between %u and %u)", __func__, val,
- intface, MIN_MAXINTERVAL, MAX_MAXINTERVAL);
+ ifi->ifi_ifname, MIN_MAXINTERVAL, MAX_MAXINTERVAL);
goto getconfig_free_rai;
}
- rai->rai_maxinterval = (u_int)val;
+ rai->rai_maxinterval = (uint16_t)val;
MAYHAVE(val, "mininterval", rai->rai_maxinterval/3);
- if ((u_int)val < MIN_MININTERVAL ||
- (u_int)val > (rai->rai_maxinterval * 3) / 4) {
+ if ((uint16_t)val < MIN_MININTERVAL ||
+ (uint16_t)val > (rai->rai_maxinterval * 3) / 4) {
syslog(LOG_ERR,
- "<%s> mininterval (%ld) on %s is invalid "
+ "<%s> mininterval (%" PRIu32 ") on %s is invalid "
"(must be between %d and %d)",
- __func__, val, intface, MIN_MININTERVAL,
+ __func__, val, ifi->ifi_ifname, MIN_MININTERVAL,
(rai->rai_maxinterval * 3) / 4);
goto getconfig_free_rai;
}
- rai->rai_mininterval = (u_int)val;
+ rai->rai_mininterval = (uint16_t)val;
MAYHAVE(val, "chlim", DEF_ADVCURHOPLIMIT);
rai->rai_hoplimit = val & 0xff;
@@ -359,17 +443,17 @@ getconfig(int idx)
rai->rai_rtpref = val & ND_RA_FLAG_RTPREF_MASK;
if (rai->rai_rtpref == ND_RA_FLAG_RTPREF_RSV) {
syslog(LOG_ERR, "<%s> invalid router preference (%02x) on %s",
- __func__, rai->rai_rtpref, intface);
+ __func__, rai->rai_rtpref, ifi->ifi_ifname);
goto getconfig_free_rai;
}
MAYHAVE(val, "rltime", rai->rai_maxinterval * 3);
- if ((u_int)val && ((u_int)val < rai->rai_maxinterval ||
- (u_int)val > MAXROUTERLIFETIME)) {
+ if ((uint16_t)val && ((uint16_t)val < rai->rai_maxinterval ||
+ (uint16_t)val > MAXROUTERLIFETIME)) {
syslog(LOG_ERR,
- "<%s> router lifetime (%ld) on %s is invalid "
+ "<%s> router lifetime (%" PRIu32 ") on %s is invalid "
"(must be 0 or between %d and %d)",
- __func__, val, intface, rai->rai_maxinterval,
+ __func__, val, ifi->ifi_ifname, rai->rai_maxinterval,
MAXROUTERLIFETIME);
goto getconfig_free_rai;
}
@@ -378,20 +462,20 @@ getconfig(int idx)
MAYHAVE(val, "rtime", DEF_ADVREACHABLETIME);
if (val < 0 || val > MAXREACHABLETIME) {
syslog(LOG_ERR,
- "<%s> reachable time (%ld) on %s is invalid "
+ "<%s> reachable time (%" PRIu32 ") on %s is invalid "
"(must be no greater than %d)",
- __func__, val, intface, MAXREACHABLETIME);
+ __func__, val, ifi->ifi_ifname, MAXREACHABLETIME);
goto getconfig_free_rai;
}
- rai->rai_reachabletime = (u_int32_t)val;
+ rai->rai_reachabletime = (uint32_t)val;
MAYHAVE(val64, "retrans", DEF_ADVRETRANSTIMER);
if (val64 < 0 || val64 > 0xffffffff) {
- syslog(LOG_ERR, "<%s> retrans time (%lld) on %s out of range",
- __func__, (long long)val64, intface);
+ syslog(LOG_ERR, "<%s> retrans time (%" PRIu64 ") on %s out of range",
+ __func__, val64, ifi->ifi_ifname);
goto getconfig_free_rai;
}
- rai->rai_retranstimer = (u_int32_t)val64;
+ rai->rai_retranstimer = (uint32_t)val64;
if (agetnum("hapref") != -1 || agetnum("hatime") != -1) {
syslog(LOG_ERR,
@@ -433,21 +517,21 @@ getconfig(int idx)
syslog(LOG_ERR,
"<%s> multicast prefix (%s) must "
"not be advertised on %s",
- __func__, addr, intface);
+ __func__, addr, ifi->ifi_ifname);
goto getconfig_free_pfx;
}
if (IN6_IS_ADDR_LINKLOCAL(&pfx->pfx_prefix))
syslog(LOG_NOTICE,
"<%s> link-local prefix (%s) will be"
" advertised on %s",
- __func__, addr, intface);
+ __func__, addr, ifi->ifi_ifname);
makeentry(entbuf, sizeof(entbuf), i, "prefixlen");
MAYHAVE(val, entbuf, 64);
if (val < 0 || val > 128) {
- syslog(LOG_ERR, "<%s> prefixlen (%ld) for %s "
+ syslog(LOG_ERR, "<%s> prefixlen (%" PRIu32 ") for %s "
"on %s out of range",
- __func__, val, addr, intface);
+ __func__, val, addr, ifi->ifi_ifname);
goto getconfig_free_pfx;
}
pfx->pfx_prefixlen = (int)val;
@@ -469,13 +553,13 @@ getconfig(int idx)
makeentry(entbuf, sizeof(entbuf), i, "vltime");
MAYHAVE(val64, entbuf, DEF_ADVVALIDLIFETIME);
if (val64 < 0 || val64 > 0xffffffff) {
- syslog(LOG_ERR, "<%s> vltime (%lld) for "
+ syslog(LOG_ERR, "<%s> vltime (%" PRIu64 ") for "
"%s/%d on %s is out of range",
- __func__, (long long)val64,
- addr, pfx->pfx_prefixlen, intface);
+ __func__, val64,
+ addr, pfx->pfx_prefixlen, ifi->ifi_ifname);
goto getconfig_free_pfx;
}
- pfx->pfx_validlifetime = (u_int32_t)val64;
+ pfx->pfx_validlifetime = (uint32_t)val64;
makeentry(entbuf, sizeof(entbuf), i, "vltimedecr");
if (agetflag(entbuf)) {
@@ -489,13 +573,13 @@ getconfig(int idx)
MAYHAVE(val64, entbuf, DEF_ADVPREFERREDLIFETIME);
if (val64 < 0 || val64 > 0xffffffff) {
syslog(LOG_ERR,
- "<%s> pltime (%lld) for %s/%d on %s "
+ "<%s> pltime (%" PRIu64 ") for %s/%d on %s "
"is out of range",
- __func__, (long long)val64,
- addr, pfx->pfx_prefixlen, intface);
+ __func__, val64,
+ addr, pfx->pfx_prefixlen, ifi->ifi_ifname);
goto getconfig_free_pfx;
}
- pfx->pfx_preflifetime = (u_int32_t)val64;
+ pfx->pfx_preflifetime = (uint32_t)val64;
makeentry(entbuf, sizeof(entbuf), i, "pltimedecr");
if (agetflag(entbuf)) {
@@ -514,28 +598,28 @@ getconfig_free_pfx:
if (rai->rai_advifprefix && rai->rai_pfxs == 0)
get_prefix(rai);
- MAYHAVE(val, "mtu", 0);
- if (val < 0 || (u_int)val > 0xffffffff) {
+ MAYHAVE(val64, "mtu", 0);
+ if (val < 0 || val64 > 0xffffffff) {
syslog(LOG_ERR,
- "<%s> mtu (%ld) on %s out of range",
- __func__, val, intface);
+ "<%s> mtu (%" PRIu64 ") on %s out of range",
+ __func__, val64, ifi->ifi_ifname);
goto getconfig_free_rai;
}
- rai->rai_linkmtu = (u_int32_t)val;
+ rai->rai_linkmtu = (uint32_t)val64;
if (rai->rai_linkmtu == 0) {
char *mtustr;
if ((mtustr = (char *)agetstr("mtu", &bp)) &&
strcmp(mtustr, "auto") == 0)
- rai->rai_linkmtu = rai->rai_phymtu;
+ rai->rai_linkmtu = ifi->ifi_phymtu;
}
else if (rai->rai_linkmtu < IPV6_MMTU ||
- rai->rai_linkmtu > rai->rai_phymtu) {
+ rai->rai_linkmtu > ifi->ifi_phymtu) {
syslog(LOG_ERR,
- "<%s> advertised link mtu (%lu) on %s is invalid (must "
+ "<%s> advertised link mtu (%" PRIu32 ") on %s is invalid (must "
"be between least MTU (%d) and physical link MTU (%d)",
- __func__, (unsigned long)rai->rai_linkmtu, intface,
- IPV6_MMTU, rai->rai_phymtu);
+ __func__, rai->rai_linkmtu, ifi->ifi_ifname,
+ IPV6_MMTU, ifi->ifi_phymtu);
goto getconfig_free_rai;
}
@@ -550,10 +634,10 @@ getconfig_free_pfx:
exit(1);
}
memset(&ndi, 0, sizeof(ndi));
- strncpy(ndi.ifname, intface, IFNAMSIZ);
+ strncpy(ndi.ifname, ifi->ifi_ifname, sizeof(ndi.ifname));
if (ioctl(s, SIOCGIFINFO_IN6, (caddr_t)&ndi) < 0)
syslog(LOG_INFO, "<%s> ioctl:SIOCGIFINFO_IN6 at %s: %s",
- __func__, intface, strerror(errno));
+ __func__, ifi->ifi_ifname, strerror(errno));
/* reflect the RA info to the host variables in kernel */
ndi.ndi.chlim = rai->rai_hoplimit;
@@ -561,14 +645,13 @@ getconfig_free_pfx:
ndi.ndi.basereachable = rai->rai_reachabletime;
if (ioctl(s, SIOCSIFINFO_IN6, (caddr_t)&ndi) < 0)
syslog(LOG_INFO, "<%s> ioctl:SIOCSIFINFO_IN6 at %s: %s",
- __func__, intface, strerror(errno));
+ __func__, ifi->ifi_ifname, strerror(errno));
close(s);
}
#endif
/* route information */
-#ifdef ROUTEINFO
rai->rai_routes = 0;
for (i = -1; i < MAXROUTE; i++) {
struct rtinfo *rti;
@@ -605,14 +688,14 @@ getconfig_free_pfx:
syslog(LOG_ERR,
"<%s> multicast route (%s) must "
"not be advertised on %s",
- __func__, addr, intface);
+ __func__, addr, ifi->ifi_ifname);
goto getconfig_free_rti;
}
if (IN6_IS_ADDR_LINKLOCAL(&rti->prefix)) {
syslog(LOG_NOTICE,
"<%s> link-local route (%s) will "
"be advertised on %s",
- __func__, addr, intface);
+ __func__, addr, ifi->ifi_ifname);
goto getconfig_free_rti;
}
#endif
@@ -630,9 +713,9 @@ getconfig_free_pfx:
val = 64;
}
if (val < 0 || val > 128) {
- syslog(LOG_ERR, "<%s> prefixlen (%ld) for %s on %s "
+ syslog(LOG_ERR, "<%s> prefixlen (%" PRIu32 ") for %s on %s "
"out of range",
- __func__, val, addr, intface);
+ __func__, val, addr, ifi->ifi_ifname);
goto getconfig_free_rti;
}
rti->rti_prefixlen = (int)val;
@@ -668,7 +751,7 @@ getconfig_free_pfx:
syslog(LOG_ERR, "<%s> invalid route preference (%02x) "
"for %s/%d on %s",
__func__, rti->rti_rtpref, addr,
- rti->rti_prefixlen, intface);
+ rti->rti_prefixlen, ifi->ifi_ifname);
goto getconfig_free_rti;
}
@@ -688,17 +771,19 @@ getconfig_free_pfx:
oentbuf, entbuf);
else {
fprintf(stderr, "%s should be specified "
- "for interface %s.\n", entbuf, intface);
+ "for interface %s.\n", entbuf,
+ ifi->ifi_ifname);
val64 = rai->rai_lifetime;
}
}
if (val64 < 0 || val64 > 0xffffffff) {
- syslog(LOG_ERR, "<%s> route lifetime (%lld) for "
+ syslog(LOG_ERR, "<%s> route lifetime (%" PRIu64 ") for "
"%s/%d on %s out of range", __func__,
- (long long)val64, addr, rti->rti_prefixlen, intface);
+ val64, addr, rti->rti_prefixlen,
+ ifi->ifi_ifname);
goto getconfig_free_rti;
}
- rti->rti_ltime = (u_int32_t)val64;
+ rti->rti_ltime = (uint32_t)val64;
/* link into chain */
TAILQ_INSERT_TAIL(&rai->rai_route, rti, rti_next);
@@ -707,7 +792,7 @@ getconfig_free_pfx:
getconfig_free_rti:
free(rti);
}
-#endif
+
/* DNS server and DNS search list information */
for (i = -1; i < MAXRDNSSENT ; i++) {
struct rdnss *rdn;
@@ -739,11 +824,11 @@ getconfig_free_rti:
makeentry(entbuf, sizeof(entbuf), i, "rdnssltime");
MAYHAVE(val, entbuf, (rai->rai_maxinterval * 3 / 2));
- if ((u_int)val < rai->rai_maxinterval ||
- (u_int)val > rai->rai_maxinterval * 2) {
- syslog(LOG_ERR, "%s (%ld) on %s is invalid "
+ if ((uint16_t)val < rai->rai_maxinterval ||
+ (uint16_t)val > rai->rai_maxinterval * 2) {
+ syslog(LOG_ERR, "%s (%" PRIu16 ") on %s is invalid "
"(must be between %d and %d)",
- entbuf, val, intface, rai->rai_maxinterval,
+ entbuf, val, ifi->ifi_ifname, rai->rai_maxinterval,
rai->rai_maxinterval * 2);
goto getconfig_free_rdn;
}
@@ -788,11 +873,11 @@ getconfig_free_rdn:
makeentry(entbuf, sizeof(entbuf), i, "dnsslltime");
MAYHAVE(val, entbuf, (rai->rai_maxinterval * 3 / 2));
- if ((u_int)val < rai->rai_maxinterval ||
- (u_int)val > rai->rai_maxinterval * 2) {
- syslog(LOG_ERR, "%s (%ld) on %s is invalid "
+ if ((uint16_t)val < rai->rai_maxinterval ||
+ (uint16_t)val > rai->rai_maxinterval * 2) {
+ syslog(LOG_ERR, "%s (%" PRIu16 ") on %s is invalid "
"(must be between %d and %d)",
- entbuf, val, intface, rai->rai_maxinterval,
+ entbuf, val, ifi->ifi_ifname, rai->rai_maxinterval,
rai->rai_maxinterval * 2);
goto getconfig_free_dns;
}
@@ -816,36 +901,108 @@ getconfig_free_dns:
* Before the removal, RDNSS and DNSSL options with
* zero-lifetime will be sent.
*/
- if (rai_old != NULL) {
- const int retrans = MAX_FINAL_RTR_ADVERTISEMENTS;
- struct rdnss *rdn;
- struct dnssl *dns;
+ switch (ifi->ifi_state) {
+ case IFI_STATE_UNCONFIGURED:
+ /* UNCONFIGURED -> TRANSITIVE */
+
+ error = sock_mc_join(&sock, ifi->ifi_ifindex);
+ if (error)
+ exit(1);
+
+ ifi->ifi_state = IFI_STATE_TRANSITIVE;
+ ifi->ifi_burstcount = MAX_INITIAL_RTR_ADVERTISEMENTS;
+ ifi->ifi_burstinterval = MAX_INITIAL_RTR_ADVERT_INTERVAL;
- rai_old->rai_lifetime = 0;
- TAILQ_FOREACH(rdn, &rai_old->rai_rdnss, rd_next)
- rdn->rd_ltime = 0;
- TAILQ_FOREACH(dns, &rai_old->rai_dnssl, dn_next)
- dns->dn_ltime = 0;
+ /* The same two rai mean initial burst */
+ ifi->ifi_rainfo = rai;
+ ifi->ifi_rainfo_trans = rai;
+ TAILQ_INSERT_TAIL(&railist, rai, rai_next);
- make_packet(rai_old);
- for (i = 0; i < retrans; i++) {
- ra_output(rai_old);
- sleep(MIN_DELAY_BETWEEN_RAS);
+ if (ifi->ifi_ra_timer == NULL)
+ ifi->ifi_ra_timer = rtadvd_add_timer(ra_timeout,
+ ra_timer_update, ifi, ifi);
+ ra_timer_update(ifi, &ifi->ifi_ra_timer->rat_tm);
+ rtadvd_set_timer(&ifi->ifi_ra_timer->rat_tm,
+ ifi->ifi_ra_timer);
+
+ syslog(LOG_DEBUG,
+ "<%s> ifname=%s marked as TRANSITIVE (initial burst).",
+ __func__, ifi->ifi_ifname);
+ break;
+ case IFI_STATE_CONFIGURED:
+ /* CONFIGURED -> TRANSITIVE */
+ rai_old = ifi->ifi_rainfo;
+ if (rai_old == NULL) {
+ syslog(LOG_ERR,
+ "<%s> ifi_rainfo is NULL"
+ " in IFI_STATE_CONFIGURED.", __func__);
+ ifi = NULL;
+ break;
+ } else {
+ struct rdnss *rdn;
+ struct dnssl *dns;
+
+ rai_old->rai_lifetime = 0;
+ TAILQ_FOREACH(rdn, &rai_old->rai_rdnss, rd_next)
+ rdn->rd_ltime = 0;
+ TAILQ_FOREACH(dns, &rai_old->rai_dnssl, dn_next)
+ dns->dn_ltime = 0;
+
+ ifi->ifi_rainfo_trans = rai_old;
+ ifi->ifi_state = IFI_STATE_TRANSITIVE;
+ ifi->ifi_burstcount = MAX_FINAL_RTR_ADVERTISEMENTS;
+ ifi->ifi_burstinterval = MIN_DELAY_BETWEEN_RAS;
+
+ ra_timer_update(ifi, &ifi->ifi_ra_timer->rat_tm);
+ rtadvd_set_timer(&ifi->ifi_ra_timer->rat_tm,
+ ifi->ifi_ra_timer);
+
+ syslog(LOG_DEBUG,
+ "<%s> ifname=%s marked as TRANSITIVE"
+ " (transitional burst)",
+ __func__, ifi->ifi_ifname);
+ }
+ ifi->ifi_rainfo = rai;
+ TAILQ_INSERT_TAIL(&railist, rai, rai_next);
+ break;
+ case IFI_STATE_TRANSITIVE:
+ if (ifi->ifi_rainfo != NULL) {
+ if (ifi->ifi_rainfo == ifi->ifi_rainfo_trans) {
+ /* Reinitialize initial burst */
+ rm_rainfo(ifi->ifi_rainfo);
+ ifi->ifi_rainfo = rai;
+ ifi->ifi_rainfo_trans = rai;
+ ifi->ifi_burstcount =
+ MAX_INITIAL_RTR_ADVERTISEMENTS;
+ ifi->ifi_burstinterval =
+ MAX_INITIAL_RTR_ADVERT_INTERVAL;
+ } else {
+ /* Replace ifi_rainfo with the new one */
+ rm_rainfo(ifi->ifi_rainfo);
+ ifi->ifi_rainfo = rai;
+ }
+ TAILQ_INSERT_TAIL(&railist, rai, rai_next);
+
+ ra_timer_update(ifi, &ifi->ifi_ra_timer->rat_tm);
+ rtadvd_set_timer(&ifi->ifi_ra_timer->rat_tm,
+ ifi->ifi_ra_timer);
+ } else {
+ /* XXX: NOTREACHED. Being shut down. */
+ syslog(LOG_ERR,
+ "<%s> %s is shutting down. Skipped.",
+ __func__, ifi->ifi_ifname);
+ rm_rainfo(rai);
+
+ return (NULL);
}
- rmconfig(idx);
+ break;
}
- TAILQ_INSERT_TAIL(&railist, rai, rai_next);
- /* set timer */
- rai->rai_timer = rtadvd_add_timer(ra_timeout, ra_timer_update,
- rai, rai);
- ra_timer_update((void *)rai, &rai->rai_timer->rat_tm);
- rtadvd_set_timer(&rai->rai_timer->rat_tm, rai->rai_timer);
+ return (ifi);
- return (0);
getconfig_free_rai:
free(rai);
- return (-1);
+ return (NULL);
}
void
@@ -854,8 +1011,9 @@ get_prefix(struct rainfo *rai)
struct ifaddrs *ifap, *ifa;
struct prefix *pfx;
struct in6_addr *a;
- u_char *p, *ep, *m, *lim;
- u_char ntopbuf[INET6_ADDRSTRLEN];
+ struct ifinfo *ifi;
+ char *p, *ep, *m, *lim;
+ char ntopbuf[INET6_ADDRSTRLEN];
if (getifaddrs(&ifap) < 0) {
syslog(LOG_ERR,
@@ -863,20 +1021,22 @@ get_prefix(struct rainfo *rai)
__func__);
exit(1);
}
+ ifi = rai->rai_ifinfo;
for (ifa = ifap; ifa; ifa = ifa->ifa_next) {
int plen;
- if (strcmp(ifa->ifa_name, rai->rai_ifname) != 0)
+ if (strcmp(ifa->ifa_name, ifi->ifi_ifname) != 0)
continue;
if (ifa->ifa_addr->sa_family != AF_INET6)
continue;
a = &((struct sockaddr_in6 *)ifa->ifa_addr)->sin6_addr;
if (IN6_IS_ADDR_LINKLOCAL(a))
continue;
+
/* get prefix length */
- m = (u_char *)&((struct sockaddr_in6 *)ifa->ifa_netmask)->sin6_addr;
- lim = (u_char *)(ifa->ifa_netmask) + ifa->ifa_netmask->sa_len;
+ m = (char *)&((struct sockaddr_in6 *)ifa->ifa_netmask)->sin6_addr;
+ lim = (char *)(ifa->ifa_netmask) + ifa->ifa_netmask->sa_len;
plen = prefixlen(m, lim);
if (plen <= 0 || plen > 128) {
syslog(LOG_ERR, "<%s> failed to get prefixlen "
@@ -897,8 +1057,8 @@ get_prefix(struct rainfo *rai)
/* set prefix, sweep bits outside of prefixlen */
pfx->pfx_prefixlen = plen;
memcpy(&pfx->pfx_prefix, a, sizeof(*a));
- p = (u_char *)&pfx->pfx_prefix;
- ep = (u_char *)(&pfx->pfx_prefix + 1);
+ p = (char *)&pfx->pfx_prefix;
+ ep = (char *)(&pfx->pfx_prefix + 1);
while (m < lim && p < ep)
*p++ &= *m++;
while (p < ep)
@@ -910,7 +1070,7 @@ get_prefix(struct rainfo *rai)
}
syslog(LOG_DEBUG,
"<%s> add %s/%d to prefix list on %s",
- __func__, ntopbuf, pfx->pfx_prefixlen, rai->rai_ifname);
+ __func__, ntopbuf, pfx->pfx_prefixlen, ifi->ifi_ifname);
/* set other fields with protocol defaults */
pfx->pfx_validlifetime = DEF_ADVVALIDLIFETIME;
@@ -951,8 +1111,10 @@ static void
add_prefix(struct rainfo *rai, struct in6_prefixreq *ipr)
{
struct prefix *pfx;
- u_char ntopbuf[INET6_ADDRSTRLEN];
+ struct ifinfo *ifi;
+ char ntopbuf[INET6_ADDRSTRLEN];
+ ifi = rai->rai_ifinfo;
ELM_MALLOC(pfx, return);
pfx->pfx_prefix = ipr->ipr_prefix.sin6_addr;
pfx->pfx_prefixlen = ipr->ipr_plen;
@@ -968,11 +1130,9 @@ add_prefix(struct rainfo *rai, struct in6_prefixreq *ipr)
syslog(LOG_DEBUG, "<%s> new prefix %s/%d was added on %s",
__func__,
inet_ntop(AF_INET6, &ipr->ipr_prefix.sin6_addr, ntopbuf,
- sizeof(ntopbuf)), ipr->ipr_plen, rai->rai_ifname);
+ sizeof(ntopbuf)), ipr->ipr_plen, ifi->ifi_ifname);
- /* reconstruct the packet */
rai->rai_pfxs++;
- make_packet(rai);
}
/*
@@ -983,30 +1143,34 @@ add_prefix(struct rainfo *rai, struct in6_prefixreq *ipr)
void
delete_prefix(struct prefix *pfx)
{
- u_char ntopbuf[INET6_ADDRSTRLEN];
struct rainfo *rai;
+ struct ifinfo *ifi;
+ char ntopbuf[INET6_ADDRSTRLEN];
rai = pfx->pfx_rainfo;
+ ifi = rai->rai_ifinfo;
TAILQ_REMOVE(&rai->rai_prefix, pfx, pfx_next);
syslog(LOG_DEBUG, "<%s> prefix %s/%d was deleted on %s",
__func__,
inet_ntop(AF_INET6, &pfx->pfx_prefix, ntopbuf,
- sizeof(ntopbuf)), pfx->pfx_prefixlen, rai->rai_ifname);
+ sizeof(ntopbuf)), pfx->pfx_prefixlen, ifi->ifi_ifname);
if (pfx->pfx_timer)
rtadvd_remove_timer(pfx->pfx_timer);
free(pfx);
+
rai->rai_pfxs--;
- make_packet(rai);
}
void
invalidate_prefix(struct prefix *pfx)
{
- u_char ntopbuf[INET6_ADDRSTRLEN];
struct timeval timo;
struct rainfo *rai;
+ struct ifinfo *ifi;
+ char ntopbuf[INET6_ADDRSTRLEN];
rai = pfx->pfx_rainfo;
+ ifi = rai->rai_ifinfo;
if (pfx->pfx_timer) { /* sanity check */
syslog(LOG_ERR,
"<%s> assumption failure: timer already exists",
@@ -1017,7 +1181,7 @@ invalidate_prefix(struct prefix *pfx)
syslog(LOG_DEBUG, "<%s> prefix %s/%d was invalidated on %s, "
"will expire in %ld seconds", __func__,
inet_ntop(AF_INET6, &pfx->pfx_prefix, ntopbuf, sizeof(ntopbuf)),
- pfx->pfx_prefixlen, rai->rai_ifname, (long)prefix_timo);
+ pfx->pfx_prefixlen, ifi->ifi_ifname, (long)prefix_timo);
/* set the expiration timer */
pfx->pfx_timer = rtadvd_add_timer(prefix_timeout, NULL, pfx, NULL);
@@ -1043,10 +1207,12 @@ prefix_timeout(void *arg)
void
update_prefix(struct prefix *pfx)
{
- u_char ntopbuf[INET6_ADDRSTRLEN];
struct rainfo *rai;
+ struct ifinfo *ifi;
+ char ntopbuf[INET6_ADDRSTRLEN];
rai = pfx->pfx_rainfo;
+ ifi = rai->rai_ifinfo;
if (pfx->pfx_timer == NULL) { /* sanity check */
syslog(LOG_ERR,
"<%s> assumption failure: timer does not exist",
@@ -1056,7 +1222,7 @@ update_prefix(struct prefix *pfx)
syslog(LOG_DEBUG, "<%s> prefix %s/%d was re-enabled on %s",
__func__, inet_ntop(AF_INET6, &pfx->pfx_prefix, ntopbuf,
- sizeof(ntopbuf)), pfx->pfx_prefixlen, rai->rai_ifname);
+ sizeof(ntopbuf)), pfx->pfx_prefixlen, ifi->ifi_ifname);
/* stop the expiration timer */
rtadvd_remove_timer(pfx->pfx_timer);
@@ -1091,7 +1257,7 @@ init_prefix(struct in6_prefixreq *ipr)
/* omit other field initialization */
}
else if (ipr->ipr_origin < PR_ORIG_RR) {
- u_char ntopbuf[INET6_ADDRSTRLEN];
+ char ntopbuf[INET6_ADDRSTRLEN];
syslog(LOG_WARNING, "<%s> Added prefix(%s)'s origin %d is"
"lower than PR_ORIG_RR(router renumbering)."
@@ -1143,25 +1309,25 @@ make_packet(struct rainfo *rai)
struct nd_router_advert *ra;
struct nd_opt_prefix_info *ndopt_pi;
struct nd_opt_mtu *ndopt_mtu;
-#ifdef ROUTEINFO
struct nd_opt_route_info *ndopt_rti;
struct rtinfo *rti;
-#endif
struct nd_opt_rdnss *ndopt_rdnss;
struct rdnss *rdn;
struct nd_opt_dnssl *ndopt_dnssl;
struct dnssl *dns;
size_t len;
struct prefix *pfx;
+ struct ifinfo *ifi;
+ ifi = rai->rai_ifinfo;
/* calculate total length */
packlen = sizeof(struct nd_router_advert);
if (rai->rai_advlinkopt) {
- if ((lladdroptlen = lladdropt_length(rai->rai_sdl)) == 0) {
+ if ((lladdroptlen = lladdropt_length(&ifi->ifi_sdl)) == 0) {
syslog(LOG_INFO,
"<%s> link-layer address option has"
" null length on %s. Treat as not included.",
- __func__, rai->rai_ifname);
+ __func__, ifi->ifi_ifname);
rai->rai_advlinkopt = 0;
}
packlen += lladdroptlen;
@@ -1170,11 +1336,11 @@ make_packet(struct rainfo *rai)
packlen += sizeof(struct nd_opt_prefix_info) * rai->rai_pfxs;
if (rai->rai_linkmtu)
packlen += sizeof(struct nd_opt_mtu);
-#ifdef ROUTEINFO
+
TAILQ_FOREACH(rti, &rai->rai_route, rti_next)
packlen += sizeof(struct nd_opt_route_info) +
((rti->rti_prefixlen + 0x3f) >> 6) * 8;
-#endif
+
TAILQ_FOREACH(rdn, &rai->rai_rdnss, rd_next) {
struct rdnss_addr *rdna;
@@ -1217,7 +1383,7 @@ make_packet(struct rainfo *rai)
ra->nd_ra_type = ND_ROUTER_ADVERT;
ra->nd_ra_code = 0;
ra->nd_ra_cksum = 0;
- ra->nd_ra_curhoplimit = (u_int8_t)(0xff & rai->rai_hoplimit);
+ ra->nd_ra_curhoplimit = (uint8_t)(0xff & rai->rai_hoplimit);
ra->nd_ra_flags_reserved = 0; /* just in case */
/*
* XXX: the router preference field, which is a 2-bit field, should be
@@ -1234,7 +1400,7 @@ make_packet(struct rainfo *rai)
buf += sizeof(*ra);
if (rai->rai_advlinkopt) {
- lladdropt_fill(rai->rai_sdl, (struct nd_opt_hdr *)buf);
+ lladdropt_fill(&ifi->ifi_sdl, (struct nd_opt_hdr *)buf);
buf += lladdroptlen;
}
@@ -1248,7 +1414,7 @@ make_packet(struct rainfo *rai)
}
TAILQ_FOREACH(pfx, &rai->rai_prefix, pfx_next) {
- u_int32_t vltime, pltime;
+ uint32_t vltime, pltime;
struct timeval now;
ndopt_pi = (struct nd_opt_prefix_info *)buf;
@@ -1270,7 +1436,7 @@ make_packet(struct rainfo *rai)
if (pfx->pfx_vltimeexpire == 0)
vltime = pfx->pfx_validlifetime;
else
- vltime = (pfx->pfx_vltimeexpire > now.tv_sec) ?
+ vltime = ((time_t)pfx->pfx_vltimeexpire > now.tv_sec) ?
pfx->pfx_vltimeexpire - now.tv_sec : 0;
}
if (pfx->pfx_timer)
@@ -1279,7 +1445,7 @@ make_packet(struct rainfo *rai)
if (pfx->pfx_pltimeexpire == 0)
pltime = pfx->pfx_preflifetime;
else
- pltime = (pfx->pfx_pltimeexpire > now.tv_sec) ?
+ pltime = ((time_t)pfx->pfx_pltimeexpire > now.tv_sec) ?
pfx->pfx_pltimeexpire - now.tv_sec : 0;
}
if (vltime < pltime) {
@@ -1297,9 +1463,8 @@ make_packet(struct rainfo *rai)
buf += sizeof(struct nd_opt_prefix_info);
}
-#ifdef ROUTEINFO
TAILQ_FOREACH(rti, &rai->rai_route, rti_next) {
- u_int8_t psize = (rti->rti_prefixlen + 0x3f) >> 6;
+ uint8_t psize = (rti->rti_prefixlen + 0x3f) >> 6;
ndopt_rti = (struct nd_opt_route_info *)buf;
ndopt_rti->nd_opt_rti_type = ND_OPT_ROUTE_INFO;
@@ -1310,7 +1475,7 @@ make_packet(struct rainfo *rai)
memcpy(ndopt_rti + 1, &rti->rti_prefix, psize * 8);
buf += sizeof(struct nd_opt_route_info) + psize * 8;
}
-#endif
+
TAILQ_FOREACH(rdn, &rai->rai_rdnss, rd_next) {
struct rdnss_addr *rdna;
@@ -1331,6 +1496,7 @@ make_packet(struct rainfo *rai)
syslog(LOG_DEBUG, "<%s>: nd_opt_dnss_len = %d", __func__,
ndopt_rdnss->nd_opt_rdnss_len);
}
+
TAILQ_FOREACH(dns, &rai->rai_dnssl, dn_next) {
struct dnssl_addr *dnsa;
diff --git a/usr.sbin/rtadvd/config.h b/usr.sbin/rtadvd/config.h
index 01886a6..219390b 100644
--- a/usr.sbin/rtadvd/config.h
+++ b/usr.sbin/rtadvd/config.h
@@ -30,9 +30,12 @@
* SUCH DAMAGE.
*/
-extern int getconfig(int);
-extern int rmconfig(int);
-extern int loadconfig(char *[], const int);
+extern struct ifinfo *getconfig(struct ifinfo *);
+extern int rm_ifinfo(struct ifinfo *);
+extern int rm_ifinfo_index(int);
+extern int rm_rainfo(struct rainfo *);
+extern int loadconfig_ifname(char *);
+extern int loadconfig_index(int);
extern void delete_prefix(struct prefix *);
extern void invalidate_prefix(struct prefix *);
extern void update_prefix(struct prefix *);
@@ -40,7 +43,6 @@ extern void make_prefix(struct rainfo *, int, struct in6_addr *, int);
extern void make_packet(struct rainfo *);
extern void get_prefix(struct rainfo *);
-
/*
* it is highly unlikely to have 100 prefix information options,
* so it should be okay to limit it
diff --git a/usr.sbin/rtadvd/control.c b/usr.sbin/rtadvd/control.c
new file mode 100644
index 0000000..709fae3
--- /dev/null
+++ b/usr.sbin/rtadvd/control.c
@@ -0,0 +1,456 @@
+/*-
+ * Copyright (C) 2011 Hiroki Sato <hrs@FreeBSD.org>
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
+ * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+ * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * $FreeBSD$
+ *
+ */
+
+#include <sys/queue.h>
+#include <sys/types.h>
+#include <sys/socket.h>
+#include <sys/stat.h>
+#include <sys/un.h>
+#include <sys/uio.h>
+#include <net/if.h>
+#include <net/if_dl.h>
+#include <netinet/in.h>
+#include <netinet/icmp6.h>
+#include <fcntl.h>
+#include <errno.h>
+#include <netdb.h>
+#include <unistd.h>
+#include <signal.h>
+#include <string.h>
+#include <stdarg.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <syslog.h>
+
+#include "rtadvd.h"
+#include "if.h"
+#include "pathnames.h"
+#include "control.h"
+
+int
+cmsg_recv(int fd, char *buf)
+{
+ int n;
+ struct ctrl_msg_hdr *cm;
+ char *msg;
+
+ syslog(LOG_DEBUG, "<%s> enter, fd=%d", __func__, fd);
+
+ memset(buf, 0, CM_MSG_MAXLEN);
+ cm = (struct ctrl_msg_hdr *)buf;
+ msg = (char *)buf + sizeof(*cm);
+
+ for (;;) {
+ n = read(fd, cm, sizeof(*cm));
+ if (n < 0 && errno == EAGAIN) {
+ syslog(LOG_DEBUG,
+ "<%s> waiting...", __func__);
+ continue;
+ }
+ break;
+ }
+
+ if (n != sizeof(*cm)) {
+ syslog(LOG_WARNING,
+ "<%s> received a too small message.", __func__);
+ goto cmsg_recv_err;
+ }
+ if (cm->cm_len > CM_MSG_MAXLEN) {
+ syslog(LOG_WARNING,
+ "<%s> received a too large message.", __func__);
+ goto cmsg_recv_err;
+ }
+ if (cm->cm_version != CM_VERSION) {
+ syslog(LOG_WARNING,
+ "<%s> version mismatch", __func__);
+ goto cmsg_recv_err;
+ }
+ if (cm->cm_type >= CM_TYPE_MAX) {
+ syslog(LOG_WARNING,
+ "<%s> invalid msg type.", __func__);
+ goto cmsg_recv_err;
+ }
+
+ syslog(LOG_DEBUG,
+ "<%s> ctrl msg received: type=%d", __func__,
+ cm->cm_type);
+
+ if (cm->cm_len > sizeof(cm)) {
+ int msglen = cm->cm_len - sizeof(*cm);
+
+ syslog(LOG_DEBUG,
+ "<%s> ctrl msg has payload (len=%d)", __func__,
+ msglen);
+
+ for (;;) {
+ n = read(fd, msg, msglen);
+ if (n < 0 && errno == EAGAIN) {
+ syslog(LOG_DEBUG,
+ "<%s> waiting...", __func__);
+ continue;
+ }
+ break;
+ }
+ if (n != msglen) {
+ syslog(LOG_WARNING,
+ "<%s> payload size mismatch.", __func__);
+ goto cmsg_recv_err;
+ }
+ buf[CM_MSG_MAXLEN - 1] = '\0';
+ }
+
+ return (0);
+
+cmsg_recv_err:
+ close(fd);
+ return (-1);
+}
+
+int
+cmsg_send(int fd, char *buf)
+{
+ struct iovec iov[2];
+ int iovcnt;
+ ssize_t len;
+ ssize_t iov_len_total;
+ struct ctrl_msg_hdr *cm;
+ char *msg;
+
+ cm = (struct ctrl_msg_hdr *)buf;
+ msg = (char *)buf + sizeof(*cm);
+
+ iovcnt = 1;
+ iov[0].iov_base = cm;
+ iov[0].iov_len = sizeof(*cm);
+ iov_len_total = iov[0].iov_len;
+ if (cm->cm_len > sizeof(*cm)) {
+ iovcnt++;
+ iov[1].iov_base = msg;
+ iov[1].iov_len = cm->cm_len - iov[0].iov_len;
+ iov_len_total += iov[1].iov_len;
+ }
+
+ syslog(LOG_DEBUG,
+ "<%s> ctrl msg send: type=%d, count=%d, total_len=%zd", __func__,
+ cm->cm_type, iovcnt, iov_len_total);
+
+ len = writev(fd, iov, iovcnt);
+ syslog(LOG_DEBUG,
+ "<%s> ctrl msg send: length=%zd", __func__, len);
+
+ if (len == -1) {
+ syslog(LOG_DEBUG,
+ "<%s> write failed: (%d)%s", __func__, errno,
+ strerror(errno));
+ close(fd);
+ return (-1);
+ }
+
+ syslog(LOG_DEBUG,
+ "<%s> write length = %zd (actual)", __func__, len);
+ syslog(LOG_DEBUG,
+ "<%s> write length = %zd (expected)", __func__, iov_len_total);
+
+ if (len != iov_len_total) {
+ close(fd);
+ return (-1);
+ }
+
+ return (0);
+}
+
+int
+csock_accept(struct sockinfo *s)
+{
+ struct sockaddr_un sun;
+ int flags;
+ int fd;
+
+ sun.sun_len = sizeof(sun);
+ if ((fd = accept(s->si_fd, (struct sockaddr *)&sun,
+ (socklen_t *)&sun.sun_len)) == -1) {
+ if (errno != EWOULDBLOCK && errno != EINTR)
+ syslog(LOG_WARNING, "<%s> accept ", __func__);
+ syslog(LOG_WARNING, "<%s> Xaccept: %s", __func__, strerror(errno));
+ return (-1);
+ }
+ if ((flags = fcntl(fd, F_GETFL, 0)) == -1) {
+ syslog(LOG_WARNING, "<%s> fcntl F_GETFL", __func__);
+ close(s->si_fd);
+ return (-1);
+ }
+ if ((flags = fcntl(fd, F_SETFL, flags | O_NONBLOCK)) == -1) {
+ syslog(LOG_WARNING, "<%s> fcntl F_SETFL", __func__);
+ return (-1);
+ }
+ syslog(LOG_DEBUG, "<%s> accept connfd=%d, listenfd=%d", __func__,
+ fd, s->si_fd);
+
+ return (fd);
+}
+
+int
+csock_close(struct sockinfo *s)
+{
+ close(s->si_fd);
+ unlink(s->si_name);
+ syslog(LOG_DEBUG, "<%s> remove %s", __func__, s->si_name);
+ return (0);
+}
+
+int
+csock_listen(struct sockinfo *s)
+{
+ if (s->si_fd == -1) {
+ syslog(LOG_ERR, "<%s> listen failed", __func__);
+ return (-1);
+ }
+ if (listen(s->si_fd, SOCK_BACKLOG) == -1) {
+ syslog(LOG_ERR, "<%s> listen failed", __func__);
+ return (-1);
+ }
+
+ return (0);
+}
+
+int
+csock_open(struct sockinfo *s, mode_t mode)
+{
+ int flags;
+ struct sockaddr_un sun;
+ mode_t old_umask;
+
+ if (s == NULL) {
+ syslog(LOG_ERR, "<%s> internal error.", __func__);
+ exit(1);
+ }
+ if (s->si_name == NULL)
+ s->si_name = _PATH_CTRL_SOCK;
+
+ if ((s->si_fd = socket(PF_UNIX, SOCK_STREAM, 0)) == -1) {
+ syslog(LOG_ERR,
+ "<%s> cannot open control socket", __func__);
+ return (-1);
+ }
+ memset(&sun, 0, sizeof(sun));
+ sun.sun_family = AF_UNIX;
+ sun.sun_len = sizeof(sun);
+ strlcpy(sun.sun_path, s->si_name, sizeof(sun.sun_path));
+
+ if (unlink(s->si_name) == -1)
+ if (errno != ENOENT) {
+ syslog(LOG_ERR,
+ "<%s> unlink %s", __func__, s->si_name);
+ close(s->si_fd);
+ return (-1);
+ }
+ old_umask = umask(S_IXUSR|S_IXGRP|S_IXOTH);
+ if (bind(s->si_fd, (struct sockaddr *)&sun, sizeof(sun)) == -1) {
+ syslog(LOG_ERR,
+ "<%s> bind failed: %s", __func__, s->si_name);
+ close(s->si_fd);
+ umask(old_umask);
+ return (-1);
+ }
+ umask(old_umask);
+ if (chmod(s->si_name, mode) == -1) {
+ syslog(LOG_ERR,
+ "<%s> chmod failed: %s", __func__, s->si_name);
+ goto csock_open_err;
+ }
+ if ((flags = fcntl(s->si_fd, F_GETFL, 0)) == -1) {
+ syslog(LOG_ERR,
+ "<%s> fcntl F_GETFL failed: %s", __func__, s->si_name);
+ goto csock_open_err;
+ }
+ if ((flags = fcntl(s->si_fd, F_SETFL, flags | O_NONBLOCK)) == -1) {
+ syslog(LOG_ERR,
+ "<%s> fcntl F_SETFL failed: %s", __func__, s->si_name);
+ goto csock_open_err;
+ }
+
+ return (s->si_fd);
+
+csock_open_err:
+ close(s->si_fd);
+ unlink(s->si_name);
+ return (-1);
+}
+
+struct ctrl_msg_pl *
+cmsg_bin2pl(char *str, struct ctrl_msg_pl *cp)
+{
+ size_t len;
+ size_t *lenp;
+ char *p;
+
+ memset(cp, 0, sizeof(*cp));
+
+ p = str;
+
+ lenp = (size_t *)p;
+ len = *lenp++;
+ p = (char *)lenp;
+ syslog(LOG_DEBUG, "<%s> len(ifname) = %zu", __func__, len);
+ if (len > 0) {
+ cp->cp_ifname = malloc(len + 1);
+ if (cp->cp_ifname == NULL) {
+ syslog(LOG_ERR, "<%s> malloc", __func__);
+ exit(1);
+ }
+ memcpy(cp->cp_ifname, p, len);
+ cp->cp_ifname[len] = '\0';
+ p += len;
+ }
+
+ lenp = (size_t *)p;
+ len = *lenp++;
+ p = (char *)lenp;
+ syslog(LOG_DEBUG, "<%s> len(key) = %zu", __func__, len);
+ if (len > 0) {
+ cp->cp_key = malloc(len + 1);
+ if (cp->cp_key == NULL) {
+ syslog(LOG_ERR, "<%s> malloc", __func__);
+ exit(1);
+ }
+ memcpy(cp->cp_key, p, len);
+ cp->cp_key[len] = '\0';
+ p += len;
+ }
+
+ lenp = (size_t *)p;
+ len = *lenp++;
+ p = (char *)lenp;
+ syslog(LOG_DEBUG, "<%s> len(val) = %zu", __func__, len);
+ if (len > 0) {
+ cp->cp_val = malloc(len + 1);
+ if (cp->cp_val == NULL) {
+ syslog(LOG_ERR, "<%s> malloc", __func__);
+ exit(1);
+ }
+ memcpy(cp->cp_val, p, len);
+ cp->cp_val[len] = '\0';
+ cp->cp_val_len = len;
+ } else
+ cp->cp_val_len = 0;
+
+ return (cp);
+}
+
+size_t
+cmsg_pl2bin(char *str, struct ctrl_msg_pl *cp)
+{
+ size_t len;
+ size_t *lenp;
+ char *p;
+ struct ctrl_msg_hdr *cm;
+
+ len = sizeof(size_t);
+ if (cp->cp_ifname != NULL)
+ len += strlen(cp->cp_ifname);
+ len += sizeof(size_t);
+ if (cp->cp_key != NULL)
+ len += strlen(cp->cp_key);
+ len += sizeof(size_t);
+ if (cp->cp_val != NULL && cp->cp_val_len > 0)
+ len += cp->cp_val_len;
+
+ if (len > CM_MSG_MAXLEN - sizeof(*cm)) {
+ syslog(LOG_DEBUG, "<%s> msg too long (len=%zu)",
+ __func__, len);
+ return (0);
+ }
+ syslog(LOG_DEBUG, "<%s> msglen=%zu", __func__, len);
+ memset(str, 0, len);
+ p = str;
+ lenp = (size_t *)p;
+
+ if (cp->cp_ifname != NULL) {
+ *lenp++ = strlen(cp->cp_ifname);
+ p = (char *)lenp;
+ memcpy(p, cp->cp_ifname, strlen(cp->cp_ifname));
+ p += strlen(cp->cp_ifname);
+ } else {
+ *lenp++ = '\0';
+ p = (char *)lenp;
+ }
+
+ lenp = (size_t *)p;
+ if (cp->cp_key != NULL) {
+ *lenp++ = strlen(cp->cp_key);
+ p = (char *)lenp;
+ memcpy(p, cp->cp_key, strlen(cp->cp_key));
+ p += strlen(cp->cp_key);
+ } else {
+ *lenp++ = '\0';
+ p = (char *)lenp;
+ }
+
+ lenp = (size_t *)p;
+ if (cp->cp_val != NULL && cp->cp_val_len > 0) {
+ *lenp++ = cp->cp_val_len;
+ p = (char *)lenp;
+ memcpy(p, cp->cp_val, cp->cp_val_len);
+ p += cp->cp_val_len;
+ } else {
+ *lenp++ = '\0';
+ p = (char *)lenp;
+ }
+
+ return (len);
+}
+
+size_t
+cmsg_str2bin(char *bin, void *str, size_t len)
+{
+ struct ctrl_msg_hdr *cm;
+
+ syslog(LOG_DEBUG, "<%s> enter", __func__);
+
+ if (len > CM_MSG_MAXLEN - sizeof(*cm)) {
+ syslog(LOG_DEBUG, "<%s> msg too long (len=%zu)",
+ __func__, len);
+ return (0);
+ }
+ syslog(LOG_DEBUG, "<%s> msglen=%zu", __func__, len);
+ memcpy(bin, (char *)str, len);
+
+ return (len);
+}
+
+void *
+cmsg_bin2str(char *bin, void *str, size_t len)
+{
+
+ syslog(LOG_DEBUG, "<%s> enter", __func__);
+
+ memcpy((char *)str, bin, len);
+
+ return (str);
+}
diff --git a/usr.sbin/rtadvd/control.h b/usr.sbin/rtadvd/control.h
new file mode 100644
index 0000000..a7de2ce
--- /dev/null
+++ b/usr.sbin/rtadvd/control.h
@@ -0,0 +1,74 @@
+/*-
+ * Copyright (C) 2011 Hiroki Sato <hrs@FreeBSD.org>
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * $FreeBSD$
+ *
+ */
+
+#define SOCK_BACKLOG 5
+
+#define CM_MSG_MAXLEN 8192
+#define CM_VERSION 1
+#define CM_VERSION_STR "1.0"
+
+#define CM_TYPE_EOM 0
+#define CM_TYPE_ACK 1
+#define CM_TYPE_ERR 2
+#define CM_TYPE_NUL 3
+#define CM_TYPE_REQ_SET_PROP 4
+#define CM_TYPE_REQ_GET_PROP 5
+#define CM_TYPE_MAX 6
+
+#define CM_STATE_EOM 0
+#define CM_STATE_INIT 1
+#define CM_STATE_MSG_DISPATCH 2
+#define CM_STATE_MSG_RECV 3
+#define CM_STATE_ACK_WAIT 4
+
+struct ctrl_msg_hdr {
+ int cm_version;
+ size_t cm_len;
+ int cm_type;
+};
+
+struct ctrl_msg_pl {
+ char *cp_ifname;
+ char *cp_key;
+
+ size_t cp_val_len;
+ char *cp_val;
+};
+
+int csock_open(struct sockinfo *, mode_t);
+int csock_close(struct sockinfo *);
+int csock_listen(struct sockinfo *);
+int csock_accept(struct sockinfo *);
+int cmsg_send(int, char *);
+int cmsg_recv(int, char *);
+
+size_t cmsg_pl2bin(char *, struct ctrl_msg_pl *);
+struct ctrl_msg_pl *cmsg_bin2pl(char *, struct ctrl_msg_pl *);
+size_t cmsg_str2bin(char *, void *, size_t);
+void *cmsg_bin2str(char *, void *, size_t);
diff --git a/usr.sbin/rtadvd/control_client.c b/usr.sbin/rtadvd/control_client.c
new file mode 100644
index 0000000..a78bcc9
--- /dev/null
+++ b/usr.sbin/rtadvd/control_client.c
@@ -0,0 +1,131 @@
+/*-
+ * Copyright (C) 2011 Hiroki Sato <hrs@FreeBSD.org>
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
+ * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+ * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * $FreeBSD$
+ *
+ */
+
+#include <sys/queue.h>
+#include <sys/types.h>
+#include <sys/socket.h>
+#include <sys/stat.h>
+#include <sys/un.h>
+#include <sys/uio.h>
+#include <net/if.h>
+#include <net/if_dl.h>
+#include <netinet/in.h>
+#include <netinet/icmp6.h>
+#include <fcntl.h>
+#include <errno.h>
+#include <netdb.h>
+#include <unistd.h>
+#include <signal.h>
+#include <string.h>
+#include <stdarg.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <syslog.h>
+
+#include "pathnames.h"
+#include "rtadvd.h"
+#include "if.h"
+#include "control.h"
+#include "control_client.h"
+
+int
+cmsg_handler_client(int fd, int state, char *buf_orig)
+{
+ char buf[CM_MSG_MAXLEN];
+ struct ctrl_msg_hdr *cm;
+ struct ctrl_msg_hdr *cm_orig;
+ int error;
+ char *msg;
+ char *msg_orig;
+
+ syslog(LOG_DEBUG, "<%s> enter", __func__);
+
+ memset(buf, 0, sizeof(buf));
+ cm = (struct ctrl_msg_hdr *)buf;
+ cm_orig = (struct ctrl_msg_hdr *)buf_orig;
+ msg = (char *)buf + sizeof(*cm);
+ msg_orig = (char *)buf_orig + sizeof(*cm_orig);
+
+ if (cm_orig->cm_len > CM_MSG_MAXLEN) {
+ syslog(LOG_DEBUG, "<%s> msg too long", __func__);
+ close(fd);
+ return (-1);
+ }
+ cm->cm_type = cm_orig->cm_type;
+ if (cm_orig->cm_len > sizeof(*cm_orig)) {
+ memcpy(msg, msg_orig, cm_orig->cm_len - sizeof(*cm));
+ cm->cm_len = cm_orig->cm_len;
+ }
+ while (state != CM_STATE_EOM) {
+ syslog(LOG_DEBUG, "<%s> state = %d", __func__, state);
+
+ switch (state) {
+ case CM_STATE_INIT:
+ state = CM_STATE_EOM;
+ break;
+ case CM_STATE_MSG_DISPATCH:
+ cm->cm_version = CM_VERSION;
+ error = cmsg_send(fd, buf);
+ if (error)
+ syslog(LOG_WARNING,
+ "<%s> cmsg_send()", __func__);
+ state = CM_STATE_ACK_WAIT;
+ break;
+ case CM_STATE_ACK_WAIT:
+ error = cmsg_recv(fd, buf);
+ if (error) {
+ syslog(LOG_ERR,
+ "<%s> cmsg_recv()", __func__);
+ close(fd);
+ return (-1);
+ }
+ switch (cm->cm_type) {
+ case CM_TYPE_ACK:
+ syslog(LOG_DEBUG,
+ "<%s> CM_TYPE_ACK", __func__);
+ break;
+ case CM_TYPE_ERR:
+ syslog(LOG_DEBUG,
+ "<%s> CM_TYPE_ERR", __func__);
+ close(fd);
+ return (-1);
+ default:
+ syslog(LOG_DEBUG,
+ "<%s> unknown status", __func__);
+ close(fd);
+ return (-1);
+ }
+ memcpy(buf_orig, buf, cm->cm_len);
+ state = CM_STATE_EOM;
+ break;
+ }
+ }
+ close(fd);
+ return (0);
+}
diff --git a/usr.sbin/rtadvd/control_client.h b/usr.sbin/rtadvd/control_client.h
new file mode 100644
index 0000000..89a7d80
--- /dev/null
+++ b/usr.sbin/rtadvd/control_client.h
@@ -0,0 +1,30 @@
+/*
+ * Copyright (C) 2011 Hiroki Sato <hrs@FreeBSD.org>
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
+ * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+ * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * $FreeBSD$
+ *
+ */
+
+int cmsg_handler_client(int, int, char *);
diff --git a/usr.sbin/rtadvd/control_server.c b/usr.sbin/rtadvd/control_server.c
new file mode 100644
index 0000000..7d2ddc5
--- /dev/null
+++ b/usr.sbin/rtadvd/control_server.c
@@ -0,0 +1,742 @@
+/*-
+ * Copyright (C) 2011 Hiroki Sato <hrs@FreeBSD.org>
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
+ * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+ * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * $FreeBSD$
+ *
+ */
+
+#include <sys/queue.h>
+#include <sys/types.h>
+#include <sys/socket.h>
+#include <sys/stat.h>
+#include <sys/un.h>
+#include <sys/uio.h>
+#include <net/if.h>
+#include <net/if_dl.h>
+#include <netinet/in.h>
+#include <netinet/icmp6.h>
+#include <fcntl.h>
+#include <errno.h>
+#include <netdb.h>
+#include <unistd.h>
+#include <signal.h>
+#include <string.h>
+#include <stdarg.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <syslog.h>
+
+#include "pathnames.h"
+#include "rtadvd.h"
+#include "if.h"
+#include "control.h"
+#include "control_server.h"
+#include "timer.h"
+
+static char *do_reload_ifname;
+static int do_reload;
+static int do_shutdown;
+
+void set_do_reload(int sig __unused) { do_reload = 1; }
+void set_do_reload_ifname(char *ifname){ do_reload_ifname = ifname; }
+void set_do_shutdown(int sig __unused) { do_shutdown = 1; }
+void reset_do_reload(void) { do_reload = 0; do_reload_ifname = NULL; }
+void reset_do_shutdown(void) { do_shutdown = 0; }
+int is_do_reload(void) { return (do_reload); }
+int is_do_shutdown(void) { return (do_shutdown); }
+char *reload_ifname(void) { return (do_reload_ifname); }
+
+#define DEF_PL_HANDLER(key) { #key, cmsg_getprop_##key }
+
+static int cmsg_getprop_echo(struct ctrl_msg_pl *);
+static int cmsg_getprop_version(struct ctrl_msg_pl *);
+static int cmsg_getprop_ifilist(struct ctrl_msg_pl *);
+static int cmsg_getprop_ifi(struct ctrl_msg_pl *);
+static int cmsg_getprop_ifi_ra_timer(struct ctrl_msg_pl *);
+static int cmsg_getprop_rai(struct ctrl_msg_pl *);
+static int cmsg_getprop_pfx(struct ctrl_msg_pl *);
+static int cmsg_getprop_rdnss(struct ctrl_msg_pl *);
+static int cmsg_getprop_dnssl(struct ctrl_msg_pl *);
+static int cmsg_getprop_rti(struct ctrl_msg_pl *);
+
+static int cmsg_setprop_reload(struct ctrl_msg_pl *);
+static int cmsg_setprop_enable(struct ctrl_msg_pl *);
+static int cmsg_setprop_disable(struct ctrl_msg_pl *);
+
+static struct dispatch_table {
+ const char *dt_comm;
+ int (*dt_act)(struct ctrl_msg_pl *cp);
+} getprop_dtable[] = {
+ { "", cmsg_getprop_echo },
+ DEF_PL_HANDLER(echo),
+ DEF_PL_HANDLER(version),
+ DEF_PL_HANDLER(ifilist),
+ DEF_PL_HANDLER(ifi),
+ DEF_PL_HANDLER(ifi_ra_timer),
+ DEF_PL_HANDLER(rai),
+ DEF_PL_HANDLER(rti),
+ DEF_PL_HANDLER(pfx),
+ DEF_PL_HANDLER(rdnss),
+ DEF_PL_HANDLER(dnssl),
+};
+
+static int
+cmsg_getprop_echo(struct ctrl_msg_pl *cp)
+{
+
+ syslog(LOG_DEBUG, "<%s> enter", __func__);
+ cp->cp_val = strdup("");
+ cp->cp_val_len = strlen(cp->cp_val) + 1;
+
+ return (0);
+}
+
+static int
+cmsg_getprop_version(struct ctrl_msg_pl *cp)
+{
+
+ syslog(LOG_DEBUG, "<%s> enter", __func__);
+ cp->cp_val = strdup(CM_VERSION_STR);
+ cp->cp_val_len = strlen(cp->cp_val) + 1;
+
+ return (0);
+}
+
+static int
+cmsg_getprop_ifilist(struct ctrl_msg_pl *cp)
+{
+ struct ifinfo *ifi;
+ char *p;
+ size_t len;
+
+ syslog(LOG_DEBUG, "<%s> enter", __func__);
+
+ len = 0;
+ TAILQ_FOREACH(ifi, &ifilist, ifi_next) {
+ len += strlen(ifi->ifi_ifname) + 1;
+ }
+
+ syslog(LOG_DEBUG, "<%s> len = %zu", __func__, len);
+
+ p = malloc(len);
+ if (p == NULL)
+ exit(1);
+ memset(p, 0, len);
+ cp->cp_val = p;
+
+ if (len > 0)
+ TAILQ_FOREACH(ifi, &ifilist, ifi_next) {
+ syslog(LOG_DEBUG, "<%s> add ifname=%s(%d)",
+ __func__, ifi->ifi_ifname, ifi->ifi_ifindex);
+ strcpy(p, ifi->ifi_ifname);
+ p += strlen(ifi->ifi_ifname) + 1;
+ }
+ cp->cp_val_len = p - cp->cp_val;
+
+ return (0);
+}
+
+static int
+cmsg_getprop_ifi(struct ctrl_msg_pl *cp)
+{
+ struct ifinfo *ifi;
+ char *p;
+ size_t len;
+
+ syslog(LOG_DEBUG, "<%s> enter", __func__);
+
+ TAILQ_FOREACH(ifi, &ifilist, ifi_next) {
+ if (strcmp(cp->cp_ifname, ifi->ifi_ifname) == 0)
+ break;
+ }
+ if (ifi == NULL) {
+ syslog(LOG_ERR, "<%s> %s not found", __func__,
+ cp->cp_ifname);
+ return (1);
+ }
+
+ p = malloc(sizeof(*ifi));
+ if (p == NULL)
+ exit(1);
+ len = cmsg_str2bin(p, ifi, sizeof(*ifi));
+
+ syslog(LOG_DEBUG, "<%s> len = %zu", __func__, len);
+
+ if (len == 0)
+ return (1);
+
+ cp->cp_val = p;
+ cp->cp_val_len = len;
+
+ return (0);
+}
+
+static int
+cmsg_getprop_rai(struct ctrl_msg_pl *cp)
+{
+ struct ifinfo *ifi;
+ struct rainfo *rai;
+ char *p;
+ size_t len;
+
+ syslog(LOG_DEBUG, "<%s> enter", __func__);
+
+ TAILQ_FOREACH(ifi, &ifilist, ifi_next) {
+ if (strcmp(cp->cp_ifname, ifi->ifi_ifname) == 0)
+ break;
+ }
+ if (ifi == NULL) {
+ syslog(LOG_ERR, "<%s> %s not found", __func__,
+ cp->cp_ifname);
+ return (1);
+ }
+ if ((rai = ifi->ifi_rainfo) == NULL) {
+ syslog(LOG_ERR, "<%s> %s has no rainfo", __func__,
+ cp->cp_ifname);
+ return (1);
+ }
+
+ p = malloc(sizeof(*rai));
+ if (p == NULL)
+ exit(1);
+ len = cmsg_str2bin(p, rai, sizeof(*rai));
+
+ syslog(LOG_DEBUG, "<%s> len = %zu", __func__, len);
+
+ if (len == 0)
+ return (1);
+
+ cp->cp_val = p;
+ cp->cp_val_len = len;
+
+ return (0);
+}
+
+static int
+cmsg_getprop_ifi_ra_timer(struct ctrl_msg_pl *cp)
+{
+ struct ifinfo *ifi;
+ struct rainfo *rai;
+ struct rtadvd_timer *rtimer;
+ char *p;
+ size_t len;
+
+ syslog(LOG_DEBUG, "<%s> enter", __func__);
+
+ TAILQ_FOREACH(ifi, &ifilist, ifi_next) {
+ if (strcmp(cp->cp_ifname, ifi->ifi_ifname) == 0)
+ break;
+ }
+ if (ifi == NULL) {
+ syslog(LOG_ERR, "<%s> %s not found", __func__,
+ cp->cp_ifname);
+ return (1);
+ }
+ if ((rai = ifi->ifi_rainfo) == NULL) {
+ syslog(LOG_ERR, "<%s> %s has no rainfo", __func__,
+ cp->cp_ifname);
+ return (1);
+ }
+ if ((rtimer = ifi->ifi_ra_timer) == NULL) {
+ syslog(LOG_ERR, "<%s> %s has no ifi_ra_timer", __func__,
+ cp->cp_ifname);
+ return (1);
+ }
+ p = malloc(sizeof(*rtimer));
+ if (p == NULL)
+ exit(1);
+ len = cmsg_str2bin(p, rtimer, sizeof(*rtimer));
+
+ syslog(LOG_DEBUG, "<%s> len = %zu", __func__, len);
+
+ if (len == 0)
+ return (1);
+
+ cp->cp_val = p;
+ cp->cp_val_len = len;
+
+ return (0);
+}
+
+static int
+cmsg_getprop_rti(struct ctrl_msg_pl *cp)
+{
+ struct ifinfo *ifi;
+ struct rainfo *rai;
+ struct rtinfo *rti;
+ char *p;
+ size_t len;
+
+ syslog(LOG_DEBUG, "<%s> enter", __func__);
+
+ len = 0;
+ TAILQ_FOREACH(ifi, &ifilist, ifi_next) {
+ if (strcmp(cp->cp_ifname, ifi->ifi_ifname) == 0)
+ break;
+ }
+ if (ifi == NULL) {
+ syslog(LOG_ERR, "<%s> %s not found", __func__,
+ cp->cp_ifname);
+ return (1);
+ }
+ if (ifi->ifi_rainfo == NULL) {
+ syslog(LOG_ERR, "<%s> %s has no rainfo", __func__,
+ cp->cp_ifname);
+ return (1);
+ }
+ rai = ifi->ifi_rainfo;
+ TAILQ_FOREACH(rti, &rai->rai_route, rti_next) {
+ len += sizeof(*rti);
+ }
+
+ syslog(LOG_DEBUG, "<%s> len = %zu", __func__, len);
+
+ p = malloc(len);
+ if (p == NULL)
+ exit(1);
+ memset(p, 0, len);
+ cp->cp_val = p;
+
+ if (len > 0)
+ TAILQ_FOREACH(rti, &rai->rai_route, rti_next) {
+ memcpy(p, rti, sizeof(*rti));
+ p += sizeof(*rti);
+ }
+ cp->cp_val_len = p - cp->cp_val;
+
+ return (0);
+}
+
+static int
+cmsg_getprop_pfx(struct ctrl_msg_pl *cp)
+{
+ struct ifinfo *ifi;
+ struct rainfo *rai;
+ struct prefix *pfx;
+ char *p;
+ size_t len;
+
+ syslog(LOG_DEBUG, "<%s> enter", __func__);
+
+ len = 0;
+ TAILQ_FOREACH(ifi, &ifilist, ifi_next) {
+ if (strcmp(cp->cp_ifname, ifi->ifi_ifname) == 0)
+ break;
+ }
+ if (ifi == NULL) {
+ syslog(LOG_ERR, "<%s> %s not found", __func__,
+ cp->cp_ifname);
+ return (1);
+ }
+ if (ifi->ifi_rainfo == NULL) {
+ syslog(LOG_ERR, "<%s> %s has no rainfo", __func__,
+ cp->cp_ifname);
+ return (1);
+ }
+ rai = ifi->ifi_rainfo;
+ TAILQ_FOREACH(pfx, &rai->rai_prefix, pfx_next) {
+ len += sizeof(*pfx);
+ }
+
+ syslog(LOG_DEBUG, "<%s> len = %zu", __func__, len);
+
+ p = malloc(len);
+ if (p == NULL)
+ exit(1);
+ memset(p, 0, len);
+ cp->cp_val = p;
+
+ if (len > 0)
+ TAILQ_FOREACH(pfx, &rai->rai_prefix, pfx_next) {
+ memcpy(p, pfx, sizeof(*pfx));
+ p += sizeof(*pfx);
+ }
+ cp->cp_val_len = p - cp->cp_val;
+
+ return (0);
+}
+
+static int
+cmsg_getprop_rdnss(struct ctrl_msg_pl *cp)
+{
+ struct ifinfo *ifi;
+ struct rainfo *rai;
+ struct rdnss *rdn;
+ struct rdnss_addr *rda;
+ char *p;
+ size_t len;
+ uint16_t *rdn_cnt;
+ uint16_t *rda_cnt;
+
+ syslog(LOG_DEBUG, "<%s> enter", __func__);
+
+ len = 0;
+ TAILQ_FOREACH(ifi, &ifilist, ifi_next) {
+ if (strcmp(cp->cp_ifname, ifi->ifi_ifname) == 0)
+ break;
+ }
+ if (ifi == NULL) {
+ syslog(LOG_ERR, "<%s> %s not found", __func__,
+ cp->cp_ifname);
+ return (1);
+ }
+ if (ifi->ifi_rainfo == NULL) {
+ syslog(LOG_ERR, "<%s> %s has no rainfo", __func__,
+ cp->cp_ifname);
+ return (1);
+ }
+ rai = ifi->ifi_rainfo;
+
+ len = sizeof(*rdn_cnt);
+ TAILQ_FOREACH(rdn, &rai->rai_rdnss, rd_next) {
+ len += sizeof(*rdn);
+ len += sizeof(*rda_cnt);
+ TAILQ_FOREACH(rda, &rdn->rd_list, ra_next) {
+ len += sizeof(*rda);
+ }
+ }
+
+ syslog(LOG_DEBUG, "<%s> len = %zu", __func__, len);
+
+ p = malloc(len);
+ if (p == NULL)
+ exit(1);
+ memset(p, 0, len);
+ cp->cp_val = p;
+
+ rdn_cnt = (uint16_t *)p;
+ p += sizeof(*rdn_cnt);
+ TAILQ_FOREACH(rdn, &rai->rai_rdnss, rd_next) {
+ *rdn_cnt += 1;
+ memcpy(p, rdn, sizeof(*rdn));
+ p += sizeof(*rdn);
+
+ rda_cnt = (uint16_t *)p;
+ p += sizeof(*rda_cnt);
+ TAILQ_FOREACH(rda, &rdn->rd_list, ra_next) {
+ *rda_cnt += 1;
+ memcpy(p, rda, sizeof(*rda));
+ p += sizeof(*rda);
+ }
+ }
+ syslog(LOG_DEBUG, "<%s> rdn_cnt = %d", __func__, *rdn_cnt);
+ cp->cp_val_len = p - cp->cp_val;
+
+ return (0);
+}
+
+static int
+cmsg_getprop_dnssl(struct ctrl_msg_pl *cp)
+{
+ struct ifinfo *ifi;
+ struct rainfo *rai;
+ struct dnssl *dns;
+ struct dnssl_addr *dna;
+ char *p;
+ size_t len;
+ uint16_t *dns_cnt;
+ uint16_t *dna_cnt;
+
+ syslog(LOG_DEBUG, "<%s> enter", __func__);
+
+ len = 0;
+ TAILQ_FOREACH(ifi, &ifilist, ifi_next) {
+ if (strcmp(cp->cp_ifname, ifi->ifi_ifname) == 0)
+ break;
+ }
+ if (ifi == NULL) {
+ syslog(LOG_ERR, "<%s> %s not found", __func__,
+ cp->cp_ifname);
+ return (1);
+ }
+ if (ifi->ifi_rainfo == NULL) {
+ syslog(LOG_ERR, "<%s> %s has no rainfo", __func__,
+ cp->cp_ifname);
+ return (1);
+ }
+ rai = ifi->ifi_rainfo;
+
+ len = sizeof(*dns_cnt);
+ TAILQ_FOREACH(dns, &rai->rai_dnssl, dn_next) {
+ len += sizeof(*dns);
+ len += sizeof(*dna_cnt);
+ TAILQ_FOREACH(dna, &dns->dn_list, da_next) {
+ len += sizeof(*dna);
+ }
+ }
+
+ syslog(LOG_DEBUG, "<%s> len = %zu", __func__, len);
+
+ p = malloc(len);
+ if (p == NULL)
+ exit(1);
+ memset(p, 0, len);
+ cp->cp_val = p;
+
+ dns_cnt = (uint16_t *)cp->cp_val;
+ p += sizeof(*dns_cnt);
+ TAILQ_FOREACH(dns, &rai->rai_dnssl, dn_next) {
+ (*dns_cnt)++;
+ memcpy(p, dns, sizeof(*dns));
+ p += sizeof(*dns);
+
+ dna_cnt = (uint16_t *)p;
+ p += sizeof(*dna_cnt);
+ TAILQ_FOREACH(dna, &dns->dn_list, da_next) {
+ (*dna_cnt)++;
+ memcpy(p, dna, sizeof(*dna));
+ p += sizeof(*dna);
+ }
+ }
+ cp->cp_val_len = p - cp->cp_val;
+
+ return (0);
+}
+
+int
+cmsg_getprop(struct ctrl_msg_pl *cp)
+{
+ size_t i;
+
+ syslog(LOG_DEBUG, "<%s> enter", __func__);
+
+ if (cp == NULL)
+ return (1);
+
+ for (i = 0;
+ i < sizeof(getprop_dtable) / sizeof(getprop_dtable[0]);
+ i++) {
+ if (strcmp(cp->cp_key, getprop_dtable[i].dt_comm) == 0)
+ return (getprop_dtable[i].dt_act(cp));
+ }
+ return (1);
+}
+
+int
+cmsg_setprop(struct ctrl_msg_pl *cp)
+{
+ syslog(LOG_DEBUG, "<%s> enter", __func__);
+
+ if (cp == NULL || cp->cp_key == NULL)
+ return (1);
+
+ if (strncmp(cp->cp_key, "reload", sizeof("reload")) == 0)
+ cmsg_setprop_reload(cp);
+ else if (strncmp(cp->cp_key, "shutdown", sizeof("shutdown")) == 0)
+ set_do_shutdown(0);
+ else if (strncmp(cp->cp_key, "enable", sizeof("enable")) == 0)
+ cmsg_setprop_enable(cp);
+ else if (strncmp(cp->cp_key, "disable", sizeof("disable")) == 0)
+ cmsg_setprop_disable(cp);
+ else if (strncmp(cp->cp_key, "echo", 8) == 0)
+ ; /* do nothing */
+ else
+ return (1);
+
+ return (0);
+}
+
+static int
+cmsg_setprop_reload(struct ctrl_msg_pl *cp)
+{
+
+ syslog(LOG_DEBUG, "<%s> enter", __func__);
+
+ set_do_reload_ifname(cp->cp_ifname);
+ set_do_reload(1);
+
+ return (0);
+}
+
+static int
+cmsg_setprop_enable(struct ctrl_msg_pl *cp)
+{
+ struct ifinfo *ifi;
+
+ syslog(LOG_DEBUG, "<%s> enter", __func__);
+
+ TAILQ_FOREACH(ifi, &ifilist, ifi_next) {
+ if (strcmp(cp->cp_ifname, ifi->ifi_ifname) == 0)
+ break;
+ }
+ if (ifi == NULL) {
+ syslog(LOG_ERR, "<%s> %s not found", __func__,
+ cp->cp_ifname);
+ return (1);
+ }
+
+ ifi->ifi_persist = 1;
+ set_do_reload_ifname(ifi->ifi_ifname);
+ set_do_reload(0);
+
+ return (0);
+}
+
+static int
+cmsg_setprop_disable(struct ctrl_msg_pl *cp)
+{
+ struct ifinfo *ifi;
+
+ syslog(LOG_DEBUG, "<%s> enter", __func__);
+
+ TAILQ_FOREACH(ifi, &ifilist, ifi_next) {
+ if (strcmp(cp->cp_ifname, ifi->ifi_ifname) == 0)
+ break;
+ }
+ if (ifi == NULL) {
+ syslog(LOG_ERR, "<%s> %s not found", __func__,
+ cp->cp_ifname);
+ return (1);
+ }
+
+ ifi->ifi_persist = 0;
+
+ return (0);
+}
+
+int
+cmsg_handler_server(int fd)
+{
+ int state;
+ char *msg;
+ struct ctrl_msg_hdr *cm;
+ struct ctrl_msg_pl cp;
+ char buf[CM_MSG_MAXLEN];
+ char pbuf[CM_MSG_MAXLEN];
+ int error;
+
+ syslog(LOG_DEBUG, "<%s> enter", __func__);
+
+ memset(buf, 0, sizeof(buf));
+ memset(pbuf, 0, sizeof(pbuf));
+ cm = (struct ctrl_msg_hdr *)buf;
+ msg = (char *)buf + sizeof(*cm);
+
+ state = CM_STATE_INIT;
+ while (state != CM_STATE_EOM) {
+ syslog(LOG_DEBUG, "<%s> state = %d", __func__, state);
+
+ switch (state) {
+ case CM_STATE_INIT:
+ state = CM_STATE_MSG_RECV;
+ break;
+ case CM_STATE_MSG_DISPATCH:
+ cm->cm_version = CM_VERSION;
+ error = cmsg_send(fd, buf);
+ if (error)
+ syslog(LOG_WARNING,
+ "<%s> cmsg_send()", __func__);
+ state = CM_STATE_EOM;
+ break;
+ case CM_STATE_ACK_WAIT:
+ error = cmsg_recv(fd, buf);
+ if (error) {
+ syslog(LOG_ERR,
+ "<%s> cmsg_recv()", __func__);
+ close(fd);
+ return (-1);
+ }
+
+ switch (cm->cm_type) {
+ case CM_TYPE_ACK:
+ break;
+ case CM_TYPE_ERR:
+ syslog(LOG_DEBUG,
+ "<%s> CM_TYPE_ERR", __func__);
+ close(fd);
+ return (-1);
+ default:
+ syslog(LOG_DEBUG,
+ "<%s> unknown status", __func__);
+ close(fd);
+ return (-1);
+ }
+ state = CM_STATE_EOM;
+ break;
+ case CM_STATE_MSG_RECV:
+ error = cmsg_recv(fd, buf);
+
+ if (error) {
+ syslog(LOG_ERR,
+ "<%s> cmsg_recv()", __func__);
+ close(fd);
+ return (-1);
+ }
+ memset(&cp, 0, sizeof(cp));
+
+ syslog(LOG_DEBUG,
+ "<%s> cm->cm_type = %d", __func__, cm->cm_type);
+ syslog(LOG_DEBUG,
+ "<%s> cm->cm_len = %zu", __func__, cm->cm_len);
+
+ switch (cm->cm_type) {
+ case CM_TYPE_EOM:
+ state = CM_STATE_EOM;
+ case CM_TYPE_NUL:
+ cm->cm_type = CM_TYPE_ACK;
+ cm->cm_len = sizeof(*cm);
+ break;
+ case CM_TYPE_REQ_GET_PROP:
+ cmsg_bin2pl(msg, &cp);
+ error = cmsg_getprop(&cp);
+ if (error) {
+ cm->cm_type = CM_TYPE_ERR;
+ cm->cm_len = sizeof(*cm);
+ } else {
+ cm->cm_type = CM_TYPE_ACK;
+ cm->cm_len = sizeof(*cm);
+ cm->cm_len += cmsg_pl2bin(msg, &cp);
+ }
+ if (cp.cp_val != NULL)
+ free(cp.cp_val);
+ break;
+ case CM_TYPE_REQ_SET_PROP:
+ cmsg_bin2pl(msg, &cp);
+ error = cmsg_setprop(&cp);
+ if (error) {
+ cm->cm_type = CM_TYPE_ERR;
+ cm->cm_len = sizeof(*cm);
+ } else {
+ cm->cm_type = CM_TYPE_ACK;
+ cm->cm_len = sizeof(*cm);
+ }
+ break;
+ default:
+ cm->cm_type = CM_TYPE_ERR;
+ cm->cm_len = sizeof(*cm);
+ }
+
+ switch (cm->cm_type) {
+ case CM_TYPE_ERR:
+ case CM_TYPE_ACK:
+ state = CM_STATE_MSG_DISPATCH;
+ break;
+ }
+ }
+ }
+ syslog(LOG_DEBUG, "<%s> leave", __func__);
+
+ return (0);
+}
diff --git a/usr.sbin/rtadvd/control_server.h b/usr.sbin/rtadvd/control_server.h
new file mode 100644
index 0000000..2aab0cd
--- /dev/null
+++ b/usr.sbin/rtadvd/control_server.h
@@ -0,0 +1,42 @@
+/*-
+ * Copyright (C) 2011 Hiroki Sato <hrs@FreeBSD.org>
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
+ * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+ * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * $FreeBSD$
+ *
+ */
+
+int cmsg_getprop(struct ctrl_msg_pl *);
+int cmsg_setprop(struct ctrl_msg_pl *);
+
+int cmsg_handler_server(int);
+
+void set_do_reload(int);
+void set_do_reload_ifname(char *);
+void set_do_shutdown(int);
+void reset_do_reload(void);
+void reset_do_shutdown(void);
+int is_do_reload(void);
+char *reload_ifname(void);
+int is_do_shutdown(void);
diff --git a/usr.sbin/rtadvd/dump.c b/usr.sbin/rtadvd/dump.c
deleted file mode 100644
index fac3fb2..0000000
--- a/usr.sbin/rtadvd/dump.c
+++ /dev/null
@@ -1,321 +0,0 @@
-/* $FreeBSD$ */
-/* $KAME: dump.c,v 1.32 2003/05/19 09:46:50 keiichi Exp $ */
-
-/*
- * Copyright (C) 2000 WIDE Project.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the project nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-#include <sys/types.h>
-#include <sys/socket.h>
-#include <sys/queue.h>
-
-#include <net/if.h>
-#include <net/if_var.h>
-#include <net/if_dl.h>
-
-#include <netinet/in.h>
-
-/* XXX: the following two are non-standard include files */
-#include <netinet6/in6_var.h>
-#include <netinet6/nd6.h>
-
-#include <arpa/inet.h>
-
-#include <netdb.h>
-#include <time.h>
-#include <stdio.h>
-#include <stdarg.h>
-#include <syslog.h>
-#include <string.h>
-#include <errno.h>
-
-#include "rtadvd.h"
-#include "timer.h"
-#include "if.h"
-#include "dump.h"
-
-static FILE *fp;
-
-extern struct rainfo *ralist;
-
-static char *ether_str(struct sockaddr_dl *);
-static void if_dump(void);
-static size_t dname_labeldec(char *, size_t, const char *);
-
-static const char *rtpref_str[] = {
- "medium", /* 00 */
- "high", /* 01 */
- "rsv", /* 10 */
- "low" /* 11 */
-};
-
-static char *
-ether_str(struct sockaddr_dl *sdl)
-{
- static char hbuf[32];
- u_char *cp;
-
- if (sdl->sdl_alen && sdl->sdl_alen > 5) {
- cp = (u_char *)LLADDR(sdl);
- snprintf(hbuf, sizeof(hbuf), "%x:%x:%x:%x:%x:%x",
- cp[0], cp[1], cp[2], cp[3], cp[4], cp[5]);
- } else
- snprintf(hbuf, sizeof(hbuf), "NONE");
-
- return (hbuf);
-}
-
-static void
-if_dump(void)
-{
- struct rainfo *rai;
- struct prefix *pfx;
-#ifdef ROUTEINFO
- struct rtinfo *rti;
-#endif
- struct rdnss *rdn;
- struct dnssl *dns;
- char prefixbuf[INET6_ADDRSTRLEN];
- struct timeval now;
-
- gettimeofday(&now, NULL); /* XXX: unused in most cases */
- TAILQ_FOREACH(rai, &railist, rai_next) {
- fprintf(fp, "%s:\n", rai->rai_ifname);
-
- fprintf(fp, " Status: %s\n",
- (iflist[rai->rai_ifindex]->ifm_flags & IFF_UP) ? "UP" :
- "DOWN");
-
- /* control information */
- if (rai->rai_lastsent.tv_sec) {
- /* note that ctime() appends CR by itself */
- fprintf(fp, " Last RA sent: %s",
- ctime((time_t *)&rai->rai_lastsent.tv_sec));
- }
- if (rai->rai_timer)
- fprintf(fp, " Next RA will be sent: %s",
- ctime((time_t *)&rai->rai_timer->rat_tm.tv_sec));
- else
- fprintf(fp, " RA timer is stopped");
- fprintf(fp, " waits: %d, initcount: %d\n",
- rai->rai_waiting, rai->rai_initcounter);
-
- /* statistics */
- fprintf(fp, " statistics: RA(out/in/inconsistent): "
- "%llu/%llu/%llu, ",
- (unsigned long long)rai->rai_raoutput,
- (unsigned long long)rai->rai_rainput,
- (unsigned long long)rai->rai_rainconsistent);
- fprintf(fp, "RS(input): %llu\n",
- (unsigned long long)rai->rai_rsinput);
-
- /* interface information */
- if (rai->rai_advlinkopt)
- fprintf(fp, " Link-layer address: %s\n",
- ether_str(rai->rai_sdl));
- fprintf(fp, " MTU: %d\n", rai->rai_phymtu);
-
- /* Router configuration variables */
- fprintf(fp, " DefaultLifetime: %d, MaxAdvInterval: %d, "
- "MinAdvInterval: %d\n", rai->rai_lifetime,
- rai->rai_maxinterval, rai->rai_mininterval);
- fprintf(fp, " Flags: ");
- if (rai->rai_managedflg || rai->rai_otherflg) {
- fprintf(fp, "%s", rai->rai_managedflg ? "M" : "");
- fprintf(fp, "%s", rai->rai_otherflg ? "O" : "");
- } else
- fprintf(fp, "<none>");
- fprintf(fp, ", ");
- fprintf(fp, "Preference: %s, ",
- rtpref_str[(rai->rai_rtpref >> 3) & 0xff]);
- fprintf(fp, "MTU: %d\n", rai->rai_linkmtu);
- fprintf(fp, " ReachableTime: %d, RetransTimer: %d, "
- "CurHopLimit: %d\n", rai->rai_reachabletime,
- rai->rai_retranstimer, rai->rai_hoplimit);
- if (rai->rai_clockskew)
- fprintf(fp, " Clock skew: %ldsec\n",
- rai->rai_clockskew);
- TAILQ_FOREACH(pfx, &rai->rai_prefix, pfx_next) {
- if (pfx == TAILQ_FIRST(&rai->rai_prefix))
- fprintf(fp, " Prefixes:\n");
- fprintf(fp, " %s/%d(",
- inet_ntop(AF_INET6, &pfx->pfx_prefix, prefixbuf,
- sizeof(prefixbuf)), pfx->pfx_prefixlen);
- switch (pfx->pfx_origin) {
- case PREFIX_FROM_KERNEL:
- fprintf(fp, "KERNEL, ");
- break;
- case PREFIX_FROM_CONFIG:
- fprintf(fp, "CONFIG, ");
- break;
- case PREFIX_FROM_DYNAMIC:
- fprintf(fp, "DYNAMIC, ");
- break;
- }
- if (pfx->pfx_validlifetime == ND6_INFINITE_LIFETIME)
- fprintf(fp, "vltime: infinity");
- else
- fprintf(fp, "vltime: %ld",
- (long)pfx->pfx_validlifetime);
- if (pfx->pfx_vltimeexpire != 0)
- fprintf(fp, "(decr,expire %ld), ",
- (long)pfx->pfx_vltimeexpire > now.tv_sec ?
- (long)pfx->pfx_vltimeexpire - now.tv_sec :
- 0);
- else
- fprintf(fp, ", ");
- if (pfx->pfx_preflifetime == ND6_INFINITE_LIFETIME)
- fprintf(fp, "pltime: infinity");
- else
- fprintf(fp, "pltime: %ld",
- (long)pfx->pfx_preflifetime);
- if (pfx->pfx_pltimeexpire != 0)
- fprintf(fp, "(decr,expire %ld), ",
- (long)pfx->pfx_pltimeexpire > now.tv_sec ?
- (long)pfx->pfx_pltimeexpire - now.tv_sec :
- 0);
- else
- fprintf(fp, ", ");
- fprintf(fp, "flags: ");
- if (pfx->pfx_onlinkflg || pfx->pfx_autoconfflg) {
- fprintf(fp, "%s",
- pfx->pfx_onlinkflg ? "L" : "");
- fprintf(fp, "%s",
- pfx->pfx_autoconfflg ? "A" : "");
- } else
- fprintf(fp, "<none>");
- if (pfx->pfx_timer) {
- struct timeval *rest;
-
- rest = rtadvd_timer_rest(pfx->pfx_timer);
- if (rest) { /* XXX: what if not? */
- fprintf(fp, ", expire in: %ld",
- (long)rest->tv_sec);
- }
- }
- fprintf(fp, ")\n");
- }
-#ifdef ROUTEINFO
- TAILQ_FOREACH(rti, &rai->rai_route, rti_next) {
- if (rti == TAILQ_FIRST(&rai->rai_route))
- fprintf(fp, " Route Information:\n");
- fprintf(fp, " %s/%d (",
- inet_ntop(AF_INET6, &rti->rti_prefix,
- prefixbuf, sizeof(prefixbuf)),
- rti->rti_prefixlen);
- fprintf(fp, "preference: %s, ",
- rtpref_str[0xff & (rti->rti_rtpref >> 3)]);
- if (rti->rti_ltime == ND6_INFINITE_LIFETIME)
- fprintf(fp, "lifetime: infinity");
- else
- fprintf(fp, "lifetime: %ld",
- (long)rti->rti_ltime);
- fprintf(fp, ")\n");
- }
-#endif
- TAILQ_FOREACH(rdn, &rai->rai_rdnss, rd_next) {
- struct rdnss_addr *rdna;
-
- if (rdn == TAILQ_FIRST(&rai->rai_rdnss))
- fprintf(fp, " Recursive DNS servers:\n"
- " Lifetime\tServers\n");
-
- fprintf(fp, " %8u\t", rdn->rd_ltime);
- TAILQ_FOREACH(rdna, &rdn->rd_list, ra_next) {
- inet_ntop(AF_INET6, &rdna->ra_dns,
- prefixbuf, sizeof(prefixbuf));
-
- if (rdna != TAILQ_FIRST(&rdn->rd_list))
- fprintf(fp, " \t");
- fprintf(fp, "%s\n", prefixbuf);
- }
- fprintf(fp, "\n");
- }
-
- TAILQ_FOREACH(dns, &rai->rai_dnssl, dn_next) {
- struct dnssl_addr *dnsa;
- char buf[NI_MAXHOST];
-
- if (dns == TAILQ_FIRST(&rai->rai_dnssl))
- fprintf(fp, " DNS search list:\n"
- " Lifetime\tDomains\n");
-
- fprintf(fp, " %8u\t", dns->dn_ltime);
- TAILQ_FOREACH(dnsa, &dns->dn_list, da_next) {
- dname_labeldec(buf, sizeof(buf), dnsa->da_dom);
- if (dnsa != TAILQ_FIRST(&dns->dn_list))
- fprintf(fp, " \t");
- fprintf(fp, "%s(%d)\n", buf, dnsa->da_len);
- }
- fprintf(fp, "\n");
- }
- }
-}
-
-void
-rtadvd_dump_file(const char *dumpfile)
-{
- syslog(LOG_DEBUG, "<%s> dump current status to %s", __func__,
- dumpfile);
-
- if ((fp = fopen(dumpfile, "w")) == NULL) {
- syslog(LOG_WARNING, "<%s> open a dump file(%s)",
- __func__, dumpfile);
- return;
- }
-
- if_dump();
-
- fclose(fp);
-}
-
-/* Decode domain name label encoding in RFC 1035 Section 3.1 */
-static size_t
-dname_labeldec(char *dst, size_t dlen, const char *src)
-{
- size_t len;
- const char *src_origin;
- const char *src_last;
- const char *dst_origin;
-
- src_origin = src;
- src_last = strchr(src, '\0');
- dst_origin = dst;
- memset(dst, '\0', dlen);
- while (src && (len = (uint8_t)(*src++) & 0x3f) &&
- (src + len) <= src_last) {
- if (dst != dst_origin)
- *dst++ = '.';
- syslog(LOG_DEBUG, "<%s> labellen = %zd", __func__, len);
- memcpy(dst, src, len);
- src += len;
- dst += len;
- }
- *dst = '\0';
-
- return (src - src_origin);
-}
diff --git a/usr.sbin/rtadvd/if.c b/usr.sbin/rtadvd/if.c
index 302c334..b857356 100644
--- a/usr.sbin/rtadvd/if.c
+++ b/usr.sbin/rtadvd/if.c
@@ -3,6 +3,7 @@
/*
* Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project.
+ * Copyright (C) 2011 Hiroki Sato <hrs@FreeBSD.org>
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
@@ -35,19 +36,24 @@
#include <sys/sysctl.h>
#include <sys/ioctl.h>
#include <net/if.h>
+#include <net/if_dl.h>
#include <net/if_types.h>
+#include <net/if_var.h>
#include <net/ethernet.h>
-#include <ifaddrs.h>
#include <net/route.h>
-#include <net/if_dl.h>
#include <netinet/in.h>
+#include <netinet/in_var.h>
+#include <netinet/ip6.h>
#include <netinet/icmp6.h>
+#include <netinet6/nd6.h>
#include <unistd.h>
#include <errno.h>
#include <netdb.h>
#include <stdlib.h>
#include <string.h>
#include <syslog.h>
+
+#include "pathnames.h"
#include "rtadvd.h"
#include "if.h"
@@ -59,14 +65,34 @@
((ap)->sa_len ? ROUNDUP((ap)->sa_len, sizeof(u_long)) : \
sizeof(u_long)))
-struct if_msghdr **iflist;
-int iflist_init_ok;
-size_t ifblock_size;
-char *ifblock;
+struct sockaddr_in6 sin6_linklocal_allnodes = {
+ .sin6_len = sizeof(sin6_linklocal_allnodes),
+ .sin6_family = AF_INET6,
+ .sin6_addr = IN6ADDR_LINKLOCAL_ALLNODES_INIT,
+};
+
+struct sockaddr_in6 sin6_linklocal_allrouters = {
+ .sin6_len = sizeof(sin6_linklocal_allrouters),
+ .sin6_family = AF_INET6,
+ .sin6_addr = IN6ADDR_LINKLOCAL_ALLROUTERS_INIT,
+};
+
+struct sockaddr_in6 sin6_sitelocal_allrouters = {
+ .sin6_len = sizeof(sin6_sitelocal_allrouters),
+ .sin6_family = AF_INET6,
+ .sin6_addr = IN6ADDR_SITELOCAL_ALLROUTERS_INIT,
+};
+
+struct sockinfo sock = { .si_fd = -1, .si_name = NULL };
+struct sockinfo rtsock = { .si_fd = -1, .si_name = NULL };
+struct sockinfo ctrlsock = { .si_fd = -1, .si_name = _PATH_CTRL_SOCK };
+
+char *mcastif;
-static void get_iflist(char **buf, size_t *size);
-static void parse_iflist(struct if_msghdr ***ifmlist_p,
- char *buf, size_t bufsize);
+static void get_rtaddrs(int, struct sockaddr *,
+ struct sockaddr **);
+static struct if_msghdr *get_next_msghdr(struct if_msghdr *,
+ struct if_msghdr *);
static void
get_rtaddrs(int addrs, struct sockaddr *sa, struct sockaddr **rti_info)
@@ -83,127 +109,6 @@ get_rtaddrs(int addrs, struct sockaddr *sa, struct sockaddr **rti_info)
}
}
-struct sockaddr_dl *
-if_nametosdl(char *name)
-{
- int mib[6] = {CTL_NET, AF_ROUTE, 0, 0, NET_RT_IFLIST, 0};
- char *buf, *next, *lim;
- size_t len;
- struct if_msghdr *ifm;
- struct sockaddr *sa, *rti_info[RTAX_MAX];
- struct sockaddr_dl *sdl = NULL, *ret_sdl;
-
- if (sysctl(mib, 6, NULL, &len, NULL, 0) < 0)
- return (NULL);
- if ((buf = malloc(len)) == NULL)
- return (NULL);
- if (sysctl(mib, 6, buf, &len, NULL, 0) < 0) {
- free(buf);
- return (NULL);
- }
-
- lim = buf + len;
- for (next = buf; next < lim; next += ifm->ifm_msglen) {
- ifm = (struct if_msghdr *)next;
- if (ifm->ifm_type == RTM_IFINFO) {
- sa = (struct sockaddr *)(ifm + 1);
- get_rtaddrs(ifm->ifm_addrs, sa, rti_info);
- if ((sa = rti_info[RTAX_IFP]) != NULL) {
- if (sa->sa_family == AF_LINK) {
- sdl = (struct sockaddr_dl *)sa;
- if (strlen(name) != sdl->sdl_nlen)
- continue; /* not same len */
- if (strncmp(&sdl->sdl_data[0],
- name,
- sdl->sdl_nlen) == 0) {
- break;
- }
- }
- }
- }
- }
- if (next == lim) {
- /* search failed */
- free(buf);
- return (NULL);
- }
-
- if ((ret_sdl = malloc(sdl->sdl_len)) == NULL)
- goto end;
- memcpy((caddr_t)ret_sdl, (caddr_t)sdl, sdl->sdl_len);
-
-end:
- free(buf);
- return (ret_sdl);
-}
-
-int
-if_getmtu(char *name)
-{
- struct ifaddrs *ifap, *ifa;
- struct if_data *ifd;
- u_long mtu = 0;
-
- if (getifaddrs(&ifap) < 0)
- return (0);
- for (ifa = ifap; ifa; ifa = ifa->ifa_next) {
- if (strcmp(ifa->ifa_name, name) == 0) {
- ifd = ifa->ifa_data;
- if (ifd)
- mtu = ifd->ifi_mtu;
- break;
- }
- }
- freeifaddrs(ifap);
-
-#ifdef SIOCGIFMTU /* XXX: this ifdef may not be necessary */
- if (mtu == 0) {
- struct ifreq ifr;
- int s;
-
- if ((s = socket(AF_INET6, SOCK_DGRAM, 0)) < 0)
- return (0);
-
- ifr.ifr_addr.sa_family = AF_INET6;
- strncpy(ifr.ifr_name, name,
- sizeof(ifr.ifr_name));
- if (ioctl(s, SIOCGIFMTU, (caddr_t)&ifr) < 0) {
- close(s);
- return (0);
- }
- close(s);
-
- mtu = ifr.ifr_mtu;
- }
-#endif
-
- return (mtu);
-}
-
-/* give interface index and its old flags, then new flags returned */
-int
-if_getflags(int ifindex, int oifflags)
-{
- struct ifreq ifr;
- int s;
-
- if ((s = socket(AF_INET6, SOCK_DGRAM, 0)) < 0) {
- syslog(LOG_ERR, "<%s> socket: %s", __func__,
- strerror(errno));
- return (oifflags & ~IFF_UP);
- }
-
- if_indextoname(ifindex, ifr.ifr_name);
- if (ioctl(s, SIOCGIFFLAGS, (caddr_t)&ifr) < 0) {
- syslog(LOG_ERR, "<%s> ioctl:SIOCGIFFLAGS: failed for %s",
- __func__, ifr.ifr_name);
- close(s);
- return (oifflags & ~IFF_UP);
- }
- close(s);
- return (ifr.ifr_flags);
-}
-
#define ROUNDUP8(a) (1 + (((a) - 1) | 7))
int
lladdropt_length(struct sockaddr_dl *sdl)
@@ -372,47 +277,23 @@ get_rtm_ifindex(char *buf)
}
int
-get_ifm_ifindex(char *buf)
-{
- struct if_msghdr *ifm = (struct if_msghdr *)buf;
-
- return ((int)ifm->ifm_index);
-}
-
-int
-get_ifam_ifindex(char *buf)
-{
- struct ifa_msghdr *ifam = (struct ifa_msghdr *)buf;
-
- return ((int)ifam->ifam_index);
-}
-
-int
-get_ifm_flags(char *buf)
-{
- struct if_msghdr *ifm = (struct if_msghdr *)buf;
-
- return (ifm->ifm_flags);
-}
-
-int
get_prefixlen(char *buf)
{
struct rt_msghdr *rtm = (struct rt_msghdr *)buf;
struct sockaddr *sa, *rti_info[RTAX_MAX];
- u_char *p, *lim;
+ char *p, *lim;
sa = (struct sockaddr *)(rtm + 1);
get_rtaddrs(rtm->rtm_addrs, sa, rti_info);
sa = rti_info[RTAX_NETMASK];
- p = (u_char *)(&SIN6(sa)->sin6_addr);
- lim = (u_char *)sa + sa->sa_len;
+ p = (char *)(&SIN6(sa)->sin6_addr);
+ lim = (char *)sa + sa->sa_len;
return prefixlen(p, lim);
}
int
-prefixlen(u_char *p, u_char *lim)
+prefixlen(unsigned char *p, unsigned char *lim)
{
int masklen;
@@ -452,140 +333,418 @@ prefixlen(u_char *p, u_char *lim)
return (masklen);
}
-int
-rtmsg_type(char *buf)
+struct ifinfo *
+update_persist_ifinfo(struct ifilist_head_t *ifi_head, const char *ifname)
{
- struct rt_msghdr *rtm = (struct rt_msghdr *)buf;
+ struct ifinfo *ifi;
+ int ifindex;
+
+ ifi = NULL;
+ ifindex = if_nametoindex(ifname);
+ TAILQ_FOREACH(ifi, ifi_head, ifi_next) {
+ if (ifindex != 0) {
+ if (ifindex == ifi->ifi_ifindex)
+ break;
+ } else {
+ if (strncmp(ifname, ifi->ifi_ifname,
+ sizeof(ifi->ifi_ifname)) == 0)
+ break;
+ }
+ }
- return (rtm->rtm_type);
-}
+ if (ifi == NULL) {
+ /* A new ifinfo element is needed. */
+ syslog(LOG_DEBUG, "<%s> new entry: %s", __func__,
+ ifname);
+
+ ELM_MALLOC(ifi, exit(1));
+ ifi->ifi_ifindex = 0;
+ strncpy(ifi->ifi_ifname, ifname, sizeof(ifi->ifi_ifname)-1);
+ ifi->ifi_ifname[sizeof(ifi->ifi_ifname)-1] = '\0';
+ ifi->ifi_rainfo = NULL;
+ ifi->ifi_state = IFI_STATE_UNCONFIGURED;
+ TAILQ_INSERT_TAIL(ifi_head, ifi, ifi_next);
+ }
-int
-rtmsg_len(char *buf)
-{
- struct rt_msghdr *rtm = (struct rt_msghdr *)buf;
+ ifi->ifi_persist = 1;
- return (rtm->rtm_msglen);
+ syslog(LOG_DEBUG, "<%s> %s is marked PERSIST", __func__,
+ ifi->ifi_ifname);
+ syslog(LOG_DEBUG, "<%s> %s is state = %d", __func__,
+ ifi->ifi_ifname, ifi->ifi_state);
+ return (ifi);
}
int
-ifmsg_len(char *buf)
+update_ifinfo_nd_flags(struct ifinfo *ifi)
{
- struct if_msghdr *ifm = (struct if_msghdr *)buf;
+ struct in6_ndireq nd;
+ int s;
+ int error;
- return (ifm->ifm_msglen);
+ if ((s = socket(AF_INET6, SOCK_DGRAM, 0)) < 0) {
+ syslog(LOG_ERR,
+ "<%s> socket() failed.", __func__);
+ return (1);
+ }
+ /* ND flags */
+ memset(&nd, 0, sizeof(nd));
+ strncpy(nd.ifname, ifi->ifi_ifname,
+ sizeof(nd.ifname));
+ error = ioctl(s, SIOCGIFINFO_IN6, (caddr_t)&nd);
+ if (error) {
+ close(s);
+ syslog(LOG_ERR,
+ "<%s> ioctl() failed.", __func__);
+ return (1);
+ }
+ ifi->ifi_nd_flags = nd.ndi.flags;
+ close(s);
+
+ return (0);
}
-/*
- * alloc buffer and get if_msghdrs block from kernel,
- * and put them into the buffer
- */
-static void
-get_iflist(char **buf, size_t *size)
+struct ifinfo *
+update_ifinfo(struct ifilist_head_t *ifi_head, int ifindex)
{
- int mib[6];
-
- mib[0] = CTL_NET;
- mib[1] = PF_ROUTE;
- mib[2] = 0;
- mib[3] = AF_INET6;
- mib[4] = NET_RT_IFLIST;
- mib[5] = 0;
-
- if (sysctl(mib, 6, NULL, size, NULL, 0) < 0) {
- syslog(LOG_ERR, "<%s> sysctl: iflist size get failed",
- __func__);
+ struct if_msghdr *ifm;
+ struct ifinfo *ifi = NULL;
+ struct sockaddr *sa;
+ struct sockaddr *rti_info[RTAX_MAX];
+ char *msg;
+ size_t len;
+ char *lim;
+ int mib[] = { CTL_NET, PF_ROUTE, 0, AF_INET6, NET_RT_IFLIST, 0 };
+ int error;
+
+ syslog(LOG_DEBUG, "<%s> enter", __func__);
+
+ if (sysctl(mib, sizeof(mib)/sizeof(mib[0]), NULL, &len, NULL, 0) <
+ 0) {
+ syslog(LOG_ERR,
+ "<%s> sysctl: NET_RT_IFLIST size get failed", __func__);
exit(1);
}
- if ((*buf = malloc(*size)) == NULL) {
+ if ((msg = malloc(len)) == NULL) {
syslog(LOG_ERR, "<%s> malloc failed", __func__);
exit(1);
}
- if (sysctl(mib, 6, *buf, size, NULL, 0) < 0) {
- syslog(LOG_ERR, "<%s> sysctl: iflist get failed",
- __func__);
+ if (sysctl(mib, sizeof(mib)/sizeof(mib[0]), msg, &len, NULL, 0) <
+ 0) {
+ syslog(LOG_ERR,
+ "<%s> sysctl: NET_RT_IFLIST get failed", __func__);
exit(1);
}
- return;
-}
-/*
- * alloc buffer and parse if_msghdrs block passed as arg,
- * and init the buffer as list of pointers ot each of the if_msghdr.
- */
-static void
-parse_iflist(struct if_msghdr ***ifmlist_p, char *buf, size_t bufsize)
-{
- int iflentry_size, malloc_size;
- struct if_msghdr *ifm;
- struct ifa_msghdr *ifam;
- char *lim;
+ lim = msg + len;
+ for (ifm = (struct if_msghdr *)msg;
+ ifm != NULL && ifm < (struct if_msghdr *)lim;
+ ifm = get_next_msghdr(ifm,(struct if_msghdr *)lim)) {
+ int ifi_new;
- /*
- * Estimate least size of an iflist entry, to be obtained from kernel.
- * Should add sizeof(sockaddr) ??
- */
- iflentry_size = sizeof(struct if_msghdr);
- /* roughly estimate max list size of pointers to each if_msghdr */
- malloc_size = (bufsize/iflentry_size) * sizeof(size_t);
- if ((*ifmlist_p = (struct if_msghdr **)malloc(malloc_size)) == NULL) {
- syslog(LOG_ERR, "<%s> malloc failed", __func__);
- exit(1);
- }
+ syslog(LOG_DEBUG, "<%s> ifm = %p, lim = %p, diff = %zu",
+ __func__, ifm, lim, (char *)lim - (char *)ifm);
- lim = buf + bufsize;
- for (ifm = (struct if_msghdr *)buf; ifm < (struct if_msghdr *)lim;) {
+ if (ifm->ifm_version != RTM_VERSION) {
+ syslog(LOG_ERR,
+ "<%s> ifm_vesrion mismatch", __func__);
+ exit(1);
+ }
if (ifm->ifm_msglen == 0) {
- syslog(LOG_WARNING, "<%s> ifm_msglen is 0 "
- "(buf=%p lim=%p ifm=%p)", __func__,
- buf, lim, ifm);
- return;
+ syslog(LOG_WARNING,
+ "<%s> ifm_msglen is 0", __func__);
+ free(msg);
+ return (NULL);
}
+ ifi_new = 0;
if (ifm->ifm_type == RTM_IFINFO) {
- (*ifmlist_p)[ifm->ifm_index] = ifm;
+ struct ifreq ifr;
+ int s;
+ char ifname[IFNAMSIZ];
+
+ syslog(LOG_DEBUG, "<%s> RTM_IFINFO found. "
+ "ifm_index = %d, ifindex = %d",
+ __func__, ifm->ifm_index, ifindex);
+
+ /* when ifindex is specified */
+ if (ifindex != UPDATE_IFINFO_ALL &&
+ ifindex != ifm->ifm_index)
+ continue;
+
+ /* lookup an entry with the same ifindex */
+ TAILQ_FOREACH(ifi, ifi_head, ifi_next) {
+ if (ifm->ifm_index == ifi->ifi_ifindex)
+ break;
+ if_indextoname(ifm->ifm_index, ifname);
+ if (strncmp(ifname, ifi->ifi_ifname,
+ sizeof(ifname)) == 0)
+ break;
+ }
+ if (ifi == NULL) {
+ syslog(LOG_DEBUG,
+ "<%s> new entry for idx=%d",
+ __func__, ifm->ifm_index);
+ ELM_MALLOC(ifi, exit(1));
+ ifi->ifi_rainfo = NULL;
+ ifi->ifi_state = IFI_STATE_UNCONFIGURED;
+ ifi->ifi_persist = 0;
+ ifi_new = 1;
+ }
+ /* ifindex */
+ ifi->ifi_ifindex = ifm->ifm_index;
+
+ /* ifname */
+ if_indextoname(ifm->ifm_index, ifi->ifi_ifname);
+ if (ifi->ifi_ifname == NULL) {
+ syslog(LOG_WARNING,
+ "<%s> ifname not found (idx=%d)",
+ __func__, ifm->ifm_index);
+ if (ifi_new)
+ free(ifi);
+ continue;
+ }
+
+ if ((s = socket(AF_INET6, SOCK_DGRAM, 0)) < 0) {
+ syslog(LOG_ERR,
+ "<%s> socket() failed.", __func__);
+ if (ifi_new)
+ free(ifi);
+ continue;
+ }
+
+ /* MTU */
+ ifi->ifi_phymtu = ifm->ifm_data.ifi_mtu;
+ if (ifi->ifi_phymtu == 0) {
+ memset(&ifr, 0, sizeof(ifr));
+ ifr.ifr_addr.sa_family = AF_INET6;
+ strncpy(ifr.ifr_name, ifi->ifi_ifname,
+ sizeof(ifr.ifr_name));
+ error = ioctl(s, SIOCGIFMTU, (caddr_t)&ifr);
+ if (error) {
+ close(s);
+ syslog(LOG_ERR,
+ "<%s> ioctl() failed.",
+ __func__);
+ if (ifi_new)
+ free(ifi);
+ continue;
+ }
+ ifi->ifi_phymtu = ifr.ifr_mtu;
+ if (ifi->ifi_phymtu == 0) {
+ syslog(LOG_WARNING,
+ "<%s> no interface mtu info"
+ " on %s. %d will be used.",
+ __func__, ifi->ifi_ifname,
+ IPV6_MMTU);
+ ifi->ifi_phymtu = IPV6_MMTU;
+ }
+ }
+ close(s);
+
+ /* ND flags */
+ error = update_ifinfo_nd_flags(ifi);
+ if (error) {
+ if (ifi_new)
+ free(ifi);
+ continue;
+ }
+
+ /* SDL */
+ sa = (struct sockaddr *)(ifm + 1);
+ get_rtaddrs(ifm->ifm_addrs, sa, rti_info);
+ if ((sa = rti_info[RTAX_IFP]) != NULL) {
+ if (sa->sa_family == AF_LINK) {
+ memcpy(&ifi->ifi_sdl,
+ (struct sockaddr_dl *)sa,
+ sizeof(ifi->ifi_sdl));
+ }
+ } else
+ memset(&ifi->ifi_sdl, 0,
+ sizeof(ifi->ifi_sdl));
+
+ /* flags */
+ ifi->ifi_flags = ifm->ifm_flags;
+
+ /* type */
+ ifi->ifi_type = ifm->ifm_type;
} else {
- syslog(LOG_ERR, "out of sync parsing NET_RT_IFLIST\n"
- "expected %d, got %d\n msglen = %d\n"
- "buf:%p, ifm:%p, lim:%p\n",
- RTM_IFINFO, ifm->ifm_type, ifm->ifm_msglen,
- buf, ifm, lim);
- exit (1);
+ syslog(LOG_ERR,
+ "out of sync parsing NET_RT_IFLIST\n"
+ "expected %d, got %d\n msglen = %d\n",
+ RTM_IFINFO, ifm->ifm_type, ifm->ifm_msglen);
+ exit(1);
}
- for (ifam = (struct ifa_msghdr *)
- ((char *)ifm + ifm->ifm_msglen);
- ifam < (struct ifa_msghdr *)lim;
- ifam = (struct ifa_msghdr *)
- ((char *)ifam + ifam->ifam_msglen)) {
- /* just for safety */
- if (!ifam->ifam_msglen) {
- syslog(LOG_WARNING, "<%s> ifa_msglen is 0 "
- "(buf=%p lim=%p ifam=%p)", __func__,
- buf, lim, ifam);
- return;
- }
- if (ifam->ifam_type != RTM_NEWADDR)
- break;
+
+ if (ifi_new) {
+ syslog(LOG_DEBUG,
+ "<%s> adding %s(idx=%d) to ifilist",
+ __func__, ifi->ifi_ifname, ifi->ifi_ifindex);
+ TAILQ_INSERT_TAIL(ifi_head, ifi, ifi_next);
}
- ifm = (struct if_msghdr *)ifam;
}
+ free(msg);
+
+ if (mcastif != NULL) {
+ error = sock_mc_rr_update(&sock, mcastif);
+ if (error)
+ exit(1);
+ }
+
+ return (ifi);
}
-void
-init_iflist(void)
+static struct if_msghdr *
+get_next_msghdr(struct if_msghdr *ifm, struct if_msghdr *lim)
+{
+ struct ifa_msghdr *ifam;
+
+ for (ifam = (struct ifa_msghdr *)((char *)ifm + ifm->ifm_msglen);
+ ifam < (struct ifa_msghdr *)lim;
+ ifam = (struct ifa_msghdr *)((char *)ifam + ifam->ifam_msglen)) {
+ if (!ifam->ifam_msglen) {
+ syslog(LOG_WARNING,
+ "<%s> ifa_msglen is 0", __func__);
+ return (NULL);
+ }
+ if (ifam->ifam_type != RTM_NEWADDR)
+ break;
+ }
+
+ return ((struct if_msghdr *)ifam);
+}
+
+int
+getinet6sysctl(int code)
+{
+ int mib[] = { CTL_NET, PF_INET6, IPPROTO_IPV6, 0 };
+ int value;
+ size_t size;
+
+ mib[3] = code;
+ size = sizeof(value);
+ if (sysctl(mib, sizeof(mib)/sizeof(mib[0]), &value, &size, NULL, 0)
+ < 0) {
+ syslog(LOG_ERR, "<%s>: failed to get ip6 sysctl(%d): %s",
+ __func__, code,
+ strerror(errno));
+ return (-1);
+ }
+ else
+ return (value);
+}
+
+
+int
+sock_mc_join(struct sockinfo *s, int ifindex)
{
+ struct ipv6_mreq mreq;
+ char ifname[IFNAMSIZ];
+
+ syslog(LOG_DEBUG, "<%s> enter", __func__);
+
+ if (ifindex == 0)
+ return (1);
+
+ /*
+ * join all routers multicast address on each advertising
+ * interface.
+ */
+ memset(&mreq, 0, sizeof(mreq));
+ /* XXX */
+ memcpy(&mreq.ipv6mr_multiaddr.s6_addr,
+ &sin6_linklocal_allrouters.sin6_addr,
+ sizeof(mreq.ipv6mr_multiaddr.s6_addr));
+
+ mreq.ipv6mr_interface = ifindex;
+ if (setsockopt(s->si_fd, IPPROTO_IPV6, IPV6_JOIN_GROUP, &mreq,
+ sizeof(mreq)) < 0) {
+ syslog(LOG_ERR,
+ "<%s> IPV6_JOIN_GROUP(link) on %s: %s",
+ __func__, if_indextoname(ifindex, ifname),
+ strerror(errno));
+ return (1);
+ }
syslog(LOG_DEBUG,
- "<%s> generate iflist.", __func__);
+ "<%s> %s: join link-local all-routers MC group",
+ __func__, if_indextoname(ifindex, ifname));
- if (ifblock) {
- free(ifblock);
- ifblock_size = 0;
+ return (0);
+}
+
+int
+sock_mc_leave(struct sockinfo *s, int ifindex)
+{
+ struct ipv6_mreq mreq;
+ char ifname[IFNAMSIZ];
+
+ syslog(LOG_DEBUG, "<%s> enter", __func__);
+
+ if (ifindex == 0)
+ return (1);
+
+ /*
+ * join all routers multicast address on each advertising
+ * interface.
+ */
+
+ memset(&mreq, 0, sizeof(mreq));
+ /* XXX */
+ memcpy(&mreq.ipv6mr_multiaddr.s6_addr,
+ &sin6_linklocal_allrouters.sin6_addr,
+ sizeof(mreq.ipv6mr_multiaddr.s6_addr));
+
+ mreq.ipv6mr_interface = ifindex;
+ if (setsockopt(s->si_fd, IPPROTO_IPV6, IPV6_LEAVE_GROUP, &mreq,
+ sizeof(mreq)) < 0) {
+ syslog(LOG_ERR,
+ "<%s> IPV6_JOIN_LEAVE(link) on %s: %s",
+ __func__, if_indextoname(ifindex, ifname),
+ strerror(errno));
+ return (1);
}
- if (iflist)
- free(iflist);
- /* get iflist block from kernel */
- get_iflist(&ifblock, &ifblock_size);
+ syslog(LOG_DEBUG,
+ "<%s> %s: leave link-local all-routers MC group",
+ __func__, if_indextoname(ifindex, ifname));
+
+ return (0);
+}
+
+int
+sock_mc_rr_update(struct sockinfo *s, char *mif)
+{
+ struct ipv6_mreq mreq;
+
+ syslog(LOG_DEBUG, "<%s> enter", __func__);
+
+ if (mif == NULL)
+ return (1);
+ /*
+ * When attending router renumbering, join all-routers site-local
+ * multicast group.
+ */
+ /* XXX */
+ memcpy(&mreq.ipv6mr_multiaddr.s6_addr,
+ &sin6_sitelocal_allrouters.sin6_addr,
+ sizeof(mreq.ipv6mr_multiaddr.s6_addr));
+ if ((mreq.ipv6mr_interface = if_nametoindex(mif)) == 0) {
+ syslog(LOG_ERR,
+ "<%s> invalid interface: %s",
+ __func__, mif);
+ return (1);
+ }
+
+ if (setsockopt(s->si_fd, IPPROTO_IPV6, IPV6_JOIN_GROUP,
+ &mreq, sizeof(mreq)) < 0) {
+ syslog(LOG_ERR,
+ "<%s> IPV6_JOIN_GROUP(site) on %s: %s",
+ __func__, mif, strerror(errno));
+ return (1);
+ }
+
+ syslog(LOG_DEBUG,
+ "<%s> %s: join site-local all-routers MC group",
+ __func__, mif);
- /* make list of pointers to each if_msghdr */
- parse_iflist(&iflist, ifblock, ifblock_size);
+ return (0);
}
diff --git a/usr.sbin/rtadvd/if.h b/usr.sbin/rtadvd/if.h
index 8728e19..6efdd56 100644
--- a/usr.sbin/rtadvd/if.h
+++ b/usr.sbin/rtadvd/if.h
@@ -30,29 +30,32 @@
* SUCH DAMAGE.
*/
-#define RTADV_TYPE2BITMASK(type) (0x1 << type)
+#define UPDATE_IFINFO_ALL 0
-extern struct if_msghdr **iflist;
-extern size_t ifblock_size;
-extern char *ifblock;
+struct sockinfo {
+ int si_fd;
+ const char *si_name;
+};
+
+extern struct sockinfo sock;
+extern struct sockinfo rtsock;
+extern struct sockinfo ctrlsock;
-struct nd_opt_hdr;
-struct sockaddr_dl *if_nametosdl(char *);
-int if_getmtu(char *);
-int if_getflags(int, int);
int lladdropt_length(struct sockaddr_dl *);
void lladdropt_fill(struct sockaddr_dl *, struct nd_opt_hdr *);
int rtbuf_len(void);
char *get_next_msg(char *, char *, int, size_t *, int);
struct in6_addr *get_addr(char *);
int get_rtm_ifindex(char *);
-int get_ifm_ifindex(char *);
-int get_ifam_ifindex(char *);
-int get_ifm_flags(char *);
int get_prefixlen(char *);
-int prefixlen(u_char *, u_char *);
-int rtmsg_type(char *);
-int ifmsg_type(char *);
-int rtmsg_len(char *);
-int ifmsg_len(char *);
-void init_iflist(void);
+int prefixlen(unsigned char *, unsigned char *);
+
+struct ifinfo *update_ifinfo(struct ifilist_head_t *, int);
+int update_ifinfo_nd_flags(struct ifinfo *);
+struct ifinfo *update_persist_ifinfo(struct ifilist_head_t *,
+ const char *);
+
+int sock_mc_join(struct sockinfo *, int);
+int sock_mc_leave(struct sockinfo *, int);
+int sock_mc_rr_update(struct sockinfo *, char *);
+int getinet6sysctl(int);
diff --git a/usr.sbin/rtadvd/pathnames.h b/usr.sbin/rtadvd/pathnames.h
index 13329da..248ee19 100644
--- a/usr.sbin/rtadvd/pathnames.h
+++ b/usr.sbin/rtadvd/pathnames.h
@@ -2,6 +2,5 @@
/* $FreeBSD$ */
#define _PATH_RTADVDCONF "/etc/rtadvd.conf"
-#define _PATH_RTADVDDUMP "/var/run/rtadvd.dump"
#define _PATH_RTADVDPID "/var/run/rtadvd.pid"
-
+#define _PATH_CTRL_SOCK "/var/run/rtadvd.sock"
diff --git a/usr.sbin/rtadvd/rrenum.c b/usr.sbin/rtadvd/rrenum.c
index 660ed53..3e36311 100644
--- a/usr.sbin/rtadvd/rrenum.c
+++ b/usr.sbin/rtadvd/rrenum.c
@@ -36,6 +36,7 @@
#include <sys/sysctl.h>
#include <net/if.h>
+#include <net/if_dl.h>
#include <net/if_var.h>
#include <net/route.h>
#include <netinet/in.h>
@@ -142,6 +143,7 @@ do_use_prefix(int len, struct rr_pco_match *rpm,
{
struct rr_pco_use *rpu, *rpulim;
struct rainfo *rai;
+ struct ifinfo *ifi;
struct prefix *pfx;
rpu = (struct rr_pco_use *)(rpm + 1);
@@ -207,8 +209,10 @@ do_use_prefix(int len, struct rr_pco_match *rpm,
IN6_ARE_ADDR_EQUAL(&rpm->rpm_prefix, &rpu->rpu_prefix) &&
rpm->rpm_matchlen == rpu->rpu_uselen &&
rpu->rpu_uselen == rpu->rpu_keeplen) {
- if ((rai = if_indextorainfo(ifindex)) == NULL)
+ ifi = if_indextoifinfo(ifindex);
+ if (ifi == NULL || ifi->ifi_rainfo == NULL)
continue; /* non-advertising IF */
+ rai = ifi->ifi_rainfo;
TAILQ_FOREACH(pfx, &rai->rai_prefix, pfx_next) {
struct timeval now;
@@ -250,7 +254,8 @@ do_pco(struct icmp6_router_renum *rr, int len, struct rr_pco_match *rpm)
{
int ifindex = 0;
struct in6_rrenumreq irr;
-
+ struct ifinfo *ifi;
+
if ((rr_pco_check(len, rpm) != 0))
return (1);
@@ -270,12 +275,18 @@ do_pco(struct icmp6_router_renum *rr, int len, struct rr_pco_match *rpm)
irr.irr_matchprefix.sin6_addr = rpm->rpm_prefix;
while (if_indextoname(++ifindex, irr.irr_name)) {
+ ifi = if_indextoifinfo(ifindex);
+ if (ifi == NULL) {
+ syslog(LOG_ERR, "<%s> ifindex not found.",
+ __func__);
+ return (1);
+ }
/*
* if ICMP6_RR_FLAGS_FORCEAPPLY(A flag) is 0 and
* IFF_UP is off, the interface is not applied
*/
if ((rr->rr_flags & ICMP6_RR_FLAGS_FORCEAPPLY) == 0 &&
- (iflist[ifindex]->ifm_flags & IFF_UP) == 0)
+ (ifi->ifi_flags & IFF_UP) == 0)
continue;
/* TODO: interface scope check */
do_use_prefix(len, rpm, &irr, ifindex);
@@ -305,8 +316,7 @@ do_rr(int len, struct icmp6_router_renum *rr)
cp = (char *)(rr + 1);
len -= sizeof(struct icmp6_router_renum);
- /* get iflist block from kernel again, to get up-to-date information */
- init_iflist();
+ update_ifinfo(&ifilist, UPDATE_IFINFO_ALL);
while (cp < lim) {
int rpmlen;
diff --git a/usr.sbin/rtadvd/rtadvd.8 b/usr.sbin/rtadvd/rtadvd.8
index b41f7c06..b2e6670 100644
--- a/usr.sbin/rtadvd/rtadvd.8
+++ b/usr.sbin/rtadvd/rtadvd.8
@@ -29,7 +29,7 @@
.\"
.\" $FreeBSD$
.\"
-.Dd December 22, 2010
+.Dd July 14, 2011
.Dt RTADVD 8
.Os
.Sh NAME
@@ -39,7 +39,6 @@
.Nm
.Op Fl dDfRs
.Op Fl c Ar configfile
-.Op Fl F Ar dumpfile
.Op Fl M Ar ifname
.Op Fl p Ar pidfile
.Ar interface ...
@@ -129,13 +128,6 @@ Even more debugging information is printed.
.It Fl f
Foreground mode (useful when debugging).
Log messages will be dumped to stderr when this option is specified.
-.It Fl F
-Specify an alternative file in which to dump internal states when
-.Nm
-receives signal
-.Dv SIGUSR1 .
-The default is
-.Pa /var/run/rtadvd.dump .
.It Fl M
Specify an interface to join the all-routers site-local multicast group.
By default,
@@ -160,14 +152,6 @@ Do not add or delete prefixes dynamically.
Only statically configured prefixes, if any, will be advertised.
.El
.Pp
-Upon receipt of signal
-.Dv SIGUSR1 ,
-.Nm
-will dump the current internal state into
-.Pa /var/run/rtadvd.dump
-or the file specified with option
-.Fl F .
-.Pp
Use
.Dv SIGHUP
to reload the configuration file
@@ -196,10 +180,6 @@ to all the interfaces
The default configuration file.
.It Pa /var/run/rtadvd.pid
The default process ID file.
-.It Pa /var/run/rtadvd.dump
-The default file in which
-.Nm
-dumps its internal state.
.El
.Sh EXIT STATUS
.Ex -std
diff --git a/usr.sbin/rtadvd/rtadvd.c b/usr.sbin/rtadvd/rtadvd.c
index e9b212c..2d94b06 100644
--- a/usr.sbin/rtadvd/rtadvd.c
+++ b/usr.sbin/rtadvd/rtadvd.c
@@ -3,6 +3,7 @@
/*
* Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project.
+ * Copyright (C) 2011 Hiroki Sato <hrs@FreeBSD.org>
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
@@ -36,12 +37,14 @@
#include <sys/uio.h>
#include <sys/time.h>
#include <sys/queue.h>
+#include <sys/stat.h>
#include <sys/sysctl.h>
#include <net/if.h>
+#include <net/if_types.h>
#include <net/if_media.h>
-#include <net/route.h>
#include <net/if_dl.h>
+#include <net/route.h>
#include <netinet/in.h>
#include <netinet/ip6.h>
#include <netinet6/ip6_var.h>
@@ -58,50 +61,52 @@
#include <stdio.h>
#include <err.h>
#include <errno.h>
+#include <inttypes.h>
#include <libutil.h>
#include <netdb.h>
+#include <signal.h>
#include <string.h>
#include <stdlib.h>
#include <syslog.h>
-#ifdef HAVE_POLL_H
#include <poll.h>
-#endif
+#include "pathnames.h"
#include "rtadvd.h"
+#include "if.h"
#include "rrenum.h"
#include "advcap.h"
+#include "timer_subr.h"
#include "timer.h"
-#include "if.h"
#include "config.h"
-#include "dump.h"
-#include "pathnames.h"
+#include "control.h"
+#include "control_server.h"
+
+#define RTADV_TYPE2BITMASK(type) (0x1 << type)
struct msghdr rcvmhdr;
-static u_char *rcvcmsgbuf;
+static char *rcvcmsgbuf;
static size_t rcvcmsgbuflen;
-static u_char *sndcmsgbuf = NULL;
+static char *sndcmsgbuf = NULL;
static size_t sndcmsgbuflen;
-volatile sig_atomic_t do_dump;
-volatile sig_atomic_t do_die;
-volatile sig_atomic_t do_reload;
struct msghdr sndmhdr;
struct iovec rcviov[2];
struct iovec sndiov[2];
struct sockaddr_in6 rcvfrom;
-static const char *dumpfilename = _PATH_RTADVDDUMP;
static const char *pidfilename = _PATH_RTADVDPID;
const char *conffile = _PATH_RTADVDCONF;
static struct pidfh *pfh;
-static char *mcastif;
-int sock;
-int rtsock = -1;
-int accept_rr = 0;
int dflag = 0, sflag = 0;
-static int ifl_len;
-static char **ifl_names;
+static int wait_shutdown;
+
+#define PFD_RAWSOCK 0
+#define PFD_RTSOCK 1
+#define PFD_CSOCK 2
+#define PFD_MAX 3
struct railist_head_t railist =
TAILQ_HEAD_INITIALIZER(railist);
+struct ifilist_head_t ifilist =
+ TAILQ_HEAD_INITIALIZER(ifilist);
struct nd_optlist {
TAILQ_ENTRY(nd_optlist) nol_next;
@@ -134,7 +139,7 @@ union nd_opt {
#define NDOPT_FLAG_RDNSS (1 << 5)
#define NDOPT_FLAG_DNSSL (1 << 6)
-u_int32_t ndopt_flags[] = {
+uint32_t ndopt_flags[] = {
[ND_OPT_SOURCE_LINKADDR] = NDOPT_FLAG_SRCLINKADDR,
[ND_OPT_TARGET_LINKADDR] = NDOPT_FLAG_TGTLINKADDR,
[ND_OPT_PREFIX_INFORMATION] = NDOPT_FLAG_PREFIXINFO,
@@ -144,30 +149,10 @@ u_int32_t ndopt_flags[] = {
[ND_OPT_DNSSL] = NDOPT_FLAG_DNSSL,
};
-struct sockaddr_in6 sin6_linklocal_allnodes = {
- .sin6_len = sizeof(sin6_linklocal_allnodes),
- .sin6_family = AF_INET6,
- .sin6_addr = IN6ADDR_LINKLOCAL_ALLNODES_INIT,
-};
-
-struct sockaddr_in6 sin6_linklocal_allrouters = {
- .sin6_len = sizeof(sin6_linklocal_allrouters),
- .sin6_family = AF_INET6,
- .sin6_addr = IN6ADDR_LINKLOCAL_ALLROUTERS_INIT,
-};
-
-struct sockaddr_in6 sin6_sitelocal_allrouters = {
- .sin6_len = sizeof(sin6_sitelocal_allrouters),
- .sin6_family = AF_INET6,
- .sin6_addr = IN6ADDR_SITELOCAL_ALLROUTERS_INIT,
-};
-
-static void set_reload(int);
-static void set_die(int);
-static void die(void);
-static void sock_open(void);
-static void rtsock_open(void);
-static void rtadvd_input(void);
+static void rtadvd_shutdown(void);
+static void sock_open(struct sockinfo *);
+static void rtsock_open(struct sockinfo *);
+static void rtadvd_input(struct sockinfo *);
static void rs_input(int, struct nd_router_solicit *,
struct in6_pktinfo *, struct sockaddr_in6 *);
static void ra_input(int, struct nd_router_advert *,
@@ -175,36 +160,31 @@ static void ra_input(int, struct nd_router_advert *,
static int prefix_check(struct nd_opt_prefix_info *, struct rainfo *,
struct sockaddr_in6 *);
static int nd6_options(struct nd_opt_hdr *, int,
- union nd_opt *, u_int32_t);
+ union nd_opt *, uint32_t);
static void free_ndopts(union nd_opt *);
-static void rtmsg_input(void);
-static void rtadvd_set_dump_file(int);
-static void set_short_delay(struct rainfo *);
-static int ifl_lookup(char *, char **, int);
+static void rtmsg_input(struct sockinfo *);
+static void set_short_delay(struct ifinfo *);
static int check_accept_rtadv(int);
-static int getinet6sysctl(int);
int
main(int argc, char *argv[])
{
-#ifdef HAVE_POLL_H
- struct pollfd set[2];
-#else
- fd_set *fdsetp, *selectfdp;
- int fdmasks;
- int maxfd = 0;
-#endif
+ struct pollfd set[PFD_MAX];
struct timeval *timeout;
int i, ch;
int fflag = 0, logopt;
+ int error;
pid_t pid, otherpid;
/* get command line options and arguments */
- while ((ch = getopt(argc, argv, "c:dDfF:M:p:Rs")) != -1) {
+ while ((ch = getopt(argc, argv, "c:C:dDfM:p:Rs")) != -1) {
switch (ch) {
case 'c':
conffile = optarg;
break;
+ case 'C':
+ ctrlsock.si_name = optarg;
+ break;
case 'd':
dflag++;
break;
@@ -229,9 +209,6 @@ main(int argc, char *argv[])
case 'p':
pidfilename = optarg;
break;
- case 'F':
- dumpfilename = optarg;
- break;
}
}
argc -= optind;
@@ -239,7 +216,7 @@ main(int argc, char *argv[])
if (argc == 0) {
fprintf(stderr,
"usage: rtadvd [-dDfRs] [-c conffile] "
- "[-F dumpfile] [-M ifname] "
+ "[-C ctrlsockname] [-M ifname] "
"[-p pidfile] interfaces...\n");
exit(1);
}
@@ -265,16 +242,9 @@ main(int argc, char *argv[])
#ifdef __FreeBSD__
srandomdev();
#else
- srandom((u_long)time(NULL));
+ srandom((unsigned long)time(NULL));
#endif
#endif
- /* get iflist block from kernel */
- init_iflist();
- ifl_names = argv;
- ifl_len = argc;
-
- loadconfig(argv, argc);
-
pfh = pidfile_open(pidfilename, 0600, &otherpid);
if (pfh == NULL) {
if (errno == EEXIST)
@@ -284,70 +254,66 @@ main(int argc, char *argv[])
"<%s> failed to open the pid log file, run anyway.",
__func__);
}
-
if (!fflag)
daemon(1, 0);
- sock_open();
+ sock_open(&sock);
+
+ update_ifinfo(&ifilist, UPDATE_IFINFO_ALL);
+ for (i = 0; i < argc; i++)
+ update_persist_ifinfo(&ifilist, argv[i]);
+
+ csock_open(&ctrlsock, S_IRUSR|S_IWUSR|S_IRGRP|S_IROTH);
+ if (ctrlsock.si_fd == -1) {
+ syslog(LOG_ERR, "<%s> cannot open control socket", __func__);
+ exit(1);
+ }
/* record the current PID */
pid = getpid();
pidfile_write(pfh);
-#ifdef HAVE_POLL_H
- set[0].fd = sock;
- set[0].events = POLLIN;
+ set[PFD_RAWSOCK].fd = sock.si_fd;
+ set[PFD_RAWSOCK].events = POLLIN;
if (sflag == 0) {
- rtsock_open();
- set[1].fd = rtsock;
- set[1].events = POLLIN;
+ rtsock_open(&rtsock);
+ set[PFD_RTSOCK].fd = rtsock.si_fd;
+ set[PFD_RTSOCK].events = POLLIN;
} else
- set[1].fd = -1;
-#else
- maxfd = sock;
- if (sflag == 0) {
- rtsock_open();
- if (rtsock > sock)
- maxfd = rtsock;
- } else
- rtsock = -1;
-
- fdmasks = howmany(maxfd + 1, NFDBITS) * sizeof(fd_mask);
- if ((fdsetp = malloc(fdmasks)) == NULL) {
- err(1, "malloc");
- /*NOTREACHED*/
- }
- if ((selectfdp = malloc(fdmasks)) == NULL) {
- err(1, "malloc");
- /*NOTREACHED*/
+ set[PFD_RTSOCK].fd = -1;
+ set[PFD_CSOCK].fd = ctrlsock.si_fd;
+ set[PFD_CSOCK].events = POLLIN;
+ signal(SIGTERM, set_do_shutdown);
+ signal(SIGINT, set_do_shutdown);
+ signal(SIGHUP, set_do_reload);
+
+ error = csock_listen(&ctrlsock);
+ if (error) {
+ syslog(LOG_ERR, "<%s> listen failed", __func__);
+ exit(1);
}
- memset(fdsetp, 0, fdmasks);
- FD_SET(sock, fdsetp);
- if (rtsock >= 0)
- FD_SET(rtsock, fdsetp);
-#endif
- signal(SIGTERM, set_die);
- signal(SIGUSR1, rtadvd_set_dump_file);
- signal(SIGHUP, set_reload);
+
+ /* load configuration file */
+ set_do_reload(0);
while (1) {
-#ifndef HAVE_POLL_H
- memcpy(selectfdp, fdsetp, fdmasks); /* reinitialize */
-#endif
- if (do_dump) { /* SIGUSR1 */
- do_dump = 0;
- rtadvd_dump_file(dumpfilename);
- }
+ if (is_do_shutdown())
+ rtadvd_shutdown();
- if (do_die) {
- die();
- /*NOTREACHED*/
+ if (is_do_reload()) {
+ loadconfig_ifname(reload_ifname());
+ if (reload_ifname() == NULL)
+ syslog(LOG_INFO,
+ "configuration file reloaded.");
+ else
+ syslog(LOG_INFO,
+ "configuration file for %s reloaded.",
+ reload_ifname());
+ reset_do_reload();
}
- if (do_reload) {
- loadconfig(argv, argc);
- do_reload = 0;
- }
+ /* timeout handler update for active interfaces */
+ rtadvd_update_timeout_handler();
/* timer expiration check and reset the timer */
timeout = rtadvd_check_timer();
@@ -363,14 +329,9 @@ main(int argc, char *argv[])
"<%s> there's no timer. waiting for inputs",
__func__);
}
-#ifdef HAVE_POLL_H
- if ((i = poll(set, 2, timeout ? (timeout->tv_sec * 1000 +
- timeout->tv_usec / 1000) : INFTIM)) < 0)
-#else
- if ((i = select(maxfd + 1, selectfdp, NULL, NULL,
- timeout)) < 0)
-#endif
- {
+ if ((i = poll(set, sizeof(set)/sizeof(set[0]),
+ timeout ? (timeout->tv_sec * 1000 +
+ timeout->tv_usec / 1000) : INFTIM)) < 0) {
/* EINTR would occur upon SIGUSR1 for status dump */
if (errno != EINTR)
syslog(LOG_ERR, "<%s> select: %s",
@@ -379,102 +340,118 @@ main(int argc, char *argv[])
}
if (i == 0) /* timeout */
continue;
-#ifdef HAVE_POLL_H
- if (rtsock != -1 && set[1].revents & POLLIN)
-#else
- if (rtsock != -1 && FD_ISSET(rtsock, selectfdp))
-#endif
- rtmsg_input();
-#ifdef HAVE_POLL_H
- if (set[0].revents & POLLIN)
-#else
- if (FD_ISSET(sock, selectfdp))
-#endif
- rtadvd_input();
- }
- exit(0); /* NOTREACHED */
-}
+ if (rtsock.si_fd != -1 && set[PFD_RTSOCK].revents & POLLIN)
+ rtmsg_input(&rtsock);
-static int
-ifl_lookup(char *ifn, char **names, int len)
-{
- while (len--)
- if (strncmp(names[len], ifn, IFNAMSIZ) == 0)
- return (0);
- return (-1);
-}
+ if (set[PFD_RAWSOCK].revents & POLLIN)
+ rtadvd_input(&sock);
-static void
-rtadvd_set_dump_file(int sig __unused)
-{
-
- do_dump = 1;
-}
-
-static void
-set_reload(int sig __unused)
-{
+ if (set[PFD_CSOCK].revents & POLLIN) {
+ int fd;
- do_reload = 1;
-}
-
-static void
-set_die(int sig __unused)
-{
-
- do_die = 1;
+ fd = csock_accept(&ctrlsock);
+ if (fd == -1)
+ syslog(LOG_ERR, "<%s> accept", __func__);
+ else {
+ cmsg_handler_server(fd);
+ close(fd);
+ }
+ }
+ }
+ exit(0); /* NOTREACHED */
}
static void
-die(void)
+rtadvd_shutdown(void)
{
+ struct ifinfo *ifi;
struct rainfo *rai;
struct rdnss *rdn;
struct dnssl *dns;
- int i;
- const int retrans = MAX_FINAL_RTR_ADVERTISEMENTS;
+
+ if (wait_shutdown) {
+ syslog(LOG_INFO,
+ "waiting expiration of the all RA timers\n");
+
+ TAILQ_FOREACH(ifi, &ifilist, ifi_next) {
+ if (ifi->ifi_ra_timer != NULL)
+ break;
+ }
+ if (ifi == NULL) {
+ syslog(LOG_INFO, "gracefully terminated.\n");
+ exit(0);
+ }
+
+ sleep(1);
+ return;
+ }
syslog(LOG_DEBUG, "<%s> cease to be an advertising router\n",
__func__);
+ wait_shutdown = 1;
+
TAILQ_FOREACH(rai, &railist, rai_next) {
rai->rai_lifetime = 0;
TAILQ_FOREACH(rdn, &rai->rai_rdnss, rd_next)
rdn->rd_ltime = 0;
TAILQ_FOREACH(dns, &rai->rai_dnssl, dn_next)
dns->dn_ltime = 0;
- make_packet(rai);
}
- for (i = 0; i < retrans; i++) {
- TAILQ_FOREACH(rai, &railist, rai_next)
- ra_output(rai);
- sleep(MIN_DELAY_BETWEEN_RAS);
+ TAILQ_FOREACH(ifi, &ifilist, ifi_next) {
+ if (!ifi->ifi_persist)
+ continue;
+ if (ifi->ifi_state == IFI_STATE_UNCONFIGURED)
+ continue;
+ if (ifi->ifi_ra_timer == NULL)
+ continue;
+
+ ifi->ifi_state = IFI_STATE_TRANSITIVE;
+
+ /* Mark as the shut-down state. */
+ ifi->ifi_rainfo_trans = ifi->ifi_rainfo;
+ ifi->ifi_rainfo = NULL;
+
+ ifi->ifi_burstcount = MAX_FINAL_RTR_ADVERTISEMENTS;
+ ifi->ifi_burstinterval = MIN_DELAY_BETWEEN_RAS;
+
+ ra_timer_update(ifi, &ifi->ifi_ra_timer->rat_tm);
+ rtadvd_set_timer(&ifi->ifi_ra_timer->rat_tm,
+ ifi->ifi_ra_timer);
}
- pidfile_remove(pfh);
+ syslog(LOG_INFO,
+ "<%s> final RA transmission started.\n", __func__);
- exit(0);
+ pidfile_remove(pfh);
+ csock_close(&ctrlsock);
}
static void
-rtmsg_input(void)
+rtmsg_input(struct sockinfo *s)
{
int n, type, ifindex = 0, plen;
size_t len;
char msg[2048], *next, *lim;
- u_char ifname[IFNAMSIZ];
+ char ifname[IFNAMSIZ];
struct if_announcemsghdr *ifan;
+ struct rt_msghdr *rtm;
struct prefix *pfx;
struct rainfo *rai;
struct in6_addr *addr;
+ struct ifinfo *ifi;
char addrbuf[INET6_ADDRSTRLEN];
int prefixchange = 0;
- int error;
- n = read(rtsock, msg, sizeof(msg));
+ if (s == NULL) {
+ syslog(LOG_ERR, "<%s> internal error", __func__);
+ exit(1);
+ }
+ n = read(s->si_fd, msg, sizeof(msg));
+ rtm = (struct rt_msghdr *)msg;
syslog(LOG_DEBUG, "<%s> received a routing message "
- "(type = %d, len = %d)", __func__, rtmsg_type(msg), n);
+ "(type = %d, len = %d)", __func__, rtm->rtm_type, n);
- if (n > rtmsg_len(msg)) {
+ if (n > rtm->rtm_msglen) {
/*
* This usually won't happen for messages received on
* a routing socket.
@@ -483,10 +460,10 @@ rtmsg_input(void)
"<%s> received data length is larger than "
"1st routing message len. multiple messages? "
"read %d bytes, but 1st msg len = %d",
- __func__, n, rtmsg_len(msg));
+ __func__, n, rtm->rtm_msglen);
#if 0
/* adjust length */
- n = rtmsg_len(msg);
+ n = rtm->rtm_msglen;
#endif
}
@@ -503,7 +480,7 @@ rtmsg_input(void)
RTADV_TYPE2BITMASK(RTM_IFANNOUNCE));
if (len == 0)
break;
- type = rtmsg_type(next);
+ type = ((struct rt_msghdr *)next)->rtm_type;
switch (type) {
case RTM_ADD:
case RTM_DELETE:
@@ -511,10 +488,10 @@ rtmsg_input(void)
break;
case RTM_NEWADDR:
case RTM_DELADDR:
- ifindex = get_ifam_ifindex(next);
+ ifindex = (int)((struct ifa_msghdr *)next)->ifam_index;
break;
case RTM_IFINFO:
- ifindex = get_ifm_ifindex(next);
+ ifindex = (int)((struct if_msghdr *)next)->ifm_index;
break;
case RTM_IFANNOUNCE:
ifan = (struct if_announcemsghdr *)next;
@@ -531,32 +508,29 @@ rtmsg_input(void)
syslog(LOG_INFO, "<%s>: if_announcemsg (idx=%d:%d)",
__func__, ifan->ifan_index, ifan->ifan_what);
- init_iflist();
- error = ifl_lookup(ifan->ifan_name,
- ifl_names, ifl_len);
- if (error) {
- syslog(LOG_INFO, "<%s>: not a target "
- "interface (idx=%d)", __func__,
- ifan->ifan_index);
- continue;
- }
-
switch (ifan->ifan_what) {
case IFAN_ARRIVAL:
- error = getconfig(ifan->ifan_index);
- if (error)
- syslog(LOG_ERR,
- "<%s>: getconfig failed (idx=%d)"
- " Ignored.", __func__,
- ifan->ifan_index);
+ syslog(LOG_INFO,
+ "<%s>: interface added (idx=%d)",
+ __func__, ifan->ifan_index);
+ update_ifinfo(&ifilist, ifan->ifan_index);
+ loadconfig_index(ifan->ifan_index);
break;
case IFAN_DEPARTURE:
- error = rmconfig(ifan->ifan_index);
- if (error)
- syslog(LOG_ERR,
- "<%s>: rmconfig failed (idx=%d)"
- " Ignored.", __func__,
- ifan->ifan_index);
+ syslog(LOG_INFO,
+ "<%s>: interface removed (idx=%d)",
+ __func__, ifan->ifan_index);
+ rm_ifinfo_index(ifan->ifan_index);
+
+ /* Clear ifi_ifindex */
+ TAILQ_FOREACH(ifi, &ifilist, ifi_next) {
+ if (ifi->ifi_ifindex
+ == ifan->ifan_index) {
+ ifi->ifi_ifindex = 0;
+ break;
+ }
+ }
+ update_ifinfo(&ifilist, ifan->ifan_index);
break;
}
continue;
@@ -568,23 +542,28 @@ rtmsg_input(void)
if_indextoname(ifindex, ifname));
continue;
}
-
- if ((rai = if_indextorainfo(ifindex)) == NULL) {
+ ifi = if_indextoifinfo(ifindex);
+ if (ifi == NULL) {
syslog(LOG_DEBUG,
- "<%s> route changed on "
- "non advertising interface(%s)",
- __func__,
- if_indextoname(ifindex, ifname));
+ "<%s> ifinfo not found for idx=%d. Why?",
+ __func__, ifindex);
+ continue;
+ }
+ rai = ifi->ifi_rainfo;
+ if (rai == NULL) {
+ syslog(LOG_DEBUG,
+ "<%s> route changed on "
+ "non advertising interface(%s)",
+ __func__, ifi->ifi_ifname);
continue;
}
- oldifflags = iflist[ifindex]->ifm_flags;
+
+ oldifflags = ifi->ifi_flags;
+ /* init ifflags because it may have changed */
+ update_ifinfo(&ifilist, ifindex);
switch (type) {
case RTM_ADD:
- /* init ifflags because it may have changed */
- iflist[ifindex]->ifm_flags =
- if_getflags(ifindex, iflist[ifindex]->ifm_flags);
-
if (sflag)
break; /* we aren't interested in prefixes */
@@ -616,17 +595,13 @@ rtmsg_input(void)
inet_ntop(AF_INET6, addr,
(char *)addrbuf,
sizeof(addrbuf)),
- plen, rai->rai_ifname);
+ plen, ifi->ifi_ifname);
break;
}
make_prefix(rai, ifindex, addr, plen);
prefixchange = 1;
break;
case RTM_DELETE:
- /* init ifflags because it may have changed */
- iflist[ifindex]->ifm_flags =
- if_getflags(ifindex, iflist[ifindex]->ifm_flags);
-
if (sflag)
break;
@@ -648,7 +623,7 @@ rtmsg_input(void)
"but it was not in list",
__func__, inet_ntop(AF_INET6, addr,
(char *)addrbuf, sizeof(addrbuf)),
- plen, rai->rai_ifname);
+ plen, ifi->ifi_ifname);
break;
}
invalidate_prefix(pfx);
@@ -656,12 +631,7 @@ rtmsg_input(void)
break;
case RTM_NEWADDR:
case RTM_DELADDR:
- /* init ifflags because it may have changed */
- iflist[ifindex]->ifm_flags =
- if_getflags(ifindex, iflist[ifindex]->ifm_flags);
- break;
case RTM_IFINFO:
- iflist[ifindex]->ifm_flags = get_ifm_flags(next);
break;
default:
/* should not reach here */
@@ -674,33 +644,36 @@ rtmsg_input(void)
/* check if an interface flag is changed */
if ((oldifflags & IFF_UP) && /* UP to DOWN */
- !(iflist[ifindex]->ifm_flags & IFF_UP)) {
+ !(ifi->ifi_flags & IFF_UP)) {
syslog(LOG_INFO,
"<%s> interface %s becomes down. stop timer.",
- __func__, rai->rai_ifname);
- rtadvd_remove_timer(rai->rai_timer);
- rai->rai_timer = NULL;
+ __func__, ifi->ifi_ifname);
+ rtadvd_remove_timer(ifi->ifi_ra_timer);
+ ifi->ifi_ra_timer = NULL;
} else if (!(oldifflags & IFF_UP) && /* DOWN to UP */
- (iflist[ifindex]->ifm_flags & IFF_UP)) {
+ (ifi->ifi_flags & IFF_UP)) {
syslog(LOG_INFO,
"<%s> interface %s becomes up. restart timer.",
- __func__, rai->rai_ifname);
-
- rai->rai_initcounter = 0; /* reset the counter */
- rai->rai_waiting = 0; /* XXX */
- rai->rai_timer = rtadvd_add_timer(ra_timeout,
- ra_timer_update, rai, rai);
- ra_timer_update(rai, &rai->rai_timer->rat_tm);
- rtadvd_set_timer(&rai->rai_timer->rat_tm,
- rai->rai_timer);
+ __func__, ifi->ifi_ifname);
+
+ ifi->ifi_state = IFI_STATE_TRANSITIVE;
+ ifi->ifi_burstcount =
+ MAX_INITIAL_RTR_ADVERTISEMENTS;
+ ifi->ifi_burstinterval =
+ MAX_INITIAL_RTR_ADVERT_INTERVAL;
+
+ ifi->ifi_ra_timer = rtadvd_add_timer(ra_timeout,
+ ra_timer_update, ifi, ifi);
+ ra_timer_update(ifi, &ifi->ifi_ra_timer->rat_tm);
+ rtadvd_set_timer(&ifi->ifi_ra_timer->rat_tm,
+ ifi->ifi_ra_timer);
} else if (prefixchange &&
- (iflist[ifindex]->ifm_flags & IFF_UP)) {
+ (ifi->ifi_flags & IFF_UP)) {
/*
* An advertised prefix has been added or invalidated.
* Will notice the change in a short delay.
*/
- rai->rai_initcounter = 0;
- set_short_delay(rai);
+ set_short_delay(ifi);
}
}
@@ -708,7 +681,7 @@ rtmsg_input(void)
}
void
-rtadvd_input(void)
+rtadvd_input(struct sockinfo *s)
{
ssize_t i;
int *hlimp = NULL;
@@ -719,16 +692,23 @@ rtadvd_input(void)
int ifindex = 0;
struct cmsghdr *cm;
struct in6_pktinfo *pi = NULL;
- u_char ntopbuf[INET6_ADDRSTRLEN], ifnamebuf[IFNAMSIZ];
+ char ntopbuf[INET6_ADDRSTRLEN], ifnamebuf[IFNAMSIZ];
struct in6_addr dst = in6addr_any;
+ struct ifinfo *ifi;
+
+ syslog(LOG_DEBUG, "<%s> enter", __func__);
+ if (s == NULL) {
+ syslog(LOG_ERR, "<%s> internal error", __func__);
+ exit(1);
+ }
/*
* Get message. We reset msg_controllen since the field could
* be modified if we had received a message before setting
* receive options.
*/
rcvmhdr.msg_controllen = rcvcmsgbuflen;
- if ((i = recvmsg(sock, &rcvmhdr, 0)) < 0)
+ if ((i = recvmsg(s->si_fd, &rcvmhdr, 0)) < 0)
return;
/* extract optional information via Advanced API */
@@ -764,13 +744,12 @@ rtadvd_input(void)
* If we happen to receive data on an interface which is now gone
* or down, just discard the data.
*/
- if (iflist[pi->ipi6_ifindex] == NULL ||
- (iflist[pi->ipi6_ifindex]->ifm_flags & IFF_UP) == 0) {
+ ifi = if_indextoifinfo(pi->ipi6_ifindex);
+ if (ifi == NULL || !(ifi->ifi_flags & IFF_UP)) {
syslog(LOG_INFO,
"<%s> received data on a disabled interface (%s)",
__func__,
- (iflist[pi->ipi6_ifindex] == NULL) ? "[gone]" :
- if_indextoname(pi->ipi6_ifindex, ifnamebuf));
+ (ifi == NULL) ? "[gone]" : ifi->ifi_ifname);
return;
}
@@ -881,7 +860,7 @@ rtadvd_input(void)
ra_input(i, (struct nd_router_advert *)icp, pi, &rcvfrom);
break;
case ICMP6_ROUTER_RENUMBERING:
- if (accept_rr == 0) {
+ if (mcastif == NULL) {
syslog(LOG_ERR, "<%s> received a router renumbering "
"message, but not allowed to be accepted",
__func__);
@@ -909,10 +888,11 @@ static void
rs_input(int len, struct nd_router_solicit *rs,
struct in6_pktinfo *pi, struct sockaddr_in6 *from)
{
- u_char ntopbuf[INET6_ADDRSTRLEN];
- u_char ifnamebuf[IFNAMSIZ];
+ char ntopbuf[INET6_ADDRSTRLEN];
+ char ifnamebuf[IFNAMSIZ];
union nd_opt ndopts;
struct rainfo *rai;
+ struct ifinfo *ifi;
struct soliciter *sol;
syslog(LOG_DEBUG,
@@ -949,10 +929,14 @@ rs_input(int len, struct nd_router_solicit *rs,
goto done;
}
- TAILQ_FOREACH(rai, &railist, rai_next)
- if (pi->ipi6_ifindex == (unsigned int)rai->rai_ifindex)
- break;
-
+ ifi = if_indextoifinfo(pi->ipi6_ifindex);
+ if (ifi == NULL) {
+ syslog(LOG_INFO,
+ "<%s> if (idx=%d) not found. Why?",
+ __func__, pi->ipi6_ifindex);
+ goto done;
+ }
+ rai = ifi->ifi_rainfo;
if (rai == NULL) {
syslog(LOG_INFO,
"<%s> RS received on non advertising interface(%s)",
@@ -961,7 +945,7 @@ rs_input(int len, struct nd_router_solicit *rs,
goto done;
}
- rai->rai_rsinput++; /* increment statistics */
+ rai->rai_ifinfo->ifi_rsinput++;
/*
* Decide whether to send RA according to the rate-limit
@@ -981,10 +965,10 @@ rs_input(int len, struct nd_router_solicit *rs,
* If there is already a waiting RS packet, don't
* update the timer.
*/
- if (rai->rai_waiting++)
+ if (ifi->ifi_rs_waitcount++)
goto done;
- set_short_delay(rai);
+ set_short_delay(ifi);
done:
free_ndopts(&ndopts);
@@ -992,7 +976,7 @@ rs_input(int len, struct nd_router_solicit *rs,
}
static void
-set_short_delay(struct rainfo *rai)
+set_short_delay(struct ifinfo *ifi)
{
long delay; /* must not be greater than 1000000 */
struct timeval interval, now, min_delay, tm_tmp, *rest;
@@ -1011,7 +995,7 @@ set_short_delay(struct rainfo *rai)
#endif
interval.tv_sec = 0;
interval.tv_usec = delay;
- rest = rtadvd_timer_rest(rai->rai_timer);
+ rest = rtadvd_timer_rest(ifi->ifi_ra_timer);
if (TIMEVAL_LT(rest, &interval)) {
syslog(LOG_DEBUG, "<%s> random delay is larger than "
"the rest of the current timer", __func__);
@@ -1026,69 +1010,52 @@ set_short_delay(struct rainfo *rai)
* previous advertisement was sent.
*/
gettimeofday(&now, NULL);
- TIMEVAL_SUB(&now, &rai->rai_lastsent, &tm_tmp);
+ TIMEVAL_SUB(&now, &ifi->ifi_ra_lastsent, &tm_tmp);
min_delay.tv_sec = MIN_DELAY_BETWEEN_RAS;
min_delay.tv_usec = 0;
if (TIMEVAL_LT(&tm_tmp, &min_delay)) {
TIMEVAL_SUB(&min_delay, &tm_tmp, &min_delay);
TIMEVAL_ADD(&min_delay, &interval, &interval);
}
- rtadvd_set_timer(&interval, rai->rai_timer);
+ rtadvd_set_timer(&interval, ifi->ifi_ra_timer);
}
static int
check_accept_rtadv(int idx)
{
- struct in6_ndireq nd;
- u_char ifname[IFNAMSIZ];
- int s6;
- int error;
+ struct ifinfo *ifi;
- if ((s6 = socket(AF_INET6, SOCK_DGRAM, 0)) < 0) {
- syslog(LOG_ERR,
- "<%s> open socket failed for idx=%d.",
- __func__, idx);
- return (0);
+ TAILQ_FOREACH(ifi, &ifilist, ifi_next) {
+ if (ifi->ifi_ifindex == idx)
+ break;
}
- if ((if_indextoname(idx, ifname)) == NULL) {
+ if (ifi == NULL) {
syslog(LOG_ERR,
- "<%s> ifindex->ifname failed (idx=%d).",
+ "<%s> if (idx=%d) not found. Why?",
__func__, idx);
- close(s6);
return (0);
}
- memset(&nd, 0, sizeof(nd));
- strncpy(nd.ifname, ifname, sizeof(nd.ifname));
- error = ioctl(s6, SIOCGIFINFO_IN6, &nd);
- if (error) {
+#if (__FreeBSD_version < 900000)
+ /*
+ * RA_RECV: !ip6.forwarding && ip6.accept_rtadv
+ * RA_SEND: ip6.forwarding
+ */
+ return ((getinet6sysctl(IPV6CTL_FORWARDING) == 0) &&
+ (getinet6sysctl(IPV6CTL_ACCEPT_RTADV) == 1));
+#else
+ /*
+ * RA_RECV: ND6_IFF_ACCEPT_RTADV
+ * RA_SEND: ip6.forwarding
+ */
+ if (update_ifinfo_nd_flags(ifi) != 0) {
syslog(LOG_ERR,
- "<%s> ioctl(SIOCGIFINFO_IN6) failed for idx=%d.",
+ "<%s> nd6 flags failed (idx=%d)",
__func__, idx);
- nd.ndi.flags = 0;
+ return (0);
}
- close(s6);
-
- return (nd.ndi.flags & ND6_IFF_ACCEPT_RTADV);
-}
-static int
-getinet6sysctl(int code)
-{
- int mib[] = { CTL_NET, PF_INET6, IPPROTO_IPV6, 0 };
- int value;
- size_t size;
-
- mib[3] = code;
- size = sizeof(value);
- if (sysctl(mib, sizeof(mib)/sizeof(mib[0]), &value, &size, NULL, 0)
- < 0) {
- syslog(LOG_ERR, "<%s>: failed to get ip6 sysctl(%d): %s",
- __func__, code,
- strerror(errno));
- return (-1);
- }
- else
- return (value);
+ return (ifi->ifi_nd_flags & ND6_IFF_ACCEPT_RTADV);
+#endif
}
static void
@@ -1096,11 +1063,12 @@ ra_input(int len, struct nd_router_advert *nra,
struct in6_pktinfo *pi, struct sockaddr_in6 *from)
{
struct rainfo *rai;
- u_char ntopbuf[INET6_ADDRSTRLEN];
- u_char ifnamebuf[IFNAMSIZ];
+ struct ifinfo *ifi;
+ char ntopbuf[INET6_ADDRSTRLEN];
+ char ifnamebuf[IFNAMSIZ];
union nd_opt ndopts;
const char *on_off[] = {"OFF", "ON"};
- u_int32_t reachabletime, retranstimer, mtu;
+ uint32_t reachabletime, retranstimer, mtu;
int inconsistent = 0;
int error;
@@ -1108,16 +1076,6 @@ ra_input(int len, struct nd_router_advert *nra,
inet_ntop(AF_INET6, &from->sin6_addr, ntopbuf, sizeof(ntopbuf)),
if_indextoname(pi->ipi6_ifindex, ifnamebuf));
- if (!check_accept_rtadv(pi->ipi6_ifindex)) {
- syslog(LOG_INFO,
- "<%s> An RA from %s on %s ignored (no ACCEPT_RTADV flag).",
- __func__,
- inet_ntop(AF_INET6, &from->sin6_addr, ntopbuf,
- sizeof(ntopbuf)), if_indextoname(pi->ipi6_ifindex,
- ifnamebuf));
- return;
- }
-
/* ND option check */
memset(&ndopts, 0, sizeof(ndopts));
error = nd6_options((struct nd_opt_hdr *)(nra + 1),
@@ -1137,8 +1095,8 @@ ra_input(int len, struct nd_router_advert *nra,
/*
* RA consistency check according to RFC 4861 6.2.7
*/
- rai = if_indextorainfo(pi->ipi6_ifindex);
- if (rai == NULL) {
+ ifi = if_indextoifinfo(pi->ipi6_ifindex);
+ if (ifi->ifi_rainfo == NULL) {
syslog(LOG_INFO,
"<%s> received RA from %s on non-advertising"
" interface(%s)",
@@ -1148,7 +1106,10 @@ ra_input(int len, struct nd_router_advert *nra,
ifnamebuf));
goto done;
}
- rai->rai_rainput++; /* increment statistics */
+ rai = ifi->ifi_rainfo;
+ ifi->ifi_rainput++;
+ syslog(LOG_DEBUG, "<%s> ifi->ifi_rainput = %" PRIu64 "\n", __func__,
+ ifi->ifi_rainput);
/* Cur Hop Limit value */
if (nra->nd_ra_curhoplimit && rai->rai_hoplimit &&
@@ -1156,7 +1117,7 @@ ra_input(int len, struct nd_router_advert *nra,
syslog(LOG_INFO,
"<%s> CurHopLimit inconsistent on %s:"
" %d from %s, %d from us",
- __func__, rai->rai_ifname, nra->nd_ra_curhoplimit,
+ __func__, ifi->ifi_ifname, nra->nd_ra_curhoplimit,
inet_ntop(AF_INET6, &from->sin6_addr, ntopbuf,
sizeof(ntopbuf)), rai->rai_hoplimit);
inconsistent++;
@@ -1167,7 +1128,7 @@ ra_input(int len, struct nd_router_advert *nra,
syslog(LOG_INFO,
"<%s> M flag inconsistent on %s:"
" %s from %s, %s from us",
- __func__, rai->rai_ifname, on_off[!rai->rai_managedflg],
+ __func__, ifi->ifi_ifname, on_off[!rai->rai_managedflg],
inet_ntop(AF_INET6, &from->sin6_addr, ntopbuf,
sizeof(ntopbuf)), on_off[rai->rai_managedflg]);
inconsistent++;
@@ -1178,7 +1139,7 @@ ra_input(int len, struct nd_router_advert *nra,
syslog(LOG_INFO,
"<%s> O flag inconsistent on %s:"
" %s from %s, %s from us",
- __func__, rai->rai_ifname, on_off[!rai->rai_otherflg],
+ __func__, ifi->ifi_ifname, on_off[!rai->rai_otherflg],
inet_ntop(AF_INET6, &from->sin6_addr, ntopbuf,
sizeof(ntopbuf)), on_off[rai->rai_otherflg]);
inconsistent++;
@@ -1190,7 +1151,7 @@ ra_input(int len, struct nd_router_advert *nra,
syslog(LOG_INFO,
"<%s> ReachableTime inconsistent on %s:"
" %d from %s, %d from us",
- __func__, rai->rai_ifname, reachabletime,
+ __func__, ifi->ifi_ifname, reachabletime,
inet_ntop(AF_INET6, &from->sin6_addr, ntopbuf,
sizeof(ntopbuf)), rai->rai_reachabletime);
inconsistent++;
@@ -1202,7 +1163,7 @@ ra_input(int len, struct nd_router_advert *nra,
syslog(LOG_INFO,
"<%s> RetranceTimer inconsistent on %s:"
" %d from %s, %d from us",
- __func__, rai->rai_ifname, retranstimer,
+ __func__, ifi->ifi_ifname, retranstimer,
inet_ntop(AF_INET6, &from->sin6_addr, ntopbuf,
sizeof(ntopbuf)), rai->rai_retranstimer);
inconsistent++;
@@ -1214,7 +1175,7 @@ ra_input(int len, struct nd_router_advert *nra,
syslog(LOG_INFO,
"<%s> MTU option value inconsistent on %s:"
" %d from %s, %d from us",
- __func__, rai->rai_ifname, mtu,
+ __func__, ifi->ifi_ifname, mtu,
inet_ntop(AF_INET6, &from->sin6_addr, ntopbuf,
sizeof(ntopbuf)), rai->rai_linkmtu);
inconsistent++;
@@ -1235,7 +1196,7 @@ ra_input(int len, struct nd_router_advert *nra,
}
if (inconsistent)
- rai->rai_rainconsistent++;
+ ifi->ifi_rainconsistent++;
done:
free_ndopts(&ndopts);
@@ -1247,18 +1208,19 @@ static int
prefix_check(struct nd_opt_prefix_info *pinfo,
struct rainfo *rai, struct sockaddr_in6 *from)
{
- u_int32_t preferred_time, valid_time;
+ struct ifinfo *ifi;
+ uint32_t preferred_time, valid_time;
struct prefix *pfx;
int inconsistent = 0;
- u_char ntopbuf[INET6_ADDRSTRLEN];
- u_char prefixbuf[INET6_ADDRSTRLEN];
+ char ntopbuf[INET6_ADDRSTRLEN];
+ char prefixbuf[INET6_ADDRSTRLEN];
struct timeval now;
#if 0 /* impossible */
if (pinfo->nd_opt_pi_type != ND_OPT_PREFIX_INFORMATION)
return (0);
#endif
-
+ ifi = rai->rai_ifinfo;
/*
* log if the adveritsed prefix has link-local scope(sanity check?)
*/
@@ -1271,7 +1233,7 @@ prefix_check(struct nd_opt_prefix_info *pinfo,
sizeof(prefixbuf)),
pinfo->nd_opt_pi_prefix_len,
inet_ntop(AF_INET6, &from->sin6_addr, ntopbuf,
- sizeof(ntopbuf)), rai->rai_ifname);
+ sizeof(ntopbuf)), ifi->ifi_ifname);
if ((pfx = find_prefix(rai, &pinfo->nd_opt_pi_prefix,
pinfo->nd_opt_pi_prefix_len)) == NULL) {
@@ -1282,7 +1244,7 @@ prefix_check(struct nd_opt_prefix_info *pinfo,
sizeof(prefixbuf)),
pinfo->nd_opt_pi_prefix_len,
inet_ntop(AF_INET6, &from->sin6_addr, ntopbuf,
- sizeof(ntopbuf)), rai->rai_ifname);
+ sizeof(ntopbuf)), ifi->ifi_ifname);
return (0);
}
@@ -1303,12 +1265,12 @@ prefix_check(struct nd_opt_prefix_info *pinfo,
syslog(LOG_INFO,
"<%s> preferred lifetime for %s/%d"
" (decr. in real time) inconsistent on %s:"
- " %d from %s, %ld from us",
+ " %" PRIu32 " from %s, %" PRIu32 " from us",
__func__,
inet_ntop(AF_INET6, &pinfo->nd_opt_pi_prefix, prefixbuf,
sizeof(prefixbuf)),
pinfo->nd_opt_pi_prefix_len,
- rai->rai_ifname, preferred_time,
+ ifi->ifi_ifname, preferred_time,
inet_ntop(AF_INET6, &from->sin6_addr, ntopbuf,
sizeof(ntopbuf)), pfx->pfx_pltimeexpire);
inconsistent++;
@@ -1322,7 +1284,7 @@ prefix_check(struct nd_opt_prefix_info *pinfo,
inet_ntop(AF_INET6, &pinfo->nd_opt_pi_prefix, prefixbuf,
sizeof(prefixbuf)),
pinfo->nd_opt_pi_prefix_len,
- rai->rai_ifname, preferred_time,
+ ifi->ifi_ifname, preferred_time,
inet_ntop(AF_INET6, &from->sin6_addr, ntopbuf,
sizeof(ntopbuf)), pfx->pfx_preflifetime);
@@ -1336,12 +1298,12 @@ prefix_check(struct nd_opt_prefix_info *pinfo,
syslog(LOG_INFO,
"<%s> valid lifetime for %s/%d"
" (decr. in real time) inconsistent on %s:"
- " %d from %s, %ld from us",
+ " %d from %s, %" PRIu32 " from us",
__func__,
inet_ntop(AF_INET6, &pinfo->nd_opt_pi_prefix, prefixbuf,
sizeof(prefixbuf)),
pinfo->nd_opt_pi_prefix_len,
- rai->rai_ifname, preferred_time,
+ ifi->ifi_ifname, preferred_time,
inet_ntop(AF_INET6, &from->sin6_addr, ntopbuf,
sizeof(ntopbuf)), pfx->pfx_vltimeexpire);
inconsistent++;
@@ -1355,7 +1317,7 @@ prefix_check(struct nd_opt_prefix_info *pinfo,
inet_ntop(AF_INET6, &pinfo->nd_opt_pi_prefix, prefixbuf,
sizeof(prefixbuf)),
pinfo->nd_opt_pi_prefix_len,
- rai->rai_ifname, valid_time,
+ ifi->ifi_ifname, valid_time,
inet_ntop(AF_INET6, &from->sin6_addr, ntopbuf,
sizeof(ntopbuf)), pfx->pfx_validlifetime);
inconsistent++;
@@ -1369,7 +1331,7 @@ find_prefix(struct rainfo *rai, struct in6_addr *prefix, int plen)
{
struct prefix *pfx;
int bytelen, bitlen;
- u_char bitmask;
+ char bitmask;
TAILQ_FOREACH(pfx, &rai->rai_prefix, pfx_next) {
if (plen != pfx->pfx_prefixlen)
@@ -1398,7 +1360,7 @@ prefix_match(struct in6_addr *p0, int plen0,
struct in6_addr *p1, int plen1)
{
int bytelen, bitlen;
- u_char bitmask;
+ char bitmask;
if (plen0 < plen1)
return (0);
@@ -1421,7 +1383,7 @@ prefix_match(struct in6_addr *p0, int plen0,
static int
nd6_options(struct nd_opt_hdr *hdr, int limit,
- union nd_opt *ndopts, u_int32_t optflags)
+ union nd_opt *ndopts, uint32_t optflags)
{
int optlen = 0;
@@ -1546,18 +1508,22 @@ free_ndopts(union nd_opt *ndopts)
}
void
-sock_open(void)
+sock_open(struct sockinfo *s)
{
struct icmp6_filter filt;
- struct ipv6_mreq mreq;
- struct rainfo *rai;
int on;
/* XXX: should be max MTU attached to the node */
- static u_char answer[1500];
+ static char answer[1500];
+ syslog(LOG_DEBUG, "<%s> enter", __func__);
+
+ if (s == NULL) {
+ syslog(LOG_ERR, "<%s> internal error", __func__);
+ exit(1);
+ }
rcvcmsgbuflen = CMSG_SPACE(sizeof(struct in6_pktinfo)) +
CMSG_SPACE(sizeof(int));
- rcvcmsgbuf = (u_char *)malloc(rcvcmsgbuflen);
+ rcvcmsgbuf = (char *)malloc(rcvcmsgbuflen);
if (rcvcmsgbuf == NULL) {
syslog(LOG_ERR, "<%s> not enough core", __func__);
exit(1);
@@ -1565,19 +1531,19 @@ sock_open(void)
sndcmsgbuflen = CMSG_SPACE(sizeof(struct in6_pktinfo)) +
CMSG_SPACE(sizeof(int));
- sndcmsgbuf = (u_char *)malloc(sndcmsgbuflen);
+ sndcmsgbuf = (char *)malloc(sndcmsgbuflen);
if (sndcmsgbuf == NULL) {
syslog(LOG_ERR, "<%s> not enough core", __func__);
exit(1);
}
- if ((sock = socket(AF_INET6, SOCK_RAW, IPPROTO_ICMPV6)) < 0) {
+ if ((s->si_fd = socket(AF_INET6, SOCK_RAW, IPPROTO_ICMPV6)) < 0) {
syslog(LOG_ERR, "<%s> socket: %s", __func__, strerror(errno));
exit(1);
}
/* specify to tell receiving interface */
on = 1;
- if (setsockopt(sock, IPPROTO_IPV6, IPV6_RECVPKTINFO, &on,
+ if (setsockopt(s->si_fd, IPPROTO_IPV6, IPV6_RECVPKTINFO, &on,
sizeof(on)) < 0) {
syslog(LOG_ERR, "<%s> IPV6_RECVPKTINFO: %s", __func__,
strerror(errno));
@@ -1585,7 +1551,7 @@ sock_open(void)
}
on = 1;
/* specify to tell value of hoplimit field of received IP6 hdr */
- if (setsockopt(sock, IPPROTO_IPV6, IPV6_RECVHOPLIMIT, &on,
+ if (setsockopt(s->si_fd, IPPROTO_IPV6, IPV6_RECVHOPLIMIT, &on,
sizeof(on)) < 0) {
syslog(LOG_ERR, "<%s> IPV6_RECVHOPLIMIT: %s", __func__,
strerror(errno));
@@ -1594,62 +1560,16 @@ sock_open(void)
ICMP6_FILTER_SETBLOCKALL(&filt);
ICMP6_FILTER_SETPASS(ND_ROUTER_SOLICIT, &filt);
ICMP6_FILTER_SETPASS(ND_ROUTER_ADVERT, &filt);
- if (accept_rr)
+ if (mcastif != NULL)
ICMP6_FILTER_SETPASS(ICMP6_ROUTER_RENUMBERING, &filt);
- if (setsockopt(sock, IPPROTO_ICMPV6, ICMP6_FILTER, &filt,
+ if (setsockopt(s->si_fd, IPPROTO_ICMPV6, ICMP6_FILTER, &filt,
sizeof(filt)) < 0) {
syslog(LOG_ERR, "<%s> IICMP6_FILTER: %s",
__func__, strerror(errno));
exit(1);
}
- /*
- * join all routers multicast address on each advertising interface.
- */
- memcpy(&mreq.ipv6mr_multiaddr.s6_addr,
- &sin6_linklocal_allrouters.sin6_addr,
- sizeof(mreq.ipv6mr_multiaddr.s6_addr));
- TAILQ_FOREACH(rai, &railist, rai_next) {
- mreq.ipv6mr_interface = rai->rai_ifindex;
- if (setsockopt(sock, IPPROTO_IPV6, IPV6_JOIN_GROUP, &mreq,
- sizeof(mreq)) < 0) {
- syslog(LOG_ERR, "<%s> IPV6_JOIN_GROUP(link) on %s: %s",
- __func__, rai->rai_ifname, strerror(errno));
- exit(1);
- }
- }
-
- /*
- * When attending router renumbering, join all-routers site-local
- * multicast group.
- */
- if (accept_rr) {
- memcpy(&mreq.ipv6mr_multiaddr.s6_addr,
- &sin6_sitelocal_allrouters.sin6_addr,
- sizeof(mreq.ipv6mr_multiaddr.s6_addr));
- if (mcastif) {
- if ((mreq.ipv6mr_interface = if_nametoindex(mcastif))
- == 0) {
- syslog(LOG_ERR,
- "<%s> invalid interface: %s",
- __func__, mcastif);
- exit(1);
- }
- } else
- mreq.ipv6mr_interface =
- TAILQ_FIRST(&railist)->rai_ifindex;
- if (setsockopt(sock, IPPROTO_IPV6, IPV6_JOIN_GROUP,
- &mreq, sizeof(mreq)) < 0) {
- syslog(LOG_ERR,
- "<%s> IPV6_JOIN_GROUP(site) on %s: %s", __func__,
- mcastif ? mcastif :
- TAILQ_FIRST(&railist)->rai_ifname,
- strerror(errno));
- exit(1);
- }
- }
-
/* initialize msghdr for receiving packets */
rcviov[0].iov_base = (caddr_t)answer;
rcviov[0].iov_len = sizeof(answer);
@@ -1672,49 +1592,80 @@ sock_open(void)
/* open a routing socket to watch the routing table */
static void
-rtsock_open(void)
+rtsock_open(struct sockinfo *s)
{
- if ((rtsock = socket(PF_ROUTE, SOCK_RAW, 0)) < 0) {
+ if (s == NULL) {
+ syslog(LOG_ERR, "<%s> internal error", __func__);
+ exit(1);
+ }
+ if ((s->si_fd = socket(PF_ROUTE, SOCK_RAW, 0)) < 0) {
syslog(LOG_ERR,
"<%s> socket: %s", __func__, strerror(errno));
exit(1);
}
}
-struct rainfo *
-if_indextorainfo(int idx)
+struct ifinfo *
+if_indextoifinfo(int idx)
{
- struct rainfo *rai;
+ struct ifinfo *ifi;
- TAILQ_FOREACH(rai, &railist, rai_next) {
- syslog(LOG_DEBUG, "<%s> rai->rai_ifindex %d == idx %d?",
- __func__, rai->rai_ifindex, idx);
- if (rai->rai_ifindex == idx)
- return (rai);
+ TAILQ_FOREACH(ifi, &ifilist, ifi_next) {
+ if (ifi->ifi_ifindex == idx)
+ return (ifi);
}
+ if (ifi != NULL)
+ syslog(LOG_DEBUG, "<%s> ifi found (idx=%d)",
+ __func__, idx);
+ else
+ syslog(LOG_DEBUG, "<%s> ifi not found (idx=%d)",
+ __func__, idx);
+
return (NULL); /* search failed */
}
void
-ra_output(struct rainfo *rai)
+ra_output(struct ifinfo *ifi)
{
int i;
struct cmsghdr *cm;
struct in6_pktinfo *pi;
struct soliciter *sol;
+ struct rainfo *rai;
- if ((iflist[rai->rai_ifindex]->ifm_flags & IFF_UP) == 0) {
- syslog(LOG_DEBUG, "<%s> %s is not up, skip sending RA",
- __func__, rai->rai_ifname);
+ switch (ifi->ifi_state) {
+ case IFI_STATE_CONFIGURED:
+ rai = ifi->ifi_rainfo;
+ break;
+ case IFI_STATE_TRANSITIVE:
+ rai = ifi->ifi_rainfo_trans;
+ break;
+ case IFI_STATE_UNCONFIGURED:
+ syslog(LOG_DEBUG, "<%s> %s is unconfigured. "
+ "Skip sending RAs.",
+ __func__, ifi->ifi_ifname);
+ return;
+ default:
+ rai = NULL;
+ }
+ if (rai == NULL) {
+ syslog(LOG_DEBUG, "<%s> rainfo is NULL on %s."
+ "Skip sending RAs.",
+ __func__, ifi->ifi_ifname);
+ return;
+ }
+ if (!(ifi->ifi_flags & IFF_UP)) {
+ syslog(LOG_DEBUG, "<%s> %s is not up. "
+ "Skip sending RAs.",
+ __func__, ifi->ifi_ifname);
return;
}
-
/*
* Check lifetime, ACCEPT_RTADV flag, and ip6.forwarding.
*
* (lifetime == 0) = output
- * (lifetime != 0 && (ACCEPT_RTADV || !ip6.forwarding) = no output
+ * (lifetime != 0 && (check_accept_rtadv()) = no output
*
* Basically, hosts MUST NOT send Router Advertisement
* messages at any time (RFC 4861, Section 6.2.3). However, it
@@ -1725,15 +1676,19 @@ ra_output(struct rainfo *rai)
* zero. (see also the above section)
*/
syslog(LOG_DEBUG,
- "<%s> check lifetime=%d, ACCEPT_RTADV=%d, ip6.forwarding=%d on %s",
- __func__, rai->rai_lifetime, check_accept_rtadv(rai->rai_ifindex),
- getinet6sysctl(IPV6CTL_FORWARDING), rai->rai_ifname);
+ "<%s> check lifetime=%d, ACCEPT_RTADV=%d, ip6.forwarding=%d "
+ "on %s", __func__,
+ rai->rai_lifetime,
+ check_accept_rtadv(ifi->ifi_ifindex),
+ getinet6sysctl(IPV6CTL_FORWARDING),
+ ifi->ifi_ifname);
+
if (rai->rai_lifetime != 0) {
- if (check_accept_rtadv(rai->rai_ifindex)) {
+ if (check_accept_rtadv(ifi->ifi_ifindex)) {
syslog(LOG_INFO,
"<%s> non-zero lifetime RA "
"on RA receiving interface %s."
- " Ignored.", __func__, rai->rai_ifname);
+ " Ignored.", __func__, ifi->ifi_ifname);
return;
}
if (getinet6sysctl(IPV6CTL_FORWARDING) == 0) {
@@ -1758,7 +1713,7 @@ ra_output(struct rainfo *rai)
cm->cmsg_len = CMSG_LEN(sizeof(struct in6_pktinfo));
pi = (struct in6_pktinfo *)CMSG_DATA(cm);
memset(&pi->ipi6_addr, 0, sizeof(pi->ipi6_addr)); /*XXX*/
- pi->ipi6_ifindex = rai->rai_ifindex;
+ pi->ipi6_ifindex = ifi->ifi_ifindex;
/* specify the hop limit of the packet */
{
@@ -1772,22 +1727,18 @@ ra_output(struct rainfo *rai)
}
syslog(LOG_DEBUG,
- "<%s> send RA on %s, # of waitings = %d",
- __func__, rai->rai_ifname, rai->rai_waiting);
+ "<%s> send RA on %s, # of RS waitings = %d",
+ __func__, ifi->ifi_ifname, ifi->ifi_rs_waitcount);
- i = sendmsg(sock, &sndmhdr, 0);
+ i = sendmsg(sock.si_fd, &sndmhdr, 0);
if (i < 0 || (size_t)i != rai->rai_ra_datalen) {
if (i < 0) {
syslog(LOG_ERR, "<%s> sendmsg on %s: %s",
- __func__, rai->rai_ifname,
+ __func__, ifi->ifi_ifname,
strerror(errno));
}
}
- /* update counter */
- if (rai->rai_initcounter < MAX_INITIAL_RTR_ADVERTISEMENTS)
- rai->rai_initcounter++;
- rai->rai_raoutput++;
/*
* unicast advertisements
@@ -1800,70 +1751,143 @@ ra_output(struct rainfo *rai)
}
/* update timestamp */
- gettimeofday(&rai->rai_lastsent, NULL);
+ gettimeofday(&ifi->ifi_ra_lastsent, NULL);
+
+ /* update counter */
+ ifi->ifi_rs_waitcount = 0;
+ ifi->ifi_raoutput++;
+
+ switch (ifi->ifi_state) {
+ case IFI_STATE_CONFIGURED:
+ if (ifi->ifi_burstcount > 0)
+ ifi->ifi_burstcount--;
+ break;
+ case IFI_STATE_TRANSITIVE:
+ ifi->ifi_burstcount--;
+ if (ifi->ifi_burstcount == 0) {
+ if (ifi->ifi_rainfo == ifi->ifi_rainfo_trans) {
+ /* Inital burst finished. */
+ if (ifi->ifi_rainfo_trans != NULL)
+ ifi->ifi_rainfo_trans = NULL;
+ }
+
+ /* Remove burst RA information */
+ if (ifi->ifi_rainfo_trans != NULL) {
+ rm_rainfo(ifi->ifi_rainfo_trans);
+ ifi->ifi_rainfo_trans = NULL;
+ }
- /* reset waiting conter */
- rai->rai_waiting = 0;
+ if (ifi->ifi_rainfo != NULL) {
+ /*
+ * TRANSITIVE -> CONFIGURED
+ *
+ * After initial burst or transition from
+ * one configuration to another,
+ * ifi_rainfo always points to the next RA
+ * information.
+ */
+ ifi->ifi_state = IFI_STATE_CONFIGURED;
+ syslog(LOG_DEBUG,
+ "<%s> ifname=%s marked as "
+ "CONFIGURED.", __func__,
+ ifi->ifi_ifname);
+ } else {
+ /*
+ * TRANSITIVE -> UNCONFIGURED
+ *
+ * If ifi_rainfo points to NULL, this
+ * interface is shutting down.
+ *
+ */
+ int error;
+
+ ifi->ifi_state = IFI_STATE_UNCONFIGURED;
+ syslog(LOG_DEBUG,
+ "<%s> ifname=%s marked as "
+ "UNCONFIGURED.", __func__,
+ ifi->ifi_ifname);
+ error = sock_mc_leave(&sock,
+ ifi->ifi_ifindex);
+ if (error)
+ exit(1);
+ }
+ }
+ break;
+ }
}
/* process RA timer */
struct rtadvd_timer *
ra_timeout(void *arg)
{
- struct rainfo *rai;
+ struct ifinfo *ifi;
-#ifdef notyet
- /* if necessary, reconstruct the packet. */
-#endif
- rai = (struct rainfo *)arg;
+ ifi = (struct ifinfo *)arg;
syslog(LOG_DEBUG, "<%s> RA timer on %s is expired",
- __func__, rai->rai_ifname);
+ __func__, ifi->ifi_ifname);
- ra_output(rai);
+ ra_output(ifi);
- return (rai->rai_timer);
+ return (ifi->ifi_ra_timer);
}
/* update RA timer */
void
ra_timer_update(void *arg, struct timeval *tm)
{
- long interval;
+ uint16_t interval;
struct rainfo *rai;
+ struct ifinfo *ifi;
- rai = (struct rainfo *)arg;
- /*
- * Whenever a multicast advertisement is sent from an interface,
- * the timer is reset to a uniformly-distributed random value
- * between the interface's configured MinRtrAdvInterval and
- * MaxRtrAdvInterval (RFC2461 6.2.4).
- */
- interval = rai->rai_mininterval;
+ ifi = (struct ifinfo *)arg;
+ rai = ifi->ifi_rainfo;
+ interval = 0;
+
+ switch (ifi->ifi_state) {
+ case IFI_STATE_UNCONFIGURED:
+ return;
+ break;
+ case IFI_STATE_CONFIGURED:
+ /*
+ * Whenever a multicast advertisement is sent from
+ * an interface, the timer is reset to a
+ * uniformly-distributed random value between the
+ * interface's configured MinRtrAdvInterval and
+ * MaxRtrAdvInterval (RFC4861 6.2.4).
+ */
+ interval = rai->rai_mininterval;
#ifdef HAVE_ARC4RANDOM
- interval += arc4random_uniform(rai->rai_maxinterval -
- rai->rai_mininterval);
+ interval += arc4random_uniform(rai->rai_maxinterval -
+ rai->rai_mininterval);
#else
- interval += random() % (rai->rai_maxinterval -
- rai->rai_mininterval);
+ interval += random() % (rai->rai_maxinterval -
+ rai->rai_mininterval);
#endif
-
- /*
- * For the first few advertisements (up to
- * MAX_INITIAL_RTR_ADVERTISEMENTS), if the randomly chosen interval
- * is greater than MAX_INITIAL_RTR_ADVERT_INTERVAL, the timer
- * SHOULD be set to MAX_INITIAL_RTR_ADVERT_INTERVAL instead.
- * (RFC 4861 6.2.4)
- */
- if (rai->rai_initcounter < MAX_INITIAL_RTR_ADVERTISEMENTS &&
- interval > MAX_INITIAL_RTR_ADVERT_INTERVAL)
- interval = MAX_INITIAL_RTR_ADVERT_INTERVAL;
+ break;
+ case IFI_STATE_TRANSITIVE:
+ /*
+ * For the first few advertisements (up to
+ * MAX_INITIAL_RTR_ADVERTISEMENTS), if the randomly chosen
+ * interval is greater than
+ * MAX_INITIAL_RTR_ADVERT_INTERVAL, the timer SHOULD be
+ * set to MAX_INITIAL_RTR_ADVERT_INTERVAL instead. (RFC
+ * 4861 6.2.4)
+ *
+ * In such cases, the router SHOULD transmit one or more
+ * (but not more than MAX_FINAL_RTR_ADVERTISEMENTS) final
+ * multicast Router Advertisements on the interface with a
+ * Router Lifetime field of zero. (RFC 4861 6.2.5)
+ */
+ interval = ifi->ifi_burstinterval;
+ break;
+ }
tm->tv_sec = interval;
tm->tv_usec = 0;
syslog(LOG_DEBUG,
"<%s> RA timer on %s is set to %ld:%ld",
- __func__, rai->rai_ifname,
+ __func__, ifi->ifi_ifname,
(long int)tm->tv_sec, (long int)tm->tv_usec);
return;
diff --git a/usr.sbin/rtadvd/rtadvd.h b/usr.sbin/rtadvd/rtadvd.h
index 190bb0d..ac8ce99 100644
--- a/usr.sbin/rtadvd/rtadvd.h
+++ b/usr.sbin/rtadvd/rtadvd.h
@@ -3,6 +3,7 @@
/*
* Copyright (C) 1998 WIDE Project.
+ * Copyright (C) 2011 Hiroki Sato <hrs@FreeBSD.org>
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
@@ -30,6 +31,17 @@
* SUCH DAMAGE.
*/
+#define ELM_MALLOC(p,error_action) \
+ do { \
+ p = malloc(sizeof(*p)); \
+ if (p == NULL) { \
+ syslog(LOG_ERR, "<%s> malloc failed: %s", \
+ __func__, strerror(errno)); \
+ error_action; \
+ } \
+ memset(p, 0, sizeof(*p)); \
+ } while(0)
+
#define IN6ADDR_LINKLOCAL_ALLNODES_INIT \
{{{ 0xff, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01 }}}
@@ -101,28 +113,26 @@ struct prefix {
*/
struct rtadvd_timer *pfx_timer;
- u_int32_t pfx_validlifetime; /* AdvValidLifetime */
- long pfx_vltimeexpire; /* Expiration of vltime */
- u_int32_t pfx_preflifetime; /* AdvPreferredLifetime */
- long pfx_pltimeexpire; /* Expiration of pltime */
- u_int pfx_onlinkflg; /* bool: AdvOnLinkFlag */
- u_int pfx_autoconfflg; /* bool: AdvAutonomousFlag */
+ uint32_t pfx_validlifetime; /* AdvValidLifetime */
+ uint32_t pfx_vltimeexpire; /* Expiration of vltime */
+ uint32_t pfx_preflifetime; /* AdvPreferredLifetime */
+ uint32_t pfx_pltimeexpire; /* Expiration of pltime */
+ int pfx_onlinkflg; /* bool: AdvOnLinkFlag */
+ int pfx_autoconfflg; /* bool: AdvAutonomousFlag */
int pfx_prefixlen;
int pfx_origin; /* From kernel or config */
struct in6_addr pfx_prefix;
};
-#ifdef ROUTEINFO
struct rtinfo {
TAILQ_ENTRY(rtinfo) rti_next;
- u_int32_t rti_ltime; /* route lifetime */
- u_int rti_rtpref; /* route preference */
+ uint32_t rti_ltime; /* route lifetime */
+ int rti_rtpref; /* route preference */
int rti_prefixlen;
struct in6_addr rti_prefix;
};
-#endif
struct rdnss_addr {
TAILQ_ENTRY(rdnss_addr) ra_next;
@@ -134,8 +144,7 @@ struct rdnss {
TAILQ_ENTRY(rdnss) rd_next;
TAILQ_HEAD(, rdnss_addr) rd_list; /* list of DNS servers */
- int rd_cnt; /* number of DNS servers */
- u_int32_t rd_ltime; /* number of seconds valid */
+ uint32_t rd_ltime; /* number of seconds valid */
};
/*
@@ -160,7 +169,7 @@ struct dnssl {
TAILQ_ENTRY(dnssl) dn_next;
TAILQ_HEAD(, dnssl_addr) dn_list; /* list of search domains */
- u_int32_t dn_ltime; /* number of seconds valid */
+ uint32_t dn_ltime; /* number of seconds valid */
};
struct soliciter {
@@ -173,70 +182,117 @@ struct rainfo {
/* pointer for list */
TAILQ_ENTRY(rainfo) rai_next;
- /* timer related parameters */
- struct rtadvd_timer *rai_timer;
- /* counter for the first few advertisements */
- int rai_initcounter;
- /* timestamp when the latest RA was sent */
- struct timeval rai_lastsent;
- /* number of RS waiting for RA */
- int rai_waiting;
-
/* interface information */
- int rai_ifindex;
- int rai_advlinkopt; /* bool: whether include link-layer addr opt */
+ struct ifinfo *rai_ifinfo;
+
+ int rai_advlinkopt; /* bool: whether include link-layer addr opt */
int rai_advifprefix; /* bool: gather IF prefixes? */
- struct sockaddr_dl *rai_sdl;
- char rai_ifname[IFNAMSIZ];
- u_int32_t rai_phymtu; /* mtu of the physical interface */
/* Router configuration variables */
- u_short rai_lifetime; /* AdvDefaultLifetime */
- u_int rai_maxinterval; /* MaxRtrAdvInterval */
- u_int rai_mininterval; /* MinRtrAdvInterval */
+ uint16_t rai_lifetime; /* AdvDefaultLifetime */
+ uint16_t rai_maxinterval; /* MaxRtrAdvInterval */
+ uint16_t rai_mininterval; /* MinRtrAdvInterval */
int rai_managedflg; /* AdvManagedFlag */
int rai_otherflg; /* AdvOtherConfigFlag */
int rai_rtpref; /* router preference */
- u_int32_t rai_linkmtu; /* AdvLinkMTU */
- u_int32_t rai_reachabletime; /* AdvReachableTime */
- u_int32_t rai_retranstimer; /* AdvRetransTimer */
- u_int rai_hoplimit; /* AdvCurHopLimit */
+ uint32_t rai_linkmtu; /* AdvLinkMTU */
+ uint32_t rai_reachabletime; /* AdvReachableTime */
+ uint32_t rai_retranstimer; /* AdvRetransTimer */
+ uint8_t rai_hoplimit; /* AdvCurHopLimit */
TAILQ_HEAD(, prefix) rai_prefix;/* AdvPrefixList(link head) */
int rai_pfxs; /* number of prefixes */
- long rai_clockskew; /* used for consisitency check of lifetimes */
+ uint16_t rai_clockskew; /* used for consisitency check of lifetimes */
TAILQ_HEAD(, rdnss) rai_rdnss; /* DNS server list */
TAILQ_HEAD(, dnssl) rai_dnssl; /* search domain list */
-#ifdef ROUTEINFO
TAILQ_HEAD(, rtinfo) rai_route; /* route information option (link head) */
int rai_routes; /* number of route information options */
-#endif
/* actual RA packet data and its length */
size_t rai_ra_datalen;
- u_char *rai_ra_data;
-
- /* statistics */
- u_quad_t rai_raoutput; /* # of RAs sent */
- u_quad_t rai_rainput; /* # of RAs received */
- u_quad_t rai_rainconsistent; /* # of RAs inconsistent with ours */
- u_quad_t rai_rsinput; /* # of RSs received */
+ char *rai_ra_data;
/* info about soliciter */
TAILQ_HEAD(, soliciter) rai_soliciter; /* recent solication source */
};
-/* Interface list including RA information */
+/* RA information list */
extern TAILQ_HEAD(railist_head_t, rainfo) railist;
+/*
+ * ifi_state:
+ *
+ * (INIT)
+ * |
+ * | update_ifinfo()
+ * | update_persist_ifinfo()
+ * v
+ * UNCONFIGURED
+ * | ^
+ * loadconfig()| |rm_ifinfo(), ra_output()
+ * (MC join)| |(MC leave)
+ * | |
+ * | |
+ * v |
+ * TRANSITIVE
+ * | ^
+ * ra_output()| |getconfig()
+ * | |
+ * | |
+ * | |
+ * v |
+ * CONFIGURED
+ *
+ *
+ */
+#define IFI_STATE_UNCONFIGURED 0
+#define IFI_STATE_CONFIGURED 1
+#define IFI_STATE_TRANSITIVE 2
+
+struct ifinfo {
+ TAILQ_ENTRY(ifinfo) ifi_next;
+
+ uint16_t ifi_state;
+ uint16_t ifi_persist;
+ uint16_t ifi_ifindex;
+ char ifi_ifname[IFNAMSIZ];
+ uint8_t ifi_type;
+ uint16_t ifi_flags;
+ uint32_t ifi_nd_flags;
+ uint32_t ifi_phymtu;
+ struct sockaddr_dl ifi_sdl;
+
+ struct rainfo *ifi_rainfo;
+ struct rainfo *ifi_rainfo_trans;
+ uint16_t ifi_burstcount;
+ uint32_t ifi_burstinterval;
+ struct rtadvd_timer *ifi_ra_timer;
+ /* timestamp when the latest RA was sent */
+ struct timeval ifi_ra_lastsent;
+ uint16_t ifi_rs_waitcount;
+
+ /* statistics */
+ uint64_t ifi_raoutput; /* # of RAs sent */
+ uint64_t ifi_rainput; /* # of RAs received */
+ uint64_t ifi_rainconsistent; /* # of inconsistent recv'd RAs */
+ uint64_t ifi_rsinput; /* # of RSs received */
+};
+
+/* Interface list */
+extern TAILQ_HEAD(ifilist_head_t, ifinfo) ifilist;
+
+extern char *mcastif;
+
struct rtadvd_timer *ra_timeout(void *);
void ra_timer_update(void *, struct timeval *);
-void ra_output(struct rainfo *);
+void ra_output(struct ifinfo *);
int prefix_match(struct in6_addr *, int,
struct in6_addr *, int);
-struct rainfo *if_indextorainfo(int);
+struct ifinfo *if_indextoifinfo(int);
struct prefix *find_prefix(struct rainfo *,
struct in6_addr *, int);
+void rtadvd_set_reload(int);
+void rtadvd_set_shutdown(int);
diff --git a/usr.sbin/rtadvd/timer.c b/usr.sbin/rtadvd/timer.c
index 8cad6ad..2ea77b5 100644
--- a/usr.sbin/rtadvd/timer.c
+++ b/usr.sbin/rtadvd/timer.c
@@ -3,6 +3,7 @@
/*
* Copyright (C) 1998 WIDE Project.
+ * Copyright (C) 2011 Hiroki Sato <hrs@FreeBSD.org>
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
@@ -32,15 +33,22 @@
#include <sys/time.h>
#include <sys/queue.h>
+#include <sys/socket.h>
+
+#include <net/if.h>
+#include <net/if_dl.h>
+#include <netinet/in.h>
#include <unistd.h>
#include <syslog.h>
#include <stdlib.h>
#include <string.h>
#include <search.h>
-#include "timer.h"
+#include <netdb.h>
-#define MILLION 1000000
+#include "rtadvd.h"
+#include "timer_subr.h"
+#include "timer.h"
struct rtadvd_timer_head_t ra_timer =
TAILQ_HEAD_INITIALIZER(ra_timer);
@@ -55,6 +63,43 @@ rtadvd_timer_init(void)
TAILQ_INIT(&ra_timer);
}
+void
+rtadvd_update_timeout_handler(void)
+{
+ struct ifinfo *ifi;
+
+ TAILQ_FOREACH(ifi, &ifilist, ifi_next) {
+ switch (ifi->ifi_state) {
+ case IFI_STATE_CONFIGURED:
+ case IFI_STATE_TRANSITIVE:
+ if (ifi->ifi_ra_timer != NULL)
+ continue;
+
+ syslog(LOG_DEBUG, "<%s> add timer for %s (idx=%d)",
+ __func__, ifi->ifi_ifname, ifi->ifi_ifindex);
+ ifi->ifi_ra_timer = rtadvd_add_timer(ra_timeout,
+ ra_timer_update, ifi, ifi);
+ ra_timer_update((void *)ifi,
+ &ifi->ifi_ra_timer->rat_tm);
+ rtadvd_set_timer(&ifi->ifi_ra_timer->rat_tm,
+ ifi->ifi_ra_timer);
+ break;
+ case IFI_STATE_UNCONFIGURED:
+ if (ifi->ifi_ra_timer == NULL)
+ continue;
+
+ syslog(LOG_DEBUG,
+ "<%s> remove timer for %s (idx=%d)", __func__,
+ ifi->ifi_ifname, ifi->ifi_ifindex);
+ rtadvd_remove_timer(ifi->ifi_ra_timer);
+ ifi->ifi_ra_timer = NULL;
+ break;
+ }
+ }
+
+ return;
+}
+
struct rtadvd_timer *
rtadvd_add_timer(struct rtadvd_timer *(*timeout)(void *),
void (*update)(void *, struct timeval *),
@@ -99,22 +144,6 @@ rtadvd_remove_timer(struct rtadvd_timer *rat)
free(rat);
}
-void
-rtadvd_set_timer(struct timeval *tm, struct rtadvd_timer *rat)
-{
- struct timeval now;
-
- /* reset the timer */
- gettimeofday(&now, NULL);
- TIMEVAL_ADD(&now, tm, &rat->rat_tm);
-
- /* update the next expiration time */
- if (TIMEVAL_LT(&rat->rat_tm, &tm_max))
- tm_max = rat->rat_tm;
-
- return;
-}
-
/*
* Check expiration for each timer. If a timer expires,
* call the expire function for the timer and update the timer.
@@ -151,55 +180,18 @@ rtadvd_check_timer(void)
return (&returnval);
}
-struct timeval *
-rtadvd_timer_rest(struct rtadvd_timer *rat)
-{
- static struct timeval returnval, now;
-
- gettimeofday(&now, NULL);
- if (TIMEVAL_LEQ(&rat->rat_tm, &now)) {
- syslog(LOG_DEBUG,
- "<%s> a timer must be expired, but not yet",
- __func__);
- returnval.tv_sec = returnval.tv_usec = 0;
- }
- else
- TIMEVAL_SUB(&rat->rat_tm, &now, &returnval);
-
- return (&returnval);
-}
-
-/* result = a + b */
void
-TIMEVAL_ADD(struct timeval *a, struct timeval *b, struct timeval *result)
+rtadvd_set_timer(struct timeval *tm, struct rtadvd_timer *rat)
{
- long l;
+ struct timeval now;
- if ((l = a->tv_usec + b->tv_usec) < MILLION) {
- result->tv_usec = l;
- result->tv_sec = a->tv_sec + b->tv_sec;
- }
- else {
- result->tv_usec = l - MILLION;
- result->tv_sec = a->tv_sec + b->tv_sec + 1;
- }
-}
+ /* reset the timer */
+ gettimeofday(&now, NULL);
+ TIMEVAL_ADD(&now, tm, &rat->rat_tm);
-/*
- * result = a - b
- * XXX: this function assumes that a >= b.
- */
-void
-TIMEVAL_SUB(struct timeval *a, struct timeval *b, struct timeval *result)
-{
- long l;
+ /* update the next expiration time */
+ if (TIMEVAL_LT(&rat->rat_tm, &tm_max))
+ tm_max = rat->rat_tm;
- if ((l = a->tv_usec - b->tv_usec) >= 0) {
- result->tv_usec = l;
- result->tv_sec = a->tv_sec - b->tv_sec;
- }
- else {
- result->tv_usec = MILLION + l;
- result->tv_sec = a->tv_sec - b->tv_sec - 1;
- }
+ return;
}
diff --git a/usr.sbin/rtadvd/timer.h b/usr.sbin/rtadvd/timer.h
index e2e0c65..f70e0d1 100644
--- a/usr.sbin/rtadvd/timer.h
+++ b/usr.sbin/rtadvd/timer.h
@@ -30,22 +30,6 @@
* SUCH DAMAGE.
*/
-/* a < b */
-#define TIMEVAL_LT(a, b) \
- (((a)->tv_sec < (b)->tv_sec) || \
- (((a)->tv_sec == (b)->tv_sec) && \
- ((a)->tv_usec < (b)->tv_usec)))
-
-/* a <= b */
-#define TIMEVAL_LEQ(a, b) \
- (((a)->tv_sec < (b)->tv_sec) || \
- (((a)->tv_sec == (b)->tv_sec) && \
- ((a)->tv_usec <= (b)->tv_usec)))
-
-#define TIMEVAL_EQUAL(a,b) \
- (((a)->tv_sec == (b)->tv_sec) && \
- ((a)->tv_usec == (b)->tv_usec))
-
extern TAILQ_HEAD(rtadvd_timer_head_t, rtadvd_timer) ra_timer;
struct rtadvd_timer {
TAILQ_ENTRY(rtadvd_timer) rat_next;
@@ -59,14 +43,10 @@ struct rtadvd_timer {
};
void rtadvd_timer_init(void);
+void rtadvd_update_timeout_handler(void);
struct rtadvd_timer *rtadvd_add_timer(struct rtadvd_timer *(*)(void *),
void (*)(void *, struct timeval *), void *, void *);
void rtadvd_set_timer(struct timeval *,
struct rtadvd_timer *);
void rtadvd_remove_timer(struct rtadvd_timer *);
struct timeval *rtadvd_check_timer(void);
-struct timeval *rtadvd_timer_rest(struct rtadvd_timer *);
-void TIMEVAL_ADD(struct timeval *, struct timeval *,
- struct timeval *);
-void TIMEVAL_SUB(struct timeval *, struct timeval *,
- struct timeval *);
diff --git a/usr.sbin/rtadvd/timer_subr.c b/usr.sbin/rtadvd/timer_subr.c
new file mode 100644
index 0000000..2bebdd3
--- /dev/null
+++ b/usr.sbin/rtadvd/timer_subr.c
@@ -0,0 +1,126 @@
+/* $FreeBSD$ */
+/* $KAME: timer.c,v 1.9 2002/06/10 19:59:47 itojun Exp $ */
+
+/*
+ * Copyright (C) 1998 WIDE Project.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. Neither the name of the project nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <sys/time.h>
+#include <sys/queue.h>
+#include <sys/socket.h>
+#include <syslog.h>
+#include <stdio.h>
+#include <inttypes.h>
+
+#include "timer.h"
+#include "timer_subr.h"
+
+struct timeval *
+rtadvd_timer_rest(struct rtadvd_timer *rat)
+{
+ static struct timeval returnval, now;
+
+ gettimeofday(&now, NULL);
+ if (TIMEVAL_LEQ(&rat->rat_tm, &now)) {
+ syslog(LOG_DEBUG,
+ "<%s> a timer must be expired, but not yet",
+ __func__);
+ returnval.tv_sec = returnval.tv_usec = 0;
+ }
+ else
+ TIMEVAL_SUB(&rat->rat_tm, &now, &returnval);
+
+ return (&returnval);
+}
+
+/* result = a + b */
+void
+TIMEVAL_ADD(struct timeval *a, struct timeval *b, struct timeval *result)
+{
+ long l;
+
+ if ((l = a->tv_usec + b->tv_usec) < MILLION) {
+ result->tv_usec = l;
+ result->tv_sec = a->tv_sec + b->tv_sec;
+ }
+ else {
+ result->tv_usec = l - MILLION;
+ result->tv_sec = a->tv_sec + b->tv_sec + 1;
+ }
+}
+
+/*
+ * result = a - b
+ * XXX: this function assumes that a >= b.
+ */
+void
+TIMEVAL_SUB(struct timeval *a, struct timeval *b, struct timeval *result)
+{
+ long l;
+
+ if ((l = a->tv_usec - b->tv_usec) >= 0) {
+ result->tv_usec = l;
+ result->tv_sec = a->tv_sec - b->tv_sec;
+ }
+ else {
+ result->tv_usec = MILLION + l;
+ result->tv_sec = a->tv_sec - b->tv_sec - 1;
+ }
+}
+
+char *
+sec2str(uint32_t s, char *buf)
+{
+ uint32_t day;
+ uint32_t hour;
+ uint32_t min;
+ uint32_t sec;
+ char *p;
+
+ min = s / 60;
+ sec = s % 60;
+
+ hour = min / 60;
+ min = min % 60;
+
+ day = hour / 24;
+ hour = hour % 24;
+
+ p = buf;
+ if (day > 0)
+ p += sprintf(p, "%" PRIu32 "d", day);
+ if (hour > 0)
+ p += sprintf(p, "%" PRIu32 "h", hour);
+ if (min > 0)
+ p += sprintf(p, "%" PRIu32 "m", min);
+
+ if ((p == buf) || (sec > 0 && p > buf))
+ sprintf(p, "%" PRIu32 "s", sec);
+
+ return (buf);
+}
diff --git a/usr.sbin/rtadvd/dump.h b/usr.sbin/rtadvd/timer_subr.h
index 8696e13..9ceddad 100644
--- a/usr.sbin/rtadvd/dump.h
+++ b/usr.sbin/rtadvd/timer_subr.h
@@ -1,5 +1,5 @@
/* $FreeBSD$ */
-/* $KAME: dump.h,v 1.1 2000/05/23 11:31:26 itojun Exp $ */
+/* $KAME: timer.h,v 1.5 2002/05/31 13:30:38 jinmei Exp $ */
/*
* Copyright (C) 1998 WIDE Project.
@@ -30,4 +30,28 @@
* SUCH DAMAGE.
*/
-extern void rtadvd_dump_file(const char *);
+#define SSBUFLEN 1024
+#define MILLION 1000000
+
+/* a < b */
+#define TIMEVAL_LT(a, b) \
+ (((a)->tv_sec < (b)->tv_sec) || \
+ (((a)->tv_sec == (b)->tv_sec) && \
+ ((a)->tv_usec < (b)->tv_usec)))
+
+/* a <= b */
+#define TIMEVAL_LEQ(a, b) \
+ (((a)->tv_sec < (b)->tv_sec) || \
+ (((a)->tv_sec == (b)->tv_sec) && \
+ ((a)->tv_usec <= (b)->tv_usec)))
+
+#define TIMEVAL_EQUAL(a,b) \
+ (((a)->tv_sec == (b)->tv_sec) && \
+ ((a)->tv_usec == (b)->tv_usec))
+
+struct timeval *rtadvd_timer_rest(struct rtadvd_timer *);
+void TIMEVAL_ADD(struct timeval *, struct timeval *,
+ struct timeval *);
+void TIMEVAL_SUB(struct timeval *, struct timeval *,
+ struct timeval *);
+char *sec2str(uint32_t, char *buf);
diff --git a/usr.sbin/syslogd/syslogd.8 b/usr.sbin/syslogd/syslogd.8
index ff0141d..23ba6d0 100644
--- a/usr.sbin/syslogd/syslogd.8
+++ b/usr.sbin/syslogd/syslogd.8
@@ -36,7 +36,7 @@
.Nd log systems messages
.Sh SYNOPSIS
.Nm
-.Op Fl 468ACcdknosuv
+.Op Fl 468ACcdkNnosuv
.Op Fl a Ar allowed_peer
.Op Fl b Ar bind_address
.Op Fl f Ar config_file
@@ -227,6 +227,13 @@ facility is reserved for messages read directly from
Select the number of minutes between
.Dq mark
messages; the default is 20 minutes.
+.It Fl N
+Disable binding on UDP sockets. RFC 3164 recommends that outgoing
+syslogd messages should originate from the privileged port, this
+option
+.Em disables
+the recommended behavior. This option inherits
+.Fl s .
.It Fl n
Disable dns query for every request.
.It Fl o
diff --git a/usr.sbin/syslogd/syslogd.c b/usr.sbin/syslogd/syslogd.c
index 045da5b..d1c9fd1 100644
--- a/usr.sbin/syslogd/syslogd.c
+++ b/usr.sbin/syslogd/syslogd.c
@@ -278,6 +278,7 @@ static int fklog = -1; /* /dev/klog */
static int Initialized; /* set when we have initialized ourselves */
static int MarkInterval = 20 * 60; /* interval between marks in seconds */
static int MarkSeq; /* mark sequence number */
+static int NoBind; /* don't bind() as suggested by RFC 3164 */
static int SecureMode; /* when true, receive only unix domain socks */
#ifdef INET6
static int family = PF_UNSPEC; /* protocol family (IPv4, IPv6 or both) */
@@ -358,7 +359,7 @@ main(int argc, char *argv[])
dprintf("madvise() failed: %s\n", strerror(errno));
bindhostname = NULL;
- while ((ch = getopt(argc, argv, "468Aa:b:cCdf:kl:m:nop:P:sS:Tuv"))
+ while ((ch = getopt(argc, argv, "468Aa:b:cCdf:kl:m:nNop:P:sS:Tuv"))
!= -1)
switch (ch) {
case '4':
@@ -437,6 +438,10 @@ main(int argc, char *argv[])
case 'm': /* mark interval */
MarkInterval = atoi(optarg) * 60;
break;
+ case 'N':
+ NoBind = 1;
+ SecureMode = 1;
+ break;
case 'n':
resolve = 0;
break;
@@ -2685,13 +2690,24 @@ socksetup(int af, char *bindhostname)
close(*s);
continue;
}
- if (bind(*s, r->ai_addr, r->ai_addrlen) < 0) {
- close(*s);
- logerror("bind");
- continue;
- }
+ /*
+ * RFC 3164 recommends that client side message
+ * should come from the privileged syslogd port.
+ *
+ * If the system administrator choose not to obey
+ * this, we can skip the bind() step so that the
+ * system will choose a port for us.
+ */
+ if (!NoBind) {
+ if (bind(*s, r->ai_addr, r->ai_addrlen) < 0) {
+ close(*s);
+ logerror("bind");
+ continue;
+ }
- double_rbuf(*s);
+ if (!SecureMode)
+ double_rbuf(*s);
+ }
(*socks)++;
s++;
OpenPOWER on IntegriCloud